From bf1260ddb8d405e95cd5c4507ddaca45d10dd842 Mon Sep 17 00:00:00 2001 From: Jarrod Norwell Date: Tue, 5 Mar 2024 22:16:55 +0800 Subject: [PATCH] Added initial source code --- .clang-format | 9 + .gitignore | 90 + AUTHORS | 1 + ChangeLog | 0 DEPS | 58 + DIR_METADATA | 13 + INSTALL | 370 + Makefile.am | 1794 + Makefile.in | 10322 ++ NEWS | 0 OWNERS | 13 + README.ANDROID | 139 + aclocal.m4 | 1273 + android/common-functions.sh | 371 + android/google_breakpad/Android.mk | 104 + android/run-checks.sh | 554 + android/sample_app/README | 32 + android/sample_app/jni/Android.mk | 43 + android/sample_app/jni/Application.mk | 31 + android/sample_app/jni/test_breakpad.cpp | 56 + android/test-driver | 131 + android/test-shell.sh | 130 + appveyor.yml | 42 + autotools/ar-lib | 271 + autotools/compile | 348 + autotools/config.guess | 1701 + autotools/config.sub | 1876 + autotools/depcomp | 791 + autotools/install-sh | 541 + autotools/ltmain.sh | 8406 ++ autotools/missing | 215 + autotools/root-test-driver | 3 + autotools/test-driver | 153 + breakpad-client.pc.in | 10 + breakpad.pc.in | 10 + codereview.settings | 3 + configure | 12104 +++ configure.ac | 240 + default.xml | 38 + docs/OWNERS | 1 + docs/breakpad.png | Bin 0 -> 84153 bytes docs/breakpad.svg | 1023 + docs/client_design.md | 223 + docs/contributing_to_breakpad.md | 35 + docs/exception_handling.md | 128 + docs/getting_started_with_breakpad.md | 115 + docs/linux_core_handler.md | 39 + docs/linux_starter_guide.md | 110 + docs/linux_system_calls.md | 47 + docs/mac_breakpad_starter_guide.md | 184 + docs/mozilla_brown_bag_talk.md | 82 + docs/processor_design.md | 231 + docs/stack_walking.md | 144 + docs/sym_upload_v2_protocol.md | 214 + docs/symbol_files.md | 581 + docs/windows_client_integration.md | 70 + m4/ax_append_compile_flags.m4 | 67 + m4/ax_append_flag.m4 | 71 + m4/ax_check_compile_flag.m4 | 74 + m4/ax_check_define.m4 | 92 + m4/ax_cxx_compile_stdcxx.m4 | 1009 + m4/ax_pthread.m4 | 283 + m4/ax_require_defined.m4 | 37 + m4/libtool.m4 | 7377 ++ m4/ltoptions.m4 | 368 + m4/ltsugar.m4 | 123 + m4/ltversion.m4 | 23 + m4/lt~obsolete.m4 | 92 + src/breakpad_googletest_includes.h | 56 + src/client/apple/Framework/BreakpadDefines.h | 72 + src/client/ios/Breakpad.h | 259 + src/client/ios/Breakpad.mm | 986 + .../ios/Breakpad.xcodeproj/project.pbxproj | 604 + src/client/ios/BreakpadController.h | 153 + src/client/ios/BreakpadController.mm | 373 + src/client/ios/Breakpad_Prefix.pch | 7 + src/client/ios/exception_handler_no_mach.cc | 265 + src/client/ios/exception_handler_no_mach.h | 178 + .../ios_exception_minidump_generator.h | 73 + .../ios_exception_minidump_generator.mm | 209 + .../linux/crash_generation/client_info.h | 52 + .../crash_generation_client.cc | 108 + .../crash_generation_client.h | 61 + .../crash_generation_server.cc | 336 + .../crash_generation_server.h | 134 + src/client/linux/data/linux-gate-amd.sym | 3 + src/client/linux/data/linux-gate-intel.sym | 3 + .../linux/dump_writer_common/mapping_info.h | 73 + .../dump_writer_common/raw_context_cpu.h | 60 + .../linux/dump_writer_common/thread_info.cc | 395 + .../linux/dump_writer_common/thread_info.h | 90 + .../dump_writer_common/ucontext_reader.cc | 329 + .../dump_writer_common/ucontext_reader.h | 64 + src/client/linux/handler/exception_handler.cc | 799 + src/client/linux/handler/exception_handler.h | 286 + .../handler/exception_handler_unittest.cc | 1304 + .../linux/handler/microdump_extra_info.h | 51 + .../linux/handler/minidump_descriptor.cc | 100 + .../linux/handler/minidump_descriptor.h | 199 + src/client/linux/log/log.cc | 87 + src/client/linux/log/log.h | 54 + .../microdump_writer/microdump_writer.cc | 675 + .../linux/microdump_writer/microdump_writer.h | 67 + .../microdump_writer_unittest.cc | 424 + src/client/linux/minidump_writer/cpu_set.h | 143 + .../linux/minidump_writer/cpu_set_unittest.cc | 163 + .../linux/minidump_writer/directory_reader.h | 105 + .../directory_reader_unittest.cc | 81 + .../linux/minidump_writer/line_reader.h | 130 + .../minidump_writer/line_reader_unittest.cc | 161 + .../minidump_writer/linux_core_dumper.cc | 321 + .../linux/minidump_writer/linux_core_dumper.h | 124 + .../linux_core_dumper_unittest.cc | 195 + .../linux/minidump_writer/linux_dumper.cc | 974 + .../linux/minidump_writer/linux_dumper.h | 327 + .../linux_dumper_unittest_helper.cc | 100 + .../minidump_writer/linux_ptrace_dumper.cc | 390 + .../minidump_writer/linux_ptrace_dumper.h | 100 + .../linux_ptrace_dumper_unittest.cc | 590 + .../linux/minidump_writer/minidump_writer.cc | 1617 + .../linux/minidump_writer/minidump_writer.h | 142 + .../minidump_writer_unittest.cc | 942 + .../minidump_writer_unittest_utils.cc | 69 + .../minidump_writer_unittest_utils.h | 48 + src/client/linux/minidump_writer/pe_file.cc | 151 + src/client/linux/minidump_writer/pe_file.h | 76 + src/client/linux/minidump_writer/pe_structs.h | 225 + .../minidump_writer/proc_cpuinfo_reader.h | 129 + .../proc_cpuinfo_reader_unittest.cc | 188 + .../sender/google_crash_report_sender.cc | 108 + .../mac/Breakpad.xcodeproj/project.pbxproj | 2855 + src/client/mac/Framework/Breakpad.h | 284 + src/client/mac/Framework/Breakpad.mm | 1042 + src/client/mac/Framework/Breakpad_Prefix.pch | 8 + src/client/mac/Framework/Info.plist | 26 + src/client/mac/Framework/OnDemandServer.h | 144 + src/client/mac/Framework/OnDemandServer.mm | 189 + src/client/mac/UnitTests-Info.plist | 20 + src/client/mac/crash_generation/ConfigFile.h | 82 + src/client/mac/crash_generation/ConfigFile.mm | 167 + src/client/mac/crash_generation/Inspector.h | 161 + src/client/mac/crash_generation/Inspector.mm | 361 + .../mac/crash_generation/InspectorMain.mm | 64 + src/client/mac/crash_generation/client_info.h | 46 + .../crash_generation_client.cc | 75 + .../crash_generation_client.h | 64 + .../crash_generation_server.cc | 169 + .../crash_generation_server.h | 149 + src/client/mac/handler/breakpad_nlist_64.cc | 403 + src/client/mac/handler/breakpad_nlist_64.h | 47 + src/client/mac/handler/dynamic_images.cc | 576 + src/client/mac/handler/dynamic_images.h | 319 + src/client/mac/handler/exception_handler.cc | 863 + src/client/mac/handler/exception_handler.h | 280 + src/client/mac/handler/mach_vm_compat.h | 47 + src/client/mac/handler/minidump_generator.cc | 1609 + src/client/mac/handler/minidump_generator.h | 252 + .../minidump_test.xcodeproj/project.pbxproj | 843 + .../mac/handler/minidump_tests32-Info.plist | 20 + .../mac/handler/minidump_tests64-Info.plist | 22 + .../mac/handler/obj-cTestCases-Info.plist | 20 + .../mac/handler/protected_memory_allocator.cc | 95 + .../mac/handler/protected_memory_allocator.h | 84 + .../handler/testcases/DynamicImagesTests.cc | 82 + .../handler/testcases/DynamicImagesTests.h | 51 + .../handler/testcases/breakpad_nlist_test.cc | 109 + .../handler/testcases/breakpad_nlist_test.h | 61 + src/client/mac/handler/testcases/dwarftests.h | 45 + .../mac/handler/testcases/dwarftests.mm | 59 + .../testcases/testdata/dump_syms_dwarf_data | Bin 0 -> 702795 bytes .../testdata/dump_syms_i386_breakpad.sym | 5300 + src/client/mac/handler/ucontext_compat.h | 46 + src/client/mac/sender/Breakpad.xib | 1140 + .../sender/English.lproj/InfoPlist.strings | Bin 0 -> 156 bytes .../sender/English.lproj/Localizable.strings | Bin 0 -> 2428 bytes src/client/mac/sender/ReporterIcon.graffle | 2489 + .../mac/sender/crash_report_sender-Info.plist | 32 + src/client/mac/sender/crash_report_sender.h | 116 + .../mac/sender/crash_report_sender.icns | Bin 0 -> 170816 bytes src/client/mac/sender/crash_report_sender.m | 754 + .../mac/sender/da.lproj/InfoPlist.strings | Bin 0 -> 156 bytes .../mac/sender/da.lproj/Localizable.strings | Bin 0 -> 2428 bytes .../mac/sender/de.lproj/InfoPlist.strings | Bin 0 -> 192 bytes .../mac/sender/de.lproj/Localizable.strings | Bin 0 -> 2746 bytes .../mac/sender/es.lproj/InfoPlist.strings | Bin 0 -> 184 bytes .../mac/sender/es.lproj/Localizable.strings | Bin 0 -> 2578 bytes .../mac/sender/fr.lproj/InfoPlist.strings | Bin 0 -> 156 bytes .../mac/sender/fr.lproj/Localizable.strings | Bin 0 -> 2694 bytes src/client/mac/sender/goArrow.png | Bin 0 -> 3591 bytes .../mac/sender/it.lproj/InfoPlist.strings | Bin 0 -> 156 bytes .../mac/sender/it.lproj/Localizable.strings | Bin 0 -> 2590 bytes .../mac/sender/ja.lproj/InfoPlist.strings | Bin 0 -> 156 bytes .../mac/sender/ja.lproj/Localizable.strings | Bin 0 -> 1792 bytes .../mac/sender/nl.lproj/InfoPlist.strings | Bin 0 -> 156 bytes .../mac/sender/nl.lproj/Localizable.strings | Bin 0 -> 2546 bytes .../mac/sender/no.lproj/InfoPlist.strings | Bin 0 -> 156 bytes .../mac/sender/no.lproj/Localizable.strings | Bin 0 -> 2484 bytes .../mac/sender/sl.lproj/InfoPlist.strings | Bin 0 -> 184 bytes .../mac/sender/sl.lproj/Localizable.strings | Bin 0 -> 2632 bytes .../mac/sender/sv.lproj/InfoPlist.strings | Bin 0 -> 156 bytes .../mac/sender/sv.lproj/Localizable.strings | Bin 0 -> 2588 bytes .../mac/sender/tr.lproj/InfoPlist.strings | Bin 0 -> 168 bytes .../mac/sender/tr.lproj/Localizable.strings | Bin 0 -> 2430 bytes src/client/mac/sender/uploader.h | 105 + src/client/mac/sender/uploader.mm | 687 + src/client/mac/testapp/Controller.h | 64 + src/client/mac/testapp/Controller.m | 260 + .../testapp/English.lproj/InfoPlist.strings | Bin 0 -> 192 bytes .../mac/testapp/English.lproj/MainMenu.xib | 3748 + src/client/mac/testapp/Info.plist | 55 + src/client/mac/testapp/TestClass.h | 36 + src/client/mac/testapp/TestClass.mm | 94 + src/client/mac/testapp/bomb.icns | Bin 0 -> 23659 bytes src/client/mac/testapp/crashInMain | Bin 0 -> 12588 bytes src/client/mac/testapp/crashduringload | Bin 0 -> 12588 bytes src/client/mac/testapp/main.m | 33 + .../mac/tests/BreakpadFramework_Test.mm | 216 + .../mac/tests/crash_generation_server_test.cc | 401 + .../mac/tests/exception_handler_test.cc | 717 + .../mac/tests/minidump_generator_test.cc | 323 + .../tests/minidump_generator_test_helper.cc | 77 + src/client/mac/tests/spawn_child_process.h | 148 + src/client/mac/tests/testlogging.h | 9 + src/client/minidump_file_writer-inl.h | 96 + src/client/minidump_file_writer.cc | 353 + src/client/minidump_file_writer.h | 271 + src/client/minidump_file_writer_unittest.cc | 183 + src/client/solaris/handler/Makefile | 76 + .../solaris/handler/exception_handler.cc | 261 + .../solaris/handler/exception_handler.h | 200 + .../solaris/handler/exception_handler_test.cc | 122 + .../solaris/handler/minidump_generator.cc | 790 + .../solaris/handler/minidump_generator.h | 69 + src/client/solaris/handler/minidump_test.cc | 78 + src/client/solaris/handler/solaris_lwp.cc | 439 + src/client/solaris/handler/solaris_lwp.h | 159 + .../windows/common/auto_critical_section.h | 80 + src/client/windows/common/ipc_protocol.h | 180 + .../windows/crash_generation/ReadMe.txt | 58 + .../windows/crash_generation/client_info.cc | 226 + .../windows/crash_generation/client_info.h | 176 + .../crash_generation_client.cc | 408 + .../crash_generation_client.h | 181 + .../crash_generation_server.cc | 946 + .../crash_generation_server.h | 298 + .../crash_generation/minidump_generator.cc | 586 + .../crash_generation/minidump_generator.h | 202 + .../windows/handler/exception_handler.cc | 1085 + .../windows/handler/exception_handler.h | 523 + .../windows/sender/crash_report_sender.cc | 145 + .../windows/sender/crash_report_sender.h | 124 + .../crash_generation_app/abstract_class.cc | 56 + .../crash_generation_app/abstract_class.h | 56 + .../crash_generation_app.cc | 525 + .../crash_generation_app.h | 34 + .../crash_generation_app.ico | Bin 0 -> 23558 bytes .../crash_generation_app.rc | 144 + .../tests/crash_generation_app/resource.h | 72 + .../tests/crash_generation_app/small.ico | Bin 0 -> 23558 bytes .../unittests/crash_generation_server_test.cc | 306 + src/client/windows/unittests/dump_analysis.cc | 187 + src/client/windows/unittests/dump_analysis.h | 101 + .../unittests/exception_handler_death_test.cc | 590 + .../exception_handler_nesting_test.cc | 330 + .../unittests/exception_handler_test.cc | 506 + .../unittests/exception_handler_test.h | 60 + src/client/windows/unittests/minidump_test.cc | 335 + src/common/android/include/asm-mips/README.md | 9 + src/common/android/include/asm-mips/asm.h | 270 + .../android/include/asm-mips/fpregdef.h | 117 + src/common/android/include/asm-mips/regdef.h | 125 + src/common/android/include/elf.h | 156 + src/common/android/include/link.h | 76 + src/common/android/include/stab.h | 99 + src/common/android/include/sys/procfs.h | 123 + src/common/android/include/sys/user.h | 68 + src/common/android/testing/include/wchar.h | 75 + src/common/android/testing/mkdtemp.h | 109 + src/common/android/testing/pthread_fixes.h | 93 + src/common/basictypes.h | 49 + src/common/byte_cursor.h | 265 + src/common/byte_cursor_unittest.cc | 779 + src/common/convert_UTF.cc | 595 + src/common/convert_UTF.h | 159 + src/common/dwarf/bytereader-inl.h | 181 + src/common/dwarf/bytereader.cc | 254 + src/common/dwarf/bytereader.h | 320 + src/common/dwarf/bytereader_unittest.cc | 710 + src/common/dwarf/cfi_assembler.cc | 205 + src/common/dwarf/cfi_assembler.h | 268 + src/common/dwarf/dwarf2diehandler.cc | 203 + src/common/dwarf/dwarf2diehandler.h | 368 + src/common/dwarf/dwarf2diehandler_unittest.cc | 532 + src/common/dwarf/dwarf2enums.h | 744 + src/common/dwarf/dwarf2reader.cc | 3487 + src/common/dwarf/dwarf2reader.h | 1527 + src/common/dwarf/dwarf2reader_cfi_unittest.cc | 2590 + src/common/dwarf/dwarf2reader_die_unittest.cc | 968 + .../dwarf/dwarf2reader_lineinfo_unittest.cc | 190 + .../dwarf2reader_splitfunctions_unittest.cc | 129 + src/common/dwarf/dwarf2reader_test_common.h | 163 + src/common/dwarf/elf_reader.cc | 1302 + src/common/dwarf/elf_reader.h | 169 + src/common/dwarf/functioninfo.cc | 232 + src/common/dwarf/functioninfo.h | 191 + src/common/dwarf/line_state_machine.h | 63 + src/common/dwarf/types.h | 41 + src/common/dwarf_cfi_to_module.cc | 324 + src/common/dwarf_cfi_to_module.h | 206 + src/common/dwarf_cfi_to_module_unittest.cc | 321 + src/common/dwarf_cu_to_module.cc | 1589 + src/common/dwarf_cu_to_module.h | 359 + src/common/dwarf_cu_to_module_unittest.cc | 1872 + src/common/dwarf_line_to_module.cc | 146 + src/common/dwarf_line_to_module.h | 190 + src/common/dwarf_line_to_module_unittest.cc | 413 + src/common/dwarf_range_list_handler.cc | 59 + src/common/dwarf_range_list_handler.h | 71 + src/common/language.cc | 223 + src/common/language.h | 104 + src/common/linux/breakpad_getcontext.S | 645 + src/common/linux/breakpad_getcontext.h | 51 + .../linux/breakpad_getcontext_unittest.cc | 216 + src/common/linux/crc32.cc | 73 + src/common/linux/crc32.h | 52 + src/common/linux/dump_symbols.cc | 1360 + src/common/linux/dump_symbols.h | 95 + src/common/linux/dump_symbols_unittest.cc | 211 + src/common/linux/eintr_wrapper.h | 57 + src/common/linux/elf_core_dump.cc | 206 + src/common/linux/elf_core_dump.h | 156 + src/common/linux/elf_core_dump_unittest.cc | 272 + src/common/linux/elf_gnu_compat.h | 50 + src/common/linux/elf_symbols_to_module.cc | 185 + src/common/linux/elf_symbols_to_module.h | 58 + .../linux/elf_symbols_to_module_unittest.cc | 373 + src/common/linux/elfutils-inl.h | 73 + src/common/linux/elfutils.cc | 246 + src/common/linux/elfutils.h | 169 + src/common/linux/file_id.cc | 206 + src/common/linux/file_id.h | 89 + src/common/linux/file_id_unittest.cc | 386 + src/common/linux/google_crashdump_uploader.cc | 212 + src/common/linux/google_crashdump_uploader.h | 106 + .../linux/google_crashdump_uploader_test.cc | 147 + src/common/linux/guid_creator.cc | 188 + src/common/linux/guid_creator.h | 47 + src/common/linux/http_upload.cc | 233 + src/common/linux/http_upload.h | 89 + src/common/linux/ignore_ret.h | 39 + src/common/linux/libcurl_wrapper.cc | 344 + src/common/linux/libcurl_wrapper.h | 122 + src/common/linux/linux_libc_support.cc | 240 + src/common/linux/linux_libc_support.h | 95 + .../linux/linux_libc_support_unittest.cc | 216 + src/common/linux/memory_mapped_file.cc | 115 + src/common/linux/memory_mapped_file.h | 87 + .../linux/memory_mapped_file_unittest.cc | 211 + src/common/linux/safe_readlink.cc | 56 + src/common/linux/safe_readlink.h | 64 + src/common/linux/safe_readlink_unittest.cc | 92 + src/common/linux/scoped_pipe.cc | 132 + src/common/linux/scoped_pipe.h | 115 + src/common/linux/scoped_pipe_unittest.cc | 75 + src/common/linux/scoped_tmpfile.cc | 103 + src/common/linux/scoped_tmpfile.h | 85 + src/common/linux/scoped_tmpfile_unittest.cc | 50 + src/common/linux/symbol_collector_client.cc | 198 + src/common/linux/symbol_collector_client.h | 87 + src/common/linux/symbol_upload.cc | 287 + src/common/linux/symbol_upload.h | 75 + src/common/linux/synth_elf.cc | 267 + src/common/linux/synth_elf.h | 196 + src/common/linux/synth_elf_unittest.cc | 416 + src/common/linux/tests/crash_generator.cc | 341 + src/common/linux/tests/crash_generator.h | 120 + src/common/linux/ucontext_constants.h | 251 + src/common/long_string_dictionary.cc | 181 + src/common/long_string_dictionary.h | 86 + src/common/long_string_dictionary_unittest.cc | 304 + src/common/mac/Breakpad.xcconfig | 51 + src/common/mac/BreakpadDebug.xcconfig | 31 + src/common/mac/BreakpadRelease.xcconfig | 33 + src/common/mac/GTMDefines.h | 456 + src/common/mac/GTMLogger.h | 504 + src/common/mac/GTMLogger.m | 611 + src/common/mac/HTTPGetRequest.h | 41 + src/common/mac/HTTPGetRequest.m | 38 + src/common/mac/HTTPMultipartUpload.h | 62 + src/common/mac/HTTPMultipartUpload.m | 169 + src/common/mac/HTTPPutRequest.h | 50 + src/common/mac/HTTPPutRequest.m | 55 + src/common/mac/HTTPRequest.h | 72 + src/common/mac/HTTPRequest.m | 267 + src/common/mac/HTTPSimplePostRequest.h | 56 + src/common/mac/HTTPSimplePostRequest.m | 68 + src/common/mac/MachIPC.h | 300 + src/common/mac/MachIPC.mm | 305 + src/common/mac/SymbolCollectorClient.h | 103 + src/common/mac/SymbolCollectorClient.m | 271 + src/common/mac/arch_utilities.cc | 160 + src/common/mac/arch_utilities.h | 56 + src/common/mac/bootstrap_compat.cc | 45 + src/common/mac/bootstrap_compat.h | 53 + src/common/mac/byteswap.h | 72 + src/common/mac/dump_syms.cc | 726 + src/common/mac/dump_syms.h | 229 + src/common/mac/encoding_util.h | 40 + src/common/mac/encoding_util.m | 46 + src/common/mac/file_id.cc | 98 + src/common/mac/file_id.h | 91 + src/common/mac/launch_reporter.cc | 87 + src/common/mac/launch_reporter.h | 42 + src/common/mac/macho_id.cc | 240 + src/common/mac/macho_id.h | 106 + src/common/mac/macho_reader.cc | 570 + src/common/mac/macho_reader.h | 463 + src/common/mac/macho_reader_unittest.cc | 1950 + src/common/mac/macho_utilities.cc | 158 + src/common/mac/macho_utilities.h | 94 + src/common/mac/macho_walker.cc | 270 + src/common/mac/macho_walker.h | 118 + src/common/mac/minidump_upload.m | 134 + src/common/mac/scoped_task_suspend-inl.h | 55 + src/common/mac/string_utilities.cc | 87 + src/common/mac/string_utilities.h | 51 + src/common/mac/super_fat_arch.h | 87 + src/common/mac/testing/GTMSenTestCase.h | 1110 + src/common/mac/testing/GTMSenTestCase.m | 428 + src/common/macros.h | 44 + src/common/md5.cc | 255 + src/common/md5.h | 28 + src/common/memory_allocator.h | 251 + src/common/memory_allocator_unittest.cc | 127 + src/common/memory_range.h | 144 + src/common/memory_range_unittest.cc | 196 + src/common/minidump_type_helper.h | 55 + src/common/module.cc | 502 + src/common/module.h | 519 + src/common/module_unittest.cc | 740 + src/common/path_helper.cc | 58 + src/common/path_helper.h | 43 + src/common/safe_math.h | 81 + src/common/safe_math_unittest.cc | 76 + src/common/scoped_ptr.h | 404 + src/common/simple_string_dictionary.cc | 48 + src/common/simple_string_dictionary.h | 276 + .../simple_string_dictionary_unittest.cc | 342 + src/common/solaris/dump_symbols.cc | 683 + src/common/solaris/dump_symbols.h | 48 + src/common/solaris/file_id.cc | 203 + src/common/solaris/file_id.h | 67 + src/common/solaris/guid_creator.cc | 87 + src/common/solaris/guid_creator.h | 49 + src/common/solaris/message_output.h | 53 + src/common/stabs_reader.cc | 319 + src/common/stabs_reader.h | 321 + src/common/stabs_reader_unittest.cc | 614 + src/common/stabs_to_module.cc | 208 + src/common/stabs_to_module.h | 142 + src/common/stabs_to_module_unittest.cc | 260 + src/common/stdio_wrapper.h | 42 + src/common/string_conversion.cc | 158 + src/common/string_conversion.h | 67 + src/common/string_conversion_unittest.cc | 67 + src/common/string_view.h | 113 + src/common/symbol_data.h | 57 + src/common/test_assembler.cc | 362 + src/common/test_assembler.h | 483 + src/common/test_assembler_unittest.cc | 1665 + src/common/testdata/func-line-pairing.h | 676 + src/common/tests/auto_tempdir.h | 99 + src/common/tests/file_utils.cc | 160 + src/common/tests/file_utils.h | 54 + src/common/unordered.h | 55 + src/common/using_std_string.h | 65 + src/common/windows/dia_util.cc | 96 + src/common/windows/dia_util.h | 64 + src/common/windows/guid_string.cc | 79 + src/common/windows/guid_string.h | 57 + src/common/windows/http_upload.cc | 522 + src/common/windows/http_upload.h | 125 + src/common/windows/module_info.h | 74 + src/common/windows/omap.cc | 720 + src/common/windows/omap.h | 72 + src/common/windows/omap_internal.h | 140 + src/common/windows/omap_unittest.cc | 333 + src/common/windows/pdb_source_line_writer.cc | 1552 + src/common/windows/pdb_source_line_writer.h | 356 + src/common/windows/pe_source_line_writer.cc | 80 + src/common/windows/pe_source_line_writer.h | 67 + src/common/windows/pe_util.cc | 415 + src/common/windows/pe_util.h | 77 + src/common/windows/string_utils-inl.h | 141 + src/common/windows/string_utils.cc | 136 + src/common/windows/sym_upload_v2_protocol.cc | 122 + src/common/windows/sym_upload_v2_protocol.h | 66 + src/common/windows/symbol_collector_client.cc | 179 + src/common/windows/symbol_collector_client.h | 92 + src/config.h.in | 106 + src/google_breakpad/common/breakpad_types.h | 67 + .../common/minidump_cpu_amd64.h | 234 + src/google_breakpad/common/minidump_cpu_arm.h | 150 + .../common/minidump_cpu_arm64.h | 191 + .../common/minidump_cpu_mips.h | 175 + src/google_breakpad/common/minidump_cpu_ppc.h | 167 + .../common/minidump_cpu_ppc64.h | 133 + .../common/minidump_cpu_riscv.h | 156 + .../common/minidump_cpu_sparc.h | 162 + src/google_breakpad/common/minidump_cpu_x86.h | 173 + .../common/minidump_exception_fuchsia.h | 57 + .../common/minidump_exception_linux.h | 129 + .../common/minidump_exception_mac.h | 214 + .../common/minidump_exception_ps3.h | 66 + .../common/minidump_exception_solaris.h | 93 + .../common/minidump_exception_win32.h | 2341 + src/google_breakpad/common/minidump_format.h | 1143 + src/google_breakpad/common/minidump_size.h | 112 + .../processor/basic_source_line_resolver.h | 183 + src/google_breakpad/processor/call_stack.h | 86 + src/google_breakpad/processor/code_module.h | 103 + src/google_breakpad/processor/code_modules.h | 107 + src/google_breakpad/processor/dump_context.h | 121 + src/google_breakpad/processor/dump_object.h | 52 + .../processor/exception_record.h | 123 + .../processor/exploitability.h | 81 + .../processor/fast_source_line_resolver.h | 101 + src/google_breakpad/processor/memory_region.h | 78 + src/google_breakpad/processor/microdump.h | 134 + .../processor/microdump_processor.h | 63 + src/google_breakpad/processor/minidump.h | 1454 + .../processor/minidump_processor.h | 164 + .../processor/proc_maps_linux.h | 60 + .../processor/process_result.h | 69 + src/google_breakpad/processor/process_state.h | 214 + .../processor/source_line_resolver_base.h | 132 + .../source_line_resolver_interface.h | 123 + src/google_breakpad/processor/stack_frame.h | 158 + .../processor/stack_frame_cpu.h | 519 + .../processor/stack_frame_symbolizer.h | 113 + src/google_breakpad/processor/stackwalker.h | 260 + .../processor/symbol_supplier.h | 98 + src/google_breakpad/processor/system_info.h | 105 + src/processor/address_map-inl.h | 92 + src/processor/address_map.h | 84 + src/processor/address_map_unittest.cc | 199 + src/processor/basic_code_module.h | 120 + src/processor/basic_code_modules.cc | 155 + src/processor/basic_code_modules.h | 96 + src/processor/basic_source_line_resolver.cc | 930 + .../basic_source_line_resolver_types.h | 209 + .../basic_source_line_resolver_unittest.cc | 1011 + src/processor/call_stack.cc | 57 + src/processor/cfi_frame_info-inl.h | 118 + src/processor/cfi_frame_info.cc | 189 + src/processor/cfi_frame_info.h | 274 + src/processor/cfi_frame_info_unittest.cc | 552 + src/processor/contained_range_map-inl.h | 214 + src/processor/contained_range_map.h | 167 + src/processor/contained_range_map_unittest.cc | 383 + src/processor/convert_old_arm64_context.cc | 70 + src/processor/convert_old_arm64_context.h | 41 + src/processor/disassembler_objdump.cc | 487 + src/processor/disassembler_objdump.h | 142 + .../disassembler_objdump_unittest.cc | 468 + src/processor/disassembler_x86.cc | 253 + src/processor/disassembler_x86.h | 127 + src/processor/disassembler_x86_unittest.cc | 236 + src/processor/dump_context.cc | 881 + src/processor/dump_object.cc | 42 + src/processor/exploitability.cc | 123 + src/processor/exploitability_linux.cc | 320 + src/processor/exploitability_linux.h | 93 + src/processor/exploitability_unittest.cc | 182 + src/processor/exploitability_win.cc | 285 + src/processor/exploitability_win.h | 54 + src/processor/fast_source_line_resolver.cc | 364 + .../fast_source_line_resolver_types.h | 249 + .../fast_source_line_resolver_unittest.cc | 603 + src/processor/linked_ptr.h | 192 + src/processor/logging.cc | 117 + src/processor/logging.h | 187 + src/processor/map_serializers-inl.h | 265 + src/processor/map_serializers.h | 167 + src/processor/map_serializers_unittest.cc | 389 + src/processor/microdump.cc | 408 + src/processor/microdump_processor.cc | 100 + src/processor/microdump_processor_unittest.cc | 288 + src/processor/microdump_stackwalk.cc | 187 + .../microdump_stackwalk_machine_readable_test | 42 + src/processor/microdump_stackwalk_test | 42 + src/processor/microdump_stackwalk_test_vars | 1 + src/processor/minidump.cc | 6480 ++ src/processor/minidump_dump.cc | 285 + src/processor/minidump_dump_test | 35 + src/processor/minidump_processor.cc | 2178 + src/processor/minidump_processor_unittest.cc | 830 + src/processor/minidump_stackwalk.cc | 197 + .../minidump_stackwalk_machine_readable_test | 36 + src/processor/minidump_stackwalk_test | 36 + src/processor/minidump_unittest.cc | 1668 + src/processor/module_comparer.cc | 305 + src/processor/module_comparer.h | 97 + src/processor/module_factory.h | 71 + src/processor/module_serializer.cc | 219 + src/processor/module_serializer.h | 128 + src/processor/pathname_stripper.cc | 59 + src/processor/pathname_stripper.h | 52 + src/processor/pathname_stripper_unittest.cc | 90 + src/processor/postfix_evaluator-inl.h | 362 + src/processor/postfix_evaluator.h | 178 + src/processor/postfix_evaluator_unittest.cc | 406 + src/processor/proc_maps_linux.cc | 110 + src/processor/proc_maps_linux_unittest.cc | 255 + src/processor/process_state.cc | 75 + src/processor/proto/README | 20 + src/processor/proto/process_state.proto | 209 + src/processor/range_map-inl.h | 296 + src/processor/range_map.h | 170 + .../range_map_truncate_lower_unittest.cc | 349 + .../range_map_truncate_upper_unittest.cc | 357 + src/processor/range_map_unittest.cc | 561 + src/processor/simple_serializer-inl.h | 371 + src/processor/simple_serializer.h | 64 + src/processor/simple_symbol_supplier.cc | 207 + src/processor/simple_symbol_supplier.h | 139 + src/processor/source_line_resolver_base.cc | 351 + .../source_line_resolver_base_types.h | 209 + src/processor/stack_frame_cpu.cc | 82 + src/processor/stack_frame_symbolizer.cc | 149 + src/processor/stackwalk_common.cc | 1304 + src/processor/stackwalk_common.h | 50 + src/processor/stackwalker.cc | 358 + src/processor/stackwalker_address_list.cc | 95 + src/processor/stackwalker_address_list.h | 70 + .../stackwalker_address_list_unittest.cc | 201 + src/processor/stackwalker_amd64.cc | 380 + src/processor/stackwalker_amd64.h | 112 + src/processor/stackwalker_amd64_unittest.cc | 937 + src/processor/stackwalker_arm.cc | 302 + src/processor/stackwalker_arm.h | 106 + src/processor/stackwalker_arm64.cc | 357 + src/processor/stackwalker_arm64.h | 117 + src/processor/stackwalker_arm64_unittest.cc | 884 + src/processor/stackwalker_arm_unittest.cc | 982 + src/processor/stackwalker_mips.cc | 446 + src/processor/stackwalker_mips.h | 84 + src/processor/stackwalker_mips64_unittest.cc | 722 + src/processor/stackwalker_mips_unittest.cc | 708 + src/processor/stackwalker_ppc.cc | 157 + src/processor/stackwalker_ppc.h | 78 + src/processor/stackwalker_ppc64.cc | 148 + src/processor/stackwalker_ppc64.h | 76 + src/processor/stackwalker_riscv.cc | 539 + src/processor/stackwalker_riscv.h | 100 + src/processor/stackwalker_riscv64.cc | 539 + src/processor/stackwalker_riscv64.h | 100 + src/processor/stackwalker_riscv64_unittest.cc | 887 + src/processor/stackwalker_riscv_unittest.cc | 887 + src/processor/stackwalker_selftest.cc | 436 + src/processor/stackwalker_selftest_sol.s | 110 + src/processor/stackwalker_sparc.cc | 149 + src/processor/stackwalker_sparc.h | 77 + src/processor/stackwalker_unittest_utils.h | 219 + src/processor/stackwalker_x86.cc | 704 + src/processor/stackwalker_x86.h | 116 + src/processor/stackwalker_x86_unittest.cc | 2269 + src/processor/static_address_map-inl.h | 70 + src/processor/static_address_map.h | 77 + src/processor/static_address_map_unittest.cc | 239 + .../static_contained_range_map-inl.h | 108 + src/processor/static_contained_range_map.h | 101 + .../static_contained_range_map_unittest.cc | 342 + src/processor/static_map-inl.h | 176 + src/processor/static_map.h | 144 + src/processor/static_map_iterator-inl.h | 147 + src/processor/static_map_iterator.h | 112 + src/processor/static_map_unittest.cc | 389 + src/processor/static_range_map-inl.h | 129 + src/processor/static_range_map.h | 105 + src/processor/static_range_map_unittest.cc | 424 + src/processor/symbolic_constants_win.cc | 6420 ++ src/processor/symbolic_constants_win.h | 50 + src/processor/synth_minidump.cc | 424 + src/processor/synth_minidump.h | 397 + src/processor/synth_minidump_unittest.cc | 339 + src/processor/synth_minidump_unittest_data.h | 418 + src/processor/testdata/ascii_read_av.dmp | Bin 0 -> 16566 bytes .../testdata/ascii_read_av_block_write.dmp | Bin 0 -> 15194 bytes .../testdata/ascii_read_av_clobber_write.dmp | Bin 0 -> 17402 bytes .../testdata/ascii_read_av_conditional.dmp | Bin 0 -> 16982 bytes .../testdata/ascii_read_av_then_jmp.dmp | Bin 0 -> 16598 bytes .../testdata/ascii_read_av_xchg_write.dmp | Bin 0 -> 16390 bytes src/processor/testdata/ascii_write_av.dmp | Bin 0 -> 17702 bytes .../testdata/ascii_write_av_arg_to_call.dmp | Bin 0 -> 15942 bytes src/processor/testdata/exec_av_on_stack.dmp | Bin 0 -> 16629 bytes .../testdata/linux_divide_by_zero.dmp | Bin 0 -> 38760 bytes .../testdata/linux_executable_heap.dmp | Bin 0 -> 38761 bytes .../testdata/linux_executable_stack.dmp | Bin 0 -> 38794 bytes src/processor/testdata/linux_inline.dmp | Bin 0 -> 21456 bytes .../linux_inside_module_exe_region1.dmp | Bin 0 -> 56256 bytes .../linux_inside_module_exe_region2.dmp | Bin 0 -> 48600 bytes src/processor/testdata/linux_jmp_to_0.dmp | Bin 0 -> 38544 bytes .../linux_jmp_to_module_not_exe_region.dmp | Bin 0 -> 44936 bytes .../testdata/linux_null_dereference.dmp | Bin 0 -> 38760 bytes src/processor/testdata/linux_null_read_av.dmp | Bin 0 -> 20160 bytes .../testdata/linux_outside_module.dmp | Bin 0 -> 44600 bytes src/processor/testdata/linux_overflow.dmp | Bin 0 -> 20136 bytes .../testdata/linux_raise_sigabrt.dmp | Bin 0 -> 52424 bytes .../linux_stack_pointer_in_module.dmp | Bin 0 -> 38761 bytes .../testdata/linux_stack_pointer_in_stack.dmp | Bin 0 -> 38761 bytes .../linux_stack_pointer_in_stack_alt_name.dmp | Bin 0 -> 38761 bytes src/processor/testdata/linux_stacksmash.dmp | Bin 0 -> 20136 bytes src/processor/testdata/linux_test_app.cc | 85 + .../linux_write_to_nonwritable_module.dmp | Bin 0 -> 44944 bytes ...linux_write_to_nonwritable_region_math.dmp | Bin 0 -> 40848 bytes .../linux_write_to_outside_module.dmp | Bin 0 -> 44944 bytes ...linux_write_to_outside_module_via_math.dmp | Bin 0 -> 44944 bytes .../testdata/linux_write_to_under_4k.dmp | Bin 0 -> 44944 bytes src/processor/testdata/microdump-arm.dmp | 34 + src/processor/testdata/microdump-arm64.dmp | 45 + src/processor/testdata/microdump-mips32.dmp | 37 + src/processor/testdata/microdump-mips64.dmp | 26 + src/processor/testdata/microdump-multiple.dmp | 197 + .../testdata/microdump-withcrashreason.dmp | 1422 + src/processor/testdata/microdump-x86.dmp | 174 + .../testdata/microdump.stackwalk-arm.out | 63 + .../testdata/microdump.stackwalk-arm64.out | 113 + ...crodump.stackwalk.machine_readable-arm.out | 19 + ...odump.stackwalk.machine_readable-arm64.out | 22 + src/processor/testdata/minidump2.dmp | Bin 0 -> 11317 bytes src/processor/testdata/minidump2.dump.out | 706 + .../minidump2.stackwalk.machine_readable.out | 22 + .../testdata/minidump2.stackwalk.out | 42 + .../testdata/minidump_32bit_crash_addr.dmp | Bin 0 -> 11317 bytes .../testdata/minidump_crashpad_annotation.dmp | Bin 0 -> 332000 bytes src/processor/testdata/module0.out | 22151 +++++ src/processor/testdata/module1.out | 29 + src/processor/testdata/module2.out | 23 + src/processor/testdata/module3_bad.out | 3 + src/processor/testdata/module4_bad.out | 5 + src/processor/testdata/null_read_av.dmp | Bin 0 -> 15870 bytes src/processor/testdata/null_write_av.dmp | Bin 0 -> 17378 bytes .../testdata/read_av_clobber_write.dmp | Bin 0 -> 15107 bytes .../testdata/read_av_conditional.dmp | Bin 0 -> 16779 bytes src/processor/testdata/read_av_non_null.dmp | Bin 0 -> 15547 bytes src/processor/testdata/stack_exhaustion.dmp | Bin 0 -> 1049914 bytes .../kernel32.sym | 5787 ++ .../ld-2.13.so.sym | 782 + .../libc-2.13.so.sym | 13458 +++ .../libgcc_s.so.1.sym | 897 + .../linux_inline.new.sym | 71 + .../linux_inline.old.sym | 68 + .../breakpad_unittests.sym | 82243 ++++++++++++++++ .../breakpad_unittests.sym | 66343 +++++++++++++ .../crash_example.sym | 56 + .../crash_example.sym | 48 + .../null_read_av.sym | 6614 ++ .../overflow.sym | 6709 ++ .../test_app.sym | 22151 +++++ src/processor/testdata/test_app.cc | 72 + src/processor/testdata/thread_name_list.dmp | Bin 0 -> 18011 bytes src/processor/testdata/tiny-exe-fastfail.dmp | Bin 0 -> 98722 bytes .../testdata/tiny-exe-with-cet-xsave.dmp | Bin 0 -> 92736 bytes .../testdata/write_av_non_canonical.dmp | Bin 0 -> 27561 bytes src/processor/testdata/write_av_non_null.dmp | Bin 0 -> 16139 bytes src/processor/tokenize.cc | 81 + src/processor/tokenize.h | 62 + src/processor/windows_frame_info.h | 208 + src/third_party/curl/COPYING | 22 + src/third_party/curl/curl.h | 1936 + src/third_party/curl/curlbuild.h | 204 + src/third_party/curl/curlrules.h | 249 + src/third_party/curl/curlver.h | 70 + src/third_party/curl/easy.h | 103 + src/third_party/curl/mprintf.h | 82 + src/third_party/curl/multi.h | 346 + src/third_party/curl/stdcheaders.h | 34 + src/third_party/curl/typecheck-gcc.h | 551 + src/third_party/curl/types.h | 1 + src/third_party/libdisasm/LICENSE | 137 + src/third_party/libdisasm/Makefile.am | 43 + src/third_party/libdisasm/README.breakpad | 9 + src/third_party/libdisasm/TODO | 43 + src/third_party/libdisasm/ia32_implicit.c | 422 + src/third_party/libdisasm/ia32_implicit.h | 13 + src/third_party/libdisasm/ia32_insn.c | 623 + src/third_party/libdisasm/ia32_insn.h | 506 + src/third_party/libdisasm/ia32_invariant.c | 313 + src/third_party/libdisasm/ia32_invariant.h | 11 + src/third_party/libdisasm/ia32_modrm.c | 310 + src/third_party/libdisasm/ia32_modrm.h | 13 + .../libdisasm/ia32_opcode_tables.c | 2939 + .../libdisasm/ia32_opcode_tables.h | 57 + src/third_party/libdisasm/ia32_operand.c | 425 + src/third_party/libdisasm/ia32_operand.h | 11 + src/third_party/libdisasm/ia32_reg.c | 234 + src/third_party/libdisasm/ia32_reg.h | 41 + src/third_party/libdisasm/ia32_settings.c | 13 + src/third_party/libdisasm/ia32_settings.h | 27 + src/third_party/libdisasm/libdis.h | 832 + src/third_party/libdisasm/qword.h | 14 + src/third_party/libdisasm/swig/Makefile | 70 + src/third_party/libdisasm/swig/README | 128 + src/third_party/libdisasm/swig/libdisasm.i | 508 + .../libdisasm/swig/libdisasm_oop.i | 1114 + .../libdisasm/swig/perl/Makefile-swig | 65 + .../libdisasm/swig/perl/Makefile.PL | 7 + .../libdisasm/swig/python/Makefile-swig | 64 + .../libdisasm/swig/ruby/Makefile-swig | 68 + .../libdisasm/swig/ruby/extconf.rb | 4 + .../libdisasm/swig/tcl/Makefile-swig | 63 + src/third_party/libdisasm/x86_disasm.c | 210 + src/third_party/libdisasm/x86_format.c | 1430 + src/third_party/libdisasm/x86_imm.c | 70 + src/third_party/libdisasm/x86_imm.h | 18 + src/third_party/libdisasm/x86_insn.c | 182 + src/third_party/libdisasm/x86_misc.c | 71 + src/third_party/libdisasm/x86_operand_list.c | 191 + src/third_party/libdisasm/x86_operand_list.h | 8 + .../linux/include/gflags/gflags_completions.h | 120 + src/third_party/lss/.gitignore | 3 + src/third_party/lss/DIR_METADATA | 12 + src/third_party/lss/LICENSE | 27 + src/third_party/lss/OWNERS | 2 + src/third_party/lss/README.md | 138 + src/third_party/lss/codereview.settings | 5 + src/third_party/lss/linux_syscall_support.h | 5333 + src/third_party/lss/tests/.gitignore | 4 + src/third_party/lss/tests/Makefile | 147 + src/third_party/lss/tests/README.md | 52 + src/third_party/lss/tests/fallocate.c | 69 + src/third_party/lss/tests/getitimer.c | 84 + src/third_party/lss/tests/getrandom.c | 59 + src/third_party/lss/tests/lstat.c | 97 + src/third_party/lss/tests/setitimer.c | 90 + src/third_party/lss/tests/sigaction.c | 54 + src/third_party/lss/tests/sigtimedwait.c | 58 + src/third_party/lss/tests/stat.c | 67 + src/third_party/lss/tests/test_skel.h | 89 + src/third_party/lss/tests/unlink.c | 48 + src/third_party/mac_headers/README | 25 + .../mac_headers/architecture/byte_order.h | 39 + src/third_party/mac_headers/arm/_types.h | 16 + src/third_party/mac_headers/i386/_types.h | 38 + src/third_party/mac_headers/mach-o/arch.h | 150 + src/third_party/mac_headers/mach-o/fat.h | 83 + src/third_party/mac_headers/mach-o/loader.h | 1606 + src/third_party/mac_headers/mach-o/nlist.h | 324 + .../mac_headers/mach/arm/boolean.h | 74 + .../mac_headers/mach/arm/vm_types.h | 159 + src/third_party/mac_headers/mach/boolean.h | 88 + .../mac_headers/mach/i386/boolean.h | 78 + .../mac_headers/mach/i386/vm_types.h | 157 + src/third_party/mac_headers/mach/machine.h | 461 + .../mac_headers/mach/machine/boolean.h | 40 + .../mac_headers/mach/machine/thread_state.h | 9 + .../mac_headers/mach/machine/thread_status.h | 1 + .../mac_headers/mach/machine/vm_types.h | 40 + .../mac_headers/mach/thread_status.h | 100 + src/third_party/mac_headers/mach/vm_prot.h | 193 + src/third_party/musl/COPYRIGHT | 163 + src/third_party/musl/README | 23 + src/third_party/musl/README.breakpad | 3 + src/third_party/musl/VERSION | 1 + src/third_party/musl/include/elf.h | 2827 + src/tools/linux/core2md/core2md.cc | 77 + src/tools/linux/core_handler/core_handler.cc | 151 + src/tools/linux/dump_syms/dump_syms.cc | 155 + src/tools/linux/md2core/minidump-2-core.cc | 1534 + .../linux/md2core/minidump_memory_range.h | 88 + .../md2core/minidump_memory_range_unittest.cc | 261 + src/tools/linux/pid2md/pid2md.cc | 62 + src/tools/linux/symupload/minidump_upload.cc | 159 + src/tools/linux/symupload/sym_upload.cc | 217 + .../dump_syms.xcodeproj/project.pbxproj | 1857 + src/tools/mac/dump_syms/dump_syms_tool.cc | 340 + src/tools/mac/symupload/symupload.mm | 474 + .../symupload.xcodeproj/project.pbxproj | 466 + .../upload_system_symbols/arch_constants.h | 66 + .../mac/upload_system_symbols/arch_reader.go | 68 + src/tools/mac/upload_system_symbols/go.mod | 3 + .../upload_system_symbols.go | 484 + .../upload_system_symbols.sh | 114 + src/tools/python/deps-to-manifest.py | 165 + src/tools/python/filter_syms.py | 202 + .../python/tests/filter_syms_unittest.py | 136 + src/tools/solaris/dump_syms/Makefile | 63 + src/tools/solaris/dump_syms/dump_syms.cc | 57 + src/tools/solaris/dump_syms/run_regtest.sh | 50 + .../dump_syms/testdata/dump_syms_regtest.cc | 67 + .../testdata/dump_syms_regtest.stabs | 129 + .../dump_syms/testdata/dump_syms_regtest.sym | 33 + src/tools/windows/binaries/dump_syms.exe | Bin 0 -> 141824 bytes src/tools/windows/binaries/symupload.exe | Bin 0 -> 243712 bytes .../converter/ms_symbol_server_converter.cc | 770 + .../converter/ms_symbol_server_converter.h | 242 + src/tools/windows/converter_exe/configure.cmd | 33 + src/tools/windows/converter_exe/converter.cc | 908 + src/tools/windows/converter_exe/escaping.cc | 761 + src/tools/windows/converter_exe/escaping.h | 99 + src/tools/windows/converter_exe/http_client.h | 96 + .../windows/converter_exe/http_download.cc | 330 + .../windows/converter_exe/http_download.h | 62 + .../converter_exe/missing_symbols_test.txt | 5 + src/tools/windows/converter_exe/symsrv.yes | 2 + src/tools/windows/converter_exe/tokenizer.cc | 65 + src/tools/windows/converter_exe/tokenizer.h | 51 + .../windows/converter_exe/winhttp_client.cc | 311 + .../windows/converter_exe/winhttp_client.h | 40 + .../windows/converter_exe/wininet_client.cc | 282 + .../windows/converter_exe/wininet_client.h | 40 + .../windows/converter_exe/winsymconv.cmd | 86 + .../windows/converter_exe/winsymconv_test.cmd | 72 + src/tools/windows/dump_syms/dump_syms.cc | 102 + .../windows/dump_syms/dump_syms_unittest.cc | 248 + src/tools/windows/dump_syms/run_regtest.sh | 52 + .../dump_syms/testdata/dump_syms_regtest.cc | 75 + .../dump_syms/testdata/dump_syms_regtest.pdb | Bin 0 -> 707584 bytes .../dump_syms/testdata/dump_syms_regtest.sym | 2945 + .../testdata/dump_syms_regtest64.exe | Bin 0 -> 84992 bytes .../testdata/dump_syms_regtest64.pdb | Bin 0 -> 1010688 bytes .../testdata/dump_syms_regtest64.sym | 4561 + .../dump_syms/testdata/omap_reorder_bbs.pdb | Bin 0 -> 756736 bytes .../dump_syms/testdata/omap_reorder_bbs.sym | 6209 ++ .../dump_syms/testdata/omap_reorder_funcs.pdb | Bin 0 -> 711680 bytes .../dump_syms/testdata/omap_reorder_funcs.sym | 2945 + .../dump_syms/testdata/omap_stretched.pdb | Bin 0 -> 783360 bytes .../dump_syms/testdata/omap_stretched.sym | 3137 + .../testdata/omap_stretched_filled.pdb | Bin 0 -> 828416 bytes .../testdata/omap_stretched_filled.sym | 2945 + .../testdata/pe_only_symbol_test.dll | Bin 0 -> 51200 bytes .../testdata/pe_only_symbol_test.sym | 214 + src/tools/windows/refresh_binaries.bat | 23 + src/tools/windows/symupload/symupload.cc | 316 + 935 files changed, 536761 insertions(+) create mode 100644 .clang-format create mode 100644 .gitignore create mode 100644 AUTHORS create mode 100644 ChangeLog create mode 100644 DEPS create mode 100644 DIR_METADATA create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 OWNERS create mode 100644 README.ANDROID create mode 100644 aclocal.m4 create mode 100644 android/common-functions.sh create mode 100644 android/google_breakpad/Android.mk create mode 100644 android/run-checks.sh create mode 100644 android/sample_app/README create mode 100644 android/sample_app/jni/Android.mk create mode 100644 android/sample_app/jni/Application.mk create mode 100644 android/sample_app/jni/test_breakpad.cpp create mode 100644 android/test-driver create mode 100644 android/test-shell.sh create mode 100644 appveyor.yml create mode 100644 autotools/ar-lib create mode 100644 autotools/compile create mode 100644 autotools/config.guess create mode 100644 autotools/config.sub create mode 100644 autotools/depcomp create mode 100644 autotools/install-sh create mode 100644 autotools/ltmain.sh create mode 100644 autotools/missing create mode 100644 autotools/root-test-driver create mode 100644 autotools/test-driver create mode 100644 breakpad-client.pc.in create mode 100644 breakpad.pc.in create mode 100644 codereview.settings create mode 100644 configure create mode 100644 configure.ac create mode 100644 default.xml create mode 100644 docs/OWNERS create mode 100644 docs/breakpad.png create mode 100644 docs/breakpad.svg create mode 100644 docs/client_design.md create mode 100644 docs/contributing_to_breakpad.md create mode 100644 docs/exception_handling.md create mode 100644 docs/getting_started_with_breakpad.md create mode 100644 docs/linux_core_handler.md create mode 100644 docs/linux_starter_guide.md create mode 100644 docs/linux_system_calls.md create mode 100644 docs/mac_breakpad_starter_guide.md create mode 100644 docs/mozilla_brown_bag_talk.md create mode 100644 docs/processor_design.md create mode 100644 docs/stack_walking.md create mode 100644 docs/sym_upload_v2_protocol.md create mode 100644 docs/symbol_files.md create mode 100644 docs/windows_client_integration.md create mode 100644 m4/ax_append_compile_flags.m4 create mode 100644 m4/ax_append_flag.m4 create mode 100644 m4/ax_check_compile_flag.m4 create mode 100644 m4/ax_check_define.m4 create mode 100644 m4/ax_cxx_compile_stdcxx.m4 create mode 100644 m4/ax_pthread.m4 create mode 100644 m4/ax_require_defined.m4 create mode 100644 m4/libtool.m4 create mode 100644 m4/ltoptions.m4 create mode 100644 m4/ltsugar.m4 create mode 100644 m4/ltversion.m4 create mode 100644 m4/lt~obsolete.m4 create mode 100644 src/breakpad_googletest_includes.h create mode 100644 src/client/apple/Framework/BreakpadDefines.h create mode 100644 src/client/ios/Breakpad.h create mode 100644 src/client/ios/Breakpad.mm create mode 100644 src/client/ios/Breakpad.xcodeproj/project.pbxproj create mode 100644 src/client/ios/BreakpadController.h create mode 100644 src/client/ios/BreakpadController.mm create mode 100644 src/client/ios/Breakpad_Prefix.pch create mode 100644 src/client/ios/exception_handler_no_mach.cc create mode 100644 src/client/ios/exception_handler_no_mach.h create mode 100644 src/client/ios/handler/ios_exception_minidump_generator.h create mode 100644 src/client/ios/handler/ios_exception_minidump_generator.mm create mode 100644 src/client/linux/crash_generation/client_info.h create mode 100644 src/client/linux/crash_generation/crash_generation_client.cc create mode 100644 src/client/linux/crash_generation/crash_generation_client.h create mode 100644 src/client/linux/crash_generation/crash_generation_server.cc create mode 100644 src/client/linux/crash_generation/crash_generation_server.h create mode 100644 src/client/linux/data/linux-gate-amd.sym create mode 100644 src/client/linux/data/linux-gate-intel.sym create mode 100644 src/client/linux/dump_writer_common/mapping_info.h create mode 100644 src/client/linux/dump_writer_common/raw_context_cpu.h create mode 100644 src/client/linux/dump_writer_common/thread_info.cc create mode 100644 src/client/linux/dump_writer_common/thread_info.h create mode 100644 src/client/linux/dump_writer_common/ucontext_reader.cc create mode 100644 src/client/linux/dump_writer_common/ucontext_reader.h create mode 100644 src/client/linux/handler/exception_handler.cc create mode 100644 src/client/linux/handler/exception_handler.h create mode 100644 src/client/linux/handler/exception_handler_unittest.cc create mode 100644 src/client/linux/handler/microdump_extra_info.h create mode 100644 src/client/linux/handler/minidump_descriptor.cc create mode 100644 src/client/linux/handler/minidump_descriptor.h create mode 100644 src/client/linux/log/log.cc create mode 100644 src/client/linux/log/log.h create mode 100644 src/client/linux/microdump_writer/microdump_writer.cc create mode 100644 src/client/linux/microdump_writer/microdump_writer.h create mode 100644 src/client/linux/microdump_writer/microdump_writer_unittest.cc create mode 100644 src/client/linux/minidump_writer/cpu_set.h create mode 100644 src/client/linux/minidump_writer/cpu_set_unittest.cc create mode 100644 src/client/linux/minidump_writer/directory_reader.h create mode 100644 src/client/linux/minidump_writer/directory_reader_unittest.cc create mode 100644 src/client/linux/minidump_writer/line_reader.h create mode 100644 src/client/linux/minidump_writer/line_reader_unittest.cc create mode 100644 src/client/linux/minidump_writer/linux_core_dumper.cc create mode 100644 src/client/linux/minidump_writer/linux_core_dumper.h create mode 100644 src/client/linux/minidump_writer/linux_core_dumper_unittest.cc create mode 100644 src/client/linux/minidump_writer/linux_dumper.cc create mode 100644 src/client/linux/minidump_writer/linux_dumper.h create mode 100644 src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc create mode 100644 src/client/linux/minidump_writer/linux_ptrace_dumper.cc create mode 100644 src/client/linux/minidump_writer/linux_ptrace_dumper.h create mode 100644 src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc create mode 100644 src/client/linux/minidump_writer/minidump_writer.cc create mode 100644 src/client/linux/minidump_writer/minidump_writer.h create mode 100644 src/client/linux/minidump_writer/minidump_writer_unittest.cc create mode 100644 src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc create mode 100644 src/client/linux/minidump_writer/minidump_writer_unittest_utils.h create mode 100644 src/client/linux/minidump_writer/pe_file.cc create mode 100644 src/client/linux/minidump_writer/pe_file.h create mode 100644 src/client/linux/minidump_writer/pe_structs.h create mode 100644 src/client/linux/minidump_writer/proc_cpuinfo_reader.h create mode 100644 src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc create mode 100644 src/client/linux/sender/google_crash_report_sender.cc create mode 100644 src/client/mac/Breakpad.xcodeproj/project.pbxproj create mode 100644 src/client/mac/Framework/Breakpad.h create mode 100644 src/client/mac/Framework/Breakpad.mm create mode 100644 src/client/mac/Framework/Breakpad_Prefix.pch create mode 100644 src/client/mac/Framework/Info.plist create mode 100644 src/client/mac/Framework/OnDemandServer.h create mode 100644 src/client/mac/Framework/OnDemandServer.mm create mode 100644 src/client/mac/UnitTests-Info.plist create mode 100644 src/client/mac/crash_generation/ConfigFile.h create mode 100644 src/client/mac/crash_generation/ConfigFile.mm create mode 100644 src/client/mac/crash_generation/Inspector.h create mode 100644 src/client/mac/crash_generation/Inspector.mm create mode 100644 src/client/mac/crash_generation/InspectorMain.mm create mode 100644 src/client/mac/crash_generation/client_info.h create mode 100644 src/client/mac/crash_generation/crash_generation_client.cc create mode 100644 src/client/mac/crash_generation/crash_generation_client.h create mode 100644 src/client/mac/crash_generation/crash_generation_server.cc create mode 100644 src/client/mac/crash_generation/crash_generation_server.h create mode 100644 src/client/mac/handler/breakpad_nlist_64.cc create mode 100644 src/client/mac/handler/breakpad_nlist_64.h create mode 100644 src/client/mac/handler/dynamic_images.cc create mode 100644 src/client/mac/handler/dynamic_images.h create mode 100644 src/client/mac/handler/exception_handler.cc create mode 100644 src/client/mac/handler/exception_handler.h create mode 100644 src/client/mac/handler/mach_vm_compat.h create mode 100644 src/client/mac/handler/minidump_generator.cc create mode 100644 src/client/mac/handler/minidump_generator.h create mode 100644 src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj create mode 100644 src/client/mac/handler/minidump_tests32-Info.plist create mode 100644 src/client/mac/handler/minidump_tests64-Info.plist create mode 100644 src/client/mac/handler/obj-cTestCases-Info.plist create mode 100644 src/client/mac/handler/protected_memory_allocator.cc create mode 100644 src/client/mac/handler/protected_memory_allocator.h create mode 100644 src/client/mac/handler/testcases/DynamicImagesTests.cc create mode 100644 src/client/mac/handler/testcases/DynamicImagesTests.h create mode 100644 src/client/mac/handler/testcases/breakpad_nlist_test.cc create mode 100644 src/client/mac/handler/testcases/breakpad_nlist_test.h create mode 100644 src/client/mac/handler/testcases/dwarftests.h create mode 100644 src/client/mac/handler/testcases/dwarftests.mm create mode 100644 src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data create mode 100644 src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym create mode 100644 src/client/mac/handler/ucontext_compat.h create mode 100644 src/client/mac/sender/Breakpad.xib create mode 100644 src/client/mac/sender/English.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/English.lproj/Localizable.strings create mode 100644 src/client/mac/sender/ReporterIcon.graffle create mode 100644 src/client/mac/sender/crash_report_sender-Info.plist create mode 100644 src/client/mac/sender/crash_report_sender.h create mode 100644 src/client/mac/sender/crash_report_sender.icns create mode 100644 src/client/mac/sender/crash_report_sender.m create mode 100644 src/client/mac/sender/da.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/da.lproj/Localizable.strings create mode 100644 src/client/mac/sender/de.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/de.lproj/Localizable.strings create mode 100644 src/client/mac/sender/es.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/es.lproj/Localizable.strings create mode 100644 src/client/mac/sender/fr.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/fr.lproj/Localizable.strings create mode 100644 src/client/mac/sender/goArrow.png create mode 100644 src/client/mac/sender/it.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/it.lproj/Localizable.strings create mode 100644 src/client/mac/sender/ja.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/ja.lproj/Localizable.strings create mode 100644 src/client/mac/sender/nl.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/nl.lproj/Localizable.strings create mode 100644 src/client/mac/sender/no.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/no.lproj/Localizable.strings create mode 100644 src/client/mac/sender/sl.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/sl.lproj/Localizable.strings create mode 100644 src/client/mac/sender/sv.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/sv.lproj/Localizable.strings create mode 100644 src/client/mac/sender/tr.lproj/InfoPlist.strings create mode 100644 src/client/mac/sender/tr.lproj/Localizable.strings create mode 100644 src/client/mac/sender/uploader.h create mode 100644 src/client/mac/sender/uploader.mm create mode 100644 src/client/mac/testapp/Controller.h create mode 100644 src/client/mac/testapp/Controller.m create mode 100644 src/client/mac/testapp/English.lproj/InfoPlist.strings create mode 100644 src/client/mac/testapp/English.lproj/MainMenu.xib create mode 100644 src/client/mac/testapp/Info.plist create mode 100644 src/client/mac/testapp/TestClass.h create mode 100644 src/client/mac/testapp/TestClass.mm create mode 100644 src/client/mac/testapp/bomb.icns create mode 100644 src/client/mac/testapp/crashInMain create mode 100644 src/client/mac/testapp/crashduringload create mode 100644 src/client/mac/testapp/main.m create mode 100644 src/client/mac/tests/BreakpadFramework_Test.mm create mode 100644 src/client/mac/tests/crash_generation_server_test.cc create mode 100644 src/client/mac/tests/exception_handler_test.cc create mode 100644 src/client/mac/tests/minidump_generator_test.cc create mode 100644 src/client/mac/tests/minidump_generator_test_helper.cc create mode 100644 src/client/mac/tests/spawn_child_process.h create mode 100644 src/client/mac/tests/testlogging.h create mode 100644 src/client/minidump_file_writer-inl.h create mode 100644 src/client/minidump_file_writer.cc create mode 100644 src/client/minidump_file_writer.h create mode 100644 src/client/minidump_file_writer_unittest.cc create mode 100644 src/client/solaris/handler/Makefile create mode 100644 src/client/solaris/handler/exception_handler.cc create mode 100644 src/client/solaris/handler/exception_handler.h create mode 100644 src/client/solaris/handler/exception_handler_test.cc create mode 100644 src/client/solaris/handler/minidump_generator.cc create mode 100644 src/client/solaris/handler/minidump_generator.h create mode 100644 src/client/solaris/handler/minidump_test.cc create mode 100644 src/client/solaris/handler/solaris_lwp.cc create mode 100644 src/client/solaris/handler/solaris_lwp.h create mode 100644 src/client/windows/common/auto_critical_section.h create mode 100644 src/client/windows/common/ipc_protocol.h create mode 100644 src/client/windows/crash_generation/ReadMe.txt create mode 100644 src/client/windows/crash_generation/client_info.cc create mode 100644 src/client/windows/crash_generation/client_info.h create mode 100644 src/client/windows/crash_generation/crash_generation_client.cc create mode 100644 src/client/windows/crash_generation/crash_generation_client.h create mode 100644 src/client/windows/crash_generation/crash_generation_server.cc create mode 100644 src/client/windows/crash_generation/crash_generation_server.h create mode 100644 src/client/windows/crash_generation/minidump_generator.cc create mode 100644 src/client/windows/crash_generation/minidump_generator.h create mode 100644 src/client/windows/handler/exception_handler.cc create mode 100644 src/client/windows/handler/exception_handler.h create mode 100644 src/client/windows/sender/crash_report_sender.cc create mode 100644 src/client/windows/sender/crash_report_sender.h create mode 100644 src/client/windows/tests/crash_generation_app/abstract_class.cc create mode 100644 src/client/windows/tests/crash_generation_app/abstract_class.h create mode 100644 src/client/windows/tests/crash_generation_app/crash_generation_app.cc create mode 100644 src/client/windows/tests/crash_generation_app/crash_generation_app.h create mode 100644 src/client/windows/tests/crash_generation_app/crash_generation_app.ico create mode 100644 src/client/windows/tests/crash_generation_app/crash_generation_app.rc create mode 100644 src/client/windows/tests/crash_generation_app/resource.h create mode 100644 src/client/windows/tests/crash_generation_app/small.ico create mode 100644 src/client/windows/unittests/crash_generation_server_test.cc create mode 100644 src/client/windows/unittests/dump_analysis.cc create mode 100644 src/client/windows/unittests/dump_analysis.h create mode 100644 src/client/windows/unittests/exception_handler_death_test.cc create mode 100644 src/client/windows/unittests/exception_handler_nesting_test.cc create mode 100644 src/client/windows/unittests/exception_handler_test.cc create mode 100644 src/client/windows/unittests/exception_handler_test.h create mode 100644 src/client/windows/unittests/minidump_test.cc create mode 100644 src/common/android/include/asm-mips/README.md create mode 100644 src/common/android/include/asm-mips/asm.h create mode 100644 src/common/android/include/asm-mips/fpregdef.h create mode 100644 src/common/android/include/asm-mips/regdef.h create mode 100644 src/common/android/include/elf.h create mode 100644 src/common/android/include/link.h create mode 100644 src/common/android/include/stab.h create mode 100644 src/common/android/include/sys/procfs.h create mode 100644 src/common/android/include/sys/user.h create mode 100644 src/common/android/testing/include/wchar.h create mode 100644 src/common/android/testing/mkdtemp.h create mode 100644 src/common/android/testing/pthread_fixes.h create mode 100644 src/common/basictypes.h create mode 100644 src/common/byte_cursor.h create mode 100644 src/common/byte_cursor_unittest.cc create mode 100644 src/common/convert_UTF.cc create mode 100644 src/common/convert_UTF.h create mode 100644 src/common/dwarf/bytereader-inl.h create mode 100644 src/common/dwarf/bytereader.cc create mode 100644 src/common/dwarf/bytereader.h create mode 100644 src/common/dwarf/bytereader_unittest.cc create mode 100644 src/common/dwarf/cfi_assembler.cc create mode 100644 src/common/dwarf/cfi_assembler.h create mode 100644 src/common/dwarf/dwarf2diehandler.cc create mode 100644 src/common/dwarf/dwarf2diehandler.h create mode 100644 src/common/dwarf/dwarf2diehandler_unittest.cc create mode 100644 src/common/dwarf/dwarf2enums.h create mode 100644 src/common/dwarf/dwarf2reader.cc create mode 100644 src/common/dwarf/dwarf2reader.h create mode 100644 src/common/dwarf/dwarf2reader_cfi_unittest.cc create mode 100644 src/common/dwarf/dwarf2reader_die_unittest.cc create mode 100644 src/common/dwarf/dwarf2reader_lineinfo_unittest.cc create mode 100644 src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc create mode 100644 src/common/dwarf/dwarf2reader_test_common.h create mode 100644 src/common/dwarf/elf_reader.cc create mode 100644 src/common/dwarf/elf_reader.h create mode 100644 src/common/dwarf/functioninfo.cc create mode 100644 src/common/dwarf/functioninfo.h create mode 100644 src/common/dwarf/line_state_machine.h create mode 100644 src/common/dwarf/types.h create mode 100644 src/common/dwarf_cfi_to_module.cc create mode 100644 src/common/dwarf_cfi_to_module.h create mode 100644 src/common/dwarf_cfi_to_module_unittest.cc create mode 100644 src/common/dwarf_cu_to_module.cc create mode 100644 src/common/dwarf_cu_to_module.h create mode 100644 src/common/dwarf_cu_to_module_unittest.cc create mode 100644 src/common/dwarf_line_to_module.cc create mode 100644 src/common/dwarf_line_to_module.h create mode 100644 src/common/dwarf_line_to_module_unittest.cc create mode 100644 src/common/dwarf_range_list_handler.cc create mode 100644 src/common/dwarf_range_list_handler.h create mode 100644 src/common/language.cc create mode 100644 src/common/language.h create mode 100644 src/common/linux/breakpad_getcontext.S create mode 100644 src/common/linux/breakpad_getcontext.h create mode 100644 src/common/linux/breakpad_getcontext_unittest.cc create mode 100644 src/common/linux/crc32.cc create mode 100644 src/common/linux/crc32.h create mode 100644 src/common/linux/dump_symbols.cc create mode 100644 src/common/linux/dump_symbols.h create mode 100644 src/common/linux/dump_symbols_unittest.cc create mode 100644 src/common/linux/eintr_wrapper.h create mode 100644 src/common/linux/elf_core_dump.cc create mode 100644 src/common/linux/elf_core_dump.h create mode 100644 src/common/linux/elf_core_dump_unittest.cc create mode 100644 src/common/linux/elf_gnu_compat.h create mode 100644 src/common/linux/elf_symbols_to_module.cc create mode 100644 src/common/linux/elf_symbols_to_module.h create mode 100644 src/common/linux/elf_symbols_to_module_unittest.cc create mode 100644 src/common/linux/elfutils-inl.h create mode 100644 src/common/linux/elfutils.cc create mode 100644 src/common/linux/elfutils.h create mode 100644 src/common/linux/file_id.cc create mode 100644 src/common/linux/file_id.h create mode 100644 src/common/linux/file_id_unittest.cc create mode 100644 src/common/linux/google_crashdump_uploader.cc create mode 100644 src/common/linux/google_crashdump_uploader.h create mode 100644 src/common/linux/google_crashdump_uploader_test.cc create mode 100644 src/common/linux/guid_creator.cc create mode 100644 src/common/linux/guid_creator.h create mode 100644 src/common/linux/http_upload.cc create mode 100644 src/common/linux/http_upload.h create mode 100644 src/common/linux/ignore_ret.h create mode 100644 src/common/linux/libcurl_wrapper.cc create mode 100644 src/common/linux/libcurl_wrapper.h create mode 100644 src/common/linux/linux_libc_support.cc create mode 100644 src/common/linux/linux_libc_support.h create mode 100644 src/common/linux/linux_libc_support_unittest.cc create mode 100644 src/common/linux/memory_mapped_file.cc create mode 100644 src/common/linux/memory_mapped_file.h create mode 100644 src/common/linux/memory_mapped_file_unittest.cc create mode 100644 src/common/linux/safe_readlink.cc create mode 100644 src/common/linux/safe_readlink.h create mode 100644 src/common/linux/safe_readlink_unittest.cc create mode 100644 src/common/linux/scoped_pipe.cc create mode 100644 src/common/linux/scoped_pipe.h create mode 100644 src/common/linux/scoped_pipe_unittest.cc create mode 100644 src/common/linux/scoped_tmpfile.cc create mode 100644 src/common/linux/scoped_tmpfile.h create mode 100644 src/common/linux/scoped_tmpfile_unittest.cc create mode 100644 src/common/linux/symbol_collector_client.cc create mode 100644 src/common/linux/symbol_collector_client.h create mode 100644 src/common/linux/symbol_upload.cc create mode 100644 src/common/linux/symbol_upload.h create mode 100644 src/common/linux/synth_elf.cc create mode 100644 src/common/linux/synth_elf.h create mode 100644 src/common/linux/synth_elf_unittest.cc create mode 100644 src/common/linux/tests/crash_generator.cc create mode 100644 src/common/linux/tests/crash_generator.h create mode 100644 src/common/linux/ucontext_constants.h create mode 100644 src/common/long_string_dictionary.cc create mode 100644 src/common/long_string_dictionary.h create mode 100644 src/common/long_string_dictionary_unittest.cc create mode 100644 src/common/mac/Breakpad.xcconfig create mode 100644 src/common/mac/BreakpadDebug.xcconfig create mode 100644 src/common/mac/BreakpadRelease.xcconfig create mode 100644 src/common/mac/GTMDefines.h create mode 100644 src/common/mac/GTMLogger.h create mode 100644 src/common/mac/GTMLogger.m create mode 100644 src/common/mac/HTTPGetRequest.h create mode 100644 src/common/mac/HTTPGetRequest.m create mode 100644 src/common/mac/HTTPMultipartUpload.h create mode 100644 src/common/mac/HTTPMultipartUpload.m create mode 100644 src/common/mac/HTTPPutRequest.h create mode 100644 src/common/mac/HTTPPutRequest.m create mode 100644 src/common/mac/HTTPRequest.h create mode 100644 src/common/mac/HTTPRequest.m create mode 100644 src/common/mac/HTTPSimplePostRequest.h create mode 100644 src/common/mac/HTTPSimplePostRequest.m create mode 100644 src/common/mac/MachIPC.h create mode 100644 src/common/mac/MachIPC.mm create mode 100644 src/common/mac/SymbolCollectorClient.h create mode 100644 src/common/mac/SymbolCollectorClient.m create mode 100644 src/common/mac/arch_utilities.cc create mode 100644 src/common/mac/arch_utilities.h create mode 100644 src/common/mac/bootstrap_compat.cc create mode 100644 src/common/mac/bootstrap_compat.h create mode 100644 src/common/mac/byteswap.h create mode 100644 src/common/mac/dump_syms.cc create mode 100644 src/common/mac/dump_syms.h create mode 100644 src/common/mac/encoding_util.h create mode 100644 src/common/mac/encoding_util.m create mode 100644 src/common/mac/file_id.cc create mode 100644 src/common/mac/file_id.h create mode 100644 src/common/mac/launch_reporter.cc create mode 100644 src/common/mac/launch_reporter.h create mode 100644 src/common/mac/macho_id.cc create mode 100644 src/common/mac/macho_id.h create mode 100644 src/common/mac/macho_reader.cc create mode 100644 src/common/mac/macho_reader.h create mode 100644 src/common/mac/macho_reader_unittest.cc create mode 100644 src/common/mac/macho_utilities.cc create mode 100644 src/common/mac/macho_utilities.h create mode 100644 src/common/mac/macho_walker.cc create mode 100644 src/common/mac/macho_walker.h create mode 100644 src/common/mac/minidump_upload.m create mode 100644 src/common/mac/scoped_task_suspend-inl.h create mode 100644 src/common/mac/string_utilities.cc create mode 100644 src/common/mac/string_utilities.h create mode 100644 src/common/mac/super_fat_arch.h create mode 100644 src/common/mac/testing/GTMSenTestCase.h create mode 100644 src/common/mac/testing/GTMSenTestCase.m create mode 100644 src/common/macros.h create mode 100644 src/common/md5.cc create mode 100644 src/common/md5.h create mode 100644 src/common/memory_allocator.h create mode 100644 src/common/memory_allocator_unittest.cc create mode 100644 src/common/memory_range.h create mode 100644 src/common/memory_range_unittest.cc create mode 100644 src/common/minidump_type_helper.h create mode 100644 src/common/module.cc create mode 100644 src/common/module.h create mode 100644 src/common/module_unittest.cc create mode 100644 src/common/path_helper.cc create mode 100644 src/common/path_helper.h create mode 100644 src/common/safe_math.h create mode 100644 src/common/safe_math_unittest.cc create mode 100644 src/common/scoped_ptr.h create mode 100644 src/common/simple_string_dictionary.cc create mode 100644 src/common/simple_string_dictionary.h create mode 100644 src/common/simple_string_dictionary_unittest.cc create mode 100644 src/common/solaris/dump_symbols.cc create mode 100644 src/common/solaris/dump_symbols.h create mode 100644 src/common/solaris/file_id.cc create mode 100644 src/common/solaris/file_id.h create mode 100644 src/common/solaris/guid_creator.cc create mode 100644 src/common/solaris/guid_creator.h create mode 100644 src/common/solaris/message_output.h create mode 100644 src/common/stabs_reader.cc create mode 100644 src/common/stabs_reader.h create mode 100644 src/common/stabs_reader_unittest.cc create mode 100644 src/common/stabs_to_module.cc create mode 100644 src/common/stabs_to_module.h create mode 100644 src/common/stabs_to_module_unittest.cc create mode 100644 src/common/stdio_wrapper.h create mode 100644 src/common/string_conversion.cc create mode 100644 src/common/string_conversion.h create mode 100644 src/common/string_conversion_unittest.cc create mode 100644 src/common/string_view.h create mode 100644 src/common/symbol_data.h create mode 100644 src/common/test_assembler.cc create mode 100644 src/common/test_assembler.h create mode 100644 src/common/test_assembler_unittest.cc create mode 100644 src/common/testdata/func-line-pairing.h create mode 100644 src/common/tests/auto_tempdir.h create mode 100644 src/common/tests/file_utils.cc create mode 100644 src/common/tests/file_utils.h create mode 100644 src/common/unordered.h create mode 100644 src/common/using_std_string.h create mode 100644 src/common/windows/dia_util.cc create mode 100644 src/common/windows/dia_util.h create mode 100644 src/common/windows/guid_string.cc create mode 100644 src/common/windows/guid_string.h create mode 100644 src/common/windows/http_upload.cc create mode 100644 src/common/windows/http_upload.h create mode 100644 src/common/windows/module_info.h create mode 100644 src/common/windows/omap.cc create mode 100644 src/common/windows/omap.h create mode 100644 src/common/windows/omap_internal.h create mode 100644 src/common/windows/omap_unittest.cc create mode 100644 src/common/windows/pdb_source_line_writer.cc create mode 100644 src/common/windows/pdb_source_line_writer.h create mode 100644 src/common/windows/pe_source_line_writer.cc create mode 100644 src/common/windows/pe_source_line_writer.h create mode 100644 src/common/windows/pe_util.cc create mode 100644 src/common/windows/pe_util.h create mode 100644 src/common/windows/string_utils-inl.h create mode 100644 src/common/windows/string_utils.cc create mode 100644 src/common/windows/sym_upload_v2_protocol.cc create mode 100644 src/common/windows/sym_upload_v2_protocol.h create mode 100644 src/common/windows/symbol_collector_client.cc create mode 100644 src/common/windows/symbol_collector_client.h create mode 100644 src/config.h.in create mode 100644 src/google_breakpad/common/breakpad_types.h create mode 100644 src/google_breakpad/common/minidump_cpu_amd64.h create mode 100644 src/google_breakpad/common/minidump_cpu_arm.h create mode 100644 src/google_breakpad/common/minidump_cpu_arm64.h create mode 100644 src/google_breakpad/common/minidump_cpu_mips.h create mode 100644 src/google_breakpad/common/minidump_cpu_ppc.h create mode 100644 src/google_breakpad/common/minidump_cpu_ppc64.h create mode 100644 src/google_breakpad/common/minidump_cpu_riscv.h create mode 100644 src/google_breakpad/common/minidump_cpu_sparc.h create mode 100644 src/google_breakpad/common/minidump_cpu_x86.h create mode 100644 src/google_breakpad/common/minidump_exception_fuchsia.h create mode 100644 src/google_breakpad/common/minidump_exception_linux.h create mode 100644 src/google_breakpad/common/minidump_exception_mac.h create mode 100644 src/google_breakpad/common/minidump_exception_ps3.h create mode 100644 src/google_breakpad/common/minidump_exception_solaris.h create mode 100644 src/google_breakpad/common/minidump_exception_win32.h create mode 100644 src/google_breakpad/common/minidump_format.h create mode 100644 src/google_breakpad/common/minidump_size.h create mode 100644 src/google_breakpad/processor/basic_source_line_resolver.h create mode 100644 src/google_breakpad/processor/call_stack.h create mode 100644 src/google_breakpad/processor/code_module.h create mode 100644 src/google_breakpad/processor/code_modules.h create mode 100644 src/google_breakpad/processor/dump_context.h create mode 100644 src/google_breakpad/processor/dump_object.h create mode 100644 src/google_breakpad/processor/exception_record.h create mode 100644 src/google_breakpad/processor/exploitability.h create mode 100644 src/google_breakpad/processor/fast_source_line_resolver.h create mode 100644 src/google_breakpad/processor/memory_region.h create mode 100644 src/google_breakpad/processor/microdump.h create mode 100644 src/google_breakpad/processor/microdump_processor.h create mode 100644 src/google_breakpad/processor/minidump.h create mode 100644 src/google_breakpad/processor/minidump_processor.h create mode 100644 src/google_breakpad/processor/proc_maps_linux.h create mode 100644 src/google_breakpad/processor/process_result.h create mode 100644 src/google_breakpad/processor/process_state.h create mode 100644 src/google_breakpad/processor/source_line_resolver_base.h create mode 100644 src/google_breakpad/processor/source_line_resolver_interface.h create mode 100644 src/google_breakpad/processor/stack_frame.h create mode 100644 src/google_breakpad/processor/stack_frame_cpu.h create mode 100644 src/google_breakpad/processor/stack_frame_symbolizer.h create mode 100644 src/google_breakpad/processor/stackwalker.h create mode 100644 src/google_breakpad/processor/symbol_supplier.h create mode 100644 src/google_breakpad/processor/system_info.h create mode 100644 src/processor/address_map-inl.h create mode 100644 src/processor/address_map.h create mode 100644 src/processor/address_map_unittest.cc create mode 100644 src/processor/basic_code_module.h create mode 100644 src/processor/basic_code_modules.cc create mode 100644 src/processor/basic_code_modules.h create mode 100644 src/processor/basic_source_line_resolver.cc create mode 100644 src/processor/basic_source_line_resolver_types.h create mode 100644 src/processor/basic_source_line_resolver_unittest.cc create mode 100644 src/processor/call_stack.cc create mode 100644 src/processor/cfi_frame_info-inl.h create mode 100644 src/processor/cfi_frame_info.cc create mode 100644 src/processor/cfi_frame_info.h create mode 100644 src/processor/cfi_frame_info_unittest.cc create mode 100644 src/processor/contained_range_map-inl.h create mode 100644 src/processor/contained_range_map.h create mode 100644 src/processor/contained_range_map_unittest.cc create mode 100644 src/processor/convert_old_arm64_context.cc create mode 100644 src/processor/convert_old_arm64_context.h create mode 100644 src/processor/disassembler_objdump.cc create mode 100644 src/processor/disassembler_objdump.h create mode 100644 src/processor/disassembler_objdump_unittest.cc create mode 100644 src/processor/disassembler_x86.cc create mode 100644 src/processor/disassembler_x86.h create mode 100644 src/processor/disassembler_x86_unittest.cc create mode 100644 src/processor/dump_context.cc create mode 100644 src/processor/dump_object.cc create mode 100644 src/processor/exploitability.cc create mode 100644 src/processor/exploitability_linux.cc create mode 100644 src/processor/exploitability_linux.h create mode 100644 src/processor/exploitability_unittest.cc create mode 100644 src/processor/exploitability_win.cc create mode 100644 src/processor/exploitability_win.h create mode 100644 src/processor/fast_source_line_resolver.cc create mode 100644 src/processor/fast_source_line_resolver_types.h create mode 100644 src/processor/fast_source_line_resolver_unittest.cc create mode 100644 src/processor/linked_ptr.h create mode 100644 src/processor/logging.cc create mode 100644 src/processor/logging.h create mode 100644 src/processor/map_serializers-inl.h create mode 100644 src/processor/map_serializers.h create mode 100644 src/processor/map_serializers_unittest.cc create mode 100644 src/processor/microdump.cc create mode 100644 src/processor/microdump_processor.cc create mode 100644 src/processor/microdump_processor_unittest.cc create mode 100644 src/processor/microdump_stackwalk.cc create mode 100644 src/processor/microdump_stackwalk_machine_readable_test create mode 100644 src/processor/microdump_stackwalk_test create mode 100644 src/processor/microdump_stackwalk_test_vars create mode 100644 src/processor/minidump.cc create mode 100644 src/processor/minidump_dump.cc create mode 100644 src/processor/minidump_dump_test create mode 100644 src/processor/minidump_processor.cc create mode 100644 src/processor/minidump_processor_unittest.cc create mode 100644 src/processor/minidump_stackwalk.cc create mode 100644 src/processor/minidump_stackwalk_machine_readable_test create mode 100644 src/processor/minidump_stackwalk_test create mode 100644 src/processor/minidump_unittest.cc create mode 100644 src/processor/module_comparer.cc create mode 100644 src/processor/module_comparer.h create mode 100644 src/processor/module_factory.h create mode 100644 src/processor/module_serializer.cc create mode 100644 src/processor/module_serializer.h create mode 100644 src/processor/pathname_stripper.cc create mode 100644 src/processor/pathname_stripper.h create mode 100644 src/processor/pathname_stripper_unittest.cc create mode 100644 src/processor/postfix_evaluator-inl.h create mode 100644 src/processor/postfix_evaluator.h create mode 100644 src/processor/postfix_evaluator_unittest.cc create mode 100644 src/processor/proc_maps_linux.cc create mode 100644 src/processor/proc_maps_linux_unittest.cc create mode 100644 src/processor/process_state.cc create mode 100644 src/processor/proto/README create mode 100644 src/processor/proto/process_state.proto create mode 100644 src/processor/range_map-inl.h create mode 100644 src/processor/range_map.h create mode 100644 src/processor/range_map_truncate_lower_unittest.cc create mode 100644 src/processor/range_map_truncate_upper_unittest.cc create mode 100644 src/processor/range_map_unittest.cc create mode 100644 src/processor/simple_serializer-inl.h create mode 100644 src/processor/simple_serializer.h create mode 100644 src/processor/simple_symbol_supplier.cc create mode 100644 src/processor/simple_symbol_supplier.h create mode 100644 src/processor/source_line_resolver_base.cc create mode 100644 src/processor/source_line_resolver_base_types.h create mode 100644 src/processor/stack_frame_cpu.cc create mode 100644 src/processor/stack_frame_symbolizer.cc create mode 100644 src/processor/stackwalk_common.cc create mode 100644 src/processor/stackwalk_common.h create mode 100644 src/processor/stackwalker.cc create mode 100644 src/processor/stackwalker_address_list.cc create mode 100644 src/processor/stackwalker_address_list.h create mode 100644 src/processor/stackwalker_address_list_unittest.cc create mode 100644 src/processor/stackwalker_amd64.cc create mode 100644 src/processor/stackwalker_amd64.h create mode 100644 src/processor/stackwalker_amd64_unittest.cc create mode 100644 src/processor/stackwalker_arm.cc create mode 100644 src/processor/stackwalker_arm.h create mode 100644 src/processor/stackwalker_arm64.cc create mode 100644 src/processor/stackwalker_arm64.h create mode 100644 src/processor/stackwalker_arm64_unittest.cc create mode 100644 src/processor/stackwalker_arm_unittest.cc create mode 100644 src/processor/stackwalker_mips.cc create mode 100644 src/processor/stackwalker_mips.h create mode 100644 src/processor/stackwalker_mips64_unittest.cc create mode 100644 src/processor/stackwalker_mips_unittest.cc create mode 100644 src/processor/stackwalker_ppc.cc create mode 100644 src/processor/stackwalker_ppc.h create mode 100644 src/processor/stackwalker_ppc64.cc create mode 100644 src/processor/stackwalker_ppc64.h create mode 100644 src/processor/stackwalker_riscv.cc create mode 100644 src/processor/stackwalker_riscv.h create mode 100644 src/processor/stackwalker_riscv64.cc create mode 100644 src/processor/stackwalker_riscv64.h create mode 100644 src/processor/stackwalker_riscv64_unittest.cc create mode 100644 src/processor/stackwalker_riscv_unittest.cc create mode 100644 src/processor/stackwalker_selftest.cc create mode 100644 src/processor/stackwalker_selftest_sol.s create mode 100644 src/processor/stackwalker_sparc.cc create mode 100644 src/processor/stackwalker_sparc.h create mode 100644 src/processor/stackwalker_unittest_utils.h create mode 100644 src/processor/stackwalker_x86.cc create mode 100644 src/processor/stackwalker_x86.h create mode 100644 src/processor/stackwalker_x86_unittest.cc create mode 100644 src/processor/static_address_map-inl.h create mode 100644 src/processor/static_address_map.h create mode 100644 src/processor/static_address_map_unittest.cc create mode 100644 src/processor/static_contained_range_map-inl.h create mode 100644 src/processor/static_contained_range_map.h create mode 100644 src/processor/static_contained_range_map_unittest.cc create mode 100644 src/processor/static_map-inl.h create mode 100644 src/processor/static_map.h create mode 100644 src/processor/static_map_iterator-inl.h create mode 100644 src/processor/static_map_iterator.h create mode 100644 src/processor/static_map_unittest.cc create mode 100644 src/processor/static_range_map-inl.h create mode 100644 src/processor/static_range_map.h create mode 100644 src/processor/static_range_map_unittest.cc create mode 100644 src/processor/symbolic_constants_win.cc create mode 100644 src/processor/symbolic_constants_win.h create mode 100644 src/processor/synth_minidump.cc create mode 100644 src/processor/synth_minidump.h create mode 100644 src/processor/synth_minidump_unittest.cc create mode 100644 src/processor/synth_minidump_unittest_data.h create mode 100644 src/processor/testdata/ascii_read_av.dmp create mode 100644 src/processor/testdata/ascii_read_av_block_write.dmp create mode 100644 src/processor/testdata/ascii_read_av_clobber_write.dmp create mode 100644 src/processor/testdata/ascii_read_av_conditional.dmp create mode 100644 src/processor/testdata/ascii_read_av_then_jmp.dmp create mode 100644 src/processor/testdata/ascii_read_av_xchg_write.dmp create mode 100644 src/processor/testdata/ascii_write_av.dmp create mode 100644 src/processor/testdata/ascii_write_av_arg_to_call.dmp create mode 100644 src/processor/testdata/exec_av_on_stack.dmp create mode 100644 src/processor/testdata/linux_divide_by_zero.dmp create mode 100644 src/processor/testdata/linux_executable_heap.dmp create mode 100644 src/processor/testdata/linux_executable_stack.dmp create mode 100644 src/processor/testdata/linux_inline.dmp create mode 100644 src/processor/testdata/linux_inside_module_exe_region1.dmp create mode 100644 src/processor/testdata/linux_inside_module_exe_region2.dmp create mode 100644 src/processor/testdata/linux_jmp_to_0.dmp create mode 100644 src/processor/testdata/linux_jmp_to_module_not_exe_region.dmp create mode 100644 src/processor/testdata/linux_null_dereference.dmp create mode 100644 src/processor/testdata/linux_null_read_av.dmp create mode 100644 src/processor/testdata/linux_outside_module.dmp create mode 100644 src/processor/testdata/linux_overflow.dmp create mode 100644 src/processor/testdata/linux_raise_sigabrt.dmp create mode 100644 src/processor/testdata/linux_stack_pointer_in_module.dmp create mode 100644 src/processor/testdata/linux_stack_pointer_in_stack.dmp create mode 100644 src/processor/testdata/linux_stack_pointer_in_stack_alt_name.dmp create mode 100644 src/processor/testdata/linux_stacksmash.dmp create mode 100644 src/processor/testdata/linux_test_app.cc create mode 100644 src/processor/testdata/linux_write_to_nonwritable_module.dmp create mode 100644 src/processor/testdata/linux_write_to_nonwritable_region_math.dmp create mode 100644 src/processor/testdata/linux_write_to_outside_module.dmp create mode 100644 src/processor/testdata/linux_write_to_outside_module_via_math.dmp create mode 100644 src/processor/testdata/linux_write_to_under_4k.dmp create mode 100644 src/processor/testdata/microdump-arm.dmp create mode 100644 src/processor/testdata/microdump-arm64.dmp create mode 100644 src/processor/testdata/microdump-mips32.dmp create mode 100644 src/processor/testdata/microdump-mips64.dmp create mode 100644 src/processor/testdata/microdump-multiple.dmp create mode 100644 src/processor/testdata/microdump-withcrashreason.dmp create mode 100644 src/processor/testdata/microdump-x86.dmp create mode 100644 src/processor/testdata/microdump.stackwalk-arm.out create mode 100644 src/processor/testdata/microdump.stackwalk-arm64.out create mode 100644 src/processor/testdata/microdump.stackwalk.machine_readable-arm.out create mode 100644 src/processor/testdata/microdump.stackwalk.machine_readable-arm64.out create mode 100644 src/processor/testdata/minidump2.dmp create mode 100644 src/processor/testdata/minidump2.dump.out create mode 100644 src/processor/testdata/minidump2.stackwalk.machine_readable.out create mode 100644 src/processor/testdata/minidump2.stackwalk.out create mode 100644 src/processor/testdata/minidump_32bit_crash_addr.dmp create mode 100644 src/processor/testdata/minidump_crashpad_annotation.dmp create mode 100644 src/processor/testdata/module0.out create mode 100644 src/processor/testdata/module1.out create mode 100644 src/processor/testdata/module2.out create mode 100644 src/processor/testdata/module3_bad.out create mode 100644 src/processor/testdata/module4_bad.out create mode 100644 src/processor/testdata/null_read_av.dmp create mode 100644 src/processor/testdata/null_write_av.dmp create mode 100644 src/processor/testdata/read_av_clobber_write.dmp create mode 100644 src/processor/testdata/read_av_conditional.dmp create mode 100644 src/processor/testdata/read_av_non_null.dmp create mode 100644 src/processor/testdata/stack_exhaustion.dmp create mode 100644 src/processor/testdata/symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym create mode 100644 src/processor/testdata/symbols/ld-2.13.so/C32AD7E235EA6112E02A5B9D6219C4850/ld-2.13.so.sym create mode 100644 src/processor/testdata/symbols/libc-2.13.so/F4F8DFCD5A5FB5A7CE64717E9E6AE3890/libc-2.13.so.sym create mode 100644 src/processor/testdata/symbols/libgcc_s.so.1/18B180F90887D8F8B5C35D185444AF4C0/libgcc_s.so.1.sym create mode 100644 src/processor/testdata/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/linux_inline.new.sym create mode 100644 src/processor/testdata/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/linux_inline.old.sym create mode 100644 src/processor/testdata/symbols/microdump/breakpad_unittests/D6D1FEC9A15DE7F38A236898871A2E770/breakpad_unittests.sym create mode 100644 src/processor/testdata/symbols/microdump/breakpad_unittests/DA7778FB66018A4E9B4110ED06E730D00/breakpad_unittests.sym create mode 100644 src/processor/testdata/symbols/microdump/crash_example/6E72E2F1A5F59AB3D51356FDFE394D490/crash_example.sym create mode 100644 src/processor/testdata/symbols/microdump/crash_example/8F36148CC4647A8116CAF2A25F591F570/crash_example.sym create mode 100644 src/processor/testdata/symbols/null_read_av/7B7D1968FF0D47AE4366E9C3A7E1B6750/null_read_av.sym create mode 100644 src/processor/testdata/symbols/overflow/B0E1FC01EF48E39CAF5C881D2DF0C3840/overflow.sym create mode 100644 src/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym create mode 100644 src/processor/testdata/test_app.cc create mode 100644 src/processor/testdata/thread_name_list.dmp create mode 100644 src/processor/testdata/tiny-exe-fastfail.dmp create mode 100644 src/processor/testdata/tiny-exe-with-cet-xsave.dmp create mode 100644 src/processor/testdata/write_av_non_canonical.dmp create mode 100644 src/processor/testdata/write_av_non_null.dmp create mode 100644 src/processor/tokenize.cc create mode 100644 src/processor/tokenize.h create mode 100644 src/processor/windows_frame_info.h create mode 100644 src/third_party/curl/COPYING create mode 100644 src/third_party/curl/curl.h create mode 100644 src/third_party/curl/curlbuild.h create mode 100644 src/third_party/curl/curlrules.h create mode 100644 src/third_party/curl/curlver.h create mode 100644 src/third_party/curl/easy.h create mode 100644 src/third_party/curl/mprintf.h create mode 100644 src/third_party/curl/multi.h create mode 100644 src/third_party/curl/stdcheaders.h create mode 100644 src/third_party/curl/typecheck-gcc.h create mode 100644 src/third_party/curl/types.h create mode 100644 src/third_party/libdisasm/LICENSE create mode 100644 src/third_party/libdisasm/Makefile.am create mode 100644 src/third_party/libdisasm/README.breakpad create mode 100644 src/third_party/libdisasm/TODO create mode 100644 src/third_party/libdisasm/ia32_implicit.c create mode 100644 src/third_party/libdisasm/ia32_implicit.h create mode 100644 src/third_party/libdisasm/ia32_insn.c create mode 100644 src/third_party/libdisasm/ia32_insn.h create mode 100644 src/third_party/libdisasm/ia32_invariant.c create mode 100644 src/third_party/libdisasm/ia32_invariant.h create mode 100644 src/third_party/libdisasm/ia32_modrm.c create mode 100644 src/third_party/libdisasm/ia32_modrm.h create mode 100644 src/third_party/libdisasm/ia32_opcode_tables.c create mode 100644 src/third_party/libdisasm/ia32_opcode_tables.h create mode 100644 src/third_party/libdisasm/ia32_operand.c create mode 100644 src/third_party/libdisasm/ia32_operand.h create mode 100644 src/third_party/libdisasm/ia32_reg.c create mode 100644 src/third_party/libdisasm/ia32_reg.h create mode 100644 src/third_party/libdisasm/ia32_settings.c create mode 100644 src/third_party/libdisasm/ia32_settings.h create mode 100644 src/third_party/libdisasm/libdis.h create mode 100644 src/third_party/libdisasm/qword.h create mode 100644 src/third_party/libdisasm/swig/Makefile create mode 100644 src/third_party/libdisasm/swig/README create mode 100644 src/third_party/libdisasm/swig/libdisasm.i create mode 100644 src/third_party/libdisasm/swig/libdisasm_oop.i create mode 100644 src/third_party/libdisasm/swig/perl/Makefile-swig create mode 100644 src/third_party/libdisasm/swig/perl/Makefile.PL create mode 100644 src/third_party/libdisasm/swig/python/Makefile-swig create mode 100644 src/third_party/libdisasm/swig/ruby/Makefile-swig create mode 100644 src/third_party/libdisasm/swig/ruby/extconf.rb create mode 100644 src/third_party/libdisasm/swig/tcl/Makefile-swig create mode 100644 src/third_party/libdisasm/x86_disasm.c create mode 100644 src/third_party/libdisasm/x86_format.c create mode 100644 src/third_party/libdisasm/x86_imm.c create mode 100644 src/third_party/libdisasm/x86_imm.h create mode 100644 src/third_party/libdisasm/x86_insn.c create mode 100644 src/third_party/libdisasm/x86_misc.c create mode 100644 src/third_party/libdisasm/x86_operand_list.c create mode 100644 src/third_party/libdisasm/x86_operand_list.h create mode 100644 src/third_party/linux/include/gflags/gflags_completions.h create mode 100644 src/third_party/lss/.gitignore create mode 100644 src/third_party/lss/DIR_METADATA create mode 100644 src/third_party/lss/LICENSE create mode 100644 src/third_party/lss/OWNERS create mode 100644 src/third_party/lss/README.md create mode 100644 src/third_party/lss/codereview.settings create mode 100644 src/third_party/lss/linux_syscall_support.h create mode 100644 src/third_party/lss/tests/.gitignore create mode 100644 src/third_party/lss/tests/Makefile create mode 100644 src/third_party/lss/tests/README.md create mode 100644 src/third_party/lss/tests/fallocate.c create mode 100644 src/third_party/lss/tests/getitimer.c create mode 100644 src/third_party/lss/tests/getrandom.c create mode 100644 src/third_party/lss/tests/lstat.c create mode 100644 src/third_party/lss/tests/setitimer.c create mode 100644 src/third_party/lss/tests/sigaction.c create mode 100644 src/third_party/lss/tests/sigtimedwait.c create mode 100644 src/third_party/lss/tests/stat.c create mode 100644 src/third_party/lss/tests/test_skel.h create mode 100644 src/third_party/lss/tests/unlink.c create mode 100644 src/third_party/mac_headers/README create mode 100644 src/third_party/mac_headers/architecture/byte_order.h create mode 100644 src/third_party/mac_headers/arm/_types.h create mode 100644 src/third_party/mac_headers/i386/_types.h create mode 100644 src/third_party/mac_headers/mach-o/arch.h create mode 100644 src/third_party/mac_headers/mach-o/fat.h create mode 100644 src/third_party/mac_headers/mach-o/loader.h create mode 100644 src/third_party/mac_headers/mach-o/nlist.h create mode 100644 src/third_party/mac_headers/mach/arm/boolean.h create mode 100644 src/third_party/mac_headers/mach/arm/vm_types.h create mode 100644 src/third_party/mac_headers/mach/boolean.h create mode 100644 src/third_party/mac_headers/mach/i386/boolean.h create mode 100644 src/third_party/mac_headers/mach/i386/vm_types.h create mode 100644 src/third_party/mac_headers/mach/machine.h create mode 100644 src/third_party/mac_headers/mach/machine/boolean.h create mode 100644 src/third_party/mac_headers/mach/machine/thread_state.h create mode 100644 src/third_party/mac_headers/mach/machine/thread_status.h create mode 100644 src/third_party/mac_headers/mach/machine/vm_types.h create mode 100644 src/third_party/mac_headers/mach/thread_status.h create mode 100644 src/third_party/mac_headers/mach/vm_prot.h create mode 100644 src/third_party/musl/COPYRIGHT create mode 100644 src/third_party/musl/README create mode 100644 src/third_party/musl/README.breakpad create mode 100644 src/third_party/musl/VERSION create mode 100644 src/third_party/musl/include/elf.h create mode 100644 src/tools/linux/core2md/core2md.cc create mode 100644 src/tools/linux/core_handler/core_handler.cc create mode 100644 src/tools/linux/dump_syms/dump_syms.cc create mode 100644 src/tools/linux/md2core/minidump-2-core.cc create mode 100644 src/tools/linux/md2core/minidump_memory_range.h create mode 100644 src/tools/linux/md2core/minidump_memory_range_unittest.cc create mode 100644 src/tools/linux/pid2md/pid2md.cc create mode 100644 src/tools/linux/symupload/minidump_upload.cc create mode 100644 src/tools/linux/symupload/sym_upload.cc create mode 100644 src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj create mode 100644 src/tools/mac/dump_syms/dump_syms_tool.cc create mode 100644 src/tools/mac/symupload/symupload.mm create mode 100644 src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj create mode 100644 src/tools/mac/upload_system_symbols/arch_constants.h create mode 100644 src/tools/mac/upload_system_symbols/arch_reader.go create mode 100644 src/tools/mac/upload_system_symbols/go.mod create mode 100644 src/tools/mac/upload_system_symbols/upload_system_symbols.go create mode 100644 src/tools/mac/upload_system_symbols/upload_system_symbols.sh create mode 100644 src/tools/python/deps-to-manifest.py create mode 100644 src/tools/python/filter_syms.py create mode 100644 src/tools/python/tests/filter_syms_unittest.py create mode 100644 src/tools/solaris/dump_syms/Makefile create mode 100644 src/tools/solaris/dump_syms/dump_syms.cc create mode 100644 src/tools/solaris/dump_syms/run_regtest.sh create mode 100644 src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc create mode 100644 src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs create mode 100644 src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym create mode 100644 src/tools/windows/binaries/dump_syms.exe create mode 100644 src/tools/windows/binaries/symupload.exe create mode 100644 src/tools/windows/converter/ms_symbol_server_converter.cc create mode 100644 src/tools/windows/converter/ms_symbol_server_converter.h create mode 100644 src/tools/windows/converter_exe/configure.cmd create mode 100644 src/tools/windows/converter_exe/converter.cc create mode 100644 src/tools/windows/converter_exe/escaping.cc create mode 100644 src/tools/windows/converter_exe/escaping.h create mode 100644 src/tools/windows/converter_exe/http_client.h create mode 100644 src/tools/windows/converter_exe/http_download.cc create mode 100644 src/tools/windows/converter_exe/http_download.h create mode 100644 src/tools/windows/converter_exe/missing_symbols_test.txt create mode 100644 src/tools/windows/converter_exe/symsrv.yes create mode 100644 src/tools/windows/converter_exe/tokenizer.cc create mode 100644 src/tools/windows/converter_exe/tokenizer.h create mode 100644 src/tools/windows/converter_exe/winhttp_client.cc create mode 100644 src/tools/windows/converter_exe/winhttp_client.h create mode 100644 src/tools/windows/converter_exe/wininet_client.cc create mode 100644 src/tools/windows/converter_exe/wininet_client.h create mode 100644 src/tools/windows/converter_exe/winsymconv.cmd create mode 100644 src/tools/windows/converter_exe/winsymconv_test.cmd create mode 100644 src/tools/windows/dump_syms/dump_syms.cc create mode 100644 src/tools/windows/dump_syms/dump_syms_unittest.cc create mode 100644 src/tools/windows/dump_syms/run_regtest.sh create mode 100644 src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc create mode 100644 src/tools/windows/dump_syms/testdata/dump_syms_regtest.pdb create mode 100644 src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym create mode 100644 src/tools/windows/dump_syms/testdata/dump_syms_regtest64.exe create mode 100644 src/tools/windows/dump_syms/testdata/dump_syms_regtest64.pdb create mode 100644 src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym create mode 100644 src/tools/windows/dump_syms/testdata/omap_reorder_bbs.pdb create mode 100644 src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym create mode 100644 src/tools/windows/dump_syms/testdata/omap_reorder_funcs.pdb create mode 100644 src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym create mode 100644 src/tools/windows/dump_syms/testdata/omap_stretched.pdb create mode 100644 src/tools/windows/dump_syms/testdata/omap_stretched.sym create mode 100644 src/tools/windows/dump_syms/testdata/omap_stretched_filled.pdb create mode 100644 src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym create mode 100644 src/tools/windows/dump_syms/testdata/pe_only_symbol_test.dll create mode 100644 src/tools/windows/dump_syms/testdata/pe_only_symbol_test.sym create mode 100644 src/tools/windows/refresh_binaries.bat create mode 100644 src/tools/windows/symupload/symupload.cc diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..d175ab7 --- /dev/null +++ b/.clang-format @@ -0,0 +1,9 @@ +# Defines the Chromium style for automatic reformatting. +# https://clang.llvm.org/docs/ClangFormatStyleOptions.html +BasedOnStyle: Chromium + +# This defaults to 'Auto'. Explicitly set it for a while, so that +# 'vector >' in existing files gets formatted to +# 'vector>'. ('Auto' means that clang-format will only use +# 'int>>' if the file already contains at least one such instance.) +Standard: Cpp11 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bccf058 --- /dev/null +++ b/.gitignore @@ -0,0 +1,90 @@ +# Copyright 2014 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Ignore other VCSs. +.repo/ +.svn/ + +# Ignore common compiled artifacts. +*~ +*.dwo +*.o +lib*.a +/breakpad.pc +/breakpad-client.pc +/src/client/linux/linux_client_unittest_shlib +/src/client/linux/linux_dumper_unittest_helper +/src/common/linux/google_crashdump_uploader_test +/src/processor/microdump_stackwalk +/src/processor/minidump_dump +/src/processor/minidump_stackwalk +/src/tools/linux/core2md/core2md +/src/tools/linux/core_handler/core_handler +/src/tools/linux/dump_syms/dump_syms +/src/tools/linux/md2core/minidump-2-core +/src/tools/linux/pid2md/pid2md +/src/tools/linux/symupload/minidump_upload +/src/tools/linux/symupload/sym_upload +/src/tools/mac/dump_syms/dump_syms +/src/tools/mac/dump_syms/dump_syms_mac + +# Ignore unit test artifacts. +*_unittest +*.log +*.trs + +# Ignore autotools generated artifacts. +.deps +.dirstamp +autom4te.cache/ +/config.cache +config.h +/config.log +/config.status +/Makefile +stamp-h1 + +# Ignore generated Visual Studio artifacts. +*.filters +*.sdf +*.sln +*.suo +*.vcproj +*.vcxproj + +# Ignore generated Makefiles +src/Makefile +*.Makefile +*.target.mk + +# Ignore compiled Python files. +*.pyc + +# Ignore directories gclient syncs. +src/testing +src/third_party/protobuf diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..4858b37 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +opensource@google.com diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/DEPS b/DEPS new file mode 100644 index 0000000..3fcd524 --- /dev/null +++ b/DEPS @@ -0,0 +1,58 @@ +# Copyright 2010 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This is used to mimic the svn:externals mechanism for gclient (both Git and +# SVN) based checkouts of Breakpad. As such, its use is entirely optional. If +# using a manually managed SVN checkout as opposed to a gclient managed checkout +# you can still use the hooks mechanism for generating project files by calling +# 'gclient runhooks' rather than 'gclient sync'. + +deps = { + # Testing libraries and utilities. + "src/src/testing": + "https://github.com/google/googletest.git" + + "@release-1.11.0", + + # Protobuf. + "src/src/third_party/protobuf/protobuf": + "https://github.com/google/protobuf.git" + + "@cb6dd4ef5f82e41e06179dcd57d3b1d9246ad6ac", + + # Linux syscall support. + "src/src/third_party/lss": + "https://chromium.googlesource.com/linux-syscall-support/" + + "@9719c1e1e676814c456b55f5f070eabad6709d31", +} + +hooks = [ + { + # Keep the manifest up to date. + "action": ["src/src/tools/python/deps-to-manifest.py", + "src/DEPS", "src/default.xml"], + }, +] diff --git a/DIR_METADATA b/DIR_METADATA new file mode 100644 index 0000000..bc37756 --- /dev/null +++ b/DIR_METADATA @@ -0,0 +1,13 @@ +# Metadata information for this directory. +# +# For more information on DIR_METADATA files, see: +# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/README.md +# +# For the schema of this file, see Metadata message: +# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/proto/dir_metadata.proto + +monorail { + project: "google-breakpad" +} + +team_email: "google-breakpad-dev@googlegroups.com" diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..007e939 --- /dev/null +++ b/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..06f34ce --- /dev/null +++ b/Makefile.am @@ -0,0 +1,1794 @@ +## Process this file with automake to produce Makefile.in + +# Copyright 2011 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +# This allows #includes to be relative to src/ +AM_CPPFLAGS = -I$(top_srcdir)/src +AM_CFLAGS = +AM_CXXFLAGS = + +if ANDROID_HOST +# This allows using fixed NDK headers when building for Android. +AM_CXXFLAGS += -I$(top_srcdir)/src/common/android/include +# This is only necessary for building the unit tests until GTest is upgraded +# to a future version. +AM_CXXFLAGS += -I$(top_srcdir)/src/common/android/testing/include +endif + +AM_CXXFLAGS += $(WARN_CXXFLAGS) + +if LINUX_HOST +# Build as PIC on Linux, for linux_client_unittest_shlib +AM_CFLAGS += -fPIC +AM_CXXFLAGS += -fPIC +endif + +# Specify include paths for ac macros +ACLOCAL_AMFLAGS = -I m4 + +# License file is called LICENSE not COPYING +AUTOMAKE_OPTIONS = foreign + +## Documentation +docdir = $(prefix)/share/doc/$(PACKAGE)-$(VERSION) + +dist_doc_DATA = \ + AUTHORS \ + ChangeLog \ + INSTALL \ + LICENSE \ + NEWS \ + README.md + +## Headers +if LINUX_HOST +includeclhdir = $(includedir)/$(PACKAGE)/client/linux/handler +includeclh_HEADERS = $(top_srcdir)/src/client/linux/handler/*.h + +includecldwcdir = $(includedir)/$(PACKAGE)/client/linux/dump_writer_common +includecldwc_HEADERS = $(top_srcdir)/src/client/linux/dump_writer_common/*.h + +includeclmdir = $(includedir)/$(PACKAGE)/client/linux/minidump_writer +includeclm_HEADERS = $(top_srcdir)/src/client/linux/minidump_writer/*.h + +includeclcdir = $(includedir)/$(PACKAGE)/client/linux/crash_generation +includeclc_HEADERS = $(top_srcdir)/src/client/linux/crash_generation/*.h + +includelssdir = $(includedir)/$(PACKAGE)/third_party/lss +includelss_HEADERS = $(top_srcdir)/src/third_party/lss/*.h + +includecldir = $(includedir)/$(PACKAGE)/common/linux +includecl_HEADERS = $(top_srcdir)/src/common/linux/*.h +endif + +includegbcdir = $(includedir)/$(PACKAGE)/google_breakpad/common +includegbc_HEADERS = $(top_srcdir)/src/google_breakpad/common/*.h + +includecdir = $(includedir)/$(PACKAGE)/common +includec_HEADERS = $(top_srcdir)/src/common/*.h + +includepdir = $(includedir)/$(PACKAGE)/processor +includep_HEADERS = $(top_srcdir)/src/processor/*.h + +## pkgconfig files +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = + +## Common test logic +if SYSTEM_TEST_LIBS +TEST_CFLAGS = $(GTEST_CFLAGS) $(GMOCK_CFLAGS) +TEST_LIBS = $(GTEST_LIBS) -lgtest_main $(GMOCK_LIBS) +TEST_DEPS = +else +TEST_CFLAGS = \ + -I$(top_srcdir)/src/testing/include \ + -I$(top_srcdir)/src/testing/googletest/include \ + -I$(top_srcdir)/src/testing/googletest \ + -I$(top_srcdir)/src/testing/googlemock/include \ + -I$(top_srcdir)/src/testing/googlemock \ + -I$(top_srcdir)/src/testing +TEST_LIBS = src/testing/libtesting.a +TEST_DEPS = $(TEST_LIBS) +endif + + +## Setup test driver +if ANDROID_HOST +# Since Autotools 1.2, tests are run through a special "test driver" script. +# Unfortunately, it's not possible anymore to specify an alternative shell to +# run them on connected devices, so use a slightly modified version of the +# driver for Android. +LOG_DRIVER = $(top_srcdir)/android/test-driver +else +if TESTS_AS_ROOT +LOG_DRIVER = $(top_srcdir)/autotools/root-test-driver $(top_srcdir)/autotools/test-driver +else +LOG_DRIVER = $(top_srcdir)/autotools/test-driver +endif !TESTS_AS_ROOT +endif !ANDROID_HOST + +## Libraries +check_LIBRARIES = +noinst_LIBRARIES = +lib_LIBRARIES = +libexec_PROGRAMS = +bin_PROGRAMS = +check_PROGRAMS = +noinst_PROGRAMS = +noinst_SCRIPTS = +EXTRA_PROGRAMS = +CLEANFILES = + +# +# Tests helper library +# +if !SYSTEM_TEST_LIBS +check_LIBRARIES += src/testing/libtesting.a +src_testing_libtesting_a_SOURCES = \ + src/breakpad_googletest_includes.h \ + src/testing/googletest/src/gtest-all.cc \ + src/testing/googletest/src/gtest_main.cc \ + src/testing/googlemock/src/gmock-all.cc +src_testing_libtesting_a_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +endif + +# +# General +# Not specific to processor, client or tools +# + +check_PROGRAMS += src/common/safe_math_unittest + + +# +# Breakpad minidump and microdump +# processor library, tools and tests +# +if !DISABLE_PROCESSOR + +lib_LIBRARIES += src/libbreakpad.a +pkgconfig_DATA += breakpad.pc +noinst_LIBRARIES += src/third_party/libdisasm/libdisasm.a + +## Programs +bin_PROGRAMS += \ + src/processor/microdump_stackwalk \ + src/processor/minidump_dump \ + src/processor/minidump_stackwalk + +## Tests (binaries) +check_PROGRAMS += \ + src/common/test_assembler_unittest \ + src/common/dwarf/dwarf2reader_lineinfo_unittest \ + src/common/dwarf/dwarf2reader_splitfunctions_unittest \ + src/processor/address_map_unittest \ + src/processor/basic_source_line_resolver_unittest \ + src/processor/cfi_frame_info_unittest \ + src/processor/contained_range_map_unittest \ + src/processor/disassembler_x86_unittest \ + src/processor/exploitability_unittest \ + src/processor/fast_source_line_resolver_unittest \ + src/processor/map_serializers_unittest \ + src/processor/microdump_processor_unittest \ + src/processor/minidump_processor_unittest \ + src/processor/minidump_unittest \ + src/processor/static_address_map_unittest \ + src/processor/static_contained_range_map_unittest \ + src/processor/static_map_unittest \ + src/processor/static_range_map_unittest \ + src/processor/pathname_stripper_unittest \ + src/processor/postfix_evaluator_unittest \ + src/processor/proc_maps_linux_unittest \ + src/processor/range_map_truncate_lower_unittest \ + src/processor/range_map_truncate_upper_unittest \ + src/processor/range_map_unittest \ + src/processor/stackwalker_amd64_unittest \ + src/processor/stackwalker_arm_unittest \ + src/processor/stackwalker_arm64_unittest \ + src/processor/stackwalker_address_list_unittest \ + src/processor/stackwalker_mips_unittest \ + src/processor/stackwalker_mips64_unittest \ + src/processor/stackwalker_riscv_unittest \ + src/processor/stackwalker_riscv64_unittest \ + src/processor/stackwalker_x86_unittest \ + src/processor/synth_minidump_unittest +if LINUX_HOST +check_PROGRAMS += \ + src/processor/disassembler_objdump_unittest \ + src/common/linux/scoped_pipe_unittest \ + src/common/linux/scoped_tmpfile_unittest +endif LINUX_HOST +if SELFTEST +check_PROGRAMS += \ + src/processor/stackwalker_selftest +endif SELFTEST + +## Tests (scripts) +check_SCRIPTS = \ + src/processor/microdump_stackwalk_test \ + src/processor/microdump_stackwalk_machine_readable_test \ + src/processor/minidump_dump_test \ + src/processor/minidump_stackwalk_test \ + src/processor/minidump_stackwalk_machine_readable_test + +endif !DISABLE_PROCESSOR + + +# +# Breakpad client library and tests +# +# Currently Linux only, the macOS client +# is built using an Xcode project instead. +# +if LINUX_HOST + +lib_LIBRARIES += src/client/linux/libbreakpad_client.a +pkgconfig_DATA += breakpad-client.pc + +check_PROGRAMS += \ + src/client/linux/linux_client_unittest \ + src/common/linux/google_crashdump_uploader_test + +EXTRA_PROGRAMS += \ + src/client/linux/linux_dumper_unittest_helper \ + src/client/linux/linux_client_unittest_shlib + +CLEANFILES += \ + src/client/linux/linux_dumper_unittest_helper \ + src/client/linux/linux_client_unittest_shlib + +endif LINUX_HOST + + +# +# Various Breakpad tools +# This includes symbol dumpers and uploaders +# +if !DISABLE_TOOLS + +if LINUX_HOST + +bin_PROGRAMS += \ + src/tools/linux/core2md/core2md \ + src/tools/linux/pid2md/pid2md \ + src/tools/linux/dump_syms/dump_syms \ + src/tools/linux/md2core/minidump-2-core \ + src/tools/linux/symupload/minidump_upload \ + src/tools/linux/symupload/sym_upload +if X86_HOST +bin_PROGRAMS += \ + src/tools/mac/dump_syms/dump_syms_mac +endif +if HAVE_MEMFD_CREATE +libexec_PROGRAMS += \ + src/tools/linux/core_handler/core_handler +endif + +check_PROGRAMS += \ + src/common/dumper_unittest \ + src/tools/linux/md2core/minidump_2_core_unittest +if X86_HOST +check_PROGRAMS += \ + src/common/mac/macho_reader_unittest +endif + +endif LINUX_HOST + +endif !DISABLE_TOOLS + +TESTS = $(check_PROGRAMS) $(check_SCRIPTS) + +## Non-installables +noinst_SCRIPTS += $(check_SCRIPTS) + + +## Target definitions + +# All targets that were defined above should now be +# declared below. This should be done unconditionally +# so DO NOT wrap them in conditions! +# Execept for conditionally adding a specific file or +# flag that should only be added for a specific arch, +# system, etc. + +src_common_safe_math_unittest_SOURCES = \ + src/common/safe_math.h \ + src/common/safe_math_unittest.cc +src_common_safe_math_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_common_safe_math_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +# Breakpad processor library +src_libbreakpad_a_SOURCES = \ + src/google_breakpad/common/breakpad_types.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_size.h \ + src/google_breakpad/processor/basic_source_line_resolver.h \ + src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/dump_context.h \ + src/google_breakpad/processor/dump_object.h \ + src/google_breakpad/processor/exploitability.h \ + src/google_breakpad/processor/fast_source_line_resolver.h \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/processor/microdump.h \ + src/google_breakpad/processor/microdump_processor.h \ + src/google_breakpad/processor/minidump.h \ + src/google_breakpad/processor/minidump_processor.h \ + src/google_breakpad/processor/process_result.h \ + src/google_breakpad/processor/process_state.h \ + src/google_breakpad/processor/proc_maps_linux.h \ + src/google_breakpad/processor/source_line_resolver_base.h \ + src/google_breakpad/processor/source_line_resolver_interface.h \ + src/google_breakpad/processor/stack_frame.h \ + src/google_breakpad/processor/stack_frame_cpu.h \ + src/google_breakpad/processor/stack_frame_symbolizer.h \ + src/google_breakpad/processor/stackwalker.h \ + src/google_breakpad/processor/symbol_supplier.h \ + src/google_breakpad/processor/system_info.h \ + src/processor/address_map-inl.h \ + src/processor/address_map.h \ + src/processor/basic_code_module.h \ + src/processor/basic_code_modules.cc \ + src/processor/basic_code_modules.h \ + src/processor/basic_source_line_resolver_types.h \ + src/processor/basic_source_line_resolver.cc \ + src/processor/call_stack.cc \ + src/processor/cfi_frame_info.cc \ + src/processor/cfi_frame_info.h \ + src/processor/contained_range_map-inl.h \ + src/processor/contained_range_map.h \ + src/processor/convert_old_arm64_context.cc \ + src/processor/convert_old_arm64_context.h \ + src/processor/disassembler_x86.h \ + src/processor/disassembler_x86.cc \ + src/processor/dump_context.cc \ + src/processor/dump_object.cc \ + src/processor/exploitability.cc \ + src/processor/exploitability_linux.h \ + src/processor/exploitability_linux.cc \ + src/processor/exploitability_win.h \ + src/processor/exploitability_win.cc \ + src/processor/fast_source_line_resolver_types.h \ + src/processor/fast_source_line_resolver.cc \ + src/processor/linked_ptr.h \ + src/processor/logging.h \ + src/processor/logging.cc \ + src/processor/map_serializers-inl.h \ + src/processor/map_serializers.h \ + src/processor/microdump.cc \ + src/processor/microdump_processor.cc \ + src/processor/minidump.cc \ + src/processor/minidump_processor.cc \ + src/processor/module_comparer.cc \ + src/processor/module_comparer.h \ + src/processor/module_factory.h \ + src/processor/module_serializer.cc \ + src/processor/module_serializer.h \ + src/processor/pathname_stripper.cc \ + src/processor/pathname_stripper.h \ + src/processor/postfix_evaluator-inl.h \ + src/processor/postfix_evaluator.h \ + src/processor/process_state.cc \ + src/processor/proc_maps_linux.cc \ + src/processor/range_map-inl.h \ + src/processor/range_map.h \ + src/processor/simple_serializer-inl.h \ + src/processor/simple_serializer.h \ + src/processor/simple_symbol_supplier.cc \ + src/processor/simple_symbol_supplier.h \ + src/processor/windows_frame_info.h \ + src/processor/source_line_resolver_base_types.h \ + src/processor/source_line_resolver_base.cc \ + src/processor/stack_frame_cpu.cc \ + src/processor/stack_frame_symbolizer.cc \ + src/processor/stackwalk_common.cc \ + src/processor/stackwalk_common.h \ + src/processor/stackwalker.cc \ + src/processor/stackwalker_amd64.cc \ + src/processor/stackwalker_amd64.h \ + src/processor/stackwalker_arm.cc \ + src/processor/stackwalker_arm.h \ + src/processor/stackwalker_arm64.cc \ + src/processor/stackwalker_arm64.h \ + src/processor/stackwalker_address_list.cc \ + src/processor/stackwalker_address_list.h \ + src/processor/stackwalker_mips.cc \ + src/processor/stackwalker_mips.h \ + src/processor/stackwalker_ppc.cc \ + src/processor/stackwalker_ppc.h \ + src/processor/stackwalker_ppc64.cc \ + src/processor/stackwalker_ppc64.h \ + src/processor/stackwalker_riscv.cc \ + src/processor/stackwalker_riscv.h \ + src/processor/stackwalker_riscv64.cc \ + src/processor/stackwalker_riscv64.h \ + src/processor/stackwalker_sparc.cc \ + src/processor/stackwalker_sparc.h \ + src/processor/stackwalker_x86.cc \ + src/processor/stackwalker_x86.h \ + src/processor/static_address_map-inl.h \ + src/processor/static_address_map.h \ + src/processor/static_contained_range_map-inl.h \ + src/processor/static_contained_range_map.h \ + src/processor/static_map_iterator-inl.h \ + src/processor/static_map_iterator.h \ + src/processor/static_map-inl.h \ + src/processor/static_map.h \ + src/processor/static_range_map-inl.h \ + src/processor/static_range_map.h \ + src/processor/symbolic_constants_win.cc \ + src/processor/symbolic_constants_win.h \ + src/processor/tokenize.cc \ + src/processor/tokenize.h +if LINUX_HOST +src_libbreakpad_a_SOURCES += \ + src/common/linux/scoped_pipe.h \ + src/common/linux/scoped_pipe.cc \ + src/common/linux/scoped_tmpfile.h \ + src/common/linux/scoped_tmpfile.cc \ + src/processor/disassembler_objdump.h \ + src/processor/disassembler_objdump.cc +endif + +# libdisasm 3rd party library +src_third_party_libdisasm_libdisasm_a_SOURCES = \ + src/third_party/libdisasm/ia32_implicit.c \ + src/third_party/libdisasm/ia32_implicit.h \ + src/third_party/libdisasm/ia32_insn.c \ + src/third_party/libdisasm/ia32_insn.h \ + src/third_party/libdisasm/ia32_invariant.c \ + src/third_party/libdisasm/ia32_invariant.h \ + src/third_party/libdisasm/ia32_modrm.c \ + src/third_party/libdisasm/ia32_modrm.h \ + src/third_party/libdisasm/ia32_opcode_tables.c \ + src/third_party/libdisasm/ia32_opcode_tables.h \ + src/third_party/libdisasm/ia32_operand.c \ + src/third_party/libdisasm/ia32_operand.h \ + src/third_party/libdisasm/ia32_reg.c \ + src/third_party/libdisasm/ia32_reg.h \ + src/third_party/libdisasm/ia32_settings.c \ + src/third_party/libdisasm/ia32_settings.h \ + src/third_party/libdisasm/libdis.h \ + src/third_party/libdisasm/qword.h \ + src/third_party/libdisasm/x86_disasm.c \ + src/third_party/libdisasm/x86_format.c \ + src/third_party/libdisasm/x86_imm.c \ + src/third_party/libdisasm/x86_imm.h \ + src/third_party/libdisasm/x86_insn.c \ + src/third_party/libdisasm/x86_misc.c \ + src/third_party/libdisasm/x86_operand_list.c \ + src/third_party/libdisasm/x86_operand_list.h + +# Breakpad client +src_client_linux_libbreakpad_client_a_SOURCES = \ + src/client/linux/crash_generation/crash_generation_client.cc \ + src/client/linux/crash_generation/crash_generation_server.cc \ + src/client/linux/dump_writer_common/thread_info.cc \ + src/client/linux/dump_writer_common/ucontext_reader.cc \ + src/client/linux/handler/exception_handler.cc \ + src/client/linux/handler/exception_handler.h \ + src/client/linux/handler/minidump_descriptor.cc \ + src/client/linux/handler/minidump_descriptor.h \ + src/client/linux/log/log.cc \ + src/client/linux/log/log.h \ + src/client/linux/microdump_writer/microdump_writer.cc \ + src/client/linux/microdump_writer/microdump_writer.h \ + src/client/linux/minidump_writer/linux_core_dumper.cc \ + src/client/linux/minidump_writer/linux_dumper.cc \ + src/client/linux/minidump_writer/linux_ptrace_dumper.cc \ + src/client/linux/minidump_writer/minidump_writer.cc \ + src/client/linux/minidump_writer/pe_file.cc \ + src/client/minidump_file_writer-inl.h \ + src/client/minidump_file_writer.cc \ + src/client/minidump_file_writer.h \ + src/common/convert_UTF.cc \ + src/common/convert_UTF.h \ + src/common/md5.cc \ + src/common/md5.h \ + src/common/string_conversion.cc \ + src/common/string_conversion.h \ + src/common/linux/elf_core_dump.cc \ + src/common/linux/elfutils.cc \ + src/common/linux/elfutils.h \ + src/common/linux/file_id.cc \ + src/common/linux/file_id.h \ + src/common/linux/guid_creator.cc \ + src/common/linux/guid_creator.h \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/safe_readlink.cc +if !HAVE_GETCONTEXT +src_client_linux_libbreakpad_client_a_SOURCES += \ + src/common/linux/breakpad_getcontext.S +endif + +# Client tests +src_client_linux_linux_dumper_unittest_helper_SOURCES = \ + src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc +src_client_linux_linux_dumper_unittest_helper_LDFLAGS=$(PTHREAD_CFLAGS) +src_client_linux_linux_dumper_unittest_helper_CC=$(PTHREAD_CC) +if ANDROID_HOST +# On Android PTHREAD_CFLAGS is empty, and adding src/common/android/include +# to the include path is necessary to build this program. +src_client_linux_linux_dumper_unittest_helper_CXXFLAGS=$(AM_CXXFLAGS) +else +src_client_linux_linux_dumper_unittest_helper_CXXFLAGS=$(PTHREAD_CFLAGS) +endif + +src_client_linux_linux_client_unittest_shlib_SOURCES = \ + $(src_testing_libtesting_a_SOURCES) \ + src/client/linux/handler/exception_handler_unittest.cc \ + src/client/linux/microdump_writer/microdump_writer_unittest.cc \ + src/client/linux/minidump_writer/directory_reader_unittest.cc \ + src/client/linux/minidump_writer/cpu_set_unittest.cc \ + src/client/linux/minidump_writer/line_reader_unittest.cc \ + src/client/linux/minidump_writer/linux_core_dumper.cc \ + src/client/linux/minidump_writer/linux_core_dumper_unittest.cc \ + src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc \ + src/client/linux/minidump_writer/minidump_writer_unittest.cc \ + src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc \ + src/client/linux/minidump_writer/pe_file.cc \ + src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc \ + src/common/linux/elf_core_dump.cc \ + src/common/linux/linux_libc_support_unittest.cc \ + src/common/linux/scoped_pipe.h \ + src/common/linux/scoped_pipe.cc \ + src/common/linux/scoped_tmpfile.h \ + src/common/linux/scoped_tmpfile.cc \ + src/common/linux/tests/crash_generator.cc \ + src/common/memory_allocator_unittest.cc \ + src/common/tests/auto_tempdir.h \ + src/common/tests/file_utils.cc \ + src/common/tests/file_utils.h \ + src/processor/basic_code_modules.cc \ + src/processor/convert_old_arm64_context.cc \ + src/processor/dump_context.cc \ + src/processor/dump_object.cc \ + src/processor/logging.cc \ + src/processor/minidump.cc \ + src/processor/pathname_stripper.cc \ + src/processor/proc_maps_linux.cc +if !HAVE_GETCONTEXT +src_client_linux_linux_client_unittest_shlib_SOURCES += \ + src/common/linux/breakpad_getcontext.S +endif + +src_client_linux_linux_client_unittest_shlib_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_client_linux_linux_client_unittest_shlib_LDFLAGS = \ + -shared \ + -Wl,-h,linux_client_unittest_shlib +src_client_linux_linux_client_unittest_shlib_LDADD = \ + src/client/linux/crash_generation/crash_generation_client.o \ + src/client/linux/dump_writer_common/thread_info.o \ + src/client/linux/dump_writer_common/ucontext_reader.o \ + src/client/linux/handler/exception_handler.o \ + src/client/linux/handler/minidump_descriptor.o \ + src/client/linux/log/log.o \ + src/client/linux/microdump_writer/microdump_writer.o \ + src/client/linux/minidump_writer/linux_dumper.o \ + src/client/linux/minidump_writer/linux_ptrace_dumper.o \ + src/client/linux/minidump_writer/minidump_writer.o \ + src/client/minidump_file_writer.o \ + src/common/convert_UTF.o \ + src/common/md5.o \ + src/common/linux/elfutils.o \ + src/common/linux/file_id.o \ + src/common/linux/guid_creator.o \ + src/common/linux/linux_libc_support.o \ + src/common/linux/memory_mapped_file.o \ + src/common/linux/safe_readlink.o \ + src/common/string_conversion.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +if !HAVE_GETCONTEXT +src_client_linux_linux_client_unittest_shlib_SOURCES += \ + src/common/linux/breakpad_getcontext_unittest.cc +endif +if ANDROID_HOST +src_client_linux_linux_client_unittest_shlib_LDFLAGS += \ + -llog -lm +endif + +src_client_linux_linux_client_unittest_shlib_DEPENDENCIES = \ + src/client/linux/linux_dumper_unittest_helper \ + src/client/linux/libbreakpad_client.a \ + $(TEST_DEPS) \ + src/libbreakpad.a + +src_client_linux_linux_client_unittest_SOURCES = +# The extra-long build id is for a test in minidump_writer_unittest.cc. +src_client_linux_linux_client_unittest_LDFLAGS = \ + -Wl,-rpath,'$$ORIGIN' \ + -Wl,--build-id=0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +if ANDROID_HOST +src_client_linux_linux_client_unittest_LDFLAGS += \ + -llog +endif + +src_client_linux_linux_client_unittest_LDADD = \ + src/client/linux/linux_client_unittest_shlib \ + $(TEST_LIBS) + +src_client_linux_linux_client_unittest_DEPENDENCIES = \ + src/client/linux/linux_client_unittest_shlib + +# Tools + +src_tools_linux_core2md_core2md_SOURCES = \ + src/tools/linux/core2md/core2md.cc + +src_tools_linux_core2md_core2md_LDADD = \ + src/client/linux/libbreakpad_client.a \ + src/common/path_helper.o + +src_tools_linux_core_handler_core_handler_SOURCES = \ + src/tools/linux/core_handler/core_handler.cc + +src_tools_linux_core_handler_core_handler_LDADD = \ + src/client/linux/libbreakpad_client.a \ + src/common/path_helper.o + +src_tools_linux_pid2md_pid2md_SOURCES = \ + src/tools/linux/pid2md/pid2md.cc + +src_tools_linux_pid2md_pid2md_LDADD = \ + src/client/linux/libbreakpad_client.a \ + src/common/path_helper.o + +src_tools_linux_dump_syms_dump_syms_SOURCES = \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_range_list_handler.cc \ + src/common/language.cc \ + src/common/module.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_to_module.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/elf_reader.cc \ + src/common/linux/crc32.cc \ + src/common/linux/dump_symbols.cc \ + src/common/linux/dump_symbols.h \ + src/common/linux/elf_symbols_to_module.cc \ + src/common/linux/elf_symbols_to_module.h \ + src/common/linux/elfutils.cc \ + src/common/linux/file_id.cc \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/safe_readlink.cc \ + src/tools/linux/dump_syms/dump_syms.cc +src_tools_linux_dump_syms_dump_syms_CXXFLAGS = \ + $(RUSTC_DEMANGLE_CFLAGS) \ + $(ZSTD_CFLAGS) +src_tools_linux_dump_syms_dump_syms_LDADD = \ + $(RUSTC_DEMANGLE_LIBS) \ + $(ZSTD_CFLAGS) \ + -lz + +src_tools_linux_md2core_minidump_2_core_SOURCES = \ + src/common/linux/memory_mapped_file.cc \ + src/common/path_helper.cc \ + src/tools/linux/md2core/minidump-2-core.cc \ + src/tools/linux/md2core/minidump_memory_range.h + +src_tools_linux_symupload_minidump_upload_SOURCES = \ + src/common/linux/http_upload.cc \ + src/common/path_helper.cc \ + src/tools/linux/symupload/minidump_upload.cc +src_tools_linux_symupload_minidump_upload_LDADD = -ldl + +src_tools_linux_symupload_sym_upload_SOURCES = \ + src/common/linux/http_upload.cc \ + src/common/linux/http_upload.h \ + src/common/linux/libcurl_wrapper.cc \ + src/common/linux/libcurl_wrapper.h \ + src/common/linux/symbol_collector_client.cc \ + src/common/linux/symbol_collector_client.h \ + src/common/linux/symbol_upload.cc \ + src/common/linux/symbol_upload.h \ + src/common/path_helper.cc \ + src/tools/linux/symupload/sym_upload.cc +src_tools_linux_symupload_sym_upload_LDADD = -ldl + +src_tools_mac_dump_syms_dump_syms_mac_SOURCES = \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_range_list_handler.cc \ + src/common/language.cc \ + src/common/md5.cc \ + src/common/module.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_to_module.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/elf_reader.cc \ + src/common/mac/arch_utilities.cc \ + src/common/mac/dump_syms.cc \ + src/common/mac/dump_syms.h \ + src/common/mac/file_id.cc \ + src/common/mac/file_id.h \ + src/common/mac/macho_id.cc \ + src/common/mac/macho_id.h \ + src/common/mac/macho_reader.cc \ + src/common/mac/macho_reader.h \ + src/common/mac/macho_utilities.cc \ + src/common/mac/macho_utilities.h \ + src/common/mac/macho_walker.cc \ + src/common/mac/macho_walker.h \ + src/tools/mac/dump_syms/dump_syms_tool.cc +src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS= \ + -I$(top_srcdir)/src/third_party/mac_headers \ + $(RUSTC_DEMANGLE_CFLAGS) \ + -DHAVE_MACH_O_NLIST_H +src_tools_mac_dump_syms_dump_syms_mac_LDADD= \ + $(RUSTC_DEMANGLE_LIBS) + +src_common_dumper_unittest_SOURCES = \ + src/common/byte_cursor_unittest.cc \ + src/common/convert_UTF.cc \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cfi_to_module_unittest.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_cu_to_module_unittest.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_line_to_module_unittest.cc \ + src/common/dwarf_range_list_handler.cc \ + src/common/language.cc \ + src/common/memory_range_unittest.cc \ + src/common/module.cc \ + src/common/module_unittest.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_reader_unittest.cc \ + src/common/stabs_to_module.cc \ + src/common/stabs_to_module_unittest.cc \ + src/common/string_conversion.cc \ + src/common/string_conversion_unittest.cc \ + src/common/test_assembler.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/bytereader.h \ + src/common/dwarf/bytereader-inl.h \ + src/common/dwarf/bytereader_unittest.cc \ + src/common/dwarf/cfi_assembler.cc \ + src/common/dwarf/cfi_assembler.h \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2diehandler_unittest.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/dwarf2reader.h \ + src/common/dwarf/elf_reader.cc \ + src/common/dwarf/elf_reader.h \ + src/common/dwarf/dwarf2reader_cfi_unittest.cc \ + src/common/dwarf/dwarf2reader_die_unittest.cc \ + src/common/dwarf/dwarf2reader_test_common.h \ + src/common/linux/crc32.cc \ + src/common/linux/dump_symbols.cc \ + src/common/linux/dump_symbols_unittest.cc \ + src/common/linux/elf_core_dump.cc \ + src/common/linux/elf_core_dump_unittest.cc \ + src/common/linux/elf_symbols_to_module.cc \ + src/common/linux/elf_symbols_to_module_unittest.cc \ + src/common/linux/elfutils.cc \ + src/common/linux/file_id.cc \ + src/common/linux/file_id_unittest.cc \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/memory_mapped_file_unittest.cc \ + src/common/linux/safe_readlink.cc \ + src/common/linux/safe_readlink_unittest.cc \ + src/common/linux/synth_elf.cc \ + src/common/linux/synth_elf_unittest.cc \ + src/common/linux/tests/crash_generator.cc \ + src/common/linux/tests/crash_generator.h \ + src/common/testdata/func-line-pairing.h \ + src/common/tests/file_utils.cc +src_common_dumper_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) \ + $(RUSTC_DEMANGLE_CFLAGS) \ + $(PTHREAD_CFLAGS) \ + $(ZSTD_CFLAGS) +src_common_dumper_unittest_LDADD = \ + $(TEST_LIBS) \ + $(RUSTC_DEMANGLE_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + $(ZSTD_LIBS) \ + -lz + +src_common_mac_macho_reader_unittest_SOURCES = \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/language.cc \ + src/common/md5.cc \ + src/common/module.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_to_module.cc \ + src/common/test_assembler.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/cfi_assembler.cc \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/elf_reader.cc \ + src/common/mac/arch_utilities.cc \ + src/common/mac/file_id.cc \ + src/common/mac/macho_id.cc \ + src/common/mac/macho_reader.cc \ + src/common/mac/macho_reader_unittest.cc \ + src/common/mac/macho_utilities.cc \ + src/common/mac/macho_walker.cc \ + src/common/tests/file_utils.cc +src_common_mac_macho_reader_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) \ + -I$(top_srcdir)/src/third_party/mac_headers \ + -DHAVE_MACH_O_NLIST_H \ + $(PTHREAD_CFLAGS) +src_common_mac_macho_reader_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_linux_google_crashdump_uploader_test_SOURCES = \ + src/common/linux/google_crashdump_uploader.cc \ + src/common/linux/google_crashdump_uploader_test.cc \ + src/common/linux/libcurl_wrapper.cc +src_common_linux_google_crashdump_uploader_test_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_common_linux_google_crashdump_uploader_test_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + -ldl + +src_tools_linux_md2core_minidump_2_core_unittest_SOURCES = \ + src/tools/linux/md2core/minidump_memory_range_unittest.cc +src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_tools_linux_md2core_minidump_2_core_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_address_map_unittest_SOURCES = \ + src/processor/address_map_unittest.cc +src_processor_address_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o + +src_processor_basic_source_line_resolver_unittest_SOURCES = \ + src/processor/basic_source_line_resolver_unittest.cc +src_processor_basic_source_line_resolver_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_basic_source_line_resolver_unittest_LDADD = \ + src/processor/basic_source_line_resolver.o \ + src/processor/cfi_frame_info.o \ + src/processor/pathname_stripper.o \ + src/processor/logging.o \ + src/processor/source_line_resolver_base.o \ + src/processor/tokenize.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_cfi_frame_info_unittest_SOURCES = \ + src/processor/cfi_frame_info_unittest.cc +src_processor_cfi_frame_info_unittest_LDADD = \ + src/processor/cfi_frame_info.o \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_cfi_frame_info_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_contained_range_map_unittest_SOURCES = \ + src/processor/contained_range_map_unittest.cc +src_processor_contained_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o + +src_processor_exploitability_unittest_SOURCES = \ + src/processor/exploitability_unittest.cc +src_processor_exploitability_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_exploitability_unittest_LDADD = \ + src/processor/convert_old_arm64_context.o \ + src/processor/minidump_processor.o \ + src/processor/process_state.o \ + src/processor/disassembler_x86.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/cfi_frame_info.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o \ + src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +if LINUX_HOST +src_processor_exploitability_unittest_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif + +src_common_linux_scoped_pipe_unittest_SOURCES = \ + src/common/linux/scoped_pipe_unittest.cc +src_common_linux_scoped_pipe_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_common_linux_scoped_pipe_unittest_LDADD = \ + src/common/linux/scoped_pipe.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_linux_scoped_tmpfile_unittest_SOURCES = \ + src/common/linux/scoped_tmpfile_unittest.cc +src_common_linux_scoped_tmpfile_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_common_linux_scoped_tmpfile_unittest_LDADD = \ + src/common/linux/scoped_tmpfile.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_disassembler_objdump_unittest_SOURCES = \ + src/processor/disassembler_objdump_unittest.cc +src_processor_disassembler_objdump_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_disassembler_objdump_unittest_LDADD = \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_disassembler_x86_unittest_SOURCES = \ + src/processor/disassembler_x86_unittest.cc +src_processor_disassembler_x86_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_disassembler_x86_unittest_LDADD = \ + src/processor/disassembler_x86.o \ + src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_fast_source_line_resolver_unittest_SOURCES = \ + src/processor/fast_source_line_resolver_unittest.cc +src_processor_fast_source_line_resolver_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_fast_source_line_resolver_unittest_LDADD = \ + src/processor/fast_source_line_resolver.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/cfi_frame_info.o \ + src/processor/module_comparer.o \ + src/processor/module_serializer.o \ + src/processor/pathname_stripper.o \ + src/processor/logging.o \ + src/processor/source_line_resolver_base.o \ + src/processor/tokenize.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_map_serializers_unittest_SOURCES = \ + src/processor/map_serializers_unittest.cc +src_processor_map_serializers_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_map_serializers_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_microdump_processor_unittest_SOURCES = \ + src/processor/microdump_processor_unittest.cc +src_processor_microdump_processor_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_microdump_processor_unittest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/cfi_frame_info.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/microdump.o \ + src/processor/microdump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/tokenize.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +if LINUX_HOST +src_processor_microdump_processor_unittest_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif + +src_processor_minidump_processor_unittest_SOURCES = \ + src/processor/minidump_processor_unittest.cc +src_processor_minidump_processor_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_minidump_processor_unittest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/disassembler_x86.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o \ + src/processor/logging.o \ + src/processor/minidump_processor.o \ + src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/proc_maps_linux.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o \ + src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +if LINUX_HOST +src_processor_minidump_processor_unittest_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif + +src_processor_minidump_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/minidump_unittest.cc \ + src/processor/synth_minidump.cc +src_processor_minidump_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_minidump_unittest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_proc_maps_linux_unittest_SOURCES = \ + src/processor/proc_maps_linux.cc \ + src/processor/proc_maps_linux_unittest.cc +src_processor_proc_maps_linux_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_proc_maps_linux_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_address_map_unittest_SOURCES = \ + src/processor/static_address_map_unittest.cc +src_processor_static_address_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_static_address_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_contained_range_map_unittest_SOURCES = \ + src/processor/static_contained_range_map_unittest.cc +src_processor_static_contained_range_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_static_contained_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_map_unittest_SOURCES = \ + src/processor/static_map_unittest.cc +src_processor_static_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_static_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_range_map_unittest_SOURCES = \ + src/processor/static_range_map_unittest.cc +src_processor_static_range_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_static_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_pathname_stripper_unittest_SOURCES = \ + src/processor/pathname_stripper_unittest.cc +src_processor_pathname_stripper_unittest_LDADD = \ + src/processor/pathname_stripper.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_postfix_evaluator_unittest_SOURCES = \ + src/processor/postfix_evaluator_unittest.cc +src_processor_postfix_evaluator_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_range_map_truncate_lower_unittest_SOURCES = \ + src/processor/range_map_truncate_lower_unittest.cc +src_processor_range_map_truncate_lower_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_range_map_truncate_lower_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_range_map_truncate_upper_unittest_SOURCES = \ + src/processor/range_map_truncate_upper_unittest.cc +src_processor_range_map_truncate_upper_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_range_map_truncate_upper_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_range_map_unittest_SOURCES = \ + src/processor/range_map_unittest.cc +src_processor_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_selftest_SOURCES = \ + src/processor/stackwalker_selftest.cc +src_processor_stackwalker_selftest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/disassembler_x86.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o \ + src/processor/logging.o \ + src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/tokenize.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +if LINUX_HOST +src_processor_stackwalker_selftest_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif + +src_processor_stackwalker_amd64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_amd64_unittest.cc +src_processor_stackwalker_amd64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_stackwalker_amd64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_arm_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_arm_unittest.cc +src_processor_stackwalker_arm_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_stackwalker_arm_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_arm64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_arm64_unittest.cc +src_processor_stackwalker_arm64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_stackwalker_arm64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_address_list_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_address_list_unittest.cc +src_processor_stackwalker_address_list_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_stackwalker_address_list_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_mips_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_mips_unittest.cc +src_processor_stackwalker_mips_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_stackwalker_mips_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_mips64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_mips64_unittest.cc +src_processor_stackwalker_mips64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_stackwalker_mips64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_riscv_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_riscv_unittest.cc +src_processor_stackwalker_riscv_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_stackwalker_riscv_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_riscv64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_riscv64_unittest.cc +src_processor_stackwalker_riscv64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_stackwalker_riscv64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_x86_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_x86_unittest.cc +src_processor_stackwalker_x86_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +src_processor_stackwalker_x86_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_synth_minidump_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/common/test_assembler.h \ + src/processor/synth_minidump_unittest.cc \ + src/processor/synth_minidump.cc \ + src/processor/synth_minidump.h +src_processor_synth_minidump_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_processor_synth_minidump_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_test_assembler_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/common/test_assembler.h \ + src/common/test_assembler_unittest.cc +src_common_test_assembler_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_common_test_assembler_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_dwarf_dwarf2reader_lineinfo_unittest_SOURCES = \ + src/common/dwarf/dwarf2reader.h \ + src/common/dwarf/dwarf2reader_lineinfo_unittest.cc +src_common_dwarf_dwarf2reader_lineinfo_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_common_dwarf_dwarf2reader_lineinfo_unittest_LDADD = \ + src/common/dwarf/bytereader.o \ + src/common/dwarf/dwarf2reader.o \ + src/common/dwarf/elf_reader.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_dwarf_dwarf2reader_splitfunctions_unittest_SOURCES = \ + src/common/dwarf/dwarf2reader.h \ + src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc +src_common_dwarf_dwarf2reader_splitfunctions_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) +src_common_dwarf_dwarf2reader_splitfunctions_unittest_LDADD = \ + src/common/dwarf/bytereader.o \ + src/common/dwarf/dwarf2reader.o \ + src/common/dwarf/elf_reader.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_minidump_dump_SOURCES = \ + src/processor/minidump_dump.cc +src_processor_minidump_dump_LDADD = \ + src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o + +src_processor_microdump_stackwalk_SOURCES = \ + src/processor/microdump_stackwalk.cc +src_processor_microdump_stackwalk_LDADD = \ + src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/cfi_frame_info.o \ + src/processor/disassembler_x86.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/microdump.o \ + src/processor/microdump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalk_common.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/tokenize.o \ + src/third_party/libdisasm/libdisasm.a +if LINUX_HOST +src_processor_microdump_stackwalk_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif + +src_processor_minidump_stackwalk_SOURCES = \ + src/processor/minidump_stackwalk.cc +src_processor_minidump_stackwalk_LDADD = \ + src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/disassembler_x86.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o \ + src/processor/logging.o \ + src/processor/minidump.o \ + src/processor/minidump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/proc_maps_linux.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalk_common.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o \ + src/third_party/libdisasm/libdisasm.a +if LINUX_HOST +src_processor_minidump_stackwalk_LDADD += \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o +endif LINUX_HOST + +## Additional files to be included in a source distribution +## +## find src/client src/common src/processor/testdata src/tools \ +## -type f \! -path '*/.svn/*' -print | sort | \ +## sed -e s/'^\(.*\)$'/'\t\1 \\'/ +EXTRA_DIST = \ + $(SCRIPTS) \ + src/client/linux/data/linux-gate-amd.sym \ + src/client/linux/data/linux-gate-intel.sym \ + src/client/mac/handler/breakpad_nlist_64.cc \ + src/client/mac/handler/breakpad_nlist_64.h \ + src/client/mac/handler/dynamic_images.cc \ + src/client/mac/handler/dynamic_images.h \ + src/client/mac/handler/exception_handler.cc \ + src/client/mac/handler/exception_handler.h \ + src/client/mac/handler/mach_vm_compat.h \ + src/client/mac/handler/minidump_generator.cc \ + src/client/mac/handler/minidump_generator.h \ + src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj \ + src/client/mac/handler/minidump_tests32-Info.plist \ + src/client/mac/handler/minidump_tests64-Info.plist \ + src/client/mac/handler/obj-cTestCases-Info.plist \ + src/client/mac/handler/protected_memory_allocator.cc \ + src/client/mac/handler/protected_memory_allocator.h \ + src/client/mac/handler/ucontext_compat.h \ + src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym \ + src/client/mac/tests/BreakpadFramework_Test.mm \ + src/client/mac/tests/crash_generation_server_test.cc \ + src/client/mac/tests/exception_handler_test.cc \ + src/client/mac/tests/minidump_generator_test.cc \ + src/client/mac/tests/minidump_generator_test_helper.cc \ + src/client/mac/tests/spawn_child_process.h \ + src/client/mac/tests/testlogging.h \ + src/client/minidump_file_writer_unittest.cc \ + src/client/solaris/handler/Makefile \ + src/client/solaris/handler/exception_handler.cc \ + src/client/solaris/handler/exception_handler.h \ + src/client/solaris/handler/exception_handler_test.cc \ + src/client/solaris/handler/minidump_generator.cc \ + src/client/solaris/handler/minidump_generator.h \ + src/client/solaris/handler/minidump_test.cc \ + src/client/solaris/handler/solaris_lwp.cc \ + src/client/solaris/handler/solaris_lwp.h \ + src/client/windows/handler/exception_handler.cc \ + src/client/windows/handler/exception_handler.h \ + src/client/windows/sender/crash_report_sender.cc \ + src/client/windows/sender/crash_report_sender.h \ + src/common/dwarf/dwarf2diehandler.h \ + src/common/dwarf/dwarf2enums.h \ + src/common/dwarf/line_state_machine.h \ + src/common/dwarf/types.h \ + src/common/mac/arch_utilities.h \ + src/common/mac/byteswap.h \ + src/common/mac/HTTPMultipartUpload.h \ + src/common/mac/HTTPMultipartUpload.m \ + src/common/mac/string_utilities.cc \ + src/common/mac/string_utilities.h \ + src/common/mac/super_fat_arch.h \ + src/common/scoped_ptr.h \ + src/common/solaris/dump_symbols.cc \ + src/common/solaris/dump_symbols.h \ + src/common/solaris/file_id.cc \ + src/common/solaris/file_id.h \ + src/common/solaris/guid_creator.cc \ + src/common/solaris/guid_creator.h \ + src/common/solaris/message_output.h \ + src/common/windows/guid_string.cc \ + src/common/windows/guid_string.h \ + src/common/windows/http_upload.cc \ + src/common/windows/http_upload.h \ + src/common/windows/pdb_source_line_writer.cc \ + src/common/windows/pdb_source_line_writer.h \ + src/common/windows/string_utils-inl.h \ + src/common/windows/string_utils.cc \ + src/processor/microdump_stackwalk_test_vars \ + src/processor/stackwalk_common.cc \ + src/processor/stackwalk_common.h \ + src/processor/stackwalker_selftest_sol.s \ + src/processor/testdata/ascii_read_av_block_write.dmp \ + src/processor/testdata/ascii_read_av_clobber_write.dmp \ + src/processor/testdata/ascii_read_av_conditional.dmp \ + src/processor/testdata/ascii_read_av.dmp \ + src/processor/testdata/ascii_read_av_then_jmp.dmp \ + src/processor/testdata/ascii_read_av_xchg_write.dmp \ + src/processor/testdata/ascii_write_av_arg_to_call.dmp \ + src/processor/testdata/ascii_write_av.dmp \ + src/processor/testdata/exec_av_on_stack.dmp \ + src/processor/testdata/linux_divide_by_zero.dmp \ + src/processor/testdata/linux_executable_heap.dmp \ + src/processor/testdata/linux_executable_stack.dmp \ + src/processor/testdata/linux_inside_module_exe_region1.dmp \ + src/processor/testdata/linux_inside_module_exe_region2.dmp \ + src/processor/testdata/linux_jmp_to_0.dmp \ + src/processor/testdata/linux_jmp_to_module_not_exe_region.dmp \ + src/processor/testdata/linux_null_dereference.dmp \ + src/processor/testdata/linux_null_read_av.dmp \ + src/processor/testdata/linux_outside_module.dmp \ + src/processor/testdata/linux_overflow.dmp \ + src/processor/testdata/linux_raise_sigabrt.dmp \ + src/processor/testdata/linux_stack_pointer_in_module.dmp \ + src/processor/testdata/linux_stack_pointer_in_stack.dmp \ + src/processor/testdata/linux_stack_pointer_in_stack_alt_name.dmp \ + src/processor/testdata/linux_stacksmash.dmp \ + src/processor/testdata/linux_write_to_nonwritable_module.dmp \ + src/processor/testdata/linux_write_to_nonwritable_region_math.dmp \ + src/processor/testdata/linux_write_to_outside_module.dmp \ + src/processor/testdata/linux_write_to_outside_module_via_math.dmp \ + src/processor/testdata/linux_write_to_under_4k.dmp \ + src/processor/testdata/microdump-arm64.dmp \ + src/processor/testdata/microdump-arm.dmp \ + src/processor/testdata/microdump-mips32.dmp \ + src/processor/testdata/microdump-mips64.dmp \ + src/processor/testdata/microdump-multiple.dmp \ + src/processor/testdata/microdump.stackwalk-arm64.out \ + src/processor/testdata/microdump.stackwalk-arm.out \ + src/processor/testdata/microdump.stackwalk.machine_readable-arm64.out \ + src/processor/testdata/microdump.stackwalk.machine_readable-arm.out \ + src/processor/testdata/microdump-withcrashreason.dmp \ + src/processor/testdata/microdump-x86.dmp \ + src/processor/testdata/minidump_32bit_crash_addr.dmp \ + src/processor/testdata/minidump2.dmp \ + src/processor/testdata/minidump2.dump.out \ + src/processor/testdata/minidump2.stackwalk.machine_readable.out \ + src/processor/testdata/minidump2.stackwalk.out \ + src/processor/testdata/module0.out \ + src/processor/testdata/module1.out \ + src/processor/testdata/module2.out \ + src/processor/testdata/module3_bad.out \ + src/processor/testdata/module4_bad.out \ + src/processor/testdata/null_read_av.dmp \ + src/processor/testdata/null_write_av.dmp \ + src/processor/testdata/read_av_clobber_write.dmp \ + src/processor/testdata/read_av_conditional.dmp \ + src/processor/testdata/read_av_non_null.dmp \ + src/processor/testdata/stack_exhaustion.dmp \ + src/processor/testdata/write_av_non_null.dmp \ + src/processor/testdata/symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym \ + src/processor/testdata/symbols/ld-2.13.so/C32AD7E235EA6112E02A5B9D6219C4850/ld-2.13.so.sym \ + src/processor/testdata/symbols/libc-2.13.so/F4F8DFCD5A5FB5A7CE64717E9E6AE3890/libc-2.13.so.sym \ + src/processor/testdata/symbols/libgcc_s.so.1/18B180F90887D8F8B5C35D185444AF4C0/libgcc_s.so.1.sym \ + src/processor/testdata/symbols/microdump/breakpad_unittests/D6D1FEC9A15DE7F38A236898871A2E770/breakpad_unittests.sym \ + src/processor/testdata/symbols/microdump/breakpad_unittests/DA7778FB66018A4E9B4110ED06E730D00/breakpad_unittests.sym \ + src/processor/testdata/symbols/microdump/crash_example/6E72E2F1A5F59AB3D51356FDFE394D490/crash_example.sym \ + src/processor/testdata/symbols/microdump/crash_example/8F36148CC4647A8116CAF2A25F591F570/crash_example.sym \ + src/processor/testdata/symbols/null_read_av/7B7D1968FF0D47AE4366E9C3A7E1B6750/null_read_av.sym \ + src/processor/testdata/symbols/overflow/B0E1FC01EF48E39CAF5C881D2DF0C3840/overflow.sym \ + src/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym \ + src/processor/testdata/test_app.cc \ + src/testing/googletest/include/gtest/gtest.h \ + src/testing/googletest/include/gtest/gtest-death-test.h \ + src/testing/googletest/include/gtest/gtest-matchers.h \ + src/testing/googletest/include/gtest/gtest-message.h \ + src/testing/googletest/include/gtest/gtest-param-test.h \ + src/testing/googletest/include/gtest/gtest-printers.h \ + src/testing/googletest/include/gtest/gtest-spi.h \ + src/testing/googletest/include/gtest/gtest-test-part.h \ + src/testing/googletest/include/gtest/gtest-typed-test.h \ + src/testing/googletest/include/gtest/gtest_pred_impl.h \ + src/testing/googletest/include/gtest/gtest_prod.h \ + src/testing/googletest/include/gtest/internal/custom/gtest-port.h \ + src/testing/googletest/include/gtest/internal/custom/gtest-printers.h \ + src/testing/googletest/include/gtest/internal/custom/gtest.h \ + src/testing/googletest/include/gtest/internal/gtest-death-test-internal.h \ + src/testing/googletest/include/gtest/internal/gtest-filepath.h \ + src/testing/googletest/include/gtest/internal/gtest-internal.h \ + src/testing/googletest/include/gtest/internal/gtest-param-util-generated.h \ + src/testing/googletest/include/gtest/internal/gtest-param-util.h \ + src/testing/googletest/include/gtest/internal/gtest-port-arch.h \ + src/testing/googletest/include/gtest/internal/gtest-port.h \ + src/testing/googletest/include/gtest/internal/gtest-string.h \ + src/testing/googletest/include/gtest/internal/gtest-type-util.h \ + src/testing/googletest/src/gtest.cc \ + src/testing/googletest/src/gtest-death-test.cc \ + src/testing/googletest/src/gtest-filepath.cc \ + src/testing/googletest/src/gtest-internal-inl.h \ + src/testing/googletest/src/gtest-matchers.cc \ + src/testing/googletest/src/gtest-port.cc \ + src/testing/googletest/src/gtest-printers.cc \ + src/testing/googletest/src/gtest-test-part.cc \ + src/testing/googletest/src/gtest-typed-test.cc \ + src/testing/googlemock/include/gmock/gmock.h \ + src/testing/googlemock/include/gmock/gmock-actions.h \ + src/testing/googlemock/include/gmock/gmock-cardinalities.h \ + src/testing/googlemock/include/gmock/gmock-function-mocker.h \ + src/testing/googlemock/include/gmock/gmock-generated-actions.h \ + src/testing/googlemock/include/gmock/gmock-generated-function-mockers.h \ + src/testing/googlemock/include/gmock/gmock-generated-matchers.h \ + src/testing/googlemock/include/gmock/gmock-matchers.h \ + src/testing/googlemock/include/gmock/gmock-more-actions.h \ + src/testing/googlemock/include/gmock/gmock-more-matchers.h \ + src/testing/googlemock/include/gmock/gmock-nice-strict.h \ + src/testing/googlemock/include/gmock/gmock-spec-builders.h \ + src/testing/googlemock/include/gmock/internal/custom/gmock-generated-actions.h \ + src/testing/googlemock/include/gmock/internal/custom/gmock-matchers.h \ + src/testing/googlemock/include/gmock/internal/custom/gmock-port.h \ + src/testing/googlemock/include/gmock/internal/gmock-internal-utils.h \ + src/testing/googlemock/include/gmock/internal/gmock-port.h \ + src/testing/googlemock/include/gmock/internal/gmock-pp.h \ + src/testing/googlemock/src/gmock.cc \ + src/testing/googlemock/src/gmock-cardinalities.cc \ + src/testing/googlemock/src/gmock-internal-utils.cc \ + src/testing/googlemock/src/gmock-matchers.cc \ + src/testing/googlemock/src/gmock-spec-builders.cc \ + src/testing/googlemock/src/gmock_main.cc \ + src/third_party/curl/COPYING \ + src/third_party/curl/curlbuild.h \ + src/third_party/curl/curl.h \ + src/third_party/curl/curlrules.h \ + src/third_party/curl/curlver.h \ + src/third_party/curl/easy.h \ + src/third_party/curl/mprintf.h \ + src/third_party/curl/multi.h \ + src/third_party/curl/stdcheaders.h \ + src/third_party/curl/typecheck-gcc.h \ + src/third_party/curl/types.h \ + src/third_party/mac_headers/architecture/byte_order.h \ + src/third_party/mac_headers/arm/_types.h \ + src/third_party/mac_headers/i386/_types.h \ + src/third_party/mac_headers/mach/boolean.h \ + src/third_party/mac_headers/mach/arm/boolean.h \ + src/third_party/mac_headers/mach/arm/vm_types.h \ + src/third_party/mac_headers/mach/i386/boolean.h \ + src/third_party/mac_headers/mach/i386/vm_types.h \ + src/third_party/mac_headers/mach/machine/boolean.h \ + src/third_party/mac_headers/mach/machine.h \ + src/third_party/mac_headers/mach/machine/thread_state.h \ + src/third_party/mac_headers/mach/machine/thread_status.h \ + src/third_party/mac_headers/mach/machine/vm_types.h \ + src/third_party/mac_headers/mach-o/arch.h \ + src/third_party/mac_headers/mach-o/fat.h \ + src/third_party/mac_headers/mach-o/loader.h \ + src/third_party/mac_headers/mach-o/nlist.h \ + src/third_party/mac_headers/mach/thread_status.h \ + src/third_party/mac_headers/mach/vm_prot.h \ + src/third_party/mac_headers/README \ + src/third_party/musl/README \ + src/third_party/musl/COPYRIGHT \ + src/third_party/musl/README.breakpad \ + src/third_party/musl/VERSION \ + src/third_party/musl/include/elf.h \ + src/tools/mac/crash_report/crash_report.mm \ + src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj \ + src/tools/mac/crash_report/on_demand_symbol_supplier.h \ + src/tools/mac/crash_report/on_demand_symbol_supplier.mm \ + src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj \ + src/tools/mac/dump_syms/dump_syms_tool.cc \ + src/tools/mac/symupload/minidump_upload.m \ + src/tools/mac/symupload/symupload.m \ + src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj \ + src/tools/solaris/dump_syms/Makefile \ + src/tools/solaris/dump_syms/dump_syms.cc \ + src/tools/solaris/dump_syms/run_regtest.sh \ + src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc \ + src/tools/solaris/dump_syms/testdata/dump_syms_regtest.o \ + src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs \ + src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym \ + src/tools/windows/converter/ms_symbol_server_converter.cc \ + src/tools/windows/converter/ms_symbol_server_converter.h \ + src/tools/windows/dump_syms/dump_syms.cc \ + src/tools/windows/dump_syms/run_regtest.sh \ + src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc \ + src/tools/windows/dump_syms/testdata/dump_syms_regtest.pdb \ + src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym \ + src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym \ + src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym \ + src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym \ + src/tools/windows/dump_syms/testdata/omap_stretched.sym \ + src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym \ + src/tools/windows/symupload/symupload.cc + +mostlyclean-local: + -find src -name '*.dwo' -exec rm -f {} + diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..0c47bf8 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,10322 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Copyright 2011 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ + +# This allows using fixed NDK headers when building for Android. +# This is only necessary for building the unit tests until GTest is upgraded +# to a future version. +@ANDROID_HOST_TRUE@am__append_1 = \ +@ANDROID_HOST_TRUE@ -I$(top_srcdir)/src/common/android/include \ +@ANDROID_HOST_TRUE@ -I$(top_srcdir)/src/common/android/testing/include + +# Build as PIC on Linux, for linux_client_unittest_shlib +@LINUX_HOST_TRUE@am__append_2 = -fPIC +@LINUX_HOST_TRUE@am__append_3 = -fPIC +libexec_PROGRAMS = $(am__EXEEXT_11) +bin_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) +check_PROGRAMS = src/common/safe_math_unittest$(EXEEXT) \ + $(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7) \ + $(am__EXEEXT_8) $(am__EXEEXT_9) $(am__EXEEXT_10) +noinst_PROGRAMS = +EXTRA_PROGRAMS = $(am__EXEEXT_1) + +# +# Tests helper library +# +@SYSTEM_TEST_LIBS_FALSE@am__append_4 = src/testing/libtesting.a + +# +# Breakpad minidump and microdump +# processor library, tools and tests +# +@DISABLE_PROCESSOR_FALSE@am__append_5 = src/libbreakpad.a +@DISABLE_PROCESSOR_FALSE@am__append_6 = breakpad.pc +@DISABLE_PROCESSOR_FALSE@am__append_7 = src/third_party/libdisasm/libdisasm.a +@DISABLE_PROCESSOR_FALSE@am__append_8 = \ +@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_stackwalk \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk + +@DISABLE_PROCESSOR_FALSE@am__append_9 = \ +@DISABLE_PROCESSOR_FALSE@ src/common/test_assembler_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader_lineinfo_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader_splitfunctions_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/address_map_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_truncate_lower_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_truncate_upper_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips64_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86_unittest \ +@DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump_unittest + +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@am__append_10 = \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@ src/processor/disassembler_objdump_unittest \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe_unittest \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile_unittest + +@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@am__append_11 = \ +@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@ src/processor/stackwalker_selftest + + +# +# Breakpad client library and tests +# +# Currently Linux only, the macOS client +# is built using an Xcode project instead. +# +@LINUX_HOST_TRUE@am__append_12 = src/client/linux/libbreakpad_client.a +@LINUX_HOST_TRUE@am__append_13 = breakpad-client.pc +@LINUX_HOST_TRUE@am__append_14 = \ +@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest \ +@LINUX_HOST_TRUE@ src/common/linux/google_crashdump_uploader_test + +@LINUX_HOST_TRUE@am__append_15 = \ +@LINUX_HOST_TRUE@ src/client/linux/linux_dumper_unittest_helper \ +@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest_shlib + +@LINUX_HOST_TRUE@am__append_16 = \ +@LINUX_HOST_TRUE@ src/client/linux/linux_dumper_unittest_helper \ +@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest_shlib + + +# +# Various Breakpad tools +# This includes symbol dumpers and uploaders +# +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__append_17 = \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/core2md/core2md \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/pid2md/pid2md \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/dump_syms/dump_syms \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump-2-core \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/minidump_upload \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/sym_upload + +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@am__append_18 = \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@ src/tools/mac/dump_syms/dump_syms_mac + +@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@am__append_19 = \ +@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@ src/tools/linux/core_handler/core_handler + +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__append_20 = \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dumper_unittest \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump_2_core_unittest + +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@am__append_21 = \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@ src/common/mac/macho_reader_unittest + +@LINUX_HOST_TRUE@am__append_22 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.h \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.cc \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.h \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.cc \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.h \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.cc + +@HAVE_GETCONTEXT_FALSE@am__append_23 = \ +@HAVE_GETCONTEXT_FALSE@ src/common/linux/breakpad_getcontext.S + +@HAVE_GETCONTEXT_FALSE@am__append_24 = \ +@HAVE_GETCONTEXT_FALSE@ src/common/linux/breakpad_getcontext.S \ +@HAVE_GETCONTEXT_FALSE@ src/common/linux/breakpad_getcontext_unittest.cc +@ANDROID_HOST_TRUE@am__append_25 = \ +@ANDROID_HOST_TRUE@ -llog -lm + +@ANDROID_HOST_TRUE@am__append_26 = \ +@ANDROID_HOST_TRUE@ -llog + +@LINUX_HOST_TRUE@am__append_27 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +@LINUX_HOST_TRUE@am__append_28 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +@LINUX_HOST_TRUE@am__append_29 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +@LINUX_HOST_TRUE@am__append_30 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +@LINUX_HOST_TRUE@am__append_31 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +@LINUX_HOST_TRUE@am__append_32 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.o \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.o \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.o + +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_check_define.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(dist_doc_DATA) $(includec_HEADERS) \ + $(am__includecl_HEADERS_DIST) $(am__includeclc_HEADERS_DIST) \ + $(am__includecldwc_HEADERS_DIST) \ + $(am__includeclh_HEADERS_DIST) $(am__includeclm_HEADERS_DIST) \ + $(includegbc_HEADERS) $(am__includelss_HEADERS_DIST) \ + $(includep_HEADERS) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/src/config.h +CONFIG_CLEAN_FILES = breakpad.pc breakpad-client.pc +CONFIG_CLEAN_VPATH_FILES = +@LINUX_HOST_TRUE@am__EXEEXT_1 = src/client/linux/linux_dumper_unittest_helper$(EXEEXT) \ +@LINUX_HOST_TRUE@ src/client/linux/linux_client_unittest_shlib$(EXEEXT) +@DISABLE_PROCESSOR_FALSE@am__EXEEXT_2 = src/processor/microdump_stackwalk$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk$(EXEEXT) +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__EXEEXT_3 = src/tools/linux/core2md/core2md$(EXEEXT) \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/pid2md/pid2md$(EXEEXT) \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/dump_syms/dump_syms$(EXEEXT) \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump-2-core$(EXEEXT) \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/minidump_upload$(EXEEXT) \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/symupload/sym_upload$(EXEEXT) +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@am__EXEEXT_4 = src/tools/mac/dump_syms/dump_syms_mac$(EXEEXT) +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \ + "$(DESTDIR)$(libdir)" "$(DESTDIR)$(docdir)" \ + "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includecdir)" \ + "$(DESTDIR)$(includecldir)" "$(DESTDIR)$(includeclcdir)" \ + "$(DESTDIR)$(includecldwcdir)" "$(DESTDIR)$(includeclhdir)" \ + "$(DESTDIR)$(includeclmdir)" "$(DESTDIR)$(includegbcdir)" \ + "$(DESTDIR)$(includelssdir)" "$(DESTDIR)$(includepdir)" +@DISABLE_PROCESSOR_FALSE@am__EXEEXT_5 = src/common/test_assembler_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader_lineinfo_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/common/dwarf/dwarf2reader_splitfunctions_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/address_map_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/exploitability_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/fast_source_line_resolver_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/map_serializers_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_processor_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/static_address_map_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/static_contained_range_map_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/static_map_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/static_range_map_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/postfix_evaluator_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/proc_maps_linux_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_truncate_lower_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_truncate_upper_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/range_map_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm64_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_address_list_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_mips64_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_riscv64_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_x86_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/synth_minidump_unittest$(EXEEXT) +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@am__EXEEXT_6 = src/processor/disassembler_objdump_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe_unittest$(EXEEXT) \ +@DISABLE_PROCESSOR_FALSE@@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile_unittest$(EXEEXT) +@DISABLE_PROCESSOR_FALSE@@SELFTEST_TRUE@am__EXEEXT_7 = src/processor/stackwalker_selftest$(EXEEXT) +@LINUX_HOST_TRUE@am__EXEEXT_8 = src/client/linux/linux_client_unittest$(EXEEXT) \ +@LINUX_HOST_TRUE@ src/common/linux/google_crashdump_uploader_test$(EXEEXT) +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am__EXEEXT_9 = src/common/dumper_unittest$(EXEEXT) \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT) +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@@X86_HOST_TRUE@am__EXEEXT_10 = src/common/mac/macho_reader_unittest$(EXEEXT) +@DISABLE_TOOLS_FALSE@@HAVE_MEMFD_CREATE_TRUE@@LINUX_HOST_TRUE@am__EXEEXT_11 = src/tools/linux/core_handler/core_handler$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) $(noinst_PROGRAMS) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +LIBRARIES = $(lib_LIBRARIES) $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +src_client_linux_libbreakpad_client_a_AR = $(AR) $(ARFLAGS) +src_client_linux_libbreakpad_client_a_LIBADD = +am__src_client_linux_libbreakpad_client_a_SOURCES_DIST = \ + src/client/linux/crash_generation/crash_generation_client.cc \ + src/client/linux/crash_generation/crash_generation_server.cc \ + src/client/linux/dump_writer_common/thread_info.cc \ + src/client/linux/dump_writer_common/ucontext_reader.cc \ + src/client/linux/handler/exception_handler.cc \ + src/client/linux/handler/exception_handler.h \ + src/client/linux/handler/minidump_descriptor.cc \ + src/client/linux/handler/minidump_descriptor.h \ + src/client/linux/log/log.cc src/client/linux/log/log.h \ + src/client/linux/microdump_writer/microdump_writer.cc \ + src/client/linux/microdump_writer/microdump_writer.h \ + src/client/linux/minidump_writer/linux_core_dumper.cc \ + src/client/linux/minidump_writer/linux_dumper.cc \ + src/client/linux/minidump_writer/linux_ptrace_dumper.cc \ + src/client/linux/minidump_writer/minidump_writer.cc \ + src/client/linux/minidump_writer/pe_file.cc \ + src/client/minidump_file_writer-inl.h \ + src/client/minidump_file_writer.cc \ + src/client/minidump_file_writer.h src/common/convert_UTF.cc \ + src/common/convert_UTF.h src/common/md5.cc src/common/md5.h \ + src/common/string_conversion.cc src/common/string_conversion.h \ + src/common/linux/elf_core_dump.cc src/common/linux/elfutils.cc \ + src/common/linux/elfutils.h src/common/linux/file_id.cc \ + src/common/linux/file_id.h src/common/linux/guid_creator.cc \ + src/common/linux/guid_creator.h \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/safe_readlink.cc \ + src/common/linux/breakpad_getcontext.S +am__dirstamp = $(am__leading_dot)dirstamp +@HAVE_GETCONTEXT_FALSE@am__objects_1 = src/common/linux/breakpad_getcontext.$(OBJEXT) +am_src_client_linux_libbreakpad_client_a_OBJECTS = src/client/linux/crash_generation/crash_generation_client.$(OBJEXT) \ + src/client/linux/crash_generation/crash_generation_server.$(OBJEXT) \ + src/client/linux/dump_writer_common/thread_info.$(OBJEXT) \ + src/client/linux/dump_writer_common/ucontext_reader.$(OBJEXT) \ + src/client/linux/handler/exception_handler.$(OBJEXT) \ + src/client/linux/handler/minidump_descriptor.$(OBJEXT) \ + src/client/linux/log/log.$(OBJEXT) \ + src/client/linux/microdump_writer/microdump_writer.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_core_dumper.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_dumper.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_ptrace_dumper.$(OBJEXT) \ + src/client/linux/minidump_writer/minidump_writer.$(OBJEXT) \ + src/client/linux/minidump_writer/pe_file.$(OBJEXT) \ + src/client/minidump_file_writer.$(OBJEXT) \ + src/common/convert_UTF.$(OBJEXT) src/common/md5.$(OBJEXT) \ + src/common/string_conversion.$(OBJEXT) \ + src/common/linux/elf_core_dump.$(OBJEXT) \ + src/common/linux/elfutils.$(OBJEXT) \ + src/common/linux/file_id.$(OBJEXT) \ + src/common/linux/guid_creator.$(OBJEXT) \ + src/common/linux/linux_libc_support.$(OBJEXT) \ + src/common/linux/memory_mapped_file.$(OBJEXT) \ + src/common/linux/safe_readlink.$(OBJEXT) $(am__objects_1) +src_client_linux_libbreakpad_client_a_OBJECTS = \ + $(am_src_client_linux_libbreakpad_client_a_OBJECTS) +src_libbreakpad_a_AR = $(AR) $(ARFLAGS) +src_libbreakpad_a_LIBADD = +am__src_libbreakpad_a_SOURCES_DIST = \ + src/google_breakpad/common/breakpad_types.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_size.h \ + src/google_breakpad/processor/basic_source_line_resolver.h \ + src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/dump_context.h \ + src/google_breakpad/processor/dump_object.h \ + src/google_breakpad/processor/exploitability.h \ + src/google_breakpad/processor/fast_source_line_resolver.h \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/processor/microdump.h \ + src/google_breakpad/processor/microdump_processor.h \ + src/google_breakpad/processor/minidump.h \ + src/google_breakpad/processor/minidump_processor.h \ + src/google_breakpad/processor/process_result.h \ + src/google_breakpad/processor/process_state.h \ + src/google_breakpad/processor/proc_maps_linux.h \ + src/google_breakpad/processor/source_line_resolver_base.h \ + src/google_breakpad/processor/source_line_resolver_interface.h \ + src/google_breakpad/processor/stack_frame.h \ + src/google_breakpad/processor/stack_frame_cpu.h \ + src/google_breakpad/processor/stack_frame_symbolizer.h \ + src/google_breakpad/processor/stackwalker.h \ + src/google_breakpad/processor/symbol_supplier.h \ + src/google_breakpad/processor/system_info.h \ + src/processor/address_map-inl.h src/processor/address_map.h \ + src/processor/basic_code_module.h \ + src/processor/basic_code_modules.cc \ + src/processor/basic_code_modules.h \ + src/processor/basic_source_line_resolver_types.h \ + src/processor/basic_source_line_resolver.cc \ + src/processor/call_stack.cc src/processor/cfi_frame_info.cc \ + src/processor/cfi_frame_info.h \ + src/processor/contained_range_map-inl.h \ + src/processor/contained_range_map.h \ + src/processor/convert_old_arm64_context.cc \ + src/processor/convert_old_arm64_context.h \ + src/processor/disassembler_x86.h \ + src/processor/disassembler_x86.cc \ + src/processor/dump_context.cc src/processor/dump_object.cc \ + src/processor/exploitability.cc \ + src/processor/exploitability_linux.h \ + src/processor/exploitability_linux.cc \ + src/processor/exploitability_win.h \ + src/processor/exploitability_win.cc \ + src/processor/fast_source_line_resolver_types.h \ + src/processor/fast_source_line_resolver.cc \ + src/processor/linked_ptr.h src/processor/logging.h \ + src/processor/logging.cc src/processor/map_serializers-inl.h \ + src/processor/map_serializers.h src/processor/microdump.cc \ + src/processor/microdump_processor.cc src/processor/minidump.cc \ + src/processor/minidump_processor.cc \ + src/processor/module_comparer.cc \ + src/processor/module_comparer.h src/processor/module_factory.h \ + src/processor/module_serializer.cc \ + src/processor/module_serializer.h \ + src/processor/pathname_stripper.cc \ + src/processor/pathname_stripper.h \ + src/processor/postfix_evaluator-inl.h \ + src/processor/postfix_evaluator.h \ + src/processor/process_state.cc \ + src/processor/proc_maps_linux.cc src/processor/range_map-inl.h \ + src/processor/range_map.h \ + src/processor/simple_serializer-inl.h \ + src/processor/simple_serializer.h \ + src/processor/simple_symbol_supplier.cc \ + src/processor/simple_symbol_supplier.h \ + src/processor/windows_frame_info.h \ + src/processor/source_line_resolver_base_types.h \ + src/processor/source_line_resolver_base.cc \ + src/processor/stack_frame_cpu.cc \ + src/processor/stack_frame_symbolizer.cc \ + src/processor/stackwalk_common.cc \ + src/processor/stackwalk_common.h src/processor/stackwalker.cc \ + src/processor/stackwalker_amd64.cc \ + src/processor/stackwalker_amd64.h \ + src/processor/stackwalker_arm.cc \ + src/processor/stackwalker_arm.h \ + src/processor/stackwalker_arm64.cc \ + src/processor/stackwalker_arm64.h \ + src/processor/stackwalker_address_list.cc \ + src/processor/stackwalker_address_list.h \ + src/processor/stackwalker_mips.cc \ + src/processor/stackwalker_mips.h \ + src/processor/stackwalker_ppc.cc \ + src/processor/stackwalker_ppc.h \ + src/processor/stackwalker_ppc64.cc \ + src/processor/stackwalker_ppc64.h \ + src/processor/stackwalker_riscv.cc \ + src/processor/stackwalker_riscv.h \ + src/processor/stackwalker_riscv64.cc \ + src/processor/stackwalker_riscv64.h \ + src/processor/stackwalker_sparc.cc \ + src/processor/stackwalker_sparc.h \ + src/processor/stackwalker_x86.cc \ + src/processor/stackwalker_x86.h \ + src/processor/static_address_map-inl.h \ + src/processor/static_address_map.h \ + src/processor/static_contained_range_map-inl.h \ + src/processor/static_contained_range_map.h \ + src/processor/static_map_iterator-inl.h \ + src/processor/static_map_iterator.h \ + src/processor/static_map-inl.h src/processor/static_map.h \ + src/processor/static_range_map-inl.h \ + src/processor/static_range_map.h \ + src/processor/symbolic_constants_win.cc \ + src/processor/symbolic_constants_win.h \ + src/processor/tokenize.cc src/processor/tokenize.h \ + src/common/linux/scoped_pipe.h src/common/linux/scoped_pipe.cc \ + src/common/linux/scoped_tmpfile.h \ + src/common/linux/scoped_tmpfile.cc \ + src/processor/disassembler_objdump.h \ + src/processor/disassembler_objdump.cc +@LINUX_HOST_TRUE@am__objects_2 = \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_pipe.$(OBJEXT) \ +@LINUX_HOST_TRUE@ src/common/linux/scoped_tmpfile.$(OBJEXT) \ +@LINUX_HOST_TRUE@ src/processor/disassembler_objdump.$(OBJEXT) +am_src_libbreakpad_a_OBJECTS = \ + src/processor/basic_code_modules.$(OBJEXT) \ + src/processor/basic_source_line_resolver.$(OBJEXT) \ + src/processor/call_stack.$(OBJEXT) \ + src/processor/cfi_frame_info.$(OBJEXT) \ + src/processor/convert_old_arm64_context.$(OBJEXT) \ + src/processor/disassembler_x86.$(OBJEXT) \ + src/processor/dump_context.$(OBJEXT) \ + src/processor/dump_object.$(OBJEXT) \ + src/processor/exploitability.$(OBJEXT) \ + src/processor/exploitability_linux.$(OBJEXT) \ + src/processor/exploitability_win.$(OBJEXT) \ + src/processor/fast_source_line_resolver.$(OBJEXT) \ + src/processor/logging.$(OBJEXT) \ + src/processor/microdump.$(OBJEXT) \ + src/processor/microdump_processor.$(OBJEXT) \ + src/processor/minidump.$(OBJEXT) \ + src/processor/minidump_processor.$(OBJEXT) \ + src/processor/module_comparer.$(OBJEXT) \ + src/processor/module_serializer.$(OBJEXT) \ + src/processor/pathname_stripper.$(OBJEXT) \ + src/processor/process_state.$(OBJEXT) \ + src/processor/proc_maps_linux.$(OBJEXT) \ + src/processor/simple_symbol_supplier.$(OBJEXT) \ + src/processor/source_line_resolver_base.$(OBJEXT) \ + src/processor/stack_frame_cpu.$(OBJEXT) \ + src/processor/stack_frame_symbolizer.$(OBJEXT) \ + src/processor/stackwalk_common.$(OBJEXT) \ + src/processor/stackwalker.$(OBJEXT) \ + src/processor/stackwalker_amd64.$(OBJEXT) \ + src/processor/stackwalker_arm.$(OBJEXT) \ + src/processor/stackwalker_arm64.$(OBJEXT) \ + src/processor/stackwalker_address_list.$(OBJEXT) \ + src/processor/stackwalker_mips.$(OBJEXT) \ + src/processor/stackwalker_ppc.$(OBJEXT) \ + src/processor/stackwalker_ppc64.$(OBJEXT) \ + src/processor/stackwalker_riscv.$(OBJEXT) \ + src/processor/stackwalker_riscv64.$(OBJEXT) \ + src/processor/stackwalker_sparc.$(OBJEXT) \ + src/processor/stackwalker_x86.$(OBJEXT) \ + src/processor/symbolic_constants_win.$(OBJEXT) \ + src/processor/tokenize.$(OBJEXT) $(am__objects_2) +src_libbreakpad_a_OBJECTS = $(am_src_libbreakpad_a_OBJECTS) +src_testing_libtesting_a_AR = $(AR) $(ARFLAGS) +src_testing_libtesting_a_LIBADD = +am__src_testing_libtesting_a_SOURCES_DIST = \ + src/breakpad_googletest_includes.h \ + src/testing/googletest/src/gtest-all.cc \ + src/testing/googletest/src/gtest_main.cc \ + src/testing/googlemock/src/gmock-all.cc +@SYSTEM_TEST_LIBS_FALSE@am_src_testing_libtesting_a_OBJECTS = src/testing/googletest/src/libtesting_a-gtest-all.$(OBJEXT) \ +@SYSTEM_TEST_LIBS_FALSE@ src/testing/googletest/src/libtesting_a-gtest_main.$(OBJEXT) \ +@SYSTEM_TEST_LIBS_FALSE@ src/testing/googlemock/src/libtesting_a-gmock-all.$(OBJEXT) +src_testing_libtesting_a_OBJECTS = \ + $(am_src_testing_libtesting_a_OBJECTS) +src_third_party_libdisasm_libdisasm_a_AR = $(AR) $(ARFLAGS) +src_third_party_libdisasm_libdisasm_a_LIBADD = +am_src_third_party_libdisasm_libdisasm_a_OBJECTS = \ + src/third_party/libdisasm/ia32_implicit.$(OBJEXT) \ + src/third_party/libdisasm/ia32_insn.$(OBJEXT) \ + src/third_party/libdisasm/ia32_invariant.$(OBJEXT) \ + src/third_party/libdisasm/ia32_modrm.$(OBJEXT) \ + src/third_party/libdisasm/ia32_opcode_tables.$(OBJEXT) \ + src/third_party/libdisasm/ia32_operand.$(OBJEXT) \ + src/third_party/libdisasm/ia32_reg.$(OBJEXT) \ + src/third_party/libdisasm/ia32_settings.$(OBJEXT) \ + src/third_party/libdisasm/x86_disasm.$(OBJEXT) \ + src/third_party/libdisasm/x86_format.$(OBJEXT) \ + src/third_party/libdisasm/x86_imm.$(OBJEXT) \ + src/third_party/libdisasm/x86_insn.$(OBJEXT) \ + src/third_party/libdisasm/x86_misc.$(OBJEXT) \ + src/third_party/libdisasm/x86_operand_list.$(OBJEXT) +src_third_party_libdisasm_libdisasm_a_OBJECTS = \ + $(am_src_third_party_libdisasm_libdisasm_a_OBJECTS) +am_src_client_linux_linux_client_unittest_OBJECTS = +src_client_linux_linux_client_unittest_OBJECTS = \ + $(am_src_client_linux_linux_client_unittest_OBJECTS) +am__DEPENDENCIES_1 = +@SYSTEM_TEST_LIBS_FALSE@am__DEPENDENCIES_2 = src/testing/libtesting.a +@SYSTEM_TEST_LIBS_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) \ +@SYSTEM_TEST_LIBS_TRUE@ $(am__DEPENDENCIES_1) +src_client_linux_linux_client_unittest_LINK = $(CCLD) $(AM_CFLAGS) \ + $(CFLAGS) $(src_client_linux_linux_client_unittest_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__src_client_linux_linux_client_unittest_shlib_SOURCES_DIST = \ + src/breakpad_googletest_includes.h \ + src/testing/googletest/src/gtest-all.cc \ + src/testing/googletest/src/gtest_main.cc \ + src/testing/googlemock/src/gmock-all.cc \ + src/client/linux/handler/exception_handler_unittest.cc \ + src/client/linux/microdump_writer/microdump_writer_unittest.cc \ + src/client/linux/minidump_writer/directory_reader_unittest.cc \ + src/client/linux/minidump_writer/cpu_set_unittest.cc \ + src/client/linux/minidump_writer/line_reader_unittest.cc \ + src/client/linux/minidump_writer/linux_core_dumper.cc \ + src/client/linux/minidump_writer/linux_core_dumper_unittest.cc \ + src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc \ + src/client/linux/minidump_writer/minidump_writer_unittest.cc \ + src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc \ + src/client/linux/minidump_writer/pe_file.cc \ + src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc \ + src/common/linux/elf_core_dump.cc \ + src/common/linux/linux_libc_support_unittest.cc \ + src/common/linux/scoped_pipe.h src/common/linux/scoped_pipe.cc \ + src/common/linux/scoped_tmpfile.h \ + src/common/linux/scoped_tmpfile.cc \ + src/common/linux/tests/crash_generator.cc \ + src/common/memory_allocator_unittest.cc \ + src/common/tests/auto_tempdir.h src/common/tests/file_utils.cc \ + src/common/tests/file_utils.h \ + src/processor/basic_code_modules.cc \ + src/processor/convert_old_arm64_context.cc \ + src/processor/dump_context.cc src/processor/dump_object.cc \ + src/processor/logging.cc src/processor/minidump.cc \ + src/processor/pathname_stripper.cc \ + src/processor/proc_maps_linux.cc \ + src/common/linux/breakpad_getcontext.S \ + src/common/linux/breakpad_getcontext_unittest.cc +@SYSTEM_TEST_LIBS_FALSE@am__objects_3 = src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.$(OBJEXT) \ +@SYSTEM_TEST_LIBS_FALSE@ src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.$(OBJEXT) \ +@SYSTEM_TEST_LIBS_FALSE@ src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.$(OBJEXT) +@HAVE_GETCONTEXT_FALSE@am__objects_4 = src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.$(OBJEXT) \ +@HAVE_GETCONTEXT_FALSE@ src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.$(OBJEXT) +am_src_client_linux_linux_client_unittest_shlib_OBJECTS = \ + $(am__objects_3) \ + src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.$(OBJEXT) \ + src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.$(OBJEXT) \ + src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.$(OBJEXT) \ + src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.$(OBJEXT) \ + src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.$(OBJEXT) \ + src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.$(OBJEXT) \ + src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.$(OBJEXT) \ + src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.$(OBJEXT) \ + src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.$(OBJEXT) \ + src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-dump_context.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-dump_object.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-logging.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-minidump.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.$(OBJEXT) \ + src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.$(OBJEXT) \ + $(am__objects_4) +src_client_linux_linux_client_unittest_shlib_OBJECTS = \ + $(am_src_client_linux_linux_client_unittest_shlib_OBJECTS) +src_client_linux_linux_client_unittest_shlib_LINK = $(CXXLD) \ + $(AM_CXXFLAGS) $(CXXFLAGS) \ + $(src_client_linux_linux_client_unittest_shlib_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_src_client_linux_linux_dumper_unittest_helper_OBJECTS = src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT) +src_client_linux_linux_dumper_unittest_helper_OBJECTS = \ + $(am_src_client_linux_linux_dumper_unittest_helper_OBJECTS) +src_client_linux_linux_dumper_unittest_helper_LDADD = $(LDADD) +src_client_linux_linux_dumper_unittest_helper_LINK = $(CXXLD) \ + $(src_client_linux_linux_dumper_unittest_helper_CXXFLAGS) \ + $(CXXFLAGS) \ + $(src_client_linux_linux_dumper_unittest_helper_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_src_common_dumper_unittest_OBJECTS = \ + src/common/dumper_unittest-byte_cursor_unittest.$(OBJEXT) \ + src/common/dumper_unittest-convert_UTF.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_cfi_to_module.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_cfi_to_module_unittest.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_cu_to_module.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_cu_to_module_unittest.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_line_to_module.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_line_to_module_unittest.$(OBJEXT) \ + src/common/dumper_unittest-dwarf_range_list_handler.$(OBJEXT) \ + src/common/dumper_unittest-language.$(OBJEXT) \ + src/common/dumper_unittest-memory_range_unittest.$(OBJEXT) \ + src/common/dumper_unittest-module.$(OBJEXT) \ + src/common/dumper_unittest-module_unittest.$(OBJEXT) \ + src/common/dumper_unittest-path_helper.$(OBJEXT) \ + src/common/dumper_unittest-stabs_reader.$(OBJEXT) \ + src/common/dumper_unittest-stabs_reader_unittest.$(OBJEXT) \ + src/common/dumper_unittest-stabs_to_module.$(OBJEXT) \ + src/common/dumper_unittest-stabs_to_module_unittest.$(OBJEXT) \ + src/common/dumper_unittest-string_conversion.$(OBJEXT) \ + src/common/dumper_unittest-string_conversion_unittest.$(OBJEXT) \ + src/common/dumper_unittest-test_assembler.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-bytereader.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-bytereader_unittest.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-cfi_assembler.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-dwarf2diehandler.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-dwarf2reader.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-elf_reader.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.$(OBJEXT) \ + src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-crc32.$(OBJEXT) \ + src/common/linux/dumper_unittest-dump_symbols.$(OBJEXT) \ + src/common/linux/dumper_unittest-dump_symbols_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-elf_core_dump.$(OBJEXT) \ + src/common/linux/dumper_unittest-elf_core_dump_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-elf_symbols_to_module.$(OBJEXT) \ + src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-elfutils.$(OBJEXT) \ + src/common/linux/dumper_unittest-file_id.$(OBJEXT) \ + src/common/linux/dumper_unittest-file_id_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-linux_libc_support.$(OBJEXT) \ + src/common/linux/dumper_unittest-memory_mapped_file.$(OBJEXT) \ + src/common/linux/dumper_unittest-memory_mapped_file_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-safe_readlink.$(OBJEXT) \ + src/common/linux/dumper_unittest-safe_readlink_unittest.$(OBJEXT) \ + src/common/linux/dumper_unittest-synth_elf.$(OBJEXT) \ + src/common/linux/dumper_unittest-synth_elf_unittest.$(OBJEXT) \ + src/common/linux/tests/dumper_unittest-crash_generator.$(OBJEXT) \ + src/common/tests/dumper_unittest-file_utils.$(OBJEXT) +src_common_dumper_unittest_OBJECTS = \ + $(am_src_common_dumper_unittest_OBJECTS) +src_common_dumper_unittest_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_common_dwarf_dwarf2reader_lineinfo_unittest_OBJECTS = src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.$(OBJEXT) +src_common_dwarf_dwarf2reader_lineinfo_unittest_OBJECTS = \ + $(am_src_common_dwarf_dwarf2reader_lineinfo_unittest_OBJECTS) +src_common_dwarf_dwarf2reader_lineinfo_unittest_DEPENDENCIES = \ + src/common/dwarf/bytereader.o src/common/dwarf/dwarf2reader.o \ + src/common/dwarf/elf_reader.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_common_dwarf_dwarf2reader_splitfunctions_unittest_OBJECTS = src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.$(OBJEXT) +src_common_dwarf_dwarf2reader_splitfunctions_unittest_OBJECTS = $(am_src_common_dwarf_dwarf2reader_splitfunctions_unittest_OBJECTS) +src_common_dwarf_dwarf2reader_splitfunctions_unittest_DEPENDENCIES = \ + src/common/dwarf/bytereader.o src/common/dwarf/dwarf2reader.o \ + src/common/dwarf/elf_reader.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_common_linux_google_crashdump_uploader_test_OBJECTS = src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.$(OBJEXT) \ + src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.$(OBJEXT) \ + src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.$(OBJEXT) +src_common_linux_google_crashdump_uploader_test_OBJECTS = \ + $(am_src_common_linux_google_crashdump_uploader_test_OBJECTS) +src_common_linux_google_crashdump_uploader_test_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_common_linux_scoped_pipe_unittest_OBJECTS = src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.$(OBJEXT) +src_common_linux_scoped_pipe_unittest_OBJECTS = \ + $(am_src_common_linux_scoped_pipe_unittest_OBJECTS) +src_common_linux_scoped_pipe_unittest_DEPENDENCIES = \ + src/common/linux/scoped_pipe.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_common_linux_scoped_tmpfile_unittest_OBJECTS = src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.$(OBJEXT) +src_common_linux_scoped_tmpfile_unittest_OBJECTS = \ + $(am_src_common_linux_scoped_tmpfile_unittest_OBJECTS) +src_common_linux_scoped_tmpfile_unittest_DEPENDENCIES = \ + src/common/linux/scoped_tmpfile.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_common_mac_macho_reader_unittest_OBJECTS = src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-dwarf_cu_to_module.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-dwarf_line_to_module.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-language.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-md5.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-module.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-path_helper.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-stabs_reader.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-stabs_to_module.$(OBJEXT) \ + src/common/mac_macho_reader_unittest-test_assembler.$(OBJEXT) \ + src/common/dwarf/mac_macho_reader_unittest-bytereader.$(OBJEXT) \ + src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.$(OBJEXT) \ + src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.$(OBJEXT) \ + src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.$(OBJEXT) \ + src/common/dwarf/mac_macho_reader_unittest-elf_reader.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-arch_utilities.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-file_id.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-macho_id.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-macho_reader.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-macho_reader_unittest.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-macho_utilities.$(OBJEXT) \ + src/common/mac/macho_reader_unittest-macho_walker.$(OBJEXT) \ + src/common/tests/mac_macho_reader_unittest-file_utils.$(OBJEXT) +src_common_mac_macho_reader_unittest_OBJECTS = \ + $(am_src_common_mac_macho_reader_unittest_OBJECTS) +src_common_mac_macho_reader_unittest_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_common_safe_math_unittest_OBJECTS = \ + src/common/safe_math_unittest-safe_math_unittest.$(OBJEXT) +src_common_safe_math_unittest_OBJECTS = \ + $(am_src_common_safe_math_unittest_OBJECTS) +src_common_safe_math_unittest_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_common_test_assembler_unittest_OBJECTS = \ + src/common/test_assembler_unittest-test_assembler.$(OBJEXT) \ + src/common/test_assembler_unittest-test_assembler_unittest.$(OBJEXT) +src_common_test_assembler_unittest_OBJECTS = \ + $(am_src_common_test_assembler_unittest_OBJECTS) +src_common_test_assembler_unittest_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_address_map_unittest_OBJECTS = \ + src/processor/address_map_unittest.$(OBJEXT) +src_processor_address_map_unittest_OBJECTS = \ + $(am_src_processor_address_map_unittest_OBJECTS) +src_processor_address_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o +am_src_processor_basic_source_line_resolver_unittest_OBJECTS = src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.$(OBJEXT) +src_processor_basic_source_line_resolver_unittest_OBJECTS = $(am_src_processor_basic_source_line_resolver_unittest_OBJECTS) +src_processor_basic_source_line_resolver_unittest_DEPENDENCIES = \ + src/processor/basic_source_line_resolver.o \ + src/processor/cfi_frame_info.o \ + src/processor/pathname_stripper.o src/processor/logging.o \ + src/processor/source_line_resolver_base.o \ + src/processor/tokenize.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_cfi_frame_info_unittest_OBJECTS = src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.$(OBJEXT) +src_processor_cfi_frame_info_unittest_OBJECTS = \ + $(am_src_processor_cfi_frame_info_unittest_OBJECTS) +src_processor_cfi_frame_info_unittest_DEPENDENCIES = \ + src/processor/cfi_frame_info.o src/processor/logging.o \ + src/processor/pathname_stripper.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_contained_range_map_unittest_OBJECTS = \ + src/processor/contained_range_map_unittest.$(OBJEXT) +src_processor_contained_range_map_unittest_OBJECTS = \ + $(am_src_processor_contained_range_map_unittest_OBJECTS) +src_processor_contained_range_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o +am_src_processor_disassembler_objdump_unittest_OBJECTS = src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.$(OBJEXT) +src_processor_disassembler_objdump_unittest_OBJECTS = \ + $(am_src_processor_disassembler_objdump_unittest_OBJECTS) +src_processor_disassembler_objdump_unittest_DEPENDENCIES = \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o \ + src/processor/dump_context.o src/processor/dump_object.o \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_disassembler_x86_unittest_OBJECTS = src/processor/disassembler_x86_unittest-disassembler_x86_unittest.$(OBJEXT) +src_processor_disassembler_x86_unittest_OBJECTS = \ + $(am_src_processor_disassembler_x86_unittest_OBJECTS) +src_processor_disassembler_x86_unittest_DEPENDENCIES = \ + src/processor/disassembler_x86.o \ + src/third_party/libdisasm/libdisasm.a $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_exploitability_unittest_OBJECTS = src/processor/exploitability_unittest-exploitability_unittest.$(OBJEXT) +src_processor_exploitability_unittest_OBJECTS = \ + $(am_src_processor_exploitability_unittest_OBJECTS) +src_processor_exploitability_unittest_DEPENDENCIES = \ + src/processor/convert_old_arm64_context.o \ + src/processor/minidump_processor.o \ + src/processor/process_state.o src/processor/disassembler_x86.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/dump_context.o src/processor/dump_object.o \ + src/processor/logging.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__append_27) +am_src_processor_fast_source_line_resolver_unittest_OBJECTS = src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.$(OBJEXT) +src_processor_fast_source_line_resolver_unittest_OBJECTS = $(am_src_processor_fast_source_line_resolver_unittest_OBJECTS) +src_processor_fast_source_line_resolver_unittest_DEPENDENCIES = \ + src/processor/fast_source_line_resolver.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/cfi_frame_info.o src/processor/module_comparer.o \ + src/processor/module_serializer.o \ + src/processor/pathname_stripper.o src/processor/logging.o \ + src/processor/source_line_resolver_base.o \ + src/processor/tokenize.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_map_serializers_unittest_OBJECTS = src/processor/map_serializers_unittest-map_serializers_unittest.$(OBJEXT) +src_processor_map_serializers_unittest_OBJECTS = \ + $(am_src_processor_map_serializers_unittest_OBJECTS) +src_processor_map_serializers_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_microdump_processor_unittest_OBJECTS = src/processor/microdump_processor_unittest-microdump_processor_unittest.$(OBJEXT) +src_processor_microdump_processor_unittest_OBJECTS = \ + $(am_src_processor_microdump_processor_unittest_OBJECTS) +src_processor_microdump_processor_unittest_DEPENDENCIES = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/cfi_frame_info.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/logging.o \ + src/processor/microdump.o src/processor/microdump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__append_28) +am_src_processor_microdump_stackwalk_OBJECTS = \ + src/processor/microdump_stackwalk.$(OBJEXT) +src_processor_microdump_stackwalk_OBJECTS = \ + $(am_src_processor_microdump_stackwalk_OBJECTS) +src_processor_microdump_stackwalk_DEPENDENCIES = \ + src/common/path_helper.o src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/cfi_frame_info.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/logging.o \ + src/processor/microdump.o src/processor/microdump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalk_common.o src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + src/third_party/libdisasm/libdisasm.a $(am__append_31) +am_src_processor_minidump_dump_OBJECTS = \ + src/processor/minidump_dump.$(OBJEXT) +src_processor_minidump_dump_OBJECTS = \ + $(am_src_processor_minidump_dump_OBJECTS) +src_processor_minidump_dump_DEPENDENCIES = src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/dump_context.o src/processor/dump_object.o \ + src/processor/logging.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o +am_src_processor_minidump_processor_unittest_OBJECTS = src/processor/minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT) +src_processor_minidump_processor_unittest_OBJECTS = \ + $(am_src_processor_minidump_processor_unittest_OBJECTS) +src_processor_minidump_processor_unittest_DEPENDENCIES = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump_processor.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o src/processor/proc_maps_linux.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__append_29) +am_src_processor_minidump_stackwalk_OBJECTS = \ + src/processor/minidump_stackwalk.$(OBJEXT) +src_processor_minidump_stackwalk_OBJECTS = \ + $(am_src_processor_minidump_stackwalk_OBJECTS) +src_processor_minidump_stackwalk_DEPENDENCIES = \ + src/common/path_helper.o src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump.o src/processor/minidump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o src/processor/proc_maps_linux.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalk_common.o src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(am__append_32) +am_src_processor_minidump_unittest_OBJECTS = src/common/processor_minidump_unittest-test_assembler.$(OBJEXT) \ + src/processor/minidump_unittest-minidump_unittest.$(OBJEXT) \ + src/processor/minidump_unittest-synth_minidump.$(OBJEXT) +src_processor_minidump_unittest_OBJECTS = \ + $(am_src_processor_minidump_unittest_OBJECTS) +src_processor_minidump_unittest_DEPENDENCIES = \ + src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/dump_context.o src/processor/dump_object.o \ + src/processor/logging.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_pathname_stripper_unittest_OBJECTS = \ + src/processor/pathname_stripper_unittest.$(OBJEXT) +src_processor_pathname_stripper_unittest_OBJECTS = \ + $(am_src_processor_pathname_stripper_unittest_OBJECTS) +src_processor_pathname_stripper_unittest_DEPENDENCIES = \ + src/processor/pathname_stripper.o $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_postfix_evaluator_unittest_OBJECTS = \ + src/processor/postfix_evaluator_unittest.$(OBJEXT) +src_processor_postfix_evaluator_unittest_OBJECTS = \ + $(am_src_processor_postfix_evaluator_unittest_OBJECTS) +src_processor_postfix_evaluator_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_proc_maps_linux_unittest_OBJECTS = src/processor/proc_maps_linux_unittest-proc_maps_linux.$(OBJEXT) \ + src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.$(OBJEXT) +src_processor_proc_maps_linux_unittest_OBJECTS = \ + $(am_src_processor_proc_maps_linux_unittest_OBJECTS) +src_processor_proc_maps_linux_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + src/third_party/libdisasm/libdisasm.a $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_range_map_truncate_lower_unittest_OBJECTS = src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.$(OBJEXT) +src_processor_range_map_truncate_lower_unittest_OBJECTS = \ + $(am_src_processor_range_map_truncate_lower_unittest_OBJECTS) +src_processor_range_map_truncate_lower_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_range_map_truncate_upper_unittest_OBJECTS = src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.$(OBJEXT) +src_processor_range_map_truncate_upper_unittest_OBJECTS = \ + $(am_src_processor_range_map_truncate_upper_unittest_OBJECTS) +src_processor_range_map_truncate_upper_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_range_map_unittest_OBJECTS = \ + src/processor/range_map_unittest.$(OBJEXT) +src_processor_range_map_unittest_OBJECTS = \ + $(am_src_processor_range_map_unittest_OBJECTS) +src_processor_range_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_address_list_unittest_OBJECTS = src/common/processor_stackwalker_address_list_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.$(OBJEXT) +src_processor_stackwalker_address_list_unittest_OBJECTS = \ + $(am_src_processor_stackwalker_address_list_unittest_OBJECTS) +src_processor_stackwalker_address_list_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_amd64_unittest_OBJECTS = src/common/processor_stackwalker_amd64_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.$(OBJEXT) +src_processor_stackwalker_amd64_unittest_OBJECTS = \ + $(am_src_processor_stackwalker_amd64_unittest_OBJECTS) +src_processor_stackwalker_amd64_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_arm64_unittest_OBJECTS = src/common/processor_stackwalker_arm64_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.$(OBJEXT) +src_processor_stackwalker_arm64_unittest_OBJECTS = \ + $(am_src_processor_stackwalker_arm64_unittest_OBJECTS) +src_processor_stackwalker_arm64_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_arm_unittest_OBJECTS = src/common/processor_stackwalker_arm_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.$(OBJEXT) +src_processor_stackwalker_arm_unittest_OBJECTS = \ + $(am_src_processor_stackwalker_arm_unittest_OBJECTS) +src_processor_stackwalker_arm_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_mips64_unittest_OBJECTS = src/common/processor_stackwalker_mips64_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.$(OBJEXT) +src_processor_stackwalker_mips64_unittest_OBJECTS = \ + $(am_src_processor_stackwalker_mips64_unittest_OBJECTS) +src_processor_stackwalker_mips64_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_mips_unittest_OBJECTS = src/common/processor_stackwalker_mips_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.$(OBJEXT) +src_processor_stackwalker_mips_unittest_OBJECTS = \ + $(am_src_processor_stackwalker_mips_unittest_OBJECTS) +src_processor_stackwalker_mips_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_riscv64_unittest_OBJECTS = src/common/processor_stackwalker_riscv64_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.$(OBJEXT) +src_processor_stackwalker_riscv64_unittest_OBJECTS = \ + $(am_src_processor_stackwalker_riscv64_unittest_OBJECTS) +src_processor_stackwalker_riscv64_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_riscv_unittest_OBJECTS = src/common/processor_stackwalker_riscv_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.$(OBJEXT) +src_processor_stackwalker_riscv_unittest_OBJECTS = \ + $(am_src_processor_stackwalker_riscv_unittest_OBJECTS) +src_processor_stackwalker_riscv_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_stackwalker_selftest_OBJECTS = \ + src/processor/stackwalker_selftest.$(OBJEXT) +src_processor_stackwalker_selftest_OBJECTS = \ + $(am_src_processor_stackwalker_selftest_OBJECTS) +src_processor_stackwalker_selftest_DEPENDENCIES = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/disassembler_x86.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump.o src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(am__append_30) +am_src_processor_stackwalker_x86_unittest_OBJECTS = src/common/processor_stackwalker_x86_unittest-test_assembler.$(OBJEXT) \ + src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.$(OBJEXT) +src_processor_stackwalker_x86_unittest_OBJECTS = \ + $(am_src_processor_stackwalker_x86_unittest_OBJECTS) +src_processor_stackwalker_x86_unittest_DEPENDENCIES = \ + src/libbreakpad.a $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_static_address_map_unittest_OBJECTS = src/processor/static_address_map_unittest-static_address_map_unittest.$(OBJEXT) +src_processor_static_address_map_unittest_OBJECTS = \ + $(am_src_processor_static_address_map_unittest_OBJECTS) +src_processor_static_address_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_static_contained_range_map_unittest_OBJECTS = src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.$(OBJEXT) +src_processor_static_contained_range_map_unittest_OBJECTS = $(am_src_processor_static_contained_range_map_unittest_OBJECTS) +src_processor_static_contained_range_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_static_map_unittest_OBJECTS = src/processor/static_map_unittest-static_map_unittest.$(OBJEXT) +src_processor_static_map_unittest_OBJECTS = \ + $(am_src_processor_static_map_unittest_OBJECTS) +src_processor_static_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_static_range_map_unittest_OBJECTS = src/processor/static_range_map_unittest-static_range_map_unittest.$(OBJEXT) +src_processor_static_range_map_unittest_OBJECTS = \ + $(am_src_processor_static_range_map_unittest_OBJECTS) +src_processor_static_range_map_unittest_DEPENDENCIES = \ + src/processor/logging.o src/processor/pathname_stripper.o \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_processor_synth_minidump_unittest_OBJECTS = src/common/processor_synth_minidump_unittest-test_assembler.$(OBJEXT) \ + src/processor/synth_minidump_unittest-synth_minidump_unittest.$(OBJEXT) \ + src/processor/synth_minidump_unittest-synth_minidump.$(OBJEXT) +src_processor_synth_minidump_unittest_OBJECTS = \ + $(am_src_processor_synth_minidump_unittest_OBJECTS) +src_processor_synth_minidump_unittest_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_tools_linux_core2md_core2md_OBJECTS = \ + src/tools/linux/core2md/core2md.$(OBJEXT) +src_tools_linux_core2md_core2md_OBJECTS = \ + $(am_src_tools_linux_core2md_core2md_OBJECTS) +src_tools_linux_core2md_core2md_DEPENDENCIES = \ + src/client/linux/libbreakpad_client.a src/common/path_helper.o +am_src_tools_linux_core_handler_core_handler_OBJECTS = \ + src/tools/linux/core_handler/core_handler.$(OBJEXT) +src_tools_linux_core_handler_core_handler_OBJECTS = \ + $(am_src_tools_linux_core_handler_core_handler_OBJECTS) +src_tools_linux_core_handler_core_handler_DEPENDENCIES = \ + src/client/linux/libbreakpad_client.a src/common/path_helper.o +am_src_tools_linux_dump_syms_dump_syms_OBJECTS = src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-language.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-module.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-path_helper.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-stabs_reader.$(OBJEXT) \ + src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.$(OBJEXT) \ + src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.$(OBJEXT) \ + src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.$(OBJEXT) \ + src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.$(OBJEXT) \ + src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-crc32.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-file_id.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.$(OBJEXT) \ + src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.$(OBJEXT) \ + src/tools/linux/dump_syms/dump_syms-dump_syms.$(OBJEXT) +src_tools_linux_dump_syms_dump_syms_OBJECTS = \ + $(am_src_tools_linux_dump_syms_dump_syms_OBJECTS) +src_tools_linux_dump_syms_dump_syms_DEPENDENCIES = \ + $(am__DEPENDENCIES_1) +src_tools_linux_dump_syms_dump_syms_LINK = $(CXXLD) \ + $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_src_tools_linux_md2core_minidump_2_core_OBJECTS = \ + src/common/linux/memory_mapped_file.$(OBJEXT) \ + src/common/path_helper.$(OBJEXT) \ + src/tools/linux/md2core/minidump-2-core.$(OBJEXT) +src_tools_linux_md2core_minidump_2_core_OBJECTS = \ + $(am_src_tools_linux_md2core_minidump_2_core_OBJECTS) +src_tools_linux_md2core_minidump_2_core_LDADD = $(LDADD) +am_src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS = src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.$(OBJEXT) +src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS = $(am_src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) +src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_src_tools_linux_pid2md_pid2md_OBJECTS = \ + src/tools/linux/pid2md/pid2md.$(OBJEXT) +src_tools_linux_pid2md_pid2md_OBJECTS = \ + $(am_src_tools_linux_pid2md_pid2md_OBJECTS) +src_tools_linux_pid2md_pid2md_DEPENDENCIES = \ + src/client/linux/libbreakpad_client.a src/common/path_helper.o +am_src_tools_linux_symupload_minidump_upload_OBJECTS = \ + src/common/linux/http_upload.$(OBJEXT) \ + src/common/path_helper.$(OBJEXT) \ + src/tools/linux/symupload/minidump_upload.$(OBJEXT) +src_tools_linux_symupload_minidump_upload_OBJECTS = \ + $(am_src_tools_linux_symupload_minidump_upload_OBJECTS) +src_tools_linux_symupload_minidump_upload_DEPENDENCIES = +am_src_tools_linux_symupload_sym_upload_OBJECTS = \ + src/common/linux/http_upload.$(OBJEXT) \ + src/common/linux/libcurl_wrapper.$(OBJEXT) \ + src/common/linux/symbol_collector_client.$(OBJEXT) \ + src/common/linux/symbol_upload.$(OBJEXT) \ + src/common/path_helper.$(OBJEXT) \ + src/tools/linux/symupload/sym_upload.$(OBJEXT) +src_tools_linux_symupload_sym_upload_OBJECTS = \ + $(am_src_tools_linux_symupload_sym_upload_OBJECTS) +src_tools_linux_symupload_sym_upload_DEPENDENCIES = +am_src_tools_mac_dump_syms_dump_syms_mac_OBJECTS = src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-language.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-md5.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-module.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.$(OBJEXT) \ + src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.$(OBJEXT) \ + src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.$(OBJEXT) \ + src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.$(OBJEXT) \ + src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.$(OBJEXT) \ + src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.$(OBJEXT) \ + src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.$(OBJEXT) \ + src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.$(OBJEXT) +src_tools_mac_dump_syms_dump_syms_mac_OBJECTS = \ + $(am_src_tools_mac_dump_syms_dump_syms_mac_OBJECTS) +src_tools_mac_dump_syms_dump_syms_mac_DEPENDENCIES = \ + $(am__DEPENDENCIES_1) +src_tools_mac_dump_syms_dump_syms_mac_LINK = $(CXXLD) \ + $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SCRIPTS = $(noinst_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src +depcomp = $(SHELL) $(top_srcdir)/autotools/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = src/client/$(DEPDIR)/minidump_file_writer.Po \ + src/client/linux/crash_generation/$(DEPDIR)/crash_generation_client.Po \ + src/client/linux/crash_generation/$(DEPDIR)/crash_generation_server.Po \ + src/client/linux/dump_writer_common/$(DEPDIR)/thread_info.Po \ + src/client/linux/dump_writer_common/$(DEPDIR)/ucontext_reader.Po \ + src/client/linux/handler/$(DEPDIR)/exception_handler.Po \ + src/client/linux/handler/$(DEPDIR)/linux_client_unittest_shlib-exception_handler_unittest.Po \ + src/client/linux/handler/$(DEPDIR)/minidump_descriptor.Po \ + src/client/linux/log/$(DEPDIR)/log.Po \ + src/client/linux/microdump_writer/$(DEPDIR)/linux_client_unittest_shlib-microdump_writer_unittest.Po \ + src/client/linux/microdump_writer/$(DEPDIR)/microdump_writer.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-cpu_set_unittest.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-directory_reader_unittest.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-line_reader_unittest.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper_unittest.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest_utils.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-pe_file.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_core_dumper.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper_unittest_helper-linux_dumper_unittest_helper.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/linux_ptrace_dumper.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/minidump_writer.Po \ + src/client/linux/minidump_writer/$(DEPDIR)/pe_file.Po \ + src/common/$(DEPDIR)/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.Po \ + src/common/$(DEPDIR)/convert_UTF.Po \ + src/common/$(DEPDIR)/dumper_unittest-byte_cursor_unittest.Po \ + src/common/$(DEPDIR)/dumper_unittest-convert_UTF.Po \ + src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module.Po \ + src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module_unittest.Po \ + src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module.Po \ + src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module_unittest.Po \ + src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module.Po \ + src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module_unittest.Po \ + src/common/$(DEPDIR)/dumper_unittest-dwarf_range_list_handler.Po \ + src/common/$(DEPDIR)/dumper_unittest-language.Po \ + src/common/$(DEPDIR)/dumper_unittest-memory_range_unittest.Po \ + src/common/$(DEPDIR)/dumper_unittest-module.Po \ + src/common/$(DEPDIR)/dumper_unittest-module_unittest.Po \ + src/common/$(DEPDIR)/dumper_unittest-path_helper.Po \ + src/common/$(DEPDIR)/dumper_unittest-stabs_reader.Po \ + src/common/$(DEPDIR)/dumper_unittest-stabs_reader_unittest.Po \ + src/common/$(DEPDIR)/dumper_unittest-stabs_to_module.Po \ + src/common/$(DEPDIR)/dumper_unittest-stabs_to_module_unittest.Po \ + src/common/$(DEPDIR)/dumper_unittest-string_conversion.Po \ + src/common/$(DEPDIR)/dumper_unittest-string_conversion_unittest.Po \ + src/common/$(DEPDIR)/dumper_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Po \ + src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cu_to_module.Po \ + src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_line_to_module.Po \ + src/common/$(DEPDIR)/mac_macho_reader_unittest-language.Po \ + src/common/$(DEPDIR)/mac_macho_reader_unittest-md5.Po \ + src/common/$(DEPDIR)/mac_macho_reader_unittest-module.Po \ + src/common/$(DEPDIR)/mac_macho_reader_unittest-path_helper.Po \ + src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_reader.Po \ + src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_to_module.Po \ + src/common/$(DEPDIR)/mac_macho_reader_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/md5.Po \ + src/common/$(DEPDIR)/path_helper.Po \ + src/common/$(DEPDIR)/processor_minidump_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/processor_stackwalker_address_list_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/processor_stackwalker_amd64_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/processor_stackwalker_arm64_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/processor_stackwalker_arm_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/processor_stackwalker_mips64_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/processor_stackwalker_mips_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/processor_stackwalker_riscv64_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/processor_stackwalker_riscv_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/processor_stackwalker_x86_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/processor_synth_minidump_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/safe_math_unittest-safe_math_unittest.Po \ + src/common/$(DEPDIR)/string_conversion.Po \ + src/common/$(DEPDIR)/test_assembler_unittest-test_assembler.Po \ + src/common/$(DEPDIR)/test_assembler_unittest-test_assembler_unittest.Po \ + src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Po \ + src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Po \ + src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Po \ + src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Po \ + src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-language.Po \ + src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-module.Po \ + src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-path_helper.Po \ + src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_reader.Po \ + src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_to_module.Po \ + src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Po \ + src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Po \ + src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Po \ + src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Po \ + src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-language.Po \ + src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-md5.Po \ + src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-module.Po \ + src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-path_helper.Po \ + src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_reader.Po \ + src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.Po \ + src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader.Po \ + src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader_unittest.Po \ + src/common/dwarf/$(DEPDIR)/dumper_unittest-cfi_assembler.Po \ + src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler.Po \ + src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler_unittest.Po \ + src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader.Po \ + src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_cfi_unittest.Po \ + src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_die_unittest.Po \ + src/common/dwarf/$(DEPDIR)/dumper_unittest-elf_reader.Po \ + src/common/dwarf/$(DEPDIR)/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.Po \ + src/common/dwarf/$(DEPDIR)/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.Po \ + src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-bytereader.Po \ + src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-cfi_assembler.Po \ + src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2diehandler.Po \ + src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2reader.Po \ + src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-elf_reader.Po \ + src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-bytereader.Po \ + src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2diehandler.Po \ + src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2reader.Po \ + src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_reader.Po \ + src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-bytereader.Po \ + src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.Po \ + src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.Po \ + src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-elf_reader.Po \ + src/common/linux/$(DEPDIR)/breakpad_getcontext.Po \ + src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext.Po \ + src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Po \ + src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Po \ + src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po \ + src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po \ + src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump_unittest.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module_unittest.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-elfutils.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-file_id.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-file_id_unittest.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-linux_libc_support.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file_unittest.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink_unittest.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf.Po \ + src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf_unittest.Po \ + src/common/linux/$(DEPDIR)/elf_core_dump.Po \ + src/common/linux/$(DEPDIR)/elfutils.Po \ + src/common/linux/$(DEPDIR)/file_id.Po \ + src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader.Po \ + src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader_test.Po \ + src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-libcurl_wrapper.Po \ + src/common/linux/$(DEPDIR)/guid_creator.Po \ + src/common/linux/$(DEPDIR)/http_upload.Po \ + src/common/linux/$(DEPDIR)/libcurl_wrapper.Po \ + src/common/linux/$(DEPDIR)/linux_libc_support.Po \ + src/common/linux/$(DEPDIR)/memory_mapped_file.Po \ + src/common/linux/$(DEPDIR)/safe_readlink.Po \ + src/common/linux/$(DEPDIR)/scoped_pipe.Po \ + src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po \ + src/common/linux/$(DEPDIR)/scoped_tmpfile.Po \ + src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po \ + src/common/linux/$(DEPDIR)/symbol_collector_client.Po \ + src/common/linux/$(DEPDIR)/symbol_upload.Po \ + src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Po \ + src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dump_symbols.Po \ + src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.Po \ + src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elfutils.Po \ + src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-file_id.Po \ + src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-linux_libc_support.Po \ + src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-memory_mapped_file.Po \ + src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-safe_readlink.Po \ + src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Po \ + src/common/linux/tests/$(DEPDIR)/dumper_unittest-crash_generator.Po \ + src/common/mac/$(DEPDIR)/macho_reader_unittest-arch_utilities.Po \ + src/common/mac/$(DEPDIR)/macho_reader_unittest-file_id.Po \ + src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_id.Po \ + src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader.Po \ + src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader_unittest.Po \ + src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_utilities.Po \ + src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_walker.Po \ + src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-arch_utilities.Po \ + src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dump_syms.Po \ + src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-file_id.Po \ + src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_id.Po \ + src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_reader.Po \ + src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_utilities.Po \ + src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_walker.Po \ + src/common/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-file_utils.Po \ + src/common/tests/$(DEPDIR)/dumper_unittest-file_utils.Po \ + src/common/tests/$(DEPDIR)/mac_macho_reader_unittest-file_utils.Po \ + src/processor/$(DEPDIR)/address_map_unittest.Po \ + src/processor/$(DEPDIR)/basic_code_modules.Po \ + src/processor/$(DEPDIR)/basic_source_line_resolver.Po \ + src/processor/$(DEPDIR)/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Po \ + src/processor/$(DEPDIR)/call_stack.Po \ + src/processor/$(DEPDIR)/cfi_frame_info.Po \ + src/processor/$(DEPDIR)/cfi_frame_info_unittest-cfi_frame_info_unittest.Po \ + src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-basic_code_modules.Po \ + src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Po \ + src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_context.Po \ + src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_object.Po \ + src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-logging.Po \ + src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-minidump.Po \ + src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-pathname_stripper.Po \ + src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-proc_maps_linux.Po \ + src/processor/$(DEPDIR)/contained_range_map_unittest.Po \ + src/processor/$(DEPDIR)/convert_old_arm64_context.Po \ + src/processor/$(DEPDIR)/disassembler_objdump.Po \ + src/processor/$(DEPDIR)/disassembler_objdump_unittest-disassembler_objdump_unittest.Po \ + src/processor/$(DEPDIR)/disassembler_x86.Po \ + src/processor/$(DEPDIR)/disassembler_x86_unittest-disassembler_x86_unittest.Po \ + src/processor/$(DEPDIR)/dump_context.Po \ + src/processor/$(DEPDIR)/dump_object.Po \ + src/processor/$(DEPDIR)/exploitability.Po \ + src/processor/$(DEPDIR)/exploitability_linux.Po \ + src/processor/$(DEPDIR)/exploitability_unittest-exploitability_unittest.Po \ + src/processor/$(DEPDIR)/exploitability_win.Po \ + src/processor/$(DEPDIR)/fast_source_line_resolver.Po \ + src/processor/$(DEPDIR)/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.Po \ + src/processor/$(DEPDIR)/logging.Po \ + src/processor/$(DEPDIR)/map_serializers_unittest-map_serializers_unittest.Po \ + src/processor/$(DEPDIR)/microdump.Po \ + src/processor/$(DEPDIR)/microdump_processor.Po \ + src/processor/$(DEPDIR)/microdump_processor_unittest-microdump_processor_unittest.Po \ + src/processor/$(DEPDIR)/microdump_stackwalk.Po \ + src/processor/$(DEPDIR)/minidump.Po \ + src/processor/$(DEPDIR)/minidump_dump.Po \ + src/processor/$(DEPDIR)/minidump_processor.Po \ + src/processor/$(DEPDIR)/minidump_processor_unittest-minidump_processor_unittest.Po \ + src/processor/$(DEPDIR)/minidump_stackwalk.Po \ + src/processor/$(DEPDIR)/minidump_unittest-minidump_unittest.Po \ + src/processor/$(DEPDIR)/minidump_unittest-synth_minidump.Po \ + src/processor/$(DEPDIR)/module_comparer.Po \ + src/processor/$(DEPDIR)/module_serializer.Po \ + src/processor/$(DEPDIR)/pathname_stripper.Po \ + src/processor/$(DEPDIR)/pathname_stripper_unittest.Po \ + src/processor/$(DEPDIR)/postfix_evaluator_unittest.Po \ + src/processor/$(DEPDIR)/proc_maps_linux.Po \ + src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux.Po \ + src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux_unittest.Po \ + src/processor/$(DEPDIR)/process_state.Po \ + src/processor/$(DEPDIR)/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.Po \ + src/processor/$(DEPDIR)/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.Po \ + src/processor/$(DEPDIR)/range_map_unittest.Po \ + src/processor/$(DEPDIR)/simple_symbol_supplier.Po \ + src/processor/$(DEPDIR)/source_line_resolver_base.Po \ + src/processor/$(DEPDIR)/stack_frame_cpu.Po \ + src/processor/$(DEPDIR)/stack_frame_symbolizer.Po \ + src/processor/$(DEPDIR)/stackwalk_common.Po \ + src/processor/$(DEPDIR)/stackwalker.Po \ + src/processor/$(DEPDIR)/stackwalker_address_list.Po \ + src/processor/$(DEPDIR)/stackwalker_address_list_unittest-stackwalker_address_list_unittest.Po \ + src/processor/$(DEPDIR)/stackwalker_amd64.Po \ + src/processor/$(DEPDIR)/stackwalker_amd64_unittest-stackwalker_amd64_unittest.Po \ + src/processor/$(DEPDIR)/stackwalker_arm.Po \ + src/processor/$(DEPDIR)/stackwalker_arm64.Po \ + src/processor/$(DEPDIR)/stackwalker_arm64_unittest-stackwalker_arm64_unittest.Po \ + src/processor/$(DEPDIR)/stackwalker_arm_unittest-stackwalker_arm_unittest.Po \ + src/processor/$(DEPDIR)/stackwalker_mips.Po \ + src/processor/$(DEPDIR)/stackwalker_mips64_unittest-stackwalker_mips64_unittest.Po \ + src/processor/$(DEPDIR)/stackwalker_mips_unittest-stackwalker_mips_unittest.Po \ + src/processor/$(DEPDIR)/stackwalker_ppc.Po \ + src/processor/$(DEPDIR)/stackwalker_ppc64.Po \ + src/processor/$(DEPDIR)/stackwalker_riscv.Po \ + src/processor/$(DEPDIR)/stackwalker_riscv64.Po \ + src/processor/$(DEPDIR)/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.Po \ + src/processor/$(DEPDIR)/stackwalker_riscv_unittest-stackwalker_riscv_unittest.Po \ + src/processor/$(DEPDIR)/stackwalker_selftest.Po \ + src/processor/$(DEPDIR)/stackwalker_sparc.Po \ + src/processor/$(DEPDIR)/stackwalker_x86.Po \ + src/processor/$(DEPDIR)/stackwalker_x86_unittest-stackwalker_x86_unittest.Po \ + src/processor/$(DEPDIR)/static_address_map_unittest-static_address_map_unittest.Po \ + src/processor/$(DEPDIR)/static_contained_range_map_unittest-static_contained_range_map_unittest.Po \ + src/processor/$(DEPDIR)/static_map_unittest-static_map_unittest.Po \ + src/processor/$(DEPDIR)/static_range_map_unittest-static_range_map_unittest.Po \ + src/processor/$(DEPDIR)/symbolic_constants_win.Po \ + src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump.Po \ + src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump_unittest.Po \ + src/processor/$(DEPDIR)/tokenize.Po \ + src/testing/googlemock/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gmock-all.Po \ + src/testing/googlemock/src/$(DEPDIR)/libtesting_a-gmock-all.Po \ + src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest-all.Po \ + src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest_main.Po \ + src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest-all.Po \ + src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest_main.Po \ + src/third_party/libdisasm/$(DEPDIR)/ia32_implicit.Po \ + src/third_party/libdisasm/$(DEPDIR)/ia32_insn.Po \ + src/third_party/libdisasm/$(DEPDIR)/ia32_invariant.Po \ + src/third_party/libdisasm/$(DEPDIR)/ia32_modrm.Po \ + src/third_party/libdisasm/$(DEPDIR)/ia32_opcode_tables.Po \ + src/third_party/libdisasm/$(DEPDIR)/ia32_operand.Po \ + src/third_party/libdisasm/$(DEPDIR)/ia32_reg.Po \ + src/third_party/libdisasm/$(DEPDIR)/ia32_settings.Po \ + src/third_party/libdisasm/$(DEPDIR)/x86_disasm.Po \ + src/third_party/libdisasm/$(DEPDIR)/x86_format.Po \ + src/third_party/libdisasm/$(DEPDIR)/x86_imm.Po \ + src/third_party/libdisasm/$(DEPDIR)/x86_insn.Po \ + src/third_party/libdisasm/$(DEPDIR)/x86_misc.Po \ + src/third_party/libdisasm/$(DEPDIR)/x86_operand_list.Po \ + src/tools/linux/core2md/$(DEPDIR)/core2md.Po \ + src/tools/linux/core_handler/$(DEPDIR)/core_handler.Po \ + src/tools/linux/dump_syms/$(DEPDIR)/dump_syms-dump_syms.Po \ + src/tools/linux/md2core/$(DEPDIR)/minidump-2-core.Po \ + src/tools/linux/md2core/$(DEPDIR)/minidump_2_core_unittest-minidump_memory_range_unittest.Po \ + src/tools/linux/pid2md/$(DEPDIR)/pid2md.Po \ + src/tools/linux/symupload/$(DEPDIR)/minidump_upload.Po \ + src/tools/linux/symupload/$(DEPDIR)/sym_upload.Po \ + src/tools/mac/dump_syms/$(DEPDIR)/dump_syms_mac-dump_syms_tool.Po +am__mv = mv -f +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +CPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) +AM_V_CPPAS = $(am__v_CPPAS_@AM_V@) +am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@) +am__v_CPPAS_0 = @echo " CPPAS " $@; +am__v_CPPAS_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(src_client_linux_libbreakpad_client_a_SOURCES) \ + $(src_libbreakpad_a_SOURCES) \ + $(src_testing_libtesting_a_SOURCES) \ + $(src_third_party_libdisasm_libdisasm_a_SOURCES) \ + $(src_client_linux_linux_client_unittest_SOURCES) \ + $(src_client_linux_linux_client_unittest_shlib_SOURCES) \ + $(src_client_linux_linux_dumper_unittest_helper_SOURCES) \ + $(src_common_dumper_unittest_SOURCES) \ + $(src_common_dwarf_dwarf2reader_lineinfo_unittest_SOURCES) \ + $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_SOURCES) \ + $(src_common_linux_google_crashdump_uploader_test_SOURCES) \ + $(src_common_linux_scoped_pipe_unittest_SOURCES) \ + $(src_common_linux_scoped_tmpfile_unittest_SOURCES) \ + $(src_common_mac_macho_reader_unittest_SOURCES) \ + $(src_common_safe_math_unittest_SOURCES) \ + $(src_common_test_assembler_unittest_SOURCES) \ + $(src_processor_address_map_unittest_SOURCES) \ + $(src_processor_basic_source_line_resolver_unittest_SOURCES) \ + $(src_processor_cfi_frame_info_unittest_SOURCES) \ + $(src_processor_contained_range_map_unittest_SOURCES) \ + $(src_processor_disassembler_objdump_unittest_SOURCES) \ + $(src_processor_disassembler_x86_unittest_SOURCES) \ + $(src_processor_exploitability_unittest_SOURCES) \ + $(src_processor_fast_source_line_resolver_unittest_SOURCES) \ + $(src_processor_map_serializers_unittest_SOURCES) \ + $(src_processor_microdump_processor_unittest_SOURCES) \ + $(src_processor_microdump_stackwalk_SOURCES) \ + $(src_processor_minidump_dump_SOURCES) \ + $(src_processor_minidump_processor_unittest_SOURCES) \ + $(src_processor_minidump_stackwalk_SOURCES) \ + $(src_processor_minidump_unittest_SOURCES) \ + $(src_processor_pathname_stripper_unittest_SOURCES) \ + $(src_processor_postfix_evaluator_unittest_SOURCES) \ + $(src_processor_proc_maps_linux_unittest_SOURCES) \ + $(src_processor_range_map_truncate_lower_unittest_SOURCES) \ + $(src_processor_range_map_truncate_upper_unittest_SOURCES) \ + $(src_processor_range_map_unittest_SOURCES) \ + $(src_processor_stackwalker_address_list_unittest_SOURCES) \ + $(src_processor_stackwalker_amd64_unittest_SOURCES) \ + $(src_processor_stackwalker_arm64_unittest_SOURCES) \ + $(src_processor_stackwalker_arm_unittest_SOURCES) \ + $(src_processor_stackwalker_mips64_unittest_SOURCES) \ + $(src_processor_stackwalker_mips_unittest_SOURCES) \ + $(src_processor_stackwalker_riscv64_unittest_SOURCES) \ + $(src_processor_stackwalker_riscv_unittest_SOURCES) \ + $(src_processor_stackwalker_selftest_SOURCES) \ + $(src_processor_stackwalker_x86_unittest_SOURCES) \ + $(src_processor_static_address_map_unittest_SOURCES) \ + $(src_processor_static_contained_range_map_unittest_SOURCES) \ + $(src_processor_static_map_unittest_SOURCES) \ + $(src_processor_static_range_map_unittest_SOURCES) \ + $(src_processor_synth_minidump_unittest_SOURCES) \ + $(src_tools_linux_core2md_core2md_SOURCES) \ + $(src_tools_linux_core_handler_core_handler_SOURCES) \ + $(src_tools_linux_dump_syms_dump_syms_SOURCES) \ + $(src_tools_linux_md2core_minidump_2_core_SOURCES) \ + $(src_tools_linux_md2core_minidump_2_core_unittest_SOURCES) \ + $(src_tools_linux_pid2md_pid2md_SOURCES) \ + $(src_tools_linux_symupload_minidump_upload_SOURCES) \ + $(src_tools_linux_symupload_sym_upload_SOURCES) \ + $(src_tools_mac_dump_syms_dump_syms_mac_SOURCES) +DIST_SOURCES = \ + $(am__src_client_linux_libbreakpad_client_a_SOURCES_DIST) \ + $(am__src_libbreakpad_a_SOURCES_DIST) \ + $(am__src_testing_libtesting_a_SOURCES_DIST) \ + $(src_third_party_libdisasm_libdisasm_a_SOURCES) \ + $(src_client_linux_linux_client_unittest_SOURCES) \ + $(am__src_client_linux_linux_client_unittest_shlib_SOURCES_DIST) \ + $(src_client_linux_linux_dumper_unittest_helper_SOURCES) \ + $(src_common_dumper_unittest_SOURCES) \ + $(src_common_dwarf_dwarf2reader_lineinfo_unittest_SOURCES) \ + $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_SOURCES) \ + $(src_common_linux_google_crashdump_uploader_test_SOURCES) \ + $(src_common_linux_scoped_pipe_unittest_SOURCES) \ + $(src_common_linux_scoped_tmpfile_unittest_SOURCES) \ + $(src_common_mac_macho_reader_unittest_SOURCES) \ + $(src_common_safe_math_unittest_SOURCES) \ + $(src_common_test_assembler_unittest_SOURCES) \ + $(src_processor_address_map_unittest_SOURCES) \ + $(src_processor_basic_source_line_resolver_unittest_SOURCES) \ + $(src_processor_cfi_frame_info_unittest_SOURCES) \ + $(src_processor_contained_range_map_unittest_SOURCES) \ + $(src_processor_disassembler_objdump_unittest_SOURCES) \ + $(src_processor_disassembler_x86_unittest_SOURCES) \ + $(src_processor_exploitability_unittest_SOURCES) \ + $(src_processor_fast_source_line_resolver_unittest_SOURCES) \ + $(src_processor_map_serializers_unittest_SOURCES) \ + $(src_processor_microdump_processor_unittest_SOURCES) \ + $(src_processor_microdump_stackwalk_SOURCES) \ + $(src_processor_minidump_dump_SOURCES) \ + $(src_processor_minidump_processor_unittest_SOURCES) \ + $(src_processor_minidump_stackwalk_SOURCES) \ + $(src_processor_minidump_unittest_SOURCES) \ + $(src_processor_pathname_stripper_unittest_SOURCES) \ + $(src_processor_postfix_evaluator_unittest_SOURCES) \ + $(src_processor_proc_maps_linux_unittest_SOURCES) \ + $(src_processor_range_map_truncate_lower_unittest_SOURCES) \ + $(src_processor_range_map_truncate_upper_unittest_SOURCES) \ + $(src_processor_range_map_unittest_SOURCES) \ + $(src_processor_stackwalker_address_list_unittest_SOURCES) \ + $(src_processor_stackwalker_amd64_unittest_SOURCES) \ + $(src_processor_stackwalker_arm64_unittest_SOURCES) \ + $(src_processor_stackwalker_arm_unittest_SOURCES) \ + $(src_processor_stackwalker_mips64_unittest_SOURCES) \ + $(src_processor_stackwalker_mips_unittest_SOURCES) \ + $(src_processor_stackwalker_riscv64_unittest_SOURCES) \ + $(src_processor_stackwalker_riscv_unittest_SOURCES) \ + $(src_processor_stackwalker_selftest_SOURCES) \ + $(src_processor_stackwalker_x86_unittest_SOURCES) \ + $(src_processor_static_address_map_unittest_SOURCES) \ + $(src_processor_static_contained_range_map_unittest_SOURCES) \ + $(src_processor_static_map_unittest_SOURCES) \ + $(src_processor_static_range_map_unittest_SOURCES) \ + $(src_processor_synth_minidump_unittest_SOURCES) \ + $(src_tools_linux_core2md_core2md_SOURCES) \ + $(src_tools_linux_core_handler_core_handler_SOURCES) \ + $(src_tools_linux_dump_syms_dump_syms_SOURCES) \ + $(src_tools_linux_md2core_minidump_2_core_SOURCES) \ + $(src_tools_linux_md2core_minidump_2_core_unittest_SOURCES) \ + $(src_tools_linux_pid2md_pid2md_SOURCES) \ + $(src_tools_linux_symupload_minidump_upload_SOURCES) \ + $(src_tools_linux_symupload_sym_upload_SOURCES) \ + $(src_tools_mac_dump_syms_dump_syms_mac_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(dist_doc_DATA) $(pkgconfig_DATA) +am__includecl_HEADERS_DIST = $(top_srcdir)/src/common/linux/*.h +am__includeclc_HEADERS_DIST = \ + $(top_srcdir)/src/client/linux/crash_generation/*.h +am__includecldwc_HEADERS_DIST = \ + $(top_srcdir)/src/client/linux/dump_writer_common/*.h +am__includeclh_HEADERS_DIST = \ + $(top_srcdir)/src/client/linux/handler/*.h +am__includeclm_HEADERS_DIST = \ + $(top_srcdir)/src/client/linux/minidump_writer/*.h +am__includelss_HEADERS_DIST = $(top_srcdir)/src/third_party/lss/*.h +HEADERS = $(includec_HEADERS) $(includecl_HEADERS) \ + $(includeclc_HEADERS) $(includecldwc_HEADERS) \ + $(includeclh_HEADERS) $(includeclm_HEADERS) \ + $(includegbc_HEADERS) $(includelss_HEADERS) \ + $(includep_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +AM_RECURSIVE_TARGETS = cscope check recheck +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/autotools/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(srcdir)/breakpad-client.pc.in $(srcdir)/breakpad.pc.in \ + $(top_srcdir)/autotools/ar-lib $(top_srcdir)/autotools/compile \ + $(top_srcdir)/autotools/config.guess \ + $(top_srcdir)/autotools/config.sub \ + $(top_srcdir)/autotools/depcomp \ + $(top_srcdir)/autotools/install-sh \ + $(top_srcdir)/autotools/missing \ + $(top_srcdir)/autotools/test-driver \ + $(top_srcdir)/src/config.h.in AUTHORS ChangeLog INSTALL NEWS \ + README.md autotools/ar-lib autotools/compile \ + autotools/config.guess autotools/config.sub autotools/depcomp \ + autotools/install-sh autotools/ltmain.sh autotools/missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +GMOCK_CFLAGS = @GMOCK_CFLAGS@ +GMOCK_LIBS = @GMOCK_LIBS@ +GTEST_CFLAGS = @GTEST_CFLAGS@ +GTEST_LIBS = @GTEST_LIBS@ +HAVE_CXX17 = @HAVE_CXX17@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +RUSTC_DEMANGLE_CFLAGS = @RUSTC_DEMANGLE_CFLAGS@ +RUSTC_DEMANGLE_LIBS = @RUSTC_DEMANGLE_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WARN_CXXFLAGS = @WARN_CXXFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = $(prefix)/share/doc/$(PACKAGE)-$(VERSION) +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# This allows #includes to be relative to src/ +AM_CPPFLAGS = -I$(top_srcdir)/src +AM_CFLAGS = $(am__append_2) +AM_CXXFLAGS = $(am__append_1) $(WARN_CXXFLAGS) $(am__append_3) + +# Specify include paths for ac macros +ACLOCAL_AMFLAGS = -I m4 + +# License file is called LICENSE not COPYING +AUTOMAKE_OPTIONS = foreign +dist_doc_DATA = \ + AUTHORS \ + ChangeLog \ + INSTALL \ + LICENSE \ + NEWS \ + README.md + +@LINUX_HOST_TRUE@includeclhdir = $(includedir)/$(PACKAGE)/client/linux/handler +@LINUX_HOST_TRUE@includeclh_HEADERS = $(top_srcdir)/src/client/linux/handler/*.h +@LINUX_HOST_TRUE@includecldwcdir = $(includedir)/$(PACKAGE)/client/linux/dump_writer_common +@LINUX_HOST_TRUE@includecldwc_HEADERS = $(top_srcdir)/src/client/linux/dump_writer_common/*.h +@LINUX_HOST_TRUE@includeclmdir = $(includedir)/$(PACKAGE)/client/linux/minidump_writer +@LINUX_HOST_TRUE@includeclm_HEADERS = $(top_srcdir)/src/client/linux/minidump_writer/*.h +@LINUX_HOST_TRUE@includeclcdir = $(includedir)/$(PACKAGE)/client/linux/crash_generation +@LINUX_HOST_TRUE@includeclc_HEADERS = $(top_srcdir)/src/client/linux/crash_generation/*.h +@LINUX_HOST_TRUE@includelssdir = $(includedir)/$(PACKAGE)/third_party/lss +@LINUX_HOST_TRUE@includelss_HEADERS = $(top_srcdir)/src/third_party/lss/*.h +@LINUX_HOST_TRUE@includecldir = $(includedir)/$(PACKAGE)/common/linux +@LINUX_HOST_TRUE@includecl_HEADERS = $(top_srcdir)/src/common/linux/*.h +includegbcdir = $(includedir)/$(PACKAGE)/google_breakpad/common +includegbc_HEADERS = $(top_srcdir)/src/google_breakpad/common/*.h +includecdir = $(includedir)/$(PACKAGE)/common +includec_HEADERS = $(top_srcdir)/src/common/*.h +includepdir = $(includedir)/$(PACKAGE)/processor +includep_HEADERS = $(top_srcdir)/src/processor/*.h +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = $(am__append_6) $(am__append_13) +@SYSTEM_TEST_LIBS_FALSE@TEST_CFLAGS = \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/include \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googletest/include \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googletest \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googlemock/include \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing/googlemock \ +@SYSTEM_TEST_LIBS_FALSE@ -I$(top_srcdir)/src/testing + +@SYSTEM_TEST_LIBS_TRUE@TEST_CFLAGS = $(GTEST_CFLAGS) $(GMOCK_CFLAGS) +@SYSTEM_TEST_LIBS_FALSE@TEST_LIBS = src/testing/libtesting.a +@SYSTEM_TEST_LIBS_TRUE@TEST_LIBS = $(GTEST_LIBS) -lgtest_main $(GMOCK_LIBS) +@SYSTEM_TEST_LIBS_FALSE@TEST_DEPS = $(TEST_LIBS) +@SYSTEM_TEST_LIBS_TRUE@TEST_DEPS = +@ANDROID_HOST_FALSE@@TESTS_AS_ROOT_FALSE@LOG_DRIVER = $(top_srcdir)/autotools/test-driver +@ANDROID_HOST_FALSE@@TESTS_AS_ROOT_TRUE@LOG_DRIVER = $(top_srcdir)/autotools/root-test-driver $(top_srcdir)/autotools/test-driver + +# Since Autotools 1.2, tests are run through a special "test driver" script. +# Unfortunately, it's not possible anymore to specify an alternative shell to +# run them on connected devices, so use a slightly modified version of the +# driver for Android. +@ANDROID_HOST_TRUE@LOG_DRIVER = $(top_srcdir)/android/test-driver +check_LIBRARIES = $(am__append_4) +noinst_LIBRARIES = $(am__append_7) +lib_LIBRARIES = $(am__append_5) $(am__append_12) +noinst_SCRIPTS = $(check_SCRIPTS) +CLEANFILES = $(am__append_16) +@SYSTEM_TEST_LIBS_FALSE@src_testing_libtesting_a_SOURCES = \ +@SYSTEM_TEST_LIBS_FALSE@ src/breakpad_googletest_includes.h \ +@SYSTEM_TEST_LIBS_FALSE@ src/testing/googletest/src/gtest-all.cc \ +@SYSTEM_TEST_LIBS_FALSE@ src/testing/googletest/src/gtest_main.cc \ +@SYSTEM_TEST_LIBS_FALSE@ src/testing/googlemock/src/gmock-all.cc + +@SYSTEM_TEST_LIBS_FALSE@src_testing_libtesting_a_CPPFLAGS = \ +@SYSTEM_TEST_LIBS_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) + +@DISABLE_PROCESSOR_FALSE@check_SCRIPTS = \ +@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_stackwalk_test \ +@DISABLE_PROCESSOR_FALSE@ src/processor/microdump_stackwalk_machine_readable_test \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_dump_test \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk_test \ +@DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk_machine_readable_test + +TESTS = $(check_PROGRAMS) $(check_SCRIPTS) + +# All targets that were defined above should now be +# declared below. This should be done unconditionally +# so DO NOT wrap them in conditions! +# Execept for conditionally adding a specific file or +# flag that should only be added for a specific arch, +# system, etc. +src_common_safe_math_unittest_SOURCES = \ + src/common/safe_math.h \ + src/common/safe_math_unittest.cc + +src_common_safe_math_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_safe_math_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + + +# Breakpad processor library +src_libbreakpad_a_SOURCES = \ + src/google_breakpad/common/breakpad_types.h \ + src/google_breakpad/common/minidump_format.h \ + src/google_breakpad/common/minidump_size.h \ + src/google_breakpad/processor/basic_source_line_resolver.h \ + src/google_breakpad/processor/call_stack.h \ + src/google_breakpad/processor/code_module.h \ + src/google_breakpad/processor/code_modules.h \ + src/google_breakpad/processor/dump_context.h \ + src/google_breakpad/processor/dump_object.h \ + src/google_breakpad/processor/exploitability.h \ + src/google_breakpad/processor/fast_source_line_resolver.h \ + src/google_breakpad/processor/memory_region.h \ + src/google_breakpad/processor/microdump.h \ + src/google_breakpad/processor/microdump_processor.h \ + src/google_breakpad/processor/minidump.h \ + src/google_breakpad/processor/minidump_processor.h \ + src/google_breakpad/processor/process_result.h \ + src/google_breakpad/processor/process_state.h \ + src/google_breakpad/processor/proc_maps_linux.h \ + src/google_breakpad/processor/source_line_resolver_base.h \ + src/google_breakpad/processor/source_line_resolver_interface.h \ + src/google_breakpad/processor/stack_frame.h \ + src/google_breakpad/processor/stack_frame_cpu.h \ + src/google_breakpad/processor/stack_frame_symbolizer.h \ + src/google_breakpad/processor/stackwalker.h \ + src/google_breakpad/processor/symbol_supplier.h \ + src/google_breakpad/processor/system_info.h \ + src/processor/address_map-inl.h src/processor/address_map.h \ + src/processor/basic_code_module.h \ + src/processor/basic_code_modules.cc \ + src/processor/basic_code_modules.h \ + src/processor/basic_source_line_resolver_types.h \ + src/processor/basic_source_line_resolver.cc \ + src/processor/call_stack.cc src/processor/cfi_frame_info.cc \ + src/processor/cfi_frame_info.h \ + src/processor/contained_range_map-inl.h \ + src/processor/contained_range_map.h \ + src/processor/convert_old_arm64_context.cc \ + src/processor/convert_old_arm64_context.h \ + src/processor/disassembler_x86.h \ + src/processor/disassembler_x86.cc \ + src/processor/dump_context.cc src/processor/dump_object.cc \ + src/processor/exploitability.cc \ + src/processor/exploitability_linux.h \ + src/processor/exploitability_linux.cc \ + src/processor/exploitability_win.h \ + src/processor/exploitability_win.cc \ + src/processor/fast_source_line_resolver_types.h \ + src/processor/fast_source_line_resolver.cc \ + src/processor/linked_ptr.h src/processor/logging.h \ + src/processor/logging.cc src/processor/map_serializers-inl.h \ + src/processor/map_serializers.h src/processor/microdump.cc \ + src/processor/microdump_processor.cc src/processor/minidump.cc \ + src/processor/minidump_processor.cc \ + src/processor/module_comparer.cc \ + src/processor/module_comparer.h src/processor/module_factory.h \ + src/processor/module_serializer.cc \ + src/processor/module_serializer.h \ + src/processor/pathname_stripper.cc \ + src/processor/pathname_stripper.h \ + src/processor/postfix_evaluator-inl.h \ + src/processor/postfix_evaluator.h \ + src/processor/process_state.cc \ + src/processor/proc_maps_linux.cc src/processor/range_map-inl.h \ + src/processor/range_map.h \ + src/processor/simple_serializer-inl.h \ + src/processor/simple_serializer.h \ + src/processor/simple_symbol_supplier.cc \ + src/processor/simple_symbol_supplier.h \ + src/processor/windows_frame_info.h \ + src/processor/source_line_resolver_base_types.h \ + src/processor/source_line_resolver_base.cc \ + src/processor/stack_frame_cpu.cc \ + src/processor/stack_frame_symbolizer.cc \ + src/processor/stackwalk_common.cc \ + src/processor/stackwalk_common.h src/processor/stackwalker.cc \ + src/processor/stackwalker_amd64.cc \ + src/processor/stackwalker_amd64.h \ + src/processor/stackwalker_arm.cc \ + src/processor/stackwalker_arm.h \ + src/processor/stackwalker_arm64.cc \ + src/processor/stackwalker_arm64.h \ + src/processor/stackwalker_address_list.cc \ + src/processor/stackwalker_address_list.h \ + src/processor/stackwalker_mips.cc \ + src/processor/stackwalker_mips.h \ + src/processor/stackwalker_ppc.cc \ + src/processor/stackwalker_ppc.h \ + src/processor/stackwalker_ppc64.cc \ + src/processor/stackwalker_ppc64.h \ + src/processor/stackwalker_riscv.cc \ + src/processor/stackwalker_riscv.h \ + src/processor/stackwalker_riscv64.cc \ + src/processor/stackwalker_riscv64.h \ + src/processor/stackwalker_sparc.cc \ + src/processor/stackwalker_sparc.h \ + src/processor/stackwalker_x86.cc \ + src/processor/stackwalker_x86.h \ + src/processor/static_address_map-inl.h \ + src/processor/static_address_map.h \ + src/processor/static_contained_range_map-inl.h \ + src/processor/static_contained_range_map.h \ + src/processor/static_map_iterator-inl.h \ + src/processor/static_map_iterator.h \ + src/processor/static_map-inl.h src/processor/static_map.h \ + src/processor/static_range_map-inl.h \ + src/processor/static_range_map.h \ + src/processor/symbolic_constants_win.cc \ + src/processor/symbolic_constants_win.h \ + src/processor/tokenize.cc src/processor/tokenize.h \ + $(am__append_22) + +# libdisasm 3rd party library +src_third_party_libdisasm_libdisasm_a_SOURCES = \ + src/third_party/libdisasm/ia32_implicit.c \ + src/third_party/libdisasm/ia32_implicit.h \ + src/third_party/libdisasm/ia32_insn.c \ + src/third_party/libdisasm/ia32_insn.h \ + src/third_party/libdisasm/ia32_invariant.c \ + src/third_party/libdisasm/ia32_invariant.h \ + src/third_party/libdisasm/ia32_modrm.c \ + src/third_party/libdisasm/ia32_modrm.h \ + src/third_party/libdisasm/ia32_opcode_tables.c \ + src/third_party/libdisasm/ia32_opcode_tables.h \ + src/third_party/libdisasm/ia32_operand.c \ + src/third_party/libdisasm/ia32_operand.h \ + src/third_party/libdisasm/ia32_reg.c \ + src/third_party/libdisasm/ia32_reg.h \ + src/third_party/libdisasm/ia32_settings.c \ + src/third_party/libdisasm/ia32_settings.h \ + src/third_party/libdisasm/libdis.h \ + src/third_party/libdisasm/qword.h \ + src/third_party/libdisasm/x86_disasm.c \ + src/third_party/libdisasm/x86_format.c \ + src/third_party/libdisasm/x86_imm.c \ + src/third_party/libdisasm/x86_imm.h \ + src/third_party/libdisasm/x86_insn.c \ + src/third_party/libdisasm/x86_misc.c \ + src/third_party/libdisasm/x86_operand_list.c \ + src/third_party/libdisasm/x86_operand_list.h + + +# Breakpad client +src_client_linux_libbreakpad_client_a_SOURCES = \ + src/client/linux/crash_generation/crash_generation_client.cc \ + src/client/linux/crash_generation/crash_generation_server.cc \ + src/client/linux/dump_writer_common/thread_info.cc \ + src/client/linux/dump_writer_common/ucontext_reader.cc \ + src/client/linux/handler/exception_handler.cc \ + src/client/linux/handler/exception_handler.h \ + src/client/linux/handler/minidump_descriptor.cc \ + src/client/linux/handler/minidump_descriptor.h \ + src/client/linux/log/log.cc src/client/linux/log/log.h \ + src/client/linux/microdump_writer/microdump_writer.cc \ + src/client/linux/microdump_writer/microdump_writer.h \ + src/client/linux/minidump_writer/linux_core_dumper.cc \ + src/client/linux/minidump_writer/linux_dumper.cc \ + src/client/linux/minidump_writer/linux_ptrace_dumper.cc \ + src/client/linux/minidump_writer/minidump_writer.cc \ + src/client/linux/minidump_writer/pe_file.cc \ + src/client/minidump_file_writer-inl.h \ + src/client/minidump_file_writer.cc \ + src/client/minidump_file_writer.h src/common/convert_UTF.cc \ + src/common/convert_UTF.h src/common/md5.cc src/common/md5.h \ + src/common/string_conversion.cc src/common/string_conversion.h \ + src/common/linux/elf_core_dump.cc src/common/linux/elfutils.cc \ + src/common/linux/elfutils.h src/common/linux/file_id.cc \ + src/common/linux/file_id.h src/common/linux/guid_creator.cc \ + src/common/linux/guid_creator.h \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/safe_readlink.cc $(am__append_23) + +# Client tests +src_client_linux_linux_dumper_unittest_helper_SOURCES = \ + src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc + +src_client_linux_linux_dumper_unittest_helper_LDFLAGS = $(PTHREAD_CFLAGS) +src_client_linux_linux_dumper_unittest_helper_CC = $(PTHREAD_CC) +@ANDROID_HOST_FALSE@src_client_linux_linux_dumper_unittest_helper_CXXFLAGS = $(PTHREAD_CFLAGS) +# On Android PTHREAD_CFLAGS is empty, and adding src/common/android/include +# to the include path is necessary to build this program. +@ANDROID_HOST_TRUE@src_client_linux_linux_dumper_unittest_helper_CXXFLAGS = $(AM_CXXFLAGS) +src_client_linux_linux_client_unittest_shlib_SOURCES = \ + $(src_testing_libtesting_a_SOURCES) \ + src/client/linux/handler/exception_handler_unittest.cc \ + src/client/linux/microdump_writer/microdump_writer_unittest.cc \ + src/client/linux/minidump_writer/directory_reader_unittest.cc \ + src/client/linux/minidump_writer/cpu_set_unittest.cc \ + src/client/linux/minidump_writer/line_reader_unittest.cc \ + src/client/linux/minidump_writer/linux_core_dumper.cc \ + src/client/linux/minidump_writer/linux_core_dumper_unittest.cc \ + src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc \ + src/client/linux/minidump_writer/minidump_writer_unittest.cc \ + src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc \ + src/client/linux/minidump_writer/pe_file.cc \ + src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc \ + src/common/linux/elf_core_dump.cc \ + src/common/linux/linux_libc_support_unittest.cc \ + src/common/linux/scoped_pipe.h src/common/linux/scoped_pipe.cc \ + src/common/linux/scoped_tmpfile.h \ + src/common/linux/scoped_tmpfile.cc \ + src/common/linux/tests/crash_generator.cc \ + src/common/memory_allocator_unittest.cc \ + src/common/tests/auto_tempdir.h src/common/tests/file_utils.cc \ + src/common/tests/file_utils.h \ + src/processor/basic_code_modules.cc \ + src/processor/convert_old_arm64_context.cc \ + src/processor/dump_context.cc src/processor/dump_object.cc \ + src/processor/logging.cc src/processor/minidump.cc \ + src/processor/pathname_stripper.cc \ + src/processor/proc_maps_linux.cc $(am__append_24) +src_client_linux_linux_client_unittest_shlib_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_client_linux_linux_client_unittest_shlib_LDFLAGS = -shared \ + -Wl,-h,linux_client_unittest_shlib $(am__append_25) +src_client_linux_linux_client_unittest_shlib_LDADD = \ + src/client/linux/crash_generation/crash_generation_client.o \ + src/client/linux/dump_writer_common/thread_info.o \ + src/client/linux/dump_writer_common/ucontext_reader.o \ + src/client/linux/handler/exception_handler.o \ + src/client/linux/handler/minidump_descriptor.o \ + src/client/linux/log/log.o \ + src/client/linux/microdump_writer/microdump_writer.o \ + src/client/linux/minidump_writer/linux_dumper.o \ + src/client/linux/minidump_writer/linux_ptrace_dumper.o \ + src/client/linux/minidump_writer/minidump_writer.o \ + src/client/minidump_file_writer.o \ + src/common/convert_UTF.o \ + src/common/md5.o \ + src/common/linux/elfutils.o \ + src/common/linux/file_id.o \ + src/common/linux/guid_creator.o \ + src/common/linux/linux_libc_support.o \ + src/common/linux/memory_mapped_file.o \ + src/common/linux/safe_readlink.o \ + src/common/string_conversion.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_client_linux_linux_client_unittest_shlib_DEPENDENCIES = \ + src/client/linux/linux_dumper_unittest_helper \ + src/client/linux/libbreakpad_client.a \ + $(TEST_DEPS) \ + src/libbreakpad.a + +src_client_linux_linux_client_unittest_SOURCES = +# The extra-long build id is for a test in minidump_writer_unittest.cc. +src_client_linux_linux_client_unittest_LDFLAGS = \ + -Wl,-rpath,'$$ORIGIN' \ + -Wl,--build-id=0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f \ + $(am__append_26) +src_client_linux_linux_client_unittest_LDADD = \ + src/client/linux/linux_client_unittest_shlib \ + $(TEST_LIBS) + +src_client_linux_linux_client_unittest_DEPENDENCIES = \ + src/client/linux/linux_client_unittest_shlib + + +# Tools +src_tools_linux_core2md_core2md_SOURCES = \ + src/tools/linux/core2md/core2md.cc + +src_tools_linux_core2md_core2md_LDADD = \ + src/client/linux/libbreakpad_client.a \ + src/common/path_helper.o + +src_tools_linux_core_handler_core_handler_SOURCES = \ + src/tools/linux/core_handler/core_handler.cc + +src_tools_linux_core_handler_core_handler_LDADD = \ + src/client/linux/libbreakpad_client.a \ + src/common/path_helper.o + +src_tools_linux_pid2md_pid2md_SOURCES = \ + src/tools/linux/pid2md/pid2md.cc + +src_tools_linux_pid2md_pid2md_LDADD = \ + src/client/linux/libbreakpad_client.a \ + src/common/path_helper.o + +src_tools_linux_dump_syms_dump_syms_SOURCES = \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_range_list_handler.cc \ + src/common/language.cc \ + src/common/module.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_to_module.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/elf_reader.cc \ + src/common/linux/crc32.cc \ + src/common/linux/dump_symbols.cc \ + src/common/linux/dump_symbols.h \ + src/common/linux/elf_symbols_to_module.cc \ + src/common/linux/elf_symbols_to_module.h \ + src/common/linux/elfutils.cc \ + src/common/linux/file_id.cc \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/safe_readlink.cc \ + src/tools/linux/dump_syms/dump_syms.cc + +src_tools_linux_dump_syms_dump_syms_CXXFLAGS = \ + $(RUSTC_DEMANGLE_CFLAGS) + +src_tools_linux_dump_syms_dump_syms_LDADD = \ + $(RUSTC_DEMANGLE_LIBS) \ + -lz -lzstd + +src_tools_linux_md2core_minidump_2_core_SOURCES = \ + src/common/linux/memory_mapped_file.cc \ + src/common/path_helper.cc \ + src/tools/linux/md2core/minidump-2-core.cc \ + src/tools/linux/md2core/minidump_memory_range.h + +src_tools_linux_symupload_minidump_upload_SOURCES = \ + src/common/linux/http_upload.cc \ + src/common/path_helper.cc \ + src/tools/linux/symupload/minidump_upload.cc + +src_tools_linux_symupload_minidump_upload_LDADD = -ldl +src_tools_linux_symupload_sym_upload_SOURCES = \ + src/common/linux/http_upload.cc \ + src/common/linux/http_upload.h \ + src/common/linux/libcurl_wrapper.cc \ + src/common/linux/libcurl_wrapper.h \ + src/common/linux/symbol_collector_client.cc \ + src/common/linux/symbol_collector_client.h \ + src/common/linux/symbol_upload.cc \ + src/common/linux/symbol_upload.h \ + src/common/path_helper.cc \ + src/tools/linux/symupload/sym_upload.cc + +src_tools_linux_symupload_sym_upload_LDADD = -ldl +src_tools_mac_dump_syms_dump_syms_mac_SOURCES = \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_range_list_handler.cc \ + src/common/language.cc \ + src/common/md5.cc \ + src/common/module.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_to_module.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/elf_reader.cc \ + src/common/mac/arch_utilities.cc \ + src/common/mac/dump_syms.cc \ + src/common/mac/dump_syms.h \ + src/common/mac/file_id.cc \ + src/common/mac/file_id.h \ + src/common/mac/macho_id.cc \ + src/common/mac/macho_id.h \ + src/common/mac/macho_reader.cc \ + src/common/mac/macho_reader.h \ + src/common/mac/macho_utilities.cc \ + src/common/mac/macho_utilities.h \ + src/common/mac/macho_walker.cc \ + src/common/mac/macho_walker.h \ + src/tools/mac/dump_syms/dump_syms_tool.cc + +src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS = \ + -I$(top_srcdir)/src/third_party/mac_headers \ + $(RUSTC_DEMANGLE_CFLAGS) \ + -DHAVE_MACH_O_NLIST_H + +src_tools_mac_dump_syms_dump_syms_mac_LDADD = \ + $(RUSTC_DEMANGLE_LIBS) + +src_common_dumper_unittest_SOURCES = \ + src/common/byte_cursor_unittest.cc \ + src/common/convert_UTF.cc \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cfi_to_module_unittest.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_cu_to_module_unittest.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_line_to_module_unittest.cc \ + src/common/dwarf_range_list_handler.cc \ + src/common/language.cc \ + src/common/memory_range_unittest.cc \ + src/common/module.cc \ + src/common/module_unittest.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_reader_unittest.cc \ + src/common/stabs_to_module.cc \ + src/common/stabs_to_module_unittest.cc \ + src/common/string_conversion.cc \ + src/common/string_conversion_unittest.cc \ + src/common/test_assembler.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/bytereader.h \ + src/common/dwarf/bytereader-inl.h \ + src/common/dwarf/bytereader_unittest.cc \ + src/common/dwarf/cfi_assembler.cc \ + src/common/dwarf/cfi_assembler.h \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2diehandler_unittest.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/dwarf2reader.h \ + src/common/dwarf/elf_reader.cc \ + src/common/dwarf/elf_reader.h \ + src/common/dwarf/dwarf2reader_cfi_unittest.cc \ + src/common/dwarf/dwarf2reader_die_unittest.cc \ + src/common/dwarf/dwarf2reader_test_common.h \ + src/common/linux/crc32.cc \ + src/common/linux/dump_symbols.cc \ + src/common/linux/dump_symbols_unittest.cc \ + src/common/linux/elf_core_dump.cc \ + src/common/linux/elf_core_dump_unittest.cc \ + src/common/linux/elf_symbols_to_module.cc \ + src/common/linux/elf_symbols_to_module_unittest.cc \ + src/common/linux/elfutils.cc \ + src/common/linux/file_id.cc \ + src/common/linux/file_id_unittest.cc \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/memory_mapped_file_unittest.cc \ + src/common/linux/safe_readlink.cc \ + src/common/linux/safe_readlink_unittest.cc \ + src/common/linux/synth_elf.cc \ + src/common/linux/synth_elf_unittest.cc \ + src/common/linux/tests/crash_generator.cc \ + src/common/linux/tests/crash_generator.h \ + src/common/testdata/func-line-pairing.h \ + src/common/tests/file_utils.cc + +src_common_dumper_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) \ + $(RUSTC_DEMANGLE_CFLAGS) \ + $(PTHREAD_CFLAGS) + +src_common_dumper_unittest_LDADD = \ + $(TEST_LIBS) \ + $(RUSTC_DEMANGLE_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + -lz -lzstd + +src_common_mac_macho_reader_unittest_SOURCES = \ + src/common/dwarf_cfi_to_module.cc \ + src/common/dwarf_cu_to_module.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/language.cc \ + src/common/md5.cc \ + src/common/module.cc \ + src/common/path_helper.cc \ + src/common/stabs_reader.cc \ + src/common/stabs_to_module.cc \ + src/common/test_assembler.cc \ + src/common/dwarf/bytereader.cc \ + src/common/dwarf/cfi_assembler.cc \ + src/common/dwarf/dwarf2diehandler.cc \ + src/common/dwarf/dwarf2reader.cc \ + src/common/dwarf/elf_reader.cc \ + src/common/mac/arch_utilities.cc \ + src/common/mac/file_id.cc \ + src/common/mac/macho_id.cc \ + src/common/mac/macho_reader.cc \ + src/common/mac/macho_reader_unittest.cc \ + src/common/mac/macho_utilities.cc \ + src/common/mac/macho_walker.cc \ + src/common/tests/file_utils.cc + +src_common_mac_macho_reader_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) \ + -I$(top_srcdir)/src/third_party/mac_headers \ + -DHAVE_MACH_O_NLIST_H \ + $(PTHREAD_CFLAGS) + +src_common_mac_macho_reader_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_linux_google_crashdump_uploader_test_SOURCES = \ + src/common/linux/google_crashdump_uploader.cc \ + src/common/linux/google_crashdump_uploader_test.cc \ + src/common/linux/libcurl_wrapper.cc + +src_common_linux_google_crashdump_uploader_test_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_linux_google_crashdump_uploader_test_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + -ldl + +src_tools_linux_md2core_minidump_2_core_unittest_SOURCES = \ + src/tools/linux/md2core/minidump_memory_range_unittest.cc + +src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_tools_linux_md2core_minidump_2_core_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_address_map_unittest_SOURCES = \ + src/processor/address_map_unittest.cc + +src_processor_address_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o + +src_processor_basic_source_line_resolver_unittest_SOURCES = \ + src/processor/basic_source_line_resolver_unittest.cc + +src_processor_basic_source_line_resolver_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_basic_source_line_resolver_unittest_LDADD = \ + src/processor/basic_source_line_resolver.o \ + src/processor/cfi_frame_info.o \ + src/processor/pathname_stripper.o \ + src/processor/logging.o \ + src/processor/source_line_resolver_base.o \ + src/processor/tokenize.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_cfi_frame_info_unittest_SOURCES = \ + src/processor/cfi_frame_info_unittest.cc + +src_processor_cfi_frame_info_unittest_LDADD = \ + src/processor/cfi_frame_info.o \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_cfi_frame_info_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_contained_range_map_unittest_SOURCES = \ + src/processor/contained_range_map_unittest.cc + +src_processor_contained_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o + +src_processor_exploitability_unittest_SOURCES = \ + src/processor/exploitability_unittest.cc + +src_processor_exploitability_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_exploitability_unittest_LDADD = \ + src/processor/convert_old_arm64_context.o \ + src/processor/minidump_processor.o \ + src/processor/process_state.o src/processor/disassembler_x86.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/dump_context.o src/processor/dump_object.o \ + src/processor/logging.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + $(am__append_27) +src_common_linux_scoped_pipe_unittest_SOURCES = \ + src/common/linux/scoped_pipe_unittest.cc + +src_common_linux_scoped_pipe_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_linux_scoped_pipe_unittest_LDADD = \ + src/common/linux/scoped_pipe.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_linux_scoped_tmpfile_unittest_SOURCES = \ + src/common/linux/scoped_tmpfile_unittest.cc + +src_common_linux_scoped_tmpfile_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_linux_scoped_tmpfile_unittest_LDADD = \ + src/common/linux/scoped_tmpfile.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_disassembler_objdump_unittest_SOURCES = \ + src/processor/disassembler_objdump_unittest.cc + +src_processor_disassembler_objdump_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_disassembler_objdump_unittest_LDADD = \ + src/common/linux/scoped_pipe.o \ + src/common/linux/scoped_tmpfile.o \ + src/processor/disassembler_objdump.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_disassembler_x86_unittest_SOURCES = \ + src/processor/disassembler_x86_unittest.cc + +src_processor_disassembler_x86_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_disassembler_x86_unittest_LDADD = \ + src/processor/disassembler_x86.o \ + src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_fast_source_line_resolver_unittest_SOURCES = \ + src/processor/fast_source_line_resolver_unittest.cc + +src_processor_fast_source_line_resolver_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_fast_source_line_resolver_unittest_LDADD = \ + src/processor/fast_source_line_resolver.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/cfi_frame_info.o \ + src/processor/module_comparer.o \ + src/processor/module_serializer.o \ + src/processor/pathname_stripper.o \ + src/processor/logging.o \ + src/processor/source_line_resolver_base.o \ + src/processor/tokenize.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_map_serializers_unittest_SOURCES = \ + src/processor/map_serializers_unittest.cc + +src_processor_map_serializers_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_map_serializers_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_microdump_processor_unittest_SOURCES = \ + src/processor/microdump_processor_unittest.cc + +src_processor_microdump_processor_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_microdump_processor_unittest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/cfi_frame_info.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/logging.o \ + src/processor/microdump.o src/processor/microdump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + $(TEST_LIBS) $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + $(am__append_28) +src_processor_minidump_processor_unittest_SOURCES = \ + src/processor/minidump_processor_unittest.cc + +src_processor_minidump_processor_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_minidump_processor_unittest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump_processor.o src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o src/processor/proc_maps_linux.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) \ + $(am__append_29) +src_processor_minidump_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/minidump_unittest.cc \ + src/processor/synth_minidump.cc + +src_processor_minidump_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_minidump_unittest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_proc_maps_linux_unittest_SOURCES = \ + src/processor/proc_maps_linux.cc \ + src/processor/proc_maps_linux_unittest.cc + +src_processor_proc_maps_linux_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_proc_maps_linux_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + src/third_party/libdisasm/libdisasm.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_address_map_unittest_SOURCES = \ + src/processor/static_address_map_unittest.cc + +src_processor_static_address_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_static_address_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_contained_range_map_unittest_SOURCES = \ + src/processor/static_contained_range_map_unittest.cc + +src_processor_static_contained_range_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_static_contained_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_map_unittest_SOURCES = \ + src/processor/static_map_unittest.cc + +src_processor_static_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_static_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_static_range_map_unittest_SOURCES = \ + src/processor/static_range_map_unittest.cc + +src_processor_static_range_map_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_static_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_pathname_stripper_unittest_SOURCES = \ + src/processor/pathname_stripper_unittest.cc + +src_processor_pathname_stripper_unittest_LDADD = \ + src/processor/pathname_stripper.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_postfix_evaluator_unittest_SOURCES = \ + src/processor/postfix_evaluator_unittest.cc + +src_processor_postfix_evaluator_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_range_map_truncate_lower_unittest_SOURCES = \ + src/processor/range_map_truncate_lower_unittest.cc + +src_processor_range_map_truncate_lower_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_range_map_truncate_lower_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_range_map_truncate_upper_unittest_SOURCES = \ + src/processor/range_map_truncate_upper_unittest.cc + +src_processor_range_map_truncate_upper_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_range_map_truncate_upper_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_range_map_unittest_SOURCES = \ + src/processor/range_map_unittest.cc + +src_processor_range_map_unittest_LDADD = \ + src/processor/logging.o \ + src/processor/pathname_stripper.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_selftest_SOURCES = \ + src/processor/stackwalker_selftest.cc + +src_processor_stackwalker_selftest_LDADD = \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/disassembler_x86.o \ + src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump.o src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) $(am__append_30) +src_processor_stackwalker_amd64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_amd64_unittest.cc + +src_processor_stackwalker_amd64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_amd64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_arm_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_arm_unittest.cc + +src_processor_stackwalker_arm_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_arm_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_arm64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_arm64_unittest.cc + +src_processor_stackwalker_arm64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_arm64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_address_list_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_address_list_unittest.cc + +src_processor_stackwalker_address_list_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_address_list_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_mips_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_mips_unittest.cc + +src_processor_stackwalker_mips_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_mips_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_mips64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_mips64_unittest.cc + +src_processor_stackwalker_mips64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_mips64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_riscv_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_riscv_unittest.cc + +src_processor_stackwalker_riscv_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_riscv_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_riscv64_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_riscv64_unittest.cc + +src_processor_stackwalker_riscv64_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_riscv64_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_stackwalker_x86_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/processor/stackwalker_x86_unittest.cc + +src_processor_stackwalker_x86_unittest_LDADD = \ + src/libbreakpad.a \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_stackwalker_x86_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_synth_minidump_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/common/test_assembler.h \ + src/processor/synth_minidump_unittest.cc \ + src/processor/synth_minidump.cc \ + src/processor/synth_minidump.h + +src_processor_synth_minidump_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_processor_synth_minidump_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_test_assembler_unittest_SOURCES = \ + src/common/test_assembler.cc \ + src/common/test_assembler.h \ + src/common/test_assembler_unittest.cc + +src_common_test_assembler_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_test_assembler_unittest_LDADD = \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_dwarf_dwarf2reader_lineinfo_unittest_SOURCES = \ + src/common/dwarf/dwarf2reader.h \ + src/common/dwarf/dwarf2reader_lineinfo_unittest.cc + +src_common_dwarf_dwarf2reader_lineinfo_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_dwarf_dwarf2reader_lineinfo_unittest_LDADD = \ + src/common/dwarf/bytereader.o \ + src/common/dwarf/dwarf2reader.o \ + src/common/dwarf/elf_reader.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_common_dwarf_dwarf2reader_splitfunctions_unittest_SOURCES = \ + src/common/dwarf/dwarf2reader.h \ + src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc + +src_common_dwarf_dwarf2reader_splitfunctions_unittest_CPPFLAGS = \ + $(AM_CPPFLAGS) $(TEST_CFLAGS) + +src_common_dwarf_dwarf2reader_splitfunctions_unittest_LDADD = \ + src/common/dwarf/bytereader.o \ + src/common/dwarf/dwarf2reader.o \ + src/common/dwarf/elf_reader.o \ + $(TEST_LIBS) \ + $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + +src_processor_minidump_dump_SOURCES = \ + src/processor/minidump_dump.cc + +src_processor_minidump_dump_LDADD = \ + src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/dump_context.o \ + src/processor/dump_object.o \ + src/processor/logging.o \ + src/processor/minidump.o \ + src/processor/pathname_stripper.o \ + src/processor/proc_maps_linux.o + +src_processor_microdump_stackwalk_SOURCES = \ + src/processor/microdump_stackwalk.cc + +src_processor_microdump_stackwalk_LDADD = src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/cfi_frame_info.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/logging.o \ + src/processor/microdump.o src/processor/microdump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalk_common.o src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o src/processor/tokenize.o \ + src/third_party/libdisasm/libdisasm.a $(am__append_31) +src_processor_minidump_stackwalk_SOURCES = \ + src/processor/minidump_stackwalk.cc + +src_processor_minidump_stackwalk_LDADD = src/common/path_helper.o \ + src/processor/basic_code_modules.o \ + src/processor/basic_source_line_resolver.o \ + src/processor/call_stack.o src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ + src/processor/disassembler_x86.o src/processor/dump_context.o \ + src/processor/dump_object.o src/processor/exploitability.o \ + src/processor/exploitability_linux.o \ + src/processor/exploitability_win.o src/processor/logging.o \ + src/processor/minidump.o src/processor/minidump_processor.o \ + src/processor/pathname_stripper.o \ + src/processor/process_state.o src/processor/proc_maps_linux.o \ + src/processor/simple_symbol_supplier.o \ + src/processor/source_line_resolver_base.o \ + src/processor/stack_frame_cpu.o \ + src/processor/stack_frame_symbolizer.o \ + src/processor/stackwalk_common.o src/processor/stackwalker.o \ + src/processor/stackwalker_address_list.o \ + src/processor/stackwalker_amd64.o \ + src/processor/stackwalker_arm.o \ + src/processor/stackwalker_arm64.o \ + src/processor/stackwalker_mips.o \ + src/processor/stackwalker_ppc.o \ + src/processor/stackwalker_ppc64.o \ + src/processor/stackwalker_riscv.o \ + src/processor/stackwalker_riscv64.o \ + src/processor/stackwalker_sparc.o \ + src/processor/stackwalker_x86.o \ + src/processor/symbolic_constants_win.o \ + src/processor/tokenize.o src/third_party/libdisasm/libdisasm.a \ + $(am__append_32) +EXTRA_DIST = \ + $(SCRIPTS) \ + src/client/linux/data/linux-gate-amd.sym \ + src/client/linux/data/linux-gate-intel.sym \ + src/client/mac/handler/breakpad_nlist_64.cc \ + src/client/mac/handler/breakpad_nlist_64.h \ + src/client/mac/handler/dynamic_images.cc \ + src/client/mac/handler/dynamic_images.h \ + src/client/mac/handler/exception_handler.cc \ + src/client/mac/handler/exception_handler.h \ + src/client/mac/handler/mach_vm_compat.h \ + src/client/mac/handler/minidump_generator.cc \ + src/client/mac/handler/minidump_generator.h \ + src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj \ + src/client/mac/handler/minidump_tests32-Info.plist \ + src/client/mac/handler/minidump_tests64-Info.plist \ + src/client/mac/handler/obj-cTestCases-Info.plist \ + src/client/mac/handler/protected_memory_allocator.cc \ + src/client/mac/handler/protected_memory_allocator.h \ + src/client/mac/handler/ucontext_compat.h \ + src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym \ + src/client/mac/tests/BreakpadFramework_Test.mm \ + src/client/mac/tests/crash_generation_server_test.cc \ + src/client/mac/tests/exception_handler_test.cc \ + src/client/mac/tests/minidump_generator_test.cc \ + src/client/mac/tests/minidump_generator_test_helper.cc \ + src/client/mac/tests/spawn_child_process.h \ + src/client/mac/tests/testlogging.h \ + src/client/minidump_file_writer_unittest.cc \ + src/client/solaris/handler/Makefile \ + src/client/solaris/handler/exception_handler.cc \ + src/client/solaris/handler/exception_handler.h \ + src/client/solaris/handler/exception_handler_test.cc \ + src/client/solaris/handler/minidump_generator.cc \ + src/client/solaris/handler/minidump_generator.h \ + src/client/solaris/handler/minidump_test.cc \ + src/client/solaris/handler/solaris_lwp.cc \ + src/client/solaris/handler/solaris_lwp.h \ + src/client/windows/handler/exception_handler.cc \ + src/client/windows/handler/exception_handler.h \ + src/client/windows/sender/crash_report_sender.cc \ + src/client/windows/sender/crash_report_sender.h \ + src/common/dwarf/dwarf2diehandler.h \ + src/common/dwarf/dwarf2enums.h \ + src/common/dwarf/line_state_machine.h \ + src/common/dwarf/types.h \ + src/common/mac/arch_utilities.h \ + src/common/mac/byteswap.h \ + src/common/mac/HTTPMultipartUpload.h \ + src/common/mac/HTTPMultipartUpload.m \ + src/common/mac/string_utilities.cc \ + src/common/mac/string_utilities.h \ + src/common/mac/super_fat_arch.h \ + src/common/scoped_ptr.h \ + src/common/solaris/dump_symbols.cc \ + src/common/solaris/dump_symbols.h \ + src/common/solaris/file_id.cc \ + src/common/solaris/file_id.h \ + src/common/solaris/guid_creator.cc \ + src/common/solaris/guid_creator.h \ + src/common/solaris/message_output.h \ + src/common/windows/guid_string.cc \ + src/common/windows/guid_string.h \ + src/common/windows/http_upload.cc \ + src/common/windows/http_upload.h \ + src/common/windows/pdb_source_line_writer.cc \ + src/common/windows/pdb_source_line_writer.h \ + src/common/windows/string_utils-inl.h \ + src/common/windows/string_utils.cc \ + src/processor/microdump_stackwalk_test_vars \ + src/processor/stackwalk_common.cc \ + src/processor/stackwalk_common.h \ + src/processor/stackwalker_selftest_sol.s \ + src/processor/testdata/ascii_read_av_block_write.dmp \ + src/processor/testdata/ascii_read_av_clobber_write.dmp \ + src/processor/testdata/ascii_read_av_conditional.dmp \ + src/processor/testdata/ascii_read_av.dmp \ + src/processor/testdata/ascii_read_av_then_jmp.dmp \ + src/processor/testdata/ascii_read_av_xchg_write.dmp \ + src/processor/testdata/ascii_write_av_arg_to_call.dmp \ + src/processor/testdata/ascii_write_av.dmp \ + src/processor/testdata/exec_av_on_stack.dmp \ + src/processor/testdata/linux_divide_by_zero.dmp \ + src/processor/testdata/linux_executable_heap.dmp \ + src/processor/testdata/linux_executable_stack.dmp \ + src/processor/testdata/linux_inside_module_exe_region1.dmp \ + src/processor/testdata/linux_inside_module_exe_region2.dmp \ + src/processor/testdata/linux_jmp_to_0.dmp \ + src/processor/testdata/linux_jmp_to_module_not_exe_region.dmp \ + src/processor/testdata/linux_null_dereference.dmp \ + src/processor/testdata/linux_null_read_av.dmp \ + src/processor/testdata/linux_outside_module.dmp \ + src/processor/testdata/linux_overflow.dmp \ + src/processor/testdata/linux_raise_sigabrt.dmp \ + src/processor/testdata/linux_stack_pointer_in_module.dmp \ + src/processor/testdata/linux_stack_pointer_in_stack.dmp \ + src/processor/testdata/linux_stack_pointer_in_stack_alt_name.dmp \ + src/processor/testdata/linux_stacksmash.dmp \ + src/processor/testdata/linux_write_to_nonwritable_module.dmp \ + src/processor/testdata/linux_write_to_nonwritable_region_math.dmp \ + src/processor/testdata/linux_write_to_outside_module.dmp \ + src/processor/testdata/linux_write_to_outside_module_via_math.dmp \ + src/processor/testdata/linux_write_to_under_4k.dmp \ + src/processor/testdata/microdump-arm64.dmp \ + src/processor/testdata/microdump-arm.dmp \ + src/processor/testdata/microdump-mips32.dmp \ + src/processor/testdata/microdump-mips64.dmp \ + src/processor/testdata/microdump-multiple.dmp \ + src/processor/testdata/microdump.stackwalk-arm64.out \ + src/processor/testdata/microdump.stackwalk-arm.out \ + src/processor/testdata/microdump.stackwalk.machine_readable-arm64.out \ + src/processor/testdata/microdump.stackwalk.machine_readable-arm.out \ + src/processor/testdata/microdump-withcrashreason.dmp \ + src/processor/testdata/microdump-x86.dmp \ + src/processor/testdata/minidump_32bit_crash_addr.dmp \ + src/processor/testdata/minidump2.dmp \ + src/processor/testdata/minidump2.dump.out \ + src/processor/testdata/minidump2.stackwalk.machine_readable.out \ + src/processor/testdata/minidump2.stackwalk.out \ + src/processor/testdata/module0.out \ + src/processor/testdata/module1.out \ + src/processor/testdata/module2.out \ + src/processor/testdata/module3_bad.out \ + src/processor/testdata/module4_bad.out \ + src/processor/testdata/null_read_av.dmp \ + src/processor/testdata/null_write_av.dmp \ + src/processor/testdata/read_av_clobber_write.dmp \ + src/processor/testdata/read_av_conditional.dmp \ + src/processor/testdata/read_av_non_null.dmp \ + src/processor/testdata/stack_exhaustion.dmp \ + src/processor/testdata/write_av_non_null.dmp \ + src/processor/testdata/symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym \ + src/processor/testdata/symbols/ld-2.13.so/C32AD7E235EA6112E02A5B9D6219C4850/ld-2.13.so.sym \ + src/processor/testdata/symbols/libc-2.13.so/F4F8DFCD5A5FB5A7CE64717E9E6AE3890/libc-2.13.so.sym \ + src/processor/testdata/symbols/libgcc_s.so.1/18B180F90887D8F8B5C35D185444AF4C0/libgcc_s.so.1.sym \ + src/processor/testdata/symbols/microdump/breakpad_unittests/D6D1FEC9A15DE7F38A236898871A2E770/breakpad_unittests.sym \ + src/processor/testdata/symbols/microdump/breakpad_unittests/DA7778FB66018A4E9B4110ED06E730D00/breakpad_unittests.sym \ + src/processor/testdata/symbols/microdump/crash_example/6E72E2F1A5F59AB3D51356FDFE394D490/crash_example.sym \ + src/processor/testdata/symbols/microdump/crash_example/8F36148CC4647A8116CAF2A25F591F570/crash_example.sym \ + src/processor/testdata/symbols/null_read_av/7B7D1968FF0D47AE4366E9C3A7E1B6750/null_read_av.sym \ + src/processor/testdata/symbols/overflow/B0E1FC01EF48E39CAF5C881D2DF0C3840/overflow.sym \ + src/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym \ + src/processor/testdata/test_app.cc \ + src/testing/googletest/include/gtest/gtest.h \ + src/testing/googletest/include/gtest/gtest-death-test.h \ + src/testing/googletest/include/gtest/gtest-matchers.h \ + src/testing/googletest/include/gtest/gtest-message.h \ + src/testing/googletest/include/gtest/gtest-param-test.h \ + src/testing/googletest/include/gtest/gtest-printers.h \ + src/testing/googletest/include/gtest/gtest-spi.h \ + src/testing/googletest/include/gtest/gtest-test-part.h \ + src/testing/googletest/include/gtest/gtest-typed-test.h \ + src/testing/googletest/include/gtest/gtest_pred_impl.h \ + src/testing/googletest/include/gtest/gtest_prod.h \ + src/testing/googletest/include/gtest/internal/custom/gtest-port.h \ + src/testing/googletest/include/gtest/internal/custom/gtest-printers.h \ + src/testing/googletest/include/gtest/internal/custom/gtest.h \ + src/testing/googletest/include/gtest/internal/gtest-death-test-internal.h \ + src/testing/googletest/include/gtest/internal/gtest-filepath.h \ + src/testing/googletest/include/gtest/internal/gtest-internal.h \ + src/testing/googletest/include/gtest/internal/gtest-param-util-generated.h \ + src/testing/googletest/include/gtest/internal/gtest-param-util.h \ + src/testing/googletest/include/gtest/internal/gtest-port-arch.h \ + src/testing/googletest/include/gtest/internal/gtest-port.h \ + src/testing/googletest/include/gtest/internal/gtest-string.h \ + src/testing/googletest/include/gtest/internal/gtest-type-util.h \ + src/testing/googletest/src/gtest.cc \ + src/testing/googletest/src/gtest-death-test.cc \ + src/testing/googletest/src/gtest-filepath.cc \ + src/testing/googletest/src/gtest-internal-inl.h \ + src/testing/googletest/src/gtest-matchers.cc \ + src/testing/googletest/src/gtest-port.cc \ + src/testing/googletest/src/gtest-printers.cc \ + src/testing/googletest/src/gtest-test-part.cc \ + src/testing/googletest/src/gtest-typed-test.cc \ + src/testing/googlemock/include/gmock/gmock.h \ + src/testing/googlemock/include/gmock/gmock-actions.h \ + src/testing/googlemock/include/gmock/gmock-cardinalities.h \ + src/testing/googlemock/include/gmock/gmock-function-mocker.h \ + src/testing/googlemock/include/gmock/gmock-generated-actions.h \ + src/testing/googlemock/include/gmock/gmock-generated-function-mockers.h \ + src/testing/googlemock/include/gmock/gmock-generated-matchers.h \ + src/testing/googlemock/include/gmock/gmock-matchers.h \ + src/testing/googlemock/include/gmock/gmock-more-actions.h \ + src/testing/googlemock/include/gmock/gmock-more-matchers.h \ + src/testing/googlemock/include/gmock/gmock-nice-strict.h \ + src/testing/googlemock/include/gmock/gmock-spec-builders.h \ + src/testing/googlemock/include/gmock/internal/custom/gmock-generated-actions.h \ + src/testing/googlemock/include/gmock/internal/custom/gmock-matchers.h \ + src/testing/googlemock/include/gmock/internal/custom/gmock-port.h \ + src/testing/googlemock/include/gmock/internal/gmock-internal-utils.h \ + src/testing/googlemock/include/gmock/internal/gmock-port.h \ + src/testing/googlemock/include/gmock/internal/gmock-pp.h \ + src/testing/googlemock/src/gmock.cc \ + src/testing/googlemock/src/gmock-cardinalities.cc \ + src/testing/googlemock/src/gmock-internal-utils.cc \ + src/testing/googlemock/src/gmock-matchers.cc \ + src/testing/googlemock/src/gmock-spec-builders.cc \ + src/testing/googlemock/src/gmock_main.cc \ + src/third_party/curl/COPYING \ + src/third_party/curl/curlbuild.h \ + src/third_party/curl/curl.h \ + src/third_party/curl/curlrules.h \ + src/third_party/curl/curlver.h \ + src/third_party/curl/easy.h \ + src/third_party/curl/mprintf.h \ + src/third_party/curl/multi.h \ + src/third_party/curl/stdcheaders.h \ + src/third_party/curl/typecheck-gcc.h \ + src/third_party/curl/types.h \ + src/third_party/mac_headers/architecture/byte_order.h \ + src/third_party/mac_headers/arm/_types.h \ + src/third_party/mac_headers/i386/_types.h \ + src/third_party/mac_headers/mach/boolean.h \ + src/third_party/mac_headers/mach/arm/boolean.h \ + src/third_party/mac_headers/mach/arm/vm_types.h \ + src/third_party/mac_headers/mach/i386/boolean.h \ + src/third_party/mac_headers/mach/i386/vm_types.h \ + src/third_party/mac_headers/mach/machine/boolean.h \ + src/third_party/mac_headers/mach/machine.h \ + src/third_party/mac_headers/mach/machine/thread_state.h \ + src/third_party/mac_headers/mach/machine/thread_status.h \ + src/third_party/mac_headers/mach/machine/vm_types.h \ + src/third_party/mac_headers/mach-o/arch.h \ + src/third_party/mac_headers/mach-o/fat.h \ + src/third_party/mac_headers/mach-o/loader.h \ + src/third_party/mac_headers/mach-o/nlist.h \ + src/third_party/mac_headers/mach/thread_status.h \ + src/third_party/mac_headers/mach/vm_prot.h \ + src/third_party/mac_headers/README \ + src/third_party/musl/README \ + src/third_party/musl/COPYRIGHT \ + src/third_party/musl/README.breakpad \ + src/third_party/musl/VERSION \ + src/third_party/musl/include/elf.h \ + src/tools/mac/crash_report/crash_report.mm \ + src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj \ + src/tools/mac/crash_report/on_demand_symbol_supplier.h \ + src/tools/mac/crash_report/on_demand_symbol_supplier.mm \ + src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj \ + src/tools/mac/dump_syms/dump_syms_tool.cc \ + src/tools/mac/symupload/minidump_upload.m \ + src/tools/mac/symupload/symupload.m \ + src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj \ + src/tools/solaris/dump_syms/Makefile \ + src/tools/solaris/dump_syms/dump_syms.cc \ + src/tools/solaris/dump_syms/run_regtest.sh \ + src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc \ + src/tools/solaris/dump_syms/testdata/dump_syms_regtest.o \ + src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs \ + src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym \ + src/tools/windows/converter/ms_symbol_server_converter.cc \ + src/tools/windows/converter/ms_symbol_server_converter.h \ + src/tools/windows/dump_syms/dump_syms.cc \ + src/tools/windows/dump_syms/run_regtest.sh \ + src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc \ + src/tools/windows/dump_syms/testdata/dump_syms_regtest.pdb \ + src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym \ + src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym \ + src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym \ + src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym \ + src/tools/windows/dump_syms/testdata/omap_stretched.sym \ + src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym \ + src/tools/windows/symupload/symupload.cc + +all: all-am + +.SUFFIXES: +.SUFFIXES: .S .c .cc .log .o .obj .test .test$(EXEEXT) .trs +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +src/config.h: src/stamp-h1 + @test -f $@ || rm -f src/stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1 + +src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status + @rm -f src/stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status src/config.h +$(top_srcdir)/src/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f src/stamp-h1 + touch $@ + +distclean-hdr: + -rm -f src/config.h src/stamp-h1 +breakpad.pc: $(top_builddir)/config.status $(srcdir)/breakpad.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +breakpad-client.pc: $(top_builddir)/config.status $(srcdir)/breakpad-client.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) +install-libexecPROGRAMS: $(libexec_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-libexecPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libexecdir)" && rm -f $$files + +clean-libexecPROGRAMS: + -test -z "$(libexec_PROGRAMS)" || rm -f $(libexec_PROGRAMS) + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) + +clean-checkLIBRARIES: + -test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES) +install-libLIBRARIES: $(lib_LIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } + @$(POST_INSTALL) + @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + if test -f $$p; then \ + $(am__strip_dir) \ + echo " ( cd '$(DESTDIR)$(libdir)' && $(RANLIB) $$f )"; \ + ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \ + else :; fi; \ + done + +uninstall-libLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir) + +clean-libLIBRARIES: + -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +src/client/linux/crash_generation/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/crash_generation + @: > src/client/linux/crash_generation/$(am__dirstamp) +src/client/linux/crash_generation/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/crash_generation/$(DEPDIR) + @: > src/client/linux/crash_generation/$(DEPDIR)/$(am__dirstamp) +src/client/linux/crash_generation/crash_generation_client.$(OBJEXT): \ + src/client/linux/crash_generation/$(am__dirstamp) \ + src/client/linux/crash_generation/$(DEPDIR)/$(am__dirstamp) +src/client/linux/crash_generation/crash_generation_server.$(OBJEXT): \ + src/client/linux/crash_generation/$(am__dirstamp) \ + src/client/linux/crash_generation/$(DEPDIR)/$(am__dirstamp) +src/client/linux/dump_writer_common/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/dump_writer_common + @: > src/client/linux/dump_writer_common/$(am__dirstamp) +src/client/linux/dump_writer_common/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/dump_writer_common/$(DEPDIR) + @: > src/client/linux/dump_writer_common/$(DEPDIR)/$(am__dirstamp) +src/client/linux/dump_writer_common/thread_info.$(OBJEXT): \ + src/client/linux/dump_writer_common/$(am__dirstamp) \ + src/client/linux/dump_writer_common/$(DEPDIR)/$(am__dirstamp) +src/client/linux/dump_writer_common/ucontext_reader.$(OBJEXT): \ + src/client/linux/dump_writer_common/$(am__dirstamp) \ + src/client/linux/dump_writer_common/$(DEPDIR)/$(am__dirstamp) +src/client/linux/handler/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/handler + @: > src/client/linux/handler/$(am__dirstamp) +src/client/linux/handler/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/handler/$(DEPDIR) + @: > src/client/linux/handler/$(DEPDIR)/$(am__dirstamp) +src/client/linux/handler/exception_handler.$(OBJEXT): \ + src/client/linux/handler/$(am__dirstamp) \ + src/client/linux/handler/$(DEPDIR)/$(am__dirstamp) +src/client/linux/handler/minidump_descriptor.$(OBJEXT): \ + src/client/linux/handler/$(am__dirstamp) \ + src/client/linux/handler/$(DEPDIR)/$(am__dirstamp) +src/client/linux/log/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/log + @: > src/client/linux/log/$(am__dirstamp) +src/client/linux/log/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/log/$(DEPDIR) + @: > src/client/linux/log/$(DEPDIR)/$(am__dirstamp) +src/client/linux/log/log.$(OBJEXT): \ + src/client/linux/log/$(am__dirstamp) \ + src/client/linux/log/$(DEPDIR)/$(am__dirstamp) +src/client/linux/microdump_writer/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/microdump_writer + @: > src/client/linux/microdump_writer/$(am__dirstamp) +src/client/linux/microdump_writer/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/microdump_writer/$(DEPDIR) + @: > src/client/linux/microdump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/microdump_writer/microdump_writer.$(OBJEXT): \ + src/client/linux/microdump_writer/$(am__dirstamp) \ + src/client/linux/microdump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/minidump_writer + @: > src/client/linux/minidump_writer/$(am__dirstamp) +src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/client/linux/minidump_writer/$(DEPDIR) + @: > src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_core_dumper.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_dumper.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_ptrace_dumper.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/minidump_writer.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/pe_file.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/$(am__dirstamp): + @$(MKDIR_P) src/client + @: > src/client/$(am__dirstamp) +src/client/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/client/$(DEPDIR) + @: > src/client/$(DEPDIR)/$(am__dirstamp) +src/client/minidump_file_writer.$(OBJEXT): src/client/$(am__dirstamp) \ + src/client/$(DEPDIR)/$(am__dirstamp) +src/common/$(am__dirstamp): + @$(MKDIR_P) src/common + @: > src/common/$(am__dirstamp) +src/common/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/common/$(DEPDIR) + @: > src/common/$(DEPDIR)/$(am__dirstamp) +src/common/convert_UTF.$(OBJEXT): src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/md5.$(OBJEXT): src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/string_conversion.$(OBJEXT): src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/linux/$(am__dirstamp): + @$(MKDIR_P) src/common/linux + @: > src/common/linux/$(am__dirstamp) +src/common/linux/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/common/linux/$(DEPDIR) + @: > src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/elf_core_dump.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/elfutils.$(OBJEXT): src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/file_id.$(OBJEXT): src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/guid_creator.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/linux_libc_support.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/memory_mapped_file.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/safe_readlink.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/breakpad_getcontext.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/client/linux/$(am__dirstamp): + @$(MKDIR_P) src/client/linux + @: > src/client/linux/$(am__dirstamp) + +src/client/linux/libbreakpad_client.a: $(src_client_linux_libbreakpad_client_a_OBJECTS) $(src_client_linux_libbreakpad_client_a_DEPENDENCIES) $(EXTRA_src_client_linux_libbreakpad_client_a_DEPENDENCIES) src/client/linux/$(am__dirstamp) + $(AM_V_at)-rm -f src/client/linux/libbreakpad_client.a + $(AM_V_AR)$(src_client_linux_libbreakpad_client_a_AR) src/client/linux/libbreakpad_client.a $(src_client_linux_libbreakpad_client_a_OBJECTS) $(src_client_linux_libbreakpad_client_a_LIBADD) + $(AM_V_at)$(RANLIB) src/client/linux/libbreakpad_client.a +src/processor/$(am__dirstamp): + @$(MKDIR_P) src/processor + @: > src/processor/$(am__dirstamp) +src/processor/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/processor/$(DEPDIR) + @: > src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/basic_code_modules.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/basic_source_line_resolver.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/call_stack.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/cfi_frame_info.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/convert_old_arm64_context.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/disassembler_x86.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/dump_context.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/dump_object.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/exploitability.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/exploitability_linux.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/exploitability_win.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/fast_source_line_resolver.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/logging.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/microdump.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/microdump_processor.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/minidump.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/minidump_processor.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/module_comparer.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/module_serializer.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/pathname_stripper.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/process_state.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/proc_maps_linux.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/simple_symbol_supplier.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/source_line_resolver_base.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stack_frame_cpu.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stack_frame_symbolizer.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalk_common.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_amd64.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_arm.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_arm64.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_address_list.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_mips.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_ppc.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_ppc64.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_riscv.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_riscv64.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_sparc.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_x86.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/symbolic_constants_win.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/tokenize.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/common/linux/scoped_pipe.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/scoped_tmpfile.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/processor/disassembler_objdump.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) + +src/libbreakpad.a: $(src_libbreakpad_a_OBJECTS) $(src_libbreakpad_a_DEPENDENCIES) $(EXTRA_src_libbreakpad_a_DEPENDENCIES) src/$(am__dirstamp) + $(AM_V_at)-rm -f src/libbreakpad.a + $(AM_V_AR)$(src_libbreakpad_a_AR) src/libbreakpad.a $(src_libbreakpad_a_OBJECTS) $(src_libbreakpad_a_LIBADD) + $(AM_V_at)$(RANLIB) src/libbreakpad.a +src/testing/googletest/src/$(am__dirstamp): + @$(MKDIR_P) src/testing/googletest/src + @: > src/testing/googletest/src/$(am__dirstamp) +src/testing/googletest/src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/testing/googletest/src/$(DEPDIR) + @: > src/testing/googletest/src/$(DEPDIR)/$(am__dirstamp) +src/testing/googletest/src/libtesting_a-gtest-all.$(OBJEXT): \ + src/testing/googletest/src/$(am__dirstamp) \ + src/testing/googletest/src/$(DEPDIR)/$(am__dirstamp) +src/testing/googletest/src/libtesting_a-gtest_main.$(OBJEXT): \ + src/testing/googletest/src/$(am__dirstamp) \ + src/testing/googletest/src/$(DEPDIR)/$(am__dirstamp) +src/testing/googlemock/src/$(am__dirstamp): + @$(MKDIR_P) src/testing/googlemock/src + @: > src/testing/googlemock/src/$(am__dirstamp) +src/testing/googlemock/src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/testing/googlemock/src/$(DEPDIR) + @: > src/testing/googlemock/src/$(DEPDIR)/$(am__dirstamp) +src/testing/googlemock/src/libtesting_a-gmock-all.$(OBJEXT): \ + src/testing/googlemock/src/$(am__dirstamp) \ + src/testing/googlemock/src/$(DEPDIR)/$(am__dirstamp) +src/testing/$(am__dirstamp): + @$(MKDIR_P) src/testing + @: > src/testing/$(am__dirstamp) + +src/testing/libtesting.a: $(src_testing_libtesting_a_OBJECTS) $(src_testing_libtesting_a_DEPENDENCIES) $(EXTRA_src_testing_libtesting_a_DEPENDENCIES) src/testing/$(am__dirstamp) + $(AM_V_at)-rm -f src/testing/libtesting.a + $(AM_V_AR)$(src_testing_libtesting_a_AR) src/testing/libtesting.a $(src_testing_libtesting_a_OBJECTS) $(src_testing_libtesting_a_LIBADD) + $(AM_V_at)$(RANLIB) src/testing/libtesting.a +src/third_party/libdisasm/$(am__dirstamp): + @$(MKDIR_P) src/third_party/libdisasm + @: > src/third_party/libdisasm/$(am__dirstamp) +src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/third_party/libdisasm/$(DEPDIR) + @: > src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/ia32_implicit.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/ia32_insn.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/ia32_invariant.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/ia32_modrm.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/ia32_opcode_tables.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/ia32_operand.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/ia32_reg.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/ia32_settings.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/x86_disasm.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/x86_format.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/x86_imm.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/x86_insn.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/x86_misc.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) +src/third_party/libdisasm/x86_operand_list.$(OBJEXT): \ + src/third_party/libdisasm/$(am__dirstamp) \ + src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) + +src/third_party/libdisasm/libdisasm.a: $(src_third_party_libdisasm_libdisasm_a_OBJECTS) $(src_third_party_libdisasm_libdisasm_a_DEPENDENCIES) $(EXTRA_src_third_party_libdisasm_libdisasm_a_DEPENDENCIES) src/third_party/libdisasm/$(am__dirstamp) + $(AM_V_at)-rm -f src/third_party/libdisasm/libdisasm.a + $(AM_V_AR)$(src_third_party_libdisasm_libdisasm_a_AR) src/third_party/libdisasm/libdisasm.a $(src_third_party_libdisasm_libdisasm_a_OBJECTS) $(src_third_party_libdisasm_libdisasm_a_LIBADD) + $(AM_V_at)$(RANLIB) src/third_party/libdisasm/libdisasm.a + +src/client/linux/linux_client_unittest$(EXEEXT): $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_DEPENDENCIES) $(EXTRA_src_client_linux_linux_client_unittest_DEPENDENCIES) src/client/linux/$(am__dirstamp) + @rm -f src/client/linux/linux_client_unittest$(EXEEXT) + $(AM_V_CCLD)$(src_client_linux_linux_client_unittest_LINK) $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_LDADD) $(LIBS) +src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.$(OBJEXT): \ + src/testing/googletest/src/$(am__dirstamp) \ + src/testing/googletest/src/$(DEPDIR)/$(am__dirstamp) +src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.$(OBJEXT): \ + src/testing/googletest/src/$(am__dirstamp) \ + src/testing/googletest/src/$(DEPDIR)/$(am__dirstamp) +src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.$(OBJEXT): \ + src/testing/googlemock/src/$(am__dirstamp) \ + src/testing/googlemock/src/$(DEPDIR)/$(am__dirstamp) +src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.$(OBJEXT): \ + src/client/linux/handler/$(am__dirstamp) \ + src/client/linux/handler/$(DEPDIR)/$(am__dirstamp) +src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.$(OBJEXT): \ + src/client/linux/microdump_writer/$(am__dirstamp) \ + src/client/linux/microdump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) +src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tests/$(am__dirstamp): + @$(MKDIR_P) src/common/linux/tests + @: > src/common/linux/tests/$(am__dirstamp) +src/common/linux/tests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/common/linux/tests/$(DEPDIR) + @: > src/common/linux/tests/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.$(OBJEXT): \ + src/common/linux/tests/$(am__dirstamp) \ + src/common/linux/tests/$(DEPDIR)/$(am__dirstamp) +src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tests/$(am__dirstamp): + @$(MKDIR_P) src/common/tests + @: > src/common/tests/$(am__dirstamp) +src/common/tests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/common/tests/$(DEPDIR) + @: > src/common/tests/$(DEPDIR)/$(am__dirstamp) +src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.$(OBJEXT): \ + src/common/tests/$(am__dirstamp) \ + src/common/tests/$(DEPDIR)/$(am__dirstamp) +src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/client_linux_linux_client_unittest_shlib-dump_context.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/client_linux_linux_client_unittest_shlib-dump_object.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/client_linux_linux_client_unittest_shlib-logging.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/client_linux_linux_client_unittest_shlib-minidump.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) + +src/client/linux/linux_client_unittest_shlib$(EXEEXT): $(src_client_linux_linux_client_unittest_shlib_OBJECTS) $(src_client_linux_linux_client_unittest_shlib_DEPENDENCIES) $(EXTRA_src_client_linux_linux_client_unittest_shlib_DEPENDENCIES) src/client/linux/$(am__dirstamp) + @rm -f src/client/linux/linux_client_unittest_shlib$(EXEEXT) + $(AM_V_CXXLD)$(src_client_linux_linux_client_unittest_shlib_LINK) $(src_client_linux_linux_client_unittest_shlib_OBJECTS) $(src_client_linux_linux_client_unittest_shlib_LDADD) $(LIBS) +src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT): \ + src/client/linux/minidump_writer/$(am__dirstamp) \ + src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) + +src/client/linux/linux_dumper_unittest_helper$(EXEEXT): $(src_client_linux_linux_dumper_unittest_helper_OBJECTS) $(src_client_linux_linux_dumper_unittest_helper_DEPENDENCIES) $(EXTRA_src_client_linux_linux_dumper_unittest_helper_DEPENDENCIES) src/client/linux/$(am__dirstamp) + @rm -f src/client/linux/linux_dumper_unittest_helper$(EXEEXT) + $(AM_V_CXXLD)$(src_client_linux_linux_dumper_unittest_helper_LINK) $(src_client_linux_linux_dumper_unittest_helper_OBJECTS) $(src_client_linux_linux_dumper_unittest_helper_LDADD) $(LIBS) +src/common/dumper_unittest-byte_cursor_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-convert_UTF.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-dwarf_cfi_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-dwarf_cfi_to_module_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-dwarf_cu_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-dwarf_cu_to_module_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-dwarf_line_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-dwarf_line_to_module_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-dwarf_range_list_handler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-language.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-memory_range_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-module_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-path_helper.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-stabs_reader.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-stabs_reader_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-stabs_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-stabs_to_module_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-string_conversion.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-string_conversion_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dumper_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/$(am__dirstamp): + @$(MKDIR_P) src/common/dwarf + @: > src/common/dwarf/$(am__dirstamp) +src/common/dwarf/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/common/dwarf/$(DEPDIR) + @: > src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/dumper_unittest-bytereader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/dumper_unittest-bytereader_unittest.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/dumper_unittest-cfi_assembler.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/dumper_unittest-dwarf2diehandler.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/dumper_unittest-dwarf2reader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/dumper_unittest-elf_reader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-crc32.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-dump_symbols.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-dump_symbols_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-elf_core_dump.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-elf_core_dump_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-elf_symbols_to_module.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-elfutils.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-file_id.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-file_id_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-linux_libc_support.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-memory_mapped_file.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-memory_mapped_file_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-safe_readlink.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-safe_readlink_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-synth_elf.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/dumper_unittest-synth_elf_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tests/dumper_unittest-crash_generator.$(OBJEXT): \ + src/common/linux/tests/$(am__dirstamp) \ + src/common/linux/tests/$(DEPDIR)/$(am__dirstamp) +src/common/tests/dumper_unittest-file_utils.$(OBJEXT): \ + src/common/tests/$(am__dirstamp) \ + src/common/tests/$(DEPDIR)/$(am__dirstamp) + +src/common/dumper_unittest$(EXEEXT): $(src_common_dumper_unittest_OBJECTS) $(src_common_dumper_unittest_DEPENDENCIES) $(EXTRA_src_common_dumper_unittest_DEPENDENCIES) src/common/$(am__dirstamp) + @rm -f src/common/dumper_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_dumper_unittest_OBJECTS) $(src_common_dumper_unittest_LDADD) $(LIBS) +src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) + +src/common/dwarf/dwarf2reader_lineinfo_unittest$(EXEEXT): $(src_common_dwarf_dwarf2reader_lineinfo_unittest_OBJECTS) $(src_common_dwarf_dwarf2reader_lineinfo_unittest_DEPENDENCIES) $(EXTRA_src_common_dwarf_dwarf2reader_lineinfo_unittest_DEPENDENCIES) src/common/dwarf/$(am__dirstamp) + @rm -f src/common/dwarf/dwarf2reader_lineinfo_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_dwarf_dwarf2reader_lineinfo_unittest_OBJECTS) $(src_common_dwarf_dwarf2reader_lineinfo_unittest_LDADD) $(LIBS) +src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) + +src/common/dwarf/dwarf2reader_splitfunctions_unittest$(EXEEXT): $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_OBJECTS) $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_DEPENDENCIES) $(EXTRA_src_common_dwarf_dwarf2reader_splitfunctions_unittest_DEPENDENCIES) src/common/dwarf/$(am__dirstamp) + @rm -f src/common/dwarf/dwarf2reader_splitfunctions_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_OBJECTS) $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_LDADD) $(LIBS) +src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) + +src/common/linux/google_crashdump_uploader_test$(EXEEXT): $(src_common_linux_google_crashdump_uploader_test_OBJECTS) $(src_common_linux_google_crashdump_uploader_test_DEPENDENCIES) $(EXTRA_src_common_linux_google_crashdump_uploader_test_DEPENDENCIES) src/common/linux/$(am__dirstamp) + @rm -f src/common/linux/google_crashdump_uploader_test$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_linux_google_crashdump_uploader_test_OBJECTS) $(src_common_linux_google_crashdump_uploader_test_LDADD) $(LIBS) +src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) + +src/common/linux/scoped_pipe_unittest$(EXEEXT): $(src_common_linux_scoped_pipe_unittest_OBJECTS) $(src_common_linux_scoped_pipe_unittest_DEPENDENCIES) $(EXTRA_src_common_linux_scoped_pipe_unittest_DEPENDENCIES) src/common/linux/$(am__dirstamp) + @rm -f src/common/linux/scoped_pipe_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_linux_scoped_pipe_unittest_OBJECTS) $(src_common_linux_scoped_pipe_unittest_LDADD) $(LIBS) +src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) + +src/common/linux/scoped_tmpfile_unittest$(EXEEXT): $(src_common_linux_scoped_tmpfile_unittest_OBJECTS) $(src_common_linux_scoped_tmpfile_unittest_DEPENDENCIES) $(EXTRA_src_common_linux_scoped_tmpfile_unittest_DEPENDENCIES) src/common/linux/$(am__dirstamp) + @rm -f src/common/linux/scoped_tmpfile_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_linux_scoped_tmpfile_unittest_OBJECTS) $(src_common_linux_scoped_tmpfile_unittest_LDADD) $(LIBS) +src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/mac_macho_reader_unittest-dwarf_cu_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/mac_macho_reader_unittest-dwarf_line_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/mac_macho_reader_unittest-language.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/mac_macho_reader_unittest-md5.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/mac_macho_reader_unittest-module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/mac_macho_reader_unittest-path_helper.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/mac_macho_reader_unittest-stabs_reader.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/mac_macho_reader_unittest-stabs_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/mac_macho_reader_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/mac_macho_reader_unittest-bytereader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/mac_macho_reader_unittest-elf_reader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/mac/$(am__dirstamp): + @$(MKDIR_P) src/common/mac + @: > src/common/mac/$(am__dirstamp) +src/common/mac/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/common/mac/$(DEPDIR) + @: > src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/macho_reader_unittest-arch_utilities.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/macho_reader_unittest-file_id.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/macho_reader_unittest-macho_id.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/macho_reader_unittest-macho_reader.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/macho_reader_unittest-macho_reader_unittest.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/macho_reader_unittest-macho_utilities.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/macho_reader_unittest-macho_walker.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/tests/mac_macho_reader_unittest-file_utils.$(OBJEXT): \ + src/common/tests/$(am__dirstamp) \ + src/common/tests/$(DEPDIR)/$(am__dirstamp) + +src/common/mac/macho_reader_unittest$(EXEEXT): $(src_common_mac_macho_reader_unittest_OBJECTS) $(src_common_mac_macho_reader_unittest_DEPENDENCIES) $(EXTRA_src_common_mac_macho_reader_unittest_DEPENDENCIES) src/common/mac/$(am__dirstamp) + @rm -f src/common/mac/macho_reader_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_mac_macho_reader_unittest_OBJECTS) $(src_common_mac_macho_reader_unittest_LDADD) $(LIBS) +src/common/safe_math_unittest-safe_math_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) + +src/common/safe_math_unittest$(EXEEXT): $(src_common_safe_math_unittest_OBJECTS) $(src_common_safe_math_unittest_DEPENDENCIES) $(EXTRA_src_common_safe_math_unittest_DEPENDENCIES) src/common/$(am__dirstamp) + @rm -f src/common/safe_math_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_safe_math_unittest_OBJECTS) $(src_common_safe_math_unittest_LDADD) $(LIBS) +src/common/test_assembler_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/test_assembler_unittest-test_assembler_unittest.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) + +src/common/test_assembler_unittest$(EXEEXT): $(src_common_test_assembler_unittest_OBJECTS) $(src_common_test_assembler_unittest_DEPENDENCIES) $(EXTRA_src_common_test_assembler_unittest_DEPENDENCIES) src/common/$(am__dirstamp) + @rm -f src/common/test_assembler_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_common_test_assembler_unittest_OBJECTS) $(src_common_test_assembler_unittest_LDADD) $(LIBS) +src/processor/address_map_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/address_map_unittest$(EXEEXT): $(src_processor_address_map_unittest_OBJECTS) $(src_processor_address_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/address_map_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_address_map_unittest_OBJECTS) $(src_processor_address_map_unittest_LDADD) $(LIBS) +src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/basic_source_line_resolver_unittest$(EXEEXT): $(src_processor_basic_source_line_resolver_unittest_OBJECTS) $(src_processor_basic_source_line_resolver_unittest_DEPENDENCIES) $(EXTRA_src_processor_basic_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/basic_source_line_resolver_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_basic_source_line_resolver_unittest_OBJECTS) $(src_processor_basic_source_line_resolver_unittest_LDADD) $(LIBS) +src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/cfi_frame_info_unittest$(EXEEXT): $(src_processor_cfi_frame_info_unittest_OBJECTS) $(src_processor_cfi_frame_info_unittest_DEPENDENCIES) $(EXTRA_src_processor_cfi_frame_info_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/cfi_frame_info_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_cfi_frame_info_unittest_OBJECTS) $(src_processor_cfi_frame_info_unittest_LDADD) $(LIBS) +src/processor/contained_range_map_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/contained_range_map_unittest$(EXEEXT): $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/contained_range_map_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_LDADD) $(LIBS) +src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/disassembler_objdump_unittest$(EXEEXT): $(src_processor_disassembler_objdump_unittest_OBJECTS) $(src_processor_disassembler_objdump_unittest_DEPENDENCIES) $(EXTRA_src_processor_disassembler_objdump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/disassembler_objdump_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_disassembler_objdump_unittest_OBJECTS) $(src_processor_disassembler_objdump_unittest_LDADD) $(LIBS) +src/processor/disassembler_x86_unittest-disassembler_x86_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/disassembler_x86_unittest$(EXEEXT): $(src_processor_disassembler_x86_unittest_OBJECTS) $(src_processor_disassembler_x86_unittest_DEPENDENCIES) $(EXTRA_src_processor_disassembler_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/disassembler_x86_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_disassembler_x86_unittest_OBJECTS) $(src_processor_disassembler_x86_unittest_LDADD) $(LIBS) +src/processor/exploitability_unittest-exploitability_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/exploitability_unittest$(EXEEXT): $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_DEPENDENCIES) $(EXTRA_src_processor_exploitability_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/exploitability_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_LDADD) $(LIBS) +src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/fast_source_line_resolver_unittest$(EXEEXT): $(src_processor_fast_source_line_resolver_unittest_OBJECTS) $(src_processor_fast_source_line_resolver_unittest_DEPENDENCIES) $(EXTRA_src_processor_fast_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/fast_source_line_resolver_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_fast_source_line_resolver_unittest_OBJECTS) $(src_processor_fast_source_line_resolver_unittest_LDADD) $(LIBS) +src/processor/map_serializers_unittest-map_serializers_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/map_serializers_unittest$(EXEEXT): $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_DEPENDENCIES) $(EXTRA_src_processor_map_serializers_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/map_serializers_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_LDADD) $(LIBS) +src/processor/microdump_processor_unittest-microdump_processor_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/microdump_processor_unittest$(EXEEXT): $(src_processor_microdump_processor_unittest_OBJECTS) $(src_processor_microdump_processor_unittest_DEPENDENCIES) $(EXTRA_src_processor_microdump_processor_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/microdump_processor_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_microdump_processor_unittest_OBJECTS) $(src_processor_microdump_processor_unittest_LDADD) $(LIBS) +src/processor/microdump_stackwalk.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/microdump_stackwalk$(EXEEXT): $(src_processor_microdump_stackwalk_OBJECTS) $(src_processor_microdump_stackwalk_DEPENDENCIES) $(EXTRA_src_processor_microdump_stackwalk_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/microdump_stackwalk$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_microdump_stackwalk_OBJECTS) $(src_processor_microdump_stackwalk_LDADD) $(LIBS) +src/processor/minidump_dump.$(OBJEXT): src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/minidump_dump$(EXEEXT): $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_DEPENDENCIES) $(EXTRA_src_processor_minidump_dump_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/minidump_dump$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_LDADD) $(LIBS) +src/processor/minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/minidump_processor_unittest$(EXEEXT): $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_DEPENDENCIES) $(EXTRA_src_processor_minidump_processor_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/minidump_processor_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_LDADD) $(LIBS) +src/processor/minidump_stackwalk.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/minidump_stackwalk$(EXEEXT): $(src_processor_minidump_stackwalk_OBJECTS) $(src_processor_minidump_stackwalk_DEPENDENCIES) $(EXTRA_src_processor_minidump_stackwalk_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/minidump_stackwalk$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_minidump_stackwalk_OBJECTS) $(src_processor_minidump_stackwalk_LDADD) $(LIBS) +src/common/processor_minidump_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/minidump_unittest-minidump_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/minidump_unittest-synth_minidump.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/minidump_unittest$(EXEEXT): $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_DEPENDENCIES) $(EXTRA_src_processor_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/minidump_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_LDADD) $(LIBS) +src/processor/pathname_stripper_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/pathname_stripper_unittest$(EXEEXT): $(src_processor_pathname_stripper_unittest_OBJECTS) $(src_processor_pathname_stripper_unittest_DEPENDENCIES) $(EXTRA_src_processor_pathname_stripper_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/pathname_stripper_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_pathname_stripper_unittest_OBJECTS) $(src_processor_pathname_stripper_unittest_LDADD) $(LIBS) +src/processor/postfix_evaluator_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/postfix_evaluator_unittest$(EXEEXT): $(src_processor_postfix_evaluator_unittest_OBJECTS) $(src_processor_postfix_evaluator_unittest_DEPENDENCIES) $(EXTRA_src_processor_postfix_evaluator_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/postfix_evaluator_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_postfix_evaluator_unittest_OBJECTS) $(src_processor_postfix_evaluator_unittest_LDADD) $(LIBS) +src/processor/proc_maps_linux_unittest-proc_maps_linux.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/proc_maps_linux_unittest$(EXEEXT): $(src_processor_proc_maps_linux_unittest_OBJECTS) $(src_processor_proc_maps_linux_unittest_DEPENDENCIES) $(EXTRA_src_processor_proc_maps_linux_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/proc_maps_linux_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_proc_maps_linux_unittest_OBJECTS) $(src_processor_proc_maps_linux_unittest_LDADD) $(LIBS) +src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/range_map_truncate_lower_unittest$(EXEEXT): $(src_processor_range_map_truncate_lower_unittest_OBJECTS) $(src_processor_range_map_truncate_lower_unittest_DEPENDENCIES) $(EXTRA_src_processor_range_map_truncate_lower_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/range_map_truncate_lower_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_range_map_truncate_lower_unittest_OBJECTS) $(src_processor_range_map_truncate_lower_unittest_LDADD) $(LIBS) +src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/range_map_truncate_upper_unittest$(EXEEXT): $(src_processor_range_map_truncate_upper_unittest_OBJECTS) $(src_processor_range_map_truncate_upper_unittest_DEPENDENCIES) $(EXTRA_src_processor_range_map_truncate_upper_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/range_map_truncate_upper_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_range_map_truncate_upper_unittest_OBJECTS) $(src_processor_range_map_truncate_upper_unittest_LDADD) $(LIBS) +src/processor/range_map_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/range_map_unittest$(EXEEXT): $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/range_map_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_LDADD) $(LIBS) +src/common/processor_stackwalker_address_list_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/stackwalker_address_list_unittest$(EXEEXT): $(src_processor_stackwalker_address_list_unittest_OBJECTS) $(src_processor_stackwalker_address_list_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_address_list_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/stackwalker_address_list_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_stackwalker_address_list_unittest_OBJECTS) $(src_processor_stackwalker_address_list_unittest_LDADD) $(LIBS) +src/common/processor_stackwalker_amd64_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/stackwalker_amd64_unittest$(EXEEXT): $(src_processor_stackwalker_amd64_unittest_OBJECTS) $(src_processor_stackwalker_amd64_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_amd64_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/stackwalker_amd64_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_stackwalker_amd64_unittest_OBJECTS) $(src_processor_stackwalker_amd64_unittest_LDADD) $(LIBS) +src/common/processor_stackwalker_arm64_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/stackwalker_arm64_unittest$(EXEEXT): $(src_processor_stackwalker_arm64_unittest_OBJECTS) $(src_processor_stackwalker_arm64_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_arm64_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/stackwalker_arm64_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_stackwalker_arm64_unittest_OBJECTS) $(src_processor_stackwalker_arm64_unittest_LDADD) $(LIBS) +src/common/processor_stackwalker_arm_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/stackwalker_arm_unittest$(EXEEXT): $(src_processor_stackwalker_arm_unittest_OBJECTS) $(src_processor_stackwalker_arm_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_arm_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/stackwalker_arm_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_stackwalker_arm_unittest_OBJECTS) $(src_processor_stackwalker_arm_unittest_LDADD) $(LIBS) +src/common/processor_stackwalker_mips64_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/stackwalker_mips64_unittest$(EXEEXT): $(src_processor_stackwalker_mips64_unittest_OBJECTS) $(src_processor_stackwalker_mips64_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_mips64_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/stackwalker_mips64_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_stackwalker_mips64_unittest_OBJECTS) $(src_processor_stackwalker_mips64_unittest_LDADD) $(LIBS) +src/common/processor_stackwalker_mips_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/stackwalker_mips_unittest$(EXEEXT): $(src_processor_stackwalker_mips_unittest_OBJECTS) $(src_processor_stackwalker_mips_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_mips_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/stackwalker_mips_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_stackwalker_mips_unittest_OBJECTS) $(src_processor_stackwalker_mips_unittest_LDADD) $(LIBS) +src/common/processor_stackwalker_riscv64_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/stackwalker_riscv64_unittest$(EXEEXT): $(src_processor_stackwalker_riscv64_unittest_OBJECTS) $(src_processor_stackwalker_riscv64_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_riscv64_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/stackwalker_riscv64_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_stackwalker_riscv64_unittest_OBJECTS) $(src_processor_stackwalker_riscv64_unittest_LDADD) $(LIBS) +src/common/processor_stackwalker_riscv_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/stackwalker_riscv_unittest$(EXEEXT): $(src_processor_stackwalker_riscv_unittest_OBJECTS) $(src_processor_stackwalker_riscv_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_riscv_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/stackwalker_riscv_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_stackwalker_riscv_unittest_OBJECTS) $(src_processor_stackwalker_riscv_unittest_LDADD) $(LIBS) +src/processor/stackwalker_selftest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/stackwalker_selftest$(EXEEXT): $(src_processor_stackwalker_selftest_OBJECTS) $(src_processor_stackwalker_selftest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_selftest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/stackwalker_selftest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_stackwalker_selftest_OBJECTS) $(src_processor_stackwalker_selftest_LDADD) $(LIBS) +src/common/processor_stackwalker_x86_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/stackwalker_x86_unittest$(EXEEXT): $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/stackwalker_x86_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_LDADD) $(LIBS) +src/processor/static_address_map_unittest-static_address_map_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/static_address_map_unittest$(EXEEXT): $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/static_address_map_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_LDADD) $(LIBS) +src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/static_contained_range_map_unittest$(EXEEXT): $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/static_contained_range_map_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_LDADD) $(LIBS) +src/processor/static_map_unittest-static_map_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/static_map_unittest$(EXEEXT): $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/static_map_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_LDADD) $(LIBS) +src/processor/static_range_map_unittest-static_range_map_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/static_range_map_unittest$(EXEEXT): $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/static_range_map_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_LDADD) $(LIBS) +src/common/processor_synth_minidump_unittest-test_assembler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/processor/synth_minidump_unittest-synth_minidump_unittest.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/synth_minidump_unittest-synth_minidump.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) + +src/processor/synth_minidump_unittest$(EXEEXT): $(src_processor_synth_minidump_unittest_OBJECTS) $(src_processor_synth_minidump_unittest_DEPENDENCIES) $(EXTRA_src_processor_synth_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) + @rm -f src/processor/synth_minidump_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_processor_synth_minidump_unittest_OBJECTS) $(src_processor_synth_minidump_unittest_LDADD) $(LIBS) +src/tools/linux/core2md/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/core2md + @: > src/tools/linux/core2md/$(am__dirstamp) +src/tools/linux/core2md/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/core2md/$(DEPDIR) + @: > src/tools/linux/core2md/$(DEPDIR)/$(am__dirstamp) +src/tools/linux/core2md/core2md.$(OBJEXT): \ + src/tools/linux/core2md/$(am__dirstamp) \ + src/tools/linux/core2md/$(DEPDIR)/$(am__dirstamp) + +src/tools/linux/core2md/core2md$(EXEEXT): $(src_tools_linux_core2md_core2md_OBJECTS) $(src_tools_linux_core2md_core2md_DEPENDENCIES) $(EXTRA_src_tools_linux_core2md_core2md_DEPENDENCIES) src/tools/linux/core2md/$(am__dirstamp) + @rm -f src/tools/linux/core2md/core2md$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_tools_linux_core2md_core2md_OBJECTS) $(src_tools_linux_core2md_core2md_LDADD) $(LIBS) +src/tools/linux/core_handler/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/core_handler + @: > src/tools/linux/core_handler/$(am__dirstamp) +src/tools/linux/core_handler/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/core_handler/$(DEPDIR) + @: > src/tools/linux/core_handler/$(DEPDIR)/$(am__dirstamp) +src/tools/linux/core_handler/core_handler.$(OBJEXT): \ + src/tools/linux/core_handler/$(am__dirstamp) \ + src/tools/linux/core_handler/$(DEPDIR)/$(am__dirstamp) + +src/tools/linux/core_handler/core_handler$(EXEEXT): $(src_tools_linux_core_handler_core_handler_OBJECTS) $(src_tools_linux_core_handler_core_handler_DEPENDENCIES) $(EXTRA_src_tools_linux_core_handler_core_handler_DEPENDENCIES) src/tools/linux/core_handler/$(am__dirstamp) + @rm -f src/tools/linux/core_handler/core_handler$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_tools_linux_core_handler_core_handler_OBJECTS) $(src_tools_linux_core_handler_core_handler_LDADD) $(LIBS) +src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_linux_dump_syms_dump_syms-language.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_linux_dump_syms_dump_syms-module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_linux_dump_syms_dump_syms-path_helper.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_linux_dump_syms_dump_syms-stabs_reader.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tools_linux_dump_syms_dump_syms-crc32.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tools_linux_dump_syms_dump_syms-file_id.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/tools/linux/dump_syms/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/dump_syms + @: > src/tools/linux/dump_syms/$(am__dirstamp) +src/tools/linux/dump_syms/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/dump_syms/$(DEPDIR) + @: > src/tools/linux/dump_syms/$(DEPDIR)/$(am__dirstamp) +src/tools/linux/dump_syms/dump_syms-dump_syms.$(OBJEXT): \ + src/tools/linux/dump_syms/$(am__dirstamp) \ + src/tools/linux/dump_syms/$(DEPDIR)/$(am__dirstamp) + +src/tools/linux/dump_syms/dump_syms$(EXEEXT): $(src_tools_linux_dump_syms_dump_syms_OBJECTS) $(src_tools_linux_dump_syms_dump_syms_DEPENDENCIES) $(EXTRA_src_tools_linux_dump_syms_dump_syms_DEPENDENCIES) src/tools/linux/dump_syms/$(am__dirstamp) + @rm -f src/tools/linux/dump_syms/dump_syms$(EXEEXT) + $(AM_V_CXXLD)$(src_tools_linux_dump_syms_dump_syms_LINK) $(src_tools_linux_dump_syms_dump_syms_OBJECTS) $(src_tools_linux_dump_syms_dump_syms_LDADD) $(LIBS) +src/common/path_helper.$(OBJEXT): src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/tools/linux/md2core/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/md2core + @: > src/tools/linux/md2core/$(am__dirstamp) +src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/md2core/$(DEPDIR) + @: > src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp) +src/tools/linux/md2core/minidump-2-core.$(OBJEXT): \ + src/tools/linux/md2core/$(am__dirstamp) \ + src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp) + +src/tools/linux/md2core/minidump-2-core$(EXEEXT): $(src_tools_linux_md2core_minidump_2_core_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_DEPENDENCIES) $(EXTRA_src_tools_linux_md2core_minidump_2_core_DEPENDENCIES) src/tools/linux/md2core/$(am__dirstamp) + @rm -f src/tools/linux/md2core/minidump-2-core$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_tools_linux_md2core_minidump_2_core_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_LDADD) $(LIBS) +src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.$(OBJEXT): \ + src/tools/linux/md2core/$(am__dirstamp) \ + src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp) + +src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT): $(src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES) $(EXTRA_src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES) src/tools/linux/md2core/$(am__dirstamp) + @rm -f src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_unittest_LDADD) $(LIBS) +src/tools/linux/pid2md/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/pid2md + @: > src/tools/linux/pid2md/$(am__dirstamp) +src/tools/linux/pid2md/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/pid2md/$(DEPDIR) + @: > src/tools/linux/pid2md/$(DEPDIR)/$(am__dirstamp) +src/tools/linux/pid2md/pid2md.$(OBJEXT): \ + src/tools/linux/pid2md/$(am__dirstamp) \ + src/tools/linux/pid2md/$(DEPDIR)/$(am__dirstamp) + +src/tools/linux/pid2md/pid2md$(EXEEXT): $(src_tools_linux_pid2md_pid2md_OBJECTS) $(src_tools_linux_pid2md_pid2md_DEPENDENCIES) $(EXTRA_src_tools_linux_pid2md_pid2md_DEPENDENCIES) src/tools/linux/pid2md/$(am__dirstamp) + @rm -f src/tools/linux/pid2md/pid2md$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_tools_linux_pid2md_pid2md_OBJECTS) $(src_tools_linux_pid2md_pid2md_LDADD) $(LIBS) +src/common/linux/http_upload.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/tools/linux/symupload/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/symupload + @: > src/tools/linux/symupload/$(am__dirstamp) +src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/tools/linux/symupload/$(DEPDIR) + @: > src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp) +src/tools/linux/symupload/minidump_upload.$(OBJEXT): \ + src/tools/linux/symupload/$(am__dirstamp) \ + src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp) + +src/tools/linux/symupload/minidump_upload$(EXEEXT): $(src_tools_linux_symupload_minidump_upload_OBJECTS) $(src_tools_linux_symupload_minidump_upload_DEPENDENCIES) $(EXTRA_src_tools_linux_symupload_minidump_upload_DEPENDENCIES) src/tools/linux/symupload/$(am__dirstamp) + @rm -f src/tools/linux/symupload/minidump_upload$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_tools_linux_symupload_minidump_upload_OBJECTS) $(src_tools_linux_symupload_minidump_upload_LDADD) $(LIBS) +src/common/linux/libcurl_wrapper.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/symbol_collector_client.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/common/linux/symbol_upload.$(OBJEXT): \ + src/common/linux/$(am__dirstamp) \ + src/common/linux/$(DEPDIR)/$(am__dirstamp) +src/tools/linux/symupload/sym_upload.$(OBJEXT): \ + src/tools/linux/symupload/$(am__dirstamp) \ + src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp) + +src/tools/linux/symupload/sym_upload$(EXEEXT): $(src_tools_linux_symupload_sym_upload_OBJECTS) $(src_tools_linux_symupload_sym_upload_DEPENDENCIES) $(EXTRA_src_tools_linux_symupload_sym_upload_DEPENDENCIES) src/tools/linux/symupload/$(am__dirstamp) + @rm -f src/tools/linux/symupload/sym_upload$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(src_tools_linux_symupload_sym_upload_OBJECTS) $(src_tools_linux_symupload_sym_upload_LDADD) $(LIBS) +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_mac_dump_syms_dump_syms_mac-language.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_mac_dump_syms_dump_syms_mac-md5.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_mac_dump_syms_dump_syms_mac-module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.$(OBJEXT): \ + src/common/dwarf/$(am__dirstamp) \ + src/common/dwarf/$(DEPDIR)/$(am__dirstamp) +src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.$(OBJEXT): \ + src/common/mac/$(am__dirstamp) \ + src/common/mac/$(DEPDIR)/$(am__dirstamp) +src/tools/mac/dump_syms/$(am__dirstamp): + @$(MKDIR_P) src/tools/mac/dump_syms + @: > src/tools/mac/dump_syms/$(am__dirstamp) +src/tools/mac/dump_syms/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/tools/mac/dump_syms/$(DEPDIR) + @: > src/tools/mac/dump_syms/$(DEPDIR)/$(am__dirstamp) +src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.$(OBJEXT): \ + src/tools/mac/dump_syms/$(am__dirstamp) \ + src/tools/mac/dump_syms/$(DEPDIR)/$(am__dirstamp) + +src/tools/mac/dump_syms/dump_syms_mac$(EXEEXT): $(src_tools_mac_dump_syms_dump_syms_mac_OBJECTS) $(src_tools_mac_dump_syms_dump_syms_mac_DEPENDENCIES) $(EXTRA_src_tools_mac_dump_syms_dump_syms_mac_DEPENDENCIES) src/tools/mac/dump_syms/$(am__dirstamp) + @rm -f src/tools/mac/dump_syms/dump_syms_mac$(EXEEXT) + $(AM_V_CXXLD)$(src_tools_mac_dump_syms_dump_syms_mac_LINK) $(src_tools_mac_dump_syms_dump_syms_mac_OBJECTS) $(src_tools_mac_dump_syms_dump_syms_mac_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f src/client/*.$(OBJEXT) + -rm -f src/client/linux/crash_generation/*.$(OBJEXT) + -rm -f src/client/linux/dump_writer_common/*.$(OBJEXT) + -rm -f src/client/linux/handler/*.$(OBJEXT) + -rm -f src/client/linux/log/*.$(OBJEXT) + -rm -f src/client/linux/microdump_writer/*.$(OBJEXT) + -rm -f src/client/linux/minidump_writer/*.$(OBJEXT) + -rm -f src/common/*.$(OBJEXT) + -rm -f src/common/dwarf/*.$(OBJEXT) + -rm -f src/common/linux/*.$(OBJEXT) + -rm -f src/common/linux/tests/*.$(OBJEXT) + -rm -f src/common/mac/*.$(OBJEXT) + -rm -f src/common/tests/*.$(OBJEXT) + -rm -f src/processor/*.$(OBJEXT) + -rm -f src/testing/googlemock/src/*.$(OBJEXT) + -rm -f src/testing/googletest/src/*.$(OBJEXT) + -rm -f src/third_party/libdisasm/*.$(OBJEXT) + -rm -f src/tools/linux/core2md/*.$(OBJEXT) + -rm -f src/tools/linux/core_handler/*.$(OBJEXT) + -rm -f src/tools/linux/dump_syms/*.$(OBJEXT) + -rm -f src/tools/linux/md2core/*.$(OBJEXT) + -rm -f src/tools/linux/pid2md/*.$(OBJEXT) + -rm -f src/tools/linux/symupload/*.$(OBJEXT) + -rm -f src/tools/mac/dump_syms/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@src/client/$(DEPDIR)/minidump_file_writer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/crash_generation/$(DEPDIR)/crash_generation_client.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/crash_generation/$(DEPDIR)/crash_generation_server.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/dump_writer_common/$(DEPDIR)/thread_info.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/dump_writer_common/$(DEPDIR)/ucontext_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/handler/$(DEPDIR)/exception_handler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/handler/$(DEPDIR)/linux_client_unittest_shlib-exception_handler_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/handler/$(DEPDIR)/minidump_descriptor.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/log/$(DEPDIR)/log.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/microdump_writer/$(DEPDIR)/linux_client_unittest_shlib-microdump_writer_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/microdump_writer/$(DEPDIR)/microdump_writer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-cpu_set_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-directory_reader_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-line_reader_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest_utils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-pe_file.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_core_dumper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper_unittest_helper-linux_dumper_unittest_helper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/linux_ptrace_dumper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/minidump_writer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/client/linux/minidump_writer/$(DEPDIR)/pe_file.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/convert_UTF.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-byte_cursor_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-convert_UTF.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-dwarf_range_list_handler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-language.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-memory_range_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-module_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-path_helper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-stabs_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-stabs_reader_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-stabs_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-stabs_to_module_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-string_conversion.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-string_conversion_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/dumper_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cu_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_line_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/mac_macho_reader_unittest-language.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/mac_macho_reader_unittest-md5.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/mac_macho_reader_unittest-module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/mac_macho_reader_unittest-path_helper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/mac_macho_reader_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/md5.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/path_helper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_minidump_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_stackwalker_address_list_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_stackwalker_amd64_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_stackwalker_arm64_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_stackwalker_arm_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_stackwalker_mips64_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_stackwalker_mips_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_stackwalker_riscv64_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_stackwalker_riscv_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_stackwalker_x86_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/processor_synth_minidump_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/safe_math_unittest-safe_math_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/string_conversion.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/test_assembler_unittest-test_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/test_assembler_unittest-test_assembler_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-language.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-path_helper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-language.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-md5.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-path_helper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dumper_unittest-cfi_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_cfi_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_die_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dumper_unittest-elf_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-bytereader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-cfi_assembler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2diehandler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-elf_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-bytereader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2diehandler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-bytereader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-elf_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/breakpad_getcontext.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-elfutils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-file_id.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-file_id_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-linux_libc_support.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/elf_core_dump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/elfutils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/file_id.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-libcurl_wrapper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/guid_creator.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/http_upload.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/libcurl_wrapper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/linux_libc_support.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/memory_mapped_file.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/safe_readlink.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/scoped_pipe.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/scoped_tmpfile.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/symbol_collector_client.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/symbol_upload.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dump_symbols.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elfutils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-file_id.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-linux_libc_support.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-memory_mapped_file.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-safe_readlink.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/tests/$(DEPDIR)/dumper_unittest-crash_generator.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/macho_reader_unittest-arch_utilities.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/macho_reader_unittest-file_id.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_id.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_utilities.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_walker.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-arch_utilities.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dump_syms.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-file_id.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_id.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_reader.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_utilities.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_walker.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-file_utils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/tests/$(DEPDIR)/dumper_unittest-file_utils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/common/tests/$(DEPDIR)/mac_macho_reader_unittest-file_utils.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/address_map_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/basic_code_modules.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/basic_source_line_resolver.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/call_stack.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/cfi_frame_info.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/cfi_frame_info_unittest-cfi_frame_info_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-basic_code_modules.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_context.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_object.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-logging.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-minidump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-pathname_stripper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-proc_maps_linux.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/contained_range_map_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/convert_old_arm64_context.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/disassembler_objdump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/disassembler_objdump_unittest-disassembler_objdump_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/disassembler_x86.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/disassembler_x86_unittest-disassembler_x86_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/dump_context.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/dump_object.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/exploitability.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/exploitability_linux.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/exploitability_unittest-exploitability_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/exploitability_win.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/fast_source_line_resolver.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/logging.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/map_serializers_unittest-map_serializers_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/microdump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/microdump_processor.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/microdump_processor_unittest-microdump_processor_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/microdump_stackwalk.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_dump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_processor.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_processor_unittest-minidump_processor_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_stackwalk.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_unittest-minidump_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_unittest-synth_minidump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/module_comparer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/module_serializer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/pathname_stripper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/pathname_stripper_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/postfix_evaluator_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/proc_maps_linux.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/process_state.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/range_map_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/simple_symbol_supplier.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/source_line_resolver_base.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stack_frame_cpu.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stack_frame_symbolizer.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalk_common.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_address_list.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_address_list_unittest-stackwalker_address_list_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_amd64.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_amd64_unittest-stackwalker_amd64_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_arm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_arm64.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_arm64_unittest-stackwalker_arm64_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_arm_unittest-stackwalker_arm_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_mips.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_mips64_unittest-stackwalker_mips64_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_mips_unittest-stackwalker_mips_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_ppc.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_ppc64.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_riscv.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_riscv64.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_riscv_unittest-stackwalker_riscv_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_selftest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_sparc.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_x86.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_x86_unittest-stackwalker_x86_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/static_address_map_unittest-static_address_map_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/static_contained_range_map_unittest-static_contained_range_map_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/static_map_unittest-static_map_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/static_range_map_unittest-static_range_map_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/symbolic_constants_win.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/tokenize.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/testing/googlemock/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gmock-all.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/testing/googlemock/src/$(DEPDIR)/libtesting_a-gmock-all.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest-all.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest_main.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest-all.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest_main.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/ia32_implicit.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/ia32_insn.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/ia32_invariant.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/ia32_modrm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/ia32_opcode_tables.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/ia32_operand.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/ia32_reg.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/ia32_settings.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/x86_disasm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/x86_format.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/x86_imm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/x86_insn.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/x86_misc.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/third_party/libdisasm/$(DEPDIR)/x86_operand_list.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/tools/linux/core2md/$(DEPDIR)/core2md.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/tools/linux/core_handler/$(DEPDIR)/core_handler.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/tools/linux/dump_syms/$(DEPDIR)/dump_syms-dump_syms.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/tools/linux/md2core/$(DEPDIR)/minidump-2-core.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/tools/linux/md2core/$(DEPDIR)/minidump_2_core_unittest-minidump_memory_range_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/tools/linux/pid2md/$(DEPDIR)/pid2md.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/tools/linux/symupload/$(DEPDIR)/minidump_upload.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/tools/linux/symupload/$(DEPDIR)/sym_upload.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@src/tools/mac/dump_syms/$(DEPDIR)/dump_syms_mac-dump_syms_tool.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.S.o: +@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ $< + +.S.obj: +@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCCAS_TRUE@ $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCCAS_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.o: src/common/linux/breakpad_getcontext.S +@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.o -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.o `test -f 'src/common/linux/breakpad_getcontext.S' || echo '$(srcdir)/'`src/common/linux/breakpad_getcontext.S +@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext.Po +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='src/common/linux/breakpad_getcontext.S' object='src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.o `test -f 'src/common/linux/breakpad_getcontext.S' || echo '$(srcdir)/'`src/common/linux/breakpad_getcontext.S + +src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.obj: src/common/linux/breakpad_getcontext.S +@am__fastdepCCAS_TRUE@ $(AM_V_CPPAS)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.obj -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.obj `if test -f 'src/common/linux/breakpad_getcontext.S'; then $(CYGPATH_W) 'src/common/linux/breakpad_getcontext.S'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/breakpad_getcontext.S'; fi` +@am__fastdepCCAS_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext.Po +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS)source='src/common/linux/breakpad_getcontext.S' object='src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCCAS_FALSE@ DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCCAS_FALSE@ $(AM_V_CPPAS@am__nodep@)$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext.obj `if test -f 'src/common/linux/breakpad_getcontext.S'; then $(CYGPATH_W) 'src/common/linux/breakpad_getcontext.S'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/breakpad_getcontext.S'; fi` + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +src/testing/googletest/src/libtesting_a-gtest-all.o: src/testing/googletest/src/gtest-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googletest/src/libtesting_a-gtest-all.o -MD -MP -MF src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest-all.Tpo -c -o src/testing/googletest/src/libtesting_a-gtest-all.o `test -f 'src/testing/googletest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/googletest/src/gtest-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest-all.Tpo src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest-all.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googletest/src/gtest-all.cc' object='src/testing/googletest/src/libtesting_a-gtest-all.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googletest/src/libtesting_a-gtest-all.o `test -f 'src/testing/googletest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/googletest/src/gtest-all.cc + +src/testing/googletest/src/libtesting_a-gtest-all.obj: src/testing/googletest/src/gtest-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googletest/src/libtesting_a-gtest-all.obj -MD -MP -MF src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest-all.Tpo -c -o src/testing/googletest/src/libtesting_a-gtest-all.obj `if test -f 'src/testing/googletest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/googletest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googletest/src/gtest-all.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest-all.Tpo src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest-all.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googletest/src/gtest-all.cc' object='src/testing/googletest/src/libtesting_a-gtest-all.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googletest/src/libtesting_a-gtest-all.obj `if test -f 'src/testing/googletest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/googletest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googletest/src/gtest-all.cc'; fi` + +src/testing/googletest/src/libtesting_a-gtest_main.o: src/testing/googletest/src/gtest_main.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googletest/src/libtesting_a-gtest_main.o -MD -MP -MF src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest_main.Tpo -c -o src/testing/googletest/src/libtesting_a-gtest_main.o `test -f 'src/testing/googletest/src/gtest_main.cc' || echo '$(srcdir)/'`src/testing/googletest/src/gtest_main.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest_main.Tpo src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest_main.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googletest/src/gtest_main.cc' object='src/testing/googletest/src/libtesting_a-gtest_main.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googletest/src/libtesting_a-gtest_main.o `test -f 'src/testing/googletest/src/gtest_main.cc' || echo '$(srcdir)/'`src/testing/googletest/src/gtest_main.cc + +src/testing/googletest/src/libtesting_a-gtest_main.obj: src/testing/googletest/src/gtest_main.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googletest/src/libtesting_a-gtest_main.obj -MD -MP -MF src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest_main.Tpo -c -o src/testing/googletest/src/libtesting_a-gtest_main.obj `if test -f 'src/testing/googletest/src/gtest_main.cc'; then $(CYGPATH_W) 'src/testing/googletest/src/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googletest/src/gtest_main.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest_main.Tpo src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest_main.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googletest/src/gtest_main.cc' object='src/testing/googletest/src/libtesting_a-gtest_main.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googletest/src/libtesting_a-gtest_main.obj `if test -f 'src/testing/googletest/src/gtest_main.cc'; then $(CYGPATH_W) 'src/testing/googletest/src/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googletest/src/gtest_main.cc'; fi` + +src/testing/googlemock/src/libtesting_a-gmock-all.o: src/testing/googlemock/src/gmock-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googlemock/src/libtesting_a-gmock-all.o -MD -MP -MF src/testing/googlemock/src/$(DEPDIR)/libtesting_a-gmock-all.Tpo -c -o src/testing/googlemock/src/libtesting_a-gmock-all.o `test -f 'src/testing/googlemock/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/googlemock/src/gmock-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googlemock/src/$(DEPDIR)/libtesting_a-gmock-all.Tpo src/testing/googlemock/src/$(DEPDIR)/libtesting_a-gmock-all.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googlemock/src/gmock-all.cc' object='src/testing/googlemock/src/libtesting_a-gmock-all.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googlemock/src/libtesting_a-gmock-all.o `test -f 'src/testing/googlemock/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/googlemock/src/gmock-all.cc + +src/testing/googlemock/src/libtesting_a-gmock-all.obj: src/testing/googlemock/src/gmock-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googlemock/src/libtesting_a-gmock-all.obj -MD -MP -MF src/testing/googlemock/src/$(DEPDIR)/libtesting_a-gmock-all.Tpo -c -o src/testing/googlemock/src/libtesting_a-gmock-all.obj `if test -f 'src/testing/googlemock/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/googlemock/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googlemock/src/gmock-all.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googlemock/src/$(DEPDIR)/libtesting_a-gmock-all.Tpo src/testing/googlemock/src/$(DEPDIR)/libtesting_a-gmock-all.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googlemock/src/gmock-all.cc' object='src/testing/googlemock/src/libtesting_a-gmock-all.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_testing_libtesting_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googlemock/src/libtesting_a-gmock-all.obj `if test -f 'src/testing/googlemock/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/googlemock/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googlemock/src/gmock-all.cc'; fi` + +src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.o: src/testing/googletest/src/gtest-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.o -MD -MP -MF src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest-all.Tpo -c -o src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.o `test -f 'src/testing/googletest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/googletest/src/gtest-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest-all.Tpo src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest-all.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googletest/src/gtest-all.cc' object='src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.o `test -f 'src/testing/googletest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/googletest/src/gtest-all.cc + +src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.obj: src/testing/googletest/src/gtest-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.obj -MD -MP -MF src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest-all.Tpo -c -o src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.obj `if test -f 'src/testing/googletest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/googletest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googletest/src/gtest-all.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest-all.Tpo src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest-all.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googletest/src/gtest-all.cc' object='src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest-all.obj `if test -f 'src/testing/googletest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/googletest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googletest/src/gtest-all.cc'; fi` + +src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.o: src/testing/googletest/src/gtest_main.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.o -MD -MP -MF src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest_main.Tpo -c -o src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.o `test -f 'src/testing/googletest/src/gtest_main.cc' || echo '$(srcdir)/'`src/testing/googletest/src/gtest_main.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest_main.Tpo src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest_main.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googletest/src/gtest_main.cc' object='src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.o `test -f 'src/testing/googletest/src/gtest_main.cc' || echo '$(srcdir)/'`src/testing/googletest/src/gtest_main.cc + +src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.obj: src/testing/googletest/src/gtest_main.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.obj -MD -MP -MF src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest_main.Tpo -c -o src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.obj `if test -f 'src/testing/googletest/src/gtest_main.cc'; then $(CYGPATH_W) 'src/testing/googletest/src/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googletest/src/gtest_main.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest_main.Tpo src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest_main.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googletest/src/gtest_main.cc' object='src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googletest/src/client_linux_linux_client_unittest_shlib-gtest_main.obj `if test -f 'src/testing/googletest/src/gtest_main.cc'; then $(CYGPATH_W) 'src/testing/googletest/src/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googletest/src/gtest_main.cc'; fi` + +src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.o: src/testing/googlemock/src/gmock-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.o -MD -MP -MF src/testing/googlemock/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gmock-all.Tpo -c -o src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.o `test -f 'src/testing/googlemock/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/googlemock/src/gmock-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googlemock/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gmock-all.Tpo src/testing/googlemock/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gmock-all.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googlemock/src/gmock-all.cc' object='src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.o `test -f 'src/testing/googlemock/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/googlemock/src/gmock-all.cc + +src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.obj: src/testing/googlemock/src/gmock-all.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.obj -MD -MP -MF src/testing/googlemock/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gmock-all.Tpo -c -o src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.obj `if test -f 'src/testing/googlemock/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/googlemock/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googlemock/src/gmock-all.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/testing/googlemock/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gmock-all.Tpo src/testing/googlemock/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gmock-all.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/testing/googlemock/src/gmock-all.cc' object='src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/googlemock/src/client_linux_linux_client_unittest_shlib-gmock-all.obj `if test -f 'src/testing/googlemock/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/googlemock/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/googlemock/src/gmock-all.cc'; fi` + +src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.o: src/client/linux/handler/exception_handler_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.o -MD -MP -MF src/client/linux/handler/$(DEPDIR)/linux_client_unittest_shlib-exception_handler_unittest.Tpo -c -o src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.o `test -f 'src/client/linux/handler/exception_handler_unittest.cc' || echo '$(srcdir)/'`src/client/linux/handler/exception_handler_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/handler/$(DEPDIR)/linux_client_unittest_shlib-exception_handler_unittest.Tpo src/client/linux/handler/$(DEPDIR)/linux_client_unittest_shlib-exception_handler_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/handler/exception_handler_unittest.cc' object='src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.o `test -f 'src/client/linux/handler/exception_handler_unittest.cc' || echo '$(srcdir)/'`src/client/linux/handler/exception_handler_unittest.cc + +src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.obj: src/client/linux/handler/exception_handler_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.obj -MD -MP -MF src/client/linux/handler/$(DEPDIR)/linux_client_unittest_shlib-exception_handler_unittest.Tpo -c -o src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.obj `if test -f 'src/client/linux/handler/exception_handler_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/handler/exception_handler_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/handler/exception_handler_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/handler/$(DEPDIR)/linux_client_unittest_shlib-exception_handler_unittest.Tpo src/client/linux/handler/$(DEPDIR)/linux_client_unittest_shlib-exception_handler_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/handler/exception_handler_unittest.cc' object='src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/handler/linux_client_unittest_shlib-exception_handler_unittest.obj `if test -f 'src/client/linux/handler/exception_handler_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/handler/exception_handler_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/handler/exception_handler_unittest.cc'; fi` + +src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.o: src/client/linux/microdump_writer/microdump_writer_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.o -MD -MP -MF src/client/linux/microdump_writer/$(DEPDIR)/linux_client_unittest_shlib-microdump_writer_unittest.Tpo -c -o src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.o `test -f 'src/client/linux/microdump_writer/microdump_writer_unittest.cc' || echo '$(srcdir)/'`src/client/linux/microdump_writer/microdump_writer_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/microdump_writer/$(DEPDIR)/linux_client_unittest_shlib-microdump_writer_unittest.Tpo src/client/linux/microdump_writer/$(DEPDIR)/linux_client_unittest_shlib-microdump_writer_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/microdump_writer/microdump_writer_unittest.cc' object='src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.o `test -f 'src/client/linux/microdump_writer/microdump_writer_unittest.cc' || echo '$(srcdir)/'`src/client/linux/microdump_writer/microdump_writer_unittest.cc + +src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.obj: src/client/linux/microdump_writer/microdump_writer_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.obj -MD -MP -MF src/client/linux/microdump_writer/$(DEPDIR)/linux_client_unittest_shlib-microdump_writer_unittest.Tpo -c -o src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.obj `if test -f 'src/client/linux/microdump_writer/microdump_writer_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/microdump_writer/microdump_writer_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/microdump_writer/microdump_writer_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/microdump_writer/$(DEPDIR)/linux_client_unittest_shlib-microdump_writer_unittest.Tpo src/client/linux/microdump_writer/$(DEPDIR)/linux_client_unittest_shlib-microdump_writer_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/microdump_writer/microdump_writer_unittest.cc' object='src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/microdump_writer/linux_client_unittest_shlib-microdump_writer_unittest.obj `if test -f 'src/client/linux/microdump_writer/microdump_writer_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/microdump_writer/microdump_writer_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/microdump_writer/microdump_writer_unittest.cc'; fi` + +src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.o: src/client/linux/minidump_writer/directory_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-directory_reader_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.o `test -f 'src/client/linux/minidump_writer/directory_reader_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/directory_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-directory_reader_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-directory_reader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/directory_reader_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.o `test -f 'src/client/linux/minidump_writer/directory_reader_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/directory_reader_unittest.cc + +src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.obj: src/client/linux/minidump_writer/directory_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-directory_reader_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.obj `if test -f 'src/client/linux/minidump_writer/directory_reader_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/directory_reader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/directory_reader_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-directory_reader_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-directory_reader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/directory_reader_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-directory_reader_unittest.obj `if test -f 'src/client/linux/minidump_writer/directory_reader_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/directory_reader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/directory_reader_unittest.cc'; fi` + +src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.o: src/client/linux/minidump_writer/cpu_set_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-cpu_set_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.o `test -f 'src/client/linux/minidump_writer/cpu_set_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/cpu_set_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-cpu_set_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-cpu_set_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/cpu_set_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.o `test -f 'src/client/linux/minidump_writer/cpu_set_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/cpu_set_unittest.cc + +src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.obj: src/client/linux/minidump_writer/cpu_set_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-cpu_set_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.obj `if test -f 'src/client/linux/minidump_writer/cpu_set_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/cpu_set_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/cpu_set_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-cpu_set_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-cpu_set_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/cpu_set_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-cpu_set_unittest.obj `if test -f 'src/client/linux/minidump_writer/cpu_set_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/cpu_set_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/cpu_set_unittest.cc'; fi` + +src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.o: src/client/linux/minidump_writer/line_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-line_reader_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.o `test -f 'src/client/linux/minidump_writer/line_reader_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/line_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-line_reader_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-line_reader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/line_reader_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.o `test -f 'src/client/linux/minidump_writer/line_reader_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/line_reader_unittest.cc + +src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.obj: src/client/linux/minidump_writer/line_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-line_reader_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.obj `if test -f 'src/client/linux/minidump_writer/line_reader_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/line_reader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/line_reader_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-line_reader_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-line_reader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/line_reader_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-line_reader_unittest.obj `if test -f 'src/client/linux/minidump_writer/line_reader_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/line_reader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/line_reader_unittest.cc'; fi` + +src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.o: src/client/linux/minidump_writer/linux_core_dumper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.o `test -f 'src/client/linux/minidump_writer/linux_core_dumper.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/linux_core_dumper.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/linux_core_dumper.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.o `test -f 'src/client/linux/minidump_writer/linux_core_dumper.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/linux_core_dumper.cc + +src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.obj: src/client/linux/minidump_writer/linux_core_dumper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.obj `if test -f 'src/client/linux/minidump_writer/linux_core_dumper.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/linux_core_dumper.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/linux_core_dumper.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/linux_core_dumper.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper.obj `if test -f 'src/client/linux/minidump_writer/linux_core_dumper.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/linux_core_dumper.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/linux_core_dumper.cc'; fi` + +src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.o: src/client/linux/minidump_writer/linux_core_dumper_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.o `test -f 'src/client/linux/minidump_writer/linux_core_dumper_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/linux_core_dumper_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/linux_core_dumper_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.o `test -f 'src/client/linux/minidump_writer/linux_core_dumper_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/linux_core_dumper_unittest.cc + +src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.obj: src/client/linux/minidump_writer/linux_core_dumper_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.obj `if test -f 'src/client/linux/minidump_writer/linux_core_dumper_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/linux_core_dumper_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/linux_core_dumper_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_core_dumper_unittest.obj `if test -f 'src/client/linux/minidump_writer/linux_core_dumper_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/linux_core_dumper_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc'; fi` + +src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.o: src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.o `test -f 'src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.o `test -f 'src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc + +src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.obj: src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.obj `if test -f 'src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.obj `if test -f 'src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc'; fi` + +src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.o: src/client/linux/minidump_writer/minidump_writer_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.o `test -f 'src/client/linux/minidump_writer/minidump_writer_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/minidump_writer_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/minidump_writer_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.o `test -f 'src/client/linux/minidump_writer/minidump_writer_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/minidump_writer_unittest.cc + +src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.obj: src/client/linux/minidump_writer/minidump_writer_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.obj `if test -f 'src/client/linux/minidump_writer/minidump_writer_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/minidump_writer_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/minidump_writer_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/minidump_writer_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest.obj `if test -f 'src/client/linux/minidump_writer/minidump_writer_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/minidump_writer_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/minidump_writer_unittest.cc'; fi` + +src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.o: src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest_utils.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.o `test -f 'src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest_utils.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest_utils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.o `test -f 'src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc + +src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.obj: src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest_utils.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.obj `if test -f 'src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest_utils.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest_utils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-minidump_writer_unittest_utils.obj `if test -f 'src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc'; fi` + +src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.o: src/client/linux/minidump_writer/pe_file.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-pe_file.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.o `test -f 'src/client/linux/minidump_writer/pe_file.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/pe_file.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-pe_file.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-pe_file.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/pe_file.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.o `test -f 'src/client/linux/minidump_writer/pe_file.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/pe_file.cc + +src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.obj: src/client/linux/minidump_writer/pe_file.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-pe_file.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.obj `if test -f 'src/client/linux/minidump_writer/pe_file.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/pe_file.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/pe_file.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-pe_file.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-pe_file.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/pe_file.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-pe_file.obj `if test -f 'src/client/linux/minidump_writer/pe_file.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/pe_file.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/pe_file.cc'; fi` + +src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.o: src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.o `test -f 'src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.o `test -f 'src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc + +src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.obj: src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.Tpo -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.obj `if test -f 'src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc' object='src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.obj `if test -f 'src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc'; fi` + +src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.o: src/common/linux/elf_core_dump.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.o -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.o `test -f 'src/common/linux/elf_core_dump.cc' || echo '$(srcdir)/'`src/common/linux/elf_core_dump.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_core_dump.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.o `test -f 'src/common/linux/elf_core_dump.cc' || echo '$(srcdir)/'`src/common/linux/elf_core_dump.cc + +src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.obj: src/common/linux/elf_core_dump.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.obj -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.obj `if test -f 'src/common/linux/elf_core_dump.cc'; then $(CYGPATH_W) 'src/common/linux/elf_core_dump.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_core_dump.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_core_dump.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-elf_core_dump.obj `if test -f 'src/common/linux/elf_core_dump.cc'; then $(CYGPATH_W) 'src/common/linux/elf_core_dump.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_core_dump.cc'; fi` + +src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.o: src/common/linux/linux_libc_support_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.o `test -f 'src/common/linux/linux_libc_support_unittest.cc' || echo '$(srcdir)/'`src/common/linux/linux_libc_support_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/linux_libc_support_unittest.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.o `test -f 'src/common/linux/linux_libc_support_unittest.cc' || echo '$(srcdir)/'`src/common/linux/linux_libc_support_unittest.cc + +src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.obj: src/common/linux/linux_libc_support_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.obj `if test -f 'src/common/linux/linux_libc_support_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/linux_libc_support_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/linux_libc_support_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/linux_libc_support_unittest.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.obj `if test -f 'src/common/linux/linux_libc_support_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/linux_libc_support_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/linux_libc_support_unittest.cc'; fi` + +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.o: src/common/linux/scoped_pipe.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.o -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.o `test -f 'src/common/linux/scoped_pipe.cc' || echo '$(srcdir)/'`src/common/linux/scoped_pipe.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_pipe.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.o `test -f 'src/common/linux/scoped_pipe.cc' || echo '$(srcdir)/'`src/common/linux/scoped_pipe.cc + +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.obj: src/common/linux/scoped_pipe.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.obj -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.obj `if test -f 'src/common/linux/scoped_pipe.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_pipe.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_pipe.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_pipe.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_pipe.obj `if test -f 'src/common/linux/scoped_pipe.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_pipe.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_pipe.cc'; fi` + +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.o: src/common/linux/scoped_tmpfile.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.o -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.o `test -f 'src/common/linux/scoped_tmpfile.cc' || echo '$(srcdir)/'`src/common/linux/scoped_tmpfile.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_tmpfile.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.o `test -f 'src/common/linux/scoped_tmpfile.cc' || echo '$(srcdir)/'`src/common/linux/scoped_tmpfile.cc + +src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.obj: src/common/linux/scoped_tmpfile.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.obj -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.obj `if test -f 'src/common/linux/scoped_tmpfile.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_tmpfile.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_tmpfile.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_tmpfile.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-scoped_tmpfile.obj `if test -f 'src/common/linux/scoped_tmpfile.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_tmpfile.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_tmpfile.cc'; fi` + +src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.o: src/common/linux/tests/crash_generator.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.o -MD -MP -MF src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Tpo -c -o src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.o `test -f 'src/common/linux/tests/crash_generator.cc' || echo '$(srcdir)/'`src/common/linux/tests/crash_generator.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Tpo src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/tests/crash_generator.cc' object='src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.o `test -f 'src/common/linux/tests/crash_generator.cc' || echo '$(srcdir)/'`src/common/linux/tests/crash_generator.cc + +src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.obj: src/common/linux/tests/crash_generator.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.obj -MD -MP -MF src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Tpo -c -o src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.obj `if test -f 'src/common/linux/tests/crash_generator.cc'; then $(CYGPATH_W) 'src/common/linux/tests/crash_generator.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/tests/crash_generator.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Tpo src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/tests/crash_generator.cc' object='src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tests/client_linux_linux_client_unittest_shlib-crash_generator.obj `if test -f 'src/common/linux/tests/crash_generator.cc'; then $(CYGPATH_W) 'src/common/linux/tests/crash_generator.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/tests/crash_generator.cc'; fi` + +src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.o: src/common/memory_allocator_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.o -MD -MP -MF src/common/$(DEPDIR)/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.Tpo -c -o src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.o `test -f 'src/common/memory_allocator_unittest.cc' || echo '$(srcdir)/'`src/common/memory_allocator_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.Tpo src/common/$(DEPDIR)/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/memory_allocator_unittest.cc' object='src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.o `test -f 'src/common/memory_allocator_unittest.cc' || echo '$(srcdir)/'`src/common/memory_allocator_unittest.cc + +src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.obj: src/common/memory_allocator_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.Tpo -c -o src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.obj `if test -f 'src/common/memory_allocator_unittest.cc'; then $(CYGPATH_W) 'src/common/memory_allocator_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/memory_allocator_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.Tpo src/common/$(DEPDIR)/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/memory_allocator_unittest.cc' object='src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.obj `if test -f 'src/common/memory_allocator_unittest.cc'; then $(CYGPATH_W) 'src/common/memory_allocator_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/memory_allocator_unittest.cc'; fi` + +src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.o: src/common/tests/file_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.o -MD -MP -MF src/common/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-file_utils.Tpo -c -o src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.o `test -f 'src/common/tests/file_utils.cc' || echo '$(srcdir)/'`src/common/tests/file_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-file_utils.Tpo src/common/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-file_utils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/tests/file_utils.cc' object='src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.o `test -f 'src/common/tests/file_utils.cc' || echo '$(srcdir)/'`src/common/tests/file_utils.cc + +src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.obj: src/common/tests/file_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.obj -MD -MP -MF src/common/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-file_utils.Tpo -c -o src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.obj `if test -f 'src/common/tests/file_utils.cc'; then $(CYGPATH_W) 'src/common/tests/file_utils.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/tests/file_utils.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-file_utils.Tpo src/common/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-file_utils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/tests/file_utils.cc' object='src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tests/client_linux_linux_client_unittest_shlib-file_utils.obj `if test -f 'src/common/tests/file_utils.cc'; then $(CYGPATH_W) 'src/common/tests/file_utils.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/tests/file_utils.cc'; fi` + +src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.o: src/processor/basic_code_modules.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.o -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-basic_code_modules.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.o `test -f 'src/processor/basic_code_modules.cc' || echo '$(srcdir)/'`src/processor/basic_code_modules.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-basic_code_modules.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-basic_code_modules.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/basic_code_modules.cc' object='src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.o `test -f 'src/processor/basic_code_modules.cc' || echo '$(srcdir)/'`src/processor/basic_code_modules.cc + +src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.obj: src/processor/basic_code_modules.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.obj -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-basic_code_modules.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.obj `if test -f 'src/processor/basic_code_modules.cc'; then $(CYGPATH_W) 'src/processor/basic_code_modules.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/basic_code_modules.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-basic_code_modules.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-basic_code_modules.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/basic_code_modules.cc' object='src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-basic_code_modules.obj `if test -f 'src/processor/basic_code_modules.cc'; then $(CYGPATH_W) 'src/processor/basic_code_modules.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/basic_code_modules.cc'; fi` + +src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.o: src/processor/convert_old_arm64_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.o -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.o `test -f 'src/processor/convert_old_arm64_context.cc' || echo '$(srcdir)/'`src/processor/convert_old_arm64_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/convert_old_arm64_context.cc' object='src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.o `test -f 'src/processor/convert_old_arm64_context.cc' || echo '$(srcdir)/'`src/processor/convert_old_arm64_context.cc + +src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.obj: src/processor/convert_old_arm64_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.obj -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.obj `if test -f 'src/processor/convert_old_arm64_context.cc'; then $(CYGPATH_W) 'src/processor/convert_old_arm64_context.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/convert_old_arm64_context.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/convert_old_arm64_context.cc' object='src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.obj `if test -f 'src/processor/convert_old_arm64_context.cc'; then $(CYGPATH_W) 'src/processor/convert_old_arm64_context.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/convert_old_arm64_context.cc'; fi` + +src/processor/client_linux_linux_client_unittest_shlib-dump_context.o: src/processor/dump_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-dump_context.o -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_context.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-dump_context.o `test -f 'src/processor/dump_context.cc' || echo '$(srcdir)/'`src/processor/dump_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_context.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_context.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/dump_context.cc' object='src/processor/client_linux_linux_client_unittest_shlib-dump_context.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-dump_context.o `test -f 'src/processor/dump_context.cc' || echo '$(srcdir)/'`src/processor/dump_context.cc + +src/processor/client_linux_linux_client_unittest_shlib-dump_context.obj: src/processor/dump_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-dump_context.obj -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_context.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-dump_context.obj `if test -f 'src/processor/dump_context.cc'; then $(CYGPATH_W) 'src/processor/dump_context.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/dump_context.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_context.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_context.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/dump_context.cc' object='src/processor/client_linux_linux_client_unittest_shlib-dump_context.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-dump_context.obj `if test -f 'src/processor/dump_context.cc'; then $(CYGPATH_W) 'src/processor/dump_context.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/dump_context.cc'; fi` + +src/processor/client_linux_linux_client_unittest_shlib-dump_object.o: src/processor/dump_object.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-dump_object.o -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_object.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-dump_object.o `test -f 'src/processor/dump_object.cc' || echo '$(srcdir)/'`src/processor/dump_object.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_object.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_object.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/dump_object.cc' object='src/processor/client_linux_linux_client_unittest_shlib-dump_object.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-dump_object.o `test -f 'src/processor/dump_object.cc' || echo '$(srcdir)/'`src/processor/dump_object.cc + +src/processor/client_linux_linux_client_unittest_shlib-dump_object.obj: src/processor/dump_object.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-dump_object.obj -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_object.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-dump_object.obj `if test -f 'src/processor/dump_object.cc'; then $(CYGPATH_W) 'src/processor/dump_object.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/dump_object.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_object.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_object.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/dump_object.cc' object='src/processor/client_linux_linux_client_unittest_shlib-dump_object.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-dump_object.obj `if test -f 'src/processor/dump_object.cc'; then $(CYGPATH_W) 'src/processor/dump_object.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/dump_object.cc'; fi` + +src/processor/client_linux_linux_client_unittest_shlib-logging.o: src/processor/logging.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-logging.o -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-logging.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-logging.o `test -f 'src/processor/logging.cc' || echo '$(srcdir)/'`src/processor/logging.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-logging.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-logging.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/logging.cc' object='src/processor/client_linux_linux_client_unittest_shlib-logging.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-logging.o `test -f 'src/processor/logging.cc' || echo '$(srcdir)/'`src/processor/logging.cc + +src/processor/client_linux_linux_client_unittest_shlib-logging.obj: src/processor/logging.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-logging.obj -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-logging.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-logging.obj `if test -f 'src/processor/logging.cc'; then $(CYGPATH_W) 'src/processor/logging.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/logging.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-logging.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-logging.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/logging.cc' object='src/processor/client_linux_linux_client_unittest_shlib-logging.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-logging.obj `if test -f 'src/processor/logging.cc'; then $(CYGPATH_W) 'src/processor/logging.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/logging.cc'; fi` + +src/processor/client_linux_linux_client_unittest_shlib-minidump.o: src/processor/minidump.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-minidump.o -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-minidump.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-minidump.o `test -f 'src/processor/minidump.cc' || echo '$(srcdir)/'`src/processor/minidump.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-minidump.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-minidump.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/minidump.cc' object='src/processor/client_linux_linux_client_unittest_shlib-minidump.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-minidump.o `test -f 'src/processor/minidump.cc' || echo '$(srcdir)/'`src/processor/minidump.cc + +src/processor/client_linux_linux_client_unittest_shlib-minidump.obj: src/processor/minidump.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-minidump.obj -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-minidump.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-minidump.obj `if test -f 'src/processor/minidump.cc'; then $(CYGPATH_W) 'src/processor/minidump.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/minidump.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-minidump.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-minidump.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/minidump.cc' object='src/processor/client_linux_linux_client_unittest_shlib-minidump.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-minidump.obj `if test -f 'src/processor/minidump.cc'; then $(CYGPATH_W) 'src/processor/minidump.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/minidump.cc'; fi` + +src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.o: src/processor/pathname_stripper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.o -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-pathname_stripper.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.o `test -f 'src/processor/pathname_stripper.cc' || echo '$(srcdir)/'`src/processor/pathname_stripper.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-pathname_stripper.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-pathname_stripper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/pathname_stripper.cc' object='src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.o `test -f 'src/processor/pathname_stripper.cc' || echo '$(srcdir)/'`src/processor/pathname_stripper.cc + +src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.obj: src/processor/pathname_stripper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.obj -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-pathname_stripper.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.obj `if test -f 'src/processor/pathname_stripper.cc'; then $(CYGPATH_W) 'src/processor/pathname_stripper.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/pathname_stripper.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-pathname_stripper.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-pathname_stripper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/pathname_stripper.cc' object='src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-pathname_stripper.obj `if test -f 'src/processor/pathname_stripper.cc'; then $(CYGPATH_W) 'src/processor/pathname_stripper.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/pathname_stripper.cc'; fi` + +src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.o: src/processor/proc_maps_linux.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.o -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-proc_maps_linux.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.o `test -f 'src/processor/proc_maps_linux.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-proc_maps_linux.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-proc_maps_linux.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux.cc' object='src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.o `test -f 'src/processor/proc_maps_linux.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux.cc + +src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.obj: src/processor/proc_maps_linux.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.obj -MD -MP -MF src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-proc_maps_linux.Tpo -c -o src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.obj `if test -f 'src/processor/proc_maps_linux.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-proc_maps_linux.Tpo src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-proc_maps_linux.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux.cc' object='src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/client_linux_linux_client_unittest_shlib-proc_maps_linux.obj `if test -f 'src/processor/proc_maps_linux.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux.cc'; fi` + +src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.o: src/common/linux/breakpad_getcontext_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.o `test -f 'src/common/linux/breakpad_getcontext_unittest.cc' || echo '$(srcdir)/'`src/common/linux/breakpad_getcontext_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/breakpad_getcontext_unittest.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.o `test -f 'src/common/linux/breakpad_getcontext_unittest.cc' || echo '$(srcdir)/'`src/common/linux/breakpad_getcontext_unittest.cc + +src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.obj: src/common/linux/breakpad_getcontext_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Tpo -c -o src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.obj `if test -f 'src/common/linux/breakpad_getcontext_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/breakpad_getcontext_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/breakpad_getcontext_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Tpo src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/breakpad_getcontext_unittest.cc' object='src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.obj `if test -f 'src/common/linux/breakpad_getcontext_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/breakpad_getcontext_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/breakpad_getcontext_unittest.cc'; fi` + +src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.o: src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_client_linux_linux_dumper_unittest_helper_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.o -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper_unittest_helper-linux_dumper_unittest_helper.Tpo -c -o src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.o `test -f 'src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper_unittest_helper-linux_dumper_unittest_helper.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper_unittest_helper-linux_dumper_unittest_helper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc' object='src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_client_linux_linux_dumper_unittest_helper_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.o `test -f 'src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc' || echo '$(srcdir)/'`src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc + +src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.obj: src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_client_linux_linux_dumper_unittest_helper_CXXFLAGS) $(CXXFLAGS) -MT src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.obj -MD -MP -MF src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper_unittest_helper-linux_dumper_unittest_helper.Tpo -c -o src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.obj `if test -f 'src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper_unittest_helper-linux_dumper_unittest_helper.Tpo src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper_unittest_helper-linux_dumper_unittest_helper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc' object='src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_client_linux_linux_dumper_unittest_helper_CXXFLAGS) $(CXXFLAGS) -c -o src/client/linux/minidump_writer/linux_dumper_unittest_helper-linux_dumper_unittest_helper.obj `if test -f 'src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc'; then $(CYGPATH_W) 'src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc'; else $(CYGPATH_W) '$(srcdir)/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc'; fi` + +src/common/dumper_unittest-byte_cursor_unittest.o: src/common/byte_cursor_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-byte_cursor_unittest.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-byte_cursor_unittest.Tpo -c -o src/common/dumper_unittest-byte_cursor_unittest.o `test -f 'src/common/byte_cursor_unittest.cc' || echo '$(srcdir)/'`src/common/byte_cursor_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-byte_cursor_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-byte_cursor_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/byte_cursor_unittest.cc' object='src/common/dumper_unittest-byte_cursor_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-byte_cursor_unittest.o `test -f 'src/common/byte_cursor_unittest.cc' || echo '$(srcdir)/'`src/common/byte_cursor_unittest.cc + +src/common/dumper_unittest-byte_cursor_unittest.obj: src/common/byte_cursor_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-byte_cursor_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-byte_cursor_unittest.Tpo -c -o src/common/dumper_unittest-byte_cursor_unittest.obj `if test -f 'src/common/byte_cursor_unittest.cc'; then $(CYGPATH_W) 'src/common/byte_cursor_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/byte_cursor_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-byte_cursor_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-byte_cursor_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/byte_cursor_unittest.cc' object='src/common/dumper_unittest-byte_cursor_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-byte_cursor_unittest.obj `if test -f 'src/common/byte_cursor_unittest.cc'; then $(CYGPATH_W) 'src/common/byte_cursor_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/byte_cursor_unittest.cc'; fi` + +src/common/dumper_unittest-convert_UTF.o: src/common/convert_UTF.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-convert_UTF.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-convert_UTF.Tpo -c -o src/common/dumper_unittest-convert_UTF.o `test -f 'src/common/convert_UTF.cc' || echo '$(srcdir)/'`src/common/convert_UTF.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-convert_UTF.Tpo src/common/$(DEPDIR)/dumper_unittest-convert_UTF.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/convert_UTF.cc' object='src/common/dumper_unittest-convert_UTF.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-convert_UTF.o `test -f 'src/common/convert_UTF.cc' || echo '$(srcdir)/'`src/common/convert_UTF.cc + +src/common/dumper_unittest-convert_UTF.obj: src/common/convert_UTF.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-convert_UTF.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-convert_UTF.Tpo -c -o src/common/dumper_unittest-convert_UTF.obj `if test -f 'src/common/convert_UTF.cc'; then $(CYGPATH_W) 'src/common/convert_UTF.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/convert_UTF.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-convert_UTF.Tpo src/common/$(DEPDIR)/dumper_unittest-convert_UTF.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/convert_UTF.cc' object='src/common/dumper_unittest-convert_UTF.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-convert_UTF.obj `if test -f 'src/common/convert_UTF.cc'; then $(CYGPATH_W) 'src/common/convert_UTF.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/convert_UTF.cc'; fi` + +src/common/dumper_unittest-dwarf_cfi_to_module.o: src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_cfi_to_module.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module.Tpo -c -o src/common/dumper_unittest-dwarf_cfi_to_module.o `test -f 'src/common/dwarf_cfi_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cfi_to_module.cc' object='src/common/dumper_unittest-dwarf_cfi_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_cfi_to_module.o `test -f 'src/common/dwarf_cfi_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module.cc + +src/common/dumper_unittest-dwarf_cfi_to_module.obj: src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_cfi_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module.Tpo -c -o src/common/dumper_unittest-dwarf_cfi_to_module.obj `if test -f 'src/common/dwarf_cfi_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cfi_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cfi_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cfi_to_module.cc' object='src/common/dumper_unittest-dwarf_cfi_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_cfi_to_module.obj `if test -f 'src/common/dwarf_cfi_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cfi_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cfi_to_module.cc'; fi` + +src/common/dumper_unittest-dwarf_cfi_to_module_unittest.o: src/common/dwarf_cfi_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_cfi_to_module_unittest.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module_unittest.Tpo -c -o src/common/dumper_unittest-dwarf_cfi_to_module_unittest.o `test -f 'src/common/dwarf_cfi_to_module_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cfi_to_module_unittest.cc' object='src/common/dumper_unittest-dwarf_cfi_to_module_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_cfi_to_module_unittest.o `test -f 'src/common/dwarf_cfi_to_module_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module_unittest.cc + +src/common/dumper_unittest-dwarf_cfi_to_module_unittest.obj: src/common/dwarf_cfi_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_cfi_to_module_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module_unittest.Tpo -c -o src/common/dumper_unittest-dwarf_cfi_to_module_unittest.obj `if test -f 'src/common/dwarf_cfi_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf_cfi_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cfi_to_module_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cfi_to_module_unittest.cc' object='src/common/dumper_unittest-dwarf_cfi_to_module_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_cfi_to_module_unittest.obj `if test -f 'src/common/dwarf_cfi_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf_cfi_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cfi_to_module_unittest.cc'; fi` + +src/common/dumper_unittest-dwarf_cu_to_module.o: src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_cu_to_module.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module.Tpo -c -o src/common/dumper_unittest-dwarf_cu_to_module.o `test -f 'src/common/dwarf_cu_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cu_to_module.cc' object='src/common/dumper_unittest-dwarf_cu_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_cu_to_module.o `test -f 'src/common/dwarf_cu_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cu_to_module.cc + +src/common/dumper_unittest-dwarf_cu_to_module.obj: src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_cu_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module.Tpo -c -o src/common/dumper_unittest-dwarf_cu_to_module.obj `if test -f 'src/common/dwarf_cu_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cu_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cu_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cu_to_module.cc' object='src/common/dumper_unittest-dwarf_cu_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_cu_to_module.obj `if test -f 'src/common/dwarf_cu_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cu_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cu_to_module.cc'; fi` + +src/common/dumper_unittest-dwarf_cu_to_module_unittest.o: src/common/dwarf_cu_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_cu_to_module_unittest.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module_unittest.Tpo -c -o src/common/dumper_unittest-dwarf_cu_to_module_unittest.o `test -f 'src/common/dwarf_cu_to_module_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf_cu_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cu_to_module_unittest.cc' object='src/common/dumper_unittest-dwarf_cu_to_module_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_cu_to_module_unittest.o `test -f 'src/common/dwarf_cu_to_module_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf_cu_to_module_unittest.cc + +src/common/dumper_unittest-dwarf_cu_to_module_unittest.obj: src/common/dwarf_cu_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_cu_to_module_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module_unittest.Tpo -c -o src/common/dumper_unittest-dwarf_cu_to_module_unittest.obj `if test -f 'src/common/dwarf_cu_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf_cu_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cu_to_module_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cu_to_module_unittest.cc' object='src/common/dumper_unittest-dwarf_cu_to_module_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_cu_to_module_unittest.obj `if test -f 'src/common/dwarf_cu_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf_cu_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cu_to_module_unittest.cc'; fi` + +src/common/dumper_unittest-dwarf_line_to_module.o: src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_line_to_module.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module.Tpo -c -o src/common/dumper_unittest-dwarf_line_to_module.o `test -f 'src/common/dwarf_line_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_line_to_module.cc' object='src/common/dumper_unittest-dwarf_line_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_line_to_module.o `test -f 'src/common/dwarf_line_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_line_to_module.cc + +src/common/dumper_unittest-dwarf_line_to_module.obj: src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_line_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module.Tpo -c -o src/common/dumper_unittest-dwarf_line_to_module.obj `if test -f 'src/common/dwarf_line_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_line_to_module.cc' object='src/common/dumper_unittest-dwarf_line_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_line_to_module.obj `if test -f 'src/common/dwarf_line_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module.cc'; fi` + +src/common/dumper_unittest-dwarf_line_to_module_unittest.o: src/common/dwarf_line_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_line_to_module_unittest.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module_unittest.Tpo -c -o src/common/dumper_unittest-dwarf_line_to_module_unittest.o `test -f 'src/common/dwarf_line_to_module_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf_line_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_line_to_module_unittest.cc' object='src/common/dumper_unittest-dwarf_line_to_module_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_line_to_module_unittest.o `test -f 'src/common/dwarf_line_to_module_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf_line_to_module_unittest.cc + +src/common/dumper_unittest-dwarf_line_to_module_unittest.obj: src/common/dwarf_line_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_line_to_module_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module_unittest.Tpo -c -o src/common/dumper_unittest-dwarf_line_to_module_unittest.obj `if test -f 'src/common/dwarf_line_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_line_to_module_unittest.cc' object='src/common/dumper_unittest-dwarf_line_to_module_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_line_to_module_unittest.obj `if test -f 'src/common/dwarf_line_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module_unittest.cc'; fi` + +src/common/dumper_unittest-dwarf_range_list_handler.o: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_range_list_handler.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_range_list_handler.Tpo -c -o src/common/dumper_unittest-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/dumper_unittest-dwarf_range_list_handler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc + +src/common/dumper_unittest-dwarf_range_list_handler.obj: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-dwarf_range_list_handler.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-dwarf_range_list_handler.Tpo -c -o src/common/dumper_unittest-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/dumper_unittest-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/dumper_unittest-dwarf_range_list_handler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` + +src/common/dumper_unittest-language.o: src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-language.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-language.Tpo -c -o src/common/dumper_unittest-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-language.Tpo src/common/$(DEPDIR)/dumper_unittest-language.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/language.cc' object='src/common/dumper_unittest-language.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc + +src/common/dumper_unittest-language.obj: src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-language.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-language.Tpo -c -o src/common/dumper_unittest-language.obj `if test -f 'src/common/language.cc'; then $(CYGPATH_W) 'src/common/language.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/language.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-language.Tpo src/common/$(DEPDIR)/dumper_unittest-language.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/language.cc' object='src/common/dumper_unittest-language.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-language.obj `if test -f 'src/common/language.cc'; then $(CYGPATH_W) 'src/common/language.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/language.cc'; fi` + +src/common/dumper_unittest-memory_range_unittest.o: src/common/memory_range_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-memory_range_unittest.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-memory_range_unittest.Tpo -c -o src/common/dumper_unittest-memory_range_unittest.o `test -f 'src/common/memory_range_unittest.cc' || echo '$(srcdir)/'`src/common/memory_range_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-memory_range_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-memory_range_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/memory_range_unittest.cc' object='src/common/dumper_unittest-memory_range_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-memory_range_unittest.o `test -f 'src/common/memory_range_unittest.cc' || echo '$(srcdir)/'`src/common/memory_range_unittest.cc + +src/common/dumper_unittest-memory_range_unittest.obj: src/common/memory_range_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-memory_range_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-memory_range_unittest.Tpo -c -o src/common/dumper_unittest-memory_range_unittest.obj `if test -f 'src/common/memory_range_unittest.cc'; then $(CYGPATH_W) 'src/common/memory_range_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/memory_range_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-memory_range_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-memory_range_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/memory_range_unittest.cc' object='src/common/dumper_unittest-memory_range_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-memory_range_unittest.obj `if test -f 'src/common/memory_range_unittest.cc'; then $(CYGPATH_W) 'src/common/memory_range_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/memory_range_unittest.cc'; fi` + +src/common/dumper_unittest-module.o: src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-module.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-module.Tpo -c -o src/common/dumper_unittest-module.o `test -f 'src/common/module.cc' || echo '$(srcdir)/'`src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-module.Tpo src/common/$(DEPDIR)/dumper_unittest-module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/module.cc' object='src/common/dumper_unittest-module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-module.o `test -f 'src/common/module.cc' || echo '$(srcdir)/'`src/common/module.cc + +src/common/dumper_unittest-module.obj: src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-module.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-module.Tpo -c -o src/common/dumper_unittest-module.obj `if test -f 'src/common/module.cc'; then $(CYGPATH_W) 'src/common/module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-module.Tpo src/common/$(DEPDIR)/dumper_unittest-module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/module.cc' object='src/common/dumper_unittest-module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-module.obj `if test -f 'src/common/module.cc'; then $(CYGPATH_W) 'src/common/module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/module.cc'; fi` + +src/common/dumper_unittest-module_unittest.o: src/common/module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-module_unittest.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-module_unittest.Tpo -c -o src/common/dumper_unittest-module_unittest.o `test -f 'src/common/module_unittest.cc' || echo '$(srcdir)/'`src/common/module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-module_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/module_unittest.cc' object='src/common/dumper_unittest-module_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-module_unittest.o `test -f 'src/common/module_unittest.cc' || echo '$(srcdir)/'`src/common/module_unittest.cc + +src/common/dumper_unittest-module_unittest.obj: src/common/module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-module_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-module_unittest.Tpo -c -o src/common/dumper_unittest-module_unittest.obj `if test -f 'src/common/module_unittest.cc'; then $(CYGPATH_W) 'src/common/module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/module_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-module_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/module_unittest.cc' object='src/common/dumper_unittest-module_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-module_unittest.obj `if test -f 'src/common/module_unittest.cc'; then $(CYGPATH_W) 'src/common/module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/module_unittest.cc'; fi` + +src/common/dumper_unittest-path_helper.o: src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-path_helper.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-path_helper.Tpo -c -o src/common/dumper_unittest-path_helper.o `test -f 'src/common/path_helper.cc' || echo '$(srcdir)/'`src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-path_helper.Tpo src/common/$(DEPDIR)/dumper_unittest-path_helper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/path_helper.cc' object='src/common/dumper_unittest-path_helper.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-path_helper.o `test -f 'src/common/path_helper.cc' || echo '$(srcdir)/'`src/common/path_helper.cc + +src/common/dumper_unittest-path_helper.obj: src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-path_helper.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-path_helper.Tpo -c -o src/common/dumper_unittest-path_helper.obj `if test -f 'src/common/path_helper.cc'; then $(CYGPATH_W) 'src/common/path_helper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/path_helper.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-path_helper.Tpo src/common/$(DEPDIR)/dumper_unittest-path_helper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/path_helper.cc' object='src/common/dumper_unittest-path_helper.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-path_helper.obj `if test -f 'src/common/path_helper.cc'; then $(CYGPATH_W) 'src/common/path_helper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/path_helper.cc'; fi` + +src/common/dumper_unittest-stabs_reader.o: src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-stabs_reader.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-stabs_reader.Tpo -c -o src/common/dumper_unittest-stabs_reader.o `test -f 'src/common/stabs_reader.cc' || echo '$(srcdir)/'`src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-stabs_reader.Tpo src/common/$(DEPDIR)/dumper_unittest-stabs_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_reader.cc' object='src/common/dumper_unittest-stabs_reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-stabs_reader.o `test -f 'src/common/stabs_reader.cc' || echo '$(srcdir)/'`src/common/stabs_reader.cc + +src/common/dumper_unittest-stabs_reader.obj: src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-stabs_reader.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-stabs_reader.Tpo -c -o src/common/dumper_unittest-stabs_reader.obj `if test -f 'src/common/stabs_reader.cc'; then $(CYGPATH_W) 'src/common/stabs_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-stabs_reader.Tpo src/common/$(DEPDIR)/dumper_unittest-stabs_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_reader.cc' object='src/common/dumper_unittest-stabs_reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-stabs_reader.obj `if test -f 'src/common/stabs_reader.cc'; then $(CYGPATH_W) 'src/common/stabs_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_reader.cc'; fi` + +src/common/dumper_unittest-stabs_reader_unittest.o: src/common/stabs_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-stabs_reader_unittest.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-stabs_reader_unittest.Tpo -c -o src/common/dumper_unittest-stabs_reader_unittest.o `test -f 'src/common/stabs_reader_unittest.cc' || echo '$(srcdir)/'`src/common/stabs_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-stabs_reader_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-stabs_reader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_reader_unittest.cc' object='src/common/dumper_unittest-stabs_reader_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-stabs_reader_unittest.o `test -f 'src/common/stabs_reader_unittest.cc' || echo '$(srcdir)/'`src/common/stabs_reader_unittest.cc + +src/common/dumper_unittest-stabs_reader_unittest.obj: src/common/stabs_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-stabs_reader_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-stabs_reader_unittest.Tpo -c -o src/common/dumper_unittest-stabs_reader_unittest.obj `if test -f 'src/common/stabs_reader_unittest.cc'; then $(CYGPATH_W) 'src/common/stabs_reader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_reader_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-stabs_reader_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-stabs_reader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_reader_unittest.cc' object='src/common/dumper_unittest-stabs_reader_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-stabs_reader_unittest.obj `if test -f 'src/common/stabs_reader_unittest.cc'; then $(CYGPATH_W) 'src/common/stabs_reader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_reader_unittest.cc'; fi` + +src/common/dumper_unittest-stabs_to_module.o: src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-stabs_to_module.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-stabs_to_module.Tpo -c -o src/common/dumper_unittest-stabs_to_module.o `test -f 'src/common/stabs_to_module.cc' || echo '$(srcdir)/'`src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-stabs_to_module.Tpo src/common/$(DEPDIR)/dumper_unittest-stabs_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_to_module.cc' object='src/common/dumper_unittest-stabs_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-stabs_to_module.o `test -f 'src/common/stabs_to_module.cc' || echo '$(srcdir)/'`src/common/stabs_to_module.cc + +src/common/dumper_unittest-stabs_to_module.obj: src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-stabs_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-stabs_to_module.Tpo -c -o src/common/dumper_unittest-stabs_to_module.obj `if test -f 'src/common/stabs_to_module.cc'; then $(CYGPATH_W) 'src/common/stabs_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-stabs_to_module.Tpo src/common/$(DEPDIR)/dumper_unittest-stabs_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_to_module.cc' object='src/common/dumper_unittest-stabs_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-stabs_to_module.obj `if test -f 'src/common/stabs_to_module.cc'; then $(CYGPATH_W) 'src/common/stabs_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_to_module.cc'; fi` + +src/common/dumper_unittest-stabs_to_module_unittest.o: src/common/stabs_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-stabs_to_module_unittest.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-stabs_to_module_unittest.Tpo -c -o src/common/dumper_unittest-stabs_to_module_unittest.o `test -f 'src/common/stabs_to_module_unittest.cc' || echo '$(srcdir)/'`src/common/stabs_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-stabs_to_module_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-stabs_to_module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_to_module_unittest.cc' object='src/common/dumper_unittest-stabs_to_module_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-stabs_to_module_unittest.o `test -f 'src/common/stabs_to_module_unittest.cc' || echo '$(srcdir)/'`src/common/stabs_to_module_unittest.cc + +src/common/dumper_unittest-stabs_to_module_unittest.obj: src/common/stabs_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-stabs_to_module_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-stabs_to_module_unittest.Tpo -c -o src/common/dumper_unittest-stabs_to_module_unittest.obj `if test -f 'src/common/stabs_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/stabs_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_to_module_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-stabs_to_module_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-stabs_to_module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_to_module_unittest.cc' object='src/common/dumper_unittest-stabs_to_module_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-stabs_to_module_unittest.obj `if test -f 'src/common/stabs_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/stabs_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_to_module_unittest.cc'; fi` + +src/common/dumper_unittest-string_conversion.o: src/common/string_conversion.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-string_conversion.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-string_conversion.Tpo -c -o src/common/dumper_unittest-string_conversion.o `test -f 'src/common/string_conversion.cc' || echo '$(srcdir)/'`src/common/string_conversion.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-string_conversion.Tpo src/common/$(DEPDIR)/dumper_unittest-string_conversion.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/string_conversion.cc' object='src/common/dumper_unittest-string_conversion.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-string_conversion.o `test -f 'src/common/string_conversion.cc' || echo '$(srcdir)/'`src/common/string_conversion.cc + +src/common/dumper_unittest-string_conversion.obj: src/common/string_conversion.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-string_conversion.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-string_conversion.Tpo -c -o src/common/dumper_unittest-string_conversion.obj `if test -f 'src/common/string_conversion.cc'; then $(CYGPATH_W) 'src/common/string_conversion.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/string_conversion.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-string_conversion.Tpo src/common/$(DEPDIR)/dumper_unittest-string_conversion.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/string_conversion.cc' object='src/common/dumper_unittest-string_conversion.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-string_conversion.obj `if test -f 'src/common/string_conversion.cc'; then $(CYGPATH_W) 'src/common/string_conversion.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/string_conversion.cc'; fi` + +src/common/dumper_unittest-string_conversion_unittest.o: src/common/string_conversion_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-string_conversion_unittest.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-string_conversion_unittest.Tpo -c -o src/common/dumper_unittest-string_conversion_unittest.o `test -f 'src/common/string_conversion_unittest.cc' || echo '$(srcdir)/'`src/common/string_conversion_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-string_conversion_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-string_conversion_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/string_conversion_unittest.cc' object='src/common/dumper_unittest-string_conversion_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-string_conversion_unittest.o `test -f 'src/common/string_conversion_unittest.cc' || echo '$(srcdir)/'`src/common/string_conversion_unittest.cc + +src/common/dumper_unittest-string_conversion_unittest.obj: src/common/string_conversion_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-string_conversion_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-string_conversion_unittest.Tpo -c -o src/common/dumper_unittest-string_conversion_unittest.obj `if test -f 'src/common/string_conversion_unittest.cc'; then $(CYGPATH_W) 'src/common/string_conversion_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/string_conversion_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-string_conversion_unittest.Tpo src/common/$(DEPDIR)/dumper_unittest-string_conversion_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/string_conversion_unittest.cc' object='src/common/dumper_unittest-string_conversion_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-string_conversion_unittest.obj `if test -f 'src/common/string_conversion_unittest.cc'; then $(CYGPATH_W) 'src/common/string_conversion_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/string_conversion_unittest.cc'; fi` + +src/common/dumper_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-test_assembler.Tpo -c -o src/common/dumper_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-test_assembler.Tpo src/common/$(DEPDIR)/dumper_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/dumper_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/dumper_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dumper_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/dumper_unittest-test_assembler.Tpo -c -o src/common/dumper_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/dumper_unittest-test_assembler.Tpo src/common/$(DEPDIR)/dumper_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/dumper_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dumper_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/common/dwarf/dumper_unittest-bytereader.o: src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-bytereader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader.Tpo -c -o src/common/dwarf/dumper_unittest-bytereader.o `test -f 'src/common/dwarf/bytereader.cc' || echo '$(srcdir)/'`src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/bytereader.cc' object='src/common/dwarf/dumper_unittest-bytereader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-bytereader.o `test -f 'src/common/dwarf/bytereader.cc' || echo '$(srcdir)/'`src/common/dwarf/bytereader.cc + +src/common/dwarf/dumper_unittest-bytereader.obj: src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-bytereader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader.Tpo -c -o src/common/dwarf/dumper_unittest-bytereader.obj `if test -f 'src/common/dwarf/bytereader.cc'; then $(CYGPATH_W) 'src/common/dwarf/bytereader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/bytereader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/bytereader.cc' object='src/common/dwarf/dumper_unittest-bytereader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-bytereader.obj `if test -f 'src/common/dwarf/bytereader.cc'; then $(CYGPATH_W) 'src/common/dwarf/bytereader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/bytereader.cc'; fi` + +src/common/dwarf/dumper_unittest-bytereader_unittest.o: src/common/dwarf/bytereader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-bytereader_unittest.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader_unittest.Tpo -c -o src/common/dwarf/dumper_unittest-bytereader_unittest.o `test -f 'src/common/dwarf/bytereader_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/bytereader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader_unittest.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/bytereader_unittest.cc' object='src/common/dwarf/dumper_unittest-bytereader_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-bytereader_unittest.o `test -f 'src/common/dwarf/bytereader_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/bytereader_unittest.cc + +src/common/dwarf/dumper_unittest-bytereader_unittest.obj: src/common/dwarf/bytereader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-bytereader_unittest.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader_unittest.Tpo -c -o src/common/dwarf/dumper_unittest-bytereader_unittest.obj `if test -f 'src/common/dwarf/bytereader_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/bytereader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/bytereader_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader_unittest.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/bytereader_unittest.cc' object='src/common/dwarf/dumper_unittest-bytereader_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-bytereader_unittest.obj `if test -f 'src/common/dwarf/bytereader_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/bytereader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/bytereader_unittest.cc'; fi` + +src/common/dwarf/dumper_unittest-cfi_assembler.o: src/common/dwarf/cfi_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-cfi_assembler.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-cfi_assembler.Tpo -c -o src/common/dwarf/dumper_unittest-cfi_assembler.o `test -f 'src/common/dwarf/cfi_assembler.cc' || echo '$(srcdir)/'`src/common/dwarf/cfi_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-cfi_assembler.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-cfi_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/cfi_assembler.cc' object='src/common/dwarf/dumper_unittest-cfi_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-cfi_assembler.o `test -f 'src/common/dwarf/cfi_assembler.cc' || echo '$(srcdir)/'`src/common/dwarf/cfi_assembler.cc + +src/common/dwarf/dumper_unittest-cfi_assembler.obj: src/common/dwarf/cfi_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-cfi_assembler.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-cfi_assembler.Tpo -c -o src/common/dwarf/dumper_unittest-cfi_assembler.obj `if test -f 'src/common/dwarf/cfi_assembler.cc'; then $(CYGPATH_W) 'src/common/dwarf/cfi_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/cfi_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-cfi_assembler.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-cfi_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/cfi_assembler.cc' object='src/common/dwarf/dumper_unittest-cfi_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-cfi_assembler.obj `if test -f 'src/common/dwarf/cfi_assembler.cc'; then $(CYGPATH_W) 'src/common/dwarf/cfi_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/cfi_assembler.cc'; fi` + +src/common/dwarf/dumper_unittest-dwarf2diehandler.o: src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-dwarf2diehandler.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler.Tpo -c -o src/common/dwarf/dumper_unittest-dwarf2diehandler.o `test -f 'src/common/dwarf/dwarf2diehandler.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2diehandler.cc' object='src/common/dwarf/dumper_unittest-dwarf2diehandler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-dwarf2diehandler.o `test -f 'src/common/dwarf/dwarf2diehandler.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2diehandler.cc + +src/common/dwarf/dumper_unittest-dwarf2diehandler.obj: src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-dwarf2diehandler.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler.Tpo -c -o src/common/dwarf/dumper_unittest-dwarf2diehandler.obj `if test -f 'src/common/dwarf/dwarf2diehandler.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2diehandler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2diehandler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2diehandler.cc' object='src/common/dwarf/dumper_unittest-dwarf2diehandler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-dwarf2diehandler.obj `if test -f 'src/common/dwarf/dwarf2diehandler.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2diehandler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2diehandler.cc'; fi` + +src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.o: src/common/dwarf/dwarf2diehandler_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler_unittest.Tpo -c -o src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.o `test -f 'src/common/dwarf/dwarf2diehandler_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2diehandler_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler_unittest.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2diehandler_unittest.cc' object='src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.o `test -f 'src/common/dwarf/dwarf2diehandler_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2diehandler_unittest.cc + +src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.obj: src/common/dwarf/dwarf2diehandler_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler_unittest.Tpo -c -o src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.obj `if test -f 'src/common/dwarf/dwarf2diehandler_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2diehandler_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2diehandler_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler_unittest.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2diehandler_unittest.cc' object='src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-dwarf2diehandler_unittest.obj `if test -f 'src/common/dwarf/dwarf2diehandler_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2diehandler_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2diehandler_unittest.cc'; fi` + +src/common/dwarf/dumper_unittest-dwarf2reader.o: src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-dwarf2reader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader.Tpo -c -o src/common/dwarf/dumper_unittest-dwarf2reader.o `test -f 'src/common/dwarf/dwarf2reader.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader.cc' object='src/common/dwarf/dumper_unittest-dwarf2reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-dwarf2reader.o `test -f 'src/common/dwarf/dwarf2reader.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader.cc + +src/common/dwarf/dumper_unittest-dwarf2reader.obj: src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-dwarf2reader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader.Tpo -c -o src/common/dwarf/dumper_unittest-dwarf2reader.obj `if test -f 'src/common/dwarf/dwarf2reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader.cc' object='src/common/dwarf/dumper_unittest-dwarf2reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-dwarf2reader.obj `if test -f 'src/common/dwarf/dwarf2reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader.cc'; fi` + +src/common/dwarf/dumper_unittest-elf_reader.o: src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-elf_reader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-elf_reader.Tpo -c -o src/common/dwarf/dumper_unittest-elf_reader.o `test -f 'src/common/dwarf/elf_reader.cc' || echo '$(srcdir)/'`src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-elf_reader.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-elf_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/elf_reader.cc' object='src/common/dwarf/dumper_unittest-elf_reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-elf_reader.o `test -f 'src/common/dwarf/elf_reader.cc' || echo '$(srcdir)/'`src/common/dwarf/elf_reader.cc + +src/common/dwarf/dumper_unittest-elf_reader.obj: src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-elf_reader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-elf_reader.Tpo -c -o src/common/dwarf/dumper_unittest-elf_reader.obj `if test -f 'src/common/dwarf/elf_reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/elf_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/elf_reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-elf_reader.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-elf_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/elf_reader.cc' object='src/common/dwarf/dumper_unittest-elf_reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-elf_reader.obj `if test -f 'src/common/dwarf/elf_reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/elf_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/elf_reader.cc'; fi` + +src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.o: src/common/dwarf/dwarf2reader_cfi_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_cfi_unittest.Tpo -c -o src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.o `test -f 'src/common/dwarf/dwarf2reader_cfi_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader_cfi_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_cfi_unittest.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_cfi_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader_cfi_unittest.cc' object='src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.o `test -f 'src/common/dwarf/dwarf2reader_cfi_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader_cfi_unittest.cc + +src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.obj: src/common/dwarf/dwarf2reader_cfi_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_cfi_unittest.Tpo -c -o src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.obj `if test -f 'src/common/dwarf/dwarf2reader_cfi_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader_cfi_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader_cfi_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_cfi_unittest.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_cfi_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader_cfi_unittest.cc' object='src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-dwarf2reader_cfi_unittest.obj `if test -f 'src/common/dwarf/dwarf2reader_cfi_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader_cfi_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader_cfi_unittest.cc'; fi` + +src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.o: src/common/dwarf/dwarf2reader_die_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_die_unittest.Tpo -c -o src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.o `test -f 'src/common/dwarf/dwarf2reader_die_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader_die_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_die_unittest.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_die_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader_die_unittest.cc' object='src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.o `test -f 'src/common/dwarf/dwarf2reader_die_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader_die_unittest.cc + +src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.obj: src/common/dwarf/dwarf2reader_die_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_die_unittest.Tpo -c -o src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.obj `if test -f 'src/common/dwarf/dwarf2reader_die_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader_die_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader_die_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_die_unittest.Tpo src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_die_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader_die_unittest.cc' object='src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dumper_unittest-dwarf2reader_die_unittest.obj `if test -f 'src/common/dwarf/dwarf2reader_die_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader_die_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader_die_unittest.cc'; fi` + +src/common/linux/dumper_unittest-crc32.o: src/common/linux/crc32.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-crc32.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Tpo -c -o src/common/linux/dumper_unittest-crc32.o `test -f 'src/common/linux/crc32.cc' || echo '$(srcdir)/'`src/common/linux/crc32.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/crc32.cc' object='src/common/linux/dumper_unittest-crc32.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-crc32.o `test -f 'src/common/linux/crc32.cc' || echo '$(srcdir)/'`src/common/linux/crc32.cc + +src/common/linux/dumper_unittest-crc32.obj: src/common/linux/crc32.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-crc32.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Tpo -c -o src/common/linux/dumper_unittest-crc32.obj `if test -f 'src/common/linux/crc32.cc'; then $(CYGPATH_W) 'src/common/linux/crc32.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/crc32.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/crc32.cc' object='src/common/linux/dumper_unittest-crc32.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-crc32.obj `if test -f 'src/common/linux/crc32.cc'; then $(CYGPATH_W) 'src/common/linux/crc32.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/crc32.cc'; fi` + +src/common/linux/dumper_unittest-dump_symbols.o: src/common/linux/dump_symbols.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-dump_symbols.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Tpo -c -o src/common/linux/dumper_unittest-dump_symbols.o `test -f 'src/common/linux/dump_symbols.cc' || echo '$(srcdir)/'`src/common/linux/dump_symbols.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/dump_symbols.cc' object='src/common/linux/dumper_unittest-dump_symbols.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-dump_symbols.o `test -f 'src/common/linux/dump_symbols.cc' || echo '$(srcdir)/'`src/common/linux/dump_symbols.cc + +src/common/linux/dumper_unittest-dump_symbols.obj: src/common/linux/dump_symbols.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-dump_symbols.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Tpo -c -o src/common/linux/dumper_unittest-dump_symbols.obj `if test -f 'src/common/linux/dump_symbols.cc'; then $(CYGPATH_W) 'src/common/linux/dump_symbols.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/dump_symbols.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/dump_symbols.cc' object='src/common/linux/dumper_unittest-dump_symbols.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-dump_symbols.obj `if test -f 'src/common/linux/dump_symbols.cc'; then $(CYGPATH_W) 'src/common/linux/dump_symbols.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/dump_symbols.cc'; fi` + +src/common/linux/dumper_unittest-dump_symbols_unittest.o: src/common/linux/dump_symbols_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-dump_symbols_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Tpo -c -o src/common/linux/dumper_unittest-dump_symbols_unittest.o `test -f 'src/common/linux/dump_symbols_unittest.cc' || echo '$(srcdir)/'`src/common/linux/dump_symbols_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/dump_symbols_unittest.cc' object='src/common/linux/dumper_unittest-dump_symbols_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-dump_symbols_unittest.o `test -f 'src/common/linux/dump_symbols_unittest.cc' || echo '$(srcdir)/'`src/common/linux/dump_symbols_unittest.cc + +src/common/linux/dumper_unittest-dump_symbols_unittest.obj: src/common/linux/dump_symbols_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-dump_symbols_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Tpo -c -o src/common/linux/dumper_unittest-dump_symbols_unittest.obj `if test -f 'src/common/linux/dump_symbols_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/dump_symbols_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/dump_symbols_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/dump_symbols_unittest.cc' object='src/common/linux/dumper_unittest-dump_symbols_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-dump_symbols_unittest.obj `if test -f 'src/common/linux/dump_symbols_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/dump_symbols_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/dump_symbols_unittest.cc'; fi` + +src/common/linux/dumper_unittest-elf_core_dump.o: src/common/linux/elf_core_dump.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-elf_core_dump.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump.Tpo -c -o src/common/linux/dumper_unittest-elf_core_dump.o `test -f 'src/common/linux/elf_core_dump.cc' || echo '$(srcdir)/'`src/common/linux/elf_core_dump.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_core_dump.cc' object='src/common/linux/dumper_unittest-elf_core_dump.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-elf_core_dump.o `test -f 'src/common/linux/elf_core_dump.cc' || echo '$(srcdir)/'`src/common/linux/elf_core_dump.cc + +src/common/linux/dumper_unittest-elf_core_dump.obj: src/common/linux/elf_core_dump.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-elf_core_dump.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump.Tpo -c -o src/common/linux/dumper_unittest-elf_core_dump.obj `if test -f 'src/common/linux/elf_core_dump.cc'; then $(CYGPATH_W) 'src/common/linux/elf_core_dump.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_core_dump.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_core_dump.cc' object='src/common/linux/dumper_unittest-elf_core_dump.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-elf_core_dump.obj `if test -f 'src/common/linux/elf_core_dump.cc'; then $(CYGPATH_W) 'src/common/linux/elf_core_dump.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_core_dump.cc'; fi` + +src/common/linux/dumper_unittest-elf_core_dump_unittest.o: src/common/linux/elf_core_dump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-elf_core_dump_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump_unittest.Tpo -c -o src/common/linux/dumper_unittest-elf_core_dump_unittest.o `test -f 'src/common/linux/elf_core_dump_unittest.cc' || echo '$(srcdir)/'`src/common/linux/elf_core_dump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_core_dump_unittest.cc' object='src/common/linux/dumper_unittest-elf_core_dump_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-elf_core_dump_unittest.o `test -f 'src/common/linux/elf_core_dump_unittest.cc' || echo '$(srcdir)/'`src/common/linux/elf_core_dump_unittest.cc + +src/common/linux/dumper_unittest-elf_core_dump_unittest.obj: src/common/linux/elf_core_dump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-elf_core_dump_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump_unittest.Tpo -c -o src/common/linux/dumper_unittest-elf_core_dump_unittest.obj `if test -f 'src/common/linux/elf_core_dump_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/elf_core_dump_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_core_dump_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_core_dump_unittest.cc' object='src/common/linux/dumper_unittest-elf_core_dump_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-elf_core_dump_unittest.obj `if test -f 'src/common/linux/elf_core_dump_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/elf_core_dump_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_core_dump_unittest.cc'; fi` + +src/common/linux/dumper_unittest-elf_symbols_to_module.o: src/common/linux/elf_symbols_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-elf_symbols_to_module.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module.Tpo -c -o src/common/linux/dumper_unittest-elf_symbols_to_module.o `test -f 'src/common/linux/elf_symbols_to_module.cc' || echo '$(srcdir)/'`src/common/linux/elf_symbols_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_symbols_to_module.cc' object='src/common/linux/dumper_unittest-elf_symbols_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-elf_symbols_to_module.o `test -f 'src/common/linux/elf_symbols_to_module.cc' || echo '$(srcdir)/'`src/common/linux/elf_symbols_to_module.cc + +src/common/linux/dumper_unittest-elf_symbols_to_module.obj: src/common/linux/elf_symbols_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-elf_symbols_to_module.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module.Tpo -c -o src/common/linux/dumper_unittest-elf_symbols_to_module.obj `if test -f 'src/common/linux/elf_symbols_to_module.cc'; then $(CYGPATH_W) 'src/common/linux/elf_symbols_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_symbols_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_symbols_to_module.cc' object='src/common/linux/dumper_unittest-elf_symbols_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-elf_symbols_to_module.obj `if test -f 'src/common/linux/elf_symbols_to_module.cc'; then $(CYGPATH_W) 'src/common/linux/elf_symbols_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_symbols_to_module.cc'; fi` + +src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.o: src/common/linux/elf_symbols_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module_unittest.Tpo -c -o src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.o `test -f 'src/common/linux/elf_symbols_to_module_unittest.cc' || echo '$(srcdir)/'`src/common/linux/elf_symbols_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_symbols_to_module_unittest.cc' object='src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.o `test -f 'src/common/linux/elf_symbols_to_module_unittest.cc' || echo '$(srcdir)/'`src/common/linux/elf_symbols_to_module_unittest.cc + +src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.obj: src/common/linux/elf_symbols_to_module_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module_unittest.Tpo -c -o src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.obj `if test -f 'src/common/linux/elf_symbols_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/elf_symbols_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_symbols_to_module_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_symbols_to_module_unittest.cc' object='src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-elf_symbols_to_module_unittest.obj `if test -f 'src/common/linux/elf_symbols_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/elf_symbols_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_symbols_to_module_unittest.cc'; fi` + +src/common/linux/dumper_unittest-elfutils.o: src/common/linux/elfutils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-elfutils.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-elfutils.Tpo -c -o src/common/linux/dumper_unittest-elfutils.o `test -f 'src/common/linux/elfutils.cc' || echo '$(srcdir)/'`src/common/linux/elfutils.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-elfutils.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-elfutils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elfutils.cc' object='src/common/linux/dumper_unittest-elfutils.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-elfutils.o `test -f 'src/common/linux/elfutils.cc' || echo '$(srcdir)/'`src/common/linux/elfutils.cc + +src/common/linux/dumper_unittest-elfutils.obj: src/common/linux/elfutils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-elfutils.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-elfutils.Tpo -c -o src/common/linux/dumper_unittest-elfutils.obj `if test -f 'src/common/linux/elfutils.cc'; then $(CYGPATH_W) 'src/common/linux/elfutils.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elfutils.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-elfutils.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-elfutils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elfutils.cc' object='src/common/linux/dumper_unittest-elfutils.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-elfutils.obj `if test -f 'src/common/linux/elfutils.cc'; then $(CYGPATH_W) 'src/common/linux/elfutils.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elfutils.cc'; fi` + +src/common/linux/dumper_unittest-file_id.o: src/common/linux/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-file_id.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-file_id.Tpo -c -o src/common/linux/dumper_unittest-file_id.o `test -f 'src/common/linux/file_id.cc' || echo '$(srcdir)/'`src/common/linux/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-file_id.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-file_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/file_id.cc' object='src/common/linux/dumper_unittest-file_id.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-file_id.o `test -f 'src/common/linux/file_id.cc' || echo '$(srcdir)/'`src/common/linux/file_id.cc + +src/common/linux/dumper_unittest-file_id.obj: src/common/linux/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-file_id.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-file_id.Tpo -c -o src/common/linux/dumper_unittest-file_id.obj `if test -f 'src/common/linux/file_id.cc'; then $(CYGPATH_W) 'src/common/linux/file_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/file_id.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-file_id.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-file_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/file_id.cc' object='src/common/linux/dumper_unittest-file_id.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-file_id.obj `if test -f 'src/common/linux/file_id.cc'; then $(CYGPATH_W) 'src/common/linux/file_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/file_id.cc'; fi` + +src/common/linux/dumper_unittest-file_id_unittest.o: src/common/linux/file_id_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-file_id_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-file_id_unittest.Tpo -c -o src/common/linux/dumper_unittest-file_id_unittest.o `test -f 'src/common/linux/file_id_unittest.cc' || echo '$(srcdir)/'`src/common/linux/file_id_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-file_id_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-file_id_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/file_id_unittest.cc' object='src/common/linux/dumper_unittest-file_id_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-file_id_unittest.o `test -f 'src/common/linux/file_id_unittest.cc' || echo '$(srcdir)/'`src/common/linux/file_id_unittest.cc + +src/common/linux/dumper_unittest-file_id_unittest.obj: src/common/linux/file_id_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-file_id_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-file_id_unittest.Tpo -c -o src/common/linux/dumper_unittest-file_id_unittest.obj `if test -f 'src/common/linux/file_id_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/file_id_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/file_id_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-file_id_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-file_id_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/file_id_unittest.cc' object='src/common/linux/dumper_unittest-file_id_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-file_id_unittest.obj `if test -f 'src/common/linux/file_id_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/file_id_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/file_id_unittest.cc'; fi` + +src/common/linux/dumper_unittest-linux_libc_support.o: src/common/linux/linux_libc_support.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-linux_libc_support.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-linux_libc_support.Tpo -c -o src/common/linux/dumper_unittest-linux_libc_support.o `test -f 'src/common/linux/linux_libc_support.cc' || echo '$(srcdir)/'`src/common/linux/linux_libc_support.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-linux_libc_support.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-linux_libc_support.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/linux_libc_support.cc' object='src/common/linux/dumper_unittest-linux_libc_support.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-linux_libc_support.o `test -f 'src/common/linux/linux_libc_support.cc' || echo '$(srcdir)/'`src/common/linux/linux_libc_support.cc + +src/common/linux/dumper_unittest-linux_libc_support.obj: src/common/linux/linux_libc_support.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-linux_libc_support.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-linux_libc_support.Tpo -c -o src/common/linux/dumper_unittest-linux_libc_support.obj `if test -f 'src/common/linux/linux_libc_support.cc'; then $(CYGPATH_W) 'src/common/linux/linux_libc_support.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/linux_libc_support.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-linux_libc_support.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-linux_libc_support.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/linux_libc_support.cc' object='src/common/linux/dumper_unittest-linux_libc_support.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-linux_libc_support.obj `if test -f 'src/common/linux/linux_libc_support.cc'; then $(CYGPATH_W) 'src/common/linux/linux_libc_support.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/linux_libc_support.cc'; fi` + +src/common/linux/dumper_unittest-memory_mapped_file.o: src/common/linux/memory_mapped_file.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-memory_mapped_file.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file.Tpo -c -o src/common/linux/dumper_unittest-memory_mapped_file.o `test -f 'src/common/linux/memory_mapped_file.cc' || echo '$(srcdir)/'`src/common/linux/memory_mapped_file.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/memory_mapped_file.cc' object='src/common/linux/dumper_unittest-memory_mapped_file.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-memory_mapped_file.o `test -f 'src/common/linux/memory_mapped_file.cc' || echo '$(srcdir)/'`src/common/linux/memory_mapped_file.cc + +src/common/linux/dumper_unittest-memory_mapped_file.obj: src/common/linux/memory_mapped_file.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-memory_mapped_file.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file.Tpo -c -o src/common/linux/dumper_unittest-memory_mapped_file.obj `if test -f 'src/common/linux/memory_mapped_file.cc'; then $(CYGPATH_W) 'src/common/linux/memory_mapped_file.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/memory_mapped_file.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/memory_mapped_file.cc' object='src/common/linux/dumper_unittest-memory_mapped_file.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-memory_mapped_file.obj `if test -f 'src/common/linux/memory_mapped_file.cc'; then $(CYGPATH_W) 'src/common/linux/memory_mapped_file.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/memory_mapped_file.cc'; fi` + +src/common/linux/dumper_unittest-memory_mapped_file_unittest.o: src/common/linux/memory_mapped_file_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-memory_mapped_file_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file_unittest.Tpo -c -o src/common/linux/dumper_unittest-memory_mapped_file_unittest.o `test -f 'src/common/linux/memory_mapped_file_unittest.cc' || echo '$(srcdir)/'`src/common/linux/memory_mapped_file_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/memory_mapped_file_unittest.cc' object='src/common/linux/dumper_unittest-memory_mapped_file_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-memory_mapped_file_unittest.o `test -f 'src/common/linux/memory_mapped_file_unittest.cc' || echo '$(srcdir)/'`src/common/linux/memory_mapped_file_unittest.cc + +src/common/linux/dumper_unittest-memory_mapped_file_unittest.obj: src/common/linux/memory_mapped_file_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-memory_mapped_file_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file_unittest.Tpo -c -o src/common/linux/dumper_unittest-memory_mapped_file_unittest.obj `if test -f 'src/common/linux/memory_mapped_file_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/memory_mapped_file_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/memory_mapped_file_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/memory_mapped_file_unittest.cc' object='src/common/linux/dumper_unittest-memory_mapped_file_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-memory_mapped_file_unittest.obj `if test -f 'src/common/linux/memory_mapped_file_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/memory_mapped_file_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/memory_mapped_file_unittest.cc'; fi` + +src/common/linux/dumper_unittest-safe_readlink.o: src/common/linux/safe_readlink.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-safe_readlink.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink.Tpo -c -o src/common/linux/dumper_unittest-safe_readlink.o `test -f 'src/common/linux/safe_readlink.cc' || echo '$(srcdir)/'`src/common/linux/safe_readlink.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/safe_readlink.cc' object='src/common/linux/dumper_unittest-safe_readlink.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-safe_readlink.o `test -f 'src/common/linux/safe_readlink.cc' || echo '$(srcdir)/'`src/common/linux/safe_readlink.cc + +src/common/linux/dumper_unittest-safe_readlink.obj: src/common/linux/safe_readlink.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-safe_readlink.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink.Tpo -c -o src/common/linux/dumper_unittest-safe_readlink.obj `if test -f 'src/common/linux/safe_readlink.cc'; then $(CYGPATH_W) 'src/common/linux/safe_readlink.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/safe_readlink.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/safe_readlink.cc' object='src/common/linux/dumper_unittest-safe_readlink.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-safe_readlink.obj `if test -f 'src/common/linux/safe_readlink.cc'; then $(CYGPATH_W) 'src/common/linux/safe_readlink.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/safe_readlink.cc'; fi` + +src/common/linux/dumper_unittest-safe_readlink_unittest.o: src/common/linux/safe_readlink_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-safe_readlink_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink_unittest.Tpo -c -o src/common/linux/dumper_unittest-safe_readlink_unittest.o `test -f 'src/common/linux/safe_readlink_unittest.cc' || echo '$(srcdir)/'`src/common/linux/safe_readlink_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/safe_readlink_unittest.cc' object='src/common/linux/dumper_unittest-safe_readlink_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-safe_readlink_unittest.o `test -f 'src/common/linux/safe_readlink_unittest.cc' || echo '$(srcdir)/'`src/common/linux/safe_readlink_unittest.cc + +src/common/linux/dumper_unittest-safe_readlink_unittest.obj: src/common/linux/safe_readlink_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-safe_readlink_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink_unittest.Tpo -c -o src/common/linux/dumper_unittest-safe_readlink_unittest.obj `if test -f 'src/common/linux/safe_readlink_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/safe_readlink_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/safe_readlink_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/safe_readlink_unittest.cc' object='src/common/linux/dumper_unittest-safe_readlink_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-safe_readlink_unittest.obj `if test -f 'src/common/linux/safe_readlink_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/safe_readlink_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/safe_readlink_unittest.cc'; fi` + +src/common/linux/dumper_unittest-synth_elf.o: src/common/linux/synth_elf.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-synth_elf.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf.Tpo -c -o src/common/linux/dumper_unittest-synth_elf.o `test -f 'src/common/linux/synth_elf.cc' || echo '$(srcdir)/'`src/common/linux/synth_elf.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/synth_elf.cc' object='src/common/linux/dumper_unittest-synth_elf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-synth_elf.o `test -f 'src/common/linux/synth_elf.cc' || echo '$(srcdir)/'`src/common/linux/synth_elf.cc + +src/common/linux/dumper_unittest-synth_elf.obj: src/common/linux/synth_elf.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-synth_elf.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf.Tpo -c -o src/common/linux/dumper_unittest-synth_elf.obj `if test -f 'src/common/linux/synth_elf.cc'; then $(CYGPATH_W) 'src/common/linux/synth_elf.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/synth_elf.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/synth_elf.cc' object='src/common/linux/dumper_unittest-synth_elf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-synth_elf.obj `if test -f 'src/common/linux/synth_elf.cc'; then $(CYGPATH_W) 'src/common/linux/synth_elf.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/synth_elf.cc'; fi` + +src/common/linux/dumper_unittest-synth_elf_unittest.o: src/common/linux/synth_elf_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-synth_elf_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf_unittest.Tpo -c -o src/common/linux/dumper_unittest-synth_elf_unittest.o `test -f 'src/common/linux/synth_elf_unittest.cc' || echo '$(srcdir)/'`src/common/linux/synth_elf_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/synth_elf_unittest.cc' object='src/common/linux/dumper_unittest-synth_elf_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-synth_elf_unittest.o `test -f 'src/common/linux/synth_elf_unittest.cc' || echo '$(srcdir)/'`src/common/linux/synth_elf_unittest.cc + +src/common/linux/dumper_unittest-synth_elf_unittest.obj: src/common/linux/synth_elf_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/dumper_unittest-synth_elf_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf_unittest.Tpo -c -o src/common/linux/dumper_unittest-synth_elf_unittest.obj `if test -f 'src/common/linux/synth_elf_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/synth_elf_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/synth_elf_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf_unittest.Tpo src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/synth_elf_unittest.cc' object='src/common/linux/dumper_unittest-synth_elf_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/dumper_unittest-synth_elf_unittest.obj `if test -f 'src/common/linux/synth_elf_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/synth_elf_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/synth_elf_unittest.cc'; fi` + +src/common/linux/tests/dumper_unittest-crash_generator.o: src/common/linux/tests/crash_generator.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tests/dumper_unittest-crash_generator.o -MD -MP -MF src/common/linux/tests/$(DEPDIR)/dumper_unittest-crash_generator.Tpo -c -o src/common/linux/tests/dumper_unittest-crash_generator.o `test -f 'src/common/linux/tests/crash_generator.cc' || echo '$(srcdir)/'`src/common/linux/tests/crash_generator.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/tests/$(DEPDIR)/dumper_unittest-crash_generator.Tpo src/common/linux/tests/$(DEPDIR)/dumper_unittest-crash_generator.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/tests/crash_generator.cc' object='src/common/linux/tests/dumper_unittest-crash_generator.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tests/dumper_unittest-crash_generator.o `test -f 'src/common/linux/tests/crash_generator.cc' || echo '$(srcdir)/'`src/common/linux/tests/crash_generator.cc + +src/common/linux/tests/dumper_unittest-crash_generator.obj: src/common/linux/tests/crash_generator.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tests/dumper_unittest-crash_generator.obj -MD -MP -MF src/common/linux/tests/$(DEPDIR)/dumper_unittest-crash_generator.Tpo -c -o src/common/linux/tests/dumper_unittest-crash_generator.obj `if test -f 'src/common/linux/tests/crash_generator.cc'; then $(CYGPATH_W) 'src/common/linux/tests/crash_generator.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/tests/crash_generator.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/tests/$(DEPDIR)/dumper_unittest-crash_generator.Tpo src/common/linux/tests/$(DEPDIR)/dumper_unittest-crash_generator.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/tests/crash_generator.cc' object='src/common/linux/tests/dumper_unittest-crash_generator.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tests/dumper_unittest-crash_generator.obj `if test -f 'src/common/linux/tests/crash_generator.cc'; then $(CYGPATH_W) 'src/common/linux/tests/crash_generator.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/tests/crash_generator.cc'; fi` + +src/common/tests/dumper_unittest-file_utils.o: src/common/tests/file_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/tests/dumper_unittest-file_utils.o -MD -MP -MF src/common/tests/$(DEPDIR)/dumper_unittest-file_utils.Tpo -c -o src/common/tests/dumper_unittest-file_utils.o `test -f 'src/common/tests/file_utils.cc' || echo '$(srcdir)/'`src/common/tests/file_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/tests/$(DEPDIR)/dumper_unittest-file_utils.Tpo src/common/tests/$(DEPDIR)/dumper_unittest-file_utils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/tests/file_utils.cc' object='src/common/tests/dumper_unittest-file_utils.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tests/dumper_unittest-file_utils.o `test -f 'src/common/tests/file_utils.cc' || echo '$(srcdir)/'`src/common/tests/file_utils.cc + +src/common/tests/dumper_unittest-file_utils.obj: src/common/tests/file_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/tests/dumper_unittest-file_utils.obj -MD -MP -MF src/common/tests/$(DEPDIR)/dumper_unittest-file_utils.Tpo -c -o src/common/tests/dumper_unittest-file_utils.obj `if test -f 'src/common/tests/file_utils.cc'; then $(CYGPATH_W) 'src/common/tests/file_utils.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/tests/file_utils.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/tests/$(DEPDIR)/dumper_unittest-file_utils.Tpo src/common/tests/$(DEPDIR)/dumper_unittest-file_utils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/tests/file_utils.cc' object='src/common/tests/dumper_unittest-file_utils.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tests/dumper_unittest-file_utils.obj `if test -f 'src/common/tests/file_utils.cc'; then $(CYGPATH_W) 'src/common/tests/file_utils.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/tests/file_utils.cc'; fi` + +src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.o: src/common/dwarf/dwarf2reader_lineinfo_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dwarf_dwarf2reader_lineinfo_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.Tpo -c -o src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.o `test -f 'src/common/dwarf/dwarf2reader_lineinfo_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader_lineinfo_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.Tpo src/common/dwarf/$(DEPDIR)/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader_lineinfo_unittest.cc' object='src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dwarf_dwarf2reader_lineinfo_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.o `test -f 'src/common/dwarf/dwarf2reader_lineinfo_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader_lineinfo_unittest.cc + +src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.obj: src/common/dwarf/dwarf2reader_lineinfo_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dwarf_dwarf2reader_lineinfo_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.Tpo -c -o src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.obj `if test -f 'src/common/dwarf/dwarf2reader_lineinfo_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader_lineinfo_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.Tpo src/common/dwarf/$(DEPDIR)/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader_lineinfo_unittest.cc' object='src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dwarf_dwarf2reader_lineinfo_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.obj `if test -f 'src/common/dwarf/dwarf2reader_lineinfo_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader_lineinfo_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc'; fi` + +src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.o: src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.Tpo -c -o src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.o `test -f 'src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.Tpo src/common/dwarf/$(DEPDIR)/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc' object='src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.o `test -f 'src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc + +src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.obj: src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.Tpo -c -o src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.obj `if test -f 'src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.Tpo src/common/dwarf/$(DEPDIR)/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc' object='src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dwarf_dwarf2reader_splitfunctions_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.obj `if test -f 'src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc'; fi` + +src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.o: src/common/linux/google_crashdump_uploader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.o -MD -MP -MF src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader.Tpo -c -o src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.o `test -f 'src/common/linux/google_crashdump_uploader.cc' || echo '$(srcdir)/'`src/common/linux/google_crashdump_uploader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader.Tpo src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/google_crashdump_uploader.cc' object='src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.o `test -f 'src/common/linux/google_crashdump_uploader.cc' || echo '$(srcdir)/'`src/common/linux/google_crashdump_uploader.cc + +src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.obj: src/common/linux/google_crashdump_uploader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.obj -MD -MP -MF src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader.Tpo -c -o src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.obj `if test -f 'src/common/linux/google_crashdump_uploader.cc'; then $(CYGPATH_W) 'src/common/linux/google_crashdump_uploader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/google_crashdump_uploader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader.Tpo src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/google_crashdump_uploader.cc' object='src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader.obj `if test -f 'src/common/linux/google_crashdump_uploader.cc'; then $(CYGPATH_W) 'src/common/linux/google_crashdump_uploader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/google_crashdump_uploader.cc'; fi` + +src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.o: src/common/linux/google_crashdump_uploader_test.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.o -MD -MP -MF src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader_test.Tpo -c -o src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.o `test -f 'src/common/linux/google_crashdump_uploader_test.cc' || echo '$(srcdir)/'`src/common/linux/google_crashdump_uploader_test.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader_test.Tpo src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/google_crashdump_uploader_test.cc' object='src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.o `test -f 'src/common/linux/google_crashdump_uploader_test.cc' || echo '$(srcdir)/'`src/common/linux/google_crashdump_uploader_test.cc + +src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.obj: src/common/linux/google_crashdump_uploader_test.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.obj -MD -MP -MF src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader_test.Tpo -c -o src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.obj `if test -f 'src/common/linux/google_crashdump_uploader_test.cc'; then $(CYGPATH_W) 'src/common/linux/google_crashdump_uploader_test.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/google_crashdump_uploader_test.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader_test.Tpo src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/google_crashdump_uploader_test.cc' object='src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/google_crashdump_uploader_test-google_crashdump_uploader_test.obj `if test -f 'src/common/linux/google_crashdump_uploader_test.cc'; then $(CYGPATH_W) 'src/common/linux/google_crashdump_uploader_test.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/google_crashdump_uploader_test.cc'; fi` + +src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.o: src/common/linux/libcurl_wrapper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.o -MD -MP -MF src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-libcurl_wrapper.Tpo -c -o src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.o `test -f 'src/common/linux/libcurl_wrapper.cc' || echo '$(srcdir)/'`src/common/linux/libcurl_wrapper.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-libcurl_wrapper.Tpo src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-libcurl_wrapper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/libcurl_wrapper.cc' object='src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.o `test -f 'src/common/linux/libcurl_wrapper.cc' || echo '$(srcdir)/'`src/common/linux/libcurl_wrapper.cc + +src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.obj: src/common/linux/libcurl_wrapper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.obj -MD -MP -MF src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-libcurl_wrapper.Tpo -c -o src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.obj `if test -f 'src/common/linux/libcurl_wrapper.cc'; then $(CYGPATH_W) 'src/common/linux/libcurl_wrapper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/libcurl_wrapper.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-libcurl_wrapper.Tpo src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-libcurl_wrapper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/libcurl_wrapper.cc' object='src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_google_crashdump_uploader_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/google_crashdump_uploader_test-libcurl_wrapper.obj `if test -f 'src/common/linux/libcurl_wrapper.cc'; then $(CYGPATH_W) 'src/common/linux/libcurl_wrapper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/libcurl_wrapper.cc'; fi` + +src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.o: src/common/linux/scoped_pipe_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_pipe_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Tpo -c -o src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.o `test -f 'src/common/linux/scoped_pipe_unittest.cc' || echo '$(srcdir)/'`src/common/linux/scoped_pipe_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Tpo src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_pipe_unittest.cc' object='src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_pipe_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.o `test -f 'src/common/linux/scoped_pipe_unittest.cc' || echo '$(srcdir)/'`src/common/linux/scoped_pipe_unittest.cc + +src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.obj: src/common/linux/scoped_pipe_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_pipe_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Tpo -c -o src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.obj `if test -f 'src/common/linux/scoped_pipe_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_pipe_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_pipe_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Tpo src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_pipe_unittest.cc' object='src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_pipe_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/scoped_pipe_unittest-scoped_pipe_unittest.obj `if test -f 'src/common/linux/scoped_pipe_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_pipe_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_pipe_unittest.cc'; fi` + +src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.o: src/common/linux/scoped_tmpfile_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_tmpfile_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.o -MD -MP -MF src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Tpo -c -o src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.o `test -f 'src/common/linux/scoped_tmpfile_unittest.cc' || echo '$(srcdir)/'`src/common/linux/scoped_tmpfile_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Tpo src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_tmpfile_unittest.cc' object='src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_tmpfile_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.o `test -f 'src/common/linux/scoped_tmpfile_unittest.cc' || echo '$(srcdir)/'`src/common/linux/scoped_tmpfile_unittest.cc + +src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.obj: src/common/linux/scoped_tmpfile_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_tmpfile_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.obj -MD -MP -MF src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Tpo -c -o src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.obj `if test -f 'src/common/linux/scoped_tmpfile_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_tmpfile_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_tmpfile_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Tpo src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/scoped_tmpfile_unittest.cc' object='src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_linux_scoped_tmpfile_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/scoped_tmpfile_unittest-scoped_tmpfile_unittest.obj `if test -f 'src/common/linux/scoped_tmpfile_unittest.cc'; then $(CYGPATH_W) 'src/common/linux/scoped_tmpfile_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/scoped_tmpfile_unittest.cc'; fi` + +src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.o: src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Tpo -c -o src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.o `test -f 'src/common/dwarf_cfi_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cfi_to_module.cc' object='src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.o `test -f 'src/common/dwarf_cfi_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module.cc + +src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.obj: src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Tpo -c -o src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.obj `if test -f 'src/common/dwarf_cfi_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cfi_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cfi_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cfi_to_module.cc' object='src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-dwarf_cfi_to_module.obj `if test -f 'src/common/dwarf_cfi_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cfi_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cfi_to_module.cc'; fi` + +src/common/mac_macho_reader_unittest-dwarf_cu_to_module.o: src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-dwarf_cu_to_module.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cu_to_module.Tpo -c -o src/common/mac_macho_reader_unittest-dwarf_cu_to_module.o `test -f 'src/common/dwarf_cu_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cu_to_module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cu_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cu_to_module.cc' object='src/common/mac_macho_reader_unittest-dwarf_cu_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-dwarf_cu_to_module.o `test -f 'src/common/dwarf_cu_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cu_to_module.cc + +src/common/mac_macho_reader_unittest-dwarf_cu_to_module.obj: src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-dwarf_cu_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cu_to_module.Tpo -c -o src/common/mac_macho_reader_unittest-dwarf_cu_to_module.obj `if test -f 'src/common/dwarf_cu_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cu_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cu_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cu_to_module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cu_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cu_to_module.cc' object='src/common/mac_macho_reader_unittest-dwarf_cu_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-dwarf_cu_to_module.obj `if test -f 'src/common/dwarf_cu_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cu_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cu_to_module.cc'; fi` + +src/common/mac_macho_reader_unittest-dwarf_line_to_module.o: src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-dwarf_line_to_module.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_line_to_module.Tpo -c -o src/common/mac_macho_reader_unittest-dwarf_line_to_module.o `test -f 'src/common/dwarf_line_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_line_to_module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_line_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_line_to_module.cc' object='src/common/mac_macho_reader_unittest-dwarf_line_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-dwarf_line_to_module.o `test -f 'src/common/dwarf_line_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_line_to_module.cc + +src/common/mac_macho_reader_unittest-dwarf_line_to_module.obj: src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-dwarf_line_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_line_to_module.Tpo -c -o src/common/mac_macho_reader_unittest-dwarf_line_to_module.obj `if test -f 'src/common/dwarf_line_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_line_to_module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_line_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_line_to_module.cc' object='src/common/mac_macho_reader_unittest-dwarf_line_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-dwarf_line_to_module.obj `if test -f 'src/common/dwarf_line_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module.cc'; fi` + +src/common/mac_macho_reader_unittest-language.o: src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-language.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-language.Tpo -c -o src/common/mac_macho_reader_unittest-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-language.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-language.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/language.cc' object='src/common/mac_macho_reader_unittest-language.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc + +src/common/mac_macho_reader_unittest-language.obj: src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-language.obj -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-language.Tpo -c -o src/common/mac_macho_reader_unittest-language.obj `if test -f 'src/common/language.cc'; then $(CYGPATH_W) 'src/common/language.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/language.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-language.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-language.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/language.cc' object='src/common/mac_macho_reader_unittest-language.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-language.obj `if test -f 'src/common/language.cc'; then $(CYGPATH_W) 'src/common/language.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/language.cc'; fi` + +src/common/mac_macho_reader_unittest-md5.o: src/common/md5.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-md5.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-md5.Tpo -c -o src/common/mac_macho_reader_unittest-md5.o `test -f 'src/common/md5.cc' || echo '$(srcdir)/'`src/common/md5.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-md5.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-md5.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/md5.cc' object='src/common/mac_macho_reader_unittest-md5.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-md5.o `test -f 'src/common/md5.cc' || echo '$(srcdir)/'`src/common/md5.cc + +src/common/mac_macho_reader_unittest-md5.obj: src/common/md5.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-md5.obj -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-md5.Tpo -c -o src/common/mac_macho_reader_unittest-md5.obj `if test -f 'src/common/md5.cc'; then $(CYGPATH_W) 'src/common/md5.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/md5.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-md5.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-md5.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/md5.cc' object='src/common/mac_macho_reader_unittest-md5.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-md5.obj `if test -f 'src/common/md5.cc'; then $(CYGPATH_W) 'src/common/md5.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/md5.cc'; fi` + +src/common/mac_macho_reader_unittest-module.o: src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-module.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-module.Tpo -c -o src/common/mac_macho_reader_unittest-module.o `test -f 'src/common/module.cc' || echo '$(srcdir)/'`src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/module.cc' object='src/common/mac_macho_reader_unittest-module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-module.o `test -f 'src/common/module.cc' || echo '$(srcdir)/'`src/common/module.cc + +src/common/mac_macho_reader_unittest-module.obj: src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-module.obj -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-module.Tpo -c -o src/common/mac_macho_reader_unittest-module.obj `if test -f 'src/common/module.cc'; then $(CYGPATH_W) 'src/common/module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/module.cc' object='src/common/mac_macho_reader_unittest-module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-module.obj `if test -f 'src/common/module.cc'; then $(CYGPATH_W) 'src/common/module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/module.cc'; fi` + +src/common/mac_macho_reader_unittest-path_helper.o: src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-path_helper.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-path_helper.Tpo -c -o src/common/mac_macho_reader_unittest-path_helper.o `test -f 'src/common/path_helper.cc' || echo '$(srcdir)/'`src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-path_helper.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-path_helper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/path_helper.cc' object='src/common/mac_macho_reader_unittest-path_helper.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-path_helper.o `test -f 'src/common/path_helper.cc' || echo '$(srcdir)/'`src/common/path_helper.cc + +src/common/mac_macho_reader_unittest-path_helper.obj: src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-path_helper.obj -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-path_helper.Tpo -c -o src/common/mac_macho_reader_unittest-path_helper.obj `if test -f 'src/common/path_helper.cc'; then $(CYGPATH_W) 'src/common/path_helper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/path_helper.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-path_helper.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-path_helper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/path_helper.cc' object='src/common/mac_macho_reader_unittest-path_helper.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-path_helper.obj `if test -f 'src/common/path_helper.cc'; then $(CYGPATH_W) 'src/common/path_helper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/path_helper.cc'; fi` + +src/common/mac_macho_reader_unittest-stabs_reader.o: src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-stabs_reader.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_reader.Tpo -c -o src/common/mac_macho_reader_unittest-stabs_reader.o `test -f 'src/common/stabs_reader.cc' || echo '$(srcdir)/'`src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_reader.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_reader.cc' object='src/common/mac_macho_reader_unittest-stabs_reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-stabs_reader.o `test -f 'src/common/stabs_reader.cc' || echo '$(srcdir)/'`src/common/stabs_reader.cc + +src/common/mac_macho_reader_unittest-stabs_reader.obj: src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-stabs_reader.obj -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_reader.Tpo -c -o src/common/mac_macho_reader_unittest-stabs_reader.obj `if test -f 'src/common/stabs_reader.cc'; then $(CYGPATH_W) 'src/common/stabs_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_reader.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_reader.cc' object='src/common/mac_macho_reader_unittest-stabs_reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-stabs_reader.obj `if test -f 'src/common/stabs_reader.cc'; then $(CYGPATH_W) 'src/common/stabs_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_reader.cc'; fi` + +src/common/mac_macho_reader_unittest-stabs_to_module.o: src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-stabs_to_module.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_to_module.Tpo -c -o src/common/mac_macho_reader_unittest-stabs_to_module.o `test -f 'src/common/stabs_to_module.cc' || echo '$(srcdir)/'`src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_to_module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_to_module.cc' object='src/common/mac_macho_reader_unittest-stabs_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-stabs_to_module.o `test -f 'src/common/stabs_to_module.cc' || echo '$(srcdir)/'`src/common/stabs_to_module.cc + +src/common/mac_macho_reader_unittest-stabs_to_module.obj: src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-stabs_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_to_module.Tpo -c -o src/common/mac_macho_reader_unittest-stabs_to_module.obj `if test -f 'src/common/stabs_to_module.cc'; then $(CYGPATH_W) 'src/common/stabs_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_to_module.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_to_module.cc' object='src/common/mac_macho_reader_unittest-stabs_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-stabs_to_module.obj `if test -f 'src/common/stabs_to_module.cc'; then $(CYGPATH_W) 'src/common/stabs_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_to_module.cc'; fi` + +src/common/mac_macho_reader_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-test_assembler.Tpo -c -o src/common/mac_macho_reader_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-test_assembler.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/mac_macho_reader_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/mac_macho_reader_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac_macho_reader_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/mac_macho_reader_unittest-test_assembler.Tpo -c -o src/common/mac_macho_reader_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/mac_macho_reader_unittest-test_assembler.Tpo src/common/$(DEPDIR)/mac_macho_reader_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/mac_macho_reader_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac_macho_reader_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/common/dwarf/mac_macho_reader_unittest-bytereader.o: src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/mac_macho_reader_unittest-bytereader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-bytereader.Tpo -c -o src/common/dwarf/mac_macho_reader_unittest-bytereader.o `test -f 'src/common/dwarf/bytereader.cc' || echo '$(srcdir)/'`src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-bytereader.Tpo src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-bytereader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/bytereader.cc' object='src/common/dwarf/mac_macho_reader_unittest-bytereader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/mac_macho_reader_unittest-bytereader.o `test -f 'src/common/dwarf/bytereader.cc' || echo '$(srcdir)/'`src/common/dwarf/bytereader.cc + +src/common/dwarf/mac_macho_reader_unittest-bytereader.obj: src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/mac_macho_reader_unittest-bytereader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-bytereader.Tpo -c -o src/common/dwarf/mac_macho_reader_unittest-bytereader.obj `if test -f 'src/common/dwarf/bytereader.cc'; then $(CYGPATH_W) 'src/common/dwarf/bytereader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/bytereader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-bytereader.Tpo src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-bytereader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/bytereader.cc' object='src/common/dwarf/mac_macho_reader_unittest-bytereader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/mac_macho_reader_unittest-bytereader.obj `if test -f 'src/common/dwarf/bytereader.cc'; then $(CYGPATH_W) 'src/common/dwarf/bytereader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/bytereader.cc'; fi` + +src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.o: src/common/dwarf/cfi_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-cfi_assembler.Tpo -c -o src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.o `test -f 'src/common/dwarf/cfi_assembler.cc' || echo '$(srcdir)/'`src/common/dwarf/cfi_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-cfi_assembler.Tpo src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-cfi_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/cfi_assembler.cc' object='src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.o `test -f 'src/common/dwarf/cfi_assembler.cc' || echo '$(srcdir)/'`src/common/dwarf/cfi_assembler.cc + +src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.obj: src/common/dwarf/cfi_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-cfi_assembler.Tpo -c -o src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.obj `if test -f 'src/common/dwarf/cfi_assembler.cc'; then $(CYGPATH_W) 'src/common/dwarf/cfi_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/cfi_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-cfi_assembler.Tpo src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-cfi_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/cfi_assembler.cc' object='src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/mac_macho_reader_unittest-cfi_assembler.obj `if test -f 'src/common/dwarf/cfi_assembler.cc'; then $(CYGPATH_W) 'src/common/dwarf/cfi_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/cfi_assembler.cc'; fi` + +src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.o: src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2diehandler.Tpo -c -o src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.o `test -f 'src/common/dwarf/dwarf2diehandler.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2diehandler.Tpo src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2diehandler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2diehandler.cc' object='src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.o `test -f 'src/common/dwarf/dwarf2diehandler.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2diehandler.cc + +src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.obj: src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2diehandler.Tpo -c -o src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.obj `if test -f 'src/common/dwarf/dwarf2diehandler.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2diehandler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2diehandler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2diehandler.Tpo src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2diehandler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2diehandler.cc' object='src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/mac_macho_reader_unittest-dwarf2diehandler.obj `if test -f 'src/common/dwarf/dwarf2diehandler.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2diehandler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2diehandler.cc'; fi` + +src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.o: src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2reader.Tpo -c -o src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.o `test -f 'src/common/dwarf/dwarf2reader.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2reader.Tpo src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader.cc' object='src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.o `test -f 'src/common/dwarf/dwarf2reader.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader.cc + +src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.obj: src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2reader.Tpo -c -o src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.obj `if test -f 'src/common/dwarf/dwarf2reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2reader.Tpo src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader.cc' object='src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/mac_macho_reader_unittest-dwarf2reader.obj `if test -f 'src/common/dwarf/dwarf2reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader.cc'; fi` + +src/common/dwarf/mac_macho_reader_unittest-elf_reader.o: src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/mac_macho_reader_unittest-elf_reader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-elf_reader.Tpo -c -o src/common/dwarf/mac_macho_reader_unittest-elf_reader.o `test -f 'src/common/dwarf/elf_reader.cc' || echo '$(srcdir)/'`src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-elf_reader.Tpo src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-elf_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/elf_reader.cc' object='src/common/dwarf/mac_macho_reader_unittest-elf_reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/mac_macho_reader_unittest-elf_reader.o `test -f 'src/common/dwarf/elf_reader.cc' || echo '$(srcdir)/'`src/common/dwarf/elf_reader.cc + +src/common/dwarf/mac_macho_reader_unittest-elf_reader.obj: src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/mac_macho_reader_unittest-elf_reader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-elf_reader.Tpo -c -o src/common/dwarf/mac_macho_reader_unittest-elf_reader.obj `if test -f 'src/common/dwarf/elf_reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/elf_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/elf_reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-elf_reader.Tpo src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-elf_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/elf_reader.cc' object='src/common/dwarf/mac_macho_reader_unittest-elf_reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/mac_macho_reader_unittest-elf_reader.obj `if test -f 'src/common/dwarf/elf_reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/elf_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/elf_reader.cc'; fi` + +src/common/mac/macho_reader_unittest-arch_utilities.o: src/common/mac/arch_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-arch_utilities.o -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-arch_utilities.Tpo -c -o src/common/mac/macho_reader_unittest-arch_utilities.o `test -f 'src/common/mac/arch_utilities.cc' || echo '$(srcdir)/'`src/common/mac/arch_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-arch_utilities.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-arch_utilities.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/arch_utilities.cc' object='src/common/mac/macho_reader_unittest-arch_utilities.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-arch_utilities.o `test -f 'src/common/mac/arch_utilities.cc' || echo '$(srcdir)/'`src/common/mac/arch_utilities.cc + +src/common/mac/macho_reader_unittest-arch_utilities.obj: src/common/mac/arch_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-arch_utilities.obj -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-arch_utilities.Tpo -c -o src/common/mac/macho_reader_unittest-arch_utilities.obj `if test -f 'src/common/mac/arch_utilities.cc'; then $(CYGPATH_W) 'src/common/mac/arch_utilities.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/arch_utilities.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-arch_utilities.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-arch_utilities.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/arch_utilities.cc' object='src/common/mac/macho_reader_unittest-arch_utilities.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-arch_utilities.obj `if test -f 'src/common/mac/arch_utilities.cc'; then $(CYGPATH_W) 'src/common/mac/arch_utilities.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/arch_utilities.cc'; fi` + +src/common/mac/macho_reader_unittest-file_id.o: src/common/mac/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-file_id.o -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-file_id.Tpo -c -o src/common/mac/macho_reader_unittest-file_id.o `test -f 'src/common/mac/file_id.cc' || echo '$(srcdir)/'`src/common/mac/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-file_id.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-file_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/file_id.cc' object='src/common/mac/macho_reader_unittest-file_id.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-file_id.o `test -f 'src/common/mac/file_id.cc' || echo '$(srcdir)/'`src/common/mac/file_id.cc + +src/common/mac/macho_reader_unittest-file_id.obj: src/common/mac/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-file_id.obj -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-file_id.Tpo -c -o src/common/mac/macho_reader_unittest-file_id.obj `if test -f 'src/common/mac/file_id.cc'; then $(CYGPATH_W) 'src/common/mac/file_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/file_id.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-file_id.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-file_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/file_id.cc' object='src/common/mac/macho_reader_unittest-file_id.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-file_id.obj `if test -f 'src/common/mac/file_id.cc'; then $(CYGPATH_W) 'src/common/mac/file_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/file_id.cc'; fi` + +src/common/mac/macho_reader_unittest-macho_id.o: src/common/mac/macho_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-macho_id.o -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_id.Tpo -c -o src/common/mac/macho_reader_unittest-macho_id.o `test -f 'src/common/mac/macho_id.cc' || echo '$(srcdir)/'`src/common/mac/macho_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_id.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_id.cc' object='src/common/mac/macho_reader_unittest-macho_id.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-macho_id.o `test -f 'src/common/mac/macho_id.cc' || echo '$(srcdir)/'`src/common/mac/macho_id.cc + +src/common/mac/macho_reader_unittest-macho_id.obj: src/common/mac/macho_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-macho_id.obj -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_id.Tpo -c -o src/common/mac/macho_reader_unittest-macho_id.obj `if test -f 'src/common/mac/macho_id.cc'; then $(CYGPATH_W) 'src/common/mac/macho_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_id.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_id.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_id.cc' object='src/common/mac/macho_reader_unittest-macho_id.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-macho_id.obj `if test -f 'src/common/mac/macho_id.cc'; then $(CYGPATH_W) 'src/common/mac/macho_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_id.cc'; fi` + +src/common/mac/macho_reader_unittest-macho_reader.o: src/common/mac/macho_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-macho_reader.o -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader.Tpo -c -o src/common/mac/macho_reader_unittest-macho_reader.o `test -f 'src/common/mac/macho_reader.cc' || echo '$(srcdir)/'`src/common/mac/macho_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_reader.cc' object='src/common/mac/macho_reader_unittest-macho_reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-macho_reader.o `test -f 'src/common/mac/macho_reader.cc' || echo '$(srcdir)/'`src/common/mac/macho_reader.cc + +src/common/mac/macho_reader_unittest-macho_reader.obj: src/common/mac/macho_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-macho_reader.obj -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader.Tpo -c -o src/common/mac/macho_reader_unittest-macho_reader.obj `if test -f 'src/common/mac/macho_reader.cc'; then $(CYGPATH_W) 'src/common/mac/macho_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_reader.cc' object='src/common/mac/macho_reader_unittest-macho_reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-macho_reader.obj `if test -f 'src/common/mac/macho_reader.cc'; then $(CYGPATH_W) 'src/common/mac/macho_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_reader.cc'; fi` + +src/common/mac/macho_reader_unittest-macho_reader_unittest.o: src/common/mac/macho_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-macho_reader_unittest.o -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader_unittest.Tpo -c -o src/common/mac/macho_reader_unittest-macho_reader_unittest.o `test -f 'src/common/mac/macho_reader_unittest.cc' || echo '$(srcdir)/'`src/common/mac/macho_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader_unittest.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_reader_unittest.cc' object='src/common/mac/macho_reader_unittest-macho_reader_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-macho_reader_unittest.o `test -f 'src/common/mac/macho_reader_unittest.cc' || echo '$(srcdir)/'`src/common/mac/macho_reader_unittest.cc + +src/common/mac/macho_reader_unittest-macho_reader_unittest.obj: src/common/mac/macho_reader_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-macho_reader_unittest.obj -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader_unittest.Tpo -c -o src/common/mac/macho_reader_unittest-macho_reader_unittest.obj `if test -f 'src/common/mac/macho_reader_unittest.cc'; then $(CYGPATH_W) 'src/common/mac/macho_reader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_reader_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader_unittest.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_reader_unittest.cc' object='src/common/mac/macho_reader_unittest-macho_reader_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-macho_reader_unittest.obj `if test -f 'src/common/mac/macho_reader_unittest.cc'; then $(CYGPATH_W) 'src/common/mac/macho_reader_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_reader_unittest.cc'; fi` + +src/common/mac/macho_reader_unittest-macho_utilities.o: src/common/mac/macho_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-macho_utilities.o -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_utilities.Tpo -c -o src/common/mac/macho_reader_unittest-macho_utilities.o `test -f 'src/common/mac/macho_utilities.cc' || echo '$(srcdir)/'`src/common/mac/macho_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_utilities.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_utilities.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_utilities.cc' object='src/common/mac/macho_reader_unittest-macho_utilities.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-macho_utilities.o `test -f 'src/common/mac/macho_utilities.cc' || echo '$(srcdir)/'`src/common/mac/macho_utilities.cc + +src/common/mac/macho_reader_unittest-macho_utilities.obj: src/common/mac/macho_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-macho_utilities.obj -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_utilities.Tpo -c -o src/common/mac/macho_reader_unittest-macho_utilities.obj `if test -f 'src/common/mac/macho_utilities.cc'; then $(CYGPATH_W) 'src/common/mac/macho_utilities.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_utilities.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_utilities.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_utilities.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_utilities.cc' object='src/common/mac/macho_reader_unittest-macho_utilities.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-macho_utilities.obj `if test -f 'src/common/mac/macho_utilities.cc'; then $(CYGPATH_W) 'src/common/mac/macho_utilities.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_utilities.cc'; fi` + +src/common/mac/macho_reader_unittest-macho_walker.o: src/common/mac/macho_walker.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-macho_walker.o -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_walker.Tpo -c -o src/common/mac/macho_reader_unittest-macho_walker.o `test -f 'src/common/mac/macho_walker.cc' || echo '$(srcdir)/'`src/common/mac/macho_walker.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_walker.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_walker.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_walker.cc' object='src/common/mac/macho_reader_unittest-macho_walker.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-macho_walker.o `test -f 'src/common/mac/macho_walker.cc' || echo '$(srcdir)/'`src/common/mac/macho_walker.cc + +src/common/mac/macho_reader_unittest-macho_walker.obj: src/common/mac/macho_walker.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/macho_reader_unittest-macho_walker.obj -MD -MP -MF src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_walker.Tpo -c -o src/common/mac/macho_reader_unittest-macho_walker.obj `if test -f 'src/common/mac/macho_walker.cc'; then $(CYGPATH_W) 'src/common/mac/macho_walker.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_walker.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_walker.Tpo src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_walker.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_walker.cc' object='src/common/mac/macho_reader_unittest-macho_walker.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/macho_reader_unittest-macho_walker.obj `if test -f 'src/common/mac/macho_walker.cc'; then $(CYGPATH_W) 'src/common/mac/macho_walker.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_walker.cc'; fi` + +src/common/tests/mac_macho_reader_unittest-file_utils.o: src/common/tests/file_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/tests/mac_macho_reader_unittest-file_utils.o -MD -MP -MF src/common/tests/$(DEPDIR)/mac_macho_reader_unittest-file_utils.Tpo -c -o src/common/tests/mac_macho_reader_unittest-file_utils.o `test -f 'src/common/tests/file_utils.cc' || echo '$(srcdir)/'`src/common/tests/file_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/tests/$(DEPDIR)/mac_macho_reader_unittest-file_utils.Tpo src/common/tests/$(DEPDIR)/mac_macho_reader_unittest-file_utils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/tests/file_utils.cc' object='src/common/tests/mac_macho_reader_unittest-file_utils.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tests/mac_macho_reader_unittest-file_utils.o `test -f 'src/common/tests/file_utils.cc' || echo '$(srcdir)/'`src/common/tests/file_utils.cc + +src/common/tests/mac_macho_reader_unittest-file_utils.obj: src/common/tests/file_utils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/tests/mac_macho_reader_unittest-file_utils.obj -MD -MP -MF src/common/tests/$(DEPDIR)/mac_macho_reader_unittest-file_utils.Tpo -c -o src/common/tests/mac_macho_reader_unittest-file_utils.obj `if test -f 'src/common/tests/file_utils.cc'; then $(CYGPATH_W) 'src/common/tests/file_utils.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/tests/file_utils.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/tests/$(DEPDIR)/mac_macho_reader_unittest-file_utils.Tpo src/common/tests/$(DEPDIR)/mac_macho_reader_unittest-file_utils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/tests/file_utils.cc' object='src/common/tests/mac_macho_reader_unittest-file_utils.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_mac_macho_reader_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tests/mac_macho_reader_unittest-file_utils.obj `if test -f 'src/common/tests/file_utils.cc'; then $(CYGPATH_W) 'src/common/tests/file_utils.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/tests/file_utils.cc'; fi` + +src/common/safe_math_unittest-safe_math_unittest.o: src/common/safe_math_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_safe_math_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/safe_math_unittest-safe_math_unittest.o -MD -MP -MF src/common/$(DEPDIR)/safe_math_unittest-safe_math_unittest.Tpo -c -o src/common/safe_math_unittest-safe_math_unittest.o `test -f 'src/common/safe_math_unittest.cc' || echo '$(srcdir)/'`src/common/safe_math_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/safe_math_unittest-safe_math_unittest.Tpo src/common/$(DEPDIR)/safe_math_unittest-safe_math_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/safe_math_unittest.cc' object='src/common/safe_math_unittest-safe_math_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_safe_math_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/safe_math_unittest-safe_math_unittest.o `test -f 'src/common/safe_math_unittest.cc' || echo '$(srcdir)/'`src/common/safe_math_unittest.cc + +src/common/safe_math_unittest-safe_math_unittest.obj: src/common/safe_math_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_safe_math_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/safe_math_unittest-safe_math_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/safe_math_unittest-safe_math_unittest.Tpo -c -o src/common/safe_math_unittest-safe_math_unittest.obj `if test -f 'src/common/safe_math_unittest.cc'; then $(CYGPATH_W) 'src/common/safe_math_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/safe_math_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/safe_math_unittest-safe_math_unittest.Tpo src/common/$(DEPDIR)/safe_math_unittest-safe_math_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/safe_math_unittest.cc' object='src/common/safe_math_unittest-safe_math_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_safe_math_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/safe_math_unittest-safe_math_unittest.obj `if test -f 'src/common/safe_math_unittest.cc'; then $(CYGPATH_W) 'src/common/safe_math_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/safe_math_unittest.cc'; fi` + +src/common/test_assembler_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_test_assembler_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/test_assembler_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/test_assembler_unittest-test_assembler.Tpo -c -o src/common/test_assembler_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/test_assembler_unittest-test_assembler.Tpo src/common/$(DEPDIR)/test_assembler_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/test_assembler_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_test_assembler_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/test_assembler_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/test_assembler_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_test_assembler_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/test_assembler_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/test_assembler_unittest-test_assembler.Tpo -c -o src/common/test_assembler_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/test_assembler_unittest-test_assembler.Tpo src/common/$(DEPDIR)/test_assembler_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/test_assembler_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_test_assembler_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/test_assembler_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/common/test_assembler_unittest-test_assembler_unittest.o: src/common/test_assembler_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_test_assembler_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/test_assembler_unittest-test_assembler_unittest.o -MD -MP -MF src/common/$(DEPDIR)/test_assembler_unittest-test_assembler_unittest.Tpo -c -o src/common/test_assembler_unittest-test_assembler_unittest.o `test -f 'src/common/test_assembler_unittest.cc' || echo '$(srcdir)/'`src/common/test_assembler_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/test_assembler_unittest-test_assembler_unittest.Tpo src/common/$(DEPDIR)/test_assembler_unittest-test_assembler_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler_unittest.cc' object='src/common/test_assembler_unittest-test_assembler_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_test_assembler_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/test_assembler_unittest-test_assembler_unittest.o `test -f 'src/common/test_assembler_unittest.cc' || echo '$(srcdir)/'`src/common/test_assembler_unittest.cc + +src/common/test_assembler_unittest-test_assembler_unittest.obj: src/common/test_assembler_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_test_assembler_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/test_assembler_unittest-test_assembler_unittest.obj -MD -MP -MF src/common/$(DEPDIR)/test_assembler_unittest-test_assembler_unittest.Tpo -c -o src/common/test_assembler_unittest-test_assembler_unittest.obj `if test -f 'src/common/test_assembler_unittest.cc'; then $(CYGPATH_W) 'src/common/test_assembler_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/test_assembler_unittest-test_assembler_unittest.Tpo src/common/$(DEPDIR)/test_assembler_unittest-test_assembler_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler_unittest.cc' object='src/common/test_assembler_unittest-test_assembler_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_test_assembler_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/test_assembler_unittest-test_assembler_unittest.obj `if test -f 'src/common/test_assembler_unittest.cc'; then $(CYGPATH_W) 'src/common/test_assembler_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler_unittest.cc'; fi` + +src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.o: src/processor/basic_source_line_resolver_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_basic_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Tpo -c -o src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.o `test -f 'src/processor/basic_source_line_resolver_unittest.cc' || echo '$(srcdir)/'`src/processor/basic_source_line_resolver_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Tpo src/processor/$(DEPDIR)/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/basic_source_line_resolver_unittest.cc' object='src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_basic_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.o `test -f 'src/processor/basic_source_line_resolver_unittest.cc' || echo '$(srcdir)/'`src/processor/basic_source_line_resolver_unittest.cc + +src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.obj: src/processor/basic_source_line_resolver_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_basic_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Tpo -c -o src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.obj `if test -f 'src/processor/basic_source_line_resolver_unittest.cc'; then $(CYGPATH_W) 'src/processor/basic_source_line_resolver_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/basic_source_line_resolver_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Tpo src/processor/$(DEPDIR)/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/basic_source_line_resolver_unittest.cc' object='src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_basic_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.obj `if test -f 'src/processor/basic_source_line_resolver_unittest.cc'; then $(CYGPATH_W) 'src/processor/basic_source_line_resolver_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/basic_source_line_resolver_unittest.cc'; fi` + +src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.o: src/processor/cfi_frame_info_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_cfi_frame_info_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/cfi_frame_info_unittest-cfi_frame_info_unittest.Tpo -c -o src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.o `test -f 'src/processor/cfi_frame_info_unittest.cc' || echo '$(srcdir)/'`src/processor/cfi_frame_info_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/cfi_frame_info_unittest-cfi_frame_info_unittest.Tpo src/processor/$(DEPDIR)/cfi_frame_info_unittest-cfi_frame_info_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/cfi_frame_info_unittest.cc' object='src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_cfi_frame_info_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.o `test -f 'src/processor/cfi_frame_info_unittest.cc' || echo '$(srcdir)/'`src/processor/cfi_frame_info_unittest.cc + +src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.obj: src/processor/cfi_frame_info_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_cfi_frame_info_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/cfi_frame_info_unittest-cfi_frame_info_unittest.Tpo -c -o src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.obj `if test -f 'src/processor/cfi_frame_info_unittest.cc'; then $(CYGPATH_W) 'src/processor/cfi_frame_info_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/cfi_frame_info_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/cfi_frame_info_unittest-cfi_frame_info_unittest.Tpo src/processor/$(DEPDIR)/cfi_frame_info_unittest-cfi_frame_info_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/cfi_frame_info_unittest.cc' object='src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_cfi_frame_info_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/cfi_frame_info_unittest-cfi_frame_info_unittest.obj `if test -f 'src/processor/cfi_frame_info_unittest.cc'; then $(CYGPATH_W) 'src/processor/cfi_frame_info_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/cfi_frame_info_unittest.cc'; fi` + +src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.o: src/processor/disassembler_objdump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_disassembler_objdump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/disassembler_objdump_unittest-disassembler_objdump_unittest.Tpo -c -o src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.o `test -f 'src/processor/disassembler_objdump_unittest.cc' || echo '$(srcdir)/'`src/processor/disassembler_objdump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/disassembler_objdump_unittest-disassembler_objdump_unittest.Tpo src/processor/$(DEPDIR)/disassembler_objdump_unittest-disassembler_objdump_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/disassembler_objdump_unittest.cc' object='src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_disassembler_objdump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.o `test -f 'src/processor/disassembler_objdump_unittest.cc' || echo '$(srcdir)/'`src/processor/disassembler_objdump_unittest.cc + +src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.obj: src/processor/disassembler_objdump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_disassembler_objdump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/disassembler_objdump_unittest-disassembler_objdump_unittest.Tpo -c -o src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.obj `if test -f 'src/processor/disassembler_objdump_unittest.cc'; then $(CYGPATH_W) 'src/processor/disassembler_objdump_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/disassembler_objdump_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/disassembler_objdump_unittest-disassembler_objdump_unittest.Tpo src/processor/$(DEPDIR)/disassembler_objdump_unittest-disassembler_objdump_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/disassembler_objdump_unittest.cc' object='src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_disassembler_objdump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/disassembler_objdump_unittest-disassembler_objdump_unittest.obj `if test -f 'src/processor/disassembler_objdump_unittest.cc'; then $(CYGPATH_W) 'src/processor/disassembler_objdump_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/disassembler_objdump_unittest.cc'; fi` + +src/processor/disassembler_x86_unittest-disassembler_x86_unittest.o: src/processor/disassembler_x86_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_disassembler_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/disassembler_x86_unittest-disassembler_x86_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/disassembler_x86_unittest-disassembler_x86_unittest.Tpo -c -o src/processor/disassembler_x86_unittest-disassembler_x86_unittest.o `test -f 'src/processor/disassembler_x86_unittest.cc' || echo '$(srcdir)/'`src/processor/disassembler_x86_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/disassembler_x86_unittest-disassembler_x86_unittest.Tpo src/processor/$(DEPDIR)/disassembler_x86_unittest-disassembler_x86_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/disassembler_x86_unittest.cc' object='src/processor/disassembler_x86_unittest-disassembler_x86_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_disassembler_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/disassembler_x86_unittest-disassembler_x86_unittest.o `test -f 'src/processor/disassembler_x86_unittest.cc' || echo '$(srcdir)/'`src/processor/disassembler_x86_unittest.cc + +src/processor/disassembler_x86_unittest-disassembler_x86_unittest.obj: src/processor/disassembler_x86_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_disassembler_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/disassembler_x86_unittest-disassembler_x86_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/disassembler_x86_unittest-disassembler_x86_unittest.Tpo -c -o src/processor/disassembler_x86_unittest-disassembler_x86_unittest.obj `if test -f 'src/processor/disassembler_x86_unittest.cc'; then $(CYGPATH_W) 'src/processor/disassembler_x86_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/disassembler_x86_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/disassembler_x86_unittest-disassembler_x86_unittest.Tpo src/processor/$(DEPDIR)/disassembler_x86_unittest-disassembler_x86_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/disassembler_x86_unittest.cc' object='src/processor/disassembler_x86_unittest-disassembler_x86_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_disassembler_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/disassembler_x86_unittest-disassembler_x86_unittest.obj `if test -f 'src/processor/disassembler_x86_unittest.cc'; then $(CYGPATH_W) 'src/processor/disassembler_x86_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/disassembler_x86_unittest.cc'; fi` + +src/processor/exploitability_unittest-exploitability_unittest.o: src/processor/exploitability_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_exploitability_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/exploitability_unittest-exploitability_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/exploitability_unittest-exploitability_unittest.Tpo -c -o src/processor/exploitability_unittest-exploitability_unittest.o `test -f 'src/processor/exploitability_unittest.cc' || echo '$(srcdir)/'`src/processor/exploitability_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/exploitability_unittest-exploitability_unittest.Tpo src/processor/$(DEPDIR)/exploitability_unittest-exploitability_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/exploitability_unittest.cc' object='src/processor/exploitability_unittest-exploitability_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_exploitability_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/exploitability_unittest-exploitability_unittest.o `test -f 'src/processor/exploitability_unittest.cc' || echo '$(srcdir)/'`src/processor/exploitability_unittest.cc + +src/processor/exploitability_unittest-exploitability_unittest.obj: src/processor/exploitability_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_exploitability_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/exploitability_unittest-exploitability_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/exploitability_unittest-exploitability_unittest.Tpo -c -o src/processor/exploitability_unittest-exploitability_unittest.obj `if test -f 'src/processor/exploitability_unittest.cc'; then $(CYGPATH_W) 'src/processor/exploitability_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/exploitability_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/exploitability_unittest-exploitability_unittest.Tpo src/processor/$(DEPDIR)/exploitability_unittest-exploitability_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/exploitability_unittest.cc' object='src/processor/exploitability_unittest-exploitability_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_exploitability_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/exploitability_unittest-exploitability_unittest.obj `if test -f 'src/processor/exploitability_unittest.cc'; then $(CYGPATH_W) 'src/processor/exploitability_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/exploitability_unittest.cc'; fi` + +src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.o: src/processor/fast_source_line_resolver_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_fast_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.Tpo -c -o src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.o `test -f 'src/processor/fast_source_line_resolver_unittest.cc' || echo '$(srcdir)/'`src/processor/fast_source_line_resolver_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.Tpo src/processor/$(DEPDIR)/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/fast_source_line_resolver_unittest.cc' object='src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_fast_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.o `test -f 'src/processor/fast_source_line_resolver_unittest.cc' || echo '$(srcdir)/'`src/processor/fast_source_line_resolver_unittest.cc + +src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.obj: src/processor/fast_source_line_resolver_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_fast_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.Tpo -c -o src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.obj `if test -f 'src/processor/fast_source_line_resolver_unittest.cc'; then $(CYGPATH_W) 'src/processor/fast_source_line_resolver_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/fast_source_line_resolver_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.Tpo src/processor/$(DEPDIR)/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/fast_source_line_resolver_unittest.cc' object='src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_fast_source_line_resolver_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.obj `if test -f 'src/processor/fast_source_line_resolver_unittest.cc'; then $(CYGPATH_W) 'src/processor/fast_source_line_resolver_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/fast_source_line_resolver_unittest.cc'; fi` + +src/processor/map_serializers_unittest-map_serializers_unittest.o: src/processor/map_serializers_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/map_serializers_unittest-map_serializers_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/map_serializers_unittest-map_serializers_unittest.Tpo -c -o src/processor/map_serializers_unittest-map_serializers_unittest.o `test -f 'src/processor/map_serializers_unittest.cc' || echo '$(srcdir)/'`src/processor/map_serializers_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/map_serializers_unittest-map_serializers_unittest.Tpo src/processor/$(DEPDIR)/map_serializers_unittest-map_serializers_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/map_serializers_unittest.cc' object='src/processor/map_serializers_unittest-map_serializers_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/map_serializers_unittest-map_serializers_unittest.o `test -f 'src/processor/map_serializers_unittest.cc' || echo '$(srcdir)/'`src/processor/map_serializers_unittest.cc + +src/processor/map_serializers_unittest-map_serializers_unittest.obj: src/processor/map_serializers_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/map_serializers_unittest-map_serializers_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/map_serializers_unittest-map_serializers_unittest.Tpo -c -o src/processor/map_serializers_unittest-map_serializers_unittest.obj `if test -f 'src/processor/map_serializers_unittest.cc'; then $(CYGPATH_W) 'src/processor/map_serializers_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/map_serializers_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/map_serializers_unittest-map_serializers_unittest.Tpo src/processor/$(DEPDIR)/map_serializers_unittest-map_serializers_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/map_serializers_unittest.cc' object='src/processor/map_serializers_unittest-map_serializers_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_map_serializers_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/map_serializers_unittest-map_serializers_unittest.obj `if test -f 'src/processor/map_serializers_unittest.cc'; then $(CYGPATH_W) 'src/processor/map_serializers_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/map_serializers_unittest.cc'; fi` + +src/processor/microdump_processor_unittest-microdump_processor_unittest.o: src/processor/microdump_processor_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_microdump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/microdump_processor_unittest-microdump_processor_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/microdump_processor_unittest-microdump_processor_unittest.Tpo -c -o src/processor/microdump_processor_unittest-microdump_processor_unittest.o `test -f 'src/processor/microdump_processor_unittest.cc' || echo '$(srcdir)/'`src/processor/microdump_processor_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/microdump_processor_unittest-microdump_processor_unittest.Tpo src/processor/$(DEPDIR)/microdump_processor_unittest-microdump_processor_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/microdump_processor_unittest.cc' object='src/processor/microdump_processor_unittest-microdump_processor_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_microdump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/microdump_processor_unittest-microdump_processor_unittest.o `test -f 'src/processor/microdump_processor_unittest.cc' || echo '$(srcdir)/'`src/processor/microdump_processor_unittest.cc + +src/processor/microdump_processor_unittest-microdump_processor_unittest.obj: src/processor/microdump_processor_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_microdump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/microdump_processor_unittest-microdump_processor_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/microdump_processor_unittest-microdump_processor_unittest.Tpo -c -o src/processor/microdump_processor_unittest-microdump_processor_unittest.obj `if test -f 'src/processor/microdump_processor_unittest.cc'; then $(CYGPATH_W) 'src/processor/microdump_processor_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/microdump_processor_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/microdump_processor_unittest-microdump_processor_unittest.Tpo src/processor/$(DEPDIR)/microdump_processor_unittest-microdump_processor_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/microdump_processor_unittest.cc' object='src/processor/microdump_processor_unittest-microdump_processor_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_microdump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/microdump_processor_unittest-microdump_processor_unittest.obj `if test -f 'src/processor/microdump_processor_unittest.cc'; then $(CYGPATH_W) 'src/processor/microdump_processor_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/microdump_processor_unittest.cc'; fi` + +src/processor/minidump_processor_unittest-minidump_processor_unittest.o: src/processor/minidump_processor_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/minidump_processor_unittest-minidump_processor_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/minidump_processor_unittest-minidump_processor_unittest.Tpo -c -o src/processor/minidump_processor_unittest-minidump_processor_unittest.o `test -f 'src/processor/minidump_processor_unittest.cc' || echo '$(srcdir)/'`src/processor/minidump_processor_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/minidump_processor_unittest-minidump_processor_unittest.Tpo src/processor/$(DEPDIR)/minidump_processor_unittest-minidump_processor_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/minidump_processor_unittest.cc' object='src/processor/minidump_processor_unittest-minidump_processor_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/minidump_processor_unittest-minidump_processor_unittest.o `test -f 'src/processor/minidump_processor_unittest.cc' || echo '$(srcdir)/'`src/processor/minidump_processor_unittest.cc + +src/processor/minidump_processor_unittest-minidump_processor_unittest.obj: src/processor/minidump_processor_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/minidump_processor_unittest-minidump_processor_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/minidump_processor_unittest-minidump_processor_unittest.Tpo -c -o src/processor/minidump_processor_unittest-minidump_processor_unittest.obj `if test -f 'src/processor/minidump_processor_unittest.cc'; then $(CYGPATH_W) 'src/processor/minidump_processor_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/minidump_processor_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/minidump_processor_unittest-minidump_processor_unittest.Tpo src/processor/$(DEPDIR)/minidump_processor_unittest-minidump_processor_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/minidump_processor_unittest.cc' object='src/processor/minidump_processor_unittest-minidump_processor_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/minidump_processor_unittest-minidump_processor_unittest.obj `if test -f 'src/processor/minidump_processor_unittest.cc'; then $(CYGPATH_W) 'src/processor/minidump_processor_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/minidump_processor_unittest.cc'; fi` + +src/common/processor_minidump_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_minidump_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_minidump_unittest-test_assembler.Tpo -c -o src/common/processor_minidump_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_minidump_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_minidump_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_minidump_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_minidump_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_minidump_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_minidump_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_minidump_unittest-test_assembler.Tpo -c -o src/common/processor_minidump_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_minidump_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_minidump_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_minidump_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_minidump_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/minidump_unittest-minidump_unittest.o: src/processor/minidump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/minidump_unittest-minidump_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/minidump_unittest-minidump_unittest.Tpo -c -o src/processor/minidump_unittest-minidump_unittest.o `test -f 'src/processor/minidump_unittest.cc' || echo '$(srcdir)/'`src/processor/minidump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/minidump_unittest-minidump_unittest.Tpo src/processor/$(DEPDIR)/minidump_unittest-minidump_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/minidump_unittest.cc' object='src/processor/minidump_unittest-minidump_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/minidump_unittest-minidump_unittest.o `test -f 'src/processor/minidump_unittest.cc' || echo '$(srcdir)/'`src/processor/minidump_unittest.cc + +src/processor/minidump_unittest-minidump_unittest.obj: src/processor/minidump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/minidump_unittest-minidump_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/minidump_unittest-minidump_unittest.Tpo -c -o src/processor/minidump_unittest-minidump_unittest.obj `if test -f 'src/processor/minidump_unittest.cc'; then $(CYGPATH_W) 'src/processor/minidump_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/minidump_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/minidump_unittest-minidump_unittest.Tpo src/processor/$(DEPDIR)/minidump_unittest-minidump_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/minidump_unittest.cc' object='src/processor/minidump_unittest-minidump_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/minidump_unittest-minidump_unittest.obj `if test -f 'src/processor/minidump_unittest.cc'; then $(CYGPATH_W) 'src/processor/minidump_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/minidump_unittest.cc'; fi` + +src/processor/minidump_unittest-synth_minidump.o: src/processor/synth_minidump.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/minidump_unittest-synth_minidump.o -MD -MP -MF src/processor/$(DEPDIR)/minidump_unittest-synth_minidump.Tpo -c -o src/processor/minidump_unittest-synth_minidump.o `test -f 'src/processor/synth_minidump.cc' || echo '$(srcdir)/'`src/processor/synth_minidump.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/minidump_unittest-synth_minidump.Tpo src/processor/$(DEPDIR)/minidump_unittest-synth_minidump.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/synth_minidump.cc' object='src/processor/minidump_unittest-synth_minidump.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/minidump_unittest-synth_minidump.o `test -f 'src/processor/synth_minidump.cc' || echo '$(srcdir)/'`src/processor/synth_minidump.cc + +src/processor/minidump_unittest-synth_minidump.obj: src/processor/synth_minidump.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/minidump_unittest-synth_minidump.obj -MD -MP -MF src/processor/$(DEPDIR)/minidump_unittest-synth_minidump.Tpo -c -o src/processor/minidump_unittest-synth_minidump.obj `if test -f 'src/processor/synth_minidump.cc'; then $(CYGPATH_W) 'src/processor/synth_minidump.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/synth_minidump.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/minidump_unittest-synth_minidump.Tpo src/processor/$(DEPDIR)/minidump_unittest-synth_minidump.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/synth_minidump.cc' object='src/processor/minidump_unittest-synth_minidump.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/minidump_unittest-synth_minidump.obj `if test -f 'src/processor/synth_minidump.cc'; then $(CYGPATH_W) 'src/processor/synth_minidump.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/synth_minidump.cc'; fi` + +src/processor/proc_maps_linux_unittest-proc_maps_linux.o: src/processor/proc_maps_linux.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/proc_maps_linux_unittest-proc_maps_linux.o -MD -MP -MF src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux.Tpo -c -o src/processor/proc_maps_linux_unittest-proc_maps_linux.o `test -f 'src/processor/proc_maps_linux.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux.Tpo src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux.cc' object='src/processor/proc_maps_linux_unittest-proc_maps_linux.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/proc_maps_linux_unittest-proc_maps_linux.o `test -f 'src/processor/proc_maps_linux.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux.cc + +src/processor/proc_maps_linux_unittest-proc_maps_linux.obj: src/processor/proc_maps_linux.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/proc_maps_linux_unittest-proc_maps_linux.obj -MD -MP -MF src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux.Tpo -c -o src/processor/proc_maps_linux_unittest-proc_maps_linux.obj `if test -f 'src/processor/proc_maps_linux.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux.Tpo src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux.cc' object='src/processor/proc_maps_linux_unittest-proc_maps_linux.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/proc_maps_linux_unittest-proc_maps_linux.obj `if test -f 'src/processor/proc_maps_linux.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux.cc'; fi` + +src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.o: src/processor/proc_maps_linux_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux_unittest.Tpo -c -o src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.o `test -f 'src/processor/proc_maps_linux_unittest.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux_unittest.Tpo src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux_unittest.cc' object='src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.o `test -f 'src/processor/proc_maps_linux_unittest.cc' || echo '$(srcdir)/'`src/processor/proc_maps_linux_unittest.cc + +src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.obj: src/processor/proc_maps_linux_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux_unittest.Tpo -c -o src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.obj `if test -f 'src/processor/proc_maps_linux_unittest.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux_unittest.Tpo src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/proc_maps_linux_unittest.cc' object='src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_proc_maps_linux_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/proc_maps_linux_unittest-proc_maps_linux_unittest.obj `if test -f 'src/processor/proc_maps_linux_unittest.cc'; then $(CYGPATH_W) 'src/processor/proc_maps_linux_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/proc_maps_linux_unittest.cc'; fi` + +src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.o: src/processor/range_map_truncate_lower_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_range_map_truncate_lower_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.Tpo -c -o src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.o `test -f 'src/processor/range_map_truncate_lower_unittest.cc' || echo '$(srcdir)/'`src/processor/range_map_truncate_lower_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.Tpo src/processor/$(DEPDIR)/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/range_map_truncate_lower_unittest.cc' object='src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_range_map_truncate_lower_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.o `test -f 'src/processor/range_map_truncate_lower_unittest.cc' || echo '$(srcdir)/'`src/processor/range_map_truncate_lower_unittest.cc + +src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.obj: src/processor/range_map_truncate_lower_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_range_map_truncate_lower_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.Tpo -c -o src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.obj `if test -f 'src/processor/range_map_truncate_lower_unittest.cc'; then $(CYGPATH_W) 'src/processor/range_map_truncate_lower_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/range_map_truncate_lower_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.Tpo src/processor/$(DEPDIR)/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/range_map_truncate_lower_unittest.cc' object='src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_range_map_truncate_lower_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.obj `if test -f 'src/processor/range_map_truncate_lower_unittest.cc'; then $(CYGPATH_W) 'src/processor/range_map_truncate_lower_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/range_map_truncate_lower_unittest.cc'; fi` + +src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.o: src/processor/range_map_truncate_upper_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_range_map_truncate_upper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.Tpo -c -o src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.o `test -f 'src/processor/range_map_truncate_upper_unittest.cc' || echo '$(srcdir)/'`src/processor/range_map_truncate_upper_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.Tpo src/processor/$(DEPDIR)/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/range_map_truncate_upper_unittest.cc' object='src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_range_map_truncate_upper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.o `test -f 'src/processor/range_map_truncate_upper_unittest.cc' || echo '$(srcdir)/'`src/processor/range_map_truncate_upper_unittest.cc + +src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.obj: src/processor/range_map_truncate_upper_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_range_map_truncate_upper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.Tpo -c -o src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.obj `if test -f 'src/processor/range_map_truncate_upper_unittest.cc'; then $(CYGPATH_W) 'src/processor/range_map_truncate_upper_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/range_map_truncate_upper_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.Tpo src/processor/$(DEPDIR)/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/range_map_truncate_upper_unittest.cc' object='src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_range_map_truncate_upper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.obj `if test -f 'src/processor/range_map_truncate_upper_unittest.cc'; then $(CYGPATH_W) 'src/processor/range_map_truncate_upper_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/range_map_truncate_upper_unittest.cc'; fi` + +src/common/processor_stackwalker_address_list_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_address_list_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_address_list_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_address_list_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_address_list_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_address_list_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_address_list_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_address_list_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_address_list_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_address_list_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_stackwalker_address_list_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_address_list_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_address_list_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_address_list_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_address_list_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_address_list_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_address_list_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_address_list_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_address_list_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_address_list_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.o: src/processor/stackwalker_address_list_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_address_list_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_address_list_unittest-stackwalker_address_list_unittest.Tpo -c -o src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.o `test -f 'src/processor/stackwalker_address_list_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_address_list_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_address_list_unittest-stackwalker_address_list_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_address_list_unittest-stackwalker_address_list_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_address_list_unittest.cc' object='src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_address_list_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.o `test -f 'src/processor/stackwalker_address_list_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_address_list_unittest.cc + +src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.obj: src/processor/stackwalker_address_list_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_address_list_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_address_list_unittest-stackwalker_address_list_unittest.Tpo -c -o src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.obj `if test -f 'src/processor/stackwalker_address_list_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_address_list_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_address_list_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_address_list_unittest-stackwalker_address_list_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_address_list_unittest-stackwalker_address_list_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_address_list_unittest.cc' object='src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_address_list_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_address_list_unittest-stackwalker_address_list_unittest.obj `if test -f 'src/processor/stackwalker_address_list_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_address_list_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_address_list_unittest.cc'; fi` + +src/common/processor_stackwalker_amd64_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_amd64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_amd64_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_amd64_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_amd64_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_amd64_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_amd64_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_amd64_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_amd64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_amd64_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_stackwalker_amd64_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_amd64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_amd64_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_amd64_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_amd64_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_amd64_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_amd64_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_amd64_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_amd64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_amd64_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.o: src/processor/stackwalker_amd64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_amd64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_amd64_unittest-stackwalker_amd64_unittest.Tpo -c -o src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.o `test -f 'src/processor/stackwalker_amd64_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_amd64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_amd64_unittest-stackwalker_amd64_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_amd64_unittest-stackwalker_amd64_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_amd64_unittest.cc' object='src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_amd64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.o `test -f 'src/processor/stackwalker_amd64_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_amd64_unittest.cc + +src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.obj: src/processor/stackwalker_amd64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_amd64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_amd64_unittest-stackwalker_amd64_unittest.Tpo -c -o src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.obj `if test -f 'src/processor/stackwalker_amd64_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_amd64_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_amd64_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_amd64_unittest-stackwalker_amd64_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_amd64_unittest-stackwalker_amd64_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_amd64_unittest.cc' object='src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_amd64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_amd64_unittest-stackwalker_amd64_unittest.obj `if test -f 'src/processor/stackwalker_amd64_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_amd64_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_amd64_unittest.cc'; fi` + +src/common/processor_stackwalker_arm64_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_arm64_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_arm64_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_arm64_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_arm64_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_arm64_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_arm64_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_arm64_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_stackwalker_arm64_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_arm64_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_arm64_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_arm64_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_arm64_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_arm64_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_arm64_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_arm64_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.o: src/processor/stackwalker_arm64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_arm64_unittest-stackwalker_arm64_unittest.Tpo -c -o src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.o `test -f 'src/processor/stackwalker_arm64_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_arm64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_arm64_unittest-stackwalker_arm64_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_arm64_unittest-stackwalker_arm64_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_arm64_unittest.cc' object='src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.o `test -f 'src/processor/stackwalker_arm64_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_arm64_unittest.cc + +src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.obj: src/processor/stackwalker_arm64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_arm64_unittest-stackwalker_arm64_unittest.Tpo -c -o src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.obj `if test -f 'src/processor/stackwalker_arm64_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_arm64_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_arm64_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_arm64_unittest-stackwalker_arm64_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_arm64_unittest-stackwalker_arm64_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_arm64_unittest.cc' object='src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_arm64_unittest-stackwalker_arm64_unittest.obj `if test -f 'src/processor/stackwalker_arm64_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_arm64_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_arm64_unittest.cc'; fi` + +src/common/processor_stackwalker_arm_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_arm_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_arm_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_arm_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_arm_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_arm_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_arm_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_arm_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_stackwalker_arm_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_arm_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_arm_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_arm_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_arm_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_arm_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_arm_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_arm_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.o: src/processor/stackwalker_arm_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_arm_unittest-stackwalker_arm_unittest.Tpo -c -o src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.o `test -f 'src/processor/stackwalker_arm_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_arm_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_arm_unittest-stackwalker_arm_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_arm_unittest-stackwalker_arm_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_arm_unittest.cc' object='src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.o `test -f 'src/processor/stackwalker_arm_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_arm_unittest.cc + +src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.obj: src/processor/stackwalker_arm_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_arm_unittest-stackwalker_arm_unittest.Tpo -c -o src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.obj `if test -f 'src/processor/stackwalker_arm_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_arm_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_arm_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_arm_unittest-stackwalker_arm_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_arm_unittest-stackwalker_arm_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_arm_unittest.cc' object='src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_arm_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_arm_unittest-stackwalker_arm_unittest.obj `if test -f 'src/processor/stackwalker_arm_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_arm_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_arm_unittest.cc'; fi` + +src/common/processor_stackwalker_mips64_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_mips64_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_mips64_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_mips64_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_mips64_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_mips64_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_mips64_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_mips64_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_stackwalker_mips64_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_mips64_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_mips64_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_mips64_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_mips64_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_mips64_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_mips64_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_mips64_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.o: src/processor/stackwalker_mips64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_mips64_unittest-stackwalker_mips64_unittest.Tpo -c -o src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.o `test -f 'src/processor/stackwalker_mips64_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_mips64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_mips64_unittest-stackwalker_mips64_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_mips64_unittest-stackwalker_mips64_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_mips64_unittest.cc' object='src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.o `test -f 'src/processor/stackwalker_mips64_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_mips64_unittest.cc + +src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.obj: src/processor/stackwalker_mips64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_mips64_unittest-stackwalker_mips64_unittest.Tpo -c -o src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.obj `if test -f 'src/processor/stackwalker_mips64_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_mips64_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_mips64_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_mips64_unittest-stackwalker_mips64_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_mips64_unittest-stackwalker_mips64_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_mips64_unittest.cc' object='src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_mips64_unittest-stackwalker_mips64_unittest.obj `if test -f 'src/processor/stackwalker_mips64_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_mips64_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_mips64_unittest.cc'; fi` + +src/common/processor_stackwalker_mips_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_mips_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_mips_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_mips_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_mips_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_mips_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_mips_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_mips_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_stackwalker_mips_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_mips_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_mips_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_mips_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_mips_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_mips_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_mips_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_mips_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.o: src/processor/stackwalker_mips_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_mips_unittest-stackwalker_mips_unittest.Tpo -c -o src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.o `test -f 'src/processor/stackwalker_mips_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_mips_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_mips_unittest-stackwalker_mips_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_mips_unittest-stackwalker_mips_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_mips_unittest.cc' object='src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.o `test -f 'src/processor/stackwalker_mips_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_mips_unittest.cc + +src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.obj: src/processor/stackwalker_mips_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_mips_unittest-stackwalker_mips_unittest.Tpo -c -o src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.obj `if test -f 'src/processor/stackwalker_mips_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_mips_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_mips_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_mips_unittest-stackwalker_mips_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_mips_unittest-stackwalker_mips_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_mips_unittest.cc' object='src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_mips_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_mips_unittest-stackwalker_mips_unittest.obj `if test -f 'src/processor/stackwalker_mips_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_mips_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_mips_unittest.cc'; fi` + +src/common/processor_stackwalker_riscv64_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_riscv64_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_riscv64_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_riscv64_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_riscv64_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_riscv64_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_riscv64_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_riscv64_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_stackwalker_riscv64_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_riscv64_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_riscv64_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_riscv64_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_riscv64_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_riscv64_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_riscv64_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_riscv64_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.o: src/processor/stackwalker_riscv64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.Tpo -c -o src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.o `test -f 'src/processor/stackwalker_riscv64_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_riscv64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_riscv64_unittest.cc' object='src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.o `test -f 'src/processor/stackwalker_riscv64_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_riscv64_unittest.cc + +src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.obj: src/processor/stackwalker_riscv64_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.Tpo -c -o src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.obj `if test -f 'src/processor/stackwalker_riscv64_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_riscv64_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_riscv64_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_riscv64_unittest.cc' object='src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv64_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.obj `if test -f 'src/processor/stackwalker_riscv64_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_riscv64_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_riscv64_unittest.cc'; fi` + +src/common/processor_stackwalker_riscv_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_riscv_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_riscv_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_riscv_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_riscv_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_riscv_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_riscv_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_riscv_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_stackwalker_riscv_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_riscv_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_riscv_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_riscv_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_riscv_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_riscv_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_riscv_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_riscv_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.o: src/processor/stackwalker_riscv_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_riscv_unittest-stackwalker_riscv_unittest.Tpo -c -o src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.o `test -f 'src/processor/stackwalker_riscv_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_riscv_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_riscv_unittest-stackwalker_riscv_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_riscv_unittest-stackwalker_riscv_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_riscv_unittest.cc' object='src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.o `test -f 'src/processor/stackwalker_riscv_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_riscv_unittest.cc + +src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.obj: src/processor/stackwalker_riscv_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_riscv_unittest-stackwalker_riscv_unittest.Tpo -c -o src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.obj `if test -f 'src/processor/stackwalker_riscv_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_riscv_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_riscv_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_riscv_unittest-stackwalker_riscv_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_riscv_unittest-stackwalker_riscv_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_riscv_unittest.cc' object='src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_riscv_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_riscv_unittest-stackwalker_riscv_unittest.obj `if test -f 'src/processor/stackwalker_riscv_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_riscv_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_riscv_unittest.cc'; fi` + +src/common/processor_stackwalker_x86_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_x86_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_x86_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_x86_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_x86_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_x86_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_x86_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_x86_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_stackwalker_x86_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_stackwalker_x86_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_stackwalker_x86_unittest-test_assembler.Tpo -c -o src/common/processor_stackwalker_x86_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_stackwalker_x86_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_stackwalker_x86_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_stackwalker_x86_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_stackwalker_x86_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.o: src/processor/stackwalker_x86_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_x86_unittest-stackwalker_x86_unittest.Tpo -c -o src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.o `test -f 'src/processor/stackwalker_x86_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_x86_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_x86_unittest-stackwalker_x86_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_x86_unittest-stackwalker_x86_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_x86_unittest.cc' object='src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.o `test -f 'src/processor/stackwalker_x86_unittest.cc' || echo '$(srcdir)/'`src/processor/stackwalker_x86_unittest.cc + +src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.obj: src/processor/stackwalker_x86_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/stackwalker_x86_unittest-stackwalker_x86_unittest.Tpo -c -o src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.obj `if test -f 'src/processor/stackwalker_x86_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_x86_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_x86_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/stackwalker_x86_unittest-stackwalker_x86_unittest.Tpo src/processor/$(DEPDIR)/stackwalker_x86_unittest-stackwalker_x86_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/stackwalker_x86_unittest.cc' object='src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_stackwalker_x86_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/stackwalker_x86_unittest-stackwalker_x86_unittest.obj `if test -f 'src/processor/stackwalker_x86_unittest.cc'; then $(CYGPATH_W) 'src/processor/stackwalker_x86_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/stackwalker_x86_unittest.cc'; fi` + +src/processor/static_address_map_unittest-static_address_map_unittest.o: src/processor/static_address_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/static_address_map_unittest-static_address_map_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/static_address_map_unittest-static_address_map_unittest.Tpo -c -o src/processor/static_address_map_unittest-static_address_map_unittest.o `test -f 'src/processor/static_address_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_address_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/static_address_map_unittest-static_address_map_unittest.Tpo src/processor/$(DEPDIR)/static_address_map_unittest-static_address_map_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/static_address_map_unittest.cc' object='src/processor/static_address_map_unittest-static_address_map_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/static_address_map_unittest-static_address_map_unittest.o `test -f 'src/processor/static_address_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_address_map_unittest.cc + +src/processor/static_address_map_unittest-static_address_map_unittest.obj: src/processor/static_address_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/static_address_map_unittest-static_address_map_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/static_address_map_unittest-static_address_map_unittest.Tpo -c -o src/processor/static_address_map_unittest-static_address_map_unittest.obj `if test -f 'src/processor/static_address_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_address_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_address_map_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/static_address_map_unittest-static_address_map_unittest.Tpo src/processor/$(DEPDIR)/static_address_map_unittest-static_address_map_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/static_address_map_unittest.cc' object='src/processor/static_address_map_unittest-static_address_map_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_address_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/static_address_map_unittest-static_address_map_unittest.obj `if test -f 'src/processor/static_address_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_address_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_address_map_unittest.cc'; fi` + +src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.o: src/processor/static_contained_range_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/static_contained_range_map_unittest-static_contained_range_map_unittest.Tpo -c -o src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.o `test -f 'src/processor/static_contained_range_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_contained_range_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/static_contained_range_map_unittest-static_contained_range_map_unittest.Tpo src/processor/$(DEPDIR)/static_contained_range_map_unittest-static_contained_range_map_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/static_contained_range_map_unittest.cc' object='src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.o `test -f 'src/processor/static_contained_range_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_contained_range_map_unittest.cc + +src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.obj: src/processor/static_contained_range_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/static_contained_range_map_unittest-static_contained_range_map_unittest.Tpo -c -o src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.obj `if test -f 'src/processor/static_contained_range_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_contained_range_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_contained_range_map_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/static_contained_range_map_unittest-static_contained_range_map_unittest.Tpo src/processor/$(DEPDIR)/static_contained_range_map_unittest-static_contained_range_map_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/static_contained_range_map_unittest.cc' object='src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_contained_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/static_contained_range_map_unittest-static_contained_range_map_unittest.obj `if test -f 'src/processor/static_contained_range_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_contained_range_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_contained_range_map_unittest.cc'; fi` + +src/processor/static_map_unittest-static_map_unittest.o: src/processor/static_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/static_map_unittest-static_map_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/static_map_unittest-static_map_unittest.Tpo -c -o src/processor/static_map_unittest-static_map_unittest.o `test -f 'src/processor/static_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/static_map_unittest-static_map_unittest.Tpo src/processor/$(DEPDIR)/static_map_unittest-static_map_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/static_map_unittest.cc' object='src/processor/static_map_unittest-static_map_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/static_map_unittest-static_map_unittest.o `test -f 'src/processor/static_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_map_unittest.cc + +src/processor/static_map_unittest-static_map_unittest.obj: src/processor/static_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/static_map_unittest-static_map_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/static_map_unittest-static_map_unittest.Tpo -c -o src/processor/static_map_unittest-static_map_unittest.obj `if test -f 'src/processor/static_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_map_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/static_map_unittest-static_map_unittest.Tpo src/processor/$(DEPDIR)/static_map_unittest-static_map_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/static_map_unittest.cc' object='src/processor/static_map_unittest-static_map_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/static_map_unittest-static_map_unittest.obj `if test -f 'src/processor/static_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_map_unittest.cc'; fi` + +src/processor/static_range_map_unittest-static_range_map_unittest.o: src/processor/static_range_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/static_range_map_unittest-static_range_map_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/static_range_map_unittest-static_range_map_unittest.Tpo -c -o src/processor/static_range_map_unittest-static_range_map_unittest.o `test -f 'src/processor/static_range_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_range_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/static_range_map_unittest-static_range_map_unittest.Tpo src/processor/$(DEPDIR)/static_range_map_unittest-static_range_map_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/static_range_map_unittest.cc' object='src/processor/static_range_map_unittest-static_range_map_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/static_range_map_unittest-static_range_map_unittest.o `test -f 'src/processor/static_range_map_unittest.cc' || echo '$(srcdir)/'`src/processor/static_range_map_unittest.cc + +src/processor/static_range_map_unittest-static_range_map_unittest.obj: src/processor/static_range_map_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/static_range_map_unittest-static_range_map_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/static_range_map_unittest-static_range_map_unittest.Tpo -c -o src/processor/static_range_map_unittest-static_range_map_unittest.obj `if test -f 'src/processor/static_range_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_range_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_range_map_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/static_range_map_unittest-static_range_map_unittest.Tpo src/processor/$(DEPDIR)/static_range_map_unittest-static_range_map_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/static_range_map_unittest.cc' object='src/processor/static_range_map_unittest-static_range_map_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_static_range_map_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/static_range_map_unittest-static_range_map_unittest.obj `if test -f 'src/processor/static_range_map_unittest.cc'; then $(CYGPATH_W) 'src/processor/static_range_map_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/static_range_map_unittest.cc'; fi` + +src/common/processor_synth_minidump_unittest-test_assembler.o: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_synth_minidump_unittest-test_assembler.o -MD -MP -MF src/common/$(DEPDIR)/processor_synth_minidump_unittest-test_assembler.Tpo -c -o src/common/processor_synth_minidump_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_synth_minidump_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_synth_minidump_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_synth_minidump_unittest-test_assembler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_synth_minidump_unittest-test_assembler.o `test -f 'src/common/test_assembler.cc' || echo '$(srcdir)/'`src/common/test_assembler.cc + +src/common/processor_synth_minidump_unittest-test_assembler.obj: src/common/test_assembler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/processor_synth_minidump_unittest-test_assembler.obj -MD -MP -MF src/common/$(DEPDIR)/processor_synth_minidump_unittest-test_assembler.Tpo -c -o src/common/processor_synth_minidump_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/processor_synth_minidump_unittest-test_assembler.Tpo src/common/$(DEPDIR)/processor_synth_minidump_unittest-test_assembler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/test_assembler.cc' object='src/common/processor_synth_minidump_unittest-test_assembler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/processor_synth_minidump_unittest-test_assembler.obj `if test -f 'src/common/test_assembler.cc'; then $(CYGPATH_W) 'src/common/test_assembler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/test_assembler.cc'; fi` + +src/processor/synth_minidump_unittest-synth_minidump_unittest.o: src/processor/synth_minidump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/synth_minidump_unittest-synth_minidump_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump_unittest.Tpo -c -o src/processor/synth_minidump_unittest-synth_minidump_unittest.o `test -f 'src/processor/synth_minidump_unittest.cc' || echo '$(srcdir)/'`src/processor/synth_minidump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump_unittest.Tpo src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/synth_minidump_unittest.cc' object='src/processor/synth_minidump_unittest-synth_minidump_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/synth_minidump_unittest-synth_minidump_unittest.o `test -f 'src/processor/synth_minidump_unittest.cc' || echo '$(srcdir)/'`src/processor/synth_minidump_unittest.cc + +src/processor/synth_minidump_unittest-synth_minidump_unittest.obj: src/processor/synth_minidump_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/synth_minidump_unittest-synth_minidump_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump_unittest.Tpo -c -o src/processor/synth_minidump_unittest-synth_minidump_unittest.obj `if test -f 'src/processor/synth_minidump_unittest.cc'; then $(CYGPATH_W) 'src/processor/synth_minidump_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/synth_minidump_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump_unittest.Tpo src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/synth_minidump_unittest.cc' object='src/processor/synth_minidump_unittest-synth_minidump_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/synth_minidump_unittest-synth_minidump_unittest.obj `if test -f 'src/processor/synth_minidump_unittest.cc'; then $(CYGPATH_W) 'src/processor/synth_minidump_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/synth_minidump_unittest.cc'; fi` + +src/processor/synth_minidump_unittest-synth_minidump.o: src/processor/synth_minidump.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/synth_minidump_unittest-synth_minidump.o -MD -MP -MF src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump.Tpo -c -o src/processor/synth_minidump_unittest-synth_minidump.o `test -f 'src/processor/synth_minidump.cc' || echo '$(srcdir)/'`src/processor/synth_minidump.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump.Tpo src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/synth_minidump.cc' object='src/processor/synth_minidump_unittest-synth_minidump.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/synth_minidump_unittest-synth_minidump.o `test -f 'src/processor/synth_minidump.cc' || echo '$(srcdir)/'`src/processor/synth_minidump.cc + +src/processor/synth_minidump_unittest-synth_minidump.obj: src/processor/synth_minidump.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/synth_minidump_unittest-synth_minidump.obj -MD -MP -MF src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump.Tpo -c -o src/processor/synth_minidump_unittest-synth_minidump.obj `if test -f 'src/processor/synth_minidump.cc'; then $(CYGPATH_W) 'src/processor/synth_minidump.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/synth_minidump.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump.Tpo src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/synth_minidump.cc' object='src/processor/synth_minidump_unittest-synth_minidump.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_synth_minidump_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/synth_minidump_unittest-synth_minidump.obj `if test -f 'src/processor/synth_minidump.cc'; then $(CYGPATH_W) 'src/processor/synth_minidump.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/synth_minidump.cc'; fi` + +src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.o: src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.o -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.o `test -f 'src/common/dwarf_cfi_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cfi_to_module.cc' object='src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.o `test -f 'src/common/dwarf_cfi_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module.cc + +src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.obj: src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.obj `if test -f 'src/common/dwarf_cfi_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cfi_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cfi_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cfi_to_module.cc' object='src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.obj `if test -f 'src/common/dwarf_cfi_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cfi_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cfi_to_module.cc'; fi` + +src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.o: src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.o -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.o `test -f 'src/common/dwarf_cu_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cu_to_module.cc' object='src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.o `test -f 'src/common/dwarf_cu_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cu_to_module.cc + +src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.obj: src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.obj `if test -f 'src/common/dwarf_cu_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cu_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cu_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cu_to_module.cc' object='src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.obj `if test -f 'src/common/dwarf_cu_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cu_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cu_to_module.cc'; fi` + +src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.o: src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.o -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.o `test -f 'src/common/dwarf_line_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_line_to_module.cc' object='src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.o `test -f 'src/common/dwarf_line_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_line_to_module.cc + +src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.obj: src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.obj `if test -f 'src/common/dwarf_line_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_line_to_module.cc' object='src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.obj `if test -f 'src/common/dwarf_line_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module.cc'; fi` + +src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.o: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.o -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc + +src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.obj: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.obj -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` + +src/common/tools_linux_dump_syms_dump_syms-language.o: src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-language.o -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-language.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-language.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-language.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/language.cc' object='src/common/tools_linux_dump_syms_dump_syms-language.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc + +src/common/tools_linux_dump_syms_dump_syms-language.obj: src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-language.obj -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-language.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-language.obj `if test -f 'src/common/language.cc'; then $(CYGPATH_W) 'src/common/language.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/language.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-language.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-language.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/language.cc' object='src/common/tools_linux_dump_syms_dump_syms-language.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-language.obj `if test -f 'src/common/language.cc'; then $(CYGPATH_W) 'src/common/language.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/language.cc'; fi` + +src/common/tools_linux_dump_syms_dump_syms-module.o: src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-module.o -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-module.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-module.o `test -f 'src/common/module.cc' || echo '$(srcdir)/'`src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-module.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/module.cc' object='src/common/tools_linux_dump_syms_dump_syms-module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-module.o `test -f 'src/common/module.cc' || echo '$(srcdir)/'`src/common/module.cc + +src/common/tools_linux_dump_syms_dump_syms-module.obj: src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-module.obj -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-module.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-module.obj `if test -f 'src/common/module.cc'; then $(CYGPATH_W) 'src/common/module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-module.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/module.cc' object='src/common/tools_linux_dump_syms_dump_syms-module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-module.obj `if test -f 'src/common/module.cc'; then $(CYGPATH_W) 'src/common/module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/module.cc'; fi` + +src/common/tools_linux_dump_syms_dump_syms-path_helper.o: src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-path_helper.o -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-path_helper.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-path_helper.o `test -f 'src/common/path_helper.cc' || echo '$(srcdir)/'`src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-path_helper.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-path_helper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/path_helper.cc' object='src/common/tools_linux_dump_syms_dump_syms-path_helper.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-path_helper.o `test -f 'src/common/path_helper.cc' || echo '$(srcdir)/'`src/common/path_helper.cc + +src/common/tools_linux_dump_syms_dump_syms-path_helper.obj: src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-path_helper.obj -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-path_helper.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-path_helper.obj `if test -f 'src/common/path_helper.cc'; then $(CYGPATH_W) 'src/common/path_helper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/path_helper.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-path_helper.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-path_helper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/path_helper.cc' object='src/common/tools_linux_dump_syms_dump_syms-path_helper.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-path_helper.obj `if test -f 'src/common/path_helper.cc'; then $(CYGPATH_W) 'src/common/path_helper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/path_helper.cc'; fi` + +src/common/tools_linux_dump_syms_dump_syms-stabs_reader.o: src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-stabs_reader.o -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_reader.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-stabs_reader.o `test -f 'src/common/stabs_reader.cc' || echo '$(srcdir)/'`src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_reader.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_reader.cc' object='src/common/tools_linux_dump_syms_dump_syms-stabs_reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-stabs_reader.o `test -f 'src/common/stabs_reader.cc' || echo '$(srcdir)/'`src/common/stabs_reader.cc + +src/common/tools_linux_dump_syms_dump_syms-stabs_reader.obj: src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-stabs_reader.obj -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_reader.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-stabs_reader.obj `if test -f 'src/common/stabs_reader.cc'; then $(CYGPATH_W) 'src/common/stabs_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_reader.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_reader.cc' object='src/common/tools_linux_dump_syms_dump_syms-stabs_reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-stabs_reader.obj `if test -f 'src/common/stabs_reader.cc'; then $(CYGPATH_W) 'src/common/stabs_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_reader.cc'; fi` + +src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.o: src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.o -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_to_module.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.o `test -f 'src/common/stabs_to_module.cc' || echo '$(srcdir)/'`src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_to_module.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_to_module.cc' object='src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.o `test -f 'src/common/stabs_to_module.cc' || echo '$(srcdir)/'`src/common/stabs_to_module.cc + +src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.obj: src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_to_module.Tpo -c -o src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.obj `if test -f 'src/common/stabs_to_module.cc'; then $(CYGPATH_W) 'src/common/stabs_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_to_module.Tpo src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_to_module.cc' object='src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_linux_dump_syms_dump_syms-stabs_to_module.obj `if test -f 'src/common/stabs_to_module.cc'; then $(CYGPATH_W) 'src/common/stabs_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_to_module.cc'; fi` + +src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.o: src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-bytereader.Tpo -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.o `test -f 'src/common/dwarf/bytereader.cc' || echo '$(srcdir)/'`src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-bytereader.Tpo src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-bytereader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/bytereader.cc' object='src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.o `test -f 'src/common/dwarf/bytereader.cc' || echo '$(srcdir)/'`src/common/dwarf/bytereader.cc + +src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.obj: src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-bytereader.Tpo -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.obj `if test -f 'src/common/dwarf/bytereader.cc'; then $(CYGPATH_W) 'src/common/dwarf/bytereader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/bytereader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-bytereader.Tpo src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-bytereader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/bytereader.cc' object='src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-bytereader.obj `if test -f 'src/common/dwarf/bytereader.cc'; then $(CYGPATH_W) 'src/common/dwarf/bytereader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/bytereader.cc'; fi` + +src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.o: src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2diehandler.Tpo -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.o `test -f 'src/common/dwarf/dwarf2diehandler.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2diehandler.Tpo src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2diehandler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2diehandler.cc' object='src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.o `test -f 'src/common/dwarf/dwarf2diehandler.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2diehandler.cc + +src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.obj: src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2diehandler.Tpo -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.obj `if test -f 'src/common/dwarf/dwarf2diehandler.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2diehandler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2diehandler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2diehandler.Tpo src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2diehandler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2diehandler.cc' object='src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2diehandler.obj `if test -f 'src/common/dwarf/dwarf2diehandler.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2diehandler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2diehandler.cc'; fi` + +src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.o: src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2reader.Tpo -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.o `test -f 'src/common/dwarf/dwarf2reader.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2reader.Tpo src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader.cc' object='src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.o `test -f 'src/common/dwarf/dwarf2reader.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader.cc + +src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.obj: src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2reader.Tpo -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.obj `if test -f 'src/common/dwarf/dwarf2reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2reader.Tpo src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader.cc' object='src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-dwarf2reader.obj `if test -f 'src/common/dwarf/dwarf2reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader.cc'; fi` + +src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.o: src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_reader.Tpo -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.o `test -f 'src/common/dwarf/elf_reader.cc' || echo '$(srcdir)/'`src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_reader.Tpo src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/elf_reader.cc' object='src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.o `test -f 'src/common/dwarf/elf_reader.cc' || echo '$(srcdir)/'`src/common/dwarf/elf_reader.cc + +src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.obj: src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_reader.Tpo -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.obj `if test -f 'src/common/dwarf/elf_reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/elf_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/elf_reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_reader.Tpo src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/elf_reader.cc' object='src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_linux_dump_syms_dump_syms-elf_reader.obj `if test -f 'src/common/dwarf/elf_reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/elf_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/elf_reader.cc'; fi` + +src/common/linux/tools_linux_dump_syms_dump_syms-crc32.o: src/common/linux/crc32.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-crc32.o -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-crc32.o `test -f 'src/common/linux/crc32.cc' || echo '$(srcdir)/'`src/common/linux/crc32.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/crc32.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-crc32.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-crc32.o `test -f 'src/common/linux/crc32.cc' || echo '$(srcdir)/'`src/common/linux/crc32.cc + +src/common/linux/tools_linux_dump_syms_dump_syms-crc32.obj: src/common/linux/crc32.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-crc32.obj -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-crc32.obj `if test -f 'src/common/linux/crc32.cc'; then $(CYGPATH_W) 'src/common/linux/crc32.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/crc32.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/crc32.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-crc32.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-crc32.obj `if test -f 'src/common/linux/crc32.cc'; then $(CYGPATH_W) 'src/common/linux/crc32.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/crc32.cc'; fi` + +src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.o: src/common/linux/dump_symbols.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.o -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dump_symbols.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.o `test -f 'src/common/linux/dump_symbols.cc' || echo '$(srcdir)/'`src/common/linux/dump_symbols.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dump_symbols.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dump_symbols.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/dump_symbols.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.o `test -f 'src/common/linux/dump_symbols.cc' || echo '$(srcdir)/'`src/common/linux/dump_symbols.cc + +src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.obj: src/common/linux/dump_symbols.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.obj -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dump_symbols.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.obj `if test -f 'src/common/linux/dump_symbols.cc'; then $(CYGPATH_W) 'src/common/linux/dump_symbols.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/dump_symbols.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dump_symbols.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dump_symbols.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/dump_symbols.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-dump_symbols.obj `if test -f 'src/common/linux/dump_symbols.cc'; then $(CYGPATH_W) 'src/common/linux/dump_symbols.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/dump_symbols.cc'; fi` + +src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.o: src/common/linux/elf_symbols_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.o -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.o `test -f 'src/common/linux/elf_symbols_to_module.cc' || echo '$(srcdir)/'`src/common/linux/elf_symbols_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_symbols_to_module.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.o `test -f 'src/common/linux/elf_symbols_to_module.cc' || echo '$(srcdir)/'`src/common/linux/elf_symbols_to_module.cc + +src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.obj: src/common/linux/elf_symbols_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.obj -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.obj `if test -f 'src/common/linux/elf_symbols_to_module.cc'; then $(CYGPATH_W) 'src/common/linux/elf_symbols_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_symbols_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elf_symbols_to_module.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.obj `if test -f 'src/common/linux/elf_symbols_to_module.cc'; then $(CYGPATH_W) 'src/common/linux/elf_symbols_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elf_symbols_to_module.cc'; fi` + +src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.o: src/common/linux/elfutils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.o -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elfutils.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.o `test -f 'src/common/linux/elfutils.cc' || echo '$(srcdir)/'`src/common/linux/elfutils.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elfutils.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elfutils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elfutils.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.o `test -f 'src/common/linux/elfutils.cc' || echo '$(srcdir)/'`src/common/linux/elfutils.cc + +src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.obj: src/common/linux/elfutils.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.obj -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elfutils.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.obj `if test -f 'src/common/linux/elfutils.cc'; then $(CYGPATH_W) 'src/common/linux/elfutils.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elfutils.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elfutils.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elfutils.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/elfutils.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-elfutils.obj `if test -f 'src/common/linux/elfutils.cc'; then $(CYGPATH_W) 'src/common/linux/elfutils.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/elfutils.cc'; fi` + +src/common/linux/tools_linux_dump_syms_dump_syms-file_id.o: src/common/linux/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-file_id.o -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-file_id.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-file_id.o `test -f 'src/common/linux/file_id.cc' || echo '$(srcdir)/'`src/common/linux/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-file_id.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-file_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/file_id.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-file_id.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-file_id.o `test -f 'src/common/linux/file_id.cc' || echo '$(srcdir)/'`src/common/linux/file_id.cc + +src/common/linux/tools_linux_dump_syms_dump_syms-file_id.obj: src/common/linux/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-file_id.obj -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-file_id.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-file_id.obj `if test -f 'src/common/linux/file_id.cc'; then $(CYGPATH_W) 'src/common/linux/file_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/file_id.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-file_id.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-file_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/file_id.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-file_id.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-file_id.obj `if test -f 'src/common/linux/file_id.cc'; then $(CYGPATH_W) 'src/common/linux/file_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/file_id.cc'; fi` + +src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.o: src/common/linux/linux_libc_support.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.o -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-linux_libc_support.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.o `test -f 'src/common/linux/linux_libc_support.cc' || echo '$(srcdir)/'`src/common/linux/linux_libc_support.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-linux_libc_support.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-linux_libc_support.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/linux_libc_support.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.o `test -f 'src/common/linux/linux_libc_support.cc' || echo '$(srcdir)/'`src/common/linux/linux_libc_support.cc + +src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.obj: src/common/linux/linux_libc_support.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.obj -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-linux_libc_support.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.obj `if test -f 'src/common/linux/linux_libc_support.cc'; then $(CYGPATH_W) 'src/common/linux/linux_libc_support.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/linux_libc_support.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-linux_libc_support.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-linux_libc_support.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/linux_libc_support.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-linux_libc_support.obj `if test -f 'src/common/linux/linux_libc_support.cc'; then $(CYGPATH_W) 'src/common/linux/linux_libc_support.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/linux_libc_support.cc'; fi` + +src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.o: src/common/linux/memory_mapped_file.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.o -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-memory_mapped_file.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.o `test -f 'src/common/linux/memory_mapped_file.cc' || echo '$(srcdir)/'`src/common/linux/memory_mapped_file.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-memory_mapped_file.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-memory_mapped_file.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/memory_mapped_file.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.o `test -f 'src/common/linux/memory_mapped_file.cc' || echo '$(srcdir)/'`src/common/linux/memory_mapped_file.cc + +src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.obj: src/common/linux/memory_mapped_file.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.obj -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-memory_mapped_file.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.obj `if test -f 'src/common/linux/memory_mapped_file.cc'; then $(CYGPATH_W) 'src/common/linux/memory_mapped_file.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/memory_mapped_file.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-memory_mapped_file.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-memory_mapped_file.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/memory_mapped_file.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-memory_mapped_file.obj `if test -f 'src/common/linux/memory_mapped_file.cc'; then $(CYGPATH_W) 'src/common/linux/memory_mapped_file.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/memory_mapped_file.cc'; fi` + +src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.o: src/common/linux/safe_readlink.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.o -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-safe_readlink.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.o `test -f 'src/common/linux/safe_readlink.cc' || echo '$(srcdir)/'`src/common/linux/safe_readlink.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-safe_readlink.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-safe_readlink.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/safe_readlink.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.o `test -f 'src/common/linux/safe_readlink.cc' || echo '$(srcdir)/'`src/common/linux/safe_readlink.cc + +src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.obj: src/common/linux/safe_readlink.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.obj -MD -MP -MF src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-safe_readlink.Tpo -c -o src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.obj `if test -f 'src/common/linux/safe_readlink.cc'; then $(CYGPATH_W) 'src/common/linux/safe_readlink.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/safe_readlink.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-safe_readlink.Tpo src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-safe_readlink.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/linux/safe_readlink.cc' object='src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/tools_linux_dump_syms_dump_syms-safe_readlink.obj `if test -f 'src/common/linux/safe_readlink.cc'; then $(CYGPATH_W) 'src/common/linux/safe_readlink.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/safe_readlink.cc'; fi` + +src/tools/linux/dump_syms/dump_syms-dump_syms.o: src/tools/linux/dump_syms/dump_syms.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/tools/linux/dump_syms/dump_syms-dump_syms.o -MD -MP -MF src/tools/linux/dump_syms/$(DEPDIR)/dump_syms-dump_syms.Tpo -c -o src/tools/linux/dump_syms/dump_syms-dump_syms.o `test -f 'src/tools/linux/dump_syms/dump_syms.cc' || echo '$(srcdir)/'`src/tools/linux/dump_syms/dump_syms.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tools/linux/dump_syms/$(DEPDIR)/dump_syms-dump_syms.Tpo src/tools/linux/dump_syms/$(DEPDIR)/dump_syms-dump_syms.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tools/linux/dump_syms/dump_syms.cc' object='src/tools/linux/dump_syms/dump_syms-dump_syms.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/tools/linux/dump_syms/dump_syms-dump_syms.o `test -f 'src/tools/linux/dump_syms/dump_syms.cc' || echo '$(srcdir)/'`src/tools/linux/dump_syms/dump_syms.cc + +src/tools/linux/dump_syms/dump_syms-dump_syms.obj: src/tools/linux/dump_syms/dump_syms.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/tools/linux/dump_syms/dump_syms-dump_syms.obj -MD -MP -MF src/tools/linux/dump_syms/$(DEPDIR)/dump_syms-dump_syms.Tpo -c -o src/tools/linux/dump_syms/dump_syms-dump_syms.obj `if test -f 'src/tools/linux/dump_syms/dump_syms.cc'; then $(CYGPATH_W) 'src/tools/linux/dump_syms/dump_syms.cc'; else $(CYGPATH_W) '$(srcdir)/src/tools/linux/dump_syms/dump_syms.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tools/linux/dump_syms/$(DEPDIR)/dump_syms-dump_syms.Tpo src/tools/linux/dump_syms/$(DEPDIR)/dump_syms-dump_syms.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tools/linux/dump_syms/dump_syms.cc' object='src/tools/linux/dump_syms/dump_syms-dump_syms.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/tools/linux/dump_syms/dump_syms-dump_syms.obj `if test -f 'src/tools/linux/dump_syms/dump_syms.cc'; then $(CYGPATH_W) 'src/tools/linux/dump_syms/dump_syms.cc'; else $(CYGPATH_W) '$(srcdir)/src/tools/linux/dump_syms/dump_syms.cc'; fi` + +src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.o: src/tools/linux/md2core/minidump_memory_range_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.o -MD -MP -MF src/tools/linux/md2core/$(DEPDIR)/minidump_2_core_unittest-minidump_memory_range_unittest.Tpo -c -o src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.o `test -f 'src/tools/linux/md2core/minidump_memory_range_unittest.cc' || echo '$(srcdir)/'`src/tools/linux/md2core/minidump_memory_range_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tools/linux/md2core/$(DEPDIR)/minidump_2_core_unittest-minidump_memory_range_unittest.Tpo src/tools/linux/md2core/$(DEPDIR)/minidump_2_core_unittest-minidump_memory_range_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tools/linux/md2core/minidump_memory_range_unittest.cc' object='src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.o `test -f 'src/tools/linux/md2core/minidump_memory_range_unittest.cc' || echo '$(srcdir)/'`src/tools/linux/md2core/minidump_memory_range_unittest.cc + +src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.obj: src/tools/linux/md2core/minidump_memory_range_unittest.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.obj -MD -MP -MF src/tools/linux/md2core/$(DEPDIR)/minidump_2_core_unittest-minidump_memory_range_unittest.Tpo -c -o src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.obj `if test -f 'src/tools/linux/md2core/minidump_memory_range_unittest.cc'; then $(CYGPATH_W) 'src/tools/linux/md2core/minidump_memory_range_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/tools/linux/md2core/minidump_memory_range_unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tools/linux/md2core/$(DEPDIR)/minidump_2_core_unittest-minidump_memory_range_unittest.Tpo src/tools/linux/md2core/$(DEPDIR)/minidump_2_core_unittest-minidump_memory_range_unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tools/linux/md2core/minidump_memory_range_unittest.cc' object='src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tools/linux/md2core/minidump_2_core_unittest-minidump_memory_range_unittest.obj `if test -f 'src/tools/linux/md2core/minidump_memory_range_unittest.cc'; then $(CYGPATH_W) 'src/tools/linux/md2core/minidump_memory_range_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/tools/linux/md2core/minidump_memory_range_unittest.cc'; fi` + +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.o: src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.o -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.o `test -f 'src/common/dwarf_cfi_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cfi_to_module.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.o `test -f 'src/common/dwarf_cfi_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cfi_to_module.cc + +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.obj: src/common/dwarf_cfi_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.obj `if test -f 'src/common/dwarf_cfi_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cfi_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cfi_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cfi_to_module.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.obj `if test -f 'src/common/dwarf_cfi_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cfi_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cfi_to_module.cc'; fi` + +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.o: src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.o -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.o `test -f 'src/common/dwarf_cu_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cu_to_module.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.o `test -f 'src/common/dwarf_cu_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_cu_to_module.cc + +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.obj: src/common/dwarf_cu_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.obj `if test -f 'src/common/dwarf_cu_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cu_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cu_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_cu_to_module.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.obj `if test -f 'src/common/dwarf_cu_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_cu_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_cu_to_module.cc'; fi` + +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.o: src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.o -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.o `test -f 'src/common/dwarf_line_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_line_to_module.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.o `test -f 'src/common/dwarf_line_to_module.cc' || echo '$(srcdir)/'`src/common/dwarf_line_to_module.cc + +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.obj: src/common/dwarf_line_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.obj `if test -f 'src/common/dwarf_line_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_line_to_module.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.obj `if test -f 'src/common/dwarf_line_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module.cc'; fi` + +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.o: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.o -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc + +src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.obj: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.obj -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` + +src/common/tools_mac_dump_syms_dump_syms_mac-language.o: src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-language.o -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-language.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-language.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-language.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/language.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-language.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc + +src/common/tools_mac_dump_syms_dump_syms_mac-language.obj: src/common/language.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-language.obj -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-language.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-language.obj `if test -f 'src/common/language.cc'; then $(CYGPATH_W) 'src/common/language.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/language.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-language.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-language.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/language.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-language.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-language.obj `if test -f 'src/common/language.cc'; then $(CYGPATH_W) 'src/common/language.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/language.cc'; fi` + +src/common/tools_mac_dump_syms_dump_syms_mac-md5.o: src/common/md5.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-md5.o -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-md5.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-md5.o `test -f 'src/common/md5.cc' || echo '$(srcdir)/'`src/common/md5.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-md5.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-md5.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/md5.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-md5.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-md5.o `test -f 'src/common/md5.cc' || echo '$(srcdir)/'`src/common/md5.cc + +src/common/tools_mac_dump_syms_dump_syms_mac-md5.obj: src/common/md5.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-md5.obj -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-md5.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-md5.obj `if test -f 'src/common/md5.cc'; then $(CYGPATH_W) 'src/common/md5.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/md5.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-md5.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-md5.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/md5.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-md5.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-md5.obj `if test -f 'src/common/md5.cc'; then $(CYGPATH_W) 'src/common/md5.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/md5.cc'; fi` + +src/common/tools_mac_dump_syms_dump_syms_mac-module.o: src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-module.o -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-module.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-module.o `test -f 'src/common/module.cc' || echo '$(srcdir)/'`src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-module.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/module.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-module.o `test -f 'src/common/module.cc' || echo '$(srcdir)/'`src/common/module.cc + +src/common/tools_mac_dump_syms_dump_syms_mac-module.obj: src/common/module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-module.obj -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-module.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-module.obj `if test -f 'src/common/module.cc'; then $(CYGPATH_W) 'src/common/module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-module.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/module.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-module.obj `if test -f 'src/common/module.cc'; then $(CYGPATH_W) 'src/common/module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/module.cc'; fi` + +src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.o: src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.o -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-path_helper.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.o `test -f 'src/common/path_helper.cc' || echo '$(srcdir)/'`src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-path_helper.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-path_helper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/path_helper.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.o `test -f 'src/common/path_helper.cc' || echo '$(srcdir)/'`src/common/path_helper.cc + +src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.obj: src/common/path_helper.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.obj -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-path_helper.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.obj `if test -f 'src/common/path_helper.cc'; then $(CYGPATH_W) 'src/common/path_helper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/path_helper.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-path_helper.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-path_helper.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/path_helper.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-path_helper.obj `if test -f 'src/common/path_helper.cc'; then $(CYGPATH_W) 'src/common/path_helper.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/path_helper.cc'; fi` + +src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.o: src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.o -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_reader.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.o `test -f 'src/common/stabs_reader.cc' || echo '$(srcdir)/'`src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_reader.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_reader.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.o `test -f 'src/common/stabs_reader.cc' || echo '$(srcdir)/'`src/common/stabs_reader.cc + +src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.obj: src/common/stabs_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.obj -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_reader.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.obj `if test -f 'src/common/stabs_reader.cc'; then $(CYGPATH_W) 'src/common/stabs_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_reader.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_reader.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-stabs_reader.obj `if test -f 'src/common/stabs_reader.cc'; then $(CYGPATH_W) 'src/common/stabs_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_reader.cc'; fi` + +src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.o: src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.o -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.o `test -f 'src/common/stabs_to_module.cc' || echo '$(srcdir)/'`src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_to_module.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.o `test -f 'src/common/stabs_to_module.cc' || echo '$(srcdir)/'`src/common/stabs_to_module.cc + +src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.obj: src/common/stabs_to_module.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.obj -MD -MP -MF src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.Tpo -c -o src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.obj `if test -f 'src/common/stabs_to_module.cc'; then $(CYGPATH_W) 'src/common/stabs_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_to_module.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.Tpo src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/stabs_to_module.cc' object='src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.obj `if test -f 'src/common/stabs_to_module.cc'; then $(CYGPATH_W) 'src/common/stabs_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/stabs_to_module.cc'; fi` + +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.o: src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-bytereader.Tpo -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.o `test -f 'src/common/dwarf/bytereader.cc' || echo '$(srcdir)/'`src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-bytereader.Tpo src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-bytereader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/bytereader.cc' object='src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.o `test -f 'src/common/dwarf/bytereader.cc' || echo '$(srcdir)/'`src/common/dwarf/bytereader.cc + +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.obj: src/common/dwarf/bytereader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-bytereader.Tpo -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.obj `if test -f 'src/common/dwarf/bytereader.cc'; then $(CYGPATH_W) 'src/common/dwarf/bytereader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/bytereader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-bytereader.Tpo src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-bytereader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/bytereader.cc' object='src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-bytereader.obj `if test -f 'src/common/dwarf/bytereader.cc'; then $(CYGPATH_W) 'src/common/dwarf/bytereader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/bytereader.cc'; fi` + +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.o: src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.Tpo -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.o `test -f 'src/common/dwarf/dwarf2diehandler.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.Tpo src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2diehandler.cc' object='src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.o `test -f 'src/common/dwarf/dwarf2diehandler.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2diehandler.cc + +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.obj: src/common/dwarf/dwarf2diehandler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.Tpo -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.obj `if test -f 'src/common/dwarf/dwarf2diehandler.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2diehandler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2diehandler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.Tpo src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2diehandler.cc' object='src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.obj `if test -f 'src/common/dwarf/dwarf2diehandler.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2diehandler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2diehandler.cc'; fi` + +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.o: src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.Tpo -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.o `test -f 'src/common/dwarf/dwarf2reader.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.Tpo src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader.cc' object='src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.o `test -f 'src/common/dwarf/dwarf2reader.cc' || echo '$(srcdir)/'`src/common/dwarf/dwarf2reader.cc + +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.obj: src/common/dwarf/dwarf2reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.Tpo -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.obj `if test -f 'src/common/dwarf/dwarf2reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.Tpo src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/dwarf2reader.cc' object='src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.obj `if test -f 'src/common/dwarf/dwarf2reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader.cc'; fi` + +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.o: src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.o -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-elf_reader.Tpo -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.o `test -f 'src/common/dwarf/elf_reader.cc' || echo '$(srcdir)/'`src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-elf_reader.Tpo src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-elf_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/elf_reader.cc' object='src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.o `test -f 'src/common/dwarf/elf_reader.cc' || echo '$(srcdir)/'`src/common/dwarf/elf_reader.cc + +src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.obj: src/common/dwarf/elf_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.obj -MD -MP -MF src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-elf_reader.Tpo -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.obj `if test -f 'src/common/dwarf/elf_reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/elf_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/elf_reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-elf_reader.Tpo src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-elf_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf/elf_reader.cc' object='src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/tools_mac_dump_syms_dump_syms_mac-elf_reader.obj `if test -f 'src/common/dwarf/elf_reader.cc'; then $(CYGPATH_W) 'src/common/dwarf/elf_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/elf_reader.cc'; fi` + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.o: src/common/mac/arch_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.o -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-arch_utilities.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.o `test -f 'src/common/mac/arch_utilities.cc' || echo '$(srcdir)/'`src/common/mac/arch_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-arch_utilities.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-arch_utilities.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/arch_utilities.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.o `test -f 'src/common/mac/arch_utilities.cc' || echo '$(srcdir)/'`src/common/mac/arch_utilities.cc + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.obj: src/common/mac/arch_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.obj -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-arch_utilities.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.obj `if test -f 'src/common/mac/arch_utilities.cc'; then $(CYGPATH_W) 'src/common/mac/arch_utilities.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/arch_utilities.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-arch_utilities.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-arch_utilities.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/arch_utilities.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-arch_utilities.obj `if test -f 'src/common/mac/arch_utilities.cc'; then $(CYGPATH_W) 'src/common/mac/arch_utilities.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/arch_utilities.cc'; fi` + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.o: src/common/mac/dump_syms.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.o -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dump_syms.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.o `test -f 'src/common/mac/dump_syms.cc' || echo '$(srcdir)/'`src/common/mac/dump_syms.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dump_syms.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dump_syms.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/dump_syms.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.o `test -f 'src/common/mac/dump_syms.cc' || echo '$(srcdir)/'`src/common/mac/dump_syms.cc + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.obj: src/common/mac/dump_syms.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.obj -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dump_syms.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.obj `if test -f 'src/common/mac/dump_syms.cc'; then $(CYGPATH_W) 'src/common/mac/dump_syms.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/dump_syms.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dump_syms.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dump_syms.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/dump_syms.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-dump_syms.obj `if test -f 'src/common/mac/dump_syms.cc'; then $(CYGPATH_W) 'src/common/mac/dump_syms.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/dump_syms.cc'; fi` + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.o: src/common/mac/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.o -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-file_id.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.o `test -f 'src/common/mac/file_id.cc' || echo '$(srcdir)/'`src/common/mac/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-file_id.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-file_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/file_id.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.o `test -f 'src/common/mac/file_id.cc' || echo '$(srcdir)/'`src/common/mac/file_id.cc + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.obj: src/common/mac/file_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.obj -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-file_id.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.obj `if test -f 'src/common/mac/file_id.cc'; then $(CYGPATH_W) 'src/common/mac/file_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/file_id.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-file_id.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-file_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/file_id.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-file_id.obj `if test -f 'src/common/mac/file_id.cc'; then $(CYGPATH_W) 'src/common/mac/file_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/file_id.cc'; fi` + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.o: src/common/mac/macho_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.o -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_id.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.o `test -f 'src/common/mac/macho_id.cc' || echo '$(srcdir)/'`src/common/mac/macho_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_id.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_id.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.o `test -f 'src/common/mac/macho_id.cc' || echo '$(srcdir)/'`src/common/mac/macho_id.cc + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.obj: src/common/mac/macho_id.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.obj -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_id.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.obj `if test -f 'src/common/mac/macho_id.cc'; then $(CYGPATH_W) 'src/common/mac/macho_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_id.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_id.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_id.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_id.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_id.obj `if test -f 'src/common/mac/macho_id.cc'; then $(CYGPATH_W) 'src/common/mac/macho_id.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_id.cc'; fi` + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.o: src/common/mac/macho_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.o -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_reader.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.o `test -f 'src/common/mac/macho_reader.cc' || echo '$(srcdir)/'`src/common/mac/macho_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_reader.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_reader.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.o `test -f 'src/common/mac/macho_reader.cc' || echo '$(srcdir)/'`src/common/mac/macho_reader.cc + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.obj: src/common/mac/macho_reader.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.obj -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_reader.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.obj `if test -f 'src/common/mac/macho_reader.cc'; then $(CYGPATH_W) 'src/common/mac/macho_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_reader.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_reader.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_reader.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_reader.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_reader.obj `if test -f 'src/common/mac/macho_reader.cc'; then $(CYGPATH_W) 'src/common/mac/macho_reader.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_reader.cc'; fi` + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.o: src/common/mac/macho_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.o -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_utilities.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.o `test -f 'src/common/mac/macho_utilities.cc' || echo '$(srcdir)/'`src/common/mac/macho_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_utilities.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_utilities.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_utilities.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.o `test -f 'src/common/mac/macho_utilities.cc' || echo '$(srcdir)/'`src/common/mac/macho_utilities.cc + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.obj: src/common/mac/macho_utilities.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.obj -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_utilities.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.obj `if test -f 'src/common/mac/macho_utilities.cc'; then $(CYGPATH_W) 'src/common/mac/macho_utilities.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_utilities.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_utilities.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_utilities.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_utilities.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_utilities.obj `if test -f 'src/common/mac/macho_utilities.cc'; then $(CYGPATH_W) 'src/common/mac/macho_utilities.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_utilities.cc'; fi` + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.o: src/common/mac/macho_walker.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.o -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_walker.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.o `test -f 'src/common/mac/macho_walker.cc' || echo '$(srcdir)/'`src/common/mac/macho_walker.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_walker.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_walker.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_walker.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.o `test -f 'src/common/mac/macho_walker.cc' || echo '$(srcdir)/'`src/common/mac/macho_walker.cc + +src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.obj: src/common/mac/macho_walker.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.obj -MD -MP -MF src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_walker.Tpo -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.obj `if test -f 'src/common/mac/macho_walker.cc'; then $(CYGPATH_W) 'src/common/mac/macho_walker.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_walker.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_walker.Tpo src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_walker.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/mac/macho_walker.cc' object='src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/mac/tools_mac_dump_syms_dump_syms_mac-macho_walker.obj `if test -f 'src/common/mac/macho_walker.cc'; then $(CYGPATH_W) 'src/common/mac/macho_walker.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/mac/macho_walker.cc'; fi` + +src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.o: src/tools/mac/dump_syms/dump_syms_tool.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.o -MD -MP -MF src/tools/mac/dump_syms/$(DEPDIR)/dump_syms_mac-dump_syms_tool.Tpo -c -o src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.o `test -f 'src/tools/mac/dump_syms/dump_syms_tool.cc' || echo '$(srcdir)/'`src/tools/mac/dump_syms/dump_syms_tool.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tools/mac/dump_syms/$(DEPDIR)/dump_syms_mac-dump_syms_tool.Tpo src/tools/mac/dump_syms/$(DEPDIR)/dump_syms_mac-dump_syms_tool.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tools/mac/dump_syms/dump_syms_tool.cc' object='src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.o `test -f 'src/tools/mac/dump_syms/dump_syms_tool.cc' || echo '$(srcdir)/'`src/tools/mac/dump_syms/dump_syms_tool.cc + +src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.obj: src/tools/mac/dump_syms/dump_syms_tool.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.obj -MD -MP -MF src/tools/mac/dump_syms/$(DEPDIR)/dump_syms_mac-dump_syms_tool.Tpo -c -o src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.obj `if test -f 'src/tools/mac/dump_syms/dump_syms_tool.cc'; then $(CYGPATH_W) 'src/tools/mac/dump_syms/dump_syms_tool.cc'; else $(CYGPATH_W) '$(srcdir)/src/tools/mac/dump_syms/dump_syms_tool.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/tools/mac/dump_syms/$(DEPDIR)/dump_syms_mac-dump_syms_tool.Tpo src/tools/mac/dump_syms/$(DEPDIR)/dump_syms_mac-dump_syms_tool.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/tools/mac/dump_syms/dump_syms_tool.cc' object='src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/tools/mac/dump_syms/dump_syms_mac-dump_syms_tool.obj `if test -f 'src/tools/mac/dump_syms/dump_syms_tool.cc'; then $(CYGPATH_W) 'src/tools/mac/dump_syms/dump_syms_tool.cc'; else $(CYGPATH_W) '$(srcdir)/src/tools/mac/dump_syms/dump_syms_tool.cc'; fi` +install-dist_docDATA: $(dist_doc_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ + done + +uninstall-dist_docDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-includecHEADERS: $(includec_HEADERS) + @$(NORMAL_INSTALL) + @list='$(includec_HEADERS)'; test -n "$(includecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includecdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includecdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includecdir)" || exit $$?; \ + done + +uninstall-includecHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(includec_HEADERS)'; test -n "$(includecdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includecdir)'; $(am__uninstall_files_from_dir) +install-includeclHEADERS: $(includecl_HEADERS) + @$(NORMAL_INSTALL) + @list='$(includecl_HEADERS)'; test -n "$(includecldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includecldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includecldir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includecldir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includecldir)" || exit $$?; \ + done + +uninstall-includeclHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(includecl_HEADERS)'; test -n "$(includecldir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includecldir)'; $(am__uninstall_files_from_dir) +install-includeclcHEADERS: $(includeclc_HEADERS) + @$(NORMAL_INSTALL) + @list='$(includeclc_HEADERS)'; test -n "$(includeclcdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includeclcdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includeclcdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includeclcdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includeclcdir)" || exit $$?; \ + done + +uninstall-includeclcHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(includeclc_HEADERS)'; test -n "$(includeclcdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includeclcdir)'; $(am__uninstall_files_from_dir) +install-includecldwcHEADERS: $(includecldwc_HEADERS) + @$(NORMAL_INSTALL) + @list='$(includecldwc_HEADERS)'; test -n "$(includecldwcdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includecldwcdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includecldwcdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includecldwcdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includecldwcdir)" || exit $$?; \ + done + +uninstall-includecldwcHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(includecldwc_HEADERS)'; test -n "$(includecldwcdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includecldwcdir)'; $(am__uninstall_files_from_dir) +install-includeclhHEADERS: $(includeclh_HEADERS) + @$(NORMAL_INSTALL) + @list='$(includeclh_HEADERS)'; test -n "$(includeclhdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includeclhdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includeclhdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includeclhdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includeclhdir)" || exit $$?; \ + done + +uninstall-includeclhHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(includeclh_HEADERS)'; test -n "$(includeclhdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includeclhdir)'; $(am__uninstall_files_from_dir) +install-includeclmHEADERS: $(includeclm_HEADERS) + @$(NORMAL_INSTALL) + @list='$(includeclm_HEADERS)'; test -n "$(includeclmdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includeclmdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includeclmdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includeclmdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includeclmdir)" || exit $$?; \ + done + +uninstall-includeclmHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(includeclm_HEADERS)'; test -n "$(includeclmdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includeclmdir)'; $(am__uninstall_files_from_dir) +install-includegbcHEADERS: $(includegbc_HEADERS) + @$(NORMAL_INSTALL) + @list='$(includegbc_HEADERS)'; test -n "$(includegbcdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includegbcdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includegbcdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includegbcdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includegbcdir)" || exit $$?; \ + done + +uninstall-includegbcHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(includegbc_HEADERS)'; test -n "$(includegbcdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includegbcdir)'; $(am__uninstall_files_from_dir) +install-includelssHEADERS: $(includelss_HEADERS) + @$(NORMAL_INSTALL) + @list='$(includelss_HEADERS)'; test -n "$(includelssdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includelssdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includelssdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includelssdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includelssdir)" || exit $$?; \ + done + +uninstall-includelssHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(includelss_HEADERS)'; test -n "$(includelssdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includelssdir)'; $(am__uninstall_files_from_dir) +install-includepHEADERS: $(includep_HEADERS) + @$(NORMAL_INSTALL) + @list='$(includep_HEADERS)'; test -n "$(includepdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includepdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includepdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includepdir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includepdir)" || exit $$?; \ + done + +uninstall-includepHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(includep_HEADERS)'; test -n "$(includepdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includepdir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) $(check_LIBRARIES) $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) $(check_LIBRARIES) $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +src/common/safe_math_unittest.log: src/common/safe_math_unittest$(EXEEXT) + @p='src/common/safe_math_unittest$(EXEEXT)'; \ + b='src/common/safe_math_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/common/test_assembler_unittest.log: src/common/test_assembler_unittest$(EXEEXT) + @p='src/common/test_assembler_unittest$(EXEEXT)'; \ + b='src/common/test_assembler_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/common/dwarf/dwarf2reader_lineinfo_unittest.log: src/common/dwarf/dwarf2reader_lineinfo_unittest$(EXEEXT) + @p='src/common/dwarf/dwarf2reader_lineinfo_unittest$(EXEEXT)'; \ + b='src/common/dwarf/dwarf2reader_lineinfo_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/common/dwarf/dwarf2reader_splitfunctions_unittest.log: src/common/dwarf/dwarf2reader_splitfunctions_unittest$(EXEEXT) + @p='src/common/dwarf/dwarf2reader_splitfunctions_unittest$(EXEEXT)'; \ + b='src/common/dwarf/dwarf2reader_splitfunctions_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/address_map_unittest.log: src/processor/address_map_unittest$(EXEEXT) + @p='src/processor/address_map_unittest$(EXEEXT)'; \ + b='src/processor/address_map_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/basic_source_line_resolver_unittest.log: src/processor/basic_source_line_resolver_unittest$(EXEEXT) + @p='src/processor/basic_source_line_resolver_unittest$(EXEEXT)'; \ + b='src/processor/basic_source_line_resolver_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/cfi_frame_info_unittest.log: src/processor/cfi_frame_info_unittest$(EXEEXT) + @p='src/processor/cfi_frame_info_unittest$(EXEEXT)'; \ + b='src/processor/cfi_frame_info_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/contained_range_map_unittest.log: src/processor/contained_range_map_unittest$(EXEEXT) + @p='src/processor/contained_range_map_unittest$(EXEEXT)'; \ + b='src/processor/contained_range_map_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/disassembler_x86_unittest.log: src/processor/disassembler_x86_unittest$(EXEEXT) + @p='src/processor/disassembler_x86_unittest$(EXEEXT)'; \ + b='src/processor/disassembler_x86_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/exploitability_unittest.log: src/processor/exploitability_unittest$(EXEEXT) + @p='src/processor/exploitability_unittest$(EXEEXT)'; \ + b='src/processor/exploitability_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/fast_source_line_resolver_unittest.log: src/processor/fast_source_line_resolver_unittest$(EXEEXT) + @p='src/processor/fast_source_line_resolver_unittest$(EXEEXT)'; \ + b='src/processor/fast_source_line_resolver_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/map_serializers_unittest.log: src/processor/map_serializers_unittest$(EXEEXT) + @p='src/processor/map_serializers_unittest$(EXEEXT)'; \ + b='src/processor/map_serializers_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/microdump_processor_unittest.log: src/processor/microdump_processor_unittest$(EXEEXT) + @p='src/processor/microdump_processor_unittest$(EXEEXT)'; \ + b='src/processor/microdump_processor_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/minidump_processor_unittest.log: src/processor/minidump_processor_unittest$(EXEEXT) + @p='src/processor/minidump_processor_unittest$(EXEEXT)'; \ + b='src/processor/minidump_processor_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/minidump_unittest.log: src/processor/minidump_unittest$(EXEEXT) + @p='src/processor/minidump_unittest$(EXEEXT)'; \ + b='src/processor/minidump_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/static_address_map_unittest.log: src/processor/static_address_map_unittest$(EXEEXT) + @p='src/processor/static_address_map_unittest$(EXEEXT)'; \ + b='src/processor/static_address_map_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/static_contained_range_map_unittest.log: src/processor/static_contained_range_map_unittest$(EXEEXT) + @p='src/processor/static_contained_range_map_unittest$(EXEEXT)'; \ + b='src/processor/static_contained_range_map_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/static_map_unittest.log: src/processor/static_map_unittest$(EXEEXT) + @p='src/processor/static_map_unittest$(EXEEXT)'; \ + b='src/processor/static_map_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/static_range_map_unittest.log: src/processor/static_range_map_unittest$(EXEEXT) + @p='src/processor/static_range_map_unittest$(EXEEXT)'; \ + b='src/processor/static_range_map_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/pathname_stripper_unittest.log: src/processor/pathname_stripper_unittest$(EXEEXT) + @p='src/processor/pathname_stripper_unittest$(EXEEXT)'; \ + b='src/processor/pathname_stripper_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/postfix_evaluator_unittest.log: src/processor/postfix_evaluator_unittest$(EXEEXT) + @p='src/processor/postfix_evaluator_unittest$(EXEEXT)'; \ + b='src/processor/postfix_evaluator_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/proc_maps_linux_unittest.log: src/processor/proc_maps_linux_unittest$(EXEEXT) + @p='src/processor/proc_maps_linux_unittest$(EXEEXT)'; \ + b='src/processor/proc_maps_linux_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/range_map_truncate_lower_unittest.log: src/processor/range_map_truncate_lower_unittest$(EXEEXT) + @p='src/processor/range_map_truncate_lower_unittest$(EXEEXT)'; \ + b='src/processor/range_map_truncate_lower_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/range_map_truncate_upper_unittest.log: src/processor/range_map_truncate_upper_unittest$(EXEEXT) + @p='src/processor/range_map_truncate_upper_unittest$(EXEEXT)'; \ + b='src/processor/range_map_truncate_upper_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/range_map_unittest.log: src/processor/range_map_unittest$(EXEEXT) + @p='src/processor/range_map_unittest$(EXEEXT)'; \ + b='src/processor/range_map_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_amd64_unittest.log: src/processor/stackwalker_amd64_unittest$(EXEEXT) + @p='src/processor/stackwalker_amd64_unittest$(EXEEXT)'; \ + b='src/processor/stackwalker_amd64_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_arm_unittest.log: src/processor/stackwalker_arm_unittest$(EXEEXT) + @p='src/processor/stackwalker_arm_unittest$(EXEEXT)'; \ + b='src/processor/stackwalker_arm_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_arm64_unittest.log: src/processor/stackwalker_arm64_unittest$(EXEEXT) + @p='src/processor/stackwalker_arm64_unittest$(EXEEXT)'; \ + b='src/processor/stackwalker_arm64_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_address_list_unittest.log: src/processor/stackwalker_address_list_unittest$(EXEEXT) + @p='src/processor/stackwalker_address_list_unittest$(EXEEXT)'; \ + b='src/processor/stackwalker_address_list_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_mips_unittest.log: src/processor/stackwalker_mips_unittest$(EXEEXT) + @p='src/processor/stackwalker_mips_unittest$(EXEEXT)'; \ + b='src/processor/stackwalker_mips_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_mips64_unittest.log: src/processor/stackwalker_mips64_unittest$(EXEEXT) + @p='src/processor/stackwalker_mips64_unittest$(EXEEXT)'; \ + b='src/processor/stackwalker_mips64_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_riscv_unittest.log: src/processor/stackwalker_riscv_unittest$(EXEEXT) + @p='src/processor/stackwalker_riscv_unittest$(EXEEXT)'; \ + b='src/processor/stackwalker_riscv_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_riscv64_unittest.log: src/processor/stackwalker_riscv64_unittest$(EXEEXT) + @p='src/processor/stackwalker_riscv64_unittest$(EXEEXT)'; \ + b='src/processor/stackwalker_riscv64_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_x86_unittest.log: src/processor/stackwalker_x86_unittest$(EXEEXT) + @p='src/processor/stackwalker_x86_unittest$(EXEEXT)'; \ + b='src/processor/stackwalker_x86_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/synth_minidump_unittest.log: src/processor/synth_minidump_unittest$(EXEEXT) + @p='src/processor/synth_minidump_unittest$(EXEEXT)'; \ + b='src/processor/synth_minidump_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/disassembler_objdump_unittest.log: src/processor/disassembler_objdump_unittest$(EXEEXT) + @p='src/processor/disassembler_objdump_unittest$(EXEEXT)'; \ + b='src/processor/disassembler_objdump_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/common/linux/scoped_pipe_unittest.log: src/common/linux/scoped_pipe_unittest$(EXEEXT) + @p='src/common/linux/scoped_pipe_unittest$(EXEEXT)'; \ + b='src/common/linux/scoped_pipe_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/common/linux/scoped_tmpfile_unittest.log: src/common/linux/scoped_tmpfile_unittest$(EXEEXT) + @p='src/common/linux/scoped_tmpfile_unittest$(EXEEXT)'; \ + b='src/common/linux/scoped_tmpfile_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/stackwalker_selftest.log: src/processor/stackwalker_selftest$(EXEEXT) + @p='src/processor/stackwalker_selftest$(EXEEXT)'; \ + b='src/processor/stackwalker_selftest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/client/linux/linux_client_unittest.log: src/client/linux/linux_client_unittest$(EXEEXT) + @p='src/client/linux/linux_client_unittest$(EXEEXT)'; \ + b='src/client/linux/linux_client_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/common/linux/google_crashdump_uploader_test.log: src/common/linux/google_crashdump_uploader_test$(EXEEXT) + @p='src/common/linux/google_crashdump_uploader_test$(EXEEXT)'; \ + b='src/common/linux/google_crashdump_uploader_test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/common/dumper_unittest.log: src/common/dumper_unittest$(EXEEXT) + @p='src/common/dumper_unittest$(EXEEXT)'; \ + b='src/common/dumper_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/tools/linux/md2core/minidump_2_core_unittest.log: src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT) + @p='src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT)'; \ + b='src/tools/linux/md2core/minidump_2_core_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/common/mac/macho_reader_unittest.log: src/common/mac/macho_reader_unittest$(EXEEXT) + @p='src/common/mac/macho_reader_unittest$(EXEEXT)'; \ + b='src/common/mac/macho_reader_unittest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/microdump_stackwalk_test.log: src/processor/microdump_stackwalk_test + @p='src/processor/microdump_stackwalk_test'; \ + b='src/processor/microdump_stackwalk_test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/microdump_stackwalk_machine_readable_test.log: src/processor/microdump_stackwalk_machine_readable_test + @p='src/processor/microdump_stackwalk_machine_readable_test'; \ + b='src/processor/microdump_stackwalk_machine_readable_test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/minidump_dump_test.log: src/processor/minidump_dump_test + @p='src/processor/minidump_dump_test'; \ + b='src/processor/minidump_dump_test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/minidump_stackwalk_test.log: src/processor/minidump_stackwalk_test + @p='src/processor/minidump_stackwalk_test'; \ + b='src/processor/minidump_stackwalk_test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +src/processor/minidump_stackwalk_machine_readable_test.log: src/processor/minidump_stackwalk_machine_readable_test + @p='src/processor/minidump_stackwalk_machine_readable_test'; \ + b='src/processor/minidump_stackwalk_machine_readable_test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_LIBRARIES) \ + $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(SCRIPTS) $(DATA) \ + $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includecdir)" "$(DESTDIR)$(includecldir)" "$(DESTDIR)$(includeclcdir)" "$(DESTDIR)$(includecldwcdir)" "$(DESTDIR)$(includeclhdir)" "$(DESTDIR)$(includeclmdir)" "$(DESTDIR)$(includegbcdir)" "$(DESTDIR)$(includelssdir)" "$(DESTDIR)$(includepdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f src/$(am__dirstamp) + -rm -f src/client/$(DEPDIR)/$(am__dirstamp) + -rm -f src/client/$(am__dirstamp) + -rm -f src/client/linux/$(am__dirstamp) + -rm -f src/client/linux/crash_generation/$(DEPDIR)/$(am__dirstamp) + -rm -f src/client/linux/crash_generation/$(am__dirstamp) + -rm -f src/client/linux/dump_writer_common/$(DEPDIR)/$(am__dirstamp) + -rm -f src/client/linux/dump_writer_common/$(am__dirstamp) + -rm -f src/client/linux/handler/$(DEPDIR)/$(am__dirstamp) + -rm -f src/client/linux/handler/$(am__dirstamp) + -rm -f src/client/linux/log/$(DEPDIR)/$(am__dirstamp) + -rm -f src/client/linux/log/$(am__dirstamp) + -rm -f src/client/linux/microdump_writer/$(DEPDIR)/$(am__dirstamp) + -rm -f src/client/linux/microdump_writer/$(am__dirstamp) + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) + -rm -f src/client/linux/minidump_writer/$(am__dirstamp) + -rm -f src/common/$(DEPDIR)/$(am__dirstamp) + -rm -f src/common/$(am__dirstamp) + -rm -f src/common/dwarf/$(DEPDIR)/$(am__dirstamp) + -rm -f src/common/dwarf/$(am__dirstamp) + -rm -f src/common/linux/$(DEPDIR)/$(am__dirstamp) + -rm -f src/common/linux/$(am__dirstamp) + -rm -f src/common/linux/tests/$(DEPDIR)/$(am__dirstamp) + -rm -f src/common/linux/tests/$(am__dirstamp) + -rm -f src/common/mac/$(DEPDIR)/$(am__dirstamp) + -rm -f src/common/mac/$(am__dirstamp) + -rm -f src/common/tests/$(DEPDIR)/$(am__dirstamp) + -rm -f src/common/tests/$(am__dirstamp) + -rm -f src/processor/$(DEPDIR)/$(am__dirstamp) + -rm -f src/processor/$(am__dirstamp) + -rm -f src/testing/$(am__dirstamp) + -rm -f src/testing/googlemock/src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/testing/googlemock/src/$(am__dirstamp) + -rm -f src/testing/googletest/src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/testing/googletest/src/$(am__dirstamp) + -rm -f src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) + -rm -f src/third_party/libdisasm/$(am__dirstamp) + -rm -f src/tools/linux/core2md/$(DEPDIR)/$(am__dirstamp) + -rm -f src/tools/linux/core2md/$(am__dirstamp) + -rm -f src/tools/linux/core_handler/$(DEPDIR)/$(am__dirstamp) + -rm -f src/tools/linux/core_handler/$(am__dirstamp) + -rm -f src/tools/linux/dump_syms/$(DEPDIR)/$(am__dirstamp) + -rm -f src/tools/linux/dump_syms/$(am__dirstamp) + -rm -f src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp) + -rm -f src/tools/linux/md2core/$(am__dirstamp) + -rm -f src/tools/linux/pid2md/$(DEPDIR)/$(am__dirstamp) + -rm -f src/tools/linux/pid2md/$(am__dirstamp) + -rm -f src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp) + -rm -f src/tools/linux/symupload/$(am__dirstamp) + -rm -f src/tools/mac/dump_syms/$(DEPDIR)/$(am__dirstamp) + -rm -f src/tools/mac/dump_syms/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-checkLIBRARIES clean-checkPROGRAMS \ + clean-generic clean-libLIBRARIES clean-libexecPROGRAMS \ + clean-noinstLIBRARIES clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f src/client/$(DEPDIR)/minidump_file_writer.Po + -rm -f src/client/linux/crash_generation/$(DEPDIR)/crash_generation_client.Po + -rm -f src/client/linux/crash_generation/$(DEPDIR)/crash_generation_server.Po + -rm -f src/client/linux/dump_writer_common/$(DEPDIR)/thread_info.Po + -rm -f src/client/linux/dump_writer_common/$(DEPDIR)/ucontext_reader.Po + -rm -f src/client/linux/handler/$(DEPDIR)/exception_handler.Po + -rm -f src/client/linux/handler/$(DEPDIR)/linux_client_unittest_shlib-exception_handler_unittest.Po + -rm -f src/client/linux/handler/$(DEPDIR)/minidump_descriptor.Po + -rm -f src/client/linux/log/$(DEPDIR)/log.Po + -rm -f src/client/linux/microdump_writer/$(DEPDIR)/linux_client_unittest_shlib-microdump_writer_unittest.Po + -rm -f src/client/linux/microdump_writer/$(DEPDIR)/microdump_writer.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-cpu_set_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-directory_reader_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-line_reader_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest_utils.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-pe_file.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_core_dumper.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper_unittest_helper-linux_dumper_unittest_helper.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_ptrace_dumper.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/minidump_writer.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/pe_file.Po + -rm -f src/common/$(DEPDIR)/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.Po + -rm -f src/common/$(DEPDIR)/convert_UTF.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-byte_cursor_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-convert_UTF.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_range_list_handler.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-language.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-memory_range_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-module.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-module_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-path_helper.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-stabs_reader.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-stabs_reader_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-stabs_to_module.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-stabs_to_module_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-string_conversion.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-string_conversion_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cu_to_module.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_line_to_module.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-language.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-md5.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-module.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-path_helper.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_reader.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_to_module.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/md5.Po + -rm -f src/common/$(DEPDIR)/path_helper.Po + -rm -f src/common/$(DEPDIR)/processor_minidump_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_address_list_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_amd64_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_arm64_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_arm_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_mips64_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_mips_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_riscv64_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_riscv_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_x86_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_synth_minidump_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/safe_math_unittest-safe_math_unittest.Po + -rm -f src/common/$(DEPDIR)/string_conversion.Po + -rm -f src/common/$(DEPDIR)/test_assembler_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/test_assembler_unittest-test_assembler_unittest.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-language.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-module.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-path_helper.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_reader.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-language.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-md5.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-module.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-path_helper.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_reader.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-cfi_assembler.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_cfi_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_die_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-elf_reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-bytereader.Po + -rm -f src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-cfi_assembler.Po + -rm -f src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2diehandler.Po + -rm -f src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-elf_reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-bytereader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2diehandler.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-bytereader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-elf_reader.Po + -rm -f src/common/linux/$(DEPDIR)/breakpad_getcontext.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-elfutils.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-file_id.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-file_id_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-linux_libc_support.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/elf_core_dump.Po + -rm -f src/common/linux/$(DEPDIR)/elfutils.Po + -rm -f src/common/linux/$(DEPDIR)/file_id.Po + -rm -f src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader.Po + -rm -f src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader_test.Po + -rm -f src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-libcurl_wrapper.Po + -rm -f src/common/linux/$(DEPDIR)/guid_creator.Po + -rm -f src/common/linux/$(DEPDIR)/http_upload.Po + -rm -f src/common/linux/$(DEPDIR)/libcurl_wrapper.Po + -rm -f src/common/linux/$(DEPDIR)/linux_libc_support.Po + -rm -f src/common/linux/$(DEPDIR)/memory_mapped_file.Po + -rm -f src/common/linux/$(DEPDIR)/safe_readlink.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_pipe.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_tmpfile.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/symbol_collector_client.Po + -rm -f src/common/linux/$(DEPDIR)/symbol_upload.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dump_symbols.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elfutils.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-file_id.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-linux_libc_support.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-memory_mapped_file.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-safe_readlink.Po + -rm -f src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Po + -rm -f src/common/linux/tests/$(DEPDIR)/dumper_unittest-crash_generator.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-arch_utilities.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-file_id.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_id.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader_unittest.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_utilities.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_walker.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-arch_utilities.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dump_syms.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-file_id.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_id.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_reader.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_utilities.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_walker.Po + -rm -f src/common/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-file_utils.Po + -rm -f src/common/tests/$(DEPDIR)/dumper_unittest-file_utils.Po + -rm -f src/common/tests/$(DEPDIR)/mac_macho_reader_unittest-file_utils.Po + -rm -f src/processor/$(DEPDIR)/address_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/basic_code_modules.Po + -rm -f src/processor/$(DEPDIR)/basic_source_line_resolver.Po + -rm -f src/processor/$(DEPDIR)/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Po + -rm -f src/processor/$(DEPDIR)/call_stack.Po + -rm -f src/processor/$(DEPDIR)/cfi_frame_info.Po + -rm -f src/processor/$(DEPDIR)/cfi_frame_info_unittest-cfi_frame_info_unittest.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-basic_code_modules.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_context.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_object.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-logging.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-minidump.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-pathname_stripper.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-proc_maps_linux.Po + -rm -f src/processor/$(DEPDIR)/contained_range_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/convert_old_arm64_context.Po + -rm -f src/processor/$(DEPDIR)/disassembler_objdump.Po + -rm -f src/processor/$(DEPDIR)/disassembler_objdump_unittest-disassembler_objdump_unittest.Po + -rm -f src/processor/$(DEPDIR)/disassembler_x86.Po + -rm -f src/processor/$(DEPDIR)/disassembler_x86_unittest-disassembler_x86_unittest.Po + -rm -f src/processor/$(DEPDIR)/dump_context.Po + -rm -f src/processor/$(DEPDIR)/dump_object.Po + -rm -f src/processor/$(DEPDIR)/exploitability.Po + -rm -f src/processor/$(DEPDIR)/exploitability_linux.Po + -rm -f src/processor/$(DEPDIR)/exploitability_unittest-exploitability_unittest.Po + -rm -f src/processor/$(DEPDIR)/exploitability_win.Po + -rm -f src/processor/$(DEPDIR)/fast_source_line_resolver.Po + -rm -f src/processor/$(DEPDIR)/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.Po + -rm -f src/processor/$(DEPDIR)/logging.Po + -rm -f src/processor/$(DEPDIR)/map_serializers_unittest-map_serializers_unittest.Po + -rm -f src/processor/$(DEPDIR)/microdump.Po + -rm -f src/processor/$(DEPDIR)/microdump_processor.Po + -rm -f src/processor/$(DEPDIR)/microdump_processor_unittest-microdump_processor_unittest.Po + -rm -f src/processor/$(DEPDIR)/microdump_stackwalk.Po + -rm -f src/processor/$(DEPDIR)/minidump.Po + -rm -f src/processor/$(DEPDIR)/minidump_dump.Po + -rm -f src/processor/$(DEPDIR)/minidump_processor.Po + -rm -f src/processor/$(DEPDIR)/minidump_processor_unittest-minidump_processor_unittest.Po + -rm -f src/processor/$(DEPDIR)/minidump_stackwalk.Po + -rm -f src/processor/$(DEPDIR)/minidump_unittest-minidump_unittest.Po + -rm -f src/processor/$(DEPDIR)/minidump_unittest-synth_minidump.Po + -rm -f src/processor/$(DEPDIR)/module_comparer.Po + -rm -f src/processor/$(DEPDIR)/module_serializer.Po + -rm -f src/processor/$(DEPDIR)/pathname_stripper.Po + -rm -f src/processor/$(DEPDIR)/pathname_stripper_unittest.Po + -rm -f src/processor/$(DEPDIR)/postfix_evaluator_unittest.Po + -rm -f src/processor/$(DEPDIR)/proc_maps_linux.Po + -rm -f src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux.Po + -rm -f src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux_unittest.Po + -rm -f src/processor/$(DEPDIR)/process_state.Po + -rm -f src/processor/$(DEPDIR)/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.Po + -rm -f src/processor/$(DEPDIR)/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.Po + -rm -f src/processor/$(DEPDIR)/range_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/simple_symbol_supplier.Po + -rm -f src/processor/$(DEPDIR)/source_line_resolver_base.Po + -rm -f src/processor/$(DEPDIR)/stack_frame_cpu.Po + -rm -f src/processor/$(DEPDIR)/stack_frame_symbolizer.Po + -rm -f src/processor/$(DEPDIR)/stackwalk_common.Po + -rm -f src/processor/$(DEPDIR)/stackwalker.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_address_list.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_address_list_unittest-stackwalker_address_list_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_amd64.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_amd64_unittest-stackwalker_amd64_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_arm.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_arm64.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_arm64_unittest-stackwalker_arm64_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_arm_unittest-stackwalker_arm_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_mips.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_mips64_unittest-stackwalker_mips64_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_mips_unittest-stackwalker_mips_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_ppc.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_ppc64.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_riscv.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_riscv64.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_riscv_unittest-stackwalker_riscv_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_selftest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_sparc.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_x86.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_x86_unittest-stackwalker_x86_unittest.Po + -rm -f src/processor/$(DEPDIR)/static_address_map_unittest-static_address_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/static_contained_range_map_unittest-static_contained_range_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/static_map_unittest-static_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/static_range_map_unittest-static_range_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/symbolic_constants_win.Po + -rm -f src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump.Po + -rm -f src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump_unittest.Po + -rm -f src/processor/$(DEPDIR)/tokenize.Po + -rm -f src/testing/googlemock/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gmock-all.Po + -rm -f src/testing/googlemock/src/$(DEPDIR)/libtesting_a-gmock-all.Po + -rm -f src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest-all.Po + -rm -f src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest_main.Po + -rm -f src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest-all.Po + -rm -f src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest_main.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_implicit.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_insn.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_invariant.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_modrm.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_opcode_tables.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_operand.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_reg.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_settings.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_disasm.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_format.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_imm.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_insn.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_misc.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_operand_list.Po + -rm -f src/tools/linux/core2md/$(DEPDIR)/core2md.Po + -rm -f src/tools/linux/core_handler/$(DEPDIR)/core_handler.Po + -rm -f src/tools/linux/dump_syms/$(DEPDIR)/dump_syms-dump_syms.Po + -rm -f src/tools/linux/md2core/$(DEPDIR)/minidump-2-core.Po + -rm -f src/tools/linux/md2core/$(DEPDIR)/minidump_2_core_unittest-minidump_memory_range_unittest.Po + -rm -f src/tools/linux/pid2md/$(DEPDIR)/pid2md.Po + -rm -f src/tools/linux/symupload/$(DEPDIR)/minidump_upload.Po + -rm -f src/tools/linux/symupload/$(DEPDIR)/sym_upload.Po + -rm -f src/tools/mac/dump_syms/$(DEPDIR)/dump_syms_mac-dump_syms_tool.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-dist_docDATA install-includecHEADERS \ + install-includeclHEADERS install-includeclcHEADERS \ + install-includecldwcHEADERS install-includeclhHEADERS \ + install-includeclmHEADERS install-includegbcHEADERS \ + install-includelssHEADERS install-includepHEADERS \ + install-pkgconfigDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLIBRARIES \ + install-libexecPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f src/client/$(DEPDIR)/minidump_file_writer.Po + -rm -f src/client/linux/crash_generation/$(DEPDIR)/crash_generation_client.Po + -rm -f src/client/linux/crash_generation/$(DEPDIR)/crash_generation_server.Po + -rm -f src/client/linux/dump_writer_common/$(DEPDIR)/thread_info.Po + -rm -f src/client/linux/dump_writer_common/$(DEPDIR)/ucontext_reader.Po + -rm -f src/client/linux/handler/$(DEPDIR)/exception_handler.Po + -rm -f src/client/linux/handler/$(DEPDIR)/linux_client_unittest_shlib-exception_handler_unittest.Po + -rm -f src/client/linux/handler/$(DEPDIR)/minidump_descriptor.Po + -rm -f src/client/linux/log/$(DEPDIR)/log.Po + -rm -f src/client/linux/microdump_writer/$(DEPDIR)/linux_client_unittest_shlib-microdump_writer_unittest.Po + -rm -f src/client/linux/microdump_writer/$(DEPDIR)/microdump_writer.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-cpu_set_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-directory_reader_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-line_reader_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_core_dumper_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-linux_ptrace_dumper_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-minidump_writer_unittest_utils.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-pe_file.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_client_unittest_shlib-proc_cpuinfo_reader_unittest.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_core_dumper.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_dumper_unittest_helper-linux_dumper_unittest_helper.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/linux_ptrace_dumper.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/minidump_writer.Po + -rm -f src/client/linux/minidump_writer/$(DEPDIR)/pe_file.Po + -rm -f src/common/$(DEPDIR)/client_linux_linux_client_unittest_shlib-memory_allocator_unittest.Po + -rm -f src/common/$(DEPDIR)/convert_UTF.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-byte_cursor_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-convert_UTF.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_cfi_to_module_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_cu_to_module_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_line_to_module_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-dwarf_range_list_handler.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-language.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-memory_range_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-module.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-module_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-path_helper.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-stabs_reader.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-stabs_reader_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-stabs_to_module.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-stabs_to_module_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-string_conversion.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-string_conversion_unittest.Po + -rm -f src/common/$(DEPDIR)/dumper_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cfi_to_module.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_cu_to_module.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-dwarf_line_to_module.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-language.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-md5.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-module.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-path_helper.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_reader.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-stabs_to_module.Po + -rm -f src/common/$(DEPDIR)/mac_macho_reader_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/md5.Po + -rm -f src/common/$(DEPDIR)/path_helper.Po + -rm -f src/common/$(DEPDIR)/processor_minidump_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_address_list_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_amd64_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_arm64_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_arm_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_mips64_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_mips_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_riscv64_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_riscv_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_stackwalker_x86_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/processor_synth_minidump_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/safe_math_unittest-safe_math_unittest.Po + -rm -f src/common/$(DEPDIR)/string_conversion.Po + -rm -f src/common/$(DEPDIR)/test_assembler_unittest-test_assembler.Po + -rm -f src/common/$(DEPDIR)/test_assembler_unittest-test_assembler_unittest.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-language.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-module.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-path_helper.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_reader.Po + -rm -f src/common/$(DEPDIR)/tools_linux_dump_syms_dump_syms-stabs_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-language.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-md5.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-module.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-path_helper.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_reader.Po + -rm -f src/common/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-stabs_to_module.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-bytereader_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-cfi_assembler.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2diehandler_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_cfi_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-dwarf2reader_die_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/dumper_unittest-elf_reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/dwarf2reader_lineinfo_unittest-dwarf2reader_lineinfo_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/dwarf2reader_splitfunctions_unittest-dwarf2reader_splitfunctions_unittest.Po + -rm -f src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-bytereader.Po + -rm -f src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-cfi_assembler.Po + -rm -f src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2diehandler.Po + -rm -f src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-dwarf2reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/mac_macho_reader_unittest-elf_reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-bytereader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2diehandler.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dwarf2reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-bytereader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2diehandler.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dwarf2reader.Po + -rm -f src/common/dwarf/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-elf_reader.Po + -rm -f src/common/linux/$(DEPDIR)/breakpad_getcontext.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-elf_core_dump.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_pipe.Po + -rm -f src/common/linux/$(DEPDIR)/client_linux_linux_client_unittest_shlib-scoped_tmpfile.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-crc32.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-dump_symbols_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-elf_core_dump_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-elf_symbols_to_module_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-elfutils.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-file_id.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-file_id_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-linux_libc_support.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-memory_mapped_file_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-safe_readlink_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf.Po + -rm -f src/common/linux/$(DEPDIR)/dumper_unittest-synth_elf_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/elf_core_dump.Po + -rm -f src/common/linux/$(DEPDIR)/elfutils.Po + -rm -f src/common/linux/$(DEPDIR)/file_id.Po + -rm -f src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader.Po + -rm -f src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-google_crashdump_uploader_test.Po + -rm -f src/common/linux/$(DEPDIR)/google_crashdump_uploader_test-libcurl_wrapper.Po + -rm -f src/common/linux/$(DEPDIR)/guid_creator.Po + -rm -f src/common/linux/$(DEPDIR)/http_upload.Po + -rm -f src/common/linux/$(DEPDIR)/libcurl_wrapper.Po + -rm -f src/common/linux/$(DEPDIR)/linux_libc_support.Po + -rm -f src/common/linux/$(DEPDIR)/memory_mapped_file.Po + -rm -f src/common/linux/$(DEPDIR)/safe_readlink.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_pipe.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_pipe_unittest-scoped_pipe_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_tmpfile.Po + -rm -f src/common/linux/$(DEPDIR)/scoped_tmpfile_unittest-scoped_tmpfile_unittest.Po + -rm -f src/common/linux/$(DEPDIR)/symbol_collector_client.Po + -rm -f src/common/linux/$(DEPDIR)/symbol_upload.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-crc32.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-dump_symbols.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elf_symbols_to_module.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-elfutils.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-file_id.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-linux_libc_support.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-memory_mapped_file.Po + -rm -f src/common/linux/$(DEPDIR)/tools_linux_dump_syms_dump_syms-safe_readlink.Po + -rm -f src/common/linux/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-crash_generator.Po + -rm -f src/common/linux/tests/$(DEPDIR)/dumper_unittest-crash_generator.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-arch_utilities.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-file_id.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_id.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_reader_unittest.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_utilities.Po + -rm -f src/common/mac/$(DEPDIR)/macho_reader_unittest-macho_walker.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-arch_utilities.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-dump_syms.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-file_id.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_id.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_reader.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_utilities.Po + -rm -f src/common/mac/$(DEPDIR)/tools_mac_dump_syms_dump_syms_mac-macho_walker.Po + -rm -f src/common/tests/$(DEPDIR)/client_linux_linux_client_unittest_shlib-file_utils.Po + -rm -f src/common/tests/$(DEPDIR)/dumper_unittest-file_utils.Po + -rm -f src/common/tests/$(DEPDIR)/mac_macho_reader_unittest-file_utils.Po + -rm -f src/processor/$(DEPDIR)/address_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/basic_code_modules.Po + -rm -f src/processor/$(DEPDIR)/basic_source_line_resolver.Po + -rm -f src/processor/$(DEPDIR)/basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.Po + -rm -f src/processor/$(DEPDIR)/call_stack.Po + -rm -f src/processor/$(DEPDIR)/cfi_frame_info.Po + -rm -f src/processor/$(DEPDIR)/cfi_frame_info_unittest-cfi_frame_info_unittest.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-basic_code_modules.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_context.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-dump_object.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-logging.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-minidump.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-pathname_stripper.Po + -rm -f src/processor/$(DEPDIR)/client_linux_linux_client_unittest_shlib-proc_maps_linux.Po + -rm -f src/processor/$(DEPDIR)/contained_range_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/convert_old_arm64_context.Po + -rm -f src/processor/$(DEPDIR)/disassembler_objdump.Po + -rm -f src/processor/$(DEPDIR)/disassembler_objdump_unittest-disassembler_objdump_unittest.Po + -rm -f src/processor/$(DEPDIR)/disassembler_x86.Po + -rm -f src/processor/$(DEPDIR)/disassembler_x86_unittest-disassembler_x86_unittest.Po + -rm -f src/processor/$(DEPDIR)/dump_context.Po + -rm -f src/processor/$(DEPDIR)/dump_object.Po + -rm -f src/processor/$(DEPDIR)/exploitability.Po + -rm -f src/processor/$(DEPDIR)/exploitability_linux.Po + -rm -f src/processor/$(DEPDIR)/exploitability_unittest-exploitability_unittest.Po + -rm -f src/processor/$(DEPDIR)/exploitability_win.Po + -rm -f src/processor/$(DEPDIR)/fast_source_line_resolver.Po + -rm -f src/processor/$(DEPDIR)/fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.Po + -rm -f src/processor/$(DEPDIR)/logging.Po + -rm -f src/processor/$(DEPDIR)/map_serializers_unittest-map_serializers_unittest.Po + -rm -f src/processor/$(DEPDIR)/microdump.Po + -rm -f src/processor/$(DEPDIR)/microdump_processor.Po + -rm -f src/processor/$(DEPDIR)/microdump_processor_unittest-microdump_processor_unittest.Po + -rm -f src/processor/$(DEPDIR)/microdump_stackwalk.Po + -rm -f src/processor/$(DEPDIR)/minidump.Po + -rm -f src/processor/$(DEPDIR)/minidump_dump.Po + -rm -f src/processor/$(DEPDIR)/minidump_processor.Po + -rm -f src/processor/$(DEPDIR)/minidump_processor_unittest-minidump_processor_unittest.Po + -rm -f src/processor/$(DEPDIR)/minidump_stackwalk.Po + -rm -f src/processor/$(DEPDIR)/minidump_unittest-minidump_unittest.Po + -rm -f src/processor/$(DEPDIR)/minidump_unittest-synth_minidump.Po + -rm -f src/processor/$(DEPDIR)/module_comparer.Po + -rm -f src/processor/$(DEPDIR)/module_serializer.Po + -rm -f src/processor/$(DEPDIR)/pathname_stripper.Po + -rm -f src/processor/$(DEPDIR)/pathname_stripper_unittest.Po + -rm -f src/processor/$(DEPDIR)/postfix_evaluator_unittest.Po + -rm -f src/processor/$(DEPDIR)/proc_maps_linux.Po + -rm -f src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux.Po + -rm -f src/processor/$(DEPDIR)/proc_maps_linux_unittest-proc_maps_linux_unittest.Po + -rm -f src/processor/$(DEPDIR)/process_state.Po + -rm -f src/processor/$(DEPDIR)/range_map_truncate_lower_unittest-range_map_truncate_lower_unittest.Po + -rm -f src/processor/$(DEPDIR)/range_map_truncate_upper_unittest-range_map_truncate_upper_unittest.Po + -rm -f src/processor/$(DEPDIR)/range_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/simple_symbol_supplier.Po + -rm -f src/processor/$(DEPDIR)/source_line_resolver_base.Po + -rm -f src/processor/$(DEPDIR)/stack_frame_cpu.Po + -rm -f src/processor/$(DEPDIR)/stack_frame_symbolizer.Po + -rm -f src/processor/$(DEPDIR)/stackwalk_common.Po + -rm -f src/processor/$(DEPDIR)/stackwalker.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_address_list.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_address_list_unittest-stackwalker_address_list_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_amd64.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_amd64_unittest-stackwalker_amd64_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_arm.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_arm64.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_arm64_unittest-stackwalker_arm64_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_arm_unittest-stackwalker_arm_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_mips.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_mips64_unittest-stackwalker_mips64_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_mips_unittest-stackwalker_mips_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_ppc.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_ppc64.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_riscv.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_riscv64.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_riscv64_unittest-stackwalker_riscv64_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_riscv_unittest-stackwalker_riscv_unittest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_selftest.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_sparc.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_x86.Po + -rm -f src/processor/$(DEPDIR)/stackwalker_x86_unittest-stackwalker_x86_unittest.Po + -rm -f src/processor/$(DEPDIR)/static_address_map_unittest-static_address_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/static_contained_range_map_unittest-static_contained_range_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/static_map_unittest-static_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/static_range_map_unittest-static_range_map_unittest.Po + -rm -f src/processor/$(DEPDIR)/symbolic_constants_win.Po + -rm -f src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump.Po + -rm -f src/processor/$(DEPDIR)/synth_minidump_unittest-synth_minidump_unittest.Po + -rm -f src/processor/$(DEPDIR)/tokenize.Po + -rm -f src/testing/googlemock/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gmock-all.Po + -rm -f src/testing/googlemock/src/$(DEPDIR)/libtesting_a-gmock-all.Po + -rm -f src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest-all.Po + -rm -f src/testing/googletest/src/$(DEPDIR)/client_linux_linux_client_unittest_shlib-gtest_main.Po + -rm -f src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest-all.Po + -rm -f src/testing/googletest/src/$(DEPDIR)/libtesting_a-gtest_main.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_implicit.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_insn.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_invariant.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_modrm.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_opcode_tables.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_operand.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_reg.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/ia32_settings.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_disasm.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_format.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_imm.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_insn.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_misc.Po + -rm -f src/third_party/libdisasm/$(DEPDIR)/x86_operand_list.Po + -rm -f src/tools/linux/core2md/$(DEPDIR)/core2md.Po + -rm -f src/tools/linux/core_handler/$(DEPDIR)/core_handler.Po + -rm -f src/tools/linux/dump_syms/$(DEPDIR)/dump_syms-dump_syms.Po + -rm -f src/tools/linux/md2core/$(DEPDIR)/minidump-2-core.Po + -rm -f src/tools/linux/md2core/$(DEPDIR)/minidump_2_core_unittest-minidump_memory_range_unittest.Po + -rm -f src/tools/linux/pid2md/$(DEPDIR)/pid2md.Po + -rm -f src/tools/linux/symupload/$(DEPDIR)/minidump_upload.Po + -rm -f src/tools/linux/symupload/$(DEPDIR)/sym_upload.Po + -rm -f src/tools/mac/dump_syms/$(DEPDIR)/dump_syms_mac-dump_syms_tool.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-local + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-dist_docDATA \ + uninstall-includecHEADERS uninstall-includeclHEADERS \ + uninstall-includeclcHEADERS uninstall-includecldwcHEADERS \ + uninstall-includeclhHEADERS uninstall-includeclmHEADERS \ + uninstall-includegbcHEADERS uninstall-includelssHEADERS \ + uninstall-includepHEADERS uninstall-libLIBRARIES \ + uninstall-libexecPROGRAMS uninstall-pkgconfigDATA + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \ + check-TESTS check-am clean clean-binPROGRAMS \ + clean-checkLIBRARIES clean-checkPROGRAMS clean-cscope \ + clean-generic clean-libLIBRARIES clean-libexecPROGRAMS \ + clean-noinstLIBRARIES clean-noinstPROGRAMS cscope \ + cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ + dist-zstd distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-tags distcleancheck \ + distdir distuninstallcheck dvi dvi-am html html-am info \ + info-am install install-am install-binPROGRAMS install-data \ + install-data-am install-dist_docDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-includecHEADERS \ + install-includeclHEADERS install-includeclcHEADERS \ + install-includecldwcHEADERS install-includeclhHEADERS \ + install-includeclmHEADERS install-includegbcHEADERS \ + install-includelssHEADERS install-includepHEADERS install-info \ + install-info-am install-libLIBRARIES install-libexecPROGRAMS \ + install-man install-pdf install-pdf-am install-pkgconfigDATA \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-local pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-dist_docDATA \ + uninstall-includecHEADERS uninstall-includeclHEADERS \ + uninstall-includeclcHEADERS uninstall-includecldwcHEADERS \ + uninstall-includeclhHEADERS uninstall-includeclmHEADERS \ + uninstall-includegbcHEADERS uninstall-includelssHEADERS \ + uninstall-includepHEADERS uninstall-libLIBRARIES \ + uninstall-libexecPROGRAMS uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +mostlyclean-local: + -find src -name '*.dwo' -exec rm -f {} + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/OWNERS b/OWNERS new file mode 100644 index 0000000..2fde281 --- /dev/null +++ b/OWNERS @@ -0,0 +1,13 @@ +# Sorted alphabetically. +# Please see README.md for contact info. + +ivanpe@chromium.org +jperaza@chromium.org +mark@chromium.org +nbilling@google.com +primiano@chromium.org +saugustine@google.com +rsesek@chromium.org +ted@mielczarek.org +thestig@chromium.org +vapier@chromium.org diff --git a/README.ANDROID b/README.ANDROID new file mode 100644 index 0000000..30959ed --- /dev/null +++ b/README.ANDROID @@ -0,0 +1,139 @@ +Google Breakpad for Android +=========================== + +This document explains how to use the Google Breakpad client library +on Android, and later generate valid stack traces from the minidumps +it generates. + +This release supports ARM, x86 and MIPS based Android systems. +This release requires NDK release r11c or higher. + +I. Building the client library: +=============================== + +The Android client is built as a static library that you can +link into your own Android native code. There are two ways to +build it: + +I.1. Building with ndk-build: +----------------------------- + +If you're using the ndk-build build system, you can follow +these simple steps: + + 1/ Include android/google_breakpad/Android.mk from your own + project's Android.mk + + This can be done either directly, or using ndk-build's + import-module feature. + + 2/ Link the library to one of your modules by using: + + LOCAL_STATIC_LIBRARIES += breakpad_client + +NOTE: The client library requires a C++ STL implementation, + which you can select with APP_STL in your Application.mk + + It has been tested succesfully with both STLport and GNU libstdc++ + + +I.2. Building with a standalone Android toolchain: +-------------------------------------------------- + +All you need to do is configure your build with the right 'host' +value, and disable the processor and tools, as in: + + $GOOGLE_BREAKPAD_PATH/configure --host=arm-linux-androideabi \ + --disable-processor \ + --disable-tools + make -j4 + +The library will be under src/client/linux/libbreakpad_client.a + +You can also use 'make check' to run the test suite on a connected +Android device. This requires the Android 'adb' tool to be in your +path. + +II. Using the client library in Android: +======================================== + +The usage instructions are very similar to the Linux ones that are +found at https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/linux_starter_guide.md + +1/ You need to include "client/linux/handler/exception_handler.h" from a C++ + source file. + +2/ If you're not using ndk-build, you also need to: + + - add the following to your compiler include search paths: + $GOOGLE_BREAKPAD_PATH/src + $GOOGLE_BREAKPAD_PATH/src/common/android/include + + - add -llog to your linker flags + + Note that ndk-build does that for your automatically. + +3/ Keep in mind that there is no /tmp directory on Android. + + If you use the library from a regular Android applications, specify a + path under your app-specific storage directory. An alternative is to + store them on the SDCard, but this requires a specific permission. + +For a concrete example, see the sample test application under +android/sample_app. See its README for more information. + + +III. Getting a stack trace on the host: +======================================= + +This process is similar to other platforms, but here's a quick example: + +1/ Retrieve the minidumps on your development machine. + +2/ Dump the symbols for your native libraries with the 'dump_syms' tool. + This first requires building the host version of Google Breakpad, then + calling: + + dump_syms $PROJECT_PATH/obj/local/$ABI/libfoo.so > libfoo.so.sym + +3/ Create the symbol directory hierarchy. + + The first line of the generated libfoo.so.sym will have a "MODULE" + entry that carries a hexadecimal version number, e.g.: + + MODULE Linux arm D51B4A5504974FA6ECC1869CAEE3603B0 test_google_breakpad + + Note: The second field could be either 'Linux' or 'Android'. + + Extract the version number, and a 'symbol' directory, for example: + + $PROJECT_PATH/symbols/libfoo.so/$VERSION/ + + Copy/Move your libfoo.sym file there. + +4/ Invoke minidump_stackwalk to create the stack trace: + + minidump_stackwalk $MINIDUMP_FILE $PROJECT_PATH/symbols + +Note that various helper scripts can be found on the web to automate these +steps. + +IV. Verifying the Android build library: +======================================== + +If you modify Google Breakpad and want to check that it still works correctly +on Android, please run the android/run-checks.sh script which will do all +necessary verifications for you. This includes: + + - Rebuilding the full host binaries. + - Rebuilding the full Android binaries with configure/make. + - Rebuilding the client library unit tests, and running them on a device. + - Rebuilding the client library with ndk-build. + - Building, installing and running a test crasher program on a device. + - Extracting the corresponding minidump, dumping the test program symbols + and generating a stack trace. + - Checking the generated stack trace for valid source locations. + +For more details, please run: + + android/run-checks.sh --help-all diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..31be0ba --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1273 @@ +# generated automatically by aclocal 1.16.5 -*- Autoconf -*- + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, +[m4_warning([this file was generated for autoconf 2.71. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.16' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.16.5], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.16.5])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Copyright (C) 2011-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [AC_LANG_PUSH([C]) + am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + AC_LANG_POP([C])]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + +# Figure out how to run the assembler. -*- Autoconf -*- + +# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_AS +# ---------- +AC_DEFUN([AM_PROG_AS], +[# By default we simply use the C compiler to build assembly code. +AC_REQUIRE([AC_PROG_CC]) +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS +AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) +AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? + done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll need in +# order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +m4_ifdef([_$0_ALREADY_INIT], + [m4_fatal([$0 expanded multiple times +]m4_defn([_$0_ALREADY_INIT]))], + [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +AC_SUBST([CTAGS]) +if test -z "$ETAGS"; then + ETAGS=etags +fi +AC_SUBST([ETAGS]) +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +AC_SUBST([CSCOPE]) + +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. +AC_DEFUN([AM_MAKE_INCLUDE], +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2021 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/ax_append_compile_flags.m4]) +m4_include([m4/ax_append_flag.m4]) +m4_include([m4/ax_check_compile_flag.m4]) +m4_include([m4/ax_check_define.m4]) +m4_include([m4/ax_cxx_compile_stdcxx.m4]) +m4_include([m4/ax_pthread.m4]) +m4_include([m4/ax_require_defined.m4]) diff --git a/android/common-functions.sh b/android/common-functions.sh new file mode 100644 index 0000000..8a01717 --- /dev/null +++ b/android/common-functions.sh @@ -0,0 +1,371 @@ +# Copyright 2012 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Collection of common shell functions for 'run-checks.sh' et 'test-shell.sh' + +# All internal variables and functions use an underscore as a prefix +# (e.g. _VERBOSE, _ALL_CLEANUPS, etc..). + +# Sanitize the environment +export LANG=C +export LC_ALL=C + +if [ "$BASH_VERSION" ]; then + set -o posix +fi + +# Utility functions + +_ALL_CLEANUPS= + +# Register a function to be called when the script exits, even in case of +# Ctrl-C, logout, etc. +# $1: function name. +atexit () { + if [ -z "$_ALL_CLEANUPS" ]; then + _ALL_CLEANUPS=$1 + # Ensure a clean exit when the script is: + # - Exiting normally (EXIT) + # - Interrupted by Ctrl-C (INT) + # - Interrupted by log out (HUP) + # - Being asked to quit nicely (TERM) + # - Being asked to quit and dump core (QUIT) + trap "_exit_cleanups \$?" EXIT INT HUP QUIT TERM + else + _ALL_CLEANUPS="$_ALL_CLEANUPS $1" + fi +} + +# Called on exit if at least one function was registered with atexit +# $1: final exit status code +_exit_cleanups () { + local CLEANUP CLEANUPS + # Ignore calls to atexit during cleanups + CLEANUPS=$_ALL_CLEANUPS + _ALL_CLEANUPS= + for CLEANUP in $CLEANUPS; do + ($CLEANUP) + done + exit "$@" +} + + + + +# Dump a panic message then exit. +# $1+: message +panic () { + echo "ERROR: $@" >&2 + exit 1 +} + +# If the previous command failed, dump a panic message then exit. +# $1+: message. +fail_panic () { + if [ $? != 0 ]; then + panic "$@" + fi; +} + +_VERBOSE=0 + +# Increase verbosity for dump/log/run/run2 functions +increase_verbosity () { + _VERBOSE=$(( $_VERBOSE + 1 )) +} + +# Decrease verbosity +decrease_verbosity () { + _VERBOSE=$(( $_VERBOSE - 1 )) +} + +# Returns success iff verbosity level is higher than a specific value +# $1: verbosity level +verbosity_is_higher_than () { + [ "$_VERBOSE" -gt "$1" ] +} + +# Returns success iff verbosity level is lower than a specific value +# $1: verbosity level +verbosity_is_lower_than () { + [ "$_VERBOSE" -le "$1" ] +} + +# Dump message to stdout, unless verbosity is < 0, i.e. --quiet was called +# $1+: message +dump () { + if [ "$_VERBOSE" -ge 0 ]; then + printf "%s\n" "$*" + fi +} + +# If --verbose was used, dump a message to stdout. +# $1+: message +log () { + if [ "$_VERBOSE" -ge 1 ]; then + printf "%s\n" "$*" + fi +} + +_RUN_LOG= + +# Set a run log file that can be used to collect the output of commands that +# are not displayed. +set_run_log () { + _RUN_LOG=$1 +} + +# Run a command. Output depends on $_VERBOSE: +# $_VERBOSE <= 0: Run command, store output into the run log +# $_VERBOSE >= 1: Dump command, run it, output goest to stdout +# Note: Ideally, the command's output would go to the run log for $_VERBOSE >= 1 +# but the 'tee' tool doesn't preserve the status code of its input pipe +# in case of error. +run () { + local LOGILE + if [ "$_RUN_LOG" ]; then + LOGFILE=$_RUN_LOG + else + LOGFILE=/dev/null + fi + + if [ "$_VERBOSE" -ge 1 ]; then + echo "COMMAND: $@" + "$@" + else + "$@" >>$LOGFILE 2>&1 + fi +} + +# Same as run(), but only dump command output for $_VERBOSE >= 2 +run2 () { + local LOGILE + if [ "$_RUN_LOG" ]; then + LOGFILE=$_RUN_LOG + else + LOGFILE=/dev/null + fi + + if [ "$_VERBOSE" -ge 1 ]; then + echo "COMMAND: $@" + fi + if [ "$_VERBOSE" -ge 2 ]; then + "$@" + else + "$@" >>$LOGFILE 2>&1 + fi +} + +# Extract number of cores to speed up the builds +# Out: number of CPU cores +get_core_count () { + case $(uname -s) in + Linux) + grep -c -e '^processor' /proc/cpuinfo + ;; + Darwin) + sysctl -n hw.ncpu + ;; + CYGWIN*|*_NT-*) + echo $NUMBER_OF_PROCESSORS + ;; + *) + echo 1 + ;; + esac +} + + +# Check for the Android ADB program. +# +# On success, return nothing, but updates internal variables so later calls to +# adb_shell, adb_push, etc.. will work. You can get the path to the ADB program +# with adb_get_program if needed. +# +# On failure, returns 1, and updates the internal adb error message, which can +# be retrieved with adb_get_error. +# +# $1: optional ADB program path. +# Return: success or failure. +_ADB= +_ADB_STATUS= +_ADB_ERROR= + +adb_check () { + # First, try to find the executable in the path, or the SDK install dir. + _ADB=$1 + if [ -z "$_ADB" ]; then + _ADB=$(which adb 2>/dev/null) + if [ -z "$_ADB" -a "$ANDROID_SDK_ROOT" ]; then + _ADB=$ANDROID_SDK_ROOT/platform-tools/adb + if [ ! -f "$_ADB" ]; then + _ADB= + fi + fi + if [ -z "$_ADB" ]; then + _ADB_STATUS=1 + _ADB_ERROR="The Android 'adb' tool is not in your path." + return 1 + fi + fi + + log "Found ADB program: $_ADB" + + # Check that it works correctly + local ADB_VERSION + ADB_VERSION=$("$_ADB" version 2>/dev/null) + case $ADB_VERSION in + "Android Debug Bridge "*) # Pass + log "Found ADB version: $ADB_VERSION" + ;; + *) # Fail + _ADB_ERROR="Your ADB binary reports a bad version ($ADB_VERSION): $_ADB" + _ADB_STATUS=1 + return 1 + esac + + _ADB_STATUS=0 + return 0 +} + + +# Return the path to the Android ADB program, if correctly detected. +# On failure, return the empty string. +# Out: ADB program path (or empty on failure) +# Return: success or failure. +adb_get_program () { + # Return cached value as soon as possible. + if [ -z "$_ADB_STATUS" ]; then + adb_check $1 + fi + echo "$_ADB" + return $_ADB_STATUS +} + +# Return the error corresponding to the last ADB function failure. +adb_get_error () { + echo "$_ADB_ERROR" +} + +# Check that there is one device connected through ADB. +# In case of failure, use adb_get_error to know why this failed. +# $1: Optional adb program path +# Return: success or failure. +_ADB_DEVICE= +_ADB_DEVICE_STATUS= +adb_check_device () { + if [ "$_ADB_DEVICE_STATUS" ]; then + return $_ADB_DEVICE_STATUS + fi + + # Check for ADB. + if ! adb_check $1; then + _ADB_DEVICE_STATUS=$_ADB_STATUS + return 1 + fi + + local ADB_DEVICES NUM_DEVICES FINGERPRINT + + # Count the number of connected devices. + ADB_DEVICES=$("$_ADB" devices 2>/dev/null | awk '$2 == "device" { print $1; }') + NUM_DEVICES=$(echo "$ADB_DEVICES" | wc -l) + case $NUM_DEVICES in + 0) + _ADB_ERROR="No Android device connected. Please connect one to your machine." + _ADB_DEVICE_STATUS=1 + return 1 + ;; + 1) # Pass + # Ensure the same device will be called in later adb_shell calls. + export ANDROID_SERIAL=$ADB_DEVICES + ;; + *) # 2 or more devices. + if [ "$ANDROID_SERIAL" ]; then + ADB_DEVICES=$ANDROID_SERIAL + NUM_DEVICES=1 + else + _ADB_ERROR="More than one Android device connected. \ +Please define ANDROID_SERIAL in your environment" + _ADB_DEVICE_STATUS=1 + return 1 + fi + ;; + esac + + _ADB_DEVICE_STATUS=0 + _ADB_DEVICE=$ADB_DEVICES + + FINGERPRINT=$(adb_shell getprop ro.build.fingerprint) + log "Using ADB device: $ANDROID_SERIAL ($FINGERPRINT)" + return 0 +} + +# The 'adb shell' command is pretty hopeless, try to make sense of it by: +# 1/ Removing trailing \r from line endings. +# 2/ Ensuring the function returns the command's status code. +# +# $1+: Command +# Out: command output (stdout + stderr combined) +# Return: command exit status +adb_shell () { + local RET ADB_LOG + # Check for ADB device. + adb_check_device || return 1 + ADB_LOG=$(mktemp "${TMPDIR:-/tmp}/adb-XXXXXXXX") + "$_ADB" shell "$@" ";" echo \$? > "$ADB_LOG" 2>&1 + sed -i -e 's![[:cntrl:]]!!g' "$ADB_LOG" # Remove \r. + RET=$(sed -e '$!d' "$ADB_LOG") # Last line contains status code. + sed -e '$d' "$ADB_LOG" # Print everything except last line. + rm -f "$ADB_LOG" + return $RET +} + +# Push a file to a device. +# $1: source file path +# $2: device target file path +# Return: success or failure. +adb_push () { + adb_check_device || return 1 + run "$_ADB" push "$1" "$2" +} + +# Pull a file from a device +# $1: device file path +# $2: target host file path +# Return: success or failure. +adb_pull () { + adb_check_device || return 1 + run "$_ADB" pull "$1" "$2" +} + +# Same as adb_push, but will panic if the operations didn't succeed. +adb_install () { + adb_push "$@" + fail_panic "Failed to install $1 to the Android device at $2" +} + diff --git a/android/google_breakpad/Android.mk b/android/google_breakpad/Android.mk new file mode 100644 index 0000000..6324365 --- /dev/null +++ b/android/google_breakpad/Android.mk @@ -0,0 +1,104 @@ +# Copyright 2012 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# ndk-build module definition for the Google Breakpad client library +# +# To use this file, do the following: +# +# 1/ Include this file from your own Android.mk, either directly +# or with through the NDK's import-module function. +# +# 2/ Use the client static library in your project with: +# +# LOCAL_STATIC_LIBRARIES += breakpad_client +# +# 3/ In your source code, include "src/client/linux/exception_handler.h" +# and use the Linux instructions to use it. +# +# This module works with either the STLport or GNU libstdc++, but you need +# to select one in your Application.mk +# + +# The top Google Breakpad directory. +# We assume this Android.mk to be under 'android/google_breakpad' + +LOCAL_PATH := $(call my-dir)/../.. + +# Defube the client library module, as a simple static library that +# exports the right include path / linker flags to its users. + +include $(CLEAR_VARS) + +LOCAL_MODULE := breakpad_client + +LOCAL_CPP_EXTENSION := .cc + +# Breakpad uses inline ARM assembly that requires the library +# to be built in ARM mode. Otherwise, the build will fail with +# cryptic assembler messages like: +# Compile++ thumb : google_breakpad_client <= crash_generation_client.cc +# /tmp/cc8aMSoD.s: Assembler messages: +# /tmp/cc8aMSoD.s:132: Error: invalid immediate: 288 is out of range +# /tmp/cc8aMSoD.s:244: Error: invalid immediate: 296 is out of range +LOCAL_ARM_MODE := arm + +# List of client source files, directly taken from Makefile.am +LOCAL_SRC_FILES := \ + src/client/linux/crash_generation/crash_generation_client.cc \ + src/client/linux/dump_writer_common/thread_info.cc \ + src/client/linux/dump_writer_common/ucontext_reader.cc \ + src/client/linux/handler/exception_handler.cc \ + src/client/linux/handler/minidump_descriptor.cc \ + src/client/linux/log/log.cc \ + src/client/linux/microdump_writer/microdump_writer.cc \ + src/client/linux/minidump_writer/linux_dumper.cc \ + src/client/linux/minidump_writer/linux_ptrace_dumper.cc \ + src/client/linux/minidump_writer/minidump_writer.cc \ + src/client/linux/minidump_writer/pe_file.cc \ + src/client/minidump_file_writer.cc \ + src/common/convert_UTF.cc \ + src/common/md5.cc \ + src/common/string_conversion.cc \ + src/common/linux/breakpad_getcontext.S \ + src/common/linux/elfutils.cc \ + src/common/linux/file_id.cc \ + src/common/linux/guid_creator.cc \ + src/common/linux/linux_libc_support.cc \ + src/common/linux/memory_mapped_file.cc \ + src/common/linux/safe_readlink.cc + +LOCAL_C_INCLUDES := $(LOCAL_PATH)/src/common/android/include \ + $(LOCAL_PATH)/src \ + $(LSS_PATH) + +LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES) +LOCAL_EXPORT_LDLIBS := -llog + +include $(BUILD_STATIC_LIBRARY) + +# Done. diff --git a/android/run-checks.sh b/android/run-checks.sh new file mode 100644 index 0000000..0a41a65 --- /dev/null +++ b/android/run-checks.sh @@ -0,0 +1,554 @@ +#!/bin/sh +# Copyright 2012 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Sanitize the environment +export LANG=C +export LC_ALL=C + +if [ "$BASH_VERSION" ]; then + set -o posix +fi + +PROGDIR=$(dirname "$0") +PROGDIR=$(cd "$PROGDIR" && pwd) +PROGNAME=$(basename "$0") + +. $PROGDIR/common-functions.sh + +DEFAULT_ABI="armeabi" +VALID_ABIS="armeabi armeabi-v7a x86 mips" + +ABI= +ADB= +ALL_TESTS= +ENABLE_M32= +HELP= +HELP_ALL= +NDK_DIR= +NO_CLEANUP= +NO_DEVICE= +NUM_JOBS=$(get_core_count) +TMPDIR= + +for opt do + # The following extracts the value if the option is like --name=. + optarg=$(expr -- $opt : '^--[^=]*=\(.*\)$') + case $opt in + --abi=*) ABI=$optarg;; + --adb=*) ADB=$optarg;; + --all-tests) ALL_TESTS=true;; + --enable-m32) ENABLE_M32=true;; + --help|-h|-?) HELP=TRUE;; + --help-all) HELP_ALL=true;; + --jobs=*) NUM_JOBS=$optarg;; + --ndk-dir=*) NDK_DIR=$optarg;; + --tmp-dir=*) TMPDIR=$optarg;; + --no-cleanup) NO_CLEANUP=true;; + --no-device) NO_DEVICE=true;; + --quiet) decrease_verbosity;; + --verbose) increase_verbosity;; + -*) panic "Invalid option '$opt', see --help for details.";; + *) panic "This script doesn't take any parameters. See --help for details." + ;; + esac +done + +if [ "$HELP" -o "$HELP_ALL" ]; then + echo "\ + Usage: $PROGNAME [options] + + This script is used to check that your Google Breakpad source tree can + be properly built for Android, and that the client library and host tools + work properly together. +" + if [ "$HELP_ALL" ]; then + echo "\ + In more details, this script will: + + - Rebuild the host version of Google Breakpad in a temporary + directory (with the Auto-tools based build system). + + - Rebuild the Android client library with the Google Breakpad build + system (using autotools/configure). This requires that you define + ANDROID_NDK_ROOT in your environment to point to a valid Android NDK + installation directory, or use the --ndk-dir= option. + + - Rebuild the Android client library and a test crashing program with the + Android NDK build system (ndk-build). + + - Require an Android device connected to your machine, and the 'adb' + tool in your path. They are used to: + + - Install and run a test crashing program. + - Extract the corresponding minidump from the device. + - Dump the symbols from the test program on the host with 'dump_syms' + - Generate a stack trace with 'minidump_stackwalk' + - Check the stack trace content for valid source file locations. + + You can however skip this requirement and only test the builds by using + the --no-device flag. + + By default, all generated files will be created in a temporary directory + that is removed when the script completion. If you want to inspect the + files, use the --no-cleanup option. + + Finally, use --verbose to increase the verbosity level, this will help + you see which exact commands are being issues and their result. Use the + flag twice for even more output. Use --quiet to decrease verbosity + instead and run the script silently. + + If you have a device connected, the script will probe it to determine + its primary CPU ABI, and build the test program for it. You can however + use the --abi= option to override this (this can be useful to check + the secondary ABI, e.g. using --abi=armeabi to check that such a program + works correctly on an ARMv7-A device). + + If you don't have a device connected, the test program will be built (but + not run) with the default '$DEFAULT_ABI' ABI. Again, you can use + --abi= to override this. Valid ABI names are: + + $VALID_ABIS + + The script will only run the client library unit test on the device + by default. You can use --all-tests to also build and run the unit + tests for the Breakpad tools and processor, but be warned that this + adds several minutes of testing time. --all-tests will also run the + host unit tests suite. +" + + fi # HELP_ALL + + echo "\ + Valid options: + + --help|-h|-? Display this message. + --help-all Display extended help. + --enable-m32 Build 32-bit version of host tools. + --abi= Specify target CPU ABI [auto-detected]. + --jobs= Run build tasks in parallel [$NUM_JOBS]. + --ndk-dir= Specify NDK installation directory. + --tmp-dir= Specify temporary directory (will be wiped-out). + --adb= Specify adb program path. + --no-cleanup Don't remove temporary directory after completion. + --no-device Do not try to detect devices, nor run crash test. + --all-tests Run all unit tests (i.e. tools and processor ones too). + --verbose Increase verbosity. + --quiet Decrease verbosity." + + exit 0 +fi + +TESTAPP_DIR=$PROGDIR/sample_app + +# Select NDK install directory. +if [ -z "$NDK_DIR" ]; then + if [ -z "$ANDROID_NDK_ROOT" ]; then + panic "Please define ANDROID_NDK_ROOT in your environment, or use \ +--ndk-dir=." + fi + NDK_DIR="$ANDROID_NDK_ROOT" + log "Found NDK directory: $NDK_DIR" +else + log "Using NDK directory: $NDK_DIR" +fi +# Small sanity check. +NDK_BUILD="$NDK_DIR/ndk-build" +if [ ! -f "$NDK_BUILD" ]; then + panic "Your NDK directory is not valid (missing ndk-build): $NDK_DIR" +fi + +# Ensure the temporary directory is deleted on exit, except if the --no-cleanup +# option is used. + +clean_tmpdir () { + if [ "$TMPDIR" ]; then + if [ -z "$NO_CLEANUP" ]; then + log "Cleaning up: $TMPDIR" + rm -rf "$TMPDIR" + else + dump "Temporary directory contents preserved: $TMPDIR" + fi + fi + exit "$@" +} + +atexit clean_tmpdir + +# If --tmp-dir= is not used, create a temporary directory. +# Otherwise, start by cleaning up the user-provided path. +if [ -z "$TMPDIR" ]; then + TMPDIR=$(mktemp -d /tmp/$PROGNAME.XXXXXXXX) + fail_panic "Can't create temporary directory!" + log "Using temporary directory: $TMPDIR" +else + if [ ! -d "$TMPDIR" ]; then + mkdir -p "$TMPDIR" + fail_panic "Can't create temporary directory: $TMPDIR" + else + log "Cleaning up temporary directory: $TMPDIR" + rm -rf "$TMPDIR"/* + fail_panic "Cannot cleanup temporary directory!" + fi +fi + +if [ -z "$NO_DEVICE" ]; then + if ! adb_check_device $ADB; then + echo "$(adb_get_error)" + echo "Use --no-device to build the code without running any tests." + exit 1 + fi +fi + +BUILD_LOG="$TMPDIR/build.log" +RUN_LOG="$TMPDIR/run.log" +CRASH_LOG="$TMPDIR/crash.log" + +set_run_log "$RUN_LOG" + +TMPHOST="$TMPDIR/host-local" + +cd "$TMPDIR" + +# Build host version of the tools +dump "Building host binaries." +CONFIGURE_FLAGS= +if [ "$ENABLE_M32" ]; then + CONFIGURE_FLAGS="$CONFIGURE_FLAGS --enable-m32" +fi +( + run mkdir "$TMPDIR/build-host" && + run cd "$TMPDIR/build-host" && + run2 "$PROGDIR/../configure" --prefix="$TMPHOST" $CONFIGURE_FLAGS && + run2 make -j$NUM_JOBS install +) +fail_panic "Can't build host binaries!" + +if [ "$ALL_TESTS" ]; then + dump "Running host unit tests." + ( + run cd "$TMPDIR/build-host" && + run2 make -j$NUM_JOBS check + ) + fail_panic "Host unit tests failed!!" +fi + +TMPBIN=$TMPHOST/bin + +# Generate a stand-alone NDK toolchain + +# Extract CPU ABI and architecture from device, if any. +if adb_check_device; then + DEVICE_ABI=$(adb_shell getprop ro.product.cpu.abi) + DEVICE_ABI2=$(adb_shell getprop ro.product.cpu.abi2) + if [ -z "$DEVICE_ABI" ]; then + panic "Can't extract ABI from connected device!" + fi + if [ "$DEVICE_ABI2" ]; then + dump "Found device ABIs: $DEVICE_ABI $DEVICE_ABI2" + else + dump "Found device ABI: $DEVICE_ABI" + DEVICE_ABI2=$DEVICE_ABI + fi + + # If --abi= is used, check that the device supports it. + if [ "$ABI" -a "$DEVICE_ABI" != "$ABI" -a "$DEVICE_ABI2" != "$ABI" ]; then + dump "ERROR: Device ABI(s) do not match --abi command-line value ($ABI)!" + panic "Please use --no-device to skip device tests." + fi + + if [ -z "$ABI" ]; then + ABI=$DEVICE_ABI + dump "Using CPU ABI: $ABI (device)" + else + dump "Using CPU ABI: $ABI (command-line)" + fi +else + if [ -z "$ABI" ]; then + # No device connected, choose default ABI + ABI=$DEFAULT_ABI + dump "Using CPU ABI: $ABI (default)" + else + dump "Using CPU ABI: $ABI (command-line)" + fi +fi + +# Check the ABI value +VALID= +for VALID_ABI in $VALID_ABIS; do + if [ "$ABI" = "$VALID_ABI" ]; then + VALID=true + break + fi +done + +if [ -z "$VALID" ]; then + panic "Unknown CPU ABI '$ABI'. Valid values are: $VALID_ABIS" +fi + +# Extract architecture name from ABI +case $ABI in + armeabi*) ARCH=arm;; + *) ARCH=$ABI;; +esac + +# Extract GNU configuration name +case $ARCH in + arm) + GNU_CONFIG=arm-linux-androideabi + ;; + x86) + GNU_CONFIG=i686-linux-android + ;; + mips) + GNU_CONFIG=mipsel-linux-android + ;; + *) + GNU_CONFIG="$ARCH-linux-android" + ;; +esac + +# Generate standalone NDK toolchain installation +NDK_STANDALONE="$TMPDIR/ndk-$ARCH-toolchain" +echo "Generating NDK standalone toolchain installation" +mkdir -p "$NDK_STANDALONE" +# NOTE: The --platform=android-9 is required to provide for GTest. +run "$NDK_DIR/build/tools/make-standalone-toolchain.sh" \ + --arch="$ARCH" \ + --platform=android-9 \ + --install-dir="$NDK_STANDALONE" +fail_panic "Can't generate standalone NDK toolchain installation!" + +# Rebuild the client library, processor and tools with the auto-tools based +# build system. Even though it's not going to be used, this checks that this +# still works correctly. +echo "Building full Android binaries with configure/make" +TMPTARGET="$TMPDIR/target-local" +( + PATH="$NDK_STANDALONE/bin:$PATH" + run mkdir "$TMPTARGET" && + run mkdir "$TMPDIR"/build-target && + run cd "$TMPDIR"/build-target && + run2 "$PROGDIR"/../configure --prefix="$TMPTARGET" \ + --host="$GNU_CONFIG" && + run2 make -j$NUM_JOBS install +) +fail_panic "Could not rebuild Android binaries!" + +# Build and/or run unit test suite. +# If --no-device is used, only rebuild it, otherwise, run in on the +# connected device. +if [ "$NO_DEVICE" ]; then + ACTION="Building" + # This is a trick to force the Makefile to ignore running the scripts. + TESTS_ENVIRONMENT="TESTS_ENVIRONMENT=true" +else + ACTION="Running" + TESTS_ENVIRONMENT= +fi + +( + PATH="$NDK_STANDALONE/bin:$PATH" + run cd "$TMPDIR"/build-target && + # Reconfigure to only run the client unit test suite. + # This one should _never_ fail. + dump "$ACTION Android client library unit tests." + run2 "$PROGDIR"/../configure --prefix="$TMPTARGET" \ + --host="$GNU_CONFIG" \ + --disable-tools \ + --disable-processor && + run make -j$NUM_JOBS check $TESTS_ENVIRONMENT || exit $? + + if [ "$ALL_TESTS" ]; then + dump "$ACTION Tools and processor unit tests." + # Reconfigure to run the processor and tools tests. + # Most of these fail for now, so do not worry about it. + run2 "$PROGDIR"/../configure --prefix="$TMPTARGET" \ + --host="$GNU_CONFIG" && + run make -j$NUM_JOBS check $TESTS_ENVIRONMENT + if [ $? != 0 ]; then + dump "Tools and processor unit tests failed as expected. \ +Use --verbose for results." + fi + fi +) +fail_panic "Client library unit test suite failed!" + +# Copy sources to temporary directory +PROJECT_DIR=$TMPDIR/project +dump "Copying test program sources to: $PROJECT_DIR" +run cp -r "$TESTAPP_DIR" "$PROJECT_DIR" && +run rm -rf "$PROJECT_DIR/obj" && +run rm -rf "$PROJECT_DIR/libs" +fail_panic "Could not copy test program sources to: $PROJECT_DIR" + +# Build the test program with ndk-build. +dump "Building test program with ndk-build" +export NDK_MODULE_PATH="$PROGDIR" +NDK_BUILD_FLAGS="-j$NUM_JOBS" +if verbosity_is_higher_than 1; then + NDK_BUILD_FLAGS="$NDK_BUILD_FLAGS NDK_LOG=1 V=1" +fi +run "$NDK_DIR/ndk-build" -C "$PROJECT_DIR" $NDK_BUILD_FLAGS APP_ABI=$ABI +fail_panic "Can't build test program!" + +# Unless --no-device was used, stop right here if ADB isn't in the path, +# or there is no connected device. +if [ "$NO_DEVICE" ]; then + dump "Done. Please connect a device to run all tests!" + clean_exit 0 +fi + +# Push the program to the device. +TESTAPP=test_google_breakpad +TESTAPP_FILE="$PROJECT_DIR/libs/$ABI/test_google_breakpad" +if [ ! -f "$TESTAPP_FILE" ]; then + panic "Device requires '$ABI' binaries. None found!" +fi + +# Run the program there +dump "Installing test program on device" +DEVICE_TMP=/data/local/tmp +adb_push "$TESTAPP_FILE" "$DEVICE_TMP/" +fail_panic "Cannot push test program to device!" + +dump "Running test program on device" +adb_shell cd "$DEVICE_TMP" "&&" ./$TESTAPP > "$CRASH_LOG" 2>/dev/null +if [ $? = 0 ]; then + panic "Test program did *not* crash as expected!" +fi +if verbosity_is_higher_than 0; then + echo -n "Crash log: " + cat "$CRASH_LOG" +fi + +# Extract minidump from device +MINIDUMP_NAME=$(awk '$1 == "Dump" && $2 == "path:" { print $3; }' "$CRASH_LOG") +MINIDUMP_NAME=$(basename "$MINIDUMP_NAME") +if [ -z "$MINIDUMP_NAME" ]; then + panic "Test program didn't write minidump properly!" +fi + +dump "Extracting minidump: $MINIDUMP_NAME" +adb_pull "$DEVICE_TMP/$MINIDUMP_NAME" . +fail_panic "Can't extract minidump!" + +dump "Parsing test program symbols" +if verbosity_is_higher_than 1; then + log "COMMAND: $TMPBIN/dump_syms \ + $PROJECT_DIR/obj/local/$ABI/$TESTAPP >$TESTAPP.sym" +fi +"$TMPBIN/dump_syms" "$PROJECT_DIR/obj/local/$ABI/$TESTAPP" > $TESTAPP.sym +fail_panic "dump_syms doesn't work!" + +VERSION=$(awk '$1 == "MODULE" { print $4; }' $TESTAPP.sym) +dump "Found module version: $VERSION" +if [ -z "$VERSION" ]; then + echo "ERROR: Can't find proper module version from symbol dump!" + head -n5 $TESTAPP.sym + clean_exit 1 +fi + +run mkdir -p "$TMPDIR/symbols/$TESTAPP/$VERSION" +run mv $TESTAPP.sym "$TMPDIR/symbols/$TESTAPP/$VERSION/" + +dump "Generating stack trace" +# Don't use 'run' to be able to send stdout and stderr to two different files. +log "COMMAND: $TMPBIN/minidump_stackwalk $MINIDUMP_NAME symbols" +"$TMPBIN/minidump_stackwalk" $MINIDUMP_NAME \ + "$TMPDIR/symbols" \ + > "$BUILD_LOG" 2>>"$RUN_LOG" +fail_panic "minidump_stackwalk doesn't work!" + +dump "Checking stack trace content" + +if verbosity_is_higher_than 1; then + cat "$BUILD_LOG" +fi + +# The generated stack trace should look like the following: +# +# Thread 0 (crashed) +# 0 test_google_breakpad!crash [test_breakpad.cpp : 17 + 0x4] +# r4 = 0x00015530 r5 = 0xbea2cbe4 r6 = 0xffffff38 r7 = 0xbea2cb5c +# r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0x00000000 +# sp = 0xbea2cb50 lr = 0x00009025 pc = 0x00008f84 +# Found by: given as instruction pointer in context +# 1 test_google_breakpad!main [test_breakpad.cpp : 25 + 0x3] +# r4 = 0x00015530 r5 = 0xbea2cbe4 r6 = 0xffffff38 r7 = 0xbea2cb5c +# r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0x00000000 +# sp = 0xbea2cb50 pc = 0x00009025 +# Found by: call frame info +# 2 libc.so + 0x164e5 +# r4 = 0x00008f64 r5 = 0xbea2cc34 r6 = 0x00000001 r7 = 0xbea2cc3c +# r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0x00000000 +# sp = 0xbea2cc18 pc = 0x400c34e7 +# Found by: call frame info +# ... +# +# The most important part for us is ensuring that the source location could +# be extracted, so look at the 'test_breakpad.cpp' references here. +# +# First, extract all the lines with test_google_breakpad! in them, and +# dump the corresponding crash location. +# +# Note that if the source location can't be extracted, the second field +# will only be 'test_google_breakpad' without the exclamation mark. +# +LOCATIONS=$(awk '$2 ~ "^test_google_breakpad!.*" { print $3; }' "$BUILD_LOG") + +if [ -z "$LOCATIONS" ]; then + if verbosity_is_lower_than 1; then + cat "$BUILD_LOG" + fi + panic "No source location found in stack trace!" +fi + +# Now check that they all match "[" +BAD_LOCATIONS= +for LOCATION in $LOCATIONS; do + case $LOCATION in + # Escape the opening bracket, or some shells like Dash will not + # match them properly. + \[*.cpp|\[*.cc|\[*.h) # These are valid source locations in our executable + ;; + *) # Everything else is not! + BAD_LOCATIONS="$BAD_LOCATIONS $LOCATION" + ;; + esac +done + +if [ "$BAD_LOCATIONS" ]; then + dump "ERROR: Generated stack trace doesn't contain valid source locations:" + cat "$BUILD_LOG" + echo "Bad locations are: $BAD_LOCATIONS" + exit 1 +fi + +echo "All clear! Congratulations." + diff --git a/android/sample_app/README b/android/sample_app/README new file mode 100644 index 0000000..aa19dbb --- /dev/null +++ b/android/sample_app/README @@ -0,0 +1,32 @@ +This is a sample Android executable that can be used to test the +Google Breakpad client library on Android. + +Its purpose is simply to crash and generate a minidump under /data/local/tmp. + +Build instructions: + + cd android/sample_app + $NDK/ndk-build + + Where $NDK points to a valid Android NDK installation. + +Usage instructions: + + After buildind the test program, send it to a device, then run it as + the shell UID: + + adb push libs/armeabi/test_google_breakpad /data/local/tmp + adb shell /data/local/tmp/test_google_breakpad + + This will simply crash after dumping the name of the generated minidump + file. + + See jni/test_breakpad.cpp for details. + + Use 'armeabi-v7a' instead of 'armeabi' above to test the ARMv7-A version + of the binary. + +Note: + If you plan to use the library in a regular Android application, store + the minidump files either to your app-specific directory, or to the SDCard + (the latter requiring a specific permission). diff --git a/android/sample_app/jni/Android.mk b/android/sample_app/jni/Android.mk new file mode 100644 index 0000000..4193527 --- /dev/null +++ b/android/sample_app/jni/Android.mk @@ -0,0 +1,43 @@ +# Copyright 2012 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := test_google_breakpad +LOCAL_SRC_FILES := test_breakpad.cpp +LOCAL_STATIC_LIBRARIES += breakpad_client +include $(BUILD_EXECUTABLE) + +# If NDK_MODULE_PATH is defined, import the module, otherwise do a direct +# includes. This allows us to build in all scenarios easily. +ifneq ($(NDK_MODULE_PATH),) + $(call import-module,google_breakpad) +else + include $(LOCAL_PATH)/../../google_breakpad/Android.mk +endif diff --git a/android/sample_app/jni/Application.mk b/android/sample_app/jni/Application.mk new file mode 100644 index 0000000..29e4a4a --- /dev/null +++ b/android/sample_app/jni/Application.mk @@ -0,0 +1,31 @@ +# Copyright 2012 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +APP_STL := stlport_static +APP_ABI := all +APP_CXXFLAGS := -std=c++11 -D__STDC_LIMIT_MACROS diff --git a/android/sample_app/jni/test_breakpad.cpp b/android/sample_app/jni/test_breakpad.cpp new file mode 100644 index 0000000..481cbe7 --- /dev/null +++ b/android/sample_app/jni/test_breakpad.cpp @@ -0,0 +1,56 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +#include "client/linux/handler/exception_handler.h" +#include "client/linux/handler/minidump_descriptor.h" + +namespace { + +bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, + void* context, + bool succeeded) { + printf("Dump path: %s\n", descriptor.path()); + return succeeded; +} + +void Crash() { + volatile int* a = reinterpret_cast(NULL); + *a = 1; +} + +} // namespace + +int main(int argc, char* argv[]) { + google_breakpad::MinidumpDescriptor descriptor("."); + google_breakpad::ExceptionHandler eh(descriptor, NULL, DumpCallback, + NULL, true, -1); + Crash(); + return 0; +} diff --git a/android/test-driver b/android/test-driver new file mode 100644 index 0000000..eaaac6b --- /dev/null +++ b/android/test-driver @@ -0,0 +1,131 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +# Slightly modified for Android, see ANDROID comment below. + +scriptversion=2012-06-27.10; # UTC + +# Copyright (C) 2011-2013 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat < $log_file 2>&1 +progdir=$(dirname "$0") +"$progdir/test-shell.sh" "$@" > $log_file 2>&1 +estatus=$? +if test $enable_hard_errors = no && test $estatus -eq 99; then + estatus=1 +fi + +case $estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/android/test-shell.sh b/android/test-shell.sh new file mode 100644 index 0000000..abdf36a --- /dev/null +++ b/android/test-shell.sh @@ -0,0 +1,130 @@ +#!/bin/sh +# +# Copyright 2012 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# A special shell wrapper that can be used to run the Google Breakpad unit +# tests on a connected Android device. +# +# This is designed to be called from the Makefile during 'make check' +# + +PROGDIR=$(dirname "$0") +PROGNAME=$(basename "$0") +. $PROGDIR/common-functions.sh + +# Extract test program name first. +TEST_PROGRAM=$1 +shift + +if [ -z "$TEST_PROGRAM" ]; then + panic "No test program/script name on the command-line!" +fi + +if [ ! -f "$TEST_PROGRAM" ]; then + panic "Can't find test program/script: $TEST_PROGRAM" +fi + +# Create test directory on the device +TEST_DIR=/data/local/tmp/test-google-breakpad-$$ +adb_shell mkdir "$TEST_DIR" || + panic "Can't create test directory on device: $TEST_DIR" + +# Ensure that it is always removed when the script exits. +clean_test_dir () { + # Don't care about success/failure, use '$ADB shell' directly. + adb_shell rm -r "$TEST_DIR" +} + +atexit clean_test_dir + +TEST_PROGRAM_NAME=$(basename "$TEST_PROGRAM") +TEST_PROGRAM_DIR=$(dirname "$TEST_PROGRAM") + +# Handle special case(s) here. +DATA_FILES= +case $TEST_PROGRAM_NAME in + linux_client_unittest) + # linux_client_unittest will call another executable at runtime, ensure + # it is installed too. + adb_install "$TEST_PROGRAM_DIR/linux_dumper_unittest_helper" "$TEST_DIR" + # linux_client_unittest loads a shared library at runtime, ensure it is + # installed too. + adb_install "$TEST_PROGRAM_DIR/linux_client_unittest_shlib" "$TEST_DIR" + ;; + basic_source_line_resolver_unittest) + DATA_FILES="module1.out \ + module2.out \ + module3_bad.out \ + module4_bad.out" + ;; + exploitability_unittest) + DATA_FILES="scii_read_av.dmp \ + ascii_read_av_block_write.dmp \ + ascii_read_av_clobber_write.dmp \ + ascii_read_av_conditional.dmp \ + ascii_read_av_non_null.dmp \ + ascii_read_av_then_jmp.dmp \ + ascii_read_av_xchg_write.dmp \ + ascii_write_av.dmp \ + ascii_write_av_arg_to_call.dmp \ + exec_av_on_stack.dmp \ + null_read_av.dmp \ + null_write_av.dmp \ + read_av.dmp \ + null_read_av.dmp \ + write_av_non_null.dmp" + ;; + fast_source_line_resolver_unittest) + DATA_FILES="module0.out \ + module1.out \ + module2.out \ + module3_bad.out \ + module4_bad.out" + ;; + minidump_processor_unittest|minidump_unittest) + DATA_FILES="src/processor/testdata/minidump2.dmp" + ;; +esac + +# Install the data files, their path is relative to the environment +# variable 'srcdir' +for FILE in $DATA_FILES; do + FILEDIR=src/processor/testdata/$(dirname "$FILE") + adb_shell mkdir -p "$TEST_DIR/$FILEDIR" + adb_install "${srcdir:-.}/$FILE" "$TEST_DIR"/"$FILE" +done + +# Copy test program to device +adb_install "$TEST_PROGRAM" "$TEST_DIR" + +# Run it +adb_shell "cd $TEST_DIR && LD_LIBRARY_PATH=. ./$TEST_PROGRAM_NAME $@" + +# Note: exiting here will call cleanup_exit which will remove the temporary +# files from the device. diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..3cf5ba4 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,42 @@ +version: '{build}' + +environment: + GYP_MSVS_VERSION: 2013 + +platform: + - Win32 + +configuration: + - Debug + - Release + +# Use the source dir expected by gclient. +clone_folder: c:\projects\breakpad\src + +# Before checkout. +init: + - cd %APPVEYOR_BUILD_FOLDER%\..\.. + - appveyor DownloadFile https://storage.googleapis.com/chrome-infra/depot_tools.zip + - 7z -bd x depot_tools.zip -odepot_tools + - depot_tools\update_depot_tools + - cd %APPVEYOR_BUILD_FOLDER% + +# After checkout. +install: + - PATH C:\projects\depot_tools;%PATH% + - cd %APPVEYOR_BUILD_FOLDER%\.. + - gclient config https://%APPVEYOR_REPO_PROVIDER%.com/%APPVEYOR_REPO_NAME% --unmanaged --name=src + - gclient sync + +build_script: + - cd %APPVEYOR_BUILD_FOLDER% + - msbuild src\client\windows\breakpad_client.sln /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" /m /verbosity:normal + - msbuild src\tools\windows\tools_windows.sln /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" /m /verbosity:normal + +test_script: + - src\client\windows\%CONFIGURATION%\client_tests.exe + - src\tools\windows\%CONFIGURATION%\dump_syms_unittest.exe + +artifacts: + - path: '**\*.exe' + - path: '**\*.lib' diff --git a/autotools/ar-lib b/autotools/ar-lib new file mode 100644 index 0000000..c349042 --- /dev/null +++ b/autotools/ar-lib @@ -0,0 +1,271 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2019-07-04.01; # UTC + +# Copyright (C) 2010-2021 Free Software Foundation, Inc. +# Written by Peter Rosin . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin | msys) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat <. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/* | msys/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/autotools/config.guess b/autotools/config.guess new file mode 100644 index 0000000..f772702 --- /dev/null +++ b/autotools/config.guess @@ -0,0 +1,1701 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2021 Free Software Foundation, Inc. + +timestamp='2021-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +me=$(echo "$0" | sed -e 's,.*/,,') + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2021 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown +UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown +UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown +UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + EOF + eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)) + case "$UNAME_MACHINE_ARCH" in + aarch64eb) machine=aarch64_be-unknown ;; + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,') + endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p') + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr") + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2) + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//') + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//') + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//') + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}') + ;; + *5.*) + UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}') + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1) + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "$( (/bin/universe) 2>/dev/null)" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case $(/usr/bin/uname -p) in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" + exit ;; + sun4*:SunOS:*:*) + case "$(/usr/bin/arch -k)" in + Series*|S4*) + UNAME_RELEASE=$(uname -v) + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null) + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "$(/bin/arch)" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') && + SYSTEM_NAME=$("$dummy" "$dummyarg") && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=$(/usr/bin/uname -p) + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if test -x /usr/bin/oslevel ; then + IBM_REV=$(/usr/bin/oslevel) + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }') + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if test -x /usr/bin/lslpp ; then + IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/) + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//') + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if test -x /usr/bin/getconf; then + sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null) + sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null) + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy") + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if test "$HP_ARCH" = hppa2.0w + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//') + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if test -x /usr/sbin/sysversion ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz) + FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///') + FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/') + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///') + FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/') + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=$(uname -p) + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf + fi + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=$(/usr/bin/uname -p) + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-pc-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')" + exit ;; + *:GNU:*:*) + # the GNU system + echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC" + exit ;; + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI="$LIBC"x32 + fi + fi + echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//') + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case $(/bin/uname -X | grep "^Machine") in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=$(sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //')) + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=$( (uname -p) 2>/dev/null) + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if test -d /usr/nec; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + arm64:Darwin:*:*) + echo aarch64-apple-darwin"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=$(uname -p) + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=$(uname -p) + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + # shellcheck disable=SC2154 + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=$( (uname -p) 2>/dev/null) + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + exit ;; +esac + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null); + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&2 </dev/null || echo unknown) +uname -r = $( (uname -r) 2>/dev/null || echo unknown) +uname -s = $( (uname -s) 2>/dev/null || echo unknown) +uname -v = $( (uname -v) 2>/dev/null || echo unknown) + +/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null) +/bin/uname -X = $( (/bin/uname -X) 2>/dev/null) + +hostinfo = $( (hostinfo) 2>/dev/null) +/bin/universe = $( (/bin/universe) 2>/dev/null) +/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null) +/bin/arch = $( (/bin/arch) 2>/dev/null) +/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null) +/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null) + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/autotools/config.sub b/autotools/config.sub new file mode 100644 index 0000000..4d89efe --- /dev/null +++ b/autotools/config.sub @@ -0,0 +1,1876 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2021 Free Software Foundation, Inc. + +timestamp='2021-01-07' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=$(echo "$0" | sed -e 's,.*/,,') + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2021 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=$(echo "$1" | sed -e 's/86.*/86/') + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + mipsEE* | ee) + cpu=mips64r5900el + vendor=scei + case $os in + linux*) + ;; + *) + os=elf + ;; + esac + ;; + iop) + cpu=mipsel + vendor=scei + os=irx + ;; + dvp) + cpu=dvp + vendor=scei + os=elf + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=$(echo "$basic_machine" | sed 's/-.*//') + ;; + + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x$basic_os != x +then + +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|') + ;; + os2-emx) + kernel=os2 + os=$(echo $basic_os | sed -e 's|os2-emx|emx|') + ;; + nto-qnx*) + kernel=nto + os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|') + ;; + *-*) + # shellcheck disable=SC2162 + IFS="-" read kernel os <&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/autotools/depcomp b/autotools/depcomp new file mode 100644 index 0000000..715e343 --- /dev/null +++ b/autotools/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2021 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/autotools/install-sh b/autotools/install-sh new file mode 100644 index 0000000..ec298b5 --- /dev/null +++ b/autotools/install-sh @@ -0,0 +1,541 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2020-11-14.01; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -p pass -p to $cpprog. + -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -p) cpprog="$cpprog -p";; + + -s) stripcmd=$stripprog;; + + -S) backupsuffix="$2" + shift;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/autotools/ltmain.sh b/autotools/ltmain.sh new file mode 100644 index 0000000..a72f2fd --- /dev/null +++ b/autotools/ltmain.sh @@ -0,0 +1,8406 @@ +# Generated from ltmain.m4sh. + +# ltmain.sh (GNU libtool) 2.2.6b +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print informational messages (default) +# --version print version information +# -h, --help print short or long help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.2.6b +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=2.2.6b +TIMESTAMP="" +package_revision=1.3017 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# NLS nuisances: We save the old values to restore during execute mode. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done + +$lt_unset CDPATH + + + + + +: ${CP="cp -f"} +: ${ECHO="echo"} +: ${EGREP="/bin/grep -E"} +: ${FGREP="/bin/grep -F"} +: ${GREP="/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/bin/sed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +# Generated shell functions inserted here. + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +# In the unlikely event $progname began with a '-', it would play havoc with +# func_echo (imagine progname=-n), so we prepend ./ in that case: +func_dirname_and_basename "$progpath" +progname=$func_basename_result +case $progname in + -*) progname=./$progname ;; +esac + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname${mode+: }$mode: $*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` + done + my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "X$my_tmpdir" | $Xsed +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "X$1" | $Xsed \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + + + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $SED -n '/^# Usage:/,/# -h/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + $ECHO + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help +# Echo long help message to standard output and exit. +func_help () +{ + $SED -n '/^# Usage:/,/# Report bugs to/ { + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + }' < "$progpath" + exit $? +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + func_error "missing argument for $1" + exit_cmd=exit +} + +exit_cmd=: + + + + + +# Check that we have a working $ECHO. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell, and then maybe $ECHO will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# Parse options once, thoroughly. This comes as soon as possible in +# the script to make things like `libtool --version' happen quickly. +{ + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Parse non-mode specific arguments: + while test "$#" -gt 0; do + opt="$1" + shift + + case $opt in + --config) func_config ;; + + --debug) preserve_args="$preserve_args $opt" + func_echo "enabling shell trace mode" + opt_debug='set -x' + $opt_debug + ;; + + -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break + execute_dlfiles="$execute_dlfiles $1" + shift + ;; + + --dry-run | -n) opt_dry_run=: ;; + --features) func_features ;; + --finish) mode="finish" ;; + + --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break + case $1 in + # Valid mode arguments: + clean) ;; + compile) ;; + execute) ;; + finish) ;; + install) ;; + link) ;; + relink) ;; + uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; + esac + + mode="$1" + shift + ;; + + --preserve-dup-deps) + opt_duplicate_deps=: ;; + + --quiet|--silent) preserve_args="$preserve_args $opt" + opt_silent=: + ;; + + --verbose| -v) preserve_args="$preserve_args $opt" + opt_silent=false + ;; + + --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break + preserve_args="$preserve_args $opt $1" + func_enable_tag "$1" # tagname is set here + shift + ;; + + # Separate optargs to long options: + -dlopen=*|--mode=*|--tag=*) + func_opt_split "$opt" + set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} + shift + ;; + + -\?|-h) func_usage ;; + --help) opt_help=: ;; + --version) func_version ;; + + -*) func_fatal_help "unrecognized option \`$opt'" ;; + + *) nonopt="$opt" + break + ;; + esac + done + + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_duplicate_deps + ;; + esac + + # Having warned about all mis-specified options, bail out if + # anything was wrong. + $exit_cmd $EXIT_FAILURE +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +## ----------- ## +## Main. ## +## ----------- ## + +$opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + test -z "$mode" && func_fatal_error "error: you must specify a MODE." + + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$mode' for more information." +} + + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_ltwrapper_scriptname_result="" + if func_ltwrapper_executable_p "$1"; then + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + fi +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case "$@ " in + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T <?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + removelist="$removelist $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist="$removelist $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + command="$command -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { +test "$mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$mode'" + ;; + esac + + $ECHO + $ECHO "Try \`$progname --help' for more information about other modes." + + exit $? +} + + # Now that we've collected a possible --mode arg, show help if necessary + $opt_help && func_mode_help + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_quote_for_eval "$file" + args="$args $func_quote_for_eval_result" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + $ECHO "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + $ECHO "X----------------------------------------------------------------------" | $Xsed + $ECHO "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + $ECHO + $ECHO "If you ever happen to want to link against installed libraries" + $ECHO "in a given directory, LIBDIR, you must either use libtool, and" + $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" + $ECHO "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" + $ECHO " during execution" + fi + if test -n "$runpath_var"; then + $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" + $ECHO " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $ECHO + + $ECHO "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" + $ECHO "pages." + ;; + *) + $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + $ECHO "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS +} + +test "$mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $ECHO "X$nonopt" | $GREP shtool >/dev/null; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + install_prog="$install_prog$func_quote_for_eval_result" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog="$install_prog $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_verbose "extracting global C symbols from \`$progfile'" + $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + $ECHO >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +" + case $host in + *cygwin* | *mingw* | *cegcc* ) + $ECHO >> "$output_objdir/$my_dlsyms" "\ +/* DATA imports from DLLs on WIN32 con't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs. */" + lt_dlsym_const= ;; + *osf5*) + echo >> "$output_objdir/$my_dlsyms" "\ +/* This system does not cope well with relocations in const data */" + lt_dlsym_const= ;; + *) + lt_dlsym_const=const ;; + esac + + $ECHO >> "$output_objdir/$my_dlsyms" "\ +extern $lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +$lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + $ECHO >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) symtab_cflags="$symtab_cflags $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + + +# func_emit_wrapper_part1 [arg=no] +# +# Emit the first part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part1 () +{ + func_emit_wrapper_part1_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part1_arg1=$1 + fi + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + ECHO=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$ECHO works! + : + else + # Restart under the correct shell, and then maybe \$ECHO will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $ECHO "\ + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done +" +} +# end: func_emit_wrapper_part1 + +# func_emit_wrapper_part2 [arg=no] +# +# Emit the second part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part2 () +{ + func_emit_wrapper_part2_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part2_arg1=$1 + fi + + $ECHO "\ + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} +# end: func_emit_wrapper_part2 + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=no + if test -n "$1" ; then + func_emit_wrapper_arg1=$1 + fi + + # split this up so that func_emit_cwrapperexe_src + # can call each part independently. + func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" + func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" +} + + +# func_to_host_path arg +# +# Convert paths to host format when used with build tools. +# Intended for use with "native" mingw (where libtool itself +# is running under the msys shell), or in the following cross- +# build environments: +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# where wine is equipped with the `winepath' executable. +# In the native mingw case, the (msys) shell automatically +# converts paths for any non-msys applications it launches, +# but that facility isn't available from inside the cwrapper. +# Similar accommodations are necessary for $host mingw and +# $build cygwin. Calling this function does no harm for other +# $host/$build combinations not listed above. +# +# ARG is the path (on $build) that should be converted to +# the proper representation for $host. The result is stored +# in $func_to_host_path_result. +func_to_host_path () +{ + func_to_host_path_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + case $build in + *mingw* ) # actually, msys + # awkward: cmd appends spaces to result + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_path_tmp1=`( cmd //c echo "$1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_path_tmp1=`cygpath -w "$1"` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # Unfortunately, winepath does not exit with a non-zero + # error code, so we are forced to check the contents of + # stdout. On the other hand, if the command is not + # found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both + # error code of zero AND non-empty stdout, which explains + # the odd construction: + func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + else + # Allow warning below. + func_to_host_path_result="" + fi + ;; + esac + if test -z "$func_to_host_path_result" ; then + func_error "Could not determine host path corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_path_result="$1" + fi + ;; + esac + fi +} +# end: func_to_host_path + +# func_to_host_pathlist arg +# +# Convert pathlists to host format when used with build tools. +# See func_to_host_path(), above. This function supports the +# following $build/$host combinations (but does no harm for +# combinations not listed here): +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# +# Path separators are also converted from $build format to +# $host format. If ARG begins or ends with a path separator +# character, it is preserved (but converted to $host format) +# on output. +# +# ARG is a pathlist (on $build) that should be converted to +# the proper representation on $host. The result is stored +# in $func_to_host_pathlist_result. +func_to_host_pathlist () +{ + func_to_host_pathlist_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_to_host_pathlist_tmp2="$1" + # Once set for this call, this variable should not be + # reassigned. It is used in tha fallback case. + func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e 's|^:*||' -e 's|:*$||'` + case $build in + *mingw* ) # Actually, msys. + # Awkward: cmd appends spaces to result. + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # unfortunately, winepath doesn't convert pathlists + func_to_host_pathlist_result="" + func_to_host_pathlist_oldIFS=$IFS + IFS=: + for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do + IFS=$func_to_host_pathlist_oldIFS + if test -n "$func_to_host_pathlist_f" ; then + func_to_host_path "$func_to_host_pathlist_f" + if test -n "$func_to_host_path_result" ; then + if test -z "$func_to_host_pathlist_result" ; then + func_to_host_pathlist_result="$func_to_host_path_result" + else + func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" + fi + fi + fi + IFS=: + done + IFS=$func_to_host_pathlist_oldIFS + ;; + esac + if test -z "$func_to_host_pathlist_result" ; then + func_error "Could not determine the host path(s) corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This may break if $1 contains DOS-style drive + # specifications. The fix is not to complicate the expression + # below, but for the user to provide a working wine installation + # with winepath so that path translation in the cross-to-mingw + # case works properly. + lt_replace_pathsep_nix_to_dos="s|:|;|g" + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_replace_pathsep_nix_to_dos"` + fi + # Now, add the leading and trailing path separators back + case "$1" in + :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" + ;; + esac + case "$1" in + *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" + ;; + esac + ;; + esac + fi +} +# end: func_to_host_pathlist + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +# define setmode _setmode +#else +# include +# include +# ifdef __CYGWIN__ +# include +# define HAVE_SETENV +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +#ifdef _MSC_VER +# define S_IXUSR _S_IEXEC +# define stat _stat +# ifndef _INTPTR_T_DEFINED +# define intptr_t int +# endif +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifdef __CYGWIN__ +# define FOPEN_WB "wb" +#endif + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#undef LTWRAPPER_DEBUGPRINTF +#if defined DEBUGWRAPPER +# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args +static void +ltwrapper_debugprintf (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); +} +#else +# define LTWRAPPER_DEBUGPRINTF(args) +#endif + +const char *program_name = NULL; + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_fatal (const char *message, ...); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_opt_process_env_set (const char *arg); +void lt_opt_process_env_prepend (const char *arg); +void lt_opt_process_env_append (const char *arg); +int lt_split_name_value (const char *arg, char** name, char** value); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); + +static const char *script_text_part1 = +EOF + + func_emit_wrapper_part1 yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ "/' -e 's/$/\\n"/' + echo ";" + cat <"))); + for (i = 0; i < newargc; i++) + { + LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); + return 127; + } + return rval; +EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); + return rval; /* =127, but avoids unused variable warning */ +EOF + ;; + esac + + cat <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void *p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), + string) : NULL; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char) name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable (const char *path) +{ + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", + wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", + tmp_pathspec)); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + char *errstr = strerror (errno); + lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal ("Could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} + +void +lt_setenv (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", + (name ? name : ""), + (value ? value : ""))); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +int +lt_split_name_value (const char *arg, char** name, char** value) +{ + const char *p; + int len; + if (!arg || !*arg) + return 1; + + p = strchr (arg, (int)'='); + + if (!p) + return 1; + + *value = xstrdup (++p); + + len = strlen (arg) - strlen (*value); + *name = XMALLOC (char, len); + strncpy (*name, arg, len-1); + (*name)[len - 1] = '\0'; + + return 0; +} + +void +lt_opt_process_env_set (const char *arg) +{ + char *name = NULL; + char *value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); + } + + lt_setenv (name, value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_prepend (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_append (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 1); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? value : ""))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? value : ""))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + + +EOF +} +# end: func_emit_cwrapperexe_src + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) deplibs="$deplibs $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs="$weak_libs $arg" + prev= + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname '-L' '' "$arg" + dir=$func_stripname_result + if test -z "$dir"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" + linker_flags="$linker_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_duplicate_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + case $lib in + *.la) func_source "$lib" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs="$deplibs $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + dir=$func_stripname_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $ECHO + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because the file extensions .$libext of this argument makes me believe" + $ECHO "*** that it is just a static archive that I should not use here." + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) temp_rpath="$temp_rpath$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs="$notinst_deplibs $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + $ECHO + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $ECHO + $ECHO "*** And there doesn't seem to be a static archive available" + $ECHO "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $ECHO + $ECHO "*** Warning: This system can not link to static lib archive $lib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $ECHO "*** But as you try to build a module library, libtool will still create " + $ECHO "*** a static module, that should work as long as the dlopening application" + $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_dirname "$deplib" "" "." + dir="$func_dirname_result" + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + libobjs="$libobjs $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` + # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` + # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ + -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + done + fi + if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | + $GREP . >/dev/null; then + $ECHO + if test "X$deplibs_check_method" = "Xnone"; then + $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + else + $ECHO "*** Warning: inter-library dependencies are not known to be supported." + fi + $ECHO "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $ECHO + $ECHO "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + $ECHO "*** a static module, that should work as long as the dlopening" + $ECHO "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $ECHO "*** The inter-library dependencies that have been dropped here will be" + $ECHO "*** automatically added whenever a program is linked with this library" + $ECHO "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $ECHO + $ECHO "*** Since this library must not contain undefined symbols," + $ECHO "*** because either the platform does not support them or" + $ECHO "*** it was explicitly requested with -no-undefined," + $ECHO "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + delfiles="$delfiles $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + func_len " $cmd" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + $ECHO 'INPUT (' > $output + for obj in $save_libobjs + do + $ECHO "$obj" >> $output + done + $ECHO ')' >> $output + delfiles="$delfiles $output" + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + $ECHO "$obj" >> $output + done + delfiles="$delfiles $output" + output=$firstobj\"$file_list_spec$output\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles="$delfiles $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *cegcc) + # Disable wrappers for cegcc, we are cross compiling anyway. + wrappers_required=no + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $ECHO for shipping. + if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + oldobjs="$oldobjs $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $ECHO "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlfiles="$newdlfiles $libdir/$name" + ;; + *) newdlfiles="$newdlfiles $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlprefiles="$newdlprefiles $libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$mode" = link || test "$mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) RM="$RM $arg"; rmforce=yes ;; + -*) RM="$RM $arg" ;; + *) files="$files $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + rmfiles="$rmfiles $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$mode" = uninstall || test "$mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/autotools/missing b/autotools/missing new file mode 100644 index 0000000..1fe1611 --- /dev/null +++ b/autotools/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/autotools/root-test-driver b/autotools/root-test-driver new file mode 100644 index 0000000..66bf7eb --- /dev/null +++ b/autotools/root-test-driver @@ -0,0 +1,3 @@ +#!/bin/sh +# -E to keep the environment variables needed to run the tests. +exec sudo -E "$@" diff --git a/autotools/test-driver b/autotools/test-driver new file mode 100644 index 0000000..be73b80 --- /dev/null +++ b/autotools/test-driver @@ -0,0 +1,153 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 2011-2021 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <"$log_file" +"$@" >>"$log_file" 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>"$log_file" + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/breakpad-client.pc.in b/breakpad-client.pc.in new file mode 100644 index 0000000..fcd2fa2 --- /dev/null +++ b/breakpad-client.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/@PACKAGE_NAME@ + +Name: google-breakpad-client +Description: An open-source multi-platform crash reporting system +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lbreakpad_client @PTHREAD_LIBS@ +Cflags: -I${includedir} @PTHREAD_CFLAGS@ diff --git a/breakpad.pc.in b/breakpad.pc.in new file mode 100644 index 0000000..9aec9f8 --- /dev/null +++ b/breakpad.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/@PACKAGE_NAME@ + +Name: google-breakpad +Description: An open-source multi-platform crash reporting system +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lbreakpad @PTHREAD_LIBS@ +Cflags: -I${includedir} @PTHREAD_CFLAGS@ diff --git a/codereview.settings b/codereview.settings new file mode 100644 index 0000000..3f93733 --- /dev/null +++ b/codereview.settings @@ -0,0 +1,3 @@ +GERRIT_HOST: True +CODE_REVIEW_SERVER: chromium-review.googlesource.com +VIEW_VC: https://chromium.googlesource.com/breakpad/breakpad/+/ diff --git a/configure b/configure new file mode 100644 index 0000000..3442e79 --- /dev/null +++ b/configure @@ -0,0 +1,12104 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.71 for breakpad 0.1. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else \$as_nop + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : + +else \$as_nop + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" + if (eval "$as_required") 2>/dev/null +then : + as_have_required=yes +else $as_nop + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : + +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$as_shell as_have_required=yes + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : + break 2 +fi +fi + done;; + esac + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi + + + if test "x$CONFIG_SHELL" != x +then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + else + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and +$0: google-breakpad-dev@googlegroups.com about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='breakpad' +PACKAGE_TARNAME='breakpad' +PACKAGE_VERSION='0.1' +PACKAGE_STRING='breakpad 0.1' +PACKAGE_BUGREPORT='google-breakpad-dev@googlegroups.com' +PACKAGE_URL='' + +ac_unique_file="README.md" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_STDIO_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_c_list= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +TESTS_AS_ROOT_FALSE +TESTS_AS_ROOT_TRUE +RUSTC_DEMANGLE_LIBS +RUSTC_DEMANGLE_CFLAGS +SELFTEST_FALSE +SELFTEST_TRUE +GTEST_LIBS +GTEST_CFLAGS +GMOCK_LIBS +GMOCK_CFLAGS +SYSTEM_TEST_LIBS_FALSE +SYSTEM_TEST_LIBS_TRUE +DISABLE_TOOLS_FALSE +DISABLE_TOOLS_TRUE +DISABLE_PROCESSOR_FALSE +DISABLE_PROCESSOR_TRUE +X86_HOST_FALSE +X86_HOST_TRUE +ANDROID_HOST_FALSE +ANDROID_HOST_TRUE +LINUX_HOST_FALSE +LINUX_HOST_TRUE +WARN_CXXFLAGS +HAVE_CXX17 +HAVE_MEMFD_CREATE_FALSE +HAVE_MEMFD_CREATE_TRUE +HAVE_GETCONTEXT_FALSE +HAVE_GETCONTEXT_TRUE +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CC +ax_pthread_config +RANLIB +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +CPP +am__fastdepCCAS_FALSE +am__fastdepCCAS_TRUE +CCASDEPMODE +CCASFLAGS +CCAS +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +ac_ct_AR +AR +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +CSCOPE +ETAGS +CTAGS +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_maintainer_mode +enable_dependency_tracking +enable_m32 +enable_largefile +enable_processor +enable_tools +enable_system_test_libs +enable_selftest +with_rustc_demangle +enable_system_rustc_demangle +enable_zstd +with_tests_as_root +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CCAS +CCASFLAGS +CPP +CXX +CXXFLAGS +CCC +GMOCK_CFLAGS +GMOCK_LIBS +GTEST_CFLAGS +GTEST_LIBS +RUSTC_DEMANGLE_CFLAGS +RUSTC_DEMANGLE_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures breakpad 0.1 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/breakpad] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of breakpad 0.1:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-m32 Compile/build with -m32 (default is no) + --disable-largefile omit support for large files + --disable-processor Don't build processor library (default is no) + --disable-tools Don't build tool binaries (default is no) + --enable-system-test-libs + Use gtest/gmock/etc... from the system instead of + the local copies (default is local) + --enable-selftest Run extra tests with "make check" (may conflict with + optimizations) (default is no) + --enable-system-rustc-demangle + Link against the rustc-demangle library to demangle + Rust language symbols during symbol dumping (default + is no). This assumes that rustc-demangle is + installed in your sysroot, and all headers from it + are available in your standard include path + --enable-zstd Enable decompression of ELF sections with zstd + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-rustc-demangle=/path/to/rustc-demangle + Link against the rustc-demangle library to demangle + Rust language symbols during symbol dumping (default + is no) Pass the path to the crate root. + --with-tests-as-root Run the tests as root. Use this on platforms like + travis-ci.org that require root privileges to use + ptrace (default is no) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CCAS assembler compiler command (defaults to CC) + CCASFLAGS assembler compiler flags (defaults to CFLAGS) + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + GMOCK_CFLAGS + Compiler flags for gmock + GMOCK_LIBS Linker flags for gmock + GTEST_CFLAGS + Compiler flags for gtest + GTEST_LIBS Linker flags for gtest + RUSTC_DEMANGLE_CFLAGS + Compiler flags for rustc-demangle + RUSTC_DEMANGLE_LIBS + Linker flags for rustc-demangle + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +breakpad configure 0.1 +generated by GNU Autoconf 2.71 + +Copyright (C) 2021 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. */ + +#include +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by breakpad $as_me 0.1, which was +generated by GNU Autoconf 2.71. Invocation command line was + + $ $0$ac_configure_args_raw + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" + # Save into config.log some information that might help in debugging. + { + echo + + printf "%s\n" "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + printf "%s\n" "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + printf "%s\n" "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + printf "%s\n" "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +printf "%s\n" "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + ac_site_files="$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" +else + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" +fi + +for ac_site_file in $ac_site_files +do + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +# Test code for whether the C++ compiler supports C++98 (global declarations) +ac_cxx_conftest_cxx98_globals=' +// Does the compiler advertise C++98 conformance? +#if !defined __cplusplus || __cplusplus < 199711L +# error "Compiler does not advertise C++98 conformance" +#endif + +// These inclusions are to reject old compilers that +// lack the unsuffixed header files. +#include +#include + +// and are *not* freestanding headers in C++98. +extern void assert (int); +namespace std { + extern int strcmp (const char *, const char *); +} + +// Namespaces, exceptions, and templates were all added after "C++ 2.0". +using std::exception; +using std::strcmp; + +namespace { + +void test_exception_syntax() +{ + try { + throw "test"; + } catch (const char *s) { + // Extra parentheses suppress a warning when building autoconf itself, + // due to lint rules shared with more typical C programs. + assert (!(strcmp) (s, "test")); + } +} + +template struct test_template +{ + T const val; + explicit test_template(T t) : val(t) {} + template T add(U u) { return static_cast(u) + val; } +}; + +} // anonymous namespace +' + +# Test code for whether the C++ compiler supports C++98 (body of main) +ac_cxx_conftest_cxx98_main=' + assert (argc); + assert (! argv[0]); +{ + test_exception_syntax (); + test_template tt (2.0); + assert (tt.add (4) == 6.0); + assert (true && !false); +} +' + +# Test code for whether the C++ compiler supports C++11 (global declarations) +ac_cxx_conftest_cxx11_globals=' +// Does the compiler advertise C++ 2011 conformance? +#if !defined __cplusplus || __cplusplus < 201103L +# error "Compiler does not advertise C++11 conformance" +#endif + +namespace cxx11test +{ + constexpr int get_val() { return 20; } + + struct testinit + { + int i; + double d; + }; + + class delegate + { + public: + delegate(int n) : n(n) {} + delegate(): delegate(2354) {} + + virtual int getval() { return this->n; }; + protected: + int n; + }; + + class overridden : public delegate + { + public: + overridden(int n): delegate(n) {} + virtual int getval() override final { return this->n * 2; } + }; + + class nocopy + { + public: + nocopy(int i): i(i) {} + nocopy() = default; + nocopy(const nocopy&) = delete; + nocopy & operator=(const nocopy&) = delete; + private: + int i; + }; + + // for testing lambda expressions + template Ret eval(Fn f, Ret v) + { + return f(v); + } + + // for testing variadic templates and trailing return types + template auto sum(V first) -> V + { + return first; + } + template auto sum(V first, Args... rest) -> V + { + return first + sum(rest...); + } +} +' + +# Test code for whether the C++ compiler supports C++11 (body of main) +ac_cxx_conftest_cxx11_main=' +{ + // Test auto and decltype + auto a1 = 6538; + auto a2 = 48573953.4; + auto a3 = "String literal"; + + int total = 0; + for (auto i = a3; *i; ++i) { total += *i; } + + decltype(a2) a4 = 34895.034; +} +{ + // Test constexpr + short sa[cxx11test::get_val()] = { 0 }; +} +{ + // Test initializer lists + cxx11test::testinit il = { 4323, 435234.23544 }; +} +{ + // Test range-based for + int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, + 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; + for (auto &x : array) { x += 23; } +} +{ + // Test lambda expressions + using cxx11test::eval; + assert (eval ([](int x) { return x*2; }, 21) == 42); + double d = 2.0; + assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); + assert (d == 5.0); + assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); + assert (d == 5.0); +} +{ + // Test use of variadic templates + using cxx11test::sum; + auto a = sum(1); + auto b = sum(1, 2); + auto c = sum(1.0, 2.0, 3.0); +} +{ + // Test constructor delegation + cxx11test::delegate d1; + cxx11test::delegate d2(); + cxx11test::delegate d3(45); +} +{ + // Test override and final + cxx11test::overridden o1(55464); +} +{ + // Test nullptr + char *c = nullptr; +} +{ + // Test template brackets + test_template<::test_template> v(test_template(12)); +} +{ + // Unicode literals + char const *utf8 = u8"UTF-8 string \u2500"; + char16_t const *utf16 = u"UTF-8 string \u2500"; + char32_t const *utf32 = U"UTF-32 string \u2500"; +} +' + +# Test code for whether the C compiler supports C++11 (complete). +ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} +${ac_cxx_conftest_cxx11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + ${ac_cxx_conftest_cxx11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C++98 (complete). +ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" + +# Auxiliary files required by this configure script. +ac_aux_files="compile ar-lib missing install-sh config.guess config.sub" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}/autotools" + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + +am__api_version='1.16' + + + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test ${ac_cv_path_mkdir+y}; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='breakpad' + VERSION='0.1' + + +printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h + + +printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar plaintar pax cpio none' + +# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 +printf %s "checking whether UID '$am_uid' is supported by ustar format... " >&6; } + if test $am_uid -le $am_max_uid; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + _am_tools=none + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 +printf %s "checking whether GID '$am_gid' is supported by ustar format... " >&6; } + if test $am_gid -le $am_max_gid; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + _am_tools=none + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 +printf %s "checking how to create a ustar tar archive... " >&6; } + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_ustar-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + { echo "$as_me:$LINENO: $_am_tar --version" >&5 + ($_am_tar --version) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && break + done + am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x ustar -w "$$tardir"' + am__tar_='pax -L -x ustar -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H ustar -L' + am__tar_='find "$tardir" -print | cpio -o -H ustar -L' + am__untar='cpio -i -H ustar -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_ustar}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 + (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + rm -rf conftest.dir + if test -s conftest.tar; then + { echo "$as_me:$LINENO: $am__untar &5 + ($am__untar &5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 + (cat conftest.dir/file) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + if test ${am_cv_prog_tar_ustar+y} +then : + printf %s "(cached) " >&6 +else $as_nop + am_cv_prog_tar_ustar=$_am_tool +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 +printf "%s\n" "$am_cv_prog_tar_ustar" >&6; } + + + + + +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi + +if test -z "$ETAGS"; then + ETAGS=etags +fi + +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +ac_config_headers="$ac_config_headers src/config.h" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test ${enable_maintainer_mode+y} +then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else $as_nop + USE_MAINTAINER_MODE=no +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + + + + + + + + + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test ${enable_dependency_tracking+y} +then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else $as_nop + ac_file='' +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + + if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +printf %s "checking the archiver ($AR) interface... " >&6; } +if test ${am_cv_ar_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +printf "%s\n" "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + +# By default we simply use the C compiler to build assembly code. + +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS + + + +depcc="$CCAS" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CCAS_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CCAS_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CCAS_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CCAS_dependencies_compiler_type=none +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CCAS_dependencies_compiler_type" >&6; } +CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then + am__fastdepCCAS_TRUE= + am__fastdepCCAS_FALSE='#' +else + am__fastdepCCAS_TRUE='#' + am__fastdepCCAS_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +printf "%s\n" "$CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +printf "%s\n" "$ac_ct_CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 +printf %s "checking whether the compiler supports GNU C++... " >&6; } +if test ${ac_cv_cxx_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+y} +ac_save_CXXFLAGS=$CXXFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +printf %s "checking whether $CXX accepts -g... " >&6; } +if test ${ac_cv_prog_cxx_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +else $as_nop + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + +else $as_nop + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } +if test $ac_test_CXXFLAGS; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_prog_cxx_stdcxx=no +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 +printf %s "checking for $CXX option to enable C++11 features... " >&6; } +if test ${ac_cv_prog_cxx_cxx11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_cxx11=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx11_program +_ACEOF +for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx11" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx11" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 + ac_prog_cxx_stdcxx=cxx11 +fi +fi +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 +printf %s "checking for $CXX option to enable C++98 features... " >&6; } +if test ${ac_cv_prog_cxx_cxx98+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_cxx98=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx98_program +_ACEOF +for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx98=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx98" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx98" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx98" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx98" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + ac_prog_cxx_stdcxx=cxx98 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CXX_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +# Check whether --enable-m32 was given. +if test ${enable_m32+y} +then : + enableval=$enable_m32; +else $as_nop + enable_m32=no +fi + +if test "x$enable_m32" = xyes; then + CFLAGS="${CFLAGS} -m32" + CXXFLAGS="${CXXFLAGS} -m32" +fi + +# Check whether --enable-largefile was given. +if test ${enable_largefile+y} +then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +printf %s "checking for special C compiler options needed for large files... " >&6; } +if test ${ac_cv_sys_largefile_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO" +then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test ${ac_cv_sys_file_offset_bits+y} +then : + printf %s "(cached) " >&6 +else $as_nop + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } +if test ${ac_cv_sys_large_files+y} +then : + printf %s "(cached) " >&6 +else $as_nop + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +printf "%s\n" "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h +;; +esac +rm -rf conftest* + fi +fi + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 +printf %s "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char pthread_join (); +int +main (void) +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test x"$ax_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ;; + + *-darwin*) + acx_pthread_flags="-pthread $acx_pthread_flags" + ;; +esac + +if test x"$ax_pthread_ok" = xno; then +for flag in $ax_pthread_flags; do + + case $flag in + none) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +printf %s "checking whether pthreads work without any flags... " >&6; } + ;; + + -*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 +printf %s "checking whether pthreads work with $flag... " >&6; } + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ax_pthread_config+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" +fi +fi +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +printf "%s\n" "$ax_pthread_config" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 +printf %s "checking for the pthreads library -l$flag... " >&6; } + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + static void routine(void* a) {a=0;} + static void* start_routine(void* a) {return a;} +int +main (void) +{ +pthread_t th; pthread_attr_t attr; + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_create(&th,0,start_routine,0); + pthread_cleanup_pop(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +printf %s "checking for joinable pthread attribute... " >&6; } + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +int attr=$attr; return attr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + attr_name=$attr; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 +printf "%s\n" "$attr_name" >&6; } + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + +printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $attr_name" >>confdefs.h + + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 +printf %s "checking if more special flags are required for pthreads... " >&6; } + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 +printf "%s\n" "${flag}" >&6; } + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + for ac_prog in xlc_r cc_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +printf "%s\n" "$PTHREAD_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" + + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_pthread_ok" = xyes; then + +printf "%s\n" "#define HAVE_PTHREAD 1" >>confdefs.h + + : +else + ax_pthread_ok=no + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "a.out.h" "ac_cv_header_a_out_h" "$ac_includes_default" +if test "x$ac_cv_header_a_out_h" = xyes +then : + printf "%s\n" "#define HAVE_A_OUT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_MMAN_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/random.h" "ac_cv_header_sys_random_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_random_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_RANDOM_H 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "arc4random" "ac_cv_func_arc4random" +if test "x$ac_cv_func_arc4random" = xyes +then : + printf "%s\n" "#define HAVE_ARC4RANDOM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getcontext" "ac_cv_func_getcontext" +if test "x$ac_cv_func_getcontext" = xyes +then : + printf "%s\n" "#define HAVE_GETCONTEXT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getrandom" "ac_cv_func_getrandom" +if test "x$ac_cv_func_getrandom" = xyes +then : + printf "%s\n" "#define HAVE_GETRANDOM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "memfd_create" "ac_cv_func_memfd_create" +if test "x$ac_cv_func_memfd_create" = xyes +then : + printf "%s\n" "#define HAVE_MEMFD_CREATE 1" >>confdefs.h + +fi + + if test "x$ac_cv_func_getcontext" = xyes; then + HAVE_GETCONTEXT_TRUE= + HAVE_GETCONTEXT_FALSE='#' +else + HAVE_GETCONTEXT_TRUE='#' + HAVE_GETCONTEXT_FALSE= +fi + + if test "x$ac_cv_func_memfd_create" = xyes; then + HAVE_MEMFD_CREATE_TRUE= + HAVE_MEMFD_CREATE_FALSE='#' +else + HAVE_MEMFD_CREATE_TRUE='#' + HAVE_MEMFD_CREATE_FALSE= +fi + + + + ax_cxx_compile_alternatives="17 1z" ax_cxx_compile_cxx17_required=true + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + ac_success=no + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features by default" >&5 +printf %s "checking whether $CXX supports C++17 features by default... " >&6; } +if test ${ax_cv_cxx_compile_cxx17+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +// MSVC always sets __cplusplus to 199711L in older versions; newer versions +// only set it correctly if /Zc:__cplusplus is specified as well as a +// /std:c++NN switch: +// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +#elif __cplusplus < 201103L && !defined _MSC_VER + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; + + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + + + + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L && !defined _MSC_VER + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + + + + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201703L && !defined _MSC_VER + +#error "This is not a C++17 compiler" + +#else + +#include +#include +#include + +namespace cxx17 +{ + + namespace test_constexpr_lambdas + { + + constexpr int foo = [](){return 42;}(); + + } + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template + int multiply(Args... args) + { + return (args * ... * 1); + } + + template + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same, decltype(foo)>::value); + static_assert(std::is_same::value); + } + + namespace test_typename_in_template_template_parameter + { + + template typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + + namespace test_template_argument_deduction_for_class_templates + { + + template + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } + + namespace test_non_type_auto_template_parameters + { + + template + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + + namespace test_structured_bindings + { + + int arr[2] = { 1, 2 }; + std::pair pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } + + namespace test_exception_spec_type_system + { + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template + Bad + f(T*, T*); + + template + Good + f(T1*, T2*); + + static_assert (std::is_same_v); + + } + + namespace test_inline_variables + { + + template void f(T) + {} + + template inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus < 201703L && !defined _MSC_VER + + + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ax_cv_cxx_compile_cxx17=yes +else $as_nop + ax_cv_cxx_compile_cxx17=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx17" >&5 +printf "%s\n" "$ax_cv_cxx_compile_cxx17" >&6; } + if test x$ax_cv_cxx_compile_cxx17 = xyes; then + ac_success=yes + fi + + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + switch="-std=gnu++${alternative}" + cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_$switch" | $as_tr_sh` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features with $switch" >&5 +printf %s "checking whether $CXX supports C++17 features with $switch... " >&6; } +if eval test \${$cachevar+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CXX="$CXX" + CXX="$CXX $switch" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +// MSVC always sets __cplusplus to 199711L in older versions; newer versions +// only set it correctly if /Zc:__cplusplus is specified as well as a +// /std:c++NN switch: +// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +#elif __cplusplus < 201103L && !defined _MSC_VER + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; + + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + + + + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L && !defined _MSC_VER + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + + + + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201703L && !defined _MSC_VER + +#error "This is not a C++17 compiler" + +#else + +#include +#include +#include + +namespace cxx17 +{ + + namespace test_constexpr_lambdas + { + + constexpr int foo = [](){return 42;}(); + + } + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template + int multiply(Args... args) + { + return (args * ... * 1); + } + + template + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same, decltype(foo)>::value); + static_assert(std::is_same::value); + } + + namespace test_typename_in_template_template_parameter + { + + template typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + + namespace test_template_argument_deduction_for_class_templates + { + + template + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } + + namespace test_non_type_auto_template_parameters + { + + template + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + + namespace test_structured_bindings + { + + int arr[2] = { 1, 2 }; + std::pair pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } + + namespace test_exception_spec_type_system + { + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template + Bad + f(T*, T*); + + template + Good + f(T1*, T2*); + + static_assert (std::is_same_v); + + } + + namespace test_inline_variables + { + + template void f(T) + {} + + template inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus < 201703L && !defined _MSC_VER + + + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + eval $cachevar=yes +else $as_nop + eval $cachevar=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CXX="$ac_save_CXX" +fi +eval ac_res=\$$cachevar + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi + + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do + cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_$switch" | $as_tr_sh` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features with $switch" >&5 +printf %s "checking whether $CXX supports C++17 features with $switch... " >&6; } +if eval test \${$cachevar+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CXX="$CXX" + CXX="$CXX $switch" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +// MSVC always sets __cplusplus to 199711L in older versions; newer versions +// only set it correctly if /Zc:__cplusplus is specified as well as a +// /std:c++NN switch: +// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +#elif __cplusplus < 201103L && !defined _MSC_VER + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; + + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + + + + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L && !defined _MSC_VER + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + + + + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201703L && !defined _MSC_VER + +#error "This is not a C++17 compiler" + +#else + +#include +#include +#include + +namespace cxx17 +{ + + namespace test_constexpr_lambdas + { + + constexpr int foo = [](){return 42;}(); + + } + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template + int multiply(Args... args) + { + return (args * ... * 1); + } + + template + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same, decltype(foo)>::value); + static_assert(std::is_same::value); + } + + namespace test_typename_in_template_template_parameter + { + + template typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + + namespace test_template_argument_deduction_for_class_templates + { + + template + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } + + namespace test_non_type_auto_template_parameters + { + + template + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + + namespace test_structured_bindings + { + + int arr[2] = { 1, 2 }; + std::pair pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } + + namespace test_exception_spec_type_system + { + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template + Bad + f(T*, T*); + + template + Good + f(T1*, T2*); + + static_assert (std::is_same_v); + + } + + namespace test_inline_variables + { + + template void f(T) + {} + + template inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus < 201703L && !defined _MSC_VER + + + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + eval $cachevar=yes +else $as_nop + eval $cachevar=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CXX="$ac_save_CXX" +fi +eval ac_res=\$$cachevar + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + if test x$ax_cxx_compile_cxx17_required = xtrue; then + if test x$ac_success = xno; then + as_fn_error $? "*** A compiler with support for C++17 language features is required." "$LINENO" 5 + fi + fi + if test x$ac_success = xno; then + HAVE_CXX17=0 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++17 support was found" >&5 +printf "%s\n" "$as_me: No compiler with C++17 support was found" >&6;} + else + HAVE_CXX17=1 + +printf "%s\n" "#define HAVE_CXX17 1" >>confdefs.h + + fi + + + +WARN_CXXFLAGS= +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -Werror=unknown-warning-option" >&5 +printf %s "checking whether C++ compiler accepts -Werror=unknown-warning-option... " >&6; } +if test ${ax_cv_check_cxxflags___Werror_unknown_warning_option+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -Werror=unknown-warning-option" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ax_cv_check_cxxflags___Werror_unknown_warning_option=yes +else $as_nop + ax_cv_check_cxxflags___Werror_unknown_warning_option=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___Werror_unknown_warning_option" >&5 +printf "%s\n" "$ax_cv_check_cxxflags___Werror_unknown_warning_option" >&6; } +if test "x$ax_cv_check_cxxflags___Werror_unknown_warning_option" = xyes +then : + + ax_compiler_flags_test="-Werror=unknown-warning-option" + +else $as_nop + + ax_compiler_flags_test="" + +fi + + + + + +for flag in -Wmissing-braces -Wnon-virtual-dtor -Woverloaded-virtual -Wreorder -Wsign-compare -Wunused-local-typedefs -Wunused-variable -Wvla ; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cxxflags_${ax_compiler_flags_test}_$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts $flag" >&5 +printf %s "checking whether C++ compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CXXFLAGS + CXXFLAGS="$CXXFLAGS ${ax_compiler_flags_test} $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CXXFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : + +if test ${WARN_CXXFLAGS+y} +then : + + case " $WARN_CXXFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : WARN_CXXFLAGS already contains \$flag"; } >&5 + (: WARN_CXXFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append WARN_CXXFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : WARN_CXXFLAGS=\"\$WARN_CXXFLAGS\""; } >&5 + (: WARN_CXXFLAGS="$WARN_CXXFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else $as_nop + + WARN_CXXFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : WARN_CXXFLAGS=\"\$WARN_CXXFLAGS\""; } >&5 + (: WARN_CXXFLAGS="$WARN_CXXFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else $as_nop + : +fi + +done + +as_fn_append WARN_CXXFLAGS " -Werror" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for O_CLOEXEC defined in fcntl.h" >&5 +printf %s "checking for O_CLOEXEC defined in fcntl.h... " >&6; } +if test ${ac_cv_defined_O_CLOEXEC_fcntl_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + + #ifdef O_CLOEXEC + int ok; + #else + choke me + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_defined_O_CLOEXEC_fcntl_h=yes +else $as_nop + ac_cv_defined_O_CLOEXEC_fcntl_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_defined_O_CLOEXEC_fcntl_h" >&5 +printf "%s\n" "$ac_cv_defined_O_CLOEXEC_fcntl_h" >&6; } +if test $ac_cv_defined_O_CLOEXEC_fcntl_h != "no" +then : + +else $as_nop + +printf "%s\n" "#define O_CLOEXEC 0" >>confdefs.h + +fi + +# Only build Linux client libs when compiling for Linux +case $host in + *-*-linux* | *-android* ) + LINUX_HOST=true + ;; +esac + if test x$LINUX_HOST = xtrue; then + LINUX_HOST_TRUE= + LINUX_HOST_FALSE='#' +else + LINUX_HOST_TRUE='#' + LINUX_HOST_FALSE= +fi + + +# Only use Android support headers when compiling for Android +case $host in + *-android*) + ANDROID_HOST=true + ;; +esac + if test x$ANDROID_HOST = xtrue; then + ANDROID_HOST_TRUE= + ANDROID_HOST_FALSE='#' +else + ANDROID_HOST_TRUE='#' + ANDROID_HOST_FALSE= +fi + + +# Some tools (like mac ones) only support x86 currently. +case $host_cpu in + i?86|x86_64) + X86_HOST=true + ;; +esac + if test x$X86_HOST = xtrue; then + X86_HOST_TRUE= + X86_HOST_FALSE='#' +else + X86_HOST_TRUE='#' + X86_HOST_FALSE= +fi + + +# Check whether --enable-processor was given. +if test ${enable_processor+y} +then : + enableval=$enable_processor; +else $as_nop + enable_processor=yes +fi + + if test "x$enable_processor" != xyes; then + DISABLE_PROCESSOR_TRUE= + DISABLE_PROCESSOR_FALSE='#' +else + DISABLE_PROCESSOR_TRUE='#' + DISABLE_PROCESSOR_FALSE= +fi + + +# Check whether --enable-tools was given. +if test ${enable_tools+y} +then : + enableval=$enable_tools; +else $as_nop + enable_tools=yes +fi + + if test "x$enable_tools" != xyes; then + DISABLE_TOOLS_TRUE= + DISABLE_TOOLS_FALSE='#' +else + DISABLE_TOOLS_TRUE='#' + DISABLE_TOOLS_FALSE= +fi + + +if test x$LINUX_HOST = xfalse -a "x$enable_processor" != xyes -a "x$enable_tools" != xyes; then + as_fn_error $? "--disable-processor and --disable-tools were specified, and not building for Linux. Nothing to build!" "$LINENO" 5 +fi + +# Check whether --enable-system-test-libs was given. +if test ${enable_system_test_libs+y} +then : + enableval=$enable_system_test_libs; +else $as_nop + enable_system_test_libs=no +fi + + if test "x$enable_system_test_libs" = xyes; then + SYSTEM_TEST_LIBS_TRUE= + SYSTEM_TEST_LIBS_FALSE='#' +else + SYSTEM_TEST_LIBS_TRUE='#' + SYSTEM_TEST_LIBS_FALSE= +fi + + + + + + +if test "x$enable_system_test_libs" = xyes; then + : "${GMOCK_CFLAGS:=-pthread}" + : "${GMOCK_LIBS:=-lgmock -lgtest -pthread -lpthread}" + : "${GTEST_CFLAGS:=-pthread}" + : "${GTEST_LIBS:=-lgtest -pthread -lpthread}" +fi + +# Check whether --enable-selftest was given. +if test ${enable_selftest+y} +then : + enableval=$enable_selftest; +else $as_nop + enable_selftest=no +fi + + if test "x$enable_selftest" = xyes; then + SELFTEST_TRUE= + SELFTEST_FALSE='#' +else + SELFTEST_TRUE='#' + SELFTEST_FALSE= +fi + + + +# Check whether --with-rustc-demangle was given. +if test ${with_rustc_demangle+y} +then : + withval=$with_rustc_demangle; +else $as_nop + with_rustc_demangle=no +fi + + +RUSTC_DEMANGLE_BASE_CFLAGS="-DHAVE_RUSTC_DEMANGLE" +RUSTC_DEMANGLE_BASE_LIBS="-lrustc_demangle -lpthread -ldl" + +if test "x${with_rustc_demangle}" != xno; then + if ! test -f "${with_rustc_demangle}/Cargo.toml"; then + as_fn_error $? "You must pass the path to the rustc-demangle crate for --with-rustc-demangle" "$LINENO" 5 + fi + RUSTC_DEMANGLE_CFLAGS="-I${with_rustc_demangle}/crates/capi/include ${RUSTC_DEMANGLE_BASE_CFLAGS}" + RUSTC_DEMANGLE_LIBS="-L${with_rustc_demangle}/target/release ${RUSTC_DEMANGLE_BASE_LIBS}" +fi + +# Check whether --enable-system-rustc-demangle was given. +if test ${enable_system_rustc_demangle+y} +then : + enableval=$enable_system_rustc_demangle; +else $as_nop + enable_system_rustc_demangle=no +fi + + +if test "x${enable_system_rustc_demangle}" != xno; then + if test "x${with_rustc_demangle}" != xno; then + as_fn_error $? "--enable-system-rustc-demangle and --with-rustc-demangle are mutually exclusive." "$LINENO" 5 + fi + + RUSTC_DEMANGLE_CFLAGS="${RUSTC_DEMANGLE_BASE_CFLAGS}" + RUSTC_DEMANGLE_LIBS="${RUSTC_DEMANGLE_BASE_LIBS}" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rustc_demangle in -lrustc_demangle" >&5 +printf %s "checking for rustc_demangle in -lrustc_demangle... " >&6; } +if test ${ac_cv_lib_rustc_demangle_rustc_demangle+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrustc_demangle $RUSTC_DEMANGLE_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char rustc_demangle (); +int +main (void) +{ +return rustc_demangle (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_rustc_demangle_rustc_demangle=yes +else $as_nop + ac_cv_lib_rustc_demangle_rustc_demangle=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rustc_demangle_rustc_demangle" >&5 +printf "%s\n" "$ac_cv_lib_rustc_demangle_rustc_demangle" >&6; } +if test "x$ac_cv_lib_rustc_demangle_rustc_demangle" = xyes +then : + printf "%s\n" "#define HAVE_LIBRUSTC_DEMANGLE 1" >>confdefs.h + + LIBS="-lrustc_demangle $LIBS" + +else $as_nop + as_fn_error $? "librustc_demangle.a must be present when --enable-system-rustc-demangle is specified" "$LINENO" 5 +fi + + for ac_header in rustc_demangle.h +do : + ac_fn_c_check_header_compile "$LINENO" "rustc_demangle.h" "ac_cv_header_rustc_demangle_h" "$ac_includes_default" +if test "x$ac_cv_header_rustc_demangle_h" = xyes +then : + printf "%s\n" "#define HAVE_RUSTC_DEMANGLE_H 1" >>confdefs.h + +else $as_nop + as_fn_error $? "rustc_demangle.h must be present when --enable-system-rustc-demangle is specified" "$LINENO" 5 +fi + +done +fi + + + + +# Check whether --enable-zstd was given. +if test ${enable_zstd+y} +then : + enableval=$enable_zstd; +else $as_nop + enable_zstd=no +fi + +if test "x${enable_zstd}" != xno; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ZSTD_decompress in -lzstd" >&5 +printf %s "checking for ZSTD_decompress in -lzstd... " >&6; } +if test ${ac_cv_lib_zstd_ZSTD_decompress+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lzstd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char ZSTD_decompress (); +int +main (void) +{ +return ZSTD_decompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_zstd_ZSTD_decompress=yes +else $as_nop + ac_cv_lib_zstd_ZSTD_decompress=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zstd_ZSTD_decompress" >&5 +printf "%s\n" "$ac_cv_lib_zstd_ZSTD_decompress" >&6; } +if test "x$ac_cv_lib_zstd_ZSTD_decompress" = xyes +then : + printf "%s\n" "#define HAVE_LIBZSTD 1" >>confdefs.h + + LIBS="-lzstd $LIBS" + +else $as_nop + as_fn_error $? "zstd library not found." "$LINENO" 5 +fi + + ac_fn_c_check_header_compile "$LINENO" "zstd.h" "ac_cv_header_zstd_h" "$ac_includes_default" +if test "x$ac_cv_header_zstd_h" = xyes +then : + +else $as_nop + as_fn_error $? "zstd header not found." "$LINENO" 5 +fi + +fi + + +# Check whether --with-tests-as-root was given. +if test ${with_tests_as_root+y} +then : + withval=$with_tests_as_root; +else $as_nop + with_tests_as_root=no +fi + + if test "x$with_tests_as_root" = xyes; then + TESTS_AS_ROOT_TRUE= + TESTS_AS_ROOT_FALSE='#' +else + TESTS_AS_ROOT_TRUE='#' + TESTS_AS_ROOT_FALSE= +fi + + +ac_config_files="$ac_config_files breakpad.pc breakpad-client.pc Makefile" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GETCONTEXT_TRUE}" && test -z "${HAVE_GETCONTEXT_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GETCONTEXT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_MEMFD_CREATE_TRUE}" && test -z "${HAVE_MEMFD_CREATE_FALSE}"; then + as_fn_error $? "conditional \"HAVE_MEMFD_CREATE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LINUX_HOST_TRUE}" && test -z "${LINUX_HOST_FALSE}"; then + as_fn_error $? "conditional \"LINUX_HOST\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ANDROID_HOST_TRUE}" && test -z "${ANDROID_HOST_FALSE}"; then + as_fn_error $? "conditional \"ANDROID_HOST\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${X86_HOST_TRUE}" && test -z "${X86_HOST_FALSE}"; then + as_fn_error $? "conditional \"X86_HOST\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DISABLE_PROCESSOR_TRUE}" && test -z "${DISABLE_PROCESSOR_FALSE}"; then + as_fn_error $? "conditional \"DISABLE_PROCESSOR\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DISABLE_TOOLS_TRUE}" && test -z "${DISABLE_TOOLS_FALSE}"; then + as_fn_error $? "conditional \"DISABLE_TOOLS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SYSTEM_TEST_LIBS_TRUE}" && test -z "${SYSTEM_TEST_LIBS_FALSE}"; then + as_fn_error $? "conditional \"SYSTEM_TEST_LIBS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SELFTEST_TRUE}" && test -z "${SELFTEST_FALSE}"; then + as_fn_error $? "conditional \"SELFTEST\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${TESTS_AS_ROOT_TRUE}" && test -z "${TESTS_AS_ROOT_FALSE}"; then + as_fn_error $? "conditional \"TESTS_AS_ROOT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by breakpad $as_me 0.1, which was +generated by GNU Autoconf 2.71. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config='$ac_cs_config_escaped' +ac_cs_version="\\ +breakpad config.status 0.1 +configured by $0, generated by GNU Autoconf 2.71, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2021 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + printf "%s\n" "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + printf "%s\n" "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + printf "%s\n" "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + printf "%s\n" "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "breakpad.pc") CONFIG_FILES="$CONFIG_FILES breakpad.pc" ;; + "breakpad-client.pc") CONFIG_FILES="$CONFIG_FILES breakpad-client.pc" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`printf "%s\n" "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + printf "%s\n" "/* $configure_input */" >&1 \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + printf "%s\n" "/* $configure_input */" >&1 \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..bfee372 --- /dev/null +++ b/configure.ac @@ -0,0 +1,240 @@ +# Copyright 2006 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +AC_PREREQ([2.71]) + +AC_INIT([breakpad],[0.1],[google-breakpad-dev@googlegroups.com]) +dnl Sanity check: the argument is just a file that should exist. +AC_CONFIG_SRCDIR(README.md) +AC_CONFIG_AUX_DIR(autotools) +AC_CONFIG_MACRO_DIR([m4]) +AC_CANONICAL_HOST + +AM_INIT_AUTOMAKE(subdir-objects tar-ustar 1.13) +AC_CONFIG_HEADERS(src/config.h) +AM_MAINTAINER_MODE + +AM_PROG_AR +AM_PROG_AS +AC_PROG_CC +AM_PROG_CC_C_O +AC_PROG_CPP +AC_PROG_CXX +AC_PROG_RANLIB + +dnl This must come before all the feature tests below. +AC_ARG_ENABLE(m32, + AS_HELP_STRING([--enable-m32], + [Compile/build with -m32] + [(default is no)]),, + [enable_m32=no]) +if test "x$enable_m32" = xyes; then + CFLAGS="${CFLAGS} -m32" + CXXFLAGS="${CXXFLAGS} -m32" +fi + +AC_SYS_LARGEFILE +AX_PTHREAD +AC_CHECK_HEADERS([a.out.h sys/mman.h sys/random.h]) +AC_CHECK_FUNCS([arc4random getcontext getrandom memfd_create]) +AM_CONDITIONAL([HAVE_GETCONTEXT], [test "x$ac_cv_func_getcontext" = xyes]) +AM_CONDITIONAL([HAVE_MEMFD_CREATE], [test "x$ac_cv_func_memfd_create" = xyes]) + +AX_CXX_COMPILE_STDCXX(17, , mandatory) + +dnl Test supported warning flags. +WARN_CXXFLAGS= +dnl This warning flag is used by clang. Its default behavior is to warn when +dnl given an unknown flag rather than error out. +AC_LANG_PUSH([C++]) +AX_CHECK_COMPILE_FLAG([-Werror=unknown-warning-option],[ + ax_compiler_flags_test="-Werror=unknown-warning-option" +],[ + ax_compiler_flags_test="" +]) +AX_APPEND_COMPILE_FLAGS(m4_flatten([ + -Wmissing-braces + -Wnon-virtual-dtor + -Woverloaded-virtual + -Wreorder + -Wsign-compare + -Wunused-local-typedefs + -Wunused-variable + -Wvla +]), [WARN_CXXFLAGS], [${ax_compiler_flags_test}]) +AS_VAR_APPEND([WARN_CXXFLAGS], " -Werror") +AC_LANG_POP([C++]) +AC_SUBST([WARN_CXXFLAGS]) + +dnl Test support for O_CLOEXEC +AX_CHECK_DEFINE([fcntl.h], [O_CLOEXEC], [], + [AC_DEFINE([O_CLOEXEC], [0], [Fallback definition for old systems])]) + +# Only build Linux client libs when compiling for Linux +case $host in + *-*-linux* | *-android* ) + LINUX_HOST=true + ;; +esac +AM_CONDITIONAL(LINUX_HOST, test x$LINUX_HOST = xtrue) + +# Only use Android support headers when compiling for Android +case $host in + *-android*) + ANDROID_HOST=true + ;; +esac +AM_CONDITIONAL(ANDROID_HOST, test x$ANDROID_HOST = xtrue) + +# Some tools (like mac ones) only support x86 currently. +case $host_cpu in + i?86|x86_64) + X86_HOST=true + ;; +esac +AM_CONDITIONAL(X86_HOST, test x$X86_HOST = xtrue) + +AC_ARG_ENABLE(processor, + AS_HELP_STRING([--disable-processor], + [Don't build processor library] + [(default is no)]),, + [enable_processor=yes]) +AM_CONDITIONAL(DISABLE_PROCESSOR, test "x$enable_processor" != xyes) + +AC_ARG_ENABLE(tools, + AS_HELP_STRING([--disable-tools], + [Don't build tool binaries] + [(default is no)]),, + [enable_tools=yes]) +AM_CONDITIONAL(DISABLE_TOOLS, test "x$enable_tools" != xyes) + +if test x$LINUX_HOST = xfalse -a "x$enable_processor" != xyes -a "x$enable_tools" != xyes; then + AC_MSG_ERROR([--disable-processor and --disable-tools were specified, and not building for Linux. Nothing to build!]) +fi + +AC_ARG_ENABLE(system-test-libs, + AS_HELP_STRING([--enable-system-test-libs], + [Use gtest/gmock/etc... from the system instead ] + [of the local copies (default is local)]),, + [enable_system_test_libs=no]) +AM_CONDITIONAL(SYSTEM_TEST_LIBS, test "x$enable_system_test_libs" = xyes) + +AC_ARG_VAR([GMOCK_CFLAGS], [Compiler flags for gmock]) +AC_ARG_VAR([GMOCK_LIBS], [Linker flags for gmock]) +AC_ARG_VAR([GTEST_CFLAGS], [Compiler flags for gtest]) +AC_ARG_VAR([GTEST_LIBS], [Linker flags for gtest]) +if test "x$enable_system_test_libs" = xyes; then + : "${GMOCK_CFLAGS:=-pthread}" + : "${GMOCK_LIBS:=-lgmock -lgtest -pthread -lpthread}" + : "${GTEST_CFLAGS:=-pthread}" + : "${GTEST_LIBS:=-lgtest -pthread -lpthread}" +fi + +AC_ARG_ENABLE(selftest, + AS_HELP_STRING([--enable-selftest], + [Run extra tests with "make check" ] + [(may conflict with optimizations) ] + [(default is no)]),, + [enable_selftest=no]) +AM_CONDITIONAL(SELFTEST, test "x$enable_selftest" = xyes) + +AC_ARG_WITH(rustc-demangle, + AS_HELP_STRING([--with-rustc-demangle=/path/to/rustc-demangle], + [Link against the rustc-demangle library] + [to demangle Rust language symbols during] + [symbol dumping (default is no)] + [Pass the path to the crate root.]),, + [with_rustc_demangle=no]) + +RUSTC_DEMANGLE_BASE_CFLAGS="-DHAVE_RUSTC_DEMANGLE" +RUSTC_DEMANGLE_BASE_LIBS="-lrustc_demangle -lpthread -ldl" + +if test "x${with_rustc_demangle}" != xno; then + if ! test -f "${with_rustc_demangle}/Cargo.toml"; then + AC_MSG_ERROR(You must pass the path to the rustc-demangle crate for --with-rustc-demangle) + fi + RUSTC_DEMANGLE_CFLAGS="-I${with_rustc_demangle}/crates/capi/include ${RUSTC_DEMANGLE_BASE_CFLAGS}" + RUSTC_DEMANGLE_LIBS="-L${with_rustc_demangle}/target/release ${RUSTC_DEMANGLE_BASE_LIBS}" +fi + +AC_ARG_ENABLE(system-rustc-demangle, + AS_HELP_STRING([--enable-system-rustc-demangle], + [Link against the rustc-demangle library] + [to demangle Rust language symbols during] + [symbol dumping (default is no). This assumes] + [that rustc-demangle is installed in your sysroot,] + [and all headers from it are available in your] + [standard include path] + ),, + [enable_system_rustc_demangle=no]) + +if test "x${enable_system_rustc_demangle}" != xno; then + if test "x${with_rustc_demangle}" != xno; then + AC_MSG_ERROR([--enable-system-rustc-demangle and --with-rustc-demangle are mutually exclusive.]) + fi + + RUSTC_DEMANGLE_CFLAGS="${RUSTC_DEMANGLE_BASE_CFLAGS}" + RUSTC_DEMANGLE_LIBS="${RUSTC_DEMANGLE_BASE_LIBS}" + + AC_CHECK_LIB([rustc_demangle], [rustc_demangle], [], + [AC_MSG_ERROR(librustc_demangle.a must be present when --enable-system-rustc-demangle is specified)], + [$RUSTC_DEMANGLE_LIBS]) + AC_CHECK_HEADERS(rustc_demangle.h, [], + [AC_MSG_ERROR(rustc_demangle.h must be present when --enable-system-rustc-demangle is specified)]) +fi + +AC_ARG_VAR([RUSTC_DEMANGLE_CFLAGS], [Compiler flags for rustc-demangle]) +AC_ARG_VAR([RUSTC_DEMANGLE_LIBS], [Linker flags for rustc-demangle]) + +AC_ARG_ENABLE(zstd, + AS_HELP_STRING([--enable-zstd], + [Enable decompression of ELF sections with zstd]),, + [enable_zstd=no]) +if test "x${enable_zstd}" != xno; then + AC_CHECK_LIB(zstd, ZSTD_decompress, [], + [AC_MSG_ERROR([zstd library not found.])]) + AC_CHECK_HEADER(zstd.h, [], + [AC_MSG_ERROR([zstd header not found.])]) +fi + +AC_ARG_WITH(tests-as-root, + AS_HELP_STRING([--with-tests-as-root], + [Run the tests as root. Use this on platforms] + [like travis-ci.org that require root privileges] + [to use ptrace (default is no)]),, + [with_tests_as_root=no]) +AM_CONDITIONAL(TESTS_AS_ROOT, test "x$with_tests_as_root" = xyes) + +AC_CONFIG_FILES(m4_flatten([ + breakpad.pc + breakpad-client.pc + Makefile +])) + +AC_OUTPUT diff --git a/default.xml b/default.xml new file mode 100644 index 0000000..916b41f --- /dev/null +++ b/default.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/OWNERS b/docs/OWNERS new file mode 100644 index 0000000..72e8ffc --- /dev/null +++ b/docs/OWNERS @@ -0,0 +1 @@ +* diff --git a/docs/breakpad.png b/docs/breakpad.png new file mode 100644 index 0000000000000000000000000000000000000000..20bc7566ce853d7d6bbe4e8af820a43e09095c9f GIT binary patch literal 84153 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

Dn+UmXymPW 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 literal 0 HcmV?d00001 diff --git a/docs/breakpad.svg b/docs/breakpad.svg new file mode 100644 index 0000000..e91e72c --- /dev/null +++ b/docs/breakpad.svg @@ -0,0 +1,1023 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + Breakpad Client + Debugging Information + Application Code + + Build System + User's System + Crash Collector + + + + + + + + + + + + + + + + + + + + + Minidump + + + + Minidump + + + + + + + + + + + Human-readableStack Trace + + strip debuginfo + + Breakpad symboldumper + + distribute program to users + + + copy symbol file + + Crash! Breakpad clientwrites minidump... + + ...and submits itto crash collector + Breakpadminidumpprocessor + + + + + + + diff --git a/docs/client_design.md b/docs/client_design.md new file mode 100644 index 0000000..9f85655 --- /dev/null +++ b/docs/client_design.md @@ -0,0 +1,223 @@ +# Breakpad Client Libraries + +## Objective + +The Breakpad client libraries are responsible for monitoring an application for +crashes (exceptions), handling them when they occur by generating a dump, and +providing a means to upload dumps to a crash reporting server. These tasks are +divided between the “handler” (short for “exception handler”) library linked in +to an application being monitored for crashes, and the “sender” library, +intended to be linked in to a separate external program. + +## Background + +As one of the chief tasks of the client handler is to generate a dump, an +understanding of [dump files](processor_design.md) will aid in understanding the +handler. + +## Overview + +Breakpad provides client libraries for each of its target platforms. Currently, +these exist for Windows on x86 and Mac OS X on both x86 and PowerPC. A Linux +implementation has been written and is currently under review. + +Because the mechanisms for catching exceptions and the methods for obtaining the +information that a dump contains vary between operating systems, each target +operating system requires a completely different handler implementation. Where +multiple CPUs are supported for a single operating system, the handler +implementation will likely also require separate code for each processor type to +extract CPU-specific information. One of the goals of the Breakpad handler is to +provide a prepackaged cross-platform system that masks many of these +system-level differences and quirks from the application developer. Although the +underlying implementations differ, the handler library for each system follows +the same set of principles and exposes a similar interface. + +Code that wishes to take advantage of Breakpad should be linked against the +handler library, and should, at an appropriate time, install a Breakpad handler. +For applications, it is generally desirable to install the handler as early in +the start-up process as possible. Developers of library code using Breakpad to +monitor itself may wish to install a Breakpad handler when the library is +loaded, or may only want to install a handler when calls are made in to the +library. + +The handler can be triggered to generate a dump either by catching an exception +or at the request of the application itself. The latter case may be useful in +debugging assertions or other conditions where developers want to know how a +program got in to a specific non-crash state. After generating a dump, the +handler calls a user-specified callback function. The callback function may +collect additional data about the program’s state, quit the program, launch a +crash reporter application, or perform other tasks. Allowing for this +functionality to be dictated by a callback function preserves flexibility. + +The sender library is also has a separate implementation for each supported +platform, because of the varying interfaces for accessing network resources on +different operating systems. The sender transmits a dump along with other +application-defined information to a crash report server via HTTP. Because dumps +may contain sensitive data, the sender allows for the use of HTTPS. + +The canonical example of the entire client system would be for a monitored +application to link against the handler library, install a Breakpad handler from +its main function, and provide a callback to launch a small crash reporter +program. The crash reporter program would be linked against the sender library, +and would send the crash dump when launched. A separate process is recommended +for this function because of the unreliability inherent in doing any significant +amount of work from a crashed process. + +## Detailed Design + +### Exception Handler Installation + +The mechanisms for installing an exception handler vary between operating +systems. On Windows, it’s a relatively simple matter of making one call to +register a [top-level exception +filter](http://msdn.microsoft.com/library/en-us/debug/base/setunhandledexceptionfilter.asp) +callback function. On most Unix-like systems such as Linux, processes are +informed of exceptions by the delivery of a signal, so an exception handler +takes the form of a signal handler. The native mechanism to catch exceptions on +Mac OS X requires a large amount of code to set up a Mach port, identify it as +the exception port, and assign a thread to listen for an exception on that port. +Just as the preparation of exception handlers differ, the manner in which they +are called differs as well. On Windows and most Unix-like systems, the handler +is called on the thread that caused the exception. On Mac OS X, the thread +listening to the exception port is notified that an exception has occurred. The +different implementations of the Breakpad handler libraries perform these tasks +in the appropriate ways on each platform, while exposing a similar interface on +each. + +A Breakpad handler is embodied in an `ExceptionHandler` object. Because it’s a +C++ object, `ExceptionHandler`s may be created as local variables, allowing them +to be installed and removed as functions are called and return. This provides +one possible way for a developer to monitor only a portion of an application for +crashes. + +### Exception Basics + +Once an application encounters an exception, it is in an indeterminate and +possibly hazardous state. Consequently, any code that runs after an exception +occurs must take extreme care to avoid performing operations that might fail, +hang, or cause additional exceptions. This task is not at all straightforward, +and the Breakpad handler library seeks to do it properly, accounting for all of +the minute details while allowing other application developers, even those with +little systems programming experience, to reap the benefits. All of the Breakpad +handler code that executes after an exception occurs has been written according +to the following guidelines for safety at exception time: + +* Use of the application heap is forbidden. The heap may be corrupt or + otherwise unusable, and allocators may not function. +* Resource allocation must be severely limited. The handler may create a new + file to contain the dump, and it may attempt to launch a process to continue + handling the crash. +* Execution on the thread that caused the exception is significantly limited. + The only code permitted to execute on this thread is the code necessary to + transition handling to a dedicated preallocated handler thread, and the code + to return from the exception handler. +* Handlers shouldn’t handle crashes by attempting to walk stacks themselves, + as stacks may be in inconsistent states. Dump generation should be performed + by interfacing with the operating system’s memory manager and code module + manager. +* Library code, including runtime library code, must be avoided unless it + provably meets the above guidelines. For example, this means that the STL + string class may not be used, because it performs operations that attempt to + allocate and use heap memory. It also means that many C runtime functions + must be avoided, particularly on Windows, because of heap operations that + they may perform. + +A dedicated handler thread is used to preserve the state of the exception thread +when an exception occurs: during dump generation, it is difficult if not +impossible for a thread to accurately capture its own state. Performing all +exception-handling functions on a separate thread is also critical when handling +stack-limit-exceeded exceptions. It would be hazardous to run out of stack space +while attempting to handle an exception. Because of the rule against allocating +resources at exception time, the Breakpad handler library creates its handler +thread when it installs its exception handler. On Mac OS X, this handler thread +is created during the normal setup of the exception handler, and the handler +thread will be signaled directly in the event of an exception. On Windows and +Linux, the handler thread is signaled by a small amount of code that executes on +the exception thread. Because the code that executes on the exception thread in +this case is small and safe, this does not pose a problem. Even when an +exception is caused by exceeding stack size limits, this code is sufficiently +compact to execute entirely within the stack’s guard page without causing an +exception. + +The handler thread may also be triggered directly by a user call, even when no +exception occurs, to allow dumps to be generated at any point deemed +interesting. + +### Filter Callback + +When the handler thread begins handling an exception, it calls an optional +user-defined filter callback function, which is responsible for judging whether +Breakpad’s handler should continue handling the exception or not. This mechanism +is provided for the benefit of library or plug-in code, whose developers may not +be interested in reports of crashes that occur outside of their modules but +within processes hosting their code. If the filter callback indicates that it is +not interested in the exception, the Breakpad handler arranges for it to be +delivered to any previously-installed handler. + +### Dump Generation + +Assuming that the filter callback approves (or does not exist), the handler +writes a dump in a directory specified by the application developer when the +handler was installed, using a previously generated unique identifier to avoid +name collisions. The mechanics of dump generation also vary between platforms, +but in general, the process involves enumerating each thread of execution, and +capturing its state, including processor context and the active portion of its +stack area. The dump also includes a list of the code modules loaded in to the +application, and an indicator of which thread generated the exception or +requested the dump. In order to avoid allocating memory during this process, the +dump is written in place on disk. + +### Post-Dump Behavior + +Upon completion of writing the dump, a second callback function is called. This +callback may be used to launch a separate crash reporting program or to collect +additional data from the application. The callback may also be used to influence +whether Breakpad will treat the exception as handled or unhandled. Even after a +dump is successfully generated, Breakpad can be made to behave as though it +didn’t actually handle an exception. This function may be useful for developers +who want to test their applications with Breakpad enabled but still retain the +ability to use traditional debugging techniques. It also allows a +Breakpad-enabled application to coexist with a platform’s native crash reporting +system, such as Mac OS X’ [CrashReporter](http://developer.apple.com/technotes/tn2004/tn2123.html) +and [Windows Error Reporting](http://msdn.microsoft.com/isv/resources/wer/). + +Typically, when Breakpad handles an exception fully and no debuggers are +involved, the crashed process will terminate. + +Authors of both callback functions that execute within a Breakpad handler are +cautioned that their code will be run at exception time, and that as a result, +they should observe the same programming practices that the Breakpad handler +itself adheres to. Notably, if a callback is to be used to collect additional +data from an application, it should take care to read only “safe” data. This +might involve accessing only static memory locations that are updated +periodically during the course of normal program execution. + +### Sender Library + +The Breakpad sender library provides a single function to send a crash report to +a crash server. It accepts a crash server’s URL, a map of key-value parameters +that will accompany the dump, and the path to a dump file itself. Each of the +key-value parameters and the dump file are sent as distinct parts of a multipart +HTTP POST request to the specified URL using the platform’s native HTTP +facilities. On Linux, [libcurl](http://curl.haxx.se/) is used for this function, +as it is the closest thing to a standard HTTP library available on that +platform. + +## Future Plans + +Although we’ve had great success with in-process dump generation by following +our guidelines for safe code at exception time, we are exploring options for +allowing dumps to be generated in a separate process, to further enhance the +handler library’s robustness. + +On Windows, we intend to offer tools to make it easier for Breakpad’s settings +to be managed by the native group policy management system. + +We also plan to offer tools that many developers would find desirable in the +context of handling crashes, such as a mechanism to determine at launch if the +program last terminated in a crash, and a way to calculate “crashiness” in terms +of crashes over time or the number of application launches between crashes. + +We are also investigating methods to capture crashes that occur early in an +application’s launch sequence, including crashes that occur before a program’s +main function begins executing. diff --git a/docs/contributing_to_breakpad.md b/docs/contributing_to_breakpad.md new file mode 100644 index 0000000..b8d261e --- /dev/null +++ b/docs/contributing_to_breakpad.md @@ -0,0 +1,35 @@ +# Introduction + +Thanks for thinking of contributing to Breakpad! Unfortunately there are some +pesky legal issues to get out of the way, but they're quick and painless. + +## Legal + +If you're doing work individually, not as part of any employment, you'll need to +sign the Individual +Contributor License Agreement. This agreement can be completed +electronically. + +If you're contributing to Breakpad as part of your employment with another +organization, you'll need to sign a Corporate +Contributor License Agreement. Once completed this document will need to be +faxed. + +**_IMPORTANT_**: The authors(you!) of the contributions will maintain all +copyrights; the agreements you sign will grant rights to Google to use your +work. + +Thanks, and if you have any questions let me know and I'll loop in the legal guy +here to get you an answer. + +## Technical + +Once you have signed the agreement you can be added to our contributors list and +have write access to code. For full details on getting started see our trunk +`README`. + +## List of people who have signed contributor agreements + +None so far. diff --git a/docs/exception_handling.md b/docs/exception_handling.md new file mode 100644 index 0000000..e48a52a --- /dev/null +++ b/docs/exception_handling.md @@ -0,0 +1,128 @@ +The goal of this document is to give an overview of the exception handling +options in breakpad. + +# Basics + +Exception handling is a mechanism designed to handle the occurrence of +exceptions, special conditions that change the normal flow of program execution. + +`SetUnhandledExceptionFilter` replaces all unhandled exceptions when Breakpad is +enabled. TODO: More on first and second change and vectored v. try/catch. + +There are two main types of exceptions across all platforms: in-process and +out-of-process. + +# In-Process + +In process exception handling is relatively simple since the crashing process +handles crash reporting. It is generally considered unsafe to write a minidump +from a crashed process. For example, key data structures could be corrupted or +the stack on which the exception handler runs could have been overwritten. For +this reason all platforms also support some level of out-of-process exception +handling. + +## Windows + +In-process exception handling Breakpad creates a 'handler head' that waits +infinitely on a semaphore at start up. When this thread is woken it writes the +minidump and signals to the excepting thread that it may continue. A filter will +tell the OS to kill the process if the minidump is written successfully. +Otherwise it continues. + +# Out-of-Process + +Out-of-process exception handling is more complicated than in-process exception +handling because of the need to set up a separate process that can read the +state of the crashing process. + +## Windows + +Breakpad uses two abstractions around the exception handler to make things work: +`CrashGenerationServer` and `CrashGenerationClient`. The constructor for these +takes a named pipe name. + +During server start up a named pipe and registers callbacks for client +connections are created. The named pipe is used for registration and all IO on +the pipe is done asynchronously. `OnPipeConnected` is called when a client +attempts to connect (call `CreateFile` on the pipe). `OnPipeConnected` does the +state machine transition from `Initial` to `Connecting` and on through +`Reading`, `Reading_Done`, `Writing`, `Writing_Done`, `Reading_ACK`, and +`Disconnecting`. + +When registering callbacks, the client passes in two pointers to pointers: 1. A +pointer to the `EXCEPTION_INFO` pointer 1. A pointer to the `MDRawAssertionInfo` +which handles various non-exception failures like assertions + +The essence of registration is adding a "`ClientInfo`" object that contains +handles used for synchronization with the crashing process to an array +maintained by the server. This is how we can keep track of all the clients on +the system that have registered for minidumps. These handles are: * +`server_died(mutex)` * `dump_requested(Event)` * `dump_generated(Event)` + +The server registers asynchronous waits on these events with the `ClientInfo` +object as the callback context. When the `dump_requested` event is set by the +client, the `OnDumpRequested()` callback is called. The server uses the handles +inside `ClientInfo` to communicate with the child process. Once the child sets +the event, it waits for two objects: 1. the `dump_generated` event 1. the +`server_died` mutex + +In the end handles are "duped" into the client process, and the clients use +`SetEvent` to request events, wait on the other event, or the `server_died` +mutex. + +## Linux + +### Current Status + +As of July 2011, Linux had a minidump generator that is not entirely +out-of-process. The minidump was generated from a separate process, but one that +shared an address space, file descriptors, signal handles and much else with the +crashing process. It worked by using the `clone()` system call to duplicate the +crashing process, and then uses `ptrace()` and the `/proc` file system to +retrieve the information required to write the minidump. Since then Breakpad has +updated Linux exception handling to provide more benefits of out-of-process +report generation. + +### Proposed Design + +#### Overview + +Breakpad would use a per-user daemon to write out a minidump that does not have, +interact with or depend on the crashing process. We don't want to start a new +separate process every time a user launches a Breakpad-enabled process. Doing +one daemon per machine is unacceptable for security concerns around one user +being able to initiate a minidump generation for another user's process. + +#### Client/Server Communication + +On Breakpad initialization in a process, the initializer would check if the +daemon is running and, if not, start it. The race condition between the check +and the initialization is not a problem because multiple daemons can check if +the IPC endpoint already exists and if a server is listening. Even if multiple +copies of the daemon try to `bind()` the filesystem to name the socket, all but +one will fail and can terminate. + +This point is relevant for error handling conditions. Linux does not clean the +file system representation of a UNIX domain socket even if both endpoints +terminate, so checking for existence is not strong enough. However checking the +process list or sending a ping on the socket can handle this. + +Breakpad uses UNIX domain sockets since they support full duplex communication +(unlike Windows, named pipes on Linux are half) and the kernal automatically +creates a private channel between the client and server once the client calls +`connect()`. + +#### Minidump Generation + +Breakpad could use the current system with `ptrace()` and `/proc` within the +daemon executable. + +Overall the operations look like: 1. Signal from OS indicating crash 1. Signal +Handler suspends all threads except itself 1. Signal Handler sends +`CRASH_DUMP_REQUEST` message to server and waits for response 1. Server inspects +1. Minidump is asynchronously written to disk by the server 1. Server responds +indicating inspection is done + +## Mac OSX + +Out-of-process exception handling is fully supported on Mac. diff --git a/docs/getting_started_with_breakpad.md b/docs/getting_started_with_breakpad.md new file mode 100644 index 0000000..b827d40 --- /dev/null +++ b/docs/getting_started_with_breakpad.md @@ -0,0 +1,115 @@ +# Introduction + +Breakpad is a library and tool suite that allows you to distribute an +application to users with compiler-provided debugging information removed, +record crashes in compact "minidump" files, send them back to your server, and +produce C and C++ stack traces from these minidumps. Breakpad can also write +minidumps on request for programs that have not crashed. + +Breakpad is currently used by Google Chrome, Firefox, Google Picasa, Camino, +Google Earth, and other projects. + +![Workflow](breakpad.png) + +Breakpad has three main components: + +* The **client** is a library that you include in your application. It can + write minidump files capturing the current threads' state and the identities + of the currently loaded executable and shared libraries. You can configure + the client to write a minidump when a crash occurs, or when explicitly + requested. + +* The **symbol dumper** is a program that reads the debugging information + produced by the compiler and produces a **symbol file**, in [Breakpad's own + format](symbol_files.md). + +* The **processor** is a program that reads a minidump file, finds the + appropriate symbol files for the versions of the executables and shared + libraries the minidump mentions, and produces a human-readable C/C++ stack + trace. + +# The minidump file format + +The minidump file format is similar to core files but was developed by Microsoft +for its crash-uploading facility. A minidump file contains: + +* A list of the executable and shared libraries that were loaded in the + process at the time the dump was created. This list includes both file names + and identifiers for the particular versions of those files that were loaded. + +* A list of threads present in the process. For each thread, the minidump + includes the state of the processor registers, and the contents of the + threads' stack memory. These data are uninterpreted byte streams, as the + Breakpad client generally has no debugging information available to produce + function names or line numbers, or even identify stack frame boundaries. + +* Other information about the system on which the dump was collected: + processor and operating system versions, the reason for the dump, and so on. + +Breakpad uses Windows minidump files on all platforms, instead of the +traditional core files, for several reasons: + +* Core files can be very large, making them impractical to send across a + network to the collector for processing. Minidumps are smaller, as they were + designed to be used this way. + +* The core file format is poorly documented. For example, the Linux Standards + Base does not describe how registers are stored in `PT_NOTE` segments. + +* It is harder to persuade a Windows machine to produce a core dump file than + it is to persuade other machines to write a minidump file. + +* It simplifies the Breakpad processor to support only one file format. + +# Overview/Life of a minidump + +A minidump is generated via calls into the Breakpad library. By default, +initializing Breakpad installs an exception/signal handler that writes a +minidump to disk at exception time. On Windows, this is done via +`SetUnhandledExceptionFilter()`; on OS X, this is done by creating a thread that +waits on the Mach exception port; and on Linux, this is done by installing a +signal handler for various exceptions like `SIGILL, SIGSEGV` etc. + +Once the minidump is generated, each platform has a slightly different way of +uploading the crash dump. On Windows & Linux, a separate library of functions is +provided that can be called into to do the upload. On OS X, a separate process +is spawned that prompts the user for permission, if configured to do so, and +sends the file. + +# Terminology + +**In-process vs. out-of-process exception handling** - it's generally considered +that writing the minidump from within the crashed process is unsafe - key +process data structures could be corrupted, or the stack on which the exception +handler runs could have been overwritten, etc. All 3 platforms support what's +known as "out-of-process" exception handling. + +# Integration overview + +## Breakpad Code Overview + +All the client-side code is found by visiting the Google Project at +https://chromium.googlesource.com/breakpad/breakpad. The following directory structure is +present in the `src` directory: + +* `processor` Contains minidump-processing code that is used on the server + side and isn't of use on the client side +* `client` Contains client minidump-generation libraries for all platforms +* `tools` Contains source code & projects for building various tools on each + platform. + +(Among other directories) + +* [Windows Integration Guide](windows_client_integration.md) +* [Mac Integration Guide](mac_breakpad_starter_guide.md) +* [Linux Integration Guide](linux_starter_guide.md) + +## Build process specifics(symbol generation) + +This applies to all platforms. Inside `src/tools/{platform}/dump_syms` is a tool +that can read debugging information for each platform (e.g. for OS X/Linux, +DWARF and STABS, and for Windows, PDB files) and generate a Breakpad symbol +file. This tool should be run on your binary before it's stripped(in the case of +OS X/Linux) and the symbol files need to be stored somewhere that the minidump +processor can find. There is another tool, `symupload`, that can be used to +upload symbol files if you have written a server that can accept them. diff --git a/docs/linux_core_handler.md b/docs/linux_core_handler.md new file mode 100644 index 0000000..558940f --- /dev/null +++ b/docs/linux_core_handler.md @@ -0,0 +1,39 @@ +# How To Use Breakpad As a Coredump Handler on Linux + +This document presents a way to use Breakpad in order to generate +minidumps system wide on Linux. + +Please refer to [Linux starter guide](./linux_starter_guide.md) if +instead you want to integrate breakpad into your application. + +## Motivation + +When working on an embedded system, disk and memory space is often +limited and when a process crashes it must be restarted as soon as +possible. Sometime saving a full coredump takes to much time or +consumes too much space. + +## Breakpad Core Handler + +In such case the program `core_handler` can be use to generate +minidumps instead of coredumps. `core_handler` reads the firsts +sections of the coredump (where the various threads are described) +generated by Linux from the standard input and then directly reads +`/proc//mem` to reconstruct the stacktraces. + +One can test it with: + +``` +# echo "|/usr/libexec/core_handler %P /var/lib/minidump/%e-%i.md" > + /proc/sys/kernel/core_pattern +# echo 1 > /proc/sys/kernel/core_pipe_limit +``` + +Be aware that a real world integration would likely require further +customization and so `core_handler` can be wrapped into a script (for +example to change the permission of the minidump file or to signal the +presence of the minidump to another service). + +Please refer to +[core(5)](https://man7.org/linux/man-pages/man5/core.5.html) for more +details. diff --git a/docs/linux_starter_guide.md b/docs/linux_starter_guide.md new file mode 100644 index 0000000..41e1162 --- /dev/null +++ b/docs/linux_starter_guide.md @@ -0,0 +1,110 @@ +# How To Add Breakpad To Your Linux Application + +This document is an overview of using the Breakpad client libraries on Linux. + +## Building the Breakpad libraries + +Breakpad provides an Autotools build system that will build both the Linux +client libraries and the processor libraries. Running `./configure && make` in +the Breakpad source directory will produce +**src/client/linux/libbreakpad\_client.a**, which contains all the code +necessary to produce minidumps from an application. + +## Integrating Breakpad into your Application + +First, configure your build process to link **libbreakpad\_client.a** into your +binary, and set your include paths to include the **src** directory in the +**google-breakpad** source tree. Next, include the exception handler header: + +```cpp +#include "client/linux/handler/exception_handler.h" +``` + +Now you can instantiate an `ExceptionHandler` object. Exception handling is active for the lifetime of the `ExceptionHandler` object, so you should instantiate it as early as possible in your application's startup process, and keep it alive for as close to shutdown as possible. To do anything useful, the `ExceptionHandler` constructor requires a path where it can write minidumps, as well as a callback function to receive information about minidumps that were written: + +```cpp +static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, +void* context, bool succeeded) { + printf("Dump path: %s\n", descriptor.path()); + return succeeded; +} + +void crash() { volatile int* a = (int*)(NULL); *a = 1; } + +int main(int argc, char* argv[]) { + google_breakpad::MinidumpDescriptor descriptor("/tmp"); + google_breakpad::ExceptionHandler eh(descriptor, NULL, dumpCallback, NULL, true, -1); + crash(); + return 0; +} +``` + +Compiling and running this example should produce a minidump file in /tmp, and +it should print the minidump filename before exiting. You can read more about +the other parameters to the `ExceptionHandler` constructor [in the exception_handler.h source file][1]. + +[1]: https://chromium.googlesource.com/breakpad/breakpad/+/master/src/client/linux/handler/exception_handler.h + +**Note**: You should do as little work as possible in the callback function. +Your application is in an unsafe state. It may not be safe to allocate memory or +call functions from other shared libraries. The safest thing to do is `fork` and +`exec` a new process to do any work you need to do. If you must do some work in +the callback, the Breakpad source contains [some simple reimplementations of libc functions][2], to avoid calling directly into +libc, as well as [a header file for making Linux system calls][3] (in **src/third\_party/lss**) to avoid calling into other shared libraries. + +[2]: https://chromium.googlesource.com/breakpad/breakpad/+/master/src/common/linux/linux_libc_support.h +[3]: https://chromium.googlesource.com/linux-syscall-support/+/master + +## Sending the minidump file + +In a real application, you would want to handle the minidump in some way, likely +by sending it to a server for analysis. The Breakpad source tree contains [some +HTTP upload source][4] that you might find useful, as well as [a minidump upload tool][5]. + +[4]: https://chromium.googlesource.com/breakpad/breakpad/+/master/src/common/linux/http_upload.h +[5]: https://chromium.googlesource.com/breakpad/breakpad/+/master/src/tools/linux/symupload/minidump_upload.cc + +## Producing symbols for your application + +To produce useful stack traces, Breakpad requires you to convert the debugging +symbols in your binaries to [text-format symbol files][6]. First, ensure that you've compiled your binaries with `-g` to +include debugging symbols. Next, compile the `dump_syms` tool by running +`configure && make` in the Breakpad source directory. Next, run `dump_syms` on +your binaries to produce the text-format symbols. For example, if your main +binary was named `test`: + +[6]: https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/symbol_files.md + +``` +$ google-breakpad/src/tools/linux/dump_syms/dump_syms ./test > test.sym +``` + +In order to use these symbols with the `minidump_stackwalk` tool, you will need +to place them in a specific directory structure. The first line of the symbol +file contains the information you need to produce this directory structure, for +example (your output will vary): + +``` +$ head -n1 test.sym MODULE Linux x86_64 6EDC6ACDB282125843FD59DA9C81BD830 test +$ mkdir -p ./symbols/test/6EDC6ACDB282125843FD59DA9C81BD830 +$ mv test.sym ./symbols/test/6EDC6ACDB282125843FD59DA9C81BD830 +``` + +You may also find the [symbolstore.py][7] script in the Mozilla repository useful, as it encapsulates these steps. + +[7]: https://dxr.mozilla.org/mozilla-central/source/toolkit/crashreporter/tools/symbolstore.py + +## Processing the minidump to produce a stack trace + +Breakpad includes a tool called `minidump_stackwalk` which can take a minidump +plus its corresponding text-format symbols and produce a symbolized stacktrace. +It should be in the **google-breakpad/src/processor** directory if you compiled +the Breakpad source using the directions above. Simply pass it the minidump and +the symbol path as commandline parameters: + +``` +$ google-breakpad/src/processor/minidump_stackwalk minidump.dmp ./symbols +``` + +It produces verbose output on stderr, and the stacktrace on stdout, so you may +want to redirect stderr. diff --git a/docs/linux_system_calls.md b/docs/linux_system_calls.md new file mode 100644 index 0000000..17ada7e --- /dev/null +++ b/docs/linux_system_calls.md @@ -0,0 +1,47 @@ +# Introduction + +Linux implements its userland-to-kernel transition using a special library +called linux-gate.so that is mapped by the kernel into every process. For more +information, see + +http://www.trilithium.com/johan/2005/08/linux-gate/ + +In a nutshell, the problem is that the system call gate function, +kernel\_vsyscall does not use EBP to point to the frame pointer. + +However, the Breakpad processor supports special frames like this via STACK +lines in the symbol file. If you look in src/client/linux/data you will see +symbol files for linux-gate.so for both Intel & AMD(the implementation of +kernel\_vsyscall changes depending on the CPU manufacturer). When processing +minidumps from Linux 2.6, having these symbol files is necessary for walking the +stack for crashes that happen while a thread is in a system call. + +If you're just interested in processing minidumps, those two symbol files should +be all you need! + +# Details + +The particular details of understanding the linux-gate.so symbol files can be +found by reading about STACK lines inside +src/common/windows/pdb\_source\_line\_writer.cc, and the above link. To +summarize briefly, we just have to inform the processor how to get to the +previous frame when the EIP is inside kernel\_vsyscall, and we do that by +telling the processor how many bytes kernel\_vsyscall has pushed onto the stack +in it's prologue. For example, one of the symbol files looks somewhat like the +following: + +MODULE Linux x86 random\_debug\_id linux-gate.so PUBLIC 400 0 kernel\_vsyscall +STACK WIN 4 100 1 1 0 0 0 0 0 1 + +The PUBLIC line indicates that kernel\_vsyscall is at offset 400 (in bytes) from +the beginning of linux-gate.so. The STACK line indicates the size of the +function(100), how many bytes it pushes(1), and how many bytes it pops(1). The +last 1 indicates that EBP is pushed onto the stack before being used by the +function. + +# Warnings + +These functions might change significantly depending on kernel version. In my +opinion, the actual function stack information is unlikely to change frequently, +but the Linux kernel might change the address of kernel\_vsyscall w.r.t the +beginning of linux-gate.so, which would cause these symbol files to be invalid. diff --git a/docs/mac_breakpad_starter_guide.md b/docs/mac_breakpad_starter_guide.md new file mode 100644 index 0000000..6e0bdb0 --- /dev/null +++ b/docs/mac_breakpad_starter_guide.md @@ -0,0 +1,184 @@ +# How To Add Breakpad To Your Mac Client Application + +This document is a step-by-step recipe to get your Mac client app to build with +Breakpad. + +## Preparing a binary build of Breakpad for use in your tree + +You can either check in a binary build of the Breakpad framework & tools or +build it as a dependency of your project. The former is recommended, and +detailed here, since building dependencies through other projects is +problematic(matching up configuration names), and the Breakpad code doesn't +change nearly often enough as your application's will. + +## Building the requisite targets + +All directories are relative to the `src` directory of the Breakpad checkout. + +* Build the 'All' target of `client/mac/Breakpad.xcodeproj` in Release mode. +* Execute `cp -R client/mac/build/Release/Breakpad.framework ` +* Inside `tools/mac/dump_syms` directory, build dump\_syms.xcodeproj, and copy + tools/mac/dump\_syms/build/Release/dump\_syms to a safe location where it + can be run during the build process. + +## Adding Breakpad.framework + +Inside your application's framework, add the Breakpad.Framework to your +project's framework settings. When you select it from the file chooser, it will +let you pick a target to add it to; go ahead and check the one that's relevant +to your application. + +## Copy Breakpad into your Application Package + +Copy Breakpad into your Application Package, so it will be around at run time. + +Go to the Targets section of your Xcode Project window. Hit the disclosure +triangle to reveal the build phases of your application. Add a new Copy Files +phase using the Contextual menu (Control Click). On the General panel of the new +'Get Info' of this new phase, set the destination to 'Frameworks' Close the +'Info' panel. Use the Contextual Menu to Rename your new phase 'Copy Frameworks' +Now drag Breakpad again into this Copy Frameworks phase. Drag it from whereever +it appears in the project file tree. + +## Add a New Run Script build phase + +Near the end of the build phases, add a new Run Script build phase. This will be +run before Xcode calls /usr/bin/strip on your project. This is where you'll be +calling dump\_sym to output the symbols for each architecture of your build. In +my case, the relevant lines read: + +``` +#!/bin/sh +$TOOL_DIR= + +"$TOOL_DIR/dump_syms" -a ppc "$PROD" > "$TARGET_NAME ppc.breakpad" + +"$TOOL_DIR/dump_syms" -a i386 "$PROD" > "$TARGET_NAME i386.breakpad" +``` + +## Adjust the Project Settings + +* Turn on Separate Strip, +* Set the Strip Style to Non-Global Symbols. + +## Write Code! + +You'll need to have an object that acts as the delegate for NSApplication. +Inside this object's header, you'll need to add + +1. add an ivar for Breakpad and +2. a declaration for the applicationShouldTerminate:(NSApplication`*` sender) + message. + +``` +#import + +@interface BreakpadTest : NSObject { + . + . + . + BreakpadRef breakpad; + . + . + . +} +. +. +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; +. +. +@end +``` + +Inside your object's implementation file, + +1. add the following method InitBreakpad +2. modify your awakeFromNib method to look like the one below, +3. modify/add your application's delegate method to look like the one below + +``` +static BreakpadRef InitBreakpad(void) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + BreakpadRef breakpad = 0; + NSDictionary *plist = [[NSBundle mainBundle] infoDictionary]; + if (plist) { + // Note: version 1.0.0.4 of the framework changed the type of the argument + // from CFDictionaryRef to NSDictionary * on the next line: + breakpad = BreakpadCreate(plist); + } + [pool release]; + return breakpad; +} + +- (void)awakeFromNib { + breakpad = InitBreakpad(); +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { + BreakpadRelease(breakpad); + return NSTerminateNow; +} +``` + +## Configure Breakpad + +Configure Breakpad for your application. + +1. Take a look inside the Breakpad.framework at the Breakpad.h file for the + keys, default values, and descriptions to be passed to BreakpadCreate(). +2. Add/Edit the Breakpad specific entries in the dictionary passed to + BreakpadCreate() -- typically your application's info plist. + +Example from the Notifier Info.plist: +`BreakpadProductGoogle_Notifier_Mac +BreakpadProductDisplay${PRODUCT_NAME} +` + +## Build Your Application + +Almost done! + +## Verify + +Double-check: + +Your app should have in its package contents: +myApp.app/Contents/Frameworks/Breakpad.framework. + +The symbol files have reasonable contents (you can look at them with a text +editor.) + +Look again at the Copy Frameworks phase of your project. Are you leaking .h +files? Select them and delete them. (If you drag a bunch of files into your +project, Xcode often wants to copy your .h files into the build, revealing +Google secrets. Be vigilant!) + +## Upload the symbol file + +You'll need to configure your build process to store symbols in a location that +is accessible by the minidump processor. There is a tool in tools/mac/symupload +that can be used to send the symbol file via HTTP post. + +1. Test + +Configure breakpad to send reports to a URL by adding to your app's Info.plist: + +``` +BreakpadURL +upload URL +BreakpadReportInterval +30 +``` + +## Final Notes + +Breakpad checks whether it is being run under a debugger, and if so, normally +does nothing. But, you can force Breakpad to function under a debugger by +setting the Unix shell variable BREAKPAD\_IGNORE\_DEBUGGER to a non-zero value. +You can bracket the source code in the above Write The Code step with #if DEBUG +to completely eliminate it from Debug builds. See +//depot/googlemac/GoogleNotifier/main.m for an example. FYI, when your process +forks(), exception handlers are reset to the default for child processes. So +they must reinitialize Breakpad, otherwise exceptions will be handled by Apple's +Crash Reporter. diff --git a/docs/mozilla_brown_bag_talk.md b/docs/mozilla_brown_bag_talk.md new file mode 100644 index 0000000..82461b3 --- /dev/null +++ b/docs/mozilla_brown_bag_talk.md @@ -0,0 +1,82 @@ +# Breakpad Crash Reporting for Mozilla + +* January 24, 2007 + * Links updated February 14, 2007 +* Mozilla HQ +* Mark Mentovai +* Brian Ryner + +## What is a crash reporter? + +* Enables developers to analyze crashes that occur in the wild +* Produces stack backtraces that help identify how a program failed +* Offers higher-level data aggregation (topcrashes, MTBF statistics) + +## Motivation + +* Talkback is proprietary and unmaintained +* Smaller open-source projects have few options +* Larger projects need flexibility and scalability + +## Design Options + +* Stackwalking done on client + * Apple CrashReporter + * GNOME BugBuddy +* Client sends memory dump + * Talkback + * Windows Error Reporting + * Breakpad + +## Goals + +* Provide libraries around which systems can be based +* Open-source +* Cross-platform + * Mac OS X x86, PowerPC + * Linux x86 + * Windows x86 +* No requirement to distribute symbols + +## Client Libraries + +* Exception handler installed at application startup + * Spawns a separate thread +* Minidump file written at crash time + * Format used by Windows debuggers +* Separate application invoked to send + * HTTP[S](S.md) POST, can include additional parameters + +## Symbols + +* Cross-platform symbol file format +* Contents + * Function names + * Source file names and line numbers + * Windows: Frame pointer omission data + * Future: parameters and local variables +* Symbol conversion methods + +## Processor + +* Examines minidump file and invokes stackwalker +* Symbol files requested from a SymbolSupplier +* Produces stack trace +* Output may be placed where convenient + +## Intergation + +* Breakpad client present in Gran Paradiso Alpha 1 for Windows + * Disabled by default + * Enable with `MOZ_AIRBAG` +* Proof-of-concept collector + * http://mavra.perilith.com/~luser/airbag-collector/list.pl +* Other platforms coming soon + +## More Information + +* Project home: https://chromium.googlesource.com/breakpad/breakpad +* Mailing lists + * [google-breakpad-dev@googlegroups.com](http://groups.google.com/group/google-breakpad-dev/) + * [google-breakpad-discuss@googlegroups.com](http://groups.google.com/group/google-breakpad-discuss/) +* Ask me (irc.mozilla.org: mento) diff --git a/docs/processor_design.md b/docs/processor_design.md new file mode 100644 index 0000000..7b9f244 --- /dev/null +++ b/docs/processor_design.md @@ -0,0 +1,231 @@ +# Breakpad Processor Library + +## Objective + +The Breakpad processor library is an open-source framework to access the the +information contained within crash dumps for multiple platforms, and to use that +information to produce stack traces showing the call chain of each thread in a +process. After processing, this data is made available to users of the library. + +## Background + +The Breakpad processor is intended to sit at the core of a comprehensive +crash-reporting system that does not require debugging information to be +provided to those running applications being monitored. Some existing +crash-reporting systems, such as [GNOME](http://www.gnome.org/)’s Bug-Buddy and +[Apple](http://www.apple.com/)’s +[CrashReporter](http://developer.apple.com/technotes/tn2004/tn2123.html), +require symbolic +information to be present on the end user’s computer; in the case of +CrashReporter, the reports are transmitted only to Apple, not to third-party +developers. Other systems, such as [Microsoft](http://www.microsoft.com/)’s +[Windows Error Reporting](http://msdn.microsoft.com/isv/resources/wer/) and +SupportSoft’s Talkback, transmit only a snapshot of a crashed process’ state, +which can later be combined with symbolic debugging information without the need +for it to be present on end users’ computers. Because symbolic debugging +information consumes a large amount of space and is otherwise not needed during +the normal operation of software, and because some developers are reluctant to +release debugging symbols to their customers, Breakpad follows the latter +approach. + +We know of no currently-maintained crash-reporting systems that meet our +requirements, which are to: * allow for symbols to be separate from the +application, * handle crash reports from multiple platforms, * allow developers +to operate their own crash-reporting platform, and to * be open-source. Windows +Error Reporting only functions for Microsoft products, and requires the +involvement of Microsoft’s servers. Talkback, while cross-platform, has not been +maintained and at this point does not support Mac OS X on x86, which we consider +to be a significant platform. Talkback is also closed-source commercial +software, and has very specific requirements for its server platform. + +We are aware of Windows-only crash-reporting systems that leverage Microsoft’s +debugging interfaces. Such systems, even if extended to support dumps from other +platforms, are tied to using Windows for at least a portion of the processor +platform. + +## Overview + +The Breakpad processor itself is written in standard C++ and will work on a +variety of platforms. The dumps it accepts may also have been created on a +variety of systems. The library is able to combine dumps with symbolic debugging +information to create stack traces that include function signatures. The +processor library includes simple command-line tools to examine dumps and +process them, producing stack traces. It also exposes several layers of APIs +enabling crash-reporting systems to be built around the Breakpad processor. + +## Detailed Design + +### Dump Files + +In the processor, the dump data is of primary significance. Dumps typically +contain: + +* CPU context (register data) as it was at the time the crash occurred, and an + indication of which thread caused the crash. General-purpose registers are + included, as are special-purpose registers such as the instruction pointer + (program counter). +* Information about each thread of execution within a crashed process, + including: + * The memory region used for each thread’s stack. + * CPU context for each thread, which for various reasons is not the same + as the crash context in the case of the crashed thread. +* A list of loaded code segments (or modules), including: + * The name of the file (`.so`, `.exe`, `.dll`, etc.) which provides the + code. + * The boundaries of the memory region in which the code segment is visible + to the process. + * A reference to the debugging information for the code module, when such + information is available. + +Ordinarily, dumps are produced as a result of a crash, but other triggers may be +set to produce dumps at any time a developer deems appropriate. The Breakpad +processor can handle dumps in the minidump format, either generated by an +[Breakpad client “handler”](client_design.md) implementation, or by another +implementation that produces dumps in this format. The +[DbgHelp.dll!MiniDumpWriteDump](http://msdn2.microsoft.com/en-us/library/ms680360.aspx) +function on Windows +produces dumps in this format, and is the basis for the Breakpad handler +implementation on that platform. + +The [minidump format](http://msdn.microsoft.com/en-us/library/ms679293%28VS.85%29.aspx) is +essentially a simple container format, organized as a series of streams. Each +stream contains some type of data relevant to the crash. A typical “normal” +minidump contains streams for the thread list, the module list, the CPU context +at the time of the crash, and various bits of additional system information. +Other types of minidump can be generated, such as a full-memory minidump, which +in addition to stack memory contains snapshots of all of a process’ mapped +memory regions. + +The minidump format was chosen as Breakpad’s dump format because it has an +established track record on Windows, and it can be adapted to meet the needs of +the other platforms that Breakpad supports. Most other operating systems use +“core” files as their native dump formats, but the capabilities of core files +vary across platforms, and because core files are usually presented in a +platform’s native executable format, there are complications involved in +accessing the data contained therein without the benefit of the header files +that define an executable format’s entire structure. Because minidumps are +leaner than a typical executable format, a redefinition of the format in a +cross-platform header file, `minidump_format.h`, was a straightforward task. +Similarly, the capabilities of the minidump format are understood, and because +it provides an extensible container, any of Breakpad’s needs that could not be +met directly by the standard minidump format could likely be met by extending it +as needed. Finally, using this format means that the dump file is compatible +with native debugging tools at least on Windows. A possible future avenue for +exploration is the conversion of minidumps to core files, to enable this same +benefit on other platforms. + +We have already provided an extension to the minidump format that allows it to +carry dumps generated on systems with PowerPC processors. The format already +allows for variable CPUs, so our work in this area was limited to defining a +context structure sufficient to represent the execution state of a PowerPC. We +have also defined an extension that allows minidumps to indicate which thread of +execution requested a dump be produced for non-crash dumps. + +Often, the information contained within a dump alone is sufficient to produce a +full stack backtrace for each thread. Certain optimizations that compilers +employ in producing code frustrate this process. Specifically, the “frame +pointer omission” optimization of x86 compilers can make it impossible to +produce useful stack traces given only a stack snapshot and CPU context. In +these cases, however, compiler-emitted debugging information can aid in +producing useful stack traces. The Breakpad processor is able to take advantage +of this debugging information as supplied by Microsoft’s C/C++ compiler, the +only compiler to apply such optimizations by default. As a result, the Breakpad +processor can produce useful stack traces even from code with frame pointer +omission optimizations as produced by this compiler. + +### Symbol Files + +The [symbol files](symbol_files.md) that the Breakpad processor accepts allow +for frame pointer omission data, but this is only one of their capabilities. +Each symbol file also includes information about the functions, source files, +and source code line numbers for a single module of code. A module is an +individually-loadble chunk of code: these can be executables containing a main +program (`exe` files on Windows) or shared libraries (`.so` files on Linux, +`.dylib` files, frameworks, and bundles on Mac OS X, and `.dll` files on +Windows). Dumps contain information about which of these modules were loaded at +the time the dump was produced, and given this information, the Breakpad +processor attempts to locate debugging symbols for the module through a +user-supplied function embodied in a “symbol supplier.” Breakpad includes a +sample symbol supplier, called `SimpleSymbolSupplier`, that is used by its +command-line tools; this supplier locates symbol files by pathname. +`SimpleSymbolSupplier` is also available to other users of the Breakpad +processor library. This allows for the use of a simple reference implementation, +but preserves flexibility for users who may have more demanding symbol file +storage needs. + +Breakpad’s symbol file format is text-based, and was defined to be fairly +human-readable and to encompass the needs of multiple platforms. The Breakpad +processor itself does not operate directly with native symbol formats +([DWARF](http://dwarf.freestandards.org/) and +[STABS](http://sourceware.org/gdb/current/onlinedocs/stabs.html) +on most Unix-like systems, +[.pdb files](http://msdn2.microsoft.com/en-us/library/yd4f8bd1(VS.80).aspx) +on Windows), +because of the complications in accessing potentially complex symbol formats +with slight variations between platforms, stored within different types of +binary formats. In the case of `.pdb` files, the debugging format is not even +documented. Instead, Breakpad’s symbol files are produced on each platform, +using specific debugging APIs where available, to convert native symbols to +Breakpad’s cross-platform format. + +### Processing + +Most commonly, a developer will enable an application to use Breakpad by +building it with a platform-specific [client “handler”](client_design.md) +library. After building the application, the developer will create symbol files +for Breakpad’s use using the included `dump_syms` or `symupload` tools, or +another suitable tool, and place the symbol files where the processor’s symbol +supplier will be able to locate them. + +When a dump file is given to the processor’s `MinidumpProcessor` class, it will +read it using its included minidump reader, contained in the `Minidump` family +of classes. It will collect information about the operating system and CPU that +produced the dump, and determine whether the dump was produced as a result of a +crash or at the direct request of the application itself. It then loops over all +of the threads in a process, attempting to walk the stack associated with each +thread. This process is achieved by the processor’s `Stackwalker` components, of +which there are a slightly different implementations for each CPU type that the +processor is able to handle dumps from. Beginning with a thread’s context, and +possibly using debugging data, the stackwalker produces a list of stack frames, +containing each instruction executed in the chain. These instructions are +matched up with the modules that contributed them to a process, and the +`SymbolSupplier` is invoked to locate a symbol file. The symbol file is given to +a `SourceLineResolver`, which matches the instruction up with a specific +function name, source file, and line number, resulting in a representation of a +stack frame that can easily be used to identify which code was executing. + +The results of processing are made available in a `ProcessState` object, which +contains a vector of threads, each containing a vector of stack frames. + +For small-scale use of the Breakpad processor, and for testing and debugging, +the `minidump_stackwalk` tool is provided. It invokes the processor and displays +the full results of processing, optionally allowing symbols to be provided to +the processor by a pathname-based symbol supplier, `SimpleSymbolSupplier`. + +For lower-level testing and debugging, the processor library also includes a +`minidump_dump` tool, which walks through an entire minidump file and displays +its contents in somewhat readable form. + +### Platform Support + +The Breakpad processor library is able to process dumps produced on Mac OS X +systems running on x86, x86-64, and PowerPC processors, on Windows and Linux +systems running on x86 or x86-64 processors, and on Android systems running ARM +or x86 processors. The processor library itself is written in standard C++, and +should function properly in most Unix-like environments. It has been tested on +Linux and Mac OS X. + +## Future Plans + +There are currently no firm plans or timetables to implement any of these +features, although they are possible avenues for future exploration. + +The symbol file format can be extended to carry information about the locations +of parameters and local variables as stored in stack frames and registers, and +the processor can use this information to provide enhanced stack traces showing +function arguments and variable values. + +On Mac OS X and Linux, we can provide tools to convert files from the minidump +format into the native core format. This will enable developers to open dump +files in a native debugger, just as they are presently able to do with minidumps +on Windows. diff --git a/docs/stack_walking.md b/docs/stack_walking.md new file mode 100644 index 0000000..9411159 --- /dev/null +++ b/docs/stack_walking.md @@ -0,0 +1,144 @@ +# Introduction + +This page aims to provide a detailed description of how Breakpad produces stack +traces from the information contained within a minidump file. + +# Details + +## Starting the Process + +Typically the stack walking process is initiated by instantiating the +[MinidumpProcessor](../src/processor/minidump_processor.cc) +class and calling the [MinidumpProcessor::Process](../src/processor/minidump_processor.cc#61) +method, providing it a minidump file to process. To produce a useful stack +trace, the MinidumpProcessor requires two other objects which are passed in its +constructor: a [SymbolSupplier](../src/google_breakpad/processor/symbol_supplier.h) +and a [SourceLineResolverInterface](../src/google_breakpad/processor/source_line_resolver_interface.h). +The SymbolSupplier object is responsible for locating and providing SymbolFiles +that match modules from the minidump. The SourceLineResolverInterface is +responsible for loading the symbol files and using the information contained +within to provide function and source information for stack frames, as well as +information on how to unwind from a stack frame to its caller. More detail will +be provided on these interactions later. + +A number of data streams are extracted from the minidump to begin stack walking: +the list of threads from the process +([MinidumpThreadList](../src/google_breakpad/processor/minidump.h#335)), +the list of modules loaded in the process +([MinidumpModuleList](../src/google_breakpad/processor/minidump.h#501)), +and information about the exception that caused the process to crash +([MinidumpException](../src/google_breakpad/processor/minidump.h#615)). + +## Enumerating Threads + +For each thread in the thread list +([MinidumpThread](../src/google_breakpad/processor/minidump.h#299)), +the thread memory containing the stack for the thread +([MinidumpMemoryRegion](../src/google_breakpad/processor/minidump.h#236)) +and the CPU context representing the CPU state of the thread at the time the +dump was written ([MinidumpContext](../src/google_breakpad/processor/minidump.h#171)) +are extracted from the minidump. If the thread being processed is the thread +that produced the exception then a CPU context is obtained from the +MinidumpException object instead, which represents the CPU state of the thread +at the point of the exception. A stack walker is then instantiated by calling +the [Stackwalker::StackwalkerForCPU](../src/google_breakpad/processor/stackwalker.h#77) +method and passing it the CPU context, the thread memory, the module list, as +well as the SymbolSupplier and SourceLineResolverInterface. This method selects +the specific !Stackwalker subclass based on the CPU architecture of the provided +CPU context and returns an instance of that subclass. + +## Walking a thread's stack + +Once a !Stackwalker instance has been obtained, the processor calls the +[Stackwalker::Walk](../src/google_breakpad/processor/source_line_resolver_interface.h) +method to obtain a list of frames representing the stack of this thread. The +!Stackwalker starts by calling the GetContextFrame method which returns a +StackFrame representing the top of the stack, with CPU state provided by the +initial CPU context. From there, the stack walker repeats the following steps +for each frame in turn: + +### Finding the Module + +The address of the instruction pointer of the current frame is used to determine +which module contains the current frame by calling the module list's +[GetModuleForAddress](../src/google_breakpad/processor/code_modules.h#56) method. + +### Locating Symbols + +If a module is located, the SymbolSupplier is asked to locate symbols +corresponding to the module by calling its +[GetCStringSymbolData](../src/google_breakpad/processor/symbol_supplier.h#87) +method. Typically this is implemented by using the module's debug filename (the +PDB filename for Windows dumps) and debug identifier (a GUID plus one extra +digit) as a lookup key. The [SimpleSymbolSupplier](../src/processor/simple_symbol_supplier.cc) +class simply uses these as parts of a file path to locate a flat file on disk. + +### Loading Symbols + +If a symbol file is located, the SourceLineResolverInterface is then asked to +load the symbol file by calling its +[LoadModuleUsingMemoryBuffer](../src/google_breakpad/processor/source_line_resolver_interface.h#71) +method. The [BasicSourceLineResolver](../src/processor/basic_source_line_resolver.cc) +implementation parses the text-format [symbol file](symbol_files.md) into +in-memory data structures to make lookups by address of function names, source +line information, and unwind information easy. + +### Getting source line information + +If a symbol file has been successfully loaded, the SourceLineResolverInterface's +[FillSourceLineInfo](../src/google_breakpad/processor/source_line_resolver_interface.h#89) +method is called to provide a function name and source line information for the +current frame. This is done by subtracting the base address of the module +containing the current frame from the instruction pointer of the current frame +to obtain a relative virtual address (RVA), which is a code offset relative to +the start of the module. This RVA is then used as a lookup into a table of +functions ([FUNC lines](SymbolFiles#FUNC_records.md) from the symbol file), each +of which has an associated address range (function start address, function +size). If a function is found whose address range contains the RVA, then its +name is used. The RVA is then used as a lookup into a table of source lines +([line records](SymbolFiles#Line_records.md) from the symbol file), each of +which also has an associated address range. If a match is found it will provide +the file name and source line associated with the current frame. If no match was +found in the function table, another table of publicly exported symbols may be +consulted ([PUBLIC lines](SymbolFiles#PUBLIC_records.md) from the symbol file). +Public symbols contain only a start address, so the lookup simply looks for the +nearest symbol that is less than the provided RVA. + +### Finding the caller frame + +To find the next frame in the stack, the !Stackwalker calls its +[GetCallerFrame](../src/google_breakpad/processor/stackwalker.h#186) +method, passing in the current frame. Each !Stackwalker subclass implements +GetCallerFrame differently, but there are common patterns. + +Typically the first step is to query the SourceLineResolverInterface for the +presence of detailed unwind information. This is done using its +[FindWindowsFrameInfo](../src/google_breakpad/processor/source_line_resolver_interface.h#96) +and [FindCFIFrameInfo](../src/google_breakpad/processor/source_line_resolver_interface.h#102) +methods. These methods look for Windows unwind info extracted from a PDB file +([STACK WIN](SymbolFiles#STACK_WIN_records.md) lines from the symbol file), or +DWARF CFI extracted from a binary ([STACK CFI](SymbolFiles#STACK_CFI_records.md) +lines from the symbol file) respectively. The information covers address ranges, +so the RVA of the current frame is used for lookup as with function and source +line information. + +If unwind info is found it provides a set of rules to recover the register state +of the caller frame given the current register state as well as the thread's +stack memory. The rules are evaluated to produce the caller frame. + +If unwind info is not found then the !Stackwalker may resort to other methods. +Typically on architectures which specify a frame pointer unwinding by +dereferencing the frame pointer is tried next. If that is successful it is used +to produce the caller frame. + +If no caller frame was found by any other method most !Stackwalker +implementations resort to stack scanning by looking at each word on the stack +down to a fixed depth (implemented in the +[Stackwalker::ScanForReturnAddress](../src/google_breakpad/processor/stackwalker.h#131) +method) and using a heuristic to attempt to find a reasonable return address +(implemented in the +[Stackwalker::InstructionAddressSeemsValid](../src/google_breakpad/processor/stackwalker.h#111) method). + +If no caller frame is found or the caller frame seems invalid, stack walking +stops. If a caller frame was found then these steps repeat using the new frame +as the current frame. diff --git a/docs/sym_upload_v2_protocol.md b/docs/sym_upload_v2_protocol.md new file mode 100644 index 0000000..d56a4c8 --- /dev/null +++ b/docs/sym_upload_v2_protocol.md @@ -0,0 +1,214 @@ +# Introduction + +The `sym_upload` tool is able to operate in `sym-upload-v2` protocol mode, in +addition to the legacy protocol (which will be referred to as `sym-upload-v1` +for the rest of this document). For now `sym-upload-v2` is HTTP/REST-based but +it could be extended to operate over gRPC instead, in the future. + +# Table of Contents +* [Why](#why) +* [How](#how) + * [Uploading](#uploading) + * [Uploading with `sym_upload`](#uploading-with-sym_upload) + * [Uploading with curl](#uploading-with-curl) + * [Serving the `sym-upload-v2` protocol](#serving-the-sym-upload-v2-protocol) + * [Authenticate using `key`](#authenticate-using-key) + * [Symbol `checkStatus`](#symbol-checkstatus) + * [Upload `create`](#upload-create) + * [Uploading the symbol file](#uploading-the-symbol-file) + * [Upload complete](#upload-complete) + + +# Why + +Using `sym_upload` in `sym-upload-v2` protocol mode has the following features +beyond `sym-upload-v1`: + * Authentication via `key` (arbitrary secret). + * Symbol identifier (product of `debug_file` and `debug_id`, as recorded in +output from `dump_syms`) can be checked against existing symbol information on +server. If it's present, then the upload is skipped entirely. + +# How + +## Uploading + +### Uploading with `sym_upload` + +Uploading in `sym-upload-v2` protocol mode is easy. Invoke `sym_upload` like +``` +$ ./sym_upload -p sym-upload-v2 [-k ] +``` + +Where `symbol-file` is a symbol file created by `dump_syms`, `API-URL` is the +URL of your `sym-upload-v2` API service (see next section for details), and +`API-key` is a secret known to your uploader and server. + +For more options see `sym_upload --help`. + +### Uploading with curl + +As an example, if: + * Your API's URL was "https://sym-upload-api". + * Your service has assigned you `key` "myfancysecret123". + * You wanted to upload the symbol file at "path/to/file_name", with +`debug_file` being "file_name" and `debug_id` being +"123123123123123123123123123". Normally you would read these values from +"path/to/file_name", which in turn was generated by `dump_syms`. + +Then you might run: +``` +$ curl https://sym-upload-api/symbols/file_name/123123123123123123123123123:checkStatus?key=myfancysecret123 +``` + +And, upon seeing that this `debug_file`/`debug_id` combo is missing from symbol +storage then you could run: +``` +$ curl --request POST https://sym-upload-api/uploads:create?key=myfancysecret123 +``` + +Which returns `upload_url` "https://upload-server/42?creds=shhhhh" and +`upload_key` "42". Next you upload the file directly like: +``` +$ curl -T path/to/file_name "https://upload-server/42?creds=shhhhh" +``` + +Once the HTTP PUT is complete, run: +``` +$ curl --header "Content-Type: application/json" \ + --request POST \ + --data '{symbol_id:{"debugFile":"file_name",'\ + '"debugId":"123123123123123123123123123"}}' \ + https://sym-upload-api/uploads/42:complete?key=myfancysecret123 +``` + +### Serving the `sym-upload-v2` Protocol + +The protocol is currently defined only in HTTP/REST. There are three necessary +REST operations to implement in your service: +* `/symbols//:checkStatus?key=` +* `/uploads:create?key=` +* `/uploads/:complete?key=` + +#### Authenticate Using `key` + +The query string arg `key` contains some secret that both the uploader and +server understand. It is up to the service implementer to decide on what +constitutes a valid `key`, how the uploader acquires one, and how to handle +requests made with invalid ones. + +#### Symbol `checkStatus` + +``` +/symbols//:checkStatus?key= +``` + +This operation expects an empty (or no) JSON payload in the request. + +This operation should return the status of the symbol file uniquely identified +by the given `debug_file` and `debug_id`. JSON schema: +``` +{ + "type": object", + "properties": { + "status": { + "type": "string", + "enum": ["STATUS_UNSPECIFIED", "MISING", "FOUND"], + "required": true + } + } +} +``` + +Where `MISSING` denotes that the symbol file does not exist on the server and +`FOUND` denotes that the symbol file exists on the server. + +#### Upload `create` + +``` +/uploads:create?key= +``` + +This operation expects an empty (or no) JSON payload in the request. + +This operation should return a URL that uploader can HTTP PUT their symbol file +to, along with an "upload key" that can be used to notify the service once the +file upload is completed. JSON schema: +``` +{ + "type": "object", + "properties": { + "upload_url": { + "type: "string", + "required": true + }, + "upload_key": { + "type": "string", + "required": true + } + } +} +``` + +Since this REST API operation can be authenticated via the `key` query string +arg, the service can return a URL that encodes permission delegation to the +upload endpoint resource and thereby constrain the ability to upload to those +with valid `key`s. + +#### Uploading the Symbol File + +Note that the actual symbol upload step is _not_ part of the REST API. The +upload URL obtained in the above operation is meant to be used as the endpoint +for a normal HTTP PUT request for the contents of the symbol file. Once that +HTTP PUT request is completed use the upload `complete` operation. + +#### Upload `complete` + +``` +/uploads/:complete?key= +``` + +This operation expects a JSON payload in the HTTP request body with the +following schema: +``` +{ + "type": "object", + "properties": { + "symbol_id": { + "type": "object", + "properties": { + "debug_file": { + "type": "string", + "required": true + }, + "debug_id": { + "type": "string", + "required": true + } + } + } + } +} +``` + +This operation should cause the symbol storage back-end (however implemented) +to consume the symbol file identified by `upload_key`. It is up to the service +implementation to decide how uploads are assigned `upload_key`s and how to +retrieve a completed upload by its `upload_key`. If the symbol file cannot be +found, is malformed, or the operation cannot be completed for any other reason +then an HTTP error will be returned. JSON schema of non-error responses: +``` +{ + "type": "object", + "properties": { + "result": { + "type": string, + "enum": ["RESULT_UNSPECIFIED", "OK", "DUPLICATE_DATA"], + "required": true + } + } +} +``` + +Where `OK` denotes that the symbol storage was updated with the new symbol file +and `DUPLICATE_DATA` denotes that the symbol file data was identical to data +already in symbol storage and therefore nothing changed. diff --git a/docs/symbol_files.md b/docs/symbol_files.md new file mode 100644 index 0000000..e05b455 --- /dev/null +++ b/docs/symbol_files.md @@ -0,0 +1,581 @@ +# Introduction + +Given a minidump file, the Breakpad processor produces stack traces that include +function names and source locations. However, minidump files contain only the +byte-by-byte contents of threads' registers and stacks, without function names +or machine-code-to-source mapping data. The processor consults Breakpad symbol +files for the information it needs to produce human-readable stack traces from +the binary-only minidump file. + +The platform-specific symbol dumping tools parse the debugging information the +compiler provides (whether as DWARF or STABS sections in an ELF file or as +stand-alone PDB files), and write that information back out in the Breakpad +symbol file format. This format is much simpler and less detailed than compiler +debugging information, and values legibility over compactness. + +# Overview + +Breakpad symbol files are ASCII text files, with lines delimited as appropriate +for the host platform. Each line is a _record_, divided into fields by single +spaces; in some cases, the last field of the record can contain spaces. The +first field is a string indicating what sort of record the line represents +(except for line records; these are very common, making them the default saves +space). Some fields hold decimal or hexadecimal numbers; hexadecimal numbers +have no "0x" prefix, and use lower-case letters. + +Breakpad symbol files contain the following record types. With some +restrictions, these may appear in any order. + +* A `MODULE` record describes the executable file or shared library from which + this data was derived, for use by symbol suppliers. A `MODULE' record should + be the first record in the file. + +* A `FILE` record gives a source file name, and assigns it a number by which + other records can refer to it. + +* An `INLINE_ORIGIN` record holds an inline function name for `INLINE` records + to refer to. + +* A `FUNC` record describes a function present in the source code. + +* An `INLINE` record describes the inline function's nest level, call site + line and call site source file to which the given ranges of machine code + should be attributed. + +* A line record indicates to which source file and line a given range of + machine code should be attributed. The line is attributed to the function + defined by the most recent `FUNC` record. + +* A `PUBLIC` record gives the address of a linker symbol. + +* A `STACK` record provides information necessary to produce stack traces. + +# `MODULE` records + +A `MODULE` record provides meta-information about the module the symbol file +describes. It has the form: + +> `MODULE` _operatingsystem_ _architecture_ _id_ _name_ + +For example: `MODULE Linux x86 D3096ED481217FD4C16B29CD9BC208BA0 firefox-bin +` These records provide meta-information about the executable or shared library +from which this symbol file was generated. A symbol supplier might use this +information to find the correct symbol files to use to interpret a given +minidump, or to perform other sorts of validation. If present, a `MODULE` record +should be the first line in the file. + +The fields are separated by spaces, and cannot contain spaces themselves, except +for _name_. + +* The _operatingsystem_ field names the operating system on which the + executable or shared library was intended to run. This field should have one + of the following values: + + | **Value** | **Meaning** | + |:----------|:--------------------| + | Linux | Linux | + | mac | Macintosh OSX | + | windows | Microsoft Windows | + +* The _architecture_ field indicates what processor architecture the + executable or shared library contains machine code for. This field should + have one of the following values: + + | **Value** | **Instruction Set Architecture** | + |:----------|:---------------------------------| + | x86 | Intel IA-32 | + | x86\_64 | AMD64/Intel 64 | + | ppc | 32-bit PowerPC | + | ppc64 | 64-bit PowerPC | + | unknown | unknown | + +* The _id_ field is a sequence of hexadecimal digits that identifies the exact + executable or library whose contents the symbol file describes. The way in + which it is computed varies from platform to platform. + +* The _name_ field contains the base name (the final component of the + directory path) of the executable or library. It may contain spaces, and + extends to the end of the line. + +# `FILE` records + +A `FILE` record holds a source file name for other records to refer to. It has +the form: + +> `FILE` _number_ _name_ + +For example: `FILE 2 /home/jimb/mc/in/browser/app/nsBrowserApp.cpp +` + +A `FILE` record provides the name of a source file, and assigns it a number +which other records (line records, in particular) can use to refer to that file +name. The _number_ field is a decimal number. The _name_ field is the name of +the file; it may contain spaces. + +# `INLINE_ORIGIN` records + +An `INLINE_ORIGIN` record holds an inline function name for `INLINE` records to +refer to. It has the form: + +> `INLINE_ORIGIN` _number_ _name_ + +For example: `INLINE_ORIGIN 2 nsQueryInterfaceWithError::operator()(nsID const&, +void**) const +` + +An `INLINE_ORIGIN` record provides the name of an inline function, and assigns +it a number which other records (`INLINE` records, in particular) can use to +refer to that function name. The _number_ field is a decimal number. The _name_ +field is the name of the inline function; it may contain spaces. + +# `FUNC` records + +A `FUNC` record describes a source-language function. It has the form: + +> `FUNC` _[m]_ _address_ _size_ _parameter\_size_ _name_ + +For example: `FUNC m c184 30 0 nsQueryInterfaceWithError::operator()(nsID const&, +void**) const +` + +The _m_ field is optional. If present it indicates that multiple symbols +reference this function's instructions. (In which case, only one symbol name is +mentioned within the breakpad file.) Multiple symbols referencing the same +instructions may occur due to identical code folding by the linker. + +The _address_ and _size_ fields are hexadecimal numbers indicating the start +address and length in bytes of the machine code instructions the function +occupies. (Breakpad symbol files cannot accurately describe functions whose code +is not contiguous.) The start address is relative to the module's load address. + +The _parameter\_size_ field is a hexadecimal number indicating the size, in +bytes, of the arguments pushed on the stack for this function. Some calling +conventions, like the Microsoft Windows `stdcall` convention, require the called +function to pop parameters passed to it on the stack from its caller before +returning. The stack walker uses this value, along with data from `STACK` +records, to step from the called function's frame to the caller's frame. + +The _name_ field is the name of the function. In languages that use linker +symbol name mangling like C++, this should be the source language name (the +"unmangled" form). This field may contain spaces. + +# `INLINE` records + +An `INLINE` record describes the inline function's nest level, call site line +and call site source file to which the given ranges of machine code should be +attributed. It has the form: + +> `INLINE` _inline_nest_level_ _call_site_line_ _call_site_file_num_ +> _origin_num_ [_address_ _size_]+ + +For example: `INLINE 0 10 3 4 d30 2a fa1 b +` + +The _inline_nest_level_ field is a decimal number that means it's inlined at the +function described by a previous `INLINE` record which has _inline_nest_level_ +one less than its. In the example below, first and third `INLINE` records have +_inline_nest_level_ 0, which means they are inlined inside the function +described by the `FUNC` record. The second `INLINE` record has +_inline_nest_level_ 1 means that it's inlined at the inline function described +by first `INLINE` record. +``` +FUNC ... +INLINE 0 ... +INLINE 1 ... +INLINE 0 ... +``` + +The _call_site_line_ and _call_site_file_num_ fields are decimal numbers +indicating where this inline function being called at. + +The _origin_num_ field refers to an `INLINE_ORIGIN` record that has the name +of the inline function. + +The _address_ and _size_ fields are hexadecimal numbers indicating the start +address and length in bytes of the machine code. The address is relative to the +module's load address. There could be more than one [_address_ _size_] range +pair, since inline functions could have discontinuous address ranges. The ranges +of an `INLINE` record are always inside the ranges described by its parent +record (a `FUNC` record or an `INLINE` record). + +The `INLINE` record is assumed to belong to the function described by the last +preceding `FUNC` record. `INLINE` records may not appear before the first `FUNC` +record. + +# Line records + +A line record describes the source file and line number to which a given range +of machine code should be attributed. It has the form: + +> _address_ _size_ _line_ _filenum_ + +For example: `c184 7 59 4 +` + +Because they are so common, line records do not begin with a string indicating +the record type. All other record types' names use upper-case letters; +hexadecimal numbers, like a line record's _address_, use lower-case letters. + +The _address_ and _size_ fields are hexadecimal numbers indicating the start +address and length in bytes of the machine code. The address is relative to the +module's load address. + +The _line_ field is the line number to which the machine code should be +attributed, in decimal; the first line of the source file is line number 1. The +_filenum_ field is a decimal number appearing in a prior `FILE` record; the name +given in that record is the source file name for the machine code. + +The line is assumed to belong to the function described by the last preceding +`FUNC` record. Line records may not appear before the first `FUNC' record. + +No two line records in a symbol file cover the same range of addresses. However, +there may be many line records with identical line and file numbers, as a given +source line may contribute many non-contiguous blocks of machine code. + +# `PUBLIC` records + +A `PUBLIC` record describes a publicly visible linker symbol, such as that used +to identify an assembly language entry point or region of memory. It has the +form: + +> PUBLIC _[m]_ _address_ _parameter\_size_ _name_ + +For example: `PUBLIC m 2160 0 Public2_1 +` + +The Breakpad processor essentially treats a `PUBLIC` record as defining a +function with no line number data and an indeterminate size: the code extends to +the next address mentioned. If a given address is covered by both a `PUBLIC` +record and a `FUNC` record, the processor uses the `FUNC` data. + +The _m_ field is optional. If present it indicates that multiple symbols +reference this function's instructions. (In which case, only one symbol name is +mentioned within the breakpad file.) Multiple symbols referencing the same +instructions may occur due to identical code folding by the linker. + +The _address_ field is a hexadecimal number indicating the symbol's address, +relative to the module's load address. + +The _parameter\_size_ field is a hexadecimal number indicating the size of the +parameters passed to the code whose entry point the symbol marks, if known. This +field has the same meaning as the _parameter\_size_ field of a `FUNC` record; +see that description for more details. + +The _name_ field is the name of the symbol. In languages that use linker symbol +name mangling like C++, this should be the source language name (the "unmangled" +form). This field may contain spaces. + +# `STACK WIN` records + +Given a stack frame, a `STACK WIN` record indicates how to find the frame that +called it. It has the form: + +> STACK WIN _type_ _rva_ _code\_size_ _prologue\_size_ _epilogue\_size_ +> _parameter\_size_ _saved\_register\_size_ _local\_size_ _max\_stack\_size_ +> _has\_program\_string_ _program\_string\_OR\_allocates\_base\_pointer_ + +For example: `STACK WIN 4 2170 14 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = +$ebp $ebp ^ = +` + +All fields of a `STACK WIN` record, except for the last, are hexadecimal +numbers. + +The _type_ field indicates what sort of stack frame data this record holds. Its +value should be one of the values of the +[StackFrameTypeEnum](http://msdn.microsoft.com/en-us/library/bc5207xw%28VS.100%29.aspx) +type in Microsoft's +[Debug Interface Access (DIA)](http://msdn.microsoft.com/en-us/library/x93ctkx8%28VS.100%29.aspx) API. +Breakpad uses only records of type 4 (`FrameTypeFrameData`) and 0 +(`FrameTypeFPO`); it ignores others. These types differ only in whether the last +field is an _allocates\_base\_pointer_ flag (`FrameTypeFPO`) or a program string +(`FrameTypeFrameData`). If more than one record covers a given address, Breakpad +prefers `FrameTypeFrameData` records over `FrameTypeFPO` records. + +The _rva_ and _code\_size_ fields give the starting address and length in bytes +of the machine code covered by this record. The starting address is relative to +the module's load address. + +The _prologue\_size_ and _epilogue\_size_ fields give the length, in bytes, of +the prologue and epilogue machine code within the record's range. Breakpad does +not use these values. + +The _parameter\_size_ field gives the number of argument bytes this function +expects to have been passed. This field has the same meaning as the +_parameter\_size_ field of a `FUNC` record; see that description for more +details. + +The _saved\_register\_size_ field gives the number of bytes in the stack frame +dedicated to preserving the values of any callee-saves registers used by this +function. + +The _local\_size_ field gives the number of bytes in the stack frame dedicated +to holding the function's local variables and temporary values. + +The _max\_stack\_size_ field gives the maximum number of bytes pushed on the +stack in the frame. Breakpad does not use this value. + +If the _has\_program\_string_ field is zero, then the `STACK WIN` record's final +field is an _allocates\_base\_pointer_ flag, as a hexadecimal number; this is +expected for records whose _type_ is 0. Otherwise, the final field is a program +string. + +## Interpreting a `STACK WIN` record + +Given the register values for a frame F, we can find the calling frame as +follows: + +* If the _has\_program\_string_ field of a `STACK WIN` record is zero, then + the final field is _allocates\_base\_pointer_, a flag indicating whether the + frame uses the frame pointer register, `%ebp`, as a general-purpose + register. + * If _allocates\_base\_pointer_ is true, then `%ebp` does not point to the + frame's base address. Instead, + * Let _next\_parameter\_size_ be the parameter size of the function + frame F called (**not** this record's _parameter\_size_ field), or + zero if F is the youngest frame on the stack. You must find this + value in F's callee's `FUNC`, `STACK WIN`, or `PUBLIC` records. + * Let _frame\_size_ be the sum of the _local\_size_ field, the + _saved\_register\_size_ field, and _next\_parameter\_size_. > > With + those definitions in place, we can recover the calling frame as + follows: + * F's return address is at `%esp +`_frame\_size_, + * the caller's value of `%ebp` is saved at `%esp + +`_next\_parameter\_size_`+`_saved\_register\_size_`- 8`, and + * the caller's value of `%esp` just before the call instruction was + `%esp +`_frame\_size_`+ 4`. > > (Why do we include + _next\_parameter\_size_ in the sum when computing _frame\_size_ and + the address of the saved `%ebp`? When a function A has called a + function B, the arguments that A pushed for B are considered part of + A's stack frame: A's value for `%esp` points at the last argument + pushed for B. Thus, we must include the size of those arguments + (given by the debugging info for B) along with the size of A's + register save area and local variable area (given by the debugging + info for A) when computing the overall size of A's frame.) + * If _allocates\_base\_pointer_ is false, then F's function doesn't use + `%ebp` at all. You may recover the calling frame as above, except that + the caller's value of `%ebp` is the same as F's value for `%ebp`, so no + steps are necessary to recover it. +* If the _has\_program\_string_ field of a `STACK WIN` record is not zero, + then the record's final field is a string containing a program to be + interpreted to recover the caller's frame. The comments in the + [postfix\_evaluator.h](../src/processor/postfix_evaluator.h#40) + header file explain the language in which the program is written. You should + place the following variables in the dictionary before interpreting the + program: + * `$ebp` and `$esp` should be the values of the `%ebp` and `%esp` + registers in F. + * `.cbParams`, `.cbSavedRegs`, and `.cbLocals`, should be the values of + the `STACK WIN` record's _parameter\_size_, _saved\_register\_size_, and + _local\_size_ fields. + * `.raSearchStart` should be set to the address on the stack to begin + scanning for a return address, if necessary. The Breakpad processor sets + this to the value of `%esp` in F, plus the _frame\_size_ value mentioned + above. + +> If the program stores values for `$eip`, `$esp`, `$ebp`, `$ebx`, `$esi`, or +> `$edi`, then those are the values of the given registers in the caller. If the +> value of `$eip` is zero, that indicates that the end of the stack has been +> reached. + +The Breakpad processor checks that the value yielded by the above for the +calling frame's instruction address refers to known code; if the address seems +to be bogus, then it uses a heuristic search to find F's return address and +stack base. + +# `STACK CFI` records + +`STACK CFI` ("Call Frame Information") records describe how to walk the stack +when execution is at a given machine instruction. These records take one of two +forms: + +> `STACK CFI INIT` _address_ _size_ _register1_: +> _expression1_ _register2_: _expression2_ ... +> +> `STACK CFI` _address_ _register1_: _expression1_ +> _register2_: _expression2_ ... + +For example: + +``` +STACK CFI INIT 804c4b0 40 .cfa: $esp 4 + $eip: .cfa 4 - ^ +STACK CFI 804c4b1 .cfa: $esp 8 + $ebp: .cfa 8 - ^ +``` + +The _address_ and _size_ fields are hexadecimal numbers. Each +_register_i is the name of a register or pseudoregister. Each +_expression_ is a Breakpad postfix expression, which may contain spaces, but +never ends with a colon. (The appropriate register names for a given +architecture are determined when `STACK CFI` records are first enabled for that +architecture, and should be documented in the appropriate +`stackwalker_`_architecture_`.cc` source file.) + +STACK CFI records describe, at each machine instruction in a given function, how +to recover the values the machine registers had in the function's caller. +Naturally, some registers' values are simply lost, but there are three cases in +which they can be recovered: + +* You can always recover the program counter, because that's the function's + return address. If the function is ever going to return, the PC must be + saved somewhere. + +* You can always recover the stack pointer. The function is responsible for + popping its stack frame before it returns to the caller, so it must be able + to restore this, as well. + +* You should be able to recover the values of callee-saves registers. These + are registers whose values the callee must preserve, either by saving them + in its own stack frame before using them and re-loading them before + returning, or by not using them at all. + +(As an exception, note that functions which never return may not save any of +this data. It may not be possible to walk the stack past such functions' stack +frames.) + +Given rules for recovering the values of a function's caller's registers, we can +walk up the stack. Starting with the current set of registers --- the PC of the +instruction we're currently executing, the current stack pointer, etc. --- we +use CFI to recover the values those registers had in the caller of the current +frame. This gives us a PC in the caller whose CFI we can look up; we apply the +process again to find that function's caller; and so on. + +Concretely, CFI records represent a table with a row for each machine +instruction address and a column for each register. The table entry for a given +address and register contains a rule describing how, when the PC is at that +address, to restore the value that register had in the caller. + +There are some special columns: + +* A column named `.cfa`, for "Canonical Frame Address", tells how to compute + the base address of the frame; other entries can refer to the CFA in their + rules. + +* A column named `.ra` represents the return address. + +For example, suppose we have a machine with 32-bit registers, one-byte +instructions, a stack that grows downwards, and an assembly language that +resembles C. Suppose further that we have a function whose machine code looks +like this: + +``` +func: ; entry point; return address at sp +func+0: sp -= 16 ; allocate space for stack frame +func+1: sp[12] = r0 ; save 4-byte r0 at sp+12 + ... ; stuff that doesn't affect stack +func+10: sp -= 4; *sp = x ; push some 4-byte x on the stack + ... ; stuff that doesn't affect stack +func+20: r0 = sp[16] ; restore saved r0 +func+21: sp += 20 ; pop whole stack frame +func+22: pc = *sp; sp += 4 ; pop return address and jump to it +``` + +The following table would describe the function above: + +| **code address** | **.cfa** | **r0 (on Google Code)** | **r1 (on Google Code)** | ... | **.ra** | +|:-----------------|:---------|:------------------------|:------------------------|:----|:---------| +| func+0 | sp | | | | `cfa[0]` | +| func+1 | sp+16 | | | | `cfa[0]` | +| func+2 | sp+16 | `cfa[-4]` | | | `cfa[0]` | +| func+11 | sp+20 | `cfa[-4]` | | | `cfa[0]` | +| func+21 | sp+20 | | | | `cfa[0]` | +| func+22 | sp | | | | `cfa[0]` | + +Some things to note here: + +* Each row describes the state of affairs **before** executing the instruction + at the given address. Thus, the row for func+0 describes the state before we + execute the first instruction, which allocates the stack frame. In the next + row, the formula for computing the CFA has changed, reflecting the + allocation. + +* The other entries are written in terms of the CFA; this allows them to + remain unchanged as the stack pointer gets bumped around. For example, to + find the caller's value for r0 (on Google Code) at func+2, we would first + compute the CFA by adding 16 to the sp, and then subtract four from that to + find the address at which r0 (on Google Code) was saved. + +* Although the example doesn't show this, most calling conventions designate + "callee-saves" and "caller-saves" registers. The callee must restore the + values of "callee-saves" registers before returning (if it uses them at + all), whereas the callee is free to use "caller-saves" registers without + restoring their values. A function that uses caller-saves registers + typically does not save their original values at all; in this case, the CFI + marks such registers' values as "unrecoverable". + +* Exactly where the CFA points in the frame --- at the return address? below + it? At some fixed point within the frame? --- is a question of definition + that depends on the architecture and ABI in use. But by definition, the CFA + remains constant throughout the lifetime of the frame. It's up to + architecture- specific code to know what significance to assign the CFA, if + any. + +To save space, the most common type of CFI record only mentions the table +entries at which changes take place. So for the above, the CFI data would only +actually mention the non-blank entries here: + +| **insn** | **cfa** | **r0 (on Google Code)** | **r1 (on Google Code)** | ... | **ra** | +|:---------|:--------|:------------------------|:------------------------|:----|:---------| +| func+0 | sp | | | | `cfa[0]` | +| func+1 | sp+16 | | | | | +| func+2 | | `cfa[-4]` | | | | +| func+11 | sp+20 | | | | | +| func+21 | | r0 (on Google Code) | | | | +| func+22 | sp | | | | | + +A `STACK CFI INIT` record indicates that, at the machine instruction at +_address_, belonging to some function, the value that _registern_ had +in that function's caller can be recovered by evaluating +_expressionn_. The values of any callee-saves registers not mentioned +are assumed to be unchanged. (`STACK CFI` records never mention caller-saves +registers.) These rules apply starting at _address_ and continue up to, but not +including, the address given in the next `STACK CFI` record. The _size_ field is +the total number of bytes of machine code covered by this record and any +subsequent `STACK CFI` records (until the next `STACK CFI INIT` record). The +_address_ field is relative to the module's load address. + +A `STACK CFI` record (no `INIT`) is the same, except that it mentions only those +registers whose recovery rules have changed from the previous CFI record. There +must be a prior `STACK CFI INIT` or `STACK CFI` record in the symbol file. The +_address_ field of this record must be greater than that of the previous record, +and it must not be at or beyond the end of the range given by the most recent +`STACK CFI INIT` record. The address is relative to the module's load address. + +Each expression is a breakpad-style postfix expression. Expressions may contain +spaces, but their tokens may not end with colons. When an expression mentions a +register, it refers to the value of that register in the callee, even if a prior +name/expression pair gives that register's value in the caller. The exception is +`.cfa`, which refers to the canonical frame address computed by the .cfa rule in +force at the current instruction. + +The special expression `.undef` indicates that the given register's value cannot +be recovered. + +The register names preceding the expressions are always followed by colons. The +expressions themselves never contain tokens ending with colons. + +There are two special register names: + +* `.cfa` ("Canonical Frame Address") is the base address of the stack frame. + Other registers' rules may refer to this. If no rule is provided for the + stack pointer, the value of `.cfa` is the caller's stack pointer. + +* `.ra` is the return address. This is the value of the restored program + counter. We use `.ra` instead of the architecture-specific name for the + program counter. + +The Breakpad stack walker requires that there be rules in force for `.cfa` and +`.ra` at every code address from which it unwinds. If those rules are not +present, the stack walker will ignore the `STACK CFI` data, and try to use a +different strategy. + +So the CFI for the example function above would be as follows, if `func` were at +address 0x1000 (relative to the module's load address): + +``` +STACK CFI INIT 1000 .cfa: $sp .ra: .cfa ^ +STACK CFI 1001 .cfa: $sp 16 + +STACK CFI 1002 $r0: .cfa 4 - ^ +STACK CFI 100b .cfa: $sp 20 + +STACK CFI 1015 $r0: $r0 +STACK CFI 1016 .cfa: $sp +``` diff --git a/docs/windows_client_integration.md b/docs/windows_client_integration.md new file mode 100644 index 0000000..99a8492 --- /dev/null +++ b/docs/windows_client_integration.md @@ -0,0 +1,70 @@ +# Windows Integration overview + +## Windows Client Code + +The Windows client code is in the `src/client/windows` directory of the tree. +Since the header files are fairly well commented some specifics are purposely +omitted from this document. + +## Integration of minidump-generation + +Once you build the solution inside `src/client/windows`, an output file of +`exception_handler.lib` will be generated. You can either check this into your +project's directory or build directly from the source, as the project itself +does. + +Enabling Breakpad in your application requires you to `#include +"exception_handler.h"` and instantiate the `ExceptionHandler` object like so: + +``` + handler = new ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + const CustomClientInfo* custom_info); +``` + +The parameters, in order, are: + +* pathname for minidumps to be written to - this is ignored if OOP dump + generation is used +* A callback that is called when the exception is first handled - you can + return true/false here to continue/stop exception processing +* A callback that is called after minidumps have been written +* Context for the callbacks +* Which exceptions to handle - see `HandlerType` enumeration in + exception\_handler.h +* The type of minidump to generate, using the `MINIDUMP_TYPE` definitions in + `DbgHelp.h` +* A pipe name that can be used to communicate with a crash generation server +* A pointer to a CustomClientInfo class that can be used to send custom data + along with the minidump when using OOP generation + +You can also see `src/client/windows/tests/crash_generation_app/*` for a sample +app that uses OOP generation. + +## OOP Minidump Generation + +For out of process minidump generation, more work is needed. If you look inside +`src/client/windows/crash_generation`, you will see a file called +`crash_generation_server.h`. This file is the interface for a crash generation +server, which must be instantiated with the same pipe name that is passed to the +client above. The logistics of running a separate process that instantiates the +crash generation server is left up to you, however. + +## Build process specifics(symbol generation, upload) + +The symbol creation step is talked about in the general overview doc, since it +doesn't vary much by platform. You'll need to make sure that the symbols are +available wherever minidumps are uploaded to for processing. + +## Out in the field - uploading the minidump + +Inside `src/client/windows/sender` is a class implementation called +`CrashReportSender`. This class can be compiled into a separate standalone CLI +or in the crash generation server and used to upload the report; it can know +when to do so via one of the callbacks provided by the `CrashGenerationServer` +or the `ExceptionHandler` object for in-process generation. diff --git a/m4/ax_append_compile_flags.m4 b/m4/ax_append_compile_flags.m4 new file mode 100644 index 0000000..2bb27ef --- /dev/null +++ b/m4/ax_append_compile_flags.m4 @@ -0,0 +1,67 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# For every FLAG1, FLAG2 it is checked whether the compiler works with the +# flag. If it does, the flag is added FLAGS-VARIABLE +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. During the check the flag is always added to the +# current language's flags. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: This macro depends on the AX_APPEND_FLAG and +# AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with +# AX_APPEND_LINK_FLAGS. +# +# LICENSE +# +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 5 + +AC_DEFUN([AX_APPEND_COMPILE_FLAGS], +[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG]) +AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) +for flag in $1; do + AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4]) +done +])dnl AX_APPEND_COMPILE_FLAGS diff --git a/m4/ax_append_flag.m4 b/m4/ax_append_flag.m4 new file mode 100644 index 0000000..08f2e07 --- /dev/null +++ b/m4/ax_append_flag.m4 @@ -0,0 +1,71 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) +# +# DESCRIPTION +# +# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space +# added in between. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains +# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly +# FLAG. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 6 + +AC_DEFUN([AX_APPEND_FLAG], +[dnl +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) +AS_VAR_SET_IF(FLAGS,[ + AS_CASE([" AS_VAR_GET(FLAGS) "], + [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], + [ + AS_VAR_APPEND(FLAGS,[" $1"]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) + ], + [ + AS_VAR_SET(FLAGS,[$1]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) +AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_APPEND_FLAG diff --git a/m4/ax_check_compile_flag.m4 b/m4/ax_check_compile_flag.m4 new file mode 100644 index 0000000..ca36397 --- /dev/null +++ b/m4/ax_check_compile_flag.m4 @@ -0,0 +1,74 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 4 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/m4/ax_check_define.m4 b/m4/ax_check_define.m4 new file mode 100644 index 0000000..20ba808 --- /dev/null +++ b/m4/ax_check_define.m4 @@ -0,0 +1,92 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_check_define.html +# =========================================================================== +# +# SYNOPSIS +# +# AC_CHECK_DEFINE([symbol], [ACTION-IF-FOUND], [ACTION-IF-NOT]) +# AX_CHECK_DEFINE([includes],[symbol], [ACTION-IF-FOUND], [ACTION-IF-NOT]) +# +# DESCRIPTION +# +# Complements AC_CHECK_FUNC but it does not check for a function but for a +# define to exist. Consider a usage like: +# +# AC_CHECK_DEFINE(__STRICT_ANSI__, CFLAGS="$CFLAGS -D_XOPEN_SOURCE=500") +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 9 + +AU_ALIAS([AC_CHECK_DEFINED], [AC_CHECK_DEFINE]) +AC_DEFUN([AC_CHECK_DEFINE],[ +AS_VAR_PUSHDEF([ac_var],[ac_cv_defined_$1])dnl +AC_CACHE_CHECK([for $1 defined], ac_var, +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ + #ifdef $1 + int ok; + #else + choke me + #endif +]])],[AS_VAR_SET(ac_var, yes)],[AS_VAR_SET(ac_var, no)])) +AS_IF([test AS_VAR_GET(ac_var) != "no"], [$2], [$3])dnl +AS_VAR_POPDEF([ac_var])dnl +]) + +AU_ALIAS([AX_CHECK_DEFINED], [AX_CHECK_DEFINE]) +AC_DEFUN([AX_CHECK_DEFINE],[ +AS_VAR_PUSHDEF([ac_var],[ac_cv_defined_$2_$1])dnl +AC_CACHE_CHECK([for $2 defined in $1], ac_var, +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <$1>]], [[ + #ifdef $2 + int ok; + #else + choke me + #endif +]])],[AS_VAR_SET(ac_var, yes)],[AS_VAR_SET(ac_var, no)])) +AS_IF([test AS_VAR_GET(ac_var) != "no"], [$3], [$4])dnl +AS_VAR_POPDEF([ac_var])dnl +]) + +AC_DEFUN([AX_CHECK_FUNC], +[AS_VAR_PUSHDEF([ac_var], [ac_cv_func_$2])dnl +AC_CACHE_CHECK([for $2], ac_var, +dnl AC_LANG_FUNC_LINK_TRY +[AC_LINK_IFELSE([AC_LANG_PROGRAM([$1 + #undef $2 + char $2 ();],[ + char (*f) () = $2; + return f != $2; ])], + [AS_VAR_SET(ac_var, yes)], + [AS_VAR_SET(ac_var, no)])]) +AS_IF([test AS_VAR_GET(ac_var) = yes], [$3], [$4])dnl +AS_VAR_POPDEF([ac_var])dnl +])# AC_CHECK_FUNC diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4 new file mode 100644 index 0000000..a3d964c --- /dev/null +++ b/m4/ax_cxx_compile_stdcxx.m4 @@ -0,0 +1,1009 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the specified +# version of the C++ standard. If necessary, add switches to CXX and +# CXXCPP to enable support. VERSION may be '11', '14', '17', or '20' for +# the respective C++ standard version. +# +# The second argument, if specified, indicates whether you insist on an +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. +# -std=c++11). If neither is specified, you get whatever works, with +# preference for no added switch, and then for an extended mode. +# +# The third argument, if specified 'mandatory' or if left unspecified, +# indicates that baseline support for the specified C++ standard is +# required and that the macro should error out if no mode with that +# support is found. If specified 'optional', then configuration proceeds +# regardless, after defining HAVE_CXX${VERSION} if and only if a +# supporting mode is found. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik +# Copyright (c) 2012 Zack Weinberg +# Copyright (c) 2013 Roy Stogner +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov +# Copyright (c) 2015 Paul Norman +# Copyright (c) 2015 Moritz Klammler +# Copyright (c) 2016, 2018 Krzesimir Nowak +# Copyright (c) 2019 Enji Cooper +# Copyright (c) 2020 Jason Merrill +# Copyright (c) 2021 Jörn Heusipp +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 15 + +dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro +dnl (serial version number 13). + +AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl + m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], + [$1], [14], [ax_cxx_compile_alternatives="14 1y"], + [$1], [17], [ax_cxx_compile_alternatives="17 1z"], + [$1], [20], [ax_cxx_compile_alternatives="20"], + [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$2], [], [], + [$2], [ext], [], + [$2], [noext], [], + [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], + [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], + [$3], [optional], [ax_cxx_compile_cxx$1_required=false], + [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + AC_LANG_PUSH([C++])dnl + ac_success=no + + m4_if([$2], [], [dnl + AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, + ax_cv_cxx_compile_cxx$1, + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [ax_cv_cxx_compile_cxx$1=yes], + [ax_cv_cxx_compile_cxx$1=no])]) + if test x$ax_cv_cxx_compile_cxx$1 = xyes; then + ac_success=yes + fi]) + + m4_if([$2], [noext], [], [dnl + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + switch="-std=gnu++${alternative}" + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi]) + + m4_if([$2], [ext], [], [dnl + if test x$ac_success = xno; then + dnl HP's aCC needs +std=c++11 according to: + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf + dnl Cray's crayCC needs "-h std=c++11" + for alternative in ${ax_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done + fi]) + AC_LANG_POP([C++]) + if test x$ax_cxx_compile_cxx$1_required = xtrue; then + if test x$ac_success = xno; then + AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) + fi + fi + if test x$ac_success = xno; then + HAVE_CXX$1=0 + AC_MSG_NOTICE([No compiler with C++$1 support was found]) + else + HAVE_CXX$1=1 + AC_DEFINE(HAVE_CXX$1,1, + [define if the compiler supports basic C++$1 syntax]) + fi + AC_SUBST(HAVE_CXX$1) +]) + + +dnl Test body for checking C++11 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 +) + +dnl Test body for checking C++14 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 +) + +dnl Test body for checking C++17 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 +) + +dnl Test body for checking C++20 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 +) + + +dnl Tests for new features in C++11 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +// MSVC always sets __cplusplus to 199711L in older versions; newer versions +// only set it correctly if /Zc:__cplusplus is specified as well as a +// /std:c++NN switch: +// https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +#elif __cplusplus < 201103L && !defined _MSC_VER + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; + + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + +]]) + + +dnl Tests for new features in C++14 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L && !defined _MSC_VER + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + +]]) + + +dnl Tests for new features in C++17 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201703L && !defined _MSC_VER + +#error "This is not a C++17 compiler" + +#else + +#include +#include +#include + +namespace cxx17 +{ + + namespace test_constexpr_lambdas + { + + constexpr int foo = [](){return 42;}(); + + } + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template + int multiply(Args... args) + { + return (args * ... * 1); + } + + template + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same, decltype(foo)>::value); + static_assert(std::is_same::value); + } + + namespace test_typename_in_template_template_parameter + { + + template typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + + namespace test_template_argument_deduction_for_class_templates + { + + template + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } + + namespace test_non_type_auto_template_parameters + { + + template + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + + namespace test_structured_bindings + { + + int arr[2] = { 1, 2 }; + std::pair pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } + + namespace test_exception_spec_type_system + { + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template + Bad + f(T*, T*); + + template + Good + f(T1*, T2*); + + static_assert (std::is_same_v); + + } + + namespace test_inline_variables + { + + template void f(T) + {} + + template inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus < 201703L && !defined _MSC_VER + +]]) + + +dnl Tests for new features in C++20 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[ + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 202002L && !defined _MSC_VER + +#error "This is not a C++20 compiler" + +#else + +#include + +namespace cxx20 +{ + +// As C++20 supports feature test macros in the standard, there is no +// immediate need to actually test for feature availability on the +// Autoconf side. + +} // namespace cxx20 + +#endif // __cplusplus < 202002L && !defined _MSC_VER + +]]) diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4 new file mode 100644 index 0000000..77ae09c --- /dev/null +++ b/m4/ax_pthread.m4 @@ -0,0 +1,283 @@ +# =========================================================================== +# http://www.nongnu.org/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). (This +# is necessary on AIX to use the special cc_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also link it with them as well. e.g. you should link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threads programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name +# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 6 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) + AC_MSG_RESULT($ax_pthread_ok) + if test x"$ax_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ;; + + *-darwin*) + acx_pthread_flags="-pthread $acx_pthread_flags" + ;; +esac + +if test x"$ax_pthread_ok" = xno; then +for flag in $ax_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include + static void routine(void* a) {a=0;} + static void* start_routine(void* a) {return a;}], + [pthread_t th; pthread_attr_t attr; + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_create(&th,0,start_routine,0); + pthread_cleanup_pop(0); ], + [ax_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($ax_pthread_ok) + if test "x$ax_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$ax_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl AX_PTHREAD diff --git a/m4/ax_require_defined.m4 b/m4/ax_require_defined.m4 new file mode 100644 index 0000000..cae1111 --- /dev/null +++ b/m4/ax_require_defined.m4 @@ -0,0 +1,37 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_REQUIRE_DEFINED(MACRO) +# +# DESCRIPTION +# +# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have +# been defined and thus are available for use. This avoids random issues +# where a macro isn't expanded. Instead the configure script emits a +# non-fatal: +# +# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found +# +# It's like AC_REQUIRE except it doesn't expand the required macro. +# +# Here's an example: +# +# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) +# +# LICENSE +# +# Copyright (c) 2014 Mike Frysinger +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 1 + +AC_DEFUN([AX_REQUIRE_DEFINED], [dnl + m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) +])dnl AX_REQUIRE_DEFINED diff --git a/m4/libtool.m4 b/m4/libtool.m4 new file mode 100644 index 0000000..a3fee53 --- /dev/null +++ b/m4/libtool.m4 @@ -0,0 +1,7377 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 56 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl +_LT_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\[$]0 --fallback-echo"')dnl " + lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` + ;; +esac + +_LT_OUTPUT_LIBTOOL_INIT +]) + + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2008 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +if test "$no_create" != yes; then + lt_cl_success=: + test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" + exec AS_MESSAGE_LOG_FD>/dev/null + $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false + exec AS_MESSAGE_LOG_FD>>config.log + $lt_cl_success || AS_EXIT(1) +fi +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_XSI_SHELLFNS + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX +# ----------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_SHELL_INIT + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[_LT_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +[$]* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(lt_ECHO) +]) +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], + [An echo program that does not interpret backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[AC_CHECK_TOOL(AR, ar, false) +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1]) + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method == "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac +AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + linux* | k*bsd*-gnu) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE(int foo(void) {}, + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + ) + LDFLAGS="$save_LDFLAGS" + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [fix_srcfile_path], [1], + [Fix the shell variable $srcfile for the compiler]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_PROG_CXX +# ------------ +# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +# compiler, we have our own version here. +m4_defun([_LT_PROG_CXX], +[ +pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +AC_PROG_CXX +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_CXX + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_CXX], []) + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[AC_REQUIRE([_LT_PROG_CXX])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +]) +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_PROG_F77 +# ------------ +# Since AC_PROG_F77 is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_F77], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +AC_PROG_F77 +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_F77 + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_F77], []) + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_REQUIRE([_LT_PROG_F77])dnl +AC_LANG_PUSH(Fortran 77) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${F77-"f77"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_PROG_FC +# ----------- +# Since AC_PROG_FC is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_FC], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +AC_PROG_FC +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_FC + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_FC], []) + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_REQUIRE([_LT_PROG_FC])dnl +AC_LANG_PUSH(Fortran) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${FC-"f95"} + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC="$lt_save_CC" +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC="$lt_save_CC" +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_XSI_SHELLFNS +# --------------------- +# Bourne and XSI compatible variants of some useful shell functions. +m4_defun([_LT_PROG_XSI_SHELLFNS], +[case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $[*] )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +dnl func_dirname_and_basename +dnl A portable version of this function is already defined in general.m4sh +dnl so there is no need for it here. + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[[^=]]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$[@]"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} + +_LT_EOF + ;; + esac +]) diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 new file mode 100644 index 0000000..34151a3 --- /dev/null +++ b/m4/ltoptions.m4 @@ -0,0 +1,368 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [0], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 new file mode 100644 index 0000000..9000a05 --- /dev/null +++ b/m4/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 new file mode 100644 index 0000000..f3c5309 --- /dev/null +++ b/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# Generated from ltversion.in. + +# serial 3017 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.2.6b]) +m4_define([LT_PACKAGE_REVISION], [1.3017]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.2.6b' +macro_revision='1.3017' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 new file mode 100644 index 0000000..637bb20 --- /dev/null +++ b/m4/lt~obsolete.m4 @@ -0,0 +1,92 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 4 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) diff --git a/src/breakpad_googletest_includes.h b/src/breakpad_googletest_includes.h new file mode 100644 index 0000000..4bc44a8 --- /dev/null +++ b/src/breakpad_googletest_includes.h @@ -0,0 +1,56 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef BREAKPAD_GOOGLETEST_INCLUDES_H__ +#define BREAKPAD_GOOGLETEST_INCLUDES_H__ + +#include "gtest/gtest.h" +#include "gmock/gmock.h" + +// If AddressSanitizer is used, NULL pointer dereferences generate SIGILL +// (illegal instruction) instead of SIGSEGV (segmentation fault). Also, +// the number of memory regions differs, so there is no point in running +// this test if AddressSanitizer is used. +// +// Ideally we'd use this attribute to disable ASAN on a per-func basis, +// but this doesn't seem to actually work, and it's changed names over +// time. So just stick with disabling the actual tests. +// http://crbug.com/304575 +//#define NO_ASAN __attribute__((no_sanitize_address)) +#if defined(__clang__) && defined(__has_feature) +// Have to keep this check sep from above as newer gcc will barf on it. +# if __has_feature(address_sanitizer) +# define ADDRESS_SANITIZER +# endif +#elif defined(__GNUC__) && defined(__SANITIZE_ADDRESS__) +# define ADDRESS_SANITIZER +#else +# undef ADDRESS_SANITIZER +#endif + +#endif // BREAKPAD_GOOGLETEST_INCLUDES_H__ diff --git a/src/client/apple/Framework/BreakpadDefines.h b/src/client/apple/Framework/BreakpadDefines.h new file mode 100644 index 0000000..1946534 --- /dev/null +++ b/src/client/apple/Framework/BreakpadDefines.h @@ -0,0 +1,72 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Keys for configuration file +#define kReporterMinidumpDirectoryKey "MinidumpDir" +#define kReporterMinidumpIDKey "MinidumpID" + +// Filename for recording uploaded IDs +#define kReporterLogFilename "uploads.log" + +// The default subdirectory of the Library to put crash dumps in +// The subdirectory is +// ~/Library// +#define kDefaultLibrarySubdirectory "Breakpad" + +// Specify some special keys to be used in the configuration file that is +// generated by Breakpad and consumed by the crash_sender. +#define BREAKPAD_PRODUCT "BreakpadProduct" +#define BREAKPAD_PRODUCT_DISPLAY "BreakpadProductDisplay" +#define BREAKPAD_VERSION "BreakpadVersion" +#define BREAKPAD_VENDOR "BreakpadVendor" +#define BREAKPAD_URL "BreakpadURL" +#define BREAKPAD_REPORT_INTERVAL "BreakpadReportInterval" +#define BREAKPAD_SKIP_CONFIRM "BreakpadSkipConfirm" +#define BREAKPAD_CONFIRM_TIMEOUT "BreakpadConfirmTimeout" +#define BREAKPAD_SEND_AND_EXIT "BreakpadSendAndExit" +#define BREAKPAD_DUMP_DIRECTORY "BreakpadMinidumpLocation" +#define BREAKPAD_INSPECTOR_LOCATION "BreakpadInspectorLocation" +#define BREAKPAD_REPORTER_EXE_LOCATION \ + "BreakpadReporterExeLocation" +#define BREAKPAD_LOGFILES "BreakpadLogFiles" +#define BREAKPAD_LOGFILE_UPLOAD_SIZE "BreakpadLogFileTailSize" +#define BREAKPAD_REQUEST_COMMENTS "BreakpadRequestComments" +#define BREAKPAD_COMMENTS "BreakpadComments" +#define BREAKPAD_REQUEST_EMAIL "BreakpadRequestEmail" +#define BREAKPAD_EMAIL "BreakpadEmail" +#define BREAKPAD_SERVER_TYPE "BreakpadServerType" +#define BREAKPAD_SERVER_PARAMETER_DICT "BreakpadServerParameters" +#define BREAKPAD_IN_PROCESS "BreakpadInProcess" + +// The keys below are NOT user supplied, and are used internally. +#define BREAKPAD_PROCESS_START_TIME "BreakpadProcStartTime" +#define BREAKPAD_PROCESS_UP_TIME "BreakpadProcessUpTime" +#define BREAKPAD_PROCESS_CRASH_TIME "BreakpadProcessCrashTime" +#define BREAKPAD_LOGFILE_KEY_PREFIX "BreakpadAppLogFile" +#define BREAKPAD_SERVER_PARAMETER_PREFIX "BreakpadServerParameterPrefix_" +#define BREAKPAD_ON_DEMAND "BreakpadOnDemand" diff --git a/src/client/ios/Breakpad.h b/src/client/ios/Breakpad.h new file mode 100644 index 0000000..950c038 --- /dev/null +++ b/src/client/ios/Breakpad.h @@ -0,0 +1,259 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Framework to provide a simple C API to crash reporting for +// applications. By default, if any machine-level exception (e.g., +// EXC_BAD_ACCESS) occurs, it will be handled by the BreakpadRef +// object as follows: +// +// 1. Create a minidump file (see Breakpad for details) +// 2. Create a config file. +// +// These files can then be uploaded to a server. + +typedef void* BreakpadRef; + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include + +// The keys in the dictionary returned by |BreakpadGenerateReport|. +#define BREAKPAD_OUTPUT_DUMP_FILE "BreakpadDumpFile" +#define BREAKPAD_OUTPUT_CONFIG_FILE "BreakpadConfigFile" + +// Optional user-defined function to decide if we should handle this crash or +// forward it along. +// Return true if you want Breakpad to handle it. +// Return false if you want Breakpad to skip it +// The exception handler always returns false, as if SEND_AND_EXIT were false +// (which means the next exception handler will take the exception) +typedef bool (*BreakpadFilterCallback)(int exception_type, + int exception_code, + mach_port_t crashing_thread, + void* context); + +// Optional user-defined function that will be called after a network upload +// of a crash report. +// |report_id| will be the id returned by the server, or "ERR" if an error +// occurred. +// |error| will contain the error, or nil if no error occured. +typedef void (*BreakpadUploadCompletionCallback)(NSString* report_id, + NSError* error); + +// Create a new BreakpadRef object and install it as an exception +// handler. The |parameters| will typically be the contents of your +// bundle's Info.plist. +// +// You can also specify these additional keys for customizable behavior: +// Key: Value: +// BREAKPAD_PRODUCT Product name (e.g., "MyAwesomeProduct") +// This one is used as the key to identify +// the product when uploading. Falls back to +// CFBundleName if not specified. +// REQUIRED +// +// BREAKPAD_PRODUCT_DISPLAY This is the display name, e.g. a pretty +// name for the product when the crash_sender +// pops up UI for the user. Falls back first to +// CFBundleDisplayName and then to +// BREAKPAD_PRODUCT if not specified. +// +// BREAKPAD_VERSION Product version (e.g., 1.2.3), used +// as metadata for crash report. Falls back to +// CFBundleVersion if not specified. +// REQUIRED +// +// BREAKPAD_VENDOR Vendor name, used in UI (e.g. "A report has +// been created that you can send to ") +// +// BREAKPAD_URL URL destination for reporting +// REQUIRED +// +// BREAKPAD_DUMP_DIRECTORY The directory to store crash-dumps +// in. By default, we use +// ~/Library/Cache/Breakpad/ +// The path you specify here is tilde-expanded. +// +// BREAKPAD_SERVER_TYPE A parameter that tells Breakpad how to +// rewrite the upload parameters for a specific +// server type. The currently valid values are +// 'socorro' or 'google'. If you want to add +// other types, see the function in +// crash_report_sender.m that maps parameters to +// URL parameters. Defaults to 'google'. +// +// BREAKPAD_SERVER_PARAMETER_DICT A plist dictionary of static +// parameters that are uploaded to the +// server. The parameters are sent as +// is to the crash server. Their +// content isn't added to the minidump +// but pass as URL parameters when +// uploading theminidump to the crash +// server. +//============================================================================= +// The BREAKPAD_PRODUCT, BREAKPAD_VERSION and BREAKPAD_URL are +// required to have non-NULL values. By default, the BREAKPAD_PRODUCT +// will be the CFBundleName and the BREAKPAD_VERSION will be the +// CFBundleVersion when these keys are present in the bundle's +// Info.plist, which is usually passed in to BreakpadCreate() as an +// NSDictionary (you could also pass in another dictionary that had +// the same keys configured). If the BREAKPAD_PRODUCT or +// BREAKPAD_VERSION are ultimately undefined, BreakpadCreate() will +// fail. You have been warned. +// +// If you are running in a debugger, Breakpad will not install, unless the +// BREAKPAD_IGNORE_DEBUGGER envionment variable is set and/or non-zero. +// +//============================================================================= +// The following are NOT user-supplied but are documented here for +// completeness. They are calculated by Breakpad during initialization & +// crash-dump generation, or entered in by the user. +// +// BREAKPAD_PROCESS_START_TIME The time, in seconds since the Epoch, the +// process started +// +// BREAKPAD_PROCESS_CRASH_TIME The time, in seconds since the Epoch, the +// process crashed. +// +// BREAKPAD_PROCESS_UP_TIME The total time in milliseconds the process +// has been running. This parameter is not +// set until the crash-dump-generation phase. +// +// BREAKPAD_SERVER_PARAMETER_PREFIX This prefix is used by Breakpad +// internally, because Breakpad uses +// the same dictionary internally to +// track both its internal +// configuration parameters and +// parameters meant to be uploaded +// to the server. This string is +// used internally by Breakpad to +// prefix user-supplied parameter +// names so those can be sent to the +// server without leaking Breakpad's +// internal values. + +// Returns a new BreakpadRef object on success, NULL otherwise. +BreakpadRef BreakpadCreate(NSDictionary* parameters); + +// Uninstall and release the data associated with |ref|. +void BreakpadRelease(BreakpadRef ref); + +// User defined key and value string storage. Generally this is used +// to configure Breakpad's internal operation, such as whether the +// crash_sender should prompt the user, or the filesystem location for +// the minidump file. See Breakpad.h for some parameters that can be +// set. Anything longer than 255 bytes will be truncated. Note that +// the string is converted to UTF8 before truncation, so any multibyte +// character that straddles the 255(256 - 1 for terminator) byte limit +// will be mangled. +// +// A maximum number of 64 key/value pairs are supported. An assert() +// will fire if more than this number are set. Unfortunately, right +// now, the same dictionary is used for both Breakpad's parameters AND +// the Upload parameters. +// +// TODO (nealsid): Investigate how necessary this is if we don't +// automatically upload parameters to the server anymore. +// TODO (nealsid): separate server parameter dictionary from the +// dictionary used to configure Breakpad, and document limits for each +// independently. +void BreakpadSetKeyValue(BreakpadRef ref, NSString* key, NSString* value); +NSString* BreakpadKeyValue(BreakpadRef ref, NSString* key); +void BreakpadRemoveKeyValue(BreakpadRef ref, NSString* key); + +// You can use this method to specify parameters that will be uploaded +// to the crash server. They will be automatically encoded as +// necessary. Note that as mentioned above there are limits on both +// the number of keys and their length. +void BreakpadAddUploadParameter(BreakpadRef ref, NSString* key, + NSString* value); + +// This method will remove a previously-added parameter from the +// upload parameter set. +void BreakpadRemoveUploadParameter(BreakpadRef ref, NSString* key); + +// Method to handle uploading data to the server + +// Returns the number of crash reports waiting to send to the server. +int BreakpadGetCrashReportCount(BreakpadRef ref); + +// Returns the next upload configuration. The report file is deleted. +NSDictionary* BreakpadGetNextReportConfiguration(BreakpadRef ref); + +// Returns the date of the most recent crash report. +NSDate* BreakpadGetDateOfMostRecentCrashReport(BreakpadRef ref); + +// Upload next report to the server. +void BreakpadUploadNextReport(BreakpadRef ref); + +// Upload next report to the server. +// |server_parameters| is additional server parameters to send. +void BreakpadUploadNextReportWithParameters( + BreakpadRef ref, + NSDictionary* server_parameters, + BreakpadUploadCompletionCallback callback); + +// Upload a report to the server. +// |server_parameters| is additional server parameters to send. +// |configuration| is the configuration of the breakpad report to send. +void BreakpadUploadReportWithParametersAndConfiguration( + BreakpadRef ref, + NSDictionary* server_parameters, + NSDictionary* configuration, + BreakpadUploadCompletionCallback callback); + +// Handles the network response of a breakpad upload. This function is needed if +// the actual upload is done by the Breakpad client. +// |configuration| is the configuration of the upload. It must contain the same +// fields as the configuration passed to +// BreakpadUploadReportWithParametersAndConfiguration. +// |data| and |error| contain the network response. +void BreakpadHandleNetworkResponse(BreakpadRef ref, + NSDictionary* configuration, + NSData* data, + NSError* error); + +// Upload a file to the server. |data| is the content of the file to sent. +// |server_parameters| is additional server parameters to send. +void BreakpadUploadData(BreakpadRef ref, NSData* data, NSString* name, + NSDictionary* server_parameters); + +// Generate a breakpad minidump and configuration file in the dump directory. +// The report will be available for uploading. The paths of the created files +// are returned in the dictionary. |server_parameters| is additional server +// parameters to add in the config file. +NSDictionary* BreakpadGenerateReport(BreakpadRef ref, + NSDictionary* server_parameters); + +#ifdef __cplusplus +} +#endif diff --git a/src/client/ios/Breakpad.mm b/src/client/ios/Breakpad.mm new file mode 100644 index 0000000..e249746 --- /dev/null +++ b/src/client/ios/Breakpad.mm @@ -0,0 +1,986 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#define IGNORE_DEBUGGER "BREAKPAD_IGNORE_DEBUGGER" + +#import "client/ios/Breakpad.h" + +#include +#import +#include +#include +#include +#include + +#include + +#import "client/ios/handler/ios_exception_minidump_generator.h" +#import "client/mac/crash_generation/ConfigFile.h" +#import "client/mac/handler/minidump_generator.h" +#import "client/mac/handler/protected_memory_allocator.h" +#import "client/mac/sender/uploader.h" +#import "common/long_string_dictionary.h" + +#if !TARGET_OS_TV && !TARGET_OS_WATCH +#import "client/mac/handler/exception_handler.h" +#else +#import "client/ios/exception_handler_no_mach.h" +#endif // !TARGET_OS_TV && !TARGET_OS_WATCH + +#if !defined(__EXCEPTIONS) || (__clang__ && !__has_feature(cxx_exceptions)) +// This file uses C++ try/catch (but shouldn't). Duplicate the macros from +// allowing this file to work properly with +// exceptions disabled even when other C++ libraries are used. #undef the try +// and catch macros first in case libstdc++ is in use and has already provided +// its own definitions. +#undef try +#define try if (true) +#undef catch +#define catch(X) if (false) +#endif // __EXCEPTIONS + +using google_breakpad::ConfigFile; +using google_breakpad::EnsureDirectoryPathExists; +using google_breakpad::LongStringDictionary; + +//============================================================================= +// We want any memory allocations which are used by breakpad during the +// exception handling process (after a crash has happened) to be read-only +// to prevent them from being smashed before a crash occurs. Unfortunately +// we cannot protect against smashes to our exception handling thread's +// stack. +// +// NOTE: Any memory allocations which are not used during the exception +// handling process may be allocated in the normal ways. +// +// The ProtectedMemoryAllocator class provides an Allocate() method which +// we'll using in conjunction with placement operator new() to control +// allocation of C++ objects. Note that we don't use operator delete() +// but instead call the objects destructor directly: object->~ClassName(); +// +ProtectedMemoryAllocator* gMasterAllocator = NULL; +ProtectedMemoryAllocator* gKeyValueAllocator = NULL; +ProtectedMemoryAllocator* gBreakpadAllocator = NULL; + +// Mutex for thread-safe access to the key/value dictionary used by breakpad. +// It's a global instead of an instance variable of Breakpad +// since it can't live in a protected memory area. +pthread_mutex_t gDictionaryMutex; + +//============================================================================= +// Stack-based object for thread-safe access to a memory-protected region. +// It's assumed that normally the memory block (allocated by the allocator) +// is protected (read-only). Creating a stack-based instance of +// ProtectedMemoryLocker will unprotect this block after taking the lock. +// Its destructor will first re-protect the memory then release the lock. +class ProtectedMemoryLocker { + public: + ProtectedMemoryLocker(pthread_mutex_t* mutex, + ProtectedMemoryAllocator* allocator) + : mutex_(mutex), + allocator_(allocator) { + // Lock the mutex + __attribute__((unused)) int rv = pthread_mutex_lock(mutex_); + assert(rv == 0); + + // Unprotect the memory + allocator_->Unprotect(); + } + + ~ProtectedMemoryLocker() { + // First protect the memory + allocator_->Protect(); + + // Then unlock the mutex + __attribute__((unused)) int rv = pthread_mutex_unlock(mutex_); + assert(rv == 0); + } + + private: + ProtectedMemoryLocker(); + ProtectedMemoryLocker(const ProtectedMemoryLocker&); + ProtectedMemoryLocker& operator=(const ProtectedMemoryLocker&); + + pthread_mutex_t* mutex_; + ProtectedMemoryAllocator* allocator_; +}; + +//============================================================================= +class Breakpad { + public: + // factory method + static Breakpad* Create(NSDictionary* parameters) { + // Allocate from our special allocation pool + Breakpad* breakpad = + new (gBreakpadAllocator->Allocate(sizeof(Breakpad))) + Breakpad(); + + if (!breakpad) + return NULL; + + if (!breakpad->Initialize(parameters)) { + // Don't use operator delete() here since we allocated from special pool + breakpad->~Breakpad(); + return NULL; + } + + return breakpad; + } + + ~Breakpad(); + + void SetKeyValue(NSString* key, NSString* value); + NSString* KeyValue(NSString* key); + void RemoveKeyValue(NSString* key); + NSArray* CrashReportsToUpload(); + NSString* NextCrashReportToUpload(); + NSDictionary* NextCrashReportConfiguration(); + NSDictionary* FixedUpCrashReportConfiguration(NSDictionary* configuration); + NSDate* DateOfMostRecentCrashReport(); + void UploadNextReport(NSDictionary* server_parameters); + void UploadReportWithConfiguration(NSDictionary* configuration, + NSDictionary* server_parameters, + BreakpadUploadCompletionCallback callback); + void UploadData(NSData* data, NSString* name, + NSDictionary* server_parameters); + void HandleNetworkResponse(NSDictionary* configuration, + NSData* data, + NSError* error); + NSDictionary* GenerateReport(NSDictionary* server_parameters); + + private: + Breakpad() + : handler_(NULL), + config_params_(NULL) {} + + bool Initialize(NSDictionary* parameters); + + bool ExtractParameters(NSDictionary* parameters); + + // Dispatches to HandleMinidump() + static bool HandleMinidumpCallback(const char* dump_dir, + const char* minidump_id, + void* context, bool succeeded); + + bool HandleMinidump(const char* dump_dir, + const char* minidump_id); + + // NSException handler + static void UncaughtExceptionHandler(NSException* exception); + + // Handle an uncaught NSException. + void HandleUncaughtException(NSException* exception); + + // Since ExceptionHandler (w/o namespace) is defined as typedef in OSX's + // MachineExceptions.h, we have to explicitly name the handler. + google_breakpad::ExceptionHandler* handler_; // The actual handler (STRONG) + + LongStringDictionary* config_params_; // Create parameters (STRONG) + + ConfigFile config_file_; + + // A static reference to the current Breakpad instance. Used for handling + // NSException. + static Breakpad* current_breakpad_; +}; + +Breakpad* Breakpad::current_breakpad_ = NULL; + +#pragma mark - +#pragma mark Helper functions + +//============================================================================= +// Helper functions + +//============================================================================= +static BOOL IsDebuggerActive() { + BOOL result = NO; + NSUserDefaults* stdDefaults = [NSUserDefaults standardUserDefaults]; + + // We check both defaults and the environment variable here + + BOOL ignoreDebugger = [stdDefaults boolForKey:@IGNORE_DEBUGGER]; + + if (!ignoreDebugger) { + char* ignoreDebuggerStr = getenv(IGNORE_DEBUGGER); + ignoreDebugger = + (ignoreDebuggerStr ? strtol(ignoreDebuggerStr, NULL, 10) : 0) != 0; + } + + if (!ignoreDebugger) { + pid_t pid = getpid(); + int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid}; + int mibSize = sizeof(mib) / sizeof(int); + size_t actualSize; + + if (sysctl(mib, mibSize, NULL, &actualSize, NULL, 0) == 0) { + struct kinfo_proc* info = (struct kinfo_proc*)malloc(actualSize); + + if (info) { + // This comes from looking at the Darwin xnu Kernel + if (sysctl(mib, mibSize, info, &actualSize, NULL, 0) == 0) + result = (info->kp_proc.p_flag & P_TRACED) ? YES : NO; + + free(info); + } + } + } + + return result; +} + +//============================================================================= +bool Breakpad::HandleMinidumpCallback(const char* dump_dir, + const char* minidump_id, + void* context, bool succeeded) { + Breakpad* breakpad = (Breakpad*)context; + + // If our context is damaged or something, just return false to indicate that + // the handler should continue without us. + if (!breakpad || !succeeded) + return false; + + return breakpad->HandleMinidump(dump_dir, minidump_id); +} + +//============================================================================= +void Breakpad::UncaughtExceptionHandler(NSException* exception) { + NSSetUncaughtExceptionHandler(NULL); + if (current_breakpad_) { + current_breakpad_->HandleUncaughtException(exception); + BreakpadRelease(current_breakpad_); + } +} + +//============================================================================= +#pragma mark - + +//============================================================================= +bool Breakpad::Initialize(NSDictionary* parameters) { + // Initialize + current_breakpad_ = this; + config_params_ = NULL; + handler_ = NULL; + + // Gather any user specified parameters + if (!ExtractParameters(parameters)) { + return false; + } + + // Check for debugger + if (IsDebuggerActive()) { + return true; + } + + // Create the handler (allocating it in our special protected pool) + handler_ = + new (gBreakpadAllocator->Allocate( + sizeof(google_breakpad::ExceptionHandler))) + google_breakpad::ExceptionHandler( + config_params_->GetValueForKey(BREAKPAD_DUMP_DIRECTORY), + 0, &HandleMinidumpCallback, this, true, 0); + NSSetUncaughtExceptionHandler(&Breakpad::UncaughtExceptionHandler); + return true; +} + +//============================================================================= +Breakpad::~Breakpad() { + NSSetUncaughtExceptionHandler(NULL); + current_breakpad_ = NULL; + // Note that we don't use operator delete() on these pointers, + // since they were allocated by ProtectedMemoryAllocator objects. + // + if (config_params_) { + config_params_->~LongStringDictionary(); + } + + if (handler_) + handler_->~ExceptionHandler(); +} + +//============================================================================= +bool Breakpad::ExtractParameters(NSDictionary* parameters) { + NSString* serverType = [parameters objectForKey:@BREAKPAD_SERVER_TYPE]; + NSString* display = [parameters objectForKey:@BREAKPAD_PRODUCT_DISPLAY]; + NSString* product = [parameters objectForKey:@BREAKPAD_PRODUCT]; + NSString* version = [parameters objectForKey:@BREAKPAD_VERSION]; + NSString* urlStr = [parameters objectForKey:@BREAKPAD_URL]; + NSString* vendor = + [parameters objectForKey:@BREAKPAD_VENDOR]; + // We check both parameters and the environment variable here. + char* envVarDumpSubdirectory = getenv(BREAKPAD_DUMP_DIRECTORY); + NSString* dumpSubdirectory = envVarDumpSubdirectory ? + [NSString stringWithUTF8String:envVarDumpSubdirectory] : + [parameters objectForKey:@BREAKPAD_DUMP_DIRECTORY]; + + NSDictionary* serverParameters = + [parameters objectForKey:@BREAKPAD_SERVER_PARAMETER_DICT]; + + if (!product) + product = [parameters objectForKey:@"CFBundleName"]; + + if (!display) { + display = [parameters objectForKey:@"CFBundleDisplayName"]; + if (!display) { + display = product; + } + } + + if (!version.length) // Default nil or empty string to CFBundleVersion + version = [parameters objectForKey:@"CFBundleVersion"]; + + if (!vendor) { + vendor = @"Vendor not specified"; + } + + if (!dumpSubdirectory) { + NSString* cachePath = + [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, + NSUserDomainMask, + YES) + objectAtIndex:0]; + dumpSubdirectory = + [cachePath stringByAppendingPathComponent:@kDefaultLibrarySubdirectory]; + + EnsureDirectoryPathExists(dumpSubdirectory); + } + + // The product, version, and URL are required values. + if (![product length]) { + return false; + } + + if (![version length]) { + return false; + } + + if (![urlStr length]) { + return false; + } + + config_params_ = + new (gKeyValueAllocator->Allocate(sizeof(LongStringDictionary))) + LongStringDictionary(); + + LongStringDictionary& dictionary = *config_params_; + + dictionary.SetKeyValue(BREAKPAD_SERVER_TYPE, [serverType UTF8String]); + dictionary.SetKeyValue(BREAKPAD_PRODUCT_DISPLAY, [display UTF8String]); + dictionary.SetKeyValue(BREAKPAD_PRODUCT, [product UTF8String]); + dictionary.SetKeyValue(BREAKPAD_VERSION, [version UTF8String]); + dictionary.SetKeyValue(BREAKPAD_URL, [urlStr UTF8String]); + dictionary.SetKeyValue(BREAKPAD_VENDOR, [vendor UTF8String]); + dictionary.SetKeyValue(BREAKPAD_DUMP_DIRECTORY, + [dumpSubdirectory UTF8String]); + + struct timeval tv; + gettimeofday(&tv, NULL); + char timeStartedString[32]; + sprintf(timeStartedString, "%zd", tv.tv_sec); + dictionary.SetKeyValue(BREAKPAD_PROCESS_START_TIME, timeStartedString); + + if (serverParameters) { + // For each key-value pair, call BreakpadAddUploadParameter() + NSEnumerator* keyEnumerator = [serverParameters keyEnumerator]; + NSString* aParameter; + while ((aParameter = [keyEnumerator nextObject])) { + BreakpadAddUploadParameter(this, aParameter, + [serverParameters objectForKey:aParameter]); + } + } + return true; +} + +//============================================================================= +void Breakpad::SetKeyValue(NSString* key, NSString* value) { + // We allow nil values. This is the same as removing the keyvalue. + if (!config_params_ || !key) + return; + + config_params_->SetKeyValue([key UTF8String], [value UTF8String]); +} + +//============================================================================= +NSString* Breakpad::KeyValue(NSString* key) { + if (!config_params_ || !key) + return nil; + + const std::string value = config_params_->GetValueForKey([key UTF8String]); + return value.empty() ? nil : [NSString stringWithUTF8String:value.c_str()]; +} + +//============================================================================= +void Breakpad::RemoveKeyValue(NSString* key) { + if (!config_params_ || !key) return; + + config_params_->RemoveKey([key UTF8String]); +} + +//============================================================================= +NSArray* Breakpad::CrashReportsToUpload() { + NSString* directory = KeyValue(@BREAKPAD_DUMP_DIRECTORY); + if (!directory) + return nil; + NSArray* dirContents = [[NSFileManager defaultManager] + contentsOfDirectoryAtPath:directory error:nil]; + NSArray* configs = [dirContents filteredArrayUsingPredicate:[NSPredicate + predicateWithFormat:@"self BEGINSWITH 'Config-'"]]; + return configs; +} + +//============================================================================= +NSString* Breakpad::NextCrashReportToUpload() { + NSString* directory = KeyValue(@BREAKPAD_DUMP_DIRECTORY); + if (!directory) + return nil; + NSString* config = [CrashReportsToUpload() lastObject]; + if (!config) + return nil; + return [NSString stringWithFormat:@"%@/%@", directory, config]; +} + +//============================================================================= +NSDictionary* Breakpad::NextCrashReportConfiguration() { + NSDictionary* configuration = [Uploader readConfigurationDataFromFile:NextCrashReportToUpload()]; + return FixedUpCrashReportConfiguration(configuration); +} + +//============================================================================= +NSDictionary* Breakpad::FixedUpCrashReportConfiguration(NSDictionary* configuration) { + NSMutableDictionary* fixedConfiguration = [[configuration mutableCopy] autorelease]; + // kReporterMinidumpDirectoryKey can become stale because the app's data container path includes + // an UUID that is not guaranteed to stay the same over time. + [fixedConfiguration setObject:KeyValue(@BREAKPAD_DUMP_DIRECTORY) + forKey:@kReporterMinidumpDirectoryKey]; + return fixedConfiguration; +} + +//============================================================================= +NSDate* Breakpad::DateOfMostRecentCrashReport() { + NSString* directory = KeyValue(@BREAKPAD_DUMP_DIRECTORY); + if (!directory) { + return nil; + } + NSFileManager* fileManager = [NSFileManager defaultManager]; + NSArray* dirContents = [fileManager contentsOfDirectoryAtPath:directory error:nil]; + NSArray* dumps = [dirContents filteredArrayUsingPredicate:[NSPredicate + predicateWithFormat:@"self ENDSWITH '.dmp'"]]; + NSDate* mostRecentCrashReportDate = nil; + for (NSString* dump in dumps) { + NSString* filePath = [directory stringByAppendingPathComponent:dump]; + NSDate* crashReportDate = + [[fileManager attributesOfItemAtPath:filePath error:nil] fileCreationDate]; + if (!mostRecentCrashReportDate) { + mostRecentCrashReportDate = crashReportDate; + } else if (crashReportDate) { + mostRecentCrashReportDate = [mostRecentCrashReportDate laterDate:crashReportDate]; + } + } + return mostRecentCrashReportDate; +} + +//============================================================================= +void Breakpad::HandleNetworkResponse(NSDictionary* configuration, + NSData* data, + NSError* error) { + Uploader* uploader = [[[Uploader alloc] + initWithConfig:configuration] autorelease]; + [uploader handleNetworkResponse:data withError:error]; +} + +//============================================================================= +void Breakpad::UploadReportWithConfiguration( + NSDictionary* configuration, + NSDictionary* server_parameters, + BreakpadUploadCompletionCallback callback) { + Uploader* uploader = [[[Uploader alloc] + initWithConfig:configuration] autorelease]; + if (!uploader) + return; + for (NSString* key in server_parameters) { + [uploader addServerParameter:[server_parameters objectForKey:key] + forKey:key]; + } + if (callback) { + [uploader setUploadCompletionBlock:^(NSString* report_id, NSError* error) { + dispatch_async(dispatch_get_main_queue(), ^{ + callback(report_id, error); + }); + }]; + } + [uploader report]; +} + +//============================================================================= +void Breakpad::UploadNextReport(NSDictionary* server_parameters) { + NSDictionary* configuration = NextCrashReportConfiguration(); + if (configuration) { + return UploadReportWithConfiguration(configuration, server_parameters, + nullptr); + } +} + +//============================================================================= +void Breakpad::UploadData(NSData* data, NSString* name, + NSDictionary* server_parameters) { + NSMutableDictionary* config = [NSMutableDictionary dictionary]; + + LongStringDictionary::Iterator it(*config_params_); + while (const LongStringDictionary::Entry* next = it.Next()) { + [config setValue:[NSString stringWithUTF8String:next->value] + forKey:[NSString stringWithUTF8String:next->key]]; + } + + Uploader* uploader = + [[[Uploader alloc] initWithConfig:config] autorelease]; + for (NSString* key in server_parameters) { + [uploader addServerParameter:[server_parameters objectForKey:key] + forKey:key]; + } + [uploader uploadData:data name:name]; +} + +//============================================================================= +NSDictionary* Breakpad::GenerateReport(NSDictionary* server_parameters) { + NSString* dumpDirAsNSString = KeyValue(@BREAKPAD_DUMP_DIRECTORY); + if (!dumpDirAsNSString) + return nil; + const char* dumpDir = [dumpDirAsNSString UTF8String]; + + google_breakpad::MinidumpGenerator generator(mach_task_self(), + MACH_PORT_NULL); + std::string dumpId; + std::string dumpFilename = generator.UniqueNameInDirectory(dumpDir, &dumpId); + bool success = generator.Write(dumpFilename.c_str()); + if (!success) + return nil; + + LongStringDictionary params = *config_params_; + for (NSString* key in server_parameters) { + params.SetKeyValue([key UTF8String], + [[server_parameters objectForKey:key] UTF8String]); + } + ConfigFile config_file; + config_file.WriteFile(dumpDir, ¶ms, dumpDir, dumpId.c_str()); + + // Handle results. + NSMutableDictionary* result = [NSMutableDictionary dictionary]; + NSString* dumpFullPath = [NSString stringWithUTF8String:dumpFilename.c_str()]; + [result setValue:dumpFullPath + forKey:@BREAKPAD_OUTPUT_DUMP_FILE]; + [result setValue:[NSString stringWithUTF8String:config_file.GetFilePath()] + forKey:@BREAKPAD_OUTPUT_CONFIG_FILE]; + return result; +} + +//============================================================================= +bool Breakpad::HandleMinidump(const char* dump_dir, + const char* minidump_id) { + config_file_.WriteFile(dump_dir, + config_params_, + dump_dir, + minidump_id); + + // Return true here to indicate that we've processed things as much as we + // want. + return true; +} + +//============================================================================= +void Breakpad::HandleUncaughtException(NSException* exception) { + // Generate the minidump. + google_breakpad::IosExceptionMinidumpGenerator generator(exception); + const std::string minidump_path = + config_params_->GetValueForKey(BREAKPAD_DUMP_DIRECTORY); + std::string minidump_id; + std::string minidump_filename = generator.UniqueNameInDirectory(minidump_path, + &minidump_id); + generator.Write(minidump_filename.c_str()); + + // Copy the config params and our custom parameter. This is necessary for 2 + // reasons: + // 1- config_params_ is protected. + // 2- If the application crash while trying to handle this exception, a usual + // report will be generated. This report must not contain these special + // keys. + LongStringDictionary params = *config_params_; + params.SetKeyValue(BREAKPAD_SERVER_PARAMETER_PREFIX "type", "exception"); + params.SetKeyValue(BREAKPAD_SERVER_PARAMETER_PREFIX "exceptionName", + [[exception name] UTF8String]); + params.SetKeyValue(BREAKPAD_SERVER_PARAMETER_PREFIX "exceptionReason", + [[exception reason] UTF8String]); + + // And finally write the config file. + ConfigFile config_file; + config_file.WriteFile(minidump_path.c_str(), + ¶ms, + minidump_path.c_str(), + minidump_id.c_str()); +} + +//============================================================================= + +#pragma mark - +#pragma mark Public API + +//============================================================================= +BreakpadRef BreakpadCreate(NSDictionary* parameters) { + try { + // This is confusing. Our two main allocators for breakpad memory are: + // - gKeyValueAllocator for the key/value memory + // - gBreakpadAllocator for the Breakpad, ExceptionHandler, and other + // breakpad allocations which are accessed at exception handling time. + // + // But in order to avoid these two allocators themselves from being smashed, + // we'll protect them as well by allocating them with gMasterAllocator. + // + // gMasterAllocator itself will NOT be protected, but this doesn't matter, + // since once it does its allocations and locks the memory, smashes to + // itself don't affect anything we care about. + gMasterAllocator = + new ProtectedMemoryAllocator(sizeof(ProtectedMemoryAllocator) * 2); + + gKeyValueAllocator = + new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator))) + ProtectedMemoryAllocator(sizeof(LongStringDictionary)); + + // Create a mutex for use in accessing the LongStringDictionary + int mutexResult = pthread_mutex_init(&gDictionaryMutex, NULL); + if (mutexResult == 0) { + + // With the current compiler, gBreakpadAllocator is allocating 1444 bytes. + // Let's round up to the nearest page size. + // + int breakpad_pool_size = 4096; + + /* + sizeof(Breakpad) + + sizeof(google_breakpad::ExceptionHandler) + + sizeof( STUFF ALLOCATED INSIDE ExceptionHandler ) + */ + + gBreakpadAllocator = + new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator))) + ProtectedMemoryAllocator(breakpad_pool_size); + + // Stack-based autorelease pool for Breakpad::Create() obj-c code. + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + Breakpad* breakpad = Breakpad::Create(parameters); + + if (breakpad) { + // Make read-only to protect against memory smashers + gMasterAllocator->Protect(); + gKeyValueAllocator->Protect(); + gBreakpadAllocator->Protect(); + // Can uncomment this line to figure out how much space was actually + // allocated using this allocator + // printf("gBreakpadAllocator allocated size = %d\n", + // gBreakpadAllocator->GetAllocatedSize() ); + [pool release]; + return (BreakpadRef)breakpad; + } + + [pool release]; + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadCreate() : error\n"); + } + + if (gKeyValueAllocator) { + gKeyValueAllocator->~ProtectedMemoryAllocator(); + gKeyValueAllocator = NULL; + } + + if (gBreakpadAllocator) { + gBreakpadAllocator->~ProtectedMemoryAllocator(); + gBreakpadAllocator = NULL; + } + + delete gMasterAllocator; + gMasterAllocator = NULL; + + return NULL; +} + +//============================================================================= +void BreakpadRelease(BreakpadRef ref) { + try { + Breakpad* breakpad = (Breakpad*)ref; + + if (gMasterAllocator) { + gMasterAllocator->Unprotect(); + gKeyValueAllocator->Unprotect(); + gBreakpadAllocator->Unprotect(); + + breakpad->~Breakpad(); + + // Unfortunately, it's not possible to deallocate this stuff + // because the exception handling thread is still finishing up + // asynchronously at this point... OK, it could be done with + // locks, etc. But since BreakpadRelease() should usually only + // be called right before the process exits, it's not worth + // deallocating this stuff. +#if 0 + gKeyValueAllocator->~ProtectedMemoryAllocator(); + gBreakpadAllocator->~ProtectedMemoryAllocator(); + delete gMasterAllocator; + + gMasterAllocator = NULL; + gKeyValueAllocator = NULL; + gBreakpadAllocator = NULL; +#endif + + pthread_mutex_destroy(&gDictionaryMutex); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadRelease() : error\n"); + } +} + +//============================================================================= +void BreakpadSetKeyValue(BreakpadRef ref, NSString* key, NSString* value) { + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad && key && gKeyValueAllocator) { + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + breakpad->SetKeyValue(key, value); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadSetKeyValue() : error\n"); + } +} + +void BreakpadAddUploadParameter(BreakpadRef ref, + NSString* key, + NSString* value) { + // The only difference, internally, between an upload parameter and + // a key value one that is set with BreakpadSetKeyValue is that we + // prepend the keyname with a special prefix. This informs the + // crash sender that the parameter should be sent along with the + // POST of the crash dump upload. + try { + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad && key && gKeyValueAllocator) { + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + NSString* prefixedKey = [@BREAKPAD_SERVER_PARAMETER_PREFIX + stringByAppendingString:key]; + breakpad->SetKeyValue(prefixedKey, value); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadSetKeyValue() : error\n"); + } +} + +void BreakpadRemoveUploadParameter(BreakpadRef ref, + NSString* key) { + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad && key && gKeyValueAllocator) { + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + NSString* prefixedKey = [NSString stringWithFormat:@"%@%@", + @BREAKPAD_SERVER_PARAMETER_PREFIX, key]; + breakpad->RemoveKeyValue(prefixedKey); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadRemoveKeyValue() : error\n"); + } +} +//============================================================================= +NSString* BreakpadKeyValue(BreakpadRef ref, NSString* key) { + NSString* value = nil; + + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (!breakpad || !key || !gKeyValueAllocator) + return nil; + + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + value = breakpad->KeyValue(key); + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadKeyValue() : error\n"); + } + + return value; +} + +//============================================================================= +void BreakpadRemoveKeyValue(BreakpadRef ref, NSString* key) { + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad && key && gKeyValueAllocator) { + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + breakpad->RemoveKeyValue(key); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadRemoveKeyValue() : error\n"); + } +} + +//============================================================================= +int BreakpadGetCrashReportCount(BreakpadRef ref) { + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad) { + return static_cast([breakpad->CrashReportsToUpload() count]); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadGetCrashReportCount() : error\n"); + } + return false; +} + +//============================================================================= +void BreakpadUploadNextReport(BreakpadRef ref) { + BreakpadUploadNextReportWithParameters(ref, nil, nullptr); +} + +//============================================================================= +NSDictionary* BreakpadGetNextReportConfiguration(BreakpadRef ref) { + try { + Breakpad* breakpad = (Breakpad*)ref; + if (breakpad) + return breakpad->NextCrashReportConfiguration(); + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadGetNextReportConfiguration() : error\n"); + } + return nil; +} + +//============================================================================= +NSDate* BreakpadGetDateOfMostRecentCrashReport(BreakpadRef ref) { + try { + Breakpad* breakpad = (Breakpad*)ref; + if (breakpad) { + return breakpad->DateOfMostRecentCrashReport(); + } + } catch (...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadGetDateOfMostRecentCrashReport() : error\n"); + } + return nil; +} + +//============================================================================= +void BreakpadUploadReportWithParametersAndConfiguration( + BreakpadRef ref, + NSDictionary* server_parameters, + NSDictionary* configuration, + BreakpadUploadCompletionCallback callback) { + try { + Breakpad* breakpad = (Breakpad*)ref; + if (!breakpad || !configuration) + return; + breakpad->UploadReportWithConfiguration(configuration, server_parameters, + callback); + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, + "BreakpadUploadReportWithParametersAndConfiguration() : error\n"); + } +} + +//============================================================================= +void BreakpadUploadNextReportWithParameters( + BreakpadRef ref, + NSDictionary* server_parameters, + BreakpadUploadCompletionCallback callback) { + try { + Breakpad* breakpad = (Breakpad*)ref; + if (!breakpad) + return; + NSDictionary* configuration = breakpad->NextCrashReportConfiguration(); + if (!configuration) + return; + return BreakpadUploadReportWithParametersAndConfiguration( + ref, server_parameters, configuration, callback); + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadUploadNextReportWithParameters() : error\n"); + } +} + +void BreakpadHandleNetworkResponse(BreakpadRef ref, + NSDictionary* configuration, + NSData* data, + NSError* error) { + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + if (breakpad && configuration) + breakpad->HandleNetworkResponse(configuration,data, error); + + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadHandleNetworkResponse() : error\n"); + } +} + +//============================================================================= +void BreakpadUploadData(BreakpadRef ref, NSData* data, NSString* name, + NSDictionary* server_parameters) { + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad) { + breakpad->UploadData(data, name, server_parameters); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadUploadData() : error\n"); + } +} + +//============================================================================= +NSDictionary* BreakpadGenerateReport(BreakpadRef ref, + NSDictionary* server_parameters) { + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad) { + return breakpad->GenerateReport(server_parameters); + } else { + return nil; + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadGenerateReport() : error\n"); + return nil; + } +} diff --git a/src/client/ios/Breakpad.xcodeproj/project.pbxproj b/src/client/ios/Breakpad.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ca5f1f0 --- /dev/null +++ b/src/client/ios/Breakpad.xcodeproj/project.pbxproj @@ -0,0 +1,604 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 06D561E62700974500F9F2E8 /* encoding_util.h in Headers */ = {isa = PBXBuildFile; fileRef = 06D561E42700974500F9F2E8 /* encoding_util.h */; }; + 06D561E72700974500F9F2E8 /* encoding_util.m in Sources */ = {isa = PBXBuildFile; fileRef = 06D561E52700974500F9F2E8 /* encoding_util.m */; }; + 14569321182CE29F0029C465 /* ucontext_compat.h in Headers */ = {isa = PBXBuildFile; fileRef = 14569320182CE29F0029C465 /* ucontext_compat.h */; }; + 14569323182CE2C10029C465 /* mach_vm_compat.h in Headers */ = {isa = PBXBuildFile; fileRef = 14569322182CE2C10029C465 /* mach_vm_compat.h */; }; + 16BFA67014E195E9009704F8 /* ios_exception_minidump_generator.h in Headers */ = {isa = PBXBuildFile; fileRef = 16BFA66E14E195E9009704F8 /* ios_exception_minidump_generator.h */; }; + 16BFA67214E1965A009704F8 /* ios_exception_minidump_generator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 16BFA67114E1965A009704F8 /* ios_exception_minidump_generator.mm */; }; + 16C7CCCB147D4A4300776EAD /* BreakpadDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7C968147D4A4200776EAD /* BreakpadDefines.h */; }; + 16C7CCCC147D4A4300776EAD /* Breakpad.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7C96A147D4A4200776EAD /* Breakpad.h */; }; + 16C7CCCD147D4A4300776EAD /* Breakpad.mm in Sources */ = {isa = PBXBuildFile; fileRef = 16C7C96B147D4A4200776EAD /* Breakpad.mm */; }; + 16C7CDE8147D4A4300776EAD /* ConfigFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CB9E147D4A4300776EAD /* ConfigFile.h */; }; + 16C7CDE9147D4A4300776EAD /* ConfigFile.mm in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CB9F147D4A4300776EAD /* ConfigFile.mm */; }; + 16C7CDF5147D4A4300776EAD /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CBAD147D4A4300776EAD /* breakpad_nlist_64.cc */; }; + 16C7CDF6147D4A4300776EAD /* breakpad_nlist_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CBAE147D4A4300776EAD /* breakpad_nlist_64.h */; }; + 16C7CDF7147D4A4300776EAD /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CBAF147D4A4300776EAD /* dynamic_images.cc */; }; + 16C7CDF8147D4A4300776EAD /* dynamic_images.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CBB0147D4A4300776EAD /* dynamic_images.h */; }; + 16C7CDF9147D4A4300776EAD /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CBB1147D4A4300776EAD /* exception_handler.cc */; }; + 16C7CDFA147D4A4300776EAD /* exception_handler.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CBB2147D4A4300776EAD /* exception_handler.h */; }; + 16C7CDFC147D4A4300776EAD /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CBB4147D4A4300776EAD /* minidump_generator.cc */; }; + 16C7CDFD147D4A4300776EAD /* minidump_generator.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CBB5147D4A4300776EAD /* minidump_generator.h */; }; + 16C7CDFE147D4A4300776EAD /* protected_memory_allocator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CBBC147D4A4300776EAD /* protected_memory_allocator.cc */; }; + 16C7CDFF147D4A4300776EAD /* protected_memory_allocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CBBD147D4A4300776EAD /* protected_memory_allocator.h */; }; + 16C7CE08147D4A4300776EAD /* uploader.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CBEA147D4A4300776EAD /* uploader.h */; }; + 16C7CE09147D4A4300776EAD /* uploader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CBEB147D4A4300776EAD /* uploader.mm */; }; + 16C7CE18147D4A4300776EAD /* minidump_file_writer-inl.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CC04147D4A4300776EAD /* minidump_file_writer-inl.h */; }; + 16C7CE19147D4A4300776EAD /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CC05147D4A4300776EAD /* minidump_file_writer.cc */; }; + 16C7CE1A147D4A4300776EAD /* minidump_file_writer.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CC06147D4A4300776EAD /* minidump_file_writer.h */; }; + 16C7CE40147D4A4300776EAD /* convert_UTF.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CC4A147D4A4300776EAD /* convert_UTF.cc */; }; + 16C7CE41147D4A4300776EAD /* convert_UTF.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CC4B147D4A4300776EAD /* convert_UTF.h */; }; + 16C7CE78147D4A4300776EAD /* GTMLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CC88147D4A4300776EAD /* GTMLogger.h */; }; + 16C7CE79147D4A4300776EAD /* GTMLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CC89147D4A4300776EAD /* GTMLogger.m */; }; + 16C7CE7A147D4A4300776EAD /* HTTPMultipartUpload.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CC8A147D4A4300776EAD /* HTTPMultipartUpload.h */; }; + 16C7CE7B147D4A4300776EAD /* HTTPMultipartUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CC8B147D4A4300776EAD /* HTTPMultipartUpload.m */; }; + 16C7CE83147D4A4300776EAD /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CC93147D4A4300776EAD /* file_id.cc */; }; + 16C7CE84147D4A4300776EAD /* file_id.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CC94147D4A4300776EAD /* file_id.h */; }; + 16C7CE85147D4A4300776EAD /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CC95147D4A4300776EAD /* macho_id.cc */; }; + 16C7CE86147D4A4300776EAD /* macho_id.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CC96147D4A4300776EAD /* macho_id.h */; }; + 16C7CE8A147D4A4300776EAD /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CC9A147D4A4300776EAD /* macho_utilities.cc */; }; + 16C7CE8B147D4A4300776EAD /* macho_utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CC9B147D4A4300776EAD /* macho_utilities.h */; }; + 16C7CE8C147D4A4300776EAD /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CC9C147D4A4300776EAD /* macho_walker.cc */; }; + 16C7CE8D147D4A4300776EAD /* macho_walker.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CC9D147D4A4300776EAD /* macho_walker.h */; }; + 16C7CE8F147D4A4300776EAD /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CC9F147D4A4300776EAD /* string_utilities.cc */; }; + 16C7CE90147D4A4300776EAD /* string_utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CCA0147D4A4300776EAD /* string_utilities.h */; }; + 16C7CE93147D4A4300776EAD /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CCA4147D4A4300776EAD /* md5.cc */; }; + 16C7CE94147D4A4300776EAD /* md5.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CCA5147D4A4300776EAD /* md5.h */; }; + 16C7CEA7147D4A4300776EAD /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = 16C7CCB9147D4A4300776EAD /* string_conversion.cc */; }; + 16C7CEA8147D4A4300776EAD /* string_conversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7CCBA147D4A4300776EAD /* string_conversion.h */; }; + 16C92FAD150DF8330053D7BA /* BreakpadController.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C92FAB150DF8330053D7BA /* BreakpadController.h */; }; + 16C92FAE150DF8330053D7BA /* BreakpadController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 16C92FAC150DF8330053D7BA /* BreakpadController.mm */; }; + 1EEEB60F1720821900F7E689 /* simple_string_dictionary.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1EEEB60C1720821900F7E689 /* simple_string_dictionary.cc */; }; + 1EEEB6101720821900F7E689 /* simple_string_dictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EEEB60D1720821900F7E689 /* simple_string_dictionary.h */; }; + AA747D9F0F9514B9006C5449 /* Breakpad_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* Breakpad_Prefix.pch */; }; + AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; + CF6D547D1F9E6FFE00E95174 /* long_string_dictionary.cc in Sources */ = {isa = PBXBuildFile; fileRef = CF6D547C1F9E6FFE00E95174 /* long_string_dictionary.cc */; }; + CF706DC11F7C6EFB002C54C7 /* long_string_dictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = CF706DC01F7C6EFB002C54C7 /* long_string_dictionary.h */; }; + E69213D8265202570071B04F /* HTTPRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E69213D6265202570071B04F /* HTTPRequest.h */; }; + E69213D9265202570071B04F /* HTTPRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E69213D7265202570071B04F /* HTTPRequest.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 06D561E42700974500F9F2E8 /* encoding_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = encoding_util.h; sourceTree = ""; }; + 06D561E52700974500F9F2E8 /* encoding_util.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = encoding_util.m; sourceTree = ""; }; + 14569320182CE29F0029C465 /* ucontext_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ucontext_compat.h; sourceTree = ""; }; + 14569322182CE2C10029C465 /* mach_vm_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mach_vm_compat.h; sourceTree = ""; }; + 16BFA66E14E195E9009704F8 /* ios_exception_minidump_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ios_exception_minidump_generator.h; sourceTree = ""; }; + 16BFA67114E1965A009704F8 /* ios_exception_minidump_generator.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ios_exception_minidump_generator.mm; sourceTree = ""; }; + 16C7C968147D4A4200776EAD /* BreakpadDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BreakpadDefines.h; sourceTree = ""; }; + 16C7C96A147D4A4200776EAD /* Breakpad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Breakpad.h; sourceTree = ""; }; + 16C7C96B147D4A4200776EAD /* Breakpad.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Breakpad.mm; sourceTree = ""; }; + 16C7CB9E147D4A4300776EAD /* ConfigFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConfigFile.h; sourceTree = ""; }; + 16C7CB9F147D4A4300776EAD /* ConfigFile.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ConfigFile.mm; sourceTree = ""; }; + 16C7CBAD147D4A4300776EAD /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_64.cc; sourceTree = ""; }; + 16C7CBAE147D4A4300776EAD /* breakpad_nlist_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_64.h; sourceTree = ""; }; + 16C7CBAF147D4A4300776EAD /* dynamic_images.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dynamic_images.cc; sourceTree = ""; }; + 16C7CBB0147D4A4300776EAD /* dynamic_images.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dynamic_images.h; sourceTree = ""; }; + 16C7CBB1147D4A4300776EAD /* exception_handler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = exception_handler.cc; sourceTree = ""; }; + 16C7CBB2147D4A4300776EAD /* exception_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exception_handler.h; sourceTree = ""; }; + 16C7CBB4147D4A4300776EAD /* minidump_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = minidump_generator.cc; sourceTree = ""; }; + 16C7CBB5147D4A4300776EAD /* minidump_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = minidump_generator.h; sourceTree = ""; }; + 16C7CBBC147D4A4300776EAD /* protected_memory_allocator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = protected_memory_allocator.cc; sourceTree = ""; }; + 16C7CBBD147D4A4300776EAD /* protected_memory_allocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = protected_memory_allocator.h; sourceTree = ""; }; + 16C7CBEA147D4A4300776EAD /* uploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uploader.h; sourceTree = ""; }; + 16C7CBEB147D4A4300776EAD /* uploader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = uploader.mm; sourceTree = ""; }; + 16C7CC04147D4A4300776EAD /* minidump_file_writer-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "minidump_file_writer-inl.h"; sourceTree = ""; }; + 16C7CC05147D4A4300776EAD /* minidump_file_writer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = minidump_file_writer.cc; sourceTree = ""; }; + 16C7CC06147D4A4300776EAD /* minidump_file_writer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = minidump_file_writer.h; sourceTree = ""; }; + 16C7CC07147D4A4300776EAD /* minidump_file_writer_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = minidump_file_writer_unittest.cc; sourceTree = ""; }; + 16C7CC4A147D4A4300776EAD /* convert_UTF.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = convert_UTF.cc; sourceTree = ""; }; + 16C7CC4B147D4A4300776EAD /* convert_UTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = convert_UTF.h; sourceTree = ""; }; + 16C7CC88147D4A4300776EAD /* GTMLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMLogger.h; sourceTree = ""; }; + 16C7CC89147D4A4300776EAD /* GTMLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMLogger.m; sourceTree = ""; }; + 16C7CC8A147D4A4300776EAD /* HTTPMultipartUpload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPMultipartUpload.h; sourceTree = ""; }; + 16C7CC8B147D4A4300776EAD /* HTTPMultipartUpload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTTPMultipartUpload.m; sourceTree = ""; }; + 16C7CC93147D4A4300776EAD /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file_id.cc; sourceTree = ""; }; + 16C7CC94147D4A4300776EAD /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_id.h; sourceTree = ""; }; + 16C7CC95147D4A4300776EAD /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = macho_id.cc; sourceTree = ""; }; + 16C7CC96147D4A4300776EAD /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macho_id.h; sourceTree = ""; }; + 16C7CC9A147D4A4300776EAD /* macho_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = macho_utilities.cc; sourceTree = ""; }; + 16C7CC9B147D4A4300776EAD /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macho_utilities.h; sourceTree = ""; }; + 16C7CC9C147D4A4300776EAD /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = macho_walker.cc; sourceTree = ""; }; + 16C7CC9D147D4A4300776EAD /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macho_walker.h; sourceTree = ""; }; + 16C7CC9F147D4A4300776EAD /* string_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_utilities.cc; sourceTree = ""; }; + 16C7CCA0147D4A4300776EAD /* string_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_utilities.h; sourceTree = ""; }; + 16C7CCA4147D4A4300776EAD /* md5.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = md5.cc; sourceTree = ""; }; + 16C7CCA5147D4A4300776EAD /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; + 16C7CCB9147D4A4300776EAD /* string_conversion.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_conversion.cc; sourceTree = ""; }; + 16C7CCBA147D4A4300776EAD /* string_conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_conversion.h; sourceTree = ""; }; + 16C92FAB150DF8330053D7BA /* BreakpadController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BreakpadController.h; sourceTree = ""; }; + 16C92FAC150DF8330053D7BA /* BreakpadController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = BreakpadController.mm; sourceTree = ""; }; + 1EEEB60C1720821900F7E689 /* simple_string_dictionary.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simple_string_dictionary.cc; sourceTree = ""; }; + 1EEEB60D1720821900F7E689 /* simple_string_dictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simple_string_dictionary.h; sourceTree = ""; }; + AA747D9E0F9514B9006C5449 /* Breakpad_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Breakpad_Prefix.pch; sourceTree = SOURCE_ROOT; }; + AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + CF6D547C1F9E6FFE00E95174 /* long_string_dictionary.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = long_string_dictionary.cc; sourceTree = ""; }; + CF706DC01F7C6EFB002C54C7 /* long_string_dictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = long_string_dictionary.h; sourceTree = ""; }; + D2AAC07E0554694100DB518D /* libBreakpad.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBreakpad.a; sourceTree = BUILT_PRODUCTS_DIR; }; + E69213D6265202570071B04F /* HTTPRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPRequest.h; sourceTree = ""; }; + E69213D7265202570071B04F /* HTTPRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTTPRequest.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D2AAC07C0554694100DB518D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DFFF38A50411DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + D2AAC07E0554694100DB518D /* libBreakpad.a */, + ); + name = Products; + sourceTree = ""; + }; + 0867D691FE84028FC02AAC07 /* Breakpad */ = { + isa = PBXGroup; + children = ( + 08FB77AEFE84172EC02AAC07 /* Classes */, + 32C88DFF0371C24200C91783 /* Other Sources */, + 0867D69AFE84028FC02AAC07 /* Frameworks */, + 034768DFFF38A50411DB9C8B /* Products */, + ); + name = Breakpad; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AACBBE490F95108600F1A2B1 /* Foundation.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 08FB77AEFE84172EC02AAC07 /* Classes */ = { + isa = PBXGroup; + children = ( + 16C7C965147D4A4200776EAD /* client */, + 16C7CC47147D4A4300776EAD /* common */, + ); + name = Classes; + sourceTree = ""; + }; + 16BFA66A14E195E9009704F8 /* handler */ = { + isa = PBXGroup; + children = ( + 16BFA67114E1965A009704F8 /* ios_exception_minidump_generator.mm */, + 16BFA66E14E195E9009704F8 /* ios_exception_minidump_generator.h */, + ); + path = handler; + sourceTree = ""; + }; + 16C7C965147D4A4200776EAD /* client */ = { + isa = PBXGroup; + children = ( + 16C7C966147D4A4200776EAD /* apple */, + 16C7C969147D4A4200776EAD /* ios */, + 16C7C99E147D4A4200776EAD /* mac */, + 16C7CC04147D4A4300776EAD /* minidump_file_writer-inl.h */, + 16C7CC05147D4A4300776EAD /* minidump_file_writer.cc */, + 16C7CC06147D4A4300776EAD /* minidump_file_writer.h */, + 16C7CC07147D4A4300776EAD /* minidump_file_writer_unittest.cc */, + ); + name = client; + path = ..; + sourceTree = SOURCE_ROOT; + }; + 16C7C966147D4A4200776EAD /* apple */ = { + isa = PBXGroup; + children = ( + 16C7C967147D4A4200776EAD /* Framework */, + ); + path = apple; + sourceTree = ""; + }; + 16C7C967147D4A4200776EAD /* Framework */ = { + isa = PBXGroup; + children = ( + 16C7C968147D4A4200776EAD /* BreakpadDefines.h */, + ); + path = Framework; + sourceTree = ""; + }; + 16C7C969147D4A4200776EAD /* ios */ = { + isa = PBXGroup; + children = ( + 16C92FAB150DF8330053D7BA /* BreakpadController.h */, + 16C92FAC150DF8330053D7BA /* BreakpadController.mm */, + 16BFA66A14E195E9009704F8 /* handler */, + 16C7C96A147D4A4200776EAD /* Breakpad.h */, + 16C7C96B147D4A4200776EAD /* Breakpad.mm */, + ); + path = ios; + sourceTree = ""; + }; + 16C7C99E147D4A4200776EAD /* mac */ = { + isa = PBXGroup; + children = ( + 16C7CB9D147D4A4300776EAD /* crash_generation */, + 16C7CBAA147D4A4300776EAD /* handler */, + 16C7CBC8147D4A4300776EAD /* sender */, + ); + path = mac; + sourceTree = ""; + }; + 16C7CB9D147D4A4300776EAD /* crash_generation */ = { + isa = PBXGroup; + children = ( + 16C7CB9E147D4A4300776EAD /* ConfigFile.h */, + 16C7CB9F147D4A4300776EAD /* ConfigFile.mm */, + ); + path = crash_generation; + sourceTree = ""; + }; + 16C7CBAA147D4A4300776EAD /* handler */ = { + isa = PBXGroup; + children = ( + 16C7CBAD147D4A4300776EAD /* breakpad_nlist_64.cc */, + 16C7CBAE147D4A4300776EAD /* breakpad_nlist_64.h */, + 16C7CBAF147D4A4300776EAD /* dynamic_images.cc */, + 16C7CBB0147D4A4300776EAD /* dynamic_images.h */, + 16C7CBB1147D4A4300776EAD /* exception_handler.cc */, + 16C7CBB2147D4A4300776EAD /* exception_handler.h */, + 14569322182CE2C10029C465 /* mach_vm_compat.h */, + 16C7CBB4147D4A4300776EAD /* minidump_generator.cc */, + 16C7CBB5147D4A4300776EAD /* minidump_generator.h */, + 16C7CBBC147D4A4300776EAD /* protected_memory_allocator.cc */, + 16C7CBBD147D4A4300776EAD /* protected_memory_allocator.h */, + 14569320182CE29F0029C465 /* ucontext_compat.h */, + ); + path = handler; + sourceTree = ""; + }; + 16C7CBC8147D4A4300776EAD /* sender */ = { + isa = PBXGroup; + children = ( + 16C7CBEA147D4A4300776EAD /* uploader.h */, + 16C7CBEB147D4A4300776EAD /* uploader.mm */, + ); + path = sender; + sourceTree = ""; + }; + 16C7CC47147D4A4300776EAD /* common */ = { + isa = PBXGroup; + children = ( + CF706DC01F7C6EFB002C54C7 /* long_string_dictionary.h */, + CF6D547C1F9E6FFE00E95174 /* long_string_dictionary.cc */, + 1EEEB60C1720821900F7E689 /* simple_string_dictionary.cc */, + 1EEEB60D1720821900F7E689 /* simple_string_dictionary.h */, + 16C7CC4A147D4A4300776EAD /* convert_UTF.cc */, + 16C7CC4B147D4A4300776EAD /* convert_UTF.h */, + 16C7CC82147D4A4300776EAD /* mac */, + 16C7CCA4147D4A4300776EAD /* md5.cc */, + 16C7CCA5147D4A4300776EAD /* md5.h */, + 16C7CCB9147D4A4300776EAD /* string_conversion.cc */, + 16C7CCBA147D4A4300776EAD /* string_conversion.h */, + ); + name = common; + path = ../../common; + sourceTree = SOURCE_ROOT; + }; + 16C7CC82147D4A4300776EAD /* mac */ = { + isa = PBXGroup; + children = ( + 06D561E42700974500F9F2E8 /* encoding_util.h */, + 06D561E52700974500F9F2E8 /* encoding_util.m */, + 16C7CC88147D4A4300776EAD /* GTMLogger.h */, + 16C7CC89147D4A4300776EAD /* GTMLogger.m */, + E69213D6265202570071B04F /* HTTPRequest.h */, + E69213D7265202570071B04F /* HTTPRequest.m */, + 16C7CC8A147D4A4300776EAD /* HTTPMultipartUpload.h */, + 16C7CC8B147D4A4300776EAD /* HTTPMultipartUpload.m */, + 16C7CC93147D4A4300776EAD /* file_id.cc */, + 16C7CC94147D4A4300776EAD /* file_id.h */, + 16C7CC95147D4A4300776EAD /* macho_id.cc */, + 16C7CC96147D4A4300776EAD /* macho_id.h */, + 16C7CC9A147D4A4300776EAD /* macho_utilities.cc */, + 16C7CC9B147D4A4300776EAD /* macho_utilities.h */, + 16C7CC9C147D4A4300776EAD /* macho_walker.cc */, + 16C7CC9D147D4A4300776EAD /* macho_walker.h */, + 16C7CC9F147D4A4300776EAD /* string_utilities.cc */, + 16C7CCA0147D4A4300776EAD /* string_utilities.h */, + ); + path = mac; + sourceTree = ""; + }; + 32C88DFF0371C24200C91783 /* Other Sources */ = { + isa = PBXGroup; + children = ( + AA747D9E0F9514B9006C5449 /* Breakpad_Prefix.pch */, + ); + name = "Other Sources"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D2AAC07A0554694100DB518D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + AA747D9F0F9514B9006C5449 /* Breakpad_Prefix.pch in Headers */, + 16C7CCCB147D4A4300776EAD /* BreakpadDefines.h in Headers */, + 16C7CCCC147D4A4300776EAD /* Breakpad.h in Headers */, + 16C7CDE8147D4A4300776EAD /* ConfigFile.h in Headers */, + 14569321182CE29F0029C465 /* ucontext_compat.h in Headers */, + 16C7CDF6147D4A4300776EAD /* breakpad_nlist_64.h in Headers */, + 16C7CDF8147D4A4300776EAD /* dynamic_images.h in Headers */, + 16C7CDFA147D4A4300776EAD /* exception_handler.h in Headers */, + 16C7CDFD147D4A4300776EAD /* minidump_generator.h in Headers */, + 16C7CDFF147D4A4300776EAD /* protected_memory_allocator.h in Headers */, + 16C7CE08147D4A4300776EAD /* uploader.h in Headers */, + 16C7CE18147D4A4300776EAD /* minidump_file_writer-inl.h in Headers */, + 16C7CE1A147D4A4300776EAD /* minidump_file_writer.h in Headers */, + 06D561E62700974500F9F2E8 /* encoding_util.h in Headers */, + 16C7CE41147D4A4300776EAD /* convert_UTF.h in Headers */, + 16C7CE78147D4A4300776EAD /* GTMLogger.h in Headers */, + E69213D8265202570071B04F /* HTTPRequest.h in Headers */, + 16C7CE7A147D4A4300776EAD /* HTTPMultipartUpload.h in Headers */, + 16C7CE84147D4A4300776EAD /* file_id.h in Headers */, + 16C7CE86147D4A4300776EAD /* macho_id.h in Headers */, + 16C7CE8B147D4A4300776EAD /* macho_utilities.h in Headers */, + 16C7CE8D147D4A4300776EAD /* macho_walker.h in Headers */, + 16C7CE90147D4A4300776EAD /* string_utilities.h in Headers */, + 16C7CE94147D4A4300776EAD /* md5.h in Headers */, + 16C7CEA8147D4A4300776EAD /* string_conversion.h in Headers */, + 16BFA67014E195E9009704F8 /* ios_exception_minidump_generator.h in Headers */, + 16C92FAD150DF8330053D7BA /* BreakpadController.h in Headers */, + CF706DC11F7C6EFB002C54C7 /* long_string_dictionary.h in Headers */, + 1EEEB6101720821900F7E689 /* simple_string_dictionary.h in Headers */, + 14569323182CE2C10029C465 /* mach_vm_compat.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D2AAC07D0554694100DB518D /* Breakpad */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "Breakpad" */; + buildPhases = ( + D2AAC07A0554694100DB518D /* Headers */, + D2AAC07B0554694100DB518D /* Sources */, + D2AAC07C0554694100DB518D /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Breakpad; + productName = Breakpad; + productReference = D2AAC07E0554694100DB518D /* libBreakpad.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0510; + }; + buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "Breakpad" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + da, + de, + es, + fr, + it, + ja, + nl, + no, + sl, + sv, + tr, + ); + mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; + productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D2AAC07D0554694100DB518D /* Breakpad */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + D2AAC07B0554694100DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 16C7CCCD147D4A4300776EAD /* Breakpad.mm in Sources */, + E69213D9265202570071B04F /* HTTPRequest.m in Sources */, + 16C7CDE9147D4A4300776EAD /* ConfigFile.mm in Sources */, + 16C7CDF5147D4A4300776EAD /* breakpad_nlist_64.cc in Sources */, + 16C7CDF7147D4A4300776EAD /* dynamic_images.cc in Sources */, + 16C7CDF9147D4A4300776EAD /* exception_handler.cc in Sources */, + 16C7CDFC147D4A4300776EAD /* minidump_generator.cc in Sources */, + 16C7CDFE147D4A4300776EAD /* protected_memory_allocator.cc in Sources */, + 16C7CE09147D4A4300776EAD /* uploader.mm in Sources */, + CF6D547D1F9E6FFE00E95174 /* long_string_dictionary.cc in Sources */, + 16C7CE19147D4A4300776EAD /* minidump_file_writer.cc in Sources */, + 16C7CE40147D4A4300776EAD /* convert_UTF.cc in Sources */, + 16C7CE79147D4A4300776EAD /* GTMLogger.m in Sources */, + 06D561E72700974500F9F2E8 /* encoding_util.m in Sources */, + 16C7CE7B147D4A4300776EAD /* HTTPMultipartUpload.m in Sources */, + 16C7CE83147D4A4300776EAD /* file_id.cc in Sources */, + 16C7CE85147D4A4300776EAD /* macho_id.cc in Sources */, + 16C7CE8A147D4A4300776EAD /* macho_utilities.cc in Sources */, + 16C7CE8C147D4A4300776EAD /* macho_walker.cc in Sources */, + 16C7CE8F147D4A4300776EAD /* string_utilities.cc in Sources */, + 16C7CE93147D4A4300776EAD /* md5.cc in Sources */, + 16C7CEA7147D4A4300776EAD /* string_conversion.cc in Sources */, + 16BFA67214E1965A009704F8 /* ios_exception_minidump_generator.mm in Sources */, + 16C92FAE150DF8330053D7BA /* BreakpadController.mm in Sources */, + 1EEEB60F1720821900F7E689 /* simple_string_dictionary.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB921F08733DC00010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LIBRARY = "libc++"; + COPY_PHASE_STRIP = NO; + DSTROOT = /tmp/Breakpad.dst; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../mac/build/Debug\"", + ); + GCC_DYNAMIC_NO_PIC = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Breakpad_Prefix.pch; + INSTALL_PATH = /usr/local/lib; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/Breakpad.build/Objects-normal/i386\"", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/Breakpad.build/Objects-normal/x86_64\"", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/breakpadUtilities.build/Objects-normal/i386\"", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/breakpadUtilities.build/Objects-normal/x86_64\"", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/gtest.build/Objects-normal/i386\"", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/gtest.build/Objects-normal/x86_64\"", + "\"$(SRCROOT)/../mac/build/Debug\"", + "\"$(SRCROOT)/../mac/gcov\"", + ); + PRODUCT_NAME = Breakpad; + }; + name = Debug; + }; + 1DEB922008733DC00010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LIBRARY = "libc++"; + DSTROOT = /tmp/Breakpad.dst; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../mac/build/Debug\"", + ); + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Breakpad_Prefix.pch; + INSTALL_PATH = /usr/local/lib; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/Breakpad.build/Objects-normal/i386\"", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/Breakpad.build/Objects-normal/x86_64\"", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/breakpadUtilities.build/Objects-normal/i386\"", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/breakpadUtilities.build/Objects-normal/x86_64\"", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/gtest.build/Objects-normal/i386\"", + "\"$(SRCROOT)/../mac/build/Breakpad.build/Debug/gtest.build/Objects-normal/x86_64\"", + "\"$(SRCROOT)/../mac/build/Debug\"", + "\"$(SRCROOT)/../mac/gcov\"", + ); + PRODUCT_NAME = Breakpad; + }; + name = Release; + }; + 1DEB922308733DC00010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + ../../, + ../../client/apple/Framework, + ../../common/mac, + ); + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; + SDKROOT = iphoneos; + WARNING_CFLAGS = "-Wundef"; + }; + name = Debug; + }; + 1DEB922408733DC00010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + ../../, + ../../client/apple/Framework, + ../../common/mac, + ); + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + OTHER_LDFLAGS = "-ObjC"; + SDKROOT = iphoneos; + WARNING_CFLAGS = "-Wundef"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "Breakpad" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB921F08733DC00010E9CD /* Debug */, + 1DEB922008733DC00010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "Breakpad" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB922308733DC00010E9CD /* Debug */, + 1DEB922408733DC00010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/src/client/ios/BreakpadController.h b/src/client/ios/BreakpadController.h new file mode 100644 index 0000000..4033459 --- /dev/null +++ b/src/client/ios/BreakpadController.h @@ -0,0 +1,153 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_IOS_HANDLER_IOS_BREAKPAD_CONTROLLER_H_ +#define CLIENT_IOS_HANDLER_IOS_BREAKPAD_CONTROLLER_H_ + +#import + +#import "client/ios/Breakpad.h" + +// This class is used to offer a higher level API around BreakpadRef. It +// configures it, ensures thread-safety, and sends crash reports back to the +// collecting server. By default, no crash reports are sent, the user must call +// |setUploadingEnabled:YES| to start the uploading. +@interface BreakpadController : NSObject { + @private + // The dispatch queue that will own the breakpad reference. + dispatch_queue_t queue_; + + // Instance of Breakpad crash reporter. This is owned by the queue, but can + // be created on the main thread at startup. + BreakpadRef breakpadRef_; + + // The dictionary that contains configuration for breakpad. Modifying it + // should only happen when the controller is not started. The initial value + // is the infoDictionary of the bundle of the application. + NSMutableDictionary* configuration_; + + // Whether or not crash reports should be uploaded. + BOOL enableUploads_; + + // Whether the controller has been started on the main thread. This is only + // used to assert the initialization order is correct. + BOOL started_; + + // The interval to wait between two uploads. Value is 0 if no upload must be + // done. + int uploadIntervalInSeconds_; + + // The dictionary that contains additional server parameters to send when + // uploading crash reports. + NSDictionary* uploadTimeParameters_; + + // The callback to call on report upload completion. + BreakpadUploadCompletionCallback uploadCompleteCallback_; +} + +// Singleton. ++ (BreakpadController*)sharedInstance; + +// Update the controller configuration. Merges its old configuration with the +// new one. Merge is done by replacing the old values by the new values. +- (void)updateConfiguration:(NSDictionary*)configuration; + +// Reset the controller configuration to its initial value, which is the +// infoDictionary of the bundle of the application. +- (void)resetConfiguration; + +// Configure the URL to upload the report to. This must be called at least once +// if the URL is not in the bundle information. +- (void)setUploadingURL:(NSString*)url; + +// Set the minimal interval between two uploads in seconds. This must be called +// at least once if the interval is not in the bundle information. A value of 0 +// will prevent uploads. +- (void)setUploadInterval:(int)intervalInSeconds; + +// Set additional server parameters to send when uploading crash reports. +- (void)setParametersToAddAtUploadTime:(NSDictionary*)uploadTimeParameters; + +// Specify an upload parameter that will be added to the crash report when a +// crash report is generated. See |BreakpadAddUploadParameter|. +- (void)addUploadParameter:(NSString*)value forKey:(NSString*)key; + +// Sets the callback to be called after uploading a crash report to the server. +// Only the latest callback registered will be called. +- (void)setUploadCallback:(BreakpadUploadCompletionCallback)callback; + +// Remove a previously-added parameter from the upload parameter set. See +// |BreakpadRemoveUploadParameter|. +- (void)removeUploadParameterForKey:(NSString*)key; + +// Access the underlying BreakpadRef. This method is asynchronous, and will be +// executed on the thread owning the BreakpadRef variable. Moreover, if the +// controller is not started, the block will be called with a NULL parameter. +- (void)withBreakpadRef:(void(^)(BreakpadRef))callback; + +// Starts the BreakpadController by registering crash handlers. If +// |onCurrentThread| is YES, all setup is done on the current thread, otherwise +// it is done on a private queue. +- (void)start:(BOOL)onCurrentThread; + +// Unregisters the crash handlers. +- (void)stop; + +// Returns whether or not the controller is started. +- (BOOL)isStarted; + +// Enables or disables uploading of crash reports, but does not stop the +// BreakpadController. +- (void)setUploadingEnabled:(BOOL)enabled; + +// Check if there is currently a crash report to upload. +- (void)hasReportToUpload:(void(^)(BOOL))callback; + +// Get the number of crash reports waiting to upload. +- (void)getCrashReportCount:(void(^)(int))callback; + +// Get the next report to upload. +// - If upload is disabled, callback will be called with (nil, -1). +// - If a delay is to be waited before sending, callback will be called with +// (nil, n), with n (> 0) being the number of seconds to wait. +// - if no delay is needed, callback will be called with (0, configuration), +// configuration being next report to upload, or nil if none is pending. +- (void)getNextReportConfigurationOrSendDelay: + (void(^)(NSDictionary*, int))callback; + +// Get the date of the most recent crash report. +- (void)getDateOfMostRecentCrashReport:(void(^)(NSDate *))callback; + +// Sends synchronously the report specified by |configuration|. This method is +// NOT thread safe and must be called from the breakpad thread. +- (void)threadUnsafeSendReportWithConfiguration:(NSDictionary*)configuration + withBreakpadRef:(BreakpadRef)ref; + +@end + +#endif // CLIENT_IOS_HANDLER_IOS_BREAKPAD_CONTROLLER_H_ diff --git a/src/client/ios/BreakpadController.mm b/src/client/ios/BreakpadController.mm new file mode 100644 index 0000000..d03833e --- /dev/null +++ b/src/client/ios/BreakpadController.mm @@ -0,0 +1,373 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "BreakpadController.h" + +#import +#include +#include +#include +#include +#include + +#include + +#pragma mark - +#pragma mark Private Methods + +@interface BreakpadController () + +// Init the singleton instance. +- (id)initSingleton; + +// Load a crash report and send it to the server. +- (void)sendStoredCrashReports; + +// Returns when a report can be sent. |-1| means never, |0| means that a report +// can be sent immediately, a positive number is the number of seconds to wait +// before being allowed to upload a report. +- (int)sendDelay; + +// Notifies that a report will be sent, and update the last sending time +// accordingly. +- (void)reportWillBeSent; + +@end + +#pragma mark - +#pragma mark Anonymous namespace + +namespace { + +// The name of the user defaults key for the last submission to the crash +// server. +NSString* const kLastSubmission = @"com.google.Breakpad.LastSubmission"; + +// Returns a NSString describing the current platform. +NSString* GetPlatform() { + // Name of the system call for getting the platform. + static const char kHwMachineSysctlName[] = "hw.machine"; + + NSString* result = nil; + + size_t size = 0; + if (sysctlbyname(kHwMachineSysctlName, NULL, &size, NULL, 0) || size == 0) + return nil; + google_breakpad::scoped_array machine(new char[size]); + if (sysctlbyname(kHwMachineSysctlName, machine.get(), &size, NULL, 0) == 0) + result = [NSString stringWithUTF8String:machine.get()]; + return result; +} + +} // namespace + +#pragma mark - +#pragma mark BreakpadController Implementation + +@implementation BreakpadController + ++ (BreakpadController*)sharedInstance { + static dispatch_once_t onceToken; + static BreakpadController* sharedInstance ; + dispatch_once(&onceToken, ^{ + sharedInstance = [[BreakpadController alloc] initSingleton]; + }); + return sharedInstance; +} + +- (id)init { + return nil; +} + +- (id)initSingleton { + self = [super init]; + if (self) { + queue_ = dispatch_queue_create("com.google.BreakpadQueue", NULL); + enableUploads_ = NO; + started_ = NO; + [self resetConfiguration]; + } + return self; +} + +// Since this class is a singleton, this method is not expected to be called. +- (void)dealloc { + assert(!breakpadRef_); + dispatch_release(queue_); + [configuration_ release]; + [uploadTimeParameters_ release]; + [super dealloc]; +} + +#pragma mark - + +- (void)start:(BOOL)onCurrentThread { + if (started_) + return; + started_ = YES; + void(^startBlock)() = ^{ + assert(!breakpadRef_); + breakpadRef_ = BreakpadCreate(configuration_); + if (breakpadRef_) { + BreakpadAddUploadParameter(breakpadRef_, @"platform", GetPlatform()); + } + }; + if (onCurrentThread) + startBlock(); + else + dispatch_async(queue_, startBlock); +} + +- (void)stop { + if (!started_) + return; + started_ = NO; + dispatch_sync(queue_, ^{ + if (breakpadRef_) { + BreakpadRelease(breakpadRef_); + breakpadRef_ = NULL; + } + }); +} + +- (BOOL)isStarted { + return started_; +} + +// This method must be called from the breakpad queue. +- (void)threadUnsafeSendReportWithConfiguration:(NSDictionary*)configuration + withBreakpadRef:(BreakpadRef)ref { + NSAssert(started_, @"The controller must be started before " + "threadUnsafeSendReportWithConfiguration is called"); + if (breakpadRef_) { + BreakpadUploadReportWithParametersAndConfiguration( + breakpadRef_, uploadTimeParameters_, configuration, + uploadCompleteCallback_); + } +} + +- (void)setUploadingEnabled:(BOOL)enabled { + NSAssert(started_, + @"The controller must be started before setUploadingEnabled is called"); + dispatch_async(queue_, ^{ + if (enabled == enableUploads_) + return; + if (enabled) { + // Set this before calling doSendStoredCrashReport, because that + // calls sendDelay, which in turn checks this flag. + enableUploads_ = YES; + [self sendStoredCrashReports]; + } else { + // disable the enableUpload_ flag. + // sendDelay checks this flag and disables the upload of logs by sendStoredCrashReports + enableUploads_ = NO; + } + }); +} + +- (void)updateConfiguration:(NSDictionary*)configuration { + NSAssert(!started_, + @"The controller must not be started when updateConfiguration is called"); + [configuration_ addEntriesFromDictionary:configuration]; + NSString *uploadInterval = + [configuration_ valueForKey:@BREAKPAD_REPORT_INTERVAL]; + if (uploadInterval) + [self setUploadInterval:[uploadInterval intValue]]; +} + +- (void)resetConfiguration { + NSAssert(!started_, + @"The controller must not be started when resetConfiguration is called"); + [configuration_ autorelease]; + configuration_ = [[[NSBundle mainBundle] infoDictionary] mutableCopy]; + NSString *uploadInterval = + [configuration_ valueForKey:@BREAKPAD_REPORT_INTERVAL]; + [self setUploadInterval:[uploadInterval intValue]]; + [self setParametersToAddAtUploadTime:nil]; +} + +- (void)setUploadingURL:(NSString*)url { + NSAssert(!started_, + @"The controller must not be started when setUploadingURL is called"); + [configuration_ setValue:url forKey:@BREAKPAD_URL]; +} + +- (void)setUploadInterval:(int)intervalInSeconds { + NSAssert(!started_, + @"The controller must not be started when setUploadInterval is called"); + [configuration_ removeObjectForKey:@BREAKPAD_REPORT_INTERVAL]; + uploadIntervalInSeconds_ = intervalInSeconds; + if (uploadIntervalInSeconds_ < 0) + uploadIntervalInSeconds_ = 0; +} + +- (void)setParametersToAddAtUploadTime:(NSDictionary*)uploadTimeParameters { + NSAssert(!started_, @"The controller must not be started when " + "setParametersToAddAtUploadTime is called"); + [uploadTimeParameters_ autorelease]; + uploadTimeParameters_ = [uploadTimeParameters copy]; +} + +- (void)addUploadParameter:(NSString*)value forKey:(NSString*)key { + NSAssert(started_, + @"The controller must be started before addUploadParameter is called"); + dispatch_async(queue_, ^{ + if (breakpadRef_) + BreakpadAddUploadParameter(breakpadRef_, key, value); + }); +} + +- (void)setUploadCallback:(BreakpadUploadCompletionCallback)callback { + NSAssert(started_, + @"The controller must not be started before setUploadCallback is " + "called"); + dispatch_async(queue_, ^{ + uploadCompleteCallback_ = callback; + }); +} + +- (void)removeUploadParameterForKey:(NSString*)key { + NSAssert(started_, @"The controller must be started before " + "removeUploadParameterForKey is called"); + dispatch_async(queue_, ^{ + if (breakpadRef_) + BreakpadRemoveUploadParameter(breakpadRef_, key); + }); +} + +- (void)withBreakpadRef:(void(^)(BreakpadRef))callback { + dispatch_async(queue_, ^{ + callback(started_ ? breakpadRef_ : NULL); + }); +} + +- (void)hasReportToUpload:(void(^)(BOOL))callback { + NSAssert(started_, @"The controller must be started before " + "hasReportToUpload is called"); + dispatch_async(queue_, ^{ + callback(breakpadRef_ && (BreakpadGetCrashReportCount(breakpadRef_) > 0)); + }); +} + +- (void)getCrashReportCount:(void(^)(int))callback { + NSAssert(started_, @"The controller must be started before " + "getCrashReportCount is called"); + dispatch_async(queue_, ^{ + callback(breakpadRef_ ? BreakpadGetCrashReportCount(breakpadRef_) : 0); + }); +} + +- (void)getNextReportConfigurationOrSendDelay: + (void(^)(NSDictionary*, int))callback { + NSAssert(started_, @"The controller must be started before " + "getNextReportConfigurationOrSendDelay is called"); + dispatch_async(queue_, ^{ + if (!breakpadRef_) { + callback(nil, -1); + return; + } + int delay = [self sendDelay]; + if (delay != 0) { + callback(nil, delay); + return; + } + [self reportWillBeSent]; + callback(BreakpadGetNextReportConfiguration(breakpadRef_), 0); + }); +} + +- (void)getDateOfMostRecentCrashReport:(void(^)(NSDate *))callback { + NSAssert(started_, @"The controller must be started before " + "getDateOfMostRecentCrashReport is called"); + dispatch_async(queue_, ^{ + if (!breakpadRef_) { + callback(nil); + return; + } + callback(BreakpadGetDateOfMostRecentCrashReport(breakpadRef_)); + }); +} + +#pragma mark - + +- (int)sendDelay { + if (!breakpadRef_ || uploadIntervalInSeconds_ <= 0 || !enableUploads_) + return -1; + + // To prevent overloading the crash server, crashes are not sent than one + // report every |uploadIntervalInSeconds_|. A value in the user defaults is + // used to keep the time of the last upload. + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + NSNumber *lastTimeNum = [userDefaults objectForKey:kLastSubmission]; + NSTimeInterval lastTime = lastTimeNum ? [lastTimeNum floatValue] : 0; + NSTimeInterval spanSeconds = CFAbsoluteTimeGetCurrent() - lastTime; + + if (spanSeconds >= uploadIntervalInSeconds_) + return 0; + return uploadIntervalInSeconds_ - static_cast(spanSeconds); +} + +- (void)reportWillBeSent { + NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; + [userDefaults setObject:[NSNumber numberWithDouble:CFAbsoluteTimeGetCurrent()] + forKey:kLastSubmission]; + [userDefaults synchronize]; +} + +// This method must be called from the breakpad queue. +- (void)sendStoredCrashReports { + if (BreakpadGetCrashReportCount(breakpadRef_) == 0) + return; + + int timeToWait = [self sendDelay]; + + // Unable to ever send report. + if (timeToWait == -1) + return; + + // A report can be sent now. + if (timeToWait == 0) { + [self reportWillBeSent]; + BreakpadUploadNextReportWithParameters(breakpadRef_, uploadTimeParameters_, + uploadCompleteCallback_); + + // If more reports must be sent, make sure this method is called again. + if (BreakpadGetCrashReportCount(breakpadRef_) > 0) + timeToWait = uploadIntervalInSeconds_; + } + + // A report must be sent later. + if (timeToWait > 0) { + dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeToWait * NSEC_PER_SEC)); + dispatch_after(delay, queue_, ^{ + [self sendStoredCrashReports]; + }); + } +} + +@end diff --git a/src/client/ios/Breakpad_Prefix.pch b/src/client/ios/Breakpad_Prefix.pch new file mode 100644 index 0000000..bfb7394 --- /dev/null +++ b/src/client/ios/Breakpad_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'CocoaTouchStaticLibrary' target in the 'CocoaTouchStaticLibrary' project. +// + +#ifdef __OBJC__ + #import +#endif diff --git a/src/client/ios/exception_handler_no_mach.cc b/src/client/ios/exception_handler_no_mach.cc new file mode 100644 index 0000000..0b2182e --- /dev/null +++ b/src/client/ios/exception_handler_no_mach.cc @@ -0,0 +1,265 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "client/mac/handler/minidump_generator.h" +#include "client/ios/exception_handler_no_mach.h" + +#ifndef USE_PROTECTED_ALLOCATIONS +#if TARGET_OS_TV +#define USE_PROTECTED_ALLOCATIONS 1 +#else +#define USE_PROTECTED_ALLOCATIONS 0 +#endif +#endif + +// If USE_PROTECTED_ALLOCATIONS is activated then the +// gBreakpadAllocator needs to be setup in other code +// ahead of time. Please see ProtectedMemoryAllocator.h +// for more details. +#if USE_PROTECTED_ALLOCATIONS + #include "client/mac/handler/protected_memory_allocator.h" + extern ProtectedMemoryAllocator* gBreakpadAllocator; +#endif + +namespace google_breakpad { + +const int kExceptionSignals[] = { + // Core-generating signals. + SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGQUIT, SIGSEGV, SIGSYS, SIGTRAP, SIGEMT, + SIGXCPU, SIGXFSZ, + // Non-core-generating but terminating signals. + SIGALRM, SIGHUP, SIGINT, SIGPIPE, SIGPROF, SIGTERM, SIGUSR1, SIGUSR2, + SIGVTALRM, SIGXCPU, SIGXFSZ, SIGIO, +}; +const int kNumHandledSignals = + sizeof(kExceptionSignals) / sizeof(kExceptionSignals[0]); +struct scoped_ptr old_handlers[kNumHandledSignals]; + +static union { +#if USE_PROTECTED_ALLOCATIONS +#if defined PAGE_MAX_SIZE + char protected_buffer[PAGE_MAX_SIZE] __attribute__((aligned(PAGE_MAX_SIZE))); +#else + char protected_buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); +#endif // defined PAGE_MAX_SIZE +#endif // USE_PROTECTED_ALLOCATIONS + google_breakpad::ExceptionHandler* handler; +} gProtectedData; + +ExceptionHandler::ExceptionHandler(const string& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + bool install_handler, + const char* port_name) + : dump_path_(), + filter_(filter), + callback_(callback), + callback_context_(callback_context), + directCallback_(NULL), + installed_exception_handler_(false), + is_in_teardown_(false) { + // This will update to the ID and C-string pointers + set_dump_path(dump_path); + MinidumpGenerator::GatherSystemInformation(); + Setup(); +} + +// special constructor if we want to bypass minidump writing and +// simply get a callback with the exception information +ExceptionHandler::ExceptionHandler(DirectCallback callback, + void* callback_context, + bool install_handler) + : dump_path_(), + filter_(NULL), + callback_(NULL), + callback_context_(callback_context), + directCallback_(callback), + installed_exception_handler_(false), + is_in_teardown_(false) { + MinidumpGenerator::GatherSystemInformation(); + Setup(); +} + +ExceptionHandler::~ExceptionHandler() { + Teardown(); +} + +bool ExceptionHandler::WriteMinidumpWithException( + int exception_type, + int exception_code, + int exception_subcode, + breakpad_ucontext_t* task_context, + mach_port_t thread_name, + bool exit_after_write, + bool report_current_thread) { + bool result = false; + +#if !TARGET_OS_TV + exit_after_write = false; +#endif // !TARGET_OS_TV + + if (directCallback_) { + if (directCallback_(callback_context_, + exception_type, + exception_code, + exception_subcode, + thread_name) ) { + if (exit_after_write) + _exit(exception_type); + } + } else { + string minidump_id; + + // Putting the MinidumpGenerator in its own context will ensure that the + // destructor is executed, closing the newly created minidump file. + if (!dump_path_.empty()) { + MinidumpGenerator md(mach_task_self(), + report_current_thread ? MACH_PORT_NULL : + mach_thread_self()); + md.SetTaskContext(task_context); + if (exception_type && exception_code) { + // If this is a real exception, give the filter (if any) a chance to + // decide if this should be sent. + if (filter_ && !filter_(callback_context_)) + return false; + + md.SetExceptionInformation(exception_type, exception_code, + exception_subcode, thread_name); + } + + result = md.Write(next_minidump_path_c_); + } + + // Call user specified callback (if any) + if (callback_) { + // If the user callback returned true and we're handling an exception + // (rather than just writing out the file), then we should exit without + // forwarding the exception to the next handler. + if (callback_(dump_path_c_, next_minidump_id_c_, callback_context_, + result)) { + if (exit_after_write) + _exit(exception_type); + } + } + } + + return result; +} + +// static +void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) { +#if USE_PROTECTED_ALLOCATIONS + if (gBreakpadAllocator) + gBreakpadAllocator->Unprotect(); +#endif + gProtectedData.handler->WriteMinidumpWithException( + EXC_SOFTWARE, + MD_EXCEPTION_CODE_MAC_ABORT, + 0, + static_cast(uc), + mach_thread_self(), + true, + true); +#if USE_PROTECTED_ALLOCATIONS + if (gBreakpadAllocator) + gBreakpadAllocator->Protect(); +#endif +} + +bool ExceptionHandler::InstallHandlers() { + // If a handler is already installed, something is really wrong. + if (gProtectedData.handler != NULL) + return false; + for (int i = 0; i < kNumHandledSignals; ++i) { + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sigaddset(&sa.sa_mask, kExceptionSignals[i]); + sa.sa_sigaction = ExceptionHandler::SignalHandler; + sa.sa_flags = SA_ONSTACK | SA_SIGINFO; + + if (sigaction(kExceptionSignals[i], &sa, old_handlers[i].get()) == -1) { + return false; + } + } + gProtectedData.handler = this; +#if USE_PROTECTED_ALLOCATIONS + assert(((size_t)(gProtectedData.protected_buffer) & PAGE_MASK) == 0); + mprotect(gProtectedData.protected_buffer, PAGE_SIZE, PROT_READ); +#endif // USE_PROTECTED_ALLOCATIONS + installed_exception_handler_ = true; + return true; +} + +bool ExceptionHandler::UninstallHandlers() { + for (int i = 0; i < kNumHandledSignals; ++i) { + if (old_handlers[i].get()) { + sigaction(kExceptionSignals[i], old_handlers[i].get(), NULL); + old_handlers[i].reset(); + } + } +#if USE_PROTECTED_ALLOCATIONS + mprotect(gProtectedData.protected_buffer, PAGE_SIZE, PROT_READ | PROT_WRITE); +#endif // USE_PROTECTED_ALLOCATIONS + gProtectedData.handler = NULL; + installed_exception_handler_ = false; + return true; +} + +bool ExceptionHandler::Setup() { + if (!InstallHandlers()) + return false; + return true; +} + +bool ExceptionHandler::Teardown() { + is_in_teardown_ = true; + + if (!UninstallHandlers()) + return false; + + return true; +} + +void ExceptionHandler::UpdateNextID() { + next_minidump_path_ = + (MinidumpGenerator::UniqueNameInDirectory(dump_path_, &next_minidump_id_)); + + next_minidump_path_c_ = next_minidump_path_.c_str(); + next_minidump_id_c_ = next_minidump_id_.c_str(); +} + +} // namespace google_breakpad diff --git a/src/client/ios/exception_handler_no_mach.h b/src/client/ios/exception_handler_no_mach.h new file mode 100644 index 0000000..57247e6 --- /dev/null +++ b/src/client/ios/exception_handler_no_mach.h @@ -0,0 +1,178 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_IOS_HANDLER_EXCEPTION_HANDLER_NO_MACH_H__ +#define CLIENT_IOS_HANDLER_EXCEPTION_HANDLER_NO_MACH_H__ + +#include +#include + +#include + +#include "client/mac/handler/ucontext_compat.h" +#include "common/scoped_ptr.h" + +namespace google_breakpad { + +using std::string; + +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. context is the parameter supplied by the user as + // callback_context when the handler was created. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, Breakpad + // will immediately report the exception as unhandled without writing a + // minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void* context); + + // A callback function to run after the minidump has been written. + // |minidump_id| is a unique id for the dump, so the minidump + // file is /.dmp. + // |context| is the value passed into the constructor. + // |succeeded| indicates whether a minidump file was successfully written. + // Return true if the exception was fully handled and breakpad should exit. + // Return false to allow any other exception handlers to process the + // exception. + typedef bool (*MinidumpCallback)(const char* dump_dir, + const char* minidump_id, + void* context, bool succeeded); + + // A callback function which will be called directly if an exception occurs. + // This bypasses the minidump file writing and simply gives the client + // the exception information. + typedef bool (*DirectCallback)(void* context, + int exception_type, + int exception_code, + int exception_subcode, + mach_port_t thread_name); + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Minidump files will be written to dump_path, and the optional callback + // is called after writing the dump file, as described above. + // If install_handler is true, then a minidump will be written whenever + // an unhandled exception occurs. If it is false, minidumps will only + // be written when WriteMinidump is called. + // If port_name is non-NULL, attempt to perform out-of-process dump generation + // If port_name is NULL, in-process dump generation will be used. + ExceptionHandler(const string& dump_path, + FilterCallback filter, MinidumpCallback callback, + void* callback_context, bool install_handler, + const char* port_name); + + // A special constructor if we want to bypass minidump writing and + // simply get a callback with the exception information. + ExceptionHandler(DirectCallback callback, + void* callback_context, + bool install_handler); + + ~ExceptionHandler(); + + // Get and set the minidump path. + string dump_path() const { return dump_path_; } + void set_dump_path(const string& dump_path) { + dump_path_ = dump_path; + dump_path_c_ = dump_path_.c_str(); + UpdateNextID(); // Necessary to put dump_path_ in next_minidump_path_. + } + + private: + // Install the SIG exception handlers. + bool InstallHandlers(); + + // Uninstall the SIG exception handlers. + bool UninstallHandlers(); + + // Setup the handler thread, and if |install_handler| is true, install the + // mach exception port handler + bool Setup(); + + // Uninstall the mach exception handler (if any) and terminate the helper + // thread + bool Teardown(); + + // All minidump writing goes through this one routine. + // |task_context| can be NULL. If not, it will be used to retrieve the + // context of the current thread, instead of using |thread_get_state|. + bool WriteMinidumpWithException(int exception_type, + int exception_code, + int exception_subcode, + breakpad_ucontext_t* task_context, + mach_port_t thread_name, + bool exit_after_write, + bool report_current_thread); + + // Signal handler for SIG exceptions. + static void SignalHandler(int sig, siginfo_t* info, void* uc); + + // disallow copy ctor and operator= + explicit ExceptionHandler(const ExceptionHandler&); + void operator=(const ExceptionHandler&); + + // Generates a new ID and stores it in next_minidump_id_, and stores the + // path of the next minidump to be written in next_minidump_path_. + void UpdateNextID(); + + // The destination directory for the minidump + string dump_path_; + + // The basename of the next minidump w/o extension + string next_minidump_id_; + + // The full path to the next minidump to be written, including extension + string next_minidump_path_; + + // Pointers to the UTF-8 versions of above + const char* dump_path_c_; + const char* next_minidump_id_c_; + const char* next_minidump_path_c_; + + // The callback function and pointer to be passed back after the minidump + // has been written + FilterCallback filter_; + MinidumpCallback callback_; + void* callback_context_; + + // The callback function to be passed back when we don't want a minidump + // file to be written + DirectCallback directCallback_; + + // True, if we've installed the exception handler + bool installed_exception_handler_; + + // True, if we're in the process of uninstalling the exception handler and + // the thread. + bool is_in_teardown_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_IOS_HANDLER_EXCEPTION_HANDLER_NO_MACH_H__ diff --git a/src/client/ios/handler/ios_exception_minidump_generator.h b/src/client/ios/handler/ios_exception_minidump_generator.h new file mode 100644 index 0000000..cf72f00 --- /dev/null +++ b/src/client/ios/handler/ios_exception_minidump_generator.h @@ -0,0 +1,73 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ios_exception_minidump_generator.h: Create a fake minidump from a +// NSException. + +#ifndef CLIENT_IOS_HANDLER_IOS_EXCEPTION_MINIDUMP_GENERATOR_H_ +#define CLIENT_IOS_HANDLER_IOS_EXCEPTION_MINIDUMP_GENERATOR_H_ + +#include + +#include "client/mac/handler/minidump_generator.h" + +namespace google_breakpad { + +class IosExceptionMinidumpGenerator : public MinidumpGenerator { + public: + explicit IosExceptionMinidumpGenerator(NSException* exception); + virtual ~IosExceptionMinidumpGenerator(); + + protected: + virtual bool WriteExceptionStream(MDRawDirectory* exception_stream); + virtual bool WriteThreadStream(mach_port_t thread_id, MDRawThread* thread); + + private: + + // Get the crashing program counter from the exception. + uintptr_t GetPCFromException(); + + // Get the crashing link register from the exception. + uintptr_t GetLRFromException(); + + // Write a virtual thread context for the crashing site. + bool WriteCrashingContext(MDLocationDescriptor* register_location); + // Per-CPU implementations of the above method. +#ifdef HAS_ARM_SUPPORT + bool WriteCrashingContextARM(MDLocationDescriptor* register_location); +#endif +#ifdef HAS_ARM64_SUPPORT + bool WriteCrashingContextARM64(MDLocationDescriptor* register_location); +#endif + + NSArray* return_addresses_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_IOS_HANDLER_IOS_EXCEPTION_MINIDUMP_GENERATOR_H_ diff --git a/src/client/ios/handler/ios_exception_minidump_generator.mm b/src/client/ios/handler/ios_exception_minidump_generator.mm new file mode 100644 index 0000000..053e367 --- /dev/null +++ b/src/client/ios/handler/ios_exception_minidump_generator.mm @@ -0,0 +1,209 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "client/ios/handler/ios_exception_minidump_generator.h" + +#include + +#include "google_breakpad/common/minidump_cpu_arm.h" +#include "google_breakpad/common/minidump_cpu_arm64.h" +#include "google_breakpad/common/minidump_exception_mac.h" +#include "client/minidump_file_writer-inl.h" +#include "common/scoped_ptr.h" + +#if defined(HAS_ARM_SUPPORT) && defined(HAS_ARM64_SUPPORT) +#error "This file should be compiled for only one architecture at a time" +#endif + +namespace { + +const int kExceptionType = EXC_SOFTWARE; +const int kExceptionCode = MD_EXCEPTION_CODE_MAC_NS_EXCEPTION; + +#if defined(HAS_ARM_SUPPORT) || defined(HAS_ARM64_SUPPORT) +const uintptr_t kExpectedFinalFp = sizeof(uintptr_t); +const uintptr_t kExpectedFinalSp = 0; + +// Append the given value to the sp position of the stack represented +// by memory. +void AppendToMemory(uint8_t* memory, uintptr_t sp, uintptr_t data) { + memcpy(memory + sp, &data, sizeof(data)); +} +#endif + +} // namespace + +namespace google_breakpad { + +IosExceptionMinidumpGenerator::IosExceptionMinidumpGenerator( + NSException* exception) + : MinidumpGenerator(mach_task_self(), 0) { + return_addresses_ = [[exception callStackReturnAddresses] retain]; + SetExceptionInformation(kExceptionType, + kExceptionCode, + 0, + pthread_mach_thread_np(pthread_self())); +} + +IosExceptionMinidumpGenerator::~IosExceptionMinidumpGenerator() { + [return_addresses_ release]; +} + +bool IosExceptionMinidumpGenerator::WriteCrashingContext( + MDLocationDescriptor* register_location) { +#ifdef HAS_ARM_SUPPORT + return WriteCrashingContextARM(register_location); +#elif defined(HAS_ARM64_SUPPORT) + return WriteCrashingContextARM64(register_location); +#else + assert(false); + return false; +#endif +} + +#ifdef HAS_ARM_SUPPORT +bool IosExceptionMinidumpGenerator::WriteCrashingContextARM( + MDLocationDescriptor* register_location) { + TypedMDRVA context(&writer_); + if (!context.Allocate()) + return false; + *register_location = context.location(); + MDRawContextARM* context_ptr = context.get(); + memset(context_ptr, 0, sizeof(MDRawContextARM)); + context_ptr->context_flags = MD_CONTEXT_ARM_FULL; + context_ptr->iregs[MD_CONTEXT_ARM_REG_IOS_FP] = kExpectedFinalFp; // FP + context_ptr->iregs[MD_CONTEXT_ARM_REG_SP] = kExpectedFinalSp; // SP + context_ptr->iregs[MD_CONTEXT_ARM_REG_LR] = GetLRFromException(); // LR + context_ptr->iregs[MD_CONTEXT_ARM_REG_PC] = GetPCFromException(); // PC + return true; +} +#endif + +#ifdef HAS_ARM64_SUPPORT +bool IosExceptionMinidumpGenerator::WriteCrashingContextARM64( + MDLocationDescriptor* register_location) { + TypedMDRVA context(&writer_); + if (!context.Allocate()) + return false; + *register_location = context.location(); + MDRawContextARM64_Old* context_ptr = context.get(); + memset(context_ptr, 0, sizeof(*context_ptr)); + context_ptr->context_flags = MD_CONTEXT_ARM64_FULL_OLD; + context_ptr->iregs[MD_CONTEXT_ARM64_REG_FP] = kExpectedFinalFp; // FP + context_ptr->iregs[MD_CONTEXT_ARM64_REG_SP] = kExpectedFinalSp; // SP + context_ptr->iregs[MD_CONTEXT_ARM64_REG_LR] = GetLRFromException(); // LR + context_ptr->iregs[MD_CONTEXT_ARM64_REG_PC] = GetPCFromException(); // PC + return true; +} +#endif + +uintptr_t IosExceptionMinidumpGenerator::GetPCFromException() { + return [[return_addresses_ objectAtIndex:0] unsignedIntegerValue]; +} + +uintptr_t IosExceptionMinidumpGenerator::GetLRFromException() { + return [[return_addresses_ objectAtIndex:1] unsignedIntegerValue]; +} + +bool IosExceptionMinidumpGenerator::WriteExceptionStream( + MDRawDirectory* exception_stream) { +#if defined(HAS_ARM_SUPPORT) || defined(HAS_ARM64_SUPPORT) + TypedMDRVA exception(&writer_); + + if (!exception.Allocate()) + return false; + + exception_stream->stream_type = MD_EXCEPTION_STREAM; + exception_stream->location = exception.location(); + MDRawExceptionStream* exception_ptr = exception.get(); + exception_ptr->thread_id = pthread_mach_thread_np(pthread_self()); + + // This naming is confusing, but it is the proper translation from + // mach naming to minidump naming. + exception_ptr->exception_record.exception_code = kExceptionType; + exception_ptr->exception_record.exception_flags = kExceptionCode; + + if (!WriteCrashingContext(&exception_ptr->thread_context)) + return false; + + exception_ptr->exception_record.exception_address = GetPCFromException(); + return true; +#else + return MinidumpGenerator::WriteExceptionStream(exception_stream); +#endif +} + +bool IosExceptionMinidumpGenerator::WriteThreadStream(mach_port_t thread_id, + MDRawThread* thread) { +#if defined(HAS_ARM_SUPPORT) || defined(HAS_ARM64_SUPPORT) + if (pthread_mach_thread_np(pthread_self()) != thread_id) + return MinidumpGenerator::WriteThreadStream(thread_id, thread); + + size_t frame_count = [return_addresses_ count]; + if (frame_count == 0) + return false; + UntypedMDRVA memory(&writer_); + size_t pointer_size = sizeof(uintptr_t); + size_t frame_record_size = 2 * pointer_size; + size_t stack_size = frame_record_size * (frame_count - 1) + pointer_size; + if (!memory.Allocate(stack_size)) + return false; + scoped_array stack_memory(new uint8_t[stack_size]); + uintptr_t sp = stack_size - pointer_size; + uintptr_t fp = 0; + uintptr_t lr = 0; + for (size_t current_frame = frame_count - 1; + current_frame > 0; + --current_frame) { + AppendToMemory(stack_memory.get(), sp, lr); + sp -= pointer_size; + AppendToMemory(stack_memory.get(), sp, fp); + fp = sp; + sp -= pointer_size; + lr = [[return_addresses_ objectAtIndex:current_frame] unsignedIntegerValue]; + } + if (!memory.Copy(stack_memory.get(), stack_size)) + return false; + assert(sp == kExpectedFinalSp); + assert(fp == kExpectedFinalFp); + assert(lr == GetLRFromException()); + thread->stack.start_of_memory_range = sp; + thread->stack.memory = memory.location(); + memory_blocks_.push_back(thread->stack); + + if (!WriteCrashingContext(&thread->thread_context)) + return false; + + thread->thread_id = thread_id; + return true; +#else + return MinidumpGenerator::WriteThreadStream(thread_id, thread); +#endif +} + +} // namespace google_breakpad diff --git a/src/client/linux/crash_generation/client_info.h b/src/client/linux/crash_generation/client_info.h new file mode 100644 index 0000000..6c4ecc3 --- /dev/null +++ b/src/client/linux/crash_generation/client_info.h @@ -0,0 +1,52 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_ +#define CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_ + +namespace google_breakpad { + +class CrashGenerationServer; + +class ClientInfo { + public: + ClientInfo(pid_t pid, CrashGenerationServer* crash_server) + : crash_server_(crash_server), + pid_(pid) {} + + CrashGenerationServer* crash_server() const { return crash_server_; } + pid_t pid() const { return pid_; } + + private: + CrashGenerationServer* crash_server_; + pid_t pid_; +}; + +} + +#endif // CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_ diff --git a/src/client/linux/crash_generation/crash_generation_client.cc b/src/client/linux/crash_generation/crash_generation_client.cc new file mode 100644 index 0000000..020c614 --- /dev/null +++ b/src/client/linux/crash_generation/crash_generation_client.cc @@ -0,0 +1,108 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/linux/crash_generation/crash_generation_client.h" + +#include +#include +#include + +#include + +#include "common/linux/eintr_wrapper.h" +#include "common/linux/ignore_ret.h" +#include "third_party/lss/linux_syscall_support.h" + +namespace google_breakpad { + +namespace { + +class CrashGenerationClientImpl : public CrashGenerationClient { + public: + explicit CrashGenerationClientImpl(int server_fd) : server_fd_(server_fd) {} + CrashGenerationClientImpl(const CrashGenerationClientImpl&) = delete; + void operator=(const CrashGenerationClientImpl&) = delete; + ~CrashGenerationClientImpl() override = default; + + bool RequestDump(const void* blob, size_t blob_size) override { + int fds[2]; + if (sys_pipe(fds) < 0) + return false; + static const unsigned kControlMsgSize = CMSG_SPACE(sizeof(int)); + + struct kernel_iovec iov; + iov.iov_base = const_cast(blob); + iov.iov_len = blob_size; + + struct kernel_msghdr msg = { 0 }; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + char cmsg[kControlMsgSize] = ""; + msg.msg_control = cmsg; + msg.msg_controllen = sizeof(cmsg); + + struct cmsghdr* hdr = CMSG_FIRSTHDR(&msg); + hdr->cmsg_level = SOL_SOCKET; + hdr->cmsg_type = SCM_RIGHTS; + hdr->cmsg_len = CMSG_LEN(sizeof(int)); + int* p = reinterpret_cast(CMSG_DATA(hdr)); + *p = fds[1]; + + ssize_t ret = HANDLE_EINTR(sys_sendmsg(server_fd_, &msg, 0)); + sys_close(fds[1]); + if (ret < 0) { + sys_close(fds[0]); + return false; + } + + // Wait for an ACK from the server. + char b; + IGNORE_RET(HANDLE_EINTR(sys_read(fds[0], &b, 1))); + sys_close(fds[0]); + + return true; + } + + private: + int server_fd_; +}; + +} // namespace + +// static +CrashGenerationClient* CrashGenerationClient::TryCreate(int server_fd) { + if (server_fd < 0) + return NULL; + return new CrashGenerationClientImpl(server_fd); +} + +} // namespace google_breakpad diff --git a/src/client/linux/crash_generation/crash_generation_client.h b/src/client/linux/crash_generation/crash_generation_client.h new file mode 100644 index 0000000..1e4a7a5 --- /dev/null +++ b/src/client/linux/crash_generation/crash_generation_client.h @@ -0,0 +1,61 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ +#define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ + +#include + +namespace google_breakpad { + +// CrashGenerationClient is an interface for implementing out-of-process crash +// dumping. The default implementation, accessed via the TryCreate() factory, +// works in conjunction with the CrashGenerationServer to generate a minidump +// via a remote process. +class CrashGenerationClient { + public: + CrashGenerationClient() = default; + CrashGenerationClient(const CrashGenerationClient&) = delete; + void operator=(const CrashGenerationClient&) = delete; + virtual ~CrashGenerationClient() = default; + + // Request the crash server to generate a dump. |blob| is an opaque + // CrashContext pointer from exception_handler.h. + // Returns true if the dump was successful; false otherwise. + virtual bool RequestDump(const void* blob, size_t blob_size) = 0; + + // Returns a new CrashGenerationClient if |server_fd| is valid and + // connects to a CrashGenerationServer. Otherwise, return NULL. + // The returned CrashGenerationClient* is owned by the caller of + // this function. + static CrashGenerationClient* TryCreate(int server_fd); +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ diff --git a/src/client/linux/crash_generation/crash_generation_server.cc b/src/client/linux/crash_generation/crash_generation_server.cc new file mode 100644 index 0000000..e3270c9 --- /dev/null +++ b/src/client/linux/crash_generation/crash_generation_server.cc @@ -0,0 +1,336 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "client/linux/crash_generation/crash_generation_server.h" +#include "client/linux/crash_generation/client_info.h" +#include "client/linux/handler/exception_handler.h" +#include "client/linux/minidump_writer/minidump_writer.h" +#include "common/linux/eintr_wrapper.h" +#include "common/linux/guid_creator.h" +#include "common/linux/safe_readlink.h" + +static const char kCommandQuit = 'x'; + +namespace google_breakpad { + +CrashGenerationServer::CrashGenerationServer( + const int listen_fd, + OnClientDumpRequestCallback dump_callback, + void* dump_context, + OnClientExitingCallback exit_callback, + void* exit_context, + bool generate_dumps, + const string* dump_path) : + server_fd_(listen_fd), + dump_callback_(dump_callback), + dump_context_(dump_context), + exit_callback_(exit_callback), + exit_context_(exit_context), + generate_dumps_(generate_dumps), + started_(false) +{ + if (dump_path) + dump_dir_ = *dump_path; + else + dump_dir_ = "/tmp"; +} + +CrashGenerationServer::~CrashGenerationServer() +{ + if (started_) + Stop(); +} + +bool +CrashGenerationServer::Start() +{ + if (started_ || 0 > server_fd_) + return false; + + int control_pipe[2]; + if (pipe(control_pipe)) + return false; + + if (fcntl(control_pipe[0], F_SETFD, FD_CLOEXEC)) + return false; + if (fcntl(control_pipe[1], F_SETFD, FD_CLOEXEC)) + return false; + + if (fcntl(control_pipe[0], F_SETFL, O_NONBLOCK)) + return false; + + control_pipe_in_ = control_pipe[0]; + control_pipe_out_ = control_pipe[1]; + + if (pthread_create(&thread_, NULL, + ThreadMain, reinterpret_cast(this))) + return false; + + started_ = true; + return true; +} + +void +CrashGenerationServer::Stop() +{ + assert(pthread_self() != thread_); + + if (!started_) + return; + + HANDLE_EINTR(write(control_pipe_out_, &kCommandQuit, 1)); + + void* dummy; + pthread_join(thread_, &dummy); + + close(control_pipe_in_); + close(control_pipe_out_); + + started_ = false; +} + +//static +bool +CrashGenerationServer::CreateReportChannel(int* server_fd, int* client_fd) +{ + int fds[2]; + + if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds)) + return false; + + static const int on = 1; + // Enable passcred on the server end of the socket + if (setsockopt(fds[1], SOL_SOCKET, SO_PASSCRED, &on, sizeof(on))) + return false; + + if (fcntl(fds[1], F_SETFL, O_NONBLOCK)) + return false; + if (fcntl(fds[1], F_SETFD, FD_CLOEXEC)) + return false; + + *client_fd = fds[0]; + *server_fd = fds[1]; + return true; +} + +// The following methods/functions execute on the server thread + +void +CrashGenerationServer::Run() +{ + struct pollfd pollfds[2]; + memset(&pollfds, 0, sizeof(pollfds)); + + pollfds[0].fd = server_fd_; + pollfds[0].events = POLLIN; + + pollfds[1].fd = control_pipe_in_; + pollfds[1].events = POLLIN; + + while (true) { + // infinite timeout + int nevents = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), -1); + if (-1 == nevents) { + if (EINTR == errno) { + continue; + } else { + return; + } + } + + if (pollfds[0].revents && !ClientEvent(pollfds[0].revents)) + return; + + if (pollfds[1].revents && !ControlEvent(pollfds[1].revents)) + return; + } +} + +bool +CrashGenerationServer::ClientEvent(short revents) +{ + if (POLLHUP & revents) + return false; + assert(POLLIN & revents); + + // A process has crashed and has signaled us by writing a datagram + // to the death signal socket. The datagram contains the crash context needed + // for writing the minidump as well as a file descriptor and a credentials + // block so that they can't lie about their pid. + + // The length of the control message: + static const unsigned kControlMsgSize = + CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(struct ucred)); + // The length of the regular payload: + static const unsigned kCrashContextSize = + sizeof(google_breakpad::ExceptionHandler::CrashContext); + + struct msghdr msg = {0}; + struct iovec iov[1]; + char crash_context[kCrashContextSize]; + char control[kControlMsgSize]; + const ssize_t expected_msg_size = sizeof(crash_context); + + iov[0].iov_base = crash_context; + iov[0].iov_len = sizeof(crash_context); + msg.msg_iov = iov; + msg.msg_iovlen = sizeof(iov)/sizeof(iov[0]); + msg.msg_control = control; + msg.msg_controllen = kControlMsgSize; + + const ssize_t msg_size = HANDLE_EINTR(recvmsg(server_fd_, &msg, 0)); + if (msg_size != expected_msg_size) + return true; + + if (msg.msg_controllen != kControlMsgSize || + msg.msg_flags & ~MSG_TRUNC) + return true; + + // Walk the control payload and extract the file descriptor and validated pid. + pid_t crashing_pid = -1; + int signal_fd = -1; + for (struct cmsghdr* hdr = CMSG_FIRSTHDR(&msg); hdr; + hdr = CMSG_NXTHDR(&msg, hdr)) { + if (hdr->cmsg_level != SOL_SOCKET) + continue; + if (hdr->cmsg_type == SCM_RIGHTS) { + const unsigned len = hdr->cmsg_len - + (((uint8_t*)CMSG_DATA(hdr)) - (uint8_t*)hdr); + assert(len % sizeof(int) == 0u); + const unsigned num_fds = len / sizeof(int); + if (num_fds > 1 || num_fds == 0) { + // A nasty process could try and send us too many descriptors and + // force a leak. + for (unsigned i = 0; i < num_fds; ++i) + close(reinterpret_cast(CMSG_DATA(hdr))[i]); + return true; + } else { + signal_fd = reinterpret_cast(CMSG_DATA(hdr))[0]; + } + } else if (hdr->cmsg_type == SCM_CREDENTIALS) { + const struct ucred* cred = + reinterpret_cast(CMSG_DATA(hdr)); + crashing_pid = cred->pid; + } + } + + if (crashing_pid == -1 || signal_fd == -1) { + if (signal_fd != -1) + close(signal_fd); + return true; + } + + string minidump_filename; + if (!MakeMinidumpFilename(minidump_filename)) + return true; + + if (!google_breakpad::WriteMinidump(minidump_filename.c_str(), + crashing_pid, crash_context, + kCrashContextSize)) { + close(signal_fd); + return true; + } + + if (dump_callback_) { + ClientInfo info(crashing_pid, this); + + dump_callback_(dump_context_, &info, &minidump_filename); + } + + // Send the done signal to the process: it can exit now. + // (Closing this will make the child's sys_read unblock and return 0.) + close(signal_fd); + + return true; +} + +bool +CrashGenerationServer::ControlEvent(short revents) +{ + if (POLLHUP & revents) + return false; + assert(POLLIN & revents); + + char command; + if (read(control_pipe_in_, &command, 1)) + return false; + + switch (command) { + case kCommandQuit: + return false; + default: + assert(0); + } + + return true; +} + +bool +CrashGenerationServer::MakeMinidumpFilename(string& outFilename) +{ + GUID guid; + char guidString[kGUIDStringLength+1]; + + if (!(CreateGUID(&guid) + && GUIDToString(&guid, guidString, sizeof(guidString)))) + return false; + + char path[PATH_MAX]; + snprintf(path, sizeof(path), "%s/%s.dmp", dump_dir_.c_str(), guidString); + + outFilename = path; + return true; +} + +// static +void* +CrashGenerationServer::ThreadMain(void* arg) +{ + reinterpret_cast(arg)->Run(); + return NULL; +} + +} // namespace google_breakpad diff --git a/src/client/linux/crash_generation/crash_generation_server.h b/src/client/linux/crash_generation/crash_generation_server.h new file mode 100644 index 0000000..5f4cb3a --- /dev/null +++ b/src/client/linux/crash_generation/crash_generation_server.h @@ -0,0 +1,134 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_ +#define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_ + +#include + +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +class ClientInfo; + +class CrashGenerationServer { +public: + // WARNING: callbacks may be invoked on a different thread + // than that which creates the CrashGenerationServer. They must + // be thread safe. + typedef void (*OnClientDumpRequestCallback)(void* context, + const ClientInfo* client_info, + const string* file_path); + + typedef void (*OnClientExitingCallback)(void* context, + const ClientInfo* client_info); + + // Create an instance with the given parameters. + // + // Parameter listen_fd: The server fd created by CreateReportChannel(). + // Parameter dump_callback: Callback for a client crash dump request. + // Parameter dump_context: Context for client crash dump request callback. + // Parameter exit_callback: Callback for client process exit. + // Parameter exit_context: Context for client exit callback. + // Parameter generate_dumps: Whether to automatically generate dumps. + // Client code of this class might want to generate dumps explicitly + // in the crash dump request callback. In that case, false can be + // passed for this parameter. + // Parameter dump_path: Path for generating dumps; required only if true is + // passed for generateDumps parameter; NULL can be passed otherwise. + CrashGenerationServer(const int listen_fd, + OnClientDumpRequestCallback dump_callback, + void* dump_context, + OnClientExitingCallback exit_callback, + void* exit_context, + bool generate_dumps, + const string* dump_path); + + ~CrashGenerationServer(); + + // Perform initialization steps needed to start listening to clients. + // + // Return true if initialization is successful; false otherwise. + bool Start(); + + // Stop the server. + void Stop(); + + // Create a "channel" that can be used by clients to report crashes + // to a CrashGenerationServer. |*server_fd| should be passed to + // this class's constructor, and |*client_fd| should be passed to + // the ExceptionHandler constructor in the client process. + static bool CreateReportChannel(int* server_fd, int* client_fd); + +private: + // Run the server's event loop + void Run(); + + // Invoked when an child process (client) event occurs + // Returning true => "keep running", false => "exit loop" + bool ClientEvent(short revents); + + // Invoked when the controlling thread (main) event occurs + // Returning true => "keep running", false => "exit loop" + bool ControlEvent(short revents); + + // Return a unique filename at which a minidump can be written + bool MakeMinidumpFilename(string& outFilename); + + // Trampoline to |Run()| + static void* ThreadMain(void* arg); + + int server_fd_; + + OnClientDumpRequestCallback dump_callback_; + void* dump_context_; + + OnClientExitingCallback exit_callback_; + void* exit_context_; + + bool generate_dumps_; + + string dump_dir_; + + bool started_; + + pthread_t thread_; + int control_pipe_in_; + int control_pipe_out_; + + // disable these + CrashGenerationServer(const CrashGenerationServer&); + CrashGenerationServer& operator=(const CrashGenerationServer&); +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_ diff --git a/src/client/linux/data/linux-gate-amd.sym b/src/client/linux/data/linux-gate-amd.sym new file mode 100644 index 0000000..e042a5e --- /dev/null +++ b/src/client/linux/data/linux-gate-amd.sym @@ -0,0 +1,3 @@ +MODULE Linux x86 B8CFDE93002D54DA1900A40AA1BD67690 linux-gate.so +PUBLIC 400 0 __kernel_vsyscall +STACK WIN 4 400 100 1 1 0 0 0 0 0 1 diff --git a/src/client/linux/data/linux-gate-intel.sym b/src/client/linux/data/linux-gate-intel.sym new file mode 100644 index 0000000..c209c23 --- /dev/null +++ b/src/client/linux/data/linux-gate-intel.sym @@ -0,0 +1,3 @@ +MODULE Linux x86 4FBDA58B5A1DF5A379E3CF19A235EA090 linux-gate.so +PUBLIC 400 0 __kernel_vsyscall +STACK WIN 4 400 200 3 3 0 0 0 0 0 1 \ No newline at end of file diff --git a/src/client/linux/dump_writer_common/mapping_info.h b/src/client/linux/dump_writer_common/mapping_info.h new file mode 100644 index 0000000..759e733 --- /dev/null +++ b/src/client/linux/dump_writer_common/mapping_info.h @@ -0,0 +1,73 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_MAPPING_INFO_H_ +#define CLIENT_LINUX_DUMP_WRITER_COMMON_MAPPING_INFO_H_ + +#include +#include +#include + +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// One of these is produced for each mapping in the process (i.e. line in +// /proc/$x/maps). +struct MappingInfo { + // On Android, relocation packing can mean that the reported start + // address of the mapping must be adjusted by a bias in order to + // compensate for the compression of the relocation section. The + // following two members hold (after LateInit) the adjusted mapping + // range. See crbug.com/606972 for more information. + uintptr_t start_addr; + size_t size; + // When Android relocation packing causes |start_addr| and |size| to + // be modified with a load bias, we need to remember the unbiased + // address range. The following structure holds the original mapping + // address range as reported by the operating system. + struct { + uintptr_t start_addr; + uintptr_t end_addr; + } system_mapping_info; + size_t offset; // offset into the backed file. + bool exec; // true if the mapping has the execute bit set. + char name[NAME_MAX]; +}; + +struct MappingEntry { + MappingInfo first; + uint8_t second[sizeof(MDGUID)]; +}; + +// A list of +typedef std::list MappingList; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_MAPPING_INFO_H_ diff --git a/src/client/linux/dump_writer_common/raw_context_cpu.h b/src/client/linux/dump_writer_common/raw_context_cpu.h new file mode 100644 index 0000000..ea4b6f6 --- /dev/null +++ b/src/client/linux/dump_writer_common/raw_context_cpu.h @@ -0,0 +1,60 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_RAW_CONTEXT_CPU_H +#define CLIENT_LINUX_DUMP_WRITER_COMMON_RAW_CONTEXT_CPU_H + +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +#if defined(__i386__) +typedef MDRawContextX86 RawContextCPU; +#elif defined(__x86_64) +typedef MDRawContextAMD64 RawContextCPU; +#elif defined(__ARM_EABI__) +typedef MDRawContextARM RawContextCPU; +#elif defined(__aarch64__) +typedef MDRawContextARM64_Old RawContextCPU; +#elif defined(__mips__) +typedef MDRawContextMIPS RawContextCPU; +#elif defined(__riscv) +# if __riscv_xlen == 32 +typedef MDRawContextRISCV RawContextCPU; +# elif __riscv_xlen == 64 +typedef MDRawContextRISCV64 RawContextCPU; +# else +# error "Unexpected __riscv_xlen" +# endif +#else +#error "This code has not been ported to your platform yet." +#endif + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_RAW_CONTEXT_CPU_H diff --git a/src/client/linux/dump_writer_common/thread_info.cc b/src/client/linux/dump_writer_common/thread_info.cc new file mode 100644 index 0000000..6288a05 --- /dev/null +++ b/src/client/linux/dump_writer_common/thread_info.cc @@ -0,0 +1,395 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/linux/dump_writer_common/thread_info.h" + +#include +#include + +#include "common/linux/linux_libc_support.h" +#include "google_breakpad/common/minidump_format.h" + +namespace { + +#if defined(__i386__) +// Write a uint16_t to memory +// out: memory location to write to +// v: value to write. +void U16(void* out, uint16_t v) { + my_memcpy(out, &v, sizeof(v)); +} + +// Write a uint32_t to memory +// out: memory location to write to +// v: value to write. +void U32(void* out, uint32_t v) { + my_memcpy(out, &v, sizeof(v)); +} +#endif + +} + +namespace google_breakpad { + +#if defined(__i386__) + +uintptr_t ThreadInfo::GetInstructionPointer() const { + return regs.eip; +} + +void ThreadInfo::FillCPUContext(RawContextCPU* out) const { + out->context_flags = MD_CONTEXT_X86_ALL; + + out->dr0 = dregs[0]; + out->dr1 = dregs[1]; + out->dr2 = dregs[2]; + out->dr3 = dregs[3]; + // 4 and 5 deliberatly omitted because they aren't included in the minidump + // format. + out->dr6 = dregs[6]; + out->dr7 = dregs[7]; + + out->gs = regs.xgs; + out->fs = regs.xfs; + out->es = regs.xes; + out->ds = regs.xds; + + out->edi = regs.edi; + out->esi = regs.esi; + out->ebx = regs.ebx; + out->edx = regs.edx; + out->ecx = regs.ecx; + out->eax = regs.eax; + + out->ebp = regs.ebp; + out->eip = regs.eip; + out->cs = regs.xcs; + out->eflags = regs.eflags; + out->esp = regs.esp; + out->ss = regs.xss; + + out->float_save.control_word = fpregs.cwd; + out->float_save.status_word = fpregs.swd; + out->float_save.tag_word = fpregs.twd; + out->float_save.error_offset = fpregs.fip; + out->float_save.error_selector = fpregs.fcs; + out->float_save.data_offset = fpregs.foo; + out->float_save.data_selector = fpregs.fos; + + // 8 registers * 10 bytes per register. + my_memcpy(out->float_save.register_area, fpregs.st_space, 10 * 8); + + // This matches the Intel fpsave format. + U16(out->extended_registers + 0, fpregs.cwd); + U16(out->extended_registers + 2, fpregs.swd); + U16(out->extended_registers + 4, fpregs.twd); + U16(out->extended_registers + 6, fpxregs.fop); + U32(out->extended_registers + 8, fpxregs.fip); + U16(out->extended_registers + 12, fpxregs.fcs); + U32(out->extended_registers + 16, fpregs.foo); + U16(out->extended_registers + 20, fpregs.fos); + U32(out->extended_registers + 24, fpxregs.mxcsr); + + my_memcpy(out->extended_registers + 32, &fpxregs.st_space, 128); + my_memcpy(out->extended_registers + 160, &fpxregs.xmm_space, 128); +} + +#elif defined(__x86_64) + +uintptr_t ThreadInfo::GetInstructionPointer() const { + return regs.rip; +} + +void ThreadInfo::FillCPUContext(RawContextCPU* out) const { + out->context_flags = MD_CONTEXT_AMD64_FULL | + MD_CONTEXT_AMD64_SEGMENTS; + + out->cs = regs.cs; + + out->ds = regs.ds; + out->es = regs.es; + out->fs = regs.fs; + out->gs = regs.gs; + + out->ss = regs.ss; + out->eflags = regs.eflags; + + out->dr0 = dregs[0]; + out->dr1 = dregs[1]; + out->dr2 = dregs[2]; + out->dr3 = dregs[3]; + // 4 and 5 deliberatly omitted because they aren't included in the minidump + // format. + out->dr6 = dregs[6]; + out->dr7 = dregs[7]; + + out->rax = regs.rax; + out->rcx = regs.rcx; + out->rdx = regs.rdx; + out->rbx = regs.rbx; + + out->rsp = regs.rsp; + + out->rbp = regs.rbp; + out->rsi = regs.rsi; + out->rdi = regs.rdi; + out->r8 = regs.r8; + out->r9 = regs.r9; + out->r10 = regs.r10; + out->r11 = regs.r11; + out->r12 = regs.r12; + out->r13 = regs.r13; + out->r14 = regs.r14; + out->r15 = regs.r15; + + out->rip = regs.rip; + + out->flt_save.control_word = fpregs.cwd; + out->flt_save.status_word = fpregs.swd; + out->flt_save.tag_word = fpregs.ftw; + out->flt_save.error_opcode = fpregs.fop; + out->flt_save.error_offset = fpregs.rip; + out->flt_save.error_selector = 0; // We don't have this. + out->flt_save.data_offset = fpregs.rdp; + out->flt_save.data_selector = 0; // We don't have this. + out->flt_save.mx_csr = fpregs.mxcsr; + out->flt_save.mx_csr_mask = fpregs.mxcr_mask; + + my_memcpy(&out->flt_save.float_registers, &fpregs.st_space, 8 * 16); + my_memcpy(&out->flt_save.xmm_registers, &fpregs.xmm_space, 16 * 16); +} + +#elif defined(__ARM_EABI__) + +uintptr_t ThreadInfo::GetInstructionPointer() const { + return regs.uregs[15]; +} + +void ThreadInfo::FillCPUContext(RawContextCPU* out) const { + out->context_flags = MD_CONTEXT_ARM_FULL; + + for (int i = 0; i < MD_CONTEXT_ARM_GPR_COUNT; ++i) + out->iregs[i] = regs.uregs[i]; + // No CPSR register in ThreadInfo(it's not accessible via ptrace) + out->cpsr = 0; +#if !defined(__ANDROID__) + out->float_save.fpscr = fpregs.fpsr | + (static_cast(fpregs.fpcr) << 32); + // TODO: sort this out, actually collect floating point registers + my_memset(&out->float_save.regs, 0, sizeof(out->float_save.regs)); + my_memset(&out->float_save.extra, 0, sizeof(out->float_save.extra)); +#endif +} + +#elif defined(__aarch64__) + +uintptr_t ThreadInfo::GetInstructionPointer() const { + return regs.pc; +} + +void ThreadInfo::FillCPUContext(RawContextCPU* out) const { + out->context_flags = MD_CONTEXT_ARM64_FULL_OLD; + + out->cpsr = static_cast(regs.pstate); + for (int i = 0; i < MD_CONTEXT_ARM64_REG_SP; ++i) + out->iregs[i] = regs.regs[i]; + out->iregs[MD_CONTEXT_ARM64_REG_SP] = regs.sp; + out->iregs[MD_CONTEXT_ARM64_REG_PC] = regs.pc; + + out->float_save.fpsr = fpregs.fpsr; + out->float_save.fpcr = fpregs.fpcr; + my_memcpy(&out->float_save.regs, &fpregs.vregs, + MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT * 16); +} + +#elif defined(__mips__) + +uintptr_t ThreadInfo::GetInstructionPointer() const { + return mcontext.pc; +} + +void ThreadInfo::FillCPUContext(RawContextCPU* out) const { +#if _MIPS_SIM == _ABI64 + out->context_flags = MD_CONTEXT_MIPS64_FULL; +#elif _MIPS_SIM == _ABIO32 + out->context_flags = MD_CONTEXT_MIPS_FULL; +#else +# error "This mips ABI is currently not supported (n32)" +#endif + + for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i) + out->iregs[i] = mcontext.gregs[i]; + + out->mdhi = mcontext.mdhi; + out->mdlo = mcontext.mdlo; + out->dsp_control = mcontext.dsp; + + out->hi[0] = mcontext.hi1; + out->lo[0] = mcontext.lo1; + out->hi[1] = mcontext.hi2; + out->lo[1] = mcontext.lo2; + out->hi[2] = mcontext.hi3; + out->lo[2] = mcontext.lo3; + + out->epc = mcontext.pc; + out->badvaddr = 0; // Not stored in mcontext + out->status = 0; // Not stored in mcontext + out->cause = 0; // Not stored in mcontext + + for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i) + out->float_save.regs[i] = mcontext.fpregs.fp_r.fp_fregs[i]._fp_fregs; + + out->float_save.fpcsr = mcontext.fpc_csr; +#if _MIPS_SIM == _ABIO32 + out->float_save.fir = mcontext.fpc_eir; +#endif +} + +#elif defined(__riscv) + +uintptr_t ThreadInfo::GetInstructionPointer() const { + return mcontext.__gregs[0]; +} + +void ThreadInfo::FillCPUContext(RawContextCPU* out) const { +# if __riscv__xlen == 32 + out->context_flags = MD_CONTEXT_RISCV_FULL; +# elif __riscv_xlen == 64 + out->context_flags = MD_CONTEXT_RISCV64_FULL; +# else +# error "Unexpected __riscv_xlen" +# endif + + out->pc = mcontext.__gregs[0]; + out->ra = mcontext.__gregs[1]; + out->sp = mcontext.__gregs[2]; + out->gp = mcontext.__gregs[3]; + out->tp = mcontext.__gregs[4]; + out->t0 = mcontext.__gregs[5]; + out->t1 = mcontext.__gregs[6]; + out->t2 = mcontext.__gregs[7]; + out->s0 = mcontext.__gregs[8]; + out->s1 = mcontext.__gregs[9]; + out->a0 = mcontext.__gregs[10]; + out->a1 = mcontext.__gregs[11]; + out->a2 = mcontext.__gregs[12]; + out->a3 = mcontext.__gregs[13]; + out->a4 = mcontext.__gregs[14]; + out->a5 = mcontext.__gregs[15]; + out->a6 = mcontext.__gregs[16]; + out->a7 = mcontext.__gregs[17]; + out->s2 = mcontext.__gregs[18]; + out->s3 = mcontext.__gregs[19]; + out->s4 = mcontext.__gregs[20]; + out->s5 = mcontext.__gregs[21]; + out->s6 = mcontext.__gregs[22]; + out->s7 = mcontext.__gregs[23]; + out->s8 = mcontext.__gregs[24]; + out->s9 = mcontext.__gregs[25]; + out->s10 = mcontext.__gregs[26]; + out->s11 = mcontext.__gregs[27]; + out->t3 = mcontext.__gregs[28]; + out->t4 = mcontext.__gregs[29]; + out->t5 = mcontext.__gregs[30]; + out->t6 = mcontext.__gregs[31]; + + // Breakpad only supports RISCV32 with 32 bit floating point. + // Breakpad only supports RISCV64 with 64 bit floating point. +#if __riscv_xlen == 32 + for (int i = 0; i < MD_CONTEXT_RISCV_FPR_COUNT; i++) + out->fpregs[i] = mcontext.__fpregs.__f.__f[i]; + out->fcsr = mcontext.__fpregs.__f.__fcsr; +#elif __riscv_xlen == 64 + for (int i = 0; i < MD_CONTEXT_RISCV_FPR_COUNT; i++) + out->fpregs[i] = mcontext.__fpregs.__d.__f[i]; + out->fcsr = mcontext.__fpregs.__d.__fcsr; +#else +#error "Unexpected __riscv_xlen" +#endif +} +#endif // __riscv + +void ThreadInfo::GetGeneralPurposeRegisters(void** gp_regs, size_t* size) { + assert(gp_regs || size); +#if defined(__mips__) + if (gp_regs) + *gp_regs = mcontext.gregs; + if (size) + *size = sizeof(mcontext.gregs); +#elif defined(__riscv) + if (gp_regs) + *gp_regs = mcontext.__gregs; + if (size) + *size = sizeof(mcontext.__gregs); +#else + if (gp_regs) + *gp_regs = ®s; + if (size) + *size = sizeof(regs); +#endif +} + +void ThreadInfo::GetFloatingPointRegisters(void** fp_regs, size_t* size) { + assert(fp_regs || size); +#if defined(__mips__) + if (fp_regs) + *fp_regs = &mcontext.fpregs; + if (size) + *size = sizeof(mcontext.fpregs); +#elif defined(__riscv) +# if __riscv_flen == 32 + if (fp_regs) + *fp_regs = &mcontext.__fpregs.__f.__f; + if (size) + *size = sizeof(mcontext.__fpregs.__f.__f); +# elif __riscv_flen == 64 + if (fp_regs) + *fp_regs = &mcontext.__fpregs.__d.__f; + if (size) + *size = sizeof(mcontext.__fpregs.__d.__f); +# elif __riscv_flen == 128 + if (fp_regs) + *fp_regs = &mcontext.__fpregs.__q.__f; + if (size) + *size = sizeof(mcontext.__fpregs.__q.__f); +# else +# error "Unexpected __riscv_flen" +# endif +#else + if (fp_regs) + *fp_regs = &fpregs; + if (size) + *size = sizeof(fpregs); +#endif +} + +} // namespace google_breakpad diff --git a/src/client/linux/dump_writer_common/thread_info.h b/src/client/linux/dump_writer_common/thread_info.h new file mode 100644 index 0000000..af786bc --- /dev/null +++ b/src/client/linux/dump_writer_common/thread_info.h @@ -0,0 +1,90 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_THREAD_INFO_H_ +#define CLIENT_LINUX_DUMP_WRITER_COMMON_THREAD_INFO_H_ + +#include +#include + +#include "client/linux/dump_writer_common/raw_context_cpu.h" +#include "common/memory_allocator.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +#if defined(__i386) || defined(__x86_64) +typedef __typeof__(((struct user*) 0)->u_debugreg[0]) debugreg_t; +#endif + +// We produce one of these structures for each thread in the crashed process. +struct ThreadInfo { + pid_t tgid; // thread group id + pid_t ppid; // parent process + + uintptr_t stack_pointer; // thread stack pointer + + +#if defined(__i386) || defined(__x86_64) + user_regs_struct regs; + user_fpregs_struct fpregs; + static const unsigned kNumDebugRegisters = 8; + debugreg_t dregs[8]; +#if defined(__i386) + user_fpxregs_struct fpxregs; +#endif // defined(__i386) + +#elif defined(__ARM_EABI__) + // Mimicking how strace does this(see syscall.c, search for GETREGS) + struct user_regs regs; + struct user_fpregs fpregs; +#elif defined(__aarch64__) + // Use the structures defined in + struct user_regs_struct regs; + struct user_fpsimd_struct fpregs; +#elif defined(__mips__) || defined(__riscv) + // Use the structure defined in . + mcontext_t mcontext; +#endif + + // Returns the instruction pointer (platform-dependent impl.). + uintptr_t GetInstructionPointer() const; + + // Fills a RawContextCPU using the context in the ThreadInfo object. + void FillCPUContext(RawContextCPU* out) const; + + // Returns the pointer and size of general purpose register area. + void GetGeneralPurposeRegisters(void** gp_regs, size_t* size); + + // Returns the pointer and size of float point register area. + void GetFloatingPointRegisters(void** fp_regs, size_t* size); +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_THREAD_INFO_H_ diff --git a/src/client/linux/dump_writer_common/ucontext_reader.cc b/src/client/linux/dump_writer_common/ucontext_reader.cc new file mode 100644 index 0000000..7649768 --- /dev/null +++ b/src/client/linux/dump_writer_common/ucontext_reader.cc @@ -0,0 +1,329 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/linux/dump_writer_common/ucontext_reader.h" + +#include "common/linux/linux_libc_support.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Minidump defines register structures which are different from the raw +// structures which we get from the kernel. These are platform specific +// functions to juggle the ucontext_t and user structures into minidump format. + +#if defined(__i386__) + +uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) { + return uc->uc_mcontext.gregs[REG_ESP]; +} + +uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) { + return uc->uc_mcontext.gregs[REG_EIP]; +} + +void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc, + const fpstate_t* fp) { + const greg_t* regs = uc->uc_mcontext.gregs; + + out->context_flags = MD_CONTEXT_X86_FULL | + MD_CONTEXT_X86_FLOATING_POINT; + + out->gs = regs[REG_GS]; + out->fs = regs[REG_FS]; + out->es = regs[REG_ES]; + out->ds = regs[REG_DS]; + + out->edi = regs[REG_EDI]; + out->esi = regs[REG_ESI]; + out->ebx = regs[REG_EBX]; + out->edx = regs[REG_EDX]; + out->ecx = regs[REG_ECX]; + out->eax = regs[REG_EAX]; + + out->ebp = regs[REG_EBP]; + out->eip = regs[REG_EIP]; + out->cs = regs[REG_CS]; + out->eflags = regs[REG_EFL]; + out->esp = regs[REG_UESP]; + out->ss = regs[REG_SS]; + + out->float_save.control_word = fp->cw; + out->float_save.status_word = fp->sw; + out->float_save.tag_word = fp->tag; + out->float_save.error_offset = fp->ipoff; + out->float_save.error_selector = fp->cssel; + out->float_save.data_offset = fp->dataoff; + out->float_save.data_selector = fp->datasel; + + // 8 registers * 10 bytes per register. + my_memcpy(out->float_save.register_area, fp->_st, 10 * 8); +} + +#elif defined(__x86_64) + +uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) { + return uc->uc_mcontext.gregs[REG_RSP]; +} + +uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) { + return uc->uc_mcontext.gregs[REG_RIP]; +} + +void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc, + const fpstate_t* fpregs) { + const greg_t* regs = uc->uc_mcontext.gregs; + + out->context_flags = MD_CONTEXT_AMD64_FULL; + + out->cs = regs[REG_CSGSFS] & 0xffff; + + out->fs = (regs[REG_CSGSFS] >> 32) & 0xffff; + out->gs = (regs[REG_CSGSFS] >> 16) & 0xffff; + + out->eflags = regs[REG_EFL]; + + out->rax = regs[REG_RAX]; + out->rcx = regs[REG_RCX]; + out->rdx = regs[REG_RDX]; + out->rbx = regs[REG_RBX]; + + out->rsp = regs[REG_RSP]; + out->rbp = regs[REG_RBP]; + out->rsi = regs[REG_RSI]; + out->rdi = regs[REG_RDI]; + out->r8 = regs[REG_R8]; + out->r9 = regs[REG_R9]; + out->r10 = regs[REG_R10]; + out->r11 = regs[REG_R11]; + out->r12 = regs[REG_R12]; + out->r13 = regs[REG_R13]; + out->r14 = regs[REG_R14]; + out->r15 = regs[REG_R15]; + + out->rip = regs[REG_RIP]; + + out->flt_save.control_word = fpregs->cwd; + out->flt_save.status_word = fpregs->swd; + out->flt_save.tag_word = fpregs->ftw; + out->flt_save.error_opcode = fpregs->fop; + out->flt_save.error_offset = fpregs->rip; + out->flt_save.data_offset = fpregs->rdp; + out->flt_save.error_selector = 0; // We don't have this. + out->flt_save.data_selector = 0; // We don't have this. + out->flt_save.mx_csr = fpregs->mxcsr; + out->flt_save.mx_csr_mask = fpregs->mxcr_mask; + my_memcpy(&out->flt_save.float_registers, &fpregs->_st, 8 * 16); + my_memcpy(&out->flt_save.xmm_registers, &fpregs->_xmm, 16 * 16); +} + +#elif defined(__ARM_EABI__) + +uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) { + return uc->uc_mcontext.arm_sp; +} + +uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) { + return uc->uc_mcontext.arm_pc; +} + +void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc) { + out->context_flags = MD_CONTEXT_ARM_FULL; + + out->iregs[0] = uc->uc_mcontext.arm_r0; + out->iregs[1] = uc->uc_mcontext.arm_r1; + out->iregs[2] = uc->uc_mcontext.arm_r2; + out->iregs[3] = uc->uc_mcontext.arm_r3; + out->iregs[4] = uc->uc_mcontext.arm_r4; + out->iregs[5] = uc->uc_mcontext.arm_r5; + out->iregs[6] = uc->uc_mcontext.arm_r6; + out->iregs[7] = uc->uc_mcontext.arm_r7; + out->iregs[8] = uc->uc_mcontext.arm_r8; + out->iregs[9] = uc->uc_mcontext.arm_r9; + out->iregs[10] = uc->uc_mcontext.arm_r10; + + out->iregs[11] = uc->uc_mcontext.arm_fp; + out->iregs[12] = uc->uc_mcontext.arm_ip; + out->iregs[13] = uc->uc_mcontext.arm_sp; + out->iregs[14] = uc->uc_mcontext.arm_lr; + out->iregs[15] = uc->uc_mcontext.arm_pc; + + out->cpsr = uc->uc_mcontext.arm_cpsr; + + // TODO: fix this after fixing ExceptionHandler + out->float_save.fpscr = 0; + my_memset(&out->float_save.regs, 0, sizeof(out->float_save.regs)); + my_memset(&out->float_save.extra, 0, sizeof(out->float_save.extra)); +} + +#elif defined(__aarch64__) + +uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) { + return uc->uc_mcontext.sp; +} + +uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) { + return uc->uc_mcontext.pc; +} + +void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc, + const struct fpsimd_context* fpregs) { + out->context_flags = MD_CONTEXT_ARM64_FULL_OLD; + + out->cpsr = static_cast(uc->uc_mcontext.pstate); + for (int i = 0; i < MD_CONTEXT_ARM64_REG_SP; ++i) + out->iregs[i] = uc->uc_mcontext.regs[i]; + out->iregs[MD_CONTEXT_ARM64_REG_SP] = uc->uc_mcontext.sp; + out->iregs[MD_CONTEXT_ARM64_REG_PC] = uc->uc_mcontext.pc; + + out->float_save.fpsr = fpregs->fpsr; + out->float_save.fpcr = fpregs->fpcr; + my_memcpy(&out->float_save.regs, &fpregs->vregs, + MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT * 16); +} + +#elif defined(__mips__) + +uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) { + return uc->uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]; +} + +uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) { + return uc->uc_mcontext.pc; +} + +void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc) { +#if _MIPS_SIM == _ABI64 + out->context_flags = MD_CONTEXT_MIPS64_FULL; +#elif _MIPS_SIM == _ABIO32 + out->context_flags = MD_CONTEXT_MIPS_FULL; +#else +#error "This mips ABI is currently not supported (n32)" +#endif + + for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i) + out->iregs[i] = uc->uc_mcontext.gregs[i]; + + out->mdhi = uc->uc_mcontext.mdhi; + out->mdlo = uc->uc_mcontext.mdlo; + + out->hi[0] = uc->uc_mcontext.hi1; + out->hi[1] = uc->uc_mcontext.hi2; + out->hi[2] = uc->uc_mcontext.hi3; + out->lo[0] = uc->uc_mcontext.lo1; + out->lo[1] = uc->uc_mcontext.lo2; + out->lo[2] = uc->uc_mcontext.lo3; + out->dsp_control = uc->uc_mcontext.dsp; + + out->epc = uc->uc_mcontext.pc; + out->badvaddr = 0; // Not reported in signal context. + out->status = 0; // Not reported in signal context. + out->cause = 0; // Not reported in signal context. + + for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i) + out->float_save.regs[i] = uc->uc_mcontext.fpregs.fp_r.fp_dregs[i]; + + out->float_save.fpcsr = uc->uc_mcontext.fpc_csr; +#if _MIPS_SIM == _ABIO32 + out->float_save.fir = uc->uc_mcontext.fpc_eir; // Unused. +#endif +} + +#elif defined(__riscv) + +uintptr_t UContextReader::GetStackPointer(const ucontext_t* uc) { + return uc->uc_mcontext.__gregs[MD_CONTEXT_RISCV_REG_SP]; +} + +uintptr_t UContextReader::GetInstructionPointer(const ucontext_t* uc) { + return uc->uc_mcontext.__gregs[MD_CONTEXT_RISCV_REG_PC]; +} + +void UContextReader::FillCPUContext(RawContextCPU* out, const ucontext_t* uc) { +# if __riscv__xlen == 32 + out->context_flags = MD_CONTEXT_RISCV_FULL; +# elif __riscv_xlen == 64 + out->context_flags = MD_CONTEXT_RISCV64_FULL; +# else +# error "Unexpected __riscv_xlen" +# endif + + out->pc = uc->uc_mcontext.__gregs[0]; + out->ra = uc->uc_mcontext.__gregs[1]; + out->sp = uc->uc_mcontext.__gregs[2]; + out->gp = uc->uc_mcontext.__gregs[3]; + out->tp = uc->uc_mcontext.__gregs[4]; + out->t0 = uc->uc_mcontext.__gregs[5]; + out->t1 = uc->uc_mcontext.__gregs[6]; + out->t2 = uc->uc_mcontext.__gregs[7]; + out->s0 = uc->uc_mcontext.__gregs[8]; + out->s1 = uc->uc_mcontext.__gregs[9]; + out->a0 = uc->uc_mcontext.__gregs[10]; + out->a1 = uc->uc_mcontext.__gregs[11]; + out->a2 = uc->uc_mcontext.__gregs[12]; + out->a3 = uc->uc_mcontext.__gregs[13]; + out->a4 = uc->uc_mcontext.__gregs[14]; + out->a5 = uc->uc_mcontext.__gregs[15]; + out->a6 = uc->uc_mcontext.__gregs[16]; + out->a7 = uc->uc_mcontext.__gregs[17]; + out->s2 = uc->uc_mcontext.__gregs[18]; + out->s3 = uc->uc_mcontext.__gregs[19]; + out->s4 = uc->uc_mcontext.__gregs[20]; + out->s5 = uc->uc_mcontext.__gregs[21]; + out->s6 = uc->uc_mcontext.__gregs[22]; + out->s7 = uc->uc_mcontext.__gregs[23]; + out->s8 = uc->uc_mcontext.__gregs[24]; + out->s9 = uc->uc_mcontext.__gregs[25]; + out->s10 = uc->uc_mcontext.__gregs[26]; + out->s11 = uc->uc_mcontext.__gregs[27]; + out->t3 = uc->uc_mcontext.__gregs[28]; + out->t4 = uc->uc_mcontext.__gregs[29]; + out->t5 = uc->uc_mcontext.__gregs[30]; + out->t6 = uc->uc_mcontext.__gregs[31]; + + // Breakpad only supports RISCV32 with 32 bit floating point. + // Breakpad only supports RISCV64 with 64 bit floating point. +#if __riscv_xlen == 32 + for (int i = 0; i < MD_CONTEXT_RISCV_FPR_COUNT; i++) + out->fpregs[i] = uc->uc_mcontext.__fpregs.__f.__f[i]; + out->fcsr = uc->uc_mcontext.__fpregs.__f.__fcsr; +#elif __riscv_xlen == 64 + for (int i = 0; i < MD_CONTEXT_RISCV_FPR_COUNT; i++) + out->fpregs[i] = uc->uc_mcontext.__fpregs.__d.__f[i]; + out->fcsr = uc->uc_mcontext.__fpregs.__d.__fcsr; +#else +#error "Unexpected __riscv_xlen" +#endif +} +#endif + +} // namespace google_breakpad diff --git a/src/client/linux/dump_writer_common/ucontext_reader.h b/src/client/linux/dump_writer_common/ucontext_reader.h new file mode 100644 index 0000000..60cbf90 --- /dev/null +++ b/src/client/linux/dump_writer_common/ucontext_reader.h @@ -0,0 +1,64 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_UCONTEXT_READER_H +#define CLIENT_LINUX_DUMP_WRITER_COMMON_UCONTEXT_READER_H + +#include +#include + +#include "client/linux/dump_writer_common/raw_context_cpu.h" +#include "client/linux/minidump_writer/minidump_writer.h" +#include "common/memory_allocator.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Wraps platform-dependent implementations of accessors to ucontext_t structs. +struct UContextReader { + static uintptr_t GetStackPointer(const ucontext_t* uc); + + static uintptr_t GetInstructionPointer(const ucontext_t* uc); + + // Juggle a arch-specific ucontext_t into a minidump format + // out: the minidump structure + // info: the collection of register structures. +#if defined(__i386__) || defined(__x86_64) + static void FillCPUContext(RawContextCPU* out, const ucontext_t* uc, + const fpstate_t* fp); +#elif defined(__aarch64__) + static void FillCPUContext(RawContextCPU* out, const ucontext_t* uc, + const struct fpsimd_context* fpregs); +#else + static void FillCPUContext(RawContextCPU* out, const ucontext_t* uc); +#endif +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_UCONTEXT_READER_H diff --git a/src/client/linux/handler/exception_handler.cc b/src/client/linux/handler/exception_handler.cc new file mode 100644 index 0000000..9e23c11 --- /dev/null +++ b/src/client/linux/handler/exception_handler.cc @@ -0,0 +1,799 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// The ExceptionHandler object installs signal handlers for a number of +// signals. We rely on the signal handler running on the thread which crashed +// in order to identify it. This is true of the synchronous signals (SEGV etc), +// but not true of ABRT. Thus, if you send ABRT to yourself in a program which +// uses ExceptionHandler, you need to use tgkill to direct it to the current +// thread. +// +// The signal flow looks like this: +// +// SignalHandler (uses a global stack of ExceptionHandler objects to find +// | one to handle the signal. If the first rejects it, try +// | the second etc...) +// V +// HandleSignal ----------------------------| (clones a new process which +// | | shares an address space with +// (wait for cloned | the crashed process. This +// process) | allows us to ptrace the crashed +// | | process) +// V V +// (set signal handler to ThreadEntry (static function to bounce +// SIG_DFL and rethrow, | back into the object) +// killing the crashed | +// process) V +// DoDump (writes minidump) +// | +// V +// sys_exit +// + +// This code is a little fragmented. Different functions of the ExceptionHandler +// class run in a number of different contexts. Some of them run in a normal +// context and are easy to code, others run in a compromised context and the +// restrictions at the top of minidump_writer.cc apply: no libc and use the +// alternative malloc. Each function should have comment above it detailing the +// context which it runs in. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/linux/handler/exception_handler.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include "common/basictypes.h" +#include "common/linux/breakpad_getcontext.h" +#include "common/linux/linux_libc_support.h" +#include "common/memory_allocator.h" +#include "client/linux/log/log.h" +#include "client/linux/microdump_writer/microdump_writer.h" +#include "client/linux/minidump_writer/linux_dumper.h" +#include "client/linux/minidump_writer/minidump_writer.h" +#include "common/linux/eintr_wrapper.h" +#include "third_party/lss/linux_syscall_support.h" + +#if defined(__ANDROID__) +#include "linux/sched.h" +#endif + +#ifndef PR_SET_PTRACER +#define PR_SET_PTRACER 0x59616d61 +#endif + +namespace google_breakpad { + +namespace { +// The list of signals which we consider to be crashes. The default action for +// all these signals must be Core (see man 7 signal) because we rethrow the +// signal after handling it and expect that it'll be fatal. +const int kExceptionSignals[] = { + SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS, SIGTRAP +}; +const int kNumHandledSignals = + sizeof(kExceptionSignals) / sizeof(kExceptionSignals[0]); +struct sigaction old_handlers[kNumHandledSignals]; +bool handlers_installed = false; + +// InstallAlternateStackLocked will store the newly installed stack in new_stack +// and (if it exists) the previously installed stack in old_stack. +stack_t old_stack; +stack_t new_stack; +bool stack_installed = false; + +// Create an alternative stack to run the signal handlers on. This is done since +// the signal might have been caused by a stack overflow. +// Runs before crashing: normal context. +void InstallAlternateStackLocked() { + if (stack_installed) + return; + + memset(&old_stack, 0, sizeof(old_stack)); + memset(&new_stack, 0, sizeof(new_stack)); + + // SIGSTKSZ may be too small to prevent the signal handlers from overrunning + // the alternative stack. Ensure that the size of the alternative stack is + // large enough. + const unsigned kSigStackSize = std::max(16384, SIGSTKSZ); + + // Only set an alternative stack if there isn't already one, or if the current + // one is too small. + if (sys_sigaltstack(NULL, &old_stack) == -1 || !old_stack.ss_sp || + old_stack.ss_size < kSigStackSize) { + new_stack.ss_sp = calloc(1, kSigStackSize); + new_stack.ss_size = kSigStackSize; + + if (sys_sigaltstack(&new_stack, NULL) == -1) { + free(new_stack.ss_sp); + return; + } + stack_installed = true; + } +} + +// Runs before crashing: normal context. +void RestoreAlternateStackLocked() { + if (!stack_installed) + return; + + stack_t current_stack; + if (sys_sigaltstack(NULL, ¤t_stack) == -1) + return; + + // Only restore the old_stack if the current alternative stack is the one + // installed by the call to InstallAlternateStackLocked. + if (current_stack.ss_sp == new_stack.ss_sp) { + if (old_stack.ss_sp) { + if (sys_sigaltstack(&old_stack, NULL) == -1) + return; + } else { + stack_t disable_stack; + disable_stack.ss_flags = SS_DISABLE; + if (sys_sigaltstack(&disable_stack, NULL) == -1) + return; + } + } + + free(new_stack.ss_sp); + stack_installed = false; +} + +void InstallDefaultHandler(int sig) { +#if defined(__ANDROID__) + // Android L+ expose signal and sigaction symbols that override the system + // ones. There is a bug in these functions where a request to set the handler + // to SIG_DFL is ignored. In that case, an infinite loop is entered as the + // signal is repeatedly sent to breakpad's signal handler. + // To work around this, directly call the system's sigaction. + struct kernel_sigaction sa; + memset(&sa, 0, sizeof(sa)); + sys_sigemptyset(&sa.sa_mask); + sa.sa_handler_ = SIG_DFL; + sa.sa_flags = SA_RESTART; + sys_rt_sigaction(sig, &sa, NULL, sizeof(kernel_sigset_t)); +#else + signal(sig, SIG_DFL); +#endif +} + +// The global exception handler stack. This is needed because there may exist +// multiple ExceptionHandler instances in a process. Each will have itself +// registered in this stack. +std::vector* g_handler_stack_ = NULL; +pthread_mutex_t g_handler_stack_mutex_ = PTHREAD_MUTEX_INITIALIZER; + +// sizeof(CrashContext) can be too big w.r.t the size of alternatate stack +// for SignalHandler(). Keep the crash context as a .bss field. Exception +// handlers are serialized by the |g_handler_stack_mutex_| and at most one at a +// time can use |g_crash_context_|. +ExceptionHandler::CrashContext g_crash_context_; + +FirstChanceHandler g_first_chance_handler_ = nullptr; +} // namespace + +// Runs before crashing: normal context. +ExceptionHandler::ExceptionHandler(const MinidumpDescriptor& descriptor, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + bool install_handler, + const int server_fd) + : filter_(filter), + callback_(callback), + callback_context_(callback_context), + minidump_descriptor_(descriptor), + crash_handler_(NULL) { + if (server_fd >= 0) + crash_generation_client_.reset(CrashGenerationClient::TryCreate(server_fd)); + + if (!IsOutOfProcess() && !minidump_descriptor_.IsFD() && + !minidump_descriptor_.IsMicrodumpOnConsole()) + minidump_descriptor_.UpdatePath(); + +#if defined(__ANDROID__) + if (minidump_descriptor_.IsMicrodumpOnConsole()) + logger::initializeCrashLogWriter(); +#endif + + pthread_mutex_lock(&g_handler_stack_mutex_); + + // Pre-fault the crash context struct. This is to avoid failing due to OOM + // if handling an exception when the process ran out of virtual memory. + memset(&g_crash_context_, 0, sizeof(g_crash_context_)); + + if (!g_handler_stack_) + g_handler_stack_ = new std::vector; + if (install_handler) { + InstallAlternateStackLocked(); + InstallHandlersLocked(); + } + g_handler_stack_->push_back(this); + pthread_mutex_unlock(&g_handler_stack_mutex_); +} + +// Runs before crashing: normal context. +ExceptionHandler::~ExceptionHandler() { + pthread_mutex_lock(&g_handler_stack_mutex_); + std::vector::iterator handler = + std::find(g_handler_stack_->begin(), g_handler_stack_->end(), this); + g_handler_stack_->erase(handler); + if (g_handler_stack_->empty()) { + delete g_handler_stack_; + g_handler_stack_ = NULL; + RestoreAlternateStackLocked(); + RestoreHandlersLocked(); + } + pthread_mutex_unlock(&g_handler_stack_mutex_); +} + +// Runs before crashing: normal context. +// static +bool ExceptionHandler::InstallHandlersLocked() { + if (handlers_installed) + return false; + + // Fail if unable to store all the old handlers. + for (int i = 0; i < kNumHandledSignals; ++i) { + if (sigaction(kExceptionSignals[i], NULL, &old_handlers[i]) == -1) + return false; + } + + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + + // Mask all exception signals when we're handling one of them. + for (int i = 0; i < kNumHandledSignals; ++i) + sigaddset(&sa.sa_mask, kExceptionSignals[i]); + + sa.sa_sigaction = SignalHandler; + sa.sa_flags = SA_ONSTACK | SA_SIGINFO; + + for (int i = 0; i < kNumHandledSignals; ++i) { + if (sigaction(kExceptionSignals[i], &sa, NULL) == -1) { + // At this point it is impractical to back out changes, and so failure to + // install a signal is intentionally ignored. + } + } + handlers_installed = true; + return true; +} + +// This function runs in a compromised context: see the top of the file. +// Runs on the crashing thread. +// static +void ExceptionHandler::RestoreHandlersLocked() { + if (!handlers_installed) + return; + + for (int i = 0; i < kNumHandledSignals; ++i) { + if (sigaction(kExceptionSignals[i], &old_handlers[i], NULL) == -1) { + InstallDefaultHandler(kExceptionSignals[i]); + } + } + handlers_installed = false; +} + +// void ExceptionHandler::set_crash_handler(HandlerCallback callback) { +// crash_handler_ = callback; +// } + +// This function runs in a compromised context: see the top of the file. +// Runs on the crashing thread. +// static +void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) { + + // Give the first chance handler a chance to recover from this signal + // + // This is primarily used by V8. V8 uses guard regions to guarantee memory + // safety in WebAssembly. This means some signals might be expected if they + // originate from Wasm code while accessing the guard region. We give V8 the + // chance to handle and recover from these signals first. + if (g_first_chance_handler_ != nullptr && + g_first_chance_handler_(sig, info, uc)) { + return; + } + + // All the exception signals are blocked at this point. + pthread_mutex_lock(&g_handler_stack_mutex_); + + // Sometimes, Breakpad runs inside a process where some other buggy code + // saves and restores signal handlers temporarily with 'signal' + // instead of 'sigaction'. This loses the SA_SIGINFO flag associated + // with this function. As a consequence, the values of 'info' and 'uc' + // become totally bogus, generally inducing a crash. + // + // The following code tries to detect this case. When it does, it + // resets the signal handlers with sigaction + SA_SIGINFO and returns. + // This forces the signal to be thrown again, but this time the kernel + // will call the function with the right arguments. + struct sigaction cur_handler; + if (sigaction(sig, NULL, &cur_handler) == 0 && + cur_handler.sa_sigaction == SignalHandler && + (cur_handler.sa_flags & SA_SIGINFO) == 0) { + // Reset signal handler with the right flags. + sigemptyset(&cur_handler.sa_mask); + sigaddset(&cur_handler.sa_mask, sig); + + cur_handler.sa_sigaction = SignalHandler; + cur_handler.sa_flags = SA_ONSTACK | SA_SIGINFO; + + if (sigaction(sig, &cur_handler, NULL) == -1) { + // When resetting the handler fails, try to reset the + // default one to avoid an infinite loop here. + InstallDefaultHandler(sig); + } + pthread_mutex_unlock(&g_handler_stack_mutex_); + return; + } + + bool handled = false; + for (int i = g_handler_stack_->size() - 1; !handled && i >= 0; --i) { + handled = (*g_handler_stack_)[i]->HandleSignal(sig, info, uc); + } + + // Upon returning from this signal handler, sig will become unmasked and then + // it will be retriggered. If one of the ExceptionHandlers handled it + // successfully, restore the default handler. Otherwise, restore the + // previously installed handler. Then, when the signal is retriggered, it will + // be delivered to the appropriate handler. + if (handled) { + InstallDefaultHandler(sig); + } else { + RestoreHandlersLocked(); + } + + pthread_mutex_unlock(&g_handler_stack_mutex_); + + // info->si_code <= 0 iff SI_FROMUSER (SI_FROMKERNEL otherwise). + if (info->si_code <= 0 || sig == SIGABRT) { + // This signal was triggered by somebody sending us the signal with kill(). + // In order to retrigger it, we have to queue a new signal by calling + // kill() ourselves. The special case (si_pid == 0 && sig == SIGABRT) is + // due to the kernel sending a SIGABRT from a user request via SysRQ. + if (sys_tgkill(getpid(), syscall(__NR_gettid), sig) < 0) { + // If we failed to kill ourselves (e.g. because a sandbox disallows us + // to do so), we instead resort to terminating our process. This will + // result in an incorrect exit code. + _exit(1); + } + } else { + // This was a synchronous signal triggered by a hard fault (e.g. SIGSEGV). + // No need to reissue the signal. It will automatically trigger again, + // when we return from the signal handler. + } +} + +struct ThreadArgument { + pid_t pid; // the crashing process + const MinidumpDescriptor* minidump_descriptor; + ExceptionHandler* handler; + const void* context; // a CrashContext structure + size_t context_size; +}; + +// This is the entry function for the cloned process. We are in a compromised +// context here: see the top of the file. +// static +int ExceptionHandler::ThreadEntry(void* arg) { + const ThreadArgument* thread_arg = reinterpret_cast(arg); + + // Close the write end of the pipe. This allows us to fail if the parent dies + // while waiting for the continue signal. + sys_close(thread_arg->handler->fdes[1]); + + // Block here until the crashing process unblocks us when + // we're allowed to use ptrace + thread_arg->handler->WaitForContinueSignal(); + sys_close(thread_arg->handler->fdes[0]); + + return thread_arg->handler->DoDump(thread_arg->pid, thread_arg->context, + thread_arg->context_size) == false; +} + +// This function runs in a compromised context: see the top of the file. +// Runs on the crashing thread. +bool ExceptionHandler::HandleSignal(int /*sig*/, siginfo_t* info, void* uc) { + if (filter_ && !filter_(callback_context_)) + return false; + + // Allow ourselves to be dumped if the signal is trusted. + bool signal_trusted = info->si_code > 0; + bool signal_pid_trusted = info->si_code == SI_USER || + info->si_code == SI_TKILL; + if (signal_trusted || (signal_pid_trusted && info->si_pid == getpid())) { + sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0); + } + + // Fill in all the holes in the struct to make Valgrind happy. + memset(&g_crash_context_, 0, sizeof(g_crash_context_)); + memcpy(&g_crash_context_.siginfo, info, sizeof(siginfo_t)); + memcpy(&g_crash_context_.context, uc, sizeof(ucontext_t)); +#if defined(__aarch64__) + ucontext_t* uc_ptr = (ucontext_t*)uc; + struct fpsimd_context* fp_ptr = + (struct fpsimd_context*)&uc_ptr->uc_mcontext.__reserved; + if (fp_ptr->head.magic == FPSIMD_MAGIC) { + memcpy(&g_crash_context_.float_state, fp_ptr, + sizeof(g_crash_context_.float_state)); + } +#elif GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE + ucontext_t* uc_ptr = (ucontext_t*)uc; + if (uc_ptr->uc_mcontext.fpregs) { + memcpy(&g_crash_context_.float_state, uc_ptr->uc_mcontext.fpregs, + sizeof(g_crash_context_.float_state)); + } +#endif + g_crash_context_.tid = syscall(__NR_gettid); + if (crash_handler_ != NULL) { + if (crash_handler_(&g_crash_context_, sizeof(g_crash_context_), + callback_context_)) { + return true; + } + } + return GenerateDump(&g_crash_context_); +} + +// This is a public interface to HandleSignal that allows the client to +// generate a crash dump. This function may run in a compromised context. +bool ExceptionHandler::SimulateSignalDelivery(int sig) { + siginfo_t siginfo = {}; + // Mimic a trusted signal to allow tracing the process (see + // ExceptionHandler::HandleSignal(). + siginfo.si_code = SI_USER; + siginfo.si_pid = getpid(); + ucontext_t context; + getcontext(&context); + return HandleSignal(sig, &siginfo, &context); +} + +// This function may run in a compromised context: see the top of the file. +bool ExceptionHandler::GenerateDump(CrashContext* context) { + if (IsOutOfProcess()) + return crash_generation_client_->RequestDump(context, sizeof(*context)); + + // Allocating too much stack isn't a problem, and better to err on the side + // of caution than smash it into random locations. + static const unsigned kChildStackSize = 16000; + PageAllocator allocator; + uint8_t* stack = reinterpret_cast(allocator.Alloc(kChildStackSize)); + if (!stack) + return false; + // clone() needs the top-most address. (scrub just to be safe) + stack += kChildStackSize; + my_memset(stack - 16, 0, 16); + + ThreadArgument thread_arg; + thread_arg.handler = this; + thread_arg.minidump_descriptor = &minidump_descriptor_; + thread_arg.pid = getpid(); + thread_arg.context = context; + thread_arg.context_size = sizeof(*context); + + // We need to explicitly enable ptrace of parent processes on some + // kernels, but we need to know the PID of the cloned process before we + // can do this. Create a pipe here which we can use to block the + // cloned process after creating it, until we have explicitly enabled ptrace + if (sys_pipe(fdes) == -1) { + // Creating the pipe failed. We'll log an error but carry on anyway, + // as we'll probably still get a useful crash report. All that will happen + // is the write() and read() calls will fail with EBADF + static const char no_pipe_msg[] = "ExceptionHandler::GenerateDump " + "sys_pipe failed:"; + logger::write(no_pipe_msg, sizeof(no_pipe_msg) - 1); + logger::write(strerror(errno), strlen(strerror(errno))); + logger::write("\n", 1); + + // Ensure fdes[0] and fdes[1] are invalid file descriptors. + fdes[0] = fdes[1] = -1; + } + + const pid_t child = sys_clone( + ThreadEntry, stack, CLONE_FS | CLONE_UNTRACED, &thread_arg, NULL, NULL, + NULL); + if (child == -1) { + sys_close(fdes[0]); + sys_close(fdes[1]); + return false; + } + + // Close the read end of the pipe. + sys_close(fdes[0]); + // Allow the child to ptrace us + sys_prctl(PR_SET_PTRACER, child, 0, 0, 0); + SendContinueSignalToChild(); + int status = 0; + const int r = HANDLE_EINTR(sys_waitpid(child, &status, __WALL)); + + sys_close(fdes[1]); + + if (r == -1) { + static const char msg[] = "ExceptionHandler::GenerateDump waitpid failed:"; + logger::write(msg, sizeof(msg) - 1); + logger::write(strerror(errno), strlen(strerror(errno))); + logger::write("\n", 1); + } + + bool success = r != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0; + if (callback_) + success = callback_(minidump_descriptor_, callback_context_, success); + return success; +} + +// This function runs in a compromised context: see the top of the file. +void ExceptionHandler::SendContinueSignalToChild() { + static const char okToContinueMessage = 'a'; + int r; + r = HANDLE_EINTR(sys_write(fdes[1], &okToContinueMessage, sizeof(char))); + if (r == -1) { + static const char msg[] = "ExceptionHandler::SendContinueSignalToChild " + "sys_write failed:"; + logger::write(msg, sizeof(msg) - 1); + logger::write(strerror(errno), strlen(strerror(errno))); + logger::write("\n", 1); + } +} + +// This function runs in a compromised context: see the top of the file. +// Runs on the cloned process. +void ExceptionHandler::WaitForContinueSignal() { + int r; + char receivedMessage; + r = HANDLE_EINTR(sys_read(fdes[0], &receivedMessage, sizeof(char))); + if (r == -1) { + static const char msg[] = "ExceptionHandler::WaitForContinueSignal " + "sys_read failed:"; + logger::write(msg, sizeof(msg) - 1); + logger::write(strerror(errno), strlen(strerror(errno))); + logger::write("\n", 1); + } +} + +// This function runs in a compromised context: see the top of the file. +// Runs on the cloned process. +bool ExceptionHandler::DoDump(pid_t crashing_process, const void* context, + size_t context_size) { + const bool may_skip_dump = + minidump_descriptor_.skip_dump_if_principal_mapping_not_referenced(); + const uintptr_t principal_mapping_address = + minidump_descriptor_.address_within_principal_mapping(); + const bool sanitize_stacks = minidump_descriptor_.sanitize_stacks(); + if (minidump_descriptor_.IsMicrodumpOnConsole()) { + return google_breakpad::WriteMicrodump( + crashing_process, + context, + context_size, + mapping_list_, + may_skip_dump, + principal_mapping_address, + sanitize_stacks, + *minidump_descriptor_.microdump_extra_info()); + } + if (minidump_descriptor_.IsFD()) { + return google_breakpad::WriteMinidump(minidump_descriptor_.fd(), + minidump_descriptor_.size_limit(), + crashing_process, + context, + context_size, + mapping_list_, + app_memory_list_, + may_skip_dump, + principal_mapping_address, + sanitize_stacks); + } + return google_breakpad::WriteMinidump(minidump_descriptor_.path(), + minidump_descriptor_.size_limit(), + crashing_process, + context, + context_size, + mapping_list_, + app_memory_list_, + may_skip_dump, + principal_mapping_address, + sanitize_stacks); +} + +// static +bool ExceptionHandler::WriteMinidump(const string& dump_path, + MinidumpCallback callback, + void* callback_context) { + MinidumpDescriptor descriptor(dump_path); + ExceptionHandler eh(descriptor, NULL, callback, callback_context, false, -1); + return eh.WriteMinidump(); +} + +// In order to making using EBP to calculate the desired value for ESP +// a valid operation, ensure that this function is compiled with a +// frame pointer using the following attribute. This attribute +// is supported on GCC but not on clang. +#if defined(__i386__) && defined(__GNUC__) && !defined(__clang__) +__attribute__((optimize("no-omit-frame-pointer"))) +#endif +bool ExceptionHandler::WriteMinidump() { + if (!IsOutOfProcess() && !minidump_descriptor_.IsFD() && + !minidump_descriptor_.IsMicrodumpOnConsole()) { + // Update the path of the minidump so that this can be called multiple times + // and new files are created for each minidump. This is done before the + // generation happens, as clients may want to access the MinidumpDescriptor + // after this call to find the exact path to the minidump file. + minidump_descriptor_.UpdatePath(); + } else if (minidump_descriptor_.IsFD()) { + // Reposition the FD to its beginning and resize it to get rid of the + // previous minidump info. + lseek(minidump_descriptor_.fd(), 0, SEEK_SET); + ignore_result(ftruncate(minidump_descriptor_.fd(), 0)); + } + + // Allow this process to be dumped. + sys_prctl(PR_SET_DUMPABLE, 1, 0, 0, 0); + + CrashContext context; + int getcontext_result = getcontext(&context.context); + if (getcontext_result) + return false; + +#if defined(__i386__) + // In CPUFillFromUContext in minidumpwriter.cc the stack pointer is retrieved + // from REG_UESP instead of from REG_ESP. REG_UESP is the user stack pointer + // and it only makes sense when running in kernel mode with a different stack + // pointer. When WriteMiniDump is called during normal processing REG_UESP is + // zero which leads to bad minidump files. + if (!context.context.uc_mcontext.gregs[REG_UESP]) { + // If REG_UESP is set to REG_ESP then that includes the stack space for the + // CrashContext object in this function, which is about 128 KB. Since the + // Linux dumper only records 32 KB of stack this would mean that nothing + // useful would be recorded. A better option is to set REG_UESP to REG_EBP, + // perhaps with a small negative offset in case there is any code that + // objects to them being equal. + context.context.uc_mcontext.gregs[REG_UESP] = + context.context.uc_mcontext.gregs[REG_EBP] - 16; + // The stack saving is based off of REG_ESP so it must be set to match the + // new REG_UESP. + context.context.uc_mcontext.gregs[REG_ESP] = + context.context.uc_mcontext.gregs[REG_UESP]; + } +#endif + +#if GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE && !defined(__aarch64__) + memcpy(&context.float_state, context.context.uc_mcontext.fpregs, + sizeof(context.float_state)); +#endif + context.tid = sys_gettid(); + + // Add an exception stream to the minidump for better reporting. + memset(&context.siginfo, 0, sizeof(context.siginfo)); + context.siginfo.si_signo = MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED; +#if defined(__i386__) + context.siginfo.si_addr = + reinterpret_cast(context.context.uc_mcontext.gregs[REG_EIP]); +#elif defined(__x86_64__) + context.siginfo.si_addr = + reinterpret_cast(context.context.uc_mcontext.gregs[REG_RIP]); +#elif defined(__arm__) + context.siginfo.si_addr = + reinterpret_cast(context.context.uc_mcontext.arm_pc); +#elif defined(__aarch64__) + context.siginfo.si_addr = + reinterpret_cast(context.context.uc_mcontext.pc); +#elif defined(__mips__) + context.siginfo.si_addr = + reinterpret_cast(context.context.uc_mcontext.pc); +#elif defined(__riscv) + context.siginfo.si_addr = + reinterpret_cast(context.context.uc_mcontext.__gregs[REG_PC]); +#else +# error "This code has not been ported to your platform yet." +#endif + + return GenerateDump(&context); +} + +void ExceptionHandler::AddMappingInfo(const string& name, + const uint8_t identifier[sizeof(MDGUID)], + uintptr_t start_address, + size_t mapping_size, + size_t file_offset) { + MappingInfo info; + info.start_addr = start_address; + info.size = mapping_size; + info.offset = file_offset; + strncpy(info.name, name.c_str(), sizeof(info.name) - 1); + info.name[sizeof(info.name) - 1] = '\0'; + + MappingEntry mapping; + mapping.first = info; + memcpy(mapping.second, identifier, sizeof(MDGUID)); + mapping_list_.push_back(mapping); +} + +void ExceptionHandler::RegisterAppMemory(void* ptr, size_t length) { + AppMemoryList::iterator iter = + std::find(app_memory_list_.begin(), app_memory_list_.end(), ptr); + if (iter != app_memory_list_.end()) { + // Don't allow registering the same pointer twice. + return; + } + + AppMemory app_memory; + app_memory.ptr = ptr; + app_memory.length = length; + app_memory_list_.push_back(app_memory); +} + +void ExceptionHandler::UnregisterAppMemory(void* ptr) { + AppMemoryList::iterator iter = + std::find(app_memory_list_.begin(), app_memory_list_.end(), ptr); + if (iter != app_memory_list_.end()) { + app_memory_list_.erase(iter); + } +} + +// static +bool ExceptionHandler::WriteMinidumpForChild(pid_t child, + pid_t child_blamed_thread, + const string& dump_path, + MinidumpCallback callback, + void* callback_context) { + // This function is not run in a compromised context. + MinidumpDescriptor descriptor(dump_path); + descriptor.UpdatePath(); + if (!google_breakpad::WriteMinidump(descriptor.path(), + child, + child_blamed_thread)) + return false; + + return callback ? callback(descriptor, callback_context, true) : true; +} + +void SetFirstChanceExceptionHandler(FirstChanceHandler callback) { + g_first_chance_handler_ = callback; +} + +} // namespace google_breakpad diff --git a/src/client/linux/handler/exception_handler.h b/src/client/linux/handler/exception_handler.h new file mode 100644 index 0000000..f8bc1ea --- /dev/null +++ b/src/client/linux/handler/exception_handler.h @@ -0,0 +1,286 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_ +#define CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_ + +#include +#include +#include +#include + +#include + +#include "client/linux/crash_generation/crash_generation_client.h" +#include "client/linux/handler/minidump_descriptor.h" +#include "client/linux/minidump_writer/minidump_writer.h" +#include "common/scoped_ptr.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" + +#if !defined(__ARM_EABI__) && !defined(__mips__) && !defined(__riscv) +// FP state is not part of user ABI for Linux ARM. +// In case of MIPS and RISCV Linux FP state is already part of ucontext_t +// so 'float_state' is not required. +# define GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE 1 +#else +# define GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE 0 +#endif + +namespace google_breakpad { + +// ExceptionHandler +// +// ExceptionHandler can write a minidump file when an exception occurs, +// or when WriteMinidump() is called explicitly by your program. +// +// To have the exception handler write minidumps when an uncaught exception +// (crash) occurs, you should create an instance early in the execution +// of your program, and keep it around for the entire time you want to +// have crash handling active (typically, until shutdown). +// (NOTE): There should be only be one this kind of exception handler +// object per process. +// +// If you want to write minidumps without installing the exception handler, +// you can create an ExceptionHandler with install_handler set to false, +// then call WriteMinidump. You can also use this technique if you want to +// use different minidump callbacks for different call sites. +// +// In either case, a callback function is called when a minidump is written, +// which receives the full path or file descriptor of the minidump. The +// caller can collect and write additional application state to that minidump, +// and launch an external crash-reporting application. +// +// Caller should try to make the callbacks as crash-friendly as possible, +// it should avoid use heap memory allocation as much as possible. + +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. |context| is the parameter supplied by the user as + // callback_context when the handler was created. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, + // Breakpad will immediately report the exception as unhandled without + // writing a minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void* context); + + // A callback function to run after the minidump has been written. + // |descriptor| contains the file descriptor or file path containing the + // minidump. |context| is the parameter supplied by the user as + // callback_context when the handler was created. |succeeded| indicates + // whether a minidump file was successfully written. + // + // If an exception occurred and the callback returns true, Breakpad will + // treat the exception as fully-handled, suppressing any other handlers from + // being notified of the exception. If the callback returns false, Breakpad + // will treat the exception as unhandled, and allow another handler to handle + // it. If there are no other handlers, Breakpad will report the exception to + // the system as unhandled, allowing a debugger or native crash dialog the + // opportunity to handle the exception. Most callback implementations + // should normally return the value of |succeeded|, or when they wish to + // not report an exception of handled, false. Callbacks will rarely want to + // return true directly (unless |succeeded| is true). + typedef bool (*MinidumpCallback)(const MinidumpDescriptor& descriptor, + void* context, + bool succeeded); + + // In certain cases, a user may wish to handle the generation of the minidump + // themselves. In this case, they can install a handler callback which is + // called when a crash has occurred. If this function returns true, no other + // processing of occurs and the process will shortly be crashed. If this + // returns false, the normal processing continues. + typedef bool (*HandlerCallback)(const void* crash_context, + size_t crash_context_size, + void* context); + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Before writing a minidump, the optional |filter| callback will be called. + // Its return value determines whether or not Breakpad should write a + // minidump. The minidump content will be written to the file path or file + // descriptor from |descriptor|, and the optional |callback| is called after + // writing the dump file, as described above. + // If install_handler is true, then a minidump will be written whenever + // an unhandled exception occurs. If it is false, minidumps will only + // be written when WriteMinidump is called. + // If |server_fd| is valid, the minidump is generated out-of-process. If it + // is -1, in-process generation will always be used. + ExceptionHandler(const MinidumpDescriptor& descriptor, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + bool install_handler, + const int server_fd); + ~ExceptionHandler(); + + const MinidumpDescriptor& minidump_descriptor() const { + return minidump_descriptor_; + } + + void set_minidump_descriptor(const MinidumpDescriptor& descriptor) { + minidump_descriptor_ = descriptor; + } + + void set_crash_handler(HandlerCallback callback) { + crash_handler_ = callback; + } + + void set_crash_generation_client(CrashGenerationClient* client) { + crash_generation_client_.reset(client); + } + + // Writes a minidump immediately. This can be used to capture the execution + // state independently of a crash. + // Returns true on success. + // If the ExceptionHandler has been created with a path, a new file is + // generated for each minidump. The file path can be retrieved in the + // MinidumpDescriptor passed to the MinidumpCallback or by accessing the + // MinidumpDescriptor directly from the ExceptionHandler (with + // minidump_descriptor()). + // If the ExceptionHandler has been created with a file descriptor, the file + // descriptor is repositioned to its beginning and the previous generated + // minidump is overwritten. + // Note that this method is not supposed to be called from a compromised + // context as it uses the heap. + bool WriteMinidump(); + + // Convenience form of WriteMinidump which does not require an + // ExceptionHandler instance. + static bool WriteMinidump(const string& dump_path, + MinidumpCallback callback, + void* callback_context); + + // Write a minidump of |child| immediately. This can be used to + // capture the execution state of |child| independently of a crash. + // Pass a meaningful |child_blamed_thread| to make that thread in + // the child process the one from which a crash signature is + // extracted. + // + // WARNING: the return of this function *must* happen before + // the code that will eventually reap |child| executes. + // Otherwise there's a pernicious race condition in which |child| + // exits, is reaped, another process created with its pid, then that + // new process dumped. + static bool WriteMinidumpForChild(pid_t child, + pid_t child_blamed_thread, + const string& dump_path, + MinidumpCallback callback, + void* callback_context); + + // This structure is passed to minidump_writer.h:WriteMinidump via an opaque + // blob. It shouldn't be needed in any user code. + struct CrashContext { + siginfo_t siginfo; + pid_t tid; // the crashing thread. + ucontext_t context; +#if GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE + fpstate_t float_state; +#endif + }; + + // Returns whether out-of-process dump generation is used or not. + bool IsOutOfProcess() const { + return crash_generation_client_.get() != NULL; + } + + // Add information about a memory mapping. This can be used if + // a custom library loader is used that maps things in a way + // that the linux dumper can't handle by reading the maps file. + void AddMappingInfo(const string& name, + const uint8_t identifier[sizeof(MDGUID)], + uintptr_t start_address, + size_t mapping_size, + size_t file_offset); + + // Register a block of memory of length bytes starting at address ptr + // to be copied to the minidump when a crash happens. + void RegisterAppMemory(void* ptr, size_t length); + + // Unregister a block of memory that was registered with RegisterAppMemory. + void UnregisterAppMemory(void* ptr); + + // Force signal handling for the specified signal. + bool SimulateSignalDelivery(int sig); + + // Report a crash signal from an SA_SIGINFO signal handler. + bool HandleSignal(int sig, siginfo_t* info, void* uc); + + private: + // Save the old signal handlers and install new ones. + static bool InstallHandlersLocked(); + // Restore the old signal handlers. + static void RestoreHandlersLocked(); + + void PreresolveSymbols(); + bool GenerateDump(CrashContext* context); + void SendContinueSignalToChild(); + void WaitForContinueSignal(); + + static void SignalHandler(int sig, siginfo_t* info, void* uc); + static int ThreadEntry(void* arg); + bool DoDump(pid_t crashing_process, const void* context, + size_t context_size); + + const FilterCallback filter_; + const MinidumpCallback callback_; + void* const callback_context_; + + scoped_ptr crash_generation_client_; + + MinidumpDescriptor minidump_descriptor_; + + // Must be volatile. The compiler is unaware of the code which runs in + // the signal handler which reads this variable. Without volatile the + // compiler is free to optimise away writes to this variable which it + // believes are never read. + volatile HandlerCallback crash_handler_; + + // We need to explicitly enable ptrace of parent processes on some + // kernels, but we need to know the PID of the cloned process before we + // can do this. We create a pipe which we can use to block the + // cloned process after creating it, until we have explicitly enabled + // ptrace. This is used to store the file descriptors for the pipe + int fdes[2] = {-1, -1}; + + // Callers can add extra info about mappings for cases where the + // dumper code cannot extract enough information from /proc//maps. + MappingList mapping_list_; + + // Callers can request additional memory regions to be included in + // the dump. + AppMemoryList app_memory_list_; +}; + +typedef bool (*FirstChanceHandler)(int, siginfo_t*, void*); +void SetFirstChanceExceptionHandler(FirstChanceHandler callback); + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_ diff --git a/src/client/linux/handler/exception_handler_unittest.cc b/src/client/linux/handler/exception_handler_unittest.cc new file mode 100644 index 0000000..b2d8d46 --- /dev/null +++ b/src/client/linux/handler/exception_handler_unittest.cc @@ -0,0 +1,1304 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(__mips__) +#include +#endif + +#include + +#include "breakpad_googletest_includes.h" +#include "client/linux/handler/exception_handler.h" +#include "client/linux/minidump_writer/minidump_writer.h" +#include "common/linux/eintr_wrapper.h" +#include "common/linux/ignore_ret.h" +#include "common/linux/linux_libc_support.h" +#include "common/tests/auto_tempdir.h" +#include "common/using_std_string.h" +#include "third_party/lss/linux_syscall_support.h" +#include "google_breakpad/processor/minidump.h" + +using namespace google_breakpad; + +namespace { + +// Flush the instruction cache for a given memory range. +// Only required on ARM and mips. +void FlushInstructionCache(const char* memory, uint32_t memory_size) { +#if defined(__arm__) + long begin = reinterpret_cast(memory); + long end = begin + static_cast(memory_size); +# if defined(__ANDROID__) + // Provided by Android's + cacheflush(begin, end, 0); +# elif defined(__linux__) + // GLibc/ARM doesn't provide a wrapper for it, do a direct syscall. +# ifndef __ARM_NR_cacheflush +# define __ARM_NR_cacheflush 0xf0002 +# endif + syscall(__ARM_NR_cacheflush, begin, end, 0); +# else +# error "Your operating system is not supported yet" +# endif +#elif defined(__mips__) +# if defined(__ANDROID__) + // Provided by Android's + long begin = reinterpret_cast(memory); + long end = begin + static_cast(memory_size); +#if _MIPS_SIM == _ABIO32 + cacheflush(begin, end, 0); +#else + syscall(__NR_cacheflush, begin, end, ICACHE); +#endif +# elif defined(__linux__) + // See http://www.linux-mips.org/wiki/Cacheflush_Syscall. + cacheflush(const_cast(memory), memory_size, ICACHE); +# else +# error "Your operating system is not supported yet" +# endif +#endif +} + +void sigchld_handler(int signo) { } + +int CreateTMPFile(const string& dir, string* path) { + string file = dir + "/exception-handler-unittest.XXXXXX"; + const char* c_file = file.c_str(); + // Copy that string, mkstemp needs a C string it can modify. + char* c_path = strdup(c_file); + const int fd = mkstemp(c_path); + if (fd >= 0) + *path = c_path; + free(c_path); + return fd; +} + +class ExceptionHandlerTest : public ::testing::Test { + protected: + void SetUp() { + // We need to be able to wait for children, so SIGCHLD cannot be SIG_IGN. + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = sigchld_handler; + ASSERT_NE(sigaction(SIGCHLD, &sa, &old_action), -1); + } + + void TearDown() { + sigaction(SIGCHLD, &old_action, NULL); + } + + struct sigaction old_action; +}; + + +void WaitForProcessToTerminate(pid_t process_id, int expected_status) { + int status; + ASSERT_NE(HANDLE_EINTR(waitpid(process_id, &status, 0)), -1); + ASSERT_TRUE(WIFSIGNALED(status)); + ASSERT_EQ(expected_status, WTERMSIG(status)); +} + +// Reads the minidump path sent over the pipe |fd| and sets it in |path|. +void ReadMinidumpPathFromPipe(int fd, string* path) { + struct pollfd pfd; + memset(&pfd, 0, sizeof(pfd)); + pfd.fd = fd; + pfd.events = POLLIN | POLLERR; + + const int r = HANDLE_EINTR(poll(&pfd, 1, 0)); + ASSERT_EQ(1, r); + ASSERT_TRUE(pfd.revents & POLLIN); + + int32_t len; + ASSERT_EQ(static_cast(sizeof(len)), read(fd, &len, sizeof(len))); + ASSERT_LT(len, 2048); + char* filename = static_cast(malloc(len + 1)); + ASSERT_EQ(len, read(fd, filename, len)); + filename[len] = 0; + close(fd); + *path = filename; + free(filename); +} + +} // namespace + +TEST(ExceptionHandlerTest, SimpleWithPath) { + AutoTempDir temp_dir; + ExceptionHandler handler( + MinidumpDescriptor(temp_dir.path()), NULL, NULL, NULL, true, -1); + EXPECT_EQ(temp_dir.path(), handler.minidump_descriptor().directory()); + string temp_subdir = temp_dir.path() + "/subdir"; + handler.set_minidump_descriptor(MinidumpDescriptor(temp_subdir)); + EXPECT_EQ(temp_subdir, handler.minidump_descriptor().directory()); +} + +TEST(ExceptionHandlerTest, SimpleWithFD) { + AutoTempDir temp_dir; + string path; + const int fd = CreateTMPFile(temp_dir.path(), &path); + ExceptionHandler handler(MinidumpDescriptor(fd), NULL, NULL, NULL, true, -1); + close(fd); +} + +static bool DoneCallback(const MinidumpDescriptor& descriptor, + void* context, + bool succeeded) { + if (!succeeded) + return false; + + if (!descriptor.IsFD()) { + int fd = reinterpret_cast(context); + uint32_t len = 0; + len = my_strlen(descriptor.path()); + IGNORE_RET(HANDLE_EINTR(sys_write(fd, &len, sizeof(len)))); + IGNORE_RET(HANDLE_EINTR(sys_write(fd, descriptor.path(), len))); + } + return true; +} + +#ifndef ADDRESS_SANITIZER + +// This is a replacement for "*reinterpret_cast(NULL) = 0;" +// It is needed because GCC is allowed to assume that the program will +// not execute any undefined behavior (UB) operation. Further, when GCC +// observes that UB statement is reached, it can assume that all statements +// leading to the UB one are never executed either, and can completely +// optimize them out. In the case of ExceptionHandlerTest::ExternalDumper, +// GCC-4.9 optimized out the entire set up of ExceptionHandler, causing +// test failure. +volatile int* p_null; // external linkage, so GCC can't tell that it + // remains NULL. Volatile just for a good measure. +static void DoNullPointerDereference() { + *p_null = 1; +} + +void ChildCrash(bool use_fd) { + AutoTempDir temp_dir; + int fds[2] = {0}; + int minidump_fd = -1; + string minidump_path; + if (use_fd) { + minidump_fd = CreateTMPFile(temp_dir.path(), &minidump_path); + } else { + ASSERT_NE(pipe(fds), -1); + } + + const pid_t child = fork(); + if (child == 0) { + { + google_breakpad::scoped_ptr handler; + if (use_fd) { + handler.reset(new ExceptionHandler(MinidumpDescriptor(minidump_fd), + NULL, NULL, NULL, true, -1)); + } else { + close(fds[0]); // Close the reading end. + void* fd_param = reinterpret_cast(fds[1]); + handler.reset(new ExceptionHandler(MinidumpDescriptor(temp_dir.path()), + NULL, DoneCallback, fd_param, + true, -1)); + } + // Crash with the exception handler in scope. + DoNullPointerDereference(); + } + } + if (!use_fd) + close(fds[1]); // Close the writting end. + + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGSEGV)); + + if (!use_fd) + ASSERT_NO_FATAL_FAILURE(ReadMinidumpPathFromPipe(fds[0], &minidump_path)); + + struct stat st; + ASSERT_EQ(0, stat(minidump_path.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + unlink(minidump_path.c_str()); +} + +TEST(ExceptionHandlerTest, ChildCrashWithPath) { + ASSERT_NO_FATAL_FAILURE(ChildCrash(false)); +} + +TEST(ExceptionHandlerTest, ChildCrashWithFD) { + ASSERT_NO_FATAL_FAILURE(ChildCrash(true)); +} + +#if !defined(__ANDROID_API__) || __ANDROID_API__ >= __ANDROID_API_N__ +static void* SleepFunction(void* unused) { + while (true) usleep(1000000); + return NULL; +} + +static void* CrashFunction(void* b_ptr) { + pthread_barrier_t* b = reinterpret_cast(b_ptr); + pthread_barrier_wait(b); + DoNullPointerDereference(); + return NULL; +} + +// Tests that concurrent crashes do not enter a loop by alternately triggering +// the signal handler. +TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) { + AutoTempDir temp_dir; + const pid_t child = fork(); + if (child == 0) { + google_breakpad::scoped_ptr handler( + new ExceptionHandler(MinidumpDescriptor(temp_dir.path()), NULL, NULL, + NULL, true, -1)); + + // We start a number of threads to make sure handling the signal takes + // enough time for the second thread to enter the signal handler. + int num_sleep_threads = 100; + google_breakpad::scoped_array sleep_threads( + new pthread_t[num_sleep_threads]); + for (int i = 0; i < num_sleep_threads; ++i) { + ASSERT_EQ(0, pthread_create(&sleep_threads[i], NULL, SleepFunction, + NULL)); + } + + int num_crash_threads = 2; + google_breakpad::scoped_array crash_threads( + new pthread_t[num_crash_threads]); + // Barrier to synchronize crashing both threads at the same time. + pthread_barrier_t b; + ASSERT_EQ(0, pthread_barrier_init(&b, NULL, num_crash_threads + 1)); + for (int i = 0; i < num_crash_threads; ++i) { + ASSERT_EQ(0, pthread_create(&crash_threads[i], NULL, CrashFunction, &b)); + } + pthread_barrier_wait(&b); + for (int i = 0; i < num_crash_threads; ++i) { + ASSERT_EQ(0, pthread_join(crash_threads[i], NULL)); + } + } + + // Poll the child to see if it crashed. + int status, wp_pid; + for (int i = 0; i < 100; i++) { + wp_pid = HANDLE_EINTR(waitpid(child, &status, WNOHANG)); + ASSERT_NE(-1, wp_pid); + if (wp_pid > 0) { + ASSERT_TRUE(WIFSIGNALED(status)); + // If the child process terminated by itself, + // it will have returned SIGSEGV. + ASSERT_EQ(SIGSEGV, WTERMSIG(status)); + return; + } else { + usleep(100000); + } + } + + // Kill the child if it is still running. + kill(child, SIGKILL); + + // If the child process terminated by itself, it will have returned SIGSEGV. + // If however it got stuck in a loop, it will have been killed by the + // SIGKILL. + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGSEGV)); +} +#endif // !defined(__ANDROID_API__) || __ANDROID_API__ >= __ANDROID_API_N__ + +static bool DoneCallbackReturnFalse(const MinidumpDescriptor& descriptor, + void* context, + bool succeeded) { + return false; +} + +static bool DoneCallbackReturnTrue(const MinidumpDescriptor& descriptor, + void* context, + bool succeeded) { + return true; +} + +static bool DoneCallbackRaiseSIGKILL(const MinidumpDescriptor& descriptor, + void* context, + bool succeeded) { + raise(SIGKILL); + return true; +} + +static bool FilterCallbackReturnFalse(void* context) { + return false; +} + +static bool FilterCallbackReturnTrue(void* context) { + return true; +} + +// SIGKILL cannot be blocked and a handler cannot be installed for it. In the +// following tests, if the child dies with signal SIGKILL, then the signal was +// redelivered to this handler. If the child dies with SIGSEGV then it wasn't. +static void RaiseSIGKILL(int sig) { + raise(SIGKILL); +} + +static bool InstallRaiseSIGKILL() { + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = RaiseSIGKILL; + return sigaction(SIGSEGV, &sa, NULL) != -1; +} + +static void CrashWithCallbacks(ExceptionHandler::FilterCallback filter, + ExceptionHandler::MinidumpCallback done, + string path) { + ExceptionHandler handler( + MinidumpDescriptor(path), filter, done, NULL, true, -1); + // Crash with the exception handler in scope. + DoNullPointerDereference(); +} + +TEST(ExceptionHandlerTest, RedeliveryOnFilterCallbackFalse) { + AutoTempDir temp_dir; + + const pid_t child = fork(); + if (child == 0) { + ASSERT_TRUE(InstallRaiseSIGKILL()); + CrashWithCallbacks(FilterCallbackReturnFalse, NULL, temp_dir.path()); + } + + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGKILL)); +} + +TEST(ExceptionHandlerTest, RedeliveryOnDoneCallbackFalse) { + AutoTempDir temp_dir; + + const pid_t child = fork(); + if (child == 0) { + ASSERT_TRUE(InstallRaiseSIGKILL()); + CrashWithCallbacks(NULL, DoneCallbackReturnFalse, temp_dir.path()); + } + + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGKILL)); +} + +TEST(ExceptionHandlerTest, NoRedeliveryOnDoneCallbackTrue) { + AutoTempDir temp_dir; + + const pid_t child = fork(); + if (child == 0) { + ASSERT_TRUE(InstallRaiseSIGKILL()); + CrashWithCallbacks(NULL, DoneCallbackReturnTrue, temp_dir.path()); + } + + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGSEGV)); +} + +TEST(ExceptionHandlerTest, NoRedeliveryOnFilterCallbackTrue) { + AutoTempDir temp_dir; + + const pid_t child = fork(); + if (child == 0) { + ASSERT_TRUE(InstallRaiseSIGKILL()); + CrashWithCallbacks(FilterCallbackReturnTrue, NULL, temp_dir.path()); + } + + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGSEGV)); +} + +TEST(ExceptionHandlerTest, RedeliveryToDefaultHandler) { + AutoTempDir temp_dir; + + const pid_t child = fork(); + if (child == 0) { + // Custom signal handlers, which may have been installed by a test launcher, + // are undesirable in this child. + signal(SIGSEGV, SIG_DFL); + + CrashWithCallbacks(FilterCallbackReturnFalse, NULL, temp_dir.path()); + } + + // As RaiseSIGKILL wasn't installed, the redelivery should just kill the child + // with SIGSEGV. + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGSEGV)); +} + +// Check that saving and restoring the signal handler with 'signal' +// instead of 'sigaction' doesn't make the Breakpad signal handler +// crash. See comments in ExceptionHandler::SignalHandler for full +// details. +TEST(ExceptionHandlerTest, RedeliveryOnBadSignalHandlerFlag) { + AutoTempDir temp_dir; + const pid_t child = fork(); + if (child == 0) { + // Install the RaiseSIGKILL handler for SIGSEGV. + ASSERT_TRUE(InstallRaiseSIGKILL()); + + // Create a new exception handler, this installs a new SIGSEGV + // handler, after saving the old one. + ExceptionHandler handler( + MinidumpDescriptor(temp_dir.path()), NULL, + DoneCallbackReturnFalse, NULL, true, -1); + + // Install the default SIGSEGV handler, saving the current one. + // Then re-install the current one with 'signal', this loses the + // SA_SIGINFO flag associated with the Breakpad handler. + sighandler_t old_handler = signal(SIGSEGV, SIG_DFL); + ASSERT_NE(reinterpret_cast(old_handler), + reinterpret_cast(SIG_ERR)); + ASSERT_NE(reinterpret_cast(signal(SIGSEGV, old_handler)), + reinterpret_cast(SIG_ERR)); + + // Crash with the exception handler in scope. + DoNullPointerDereference(); + } + // SIGKILL means Breakpad's signal handler didn't crash. + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGKILL)); +} + +TEST(ExceptionHandlerTest, StackedHandlersDeliveredToTop) { + AutoTempDir temp_dir; + + const pid_t child = fork(); + if (child == 0) { + ExceptionHandler bottom(MinidumpDescriptor(temp_dir.path()), + NULL, + NULL, + NULL, + true, + -1); + CrashWithCallbacks(NULL, DoneCallbackRaiseSIGKILL, temp_dir.path()); + } + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGKILL)); +} + +TEST(ExceptionHandlerTest, StackedHandlersNotDeliveredToBottom) { + AutoTempDir temp_dir; + + const pid_t child = fork(); + if (child == 0) { + ExceptionHandler bottom(MinidumpDescriptor(temp_dir.path()), + NULL, + DoneCallbackRaiseSIGKILL, + NULL, + true, + -1); + CrashWithCallbacks(NULL, NULL, temp_dir.path()); + } + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGSEGV)); +} + +TEST(ExceptionHandlerTest, StackedHandlersFilteredToBottom) { + AutoTempDir temp_dir; + + const pid_t child = fork(); + if (child == 0) { + ExceptionHandler bottom(MinidumpDescriptor(temp_dir.path()), + NULL, + DoneCallbackRaiseSIGKILL, + NULL, + true, + -1); + CrashWithCallbacks(FilterCallbackReturnFalse, NULL, temp_dir.path()); + } + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGKILL)); +} + +TEST(ExceptionHandlerTest, StackedHandlersUnhandledToBottom) { + AutoTempDir temp_dir; + + const pid_t child = fork(); + if (child == 0) { + ExceptionHandler bottom(MinidumpDescriptor(temp_dir.path()), + NULL, + DoneCallbackRaiseSIGKILL, + NULL, + true, + -1); + CrashWithCallbacks(NULL, DoneCallbackReturnFalse, temp_dir.path()); + } + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGKILL)); +} + +namespace { +const int kSimpleFirstChanceReturnStatus = 42; +bool SimpleFirstChanceHandler(int, siginfo_t*, void*) { + _exit(kSimpleFirstChanceReturnStatus); +} +} + +TEST(ExceptionHandlerTest, FirstChanceHandlerRuns) { + AutoTempDir temp_dir; + + const pid_t child = fork(); + if (child == 0) { + ExceptionHandler handler( + MinidumpDescriptor(temp_dir.path()), NULL, NULL, NULL, true, -1); + google_breakpad::SetFirstChanceExceptionHandler(SimpleFirstChanceHandler); + DoNullPointerDereference(); + } + int status; + ASSERT_NE(HANDLE_EINTR(waitpid(child, &status, 0)), -1); + ASSERT_TRUE(WIFEXITED(status)); + ASSERT_EQ(kSimpleFirstChanceReturnStatus, WEXITSTATUS(status)); +} + +#endif // !ADDRESS_SANITIZER + +const unsigned char kIllegalInstruction[] = { +#if defined(__mips__) + // mfc2 zero,Impl - usually illegal in userspace. + 0x48, 0x00, 0x00, 0x48 +#else + // This crashes with SIGILL on x86/x86-64/arm. + 0xff, 0xff, 0xff, 0xff +#endif +}; + +// Test that memory around the instruction pointer is written +// to the dump as a MinidumpMemoryRegion. +TEST(ExceptionHandlerTest, InstructionPointerMemory) { + AutoTempDir temp_dir; + int fds[2]; + ASSERT_NE(pipe(fds), -1); + + // These are defined here so the parent can use them to check the + // data from the minidump afterwards. + const uint32_t kMemorySize = 256; // bytes + const int kOffset = kMemorySize / 2; + + const pid_t child = fork(); + if (child == 0) { + close(fds[0]); + ExceptionHandler handler(MinidumpDescriptor(temp_dir.path()), NULL, + DoneCallback, reinterpret_cast(fds[1]), + true, -1); + // Get some executable memory. + char* memory = + reinterpret_cast(mmap(NULL, + kMemorySize, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANON, + -1, + 0)); + if (!memory) + exit(0); + + // Write some instructions that will crash. Put them in the middle + // of the block of memory, because the minidump should contain 128 + // bytes on either side of the instruction pointer. + memcpy(memory + kOffset, kIllegalInstruction, sizeof(kIllegalInstruction)); + FlushInstructionCache(memory, kMemorySize); + + // Now execute the instructions, which should crash. + typedef void (*void_function)(void); + void_function memory_function = + reinterpret_cast(memory + kOffset); + memory_function(); + } + close(fds[1]); + + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGILL)); + + string minidump_path; + ASSERT_NO_FATAL_FAILURE(ReadMinidumpPathFromPipe(fds[0], &minidump_path)); + + struct stat st; + ASSERT_EQ(0, stat(minidump_path.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + + // Read the minidump. Locate the exception record and the + // memory list, and then ensure that there is a memory region + // in the memory list that covers the instruction pointer from + // the exception record. + Minidump minidump(minidump_path); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(exception); + ASSERT_TRUE(memory_list); + ASSERT_LT(0U, memory_list->region_count()); + + MinidumpContext* context = exception->GetContext(); + ASSERT_TRUE(context); + + uint64_t instruction_pointer; + ASSERT_TRUE(context->GetInstructionPointer(&instruction_pointer)); + + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionForAddress(instruction_pointer); + ASSERT_TRUE(region); + + EXPECT_EQ(kMemorySize, region->GetSize()); + const uint8_t* bytes = region->GetMemory(); + ASSERT_TRUE(bytes); + + uint8_t prefix_bytes[kOffset]; + uint8_t suffix_bytes[kMemorySize - kOffset - sizeof(kIllegalInstruction)]; + memset(prefix_bytes, 0, sizeof(prefix_bytes)); + memset(suffix_bytes, 0, sizeof(suffix_bytes)); + EXPECT_TRUE(memcmp(bytes, prefix_bytes, sizeof(prefix_bytes)) == 0); + EXPECT_TRUE(memcmp(bytes + kOffset, kIllegalInstruction, + sizeof(kIllegalInstruction)) == 0); + EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(kIllegalInstruction), + suffix_bytes, sizeof(suffix_bytes)) == 0); + + unlink(minidump_path.c_str()); +} + +// Test that the memory region around the instruction pointer is +// bounded correctly on the low end. +TEST(ExceptionHandlerTest, InstructionPointerMemoryMinBound) { + AutoTempDir temp_dir; + int fds[2]; + ASSERT_NE(pipe(fds), -1); + + // These are defined here so the parent can use them to check the + // data from the minidump afterwards. + const uint32_t kMemorySize = 256; // bytes + const int kOffset = 0; + + const pid_t child = fork(); + if (child == 0) { + close(fds[0]); + ExceptionHandler handler(MinidumpDescriptor(temp_dir.path()), NULL, + DoneCallback, reinterpret_cast(fds[1]), + true, -1); + // Get some executable memory. + char* memory = + reinterpret_cast(mmap(NULL, + kMemorySize, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANON, + -1, + 0)); + if (!memory) + exit(0); + + // Write some instructions that will crash. Put them in the middle + // of the block of memory, because the minidump should contain 128 + // bytes on either side of the instruction pointer. + memcpy(memory + kOffset, kIllegalInstruction, sizeof(kIllegalInstruction)); + FlushInstructionCache(memory, kMemorySize); + + // Now execute the instructions, which should crash. + typedef void (*void_function)(void); + void_function memory_function = + reinterpret_cast(memory + kOffset); + memory_function(); + } + close(fds[1]); + + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGILL)); + + string minidump_path; + ASSERT_NO_FATAL_FAILURE(ReadMinidumpPathFromPipe(fds[0], &minidump_path)); + + struct stat st; + ASSERT_EQ(0, stat(minidump_path.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + + // Read the minidump. Locate the exception record and the + // memory list, and then ensure that there is a memory region + // in the memory list that covers the instruction pointer from + // the exception record. + Minidump minidump(minidump_path); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(exception); + ASSERT_TRUE(memory_list); + ASSERT_LT(0U, memory_list->region_count()); + + MinidumpContext* context = exception->GetContext(); + ASSERT_TRUE(context); + + uint64_t instruction_pointer; + ASSERT_TRUE(context->GetInstructionPointer(&instruction_pointer)); + + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionForAddress(instruction_pointer); + ASSERT_TRUE(region); + + EXPECT_EQ(kMemorySize / 2, region->GetSize()); + const uint8_t* bytes = region->GetMemory(); + ASSERT_TRUE(bytes); + + uint8_t suffix_bytes[kMemorySize / 2 - sizeof(kIllegalInstruction)]; + memset(suffix_bytes, 0, sizeof(suffix_bytes)); + EXPECT_TRUE(memcmp(bytes + kOffset, kIllegalInstruction, + sizeof(kIllegalInstruction)) == 0); + EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(kIllegalInstruction), + suffix_bytes, sizeof(suffix_bytes)) == 0); + unlink(minidump_path.c_str()); +} + +// Test that the memory region around the instruction pointer is +// bounded correctly on the high end. +TEST(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) { + AutoTempDir temp_dir; + int fds[2]; + ASSERT_NE(pipe(fds), -1); + + // These are defined here so the parent can use them to check the + // data from the minidump afterwards. + // Use 4k here because the OS will hand out a single page even + // if a smaller size is requested, and this test wants to + // test the upper bound of the memory range. + const uint32_t kMemorySize = 4096; // bytes + const int kOffset = kMemorySize - sizeof(kIllegalInstruction); + + const pid_t child = fork(); + if (child == 0) { + close(fds[0]); + ExceptionHandler handler(MinidumpDescriptor(temp_dir.path()), NULL, + DoneCallback, reinterpret_cast(fds[1]), + true, -1); + // Get some executable memory. + char* memory = + reinterpret_cast(mmap(NULL, + kMemorySize, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANON, + -1, + 0)); + if (!memory) + exit(0); + + // Write some instructions that will crash. Put them in the middle + // of the block of memory, because the minidump should contain 128 + // bytes on either side of the instruction pointer. + memcpy(memory + kOffset, kIllegalInstruction, sizeof(kIllegalInstruction)); + FlushInstructionCache(memory, kMemorySize); + + // Now execute the instructions, which should crash. + typedef void (*void_function)(void); + void_function memory_function = + reinterpret_cast(memory + kOffset); + memory_function(); + } + close(fds[1]); + + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGILL)); + + string minidump_path; + ASSERT_NO_FATAL_FAILURE(ReadMinidumpPathFromPipe(fds[0], &minidump_path)); + + struct stat st; + ASSERT_EQ(0, stat(minidump_path.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + + // Read the minidump. Locate the exception record and the memory list, and + // then ensure that there is a memory region in the memory list that covers + // the instruction pointer from the exception record. + Minidump minidump(minidump_path); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(exception); + ASSERT_TRUE(memory_list); + ASSERT_LT(0U, memory_list->region_count()); + + MinidumpContext* context = exception->GetContext(); + ASSERT_TRUE(context); + + uint64_t instruction_pointer; + ASSERT_TRUE(context->GetInstructionPointer(&instruction_pointer)); + + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionForAddress(instruction_pointer); + ASSERT_TRUE(region); + + const size_t kPrefixSize = 128; // bytes + EXPECT_EQ(kPrefixSize + sizeof(kIllegalInstruction), region->GetSize()); + const uint8_t* bytes = region->GetMemory(); + ASSERT_TRUE(bytes); + + uint8_t prefix_bytes[kPrefixSize]; + memset(prefix_bytes, 0, sizeof(prefix_bytes)); + EXPECT_TRUE(memcmp(bytes, prefix_bytes, sizeof(prefix_bytes)) == 0); + EXPECT_TRUE(memcmp(bytes + kPrefixSize, + kIllegalInstruction, sizeof(kIllegalInstruction)) == 0); + + unlink(minidump_path.c_str()); +} + +#ifndef ADDRESS_SANITIZER + +// Ensure that an extra memory block doesn't get added when the instruction +// pointer is not in mapped memory. +TEST(ExceptionHandlerTest, InstructionPointerMemoryNullPointer) { + AutoTempDir temp_dir; + int fds[2]; + ASSERT_NE(pipe(fds), -1); + + const pid_t child = fork(); + if (child == 0) { + close(fds[0]); + ExceptionHandler handler(MinidumpDescriptor(temp_dir.path()), NULL, + DoneCallback, reinterpret_cast(fds[1]), + true, -1); + // Try calling a NULL pointer. + typedef void (*void_function)(void); + // Volatile markings are needed to keep Clang from generating invalid + // opcodes. See http://crbug.com/498354 for details. + volatile void_function memory_function = + reinterpret_cast(NULL); + memory_function(); + // not reached + exit(1); + } + close(fds[1]); + + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGSEGV)); + + string minidump_path; + ASSERT_NO_FATAL_FAILURE(ReadMinidumpPathFromPipe(fds[0], &minidump_path)); + + struct stat st; + ASSERT_EQ(0, stat(minidump_path.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + + // Read the minidump. Locate the exception record and the + // memory list, and then ensure that there is no memory region + // in the memory list that covers the instruction pointer from + // the exception record. + Minidump minidump(minidump_path); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + ASSERT_TRUE(exception); + + MinidumpContext* exception_context = exception->GetContext(); + ASSERT_TRUE(exception_context); + + uint64_t instruction_pointer; + ASSERT_TRUE(exception_context->GetInstructionPointer(&instruction_pointer)); + EXPECT_EQ(instruction_pointer, 0u); + + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(memory_list); + + unsigned int region_count = memory_list->region_count(); + ASSERT_GE(region_count, 1u); + + for (unsigned int region_index = 0; + region_index < region_count; + ++region_index) { + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionAtIndex(region_index); + uint64_t region_base = region->GetBase(); + EXPECT_FALSE(instruction_pointer >= region_base && + instruction_pointer < region_base + region->GetSize()); + } + + unlink(minidump_path.c_str()); +} + +#endif // !ADDRESS_SANITIZER + +// Test that anonymous memory maps can be annotated with names and IDs. +TEST(ExceptionHandlerTest, ModuleInfo) { + // These are defined here so the parent can use them to check the + // data from the minidump afterwards. + const uint32_t kMemorySize = sysconf(_SC_PAGESIZE); + const char* kMemoryName = "a fake module"; + const uint8_t kModuleGUID[sizeof(MDGUID)] = { + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF + }; + const string module_identifier = "33221100554477668899AABBCCDDEEFF0"; + + // Get some memory. + char* memory = + reinterpret_cast(mmap(NULL, + kMemorySize, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + -1, + 0)); + const uintptr_t kMemoryAddress = reinterpret_cast(memory); + ASSERT_TRUE(memory); + + AutoTempDir temp_dir; + ExceptionHandler handler( + MinidumpDescriptor(temp_dir.path()), NULL, NULL, NULL, true, -1); + + // Add info about the anonymous memory mapping. + handler.AddMappingInfo(kMemoryName, + kModuleGUID, + kMemoryAddress, + kMemorySize, + 0); + ASSERT_TRUE(handler.WriteMinidump()); + + const MinidumpDescriptor& minidump_desc = handler.minidump_descriptor(); + // Read the minidump. Load the module list, and ensure that the mmap'ed + // |memory| is listed with the given module name and debug ID. + Minidump minidump(minidump_desc.path()); + ASSERT_TRUE(minidump.Read()); + + MinidumpModuleList* module_list = minidump.GetModuleList(); + ASSERT_TRUE(module_list); + const MinidumpModule* module = + module_list->GetModuleForAddress(kMemoryAddress); + ASSERT_TRUE(module); + + EXPECT_EQ(kMemoryAddress, module->base_address()); + EXPECT_EQ(kMemorySize, module->size()); + EXPECT_EQ(kMemoryName, module->code_file()); + EXPECT_EQ(module_identifier, module->debug_identifier()); + + unlink(minidump_desc.path()); +} + +#ifndef ADDRESS_SANITIZER + +static const unsigned kControlMsgSize = + CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(struct ucred)); + +static bool +CrashHandler(const void* crash_context, size_t crash_context_size, + void* context) { + const int fd = (intptr_t) context; + int fds[2]; + if (pipe(fds) == -1) { + // There doesn't seem to be any way to reliably handle + // this failure without the parent process hanging + // At least make sure that this process doesn't access + // unexpected file descriptors + fds[0] = -1; + fds[1] = -1; + } + struct kernel_msghdr msg = {0}; + struct kernel_iovec iov; + iov.iov_base = const_cast(crash_context); + iov.iov_len = crash_context_size; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + char cmsg[kControlMsgSize]; + memset(cmsg, 0, kControlMsgSize); + msg.msg_control = cmsg; + msg.msg_controllen = sizeof(cmsg); + + struct cmsghdr* hdr = CMSG_FIRSTHDR(&msg); + hdr->cmsg_level = SOL_SOCKET; + hdr->cmsg_type = SCM_RIGHTS; + hdr->cmsg_len = CMSG_LEN(sizeof(int)); + *((int*) CMSG_DATA(hdr)) = fds[1]; + hdr = CMSG_NXTHDR((struct msghdr*) &msg, hdr); + hdr->cmsg_level = SOL_SOCKET; + hdr->cmsg_type = SCM_CREDENTIALS; + hdr->cmsg_len = CMSG_LEN(sizeof(struct ucred)); + struct ucred* cred = reinterpret_cast(CMSG_DATA(hdr)); + cred->uid = getuid(); + cred->gid = getgid(); + cred->pid = getpid(); + + ssize_t ret = HANDLE_EINTR(sys_sendmsg(fd, &msg, 0)); + sys_close(fds[1]); + if (ret <= 0) + return false; + + char b; + IGNORE_RET(HANDLE_EINTR(sys_read(fds[0], &b, 1))); + + return true; +} + +TEST(ExceptionHandlerTest, ExternalDumper) { + int fds[2]; + ASSERT_NE(socketpair(AF_UNIX, SOCK_DGRAM, 0, fds), -1); + static const int on = 1; + setsockopt(fds[0], SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); + setsockopt(fds[1], SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); + + const pid_t child = fork(); + if (child == 0) { + close(fds[0]); + ExceptionHandler handler(MinidumpDescriptor("/tmp1"), NULL, NULL, + reinterpret_cast(fds[1]), true, -1); + handler.set_crash_handler(CrashHandler); + DoNullPointerDereference(); + } + close(fds[1]); + struct msghdr msg = {0}; + struct iovec iov; + static const unsigned kCrashContextSize = + sizeof(ExceptionHandler::CrashContext); + char context[kCrashContextSize]; + char control[kControlMsgSize]; + iov.iov_base = context; + iov.iov_len = kCrashContextSize; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = control; + msg.msg_controllen = kControlMsgSize; + + const ssize_t n = HANDLE_EINTR(recvmsg(fds[0], &msg, 0)); + ASSERT_EQ(static_cast(kCrashContextSize), n); + ASSERT_EQ(kControlMsgSize, msg.msg_controllen); + ASSERT_EQ(static_cast<__typeof__(msg.msg_flags)>(0), msg.msg_flags); + ASSERT_EQ(0, close(fds[0])); + + pid_t crashing_pid = -1; + int signal_fd = -1; + for (struct cmsghdr* hdr = CMSG_FIRSTHDR(&msg); hdr; + hdr = CMSG_NXTHDR(&msg, hdr)) { + if (hdr->cmsg_level != SOL_SOCKET) + continue; + if (hdr->cmsg_type == SCM_RIGHTS) { + const unsigned len = hdr->cmsg_len - + (((uint8_t*)CMSG_DATA(hdr)) - (uint8_t*)hdr); + ASSERT_EQ(sizeof(int), len); + signal_fd = *(reinterpret_cast(CMSG_DATA(hdr))); + } else if (hdr->cmsg_type == SCM_CREDENTIALS) { + const struct ucred* cred = + reinterpret_cast(CMSG_DATA(hdr)); + crashing_pid = cred->pid; + } + } + + ASSERT_NE(crashing_pid, -1); + ASSERT_NE(signal_fd, -1); + + AutoTempDir temp_dir; + string templ = temp_dir.path() + "/exception-handler-unittest"; + ASSERT_TRUE(WriteMinidump(templ.c_str(), crashing_pid, context, + kCrashContextSize)); + static const char b = 0; + ASSERT_EQ(1, (HANDLE_EINTR(write(signal_fd, &b, 1)))); + ASSERT_EQ(0, close(signal_fd)); + + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGSEGV)); + + struct stat st; + ASSERT_EQ(0, stat(templ.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + unlink(templ.c_str()); +} + +#endif // !ADDRESS_SANITIZER + +TEST(ExceptionHandlerTest, WriteMinidumpExceptionStream) { + AutoTempDir temp_dir; + ExceptionHandler handler(MinidumpDescriptor(temp_dir.path()), NULL, NULL, + NULL, false, -1); + ASSERT_TRUE(handler.WriteMinidump()); + + string minidump_path = handler.minidump_descriptor().path(); + + // Read the minidump and check the exception stream. + Minidump minidump(minidump_path); + ASSERT_TRUE(minidump.Read()); + MinidumpException* exception = minidump.GetException(); + ASSERT_TRUE(exception); + const MDRawExceptionStream* raw = exception->exception(); + ASSERT_TRUE(raw); + EXPECT_EQ(MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED, + raw->exception_record.exception_code); +} + +TEST(ExceptionHandlerTest, GenerateMultipleDumpsWithFD) { + AutoTempDir temp_dir; + string path; + const int fd = CreateTMPFile(temp_dir.path(), &path); + ExceptionHandler handler(MinidumpDescriptor(fd), NULL, NULL, NULL, false, -1); + ASSERT_TRUE(handler.WriteMinidump()); + // Check by the size of the data written to the FD that a minidump was + // generated. + off_t size = lseek(fd, 0, SEEK_CUR); + ASSERT_GT(size, 0); + + // Generate another minidump. + ASSERT_TRUE(handler.WriteMinidump()); + size = lseek(fd, 0, SEEK_CUR); + ASSERT_GT(size, 0); +} + +TEST(ExceptionHandlerTest, GenerateMultipleDumpsWithPath) { + AutoTempDir temp_dir; + ExceptionHandler handler(MinidumpDescriptor(temp_dir.path()), NULL, NULL, + NULL, false, -1); + ASSERT_TRUE(handler.WriteMinidump()); + + const MinidumpDescriptor& minidump_1 = handler.minidump_descriptor(); + struct stat st; + ASSERT_EQ(0, stat(minidump_1.path(), &st)); + ASSERT_GT(st.st_size, 0); + string minidump_1_path(minidump_1.path()); + // Check it is a valid minidump. + Minidump minidump1(minidump_1_path); + ASSERT_TRUE(minidump1.Read()); + unlink(minidump_1.path()); + + // Generate another minidump, it should go to a different file. + ASSERT_TRUE(handler.WriteMinidump()); + const MinidumpDescriptor& minidump_2 = handler.minidump_descriptor(); + ASSERT_EQ(0, stat(minidump_2.path(), &st)); + ASSERT_GT(st.st_size, 0); + string minidump_2_path(minidump_2.path()); + // Check it is a valid minidump. + Minidump minidump2(minidump_2_path); + ASSERT_TRUE(minidump2.Read()); + unlink(minidump_2.path()); + + // 2 distinct files should be produced. + ASSERT_STRNE(minidump_1_path.c_str(), minidump_2_path.c_str()); +} + +// Test that an additional memory region can be added to the minidump. +TEST(ExceptionHandlerTest, AdditionalMemory) { + const uint32_t kMemorySize = sysconf(_SC_PAGESIZE); + + // Get some heap memory. + uint8_t* memory = new uint8_t[kMemorySize]; + const uintptr_t kMemoryAddress = reinterpret_cast(memory); + ASSERT_TRUE(memory); + + // Stick some data into the memory so the contents can be verified. + for (uint32_t i = 0; i < kMemorySize; ++i) { + memory[i] = i % 255; + } + + AutoTempDir temp_dir; + ExceptionHandler handler( + MinidumpDescriptor(temp_dir.path()), NULL, NULL, NULL, true, -1); + + // Add the memory region to the list of memory to be included. + handler.RegisterAppMemory(memory, kMemorySize); + handler.WriteMinidump(); + + const MinidumpDescriptor& minidump_desc = handler.minidump_descriptor(); + + // Read the minidump. Ensure that the memory region is present + Minidump minidump(minidump_desc.path()); + ASSERT_TRUE(minidump.Read()); + + MinidumpMemoryList* dump_memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(dump_memory_list); + const MinidumpMemoryRegion* region = + dump_memory_list->GetMemoryRegionForAddress(kMemoryAddress); + ASSERT_TRUE(region); + + EXPECT_EQ(kMemoryAddress, region->GetBase()); + EXPECT_EQ(kMemorySize, region->GetSize()); + + // Verify memory contents. + EXPECT_EQ(0, memcmp(region->GetMemory(), memory, kMemorySize)); + + delete[] memory; +} + +// Test that a memory region that was previously registered +// can be unregistered. +TEST(ExceptionHandlerTest, AdditionalMemoryRemove) { + const uint32_t kMemorySize = sysconf(_SC_PAGESIZE); + + // Get some heap memory. + uint8_t* memory = new uint8_t[kMemorySize]; + const uintptr_t kMemoryAddress = reinterpret_cast(memory); + ASSERT_TRUE(memory); + + AutoTempDir temp_dir; + ExceptionHandler handler( + MinidumpDescriptor(temp_dir.path()), NULL, NULL, NULL, true, -1); + + // Add the memory region to the list of memory to be included. + handler.RegisterAppMemory(memory, kMemorySize); + + // ...and then remove it + handler.UnregisterAppMemory(memory); + handler.WriteMinidump(); + + const MinidumpDescriptor& minidump_desc = handler.minidump_descriptor(); + + // Read the minidump. Ensure that the memory region is not present. + Minidump minidump(minidump_desc.path()); + ASSERT_TRUE(minidump.Read()); + + MinidumpMemoryList* dump_memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(dump_memory_list); + const MinidumpMemoryRegion* region = + dump_memory_list->GetMemoryRegionForAddress(kMemoryAddress); + EXPECT_FALSE(region); + + delete[] memory; +} + +static bool SimpleCallback(const MinidumpDescriptor& descriptor, + void* context, + bool succeeded) { + string* filename = reinterpret_cast(context); + *filename = descriptor.path(); + return true; +} + +TEST(ExceptionHandlerTest, WriteMinidumpForChild) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + HANDLE_EINTR(read(fds[0], &b, sizeof(b))); + close(fds[0]); + syscall(__NR_exit); + } + close(fds[0]); + + AutoTempDir temp_dir; + string minidump_filename; + ASSERT_TRUE( + ExceptionHandler::WriteMinidumpForChild(child, child, + temp_dir.path(), SimpleCallback, + (void*)&minidump_filename)); + + Minidump minidump(minidump_filename); + ASSERT_TRUE(minidump.Read()); + // Check that the crashing thread is the main thread of |child| + MinidumpException* exception = minidump.GetException(); + ASSERT_TRUE(exception); + uint32_t thread_id; + ASSERT_TRUE(exception->GetThreadID(&thread_id)); + EXPECT_EQ(child, static_cast(thread_id)); + + const MDRawExceptionStream* raw = exception->exception(); + ASSERT_TRUE(raw); + EXPECT_EQ(MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED, + raw->exception_record.exception_code); + + close(fds[1]); + unlink(minidump_filename.c_str()); +} diff --git a/src/client/linux/handler/microdump_extra_info.h b/src/client/linux/handler/microdump_extra_info.h new file mode 100644 index 0000000..1da69d0 --- /dev/null +++ b/src/client/linux/handler/microdump_extra_info.h @@ -0,0 +1,51 @@ +// Copyright 2015 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_HANDLER_MICRODUMP_EXTRA_INFO_H_ +#define CLIENT_LINUX_HANDLER_MICRODUMP_EXTRA_INFO_H_ + +namespace google_breakpad { + +struct MicrodumpExtraInfo { + // Strings pointed to by this struct are not copied, and are + // expected to remain valid for the lifetime of the process. + const char* build_fingerprint; + const char* product_info; + const char* gpu_fingerprint; + const char* process_type; + + MicrodumpExtraInfo() + : build_fingerprint(NULL), + product_info(NULL), + gpu_fingerprint(NULL), + process_type(NULL) {} +}; + +} + +#endif // CLIENT_LINUX_HANDLER_MICRODUMP_EXTRA_INFO_H_ diff --git a/src/client/linux/handler/minidump_descriptor.cc b/src/client/linux/handler/minidump_descriptor.cc new file mode 100644 index 0000000..db2f9b1 --- /dev/null +++ b/src/client/linux/handler/minidump_descriptor.cc @@ -0,0 +1,100 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "client/linux/handler/minidump_descriptor.h" + +#include "common/linux/guid_creator.h" + +namespace google_breakpad { + +//static +const MinidumpDescriptor::MicrodumpOnConsole + MinidumpDescriptor::kMicrodumpOnConsole = {}; + +MinidumpDescriptor::MinidumpDescriptor(const MinidumpDescriptor& descriptor) + : mode_(descriptor.mode_), + fd_(descriptor.fd_), + directory_(descriptor.directory_), + c_path_(NULL), + size_limit_(descriptor.size_limit_), + address_within_principal_mapping_( + descriptor.address_within_principal_mapping_), + skip_dump_if_principal_mapping_not_referenced_( + descriptor.skip_dump_if_principal_mapping_not_referenced_), + sanitize_stacks_(descriptor.sanitize_stacks_), + microdump_extra_info_(descriptor.microdump_extra_info_) { + // The copy constructor is not allowed to be called on a MinidumpDescriptor + // with a valid path_, as getting its c_path_ would require the heap which + // can cause problems in compromised environments. + assert(descriptor.path_.empty()); +} + +MinidumpDescriptor& MinidumpDescriptor::operator=( + const MinidumpDescriptor& descriptor) { + assert(descriptor.path_.empty()); + + mode_ = descriptor.mode_; + fd_ = descriptor.fd_; + directory_ = descriptor.directory_; + path_.clear(); + if (c_path_) { + // This descriptor already had a path set, so generate a new one. + c_path_ = NULL; + UpdatePath(); + } + size_limit_ = descriptor.size_limit_; + address_within_principal_mapping_ = + descriptor.address_within_principal_mapping_; + skip_dump_if_principal_mapping_not_referenced_ = + descriptor.skip_dump_if_principal_mapping_not_referenced_; + sanitize_stacks_ = descriptor.sanitize_stacks_; + microdump_extra_info_ = descriptor.microdump_extra_info_; + return *this; +} + +void MinidumpDescriptor::UpdatePath() { + assert(mode_ == kWriteMinidumpToFile && !directory_.empty()); + + GUID guid; + char guid_str[kGUIDStringLength + 1]; + if (!CreateGUID(&guid) || !GUIDToString(&guid, guid_str, sizeof(guid_str))) { + assert(false); + } + + path_.clear(); + path_ = directory_ + "/" + guid_str + ".dmp"; + c_path_ = path_.c_str(); +} + +} // namespace google_breakpad diff --git a/src/client/linux/handler/minidump_descriptor.h b/src/client/linux/handler/minidump_descriptor.h new file mode 100644 index 0000000..d822c9d --- /dev/null +++ b/src/client/linux/handler/minidump_descriptor.h @@ -0,0 +1,199 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_HANDLER_MINIDUMP_DESCRIPTOR_H_ +#define CLIENT_LINUX_HANDLER_MINIDUMP_DESCRIPTOR_H_ + +#include +#include + +#include +#include + +#include "client/linux/handler/microdump_extra_info.h" +#include "common/using_std_string.h" + +// This class describes how a crash dump should be generated, either: +// - Writing a full minidump to a file in a given directory (the actual path, +// inside the directory, is determined by this class). +// - Writing a full minidump to a given fd. +// - Writing a reduced microdump to the console (logcat on Android). +namespace google_breakpad { + +class MinidumpDescriptor { + public: + struct MicrodumpOnConsole {}; + static const MicrodumpOnConsole kMicrodumpOnConsole; + + MinidumpDescriptor() + : mode_(kUninitialized), + fd_(-1), + size_limit_(-1), + address_within_principal_mapping_(0), + skip_dump_if_principal_mapping_not_referenced_(false) {} + + explicit MinidumpDescriptor(const string& directory) + : mode_(kWriteMinidumpToFile), + fd_(-1), + directory_(directory), + c_path_(NULL), + size_limit_(-1), + address_within_principal_mapping_(0), + skip_dump_if_principal_mapping_not_referenced_(false), + sanitize_stacks_(false) { + assert(!directory.empty()); + } + + explicit MinidumpDescriptor(int fd) + : mode_(kWriteMinidumpToFd), + fd_(fd), + c_path_(NULL), + size_limit_(-1), + address_within_principal_mapping_(0), + skip_dump_if_principal_mapping_not_referenced_(false), + sanitize_stacks_(false) { + assert(fd != -1); + } + + explicit MinidumpDescriptor(const MicrodumpOnConsole&) + : mode_(kWriteMicrodumpToConsole), + fd_(-1), + size_limit_(-1), + address_within_principal_mapping_(0), + skip_dump_if_principal_mapping_not_referenced_(false), + sanitize_stacks_(false) {} + + explicit MinidumpDescriptor(const MinidumpDescriptor& descriptor); + MinidumpDescriptor& operator=(const MinidumpDescriptor& descriptor); + + static MinidumpDescriptor getMicrodumpDescriptor(); + + bool IsFD() const { return mode_ == kWriteMinidumpToFd; } + + int fd() const { return fd_; } + + string directory() const { return directory_; } + + const char* path() const { return c_path_; } + + bool IsMicrodumpOnConsole() const { + return mode_ == kWriteMicrodumpToConsole; + } + + // Updates the path so it is unique. + // Should be called from a normal context: this methods uses the heap. + void UpdatePath(); + + off_t size_limit() const { return size_limit_; } + void set_size_limit(off_t limit) { size_limit_ = limit; } + + uintptr_t address_within_principal_mapping() const { + return address_within_principal_mapping_; + } + void set_address_within_principal_mapping( + uintptr_t address_within_principal_mapping) { + address_within_principal_mapping_ = address_within_principal_mapping; + } + + bool skip_dump_if_principal_mapping_not_referenced() { + return skip_dump_if_principal_mapping_not_referenced_; + } + void set_skip_dump_if_principal_mapping_not_referenced( + bool skip_dump_if_principal_mapping_not_referenced) { + skip_dump_if_principal_mapping_not_referenced_ = + skip_dump_if_principal_mapping_not_referenced; + } + + bool sanitize_stacks() const { return sanitize_stacks_; } + void set_sanitize_stacks(bool sanitize_stacks) { + sanitize_stacks_ = sanitize_stacks; + } + + MicrodumpExtraInfo* microdump_extra_info() { + assert(IsMicrodumpOnConsole()); + return µdump_extra_info_; + } + + private: + enum DumpMode { + kUninitialized = 0, + kWriteMinidumpToFile, + kWriteMinidumpToFd, + kWriteMicrodumpToConsole + }; + + // Specifies the dump mode (see DumpMode). + DumpMode mode_; + + // The file descriptor where the minidump is generated. + int fd_; + + // The directory where the minidump should be generated. + string directory_; + + // The full path to the generated minidump. + string path_; + + // The C string of |path_|. Precomputed so it can be access from a compromised + // context. + const char* c_path_; + + off_t size_limit_; + + // This member points somewhere into the main module for this + // process (the module that is considerered interesting for the + // purposes of debugging crashes). + uintptr_t address_within_principal_mapping_; + + // If set, threads that do not reference the address range + // associated with |address_within_principal_mapping_| will not have their + // stacks logged. + bool skip_dump_if_principal_mapping_not_referenced_; + + // If set, stacks are sanitized to remove PII. This involves + // overwriting any pointer-aligned words that are not either + // pointers into a process mapping or small integers (+/-4096). This + // leaves enough information to unwind stacks, and preserve some + // register values, but elides strings and other program data. + bool sanitize_stacks_; + + // The extra microdump data (e.g. product name/version, build + // fingerprint, gpu fingerprint) that should be appended to the dump + // (microdump only). Microdumps don't have the ability of appending + // extra metadata after the dump is generated (as opposite to + // minidumps MIME fields), therefore the extra data must be provided + // upfront. Any memory pointed to by members of the + // MicrodumpExtraInfo struct must be valid for the lifetime of the + // process (read: the caller has to guarantee that it is stored in + // global static storage.) + MicrodumpExtraInfo microdump_extra_info_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_HANDLER_MINIDUMP_DESCRIPTOR_H_ diff --git a/src/client/linux/log/log.cc b/src/client/linux/log/log.cc new file mode 100644 index 0000000..2a48d7f --- /dev/null +++ b/src/client/linux/log/log.cc @@ -0,0 +1,87 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/linux/log/log.h" + +#if defined(__ANDROID__) +#include +#include +#else +#include "third_party/lss/linux_syscall_support.h" +#endif + +namespace logger { + +#if defined(__ANDROID__) +namespace { + +// __android_log_buf_write() is not exported in the NDK and is being used by +// dynamic runtime linking. Its declaration is taken from Android's +// system/core/include/log/log.h. +using AndroidLogBufferWriteFunc = int (*)(int bufID, int prio, const char* tag, + const char* text); +const int kAndroidCrashLogId = 4; // From LOG_ID_CRASH in log.h. +const char kAndroidLogTag[] = "google-breakpad"; + +bool g_crash_log_initialized = false; +AndroidLogBufferWriteFunc g_android_log_buf_write = nullptr; + +} // namespace + +void initializeCrashLogWriter() { + if (g_crash_log_initialized) + return; + g_android_log_buf_write = reinterpret_cast( + dlsym(RTLD_DEFAULT, "__android_log_buf_write")); + g_crash_log_initialized = true; +} + +int writeToCrashLog(const char* buf) { + // Try writing to the crash log ring buffer. If not available, fall back to + // the standard log buffer. + if (g_android_log_buf_write) { + return g_android_log_buf_write(kAndroidCrashLogId, ANDROID_LOG_FATAL, + kAndroidLogTag, buf); + } + return __android_log_write(ANDROID_LOG_FATAL, kAndroidLogTag, buf); +} +#endif + +int write(const char* buf, size_t nbytes) { +#if defined(__ANDROID__) + return __android_log_write(ANDROID_LOG_WARN, kAndroidLogTag, buf); +#else + return sys_write(2, buf, nbytes); +#endif +} + +} // namespace logger diff --git a/src/client/linux/log/log.h b/src/client/linux/log/log.h new file mode 100644 index 0000000..93aeffc --- /dev/null +++ b/src/client/linux/log/log.h @@ -0,0 +1,54 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_LOG_LOG_H_ +#define CLIENT_LINUX_LOG_LOG_H_ + +#include + +namespace logger { + +int write(const char* buf, size_t nbytes); + +// In the case of Android the log can be written to the default system log +// (default behavior of write() above, or to the crash log (see +// writeToCrashLog() below). +#if defined(__ANDROID__) + +// The logger must be initialized in a non-compromised context. +void initializeCrashLogWriter(); + +// Once initialized, writeToCrashLog is safe to use in a compromised context, +// even if the initialization failed, in which case this will silently fall +// back on write(). +int writeToCrashLog(const char* buf); +#endif + +} // namespace logger + +#endif // CLIENT_LINUX_LOG_LOG_H_ diff --git a/src/client/linux/microdump_writer/microdump_writer.cc b/src/client/linux/microdump_writer/microdump_writer.cc new file mode 100644 index 0000000..93dae35 --- /dev/null +++ b/src/client/linux/microdump_writer/microdump_writer.cc @@ -0,0 +1,675 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This translation unit generates microdumps into the console (logcat on +// Android). See crbug.com/410294 for more info and design docs. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/linux/microdump_writer/microdump_writer.h" + +#include + +#include + +#include "client/linux/dump_writer_common/thread_info.h" +#include "client/linux/dump_writer_common/ucontext_reader.h" +#include "client/linux/handler/exception_handler.h" +#include "client/linux/handler/microdump_extra_info.h" +#include "client/linux/log/log.h" +#include "client/linux/minidump_writer/linux_ptrace_dumper.h" +#include "common/linux/file_id.h" +#include "common/linux/linux_libc_support.h" +#include "common/memory_allocator.h" + +namespace { + +using google_breakpad::auto_wasteful_vector; +using google_breakpad::elf::kDefaultBuildIdSize; +using google_breakpad::ExceptionHandler; +using google_breakpad::LinuxDumper; +using google_breakpad::LinuxPtraceDumper; +using google_breakpad::MappingInfo; +using google_breakpad::MappingList; +using google_breakpad::MicrodumpExtraInfo; +using google_breakpad::RawContextCPU; +using google_breakpad::ThreadInfo; +using google_breakpad::UContextReader; + +const size_t kLineBufferSize = 2048; + +#if !defined(__LP64__) +// The following are only used by DumpFreeSpace, so need to be compiled +// in conditionally in the same way. + +template +Dst saturated_cast(Src src) { + if (src >= std::numeric_limits::max()) + return std::numeric_limits::max(); + if (src <= std::numeric_limits::min()) + return std::numeric_limits::min(); + return static_cast(src); +} + +int Log2Floor(uint64_t n) { + // Copied from chromium src/base/bits.h + if (n == 0) + return -1; + int log = 0; + uint64_t value = n; + for (int i = 5; i >= 0; --i) { + int shift = (1 << i); + uint64_t x = value >> shift; + if (x != 0) { + value = x; + log += shift; + } + } + assert(value == 1u); + return log; +} + +bool MappingsAreAdjacent(const MappingInfo& a, const MappingInfo& b) { + // Because of load biasing, we can end up with a situation where two + // mappings actually overlap. So we will define adjacency to also include a + // b start address that lies within a's address range (including starting + // immediately after a). + // Because load biasing only ever moves the start address backwards, the end + // address should still increase. + return a.start_addr <= b.start_addr && a.start_addr + a.size >= b.start_addr; +} + +bool MappingLessThan(const MappingInfo* a, const MappingInfo* b) { + // Return true if mapping a is before mapping b. + // For the same reason (load biasing) we compare end addresses, which - unlike + // start addresses - will not have been modified. + return a->start_addr + a->size < b->start_addr + b->size; +} + +size_t NextOrderedMapping( + const google_breakpad::wasteful_vector& mappings, + size_t curr) { + // Find the mapping that directly follows mappings[curr]. + // If no such mapping exists, return |invalid| to indicate this. + const size_t invalid = std::numeric_limits::max(); + size_t best = invalid; + for (size_t next = 0; next < mappings.size(); ++next) { + if (MappingLessThan(mappings[curr], mappings[next]) && + (best == invalid || MappingLessThan(mappings[next], mappings[best]))) { + best = next; + } + } + return best; +} + +#endif // !__LP64__ + +class MicrodumpWriter { + public: + MicrodumpWriter(const ExceptionHandler::CrashContext* context, + const MappingList& mappings, + bool skip_dump_if_principal_mapping_not_referenced, + uintptr_t address_within_principal_mapping, + bool sanitize_stack, + const MicrodumpExtraInfo& microdump_extra_info, + LinuxDumper* dumper) + : ucontext_(context ? &context->context : NULL), +#if GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE + float_state_(context ? &context->float_state : NULL), +#endif + dumper_(dumper), + mapping_list_(mappings), + skip_dump_if_principal_mapping_not_referenced_( + skip_dump_if_principal_mapping_not_referenced), + address_within_principal_mapping_(address_within_principal_mapping), + sanitize_stack_(sanitize_stack), + microdump_extra_info_(microdump_extra_info), + log_line_(NULL), + stack_copy_(NULL), + stack_len_(0), + stack_lower_bound_(0), + stack_pointer_(0) { + log_line_ = reinterpret_cast(Alloc(kLineBufferSize)); + if (log_line_) + log_line_[0] = '\0'; // Clear out the log line buffer. + } + + ~MicrodumpWriter() { dumper_->ThreadsResume(); } + + bool Init() { + // In the exceptional case where the system was out of memory and there + // wasn't even room to allocate the line buffer, bail out. There is nothing + // useful we can possibly achieve without the ability to Log. At least let's + // try to not crash. + if (!dumper_->Init() || !log_line_) + return false; + return dumper_->ThreadsSuspend() && dumper_->LateInit(); + } + + void Dump() { + CaptureResult stack_capture_result = CaptureCrashingThreadStack(-1); + if (stack_capture_result == CAPTURE_UNINTERESTING) { + LogLine("Microdump skipped (uninteresting)"); + return; + } + + LogLine("-----BEGIN BREAKPAD MICRODUMP-----"); + DumpProductInformation(); + DumpOSInformation(); + DumpProcessType(); + DumpCrashReason(); + DumpGPUInformation(); +#if !defined(__LP64__) + DumpFreeSpace(); +#endif + if (stack_capture_result == CAPTURE_OK) + DumpThreadStack(); + DumpCPUState(); + DumpMappings(); + LogLine("-----END BREAKPAD MICRODUMP-----"); + } + + private: + enum CaptureResult { CAPTURE_OK, CAPTURE_FAILED, CAPTURE_UNINTERESTING }; + + // Writes one line to the system log. + void LogLine(const char* msg) { +#if defined(__ANDROID__) + logger::writeToCrashLog(msg); +#else + logger::write(msg, my_strlen(msg)); + logger::write("\n", 1); +#endif + } + + // Stages the given string in the current line buffer. + void LogAppend(const char* str) { + my_strlcat(log_line_, str, kLineBufferSize); + } + + // As above (required to take precedence over template specialization below). + void LogAppend(char* str) { + LogAppend(const_cast(str)); + } + + // Stages the hex repr. of the given int type in the current line buffer. + template + void LogAppend(T value) { + // Make enough room to hex encode the largest int type + NUL. + static const char HEX[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F'}; + char hexstr[sizeof(T) * 2 + 1]; + for (int i = sizeof(T) * 2 - 1; i >= 0; --i, value >>= 4) + hexstr[i] = HEX[static_cast(value) & 0x0F]; + hexstr[sizeof(T) * 2] = '\0'; + LogAppend(hexstr); + } + + // Stages the buffer content hex-encoded in the current line buffer. + void LogAppend(const void* buf, size_t length) { + const uint8_t* ptr = reinterpret_cast(buf); + for (size_t i = 0; i < length; ++i, ++ptr) + LogAppend(*ptr); + } + + // Writes out the current line buffer on the system log. + void LogCommitLine() { + LogLine(log_line_); + log_line_[0] = 0; + } + + CaptureResult CaptureCrashingThreadStack(int max_stack_len) { + stack_pointer_ = UContextReader::GetStackPointer(ucontext_); + + if (!dumper_->GetStackInfo(reinterpret_cast(&stack_lower_bound_), + &stack_len_, stack_pointer_)) { + return CAPTURE_FAILED; + } + + if (max_stack_len >= 0 && + stack_len_ > static_cast(max_stack_len)) { + stack_len_ = max_stack_len; + } + + stack_copy_ = reinterpret_cast(Alloc(stack_len_)); + dumper_->CopyFromProcess(stack_copy_, dumper_->crash_thread(), + reinterpret_cast(stack_lower_bound_), + stack_len_); + + if (!skip_dump_if_principal_mapping_not_referenced_) return CAPTURE_OK; + + const MappingInfo* principal_mapping = + dumper_->FindMappingNoBias(address_within_principal_mapping_); + if (!principal_mapping) return CAPTURE_UNINTERESTING; + + uintptr_t low_addr = principal_mapping->system_mapping_info.start_addr; + uintptr_t high_addr = principal_mapping->system_mapping_info.end_addr; + uintptr_t pc = UContextReader::GetInstructionPointer(ucontext_); + if (low_addr <= pc && pc <= high_addr) return CAPTURE_OK; + + if (dumper_->StackHasPointerToMapping(stack_copy_, stack_len_, + stack_pointer_ - stack_lower_bound_, + *principal_mapping)) { + return CAPTURE_OK; + } + return CAPTURE_UNINTERESTING; + } + + void DumpProductInformation() { + LogAppend("V "); + if (microdump_extra_info_.product_info) { + LogAppend(microdump_extra_info_.product_info); + } else { + LogAppend("UNKNOWN:0.0.0.0"); + } + LogCommitLine(); + } + + void DumpProcessType() { + LogAppend("P "); + if (microdump_extra_info_.process_type) { + LogAppend(microdump_extra_info_.process_type); + } else { + LogAppend("UNKNOWN"); + } + LogCommitLine(); + } + + void DumpCrashReason() { + LogAppend("R "); + LogAppend(dumper_->crash_signal()); + LogAppend(" "); + LogAppend(dumper_->GetCrashSignalString()); + LogAppend(" "); + LogAppend(dumper_->crash_address()); + LogCommitLine(); + } + + void DumpOSInformation() { + const uint8_t n_cpus = static_cast(sysconf(_SC_NPROCESSORS_CONF)); + +#if defined(__ANDROID__) + const char kOSId[] = "A"; +#else + const char kOSId[] = "L"; +#endif + +// Dump the runtime architecture. On multiarch devices it might not match the +// hw architecture (the one returned by uname()), for instance in the case of +// a 32-bit app running on a aarch64 device. +#if defined(__aarch64__) + const char kArch[] = "arm64"; +#elif defined(__ARMEL__) + const char kArch[] = "arm"; +#elif defined(__x86_64__) + const char kArch[] = "x86_64"; +#elif defined(__i386__) + const char kArch[] = "x86"; +#elif defined(__mips__) +# if _MIPS_SIM == _ABIO32 + const char kArch[] = "mips"; +# elif _MIPS_SIM == _ABI64 + const char kArch[] = "mips64"; +# else +# error "This mips ABI is currently not supported (n32)" +# endif +#elif defined(__riscv) +# if __riscv_xlen == 32 + const char kArch[] = "riscv32"; +# elif __riscv_xlen == 64 + const char kArch[] = "riscv64"; +# else +# error "Unexpected __riscv_xlen" +# endif +#else +# error "This code has not been ported to your platform yet" +#endif + + LogAppend("O "); + LogAppend(kOSId); + LogAppend(" "); + LogAppend(kArch); + LogAppend(" "); + LogAppend(n_cpus); + LogAppend(" "); + + // Dump the HW architecture (e.g., armv7l, aarch64). + struct utsname uts; + const bool has_uts_info = (uname(&uts) == 0); + const char* hwArch = has_uts_info ? uts.machine : "unknown_hw_arch"; + LogAppend(hwArch); + LogAppend(" "); + + // If the client has attached a build fingerprint to the MinidumpDescriptor + // use that one. Otherwise try to get some basic info from uname(). + if (microdump_extra_info_.build_fingerprint) { + LogAppend(microdump_extra_info_.build_fingerprint); + } else if (has_uts_info) { + LogAppend(uts.release); + LogAppend(" "); + LogAppend(uts.version); + } else { + LogAppend("no build fingerprint available"); + } + LogCommitLine(); + } + + void DumpGPUInformation() { + LogAppend("G "); + if (microdump_extra_info_.gpu_fingerprint) { + LogAppend(microdump_extra_info_.gpu_fingerprint); + } else { + LogAppend("UNKNOWN"); + } + LogCommitLine(); + } + + void DumpThreadStack() { + if (sanitize_stack_) { + dumper_->SanitizeStackCopy(stack_copy_, stack_len_, stack_pointer_, + stack_pointer_ - stack_lower_bound_); + } + + LogAppend("S 0 "); + LogAppend(stack_pointer_); + LogAppend(" "); + LogAppend(stack_lower_bound_); + LogAppend(" "); + LogAppend(stack_len_); + LogCommitLine(); + + const size_t STACK_DUMP_CHUNK_SIZE = 384; + for (size_t stack_off = 0; stack_off < stack_len_; + stack_off += STACK_DUMP_CHUNK_SIZE) { + LogAppend("S "); + LogAppend(stack_lower_bound_ + stack_off); + LogAppend(" "); + LogAppend(stack_copy_ + stack_off, + std::min(STACK_DUMP_CHUNK_SIZE, stack_len_ - stack_off)); + LogCommitLine(); + } + } + + void DumpCPUState() { + RawContextCPU cpu; + my_memset(&cpu, 0, sizeof(RawContextCPU)); +#if GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE + UContextReader::FillCPUContext(&cpu, ucontext_, float_state_); +#else + UContextReader::FillCPUContext(&cpu, ucontext_); +#endif + LogAppend("C "); + LogAppend(&cpu, sizeof(cpu)); + LogCommitLine(); + } + + // If there is caller-provided information about this mapping + // in the mapping_list_ list, return true. Otherwise, return false. + bool HaveMappingInfo(const MappingInfo& mapping) { + for (MappingList::const_iterator iter = mapping_list_.begin(); + iter != mapping_list_.end(); + ++iter) { + // Ignore any mappings that are wholly contained within + // mappings in the mapping_info_ list. + if (mapping.start_addr >= iter->first.start_addr && + (mapping.start_addr + mapping.size) <= + (iter->first.start_addr + iter->first.size)) { + return true; + } + } + return false; + } + + // Dump information about the provided |mapping|. If |identifier| is non-NULL, + // use it instead of calculating a file ID from the mapping. + void DumpModule(const MappingInfo& mapping, + bool member, + unsigned int mapping_id, + const uint8_t* identifier) { + + auto_wasteful_vector identifier_bytes( + dumper_->allocator()); + + if (identifier) { + // GUID was provided by caller. + identifier_bytes.insert(identifier_bytes.end(), + identifier, + identifier + sizeof(MDGUID)); + } else { + dumper_->ElfFileIdentifierForMapping( + mapping, + member, + mapping_id, + identifier_bytes); + } + + // Copy as many bytes of |identifier| as will fit into a MDGUID + MDGUID module_identifier = {0}; + memcpy(&module_identifier, &identifier_bytes[0], + std::min(sizeof(MDGUID), identifier_bytes.size())); + + char file_name[NAME_MAX]; + char file_path[NAME_MAX]; + dumper_->GetMappingEffectiveNameAndPath( + mapping, file_path, sizeof(file_path), file_name, sizeof(file_name)); + + LogAppend("M "); + LogAppend(static_cast(mapping.start_addr)); + LogAppend(" "); + LogAppend(mapping.offset); + LogAppend(" "); + LogAppend(mapping.size); + LogAppend(" "); + LogAppend(module_identifier.data1); + LogAppend(module_identifier.data2); + LogAppend(module_identifier.data3); + LogAppend(module_identifier.data4[0]); + LogAppend(module_identifier.data4[1]); + LogAppend(module_identifier.data4[2]); + LogAppend(module_identifier.data4[3]); + LogAppend(module_identifier.data4[4]); + LogAppend(module_identifier.data4[5]); + LogAppend(module_identifier.data4[6]); + LogAppend(module_identifier.data4[7]); + LogAppend("0 "); // Age is always 0 on Linux. + LogAppend(file_name); + LogCommitLine(); + } + +#if !defined(__LP64__) + void DumpFreeSpace() { + const MappingInfo* stack_mapping = nullptr; + ThreadInfo info; + if (dumper_->GetThreadInfoByIndex(dumper_->GetMainThreadIndex(), &info)) { + stack_mapping = dumper_->FindMappingNoBias(info.stack_pointer); + } + + const google_breakpad::wasteful_vector& mappings = + dumper_->mappings(); + if (mappings.size() == 0) return; + + // This is complicated by the fact that mappings is not in order. It should + // be mostly in order, however the mapping that contains the entry point for + // the process is always at the front of the vector. + + static const int HBITS = sizeof(size_t) * 8; + size_t hole_histogram[HBITS]; + my_memset(hole_histogram, 0, sizeof(hole_histogram)); + + // Find the lowest address mapping. + size_t curr = 0; + for (size_t i = 1; i < mappings.size(); ++i) { + if (mappings[i]->start_addr < mappings[curr]->start_addr) curr = i; + } + + uintptr_t lo_addr = mappings[curr]->start_addr; + + size_t hole_cnt = 0; + size_t hole_max = 0; + size_t hole_sum = 0; + + while (true) { + // Skip to the end of an adjacent run of mappings. This is an optimization + // for the fact that mappings is mostly sorted. + while (curr != mappings.size() - 1 && + MappingsAreAdjacent(*mappings[curr], *mappings[curr + 1])) { + ++curr; + } + + if (mappings[curr] == stack_mapping) { + // Because we can't determine the top of userspace mappable + // memory we treat the start of the process stack as the top + // of the allocatable address space. Once we reach + // |stack_mapping| we are done scanning for free space regions. + break; + } + + size_t next = NextOrderedMapping(mappings, curr); + if (next == std::numeric_limits::max()) + break; + + uintptr_t hole_lo = mappings[curr]->start_addr + mappings[curr]->size; + uintptr_t hole_hi = mappings[next]->start_addr; + + if (hole_hi > hole_lo) { + size_t hole_sz = hole_hi - hole_lo; + hole_sum += hole_sz; + hole_max = std::max(hole_sz, hole_max); + ++hole_cnt; + ++hole_histogram[Log2Floor(hole_sz)]; + } + curr = next; + } + + uintptr_t hi_addr = mappings[curr]->start_addr + mappings[curr]->size; + + LogAppend("H "); + LogAppend(lo_addr); + LogAppend(" "); + LogAppend(hi_addr); + LogAppend(" "); + LogAppend(saturated_cast(hole_cnt)); + LogAppend(" "); + LogAppend(hole_max); + LogAppend(" "); + LogAppend(hole_sum); + for (unsigned int i = 0; i < HBITS; ++i) { + if (!hole_histogram[i]) continue; + LogAppend(" "); + LogAppend(saturated_cast(i)); + LogAppend(":"); + LogAppend(saturated_cast(hole_histogram[i])); + } + LogCommitLine(); + } +#endif + + // Write information about the mappings in effect. + void DumpMappings() { + // First write all the mappings from the dumper + for (unsigned i = 0; i < dumper_->mappings().size(); ++i) { + const MappingInfo& mapping = *dumper_->mappings()[i]; + if (mapping.name[0] == 0 || // only want modules with filenames. + !mapping.exec || // only want executable mappings. + mapping.size < 4096 || // too small to get a signature for. + HaveMappingInfo(mapping)) { + continue; + } + + DumpModule(mapping, true, i, NULL); + } + // Next write all the mappings provided by the caller + for (MappingList::const_iterator iter = mapping_list_.begin(); + iter != mapping_list_.end(); + ++iter) { + DumpModule(iter->first, false, 0, iter->second); + } + } + + void* Alloc(unsigned bytes) { return dumper_->allocator()->Alloc(bytes); } + + const ucontext_t* const ucontext_; +#if GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE + const google_breakpad::fpstate_t* const float_state_; +#endif + LinuxDumper* dumper_; + const MappingList& mapping_list_; + bool skip_dump_if_principal_mapping_not_referenced_; + uintptr_t address_within_principal_mapping_; + bool sanitize_stack_; + const MicrodumpExtraInfo microdump_extra_info_; + char* log_line_; + + // The local copy of crashed process stack memory, beginning at + // |stack_lower_bound_|. + uint8_t* stack_copy_; + + // The length of crashed process stack copy. + size_t stack_len_; + + // The address of the page containing the stack pointer in the + // crashed process. |stack_lower_bound_| <= |stack_pointer_| + uintptr_t stack_lower_bound_; + + // The stack pointer of the crashed thread. + uintptr_t stack_pointer_; +}; +} // namespace + +namespace google_breakpad { + +bool WriteMicrodump(pid_t crashing_process, + const void* blob, + size_t blob_size, + const MappingList& mappings, + bool skip_dump_if_principal_mapping_not_referenced, + uintptr_t address_within_principal_mapping, + bool sanitize_stack, + const MicrodumpExtraInfo& microdump_extra_info) { + LinuxPtraceDumper dumper(crashing_process); + const ExceptionHandler::CrashContext* context = NULL; + if (blob) { + if (blob_size != sizeof(ExceptionHandler::CrashContext)) + return false; + context = reinterpret_cast(blob); + dumper.SetCrashInfoFromSigInfo(context->siginfo); + dumper.set_crash_thread(context->tid); + } + MicrodumpWriter writer(context, mappings, + skip_dump_if_principal_mapping_not_referenced, + address_within_principal_mapping, sanitize_stack, + microdump_extra_info, &dumper); + if (!writer.Init()) + return false; + writer.Dump(); + return true; +} + +} // namespace google_breakpad diff --git a/src/client/linux/microdump_writer/microdump_writer.h b/src/client/linux/microdump_writer/microdump_writer.h new file mode 100644 index 0000000..47b03e8 --- /dev/null +++ b/src/client/linux/microdump_writer/microdump_writer.h @@ -0,0 +1,67 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MICRODUMP_WRITER_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_MICRODUMP_WRITER_H_ + +#include +#include + +#include "client/linux/dump_writer_common/mapping_info.h" + +namespace google_breakpad { + +struct MicrodumpExtraInfo; + +// Writes a microdump (a reduced dump containing only the state of the crashing +// thread) on the console (logcat on Android). These functions do not malloc nor +// use libc functions which may. Thus, it can be used in contexts where the +// state of the heap may be corrupt. +// Args: +// crashing_process: the pid of the crashing process. This must be trusted. +// blob: a blob of data from the crashing process. See exception_handler.h +// blob_size: the length of |blob| in bytes. +// mappings: a list of additional mappings provided by the application. +// build_fingerprint: a (optional) C string which determines the OS +// build fingerprint (e.g., aosp/occam/mako:5.1.1/LMY47W/1234:eng/dev-keys). +// product_info: a (optional) C string which determines the product name and +// version (e.g., WebView:42.0.2311.136). +// +// Returns true iff successful. +bool WriteMicrodump(pid_t crashing_process, + const void* blob, + size_t blob_size, + const MappingList& mappings, + bool skip_dump_if_main_module_not_referenced, + uintptr_t address_within_main_module, + bool sanitize_stack, + const MicrodumpExtraInfo& microdump_extra_info); + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_MINIDUMP_WRITER_MICRODUMP_WRITER_H_ diff --git a/src/client/linux/microdump_writer/microdump_writer_unittest.cc b/src/client/linux/microdump_writer/microdump_writer_unittest.cc new file mode 100644 index 0000000..b1d570e --- /dev/null +++ b/src/client/linux/microdump_writer/microdump_writer_unittest.cc @@ -0,0 +1,424 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "client/linux/handler/exception_handler.h" +#include "client/linux/handler/microdump_extra_info.h" +#include "client/linux/microdump_writer/microdump_writer.h" +#include "common/linux/breakpad_getcontext.h" +#include "common/linux/eintr_wrapper.h" +#include "common/linux/ignore_ret.h" +#include "common/scoped_ptr.h" +#include "common/tests/auto_tempdir.h" +#include "common/using_std_string.h" + +using namespace google_breakpad; + +extern "C" { +extern char __executable_start; +extern char __etext; +} + +namespace { + +typedef testing::Test MicrodumpWriterTest; + +MicrodumpExtraInfo MakeMicrodumpExtraInfo( + const char* build_fingerprint, + const char* product_info, + const char* gpu_fingerprint) { + MicrodumpExtraInfo info; + info.build_fingerprint = build_fingerprint; + info.product_info = product_info; + info.gpu_fingerprint = gpu_fingerprint; + info.process_type = "Browser"; + return info; +} + +bool ContainsMicrodump(const std::string& buf) { + return std::string::npos != buf.find("-----BEGIN BREAKPAD MICRODUMP-----") && + std::string::npos != buf.find("-----END BREAKPAD MICRODUMP-----"); +} + +const char kIdentifiableString[] = "_IDENTIFIABLE_"; +const uintptr_t kCrashAddress = 0xdeaddeadu; + +void CrashAndGetMicrodump(const MappingList& mappings, + const MicrodumpExtraInfo& microdump_extra_info, + std::string* microdump, + bool skip_dump_if_principal_mapping_not_referenced = false, + uintptr_t address_within_principal_mapping = 0, + bool sanitize_stack = false) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + AutoTempDir temp_dir; + string stderr_file = temp_dir.path() + "/stderr.log"; + int err_fd = open(stderr_file.c_str(), O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); + ASSERT_NE(-1, err_fd); + + char identifiable_string[sizeof(kIdentifiableString)]; + + // This string should not appear in the resulting microdump if it + // has been sanitized. + strcpy(identifiable_string, kIdentifiableString); + // Force the strcpy to not be optimized away. + IGNORE_RET(write(STDOUT_FILENO, identifiable_string, 0)); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + IGNORE_RET(HANDLE_EINTR(read(fds[0], &b, sizeof(b)))); + close(fds[0]); + syscall(__NR_exit); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + memset(&context, 0, sizeof(context)); + // Pretend the current context is the child context (which is + // approximately right) so that we have a valid stack pointer, and + // can fetch child stack data via ptrace. + getcontext(&context.context); + // Set a non-zero tid to avoid tripping asserts. + context.tid = child; + context.siginfo.si_signo = MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED; + context.siginfo.si_addr = reinterpret_cast(kCrashAddress); + + // Redirect temporarily stderr to the stderr.log file. + int save_err = dup(STDERR_FILENO); + ASSERT_NE(-1, save_err); + ASSERT_NE(-1, dup2(err_fd, STDERR_FILENO)); + + ASSERT_TRUE(WriteMicrodump(child, &context, sizeof(context), mappings, + skip_dump_if_principal_mapping_not_referenced, + address_within_principal_mapping, sanitize_stack, + microdump_extra_info)); + + // Revert stderr back to the console. + dup2(save_err, STDERR_FILENO); + close(save_err); + + // Read back the stderr file and check for the microdump marker. + fsync(err_fd); + lseek(err_fd, 0, SEEK_SET); + + microdump->clear(); + char buf[1024]; + + while (true) { + int bytes_read = IGNORE_EINTR(read(err_fd, buf, 1024)); + if (bytes_read <= 0) break; + microdump->append(buf, buf + bytes_read); + } + close(err_fd); + close(fds[1]); +} + +void ExtractMicrodumpStackContents(const string& microdump_content, + string* result) { + std::istringstream iss(microdump_content); + result->clear(); + for (string line; std::getline(iss, line);) { + if (line.find("S ") == 0) { + std::istringstream stack_data(line); + std::string key; + std::string addr; + std::string data; + stack_data >> key >> addr >> data; + EXPECT_TRUE((data.size() & 1u) == 0u); + result->reserve(result->size() + data.size() / 2); + for (size_t i = 0; i < data.size(); i += 2) { + std::string byte = data.substr(i, 2); + result->push_back(static_cast(strtoul(byte.c_str(), NULL, 16))); + } + } + } +} + +void CheckMicrodumpContents(const string& microdump_content, + const MicrodumpExtraInfo& expected_info) { + std::istringstream iss(microdump_content); + bool did_find_os_info = false; + bool did_find_product_info = false; + bool did_find_process_type = false; + bool did_find_crash_reason = false; + bool did_find_gpu_info = false; + for (string line; std::getline(iss, line);) { + if (line.find("O ") == 0) { + std::istringstream os_info_tokens(line); + string token; + os_info_tokens.ignore(2); // Ignore the "O " preamble. + // Check the OS descriptor char (L=Linux, A=Android). + os_info_tokens >> token; + ASSERT_TRUE(token == "L" || token == "A"); + + os_info_tokens >> token; // HW architecture. + os_info_tokens >> token; // Number of cpus. + for (size_t i = 0; i < token.size(); ++i) + ASSERT_TRUE(isxdigit(token[i])); + os_info_tokens >> token; // SW architecture. + + // Check that the build fingerprint is in the right place. + os_info_tokens >> token; + ASSERT_FALSE(os_info_tokens.fail()); + if (expected_info.build_fingerprint) + ASSERT_EQ(expected_info.build_fingerprint, token); + did_find_os_info = true; + } else if (line.find("P ") == 0) { + if (expected_info.process_type) + ASSERT_EQ(string("P ") + expected_info.process_type, line); + did_find_process_type = true; + } else if (line.find("R ") == 0) { + std::istringstream crash_reason_tokens(line); + string token; + unsigned crash_reason; + string crash_reason_str; + uintptr_t crash_address; + crash_reason_tokens.ignore(2); // Ignore the "R " preamble. + crash_reason_tokens >> std::hex >> crash_reason >> crash_reason_str >> + crash_address; + ASSERT_FALSE(crash_reason_tokens.fail()); + ASSERT_EQ(MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED, crash_reason); + ASSERT_EQ("DUMP_REQUESTED", crash_reason_str); + ASSERT_EQ(kCrashAddress, crash_address); + did_find_crash_reason = true; + } else if (line.find("V ") == 0) { + if (expected_info.product_info) + ASSERT_EQ(string("V ") + expected_info.product_info, line); + did_find_product_info = true; + } else if (line.find("G ") == 0) { + if (expected_info.gpu_fingerprint) + ASSERT_EQ(string("G ") + expected_info.gpu_fingerprint, line); + did_find_gpu_info = true; + } + } + ASSERT_TRUE(did_find_os_info); + ASSERT_TRUE(did_find_product_info); + ASSERT_TRUE(did_find_process_type); + ASSERT_TRUE(did_find_crash_reason); + ASSERT_TRUE(did_find_gpu_info); +} + +bool MicrodumpStackContains(const string& microdump_content, + const string& expected_content) { + string result; + ExtractMicrodumpStackContents(microdump_content, &result); + return result.find(kIdentifiableString) != string::npos; +} + +void CheckMicrodumpContents(const string& microdump_content, + const string& expected_fingerprint, + const string& expected_product_info, + const string& expected_gpu_fingerprint) { + CheckMicrodumpContents( + microdump_content, + MakeMicrodumpExtraInfo(expected_fingerprint.c_str(), + expected_product_info.c_str(), + expected_gpu_fingerprint.c_str())); +} + +TEST(MicrodumpWriterTest, BasicWithMappings) { + // Push some extra mapping to check the MappingList logic. + const uint32_t memory_size = sysconf(_SC_PAGESIZE); + const char* kMemoryName = "libfoo.so"; + const uint8_t kModuleGUID[sizeof(MDGUID)] = { + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF + }; + + MappingInfo info; + info.start_addr = memory_size; + info.size = memory_size; + info.offset = 42; + strcpy(info.name, kMemoryName); + + MappingList mappings; + MappingEntry mapping; + mapping.first = info; + memcpy(mapping.second, kModuleGUID, sizeof(MDGUID)); + mappings.push_back(mapping); + + std::string buf; + CrashAndGetMicrodump(mappings, MicrodumpExtraInfo(), &buf); + ASSERT_TRUE(ContainsMicrodump(buf)); + +#ifdef __LP64__ + ASSERT_NE(std::string::npos, + buf.find("M 0000000000001000 000000000000002A 0000000000001000 " + "33221100554477668899AABBCCDDEEFF0 libfoo.so")); +#else + ASSERT_NE(std::string::npos, + buf.find("M 00001000 0000002A 00001000 " + "33221100554477668899AABBCCDDEEFF0 libfoo.so")); +#endif + + // In absence of a product info in the minidump, the writer should just write + // an unknown marker. + ASSERT_NE(std::string::npos, buf.find("V UNKNOWN:0.0.0.0")); +} + +// Ensure that no output occurs if the interest region is set, but +// doesn't overlap anything on the stack. +TEST(MicrodumpWriterTest, NoOutputIfUninteresting) { + const char kProductInfo[] = "MockProduct:42.0.2311.99"; + const char kBuildFingerprint[] = + "aosp/occam/mako:5.1.1/LMY47W/12345678:userdegbug/dev-keys"; + const char kGPUFingerprint[] = + "Qualcomm;Adreno (TM) 330;OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)"; + const MicrodumpExtraInfo kMicrodumpExtraInfo( + MakeMicrodumpExtraInfo(kBuildFingerprint, kProductInfo, kGPUFingerprint)); + + std::string buf; + MappingList no_mappings; + + CrashAndGetMicrodump(no_mappings, kMicrodumpExtraInfo, &buf, true, 0); + ASSERT_FALSE(ContainsMicrodump(buf)); +} + +// Ensure that stack content does not contain an identifiable string if the +// stack is sanitized. +TEST(MicrodumpWriterTest, StringRemovedBySanitization) { + const char kProductInfo[] = "MockProduct:42.0.2311.99"; + const char kBuildFingerprint[] = + "aosp/occam/mako:5.1.1/LMY47W/12345678:userdegbug/dev-keys"; + const char kGPUFingerprint[] = + "Qualcomm;Adreno (TM) 330;OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)"; + + const MicrodumpExtraInfo kMicrodumpExtraInfo( + MakeMicrodumpExtraInfo(kBuildFingerprint, kProductInfo, kGPUFingerprint)); + + std::string buf; + MappingList no_mappings; + + CrashAndGetMicrodump(no_mappings, kMicrodumpExtraInfo, &buf, false, 0u, true); + ASSERT_TRUE(ContainsMicrodump(buf)); + ASSERT_FALSE(MicrodumpStackContains(buf, kIdentifiableString)); +} + +// Ensure that stack content does contain an identifiable string if the +// stack is not sanitized. +TEST(MicrodumpWriterTest, StringPresentIfNotSanitized) { + const char kProductInfo[] = "MockProduct:42.0.2311.99"; + const char kBuildFingerprint[] = + "aosp/occam/mako:5.1.1/LMY47W/12345678:userdegbug/dev-keys"; + const char kGPUFingerprint[] = + "Qualcomm;Adreno (TM) 330;OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)"; + + const MicrodumpExtraInfo kMicrodumpExtraInfo( + MakeMicrodumpExtraInfo(kBuildFingerprint, kProductInfo, kGPUFingerprint)); + + std::string buf; + MappingList no_mappings; + + CrashAndGetMicrodump(no_mappings, kMicrodumpExtraInfo, &buf, false, 0u, false); + ASSERT_TRUE(ContainsMicrodump(buf)); + ASSERT_TRUE(MicrodumpStackContains(buf, kIdentifiableString)); +} + +// Ensure that output occurs if the interest region is set, and +// does overlap something on the stack. +TEST(MicrodumpWriterTest, OutputIfInteresting) { + const char kProductInfo[] = "MockProduct:42.0.2311.99"; + const char kBuildFingerprint[] = + "aosp/occam/mako:5.1.1/LMY47W/12345678:userdegbug/dev-keys"; + const char kGPUFingerprint[] = + "Qualcomm;Adreno (TM) 330;OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)"; + + const MicrodumpExtraInfo kMicrodumpExtraInfo( + MakeMicrodumpExtraInfo(kBuildFingerprint, kProductInfo, kGPUFingerprint)); + + std::string buf; + MappingList no_mappings; + + CrashAndGetMicrodump(no_mappings, kMicrodumpExtraInfo, &buf, true, + reinterpret_cast(CrashAndGetMicrodump)); + ASSERT_TRUE(ContainsMicrodump(buf)); +} + +// Ensure that the product info and build fingerprint metadata show up in the +// final microdump if present. +TEST(MicrodumpWriterTest, BuildFingerprintAndProductInfo) { + const char kProductInfo[] = "MockProduct:42.0.2311.99"; + const char kBuildFingerprint[] = + "aosp/occam/mako:5.1.1/LMY47W/12345678:userdegbug/dev-keys"; + const char kGPUFingerprint[] = + "Qualcomm;Adreno (TM) 330;OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)"; + const MicrodumpExtraInfo kMicrodumpExtraInfo( + MakeMicrodumpExtraInfo(kBuildFingerprint, kProductInfo, kGPUFingerprint)); + std::string buf; + MappingList no_mappings; + + CrashAndGetMicrodump(no_mappings, kMicrodumpExtraInfo, &buf); + ASSERT_TRUE(ContainsMicrodump(buf)); + CheckMicrodumpContents(buf, kMicrodumpExtraInfo); +} + +TEST(MicrodumpWriterTest, NoProductInfo) { + const char kBuildFingerprint[] = "foobar"; + const char kGPUFingerprint[] = "bazqux"; + std::string buf; + MappingList no_mappings; + + const MicrodumpExtraInfo kMicrodumpExtraInfoNoProductInfo( + MakeMicrodumpExtraInfo(kBuildFingerprint, NULL, kGPUFingerprint)); + + CrashAndGetMicrodump(no_mappings, kMicrodumpExtraInfoNoProductInfo, &buf); + ASSERT_TRUE(ContainsMicrodump(buf)); + CheckMicrodumpContents(buf, kBuildFingerprint, "UNKNOWN:0.0.0.0", + kGPUFingerprint); +} + +TEST(MicrodumpWriterTest, NoGPUInfo) { + const char kProductInfo[] = "bazqux"; + const char kBuildFingerprint[] = "foobar"; + std::string buf; + MappingList no_mappings; + + const MicrodumpExtraInfo kMicrodumpExtraInfoNoGPUInfo( + MakeMicrodumpExtraInfo(kBuildFingerprint, kProductInfo, NULL)); + + CrashAndGetMicrodump(no_mappings, kMicrodumpExtraInfoNoGPUInfo, &buf); + ASSERT_TRUE(ContainsMicrodump(buf)); + CheckMicrodumpContents(buf, kBuildFingerprint, kProductInfo, "UNKNOWN"); +} +} // namespace diff --git a/src/client/linux/minidump_writer/cpu_set.h b/src/client/linux/minidump_writer/cpu_set.h new file mode 100644 index 0000000..70c1c75 --- /dev/null +++ b/src/client/linux/minidump_writer/cpu_set.h @@ -0,0 +1,143 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_CPU_SET_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_CPU_SET_H_ + +#include +#include +#include + +#include "common/linux/linux_libc_support.h" +#include "third_party/lss/linux_syscall_support.h" + +namespace google_breakpad { + +// Helper class used to model a set of CPUs, as read from sysfs +// files like /sys/devices/system/cpu/present +// See See http://www.kernel.org/doc/Documentation/cputopology.txt +class CpuSet { +public: + // The maximum number of supported CPUs. + static const size_t kMaxCpus = 1024; + + CpuSet() { + my_memset(mask_, 0, sizeof(mask_)); + } + + // Parse a sysfs file to extract the corresponding CPU set. + bool ParseSysFile(int fd) { + char buffer[512]; + int ret = sys_read(fd, buffer, sizeof(buffer)-1); + if (ret < 0) + return false; + + buffer[ret] = '\0'; + + // Expected format: comma-separated list of items, where each + // item can be a decimal integer, or two decimal integers separated + // by a dash. + // E.g.: + // 0 + // 0,1,2,3 + // 0-3 + // 1,10-23 + const char* p = buffer; + const char* p_end = p + ret; + while (p < p_end) { + // Skip leading space, if any + while (p < p_end && my_isspace(*p)) + p++; + + // Find start and size of current item. + const char* item = p; + size_t item_len = static_cast(p_end - p); + const char* item_next = + static_cast(my_memchr(p, ',', item_len)); + if (item_next != NULL) { + p = item_next + 1; + item_len = static_cast(item_next - item); + } else { + p = p_end; + item_next = p_end; + } + + // Ignore trailing spaces. + while (item_next > item && my_isspace(item_next[-1])) + item_next--; + + // skip empty items. + if (item_next == item) + continue; + + // read first decimal value. + uintptr_t start = 0; + const char* next = my_read_decimal_ptr(&start, item); + uintptr_t end = start; + if (*next == '-') + my_read_decimal_ptr(&end, next+1); + + while (start <= end) + SetBit(start++); + } + return true; + } + + // Intersect this CPU set with another one. + void IntersectWith(const CpuSet& other) { + for (size_t nn = 0; nn < kMaskWordCount; ++nn) + mask_[nn] &= other.mask_[nn]; + } + + // Return the number of CPUs in this set. + int GetCount() { + int result = 0; + for (size_t nn = 0; nn < kMaskWordCount; ++nn) { + result += __builtin_popcount(mask_[nn]); + } + return result; + } + +private: + void SetBit(uintptr_t index) { + size_t nn = static_cast(index); + if (nn < kMaxCpus) + mask_[nn / kMaskWordBits] |= (1U << (nn % kMaskWordBits)); + } + + typedef uint32_t MaskWordType; + static const size_t kMaskWordBits = 8*sizeof(MaskWordType); + static const size_t kMaskWordCount = + (kMaxCpus + kMaskWordBits - 1) / kMaskWordBits; + + MaskWordType mask_[kMaskWordCount]; +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_MINIDUMP_WRITER_CPU_SET_H_ diff --git a/src/client/linux/minidump_writer/cpu_set_unittest.cc b/src/client/linux/minidump_writer/cpu_set_unittest.cc new file mode 100644 index 0000000..b99e98d --- /dev/null +++ b/src/client/linux/minidump_writer/cpu_set_unittest.cc @@ -0,0 +1,163 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "client/linux/minidump_writer/cpu_set.h" +#include "common/linux/scoped_tmpfile.h" + +using namespace google_breakpad; + +namespace { + +typedef testing::Test CpuSetTest; + +} + +TEST(CpuSetTest, EmptyCount) { + CpuSet set; + ASSERT_EQ(0, set.GetCount()); +} + +TEST(CpuSetTest, OneCpu) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("10")); + + CpuSet set; + ASSERT_TRUE(set.ParseSysFile(file.GetFd())); + ASSERT_EQ(1, set.GetCount()); +} + +TEST(CpuSetTest, OneCpuTerminated) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("10\n")); + + CpuSet set; + ASSERT_TRUE(set.ParseSysFile(file.GetFd())); + ASSERT_EQ(1, set.GetCount()); +} + +TEST(CpuSetTest, TwoCpusWithComma) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("1,10")); + + CpuSet set; + ASSERT_TRUE(set.ParseSysFile(file.GetFd())); + ASSERT_EQ(2, set.GetCount()); +} + +TEST(CpuSetTest, TwoCpusWithRange) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("1-2")); + + CpuSet set; + ASSERT_TRUE(set.ParseSysFile(file.GetFd())); + ASSERT_EQ(2, set.GetCount()); +} + +TEST(CpuSetTest, TenCpusWithRange) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("9-18")); + + CpuSet set; + ASSERT_TRUE(set.ParseSysFile(file.GetFd())); + ASSERT_EQ(10, set.GetCount()); +} + +TEST(CpuSetTest, MultiItems) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("0, 2-4, 128")); + + CpuSet set; + ASSERT_TRUE(set.ParseSysFile(file.GetFd())); + ASSERT_EQ(5, set.GetCount()); +} + +TEST(CpuSetTest, IntersectWith) { + ScopedTmpFile file1; + ASSERT_TRUE(file1.InitString("9-19")); + + CpuSet set1; + ASSERT_TRUE(set1.ParseSysFile(file1.GetFd())); + ASSERT_EQ(11, set1.GetCount()); + + ScopedTmpFile file2; + ASSERT_TRUE(file2.InitString("16-24")); + + CpuSet set2; + ASSERT_TRUE(set2.ParseSysFile(file2.GetFd())); + ASSERT_EQ(9, set2.GetCount()); + + set1.IntersectWith(set2); + ASSERT_EQ(4, set1.GetCount()); + ASSERT_EQ(9, set2.GetCount()); +} + +TEST(CpuSetTest, SelfIntersection) { + ScopedTmpFile file1; + ASSERT_TRUE(file1.InitString("9-19")); + + CpuSet set1; + ASSERT_TRUE(set1.ParseSysFile(file1.GetFd())); + ASSERT_EQ(11, set1.GetCount()); + + set1.IntersectWith(set1); + ASSERT_EQ(11, set1.GetCount()); +} + +TEST(CpuSetTest, EmptyIntersection) { + ScopedTmpFile file1; + ASSERT_TRUE(file1.InitString("0-19")); + + CpuSet set1; + ASSERT_TRUE(set1.ParseSysFile(file1.GetFd())); + ASSERT_EQ(20, set1.GetCount()); + + ScopedTmpFile file2; + ASSERT_TRUE(file2.InitString("20-39")); + + CpuSet set2; + ASSERT_TRUE(set2.ParseSysFile(file2.GetFd())); + ASSERT_EQ(20, set2.GetCount()); + + set1.IntersectWith(set2); + ASSERT_EQ(0, set1.GetCount()); + + ASSERT_EQ(20, set2.GetCount()); +} + diff --git a/src/client/linux/minidump_writer/directory_reader.h b/src/client/linux/minidump_writer/directory_reader.h new file mode 100644 index 0000000..62bba87 --- /dev/null +++ b/src/client/linux/minidump_writer/directory_reader.h @@ -0,0 +1,105 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_ + +#include +#include +#include +#include +#include +#include + +#include "common/linux/linux_libc_support.h" +#include "third_party/lss/linux_syscall_support.h" + +namespace google_breakpad { + +// A class for enumerating a directory without using diropen/readdir or other +// functions which may allocate memory. +class DirectoryReader { + public: + DirectoryReader(int fd) + : fd_(fd), + buf_used_(0) { + } + + // Return the next entry from the directory + // name: (output) the NUL terminated entry name + // + // Returns true iff successful (false on EOF). + // + // After calling this, one must call |PopEntry| otherwise you'll get the same + // entry over and over. + bool GetNextEntry(const char** name) { + struct kernel_dirent* const dent = + reinterpret_cast(buf_); + + if (buf_used_ == 0) { + // need to read more entries. + const int n = sys_getdents(fd_, dent, sizeof(buf_)); + if (n < 0) { + return false; + } else if (n == 0) { + hit_eof_ = true; + } else { + buf_used_ += n; + } + } + + if (buf_used_ == 0 && hit_eof_) + return false; + + assert(buf_used_ > 0); + + *name = dent->d_name; + return true; + } + + void PopEntry() { + if (!buf_used_) + return; + + const struct kernel_dirent* const dent = + reinterpret_cast(buf_); + + buf_used_ -= dent->d_reclen; + my_memmove(buf_, buf_ + dent->d_reclen, buf_used_); + } + + private: + const int fd_; + bool hit_eof_; + unsigned buf_used_; + uint8_t buf_[sizeof(struct kernel_dirent) + NAME_MAX + 1]; +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_ diff --git a/src/client/linux/minidump_writer/directory_reader_unittest.cc b/src/client/linux/minidump_writer/directory_reader_unittest.cc new file mode 100644 index 0000000..708d586 --- /dev/null +++ b/src/client/linux/minidump_writer/directory_reader_unittest.cc @@ -0,0 +1,81 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include +#include + +#include "client/linux/minidump_writer/directory_reader.h" +#include "common/using_std_string.h" +#include "breakpad_googletest_includes.h" + +using namespace google_breakpad; + +namespace { +typedef testing::Test DirectoryReaderTest; +} + +TEST(DirectoryReaderTest, CompareResults) { + std::set dent_set; + + DIR* const dir = opendir("/proc/self"); + ASSERT_TRUE(dir != NULL); + + struct dirent* dent; + while ((dent = readdir(dir))) + dent_set.insert(dent->d_name); + + closedir(dir); + + const int fd = open("/proc/self", O_DIRECTORY | O_RDONLY); + ASSERT_GE(fd, 0); + + DirectoryReader dir_reader(fd); + unsigned seen = 0; + + const char* name; + while (dir_reader.GetNextEntry(&name)) { + ASSERT_TRUE(dent_set.find(name) != dent_set.end()); + seen++; + dir_reader.PopEntry(); + } + + ASSERT_TRUE(dent_set.find("status") != dent_set.end()); + ASSERT_TRUE(dent_set.find("stat") != dent_set.end()); + ASSERT_TRUE(dent_set.find("cmdline") != dent_set.end()); + + ASSERT_EQ(dent_set.size(), seen); + close(fd); +} diff --git a/src/client/linux/minidump_writer/line_reader.h b/src/client/linux/minidump_writer/line_reader.h new file mode 100644 index 0000000..d54a67d --- /dev/null +++ b/src/client/linux/minidump_writer/line_reader.h @@ -0,0 +1,130 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_ + +#include +#include +#include + +#include "common/linux/linux_libc_support.h" +#include "third_party/lss/linux_syscall_support.h" + +namespace google_breakpad { + +// A class for reading a file, line by line, without using fopen/fgets or other +// functions which may allocate memory. +class LineReader { + public: + LineReader(int fd) + : fd_(fd), + hit_eof_(false), + buf_used_(0) { + } + + // The maximum length of a line. + static const size_t kMaxLineLen = 512; + + // Return the next line from the file. + // line: (output) a pointer to the start of the line. The line is NUL + // terminated. + // len: (output) the length of the line (not inc the NUL byte) + // + // Returns true iff successful (false on EOF). + // + // One must call |PopLine| after this function, otherwise you'll continue to + // get the same line over and over. + bool GetNextLine(const char** line, unsigned* len) { + for (;;) { + if (buf_used_ == 0 && hit_eof_) + return false; + + for (unsigned i = 0; i < buf_used_; ++i) { + if (buf_[i] == '\n' || buf_[i] == 0) { + buf_[i] = 0; + *len = i; + *line = buf_; + return true; + } + } + + if (buf_used_ == sizeof(buf_)) { + // we scanned the whole buffer and didn't find an end-of-line marker. + // This line is too long to process. + return false; + } + + // We didn't find any end-of-line terminators in the buffer. However, if + // this is the last line in the file it might not have one: + if (hit_eof_) { + assert(buf_used_); + // There's room for the NUL because of the buf_used_ == sizeof(buf_) + // check above. + buf_[buf_used_] = 0; + *len = buf_used_; + buf_used_ += 1; // since we appended the NUL. + *line = buf_; + return true; + } + + // Otherwise, we should pull in more data from the file + const ssize_t n = sys_read(fd_, buf_ + buf_used_, + sizeof(buf_) - buf_used_); + if (n < 0) { + return false; + } else if (n == 0) { + hit_eof_ = true; + } else { + buf_used_ += n; + } + + // At this point, we have either set the hit_eof_ flag, or we have more + // data to process... + } + } + + void PopLine(unsigned len) { + // len doesn't include the NUL byte at the end. + + assert(buf_used_ >= len + 1); + buf_used_ -= len + 1; + my_memmove(buf_, buf_ + len + 1, buf_used_); + } + + private: + const int fd_; + + bool hit_eof_; + unsigned buf_used_; + char buf_[kMaxLineLen]; +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_ diff --git a/src/client/linux/minidump_writer/line_reader_unittest.cc b/src/client/linux/minidump_writer/line_reader_unittest.cc new file mode 100644 index 0000000..bc1f9d3 --- /dev/null +++ b/src/client/linux/minidump_writer/line_reader_unittest.cc @@ -0,0 +1,161 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "client/linux/minidump_writer/line_reader.h" +#include "breakpad_googletest_includes.h" +#include "common/linux/scoped_tmpfile.h" + +using namespace google_breakpad; + +namespace { + +typedef testing::Test LineReaderTest; + +} + +TEST(LineReaderTest, EmptyFile) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("")); + LineReader reader(file.GetFd()); + + const char* line; + unsigned len; + ASSERT_FALSE(reader.GetNextLine(&line, &len)); +} + +TEST(LineReaderTest, OneLineTerminated) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("a\n")); + LineReader reader(file.GetFd()); + + const char* line; + unsigned int len; + ASSERT_TRUE(reader.GetNextLine(&line, &len)); + ASSERT_EQ((unsigned int)1, len); + ASSERT_EQ('a', line[0]); + ASSERT_EQ('\0', line[1]); + reader.PopLine(len); + + ASSERT_FALSE(reader.GetNextLine(&line, &len)); +} + +TEST(LineReaderTest, OneLine) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("a")); + LineReader reader(file.GetFd()); + + const char* line; + unsigned len; + ASSERT_TRUE(reader.GetNextLine(&line, &len)); + ASSERT_EQ((unsigned)1, len); + ASSERT_EQ('a', line[0]); + ASSERT_EQ('\0', line[1]); + reader.PopLine(len); + + ASSERT_FALSE(reader.GetNextLine(&line, &len)); +} + +TEST(LineReaderTest, TwoLinesTerminated) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("a\nb\n")); + LineReader reader(file.GetFd()); + + const char* line; + unsigned len; + ASSERT_TRUE(reader.GetNextLine(&line, &len)); + ASSERT_EQ((unsigned)1, len); + ASSERT_EQ('a', line[0]); + ASSERT_EQ('\0', line[1]); + reader.PopLine(len); + + ASSERT_TRUE(reader.GetNextLine(&line, &len)); + ASSERT_EQ((unsigned)1, len); + ASSERT_EQ('b', line[0]); + ASSERT_EQ('\0', line[1]); + reader.PopLine(len); + + ASSERT_FALSE(reader.GetNextLine(&line, &len)); +} + +TEST(LineReaderTest, TwoLines) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("a\nb")); + LineReader reader(file.GetFd()); + + const char* line; + unsigned len; + ASSERT_TRUE(reader.GetNextLine(&line, &len)); + ASSERT_EQ((unsigned)1, len); + ASSERT_EQ('a', line[0]); + ASSERT_EQ('\0', line[1]); + reader.PopLine(len); + + ASSERT_TRUE(reader.GetNextLine(&line, &len)); + ASSERT_EQ((unsigned)1, len); + ASSERT_EQ('b', line[0]); + ASSERT_EQ('\0', line[1]); + reader.PopLine(len); + + ASSERT_FALSE(reader.GetNextLine(&line, &len)); +} + +TEST(LineReaderTest, MaxLength) { + char l[LineReader::kMaxLineLen-1]; + memset(l, 'a', sizeof(l)); + ScopedTmpFile file; + ASSERT_TRUE(file.InitData(l, sizeof(l))); + LineReader reader(file.GetFd()); + + const char* line; + unsigned len; + ASSERT_TRUE(reader.GetNextLine(&line, &len)); + ASSERT_EQ(sizeof(l), len); + ASSERT_TRUE(memcmp(l, line, sizeof(l)) == 0); + ASSERT_EQ('\0', line[len]); +} + +TEST(LineReaderTest, TooLong) { + // Note: this writes kMaxLineLen 'a' chars in the test file. + char l[LineReader::kMaxLineLen]; + memset(l, 'a', sizeof(l)); + ScopedTmpFile file; + ASSERT_TRUE(file.InitData(l, sizeof(l))); + LineReader reader(file.GetFd()); + + const char* line; + unsigned len; + ASSERT_FALSE(reader.GetNextLine(&line, &len)); +} diff --git a/src/client/linux/minidump_writer/linux_core_dumper.cc b/src/client/linux/minidump_writer/linux_core_dumper.cc new file mode 100644 index 0000000..4bf9094 --- /dev/null +++ b/src/client/linux/minidump_writer/linux_core_dumper.cc @@ -0,0 +1,321 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// linux_core_dumper.cc: Implement google_breakpad::LinuxCoreDumper. +// See linux_core_dumper.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/linux/minidump_writer/linux_core_dumper.h" + +#include +#include +#include +#include +#include +#include +#if defined(__mips__) && defined(__ANDROID__) +// To get register definitions. +#include +#endif + +#include "common/linux/elf_gnu_compat.h" +#include "common/linux/linux_libc_support.h" + +namespace google_breakpad { + +LinuxCoreDumper::LinuxCoreDumper(pid_t pid, + const char* core_path, + const char* procfs_path, + const char* root_prefix) + : LinuxDumper(pid, root_prefix), + core_path_(core_path), + procfs_path_(procfs_path), + thread_infos_(&allocator_, 8) { + assert(core_path_); +} + +bool LinuxCoreDumper::BuildProcPath(char* path, pid_t pid, + const char* node) const { + if (!path || !node) + return false; + + size_t node_len = my_strlen(node); + if (node_len == 0) + return false; + + size_t procfs_path_len = my_strlen(procfs_path_); + size_t total_length = procfs_path_len + 1 + node_len; + if (total_length >= NAME_MAX) + return false; + + memcpy(path, procfs_path_, procfs_path_len); + path[procfs_path_len] = '/'; + memcpy(path + procfs_path_len + 1, node, node_len); + path[total_length] = '\0'; + return true; +} + +bool LinuxCoreDumper::CopyFromProcess(void* dest, pid_t child, + const void* src, size_t length) { + ElfCoreDump::Addr virtual_address = reinterpret_cast(src); + // TODO(benchan): Investigate whether the data to be copied could span + // across multiple segments in the core dump file. ElfCoreDump::CopyData + // and this method do not handle that case yet. + if (!core_.CopyData(dest, virtual_address, length)) { + // If the data segment is not found in the core dump, fill the result + // with marker characters. + memset(dest, 0xab, length); + return false; + } + return true; +} + +bool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) { + if (index >= thread_infos_.size()) + return false; + + *info = thread_infos_[index]; + const uint8_t* stack_pointer; +#if defined(__i386) + memcpy(&stack_pointer, &info->regs.esp, sizeof(info->regs.esp)); +#elif defined(__x86_64) + memcpy(&stack_pointer, &info->regs.rsp, sizeof(info->regs.rsp)); +#elif defined(__ARM_EABI__) + memcpy(&stack_pointer, &info->regs.ARM_sp, sizeof(info->regs.ARM_sp)); +#elif defined(__aarch64__) + memcpy(&stack_pointer, &info->regs.sp, sizeof(info->regs.sp)); +#elif defined(__mips__) + stack_pointer = + reinterpret_cast(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]); +#elif defined(__riscv) + stack_pointer = reinterpret_cast( + info->mcontext.__gregs[MD_CONTEXT_RISCV_REG_SP]); +#else +# error "This code hasn't been ported to your platform yet." +#endif + info->stack_pointer = reinterpret_cast(stack_pointer); + return true; +} + +bool LinuxCoreDumper::IsPostMortem() const { + return true; +} + +bool LinuxCoreDumper::ThreadsSuspend() { + return true; +} + +bool LinuxCoreDumper::ThreadsResume() { + return true; +} + +bool LinuxCoreDumper::EnumerateThreads() { + if (!mapped_core_file_.Map(core_path_, 0)) { + fprintf(stderr, "Could not map core dump file into memory\n"); + return false; + } + + char proc_mem_path[NAME_MAX]; + if (BuildProcPath(proc_mem_path, pid_, "mem")) { + int fd = open(proc_mem_path, O_RDONLY | O_LARGEFILE | O_CLOEXEC); + if (fd != -1) { + core_.SetProcMem(fd); + } else { + fprintf(stderr, "Cannot open %s (%s)\n", proc_mem_path, strerror(errno)); + } + } + + core_.SetContent(mapped_core_file_.content()); + if (!core_.IsValid()) { + fprintf(stderr, "Invalid core dump file\n"); + return false; + } + + ElfCoreDump::Note note = core_.GetFirstNote(); + if (!note.IsValid()) { + fprintf(stderr, "PT_NOTE section not found\n"); + return false; + } + + bool first_thread = true; + do { + ElfCoreDump::Word type = note.GetType(); + MemoryRange name = note.GetName(); + MemoryRange description = note.GetDescription(); + + if (type == 0 || name.IsEmpty() || description.IsEmpty()) { + fprintf(stderr, "Could not found a valid PT_NOTE.\n"); + return false; + } + + // Based on write_note_info() in linux/kernel/fs/binfmt_elf.c, notes are + // ordered as follows (NT_PRXFPREG and NT_386_TLS are i386 specific): + // Thread Name Type + // ------------------------------------------------------------------- + // 1st thread CORE NT_PRSTATUS + // process-wide CORE NT_PRPSINFO + // process-wide CORE NT_SIGINFO + // process-wide CORE NT_AUXV + // 1st thread CORE NT_FPREGSET + // 1st thread LINUX NT_PRXFPREG + // 1st thread LINUX NT_386_TLS + // + // 2nd thread CORE NT_PRSTATUS + // 2nd thread CORE NT_FPREGSET + // 2nd thread LINUX NT_PRXFPREG + // 2nd thread LINUX NT_386_TLS + // + // 3rd thread CORE NT_PRSTATUS + // 3rd thread CORE NT_FPREGSET + // 3rd thread LINUX NT_PRXFPREG + // 3rd thread LINUX NT_386_TLS + // + // The following code only works if notes are ordered as expected. + switch (type) { + case NT_PRSTATUS: { + if (description.length() != sizeof(elf_prstatus)) { + fprintf(stderr, "Found NT_PRSTATUS descriptor of unexpected size\n"); + return false; + } + + const elf_prstatus* status = + reinterpret_cast(description.data()); + pid_t pid = status->pr_pid; + ThreadInfo info; + memset(&info, 0, sizeof(ThreadInfo)); + info.tgid = status->pr_pgrp; + info.ppid = status->pr_ppid; +#if defined(__mips__) +# if defined(__ANDROID__) + for (int i = EF_R0; i <= EF_R31; i++) + info.mcontext.gregs[i - EF_R0] = status->pr_reg[i]; +# else // __ANDROID__ + for (int i = EF_REG0; i <= EF_REG31; i++) + info.mcontext.gregs[i - EF_REG0] = status->pr_reg[i]; +# endif // __ANDROID__ + info.mcontext.mdlo = status->pr_reg[EF_LO]; + info.mcontext.mdhi = status->pr_reg[EF_HI]; + info.mcontext.pc = status->pr_reg[EF_CP0_EPC]; +#elif defined(__riscv) + memcpy(&info.mcontext.__gregs, status->pr_reg, + sizeof(info.mcontext.__gregs)); +#else // __riscv + memcpy(&info.regs, status->pr_reg, sizeof(info.regs)); +#endif + if (first_thread) { + crash_thread_ = pid; + crash_signal_ = status->pr_info.si_signo; + crash_signal_code_ = status->pr_info.si_code; + } + first_thread = false; + threads_.push_back(pid); + thread_infos_.push_back(info); + break; + } + case NT_SIGINFO: { + if (description.length() != sizeof(siginfo_t)) { + fprintf(stderr, "Found NT_SIGINFO descriptor of unexpected size\n"); + return false; + } + + const siginfo_t* info = + reinterpret_cast(description.data()); + + // Set crash_address when si_addr is valid for the signal. + switch (info->si_signo) { + case MD_EXCEPTION_CODE_LIN_SIGBUS: + case MD_EXCEPTION_CODE_LIN_SIGFPE: + case MD_EXCEPTION_CODE_LIN_SIGILL: + case MD_EXCEPTION_CODE_LIN_SIGSEGV: + case MD_EXCEPTION_CODE_LIN_SIGSYS: + case MD_EXCEPTION_CODE_LIN_SIGTRAP: + crash_address_ = reinterpret_cast(info->si_addr); + break; + } + + // Set crash_exception_info for common signals. Since exception info is + // unsigned, but some of these fields might be signed, we always cast. + switch (info->si_signo) { + case MD_EXCEPTION_CODE_LIN_SIGKILL: + set_crash_exception_info({ + static_cast(info->si_pid), + static_cast(info->si_uid), + }); + break; + case MD_EXCEPTION_CODE_LIN_SIGSYS: +#ifdef si_syscall + set_crash_exception_info({ + static_cast(info->si_syscall), + static_cast(info->si_arch), + }); +#endif + break; + } + break; + } +#if defined(__i386) || defined(__x86_64) + case NT_FPREGSET: { + if (thread_infos_.empty()) + return false; + + ThreadInfo* info = &thread_infos_.back(); + if (description.length() != sizeof(info->fpregs)) { + fprintf(stderr, "Found NT_FPREGSET descriptor of unexpected size\n"); + return false; + } + + memcpy(&info->fpregs, description.data(), sizeof(info->fpregs)); + break; + } +#endif +#if defined(__i386) + case NT_PRXFPREG: { + if (thread_infos_.empty()) + return false; + + ThreadInfo* info = &thread_infos_.back(); + if (description.length() != sizeof(info->fpxregs)) { + fprintf(stderr, "Found NT_PRXFPREG descriptor of unexpected size\n"); + return false; + } + + memcpy(&info->fpxregs, description.data(), sizeof(info->fpxregs)); + break; + } +#endif + } + note = note.GetNextNote(); + } while (note.IsValid()); + + return true; +} + +} // namespace google_breakpad diff --git a/src/client/linux/minidump_writer/linux_core_dumper.h b/src/client/linux/minidump_writer/linux_core_dumper.h new file mode 100644 index 0000000..3fc7122 --- /dev/null +++ b/src/client/linux/minidump_writer/linux_core_dumper.h @@ -0,0 +1,124 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// linux_core_dumper.h: Define the google_breakpad::LinuxCoreDumper +// class, which is derived from google_breakpad::LinuxDumper to extract +// information from a crashed process via its core dump and proc files. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_CORE_DUMPER_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_CORE_DUMPER_H_ + +#include "client/linux/minidump_writer/linux_dumper.h" +#include "common/linux/elf_core_dump.h" +#include "common/linux/memory_mapped_file.h" + +namespace google_breakpad { + +class LinuxCoreDumper : public LinuxDumper { + public: + // Constructs a dumper for extracting information of a given process + // with a process ID of |pid| via its core dump file at |core_path| and + // its proc files at |procfs_path|. If |procfs_path| is a copy of + // /proc/, it should contain the following files: + // auxv, cmdline, environ, exe, maps, status + // See LinuxDumper for the purpose of |root_prefix|. + LinuxCoreDumper(pid_t pid, const char* core_path, const char* procfs_path, + const char* root_prefix = ""); + + // Implements LinuxDumper::BuildProcPath(). + // Builds a proc path for a certain pid for a node (/proc//). + // |path| is a character array of at least NAME_MAX bytes to return the + // result.|node| is the final node without any slashes. Return true on + // success. + // + // As this dumper performs a post-mortem dump and makes use of a copy + // of the proc files of the crashed process, this derived method does + // not actually make use of |pid| and always returns a subpath of + // |procfs_path_| regardless of whether |pid| corresponds to the main + // process or a thread of the process, i.e. assuming both the main process + // and its threads have the following proc files with the same content: + // auxv, cmdline, environ, exe, maps, status + virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const; + + // Implements LinuxDumper::CopyFromProcess(). + // Copies content of |length| bytes from a given process |child|, + // starting from |src|, into |dest|. This method extracts the content + // the core dump and fills |dest| with a sequence of marker bytes + // if the expected data is not found in the core dump. Returns true if + // the expected data is found in the core dump. + virtual bool CopyFromProcess(void* dest, pid_t child, const void* src, + size_t length); + + // Implements LinuxDumper::GetThreadInfoByIndex(). + // Reads information about the |index|-th thread of |threads_|. + // Returns true on success. One must have called |ThreadsSuspend| first. + virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info); + + // Implements LinuxDumper::IsPostMortem(). + // Always returns true to indicate that this dumper performs a + // post-mortem dump of a crashed process via a core dump file. + virtual bool IsPostMortem() const; + + // Implements LinuxDumper::ThreadsSuspend(). + // As the dumper performs a post-mortem dump via a core dump file, + // there is no threads to suspend. This method does nothing and + // always returns true. + virtual bool ThreadsSuspend(); + + // Implements LinuxDumper::ThreadsResume(). + // As the dumper performs a post-mortem dump via a core dump file, + // there is no threads to resume. This method does nothing and + // always returns true. + virtual bool ThreadsResume(); + + protected: + // Implements LinuxDumper::EnumerateThreads(). + // Enumerates all threads of the given process into |threads_|. + virtual bool EnumerateThreads(); + + private: + // Path of the core dump file. + const char* core_path_; + + // Path of the directory containing the proc files of the given process, + // which is usually a copy of /proc/. + const char* procfs_path_; + + // Memory-mapped core dump file at |core_path_|. + MemoryMappedFile mapped_core_file_; + + // Content of the core dump file. + ElfCoreDump core_; + + // Thread info found in the core dump file. + wasteful_vector thread_infos_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_HANDLER_LINUX_CORE_DUMPER_H_ diff --git a/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc b/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc new file mode 100644 index 0000000..7279042 --- /dev/null +++ b/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc @@ -0,0 +1,195 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// linux_core_dumper_unittest.cc: +// Unit tests for google_breakpad::LinuxCoreDumoer. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "breakpad_googletest_includes.h" +#include "client/linux/minidump_writer/linux_core_dumper.h" +#include "common/linux/tests/crash_generator.h" +#include "common/using_std_string.h" + +using namespace google_breakpad; + +TEST(LinuxCoreDumperTest, GetMappingAbsolutePath) { + const LinuxCoreDumper dumper(getpid(), "core", "/tmp", "/mnt/root"); + const MappingInfo mapping = {0, 0, {0, 0}, 0, false, "/usr/lib/libc.so"}; + + char path[PATH_MAX]; + dumper.GetMappingAbsolutePath(mapping, path); + + EXPECT_STREQ("/mnt/root/usr/lib/libc.so", path); +} + +TEST(LinuxCoreDumperTest, BuildProcPath) { + const pid_t pid = getpid(); + const char procfs_path[] = "/procfs_copy"; + LinuxCoreDumper dumper(getpid(), "core_file", procfs_path); + + char maps_path[NAME_MAX] = ""; + char maps_path_expected[NAME_MAX]; + snprintf(maps_path_expected, sizeof(maps_path_expected), + "%s/maps", procfs_path); + EXPECT_TRUE(dumper.BuildProcPath(maps_path, pid, "maps")); + EXPECT_STREQ(maps_path_expected, maps_path); + + EXPECT_FALSE(dumper.BuildProcPath(NULL, pid, "maps")); + EXPECT_FALSE(dumper.BuildProcPath(maps_path, pid, "")); + EXPECT_FALSE(dumper.BuildProcPath(maps_path, pid, NULL)); + + char long_node[NAME_MAX]; + size_t long_node_len = NAME_MAX - strlen(procfs_path) - 1; + memset(long_node, 'a', long_node_len); + long_node[long_node_len] = '\0'; + EXPECT_FALSE(dumper.BuildProcPath(maps_path, pid, long_node)); +} + +TEST(LinuxCoreDumperTest, VerifyDumpWithMultipleThreads) { + CrashGenerator crash_generator; + if (!crash_generator.HasDefaultCorePattern()) { + fprintf(stderr, "LinuxCoreDumperTest.VerifyDumpWithMultipleThreads test " + "is skipped due to non-default core pattern\n"); + return; + } + + const unsigned kNumOfThreads = 3; + const unsigned kCrashThread = 1; + const int kCrashSignal = SIGABRT; + pid_t child_pid; + ASSERT_TRUE(crash_generator.CreateChildCrash(kNumOfThreads, kCrashThread, + kCrashSignal, &child_pid)); + + const string core_file = crash_generator.GetCoreFilePath(); + const string procfs_path = crash_generator.GetDirectoryOfProcFilesCopy(); + +#if defined(__ANDROID__) + struct stat st; + if (stat(core_file.c_str(), &st) != 0) { + fprintf(stderr, "LinuxCoreDumperTest.VerifyDumpWithMultipleThreads test is " + "skipped due to no core file being generated\n"); + return; + } +#endif + + LinuxCoreDumper dumper(child_pid, core_file.c_str(), procfs_path.c_str()); + + EXPECT_TRUE(dumper.Init()); + + EXPECT_TRUE(dumper.IsPostMortem()); + + // These are no-ops and should always return true. + EXPECT_TRUE(dumper.ThreadsSuspend()); + EXPECT_TRUE(dumper.ThreadsResume()); + + // Linux does not set the crash address with SIGABRT, so make sure it always + // sets the crash address to 0. + EXPECT_EQ(0U, dumper.crash_address()); + EXPECT_EQ(kCrashSignal, dumper.crash_signal()); + EXPECT_EQ(crash_generator.GetThreadId(kCrashThread), + dumper.crash_thread()); + +#if defined(THREAD_SANITIZER) + EXPECT_GE(dumper.threads().size(), kNumOfThreads); +#else + EXPECT_EQ(dumper.threads().size(), kNumOfThreads); +#endif + for (unsigned i = 0; i < kNumOfThreads; ++i) { + ThreadInfo info; + EXPECT_TRUE(dumper.GetThreadInfoByIndex(i, &info)); + const void* stack; + size_t stack_len; + EXPECT_TRUE(dumper.GetStackInfo(&stack, &stack_len, info.stack_pointer)); + EXPECT_EQ(getpid(), info.ppid); + } +} + +TEST(LinuxCoreDumperTest, VerifyExceptionDetails) { + CrashGenerator crash_generator; + if (!crash_generator.HasDefaultCorePattern()) { + fprintf(stderr, "LinuxCoreDumperTest.VerifyDumpWithMultipleThreads test " + "is skipped due to non-default core pattern\n"); + return; + } + +#ifndef si_syscall + fprintf(stderr, "LinuxCoreDumperTest.VerifyDumpWithMultipleThreads test is " + "skipped due to old kernel/C library headers\n"); + return; +#endif + + const unsigned kNumOfThreads = 2; + const unsigned kCrashThread = 1; + const int kCrashSignal = SIGSYS; + pid_t child_pid; + ASSERT_TRUE(crash_generator.CreateChildCrash(kNumOfThreads, kCrashThread, + kCrashSignal, &child_pid)); + + const string core_file = crash_generator.GetCoreFilePath(); + const string procfs_path = crash_generator.GetDirectoryOfProcFilesCopy(); + +#if defined(__ANDROID__) + struct stat st; + if (stat(core_file.c_str(), &st) != 0) { + fprintf(stderr, "LinuxCoreDumperTest.VerifyExceptionDetails test is " + "skipped due to no core file being generated\n"); + return; + } +#endif + + LinuxCoreDumper dumper(child_pid, core_file.c_str(), procfs_path.c_str()); + + EXPECT_TRUE(dumper.Init()); + + EXPECT_TRUE(dumper.IsPostMortem()); + +#if defined(__ANDROID__) + // TODO: For some reason, Android doesn't seem to pass this. + if (!dumper.crash_address()) { + fprintf(stderr, "LinuxCoreDumperTest.VerifyExceptionDetails test is " + "skipped due to missing signal details on Android\n"); + return; + } +#endif + + // Check the exception details. + EXPECT_NE(0U, dumper.crash_address()); + EXPECT_EQ(kCrashSignal, dumper.crash_signal()); + EXPECT_EQ(crash_generator.GetThreadId(kCrashThread), + dumper.crash_thread()); + + // We check the length, but not the actual fields. We sent SIGSYS ourselves + // instead of the kernel, so the extended fields are garbage. + const std::vector info(dumper.crash_exception_info()); + EXPECT_EQ(2U, info.size()); +} diff --git a/src/client/linux/minidump_writer/linux_dumper.cc b/src/client/linux/minidump_writer/linux_dumper.cc new file mode 100644 index 0000000..5c4c389 --- /dev/null +++ b/src/client/linux/minidump_writer/linux_dumper.cc @@ -0,0 +1,974 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// linux_dumper.cc: Implement google_breakpad::LinuxDumper. +// See linux_dumper.h for details. + +// This code deals with the mechanics of getting information about a crashed +// process. Since this code may run in a compromised address space, the same +// rules apply as detailed at the top of minidump_writer.h: no libc calls and +// use the alternative allocator. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/linux/minidump_writer/linux_dumper.h" + +#include +#include +#include +#include +#include +#include + +#include "client/linux/minidump_writer/line_reader.h" +#include "common/linux/elfutils.h" +#include "common/linux/file_id.h" +#include "common/linux/linux_libc_support.h" +#include "common/linux/memory_mapped_file.h" +#include "common/linux/safe_readlink.h" +#include "google_breakpad/common/minidump_exception_linux.h" +#include "third_party/lss/linux_syscall_support.h" + +using google_breakpad::elf::FileID; + +#if defined(__ANDROID__) + +// Android packed relocations definitions are not yet available from the +// NDK header files, so we have to provide them manually here. +#ifndef DT_LOOS +#define DT_LOOS 0x6000000d +#endif +#ifndef DT_ANDROID_REL +static const int DT_ANDROID_REL = DT_LOOS + 2; +#endif +#ifndef DT_ANDROID_RELA +static const int DT_ANDROID_RELA = DT_LOOS + 4; +#endif + +#endif // __ANDROID __ + +static const char kMappedFileUnsafePrefix[] = "/dev/"; +static const char kDeletedSuffix[] = " (deleted)"; + +inline static bool IsMappedFileOpenUnsafe( + const google_breakpad::MappingInfo& mapping) { + // It is unsafe to attempt to open a mapped file that lives under /dev, + // because the semantics of the open may be driver-specific so we'd risk + // hanging the crash dumper. And a file in /dev/ almost certainly has no + // ELF file identifier anyways. + return my_strncmp(mapping.name, + kMappedFileUnsafePrefix, + sizeof(kMappedFileUnsafePrefix) - 1) == 0; +} + +namespace google_breakpad { + +namespace { + +bool MappingContainsAddress(const MappingInfo& mapping, uintptr_t address) { + return mapping.system_mapping_info.start_addr <= address && + address < mapping.system_mapping_info.end_addr; +} + +#if defined(__CHROMEOS__) + +// Recover memory mappings before writing dump on ChromeOS +// +// On Linux, breakpad relies on /proc/[pid]/maps to associate symbols from +// addresses. ChromeOS' hugepage implementation replaces some segments with +// anonymous private pages, which is a restriction of current implementation +// in Linux kernel at the time of writing. Thus, breakpad can no longer +// symbolize addresses from those text segments replaced with hugepages. +// +// This postprocess tries to recover the mappings. Because hugepages are always +// inserted in between some .text sections, it tries to infer the names and +// offsets of the segments, by looking at segments immediately precede and +// succeed them. +// +// For example, a text segment before hugepage optimization +// 02001000-03002000 r-xp /opt/google/chrome/chrome +// +// can be broken into +// 02001000-02200000 r-xp /opt/google/chrome/chrome +// 02200000-03000000 r-xp +// 03000000-03002000 r-xp /opt/google/chrome/chrome +// +// For more details, see: +// crbug.com/628040 ChromeOS' use of hugepages confuses crash symbolization + +// Copied from CrOS' hugepage implementation, which is unlikely to change. +// The hugepage size is 2M. +const unsigned int kHpageShift = 21; +const size_t kHpageSize = (1 << kHpageShift); +const size_t kHpageMask = (~(kHpageSize - 1)); + +// Find and merge anonymous r-xp segments with surrounding named segments. +// There are two cases: + +// Case 1: curr, next +// curr is anonymous +// curr is r-xp +// curr.size >= 2M +// curr.size is a multiple of 2M. +// next is backed by some file. +// curr and next are contiguous. +// offset(next) == sizeof(curr) +void TryRecoverMappings(MappingInfo* curr, MappingInfo* next) { + // Merged segments are marked with size = 0. + if (curr->size == 0 || next->size == 0) + return; + + if (curr->size >= kHpageSize && + curr->exec && + (curr->size & kHpageMask) == curr->size && + (curr->start_addr & kHpageMask) == curr->start_addr && + curr->name[0] == '\0' && + next->name[0] != '\0' && + curr->start_addr + curr->size == next->start_addr && + curr->size == next->offset) { + + // matched + my_strlcpy(curr->name, next->name, NAME_MAX); + if (next->exec) { + // (curr, next) + curr->size += next->size; + next->size = 0; + } + } +} + +// Case 2: prev, curr, next +// curr is anonymous +// curr is r-xp +// curr.size >= 2M +// curr.size is a multiple of 2M. +// next and prev are backed by the same file. +// prev, curr and next are contiguous. +// offset(next) == offset(prev) + sizeof(prev) + sizeof(curr) +void TryRecoverMappings(MappingInfo* prev, MappingInfo* curr, + MappingInfo* next) { + // Merged segments are marked with size = 0. + if (prev->size == 0 || curr->size == 0 || next->size == 0) + return; + + if (curr->size >= kHpageSize && + curr->exec && + (curr->size & kHpageMask) == curr->size && + (curr->start_addr & kHpageMask) == curr->start_addr && + curr->name[0] == '\0' && + next->name[0] != '\0' && + curr->start_addr + curr->size == next->start_addr && + prev->start_addr + prev->size == curr->start_addr && + my_strncmp(prev->name, next->name, NAME_MAX) == 0 && + next->offset == prev->offset + prev->size + curr->size) { + + // matched + my_strlcpy(curr->name, prev->name, NAME_MAX); + if (prev->exec) { + curr->offset = prev->offset; + curr->start_addr = prev->start_addr; + if (next->exec) { + // (prev, curr, next) + curr->size += prev->size + next->size; + prev->size = 0; + next->size = 0; + } else { + // (prev, curr), next + curr->size += prev->size; + prev->size = 0; + } + } else { + curr->offset = prev->offset + prev->size; + if (next->exec) { + // prev, (curr, next) + curr->size += next->size; + next->size = 0; + } else { + // prev, curr, next + } + } + } +} + +// mappings_ is sorted excepted for the first entry. +// This function tries to merge segemnts into the first entry, +// then check for other sorted entries. +// See LinuxDumper::EnumerateMappings(). +void CrOSPostProcessMappings(wasteful_vector& mappings) { + // Find the candidate "next" to first segment, which is the only one that + // could be out-of-order. + size_t l = 1; + size_t r = mappings.size(); + size_t next = mappings.size(); + while (l < r) { + int m = (l + r) / 2; + if (mappings[m]->start_addr > mappings[0]->start_addr) + r = next = m; + else + l = m + 1; + } + + // Shows the range that contains the entry point is + // [first_start_addr, first_end_addr) + size_t first_start_addr = mappings[0]->start_addr; + size_t first_end_addr = mappings[0]->start_addr + mappings[0]->size; + + // Put the out-of-order segment in order. + std::rotate(mappings.begin(), mappings.begin() + 1, mappings.begin() + next); + + // Iterate through normal, sorted cases. + // Normal case 1. + for (size_t i = 0; i < mappings.size() - 1; i++) + TryRecoverMappings(mappings[i], mappings[i + 1]); + + // Normal case 2. + for (size_t i = 0; i < mappings.size() - 2; i++) + TryRecoverMappings(mappings[i], mappings[i + 1], mappings[i + 2]); + + // Collect merged (size == 0) segments. + size_t f, e; + for (f = e = 0; e < mappings.size(); e++) + if (mappings[e]->size > 0) + mappings[f++] = mappings[e]; + mappings.resize(f); + + // The entry point is in the first mapping. We want to find the location + // of the entry point after merging segment. To do this, we want to find + // the mapping that covers the first mapping from the original mapping list. + // If the mapping is not in the beginning, we move it to the begining via + // a right rotate by using reverse iterators. + for (l = 0; l < mappings.size(); l++) { + if (mappings[l]->start_addr <= first_start_addr + && (mappings[l]->start_addr + mappings[l]->size >= first_end_addr)) + break; + } + if (l > 0) { + r = mappings.size(); + std::rotate(mappings.rbegin() + r - l - 1, mappings.rbegin() + r - l, + mappings.rend()); + } +} + +#endif // __CHROMEOS__ + +} // namespace + +// All interesting auvx entry types are below AT_SYSINFO_EHDR +#define AT_MAX AT_SYSINFO_EHDR + +LinuxDumper::LinuxDumper(pid_t pid, const char* root_prefix) + : pid_(pid), + root_prefix_(root_prefix), + crash_address_(0), + crash_signal_(0), + crash_signal_code_(0), + crash_thread_(pid), + threads_(&allocator_, 8), + mappings_(&allocator_), + auxv_(&allocator_, AT_MAX + 1) { + assert(root_prefix_ && my_strlen(root_prefix_) < PATH_MAX); + // The passed-in size to the constructor (above) is only a hint. + // Must call .resize() to do actual initialization of the elements. + auxv_.resize(AT_MAX + 1); +} + +LinuxDumper::~LinuxDumper() { +} + +bool LinuxDumper::Init() { + return ReadAuxv() && EnumerateThreads() && EnumerateMappings(); +} + +bool LinuxDumper::LateInit() { +#if defined(__ANDROID__) + LatePostprocessMappings(); +#endif + +#if defined(__CHROMEOS__) + CrOSPostProcessMappings(mappings_); +#endif + + return true; +} + +bool +LinuxDumper::ElfFileIdentifierForMapping(const MappingInfo& mapping, + bool member, + unsigned int mapping_id, + wasteful_vector& identifier) { + assert(!member || mapping_id < mappings_.size()); + if (IsMappedFileOpenUnsafe(mapping)) + return false; + + // Special-case linux-gate because it's not a real file. + if (my_strcmp(mapping.name, kLinuxGateLibraryName) == 0) { + void* linux_gate = NULL; + if (pid_ == sys_getpid()) { + linux_gate = reinterpret_cast(mapping.start_addr); + } else { + linux_gate = allocator_.Alloc(mapping.size); + CopyFromProcess(linux_gate, pid_, + reinterpret_cast(mapping.start_addr), + mapping.size); + } + return FileID::ElfFileIdentifierFromMappedFile(linux_gate, identifier); + } + + char filename[PATH_MAX]; + if (!GetMappingAbsolutePath(mapping, filename)) + return false; + bool filename_modified = HandleDeletedFileInMapping(filename); + + MemoryMappedFile mapped_file(filename, 0); + if (!mapped_file.data() || mapped_file.size() < SELFMAG) + return false; + + bool success = + FileID::ElfFileIdentifierFromMappedFile(mapped_file.data(), identifier); + if (success && member && filename_modified) { + mappings_[mapping_id]->name[my_strlen(mapping.name) - + sizeof(kDeletedSuffix) + 1] = '\0'; + } + + return success; +} + +void LinuxDumper::SetCrashInfoFromSigInfo(const siginfo_t& siginfo) { + set_crash_address(reinterpret_cast(siginfo.si_addr)); + set_crash_signal(siginfo.si_signo); + set_crash_signal_code(siginfo.si_code); +} + +const char* LinuxDumper::GetCrashSignalString() const { + switch (static_cast(crash_signal_)) { + case MD_EXCEPTION_CODE_LIN_SIGHUP: + return "SIGHUP"; + case MD_EXCEPTION_CODE_LIN_SIGINT: + return "SIGINT"; + case MD_EXCEPTION_CODE_LIN_SIGQUIT: + return "SIGQUIT"; + case MD_EXCEPTION_CODE_LIN_SIGILL: + return "SIGILL"; + case MD_EXCEPTION_CODE_LIN_SIGTRAP: + return "SIGTRAP"; + case MD_EXCEPTION_CODE_LIN_SIGABRT: + return "SIGABRT"; + case MD_EXCEPTION_CODE_LIN_SIGBUS: + return "SIGBUS"; + case MD_EXCEPTION_CODE_LIN_SIGFPE: + return "SIGFPE"; + case MD_EXCEPTION_CODE_LIN_SIGKILL: + return "SIGKILL"; + case MD_EXCEPTION_CODE_LIN_SIGUSR1: + return "SIGUSR1"; + case MD_EXCEPTION_CODE_LIN_SIGSEGV: + return "SIGSEGV"; + case MD_EXCEPTION_CODE_LIN_SIGUSR2: + return "SIGUSR2"; + case MD_EXCEPTION_CODE_LIN_SIGPIPE: + return "SIGPIPE"; + case MD_EXCEPTION_CODE_LIN_SIGALRM: + return "SIGALRM"; + case MD_EXCEPTION_CODE_LIN_SIGTERM: + return "SIGTERM"; + case MD_EXCEPTION_CODE_LIN_SIGSTKFLT: + return "SIGSTKFLT"; + case MD_EXCEPTION_CODE_LIN_SIGCHLD: + return "SIGCHLD"; + case MD_EXCEPTION_CODE_LIN_SIGCONT: + return "SIGCONT"; + case MD_EXCEPTION_CODE_LIN_SIGSTOP: + return "SIGSTOP"; + case MD_EXCEPTION_CODE_LIN_SIGTSTP: + return "SIGTSTP"; + case MD_EXCEPTION_CODE_LIN_SIGTTIN: + return "SIGTTIN"; + case MD_EXCEPTION_CODE_LIN_SIGTTOU: + return "SIGTTOU"; + case MD_EXCEPTION_CODE_LIN_SIGURG: + return "SIGURG"; + case MD_EXCEPTION_CODE_LIN_SIGXCPU: + return "SIGXCPU"; + case MD_EXCEPTION_CODE_LIN_SIGXFSZ: + return "SIGXFSZ"; + case MD_EXCEPTION_CODE_LIN_SIGVTALRM: + return "SIGVTALRM"; + case MD_EXCEPTION_CODE_LIN_SIGPROF: + return "SIGPROF"; + case MD_EXCEPTION_CODE_LIN_SIGWINCH: + return "SIGWINCH"; + case MD_EXCEPTION_CODE_LIN_SIGIO: + return "SIGIO"; + case MD_EXCEPTION_CODE_LIN_SIGPWR: + return "SIGPWR"; + case MD_EXCEPTION_CODE_LIN_SIGSYS: + return "SIGSYS"; + case MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED: + return "DUMP_REQUESTED"; + default: + return "UNKNOWN"; + } +} + +bool LinuxDumper::GetMappingAbsolutePath(const MappingInfo& mapping, + char path[PATH_MAX]) const { + return my_strlcpy(path, root_prefix_, PATH_MAX) < PATH_MAX && + my_strlcat(path, mapping.name, PATH_MAX) < PATH_MAX; +} + +namespace { +// Find the shared object name (SONAME) by examining the ELF information +// for |mapping|. If the SONAME is found copy it into the passed buffer +// |soname| and return true. The size of the buffer is |soname_size|. +// The SONAME will be truncated if it is too long to fit in the buffer. +bool ElfFileSoName(const LinuxDumper& dumper, + const MappingInfo& mapping, char* soname, size_t soname_size) { + if (IsMappedFileOpenUnsafe(mapping)) { + // Not safe + return false; + } + + char filename[PATH_MAX]; + if (!dumper.GetMappingAbsolutePath(mapping, filename)) + return false; + + MemoryMappedFile mapped_file(filename, 0); + if (!mapped_file.data() || mapped_file.size() < SELFMAG) { + // mmap failed + return false; + } + + return ElfFileSoNameFromMappedFile(mapped_file.data(), soname, soname_size); +} + +} // namespace + + +void LinuxDumper::GetMappingEffectiveNameAndPath(const MappingInfo& mapping, + char* file_path, + size_t file_path_size, + char* file_name, + size_t file_name_size) { + my_strlcpy(file_path, mapping.name, file_path_size); + + // Tools such as minidump_stackwalk use the name of the module to look up + // symbols produced by dump_syms. dump_syms will prefer to use a module's + // DT_SONAME as the module name, if one exists, and will fall back to the + // filesystem name of the module. + + // Just use the filesystem name if no SONAME is present. + if (!ElfFileSoName(*this, mapping, file_name, file_name_size)) { + // file_path := /path/to/libname.so + // file_name := libname.so + const char* basename = my_strrchr(file_path, '/'); + basename = basename == NULL ? file_path : (basename + 1); + my_strlcpy(file_name, basename, file_name_size); + return; + } + + if (mapping.exec && mapping.offset != 0) { + // If an executable is mapped from a non-zero offset, this is likely because + // the executable was loaded directly from inside an archive file (e.g., an + // apk on Android). + // In this case, we append the file_name to the mapped archive path: + // file_name := libname.so + // file_path := /path/to/ARCHIVE.APK/libname.so + if (my_strlen(file_path) + 1 + my_strlen(file_name) < file_path_size) { + my_strlcat(file_path, "/", file_path_size); + my_strlcat(file_path, file_name, file_path_size); + } + } else { + // Otherwise, replace the basename with the SONAME. + char* basename = const_cast(my_strrchr(file_path, '/')); + if (basename) { + my_strlcpy(basename + 1, file_name, + file_path_size - my_strlen(file_path) + + my_strlen(basename + 1)); + } else { + my_strlcpy(file_path, file_name, file_path_size); + } + } +} + +bool LinuxDumper::ReadAuxv() { + char auxv_path[NAME_MAX]; + if (!BuildProcPath(auxv_path, pid_, "auxv")) { + return false; + } + + int fd = sys_open(auxv_path, O_RDONLY, 0); + if (fd < 0) { + return false; + } + + elf_aux_entry one_aux_entry; + bool res = false; + while (sys_read(fd, + &one_aux_entry, + sizeof(elf_aux_entry)) == sizeof(elf_aux_entry) && + one_aux_entry.a_type != AT_NULL) { + if (one_aux_entry.a_type <= AT_MAX) { + auxv_[one_aux_entry.a_type] = one_aux_entry.a_un.a_val; + res = true; + } + } + sys_close(fd); + return res; +} + +bool LinuxDumper::EnumerateMappings() { + char maps_path[NAME_MAX]; + if (!BuildProcPath(maps_path, pid_, "maps")) + return false; + + // linux_gate_loc is the beginning of the kernel's mapping of + // linux-gate.so in the process. It doesn't actually show up in the + // maps list as a filename, but it can be found using the AT_SYSINFO_EHDR + // aux vector entry, which gives the information necessary to special + // case its entry when creating the list of mappings. + // See http://www.trilithium.com/johan/2005/08/linux-gate/ for more + // information. + const void* linux_gate_loc = + reinterpret_cast(auxv_[AT_SYSINFO_EHDR]); + // Although the initial executable is usually the first mapping, it's not + // guaranteed (see http://crosbug.com/25355); therefore, try to use the + // actual entry point to find the mapping. + const void* entry_point_loc = reinterpret_cast(auxv_[AT_ENTRY]); + + const int fd = sys_open(maps_path, O_RDONLY, 0); + if (fd < 0) + return false; + LineReader* const line_reader = new(allocator_) LineReader(fd); + + const char* line; + unsigned line_len; + while (line_reader->GetNextLine(&line, &line_len)) { + uintptr_t start_addr, end_addr, offset; + + const char* i1 = my_read_hex_ptr(&start_addr, line); + if (*i1 == '-') { + const char* i2 = my_read_hex_ptr(&end_addr, i1 + 1); + if (*i2 == ' ') { + bool exec = (*(i2 + 3) == 'x'); + const char* i3 = my_read_hex_ptr(&offset, i2 + 6 /* skip ' rwxp ' */); + if (*i3 == ' ') { + const char* name = NULL; + // Only copy name if the name is a valid path name, or if + // it's the VDSO image. + if (((name = my_strchr(line, '/')) == NULL) && + linux_gate_loc && + reinterpret_cast(start_addr) == linux_gate_loc) { + name = kLinuxGateLibraryName; + offset = 0; + } + // Merge adjacent mappings into one module, assuming they're a single + // library mapped by the dynamic linker. Do this only if their name + // matches and either they have the same +x protection flag, or if the + // previous mapping is not executable and the new one is, to handle + // lld's output (see crbug.com/716484). + if (name && !mappings_.empty()) { + MappingInfo* module = mappings_.back(); + if ((start_addr == module->start_addr + module->size) && + (my_strlen(name) == my_strlen(module->name)) && + (my_strncmp(name, module->name, my_strlen(name)) == 0) && + ((exec == module->exec) || (!module->exec && exec))) { + module->system_mapping_info.end_addr = end_addr; + module->size = end_addr - module->start_addr; + module->exec |= exec; + line_reader->PopLine(line_len); + continue; + } + } + MappingInfo* const module = new(allocator_) MappingInfo; + mappings_.push_back(module); + my_memset(module, 0, sizeof(MappingInfo)); + module->system_mapping_info.start_addr = start_addr; + module->system_mapping_info.end_addr = end_addr; + module->start_addr = start_addr; + module->size = end_addr - start_addr; + module->offset = offset; + module->exec = exec; + if (name != NULL) { + const unsigned l = my_strlen(name); + if (l < sizeof(module->name)) + my_memcpy(module->name, name, l); + } + } + } + } + line_reader->PopLine(line_len); + } + + if (entry_point_loc) { + for (size_t i = 0; i < mappings_.size(); ++i) { + MappingInfo* module = mappings_[i]; + + // If this module contains the entry-point, and it's not already the first + // one, then we need to make it be first. This is because the minidump + // format assumes the first module is the one that corresponds to the main + // executable (as codified in + // processor/minidump.cc:MinidumpModuleList::GetMainModule()). + if ((entry_point_loc >= reinterpret_cast(module->start_addr)) && + (entry_point_loc < + reinterpret_cast(module->start_addr + module->size))) { + for (size_t j = i; j > 0; j--) + mappings_[j] = mappings_[j - 1]; + mappings_[0] = module; + break; + } + } + } + + sys_close(fd); + + return !mappings_.empty(); +} + +#if defined(__ANDROID__) + +bool LinuxDumper::GetLoadedElfHeader(uintptr_t start_addr, ElfW(Ehdr)* ehdr) { + CopyFromProcess(ehdr, pid_, + reinterpret_cast(start_addr), + sizeof(*ehdr)); + return my_memcmp(&ehdr->e_ident, ELFMAG, SELFMAG) == 0; +} + +void LinuxDumper::ParseLoadedElfProgramHeaders(ElfW(Ehdr)* ehdr, + uintptr_t start_addr, + uintptr_t* min_vaddr_ptr, + uintptr_t* dyn_vaddr_ptr, + size_t* dyn_count_ptr) { + uintptr_t phdr_addr = start_addr + ehdr->e_phoff; + + const uintptr_t max_addr = UINTPTR_MAX; + uintptr_t min_vaddr = max_addr; + uintptr_t dyn_vaddr = 0; + size_t dyn_count = 0; + + for (size_t i = 0; i < ehdr->e_phnum; ++i) { + ElfW(Phdr) phdr; + CopyFromProcess(&phdr, pid_, + reinterpret_cast(phdr_addr), + sizeof(phdr)); + if (phdr.p_type == PT_LOAD && phdr.p_vaddr < min_vaddr) { + min_vaddr = phdr.p_vaddr; + } + if (phdr.p_type == PT_DYNAMIC) { + dyn_vaddr = phdr.p_vaddr; + dyn_count = phdr.p_memsz / sizeof(ElfW(Dyn)); + } + phdr_addr += sizeof(phdr); + } + + *min_vaddr_ptr = min_vaddr; + *dyn_vaddr_ptr = dyn_vaddr; + *dyn_count_ptr = dyn_count; +} + +bool LinuxDumper::HasAndroidPackedRelocations(uintptr_t load_bias, + uintptr_t dyn_vaddr, + size_t dyn_count) { + uintptr_t dyn_addr = load_bias + dyn_vaddr; + for (size_t i = 0; i < dyn_count; ++i) { + ElfW(Dyn) dyn; + CopyFromProcess(&dyn, pid_, + reinterpret_cast(dyn_addr), + sizeof(dyn)); + if (dyn.d_tag == DT_ANDROID_REL || dyn.d_tag == DT_ANDROID_RELA) { + return true; + } + dyn_addr += sizeof(dyn); + } + return false; +} + +uintptr_t LinuxDumper::GetEffectiveLoadBias(ElfW(Ehdr)* ehdr, + uintptr_t start_addr) { + uintptr_t min_vaddr = 0; + uintptr_t dyn_vaddr = 0; + size_t dyn_count = 0; + ParseLoadedElfProgramHeaders(ehdr, start_addr, + &min_vaddr, &dyn_vaddr, &dyn_count); + // If |min_vaddr| is non-zero and we find Android packed relocation tags, + // return the effective load bias. + if (min_vaddr != 0) { + const uintptr_t load_bias = start_addr - min_vaddr; + if (HasAndroidPackedRelocations(load_bias, dyn_vaddr, dyn_count)) { + return load_bias; + } + } + // Either |min_vaddr| is zero, or it is non-zero but we did not find the + // expected Android packed relocations tags. + return start_addr; +} + +void LinuxDumper::LatePostprocessMappings() { + for (size_t i = 0; i < mappings_.size(); ++i) { + // Only consider exec mappings that indicate a file path was mapped, and + // where the ELF header indicates a mapped shared library. + MappingInfo* mapping = mappings_[i]; + if (!(mapping->exec && mapping->name[0] == '/')) { + continue; + } + ElfW(Ehdr) ehdr; + if (!GetLoadedElfHeader(mapping->start_addr, &ehdr)) { + continue; + } + if (ehdr.e_type == ET_DYN) { + // Compute the effective load bias for this mapped library, and update + // the mapping to hold that rather than |start_addr|, at the same time + // adjusting |size| to account for the change in |start_addr|. Where + // the library does not contain Android packed relocations, + // GetEffectiveLoadBias() returns |start_addr| and the mapping entry + // is not changed. + const uintptr_t load_bias = GetEffectiveLoadBias(&ehdr, + mapping->start_addr); + mapping->size += mapping->start_addr - load_bias; + mapping->start_addr = load_bias; + } + } +} + +#endif // __ANDROID__ + +// Get information about the stack, given the stack pointer. We don't try to +// walk the stack since we might not have all the information needed to do +// unwind. So we just grab, up to, 32k of stack. +bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len, + uintptr_t int_stack_pointer) { + // Move the stack pointer to the bottom of the page that it's in. + const uintptr_t page_size = getpagesize(); + + uint8_t* const stack_pointer = + reinterpret_cast(int_stack_pointer & ~(page_size - 1)); + + // The number of bytes of stack which we try to capture. + static const ptrdiff_t kStackToCapture = 32 * 1024; + + const MappingInfo* mapping = FindMapping(stack_pointer); + if (!mapping) + return false; + const ptrdiff_t offset = stack_pointer - + reinterpret_cast(mapping->start_addr); + const ptrdiff_t distance_to_end = + static_cast(mapping->size) - offset; + *stack_len = distance_to_end > kStackToCapture ? + kStackToCapture : distance_to_end; + *stack = stack_pointer; + return true; +} + +void LinuxDumper::SanitizeStackCopy(uint8_t* stack_copy, size_t stack_len, + uintptr_t stack_pointer, + uintptr_t sp_offset) { + // We optimize the search for containing mappings in three ways: + // 1) We expect that pointers into the stack mapping will be common, so + // we cache that address range. + // 2) The last referenced mapping is a reasonable predictor for the next + // referenced mapping, so we test that first. + // 3) We precompute a bitfield based upon bits 32:32-n of the start and + // stop addresses, and use that to short circuit any values that can + // not be pointers. (n=11) + const uintptr_t defaced = +#if defined(__LP64__) + 0x0defaced0defaced; +#else + 0x0defaced; +#endif + // the bitfield length is 2^test_bits long. + const unsigned int test_bits = 11; + // byte length of the corresponding array. + const unsigned int array_size = 1 << (test_bits - 3); + const unsigned int array_mask = array_size - 1; + // The amount to right shift pointers by. This captures the top bits + // on 32 bit architectures. On 64 bit architectures this would be + // uninformative so we take the same range of bits. + const unsigned int shift = 32 - 11; + const MappingInfo* last_hit_mapping = nullptr; + const MappingInfo* hit_mapping = nullptr; + const MappingInfo* stack_mapping = FindMappingNoBias(stack_pointer); + // The magnitude below which integers are considered to be to be + // 'small', and not constitute a PII risk. These are included to + // avoid eliding useful register values. + const ssize_t small_int_magnitude = 4096; + + char could_hit_mapping[array_size]; + my_memset(could_hit_mapping, 0, array_size); + + // Initialize the bitfield such that if the (pointer >> shift)'th + // bit, modulo the bitfield size, is not set then there does not + // exist a mapping in mappings_ that would contain that pointer. + for (size_t i = 0; i < mappings_.size(); ++i) { + if (!mappings_[i]->exec) continue; + // For each mapping, work out the (unmodulo'ed) range of bits to + // set. + uintptr_t start = mappings_[i]->start_addr; + uintptr_t end = start + mappings_[i]->size; + start >>= shift; + end >>= shift; + for (size_t bit = start; bit <= end; ++bit) { + // Set each bit in the range, applying the modulus. + could_hit_mapping[(bit >> 3) & array_mask] |= 1 << (bit & 7); + } + } + + // Zero memory that is below the current stack pointer. + const uintptr_t offset = + (sp_offset + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1); + if (offset) { + my_memset(stack_copy, 0, offset); + } + + // Apply sanitization to each complete pointer-aligned word in the + // stack. + uint8_t* sp; + for (sp = stack_copy + offset; + sp <= stack_copy + stack_len - sizeof(uintptr_t); + sp += sizeof(uintptr_t)) { + uintptr_t addr; + my_memcpy(&addr, sp, sizeof(uintptr_t)); + if (static_cast(addr) <= small_int_magnitude && + static_cast(addr) >= -small_int_magnitude) { + continue; + } + if (stack_mapping && MappingContainsAddress(*stack_mapping, addr)) { + continue; + } + if (last_hit_mapping && MappingContainsAddress(*last_hit_mapping, addr)) { + continue; + } + uintptr_t test = addr >> shift; + if (could_hit_mapping[(test >> 3) & array_mask] & (1 << (test & 7)) && + (hit_mapping = FindMappingNoBias(addr)) != nullptr && + hit_mapping->exec) { + last_hit_mapping = hit_mapping; + continue; + } + my_memcpy(sp, &defaced, sizeof(uintptr_t)); + } + // Zero any partial word at the top of the stack, if alignment is + // such that that is required. + if (sp < stack_copy + stack_len) { + my_memset(sp, 0, stack_copy + stack_len - sp); + } +} + +bool LinuxDumper::StackHasPointerToMapping(const uint8_t* stack_copy, + size_t stack_len, + uintptr_t sp_offset, + const MappingInfo& mapping) { + // Loop over all stack words that would have been on the stack in + // the target process (i.e. are word aligned, and at addresses >= + // the stack pointer). Regardless of the alignment of |stack_copy|, + // the memory starting at |stack_copy| + |offset| represents an + // aligned word in the target process. + const uintptr_t low_addr = mapping.system_mapping_info.start_addr; + const uintptr_t high_addr = mapping.system_mapping_info.end_addr; + const uintptr_t offset = + (sp_offset + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1); + + for (const uint8_t* sp = stack_copy + offset; + sp <= stack_copy + stack_len - sizeof(uintptr_t); + sp += sizeof(uintptr_t)) { + uintptr_t addr; + my_memcpy(&addr, sp, sizeof(uintptr_t)); + if (low_addr <= addr && addr <= high_addr) + return true; + } + return false; +} + +// Find the mapping which the given memory address falls in. +const MappingInfo* LinuxDumper::FindMapping(const void* address) const { + const uintptr_t addr = (uintptr_t) address; + + for (size_t i = 0; i < mappings_.size(); ++i) { + const uintptr_t start = static_cast(mappings_[i]->start_addr); + if (addr >= start && addr - start < mappings_[i]->size) + return mappings_[i]; + } + + return NULL; +} + +// Find the mapping which the given memory address falls in. Uses the +// unadjusted mapping address range from the kernel, rather than the +// biased range. +const MappingInfo* LinuxDumper::FindMappingNoBias(uintptr_t address) const { + for (size_t i = 0; i < mappings_.size(); ++i) { + if (address >= mappings_[i]->system_mapping_info.start_addr && + address < mappings_[i]->system_mapping_info.end_addr) { + return mappings_[i]; + } + } + return NULL; +} + +bool LinuxDumper::HandleDeletedFileInMapping(char* path) const { + static const size_t kDeletedSuffixLen = sizeof(kDeletedSuffix) - 1; + + // Check for ' (deleted)' in |path|. + // |path| has to be at least as long as "/x (deleted)". + const size_t path_len = my_strlen(path); + if (path_len < kDeletedSuffixLen + 2) + return false; + if (my_strncmp(path + path_len - kDeletedSuffixLen, kDeletedSuffix, + kDeletedSuffixLen) != 0) { + return false; + } + + // Check |path| against the /proc/pid/exe 'symlink'. + char exe_link[NAME_MAX]; + if (!BuildProcPath(exe_link, pid_, "exe")) + return false; + MappingInfo new_mapping = {0}; + if (!SafeReadLink(exe_link, new_mapping.name)) + return false; + char new_path[PATH_MAX]; + if (!GetMappingAbsolutePath(new_mapping, new_path)) + return false; + if (my_strcmp(path, new_path) != 0) + return false; + + // Check to see if someone actually named their executable 'foo (deleted)'. + struct kernel_stat exe_stat; + struct kernel_stat new_path_stat; + if (sys_stat(exe_link, &exe_stat) == 0 && + sys_stat(new_path, &new_path_stat) == 0 && + exe_stat.st_dev == new_path_stat.st_dev && + exe_stat.st_ino == new_path_stat.st_ino) { + return false; + } + + my_memcpy(path, exe_link, NAME_MAX); + return true; +} + +} // namespace google_breakpad diff --git a/src/client/linux/minidump_writer/linux_dumper.h b/src/client/linux/minidump_writer/linux_dumper.h new file mode 100644 index 0000000..2d5b2e5 --- /dev/null +++ b/src/client/linux/minidump_writer/linux_dumper.h @@ -0,0 +1,327 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// linux_dumper.h: Define the google_breakpad::LinuxDumper class, which +// is a base class for extracting information of a crashed process. It +// was originally a complete implementation using the ptrace API, but +// has been refactored to allow derived implementations supporting both +// ptrace and core dump. A portion of the original implementation is now +// in google_breakpad::LinuxPtraceDumper (see linux_ptrace_dumper.h for +// details). + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_ + +#include +#include +#if defined(__ANDROID__) +#include +#endif +#include +#include +#include +#include + +#include + +#include "client/linux/dump_writer_common/mapping_info.h" +#include "client/linux/dump_writer_common/thread_info.h" +#include "common/linux/file_id.h" +#include "common/memory_allocator.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Typedef for our parsing of the auxv variables in /proc/pid/auxv. +#if defined(__i386) || defined(__ARM_EABI__) || \ + (defined(__mips__) && _MIPS_SIM == _ABIO32) || \ + (defined(__riscv) && __riscv_xlen == 32) +typedef Elf32_auxv_t elf_aux_entry; +#elif defined(__x86_64) || defined(__aarch64__) || \ + (defined(__mips__) && _MIPS_SIM != _ABIO32) || \ + (defined(__riscv) && __riscv_xlen == 64) +typedef Elf64_auxv_t elf_aux_entry; +#endif + +typedef __typeof__(((elf_aux_entry*) 0)->a_un.a_val) elf_aux_val_t; + +// When we find the VDSO mapping in the process's address space, this +// is the name we use for it when writing it to the minidump. +// This should always be less than NAME_MAX! +const char kLinuxGateLibraryName[] = "linux-gate.so"; + +class LinuxDumper { + public: + // The |root_prefix| is prepended to mapping paths before opening them, which + // is useful if the crash originates from a chroot. + explicit LinuxDumper(pid_t pid, const char* root_prefix = ""); + + virtual ~LinuxDumper(); + + // Parse the data for |threads| and |mappings|. + virtual bool Init(); + + // Take any actions that could not be taken in Init(). LateInit() is + // called after all other caller's initialization is complete, and in + // particular after it has called ThreadsSuspend(), so that ptrace is + // available. + virtual bool LateInit(); + + // Return true if the dumper performs a post-mortem dump. + virtual bool IsPostMortem() const = 0; + + // Suspend/resume all threads in the given process. + virtual bool ThreadsSuspend() = 0; + virtual bool ThreadsResume() = 0; + + // Read information about the |index|-th thread of |threads_|. + // Returns true on success. One must have called |ThreadsSuspend| first. + virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info) = 0; + + size_t GetMainThreadIndex() const { + for (size_t i = 0; i < threads_.size(); ++i) { + if (threads_[i] == pid_) return i; + } + return -1u; + } + + // These are only valid after a call to |Init|. + const wasteful_vector& threads() { return threads_; } + const wasteful_vector& mappings() { return mappings_; } + const MappingInfo* FindMapping(const void* address) const; + // Find the mapping which the given memory address falls in. Unlike + // FindMapping, this method uses the unadjusted mapping address + // ranges from the kernel, rather than the ranges that have had the + // load bias applied. + const MappingInfo* FindMappingNoBias(uintptr_t address) const; + const wasteful_vector& auxv() { return auxv_; } + + // Find a block of memory to take as the stack given the top of stack pointer. + // stack: (output) the lowest address in the memory area + // stack_len: (output) the length of the memory area + // stack_top: the current top of the stack + bool GetStackInfo(const void** stack, size_t* stack_len, uintptr_t stack_top); + + // Sanitize a copy of the stack by overwriting words that are not + // pointers with a sentinel (0x0defaced). + // stack_copy: a copy of the stack to sanitize. |stack_copy| might + // not be word aligned, but it represents word aligned + // data copied from another location. + // stack_len: the length of the allocation pointed to by |stack_copy|. + // stack_pointer: the address of the stack pointer (used to locate + // the stack mapping, as an optimization). + // sp_offset: the offset relative to stack_copy that reflects the + // current value of the stack pointer. + void SanitizeStackCopy(uint8_t* stack_copy, size_t stack_len, + uintptr_t stack_pointer, uintptr_t sp_offset); + + // Test whether |stack_copy| contains a pointer-aligned word that + // could be an address within a given mapping. + // stack_copy: a copy of the stack to check. |stack_copy| might + // not be word aligned, but it represents word aligned + // data copied from another location. + // stack_len: the length of the allocation pointed to by |stack_copy|. + // sp_offset: the offset relative to stack_copy that reflects the + // current value of the stack pointer. + // mapping: the mapping against which to test stack words. + bool StackHasPointerToMapping(const uint8_t* stack_copy, size_t stack_len, + uintptr_t sp_offset, + const MappingInfo& mapping); + + PageAllocator* allocator() { return &allocator_; } + + // Copy content of |length| bytes from a given process |child|, + // starting from |src|, into |dest|. Returns true on success. + virtual bool CopyFromProcess(void* dest, pid_t child, const void* src, + size_t length) = 0; + + // Builds a proc path for a certain pid for a node (/proc//). + // |path| is a character array of at least NAME_MAX bytes to return the + // result.|node| is the final node without any slashes. Returns true on + // success. + virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const = 0; + + // Generate a File ID from the .text section of a mapped entry. + // If not a member, mapping_id is ignored. This method can also manipulate the + // |mapping|.name to truncate "(deleted)" from the file name if necessary. + bool ElfFileIdentifierForMapping(const MappingInfo& mapping, + bool member, + unsigned int mapping_id, + wasteful_vector& identifier); + + void SetCrashInfoFromSigInfo(const siginfo_t& siginfo); + + uintptr_t crash_address() const { return crash_address_; } + void set_crash_address(uintptr_t crash_address) { + crash_address_ = crash_address; + } + + int crash_signal() const { return crash_signal_; } + void set_crash_signal(int crash_signal) { crash_signal_ = crash_signal; } + const char* GetCrashSignalString() const; + + void set_crash_signal_code(int code) { crash_signal_code_ = code; } + int crash_signal_code() const { return crash_signal_code_; } + + void set_crash_exception_info(const std::vector& exception_info) { + assert(exception_info.size() <= MD_EXCEPTION_MAXIMUM_PARAMETERS); + crash_exception_info_ = exception_info; + } + const std::vector& crash_exception_info() const { + return crash_exception_info_; + } + + pid_t crash_thread() const { return crash_thread_; } + void set_crash_thread(pid_t crash_thread) { crash_thread_ = crash_thread; } + + // Concatenates the |root_prefix_| and |mapping| path. Writes into |path| and + // returns true unless the string is too long. + bool GetMappingAbsolutePath(const MappingInfo& mapping, + char path[PATH_MAX]) const; + + // Extracts the effective path and file name of from |mapping|. In most cases + // the effective name/path are just the mapping's path and basename. In some + // other cases, however, a library can be mapped from an archive (e.g., when + // loading .so libs from an apk on Android) and this method is able to + // reconstruct the original file name. + void GetMappingEffectiveNameAndPath(const MappingInfo& mapping, + char* file_path, + size_t file_path_size, + char* file_name, + size_t file_name_size); + + protected: + bool ReadAuxv(); + + virtual bool EnumerateMappings(); + + virtual bool EnumerateThreads() = 0; + + // For the case where a running program has been deleted, it'll show up in + // /proc/pid/maps as "/path/to/program (deleted)". If this is the case, then + // see if '/path/to/program (deleted)' matches /proc/pid/exe and return + // /proc/pid/exe in |path| so ELF identifier generation works correctly. This + // also checks to see if '/path/to/program (deleted)' exists, so it does not + // get fooled by a poorly named binary. + // For programs that don't end with ' (deleted)', this is a no-op. + // This assumes |path| is a buffer with length NAME_MAX. + // Returns true if |path| is modified. + bool HandleDeletedFileInMapping(char* path) const; + + // ID of the crashed process. + const pid_t pid_; + + // Path of the root directory to which mapping paths are relative. + const char* const root_prefix_; + + // Virtual address at which the process crashed. + uintptr_t crash_address_; + + // Signal that terminated the crashed process. + int crash_signal_; + + // The code associated with |crash_signal_|. + int crash_signal_code_; + + // The additional fields associated with |crash_signal_|. + std::vector crash_exception_info_; + + // ID of the crashed thread. + pid_t crash_thread_; + + mutable PageAllocator allocator_; + + // IDs of all the threads. + wasteful_vector threads_; + + // Info from /proc//maps. + wasteful_vector mappings_; + + // Info from /proc//auxv + wasteful_vector auxv_; + +#if defined(__ANDROID__) + private: + // Android M and later support packed ELF relocations in shared libraries. + // Packing relocations changes the vaddr of the LOAD segments, such that + // the effective load bias is no longer the same as the start address of + // the memory mapping containing the executable parts of the library. The + // packing is applied to the stripped library run on the target, but not to + // any other library, and in particular not to the library used to generate + // breakpad symbols. As a result, we need to adjust the |start_addr| for + // any mapping that results from a shared library that contains Android + // packed relocations, so that it properly represents the effective library + // load bias. The following functions support this adjustment. + + // Check that a given mapping at |start_addr| is for an ELF shared library. + // If it is, place the ELF header in |ehdr| and return true. + // The first LOAD segment in an ELF shared library has offset zero, so the + // ELF file header is at the start of this map entry, and in already mapped + // memory. + bool GetLoadedElfHeader(uintptr_t start_addr, ElfW(Ehdr)* ehdr); + + // For the ELF file mapped at |start_addr|, iterate ELF program headers to + // find the min vaddr of all program header LOAD segments, the vaddr for + // the DYNAMIC segment, and a count of DYNAMIC entries. Return values in + // |min_vaddr_ptr|, |dyn_vaddr_ptr|, and |dyn_count_ptr|. + // The program header table is also in already mapped memory. + void ParseLoadedElfProgramHeaders(ElfW(Ehdr)* ehdr, + uintptr_t start_addr, + uintptr_t* min_vaddr_ptr, + uintptr_t* dyn_vaddr_ptr, + size_t* dyn_count_ptr); + + // Search the DYNAMIC tags for the ELF file with the given |load_bias|, and + // return true if the tags indicate that the file contains Android packed + // relocations. Dynamic tags are found at |dyn_vaddr| past the |load_bias|. + bool HasAndroidPackedRelocations(uintptr_t load_bias, + uintptr_t dyn_vaddr, + size_t dyn_count); + + // If the ELF file mapped at |start_addr| contained Android packed + // relocations, return the load bias that the system linker (or Chromium + // crazy linker) will have used. If the file did not contain Android + // packed relocations, returns |start_addr|, indicating that no adjustment + // is necessary. + // The effective load bias is |start_addr| adjusted downwards by the + // min vaddr in the library LOAD segments. + uintptr_t GetEffectiveLoadBias(ElfW(Ehdr)* ehdr, uintptr_t start_addr); + + // Called from LateInit(). Iterates |mappings_| and rewrites the |start_addr| + // field of any that represent ELF shared libraries with Android packed + // relocations, so that |start_addr| is the load bias that the system linker + // (or Chromium crazy linker) used. This value matches the addresses produced + // when the non-relocation-packed library is used for breakpad symbol + // generation. + void LatePostprocessMappings(); +#endif // __ANDROID__ +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_HANDLER_LINUX_DUMPER_H_ diff --git a/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc b/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc new file mode 100644 index 0000000..5a135fd --- /dev/null +++ b/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc @@ -0,0 +1,100 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Helper program for the linux_dumper class, which creates a bunch of +// threads. The first word of each thread's stack is set to the thread +// id. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include + +#include "common/scoped_ptr.h" +#include "third_party/lss/linux_syscall_support.h" + +#if defined(__ARM_EABI__) +#define TID_PTR_REGISTER "r3" +#elif defined(__aarch64__) +#define TID_PTR_REGISTER "x3" +#elif defined(__i386) +#define TID_PTR_REGISTER "ecx" +#elif defined(__x86_64) +#define TID_PTR_REGISTER "rcx" +#elif defined(__mips__) +#define TID_PTR_REGISTER "$1" +#elif defined(__riscv) +#define TID_PTR_REGISTER "x4" +#else +#error This test has not been ported to this platform. +#endif + +void* thread_function(void* data) { + int pipefd = *static_cast(data); + volatile pid_t* thread_id = new pid_t; + *thread_id = syscall(__NR_gettid); + // Signal parent that a thread has started. + uint8_t byte = 1; + if (write(pipefd, &byte, sizeof(byte)) != sizeof(byte)) { + perror("ERROR: parent notification failed"); + return NULL; + } + register volatile pid_t* thread_id_ptr asm(TID_PTR_REGISTER) = thread_id; + while (true) + asm volatile ("" : : "r" (thread_id_ptr)); + return NULL; +} + +int main(int argc, char* argv[]) { + if (argc < 3) { + fprintf(stderr, + "usage: linux_dumper_unittest_helper <# of threads>\n"); + return 1; + } + int pipefd = atoi(argv[1]); + int num_threads = atoi(argv[2]); + if (num_threads < 1) { + fprintf(stderr, "ERROR: number of threads is 0"); + return 1; + } + google_breakpad::scoped_array threads(new pthread_t[num_threads]); + pthread_attr_t thread_attributes; + pthread_attr_init(&thread_attributes); + pthread_attr_setdetachstate(&thread_attributes, PTHREAD_CREATE_DETACHED); + for (int i = 1; i < num_threads; i++) { + pthread_create(&threads[i], &thread_attributes, &thread_function, &pipefd); + } + thread_function(&pipefd); + return 0; +} diff --git a/src/client/linux/minidump_writer/linux_ptrace_dumper.cc b/src/client/linux/minidump_writer/linux_ptrace_dumper.cc new file mode 100644 index 0000000..2adc39e --- /dev/null +++ b/src/client/linux/minidump_writer/linux_ptrace_dumper.cc @@ -0,0 +1,390 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// linux_ptrace_dumper.cc: Implement google_breakpad::LinuxPtraceDumper. +// See linux_ptrace_dumper.h for detals. +// This class was originally splitted from google_breakpad::LinuxDumper. + +// This code deals with the mechanics of getting information about a crashed +// process. Since this code may run in a compromised address space, the same +// rules apply as detailed at the top of minidump_writer.h: no libc calls and +// use the alternative allocator. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/linux/minidump_writer/linux_ptrace_dumper.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__i386) +#include +#endif + +#include "client/linux/minidump_writer/directory_reader.h" +#include "client/linux/minidump_writer/line_reader.h" +#include "common/linux/linux_libc_support.h" +#include "third_party/lss/linux_syscall_support.h" + +// Suspends a thread by attaching to it. +static bool SuspendThread(pid_t pid) { + // This may fail if the thread has just died or debugged. + errno = 0; + if (sys_ptrace(PTRACE_ATTACH, pid, NULL, NULL) != 0 && + errno != 0) { + return false; + } + while (sys_waitpid(pid, NULL, __WALL) < 0) { + if (errno != EINTR) { + sys_ptrace(PTRACE_DETACH, pid, NULL, NULL); + return false; + } + } +#if defined(__i386) || defined(__x86_64) + // On x86, the stack pointer is NULL or -1, when executing trusted code in + // the seccomp sandbox. Not only does this cause difficulties down the line + // when trying to dump the thread's stack, it also results in the minidumps + // containing information about the trusted threads. This information is + // generally completely meaningless and just pollutes the minidumps. + // We thus test the stack pointer and exclude any threads that are part of + // the seccomp sandbox's trusted code. + user_regs_struct regs; + if (sys_ptrace(PTRACE_GETREGS, pid, NULL, ®s) == -1 || +#if defined(__i386) + !regs.esp +#elif defined(__x86_64) + !regs.rsp +#endif + ) { + sys_ptrace(PTRACE_DETACH, pid, NULL, NULL); + return false; + } +#endif + return true; +} + +// Resumes a thread by detaching from it. +static bool ResumeThread(pid_t pid) { + return sys_ptrace(PTRACE_DETACH, pid, NULL, NULL) >= 0; +} + +namespace google_breakpad { + +LinuxPtraceDumper::LinuxPtraceDumper(pid_t pid) + : LinuxDumper(pid), + threads_suspended_(false) { +} + +bool LinuxPtraceDumper::BuildProcPath(char* path, pid_t pid, + const char* node) const { + if (!path || !node || pid <= 0) + return false; + + size_t node_len = my_strlen(node); + if (node_len == 0) + return false; + + const unsigned pid_len = my_uint_len(pid); + const size_t total_length = 6 + pid_len + 1 + node_len; + if (total_length >= NAME_MAX) + return false; + + my_memcpy(path, "/proc/", 6); + my_uitos(path + 6, pid, pid_len); + path[6 + pid_len] = '/'; + my_memcpy(path + 6 + pid_len + 1, node, node_len); + path[total_length] = '\0'; + return true; +} + +bool LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child, + const void* src, size_t length) { + unsigned long tmp = 55; + size_t done = 0; + static const size_t word_size = sizeof(tmp); + uint8_t* const local = (uint8_t*) dest; + uint8_t* const remote = (uint8_t*) src; + + while (done < length) { + const size_t l = (length - done > word_size) ? word_size : (length - done); + if (sys_ptrace(PTRACE_PEEKDATA, child, remote + done, &tmp) == -1) { + tmp = 0; + } + my_memcpy(local + done, &tmp, l); + done += l; + } + return true; +} + +bool LinuxPtraceDumper::ReadRegisterSet(ThreadInfo* info, pid_t tid) +{ +#ifdef PTRACE_GETREGSET + struct iovec io; + info->GetGeneralPurposeRegisters(&io.iov_base, &io.iov_len); + if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, (void*)&io) == -1) { + return false; + } + + info->GetFloatingPointRegisters(&io.iov_base, &io.iov_len); + if (sys_ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, (void*)&io) == -1) { + return false; + } + return true; +#else + return false; +#endif +} + +bool LinuxPtraceDumper::ReadRegisters(ThreadInfo* info, pid_t tid) { +#ifdef PTRACE_GETREGS + void* gp_addr; + info->GetGeneralPurposeRegisters(&gp_addr, NULL); + if (sys_ptrace(PTRACE_GETREGS, tid, NULL, gp_addr) == -1) { + return false; + } + + // When running on arm processors the binary may be built with softfp or + // hardfp. If built with softfp we have no hardware registers to read from, + // so the following read will always fail. gcc defines __SOFTFP__ macro, + // clang13 does not do so. see: https://reviews.llvm.org/D135680. + // If you are using clang and the macro is NOT defined, please include the + // macro define for applicable targets. +#if !defined(__SOFTFP__) +#if !(defined(__ANDROID__) && defined(__ARM_EABI__)) + // When running an arm build on an arm64 device, attempting to get the + // floating point registers fails. On Android, the floating point registers + // aren't written to the cpu context anyway, so just don't get them here. + // See http://crbug.com/508324 + void* fp_addr; + info->GetFloatingPointRegisters(&fp_addr, NULL); + if (sys_ptrace(PTRACE_GETFPREGS, tid, NULL, fp_addr) == -1) { + return false; + } +#endif // !(defined(__ANDROID__) && defined(__ARM_EABI__)) +#endif // !defined(__SOFTFP__) + return true; +#else // PTRACE_GETREGS + return false; +#endif +} + +// Read thread info from /proc/$pid/status. +// Fill out the |tgid|, |ppid| and |pid| members of |info|. If unavailable, +// these members are set to -1. Returns true iff all three members are +// available. +bool LinuxPtraceDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) { + if (index >= threads_.size()) + return false; + + pid_t tid = threads_[index]; + + assert(info != NULL); + char status_path[NAME_MAX]; + if (!BuildProcPath(status_path, tid, "status")) + return false; + + const int fd = sys_open(status_path, O_RDONLY, 0); + if (fd < 0) + return false; + + LineReader* const line_reader = new(allocator_) LineReader(fd); + const char* line; + unsigned line_len; + + info->ppid = info->tgid = -1; + + while (line_reader->GetNextLine(&line, &line_len)) { + if (my_strncmp("Tgid:\t", line, 6) == 0) { + my_strtoui(&info->tgid, line + 6); + } else if (my_strncmp("PPid:\t", line, 6) == 0) { + my_strtoui(&info->ppid, line + 6); + } + + line_reader->PopLine(line_len); + } + sys_close(fd); + + if (info->ppid == -1 || info->tgid == -1) + return false; + + if (!ReadRegisterSet(info, tid)) { + if (!ReadRegisters(info, tid)) { + return false; + } + } + +#if defined(__i386) +#if !defined(bit_FXSAVE) // e.g. Clang +#define bit_FXSAVE bit_FXSR +#endif + // Detect if the CPU supports the FXSAVE/FXRSTOR instructions + int eax, ebx, ecx, edx; + __cpuid(1, eax, ebx, ecx, edx); + if (edx & bit_FXSAVE) { + if (sys_ptrace(PTRACE_GETFPXREGS, tid, NULL, &info->fpxregs) == -1) { + return false; + } + } else { + memset(&info->fpxregs, 0, sizeof(info->fpxregs)); + } +#endif // defined(__i386) + +#if defined(__i386) || defined(__x86_64) + for (unsigned i = 0; i < ThreadInfo::kNumDebugRegisters; ++i) { + if (sys_ptrace( + PTRACE_PEEKUSER, tid, + reinterpret_cast (offsetof(struct user, + u_debugreg[0]) + i * + sizeof(debugreg_t)), + &info->dregs[i]) == -1) { + return false; + } + } +#endif + +#if defined(__mips__) + sys_ptrace(PTRACE_PEEKUSER, tid, + reinterpret_cast(PC), &info->mcontext.pc); + sys_ptrace(PTRACE_PEEKUSER, tid, + reinterpret_cast(DSP_BASE), &info->mcontext.hi1); + sys_ptrace(PTRACE_PEEKUSER, tid, + reinterpret_cast(DSP_BASE + 1), &info->mcontext.lo1); + sys_ptrace(PTRACE_PEEKUSER, tid, + reinterpret_cast(DSP_BASE + 2), &info->mcontext.hi2); + sys_ptrace(PTRACE_PEEKUSER, tid, + reinterpret_cast(DSP_BASE + 3), &info->mcontext.lo2); + sys_ptrace(PTRACE_PEEKUSER, tid, + reinterpret_cast(DSP_BASE + 4), &info->mcontext.hi3); + sys_ptrace(PTRACE_PEEKUSER, tid, + reinterpret_cast(DSP_BASE + 5), &info->mcontext.lo3); + sys_ptrace(PTRACE_PEEKUSER, tid, + reinterpret_cast(DSP_CONTROL), &info->mcontext.dsp); +#endif + + const uint8_t* stack_pointer; +#if defined(__i386) + my_memcpy(&stack_pointer, &info->regs.esp, sizeof(info->regs.esp)); +#elif defined(__x86_64) + my_memcpy(&stack_pointer, &info->regs.rsp, sizeof(info->regs.rsp)); +#elif defined(__ARM_EABI__) + my_memcpy(&stack_pointer, &info->regs.ARM_sp, sizeof(info->regs.ARM_sp)); +#elif defined(__aarch64__) + my_memcpy(&stack_pointer, &info->regs.sp, sizeof(info->regs.sp)); +#elif defined(__mips__) + stack_pointer = + reinterpret_cast(info->mcontext.gregs[MD_CONTEXT_MIPS_REG_SP]); +#elif defined(__riscv) + stack_pointer = reinterpret_cast( + info->mcontext.__gregs[MD_CONTEXT_RISCV_REG_SP]); +#else +# error "This code hasn't been ported to your platform yet." +#endif + info->stack_pointer = reinterpret_cast(stack_pointer); + + return true; +} + +bool LinuxPtraceDumper::IsPostMortem() const { + return false; +} + +bool LinuxPtraceDumper::ThreadsSuspend() { + if (threads_suspended_) + return true; + for (size_t i = 0; i < threads_.size(); ++i) { + if (!SuspendThread(threads_[i])) { + // If the thread either disappeared before we could attach to it, or if + // it was part of the seccomp sandbox's trusted code, it is OK to + // silently drop it from the minidump. + if (i < threads_.size() - 1) { + my_memmove(&threads_[i], &threads_[i + 1], + (threads_.size() - i - 1) * sizeof(threads_[i])); + } + threads_.resize(threads_.size() - 1); + --i; + } + } + threads_suspended_ = true; + return threads_.size() > 0; +} + +bool LinuxPtraceDumper::ThreadsResume() { + if (!threads_suspended_) + return false; + bool good = true; + for (size_t i = 0; i < threads_.size(); ++i) + good &= ResumeThread(threads_[i]); + threads_suspended_ = false; + return good; +} + +// Parse /proc/$pid/task to list all the threads of the process identified by +// pid. +bool LinuxPtraceDumper::EnumerateThreads() { + char task_path[NAME_MAX]; + if (!BuildProcPath(task_path, pid_, "task")) + return false; + + const int fd = sys_open(task_path, O_RDONLY | O_DIRECTORY, 0); + if (fd < 0) + return false; + DirectoryReader* dir_reader = new(allocator_) DirectoryReader(fd); + + // The directory may contain duplicate entries which we filter by assuming + // that they are consecutive. + int last_tid = -1; + const char* dent_name; + while (dir_reader->GetNextEntry(&dent_name)) { + if (my_strcmp(dent_name, ".") && + my_strcmp(dent_name, "..")) { + int tid = 0; + if (my_strtoui(&tid, dent_name) && + last_tid != tid) { + last_tid = tid; + threads_.push_back(tid); + } + } + dir_reader->PopEntry(); + } + + sys_close(fd); + return true; +} + +} // namespace google_breakpad diff --git a/src/client/linux/minidump_writer/linux_ptrace_dumper.h b/src/client/linux/minidump_writer/linux_ptrace_dumper.h new file mode 100644 index 0000000..7828934 --- /dev/null +++ b/src/client/linux/minidump_writer/linux_ptrace_dumper.h @@ -0,0 +1,100 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// linux_ptrace_dumper.h: Define the google_breakpad::LinuxPtraceDumper +// class, which is derived from google_breakpad::LinuxDumper to extract +// information from a crashed process via ptrace. +// This class was originally splitted from google_breakpad::LinuxDumper. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_PTRACE_DUMPER_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_PTRACE_DUMPER_H_ + +#include "client/linux/minidump_writer/linux_dumper.h" + +namespace google_breakpad { + +class LinuxPtraceDumper : public LinuxDumper { + public: + // Constructs a dumper for extracting information of a given process + // with a process ID of |pid|. + explicit LinuxPtraceDumper(pid_t pid); + + // Implements LinuxDumper::BuildProcPath(). + // Builds a proc path for a certain pid for a node (/proc//). + // |path| is a character array of at least NAME_MAX bytes to return the + // result. |node| is the final node without any slashes. Returns true on + // success. + virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const; + + // Implements LinuxDumper::CopyFromProcess(). + // Copies content of |length| bytes from a given process |child|, + // starting from |src|, into |dest|. This method uses ptrace to extract + // the content from the target process. Always returns true. + virtual bool CopyFromProcess(void* dest, pid_t child, const void* src, + size_t length); + + // Implements LinuxDumper::GetThreadInfoByIndex(). + // Reads information about the |index|-th thread of |threads_|. + // Returns true on success. One must have called |ThreadsSuspend| first. + virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info); + + // Implements LinuxDumper::IsPostMortem(). + // Always returns false to indicate this dumper performs a dump of + // a crashed process via ptrace. + virtual bool IsPostMortem() const; + + // Implements LinuxDumper::ThreadsSuspend(). + // Suspends all threads in the given process. Returns true on success. + virtual bool ThreadsSuspend(); + + // Implements LinuxDumper::ThreadsResume(). + // Resumes all threads in the given process. Returns true on success. + virtual bool ThreadsResume(); + + protected: + // Implements LinuxDumper::EnumerateThreads(). + // Enumerates all threads of the given process into |threads_|. + virtual bool EnumerateThreads(); + + private: + // Set to true if all threads of the crashed process are suspended. + bool threads_suspended_; + + // Read the tracee's registers on kernel with PTRACE_GETREGSET support. + // Returns false if PTRACE_GETREGSET is not defined. + // Returns true on success. + bool ReadRegisterSet(ThreadInfo* info, pid_t tid); + + // Read the tracee's registers on kernel with PTRACE_GETREGS support. + // Returns true on success. + bool ReadRegisters(ThreadInfo* info, pid_t tid); +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_HANDLER_LINUX_PTRACE_DUMPER_H_ diff --git a/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc b/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc new file mode 100644 index 0000000..16a9daf --- /dev/null +++ b/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc @@ -0,0 +1,590 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// linux_ptrace_dumper_unittest.cc: +// Unit tests for google_breakpad::LinuxPtraceDumper. +// +// This file was renamed from linux_dumper_unittest.cc and modified due +// to LinuxDumper being splitted into two classes. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "client/linux/minidump_writer/linux_ptrace_dumper.h" +#include "client/linux/minidump_writer/minidump_writer_unittest_utils.h" +#include "common/linux/eintr_wrapper.h" +#include "common/linux/file_id.h" +#include "common/linux/ignore_ret.h" +#include "common/linux/safe_readlink.h" +#include "common/memory_allocator.h" +#include "common/using_std_string.h" + +#ifndef PR_SET_PTRACER +#define PR_SET_PTRACER 0x59616d61 +#endif + +using namespace google_breakpad; +using google_breakpad::elf::FileID; +using google_breakpad::elf::kDefaultBuildIdSize; + +namespace { + +pid_t SetupChildProcess(int number_of_threads) { + char kNumberOfThreadsArgument[2]; + sprintf(kNumberOfThreadsArgument, "%d", number_of_threads); + + int fds[2]; + EXPECT_NE(-1, pipe(fds)); + + pid_t child_pid = fork(); + if (child_pid == 0) { + // In child process. + close(fds[0]); + + string helper_path(GetHelperBinary()); + if (helper_path.empty()) { + fprintf(stderr, "Couldn't find helper binary\n"); + _exit(1); + } + + // Pass the pipe fd and the number of threads as arguments. + char pipe_fd_string[8]; + sprintf(pipe_fd_string, "%d", fds[1]); + execl(helper_path.c_str(), + "linux_dumper_unittest_helper", + pipe_fd_string, + kNumberOfThreadsArgument, + NULL); + // Kill if we get here. + printf("Errno from exec: %d", errno); + std::string err_str = "Exec of " + helper_path + " failed"; + perror(err_str.c_str()); + _exit(1); + } + close(fds[1]); + + // Wait for all child threads to indicate that they have started + for (int threads = 0; threads < number_of_threads; threads++) { + struct pollfd pfd; + memset(&pfd, 0, sizeof(pfd)); + pfd.fd = fds[0]; + pfd.events = POLLIN | POLLERR; + + const int r = HANDLE_EINTR(poll(&pfd, 1, 1000)); + EXPECT_EQ(1, r); + EXPECT_TRUE(pfd.revents & POLLIN); + uint8_t junk; + EXPECT_EQ(read(fds[0], &junk, sizeof(junk)), + static_cast(sizeof(junk))); + } + close(fds[0]); + + // There is a race here because we may stop a child thread before + // it is actually running the busy loop. Empirically this sleep + // is sufficient to avoid the race. + usleep(100000); + return child_pid; +} + +typedef wasteful_vector id_vector; +typedef testing::Test LinuxPtraceDumperTest; + +/* Fixture for running tests in a child process. */ +class LinuxPtraceDumperChildTest : public testing::Test { + protected: + virtual void SetUp() { + child_pid_ = fork(); +#ifndef __ANDROID__ + prctl(PR_SET_PTRACER, child_pid_); +#endif + } + + /* Gtest is calling TestBody from this class, which sets up a child + * process in which the RealTestBody virtual member is called. + * As such, TestBody is not supposed to be overridden in derived classes. + */ + virtual void TestBody() /* final */ { + if (child_pid_ == 0) { + // child process + RealTestBody(); + _exit(HasFatalFailure() ? kFatalFailure : + (HasNonfatalFailure() ? kNonFatalFailure : 0)); + } + + ASSERT_TRUE(child_pid_ > 0); + int status; + waitpid(child_pid_, &status, 0); + if (WEXITSTATUS(status) == kFatalFailure) { + GTEST_FATAL_FAILURE_("Test failed in child process"); + } else if (WEXITSTATUS(status) == kNonFatalFailure) { + GTEST_NONFATAL_FAILURE_("Test failed in child process"); + } + } + + /* Gtest defines TestBody functions through its macros, but classes + * derived from this one need to define RealTestBody instead. + * This is achieved by defining a TestBody macro further below. + */ + virtual void RealTestBody() = 0; + + id_vector make_vector() { + return id_vector(&allocator, kDefaultBuildIdSize); + } + + private: + static const int kFatalFailure = 1; + static const int kNonFatalFailure = 2; + + pid_t child_pid_; + PageAllocator allocator; +}; + +} // namespace + +/* Replace TestBody declarations within TEST*() with RealTestBody + * declarations */ +#define TestBody RealTestBody + +TEST_F(LinuxPtraceDumperChildTest, Setup) { + LinuxPtraceDumper dumper(getppid()); +} + +TEST_F(LinuxPtraceDumperChildTest, FindMappings) { + LinuxPtraceDumper dumper(getppid()); + ASSERT_TRUE(dumper.Init()); + + ASSERT_TRUE(dumper.FindMapping(reinterpret_cast(getpid))); + ASSERT_TRUE(dumper.FindMapping(reinterpret_cast(printf))); + ASSERT_FALSE(dumper.FindMapping(NULL)); +} + +TEST_F(LinuxPtraceDumperChildTest, ThreadList) { + LinuxPtraceDumper dumper(getppid()); + ASSERT_TRUE(dumper.Init()); + + ASSERT_GE(dumper.threads().size(), (size_t)1); + bool found = false; + for (size_t i = 0; i < dumper.threads().size(); ++i) { + if (dumper.threads()[i] == getppid()) { + ASSERT_FALSE(found); + found = true; + } + } + ASSERT_TRUE(found); +} + +// Helper stack class to close a file descriptor and unmap +// a mmap'ed mapping. +class StackHelper { + public: + StackHelper() + : fd_(-1), mapping_(NULL), size_(0) {} + ~StackHelper() { + if (size_) + munmap(mapping_, size_); + if (fd_ >= 0) + close(fd_); + } + void Init(int fd, char* mapping, size_t size) { + fd_ = fd; + mapping_ = mapping; + size_ = size; + } + + char* mapping() const { return mapping_; } + size_t size() const { return size_; } + + private: + int fd_; + char* mapping_; + size_t size_; +}; + +class LinuxPtraceDumperMappingsTest : public LinuxPtraceDumperChildTest { + protected: + virtual void SetUp(); + + string helper_path_; + size_t page_size_; + StackHelper helper_; +}; + +void LinuxPtraceDumperMappingsTest::SetUp() { + helper_path_ = GetHelperBinary(); + if (helper_path_.empty()) { + FAIL() << "Couldn't find helper binary"; + _exit(1); + } + + // mmap two segments out of the helper binary, one + // enclosed in the other, but with different protections. + page_size_ = sysconf(_SC_PAGESIZE); + const size_t kMappingSize = 3 * page_size_; + int fd = open(helper_path_.c_str(), O_RDONLY); + ASSERT_NE(-1, fd) << "Failed to open file: " << helper_path_ + << ", Error: " << strerror(errno); + char* mapping = + reinterpret_cast(mmap(NULL, + kMappingSize, + PROT_READ, + MAP_SHARED, + fd, + 0)); + ASSERT_TRUE(mapping); + + // Ensure that things get cleaned up. + helper_.Init(fd, mapping, kMappingSize); + + // Carve a page out of the first mapping with different permissions. + char* inside_mapping = reinterpret_cast( + mmap(mapping + 2 * page_size_, + page_size_, + PROT_NONE, + MAP_SHARED | MAP_FIXED, + fd, + // Map a different offset just to + // better test real-world conditions. + page_size_)); + ASSERT_TRUE(inside_mapping); + + LinuxPtraceDumperChildTest::SetUp(); +} + +TEST_F(LinuxPtraceDumperMappingsTest, MergedMappings) { + // Now check that LinuxPtraceDumper interpreted the mappings properly. + LinuxPtraceDumper dumper(getppid()); + ASSERT_TRUE(dumper.Init()); + int mapping_count = 0; + for (unsigned i = 0; i < dumper.mappings().size(); ++i) { + const MappingInfo& mapping = *dumper.mappings()[i]; + if (strcmp(mapping.name, this->helper_path_.c_str()) == 0) { + // This mapping should encompass the entire original mapped + // range. + EXPECT_EQ(reinterpret_cast(this->helper_.mapping()), + mapping.start_addr); + EXPECT_EQ(this->helper_.size(), mapping.size); + EXPECT_EQ(0U, mapping.offset); + mapping_count++; + } + } + EXPECT_EQ(1, mapping_count); +} + +TEST_F(LinuxPtraceDumperChildTest, BuildProcPath) { + const pid_t pid = getppid(); + LinuxPtraceDumper dumper(pid); + + char maps_path[NAME_MAX] = ""; + char maps_path_expected[NAME_MAX]; + snprintf(maps_path_expected, sizeof(maps_path_expected), + "/proc/%d/maps", pid); + EXPECT_TRUE(dumper.BuildProcPath(maps_path, pid, "maps")); + EXPECT_STREQ(maps_path_expected, maps_path); + + EXPECT_FALSE(dumper.BuildProcPath(NULL, pid, "maps")); + EXPECT_FALSE(dumper.BuildProcPath(maps_path, 0, "maps")); + EXPECT_FALSE(dumper.BuildProcPath(maps_path, pid, "")); + EXPECT_FALSE(dumper.BuildProcPath(maps_path, pid, NULL)); + + char long_node[NAME_MAX]; + size_t long_node_len = NAME_MAX - strlen("/proc/123") - 1; + memset(long_node, 'a', long_node_len); + long_node[long_node_len] = '\0'; + EXPECT_FALSE(dumper.BuildProcPath(maps_path, 123, long_node)); +} + +#if !defined(__ARM_EABI__) && !defined(__mips__) +// Ensure that the linux-gate VDSO is included in the mapping list. +TEST_F(LinuxPtraceDumperChildTest, MappingsIncludeLinuxGate) { + LinuxPtraceDumper dumper(getppid()); + ASSERT_TRUE(dumper.Init()); + + void* linux_gate_loc = + reinterpret_cast(dumper.auxv()[AT_SYSINFO_EHDR]); + ASSERT_TRUE(linux_gate_loc); + bool found_linux_gate = false; + + const wasteful_vector mappings = dumper.mappings(); + const MappingInfo* mapping; + for (unsigned i = 0; i < mappings.size(); ++i) { + mapping = mappings[i]; + if (!strcmp(mapping->name, kLinuxGateLibraryName)) { + found_linux_gate = true; + break; + } + } + EXPECT_TRUE(found_linux_gate); + EXPECT_EQ(linux_gate_loc, reinterpret_cast(mapping->start_addr)); + EXPECT_EQ(0, memcmp(linux_gate_loc, ELFMAG, SELFMAG)); +} + +// Ensure that the linux-gate VDSO can generate a non-zeroed File ID. +TEST_F(LinuxPtraceDumperChildTest, LinuxGateMappingID) { + LinuxPtraceDumper dumper(getppid()); + ASSERT_TRUE(dumper.Init()); + + bool found_linux_gate = false; + const wasteful_vector mappings = dumper.mappings(); + unsigned index = 0; + for (unsigned i = 0; i < mappings.size(); ++i) { + if (!strcmp(mappings[i]->name, kLinuxGateLibraryName)) { + found_linux_gate = true; + index = i; + break; + } + } + ASSERT_TRUE(found_linux_gate); + + // Need to suspend the child so ptrace actually works. + ASSERT_TRUE(dumper.ThreadsSuspend()); + id_vector identifier(make_vector()); + ASSERT_TRUE(dumper.ElfFileIdentifierForMapping(*mappings[index], + true, + index, + identifier)); + + id_vector empty_identifier(make_vector()); + empty_identifier.resize(kDefaultBuildIdSize, 0); + EXPECT_NE(empty_identifier, identifier); + EXPECT_TRUE(dumper.ThreadsResume()); +} +#endif + +TEST_F(LinuxPtraceDumperChildTest, FileIDsMatch) { + // Calculate the File ID of our binary using both + // FileID::ElfFileIdentifier and LinuxDumper::ElfFileIdentifierForMapping + // and ensure that we get the same result from both. + char exe_name[PATH_MAX]; + ASSERT_TRUE(SafeReadLink("/proc/self/exe", exe_name)); + + LinuxPtraceDumper dumper(getppid()); + ASSERT_TRUE(dumper.Init()); + const wasteful_vector mappings = dumper.mappings(); + bool found_exe = false; + unsigned i; + for (i = 0; i < mappings.size(); ++i) { + const MappingInfo* mapping = mappings[i]; + if (!strcmp(mapping->name, exe_name)) { + found_exe = true; + break; + } + } + ASSERT_TRUE(found_exe); + + id_vector identifier1(make_vector()); + id_vector identifier2(make_vector()); + EXPECT_TRUE(dumper.ElfFileIdentifierForMapping(*mappings[i], true, i, + identifier1)); + FileID fileid(exe_name); + EXPECT_TRUE(fileid.ElfFileIdentifier(identifier2)); + + string identifier_string1 = + FileID::ConvertIdentifierToUUIDString(identifier1); + string identifier_string2 = + FileID::ConvertIdentifierToUUIDString(identifier2); + EXPECT_EQ(identifier_string1, identifier_string2); +} + +/* Get back to normal behavior of TEST*() macros wrt TestBody. */ +#undef TestBody + +TEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) { + static const size_t kNumberOfThreadsInHelperProgram = 5; + + pid_t child_pid = SetupChildProcess(kNumberOfThreadsInHelperProgram); + ASSERT_NE(child_pid, -1); + + // Children are ready now. + LinuxPtraceDumper dumper(child_pid); + ASSERT_TRUE(dumper.Init()); +#if defined(THREAD_SANITIZER) + EXPECT_GE(dumper.threads().size(), (size_t)kNumberOfThreadsInHelperProgram); +#else + EXPECT_EQ(dumper.threads().size(), (size_t)kNumberOfThreadsInHelperProgram); +#endif + EXPECT_TRUE(dumper.ThreadsSuspend()); + + ThreadInfo one_thread; + size_t matching_threads = 0; + for (size_t i = 0; i < dumper.threads().size(); ++i) { + EXPECT_TRUE(dumper.GetThreadInfoByIndex(i, &one_thread)); + const void* stack; + size_t stack_len; + EXPECT_TRUE(dumper.GetStackInfo(&stack, &stack_len, + one_thread.stack_pointer)); + // In the helper program, we stored a pointer to the thread id in a + // specific register. Check that we can recover its value. +#if defined(__ARM_EABI__) + pid_t* process_tid_location = (pid_t*)(one_thread.regs.uregs[3]); +#elif defined(__aarch64__) + pid_t* process_tid_location = (pid_t*)(one_thread.regs.regs[3]); +#elif defined(__i386) + pid_t* process_tid_location = (pid_t*)(one_thread.regs.ecx); +#elif defined(__x86_64) + pid_t* process_tid_location = (pid_t*)(one_thread.regs.rcx); +#elif defined(__mips__) + pid_t* process_tid_location = + reinterpret_cast(one_thread.mcontext.gregs[1]); +#elif defined(__riscv) + pid_t* process_tid_location = + reinterpret_cast(one_thread.mcontext.__gregs[4]); +#else +#error This test has not been ported to this platform. +#endif + pid_t one_thread_id; + dumper.CopyFromProcess(&one_thread_id, + dumper.threads()[i], + process_tid_location, + 4); + matching_threads += (dumper.threads()[i] == one_thread_id) ? 1 : 0; + } + EXPECT_EQ(matching_threads, kNumberOfThreadsInHelperProgram); + EXPECT_TRUE(dumper.ThreadsResume()); + kill(child_pid, SIGKILL); + + // Reap child + int status; + ASSERT_NE(-1, HANDLE_EINTR(waitpid(child_pid, &status, 0))); + ASSERT_TRUE(WIFSIGNALED(status)); + ASSERT_EQ(SIGKILL, WTERMSIG(status)); +} + +TEST_F(LinuxPtraceDumperTest, SanitizeStackCopy) { + static const size_t kNumberOfThreadsInHelperProgram = 1; + + pid_t child_pid = SetupChildProcess(kNumberOfThreadsInHelperProgram); + ASSERT_NE(child_pid, -1); + + LinuxPtraceDumper dumper(child_pid); + ASSERT_TRUE(dumper.Init()); + EXPECT_TRUE(dumper.ThreadsSuspend()); + + ThreadInfo thread_info; + EXPECT_TRUE(dumper.GetThreadInfoByIndex(0, &thread_info)); + + const uintptr_t defaced = +#if defined(__LP64__) + 0x0defaced0defaced; +#else + 0x0defaced; +#endif + + uintptr_t simulated_stack[2]; + + // Pointers into the stack shouldn't be sanitized. + memset(simulated_stack, 0xff, sizeof(simulated_stack)); + simulated_stack[1] = thread_info.stack_pointer; + dumper.SanitizeStackCopy(reinterpret_cast(&simulated_stack), + sizeof(simulated_stack), thread_info.stack_pointer, + sizeof(uintptr_t)); + ASSERT_NE(simulated_stack[1], defaced); + + // Memory prior to the stack pointer should be cleared. + ASSERT_EQ(simulated_stack[0], 0u); + + // Small integers should not be sanitized. + for (int i = -4096; i <= 4096; ++i) { + memset(simulated_stack, 0, sizeof(simulated_stack)); + simulated_stack[0] = static_cast(i); + dumper.SanitizeStackCopy(reinterpret_cast(&simulated_stack), + sizeof(simulated_stack), thread_info.stack_pointer, + 0u); + ASSERT_NE(simulated_stack[0], defaced); + } + + // The instruction pointer definitely should point into an executable mapping. + const MappingInfo* mapping_info = dumper.FindMappingNoBias( + reinterpret_cast(thread_info.GetInstructionPointer())); + ASSERT_NE(mapping_info, nullptr); + ASSERT_TRUE(mapping_info->exec); + + // Pointers to code shouldn't be sanitized. + memset(simulated_stack, 0, sizeof(simulated_stack)); + simulated_stack[1] = thread_info.GetInstructionPointer(); + dumper.SanitizeStackCopy(reinterpret_cast(&simulated_stack), + sizeof(simulated_stack), thread_info.stack_pointer, + 0u); + ASSERT_NE(simulated_stack[0], defaced); + + // String fragments should be sanitized. + memcpy(simulated_stack, "abcdefghijklmnop", sizeof(simulated_stack)); + dumper.SanitizeStackCopy(reinterpret_cast(&simulated_stack), + sizeof(simulated_stack), thread_info.stack_pointer, + 0u); + ASSERT_EQ(simulated_stack[0], defaced); + ASSERT_EQ(simulated_stack[1], defaced); + + // Heap pointers should be sanititzed. +#if defined(__ARM_EABI__) + uintptr_t heap_addr = thread_info.regs.uregs[3]; +#elif defined(__aarch64__) + uintptr_t heap_addr = thread_info.regs.regs[3]; +#elif defined(__i386) + uintptr_t heap_addr = thread_info.regs.ecx; +#elif defined(__x86_64) + uintptr_t heap_addr = thread_info.regs.rcx; +#elif defined(__mips__) + uintptr_t heap_addr = thread_info.mcontext.gregs[1]; +#elif defined(__riscv) + uintptr_t heap_addr = thread_info.mcontext.__gregs[4]; +#else +#error This test has not been ported to this platform. +#endif + memset(simulated_stack, 0, sizeof(simulated_stack)); + simulated_stack[0] = heap_addr; + dumper.SanitizeStackCopy(reinterpret_cast(&simulated_stack), + sizeof(simulated_stack), thread_info.stack_pointer, + 0u); + ASSERT_EQ(simulated_stack[0], defaced); + + EXPECT_TRUE(dumper.ThreadsResume()); + kill(child_pid, SIGKILL); + + // Reap child. + int status; + ASSERT_NE(-1, HANDLE_EINTR(waitpid(child_pid, &status, 0))); + ASSERT_TRUE(WIFSIGNALED(status)); + ASSERT_EQ(SIGKILL, WTERMSIG(status)); +} diff --git a/src/client/linux/minidump_writer/minidump_writer.cc b/src/client/linux/minidump_writer/minidump_writer.cc new file mode 100644 index 0000000..27e10a4 --- /dev/null +++ b/src/client/linux/minidump_writer/minidump_writer.cc @@ -0,0 +1,1617 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This code writes out minidump files: +// http://msdn.microsoft.com/en-us/library/ms680378(VS.85,loband).aspx +// +// Minidumps are a Microsoft format which Breakpad uses for recording crash +// dumps. This code has to run in a compromised environment (the address space +// may have received SIGSEGV), thus the following rules apply: +// * You may not enter the dynamic linker. This means that we cannot call +// any symbols in a shared library (inc libc). Because of this we replace +// libc functions in linux_libc_support.h. +// * You may not call syscalls via the libc wrappers. This rule is a subset +// of the first rule but it bears repeating. We have direct wrappers +// around the system calls in linux_syscall_support.h. +// * You may not malloc. There's an alternative allocator in memory.h and +// a canonical instance in the LinuxDumper object. We use the placement +// new form to allocate objects and we don't delete them. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/linux/handler/minidump_descriptor.h" +#include "client/linux/minidump_writer/minidump_writer.h" +#include "client/minidump_file_writer-inl.h" + +#include +#include +#include +#include +#include +#if defined(__ANDROID__) +#include +#endif +#include +#include +#include +#include +#include +#include + +#include + +#include "client/linux/dump_writer_common/thread_info.h" +#include "client/linux/dump_writer_common/ucontext_reader.h" +#include "client/linux/handler/exception_handler.h" +#include "client/linux/minidump_writer/cpu_set.h" +#include "client/linux/minidump_writer/line_reader.h" +#include "client/linux/minidump_writer/linux_dumper.h" +#include "client/linux/minidump_writer/linux_ptrace_dumper.h" +#include "client/linux/minidump_writer/pe_file.h" +#include "client/linux/minidump_writer/pe_structs.h" +#include "client/linux/minidump_writer/proc_cpuinfo_reader.h" +#include "client/minidump_file_writer.h" +#include "common/linux/file_id.h" +#include "common/linux/linux_libc_support.h" +#include "common/minidump_type_helper.h" +#include "google_breakpad/common/minidump_format.h" +#include "third_party/lss/linux_syscall_support.h" + +namespace { + +using google_breakpad::AppMemoryList; +using google_breakpad::auto_wasteful_vector; +using google_breakpad::elf::kDefaultBuildIdSize; +using google_breakpad::ExceptionHandler; +using google_breakpad::CpuSet; +using google_breakpad::LineReader; +using google_breakpad::LinuxDumper; +using google_breakpad::LinuxPtraceDumper; +using google_breakpad::MDTypeHelper; +using google_breakpad::MappingEntry; +using google_breakpad::MappingInfo; +using google_breakpad::MappingList; +using google_breakpad::MinidumpFileWriter; +using google_breakpad::PageAllocator; +using google_breakpad::PEFile; +using google_breakpad::PEFileFormat; +using google_breakpad::ProcCpuInfoReader; +using google_breakpad::RawContextCPU; +using google_breakpad::RSDS_DEBUG_FORMAT; +using google_breakpad::ThreadInfo; +using google_breakpad::TypedMDRVA; +using google_breakpad::UContextReader; +using google_breakpad::UntypedMDRVA; +using google_breakpad::wasteful_vector; + +typedef MDTypeHelper::MDRawDebug MDRawDebug; +typedef MDTypeHelper::MDRawLinkMap MDRawLinkMap; + +class MinidumpWriter { + public: + // The following kLimit* constants are for when minidump_size_limit_ is set + // and the minidump size might exceed it. + // + // Estimate for how big each thread's stack will be (in bytes). + static const unsigned kLimitAverageThreadStackLength = 8 * 1024; + // Number of threads whose stack size we don't want to limit. These base + // threads will simply be the first N threads returned by the dumper (although + // the crashing thread will never be limited). Threads beyond this count are + // the extra threads. + static const unsigned kLimitBaseThreadCount = 20; + // Maximum stack size to dump for any extra thread (in bytes). + static const unsigned kLimitMaxExtraThreadStackLen = 2 * 1024; + // Make sure this number of additional bytes can fit in the minidump + // (exclude the stack data). + static const unsigned kLimitMinidumpFudgeFactor = 64 * 1024; + + MinidumpWriter(const char* minidump_path, + int minidump_fd, + const ExceptionHandler::CrashContext* context, + const MappingList& mappings, + const AppMemoryList& appmem, + bool skip_stacks_if_mapping_unreferenced, + uintptr_t principal_mapping_address, + bool sanitize_stacks, + LinuxDumper* dumper) + : fd_(minidump_fd), + path_(minidump_path), + ucontext_(context ? &context->context : NULL), +#if GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE + float_state_(context ? &context->float_state : NULL), +#endif + dumper_(dumper), + minidump_size_limit_(-1), + memory_blocks_(dumper_->allocator()), + mapping_list_(mappings), + app_memory_list_(appmem), + skip_stacks_if_mapping_unreferenced_( + skip_stacks_if_mapping_unreferenced), + principal_mapping_address_(principal_mapping_address), + principal_mapping_(nullptr), + sanitize_stacks_(sanitize_stacks) { + // Assert there should be either a valid fd or a valid path, not both. + assert(fd_ != -1 || minidump_path); + assert(fd_ == -1 || !minidump_path); + } + + bool Init() { + if (!dumper_->Init()) + return false; + + if (!dumper_->ThreadsSuspend() || !dumper_->LateInit()) + return false; + + if (skip_stacks_if_mapping_unreferenced_) { + principal_mapping_ = + dumper_->FindMappingNoBias(principal_mapping_address_); + if (!CrashingThreadReferencesPrincipalMapping()) + return false; + } + + if (fd_ != -1) + minidump_writer_.SetFile(fd_); + else if (!minidump_writer_.Open(path_)) + return false; + + return true; + } + + ~MinidumpWriter() { + // Don't close the file descriptor when it's been provided explicitly. + // Callers might still need to use it. + if (fd_ == -1) + minidump_writer_.Close(); + dumper_->ThreadsResume(); + } + + bool CrashingThreadReferencesPrincipalMapping() { + if (!ucontext_ || !principal_mapping_) + return false; + + const uintptr_t low_addr = + principal_mapping_->system_mapping_info.start_addr; + const uintptr_t high_addr = + principal_mapping_->system_mapping_info.end_addr; + + const uintptr_t stack_pointer = UContextReader::GetStackPointer(ucontext_); + const uintptr_t pc = UContextReader::GetInstructionPointer(ucontext_); + + if (pc >= low_addr && pc < high_addr) + return true; + + uint8_t* stack_copy; + const void* stack; + size_t stack_len; + + if (!dumper_->GetStackInfo(&stack, &stack_len, stack_pointer)) + return false; + + stack_copy = reinterpret_cast(Alloc(stack_len)); + dumper_->CopyFromProcess(stack_copy, GetCrashThread(), stack, stack_len); + + uintptr_t stack_pointer_offset = + stack_pointer - reinterpret_cast(stack); + + return dumper_->StackHasPointerToMapping( + stack_copy, stack_len, stack_pointer_offset, *principal_mapping_); + } + + bool Dump() { + // A minidump file contains a number of tagged streams. This is the number + // of stream which we write. + unsigned kNumWriters = 13; + + TypedMDRVA dir(&minidump_writer_); + { + // Ensure the header gets flushed, as that happens in the destructor. + // If a crash occurs somewhere below, at least the header will be + // intact. + TypedMDRVA header(&minidump_writer_); + if (!header.Allocate()) + return false; + + if (!dir.AllocateArray(kNumWriters)) + return false; + + my_memset(header.get(), 0, sizeof(MDRawHeader)); + + header.get()->signature = MD_HEADER_SIGNATURE; + header.get()->version = MD_HEADER_VERSION; + header.get()->time_date_stamp = time(NULL); + header.get()->stream_count = kNumWriters; + header.get()->stream_directory_rva = dir.position(); + } + + unsigned dir_index = 0; + MDRawDirectory dirent; + + if (!WriteThreadListStream(&dirent)) + return false; + dir.CopyIndex(dir_index++, &dirent); + + if (!WriteMappings(&dirent)) + return false; + dir.CopyIndex(dir_index++, &dirent); + + if (!WriteAppMemory()) + return false; + + if (!WriteMemoryListStream(&dirent)) + return false; + dir.CopyIndex(dir_index++, &dirent); + + if (!WriteExceptionStream(&dirent)) + return false; + dir.CopyIndex(dir_index++, &dirent); + + if (!WriteSystemInfoStream(&dirent)) + return false; + dir.CopyIndex(dir_index++, &dirent); + + dirent.stream_type = MD_LINUX_CPU_INFO; + if (!WriteFile(&dirent.location, "/proc/cpuinfo")) + NullifyDirectoryEntry(&dirent); + dir.CopyIndex(dir_index++, &dirent); + + dirent.stream_type = MD_LINUX_PROC_STATUS; + if (!WriteProcFile(&dirent.location, GetCrashThread(), "status")) + NullifyDirectoryEntry(&dirent); + dir.CopyIndex(dir_index++, &dirent); + + dirent.stream_type = MD_LINUX_LSB_RELEASE; + if (!WriteFile(&dirent.location, "/etc/lsb-release")) + NullifyDirectoryEntry(&dirent); + dir.CopyIndex(dir_index++, &dirent); + + dirent.stream_type = MD_LINUX_CMD_LINE; + if (!WriteProcFile(&dirent.location, GetCrashThread(), "cmdline")) + NullifyDirectoryEntry(&dirent); + dir.CopyIndex(dir_index++, &dirent); + + dirent.stream_type = MD_LINUX_ENVIRON; + if (!WriteProcFile(&dirent.location, GetCrashThread(), "environ")) + NullifyDirectoryEntry(&dirent); + dir.CopyIndex(dir_index++, &dirent); + + dirent.stream_type = MD_LINUX_AUXV; + if (!WriteProcFile(&dirent.location, GetCrashThread(), "auxv")) + NullifyDirectoryEntry(&dirent); + dir.CopyIndex(dir_index++, &dirent); + + dirent.stream_type = MD_LINUX_MAPS; + if (!WriteProcFile(&dirent.location, GetCrashThread(), "maps")) + NullifyDirectoryEntry(&dirent); + dir.CopyIndex(dir_index++, &dirent); + + dirent.stream_type = MD_LINUX_DSO_DEBUG; + if (!WriteDSODebugStream(&dirent)) + NullifyDirectoryEntry(&dirent); + dir.CopyIndex(dir_index++, &dirent); + + // If you add more directory entries, don't forget to update kNumWriters, + // above. + + dumper_->ThreadsResume(); + return true; + } + + bool FillThreadStack(MDRawThread* thread, uintptr_t stack_pointer, + uintptr_t pc, int max_stack_len, uint8_t** stack_copy) { + *stack_copy = NULL; + const void* stack; + size_t stack_len; + + thread->stack.start_of_memory_range = stack_pointer; + thread->stack.memory.data_size = 0; + thread->stack.memory.rva = minidump_writer_.position(); + + if (dumper_->GetStackInfo(&stack, &stack_len, stack_pointer)) { + if (max_stack_len >= 0 && + stack_len > static_cast(max_stack_len)) { + stack_len = max_stack_len; + // Skip empty chunks of length max_stack_len. + uintptr_t int_stack = reinterpret_cast(stack); + if (max_stack_len > 0) { + while (int_stack + max_stack_len < stack_pointer) { + int_stack += max_stack_len; + } + } + stack = reinterpret_cast(int_stack); + } + *stack_copy = reinterpret_cast(Alloc(stack_len)); + dumper_->CopyFromProcess(*stack_copy, thread->thread_id, stack, + stack_len); + + uintptr_t stack_pointer_offset = + stack_pointer - reinterpret_cast(stack); + if (skip_stacks_if_mapping_unreferenced_) { + if (!principal_mapping_) { + return true; + } + uintptr_t low_addr = principal_mapping_->system_mapping_info.start_addr; + uintptr_t high_addr = principal_mapping_->system_mapping_info.end_addr; + if ((pc < low_addr || pc > high_addr) && + !dumper_->StackHasPointerToMapping(*stack_copy, stack_len, + stack_pointer_offset, + *principal_mapping_)) { + return true; + } + } + + if (sanitize_stacks_) { + dumper_->SanitizeStackCopy(*stack_copy, stack_len, stack_pointer, + stack_pointer_offset); + } + + UntypedMDRVA memory(&minidump_writer_); + if (!memory.Allocate(stack_len)) + return false; + memory.Copy(*stack_copy, stack_len); + thread->stack.start_of_memory_range = reinterpret_cast(stack); + thread->stack.memory = memory.location(); + memory_blocks_.push_back(thread->stack); + } + return true; + } + + // Write information about the threads. + bool WriteThreadListStream(MDRawDirectory* dirent) { + const unsigned num_threads = dumper_->threads().size(); + + TypedMDRVA list(&minidump_writer_); + if (!list.AllocateObjectAndArray(num_threads, sizeof(MDRawThread))) + return false; + + dirent->stream_type = MD_THREAD_LIST_STREAM; + dirent->location = list.location(); + + *list.get() = num_threads; + + // If there's a minidump size limit, check if it might be exceeded. Since + // most of the space is filled with stack data, just check against that. + // If this expects to exceed the limit, set extra_thread_stack_len such + // that any thread beyond the first kLimitBaseThreadCount threads will + // have only kLimitMaxExtraThreadStackLen bytes dumped. + int extra_thread_stack_len = -1; // default to no maximum + if (minidump_size_limit_ >= 0) { + const unsigned estimated_total_stack_size = num_threads * + kLimitAverageThreadStackLength; + const off_t estimated_minidump_size = minidump_writer_.position() + + estimated_total_stack_size + kLimitMinidumpFudgeFactor; + if (estimated_minidump_size > minidump_size_limit_) + extra_thread_stack_len = kLimitMaxExtraThreadStackLen; + } + + for (unsigned i = 0; i < num_threads; ++i) { + MDRawThread thread; + my_memset(&thread, 0, sizeof(thread)); + thread.thread_id = dumper_->threads()[i]; + + // We have a different source of information for the crashing thread. If + // we used the actual state of the thread we would find it running in the + // signal handler with the alternative stack, which would be deeply + // unhelpful. + if (static_cast(thread.thread_id) == GetCrashThread() && + ucontext_ && + !dumper_->IsPostMortem()) { + uint8_t* stack_copy; + const uintptr_t stack_ptr = UContextReader::GetStackPointer(ucontext_); + if (!FillThreadStack(&thread, stack_ptr, + UContextReader::GetInstructionPointer(ucontext_), + -1, &stack_copy)) + return false; + + // Copy 256 bytes around crashing instruction pointer to minidump. + const size_t kIPMemorySize = 256; + uint64_t ip = UContextReader::GetInstructionPointer(ucontext_); + // Bound it to the upper and lower bounds of the memory map + // it's contained within. If it's not in mapped memory, + // don't bother trying to write it. + bool ip_is_mapped = false; + MDMemoryDescriptor ip_memory_d; + for (unsigned j = 0; j < dumper_->mappings().size(); ++j) { + const MappingInfo& mapping = *dumper_->mappings()[j]; + if (ip >= mapping.start_addr && + ip < mapping.start_addr + mapping.size) { + ip_is_mapped = true; + // Try to get 128 bytes before and after the IP, but + // settle for whatever's available. + ip_memory_d.start_of_memory_range = + std::max(mapping.start_addr, + uintptr_t(ip - (kIPMemorySize / 2))); + uintptr_t end_of_range = + std::min(uintptr_t(ip + (kIPMemorySize / 2)), + uintptr_t(mapping.start_addr + mapping.size)); + ip_memory_d.memory.data_size = + end_of_range - ip_memory_d.start_of_memory_range; + break; + } + } + + if (ip_is_mapped) { + UntypedMDRVA ip_memory(&minidump_writer_); + if (!ip_memory.Allocate(ip_memory_d.memory.data_size)) + return false; + uint8_t* memory_copy = + reinterpret_cast(Alloc(ip_memory_d.memory.data_size)); + dumper_->CopyFromProcess( + memory_copy, + thread.thread_id, + reinterpret_cast(ip_memory_d.start_of_memory_range), + ip_memory_d.memory.data_size); + ip_memory.Copy(memory_copy, ip_memory_d.memory.data_size); + ip_memory_d.memory = ip_memory.location(); + memory_blocks_.push_back(ip_memory_d); + } + + TypedMDRVA cpu(&minidump_writer_); + if (!cpu.Allocate()) + return false; + my_memset(cpu.get(), 0, sizeof(RawContextCPU)); +#if GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE + UContextReader::FillCPUContext(cpu.get(), ucontext_, float_state_); +#else + UContextReader::FillCPUContext(cpu.get(), ucontext_); +#endif + thread.thread_context = cpu.location(); + crashing_thread_context_ = cpu.location(); + } else { + ThreadInfo info; + if (!dumper_->GetThreadInfoByIndex(i, &info)) + return false; + + uint8_t* stack_copy; + int max_stack_len = -1; // default to no maximum for this thread + if (minidump_size_limit_ >= 0 && i >= kLimitBaseThreadCount) + max_stack_len = extra_thread_stack_len; + if (!FillThreadStack(&thread, info.stack_pointer, + info.GetInstructionPointer(), max_stack_len, + &stack_copy)) + return false; + + TypedMDRVA cpu(&minidump_writer_); + if (!cpu.Allocate()) + return false; + my_memset(cpu.get(), 0, sizeof(RawContextCPU)); + info.FillCPUContext(cpu.get()); + thread.thread_context = cpu.location(); + if (dumper_->threads()[i] == GetCrashThread()) { + crashing_thread_context_ = cpu.location(); + if (!dumper_->IsPostMortem()) { + // This is the crashing thread of a live process, but + // no context was provided, so set the crash address + // while the instruction pointer is already here. + dumper_->set_crash_address(info.GetInstructionPointer()); + } + } + } + + list.CopyIndexAfterObject(i, &thread, sizeof(thread)); + } + + return true; + } + + // Write application-provided memory regions. + bool WriteAppMemory() { + for (AppMemoryList::const_iterator iter = app_memory_list_.begin(); + iter != app_memory_list_.end(); + ++iter) { + uint8_t* data_copy = + reinterpret_cast(dumper_->allocator()->Alloc(iter->length)); + dumper_->CopyFromProcess(data_copy, GetCrashThread(), iter->ptr, + iter->length); + + UntypedMDRVA memory(&minidump_writer_); + if (!memory.Allocate(iter->length)) { + return false; + } + memory.Copy(data_copy, iter->length); + MDMemoryDescriptor desc; + desc.start_of_memory_range = reinterpret_cast(iter->ptr); + desc.memory = memory.location(); + memory_blocks_.push_back(desc); + } + + return true; + } + + static bool ShouldIncludeMapping(const MappingInfo& mapping) { + if (mapping.name[0] == 0 || // only want modules with filenames. + // Only want to include one mapping per shared lib. + // Avoid filtering executable mappings. + (mapping.offset != 0 && !mapping.exec) || + mapping.size < 4096 || // too small to get a signature for. + mapping.size > 0xFFFFFFFFULL) { // too large to include in the dump. + return false; + } + + return true; + } + + // If there is caller-provided information about this mapping + // in the mapping_list_ list, return true. Otherwise, return false. + bool HaveMappingInfo(const MappingInfo& mapping) { + for (MappingList::const_iterator iter = mapping_list_.begin(); + iter != mapping_list_.end(); + ++iter) { + // Ignore any mappings that are wholly contained within + // mappings in the mapping_info_ list. + if (mapping.start_addr >= iter->first.start_addr && + (mapping.start_addr + mapping.size) <= + (iter->first.start_addr + iter->first.size)) { + return true; + } + } + return false; + } + + // Write information about the mappings in effect. Because we are using the + // minidump format, the information about the mappings is pretty limited. + // Because of this, we also include the full, unparsed, /proc/$x/maps file in + // another stream in the file. + bool WriteMappings(MDRawDirectory* dirent) { + const unsigned num_mappings = dumper_->mappings().size(); + unsigned num_output_mappings = mapping_list_.size(); + + for (unsigned i = 0; i < dumper_->mappings().size(); ++i) { + const MappingInfo& mapping = *dumper_->mappings()[i]; + if (ShouldIncludeMapping(mapping) && !HaveMappingInfo(mapping)) + num_output_mappings++; + } + + TypedMDRVA list(&minidump_writer_); + if (num_output_mappings) { + if (!list.AllocateObjectAndArray(num_output_mappings, MD_MODULE_SIZE)) + return false; + } else { + // Still create the module list stream, although it will have zero + // modules. + if (!list.Allocate()) + return false; + } + + dirent->stream_type = MD_MODULE_LIST_STREAM; + dirent->location = list.location(); + *list.get() = num_output_mappings; + + // First write all the mappings from the dumper + unsigned int j = 0; + for (unsigned i = 0; i < num_mappings; ++i) { + const MappingInfo& mapping = *dumper_->mappings()[i]; + if (!ShouldIncludeMapping(mapping) || HaveMappingInfo(mapping)) + continue; + + MDRawModule mod; + if (!FillRawModule(mapping, true, i, &mod, NULL)) + return false; + list.CopyIndexAfterObject(j++, &mod, MD_MODULE_SIZE); + } + // Next write all the mappings provided by the caller + for (MappingList::const_iterator iter = mapping_list_.begin(); + iter != mapping_list_.end(); + ++iter) { + MDRawModule mod; + if (!FillRawModule(iter->first, false, 0, &mod, iter->second)) + return false; + list.CopyIndexAfterObject(j++, &mod, MD_MODULE_SIZE); + } + + return true; + } + + // Fill the MDRawModule |mod| with information about the provided + // |mapping|. If |identifier| is non-NULL, use it instead of calculating + // a file ID from the mapping. + bool FillRawModule(const MappingInfo& mapping, + bool member, + unsigned int mapping_id, + MDRawModule* mod, + const uint8_t* identifier) { + my_memset(mod, 0, MD_MODULE_SIZE); + + mod->base_of_image = mapping.start_addr; + mod->size_of_image = mapping.size; + + char file_name[NAME_MAX]; + char file_path[NAME_MAX]; + + dumper_->GetMappingEffectiveNameAndPath(mapping, file_path, + sizeof(file_path), file_name, + sizeof(file_name)); + + RSDS_DEBUG_FORMAT rsds; + PEFileFormat file_format = PEFile::TryGetDebugInfo(file_path, &rsds); + + if (file_format == PEFileFormat::notPeCoff) { + // The module is not a PE/COFF file, process as an ELF. + auto_wasteful_vector identifier_bytes( + dumper_->allocator()); + + if (identifier) { + // GUID was provided by caller. + identifier_bytes.insert(identifier_bytes.end(), identifier, + identifier + sizeof(MDGUID)); + } else { + // Note: ElfFileIdentifierForMapping() can manipulate the + // |mapping.name|, that is why we need to call the method + // GetMappingEffectiveNameAndPath again. + dumper_->ElfFileIdentifierForMapping(mapping, member, mapping_id, + identifier_bytes); + dumper_->GetMappingEffectiveNameAndPath(mapping, file_path, + sizeof(file_path), file_name, + sizeof(file_name)); + } + + if (!identifier_bytes.empty()) { + UntypedMDRVA cv(&minidump_writer_); + if (!cv.Allocate(MDCVInfoELF_minsize + identifier_bytes.size())) + return false; + + const uint32_t cv_signature = MD_CVINFOELF_SIGNATURE; + cv.Copy(&cv_signature, sizeof(cv_signature)); + cv.Copy(cv.position() + sizeof(cv_signature), &identifier_bytes[0], + identifier_bytes.size()); + + mod->cv_record = cv.location(); + } + } else { + // The module is a PE/COFF file. Create MDCVInfoPDB70 struct for it. + size_t file_name_length = strlen(file_name); + TypedMDRVA cv(&minidump_writer_); + if (!cv.AllocateObjectAndArray(file_name_length + 1, sizeof(uint8_t))) + return false; + if (!cv.CopyIndexAfterObject(0, file_name, file_name_length)) + return false; + MDCVInfoPDB70* cv_ptr = cv.get(); + cv_ptr->cv_signature = MD_CVINFOPDB70_SIGNATURE; + if (file_format == PEFileFormat::peWithBuildId) { + // Populate BuildId and age using RSDS instance. + cv_ptr->signature.data1 = static_cast(rsds.guid[0]) << 24 | + static_cast(rsds.guid[1]) << 16 | + static_cast(rsds.guid[2]) << 8 | + static_cast(rsds.guid[3]); + cv_ptr->signature.data2 = + static_cast(rsds.guid[4]) << 8 | rsds.guid[5]; + cv_ptr->signature.data3 = + static_cast(rsds.guid[6]) << 8 | rsds.guid[7]; + cv_ptr->signature.data4[0] = rsds.guid[8]; + cv_ptr->signature.data4[1] = rsds.guid[9]; + cv_ptr->signature.data4[2] = rsds.guid[10]; + cv_ptr->signature.data4[3] = rsds.guid[11]; + cv_ptr->signature.data4[4] = rsds.guid[12]; + cv_ptr->signature.data4[5] = rsds.guid[13]; + cv_ptr->signature.data4[6] = rsds.guid[14]; + cv_ptr->signature.data4[7] = rsds.guid[15]; + // The Age field should be reverted as well. + cv_ptr->age = static_cast(rsds.age[0]) << 24 | + static_cast(rsds.age[1]) << 16 | + static_cast(rsds.age[2]) << 8 | + static_cast(rsds.age[3]); + } else { + cv_ptr->age = 0; + } + + mod->cv_record = cv.location(); + } + + MDLocationDescriptor ld; + if (!minidump_writer_.WriteString(file_path, my_strlen(file_path), &ld)) + return false; + mod->module_name_rva = ld.rva; + return true; + } + + bool WriteMemoryListStream(MDRawDirectory* dirent) { + TypedMDRVA list(&minidump_writer_); + if (memory_blocks_.size()) { + if (!list.AllocateObjectAndArray(memory_blocks_.size(), + sizeof(MDMemoryDescriptor))) + return false; + } else { + // Still create the memory list stream, although it will have zero + // memory blocks. + if (!list.Allocate()) + return false; + } + + dirent->stream_type = MD_MEMORY_LIST_STREAM; + dirent->location = list.location(); + + *list.get() = memory_blocks_.size(); + + for (size_t i = 0; i < memory_blocks_.size(); ++i) { + list.CopyIndexAfterObject(i, &memory_blocks_[i], + sizeof(MDMemoryDescriptor)); + } + return true; + } + + bool WriteExceptionStream(MDRawDirectory* dirent) { + TypedMDRVA exc(&minidump_writer_); + if (!exc.Allocate()) + return false; + + MDRawExceptionStream* stream = exc.get(); + my_memset(stream, 0, sizeof(MDRawExceptionStream)); + + dirent->stream_type = MD_EXCEPTION_STREAM; + dirent->location = exc.location(); + + stream->thread_id = GetCrashThread(); + stream->exception_record.exception_code = dumper_->crash_signal(); + stream->exception_record.exception_flags = dumper_->crash_signal_code(); + stream->exception_record.exception_address = dumper_->crash_address(); + const std::vector crash_exception_info = + dumper_->crash_exception_info(); + stream->exception_record.number_parameters = crash_exception_info.size(); + memcpy(stream->exception_record.exception_information, + crash_exception_info.data(), + sizeof(uint64_t) * crash_exception_info.size()); + stream->thread_context = crashing_thread_context_; + + return true; + } + + bool WriteSystemInfoStream(MDRawDirectory* dirent) { + TypedMDRVA si(&minidump_writer_); + if (!si.Allocate()) + return false; + my_memset(si.get(), 0, sizeof(MDRawSystemInfo)); + + dirent->stream_type = MD_SYSTEM_INFO_STREAM; + dirent->location = si.location(); + + WriteCPUInformation(si.get()); + WriteOSInformation(si.get()); + + return true; + } + + bool WriteDSODebugStream(MDRawDirectory* dirent) { + ElfW(Phdr)* phdr = reinterpret_cast(dumper_->auxv()[AT_PHDR]); + char* base; + int phnum = dumper_->auxv()[AT_PHNUM]; + if (!phnum || !phdr) + return false; + + // Assume the program base is at the beginning of the same page as the PHDR + base = reinterpret_cast(reinterpret_cast(phdr) & ~0xfff); + + // Search for the program PT_DYNAMIC segment + ElfW(Addr) dyn_addr = 0; + for (; phnum >= 0; phnum--, phdr++) { + ElfW(Phdr) ph; + if (!dumper_->CopyFromProcess(&ph, GetCrashThread(), phdr, sizeof(ph))) + return false; + + // Adjust base address with the virtual address of the PT_LOAD segment + // corresponding to offset 0 + if (ph.p_type == PT_LOAD && ph.p_offset == 0) { + base -= ph.p_vaddr; + } + if (ph.p_type == PT_DYNAMIC) { + dyn_addr = ph.p_vaddr; + } + } + if (!dyn_addr) + return false; + + ElfW(Dyn)* dynamic = reinterpret_cast(dyn_addr + base); + + // The dynamic linker makes information available that helps gdb find all + // DSOs loaded into the program. If this information is indeed available, + // dump it to a MD_LINUX_DSO_DEBUG stream. + struct r_debug* r_debug = NULL; + uint32_t dynamic_length = 0; + + for (int i = 0; ; ++i) { + ElfW(Dyn) dyn; + dynamic_length += sizeof(dyn); + if (!dumper_->CopyFromProcess(&dyn, GetCrashThread(), dynamic + i, + sizeof(dyn))) { + return false; + } + +#ifdef __mips__ + const int32_t debug_tag = DT_MIPS_RLD_MAP; +#else + const int32_t debug_tag = DT_DEBUG; +#endif + if (dyn.d_tag == debug_tag) { + r_debug = reinterpret_cast(dyn.d_un.d_ptr); + continue; + } else if (dyn.d_tag == DT_NULL) { + break; + } + } + + // The "r_map" field of that r_debug struct contains a linked list of all + // loaded DSOs. + // Our list of DSOs potentially is different from the ones in the crashing + // process. So, we have to be careful to never dereference pointers + // directly. Instead, we use CopyFromProcess() everywhere. + // See for a more detailed discussion of the how the dynamic + // loader communicates with debuggers. + + // Count the number of loaded DSOs + int dso_count = 0; + struct r_debug debug_entry; + if (!dumper_->CopyFromProcess(&debug_entry, GetCrashThread(), r_debug, + sizeof(debug_entry))) { + return false; + } + for (struct link_map* ptr = debug_entry.r_map; ptr; ) { + struct link_map map; + if (!dumper_->CopyFromProcess(&map, GetCrashThread(), ptr, sizeof(map))) + return false; + + ptr = map.l_next; + dso_count++; + } + + MDRVA linkmap_rva = minidump_writer_.kInvalidMDRVA; + if (dso_count > 0) { + // If we have at least one DSO, create an array of MDRawLinkMap + // entries in the minidump file. + TypedMDRVA linkmap(&minidump_writer_); + if (!linkmap.AllocateArray(dso_count)) + return false; + linkmap_rva = linkmap.location().rva; + int idx = 0; + + // Iterate over DSOs and write their information to mini dump + for (struct link_map* ptr = debug_entry.r_map; ptr; ) { + struct link_map map; + if (!dumper_->CopyFromProcess(&map, GetCrashThread(), ptr, sizeof(map))) + return false; + + ptr = map.l_next; + char filename[257] = { 0 }; + if (map.l_name) { + dumper_->CopyFromProcess(filename, GetCrashThread(), map.l_name, + sizeof(filename) - 1); + } + MDLocationDescriptor location; + if (!minidump_writer_.WriteString(filename, 0, &location)) + return false; + MDRawLinkMap entry; + entry.name = location.rva; + entry.addr = map.l_addr; + entry.ld = reinterpret_cast(map.l_ld); + linkmap.CopyIndex(idx++, &entry); + } + } + + // Write MD_LINUX_DSO_DEBUG record + TypedMDRVA debug(&minidump_writer_); + if (!debug.AllocateObjectAndArray(1, dynamic_length)) + return false; + my_memset(debug.get(), 0, sizeof(MDRawDebug)); + dirent->stream_type = MD_LINUX_DSO_DEBUG; + dirent->location = debug.location(); + + debug.get()->version = debug_entry.r_version; + debug.get()->map = linkmap_rva; + debug.get()->dso_count = dso_count; + debug.get()->brk = debug_entry.r_brk; + debug.get()->ldbase = debug_entry.r_ldbase; + debug.get()->dynamic = reinterpret_cast(dynamic); + + wasteful_vector dso_debug_data(dumper_->allocator(), dynamic_length); + // The passed-in size to the constructor (above) is only a hint. + // Must call .resize() to do actual initialization of the elements. + dso_debug_data.resize(dynamic_length); + dumper_->CopyFromProcess(&dso_debug_data[0], GetCrashThread(), dynamic, + dynamic_length); + debug.CopyIndexAfterObject(0, &dso_debug_data[0], dynamic_length); + + return true; + } + + void set_minidump_size_limit(off_t limit) { minidump_size_limit_ = limit; } + + private: + void* Alloc(unsigned bytes) { + return dumper_->allocator()->Alloc(bytes); + } + + pid_t GetCrashThread() const { + return dumper_->crash_thread(); + } + + void NullifyDirectoryEntry(MDRawDirectory* dirent) { + dirent->stream_type = 0; + dirent->location.data_size = 0; + dirent->location.rva = 0; + } + +#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) + bool WriteCPUInformation(MDRawSystemInfo* sys_info) { + char vendor_id[sizeof(sys_info->cpu.x86_cpu_info.vendor_id) + 1] = {0}; + static const char vendor_id_name[] = "vendor_id"; + + struct CpuInfoEntry { + const char* info_name; + int value; + bool found; + } cpu_info_table[] = { + { "processor", -1, false }, +#if defined(__i386__) || defined(__x86_64__) + { "model", 0, false }, + { "stepping", 0, false }, + { "cpu family", 0, false }, +#endif + }; + + // processor_architecture should always be set, do this first + sys_info->processor_architecture = +#if defined(__mips__) +# if _MIPS_SIM == _ABIO32 + MD_CPU_ARCHITECTURE_MIPS; +# elif _MIPS_SIM == _ABI64 + MD_CPU_ARCHITECTURE_MIPS64; +# else +# error "This mips ABI is currently not supported (n32)" +#endif +#elif defined(__i386__) + MD_CPU_ARCHITECTURE_X86; +#else + MD_CPU_ARCHITECTURE_AMD64; +#endif + + const int fd = sys_open("/proc/cpuinfo", O_RDONLY, 0); + if (fd < 0) + return false; + + { + PageAllocator allocator; + ProcCpuInfoReader* const reader = new(allocator) ProcCpuInfoReader(fd); + const char* field; + while (reader->GetNextField(&field)) { + bool is_first_entry = true; + for (CpuInfoEntry& entry : cpu_info_table) { + if (!is_first_entry && entry.found) { + // except for the 'processor' field, ignore repeated values. + continue; + } + is_first_entry = false; + if (!my_strcmp(field, entry.info_name)) { + size_t value_len; + const char* value = reader->GetValueAndLen(&value_len); + if (value_len == 0) + continue; + + uintptr_t val; + if (my_read_decimal_ptr(&val, value) == value) + continue; + + entry.value = static_cast(val); + entry.found = true; + } + } + + // special case for vendor_id + if (!my_strcmp(field, vendor_id_name)) { + size_t value_len; + const char* value = reader->GetValueAndLen(&value_len); + if (value_len > 0) + my_strlcpy(vendor_id, value, sizeof(vendor_id)); + } + } + sys_close(fd); + } + + // make sure we got everything we wanted + for (const CpuInfoEntry& entry : cpu_info_table) { + if (!entry.found) { + return false; + } + } + // cpu_info_table[0] holds the last cpu id listed in /proc/cpuinfo, + // assuming this is the highest id, change it to the number of CPUs + // by adding one. + cpu_info_table[0].value++; + + sys_info->number_of_processors = cpu_info_table[0].value; +#if defined(__i386__) || defined(__x86_64__) + sys_info->processor_level = cpu_info_table[3].value; + sys_info->processor_revision = cpu_info_table[1].value << 8 | + cpu_info_table[2].value; +#endif + + if (vendor_id[0] != '\0') { + my_memcpy(sys_info->cpu.x86_cpu_info.vendor_id, vendor_id, + sizeof(sys_info->cpu.x86_cpu_info.vendor_id)); + } + return true; + } +#elif defined(__arm__) || defined(__aarch64__) + bool WriteCPUInformation(MDRawSystemInfo* sys_info) { + // The CPUID value is broken up in several entries in /proc/cpuinfo. + // This table is used to rebuild it from the entries. + const struct CpuIdEntry { + const char* field; + char format; + char bit_lshift; + char bit_length; + } cpu_id_entries[] = { + { "CPU implementer", 'x', 24, 8 }, + { "CPU variant", 'x', 20, 4 }, + { "CPU part", 'x', 4, 12 }, + { "CPU revision", 'd', 0, 4 }, + }; + + // The ELF hwcaps are listed in the "Features" entry as textual tags. + // This table is used to rebuild them. + const struct CpuFeaturesEntry { + const char* tag; + uint32_t hwcaps; + } cpu_features_entries[] = { +#if defined(__arm__) + { "swp", MD_CPU_ARM_ELF_HWCAP_SWP }, + { "half", MD_CPU_ARM_ELF_HWCAP_HALF }, + { "thumb", MD_CPU_ARM_ELF_HWCAP_THUMB }, + { "26bit", MD_CPU_ARM_ELF_HWCAP_26BIT }, + { "fastmult", MD_CPU_ARM_ELF_HWCAP_FAST_MULT }, + { "fpa", MD_CPU_ARM_ELF_HWCAP_FPA }, + { "vfp", MD_CPU_ARM_ELF_HWCAP_VFP }, + { "edsp", MD_CPU_ARM_ELF_HWCAP_EDSP }, + { "java", MD_CPU_ARM_ELF_HWCAP_JAVA }, + { "iwmmxt", MD_CPU_ARM_ELF_HWCAP_IWMMXT }, + { "crunch", MD_CPU_ARM_ELF_HWCAP_CRUNCH }, + { "thumbee", MD_CPU_ARM_ELF_HWCAP_THUMBEE }, + { "neon", MD_CPU_ARM_ELF_HWCAP_NEON }, + { "vfpv3", MD_CPU_ARM_ELF_HWCAP_VFPv3 }, + { "vfpv3d16", MD_CPU_ARM_ELF_HWCAP_VFPv3D16 }, + { "tls", MD_CPU_ARM_ELF_HWCAP_TLS }, + { "vfpv4", MD_CPU_ARM_ELF_HWCAP_VFPv4 }, + { "idiva", MD_CPU_ARM_ELF_HWCAP_IDIVA }, + { "idivt", MD_CPU_ARM_ELF_HWCAP_IDIVT }, + { "idiv", MD_CPU_ARM_ELF_HWCAP_IDIVA | MD_CPU_ARM_ELF_HWCAP_IDIVT }, +#elif defined(__aarch64__) + // No hwcaps on aarch64. +#endif + }; + + // processor_architecture should always be set, do this first + sys_info->processor_architecture = +#if defined(__aarch64__) + MD_CPU_ARCHITECTURE_ARM64_OLD; +#else + MD_CPU_ARCHITECTURE_ARM; +#endif + + // /proc/cpuinfo is not readable under various sandboxed environments + // (e.g. Android services with the android:isolatedProcess attribute) + // prepare for this by setting default values now, which will be + // returned when this happens. + // + // Note: Bogus values are used to distinguish between failures (to + // read /sys and /proc files) and really badly configured kernels. + sys_info->number_of_processors = 0; + sys_info->processor_level = 1U; // There is no ARMv1 + sys_info->processor_revision = 42; + sys_info->cpu.arm_cpu_info.cpuid = 0; + sys_info->cpu.arm_cpu_info.elf_hwcaps = 0; + + // Counting the number of CPUs involves parsing two sysfs files, + // because the content of /proc/cpuinfo will only mirror the number + // of 'online' cores, and thus will vary with time. + // See http://www.kernel.org/doc/Documentation/cputopology.txt + { + CpuSet cpus_present; + CpuSet cpus_possible; + + int fd = sys_open("/sys/devices/system/cpu/present", O_RDONLY, 0); + if (fd >= 0) { + cpus_present.ParseSysFile(fd); + sys_close(fd); + + fd = sys_open("/sys/devices/system/cpu/possible", O_RDONLY, 0); + if (fd >= 0) { + cpus_possible.ParseSysFile(fd); + sys_close(fd); + + cpus_present.IntersectWith(cpus_possible); + int cpu_count = std::min(255, cpus_present.GetCount()); + sys_info->number_of_processors = static_cast(cpu_count); + } + } + } + + // Parse /proc/cpuinfo to reconstruct the CPUID value, as well + // as the ELF hwcaps field. For the latter, it would be easier to + // read /proc/self/auxv but unfortunately, this file is not always + // readable from regular Android applications on later versions + // (>= 4.1) of the Android platform. + const int fd = sys_open("/proc/cpuinfo", O_RDONLY, 0); + if (fd < 0) { + // Do not return false here to allow the minidump generation + // to happen properly. + return true; + } + + { + PageAllocator allocator; + ProcCpuInfoReader* const reader = + new(allocator) ProcCpuInfoReader(fd); + const char* field; + while (reader->GetNextField(&field)) { + for (const CpuIdEntry& entry : cpu_id_entries) { + if (my_strcmp(entry.field, field) != 0) + continue; + uintptr_t result = 0; + const char* value = reader->GetValue(); + const char* p = value; + if (value[0] == '0' && value[1] == 'x') { + p = my_read_hex_ptr(&result, value+2); + } else if (entry.format == 'x') { + p = my_read_hex_ptr(&result, value); + } else { + p = my_read_decimal_ptr(&result, value); + } + if (p == value) + continue; + + result &= (1U << entry.bit_length)-1; + result <<= entry.bit_lshift; + sys_info->cpu.arm_cpu_info.cpuid |= + static_cast(result); + } +#if defined(__arm__) + // Get the architecture version from the "Processor" field. + // Note that it is also available in the "CPU architecture" field, + // however, some existing kernels are misconfigured and will report + // invalid values here (e.g. 6, while the CPU is ARMv7-A based). + // The "Processor" field doesn't have this issue. + if (!my_strcmp(field, "Processor")) { + size_t value_len; + const char* value = reader->GetValueAndLen(&value_len); + // Expected format: (v) + // Where is some text like "ARMv7 Processor rev 2" + // and is a decimal corresponding to the ARM + // architecture number. is either 'l' or 'b' + // and corresponds to the endianess, it is ignored here. + while (value_len > 0 && my_isspace(value[value_len-1])) + value_len--; + + size_t nn = value_len; + while (nn > 0 && value[nn-1] != '(') + nn--; + if (nn > 0 && value[nn] == 'v') { + uintptr_t arch_level = 5; + my_read_decimal_ptr(&arch_level, value + nn + 1); + sys_info->processor_level = static_cast(arch_level); + } + } +#elif defined(__aarch64__) + // The aarch64 architecture does not provide the architecture level + // in the Processor field, so we instead check the "CPU architecture" + // field. + if (!my_strcmp(field, "CPU architecture")) { + uintptr_t arch_level = 0; + const char* value = reader->GetValue(); + const char* p = value; + p = my_read_decimal_ptr(&arch_level, value); + if (p == value) + continue; + sys_info->processor_level = static_cast(arch_level); + } +#endif + // Rebuild the ELF hwcaps from the 'Features' field. + if (!my_strcmp(field, "Features")) { + size_t value_len; + const char* value = reader->GetValueAndLen(&value_len); + + // Parse each space-separated tag. + while (value_len > 0) { + const char* tag = value; + size_t tag_len = value_len; + const char* p = my_strchr(tag, ' '); + if (p) { + tag_len = static_cast(p - tag); + value += tag_len + 1; + value_len -= tag_len + 1; + } else { + tag_len = strlen(tag); + value_len = 0; + } + for (const CpuFeaturesEntry& entry : cpu_features_entries) { + if (tag_len == strlen(entry.tag) && + !memcmp(tag, entry.tag, tag_len)) { + sys_info->cpu.arm_cpu_info.elf_hwcaps |= entry.hwcaps; + break; + } + } + } + } + } + sys_close(fd); + } + + return true; + } +#elif defined(__riscv) + bool WriteCPUInformation(MDRawSystemInfo* sys_info) { + // processor_architecture should always be set, do this first +# if __riscv_xlen == 32 + sys_info->processor_architecture = MD_CPU_ARCHITECTURE_RISCV; +# elif __riscv_xlen == 64 + sys_info->processor_architecture = MD_CPU_ARCHITECTURE_RISCV64; +# else +# error "Unexpected __riscv_xlen" +# endif + + // /proc/cpuinfo is not readable under various sandboxed environments + // (e.g. Android services with the android:isolatedProcess attribute) + // prepare for this by setting default values now, which will be + // returned when this happens. + // + // Note: Bogus values are used to distinguish between failures (to + // read /sys and /proc files) and really badly configured kernels. + sys_info->number_of_processors = 0; + sys_info->processor_level = 0U; + sys_info->processor_revision = 42; + sys_info->cpu.other_cpu_info.processor_features[0] = 0; + sys_info->cpu.other_cpu_info.processor_features[1] = 0; + + // Counting the number of CPUs involves parsing two sysfs files, + // because the content of /proc/cpuinfo will only mirror the number + // of 'online' cores, and thus will vary with time. + // See http://www.kernel.org/doc/Documentation/cputopology.txt + { + CpuSet cpus_present; + CpuSet cpus_possible; + + int fd = sys_open("/sys/devices/system/cpu/present", + O_RDONLY | O_CLOEXEC, 0); + if (fd >= 0) { + cpus_present.ParseSysFile(fd); + sys_close(fd); + + fd = sys_open("/sys/devices/system/cpu/possible", + O_RDONLY | O_CLOEXEC, 0); + if (fd >= 0) { + cpus_possible.ParseSysFile(fd); + sys_close(fd); + + cpus_present.IntersectWith(cpus_possible); + int cpu_count = std::min(255, cpus_present.GetCount()); + sys_info->number_of_processors = static_cast(cpu_count); + } + } + } + + return true; + } +#else +# error "Unsupported CPU" +#endif + + bool WriteFile(MDLocationDescriptor* result, const char* filename) { + const int fd = sys_open(filename, O_RDONLY, 0); + if (fd < 0) + return false; + + // We can't stat the files because several of the files that we want to + // read are kernel seqfiles, which always have a length of zero. So we have + // to read as much as we can into a buffer. + static const unsigned kBufSize = 1024 - 2*sizeof(void*); + struct Buffers { + Buffers* next; + size_t len; + uint8_t data[kBufSize]; + }* buffers = reinterpret_cast(Alloc(sizeof(Buffers))); + buffers->next = NULL; + buffers->len = 0; + + size_t total = 0; + for (Buffers* bufptr = buffers;;) { + ssize_t r; + do { + r = sys_read(fd, &bufptr->data[bufptr->len], kBufSize - bufptr->len); + } while (r == -1 && errno == EINTR); + + if (r < 1) + break; + + total += r; + bufptr->len += r; + if (bufptr->len == kBufSize) { + bufptr->next = reinterpret_cast(Alloc(sizeof(Buffers))); + bufptr = bufptr->next; + bufptr->next = NULL; + bufptr->len = 0; + } + } + sys_close(fd); + + if (!total) + return false; + + UntypedMDRVA memory(&minidump_writer_); + if (!memory.Allocate(total)) + return false; + for (MDRVA pos = memory.position(); buffers; buffers = buffers->next) { + // Check for special case of a zero-length buffer. This should only + // occur if a file's size happens to be a multiple of the buffer's + // size, in which case the final sys_read() will have resulted in + // zero bytes being read after the final buffer was just allocated. + if (buffers->len == 0) { + // This can only occur with final buffer. + assert(buffers->next == NULL); + continue; + } + memory.Copy(pos, &buffers->data, buffers->len); + pos += buffers->len; + } + *result = memory.location(); + return true; + } + + bool WriteOSInformation(MDRawSystemInfo* sys_info) { +#if defined(__ANDROID__) + sys_info->platform_id = MD_OS_ANDROID; +#else + sys_info->platform_id = MD_OS_LINUX; +#endif + + struct utsname uts; + if (uname(&uts)) + return false; + + static const size_t buf_len = 512; + char buf[buf_len] = {0}; + size_t space_left = buf_len - 1; + const char* info_table[] = { + uts.sysname, + uts.release, + uts.version, + uts.machine, + NULL + }; + bool first_item = true; + for (const char** cur_info = info_table; *cur_info; cur_info++) { + static const char separator[] = " "; + size_t separator_len = sizeof(separator) - 1; + size_t info_len = my_strlen(*cur_info); + if (info_len == 0) + continue; + + if (space_left < info_len + (first_item ? 0 : separator_len)) + break; + + if (!first_item) { + my_strlcat(buf, separator, sizeof(buf)); + space_left -= separator_len; + } + + first_item = false; + my_strlcat(buf, *cur_info, sizeof(buf)); + space_left -= info_len; + } + + MDLocationDescriptor location; + if (!minidump_writer_.WriteString(buf, 0, &location)) + return false; + sys_info->csd_version_rva = location.rva; + + return true; + } + + bool WriteProcFile(MDLocationDescriptor* result, pid_t pid, + const char* filename) { + char buf[NAME_MAX]; + if (!dumper_->BuildProcPath(buf, pid, filename)) + return false; + return WriteFile(result, buf); + } + + // Only one of the 2 member variables below should be set to a valid value. + const int fd_; // File descriptor where the minidum should be written. + const char* path_; // Path to the file where the minidum should be written. + + const ucontext_t* const ucontext_; // also from the signal handler +#if GOOGLE_BREAKPAD_CRASH_CONTEXT_HAS_FLOAT_STATE + const google_breakpad::fpstate_t* const float_state_; // ditto +#endif + LinuxDumper* dumper_; + MinidumpFileWriter minidump_writer_; + off_t minidump_size_limit_; + MDLocationDescriptor crashing_thread_context_; + // Blocks of memory written to the dump. These are all currently + // written while writing the thread list stream, but saved here + // so a memory list stream can be written afterwards. + wasteful_vector memory_blocks_; + // Additional information about some mappings provided by the caller. + const MappingList& mapping_list_; + // Additional memory regions to be included in the dump, + // provided by the caller. + const AppMemoryList& app_memory_list_; + // If set, skip recording any threads that do not reference the + // mapping containing principal_mapping_address_. + bool skip_stacks_if_mapping_unreferenced_; + uintptr_t principal_mapping_address_; + const MappingInfo* principal_mapping_; + // If true, apply stack sanitization to stored stack data. + bool sanitize_stacks_; +}; + + +bool WriteMinidumpImpl(const char* minidump_path, + int minidump_fd, + off_t minidump_size_limit, + pid_t crashing_process, + const void* blob, size_t blob_size, + const MappingList& mappings, + const AppMemoryList& appmem, + bool skip_stacks_if_mapping_unreferenced, + uintptr_t principal_mapping_address, + bool sanitize_stacks) { + LinuxPtraceDumper dumper(crashing_process); + const ExceptionHandler::CrashContext* context = NULL; + if (blob) { + if (blob_size != sizeof(ExceptionHandler::CrashContext)) + return false; + context = reinterpret_cast(blob); + dumper.SetCrashInfoFromSigInfo(context->siginfo); + dumper.set_crash_thread(context->tid); + } + MinidumpWriter writer(minidump_path, minidump_fd, context, mappings, + appmem, skip_stacks_if_mapping_unreferenced, + principal_mapping_address, sanitize_stacks, &dumper); + // Set desired limit for file size of minidump (-1 means no limit). + writer.set_minidump_size_limit(minidump_size_limit); + if (!writer.Init()) + return false; + return writer.Dump(); +} + +} // namespace + +namespace google_breakpad { + +bool WriteMinidump(const char* minidump_path, pid_t crashing_process, + const void* blob, size_t blob_size, + bool skip_stacks_if_mapping_unreferenced, + uintptr_t principal_mapping_address, + bool sanitize_stacks) { + return WriteMinidumpImpl(minidump_path, -1, -1, + crashing_process, blob, blob_size, + MappingList(), AppMemoryList(), + skip_stacks_if_mapping_unreferenced, + principal_mapping_address, + sanitize_stacks); +} + +bool WriteMinidump(int minidump_fd, pid_t crashing_process, + const void* blob, size_t blob_size, + bool skip_stacks_if_mapping_unreferenced, + uintptr_t principal_mapping_address, + bool sanitize_stacks) { + return WriteMinidumpImpl(NULL, minidump_fd, -1, + crashing_process, blob, blob_size, + MappingList(), AppMemoryList(), + skip_stacks_if_mapping_unreferenced, + principal_mapping_address, + sanitize_stacks); +} + +bool WriteMinidump(const char* minidump_path, pid_t process, + pid_t process_blamed_thread) { + LinuxPtraceDumper dumper(process); + // MinidumpWriter will set crash address + dumper.set_crash_signal(MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED); + dumper.set_crash_thread(process_blamed_thread); + MappingList mapping_list; + AppMemoryList app_memory_list; + MinidumpWriter writer(minidump_path, -1, NULL, mapping_list, + app_memory_list, false, 0, false, &dumper); + if (!writer.Init()) + return false; + return writer.Dump(); +} + +bool WriteMinidump(const char* minidump_path, pid_t crashing_process, + const void* blob, size_t blob_size, + const MappingList& mappings, + const AppMemoryList& appmem, + bool skip_stacks_if_mapping_unreferenced, + uintptr_t principal_mapping_address, + bool sanitize_stacks) { + return WriteMinidumpImpl(minidump_path, -1, -1, crashing_process, + blob, blob_size, + mappings, appmem, + skip_stacks_if_mapping_unreferenced, + principal_mapping_address, + sanitize_stacks); +} + +bool WriteMinidump(int minidump_fd, pid_t crashing_process, + const void* blob, size_t blob_size, + const MappingList& mappings, + const AppMemoryList& appmem, + bool skip_stacks_if_mapping_unreferenced, + uintptr_t principal_mapping_address, + bool sanitize_stacks) { + return WriteMinidumpImpl(NULL, minidump_fd, -1, crashing_process, + blob, blob_size, + mappings, appmem, + skip_stacks_if_mapping_unreferenced, + principal_mapping_address, + sanitize_stacks); +} + +bool WriteMinidump(const char* minidump_path, off_t minidump_size_limit, + pid_t crashing_process, + const void* blob, size_t blob_size, + const MappingList& mappings, + const AppMemoryList& appmem, + bool skip_stacks_if_mapping_unreferenced, + uintptr_t principal_mapping_address, + bool sanitize_stacks) { + return WriteMinidumpImpl(minidump_path, -1, minidump_size_limit, + crashing_process, blob, blob_size, + mappings, appmem, + skip_stacks_if_mapping_unreferenced, + principal_mapping_address, + sanitize_stacks); +} + +bool WriteMinidump(int minidump_fd, off_t minidump_size_limit, + pid_t crashing_process, + const void* blob, size_t blob_size, + const MappingList& mappings, + const AppMemoryList& appmem, + bool skip_stacks_if_mapping_unreferenced, + uintptr_t principal_mapping_address, + bool sanitize_stacks) { + return WriteMinidumpImpl(NULL, minidump_fd, minidump_size_limit, + crashing_process, blob, blob_size, + mappings, appmem, + skip_stacks_if_mapping_unreferenced, + principal_mapping_address, + sanitize_stacks); +} + +bool WriteMinidump(const char* filename, + const MappingList& mappings, + const AppMemoryList& appmem, + LinuxDumper* dumper) { + MinidumpWriter writer(filename, -1, NULL, mappings, appmem, + false, 0, false, dumper); + if (!writer.Init()) + return false; + return writer.Dump(); +} + +} // namespace google_breakpad diff --git a/src/client/linux/minidump_writer/minidump_writer.h b/src/client/linux/minidump_writer/minidump_writer.h new file mode 100644 index 0000000..24e3c7b --- /dev/null +++ b/src/client/linux/minidump_writer/minidump_writer.h @@ -0,0 +1,142 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_ + +#include +#include +#include +#include + +#include +#include +#include + +#include "client/linux/minidump_writer/linux_dumper.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +class ExceptionHandler; + +#if defined(__aarch64__) +typedef struct fpsimd_context fpstate_t; +#elif !defined(__ARM_EABI__) && !defined(__mips__) +typedef std::remove_pointer::type fpstate_t; +#endif + +// These entries store a list of memory regions that the client wants included +// in the minidump. +struct AppMemory { + void* ptr; + size_t length; + + bool operator==(const struct AppMemory& other) const { + return ptr == other.ptr; + } + + bool operator==(const void* other) const { + return ptr == other; + } +}; +typedef std::list AppMemoryList; + +// Writes a minidump to the filesystem. These functions do not malloc nor use +// libc functions which may. Thus, it can be used in contexts where the state +// of the heap may be corrupt. +// minidump_path: the path to the file to write to. This is opened O_EXCL and +// fails open fails. +// crashing_process: the pid of the crashing process. This must be trusted. +// blob: a blob of data from the crashing process. See exception_handler.h +// blob_size: the length of |blob|, in bytes +// +// Returns true iff successful. +bool WriteMinidump(const char* minidump_path, pid_t crashing_process, + const void* blob, size_t blob_size, + bool skip_stacks_if_mapping_unreferenced = false, + uintptr_t principal_mapping_address = 0, + bool sanitize_stacks = false); +// Same as above but takes an open file descriptor instead of a path. +bool WriteMinidump(int minidump_fd, pid_t crashing_process, + const void* blob, size_t blob_size, + bool skip_stacks_if_mapping_unreferenced = false, + uintptr_t principal_mapping_address = 0, + bool sanitize_stacks = false); + +// Alternate form of WriteMinidump() that works with processes that +// are not expected to have crashed. If |process_blamed_thread| is +// meaningful, it will be the one from which a crash signature is +// extracted. It is not expected that this function will be called +// from a compromised context, but it is safe to do so. +bool WriteMinidump(const char* minidump_path, pid_t process, + pid_t process_blamed_thread); + +// These overloads also allow passing a list of known mappings and +// a list of additional memory regions to be included in the minidump. +bool WriteMinidump(const char* minidump_path, pid_t crashing_process, + const void* blob, size_t blob_size, + const MappingList& mappings, + const AppMemoryList& appdata, + bool skip_stacks_if_mapping_unreferenced = false, + uintptr_t principal_mapping_address = 0, + bool sanitize_stacks = false); +bool WriteMinidump(int minidump_fd, pid_t crashing_process, + const void* blob, size_t blob_size, + const MappingList& mappings, + const AppMemoryList& appdata, + bool skip_stacks_if_mapping_unreferenced = false, + uintptr_t principal_mapping_address = 0, + bool sanitize_stacks = false); + +// These overloads also allow passing a file size limit for the minidump. +bool WriteMinidump(const char* minidump_path, off_t minidump_size_limit, + pid_t crashing_process, + const void* blob, size_t blob_size, + const MappingList& mappings, + const AppMemoryList& appdata, + bool skip_stacks_if_mapping_unreferenced = false, + uintptr_t principal_mapping_address = 0, + bool sanitize_stacks = false); +bool WriteMinidump(int minidump_fd, off_t minidump_size_limit, + pid_t crashing_process, + const void* blob, size_t blob_size, + const MappingList& mappings, + const AppMemoryList& appdata, + bool skip_stacks_if_mapping_unreferenced = false, + uintptr_t principal_mapping_address = 0, + bool sanitize_stacks = false); + +bool WriteMinidump(const char* filename, + const MappingList& mappings, + const AppMemoryList& appdata, + LinuxDumper* dumper); + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_ diff --git a/src/client/linux/minidump_writer/minidump_writer_unittest.cc b/src/client/linux/minidump_writer/minidump_writer_unittest.cc new file mode 100644 index 0000000..effedc5 --- /dev/null +++ b/src/client/linux/minidump_writer/minidump_writer_unittest.cc @@ -0,0 +1,942 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "client/linux/handler/exception_handler.h" +#include "client/linux/minidump_writer/linux_dumper.h" +#include "client/linux/minidump_writer/minidump_writer.h" +#include "client/linux/minidump_writer/minidump_writer_unittest_utils.h" +#include "common/linux/breakpad_getcontext.h" +#include "common/linux/eintr_wrapper.h" +#include "common/linux/file_id.h" +#include "common/linux/ignore_ret.h" +#include "common/linux/safe_readlink.h" +#include "common/scoped_ptr.h" +#include "common/tests/auto_tempdir.h" +#include "common/tests/file_utils.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/minidump.h" + +using namespace google_breakpad; +using google_breakpad::elf::FileID; +using google_breakpad::elf::kDefaultBuildIdSize; + +namespace { + +typedef testing::Test MinidumpWriterTest; + +const char kMDWriterUnitTestFileName[] = "/minidump-writer-unittest"; + +TEST(MinidumpWriterTest, SetupWithPath) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + IGNORE_RET(HANDLE_EINTR(read(fds[0], &b, sizeof(b)))); + close(fds[0]); + syscall(__NR_exit_group); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + memset(&context, 0, sizeof(context)); + + AutoTempDir temp_dir; + string templ = temp_dir.path() + kMDWriterUnitTestFileName; + // Set a non-zero tid to avoid tripping asserts. + context.tid = child; + ASSERT_TRUE(WriteMinidump(templ.c_str(), child, &context, sizeof(context))); + struct stat st; + ASSERT_EQ(0, stat(templ.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + + close(fds[1]); + IGNORE_EINTR(waitpid(child, nullptr, 0)); +} + +TEST(MinidumpWriterTest, SetupWithFD) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + HANDLE_EINTR(read(fds[0], &b, sizeof(b))); + close(fds[0]); + syscall(__NR_exit_group); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + memset(&context, 0, sizeof(context)); + + AutoTempDir temp_dir; + string templ = temp_dir.path() + kMDWriterUnitTestFileName; + int fd = open(templ.c_str(), O_CREAT | O_WRONLY, S_IRWXU); + // Set a non-zero tid to avoid tripping asserts. + context.tid = child; + ASSERT_TRUE(WriteMinidump(fd, child, &context, sizeof(context))); + struct stat st; + ASSERT_EQ(0, stat(templ.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + + close(fds[1]); + IGNORE_EINTR(waitpid(child, nullptr, 0)); +} + +// Test that mapping info can be specified when writing a minidump, +// and that it ends up in the module list of the minidump. +TEST(MinidumpWriterTest, MappingInfo) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + // These are defined here so the parent can use them to check the + // data from the minidump afterwards. + const uint32_t memory_size = sysconf(_SC_PAGESIZE); + const char* kMemoryName = "a fake module"; + const uint8_t kModuleGUID[sizeof(MDGUID)] = { + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF + }; + const string module_identifier = "33221100554477668899AABBCCDDEEFF0"; + + // Get some memory. + char* memory = + reinterpret_cast(mmap(NULL, + memory_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + -1, + 0)); + const uintptr_t kMemoryAddress = reinterpret_cast(memory); + ASSERT_TRUE(memory); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + IGNORE_RET(HANDLE_EINTR(read(fds[0], &b, sizeof(b)))); + close(fds[0]); + syscall(__NR_exit_group); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + memset(&context, 0, sizeof(context)); + ASSERT_EQ(0, getcontext(&context.context)); + context.tid = child; + + AutoTempDir temp_dir; + string templ = temp_dir.path() + kMDWriterUnitTestFileName; + + // Add information about the mapped memory. + MappingInfo info; + info.start_addr = kMemoryAddress; + info.size = memory_size; + info.offset = 0; + info.exec = false; + strcpy(info.name, kMemoryName); + + MappingList mappings; + AppMemoryList memory_list; + MappingEntry mapping; + mapping.first = info; + memcpy(mapping.second, kModuleGUID, sizeof(MDGUID)); + mappings.push_back(mapping); + ASSERT_TRUE(WriteMinidump(templ.c_str(), child, &context, sizeof(context), + mappings, memory_list, false, 0, false)); + + // Read the minidump. Load the module list, and ensure that + // the mmap'ed |memory| is listed with the given module name + // and debug ID. + Minidump minidump(templ); + ASSERT_TRUE(minidump.Read()); + + MinidumpModuleList* module_list = minidump.GetModuleList(); + ASSERT_TRUE(module_list); + const MinidumpModule* module = + module_list->GetModuleForAddress(kMemoryAddress); + ASSERT_TRUE(module); + + EXPECT_EQ(kMemoryAddress, module->base_address()); + EXPECT_EQ(memory_size, module->size()); + EXPECT_EQ(kMemoryName, module->code_file()); + EXPECT_EQ(module_identifier, module->debug_identifier()); + + uint32_t len; + // These streams are expected to be there + EXPECT_TRUE(minidump.SeekToStreamType(MD_THREAD_LIST_STREAM, &len)); + EXPECT_TRUE(minidump.SeekToStreamType(MD_MEMORY_LIST_STREAM, &len)); + EXPECT_TRUE(minidump.SeekToStreamType(MD_EXCEPTION_STREAM, &len)); + EXPECT_TRUE(minidump.SeekToStreamType(MD_SYSTEM_INFO_STREAM, &len)); + EXPECT_TRUE(minidump.SeekToStreamType(MD_LINUX_CPU_INFO, &len)); + EXPECT_TRUE(minidump.SeekToStreamType(MD_LINUX_PROC_STATUS, &len)); + EXPECT_TRUE(minidump.SeekToStreamType(MD_LINUX_CMD_LINE, &len)); + EXPECT_TRUE(minidump.SeekToStreamType(MD_LINUX_ENVIRON, &len)); + EXPECT_TRUE(minidump.SeekToStreamType(MD_LINUX_AUXV, &len)); + EXPECT_TRUE(minidump.SeekToStreamType(MD_LINUX_MAPS, &len)); + EXPECT_TRUE(minidump.SeekToStreamType(MD_LINUX_DSO_DEBUG, &len)); + + close(fds[1]); + IGNORE_EINTR(waitpid(child, nullptr, 0)); +} + +// Test that minidumping is skipped while writing minidumps if principal mapping +// is not referenced. +TEST(MinidumpWriterTest, MinidumpSkippedIfRequested) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + IGNORE_RET(HANDLE_EINTR(read(fds[0], &b, sizeof(b)))); + close(fds[0]); + syscall(__NR_exit_group); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + memset(&context, 0, sizeof(context)); + ASSERT_EQ(0, getcontext(&context.context)); + context.tid = child; + + AutoTempDir temp_dir; + string templ = temp_dir.path() + kMDWriterUnitTestFileName; + + // pass an invalid principal mapping address, which will force + // WriteMinidump to not write a minidump. + ASSERT_FALSE(WriteMinidump(templ.c_str(), child, &context, sizeof(context), + true, static_cast(0x0102030405060708ull), + false)); + close(fds[1]); + IGNORE_EINTR(waitpid(child, nullptr, 0)); +} + +// Test that minidumping is skipped while writing minidumps if principal mapping +// is not referenced. +TEST(MinidumpWriterTest, MinidumpStacksSkippedIfRequested) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + + // Create a thread that does not return, and only references libc (not the + // current executable). This thread should not be captured in the minidump. + pthread_t thread; + pthread_attr_t thread_attributes; + pthread_attr_init(&thread_attributes); + pthread_attr_setdetachstate(&thread_attributes, PTHREAD_CREATE_DETACHED); + sigset_t sigset; + sigemptyset(&sigset); + pthread_create(&thread, &thread_attributes, + reinterpret_cast(&sigsuspend), &sigset); + + char b; + IGNORE_RET(HANDLE_EINTR(read(fds[0], &b, sizeof(b)))); + close(fds[0]); + syscall(__NR_exit_group); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + memset(&context, 0, sizeof(context)); + ASSERT_EQ(0, getcontext(&context.context)); + context.tid = child; + + AutoTempDir temp_dir; + string templ = temp_dir.path() + kMDWriterUnitTestFileName; + + // Pass an invalid principal mapping address, which will force + // WriteMinidump to not dump any thread stacks. + ASSERT_TRUE(WriteMinidump( + templ.c_str(), child, &context, sizeof(context), true, + reinterpret_cast(google_breakpad::WriteFile), false)); + + // Read the minidump. And ensure that thread memory was dumped only for the + // main thread. + Minidump minidump(templ); + ASSERT_TRUE(minidump.Read()); + + MinidumpThreadList* threads = minidump.GetThreadList(); + int threads_with_stacks = 0; + for (unsigned int i = 0; i < threads->thread_count(); ++i) { + MinidumpThread* thread = threads->GetThreadAtIndex(i); + if (thread->GetMemory()) { + ++threads_with_stacks; + } + } +#if defined(THREAD_SANITIZER) || defined(ADDRESS_SANITIZER) + ASSERT_GE(threads_with_stacks, 1); +#else + ASSERT_EQ(threads_with_stacks, 1); +#endif + close(fds[1]); + IGNORE_EINTR(waitpid(child, nullptr, 0)); +} + +// Test that stacks can be sanitized while writing minidumps. +TEST(MinidumpWriterTest, StacksAreSanitizedIfRequested) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + IGNORE_RET(HANDLE_EINTR(read(fds[0], &b, sizeof(b)))); + close(fds[0]); + syscall(__NR_exit_group); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + memset(&context, 0, sizeof(context)); + ASSERT_EQ(0, getcontext(&context.context)); + context.tid = child; + + AutoTempDir temp_dir; + string templ = temp_dir.path() + kMDWriterUnitTestFileName; + // pass an invalid principal mapping address, which will force + // WriteMinidump to not dump any thread stacks. + ASSERT_TRUE(WriteMinidump(templ.c_str(), child, &context, sizeof(context), + false, 0, true)); + + // Read the minidump. And ensure that thread memory contains a defaced value. + Minidump minidump(templ); + ASSERT_TRUE(minidump.Read()); + + const uintptr_t defaced = +#if defined(__LP64__) + 0x0defaced0defaced; +#else + 0x0defaced; +#endif + MinidumpThreadList* threads = minidump.GetThreadList(); + for (unsigned int i = 0; i < threads->thread_count(); ++i) { + MinidumpThread* thread = threads->GetThreadAtIndex(i); + MinidumpMemoryRegion* mem = thread->GetMemory(); + ASSERT_TRUE(mem != nullptr); + uint32_t sz = mem->GetSize(); + const uint8_t* data = mem->GetMemory(); + ASSERT_TRUE(memmem(data, sz, &defaced, sizeof(defaced)) != nullptr); + } + close(fds[1]); + IGNORE_EINTR(waitpid(child, nullptr, 0)); +} + +// Test that a binary with a longer-than-usual build id note +// makes its way all the way through to the minidump unscathed. +// The linux_client_unittest is linked with an explicit --build-id +// in Makefile.am. +TEST(MinidumpWriterTest, BuildIDLong) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + IGNORE_RET(HANDLE_EINTR(read(fds[0], &b, sizeof(b)))); + close(fds[0]); + syscall(__NR_exit_group); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + memset(&context, 0, sizeof(context)); + ASSERT_EQ(0, getcontext(&context.context)); + context.tid = child; + + AutoTempDir temp_dir; + const string dump_path = temp_dir.path() + kMDWriterUnitTestFileName; + + EXPECT_TRUE(WriteMinidump(dump_path.c_str(), + child, &context, sizeof(context))); + close(fds[1]); + + // Read the minidump. Load the module list, and ensure that + // the main module has the correct debug id and code id. + Minidump minidump(dump_path); + ASSERT_TRUE(minidump.Read()); + + MinidumpModuleList* module_list = minidump.GetModuleList(); + ASSERT_TRUE(module_list); + const MinidumpModule* module = module_list->GetMainModule(); + ASSERT_TRUE(module); + const string module_identifier = "030201000504070608090A0B0C0D0E0F0"; + // This is passed explicitly to the linker in Makefile.am + const string build_id = + "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"; + EXPECT_EQ(module_identifier, module->debug_identifier()); + EXPECT_EQ(build_id, module->code_identifier()); + + IGNORE_EINTR(waitpid(child, nullptr, 0)); +} + +// Test that mapping info can be specified, and that it overrides +// existing mappings that are wholly contained within the specified +// range. +TEST(MinidumpWriterTest, MappingInfoContained) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + // These are defined here so the parent can use them to check the + // data from the minidump afterwards. + const int32_t memory_size = sysconf(_SC_PAGESIZE); + const char* kMemoryName = "a fake module"; + const uint8_t kModuleGUID[sizeof(MDGUID)] = { + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF + }; + const string module_identifier = "33221100554477668899AABBCCDDEEFF0"; + + // mmap a file + AutoTempDir temp_dir; + string tempfile = temp_dir.path() + "/minidump-writer-unittest-temp"; + int fd = open(tempfile.c_str(), O_RDWR | O_CREAT, 0); + ASSERT_NE(-1, fd); + unlink(tempfile.c_str()); + // fill with zeros + google_breakpad::scoped_array buffer(new char[memory_size]); + memset(buffer.get(), 0, memory_size); + ASSERT_EQ(memory_size, write(fd, buffer.get(), memory_size)); + lseek(fd, 0, SEEK_SET); + + char* memory = + reinterpret_cast(mmap(NULL, + memory_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE, + fd, + 0)); + const uintptr_t kMemoryAddress = reinterpret_cast(memory); + ASSERT_TRUE(memory); + close(fd); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + IGNORE_RET(HANDLE_EINTR(read(fds[0], &b, sizeof(b)))); + close(fds[0]); + syscall(__NR_exit_group); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + memset(&context, 0, sizeof(context)); + context.tid = 1; + + string dumpfile = temp_dir.path() + kMDWriterUnitTestFileName; + + // Add information about the mapped memory. Report it as being larger than + // it actually is. + MappingInfo info; + info.start_addr = kMemoryAddress - memory_size; + info.size = memory_size * 3; + info.offset = 0; + info.exec = false; + strcpy(info.name, kMemoryName); + + MappingList mappings; + AppMemoryList memory_list; + MappingEntry mapping; + mapping.first = info; + memcpy(mapping.second, kModuleGUID, sizeof(MDGUID)); + mappings.push_back(mapping); + ASSERT_TRUE(WriteMinidump(dumpfile.c_str(), child, &context, sizeof(context), + mappings, memory_list)); + + // Read the minidump. Load the module list, and ensure that + // the mmap'ed |memory| is listed with the given module name + // and debug ID. + Minidump minidump(dumpfile); + ASSERT_TRUE(minidump.Read()); + + MinidumpModuleList* module_list = minidump.GetModuleList(); + ASSERT_TRUE(module_list); + const MinidumpModule* module = + module_list->GetModuleForAddress(kMemoryAddress); + ASSERT_TRUE(module); + + EXPECT_EQ(info.start_addr, module->base_address()); + EXPECT_EQ(info.size, module->size()); + EXPECT_EQ(kMemoryName, module->code_file()); + EXPECT_EQ(module_identifier, module->debug_identifier()); + + close(fds[1]); + IGNORE_EINTR(waitpid(child, nullptr, 0)); +} + +TEST(MinidumpWriterTest, DeletedBinary) { + const string kNumberOfThreadsArgument = "1"; + const string helper_path(GetHelperBinary()); + if (helper_path.empty()) { + FAIL() << "Couldn't find helper binary"; + exit(1); + } + + // Copy binary to a temp file. + AutoTempDir temp_dir; + string binpath = temp_dir.path() + "/linux-dumper-unittest-helper"; + ASSERT_TRUE(CopyFile(helper_path, binpath)) + << "Failed to copy " << helper_path << " to " << binpath; + ASSERT_EQ(0, chmod(binpath.c_str(), 0755)); + + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + pid_t child_pid = fork(); + if (child_pid == 0) { + // In child process. + close(fds[0]); + + // Pass the pipe fd and the number of threads as arguments. + char pipe_fd_string[8]; + sprintf(pipe_fd_string, "%d", fds[1]); + execl(binpath.c_str(), + binpath.c_str(), + pipe_fd_string, + kNumberOfThreadsArgument.c_str(), + NULL); + } + close(fds[1]); + // Wait for the child process to signal that it's ready. + struct pollfd pfd; + memset(&pfd, 0, sizeof(pfd)); + pfd.fd = fds[0]; + pfd.events = POLLIN | POLLERR; + + const int r = HANDLE_EINTR(poll(&pfd, 1, 1000)); + ASSERT_EQ(1, r); + ASSERT_TRUE(pfd.revents & POLLIN); + uint8_t junk; + const int nr = HANDLE_EINTR(read(fds[0], &junk, sizeof(junk))); + ASSERT_EQ(static_cast(sizeof(junk)), nr); + close(fds[0]); + + // Child is ready now. + // Unlink the test binary. + unlink(binpath.c_str()); + + ExceptionHandler::CrashContext context; + memset(&context, 0, sizeof(context)); + + string templ = temp_dir.path() + kMDWriterUnitTestFileName; + // Set a non-zero tid to avoid tripping asserts. + context.tid = child_pid; + ASSERT_TRUE(WriteMinidump(templ.c_str(), child_pid, &context, + sizeof(context))); + kill(child_pid, SIGKILL); + + struct stat st; + ASSERT_EQ(0, stat(templ.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + + Minidump minidump(templ); + ASSERT_TRUE(minidump.Read()); + + // Check that the main module filename is correct. + MinidumpModuleList* module_list = minidump.GetModuleList(); + ASSERT_TRUE(module_list); + const MinidumpModule* module = module_list->GetMainModule(); + EXPECT_STREQ(binpath.c_str(), module->code_file().c_str()); + // Check that the file ID is correct. + FileID fileid(helper_path.c_str()); + PageAllocator allocator; + wasteful_vector identifier(&allocator, kDefaultBuildIdSize); + EXPECT_TRUE(fileid.ElfFileIdentifier(identifier)); + string identifier_string = FileID::ConvertIdentifierToUUIDString(identifier); + string module_identifier(identifier_string); + // Strip out dashes + size_t pos; + while ((pos = module_identifier.find('-')) != string::npos) { + module_identifier.erase(pos, 1); + } + // And append a zero, because module IDs include an "age" field + // which is always zero on Linux. + module_identifier += "0"; + EXPECT_EQ(module_identifier, module->debug_identifier()); + + IGNORE_EINTR(waitpid(child_pid, nullptr, 0)); +} + +// Test that an additional memory region can be added to the minidump. +TEST(MinidumpWriterTest, AdditionalMemory) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + // These are defined here so the parent can use them to check the + // data from the minidump afterwards. + const uint32_t kMemorySize = sysconf(_SC_PAGESIZE); + + // Get some heap memory. + uint8_t* memory = new uint8_t[kMemorySize]; + const uintptr_t kMemoryAddress = reinterpret_cast(memory); + ASSERT_TRUE(memory); + + // Stick some data into the memory so the contents can be verified. + for (uint32_t i = 0; i < kMemorySize; ++i) { + memory[i] = i % 255; + } + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + HANDLE_EINTR(read(fds[0], &b, sizeof(b))); + close(fds[0]); + syscall(__NR_exit_group); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + + // This needs a valid context for minidump writing to work, but getting + // a useful one from the child is too much work, so just use one from + // the parent since the child is just a forked copy anyway. + ASSERT_EQ(0, getcontext(&context.context)); + context.tid = child; + + AutoTempDir temp_dir; + string templ = temp_dir.path() + kMDWriterUnitTestFileName; + unlink(templ.c_str()); + + MappingList mappings; + AppMemoryList memory_list; + + // Add the memory region to the list of memory to be included. + AppMemory app_memory; + app_memory.ptr = memory; + app_memory.length = kMemorySize; + memory_list.push_back(app_memory); + ASSERT_TRUE(WriteMinidump(templ.c_str(), child, &context, sizeof(context), + mappings, memory_list)); + + // Read the minidump. Ensure that the memory region is present + Minidump minidump(templ); + ASSERT_TRUE(minidump.Read()); + + MinidumpMemoryList* dump_memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(dump_memory_list); + const MinidumpMemoryRegion* region = + dump_memory_list->GetMemoryRegionForAddress(kMemoryAddress); + ASSERT_TRUE(region); + + EXPECT_EQ(kMemoryAddress, region->GetBase()); + EXPECT_EQ(kMemorySize, region->GetSize()); + + // Verify memory contents. + EXPECT_EQ(0, memcmp(region->GetMemory(), memory, kMemorySize)); + + delete[] memory; + close(fds[1]); + IGNORE_EINTR(waitpid(child, nullptr, 0)); +} + +// Test that an invalid thread stack pointer still results in a minidump. +TEST(MinidumpWriterTest, InvalidStackPointer) { + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + const pid_t child = fork(); + if (child == 0) { + close(fds[1]); + char b; + HANDLE_EINTR(read(fds[0], &b, sizeof(b))); + close(fds[0]); + syscall(__NR_exit_group); + } + close(fds[0]); + + ExceptionHandler::CrashContext context; + + // This needs a valid context for minidump writing to work, but getting + // a useful one from the child is too much work, so just use one from + // the parent since the child is just a forked copy anyway. + ASSERT_EQ(0, getcontext(&context.context)); + context.tid = child; + + // Fake the child's stack pointer for its crashing thread. NOTE: This must + // be an invalid memory address for the child process (stack or otherwise). + // Try 1MB below the current stack. + uintptr_t invalid_stack_pointer = + reinterpret_cast(&context) - 1024*1024; +#if defined(__i386) + context.context.uc_mcontext.gregs[REG_ESP] = invalid_stack_pointer; +#elif defined(__x86_64) + context.context.uc_mcontext.gregs[REG_RSP] = invalid_stack_pointer; +#elif defined(__ARM_EABI__) + context.context.uc_mcontext.arm_sp = invalid_stack_pointer; +#elif defined(__aarch64__) + context.context.uc_mcontext.sp = invalid_stack_pointer; +#elif defined(__mips__) + context.context.uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP] = + invalid_stack_pointer; +#elif defined(__riscv) + context.context.uc_mcontext.__gregs[MD_CONTEXT_RISCV_REG_SP] = + invalid_stack_pointer; +#else +# error "This code has not been ported to your platform yet." +#endif + + AutoTempDir temp_dir; + string templ = temp_dir.path() + kMDWriterUnitTestFileName; + // NOTE: In previous versions of Breakpad, WriteMinidump() would fail if + // presented with an invalid stack pointer. + ASSERT_TRUE(WriteMinidump(templ.c_str(), child, &context, sizeof(context))); + + // Read the minidump. Ensure that the memory region is present + Minidump minidump(templ); + ASSERT_TRUE(minidump.Read()); + + // TODO(ted.mielczarek,mkrebs): Enable this part of the test once + // https://breakpad.appspot.com/413002/ is committed. +#if 0 + // Make sure there's a thread without a stack. NOTE: It's okay if + // GetThreadList() shows the error: "ERROR: MinidumpThread has a memory + // region problem". + MinidumpThreadList* dump_thread_list = minidump.GetThreadList(); + ASSERT_TRUE(dump_thread_list); + bool found_empty_stack = false; + for (int i = 0; i < dump_thread_list->thread_count(); i++) { + MinidumpThread* thread = dump_thread_list->GetThreadAtIndex(i); + ASSERT_TRUE(thread->thread() != NULL); + // When the stack size is zero bytes, GetMemory() returns NULL. + if (thread->GetMemory() == NULL) { + found_empty_stack = true; + break; + } + } + // NOTE: If you fail this, first make sure that "invalid_stack_pointer" + // above is indeed set to an invalid address. + ASSERT_TRUE(found_empty_stack); +#endif + + close(fds[1]); + IGNORE_EINTR(waitpid(child, nullptr, 0)); +} + +// Test that limiting the size of the minidump works. +TEST(MinidumpWriterTest, MinidumpSizeLimit) { + static const int kNumberOfThreadsInHelperProgram = 40; + + char number_of_threads_arg[3]; + sprintf(number_of_threads_arg, "%d", kNumberOfThreadsInHelperProgram); + + string helper_path(GetHelperBinary()); + if (helper_path.empty()) { + FAIL() << "Couldn't find helper binary"; + exit(1); + } + + int fds[2]; + ASSERT_NE(-1, pipe(fds)); + + pid_t child_pid = fork(); + if (child_pid == 0) { + // In child process. + close(fds[0]); + + // Pass the pipe fd and the number of threads as arguments. + char pipe_fd_string[8]; + sprintf(pipe_fd_string, "%d", fds[1]); + execl(helper_path.c_str(), + helper_path.c_str(), + pipe_fd_string, + number_of_threads_arg, + NULL); + } + close(fds[1]); + + // Wait for all child threads to indicate that they have started + for (int threads = 0; threads < kNumberOfThreadsInHelperProgram; threads++) { + struct pollfd pfd; + memset(&pfd, 0, sizeof(pfd)); + pfd.fd = fds[0]; + pfd.events = POLLIN | POLLERR; + + const int r = HANDLE_EINTR(poll(&pfd, 1, 1000)); + ASSERT_EQ(1, r); + ASSERT_TRUE(pfd.revents & POLLIN); + uint8_t junk; + ASSERT_EQ(read(fds[0], &junk, sizeof(junk)), + static_cast(sizeof(junk))); + } + close(fds[0]); + + // There is a race here because we may stop a child thread before + // it is actually running the busy loop. Empirically this sleep + // is sufficient to avoid the race. + usleep(100000); + + // Child and its threads are ready now. + + + off_t normal_file_size; + int total_normal_stack_size = 0; + AutoTempDir temp_dir; + + // First, write a minidump with no size limit. + { + string normal_dump = temp_dir.path() + + "/minidump-writer-unittest.dmp"; + ASSERT_TRUE(WriteMinidump(normal_dump.c_str(), -1, + child_pid, NULL, 0, + MappingList(), AppMemoryList())); + struct stat st; + ASSERT_EQ(0, stat(normal_dump.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + normal_file_size = st.st_size; + + Minidump minidump(normal_dump); + ASSERT_TRUE(minidump.Read()); + MinidumpThreadList* dump_thread_list = minidump.GetThreadList(); + ASSERT_TRUE(dump_thread_list); + for (unsigned int i = 0; i < dump_thread_list->thread_count(); i++) { + MinidumpThread* thread = dump_thread_list->GetThreadAtIndex(i); + ASSERT_TRUE(thread->thread() != NULL); + // When the stack size is zero bytes, GetMemory() returns NULL. + MinidumpMemoryRegion* memory = thread->GetMemory(); + ASSERT_TRUE(memory != NULL); + total_normal_stack_size += memory->GetSize(); + } + } + + // Second, write a minidump with a size limit big enough to not trigger + // anything. + { + // Set size limit arbitrarily 1MB larger than the normal file size -- such + // that the limiting code will not kick in. + const off_t minidump_size_limit = normal_file_size + 1024*1024; + + string same_dump = temp_dir.path() + + "/minidump-writer-unittest-same.dmp"; + ASSERT_TRUE(WriteMinidump(same_dump.c_str(), minidump_size_limit, + child_pid, NULL, 0, + MappingList(), AppMemoryList())); + struct stat st; + ASSERT_EQ(0, stat(same_dump.c_str(), &st)); + // Make sure limiting wasn't actually triggered. NOTE: If you fail this, + // first make sure that "minidump_size_limit" above is indeed set to a + // large enough value -- the limit-checking code in minidump_writer.cc + // does just a rough estimate. + ASSERT_EQ(normal_file_size, st.st_size); + } + + // Third, write a minidump with a size limit small enough to be triggered. + { + // Set size limit to some arbitrary amount, such that the limiting code + // will kick in. The equation used to set this value was determined by + // simply reversing the size-limit logic a little bit in order to pick a + // size we know will trigger it. The definition of + // kLimitAverageThreadStackLength here was copied from class + // MinidumpWriter in minidump_writer.cc. + static const unsigned kLimitAverageThreadStackLength = 8 * 1024; + off_t minidump_size_limit = kNumberOfThreadsInHelperProgram * + kLimitAverageThreadStackLength; + // If, in reality, each of the threads' stack is *smaller* than + // kLimitAverageThreadStackLength, the normal file size could very well be + // smaller than the arbitrary limit that was just set. In that case, + // either of these numbers should trigger the size-limiting code, but we + // might as well pick the smallest. + if (normal_file_size < minidump_size_limit) + minidump_size_limit = normal_file_size; + + string limit_dump = temp_dir.path() + + "/minidump-writer-unittest-limit.dmp"; + ASSERT_TRUE(WriteMinidump(limit_dump.c_str(), minidump_size_limit, + child_pid, NULL, 0, + MappingList(), AppMemoryList())); + struct stat st; + ASSERT_EQ(0, stat(limit_dump.c_str(), &st)); + ASSERT_GT(st.st_size, 0); + // Make sure the file size is at least smaller than the original. If this + // fails because it's the same size, then the size-limit logic didn't kick + // in like it was supposed to. + EXPECT_LT(st.st_size, normal_file_size); + + Minidump minidump(limit_dump); + ASSERT_TRUE(minidump.Read()); + MinidumpThreadList* dump_thread_list = minidump.GetThreadList(); + ASSERT_TRUE(dump_thread_list); + int total_limit_stack_size = 0; + for (unsigned int i = 0; i < dump_thread_list->thread_count(); i++) { + MinidumpThread* thread = dump_thread_list->GetThreadAtIndex(i); + ASSERT_TRUE(thread->thread() != NULL); + // When the stack size is zero bytes, GetMemory() returns NULL. + MinidumpMemoryRegion* memory = thread->GetMemory(); + ASSERT_TRUE(memory != NULL); + total_limit_stack_size += memory->GetSize(); + } + + // Make sure stack size shrunk by at least 1KB per extra thread. The + // definition of kLimitBaseThreadCount here was copied from class + // MinidumpWriter in minidump_writer.cc. + // Note: The 1KB is arbitrary, and assumes that the thread stacks are big + // enough to shrink by that much. For example, if each thread stack was + // originally only 2KB, the current size-limit logic wouldn't actually + // shrink them because that's the size to which it tries to shrink. If + // you fail this part of the test due to something like that, the test + // logic should probably be improved to account for your situation. + const unsigned kLimitBaseThreadCount = 20; + const unsigned kMinPerExtraThreadStackReduction = 1024; + const int min_expected_reduction = (kNumberOfThreadsInHelperProgram - + kLimitBaseThreadCount) * kMinPerExtraThreadStackReduction; + EXPECT_LT(total_limit_stack_size, + total_normal_stack_size - min_expected_reduction); + } + + // Kill the helper program. + kill(child_pid, SIGKILL); + IGNORE_EINTR(waitpid(child_pid, nullptr, 0)); +} + +} // namespace diff --git a/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc b/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc new file mode 100644 index 0000000..399f1a1 --- /dev/null +++ b/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc @@ -0,0 +1,69 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_writer_unittest_utils.cc: +// Shared routines used by unittests under client/linux/minidump_writer. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "client/linux/minidump_writer/minidump_writer_unittest_utils.h" +#include "common/linux/safe_readlink.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +string GetHelperBinary() { + string helper_path; + char* bindir = getenv("bindir"); + if (bindir) { + helper_path = string(bindir) + "/"; + } else { + // Locate helper binary next to the current binary. + char self_path[PATH_MAX]; + if (!SafeReadLink("/proc/self/exe", self_path)) { + return ""; + } + helper_path = string(self_path); + size_t pos = helper_path.rfind('/'); + if (pos == string::npos) { + return ""; + } + helper_path.erase(pos + 1); + } + + helper_path += "linux_dumper_unittest_helper"; + + return helper_path; +} + +} // namespace google_breakpad diff --git a/src/client/linux/minidump_writer/minidump_writer_unittest_utils.h b/src/client/linux/minidump_writer/minidump_writer_unittest_utils.h new file mode 100644 index 0000000..f93885e --- /dev/null +++ b/src/client/linux/minidump_writer/minidump_writer_unittest_utils.h @@ -0,0 +1,48 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_writer_unittest_utils.h: +// Shared routines used by unittests under client/linux/minidump_writer. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_UNITTEST_UTILS_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_UNITTEST_UTILS_H_ + +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +// Returns the full path to linux_dumper_unittest_helper. The full path is +// discovered either by using the environment variable "bindir" or by using +// the location of the main module of the currently running process. +string GetHelperBinary(); + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_UNITTEST_UTILS_H_ diff --git a/src/client/linux/minidump_writer/pe_file.cc b/src/client/linux/minidump_writer/pe_file.cc new file mode 100644 index 0000000..7b3fe6c --- /dev/null +++ b/src/client/linux/minidump_writer/pe_file.cc @@ -0,0 +1,151 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "client/linux/minidump_writer/pe_file.h" +#include "client/linux/minidump_writer/pe_structs.h" +#include "common/linux/memory_mapped_file.h" + +namespace google_breakpad { + +PEFileFormat PEFile::TryGetDebugInfo(const char* filename, + PRSDS_DEBUG_FORMAT debug_info) { + MemoryMappedFile mapped_file(filename, 0); + if (!mapped_file.data()) + return PEFileFormat::notPeCoff; + const void* base = mapped_file.data(); + const size_t file_size = mapped_file.size(); + + const IMAGE_DOS_HEADER* header = + TryReadStruct(base, 0, file_size); + if (!header || (header->e_magic != IMAGE_DOS_SIGNATURE)) { + return PEFileFormat::notPeCoff; + } + + // NTHeader is at position 'e_lfanew'. + DWORD nt_header_offset = header->e_lfanew; + // First, read a common IMAGE_NT_HEADERS structure. It should contain a + // special flag marking whether PE module is x64 (OptionalHeader.Magic) + // and so-called NT_SIGNATURE in Signature field. + const IMAGE_NT_HEADERS* nt_header = + TryReadStruct(base, nt_header_offset, file_size); + if (!nt_header || (nt_header->Signature != IMAGE_NT_SIGNATURE) + || ((nt_header->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) + && (nt_header->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC))) + return PEFileFormat::notPeCoff; + + bool x64 = nt_header->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC; + WORD sections_number = nt_header->FileHeader.NumberOfSections; + DWORD debug_offset; + DWORD debug_size; + DWORD section_offset; + if (x64) { + const IMAGE_NT_HEADERS64* header_64 = + TryReadStruct(base, nt_header_offset, file_size); + if (!header_64) + return PEFileFormat::peWithoutBuildId; + debug_offset = + header_64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG] + .VirtualAddress; + debug_size = + header_64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG] + .Size; + section_offset = nt_header_offset + sizeof(IMAGE_NT_HEADERS64); + } else { + const IMAGE_NT_HEADERS32* header_32 = + TryReadStruct(base, nt_header_offset, file_size); + if (!header_32) + return PEFileFormat::peWithoutBuildId; + debug_offset = + header_32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG] + .VirtualAddress; + debug_size = + header_32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG] + .Size; + section_offset = nt_header_offset + sizeof(IMAGE_NT_HEADERS32); + } + + DWORD debug_end_pos = debug_offset + debug_size; + while (debug_offset < debug_end_pos) { + for (WORD i = 0; i < sections_number; ++i) { + // Section headers are placed sequentially after the NT_HEADER (32/64). + const IMAGE_SECTION_HEADER* section = + TryReadStruct(base, section_offset, file_size); + if (!section) + return PEFileFormat::peWithoutBuildId; + + section_offset += sizeof(IMAGE_SECTION_HEADER); + + // Current `debug_offset` should be inside a section, stop if we find + // a suitable one (we don't consider any malformed sections here). + if ((section->VirtualAddress <= debug_offset) && + (debug_offset < section->VirtualAddress + section->SizeOfRawData)) { + DWORD offset = + section->PointerToRawData + debug_offset - section->VirtualAddress; + // Go to the position of current ImageDebugDirectory (offset). + const IMAGE_DEBUG_DIRECTORY* debug_directory = + TryReadStruct(base, offset, file_size); + if (!debug_directory) + return PEFileFormat::peWithoutBuildId; + // Process ImageDebugDirectory with CodeViewRecord type and skip + // all others. + if (debug_directory->Type == IMAGE_DEBUG_TYPE_CODEVIEW) { + DWORD debug_directory_size = debug_directory->SizeOfData; + if (debug_directory_size < sizeof(RSDS_DEBUG_FORMAT)) + // RSDS section is malformed. + return PEFileFormat::peWithoutBuildId; + // Go to the position of current ImageDebugDirectory Raw Data + // (debug_directory->PointerToRawData) and read the RSDS section. + const RSDS_DEBUG_FORMAT* rsds = + TryReadStruct( + base, debug_directory->PointerToRawData, file_size); + + if (!rsds) + return PEFileFormat::peWithoutBuildId; + + memcpy(debug_info->guid, rsds->guid, sizeof(rsds->guid)); + memcpy(debug_info->age, rsds->age, sizeof(rsds->age)); + return PEFileFormat::peWithBuildId; + } + + break; + } + } + + debug_offset += sizeof(IMAGE_DEBUG_DIRECTORY); + } + + return PEFileFormat::peWithoutBuildId; +} + +} // namespace google_breakpad \ No newline at end of file diff --git a/src/client/linux/minidump_writer/pe_file.h b/src/client/linux/minidump_writer/pe_file.h new file mode 100644 index 0000000..97984ab --- /dev/null +++ b/src/client/linux/minidump_writer/pe_file.h @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_PE_FILE_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_PE_FILE_H_ + +#include "client/linux/minidump_writer/pe_structs.h" + +namespace google_breakpad { + +typedef enum { + notPeCoff = 0, + peWithoutBuildId = 1, + peWithBuildId = 2 +} PEFileFormat; + +class PEFile { + public: + /** + * Attempts to parse RSDS_DEBUG_FORMAT record from a PE (Portable + * Executable) file. To do this we check whether the loaded file is a PE + * file, and if it is - try to find IMAGE_DEBUG_DIRECTORY structure with + * its type set to IMAGE_DEBUG_TYPE_CODEVIEW. + * + * @param filename Filename for the module to parse. + * @param debug_info RSDS_DEBUG_FORMAT struct to be populated with PE debug + * info (GUID and age). + * @return + * notPeCoff: not PE/COFF file; + * peWithoutBuildId: a PE/COFF file but build-id is not set; + * peWithBuildId: a PE/COFF file and build-id is set. + */ + static PEFileFormat TryGetDebugInfo(const char* filename, + PRSDS_DEBUG_FORMAT debug_info); + + private: + template + static const TStruct* TryReadStruct(const void* base, + const DWORD position, + const size_t file_size) { + if (position + sizeof(TStruct) >= file_size){ + return nullptr; + } + + const void* ptr = static_cast(base) + position; + return reinterpret_cast(ptr); + } +}; + +} // namespace google_breakpad +#endif // CLIENT_LINUX_MINIDUMP_WRITER_PE_FILE_H_ \ No newline at end of file diff --git a/src/client/linux/minidump_writer/pe_structs.h b/src/client/linux/minidump_writer/pe_structs.h new file mode 100644 index 0000000..122cc29 --- /dev/null +++ b/src/client/linux/minidump_writer/pe_structs.h @@ -0,0 +1,225 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_PE_STRUCTS_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_PE_STRUCTS_H_ + +#include + +namespace google_breakpad { + +typedef uint8_t BYTE; +typedef uint16_t WORD; +typedef uint32_t DWORD; +typedef uint64_t ULONGLONG; + +#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b +#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b + +#define IMAGE_DEBUG_TYPE_CODEVIEW 2 + +#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ +#define IMAGE_NT_SIGNATURE 0x00004550 // PE00 + +#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 +#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 + +typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header + WORD e_magic; // Magic number + WORD e_cblp; // Bytes on last page of file + WORD e_cp; // Pages in file + WORD e_crlc; // Relocations + WORD e_cparhdr; // Size of header in paragraphs + WORD e_minalloc; // Minimum extra paragraphs needed + WORD e_maxalloc; // Maximum extra paragraphs needed + WORD e_ss; // Initial (relative) SS value + WORD e_sp; // Initial SP value + WORD e_csum; // Checksum + WORD e_ip; // Initial IP value + WORD e_cs; // Initial (relative) CS value + WORD e_lfarlc; // File address of relocation table + WORD e_ovno; // Overlay number + WORD e_res[4]; // Reserved words + WORD e_oemid; // OEM identifier (for e_oeminfo) + WORD e_oeminfo; // OEM information; e_oemid specific + WORD e_res2[10]; // Reserved words + DWORD e_lfanew; // File address of new exe header +} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; + +typedef struct _IMAGE_FILE_HEADER { + WORD Machine; + WORD NumberOfSections; + DWORD TimeDateStamp; + DWORD PointerToSymbolTable; + DWORD NumberOfSymbols; + WORD SizeOfOptionalHeader; + WORD Characteristics; +} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; + +typedef struct _IMAGE_DATA_DIRECTORY { + DWORD VirtualAddress; + DWORD Size; +} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; + + +typedef struct _IMAGE_DEBUG_DIRECTORY { + DWORD Characteristics; + DWORD TimeDateStamp; + WORD MajorVersion; + WORD MinorVersion; + DWORD Type; + DWORD SizeOfData; + DWORD AddressOfRawData; + DWORD PointerToRawData; +} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY; + +typedef struct _IMAGE_OPTIONAL_HEADER64 { + // + // Standard fields - Magic. + // + WORD Magic; + BYTE MajorLinkerVersion; + BYTE MinorLinkerVersion; + DWORD SizeOfCode; + DWORD SizeOfInitializedData; + DWORD SizeOfUninitializedData; + DWORD AddressOfEntryPoint; + DWORD BaseOfCode; + // + // NT additional fields. + // + ULONGLONG ImageBase; + DWORD SectionAlignment; + DWORD FileAlignment; + WORD MajorOperatingSystemVersion; + WORD MinorOperatingSystemVersion; + WORD MajorImageVersion; + WORD MinorImageVersion; + WORD MajorSubsystemVersion; + WORD MinorSubsystemVersion; + DWORD Win32VersionValue; + DWORD SizeOfImage; + DWORD SizeOfHeaders; + DWORD CheckSum; + WORD Subsystem; + WORD DllCharacteristics; + ULONGLONG SizeOfStackReserve; + ULONGLONG SizeOfStackCommit; + ULONGLONG SizeOfHeapReserve; + ULONGLONG SizeOfHeapCommit; + DWORD LoaderFlags; + DWORD NumberOfRvaAndSizes; + IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; +} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64; + +typedef struct _IMAGE_OPTIONAL_HEADER { + // + // Standard fields. + // + WORD Magic; + BYTE MajorLinkerVersion; + BYTE MinorLinkerVersion; + DWORD SizeOfCode; + DWORD SizeOfInitializedData; + DWORD SizeOfUninitializedData; + DWORD AddressOfEntryPoint; + DWORD BaseOfCode; + DWORD BaseOfData; + // + // NT additional fields. + // + DWORD ImageBase; + DWORD SectionAlignment; + DWORD FileAlignment; + WORD MajorOperatingSystemVersion; + WORD MinorOperatingSystemVersion; + WORD MajorImageVersion; + WORD MinorImageVersion; + WORD MajorSubsystemVersion; + WORD MinorSubsystemVersion; + DWORD Win32VersionValue; + DWORD SizeOfImage; + DWORD SizeOfHeaders; + DWORD CheckSum; + WORD Subsystem; + WORD DllCharacteristics; + DWORD SizeOfStackReserve; + DWORD SizeOfStackCommit; + DWORD SizeOfHeapReserve; + DWORD SizeOfHeapCommit; + DWORD LoaderFlags; + DWORD NumberOfRvaAndSizes; + IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; +} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32; + +typedef struct _IMAGE_NT_HEADERS64 { + DWORD Signature; + IMAGE_FILE_HEADER FileHeader; + IMAGE_OPTIONAL_HEADER64 OptionalHeader; +} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; + +typedef struct _IMAGE_NT_HEADERS32 { + DWORD Signature; + IMAGE_FILE_HEADER FileHeader; + IMAGE_OPTIONAL_HEADER32 OptionalHeader; +} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; + +typedef struct _IMAGE_NT_HEADERS { + DWORD Signature; + IMAGE_FILE_HEADER FileHeader; + IMAGE_OPTIONAL_HEADER32 OptionalHeader; +} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; + +#define IMAGE_SIZEOF_SHORT_NAME 8 + +typedef struct _IMAGE_SECTION_HEADER { + BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; + union { + DWORD PhysicalAddress; + DWORD VirtualSize; + } Misc; + DWORD VirtualAddress; + DWORD SizeOfRawData; + DWORD PointerToRawData; + DWORD PointerToRelocations; + DWORD PointerToLinenumbers; + WORD NumberOfRelocations; + WORD NumberOfLinenumbers; + DWORD Characteristics; +} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; + +typedef struct _RSDS_DEBUG_FORMAT { + DWORD signature; + BYTE guid[16]; + BYTE age[4]; + char pdbpath[1]; +} RSDS_DEBUG_FORMAT, *PRSDS_DEBUG_FORMAT; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_MINIDUMP_WRITER_PE_STRUCTS_H_ \ No newline at end of file diff --git a/src/client/linux/minidump_writer/proc_cpuinfo_reader.h b/src/client/linux/minidump_writer/proc_cpuinfo_reader.h new file mode 100644 index 0000000..5ae16df --- /dev/null +++ b/src/client/linux/minidump_writer/proc_cpuinfo_reader.h @@ -0,0 +1,129 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_PROC_CPUINFO_READER_H_ +#define CLIENT_LINUX_MINIDUMP_WRITER_PROC_CPUINFO_READER_H_ + +#include +#include +#include + +#include "client/linux/minidump_writer/line_reader.h" +#include "common/linux/linux_libc_support.h" +#include "third_party/lss/linux_syscall_support.h" + +namespace google_breakpad { + +// A class for reading /proc/cpuinfo without using fopen/fgets or other +// functions which may allocate memory. +class ProcCpuInfoReader { +public: + ProcCpuInfoReader(int fd) + : line_reader_(fd), pop_count_(-1) { + } + + // Return the next field name, or NULL in case of EOF. + // field: (output) Pointer to zero-terminated field name. + // Returns true on success, or false on EOF or error (line too long). + bool GetNextField(const char** field) { + for (;;) { + const char* line; + unsigned line_len; + + // Try to read next line. + if (pop_count_ >= 0) { + line_reader_.PopLine(pop_count_); + pop_count_ = -1; + } + + if (!line_reader_.GetNextLine(&line, &line_len)) + return false; + + pop_count_ = static_cast(line_len); + + const char* line_end = line + line_len; + + // Expected format: + ':' + // Note that: + // - empty lines happen. + // - can contain spaces. + // - some fields have an empty + char* sep = static_cast(my_memchr(line, ':', line_len)); + if (sep == NULL) + continue; + + // Record the value. Skip leading space after the column to get + // its start. + const char* val = sep+1; + while (val < line_end && my_isspace(*val)) + val++; + + value_ = val; + value_len_ = static_cast(line_end - val); + + // Remove trailing spaces before the column to properly 0-terminate + // the field name. + while (sep > line && my_isspace(sep[-1])) + sep--; + + if (sep == line) + continue; + + // zero-terminate field name. + *sep = '\0'; + + *field = line; + return true; + } + } + + // Return the field value. This must be called after a succesful + // call to GetNextField(). + const char* GetValue() { + assert(value_); + return value_; + } + + // Same as GetValue(), but also returns the length in characters of + // the value. + const char* GetValueAndLen(size_t* length) { + assert(value_); + *length = value_len_; + return value_; + } + +private: + LineReader line_reader_; + int pop_count_; + const char* value_; + size_t value_len_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_LINUX_MINIDUMP_WRITER_PROC_CPUINFO_READER_H_ diff --git a/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc b/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc new file mode 100644 index 0000000..4ac5256 --- /dev/null +++ b/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc @@ -0,0 +1,188 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include + +#include "client/linux/minidump_writer/proc_cpuinfo_reader.h" +#include "breakpad_googletest_includes.h" +#include "common/linux/scoped_tmpfile.h" + +using namespace google_breakpad; + +namespace { + +typedef testing::Test ProcCpuInfoReaderTest; + +} + +TEST(ProcCpuInfoReaderTest, EmptyFile) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("")); + ProcCpuInfoReader reader(file.GetFd()); + + const char* field; + ASSERT_FALSE(reader.GetNextField(&field)); +} + +TEST(ProcCpuInfoReaderTest, OneLineTerminated) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo : bar\n")); + ProcCpuInfoReader reader(file.GetFd()); + + const char* field; + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("foo", field); + ASSERT_STREQ("bar", reader.GetValue()); + + ASSERT_FALSE(reader.GetNextField(&field)); +} + +TEST(ProcCpuInfoReaderTest, OneLine) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo : bar")); + ProcCpuInfoReader reader(file.GetFd()); + + const char* field; + size_t value_len; + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("foo", field); + ASSERT_STREQ("bar", reader.GetValueAndLen(&value_len)); + ASSERT_EQ(3U, value_len); + + ASSERT_FALSE(reader.GetNextField(&field)); +} + +TEST(ProcCpuInfoReaderTest, TwoLinesTerminated) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo : bar\nzoo : tut\n")); + ProcCpuInfoReader reader(file.GetFd()); + + const char* field; + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("foo", field); + ASSERT_STREQ("bar", reader.GetValue()); + + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("zoo", field); + ASSERT_STREQ("tut", reader.GetValue()); + + ASSERT_FALSE(reader.GetNextField(&field)); +} + +TEST(ProcCpuInfoReaderTest, SkipMalformedLine) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("this line should have a column\nfoo : bar\n")); + ProcCpuInfoReader reader(file.GetFd()); + + const char* field; + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("foo", field); + ASSERT_STREQ("bar", reader.GetValue()); + + ASSERT_FALSE(reader.GetNextField(&field)); +} + +TEST(ProcCpuInfoReaderTest, SkipOneEmptyLine) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("\n\nfoo : bar\n")); + ProcCpuInfoReader reader(file.GetFd()); + + const char* field; + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("foo", field); + ASSERT_STREQ("bar", reader.GetValue()); + + ASSERT_FALSE(reader.GetNextField(&field)); +} + +TEST(ProcCpuInfoReaderTest, SkipEmptyField) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString(" : bar\nzoo : tut\n")); + ProcCpuInfoReader reader(file.GetFd()); + + const char* field; + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("zoo", field); + ASSERT_STREQ("tut", reader.GetValue()); + + ASSERT_FALSE(reader.GetNextField(&field)); +} + +TEST(ProcCpuInfoReaderTest, SkipTwoEmptyLines) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo : bar\n\n\nfoo : bar\n")); + ProcCpuInfoReader reader(file.GetFd()); + + const char* field; + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("foo", field); + ASSERT_STREQ("bar", reader.GetValue()); + + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("foo", field); + ASSERT_STREQ("bar", reader.GetValue()); + + ASSERT_FALSE(reader.GetNextField(&field)); +} + +TEST(ProcCpuInfoReaderTest, FieldWithSpaces) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo bar : zoo\n")); + ProcCpuInfoReader reader(file.GetFd()); + + const char* field; + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("foo bar", field); + ASSERT_STREQ("zoo", reader.GetValue()); + + ASSERT_FALSE(reader.GetNextField(&field)); +} + +TEST(ProcCpuInfoReaderTest, EmptyValue) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("foo :\n")); + ProcCpuInfoReader reader(file.GetFd()); + + const char* field; + ASSERT_TRUE(reader.GetNextField(&field)); + ASSERT_STREQ("foo", field); + size_t value_len; + ASSERT_STREQ("", reader.GetValueAndLen(&value_len)); + ASSERT_EQ(0U, value_len); + + ASSERT_FALSE(reader.GetNextField(&field)); +} diff --git a/src/client/linux/sender/google_crash_report_sender.cc b/src/client/linux/sender/google_crash_report_sender.cc new file mode 100644 index 0000000..f6e4819 --- /dev/null +++ b/src/client/linux/sender/google_crash_report_sender.cc @@ -0,0 +1,108 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/google_crashdump_uploader.h" +#include +#include +#include +#include + +#include "common/using_std_string.h" + +DEFINE_string(crash_server, "https://clients2.google.com/cr", + "The crash server to upload minidumps to."); +DEFINE_string(product_name, "", + "The product name that the minidump corresponds to."); +DEFINE_string(product_version, "", + "The version of the product that produced the minidump."); +DEFINE_string(client_id, "", + "The client GUID"); +DEFINE_string(minidump_path, "", + "The path of the minidump file."); +DEFINE_string(ptime, "", + "The process uptime in milliseconds."); +DEFINE_string(ctime, "", + "The cumulative process uptime in milliseconds."); +DEFINE_string(email, "", + "The user's email address."); +DEFINE_string(comments, "", + "Extra user comments"); +DEFINE_string(proxy_host, "", + "Proxy host"); +DEFINE_string(proxy_userpasswd, "", + "Proxy username/password in user:pass format."); + + +bool CheckForRequiredFlagsOrDie() { + string error_text = ""; + if (FLAGS_product_name.empty()) { + error_text.append("\nProduct name must be specified."); + } + + if (FLAGS_product_version.empty()) { + error_text.append("\nProduct version must be specified."); + } + + if (FLAGS_client_id.empty()) { + error_text.append("\nClient ID must be specified."); + } + + if (FLAGS_minidump_path.empty()) { + error_text.append("\nMinidump pathname must be specified."); + } + + if (!error_text.empty()) { + std::cout << error_text; + return false; + } + return true; +} + +int main(int argc, char* argv[]) { + google::InitGoogleLogging(argv[0]); + google::ParseCommandLineFlags(&argc, &argv, true); + if (!CheckForRequiredFlagsOrDie()) { + return 1; + } + google_breakpad::GoogleCrashdumpUploader g(FLAGS_product_name, + FLAGS_product_version, + FLAGS_client_id, + FLAGS_ptime, + FLAGS_ctime, + FLAGS_email, + FLAGS_comments, + FLAGS_minidump_path, + FLAGS_crash_server, + FLAGS_proxy_host, + FLAGS_proxy_userpasswd); + g.Upload(NULL, NULL, NULL); +} diff --git a/src/client/mac/Breakpad.xcodeproj/project.pbxproj b/src/client/mac/Breakpad.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ed782c9 --- /dev/null +++ b/src/client/mac/Breakpad.xcodeproj/project.pbxproj @@ -0,0 +1,2855 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXAggregateTarget section */ + F94585840F782326009A47BF /* All */ = { + isa = PBXAggregateTarget; + buildConfigurationList = F94585930F78235C009A47BF /* Build configuration list for PBXAggregateTarget "All" */; + buildPhases = ( + ); + dependencies = ( + F94585880F78232B009A47BF /* PBXTargetDependency */, + F945858A0F78232E009A47BF /* PBXTargetDependency */, + F945858C0F782330009A47BF /* PBXTargetDependency */, + F945858E0F782333009A47BF /* PBXTargetDependency */, + F94585900F782336009A47BF /* PBXTargetDependency */, + F93DE3A70F830D1D00608B94 /* PBXTargetDependency */, + F95BB8B3101F94D300AA053B /* PBXTargetDependency */, + F95BB8B5101F94D300AA053B /* PBXTargetDependency */, + F95BB8B7101F94D300AA053B /* PBXTargetDependency */, + 8B31023911F0CF0600FCF3E4 /* PBXTargetDependency */, + 8B31051711F1010E00FCF3E4 /* PBXTargetDependency */, + 8B31051911F1010E00FCF3E4 /* PBXTargetDependency */, + 8B31051B11F1010E00FCF3E4 /* PBXTargetDependency */, + 8B31051D11F1010E00FCF3E4 /* PBXTargetDependency */, + 8B31051F11F1010E00FCF3E4 /* PBXTargetDependency */, + ); + name = All; + productName = All; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 162F64F2161C577500CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F0161C577500CD68D5 /* arch_utilities.cc */; }; + 162F64F3161C577500CD68D5 /* arch_utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 162F64F1161C577500CD68D5 /* arch_utilities.h */; }; + 162F64F4161C579B00CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F0161C577500CD68D5 /* arch_utilities.cc */; }; + 162F64F5161C579B00CD68D5 /* arch_utilities.h in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F1161C577500CD68D5 /* arch_utilities.h */; }; + 163201D61443019E00C4DBF5 /* ConfigFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 163201D41443019E00C4DBF5 /* ConfigFile.h */; }; + 163201D71443019E00C4DBF5 /* ConfigFile.mm in Sources */ = {isa = PBXBuildFile; fileRef = 163201D51443019E00C4DBF5 /* ConfigFile.mm */; }; + 163201E31443029300C4DBF5 /* ConfigFile.mm in Sources */ = {isa = PBXBuildFile; fileRef = 163201D51443019E00C4DBF5 /* ConfigFile.mm */; }; + 16C7C918147D45AE00776EAD /* BreakpadDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7C917147D45AE00776EAD /* BreakpadDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 16E02DB8147410F0008C604D /* uploader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 16E02DB4147410D4008C604D /* uploader.mm */; }; + 1EEEB6231720829E00F7E689 /* simple_string_dictionary.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1EEEB6211720829E00F7E689 /* simple_string_dictionary.cc */; }; + 1EEEB6241720829E00F7E689 /* simple_string_dictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EEEB6221720829E00F7E689 /* simple_string_dictionary.h */; }; + 1EEEB6271720831E00F7E689 /* BreakpadFramework_Test.mm in Sources */ = {isa = PBXBuildFile; fileRef = F91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */; }; + 1EEEB62A1720859200F7E689 /* simple_string_dictionary_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1EEEB6251720830600F7E689 /* simple_string_dictionary_unittest.cc */; }; + 1EEEB62B1720868C00F7E689 /* simple_string_dictionary.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1EEEB6211720829E00F7E689 /* simple_string_dictionary.cc */; }; + 3329D4ED0FA16D820007BBC5 /* Breakpad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3329D4EC0FA16D820007BBC5 /* Breakpad.xib */; }; + 33880C800F9E097100817F82 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 33880C7E0F9E097100817F82 /* InfoPlist.strings */; }; + 4084699D0F5D9CF900FDCA37 /* crash_report_sender.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */; }; + 421BC5BC21110C0300B8042E /* convert_old_arm64_context.cc in Sources */ = {isa = PBXBuildFile; fileRef = 421BC5AD21110C0300B8042E /* convert_old_arm64_context.cc */; }; + 421BC5BD21110C0300B8042E /* convert_old_arm64_context.h in Headers */ = {isa = PBXBuildFile; fileRef = 421BC5BB21110C0300B8042E /* convert_old_arm64_context.h */; }; + 421BC5BE21110C1000B8042E /* convert_old_arm64_context.cc in Sources */ = {isa = PBXBuildFile; fileRef = 421BC5AD21110C0300B8042E /* convert_old_arm64_context.cc */; }; + 4247E6412110D7A300482558 /* memory_allocator_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244540A12439BA0009BBCE0 /* memory_allocator_unittest.cc */; }; + 4D61A25F14F43CFC002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; }; + 4D61A26B14F43D3C002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; }; + 4D61A26C14F43D42002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; }; + 4D61A26D14F43D43002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; }; + 4D61A26E14F43D45002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; }; + 4D61A26F14F43D48002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; }; + 4D72CA0E13DFAD5C006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; }; + 4D72CA2513DFAE1C006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; }; + 4D72CA2F13DFAE65006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; }; + 4D72CA3813DFAE91006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; }; + 4D72CA3913DFAE92006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; }; + 4DBE49A6134A4F200072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; }; + 4DBE49A7134A4F280072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; }; + 4DBE49A8134A4F380072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; }; + 4DBE49A9134A4F460072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; }; + 8B3101C611F0CD9F00FCF3E4 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; + 8B3101C711F0CD9F00FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + 8B3101CA11F0CDB000FCF3E4 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; }; + 8B3101CB11F0CDB000FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + 8B3101EA11F0CDE300FCF3E4 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B3101E911F0CDE300FCF3E4 /* SenTestingKit.framework */; }; + 8B31029411F0D54300FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + 8B3102E611F0D74C00FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + 8B3102EB11F0D78000FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + 8B31FC8211EFD2B800FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; + D23F4B2E12A7E13200686C8D /* minidump_generator_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D23F4B2C12A7E13200686C8D /* minidump_generator_test.cc */; }; + D23F4B3312A7E17700686C8D /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2F9A41512131EF0002747C1 /* libgtest.a */; }; + D23F4BB112A868CB00686C8D /* minidump_generator_test_helper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D23F4B9A12A8688800686C8D /* minidump_generator_test_helper.cc */; }; + D23F4BB812A868F700686C8D /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; }; + D244536A12426F00009BBCE0 /* logging.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535112426EBB009BBCE0 /* logging.cc */; }; + D244536B12426F00009BBCE0 /* minidump.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535212426EBB009BBCE0 /* minidump.cc */; }; + D244536C12426F00009BBCE0 /* pathname_stripper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535312426EBB009BBCE0 /* pathname_stripper.cc */; }; + D244536D12426F00009BBCE0 /* basic_code_modules.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244534F12426E98009BBCE0 /* basic_code_modules.cc */; }; + D246417012BAA40E005170D0 /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; }; + D246417112BAA41C005170D0 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; }; + D246417512BAA438005170D0 /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; }; + D246417612BAA43F005170D0 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; }; + D246417712BAA444005170D0 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; }; + D246418412BAA4BA005170D0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + D246418812BAA4E3005170D0 /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; }; + D246418C12BAA508005170D0 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; }; + D246419012BAA52A005170D0 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; }; + D246419112BAA52F005170D0 /* convert_UTF.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.cc */; }; + D246419512BAA54C005170D0 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; }; + D246419612BAA55A005170D0 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; }; + D24641A012BAA67F005170D0 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; }; + D24641AF12BAA82D005170D0 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; }; + D24641EC12BAC6FB005170D0 /* logging.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535112426EBB009BBCE0 /* logging.cc */; }; + D24641ED12BAC6FB005170D0 /* minidump.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535212426EBB009BBCE0 /* minidump.cc */; }; + D24641EE12BAC6FB005170D0 /* pathname_stripper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535312426EBB009BBCE0 /* pathname_stripper.cc */; }; + D24641EF12BAC6FB005170D0 /* basic_code_modules.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244534F12426E98009BBCE0 /* basic_code_modules.cc */; }; + D24BBBFD121050F000F3D417 /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; }; + D24BBD291211EDB100F3D417 /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; }; + D24BBD321212CACF00F3D417 /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; }; + D2A5DD301188633800081F03 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; }; + D2A5DD401188640400081F03 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; }; + D2A5DD411188642E00081F03 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; }; + D2C1DBE412AFC270006917BD /* logging.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535112426EBB009BBCE0 /* logging.cc */; }; + D2C1DBE512AFC270006917BD /* minidump.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535212426EBB009BBCE0 /* minidump.cc */; }; + D2C1DBE612AFC270006917BD /* pathname_stripper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535312426EBB009BBCE0 /* pathname_stripper.cc */; }; + D2C1DBE712AFC270006917BD /* basic_code_modules.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244534F12426E98009BBCE0 /* basic_code_modules.cc */; }; + D2F9A3D51212F87C002747C1 /* exception_handler_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A3D41212F87C002747C1 /* exception_handler_test.cc */; }; + D2F9A43D12131F55002747C1 /* gmock-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A43C12131F55002747C1 /* gmock-all.cc */; }; + D2F9A44012131F65002747C1 /* gtest_main.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A43E12131F65002747C1 /* gtest_main.cc */; }; + D2F9A44112131F65002747C1 /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A43F12131F65002747C1 /* gtest-all.cc */; }; + D2F9A44412131F84002747C1 /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2F9A41512131EF0002747C1 /* libgtest.a */; }; + D2F9A4C9121336C7002747C1 /* client_info.h in Headers */ = {isa = PBXBuildFile; fileRef = D2F9A4C4121336C7002747C1 /* client_info.h */; }; + D2F9A4CA121336C7002747C1 /* crash_generation_client.h in Headers */ = {isa = PBXBuildFile; fileRef = D2F9A4C5121336C7002747C1 /* crash_generation_client.h */; }; + D2F9A4CB121336C7002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; }; + D2F9A4CC121336C7002747C1 /* crash_generation_server.h in Headers */ = {isa = PBXBuildFile; fileRef = D2F9A4C7121336C7002747C1 /* crash_generation_server.h */; }; + D2F9A4CD121336C7002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; }; + D2F9A4DF12133AD9002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; }; + D2F9A4E012133AD9002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; }; + D2F9A4E112133AE2002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; }; + D2F9A4E212133AE2002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; }; + D2F9A52E121383A1002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; }; + D2F9A52F121383A1002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; }; + D2F9A530121383A1002747C1 /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; }; + D2F9A531121383A1002747C1 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; }; + D2F9A532121383A1002747C1 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; }; + D2F9A533121383A1002747C1 /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; }; + D2F9A534121383A1002747C1 /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; }; + D2F9A535121383A1002747C1 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; }; + D2F9A536121383A1002747C1 /* convert_UTF.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.cc */; }; + D2F9A537121383A1002747C1 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; }; + D2F9A538121383A1002747C1 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; }; + D2F9A539121383A1002747C1 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; }; + D2F9A53A121383A1002747C1 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; }; + D2F9A53B121383A1002747C1 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; }; + D2F9A53C121383A1002747C1 /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; }; + D2F9A53F121383A1002747C1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + D2F9A541121383A1002747C1 /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2F9A41512131EF0002747C1 /* libgtest.a */; }; + D2F9A553121383DC002747C1 /* crash_generation_server_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4CE121336F7002747C1 /* crash_generation_server_test.cc */; }; + EB9CF8B924F01E1D00F9B6D1 /* encoding_util.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9CF89F24F01E1D00F9B6D1 /* encoding_util.m */; }; + EB9CF8BA24F01E1D00F9B6D1 /* minidump_upload.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9CF8AD24F01E1D00F9B6D1 /* minidump_upload.m */; }; + EB9CF8BB24F01E1D00F9B6D1 /* encoding_util.h in Headers */ = {isa = PBXBuildFile; fileRef = EB9CF8AE24F01E1D00F9B6D1 /* encoding_util.h */; }; + EB9CF8BC24F01E1D00F9B6D1 /* HTTPSimplePostRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = EB9CF8AF24F01E1D00F9B6D1 /* HTTPSimplePostRequest.h */; }; + EB9CF8BD24F01E1D00F9B6D1 /* HTTPRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = EB9CF8B024F01E1D00F9B6D1 /* HTTPRequest.h */; }; + EB9CF8BE24F01E1D00F9B6D1 /* HTTPPutRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9CF8B124F01E1D00F9B6D1 /* HTTPPutRequest.m */; }; + EB9CF8BF24F01E1D00F9B6D1 /* HTTPRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9CF8B224F01E1D00F9B6D1 /* HTTPRequest.m */; }; + EB9CF8C024F01E1D00F9B6D1 /* SymbolCollectorClient.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9CF8B324F01E1D00F9B6D1 /* SymbolCollectorClient.m */; }; + EB9CF8C124F01E1D00F9B6D1 /* HTTPGetRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = EB9CF8B424F01E1D00F9B6D1 /* HTTPGetRequest.h */; }; + EB9CF8C224F01E1D00F9B6D1 /* HTTPGetRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9CF8B524F01E1D00F9B6D1 /* HTTPGetRequest.m */; }; + EB9CF8C324F01E1D00F9B6D1 /* HTTPSimplePostRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9CF8B624F01E1D00F9B6D1 /* HTTPSimplePostRequest.m */; }; + EB9CF8C424F01E1D00F9B6D1 /* SymbolCollectorClient.h in Headers */ = {isa = PBXBuildFile; fileRef = EB9CF8B724F01E1D00F9B6D1 /* SymbolCollectorClient.h */; }; + EB9CF8C524F01E1D00F9B6D1 /* HTTPPutRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = EB9CF8B824F01E1D00F9B6D1 /* HTTPPutRequest.h */; }; + EB9CF8C624F01F1100F9B6D1 /* HTTPRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9CF8B224F01E1D00F9B6D1 /* HTTPRequest.m */; }; + EB9CF8C724F01F7600F9B6D1 /* encoding_util.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9CF89F24F01E1D00F9B6D1 /* encoding_util.m */; }; + EB9CF8C824F01FB900F9B6D1 /* HTTPMultipartUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = F92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */; }; + F4DAB1DD19F1027100A5A838 /* launch_reporter.cc in Sources */ = {isa = PBXBuildFile; fileRef = F4DAB1DB19F1027100A5A838 /* launch_reporter.cc */; }; + F4DAB1DE19F1027100A5A838 /* launch_reporter.h in Headers */ = {isa = PBXBuildFile; fileRef = F4DAB1DC19F1027100A5A838 /* launch_reporter.h */; }; + F4F916B619F10FFC00B83BE4 /* launch_reporter.cc in Sources */ = {isa = PBXBuildFile; fileRef = F4DAB1DB19F1027100A5A838 /* launch_reporter.cc */; }; + F91AF6210FD60784009D8BE2 /* Breakpad.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; }; + F9286B3A0F7EB25800A4DCC8 /* InspectorMain.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9286B390F7EB25800A4DCC8 /* InspectorMain.mm */; }; + F92C53B80ECCE7B3009BE4BA /* Inspector.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53B70ECCE7B3009BE4BA /* Inspector.mm */; }; + F92C554C0ECCF534009BE4BA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; }; + F92C55D00ECD0064009BE4BA /* Breakpad.h in Headers */ = {isa = PBXBuildFile; fileRef = F92C55CE0ECD0064009BE4BA /* Breakpad.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F92C55D10ECD0064009BE4BA /* Breakpad.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C55CF0ECD0064009BE4BA /* Breakpad.mm */; }; + F92C56330ECD0DF1009BE4BA /* OnDemandServer.h in Headers */ = {isa = PBXBuildFile; fileRef = F92C56310ECD0DF1009BE4BA /* OnDemandServer.h */; }; + F92C56340ECD0DF1009BE4BA /* OnDemandServer.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C56320ECD0DF1009BE4BA /* OnDemandServer.mm */; }; + F92C563F0ECD10CA009BE4BA /* convert_UTF.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.cc */; }; + F92C56400ECD10CA009BE4BA /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; }; + F92C56410ECD10CA009BE4BA /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; }; + F92C56420ECD10CA009BE4BA /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; }; + F92C56430ECD10CA009BE4BA /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; }; + F92C56440ECD10CA009BE4BA /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; }; + F92C56450ECD10CA009BE4BA /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; }; + F92C56460ECD10CA009BE4BA /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; }; + F92C56470ECD10CA009BE4BA /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; }; + F92C56490ECD10CA009BE4BA /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; }; + F92C564A0ECD10CA009BE4BA /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; }; + F92C564C0ECD10DD009BE4BA /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; }; + F92C56570ECD113E009BE4BA /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C554A0ECCF530009BE4BA /* Carbon.framework */; }; + F92C565C0ECD1158009BE4BA /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; }; + F92C565F0ECD116B009BE4BA /* protected_memory_allocator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53720ECCE3FD009BE4BA /* protected_memory_allocator.cc */; }; + F92C56630ECD1179009BE4BA /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; }; + F92C56650ECD1185009BE4BA /* breakpadUtilities.dylib in Resources */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; }; + F92C568A0ECD15F9009BE4BA /* Inspector in Resources */ = {isa = PBXBuildFile; fileRef = F92C53540ECCE349009BE4BA /* Inspector */; }; + F92C56A90ECE04C5009BE4BA /* crash_report_sender.m in Sources */ = {isa = PBXBuildFile; fileRef = F92C56A80ECE04C5009BE4BA /* crash_report_sender.m */; }; + F93803CD0F8083B7004D428B /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; }; + F93803CE0F8083B7004D428B /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; }; + F93803CF0F8083B7004D428B /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; }; + F93803D00F8083B7004D428B /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; }; + F93803D10F8083B7004D428B /* convert_UTF.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.cc */; }; + F93803D20F8083B7004D428B /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; }; + F93803D30F8083B7004D428B /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; }; + F93803D40F8083B7004D428B /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; }; + F93803D50F8083B7004D428B /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; }; + F93803D60F8083B7004D428B /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; }; + F93803D70F8083B7004D428B /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; }; + F93DE2D80F82A70E00608B94 /* minidump_file_writer_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = F93DE2D70F82A70E00608B94 /* minidump_file_writer_unittest.cc */; }; + F93DE2D90F82A73500608B94 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; }; + F93DE2DA0F82A73500608B94 /* convert_UTF.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.cc */; }; + F93DE2DB0F82A73500608B94 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; }; + F93DE3350F82C66B00608B94 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; }; + F93DE3360F82C66B00608B94 /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; }; + F93DE3370F82C66B00608B94 /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; }; + F93DE3380F82C66B00608B94 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; }; + F93DE3390F82C66B00608B94 /* convert_UTF.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.cc */; }; + F93DE33A0F82C66B00608B94 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; }; + F93DE33B0F82C66B00608B94 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; }; + F93DE33C0F82C66B00608B94 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; }; + F93DE33D0F82C66B00608B94 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; }; + F93DE33E0F82C66B00608B94 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; }; + F93DE33F0F82C66B00608B94 /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; }; + F945849E0F280E3C009A47BF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F945849C0F280E3C009A47BF /* Localizable.strings */; }; + F9B630A0100FF96B00D0F4AC /* goArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = F9B6309F100FF96B00D0F4AC /* goArrow.png */; }; + F9C44DB20EF07288003AEBAA /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DAC0EF07288003AEBAA /* Controller.m */; }; + F9C44DB30EF07288003AEBAA /* crashduringload in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DAD0EF07288003AEBAA /* crashduringload */; }; + F9C44DB40EF07288003AEBAA /* crashInMain in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DAE0EF07288003AEBAA /* crashInMain */; }; + F9C44DB60EF07288003AEBAA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DB00EF07288003AEBAA /* main.m */; }; + F9C44DB70EF07288003AEBAA /* TestClass.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DB10EF07288003AEBAA /* TestClass.mm */; }; + F9C44DBC0EF072A0003AEBAA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DB80EF072A0003AEBAA /* InfoPlist.strings */; }; + F9C44DBD0EF072A0003AEBAA /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DBA0EF072A0003AEBAA /* MainMenu.xib */; }; + F9C44E000EF077CD003AEBAA /* Breakpad.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; }; + F9C44E3C0EF08B12003AEBAA /* Breakpad.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; }; + F9C44E980EF09F56003AEBAA /* crash_report_sender.app in Resources */ = {isa = PBXBuildFile; fileRef = F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */; }; + F9C44EA20EF09F93003AEBAA /* HTTPMultipartUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = F92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */; }; + F9C44EE50EF0A006003AEBAA /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */; }; + F9C44EE90EF0A3C1003AEBAA /* GTMLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */; }; + F9C77E130F7DDF810045F7DB /* GTMSenTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 8B31023811F0CF0600FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = B88FAFC9116BDCAD00407530; + remoteInfo = all_unittests; + }; + 8B31051611F1010E00FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F93803BD0F80820F004D428B; + remoteInfo = generator_test; + }; + 8B31051811F1010E00FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F93DE2D00F82A67300608B94; + remoteInfo = minidump_file_writer_unittest; + }; + 8B31051A11F1010E00FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F93DE32B0F82C55600608B94; + remoteInfo = handler_test; + }; + 8B31051C11F1010E00FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = B89E0E731166575200DD08C9; + remoteInfo = macho_dump; + }; + 8B31051E11F1010E00FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 9BD835FA0B0544950055103E; + remoteInfo = minidump_upload; + }; + 8B31F7A011EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B89E0E741166575200DD08C9; + remoteInfo = macho_dump; + }; + 8B31F7A211EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B88FB024116BDFFF00407530; + remoteInfo = gtestmockall; + }; + 8B31F7A411EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B88FB14B116CF4A700407530; + remoteInfo = byte_cursor_unittest; + }; + 8B31F7A611EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B89E0E9511665A6400DD08C9; + remoteInfo = macho_reader_unittest; + }; + 8B31F7A811EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B88FB007116BDE8300407530; + remoteInfo = stabs_reader_unittest; + }; + 8B31F7AA11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B88FB135116CF30F00407530; + remoteInfo = bytereader_unittest; + }; + 8B31F7AC11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B88FAF2F116A591E00407530; + remoteInfo = dwarf2reader_cfi_unittest; + }; + 8B31F7AE11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B88FB0DF116CEEA800407530; + remoteInfo = dwarf2diehandler_unittest; + }; + 8B31F7B011EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B88FB10A116CF07900407530; + remoteInfo = dwarf_cu_to_module_unittest; + }; + 8B31F7B211EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B88FB0F2116CEF1900407530; + remoteInfo = dwarf_line_to_module_unittest; + }; + 8B31F7B411EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B88FB11F116CF27F00407530; + remoteInfo = dwarf_cfi_to_module_unittest; + }; + 8B31F7B611EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B84A91F4116CF784006C210E; + remoteInfo = stabs_to_module_unittest; + }; + 8B31F7B811EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = B88FB0B9116CEABF00407530; + remoteInfo = module_unittest; + }; + 8B31F7BA11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D21F97D211CBA0F200239E38; + remoteInfo = test_assembler_unittest; + }; + D23F4B2F12A7E16200686C8D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2F9A41412131EF0002747C1; + remoteInfo = gtest; + }; + D23F4BB912A8694C00686C8D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D23F4BAA12A868A500686C8D; + remoteInfo = minidump_generator_test_helper; + }; + D2F9A44212131F80002747C1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2F9A41412131EF0002747C1; + remoteInfo = gtest; + }; + D2F9A52C121383A1002747C1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2F9A41412131EF0002747C1; + remoteInfo = gtest; + }; + D2F9A5DE12142A6A002747C1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D2F9A52A121383A1002747C1; + remoteInfo = crash_generation_server_test; + }; + F91AF6370FD60A74009D8BE2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8DC2EF4F0486A6940098B216; + remoteInfo = Breakpad; + }; + F92C564D0ECD10E5009BE4BA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F92C563B0ECD10B3009BE4BA; + remoteInfo = breakpadUtilities; + }; + F92C56850ECD15EF009BE4BA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F92C563B0ECD10B3009BE4BA; + remoteInfo = breakpadUtilities; + }; + F92C56870ECD15F1009BE4BA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F92C53530ECCE349009BE4BA; + remoteInfo = Inspector; + }; + F93DE2FB0F82C3C600608B94 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F93803BD0F80820F004D428B; + remoteInfo = generator_test; + }; + F93DE36F0F82CC1300608B94 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F93DE32B0F82C55600608B94; + remoteInfo = handler_test; + }; + F93DE3A60F830D1D00608B94 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F9C77DD90F7DD5CF0045F7DB; + remoteInfo = UnitTests; + }; + F94585870F78232B009A47BF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8DC2EF4F0486A6940098B216; + remoteInfo = Breakpad; + }; + F94585890F78232E009A47BF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F92C53530ECCE349009BE4BA; + remoteInfo = Inspector; + }; + F945858B0F782330009A47BF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F92C563B0ECD10B3009BE4BA; + remoteInfo = breakpadUtilities; + }; + F945858D0F782333009A47BF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F92C569F0ECE04A7009BE4BA; + remoteInfo = crash_report_sender; + }; + F945858F0F782336009A47BF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F9C44DA40EF060A8003AEBAA; + remoteInfo = BreakpadTest; + }; + F95BB884101F949F00AA053B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB87C101F949F00AA053B /* crash_report.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8DD76FA10486AA7600D96B5E; + remoteInfo = crash_report; + }; + F95BB891101F94AC00AA053B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8DD76FA10486AA7600D96B5E; + remoteInfo = dump_syms; + }; + F95BB89E101F94C000AA053B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8DD76FA10486AA7600D96B5E; + remoteInfo = symupload; + }; + F95BB8A0101F94C000AA053B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9BD835FB0B0544950055103E; + remoteInfo = minidump_upload; + }; + F95BB8B2101F94D300AA053B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = B8C5B5101166531A00D34F4E; + remoteInfo = dump_syms; + }; + F95BB8B4101F94D300AA053B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 8DD76F960486AA7600D96B5E; + remoteInfo = symupload; + }; + F95BB8B6101F94D300AA053B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F95BB87C101F949F00AA053B /* crash_report.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 8DD76F960486AA7600D96B5E; + remoteInfo = crash_report; + }; + F9C44E190EF0790F003AEBAA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8DC2EF4F0486A6940098B216; + remoteInfo = Breakpad; + }; + F9C44E960EF09F4B003AEBAA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F92C569F0ECE04A7009BE4BA; + remoteInfo = crash_report_sender; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + F9C44E410EF08B17003AEBAA /* Copy Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + F9C44E3C0EF08B12003AEBAA /* Breakpad.framework in Copy Frameworks */, + ); + name = "Copy Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 162F64F0161C577500CD68D5 /* arch_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arch_utilities.cc; path = ../../common/mac/arch_utilities.cc; sourceTree = ""; }; + 162F64F1161C577500CD68D5 /* arch_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = arch_utilities.h; path = ../../common/mac/arch_utilities.h; sourceTree = ""; }; + 163201D41443019E00C4DBF5 /* ConfigFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConfigFile.h; path = crash_generation/ConfigFile.h; sourceTree = ""; }; + 163201D51443019E00C4DBF5 /* ConfigFile.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = ConfigFile.mm; path = crash_generation/ConfigFile.mm; sourceTree = ""; }; + 163202431443201300C4DBF5 /* uploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = uploader.h; path = sender/uploader.h; sourceTree = ""; }; + 16C7C917147D45AE00776EAD /* BreakpadDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BreakpadDefines.h; sourceTree = ""; }; + 16E02DB4147410D4008C604D /* uploader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = uploader.mm; path = sender/uploader.mm; sourceTree = ""; }; + 1EEEB6211720829E00F7E689 /* simple_string_dictionary.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = simple_string_dictionary.cc; path = ../../common/simple_string_dictionary.cc; sourceTree = ""; }; + 1EEEB6221720829E00F7E689 /* simple_string_dictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = simple_string_dictionary.h; path = ../../common/simple_string_dictionary.h; sourceTree = ""; }; + 1EEEB6251720830600F7E689 /* simple_string_dictionary_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = simple_string_dictionary_unittest.cc; path = ../../common/simple_string_dictionary_unittest.cc; sourceTree = ""; }; + 32DBCF5E0370ADEE00C91783 /* Breakpad_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Breakpad_Prefix.pch; path = Framework/Breakpad_Prefix.pch; sourceTree = ""; }; + 3329D4EC0FA16D820007BBC5 /* Breakpad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Breakpad.xib; path = sender/Breakpad.xib; sourceTree = ""; }; + 33880C7F0F9E097100817F82 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = sender/English.lproj/InfoPlist.strings; sourceTree = ""; }; + 4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = crash_report_sender.icns; path = sender/crash_report_sender.icns; sourceTree = ""; }; + 421BC5AD21110C0300B8042E /* convert_old_arm64_context.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = convert_old_arm64_context.cc; path = ../../processor/convert_old_arm64_context.cc; sourceTree = ""; }; + 421BC5BB21110C0300B8042E /* convert_old_arm64_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = convert_old_arm64_context.h; path = ../../processor/convert_old_arm64_context.h; sourceTree = ""; }; + 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bootstrap_compat.cc; path = ../../common/mac/bootstrap_compat.cc; sourceTree = SOURCE_ROOT; }; + 4D61A25E14F43CFC002D5862 /* bootstrap_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bootstrap_compat.h; path = ../../common/mac/bootstrap_compat.h; sourceTree = SOURCE_ROOT; }; + 4D72CA0D13DFAD5C006CABE3 /* md5.cc */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = md5.cc; path = ../../common/md5.cc; sourceTree = SOURCE_ROOT; }; + 4DBE4769134A4F080072546A /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; }; + 8B31007011F0CD3C00FCF3E4 /* GTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMDefines.h; path = ../../common/mac/GTMDefines.h; sourceTree = SOURCE_ROOT; }; + 8B3101E911F0CDE300FCF3E4 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + 8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadDebug.xcconfig; path = ../../common/mac/BreakpadDebug.xcconfig; sourceTree = SOURCE_ROOT; }; + 8B31027811F0D3AF00FCF3E4 /* BreakpadRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadRelease.xcconfig; path = ../../common/mac/BreakpadRelease.xcconfig; sourceTree = SOURCE_ROOT; }; + 8B31FFF611F0C90500FCF3E4 /* Breakpad.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Breakpad.xcconfig; path = ../../common/mac/Breakpad.xcconfig; sourceTree = SOURCE_ROOT; }; + 8DC2EF5B0486A6940098B216 /* Breakpad.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Breakpad.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D23F4B2C12A7E13200686C8D /* minidump_generator_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_generator_test.cc; path = tests/minidump_generator_test.cc; sourceTree = ""; }; + D23F4B9A12A8688800686C8D /* minidump_generator_test_helper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_generator_test_helper.cc; path = tests/minidump_generator_test_helper.cc; sourceTree = ""; }; + D23F4BAB12A868A500686C8D /* minidump_generator_test_helper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = minidump_generator_test_helper; sourceTree = BUILT_PRODUCTS_DIR; }; + D244534F12426E98009BBCE0 /* basic_code_modules.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = basic_code_modules.cc; path = ../../processor/basic_code_modules.cc; sourceTree = SOURCE_ROOT; }; + D244535112426EBB009BBCE0 /* logging.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = logging.cc; path = ../../processor/logging.cc; sourceTree = SOURCE_ROOT; }; + D244535212426EBB009BBCE0 /* minidump.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump.cc; path = ../../processor/minidump.cc; sourceTree = SOURCE_ROOT; }; + D244535312426EBB009BBCE0 /* pathname_stripper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pathname_stripper.cc; path = ../../processor/pathname_stripper.cc; sourceTree = SOURCE_ROOT; }; + D244540A12439BA0009BBCE0 /* memory_allocator_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = memory_allocator_unittest.cc; path = ../../common/memory_allocator_unittest.cc; sourceTree = SOURCE_ROOT; }; + D2F9A3D41212F87C002747C1 /* exception_handler_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exception_handler_test.cc; path = tests/exception_handler_test.cc; sourceTree = ""; }; + D2F9A41512131EF0002747C1 /* libgtest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest.a; sourceTree = BUILT_PRODUCTS_DIR; }; + D2F9A43C12131F55002747C1 /* gmock-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gmock-all.cc"; path = "../../testing/googlemock/src/gmock-all.cc"; sourceTree = SOURCE_ROOT; }; + D2F9A43E12131F65002747C1 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gtest_main.cc; path = ../../testing/googletest/src/gtest_main.cc; sourceTree = ""; }; + D2F9A43F12131F65002747C1 /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gtest-all.cc"; path = "../../testing/googletest/src/gtest-all.cc"; sourceTree = ""; }; + D2F9A4C4121336C7002747C1 /* client_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = client_info.h; path = crash_generation/client_info.h; sourceTree = ""; }; + D2F9A4C5121336C7002747C1 /* crash_generation_client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_generation_client.h; path = crash_generation/crash_generation_client.h; sourceTree = ""; }; + D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crash_generation_client.cc; path = crash_generation/crash_generation_client.cc; sourceTree = ""; }; + D2F9A4C7121336C7002747C1 /* crash_generation_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_generation_server.h; path = crash_generation/crash_generation_server.h; sourceTree = ""; }; + D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crash_generation_server.cc; path = crash_generation/crash_generation_server.cc; sourceTree = ""; }; + D2F9A4CE121336F7002747C1 /* crash_generation_server_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crash_generation_server_test.cc; path = tests/crash_generation_server_test.cc; sourceTree = ""; }; + D2F9A546121383A1002747C1 /* crash_generation_server_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = crash_generation_server_test; sourceTree = BUILT_PRODUCTS_DIR; }; + DE43467411C72855004F095F /* da */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = da; path = sender/da.lproj/Localizable.strings; sourceTree = ""; }; + DE43467511C72857004F095F /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = de; path = sender/de.lproj/Localizable.strings; sourceTree = ""; }; + DE43467611C7285B004F095F /* es */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = es; path = sender/es.lproj/Localizable.strings; sourceTree = ""; }; + DE43467711C72862004F095F /* fr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = fr; path = sender/fr.lproj/Localizable.strings; sourceTree = ""; }; + DE43467811C72869004F095F /* it */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = it; path = sender/it.lproj/Localizable.strings; sourceTree = ""; }; + DE43467911C7286D004F095F /* nl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = nl; path = sender/nl.lproj/Localizable.strings; sourceTree = ""; }; + DE43467A11C72873004F095F /* no */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = no; path = sender/no.lproj/Localizable.strings; sourceTree = ""; }; + DE43467B11C72877004F095F /* sl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sl; path = sender/sl.lproj/Localizable.strings; sourceTree = ""; }; + DE43467C11C7287A004F095F /* sv */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sv; path = sender/sv.lproj/Localizable.strings; sourceTree = ""; }; + DE43467E11C728DC004F095F /* ja */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = ja; path = sender/ja.lproj/Localizable.strings; sourceTree = ""; }; + DE43467F11C728E1004F095F /* tr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = tr; path = sender/tr.lproj/Localizable.strings; sourceTree = ""; }; + DE43468611C72958004F095F /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = de; path = sender/de.lproj/InfoPlist.strings; sourceTree = ""; }; + DE43468711C7295D004F095F /* da */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = da; path = sender/da.lproj/InfoPlist.strings; sourceTree = ""; }; + DE43468811C7295F004F095F /* es */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = es; path = sender/es.lproj/InfoPlist.strings; sourceTree = ""; }; + DE43468911C72964004F095F /* fr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = fr; path = sender/fr.lproj/InfoPlist.strings; sourceTree = ""; }; + DE43468A11C72967004F095F /* it */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = it; path = sender/it.lproj/InfoPlist.strings; sourceTree = ""; }; + DE43468B11C7296B004F095F /* ja */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = ja; path = sender/ja.lproj/InfoPlist.strings; sourceTree = ""; }; + DE43468C11C7296D004F095F /* nl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = nl; path = sender/nl.lproj/InfoPlist.strings; sourceTree = ""; }; + DE43468D11C7296F004F095F /* no */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = no; path = sender/no.lproj/InfoPlist.strings; sourceTree = ""; }; + DE43468E11C72971004F095F /* sl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sl; path = sender/sl.lproj/InfoPlist.strings; sourceTree = ""; }; + DE43468F11C72973004F095F /* sv */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sv; path = sender/sv.lproj/InfoPlist.strings; sourceTree = ""; }; + DE43469011C72976004F095F /* tr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = tr; path = sender/tr.lproj/InfoPlist.strings; sourceTree = ""; }; + EB9CF89F24F01E1D00F9B6D1 /* encoding_util.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = encoding_util.m; path = ../../common/mac/encoding_util.m; sourceTree = ""; }; + EB9CF8AD24F01E1D00F9B6D1 /* minidump_upload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = minidump_upload.m; path = ../../common/mac/minidump_upload.m; sourceTree = ""; }; + EB9CF8AE24F01E1D00F9B6D1 /* encoding_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding_util.h; path = ../../common/mac/encoding_util.h; sourceTree = ""; }; + EB9CF8AF24F01E1D00F9B6D1 /* HTTPSimplePostRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTTPSimplePostRequest.h; path = ../../common/mac/HTTPSimplePostRequest.h; sourceTree = ""; }; + EB9CF8B024F01E1D00F9B6D1 /* HTTPRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTTPRequest.h; path = ../../common/mac/HTTPRequest.h; sourceTree = ""; }; + EB9CF8B124F01E1D00F9B6D1 /* HTTPPutRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTTPPutRequest.m; path = ../../common/mac/HTTPPutRequest.m; sourceTree = ""; }; + EB9CF8B224F01E1D00F9B6D1 /* HTTPRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTTPRequest.m; path = ../../common/mac/HTTPRequest.m; sourceTree = ""; }; + EB9CF8B324F01E1D00F9B6D1 /* SymbolCollectorClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SymbolCollectorClient.m; path = ../../common/mac/SymbolCollectorClient.m; sourceTree = ""; }; + EB9CF8B424F01E1D00F9B6D1 /* HTTPGetRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTTPGetRequest.h; path = ../../common/mac/HTTPGetRequest.h; sourceTree = ""; }; + EB9CF8B524F01E1D00F9B6D1 /* HTTPGetRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTTPGetRequest.m; path = ../../common/mac/HTTPGetRequest.m; sourceTree = ""; }; + EB9CF8B624F01E1D00F9B6D1 /* HTTPSimplePostRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTTPSimplePostRequest.m; path = ../../common/mac/HTTPSimplePostRequest.m; sourceTree = ""; }; + EB9CF8B724F01E1D00F9B6D1 /* SymbolCollectorClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SymbolCollectorClient.h; path = ../../common/mac/SymbolCollectorClient.h; sourceTree = ""; }; + EB9CF8B824F01E1D00F9B6D1 /* HTTPPutRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTTPPutRequest.h; path = ../../common/mac/HTTPPutRequest.h; sourceTree = ""; }; + F4DAB1DB19F1027100A5A838 /* launch_reporter.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = launch_reporter.cc; path = ../../common/mac/launch_reporter.cc; sourceTree = SOURCE_ROOT; }; + F4DAB1DC19F1027100A5A838 /* launch_reporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = launch_reporter.h; path = ../../common/mac/launch_reporter.h; sourceTree = SOURCE_ROOT; }; + F91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = BreakpadFramework_Test.mm; path = tests/BreakpadFramework_Test.mm; sourceTree = ""; }; + F9286B380F7EB25800A4DCC8 /* Inspector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Inspector.h; path = crash_generation/Inspector.h; sourceTree = ""; }; + F9286B390F7EB25800A4DCC8 /* InspectorMain.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = InspectorMain.mm; path = crash_generation/InspectorMain.mm; sourceTree = ""; }; + F92C53540ECCE349009BE4BA /* Inspector */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Inspector; sourceTree = BUILT_PRODUCTS_DIR; }; + F92C53670ECCE3FD009BE4BA /* breakpad_exc_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = breakpad_exc_server.c; path = handler/breakpad_exc_server.c; sourceTree = SOURCE_ROOT; }; + F92C53680ECCE3FD009BE4BA /* breakpad_exc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = breakpad_exc_server.h; path = handler/breakpad_exc_server.h; sourceTree = SOURCE_ROOT; }; + F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = breakpad_nlist_64.cc; path = handler/breakpad_nlist_64.cc; sourceTree = SOURCE_ROOT; }; + F92C536A0ECCE3FD009BE4BA /* breakpad_nlist_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = breakpad_nlist_64.h; path = handler/breakpad_nlist_64.h; sourceTree = SOURCE_ROOT; }; + F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dynamic_images.cc; path = handler/dynamic_images.cc; sourceTree = SOURCE_ROOT; }; + F92C536C0ECCE3FD009BE4BA /* dynamic_images.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dynamic_images.h; path = handler/dynamic_images.h; sourceTree = SOURCE_ROOT; }; + F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exception_handler.cc; path = handler/exception_handler.cc; sourceTree = SOURCE_ROOT; }; + F92C536E0ECCE3FD009BE4BA /* exception_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = exception_handler.h; path = handler/exception_handler.h; sourceTree = SOURCE_ROOT; }; + F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_generator.cc; path = handler/minidump_generator.cc; sourceTree = SOURCE_ROOT; }; + F92C53700ECCE3FD009BE4BA /* minidump_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = minidump_generator.h; path = handler/minidump_generator.h; sourceTree = SOURCE_ROOT; }; + F92C53720ECCE3FD009BE4BA /* protected_memory_allocator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = protected_memory_allocator.cc; path = handler/protected_memory_allocator.cc; sourceTree = SOURCE_ROOT; }; + F92C53730ECCE3FD009BE4BA /* protected_memory_allocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = protected_memory_allocator.h; path = handler/protected_memory_allocator.h; sourceTree = SOURCE_ROOT; }; + F92C53740ECCE635009BE4BA /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = file_id.cc; path = ../../common/mac/file_id.cc; sourceTree = SOURCE_ROOT; }; + F92C53750ECCE635009BE4BA /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = file_id.h; path = ../../common/mac/file_id.h; sourceTree = SOURCE_ROOT; }; + F92C53760ECCE635009BE4BA /* HTTPMultipartUpload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTTPMultipartUpload.h; path = ../../common/mac/HTTPMultipartUpload.h; sourceTree = SOURCE_ROOT; }; + F92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTTPMultipartUpload.m; path = ../../common/mac/HTTPMultipartUpload.m; sourceTree = SOURCE_ROOT; }; + F92C53780ECCE635009BE4BA /* MachIPC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MachIPC.h; path = ../../common/mac/MachIPC.h; sourceTree = SOURCE_ROOT; }; + F92C53790ECCE635009BE4BA /* MachIPC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MachIPC.mm; path = ../../common/mac/MachIPC.mm; sourceTree = SOURCE_ROOT; }; + F92C537A0ECCE635009BE4BA /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_id.cc; path = ../../common/mac/macho_id.cc; sourceTree = SOURCE_ROOT; }; + F92C537B0ECCE635009BE4BA /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../common/mac/macho_id.h; sourceTree = SOURCE_ROOT; }; + F92C537C0ECCE635009BE4BA /* macho_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_utilities.cc; path = ../../common/mac/macho_utilities.cc; sourceTree = SOURCE_ROOT; }; + F92C537D0ECCE635009BE4BA /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_utilities.h; path = ../../common/mac/macho_utilities.h; sourceTree = SOURCE_ROOT; }; + F92C537E0ECCE635009BE4BA /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; }; + F92C537F0ECCE635009BE4BA /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; }; + F92C53820ECCE635009BE4BA /* string_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = string_utilities.cc; path = ../../common/mac/string_utilities.cc; sourceTree = SOURCE_ROOT; }; + F92C53830ECCE635009BE4BA /* string_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = string_utilities.h; path = ../../common/mac/string_utilities.h; sourceTree = SOURCE_ROOT; }; + F92C53850ECCE6AD009BE4BA /* string_conversion.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = string_conversion.cc; path = ../../common/string_conversion.cc; sourceTree = SOURCE_ROOT; }; + F92C53860ECCE6AD009BE4BA /* string_conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = string_conversion.h; path = ../../common/string_conversion.h; sourceTree = SOURCE_ROOT; }; + F92C53870ECCE6C0009BE4BA /* convert_UTF.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = convert_UTF.cc; path = ../../common/convert_UTF.cc; sourceTree = SOURCE_ROOT; }; + F92C53880ECCE6C0009BE4BA /* convert_UTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = convert_UTF.h; path = ../../common/convert_UTF.h; sourceTree = SOURCE_ROOT; }; + F92C538E0ECCE70A009BE4BA /* minidump_file_writer-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "minidump_file_writer-inl.h"; path = "../minidump_file_writer-inl.h"; sourceTree = SOURCE_ROOT; }; + F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer.cc; path = ../minidump_file_writer.cc; sourceTree = SOURCE_ROOT; }; + F92C53900ECCE70A009BE4BA /* minidump_file_writer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = minidump_file_writer.h; path = ../minidump_file_writer.h; sourceTree = SOURCE_ROOT; }; + F92C53B70ECCE7B3009BE4BA /* Inspector.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Inspector.mm; path = crash_generation/Inspector.mm; sourceTree = SOURCE_ROOT; }; + F92C554A0ECCF530009BE4BA /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; + F92C55CE0ECD0064009BE4BA /* Breakpad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Breakpad.h; path = Framework/Breakpad.h; sourceTree = ""; }; + F92C55CF0ECD0064009BE4BA /* Breakpad.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Breakpad.mm; path = Framework/Breakpad.mm; sourceTree = ""; }; + F92C56310ECD0DF1009BE4BA /* OnDemandServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OnDemandServer.h; path = Framework/OnDemandServer.h; sourceTree = ""; }; + F92C56320ECD0DF1009BE4BA /* OnDemandServer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = OnDemandServer.mm; path = Framework/OnDemandServer.mm; sourceTree = ""; }; + F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = breakpadUtilities.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = crash_report_sender.app; sourceTree = BUILT_PRODUCTS_DIR; }; + F92C56A20ECE04A7009BE4BA /* crash_report_sender-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "crash_report_sender-Info.plist"; path = "sender/crash_report_sender-Info.plist"; sourceTree = ""; }; + F92C56A70ECE04C5009BE4BA /* crash_report_sender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_report_sender.h; path = sender/crash_report_sender.h; sourceTree = ""; }; + F92C56A80ECE04C5009BE4BA /* crash_report_sender.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = crash_report_sender.m; path = sender/crash_report_sender.m; sourceTree = ""; }; + F93803BE0F80820F004D428B /* generator_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = generator_test; sourceTree = BUILT_PRODUCTS_DIR; }; + F93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = minidump_file_writer_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + F93DE2D70F82A70E00608B94 /* minidump_file_writer_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer_unittest.cc; path = ../minidump_file_writer_unittest.cc; sourceTree = SOURCE_ROOT; }; + F93DE32C0F82C55600608B94 /* handler_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = handler_test; sourceTree = BUILT_PRODUCTS_DIR; }; + F945849D0F280E3C009A47BF /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = sender/English.lproj/Localizable.strings; sourceTree = ""; }; + F945859D0F78241E009A47BF /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Framework/Info.plist; sourceTree = ""; }; + F95BB87C101F949F00AA053B /* crash_report.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = crash_report.xcodeproj; path = ../../tools/mac/crash_report/crash_report.xcodeproj; sourceTree = SOURCE_ROOT; }; + F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = dump_syms.xcodeproj; path = ../../tools/mac/dump_syms/dump_syms.xcodeproj; sourceTree = SOURCE_ROOT; }; + F95BB894101F94C000AA053B /* symupload.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = symupload.xcodeproj; path = ../../tools/mac/symupload/symupload.xcodeproj; sourceTree = SOURCE_ROOT; }; + F9B6309F100FF96B00D0F4AC /* goArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = goArrow.png; path = sender/goArrow.png; sourceTree = ""; }; + F9C44DA50EF060A8003AEBAA /* BreakpadTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BreakpadTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; + F9C44DAC0EF07288003AEBAA /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Controller.m; path = testapp/Controller.m; sourceTree = ""; }; + F9C44DAD0EF07288003AEBAA /* crashduringload */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = crashduringload; path = testapp/crashduringload; sourceTree = ""; }; + F9C44DAE0EF07288003AEBAA /* crashInMain */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = crashInMain; path = testapp/crashInMain; sourceTree = ""; }; + F9C44DAF0EF07288003AEBAA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = testapp/Info.plist; sourceTree = ""; }; + F9C44DB00EF07288003AEBAA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = testapp/main.m; sourceTree = ""; }; + F9C44DB10EF07288003AEBAA /* TestClass.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = TestClass.mm; path = testapp/TestClass.mm; sourceTree = ""; }; + F9C44DB90EF072A0003AEBAA /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = testapp/English.lproj/InfoPlist.strings; sourceTree = ""; }; + F9C44DBB0EF072A0003AEBAA /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = testapp/English.lproj/MainMenu.xib; sourceTree = ""; }; + F9C44DBF0EF0778F003AEBAA /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Controller.h; path = testapp/Controller.h; sourceTree = ""; }; + F9C44DC00EF0778F003AEBAA /* TestClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestClass.h; path = testapp/TestClass.h; sourceTree = ""; }; + F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + F9C44EE70EF0A3C1003AEBAA /* GTMLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMLogger.h; path = ../../common/mac/GTMLogger.h; sourceTree = SOURCE_ROOT; }; + F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMLogger.m; path = ../../common/mac/GTMLogger.m; sourceTree = SOURCE_ROOT; }; + F9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + F9C77DDB0F7DD5CF0045F7DB /* UnitTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "UnitTests-Info.plist"; sourceTree = ""; }; + F9C77E110F7DDF810045F7DB /* GTMSenTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMSenTestCase.h; path = ../../common/mac/testing/GTMSenTestCase.h; sourceTree = SOURCE_ROOT; }; + F9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMSenTestCase.m; path = ../../common/mac/testing/GTMSenTestCase.m; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DC2EF560486A6940098B216 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F92C565C0ECD1158009BE4BA /* breakpadUtilities.dylib in Frameworks */, + 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D23F4BA912A868A500686C8D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D246418412BAA4BA005170D0 /* Foundation.framework in Frameworks */, + 4DBE49A6134A4F200072546A /* CoreServices.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2F9A41312131EF0002747C1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2F9A53E121383A1002747C1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D2F9A53F121383A1002747C1 /* Foundation.framework in Frameworks */, + D2F9A541121383A1002747C1 /* libgtest.a in Frameworks */, + 4DBE49A9134A4F460072546A /* CoreServices.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F92C53520ECCE349009BE4BA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F92C564C0ECD10DD009BE4BA /* breakpadUtilities.dylib in Frameworks */, + F92C554C0ECCF534009BE4BA /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F92C563A0ECD10B3009BE4BA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8B31FC8211EFD2B800FCF3E4 /* Foundation.framework in Frameworks */, + F92C56570ECD113E009BE4BA /* Carbon.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F92C569E0ECE04A7009BE4BA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F9C44EE50EF0A006003AEBAA /* SystemConfiguration.framework in Frameworks */, + 8B3101C611F0CD9F00FCF3E4 /* AppKit.framework in Frameworks */, + 8B3101C711F0CD9F00FCF3E4 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F93803BC0F80820F004D428B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8B31029411F0D54300FCF3E4 /* Foundation.framework in Frameworks */, + D23F4B3312A7E17700686C8D /* libgtest.a in Frameworks */, + 4DBE49A7134A4F280072546A /* CoreServices.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F93DE2CF0F82A67300608B94 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F93DE32A0F82C55600608B94 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8B3102E611F0D74C00FCF3E4 /* Foundation.framework in Frameworks */, + D2F9A44412131F84002747C1 /* libgtest.a in Frameworks */, + 4DBE49A8134A4F380072546A /* CoreServices.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9C44DA30EF060A8003AEBAA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F9C44E000EF077CD003AEBAA /* Breakpad.framework in Frameworks */, + 8B3101CA11F0CDB000FCF3E4 /* AppKit.framework in Frameworks */, + 8B3101CB11F0CDB000FCF3E4 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9C77DD70F7DD5CF0045F7DB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F91AF6210FD60784009D8BE2 /* Breakpad.framework in Frameworks */, + 8B3101EA11F0CDE300FCF3E4 /* SenTestingKit.framework in Frameworks */, + 8B3102EB11F0D78000FCF3E4 /* Foundation.framework in Frameworks */, + D24BBBFD121050F000F3D417 /* breakpadUtilities.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DFFF38A50411DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 8DC2EF5B0486A6940098B216 /* Breakpad.framework */, + F92C53540ECCE349009BE4BA /* Inspector */, + F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */, + F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */, + F9C44DA50EF060A8003AEBAA /* BreakpadTest.app */, + F9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */, + F93803BE0F80820F004D428B /* generator_test */, + F93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */, + F93DE32C0F82C55600608B94 /* handler_test */, + D2F9A41512131EF0002747C1 /* libgtest.a */, + D2F9A546121383A1002747C1 /* crash_generation_server_test */, + D23F4BAB12A868A500686C8D /* minidump_generator_test_helper */, + ); + name = Products; + sourceTree = ""; + }; + 0867D691FE84028FC02AAC07 /* Breakpad */ = { + isa = PBXGroup; + children = ( + D2F9A43812131F3B002747C1 /* gtest */, + 8B31FFF611F0C90500FCF3E4 /* Breakpad.xcconfig */, + 8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */, + 8B31027811F0D3AF00FCF3E4 /* BreakpadRelease.xcconfig */, + F95BB8A3101F94C300AA053B /* Tools */, + 32DBCF5E0370ADEE00C91783 /* Breakpad_Prefix.pch */, + F92C538D0ECCE6F2009BE4BA /* client */, + F92C53600ECCE3D6009BE4BA /* common */, + D244536912426EE7009BBCE0 /* processor */, + 0867D69AFE84028FC02AAC07 /* Frameworks */, + 034768DFFF38A50411DB9C8B /* Products */, + F9C77DDB0F7DD5CF0045F7DB /* UnitTests-Info.plist */, + ); + name = Breakpad; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8B3101E911F0CDE300FCF3E4 /* SenTestingKit.framework */, + F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */, + F92C554A0ECCF530009BE4BA /* Carbon.framework */, + 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */, + 0867D6A5FE840307C02AAC07 /* AppKit.framework */, + 0867D69BFE84028FC02AAC07 /* Foundation.framework */, + 4DBE4769134A4F080072546A /* CoreServices.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 16C7C915147D45AE00776EAD /* apple */ = { + isa = PBXGroup; + children = ( + 16C7C916147D45AE00776EAD /* Framework */, + ); + name = apple; + path = ../apple; + sourceTree = SOURCE_ROOT; + }; + 16C7C916147D45AE00776EAD /* Framework */ = { + isa = PBXGroup; + children = ( + 16C7C917147D45AE00776EAD /* BreakpadDefines.h */, + ); + path = Framework; + sourceTree = ""; + }; + D244536912426EE7009BBCE0 /* processor */ = { + isa = PBXGroup; + children = ( + 421BC5AD21110C0300B8042E /* convert_old_arm64_context.cc */, + 421BC5BB21110C0300B8042E /* convert_old_arm64_context.h */, + D244535112426EBB009BBCE0 /* logging.cc */, + D244535212426EBB009BBCE0 /* minidump.cc */, + D244535312426EBB009BBCE0 /* pathname_stripper.cc */, + D244534F12426E98009BBCE0 /* basic_code_modules.cc */, + ); + name = processor; + sourceTree = ""; + }; + D2F9A43812131F3B002747C1 /* gtest */ = { + isa = PBXGroup; + children = ( + D2F9A43E12131F65002747C1 /* gtest_main.cc */, + D2F9A43F12131F65002747C1 /* gtest-all.cc */, + D2F9A43C12131F55002747C1 /* gmock-all.cc */, + ); + name = gtest; + sourceTree = ""; + }; + F92C53590ECCE3BB009BE4BA /* handler */ = { + isa = PBXGroup; + children = ( + F92C53670ECCE3FD009BE4BA /* breakpad_exc_server.c */, + F92C53680ECCE3FD009BE4BA /* breakpad_exc_server.h */, + F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */, + F92C536A0ECCE3FD009BE4BA /* breakpad_nlist_64.h */, + F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */, + F92C536C0ECCE3FD009BE4BA /* dynamic_images.h */, + F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */, + F92C536E0ECCE3FD009BE4BA /* exception_handler.h */, + F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */, + F92C53700ECCE3FD009BE4BA /* minidump_generator.h */, + F92C53720ECCE3FD009BE4BA /* protected_memory_allocator.cc */, + F92C53730ECCE3FD009BE4BA /* protected_memory_allocator.h */, + ); + name = handler; + sourceTree = ""; + }; + F92C53600ECCE3D6009BE4BA /* common */ = { + isa = PBXGroup; + children = ( + D244540A12439BA0009BBCE0 /* memory_allocator_unittest.cc */, + F92C53870ECCE6C0009BE4BA /* convert_UTF.cc */, + F92C53880ECCE6C0009BE4BA /* convert_UTF.h */, + 4D72CA0D13DFAD5C006CABE3 /* md5.cc */, + 1EEEB6211720829E00F7E689 /* simple_string_dictionary.cc */, + 1EEEB6221720829E00F7E689 /* simple_string_dictionary.h */, + F92C53850ECCE6AD009BE4BA /* string_conversion.cc */, + F92C53860ECCE6AD009BE4BA /* string_conversion.h */, + F92C53840ECCE68D009BE4BA /* mac */, + ); + name = common; + sourceTree = ""; + }; + F92C53840ECCE68D009BE4BA /* mac */ = { + isa = PBXGroup; + children = ( + EB9CF8AE24F01E1D00F9B6D1 /* encoding_util.h */, + EB9CF89F24F01E1D00F9B6D1 /* encoding_util.m */, + EB9CF8B424F01E1D00F9B6D1 /* HTTPGetRequest.h */, + EB9CF8B524F01E1D00F9B6D1 /* HTTPGetRequest.m */, + EB9CF8B824F01E1D00F9B6D1 /* HTTPPutRequest.h */, + EB9CF8B124F01E1D00F9B6D1 /* HTTPPutRequest.m */, + EB9CF8B024F01E1D00F9B6D1 /* HTTPRequest.h */, + EB9CF8B224F01E1D00F9B6D1 /* HTTPRequest.m */, + EB9CF8AF24F01E1D00F9B6D1 /* HTTPSimplePostRequest.h */, + EB9CF8B624F01E1D00F9B6D1 /* HTTPSimplePostRequest.m */, + EB9CF8AD24F01E1D00F9B6D1 /* minidump_upload.m */, + EB9CF8B724F01E1D00F9B6D1 /* SymbolCollectorClient.h */, + EB9CF8B324F01E1D00F9B6D1 /* SymbolCollectorClient.m */, + 162F64F0161C577500CD68D5 /* arch_utilities.cc */, + 162F64F1161C577500CD68D5 /* arch_utilities.h */, + 8B31007011F0CD3C00FCF3E4 /* GTMDefines.h */, + F9C77E0F0F7DDF650045F7DB /* testing */, + F9C44EE70EF0A3C1003AEBAA /* GTMLogger.h */, + F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */, + F92C53740ECCE635009BE4BA /* file_id.cc */, + F92C53750ECCE635009BE4BA /* file_id.h */, + F92C53760ECCE635009BE4BA /* HTTPMultipartUpload.h */, + F92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */, + F4DAB1DB19F1027100A5A838 /* launch_reporter.cc */, + F4DAB1DC19F1027100A5A838 /* launch_reporter.h */, + F92C53780ECCE635009BE4BA /* MachIPC.h */, + F92C53790ECCE635009BE4BA /* MachIPC.mm */, + 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */, + 4D61A25E14F43CFC002D5862 /* bootstrap_compat.h */, + F92C537A0ECCE635009BE4BA /* macho_id.cc */, + F92C537B0ECCE635009BE4BA /* macho_id.h */, + F92C537C0ECCE635009BE4BA /* macho_utilities.cc */, + F92C537D0ECCE635009BE4BA /* macho_utilities.h */, + F92C537E0ECCE635009BE4BA /* macho_walker.cc */, + F92C537F0ECCE635009BE4BA /* macho_walker.h */, + F92C53820ECCE635009BE4BA /* string_utilities.cc */, + F92C53830ECCE635009BE4BA /* string_utilities.h */, + ); + name = mac; + sourceTree = ""; + }; + F92C538D0ECCE6F2009BE4BA /* client */ = { + isa = PBXGroup; + children = ( + 16C7C915147D45AE00776EAD /* apple */, + F92C53990ECCE78E009BE4BA /* mac */, + F92C538E0ECCE70A009BE4BA /* minidump_file_writer-inl.h */, + F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */, + F92C53900ECCE70A009BE4BA /* minidump_file_writer.h */, + F93DE2D70F82A70E00608B94 /* minidump_file_writer_unittest.cc */, + ); + name = client; + sourceTree = ""; + }; + F92C53990ECCE78E009BE4BA /* mac */ = { + isa = PBXGroup; + children = ( + F9C77DDF0F7DD7CF0045F7DB /* tests */, + F9C44DAB0EF0726F003AEBAA /* testapp */, + F92C56A60ECE04B6009BE4BA /* sender */, + F92C55CD0ECD0053009BE4BA /* Framework */, + F92C53B50ECCE799009BE4BA /* crash_generation */, + F92C53590ECCE3BB009BE4BA /* handler */, + ); + name = mac; + sourceTree = ""; + }; + F92C53B50ECCE799009BE4BA /* crash_generation */ = { + isa = PBXGroup; + children = ( + 163201D41443019E00C4DBF5 /* ConfigFile.h */, + 163201D51443019E00C4DBF5 /* ConfigFile.mm */, + D2F9A4C4121336C7002747C1 /* client_info.h */, + D2F9A4C5121336C7002747C1 /* crash_generation_client.h */, + D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */, + D2F9A4C7121336C7002747C1 /* crash_generation_server.h */, + D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */, + F9286B380F7EB25800A4DCC8 /* Inspector.h */, + F9286B390F7EB25800A4DCC8 /* InspectorMain.mm */, + F92C53B70ECCE7B3009BE4BA /* Inspector.mm */, + ); + name = crash_generation; + sourceTree = ""; + }; + F92C55CD0ECD0053009BE4BA /* Framework */ = { + isa = PBXGroup; + children = ( + F945859D0F78241E009A47BF /* Info.plist */, + F92C56310ECD0DF1009BE4BA /* OnDemandServer.h */, + F92C56320ECD0DF1009BE4BA /* OnDemandServer.mm */, + F92C55CE0ECD0064009BE4BA /* Breakpad.h */, + F92C55CF0ECD0064009BE4BA /* Breakpad.mm */, + ); + name = Framework; + sourceTree = ""; + }; + F92C56A60ECE04B6009BE4BA /* sender */ = { + isa = PBXGroup; + children = ( + 16E02DB4147410D4008C604D /* uploader.mm */, + 163202431443201300C4DBF5 /* uploader.h */, + F9B6309F100FF96B00D0F4AC /* goArrow.png */, + F92C56A70ECE04C5009BE4BA /* crash_report_sender.h */, + F92C56A80ECE04C5009BE4BA /* crash_report_sender.m */, + F945849C0F280E3C009A47BF /* Localizable.strings */, + 33880C7E0F9E097100817F82 /* InfoPlist.strings */, + 3329D4EC0FA16D820007BBC5 /* Breakpad.xib */, + 4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */, + F92C56A20ECE04A7009BE4BA /* crash_report_sender-Info.plist */, + ); + name = sender; + sourceTree = ""; + }; + F95BB87D101F949F00AA053B /* Products */ = { + isa = PBXGroup; + children = ( + F95BB885101F949F00AA053B /* crash_report */, + ); + name = Products; + sourceTree = ""; + }; + F95BB88A101F94AC00AA053B /* Products */ = { + isa = PBXGroup; + children = ( + F95BB892101F94AC00AA053B /* dump_syms */, + 8B31F7A111EF9A8700FCF3E4 /* macho_dump */, + 8B31F7A311EF9A8700FCF3E4 /* libgtestmockall.a */, + 8B31F7A511EF9A8700FCF3E4 /* byte_cursor_unittest */, + 8B31F7A711EF9A8700FCF3E4 /* macho_reader_unittest */, + 8B31F7A911EF9A8700FCF3E4 /* stabs_reader_unittest */, + 8B31F7AB11EF9A8700FCF3E4 /* bytereader_unittest */, + 8B31F7AD11EF9A8700FCF3E4 /* dwarf2reader_cfi_unittest */, + 8B31F7AF11EF9A8700FCF3E4 /* dwarf2diehandler_unittest */, + 8B31F7B111EF9A8700FCF3E4 /* dwarf_cu_to_module_unittest */, + 8B31F7B311EF9A8700FCF3E4 /* dwarf_line_to_module_unittest */, + 8B31F7B511EF9A8700FCF3E4 /* dwarf_cfi_to_module_unittest */, + 8B31F7B711EF9A8700FCF3E4 /* stabs_to_module_unittest */, + 8B31F7B911EF9A8700FCF3E4 /* module_unittest */, + 8B31F7BB11EF9A8700FCF3E4 /* test_assembler_unittest */, + ); + name = Products; + sourceTree = ""; + }; + F95BB895101F94C000AA053B /* Products */ = { + isa = PBXGroup; + children = ( + F95BB89F101F94C000AA053B /* symupload */, + F95BB8A1101F94C000AA053B /* minidump_upload */, + ); + name = Products; + sourceTree = ""; + }; + F95BB8A3101F94C300AA053B /* Tools */ = { + isa = PBXGroup; + children = ( + F95BB894101F94C000AA053B /* symupload.xcodeproj */, + F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */, + F95BB87C101F949F00AA053B /* crash_report.xcodeproj */, + ); + name = Tools; + sourceTree = ""; + }; + F9C44DAB0EF0726F003AEBAA /* testapp */ = { + isa = PBXGroup; + children = ( + F9C44DBF0EF0778F003AEBAA /* Controller.h */, + F9C44DC00EF0778F003AEBAA /* TestClass.h */, + F9C44DB80EF072A0003AEBAA /* InfoPlist.strings */, + F9C44DBA0EF072A0003AEBAA /* MainMenu.xib */, + F9C44DAC0EF07288003AEBAA /* Controller.m */, + F9C44DAD0EF07288003AEBAA /* crashduringload */, + F9C44DAE0EF07288003AEBAA /* crashInMain */, + F9C44DAF0EF07288003AEBAA /* Info.plist */, + F9C44DB00EF07288003AEBAA /* main.m */, + F9C44DB10EF07288003AEBAA /* TestClass.mm */, + ); + name = testapp; + sourceTree = ""; + }; + F9C77DDF0F7DD7CF0045F7DB /* tests */ = { + isa = PBXGroup; + children = ( + 1EEEB6251720830600F7E689 /* simple_string_dictionary_unittest.cc */, + D23F4B9A12A8688800686C8D /* minidump_generator_test_helper.cc */, + D23F4B2C12A7E13200686C8D /* minidump_generator_test.cc */, + D2F9A4CE121336F7002747C1 /* crash_generation_server_test.cc */, + D2F9A3D41212F87C002747C1 /* exception_handler_test.cc */, + F91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */, + ); + name = tests; + sourceTree = ""; + }; + F9C77E0F0F7DDF650045F7DB /* testing */ = { + isa = PBXGroup; + children = ( + F9C77E110F7DDF810045F7DB /* GTMSenTestCase.h */, + F9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */, + ); + name = testing; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8DC2EF500486A6940098B216 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F92C55D00ECD0064009BE4BA /* Breakpad.h in Headers */, + EB9CF8BC24F01E1D00F9B6D1 /* HTTPSimplePostRequest.h in Headers */, + EB9CF8BB24F01E1D00F9B6D1 /* encoding_util.h in Headers */, + F92C56330ECD0DF1009BE4BA /* OnDemandServer.h in Headers */, + EB9CF8BD24F01E1D00F9B6D1 /* HTTPRequest.h in Headers */, + D2F9A4C9121336C7002747C1 /* client_info.h in Headers */, + EB9CF8C524F01E1D00F9B6D1 /* HTTPPutRequest.h in Headers */, + D2F9A4CA121336C7002747C1 /* crash_generation_client.h in Headers */, + D2F9A4CC121336C7002747C1 /* crash_generation_server.h in Headers */, + 163201D61443019E00C4DBF5 /* ConfigFile.h in Headers */, + EB9CF8C424F01E1D00F9B6D1 /* SymbolCollectorClient.h in Headers */, + 16C7C918147D45AE00776EAD /* BreakpadDefines.h in Headers */, + 421BC5BD21110C0300B8042E /* convert_old_arm64_context.h in Headers */, + EB9CF8C124F01E1D00F9B6D1 /* HTTPGetRequest.h in Headers */, + 162F64F3161C577500CD68D5 /* arch_utilities.h in Headers */, + F4DAB1DE19F1027100A5A838 /* launch_reporter.h in Headers */, + 1EEEB6241720829E00F7E689 /* simple_string_dictionary.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2F9A41112131EF0002747C1 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F92C56380ECD10B3009BE4BA /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 8DC2EF4F0486A6940098B216 /* Breakpad */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Breakpad" */; + buildPhases = ( + F97A0E850ED4EC15008784D3 /* Change install name of breakpadUtilities */, + 8DC2EF500486A6940098B216 /* Headers */, + 8DC2EF520486A6940098B216 /* Resources */, + 8DC2EF540486A6940098B216 /* Sources */, + 8DC2EF560486A6940098B216 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + F92C56860ECD15EF009BE4BA /* PBXTargetDependency */, + F92C56880ECD15F1009BE4BA /* PBXTargetDependency */, + F9C44E970EF09F4B003AEBAA /* PBXTargetDependency */, + ); + name = Breakpad; + productInstallPath = "$(HOME)/Library/Frameworks"; + productName = Breakpad; + productReference = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; + productType = "com.apple.product-type.framework"; + }; + D23F4BAA12A868A500686C8D /* minidump_generator_test_helper */ = { + isa = PBXNativeTarget; + buildConfigurationList = D23F4BB012A868C400686C8D /* Build configuration list for PBXNativeTarget "minidump_generator_test_helper" */; + buildPhases = ( + D23F4BA812A868A500686C8D /* Sources */, + D23F4BA912A868A500686C8D /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = minidump_generator_test_helper; + productName = minidump_generator_test_helper; + productReference = D23F4BAB12A868A500686C8D /* minidump_generator_test_helper */; + productType = "com.apple.product-type.tool"; + }; + D2F9A41412131EF0002747C1 /* gtest */ = { + isa = PBXNativeTarget; + buildConfigurationList = D2F9A42D12131F0E002747C1 /* Build configuration list for PBXNativeTarget "gtest" */; + buildPhases = ( + D2F9A41112131EF0002747C1 /* Headers */, + D2F9A41212131EF0002747C1 /* Sources */, + D2F9A41312131EF0002747C1 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = gtest; + productName = gtest; + productReference = D2F9A41512131EF0002747C1 /* libgtest.a */; + productType = "com.apple.product-type.library.static"; + }; + D2F9A52A121383A1002747C1 /* crash_generation_server_test */ = { + isa = PBXNativeTarget; + buildConfigurationList = D2F9A542121383A1002747C1 /* Build configuration list for PBXNativeTarget "crash_generation_server_test" */; + buildPhases = ( + D2F9A52D121383A1002747C1 /* Sources */, + D2F9A53E121383A1002747C1 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + D2F9A52B121383A1002747C1 /* PBXTargetDependency */, + ); + name = crash_generation_server_test; + productName = handler_test; + productReference = D2F9A546121383A1002747C1 /* crash_generation_server_test */; + productType = "com.apple.product-type.tool"; + }; + F92C53530ECCE349009BE4BA /* Inspector */ = { + isa = PBXNativeTarget; + buildConfigurationList = F92C53580ECCE36D009BE4BA /* Build configuration list for PBXNativeTarget "Inspector" */; + buildPhases = ( + F94584840F27FB40009A47BF /* Change install name of breakpadUtilities */, + F92C53510ECCE349009BE4BA /* Sources */, + F92C53520ECCE349009BE4BA /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + F92C564E0ECD10E5009BE4BA /* PBXTargetDependency */, + ); + name = Inspector; + productName = Inspector; + productReference = F92C53540ECCE349009BE4BA /* Inspector */; + productType = "com.apple.product-type.tool"; + }; + F92C563B0ECD10B3009BE4BA /* breakpadUtilities */ = { + isa = PBXNativeTarget; + buildConfigurationList = F92C56670ECD11A3009BE4BA /* Build configuration list for PBXNativeTarget "breakpadUtilities" */; + buildPhases = ( + F92C56380ECD10B3009BE4BA /* Headers */, + F92C56390ECD10B3009BE4BA /* Sources */, + F92C563A0ECD10B3009BE4BA /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = breakpadUtilities; + productName = breakpadUtilities; + productReference = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; + F92C569F0ECE04A7009BE4BA /* crash_report_sender */ = { + isa = PBXNativeTarget; + buildConfigurationList = F92C56A50ECE04A8009BE4BA /* Build configuration list for PBXNativeTarget "crash_report_sender" */; + buildPhases = ( + F92C569C0ECE04A7009BE4BA /* Resources */, + F92C569D0ECE04A7009BE4BA /* Sources */, + F92C569E0ECE04A7009BE4BA /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = crash_report_sender; + productName = crash_report_sender; + productReference = F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */; + productType = "com.apple.product-type.application"; + }; + F93803BD0F80820F004D428B /* generator_test */ = { + isa = PBXNativeTarget; + buildConfigurationList = F93803C40F80822E004D428B /* Build configuration list for PBXNativeTarget "generator_test" */; + buildPhases = ( + F93803BB0F80820F004D428B /* Sources */, + F93803BC0F80820F004D428B /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + D23F4B3012A7E16200686C8D /* PBXTargetDependency */, + D23F4BBA12A8694C00686C8D /* PBXTargetDependency */, + ); + name = generator_test; + productName = generator_test; + productReference = F93803BE0F80820F004D428B /* generator_test */; + productType = "com.apple.product-type.tool"; + }; + F93DE2D00F82A67300608B94 /* minidump_file_writer_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = F93DE2D60F82A67700608B94 /* Build configuration list for PBXNativeTarget "minidump_file_writer_unittest" */; + buildPhases = ( + F93DE2CE0F82A67300608B94 /* Sources */, + F93DE2CF0F82A67300608B94 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = minidump_file_writer_unittest; + productName = minidump_file_writer_unittest; + productReference = F93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */; + productType = "com.apple.product-type.tool"; + }; + F93DE32B0F82C55600608B94 /* handler_test */ = { + isa = PBXNativeTarget; + buildConfigurationList = F93DE3320F82C5D800608B94 /* Build configuration list for PBXNativeTarget "handler_test" */; + buildPhases = ( + F93DE3290F82C55600608B94 /* Sources */, + F93DE32A0F82C55600608B94 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + D2F9A44312131F80002747C1 /* PBXTargetDependency */, + ); + name = handler_test; + productName = handler_test; + productReference = F93DE32C0F82C55600608B94 /* handler_test */; + productType = "com.apple.product-type.tool"; + }; + F9C44DA40EF060A8003AEBAA /* BreakpadTest */ = { + isa = PBXNativeTarget; + buildConfigurationList = F9C44DAA0EF060A9003AEBAA /* Build configuration list for PBXNativeTarget "BreakpadTest" */; + buildPhases = ( + F9C44DA10EF060A8003AEBAA /* Resources */, + F9C44DA20EF060A8003AEBAA /* Sources */, + F9C44DA30EF060A8003AEBAA /* Frameworks */, + F9C44E410EF08B17003AEBAA /* Copy Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + F9C44E1A0EF0790F003AEBAA /* PBXTargetDependency */, + ); + name = BreakpadTest; + productName = BreakpadTest; + productReference = F9C44DA50EF060A8003AEBAA /* BreakpadTest.app */; + productType = "com.apple.product-type.application"; + }; + F9C77DD90F7DD5CF0045F7DB /* UnitTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = F9C77DDE0F7DD5D00045F7DB /* Build configuration list for PBXNativeTarget "UnitTests" */; + buildPhases = ( + F9C77DD50F7DD5CF0045F7DB /* Resources */, + F9C77DD60F7DD5CF0045F7DB /* Sources */, + F9C77DD70F7DD5CF0045F7DB /* Frameworks */, + F9C77DD80F7DD5CF0045F7DB /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + F93DE2FC0F82C3C600608B94 /* PBXTargetDependency */, + F93DE3700F82CC1300608B94 /* PBXTargetDependency */, + F91AF6380FD60A74009D8BE2 /* PBXTargetDependency */, + D2F9A5DF12142A6A002747C1 /* PBXTargetDependency */, + ); + name = UnitTests; + productName = UnitTests; + productReference = F9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + }; + buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Breakpad" */; + compatibilityVersion = "Xcode 3.1"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + da, + de, + es, + fr, + it, + ja, + nl, + no, + sl, + sv, + tr, + ); + mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */; + productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = F95BB87D101F949F00AA053B /* Products */; + ProjectRef = F95BB87C101F949F00AA053B /* crash_report.xcodeproj */; + }, + { + ProductGroup = F95BB88A101F94AC00AA053B /* Products */; + ProjectRef = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */; + }, + { + ProductGroup = F95BB895101F94C000AA053B /* Products */; + ProjectRef = F95BB894101F94C000AA053B /* symupload.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 8DC2EF4F0486A6940098B216 /* Breakpad */, + F92C53530ECCE349009BE4BA /* Inspector */, + F92C563B0ECD10B3009BE4BA /* breakpadUtilities */, + F92C569F0ECE04A7009BE4BA /* crash_report_sender */, + F9C44DA40EF060A8003AEBAA /* BreakpadTest */, + F94585840F782326009A47BF /* All */, + F9C77DD90F7DD5CF0045F7DB /* UnitTests */, + F93803BD0F80820F004D428B /* generator_test */, + F93DE2D00F82A67300608B94 /* minidump_file_writer_unittest */, + F93DE32B0F82C55600608B94 /* handler_test */, + D2F9A41412131EF0002747C1 /* gtest */, + D2F9A52A121383A1002747C1 /* crash_generation_server_test */, + D23F4BAA12A868A500686C8D /* minidump_generator_test_helper */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 8B31F7A111EF9A8700FCF3E4 /* macho_dump */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = macho_dump; + remoteRef = 8B31F7A011EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7A311EF9A8700FCF3E4 /* libgtestmockall.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libgtestmockall.a; + remoteRef = 8B31F7A211EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7A511EF9A8700FCF3E4 /* byte_cursor_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = byte_cursor_unittest; + remoteRef = 8B31F7A411EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7A711EF9A8700FCF3E4 /* macho_reader_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = macho_reader_unittest; + remoteRef = 8B31F7A611EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7A911EF9A8700FCF3E4 /* stabs_reader_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = stabs_reader_unittest; + remoteRef = 8B31F7A811EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7AB11EF9A8700FCF3E4 /* bytereader_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = bytereader_unittest; + remoteRef = 8B31F7AA11EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7AD11EF9A8700FCF3E4 /* dwarf2reader_cfi_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = dwarf2reader_cfi_unittest; + remoteRef = 8B31F7AC11EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7AF11EF9A8700FCF3E4 /* dwarf2diehandler_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = dwarf2diehandler_unittest; + remoteRef = 8B31F7AE11EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7B111EF9A8700FCF3E4 /* dwarf_cu_to_module_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = dwarf_cu_to_module_unittest; + remoteRef = 8B31F7B011EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7B311EF9A8700FCF3E4 /* dwarf_line_to_module_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = dwarf_line_to_module_unittest; + remoteRef = 8B31F7B211EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7B511EF9A8700FCF3E4 /* dwarf_cfi_to_module_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = dwarf_cfi_to_module_unittest; + remoteRef = 8B31F7B411EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7B711EF9A8700FCF3E4 /* stabs_to_module_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = stabs_to_module_unittest; + remoteRef = 8B31F7B611EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7B911EF9A8700FCF3E4 /* module_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = module_unittest; + remoteRef = 8B31F7B811EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8B31F7BB11EF9A8700FCF3E4 /* test_assembler_unittest */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = test_assembler_unittest; + remoteRef = 8B31F7BA11EF9A8700FCF3E4 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + F95BB885101F949F00AA053B /* crash_report */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = crash_report; + remoteRef = F95BB884101F949F00AA053B /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + F95BB892101F94AC00AA053B /* dump_syms */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = dump_syms; + remoteRef = F95BB891101F94AC00AA053B /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + F95BB89F101F94C000AA053B /* symupload */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = symupload; + remoteRef = F95BB89E101F94C000AA053B /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + F95BB8A1101F94C000AA053B /* minidump_upload */ = { + isa = PBXReferenceProxy; + fileType = "compiled.mach-o.executable"; + path = minidump_upload; + remoteRef = F95BB8A0101F94C000AA053B /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 8DC2EF520486A6940098B216 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F9C44E980EF09F56003AEBAA /* crash_report_sender.app in Resources */, + F92C568A0ECD15F9009BE4BA /* Inspector in Resources */, + F92C56650ECD1185009BE4BA /* breakpadUtilities.dylib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F92C569C0ECE04A7009BE4BA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F945849E0F280E3C009A47BF /* Localizable.strings in Resources */, + 4084699D0F5D9CF900FDCA37 /* crash_report_sender.icns in Resources */, + 33880C800F9E097100817F82 /* InfoPlist.strings in Resources */, + 3329D4ED0FA16D820007BBC5 /* Breakpad.xib in Resources */, + F9B630A0100FF96B00D0F4AC /* goArrow.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9C44DA10EF060A8003AEBAA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F9C44DB30EF07288003AEBAA /* crashduringload in Resources */, + F9C44DB40EF07288003AEBAA /* crashInMain in Resources */, + F9C44DBC0EF072A0003AEBAA /* InfoPlist.strings in Resources */, + F9C44DBD0EF072A0003AEBAA /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9C77DD50F7DD5CF0045F7DB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + F94584840F27FB40009A47BF /* Change install name of breakpadUtilities */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Change install name of breakpadUtilities"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "install_name_tool -id \"@executable_path/../Resources/breakpadUtilities.dylib\" \"${BUILT_PRODUCTS_DIR}/breakpadUtilities.dylib\"\n"; + }; + F97A0E850ED4EC15008784D3 /* Change install name of breakpadUtilities */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Change install name of breakpadUtilities"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "#!/bin/bash\ninstall_name_tool -id \"@executable_path/../Frameworks/Breakpad.framework/Resources/breakpadUtilities.dylib\" \"${BUILT_PRODUCTS_DIR}/breakpadUtilities.dylib\"\n"; + }; + F9C77DD80F7DD5CF0045F7DB /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n\necho running minidump generator tests...\n\"${BUILT_PRODUCTS_DIR}/generator_test\"\necho Running exception handler tests...\n\"${BUILT_PRODUCTS_DIR}/handler_test\"\necho Running crash generation server tests...\n\"${BUILT_PRODUCTS_DIR}/crash_generation_server_test\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DC2EF540486A6940098B216 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EB9CF8C824F01FB900F9B6D1 /* HTTPMultipartUpload.m in Sources */, + EB9CF8C224F01E1D00F9B6D1 /* HTTPGetRequest.m in Sources */, + F92C565F0ECD116B009BE4BA /* protected_memory_allocator.cc in Sources */, + EB9CF8BA24F01E1D00F9B6D1 /* minidump_upload.m in Sources */, + F92C56630ECD1179009BE4BA /* exception_handler.cc in Sources */, + EB9CF8BE24F01E1D00F9B6D1 /* HTTPPutRequest.m in Sources */, + F92C55D10ECD0064009BE4BA /* Breakpad.mm in Sources */, + F4DAB1DD19F1027100A5A838 /* launch_reporter.cc in Sources */, + F92C56340ECD0DF1009BE4BA /* OnDemandServer.mm in Sources */, + D2F9A4CB121336C7002747C1 /* crash_generation_client.cc in Sources */, + D2F9A4CD121336C7002747C1 /* crash_generation_server.cc in Sources */, + 163201D71443019E00C4DBF5 /* ConfigFile.mm in Sources */, + 162F64F2161C577500CD68D5 /* arch_utilities.cc in Sources */, + 1EEEB6231720829E00F7E689 /* simple_string_dictionary.cc in Sources */, + EB9CF8C324F01E1D00F9B6D1 /* HTTPSimplePostRequest.m in Sources */, + EB9CF8B924F01E1D00F9B6D1 /* encoding_util.m in Sources */, + EB9CF8BF24F01E1D00F9B6D1 /* HTTPRequest.m in Sources */, + EB9CF8C024F01E1D00F9B6D1 /* SymbolCollectorClient.m in Sources */, + 421BC5BC21110C0300B8042E /* convert_old_arm64_context.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D23F4BA812A868A500686C8D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D23F4BB112A868CB00686C8D /* minidump_generator_test_helper.cc in Sources */, + D23F4BB812A868F700686C8D /* MachIPC.mm in Sources */, + D246417012BAA40E005170D0 /* exception_handler.cc in Sources */, + D246417112BAA41C005170D0 /* crash_generation_client.cc in Sources */, + D246417512BAA438005170D0 /* minidump_generator.cc in Sources */, + D246417612BAA43F005170D0 /* dynamic_images.cc in Sources */, + D246417712BAA444005170D0 /* breakpad_nlist_64.cc in Sources */, + D246418812BAA4E3005170D0 /* string_utilities.cc in Sources */, + D246418C12BAA508005170D0 /* minidump_file_writer.cc in Sources */, + D246419012BAA52A005170D0 /* string_conversion.cc in Sources */, + D246419112BAA52F005170D0 /* convert_UTF.cc in Sources */, + D246419512BAA54C005170D0 /* file_id.cc in Sources */, + D246419612BAA55A005170D0 /* macho_id.cc in Sources */, + D24641A012BAA67F005170D0 /* macho_walker.cc in Sources */, + D24641AF12BAA82D005170D0 /* macho_utilities.cc in Sources */, + 4D72CA2513DFAE1C006CABE3 /* md5.cc in Sources */, + 4D61A26C14F43D42002D5862 /* bootstrap_compat.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2F9A41212131EF0002747C1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D2F9A43D12131F55002747C1 /* gmock-all.cc in Sources */, + D2F9A44012131F65002747C1 /* gtest_main.cc in Sources */, + D2F9A44112131F65002747C1 /* gtest-all.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2F9A52D121383A1002747C1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D2F9A553121383DC002747C1 /* crash_generation_server_test.cc in Sources */, + D2F9A52E121383A1002747C1 /* crash_generation_client.cc in Sources */, + D2F9A52F121383A1002747C1 /* crash_generation_server.cc in Sources */, + D2F9A530121383A1002747C1 /* MachIPC.mm in Sources */, + D2F9A531121383A1002747C1 /* breakpad_nlist_64.cc in Sources */, + D2F9A532121383A1002747C1 /* dynamic_images.cc in Sources */, + D2F9A533121383A1002747C1 /* exception_handler.cc in Sources */, + D2F9A534121383A1002747C1 /* minidump_generator.cc in Sources */, + D2F9A535121383A1002747C1 /* minidump_file_writer.cc in Sources */, + D2F9A536121383A1002747C1 /* convert_UTF.cc in Sources */, + D2F9A537121383A1002747C1 /* string_conversion.cc in Sources */, + D2F9A538121383A1002747C1 /* file_id.cc in Sources */, + D2F9A539121383A1002747C1 /* macho_id.cc in Sources */, + D2F9A53A121383A1002747C1 /* macho_utilities.cc in Sources */, + D2F9A53B121383A1002747C1 /* macho_walker.cc in Sources */, + D2F9A53C121383A1002747C1 /* string_utilities.cc in Sources */, + D24641EC12BAC6FB005170D0 /* logging.cc in Sources */, + D24641ED12BAC6FB005170D0 /* minidump.cc in Sources */, + D24641EE12BAC6FB005170D0 /* pathname_stripper.cc in Sources */, + D24641EF12BAC6FB005170D0 /* basic_code_modules.cc in Sources */, + 4D72CA3913DFAE92006CABE3 /* md5.cc in Sources */, + 4D61A26F14F43D48002D5862 /* bootstrap_compat.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F92C53510ECCE349009BE4BA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F92C53B80ECCE7B3009BE4BA /* Inspector.mm in Sources */, + F9286B3A0F7EB25800A4DCC8 /* InspectorMain.mm in Sources */, + 163201E31443029300C4DBF5 /* ConfigFile.mm in Sources */, + 4D61A26B14F43D3C002D5862 /* bootstrap_compat.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F92C56390ECD10B3009BE4BA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F4F916B619F10FFC00B83BE4 /* launch_reporter.cc in Sources */, + 162F64F4161C579B00CD68D5 /* arch_utilities.cc in Sources */, + 162F64F5161C579B00CD68D5 /* arch_utilities.h in Sources */, + D2A5DD301188633800081F03 /* breakpad_nlist_64.cc in Sources */, + F92C563F0ECD10CA009BE4BA /* convert_UTF.cc in Sources */, + F92C56400ECD10CA009BE4BA /* dynamic_images.cc in Sources */, + F92C56410ECD10CA009BE4BA /* file_id.cc in Sources */, + F92C56420ECD10CA009BE4BA /* macho_id.cc in Sources */, + F92C56430ECD10CA009BE4BA /* macho_utilities.cc in Sources */, + F92C56440ECD10CA009BE4BA /* macho_walker.cc in Sources */, + F92C56450ECD10CA009BE4BA /* MachIPC.mm in Sources */, + 4D72CA0E13DFAD5C006CABE3 /* md5.cc in Sources */, + F92C56460ECD10CA009BE4BA /* minidump_file_writer.cc in Sources */, + F92C56470ECD10CA009BE4BA /* minidump_generator.cc in Sources */, + F92C56490ECD10CA009BE4BA /* string_utilities.cc in Sources */, + F92C564A0ECD10CA009BE4BA /* string_conversion.cc in Sources */, + 4D61A25F14F43CFC002D5862 /* bootstrap_compat.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F92C569D0ECE04A7009BE4BA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EB9CF8C724F01F7600F9B6D1 /* encoding_util.m in Sources */, + EB9CF8C624F01F1100F9B6D1 /* HTTPRequest.m in Sources */, + F9C44EA20EF09F93003AEBAA /* HTTPMultipartUpload.m in Sources */, + F92C56A90ECE04C5009BE4BA /* crash_report_sender.m in Sources */, + F9C44EE90EF0A3C1003AEBAA /* GTMLogger.m in Sources */, + 16E02DB8147410F0008C604D /* uploader.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F93803BB0F80820F004D428B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D2C1DBE412AFC270006917BD /* logging.cc in Sources */, + D2C1DBE512AFC270006917BD /* minidump.cc in Sources */, + D2C1DBE612AFC270006917BD /* pathname_stripper.cc in Sources */, + D2C1DBE712AFC270006917BD /* basic_code_modules.cc in Sources */, + D2F9A4DF12133AD9002747C1 /* crash_generation_client.cc in Sources */, + D2F9A4E012133AD9002747C1 /* crash_generation_server.cc in Sources */, + D24BBD291211EDB100F3D417 /* MachIPC.mm in Sources */, + D2A5DD401188640400081F03 /* breakpad_nlist_64.cc in Sources */, + F93803CD0F8083B7004D428B /* dynamic_images.cc in Sources */, + F93803CE0F8083B7004D428B /* exception_handler.cc in Sources */, + F93803CF0F8083B7004D428B /* minidump_generator.cc in Sources */, + F93803D00F8083B7004D428B /* minidump_file_writer.cc in Sources */, + F93803D10F8083B7004D428B /* convert_UTF.cc in Sources */, + F93803D20F8083B7004D428B /* string_conversion.cc in Sources */, + F93803D30F8083B7004D428B /* file_id.cc in Sources */, + F93803D40F8083B7004D428B /* macho_id.cc in Sources */, + F93803D50F8083B7004D428B /* macho_utilities.cc in Sources */, + F93803D60F8083B7004D428B /* macho_walker.cc in Sources */, + F93803D70F8083B7004D428B /* string_utilities.cc in Sources */, + D23F4B2E12A7E13200686C8D /* minidump_generator_test.cc in Sources */, + 4D72CA2F13DFAE65006CABE3 /* md5.cc in Sources */, + 4D61A26D14F43D43002D5862 /* bootstrap_compat.cc in Sources */, + 1EEEB62B1720868C00F7E689 /* simple_string_dictionary.cc in Sources */, + 1EEEB62A1720859200F7E689 /* simple_string_dictionary_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F93DE2CE0F82A67300608B94 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F93DE2D90F82A73500608B94 /* minidump_file_writer.cc in Sources */, + F93DE2DA0F82A73500608B94 /* convert_UTF.cc in Sources */, + F93DE2DB0F82A73500608B94 /* string_conversion.cc in Sources */, + F93DE2D80F82A70E00608B94 /* minidump_file_writer_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F93DE3290F82C55600608B94 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 421BC5BE21110C1000B8042E /* convert_old_arm64_context.cc in Sources */, + 4247E6412110D7A300482558 /* memory_allocator_unittest.cc in Sources */, + D244536A12426F00009BBCE0 /* logging.cc in Sources */, + D244536B12426F00009BBCE0 /* minidump.cc in Sources */, + D244536C12426F00009BBCE0 /* pathname_stripper.cc in Sources */, + D244536D12426F00009BBCE0 /* basic_code_modules.cc in Sources */, + D2F9A4E112133AE2002747C1 /* crash_generation_client.cc in Sources */, + D2F9A4E212133AE2002747C1 /* crash_generation_server.cc in Sources */, + D24BBD321212CACF00F3D417 /* MachIPC.mm in Sources */, + D2A5DD411188642E00081F03 /* breakpad_nlist_64.cc in Sources */, + F93DE3350F82C66B00608B94 /* dynamic_images.cc in Sources */, + F93DE3360F82C66B00608B94 /* exception_handler.cc in Sources */, + F93DE3370F82C66B00608B94 /* minidump_generator.cc in Sources */, + F93DE3380F82C66B00608B94 /* minidump_file_writer.cc in Sources */, + F93DE3390F82C66B00608B94 /* convert_UTF.cc in Sources */, + F93DE33A0F82C66B00608B94 /* string_conversion.cc in Sources */, + F93DE33B0F82C66B00608B94 /* file_id.cc in Sources */, + F93DE33C0F82C66B00608B94 /* macho_id.cc in Sources */, + F93DE33D0F82C66B00608B94 /* macho_utilities.cc in Sources */, + F93DE33E0F82C66B00608B94 /* macho_walker.cc in Sources */, + F93DE33F0F82C66B00608B94 /* string_utilities.cc in Sources */, + D2F9A3D51212F87C002747C1 /* exception_handler_test.cc in Sources */, + 4D72CA3813DFAE91006CABE3 /* md5.cc in Sources */, + 4D61A26E14F43D45002D5862 /* bootstrap_compat.cc in Sources */, + 1EEEB6271720831E00F7E689 /* BreakpadFramework_Test.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9C44DA20EF060A8003AEBAA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F9C44DB20EF07288003AEBAA /* Controller.m in Sources */, + F9C44DB60EF07288003AEBAA /* main.m in Sources */, + F9C44DB70EF07288003AEBAA /* TestClass.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9C77DD60F7DD5CF0045F7DB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F9C77E130F7DDF810045F7DB /* GTMSenTestCase.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 8B31023911F0CF0600FCF3E4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = all_unittests; + targetProxy = 8B31023811F0CF0600FCF3E4 /* PBXContainerItemProxy */; + }; + 8B31051711F1010E00FCF3E4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F93803BD0F80820F004D428B /* generator_test */; + targetProxy = 8B31051611F1010E00FCF3E4 /* PBXContainerItemProxy */; + }; + 8B31051911F1010E00FCF3E4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F93DE2D00F82A67300608B94 /* minidump_file_writer_unittest */; + targetProxy = 8B31051811F1010E00FCF3E4 /* PBXContainerItemProxy */; + }; + 8B31051B11F1010E00FCF3E4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F93DE32B0F82C55600608B94 /* handler_test */; + targetProxy = 8B31051A11F1010E00FCF3E4 /* PBXContainerItemProxy */; + }; + 8B31051D11F1010E00FCF3E4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = macho_dump; + targetProxy = 8B31051C11F1010E00FCF3E4 /* PBXContainerItemProxy */; + }; + 8B31051F11F1010E00FCF3E4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = minidump_upload; + targetProxy = 8B31051E11F1010E00FCF3E4 /* PBXContainerItemProxy */; + }; + D23F4B3012A7E16200686C8D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = D2F9A41412131EF0002747C1 /* gtest */; + targetProxy = D23F4B2F12A7E16200686C8D /* PBXContainerItemProxy */; + }; + D23F4BBA12A8694C00686C8D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = D23F4BAA12A868A500686C8D /* minidump_generator_test_helper */; + targetProxy = D23F4BB912A8694C00686C8D /* PBXContainerItemProxy */; + }; + D2F9A44312131F80002747C1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = D2F9A41412131EF0002747C1 /* gtest */; + targetProxy = D2F9A44212131F80002747C1 /* PBXContainerItemProxy */; + }; + D2F9A52B121383A1002747C1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = D2F9A41412131EF0002747C1 /* gtest */; + targetProxy = D2F9A52C121383A1002747C1 /* PBXContainerItemProxy */; + }; + D2F9A5DF12142A6A002747C1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = D2F9A52A121383A1002747C1 /* crash_generation_server_test */; + targetProxy = D2F9A5DE12142A6A002747C1 /* PBXContainerItemProxy */; + }; + F91AF6380FD60A74009D8BE2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8DC2EF4F0486A6940098B216 /* Breakpad */; + targetProxy = F91AF6370FD60A74009D8BE2 /* PBXContainerItemProxy */; + }; + F92C564E0ECD10E5009BE4BA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */; + targetProxy = F92C564D0ECD10E5009BE4BA /* PBXContainerItemProxy */; + }; + F92C56860ECD15EF009BE4BA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */; + targetProxy = F92C56850ECD15EF009BE4BA /* PBXContainerItemProxy */; + }; + F92C56880ECD15F1009BE4BA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F92C53530ECCE349009BE4BA /* Inspector */; + targetProxy = F92C56870ECD15F1009BE4BA /* PBXContainerItemProxy */; + }; + F93DE2FC0F82C3C600608B94 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F93803BD0F80820F004D428B /* generator_test */; + targetProxy = F93DE2FB0F82C3C600608B94 /* PBXContainerItemProxy */; + }; + F93DE3700F82CC1300608B94 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F93DE32B0F82C55600608B94 /* handler_test */; + targetProxy = F93DE36F0F82CC1300608B94 /* PBXContainerItemProxy */; + }; + F93DE3A70F830D1D00608B94 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F9C77DD90F7DD5CF0045F7DB /* UnitTests */; + targetProxy = F93DE3A60F830D1D00608B94 /* PBXContainerItemProxy */; + }; + F94585880F78232B009A47BF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8DC2EF4F0486A6940098B216 /* Breakpad */; + targetProxy = F94585870F78232B009A47BF /* PBXContainerItemProxy */; + }; + F945858A0F78232E009A47BF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F92C53530ECCE349009BE4BA /* Inspector */; + targetProxy = F94585890F78232E009A47BF /* PBXContainerItemProxy */; + }; + F945858C0F782330009A47BF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */; + targetProxy = F945858B0F782330009A47BF /* PBXContainerItemProxy */; + }; + F945858E0F782333009A47BF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F92C569F0ECE04A7009BE4BA /* crash_report_sender */; + targetProxy = F945858D0F782333009A47BF /* PBXContainerItemProxy */; + }; + F94585900F782336009A47BF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F9C44DA40EF060A8003AEBAA /* BreakpadTest */; + targetProxy = F945858F0F782336009A47BF /* PBXContainerItemProxy */; + }; + F95BB8B3101F94D300AA053B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = dump_syms; + targetProxy = F95BB8B2101F94D300AA053B /* PBXContainerItemProxy */; + }; + F95BB8B5101F94D300AA053B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = symupload; + targetProxy = F95BB8B4101F94D300AA053B /* PBXContainerItemProxy */; + }; + F95BB8B7101F94D300AA053B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = crash_report; + targetProxy = F95BB8B6101F94D300AA053B /* PBXContainerItemProxy */; + }; + F9C44E1A0EF0790F003AEBAA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8DC2EF4F0486A6940098B216 /* Breakpad */; + targetProxy = F9C44E190EF0790F003AEBAA /* PBXContainerItemProxy */; + }; + F9C44E970EF09F4B003AEBAA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F92C569F0ECE04A7009BE4BA /* crash_report_sender */; + targetProxy = F9C44E960EF09F4B003AEBAA /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33880C7E0F9E097100817F82 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 33880C7F0F9E097100817F82 /* English */, + DE43468711C7295D004F095F /* da */, + DE43468611C72958004F095F /* de */, + DE43468811C7295F004F095F /* es */, + DE43468911C72964004F095F /* fr */, + DE43468A11C72967004F095F /* it */, + DE43468B11C7296B004F095F /* ja */, + DE43468C11C7296D004F095F /* nl */, + DE43468D11C7296F004F095F /* no */, + DE43468E11C72971004F095F /* sl */, + DE43468F11C72973004F095F /* sv */, + DE43469011C72976004F095F /* tr */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + F945849C0F280E3C009A47BF /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + F945849D0F280E3C009A47BF /* English */, + DE43467411C72855004F095F /* da */, + DE43467511C72857004F095F /* de */, + DE43467611C7285B004F095F /* es */, + DE43467711C72862004F095F /* fr */, + DE43467811C72869004F095F /* it */, + DE43467E11C728DC004F095F /* ja */, + DE43467911C7286D004F095F /* nl */, + DE43467A11C72873004F095F /* no */, + DE43467B11C72877004F095F /* sl */, + DE43467C11C7287A004F095F /* sv */, + DE43467F11C728E1004F095F /* tr */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + F9C44DB80EF072A0003AEBAA /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + F9C44DB90EF072A0003AEBAA /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + F9C44DBA0EF072A0003AEBAA /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + F9C44DBB0EF072A0003AEBAA /* English */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1DEB91AE08733DA50010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch; + HEADER_SEARCH_PATHS = ../..; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "@executable_path/../Frameworks"; + PRODUCT_NAME = Breakpad; + WRAPPER_EXTENSION = framework; + }; + name = Debug; + }; + 1DEB91AF08733DA50010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch; + HEADER_SEARCH_PATHS = ../..; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "@executable_path/../Frameworks"; + PRODUCT_NAME = Breakpad; + WRAPPER_EXTENSION = framework; + }; + name = Release; + }; + 1DEB91B208733DA50010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; + SDKROOT = macosx; + }; + name = Debug; + }; + 1DEB91B308733DA50010E9CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8B31027811F0D3AF00FCF3E4 /* BreakpadRelease.xcconfig */; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + D23F4BAD12A868A600686C8D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + HEADER_SEARCH_PATHS = ../..; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = minidump_generator_test_helper; + }; + name = Debug; + }; + D23F4BAE12A868A600686C8D /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + HEADER_SEARCH_PATHS = ../..; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = minidump_generator_test_helper; + }; + name = "Debug With Code Coverage"; + }; + D23F4BAF12A868A600686C8D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_MODEL_TUNING = G5; + HEADER_SEARCH_PATHS = ../..; + INSTALL_PATH = /usr/local/bin; + PREBINDING = NO; + PRODUCT_NAME = minidump_generator_test_helper; + ZERO_LINK = NO; + }; + name = Release; + }; + D2F9A41612131EF0002747C1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, + ); + PREBINDING = NO; + PRODUCT_NAME = gtest; + }; + name = Debug; + }; + D2F9A41712131EF0002747C1 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, + ); + PREBINDING = NO; + PRODUCT_NAME = gtest; + }; + name = "Debug With Code Coverage"; + }; + D2F9A41812131EF0002747C1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, + ); + PREBINDING = NO; + PRODUCT_NAME = gtest; + ZERO_LINK = NO; + }; + name = Release; + }; + D2F9A543121383A1002747C1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_INLINES_ARE_PRIVATE_EXTERN = NO; + GCC_PREPROCESSOR_DEFINITIONS = "BP_LOGGING_INCLUDE=\\\"client/mac/tests/testlogging.h\\\""; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = ( + ../.., + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/build/Debug\"", + ); + PRODUCT_NAME = crash_generation_server_test; + }; + name = Debug; + }; + D2F9A544121383A1002747C1 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + ../.., + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\\\"$(SRCROOT)/build/Debug\\\"", + ); + PRODUCT_NAME = crash_generation_server_test; + }; + name = "Debug With Code Coverage"; + }; + D2F9A545121383A1002747C1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + ../.., + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\\\"$(SRCROOT)/build/Debug\\\"", + ); + PRODUCT_NAME = crash_generation_server_test; + }; + name = Release; + }; + F92C53560ECCE34A009BE4BA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../..; + PRODUCT_NAME = Inspector; + }; + name = Debug; + }; + F92C53570ECCE34A009BE4BA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../..; + PRODUCT_NAME = Inspector; + }; + name = Release; + }; + F92C563D0ECD10B3009BE4BA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + HEADER_SEARCH_PATHS = ../..; + LD_DYLIB_INSTALL_NAME = "@executable_path/../Resources/$(EXECUTABLE_PATH)"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-headerpad_max_install_names", + ); + PRODUCT_NAME = breakpadUtilities; + }; + name = Debug; + }; + F92C563E0ECD10B3009BE4BA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + HEADER_SEARCH_PATHS = ../..; + LD_DYLIB_INSTALL_NAME = "@executable_path/../Resources/$(EXECUTABLE_PATH)"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-headerpad_max_install_names", + ); + PRODUCT_NAME = breakpadUtilities; + }; + name = Release; + }; + F92C56A30ECE04A8009BE4BA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../..; + INFOPLIST_FILE = "sender/crash_report_sender-Info.plist"; + PRODUCT_NAME = crash_report_sender; + }; + name = Debug; + }; + F92C56A40ECE04A8009BE4BA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../..; + INFOPLIST_FILE = "sender/crash_report_sender-Info.plist"; + PRODUCT_NAME = crash_report_sender; + }; + name = Release; + }; + F93803C00F808210004D428B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = "BP_LOGGING_INCLUDE=\\\"client/mac/tests/testlogging.h\\\""; + HEADER_SEARCH_PATHS = ( + ../.., + ../../.., + ../../testing/googlemock/include, + ../../testing/googletest/include, + ); + PRODUCT_NAME = generator_test; + }; + name = Debug; + }; + F93803C10F808210004D428B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + ../.., + ../../.., + ../../testing/googlemock/include, + ../../testing/googletest/include, + ); + PRODUCT_NAME = generator_test; + }; + name = Release; + }; + F93DE2D30F82A67400608B94 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../..; + PRODUCT_NAME = minidump_file_writer_unittest; + }; + name = Debug; + }; + F93DE2D40F82A67400608B94 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../..; + PRODUCT_NAME = minidump_file_writer_unittest; + }; + name = Release; + }; + F93DE32E0F82C55700608B94 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_INLINES_ARE_PRIVATE_EXTERN = NO; + GCC_PREPROCESSOR_DEFINITIONS = "BP_LOGGING_INCLUDE=\\\"client/mac/tests/testlogging.h\\\""; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = ( + ../../.., + ../.., + ../../testing/googletest, + ../../testing/googletest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/build/Debug\"", + ); + PRODUCT_NAME = handler_test; + }; + name = Debug; + }; + F93DE32F0F82C55700608B94 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + ../../.., + ../.., + ../../testing/googletest, + ../../testing/googletest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/build/Debug\"", + ); + PRODUCT_NAME = handler_test; + }; + name = Release; + }; + F93DE3B90F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = "Debug With Code Coverage"; + }; + F93DE3BA0F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch; + HEADER_SEARCH_PATHS = ../..; + INFOPLIST_FILE = Framework/Info.plist; + INSTALL_PATH = "@executable_path/../Frameworks"; + PRODUCT_NAME = Breakpad; + WRAPPER_EXTENSION = framework; + }; + name = "Debug With Code Coverage"; + }; + F93DE3BB0F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../..; + PRODUCT_NAME = Inspector; + }; + name = "Debug With Code Coverage"; + }; + F93DE3BC0F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + HEADER_SEARCH_PATHS = ../..; + LD_DYLIB_INSTALL_NAME = "@executable_path/../Resources/$(EXECUTABLE_PATH)"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-headerpad_max_install_names", + ); + PRODUCT_NAME = breakpadUtilities; + }; + name = "Debug With Code Coverage"; + }; + F93DE3BD0F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../..; + INFOPLIST_FILE = "sender/crash_report_sender-Info.plist"; + PRODUCT_NAME = crash_report_sender; + }; + name = "Debug With Code Coverage"; + }; + F93DE3BE0F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/build/$(CONFIGURATION)"; + INFOPLIST_FILE = testapp/Info.plist; + PRODUCT_NAME = BreakpadTest; + }; + name = "Debug With Code Coverage"; + }; + F93DE3BF0F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = All; + }; + name = "Debug With Code Coverage"; + }; + F93DE3C00F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_FRAMEWORKS_DIR)\"", + ); + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + HEADER_SEARCH_PATHS = ../..; + INFOPLIST_FILE = "UnitTests-Info.plist"; + PRODUCT_NAME = UnitTests; + WRAPPER_EXTENSION = octest; + }; + name = "Debug With Code Coverage"; + }; + F93DE3C10F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + ../.., + ../../.., + ../../testing/googlemock/include, + ../../testing/googletest/include, + ); + PRODUCT_NAME = generator_test; + }; + name = "Debug With Code Coverage"; + }; + F93DE3C20F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../..; + PRODUCT_NAME = minidump_file_writer_unittest; + }; + name = "Debug With Code Coverage"; + }; + F93DE3C30F830E7000608B94 /* Debug With Code Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + ../../.., + ../.., + ../../testing/googletest, + ../../testing/googletest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/build/Debug\"", + ); + PRODUCT_NAME = handler_test; + }; + name = "Debug With Code Coverage"; + }; + F94585850F782326009A47BF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = All; + }; + name = Debug; + }; + F94585860F782326009A47BF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = All; + }; + name = Release; + }; + F9C44DA80EF060A8003AEBAA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/build/$(CONFIGURATION)"; + INFOPLIST_FILE = testapp/Info.plist; + PRODUCT_NAME = BreakpadTest; + }; + name = Debug; + }; + F9C44DA90EF060A8003AEBAA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/build/$(CONFIGURATION)"; + INFOPLIST_FILE = testapp/Info.plist; + PRODUCT_NAME = BreakpadTest; + }; + name = Release; + }; + F9C77DDC0F7DD5D00045F7DB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_FRAMEWORKS_DIR)\"", + ); + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + INFOPLIST_FILE = "UnitTests-Info.plist"; + PRODUCT_NAME = UnitTests; + WRAPPER_EXTENSION = octest; + }; + name = Debug; + }; + F9C77DDD0F7DD5D00045F7DB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_FRAMEWORKS_DIR)\"", + ); + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + INFOPLIST_FILE = "UnitTests-Info.plist"; + PRODUCT_NAME = UnitTests; + WRAPPER_EXTENSION = octest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Breakpad" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB91AE08733DA50010E9CD /* Debug */, + F93DE3BA0F830E7000608B94 /* Debug With Code Coverage */, + 1DEB91AF08733DA50010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Breakpad" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB91B208733DA50010E9CD /* Debug */, + F93DE3B90F830E7000608B94 /* Debug With Code Coverage */, + 1DEB91B308733DA50010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D23F4BB012A868C400686C8D /* Build configuration list for PBXNativeTarget "minidump_generator_test_helper" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D23F4BAD12A868A600686C8D /* Debug */, + D23F4BAE12A868A600686C8D /* Debug With Code Coverage */, + D23F4BAF12A868A600686C8D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D2F9A42D12131F0E002747C1 /* Build configuration list for PBXNativeTarget "gtest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D2F9A41612131EF0002747C1 /* Debug */, + D2F9A41712131EF0002747C1 /* Debug With Code Coverage */, + D2F9A41812131EF0002747C1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D2F9A542121383A1002747C1 /* Build configuration list for PBXNativeTarget "crash_generation_server_test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D2F9A543121383A1002747C1 /* Debug */, + D2F9A544121383A1002747C1 /* Debug With Code Coverage */, + D2F9A545121383A1002747C1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F92C53580ECCE36D009BE4BA /* Build configuration list for PBXNativeTarget "Inspector" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F92C53560ECCE34A009BE4BA /* Debug */, + F93DE3BB0F830E7000608B94 /* Debug With Code Coverage */, + F92C53570ECCE34A009BE4BA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F92C56670ECD11A3009BE4BA /* Build configuration list for PBXNativeTarget "breakpadUtilities" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F92C563D0ECD10B3009BE4BA /* Debug */, + F93DE3BC0F830E7000608B94 /* Debug With Code Coverage */, + F92C563E0ECD10B3009BE4BA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F92C56A50ECE04A8009BE4BA /* Build configuration list for PBXNativeTarget "crash_report_sender" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F92C56A30ECE04A8009BE4BA /* Debug */, + F93DE3BD0F830E7000608B94 /* Debug With Code Coverage */, + F92C56A40ECE04A8009BE4BA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F93803C40F80822E004D428B /* Build configuration list for PBXNativeTarget "generator_test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F93803C00F808210004D428B /* Debug */, + F93DE3C10F830E7000608B94 /* Debug With Code Coverage */, + F93803C10F808210004D428B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F93DE2D60F82A67700608B94 /* Build configuration list for PBXNativeTarget "minidump_file_writer_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F93DE2D30F82A67400608B94 /* Debug */, + F93DE3C20F830E7000608B94 /* Debug With Code Coverage */, + F93DE2D40F82A67400608B94 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F93DE3320F82C5D800608B94 /* Build configuration list for PBXNativeTarget "handler_test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F93DE32E0F82C55700608B94 /* Debug */, + F93DE3C30F830E7000608B94 /* Debug With Code Coverage */, + F93DE32F0F82C55700608B94 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F94585930F78235C009A47BF /* Build configuration list for PBXAggregateTarget "All" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F94585850F782326009A47BF /* Debug */, + F93DE3BF0F830E7000608B94 /* Debug With Code Coverage */, + F94585860F782326009A47BF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F9C44DAA0EF060A9003AEBAA /* Build configuration list for PBXNativeTarget "BreakpadTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F9C44DA80EF060A8003AEBAA /* Debug */, + F93DE3BE0F830E7000608B94 /* Debug With Code Coverage */, + F9C44DA90EF060A8003AEBAA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F9C77DDE0F7DD5D00045F7DB /* Build configuration list for PBXNativeTarget "UnitTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F9C77DDC0F7DD5D00045F7DB /* Debug */, + F93DE3C00F830E7000608B94 /* Debug With Code Coverage */, + F9C77DDD0F7DD5D00045F7DB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} \ No newline at end of file diff --git a/src/client/mac/Framework/Breakpad.h b/src/client/mac/Framework/Breakpad.h new file mode 100644 index 0000000..e2b48aa --- /dev/null +++ b/src/client/mac/Framework/Breakpad.h @@ -0,0 +1,284 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Framework to provide a simple C API to crash reporting for +// applications. By default, if any machine-level exception (e.g., +// EXC_BAD_ACCESS) occurs, it will be handled by the BreakpadRef +// object as follows: +// +// 1. Create a minidump file (see Breakpad for details) +// 2. Prompt the user (using CFUserNotification) +// 3. Invoke a command line reporting tool to send the minidump to a +// server +// +// By specifying parameters to the BreakpadCreate function, you can +// modify the default behavior to suit your needs and wants and +// desires. + +// A service name associated with the original bootstrap parent port, saved in +// OnDemandServer and restored in Inspector. +#define BREAKPAD_BOOTSTRAP_PARENT_PORT "com.Breakpad.BootstrapParent" + +typedef void* BreakpadRef; + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#include "BreakpadDefines.h" + +// Optional user-defined function to dec to decide if we should handle +// this crash or forward it along. +// Return true if you want Breakpad to handle it. +// Return false if you want Breakpad to skip it +// The exception handler always returns false, as if SEND_AND_EXIT were false +// (which means the next exception handler will take the exception) +typedef bool (*BreakpadFilterCallback)(int exception_type, + int exception_code, + mach_port_t crashing_thread, + void* context); + +// Create a new BreakpadRef object and install it as an exception +// handler. The |parameters| will typically be the contents of your +// bundle's Info.plist. +// +// You can also specify these additional keys for customizable behavior: +// Key: Value: +// BREAKPAD_PRODUCT Product name (e.g., "MyAwesomeProduct") +// This one is used as the key to identify +// the product when uploading. Falls back to +// CFBundleName if not specified. +// REQUIRED +// +// BREAKPAD_PRODUCT_DISPLAY This is the display name, e.g. a pretty +// name for the product when the crash_sender +// pops up UI for the user. Falls back first to +// CFBundleDisplayName and then to +// BREAKPAD_PRODUCT if not specified. +// +// BREAKPAD_VERSION Product version (e.g., 1.2.3), used +// as metadata for crash report. Falls back to +// CFBundleVersion if not specified. +// REQUIRED +// +// BREAKPAD_VENDOR Vendor name, used in UI (e.g. "A report has +// been created that you can send to ") +// +// BREAKPAD_URL URL destination for reporting +// REQUIRED +// +// BREAKPAD_REPORT_INTERVAL # of seconds between sending +// reports. If an additional report is +// generated within this time, it will +// be ignored. Default: 3600sec. +// Specify 0 to send all reports. +// +// BREAKPAD_SKIP_CONFIRM If true, the reporter will send the report +// without any user intervention. +// Defaults to NO +// +// BREAKPAD_CONFIRM_TIMEOUT Number of seconds before the upload +// confirmation dialog will be automatically +// dismissed (cancelling the upload). +// Default: 300 seconds (min of 60). +// Specify 0 to prevent timeout. +// +// BREAKPAD_SEND_AND_EXIT If true, the handler will exit after sending. +// This will prevent any other handler (e.g., +// CrashReporter) from getting the crash. +// Defaults TO YES +// +// BREAKPAD_DUMP_DIRECTORY The directory to store crash-dumps +// in. By default, we use +// ~/Library/Breakpad/ +// The path you specify here is tilde-expanded. +// +// BREAKPAD_INSPECTOR_LOCATION The full path to the Inspector executable. +// Defaults to /Inspector +// +// BREAKPAD_REPORTER_EXE_LOCATION The full path to the Reporter/sender +// executable. +// Default: +// /crash_report_sender.app +// +// BREAKPAD_LOGFILES Indicates an array of log file paths that +// should be uploaded at crash time. +// +// BREAKPAD_REQUEST_COMMENTS If true, the message dialog will have a +// text box for the user to enter comments. +// Default: NO +// +// BREAKPAD_REQUEST_EMAIL If true and BREAKPAD_REQUEST_COMMENTS is also +// true, the message dialog will have a text +// box for the user to enter their email address. +// Default: NO +// +// BREAKPAD_SERVER_TYPE A parameter that tells Breakpad how to +// rewrite the upload parameters for a specific +// server type. The currently valid values are +// 'socorro' or 'google'. If you want to add +// other types, see the function in +// crash_report_sender.m that maps parameters to +// URL parameters. Defaults to 'google'. +// +// BREAKPAD_SERVER_PARAMETER_DICT A plist dictionary of static +// parameters that are uploaded to the +// server. The parameters are sent as +// is to the crash server. Their +// content isn't added to the minidump +// but pass as URL parameters when +// uploading theminidump to the crash +// server. +// +// BREAKPAD_IN_PROCESS A boolean NSNumber value. If YES, Breakpad +// will write the dump file in-process and then +// launch the reporter executable as a child +// process. +//============================================================================= +// The BREAKPAD_PRODUCT, BREAKPAD_VERSION and BREAKPAD_URL are +// required to have non-NULL values. By default, the BREAKPAD_PRODUCT +// will be the CFBundleName and the BREAKPAD_VERSION will be the +// CFBundleVersion when these keys are present in the bundle's +// Info.plist, which is usually passed in to BreakpadCreate() as an +// NSDictionary (you could also pass in another dictionary that had +// the same keys configured). If the BREAKPAD_PRODUCT or +// BREAKPAD_VERSION are ultimately undefined, BreakpadCreate() will +// fail. You have been warned. +// +// If you are running in a debugger, Breakpad will not install, unless the +// BREAKPAD_IGNORE_DEBUGGER envionment variable is set and/or non-zero. +// +// The BREAKPAD_SKIP_CONFIRM and BREAKPAD_SEND_AND_EXIT default +// values are NO and YES. However, they can be controlled by setting their +// values in a user or global plist. +// +// It's easiest to use Breakpad via the Framework, but if you're compiling the +// code in directly, BREAKPAD_INSPECTOR_LOCATION and +// BREAKPAD_REPORTER_EXE_LOCATION allow you to specify custom paths +// to the helper executables. +// +//============================================================================= +// The following are NOT user-supplied but are documented here for +// completeness. They are calculated by Breakpad during initialization & +// crash-dump generation, or entered in by the user. +// +// BREAKPAD_PROCESS_START_TIME The time, in seconds since the Epoch, the +// process started +// +// BREAKPAD_PROCESS_CRASH_TIME The time, in seconds since the Epoch, the +// process crashed. +// +// BREAKPAD_PROCESS_UP_TIME The total time in milliseconds the process +// has been running. This parameter is not +// set until the crash-dump-generation phase. +// +// BREAKPAD_LOGFILE_KEY_PREFIX Used to find out which parameters in the +// parameter dictionary correspond to log +// file paths. +// +// BREAKPAD_SERVER_PARAMETER_PREFIX This prefix is used by Breakpad +// internally, because Breakpad uses +// the same dictionary internally to +// track both its internal +// configuration parameters and +// parameters meant to be uploaded +// to the server. This string is +// used internally by Breakpad to +// prefix user-supplied parameter +// names so those can be sent to the +// server without leaking Breakpad's +// internal values. +// +// BREAKPAD_ON_DEMAND Used internally to indicate to the +// Reporter that we're sending on-demand, +// not as result of a crash. +// +// BREAKPAD_COMMENTS The text the user provided as comments. +// Only used in crash_report_sender. + +// Returns a new BreakpadRef object on success, NULL otherwise. +BreakpadRef BreakpadCreate(NSDictionary* parameters); + +// Uninstall and release the data associated with |ref|. +void BreakpadRelease(BreakpadRef ref); + +// Clients may set an optional callback which gets called when a crash +// occurs. The callback function should return |true| if we should +// handle the crash, generate a crash report, etc. or |false| if we +// should ignore it and forward the crash (normally to CrashReporter). +// Context is a pointer to arbitrary data to make the callback with. +void BreakpadSetFilterCallback(BreakpadRef ref, + BreakpadFilterCallback callback, + void* context); + +// User defined key and value string storage. Generally this is used +// to configure Breakpad's internal operation, such as whether the +// crash_sender should prompt the user, or the filesystem location for +// the minidump file. See Breakpad.h for some parameters that can be +// set. Anything longer than 255 bytes will be truncated. Note that +// the string is converted to UTF8 before truncation, so any multibyte +// character that straddles the 255(256 - 1 for terminator) byte limit +// will be mangled. +// +// A maximum number of 64 key/value pairs are supported. An assert() +// will fire if more than this number are set. Unfortunately, right +// now, the same dictionary is used for both Breakpad's parameters AND +// the Upload parameters. +// +// TODO (nealsid): Investigate how necessary this is if we don't +// automatically upload parameters to the server anymore. +// TODO (nealsid): separate server parameter dictionary from the +// dictionary used to configure Breakpad, and document limits for each +// independently. +void BreakpadSetKeyValue(BreakpadRef ref, NSString* key, NSString* value); +NSString* BreakpadKeyValue(BreakpadRef ref, NSString* key); +void BreakpadRemoveKeyValue(BreakpadRef ref, NSString* key); + +// You can use this method to specify parameters that will be uploaded +// to the crash server. They will be automatically encoded as +// necessary. Note that as mentioned above there are limits on both +// the number of keys and their length. +void BreakpadAddUploadParameter(BreakpadRef ref, NSString* key, + NSString* value); + +// This method will remove a previously-added parameter from the +// upload parameter set. +void BreakpadRemoveUploadParameter(BreakpadRef ref, NSString* key); + +// Add a log file for Breakpad to read and send upon crash dump +void BreakpadAddLogFile(BreakpadRef ref, NSString* logPathname); + +// Generate a minidump and send +void BreakpadGenerateAndSendReport(BreakpadRef ref); + +#ifdef __cplusplus +} +#endif diff --git a/src/client/mac/Framework/Breakpad.mm b/src/client/mac/Framework/Breakpad.mm new file mode 100644 index 0000000..def43b7 --- /dev/null +++ b/src/client/mac/Framework/Breakpad.mm @@ -0,0 +1,1042 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + + +#define IGNORE_DEBUGGER "BREAKPAD_IGNORE_DEBUGGER" + +#import "client/mac/Framework/Breakpad.h" + +#include +#import +#include +#include +#include + +#import "client/mac/crash_generation/Inspector.h" +#import "client/mac/handler/exception_handler.h" +#import "client/mac/Framework/Breakpad.h" +#import "client/mac/Framework/OnDemandServer.h" +#import "client/mac/handler/protected_memory_allocator.h" +#include "common/mac/launch_reporter.h" +#import "common/mac/MachIPC.h" +#import "common/simple_string_dictionary.h" + +#if !defined(__EXCEPTIONS) || (__clang__ && !__has_feature(cxx_exceptions)) +// This file uses C++ try/catch (but shouldn't). Duplicate the macros from +// allowing this file to work properly with +// exceptions disabled even when other C++ libraries are used. #undef the try +// and catch macros first in case libstdc++ is in use and has already provided +// its own definitions. +#undef try +#define try if (true) +#undef catch +#define catch(X) if (false) +#endif // __EXCEPTIONS + +using google_breakpad::MachPortSender; +using google_breakpad::MachReceiveMessage; +using google_breakpad::MachSendMessage; +using google_breakpad::ReceivePort; +using google_breakpad::SimpleStringDictionary; + +//============================================================================= +// We want any memory allocations which are used by breakpad during the +// exception handling process (after a crash has happened) to be read-only +// to prevent them from being smashed before a crash occurs. Unfortunately +// we cannot protect against smashes to our exception handling thread's +// stack. +// +// NOTE: Any memory allocations which are not used during the exception +// handling process may be allocated in the normal ways. +// +// The ProtectedMemoryAllocator class provides an Allocate() method which +// we'll using in conjunction with placement operator new() to control +// allocation of C++ objects. Note that we don't use operator delete() +// but instead call the objects destructor directly: object->~ClassName(); +// +ProtectedMemoryAllocator* gMasterAllocator = NULL; +ProtectedMemoryAllocator* gKeyValueAllocator = NULL; +ProtectedMemoryAllocator* gBreakpadAllocator = NULL; + +// Mutex for thread-safe access to the key/value dictionary used by breakpad. +// It's a global instead of an instance variable of Breakpad +// since it can't live in a protected memory area. +pthread_mutex_t gDictionaryMutex; + +//============================================================================= +// Stack-based object for thread-safe access to a memory-protected region. +// It's assumed that normally the memory block (allocated by the allocator) +// is protected (read-only). Creating a stack-based instance of +// ProtectedMemoryLocker will unprotect this block after taking the lock. +// Its destructor will first re-protect the memory then release the lock. +class ProtectedMemoryLocker { + public: + ProtectedMemoryLocker(pthread_mutex_t* mutex, + ProtectedMemoryAllocator* allocator) + : mutex_(mutex), + allocator_(allocator) { + // Lock the mutex + __attribute__((unused)) int rv = pthread_mutex_lock(mutex_); + assert(rv == 0); + + // Unprotect the memory + allocator_->Unprotect(); + } + + ~ProtectedMemoryLocker() { + // First protect the memory + allocator_->Protect(); + + // Then unlock the mutex + __attribute__((unused)) int rv = pthread_mutex_unlock(mutex_); + assert(rv == 0); + } + + private: + ProtectedMemoryLocker(); + ProtectedMemoryLocker(const ProtectedMemoryLocker&); + ProtectedMemoryLocker& operator=(const ProtectedMemoryLocker&); + + pthread_mutex_t* mutex_; + ProtectedMemoryAllocator* allocator_; +}; + +//============================================================================= +class Breakpad { + public: + // factory method + static Breakpad* Create(NSDictionary* parameters) { + // Allocate from our special allocation pool + Breakpad* breakpad = + new (gBreakpadAllocator->Allocate(sizeof(Breakpad))) + Breakpad(); + + if (!breakpad) + return NULL; + + if (!breakpad->Initialize(parameters)) { + // Don't use operator delete() here since we allocated from special pool + breakpad->~Breakpad(); + return NULL; + } + + return breakpad; + } + + ~Breakpad(); + + void SetKeyValue(NSString* key, NSString* value); + NSString* KeyValue(NSString* key); + void RemoveKeyValue(NSString* key); + + void GenerateAndSendReport(); + + void SetFilterCallback(BreakpadFilterCallback callback, void* context) { + filter_callback_ = callback; + filter_callback_context_ = context; + } + + private: + Breakpad() + : handler_(NULL), + config_params_(NULL), + send_and_exit_(true), + filter_callback_(NULL), + filter_callback_context_(NULL) { + inspector_path_[0] = 0; + } + + bool Initialize(NSDictionary* parameters); + bool InitializeInProcess(NSDictionary* parameters); + bool InitializeOutOfProcess(NSDictionary* parameters); + + bool ExtractParameters(NSDictionary* parameters); + + // Dispatches to HandleException() + static bool ExceptionHandlerDirectCallback(void* context, + int exception_type, + int exception_code, + int exception_subcode, + mach_port_t crashing_thread); + + bool HandleException(int exception_type, + int exception_code, + int exception_subcode, + mach_port_t crashing_thread); + + // Dispatches to HandleMinidump(). + // This gets called instead of ExceptionHandlerDirectCallback when running + // with the BREAKPAD_IN_PROCESS option. + static bool HandleMinidumpCallback(const char* dump_dir, + const char* minidump_id, + void* context, + bool succeeded); + + // This is only used when BREAKPAD_IN_PROCESS is YES. + bool HandleMinidump(const char* dump_dir, const char* minidump_id); + + // Since ExceptionHandler (w/o namespace) is defined as typedef in OSX's + // MachineExceptions.h, we have to explicitly name the handler. + google_breakpad::ExceptionHandler* handler_; // The actual handler (STRONG) + + char inspector_path_[PATH_MAX]; // Path to inspector tool + + SimpleStringDictionary* config_params_; // Create parameters (STRONG) + + OnDemandServer inspector_; + + bool send_and_exit_; // Exit after sending, if true + + BreakpadFilterCallback filter_callback_; + void* filter_callback_context_; +}; + +#pragma mark - +#pragma mark Helper functions + +//============================================================================= +// Helper functions + +//============================================================================= +static BOOL IsDebuggerActive() { + BOOL result = NO; + NSUserDefaults* stdDefaults = [NSUserDefaults standardUserDefaults]; + + // We check both defaults and the environment variable here + + BOOL ignoreDebugger = [stdDefaults boolForKey:@IGNORE_DEBUGGER]; + + if (!ignoreDebugger) { + char* ignoreDebuggerStr = getenv(IGNORE_DEBUGGER); + ignoreDebugger = (ignoreDebuggerStr ? strtol(ignoreDebuggerStr, NULL, 10) : 0) != 0; + } + + if (!ignoreDebugger) { + pid_t pid = getpid(); + int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid}; + int mibSize = sizeof(mib) / sizeof(int); + size_t actualSize; + + if (sysctl(mib, mibSize, NULL, &actualSize, NULL, 0) == 0) { + struct kinfo_proc* info = (struct kinfo_proc*)malloc(actualSize); + + if (info) { + // This comes from looking at the Darwin xnu Kernel + if (sysctl(mib, mibSize, info, &actualSize, NULL, 0) == 0) + result = (info->kp_proc.p_flag & P_TRACED) ? YES : NO; + + free(info); + } + } + } + + return result; +} + +//============================================================================= +bool Breakpad::ExceptionHandlerDirectCallback(void* context, + int exception_type, + int exception_code, + int exception_subcode, + mach_port_t crashing_thread) { + Breakpad* breakpad = (Breakpad*)context; + + // If our context is damaged or something, just return false to indicate that + // the handler should continue without us. + if (!breakpad) + return false; + + return breakpad->HandleException( exception_type, + exception_code, + exception_subcode, + crashing_thread); +} + +//============================================================================= +bool Breakpad::HandleMinidumpCallback(const char* dump_dir, + const char* minidump_id, + void* context, + bool succeeded) { + Breakpad* breakpad = (Breakpad*)context; + + // If our context is damaged or something, just return false to indicate that + // the handler should continue without us. + if (!breakpad || !succeeded) + return false; + + return breakpad->HandleMinidump(dump_dir, minidump_id); +} + +//============================================================================= +#pragma mark - + +#include + +//============================================================================= +// Returns the pathname to the Resources directory for this version of +// Breakpad which we are now running. +// +// Don't make the function static, since _dyld_lookup_and_bind_fully needs a +// simple non-static C name +// +extern "C" { +NSString* GetResourcePath(); +NSString* GetResourcePath() { + NSString* resourcePath = nil; + + // If there are multiple breakpads installed then calling bundleWithIdentifier + // will not work properly, so only use that as a backup plan. + // We want to find the bundle containing the code where this function lives + // and work from there + // + + // Get the pathname to the code which contains this function + Dl_info info; + if (dladdr((const void*)GetResourcePath, &info) != 0) { + NSFileManager* filemgr = [NSFileManager defaultManager]; + NSString* filePath = + [filemgr stringWithFileSystemRepresentation:info.dli_fname + length:strlen(info.dli_fname)]; + NSString* bundlePath = [filePath stringByDeletingLastPathComponent]; + // The "Resources" directory should be in the same directory as the + // executable code, since that's how the Breakpad framework is built. + resourcePath = [bundlePath stringByAppendingPathComponent:@"Resources/"]; + } else { + // fallback plan + NSBundle* bundle = + [NSBundle bundleWithIdentifier:@"com.Google.BreakpadFramework"]; + resourcePath = [bundle resourcePath]; + } + + return resourcePath; +} +} // extern "C" + +//============================================================================= +bool Breakpad::Initialize(NSDictionary* parameters) { + // Initialize + config_params_ = NULL; + handler_ = NULL; + + // Check for debugger + if (IsDebuggerActive()) { + return true; + } + + // Gather any user specified parameters + if (!ExtractParameters(parameters)) { + return false; + } + + if ([[parameters objectForKey:@BREAKPAD_IN_PROCESS] boolValue]) + return InitializeInProcess(parameters); + else + return InitializeOutOfProcess(parameters); +} + +//============================================================================= +bool Breakpad::InitializeInProcess(NSDictionary* parameters) { + handler_ = + new (gBreakpadAllocator->Allocate( + sizeof(google_breakpad::ExceptionHandler))) + google_breakpad::ExceptionHandler( + config_params_->GetValueForKey(BREAKPAD_DUMP_DIRECTORY), + 0, &HandleMinidumpCallback, this, true, 0); + return true; +} + +//============================================================================= +bool Breakpad::InitializeOutOfProcess(NSDictionary* parameters) { + // Get path to Inspector executable. + NSString* inspectorPathString = KeyValue(@BREAKPAD_INSPECTOR_LOCATION); + + // Standardize path (resolve symlinkes, etc.) and escape spaces + inspectorPathString = [inspectorPathString stringByStandardizingPath]; + inspectorPathString = [[inspectorPathString componentsSeparatedByString:@" "] + componentsJoinedByString:@"\\ "]; + + // Create an on-demand server object representing the Inspector. + // In case of a crash, we simply need to call the LaunchOnDemand() + // method on it, then send a mach message to its service port. + // It will then launch and perform a process inspection of our crashed state. + // See the HandleException() method for the details. +#define RECEIVE_PORT_NAME "com.Breakpad.Inspector" + + name_t portName; + snprintf(portName, sizeof(name_t), "%s%d", RECEIVE_PORT_NAME, getpid()); + + // Save the location of the Inspector + strlcpy(inspector_path_, [inspectorPathString fileSystemRepresentation], + sizeof(inspector_path_)); + + // Append a single command-line argument to the Inspector path + // representing the bootstrap name of the launch-on-demand receive port. + // When the Inspector is launched, it can use this to lookup the port + // by calling bootstrap_check_in(). + strlcat(inspector_path_, " ", sizeof(inspector_path_)); + strlcat(inspector_path_, portName, sizeof(inspector_path_)); + + kern_return_t kr = inspector_.Initialize(inspector_path_, + portName, + true); // shutdown on exit + + if (kr != KERN_SUCCESS) { + return false; + } + + // Create the handler (allocating it in our special protected pool) + handler_ = + new (gBreakpadAllocator->Allocate( + sizeof(google_breakpad::ExceptionHandler))) + google_breakpad::ExceptionHandler( + Breakpad::ExceptionHandlerDirectCallback, this, true); + return true; +} + +//============================================================================= +Breakpad::~Breakpad() { + // Note that we don't use operator delete() on these pointers, + // since they were allocated by ProtectedMemoryAllocator objects. + // + if (config_params_) { + config_params_->~SimpleStringDictionary(); + } + + if (handler_) + handler_->~ExceptionHandler(); +} + +//============================================================================= +bool Breakpad::ExtractParameters(NSDictionary* parameters) { + NSUserDefaults* stdDefaults = [NSUserDefaults standardUserDefaults]; + NSString* skipConfirm = [stdDefaults stringForKey:@BREAKPAD_SKIP_CONFIRM]; + NSString* sendAndExit = [stdDefaults stringForKey:@BREAKPAD_SEND_AND_EXIT]; + + NSString* serverType = [parameters objectForKey:@BREAKPAD_SERVER_TYPE]; + NSString* display = [parameters objectForKey:@BREAKPAD_PRODUCT_DISPLAY]; + NSString* product = [parameters objectForKey:@BREAKPAD_PRODUCT]; + NSString* version = [parameters objectForKey:@BREAKPAD_VERSION]; + NSString* urlStr = [parameters objectForKey:@BREAKPAD_URL]; + NSString* interval = [parameters objectForKey:@BREAKPAD_REPORT_INTERVAL]; + NSString* inspectorPathString = + [parameters objectForKey:@BREAKPAD_INSPECTOR_LOCATION]; + NSString* reporterPathString = + [parameters objectForKey:@BREAKPAD_REPORTER_EXE_LOCATION]; + NSString* timeout = [parameters objectForKey:@BREAKPAD_CONFIRM_TIMEOUT]; + NSArray* logFilePaths = [parameters objectForKey:@BREAKPAD_LOGFILES]; + NSString* logFileTailSize = + [parameters objectForKey:@BREAKPAD_LOGFILE_UPLOAD_SIZE]; + NSString* requestUserText = + [parameters objectForKey:@BREAKPAD_REQUEST_COMMENTS]; + NSString* requestEmail = [parameters objectForKey:@BREAKPAD_REQUEST_EMAIL]; + NSString* vendor = + [parameters objectForKey:@BREAKPAD_VENDOR]; + NSString* dumpSubdirectory = + [parameters objectForKey:@BREAKPAD_DUMP_DIRECTORY]; + + NSDictionary* serverParameters = + [parameters objectForKey:@BREAKPAD_SERVER_PARAMETER_DICT]; + + // These may have been set above as user prefs, which take priority. + if (!skipConfirm) { + skipConfirm = [parameters objectForKey:@BREAKPAD_SKIP_CONFIRM]; + } + if (!sendAndExit) { + sendAndExit = [parameters objectForKey:@BREAKPAD_SEND_AND_EXIT]; + } + + if (!product) + product = [parameters objectForKey:@"CFBundleName"]; + + if (!display) { + display = [parameters objectForKey:@"CFBundleDisplayName"]; + if (!display) { + display = product; + } + } + + if (!version) + version = [parameters objectForKey:@"CFBundleVersion"]; + + if (!interval) + interval = @"3600"; + + if (!timeout) + timeout = @"300"; + + if (!logFileTailSize) + logFileTailSize = @"200000"; + + if (!vendor) { + vendor = @"Vendor not specified"; + } + + // Normalize the values. + if (skipConfirm) { + skipConfirm = [skipConfirm uppercaseString]; + + if ([skipConfirm isEqualToString:@"YES"] || + [skipConfirm isEqualToString:@"TRUE"] || + [skipConfirm isEqualToString:@"1"]) + skipConfirm = @"YES"; + else + skipConfirm = @"NO"; + } else { + skipConfirm = @"NO"; + } + + send_and_exit_ = true; + if (sendAndExit) { + sendAndExit = [sendAndExit uppercaseString]; + + if ([sendAndExit isEqualToString:@"NO"] || + [sendAndExit isEqualToString:@"FALSE"] || + [sendAndExit isEqualToString:@"0"]) + send_and_exit_ = false; + } + + if (requestUserText) { + requestUserText = [requestUserText uppercaseString]; + + if ([requestUserText isEqualToString:@"YES"] || + [requestUserText isEqualToString:@"TRUE"] || + [requestUserText isEqualToString:@"1"]) + requestUserText = @"YES"; + else + requestUserText = @"NO"; + } else { + requestUserText = @"NO"; + } + + // Find the helper applications if not specified in user config. + NSString* resourcePath = nil; + if (!inspectorPathString || !reporterPathString) { + resourcePath = GetResourcePath(); + if (!resourcePath) { + return false; + } + } + + // Find Inspector. + if (!inspectorPathString) { + inspectorPathString = + [resourcePath stringByAppendingPathComponent:@"Inspector"]; + } + + // Verify that there is an Inspector tool. + if (![[NSFileManager defaultManager] fileExistsAtPath:inspectorPathString]) { + return false; + } + + // Find Reporter. + if (!reporterPathString) { + reporterPathString = + [resourcePath + stringByAppendingPathComponent:@"crash_report_sender.app"]; + reporterPathString = + [[NSBundle bundleWithPath:reporterPathString] executablePath]; + } + + // Verify that there is a Reporter application. + if (![[NSFileManager defaultManager] + fileExistsAtPath:reporterPathString]) { + return false; + } + + if (!dumpSubdirectory) { + dumpSubdirectory = @""; + } + + // The product, version, and URL are required values. + if (![product length]) { + return false; + } + + if (![version length]) { + return false; + } + + if (![urlStr length]) { + return false; + } + + config_params_ = + new (gKeyValueAllocator->Allocate(sizeof(SimpleStringDictionary)) ) + SimpleStringDictionary(); + + SimpleStringDictionary& dictionary = *config_params_; + + dictionary.SetKeyValue(BREAKPAD_SERVER_TYPE, [serverType UTF8String]); + dictionary.SetKeyValue(BREAKPAD_PRODUCT_DISPLAY, [display UTF8String]); + dictionary.SetKeyValue(BREAKPAD_PRODUCT, [product UTF8String]); + dictionary.SetKeyValue(BREAKPAD_VERSION, [version UTF8String]); + dictionary.SetKeyValue(BREAKPAD_URL, [urlStr UTF8String]); + dictionary.SetKeyValue(BREAKPAD_REPORT_INTERVAL, [interval UTF8String]); + dictionary.SetKeyValue(BREAKPAD_SKIP_CONFIRM, [skipConfirm UTF8String]); + dictionary.SetKeyValue(BREAKPAD_CONFIRM_TIMEOUT, [timeout UTF8String]); + dictionary.SetKeyValue(BREAKPAD_INSPECTOR_LOCATION, + [inspectorPathString fileSystemRepresentation]); + dictionary.SetKeyValue(BREAKPAD_REPORTER_EXE_LOCATION, + [reporterPathString fileSystemRepresentation]); + dictionary.SetKeyValue(BREAKPAD_LOGFILE_UPLOAD_SIZE, + [logFileTailSize UTF8String]); + dictionary.SetKeyValue(BREAKPAD_REQUEST_COMMENTS, + [requestUserText UTF8String]); + dictionary.SetKeyValue(BREAKPAD_REQUEST_EMAIL, [requestEmail UTF8String]); + dictionary.SetKeyValue(BREAKPAD_VENDOR, [vendor UTF8String]); + dictionary.SetKeyValue(BREAKPAD_DUMP_DIRECTORY, + [dumpSubdirectory UTF8String]); + + struct timeval tv; + gettimeofday(&tv, NULL); + char timeStartedString[32]; + sprintf(timeStartedString, "%zd", tv.tv_sec); + dictionary.SetKeyValue(BREAKPAD_PROCESS_START_TIME, + timeStartedString); + + if (logFilePaths) { + char logFileKey[255]; + for(unsigned int i = 0; i < [logFilePaths count]; i++) { + sprintf(logFileKey,"%s%d", BREAKPAD_LOGFILE_KEY_PREFIX, i); + dictionary.SetKeyValue(logFileKey, + [[logFilePaths objectAtIndex:i] + fileSystemRepresentation]); + } + } + + if (serverParameters) { + // For each key-value pair, call BreakpadAddUploadParameter() + NSEnumerator* keyEnumerator = [serverParameters keyEnumerator]; + NSString* aParameter; + while ((aParameter = [keyEnumerator nextObject])) { + BreakpadAddUploadParameter(this, aParameter, + [serverParameters objectForKey:aParameter]); + } + } + return true; +} + +//============================================================================= +void Breakpad::SetKeyValue(NSString* key, NSString* value) { + // We allow nil values. This is the same as removing the keyvalue. + if (!config_params_ || !key) + return; + + config_params_->SetKeyValue([key UTF8String], [value UTF8String]); +} + +//============================================================================= +NSString* Breakpad::KeyValue(NSString* key) { + if (!config_params_ || !key) + return nil; + + const char* value = config_params_->GetValueForKey([key UTF8String]); + return value ? [NSString stringWithUTF8String:value] : nil; +} + +//============================================================================= +void Breakpad::RemoveKeyValue(NSString* key) { + if (!config_params_ || !key) return; + + config_params_->RemoveKey([key UTF8String]); +} + +//============================================================================= +void Breakpad::GenerateAndSendReport() { + config_params_->SetKeyValue(BREAKPAD_ON_DEMAND, "YES"); + HandleException(0, 0, 0, mach_thread_self()); + config_params_->SetKeyValue(BREAKPAD_ON_DEMAND, "NO"); +} + +//============================================================================= +bool Breakpad::HandleException(int exception_type, + int exception_code, + int exception_subcode, + mach_port_t crashing_thread) { + if (filter_callback_) { + bool should_handle = filter_callback_(exception_type, + exception_code, + crashing_thread, + filter_callback_context_); + if (!should_handle) return false; + } + + // We need to reset the memory protections to be read/write, + // since LaunchOnDemand() requires changing state. + gBreakpadAllocator->Unprotect(); + // Configure the server to launch when we message the service port. + // The reason we do this here, rather than at startup, is that we + // can leak a bootstrap service entry if this method is called and + // there never ends up being a crash. + inspector_.LaunchOnDemand(); + gBreakpadAllocator->Protect(); + + // The Inspector should send a message to this port to verify it + // received our information and has finished the inspection. + ReceivePort acknowledge_port; + + // Send initial information to the Inspector. + MachSendMessage message(kMsgType_InspectorInitialInfo); + message.AddDescriptor(mach_task_self()); // our task + message.AddDescriptor(crashing_thread); // crashing thread + message.AddDescriptor(mach_thread_self()); // exception-handling thread + message.AddDescriptor(acknowledge_port.GetPort());// message receive port + + InspectorInfo info; + info.exception_type = exception_type; + info.exception_code = exception_code; + info.exception_subcode = exception_subcode; + info.parameter_count = config_params_->GetCount(); + message.SetData(&info, sizeof(info)); + + MachPortSender sender(inspector_.GetServicePort()); + + kern_return_t result = sender.SendMessage(message, 2000); + + if (result == KERN_SUCCESS) { + // Now, send a series of key-value pairs to the Inspector. + const SimpleStringDictionary::Entry* entry = NULL; + SimpleStringDictionary::Iterator iter(*config_params_); + + while ( (entry = iter.Next()) ) { + KeyValueMessageData keyvalue_data(*entry); + + MachSendMessage keyvalue_message(kMsgType_InspectorKeyValuePair); + keyvalue_message.SetData(&keyvalue_data, sizeof(keyvalue_data)); + + result = sender.SendMessage(keyvalue_message, 2000); + + if (result != KERN_SUCCESS) { + break; + } + } + + if (result == KERN_SUCCESS) { + // Wait for acknowledgement that the inspection has finished. + MachReceiveMessage acknowledge_messsage; + result = acknowledge_port.WaitForMessage(&acknowledge_messsage, 5000); + } + } + +#if VERBOSE + PRINT_MACH_RESULT(result, "Breakpad: SendMessage "); + printf("Breakpad: Inspector service port = %#x\n", + inspector_.GetServicePort()); +#endif + + // If we don't want any forwarding, return true here to indicate that we've + // processed things as much as we want. + if (send_and_exit_) return true; + + return false; +} + +//============================================================================= +bool Breakpad::HandleMinidump(const char* dump_dir, const char* minidump_id) { + google_breakpad::ConfigFile config_file; + config_file.WriteFile(dump_dir, config_params_, dump_dir, minidump_id); + google_breakpad::LaunchReporter( + config_params_->GetValueForKey(BREAKPAD_REPORTER_EXE_LOCATION), + config_file.GetFilePath()); + return true; +} + +//============================================================================= +//============================================================================= + +#pragma mark - +#pragma mark Public API + +//============================================================================= +BreakpadRef BreakpadCreate(NSDictionary* parameters) { + try { + // This is confusing. Our two main allocators for breakpad memory are: + // - gKeyValueAllocator for the key/value memory + // - gBreakpadAllocator for the Breakpad, ExceptionHandler, and other + // breakpad allocations which are accessed at exception handling time. + // + // But in order to avoid these two allocators themselves from being smashed, + // we'll protect them as well by allocating them with gMasterAllocator. + // + // gMasterAllocator itself will NOT be protected, but this doesn't matter, + // since once it does its allocations and locks the memory, smashes to itself + // don't affect anything we care about. + gMasterAllocator = + new ProtectedMemoryAllocator(sizeof(ProtectedMemoryAllocator) * 2); + + gKeyValueAllocator = + new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator))) + ProtectedMemoryAllocator(sizeof(SimpleStringDictionary)); + + // Create a mutex for use in accessing the SimpleStringDictionary + int mutexResult = pthread_mutex_init(&gDictionaryMutex, NULL); + if (mutexResult == 0) { + + // With the current compiler, gBreakpadAllocator is allocating 1444 bytes. + // Let's round up to the nearest page size. + // + int breakpad_pool_size = 4096; + + /* + sizeof(Breakpad) + + sizeof(google_breakpad::ExceptionHandler) + + sizeof( STUFF ALLOCATED INSIDE ExceptionHandler ) + */ + + gBreakpadAllocator = + new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator))) + ProtectedMemoryAllocator(breakpad_pool_size); + + // Stack-based autorelease pool for Breakpad::Create() obj-c code. + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + Breakpad* breakpad = Breakpad::Create(parameters); + + if (breakpad) { + // Make read-only to protect against memory smashers + gMasterAllocator->Protect(); + gKeyValueAllocator->Protect(); + gBreakpadAllocator->Protect(); + // Can uncomment this line to figure out how much space was actually + // allocated using this allocator + // printf("gBreakpadAllocator allocated size = %d\n", + // gBreakpadAllocator->GetAllocatedSize() ); + [pool release]; + return (BreakpadRef)breakpad; + } + + [pool release]; + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadCreate() : error\n"); + } + + if (gKeyValueAllocator) { + gKeyValueAllocator->~ProtectedMemoryAllocator(); + gKeyValueAllocator = NULL; + } + + if (gBreakpadAllocator) { + gBreakpadAllocator->~ProtectedMemoryAllocator(); + gBreakpadAllocator = NULL; + } + + delete gMasterAllocator; + gMasterAllocator = NULL; + + return NULL; +} + +//============================================================================= +void BreakpadRelease(BreakpadRef ref) { + try { + Breakpad* breakpad = (Breakpad*)ref; + + if (gMasterAllocator) { + gMasterAllocator->Unprotect(); + gKeyValueAllocator->Unprotect(); + gBreakpadAllocator->Unprotect(); + + breakpad->~Breakpad(); + + // Unfortunately, it's not possible to deallocate this stuff + // because the exception handling thread is still finishing up + // asynchronously at this point... OK, it could be done with + // locks, etc. But since BreakpadRelease() should usually only + // be called right before the process exits, it's not worth + // deallocating this stuff. +#if 0 + gKeyValueAllocator->~ProtectedMemoryAllocator(); + gBreakpadAllocator->~ProtectedMemoryAllocator(); + delete gMasterAllocator; + + gMasterAllocator = NULL; + gKeyValueAllocator = NULL; + gBreakpadAllocator = NULL; +#endif + + pthread_mutex_destroy(&gDictionaryMutex); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadRelease() : error\n"); + } +} + +//============================================================================= +void BreakpadSetKeyValue(BreakpadRef ref, NSString* key, NSString* value) { + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad && key && gKeyValueAllocator) { + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + breakpad->SetKeyValue(key, value); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadSetKeyValue() : error\n"); + } +} + +void BreakpadAddUploadParameter(BreakpadRef ref, + NSString* key, + NSString* value) { + // The only difference, internally, between an upload parameter and + // a key value one that is set with BreakpadSetKeyValue is that we + // prepend the keyname with a special prefix. This informs the + // crash sender that the parameter should be sent along with the + // POST of the crash dump upload. + try { + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad && key && gKeyValueAllocator) { + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + NSString* prefixedKey = [@BREAKPAD_SERVER_PARAMETER_PREFIX + stringByAppendingString:key]; + breakpad->SetKeyValue(prefixedKey, value); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadSetKeyValue() : error\n"); + } +} + +void BreakpadRemoveUploadParameter(BreakpadRef ref, + NSString* key) { + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad && key && gKeyValueAllocator) { + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + NSString* prefixedKey = [NSString stringWithFormat:@"%@%@", + @BREAKPAD_SERVER_PARAMETER_PREFIX, key]; + breakpad->RemoveKeyValue(prefixedKey); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadRemoveKeyValue() : error\n"); + } +} +//============================================================================= +NSString* BreakpadKeyValue(BreakpadRef ref, NSString* key) { + NSString* value = nil; + + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (!breakpad || !key || !gKeyValueAllocator) + return nil; + + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + value = breakpad->KeyValue(key); + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadKeyValue() : error\n"); + } + + return value; +} + +//============================================================================= +void BreakpadRemoveKeyValue(BreakpadRef ref, NSString* key) { + try { + // Not called at exception time + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad && key && gKeyValueAllocator) { + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + breakpad->RemoveKeyValue(key); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadRemoveKeyValue() : error\n"); + } +} + +//============================================================================= +void BreakpadGenerateAndSendReport(BreakpadRef ref) { + try { + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad && gKeyValueAllocator) { + ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator); + + gBreakpadAllocator->Unprotect(); + breakpad->GenerateAndSendReport(); + gBreakpadAllocator->Protect(); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadGenerateAndSendReport() : error\n"); + } +} + +//============================================================================= +void BreakpadSetFilterCallback(BreakpadRef ref, + BreakpadFilterCallback callback, + void* context) { + + try { + Breakpad* breakpad = (Breakpad*)ref; + + if (breakpad && gBreakpadAllocator) { + // share the dictionary mutex here (we really don't need a mutex) + ProtectedMemoryLocker locker(&gDictionaryMutex, gBreakpadAllocator); + + breakpad->SetFilterCallback(callback, context); + } + } catch(...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadSetFilterCallback() : error\n"); + } +} + +//============================================================================ +void BreakpadAddLogFile(BreakpadRef ref, NSString* logPathname) { + int logFileCounter = 0; + + NSString* logFileKey = [NSString stringWithFormat:@"%@%d", + @BREAKPAD_LOGFILE_KEY_PREFIX, + logFileCounter]; + + NSString* existingLogFilename = nil; + existingLogFilename = BreakpadKeyValue(ref, logFileKey); + // Find the first log file key that we can use by testing for existence + while (existingLogFilename) { + if ([existingLogFilename isEqualToString:logPathname]) { + return; + } + logFileCounter++; + logFileKey = [NSString stringWithFormat:@"%@%d", + @BREAKPAD_LOGFILE_KEY_PREFIX, + logFileCounter]; + existingLogFilename = BreakpadKeyValue(ref, logFileKey); + } + + BreakpadSetKeyValue(ref, logFileKey, logPathname); +} diff --git a/src/client/mac/Framework/Breakpad_Prefix.pch b/src/client/mac/Framework/Breakpad_Prefix.pch new file mode 100644 index 0000000..7298666 --- /dev/null +++ b/src/client/mac/Framework/Breakpad_Prefix.pch @@ -0,0 +1,8 @@ +// +// Prefix header for all source files of the 'Breakpad' target in the +// 'Breakpad' project. +// + +#ifdef __OBJC__ + #import +#endif diff --git a/src/client/mac/Framework/Info.plist b/src/client/mac/Framework/Info.plist new file mode 100644 index 0000000..e43badd --- /dev/null +++ b/src/client/mac/Framework/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleName + ${PRODUCT_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.googlecode.google-breakpad + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSPrincipalClass + + + diff --git a/src/client/mac/Framework/OnDemandServer.h b/src/client/mac/Framework/OnDemandServer.h new file mode 100644 index 0000000..e7a52e7 --- /dev/null +++ b/src/client/mac/Framework/OnDemandServer.h @@ -0,0 +1,144 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include +#include +#include +#include +#include +#include + +//============================================================================== +// class OnDemandServer : +// A basic on-demand server launcher supporting a single named service port +// +// Example Usage : +// +// kern_return_t result; +// OnDemandServer* server = OnDemandServer::Create("/tmp/myserver", +// "com.MyCompany.MyServiceName", +// true, +// &result); +// +// if (server) { +// server->LaunchOnDemand(); +// mach_port_t service_port = GetServicePort(); +// +// // Send a mach message to service_port and "myserver" will be launched +// } +// +// +// ---- Now in the server code ---- +// +// // "myserver" should get the service port and read the message which +// // launched it: +// mach_port_t service_rcv_port_; +// kern_return_t kr = bootstrap_check_in(bootstrap_port, +// "com.MyCompany.MyServiceName", +// &service_rcv_port_); +// // mach_msg() read service_rcv_port_ .... +// +// .... +// +// // Later "myserver" may want to unregister the service if it doesn't +// // want its bootstrap service to stick around after it exits. +// +// // DO NOT use mach_port_deallocate() here -- it will fail and the +// // following bootstrap_register() will also fail leaving our service +// // name hanging around forever (until reboot) +// kern_return_t kr = mach_port_destroy(mach_task_self(), service_rcv_port_); +// +// kr = bootstrap_register(bootstrap_port, +// "com.MyCompany.MyServiceName", +// MACH_PORT_NULL); + +class OnDemandServer { + public: + // must call Initialize() to be useful + OnDemandServer() + : server_port_(MACH_PORT_NULL), + service_port_(MACH_PORT_NULL), + unregister_on_cleanup_(true) { + } + + // Creates the bootstrap server and service + kern_return_t Initialize(const char* server_command, + const char* service_name, + bool unregister_on_cleanup); + + // Returns an OnDemandServer object if successful, or NULL if there's + // an error. The error result will be returned in out_result. + // + // server_command : the full path name including optional command-line + // arguments to the executable representing the server + // + // service_name : represents service name + // something like "com.company.ServiceName" + // + // unregister_on_cleanup : if true, unregisters the service name + // when the OnDemandServer is deleted -- unregistering will + // ONLY be possible if LaunchOnDemand() has NOT been called. + // If false, then the service will continue to be registered + // even after the current process quits. + // + // out_result : if non-NULL, returns the result + // this value will be KERN_SUCCESS if Create() returns non-NULL + // + static OnDemandServer* Create(const char *server_command, + const char* service_name, + bool unregister_on_cleanup, + kern_return_t* out_result); + + // Cleans up and if LaunchOnDemand() has not yet been called then + // the bootstrap service will be unregistered. + ~OnDemandServer(); + + // This must be called if we intend to commit to launching the server + // by sending a mach message to our service port. Do not call it otherwise + // or it will be difficult (impossible?) to unregister the service name. + void LaunchOnDemand(); + + // This is the port we need to send a mach message to after calling + // LaunchOnDemand(). Sending a message causing an immediate launch + // of the server + mach_port_t GetServicePort() { return service_port_; } + + private: + // Disallow copy constructor + OnDemandServer(const OnDemandServer&); + + // Cleans up and if LaunchOnDemand() has not yet been called then + // the bootstrap service will be unregistered. + void Unregister(); + + name_t service_name_; + + mach_port_t server_port_; + mach_port_t service_port_; + bool unregister_on_cleanup_; +}; diff --git a/src/client/mac/Framework/OnDemandServer.mm b/src/client/mac/Framework/OnDemandServer.mm new file mode 100644 index 0000000..d2f3a28 --- /dev/null +++ b/src/client/mac/Framework/OnDemandServer.mm @@ -0,0 +1,189 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "OnDemandServer.h" + +#import "Breakpad.h" +#include "common/mac/bootstrap_compat.h" + +#if DEBUG + #define PRINT_MACH_RESULT(result_, message_) \ + printf(message_"%s (%d)\n", mach_error_string(result_), result_ ); +#if defined(MAC_OS_X_VERSION_10_5) && \ + MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + #define PRINT_BOOTSTRAP_RESULT(result_, message_) \ + printf(message_"%s (%d)\n", bootstrap_strerror(result_), result_ ); +#else + #define PRINT_BOOTSTRAP_RESULT(result_, message_) \ + PRINT_MACH_RESULT(result_, message_) +#endif +#else + #define PRINT_MACH_RESULT(result_, message_) + #define PRINT_BOOTSTRAP_RESULT(result_, message_) +#endif + +//============================================================================== +OnDemandServer* OnDemandServer::Create(const char* server_command, + const char* service_name, + bool unregister_on_cleanup, + kern_return_t* out_result) { + OnDemandServer* server = new OnDemandServer(); + + if (!server) return NULL; + + kern_return_t result = server->Initialize(server_command, + service_name, + unregister_on_cleanup); + + if (out_result) { + *out_result = result; + } + + if (result == KERN_SUCCESS) { + return server; + } + + delete server; + return NULL; +} + +//============================================================================== +kern_return_t OnDemandServer::Initialize(const char* server_command, + const char* service_name, + bool unregister_on_cleanup) { + unregister_on_cleanup_ = unregister_on_cleanup; + + mach_port_t self_task = mach_task_self(); + + mach_port_t self_bootstrap_port; + kern_return_t kr = task_get_bootstrap_port(self_task, &self_bootstrap_port); + if (kr != KERN_SUCCESS) { + PRINT_MACH_RESULT(kr, "task_get_bootstrap_port(): "); + return kr; + } + + mach_port_t bootstrap_subset_port; + kr = bootstrap_subset(self_bootstrap_port, self_task, &bootstrap_subset_port); + if (kr != BOOTSTRAP_SUCCESS) { + PRINT_BOOTSTRAP_RESULT(kr, "bootstrap_subset(): "); + return kr; + } + + // The inspector will be invoked with its bootstrap port set to the subset, + // but the sender will need access to the original bootstrap port. Although + // the original port is the subset's parent, bootstrap_parent can't be used + // because it requires extra privileges. Stash the original bootstrap port + // in the subset by registering it under a known name. The inspector will + // recover this port and set it as its own bootstrap port in Inspector.mm + // Inspector::ResetBootstrapPort. + kr = breakpad::BootstrapRegister( + bootstrap_subset_port, + const_cast(BREAKPAD_BOOTSTRAP_PARENT_PORT), + self_bootstrap_port); + if (kr != BOOTSTRAP_SUCCESS) { + PRINT_BOOTSTRAP_RESULT(kr, "bootstrap_register(): "); + return kr; + } + + kr = bootstrap_create_server(bootstrap_subset_port, + const_cast(server_command), + geteuid(), // server uid + true, + &server_port_); + if (kr != BOOTSTRAP_SUCCESS) { + PRINT_BOOTSTRAP_RESULT(kr, "bootstrap_create_server(): "); + return kr; + } + + strlcpy(service_name_, service_name, sizeof(service_name_)); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + // Create a service called service_name, and return send rights to + // that port in service_port_. + kr = bootstrap_create_service(server_port_, + const_cast(service_name), + &service_port_); +#pragma clang diagnostic pop + if (kr != BOOTSTRAP_SUCCESS) { + PRINT_BOOTSTRAP_RESULT(kr, "bootstrap_create_service(): "); + + // perhaps the service has already been created - try to look it up + kr = bootstrap_look_up(self_bootstrap_port, (char*)service_name, + &service_port_); + + if (kr != BOOTSTRAP_SUCCESS) { + PRINT_BOOTSTRAP_RESULT(kr, "bootstrap_look_up(): "); + Unregister(); // clean up server port + return kr; + } + } + + return KERN_SUCCESS; +} + +//============================================================================== +OnDemandServer::~OnDemandServer() { + if (unregister_on_cleanup_) { + Unregister(); + } +} + +//============================================================================== +void OnDemandServer::LaunchOnDemand() { + // We need to do this, since the launched server is another process + // and holding on to this port delays launching until the current process + // exits! + mach_port_deallocate(mach_task_self(), server_port_); + server_port_ = MACH_PORT_DEAD; + + // Now, the service is still registered and all we need to do is send + // a mach message to the service port in order to launch the server. +} + +//============================================================================== +void OnDemandServer::Unregister() { + if (service_port_ != MACH_PORT_NULL) { + mach_port_deallocate(mach_task_self(), service_port_); + service_port_ = MACH_PORT_NULL; + } + + if (server_port_ != MACH_PORT_NULL) { + // unregister the service + kern_return_t kr = breakpad::BootstrapRegister(server_port_, + service_name_, + MACH_PORT_NULL); + + if (kr != KERN_SUCCESS) { + PRINT_MACH_RESULT(kr, "Breakpad UNREGISTER : bootstrap_register() : "); + } + + mach_port_deallocate(mach_task_self(), server_port_); + server_port_ = MACH_PORT_NULL; + } +} diff --git a/src/client/mac/UnitTests-Info.plist b/src/client/mac/UnitTests-Info.plist new file mode 100644 index 0000000..6501355 --- /dev/null +++ b/src/client/mac/UnitTests-Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.yourcompany.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/src/client/mac/crash_generation/ConfigFile.h b/src/client/mac/crash_generation/ConfigFile.h new file mode 100644 index 0000000..4a4ed98 --- /dev/null +++ b/src/client/mac/crash_generation/ConfigFile.h @@ -0,0 +1,82 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Utility class that can persist a SimpleStringDictionary to disk. + +#import + +#include "common/simple_string_dictionary.h" + +namespace google_breakpad { + +BOOL EnsureDirectoryPathExists(NSString* dirPath); + +//============================================================================= +class ConfigFile { + public: + ConfigFile() { + config_file_ = -1; + config_file_path_[0] = 0; + has_created_file_ = false; + } + + ~ConfigFile() { + } + + void WriteFile(const char* directory, + const SimpleStringDictionary* configurationParameters, + const char* dump_dir, + const char* minidump_id); + + const char* GetFilePath() { return config_file_path_; } + + void Unlink() { + if (config_file_ != -1) + unlink(config_file_path_); + + config_file_ = -1; + } + + private: + BOOL WriteData(const void* data, size_t length); + + BOOL AppendConfigData(const char* key, + const void* data, + size_t length); + + BOOL AppendConfigString(const char* key, + const char* value); + + BOOL AppendCrashTimeParameters(const char* processStartTimeString); + + int config_file_; // descriptor for config file + char config_file_path_[PATH_MAX]; // Path to configuration file + bool has_created_file_; +}; + +} // namespace google_breakpad diff --git a/src/client/mac/crash_generation/ConfigFile.mm b/src/client/mac/crash_generation/ConfigFile.mm new file mode 100644 index 0000000..fe89e85 --- /dev/null +++ b/src/client/mac/crash_generation/ConfigFile.mm @@ -0,0 +1,167 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Utility class that can persist a SimpleStringDictionary to disk. + +#import "client/mac/crash_generation/ConfigFile.h" + +#import +#include +#include + +#import "client/apple/Framework/BreakpadDefines.h" +#import "common/mac/GTMDefines.h" + + +namespace google_breakpad { + +//============================================================================= +BOOL EnsureDirectoryPathExists(NSString* dirPath) { + NSFileManager* mgr = [NSFileManager defaultManager]; + + NSDictionary* attrs = + [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedLong:0750] + forKey:NSFilePosixPermissions]; + + return [mgr createDirectoryAtPath:dirPath + withIntermediateDirectories:YES + attributes:attrs + error:nil]; +} + +//============================================================================= +BOOL ConfigFile::WriteData(const void* data, size_t length) { + size_t result = write(config_file_, data, length); + + return result == length; +} + +//============================================================================= +BOOL ConfigFile::AppendConfigData(const char* key, + const void* data, size_t length) { + assert(config_file_ != -1); + + if (!key) { + return NO; + } + + if (!data) { + return NO; + } + + // Write the key, \n, length of data (ascii integer), \n, data + char buffer[16]; + char nl = '\n'; + BOOL result = WriteData(key, strlen(key)); + + snprintf(buffer, sizeof(buffer) - 1, "\n%lu\n", length); + result &= WriteData(buffer, strlen(buffer)); + result &= WriteData(data, length); + result &= WriteData(&nl, 1); + return result; +} + +//============================================================================= +BOOL ConfigFile::AppendConfigString(const char* key, + const char* value) { + return AppendConfigData(key, value, strlen(value)); +} + +//============================================================================= +BOOL ConfigFile::AppendCrashTimeParameters(const char* processStartTimeString) { + // Set process uptime parameter + struct timeval tv; + gettimeofday(&tv, NULL); + + char processUptimeString[32], processCrashtimeString[32]; + // Set up time if we've received the start time. + if (processStartTimeString) { + time_t processStartTime = strtol(processStartTimeString, NULL, 10); + time_t processUptime = tv.tv_sec - processStartTime; + // Store the uptime in milliseconds. + snprintf(processUptimeString, sizeof(processUptimeString), "%llu", + static_cast(processUptime) * 1000); + if (!AppendConfigString(BREAKPAD_PROCESS_UP_TIME, processUptimeString)) + return false; + } + + snprintf(processCrashtimeString, sizeof(processCrashtimeString), "%llu", + static_cast(tv.tv_sec)); + return AppendConfigString(BREAKPAD_PROCESS_CRASH_TIME, + processCrashtimeString); +} + +//============================================================================= +void ConfigFile::WriteFile(const char* directory, + const SimpleStringDictionary* configurationParameters, + const char* dump_dir, + const char* minidump_id) { + + assert(config_file_ == -1); + + // Open and write out configuration file preamble + if (directory) { + snprintf(config_file_path_, sizeof(config_file_path_), "%s/Config-XXXXXX", + directory); + } else { + strlcpy(config_file_path_, "/tmp/Config-XXXXXX", + sizeof(config_file_path_)); + } + config_file_ = mkstemp(config_file_path_); + + if (config_file_ == -1) { + return; + } + + has_created_file_ = true; + + // Add the minidump dir + AppendConfigString(kReporterMinidumpDirectoryKey, dump_dir); + AppendConfigString(kReporterMinidumpIDKey, minidump_id); + + // Write out the configuration parameters + BOOL result = YES; + const SimpleStringDictionary& dictionary = *configurationParameters; + + const SimpleStringDictionary::Entry* entry = NULL; + SimpleStringDictionary::Iterator iter(dictionary); + + while ((entry = iter.Next())) { + result = AppendConfigString(entry->key, entry->value); + + if (!result) + break; + } + AppendCrashTimeParameters( + configurationParameters->GetValueForKey(BREAKPAD_PROCESS_START_TIME)); + + close(config_file_); + config_file_ = -1; +} + +} // namespace google_breakpad diff --git a/src/client/mac/crash_generation/Inspector.h b/src/client/mac/crash_generation/Inspector.h new file mode 100644 index 0000000..fb9240c --- /dev/null +++ b/src/client/mac/crash_generation/Inspector.h @@ -0,0 +1,161 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Interface file between the Breakpad.framework and +// the Inspector process. + +#include "common/simple_string_dictionary.h" + +#import +#include + +#import "client/mac/crash_generation/ConfigFile.h" +#import "client/mac/handler/minidump_generator.h" + + +// Types of mach messsages (message IDs) +enum { + kMsgType_InspectorInitialInfo = 0, // data is InspectorInfo + kMsgType_InspectorKeyValuePair = 1, // data is KeyValueMessageData + kMsgType_InspectorAcknowledgement = 2 // no data sent +}; + +// Initial information sent from the crashed process by +// Breakpad.framework to the Inspector process +// The mach message with this struct as data will also include +// several descriptors for sending mach port rights to the crashed +// task, etc. +struct InspectorInfo { + int exception_type; + int exception_code; + int exception_subcode; + unsigned int parameter_count; // key-value pairs +}; + +// Key/value message data to be sent to the Inspector +struct KeyValueMessageData { + public: + KeyValueMessageData() {} + explicit KeyValueMessageData( + const google_breakpad::SimpleStringDictionary::Entry& inEntry) { + strlcpy(key, inEntry.key, sizeof(key) ); + strlcpy(value, inEntry.value, sizeof(value) ); + } + + char key[google_breakpad::SimpleStringDictionary::key_size]; + char value[google_breakpad::SimpleStringDictionary::value_size]; +}; + +using std::string; +using google_breakpad::MinidumpGenerator; + +namespace google_breakpad { + +//============================================================================= +class MinidumpLocation { + public: + MinidumpLocation(NSString* minidumpDir) { + // Ensure that the path exists. Fallback to /tmp if unable to locate path. + assert(minidumpDir); + if (!EnsureDirectoryPathExists(minidumpDir)) { + minidumpDir = @"/tmp"; + } + + strlcpy(minidump_dir_path_, [minidumpDir fileSystemRepresentation], + sizeof(minidump_dir_path_)); + + // now generate a unique ID + string dump_path(minidump_dir_path_); + string next_minidump_id; + + string next_minidump_path_ = + (MinidumpGenerator::UniqueNameInDirectory(dump_path, &next_minidump_id)); + + strlcpy(minidump_id_, next_minidump_id.c_str(), sizeof(minidump_id_)); + } + + const char* GetPath() { return minidump_dir_path_; } + const char* GetID() { return minidump_id_; } + + private: + char minidump_dir_path_[PATH_MAX]; // Path to minidump directory + char minidump_id_[128]; +}; + +//============================================================================= +class Inspector { + public: + Inspector() {} + + // given a bootstrap service name, receives mach messages + // from a crashed process, then inspects it, creates a minidump file + // and asks the user if he wants to upload it to a server. + void Inspect(const char* receive_port_name); + + private: + // The Inspector is invoked with its bootstrap port set to the bootstrap + // subset established in OnDemandServer.mm OnDemandServer::Initialize. + // For proper communication with the system, the sender (which will inherit + // the Inspector's bootstrap port) needs the per-session bootstrap namespace + // available directly in its bootstrap port. OnDemandServer stashed this + // port into the subset namespace under a special name. ResetBootstrapPort + // recovers this port and switches this task to use it as its own bootstrap + // (ensuring that children like the sender will inherit it), and saves the + // subset in bootstrap_subset_port_ for use by ServiceCheckIn and + // ServiceCheckOut. + kern_return_t ResetBootstrapPort(); + + kern_return_t ServiceCheckIn(const char* receive_port_name); + kern_return_t ServiceCheckOut(const char* receive_port_name); + + kern_return_t ReadMessages(); + + bool InspectTask(); + kern_return_t SendAcknowledgement(); + + // The bootstrap port in which the inspector is registered and into which it + // must check in. + mach_port_t bootstrap_subset_port_; + + mach_port_t service_rcv_port_; + + int exception_type_; + int exception_code_; + int exception_subcode_; + mach_port_t remote_task_; + mach_port_t crashing_thread_; + mach_port_t handler_thread_; + mach_port_t ack_port_; + + SimpleStringDictionary config_params_; + + ConfigFile config_file_; +}; + + +} // namespace google_breakpad diff --git a/src/client/mac/crash_generation/Inspector.mm b/src/client/mac/crash_generation/Inspector.mm new file mode 100644 index 0000000..8d4e3e9 --- /dev/null +++ b/src/client/mac/crash_generation/Inspector.mm @@ -0,0 +1,361 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Utility that can inspect another process and write a crash dump + +#include +#include +#include +#include +#include +#include + +#import "client/mac/crash_generation/Inspector.h" + +#import "client/mac/Framework/Breakpad.h" +#import "client/mac/handler/minidump_generator.h" + +#import "common/mac/MachIPC.h" +#include "common/mac/bootstrap_compat.h" +#include "common/mac/launch_reporter.h" + +#import "GTMDefines.h" + +#import + +namespace google_breakpad { + +//============================================================================= +void Inspector::Inspect(const char* receive_port_name) { + kern_return_t result = ResetBootstrapPort(); + if (result != KERN_SUCCESS) { + return; + } + + result = ServiceCheckIn(receive_port_name); + + if (result == KERN_SUCCESS) { + result = ReadMessages(); + + if (result == KERN_SUCCESS) { + // Inspect the task and write a minidump file. + bool wrote_minidump = InspectTask(); + + // Send acknowledgement to the crashed process that the inspection + // has finished. It will then be able to cleanly exit. + // The return value is ignored because failure isn't fatal. If the process + // didn't get the message there's nothing we can do, and we still want to + // send the report. + SendAcknowledgement(); + + if (wrote_minidump) { + // Ask the user if he wants to upload the crash report to a server, + // and do so if he agrees. + LaunchReporter( + config_params_.GetValueForKey(BREAKPAD_REPORTER_EXE_LOCATION), + config_file_.GetFilePath()); + } else { + fprintf(stderr, "Inspection of crashed process failed\n"); + } + + // Now that we're done reading messages, cleanup the service, but only + // if there was an actual exception + // Otherwise, it means the dump was generated on demand and the process + // lives on, and we might be needed again in the future. + if (exception_code_) { + ServiceCheckOut(receive_port_name); + } + } else { + PRINT_MACH_RESULT(result, "Inspector: WaitForMessage()"); + } + } +} + +//============================================================================= +kern_return_t Inspector::ResetBootstrapPort() { + // A reasonable default, in case anything fails. + bootstrap_subset_port_ = bootstrap_port; + + mach_port_t self_task = mach_task_self(); + + kern_return_t kr = task_get_bootstrap_port(self_task, + &bootstrap_subset_port_); + if (kr != KERN_SUCCESS) { + NSLog(@"ResetBootstrapPort: task_get_bootstrap_port failed: %s (%d)", + mach_error_string(kr), kr); + return kr; + } + + mach_port_t bootstrap_parent_port; + kr = bootstrap_look_up(bootstrap_subset_port_, + const_cast(BREAKPAD_BOOTSTRAP_PARENT_PORT), + &bootstrap_parent_port); + if (kr != BOOTSTRAP_SUCCESS) { + NSLog(@"ResetBootstrapPort: bootstrap_look_up failed: %s (%d)", +#if defined(MAC_OS_X_VERSION_10_5) && \ + MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + bootstrap_strerror(kr), +#else + mach_error_string(kr), +#endif + kr); + return kr; + } + + kr = task_set_bootstrap_port(self_task, bootstrap_parent_port); + if (kr != KERN_SUCCESS) { + NSLog(@"ResetBootstrapPort: task_set_bootstrap_port failed: %s (%d)", + mach_error_string(kr), kr); + return kr; + } + + // Some things access the bootstrap port through this global variable + // instead of calling task_get_bootstrap_port. + bootstrap_port = bootstrap_parent_port; + + return KERN_SUCCESS; +} + +//============================================================================= +kern_return_t Inspector::ServiceCheckIn(const char* receive_port_name) { + // We need to get the mach port representing this service, so we can + // get information from the crashed process. + kern_return_t kr = bootstrap_check_in(bootstrap_subset_port_, + (char*)receive_port_name, + &service_rcv_port_); + + if (kr != KERN_SUCCESS) { +#if VERBOSE + PRINT_MACH_RESULT(kr, "Inspector: bootstrap_check_in()"); +#endif + } + + return kr; +} + +//============================================================================= +kern_return_t Inspector::ServiceCheckOut(const char* receive_port_name) { + // We're done receiving mach messages from the crashed process, + // so clean up a bit. + kern_return_t kr; + + // DO NOT use mach_port_deallocate() here -- it will fail and the + // following bootstrap_register() will also fail leaving our service + // name hanging around forever (until reboot) + kr = mach_port_destroy(mach_task_self(), service_rcv_port_); + + if (kr != KERN_SUCCESS) { + PRINT_MACH_RESULT(kr, + "Inspector: UNREGISTERING: service_rcv_port mach_port_deallocate()"); + return kr; + } + + // Unregister the service associated with the receive port. + kr = breakpad::BootstrapRegister(bootstrap_subset_port_, + (char*)receive_port_name, + MACH_PORT_NULL); + + if (kr != KERN_SUCCESS) { + PRINT_MACH_RESULT(kr, "Inspector: UNREGISTERING: bootstrap_register()"); + } + + return kr; +} + +//============================================================================= +kern_return_t Inspector::ReadMessages() { + // Wait for an initial message from the crashed process containing basic + // information about the crash. + ReceivePort receive_port(service_rcv_port_); + + MachReceiveMessage message; + kern_return_t result = receive_port.WaitForMessage(&message, 1000); + + if (result == KERN_SUCCESS) { + InspectorInfo& info = (InspectorInfo&)*message.GetData(); + exception_type_ = info.exception_type; + exception_code_ = info.exception_code; + exception_subcode_ = info.exception_subcode; + +#if VERBOSE + printf("message ID = %d\n", message.GetMessageID()); +#endif + + remote_task_ = message.GetTranslatedPort(0); + crashing_thread_ = message.GetTranslatedPort(1); + handler_thread_ = message.GetTranslatedPort(2); + ack_port_ = message.GetTranslatedPort(3); + +#if VERBOSE + printf("exception_type = %d\n", exception_type_); + printf("exception_code = %d\n", exception_code_); + printf("exception_subcode = %d\n", exception_subcode_); + printf("remote_task = %d\n", remote_task_); + printf("crashing_thread = %d\n", crashing_thread_); + printf("handler_thread = %d\n", handler_thread_); + printf("ack_port_ = %d\n", ack_port_); + printf("parameter count = %d\n", info.parameter_count); +#endif + + // In certain situations where multiple crash requests come + // through quickly, we can end up with the mach IPC messages not + // coming through correctly. Since we don't know what parameters + // we've missed, we can't do much besides abort the crash dump + // situation in this case. + unsigned int parameters_read = 0; + // The initial message contains the number of key value pairs that + // we are expected to read. + // Read each key/value pair, one mach message per key/value pair. + for (unsigned int i = 0; i < info.parameter_count; ++i) { + MachReceiveMessage parameter_message; + result = receive_port.WaitForMessage(¶meter_message, 1000); + + if(result == KERN_SUCCESS) { + KeyValueMessageData& key_value_data = + (KeyValueMessageData&)*parameter_message.GetData(); + // If we get a blank key, make sure we don't increment the + // parameter count; in some cases (notably on-demand generation + // many times in a short period of time) caused the Mach IPC + // messages to not come through correctly. + if (strlen(key_value_data.key) == 0) { + continue; + } + parameters_read++; + + config_params_.SetKeyValue(key_value_data.key, key_value_data.value); + } else { + PRINT_MACH_RESULT(result, "Inspector: key/value message"); + break; + } + } + if (parameters_read != info.parameter_count) { + return KERN_FAILURE; + } + } + + return result; +} + +//============================================================================= +bool Inspector::InspectTask() { + // keep the task quiet while we're looking at it + task_suspend(remote_task_); + + NSString* minidumpDir; + + const char* minidumpDirectory = + config_params_.GetValueForKey(BREAKPAD_DUMP_DIRECTORY); + + // If the client app has not specified a minidump directory, + // use a default of Library// + if (!minidumpDirectory || 0 == strlen(minidumpDirectory)) { + NSArray* libraryDirectories = + NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, + NSUserDomainMask, + YES); + + NSString* applicationSupportDirectory = + [libraryDirectories objectAtIndex:0]; + NSString* library_subdirectory = [NSString + stringWithUTF8String:kDefaultLibrarySubdirectory]; + NSString* breakpad_product = [NSString + stringWithUTF8String:config_params_.GetValueForKey(BREAKPAD_PRODUCT)]; + + NSArray* path_components = [NSArray + arrayWithObjects:applicationSupportDirectory, + library_subdirectory, + breakpad_product, + nil]; + + minidumpDir = [NSString pathWithComponents:path_components]; + } else { + minidumpDir = [[NSString stringWithUTF8String:minidumpDirectory] + stringByExpandingTildeInPath]; + } + + MinidumpLocation minidumpLocation(minidumpDir); + + // Obscure bug alert: + // Don't use [NSString stringWithFormat] to build up the path here since it + // assumes system encoding and in RTL locales will prepend an LTR override + // character for paths beginning with '/' which fileSystemRepresentation does + // not remove. Filed as rdar://6889706 . + NSString* path_ns = [NSString + stringWithUTF8String:minidumpLocation.GetPath()]; + NSString* pathid_ns = [NSString + stringWithUTF8String:minidumpLocation.GetID()]; + NSString* minidumpPath = [path_ns stringByAppendingPathComponent:pathid_ns]; + minidumpPath = [minidumpPath + stringByAppendingPathExtension:@"dmp"]; + + config_file_.WriteFile( 0, + &config_params_, + minidumpLocation.GetPath(), + minidumpLocation.GetID()); + + + MinidumpGenerator generator(remote_task_, handler_thread_); + + if (exception_type_ && exception_code_) { + generator.SetExceptionInformation(exception_type_, + exception_code_, + exception_subcode_, + crashing_thread_); + } + + + bool result = generator.Write([minidumpPath fileSystemRepresentation]); + + // let the task continue + task_resume(remote_task_); + + return result; +} + +//============================================================================= +// The crashed task needs to be told that the inspection has finished. +// It will wait on a mach port (with timeout) until we send acknowledgement. +kern_return_t Inspector::SendAcknowledgement() { + if (ack_port_ != MACH_PORT_DEAD) { + MachPortSender sender(ack_port_); + MachSendMessage ack_message(kMsgType_InspectorAcknowledgement); + + kern_return_t result = sender.SendMessage(ack_message, 2000); + +#if VERBOSE + PRINT_MACH_RESULT(result, "Inspector: sent acknowledgement"); +#endif + + return result; + } + + return KERN_INVALID_NAME; +} + +} // namespace google_breakpad + diff --git a/src/client/mac/crash_generation/InspectorMain.mm b/src/client/mac/crash_generation/InspectorMain.mm new file mode 100644 index 0000000..fb3199d --- /dev/null +++ b/src/client/mac/crash_generation/InspectorMain.mm @@ -0,0 +1,64 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Main driver for Inspector + +#import "client/mac/crash_generation/Inspector.h" +#import + +namespace google_breakpad { + +//============================================================================= +extern "C" { + +int main(int argc, char *const argv[]) { +#if DEBUG + // Since we're launched on-demand, this is necessary to see debugging + // output in the console window. + freopen("/dev/console", "w", stdout); + freopen("/dev/console", "w", stderr); +#endif + + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + if (argc != 2) { + exit(0); + } + // Our first command-line argument contains the name of the service + // that we're providing. + google_breakpad::Inspector inspector; + inspector.Inspect(argv[1]); + + [pool release]; + + return 0; +} + +} // extern "C" + +} // namespace google_breakpad diff --git a/src/client/mac/crash_generation/client_info.h b/src/client/mac/crash_generation/client_info.h new file mode 100644 index 0000000..30870f1 --- /dev/null +++ b/src/client/mac/crash_generation/client_info.h @@ -0,0 +1,46 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_ +#define CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_ + +namespace google_breakpad { + +class ClientInfo { + public: + explicit ClientInfo(pid_t pid) : pid_(pid) {} + + pid_t pid() const { return pid_; } + + private: + pid_t pid_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_ diff --git a/src/client/mac/crash_generation/crash_generation_client.cc b/src/client/mac/crash_generation/crash_generation_client.cc new file mode 100644 index 0000000..7622ddd --- /dev/null +++ b/src/client/mac/crash_generation/crash_generation_client.cc @@ -0,0 +1,75 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/mac/crash_generation/crash_generation_client.h" + +#include "client/mac/crash_generation/crash_generation_server.h" +#include "common/mac/MachIPC.h" + +namespace google_breakpad { + +bool CrashGenerationClient::RequestDumpForException( + int exception_type, + int exception_code, + int exception_subcode, + mach_port_t crashing_thread) { + // The server will send a message to this port indicating that it + // has finished its work. + ReceivePort acknowledge_port; + + MachSendMessage message(kDumpRequestMessage); + message.AddDescriptor(mach_task_self()); // this task + message.AddDescriptor(crashing_thread); // crashing thread + message.AddDescriptor(mach_thread_self()); // handler thread + message.AddDescriptor(acknowledge_port.GetPort()); // message receive port + + ExceptionInfo info; + info.exception_type = exception_type; + info.exception_code = exception_code; + info.exception_subcode = exception_subcode; + message.SetData(&info, sizeof(info)); + + const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000; + kern_return_t result = sender_.SendMessage(message, kSendTimeoutMs); + if (result != KERN_SUCCESS) + return false; + + // Give the server slightly longer to reply since it has to + // inspect this task and write the minidump. + const mach_msg_timeout_t kReceiveTimeoutMs = 5 * 1000; + MachReceiveMessage acknowledge_message; + result = acknowledge_port.WaitForMessage(&acknowledge_message, + kReceiveTimeoutMs); + return result == KERN_SUCCESS; +} + +} // namespace google_breakpad diff --git a/src/client/mac/crash_generation/crash_generation_client.h b/src/client/mac/crash_generation/crash_generation_client.h new file mode 100644 index 0000000..06cc0a3 --- /dev/null +++ b/src/client/mac/crash_generation/crash_generation_client.h @@ -0,0 +1,64 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ +#define GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ + +#include "common/mac/MachIPC.h" + +namespace google_breakpad { + +class CrashGenerationClient { + public: + explicit CrashGenerationClient(const char* mach_port_name) + : sender_(mach_port_name) { + } + + // Request the crash server to generate a dump. + // + // Return true if the dump was successful; false otherwise. + bool RequestDumpForException(int exception_type, + int exception_code, + int exception_subcode, + mach_port_t crashing_thread); + + bool RequestDump() { + return RequestDumpForException(0, 0, 0, MACH_PORT_NULL); + } + + private: + MachPortSender sender_; + + // Prevent copy construction and assignment. + CrashGenerationClient(const CrashGenerationClient&); + CrashGenerationClient& operator=(const CrashGenerationClient&); +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ diff --git a/src/client/mac/crash_generation/crash_generation_server.cc b/src/client/mac/crash_generation/crash_generation_server.cc new file mode 100644 index 0000000..8d742f3 --- /dev/null +++ b/src/client/mac/crash_generation/crash_generation_server.cc @@ -0,0 +1,169 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/mac/crash_generation/crash_generation_server.h" + +#include + +#include "client/mac/crash_generation/client_info.h" +#include "client/mac/handler/minidump_generator.h" +#include "common/mac/scoped_task_suspend-inl.h" + +namespace google_breakpad { + +CrashGenerationServer::CrashGenerationServer( + const char* mach_port_name, + FilterCallback filter, + void* filter_context, + OnClientDumpRequestCallback dump_callback, + void* dump_context, + OnClientExitingCallback exit_callback, + void* exit_context, + bool generate_dumps, + const std::string& dump_path) + : filter_(filter), + filter_context_(filter_context), + dump_callback_(dump_callback), + dump_context_(dump_context), + exit_callback_(exit_callback), + exit_context_(exit_context), + generate_dumps_(generate_dumps), + dump_dir_(dump_path.empty() ? "/tmp" : dump_path), + started_(false), + receive_port_(mach_port_name), + mach_port_name_(mach_port_name) { +} + +CrashGenerationServer::~CrashGenerationServer() { + if (started_) + Stop(); +} + +bool CrashGenerationServer::Start() { + int thread_create_result = pthread_create(&server_thread_, NULL, + &WaitForMessages, this); + started_ = thread_create_result == 0; + return started_; +} + +bool CrashGenerationServer::Stop() { + if (!started_) + return false; + + // Send a quit message to the background thread, and then join it. + MachPortSender sender(mach_port_name_.c_str()); + MachSendMessage quit_message(kQuitMessage); + const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000; + kern_return_t result = sender.SendMessage(quit_message, kSendTimeoutMs); + if (result == KERN_SUCCESS) { + int thread_join_result = pthread_join(server_thread_, NULL); + started_ = thread_join_result != 0; + } + + return !started_; +} + +// static +void* CrashGenerationServer::WaitForMessages(void* server) { + CrashGenerationServer* self = + reinterpret_cast(server); + while (self->WaitForOneMessage()) {} + return NULL; +} + +bool CrashGenerationServer::WaitForOneMessage() { + MachReceiveMessage message; + kern_return_t result = receive_port_.WaitForMessage(&message, + MACH_MSG_TIMEOUT_NONE); + if (result == KERN_SUCCESS) { + switch (message.GetMessageID()) { + case kDumpRequestMessage: { + ExceptionInfo& info = (ExceptionInfo&)*message.GetData(); + + mach_port_t remote_task = message.GetTranslatedPort(0); + mach_port_t crashing_thread = message.GetTranslatedPort(1); + mach_port_t handler_thread = message.GetTranslatedPort(2); + mach_port_t ack_port = message.GetTranslatedPort(3); + pid_t remote_pid = -1; + pid_for_task(remote_task, &remote_pid); + ClientInfo client(remote_pid); + + bool result; + std::string dump_path; + if (generate_dumps_ && (!filter_ || filter_(filter_context_))) { + ScopedTaskSuspend suspend(remote_task); + + MinidumpGenerator generator(remote_task, handler_thread); + dump_path = generator.UniqueNameInDirectory(dump_dir_, NULL); + + if (info.exception_type && info.exception_code) { + generator.SetExceptionInformation(info.exception_type, + info.exception_code, + info.exception_subcode, + crashing_thread); + } + result = generator.Write(dump_path.c_str()); + } else { + result = true; + } + + if (result && dump_callback_) { + dump_callback_(dump_context_, client, dump_path); + } + + // TODO(ted): support a way for the client to send additional data, + // perhaps with a callback so users of the server can read the data + // themselves? + + if (ack_port != MACH_PORT_DEAD && ack_port != MACH_PORT_NULL) { + MachPortSender sender(ack_port); + MachSendMessage ack_message(kAcknowledgementMessage); + const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000; + + sender.SendMessage(ack_message, kSendTimeoutMs); + } + + if (exit_callback_) { + exit_callback_(exit_context_, client); + } + break; + } + case kQuitMessage: + return false; + } + } else { // result != KERN_SUCCESS + return false; + } + return true; +} + +} // namespace google_breakpad diff --git a/src/client/mac/crash_generation/crash_generation_server.h b/src/client/mac/crash_generation/crash_generation_server.h new file mode 100644 index 0000000..2c4b56c --- /dev/null +++ b/src/client/mac/crash_generation/crash_generation_server.h @@ -0,0 +1,149 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_ +#define GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_ + +#include + +#include + +#include "common/mac/MachIPC.h" + +namespace google_breakpad { + +class ClientInfo; + +// Messages the server can read via its mach port +enum { + kDumpRequestMessage = 1, + kAcknowledgementMessage = 2, + kQuitMessage = 3 +}; + +// Exception details sent by the client when requesting a dump. +struct ExceptionInfo { + int32_t exception_type; + int32_t exception_code; + int32_t exception_subcode; +}; + +class CrashGenerationServer { + public: + // WARNING: callbacks may be invoked on a different thread + // than that which creates the CrashGenerationServer. They must + // be thread safe. + typedef void (*OnClientDumpRequestCallback)(void* context, + const ClientInfo& client_info, + const std::string& file_path); + + typedef void (*OnClientExitingCallback)(void* context, + const ClientInfo& client_info); + // If a FilterCallback returns false, the dump will not be written. + typedef bool (*FilterCallback)(void* context); + + // Create an instance with the given parameters. + // + // mach_port_name: Named server port to listen on. + // filter: Callback for a client to cancel writing a dump. + // filter_context: Context for the filter callback. + // dump_callback: Callback for a client crash dump request. + // dump_context: Context for client crash dump request callback. + // exit_callback: Callback for client process exit. + // exit_context: Context for client exit callback. + // generate_dumps: Whether to automatically generate dumps. + // Client code of this class might want to generate dumps explicitly + // in the crash dump request callback. In that case, false can be + // passed for this parameter. + // dump_path: Path for generating dumps; required only if true is + // passed for generateDumps parameter; NULL can be passed otherwise. + CrashGenerationServer(const char* mach_port_name, + FilterCallback filter, + void* filter_context, + OnClientDumpRequestCallback dump_callback, + void* dump_context, + OnClientExitingCallback exit_callback, + void* exit_context, + bool generate_dumps, + const std::string& dump_path); + + ~CrashGenerationServer(); + + // Perform initialization steps needed to start listening to clients. + // + // Return true if initialization is successful; false otherwise. + bool Start(); + + // Stop the server. + bool Stop(); + + private: + // Return a unique filename at which a minidump can be written. + bool MakeMinidumpFilename(std::string& outFilename); + + // Loop reading client messages and responding to them until + // a quit message is received. + static void* WaitForMessages(void* server); + + // Wait for a single client message and respond to it. Returns false + // if a quit message was received or if an error occurred. + bool WaitForOneMessage(); + + FilterCallback filter_; + void* filter_context_; + + OnClientDumpRequestCallback dump_callback_; + void* dump_context_; + + OnClientExitingCallback exit_callback_; + void* exit_context_; + + bool generate_dumps_; + + std::string dump_dir_; + + bool started_; + + // The mach port that receives requests to dump from child processes. + ReceivePort receive_port_; + + // The name of the mach port. Stored so the Stop method can message + // the background thread to shut it down. + std::string mach_port_name_; + + // The thread that waits on the receive port. + pthread_t server_thread_; + + // Disable copy constructor and operator=. + CrashGenerationServer(const CrashGenerationServer&); + CrashGenerationServer& operator=(const CrashGenerationServer&); +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_ diff --git a/src/client/mac/handler/breakpad_nlist_64.cc b/src/client/mac/handler/breakpad_nlist_64.cc new file mode 100644 index 0000000..d59c7b0 --- /dev/null +++ b/src/client/mac/handler/breakpad_nlist_64.cc @@ -0,0 +1,403 @@ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + + +/* + * This file was copied from libc/gen/nlist.c from Darwin's source code + * The version of nlist used as a base is from 10.5.2, libc-498 + * http://www.opensource.apple.com/darwinsource/10.5.2/Libc-498/gen/nlist.c + * + * The full tarball is at: + * http://www.opensource.apple.com/darwinsource/tarballs/apsl/Libc-498.tar.gz + * + * I've modified it to be compatible with 64-bit images. +*/ + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "breakpad_nlist_64.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Stuff lifted from and since they are gone */ +/* + * Header prepended to each a.out file. + */ +struct exec { + unsigned short a_machtype; /* machine type */ + unsigned short a_magic; /* magic number */ + unsigned long a_text; /* size of text segment */ + unsigned long a_data; /* size of initialized data */ + unsigned long a_bss; /* size of uninitialized data */ + unsigned long a_syms; /* size of symbol table */ + unsigned long a_entry; /* entry point */ + unsigned long a_trsize; /* size of text relocation */ + unsigned long a_drsize; /* size of data relocation */ +}; + +#define OMAGIC 0407 /* old impure format */ +#define NMAGIC 0410 /* read-only text */ +#define ZMAGIC 0413 /* demand load format */ + +#define N_BADMAG(x) \ + (((x).a_magic)!=OMAGIC && ((x).a_magic)!=NMAGIC && ((x).a_magic)!=ZMAGIC) +#define N_TXTOFF(x) \ + ((x).a_magic==ZMAGIC ? 0 : sizeof (struct exec)) +#define N_SYMOFF(x) \ + (N_TXTOFF(x) + (x).a_text+(x).a_data + (x).a_trsize+(x).a_drsize) + +// Traits structs for specializing function templates to handle +// 32-bit/64-bit Mach-O files. +template +struct MachBits {}; + +typedef struct nlist nlist32; +typedef struct nlist_64 nlist64; + +template<> +struct MachBits { + typedef mach_header mach_header_type; + typedef uint32_t word_type; + static const uint32_t magic = MH_MAGIC; +}; + +template<> +struct MachBits { + typedef mach_header_64 mach_header_type; + typedef uint64_t word_type; + static const uint32_t magic = MH_MAGIC_64; +}; + +template +int +__breakpad_fdnlist(int fd, nlist_type* list, const char** symbolNames, + cpu_type_t cpu_type); + +/* + * nlist - retreive attributes from name list (string table version) + */ + +template +int breakpad_nlist_common(const char* name, + nlist_type* list, + const char** symbolNames, + cpu_type_t cpu_type) { + int fd = open(name, O_RDONLY, 0); + if (fd < 0) + return -1; + int n = __breakpad_fdnlist(fd, list, symbolNames, cpu_type); + close(fd); + return n; +} + +int breakpad_nlist(const char* name, + struct nlist* list, + const char** symbolNames, + cpu_type_t cpu_type) { + return breakpad_nlist_common(name, list, symbolNames, cpu_type); +} + +int breakpad_nlist(const char* name, + struct nlist_64* list, + const char** symbolNames, + cpu_type_t cpu_type) { + return breakpad_nlist_common(name, list, symbolNames, cpu_type); +} + +/* Note: __fdnlist() is called from kvm_nlist in libkvm's kvm.c */ + +template +int __breakpad_fdnlist(int fd, nlist_type* list, const char** symbolNames, + cpu_type_t cpu_type) { + typedef typename MachBits::mach_header_type mach_header_type; + typedef typename MachBits::word_type word_type; + + const uint32_t magic = MachBits::magic; + + int maxlen = 500; + int nreq = 0; + for (nlist_type* q = list; + symbolNames[q-list] && symbolNames[q-list][0]; + q++, nreq++) { + + q->n_type = 0; + q->n_value = 0; + q->n_desc = 0; + q->n_sect = 0; + q->n_un.n_strx = 0; + } + + struct exec buf; + if (read(fd, (char*)&buf, sizeof(buf)) != sizeof(buf) || + (N_BADMAG(buf) && *((uint32_t*)&buf) != magic && + CFSwapInt32BigToHost(*((uint32_t*)&buf)) != FAT_MAGIC && + /* The following is the big-endian ppc64 check */ + (*((uint32_t*)&buf)) != FAT_MAGIC)) { + return -1; + } + + /* Deal with fat file if necessary */ + unsigned arch_offset = 0; + if (CFSwapInt32BigToHost(*((uint32_t*)&buf)) == FAT_MAGIC || + /* The following is the big-endian ppc64 check */ + *((unsigned int*)&buf) == FAT_MAGIC) { + /* Read in the fat header */ + struct fat_header fh; + if (lseek(fd, 0, SEEK_SET) == -1) { + return -1; + } + if (read(fd, (char*)&fh, sizeof(fh)) != sizeof(fh)) { + return -1; + } + + /* Convert fat_narchs to host byte order */ + fh.nfat_arch = CFSwapInt32BigToHost(fh.nfat_arch); + + /* Read in the fat archs */ + struct fat_arch* fat_archs = + (struct fat_arch*)malloc(fh.nfat_arch * sizeof(struct fat_arch)); + if (fat_archs == NULL) { + return -1; + } + if (read(fd, (char*)fat_archs, + sizeof(struct fat_arch) * fh.nfat_arch) != + (ssize_t)(sizeof(struct fat_arch) * fh.nfat_arch)) { + free(fat_archs); + return -1; + } + + /* + * Convert archs to host byte ordering (a constraint of + * cpusubtype_getbestarch() + */ + for (unsigned i = 0; i < fh.nfat_arch; i++) { + fat_archs[i].cputype = + CFSwapInt32BigToHost(fat_archs[i].cputype); + fat_archs[i].cpusubtype = + CFSwapInt32BigToHost(fat_archs[i].cpusubtype); + fat_archs[i].offset = + CFSwapInt32BigToHost(fat_archs[i].offset); + fat_archs[i].size = + CFSwapInt32BigToHost(fat_archs[i].size); + fat_archs[i].align = + CFSwapInt32BigToHost(fat_archs[i].align); + } + + struct fat_arch* fap = NULL; + for (unsigned i = 0; i < fh.nfat_arch; i++) { + if (fat_archs[i].cputype == cpu_type) { + fap = &fat_archs[i]; + break; + } + } + + if (!fap) { + free(fat_archs); + return -1; + } + arch_offset = fap->offset; + free(fat_archs); + + /* Read in the beginning of the architecture-specific file */ + if (lseek(fd, arch_offset, SEEK_SET) == -1) { + return -1; + } + if (read(fd, (char*)&buf, sizeof(buf)) != sizeof(buf)) { + return -1; + } + } + + off_t sa; /* symbol address */ + off_t ss; /* start of strings */ + register_t n; + if (*((unsigned int*)&buf) == magic) { + if (lseek(fd, arch_offset, SEEK_SET) == -1) { + return -1; + } + mach_header_type mh; + if (read(fd, (char*)&mh, sizeof(mh)) != sizeof(mh)) { + return -1; + } + + struct load_command* load_commands = + (struct load_command*)malloc(mh.sizeofcmds); + if (load_commands == NULL) { + return -1; + } + if (read(fd, (char*)load_commands, mh.sizeofcmds) != + (ssize_t)mh.sizeofcmds) { + free(load_commands); + return -1; + } + struct symtab_command* stp = NULL; + struct load_command* lcp = load_commands; + // iterate through all load commands, looking for + // LC_SYMTAB load command + for (uint32_t i = 0; i < mh.ncmds; i++) { + if (lcp->cmdsize % sizeof(word_type) != 0 || + lcp->cmdsize <= 0 || + (char*)lcp + lcp->cmdsize > (char*)load_commands + mh.sizeofcmds) { + free(load_commands); + return -1; + } + if (lcp->cmd == LC_SYMTAB) { + if (lcp->cmdsize != sizeof(struct symtab_command)) { + free(load_commands); + return -1; + } + stp = (struct symtab_command*)lcp; + break; + } + lcp = (struct load_command*)((char*)lcp + lcp->cmdsize); + } + if (stp == NULL) { + free(load_commands); + return -1; + } + // sa points to the beginning of the symbol table + sa = stp->symoff + arch_offset; + // ss points to the beginning of the string table + ss = stp->stroff + arch_offset; + // n is the number of bytes in the symbol table + // each symbol table entry is an nlist structure + n = stp->nsyms * sizeof(nlist_type); + free(load_commands); + } else { + sa = N_SYMOFF(buf) + arch_offset; + ss = sa + buf.a_syms + arch_offset; + n = buf.a_syms; + } + + if (lseek(fd, sa, SEEK_SET) == -1) { + return -1; + } + + // the algorithm here is to read the nlist entries in m-sized + // chunks into q. q is then iterated over. for each entry in q, + // use the string table index(q->n_un.n_strx) to read the symbol + // name, then scan the nlist entries passed in by the user(via p), + // and look for a match + while (n) { + nlist_type space[BUFSIZ/sizeof (nlist_type)]; + register_t m = sizeof (space); + + if (n < m) + m = n; + if (read(fd, (char*)space, m) != m) + break; + n -= m; + off_t savpos = lseek(fd, 0, SEEK_CUR); + if (savpos == -1) { + return -1; + } + for (nlist_type* q = space; (m -= sizeof(nlist_type)) >= 0; q++) { + char nambuf[BUFSIZ]; + + if (q->n_un.n_strx == 0 || q->n_type & N_STAB) + continue; + + // seek to the location in the binary where the symbol + // name is stored & read it into memory + if (lseek(fd, ss+q->n_un.n_strx, SEEK_SET) == -1) { + return -1; + } + if (read(fd, nambuf, maxlen+1) == -1) { + return -1; + } + const char* s2 = nambuf; + for (nlist_type* p = list; + symbolNames[p-list] && symbolNames[p-list][0]; + p++) { + // get the symbol name the user has passed in that + // corresponds to the nlist entry that we're looking at + const char* s1 = symbolNames[p - list]; + while (*s1) { + if (*s1++ != *s2++) + goto cont; + } + if (*s2) + goto cont; + + p->n_value = q->n_value; + p->n_type = q->n_type; + p->n_desc = q->n_desc; + p->n_sect = q->n_sect; + p->n_un.n_strx = q->n_un.n_strx; + if (--nreq == 0) + return nreq; + + break; + cont: ; + } + } + if (lseek(fd, savpos, SEEK_SET) == -1) { + return -1; + } + } + return nreq; +} diff --git a/src/client/mac/handler/breakpad_nlist_64.h b/src/client/mac/handler/breakpad_nlist_64.h new file mode 100644 index 0000000..7093d28 --- /dev/null +++ b/src/client/mac/handler/breakpad_nlist_64.h @@ -0,0 +1,47 @@ +// Copyright 2008 Google LLC +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// breakpad_nlist.h +// +// This file is meant to provide a header for clients of the modified +// nlist function implemented to work on 64-bit. + +#ifndef CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__ +#define CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__ + +#include + +int breakpad_nlist(const char* name, + struct nlist* list, + const char** symbolNames, + cpu_type_t cpu_type); +int breakpad_nlist(const char* name, + struct nlist_64* list, + const char** symbolNames, + cpu_type_t cpu_type); + +#endif /* CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__ */ diff --git a/src/client/mac/handler/dynamic_images.cc b/src/client/mac/handler/dynamic_images.cc new file mode 100644 index 0000000..3db7467 --- /dev/null +++ b/src/client/mac/handler/dynamic_images.cc @@ -0,0 +1,576 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/mac/handler/dynamic_images.h" + +extern "C" { // needed to compile on Leopard + #include + #include + #include +} + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "breakpad_nlist_64.h" + +#if !TARGET_OS_IPHONE +#include + +#ifndef MAC_OS_X_VERSION_10_6 +#define MAC_OS_X_VERSION_10_6 1060 +#endif + +#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6 + +// Fallback declarations for TASK_DYLD_INFO and friends, introduced in +// in the Mac OS X 10.6 SDK. +#define TASK_DYLD_INFO 17 +struct task_dyld_info { + mach_vm_address_t all_image_info_addr; + mach_vm_size_t all_image_info_size; +}; +typedef struct task_dyld_info task_dyld_info_data_t; +typedef struct task_dyld_info* task_dyld_info_t; +#define TASK_DYLD_INFO_COUNT (sizeof(task_dyld_info_data_t) / sizeof(natural_t)) + +#endif + +#endif // !TARGET_OS_IPHONE + +namespace google_breakpad { + +using std::string; +using std::vector; + +//============================================================================== +// Returns the size of the memory region containing |address| and the +// number of bytes from |address| to the end of the region. +// We potentially, will extend the size of the original +// region by the size of the following region if it's contiguous with the +// first in order to handle cases when we're reading strings and they +// straddle two vm regions. +// +static mach_vm_size_t GetMemoryRegionSize(task_port_t target_task, + const uint64_t address, + mach_vm_size_t* size_to_end) { + mach_vm_address_t region_base = (mach_vm_address_t)address; + mach_vm_size_t region_size; + natural_t nesting_level = 0; + vm_region_submap_info_64 submap_info; + mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64; + + // Get information about the vm region containing |address| + vm_region_recurse_info_t region_info; + region_info = reinterpret_cast(&submap_info); + + kern_return_t result = + mach_vm_region_recurse(target_task, + ®ion_base, + ®ion_size, + &nesting_level, + region_info, + &info_count); + + if (result == KERN_SUCCESS) { + // Get distance from |address| to the end of this region + *size_to_end = region_base + region_size -(mach_vm_address_t)address; + + // If we want to handle strings as long as 4096 characters we may need + // to check if there's a vm region immediately following the first one. + // If so, we need to extend |*size_to_end| to go all the way to the end + // of the second region. + if (*size_to_end < 4096) { + // Second region starts where the first one ends + mach_vm_address_t region_base2 = + (mach_vm_address_t)(region_base + region_size); + mach_vm_size_t region_size2; + + // Get information about the following vm region + result = + mach_vm_region_recurse(target_task, + ®ion_base2, + ®ion_size2, + &nesting_level, + region_info, + &info_count); + + // Extend region_size to go all the way to the end of the 2nd region + if (result == KERN_SUCCESS + && region_base2 == region_base + region_size) { + region_size += region_size2; + } + } + + *size_to_end = region_base + region_size -(mach_vm_address_t)address; + } else { + region_size = 0; + *size_to_end = 0; + } + + return region_size; +} + +#define kMaxStringLength 8192 +//============================================================================== +// Reads a NULL-terminated string from another task. +// +// Warning! This will not read any strings longer than kMaxStringLength-1 +// +static string ReadTaskString(task_port_t target_task, + const uint64_t address) { + // The problem is we don't know how much to read until we know how long + // the string is. And we don't know how long the string is, until we've read + // the memory! So, we'll try to read kMaxStringLength bytes + // (or as many bytes as we can until we reach the end of the vm region). + mach_vm_size_t size_to_end; + GetMemoryRegionSize(target_task, address, &size_to_end); + + if (size_to_end > 0) { + mach_vm_size_t size_to_read = + size_to_end > kMaxStringLength ? kMaxStringLength : size_to_end; + + vector bytes; + if (ReadTaskMemory(target_task, address, (size_t)size_to_read, bytes) != + KERN_SUCCESS) + return string(); + + return string(reinterpret_cast(&bytes[0])); + } + + return string(); +} + +//============================================================================== +// Reads an address range from another task. The bytes read will be returned +// in bytes, which will be resized as necessary. +kern_return_t ReadTaskMemory(task_port_t target_task, + const uint64_t address, + size_t length, + vector& bytes) { + int systemPageSize = getpagesize(); + + // use the negative of the page size for the mask to find the page address + mach_vm_address_t page_address = address & (-systemPageSize); + + mach_vm_address_t last_page_address = + (address + length + (systemPageSize - 1)) & (-systemPageSize); + + mach_vm_size_t page_size = last_page_address - page_address; + uint8_t* local_start; + uint32_t local_length; + + kern_return_t r = mach_vm_read(target_task, + page_address, + page_size, + reinterpret_cast(&local_start), + &local_length); + + if (r != KERN_SUCCESS) + return r; + + bytes.resize(length); + memcpy(&bytes[0], + &local_start[(mach_vm_address_t)address - page_address], + length); + mach_vm_deallocate(mach_task_self(), (uintptr_t)local_start, local_length); + return KERN_SUCCESS; +} + +#pragma mark - + +//============================================================================== +// Traits structs for specializing function templates to handle +// 32-bit/64-bit Mach-O files. +struct MachO32 { + typedef mach_header mach_header_type; + typedef segment_command mach_segment_command_type; + typedef dyld_image_info32 dyld_image_info; + typedef dyld_all_image_infos32 dyld_all_image_infos; + typedef struct nlist nlist_type; + static const uint32_t magic = MH_MAGIC; + static const uint32_t segment_load_command = LC_SEGMENT; +}; + +struct MachO64 { + typedef mach_header_64 mach_header_type; + typedef segment_command_64 mach_segment_command_type; + typedef dyld_image_info64 dyld_image_info; + typedef dyld_all_image_infos64 dyld_all_image_infos; + typedef struct nlist_64 nlist_type; + static const uint32_t magic = MH_MAGIC_64; + static const uint32_t segment_load_command = LC_SEGMENT_64; +}; + +template +bool FindTextSection(DynamicImage& image) { + typedef typename MachBits::mach_header_type mach_header_type; + typedef typename MachBits::mach_segment_command_type + mach_segment_command_type; + + const mach_header_type* header = + reinterpret_cast(&image.header_[0]); + + if(header->magic != MachBits::magic) { + return false; + } + + const struct load_command* cmd = + reinterpret_cast(header + 1); + + bool found_text_section = false; + bool found_dylib_id_command = false; + for (unsigned int i = 0; cmd && (i < header->ncmds); ++i) { + if (!found_text_section) { + if (cmd->cmd == MachBits::segment_load_command) { + const mach_segment_command_type* seg = + reinterpret_cast(cmd); + + if (!strcmp(seg->segname, "__TEXT")) { + image.vmaddr_ = static_cast(seg->vmaddr); + image.vmsize_ = static_cast(seg->vmsize); + image.slide_ = 0; + + if (seg->fileoff == 0 && seg->filesize != 0) { + image.slide_ = + (uintptr_t)image.GetLoadAddress() - (uintptr_t)seg->vmaddr; + } + found_text_section = true; + } + } + } + + if (!found_dylib_id_command) { + if (cmd->cmd == LC_ID_DYLIB) { + const struct dylib_command* dc = + reinterpret_cast(cmd); + + image.version_ = dc->dylib.current_version; + found_dylib_id_command = true; + } + } + + if (found_dylib_id_command && found_text_section) { + return true; + } + + cmd = reinterpret_cast + (reinterpret_cast(cmd) + cmd->cmdsize); + } + + return false; +} + +//============================================================================== +// Initializes vmaddr_, vmsize_, and slide_ +void DynamicImage::CalculateMemoryAndVersionInfo() { + // unless we can process the header, ensure that calls to + // IsValid() will return false + vmaddr_ = 0; + vmsize_ = 0; + slide_ = 0; + version_ = 0; + + // The function template above does all the real work. + if (Is64Bit()) + FindTextSection(*this); + else + FindTextSection(*this); +} + +//============================================================================== +// The helper function template abstracts the 32/64-bit differences. +template +uint32_t GetFileTypeFromHeader(DynamicImage& image) { + typedef typename MachBits::mach_header_type mach_header_type; + + const mach_header_type* header = + reinterpret_cast(&image.header_[0]); + return header->filetype; +} + +uint32_t DynamicImage::GetFileType() { + if (Is64Bit()) + return GetFileTypeFromHeader(*this); + + return GetFileTypeFromHeader(*this); +} + +#pragma mark - + +//============================================================================== +// Loads information about dynamically loaded code in the given task. +DynamicImages::DynamicImages(mach_port_t task) + : task_(task), + cpu_type_(DetermineTaskCPUType(task)), + image_list_() { + ReadImageInfoForTask(); +} + +template +static uint64_t LookupSymbol(const char* symbol_name, + const char* filename, + cpu_type_t cpu_type) { + typedef typename MachBits::nlist_type nlist_type; + + nlist_type symbol_info[8] = {}; + const char* symbolNames[2] = { symbol_name, "\0" }; + nlist_type& list = symbol_info[0]; + int invalidEntriesCount = breakpad_nlist(filename, + &list, + symbolNames, + cpu_type); + + if(invalidEntriesCount != 0) { + return 0; + } + + assert(list.n_value); + return list.n_value; +} + +#if TARGET_OS_IPHONE || MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 +static bool HasTaskDyldInfo() { + return true; +} +#else +static SInt32 GetOSVersionInternal() { + SInt32 os_version = 0; + Gestalt(gestaltSystemVersion, &os_version); + return os_version; +} + +static SInt32 GetOSVersion() { + static SInt32 os_version = GetOSVersionInternal(); + return os_version; +} + +static bool HasTaskDyldInfo() { + return GetOSVersion() >= 0x1060; +} +#endif // TARGET_OS_IPHONE || MAC_OS_X_VERSION_MIN_REQUIRED >= 10_6 + +uint64_t DynamicImages::GetDyldAllImageInfosPointer() { + if (HasTaskDyldInfo()) { + task_dyld_info_data_t task_dyld_info; + mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT; + if (task_info(task_, TASK_DYLD_INFO, (task_info_t)&task_dyld_info, + &count) != KERN_SUCCESS) { + return 0; + } + + return (uint64_t)task_dyld_info.all_image_info_addr; + } else { + const char* imageSymbolName = "_dyld_all_image_infos"; + const char* dyldPath = "/usr/lib/dyld"; + + if (Is64Bit()) + return LookupSymbol(imageSymbolName, dyldPath, cpu_type_); + return LookupSymbol(imageSymbolName, dyldPath, cpu_type_); + } +} + +//============================================================================== +// This code was written using dyld_debug.c (from Darwin) as a guide. + +template +void ReadImageInfo(DynamicImages& images, + uint64_t image_list_address) { + typedef typename MachBits::dyld_image_info dyld_image_info; + typedef typename MachBits::dyld_all_image_infos dyld_all_image_infos; + typedef typename MachBits::mach_header_type mach_header_type; + + // Read the structure inside of dyld that contains information about + // loaded images. We're reading from the desired task's address space. + + // Here we make the assumption that dyld loaded at the same address in + // the crashed process vs. this one. This is an assumption made in + // "dyld_debug.c" and is said to be nearly always valid. + vector dyld_all_info_bytes; + if (ReadTaskMemory(images.task_, + image_list_address, + sizeof(dyld_all_image_infos), + dyld_all_info_bytes) != KERN_SUCCESS) + return; + + dyld_all_image_infos* dyldInfo = + reinterpret_cast(&dyld_all_info_bytes[0]); + + // number of loaded images + int count = dyldInfo->infoArrayCount; + + // Read an array of dyld_image_info structures each containing + // information about a loaded image. + vector dyld_info_array_bytes; + if (ReadTaskMemory(images.task_, + dyldInfo->infoArray, + count * sizeof(dyld_image_info), + dyld_info_array_bytes) != KERN_SUCCESS) + return; + + dyld_image_info* infoArray = + reinterpret_cast(&dyld_info_array_bytes[0]); + images.image_list_.reserve(count); + + for (int i = 0; i < count; ++i) { + dyld_image_info& info = infoArray[i]; + + // First read just the mach_header from the image in the task. + vector mach_header_bytes; + if (ReadTaskMemory(images.task_, + info.load_address_, + sizeof(mach_header_type), + mach_header_bytes) != KERN_SUCCESS) + continue; // bail on this dynamic image + + mach_header_type* header = + reinterpret_cast(&mach_header_bytes[0]); + + // Now determine the total amount necessary to read the header + // plus all of the load commands. + size_t header_size = + sizeof(mach_header_type) + header->sizeofcmds; + + if (ReadTaskMemory(images.task_, + info.load_address_, + header_size, + mach_header_bytes) != KERN_SUCCESS) + continue; + + // Read the file name from the task's memory space. + string file_path; + if (info.file_path_) { + // Although we're reading kMaxStringLength bytes, it's copied in the + // the DynamicImage constructor below with the correct string length, + // so it's not really wasting memory. + file_path = ReadTaskString(images.task_, info.file_path_); + } + + // Create an object representing this image and add it to our list. + DynamicImage* new_image; + new_image = new DynamicImage(&mach_header_bytes[0], + header_size, + info.load_address_, + file_path, + static_cast(info.file_mod_date_), + images.task_, + images.cpu_type_); + + if (new_image->IsValid()) { + images.image_list_.push_back(DynamicImageRef(new_image)); + } else { + delete new_image; + } + } + + // sorts based on loading address + sort(images.image_list_.begin(), images.image_list_.end()); + // remove duplicates - this happens in certain strange cases + // You can see it in DashboardClient when Google Gadgets plugin + // is installed. Apple's crash reporter log and gdb "info shared" + // both show the same library multiple times at the same address + + vector::iterator it = unique(images.image_list_.begin(), + images.image_list_.end()); + images.image_list_.erase(it, images.image_list_.end()); +} + +void DynamicImages::ReadImageInfoForTask() { + uint64_t imageList = GetDyldAllImageInfosPointer(); + + if (imageList) { + if (Is64Bit()) + ReadImageInfo(*this, imageList); + else + ReadImageInfo(*this, imageList); + } +} + +//============================================================================== +DynamicImage* DynamicImages::GetExecutableImage() { + int executable_index = GetExecutableImageIndex(); + + if (executable_index >= 0) { + return GetImage(executable_index); + } + + return NULL; +} + +//============================================================================== +// returns -1 if failure to find executable +int DynamicImages::GetExecutableImageIndex() { + int image_count = GetImageCount(); + + for (int i = 0; i < image_count; ++i) { + DynamicImage* image = GetImage(i); + if (image->GetFileType() == MH_EXECUTE) { + return i; + } + } + + return -1; +} + +//============================================================================== +// static +cpu_type_t DynamicImages::DetermineTaskCPUType(task_t task) { + if (task == mach_task_self()) + return GetNativeCPUType(); + + int mib[CTL_MAXNAME]; + size_t mibLen = CTL_MAXNAME; + int err = sysctlnametomib("sysctl.proc_cputype", mib, &mibLen); + if (err == 0) { + assert(mibLen < CTL_MAXNAME); + pid_for_task(task, &mib[mibLen]); + mibLen += 1; + + cpu_type_t cpu_type; + size_t cpuTypeSize = sizeof(cpu_type); + sysctl(mib, static_cast(mibLen), &cpu_type, &cpuTypeSize, 0, 0); + return cpu_type; + } + + return GetNativeCPUType(); +} + +} // namespace google_breakpad diff --git a/src/client/mac/handler/dynamic_images.h b/src/client/mac/handler/dynamic_images.h new file mode 100644 index 0000000..b5af758 --- /dev/null +++ b/src/client/mac/handler/dynamic_images.h @@ -0,0 +1,319 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dynamic_images.h +// +// Implements most of the function of the dyld API, but allowing an +// arbitrary task to be introspected, unlike the dyld API which +// only allows operation on the current task. The current implementation +// is limited to use by 32-bit tasks. + +#ifndef CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__ +#define CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__ + +#include +#include +#include +#include + +#include +#include + +#include "mach_vm_compat.h" + +namespace google_breakpad { + +using std::string; +using std::vector; + +//============================================================================== +// The memory layout of this struct matches the dyld_image_info struct +// defined in "dyld_gdb.h" in the darwin source. +typedef struct dyld_image_info32 { + uint32_t load_address_; // struct mach_header* + uint32_t file_path_; // char* + uint32_t file_mod_date_; +} dyld_image_info32; + +typedef struct dyld_image_info64 { + uint64_t load_address_; // struct mach_header* + uint64_t file_path_; // char* + uint64_t file_mod_date_; +} dyld_image_info64; + +//============================================================================== +// This is as defined in "dyld_gdb.h" in the darwin source. +// _dyld_all_image_infos (in dyld) is a structure of this type +// which will be used to determine which dynamic code has been loaded. +typedef struct dyld_all_image_infos32 { + uint32_t version; // == 1 in Mac OS X 10.4 + uint32_t infoArrayCount; + uint32_t infoArray; // const struct dyld_image_info* + uint32_t notification; + bool processDetachedFromSharedRegion; +} dyld_all_image_infos32; + +typedef struct dyld_all_image_infos64 { + uint32_t version; // == 1 in Mac OS X 10.4 + uint32_t infoArrayCount; + uint64_t infoArray; // const struct dyld_image_info* + uint64_t notification; + bool processDetachedFromSharedRegion; +} dyld_all_image_infos64; + +// some typedefs to isolate 64/32 bit differences +#ifdef __LP64__ +typedef mach_header_64 breakpad_mach_header; +typedef segment_command_64 breakpad_mach_segment_command; +#else +typedef mach_header breakpad_mach_header; +typedef segment_command breakpad_mach_segment_command; +#endif + +// Helper functions to deal with 32-bit/64-bit Mach-O differences. +class DynamicImage; +template +bool FindTextSection(DynamicImage& image); + +template +uint32_t GetFileTypeFromHeader(DynamicImage& image); + +//============================================================================== +// Represents a single dynamically loaded mach-o image +class DynamicImage { + public: + DynamicImage(uint8_t* header, // data is copied + size_t header_size, // includes load commands + uint64_t load_address, + string file_path, + uintptr_t image_mod_date, + mach_port_t task, + cpu_type_t cpu_type) + : header_(header, header + header_size), + header_size_(header_size), + load_address_(load_address), + vmaddr_(0), + vmsize_(0), + slide_(0), + version_(0), + file_path_(file_path), + file_mod_date_(image_mod_date), + task_(task), + cpu_type_(cpu_type) { + CalculateMemoryAndVersionInfo(); + } + + // Size of mach_header plus load commands + size_t GetHeaderSize() const {return header_.size();} + + // Full path to mach-o binary + string GetFilePath() {return file_path_;} + + uint64_t GetModDate() const {return file_mod_date_;} + + // Actual address where the image was loaded + uint64_t GetLoadAddress() const {return load_address_;} + + // Address where the image should be loaded + mach_vm_address_t GetVMAddr() const {return vmaddr_;} + + // Difference between GetLoadAddress() and GetVMAddr() + ptrdiff_t GetVMAddrSlide() const {return slide_;} + + // Size of the image + mach_vm_size_t GetVMSize() const {return vmsize_;} + + // Task owning this loaded image + mach_port_t GetTask() {return task_;} + + // CPU type of the task + cpu_type_t GetCPUType() {return cpu_type_;} + + // filetype from the Mach-O header. + uint32_t GetFileType(); + + // Return true if the task is a 64-bit architecture. + bool Is64Bit() { return (GetCPUType() & CPU_ARCH_ABI64) == CPU_ARCH_ABI64; } + + uint32_t GetVersion() {return version_;} + // For sorting + bool operator<(const DynamicImage& inInfo) { + return GetLoadAddress() < inInfo.GetLoadAddress(); + } + + // Sanity checking + bool IsValid() {return GetVMSize() != 0;} + + private: + DynamicImage(const DynamicImage&); + DynamicImage& operator=(const DynamicImage&); + + friend class DynamicImages; + template + friend bool FindTextSection(DynamicImage& image); + template + friend uint32_t GetFileTypeFromHeader(DynamicImage& image); + + // Initializes vmaddr_, vmsize_, and slide_ + void CalculateMemoryAndVersionInfo(); + + const vector header_; // our local copy of the header + size_t header_size_; // mach_header plus load commands + uint64_t load_address_; // base address image is mapped into + mach_vm_address_t vmaddr_; + mach_vm_size_t vmsize_; + ptrdiff_t slide_; + uint32_t version_; // Dylib version + string file_path_; // path dyld used to load the image + uintptr_t file_mod_date_; // time_t of image file + + mach_port_t task_; + cpu_type_t cpu_type_; // CPU type of task_ +}; + +//============================================================================== +// DynamicImageRef is just a simple wrapper for a pointer to +// DynamicImage. The reason we use it instead of a simple typedef is so +// that we can use stl::sort() on a vector of DynamicImageRefs +// and simple class pointers can't implement operator<(). +// +class DynamicImageRef { + public: + explicit DynamicImageRef(DynamicImage* inP) : p(inP) {} + // The copy constructor is required by STL + DynamicImageRef(const DynamicImageRef& inRef) = default; + DynamicImageRef& operator=(const DynamicImageRef& inRef) = default; + + bool operator<(const DynamicImageRef& inRef) const { + return (*const_cast(this)->p) + < (*const_cast(inRef).p); + } + + bool operator==(const DynamicImageRef& inInfo) const { + return (*const_cast(this)->p).GetLoadAddress() == + (*const_cast(inInfo)).GetLoadAddress(); + } + + // Be just like DynamicImage* + DynamicImage* operator->() {return p;} + operator DynamicImage*() {return p;} + + private: + DynamicImage* p; +}; + +// Helper function to deal with 32-bit/64-bit Mach-O differences. +class DynamicImages; +template +void ReadImageInfo(DynamicImages& images, uint64_t image_list_address); + +//============================================================================== +// An object of type DynamicImages may be created to allow introspection of +// an arbitrary task's dynamically loaded mach-o binaries. This makes the +// assumption that the current task has send rights to the target task. +class DynamicImages { + public: + explicit DynamicImages(mach_port_t task); + + ~DynamicImages() { + for (int i = 0; i < GetImageCount(); ++i) { + delete image_list_[i]; + } + } + + // Returns the number of dynamically loaded mach-o images. + int GetImageCount() const {return static_cast(image_list_.size());} + + // Returns an individual image. + DynamicImage* GetImage(int i) { + if (i < (int)image_list_.size()) { + return image_list_[i]; + } + return NULL; + } + + // Returns the image corresponding to the main executable. + DynamicImage* GetExecutableImage(); + int GetExecutableImageIndex(); + + // Returns the task which we're looking at. + mach_port_t GetTask() const {return task_;} + + // CPU type of the task + cpu_type_t GetCPUType() {return cpu_type_;} + + // Return true if the task is a 64-bit architecture. + bool Is64Bit() { return (GetCPUType() & CPU_ARCH_ABI64) == CPU_ARCH_ABI64; } + + // Determine the CPU type of the task being dumped. + static cpu_type_t DetermineTaskCPUType(task_t task); + + // Get the native CPU type of this task. + static cpu_type_t GetNativeCPUType() { +#if defined(__i386__) + return CPU_TYPE_I386; +#elif defined(__x86_64__) + return CPU_TYPE_X86_64; +#elif defined(__ppc__) + return CPU_TYPE_POWERPC; +#elif defined(__ppc64__) + return CPU_TYPE_POWERPC64; +#elif defined(__arm__) + return CPU_TYPE_ARM; +#elif defined(__aarch64__) + return CPU_TYPE_ARM64; +#else +#error "GetNativeCPUType not implemented for this architecture" +#endif + } + + private: + template + friend void ReadImageInfo(DynamicImages& images, uint64_t image_list_address); + + bool IsOurTask() {return task_ == mach_task_self();} + + // Initialization + void ReadImageInfoForTask(); + uint64_t GetDyldAllImageInfosPointer(); + + mach_port_t task_; + cpu_type_t cpu_type_; // CPU type of task_ + vector image_list_; +}; + +// Fill bytes with the contents of memory at a particular +// location in another task. +kern_return_t ReadTaskMemory(task_port_t target_task, + const uint64_t address, + size_t length, + vector& bytes); + +} // namespace google_breakpad + +#endif // CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__ diff --git a/src/client/mac/handler/exception_handler.cc b/src/client/mac/handler/exception_handler.cc new file mode 100644 index 0000000..968e551 --- /dev/null +++ b/src/client/mac/handler/exception_handler.cc @@ -0,0 +1,863 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include + +#include + +#include "client/mac/handler/exception_handler.h" +#include "client/mac/handler/minidump_generator.h" +#include "common/mac/macho_utilities.h" +#include "common/mac/scoped_task_suspend-inl.h" +#include "google_breakpad/common/minidump_exception_mac.h" + +#ifndef __EXCEPTIONS +// This file uses C++ try/catch (but shouldn't). Duplicate the macros from +// allowing this file to work properly with +// exceptions disabled even when other C++ libraries are used. #undef the try +// and catch macros first in case libstdc++ is in use and has already provided +// its own definitions. +#undef try +#define try if (true) +#undef catch +#define catch(X) if (false) +#endif // __EXCEPTIONS + +#ifndef USE_PROTECTED_ALLOCATIONS +#if TARGET_OS_IPHONE +#define USE_PROTECTED_ALLOCATIONS 1 +#else +#define USE_PROTECTED_ALLOCATIONS 0 +#endif +#endif + +// If USE_PROTECTED_ALLOCATIONS is activated then the +// gBreakpadAllocator needs to be setup in other code +// ahead of time. Please see ProtectedMemoryAllocator.h +// for more details. +#if USE_PROTECTED_ALLOCATIONS + #include "protected_memory_allocator.h" + extern ProtectedMemoryAllocator *gBreakpadAllocator; +#endif + +namespace google_breakpad { + +static union { +#if USE_PROTECTED_ALLOCATIONS +#if defined PAGE_MAX_SIZE + char protected_buffer[PAGE_MAX_SIZE] __attribute__((aligned(PAGE_MAX_SIZE))); +#else + char protected_buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); +#endif // defined PAGE_MAX_SIZE +#endif // USE_PROTECTED_ALLOCATIONS + google_breakpad::ExceptionHandler *handler; +} gProtectedData; + +using std::map; + +// These structures and techniques are illustrated in +// Mac OS X Internals, Amit Singh, ch 9.7 +struct ExceptionMessage { + mach_msg_header_t header; + mach_msg_body_t body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + NDR_record_t ndr; + exception_type_t exception; + mach_msg_type_number_t code_count; + integer_t code[EXCEPTION_CODE_MAX]; + char padding[512]; +}; + +struct ExceptionParameters { + ExceptionParameters() : count(0) {} + mach_msg_type_number_t count; + exception_mask_t masks[EXC_TYPES_COUNT]; + mach_port_t ports[EXC_TYPES_COUNT]; + exception_behavior_t behaviors[EXC_TYPES_COUNT]; + thread_state_flavor_t flavors[EXC_TYPES_COUNT]; +}; + +struct ExceptionReplyMessage { + mach_msg_header_t header; + NDR_record_t ndr; + kern_return_t return_code; +}; + +// Only catch these three exceptions. The other ones are nebulously defined +// and may result in treating a non-fatal exception as fatal. +exception_mask_t s_exception_mask = EXC_MASK_BAD_ACCESS | +EXC_MASK_BAD_INSTRUCTION | EXC_MASK_ARITHMETIC | EXC_MASK_BREAKPOINT; + +#if !TARGET_OS_IPHONE +extern "C" { + // Forward declarations for functions that need "C" style compilation + boolean_t exc_server(mach_msg_header_t* request, + mach_msg_header_t* reply); + + // This symbol must be visible to dlsym() - see + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=345 for details. + kern_return_t catch_exception_raise(mach_port_t target_port, + mach_port_t failed_thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t code_count) + __attribute__((visibility("default"))); +} +#endif + +kern_return_t ForwardException(mach_port_t task, + mach_port_t failed_thread, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t code_count); + +#if TARGET_OS_IPHONE +// Implementation is based on the implementation generated by mig. +boolean_t breakpad_exc_server(mach_msg_header_t* InHeadP, + mach_msg_header_t* OutHeadP) { + OutHeadP->msgh_bits = + MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(InHeadP->msgh_bits), 0); + OutHeadP->msgh_remote_port = InHeadP->msgh_remote_port; + /* Minimal size: routine() will update it if different */ + OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t); + OutHeadP->msgh_local_port = MACH_PORT_NULL; + OutHeadP->msgh_id = InHeadP->msgh_id + 100; + + if (InHeadP->msgh_id != 2401) { + ((mig_reply_error_t*)OutHeadP)->NDR = NDR_record; + ((mig_reply_error_t*)OutHeadP)->RetCode = MIG_BAD_ID; + return FALSE; + } + +#ifdef __MigPackStructs +#pragma pack(4) +#endif + typedef struct { + mach_msg_header_t Head; + /* start of the kernel processed data */ + mach_msg_body_t msgh_body; + mach_msg_port_descriptor_t thread; + mach_msg_port_descriptor_t task; + /* end of the kernel processed data */ + NDR_record_t NDR; + exception_type_t exception; + mach_msg_type_number_t codeCnt; + integer_t code[2]; + mach_msg_trailer_t trailer; + } Request; + + typedef struct { + mach_msg_header_t Head; + NDR_record_t NDR; + kern_return_t RetCode; + } Reply; +#ifdef __MigPackStructs +#pragma pack() +#endif + + Request* In0P = (Request*)InHeadP; + Reply* OutP = (Reply*)OutHeadP; + + if (In0P->task.name != mach_task_self()) { + return FALSE; + } + OutP->RetCode = ForwardException(In0P->task.name, + In0P->thread.name, + In0P->exception, + In0P->code, + In0P->codeCnt); + OutP->NDR = NDR_record; + return TRUE; +} +#else +boolean_t breakpad_exc_server(mach_msg_header_t* request, + mach_msg_header_t* reply) { + return exc_server(request, reply); +} + +// Callback from exc_server() +kern_return_t catch_exception_raise(mach_port_t port, mach_port_t failed_thread, + mach_port_t task, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t code_count) { + if (task != mach_task_self()) { + return KERN_FAILURE; + } + return ForwardException(task, failed_thread, exception, code, code_count); +} +#endif + +ExceptionHandler::ExceptionHandler(const string& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + bool install_handler, + const char* port_name) + : dump_path_(), + filter_(filter), + callback_(callback), + callback_context_(callback_context), + directCallback_(NULL), + handler_thread_(NULL), + handler_port_(MACH_PORT_NULL), + previous_(NULL), + installed_exception_handler_(false), + is_in_teardown_(false), + last_minidump_write_result_(false), + use_minidump_write_mutex_(false) { + // This will update to the ID and C-string pointers + set_dump_path(dump_path); + MinidumpGenerator::GatherSystemInformation(); +#if !TARGET_OS_IPHONE + if (port_name) + crash_generation_client_.reset(new CrashGenerationClient(port_name)); +#endif + Setup(install_handler); +} + +// special constructor if we want to bypass minidump writing and +// simply get a callback with the exception information +ExceptionHandler::ExceptionHandler(DirectCallback callback, + void* callback_context, + bool install_handler) + : dump_path_(), + filter_(NULL), + callback_(NULL), + callback_context_(callback_context), + directCallback_(callback), + handler_thread_(NULL), + handler_port_(MACH_PORT_NULL), + previous_(NULL), + installed_exception_handler_(false), + is_in_teardown_(false), + last_minidump_write_result_(false), + use_minidump_write_mutex_(false) { + MinidumpGenerator::GatherSystemInformation(); + Setup(install_handler); +} + +ExceptionHandler::~ExceptionHandler() { + Teardown(); +} + +bool ExceptionHandler::WriteMinidump(bool write_exception_stream) { + // If we're currently writing, just return + if (use_minidump_write_mutex_) + return false; + + use_minidump_write_mutex_ = true; + last_minidump_write_result_ = false; + + // Lock the mutex. Since we just created it, this will return immediately. + if (pthread_mutex_lock(&minidump_write_mutex_) == 0) { + // Send an empty message to the handle port so that a minidump will + // be written + bool result = SendMessageToHandlerThread(write_exception_stream ? + kWriteDumpWithExceptionMessage : + kWriteDumpMessage); + if (!result) { + pthread_mutex_unlock(&minidump_write_mutex_); + return false; + } + + // Wait for the minidump writer to complete its writing. It will unlock + // the mutex when completed + pthread_mutex_lock(&minidump_write_mutex_); + } + + use_minidump_write_mutex_ = false; + UpdateNextID(); + return last_minidump_write_result_; +} + +// static +bool ExceptionHandler::WriteMinidump(const string& dump_path, + bool write_exception_stream, + MinidumpCallback callback, + void* callback_context) { + ExceptionHandler handler(dump_path, NULL, callback, callback_context, false, + NULL); + return handler.WriteMinidump(write_exception_stream); +} + +// static +bool ExceptionHandler::WriteMinidumpForChild(mach_port_t child, + mach_port_t child_blamed_thread, + const string& dump_path, + MinidumpCallback callback, + void* callback_context) { + ScopedTaskSuspend suspend(child); + + MinidumpGenerator generator(child, MACH_PORT_NULL); + string dump_id; + string dump_filename = generator.UniqueNameInDirectory(dump_path, &dump_id); + + generator.SetExceptionInformation(EXC_BREAKPOINT, +#if defined(__i386__) || defined(__x86_64__) + EXC_I386_BPT, +#elif defined(__ppc__) || defined(__ppc64__) + EXC_PPC_BREAKPOINT, +#elif defined(__arm__) || defined(__aarch64__) + EXC_ARM_BREAKPOINT, +#else +#error architecture not supported +#endif + 0, + child_blamed_thread); + bool result = generator.Write(dump_filename.c_str()); + + if (callback) { + return callback(dump_path.c_str(), dump_id.c_str(), + callback_context, result); + } + return result; +} + +bool ExceptionHandler::WriteMinidumpWithException( + int exception_type, + int exception_code, + int exception_subcode, + breakpad_ucontext_t* task_context, + mach_port_t thread_name, + bool exit_after_write, + bool report_current_thread) { + bool result = false; + +#if TARGET_OS_IPHONE + // _exit() should never be called on iOS. + exit_after_write = false; +#endif + + if (directCallback_) { + if (directCallback_(callback_context_, + exception_type, + exception_code, + exception_subcode, + thread_name) ) { + if (exit_after_write) + _exit(exception_type); + } +#if !TARGET_OS_IPHONE + } else if (IsOutOfProcess()) { + if (exception_type && exception_code) { + // If this is a real exception, give the filter (if any) a chance to + // decide if this should be sent. + if (filter_ && !filter_(callback_context_)) + return false; + result = crash_generation_client_->RequestDumpForException( + exception_type, + exception_code, + exception_subcode, + thread_name); + if (result && exit_after_write) { + _exit(exception_type); + } + } +#endif + } else { + string minidump_id; + + // Putting the MinidumpGenerator in its own context will ensure that the + // destructor is executed, closing the newly created minidump file. + if (!dump_path_.empty()) { + MinidumpGenerator md(mach_task_self(), + report_current_thread ? MACH_PORT_NULL : + mach_thread_self()); + md.SetTaskContext(task_context); + if (exception_type && exception_code) { + // If this is a real exception, give the filter (if any) a chance to + // decide if this should be sent. + if (filter_ && !filter_(callback_context_)) + return false; + + md.SetExceptionInformation(exception_type, exception_code, + exception_subcode, thread_name); + } + + result = md.Write(next_minidump_path_c_); + } + + // Call user specified callback (if any) + if (callback_) { + // If the user callback returned true and we're handling an exception + // (rather than just writing out the file), then we should exit without + // forwarding the exception to the next handler. + if (callback_(dump_path_c_, next_minidump_id_c_, callback_context_, + result)) { + if (exit_after_write) + _exit(exception_type); + } + } + } + + return result; +} + +kern_return_t ForwardException(mach_port_t task, mach_port_t failed_thread, + exception_type_t exception, + exception_data_t code, + mach_msg_type_number_t code_count) { + // At this time, we should have called Uninstall() on the exception handler + // so that the current exception ports are the ones that we should be + // forwarding to. + ExceptionParameters current; + + current.count = EXC_TYPES_COUNT; + mach_port_t current_task = mach_task_self(); + task_get_exception_ports(current_task, + s_exception_mask, + current.masks, + ¤t.count, + current.ports, + current.behaviors, + current.flavors); + + // Find the first exception handler that matches the exception + unsigned int found; + for (found = 0; found < current.count; ++found) { + if (current.masks[found] & (1 << exception)) { + break; + } + } + + // Nothing to forward + if (found == current.count) { + fprintf(stderr, "** No previous ports for forwarding!! \n"); + exit(KERN_FAILURE); + } + + mach_port_t target_port = current.ports[found]; + exception_behavior_t target_behavior = current.behaviors[found]; + + kern_return_t result; + // TODO: Handle the case where |target_behavior| has MACH_EXCEPTION_CODES + // set. https://bugs.chromium.org/p/google-breakpad/issues/detail?id=551 + switch (target_behavior) { + case EXCEPTION_DEFAULT: + result = exception_raise(target_port, failed_thread, task, exception, + code, code_count); + break; + default: + fprintf(stderr, "** Unknown exception behavior: %d\n", target_behavior); + result = KERN_FAILURE; + break; + } + + return result; +} + +// static +void* ExceptionHandler::WaitForMessage(void* exception_handler_class) { + ExceptionHandler* self = + reinterpret_cast(exception_handler_class); + ExceptionMessage receive; + + // Wait for the exception info + while (1) { + receive.header.msgh_local_port = self->handler_port_; + receive.header.msgh_size = static_cast(sizeof(receive)); + kern_return_t result = mach_msg(&(receive.header), + MACH_RCV_MSG | MACH_RCV_LARGE, 0, + receive.header.msgh_size, + self->handler_port_, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + + + if (result == KERN_SUCCESS) { + // Uninstall our handler so that we don't get in a loop if the process of + // writing out a minidump causes an exception. However, if the exception + // was caused by a fork'd process, don't uninstall things + + // If the actual exception code is zero, then we're calling this handler + // in a way that indicates that we want to either exit this thread or + // generate a minidump + // + // While reporting, all threads (except this one) must be suspended + // to avoid misleading stacks. If appropriate they will be resumed + // afterwards. + if (!receive.exception) { + // Don't touch self, since this message could have been sent + // from its destructor. + if (receive.header.msgh_id == kShutdownMessage) + return NULL; + + self->SuspendThreads(); + +#if USE_PROTECTED_ALLOCATIONS + if (gBreakpadAllocator) + gBreakpadAllocator->Unprotect(); +#endif + + mach_port_t thread = MACH_PORT_NULL; + int exception_type = 0; + int exception_code = 0; + if (receive.header.msgh_id == kWriteDumpWithExceptionMessage) { + thread = receive.thread.name; + exception_type = EXC_BREAKPOINT; +#if defined(__i386__) || defined(__x86_64__) + exception_code = EXC_I386_BPT; +#elif defined(__ppc__) || defined(__ppc64__) + exception_code = EXC_PPC_BREAKPOINT; +#elif defined(__arm__) || defined(__aarch64__) + exception_code = EXC_ARM_BREAKPOINT; +#else +#error architecture not supported +#endif + } + + // Write out the dump and save the result for later retrieval + self->last_minidump_write_result_ = + self->WriteMinidumpWithException(exception_type, exception_code, + 0, NULL, thread, + false, false); + +#if USE_PROTECTED_ALLOCATIONS + if (gBreakpadAllocator) + gBreakpadAllocator->Protect(); +#endif + + self->ResumeThreads(); + + if (self->use_minidump_write_mutex_) + pthread_mutex_unlock(&self->minidump_write_mutex_); + } else { + // When forking a child process with the exception handler installed, + // if the child crashes, it will send the exception back to the parent + // process. The check for task == self_task() ensures that only + // exceptions that occur in the parent process are caught and + // processed. If the exception was not caused by this task, we + // still need to call into the exception server and have it return + // KERN_FAILURE (see catch_exception_raise) in order for the kernel + // to move onto the host exception handler for the child task + if (receive.task.name == mach_task_self()) { + self->SuspendThreads(); + +#if USE_PROTECTED_ALLOCATIONS + if (gBreakpadAllocator) + gBreakpadAllocator->Unprotect(); +#endif + + int subcode = 0; + if (receive.exception == EXC_BAD_ACCESS && receive.code_count > 1) + subcode = receive.code[1]; + + // Generate the minidump with the exception data. + self->WriteMinidumpWithException(receive.exception, receive.code[0], + subcode, NULL, receive.thread.name, + true, false); + +#if USE_PROTECTED_ALLOCATIONS + // This may have become protected again within + // WriteMinidumpWithException, but it needs to be unprotected for + // UninstallHandler. + if (gBreakpadAllocator) + gBreakpadAllocator->Unprotect(); +#endif + + self->UninstallHandler(true); + +#if USE_PROTECTED_ALLOCATIONS + if (gBreakpadAllocator) + gBreakpadAllocator->Protect(); +#endif + } + // Pass along the exception to the server, which will setup the + // message and call catch_exception_raise() and put the return + // code into the reply. + ExceptionReplyMessage reply; + if (!breakpad_exc_server(&receive.header, &reply.header)) + exit(1); + + // Send a reply and exit + mach_msg(&(reply.header), MACH_SEND_MSG, + reply.header.msgh_size, 0, MACH_PORT_NULL, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + } + } + } + + return NULL; +} + +// static +void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) { +#if USE_PROTECTED_ALLOCATIONS + if (gBreakpadAllocator) + gBreakpadAllocator->Unprotect(); +#endif + gProtectedData.handler->WriteMinidumpWithException( + EXC_SOFTWARE, + MD_EXCEPTION_CODE_MAC_ABORT, + 0, + static_cast(uc), + mach_thread_self(), + true, + true); +#if USE_PROTECTED_ALLOCATIONS + if (gBreakpadAllocator) + gBreakpadAllocator->Protect(); +#endif +} + +bool ExceptionHandler::InstallHandler() { + // If a handler is already installed, something is really wrong. + if (gProtectedData.handler != NULL) { + return false; + } + if (!IsOutOfProcess()) { + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sigaddset(&sa.sa_mask, SIGABRT); + sa.sa_sigaction = ExceptionHandler::SignalHandler; + sa.sa_flags = SA_SIGINFO; + + scoped_ptr old(new struct sigaction); + if (sigaction(SIGABRT, &sa, old.get()) == -1) { + return false; + } + old_handler_.swap(old); + gProtectedData.handler = this; +#if USE_PROTECTED_ALLOCATIONS + assert(((size_t)(gProtectedData.protected_buffer) & PAGE_MASK) == 0); + mprotect(gProtectedData.protected_buffer, PAGE_SIZE, PROT_READ); +#endif + } + + try { +#if USE_PROTECTED_ALLOCATIONS + previous_ = new (gBreakpadAllocator->Allocate(sizeof(ExceptionParameters)) ) + ExceptionParameters(); +#else + previous_ = new ExceptionParameters(); +#endif + } + catch (std::bad_alloc) { + return false; + } + + // Save the current exception ports so that we can forward to them + previous_->count = EXC_TYPES_COUNT; + mach_port_t current_task = mach_task_self(); + kern_return_t result = task_get_exception_ports(current_task, + s_exception_mask, + previous_->masks, + &previous_->count, + previous_->ports, + previous_->behaviors, + previous_->flavors); + + // Setup the exception ports on this task + if (result == KERN_SUCCESS) + result = task_set_exception_ports(current_task, s_exception_mask, + handler_port_, EXCEPTION_DEFAULT, + THREAD_STATE_NONE); + + installed_exception_handler_ = (result == KERN_SUCCESS); + + return installed_exception_handler_; +} + +bool ExceptionHandler::UninstallHandler(bool in_exception) { + kern_return_t result = KERN_SUCCESS; + + if (old_handler_.get()) { + sigaction(SIGABRT, old_handler_.get(), NULL); +#if USE_PROTECTED_ALLOCATIONS + mprotect(gProtectedData.protected_buffer, PAGE_SIZE, + PROT_READ | PROT_WRITE); +#endif + old_handler_.reset(); + gProtectedData.handler = NULL; + } + + if (installed_exception_handler_) { + mach_port_t current_task = mach_task_self(); + + // Restore the previous ports + for (unsigned int i = 0; i < previous_->count; ++i) { + result = task_set_exception_ports(current_task, previous_->masks[i], + previous_->ports[i], + previous_->behaviors[i], + previous_->flavors[i]); + if (result != KERN_SUCCESS) + return false; + } + + // this delete should NOT happen if an exception just occurred! + if (!in_exception) { +#if USE_PROTECTED_ALLOCATIONS + previous_->~ExceptionParameters(); +#else + delete previous_; +#endif + } + + previous_ = NULL; + installed_exception_handler_ = false; + } + + return result == KERN_SUCCESS; +} + +bool ExceptionHandler::Setup(bool install_handler) { + if (pthread_mutex_init(&minidump_write_mutex_, NULL)) + return false; + + // Create a receive right + mach_port_t current_task = mach_task_self(); + kern_return_t result = mach_port_allocate(current_task, + MACH_PORT_RIGHT_RECEIVE, + &handler_port_); + // Add send right + if (result == KERN_SUCCESS) + result = mach_port_insert_right(current_task, handler_port_, handler_port_, + MACH_MSG_TYPE_MAKE_SEND); + + if (install_handler && result == KERN_SUCCESS) + if (!InstallHandler()) + return false; + + if (result == KERN_SUCCESS) { + // Install the handler in its own thread, detached as we won't be joining. + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + int thread_create_result = pthread_create(&handler_thread_, &attr, + &WaitForMessage, this); + pthread_attr_destroy(&attr); + result = thread_create_result ? KERN_FAILURE : KERN_SUCCESS; + } + + return result == KERN_SUCCESS; +} + +bool ExceptionHandler::Teardown() { + kern_return_t result = KERN_SUCCESS; + is_in_teardown_ = true; + + if (!UninstallHandler(false)) + return false; + + // Send an empty message so that the handler_thread exits + if (SendMessageToHandlerThread(kShutdownMessage)) { + mach_port_t current_task = mach_task_self(); + result = mach_port_deallocate(current_task, handler_port_); + if (result != KERN_SUCCESS) + return false; + } else { + return false; + } + + handler_thread_ = NULL; + handler_port_ = MACH_PORT_NULL; + pthread_mutex_destroy(&minidump_write_mutex_); + + return result == KERN_SUCCESS; +} + +bool ExceptionHandler::SendMessageToHandlerThread( + HandlerThreadMessage message_id) { + ExceptionMessage msg; + memset(&msg, 0, sizeof(msg)); + msg.header.msgh_id = message_id; + if (message_id == kWriteDumpMessage || + message_id == kWriteDumpWithExceptionMessage) { + // Include this thread's port. + msg.thread.name = mach_thread_self(); + msg.thread.disposition = MACH_MSG_TYPE_PORT_SEND; + msg.thread.type = MACH_MSG_PORT_DESCRIPTOR; + } + msg.header.msgh_size = sizeof(msg) - sizeof(msg.padding); + msg.header.msgh_remote_port = handler_port_; + msg.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, + MACH_MSG_TYPE_MAKE_SEND_ONCE); + kern_return_t result = mach_msg(&(msg.header), + MACH_SEND_MSG | MACH_SEND_TIMEOUT, + msg.header.msgh_size, 0, 0, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + + return result == KERN_SUCCESS; +} + +void ExceptionHandler::UpdateNextID() { + next_minidump_path_ = + (MinidumpGenerator::UniqueNameInDirectory(dump_path_, &next_minidump_id_)); + + next_minidump_path_c_ = next_minidump_path_.c_str(); + next_minidump_id_c_ = next_minidump_id_.c_str(); +} + +bool ExceptionHandler::SuspendThreads() { + thread_act_port_array_t threads_for_task; + mach_msg_type_number_t thread_count; + + if (task_threads(mach_task_self(), &threads_for_task, &thread_count)) + return false; + + // suspend all of the threads except for this one + for (unsigned int i = 0; i < thread_count; ++i) { + if (threads_for_task[i] != mach_thread_self()) { + if (thread_suspend(threads_for_task[i])) + return false; + } + } + + return true; +} + +bool ExceptionHandler::ResumeThreads() { + thread_act_port_array_t threads_for_task; + mach_msg_type_number_t thread_count; + + if (task_threads(mach_task_self(), &threads_for_task, &thread_count)) + return false; + + // resume all of the threads except for this one + for (unsigned int i = 0; i < thread_count; ++i) { + if (threads_for_task[i] != mach_thread_self()) { + if (thread_resume(threads_for_task[i])) + return false; + } + } + + return true; +} + +} // namespace google_breakpad diff --git a/src/client/mac/handler/exception_handler.h b/src/client/mac/handler/exception_handler.h new file mode 100644 index 0000000..ec7ffe7 --- /dev/null +++ b/src/client/mac/handler/exception_handler.h @@ -0,0 +1,280 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// exception_handler.h: MacOS exception handler +// This class can install a Mach exception port handler to trap most common +// programming errors. If an exception occurs, a minidump file will be +// generated which contains detailed information about the process and the +// exception. + +#ifndef CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__ +#define CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__ + +#include +#include + +#include + +#include "client/mac/handler/ucontext_compat.h" +#include "common/scoped_ptr.h" + +#if !TARGET_OS_IPHONE +#include "client/mac/crash_generation/crash_generation_client.h" +#endif + +namespace google_breakpad { + +using std::string; + +struct ExceptionParameters; + +enum HandlerThreadMessage { + // Message ID telling the handler thread to write a dump. + kWriteDumpMessage = 0, + // Message ID telling the handler thread to write a dump and include + // an exception stream. + kWriteDumpWithExceptionMessage = 1, + // Message ID telling the handler thread to quit. + kShutdownMessage = 2 +}; + +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. context is the parameter supplied by the user as + // callback_context when the handler was created. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, Breakpad + // will immediately report the exception as unhandled without writing a + // minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void* context); + + // A callback function to run after the minidump has been written. + // |minidump_id| is a unique id for the dump, so the minidump + // file is /.dmp. + // |context| is the value passed into the constructor. + // |succeeded| indicates whether a minidump file was successfully written. + // Return true if the exception was fully handled and breakpad should exit. + // Return false to allow any other exception handlers to process the + // exception. + typedef bool (*MinidumpCallback)(const char* dump_dir, + const char* minidump_id, + void* context, bool succeeded); + + // A callback function which will be called directly if an exception occurs. + // This bypasses the minidump file writing and simply gives the client + // the exception information. + typedef bool (*DirectCallback)(void* context, + int exception_type, + int exception_code, + int exception_subcode, + mach_port_t thread_name); + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Minidump files will be written to dump_path, and the optional callback + // is called after writing the dump file, as described above. + // If install_handler is true, then a minidump will be written whenever + // an unhandled exception occurs. If it is false, minidumps will only + // be written when WriteMinidump is called. + // If port_name is non-NULL, attempt to perform out-of-process dump generation + // If port_name is NULL, in-process dump generation will be used. + ExceptionHandler(const string& dump_path, + FilterCallback filter, MinidumpCallback callback, + void* callback_context, bool install_handler, + const char* port_name); + + // A special constructor if we want to bypass minidump writing and + // simply get a callback with the exception information. + ExceptionHandler(DirectCallback callback, + void* callback_context, + bool install_handler); + + ~ExceptionHandler(); + + // Get and set the minidump path. + string dump_path() const { return dump_path_; } + void set_dump_path(const string& dump_path) { + dump_path_ = dump_path; + dump_path_c_ = dump_path_.c_str(); + UpdateNextID(); // Necessary to put dump_path_ in next_minidump_path_. + } + + // Writes a minidump immediately. This can be used to capture the + // execution state independently of a crash. Returns true on success. + bool WriteMinidump() { + return WriteMinidump(false); + } + + bool WriteMinidump(bool write_exception_stream); + + // Convenience form of WriteMinidump which does not require an + // ExceptionHandler instance. + static bool WriteMinidump(const string& dump_path, MinidumpCallback callback, + void* callback_context) { + return WriteMinidump(dump_path, false, callback, callback_context); + } + + static bool WriteMinidump(const string& dump_path, + bool write_exception_stream, + MinidumpCallback callback, + void* callback_context); + + // Write a minidump of child immediately. This can be used to capture + // the execution state of a child process independently of a crash. + static bool WriteMinidumpForChild(mach_port_t child, + mach_port_t child_blamed_thread, + const std::string& dump_path, + MinidumpCallback callback, + void* callback_context); + + // Returns whether out-of-process dump generation is used or not. + bool IsOutOfProcess() const { +#if TARGET_OS_IPHONE + return false; +#else + return crash_generation_client_.get() != NULL; +#endif + } + + private: + // Install the mach exception handler + bool InstallHandler(); + + // Uninstall the mach exception handler (if any) + bool UninstallHandler(bool in_exception); + + // Setup the handler thread, and if |install_handler| is true, install the + // mach exception port handler + bool Setup(bool install_handler); + + // Uninstall the mach exception handler (if any) and terminate the helper + // thread + bool Teardown(); + + // Send a mach message to the exception handler. Return true on + // success, false otherwise. + bool SendMessageToHandlerThread(HandlerThreadMessage message_id); + + // All minidump writing goes through this one routine. + // |task_context| can be NULL. If not, it will be used to retrieve the + // context of the current thread, instead of using |thread_get_state|. + bool WriteMinidumpWithException(int exception_type, + int exception_code, + int exception_subcode, + breakpad_ucontext_t* task_context, + mach_port_t thread_name, + bool exit_after_write, + bool report_current_thread); + + // When installed, this static function will be call from a newly created + // pthread with |this| as the argument + static void* WaitForMessage(void* exception_handler_class); + + // Signal handler for SIGABRT. + static void SignalHandler(int sig, siginfo_t* info, void* uc); + + // disallow copy ctor and operator= + explicit ExceptionHandler(const ExceptionHandler&); + void operator=(const ExceptionHandler&); + + // Generates a new ID and stores it in next_minidump_id_, and stores the + // path of the next minidump to be written in next_minidump_path_. + void UpdateNextID(); + + // These functions will suspend/resume all threads except for the + // reporting thread + bool SuspendThreads(); + bool ResumeThreads(); + + // The destination directory for the minidump + string dump_path_; + + // The basename of the next minidump w/o extension + string next_minidump_id_; + + // The full path to the next minidump to be written, including extension + string next_minidump_path_; + + // Pointers to the UTF-8 versions of above + const char* dump_path_c_; + const char* next_minidump_id_c_; + const char* next_minidump_path_c_; + + // The callback function and pointer to be passed back after the minidump + // has been written + FilterCallback filter_; + MinidumpCallback callback_; + void* callback_context_; + + // The callback function to be passed back when we don't want a minidump + // file to be written + DirectCallback directCallback_; + + // The thread that is created for the handler + pthread_t handler_thread_; + + // The port that is waiting on an exception message to be sent, if the + // handler is installed + mach_port_t handler_port_; + + // These variables save the previous exception handler's data so that it + // can be re-installed when this handler is uninstalled + ExceptionParameters* previous_; + + // True, if we've installed the exception handler + bool installed_exception_handler_; + + // True, if we're in the process of uninstalling the exception handler and + // the thread. + bool is_in_teardown_; + + // Save the last result of the last minidump + bool last_minidump_write_result_; + + // A mutex for use when writing out a minidump that was requested on a + // thread other than the exception handler. + pthread_mutex_t minidump_write_mutex_; + + // True, if we're using the mutext to indicate when mindump writing occurs + bool use_minidump_write_mutex_; + + // Old signal handler for SIGABRT. Used to be able to restore it when + // uninstalling. + scoped_ptr old_handler_; + +#if !TARGET_OS_IPHONE + // Client for out-of-process dump generation. + scoped_ptr crash_generation_client_; +#endif +}; + +} // namespace google_breakpad + +#endif // CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__ diff --git a/src/client/mac/handler/mach_vm_compat.h b/src/client/mac/handler/mach_vm_compat.h new file mode 100644 index 0000000..b7dc159 --- /dev/null +++ b/src/client/mac/handler/mach_vm_compat.h @@ -0,0 +1,47 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_MAC_GENERATOR_MACH_VM_COMPAT_H_ +#define CLIENT_MAC_GENERATOR_MACH_VM_COMPAT_H_ + +#include + +// On iOS 5 and higher, mach/mach_vm.h is not supported. Use the corresponding +// vm_map functions instead. +#if TARGET_OS_IPHONE +#include +#define mach_vm_address_t vm_address_t +#define mach_vm_deallocate vm_deallocate +#define mach_vm_read vm_read +#define mach_vm_region_recurse vm_region_recurse_64 +#define mach_vm_size_t vm_size_t +#else +#include +#endif // TARGET_OS_IPHONE + +#endif // CLIENT_MAC_GENERATOR_MACH_VM_COMPAT_H_ diff --git a/src/client/mac/handler/minidump_generator.cc b/src/client/mac/handler/minidump_generator.cc new file mode 100644 index 0000000..fd863ae --- /dev/null +++ b/src/client/mac/handler/minidump_generator.cc @@ -0,0 +1,1609 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "client/mac/handler/minidump_generator.h" + +#if defined(HAS_ARM_SUPPORT) || defined(HAS_ARM64_SUPPORT) +#include +#endif +#ifdef HAS_PPC_SUPPORT +#include +#endif +#ifdef HAS_X86_SUPPORT +#include +#endif + +#include "client/minidump_file_writer-inl.h" +#include "common/mac/file_id.h" +#include "common/mac/macho_id.h" +#include "common/mac/string_utilities.h" + +using MacStringUtils::ConvertToString; +using MacStringUtils::IntegerValueAtIndex; + +namespace google_breakpad { + +using mach_o::FileID; + +#if defined(__LP64__) && __LP64__ +#define LC_SEGMENT_ARCH LC_SEGMENT_64 +#else +#define LC_SEGMENT_ARCH LC_SEGMENT +#endif + +// constructor when generating from within the crashed process +MinidumpGenerator::MinidumpGenerator() + : writer_(), + exception_type_(0), + exception_code_(0), + exception_subcode_(0), + exception_thread_(0), + crashing_task_(mach_task_self()), + handler_thread_(mach_thread_self()), + cpu_type_(DynamicImages::GetNativeCPUType()), + task_context_(NULL), + dynamic_images_(NULL), + memory_blocks_(&allocator_) { + GatherSystemInformation(); +} + +// constructor when generating from a different process than the +// crashed process +MinidumpGenerator::MinidumpGenerator(mach_port_t crashing_task, + mach_port_t handler_thread) + : writer_(), + exception_type_(0), + exception_code_(0), + exception_subcode_(0), + exception_thread_(0), + crashing_task_(crashing_task), + handler_thread_(handler_thread), + cpu_type_(DynamicImages::GetNativeCPUType()), + task_context_(NULL), + dynamic_images_(NULL), + memory_blocks_(&allocator_) { + if (crashing_task != mach_task_self()) { + dynamic_images_ = new DynamicImages(crashing_task_); + cpu_type_ = dynamic_images_->GetCPUType(); + } else { + dynamic_images_ = NULL; + cpu_type_ = DynamicImages::GetNativeCPUType(); + } + + GatherSystemInformation(); +} + +MinidumpGenerator::~MinidumpGenerator() { + delete dynamic_images_; +} + +char MinidumpGenerator::build_string_[16]; +int MinidumpGenerator::os_major_version_ = 0; +int MinidumpGenerator::os_minor_version_ = 0; +int MinidumpGenerator::os_build_number_ = 0; + +// static +void MinidumpGenerator::GatherSystemInformation() { + // If this is non-zero, then we've already gathered the information + if (os_major_version_) + return; + + // This code extracts the version and build information from the OS + CFStringRef vers_path = + CFSTR("/System/Library/CoreServices/SystemVersion.plist"); + CFURLRef sys_vers = + CFURLCreateWithFileSystemPath(NULL, + vers_path, + kCFURLPOSIXPathStyle, + false); + CFReadStreamRef read_stream = CFReadStreamCreateWithFile(NULL, sys_vers); + CFRelease(sys_vers); + if (!read_stream) { + return; + } + if (!CFReadStreamOpen(read_stream)) { + CFRelease(read_stream); + return; + } + CFMutableDataRef data = NULL; + while (true) { + // Actual data file tests: Mac at 480 bytes and iOS at 413 bytes. + const CFIndex kMaxBufferLength = 1024; + UInt8 data_bytes[kMaxBufferLength]; + CFIndex num_bytes_read = + CFReadStreamRead(read_stream, data_bytes, kMaxBufferLength); + if (num_bytes_read < 0) { + if (data) { + CFRelease(data); + data = NULL; + } + break; + } else if (num_bytes_read == 0) { + break; + } else if (!data) { + data = CFDataCreateMutable(NULL, 0); + } + CFDataAppendBytes(data, data_bytes, num_bytes_read); + } + CFReadStreamClose(read_stream); + CFRelease(read_stream); + if (!data) { + return; + } + CFDictionaryRef list = + static_cast(CFPropertyListCreateWithData( + NULL, data, kCFPropertyListImmutable, NULL, NULL)); + CFRelease(data); + if (!list) { + return; + } + CFStringRef build_version = static_cast + (CFDictionaryGetValue(list, CFSTR("ProductBuildVersion"))); + CFStringRef product_version = static_cast + (CFDictionaryGetValue(list, CFSTR("ProductVersion"))); + string build_str = ConvertToString(build_version); + string product_str = ConvertToString(product_version); + + CFRelease(list); + + strlcpy(build_string_, build_str.c_str(), sizeof(build_string_)); + + // Parse the string that looks like "10.4.8" + os_major_version_ = IntegerValueAtIndex(product_str, 0); + os_minor_version_ = IntegerValueAtIndex(product_str, 1); + os_build_number_ = IntegerValueAtIndex(product_str, 2); +} + +void MinidumpGenerator::SetTaskContext(breakpad_ucontext_t* task_context) { + task_context_ = task_context; +} + +string MinidumpGenerator::UniqueNameInDirectory(const string& dir, + string* unique_name) { + CFUUIDRef uuid = CFUUIDCreate(NULL); + CFStringRef uuid_cfstr = CFUUIDCreateString(NULL, uuid); + CFRelease(uuid); + string file_name(ConvertToString(uuid_cfstr)); + CFRelease(uuid_cfstr); + string path(dir); + + // Ensure that the directory (if non-empty) has a trailing slash so that + // we can append the file name and have a valid pathname. + if (!dir.empty()) { + if (dir.at(dir.size() - 1) != '/') + path.append(1, '/'); + } + + path.append(file_name); + path.append(".dmp"); + + if (unique_name) + *unique_name = file_name; + + return path; +} + +bool MinidumpGenerator::Write(const char* path) { + WriteStreamFN writers[] = { + &MinidumpGenerator::WriteThreadListStream, + &MinidumpGenerator::WriteMemoryListStream, + &MinidumpGenerator::WriteSystemInfoStream, + &MinidumpGenerator::WriteModuleListStream, + &MinidumpGenerator::WriteMiscInfoStream, + &MinidumpGenerator::WriteBreakpadInfoStream, + // Exception stream needs to be the last entry in this array as it may + // be omitted in the case where the minidump is written without an + // exception. + &MinidumpGenerator::WriteExceptionStream, + }; + bool result = false; + + // If opening was successful, create the header, directory, and call each + // writer. The destructor for the TypedMDRVAs will cause the data to be + // flushed. The destructor for the MinidumpFileWriter will close the file. + if (writer_.Open(path)) { + TypedMDRVA header(&writer_); + TypedMDRVA dir(&writer_); + + if (!header.Allocate()) + return false; + + int writer_count = static_cast(sizeof(writers) / sizeof(writers[0])); + + // If we don't have exception information, don't write out the + // exception stream + if (!exception_thread_ && !exception_type_) + --writer_count; + + // Add space for all writers + if (!dir.AllocateArray(writer_count)) + return false; + + MDRawHeader* header_ptr = header.get(); + header_ptr->signature = MD_HEADER_SIGNATURE; + header_ptr->version = MD_HEADER_VERSION; + time(reinterpret_cast(&(header_ptr->time_date_stamp))); + header_ptr->stream_count = writer_count; + header_ptr->stream_directory_rva = dir.position(); + + MDRawDirectory local_dir; + result = true; + for (int i = 0; (result) && (i < writer_count); ++i) { + result = (this->*writers[i])(&local_dir); + + if (result) + dir.CopyIndex(i, &local_dir); + } + } + return result; +} + +size_t MinidumpGenerator::CalculateStackSize(mach_vm_address_t start_addr) { + mach_vm_address_t stack_region_base = start_addr; + mach_vm_size_t stack_region_size; + natural_t nesting_level = 0; + vm_region_submap_info_64 submap_info; + mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64; + + vm_region_recurse_info_t region_info; + region_info = reinterpret_cast(&submap_info); + + if (start_addr == 0) { + return 0; + } + + kern_return_t result = + mach_vm_region_recurse(crashing_task_, &stack_region_base, + &stack_region_size, &nesting_level, + region_info, &info_count); + + if (result != KERN_SUCCESS || start_addr < stack_region_base) { + // Failure or stack corruption, since mach_vm_region had to go + // higher in the process address space to find a valid region. + return 0; + } + + unsigned int tag = submap_info.user_tag; + + // If the user tag is VM_MEMORY_STACK, look for more readable regions with + // the same tag placed immediately above the computed stack region. Under + // some circumstances, the stack for thread 0 winds up broken up into + // multiple distinct abutting regions. This can happen for several reasons, + // including user code that calls setrlimit(RLIMIT_STACK, ...) or changes + // the access on stack pages by calling mprotect. + if (tag == VM_MEMORY_STACK) { + while (true) { + mach_vm_address_t next_region_base = stack_region_base + + stack_region_size; + mach_vm_address_t proposed_next_region_base = next_region_base; + mach_vm_size_t next_region_size; + nesting_level = 0; + info_count = VM_REGION_SUBMAP_INFO_COUNT_64; + result = mach_vm_region_recurse(crashing_task_, &next_region_base, + &next_region_size, &nesting_level, + region_info, &info_count); + if (result != KERN_SUCCESS || + next_region_base != proposed_next_region_base || + submap_info.user_tag != tag || + (submap_info.protection & VM_PROT_READ) == 0) { + break; + } + + stack_region_size += next_region_size; + } + } + + return stack_region_base + stack_region_size - start_addr; +} + +bool MinidumpGenerator::WriteStackFromStartAddress( + mach_vm_address_t start_addr, + MDMemoryDescriptor* stack_location) { + UntypedMDRVA memory(&writer_); + + bool result = false; + size_t size = CalculateStackSize(start_addr); + + if (size == 0) { + // In some situations the stack address for the thread can come back 0. + // In these cases we skip over the threads in question and stuff the + // stack with a clearly borked value. + start_addr = 0xDEADBEEF; + size = 16; + if (!memory.Allocate(size)) + return false; + + unsigned long long dummy_stack[2]; // Fill dummy stack with 16 bytes of + // junk. + dummy_stack[0] = 0xDEADBEEF; + dummy_stack[1] = 0xDEADBEEF; + + result = memory.Copy(dummy_stack, size); + } else { + + if (!memory.Allocate(size)) + return false; + + if (dynamic_images_) { + vector stack_memory; + if (ReadTaskMemory(crashing_task_, + start_addr, + size, + stack_memory) != KERN_SUCCESS) { + return false; + } + + result = memory.Copy(&stack_memory[0], size); + } else { + result = memory.Copy(reinterpret_cast(start_addr), size); + } + } + + stack_location->start_of_memory_range = start_addr; + stack_location->memory = memory.location(); + + return result; +} + +bool MinidumpGenerator::WriteStack(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location) { + switch (cpu_type_) { +#ifdef HAS_ARM_SUPPORT + case CPU_TYPE_ARM: + return WriteStackARM(state, stack_location); +#endif +#ifdef HAS_ARM64_SUPPORT + case CPU_TYPE_ARM64: + return WriteStackARM64(state, stack_location); +#endif +#ifdef HAS_PPC_SUPPORT + case CPU_TYPE_POWERPC: + return WriteStackPPC(state, stack_location); + case CPU_TYPE_POWERPC64: + return WriteStackPPC64(state, stack_location); +#endif +#ifdef HAS_X86_SUPPORT + case CPU_TYPE_I386: + return WriteStackX86(state, stack_location); + case CPU_TYPE_X86_64: + return WriteStackX86_64(state, stack_location); +#endif + default: + return false; + } +} + +bool MinidumpGenerator::WriteContext(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location) { + switch (cpu_type_) { +#ifdef HAS_ARM_SUPPORT + case CPU_TYPE_ARM: + return WriteContextARM(state, register_location); +#endif +#ifdef HAS_ARM64_SUPPORT + case CPU_TYPE_ARM64: + return WriteContextARM64(state, register_location); +#endif +#ifdef HAS_PPC_SUPPORT + case CPU_TYPE_POWERPC: + return WriteContextPPC(state, register_location); + case CPU_TYPE_POWERPC64: + return WriteContextPPC64(state, register_location); +#endif +#ifdef HAS_X86_SUPPORT + case CPU_TYPE_I386: + return WriteContextX86(state, register_location); + case CPU_TYPE_X86_64: + return WriteContextX86_64(state, register_location); +#endif + default: + return false; + } +} + +uint64_t MinidumpGenerator::CurrentPCForStack( + breakpad_thread_state_data_t state) { + switch (cpu_type_) { +#ifdef HAS_ARM_SUPPORT + case CPU_TYPE_ARM: + return CurrentPCForStackARM(state); +#endif +#ifdef HAS_ARM64_SUPPORT + case CPU_TYPE_ARM64: + return CurrentPCForStackARM64(state); +#endif +#ifdef HAS_PPC_SUPPORT + case CPU_TYPE_POWERPC: + return CurrentPCForStackPPC(state); + case CPU_TYPE_POWERPC64: + return CurrentPCForStackPPC64(state); +#endif +#ifdef HAS_X86_SUPPORT + case CPU_TYPE_I386: + return CurrentPCForStackX86(state); + case CPU_TYPE_X86_64: + return CurrentPCForStackX86_64(state); +#endif + default: + assert(0 && "Unknown CPU type!"); + return 0; + } +} + +#ifdef HAS_ARM_SUPPORT +bool MinidumpGenerator::WriteStackARM(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location) { + arm_thread_state_t* machine_state = + reinterpret_cast(state); + mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, sp); + return WriteStackFromStartAddress(start_addr, stack_location); +} + +uint64_t +MinidumpGenerator::CurrentPCForStackARM(breakpad_thread_state_data_t state) { + arm_thread_state_t* machine_state = + reinterpret_cast(state); + + return REGISTER_FROM_THREADSTATE(machine_state, pc); +} + +bool MinidumpGenerator::WriteContextARM(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location) +{ + TypedMDRVA context(&writer_); + arm_thread_state_t* machine_state = + reinterpret_cast(state); + + if (!context.Allocate()) + return false; + + *register_location = context.location(); + MDRawContextARM* context_ptr = context.get(); + context_ptr->context_flags = MD_CONTEXT_ARM_FULL; + +#define AddGPR(a) context_ptr->iregs[a] = REGISTER_FROM_THREADSTATE(machine_state, r[a]) + + context_ptr->iregs[13] = REGISTER_FROM_THREADSTATE(machine_state, sp); + context_ptr->iregs[14] = REGISTER_FROM_THREADSTATE(machine_state, lr); + context_ptr->iregs[15] = REGISTER_FROM_THREADSTATE(machine_state, pc); + context_ptr->cpsr = REGISTER_FROM_THREADSTATE(machine_state, cpsr); + + AddGPR(0); + AddGPR(1); + AddGPR(2); + AddGPR(3); + AddGPR(4); + AddGPR(5); + AddGPR(6); + AddGPR(7); + AddGPR(8); + AddGPR(9); + AddGPR(10); + AddGPR(11); + AddGPR(12); +#undef AddGPR + + return true; +} +#endif + +#ifdef HAS_ARM64_SUPPORT +bool MinidumpGenerator::WriteStackARM64(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location) { + arm_thread_state64_t* machine_state = + reinterpret_cast(state); + mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, sp); + return WriteStackFromStartAddress(start_addr, stack_location); +} + +uint64_t +MinidumpGenerator::CurrentPCForStackARM64(breakpad_thread_state_data_t state) { + arm_thread_state64_t* machine_state = + reinterpret_cast(state); + + return REGISTER_FROM_THREADSTATE(machine_state, pc); +} + +bool +MinidumpGenerator::WriteContextARM64(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location) +{ + TypedMDRVA context(&writer_); + arm_thread_state64_t* machine_state = + reinterpret_cast(state); + + if (!context.Allocate()) + return false; + + *register_location = context.location(); + MDRawContextARM64_Old* context_ptr = context.get(); + context_ptr->context_flags = MD_CONTEXT_ARM64_FULL_OLD; + +#define AddGPR(a) \ + context_ptr->iregs[a] = ARRAY_REGISTER_FROM_THREADSTATE(machine_state, x, a) + + context_ptr->iregs[29] = REGISTER_FROM_THREADSTATE(machine_state, fp); + context_ptr->iregs[30] = REGISTER_FROM_THREADSTATE(machine_state, lr); + context_ptr->iregs[31] = REGISTER_FROM_THREADSTATE(machine_state, sp); + context_ptr->iregs[32] = REGISTER_FROM_THREADSTATE(machine_state, pc); + context_ptr->cpsr = REGISTER_FROM_THREADSTATE(machine_state, cpsr); + + AddGPR(0); + AddGPR(1); + AddGPR(2); + AddGPR(3); + AddGPR(4); + AddGPR(5); + AddGPR(6); + AddGPR(7); + AddGPR(8); + AddGPR(9); + AddGPR(10); + AddGPR(11); + AddGPR(12); + AddGPR(13); + AddGPR(14); + AddGPR(15); + AddGPR(16); + AddGPR(17); + AddGPR(18); + AddGPR(19); + AddGPR(20); + AddGPR(21); + AddGPR(22); + AddGPR(23); + AddGPR(24); + AddGPR(25); + AddGPR(26); + AddGPR(27); + AddGPR(28); +#undef AddGPR + + return true; +} +#endif + +#ifdef HAS_PCC_SUPPORT +bool MinidumpGenerator::WriteStackPPC(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location) { + ppc_thread_state_t* machine_state = + reinterpret_cast(state); + mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, r1); + return WriteStackFromStartAddress(start_addr, stack_location); +} + +bool MinidumpGenerator::WriteStackPPC64(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location) { + ppc_thread_state64_t* machine_state = + reinterpret_cast(state); + mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, r1); + return WriteStackFromStartAddress(start_addr, stack_location); +} + +uint64_t +MinidumpGenerator::CurrentPCForStackPPC(breakpad_thread_state_data_t state) { + ppc_thread_state_t* machine_state = + reinterpret_cast(state); + + return REGISTER_FROM_THREADSTATE(machine_state, srr0); +} + +uint64_t +MinidumpGenerator::CurrentPCForStackPPC64(breakpad_thread_state_data_t state) { + ppc_thread_state64_t* machine_state = + reinterpret_cast(state); + + return REGISTER_FROM_THREADSTATE(machine_state, srr0); +} + +bool MinidumpGenerator::WriteContextPPC(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location) +{ + TypedMDRVA context(&writer_); + ppc_thread_state_t* machine_state = + reinterpret_cast(state); + + if (!context.Allocate()) + return false; + + *register_location = context.location(); + MDRawContextPPC* context_ptr = context.get(); + context_ptr->context_flags = MD_CONTEXT_PPC_BASE; + +#define AddReg(a) context_ptr->a = static_cast<__typeof__(context_ptr->a)>( \ + REGISTER_FROM_THREADSTATE(machine_state, a)) +#define AddGPR(a) context_ptr->gpr[a] = \ + static_cast<__typeof__(context_ptr->a)>( \ + REGISTER_FROM_THREADSTATE(machine_state, r ## a) + + AddReg(srr0); + AddReg(cr); + AddReg(xer); + AddReg(ctr); + AddReg(lr); + AddReg(vrsave); + + AddGPR(0); + AddGPR(1); + AddGPR(2); + AddGPR(3); + AddGPR(4); + AddGPR(5); + AddGPR(6); + AddGPR(7); + AddGPR(8); + AddGPR(9); + AddGPR(10); + AddGPR(11); + AddGPR(12); + AddGPR(13); + AddGPR(14); + AddGPR(15); + AddGPR(16); + AddGPR(17); + AddGPR(18); + AddGPR(19); + AddGPR(20); + AddGPR(21); + AddGPR(22); + AddGPR(23); + AddGPR(24); + AddGPR(25); + AddGPR(26); + AddGPR(27); + AddGPR(28); + AddGPR(29); + AddGPR(30); + AddGPR(31); + AddReg(mq); +#undef AddReg +#undef AddGPR + + return true; +} + +bool MinidumpGenerator::WriteContextPPC64( + breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location) { + TypedMDRVA context(&writer_); + ppc_thread_state64_t* machine_state = + reinterpret_cast(state); + + if (!context.Allocate()) + return false; + + *register_location = context.location(); + MDRawContextPPC64* context_ptr = context.get(); + context_ptr->context_flags = MD_CONTEXT_PPC_BASE; + +#define AddReg(a) context_ptr->a = static_cast<__typeof__(context_ptr->a)>( \ + REGISTER_FROM_THREADSTATE(machine_state, a)) +#define AddGPR(a) context_ptr->gpr[a] = \ + static_cast<__typeof__(context_ptr->a)>( \ + REGISTER_FROM_THREADSTATE(machine_state, r ## a) + + AddReg(srr0); + AddReg(cr); + AddReg(xer); + AddReg(ctr); + AddReg(lr); + AddReg(vrsave); + + AddGPR(0); + AddGPR(1); + AddGPR(2); + AddGPR(3); + AddGPR(4); + AddGPR(5); + AddGPR(6); + AddGPR(7); + AddGPR(8); + AddGPR(9); + AddGPR(10); + AddGPR(11); + AddGPR(12); + AddGPR(13); + AddGPR(14); + AddGPR(15); + AddGPR(16); + AddGPR(17); + AddGPR(18); + AddGPR(19); + AddGPR(20); + AddGPR(21); + AddGPR(22); + AddGPR(23); + AddGPR(24); + AddGPR(25); + AddGPR(26); + AddGPR(27); + AddGPR(28); + AddGPR(29); + AddGPR(30); + AddGPR(31); +#undef AddReg +#undef AddGPR + + return true; +} + +#endif + +#ifdef HAS_X86_SUPPORT +bool MinidumpGenerator::WriteStackX86(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location) { + i386_thread_state_t* machine_state = + reinterpret_cast(state); + + mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, esp); + return WriteStackFromStartAddress(start_addr, stack_location); +} + +bool MinidumpGenerator::WriteStackX86_64(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location) { + x86_thread_state64_t* machine_state = + reinterpret_cast(state); + + mach_vm_address_t start_addr = static_cast( + REGISTER_FROM_THREADSTATE(machine_state, rsp)); + return WriteStackFromStartAddress(start_addr, stack_location); +} + +uint64_t +MinidumpGenerator::CurrentPCForStackX86(breakpad_thread_state_data_t state) { + i386_thread_state_t* machine_state = + reinterpret_cast(state); + + return REGISTER_FROM_THREADSTATE(machine_state, eip); +} + +uint64_t +MinidumpGenerator::CurrentPCForStackX86_64(breakpad_thread_state_data_t state) { + x86_thread_state64_t* machine_state = + reinterpret_cast(state); + + return REGISTER_FROM_THREADSTATE(machine_state, rip); +} + +bool MinidumpGenerator::WriteContextX86(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location) +{ + TypedMDRVA context(&writer_); + i386_thread_state_t* machine_state = + reinterpret_cast(state); + + if (!context.Allocate()) + return false; + + *register_location = context.location(); + MDRawContextX86* context_ptr = context.get(); + +#define AddReg(a) context_ptr->a = static_cast<__typeof__(context_ptr->a)>( \ + REGISTER_FROM_THREADSTATE(machine_state, a)) + + context_ptr->context_flags = MD_CONTEXT_X86; + AddReg(eax); + AddReg(ebx); + AddReg(ecx); + AddReg(edx); + AddReg(esi); + AddReg(edi); + AddReg(ebp); + AddReg(esp); + + AddReg(cs); + AddReg(ds); + AddReg(ss); + AddReg(es); + AddReg(fs); + AddReg(gs); + AddReg(eflags); + + AddReg(eip); +#undef AddReg + + return true; +} + +bool MinidumpGenerator::WriteContextX86_64( + breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location) { + TypedMDRVA context(&writer_); + x86_thread_state64_t* machine_state = + reinterpret_cast(state); + + if (!context.Allocate()) + return false; + + *register_location = context.location(); + MDRawContextAMD64* context_ptr = context.get(); + +#define AddReg(a) context_ptr->a = static_cast<__typeof__(context_ptr->a)>( \ + REGISTER_FROM_THREADSTATE(machine_state, a)) + + context_ptr->context_flags = MD_CONTEXT_AMD64; + AddReg(rax); + AddReg(rbx); + AddReg(rcx); + AddReg(rdx); + AddReg(rdi); + AddReg(rsi); + AddReg(rbp); + AddReg(rsp); + AddReg(r8); + AddReg(r9); + AddReg(r10); + AddReg(r11); + AddReg(r12); + AddReg(r13); + AddReg(r14); + AddReg(r15); + AddReg(rip); + // according to AMD's software developer guide, bits above 18 are + // not used in the flags register. Since the minidump format + // specifies 32 bits for the flags register, we can truncate safely + // with no loss. + context_ptr->eflags = static_cast(REGISTER_FROM_THREADSTATE(machine_state, rflags)); + AddReg(cs); + AddReg(fs); + AddReg(gs); +#undef AddReg + + return true; +} +#endif + +bool MinidumpGenerator::GetThreadState(thread_act_t target_thread, + thread_state_t state, + mach_msg_type_number_t* count) { + if (task_context_ && target_thread == mach_thread_self()) { + switch (cpu_type_) { +#ifdef HAS_ARM_SUPPORT + case CPU_TYPE_ARM: + size_t final_size = + std::min(static_cast(*count), sizeof(arm_thread_state_t)); + memcpy(state, &task_context_->breakpad_uc_mcontext->__ss, final_size); + *count = static_cast(final_size); + return true; +#endif +#ifdef HAS_ARM64_SUPPORT + case CPU_TYPE_ARM64: { + size_t final_size = + std::min(static_cast(*count), sizeof(arm_thread_state64_t)); + memcpy(state, &task_context_->breakpad_uc_mcontext->__ss, final_size); + *count = static_cast(final_size); + return true; + } +#endif +#ifdef HAS_X86_SUPPORT + case CPU_TYPE_I386: + case CPU_TYPE_X86_64: { + size_t state_size = cpu_type_ == CPU_TYPE_I386 ? + sizeof(i386_thread_state_t) : sizeof(x86_thread_state64_t); + size_t final_size = + std::min(static_cast(*count), state_size); + memcpy(state, &task_context_->breakpad_uc_mcontext->__ss, final_size); + *count = static_cast(final_size); + return true; + } +#endif + } + } + + thread_state_flavor_t flavor; + switch (cpu_type_) { +#ifdef HAS_ARM_SUPPORT + case CPU_TYPE_ARM: + flavor = ARM_THREAD_STATE; + break; +#endif +#ifdef HAS_ARM64_SUPPORT + case CPU_TYPE_ARM64: + flavor = ARM_THREAD_STATE64; + break; +#endif +#ifdef HAS_PPC_SUPPORT + case CPU_TYPE_POWERPC: + flavor = PPC_THREAD_STATE; + break; + case CPU_TYPE_POWERPC64: + flavor = PPC_THREAD_STATE64; + break; +#endif +#ifdef HAS_X86_SUPPORT + case CPU_TYPE_I386: + flavor = i386_THREAD_STATE; + break; + case CPU_TYPE_X86_64: + flavor = x86_THREAD_STATE64; + break; +#endif + default: + return false; + } + return thread_get_state(target_thread, flavor, + state, count) == KERN_SUCCESS; +} + +bool MinidumpGenerator::WriteThreadStream(mach_port_t thread_id, + MDRawThread* thread) { + breakpad_thread_state_data_t state; + mach_msg_type_number_t state_count + = static_cast(sizeof(state)); + + if (GetThreadState(thread_id, state, &state_count)) { + if (!WriteStack(state, &thread->stack)) + return false; + + memory_blocks_.push_back(thread->stack); + + if (!WriteContext(state, &thread->thread_context)) + return false; + + thread->thread_id = thread_id; + } else { + return false; + } + + return true; +} + +bool MinidumpGenerator::WriteThreadListStream( + MDRawDirectory* thread_list_stream) { + TypedMDRVA list(&writer_); + thread_act_port_array_t threads_for_task; + mach_msg_type_number_t thread_count; + int non_generator_thread_count; + + if (task_threads(crashing_task_, &threads_for_task, &thread_count)) + return false; + + // Don't include the generator thread + if (handler_thread_ != MACH_PORT_NULL) + non_generator_thread_count = thread_count - 1; + else + non_generator_thread_count = thread_count; + if (!list.AllocateObjectAndArray(non_generator_thread_count, + sizeof(MDRawThread))) + return false; + + thread_list_stream->stream_type = MD_THREAD_LIST_STREAM; + thread_list_stream->location = list.location(); + + list.get()->number_of_threads = non_generator_thread_count; + + MDRawThread thread; + int thread_idx = 0; + + for (unsigned int i = 0; i < thread_count; ++i) { + memset(&thread, 0, sizeof(MDRawThread)); + + if (threads_for_task[i] != handler_thread_) { + if (!WriteThreadStream(threads_for_task[i], &thread)) + return false; + + list.CopyIndexAfterObject(thread_idx++, &thread, sizeof(MDRawThread)); + } + } + + return true; +} + +bool MinidumpGenerator::WriteMemoryListStream( + MDRawDirectory* memory_list_stream) { + TypedMDRVA list(&writer_); + + // If the dump has an exception, include some memory around the + // instruction pointer. + const size_t kIPMemorySize = 256; // bytes + bool have_ip_memory = false; + MDMemoryDescriptor ip_memory_d; + if (exception_thread_ && exception_type_) { + breakpad_thread_state_data_t state; + mach_msg_type_number_t stateCount + = static_cast(sizeof(state)); + + if (GetThreadState(exception_thread_, state, &stateCount)) { + uint64_t ip = CurrentPCForStack(state); + // Bound it to the upper and lower bounds of the region + // it's contained within. If it's not in a known memory region, + // don't bother trying to write it. + mach_vm_address_t addr = static_cast(ip); + mach_vm_size_t size; + natural_t nesting_level = 0; + vm_region_submap_info_64 info; + mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64; + vm_region_recurse_info_t recurse_info; + recurse_info = reinterpret_cast(&info); + + kern_return_t ret = + mach_vm_region_recurse(crashing_task_, + &addr, + &size, + &nesting_level, + recurse_info, + &info_count); + if (ret == KERN_SUCCESS && ip >= addr && ip < (addr + size)) { + // Try to get 128 bytes before and after the IP, but + // settle for whatever's available. + ip_memory_d.start_of_memory_range = + std::max(uintptr_t(addr), + uintptr_t(ip - (kIPMemorySize / 2))); + uintptr_t end_of_range = + std::min(uintptr_t(ip + (kIPMemorySize / 2)), + uintptr_t(addr + size)); + uintptr_t range_diff = end_of_range - + static_cast(ip_memory_d.start_of_memory_range); + ip_memory_d.memory.data_size = static_cast(range_diff); + have_ip_memory = true; + // This needs to get appended to the list even though + // the memory bytes aren't filled in yet so the entire + // list can be written first. The memory bytes will get filled + // in after the memory list is written. + memory_blocks_.push_back(ip_memory_d); + } + } + } + + // Now fill in the memory list and write it. + size_t memory_count = memory_blocks_.size(); + if (!list.AllocateObjectAndArray(memory_count, + sizeof(MDMemoryDescriptor))) + return false; + + memory_list_stream->stream_type = MD_MEMORY_LIST_STREAM; + memory_list_stream->location = list.location(); + + list.get()->number_of_memory_ranges = static_cast(memory_count); + + unsigned int i; + for (i = 0; i < memory_count; ++i) { + list.CopyIndexAfterObject(i, &memory_blocks_[i], + sizeof(MDMemoryDescriptor)); + } + + if (have_ip_memory) { + // Now read the memory around the instruction pointer. + UntypedMDRVA ip_memory(&writer_); + if (!ip_memory.Allocate(ip_memory_d.memory.data_size)) + return false; + + if (dynamic_images_) { + // Out-of-process. + vector memory; + if (ReadTaskMemory(crashing_task_, + ip_memory_d.start_of_memory_range, + ip_memory_d.memory.data_size, + memory) != KERN_SUCCESS) { + return false; + } + + ip_memory.Copy(&memory[0], ip_memory_d.memory.data_size); + } else { + // In-process, just copy from local memory. + ip_memory.Copy( + reinterpret_cast(ip_memory_d.start_of_memory_range), + ip_memory_d.memory.data_size); + } + + ip_memory_d.memory = ip_memory.location(); + // Write this again now that the data location is filled in. + list.CopyIndexAfterObject(i - 1, &ip_memory_d, + sizeof(MDMemoryDescriptor)); + } + + return true; +} + +bool +MinidumpGenerator::WriteExceptionStream(MDRawDirectory* exception_stream) { + TypedMDRVA exception(&writer_); + + if (!exception.Allocate()) + return false; + + exception_stream->stream_type = MD_EXCEPTION_STREAM; + exception_stream->location = exception.location(); + MDRawExceptionStream* exception_ptr = exception.get(); + exception_ptr->thread_id = exception_thread_; + + // This naming is confusing, but it is the proper translation from + // mach naming to minidump naming. + exception_ptr->exception_record.exception_code = exception_type_; + exception_ptr->exception_record.exception_flags = exception_code_; + + breakpad_thread_state_data_t state; + mach_msg_type_number_t state_count + = static_cast(sizeof(state)); + + if (!GetThreadState(exception_thread_, state, &state_count)) + return false; + + if (!WriteContext(state, &exception_ptr->thread_context)) + return false; + + if (exception_type_ == EXC_BAD_ACCESS) + exception_ptr->exception_record.exception_address = exception_subcode_; + else + exception_ptr->exception_record.exception_address = CurrentPCForStack(state); + + return true; +} + +bool MinidumpGenerator::WriteSystemInfoStream( + MDRawDirectory* system_info_stream) { + TypedMDRVA info(&writer_); + + if (!info.Allocate()) + return false; + + system_info_stream->stream_type = MD_SYSTEM_INFO_STREAM; + system_info_stream->location = info.location(); + + // CPU Information + uint32_t number_of_processors; + size_t len = sizeof(number_of_processors); + sysctlbyname("hw.ncpu", &number_of_processors, &len, NULL, 0); + MDRawSystemInfo* info_ptr = info.get(); + + switch (cpu_type_) { +#ifdef HAS_ARM_SUPPORT + case CPU_TYPE_ARM: + info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_ARM; + break; +#endif +#ifdef HAS_ARM64_SUPPORT + case CPU_TYPE_ARM64: + info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_ARM64_OLD; + break; +#endif +#ifdef HAS_PPC_SUPPORT + case CPU_TYPE_POWERPC: + case CPU_TYPE_POWERPC64: + info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_PPC; + break; +#endif +#ifdef HAS_X86_SUPPORT + case CPU_TYPE_I386: + case CPU_TYPE_X86_64: + if (cpu_type_ == CPU_TYPE_I386) + info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_X86; + else + info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_AMD64; +#ifdef __i386__ + // ebx is used for PIC code, so we need + // to preserve it. +#define cpuid(op,eax,ebx,ecx,edx) \ + asm ("pushl %%ebx \n\t" \ + "cpuid \n\t" \ + "movl %%ebx,%1 \n\t" \ + "popl %%ebx" \ + : "=a" (eax), \ + "=g" (ebx), \ + "=c" (ecx), \ + "=d" (edx) \ + : "0" (op)) +#elif defined(__x86_64__) + +#define cpuid(op,eax,ebx,ecx,edx) \ + asm ("cpuid \n\t" \ + : "=a" (eax), \ + "=b" (ebx), \ + "=c" (ecx), \ + "=d" (edx) \ + : "0" (op)) +#endif + +#if defined(__i386__) || defined(__x86_64__) + int unused, unused2; + // get vendor id + cpuid(0, unused, info_ptr->cpu.x86_cpu_info.vendor_id[0], + info_ptr->cpu.x86_cpu_info.vendor_id[2], + info_ptr->cpu.x86_cpu_info.vendor_id[1]); + // get version and feature info + cpuid(1, info_ptr->cpu.x86_cpu_info.version_information, unused, unused2, + info_ptr->cpu.x86_cpu_info.feature_information); + + // family + info_ptr->processor_level = + (info_ptr->cpu.x86_cpu_info.version_information & 0xF00) >> 8; + // 0xMMSS (Model, Stepping) + info_ptr->processor_revision = static_cast( + (info_ptr->cpu.x86_cpu_info.version_information & 0xF) | + ((info_ptr->cpu.x86_cpu_info.version_information & 0xF0) << 4)); + + // decode extended model info + if (info_ptr->processor_level == 0xF || + info_ptr->processor_level == 0x6) { + info_ptr->processor_revision |= + ((info_ptr->cpu.x86_cpu_info.version_information & 0xF0000) >> 4); + } + + // decode extended family info + if (info_ptr->processor_level == 0xF) { + info_ptr->processor_level += + ((info_ptr->cpu.x86_cpu_info.version_information & 0xFF00000) >> 20); + } + +#endif // __i386__ || __x86_64_ + break; +#endif // HAS_X86_SUPPORT + default: + info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_UNKNOWN; + break; + } + + info_ptr->number_of_processors = static_cast(number_of_processors); +#if TARGET_OS_IPHONE + info_ptr->platform_id = MD_OS_IOS; +#else + info_ptr->platform_id = MD_OS_MAC_OS_X; +#endif // TARGET_OS_IPHONE + + MDLocationDescriptor build_string_loc; + + if (!writer_.WriteString(build_string_, 0, + &build_string_loc)) + return false; + + info_ptr->csd_version_rva = build_string_loc.rva; + info_ptr->major_version = os_major_version_; + info_ptr->minor_version = os_minor_version_; + info_ptr->build_number = os_build_number_; + + return true; +} + +bool MinidumpGenerator::WriteModuleStream(unsigned int index, + MDRawModule* module) { + if (dynamic_images_) { + // we're in a different process than the crashed process + DynamicImage* image = dynamic_images_->GetImage(index); + + if (!image) + return false; + + memset(module, 0, sizeof(MDRawModule)); + + MDLocationDescriptor string_location; + + string name = image->GetFilePath(); + if (!writer_.WriteString(name.c_str(), 0, &string_location)) + return false; + + module->base_of_image = image->GetVMAddr() + image->GetVMAddrSlide(); + module->size_of_image = static_cast(image->GetVMSize()); + module->module_name_rva = string_location.rva; + + // We'll skip the executable module, because they don't have + // LC_ID_DYLIB load commands, and the crash processing server gets + // version information from the Plist file, anyway. + if (index != static_cast(FindExecutableModule())) { + module->version_info.signature = MD_VSFIXEDFILEINFO_SIGNATURE; + module->version_info.struct_version |= MD_VSFIXEDFILEINFO_VERSION; + // Convert MAC dylib version format, which is a 32 bit number, to the + // format used by minidump. The mac format is <16 bits>.<8 bits>.<8 bits> + // so it fits nicely into the windows version with some massaging + // The mapping is: + // 1) upper 16 bits of MAC version go to lower 16 bits of product HI + // 2) Next most significant 8 bits go to upper 16 bits of product LO + // 3) Least significant 8 bits go to lower 16 bits of product LO + uint32_t modVersion = image->GetVersion(); + module->version_info.file_version_hi = 0; + module->version_info.file_version_hi = modVersion >> 16; + module->version_info.file_version_lo |= (modVersion & 0xff00) << 8; + module->version_info.file_version_lo |= (modVersion & 0xff); + } + + if (!WriteCVRecord(module, image->GetCPUType(), name.c_str(), false)) { + return false; + } + } else { + // Getting module info in the crashed process + const breakpad_mach_header* header; + header = (breakpad_mach_header*)_dyld_get_image_header(index); + if (!header) + return false; + +#ifdef __LP64__ + assert(header->magic == MH_MAGIC_64); + + if(header->magic != MH_MAGIC_64) + return false; +#else + assert(header->magic == MH_MAGIC); + + if(header->magic != MH_MAGIC) + return false; +#endif + + int cpu_type = header->cputype; + unsigned long slide = _dyld_get_image_vmaddr_slide(index); + const char* name = _dyld_get_image_name(index); + const struct load_command* cmd = + reinterpret_cast(header + 1); + + memset(module, 0, sizeof(MDRawModule)); + + for (unsigned int i = 0; cmd && (i < header->ncmds); i++) { + if (cmd->cmd == LC_SEGMENT_ARCH) { + + const breakpad_mach_segment_command* seg = + reinterpret_cast(cmd); + + if (!strcmp(seg->segname, "__TEXT")) { + MDLocationDescriptor string_location; + + if (!writer_.WriteString(name, 0, &string_location)) + return false; + + module->base_of_image = seg->vmaddr + slide; + module->size_of_image = static_cast(seg->vmsize); + module->module_name_rva = string_location.rva; + + bool in_memory = false; +#if TARGET_OS_IPHONE + in_memory = true; +#endif + if (!WriteCVRecord(module, cpu_type, name, in_memory)) + return false; + + return true; + } + } + + cmd = reinterpret_cast((char*)cmd + cmd->cmdsize); + } + } + + return true; +} + +int MinidumpGenerator::FindExecutableModule() { + if (dynamic_images_) { + int index = dynamic_images_->GetExecutableImageIndex(); + + if (index >= 0) { + return index; + } + } else { + int image_count = _dyld_image_count(); + const struct mach_header* header; + + for (int index = 0; index < image_count; ++index) { + header = _dyld_get_image_header(index); + + if (header->filetype == MH_EXECUTE) + return index; + } + } + + // failed - just use the first image + return 0; +} + +bool MinidumpGenerator::WriteCVRecord(MDRawModule* module, int cpu_type, + const char* module_path, bool in_memory) { + TypedMDRVA cv(&writer_); + + // Only return the last path component of the full module path + const char* module_name = strrchr(module_path, '/'); + + // Increment past the slash + if (module_name) + ++module_name; + else + module_name = ""; + + size_t module_name_length = strlen(module_name); + + if (!cv.AllocateObjectAndArray(module_name_length + 1, sizeof(uint8_t))) + return false; + + if (!cv.CopyIndexAfterObject(0, module_name, module_name_length)) + return false; + + module->cv_record = cv.location(); + MDCVInfoPDB70* cv_ptr = cv.get(); + cv_ptr->cv_signature = MD_CVINFOPDB70_SIGNATURE; + cv_ptr->age = 0; + + // Get the module identifier + unsigned char identifier[16]; + bool result = false; + if (in_memory) { + MacFileUtilities::MachoID macho( + reinterpret_cast(module->base_of_image), + static_cast(module->size_of_image)); + result = macho.UUIDCommand(cpu_type, CPU_SUBTYPE_MULTIPLE, identifier); + if (!result) + result = macho.MD5(cpu_type, CPU_SUBTYPE_MULTIPLE, identifier); + } + + if (!result) { + FileID file_id(module_path); + result = file_id.MachoIdentifier(cpu_type, CPU_SUBTYPE_MULTIPLE, + identifier); + } + + if (result) { + cv_ptr->signature.data1 = + static_cast(identifier[0]) << 24 | + static_cast(identifier[1]) << 16 | + static_cast(identifier[2]) << 8 | + static_cast(identifier[3]); + cv_ptr->signature.data2 = + static_cast(identifier[4] << 8) | identifier[5]; + cv_ptr->signature.data3 = + static_cast(identifier[6] << 8) | identifier[7]; + cv_ptr->signature.data4[0] = identifier[8]; + cv_ptr->signature.data4[1] = identifier[9]; + cv_ptr->signature.data4[2] = identifier[10]; + cv_ptr->signature.data4[3] = identifier[11]; + cv_ptr->signature.data4[4] = identifier[12]; + cv_ptr->signature.data4[5] = identifier[13]; + cv_ptr->signature.data4[6] = identifier[14]; + cv_ptr->signature.data4[7] = identifier[15]; + } + + return true; +} + +bool MinidumpGenerator::WriteModuleListStream( + MDRawDirectory* module_list_stream) { + TypedMDRVA list(&writer_); + + uint32_t image_count = dynamic_images_ ? + dynamic_images_->GetImageCount() : + _dyld_image_count(); + + if (!list.AllocateObjectAndArray(image_count, MD_MODULE_SIZE)) + return false; + + module_list_stream->stream_type = MD_MODULE_LIST_STREAM; + module_list_stream->location = list.location(); + list.get()->number_of_modules = static_cast(image_count); + + // Write out the executable module as the first one + MDRawModule module; + uint32_t executableIndex = FindExecutableModule(); + + if (!WriteModuleStream(static_cast(executableIndex), &module)) { + return false; + } + + list.CopyIndexAfterObject(0, &module, MD_MODULE_SIZE); + int destinationIndex = 1; // Write all other modules after this one + + for (uint32_t i = 0; i < image_count; ++i) { + if (i != executableIndex) { + if (!WriteModuleStream(static_cast(i), &module)) { + return false; + } + + list.CopyIndexAfterObject(destinationIndex++, &module, MD_MODULE_SIZE); + } + } + + return true; +} + +bool MinidumpGenerator::WriteMiscInfoStream(MDRawDirectory* misc_info_stream) { + TypedMDRVA info(&writer_); + + if (!info.Allocate()) + return false; + + misc_info_stream->stream_type = MD_MISC_INFO_STREAM; + misc_info_stream->location = info.location(); + + MDRawMiscInfo* info_ptr = info.get(); + info_ptr->size_of_info = static_cast(sizeof(MDRawMiscInfo)); + info_ptr->flags1 = MD_MISCINFO_FLAGS1_PROCESS_ID | + MD_MISCINFO_FLAGS1_PROCESS_TIMES | + MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO; + + // Process ID + info_ptr->process_id = getpid(); + + // Times + struct rusage usage; + if (getrusage(RUSAGE_SELF, &usage) != -1) { + // Omit the fractional time since the MDRawMiscInfo only wants seconds + info_ptr->process_user_time = + static_cast(usage.ru_utime.tv_sec); + info_ptr->process_kernel_time = + static_cast(usage.ru_stime.tv_sec); + } + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, + static_cast(info_ptr->process_id) }; + uint mibsize = static_cast(sizeof(mib) / sizeof(mib[0])); + struct kinfo_proc proc; + size_t size = sizeof(proc); + if (sysctl(mib, mibsize, &proc, &size, NULL, 0) == 0) { + info_ptr->process_create_time = + static_cast(proc.kp_proc.p_starttime.tv_sec); + } + + // Speed + uint64_t speed; + const uint64_t kOneMillion = 1000 * 1000; + size = sizeof(speed); + sysctlbyname("hw.cpufrequency_max", &speed, &size, NULL, 0); + info_ptr->processor_max_mhz = static_cast(speed / kOneMillion); + info_ptr->processor_mhz_limit = static_cast(speed / kOneMillion); + size = sizeof(speed); + sysctlbyname("hw.cpufrequency", &speed, &size, NULL, 0); + info_ptr->processor_current_mhz = static_cast(speed / kOneMillion); + + return true; +} + +bool MinidumpGenerator::WriteBreakpadInfoStream( + MDRawDirectory* breakpad_info_stream) { + TypedMDRVA info(&writer_); + + if (!info.Allocate()) + return false; + + breakpad_info_stream->stream_type = MD_BREAKPAD_INFO_STREAM; + breakpad_info_stream->location = info.location(); + MDRawBreakpadInfo* info_ptr = info.get(); + + if (exception_thread_ && exception_type_) { + info_ptr->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; + info_ptr->dump_thread_id = handler_thread_; + info_ptr->requesting_thread_id = exception_thread_; + } else { + info_ptr->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID; + info_ptr->dump_thread_id = handler_thread_; + info_ptr->requesting_thread_id = 0; + } + + return true; +} + +} // namespace google_breakpad diff --git a/src/client/mac/handler/minidump_generator.h b/src/client/mac/handler/minidump_generator.h new file mode 100644 index 0000000..efddfa9 --- /dev/null +++ b/src/client/mac/handler/minidump_generator.h @@ -0,0 +1,252 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_generator.h: Create a minidump of the current MacOS process. + +#ifndef CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__ +#define CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__ + +#include +#include + +#include + +#include "client/mac/handler/ucontext_compat.h" +#include "client/minidump_file_writer.h" +#include "common/memory_allocator.h" +#include "common/mac/macho_utilities.h" +#include "google_breakpad/common/minidump_format.h" + +#include "dynamic_images.h" +#include "mach_vm_compat.h" + +#if !TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7) + #define HAS_PPC_SUPPORT +#endif +#if defined(__arm__) +#define HAS_ARM_SUPPORT +#elif defined(__aarch64__) +#define HAS_ARM64_SUPPORT +#elif defined(__i386__) || defined(__x86_64__) + #define HAS_X86_SUPPORT +#endif + +namespace google_breakpad { + +using std::string; + +// Use the REGISTER_FROM_THREADSTATE to access a register name from the +// breakpad_thread_state_t structure. +#if __DARWIN_OPAQUE_ARM_THREAD_STATE64 +#define ARRAY_REGISTER_FROM_THREADSTATE(a, b, i) ((a)->__##b[i]) +#define GET_REGISTER_FROM_THREADSTATE_fp(a) \ + (reinterpret_cast((a)->__opaque_fp)) +#define GET_REGISTER_FROM_THREADSTATE_lr(a) \ + (reinterpret_cast((a)->__opaque_lr)) +#define GET_REGISTER_FROM_THREADSTATE_sp(a) \ + (reinterpret_cast((a)->__opaque_sp)) +#define GET_REGISTER_FROM_THREADSTATE_pc(a) \ + (reinterpret_cast((a)->__opaque_pc)) +#define GET_REGISTER_FROM_THREADSTATE_cpsr(a) ((a)->__cpsr) +#define GET_REGISTER_FROM_THREADSTATE_flags(a) ((a)->__opaque_flags) +#define REGISTER_FROM_THREADSTATE(a, b) (GET_REGISTER_FROM_THREADSTATE_##b(a)) +#elif __DARWIN_UNIX03 || TARGET_CPU_X86_64 || TARGET_CPU_PPC64 || TARGET_CPU_ARM +// In The 10.5 SDK Headers Apple prepended __ to the variable names in the +// i386_thread_state_t structure. There's no good way to tell what version of +// the SDK we're compiling against so we just toggle on the same preprocessor +// symbol Apple's headers use. +#define REGISTER_FROM_THREADSTATE(a, b) ((a)->__ ## b) +#define ARRAY_REGISTER_FROM_THREADSTATE(a, b, i) \ + REGISTER_FROM_THREADSTATE(a, b[i]) +#else +#define REGISTER_FROM_THREADSTATE(a, b) (a->b) +#define ARRAY_REGISTER_FROM_THREADSTATE(a, b, i) \ + REGISTER_FROM_THREADSTATE(a, b[i]) +#endif + +// Creates a minidump file of the current process. If there is exception data, +// use SetExceptionInformation() to add this to the minidump. The minidump +// file is generated by the Write() function. +// Usage: +// MinidumpGenerator minidump(); +// minidump.Write("/tmp/minidump"); +// +class MinidumpGenerator { + public: + MinidumpGenerator(); + MinidumpGenerator(mach_port_t crashing_task, mach_port_t handler_thread); + + virtual ~MinidumpGenerator(); + + // Return

/.dmp + // Sets |unique_name| (if requested) to the unique name for the minidump + static string UniqueNameInDirectory(const string& dir, string* unique_name); + + // Write out the minidump into |path| + // All of the components of |path| must exist and be writable + // Return true if successful, false otherwise + bool Write(const char* path); + + // Specify some exception information, if applicable + void SetExceptionInformation(int type, int code, int subcode, + mach_port_t thread_name) { + exception_type_ = type; + exception_code_ = code; + exception_subcode_ = subcode; + exception_thread_ = thread_name; + } + + // Specify the task context. If |task_context| is not NULL, it will be used + // to retrieve the context of the current thread, instead of using + // |thread_get_state|. + void SetTaskContext(breakpad_ucontext_t* task_context); + + // Gather system information. This should be call at least once before using + // the MinidumpGenerator class. + static void GatherSystemInformation(); + + protected: + // Overridable Stream writers + virtual bool WriteExceptionStream(MDRawDirectory* exception_stream); + + // Overridable Helper + virtual bool WriteThreadStream(mach_port_t thread_id, MDRawThread* thread); + + private: + typedef bool (MinidumpGenerator::*WriteStreamFN)(MDRawDirectory*); + + // Stream writers + bool WriteThreadListStream(MDRawDirectory* thread_list_stream); + bool WriteMemoryListStream(MDRawDirectory* memory_list_stream); + bool WriteSystemInfoStream(MDRawDirectory* system_info_stream); + bool WriteModuleListStream(MDRawDirectory* module_list_stream); + bool WriteMiscInfoStream(MDRawDirectory* misc_info_stream); + bool WriteBreakpadInfoStream(MDRawDirectory* breakpad_info_stream); + + // Helpers + uint64_t CurrentPCForStack(breakpad_thread_state_data_t state); + bool GetThreadState(thread_act_t target_thread, thread_state_t state, + mach_msg_type_number_t* count); + bool WriteStackFromStartAddress(mach_vm_address_t start_addr, + MDMemoryDescriptor* stack_location); + bool WriteStack(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location); + bool WriteContext(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location); + bool WriteCVRecord(MDRawModule* module, int cpu_type, + const char* module_path, bool in_memory); + bool WriteModuleStream(unsigned int index, MDRawModule* module); + size_t CalculateStackSize(mach_vm_address_t start_addr); + int FindExecutableModule(); + + // Per-CPU implementations of these methods +#ifdef HAS_ARM_SUPPORT + bool WriteStackARM(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location); + bool WriteContextARM(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location); + uint64_t CurrentPCForStackARM(breakpad_thread_state_data_t state); +#endif +#ifdef HAS_ARM64_SUPPORT + bool WriteStackARM64(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location); + bool WriteContextARM64(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location); + uint64_t CurrentPCForStackARM64(breakpad_thread_state_data_t state); +#endif +#ifdef HAS_PPC_SUPPORT + bool WriteStackPPC(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location); + bool WriteContextPPC(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location); + uint64_t CurrentPCForStackPPC(breakpad_thread_state_data_t state); + bool WriteStackPPC64(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location); + bool WriteContextPPC64(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location); + uint64_t CurrentPCForStackPPC64(breakpad_thread_state_data_t state); +#endif +#ifdef HAS_X86_SUPPORT + bool WriteStackX86(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location); + bool WriteContextX86(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location); + uint64_t CurrentPCForStackX86(breakpad_thread_state_data_t state); + bool WriteStackX86_64(breakpad_thread_state_data_t state, + MDMemoryDescriptor* stack_location); + bool WriteContextX86_64(breakpad_thread_state_data_t state, + MDLocationDescriptor* register_location); + uint64_t CurrentPCForStackX86_64(breakpad_thread_state_data_t state); +#endif + + // disallow copy ctor and operator= + explicit MinidumpGenerator(const MinidumpGenerator&); + void operator=(const MinidumpGenerator&); + + protected: + // Use this writer to put the data to disk + MinidumpFileWriter writer_; + + private: + // Exception information + int exception_type_; + int exception_code_; + int exception_subcode_; + mach_port_t exception_thread_; + mach_port_t crashing_task_; + mach_port_t handler_thread_; + + // CPU type of the task being dumped. + cpu_type_t cpu_type_; + + // System information + static char build_string_[16]; + static int os_major_version_; + static int os_minor_version_; + static int os_build_number_; + + // Context of the task to dump. + breakpad_ucontext_t* task_context_; + + // Information about dynamically loaded code + DynamicImages* dynamic_images_; + + // PageAllocator makes it possible to allocate memory + // directly from the system, even while handling an exception. + mutable PageAllocator allocator_; + + protected: + // Blocks of memory written to the dump. These are all currently + // written while writing the thread list stream, but saved here + // so a memory list stream can be written afterwards. + wasteful_vector memory_blocks_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__ diff --git a/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj b/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1924ac4 --- /dev/null +++ b/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj @@ -0,0 +1,843 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 8BFC813F11FF9A58002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; }; + 8BFC814411FF9A9C002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; }; + 8BFC814511FF9A9D002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; }; + 8BFC814811FF9B13002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; }; + 8BFC814911FF9B13002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; }; + 8BFC814A11FF9B13002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; }; + 8BFC814B11FF9B3F002CB4DC /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */; }; + 8BFC814C11FF9B3F002CB4DC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */; }; + 8BFC81A211FF9C2E002CB4DC /* CPlusTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC819211FF9C23002CB4DC /* CPlusTest.framework */; }; + 8BFC81A311FF9C2F002CB4DC /* CPlusTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC819211FF9C23002CB4DC /* CPlusTest.framework */; }; + 8BFC81AD11FF9C8A002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; }; + 8BFC81AE11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; }; + 8BFC81AF11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; }; + 8BFC81B011FF9C8D002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; }; + 9B35FF5A0B267D5F008DE8C7 /* convert_UTF.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF560B267D5F008DE8C7 /* convert_UTF.cc */; }; + 9B35FF5B0B267D5F008DE8C7 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF580B267D5F008DE8C7 /* string_conversion.cc */; }; + 9B37CEEC0AF98ECD00FA4BD4 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */; }; + 9B7CA7700B12873A00CD3A1D /* minidump_file_writer-inl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BE3C01E0B0CE329009892DF /* minidump_file_writer-inl.h */; }; + 9B7CA8540B12989000CD3A1D /* minidump_file_writer_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B7CA8530B12989000CD3A1D /* minidump_file_writer_unittest.cc */; }; + 9B7CA8550B1298A100CD3A1D /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C230B01344C0055103E /* minidump_file_writer.cc */; }; + 9BC1D2940B336F2300F2A2B4 /* convert_UTF.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF560B267D5F008DE8C7 /* convert_UTF.cc */; }; + 9BC1D2950B336F2500F2A2B4 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF580B267D5F008DE8C7 /* string_conversion.cc */; }; + 9BD82AC10B0029DF0055103E /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */; }; + 9BD82BFF0B01333D0055103E /* exception_handler_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82BFD0B01333D0055103E /* exception_handler_test.cc */; }; + 9BD82C020B01333D0055103E /* minidump_generator_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82BFE0B01333D0055103E /* minidump_generator_test.cc */; }; + 9BD82C0D0B0133520055103E /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C090B0133520055103E /* exception_handler.cc */; }; + 9BD82C0E0B0133520055103E /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C0B0B0133520055103E /* minidump_generator.cc */; }; + 9BD82C0F0B0133520055103E /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C090B0133520055103E /* exception_handler.cc */; }; + 9BD82C100B0133520055103E /* exception_handler.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD82C0A0B0133520055103E /* exception_handler.h */; }; + 9BD82C110B0133520055103E /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C0B0B0133520055103E /* minidump_generator.cc */; }; + 9BD82C120B0133520055103E /* minidump_generator.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD82C0C0B0133520055103E /* minidump_generator.h */; }; + 9BD82C250B01344C0055103E /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C230B01344C0055103E /* minidump_file_writer.cc */; }; + 9BD82C260B01344C0055103E /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C230B01344C0055103E /* minidump_file_writer.cc */; }; + 9BD82C270B01344C0055103E /* minidump_file_writer.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD82C240B01344C0055103E /* minidump_file_writer.h */; }; + 9BD82C2D0B01345E0055103E /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C2B0B01345E0055103E /* string_utilities.cc */; }; + 9BD82C2E0B01345E0055103E /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C2B0B01345E0055103E /* string_utilities.cc */; }; + 9BD82C2F0B01345E0055103E /* string_utilities.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD82C2C0B01345E0055103E /* string_utilities.h */; }; + D2F651000BEF947200920385 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FA0BEF947200920385 /* file_id.cc */; }; + D2F651010BEF947200920385 /* file_id.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2F650FB0BEF947200920385 /* file_id.h */; }; + D2F651020BEF947200920385 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FC0BEF947200920385 /* macho_id.cc */; }; + D2F651030BEF947200920385 /* macho_id.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2F650FD0BEF947200920385 /* macho_id.h */; }; + D2F651040BEF947200920385 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FE0BEF947200920385 /* macho_utilities.cc */; }; + D2F651050BEF947200920385 /* macho_utilities.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2F650FF0BEF947200920385 /* macho_utilities.h */; }; + D2F651090BEF949A00920385 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F651070BEF949A00920385 /* dynamic_images.cc */; }; + D2F6510A0BEF949A00920385 /* dynamic_images.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2F651080BEF949A00920385 /* dynamic_images.h */; }; + D2F6510E0BEF94EB00920385 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F6510C0BEF94EB00920385 /* macho_walker.cc */; }; + D2F6510F0BEF94EB00920385 /* macho_walker.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2F6510D0BEF94EB00920385 /* macho_walker.h */; }; + D2F651110BEF951700920385 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF580B267D5F008DE8C7 /* string_conversion.cc */; }; + D2F651130BEF951C00920385 /* string_conversion.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9B35FF590B267D5F008DE8C7 /* string_conversion.h */; }; + D2F651150BEF953000920385 /* convert_UTF.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF560B267D5F008DE8C7 /* convert_UTF.cc */; }; + D2F651160BEF953100920385 /* convert_UTF.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9B35FF570B267D5F008DE8C7 /* convert_UTF.h */; }; + D2F6511B0BEF970E00920385 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F651070BEF949A00920385 /* dynamic_images.cc */; }; + D2F6511D0BEF973500920385 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FA0BEF947200920385 /* file_id.cc */; }; + D2F6511E0BEF973600920385 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FC0BEF947200920385 /* macho_id.cc */; }; + D2F6511F0BEF973900920385 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FE0BEF947200920385 /* macho_utilities.cc */; }; + D2F651210BEF975400920385 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F6510C0BEF94EB00920385 /* macho_walker.cc */; }; + F93A887D0E8B4C8C0026AF89 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F6510C0BEF94EB00920385 /* macho_walker.cc */; }; + F93A887E0E8B4C8C0026AF89 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FC0BEF947200920385 /* macho_id.cc */; }; + F93A887F0E8B4C8C0026AF89 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FE0BEF947200920385 /* macho_utilities.cc */; }; + F93A88800E8B4C8C0026AF89 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FA0BEF947200920385 /* file_id.cc */; }; + F93A88860E8B4C9A0026AF89 /* dwarftests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9721F310E8B07E800D7E813 /* dwarftests.mm */; }; + F93A88870E8B4C9A0026AF89 /* dump_syms.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721F390E8B0D0D00D7E813 /* dump_syms.cc */; }; + F93A88880E8B4C9A0026AF89 /* bytereader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721F760E8B0DC700D7E813 /* bytereader.cc */; }; + F93A88890E8B4C9A0026AF89 /* dwarf2reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */; }; + F93A888A0E8B4C9A0026AF89 /* functioninfo.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721F780E8B0DC700D7E813 /* functioninfo.cc */; }; + F93A888B0E8B4C9A0026AF89 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721FA80E8B0E4800D7E813 /* md5.cc */; }; + F9721F6C0E8B0D7000D7E813 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */; }; + F9721FA20E8B0E2300D7E813 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */; }; + F982089C0DB3280D0017AECA /* breakpad_nlist_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */; }; + F98208A30DB32CAE0017AECA /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; }; + F9AE5B390DBFDBDB00505983 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F651070BEF949A00920385 /* dynamic_images.cc */; }; + F9AE5B3A0DBFDBDB00505983 /* DynamicImagesTests.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9C5A4210DB82DD800209C76 /* DynamicImagesTests.cc */; }; + F9B34E870DBC1E1600306484 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F651070BEF949A00920385 /* dynamic_images.cc */; }; + F9C5A4220DB82DD800209C76 /* DynamicImagesTests.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9C5A4210DB82DD800209C76 /* DynamicImagesTests.cc */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F690486A84900D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + 9BD82C100B0133520055103E /* exception_handler.h in CopyFiles */, + 9BD82C120B0133520055103E /* minidump_generator.h in CopyFiles */, + 9BD82C270B01344C0055103E /* minidump_file_writer.h in CopyFiles */, + 9BD82C2F0B01345E0055103E /* string_utilities.h in CopyFiles */, + 9B7CA7700B12873A00CD3A1D /* minidump_file_writer-inl.h in CopyFiles */, + D2F651010BEF947200920385 /* file_id.h in CopyFiles */, + D2F651030BEF947200920385 /* macho_id.h in CopyFiles */, + D2F651050BEF947200920385 /* macho_utilities.h in CopyFiles */, + D2F6510A0BEF949A00920385 /* dynamic_images.h in CopyFiles */, + D2F6510F0BEF94EB00920385 /* macho_walker.h in CopyFiles */, + D2F651130BEF951C00920385 /* string_conversion.h in CopyFiles */, + D2F651160BEF953100920385 /* convert_UTF.h in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 8BFC812011FF99D5002CB4DC /* Breakpad.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Breakpad.xcconfig; path = ../../../common/mac/Breakpad.xcconfig; sourceTree = SOURCE_ROOT; }; + 8BFC812111FF99D5002CB4DC /* BreakpadDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadDebug.xcconfig; path = ../../../common/mac/BreakpadDebug.xcconfig; sourceTree = SOURCE_ROOT; }; + 8BFC812211FF99D5002CB4DC /* BreakpadRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadRelease.xcconfig; path = ../../../common/mac/BreakpadRelease.xcconfig; sourceTree = SOURCE_ROOT; }; + 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcrypto.dylib; path = usr/lib/libcrypto.dylib; sourceTree = SDKROOT; }; + 8BFC815411FF9B7F002CB4DC /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; + 8BFC819211FF9C23002CB4DC /* CPlusTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CPlusTest.framework; path = Library/Frameworks/CPlusTest.framework; sourceTree = DEVELOPER_DIR; }; + 8DD76F6C0486A84900D96B5E /* generator_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = generator_test; sourceTree = BUILT_PRODUCTS_DIR; }; + 9B35FF560B267D5F008DE8C7 /* convert_UTF.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = convert_UTF.cc; path = ../../../common/convert_UTF.cc; sourceTree = SOURCE_ROOT; }; + 9B35FF570B267D5F008DE8C7 /* convert_UTF.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = convert_UTF.h; path = ../../../common/convert_UTF.h; sourceTree = SOURCE_ROOT; }; + 9B35FF580B267D5F008DE8C7 /* string_conversion.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = string_conversion.cc; path = ../../../common/string_conversion.cc; sourceTree = SOURCE_ROOT; }; + 9B35FF590B267D5F008DE8C7 /* string_conversion.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = string_conversion.h; path = ../../../common/string_conversion.h; sourceTree = SOURCE_ROOT; }; + 9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; + 9B7CA84E0B1297F200CD3A1D /* unit_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = unit_test; sourceTree = BUILT_PRODUCTS_DIR; }; + 9B7CA8530B12989000CD3A1D /* minidump_file_writer_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer_unittest.cc; path = ../../minidump_file_writer_unittest.cc; sourceTree = ""; }; + 9BD82A9B0B00267E0055103E /* handler_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = handler_test; sourceTree = BUILT_PRODUCTS_DIR; }; + 9BD82BFD0B01333D0055103E /* exception_handler_test.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = exception_handler_test.cc; sourceTree = SOURCE_ROOT; }; + 9BD82BFE0B01333D0055103E /* minidump_generator_test.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = minidump_generator_test.cc; sourceTree = SOURCE_ROOT; }; + 9BD82C090B0133520055103E /* exception_handler.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = exception_handler.cc; sourceTree = SOURCE_ROOT; }; + 9BD82C0A0B0133520055103E /* exception_handler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = exception_handler.h; sourceTree = SOURCE_ROOT; }; + 9BD82C0B0B0133520055103E /* minidump_generator.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = minidump_generator.cc; sourceTree = SOURCE_ROOT; }; + 9BD82C0C0B0133520055103E /* minidump_generator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = minidump_generator.h; sourceTree = SOURCE_ROOT; }; + 9BD82C230B01344C0055103E /* minidump_file_writer.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer.cc; path = ../../minidump_file_writer.cc; sourceTree = SOURCE_ROOT; }; + 9BD82C240B01344C0055103E /* minidump_file_writer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = minidump_file_writer.h; path = ../../minidump_file_writer.h; sourceTree = SOURCE_ROOT; }; + 9BD82C2B0B01345E0055103E /* string_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = string_utilities.cc; path = ../../../common/mac/string_utilities.cc; sourceTree = SOURCE_ROOT; }; + 9BD82C2C0B01345E0055103E /* string_utilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = string_utilities.h; path = ../../../common/mac/string_utilities.h; sourceTree = SOURCE_ROOT; }; + 9BE3C01E0B0CE329009892DF /* minidump_file_writer-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "minidump_file_writer-inl.h"; path = "../../minidump_file_writer-inl.h"; sourceTree = SOURCE_ROOT; }; + D2F650FA0BEF947200920385 /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = file_id.cc; path = ../../../common/mac/file_id.cc; sourceTree = SOURCE_ROOT; }; + D2F650FB0BEF947200920385 /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = file_id.h; path = ../../../common/mac/file_id.h; sourceTree = SOURCE_ROOT; }; + D2F650FC0BEF947200920385 /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_id.cc; path = ../../../common/mac/macho_id.cc; sourceTree = SOURCE_ROOT; }; + D2F650FD0BEF947200920385 /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../../common/mac/macho_id.h; sourceTree = SOURCE_ROOT; }; + D2F650FE0BEF947200920385 /* macho_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_utilities.cc; path = ../../../common/mac/macho_utilities.cc; sourceTree = SOURCE_ROOT; }; + D2F650FF0BEF947200920385 /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_utilities.h; path = ../../../common/mac/macho_utilities.h; sourceTree = SOURCE_ROOT; }; + D2F651070BEF949A00920385 /* dynamic_images.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = dynamic_images.cc; sourceTree = ""; }; + D2F651080BEF949A00920385 /* dynamic_images.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = dynamic_images.h; sourceTree = ""; }; + D2F6510C0BEF94EB00920385 /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; }; + D2F6510D0BEF94EB00920385 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; }; + F917C4F70E03265A00F86017 /* breakpad_exc_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = breakpad_exc_server.c; sourceTree = ""; }; + F917C4F80E03265A00F86017 /* breakpad_exc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_exc_server.h; sourceTree = ""; }; + F93A88750E8B4C700026AF89 /* octestcases.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = octestcases.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + F93A88760E8B4C700026AF89 /* obj-cTestCases-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "obj-cTestCases-Info.plist"; sourceTree = ""; }; + F9721F300E8B07E800D7E813 /* dwarftests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dwarftests.h; sourceTree = ""; }; + F9721F310E8B07E800D7E813 /* dwarftests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = dwarftests.mm; sourceTree = ""; }; + F9721F380E8B0CFC00D7E813 /* dump_syms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dump_syms.h; path = ../../../common/mac/dump_syms.h; sourceTree = SOURCE_ROOT; }; + F9721F390E8B0D0D00D7E813 /* dump_syms.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = dump_syms.cc; path = ../../../common/mac/dump_syms.cc; sourceTree = SOURCE_ROOT; }; + F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + F9721F760E8B0DC700D7E813 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; }; + F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; }; + F9721F780E8B0DC700D7E813 /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; }; + F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + F9721FA80E8B0E4800D7E813 /* md5.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.cc; path = ../../../common/md5.cc; sourceTree = SOURCE_ROOT; }; + F982089A0DB3280D0017AECA /* breakpad_nlist_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_test.h; sourceTree = ""; }; + F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_test.cc; sourceTree = ""; }; + F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_64.cc; sourceTree = ""; }; + F98208A20DB32CAE0017AECA /* breakpad_nlist_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_64.h; sourceTree = ""; }; + F9AE19B50DB040E300C98454 /* minidump_tests32-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "minidump_tests32-Info.plist"; sourceTree = ""; }; + F9AE19C30DB04A9500C98454 /* minidump_tests64.cptest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = minidump_tests64.cptest; sourceTree = BUILT_PRODUCTS_DIR; }; + F9AE5B330DBFDBA300505983 /* minidump_tests32.cptest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = minidump_tests32.cptest; sourceTree = BUILT_PRODUCTS_DIR; }; + F9AE5B340DBFDBA300505983 /* minidump_tests64-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "minidump_tests64-Info.plist"; sourceTree = ""; }; + F9C5A4200DB82DD800209C76 /* DynamicImagesTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicImagesTests.h; sourceTree = ""; }; + F9C5A4210DB82DD800209C76 /* DynamicImagesTests.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DynamicImagesTests.cc; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F660486A84900D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9B37CEEC0AF98ECD00FA4BD4 /* CoreFoundation.framework in Frameworks */, + 8BFC813F11FF9A58002CB4DC /* libcrypto.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9B7CA84C0B1297F200CD3A1D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8BFC814511FF9A9D002CB4DC /* libcrypto.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9BD82A990B00267E0055103E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9BD82AC10B0029DF0055103E /* CoreFoundation.framework in Frameworks */, + 8BFC814411FF9A9C002CB4DC /* libcrypto.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F93A88720E8B4C700026AF89 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8BFC814A11FF9B13002CB4DC /* libcrypto.dylib in Frameworks */, + 8BFC814B11FF9B3F002CB4DC /* SenTestingKit.framework in Frameworks */, + 8BFC814C11FF9B3F002CB4DC /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9AE19C00DB04A9500C98454 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8BFC814811FF9B13002CB4DC /* libcrypto.dylib in Frameworks */, + 8BFC81A211FF9C2E002CB4DC /* CPlusTest.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9AE5B300DBFDBA300505983 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F9721F6C0E8B0D7000D7E813 /* Cocoa.framework in Frameworks */, + F9721FA20E8B0E2300D7E813 /* SenTestingKit.framework in Frameworks */, + 8BFC814911FF9B13002CB4DC /* libcrypto.dylib in Frameworks */, + 8BFC81A311FF9C2F002CB4DC /* CPlusTest.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* MinidumpWriter */ = { + isa = PBXGroup; + children = ( + 8BFC812011FF99D5002CB4DC /* Breakpad.xcconfig */, + 8BFC812111FF99D5002CB4DC /* BreakpadDebug.xcconfig */, + 8BFC812211FF99D5002CB4DC /* BreakpadRelease.xcconfig */, + F9721FA80E8B0E4800D7E813 /* md5.cc */, + F9721F760E8B0DC700D7E813 /* bytereader.cc */, + F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */, + F9721F780E8B0DC700D7E813 /* functioninfo.cc */, + F9721F390E8B0D0D00D7E813 /* dump_syms.cc */, + F9721F380E8B0CFC00D7E813 /* dump_syms.h */, + F917C4F70E03265A00F86017 /* breakpad_exc_server.c */, + F917C4F80E03265A00F86017 /* breakpad_exc_server.h */, + F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */, + F98208A20DB32CAE0017AECA /* breakpad_nlist_64.h */, + D2F6510C0BEF94EB00920385 /* macho_walker.cc */, + D2F6510D0BEF94EB00920385 /* macho_walker.h */, + D2F651070BEF949A00920385 /* dynamic_images.cc */, + D2F651080BEF949A00920385 /* dynamic_images.h */, + D2F650FA0BEF947200920385 /* file_id.cc */, + D2F650FB0BEF947200920385 /* file_id.h */, + D2F650FC0BEF947200920385 /* macho_id.cc */, + D2F650FD0BEF947200920385 /* macho_id.h */, + D2F650FE0BEF947200920385 /* macho_utilities.cc */, + D2F650FF0BEF947200920385 /* macho_utilities.h */, + F9C5A41F0DB82DB000209C76 /* testcases */, + 9BD82C040B0133420055103E /* Breakpad */, + 08FB7795FE84155DC02AAC07 /* Source */, + 9B37CEEA0AF98EB600FA4BD4 /* Frameworks */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + F9AE19B50DB040E300C98454 /* minidump_tests32-Info.plist */, + F9AE5B340DBFDBA300505983 /* minidump_tests64-Info.plist */, + F93A88760E8B4C700026AF89 /* obj-cTestCases-Info.plist */, + ); + name = MinidumpWriter; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 9BD82BFD0B01333D0055103E /* exception_handler_test.cc */, + 9BD82BFE0B01333D0055103E /* minidump_generator_test.cc */, + 9B7CA8530B12989000CD3A1D /* minidump_file_writer_unittest.cc */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76F6C0486A84900D96B5E /* generator_test */, + 9BD82A9B0B00267E0055103E /* handler_test */, + 9B7CA84E0B1297F200CD3A1D /* unit_test */, + F9AE19C30DB04A9500C98454 /* minidump_tests64.cptest */, + F9AE5B330DBFDBA300505983 /* minidump_tests32.cptest */, + F93A88750E8B4C700026AF89 /* octestcases.octest */, + ); + name = Products; + sourceTree = ""; + }; + 9B37CEEA0AF98EB600FA4BD4 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */, + 8BFC815411FF9B7F002CB4DC /* Carbon.framework */, + F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */, + F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */, + 9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */, + 8BFC819211FF9C23002CB4DC /* CPlusTest.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9BD82C040B0133420055103E /* Breakpad */ = { + isa = PBXGroup; + children = ( + 9B35FF560B267D5F008DE8C7 /* convert_UTF.cc */, + 9B35FF570B267D5F008DE8C7 /* convert_UTF.h */, + 9B35FF580B267D5F008DE8C7 /* string_conversion.cc */, + 9B35FF590B267D5F008DE8C7 /* string_conversion.h */, + 9BD82C090B0133520055103E /* exception_handler.cc */, + 9BD82C0A0B0133520055103E /* exception_handler.h */, + 9BD82C0B0B0133520055103E /* minidump_generator.cc */, + 9BD82C0C0B0133520055103E /* minidump_generator.h */, + 9BD82C230B01344C0055103E /* minidump_file_writer.cc */, + 9BE3C01E0B0CE329009892DF /* minidump_file_writer-inl.h */, + 9BD82C240B01344C0055103E /* minidump_file_writer.h */, + 9BD82C2B0B01345E0055103E /* string_utilities.cc */, + 9BD82C2C0B01345E0055103E /* string_utilities.h */, + ); + name = Breakpad; + sourceTree = ""; + }; + F9C5A41F0DB82DB000209C76 /* testcases */ = { + isa = PBXGroup; + children = ( + F982089A0DB3280D0017AECA /* breakpad_nlist_test.h */, + F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */, + F9C5A4200DB82DD800209C76 /* DynamicImagesTests.h */, + F9C5A4210DB82DD800209C76 /* DynamicImagesTests.cc */, + F9721F300E8B07E800D7E813 /* dwarftests.h */, + F9721F310E8B07E800D7E813 /* dwarftests.mm */, + ); + path = testcases; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F620486A84900D96B5E /* generator_test */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "generator_test" */; + buildPhases = ( + 8DD76F640486A84900D96B5E /* Sources */, + 8DD76F660486A84900D96B5E /* Frameworks */, + 8DD76F690486A84900D96B5E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = generator_test; + productInstallPath = "$(HOME)/bin"; + productName = MinidumpWriter; + productReference = 8DD76F6C0486A84900D96B5E /* generator_test */; + productType = "com.apple.product-type.tool"; + }; + 9B7CA84D0B1297F200CD3A1D /* unit_test */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9B7CA8500B12984300CD3A1D /* Build configuration list for PBXNativeTarget "unit_test" */; + buildPhases = ( + 9B7CA84B0B1297F200CD3A1D /* Sources */, + 9B7CA84C0B1297F200CD3A1D /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = unit_test; + productName = "filewriter unit test"; + productReference = 9B7CA84E0B1297F200CD3A1D /* unit_test */; + productType = "com.apple.product-type.tool"; + }; + 9BD82A9A0B00267E0055103E /* handler_test */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9BD82AA60B0026BF0055103E /* Build configuration list for PBXNativeTarget "handler_test" */; + buildPhases = ( + 9BD82A980B00267E0055103E /* Sources */, + 9BD82A990B00267E0055103E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = handler_test; + productName = ExceptionTester; + productReference = 9BD82A9B0B00267E0055103E /* handler_test */; + productType = "com.apple.product-type.tool"; + }; + F93A88740E8B4C700026AF89 /* obj-c_TestCases */ = { + isa = PBXNativeTarget; + buildConfigurationList = F93A88790E8B4C700026AF89 /* Build configuration list for PBXNativeTarget "obj-c_TestCases" */; + buildPhases = ( + F93A88700E8B4C700026AF89 /* Resources */, + F93A88710E8B4C700026AF89 /* Sources */, + F93A88720E8B4C700026AF89 /* Frameworks */, + F93A88730E8B4C700026AF89 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "obj-c_TestCases"; + productName = octestcases; + productReference = F93A88750E8B4C700026AF89 /* octestcases.octest */; + productType = "com.apple.product-type.bundle"; + }; + F9AE19C20DB04A9500C98454 /* minidump_tests64 */ = { + isa = PBXNativeTarget; + buildConfigurationList = F9AE19C70DB04AA200C98454 /* Build configuration list for PBXNativeTarget "minidump_tests64" */; + buildPhases = ( + F9AE19BE0DB04A9500C98454 /* Resources */, + F9AE19BF0DB04A9500C98454 /* Sources */, + F9AE19C00DB04A9500C98454 /* Frameworks */, + F9AE19C10DB04A9500C98454 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = minidump_tests64; + productName = minidump_tests; + productReference = F9AE19C30DB04A9500C98454 /* minidump_tests64.cptest */; + productType = "com.apple.product-type.bundle"; + }; + F9AE5B320DBFDBA300505983 /* minidump_tests32 */ = { + isa = PBXNativeTarget; + buildConfigurationList = F9AE5B380DBFDBA300505983 /* Build configuration list for PBXNativeTarget "minidump_tests32" */; + buildPhases = ( + F9AE5B2E0DBFDBA300505983 /* Resources */, + F9AE5B2F0DBFDBA300505983 /* Sources */, + F9AE5B300DBFDBA300505983 /* Frameworks */, + F9AE5B310DBFDBA300505983 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = minidump_tests32; + productName = Untitled; + productReference = F9AE5B330DBFDBA300505983 /* minidump_tests32.cptest */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "minidump_test" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* MinidumpWriter */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F620486A84900D96B5E /* generator_test */, + 9BD82A9A0B00267E0055103E /* handler_test */, + 9B7CA84D0B1297F200CD3A1D /* unit_test */, + F9AE19C20DB04A9500C98454 /* minidump_tests64 */, + F9AE5B320DBFDBA300505983 /* minidump_tests32 */, + F93A88740E8B4C700026AF89 /* obj-c_TestCases */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + F93A88700E8B4C700026AF89 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9AE19BE0DB04A9500C98454 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9AE5B2E0DBFDBA300505983 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + F93A88730E8B4C700026AF89 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; + }; + F9AE19C10DB04A9500C98454 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n# Run gcov on the framework getting tested\nif [ \"${CONFIGURATION}\" = 'Coverage' ];\nthen\n FRAMEWORK_NAME=minidump_tests64\n FRAMEWORK_OBJ_DIR=${OBJROOT}/${PROJECT_NAME}.build/${CONFIGURATION}/${FRAMEWORK_NAME}.build/Objects-normal/${NATIVE_ARCH_ACTUAL}\n mkdir -p coverage\n pushd coverage\n echo find ${OBJROOT} -name *.gcda -exec gcov -o ${FRAMEWORK_OBJ_DIR} {} \\;\n find ${OBJROOT} -name *.gcda -exec gcov -o ${FRAMEWORK_OBJ_DIR} {} \\;\n popd\nfi "; + }; + F9AE5B310DBFDBA300505983 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F640486A84900D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9BD82C020B01333D0055103E /* minidump_generator_test.cc in Sources */, + 9BD82C0F0B0133520055103E /* exception_handler.cc in Sources */, + 9BD82C110B0133520055103E /* minidump_generator.cc in Sources */, + 9BD82C260B01344C0055103E /* minidump_file_writer.cc in Sources */, + 9BD82C2E0B01345E0055103E /* string_utilities.cc in Sources */, + D2F651000BEF947200920385 /* file_id.cc in Sources */, + D2F651020BEF947200920385 /* macho_id.cc in Sources */, + D2F651040BEF947200920385 /* macho_utilities.cc in Sources */, + D2F651090BEF949A00920385 /* dynamic_images.cc in Sources */, + D2F6510E0BEF94EB00920385 /* macho_walker.cc in Sources */, + D2F651110BEF951700920385 /* string_conversion.cc in Sources */, + D2F651150BEF953000920385 /* convert_UTF.cc in Sources */, + 8BFC81B011FF9C8D002CB4DC /* breakpad_nlist_64.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9B7CA84B0B1297F200CD3A1D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9B7CA8540B12989000CD3A1D /* minidump_file_writer_unittest.cc in Sources */, + 9B7CA8550B1298A100CD3A1D /* minidump_file_writer.cc in Sources */, + 9BC1D2940B336F2300F2A2B4 /* convert_UTF.cc in Sources */, + 9BC1D2950B336F2500F2A2B4 /* string_conversion.cc in Sources */, + 8BFC81AE11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9BD82A980B00267E0055103E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9BD82BFF0B01333D0055103E /* exception_handler_test.cc in Sources */, + 9BD82C0D0B0133520055103E /* exception_handler.cc in Sources */, + 9BD82C0E0B0133520055103E /* minidump_generator.cc in Sources */, + 9BD82C250B01344C0055103E /* minidump_file_writer.cc in Sources */, + 9BD82C2D0B01345E0055103E /* string_utilities.cc in Sources */, + 9B35FF5A0B267D5F008DE8C7 /* convert_UTF.cc in Sources */, + 9B35FF5B0B267D5F008DE8C7 /* string_conversion.cc in Sources */, + D2F6511B0BEF970E00920385 /* dynamic_images.cc in Sources */, + D2F6511D0BEF973500920385 /* file_id.cc in Sources */, + D2F6511E0BEF973600920385 /* macho_id.cc in Sources */, + D2F6511F0BEF973900920385 /* macho_utilities.cc in Sources */, + D2F651210BEF975400920385 /* macho_walker.cc in Sources */, + 8BFC81AF11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F93A88710E8B4C700026AF89 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F93A88860E8B4C9A0026AF89 /* dwarftests.mm in Sources */, + F93A88870E8B4C9A0026AF89 /* dump_syms.cc in Sources */, + F93A88880E8B4C9A0026AF89 /* bytereader.cc in Sources */, + F93A88890E8B4C9A0026AF89 /* dwarf2reader.cc in Sources */, + F93A888A0E8B4C9A0026AF89 /* functioninfo.cc in Sources */, + F93A888B0E8B4C9A0026AF89 /* md5.cc in Sources */, + F93A887D0E8B4C8C0026AF89 /* macho_walker.cc in Sources */, + F93A887E0E8B4C8C0026AF89 /* macho_id.cc in Sources */, + F93A887F0E8B4C8C0026AF89 /* macho_utilities.cc in Sources */, + F93A88800E8B4C8C0026AF89 /* file_id.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9AE19BF0DB04A9500C98454 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F9B34E870DBC1E1600306484 /* dynamic_images.cc in Sources */, + F982089C0DB3280D0017AECA /* breakpad_nlist_test.cc in Sources */, + F98208A30DB32CAE0017AECA /* breakpad_nlist_64.cc in Sources */, + F9C5A4220DB82DD800209C76 /* DynamicImagesTests.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9AE5B2F0DBFDBA300505983 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F9AE5B390DBFDBDB00505983 /* dynamic_images.cc in Sources */, + F9AE5B3A0DBFDBDB00505983 /* DynamicImagesTests.cc in Sources */, + 8BFC81AD11FF9C8A002CB4DC /* breakpad_nlist_64.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB923208733DC60010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_FRAMEWORKS_DIR)\"", + ); + PRODUCT_NAME = generator_test; + USER_HEADER_SEARCH_PATHS = "../../../** $(inherited)"; + }; + name = Debug; + }; + 1DEB923308733DC60010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_FRAMEWORKS_DIR)\"", + ); + PRODUCT_NAME = generator_test; + USER_HEADER_SEARCH_PATHS = "../../../** $(inherited)"; + }; + name = Release; + }; + 1DEB923608733DC60010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8BFC812111FF99D5002CB4DC /* BreakpadDebug.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 1DEB923708733DC60010E9CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8BFC812211FF99D5002CB4DC /* BreakpadRelease.xcconfig */; + buildSettings = { + }; + name = Release; + }; + 9B7CA8510B12984300CD3A1D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = unit_test; + USER_HEADER_SEARCH_PATHS = "../../../** $(inherited)"; + }; + name = Debug; + }; + 9B7CA8520B12984300CD3A1D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = unit_test; + USER_HEADER_SEARCH_PATHS = "../../../** $(inherited)"; + }; + name = Release; + }; + 9BD82AA70B0026BF0055103E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = handler_test; + USER_HEADER_SEARCH_PATHS = "../../.. $(inherited)"; + }; + name = Debug; + }; + 9BD82AA80B0026BF0055103E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = handler_test; + USER_HEADER_SEARCH_PATHS = "../../.. $(inherited)"; + }; + name = Release; + }; + F93A88770E8B4C700026AF89 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + INFOPLIST_FILE = "obj-cTestCases-Info.plist"; + PRODUCT_NAME = octestcases; + USER_HEADER_SEARCH_PATHS = "../../../..//**"; + WRAPPER_EXTENSION = octest; + }; + name = Debug; + }; + F93A88780E8B4C700026AF89 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + INFOPLIST_FILE = "obj-cTestCases-Info.plist"; + PRODUCT_NAME = octestcases; + USER_HEADER_SEARCH_PATHS = "../../../..//**"; + WRAPPER_EXTENSION = octest; + }; + name = Release; + }; + F9AE19C40DB04A9500C98454 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + INFOPLIST_FILE = "minidump_tests64-Info.plist"; + PRODUCT_NAME = minidump_tests64; + USER_HEADER_SEARCH_PATHS = "../../../**"; + WRAPPER_EXTENSION = cptest; + }; + name = Debug; + }; + F9AE19C50DB04A9500C98454 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + INFOPLIST_FILE = "minidump_tests64-Info.plist"; + PRODUCT_NAME = minidump_tests64; + USER_HEADER_SEARCH_PATHS = "../../../**"; + WRAPPER_EXTENSION = cptest; + }; + name = Release; + }; + F9AE5B350DBFDBA300505983 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + INFOPLIST_FILE = "minidump_tests32-Info.plist"; + PRODUCT_NAME = minidump_tests32; + USER_HEADER_SEARCH_PATHS = "../../../**"; + WRAPPER_EXTENSION = cptest; + }; + name = Debug; + }; + F9AE5B370DBFDBA300505983 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; + INFOPLIST_FILE = "minidump_tests32-Info.plist"; + PRODUCT_NAME = minidump_tests32; + USER_HEADER_SEARCH_PATHS = "../../../**"; + WRAPPER_EXTENSION = cptest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget "generator_test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923208733DC60010E9CD /* Debug */, + 1DEB923308733DC60010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "minidump_test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB923608733DC60010E9CD /* Debug */, + 1DEB923708733DC60010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9B7CA8500B12984300CD3A1D /* Build configuration list for PBXNativeTarget "unit_test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9B7CA8510B12984300CD3A1D /* Debug */, + 9B7CA8520B12984300CD3A1D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9BD82AA60B0026BF0055103E /* Build configuration list for PBXNativeTarget "handler_test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9BD82AA70B0026BF0055103E /* Debug */, + 9BD82AA80B0026BF0055103E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F93A88790E8B4C700026AF89 /* Build configuration list for PBXNativeTarget "obj-c_TestCases" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F93A88770E8B4C700026AF89 /* Debug */, + F93A88780E8B4C700026AF89 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F9AE19C70DB04AA200C98454 /* Build configuration list for PBXNativeTarget "minidump_tests64" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F9AE19C40DB04A9500C98454 /* Debug */, + F9AE19C50DB04A9500C98454 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F9AE5B380DBFDBA300505983 /* Build configuration list for PBXNativeTarget "minidump_tests32" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F9AE5B350DBFDBA300505983 /* Debug */, + F9AE5B370DBFDBA300505983 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/src/client/mac/handler/minidump_tests32-Info.plist b/src/client/mac/handler/minidump_tests32-Info.plist new file mode 100644 index 0000000..921ebf3 --- /dev/null +++ b/src/client/mac/handler/minidump_tests32-Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.google.breakpad.minidump_tests32 + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/src/client/mac/handler/minidump_tests64-Info.plist b/src/client/mac/handler/minidump_tests64-Info.plist new file mode 100644 index 0000000..acfbd30 --- /dev/null +++ b/src/client/mac/handler/minidump_tests64-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.google.breakpad.minidump_tests64 + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CSResourcesFileMapped + yes + + diff --git a/src/client/mac/handler/obj-cTestCases-Info.plist b/src/client/mac/handler/obj-cTestCases-Info.plist new file mode 100644 index 0000000..6501355 --- /dev/null +++ b/src/client/mac/handler/obj-cTestCases-Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.yourcompany.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/src/client/mac/handler/protected_memory_allocator.cc b/src/client/mac/handler/protected_memory_allocator.cc new file mode 100644 index 0000000..8205a21 --- /dev/null +++ b/src/client/mac/handler/protected_memory_allocator.cc @@ -0,0 +1,95 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ProtectedMemoryAllocator +// +// See the header file for documentation + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "protected_memory_allocator.h" +#include + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +ProtectedMemoryAllocator::ProtectedMemoryAllocator(vm_size_t pool_size) + : pool_size_(pool_size), + next_alloc_offset_(0), + valid_(false) { + + kern_return_t result = vm_allocate(mach_task_self(), + &base_address_, + pool_size, + TRUE + ); + + valid_ = (result == KERN_SUCCESS); + assert(valid_); +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +ProtectedMemoryAllocator::~ProtectedMemoryAllocator() { + vm_deallocate(mach_task_self(), + base_address_, + pool_size_ + ); +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +char *ProtectedMemoryAllocator::Allocate(vm_size_t bytes) { + if (valid_ && next_alloc_offset_ + bytes <= pool_size_) { + char *p = (char*)base_address_ + next_alloc_offset_; + next_alloc_offset_ += bytes; + return p; + } + + return NULL; // ran out of memory in our allocation block +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +kern_return_t ProtectedMemoryAllocator::Protect() { + kern_return_t result = vm_protect(mach_task_self(), + base_address_, + pool_size_, + FALSE, + VM_PROT_READ); + + return result; +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +kern_return_t ProtectedMemoryAllocator::Unprotect() { + kern_return_t result = vm_protect(mach_task_self(), + base_address_, + pool_size_, + FALSE, + VM_PROT_READ | VM_PROT_WRITE); + + return result; +} diff --git a/src/client/mac/handler/protected_memory_allocator.h b/src/client/mac/handler/protected_memory_allocator.h new file mode 100644 index 0000000..86413c8 --- /dev/null +++ b/src/client/mac/handler/protected_memory_allocator.h @@ -0,0 +1,84 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ProtectedMemoryAllocator +// +// A very simple allocator class which allows allocation, but not deallocation. +// The allocations can be made read-only with the Protect() method. +// This class is NOT useful as a general-purpose memory allocation system, +// since it does not allow deallocation. It is useful to use for a group +// of allocations which are created in the same time-frame and destroyed +// in the same time-frame. It is useful for making allocations of memory +// which will not need to change often once initialized. This memory can then +// be protected from memory smashers by calling the Protect() method. + +#ifndef PROTECTED_MEMORY_ALLOCATOR_H__ +#define PROTECTED_MEMORY_ALLOCATOR_H__ + +#include + +// +class ProtectedMemoryAllocator { + public: + ProtectedMemoryAllocator(vm_size_t pool_size); + ~ProtectedMemoryAllocator(); + + // Returns a pointer to an allocation of size n within the pool. + // Fails by returning NULL is no more space is available. + // Please note that the pointers returned from this method should not + // be freed in any way (for example by calling free() on them ). + char * Allocate(vm_size_t n); + + // Returns the base address of the allocation pool. + char * GetBaseAddress() { return (char*)base_address_; } + + // Returns the size of the allocation pool, including allocated + // plus free space. + vm_size_t GetTotalSize() { return pool_size_; } + + // Returns the number of bytes already allocated in the pool. + vm_size_t GetAllocatedSize() { return next_alloc_offset_; } + + // Returns the number of bytes available for allocation. + vm_size_t GetFreeSize() { return pool_size_ - next_alloc_offset_; } + + // Makes the entire allocation pool read-only including, of course, + // all allocations made from the pool. + kern_return_t Protect(); + + // Makes the entire allocation pool read/write. + kern_return_t Unprotect(); + + private: + vm_size_t pool_size_; + vm_address_t base_address_; + vm_size_t next_alloc_offset_; + bool valid_; +}; + +#endif // PROTECTED_MEMORY_ALLOCATOR_H__ diff --git a/src/client/mac/handler/testcases/DynamicImagesTests.cc b/src/client/mac/handler/testcases/DynamicImagesTests.cc new file mode 100644 index 0000000..d7564fc --- /dev/null +++ b/src/client/mac/handler/testcases/DynamicImagesTests.cc @@ -0,0 +1,82 @@ +// Copyright 2008 Google LLC +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// DynamicImagesTests.cpp +// minidump_test +// +// Created by Neal Sidhwaney on 4/17/08. +// Copyright 2008 Google LLC +// + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/mac/handler/testcases/DynamicImagesTests.h" +#include "client/mac/handler/dynamic_images.h" + +DynamicImagesTests test2(TEST_INVOCATION(DynamicImagesTests, + ReadTaskMemoryTest)); +DynamicImagesTests test3(TEST_INVOCATION(DynamicImagesTests, + ReadLibrariesFromLocalTaskTest)); + +DynamicImagesTests::DynamicImagesTests(TestInvocation* invocation) + : TestCase(invocation) { +} + +DynamicImagesTests::~DynamicImagesTests() { +} + +void DynamicImagesTests::ReadTaskMemoryTest() { + kern_return_t kr; + + // pick test2 as a symbol we know to be valid to read + // anything will work, really + void* addr = reinterpret_cast(&test2); + std::vector buf(getpagesize()); + + fprintf(stderr, "reading 0x%p\n", addr); + kr = google_breakpad::ReadTaskMemory(mach_task_self(), + (uint64_t)addr, + getpagesize(), + buf); + + CPTAssert(kr == KERN_SUCCESS); + + CPTAssert(0 == memcmp(&buf[0], (const void*)addr, getpagesize())); +} + +void DynamicImagesTests::ReadLibrariesFromLocalTaskTest() { + + mach_port_t me = mach_task_self(); + google_breakpad::DynamicImages* d = new google_breakpad::DynamicImages(me); + + fprintf(stderr,"Local task image count: %d\n", d->GetImageCount()); + + CPTAssert(d->GetImageCount() > 0); +} diff --git a/src/client/mac/handler/testcases/DynamicImagesTests.h b/src/client/mac/handler/testcases/DynamicImagesTests.h new file mode 100644 index 0000000..f60ee69 --- /dev/null +++ b/src/client/mac/handler/testcases/DynamicImagesTests.h @@ -0,0 +1,51 @@ +// Copyright 2008 Google LLC +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// DynamicImagesTests.h +// minidump_test +// +// Created by Neal Sidhwaney on 4/17/08. +// Copyright 2008 Google LLC +// +// + +#ifndef _CLIENT_MAC_HANDLER_TESTCASES_DYNAMICIMAGESTESTS_H__ +#define _CLIENT_MAC_HANDLER_TESTCASES_DYNAMICIMAGESTESTS_H__ + +#include + +class DynamicImagesTests : public TestCase { + public: + explicit DynamicImagesTests(TestInvocation* invocation); + virtual ~DynamicImagesTests(); + + void ReadTaskMemoryTest(); + void ReadLibrariesFromLocalTaskTest(); +}; + +#endif /* _CLIENT_MAC_HANDLER_TESTCASES_DYNAMICIMAGESTESTS_H__ */ diff --git a/src/client/mac/handler/testcases/breakpad_nlist_test.cc b/src/client/mac/handler/testcases/breakpad_nlist_test.cc new file mode 100644 index 0000000..3779e35 --- /dev/null +++ b/src/client/mac/handler/testcases/breakpad_nlist_test.cc @@ -0,0 +1,109 @@ +// Copyright 2008 Google LLC +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// breakpad_nlist_test.cc +// minidump_test +// +// Created by Neal Sidhwaney on 4/13/08. +// Copyright 2008 Google LLC +// + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/mac/handler/testcases/breakpad_nlist_test.h" +#include +#include "client/mac/handler/breakpad_nlist_64.h" + +BreakpadNlistTest test1(TEST_INVOCATION(BreakpadNlistTest, CompareToNM)); + +BreakpadNlistTest::BreakpadNlistTest(TestInvocation* invocation) + : TestCase(invocation) { +} + + +BreakpadNlistTest::~BreakpadNlistTest() { +} + +void BreakpadNlistTest::CompareToNM() { +#if TARGET_CPU_X86_64 + system("/usr/bin/nm -arch x86_64 /usr/lib/dyld > /tmp/dyld-namelist.txt"); +#elif TARGET_CPU_PPC64 + system("/usr/bin/nm -arch ppc64 /usr/lib/dyld > /tmp/dyld-namelist.txt"); +#endif + + FILE* fd = fopen("/tmp/dyld-namelist.txt", "rt"); + + char oneNMAddr[30]; + char symbolType; + char symbolName[500]; + while (!feof(fd)) { + fscanf(fd, "%s %c %s", oneNMAddr, &symbolType, symbolName); + breakpad_nlist symbolList[2]; + breakpad_nlist& list = symbolList[0]; + + memset(symbolList, 0, sizeof(breakpad_nlist)*2); + const char* symbolNames[2]; + symbolNames[0] = (const char*)symbolName; + symbolNames[1] = "\0"; + breakpad_nlist_64("/usr/lib/dyld", &list, symbolNames); + uint64_t nmAddr = strtol(oneNMAddr, NULL, 16); + if (!IsSymbolMoreThanOnceInDyld(symbolName)) { + CPTAssert(nmAddr == symbolList[0].n_value); + } + } + + fclose(fd); +} + +bool BreakpadNlistTest::IsSymbolMoreThanOnceInDyld(const char* symbolName) { + // These are the symbols that occur more than once when nm dumps + // the symbol table of /usr/lib/dyld. Our nlist program returns + // the first address because it's doing a search so we need to exclude + // these from causing the test to fail + const char* multipleSymbols[] = { + "__Z41__static_initialization_and_destruction_0ii", + "___tcf_0", + "___tcf_1", + "_read_encoded_value_with_base", + "_read_sleb128", + "_read_uleb128", + "\0"}; + + bool found = false; + + for (int i = 0; multipleSymbols[i][0]; i++) { + if (!strcmp(multipleSymbols[i], symbolName)) { + found = true; + break; + } + } + + return found; +} diff --git a/src/client/mac/handler/testcases/breakpad_nlist_test.h b/src/client/mac/handler/testcases/breakpad_nlist_test.h new file mode 100644 index 0000000..ca407ea --- /dev/null +++ b/src/client/mac/handler/testcases/breakpad_nlist_test.h @@ -0,0 +1,61 @@ +// Copyright 2008 Google LLC +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// breakpad_nlist_test.h +// minidump_test +// +// Created by Neal Sidhwaney on 4/13/08. +// Copyright 2008 Google LLC +// +// + +#ifndef CLIENT_MAC_HANDLER_TESTCASES_BREAKPAD_NLIST_TEST_H__ +#define CLIENT_MAC_HANDLER_TESTCASES_BREAKPAD_NLIST_TEST_H__ + +#include + +class BreakpadNlistTest : public TestCase { + private: + + // nm dumps multiple addresses for the same symbol in + // /usr/lib/dyld. So we track those so we don't report failures + // in mismatches between what our nlist returns and what nm has + // for the duplicate symbols. + bool IsSymbolMoreThanOnceInDyld(const char* symbolName); + + public: + explicit BreakpadNlistTest(TestInvocation* invocation); + virtual ~BreakpadNlistTest(); + + + /* This test case runs nm on /usr/lib/dyld and then compares the + output of every symbol to what our nlist implementation returns */ + void CompareToNM(); +}; + +#endif /* CLIENT_MAC_HANDLER_TESTCASES_BREAKPAD_NLIST_TEST_H__*/ diff --git a/src/client/mac/handler/testcases/dwarftests.h b/src/client/mac/handler/testcases/dwarftests.h new file mode 100644 index 0000000..0c35374 --- /dev/null +++ b/src/client/mac/handler/testcases/dwarftests.h @@ -0,0 +1,45 @@ +// Copyright 2008 Google LLC +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// dwarftests.h +// minidump_test +// +// Created by Neal Sidhwaney on 9/24/08. +// Copyright 2008 Google LLC +// + +#import + + +@interface dwarftests : SenTestCase { + +} + +- (void) testDWARFSymbolFileGeneration; + +@end diff --git a/src/client/mac/handler/testcases/dwarftests.mm b/src/client/mac/handler/testcases/dwarftests.mm new file mode 100644 index 0000000..c02a2d2 --- /dev/null +++ b/src/client/mac/handler/testcases/dwarftests.mm @@ -0,0 +1,59 @@ +// Copyright 2008 Google LLC +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// dwarftests.m +// minidump_test +// +// Created by Neal Sidhwaney on 9/24/08. +// Copyright 2008 Google LLC +// + +#import "dwarftests.h" +#import "dump_syms.h" + +@implementation dwarftests +- (void) testDWARFSymbolFileGeneration { + NSString *inputBreakpadSymbolFile = @"testcases/testdata/dump_syms_i386_breakpad.sym"; + NSString *outputBreakpadSymbolFile = @"/tmp/dump_syms_i386.breakpad"; + + DumpSymbols *dump = [[DumpSymbols alloc] initWithContentsOfFile:@"testcases/testdata/dump_syms_dwarf_data"]; + + STAssertNotNil(dump, @"DumpSymbols is nil"); + [dump setArchitecture:@"i386"]; + [dump writeSymbolFile:outputBreakpadSymbolFile]; + + NSData *d = [[NSData alloc] initWithContentsOfFile:inputBreakpadSymbolFile]; + STAssertNotNil(d, @"Input breakpad symbol file not found"); + + NSData *d1 = [[NSData alloc] initWithContentsOfFile:outputBreakpadSymbolFile]; + STAssertNotNil(d1, @"Output breakpad symbol file not found"); + + STAssertTrue([d isEqualToData:d1], + @"Symbol files were not equal!",nil); +} +@end diff --git a/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data b/src/client/mac/handler/testcases/testdata/dump_syms_dwarf_data new file mode 100644 index 0000000000000000000000000000000000000000..5be17aeedcf1bb46e7a5290fbd7d9eee5969caf0 GIT binary patch literal 702795 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
    cIv3Wg*uhd*&oFmA@X+bQu90#b^;@|uEIzX#m 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 k{?`6sx!}hi#-lsDJ^r5DtA=x+y}HLq, std::allocator > >) +4078 15 82 3 +408d 13 83 3 +40a0 1e 85 3 +40be 42 89 3 +4100 20 90 3 +4120 2b 91 3 +414b 1a 92 3 +4165 23 93 3 +4188 46 96 3 +41ce 46 99 3 +4214 33 83 3 +4247 8 102 3 +424f 1 102 3 +FUNC 4250 3ef 0 -[DumpSymbols processDWARFFunctionInfo:] +4250 15 473 3 +4265 25 474 3 +428a 1e 476 3 +42a8 a 480 3 +42b2 3c 481 3 +42ee 3d 483 3 +432b 23 485 3 +434e 26 487 3 +4374 6 489 3 +437a 37 490 3 +43b1 2a 491 3 +43db 17 492 3 +43f2 30 496 3 +4422 3d 497 3 +445f 2e 498 3 +448d 30 502 3 +44bd 64 504 3 +4521 34 507 3 +4555 9d 509 3 +45f2 45 474 3 +4637 8 513 3 +463f 1 513 3 +FUNC 4640 1f5 0 -[DumpSymbols processDWARFLineNumberInfo:] +4640 15 515 3 +4655 25 516 3 +467a 39 520 3 +46b3 26 521 3 +46d9 6 523 3 +46df 37 524 3 +4716 2a 525 3 +4740 17 526 3 +4757 30 529 3 +4787 61 531 3 +47e8 45 516 3 +482d 8 534 3 +4835 1 534 3 +FUNC 4836 10f 0 -[DumpSymbols dealloc] +4836 13 1145 3 +4849 1c 1146 3 +4865 1c 1147 3 +4881 1c 1148 3 +489d 1c 1149 3 +48b9 1c 1150 3 +48d5 1c 1151 3 +48f1 25 1152 3 +4916 29 1154 3 +493f 6 1155 3 +4945 1 1155 3 +FUNC 4946 512 0 -[DumpSymbols loadDWARFSymbolInfo:offset:] +4946 17 402 3 +495d 9 405 3 +4966 10 406 3 +4976 2b 408 3 +49a1 38 409 3 +49d9 3a 410 3 +4a13 2e 411 3 +4a41 31 416 3 +4a72 e 418 3 +4a80 24 420 3 +4aa4 5 422 3 +4aa9 b 424 3 +4ab4 b 425 3 +4abf e 426 3 +4acd 2b 427 3 +4af8 2b 428 3 +4b23 2c 431 3 +4b4f 52 439 3 +4ba1 34 444 3 +4bd5 1a 446 3 +4bef 21 451 3 +4c10 1e 452 3 +4c2e 21 453 3 +4c4f 40 422 3 +4c8f 6 453 3 +4c95 170 422 3 +4e05 43 456 3 +4e48 10 457 3 +FUNC 4e58 4fd 0 -[DumpSymbols generateSectionDictionary:] +4e58 18 663 3 +4e70 10 665 3 +4e80 2e 666 3 +4eae 9 668 3 +4eb7 2b 669 3 +4ee2 7 670 3 +4ee9 2e 672 3 +4f17 d 676 3 +4f24 32 678 3 +4f56 29 680 3 +4f7f a 684 3 +4f89 3c 685 3 +4fc5 31 688 3 +4ff6 5d 689 3 +5053 26 692 3 +5079 21 694 3 +509a c 698 3 +50a6 e 699 3 +50b4 6 700 3 +50ba 9 701 3 +50c3 2e 702 3 +50f1 c 704 3 +50fd 3c 706 3 +5139 66 709 3 +519f 1c 712 3 +51bb fb 714 3 +52b6 6 717 3 +52bc 5 718 3 +52c1 19 704 3 +52da 25 714 3 +52ff 2e 722 3 +532d 9 723 3 +5336 17 698 3 +534d 8 725 3 +5355 1 725 3 +FUNC 5356 24a 0 -[DumpSymbols getSectionMapForArchitecture:] +5356 14 643 3 +536a 43 645 3 +53ad 1a 648 3 +53c7 1c 645 3 +53e3 18 648 3 +53fb 40 650 3 +543b 20 651 3 +545b 17 652 3 +5472 16 651 3 +5488 cb 652 3 +5553 11 654 3 +5564 32 657 3 +5596 a 658 3 +FUNC 55a0 3fe 0 -[DumpSymbols initWithContentsOfFile:] +55a0 14 1056 3 +55b4 3b 1057 3 +55ef 44 1059 3 +5633 17 1060 3 +564a c 1061 3 +5656 1f 1064 3 +5675 2b 1067 3 +56a0 a 1069 3 +56aa 35 1083 3 +56df 2 1087 3 +56e1 1a 1088 3 +56fb 3d 1087 3 +5738 33 1092 3 +576b 6 1094 3 +5771 e 1095 3 +577f 17 1096 3 +5796 c 1097 3 +57a2 1c 1101 3 +57be 1f 1103 3 +57dd 18 1104 3 +57f5 23 1107 3 +5818 25 1109 3 +583d 1c 1107 3 +5859 17 1110 3 +5870 c 1111 3 +587c 2a 1115 3 +58a6 8 1116 3 +58ae a 1118 3 +58b8 9 1119 3 +58c1 d 1122 3 +58ce 29 1124 3 +58f7 20 1126 3 +5917 20 1128 3 +5937 57 1132 3 +598e 9 1136 3 +5997 7 1137 3 +FUNC 599e d74 0 -[DumpSymbols outputSymbolFile:] +599e 18 877 3 +59b6 2e 879 3 +59e4 30 880 3 +5a14 5d 882 3 +5a71 30 883 3 +5aa1 5d 885 3 +5afe 2e 888 3 +5b2c 38 891 3 +5b64 46 892 3 +5baa 26 893 3 +5bd0 20 895 3 +5bf0 20 904 3 +5c10 30 898 3 +5c40 f 899 3 +5c4f 1e 904 3 +5c6d 17 907 3 +5c84 17 908 3 +5c9b 44 911 3 +5cdf 44 914 3 +5d23 a 917 3 +5d2d 36 921 3 +5d63 30 923 3 +5d93 9 18 4 +5d9c 9 19 4 +5da5 c 20 4 +5db1 56 923 3 +5e07 74 925 3 +5e7b f 927 3 +5e8a 44 932 3 +5ece 20 933 3 +5eee c 934 3 +5efa 4e 935 3 +5f48 41 936 3 +5f89 f 937 3 +5f98 14 934 3 +5fac 7 941 3 +5fb3 14 942 3 +5fc7 14 943 3 +5fdb 1d 946 3 +5ff8 c 948 3 +6004 24 949 3 +6028 29 950 3 +6051 9 953 3 +605a 28 954 3 +6082 2e 955 3 +60b0 1e 957 3 +60ce 7 959 3 +60d5 26 962 3 +60fb 2a 963 3 +6125 2a 964 3 +614f 6 966 3 +6155 2a 967 3 +617f e 971 3 +618d 43 972 3 +61d0 4c 974 3 +621c 8 975 3 +6224 2e 979 3 +6252 2e 982 3 +6280 2e 985 3 +62ae 2e 988 3 +62dc 2e 991 3 +630a 2e 994 3 +6338 2e 997 3 +6366 2e 1000 3 +6394 54 1004 3 +63e8 c 1005 3 +63f4 e 1007 3 +6402 27 1008 3 +6429 8 1009 3 +6431 34 1010 3 +6465 24 1012 3 +6489 2 1013 3 +648b 2a 1017 3 +64b5 a 1019 3 +64bf 14 1020 3 +64d3 1d 1021 3 +64f0 a 1025 3 +64fa 32 1026 3 +652c 33 1028 3 +655f c 1029 3 +656b 55 1034 3 +65c0 f 1036 3 +65cf 16 1040 3 +65e5 61 1041 3 +6646 f 1043 3 +6655 47 1046 3 +669c c 1048 3 +66a8 11 948 3 +66b9 4e 1052 3 +6707 b 1053 3 +FUNC 6712 11 0 operator new(unsigned long, void*) +6712 c 94 5 +671e 5 94 5 +6723 1 94 5 +FUNC 6724 e 0 operator delete(void*, void*) +6724 c 98 5 +6730 2 98 5 +673e 7 76 6 +6745 2 77 6 +6747 1a 78 6 +6761 d 77 6 +676e 3 79 6 +6771 2 80 6 +6773 1 80 6 +6780 d 95 6 +678d 1 95 6 +678e 13 127 74 +67a1 2a 127 74 +67cb 1 127 74 +67cc 13 127 74 +67df 2a 127 74 +6809 1 127 74 +680a 13 127 74 +681d 2a 127 74 +6847 1 127 74 +FUNC 6848 e 0 dwarf2reader::LineInfoHandler::DefineDir(std::string const&, unsigned int) +6848 c 131 7 +6854 2 131 74 +FUNC 6856 26 0 dwarf2reader::LineInfoHandler::DefineFile(std::string const&, int, unsigned int, unsigned long long, unsigned long long) +6856 24 142 7 +687a 2 142 74 +FUNC 687c 1a 0 dwarf2reader::LineInfoHandler::AddLine(unsigned long long, unsigned int, unsigned int, unsigned int) +687c 18 150 7 +6894 2 150 74 +6896 12 299 74 +68a8 12 299 74 +68ba 13 301 74 +68cd 2a 301 74 +68f7 1 301 74 +68f8 13 301 74 +690b 2a 301 74 +6935 1 301 74 +6936 13 301 74 +6949 2a 301 74 +6973 1 301 74 +FUNC 6974 44 0 dwarf2reader::Dwarf2Handler::StartCompilationUnit(unsigned long long, unsigned char, unsigned char, unsigned long long, unsigned char) +6974 39 308 7 +69ad b 308 74 +FUNC 69b8 1f 0 dwarf2reader::Dwarf2Handler::StartDIE(unsigned long long, dwarf2reader::DwarfTag, std::list, std::allocator > > const&) +69b8 18 314 7 +69d0 7 314 74 +69d7 1 314 74 +FUNC 69d8 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeUnsigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, unsigned long long) +69d8 24 323 7 +69fc 2 323 74 +FUNC 69fe 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeSigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, long long) +69fe 24 332 7 +6a22 2 332 74 +FUNC 6a24 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeBuffer(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, char const*, unsigned long long) +6a24 24 345 7 +6a48 2 345 74 +FUNC 6a4a 1a 0 dwarf2reader::Dwarf2Handler::ProcessAttributeString(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, std::string const&) +6a4a 18 354 7 +6a62 2 354 74 +FUNC 6a64 1a 0 dwarf2reader::Dwarf2Handler::EndDIE(unsigned long long) +6a64 18 360 7 +6a7c 2 360 74 +6a7e c 44 8 +6a8a 2 44 8 +6a8c 13 55 32 +6a9f 35 55 32 +6ad4 13 91 32 +6ae7 73 96 32 +6b5a 13 98 32 +6b6d 35 98 32 +6bae 1a 75 3 +6bc8 2 76 3 +FUNC 6bca 20 0 std::_Rb_tree_const_iterator >::operator!=(std::_Rb_tree_const_iterator > const&) const +6bca c 287 10 +6bd6 14 288 40 +FUNC 6bea 16 0 std::_Rb_tree_const_iterator >::operator->() const +6bea c 249 10 +6bf6 a 250 40 +6c0c 7 614 72 +6c13 1 614 72 +6c14 c 241 40 +6c20 c 242 40 +FUNC 6c2c 16 0 std::_Rb_tree_const_iterator >::operator*() const +6c2c c 245 11 +6c38 a 246 40 +6c42 c 241 40 +6c4e c 242 40 +FUNC 6c5a 20 0 std::_Rb_tree_const_iterator > >::operator!=(std::_Rb_tree_const_iterator > > const&) const +6c5a c 287 11 +6c66 14 288 40 +FUNC 6c7a 16 0 std::_Rb_tree_const_iterator > >::operator->() const +6c7a c 249 11 +6c86 a 250 40 +6c90 c 185 34 +6c9c 18 186 34 +6cc0 14 204 34 +6cd4 c 69 70 +6ce0 d 69 70 +6ced 1 69 70 +6cee c 89 70 +6cfa 20 90 70 +6d1a c 69 70 +6d26 d 69 70 +6d33 1 69 70 +6d34 c 69 70 +6d40 d 69 70 +6d4d 1 69 70 +FUNC 6d4e 25 0 std::_Rb_tree_const_iterator >::operator++() +6d4e c 253 13 +6d5a 14 255 40 +6d6e 5 256 40 +6d73 1 256 40 +FUNC 6d74 25 0 std::_Rb_tree_const_iterator > >::operator++() +6d74 c 253 13 +6d80 14 255 40 +6d94 5 256 40 +6d99 1 256 40 +FUNC 6d9a 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_begin() +6d9a c 461 13 +6da6 8 462 40 +FUNC 6dae 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_begin() +6dae c 461 13 +6dba 8 462 40 +6dc2 c 65 68 +6dce 2 65 68 +6dd0 c 72 68 +6ddc 2 72 68 +6dde c 97 69 +6dea d 97 69 +6df7 1 97 69 +6df8 c 105 69 +6e04 d 105 69 +6e11 1 105 69 +6e12 c 105 69 +6e1e d 105 69 +6e2b 1 105 69 +6e2c c 67 68 +6e38 2 67 68 +6e3a c 99 69 +6e46 14 100 69 +6e5a c 99 69 +6e66 14 100 69 +FUNC 6e7a 2b 0 std::_Vector_base >::get_allocator() const +6e7a 10 93 16 +6e8a 1b 94 71 +6ea5 1 94 71 +6ea6 c 65 68 +6eb2 2 65 68 +6eb4 c 72 68 +6ec0 2 72 68 +6ec2 c 97 69 +6ece d 97 69 +6edb 1 97 69 +6edc c 105 69 +6ee8 d 105 69 +6ef5 1 105 69 +6ef6 c 105 69 +6f02 d 105 69 +6f0f 1 105 69 +6f10 c 67 68 +6f1c 2 67 68 +6f1e c 99 69 +6f2a 14 100 69 +6f3e c 99 69 +6f4a 14 100 69 +FUNC 6f5e 2b 0 std::_Vector_base >::get_allocator() const +6f5e 10 93 16 +6f6e 1b 94 71 +6f89 1 94 71 +6f8a c 603 72 +6f96 c 603 72 +FUNC 6fa2 23 0 std::vector >::begin() +6fa2 c 333 16 +6fae 17 334 71 +6fc5 1 334 71 +FUNC 6fc6 26 0 std::vector >::end() +6fc6 c 351 16 +6fd2 1a 352 71 +6ff8 5 666 72 +6ffd 1 666 72 +6ffe c 608 72 +700a 14 609 72 +702a 5 666 72 +702f 1 666 72 +FUNC 7030 35 0 bool __gnu_cxx::operator!= > >(__gnu_cxx::__normal_iterator > > const&, __gnu_cxx::__normal_iterator > > const&) +7030 d 693 16 +703d 28 694 72 +7065 1 694 72 +7066 c 603 72 +7072 c 603 72 +708a 27 629 72 +70b1 1 629 72 +70b2 c 84 70 +70be 1f 85 70 +70dd 1 85 70 +FUNC 70de 32 0 std::pair, __gnu_cxx::hash, std::equal_to, std::allocator > >*> std::make_pair, __gnu_cxx::hash, std::equal_to, std::allocator > >*>(std::string, __gnu_cxx::hash_map, __gnu_cxx::hash, std::equal_to, std::allocator > >*) +70de 10 144 16 +70ee 22 145 70 +711c a 190 34 +7132 d 194 34 +713f 1 194 34 +7140 c 84 70 +714c 17 85 70 +7163 1 85 70 +FUNC 7164 2d 0 std::pair std::make_pair(char const*, unsigned long) +7164 c 144 16 +7170 21 145 70 +7191 1 145 70 +7192 c 84 70 +719e 1d 85 70 +71bb 1 85 70 +FUNC 71bc 30 0 std::pair > std::make_pair >(char*, std::pair) +71bc 10 144 16 +71cc 20 145 70 +71ec c 89 70 +71f8 20 90 70 +7218 d 89 70 +7225 70 90 70 +7295 1 90 70 +FUNC 7296 12 0 std::iterator_traits::iterator_category std::__iterator_category(unsigned long const* const&) +7296 c 164 17 +72a2 6 165 17 +FUNC 72a8 1d 0 std::iterator_traits::difference_type std::__distance(unsigned long const*, unsigned long const*, std::random_access_iterator_tag) +72a8 c 92 18 +72b4 11 97 18 +72c5 1 97 18 +FUNC 72c6 33 0 std::iterator_traits::difference_type std::distance(unsigned long const*, unsigned long const*) +72c6 c 114 18 +72d2 27 118 18 +72f9 1 118 18 +FUNC 72fa 20 0 void std::__advance(unsigned long const*&, int, std::random_access_iterator_tag) +72fa c 150 18 +7306 14 155 18 +FUNC 731a 33 0 void std::advance(unsigned long const*&, int) +731a c 172 18 +7326 27 175 18 +734d 1 175 18 +FUNC 734e 7a 0 unsigned long const* std::lower_bound(unsigned long const*, unsigned long const*, unsigned long const&) +734e c 2625 19 +735a 15 2642 19 +736f 2 2646 19 +7371 8 2648 19 +7379 6 2649 19 +737f 12 2650 19 +7391 e 2651 19 +739f 6 2653 19 +73a5 4 2654 19 +73a9 e 2655 19 +73b7 6 2658 19 +73bd 6 2646 19 +73c3 5 2660 19 +73db b 227 34 +73e6 e 228 34 +73f4 1c 229 34 +7410 20 230 34 +7430 6 231 34 +7436 c 72 68 +7442 2 72 68 +7444 c 105 69 +7450 d 105 69 +745d 1 105 69 +745e c 105 69 +746a d 105 69 +7477 1 105 69 +7478 c 80 71 +7484 d 80 71 +7491 1 80 71 +7492 c 67 68 +749e 2 67 68 +74a0 c 99 69 +74ac 14 100 69 +FUNC 74c0 2b 0 std::_Vector_base >::get_allocator() const +74c0 10 93 19 +74d0 1b 94 71 +74eb 1 94 71 +74ec c 238 40 +74f8 a 239 40 +FUNC 7502 26 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::begin() const +7502 c 585 19 +750e 1a 588 40 +FUNC 7528 19 0 std::map, std::allocator > >::begin() const +7528 c 243 20 +7534 d 244 45 +7541 1 244 45 +FUNC 7542 26 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::end() const +7542 c 596 20 +754e 1a 597 40 +FUNC 7568 19 0 std::map, std::allocator > >::end() const +7568 c 260 20 +7574 d 261 45 +7581 1 261 45 +7582 c 65 68 +758e 2 65 68 +7590 c 72 68 +759c 2 72 68 +759e c 97 69 +75aa d 97 69 +75b7 1 97 69 +75b8 c 105 69 +75c4 d 105 69 +75d1 1 105 69 +75d2 c 72 68 +75de 2 72 68 +75e0 c 105 69 +75ec d 105 69 +75f9 1 105 69 +75fa c 397 40 +7606 d 397 40 +7613 1 397 40 +7614 c 105 69 +7620 d 105 69 +762d 1 105 69 +FUNC 762e 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_right(std::_Rb_tree_node_base*) +762e c 496 20 +763a 8 497 40 +FUNC 7642 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_left(std::_Rb_tree_node_base*) +7642 c 488 20 +764e 8 489 40 +7656 c 65 68 +7662 2 65 68 +7664 c 72 68 +7670 2 72 68 +7672 c 97 69 +767e d 97 69 +768b 1 97 69 +768c c 105 69 +7698 d 105 69 +76a5 1 105 69 +76a6 c 72 68 +76b2 2 72 68 +76b4 c 105 69 +76c0 d 105 69 +76cd 1 105 69 +76ce c 397 40 +76da d 397 40 +76e7 1 397 40 +76e8 c 105 69 +76f4 d 105 69 +7701 1 105 69 +FUNC 7702 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_right(std::_Rb_tree_node_base*) +7702 c 496 20 +770e 8 497 40 +FUNC 7716 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_left(std::_Rb_tree_node_base*) +7716 c 488 20 +7722 8 489 40 +772a c 84 71 +7736 2f 85 71 +7765 2 86 71 +7767 1 86 71 +7768 c 80 71 +7774 d 80 71 +7781 1 80 71 +7782 c 96 71 +778e 12 97 71 +77a0 2 98 71 +77a2 c 84 71 +77ae 2f 85 71 +77dd 2 86 71 +77df 1 86 71 +77e0 c 80 71 +77ec d 80 71 +77f9 1 80 71 +77fa c 96 71 +7806 12 97 71 +7818 2 98 71 +7826 d 107 68 +7833 1 107 68 +FUNC 7834 2e 0 void std::_Destroy >(std::string*, std::string*, std::allocator) +7834 c 171 21 +7840 2 173 73 +7842 12 174 73 +7854 c 173 73 +7860 2 174 73 +7862 c 167 40 +786e a 168 40 +FUNC 7878 26 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::begin() +7878 c 581 21 +7884 1a 582 40 +FUNC 789e 19 0 std::map, std::allocator > >::begin() +789e c 234 21 +78aa d 235 45 +78b7 1 235 45 +FUNC 78b8 26 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::end() +78b8 c 592 21 +78c4 1a 593 40 +FUNC 78de 19 0 std::map, std::allocator > >::end() +78de c 251 21 +78ea d 252 45 +78f7 1 252 45 +78f8 c 167 40 +7904 a 168 40 +FUNC 790e 26 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::begin() +790e c 581 21 +791a 1a 582 40 +FUNC 7934 19 0 std::map, std::less, std::allocator > > >::begin() +7934 c 234 21 +7940 d 235 45 +794d 1 235 45 +FUNC 794e 26 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::end() +794e c 592 21 +795a 1a 593 40 +FUNC 7974 19 0 std::map, std::less, std::allocator > > >::end() +7974 c 251 21 +7980 d 252 45 +798d 1 252 45 +FUNC 798e 11 0 std::_Select1st, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >::operator()(std::pair, __gnu_cxx::hash, std::equal_to, std::allocator > >*>&) const +798e c 546 22 +799a 5 547 41 +799f 1 547 41 +79a0 c 128 34 +79ac 13 129 34 +79bf 1 129 34 +79cc 22 396 34 +79fa d 199 42 +7a07 1 199 42 +7a08 c 65 68 +7a14 2 65 68 +7a16 c 72 68 +7a22 2 72 68 +7a24 c 97 69 +7a30 d 97 69 +7a3d 1 97 69 +7a3e c 105 69 +7a4a d 105 69 +7a57 1 105 69 +7a58 c 65 68 +7a64 2 65 68 +7a66 c 72 68 +7a72 2 72 68 +7a74 c 105 69 +7a80 d 105 69 +7a8d 1 105 69 +7a8e c 97 69 +7a9a d 97 69 +7aa7 1 97 69 +7aa8 c 72 68 +7ab4 2 72 68 +7ab6 c 105 69 +7ac2 d 105 69 +7acf 1 105 69 +7adc d 94 68 +7ae9 1 94 68 +FUNC 7aea 2f 0 std::_Vector_base >::_M_deallocate(dwarf2reader::CompilationUnit::Abbrev*, unsigned long) +7aea c 120 23 +7af6 6 122 71 +7afc 1d 123 71 +7b19 1 123 71 +7b1a c 108 71 +7b26 43 109 71 +7b69 1 109 71 +7b6a c 65 68 +7b76 2 65 68 +7b78 c 103 69 +7b84 d 103 69 +7b91 1 103 69 +7b92 c 65 68 +7b9e 2 65 68 +7ba0 c 103 69 +7bac d 103 69 +7bb9 1 103 69 +7bc6 d 94 68 +7bd3 1 94 68 +FUNC 7bd4 2f 0 std::_Vector_base >::_M_deallocate(dwarf2reader::SourceFileInfo*, unsigned long) +7bd4 c 120 23 +7be0 6 122 71 +7be6 1d 123 71 +7c03 1 123 71 +7c04 c 108 71 +7c10 43 109 71 +7c53 1 109 71 +7c54 c 188 71 +7c60 12 189 71 +7c72 2 190 71 +7c74 c 35 32 +7c80 d 35 32 +7c8d 1 35 32 +7c9a d 107 68 +7ca7 1 107 68 +FUNC 7ca8 2e 0 void std::_Destroy >(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, std::allocator) +7ca8 c 171 23 +7cb4 2 173 73 +7cb6 12 174 73 +7cc8 c 173 73 +7cd4 2 174 73 +7cd6 d 272 71 +7ce3 8c 273 71 +7d6f 1 273 71 +7d7c d 94 68 +7d89 1 94 68 +FUNC 7d8a 2f 0 std::_Vector_base >::_M_deallocate(std::string*, unsigned long) +7d8a c 120 23 +7d96 6 122 71 +7d9c 1d 123 71 +7db9 1 123 71 +7dba c 108 71 +7dc6 3d 109 71 +7e03 1 109 71 +7e04 c 188 71 +7e10 12 189 71 +7e22 2 190 71 +7e24 d 272 71 +7e31 8c 273 71 +7ebd 1 273 71 +7eca 2b 596 34 +7ef5 1 596 34 +7f02 7 614 72 +7f09 1 614 72 +7f0a c 65 68 +7f16 2 65 68 +7f18 c 72 68 +7f24 2 72 68 +7f26 c 103 69 +7f32 d 103 69 +7f3f 1 103 69 +7f40 c 105 69 +7f4c d 105 69 +7f59 1 105 69 +7f5a c 65 68 +7f66 2 65 68 +7f68 c 72 68 +7f74 2 72 68 +7f76 c 103 69 +7f82 d 103 69 +7f8f 1 103 69 +7f90 c 105 69 +7f9c d 105 69 +7fa9 1 105 69 +7faa c 105 69 +7fb6 d 105 69 +7fc3 1 105 69 +7fd0 d 575 34 +7fdd 1 575 34 +7fea d 575 34 +7ff7 1 575 34 +FUNC 7ff8 11 0 std::_Select1st, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >::operator()(std::pair, __gnu_cxx::hash, std::equal_to, std::allocator > >*> const&) const +7ff8 c 550 23 +8004 5 551 41 +8009 1 551 41 +8016 2f 600 34 +8045 1 600 34 +8046 c 84 70 +8052 1e 85 70 +FUNC 8070 11 0 std::_Select1st > >::operator()(std::pair >&) const +8070 c 546 23 +807c 5 547 41 +8081 1 547 41 +FUNC 8082 11 0 std::_Select1st > >::operator()(std::pair > const&) const +8082 c 550 23 +808e 5 551 41 +8093 1 551 41 +8094 c 128 34 +80a0 13 129 34 +80b3 1 129 34 +80b4 c 84 70 +80c0 1e 85 70 +80de c 65 68 +80ea 2 65 68 +80ec c 103 69 +80f8 d 103 69 +8105 1 103 69 +8106 c 65 68 +8112 2 65 68 +8114 c 72 68 +8120 2 72 68 +8122 c 105 69 +812e d 105 69 +813b 1 105 69 +813c c 103 69 +8148 d 103 69 +8155 1 103 69 +8156 c 105 69 +8162 d 105 69 +816f 1 105 69 +8170 c 80 71 +817c d 80 71 +8189 1 80 71 +818a c 67 68 +8196 2 67 68 +8198 c 99 69 +81a4 14 100 69 +FUNC 81b8 2b 0 std::_Vector_base<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::get_allocator() const +81b8 10 93 23 +81c8 1b 94 71 +81e3 1 94 71 +81e4 c 99 69 +81f0 14 100 69 +8210 2 107 68 +FUNC 8212 2e 0 void std::_Destroy<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>) +8212 c 171 23 +821e 2 173 73 +8220 12 174 73 +8232 c 173 73 +823e 2 174 73 +824c d 107 68 +8259 1 107 68 +825a c 67 68 +8266 2 67 68 +8268 c 99 69 +8274 14 100 69 +8288 c 403 40 +8294 1c 404 40 +82b0 a 406 40 +82ba a 407 40 +82c4 c 408 40 +82d0 e 409 40 +82de c 553 40 +82ea 36 554 40 +8320 2 555 40 +8322 c 103 69 +832e d 103 69 +833b 1 103 69 +FUNC 833c 2b 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::get_allocator() const +833c 10 350 23 +834c 1b 351 40 +8367 1 351 40 +8368 c 69 70 +8374 2 69 70 +8382 d 107 68 +838f 1 107 68 +839c d 94 68 +83a9 1 94 68 +FUNC 83aa 2a 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_put_node(std::_Rb_tree_node >*) +83aa c 359 23 +83b6 1e 360 40 +FUNC 83d4 59 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::destroy_node(std::_Rb_tree_node >*) +83d4 d 387 23 +83e1 35 389 40 +8416 17 390 40 +842d 1 390 40 +FUNC 842e 56 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_erase(std::_Rb_tree_node >*) +842e c 1051 23 +843a 2 1054 40 +843c 1a 1056 40 +8456 e 1057 40 +8464 12 1058 40 +8476 6 1059 40 +847c 6 1054 40 +8482 2 1059 40 +8484 d 569 40 +8491 58 570 40 +84e9 1 570 40 +84ea c 147 45 +84f6 31 148 45 +8527 1 148 45 +8528 c 92 45 +8534 d 92 45 +8541 1 92 45 +8542 c 67 68 +854e 2 67 68 +8550 c 99 69 +855c 14 100 69 +8570 c 403 40 +857c 1c 404 40 +8598 a 406 40 +85a2 a 407 40 +85ac c 408 40 +85b8 e 409 40 +85c6 c 553 40 +85d2 36 554 40 +8608 2 555 40 +860a c 103 69 +8616 d 103 69 +8623 1 103 69 +FUNC 8624 2b 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::get_allocator() const +8624 10 350 23 +8634 1b 351 40 +864f 1 351 40 +8650 c 69 70 +865c d 69 70 +8669 1 69 70 +866a c 69 70 +8676 30 69 70 +86b2 d 107 68 +86bf 1 107 68 +86cc d 94 68 +86d9 1 94 68 +FUNC 86da 2a 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_put_node(std::_Rb_tree_node > >*) +86da c 359 23 +86e6 1e 360 40 +FUNC 8704 59 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::destroy_node(std::_Rb_tree_node > >*) +8704 d 387 23 +8711 35 389 40 +8746 17 390 40 +875d 1 390 40 +FUNC 875e 56 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_erase(std::_Rb_tree_node > >*) +875e c 1051 23 +876a 2 1054 40 +876c 1a 1056 40 +8786 e 1057 40 +8794 12 1058 40 +87a6 6 1059 40 +87ac 6 1054 40 +87b2 2 1059 40 +87b4 d 569 40 +87c1 58 570 40 +8819 1 570 40 +881a c 147 45 +8826 31 148 45 +8857 1 148 45 +8858 c 92 45 +8864 d 92 45 +8871 1 92 45 +8872 c 603 72 +887e c 603 72 +FUNC 888a 23 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::begin() +888a c 333 23 +8896 17 334 71 +88ad 1 334 71 +88ba 2a 654 72 +FUNC 88e4 42 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::operator[](unsigned long) +88e4 c 494 23 +88f0 36 495 71 +FUNC 8926 26 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::end() +8926 c 351 23 +8932 1a 352 71 +FUNC 894c 28 0 bool std::operator==, std::allocator >(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&) +894c c 2115 24 +8958 1c 2116 37 +FUNC 8974 23 0 std::equal_to::operator()(std::string const&, std::string const&) const +8974 c 199 24 +8980 17 200 41 +8997 1 200 41 +8998 c 80 71 +89a4 d 80 71 +89b1 1 80 71 +89b2 c 67 68 +89be 2 67 68 +89c0 c 99 69 +89cc 14 100 69 +FUNC 89e0 2b 0 std::_Vector_base<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::get_allocator() const +89e0 10 93 24 +89f0 1b 94 71 +8a0b 1 94 71 +8a0c c 99 69 +8a18 14 100 69 +8a2c c 84 71 +8a38 2f 85 71 +8a67 2 86 71 +8a69 1 86 71 +8a6a c 96 71 +8a76 12 97 71 +8a88 2 98 71 +8a96 2 107 68 +FUNC 8a98 2e 0 void std::_Destroy<__gnu_cxx::_Hashtable_node > >**, std::allocator<__gnu_cxx::_Hashtable_node > >*> >(__gnu_cxx::_Hashtable_node > >**, __gnu_cxx::_Hashtable_node > >**, std::allocator<__gnu_cxx::_Hashtable_node > >*>) +8a98 c 171 24 +8aa4 2 173 73 +8aa6 12 174 73 +8ab8 c 173 73 +8ac4 2 174 73 +FUNC 8ac6 13 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::max_size() const +8ac6 c 407 24 +8ad2 7 408 71 +8ad9 1 408 71 +8ada c 603 72 +8ae6 c 603 72 +FUNC 8af2 26 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::end() +8af2 c 351 24 +8afe 1a 352 71 +FUNC 8b18 23 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::begin() +8b18 c 333 24 +8b24 17 334 71 +8b3b 1 334 71 +8b48 2a 654 72 +8b7e 7 614 72 +8b85 1 614 72 +FUNC 8b86 42 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::operator[](unsigned long) +8b86 c 494 24 +8b92 36 495 71 +8bd4 d 107 68 +8be1 1 107 68 +FUNC 8be2 28 0 void std::swap<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**>(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**&, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**&) +8be2 c 92 25 +8bee 8 97 61 +8bf6 a 98 61 +8c00 a 99 61 +FUNC 8c0a 50 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::swap(std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >&) +8c0a c 733 25 +8c16 12 735 71 +8c28 18 736 71 +8c40 1a 737 71 +8c66 2b 596 34 +8c91 1 596 34 +8c9e 2f 600 34 +8ccd 1 600 34 +FUNC 8cce 28 0 void std::swap<__gnu_cxx::_Hashtable_node > >**>(__gnu_cxx::_Hashtable_node > >**&, __gnu_cxx::_Hashtable_node > >**&) +8cce c 92 25 +8cda 8 97 61 +8ce2 a 98 61 +8cec a 99 61 +FUNC 8cf6 50 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::swap(std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >&) +8cf6 c 733 25 +8d02 12 735 71 +8d14 18 736 71 +8d2c 1a 737 71 +8d46 c 84 71 +8d52 2f 85 71 +8d81 2 86 71 +8d83 1 86 71 +8d84 c 96 71 +8d90 12 97 71 +8da2 2 98 71 +FUNC 8da4 13 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::max_size() const +8da4 c 407 25 +8db0 7 408 71 +8db7 1 408 71 +8dc4 d 94 68 +8dd1 1 94 68 +FUNC 8dd2 2f 0 std::_Vector_base<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::_M_deallocate(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long) +8dd2 c 120 25 +8dde 6 122 71 +8de4 1d 123 71 +8e01 1 123 71 +8e02 c 108 71 +8e0e 3d 109 71 +8e4b 1 109 71 +8e4c c 272 71 +8e58 4b 273 71 +8ea3 1 273 71 +8ea4 c 188 71 +8eb0 12 189 71 +8ec2 2 190 71 +8ec4 c 603 72 +8ed0 c 603 72 +FUNC 8edc 2b 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::begin() const +8edc c 342 25 +8ee8 1f 343 71 +8f07 1 343 71 +FUNC 8f08 2c 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::end() const +8f08 c 360 25 +8f14 20 361 71 +8f40 5 666 72 +8f45 1 666 72 +8f53 2b 759 72 +FUNC 8f7e 3c 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::size() const +8f7e c 402 25 +8f8a 30 403 71 +8fc6 26 588 34 +8ff8 15 511 34 +900d 79 513 34 +9086 21 517 34 +90a7 1 517 34 +90b4 14 225 42 +90d4 26 592 34 +FUNC 90fa 49 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::capacity() const +90fa c 449 25 +9106 3d 451 71 +9143 1 451 71 +9144 c 103 69 +9150 d 103 69 +915d 1 103 69 +916e 1b 286 34 +9189 1 286 34 +9196 d 94 68 +91a3 1 94 68 +91b0 1e 301 34 +91db 56 622 34 +9231 17 623 34 +9254 9 1080 34 +925d 1a 1082 34 +9277 2 1083 34 +9279 8 1085 34 +9281 12 1086 34 +9293 6 1087 34 +9299 6 1083 34 +929f 1b 1089 34 +92ba 1d 1080 34 +92d7 c 1091 34 +92e3 1 1091 34 +92e4 d 360 34 +92f1 77 361 34 +9368 c 93 42 +9374 d 93 42 +9381 1 93 42 +9382 c 72 68 +938e 2 72 68 +9390 c 105 69 +939c d 105 69 +93a9 1 105 69 +93aa c 301 66 +93b6 d 301 66 +93c3 1 301 66 +93d0 d 94 68 +93dd 1 94 68 +FUNC 93de 2f 0 std::_Vector_base<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::_M_deallocate(__gnu_cxx::_Hashtable_node > >**, unsigned long) +93de c 120 26 +93ea 6 122 71 +93f0 1d 123 71 +940d 1 123 71 +940e c 108 71 +941a 3d 109 71 +9457 1 109 71 +9458 c 188 71 +9464 12 189 71 +9476 2 190 71 +9478 c 272 71 +9484 4b 273 71 +94cf 1 273 71 +94d0 c 603 72 +94dc c 603 72 +FUNC 94e8 2b 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::begin() const +94e8 c 342 26 +94f4 1f 343 71 +9513 1 343 71 +FUNC 9514 2c 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::end() const +9514 c 360 26 +9520 20 361 71 +954c 2d 662 72 +9579 1 662 72 +FUNC 957a 2d 0 unsigned long const& std::max(unsigned long const&, unsigned long const&) +957a c 206 26 +9586 e 211 61 +9594 8 212 61 +959c b 213 61 +95a7 1 213 61 +95b4 19 650 72 +95cd 1 650 72 +95da 5 666 72 +95df 1 666 72 +95ed 2b 759 72 +9624 5 666 72 +9629 1 666 72 +9637 2b 759 72 +FUNC 9662 49 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::capacity() const +9662 c 449 26 +966e 3d 451 71 +96ab 1 451 71 +FUNC 96ac 3c 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::size() const +96ac c 402 26 +96b8 30 403 71 +96f4 26 588 34 +9726 26 592 34 +974c c 103 69 +9758 d 103 69 +9765 1 103 69 +9776 1b 286 34 +9791 1 286 34 +979e d 94 68 +97ab 1 94 68 +97b8 1e 301 34 +97e3 56 622 34 +9839 17 623 34 +985c 9 1080 34 +9865 1a 1082 34 +987f 2 1083 34 +9881 8 1085 34 +9889 12 1086 34 +989b 6 1087 34 +98a1 6 1083 34 +98a7 1b 1089 34 +98c2 1d 1080 34 +98df c 1091 34 +98eb 1 1091 34 +98ec d 360 34 +98f9 77 361 34 +9970 c 69 70 +997c 20 69 70 +99a9 5c 104 68 +9a05 1 104 68 +9a06 c 69 70 +9a12 2c 69 70 +9a4b 5c 104 68 +9aa7 1 104 68 +9ab4 2d 662 72 +9ae1 1 662 72 +9aee 19 650 72 +9b07 1 650 72 +9b14 5 666 72 +9b19 1 666 72 +9b27 2b 759 72 +9b52 c 72 68 +9b5e 2 72 68 +9b60 c 105 69 +9b6c d 105 69 +9b79 1 105 69 +9b7a c 69 70 +9b86 2 69 70 +9b94 d 107 68 +9ba1 1 107 68 +9bae d 94 68 +9bbb 1 94 68 +FUNC 9bbc 2a 0 std::_List_base, std::allocator > >::_M_put_node(std::_List_node >*) +9bbc c 315 26 +9bc8 1e 316 66 +FUNC 9be6 35 0 bool __gnu_cxx::operator!=<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > > const&, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > > const&) +9be6 d 699 26 +9bf3 28 700 72 +9c1b 1 700 72 +9c28 d 623 72 +9c35 5 624 72 +FUNC 9c3a 4b 0 void std::__fill::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::_Hashtable_node > >* const&) +9c3a c 539 61 +9c46 8 541 61 +9c4e 2 542 61 +9c50 12 543 61 +9c62 21 542 61 +9c83 2 543 61 +9c85 1 543 61 +FUNC 9c86 2b 0 void std::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::_Hashtable_node > >* const&) +9c86 c 560 26 +9c92 4 567 61 +9c96 1b 568 61 +9cb1 1 568 61 +FUNC 9cb2 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, std::allocator<__gnu_cxx::_Hashtable_node > >*> >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, std::allocator<__gnu_cxx::_Hashtable_node > >*>) +9cb2 c 171 26 +9cbe 2 173 73 +9cc0 1a 174 73 +9cda 21 173 73 +9cfb 2 174 73 +9cfd 1 174 73 +9d0a 7 98 68 +9d11 1 98 68 +9d1e 1d 85 68 +9d3b 5 86 68 +9d40 16 88 68 +9d62 1d 297 34 +9d7f 1 297 34 +9d8d e 605 34 +9d9b 9 606 34 +9da4 3c 609 34 +9de0 b 610 34 +9deb 11 609 34 +9dfc b 612 34 +9e07 12 614 34 +9e19 b 615 34 +9e24 13 612 34 +9e37 8 615 34 +9e3f 1 615 34 +9e4d 15 751 34 +9e62 1a 752 34 +9e7c b 754 34 +9e87 49 755 34 +9ed0 3b 756 34 +9f0b 12 754 34 +9f1d 15 758 34 +9f32 8 759 34 +9f3a 1c 760 34 +9f56 f 761 34 +9f65 41 762 34 +9fb2 7 98 68 +9fb9 1 98 68 +9fc6 1d 85 68 +9fe3 5 86 68 +9fe8 17 88 68 +9fff 1 88 68 +a00c 1d 297 34 +a029 1 297 34 +a037 e 605 34 +a045 9 606 34 +a04e 3c 609 34 +a08a b 610 34 +a095 11 609 34 +a0a6 b 612 34 +a0b1 12 614 34 +a0c3 b 615 34 +a0ce 13 612 34 +a0e1 8 615 34 +a0e9 1 615 34 +a0f7 15 751 34 +a10c 1a 752 34 +a126 b 754 34 +a131 49 755 34 +a17a 3b 756 34 +a1b5 12 754 34 +a1c7 15 758 34 +a1dc 8 759 34 +a1e4 1c 760 34 +a200 f 761 34 +a20f 41 762 34 +FUNC a250 35 0 bool __gnu_cxx::operator!=<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > > const&, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > > const&) +a250 d 699 26 +a25d 28 700 72 +a285 1 700 72 +a292 d 623 72 +a29f 5 624 72 +FUNC a2a4 4b 0 void std::__fill::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +a2a4 c 539 61 +a2b0 8 541 61 +a2b8 2 542 61 +a2ba 12 543 61 +a2cc 21 542 61 +a2ed 2 543 61 +a2ef 1 543 61 +FUNC a2f0 2b 0 void std::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +a2f0 c 560 26 +a2fc 4 567 61 +a300 1b 568 61 +a31b 1 568 61 +FUNC a31c 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>) +a31c c 171 26 +a328 2 173 73 +a32a 1a 174 73 +a344 21 173 73 +a365 2 174 73 +a367 1 174 73 +a368 c 65 68 +a374 2 65 68 +a376 c 103 69 +a382 d 103 69 +a38f 1 103 69 +FUNC a390 2b 0 std::_List_base, std::allocator > >::get_allocator() const +a390 10 322 26 +a3a0 1b 324 66 +a3bb 1 324 66 +FUNC a3bc 7b 0 std::_List_base, std::allocator > >::_M_clear() +a3bc d 69 27 +a3c9 8 72 77 +a3d1 2 73 77 +a3d3 6 75 77 +a3d9 8 76 77 +a3e1 35 77 77 +a416 12 78 77 +a428 a 73 77 +a432 5 78 77 +a437 1 78 77 +a438 c 331 66 +a444 18 332 66 +a45c c 392 66 +a468 d 392 66 +a475 1 392 66 +a476 c 211 74 +a482 10 211 74 +a49e d 107 68 +a4ab 1 107 68 +FUNC a4ac 2e 0 void std::_Destroy >(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, std::allocator) +a4ac c 171 27 +a4b8 2 173 73 +a4ba 12 174 73 +a4cc c 173 73 +a4d8 2 174 73 +a4da c 272 71 +a4e6 4b 273 71 +a531 1 273 71 +a532 13 196 74 +a545 10 196 74 +a555 2f 197 74 +a584 1a 198 74 +a59e 13 196 74 +a5b1 10 196 74 +a5c1 2f 197 74 +a5f0 1a 198 74 +a616 7 98 68 +a61d 1 98 68 +a62a 1d 85 68 +a647 5 86 68 +a64c 10 88 68 +FUNC a65c 2a 0 std::_Vector_base<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::_M_allocate(unsigned long) +a65c c 116 27 +a668 1e 117 71 +a686 d 100 71 +a693 12 101 71 +a6a5 19 103 71 +a6be b 104 71 +a6c9 3a 105 71 +a703 1 105 71 +a710 7 98 68 +a717 1 98 68 +a724 1d 85 68 +a741 5 86 68 +a746 10 88 68 +FUNC a756 2a 0 std::_Vector_base<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::_M_allocate(unsigned long) +a756 c 116 27 +a762 1e 117 71 +a780 d 100 71 +a78d 12 101 71 +a79f 19 103 71 +a7b8 b 104 71 +a7c3 3a 105 71 +a7fd 1 105 71 +a80b 12 424 61 +a81d 2e 425 61 +a84b 13 426 61 +a86a 4 440 61 +a86e 1b 443 61 +a889 1 443 61 +a898 56 482 61 +a8fa 4 514 61 +a8fe 4 515 61 +a902 1b 517 61 +a91d 1 517 61 +a92a 8 616 61 +a932 2 617 61 +a934 8 618 61 +a93c f 617 61 +a94b 5 619 61 +a95c 4 641 61 +a960 1b 642 61 +a97b 1 642 61 +FUNC a97c 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&, __true_type) +a97c c 182 28 +a988 1b 183 79 +a9a3 1 183 79 +FUNC a9a4 2f 0 void std::uninitialized_fill_n<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +a9a4 c 214 28 +a9b0 23 218 79 +a9d3 1 218 79 +FUNC a9d4 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>) +a9d4 c 308 28 +a9e0 1b 310 79 +a9fb 1 310 79 +a9fc c 200 71 +aa08 19 201 71 +aa21 42 203 71 +aa63 15 205 71 +aa85 11 992 34 +aa96 c 993 34 +aaa2 15 995 34 +aab7 c 996 34 +aac3 4a 998 34 +ab0d f 1001 34 +ab1c 1c 998 34 +ab38 1a 1003 34 +ab52 5 1004 34 +ab57 1f 1007 34 +ab76 1c 1008 34 +ab92 19 1009 34 +abab 19 1010 34 +abc4 1a 1011 34 +abde a 1004 34 +abe8 11 1001 34 +abf9 15 1014 34 +ac0e 13 1028 34 +ac21 b 1016 34 +ac2c 9 1018 34 +ac35 19 1023 34 +ac4e 23 1024 34 +ac71 19 1025 34 +ac8a 1d 1021 34 +aca7 1a 1018 34 +acc1 b 1028 34 +accc b 1016 34 +acd7 1e 1028 34 +acf5 1 1028 34 +ad06 16 438 34 +ad1c 37 439 34 +ad53 1 439 34 +ad64 37 212 42 +ad9b 1 212 42 +ada8 8 616 61 +adb0 2 617 61 +adb2 8 618 61 +adba f 617 61 +adc9 5 619 61 +adda 4 641 61 +adde 1b 642 61 +adf9 1 642 61 +FUNC adfa 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >* const&, __true_type) +adfa c 182 28 +ae06 1b 183 79 +ae21 1 183 79 +FUNC ae22 2f 0 void std::uninitialized_fill_n<__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >* const&) +ae22 c 214 28 +ae2e 23 218 79 +ae51 1 218 79 +FUNC ae52 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >*, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::_Hashtable_node > >**, unsigned long, __gnu_cxx::_Hashtable_node > >* const&, std::allocator<__gnu_cxx::_Hashtable_node > >*>) +ae52 c 308 28 +ae5e 1b 310 79 +ae79 1 310 79 +ae7a c 200 71 +ae86 19 201 71 +ae9f 42 203 71 +aee1 15 205 71 +af03 11 992 34 +af14 c 993 34 +af20 15 995 34 +af35 c 996 34 +af41 4a 998 34 +af8b f 1001 34 +af9a 1c 998 34 +afb6 1a 1003 34 +afd0 5 1004 34 +afd5 1f 1007 34 +aff4 1c 1008 34 +b010 19 1009 34 +b029 19 1010 34 +b042 1a 1011 34 +b05c a 1004 34 +b066 11 1001 34 +b077 15 1014 34 +b08c 13 1028 34 +b09f b 1016 34 +b0aa 9 1018 34 +b0b3 19 1023 34 +b0cc 23 1024 34 +b0ef 19 1025 34 +b108 1d 1021 34 +b125 1a 1018 34 +b13f b 1028 34 +b14a b 1016 34 +b155 1e 1028 34 +b173 1 1028 34 +b184 16 438 34 +b19a 37 439 34 +b1d1 1 439 34 +b1e2 37 212 42 +b219 1 212 42 +b227 12 424 61 +b239 2e 425 61 +b267 13 426 61 +b286 4 440 61 +b28a 1b 443 61 +b2a5 1 443 61 +b2b4 56 482 61 +b316 4 514 61 +b31a 4 515 61 +b31e 1b 517 61 +b339 1 517 61 +b346 8 616 61 +b34e 2 617 61 +b350 12 618 61 +b362 16 617 61 +b378 5 619 61 +b37d 1 619 61 +b38a 4 641 61 +b38e 1b 642 61 +b3a9 1 642 61 +FUNC b3aa 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >* const&, __true_type) +b3aa c 182 28 +b3b6 1b 183 79 +b3d1 1 183 79 +FUNC b3d2 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >* const&) +b3d2 c 214 28 +b3de 23 218 79 +b401 1 218 79 +FUNC b402 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >*, __gnu_cxx::_Hashtable_node > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >* const&, std::allocator<__gnu_cxx::_Hashtable_node > >*>) +b402 c 308 28 +b40e 1b 310 79 +b429 1 310 79 +b436 8 616 61 +b43e 2 617 61 +b440 12 618 61 +b452 16 617 61 +b468 5 619 61 +b46d 1 619 61 +b47a 4 641 61 +b47e 1b 642 61 +b499 1 642 61 +FUNC b49a 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&, __true_type) +b49a c 182 28 +b4a6 1b 183 79 +b4c1 1 183 79 +FUNC b4c2 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +b4c2 c 214 28 +b4ce 23 218 79 +b4f1 1 218 79 +FUNC b4f2 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*>) +b4f2 c 308 28 +b4fe 1b 310 79 +b519 1 310 79 +b526 22 300 61 +b548 11 301 61 +b559 1 301 61 +b566 4 315 61 +b56a 1b 317 61 +b585 1 317 61 +b592 1b 326 61 +b5ad 1 326 61 +b5ba 4 384 61 +b5be 4 385 61 +b5c2 1b 387 61 +b5dd 1 387 61 +b5ea 1b 74 79 +b605 1 74 79 +b612 23 113 79 +b635 1 113 79 +b642 1b 254 79 +b65d 1 254 79 +b66a 15 763 71 +b67f 40 766 71 +b6bf 3 768 71 +b6c2 2 773 71 +FUNC b6c4 124 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::reserve(unsigned long) +b6c4 13 69 29 +b6d7 15 71 78 +b6ec e 72 78 +b6fa 19 73 78 +b713 e 75 78 +b721 28 78 78 +b749 3e 79 78 +b787 30 81 78 +b7b7 8 84 78 +b7bf 11 85 78 +b7d0 18 86 78 +b7f5 33 335 61 +b834 4 384 61 +b838 4 385 61 +b83c 1b 387 61 +b857 1 387 61 +b864 1b 74 79 +b87f 1 74 79 +b88c 23 113 79 +b8af 1 113 79 +b8bc 1b 254 79 +b8d7 1 254 79 +b8e6 56 354 61 +b948 4 384 61 +b94c 4 385 61 +b950 1b 387 61 +b96b 1 387 61 +b978 1b 74 79 +b993 1 74 79 +b9a0 23 113 79 +b9c3 1 113 79 +b9d0 1b 254 79 +b9eb 1 254 79 +FUNC b9ec 46e 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::_M_fill_insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >* const&) +b9ec 14 311 29 +ba00 b 313 78 +ba0b 24 315 78 +ba2f 8 318 78 +ba37 23 319 78 +ba5a 15 320 78 +ba6f c 321 78 +ba7b 51 323 78 +bacc 14 327 78 +bae0 30 328 78 +bb10 35 330 78 +bb45 48 334 78 +bb8d 17 338 78 +bba4 43 339 78 +bbe7 14 342 78 +bbfb 1e 343 78 +bc19 e 348 78 +bc27 1e 349 78 +bc45 e 350 78 +bc53 1d 353 78 +bc70 8 354 78 +bc78 e 355 78 +bc86 27 357 78 +bcad 6 358 78 +bcb3 4d 361 78 +bd00 40 365 78 +bd40 18 367 78 +bd58 4d 368 78 +bda5 3e 379 78 +bde3 30 381 78 +be13 12 384 78 +be25 13 385 78 +be38 22 386 78 +FUNC be5a 2e 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node > >**, std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node > >* const&) +be5a c 657 29 +be66 22 658 71 +be94 15 580 34 +bea9 15 581 34 +bebe 37 582 34 +bef5 c 583 34 +bf01 1 583 34 +bf02 d 335 34 +bf0f 4e 337 34 +bf5d 4d 338 34 +bfaa d 134 42 +bfb7 65 135 42 +c028 22 300 61 +c04a 11 301 61 +c05b 1 301 61 +c068 4 315 61 +c06c 1b 317 61 +c087 1 317 61 +c094 1b 326 61 +c0af 1 326 61 +c0bc 4 384 61 +c0c0 4 385 61 +c0c4 1b 387 61 +c0df 1 387 61 +c0ec 1b 74 79 +c107 1 74 79 +c114 23 113 79 +c137 1 113 79 +c144 1b 254 79 +c15f 1 254 79 +c16c 15 763 71 +c181 40 766 71 +c1c1 3 768 71 +c1c4 2 773 71 +FUNC c1c6 124 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::reserve(unsigned long) +c1c6 13 69 29 +c1d9 15 71 78 +c1ee e 72 78 +c1fc 19 73 78 +c215 e 75 78 +c223 28 78 78 +c24b 3e 79 78 +c289 30 81 78 +c2b9 8 84 78 +c2c1 11 85 78 +c2d2 18 86 78 +c2f7 33 335 61 +c336 4 384 61 +c33a 4 385 61 +c33e 1b 387 61 +c359 1 387 61 +c366 1b 74 79 +c381 1 74 79 +c38e 23 113 79 +c3b1 1 113 79 +c3be 1b 254 79 +c3d9 1 254 79 +c3e8 56 354 61 +c44a 4 384 61 +c44e 4 385 61 +c452 1b 387 61 +c46d 1 387 61 +c47a 1b 74 79 +c495 1 74 79 +c4a2 23 113 79 +c4c5 1 113 79 +c4d2 1b 254 79 +c4ed 1 254 79 +FUNC c4ee 46e 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::_M_fill_insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +c4ee 14 311 29 +c502 b 313 78 +c50d 24 315 78 +c531 8 318 78 +c539 23 319 78 +c55c 15 320 78 +c571 c 321 78 +c57d 51 323 78 +c5ce 14 327 78 +c5e2 30 328 78 +c612 35 330 78 +c647 48 334 78 +c68f 17 338 78 +c6a6 43 339 78 +c6e9 14 342 78 +c6fd 1e 343 78 +c71b e 348 78 +c729 1e 349 78 +c747 e 350 78 +c755 1d 353 78 +c772 8 354 78 +c77a e 355 78 +c788 27 357 78 +c7af 6 358 78 +c7b5 4d 361 78 +c802 40 365 78 +c842 18 367 78 +c85a 4d 368 78 +c8a7 3e 379 78 +c8e5 30 381 78 +c915 12 384 78 +c927 13 385 78 +c93a 22 386 78 +FUNC c95c 2e 0 std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> >::insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >**, std::vector<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node, __gnu_cxx::hash, std::equal_to, std::allocator > >*> >* const&) +c95c c 657 29 +c968 22 658 71 +c996 15 580 34 +c9ab 15 581 34 +c9c0 37 582 34 +c9f7 c 583 34 +ca03 1 583 34 +ca04 d 335 34 +ca11 4e 337 34 +ca5f 4d 338 34 +caac d 134 42 +cab9 65 135 42 +FUNC cb1e 44 0 dwarf2reader::CUFunctionInfoHandler::StartCompilationUnit(unsigned long long, unsigned char, unsigned char, unsigned long long, unsigned char) +cb1e 39 135 42 +cb57 5 102 30 +cb5c 6 103 30 +FUNC cb62 41 0 dwarf2reader::CUFunctionInfoHandler::ProcessAttributeString(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, std::string const&) +cb62 18 136 30 +cb7a 10 137 30 +cb8a 17 138 30 +cba1 2 139 30 +cba3 1 139 30 +FUNC cba4 2a5 0 dwarf2reader::CUFunctionInfoHandler::ProcessAttributeUnsigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, unsigned long long) +cba4 2d 144 30 +cbd1 a 145 30 +cbdb 58 146 30 +cc33 35 147 30 +cc68 32 146 30 +cc9a 2a 147 30 +ccc4 82 152 30 +cd46 18 153 30 +cd5e 1c 152 30 +cd7a 2f 153 30 +cda9 e 154 30 +cdb7 28 155 30 +cddf 12 157 30 +cdf1 2 158 30 +cdf3 12 160 30 +ce05 2 161 30 +ce07 c 163 30 +ce13 2 164 30 +ce15 2c 166 30 +ce41 8 172 30 +ce49 1 172 30 +FUNC ce4a 19c 0 dwarf2reader::CULineInfoHandler::AddLine(unsigned long long, unsigned int, unsigned int, unsigned int) +ce4a 20 84 30 +ce6a 1c 85 30 +ce86 9c 87 30 +cf22 4f 89 30 +cf71 19 87 30 +cf8a 25 90 30 +cfaf 30 93 30 +cfdf 7 95 30 +FUNC cfe6 9f 0 dwarf2reader::CUFunctionInfoHandler::EndDIE(unsigned long long) +cfe6 19 174 30 +cfff 1c 175 30 +d01b 65 177 30 +d080 5 178 30 +d085 1 178 30 +FUNC d086 164 0 dwarf2reader::CUFunctionInfoHandler::StartDIE(unsigned long long, dwarf2reader::DwarfTag, std::list, std::allocator > > const&) +d086 20 111 30 +d0a6 1c 112 30 +d0c2 c 126 30 +d0ce 23 115 30 +d0f1 26 116 30 +d117 1a 117 30 +d131 d 118 30 +d13e 1b 119 30 +d159 5f 120 30 +d1b8 c 124 30 +d1c4 1c 115 30 +d1e0 3 126 30 +d1e3 7 129 30 +FUNC d1ea 73 0 dwarf2reader::CULineInfoHandler::DefineDir(std::string const&, unsigned int) +d1ea 13 52 30 +d1fd 45 54 30 +d242 15 55 30 +d257 6 56 30 +d25d 1 56 30 +FUNC d25e 23b 0 dwarf2reader::CULineInfoHandler::DefineFile(std::string const&, int, unsigned int, unsigned long long, unsigned long long) +d25e 2c 60 30 +d28a 45 62 30 +d2cf 2f 65 30 +d2fe 24 66 30 +d322 b 68 30 +d32d e 69 30 +d33b 19 71 30 +d354 17 72 30 +d36b 93 74 30 +d3fe 64 77 30 +d462 30 79 30 +d492 7 81 30 +d499 1 81 30 +d49a 14 38 30 +d4ae 36 40 30 +d4e4 41 43 30 +d525 41 44 30 +d566 67 45 30 +d5cd 10 46 30 +d5dd 13 45 30 +d5f0 15 47 30 +d605 e 48 30 +d613 3d 49 30 +d650 20 50 30 +d670 14 38 30 +d684 36 40 30 +d6ba 41 43 30 +d6fb 41 44 30 +d73c 67 45 30 +d7a3 10 46 30 +d7b3 13 45 30 +d7c6 15 47 30 +d7db e 48 30 +d7e9 3d 49 30 +d826 20 50 30 +d846 12 125 74 +d858 12 125 74 +d86a 13 55 32 +d87d 35 55 32 +d8b2 13 98 32 +d8c5 35 98 32 +d8fa c 35 32 +d906 d 35 32 +d913 1 35 32 +d914 d 22 32 +d921 40 22 32 +d961 1 22 32 +d962 c 89 70 +d96e 1e 90 70 +d998 14 208 34 +d9ac c 190 67 +d9b8 a 190 67 +d9c2 c 259 67 +d9ce 21 259 67 +d9ef 1 259 67 +FUNC d9f0 13 0 std::auto_ptr::operator->() const +d9f0 c 283 35 +d9fc 7 286 67 +da03 1 286 67 +da11 5c 104 68 +da6d 1 104 68 +FUNC da6e 28 0 bool std::operator==, std::allocator >(std::basic_string, std::allocator > const&, char const*) +da6e c 2139 37 +da7a 1c 2140 37 +FUNC da96 5d 0 std::basic_string, std::allocator > std::operator+, std::allocator >(std::basic_string, std::allocator > const&, char const*) +da96 d 2081 37 +daa3 12 2083 37 +dab5 1a 2084 37 +dacf 24 2085 37 +daf3 1 2085 37 +FUNC daf4 5d 0 std::basic_string, std::allocator > std::operator+, std::allocator >(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&) +daf4 d 2044 37 +db01 12 2046 37 +db13 1a 2047 37 +db2d 24 2048 37 +db51 1 2048 37 +db52 c 84 70 +db5e 17 85 70 +db75 1 85 70 +FUNC db76 2d 0 std::pair std::make_pair(char const*, unsigned int) +db76 c 144 37 +db82 21 145 70 +dba3 1 145 70 +dba4 c 84 70 +dbb0 23 85 70 +dbd3 1 85 70 +FUNC dbd4 3c 0 std::pair > std::make_pair >(unsigned long long, std::pair) +dbd4 1c 144 37 +dbf0 20 145 70 +dc10 d 89 70 +dc1d 64 90 70 +dc81 1 90 70 +dc82 c 89 70 +dc8e 2a 90 70 +dcb8 c 84 70 +dcc4 1d 85 70 +dce1 1 85 70 +FUNC dce2 3c 0 std::pair std::make_pair(unsigned long long, dwarf2reader::FunctionInfo*) +dce2 1c 144 37 +dcfe 20 145 70 +dd2a a 190 34 +dd40 d 194 34 +dd4d 1 194 34 +dd4e c 603 72 +dd5a c 603 72 +FUNC dd66 2b 0 std::vector >::begin() const +dd66 c 342 39 +dd72 1f 343 71 +dd91 1 343 71 +FUNC dd92 2c 0 std::vector >::end() const +dd92 c 360 39 +dd9e 20 361 71 +ddca 5 666 72 +ddcf 1 666 72 +dddd 2b 759 72 +FUNC de08 3c 0 std::vector >::size() const +de08 c 402 39 +de14 30 403 71 +FUNC de44 2b 0 std::vector >::begin() const +de44 c 342 39 +de50 1f 343 71 +de6f 1 343 71 +FUNC de70 2c 0 std::vector >::end() const +de70 c 360 39 +de7c 20 361 71 +dea9 31 759 72 +FUNC deda 3c 0 std::vector >::size() const +deda c 402 39 +dee6 30 403 71 +df16 c 603 72 +df22 c 603 72 +FUNC df2e 26 0 std::vector >::end() +df2e c 351 39 +df3a 1a 352 71 +df60 7 614 72 +df67 1 614 72 +FUNC df68 13 0 std::vector >::max_size() const +df68 c 407 39 +df74 7 408 71 +df7b 1 408 71 +df88 5 666 72 +df8d 1 666 72 +df9a d 623 72 +dfa7 5 624 72 +FUNC dfac 23 0 std::vector >::begin() +dfac c 333 39 +dfb8 17 334 71 +dfcf 1 334 71 +dfd0 c 35 32 +dfdc 26 35 32 +e00f 5c 104 68 +e06b 1 104 68 +e078 7 614 72 +e07f 1 614 72 +FUNC e080 35 0 dwarf2reader::SourceFileInfo::operator=(dwarf2reader::SourceFileInfo const&) +e080 c 35 39 +e08c 29 35 32 +e0b5 1 35 32 +FUNC e0b6 13 0 std::vector >::max_size() const +e0b6 c 407 39 +e0c2 7 408 71 +e0c9 1 408 71 +e0d6 d 623 72 +e0e3 5 624 72 +FUNC e0e8 3c 0 std::vector >::_M_range_check(unsigned long) const +e0e8 13 515 39 +e0fb 15 517 71 +e110 14 518 71 +FUNC e124 3c 0 std::vector >::_M_range_check(unsigned long) const +e124 13 515 39 +e137 15 517 71 +e14c 14 518 71 +e16c 2a 654 72 +FUNC e196 42 0 std::vector >::operator[](unsigned long) +e196 c 494 39 +e1a2 36 495 71 +FUNC e1d8 32 0 std::vector >::at(unsigned long) +e1d8 c 534 39 +e1e4 12 536 71 +e1f6 14 537 71 +e216 32 654 72 +FUNC e248 42 0 std::vector >::operator[](unsigned long) +e248 c 494 39 +e254 36 495 71 +FUNC e28a 32 0 std::vector >::at(unsigned long) +e28a c 534 39 +e296 12 536 71 +e2a8 14 537 71 +FUNC e2bc 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_end() +e2bc c 472 40 +e2c8 8 473 40 +FUNC e2d0 11 0 std::_Select1st > >::operator()(std::pair > const&) const +e2d0 c 550 41 +e2dc 5 551 41 +e2e1 1 551 41 +FUNC e2e2 53 0 std::less::operator()(unsigned long long const&, unsigned long long const&) const +e2e2 c 226 41 +e2ee 47 227 41 +e335 1 227 41 +FUNC e336 20 0 std::_Rb_tree_iterator > >::operator==(std::_Rb_tree_iterator > > const&) const +e336 c 209 41 +e342 14 210 40 +e356 c 84 70 +e362 18 85 70 +FUNC e37a 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_end() +e37a c 472 41 +e386 8 473 40 +FUNC e38e 11 0 std::_Select1st >::operator()(std::pair const&) const +e38e c 550 41 +e39a 5 551 41 +e39f 1 551 41 +FUNC e3a0 20 0 std::_Rb_tree_iterator >::operator==(std::_Rb_tree_iterator > const&) const +e3a0 c 209 41 +e3ac 14 210 40 +e3c0 c 84 70 +e3cc 18 85 70 +e3e4 c 180 34 +e3f0 13 181 34 +e403 1 181 34 +e410 22 409 34 +e43e d 207 42 +e44b 1 207 42 +FUNC e44c 35 0 bool __gnu_cxx::operator!= > >(__gnu_cxx::__normal_iterator > > const&, __gnu_cxx::__normal_iterator > > const&) +e44c d 699 42 +e459 28 700 72 +e481 1 700 72 +FUNC e482 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator > >, std::allocator >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, std::allocator) +e482 c 171 43 +e48e 2 173 73 +e490 1a 174 73 +e4aa 21 173 73 +e4cb 2 174 73 +e4cd 1 174 73 +FUNC e4ce 35 0 bool __gnu_cxx::operator!= > >(__gnu_cxx::__normal_iterator > > const&, __gnu_cxx::__normal_iterator > > const&) +e4ce d 699 43 +e4db 28 700 72 +e503 1 700 72 +FUNC e504 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator > >, std::allocator >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, std::allocator) +e504 c 171 43 +e510 2 173 73 +e512 1a 174 73 +e52c 21 173 73 +e54d 2 174 73 +e54f 1 174 73 +FUNC e550 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_value(std::_Rb_tree_node > > const*) +e550 c 480 43 +e55c 8 481 40 +FUNC e564 28 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_key(std::_Rb_tree_node > > const*) +e564 c 484 43 +e570 1c 485 40 +FUNC e58c 25 0 std::_Rb_tree_iterator >::operator--() +e58c c 194 43 +e598 14 196 40 +e5ac 5 197 40 +e5b1 1 197 40 +FUNC e5b2 25 0 std::_Rb_tree_iterator > >::operator--() +e5b2 c 194 43 +e5be 14 196 40 +e5d2 5 197 40 +e5d7 1 197 40 +FUNC e5d8 14 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_value(std::_Rb_tree_node_base const*) +e5d8 c 504 43 +e5e4 8 505 40 +FUNC e5ec 28 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_S_key(std::_Rb_tree_node_base const*) +e5ec c 508 43 +e5f8 1c 509 40 +FUNC e614 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_value(std::_Rb_tree_node > const*) +e614 c 480 43 +e620 8 481 40 +FUNC e628 28 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_key(std::_Rb_tree_node > const*) +e628 c 484 43 +e634 1c 485 40 +FUNC e650 14 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_value(std::_Rb_tree_node_base const*) +e650 c 504 43 +e65c 8 505 40 +FUNC e664 28 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_S_key(std::_Rb_tree_node_base const*) +e664 c 508 43 +e670 1c 509 40 +e698 7 614 72 +e69f 1 614 72 +e6ac 7 98 68 +e6b3 1 98 68 +e6c0 1d 85 68 +e6dd 5 86 68 +e6e2 10 88 68 +FUNC e6f2 2a 0 std::_Vector_base >::_M_allocate(unsigned long) +e6f2 c 116 43 +e6fe 1e 117 71 +e728 7 98 68 +e72f 1 98 68 +e73c 1d 85 68 +e759 5 86 68 +e75e 16 88 68 +FUNC e774 2a 0 std::_Vector_base >::_M_allocate(unsigned long) +e774 c 116 43 +e780 1e 117 71 +e7aa 3a 104 68 +e7f0 2a 654 72 +FUNC e81a 42 0 std::vector<__gnu_cxx::_Hashtable_node > >*, std::allocator<__gnu_cxx::_Hashtable_node > >*> >::operator[](unsigned long) const +e81a c 509 43 +e826 36 510 71 +FUNC e85c 4e 0 std::string* std::__copy_backward::copy_b(std::string*, std::string*, std::string*) +e85c c 408 61 +e868 14 411 61 +e87c 1e 412 61 +e89a b 411 61 +e8a5 5 413 61 +FUNC e8aa 2b 0 std::string* std::__copy_backward_aux(std::string*, std::string*, std::string*) +e8aa c 432 44 +e8b6 4 440 61 +e8ba 1b 443 61 +e8d5 1 443 61 +e8e4 56 482 61 +e946 4 514 61 +e94a 4 515 61 +e94e 1b 517 61 +e969 1 517 61 +FUNC e96a 69 0 void std::_Construct(std::string*, std::string const&) +e96a d 77 44 +e977 5c 81 73 +e9d3 1 81 73 +FUNC e9d4 54 0 dwarf2reader::SourceFileInfo* std::__copy_backward::copy_b(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*) +e9d4 c 408 61 +e9e0 1a 411 61 +e9fa 1e 412 61 +ea18 b 411 61 +ea23 5 413 61 +FUNC ea28 2b 0 dwarf2reader::SourceFileInfo* std::__copy_backward_aux(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*) +ea28 c 432 44 +ea34 4 440 61 +ea38 1b 443 61 +ea53 1 443 61 +ea62 56 482 61 +eac4 4 514 61 +eac8 4 515 61 +eacc 1b 517 61 +eae7 1 517 61 +FUNC eae8 69 0 void std::_Construct(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo const&) +eae8 d 77 44 +eaf5 5c 81 73 +eb51 1 81 73 +eb52 c 69 70 +eb5e 20 69 70 +eb7e c 69 70 +eb8a 2a 69 70 +ebc1 5c 104 68 +ec1d 1 104 68 +ec2a 15 523 34 +ec3f 79 525 34 +ecb8 21 529 34 +ecd9 1 529 34 +ece6 14 229 42 +ed06 7 98 68 +ed0d 1 98 68 +ed1a 1d 85 68 +ed37 5 86 68 +ed3c 10 88 68 +FUNC ed4c 29 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_get_node() +ed4c c 355 44 +ed58 1d 356 40 +ed75 1 356 40 +FUNC ed76 b6 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_create_node(std::pair > const&) +ed76 d 363 44 +ed83 e 365 40 +ed91 3c 367 40 +edcd b 373 40 +edd8 11 367 40 +ede9 b 368 40 +edf4 12 370 40 +ee06 b 371 40 +ee11 13 368 40 +ee24 8 373 40 +FUNC ee2c cd 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair > const&) +ee2c d 787 44 +ee39 15 789 40 +ee4e 5d 792 40 +eeab 24 796 40 +eecf f 798 40 +eede 1b 799 40 +eef9 1 799 40 +FUNC eefa 1ef 0 std::_Rb_tree >, std::_Select1st > >, std::less, std::allocator > > >::insert_unique(std::pair > const&) +eefa d 869 44 +ef07 e 871 40 +ef15 e 872 40 +ef23 4 873 40 +ef27 2 874 40 +ef29 6 876 40 +ef2f 35 877 40 +ef64 2a 878 40 +ef8e 6 874 40 +ef94 12 880 40 +efa6 a 881 40 +efb0 24 882 40 +efd4 51 883 40 +f025 b 885 40 +f030 36 886 40 +f066 4e 887 40 +f0b4 35 888 40 +f0e9 1 888 40 +FUNC f0ea 20 0 std::map, std::less, std::allocator > > >::insert(std::pair > const&) +f0ea c 359 45 +f0f6 14 360 45 +f116 7 98 68 +f11d 1 98 68 +f12a 1d 85 68 +f147 5 86 68 +f14c 1d 88 68 +f169 1 88 68 +FUNC f16a 29 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_get_node() +f16a c 355 45 +f176 1d 356 40 +f193 1 356 40 +FUNC f194 5f 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_create_node(std::pair const&) +f194 d 363 45 +f1a1 e 365 40 +f1af 3c 367 40 +f1eb 8 373 40 +f1f3 1 373 40 +FUNC f1f4 cd 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair const&) +f1f4 d 787 45 +f201 15 789 40 +f216 5d 792 40 +f273 24 796 40 +f297 f 798 40 +f2a6 1b 799 40 +f2c1 1 799 40 +FUNC f2c2 1ef 0 std::_Rb_tree, std::_Select1st >, std::less, std::allocator > >::insert_unique(std::pair const&) +f2c2 d 869 45 +f2cf e 871 40 +f2dd e 872 40 +f2eb 4 873 40 +f2ef 2 874 40 +f2f1 6 876 40 +f2f7 35 877 40 +f32c 2a 878 40 +f356 6 874 40 +f35c 12 880 40 +f36e a 881 40 +f378 24 882 40 +f39c 51 883 40 +f3ed b 885 40 +f3f8 36 886 40 +f42e 4e 887 40 +f47c 35 888 40 +f4b1 1 888 40 +FUNC f4b2 20 0 std::map, std::allocator > >::insert(std::pair const&) +f4b2 c 359 45 +f4be 14 360 45 +FUNC f4d2 19 0 void std::_Destroy(std::string*) +f4d2 c 106 45 +f4de d 107 73 +f4eb 1 107 73 +FUNC f4ec 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __false_type) +f4ec c 119 45 +f4f8 2 121 73 +f4fa 13 122 73 +f50d 21 121 73 +f52e 2 122 73 +FUNC f530 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >) +f530 c 148 45 +f53c 1c 155 73 +f565 6 82 79 +f56b 2 85 79 +f56d 24 86 79 +f591 2c 85 79 +f5bd b 87 79 +f5c8 b 89 79 +f5d3 12 91 79 +f5e5 b 92 79 +f5f0 13 89 79 +f603 9 92 79 +f618 23 113 79 +f63b 1 113 79 +f648 1b 254 79 +f663 1 254 79 +FUNC f664 430 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, std::string const&) +f664 14 249 47 +f678 14 251 78 +f68c 22 253 78 +f6ae f 255 78 +f6bd 12 256 78 +f6cf 55 257 78 +f724 4b 260 78 +f76f e 264 78 +f77d 15 265 78 +f792 e 266 78 +f7a0 1d 271 78 +f7bd 8 272 78 +f7c5 e 273 78 +f7d3 27 275 78 +f7fa 6 276 78 +f800 55 279 78 +f855 25 284 78 +f87a b 285 78 +f885 4f 286 78 +f8d4 3 284 78 +f8d7 13 279 78 +f8ea e 286 78 +f8f8 4d 298 78 +f945 30 299 78 +f975 12 302 78 +f987 13 303 78 +f99a 23 304 78 +f9bd 3 298 78 +f9c0 13 286 78 +f9d3 b 292 78 +f9de 39 294 78 +fa17 23 295 78 +fa3a 8 296 78 +fa42 16 294 78 +fa58 3 296 78 +fa5b 19 292 78 +fa74 19 298 78 +fa8d 7 304 78 +FUNC fa94 70 0 std::vector >::push_back(std::string const&) +fa94 c 602 47 +faa0 10 604 71 +fab0 1e 606 71 +face 11 607 71 +fadf 25 610 71 +FUNC fb04 19 0 void std::_Destroy(dwarf2reader::SourceFileInfo*) +fb04 c 106 47 +fb10 d 107 73 +fb1d 1 107 73 +FUNC fb1e 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __false_type) +fb1e c 119 47 +fb2a 2 121 73 +fb2c 13 122 73 +fb3f 21 121 73 +fb60 2 122 73 +FUNC fb62 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >) +fb62 c 148 47 +fb6e 1c 155 73 +fb97 6 82 79 +fb9d 2 85 79 +fb9f 24 86 79 +fbc3 2c 85 79 +fbef b 87 79 +fbfa b 89 79 +fc05 12 91 79 +fc17 b 92 79 +fc22 13 89 79 +fc35 9 92 79 +fc4a 23 113 79 +fc6d 1 113 79 +fc7a 1b 254 79 +fc95 1 254 79 +FUNC fc96 43d 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, dwarf2reader::SourceFileInfo const&) +fc96 14 249 47 +fcaa 14 251 78 +fcbe 22 253 78 +fce0 f 255 78 +fcef 12 256 78 +fd01 55 257 78 +fd56 4b 260 78 +fda1 e 264 78 +fdaf 15 265 78 +fdc4 e 266 78 +fdd2 1d 271 78 +fdef 8 272 78 +fdf7 e 273 78 +fe05 27 275 78 +fe2c 6 276 78 +fe32 55 279 78 +fe87 25 284 78 +feac b 285 78 +feb7 4f 286 78 +ff06 3 284 78 +ff09 13 279 78 +ff1c e 286 78 +ff2a 4d 298 78 +ff77 36 299 78 +ffad 12 302 78 +ffbf 13 303 78 +ffd2 2a 304 78 +fffc 3 298 78 +ffff 13 286 78 +10012 b 292 78 +1001d 39 294 78 +10056 23 295 78 +10079 8 296 78 +10081 16 294 78 +10097 3 296 78 +1009a 19 292 78 +100b3 19 298 78 +100cc 7 304 78 +100d3 1 304 78 +FUNC 100d4 70 0 std::vector >::push_back(dwarf2reader::SourceFileInfo const&) +100d4 c 602 47 +100e0 10 604 71 +100f0 1e 606 71 +1010e 11 607 71 +1011f 25 610 71 +FUNC 10144 16c 0 Start +10144 17 610 71 +1015b 40 49 48 +1019b 6 51 48 +101a1 3f 53 48 +101e0 7 54 48 +101e7 5 55 48 +101ec 2a 58 48 +10216 61 61 48 +10277 7 62 48 +1027e 2 63 48 +10280 29 66 48 +102a9 7 67 48 +FUNC 102b0 108 0 Usage +102b0 19 70 48 +102c9 30 71 48 +102f9 29 73 48 +10322 30 74 48 +10352 30 75 48 +10382 30 76 48 +103b2 6 77 48 +FUNC 103b8 3af 0 SetupOptions +103b8 21 80 48 +103d9 8 82 48 +103e1 6 85 48 +103e7 10 86 48 +103f7 2e 88 48 +10425 2f 94 48 +10454 2a 91 48 +1047e 23 95 48 +104a1 3e 97 48 +104df 11 98 48 +104f0 7c 99 48 +1056c c 100 48 +10578 5 99 48 +1057d 3e 101 48 +105bb 11 102 48 +105cc 3e 103 48 +1060a 11 104 48 +1061b 37 106 48 +10652 b 107 48 +1065d c 108 48 +10669 b 113 48 +10674 c 114 48 +10680 14 119 48 +10694 30 120 48 +106c4 b 121 48 +106cf c 122 48 +106db 81 127 48 +1075c b 128 48 +10767 1 128 48 +FUNC 10768 a7 0 main +10768 13 131 48 +1077b 37 132 48 +107b2 1e 135 48 +107d0 e 136 48 +107de 8 137 48 +107e6 17 139 48 +107fd c 141 48 +10809 6 142 48 +1080f 1 142 48 +10810 c 47 49 +1081c 1a 48 49 +10836 2 49 49 +10838 c 47 49 +10844 1a 48 49 +1085e 2 49 49 +FUNC 10860 cb 0 google_breakpad::FileID::FileIdentifier(unsigned char*) +10860 f 51 49 +1086f 16 52 49 +10885 6 53 49 +1088b f 54 49 +1089a b 57 49 +108a5 7 62 49 +108ac 2 63 49 +108ae 1c 64 49 +108ca 32 63 49 +108fc b 67 49 +10907 12 68 49 +10919 10 70 49 +10929 2 71 49 +1092b 1 71 49 +FUNC 1092c f2 0 google_breakpad::FileID::MachoIdentifier(int, unsigned char*) +1092c 10 73 49 +1093c 15 74 49 +10951 20 76 49 +10971 f 77 49 +10980 20 79 49 +109a0 c 80 49 +109ac 69 82 49 +10a15 9 83 49 +FUNC 10a1e fb 0 google_breakpad::FileID::ConvertIdentifierToString(unsigned char const*, char*, int) +10a1e c 87 49 +10a2a 7 88 49 +10a31 c 89 49 +10a3d 15 90 49 +10a52 12 91 49 +10a64 18 93 49 +10a7c e 94 49 +10a8a 2b 96 49 +10ab5 2b 97 49 +10ae0 17 89 49 +10af7 20 101 49 +10b17 2 102 49 +10b19 1 102 49 +FUNC 10b1a 13 0 NXHostByteOrder +10b1a c 144 56 +10b26 5 147 56 +10b2b 2 153 56 +10b2d 1 153 56 +10b2e c 56 51 +10b3a 1a 57 51 +10b54 1e 58 51 +10b72 2 59 51 +10b74 c 56 51 +10b80 1a 57 51 +10b9a 1e 58 51 +10bb8 2 59 51 +10bba c 61 51 +10bc6 e 62 51 +10bd4 11 63 51 +10be5 2 64 51 +10be7 1 64 51 +10be8 c 61 51 +10bf4 e 62 51 +10c02 11 63 51 +10c13 2 64 51 +10c15 1 64 51 +FUNC 10c16 477 0 MacFileUtilities::MachoID::UpdateCRC(unsigned char*, unsigned long) +10c16 c 74 51 +10c22 11 82 51 +10c33 14 83 51 +10c47 5 86 51 +10c4c 9 87 51 +10c55 7 88 51 +10c5c 18b 90 51 +10de7 6 91 51 +10ded 14 89 51 +10e01 23 93 51 +10e24 23 94 51 +10e47 d 86 51 +10e54 f 98 51 +10e63 6 100 51 +10e69 18b 101 51 +10ff4 6 102 51 +10ffa c 99 51 +11006 13 105 51 +11019 8 106 51 +11021 10 104 51 +11031 23 108 51 +11054 23 109 51 +11077 14 110 51 +1108b 2 112 51 +1108d 1 112 51 +FUNC 1108e 2c 0 MacFileUtilities::MachoID::UpdateMD5(unsigned char*, unsigned long) +1108e c 114 51 +1109a 1e 115 51 +110b8 2 116 51 +FUNC 110ba 2c 0 MacFileUtilities::MachoID::UpdateSHA1(unsigned char*, unsigned long) +110ba c 118 51 +110c6 1e 119 51 +110e4 2 120 51 +FUNC 110e6 121 0 MacFileUtilities::MachoID::Update(MacFileUtilities::MachoWalker*, unsigned long, unsigned long) +110e6 f 122 51 +110f5 1b 123 51 +11110 e 129 51 +1111e 5 130 51 +11123 9 131 51 +1112c 7 132 51 +11133 a 133 51 +1113d 6 135 51 +11143 7 136 51 +1114a 35 139 51 +1117f 6c 142 51 +111eb 10 143 51 +111fb a 130 51 +11205 2 145 51 +11207 1 145 51 +FUNC 11208 cf 0 MacFileUtilities::MachoID::UUIDCommand(int, unsigned char*) +11208 14 147 51 +1121c 25 149 51 +11241 7 151 51 +11248 19 152 51 +11261 9 153 51 +1126a 8 157 51 +11272 1f 158 51 +11291 9 159 51 +1129a 36 162 51 +112d0 7 163 51 +112d7 1 163 51 +FUNC 112d8 224 0 MacFileUtilities::MachoID::IDCommand(int, unsigned char*) +112d8 15 165 51 +112ed 25 167 51 +11312 7 169 51 +11319 19 170 51 +11332 c 171 51 +1133e c 175 51 +1134a 6 180 51 +11350 7 181 51 +11357 9 182 51 +11360 9 183 51 +11369 28 185 51 +11391 33 186 51 +113c4 1e 185 51 +113e2 10 189 51 +113f2 10 190 51 +11402 10 191 51 +11412 d 192 51 +1141f 10 193 51 +1142f 10 194 51 +1143f 10 195 51 +1144f d 196 51 +1145c 17 197 51 +11473 17 198 51 +1148a 17 199 51 +114a1 14 200 51 +114b5 9 202 51 +114be 36 205 51 +114f4 8 206 51 +FUNC 114fc d1 0 MacFileUtilities::MachoID::Adler32(int) +114fc 14 208 51 +11510 25 209 51 +11535 27 210 51 +1155c d 211 51 +11569 19 213 51 +11582 9 214 51 +1158b 3b 216 51 +115c6 7 217 51 +115cd 1 217 51 +FUNC 115ce f8 0 MacFileUtilities::MachoID::MD5(int, unsigned char*) +115ce 14 219 51 +115e2 25 220 51 +11607 27 221 51 +1162e 19 223 51 +11647 19 224 51 +11660 9 225 51 +11669 17 227 51 +11680 9 228 51 +11689 36 231 51 +116bf 7 232 51 +FUNC 116c6 f8 0 MacFileUtilities::MachoID::SHA1(int, unsigned char*) +116c6 14 234 51 +116da 25 235 51 +116ff 27 236 51 +11726 19 238 51 +1173f 19 239 51 +11758 9 240 51 +11761 17 242 51 +11778 9 243 51 +11781 36 246 51 +117b7 7 247 51 +FUNC 117be 378 0 MacFileUtilities::MachoID::WalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*) +117be 2b 251 51 +117e9 6 252 51 +117ef e 254 51 +117fd 38 257 51 +11835 f 258 51 +11844 9 260 51 +1184d 17 261 51 +11864 20 266 51 +11884 f 267 51 +11893 d 271 51 +118a0 c 273 51 +118ac 38 274 51 +118e4 f 275 51 +118f3 9 277 51 +118fc 1f 278 51 +1191b 14 282 51 +1192f 2b 283 51 +1195a d 285 51 +11967 19 273 51 +11980 e 287 51 +1198e 38 290 51 +119c6 f 291 51 +119d5 9 293 51 +119de 17 294 51 +119f5 20 299 51 +11a15 f 300 51 +11a24 d 304 51 +11a31 c 306 51 +11a3d 38 307 51 +11a75 f 308 51 +11a84 9 310 51 +11a8d 1f 311 51 +11aac 1a 315 51 +11ac6 39 316 51 +11aff d 318 51 +11b0c 11 306 51 +11b1d 10 323 51 +11b2d 9 324 51 +FUNC 11b36 95 0 MacFileUtilities::MachoID::UUIDWalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*) +11b36 1e 328 51 +11b54 a 329 51 +11b5e 6 331 51 +11b64 2f 333 51 +11b93 9 335 51 +11b9c 6 337 51 +11ba2 14 338 51 +11bb6 9 340 51 +11bbf a 344 51 +11bc9 2 345 51 +11bcb 1 345 51 +FUNC 11bcc 95 0 MacFileUtilities::MachoID::IDWalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*) +11bcc 1e 349 51 +11bea a 350 51 +11bf4 6 351 51 +11bfa 2f 353 51 +11c29 9 354 51 +11c32 6 356 51 +11c38 14 357 51 +11c4c 9 359 51 +11c55 a 363 51 +11c5f 2 364 51 +11c61 1 364 51 +FUNC 11c62 1c 0 _OSSwapInt32 +11c62 f 53 55 +11c71 8 55 55 +11c79 3 56 55 +11c7c 2 57 55 +FUNC 11c7e 19 0 NXSwapInt +11c7e f 52 56 +11c8d 8 54 56 +11c95 2 55 56 +11c97 1 55 56 +FUNC 11c98 13 0 NXHostByteOrder +11c98 c 144 56 +11ca4 5 147 56 +11ca9 2 153 56 +11cab 1 153 56 +11cac c 52 54 +11cb8 12 54 54 +11cca 1a 55 54 +11ce4 2 56 54 +11ce6 c 52 54 +11cf2 12 54 54 +11d04 1a 55 54 +11d1e 2 56 54 +11d20 c 58 54 +11d2c a 59 54 +11d36 d 60 54 +11d43 2 61 54 +11d45 1 61 54 +11d46 c 58 54 +11d52 a 59 54 +11d5c d 60 54 +11d69 2 61 54 +11d6b 1 61 54 +FUNC 11d6c 37 0 MacFileUtilities::MachoWalker::ValidateCPUType(int) +11d6c c 63 54 +11d78 6 66 54 +11d7e 8 67 54 +11d86 6 68 54 +11d8c b 69 54 +11d97 7 74 54 +11d9e 3 80 54 +11da1 2 81 54 +11da3 1 81 54 +FUNC 11da4 50 0 MacFileUtilities::MachoWalker::ReadBytes(void*, unsigned long, long long) +11da4 18 96 54 +11dbc 36 97 54 +11df2 2 98 54 +FUNC 11df4 73 0 MacFileUtilities::MachoWalker::CurrentHeader(mach_header_64*, long long*) +11df4 c 100 54 +11e00 a 101 54 +11e0a 37 102 54 +11e41 11 103 54 +11e52 9 104 54 +11e5b a 107 54 +11e65 2 108 54 +11e67 1 108 54 +FUNC 11e68 2a6 0 MacFileUtilities::MachoWalker::FindHeader(int, long long&) +11e68 c 110 54 +11e74 15 111 54 +11e89 31 114 54 +11eba c 115 54 +11ec6 10 117 54 +11ed6 4 120 54 +11eda 14 121 54 +11eee 4 122 54 +11ef2 11 129 54 +11f03 28 124 54 +11f2b c 126 54 +11f37 31 133 54 +11f68 c 134 54 +11f74 14 136 54 +11f88 b 137 54 +11f93 8 139 54 +11f9b c 140 54 +11fa7 10 142 54 +11fb7 c 143 54 +11fc3 10 146 54 +11fd3 31 148 54 +12004 c 149 54 +12010 f 151 54 +1201f 14 152 54 +12033 16 154 54 +12049 c 158 54 +12055 31 159 54 +12086 9 160 54 +1208f f 162 54 +1209e 1c 163 54 +120ba 8 165 54 +120c2 10 166 54 +120d2 9 167 54 +120db 16 170 54 +120f1 11 158 54 +12102 a 174 54 +1210c 2 175 54 +FUNC 1210e 109 0 MacFileUtilities::MachoWalker::WalkHeaderCore(long long, unsigned int, bool) +1210e 1e 224 54 +1212c c 225 54 +12138 2f 227 54 +12167 c 228 54 +12173 6 230 54 +12179 14 231 54 +1218d 5b 234 54 +121e8 12 237 54 +121fa 11 225 54 +1220b a 240 54 +12215 2 241 54 +12217 1 241 54 +FUNC 12218 10e 0 MacFileUtilities::MachoWalker::WalkHeader64AtOffset(long long) +12218 18 203 54 +12230 2f 205 54 +1225f c 206 54 +1226b e 208 54 +12279 6 209 54 +1227f 14 210 54 +12293 9 212 54 +1229c a 213 54 +122a6 f 214 54 +122b5 15 215 54 +122ca 2b 216 54 +122f5 a 217 54 +122ff a 218 54 +12309 11 219 54 +1231a a 220 54 +12324 2 221 54 +FUNC 12326 143 0 MacFileUtilities::MachoWalker::WalkHeaderAtOffset(long long) +12326 18 177 54 +1233e 2f 179 54 +1236d c 180 54 +12379 e 182 54 +12387 6 183 54 +1238d 14 184 54 +123a1 2e 189 54 +123cf 7 190 54 +123d6 9 192 54 +123df a 193 54 +123e9 f 194 54 +123f8 15 195 54 +1240d 2b 196 54 +12438 a 197 54 +12442 a 198 54 +1244c 11 199 54 +1245d a 200 54 +12467 2 201 54 +12469 1 201 54 +FUNC 1246a 99 0 MacFileUtilities::MachoWalker::WalkHeader(int) +1246a c 83 54 +12476 15 84 54 +1248b 1d 86 54 +124a8 d 87 54 +124b5 21 88 54 +124d6 21 90 54 +124f7 a 93 54 +12501 2 94 54 +12503 1 94 54 +FUNC 12504 1c 0 _OSSwapInt32 +12504 f 53 55 +12513 8 55 55 +1251b 3 56 55 +1251e 2 57 55 +FUNC 12520 2b 0 _OSSwapInt64 +12520 12 64 55 +12532 11 69 55 +12543 6 70 55 +12549 2 71 55 +1254b 1 71 55 +FUNC 1254c 19 0 NXSwapLong +1254c f 61 56 +1255b 8 63 56 +12563 2 64 56 +12565 1 64 56 +FUNC 12566 1f 0 NXSwapLongLong +12566 12 70 56 +12578 b 72 56 +12583 2 73 56 +12585 1 73 56 +FUNC 12586 32 0 breakpad_swap_uuid_command(breakpad_uuid_command*, NXByteOrder) +12586 c 37 57 +12592 11 39 57 +125a3 13 40 57 +125b6 2 41 57 +FUNC 125b8 da 0 breakpad_swap_segment_command_64(segment_command_64*, NXByteOrder) +125b8 c 44 57 +125c4 11 46 57 +125d5 13 47 57 +125e8 17 49 57 +125ff 17 50 57 +12616 17 51 57 +1262d 17 52 57 +12644 13 54 57 +12657 13 55 57 +1266a 13 56 57 +1267d 13 57 57 +12690 2 58 57 +FUNC 12692 a4 0 breakpad_swap_mach_header_64(mach_header_64*, NXByteOrder) +12692 c 61 57 +1269e 11 63 57 +126af 13 64 57 +126c2 13 65 57 +126d5 13 66 57 +126e8 13 67 57 +126fb 13 68 57 +1270e 13 69 57 +12721 13 70 57 +12734 2 71 57 +FUNC 12736 1d1 0 breakpad_swap_section_64(section_64*, unsigned int, NXByteOrder) +12736 d 75 57 +12743 c 77 57 +1274f 33 78 57 +12782 33 79 57 +127b5 2d 81 57 +127e2 2d 82 57 +1280f 2d 83 57 +1283c 2d 84 57 +12869 2d 85 57 +12896 2d 86 57 +128c3 2d 87 57 +128f0 11 77 57 +12901 6 89 57 +12907 1 89 57 +12908 12 9 58 +1291a 4f 11 58 +12969 2 12 58 +1296b 1 12 58 +1296c 12 9 58 +1297e 4f 11 58 +129cd 2 12 58 +129cf 1 12 58 +129d0 13 14 58 +129e3 2a 14 58 +12a0d 1 14 58 +12a0e 13 14 58 +12a21 2a 14 58 +12a4b 1 14 58 +12a4c 13 14 58 +12a5f 2a 14 58 +12a89 1 14 58 +FUNC 12a8a bb 0 dwarf2reader::ByteReader::SetOffsetSize(unsigned char) +12a8a 19 16 58 +12aa3 a 17 58 +12aad 48 18 58 +12af5 6 19 58 +12afb 23 20 58 +12b1e 21 22 58 +12b3f 6 24 58 +12b45 1 24 58 +FUNC 12b46 bb 0 dwarf2reader::ByteReader::SetAddressSize(unsigned char) +12b46 19 26 58 +12b5f a 27 58 +12b69 48 28 58 +12bb1 6 29 58 +12bb7 23 30 58 +12bda 21 32 58 +12bfb 6 34 58 +12c01 1 34 58 +FUNC 12c02 a2 0 dwarf2reader::ByteReader::ReadFourBytes(char const*) const +12c02 c 24 59 +12c0e c 25 64 +12c1a d 26 64 +12c27 f 27 64 +12c36 f 28 64 +12c45 b 29 64 +12c50 27 30 64 +12c77 2b 32 64 +12ca2 2 34 64 +FUNC 12ca4 40e 0 dwarf2reader::ByteReader::ReadEightBytes(char const*) const +12ca4 11 36 59 +12cb5 1a 37 64 +12ccf 1b 38 64 +12cea 1d 39 64 +12d07 1d 40 64 +12d24 1d 41 64 +12d41 1d 42 64 +12d5e 1d 43 64 +12d7b 1d 44 64 +12d98 f 45 64 +12da7 18f 47 64 +12f36 172 50 64 +130a8 a 52 64 +130b2 2 52 64 +FUNC 130b4 a6 0 ReadInitialLength +130b4 15 29 60 +130c9 18 30 60 +130e1 6 31 60 +130e7 d 35 60 +130f4 13 36 60 +13107 9 37 60 +13110 1a 38 60 +1312a 13 40 60 +1313d 9 41 60 +13146 12 43 60 +13158 2 44 60 +1315a 1f 47 60 +13179 65 50 60 +131de 1f 47 60 +131fd 65 50 60 +FUNC 13262 393 0 dwarf2reader::CompilationUnit::SkipAttribute(char const*, dwarf2reader::DwarfForm) +13262 14 133 60 +13276 82 136 60 +132f8 1f 139 60 +13317 a 140 60 +13321 21 141 60 +13342 c 147 60 +1334e e 151 60 +1335c e 155 60 +1336a e 159 60 +13378 27 162 60 +1339f 1c 166 60 +133bb 10 167 60 +133cb 1c 171 60 +133e7 10 172 60 +133f7 1e 175 60 +13415 56 180 60 +1346b d 181 60 +13478 1e 182 60 +13496 11 183 60 +134a7 1e 184 60 +134c5 24 189 60 +134e9 26 192 60 +1350f 23 195 60 +13532 22 198 60 +13554 15 199 60 +13569 1b 203 60 +13584 30 206 60 +135b4 30 208 60 +135e4 a 209 60 +135ee 7 210 60 +135f5 1 210 60 +FUNC 135f6 29b 0 dwarf2reader::CompilationUnit::ReadHeader() +135f6 14 217 60 +1360a 9 218 60 +13613 4e 221 60 +13661 17 223 60 +13678 a 224 60 +13682 f 225 60 +13691 4e 227 60 +136df 1e 228 60 +136fd 6 229 60 +13703 5e 231 60 +13761 1e 232 60 +1377f 18 233 60 +13797 4c 235 60 +137e3 1d 236 60 +13800 1c 237 60 +1381c 5 238 60 +13821 9 240 60 +1382a 60 245 60 +1388a 7 247 60 +13891 1 247 60 +FUNC 13892 a57 0 dwarf2reader::CompilationUnit::ProcessAttribute(unsigned long long, char const*, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm) +13892 24 299 60 +138b6 8a 302 60 +13940 1f 307 60 +1395f a 308 60 +13969 36 309 60 +1399f 5b 316 60 +139fa c 317 60 +13a06 5b 322 60 +13a61 e 323 60 +13a6f 55 328 60 +13ac4 e 329 60 +13ad2 55 334 60 +13b27 e 335 60 +13b35 6 338 60 +13b3b 9a 340 60 +13bd5 33 341 60 +13c08 25 340 60 +13c2d 5c 348 60 +13c89 10 349 60 +13c99 5c 354 60 +13cf5 10 355 60 +13d05 55 359 60 +13d5a 1e 360 60 +13d78 56 365 60 +13dce d 366 60 +13ddb 55 368 60 +13e30 1e 369 60 +13e4e 11 370 60 +13e5f 55 372 60 +13eb4 1e 373 60 +13ed2 29 378 60 +13efb 4a 380 60 +13f45 f 381 60 +13f54 29 385 60 +13f7d 4c 387 60 +13fc9 11 388 60 +13fda 1b 392 60 +13ff5 4c 394 60 +14041 11 395 60 +14052 22 399 60 +14074 4e 401 60 +140c2 15 402 60 +140d7 3c 406 60 +14113 1b 408 60 +1412e 54 409 60 +14182 f 411 60 +14191 9a 413 60 +1422b 24 414 60 +1424f 25 413 60 +14274 30 418 60 +142a4 30 420 60 +142d4 a 421 60 +142de b 422 60 +142e9 1 422 60 +142ea 1f 489 60 +14309 3a 491 60 +14343 a 492 60 +1434d 6 493 60 +14353 1 493 60 +14354 1f 489 60 +14373 3a 491 60 +143ad a 492 60 +143b7 6 493 60 +143bd 1 493 60 +FUNC 143be b5 0 dwarf2reader::CompilationUnit::ProcessDIE(unsigned long long, char const*, dwarf2reader::CompilationUnit::Abbrev const&) +143be 19 426 60 +143d7 13 427 60 +143ea 46 430 60 +14430 3a 427 60 +1446a 3 432 60 +1446d 6 433 60 +14473 1 433 60 +FUNC 14474 85 0 dwarf2reader::CompilationUnit::SkipDIE(char const*, dwarf2reader::CompilationUnit::Abbrev const&) +14474 c 122 60 +14480 13 123 60 +14493 27 126 60 +144ba 3a 123 60 +144f4 3 128 60 +144f7 2 129 60 +144f9 1 129 60 +FUNC 144fa be4 0 dwarf2reader::LineInfo::ProcessOneOpcode(dwarf2reader::ByteReader*, dwarf2reader::LineInfoHandler*, dwarf2reader::LineInfoHeader const&, char const*, dwarf2reader::LineStateMachine*, unsigned long*, unsigned long, bool*) +144fa 18 593 60 +14512 a 594 60 +1451c 18 596 60 +14534 8 597 60 +1453c 5 598 60 +14541 19 602 60 +1455a f 603 60 +14569 50 605 60 +145b9 46 607 60 +145ff e0 610 60 +146df 6 612 60 +146e5 22 615 60 +14707 22 616 60 +14729 7 617 60 +14730 b 618 60 +1473b f 619 60 +1474a 5a 623 60 +147a4 7 625 60 +147ab b 626 60 +147b6 f 627 60 +147c5 28 631 60 +147ed e 632 60 +147fb 144 635 60 +1493f 6 637 60 +14945 9e 640 60 +149e3 5 642 60 +149e8 22 644 60 +14a0a e 645 60 +14a18 1c 646 60 +14a34 2b 652 60 +14a5f b 653 60 +14a6a 22 658 60 +14a8c e 659 60 +14a9a 8 660 60 +14aa2 5 662 60 +14aa7 22 664 60 +14ac9 e 665 60 +14ad7 9 666 60 +14ae0 5 668 60 +14ae5 12 670 60 +14af7 5 672 60 +14afc 7 674 60 +14b03 5 676 60 +14b08 16 678 60 +14b1e 9 679 60 +14b27 d9 682 60 +14c00 6 684 60 +14c06 1f 687 60 +14c25 5 689 60 +14c2a 40 693 60 +14c6a d6 696 60 +14d40 6 698 60 +14d46 1c 701 60 +14d62 5 703 60 +14d67 1f 706 60 +14d86 d 707 60 +14d93 13 708 60 +14da6 26 710 60 +14dcc 5 711 60 +14dd1 50 713 60 +14e21 7 715 60 +14e28 b 716 60 +14e33 f 717 60 +14e42 18 725 60 +14e5a f 726 60 +14e69 5 728 60 +14e6e 6 730 60 +14e74 28 732 60 +14e9c d 733 60 +14ea9 22 735 60 +14ecb e 736 60 +14ed9 22 739 60 +14efb e 740 60 +14f09 22 743 60 +14f2b e 744 60 +14f39 a 746 60 +14f43 fd 748 60 +15040 a 758 60 +1504a 9 759 60 +15053 1c 761 60 +1506f d 762 60 +1507c e 763 60 +1508a 2e 759 60 +150b8 b 769 60 +150c3 10 770 60 +150d3 b 771 60 +FUNC 150de 14b 0 dwarf2reader::LineInfo::ReadLines() +150de e 773 60 +150ec 9 778 60 +150f5 17 782 60 +1510c 8 783 60 +15114 6 785 60 +1511a 9 787 60 +15123 5 788 60 +15128 19 789 60 +15141 5 790 60 +15146 4a 793 60 +15190 6 794 60 +15196 4a 796 60 +151e0 a 797 60 +151ea f 790 60 +151f9 15 788 60 +1520e 14 801 60 +15222 7 802 60 +15229 1 802 60 +FUNC 1522a 4fd 0 dwarf2reader::CompilationUnit::ReadAbbrevs() +1522a 18 60 60 +15242 e 61 60 +15250 58 65 60 +152a8 38 66 60 +152e0 44 65 60 +15324 2a 66 60 +1534e 45 68 60 +15393 16 69 60 +153a9 1d 75 60 +153c6 6 76 60 +153cc 40 77 60 +1540c b 80 60 +15417 1f 82 60 +15436 e 84 60 +15444 6 77 60 +1544a 1f 68 60 +15469 a 84 60 +15473 1d 79 60 +15490 6 86 60 +15496 a 87 60 +154a0 3d 89 60 +154dd 1f 90 60 +154fc a 91 60 +15506 6 92 60 +1550c 3d 94 60 +15549 1d 95 60 +15566 5 96 60 +1556b 3d 98 60 +155a8 1f 101 60 +155c7 a 102 60 +155d1 3d 104 60 +1560e 1f 105 60 +1562d a 106 60 +15637 c 107 60 +15643 6 111 60 +15649 6 112 60 +1564f 32 113 60 +15681 47 115 60 +156c8 30 116 60 +156f8 24 79 60 +1571c b 118 60 +15727 1 118 60 +FUNC 15728 5dc 0 dwarf2reader::LineInfo::ReadHeader() +15728 18 503 60 +15740 9 504 60 +15749 17 508 60 +15760 a 510 60 +1576a f 511 60 +15779 60 512 60 +157d9 44 516 60 +1581d 1e 518 60 +1583b 6 519 60 +15841 1e 521 60 +1585f 18 522 60 +15877 1d 524 60 +15894 5 525 60 +15899 20 527 60 +158b9 5 528 60 +158be c 530 60 +158ca 5 531 60 +158cf 1d 533 60 +158ec 5 534 60 +158f1 1d 536 60 +1590e 5 537 60 +15913 45 539 60 +15958 1f 540 60 +15977 19 541 60 +15990 15 542 60 +159a5 1f 539 60 +159c4 30 543 60 +159f4 5 544 60 +159f9 14 542 60 +15a0d e 548 60 +15a1b 7 549 60 +15a22 5 550 60 +15a27 6 551 60 +15a2d 8b 552 60 +15ab8 28 553 60 +15ae0 5 554 60 +15ae5 16 550 60 +15afb 25 552 60 +15b20 5 557 60 +15b25 e 560 60 +15b33 7 561 60 +15b3a 5 563 60 +15b3f 6 564 60 +15b45 28 565 60 +15b6d 22 567 60 +15b8f a 568 60 +15b99 22 570 60 +15bbb a 571 60 +15bc5 22 573 60 +15be7 a 574 60 +15bf1 ba 576 60 +15cab 5 577 60 +15cb0 16 563 60 +15cc6 25 576 60 +15ceb 5 580 60 +15cf0 9 582 60 +15cf9 b 583 60 +FUNC 15d04 3d 0 dwarf2reader::LineInfo::Start() +15d04 c 495 60 +15d10 b 496 60 +15d1b b 497 60 +15d26 19 498 60 +15d3f 2 499 60 +15d41 1 499 60 +FUNC 15d42 304 0 dwarf2reader::CompilationUnit::ProcessDIEs() +15d42 11 435 60 +15d53 9 436 60 +15d5c 9 441 60 +15d65 17 445 60 +15d7c 8 446 60 +15d84 6 448 60 +15d8a 6c 453 60 +15df6 8 455 60 +15dfe 16 453 60 +15e14 3 455 60 +15e17 2f 453 60 +15e46 29 458 60 +15e6f 22 460 60 +15e91 a 462 60 +15e9b a 465 60 +15ea5 1e 466 60 +15ec3 13 467 60 +15ed6 2b 468 60 +15f01 18 472 60 +15f19 9 473 60 +15f22 42 474 60 +15f64 1e 475 60 +15f82 2a 477 60 +15fac b 480 60 +15fb7 1e 481 60 +15fd5 26 483 60 +15ffb 1d 455 60 +16018 24 485 60 +1603c a 486 60 +FUNC 16046 35f 0 dwarf2reader::CompilationUnit::Start() +16046 18 249 60 +1605e 58 251 60 +160b6 35 252 60 +160eb 32 251 60 +1611d 2a 252 60 +16147 20 255 60 +16167 37 256 60 +1619e b 259 60 +161a9 f 264 60 +161b8 17 265 60 +161cf c 266 60 +161db a 268 60 +161e5 95 271 60 +1627a 11 276 60 +1628b b 279 60 +16296 58 282 60 +162ee 2f 283 60 +1631d 32 282 60 +1634f 14 284 60 +16363 1a 285 60 +1637d b 289 60 +16388 12 291 60 +1639a b 292 60 +163a5 1 292 60 +FUNC 163a6 3a 0 std::fill(unsigned char*, unsigned char*, unsigned char const&) +163a6 c 573 61 +163b2 9 576 61 +163bb 23 577 61 +163de 2 578 61 +FUNC 163e0 33 0 std::__deque_buf_size(unsigned long) +163e0 c 83 62 +163ec 27 84 62 +16413 1 84 62 +FUNC 16414 18 0 dwarf2reader::ByteReader::OffsetSize() const +16414 c 38 63 +16420 c 38 63 +FUNC 1642c 18 0 dwarf2reader::ByteReader::AddressSize() const +1642c c 41 63 +16438 c 41 63 +FUNC 16444 17 0 dwarf2reader::ByteReader::ReadOneByte(char const*) const +16444 c 10 64 +16450 9 11 64 +16459 2 12 64 +1645b 1 12 64 +FUNC 1645c 63 0 dwarf2reader::ByteReader::ReadTwoBytes(char const*) const +1645c c 14 64 +16468 d 15 64 +16475 e 16 64 +16483 b 17 64 +1648e 17 18 64 +164a5 18 20 64 +164bd 2 22 64 +164bf 1 22 64 +FUNC 164c0 98 0 dwarf2reader::ByteReader::ReadUnsignedLEB128(char const*, unsigned long*) const +164c0 e 59 64 +164ce e 60 64 +164dc 7 61 64 +164e3 7 62 64 +164ea e 66 64 +164f8 5 67 64 +164fd 38 69 64 +16535 6 71 64 +1653b 8 65 64 +16543 8 75 64 +1654b 6 77 64 +16551 7 78 64 +FUNC 16558 ee 0 dwarf2reader::ByteReader::ReadSignedLEB128(char const*, unsigned long*) const +16558 e 84 64 +16566 e 85 64 +16574 7 86 64 +1657b 7 87 64 +16582 e 91 64 +16590 5 92 64 +16595 44 93 64 +165d9 6 94 64 +165df 8 90 64 +165e7 14 97 64 +165fb 36 98 64 +16631 8 99 64 +16639 6 100 64 +1663f 7 101 64 +FUNC 16646 a2 0 dwarf2reader::ByteReader::ReadOffset(char const*) const +16646 13 103 64 +16659 3f 104 64 +16698 4a 105 64 +166e2 6 106 64 +FUNC 166e8 a2 0 dwarf2reader::ByteReader::ReadAddress(char const*) const +166e8 13 108 64 +166fb 3f 109 64 +1673a 4a 110 64 +16784 6 111 64 +FUNC 1678a 61 0 dwarf2reader::LineStateMachine::Reset(bool) +1678a 12 12 65 +1679c 9 13 65 +167a5 11 14 65 +167b6 11 15 65 +167c7 a 16 65 +167d1 a 17 65 +167db 7 18 65 +167e2 7 19 65 +167e9 2 20 65 +167eb 1 20 65 +FUNC 167ec 20 0 std::_List_const_iterator >::operator!=(std::_List_const_iterator > const&) const +167ec c 253 66 +167f8 14 254 66 +FUNC 1680c 25 0 std::_List_const_iterator >::operator++(int) +1680c c 226 66 +16818 8 228 66 +16820 c 229 66 +1682c 5 230 66 +16831 1 230 66 +FUNC 16832 16 0 std::_List_const_iterator >::operator->() const +16832 c 215 66 +1683e a 216 66 +16848 c 190 67 +16854 a 190 67 +FUNC 1685e 13 0 std::auto_ptr > > >::operator->() const +1685e c 283 67 +1686a 7 286 67 +16871 1 286 67 +16872 c 65 68 +1687e 2 65 68 +16880 c 97 69 +1688c d 97 69 +16899 1 97 69 +1689a c 99 69 +168a6 14 100 69 +168ba c 97 69 +168c6 d 97 69 +168d3 1 97 69 +168d4 c 84 70 +168e0 17 85 70 +168f7 1 85 70 +FUNC 168f8 2d 0 std::pair std::make_pair(dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm) +168f8 c 144 70 +16904 21 145 70 +16925 1 145 70 +16926 c 202 66 +16932 a 203 66 +FUNC 1693c 25 0 std::list, std::allocator > >::begin() const +1693c c 588 70 +16948 19 589 66 +16961 1 589 66 +FUNC 16962 23 0 std::list, std::allocator > >::end() const +16962 c 605 70 +1696e 17 606 66 +16985 1 606 66 +16986 c 65 68 +16992 2 65 68 +16994 c 72 68 +169a0 2 72 68 +169a2 c 97 69 +169ae d 97 69 +169bb 1 97 69 +169bc c 105 69 +169c8 d 105 69 +169d5 1 105 69 +169d6 c 105 69 +169e2 d 105 69 +169ef 1 105 69 +169f0 c 67 68 +169fc 2 67 68 +169fe c 99 69 +16a0a 14 100 69 +16a1e c 99 69 +16a2a 14 100 69 +16a3e c 129 62 +16a4a 30 131 62 +16a7a c 65 68 +16a86 2 65 68 +16a88 c 72 68 +16a94 2 72 68 +16a96 c 97 69 +16aa2 d 97 69 +16aaf 1 97 69 +16ab0 c 105 69 +16abc d 105 69 +16ac9 1 105 69 +16aca c 105 69 +16ad6 d 105 69 +16ae3 1 105 69 +16ae4 c 67 68 +16af0 2 67 68 +16af2 c 99 69 +16afe 14 100 69 +16b12 c 99 69 +16b1e 14 100 69 +FUNC 16b32 2b 0 std::_Vector_base >::get_allocator() const +16b32 10 93 71 +16b42 1b 94 71 +16b5d 1 94 71 +16b6a 7 614 72 +16b71 1 614 72 +16b72 c 80 71 +16b7e d 80 71 +16b8b 1 80 71 +16b98 2 107 68 +FUNC 16b9a 2d 0 void std::_Destroy >(unsigned char*, unsigned char*, std::allocator) +16b9a c 171 73 +16ba6 2 173 73 +16ba8 12 174 73 +16bba b 173 73 +16bc5 2 174 73 +16bc7 1 174 73 +16bc8 c 84 71 +16bd4 2f 85 71 +16c03 2 86 71 +16c05 1 86 71 +16c06 c 96 71 +16c12 12 97 71 +16c24 2 98 71 +FUNC 16c26 1f 0 std::_List_base, std::allocator > >::_M_init() +16c26 c 338 73 +16c32 8 340 66 +16c3a b 341 66 +16c45 1 341 66 +16c46 c 105 69 +16c52 d 105 69 +16c5f 1 105 69 +16c60 c 125 66 +16c6c a 126 66 +FUNC 16c76 25 0 std::list, std::allocator > >::begin() +16c76 c 579 73 +16c82 19 580 66 +16c9b 1 580 66 +FUNC 16c9c 23 0 std::list, std::allocator > >::end() +16c9c c 597 73 +16ca8 17 597 66 +16cbf 1 597 66 +16cc0 c 603 72 +16ccc c 603 72 +FUNC 16cd8 2b 0 std::vector >::begin() const +16cd8 c 342 73 +16ce4 1f 343 71 +16d03 1 343 71 +FUNC 16d04 2c 0 std::vector >::end() const +16d04 c 360 73 +16d10 20 361 71 +16d3c 5 666 72 +16d41 1 666 72 +16d4f 31 759 72 +FUNC 16d80 3c 0 std::vector >::size() const +16d80 c 402 73 +16d8c 30 403 71 +16dbc c 603 72 +16dc8 c 603 72 +FUNC 16dd4 23 0 std::vector >::begin() +16dd4 c 333 73 +16de0 17 334 71 +16df7 1 334 71 +16e04 33 654 72 +16e37 1 654 72 +FUNC 16e38 26 0 std::vector >::end() +16e38 c 351 73 +16e44 1a 352 71 +16e6a 7 614 72 +16e71 1 614 72 +FUNC 16e72 42 0 std::vector >::operator[](unsigned long) +16e72 c 494 73 +16e7e 36 495 71 +FUNC 16eb4 13 0 std::vector >::max_size() const +16eb4 c 407 73 +16ec0 7 408 71 +16ec7 1 408 71 +16ed4 5 666 72 +16ed9 1 666 72 +16ee6 d 623 72 +16ef3 5 624 72 +16ef8 c 382 62 +16f04 d 382 62 +16f11 1 382 62 +FUNC 16f12 2b 0 std::_Deque_base >::get_allocator() const +16f12 10 360 73 +16f22 1b 361 62 +16f3d 1 361 62 +FUNC 16f3e 2d 0 std::deque >::get_allocator() const +16f3e 10 764 73 +16f4e 1d 765 62 +16f6b 1 765 62 +FUNC 16f6c 13 0 std::_Deque_iterator::operator*() const +16f6c c 134 73 +16f78 7 135 62 +16f7f 1 135 62 +16f8c 2 107 68 +16f8e c 129 62 +16f9a 30 131 62 +FUNC 16fca 2c 0 std::deque >::end() const +16fca 10 799 73 +16fda 1c 800 62 +FUNC 16ff6 2c 0 std::deque >::begin() const +16ff6 10 781 73 +17006 1c 782 62 +FUNC 17022 2e 0 std::deque >::end() +17022 10 790 73 +17032 1e 791 62 +FUNC 17050 3c 0 std::vector >::_M_range_check(unsigned long) const +17050 13 515 73 +17063 15 517 71 +17078 14 518 71 +FUNC 1708c 32 0 std::vector >::at(unsigned long) +1708c c 534 73 +17098 12 536 71 +170aa 14 537 71 +170ca 2e 104 68 +170f8 c 84 71 +17104 2f 85 71 +17133 2 86 71 +17135 1 86 71 +17136 c 96 71 +17142 12 97 71 +17154 2 98 71 +17156 c 603 72 +17162 c 603 72 +FUNC 1716e 23 0 std::vector >::begin() +1716e c 333 73 +1717a 17 334 71 +17191 1 334 71 +1719e 27 654 72 +171c5 1 654 72 +FUNC 171c6 42 0 std::vector >::operator[](unsigned long) +171c6 c 494 73 +171d2 36 495 71 +FUNC 17208 26 0 std::vector >::end() +17208 c 351 73 +17214 1a 352 71 +1723a d 94 68 +17247 1 94 68 +FUNC 17248 2f 0 std::_Vector_base >::_M_deallocate(unsigned char*, unsigned long) +17248 c 120 73 +17254 6 122 71 +1725a 1d 123 71 +17277 1 123 71 +17278 c 108 71 +17284 3a 109 71 +172be c 188 71 +172ca 12 189 71 +172dc 2 190 71 +172de c 272 71 +172ea 4b 273 71 +17335 1 273 71 +17336 13 62 74 +17349 10 62 74 +17359 a 63 74 +17363 25 64 74 +17388 1a 66 74 +173a2 13 62 74 +173b5 10 62 74 +173c5 a 63 74 +173cf 25 64 74 +173f4 1a 66 74 +1740e c 188 71 +1741a 12 189 71 +1742c 2 190 71 +1743b 31 759 72 +1746c c 65 68 +17478 2 65 68 +1747a c 103 69 +17486 d 103 69 +17493 1 103 69 +FUNC 17494 2d 0 std::list, std::allocator > >::get_allocator() const +17494 10 570 74 +174a4 1d 571 66 +174c1 1 571 66 +174ce 2e 104 68 +FUNC 174fc 20 0 std::_List_iterator >::operator!=(std::_List_iterator > const&) const +174fc c 172 74 +17508 14 173 66 +FUNC 1751c 1d 0 std::_List_const_iterator >::operator++() +1751c c 219 74 +17528 c 221 66 +17534 5 222 66 +17539 1 222 66 +FUNC 1753a 1d 0 std::_List_iterator >::operator++() +1753a c 138 74 +17546 c 140 66 +17552 5 141 66 +17557 1 141 66 +FUNC 17558 16 0 std::_List_const_iterator >::operator*() const +17558 c 211 74 +17564 a 212 66 +FUNC 1756e 16 0 std::_List_iterator >::operator*() const +1756e c 130 74 +1757a a 131 66 +FUNC 17584 20 0 std::_List_const_iterator >::operator==(std::_List_const_iterator > const&) const +17584 c 249 74 +17590 14 250 66 +FUNC 175a4 35 0 bool __gnu_cxx::operator!= > >(__gnu_cxx::__normal_iterator > > const&, __gnu_cxx::__normal_iterator > > const&) +175a4 d 699 74 +175b1 28 700 72 +175d9 1 700 72 +FUNC 175da 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator > >, std::allocator >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, std::allocator) +175da c 171 74 +175e6 2 173 73 +175e8 1a 174 73 +17602 21 173 73 +17623 2 174 73 +17625 1 174 73 +17626 c 127 62 +17632 29 127 62 +1765b 1 127 62 +1765c c 388 62 +17668 41 389 62 +176a9 2 390 62 +176ab 1 390 62 +176b8 d 94 68 +176c5 1 94 68 +FUNC 176c6 20 0 bool std::operator==(std::_Deque_iterator const&, std::_Deque_iterator const&) +176c6 c 243 74 +176d2 14 244 62 +FUNC 176e6 26 0 bool std::operator!=(std::_Deque_iterator const&, std::_Deque_iterator const&) +176e6 c 256 74 +176f2 1a 257 62 +FUNC 1770c 1a 0 std::_Deque_iterator::_S_buffer_size() +1770c c 106 74 +17718 e 107 62 +FUNC 17726 3e 0 std::_Deque_iterator::_M_set_node(unsigned long long**) +17726 d 229 74 +17733 9 231 62 +1773c b 232 62 +17747 1d 233 62 +FUNC 17764 50 0 std::_Deque_iterator::operator++() +17764 c 142 74 +17770 d 144 62 +1777d f 145 62 +1778c 18 147 62 +177a4 b 148 62 +177af 5 150 62 +FUNC 177b4 4b 0 void std::_Destroy, std::allocator >(std::_Deque_iterator, std::_Deque_iterator, std::allocator) +177b4 c 171 74 +177c0 2 173 73 +177c2 1a 174 73 +177dc 21 173 73 +177fd 2 174 73 +177ff 1 174 73 +FUNC 17800 50 0 std::_Deque_iterator::operator--() +17800 c 162 74 +1780c f 164 62 +1781b 18 166 62 +17833 b 167 62 +1783e d 169 62 +1784b 5 170 62 +FUNC 17850 39 0 std::deque >::back() +17850 c 988 74 +1785c 15 990 62 +17871 b 991 62 +1787c d 992 62 +17889 1 992 62 +FUNC 1788a 19 0 std::stack > >::top() +1788a c 163 75 +17896 d 166 75 +178a3 1 166 75 +FUNC 178a4 66 0 std::_Deque_iterator::difference_type std::operator-(std::_Deque_iterator const&, std::_Deque_iterator const&) +178a4 d 328 75 +178b1 59 333 62 +FUNC 1790a 26 0 std::deque >::size() const +1790a c 840 75 +17916 1a 841 62 +1793c 36 662 72 +1797e 23 650 72 +179a1 1 650 72 +179a2 c 67 68 +179ae 2 67 68 +179b0 c 99 69 +179bc 14 100 69 +179d0 c 303 66 +179dc 12 304 66 +179ee 2 305 66 +179f0 c 326 66 +179fc 2f 327 66 +17a2b d 328 66 +17a38 c 457 66 +17a44 14 458 66 +17a58 c 211 74 +17a64 2d 211 74 +17a91 1 211 74 +17a9e 7 98 68 +17aa5 1 98 68 +17ab2 1d 85 68 +17acf 5 86 68 +17ad4 17 88 68 +17aeb 1 88 68 +FUNC 17aec 2a 0 std::_Vector_base >::_M_allocate(unsigned long) +17aec c 116 75 +17af8 1e 117 71 +17b22 d 94 68 +17b2f 1 94 68 +FUNC 17b30 34 0 std::_Deque_base >::_M_deallocate_node(unsigned long long*) +17b30 c 402 75 +17b3c 28 403 62 +FUNC 17b64 38 0 std::_Deque_base >::_M_destroy_nodes(unsigned long long**, unsigned long long**) +17b64 c 504 75 +17b70 8 506 62 +17b78 14 507 62 +17b8c e 506 62 +17b9a 2 507 62 +FUNC 17b9c 62 0 std::deque >::_M_pop_back_aux() +17b9c c 391 76 +17ba8 15 393 76 +17bbd 1b 394 76 +17bd8 f 395 76 +17be7 17 396 76 +FUNC 17bfe 4f 0 std::deque >::pop_back() +17bfe c 1081 76 +17c0a 10 1083 62 +17c1a f 1086 62 +17c29 17 1087 62 +17c40 d 1090 62 +17c4d 1 1090 62 +FUNC 17c4e 19 0 std::stack > >::pop() +17c4e c 205 76 +17c5a d 208 75 +17c67 1 208 75 +17c68 c 72 68 +17c74 2 72 68 +17c76 c 105 69 +17c82 d 105 69 +17c8f 1 105 69 +17c90 c 603 72 +17c9c c 603 72 +FUNC 17ca8 2b 0 std::vector >::begin() const +17ca8 c 342 76 +17cb4 1f 343 71 +17cd3 1 343 71 +FUNC 17cd4 2c 0 std::vector >::end() const +17cd4 c 360 76 +17ce0 20 361 71 +17d0c 5 666 72 +17d11 1 666 72 +17d1f 28 759 72 +17d47 1 759 72 +FUNC 17d48 3c 0 std::vector >::size() const +17d48 c 402 76 +17d54 30 403 71 +17d90 d 623 72 +17d9d 5 624 72 +17dae 5 666 72 +17db3 1 666 72 +FUNC 17db4 35 0 bool __gnu_cxx::operator!= > >(__gnu_cxx::__normal_iterator > > const&, __gnu_cxx::__normal_iterator > > const&) +17db4 d 699 76 +17dc1 28 700 72 +17de9 1 700 72 +FUNC 17dea 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator > >, std::allocator >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, std::allocator) +17dea c 171 76 +17df6 2 173 73 +17df8 1a 174 73 +17e12 21 173 73 +17e33 2 174 73 +17e35 1 174 73 +17e43 28 759 72 +17e6b 1 759 72 +17e78 2a 662 72 +FUNC 17ea2 13 0 std::vector >::max_size() const +17ea2 c 407 76 +17eae 7 408 71 +17eb5 1 408 71 +17ec2 16 650 72 +17ee4 7 98 68 +17eeb 1 98 68 +17ef8 1d 85 68 +17f15 5 86 68 +17f1a 10 88 68 +FUNC 17f2a 29 0 std::_List_base, std::allocator > >::_M_get_node() +17f2a c 311 76 +17f36 1d 312 66 +17f53 1 312 66 +FUNC 17f54 5f 0 std::list, std::allocator > >::_M_create_node(std::pair const&) +17f54 d 435 76 +17f61 e 437 66 +17f6f 3c 440 66 +17fab 8 447 66 +17fb3 1 447 66 +FUNC 17fb4 35 0 std::list, std::allocator > >::_M_insert(std::_List_iterator >, std::pair const&) +17fb4 c 1149 76 +17fc0 15 1151 66 +17fd5 14 1152 66 +17fe9 1 1152 66 +FUNC 17fea 52 0 void std::list, std::allocator > >::_M_insert_dispatch > >(std::_List_iterator >, std::_List_const_iterator >, std::_List_const_iterator >, __false_type) +17fea c 1126 66 +17ff6 2 1128 66 +17ff8 21 1129 66 +18019 21 1128 66 +1803a 2 1129 66 +FUNC 1803c 36 0 void std::list, std::allocator > >::insert > >(std::_List_iterator >, std::_List_const_iterator >, std::_List_const_iterator >) +1803c c 838 66 +18048 2a 842 66 +18072 e 491 66 +18080 32 492 66 +180b2 64 493 66 +18116 c 211 74 +18122 3d 211 74 +1815f 1 211 74 +1816d 5c 104 68 +181c9 1 104 68 +FUNC 181ca 31 0 std::list, std::allocator > >::push_back(std::pair const&) +181ca c 772 76 +181d6 25 773 66 +181fb 1 773 66 +FUNC 181fc 69 0 void std::_Construct(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev const&) +181fc d 77 76 +18209 5c 81 73 +18265 1 81 73 +18272 7 98 68 +18279 1 98 68 +18286 1d 85 68 +182a3 5 86 68 +182a8 10 88 68 +182b8 c 65 68 +182c4 2 65 68 +182c6 c 103 69 +182d2 d 103 69 +182df 1 103 69 +FUNC 182e0 4d 0 std::_Deque_base >::_M_get_map_allocator() const +182e0 11 394 76 +182f1 3c 395 62 +1832d 1 395 62 +FUNC 1832e 75 0 std::_Deque_base >::_M_allocate_map(unsigned long) +1832e d 406 76 +1833b 68 407 62 +183a3 1 407 62 +FUNC 183a4 47 0 std::_Deque_base >::_M_deallocate_map(unsigned long long**, unsigned long) +183a4 c 410 76 +183b0 3b 411 62 +183eb 1 411 62 +183ec c 424 62 +183f8 9 426 62 +18401 22 428 62 +18423 2b 430 62 +1844e c 714 62 +1845a 70 715 62 +184ca c 111 75 +184d6 d 111 75 +184e3 1 111 75 +184e4 c 259 67 +184f0 26 259 67 +18522 7 98 68 +18529 1 98 68 +18536 1d 85 68 +18553 5 86 68 +18558 10 88 68 +FUNC 18568 33 0 std::_Deque_base >::_M_allocate_node() +18568 c 398 76 +18574 27 399 62 +1859b 1 399 62 +FUNC 1859c 82 0 std::_Deque_base >::_M_create_nodes(unsigned long long**, unsigned long long**) +1859c d 486 76 +185a9 8 491 62 +185b1 12 492 62 +185c3 13 491 62 +185d6 b 494 62 +185e1 19 496 62 +185fa b 497 62 +18605 13 494 62 +18618 6 497 62 +FUNC 1861e 17b 0 std::_Deque_base >::_M_initialize_map(unsigned long) +1861e d 447 76 +1862b 1e 450 62 +18649 2a 452 62 +18673 1c 454 62 +1868f 19 462 62 +186a8 c 463 62 +186b4 1e 466 62 +186d2 b 467 62 +186dd 1e 469 62 +186fb 9 470 62 +18704 a 471 62 +1870e b 472 62 +18719 13 467 62 +1872c 15 475 62 +18741 18 476 62 +18759 c 477 62 +18765 34 478 62 +18799 1 478 62 +1879a d 366 62 +187a7 12 367 62 +187b9 39 368 62 +187f2 c 645 62 +187fe 1c 646 62 +FUNC 1881a 4d 0 void std::__fill::fill<__gnu_cxx::__normal_iterator > >, unsigned char>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char const&) +1881a c 539 61 +18826 9 541 61 +1882f 2 542 61 +18831 13 543 61 +18844 21 542 61 +18865 2 543 61 +18867 1 543 61 +FUNC 18868 2b 0 void std::fill<__gnu_cxx::__normal_iterator > >, unsigned char>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char const&) +18868 c 560 76 +18874 4 567 61 +18878 1b 568 61 +18893 1 568 61 +FUNC 18894 6a 0 std::list, std::allocator > >::_M_erase(std::_List_iterator >) +18894 d 1157 76 +188a1 b 1159 66 +188ac 6 1160 66 +188b2 35 1161 66 +188e7 17 1162 66 +FUNC 188fe 37 0 std::list, std::allocator > >::erase(std::_List_iterator >) +188fe c 95 77 +1890a 14 97 77 +1891e 12 98 77 +18930 5 99 77 +18935 1 99 77 +FUNC 18936 3e 0 std::list, std::allocator > >::erase(std::_List_iterator >, std::_List_iterator >) +18936 c 883 77 +18942 2 885 66 +18944 15 886 66 +18959 16 885 66 +1896f 5 887 66 +FUNC 18974 129 0 std::list, std::allocator > >::operator=(std::list, std::allocator > > const&) +18974 e 120 77 +18982 c 122 77 +1898e e 124 77 +1899c e 125 77 +189aa e 126 77 +189b8 e 127 77 +189c6 2 128 77 +189c8 20 130 77 +189e8 5a 128 77 +18a42 16 131 77 +18a58 1b 132 77 +18a73 20 134 77 +18a93 a 136 77 +18a9d 1 136 77 +FUNC 18a9e 4c 0 dwarf2reader::CompilationUnit::Abbrev::operator=(dwarf2reader::CompilationUnit::Abbrev const&) +18a9e c 211 77 +18aaa 40 211 74 +FUNC 18aea 52 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy::copy(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +18aea c 280 61 +18af6 1a 283 61 +18b10 12 285 61 +18b22 4 286 61 +18b26 6 287 61 +18b2c b 283 61 +18b37 5 289 61 +FUNC 18b3c 2b 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_aux(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +18b3c c 307 77 +18b48 4 315 61 +18b4c 1b 317 61 +18b67 1 317 61 +18b76 56 354 61 +18bd8 4 384 61 +18bdc 4 385 61 +18be0 1b 387 61 +18bfb 1 387 61 +FUNC 18bfc ac 0 std::vector >::erase(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >) +18bfc d 122 78 +18c09 26 124 78 +18c2f 43 125 78 +18c72 2e 126 78 +18ca0 8 127 78 +FUNC 18ca8 54 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_backward::copy_b(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +18ca8 c 408 61 +18cb4 1a 411 61 +18cce 1e 412 61 +18cec b 411 61 +18cf7 5 413 61 +FUNC 18cfc 2b 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_backward_aux(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +18cfc c 432 78 +18d08 4 440 61 +18d0c 1b 443 61 +18d27 1 443 61 +18d36 56 482 61 +18d98 4 514 61 +18d9c 4 515 61 +18da0 1b 517 61 +18dbb 1 517 61 +FUNC 18dbc 4d 0 void std::__fill::fill<__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev const&) +18dbc c 526 61 +18dc8 2 528 61 +18dca 1c 529 61 +18de6 21 528 61 +18e07 2 529 61 +18e09 1 529 61 +FUNC 18e0a 2b 0 void std::fill<__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev const&) +18e0a c 560 78 +18e16 4 567 61 +18e1a 1b 568 61 +18e35 1 568 61 +FUNC 18e36 3f 0 unsigned char* std::__copy::copy(unsigned char const*, unsigned char const*, unsigned char*) +18e36 c 298 61 +18e42 22 300 61 +18e64 11 301 61 +18e75 1 301 61 +FUNC 18e76 2b 0 unsigned char* std::__copy_aux(unsigned char*, unsigned char*, unsigned char*) +18e76 c 307 78 +18e82 4 315 61 +18e86 1b 317 61 +18ea1 1 317 61 +18eb0 56 354 61 +18f12 4 384 61 +18f16 4 385 61 +18f1a 1b 387 61 +18f35 1 387 61 +FUNC 18f36 a0 0 std::vector >::erase(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >) +18f36 d 122 78 +18f43 26 124 78 +18f69 43 125 78 +18fac 22 126 78 +18fce 8 127 78 +18fe2 7 98 68 +18fe9 1 98 68 +18ff6 1d 85 68 +19013 5 86 68 +19018 d 88 68 +19025 1 88 68 +FUNC 19026 2a 0 std::_Vector_base >::_M_allocate(unsigned long) +19026 c 116 78 +19032 1e 117 71 +1905c 1b 74 79 +19077 1 74 79 +19084 23 113 79 +190a7 1 113 79 +190b4 1b 254 79 +190cf 1 254 79 +FUNC 190d0 19 0 void std::_Destroy(dwarf2reader::CompilationUnit::Abbrev*) +190d0 c 106 79 +190dc d 107 73 +190e9 1 107 73 +FUNC 190ea 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, __false_type) +190ea c 119 79 +190f6 2 121 73 +190f8 13 122 73 +1910b 21 121 73 +1912c 2 122 73 +FUNC 1912e 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator > > >(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >) +1912e c 148 79 +1913a 1c 155 73 +FUNC 19156 8d 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, __false_type) +19156 d 188 79 +19163 6 190 79 +19169 2 193 79 +1916b 1c 194 79 +19187 1b 193 79 +191a2 b 196 79 +191ad 12 198 79 +191bf b 199 79 +191ca 13 196 79 +191dd 6 199 79 +191e3 1 199 79 +FUNC 191e4 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&) +191e4 c 214 79 +191f0 23 218 79 +19213 1 218 79 +FUNC 19214 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, std::allocator) +19214 c 308 79 +19220 1b 310 79 +1923b 1 310 79 +19249 6 82 79 +1924f 2 85 79 +19251 24 86 79 +19275 2c 85 79 +192a1 b 87 79 +192ac b 89 79 +192b7 12 91 79 +192c9 b 92 79 +192d4 13 89 79 +192e7 9 92 79 +192fc 23 113 79 +1931f 1 113 79 +1932c 1b 254 79 +19347 1 254 79 +FUNC 19348 409 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev const&) +19348 14 249 79 +1935c 14 251 78 +19370 22 253 78 +19392 f 255 78 +193a1 12 256 78 +193b3 55 257 78 +19408 4b 260 78 +19453 e 264 78 +19461 15 265 78 +19476 e 266 78 +19484 1d 271 78 +194a1 8 272 78 +194a9 e 273 78 +194b7 27 275 78 +194de 6 276 78 +194e4 55 279 78 +19539 25 284 78 +1955e b 285 78 +19569 4f 286 78 +195b8 3 284 78 +195bb 13 279 78 +195ce e 286 78 +195dc 4d 298 78 +19629 36 299 78 +1965f 12 302 78 +19671 13 303 78 +19684 2e 304 78 +196b2 13 286 78 +196c5 b 292 78 +196d0 39 294 78 +19709 23 295 78 +1972c b 296 78 +19737 13 292 78 +1974a 7 304 78 +19751 1 304 78 +FUNC 19752 70 0 std::vector >::push_back(dwarf2reader::CompilationUnit::Abbrev const&) +19752 c 602 79 +1975e 10 604 71 +1976e 1e 606 71 +1978c 11 607 71 +1979d 25 610 71 +FUNC 197c2 50 0 unsigned char* std::__copy_backward::copy_b(unsigned char const*, unsigned char const*, unsigned char*) +197c2 d 422 61 +197cf f 424 61 +197de 24 425 61 +19802 10 426 61 +FUNC 19812 2b 0 unsigned char* std::__copy_backward_aux(unsigned char*, unsigned char*, unsigned char*) +19812 c 432 79 +1981e 4 440 61 +19822 1b 443 61 +1983d 1 443 61 +1984c 56 482 61 +198ae 4 514 61 +198b2 4 515 61 +198b6 1b 517 61 +198d1 1 517 61 +FUNC 198d2 32 0 unsigned char* std::fill_n(unsigned char*, unsigned long, unsigned char const&) +198d2 c 647 79 +198de 1e 649 61 +198fc 8 650 61 +FUNC 19904 27 0 void std::__uninitialized_fill_n_aux(unsigned char*, unsigned long, unsigned char const&, __true_type) +19904 c 182 79 +19910 1b 183 79 +1992b 1 183 79 +FUNC 1992c 2f 0 void std::uninitialized_fill_n(unsigned char*, unsigned long, unsigned char const&) +1992c c 214 79 +19938 23 218 79 +1995b 1 218 79 +FUNC 1995c 27 0 void std::__uninitialized_fill_n_a(unsigned char*, unsigned long, unsigned char const&, std::allocator) +1995c c 308 79 +19968 1b 310 79 +19983 1 310 79 +FUNC 19984 27 0 void std::__destroy_aux(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, __false_type) +19984 c 119 79 +19990 2 121 73 +19992 b 122 73 +1999d c 121 73 +199a9 2 122 73 +199ab 1 122 73 +FUNC 199ac 28 0 void std::_Destroy(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +199ac c 148 79 +199b8 1c 155 73 +FUNC 199d4 88 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_aux(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, __false_type) +199d4 d 80 79 +199e1 6 82 79 +199e7 2 85 79 +199e9 12 86 79 +199fb 12 85 79 +19a0d b 87 79 +19a18 b 89 79 +19a23 12 91 79 +19a35 b 92 79 +19a40 13 89 79 +19a53 9 92 79 +FUNC 19a5c 2f 0 dwarf2reader::CompilationUnit::Abbrev* std::uninitialized_copy(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*) +19a5c c 108 79 +19a68 23 113 79 +19a8b 1 113 79 +FUNC 19a8c 27 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_a(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, std::allocator) +19a8c c 252 79 +19a98 1b 254 79 +19ab3 1 254 79 +FUNC 19ab4 7e 0 void std::__uninitialized_fill_n_aux(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, __false_type) +19ab4 d 188 79 +19ac1 6 190 79 +19ac7 2 193 79 +19ac9 12 194 79 +19adb 16 193 79 +19af1 b 196 79 +19afc 12 198 79 +19b0e b 199 79 +19b19 13 196 79 +19b2c 6 199 79 +FUNC 19b32 2f 0 void std::uninitialized_fill_n(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&) +19b32 c 214 79 +19b3e 23 218 79 +19b61 1 218 79 +FUNC 19b62 27 0 void std::__uninitialized_fill_n_a(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, std::allocator) +19b62 c 308 79 +19b6e 1b 310 79 +19b89 1 310 79 +FUNC 19b8a a5 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_aux<__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*, __false_type) +19b8a d 80 79 +19b97 6 82 79 +19b9d 2 85 79 +19b9f 1a 86 79 +19bb9 27 85 79 +19be0 b 87 79 +19beb b 89 79 +19bf6 12 91 79 +19c08 b 92 79 +19c13 13 89 79 +19c26 9 92 79 +19c2f 1 92 79 +FUNC 19c30 2f 0 dwarf2reader::CompilationUnit::Abbrev* std::uninitialized_copy<__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*) +19c30 c 108 79 +19c3c 23 113 79 +19c5f 1 113 79 +FUNC 19c60 27 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, dwarf2reader::CompilationUnit::Abbrev*, std::allocator) +19c60 c 252 79 +19c6c 1b 254 79 +19c87 1 254 79 +FUNC 19c88 5f8 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&) +19c88 15 311 79 +19c9d b 313 78 +19ca8 2a 315 78 +19cd2 12 318 78 +19ce4 23 319 78 +19d07 15 320 78 +19d1c c 321 78 +19d28 5a 323 78 +19d82 1c 327 78 +19d9e 35 328 78 +19dd3 16 323 78 +19de9 30 330 78 +19e19 10 343 78 +19e29 48 334 78 +19e71 21 338 78 +19e92 3d 339 78 +19ecf 13 334 78 +19ee2 b 339 78 +19eed 1c 342 78 +19f09 1e 343 78 +19f27 13 339 78 +19f3a 24 343 78 +19f5e e 348 78 +19f6c 1e 349 78 +19f8a e 350 78 +19f98 1d 353 78 +19fb5 8 354 78 +19fbd e 355 78 +19fcb 27 357 78 +19ff2 6 358 78 +19ff8 4d 361 78 +1a045 40 365 78 +1a085 18 367 78 +1a09d 44 368 78 +1a0e1 3 365 78 +1a0e4 19 361 78 +1a0fd 13 365 78 +1a110 e 368 78 +1a11e 3e 379 78 +1a15c 36 381 78 +1a192 12 384 78 +1a1a4 13 385 78 +1a1b7 2e 386 78 +1a1e5 e 368 78 +1a1f3 b 372 78 +1a1fe 39 374 78 +1a237 23 376 78 +1a25a b 377 78 +1a265 13 372 78 +1a278 8 386 78 +FUNC 1a280 2e 0 std::vector >::insert(__gnu_cxx::__normal_iterator > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&) +1a280 c 657 79 +1a28c 22 658 71 +FUNC 1a2ae ab 0 std::vector >::resize(unsigned long, dwarf2reader::CompilationUnit::Abbrev const&) +1a2ae d 422 79 +1a2bb 15 424 71 +1a2d0 48 425 71 +1a318 41 427 71 +1a359 1 427 71 +FUNC 1a35a 63 0 std::vector >::resize(unsigned long) +1a35a d 441 79 +1a367 56 442 71 +1a3bd 1 442 71 +FUNC 1a3be 13 0 std::_Deque_iterator::operator*() const +1a3be c 134 79 +1a3ca 7 135 62 +1a3d1 1 135 62 +FUNC 1a3d2 3f 0 unsigned long long** std::__copy::copy(unsigned long long* const*, unsigned long long* const*, unsigned long long**) +1a3d2 c 298 61 +1a3de 22 300 61 +1a400 11 301 61 +1a411 1 301 61 +FUNC 1a412 2b 0 unsigned long long** std::__copy_aux(unsigned long long**, unsigned long long**, unsigned long long**) +1a412 c 307 79 +1a41e 4 315 61 +1a422 1b 317 61 +1a43d 1 317 61 +FUNC 1a43e 27 0 unsigned long long** std::__copy_normal::copy_n(unsigned long long**, unsigned long long**, unsigned long long**) +1a43e c 325 61 +1a44a 1b 326 61 +1a465 1 326 61 +FUNC 1a466 2f 0 unsigned long long** std::copy(unsigned long long**, unsigned long long**, unsigned long long**) +1a466 c 376 79 +1a472 4 384 61 +1a476 4 385 61 +1a47a 1b 387 61 +1a495 1 387 61 +FUNC 1a496 60 0 unsigned long long** std::__copy_backward::copy_b(unsigned long long* const*, unsigned long long* const*, unsigned long long**) +1a496 d 422 61 +1a4a3 12 424 61 +1a4b5 2e 425 61 +1a4e3 13 426 61 +FUNC 1a4f6 2b 0 unsigned long long** std::__copy_backward_aux(unsigned long long**, unsigned long long**, unsigned long long**) +1a4f6 c 432 79 +1a502 4 440 61 +1a506 1b 443 61 +1a521 1 443 61 +FUNC 1a522 27 0 unsigned long long** std::__copy_backward_normal::copy_b_n(unsigned long long**, unsigned long long**, unsigned long long**) +1a522 c 451 61 +1a52e 1b 452 61 +1a549 1 452 61 +FUNC 1a54a 2f 0 unsigned long long** std::copy_backward(unsigned long long**, unsigned long long**, unsigned long long**) +1a54a c 504 79 +1a556 4 514 61 +1a55a 4 515 61 +1a55e 1b 517 61 +1a579 1 517 61 +FUNC 1a57a 1df 0 std::deque >::_M_reallocate_map(unsigned long, bool) +1a57a 13 723 79 +1a58d 1b 726 76 +1a5a8 9 727 76 +1a5b1 13 730 76 +1a5c4 39 732 76 +1a5fd b 735 76 +1a608 27 736 76 +1a62f 2f 740 76 +1a65e 26 748 76 +1a684 15 750 76 +1a699 36 751 76 +1a6cf 22 753 76 +1a6f1 1e 756 76 +1a70f 8 758 76 +1a717 9 759 76 +1a720 15 762 76 +1a735 24 763 76 +1a759 1 763 76 +FUNC 1a75a 59 0 std::deque >::_M_reserve_map_at_back(unsigned long) +1a75a e 1443 79 +1a768 2a 1445 62 +1a792 21 1447 62 +1a7b3 1 1447 62 +FUNC 1a7b4 8c 0 std::deque >::_M_push_back_aux(unsigned long long const&) +1a7b4 c 345 79 +1a7c0 e 347 76 +1a7ce 13 348 76 +1a7e1 18 349 76 +1a7f9 1e 352 76 +1a817 1b 353 76 +1a832 c 355 76 +1a83e 2 360 76 +FUNC 1a840 62 0 std::deque >::push_back(unsigned long long const&) +1a840 c 1039 79 +1a84c 13 1041 62 +1a85f 1e 1044 62 +1a87d 11 1045 62 +1a88e 14 1048 62 +FUNC 1a8a2 20 0 std::stack > >::push(unsigned long long const&) +1a8a2 c 190 79 +1a8ae 14 191 75 +FUNC 1a8c2 27 0 unsigned char* std::__copy_normal::copy_n(unsigned char*, unsigned char*, unsigned char*) +1a8c2 c 325 61 +1a8ce 1b 326 61 +1a8e9 1 326 61 +FUNC 1a8ea 2f 0 unsigned char* std::copy(unsigned char*, unsigned char*, unsigned char*) +1a8ea c 376 79 +1a8f6 4 384 61 +1a8fa 4 385 61 +1a8fe 1b 387 61 +1a919 1 387 61 +FUNC 1a91a 27 0 unsigned char* std::__uninitialized_copy_aux(unsigned char*, unsigned char*, unsigned char*, __true_type) +1a91a c 73 79 +1a926 1b 74 79 +1a941 1 74 79 +FUNC 1a942 2f 0 unsigned char* std::uninitialized_copy(unsigned char*, unsigned char*, unsigned char*) +1a942 c 108 79 +1a94e 23 113 79 +1a971 1 113 79 +FUNC 1a972 27 0 unsigned char* std::__uninitialized_copy_a(unsigned char*, unsigned char*, unsigned char*, std::allocator) +1a972 c 252 79 +1a97e 1b 254 79 +1a999 1 254 79 +FUNC 1a99a 40 0 unsigned char* std::__copy_normal::copy_n<__gnu_cxx::__normal_iterator > >, unsigned char*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char*) +1a99a d 334 61 +1a9a7 33 335 61 +FUNC 1a9da 2f 0 unsigned char* std::copy<__gnu_cxx::__normal_iterator > >, unsigned char*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char*) +1a9da c 376 79 +1a9e6 4 384 61 +1a9ea 4 385 61 +1a9ee 1b 387 61 +1aa09 1 387 61 +FUNC 1aa0a 27 0 unsigned char* std::__uninitialized_copy_aux<__gnu_cxx::__normal_iterator > >, unsigned char*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char*, __true_type) +1aa0a c 73 79 +1aa16 1b 74 79 +1aa31 1 74 79 +FUNC 1aa32 2f 0 unsigned char* std::uninitialized_copy<__gnu_cxx::__normal_iterator > >, unsigned char*>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char*) +1aa32 c 108 79 +1aa3e 23 113 79 +1aa61 1 113 79 +FUNC 1aa62 27 0 unsigned char* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator > >, unsigned char*, unsigned char>(__gnu_cxx::__normal_iterator > >, __gnu_cxx::__normal_iterator > >, unsigned char*, std::allocator) +1aa62 c 252 79 +1aa6e 1b 254 79 +1aa89 1 254 79 +1aa96 9 616 61 +1aa9f 2 617 61 +1aaa1 13 618 61 +1aab4 16 617 61 +1aaca 5 619 61 +1aacf 1 619 61 +1aadc 4 641 61 +1aae0 1b 642 61 +1aafb 1 642 61 +FUNC 1aafc 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char>(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char const&, __true_type) +1aafc c 182 79 +1ab08 1b 183 79 +1ab23 1 183 79 +FUNC 1ab24 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char>(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char const&) +1ab24 c 214 79 +1ab30 23 218 79 +1ab53 1 218 79 +FUNC 1ab54 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char, unsigned char>(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char const&, std::allocator) +1ab54 c 308 79 +1ab60 1b 310 79 +1ab7b 1 310 79 +FUNC 1ab7c 45a 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char const&) +1ab7c 14 311 79 +1ab90 b 313 78 +1ab9b 21 315 78 +1abbc 9 318 78 +1abc5 23 319 78 +1abe8 15 320 78 +1abfd c 321 78 +1ac09 4e 323 78 +1ac57 11 327 78 +1ac68 30 328 78 +1ac98 35 330 78 +1accd 48 334 78 +1ad15 14 338 78 +1ad29 43 339 78 +1ad6c 11 342 78 +1ad7d 1e 343 78 +1ad9b e 348 78 +1ada9 1e 349 78 +1adc7 e 350 78 +1add5 1d 353 78 +1adf2 8 354 78 +1adfa e 355 78 +1ae08 27 357 78 +1ae2f 6 358 78 +1ae35 4d 361 78 +1ae82 40 365 78 +1aec2 18 367 78 +1aeda 4d 368 78 +1af27 3e 379 78 +1af65 2d 381 78 +1af92 12 384 78 +1afa4 13 385 78 +1afb7 1f 386 78 +FUNC 1afd6 2e 0 std::vector >::insert(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned char const&) +1afd6 c 657 79 +1afe2 22 658 71 +FUNC 1b004 ab 0 std::vector >::resize(unsigned long, unsigned char const&) +1b004 d 422 79 +1b011 15 424 71 +1b026 48 425 71 +1b06e 41 427 71 +1b0af 1 427 71 +FUNC 1b0b0 2b 0 std::vector >::resize(unsigned long) +1b0b0 c 441 79 +1b0bc 1f 442 71 +1b0db 1 442 71 +FUNC 1b0dc 1a 0 std::_Deque_iterator::_S_buffer_size() +1b0dc c 106 79 +1b0e8 e 107 62 +FUNC 1b0f6 66 0 std::_Deque_iterator::difference_type std::operator-(std::_Deque_iterator const&, std::_Deque_iterator const&) +1b0f6 d 328 79 +1b103 59 333 62 +FUNC 1b15c 3e 0 std::_Deque_iterator::_M_set_node(unsigned long long**) +1b15c d 229 79 +1b169 9 231 62 +1b172 b 232 62 +1b17d 1d 233 62 +FUNC 1b19a 50 0 std::_Deque_iterator::operator++() +1b19a c 142 79 +1b1a6 d 144 62 +1b1b3 f 145 62 +1b1c2 18 147 62 +1b1da b 148 62 +1b1e5 5 150 62 +FUNC 1b1ea 84 0 std::_Deque_iterator std::__copy::copy, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator) +1b1ea e 280 61 +1b1f8 17 283 61 +1b20f 20 285 61 +1b22f b 286 61 +1b23a b 287 61 +1b245 b 283 61 +1b250 1e 289 61 +FUNC 1b26e 7e 0 std::_Deque_iterator std::__copy_aux, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator) +1b26e 11 307 79 +1b27f 4 315 61 +1b283 69 317 61 +FUNC 1b2ec 7a 0 std::_Deque_iterator std::__copy_normal::copy_n, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator) +1b2ec 11 325 61 +1b2fd 69 326 61 +FUNC 1b366 82 0 std::_Deque_iterator std::copy, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator) +1b366 11 376 79 +1b377 4 384 61 +1b37b 4 385 61 +1b37f 69 387 61 +FUNC 1b3e8 7a 0 std::_Deque_iterator std::__uninitialized_copy_aux, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator, __true_type) +1b3e8 11 73 79 +1b3f9 69 74 79 +FUNC 1b462 82 0 std::_Deque_iterator std::uninitialized_copy, std::_Deque_iterator >(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator) +1b462 11 108 79 +1b473 71 113 79 +FUNC 1b4e4 7a 0 std::_Deque_iterator std::__uninitialized_copy_a, std::_Deque_iterator, unsigned long long>(std::_Deque_iterator, std::_Deque_iterator, std::_Deque_iterator, std::allocator) +1b4e4 11 252 79 +1b4f5 69 254 79 +1b55e 10 679 62 +1b56e 64 680 62 +1b5d2 e8 681 62 +1b6ba c 143 75 +1b6c6 14 144 75 +1b6da 6 144 75 +FUNC 1b6e0 4d 0 __eprintf +1b6e0 6 1826 80 +1b6e6 3 1832 80 +1b6e9 c 1826 80 +1b6f5 29 1832 80 +1b71e a 1837 80 +1b728 5 1838 80 +1b72d e8d3 1838 80 diff --git a/src/client/mac/handler/ucontext_compat.h b/src/client/mac/handler/ucontext_compat.h new file mode 100644 index 0000000..853b1ca --- /dev/null +++ b/src/client/mac/handler/ucontext_compat.h @@ -0,0 +1,46 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_MAC_HANDLER_UCONTEXT_COMPAT_H_ +#define CLIENT_MAC_HANDLER_UCONTEXT_COMPAT_H_ + +#include + +// The purpose of this file is to work around the fact that ucontext_t's +// uc_mcontext member is an mcontext_t rather than an mcontext64_t on ARM64. +#if defined(__aarch64__) +// doesn't include the below file. +#include +typedef ucontext64_t breakpad_ucontext_t; +#define breakpad_uc_mcontext uc_mcontext64 +#else +typedef ucontext_t breakpad_ucontext_t; +#define breakpad_uc_mcontext uc_mcontext +#endif // defined(__aarch64__) + +#endif // CLIENT_MAC_HANDLER_UCONTEXT_COMPAT_H_ diff --git a/src/client/mac/sender/Breakpad.xib b/src/client/mac/sender/Breakpad.xib new file mode 100644 index 0000000..885e39e --- /dev/null +++ b/src/client/mac/sender/Breakpad.xib @@ -0,0 +1,1140 @@ + + + + 1070 + 10F569 + 762 + 1038.29 + 461.00 + + YES + + YES + + + YES + + + + YES + + + + YES + + + YES + + + + YES + + Reporter + + + FirstResponder + + + NSApplication + + + 1 + 2 + {{72, 251}, {490, 489}} + 536871936 + + NSWindow + + {1.79769e+308, 1.79769e+308} + {72, 5} + + + 264 + + YES + + + 272 + + YES + + + 256 + + YES + + + 290 + {{17, 36}, {456, 70}} + + YES + + 67239424 + 272760832 + Providing your email address is optional and will allow us contact you in case we need more details. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed arcu urna, pulvinar sit amet, tincidunt ac, fermentum ut, ligula. Quisque mi. Duis lectus. Vestibulum velit. Morbi turpis. Nunc at diam consectetur turpis volutpat tristique. Donec quis diam. Suspendisse scelerisque. + + LucidaGrande + 11 + 3100 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 290 + {{87, 9}, {195, 19}} + + YES + + -1804468671 + 272761856 + + + optional + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + + + + 292 + {{17, 11}, {65, 14}} + + YES + + 68288064 + 71435264 + EmailLabel: + + + + + + + + + 289 + {{456, 10}, {16, 17}} + + YES + + -2080244224 + 0 + Privacy Policy + + LucidaGrande + 13 + 1044 + + + -2040250113 + 36 + + NSImage + goArrow + + + + 400 + 75 + + + + + 289 + {{355, 11}, {100, 14}} + + YES + + 68288064 + 4326400 + PrivacyPolicyLabel + + + + + + + + {490, 114} + + + + {{0, 51}, {490, 114}} + + {0, 0} + + 67239424 + 0 + Title + + LucidaGrande + 11 + 16 + + + + 3 + MCAwLjgwMDAwMDAxAA + + + + 0 + 3 + 0 + NO + + + + 289 + {{330, 12}, {146, 32}} + + YES + + 67239424 + 134217728 + SendReportLabel + + + -2038284033 + 129 + + + DQ + 200 + 25 + + + + + 289 + {{214, 12}, {116, 32}} + + YES + + 67239424 + 134217728 + CancelLabel + + + -2038284033 + 129 + + + Gw + 200 + 25 + + + + + 256 + + YES + + + 256 + + YES + + + 266 + {{17, 83}, {456, 154}} + + YES + + 67239424 + 272760832 + VGhlIHN5c3RlbSBhbmQgb3RoZXIgYXBwbGljYXRpb25zIGhhdmUgbm90IGJlZW4gYWZmZWN0ZWQuIEEg +cmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgdGhhdCB5b3UgY2FuIHNlbmQgdG8gPFJlYWxseSBMb25nIENv +bXBhbnkgTmFtZT4gdG8gaGVscCBpZGVudGlmeSB0aGUgcHJvYmxlbS4gTG9yZW0gaXBzdW0gZG9sb3Ig +c2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gU2VkIGFyY3UgdXJuYSwgcHVsdmlu +YXIgc2l0IGFtZXQsIHRpbmNpZHVudCBhYywgZmVybWVudHVtIHV0LCBsaWd1bGEuIFF1aXNxdWUgbWku +IER1aXMgbGVjdHVzLiBWZXN0aWJ1bHVtIHZlbGl0LiBNb3JiaSB0dXJwaXMuIE51bmMgYXQgZGlhbSBj +b25zZWN0ZXR1ciB0dXJwaXMgdm9sdXRwYXQgdHJpc3RpcXVlLiBEb25lYyBxdWlzIGRpYW0uIFN1c3Bl +bmRpc3NlIHNjZWxlcmlzcXVlLiBRdWlzcXVlIHB1bHZpbmFyIG1pIGlkIHB1cnVzLiBFdGlhbSB2aXRh +ZSB0dXJwaXMgdml0YWUgbmVxdWUgcG9ydGEgY29uZ3VlLgoKUGxlYXNlIGhlbHAgdXMgZml4IHRoZSBw +cm9ibGVtIGJ5IGRlc2NyaWJpbmcgd2hhdCBoYXBwZW5lZCBiZWZvcmUgdGhlIGNyYXNoLiBMb3JlbSBp +cHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBTZWQgYXJjdSB1 +cm5hLCBwdWx2aW5hciBzaXQgYW1ldCwgdGluY2lkdW50IGFjLCBmZXJtZW50dW0gdXQsIGxpZ3VsYS4g +UXVpc3F1ZSBtaS4gRHVpcyBsZWN0dXMuA + + + + + + + + + 274 + {{20, 14}, {450, 61}} + + YES + + 341966337 + 272760832 + Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 + + + YES + + + + + + + 256 + + YES + + + 256 + + YES + + + 266 + {{85, 10}, {381, 54}} + + YES + + 67239424 + 272629760 + The application <Really Long App Name Here> has quit unexpectedly. + + LucidaGrande-Bold + 14 + 16 + + + + + + + + + 268 + + YES + + YES + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + + {{16, 0}, {64, 64}} + + YES + + 130560 + 33554432 + + NSImage + NSApplicationIcon + + 0 + 0 + 0 + NO + + YES + + + {482, 70} + + + + {{4, 245}, {482, 70}} + + {0, 0} + + 67239424 + 0 + Title + + + + 3 + MCAwLjgwMDAwMDAxAA + + + + 0 + 3 + 0 + NO + + + {490, 325} + + + + {{0, 160}, {490, 325}} + + {0, 0} + + 67239424 + 0 + Title + + + + 3 + MCAwLjgwMDAwMDAxAA + + + + 0 + 3 + 0 + NO + + + + 268 + {{17, 20}, {163, 14}} + + YES + + 68288064 + 272630784 + xx seconds. + + + + + + + + {490, 489} + + {{0, 0}, {2560, 1578}} + {72, 27} + {1.79769e+308, 1.79769e+308} + + + YES + + + + + YES + + + sendReport: + + + + 45 + + + + cancel: + + + + 46 + + + + showPrivacyPolicy: + + + + 53 + + + + value: emailValue + + + + + + value: emailValue + value + emailValue + + NSNullPlaceholder + optional + + 2 + + + 90 + + + + initialFirstResponder + + + + 91 + + + + value: commentsValue + + + + + + value: commentsValue + value + commentsValue + + NSNullPlaceholder + optional comments + + 2 + + + 124 + + + + nextKeyView + + + + 125 + + + + nextKeyView + + + + 126 + + + + nextKeyView + + + + 127 + + + + delegate + + + + 128 + + + + alertWindow_ + + + + 142 + + + + preEmailBox_ + + + + 150 + + + + headerBox_ + + + + 151 + + + + emailSectionBox_ + + + + 152 + + + + privacyLinkLabel_ + + + + 153 + + + + commentMessage_ + + + + 154 + + + + dialogTitle_ + + + + 155 + + + + emailLabel_ + + + + 156 + + + + cancelButton_ + + + + 158 + + + + sendButton_ + + + + 159 + + + + emailEntryField_ + + + + 161 + + + + privacyLinkArrow_ + + + + 162 + + + + emailMessage_ + + + + 163 + + + + commentsEntryField_ + + + + 176 + + + + value: countdownMessage + + + + + + value: countdownMessage + value + countdownMessage + 2 + + + 194 + + + + countdownLabel_ + + + + 208 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + YES + + + + Window + + + 2 + + + YES + + + + + + + + + + 12 + + + YES + + + + + + 14 + + + YES + + + + + + 132 + + + YES + + + + + + + + + + 145 + + + YES + + + + + + + + 189 + + + YES + + + + + + 191 + + + Shared User Defaults Controller + + + 210 + + + + + 211 + + + + + 221 + + + + + 58 + + + YES + + + + + + 215 + + + + + 18 + + + YES + + + + + + 212 + + + + + 20 + + + YES + + + + + + 213 + + + + + 48 + + + YES + + + + + + 214 + + + + + 66 + + + YES + + + + + + 216 + + + + + 8 + + + YES + + + + + + 217 + + + + + 116 + + + YES + + + + + + 218 + + + + + 147 + + + YES + + + + + + + 3 + + + YES + + + + + + 219 + + + + + 6 + + + YES + + + + + + 220 + + + + + + + YES + + YES + -3.ImportedFromIB2 + 1.IBEditorWindowLastContentRect + 1.IBWindowTemplateEditedContentRect + 1.ImportedFromIB2 + 1.windowTemplate.hasMinSize + 1.windowTemplate.minSize + 116.CustomClassName + 116.ImportedFromIB2 + 12.ImportedFromIB2 + 132.ImportedFromIB2 + 14.ImportedFromIB2 + 145.ImportedFromIB2 + 147.ImportedFromIB2 + 18.CustomClassName + 18.ImportedFromIB2 + 189.ImportedFromIB2 + 191.ImportedFromIB2 + 2.ImportedFromIB2 + 20.ImportedFromIB2 + 3.ImportedFromIB2 + 48.ImportedFromIB2 + 58.ImportedFromIB2 + 6.ImportedFromIB2 + 66.ImportedFromIB2 + 8.ImportedFromIB2 + + + YES + + {{0, 656}, {490, 489}} + {{0, 656}, {490, 489}} + + + {72, 5} + LengthLimitingTextField + + + + + + + LengthLimitingTextField + + + + + + + + + + + + + + + YES + + + YES + + + + + YES + + + YES + + + + 221 + + + + YES + + LengthLimitingTextField + NSTextField + + IBUserSource + + + + + Reporter + NSObject + + YES + + YES + cancel: + sendReport: + showPrivacyPolicy: + + + YES + id + id + id + + + + YES + + YES + alertWindow_ + cancelButton_ + commentMessage_ + commentsEntryField_ + countdownLabel_ + dialogTitle_ + emailEntryField_ + emailLabel_ + emailMessage_ + emailSectionBox_ + headerBox_ + preEmailBox_ + privacyLinkArrow_ + privacyLinkLabel_ + sendButton_ + + + YES + NSWindow + NSButton + NSTextField + LengthLimitingTextField + NSTextField + NSTextField + LengthLimitingTextField + NSTextField + NSTextField + NSBox + NSBox + NSBox + NSView + NSTextField + NSButton + + + + IBUserSource + + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../Breakpad.xcodeproj + 3 + + YES + + YES + NSApplicationIcon + goArrow + + + YES + {128, 128} + {128, 128} + + + + diff --git a/src/client/mac/sender/English.lproj/InfoPlist.strings b/src/client/mac/sender/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..65d161818a12f785bc58a885664ac859f1e755ff GIT binary patch literal 156 zcmezWPl>^q!HvO*p_CzyA%!7_A(g?8A(0^$NGmZYFxUbyNJSA)te7DK$O{6>6fooi gMM{9IBA~1_0~c5gswplEnLr%{Kob)gD#-EPxB5QXQOr&vYwrWcLivIvP%kdUBIwe$g;#z`Z^afzLVygcxonK*Xa)D;qU z$a1v1o}Y8(Z}a=t&<-uxrPa2ynJsK;75j;m?2}!w%YF5glNyN$@3m#VE|E{1Px#Gv zuaV5qxM6*0LwjL^&e;bvGn*qnwNF^hZ0xoNNWbMB*mpE@R+-)M%pZ9=uy=gDaUaQk z*b0f7lNC5}`-x7Dznb4M+8aB<=9?ZAXJDNo^U!~VZsm3gN3+15c-D?jaoLYhkrTQ* zXR&aNWFvODM=B#y6V?sJBjitbmz>=qy>vDWzgACiRlI^(ava(vaF(!F2(tF@>MvHCkqV^8#wM#Y~5S>_((}Jif)|EYs*STk1`Be|L z)w1G56JbV&Jyj{Ha@CRQsv@JBB_m$VlVoe}3e~G>TfHp|k!e+VOdEM^>ad+84TAx4 z1==%EK1Qx8x#Qb-=QBD(z1r%juEsp7vdUSl-QFB2O(xBzHS1s;F;;adUYU1o+i~I+ zeHZasV>3Cc;8l3t>P#__zK~bDO5T?dWk7y%;#9JJI3G(Qr=Are;g$dUIc?@$%lU6@ zh6SN(ZG6F-@-*+v%8$Ej9CI2|R?}lf9>if|`?SvQNhCXWp1M&sTPyP1OtA}mHgoYk zS*dx%y`9*XNW{GB$~JgnDk`3H+pm8LR!yMb7A!RB8oT?ozS-v|ICuG6*#$9ZvEDfT zTRY}v98za`j_8k)X9~icUF35J>uw|!gSZWKr^!y?xe(r_j&ujsRE#QkvF#ACi25B9 zQ&qwWyQ-WP)d4!mBi>5JjTGIsAfxKywhtxuoVUxZ)(T%4KKuOjdFx|$<~~#v>gGOn X#XZSBfBL_&pIz76bL_hQp7! + + + + ActiveLayerIndex + 0 + ApplicationVersion + + com.omnigroup.OmniGrafflePro + 137.6.0.106738 + + AutoAdjust + + BackgroundGraphic + + Bounds + {{0, 0}, {512, 512}} + Class + SolidGraphic + FontInfo + + Font + CalisMTBol + Size + 112 + + ID + 2 + Style + + fill + + Color + + a + 0 + b + 0 + g + 0.852018 + r + 0.998962 + + + shadow + + Draws + NO + + stroke + + Draws + NO + + + + CanvasOrigin + {0, 0} + CanvasSize + {512, 512} + ColumnAlign + 1 + ColumnSpacing + 36 + CreationDate + 2008-11-14 16:58:15 -0700 + Creator + John P. Developer + DisplayScale + 1 pt = 1 px + FileType + flat + GraphDocumentVersion + 6 + GraphicsList + + + Bounds + {{33.9443, 35.3885}, {444.111, 437.112}} + Class + ShapedGraphic + FontInfo + + Font + CalisMTBol + Size + 112 + + ID + 31 + Rotation + 270 + Shape + Bezier + ShapeData + + UnitPoints + + {-0.5, -0.439247} + {-0.5, -0.485429} + {-0.446294, -0.512626} + {-0.409932, -0.494153} + {-0.373569, -0.47568} + {0.436363, -0.0733799} + {0.472729, -0.0549059} + {0.50909, -0.0364333} + {0.509091, 0.0364345} + {0.472729, 0.0549059} + {0.436368, 0.0733802} + {-0.373569, 0.475681} + {-0.409932, 0.494153} + {-0.446294, 0.512626} + {-0.500001, 0.485429} + {-0.5, 0.439247} + {-0.49998, 0.393072} + {-0.500002, -0.393066} + + + Style + + fill + + Color + + b + 0 + g + 0.770962 + r + 0.997971 + + Draws + NO + FillType + 3 + GradientCenter + {-0.609524, 0} + GradientColor + + b + 0 + g + 0.911574 + r + 0.998779 + + MiddleFraction + 0.6111111044883728 + + shadow + + Color + + a + 0.43 + b + 0 + g + 0 + r + 0 + + Draws + NO + Fuzziness + 7.2213706970214844 + ShadowVector + {0, 6} + + stroke + + Color + + b + 0 + g + 0.766903 + r + 0.997925 + + Width + 7 + + + Text + + Pad + 0 + VerticalPad + 0 + + TextPlacement + 0 + TextRelativeArea + {{0.06, 0.17}, {0.88, 0.5}} + TextRotation + 90 + Wrap + NO + + + Bounds + {{3.89085, 67.8908}, {404.218, 332}} + Class + ShapedGraphic + FontInfo + + Font + CalisMTBol + Size + 112 + + ID + 30 + Rotation + 270 + Shape + Bezier + ShapeData + + UnitPoints + + {-0.5, -0.5} + {-0.459695, -0.475464} + {0.429465, 0.0537758} + {0.469773, 0.0783133} + {0.510074, 0.102849} + {0.510077, 0.198357} + {0.469773, 0.222892} + {0.429473, 0.247428} + {-0.00521517, 0.499998} + {-0.00521785, 0.5} + {-0.00521713, -0.113381} + {-0.44962, -0.458615} + + + Style + + fill + + Color + + a + 0 + b + 1 + g + 1 + r + 1 + + FillType + 2 + GradientAngle + 180 + GradientCenter + {-0.609524, 0} + GradientColor + + a + 0.5 + w + 1 + + MiddleFraction + 0.6111111044883728 + + shadow + + Color + + a + 0.51 + b + 0 + g + 0 + r + 0 + + Draws + NO + Fuzziness + 3.3371961116790771 + ShadowVector + {0, 2} + + stroke + + Color + + b + 0 + g + 0.766903 + r + 0.997925 + + Draws + NO + Width + 2 + + + Text + + Pad + 0 + VerticalPad + 0 + + TextPlacement + 0 + TextRelativeArea + {{0.06, 0.17}, {0.88, 0.5}} + TextRotation + 90 + Wrap + NO + + + Bounds + {{33.9443, 35.3886}, {444.112, 437.111}} + Class + ShapedGraphic + FontInfo + + Font + CalisMTBol + Size + 112 + + ID + 29 + Rotation + 270 + Shape + Bezier + ShapeData + + UnitPoints + + {-0.5, -0.439247} + {-0.500001, -0.485429} + {-0.446295, -0.512626} + {-0.409932, -0.494153} + {-0.373568, -0.475681} + {0.436363, -0.0733802} + {0.472729, -0.0549062} + {0.509089, -0.0364334} + {0.509092, 0.0364341} + {0.472729, 0.0549056} + {0.436369, 0.0733803} + {-0.373568, 0.475681} + {-0.409932, 0.494153} + {-0.446294, 0.512626} + {-0.500001, 0.485428} + {-0.5, 0.439248} + {-0.499978, 0.39307} + {-0.500003, -0.393066} + + + Style + + fill + + Color + + a + 0.2 + b + 1 + g + 1 + r + 1 + + FillType + 2 + GradientAngle + 90 + GradientCenter + {-0.609524, 0} + GradientColor + + a + 0 + w + 1 + + MiddleFraction + 0.6111111044883728 + + shadow + + Color + + a + 0.51 + b + 0 + g + 0 + r + 0 + + Draws + NO + Fuzziness + 3.3371961116790771 + ShadowVector + {0, 2} + + stroke + + Color + + b + 0 + g + 0.766903 + r + 0.997925 + + Draws + NO + Width + 2 + + + Text + + Pad + 0 + VerticalPad + 0 + + TextPlacement + 0 + TextRelativeArea + {{0.06, 0.17}, {0.88, 0.5}} + TextRotation + 90 + Wrap + NO + + + Bounds + {{176, 102.384}, {158.841, 537.616}} + Class + ShapedGraphic + FontInfo + + Font + CalisMTBol + Size + 425 + + ID + 26 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + Text + {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350 +{\fonttbl\f0\fnil\fcharset0 CalistoMT;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\b\fs850 \cf1 !} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{176, 104}, {158.841, 537.616}} + Class + ShapedGraphic + FontInfo + + Color + + b + 0 + g + 0.749523 + r + 0.997726 + + Font + CalisMTBol + Size + 425 + + ID + 27 + Shape + Rectangle + Style + + fill + + Draws + NO + + shadow + + Draws + NO + + stroke + + Draws + NO + + + Text + + Pad + 0 + RTFD + + BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0 + ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp + bmcBlIQBKwEhhoQCaUkBAZKEhIQMTlNEaWN0aW9uYXJ5 + AJSEAWkEkoSWlhBOU1BhcmFncmFwaFN0eWxlhpKEhIQQ + TlNQYXJhZ3JhcGhTdHlsZQCUhARDQ0BTAgCEhIQHTlNB + cnJheQCUmQyShISECU5TVGV4dFRhYgCUhAJDZgAchpKE + n54AOIaShJ+eAFSGkoSfngBwhpKEn54AgYwAhpKEn54A + gagAhpKEn54AgcQAhpKEn54AgeAAhpKEn54AgfwAhpKE + n54AgRgBhpKEn54AgTQBhpKEn54AgVABhoYAhpKElpYG + TlNGb250hpKEhIQGTlNGb250HpSZIIQFWzMyY10GAAAA + FgAAAP/+QwBhAGwAaQBzAE0AVABCAG8AbAAAAIQBZoGp + AYQBYwCiAaIAogCGkoSWlg1OU1N0cm9rZVdpZHRohpKE + hIQITlNOdW1iZXIAhIQHTlNWYWx1ZQCUhAEqhIQBZKYD + hpKElpYHTlNDb2xvcoaShISEB05TQ29sb3IAlKIChARm + ZmZmAYN4dz8/AAGGhoY= + + Text + {\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350 +{\fonttbl\f0\fnil\fcharset0 CalistoMT;} +{\colortbl;\red255\green255\blue255;\red254\green191\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural + +\f0\b\fs850 \cf2 \outl\strokewidth60 \strokec2 !} + VerticalPad + 0 + + Wrap + NO + + + Bounds + {{33.9441, 35.3884}, {444.112, 437.111}} + Class + ShapedGraphic + FontInfo + + Font + CalisMTBol + Size + 112 + + ID + 16 + Rotation + 270 + Shape + Bezier + ShapeData + + UnitPoints + + {-0.5, -0.439247} + {-0.5, -0.485429} + {-0.446295, -0.512626} + {-0.409933, -0.494153} + {-0.373569, -0.47568} + {0.436363, -0.073379} + {0.472729, -0.0549049} + {0.50909, -0.0364324} + {0.509091, 0.0364344} + {0.472729, 0.0549058} + {0.436368, 0.0733801} + {-0.373569, 0.47568} + {-0.409933, 0.494153} + {-0.446295, 0.512626} + {-0.500001, 0.485429} + {-0.5, 0.439247} + {-0.49998, 0.393072} + {-0.500002, -0.393066} + + + Style + + fill + + Color + + b + 0 + g + 0.770962 + r + 0.997971 + + FillType + 3 + GradientCenter + {-0.609524, 0} + GradientColor + + b + 0 + g + 0.911574 + r + 0.998779 + + MiddleFraction + 0.6111111044883728 + + shadow + + Color + + a + 0.9 + b + 0 + g + 0 + r + 0 + + Fuzziness + 8.0632610321044922 + ShadowVector + {0, 9} + + stroke + + Color + + b + 0 + g + 0.766903 + r + 0.997925 + + Draws + NO + Width + 2 + + + Text + + Pad + 0 + VerticalPad + 0 + + TextPlacement + 0 + TextRelativeArea + {{0.06, 0.17}, {0.88, 0.5}} + TextRotation + 90 + Wrap + NO + + + GridInfo + + GridSpacing + 4 + ShowsGrid + YES + SnapsToGrid + YES + + GuidesLocked + NO + GuidesVisible + YES + HPages + 1 + ImageCounter + 2 + KeepToScale + + Layers + + + Lock + NO + Name + Layer 1 + Print + YES + View + YES + + + LayoutInfo + + Animate + NO + circoMinDist + 18 + circoSeparation + 0.0 + layoutEngine + dot + neatoSeparation + 0.0 + twopiSeparation + 0.0 + + LinksVisible + NO + MagnetsVisible + NO + MasterSheets + + ModificationDate + 2008-11-17 11:41:28 -0700 + Modifier + Preston Jackson + NotesVisible + NO + Orientation + 2 + OriginVisible + NO + PageBreaks + YES + PrintInfo + + NSBottomMargin + + float + 41 + + NSLeftMargin + + float + 18 + + NSPaperSize + + size + {612, 792} + + NSRightMargin + + float + 18 + + NSTopMargin + + float + 18 + + + PrintOnePage + + QuickLookPreview + + JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmls + dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGVlktvJEUQhO/9K5IbHFyuR9brioEV + nFh5JM5o5MWsPIA9IP4+X2b12gPrBbHWSt3lzkdFREb6Ud7Ko0R+asr+/+lOfpBfJIYW + /Z/8LNc35yTHsyROh/ZYxyTgfJTrN/zip7NcxVD3r1+e9oQbCd/J9fd3T8e7337/48cH + eSLjm3O2wEfR2ry8tiJ5hDJSVEk9pF7jkONJrr89JfnqV/p8uz1KK1YpJynNHlKVk2gJ + JZWqdqZz9iklBc21ZmkxlJoin0/vsEonTo6b9lC79iQzh6azSc7FYjINZWIkk4MCKtrG + ejhyRpZeRYcSNIbk7oXmtk5m4mRaD/NvYcOK1bKnpnkuu4qt6jqEVujLmtuOvFgdrXv7 + mcjWQxut71ds5LcbAIADIcTkDgpt4TKmyigWoXNzVAYtfYzdUe5fOT25ACxMtZAQiPeX + xEVTSCkNeaBLDbXWDhwfnxH1QHJX0sfiulDDhhpMgMnUJZAGDLkCea3T6b+9T3K+N/pf + F6qL8+ZW0hYDjM4ESlFubyTlAFd/kvfwRKilj3IFRdTQHJsk6EwzW5UvDwBY1xf2cNVL + SDWiyTa2AyL8JgXr8fBOPv/sCzm8l68PNERtwm0wGIb4yTrK2LiYt3+rI5+uY1df7JW8 + CD9tS/XNGUdxFSUs1e+yiQPuXPUMyVI9lL2qeh2bq16Rjet+qRdVLcWrceySz8+S30+A + zyTPTNiYWMQSe10Z64vY+/OoudZNus9dudwRqE+rVVty97v63bZd7iZHL7PkjnfYe5xw + vvTOAJtW5+gMv3vFB8RetF6yzYQ5x3/L08wKeQZ3t1pin5Fp1GpD0ORKy7AnlLN/kbPS + 2ofZwIlqwA1G35aT5d3JyGncLARwMKZb0Tt2gIAHLOBGpTJExgtaxZ/MjxbK+B8mYdQ0 + 5QuYoSumBgvBBXEsP0n9khlidnI8xrK6LZqBzVm2bFzEhIjMiIwcPyGGeQqjdjrwT7h+ + LYHiADxbwGHg6+Uux+3+4u1/I6yj5DSiaKw0CBBXpRSDluldCFM4zgHvPa9zujJygMR3 + RXlB+JWt1t0PvmNg35PwHxsOE4mw1Weu0cykNci2JJjJhX+sVUm1pt4BgIOOr6HBGsLd + eYUt0uRFYFIEgAl4n6yrBqw6QuzKxtA0wdf4g/OZ2QWMAd4DfUgXOqHaYjtc4/Gjshmh + y/PP/YQ62VDzj4dlZttYGh2ZHAwCzaCeVcoaJty3VGm2b4bnZwuhC2LommlOA9lxF2ub + WDS6QrjdWjcjNZJ3Uzh/OyA6IjK7cIVwj0t8fPwuD05ya6b+F7C1v1cKZW5kc3RyZWFt + CmVuZG9iago1IDAgb2JqCjk4MwplbmRvYmoKMiAwIG9iago8PCAvVHlwZSAvUGFnZSAv + UGFyZW50IDMgMCBSIC9SZXNvdXJjZXMgNiAwIFIgL0NvbnRlbnRzIDQgMCBSIC9NZWRp + YUJveCBbMCAwIDUxMiA1MTJdCj4+CmVuZG9iago2IDAgb2JqCjw8IC9Qcm9jU2V0IFsg + L1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdIC9Db2xvclNwYWNlIDw8 + IC9DczIgMTIgMCBSCi9DczEgNyAwIFIgPj4gL0V4dEdTdGF0ZSA8PCAvR3MxIDE3IDAg + UiAvR3MyIDE4IDAgUiA+PiAvRm9udCA8PCAvRjEuMCAxMSAwIFIKPj4gL1hPYmplY3Qg + PDwgL0ltMiAxMyAwIFIgL0ltMSA4IDAgUiAvSW0zIDE1IDAgUiA+PiAvU2hhZGluZyA8 + PCAvU2gxIDEwIDAgUgo+PiA+PgplbmRvYmoKMTAgMCBvYmoKPDwgL0NvbG9yU3BhY2Ug + NyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIC0yNzEuMzA2MyAwIDAgLTI3MS4z + MDYzIDAgNTQwLjI2NApdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFs + c2UgXSAvRnVuY3Rpb24gMTkgMCBSID4+CmVuZG9iagoxMyAwIG9iago8PCAvTGVuZ3Ro + IDE0IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDI1NiAv + SGVpZ2h0IDI1NiAvQ29sb3JTcGFjZQo3IDAgUiAvU01hc2sgMjAgMCBSIC9CaXRzUGVy + Q29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dABAQAA + CAKg/p+2Bx4QJpBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg + wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM + GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB + AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDDQBg4DBgwYMGDA + wNjAA65NNU0KZW5kc3RyZWFtCmVuZG9iagoxNCAwIG9iago4ODMKZW5kb2JqCjggMCBv + YmoKPDwgL0xlbmd0aCA5IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2Ug + L1dpZHRoIDkxMiAvSGVpZ2h0IDkyNiAvQ29sb3JTcGFjZQoyMiAwIFIgL1NNYXNrIDIz + IDAgUiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0 + cmVhbQp4Ae3QgQAAAADDoPlTH+SFUGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY + MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED + BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA + wMvAAKraAAEKZW5kc3RyZWFtCmVuZG9iago5IDAgb2JqCjExMDcwCmVuZG9iagoxNSAw + IG9iago8PCAvTGVuZ3RoIDE2IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h + Z2UgL1dpZHRoIDI1NiAvSGVpZ2h0IDI1NiAvQ29sb3JTcGFjZQo3IDAgUiAvU01hc2sg + MjUgMCBSIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K + c3RyZWFtCngB7dKBDQAgDMMw/n+6SHBGvA+aeXMKFAucd8XlNiuw8U9BuQD/5e/bzj8D + 5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+ + vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889A + uQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/ + bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQ + LsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv + 284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyU + C/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7 + tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPl + AvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+ + 7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5 + AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79v + O/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1Au + wH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/b + zj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL + 8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2 + 889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC + /Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t + /DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA + /+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287 + /wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7A + f/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vO + PwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvw + X/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu3f/wUgwjJ6CmVu + ZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKMTIxNAplbmRvYmoKMjMgMCBvYmoKPDwgL0xl + bmd0aCAyNCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCA5 + MTIgL0hlaWdodCA5MjYgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21w + b25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHsnYlfTV37/288 + j4xJUVJRGtCEoggliZCxyFQUlUiGNCgJIXOFyFTKlCljmUMlUaZK4XY/N31fv//jd621 + 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 + 5IiRegajjceajhs/cbKF5RRriMrp021nzJg5c6YdPmgByVkAHH/GDFvb6dOnTbWZYmUx + edIEM1OTMYYGo3R1ZNFIdjl6BI4sJGlEwtbHwEGwGzlcR1ffYLTRGIhJs/ETJk6abGFh + YWlpZWU1BR+0gOQsAI5vZWkJMTB50sTx5uMgFoGMo/RGjtCmuhHY2NPRCEEJi1aGkb8P + GjwUQhIoCTFpCEFpYmoKcWlmZm5uPh4ftIDkLACOb25mNm6cqanJ2DHGRqMNRunr6kAw + wkJ1IFmpqiAaCSXZiKSQJCEJmBypq6c/ygDC0tDIyMgYnjH4oAUkZgHi98ZGRoaGo0cb + QCjqQSwOBzIOgZQqKcdRUTSSiKS7kb/++huEJFByyFCtYRCUI3QgLHX19PT0uWcUPmgB + aViAc3lwf13dkSMhEodr01gEMrJo7FndSMOQ9y8MJJmQBDEJQQlRCWFJn+H4oAWkaAHG + /YcN09ICLA5mYpGsU3s4icOLQ94faUhCGR1gEjj5+8CBgwYNGjx48BD5MxQfTbSA/APh + n2QW+JkPJXvJEIhCiMNBA4GKvw8Y0B9iEZapqiUjLyJh3UqyO/36wdr1t/79IS5JYOKD + FpCyBSAKIBZ+I6FIY7Entzf4wdfdn2lQsmH5Kzy/4YMWkKgFiP+TOCSRCFjs0a3G7uKv + m39Ofh0eGAc+aAHpWoAJA3VDsZugxH+MFkALoAXQAmgBtABaAC2AFkALoAXQAmgBtABa + AC2AFkALoAXQAmgBtABaoFct8P/b5umcCmVuZHN0cmVhbQplbmRvYmoKMjQgMCBvYmoK + NDQ4NjUKZW5kb2JqCjIwIDAgb2JqCjw8IC9MZW5ndGggMjEgMCBSIC9UeXBlIC9YT2Jq + ZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjU2IC9IZWlnaHQgMjU2IC9Db2xvclNw + YWNlCi9EZXZpY2VHcmF5IC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVE + ZWNvZGUgPj4Kc3RyZWFtCngB7dCFQQIAAABBsTswEAxsBQWD/XdzkL8b4Vartj8MGDBg + IDnwiwEDBgwkB34wYMCAgeTANwYMGDCQHFhiwIABA8mBBQYMGDCQHPjCgAEDBpIDnxgw + YMCAgeDAHAMGDBhIDswwYMCAgeTABwYMGDCQHHjHgAEDBpIDbxgwYMBAcuAVAwYMGEgO + vGDAgAEDBoIDzxgwYMBAcuAJAwYMGEgOPGLAgAEDyYEHDBgwYCA5MMWAAQMGkgP3GDBg + wEBy4A4DBgwYSA7cYsCAAQMGggM3GDBgwEByYIIBAwYMJAfGGDBgIDpwjQED2YERBgxk + B64wYCA7cIkBA9mBCwyEB84xYCA7MMSAgezAGQYMZAdOMWAgO3CCAQPZgWMMGMgOHGHA + QHbgEAMGsgMHGDCQHdjHQHhgDwMGsgO7GDCQHdjBgIHswDYGDGQHtjBgIDuwiQED2YEN + DBjIDqxjwEB2YIABA9mBNQyEB/4BLgXylgplbmRzdHJlYW0KZW5kb2JqCjIxIDAgb2Jq + CjM2NgplbmRvYmoKMjUgMCBvYmoKPDwgL0xlbmd0aCAyNiAwIFIgL1R5cGUgL1hPYmpl + Y3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyNTYgL0hlaWdodCAyNTYgL0NvbG9yU3Bh + Y2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURl + Y29kZSA+PgpzdHJlYW0KeAHt3Qs/k2EYB+A5j2HOZpjz+TxzNkQSSSJJJJEkkkgStq/e + B+n6CPtte9/nuQ//K51KPT483N//vbv7c3v7++bm1/X11dXPy8sfFxffz8/Pzr6dnn49 + OflyfPz56Ojw8NPBwcf9/Q97e7u773d23m1vv93aerO5ubHxen391dray9XVFysry8vP + l5aeLS4+XViYn38yNzc7OzOTTCanp6empiYnJyYmxsfHxsZGR0dGEonE8HA8Hh8aGhwc + HBjo7+/v6+vt7e3p6e7u6urq7Ozo6Ghvb2tra21taWlpbm5qampsbGiIxWL19XV1dbW1 + 0Wi0piYSiVRXV1VVVVZWVJSXl5eVlZaWlpSEw+Hi4qKiosLCUChUUJCfHwwG8/Jyc3Nz + crKzs7OyMjMzMzICgbTP7/v3+/f/9/zz/Pf+8/53/nH+c/51/nf/cf9z/3X/V/9Q/1H/ + Uv9T/1T/Vf9W/9f/0P/R/9L/0//U/9X/1v83/2D+w/yL+R/zT+a/zL+Z/zP/aP7T/Kv5 + X/PP5r/Nv5v/t/9g/8P+i/0f+0/2v+y/2f+z/2j/0/6r/V/7z/a/7b/b/5d/IP9B/oX8 + D/kn8l/k38j/kX8k/0n+lfwv+Wfy3+Tfyf+Tfyj/Uf6l/E/5p/Jf5d/K/5V/LP9Z/rX8 + b/nn8t/l38v/5x/wH/gX/A/+Cf+Ff8P/4R/xn/hX/C/+Gf+Nf8f/4x/yH/mX/E/+Kf+V + f8v/5R/zn/nX/G/+Of89IxBIp1L8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8 + d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/ + zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf + +e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47 + /53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/n + vwfSqdTjw3/sv/8DK6twSQplbmRzdHJlYW0KZW5kb2JqCjI2IDAgb2JqCjgxNwplbmRv + YmoKMTcgMCBvYmoKPDwgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMCA+PgplbmRvYmoKMTgg + MCBvYmoKPDwgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PgplbmRvYmoKMjcgMCBvYmoK + PDwgL0xlbmd0aCAyOCAwIFIgL04gMSAvQWx0ZXJuYXRlIC9EZXZpY2VHcmF5IC9GaWx0 + ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AYVST0gUURz+zTYShIhBhXiIdwoJlSms + rKDadnVZlW1bldKiGGffuqOzM9Ob2TXFkwRdojx1D6JjdOzQoZuXosCsS9cgqSAIPHXo + +83s6iiEb3k73/v9/X7fe0RtnabvOylBVHNDlSulp25OTYuDHylFHdROWKYV+OlicYyx + 67mSv7vX1mfS2LLex7V2+/Y9tZVlYCHqLba3EPohkWYAH5mfKGWAs8Adlq/YPgE8WA6s + GvAjogMPmrkw09GcdKWyLZFT5qIoKq9iO0mu+/m5xr6LtYmD/lyPZtaOvbPqqtFM1LT3 + RKG8D65EGc9fVPZsNRSnDeOcSEMaKfKu1d8rTMcRkSsQSgZSNWS5n2pOnXXgdRi7XbqT + 4/j2EKU+yWCoibXpspkdhX0AdirL7BDwBejxsmIP54F7Yf9bUcOTwCdhP2SHedatH/YX + rlPge4Q9NeDOFK7F8dqKH14tAUP3VCNojHNNxNPXOXOkiO8x1BmY90Y5pgsxd5aqEzeA + O2EfWapmCrFd+67qJe57AnfT4zvRmzkLXKAcSXKxFdkU0DwJWBR9i7BJDjw+zh5V4Heo + mMAcuYnczSj3HtURG2ejUoFWeo1Xxk/jufHF+GVsGM+Afqx213t8/+njFXXXtj48+Y16 + 3DmuvZ0bVWFWcWUL3f/HMoSP2Sc5psHToVlYa9h25A+azEywDCjEfwU+l/qSE1Xc1e7t + uEUSzFA+LGwluktUbinU6j2DSqwcK9gAdnCSxCxaHLhTa7o5eHfYInpt+U1XsuuG/vr2 + evva8h5tyqgpKBPNs0RmlLFbo+TdeNv9ZpERnzg6vue9ilrJ/klFED+FOVoq8hRV9FZQ + 1sRvZw5+G7Z+XD+l5/VB/TwJPa2f0a/ooxG+DHRJz8JzUR+jSfCwaSHiEqCKgzPUTlRj + jQPiKfHytFtkkf0PQBn9ZgplbmRzdHJlYW0KZW5kb2JqCjI4IDAgb2JqCjcwNAplbmRv + YmoKMTIgMCBvYmoKWyAvSUNDQmFzZWQgMjcgMCBSIF0KZW5kb2JqCjI5IDAgb2JqCjw8 + IC9MZW5ndGggMzAgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIg + L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Aa2TzWsTQRjGn02QCtZQi0jx4oJSPERdkhbb + W9t8SOwSlySlfhw02d1soslm3d1ErR561H+gFEQQPOjBmxc9tSeR4ieC9OBdUU9a6qGU + 9Z0Zd4Ng8eK7zMxvH555Z+adXSC+UXWcVgxA2/bd0qkZ+ey58/LAOiQcQgJJyFXdc6Y1 + TSXLDrH5gdwU74+xXF9iz7c+fdtz58Li7bXDSw9bO0wK5YRLCwJSkoT9luApxjXBFcbX + fMcnT4Ox3qgaxLeIk26llCF+RJywBD9lXBP8gnFPt9jcdWLFNpo2ENtNPGGYnk48RWwZ + nt4mpjwS2u0O5Y+znEd1x6W58bfER1hdaKS4mgAmv5J+r69dPAE8WQMOaH1tdBkYvgQ8 + m+xrP97wWkkjNa+eTvF00uBBYNdqEHwPgAHyb78Ogq3lINheojU2gJWi3nV73EsblF4B + /3oXZxbZgXd0Bgp+R39nURfuUoAHq0BlEVBpvEvj6E9g301AA+lUpnQ6bKKGJAN7szlV + lVNjynhem+fKf+zarS7dFY9h6gftWvEMjSPUPju+RpsS7PXKuZDrzXwhZKOanQ15oZEp + hlx386WQL1dPswPynKY9Vw7ZafFv//daM5Hf9HKRZ6FRYWfmHrdbmgv5Smc28htmNtqb + 3Sqy/4n7m34h2j+yyEGlR0YKY1AwjjyVfV58kzQDQ4+B+0PKyXR55eNLJvwRvnmd33Wm + 49xwm1bDl6fpjzSTcsHWjyfllKJM4BeDarM/CmVuZHN0cmVhbQplbmRvYmoKMzAgMCBv + YmoKNTY1CmVuZG9iagoyMiAwIG9iagpbIC9JQ0NCYXNlZCAyOSAwIFIgXQplbmRvYmoK + MzEgMCBvYmoKPDwgL0xlbmd0aCAzMiAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VS + R0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhZRNSBRhGMf/s40EsQbR + lwjF0MEkVCYLUgLT9StTtmXVTAlinX13nRxnp5ndLUUihOiYdYwuVkSHiE7hoUOnOkQE + mXWJoKNFEAVeIrb/O5O7Y1S+MDO/eZ7/+3y9wwBVj1KOY0U0YMrOu8nemHZ6dEzb/BpV + qEYUXCnDczoSiQGfqZXP9Wv1LRRpWWqUsdb7NnyrdpkQUDQqd2QDPix5PODjki/knTw1 + ZyQbE6k02SE3uEPJTvIt8tZsiMdDnBaeAVS1U5MzHJdxIjvILUUjK2M+IOt22rTJ76U9 + 7RlT1LDfyDc5C9q48v1A2x5g04uKbcwDHtwDdtdVbPU1wM4RYPFQxfY96c9H2fXKyxxq + 9sMp0Rhr+lAqfa8DNt8Afl4vlX7cLpV+3mEO1vHUMgpu0deyMOUlENQb7Gb85Br9i4Oe + fFULsMA5jmwB+q8ANz8C+x8C2x8DiWpgqBWRy2w3uPLiIucCdOacadfMTuS1Zl0/onXw + aIXWZxtNDVrKsjTf5Wmu8IRbFOkmTFkFztlf23iPCnt4kE/2F7kkvO7frMylU12cJZrY + 1qe06OomN5DvZ8yePnI9r/cZt2c4YOWAme8bCjhyyrbiPBepidTY4/GTZMZXVCcfk/OQ + POcVB2VM334udSJBrqU9OZnrl5pd3Ns+MzHEM5KsWDMTnfHf/MYtJGXefdTcdSz/m2dt + kWcYhQUBEzbvNjQk0YsYGuHARQ4ZekwqTFqlX9BqwsPkX5UWEuVdFhW9WOGeFX/PeRS4 + W8Y/hVgccw3lCJr+Tv+iL+sL+l3983xtob7imXPPmsara18ZV2aW1ci4QY0yvqwpiG+w + 2g56LWRpneIV9OSV9Y3h6jL2fG3Zo8kc4mp8NdSlCGVqxDjjya5l90WyxTfh51vL9q/p + Uft89klNJdeyunhmKfp8NlwNa/+zq2DSsqvw5I2QLjxroe5VD6p9aovaCk09prarbWoX + 346qA+Udw5yViQus22X1KfZgY5reyklXZovg38Ivhv+lXmEL1zQ0+Q9NuLmMaQnfEdw2 + cIeU/8NfswMN3gplbmRzdHJlYW0KZW5kb2JqCjMyIDAgb2JqCjc5MgplbmRvYmoKNyAw + IG9iagpbIC9JQ0NCYXNlZCAzMSAwIFIgXQplbmRvYmoKMTkgMCBvYmoKPDwgL0xlbmd0 + aCAzMyAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAx + MzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRl + ciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBzcLXcQJAEAXByT8vjLDCO4HwIoobfRPA + K7arW4f22V1akT1anX3ae/t85hfWOcAih1jnCIscY50TLHKKdX5jkTMsco51LrDIJda5 + wiLXWOcGQ7cYusPEPYYeMPEHQ4+YeMLQXww9Y+IFQ6+YeMPQO4Y+MPGJoX+Y+MLAf+tF + vN4KZW5kc3RyZWFtCmVuZG9iagozMyAwIG9iagoxMzAKZW5kb2JqCjMgMCBvYmoKPDwg + L1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDUxMiA1MTJdIC9Db3VudCAxIC9LaWRz + IFsgMiAwIFIgXSA+PgplbmRvYmoKMzQgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1Bh + Z2VzIDMgMCBSIC9WZXJzaW9uIC8xLjQgPj4KZW5kb2JqCjM1IDAgb2JqCjw8IC9MZW5n + dGggMzYgMCBSIC9MZW5ndGgxIDUwMzIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry + ZWFtCngB7TiNfxNVtufcOzOZNkDT0pbQAJl0aJWm2QIKlEJpaJKWNkILVDepsCb9kADF + Flo+n9Iqq2L4sK7a1d+u6K6rFaw6bZENRZevxdUVfn6ivLfig4X14z0R9Af7VoHOO5Nq + BZd9f8Gbk3vn3nPOveeej3vu3AACwBBoAw7u2mXhJpBhGmEOU7HWrmpR3tm342NqnwaQ + V9zetGhZ6hcziZ4QABDKFzWsvT0yatrbAEN/RzyvR+rDdWeXqscBhjVQf3KEEMPGCEQf + ZtDHRpa1rJH3Yxf1X6e+3NBYG4Y6SKc+8YC0LLymiT0q3k39Y9RX7ggvqx+59bl11P8H + 9dWmxuYWvQpuB0gaRf3sphX1TWeOuN6jvpfWEyYcEhjPEJCoADgMjNgLILbBGCojeA9k + 6hf0v1L5zCj9s4j2NCT31wDwEmpvi4+/qhJP0OyeAZT+L56rBlyzMzAQDE2Ncu2nHMxQ + AltABAsI8Az1zsJxuA8klGEyJEM+vIAfgQcq4R4shJ8TTwaUwQuwGz7ARfolEPSgfgCW + QidOIv0zoAAWwF44T3x/gp9CGNZAK96j30XWSYQxkAk3kDVXwDo4SRwJkAY2yMQsNo0f + gxE0sgHaYAPsFir0Z/XjNCaBoAKeheegH6sxou/STxEmH6aCD+bDHcT7AIqYJo7R/6Kf + 18/DRFrnQlhE8yyHx2AXmnA4OvEPrIh3wDjSsxGaIAod8Ev4M2bjm7xS3w4uggkwh+a7 + FWpozi3QB2/ANyixGraGvcB28RX8ogDCUfFtyae/ph+hyBXBSmMKaMRtFE+Lad4H4R34 + EP4KX8HXmIaZOAEn4wwsw6WsQTJLP9X30BgzjAaFbJADebTSAigmmEe2uBMehS54BV4l + OABfokJwHcE4vBWfwR48xZKYwg6zd9g3PJ/7+aOCVVgo3Ck+Jp6UcnSPvosslQJ2UGEK + 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 + Q1aLMVmjIaszPu5HsroMcqchq8uQ1WXI6nR3xmWhb/H8YrJVoFuG4qBnwcC7l5kTyT0h + myNYHPfTNId1va2PXcACMNMpMoQ+PoZSMVzomumaSSQP88RJw4zvku9I1vXTHLY+LGAX + 4iQLoZMpaPAHLxmtZmdzc/PKFqpaVkLLSoJm4miOU5zQMsBMwfi/LcjbTgplbmRzdHJl + YW0KZW5kb2JqCjM2IDAgb2JqCjM0NTYKZW5kb2JqCjM3IDAgb2JqCjw8IC9UeXBlIC9G + b250RGVzY3JpcHRvciAvQXNjZW50IDc1MSAvQ2FwSGVpZ2h0IDY5NSAvRGVzY2VudCAt + MzE5IC9GbGFncyAzMgovRm9udEJCb3ggWy0xNzYgLTIyNyAxMDc2IDkxM10gL0ZvbnRO + YW1lIC9EUUJQSVYrQ2FsaXNNVEJvbCAvSXRhbGljQW5nbGUgMAovU3RlbVYgMCAvTGVh + ZGluZyAxMTEgL01heFdpZHRoIDEwOTQgL1hIZWlnaHQgNDcxIC9Gb250RmlsZTIgMzUg + MCBSID4+CmVuZG9iagozOCAwIG9iagpbIDM0NCBdCmVuZG9iagoxMSAwIG9iago8PCAv + VHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9EUUJQSVYrQ2Fs + aXNNVEJvbCAvRm9udERlc2NyaXB0b3IKMzcgMCBSIC9XaWR0aHMgMzggMCBSIC9GaXJz + dENoYXIgMzMgL0xhc3RDaGFyIDMzIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+ + PgplbmRvYmoKMSAwIG9iago8PCAvVGl0bGUgKFVudGl0bGVkKSAvQXV0aG9yIChQcmVz + dG9uIEphY2tzb24pIC9DcmVhdG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwpCi9Q + cm9kdWNlciAoTWFjIE9TIFggMTAuNS41IFF1YXJ0eiBQREZDb250ZXh0KSAvQ3JlYXRp + b25EYXRlIChEOjIwMDgxMTE3MTg0NzE0WjAwJzAwJykKL01vZERhdGUgKEQ6MjAwODEx + MTcxODQ3MTRaMDAnMDAnKSA+PgplbmRvYmoKeHJlZgowIDM5CjAwMDAwMDAwMDAgNjU1 + MzUgZiAKMDAwMDA2OTExNCAwMDAwMCBuIAowMDAwMDAxMDk4IDAwMDAwIG4gCjAwMDAw + NjQ5NjMgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAwMDAxMDc5IDAwMDAw + IG4gCjAwMDAwMDEyMDIgMDAwMDAgbiAKMDAwMDA2NDYxNCAwMDAwMCBuIAowMDAwMDAy + Njk4IDAwMDAwIG4gCjAwMDAwMTM5NDkgMDAwMDAgbiAKMDAwMDAwMTQ1NSAwMDAwMCBu + IAowMDAwMDY4OTM5IDAwMDAwIG4gCjAwMDAwNjI5MzcgMDAwMDAgbiAKMDAwMDAwMTYx + MyAwMDAwMCBuIAowMDAwMDAyNjc4IDAwMDAwIG4gCjAwMDAwMTM5NzAgMDAwMDAgbiAK + MDAwMDAxNTM2NiAwMDAwMCBuIAowMDAwMDYyMDE5IDAwMDAwIG4gCjAwMDAwNjIwNjQg + MDAwMDAgbiAKMDAwMDA2NDY1MCAwMDAwMCBuIAowMDAwMDYwNDQ4IDAwMDAwIG4gCjAw + MDAwNjA5ODggMDAwMDAgbiAKMDAwMDA2MzY2MiAwMDAwMCBuIAowMDAwMDE1Mzg3IDAw + MDAwIG4gCjAwMDAwNjA0MjYgMDAwMDAgbiAKMDAwMDA2MTAwOCAwMDAwMCBuIAowMDAw + MDYxOTk5IDAwMDAwIG4gCjAwMDAwNjIxMDkgMDAwMDAgbiAKMDAwMDA2MjkxNyAwMDAw + MCBuIAowMDAwMDYyOTc0IDAwMDAwIG4gCjAwMDAwNjM2NDIgMDAwMDAgbiAKMDAwMDA2 + MzY5OSAwMDAwMCBuIAowMDAwMDY0NTk0IDAwMDAwIG4gCjAwMDAwNjQ5NDMgMDAwMDAg + biAKMDAwMDA2NTA0NiAwMDAwMCBuIAowMDAwMDY1MTEwIDAwMDAwIG4gCjAwMDAwNjg2 + NTYgMDAwMDAgbiAKMDAwMDA2ODY3NyAwMDAwMCBuIAowMDAwMDY4OTE1IDAwMDAwIG4g + CnRyYWlsZXIKPDwgL1NpemUgMzkgL1Jvb3QgMzQgMCBSIC9JbmZvIDEgMCBSIC9JRCBb + IDw0OWU2MjQzZGUwYzBiMTQ0NmRmMDQzNjRjNzc1ZGNlZj4KPDQ5ZTYyNDNkZTBjMGIx + NDQ2ZGYwNDM2NGM3NzVkY2VmPiBdID4+CnN0YXJ0eHJlZgo2OTMzNgolJUVPRgoxIDAg + b2JqCjw8L0F1dGhvciAoUHJlc3RvbiBKYWNrc29uKS9DcmVhdGlvbkRhdGUgKEQ6MjAw + ODExMTQyMzU4MDBaKS9DcmVhdG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwgNS4x + IHJjIDEpL01vZERhdGUgKEQ6MjAwODExMTcxODQxMDBaKS9Qcm9kdWNlciAoTWFjIE9T + IFggMTAuNS41IFF1YXJ0eiBQREZDb250ZXh0KS9UaXRsZSAoUmVwb3J0ZXJJY29uLmdy + YWZmbGUpPj4KZW5kb2JqCnhyZWYKMSAxCjAwMDAwNzAyNzQgMDAwMDAgbiAKdHJhaWxl + cgo8PC9JRCBbPDQ5ZTYyNDNkZTBjMGIxNDQ2ZGYwNDM2NGM3NzVkY2VmPiA8NDllNjI0 + M2RlMGMwYjE0NDZkZjA0MzY0Yzc3NWRjZWY+XSAvSW5mbyAxIDAgUiAvUHJldiA2OTMz + NiAvUm9vdCAzNCAwIFIgL1NpemUgMzk+PgpzdGFydHhyZWYKNzA0OTgKJSVFT0YK + + QuickLookThumbnail + + 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 + + ReadOnly + NO + RowAlign + 1 + RowSpacing + 36 + SheetTitle + Canvas 1 + SmartAlignmentGuidesActive + NO + SmartDistanceGuidesActive + NO + UniqueID + 1 + UseEntirePage + + VPages + 1 + WindowInfo + + CurrentSheet + 0 + ExpandedCanvases + + + name + Canvas 1 + + + Frame + {{2002, 20}, {1215, 1180}} + ListView + + OutlineWidth + 142 + RightSidebar + + Sidebar + + SidebarWidth + 157 + VisibleRegion + {{-4.5, 0.5}, {522, 535.5}} + Zoom + 2 + ZoomValues + + + Canvas 1 + 2 + 4 + + + + saveQuickLookFiles + YES + + diff --git a/src/client/mac/sender/crash_report_sender-Info.plist b/src/client/mac/sender/crash_report_sender-Info.plist new file mode 100644 index 0000000..976687e --- /dev/null +++ b/src/client/mac/sender/crash_report_sender-Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDisplayName + ${EXECUTABLE_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + crash_report_sender + CFBundleIdentifier + com.Breakpad.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${EXECUTABLE_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSHasLocalizedDisplayName + + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/src/client/mac/sender/crash_report_sender.h b/src/client/mac/sender/crash_report_sender.h new file mode 100644 index 0000000..13379ce --- /dev/null +++ b/src/client/mac/sender/crash_report_sender.h @@ -0,0 +1,116 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// This component uses the HTTPMultipartUpload of the breakpad project to send +// the minidump and associated data to the crash reporting servers. +// It will perform throttling based on the parameters passed to it and will +// prompt the user to send the minidump. + +#import + +#include "client/mac/sender/uploader.h" +#import "GTMDefines.h" + +// We're sublcassing NSTextField in order to override a particular +// method (see the implementation) that lets us reject changes if they +// are longer than a particular length. Bindings would normally solve +// this problem, but when we implemented a validation method, and +// returned NO for strings that were too long, the UI was not updated +// right away, which was a poor user experience. The UI would be +// updated as soon as the text field lost first responder status, +// which isn't soon enough. It is a known bug that the UI KVO didn't +// work in the middle of a validation. +@interface LengthLimitingTextField : NSTextField { + @private + NSUInteger maximumLength_; +} + +- (void)setMaximumLength:(NSUInteger)maxLength; +@end + +@interface Reporter : NSObject { + @public + IBOutlet NSWindow *alertWindow_; // The alert window + + // Grouping boxes used for resizing. + IBOutlet NSBox *headerBox_; + IBOutlet NSBox *preEmailBox_; + IBOutlet NSBox *emailSectionBox_; + // Localized elements (or things that need to be moved during localization). + IBOutlet NSTextField *dialogTitle_; + IBOutlet NSTextField *commentMessage_; + IBOutlet NSTextField *emailMessage_; + IBOutlet NSTextField *emailLabel_; + IBOutlet NSTextField *privacyLinkLabel_; + IBOutlet NSButton *sendButton_; + IBOutlet NSButton *cancelButton_; + IBOutlet LengthLimitingTextField *emailEntryField_; + IBOutlet LengthLimitingTextField *commentsEntryField_; + IBOutlet NSTextField *countdownLabel_; + IBOutlet NSView *privacyLinkArrow_; + + // Text field bindings, for user input. + NSString *commentsValue_; // Comments from the user + NSString *emailValue_; // Email from the user + NSString *countdownMessage_; // Message indicating time + // left for input. + @private + NSTimeInterval remainingDialogTime_; // Keeps track of how long + // we have until we cancel + // the dialog + NSTimer *messageTimer_; // Timer we use to update + // the dialog + Uploader* uploader_; // Uploader we use to send the data. +} + +// Stops the modal panel with an NSAlertDefaultReturn value. This is the action +// invoked by the "Send Report" button. +- (IBAction)sendReport:(id)sender; +// Stops the modal panel with an NSAlertAlternateReturn value. This is the +// action invoked by the "Cancel" button. +- (IBAction)cancel:(id)sender; +// Opens the Privacy Policy url in the default web browser. +- (IBAction)showPrivacyPolicy:(id)sender; + +// Delegate methods for the NSTextField for comments. We want to capture the +// Return key and use it to send the message when no text has been entered. +// Otherwise, we want Return to add a carriage return to the comments field. +- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView + doCommandBySelector:(SEL)commandSelector; + +// Accessors to make bindings work +- (NSString *)commentsValue; +- (void)setCommentsValue:(NSString *)value; + +- (NSString *)emailValue; +- (void)setEmailValue:(NSString *)value; + +- (NSString *)countdownMessage; +- (void)setCountdownMessage:(NSString *)value; + +@end diff --git a/src/client/mac/sender/crash_report_sender.icns b/src/client/mac/sender/crash_report_sender.icns new file mode 100644 index 0000000000000000000000000000000000000000..e8c21242bf84a70a1efb7e005f47684a882eabe1 GIT binary patch literal 170816 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

    TxWm44|qnrr$y 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 +#import +#import +#import +#import + +#import "client/apple/Framework/BreakpadDefines.h" +#import "common/mac/GTMLogger.h" +#import "common/mac/HTTPMultipartUpload.h" + + +#define kLastSubmission @"LastSubmission" +const int kUserCommentsMaxLength = 1500; +const int kEmailMaxLength = 64; + +#define kApplePrefsSyncExcludeAllKey \ + @"com.apple.PreferenceSync.ExcludeAllSyncKeys" + +#pragma mark - + +@interface NSView (ResizabilityExtentions) +// Shifts the view vertically by the given amount. +- (void)breakpad_shiftVertically:(CGFloat)offset; + +// Shifts the view horizontally by the given amount. +- (void)breakpad_shiftHorizontally:(CGFloat)offset; +@end + +@implementation NSView (ResizabilityExtentions) +- (void)breakpad_shiftVertically:(CGFloat)offset { + NSPoint origin = [self frame].origin; + origin.y += offset; + [self setFrameOrigin:origin]; +} + +- (void)breakpad_shiftHorizontally:(CGFloat)offset { + NSPoint origin = [self frame].origin; + origin.x += offset; + [self setFrameOrigin:origin]; +} +@end + +@interface NSWindow (ResizabilityExtentions) +// Adjusts the window height by heightDelta relative to its current height, +// keeping all the content at the same size. +- (void)breakpad_adjustHeight:(CGFloat)heightDelta; +@end + +@implementation NSWindow (ResizabilityExtentions) +- (void)breakpad_adjustHeight:(CGFloat)heightDelta { + [[self contentView] setAutoresizesSubviews:NO]; + + NSRect windowFrame = [self frame]; + windowFrame.size.height += heightDelta; + [self setFrame:windowFrame display:YES]; + // For some reason the content view is resizing, but not adjusting its origin, + // so correct it manually. + [[self contentView] setFrameOrigin:NSMakePoint(0, 0)]; + + [[self contentView] setAutoresizesSubviews:YES]; +} +@end + +@interface NSTextField (ResizabilityExtentions) +// Grows or shrinks the height of the field to the minimum required to show the +// current text, preserving the existing width and origin. +// Returns the change in height. +- (CGFloat)breakpad_adjustHeightToFit; + +// Grows or shrinks the width of the field to the minimum required to show the +// current text, preserving the existing height and origin. +// Returns the change in width. +- (CGFloat)breakpad_adjustWidthToFit; +@end + +@implementation NSTextField (ResizabilityExtentions) +- (CGFloat)breakpad_adjustHeightToFit { + NSRect oldFrame = [self frame]; + // Starting with the 10.5 SDK, height won't grow, so make it huge to start. + NSRect presizeFrame = oldFrame; + presizeFrame.size.height = MAXFLOAT; + // sizeToFit will blow out the width rather than making the field taller, so + // we do it manually. + NSSize newSize = [[self cell] cellSizeForBounds:presizeFrame]; + NSRect newFrame = NSMakeRect(oldFrame.origin.x, oldFrame.origin.y, + NSWidth(oldFrame), newSize.height); + [self setFrame:newFrame]; + + return newSize.height - NSHeight(oldFrame); +} + +- (CGFloat)breakpad_adjustWidthToFit { + NSRect oldFrame = [self frame]; + [self sizeToFit]; + return NSWidth([self frame]) - NSWidth(oldFrame); +} +@end + +@interface NSButton (ResizabilityExtentions) +// Resizes to fit the label using IB-style size-to-fit metrics and enforcing a +// minimum width of 70, while preserving the right edge location. +// Returns the change in width. +- (CGFloat)breakpad_smartSizeToFit; +@end + +@implementation NSButton (ResizabilityExtentions) +- (CGFloat)breakpad_smartSizeToFit { + NSRect oldFrame = [self frame]; + [self sizeToFit]; + NSRect newFrame = [self frame]; + // sizeToFit gives much worse results that IB's Size to Fit option. This is + // the amount of padding IB adds over a sizeToFit, empirically determined. + const float kExtraPaddingAmount = 12; + const float kMinButtonWidth = 70; // The default button size in IB. + newFrame.size.width = NSWidth(newFrame) + kExtraPaddingAmount; + if (NSWidth(newFrame) < kMinButtonWidth) + newFrame.size.width = kMinButtonWidth; + // Preserve the right edge location. + newFrame.origin.x = NSMaxX(oldFrame) - NSWidth(newFrame); + [self setFrame:newFrame]; + return NSWidth(newFrame) - NSWidth(oldFrame); +} +@end + +#pragma mark - + +@interface Reporter(PrivateMethods) +- (id)initWithConfigFile:(const char *)configFile; + +// Returns YES if it has been long enough since the last report that we should +// submit a report for this crash. +- (BOOL)reportIntervalElapsed; + +// Returns YES if we should send the report without asking the user first. +- (BOOL)shouldSubmitSilently; + +// Returns YES if the minidump was generated on demand. +- (BOOL)isOnDemand; + +// Returns YES if we should ask the user to provide comments. +- (BOOL)shouldRequestComments; + +// Returns YES if we should ask the user to provide an email address. +- (BOOL)shouldRequestEmail; + +// Shows UI to the user to ask for permission to send and any extra information +// we've been instructed to request. Returns YES if the user allows the report +// to be sent. +- (BOOL)askUserPermissionToSend; + +// Returns the short description of the crash, suitable for use as a dialog +// title (e.g., "The application Foo has quit unexpectedly"). +- (NSString*)shortDialogMessage; + +// Return explanatory text about the crash and the reporter, suitable for the +// body text of a dialog. +- (NSString*)explanatoryDialogText; + +// Returns the amount of time the UI should be shown before timing out. +- (NSTimeInterval)messageTimeout; + +// Preps the comment-prompting alert window for display: +// * localizes all the elements +// * resizes and adjusts layout as necessary for localization +// * removes the email section if includeEmail is NO +- (void)configureAlertWindowIncludingEmail:(BOOL)includeEmail; + +// Rmevoes the email section of the dialog, adjusting the rest of the window +// as necessary. +- (void)removeEmailPrompt; + +// Run an alert window with the given timeout. Returns +// NSRunStoppedResponse if the timeout is exceeded. A timeout of 0 +// queues the message immediately in the modal run loop. +- (NSInteger)runModalWindow:(NSWindow*)window + withTimeout:(NSTimeInterval)timeout; + +// This method is used to periodically update the UI with how many +// seconds are left in the dialog display. +- (void)updateSecondsLeftInDialogDisplay:(NSTimer*)theTimer; + +// When we receive this notification, it means that the user has +// begun editing the email address or comments field, and we disable +// the timers so that the user has as long as they want to type +// in their comments/email. +- (void)controlTextDidBeginEditing:(NSNotification *)aNotification; + +- (void)report; + +@end + +@implementation Reporter +//============================================================================= +- (id)initWithConfigFile:(const char *)configFile { + if ((self = [super init])) { + remainingDialogTime_ = 0; + uploader_ = [[Uploader alloc] initWithConfigFile:configFile]; + if (!uploader_) { + [self release]; + return nil; + } + } + return self; +} + +//============================================================================= +- (BOOL)askUserPermissionToSend { + // Initialize Cocoa, needed to display the alert + NSApplicationLoad(); + + // Get the timeout value for the notification. + NSTimeInterval timeout = [self messageTimeout]; + + NSInteger buttonPressed = NSAlertAlternateReturn; + // Determine whether we should create a text box for user feedback. + if ([self shouldRequestComments]) { + BOOL didLoadNib = [NSBundle loadNibNamed:@"Breakpad" owner:self]; + if (!didLoadNib) { + return NO; + } + + [self configureAlertWindowIncludingEmail:[self shouldRequestEmail]]; + + buttonPressed = [self runModalWindow:alertWindow_ withTimeout:timeout]; + + // Extract info from the user into the uploader_. + if ([self commentsValue]) { + [[uploader_ parameters] setObject:[self commentsValue] + forKey:@BREAKPAD_COMMENTS]; + } + if ([self emailValue]) { + [[uploader_ parameters] setObject:[self emailValue] + forKey:@BREAKPAD_EMAIL]; + } + } else { + // Create an alert panel to tell the user something happened + NSPanel* alert = + NSGetAlertPanel([self shortDialogMessage], + @"%@", + NSLocalizedString(@"sendReportButton", @""), + NSLocalizedString(@"cancelButton", @""), + nil, + [self explanatoryDialogText]); + + // Pop the alert with an automatic timeout, and wait for the response + buttonPressed = [self runModalWindow:alert withTimeout:timeout]; + + // Release the panel memory + NSReleaseAlertPanel(alert); + } + return buttonPressed == NSAlertDefaultReturn; +} + +- (void)configureAlertWindowIncludingEmail:(BOOL)includeEmail { + // Swap in localized values, making size adjustments to impacted elements as + // we go. Remember that the origin is in the bottom left, so elements above + // "fall" as text areas are shrunk from their overly-large IB sizes. + + // Localize the header. No resizing needed, as it has plenty of room. + [dialogTitle_ setStringValue:[self shortDialogMessage]]; + + // Localize the explanatory text field. + [commentMessage_ setStringValue:[NSString stringWithFormat:@"%@\n\n%@", + [self explanatoryDialogText], + NSLocalizedString(@"commentsMsg", @"")]]; + CGFloat commentHeightDelta = [commentMessage_ breakpad_adjustHeightToFit]; + [headerBox_ breakpad_shiftVertically:commentHeightDelta]; + [alertWindow_ breakpad_adjustHeight:commentHeightDelta]; + + // Either localize the email explanation field or remove the whole email + // section depending on whether or not we are asking for email. + if (includeEmail) { + [emailMessage_ setStringValue:NSLocalizedString(@"emailMsg", @"")]; + CGFloat emailHeightDelta = [emailMessage_ breakpad_adjustHeightToFit]; + [preEmailBox_ breakpad_shiftVertically:emailHeightDelta]; + [alertWindow_ breakpad_adjustHeight:emailHeightDelta]; + } else { + [self removeEmailPrompt]; // Handles necessary resizing. + } + + // Localize the email label, and shift the associated text field. + [emailLabel_ setStringValue:NSLocalizedString(@"emailLabel", @"")]; + CGFloat emailLabelWidthDelta = [emailLabel_ breakpad_adjustWidthToFit]; + [emailEntryField_ breakpad_shiftHorizontally:emailLabelWidthDelta]; + + // Localize the privacy policy label, and keep it right-aligned to the arrow. + [privacyLinkLabel_ setStringValue:NSLocalizedString(@"privacyLabel", @"")]; + CGFloat privacyLabelWidthDelta = + [privacyLinkLabel_ breakpad_adjustWidthToFit]; + [privacyLinkLabel_ breakpad_shiftHorizontally:(-privacyLabelWidthDelta)]; + + // Ensure that the email field and the privacy policy link don't overlap. + CGFloat kMinControlPadding = 8; + CGFloat maxEmailFieldWidth = NSMinX([privacyLinkLabel_ frame]) - + NSMinX([emailEntryField_ frame]) - + kMinControlPadding; + if (NSWidth([emailEntryField_ bounds]) > maxEmailFieldWidth && + maxEmailFieldWidth > 0) { + NSSize emailSize = [emailEntryField_ frame].size; + emailSize.width = maxEmailFieldWidth; + [emailEntryField_ setFrameSize:emailSize]; + } + + // Localize the placeholder text. + [[commentsEntryField_ cell] + setPlaceholderString:NSLocalizedString(@"commentsPlaceholder", @"")]; + [[emailEntryField_ cell] + setPlaceholderString:NSLocalizedString(@"emailPlaceholder", @"")]; + + // Localize the buttons, and keep the cancel button at the right distance. + [sendButton_ setTitle:NSLocalizedString(@"sendReportButton", @"")]; + CGFloat sendButtonWidthDelta = [sendButton_ breakpad_smartSizeToFit]; + [cancelButton_ breakpad_shiftHorizontally:(-sendButtonWidthDelta)]; + [cancelButton_ setTitle:NSLocalizedString(@"cancelButton", @"")]; + [cancelButton_ breakpad_smartSizeToFit]; +} + +- (void)removeEmailPrompt { + [emailSectionBox_ setHidden:YES]; + CGFloat emailSectionHeight = NSHeight([emailSectionBox_ frame]); + [preEmailBox_ breakpad_shiftVertically:(-emailSectionHeight)]; + [alertWindow_ breakpad_adjustHeight:(-emailSectionHeight)]; +} + +- (NSInteger)runModalWindow:(NSWindow*)window + withTimeout:(NSTimeInterval)timeout { + // Queue a |stopModal| message to be performed in |timeout| seconds. + if (timeout > 0.001) { + remainingDialogTime_ = timeout; + SEL updateSelector = @selector(updateSecondsLeftInDialogDisplay:); + messageTimer_ = [NSTimer scheduledTimerWithTimeInterval:1.0 + target:self + selector:updateSelector + userInfo:nil + repeats:YES]; + } + + // Run the window modally and wait for either a |stopModal| message or a + // button click. + [NSApp activateIgnoringOtherApps:YES]; + NSInteger returnMethod = [NSApp runModalForWindow:window]; + + return returnMethod; +} + +- (IBAction)sendReport:(id)sender { + // Force the text fields to end editing so text for the currently focused + // field will be commited. + [alertWindow_ makeFirstResponder:alertWindow_]; + + [alertWindow_ orderOut:self]; + // Use NSAlertDefaultReturn so that the return value of |runModalWithWindow| + // matches the AppKit function NSRunAlertPanel() + [NSApp stopModalWithCode:NSAlertDefaultReturn]; +} + +// UI Button Actions +//============================================================================= +- (IBAction)cancel:(id)sender { + [alertWindow_ orderOut:self]; + // Use NSAlertDefaultReturn so that the return value of |runModalWithWindow| + // matches the AppKit function NSRunAlertPanel() + [NSApp stopModalWithCode:NSAlertAlternateReturn]; +} + +- (IBAction)showPrivacyPolicy:(id)sender { + // Get the localized privacy policy URL and open it in the default browser. + NSURL* privacyPolicyURL = + [NSURL URLWithString:NSLocalizedString(@"privacyPolicyURL", @"")]; + [[NSWorkspace sharedWorkspace] openURL:privacyPolicyURL]; +} + +// Text Field Delegate Methods +//============================================================================= +- (BOOL) control:(NSControl*)control + textView:(NSTextView*)textView +doCommandBySelector:(SEL)commandSelector { + BOOL result = NO; + // If the user has entered text on the comment field, don't end + // editing on "return". + if (control == commentsEntryField_ && + commandSelector == @selector(insertNewline:) + && [[textView string] length] > 0) { + [textView insertNewlineIgnoringFieldEditor:self]; + result = YES; + } + return result; +} + +- (void)controlTextDidBeginEditing:(NSNotification *)aNotification { + [messageTimer_ invalidate]; + [self setCountdownMessage:@""]; +} + +- (void)updateSecondsLeftInDialogDisplay:(NSTimer*)theTimer { + remainingDialogTime_ -= 1; + + NSString *countdownMessage; + NSString *formatString; + + int displayedTimeLeft; // This can be either minutes or seconds. + + if (remainingDialogTime_ > 59) { + // calculate minutes remaining for UI purposes + displayedTimeLeft = (int)(remainingDialogTime_ / 60); + + if (displayedTimeLeft == 1) { + formatString = NSLocalizedString(@"countdownMsgMinuteSingular", @""); + } else { + formatString = NSLocalizedString(@"countdownMsgMinutesPlural", @""); + } + } else { + displayedTimeLeft = (int)remainingDialogTime_; + if (displayedTimeLeft == 1) { + formatString = NSLocalizedString(@"countdownMsgSecondSingular", @""); + } else { + formatString = NSLocalizedString(@"countdownMsgSecondsPlural", @""); + } + } + countdownMessage = [NSString stringWithFormat:formatString, + displayedTimeLeft]; + if (remainingDialogTime_ <= 30) { + [countdownLabel_ setTextColor:[NSColor redColor]]; + } + [self setCountdownMessage:countdownMessage]; + if (remainingDialogTime_ <= 0) { + [messageTimer_ invalidate]; + [NSApp stopModal]; + } +} + + + +#pragma mark Accessors +#pragma mark - +//============================================================================= + +- (NSString *)commentsValue { + return [[commentsValue_ retain] autorelease]; +} + +- (void)setCommentsValue:(NSString *)value { + if (commentsValue_ != value) { + [commentsValue_ release]; + commentsValue_ = [value copy]; + } +} + +- (NSString *)emailValue { + return [[emailValue_ retain] autorelease]; +} + +- (void)setEmailValue:(NSString *)value { + if (emailValue_ != value) { + [emailValue_ release]; + emailValue_ = [value copy]; + } +} + +- (NSString *)countdownMessage { + return [[countdownMessage_ retain] autorelease]; +} + +- (void)setCountdownMessage:(NSString *)value { + if (countdownMessage_ != value) { + [countdownMessage_ release]; + countdownMessage_ = [value copy]; + } +} + +#pragma mark - +//============================================================================= +- (BOOL)reportIntervalElapsed { + float interval = [[[uploader_ parameters] + objectForKey:@BREAKPAD_REPORT_INTERVAL] floatValue]; + NSString *program = [[uploader_ parameters] objectForKey:@BREAKPAD_PRODUCT]; + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + NSMutableDictionary *programDict = + [NSMutableDictionary dictionaryWithDictionary:[ud dictionaryForKey:program]]; + NSNumber *lastTimeNum = [programDict objectForKey:kLastSubmission]; + NSTimeInterval lastTime = lastTimeNum ? [lastTimeNum floatValue] : 0; + NSTimeInterval now = CFAbsoluteTimeGetCurrent(); + NSTimeInterval spanSeconds = (now - lastTime); + + [programDict setObject:[NSNumber numberWithDouble:now] + forKey:kLastSubmission]; + [ud setObject:programDict forKey:program]; + [ud synchronize]; + + // If we've specified an interval and we're within that time, don't ask the + // user if we should report + GTMLoggerDebug(@"Reporter Interval: %f", interval); + if (interval > spanSeconds) { + GTMLoggerDebug(@"Within throttling interval, not sending report"); + return NO; + } + return YES; +} + +- (BOOL)isOnDemand { + return [[[uploader_ parameters] objectForKey:@BREAKPAD_ON_DEMAND] + isEqualToString:@"YES"]; +} + +- (BOOL)shouldSubmitSilently { + return [[[uploader_ parameters] objectForKey:@BREAKPAD_SKIP_CONFIRM] + isEqualToString:@"YES"]; +} + +- (BOOL)shouldRequestComments { + return [[[uploader_ parameters] objectForKey:@BREAKPAD_REQUEST_COMMENTS] + isEqualToString:@"YES"]; +} + +- (BOOL)shouldRequestEmail { + return [[[uploader_ parameters] objectForKey:@BREAKPAD_REQUEST_EMAIL] + isEqualToString:@"YES"]; +} + +- (NSString*)shortDialogMessage { + NSString *displayName = + [[uploader_ parameters] objectForKey:@BREAKPAD_PRODUCT_DISPLAY]; + if (![displayName length]) + displayName = [[uploader_ parameters] objectForKey:@BREAKPAD_PRODUCT]; + + if ([self isOnDemand]) { + // Local variable to pacify clang's -Wformat-extra-args. + NSString* format = NSLocalizedString(@"noCrashDialogHeader", @""); + return [NSString stringWithFormat:format, displayName]; + } else { + // Local variable to pacify clang's -Wformat-extra-args. + NSString* format = NSLocalizedString(@"crashDialogHeader", @""); + return [NSString stringWithFormat:format, displayName]; + } +} + +- (NSString*)explanatoryDialogText { + NSString *displayName = + [[uploader_ parameters] objectForKey:@BREAKPAD_PRODUCT_DISPLAY]; + if (![displayName length]) + displayName = [[uploader_ parameters] objectForKey:@BREAKPAD_PRODUCT]; + + NSString *vendor = [[uploader_ parameters] objectForKey:@BREAKPAD_VENDOR]; + if (![vendor length]) + vendor = @"unknown vendor"; + + if ([self isOnDemand]) { + // Local variable to pacify clang's -Wformat-extra-args. + NSString* format = NSLocalizedString(@"noCrashDialogMsg", @""); + return [NSString stringWithFormat:format, vendor, displayName]; + } else { + // Local variable to pacify clang's -Wformat-extra-args. + NSString* format = NSLocalizedString(@"crashDialogMsg", @""); + return [NSString stringWithFormat:format, vendor]; + } +} + +- (NSTimeInterval)messageTimeout { + // Get the timeout value for the notification. + NSTimeInterval timeout = [[[uploader_ parameters] + objectForKey:@BREAKPAD_CONFIRM_TIMEOUT] floatValue]; + // Require a timeout of at least a minute (except 0, which means no timeout). + if (timeout > 0.001 && timeout < 60.0) { + timeout = 60.0; + } + return timeout; +} + +- (void)report { + [uploader_ report]; +} + +//============================================================================= +- (void)dealloc { + [uploader_ release]; + [super dealloc]; +} + +- (void)awakeFromNib { + [emailEntryField_ setMaximumLength:kEmailMaxLength]; + [commentsEntryField_ setMaximumLength:kUserCommentsMaxLength]; +} + +@end + +//============================================================================= +@implementation LengthLimitingTextField + +- (void)setMaximumLength:(NSUInteger)maxLength { + maximumLength_ = maxLength; +} + +// This is the method we're overriding in NSTextField, which lets us +// limit the user's input if it makes the string too long. +- (BOOL) textView:(NSTextView *)textView +shouldChangeTextInRange:(NSRange)affectedCharRange + replacementString:(NSString *)replacementString { + + // Sometimes the range comes in invalid, so reject if we can't + // figure out if the replacement text is too long. + if (affectedCharRange.location == NSNotFound) { + return NO; + } + // Figure out what the new string length would be, taking into + // account user selections. + NSUInteger newStringLength = + [[textView string] length] - affectedCharRange.length + + [replacementString length]; + if (newStringLength > maximumLength_) { + return NO; + } else { + return YES; + } +} + +// Cut, copy, and paste have to be caught specifically since there is no menu. +- (BOOL)performKeyEquivalent:(NSEvent*)event { + // Only handle the key equivalent if |self| is the text field with focus. + NSText* fieldEditor = [self currentEditor]; + if (fieldEditor != nil) { + // Check for a single "Command" modifier + NSUInteger modifiers = [event modifierFlags]; + modifiers &= NSDeviceIndependentModifierFlagsMask; + if (modifiers == NSCommandKeyMask) { + // Now, check for Select All, Cut, Copy, or Paste key equivalents. + NSString* characters = [event characters]; + // Select All is Command-A. + if ([characters isEqualToString:@"a"]) { + [fieldEditor selectAll:self]; + return YES; + // Cut is Command-X. + } else if ([characters isEqualToString:@"x"]) { + [fieldEditor cut:self]; + return YES; + // Copy is Command-C. + } else if ([characters isEqualToString:@"c"]) { + [fieldEditor copy:self]; + return YES; + // Paste is Command-V. + } else if ([characters isEqualToString:@"v"]) { + [fieldEditor paste:self]; + return YES; + } + } + } + // Let the super class handle the rest (e.g. Command-Period will cancel). + return [super performKeyEquivalent:event]; +} + +@end + +//============================================================================= +int main(int argc, const char *argv[]) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; +#if DEBUG + // Log to stderr in debug builds. + [GTMLogger setSharedLogger:[GTMLogger standardLoggerWithStderr]]; +#endif + GTMLoggerDebug(@"Reporter Launched, argc=%d", argc); + // The expectation is that there will be one argument which is the path + // to the configuration file + if (argc != 2) { + exit(1); + } + + Reporter *reporter = [[Reporter alloc] initWithConfigFile:argv[1]]; + if (!reporter) { + GTMLoggerDebug(@"reporter initialization failed"); + exit(1); + } + + // only submit a report if we have not recently crashed in the past + BOOL shouldSubmitReport = [reporter reportIntervalElapsed]; + BOOL okayToSend = NO; + + // ask user if we should send + if (shouldSubmitReport) { + if ([reporter shouldSubmitSilently]) { + GTMLoggerDebug(@"Skipping confirmation and sending report"); + okayToSend = YES; + } else { + okayToSend = [reporter askUserPermissionToSend]; + } + } + + // If we're running as root, switch over to nobody + if (getuid() == 0 || geteuid() == 0) { + struct passwd *pw = getpwnam("nobody"); + + // If we can't get a non-root uid, don't send the report + if (!pw) { + GTMLoggerDebug(@"!pw - %s", strerror(errno)); + exit(0); + } + + if (setgid(pw->pw_gid) == -1) { + GTMLoggerDebug(@"setgid(pw->pw_gid) == -1 - %s", strerror(errno)); + exit(0); + } + + if (setuid(pw->pw_uid) == -1) { + GTMLoggerDebug(@"setuid(pw->pw_uid) == -1 - %s", strerror(errno)); + exit(0); + } + } + else { + GTMLoggerDebug(@"getuid() !=0 || geteuid() != 0"); + } + + if (okayToSend && shouldSubmitReport) { + GTMLoggerDebug(@"Sending Report"); + [reporter report]; + GTMLoggerDebug(@"Report Sent!"); + } else { + GTMLoggerDebug(@"Not sending crash report okayToSend=%d, "\ + "shouldSubmitReport=%d", okayToSend, shouldSubmitReport); + } + + GTMLoggerDebug(@"Exiting with no errors"); + // Cleanup + [reporter release]; + [pool release]; + return 0; +} diff --git a/src/client/mac/sender/da.lproj/InfoPlist.strings b/src/client/mac/sender/da.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..4cfd32c54b7f216718ef1a97d69bd92a2a92a143 GIT binary patch literal 156 zcmezOpFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml< f14T-JtRkSSH3JtGQ(PD_fjSC+CMGgel4B+SuMryf literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/da.lproj/Localizable.strings b/src/client/mac/sender/da.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..2b8bb969398e68e8cec2fb664b816d9c5761a3d4 GIT binary patch literal 2428 zcmc(h$!-%t5Qgi_Q;aNp$-xmEgOJ!FMS_483-05cc)Z9n8|zvtE&C;$GM$ZVm&KtZC`C+6U%uY+miRhKJzvTtB>pyNR0UmEDh@=@(KH6 zzEeH}BvUk|tk3M+o>;54_YTd}GUO+Ah1JxC!FCJjmwZ~*MPH|~GUplLC9$@>;@hK0 z@s(qvBU|U{Eau}mDy&+KWfR{tG$-i`ghr*qb}=fPJ*%sWjLCI-cFZih%+?W;r8qb_e& zh!RR5YCs>}on8)`)o-rcJ487JxvG5sCcga}oeebyzvk}PWM zs~6MI4Tm{=33{=no1TYgsG2Hm$$1awL?Qp`RLN|R)te?*!QN~apKPf6b?Q;Yz8r_n z@~ZWYavM{$m67Kn-8ehPq1K%*x25TKOC0NcuE%)mB9$^XM_{>RE!}l(VhP`jD97x^ zEGpg=jm!HKtkC#9yWWY4ud?s~&tg2QMRU35>SEu$svFgVve?=&ElqltD6png9%iN1 znozTyE%}eVc7x|QPv7ir0P$C!QPIxsE2RO z>El|T?EPN4nR_=ds2g+3U3vo+RkTwwEy(DCoATW5!qb7*CC>y@bejxV&pB;c6$(O1 zRy$Nlfs8m2(P7!- ohMZC|>K$|HJiW4KVbCO|9OPDti7{!vAp77px(XcPSgwD*yrIM+KmY&$ literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/de.lproj/Localizable.strings b/src/client/mac/sender/de.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..73da36f48b35902943a91752a8f9d5df5f82fa90 GIT binary patch literal 2746 zcmeH}%We}v5JhXvSF|j$$-iP4#WBV5D+-jTK#HKc~g`S5t({r$IdMf?yi*{;B47K`J`29@s zLHk4f7FvBt7Sb5&e&0Iw!di{JLunRPNq%G>Wwo$@+ipqvjaJJJT|3yR>>!1;OI^YC z?5%#UZK*x9g6^iSeJz=}(3D!idipQ*2ASI0viW)giW6ZSN#>#du4|KzQWh7wZnW?L z7CaC1U#$Ghwf`71dka~JvQy96*f9>I`BU+cJMfZuayZoeRG5Puxn8gj+8HZju>zn1 zQ(t?;+RO%TBEm}Yyd?v8IF|-kK%4SNO=FJOyRbVwkxibK9wWFWdWsbahVQXf&!Zo$ z-oTVttDd906oz28k_j$dtz(LHfDco}`d(-wPj=_TSeA$vyeWqJc_XjnX0-Y*g_Rs- zc07;iKSTbNA>WnVx$~KR;hsK$DT(WQ_R3y*A8%$zUkst^;bSdZ4{Oj>rE6WV8crsb zWv=5HCho%G*txOeQx9Qp;r&O?PuxEFVFuxkNST^+4U^)XBw!v>>sHT^f%I>omHCHs zA$!%MSbxY8y_sV>mS&tdM{6xS4SYA|K6X3aK>WCZ*YX9<6xW4tlj}mWfEiEqqTWz@ zbPLfXEh+M;R6Yu27Rxi;$GMXyGmKf-FIl_Q z+c*QM|0hXju5c2R>zSXky3P8~^(G!6(N6qS;N)OpWjmjRk+>@DrZXc~;b86gO7}(ZV?I<`kSjgqvrRja9{VT=K>DP4&wdX%$>q??|VkFIM zkMo(6fy`IWSb@bo&k#tPy3EaU-x)lk`&AW6XYl>3oJu!V@&G}X9YNcAD#dN5}u$in*R~<(byyH|{=uE35 z#TnJC^q$_)Go`vDeglvTx;{=maHW|rShJlBZ}&+jGA)<#2#a$rp7OfQXZ-GZ+UtpX Yf^W>SO_4SwcZsuUXIq?2+09Y@1@J)L6aWAK literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/es.lproj/InfoPlist.strings b/src/client/mac/sender/es.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..a82c013e059dbf7918192662fe2d4030ff6aee37 GIT binary patch literal 184 zcmbu2I|_g>5JX??DMGFxHY%3hVKD}T_`zu5<<&WWoyD;1o0;AF!PC%DbFvUfjPw|@ prpHl9US#E9B1(hYpnaDUlyah`UJ}d7mJ}a1TQxJAQpWZF!wVZxASeI; literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/es.lproj/Localizable.strings b/src/client/mac/sender/es.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..c31d6f48bb2c7e913abc209842492eeb7d2364af GIT binary patch literal 2578 zcmds(%Wl(95Qb;XQ&Fbq zO-YNy3Pp~`?@>=&5k(oj7Yroavfa?sP5r zO#Czb=ej16%%yQIde_GGz(zgZD{1C7m;B7$$ZBp=w>^^db6q2Q>sE4WBo$sJx?j4N z9ov@-XfoLkZy>|tR5mk7F7$RKZTN6=t3)q^wXi+ef3^kDp)_ZbNmyPB1O7@~=vVHu z6>lzz9D%;FFHR3JlNqpNx`PeGp)KiLXhrz7mBkIBbEX{)0n2Y{{6jT+~{0;?UEvYo_9{DZqs{Hc2U2b`6n) zwX}PfdbS8LBe|`XN0PyBp?Re;!wnp@2PYQEa`>thO;^M4lP0dq?OoP~R>A_Cq_e>p zaH{8dZx^#!?pKL~iLF(tJBhXRb7g3gE}q*r#Thk>?xSj*CcB#b+ulHgPsKSNSbsMX9ZYp*L>l28{z8f^`mPoazOm8 zPWofzsl$KnF*Wv7=lIwz{I{nQves`Vyqu`fE#n(GYdtS`np5)Uc5qjahmRkVp0kr!Xoy%{^#4{ZcofVUp*W7iA<$0 nfX)|t@^??eIlC>UL$^+UFq!v{sk+v?UqpRBe-lyPPsH;J4xqw_ literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/fr.lproj/InfoPlist.strings b/src/client/mac/sender/fr.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..4cfd32c54b7f216718ef1a97d69bd92a2a92a143 GIT binary patch literal 156 zcmezOpFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml< f14T-JtRkSSH3JtGQ(PD_fjSC+CMGgel4B+SuMryf literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/fr.lproj/Localizable.strings b/src/client/mac/sender/fr.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..c32f8ff7a6219853e541db1bf3df512b3f5e7786 GIT binary patch literal 2694 zcmd^>OKuZE5Qb~b4cLt=vWdVJEI~+whlE4|QLG$bVmr=A_Sj@5LC$G78q4?+!2eab zJ>$fAEZ8B-_H=hW|N5(X{`~IQu4UG@+Rm-8(#BS4eQGnUGdtF5yVkQO)@kj1lxA)d$&c-`tmZa!+Z{>2)wg5&_B6|FuFvF_ zmmPa2nMx8P{nmP}U3)6Y(w2J8++Jo=SuVAEt!UWgoOqEhC3B(wj=i}jx&wI_OQwkn zJC!Zm^R+y%9(fcK{exI8yI`1B+p<8eR0iNi26Jh#x72FsYp||m>D*4VQ(0HL$CA#p z6Ua~(biq66f&0=eL`;{$_`)sE{pnIsT}gi8=#|F#LVHyBm%f2*$g-CUv#3p+$BLMv z{-H_cckGqxwQCFhQ||r|{`fpE#=&8zCk+(DwTPG_UxqD9;b!3mZQ7H49nSAmn zn24~7$x`W)BB7U}@9CSNB$xn9P5KkB13!nYg-1NH=Q?Y86n>^|1rMf6Oe=bpK5R=T z-sf&N@T(k!#twPokJ)k}{YopQV6q0H^(tFrD*2CjwOm&eEFzbLQB3pAsvjytA{lAs z&-8qAqHnUKvB?dC-i36CBqmF>?%Adq4|&*TCpw>a8$0{*0u~ePrn$cN$a?*>*Xzib zcfrJgX6QDnN1B9V`H7n#>K9ex?qnU4l)JD{=F63B;)OTdQAhfxN165Sg%W(AqD}0u zvOULx--qiC;0-46Zm`hZh@Gj{O})|LE~tg!Om@pvH lQvYqs@4$V)6XLrszj$9tlDEA*CcCz`hq7z?yX`G<`wKXU=jQ+b literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/goArrow.png b/src/client/mac/sender/goArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f318a56711d43d1b8925f1c26e709da0872dd607 GIT binary patch literal 3591 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 EKfkuZ{r~^~ literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/ja.lproj/InfoPlist.strings b/src/client/mac/sender/ja.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..4cfd32c54b7f216718ef1a97d69bd92a2a92a143 GIT binary patch literal 156 zcmezOpFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml< f14T-JtRkSSH3JtGQ(PD_fjSC+CMGgel4B+SuMryf literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/ja.lproj/Localizable.strings b/src/client/mac/sender/ja.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..1f1a4fee5cd6f98defce31446463266b67048904 GIT binary patch literal 1792 zcmb_dJ!n&56ulJ`b#ZqwM7wloj&3S~#12CK+Jq2mhxnSlByG}{*d{HhRIG@!R-r^h z(M=q5a1aL(CkH_{aj=s^=^$3Ox>=0perbM9e-L@RyzhJOe&?Qh?oTSeJ<=mCiAX^v zWKpWErhtZ#_tMu=Rq>LgljG+%t@r_LU zn7*U_T9w(_-~UsmRf*$r%;c=9Mhr_3EsVjN%;0S)4hxI-W~TOD^I-u;m#o<`K1ULa{W|6uzr$Ma;x_X1 zy24z2XU%;ev)ANj4?GGhw-7ao(zaIB)!u21zMnj_hHZ9Oj_daRc}etj*5v-muizo; zK&93njVN|PXg#SM8fX3VJ?I4i@9xG`_ihIL*}aT0oD+FZSyNI709s%T3u&uNA|jI~)e zjXZ1SY>76CGj3E@2DQ2eMI{Q5BpN&2`btn&ymoS^GLyM>qpNm1&2H0B5QS&WQ&o2E(ZC~>IDOY;W6`DSvlTat9c z4q0~Y&-|P@cV=#W{T$e#Wp-|jEp1|zjcuj*wbhzucA;76qt9AtByp{GWVw%P$!A)> z);HHXl4LH88;uWbV9%`ASv!_yZZpY`?UStLR=Dk+q~Gc7*|FxCEZ6#7xTVzwQ)UPD zUV9Tqhu?3mdnc)p{58Hl*4oPT7y9;P@$DWAr;;5@CV2-_quI*t-AbwXT=UYS%=Hbt zyD)~_cVWDBjY^}ic%|PTj+y97+3CyfaAO(H7J6VD{}JOH}h?09Jxb| zvitYxj-2J-nL69XBN;;{sI(tBv^~damkSis!b(q^aiLlCoY)1=%4?gxbn6*TE>Q8< zj;=%&AW7C!om4`y6Z5twrHt)Kj(VCX&mYHfq%|U-w$}26pCn6IvQ&*z8@{Ahs_k5n1*V~wfOE06qPB|bi@ zGwI^Dlt!&_bg;JP4L7{fH>i6s6B(zyR77zjfH3vamXD`wV~4&$^zby>*q~#yR!)SE z6J$4a;-S6#!+P>dznTaw(cIfMt+NLbna|>Gm`RhK+{OWh$h^Y7YCUz|58|QG1LhXb zr6iV;hb1x%+ufd>Fmf+e&i2fS197&!uC-1{w`2h!o5Z6%`y=smCu+pKU;rkJt$l)rPaz|8=^+?@M7a)!IS l?Thc!eUK$+?~8BVk)*2r#ext_7SMAo(| z{Z6z;L@T@3ey$UL8tc21)s=SqUPqQ*p74Du`BXB&Yv0z|K{t3L1~SSO;ZpmNEe;|h zmJm~BQ$5HH6iMbHL1&}bGHG&FSx4vB4l(ju=mBFg^awX~$;Q_p#8gUpF4>VXjbxGN zBE=0B;223GllOpEsNhCB6Z;~GnLHwg#gYCwNo0rIL6C2sCy@j+0-Dq^R}60zv#;^L z)f2Bj^n$y`3LMBO(Lb34&!_zU|FwK>PaXgNw4QKkAOr(*+xEg)2x$7AgiG*%J}PY= z#hV>p=hwdzSK)>It}%R=k@ z8A=>=ZJC)^JVff89qKeww28F+MDsR?smA+*q^R;tyJ4PQH_*M@d8VSUfY{e|Oz%#1 zDj^hZAu!Lkh}6h4!zdnb(QXeaVfDWgl>s$Ki)o{p+h z=t+hCSezMZJ=f_&tDpdqSnY^2m1L+EH)P<~N|{!|qLAHuI}OMJi(pjhX6A+ksb;0y z4nHuT>eSyuaGM?iUHWSyt-4dOc+OjY%K*9#{?;fQ`g`2hsoZXz2c{YG=~Qm>og}h< Pms``@x!jum9?R`F*M+v{ literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/sl.lproj/InfoPlist.strings b/src/client/mac/sender/sl.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..585f6221dc91a2e19ef05347bbee12e0626e227e GIT binary patch literal 184 zcmbu2Jq|!X5QRUj#2sX>AsR#}uCPHtuws$8Jf2>scyA{2e&)I{^u{1IB!nNG1-)F0l9u!ThX?+YAMgMG literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/sl.lproj/Localizable.strings b/src/client/mac/sender/sl.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..b7dfeecebe02c401d3d6e6f124fe16974d81fd60 GIT binary patch literal 2632 zcmds(%Wo1<6vhu*6aI$@v71IAy408$ABl_B5Sw;?p_K9(NM~px3;%TW`<=ruLxVKB zG=zEFdmi8U&g0InpFKOZ%r307JDXT;V=MH2V@thfcB!|KKYi6oDTy2XhnD<#Dfvw6 zH@YVMhmuUvxYhHi_3W8-8f%}VnQSikv3-%%WY=!HBk6bgcdRdccCoV1%89+#6$F`0 z{hI5#(*DHStzvJ+qCT*qd8dw%#7`elDA1$y9zXWUo*}BlijmM8yhtCwjwf zjf|Dtb?`gTQ!O=d97G0NUG2kR={WB^ia;Cjgf3QAvX75;3u{Yzp|zR&9t%aLwIp7N zIAl|6?$$sZOrde@ve;Va3C-9K&NA5pS?<`#KW6ZiJy*RS%ObTkP%g-PQl6+Va{t;jn;9E=1uVod zxi0K6UwyB&Li!6y;oK+H zJi5B#u_GLG5!fE{cct~z$|Uj9nMNJKVHe^g6b%6FFmUk9-Zum_zh$Tj^ICu7|x?+bDICtjff3!ng%p4`vR%wFnVvFW5f-6N6J-FU!?K4tE z4?CBN>8yeO)?-?U&7OV_{_A>|Q~6B(u5eRFJu$&aUhxbsaEjHgDyozW+2SOxs&B2R zORu2^Jw;a%4Hn_I&>WbHS0+|7(in>;-=uuPdH?_b literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/sv.lproj/InfoPlist.strings b/src/client/mac/sender/sv.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..4cfd32c54b7f216718ef1a97d69bd92a2a92a143 GIT binary patch literal 156 zcmezOpFxSinZb?0iJ_Dsk0FI2har{0k0FsE7f35HC@|OpF-S!bP^_3C1IP;k$`ml< f14T-JtRkSSH3JtGQ(PD_fjSC+CMGgel4B+SuMryf literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/sv.lproj/Localizable.strings b/src/client/mac/sender/sv.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..f7d1251668bb433b683da995409eacb54d5fc0be GIT binary patch literal 2588 zcmd^>+iKfD5QgWvPqCO9+CXjE%Y;A=2?Uxnp(YO?pPk4DEZHUR+q^N5={!uedP1_N_dfub@*mM7WWjsO2-_^rM4-4SC|XK{a)gMODvP;5hWHtn6ac2f0E z=w4Nva<5(}?0IA_EaIp$3ob|HtB+>Bz9OHTTo!&u84fibx-IlXT4S;xyin`WLYF;N zx~A0HThg-+Ug(AqOw>Q2g4DZWp#IqGy4bI>q*>MT-KJBqwi~Rc$ka#A{k=~5Pu9g$ z-PK21SOa_G`&hFJ89rC2E rS%Ib6uKyMMiMJbTpKn(lLH|xvTl;*QCYtK(-iyMY=HuyEQDP&@P+*beKOYHnPJP8 zw4gB!S=hZhcjnBQGjqB9-LwNstZjwOY-pMFE$8{lCOjv0&Qs6tzOqtaamCfK)bA(Q zC#+xbopN=sOxZEu{=k~{%<7f3PwY(X8vDL|!E0(=_g%;O9ar7#{aG%2-JSQVOT{T@f~^flbKH})KDzJQ0Q;t8#^= zk}jpn=maS>#lBTjud24{kJMF|yV{}?!spU`j-3Vd?!&6rj#7(tVyX+o_9o`f_R1Bl z{?#TYIK`=dbY}6Z(j1IkFD%S>{rLD7h|T#gLW%R;f%`5>H;fGijj9t zwYHI!BIY33b4@Eh&CbzXJ~1Kh*W%Qf6T1T#i@7$d%&2lgX(lP3@Gj;TD~88+Q*X`I zF0Y#NnkcGr)oaX8;avMVCZ^``bp_RZ_7Cq6OyP9MBvs}MduZno@0a)zt1;70J@28{ zLGwIEPiq`Ps>+=48xyRs5Aa{`(TTL4=4b2;i#a(RRi@+mRFHPX_4Ok@Ue~7h)wxyf z(IjfGFgzUh8}?G^x(@eQDDx8|=j3r*!94Ihrgq5r*|Z=2X`syspFSvhXeYY2Np4kc zm8lq%*9O`th+m>Eb*5e_;BJE7Y}G-^MIOazZqkWPfylT#7x#G=O4iI;up{QR)LEU< v^0O;O8xQ)Q5hr|A*?$*hTP`Q=TUt=xZ_A}ihB~pOuYb#>8e>;3+oSve2xX}~ literal 0 HcmV?d00001 diff --git a/src/client/mac/sender/uploader.h b/src/client/mac/sender/uploader.h new file mode 100644 index 0000000..4eba716 --- /dev/null +++ b/src/client/mac/sender/uploader.h @@ -0,0 +1,105 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// This component uses the HTTPMultipartUpload of the breakpad project to send +// the minidump and associated data to the crash reporting servers. +// It will perform throttling based on the parameters passed to it and will +// prompt the user to send the minidump. + +#include + +#import "common/mac/GTMDefines.h" + +#define kClientIdPreferenceKey @"clientid" + +extern NSString *const kGoogleServerType; +extern NSString *const kSocorroServerType; +extern NSString *const kDefaultServerType; + +// Optional user-defined function that will be called after a network upload +// of a crash report. +// |report_id| will be the id returned by the server, or "ERR" if an error +// occurred. +// |error| will contain the error, or nil if no error occured. +typedef void (^UploadCompletionBlock)(NSString *reportId, NSError *error); + +@interface Uploader : NSObject { + @private + NSMutableDictionary *parameters_; // Key value pairs of data (STRONG) + NSData *minidumpContents_; // The data in the minidump (STRONG) + NSData *logFileData_; // An NSdata for the tar, + // bz2'd log file. + NSMutableDictionary *serverDictionary_; // The dictionary mapping a + // server type name to a + // dictionary of server + // parameter names. + NSMutableDictionary *socorroDictionary_; // The dictionary for + // Socorro. + NSMutableDictionary *googleDictionary_; // The dictionary for + // Google. + NSMutableDictionary *extraServerVars_; // A dictionary containing + // extra key/value pairs + // that are uploaded to the + // crash server with the + // minidump. + UploadCompletionBlock uploadCompletion_; // A block called on network upload + // completion. Parameters are: + // The report ID returned by the + // server, + // the NSError triggered during + // upload. +} + +- (id)initWithConfigFile:(const char *)configFile; + +- (id)initWithConfig:(NSDictionary *)config; + +// Reads the file |configFile| and returns the corresponding NSDictionary. +// |configFile| will be deleted after reading. ++ (NSDictionary *)readConfigurationDataFromFile:(NSString *)configFile; + +- (NSMutableDictionary *)parameters; + +- (void)report; + +// Upload the given data to the crash server. +- (void)uploadData:(NSData *)data name:(NSString *)name; + +// This method adds a key/value pair to the dictionary that +// will be uploaded to the crash server. +- (void)addServerParameter:(id)value forKey:(NSString *)key; + +// This method process the HTTP response and renames the minidump file with the +// new ID. +- (void)handleNetworkResponse:(NSData *)data withError:(NSError *)error; + +// Sets the callback to be called after uploading a crash report to the server. +// Only the latest callback registered will be called. +- (void)setUploadCompletionBlock:(UploadCompletionBlock)uploadCompletion; + +@end diff --git a/src/client/mac/sender/uploader.mm b/src/client/mac/sender/uploader.mm new file mode 100644 index 0000000..f2bcd0b --- /dev/null +++ b/src/client/mac/sender/uploader.mm @@ -0,0 +1,687 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import +#include +#import +#include +#import + +#import + +#import "common/mac/HTTPMultipartUpload.h" + +#import "client/apple/Framework/BreakpadDefines.h" +#import "client/mac/sender/uploader.h" + +const int kMinidumpFileLengthLimit = 2 * 1024 * 1024; // 2MB + +#define kApplePrefsSyncExcludeAllKey \ + @"com.apple.PreferenceSync.ExcludeAllSyncKeys" + +NSString *const kGoogleServerType = @"google"; +NSString *const kSocorroServerType = @"socorro"; +NSString *const kDefaultServerType = @"google"; + +#pragma mark - + +namespace { +// Read one line from the configuration file. +NSString *readString(int fileId) { + NSMutableString *str = [NSMutableString stringWithCapacity:32]; + char ch[2] = { 0 }; + + while (read(fileId, &ch[0], 1) == 1) { + if (ch[0] == '\n') { + // Break if this is the first newline after reading some other string + // data. + if ([str length]) + break; + } else { + [str appendString:[NSString stringWithUTF8String:ch]]; + } + } + + return str; +} + +//============================================================================= +// Read |length| of binary data from the configuration file. This method will +// returns |nil| in case of error. +NSData *readData(int fileId, ssize_t length) { + NSMutableData *data = [NSMutableData dataWithLength:length]; + char *bytes = (char *)[data bytes]; + + if (read(fileId, bytes, length) != length) + return nil; + + return data; +} + +//============================================================================= +// Read the configuration from the config file. +NSDictionary *readConfigurationData(const char *configFile) { + int fileId = open(configFile, O_RDONLY, 0600); + if (fileId == -1) { + fprintf(stderr, "Breakpad Uploader: Couldn't open config file %s - %s", + configFile, strerror(errno)); + } + + // we want to avoid a build-up of old config files even if they + // have been incorrectly written by the framework + if (unlink(configFile)) { + fprintf(stderr, "Breakpad Uploader: Couldn't unlink config file %s - %s", + configFile, strerror(errno)); + } + + if (fileId == -1) { + return nil; + } + + NSMutableDictionary *config = [NSMutableDictionary dictionary]; + + while (1) { + NSString *key = readString(fileId); + + if (![key length]) + break; + + // Read the data. Try to convert to a UTF-8 string, or just save + // the data + NSString *lenStr = readString(fileId); + ssize_t len = [lenStr intValue]; + NSData *data = readData(fileId, len); + id value = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + + [config setObject:(value ? value : data) forKey:key]; + [value release]; + } + + close(fileId); + return config; +} +} // namespace + +#pragma mark - + +@interface Uploader(PrivateMethods) + +// Update |parameters_| as well as the server parameters using |config|. +- (void)translateConfigurationData:(NSDictionary *)config; + +// Read the minidump referenced in |parameters_| and update |minidumpContents_| +// with its content. +- (BOOL)readMinidumpData; + +// Read the log files referenced in |parameters_| and update |logFileData_| +// with their content. +- (BOOL)readLogFileData; + +// Returns a unique client id (user-specific), creating a persistent +// one in the user defaults, if necessary. +- (NSString*)clientID; + +// Returns a dictionary that can be used to map Breakpad parameter names to +// URL parameter names. +- (NSMutableDictionary *)dictionaryForServerType:(NSString *)serverType; + +// Helper method to set HTTP parameters based on server type. This is +// called right before the upload - crashParameters will contain, on exit, +// URL parameters that should be sent with the minidump. +- (BOOL)populateServerDictionary:(NSMutableDictionary *)crashParameters; + +// Initialization helper to create dictionaries mapping Breakpad +// parameters to URL parameters +- (void)createServerParameterDictionaries; + +// Accessor method for the URL parameter dictionary +- (NSMutableDictionary *)urlParameterDictionary; + +// Records the uploaded crash ID to the log file. +- (void)logUploadWithID:(const char *)uploadID; + +// Builds an URL parameter for a given dictionary key. Uses Uploader's +// parameters to provide its value. Returns nil if no item is stored for the +// given key. +- (NSURLQueryItem *)queryItemWithName:(NSString *)queryItemName + forParamKey:(NSString *)key; +@end + +@implementation Uploader + +//============================================================================= +- (id)initWithConfigFile:(const char *)configFile { + NSDictionary *config = readConfigurationData(configFile); + if (!config) + return nil; + + return [self initWithConfig:config]; +} + +//============================================================================= +- (id)initWithConfig:(NSDictionary *)config { + if ((self = [super init])) { + // Because the reporter is embedded in the framework (and many copies + // of the framework may exist) its not completely certain that the OS + // will obey the com.apple.PreferenceSync.ExcludeAllSyncKeys in our + // Info.plist. To make sure, also set the key directly if needed. + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + if (![ud boolForKey:kApplePrefsSyncExcludeAllKey]) { + [ud setBool:YES forKey:kApplePrefsSyncExcludeAllKey]; + } + + [self createServerParameterDictionaries]; + + [self translateConfigurationData:config]; + + // Read the minidump into memory. + [self readMinidumpData]; + [self readLogFileData]; + } + return self; +} + +//============================================================================= ++ (NSDictionary *)readConfigurationDataFromFile:(NSString *)configFile { + return readConfigurationData([configFile fileSystemRepresentation]); +} + +//============================================================================= +- (void)translateConfigurationData:(NSDictionary *)config { + parameters_ = [[NSMutableDictionary alloc] init]; + + NSEnumerator *it = [config keyEnumerator]; + while (NSString *key = [it nextObject]) { + // If the keyname is prefixed by BREAKPAD_SERVER_PARAMETER_PREFIX + // that indicates that it should be uploaded to the server along + // with the minidump, so we treat it specially. + if ([key hasPrefix:@BREAKPAD_SERVER_PARAMETER_PREFIX]) { + NSString *urlParameterKey = + [key substringFromIndex:[@BREAKPAD_SERVER_PARAMETER_PREFIX length]]; + if ([urlParameterKey length]) { + id value = [config objectForKey:key]; + if ([value isKindOfClass:[NSString class]]) { + [self addServerParameter:(NSString *)value + forKey:urlParameterKey]; + } else { + [self addServerParameter:(NSData *)value + forKey:urlParameterKey]; + } + } + } else { + [parameters_ setObject:[config objectForKey:key] forKey:key]; + } + } + + // generate a unique client ID based on this host's MAC address + // then add a key/value pair for it + NSString *clientID = [self clientID]; + [parameters_ setObject:clientID forKey:@"guid"]; +} + +// Per user per machine +- (NSString *)clientID { + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + NSString *crashClientID = [ud stringForKey:kClientIdPreferenceKey]; + if (crashClientID) { + return crashClientID; + } + + // Otherwise, if we have no client id, generate one! + srandom((int)[[NSDate date] timeIntervalSince1970]); + long clientId1 = random(); + long clientId2 = random(); + long clientId3 = random(); + crashClientID = [NSString stringWithFormat:@"%lx%lx%lx", + clientId1, clientId2, clientId3]; + + [ud setObject:crashClientID forKey:kClientIdPreferenceKey]; + [ud synchronize]; + return crashClientID; +} + +//============================================================================= +- (BOOL)readLogFileData { +#if TARGET_OS_IPHONE + return NO; +#else + unsigned int logFileCounter = 0; + + NSString *logPath; + size_t logFileTailSize = + [[parameters_ objectForKey:@BREAKPAD_LOGFILE_UPLOAD_SIZE] intValue]; + + NSMutableArray *logFilenames; // An array of NSString, one per log file + logFilenames = [[NSMutableArray alloc] init]; + + char tmpDirTemplate[80] = "/tmp/CrashUpload-XXXXX"; + char *tmpDir = mkdtemp(tmpDirTemplate); + + // Construct key names for the keys we expect to contain log file paths + for(logFileCounter = 0;; logFileCounter++) { + NSString *logFileKey = [NSString stringWithFormat:@"%@%d", + @BREAKPAD_LOGFILE_KEY_PREFIX, + logFileCounter]; + + logPath = [parameters_ objectForKey:logFileKey]; + + // They should all be consecutive, so if we don't find one, assume + // we're done + + if (!logPath) { + break; + } + + NSData *entireLogFile = [[NSData alloc] initWithContentsOfFile:logPath]; + + if (entireLogFile == nil) { + continue; + } + + NSRange fileRange; + + // Truncate the log file, only if necessary + + if ([entireLogFile length] <= logFileTailSize) { + fileRange = NSMakeRange(0, [entireLogFile length]); + } else { + fileRange = NSMakeRange([entireLogFile length] - logFileTailSize, + logFileTailSize); + } + + char tmpFilenameTemplate[100]; + + // Generate a template based on the log filename + sprintf(tmpFilenameTemplate,"%s/%s-XXXX", tmpDir, + [[logPath lastPathComponent] fileSystemRepresentation]); + + char *tmpFile = mktemp(tmpFilenameTemplate); + + NSData *logSubdata = [entireLogFile subdataWithRange:fileRange]; + NSString *tmpFileString = [NSString stringWithUTF8String:tmpFile]; + [logSubdata writeToFile:tmpFileString atomically:NO]; + + [logFilenames addObject:[tmpFileString lastPathComponent]]; + [entireLogFile release]; + } + + if ([logFilenames count] == 0) { + [logFilenames release]; + logFileData_ = nil; + return NO; + } + + // now, bzip all files into one + NSTask *tarTask = [[NSTask alloc] init]; + + [tarTask setCurrentDirectoryPath:[NSString stringWithUTF8String:tmpDir]]; + [tarTask setLaunchPath:@"/usr/bin/tar"]; + + NSMutableArray *bzipArgs = [NSMutableArray arrayWithObjects:@"-cjvf", + @"log.tar.bz2",nil]; + [bzipArgs addObjectsFromArray:logFilenames]; + + [logFilenames release]; + + [tarTask setArguments:bzipArgs]; + [tarTask launch]; + [tarTask waitUntilExit]; + [tarTask release]; + + NSString *logTarFile = [NSString stringWithFormat:@"%s/log.tar.bz2",tmpDir]; + logFileData_ = [[NSData alloc] initWithContentsOfFile:logTarFile]; + if (logFileData_ == nil) { + fprintf(stderr, "Breakpad Uploader: Cannot find temp tar log file: %s", + [logTarFile UTF8String]); + return NO; + } + return YES; +#endif // TARGET_OS_IPHONE +} + +//============================================================================= +- (BOOL)readMinidumpData { + NSString *minidumpDir = + [parameters_ objectForKey:@kReporterMinidumpDirectoryKey]; + NSString *minidumpID = [parameters_ objectForKey:@kReporterMinidumpIDKey]; + + if (![minidumpID length]) + return NO; + + NSString *path = [minidumpDir stringByAppendingPathComponent:minidumpID]; + path = [path stringByAppendingPathExtension:@"dmp"]; + + // check the size of the minidump and limit it to a reasonable size + // before attempting to load into memory and upload + const char *fileName = [path fileSystemRepresentation]; + struct stat fileStatus; + + BOOL success = YES; + + if (!stat(fileName, &fileStatus)) { + if (fileStatus.st_size > kMinidumpFileLengthLimit) { + fprintf(stderr, "Breakpad Uploader: minidump file too large " \ + "to upload : %d\n", (int)fileStatus.st_size); + success = NO; + } + } else { + fprintf(stderr, "Breakpad Uploader: unable to determine minidump " \ + "file length\n"); + success = NO; + } + + if (success) { + minidumpContents_ = [[NSData alloc] initWithContentsOfFile:path]; + success = ([minidumpContents_ length] ? YES : NO); + } + + if (!success) { + // something wrong with the minidump file -- delete it + unlink(fileName); + } + + return success; +} + +#pragma mark - +//============================================================================= + +- (void)createServerParameterDictionaries { + serverDictionary_ = [[NSMutableDictionary alloc] init]; + socorroDictionary_ = [[NSMutableDictionary alloc] init]; + googleDictionary_ = [[NSMutableDictionary alloc] init]; + extraServerVars_ = [[NSMutableDictionary alloc] init]; + + [serverDictionary_ setObject:socorroDictionary_ forKey:kSocorroServerType]; + [serverDictionary_ setObject:googleDictionary_ forKey:kGoogleServerType]; + + [googleDictionary_ setObject:@"ptime" forKey:@BREAKPAD_PROCESS_UP_TIME]; + [googleDictionary_ setObject:@"email" forKey:@BREAKPAD_EMAIL]; + [googleDictionary_ setObject:@"comments" forKey:@BREAKPAD_COMMENTS]; + [googleDictionary_ setObject:@"prod" forKey:@BREAKPAD_PRODUCT]; + [googleDictionary_ setObject:@"ver" forKey:@BREAKPAD_VERSION]; + [googleDictionary_ setObject:@"guid" forKey:@"guid"]; + + [socorroDictionary_ setObject:@"Comments" forKey:@BREAKPAD_COMMENTS]; + [socorroDictionary_ setObject:@"CrashTime" + forKey:@BREAKPAD_PROCESS_CRASH_TIME]; + [socorroDictionary_ setObject:@"StartupTime" + forKey:@BREAKPAD_PROCESS_START_TIME]; + [socorroDictionary_ setObject:@"Version" + forKey:@BREAKPAD_VERSION]; + [socorroDictionary_ setObject:@"ProductName" + forKey:@BREAKPAD_PRODUCT]; + [socorroDictionary_ setObject:@"Email" + forKey:@BREAKPAD_EMAIL]; +} + +- (NSMutableDictionary *)dictionaryForServerType:(NSString *)serverType { + if (serverType == nil || [serverType length] == 0) { + return [serverDictionary_ objectForKey:kDefaultServerType]; + } + return [serverDictionary_ objectForKey:serverType]; +} + +- (NSMutableDictionary *)urlParameterDictionary { + NSString *serverType = [parameters_ objectForKey:@BREAKPAD_SERVER_TYPE]; + return [self dictionaryForServerType:serverType]; + +} + +- (BOOL)populateServerDictionary:(NSMutableDictionary *)crashParameters { + NSDictionary *urlParameterNames = [self urlParameterDictionary]; + + id key; + NSEnumerator *enumerator = [parameters_ keyEnumerator]; + + while ((key = [enumerator nextObject])) { + // The key from parameters_ corresponds to a key in + // urlParameterNames. The value in parameters_ gets stored in + // crashParameters with a key that is the value in + // urlParameterNames. + + // For instance, if parameters_ has [PRODUCT_NAME => "FOOBAR"] and + // urlParameterNames has [PRODUCT_NAME => "pname"] the final HTTP + // URL parameter becomes [pname => "FOOBAR"]. + NSString *breakpadParameterName = (NSString *)key; + NSString *urlParameter = [urlParameterNames + objectForKey:breakpadParameterName]; + if (urlParameter) { + [crashParameters setObject:[parameters_ objectForKey:key] + forKey:urlParameter]; + } + } + + // Now, add the parameters that were added by the application. + enumerator = [extraServerVars_ keyEnumerator]; + + while ((key = [enumerator nextObject])) { + NSString *urlParameterName = (NSString *)key; + NSString *urlParameterValue = + [extraServerVars_ objectForKey:urlParameterName]; + [crashParameters setObject:urlParameterValue + forKey:urlParameterName]; + } + return YES; +} + +- (void)addServerParameter:(id)value forKey:(NSString *)key { + [extraServerVars_ setObject:value forKey:key]; +} + +//============================================================================= +- (void)handleNetworkResponse:(NSData *)data withError:(NSError *)error { + NSString *result = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + const char *reportID = "ERR"; + if (error) { + fprintf(stderr, "Breakpad Uploader: Send Error: %s\n", + [[error description] UTF8String]); + } else { + NSCharacterSet *trimSet = + [NSCharacterSet whitespaceAndNewlineCharacterSet]; + reportID = [[result stringByTrimmingCharactersInSet:trimSet] UTF8String]; + [self logUploadWithID:reportID]; + } + if (uploadCompletion_) { + uploadCompletion_([NSString stringWithUTF8String:reportID], error); + } + + // rename the minidump file according to the id returned from the server + NSString *minidumpDir = + [parameters_ objectForKey:@kReporterMinidumpDirectoryKey]; + NSString *minidumpID = [parameters_ objectForKey:@kReporterMinidumpIDKey]; + + NSString *srcString = [NSString stringWithFormat:@"%@/%@.dmp", + minidumpDir, minidumpID]; + NSString *destString = [NSString stringWithFormat:@"%@/%s.dmp", + minidumpDir, reportID]; + + const char *src = [srcString fileSystemRepresentation]; + const char *dest = [destString fileSystemRepresentation]; + + if (rename(src, dest) == 0) { + fprintf(stderr, + "Breakpad Uploader: Renamed %s to %s after successful upload", src, + dest); + } + else { + // can't rename - don't worry - it's not important for users + fprintf(stderr, "Breakpad Uploader: successful upload report ID = %s\n", + reportID); + } + [result release]; +} + +//============================================================================= +- (NSURLQueryItem *)queryItemWithName:(NSString *)queryItemName + forParamKey:(NSString *)key { + NSString *value = [parameters_ objectForKey:key]; + NSString *escapedValue = + [value stringByAddingPercentEncodingWithAllowedCharacters: + [NSCharacterSet URLQueryAllowedCharacterSet]]; + return [NSURLQueryItem queryItemWithName:queryItemName value:escapedValue]; +} + +//============================================================================= +- (void)setUploadCompletionBlock:(UploadCompletionBlock)uploadCompletion { + uploadCompletion_ = uploadCompletion; +} + +//============================================================================= +- (void)report { + NSURL *url = [NSURL URLWithString:[parameters_ objectForKey:@BREAKPAD_URL]]; + + NSString *serverType = [parameters_ objectForKey:@BREAKPAD_SERVER_TYPE]; + if ([serverType length] == 0 || + [serverType isEqualToString:kGoogleServerType]) { + // when communicating to Google's crash collecting service, add URL params + // which identify the product + NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url + resolvingAgainstBaseURL:false]; + NSMutableArray *queryItemsToAdd = [urlComponents.queryItems mutableCopy]; + if (queryItemsToAdd == nil) { + queryItemsToAdd = [[NSMutableArray alloc] init]; + } + + NSURLQueryItem *queryItemProduct = + [self queryItemWithName:@"product" forParamKey:@BREAKPAD_PRODUCT]; + NSURLQueryItem *queryItemVersion = + [self queryItemWithName:@"version" forParamKey:@BREAKPAD_VERSION]; + NSURLQueryItem *queryItemGuid = + [self queryItemWithName:@"guid" forParamKey:@"guid"]; + + if (queryItemProduct != nil) [queryItemsToAdd addObject:queryItemProduct]; + if (queryItemVersion != nil) [queryItemsToAdd addObject:queryItemVersion]; + if (queryItemGuid != nil) [queryItemsToAdd addObject:queryItemGuid]; + + urlComponents.queryItems = queryItemsToAdd; + url = [urlComponents URL]; + } + + HTTPMultipartUpload *upload = [[HTTPMultipartUpload alloc] initWithURL:url]; + NSMutableDictionary *uploadParameters = [NSMutableDictionary dictionary]; + + if (![self populateServerDictionary:uploadParameters]) { + [upload release]; + return; + } + + [upload setParameters:uploadParameters]; + + // Add minidump file + if (minidumpContents_) { + [upload addFileContents:minidumpContents_ name:@"upload_file_minidump"]; + + // If there is a log file, upload it together with the minidump. + if (logFileData_) { + [upload addFileContents:logFileData_ name:@"log"]; + } + + // Send it + NSError *error = nil; + NSData *data = [upload send:&error]; + + if (![url isFileURL]) { + [self handleNetworkResponse:data withError:error]; + } else { + if (error) { + fprintf(stderr, "Breakpad Uploader: Error writing request file: %s\n", + [[error description] UTF8String]); + } + } + + } else { + // Minidump is missing -- upload just the log file. + if (logFileData_) { + [self uploadData:logFileData_ name:@"log"]; + } + } + [upload release]; +} + +- (void)uploadData:(NSData *)data name:(NSString *)name { + NSURL *url = [NSURL URLWithString:[parameters_ objectForKey:@BREAKPAD_URL]]; + NSMutableDictionary *uploadParameters = [NSMutableDictionary dictionary]; + + if (![self populateServerDictionary:uploadParameters]) + return; + + HTTPMultipartUpload *upload = + [[HTTPMultipartUpload alloc] initWithURL:url]; + + [uploadParameters setObject:name forKey:@"type"]; + [upload setParameters:uploadParameters]; + [upload addFileContents:data name:name]; + + [upload send:nil]; + [upload release]; +} + +- (void)logUploadWithID:(const char *)uploadID { + NSString *minidumpDir = + [parameters_ objectForKey:@kReporterMinidumpDirectoryKey]; + NSString *logFilePath = [NSString stringWithFormat:@"%@/%s", + minidumpDir, kReporterLogFilename]; + NSString *logLine = [NSString stringWithFormat:@"%0.f,%s\n", + [[NSDate date] timeIntervalSince1970], uploadID]; + NSData *logData = [logLine dataUsingEncoding:NSUTF8StringEncoding]; + + NSFileManager *fileManager = [NSFileManager defaultManager]; + if ([fileManager fileExistsAtPath:logFilePath]) { + NSFileHandle *logFileHandle = + [NSFileHandle fileHandleForWritingAtPath:logFilePath]; + [logFileHandle seekToEndOfFile]; + [logFileHandle writeData:logData]; + [logFileHandle closeFile]; + } else { + [fileManager createFileAtPath:logFilePath + contents:logData + attributes:nil]; + } +} + +//============================================================================= +- (NSMutableDictionary *)parameters { + return parameters_; +} + +//============================================================================= +- (void)dealloc { + [parameters_ release]; + [minidumpContents_ release]; + [logFileData_ release]; + [googleDictionary_ release]; + [socorroDictionary_ release]; + [serverDictionary_ release]; + [extraServerVars_ release]; + [super dealloc]; +} + +@end diff --git a/src/client/mac/testapp/Controller.h b/src/client/mac/testapp/Controller.h new file mode 100644 index 0000000..36f9572 --- /dev/null +++ b/src/client/mac/testapp/Controller.h @@ -0,0 +1,64 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +#import + +enum BreakpadForkBehavior { + DONOTHING = 0, + UNINSTALL, + RESETEXCEPTIONPORT +}; + +enum BreakpadForkTestCrashPoint { + DURINGLAUNCH = 5, + AFTERLAUNCH = 6, + BETWEENFORKEXEC = 7 +}; + +@interface Controller : NSObject { + IBOutlet NSWindow *window_; + IBOutlet NSWindow *forkTestOptions_; + + BreakpadRef breakpad_; + + enum BreakpadForkBehavior bpForkOption; + + BOOL useVFork; + enum BreakpadForkTestCrashPoint progCrashPoint; +} + +- (IBAction)crash:(id)sender; +- (IBAction)forkTestOptions:(id)sender; +- (IBAction)forkTestGo:(id)sender; +- (IBAction)showForkTestWindow:(id) sender; +- (void)generateReportWithoutCrash:(id)sender; +- (void)awakeFromNib; + +@end diff --git a/src/client/mac/testapp/Controller.m b/src/client/mac/testapp/Controller.m new file mode 100644 index 0000000..2de84f3 --- /dev/null +++ b/src/client/mac/testapp/Controller.m @@ -0,0 +1,260 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +#import "Controller.h" +#import "TestClass.h" +#import "GTMDefines.h" +#include +#include + +@implementation Controller + +- (void)causeCrash { + float *aPtr = nil; + NSLog(@"Crash!"); + NSLog(@"Bad programmer: %f", *aPtr); +} + +- (void)generateReportWithoutCrash:(id)sender { + BreakpadGenerateAndSendReport(breakpad_); +} + +- (IBAction)showForkTestWindow:(id) sender { + [forkTestOptions_ setIsVisible:YES]; +} + +- (IBAction)forkTestOptions:(id)sender { + NSInteger tag = [[sender selectedCell] tag]; + NSLog(@"sender tag: %d", tag); + if (tag <= 2) { + bpForkOption = tag; + } + + if (tag == 3) { + useVFork = NO; + } + + if (tag == 4) { + useVFork = YES; + } + + if (tag >= 5 && tag <= 7) { + progCrashPoint = tag; + } + +} + +- (IBAction)forkTestGo:(id)sender { + + NSString *resourcePath = [[NSBundle bundleForClass: + [self class]] resourcePath]; + NSString *execProgname = nil; + if (progCrashPoint == DURINGLAUNCH) { + execProgname = [resourcePath stringByAppendingString:@"/crashduringload"]; + } else if (progCrashPoint == AFTERLAUNCH) { + execProgname = [resourcePath stringByAppendingString:@"/crashInMain"]; + } + + const char *progName = NULL; + if (progCrashPoint != BETWEENFORKEXEC) { + progName = [execProgname UTF8String]; + } + + int pid; + + if (bpForkOption == UNINSTALL) { + BreakpadRelease(breakpad_); + } + + if (useVFork) { + pid = vfork(); + } else { + pid = fork(); + } + + if (pid == 0) { + sleep(3); + NSLog(@"Child continuing"); + FILE *fd = fopen("/tmp/childlog.txt","wt"); + kern_return_t kr; + if (bpForkOption == RESETEXCEPTIONPORT) { + kr = task_set_exception_ports(mach_task_self(), + EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_INSTRUCTION | + EXC_MASK_ARITHMETIC | EXC_MASK_BREAKPOINT, + MACH_PORT_NULL, + EXCEPTION_DEFAULT, + THREAD_STATE_NONE); + fprintf(fd,"task_set_exception_ports returned %d\n", kr); + } + + if (progCrashPoint == BETWEENFORKEXEC) { + fprintf(fd,"crashing post-fork\n"); + int *a = NULL; + printf("%d\n",*a++); + } + + fprintf(fd,"about to call exec with %s\n", progName); + fclose(fd); + int i = execl(progName, progName, NULL); + fprintf(fd, "exec returned! %d\n", i); + fclose(fd); + } +} + +- (IBAction)crash:(id)sender { + NSInteger tag = [sender tag]; + + if (tag == 1) { + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + [self performSelector:@selector(causeCrash) withObject:nil afterDelay:10.0]; + [sender setState:NSOnState]; + return; + } + + if (tag == 2 && breakpad_) { + BreakpadRelease(breakpad_); + breakpad_ = NULL; + return; + } + + [self causeCrash]; +} + +- (void)anotherThread { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + TestClass *tc = [[TestClass alloc] init]; + + [tc wait]; + + [pool release]; +} + +- (void)awakeFromNib { + NSBundle *bundle = [NSBundle mainBundle]; + NSDictionary *info = [bundle infoDictionary]; + + + breakpad_ = BreakpadCreate(info); + + // Do some unit tests with keys + // first a series of bogus values + BreakpadSetKeyValue(breakpad_, nil, @"bad2"); + BreakpadSetKeyValue(nil, @"bad3", @"bad3"); + + // Now some good ones + BreakpadSetKeyValue(breakpad_,@"key1", @"value1"); + BreakpadSetKeyValue(breakpad_,@"key2", @"value2"); + BreakpadSetKeyValue(breakpad_,@"key3", @"value3"); + + // Look for a bogus one that we didn't try to set + NSString *test = BreakpadKeyValue(breakpad_, @"bad4"); + if (test) { + NSLog(@"Bad BreakpadKeyValue (bad4)"); + } + + // Look for a bogus one we did try to set + test = BreakpadKeyValue(breakpad_, @"bad1"); + if (test) { + NSLog(@"Bad BreakpadKeyValue (bad1)"); + } + + // Test some bad args for BreakpadKeyValue + test = BreakpadKeyValue(nil, @"bad5"); + if (test) { + NSLog(@"Bad BreakpadKeyValue (bad5)"); + } + + test = BreakpadKeyValue(breakpad_, nil); + if (test) { + NSLog(@"Bad BreakpadKeyValue (nil)"); + } + + // Find some we did set + test = BreakpadKeyValue(breakpad_, @"key1"); + if (![test isEqualToString:@"value1"]) { + NSLog(@"Can't find BreakpadKeyValue (key1)"); + } + test = BreakpadKeyValue(breakpad_, @"key2"); + if (![test isEqualToString:@"value2"]) { + NSLog(@"Can't find BreakpadKeyValue (key2)"); + } + test = BreakpadKeyValue(breakpad_, @"key3"); + if (![test isEqualToString:@"value3"]) { + NSLog(@"Can't find BreakpadKeyValue (key3)"); + } + + // Bad args for BreakpadRemoveKeyValue + BreakpadRemoveKeyValue(nil, @"bad6"); + BreakpadRemoveKeyValue(breakpad_, nil); + + // Remove one that is valid + BreakpadRemoveKeyValue(breakpad_, @"key3"); + + // Try and find it + test = BreakpadKeyValue(breakpad_, @"key3"); + if (test) { + NSLog(@"Shouldn't find BreakpadKeyValue (key3)"); + } + + // Try and remove it again + BreakpadRemoveKeyValue(breakpad_, @"key3"); + + // Try removal by setting to nil + BreakpadSetKeyValue(breakpad_,@"key2", nil); + // Try and find it + test = BreakpadKeyValue(breakpad_, @"key2"); + if (test) { + NSLog(@"Shouldn't find BreakpadKeyValue (key2)"); + } + + BreakpadAddUploadParameter(breakpad_, + @"MeaningOfLife", + @"42"); + [NSThread detachNewThreadSelector:@selector(anotherThread) + toTarget:self withObject:nil]; + + NSUserDefaults *args = [NSUserDefaults standardUserDefaults]; + + // If the user specified autocrash on the command line, toggle + // Breakpad to not confirm and crash immediately. This is for + // automated testing. + if ([args boolForKey:@"autocrash"]) { + BreakpadSetKeyValue(breakpad_, + @BREAKPAD_SKIP_CONFIRM, + @"YES"); + [self causeCrash]; + } + + progCrashPoint = DURINGLAUNCH; + [window_ center]; + [window_ makeKeyAndOrderFront:self]; +} + +@end diff --git a/src/client/mac/testapp/English.lproj/InfoPlist.strings b/src/client/mac/testapp/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..b8c6c6bf0ba1a55cea7e4656822a4ee5d65546b8 GIT binary patch literal 192 zcmXYq!4APt5Jk_rU(r}Lg4kGyl?4*9;0vl+1Z~qI;g9?zju)9^?z}s9&U=68lMu6{ zA|vI@ktaDjy}R1b>Qt0!tQPi#ufn-U9r7(#-IM7@NF_2OYsH2+H!gBZ*6vfeDO;~{ krV?r|8u@z;fiaQO;bot>t@MA%?*Gp$OhX3N$lRFd3!KFv6#xJL literal 0 HcmV?d00001 diff --git a/src/client/mac/testapp/English.lproj/MainMenu.xib b/src/client/mac/testapp/English.lproj/MainMenu.xib new file mode 100644 index 0000000..840c0db --- /dev/null +++ b/src/client/mac/testapp/English.lproj/MainMenu.xib @@ -0,0 +1,3748 @@ + + + + 1050 + 10F569 + 788 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 788 + + + YES + + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + + NSApplication + + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{945, 874}, {320, 188}} + 1886912512 + Window + NSWindow + + View + + {1.79769e+308, 1.79769e+308} + {213, 107} + + + 256 + + YES + + + 301 + {{14, 140}, {292, 32}} + + + YES + + 67239424 + 134217728 + Crash! (Airbag Installed) + + LucidaGrande + 13 + 1044 + + + -2038284033 + 1 + + + + + + 200 + 25 + + + + + 301 + {{14, 76}, {292, 32}} + + + 2 + YES + + 67239424 + 134217728 + Crash! (Airbag NOT Installed) + + + 2 + -2038284033 + 1 + + + + + + 200 + 25 + + + + + 301 + {{14, 108}, {292, 32}} + + + 1 + YES + + 67239424 + 134217728 + Crash! (Airbag Installed w/10sec delay) + + + 1 + -2038284033 + 1 + + + + + + 200 + 25 + + + + + 268 + {{14, 44}, {292, 32}} + + + YES + + 67239424 + 134217728 + Fork Test + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{14, 12}, {292, 32}} + + + YES + + 67239424 + 134217728 + Generate report without crash + + + -2038284033 + 129 + + + 200 + 25 + + + + {320, 188} + + + + {{0, 0}, {1440, 878}} + {213, 129} + {1.79769e+308, 1.79769e+308} + + + MainMenu + + YES + + + NewApplication + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + NewApplication + + YES + + + About NewApplication + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + + Services + + + YES + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide NewApplication + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit NewApplication + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + + File + + + YES + + + New + n + 1048576 + 2147483647 + + + + + + Open... + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + + Open Recent + + + YES + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save + s + 1048576 + 2147483647 + + + + + + Save As… + S + 1048576 + 2147483647 + + + + + + Revert + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup… + P + 1048576 + 2147483647 + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + + Edit + + + YES + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + + Find + + + YES + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1048576 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling + + 1048576 + 2147483647 + + + submenuAction: + + Spelling + + YES + + + Spelling… + : + 1048576 + 2147483647 + + + + + + Check Spelling + ; + 1048576 + 2147483647 + + + + + + Check Spelling as You Type + + 1048576 + 2147483647 + + + + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + + Window + + + YES + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 1048576 + 2147483647 + + + submenuAction: + + Help + + YES + + + NewApplication Help + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + Controller + + + 15 + 2 + {{858, 755}, {787, 260}} + 603979776 + Window + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 256 + + YES + + + 268 + {{20, 7}, {645, 79}} + + YES + 3 + 1 + + YES + + -2080244224 + 0 + program crashes during launch because of missing dylib + + + 5 + 1211912703 + 0 + + NSRadioButton + + + + 200 + 25 + + + 67239424 + 0 + program crashes after launch + + + 6 + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + 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 +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + 3 + MCAwAA + + + + 400 + 75 + + + 67239424 + 0 + program crashes in between fork() and exec() (3rd option in first group will happen before crash) + + + 7 + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + 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 +ArBYWVogAAAAAAAANWMAAJ/rAAAZsVhZWiAAAAAAAAAlzQAAE9UAALbFWFlaIAAAAAAAAPPYAAEAAAAB +FghzZjMyAAAAAAABC7cAAAWW///zVwAABykAAP3X///7t////aYAAAPaAADA9mN1cnYAAAAAAAAAAQHN +AABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAADAQAAAgAAAioENAYA +B9AJlAtRDQwOshBOEekTgxUVFqMYMRm9GzwcvR4+H7chLiKnJBoliCb3KGIpyCswLJMt9C9WMLIyDjNn +NL02FTdoOLs6ETtdPKw9+D9DQJBB1kMeRGZFq0bySDRJeEq6S/tNPk59T75Q+lI2U25Uo1XZVwlYOlln +WpZbwFzsXhdfQWBrYZRiv2PoZRNmPWdqaJhpyGr5bC1tZW6hb+BxLXJ+c9d1OHafeA55gnr5fHR98H9t +gOuCY4PYhUqGsIgSiWyKuIwBjTqObY+VkLORyJLUk9eU05XFlrWXlZh2mUuaG5rsm6ucbJ0qndqei588 +n9+ghKEqoceiYqL/o5qkLqTDpVml66Z7pwunnKgpqLWpQqnQqlqq5Ktvq/qsg60MrZauIa6qrzOvvbBH +sNGxXLHnsnKy/7OMtBm0p7U3tci2Wbbrt4C4FrituUa54rqAux27wbxlvQq9rr5Tvvi/ncBAwOXBisIu +wtPDeMQdxMLFaMYPxrXHXMgEyKzJVcn/yqnLVcwBzK7NXc4Mzr3PcNAk0NnRkdJK0wTTw9SC1UTWCtbR +153Ybdk+2hfa8dvM3KfdhN5g3zzgGuD34dbiteOV5HblWeY85yHoCOjw6drqxuu27Kbtm+6R74zwivGM +8pPzn/Sw9cj25/gP+T76e/u//Rr+hP//AAABpANzBRoGsggnCZsLFQx+Dd4PRRCiEf8TYxS0FgoXXRiu +GgQbTRyZHekfMCB8IcIjCSRSJZUm3SgdKWAqpCvjLSYuZC+lMOIyIDNgNJs12TcTOFA5izrEO/49NT5w +P6dA30IWQ01Eg0W4Ru9IIElVSoZLt0zmThVPRFBwUZ5SylP5VSRWUVd+WKtZ2lsIXDhdaV6bX89hBWI8 +Y3dktGX0ZzhohGnVayxsiW3sb1Vww3I0c6p1I3aeeBl5k3sMfIR99X9kgM6CLYOJhNyGJodriKGJ1Ir5 +jBuNL45Aj0WQSJE8kjKTGJP+lNyVspaKl1OYHZjlmaSaZJshm9ecj51EnfSepJ9Vn/+gqqFWofyio6NL +o/CklKU4pdymfacfp8KoYqkDqaWqRarlq4asJ6zHrWiuCq6rr02v77CSsTax27KAsyezzrR3tSG1zLZ5 +tye32LiKuT659rqwu2q8J7zkvaK+YL8ev93AnMFcwhzC3MOdxF7FIMXixqXHaMgryPDJtcp6y0DMB8zO +zZbOX88oz/PQvtGJ0lbTI9Px1MDVkNZi1zTYB9jb2bDah9te3DjdEt3t3sjfpOB/4VviN+MT4/DkzeWq +5ojnZuhG6SXqBuro68rsre2S7nfvXvBH8TDyHPMI8/j06fXc9tL3yvjF+cL6w/vG/ND92v7s//8AAAMJ +BboIZwrCDSsPghG8E/IWHxg5GkgcVB5VIEQiMyQTJeknuimHK00tCy7AMHEyHDO/NV829ziKOhs7pj0s +PrBALEGmQx9EkkYCR3JI3EpCS6pND05vT89RLVKKU+dVP1aYV+9ZRVqdW/NdSV6hX+thM2JzY61k42YS +Z0FoZ2mOaq5rz2zsbglvI3A9cVRybHOEdJx1tHbOd+d5A3ofez98Yn2Lfrl/8IEqgmyDsoT8hkuHnYjw +ikSLmYzsjj+PjJDWkh2TW5SXlceW85gWmTOaSJtVnFqdWp5Pn0SgKaEQoeuiwqOYpGClKaXtpqmnZqgf +qNKph6o5quWrk6xArOatja41rtevebAcsLyxWbH3spWzL7PJtGO0/LWTtiq2wrdWt+q4f7kUuaW6OLrL +u1277Lx9vQ69nr4tvry/TL/bwGjA98GGwhPCocMvw77ESsTYxWXF9MZ/xwzHmcgkyKXJJ8mpyizKpMsc +y5XMDsyFzPjNa83fzlPOxc81z6fQGNCK0PvRbNHe0lDSw9M206vUINSV1QvVhtYA1nzW+Nd61//YhNkK +2ZnaL9rG213cCty63WveI97d35fgUuEO4crih+NE5ALkw+WD5kXnCufP6JbpYOor6vrry+yd7XbuUe8w +8BXw+/Ht8uDz4PTl9fj3E/hE+X363vxa/gH//wAAbmRpbgAAAAAAAAMGAACogAAAUwAAADRAAACqQAAA +JpcAABLbAABQQAAAVEAAAj99AAI1egACxUsAAwB4AAIAAAADAAsAGQAsAEUAYwCHALEA4QEWAVEBkgHZ +AiYCeQLSAzEDlwQDBHYE7wVvBfUGgwcXB7IIUwj8CawKYgsgC+QMrw2BDloPORAfEQ0SBRMGFBEVJBZA +F2MYjhm/GvYcMh1xHrMf9SE1ImwjnSTJJfAnFig7KWMqjivBLP4uSC+jMRMymzRBNgo3+joWPGY+8EG8 +RNhIQEvvT95UCFhkXOxhlWZYaylv/XTKeYN+GoKOhxGLqJBOlP6Ztp5voyan1Kx0sQG1c7nGvfHB9cX7 +ygbOFNIi1izaMN4p4hTl7emv7Vbw3vRC93z6iP1g//8AAAAEAA8AIgA9AF8AiQC7APQBNAF8AcwCIgKB +AuYDUwPHBEIExAVOBd4GdgcUB7oIZgkaCdQKlQteDC0NAw3gDsQPrxCiEZwSnxOpFLsV0xbyGBcZQRpw +G6Mc2R4RH0oggyG3IuckEyU8JmQniyiyKd0rDCxBLYAuyTAhMYkzBjSbNkw4HToSPDA+fED8Q7FGmUmx +TPdQaFQAV7tbll+KY5RnrmvTb/p0H3g6fEOAMoQXiASL+I/yk/KX+JwBoA2kHKgrrDuwS7RYuGK8aMBo +xGvId8yI0J/UuNjS3OvhAOUQ6RftE/EC9OH4rfxi//8AAAABAAYADQAXACUANQBIAF8AeQCWALcA3AEE +ATABYQGVAc4CDAJOApUC4QMyA4gD5QRGBK4FHAWPBgkGigcQB54IMQjMCW0KFArDC3cMMgzzDbsOiA9a +EDIRFhIIEwgUFRUvFlYXhxjDGgkbVhyqHgMfYCC8IhIjYSSrJfMnOSiBKc0rHyx7LeQvXTDrMpE0VTY7 +OEg6gjzuP5NCckWCSMJMMk/QU5xXk1u1X/9kcGkGbb5ylneLfJqByoeDjcyUf5t4oo2plLBetru8eMFr +xirK7c+v1GnZFd2r4iXme+ql7pryUvXD+OT7qv4M//8AAGRlc2MAAAAAAAAAFUhQIExQMzA2NSBDYWxp +YnJhdGVkAAAAAAAAAAAVAEgAUAAgAEwAUAAzADAANgA1ACAAQwBhAGwAaQBiAHIAYQB0AGUAZAAAAAAV +SFAgTFAzMDY1IENhbGlicmF0ZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMDgAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbW9kAAAAAAAAIvAAACaQAAAAAMJtVwAAAAAAAAAAAAAAAAAAAAAAA + + + + + + + + + 200 + 25 + + + {645, 25} + {4, 2} + 1151868928 + NSActionCell + + -2080244224 + 0 + program crashes after launch + + 5 + 1211912703 + 0 + + + + 200 + 25 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 3 + MQA + + + + + + 268 + {{20, 170}, {565, 70}} + + YES + 3 + 1 + + YES + + -2080244224 + 0 + Leave breakpad alone before fork + + + 1211912703 + 0 + + + + 200 + 25 + + + 67239424 + 0 + Uninitialize Breakpad before fork + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + 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 +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + 67239424 + 0 + Call task_set_exception_port with null exception port in child process before exec + + + 2 + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + 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 +ArBYWVogAAAAAAAANWMAAJ/rAAAZsVhZWiAAAAAAAAAlzQAAE9UAALbFWFlaIAAAAAAAAPPYAAEAAAAB +FghzZjMyAAAAAAABC7cAAAWW///zVwAABykAAP3X///7t////aYAAAPaAADA9mN1cnYAAAAAAAAAAQHN +AABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAADAQAAAgAAAioENAYA +B9AJlAtRDQwOshBOEekTgxUVFqMYMRm9GzwcvR4+H7chLiKnJBoliCb3KGIpyCswLJMt9C9WMLIyDjNn +NL02FTdoOLs6ETtdPKw9+D9DQJBB1kMeRGZFq0bySDRJeEq6S/tNPk59T75Q+lI2U25Uo1XZVwlYOlln +WpZbwFzsXhdfQWBrYZRiv2PoZRNmPWdqaJhpyGr5bC1tZW6hb+BxLXJ+c9d1OHafeA55gnr5fHR98H9t +gOuCY4PYhUqGsIgSiWyKuIwBjTqObY+VkLORyJLUk9eU05XFlrWXlZh2mUuaG5rsm6ucbJ0qndqei588 +n9+ghKEqoceiYqL/o5qkLqTDpVml66Z7pwunnKgpqLWpQqnQqlqq5Ktvq/qsg60MrZauIa6qrzOvvbBH +sNGxXLHnsnKy/7OMtBm0p7U3tci2Wbbrt4C4FrituUa54rqAux27wbxlvQq9rr5Tvvi/ncBAwOXBisIu +wtPDeMQdxMLFaMYPxrXHXMgEyKzJVcn/yqnLVcwBzK7NXc4Mzr3PcNAk0NnRkdJK0wTTw9SC1UTWCtbR +153Ybdk+2hfa8dvM3KfdhN5g3zzgGuD34dbiteOV5HblWeY85yHoCOjw6drqxuu27Kbtm+6R74zwivGM +8pPzn/Sw9cj25/gP+T76e/u//Rr+hP//AAABpANzBRoGsggnCZsLFQx+Dd4PRRCiEf8TYxS0FgoXXRiu +GgQbTRyZHekfMCB8IcIjCSRSJZUm3SgdKWAqpCvjLSYuZC+lMOIyIDNgNJs12TcTOFA5izrEO/49NT5w +P6dA30IWQ01Eg0W4Ru9IIElVSoZLt0zmThVPRFBwUZ5SylP5VSRWUVd+WKtZ2lsIXDhdaV6bX89hBWI8 +Y3dktGX0ZzhohGnVayxsiW3sb1Vww3I0c6p1I3aeeBl5k3sMfIR99X9kgM6CLYOJhNyGJodriKGJ1Ir5 +jBuNL45Aj0WQSJE8kjKTGJP+lNyVspaKl1OYHZjlmaSaZJshm9ecj51EnfSepJ9Vn/+gqqFWofyio6NL +o/CklKU4pdymfacfp8KoYqkDqaWqRarlq4asJ6zHrWiuCq6rr02v77CSsTax27KAsyezzrR3tSG1zLZ5 +tye32LiKuT659rqwu2q8J7zkvaK+YL8ev93AnMFcwhzC3MOdxF7FIMXixqXHaMgryPDJtcp6y0DMB8zO +zZbOX88oz/PQvtGJ0lbTI9Px1MDVkNZi1zTYB9jb2bDah9te3DjdEt3t3sjfpOB/4VviN+MT4/DkzeWq +5ojnZuhG6SXqBuro68rsre2S7nfvXvBH8TDyHPMI8/j06fXc9tL3yvjF+cL6w/vG/ND92v7s//8AAAMJ +BboIZwrCDSsPghG8E/IWHxg5GkgcVB5VIEQiMyQTJeknuimHK00tCy7AMHEyHDO/NV829ziKOhs7pj0s +PrBALEGmQx9EkkYCR3JI3EpCS6pND05vT89RLVKKU+dVP1aYV+9ZRVqdW/NdSV6hX+thM2JzY61k42YS +Z0FoZ2mOaq5rz2zsbglvI3A9cVRybHOEdJx1tHbOd+d5A3ofez98Yn2Lfrl/8IEqgmyDsoT8hkuHnYjw +ikSLmYzsjj+PjJDWkh2TW5SXlceW85gWmTOaSJtVnFqdWp5Pn0SgKaEQoeuiwqOYpGClKaXtpqmnZqgf +qNKph6o5quWrk6xArOatja41rtevebAcsLyxWbH3spWzL7PJtGO0/LWTtiq2wrdWt+q4f7kUuaW6OLrL +u1277Lx9vQ69nr4tvry/TL/bwGjA98GGwhPCocMvw77ESsTYxWXF9MZ/xwzHmcgkyKXJJ8mpyizKpMsc +y5XMDsyFzPjNa83fzlPOxc81z6fQGNCK0PvRbNHe0lDSw9M206vUINSV1QvVhtYA1nzW+Nd61//YhNkK +2ZnaL9rG213cCty63WveI97d35fgUuEO4crih+NE5ALkw+WD5kXnCufP6JbpYOor6vrry+yd7XbuUe8w +8BXw+/Ht8uDz4PTl9fj3E/hE+X363vxa/gH//wAAbmRpbgAAAAAAAAMGAACogAAAUwAAADRAAACqQAAA +JpcAABLbAABQQAAAVEAAAj99AAI1egACxUsAAwB4AAIAAAADAAsAGQAsAEUAYwCHALEA4QEWAVEBkgHZ +AiYCeQLSAzEDlwQDBHYE7wVvBfUGgwcXB7IIUwj8CawKYgsgC+QMrw2BDloPORAfEQ0SBRMGFBEVJBZA +F2MYjhm/GvYcMh1xHrMf9SE1ImwjnSTJJfAnFig7KWMqjivBLP4uSC+jMRMymzRBNgo3+joWPGY+8EG8 +RNhIQEvvT95UCFhkXOxhlWZYaylv/XTKeYN+GoKOhxGLqJBOlP6Ztp5voyan1Kx0sQG1c7nGvfHB9cX7 +ygbOFNIi1izaMN4p4hTl7emv7Vbw3vRC93z6iP1g//8AAAAEAA8AIgA9AF8AiQC7APQBNAF8AcwCIgKB +AuYDUwPHBEIExAVOBd4GdgcUB7oIZgkaCdQKlQteDC0NAw3gDsQPrxCiEZwSnxOpFLsV0xbyGBcZQRpw +G6Mc2R4RH0oggyG3IuckEyU8JmQniyiyKd0rDCxBLYAuyTAhMYkzBjSbNkw4HToSPDA+fED8Q7FGmUmx +TPdQaFQAV7tbll+KY5RnrmvTb/p0H3g6fEOAMoQXiASL+I/yk/KX+JwBoA2kHKgrrDuwS7RYuGK8aMBo +xGvId8yI0J/UuNjS3OvhAOUQ6RftE/EC9OH4rfxi//8AAAABAAYADQAXACUANQBIAF8AeQCWALcA3AEE +ATABYQGVAc4CDAJOApUC4QMyA4gD5QRGBK4FHAWPBgkGigcQB54IMQjMCW0KFArDC3cMMgzzDbsOiA9a +EDIRFhIIEwgUFRUvFlYXhxjDGgkbVhyqHgMfYCC8IhIjYSSrJfMnOSiBKc0rHyx7LeQvXTDrMpE0VTY7 +OEg6gjzuP5NCckWCSMJMMk/QU5xXk1u1X/9kcGkGbb5ylneLfJqByoeDjcyUf5t4oo2plLBetru8eMFr +xirK7c+v1GnZFd2r4iXme+ql7pryUvXD+OT7qv4M//8AAGRlc2MAAAAAAAAAFUhQIExQMzA2NSBDYWxp +YnJhdGVkAAAAAAAAAAAVAEgAUAAgAEwAUAAzADAANgA1ACAAQwBhAGwAaQBiAHIAYQB0AGUAZAAAAAAV +SFAgTFAzMDY1IENhbGlicmF0ZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMDgAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbW9kAAAAAAAAIvAAACaQAAAAAMJtVwAAAAAAAAAAAAAAAAAAAAAAA + + + + + + + + 400 + 75 + + + {565, 22} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + + + + + + + + 268 + {{20, 104}, {565, 38}} + + YES + 2 + 1 + + YES + + -2080244224 + 0 + fork() + + + 3 + 1211912703 + 0 + + + + 200 + 25 + + + 67239424 + 0 + vfork() + + + 4 + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + 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 +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + {565, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + + + + + + + + 268 + {{591, 59}, {178, 161}} + + YES + + 67239424 + 134217728 + Go! + + LucidaGrande + 10 + 16 + + + -2033434369 + 130 + + + 400 + 75 + + + + {787, 260} + + + {{0, 0}, {1440, 878}} + {1.79769e+308, 1.79769e+308} + + + + + YES + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + showHelp: + + + + 122 + + + + clearRecentDocuments: + + + + 127 + + + + terminate: + + + + 139 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + hideOtherApplications: + + + + 146 + + + + hide: + + + + 152 + + + + unhideAllApplications: + + + + 153 + + + + cut: + + + + 175 + + + + paste: + + + + 176 + + + + redo: + + + + 178 + + + + selectAll: + + + + 179 + + + + undo: + + + + 180 + + + + copy: + + + + 181 + + + + showGuessPanel: + + + + 188 + + + + checkSpelling: + + + + 190 + + + + toggleContinuousSpellChecking: + + + + 192 + + + + performClose: + + + + 193 + + + + delete: + + + + 195 + + + + performZoom: + + + + 198 + + + + performFindPanelAction: + + + + 199 + + + + performFindPanelAction: + + + + 200 + + + + performFindPanelAction: + + + + 201 + + + + performFindPanelAction: + + + + 202 + + + + centerSelectionInVisibleArea: + + + + 203 + + + + pasteAsPlainText: + + + + 205 + + + + crash: + + + + 208 + + + + window_ + + + + 209 + + + + crash: + + + + 211 + + + + crash: + + + + 213 + + + + forkTestOptions_ + + + + 241 + + + + forkTestOptions: + + + + 242 + + + + forkTestOptions: + + + + 243 + + + + forkTestOptions: + + + + 244 + + + + forkTestGo: + + + + 250 + + + + forkTestOptions: + + + + 261 + + + + forkTestOptions: + + + + 262 + + + + showForkTestWindow: + + + + 283 + + + + generateReportWithoutCrash: + + + + 327 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 21 + + + YES + + + + Window + + + 2 + + + YES + + + + + + + + + + 206 + + + YES + + + + + + 210 + + + YES + + + + + + 212 + + + YES + + + + + + 218 + + + YES + + + + + + 325 + + + YES + + + + + + 29 + + + YES + + + + + + + + MainMenu + + + 19 + + + YES + + + + + + 24 + + + YES + + + + + + + + + 5 + + + + + 23 + + + + + 92 + + + + + 197 + + + + + 56 + + + YES + + + + + + 57 + + + YES + + + + + + + + + + + + + + + + 58 + + + + + 129 + + + + + 131 + + + YES + + + + + + 130 + + + + + 134 + + + + + 136 + + + + + 143 + + + + + 144 + + + + + 145 + + + + + 149 + + + + + 150 + + + + + 196 + + + + + 83 + + + YES + + + + + + 81 + + + YES + + + + + + + + + + + + + + + + 72 + + + + + 73 + + + + + 74 + + + + + 75 + + + + + 77 + + + + + 78 + + + + + 79 + + + + + 80 + + + + + 82 + + + + + 112 + + + + + 124 + + + YES + + + + + + 125 + + + YES + + + + + + 126 + + + + + 103 + + + YES + + + + + + 106 + + + YES + + + + + + 111 + + + + + 163 + + + YES + + + + + + 169 + + + YES + + + + + + + + + + + + + + + + + 156 + + + + + 157 + + + + + 158 + + + + + 160 + + + + + 164 + + + + + 168 + + + YES + + + + + + 159 + + + YES + + + + + + + + + + 154 + + + + + 155 + + + + + 161 + + + + + 162 + + + + + 167 + + + + + 171 + + + + + 172 + + + + + 173 + + + + + 174 + + + + + 184 + + + YES + + + + + + 185 + + + YES + + + + + + + + 187 + + + + + 189 + + + + + 191 + + + + + 204 + + + + + 207 + + + Controller + + + 220 + + + YES + + + + Window (Window) + + + 221 + + + YES + + + + + + + + + 226 + + + YES + + + + + + + + + 227 + + + + + 228 + + + + + 272 + + + + + 232 + + + YES + + + + + + + + + 233 + + + + + 234 + + + + + 236 + + + + + 237 + + + YES + + + + + + + + 238 + + + + + 239 + + + + + 248 + + + YES + + + + + + 329 + + + + + 330 + + + + + 331 + + + + + 332 + + + + + 333 + + + + + 334 + + + + + 335 + + + + + 336 + + + + + 337 + + + + + + + YES + + YES + -3.IBPluginDependency + -3.ImportedFromIB2 + 103.IBPluginDependency + 103.ImportedFromIB2 + 106.IBPluginDependency + 106.ImportedFromIB2 + 111.IBPluginDependency + 111.ImportedFromIB2 + 112.IBPluginDependency + 112.ImportedFromIB2 + 124.IBPluginDependency + 124.ImportedFromIB2 + 125.IBPluginDependency + 125.ImportedFromIB2 + 126.IBPluginDependency + 126.ImportedFromIB2 + 129.IBPluginDependency + 129.ImportedFromIB2 + 130.IBPluginDependency + 130.ImportedFromIB2 + 131.IBPluginDependency + 131.ImportedFromIB2 + 134.IBPluginDependency + 134.ImportedFromIB2 + 136.IBPluginDependency + 136.ImportedFromIB2 + 143.IBPluginDependency + 143.ImportedFromIB2 + 144.IBPluginDependency + 144.ImportedFromIB2 + 145.IBPluginDependency + 145.ImportedFromIB2 + 149.IBPluginDependency + 149.ImportedFromIB2 + 150.IBPluginDependency + 150.ImportedFromIB2 + 154.IBPluginDependency + 154.ImportedFromIB2 + 155.IBPluginDependency + 155.ImportedFromIB2 + 156.IBPluginDependency + 156.ImportedFromIB2 + 157.IBPluginDependency + 157.ImportedFromIB2 + 158.IBPluginDependency + 158.ImportedFromIB2 + 159.IBPluginDependency + 159.ImportedFromIB2 + 160.IBPluginDependency + 160.ImportedFromIB2 + 161.IBPluginDependency + 161.ImportedFromIB2 + 162.IBPluginDependency + 162.ImportedFromIB2 + 163.IBPluginDependency + 163.ImportedFromIB2 + 164.IBPluginDependency + 164.ImportedFromIB2 + 167.IBPluginDependency + 167.ImportedFromIB2 + 168.IBPluginDependency + 168.ImportedFromIB2 + 169.IBPluginDependency + 169.ImportedFromIB2 + 171.IBPluginDependency + 171.ImportedFromIB2 + 172.IBPluginDependency + 172.ImportedFromIB2 + 173.IBPluginDependency + 173.ImportedFromIB2 + 174.IBPluginDependency + 174.ImportedFromIB2 + 184.IBPluginDependency + 184.ImportedFromIB2 + 185.IBPluginDependency + 185.ImportedFromIB2 + 187.IBPluginDependency + 187.ImportedFromIB2 + 189.IBPluginDependency + 189.ImportedFromIB2 + 19.IBPluginDependency + 19.ImportedFromIB2 + 191.IBPluginDependency + 191.ImportedFromIB2 + 196.IBPluginDependency + 196.ImportedFromIB2 + 197.IBPluginDependency + 197.ImportedFromIB2 + 2.IBPluginDependency + 2.ImportedFromIB2 + 204.IBPluginDependency + 204.ImportedFromIB2 + 206.IBPluginDependency + 206.ImportedFromIB2 + 207.ImportedFromIB2 + 21.IBEditorWindowLastContentRect + 21.IBPluginDependency + 21.IBWindowTemplateEditedContentRect + 21.ImportedFromIB2 + 21.windowTemplate.hasMinSize + 21.windowTemplate.minSize + 210.IBPluginDependency + 210.ImportedFromIB2 + 212.IBPluginDependency + 212.ImportedFromIB2 + 218.IBPluginDependency + 218.ImportedFromIB2 + 220.IBEditorWindowLastContentRect + 220.IBPluginDependency + 220.IBWindowTemplateEditedContentRect + 220.ImportedFromIB2 + 221.IBPluginDependency + 221.ImportedFromIB2 + 226.IBPluginDependency + 226.ImportedFromIB2 + 227.IBPluginDependency + 227.ImportedFromIB2 + 228.IBPluginDependency + 228.ImportedFromIB2 + 23.IBPluginDependency + 23.ImportedFromIB2 + 232.IBPluginDependency + 232.ImportedFromIB2 + 233.IBPluginDependency + 233.ImportedFromIB2 + 234.IBPluginDependency + 234.ImportedFromIB2 + 236.IBPluginDependency + 236.ImportedFromIB2 + 237.IBPluginDependency + 237.ImportedFromIB2 + 238.IBPluginDependency + 238.ImportedFromIB2 + 239.IBPluginDependency + 239.ImportedFromIB2 + 24.IBPluginDependency + 24.ImportedFromIB2 + 248.IBPluginDependency + 248.ImportedFromIB2 + 272.IBPluginDependency + 272.ImportedFromIB2 + 29.IBEditorWindowLastContentRect + 29.IBPluginDependency + 29.ImportedFromIB2 + 325.IBPluginDependency + 325.ImportedFromIB2 + 329.IBPluginDependency + 330.IBPluginDependency + 331.IBPluginDependency + 332.IBPluginDependency + 333.IBPluginDependency + 334.IBPluginDependency + 335.IBPluginDependency + 336.IBPluginDependency + 337.IBPluginDependency + 5.IBPluginDependency + 5.ImportedFromIB2 + 56.IBPluginDependency + 56.ImportedFromIB2 + 57.IBPluginDependency + 57.ImportedFromIB2 + 58.IBPluginDependency + 58.ImportedFromIB2 + 72.IBPluginDependency + 72.ImportedFromIB2 + 73.IBPluginDependency + 73.ImportedFromIB2 + 74.IBPluginDependency + 74.ImportedFromIB2 + 75.IBPluginDependency + 75.ImportedFromIB2 + 77.IBPluginDependency + 77.ImportedFromIB2 + 78.IBPluginDependency + 78.ImportedFromIB2 + 79.IBPluginDependency + 79.ImportedFromIB2 + 80.IBPluginDependency + 80.ImportedFromIB2 + 81.IBPluginDependency + 81.ImportedFromIB2 + 82.IBPluginDependency + 82.ImportedFromIB2 + 83.IBPluginDependency + 83.ImportedFromIB2 + 92.IBPluginDependency + 92.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + {{510, 1250}, {320, 188}} + com.apple.InterfaceBuilder.CocoaPlugin + {{510, 1250}, {320, 188}} + + + {213, 107} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{-55, 1287}, {787, 260}} + com.apple.InterfaceBuilder.CocoaPlugin + {{-55, 1287}, {787, 260}} + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{0, 1114}, {362, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + + YES + + + + + YES + + + YES + + + + 337 + + + + YES + + Controller + NSObject + + YES + + YES + crash: + forkTestGo: + forkTestOptions: + generateReportWithoutCrash: + showForkTestWindow: + + + YES + id + id + id + id + id + + + + YES + + YES + crash: + forkTestGo: + forkTestOptions: + generateReportWithoutCrash: + showForkTestWindow: + + + YES + + crash: + id + + + forkTestGo: + id + + + forkTestOptions: + id + + + generateReportWithoutCrash: + id + + + showForkTestWindow: + id + + + + + YES + + YES + forkTestOptions_ + window_ + + + YES + NSWindow + NSWindow + + + + YES + + YES + forkTestOptions_ + window_ + + + YES + + forkTestOptions_ + NSWindow + + + window_ + NSWindow + + + + + IBProjectSource + testapp/Controller.h + + + + Controller + NSObject + + IBUserSource + + + + + FirstResponder + NSObject + + IBUserSource + + + + + + YES + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSDocument + NSObject + + YES + + YES + printDocument: + revertDocumentToSaved: + runPageLayout: + saveDocument: + saveDocumentAs: + saveDocumentTo: + + + YES + id + id + id + id + id + id + + + + YES + + YES + printDocument: + revertDocumentToSaved: + runPageLayout: + saveDocument: + saveDocumentAs: + saveDocumentTo: + + + YES + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocument.h + + + + NSDocument + + IBFrameworkSource + AppKit.framework/Headers/NSDocumentScripting.h + + + + NSDocumentController + NSObject + + YES + + YES + clearRecentDocuments: + newDocument: + openDocument: + saveAllDocuments: + + + YES + id + id + id + id + + + + YES + + YES + clearRecentDocuments: + newDocument: + openDocument: + saveAllDocuments: + + + YES + + clearRecentDocuments: + id + + + newDocument: + id + + + openDocument: + id + + + saveAllDocuments: + id + + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocumentController.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSTableView + NSControl + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../../Breakpad.xcodeproj + 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + + + YES + {9, 8} + {7, 2} + + + + diff --git a/src/client/mac/testapp/Info.plist b/src/client/mac/testapp/Info.plist new file mode 100644 index 0000000..6094ec6 --- /dev/null +++ b/src/client/mac/testapp/Info.plist @@ -0,0 +1,55 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + bomb + CFBundleIdentifier + com.Google.BreakpadTest + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + BreakpadProductDisplay + Breakpad Tester + BreakpadProduct + Breakpad_Tester + BreakpadVersion + 1.2.3.4 + BreakpadReportInterval + 10 + BreakpadSkipConfirm + NO + BreakpadSendAndExit + YES + BreakpadRequestEmail + YES + BreakpadRequestComments + YES + BreakpadVendor + Foo Bar Corp, Incorporated, LTD, LLC + BreakpadServerParameters + + Param1 + Value1 + Param2 + Value2 + + LSUIElement + 1 + + diff --git a/src/client/mac/testapp/TestClass.h b/src/client/mac/testapp/TestClass.h new file mode 100644 index 0000000..e20b0e8 --- /dev/null +++ b/src/client/mac/testapp/TestClass.h @@ -0,0 +1,36 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +@interface TestClass : NSObject { +} + +- (void)wait; + +@end diff --git a/src/client/mac/testapp/TestClass.mm b/src/client/mac/testapp/TestClass.mm new file mode 100644 index 0000000..ed0a7ec --- /dev/null +++ b/src/client/mac/testapp/TestClass.mm @@ -0,0 +1,94 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +#import "TestClass.h" + +struct AStruct { + int x; + float y; + double z; +}; + +class InternalTestClass { + public: + InternalTestClass(int a) : a_(a) {} + ~InternalTestClass() {} + + void snooze(float a); + void snooze(int a); + int snooze(int a, float b); + + protected: + int a_; + AStruct s_; + + static void InternalFunction(AStruct &s); + static float kStaticFloatValue; +}; + +void InternalTestClass::snooze(float a) { + InternalFunction(s_); + sleep(a_ * a); +} + +void InternalTestClass::snooze(int a) { + InternalFunction(s_); + sleep(a_ * a); +} + +int InternalTestClass::snooze(int a, float b) { + InternalFunction(s_); + sleep(a_ * a * b); + + return 33; +} + +void InternalTestClass::InternalFunction(AStruct &s) { + s.x = InternalTestClass::kStaticFloatValue; +} + +float InternalTestClass::kStaticFloatValue = 42; + +static float PlainOldFunction() { + return 3.14145f; +} + +@implementation TestClass + +- (void)wait { + InternalTestClass t(10); + float z = PlainOldFunction(); + + while (1) { + t.snooze(z); + } +} + +@end diff --git a/src/client/mac/testapp/bomb.icns b/src/client/mac/testapp/bomb.icns new file mode 100644 index 0000000000000000000000000000000000000000..c360dbf618946920498958680eddb253a1ff677f GIT binary patch literal 23659 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 literal 0 HcmV?d00001 diff --git a/src/client/mac/testapp/crashInMain b/src/client/mac/testapp/crashInMain new file mode 100644 index 0000000000000000000000000000000000000000..03bb3172769307065261123d239ca253e4dbf1cf GIT binary patch literal 12588 zcmeI3&ubG=5XaxPtA<+JAU%kR28kz2qTs=UhejH-*dL*dP;BLOlWfzp`9-oREeHmd z9>P-e;6ZQV#j6Joo}^kqMD%YcXd#CRJp`mZSiiHoY0{=jPeNgaPTsuv@!s^4J#=CE zZTsi%6GDh~XdAQ>x`NFTRt0(kDrF>eJA6MpI)Y7Iymg~>rMeZUl+o~bv?)$C^*XF{ z?=dLdOCqJAFBp#P?Dy7BT@>Ou0#n_M8arDRWqZYkl<}fbNM)0*V}B1@I73Bj3uiP- zy$A9&`tJ`#Lrqye*!ADR?Z3{AvZPFChDMenQnuFjPzbfn_qplzf-@G=iH2wY89hEB z&LiCOk29$Mhfpa8h9V=Qjc?#8oTw8%XC?lmlush%Y$=nMh89cf&c3z2g91Jwj??Oj z$3bd;mvol%%nS|;-wpQ<)Nk)YfbK>Qy+~@l7hapk88Q&3XYd);r&v!yBTy1zO-i-Y z$KMztB%YxDpm-Nz#EmWqX7Iu#4L$j`w?J#4=#e>Gpdy?OSO-0XN6yhP6^^+3Oy z7kXHs=k*|=yRSp(E~iI2S!wixo|5snEC#Lx&{`^n=>8f-$+gssEfx(u6S%cogbWrY zzyz286JP>NfC(@GCcp&#AAwm>SvP-dnj2p0fm)gLi{&9tWzeshtIGTDZORw8JXX88 zsxGaReqqyD?L~8ye!r+{c-N>^snzkF*K=5`GX2fJv*!4$vb1;iD(hqBhTnEhdc}wUtKn@z*$lK)zdiB{OF(fym~odzsgbe9-$W;@7iMzlwNi^eL{Gk zDpZiNFaajO1egF5U;<2l2`~XBzyz286JP>IjzDc!j$G^9FcV+`On?b60Vco%m;e)C z0!)AjFaaiTNCGr}d;#OfFEFc2^Uq|zfgOO|g<)&2Pl!I)-LPpE;Erq4OhCl7X)a(A zb~_CW;3x0;X=Y%NY@GQ4XFhUmnu}h7tq8>)f3})z8cLvNcQKPDZCEU2&>u)M2G_ zFF@&B5-Ck}(X89``{VWc4IwN9^v-6Do$VDX_KJ&?$)ag!xwPXr*~32e=s;{Ad$^_1 z1NoZ$4@M>dQR>U2nx}S zaNr+%Q2$F%DThX4W8=*?a2rn4iC}#t{-l&oBISH3Taacvp{w=#*80m72nunLR!4k7 zc*&%9Nqg0QGs8op52J%ajnfAZptI3KFOuBn!fW%mP6p!bSk|$=!g>W7gOU(yQmUms z{>Bg?@dEXy#p&G>KRTnYR5bc@Ez##7?}Cqd@GkefUwZTP!|P|a3NP3DJL$Qo2YNO? z^sGX^*VBZ~4ngTGyGIY5+$9ovJTtGQ)0$bf`@8GTu}@c;J)`e*GAWDUJ7Ki1C6G(| zx@#0A56|(MiE`0Yv*CM3MaW=b0!)AjFaajO1egF5U;<3w{}Y%Om0fG+hqdRgKK52- zLt<^jR~Zg@txe_Qw>ISqT)wKu+Vrk&lz!r-z1E8+DuW?Wo5FX;L5*6PK71#!R9BL? z9&Xot)s+eRZmP07VeJKM=ggXQ4bF-;RO?2y^(ip(c{8KxdcHUKG;ipsn~1gwec<@F zpZlQnvC|$D!Uy$21t|*?U;<2l2`~XBzyz286JP>NfC(@GCUEWu9308HYn>Zr0!)Aj zFaajO1egF5U;<2l2`~XBzy!`nfaZ^TFxdPSv&uAuO!fxsFzgNtTl<4T48ZP$O|t+G z9GhkWVvbF70kg0@G%$d_g5#%|fil_Ha|?SeJ2uTlufkS@LgU<`>auCBn`XX)f`+nX z(JUooLd&Hv(JwK)P*4pTv!~EpDVLObKL4atsOQRTJefgKJVi;P(-9+`bk+qF$%2tj t=i*rvb~Yo`MKxJ6)uVhhx1bsMoWL$xP87|!VG1N^xEApL1m>I&e*k;r-N*m{ literal 0 HcmV?d00001 diff --git a/src/client/mac/testapp/main.m b/src/client/mac/testapp/main.m new file mode 100644 index 0000000..af2cc14 --- /dev/null +++ b/src/client/mac/testapp/main.m @@ -0,0 +1,33 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +int main(int argc, char *argv[]) { + return NSApplicationMain(argc, (const char**)argv); +} diff --git a/src/client/mac/tests/BreakpadFramework_Test.mm b/src/client/mac/tests/BreakpadFramework_Test.mm new file mode 100644 index 0000000..7a70133 --- /dev/null +++ b/src/client/mac/tests/BreakpadFramework_Test.mm @@ -0,0 +1,216 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// BreakpadFramework_Test.mm +// Test case file for Breakpad.h/mm. +// + +#import "GTMSenTestCase.h" +#import "Breakpad.h" + +#include + +@interface BreakpadFramework_Test : GTMTestCase { + @private + int last_exception_code_; + int last_exception_type_; + mach_port_t last_exception_thread_; + // We're not using Obj-C BOOL because we need to interop with + // Breakpad's callback. + bool shouldHandleException_; +} + +// This method is used by a callback used by test cases to determine +// whether to return true or false to Breakpad when handling an +// exception. +- (bool)shouldHandleException; +// This method returns a minimal dictionary that has what +// Breakpad needs to initialize. +- (NSMutableDictionary *)breakpadInitializationDictionary; +// This method is used by the exception handling callback +// to communicate to test cases the properites of the last +// exception. +- (void)setLastExceptionType:(int)type andCode:(int)code + andThread:(mach_port_t)thread; +@end + +// Callback for Breakpad exceptions +bool myBreakpadCallback(int exception_type, + int exception_code, + mach_port_t crashing_thread, + void *context); + +bool myBreakpadCallback(int exception_type, + int exception_code, + mach_port_t crashing_thread, + void *context) { + BreakpadFramework_Test *testCaseClass = + (BreakpadFramework_Test *)context; + [testCaseClass setLastExceptionType:exception_type + andCode:exception_code + andThread:crashing_thread]; + bool shouldHandleException = + [testCaseClass shouldHandleException]; + NSLog(@"Callback returning %d", shouldHandleException); + return shouldHandleException; +} +const int kNoLastExceptionCode = -1; +const int kNoLastExceptionType = -1; +const mach_port_t kNoLastExceptionThread = MACH_PORT_NULL; + +@implementation BreakpadFramework_Test +- (void) initializeExceptionStateVariables { + last_exception_code_ = kNoLastExceptionCode; + last_exception_type_ = kNoLastExceptionType; + last_exception_thread_ = kNoLastExceptionThread; +} + +- (NSMutableDictionary *)breakpadInitializationDictionary { + NSMutableDictionary *breakpadParams = + [NSMutableDictionary dictionaryWithCapacity:3]; + + [breakpadParams setObject:@"UnitTests" forKey:@BREAKPAD_PRODUCT]; + [breakpadParams setObject:@"1.0" forKey:@BREAKPAD_VERSION]; + [breakpadParams setObject:@"http://staging" forKey:@BREAKPAD_URL]; + return breakpadParams; +} + +- (bool)shouldHandleException { + return shouldHandleException_; +} + +- (void)setLastExceptionType:(int)type + andCode:(int)code + andThread:(mach_port_t)thread { + last_exception_type_ = type; + last_exception_code_ = code; + last_exception_thread_ = thread; +} + +// Test that the parameters mark required actually enable Breakpad to +// be initialized. +- (void)testBreakpadInstantiationWithRequiredParameters { + BreakpadRef b = BreakpadCreate([self breakpadInitializationDictionary]); + STAssertNotNULL(b, @"BreakpadCreate failed with required parameters"); + BreakpadRelease(b); +} + +// Test that Breakpad fails to initialize cleanly when required +// parameters are not present. +- (void)testBreakpadInstantiationWithoutRequiredParameters { + NSMutableDictionary *breakpadDictionary = + [self breakpadInitializationDictionary]; + + // Skip setting version, so that BreakpadCreate fails. + [breakpadDictionary removeObjectForKey:@BREAKPAD_VERSION]; + BreakpadRef b = BreakpadCreate(breakpadDictionary); + STAssertNULL(b, @"BreakpadCreate did not fail when missing a required" + " parameter!"); + + breakpadDictionary = [self breakpadInitializationDictionary]; + // Now test with no product + [breakpadDictionary removeObjectForKey:@BREAKPAD_PRODUCT]; + b = BreakpadCreate(breakpadDictionary); + STAssertNULL(b, @"BreakpadCreate did not fail when missing a required" + " parameter!"); + + breakpadDictionary = [self breakpadInitializationDictionary]; + // Now test with no URL + [breakpadDictionary removeObjectForKey:@BREAKPAD_URL]; + b = BreakpadCreate(breakpadDictionary); + STAssertNULL(b, @"BreakpadCreate did not fail when missing a required" + " parameter!"); + BreakpadRelease(b); +} + +// Test to ensure that when we call BreakpadAddUploadParameter, +// it's added to the dictionary correctly(this test depends on +// some internal details of Breakpad, namely, the special prefix +// that it uses to figure out which key/value pairs to upload). +- (void)testAddingBreakpadServerVariable { + NSMutableDictionary *breakpadDictionary = + [self breakpadInitializationDictionary]; + + BreakpadRef b = BreakpadCreate(breakpadDictionary); + STAssertNotNULL(b, @"BreakpadCreate failed with valid dictionary!"); + + BreakpadAddUploadParameter(b, + @"key", + @"value"); + + // Test that it did not add the key/value directly, e.g. without + // prepending the key with the prefix. + STAssertNil(BreakpadKeyValue(b, @"key"), + @"AddUploadParameter added key directly to dictionary" + " instead of prepending it!"); + + NSString *prependedKeyname = + [@BREAKPAD_SERVER_PARAMETER_PREFIX stringByAppendingString:@"key"]; + + STAssertEqualStrings(BreakpadKeyValue(b, prependedKeyname), + @"value", + @"Calling BreakpadAddUploadParameter did not prepend " + "key name"); + BreakpadRelease(b); +} + +// Test that when we do on-demand minidump generation, +// the exception code/type/thread are set properly. +- (void)testFilterCallbackReturnsFalse { + NSMutableDictionary *breakpadDictionary = + [self breakpadInitializationDictionary]; + + BreakpadRef b = BreakpadCreate(breakpadDictionary); + STAssertNotNULL(b, @"BreakpadCreate failed with valid dictionary!"); + BreakpadSetFilterCallback(b, &myBreakpadCallback, self); + + // This causes the callback to return false, meaning + // Breakpad won't take the exception + shouldHandleException_ = false; + + [self initializeExceptionStateVariables]; + STAssertEquals(last_exception_type_, kNoLastExceptionType, + @"Last exception type not initialized correctly."); + STAssertEquals(last_exception_code_, kNoLastExceptionCode, + @"Last exception code not initialized correctly."); + STAssertEquals(last_exception_thread_, kNoLastExceptionThread, + @"Last exception thread is not initialized correctly."); + + // Cause Breakpad's exception handler to be invoked. + BreakpadGenerateAndSendReport(b); + + STAssertEquals(last_exception_type_, 0, + @"Last exception type is not 0 for on demand"); + STAssertEquals(last_exception_code_, 0, + @"Last exception code is not 0 for on demand"); + STAssertEquals(last_exception_thread_, mach_thread_self(), + @"Last exception thread is not mach_thread_self() " + "for on demand"); +} + +@end diff --git a/src/client/mac/tests/crash_generation_server_test.cc b/src/client/mac/tests/crash_generation_server_test.cc new file mode 100644 index 0000000..743b268 --- /dev/null +++ b/src/client/mac/tests/crash_generation_server_test.cc @@ -0,0 +1,401 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// crash_generation_server_test.cc +// Unit tests for CrashGenerationServer + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "client/mac/crash_generation/client_info.h" +#include "client/mac/crash_generation/crash_generation_client.h" +#include "client/mac/crash_generation/crash_generation_server.h" +#include "client/mac/handler/exception_handler.h" +#include "client/mac/tests/spawn_child_process.h" +#include "common/tests/auto_tempdir.h" +#include "google_breakpad/processor/minidump.h" + +namespace google_breakpad { +// This acts as the log sink for INFO logging from the processor +// logging code. The logging output confuses XCode and makes it think +// there are unit test failures. testlogging.h handles the overriding. +std::ostringstream info_log; +} + +namespace { +using std::string; +using google_breakpad::AutoTempDir; +using google_breakpad::ClientInfo; +using google_breakpad::CrashGenerationClient; +using google_breakpad::CrashGenerationServer; +using google_breakpad::ExceptionHandler; +using google_breakpad::Minidump; +using google_breakpad::MinidumpContext; +using google_breakpad::MinidumpException; +using google_breakpad::MinidumpModule; +using google_breakpad::MinidumpModuleList; +using google_breakpad::MinidumpSystemInfo; +using google_breakpad::MinidumpThread; +using google_breakpad::MinidumpThreadList; +using testing::Test; +using namespace google_breakpad_test; + +class CrashGenerationServerTest : public Test { +public: + // The port name to receive messages on + char mach_port_name[128]; + // Filename of the last dump that was generated + string last_dump_name; + // PID of the child process + pid_t child_pid; + // A temp dir + AutoTempDir temp_dir; + // Counter just to ensure that we don't hit the same port again + static int i; + bool filter_callback_called; + + void SetUp() { + sprintf(mach_port_name, + "com.google.breakpad.ServerTest.%d.%d", getpid(), + CrashGenerationServerTest::i++); + child_pid = (pid_t)-1; + filter_callback_called = false; + } +}; +int CrashGenerationServerTest::i = 0; + +// Test that starting and stopping a server works +TEST_F(CrashGenerationServerTest, testStartStopServer) { + CrashGenerationServer server(mach_port_name, + NULL, // filter callback + NULL, // filter context + NULL, // dump callback + NULL, // dump context + NULL, // exit callback + NULL, // exit context + false, // generate dumps + ""); // dump path + ASSERT_TRUE(server.Start()); + ASSERT_TRUE(server.Stop()); +} + +// Test that requesting a dump via CrashGenerationClient works +// Test without actually dumping +TEST_F(CrashGenerationServerTest, testRequestDumpNoDump) { + CrashGenerationServer server(mach_port_name, + NULL, // filter callback + NULL, // filter context + NULL, // dump callback + NULL, // dump context + NULL, // exit callback + NULL, // exit context + false, // don't generate dumps + temp_dir.path()); // dump path + ASSERT_TRUE(server.Start()); + + pid_t pid = fork(); + ASSERT_NE(-1, pid); + if (pid == 0) { + CrashGenerationClient client(mach_port_name); + bool result = client.RequestDump(); + exit(result ? 0 : 1); + } + + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_TRUE(WIFEXITED(ret)); + EXPECT_EQ(0, WEXITSTATUS(ret)); + EXPECT_TRUE(server.Stop()); + // check that no minidump was written + string pattern = temp_dir.path() + "/*"; + glob_t dirContents; + ret = glob(pattern.c_str(), GLOB_NOSORT, NULL, &dirContents); + EXPECT_EQ(GLOB_NOMATCH, ret); + if (ret != GLOB_NOMATCH) + globfree(&dirContents); +} + +void dumpCallback(void* context, const ClientInfo& client_info, + const std::string& file_path) { + if (context) { + CrashGenerationServerTest* self = + reinterpret_cast(context); + if (!file_path.empty()) + self->last_dump_name = file_path; + self->child_pid = client_info.pid(); + } +} + +void* RequestDump(void* context) { + CrashGenerationClient client((const char*)context); + bool result = client.RequestDump(); + return (void*)(result ? 0 : 1); +} + +// Test that actually writing a minidump works +TEST_F(CrashGenerationServerTest, testRequestDump) { + CrashGenerationServer server(mach_port_name, + NULL, // filter callback + NULL, // filter context + dumpCallback, // dump callback + this, // dump context + NULL, // exit callback + NULL, // exit context + true, // generate dumps + temp_dir.path()); // dump path + ASSERT_TRUE(server.Start()); + + pid_t pid = fork(); + ASSERT_NE(-1, pid); + if (pid == 0) { + // Have to spawn off a separate thread to request the dump, + // because MinidumpGenerator assumes the handler thread is not + // the only thread + pthread_t thread; + if (pthread_create(&thread, NULL, RequestDump, (void*)mach_port_name) != 0) + exit(1); + void* result; + pthread_join(thread, &result); + exit(reinterpret_cast(result)); + } + + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_TRUE(WIFEXITED(ret)); + EXPECT_EQ(0, WEXITSTATUS(ret)); + EXPECT_TRUE(server.Stop()); + // check that minidump was written + ASSERT_FALSE(last_dump_name.empty()); + struct stat st; + EXPECT_EQ(0, stat(last_dump_name.c_str(), &st)); + EXPECT_LT(0, st.st_size); + // check client's PID + ASSERT_EQ(pid, child_pid); +} + +static void Crasher() { + int* a = (int*)0x42; + + fprintf(stdout, "Going to crash...\n"); + fprintf(stdout, "A = %d", *a); +} + +// Test that crashing a child process with an OOP ExceptionHandler installed +// results in a minidump being written by the CrashGenerationServer in +// the parent. +TEST_F(CrashGenerationServerTest, testChildProcessCrash) { + CrashGenerationServer server(mach_port_name, + NULL, // filter callback + NULL, // filter context + dumpCallback, // dump callback + this, // dump context + NULL, // exit callback + NULL, // exit context + true, // generate dumps + temp_dir.path()); // dump path + ASSERT_TRUE(server.Start()); + + pid_t pid = fork(); + ASSERT_NE(-1, pid); + if (pid == 0) { + // Instantiate an OOP exception handler. + ExceptionHandler eh("", NULL, NULL, NULL, true, mach_port_name); + Crasher(); + // not reached + exit(0); + } + + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_FALSE(WIFEXITED(ret)); + EXPECT_TRUE(server.Stop()); + // check that minidump was written + ASSERT_FALSE(last_dump_name.empty()); + struct stat st; + EXPECT_EQ(0, stat(last_dump_name.c_str(), &st)); + EXPECT_LT(0, st.st_size); + + // Read the minidump, sanity check some data. + Minidump minidump(last_dump_name.c_str()); + ASSERT_TRUE(minidump.Read()); + + MinidumpSystemInfo* system_info = minidump.GetSystemInfo(); + ASSERT_TRUE(system_info); + const MDRawSystemInfo* raw_info = system_info->system_info(); + ASSERT_TRUE(raw_info); + EXPECT_EQ(kNativeArchitecture, raw_info->processor_architecture); + + MinidumpThreadList* thread_list = minidump.GetThreadList(); + ASSERT_TRUE(thread_list); + ASSERT_EQ((unsigned int)1, thread_list->thread_count()); + + MinidumpThread* main_thread = thread_list->GetThreadAtIndex(0); + ASSERT_TRUE(main_thread); + MinidumpContext* context = main_thread->GetContext(); + ASSERT_TRUE(context); + EXPECT_EQ(kNativeContext, context->GetContextCPU()); + + MinidumpModuleList* module_list = minidump.GetModuleList(); + ASSERT_TRUE(module_list); + const MinidumpModule* main_module = module_list->GetMainModule(); + ASSERT_TRUE(main_module); + EXPECT_EQ(GetExecutablePath(), main_module->code_file()); +} + +#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6) && \ + (defined(__x86_64__) || defined(__i386__)) +// Test that crashing a child process of a different architecture +// produces a valid minidump. +TEST_F(CrashGenerationServerTest, testChildProcessCrashCrossArchitecture) { + CrashGenerationServer server(mach_port_name, + NULL, // filter callback + NULL, // filter context + dumpCallback, // dump callback + this, // dump context + NULL, // exit callback + NULL, // exit context + true, // generate dumps + temp_dir.path()); // dump path + ASSERT_TRUE(server.Start()); + + // Spawn a child process + string helper_path = GetHelperPath(); + const char* argv[] = { + helper_path.c_str(), + "crash", + mach_port_name, + NULL + }; + pid_t pid = spawn_child_process(argv); + ASSERT_NE(-1, pid); + + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_FALSE(WIFEXITED(ret)); + EXPECT_TRUE(server.Stop()); + // check that minidump was written + ASSERT_FALSE(last_dump_name.empty()); + struct stat st; + EXPECT_EQ(0, stat(last_dump_name.c_str(), &st)); + EXPECT_LT(0, st.st_size); + +const MDCPUArchitecture kExpectedArchitecture = +#if defined(__x86_64__) + MD_CPU_ARCHITECTURE_X86 +#elif defined(__i386__) + MD_CPU_ARCHITECTURE_AMD64 +#endif + ; +const uint32_t kExpectedContext = +#if defined(__i386__) + MD_CONTEXT_AMD64 +#elif defined(__x86_64__) + MD_CONTEXT_X86 +#endif + ; + + // Read the minidump, sanity check some data. + Minidump minidump(last_dump_name.c_str()); + ASSERT_TRUE(minidump.Read()); + + MinidumpSystemInfo* system_info = minidump.GetSystemInfo(); + ASSERT_TRUE(system_info); + const MDRawSystemInfo* raw_info = system_info->system_info(); + ASSERT_TRUE(raw_info); + EXPECT_EQ(kExpectedArchitecture, raw_info->processor_architecture); + + MinidumpThreadList* thread_list = minidump.GetThreadList(); + ASSERT_TRUE(thread_list); + ASSERT_EQ((unsigned int)1, thread_list->thread_count()); + + MinidumpThread* main_thread = thread_list->GetThreadAtIndex(0); + ASSERT_TRUE(main_thread); + MinidumpContext* context = main_thread->GetContext(); + ASSERT_TRUE(context); + EXPECT_EQ(kExpectedContext, context->GetContextCPU()); + + MinidumpModuleList* module_list = minidump.GetModuleList(); + ASSERT_TRUE(module_list); + const MinidumpModule* main_module = module_list->GetMainModule(); + ASSERT_TRUE(main_module); + EXPECT_EQ(helper_path, main_module->code_file()); +} +#endif + +bool filter_callback(void* context) { + CrashGenerationServerTest* self = + reinterpret_cast(context); + self->filter_callback_called = true; + // veto dump generation + return false; +} + +// Test that a filter callback can veto minidump writing. +TEST_F(CrashGenerationServerTest, testFilter) { + CrashGenerationServer server(mach_port_name, + filter_callback, // filter callback + this, // filter context + dumpCallback, // dump callback + this, // dump context + NULL, // exit callback + NULL, // exit context + true, // generate dumps + temp_dir.path()); // dump path + ASSERT_TRUE(server.Start()); + + pid_t pid = fork(); + ASSERT_NE(-1, pid); + if (pid == 0) { + // Instantiate an OOP exception handler. + ExceptionHandler eh("", NULL, NULL, NULL, true, mach_port_name); + Crasher(); + // not reached + exit(0); + } + + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_FALSE(WIFEXITED(ret)); + EXPECT_TRUE(server.Stop()); + + // check that no minidump was written + EXPECT_TRUE(last_dump_name.empty()); + EXPECT_TRUE(filter_callback_called); +} + +} // namespace diff --git a/src/client/mac/tests/exception_handler_test.cc b/src/client/mac/tests/exception_handler_test.cc new file mode 100644 index 0000000..91b931b --- /dev/null +++ b/src/client/mac/tests/exception_handler_test.cc @@ -0,0 +1,717 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// exception_handler_test.cc: Unit tests for google_breakpad::ExceptionHandler + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "client/mac/handler/exception_handler.h" +#include "common/linux/ignore_ret.h" +#include "common/mac/MachIPC.h" +#include "common/tests/auto_tempdir.h" +#include "google_breakpad/processor/minidump.h" + +namespace google_breakpad { +// This acts as the log sink for INFO logging from the processor +// logging code. The logging output confuses XCode and makes it think +// there are unit test failures. testlogging.h handles the overriding. +std::ostringstream info_log; +} + +namespace { +using std::string; +using google_breakpad::AutoTempDir; +using google_breakpad::ExceptionHandler; +using google_breakpad::MachPortSender; +using google_breakpad::MachReceiveMessage; +using google_breakpad::MachSendMessage; +using google_breakpad::Minidump; +using google_breakpad::MinidumpContext; +using google_breakpad::MinidumpException; +using google_breakpad::MinidumpMemoryList; +using google_breakpad::MinidumpMemoryRegion; +using google_breakpad::ReceivePort; +using testing::Test; + +class ExceptionHandlerTest : public Test { + public: + void InProcessCrash(bool aborting); + AutoTempDir tempDir; + string lastDumpName; +}; + +static void Crasher() { + int* a = (int*)0x42; + + fprintf(stdout, "Going to crash...\n"); + fprintf(stdout, "A = %d", *a); +} + +static void AbortCrasher() { + fprintf(stdout, "Going to crash...\n"); + abort(); +} + +static void SoonToCrash(void(*crasher)()) { + crasher(); +} + +static bool MDCallback(const char* dump_dir, const char* file_name, + void* context, bool success) { + string path(dump_dir); + path.append("/"); + path.append(file_name); + path.append(".dmp"); + + int fd = *reinterpret_cast(context); + IGNORE_RET(write(fd, path.c_str(), path.length() + 1)); + close(fd); + exit(0); + // not reached + return true; +} + +void ExceptionHandlerTest::InProcessCrash(bool aborting) { + // Give the child process a pipe to report back on. + int fds[2]; + ASSERT_EQ(0, pipe(fds)); + // Fork off a child process so it can crash. + pid_t pid = fork(); + if (pid == 0) { + // In the child process. + close(fds[0]); + ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL); + // crash + SoonToCrash(aborting ? &AbortCrasher : &Crasher); + // not reached + exit(1); + } + // In the parent process. + ASSERT_NE(-1, pid); + // Wait for the background process to return the minidump file. + close(fds[1]); + char minidump_file[PATH_MAX]; + ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file)); + ASSERT_NE(0, nbytes); + + Minidump minidump(minidump_file); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + ASSERT_TRUE(exception); + + const MDRawExceptionStream* raw_exception = exception->exception(); + ASSERT_TRUE(raw_exception); + + if (aborting) { + EXPECT_EQ(MD_EXCEPTION_MAC_SOFTWARE, + raw_exception->exception_record.exception_code); + EXPECT_EQ(MD_EXCEPTION_CODE_MAC_ABORT, + raw_exception->exception_record.exception_flags); + } else { + EXPECT_EQ(MD_EXCEPTION_MAC_BAD_ACCESS, + raw_exception->exception_record.exception_code); +#if defined(__x86_64__) + EXPECT_EQ(MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS, + raw_exception->exception_record.exception_flags); +#elif defined(__i386__) + EXPECT_EQ(MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE, + raw_exception->exception_record.exception_flags); +#endif + } + + const MinidumpContext* context = exception->GetContext(); + ASSERT_TRUE(context); + + uint64_t instruction_pointer; + ASSERT_TRUE(context->GetInstructionPointer(&instruction_pointer)); + + // Ideally would like to sanity check that abort() is on the stack + // but that's hard. + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(memory_list); + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionForAddress(instruction_pointer); + EXPECT_TRUE(region); + + // Child process should have exited with a zero status. + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_NE(0, WIFEXITED(ret)); + EXPECT_EQ(0, WEXITSTATUS(ret)); +} + +TEST_F(ExceptionHandlerTest, InProcess) { + InProcessCrash(false); +} + +TEST_F(ExceptionHandlerTest, InProcessAbort) { + InProcessCrash(true); +} + +static bool DumpNameMDCallback(const char* dump_dir, const char* file_name, + void* context, bool success) { + ExceptionHandlerTest* self = reinterpret_cast(context); + if (dump_dir && file_name) { + self->lastDumpName = dump_dir; + self->lastDumpName += "/"; + self->lastDumpName += file_name; + self->lastDumpName += ".dmp"; + } + return true; +} + +TEST_F(ExceptionHandlerTest, WriteMinidump) { + ExceptionHandler eh(tempDir.path(), NULL, DumpNameMDCallback, this, true, + NULL); + ASSERT_TRUE(eh.WriteMinidump()); + + // Ensure that minidump file exists and is > 0 bytes. + ASSERT_FALSE(lastDumpName.empty()); + struct stat st; + ASSERT_EQ(0, stat(lastDumpName.c_str(), &st)); + ASSERT_LT(0, st.st_size); + + // The minidump should not contain an exception stream. + Minidump minidump(lastDumpName); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + EXPECT_FALSE(exception); +} + +TEST_F(ExceptionHandlerTest, WriteMinidumpWithException) { + ExceptionHandler eh(tempDir.path(), NULL, DumpNameMDCallback, this, true, + NULL); + ASSERT_TRUE(eh.WriteMinidump(true)); + + // Ensure that minidump file exists and is > 0 bytes. + ASSERT_FALSE(lastDumpName.empty()); + struct stat st; + ASSERT_EQ(0, stat(lastDumpName.c_str(), &st)); + ASSERT_LT(0, st.st_size); + + // The minidump should contain an exception stream. + Minidump minidump(lastDumpName); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + ASSERT_TRUE(exception); + const MDRawExceptionStream* raw_exception = exception->exception(); + ASSERT_TRUE(raw_exception); + + EXPECT_EQ(MD_EXCEPTION_MAC_BREAKPOINT, + raw_exception->exception_record.exception_code); +} + +TEST_F(ExceptionHandlerTest, DumpChildProcess) { + const int kTimeoutMs = 2000; + // Create a mach port to receive the child task on. + char machPortName[128]; + sprintf(machPortName, "ExceptionHandlerTest.%d", getpid()); + ReceivePort parent_recv_port(machPortName); + + // Give the child process a pipe to block on. + int fds[2]; + ASSERT_EQ(0, pipe(fds)); + + // Fork off a child process to dump. + pid_t pid = fork(); + if (pid == 0) { + // In the child process + close(fds[1]); + + // Send parent process the task and thread ports. + MachSendMessage child_message(0); + child_message.AddDescriptor(mach_task_self()); + child_message.AddDescriptor(mach_thread_self()); + + MachPortSender child_sender(machPortName); + if (child_sender.SendMessage(child_message, kTimeoutMs) != KERN_SUCCESS) + exit(1); + + // Wait for the parent process. + uint8_t data; + read(fds[0], &data, 1); + exit(0); + } + // In the parent process. + ASSERT_NE(-1, pid); + close(fds[0]); + + // Read the child's task and thread ports. + MachReceiveMessage child_message; + ASSERT_EQ(KERN_SUCCESS, + parent_recv_port.WaitForMessage(&child_message, kTimeoutMs)); + mach_port_t child_task = child_message.GetTranslatedPort(0); + mach_port_t child_thread = child_message.GetTranslatedPort(1); + ASSERT_NE((mach_port_t)MACH_PORT_NULL, child_task); + ASSERT_NE((mach_port_t)MACH_PORT_NULL, child_thread); + + // Write a minidump of the child process. + bool result = ExceptionHandler::WriteMinidumpForChild(child_task, + child_thread, + tempDir.path(), + DumpNameMDCallback, + this); + ASSERT_EQ(true, result); + + // Ensure that minidump file exists and is > 0 bytes. + ASSERT_FALSE(lastDumpName.empty()); + struct stat st; + ASSERT_EQ(0, stat(lastDumpName.c_str(), &st)); + ASSERT_LT(0, st.st_size); + + // Unblock child process + uint8_t data = 1; + IGNORE_RET(write(fds[1], &data, 1)); + + // Child process should have exited with a zero status. + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_NE(0, WIFEXITED(ret)); + EXPECT_EQ(0, WEXITSTATUS(ret)); +} + +// Test that memory around the instruction pointer is written +// to the dump as a MinidumpMemoryRegion. +TEST_F(ExceptionHandlerTest, InstructionPointerMemory) { + // Give the child process a pipe to report back on. + int fds[2]; + ASSERT_EQ(0, pipe(fds)); + + // These are defined here so the parent can use them to check the + // data from the minidump afterwards. + const uint32_t kMemorySize = 256; // bytes + const int kOffset = kMemorySize / 2; + // This crashes with SIGILL on x86/x86-64/arm. + const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff }; + + pid_t pid = fork(); + if (pid == 0) { + close(fds[0]); + ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL); + // Get some executable memory. + char* memory = + reinterpret_cast(mmap(NULL, + kMemorySize, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANON, + -1, + 0)); + if (!memory) + exit(0); + + // Write some instructions that will crash. Put them in the middle + // of the block of memory, because the minidump should contain 128 + // bytes on either side of the instruction pointer. + memcpy(memory + kOffset, instructions, sizeof(instructions)); + + // Now execute the instructions, which should crash. + typedef void (*void_function)(void); + void_function memory_function = + reinterpret_cast(memory + kOffset); + memory_function(); + // not reached + exit(1); + } + // In the parent process. + ASSERT_NE(-1, pid); + close(fds[1]); + + // Wait for the background process to return the minidump file. + close(fds[1]); + char minidump_file[PATH_MAX]; + ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file)); + ASSERT_NE(0, nbytes); + // Ensure that minidump file exists and is > 0 bytes. + struct stat st; + ASSERT_EQ(0, stat(minidump_file, &st)); + ASSERT_LT(0, st.st_size); + + // Child process should have exited with a zero status. + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_NE(0, WIFEXITED(ret)); + EXPECT_EQ(0, WEXITSTATUS(ret)); + + // Read the minidump. Locate the exception record and the + // memory list, and then ensure that there is a memory region + // in the memory list that covers the instruction pointer from + // the exception record. + Minidump minidump(minidump_file); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(exception); + ASSERT_TRUE(memory_list); + ASSERT_NE((unsigned int)0, memory_list->region_count()); + + MinidumpContext* context = exception->GetContext(); + ASSERT_TRUE(context); + + uint64_t instruction_pointer; + ASSERT_TRUE(context->GetInstructionPointer(&instruction_pointer)); + + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionForAddress(instruction_pointer); + EXPECT_TRUE(region); + + EXPECT_EQ(kMemorySize, region->GetSize()); + const uint8_t* bytes = region->GetMemory(); + ASSERT_TRUE(bytes); + + uint8_t prefix_bytes[kOffset]; + uint8_t suffix_bytes[kMemorySize - kOffset - sizeof(instructions)]; + memset(prefix_bytes, 0, sizeof(prefix_bytes)); + memset(suffix_bytes, 0, sizeof(suffix_bytes)); + EXPECT_TRUE(memcmp(bytes, prefix_bytes, sizeof(prefix_bytes)) == 0); + EXPECT_TRUE(memcmp(bytes + kOffset, instructions, sizeof(instructions)) == 0); + EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(instructions), + suffix_bytes, sizeof(suffix_bytes)) == 0); +} + +// Test that the memory region around the instruction pointer is +// bounded correctly on the low end. +TEST_F(ExceptionHandlerTest, InstructionPointerMemoryMinBound) { + // Give the child process a pipe to report back on. + int fds[2]; + ASSERT_EQ(0, pipe(fds)); + + // These are defined here so the parent can use them to check the + // data from the minidump afterwards. + const uint32_t kMemorySize = 256; // bytes + const int kOffset = 0; + // This crashes with SIGILL on x86/x86-64/arm. + const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff }; + + pid_t pid = fork(); + if (pid == 0) { + close(fds[0]); + ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL); + // Get some executable memory. + char* memory = + reinterpret_cast(mmap(NULL, + kMemorySize, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANON, + -1, + 0)); + if (!memory) + exit(0); + + // Write some instructions that will crash. Put them at the start + // of the block of memory, to ensure that the memory bounding + // works properly. + memcpy(memory + kOffset, instructions, sizeof(instructions)); + + // Now execute the instructions, which should crash. + typedef void (*void_function)(void); + void_function memory_function = + reinterpret_cast(memory + kOffset); + memory_function(); + // not reached + exit(1); + } + // In the parent process. + ASSERT_NE(-1, pid); + close(fds[1]); + + // Wait for the background process to return the minidump file. + close(fds[1]); + char minidump_file[PATH_MAX]; + ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file)); + ASSERT_NE(0, nbytes); + // Ensure that minidump file exists and is > 0 bytes. + struct stat st; + ASSERT_EQ(0, stat(minidump_file, &st)); + ASSERT_LT(0, st.st_size); + + // Child process should have exited with a zero status. + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_NE(0, WIFEXITED(ret)); + EXPECT_EQ(0, WEXITSTATUS(ret)); + + // Read the minidump. Locate the exception record and the + // memory list, and then ensure that there is a memory region + // in the memory list that covers the instruction pointer from + // the exception record. + Minidump minidump(minidump_file); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(exception); + ASSERT_TRUE(memory_list); + ASSERT_NE((unsigned int)0, memory_list->region_count()); + + MinidumpContext* context = exception->GetContext(); + ASSERT_TRUE(context); + + uint64_t instruction_pointer; + ASSERT_TRUE(context->GetInstructionPointer(&instruction_pointer)); + + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionForAddress(instruction_pointer); + EXPECT_TRUE(region); + + EXPECT_EQ(kMemorySize / 2, region->GetSize()); + const uint8_t* bytes = region->GetMemory(); + ASSERT_TRUE(bytes); + + uint8_t suffix_bytes[kMemorySize / 2 - sizeof(instructions)]; + memset(suffix_bytes, 0, sizeof(suffix_bytes)); + EXPECT_TRUE(memcmp(bytes + kOffset, instructions, sizeof(instructions)) == 0); + EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(instructions), + suffix_bytes, sizeof(suffix_bytes)) == 0); +} + +// Test that the memory region around the instruction pointer is +// bounded correctly on the high end. +TEST_F(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) { + // Give the child process a pipe to report back on. + int fds[2]; + ASSERT_EQ(0, pipe(fds)); + + // These are defined here so the parent can use them to check the + // data from the minidump afterwards. + // Use 4k here because the OS will hand out a single page even + // if a smaller size is requested, and this test wants to + // test the upper bound of the memory range. + const uint32_t kMemorySize = 4096; // bytes + // This crashes with SIGILL on x86/x86-64/arm. + const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff }; + const int kOffset = kMemorySize - sizeof(instructions); + + pid_t pid = fork(); + if (pid == 0) { + close(fds[0]); + ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL); + // Get some executable memory. + char* memory = + reinterpret_cast(mmap(NULL, + kMemorySize, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANON, + -1, + 0)); + if (!memory) + exit(0); + + // Write some instructions that will crash. Put them at the start + // of the block of memory, to ensure that the memory bounding + // works properly. + memcpy(memory + kOffset, instructions, sizeof(instructions)); + + // Now execute the instructions, which should crash. + typedef void (*void_function)(void); + void_function memory_function = + reinterpret_cast(memory + kOffset); + memory_function(); + // not reached + exit(1); + } + // In the parent process. + ASSERT_NE(-1, pid); + close(fds[1]); + + // Wait for the background process to return the minidump file. + close(fds[1]); + char minidump_file[PATH_MAX]; + ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file)); + ASSERT_NE(0, nbytes); + // Ensure that minidump file exists and is > 0 bytes. + struct stat st; + ASSERT_EQ(0, stat(minidump_file, &st)); + ASSERT_LT(0, st.st_size); + + // Child process should have exited with a zero status. + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_NE(0, WIFEXITED(ret)); + EXPECT_EQ(0, WEXITSTATUS(ret)); + + // Read the minidump. Locate the exception record and the + // memory list, and then ensure that there is a memory region + // in the memory list that covers the instruction pointer from + // the exception record. + Minidump minidump(minidump_file); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(exception); + ASSERT_TRUE(memory_list); + ASSERT_NE((unsigned int)0, memory_list->region_count()); + + MinidumpContext* context = exception->GetContext(); + ASSERT_TRUE(context); + + uint64_t instruction_pointer; + ASSERT_TRUE(context->GetInstructionPointer(&instruction_pointer)); + + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionForAddress(instruction_pointer); + EXPECT_TRUE(region); + + const size_t kPrefixSize = 128; // bytes + EXPECT_EQ(kPrefixSize + sizeof(instructions), region->GetSize()); + const uint8_t* bytes = region->GetMemory(); + ASSERT_TRUE(bytes); + + uint8_t prefix_bytes[kPrefixSize]; + memset(prefix_bytes, 0, sizeof(prefix_bytes)); + EXPECT_TRUE(memcmp(bytes, prefix_bytes, sizeof(prefix_bytes)) == 0); + EXPECT_TRUE(memcmp(bytes + kPrefixSize, + instructions, sizeof(instructions)) == 0); +} + +// Ensure that an extra memory block doesn't get added when the +// instruction pointer is not in mapped memory. +TEST_F(ExceptionHandlerTest, InstructionPointerMemoryNullPointer) { + // Give the child process a pipe to report back on. + int fds[2]; + ASSERT_EQ(0, pipe(fds)); + + pid_t pid = fork(); + if (pid == 0) { + close(fds[0]); + ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL); + // Try calling a NULL pointer. + typedef void (*void_function)(void); + // Volatile markings are needed to keep Clang from generating invalid + // opcodes. See http://crbug.com/498354 for details. + volatile void_function memory_function = + reinterpret_cast(NULL); + memory_function(); + // not reached + exit(1); + } + // In the parent process. + ASSERT_NE(-1, pid); + close(fds[1]); + + // Wait for the background process to return the minidump file. + close(fds[1]); + char minidump_file[PATH_MAX]; + ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file)); + ASSERT_NE(0, nbytes); + // Ensure that minidump file exists and is > 0 bytes. + struct stat st; + ASSERT_EQ(0, stat(minidump_file, &st)); + ASSERT_LT(0, st.st_size); + + // Child process should have exited with a zero status. + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_NE(0, WIFEXITED(ret)); + EXPECT_EQ(0, WEXITSTATUS(ret)); + + // Read the minidump. Locate the exception record and the + // memory list, and then ensure that there is only one memory region + // in the memory list (the thread memory from the single thread). + Minidump minidump(minidump_file); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(exception); + ASSERT_TRUE(memory_list); + ASSERT_EQ((unsigned int)1, memory_list->region_count()); +} + +static void* Junk(void*) { + sleep(1000000); + return NULL; +} + +// Test that the memory list gets written correctly when multiple +// threads are running. +TEST_F(ExceptionHandlerTest, MemoryListMultipleThreads) { + // Give the child process a pipe to report back on. + int fds[2]; + ASSERT_EQ(0, pipe(fds)); + + pid_t pid = fork(); + if (pid == 0) { + close(fds[0]); + ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL); + + // Run an extra thread so >2 memory regions will be written. + pthread_t junk_thread; + if (pthread_create(&junk_thread, NULL, Junk, NULL) == 0) + pthread_detach(junk_thread); + + // Just crash. + Crasher(); + + // not reached + exit(1); + } + // In the parent process. + ASSERT_NE(-1, pid); + close(fds[1]); + + // Wait for the background process to return the minidump file. + close(fds[1]); + char minidump_file[PATH_MAX]; + ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file)); + ASSERT_NE(0, nbytes); + // Ensure that minidump file exists and is > 0 bytes. + struct stat st; + ASSERT_EQ(0, stat(minidump_file, &st)); + ASSERT_LT(0, st.st_size); + + // Child process should have exited with a zero status. + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_NE(0, WIFEXITED(ret)); + EXPECT_EQ(0, WEXITSTATUS(ret)); + + // Read the minidump, and verify that the memory list can be read. + Minidump minidump(minidump_file); + ASSERT_TRUE(minidump.Read()); + + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(memory_list); + // Verify that there are three memory regions: + // one per thread, and one for the instruction pointer memory. + ASSERT_EQ((unsigned int)3, memory_list->region_count()); +} + +} diff --git a/src/client/mac/tests/minidump_generator_test.cc b/src/client/mac/tests/minidump_generator_test.cc new file mode 100644 index 0000000..2606e14 --- /dev/null +++ b/src/client/mac/tests/minidump_generator_test.cc @@ -0,0 +1,323 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_generator_test.cc: Unit tests for google_breakpad::MinidumpGenerator + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#ifndef MAC_OS_X_VERSION_10_6 +#define MAC_OS_X_VERSION_10_6 1060 +#endif +#include +#include + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "client/mac/handler/minidump_generator.h" +#include "client/mac/tests/spawn_child_process.h" +#include "common/linux/ignore_ret.h" +#include "common/mac/MachIPC.h" +#include "common/tests/auto_tempdir.h" +#include "google_breakpad/processor/minidump.h" + +namespace google_breakpad { +// This acts as the log sink for INFO logging from the processor +// logging code. The logging output confuses XCode and makes it think +// there are unit test failures. testlogging.h handles the overriding. +std::ostringstream info_log; +} + +namespace { +using std::string; +using std::vector; +using google_breakpad::AutoTempDir; +using google_breakpad::MinidumpGenerator; +using google_breakpad::MachPortSender; +using google_breakpad::MachReceiveMessage; +using google_breakpad::MachSendMessage; +using google_breakpad::Minidump; +using google_breakpad::MinidumpContext; +using google_breakpad::MinidumpException; +using google_breakpad::MinidumpModule; +using google_breakpad::MinidumpModuleList; +using google_breakpad::MinidumpSystemInfo; +using google_breakpad::MinidumpThread; +using google_breakpad::MinidumpThreadList; +using google_breakpad::ReceivePort; +using testing::Test; +using namespace google_breakpad_test; + +class MinidumpGeneratorTest : public Test { + public: + AutoTempDir tempDir; +}; + +static void* Junk(void* data) { + bool* wait = reinterpret_cast(data); + while (!*wait) { + usleep(10000); + } + return NULL; +} + +TEST_F(MinidumpGeneratorTest, InProcess) { + MinidumpGenerator generator; + string dump_filename = + MinidumpGenerator::UniqueNameInDirectory(tempDir.path(), NULL); + + // Run an extra thread since MinidumpGenerator assumes there + // are 2 or more threads. + pthread_t junk_thread; + bool quit = false; + ASSERT_EQ(0, pthread_create(&junk_thread, NULL, Junk, &quit)); + + ASSERT_TRUE(generator.Write(dump_filename.c_str())); + // Ensure that minidump file exists and is > 0 bytes. + struct stat st; + ASSERT_EQ(0, stat(dump_filename.c_str(), &st)); + ASSERT_LT(0, st.st_size); + + // join the background thread + quit = true; + pthread_join(junk_thread, NULL); + + // Read the minidump, sanity check some data. + Minidump minidump(dump_filename.c_str()); + ASSERT_TRUE(minidump.Read()); + + MinidumpSystemInfo* system_info = minidump.GetSystemInfo(); + ASSERT_TRUE(system_info); + const MDRawSystemInfo* raw_info = system_info->system_info(); + ASSERT_TRUE(raw_info); + EXPECT_EQ(kNativeArchitecture, raw_info->processor_architecture); + + MinidumpThreadList* thread_list = minidump.GetThreadList(); + ASSERT_TRUE(thread_list); + ASSERT_EQ((unsigned int)1, thread_list->thread_count()); + + MinidumpThread* main_thread = thread_list->GetThreadAtIndex(0); + ASSERT_TRUE(main_thread); + MinidumpContext* context = main_thread->GetContext(); + ASSERT_TRUE(context); + EXPECT_EQ(kNativeContext, context->GetContextCPU()); + + MinidumpModuleList* module_list = minidump.GetModuleList(); + ASSERT_TRUE(module_list); + const MinidumpModule* main_module = module_list->GetMainModule(); + ASSERT_TRUE(main_module); + EXPECT_EQ(GetExecutablePath(), main_module->code_file()); +} + +TEST_F(MinidumpGeneratorTest, OutOfProcess) { + const int kTimeoutMs = 2000; + // Create a mach port to receive the child task on. + char machPortName[128]; + sprintf(machPortName, "MinidumpGeneratorTest.OutOfProcess.%d", getpid()); + ReceivePort parent_recv_port(machPortName); + + // Give the child process a pipe to block on. + int fds[2]; + ASSERT_EQ(0, pipe(fds)); + + // Fork off a child process to dump. + pid_t pid = fork(); + if (pid == 0) { + // In the child process + close(fds[1]); + + // Send parent process the task port. + MachSendMessage child_message(0); + child_message.AddDescriptor(mach_task_self()); + + MachPortSender child_sender(machPortName); + if (child_sender.SendMessage(child_message, kTimeoutMs) != KERN_SUCCESS) { + fprintf(stderr, "Error sending message from child process!\n"); + exit(1); + } + + // Wait for the parent process. + uint8_t data; + read(fds[0], &data, 1); + exit(0); + } + // In the parent process. + ASSERT_NE(-1, pid); + close(fds[0]); + + // Read the child's task port. + MachReceiveMessage child_message; + ASSERT_EQ(KERN_SUCCESS, + parent_recv_port.WaitForMessage(&child_message, kTimeoutMs)); + mach_port_t child_task = child_message.GetTranslatedPort(0); + ASSERT_NE((mach_port_t)MACH_PORT_NULL, child_task); + + // Write a minidump of the child process. + MinidumpGenerator generator(child_task, MACH_PORT_NULL); + string dump_filename = + MinidumpGenerator::UniqueNameInDirectory(tempDir.path(), NULL); + ASSERT_TRUE(generator.Write(dump_filename.c_str())); + + // Ensure that minidump file exists and is > 0 bytes. + struct stat st; + ASSERT_EQ(0, stat(dump_filename.c_str(), &st)); + ASSERT_LT(0, st.st_size); + + // Unblock child process + uint8_t data = 1; + IGNORE_RET(write(fds[1], &data, 1)); + + // Child process should have exited with a zero status. + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + EXPECT_NE(0, WIFEXITED(ret)); + EXPECT_EQ(0, WEXITSTATUS(ret)); + + // Read the minidump, sanity check some data. + Minidump minidump(dump_filename.c_str()); + ASSERT_TRUE(minidump.Read()); + + MinidumpSystemInfo* system_info = minidump.GetSystemInfo(); + ASSERT_TRUE(system_info); + const MDRawSystemInfo* raw_info = system_info->system_info(); + ASSERT_TRUE(raw_info); + EXPECT_EQ(kNativeArchitecture, raw_info->processor_architecture); + + MinidumpThreadList* thread_list = minidump.GetThreadList(); + ASSERT_TRUE(thread_list); + ASSERT_EQ((unsigned int)1, thread_list->thread_count()); + + MinidumpThread* main_thread = thread_list->GetThreadAtIndex(0); + ASSERT_TRUE(main_thread); + MinidumpContext* context = main_thread->GetContext(); + ASSERT_TRUE(context); + EXPECT_EQ(kNativeContext, context->GetContextCPU()); + + MinidumpModuleList* module_list = minidump.GetModuleList(); + ASSERT_TRUE(module_list); + const MinidumpModule* main_module = module_list->GetMainModule(); + ASSERT_TRUE(main_module); + EXPECT_EQ(GetExecutablePath(), main_module->code_file()); +} + +// This test fails on 10.5, but I don't have easy access to a 10.5 machine, +// so it's simpler to just limit it to 10.6 for now. +#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6) && \ + (defined(__x86_64__) || defined(__i386__)) + +TEST_F(MinidumpGeneratorTest, CrossArchitectureDump) { + const int kTimeoutMs = 5000; + // Create a mach port to receive the child task on. + char machPortName[128]; + sprintf(machPortName, + "MinidumpGeneratorTest.CrossArchitectureDump.%d", getpid()); + + ReceivePort parent_recv_port(machPortName); + + // Spawn a child process to dump. + string helper_path = GetHelperPath(); + const char* argv[] = { + helper_path.c_str(), + machPortName, + NULL + }; + pid_t pid = spawn_child_process(argv); + ASSERT_NE(-1, pid); + + // Read the child's task port. + MachReceiveMessage child_message; + ASSERT_EQ(KERN_SUCCESS, + parent_recv_port.WaitForMessage(&child_message, kTimeoutMs)); + mach_port_t child_task = child_message.GetTranslatedPort(0); + ASSERT_NE((mach_port_t)MACH_PORT_NULL, child_task); + + // Write a minidump of the child process. + MinidumpGenerator generator(child_task, MACH_PORT_NULL); + string dump_filename = + MinidumpGenerator::UniqueNameInDirectory(tempDir.path(), NULL); + ASSERT_TRUE(generator.Write(dump_filename.c_str())); + + // Ensure that minidump file exists and is > 0 bytes. + struct stat st; + ASSERT_EQ(0, stat(dump_filename.c_str(), &st)); + ASSERT_LT(0, st.st_size); + + // Kill child process. + kill(pid, SIGKILL); + + int ret; + ASSERT_EQ(pid, waitpid(pid, &ret, 0)); + +const MDCPUArchitecture kExpectedArchitecture = +#if defined(__x86_64__) + MD_CPU_ARCHITECTURE_X86 +#elif defined(__i386__) + MD_CPU_ARCHITECTURE_AMD64 +#endif + ; +const uint32_t kExpectedContext = +#if defined(__i386__) + MD_CONTEXT_AMD64 +#elif defined(__x86_64__) + MD_CONTEXT_X86 +#endif + ; + + // Read the minidump, sanity check some data. + Minidump minidump(dump_filename.c_str()); + ASSERT_TRUE(minidump.Read()); + + MinidumpSystemInfo* system_info = minidump.GetSystemInfo(); + ASSERT_TRUE(system_info); + const MDRawSystemInfo* raw_info = system_info->system_info(); + ASSERT_TRUE(raw_info); + EXPECT_EQ(kExpectedArchitecture, raw_info->processor_architecture); + + MinidumpThreadList* thread_list = minidump.GetThreadList(); + ASSERT_TRUE(thread_list); + ASSERT_EQ((unsigned int)1, thread_list->thread_count()); + + MinidumpThread* main_thread = thread_list->GetThreadAtIndex(0); + ASSERT_TRUE(main_thread); + MinidumpContext* context = main_thread->GetContext(); + ASSERT_TRUE(context); + EXPECT_EQ(kExpectedContext, context->GetContextCPU()); + + MinidumpModuleList* module_list = minidump.GetModuleList(); + ASSERT_TRUE(module_list); + const MinidumpModule* main_module = module_list->GetMainModule(); + ASSERT_TRUE(main_module); + EXPECT_EQ(helper_path, main_module->code_file()); +} +#endif // 10.6 && (x86-64 || i386) + +} diff --git a/src/client/mac/tests/minidump_generator_test_helper.cc b/src/client/mac/tests/minidump_generator_test_helper.cc new file mode 100644 index 0000000..8177eea --- /dev/null +++ b/src/client/mac/tests/minidump_generator_test_helper.cc @@ -0,0 +1,77 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_generator_test_helper.cc: A helper program that +// minidump_generator_test.cc can launch to test certain things +// that require a separate executable. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "client/mac/handler/exception_handler.h" +#include "common/mac/MachIPC.h" + +using google_breakpad::MachPortSender; +using google_breakpad::MachReceiveMessage; +using google_breakpad::MachSendMessage; +using google_breakpad::ReceivePort; + +int main(int argc, char** argv) { + if (argc < 2) + return 1; + + if (strcmp(argv[1], "crash") != 0) { + const int kTimeoutMs = 2000; + // Send parent process the task and thread ports. + MachSendMessage child_message(0); + child_message.AddDescriptor(mach_task_self()); + child_message.AddDescriptor(mach_thread_self()); + + MachPortSender child_sender(argv[1]); + if (child_sender.SendMessage(child_message, kTimeoutMs) != KERN_SUCCESS) { + fprintf(stderr, "Error sending message from child process!\n"); + exit(1); + } + + // Loop forever. + while (true) { + sleep(100); + } + } else if (argc == 3 && strcmp(argv[1], "crash") == 0) { + // Instantiate an OOP exception handler + google_breakpad::ExceptionHandler eh("", NULL, NULL, NULL, true, argv[2]); + // and crash. + int *a = (int*)0x42; + *a = 1; + } + + return 0; +} diff --git a/src/client/mac/tests/spawn_child_process.h b/src/client/mac/tests/spawn_child_process.h new file mode 100644 index 0000000..cc80451 --- /dev/null +++ b/src/client/mac/tests/spawn_child_process.h @@ -0,0 +1,148 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Utility functions for spawning a helper process using a different +// CPU architecture. + +#ifndef GOOGLE_BREAKPAD_CLIENT_MAC_TESTS_SPAWN_CHILD_PROCESS +#define GOOGLE_BREAKPAD_CLIENT_MAC_TESTS_SPAWN_CHILD_PROCESS + +#include +#ifndef MAC_OS_X_VERSION_10_6 +#define MAC_OS_X_VERSION_10_6 1060 +#endif +#include +#include +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 +#include +#endif + +#include +#include + +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad_test { + +using std::string; +using std::vector; + +const MDCPUArchitecture kNativeArchitecture = +#if defined(__i386__) + MD_CPU_ARCHITECTURE_X86 +#elif defined(__x86_64__) + MD_CPU_ARCHITECTURE_AMD64 +#elif defined(__ppc__) || defined(__ppc64__) + MD_CPU_ARCHITECTURE_PPC +#else +#error "This file has not been ported to this CPU architecture." +#endif + ; + +const uint32_t kNativeContext = +#if defined(__i386__) + MD_CONTEXT_X86 +#elif defined(__x86_64__) + MD_CONTEXT_AMD64 +#elif defined(__ppc__) || defined(__ppc64__) + MD_CONTEXT_PPC +#else +#error "This file has not been ported to this CPU architecture." +#endif + ; + +string GetExecutablePath() { + char self_path[PATH_MAX]; + uint32_t size = sizeof(self_path); + if (_NSGetExecutablePath(self_path, &size) != 0) + return ""; + return self_path; +} + +string GetHelperPath() { + string helper_path(GetExecutablePath()); + size_t pos = helper_path.rfind('/'); + if (pos == string::npos) + return ""; + + helper_path.erase(pos + 1); + helper_path += "minidump_generator_test_helper"; + return helper_path; +} + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + +pid_t spawn_child_process(const char** argv) { + posix_spawnattr_t spawnattr; + if (posix_spawnattr_init(&spawnattr) != 0) + return (pid_t)-1; + + cpu_type_t pref_cpu_types[2] = { +#if defined(__x86_64__) + CPU_TYPE_X86, +#elif defined(__i386__) + CPU_TYPE_X86_64, +#endif + CPU_TYPE_ANY + }; + + // Set spawn attributes. + size_t attr_count = sizeof(pref_cpu_types) / sizeof(pref_cpu_types[0]); + size_t attr_ocount = 0; + if (posix_spawnattr_setbinpref_np(&spawnattr, + attr_count, + pref_cpu_types, + &attr_ocount) != 0 || + attr_ocount != attr_count) { + posix_spawnattr_destroy(&spawnattr); + return (pid_t)-1; + } + + // Create an argv array. + vector argv_v; + while (*argv) { + argv_v.push_back(strdup(*argv)); + argv++; + } + argv_v.push_back(NULL); + pid_t new_pid = 0; + int result = posix_spawnp(&new_pid, argv_v[0], NULL, &spawnattr, + &argv_v[0], *_NSGetEnviron()); + posix_spawnattr_destroy(&spawnattr); + + for (unsigned i = 0; i < argv_v.size(); i++) { + free(argv_v[i]); + } + + return result == 0 ? new_pid : -1; +} +#endif + +} // namespace google_breakpad_test + +#endif // GOOGLE_BREAKPAD_CLIENT_MAC_TESTS_SPAWN_CHILD_PROCESS diff --git a/src/client/mac/tests/testlogging.h b/src/client/mac/tests/testlogging.h new file mode 100644 index 0000000..c6b6be6 --- /dev/null +++ b/src/client/mac/tests/testlogging.h @@ -0,0 +1,9 @@ +// This file exists to override the processor logging for unit tests, +// since it confuses XCode into thinking unit tests have failed. +#include + +namespace google_breakpad { +extern std::ostringstream info_log; +} + +#define BPLOG_INFO_STREAM google_breakpad::info_log diff --git a/src/client/minidump_file_writer-inl.h b/src/client/minidump_file_writer-inl.h new file mode 100644 index 0000000..d95f355 --- /dev/null +++ b/src/client/minidump_file_writer-inl.h @@ -0,0 +1,96 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_file_writer-inl.h: Minidump file writer implementation. +// +// See minidump_file_writer.h for documentation. + +#ifndef CLIENT_MINIDUMP_FILE_WRITER_INL_H__ +#define CLIENT_MINIDUMP_FILE_WRITER_INL_H__ + +#include + +#include "client/minidump_file_writer.h" +#include "google_breakpad/common/minidump_size.h" + +namespace google_breakpad { + +template +inline bool TypedMDRVA::Allocate() { + allocation_state_ = SINGLE_OBJECT; + return UntypedMDRVA::Allocate(minidump_size::size()); +} + +template +inline bool TypedMDRVA::Allocate(size_t additional) { + allocation_state_ = SINGLE_OBJECT; + return UntypedMDRVA::Allocate(minidump_size::size() + additional); +} + +template +inline bool TypedMDRVA::AllocateArray(size_t count) { + assert(count); + allocation_state_ = ARRAY; + return UntypedMDRVA::Allocate(minidump_size::size() * count); +} + +template +inline bool TypedMDRVA::AllocateObjectAndArray(size_t count, + size_t length) { + assert(count && length); + allocation_state_ = SINGLE_OBJECT_WITH_ARRAY; + return UntypedMDRVA::Allocate(minidump_size::size() + count * length); +} + +template +inline bool TypedMDRVA::CopyIndex(unsigned int index, MDType* item) { + assert(allocation_state_ == ARRAY); + return writer_->Copy( + static_cast(position_ + index * minidump_size::size()), + item, minidump_size::size()); +} + +template +inline bool TypedMDRVA::CopyIndexAfterObject(unsigned int index, + const void* src, + size_t length) { + assert(allocation_state_ == SINGLE_OBJECT_WITH_ARRAY); + return writer_->Copy( + static_cast(position_ + minidump_size::size() + + index * length), + src, length); +} + +template +inline bool TypedMDRVA::Flush() { + return writer_->Copy(position_, &data_, minidump_size::size()); +} + +} // namespace google_breakpad + +#endif // CLIENT_MINIDUMP_FILE_WRITER_INL_H__ diff --git a/src/client/minidump_file_writer.cc b/src/client/minidump_file_writer.cc new file mode 100644 index 0000000..c00af36 --- /dev/null +++ b/src/client/minidump_file_writer.cc @@ -0,0 +1,353 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_file_writer.cc: Minidump file writer implementation. +// +// See minidump_file_writer.h for documentation. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include + +#include "client/minidump_file_writer-inl.h" +#include "common/linux/linux_libc_support.h" +#include "common/string_conversion.h" +#if defined(__linux__) && __linux__ +#include "third_party/lss/linux_syscall_support.h" +#endif + +#if defined(__ANDROID__) +#include + +namespace { + +bool g_need_ftruncate_workaround = false; +bool g_checked_need_ftruncate_workaround = false; + +void CheckNeedsFTruncateWorkAround(int file) { + if (g_checked_need_ftruncate_workaround) { + return; + } + g_checked_need_ftruncate_workaround = true; + + // Attempt an idempotent truncate that chops off nothing and see if we + // run into any sort of errors. + off_t offset = sys_lseek(file, 0, SEEK_END); + if (offset == -1) { + // lseek failed. Don't apply work around. It's unlikely that we can write + // to a minidump with either method. + return; + } + + int result = ftruncate(file, offset); + if (result == -1 && errno == EACCES) { + // It very likely that we are running into the kernel bug in M devices. + // We are going to deploy the workaround for writing minidump files + // without uses of ftruncate(). This workaround should be fine even + // for kernels without the bug. + // See http://crbug.com/542840 for more details. + g_need_ftruncate_workaround = true; + } +} + +bool NeedsFTruncateWorkAround() { + return g_need_ftruncate_workaround; +} + +} // namespace +#endif // defined(__ANDROID__) + +namespace google_breakpad { + +const MDRVA MinidumpFileWriter::kInvalidMDRVA = static_cast(-1); + +MinidumpFileWriter::MinidumpFileWriter() + : file_(-1), + close_file_when_destroyed_(true), + position_(0), + size_(0) { +} + +MinidumpFileWriter::~MinidumpFileWriter() { + if (close_file_when_destroyed_) + Close(); +} + +bool MinidumpFileWriter::Open(const char* path) { + assert(file_ == -1); +#if defined(__linux__) && __linux__ + file_ = sys_open(path, O_WRONLY | O_CREAT | O_EXCL, 0600); +#else + file_ = open(path, O_WRONLY | O_CREAT | O_EXCL, 0600); +#endif + + return file_ != -1; +} + +void MinidumpFileWriter::SetFile(const int file) { + assert(file_ == -1); + file_ = file; + close_file_when_destroyed_ = false; +#if defined(__ANDROID__) + CheckNeedsFTruncateWorkAround(file); +#endif +} + +bool MinidumpFileWriter::Close() { + bool result = true; + + if (file_ != -1) { +#if defined(__ANDROID__) + if (!NeedsFTruncateWorkAround() && ftruncate(file_, position_)) { + return false; + } +#else + if (ftruncate(file_, position_)) { + return false; + } +#endif +#if defined(__linux__) && __linux__ + result = (sys_close(file_) == 0); +#else + result = (close(file_) == 0); +#endif + file_ = -1; + } + + return result; +} + +bool MinidumpFileWriter::CopyStringToMDString(const wchar_t* str, + unsigned int length, + TypedMDRVA* mdstring) { + bool result = true; + if (sizeof(wchar_t) == sizeof(uint16_t)) { + // Shortcut if wchar_t is the same size as MDString's buffer + result = mdstring->Copy(str, mdstring->get()->length); + } else { + uint16_t out[2]; + int out_idx = 0; + + // Copy the string character by character + while (length && result) { + UTF32ToUTF16Char(*str, out); + if (!out[0]) + return false; + + // Process one character at a time + --length; + ++str; + + // Append the one or two UTF-16 characters. The first one will be non- + // zero, but the second one may be zero, depending on the conversion from + // UTF-32. + int out_count = out[1] ? 2 : 1; + size_t out_size = sizeof(uint16_t) * out_count; + result = mdstring->CopyIndexAfterObject(out_idx, out, out_size); + out_idx += out_count; + } + } + return result; +} + +bool MinidumpFileWriter::CopyStringToMDString(const char* str, + unsigned int length, + TypedMDRVA* mdstring) { + bool result = true; + uint16_t out[2]; + int out_idx = 0; + + // Copy the string character by character + while (length && result) { + int conversion_count = UTF8ToUTF16Char(str, length, out); + if (!conversion_count) + return false; + + // Move the pointer along based on the nubmer of converted characters + length -= conversion_count; + str += conversion_count; + + // Append the one or two UTF-16 characters + int out_count = out[1] ? 2 : 1; + size_t out_size = sizeof(uint16_t) * out_count; + result = mdstring->CopyIndexAfterObject(out_idx, out, out_size); + out_idx += out_count; + } + return result; +} + +template +bool MinidumpFileWriter::WriteStringCore(const CharType* str, + unsigned int length, + MDLocationDescriptor* location) { + assert(str); + assert(location); + // Calculate the mdstring length by either limiting to |length| as passed in + // or by finding the location of the NULL character. + unsigned int mdstring_length = 0; + if (!length) + length = INT_MAX; + for (; mdstring_length < length && str[mdstring_length]; ++mdstring_length) + ; + + // Allocate the string buffer + TypedMDRVA mdstring(this); + if (!mdstring.AllocateObjectAndArray(mdstring_length + 1, sizeof(uint16_t))) + return false; + + // Set length excluding the NULL and copy the string + mdstring.get()->length = + static_cast(mdstring_length * sizeof(uint16_t)); + bool result = CopyStringToMDString(str, mdstring_length, &mdstring); + + // NULL terminate + if (result) { + uint16_t ch = 0; + result = mdstring.CopyIndexAfterObject(mdstring_length, &ch, sizeof(ch)); + + if (result) + *location = mdstring.location(); + } + + return result; +} + +bool MinidumpFileWriter::WriteString(const wchar_t* str, unsigned int length, + MDLocationDescriptor* location) { + return WriteStringCore(str, length, location); +} + +bool MinidumpFileWriter::WriteString(const char* str, unsigned int length, + MDLocationDescriptor* location) { + return WriteStringCore(str, length, location); +} + +bool MinidumpFileWriter::WriteMemory(const void* src, size_t size, + MDMemoryDescriptor* output) { + assert(src); + assert(output); + UntypedMDRVA mem(this); + + if (!mem.Allocate(size)) + return false; + if (!mem.Copy(src, mem.size())) + return false; + + output->start_of_memory_range = reinterpret_cast(src); + output->memory = mem.location(); + + return true; +} + +MDRVA MinidumpFileWriter::Allocate(size_t size) { + assert(size); + assert(file_ != -1); +#if defined(__ANDROID__) + if (NeedsFTruncateWorkAround()) { + // If ftruncate() is not available. We simply increase the size beyond the + // current file size. sys_write() will expand the file when data is written + // to it. Because we did not over allocate to fit memory pages, we also + // do not need to ftruncate() the file once we are done. + size_ += size; + + // We don't need to seek since the file is unchanged. + MDRVA current_position = position_; + position_ += static_cast(size); + return current_position; + } +#endif + size_t aligned_size = (size + 7) & ~7; // 64-bit alignment + + if (position_ + aligned_size > size_) { + size_t growth = aligned_size; + size_t minimal_growth = getpagesize(); + + // Ensure that the file grows by at least the size of a memory page + if (growth < minimal_growth) + growth = minimal_growth; + + size_t new_size = size_ + growth; + if (ftruncate(file_, new_size) != 0) + return kInvalidMDRVA; + + size_ = new_size; + } + + MDRVA current_position = position_; + position_ += static_cast(aligned_size); + + return current_position; +} + +bool MinidumpFileWriter::Copy(MDRVA position, const void* src, ssize_t size) { + assert(src); + assert(size); + assert(file_ != -1); + + // Ensure that the data will fit in the allocated space + if (static_cast(size + position) > size_) + return false; + + // Seek and write the data +#if defined(__linux__) && __linux__ + if (sys_lseek(file_, position, SEEK_SET) == static_cast(position)) { + if (sys_write(file_, src, size) == size) { + return true; + } + } +#else + if (lseek(file_, position, SEEK_SET) == static_cast(position)) { + if (write(file_, src, size) == size) { + return true; + } + } +#endif + return false; +} + +bool UntypedMDRVA::Allocate(size_t size) { + assert(size_ == 0); + size_ = size; + position_ = writer_->Allocate(size_); + return position_ != MinidumpFileWriter::kInvalidMDRVA; +} + +bool UntypedMDRVA::Copy(MDRVA pos, const void* src, size_t size) { + assert(src); + assert(size); + assert(pos + size <= position_ + size_); + return writer_->Copy(pos, src, size); +} + +} // namespace google_breakpad diff --git a/src/client/minidump_file_writer.h b/src/client/minidump_file_writer.h new file mode 100644 index 0000000..253a93a --- /dev/null +++ b/src/client/minidump_file_writer.h @@ -0,0 +1,271 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_file_writer.h: Implements file-based minidump generation. It's +// intended to be used with the Google Breakpad open source crash handling +// project. + +#ifndef CLIENT_MINIDUMP_FILE_WRITER_H__ +#define CLIENT_MINIDUMP_FILE_WRITER_H__ + +#include + +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +class UntypedMDRVA; +template class TypedMDRVA; + +// The user of this class can Open() a file and add minidump streams, data, and +// strings using the definitions in minidump_format.h. Since this class is +// expected to be used in a situation where the current process may be +// damaged, it will not allocate heap memory. +// Sample usage: +// MinidumpFileWriter writer; +// writer.Open("/tmp/minidump.dmp"); +// TypedMDRVA header(&writer_); +// header.Allocate(); +// header->get()->signature = MD_HEADER_SIGNATURE; +// : +// writer.Close(); +// +// An alternative is to use SetFile and provide a file descriptor: +// MinidumpFileWriter writer; +// writer.SetFile(minidump_fd); +// TypedMDRVA header(&writer_); +// header.Allocate(); +// header->get()->signature = MD_HEADER_SIGNATURE; +// : +// writer.Close(); + +class MinidumpFileWriter { +public: + // Invalid MDRVA (Minidump Relative Virtual Address) + // returned on failed allocation + static const MDRVA kInvalidMDRVA; + + MinidumpFileWriter(); + ~MinidumpFileWriter(); + + // Open |path| as the destination of the minidump data. If |path| already + // exists, then Open() will fail. + // Return true on success, or false on failure. + bool Open(const char* path); + + // Sets the file descriptor |file| as the destination of the minidump data. + // Can be used as an alternative to Open() when a file descriptor is + // available. + // Note that |fd| is not closed when the instance of MinidumpFileWriter is + // destroyed. + void SetFile(const int file); + + // Close the current file (that was either created when Open was called, or + // specified with SetFile). + // Return true on success, or false on failure. + bool Close(); + + // Copy the contents of |str| to a MDString and write it to the file. + // |str| is expected to be either UTF-16 or UTF-32 depending on the size + // of wchar_t. + // Maximum |length| of characters to copy from |str|, or specify 0 to use the + // entire NULL terminated string. Copying will stop at the first NULL. + // |location| the allocated location + // Return true on success, or false on failure + bool WriteString(const wchar_t* str, unsigned int length, + MDLocationDescriptor* location); + + // Same as above, except with |str| as a UTF-8 string + bool WriteString(const char* str, unsigned int length, + MDLocationDescriptor* location); + + // Write |size| bytes starting at |src| into the current position. + // Return true on success and set |output| to position, or false on failure + bool WriteMemory(const void* src, size_t size, MDMemoryDescriptor* output); + + // Copies |size| bytes from |src| to |position| + // Return true on success, or false on failure + bool Copy(MDRVA position, const void* src, ssize_t size); + + // Return the current position for writing to the minidump + inline MDRVA position() const { return position_; } + + private: + friend class UntypedMDRVA; + + // Allocates an area of |size| bytes. + // Returns the position of the allocation, or kInvalidMDRVA if it was + // unable to allocate the bytes. + MDRVA Allocate(size_t size); + + // The file descriptor for the output file. + int file_; + + // Whether |file_| should be closed when the instance is destroyed. + bool close_file_when_destroyed_; + + // Current position in buffer + MDRVA position_; + + // Current allocated size + size_t size_; + + // Copy |length| characters from |str| to |mdstring|. These are distinct + // because the underlying MDString is a UTF-16 based string. The wchar_t + // variant may need to create a MDString that has more characters than the + // source |str|, whereas the UTF-8 variant may coalesce characters to form + // a single UTF-16 character. + bool CopyStringToMDString(const wchar_t* str, unsigned int length, + TypedMDRVA* mdstring); + bool CopyStringToMDString(const char* str, unsigned int length, + TypedMDRVA* mdstring); + + // The common templated code for writing a string + template + bool WriteStringCore(const CharType* str, unsigned int length, + MDLocationDescriptor* location); +}; + +// Represents an untyped allocated chunk +class UntypedMDRVA { + public: + explicit UntypedMDRVA(MinidumpFileWriter* writer) + : writer_(writer), + position_(writer->position()), + size_(0) {} + + // Allocates |size| bytes. Must not call more than once. + // Return true on success, or false on failure + bool Allocate(size_t size); + + // Returns the current position or kInvalidMDRVA if allocation failed + inline MDRVA position() const { return position_; } + + // Number of bytes allocated + inline size_t size() const { return size_; } + + // Return size and position + inline MDLocationDescriptor location() const { + MDLocationDescriptor location = { static_cast(size_), + position_ }; + return location; + } + + // Copy |size| bytes starting at |src| into the minidump at |position| + // Return true on success, or false on failure + bool Copy(MDRVA position, const void* src, size_t size); + + // Copy |size| bytes from |src| to the current position + inline bool Copy(const void* src, size_t size) { + return Copy(position_, src, size); + } + + protected: + // Writer we associate with + MinidumpFileWriter* writer_; + + // Position of the start of the data + MDRVA position_; + + // Allocated size + size_t size_; +}; + +// Represents a Minidump object chunk. Additional memory can be allocated at +// the end of the object as a: +// - single allocation +// - Array of MDType objects +// - A MDType object followed by an array +template +class TypedMDRVA : public UntypedMDRVA { + public: + // Constructs an unallocated MDRVA + explicit TypedMDRVA(MinidumpFileWriter* writer) + : UntypedMDRVA(writer), + data_(), + allocation_state_(UNALLOCATED) {} + + inline ~TypedMDRVA() { + // Ensure that the data_ object is written out + if (allocation_state_ != ARRAY) + Flush(); + } + + // Address of object data_ of MDType. This is not declared const as the + // typical usage will be to access the underlying |data_| object as to + // alter its contents. + MDType* get() { return &data_; } + + // Allocates minidump_size::size() bytes. + // Must not call more than once. + // Return true on success, or false on failure + bool Allocate(); + + // Allocates minidump_size::size() + |additional| bytes. + // Must not call more than once. + // Return true on success, or false on failure + bool Allocate(size_t additional); + + // Allocate an array of |count| elements of MDType. + // Must not call more than once. + // Return true on success, or false on failure + bool AllocateArray(size_t count); + + // Allocate an array of |count| elements of |size| after object of MDType + // Must not call more than once. + // Return true on success, or false on failure + bool AllocateObjectAndArray(size_t count, size_t size); + + // Copy |item| to |index| + // Must have been allocated using AllocateArray(). + // Return true on success, or false on failure + bool CopyIndex(unsigned int index, MDType* item); + + // Copy |size| bytes starting at |str| to |index| + // Must have been allocated using AllocateObjectAndArray(). + // Return true on success, or false on failure + bool CopyIndexAfterObject(unsigned int index, const void* src, size_t size); + + // Write data_ + bool Flush(); + + private: + enum AllocationState { + UNALLOCATED = 0, + SINGLE_OBJECT, + ARRAY, + SINGLE_OBJECT_WITH_ARRAY + }; + + MDType data_; + AllocationState allocation_state_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_MINIDUMP_FILE_WRITER_H__ diff --git a/src/client/minidump_file_writer_unittest.cc b/src/client/minidump_file_writer_unittest.cc new file mode 100644 index 0000000..21e0b8a --- /dev/null +++ b/src/client/minidump_file_writer_unittest.cc @@ -0,0 +1,183 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: waylonis@google.com (Dan Waylonis) + +/* + g++ -I../ ../common/convert_UTF.cc \ + ../common/string_conversion.cc \ + minidump_file_writer.cc \ + minidump_file_writer_unittest.cc \ + -o minidump_file_writer_unittest + */ + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "minidump_file_writer-inl.h" + +using google_breakpad::MinidumpFileWriter; + +#define ASSERT_TRUE(cond) \ +if (!(cond)) { \ + fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \ + return false; \ +} + +#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2)) +#define ASSERT_NE(e1, e2) ASSERT_TRUE((e1) != (e2)) + +struct StringStructure { + unsigned long integer_value; + MDLocationDescriptor first_string; + MDLocationDescriptor second_string; +}; + +struct ArrayStructure { + unsigned char char_value; + unsigned short short_value; + unsigned long long_value; +}; + +typedef struct { + unsigned long count; + ArrayStructure array[0]; +} ObjectAndArrayStructure; + +static bool WriteFile(const char* path) { + MinidumpFileWriter writer; + if (writer.Open(path)) { + // Test a single structure + google_breakpad::TypedMDRVA strings(&writer); + ASSERT_TRUE(strings.Allocate()); + strings.get()->integer_value = 0xBEEF; + const char* first = "First String"; + ASSERT_TRUE(writer.WriteString(first, 0, &strings.get()->first_string)); + const wchar_t* second = L"Second String"; + ASSERT_TRUE(writer.WriteString(second, 0, &strings.get()->second_string)); + + // Test an array structure + google_breakpad::TypedMDRVA array(&writer); + unsigned int count = 10; + ASSERT_TRUE(array.AllocateArray(count)); + for (unsigned char i = 0; i < count; ++i) { + ArrayStructure local; + local.char_value = i; + local.short_value = i + 1; + local.long_value = i + 2; + ASSERT_TRUE(array.CopyIndex(i, &local)); + } + + // Test an object followed by an array + google_breakpad::TypedMDRVA obj_array(&writer); + ASSERT_TRUE(obj_array.AllocateObjectAndArray(count, + sizeof(ArrayStructure))); + obj_array.get()->count = count; + for (unsigned char i = 0; i < count; ++i) { + ArrayStructure local; + local.char_value = i; + local.short_value = i + 1; + local.long_value = i + 2; + ASSERT_TRUE(obj_array.CopyIndexAfterObject(i, &local, sizeof(local))); + } + } + + return writer.Close(); +} + +static bool CompareFile(const char* path) { + unsigned long expected[] = { +#if defined(__BIG_ENDIAN__) + 0x0000beef, 0x0000001e, 0x00000018, 0x00000020, 0x00000038, 0x00000000, + 0x00000018, 0x00460069, 0x00720073, 0x00740020, 0x00530074, 0x00720069, + 0x006e0067, 0x00000000, 0x0000001a, 0x00530065, 0x0063006f, 0x006e0064, + 0x00200053, 0x00740072, 0x0069006e, 0x00670000, 0x00000001, 0x00000002, + 0x01000002, 0x00000003, 0x02000003, 0x00000004, 0x03000004, 0x00000005, + 0x04000005, 0x00000006, 0x05000006, 0x00000007, 0x06000007, 0x00000008, + 0x07000008, 0x00000009, 0x08000009, 0x0000000a, 0x0900000a, 0x0000000b, + 0x0000000a, 0x00000001, 0x00000002, 0x01000002, 0x00000003, 0x02000003, + 0x00000004, 0x03000004, 0x00000005, 0x04000005, 0x00000006, 0x05000006, + 0x00000007, 0x06000007, 0x00000008, 0x07000008, 0x00000009, 0x08000009, + 0x0000000a, 0x0900000a, 0x0000000b, 0x00000000 +#else + 0x0000beef, 0x0000001e, 0x00000018, 0x00000020, + 0x00000038, 0x00000000, 0x00000018, 0x00690046, + 0x00730072, 0x00200074, 0x00740053, 0x00690072, + 0x0067006e, 0x00000000, 0x0000001a, 0x00650053, + 0x006f0063, 0x0064006e, 0x00530020, 0x00720074, + 0x006e0069, 0x00000067, 0x00011e00, 0x00000002, + 0x00021e01, 0x00000003, 0x00031e02, 0x00000004, + 0x00041e03, 0x00000005, 0x00051e04, 0x00000006, + 0x00061e05, 0x00000007, 0x00071e06, 0x00000008, + 0x00081e07, 0x00000009, 0x00091e08, 0x0000000a, + 0x000a1e09, 0x0000000b, 0x0000000a, 0x00011c00, + 0x00000002, 0x00021c01, 0x00000003, 0x00031c02, + 0x00000004, 0x00041c03, 0x00000005, 0x00051c04, + 0x00000006, 0x00061c05, 0x00000007, 0x00071c06, + 0x00000008, 0x00081c07, 0x00000009, 0x00091c08, + 0x0000000a, 0x000a1c09, 0x0000000b, 0x00000000, +#endif + }; + size_t expected_byte_count = sizeof(expected); + int fd = open(path, O_RDONLY, 0600); + void* buffer = malloc(expected_byte_count); + ASSERT_NE(fd, -1); + ASSERT_TRUE(buffer); + ASSERT_EQ(read(fd, buffer, expected_byte_count), + static_cast(expected_byte_count)); + + char* b1; + char* b2; + b1 = reinterpret_cast(buffer); + b2 = reinterpret_cast(expected); + while (*b1 == *b2) { + b1++; + b2++; + } + + printf("%p\n", reinterpret_cast(b1 - (char*)buffer)); + + ASSERT_EQ(memcmp(buffer, expected, expected_byte_count), 0); + return true; +} + +static bool RunTests() { + const char* path = "/tmp/minidump_file_writer_unittest.dmp"; + ASSERT_TRUE(WriteFile(path)); + ASSERT_TRUE(CompareFile(path)); + unlink(path); + return true; +} + +extern "C" int main(int argc, const char* argv[]) { + return RunTests() ? 0 : 1; +} diff --git a/src/client/solaris/handler/Makefile b/src/client/solaris/handler/Makefile new file mode 100644 index 0000000..b22fe56 --- /dev/null +++ b/src/client/solaris/handler/Makefile @@ -0,0 +1,76 @@ +# Copyright 2007 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Author: Alfred Peng + +CC=cc +CXX=CC + +CPPFLAGS=-g -I../../.. -DNDEBUG -features=extensions -D_REENTRANT +LDFLAGS=-lpthread -lssl -lgnutls-openssl -lelf + +OBJ_DIR=. +BIN_DIR=. + +THREAD_SRC=solaris_lwp.cc +SHARE_SRC=../../minidump_file_writer.cc\ + ../../../common/convert_UTF.cc\ + ../../../common/md5.cc\ + ../../../common/string_conversion.cc\ + ../../../common/solaris/file_id.cc\ + minidump_generator.cc +HANDLER_SRC=exception_handler.cc\ + ../../../common/solaris/guid_creator.cc + +MINIDUMP_TEST_SRC=minidump_test.cc +EXCEPTION_TEST_SRC=exception_handler_test.cc + +THREAD_OBJ=$(patsubst %.cc,$(OBJ_DIR)/%.o,$(THREAD_SRC)) +SHARE_OBJ=$(patsubst %.cc,$(OBJ_DIR)/%.o,$(SHARE_SRC)) +HANDLER_OBJ=$(patsubst %.cc,$(OBJ_DIR)/%.o,$(HANDLER_SRC)) +MINIDUMP_TEST_OBJ=$(patsubst %.cc,$(OBJ_DIR)/%.o, $(MINIDUMP_TEST_SRC))\ + $(THREAD_OBJ) $(SHARE_OBJ) $(HANDLER_OBJ) +EXCEPTION_TEST_OBJ=$(patsubst %.cc,$(OBJ_DIR)/%.o, $(EXCEPTION_TEST_SRC))\ + $(THREAD_OBJ) $(SHARE_OBJ) $(HANDLER_OBJ) + +BIN=$(BIN_DIR)/minidump_test\ + $(BIN_DIR)/exception_handler_test + +.PHONY:all clean + +all:$(BIN) + +$(BIN_DIR)/minidump_test:$(MINIDUMP_TEST_OBJ) + $(CXX) $(CPPFLAGS) $(LDFLAGS) $^ -o $@ + +$(BIN_DIR)/exception_handler_test:$(EXCEPTION_TEST_OBJ) + $(CXX) $(CPPFLAGS) $(LDFLAGS) $^ -o $@ + +clean: + rm -f $(BIN) *.o *.out *.dmp core ../../minidump_file_writer.o\ + ../../../common/*.o ../../../common/solaris/*.o diff --git a/src/client/solaris/handler/exception_handler.cc b/src/client/solaris/handler/exception_handler.cc new file mode 100644 index 0000000..0e5f449 --- /dev/null +++ b/src/client/solaris/handler/exception_handler.cc @@ -0,0 +1,261 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include + +#include +#include +#include + +#include "client/solaris/handler/exception_handler.h" +#include "common/solaris/guid_creator.h" +#include "common/solaris/message_output.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Signals that we are interested. +static const int kSigTable[] = { + SIGSEGV, + SIGABRT, + SIGFPE, + SIGILL, + SIGBUS +}; + +std::vector* ExceptionHandler::handler_stack_ = NULL; +int ExceptionHandler::handler_stack_index_ = 0; +pthread_mutex_t ExceptionHandler::handler_stack_mutex_ = + PTHREAD_MUTEX_INITIALIZER; + +ExceptionHandler::ExceptionHandler(const string& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + bool install_handler) + : filter_(filter), + callback_(callback), + callback_context_(callback_context), + dump_path_(), + installed_handler_(install_handler) { + set_dump_path(dump_path); + + if (install_handler) { + SetupHandler(); + } + + if (install_handler) { + pthread_mutex_lock(&handler_stack_mutex_); + + if (handler_stack_ == NULL) + handler_stack_ = new std::vector; + handler_stack_->push_back(this); + pthread_mutex_unlock(&handler_stack_mutex_); + } +} + +ExceptionHandler::~ExceptionHandler() { + TeardownAllHandlers(); + pthread_mutex_lock(&handler_stack_mutex_); + if (handler_stack_->back() == this) { + handler_stack_->pop_back(); + } else { + print_message1(2, "warning: removing Breakpad handler out of order\n"); + for (std::vector::iterator iterator = + handler_stack_->begin(); + iterator != handler_stack_->end(); + ++iterator) { + if (*iterator == this) { + handler_stack_->erase(iterator); + } + } + } + + if (handler_stack_->empty()) { + // When destroying the last ExceptionHandler that installed a handler, + // clean up the handler stack. + delete handler_stack_; + handler_stack_ = NULL; + } + pthread_mutex_unlock(&handler_stack_mutex_); +} + +bool ExceptionHandler::WriteMinidump() { + return InternalWriteMinidump(0, 0, NULL); +} + +// static +bool ExceptionHandler::WriteMinidump(const string& dump_path, + MinidumpCallback callback, + void* callback_context) { + ExceptionHandler handler(dump_path, NULL, callback, + callback_context, false); + return handler.InternalWriteMinidump(0, 0, NULL); +} + +void ExceptionHandler::SetupHandler() { + // Signal on a different stack to avoid using the stack + // of the crashing lwp. + struct sigaltstack sig_stack; + sig_stack.ss_sp = malloc(MINSIGSTKSZ); + if (sig_stack.ss_sp == NULL) + return; + sig_stack.ss_size = MINSIGSTKSZ; + sig_stack.ss_flags = 0; + + if (sigaltstack(&sig_stack, NULL) < 0) + return; + for (size_t i = 0; i < sizeof(kSigTable) / sizeof(kSigTable[0]); ++i) + SetupHandler(kSigTable[i]); +} + +void ExceptionHandler::SetupHandler(int signo) { + struct sigaction act, old_act; + act.sa_handler = HandleException; + act.sa_flags = SA_ONSTACK; + if (sigaction(signo, &act, &old_act) < 0) + return; + old_handlers_[signo] = old_act.sa_handler; +} + +void ExceptionHandler::TeardownHandler(int signo) { + if (old_handlers_.find(signo) != old_handlers_.end()) { + struct sigaction act; + act.sa_handler = old_handlers_[signo]; + act.sa_flags = 0; + sigaction(signo, &act, 0); + } +} + +void ExceptionHandler::TeardownAllHandlers() { + for (size_t i = 0; i < sizeof(kSigTable) / sizeof(kSigTable[0]); ++i) { + TeardownHandler(kSigTable[i]); + } +} + +// static +void ExceptionHandler::HandleException(int signo) { +//void ExceptionHandler::HandleException(int signo, siginfo_t* sip, ucontext_t* sig_ctx) { + // The context information about the signal is put on the stack of + // the signal handler frame as value parameter. For some reasons, the + // prototype of the handler doesn't declare this information as parameter, we + // will do it by hand. The stack layout for a signal handler frame is here: + // http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libproc/common/Pstack.c#81 + // + // However, if we are being called by another signal handler passing the + // signal up the chain, then we may not have this random extra parameter, + // so we may have to walk the stack to find it. We do the actual work + // on another thread, where it's a little safer, but we want the ebp + // from this frame to find it. + uintptr_t current_ebp = (uintptr_t)_getfp(); + + pthread_mutex_lock(&handler_stack_mutex_); + ExceptionHandler* current_handler = + handler_stack_->at(handler_stack_->size() - ++handler_stack_index_); + pthread_mutex_unlock(&handler_stack_mutex_); + + // Restore original handler. + current_handler->TeardownHandler(signo); + + ucontext_t* sig_ctx = NULL; + if (current_handler->InternalWriteMinidump(signo, current_ebp, &sig_ctx)) { +// if (current_handler->InternalWriteMinidump(signo, &sig_ctx)) { + // Fully handled this exception, safe to exit. + exit(EXIT_FAILURE); + } else { + // Exception not fully handled, will call the next handler in stack to + // process it. + typedef void (*SignalHandler)(int signo); + SignalHandler old_handler = + reinterpret_cast(current_handler->old_handlers_[signo]); + if (old_handler != NULL) + old_handler(signo); + } + + pthread_mutex_lock(&handler_stack_mutex_); + current_handler->SetupHandler(signo); + --handler_stack_index_; + // All the handlers in stack have been invoked to handle the exception, + // normally the process should be terminated and should not reach here. + // In case we got here, ask the OS to handle it to avoid endless loop, + // normally the OS will generate a core and termiate the process. This + // may be desired to debug the program. + if (handler_stack_index_ == 0) + signal(signo, SIG_DFL); + pthread_mutex_unlock(&handler_stack_mutex_); +} + +bool ExceptionHandler::InternalWriteMinidump(int signo, + uintptr_t sighandler_ebp, + ucontext_t** sig_ctx) { + if (filter_ && !filter_(callback_context_)) + return false; + + bool success = false; + GUID guid; + char guid_str[kGUIDStringLength + 1]; + if (CreateGUID(&guid) && GUIDToString(&guid, guid_str, sizeof(guid_str))) { + char minidump_path[PATH_MAX]; + snprintf(minidump_path, sizeof(minidump_path), "%s/%s.dmp", + dump_path_c_, guid_str); + + // Block all the signals we want to process when writing minidump. + // We don't want it to be interrupted. + sigset_t sig_blocked, sig_old; + bool blocked = true; + sigfillset(&sig_blocked); + for (size_t i = 0; i < sizeof(kSigTable) / sizeof(kSigTable[0]); ++i) + sigdelset(&sig_blocked, kSigTable[i]); + if (sigprocmask(SIG_BLOCK, &sig_blocked, &sig_old) != 0) { + blocked = false; + print_message1(2, "HandleException: failed to block signals.\n"); + } + + success = minidump_generator_.WriteMinidumpToFile( + minidump_path, signo, sighandler_ebp, sig_ctx); + + // Unblock the signals. + if (blocked) + sigprocmask(SIG_SETMASK, &sig_old, &sig_old); + + if (callback_) + success = callback_(dump_path_c_, guid_str, callback_context_, success); + } + return success; +} + +} // namespace google_breakpad diff --git a/src/client/solaris/handler/exception_handler.h b/src/client/solaris/handler/exception_handler.h new file mode 100644 index 0000000..04d140f --- /dev/null +++ b/src/client/solaris/handler/exception_handler.h @@ -0,0 +1,200 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Alfred Peng + +#ifndef CLIENT_SOLARIS_HANDLER_EXCEPTION_HANDLER_H__ +#define CLIENT_SOLARIS_HANDLER_EXCEPTION_HANDLER_H__ + +#include +#include +#include + +#include "client/solaris/handler/minidump_generator.h" + +namespace google_breakpad { + +using std::string; + +// +// ExceptionHandler +// +// ExceptionHandler can write a minidump file when an exception occurs, +// or when WriteMinidump() is called explicitly by your program. +// +// To have the exception handler write minidumps when an uncaught exception +// (crash) occurs, you should create an instance early in the execution +// of your program, and keep it around for the entire time you want to +// have crash handling active (typically, until shutdown). +// (NOTE): There should be only one this kind of exception handler +// object per process. +// +// If you want to write minidumps without installing the exception handler, +// you can create an ExceptionHandler with install_handler set to false, +// then call WriteMinidump. You can also use this technique if you want to +// use different minidump callbacks for different call sites. +// +// In either case, a callback function is called when a minidump is written, +// which receives the unqiue id of the minidump. The caller can use this +// id to collect and write additional application state, and to launch an +// external crash-reporting application. +// +// Caller should try to make the callbacks as crash-friendly as possible, +// it should avoid use heap memory allocation as much as possible. +// +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. context is the parameter supplied by the user as + // callback_context when the handler was created. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, + // Breakpad will immediately report the exception as unhandled without + // writing a minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void* context); + + // A callback function to run after the minidump has been written. + // minidump_id is a unique id for the dump, so the minidump + // file is /.dmp. context is the parameter supplied + // by the user as callback_context when the handler was created. succeeded + // indicates whether a minidump file was successfully written. + // + // If an exception occurred and the callback returns true, Breakpad will + // treat the exception as fully-handled, suppressing any other handlers from + // being notified of the exception. If the callback returns false, Breakpad + // will treat the exception as unhandled, and allow another handler to handle + // it. If there are no other handlers, Breakpad will report the exception to + // the system as unhandled, allowing a debugger or native crash dialog the + // opportunity to handle the exception. Most callback implementations + // should normally return the value of |succeeded|, or when they wish to + // not report an exception of handled, false. Callbacks will rarely want to + // return true directly (unless |succeeded| is true). + typedef bool (*MinidumpCallback)(const char* dump_path, + const char* minidump_id, + void* context, + bool succeeded); + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Before writing a minidump, the optional filter callback will be called. + // Its return value determines whether or not Breakpad should write a + // minidump. Minidump files will be written to dump_path, and the optional + // callback is called after writing the dump file, as described above. + // If install_handler is true, then a minidump will be written whenever + // an unhandled exception occurs. If it is false, minidumps will only + // be written when WriteMinidump is called. + ExceptionHandler(const string& dump_path, + FilterCallback filter, MinidumpCallback callback, + void* callback_context, + bool install_handler); + ~ExceptionHandler(); + + // Get and Set the minidump path. + string dump_path() const { return dump_path_; } + void set_dump_path(const string& dump_path) { + dump_path_ = dump_path; + dump_path_c_ = dump_path_.c_str(); + } + + // Writes a minidump immediately. This can be used to capture the + // execution state independently of a crash. Returns true on success. + bool WriteMinidump(); + + // Convenience form of WriteMinidump which does not require an + // ExceptionHandler instance. + static bool WriteMinidump(const string& dump_path, + MinidumpCallback callback, + void* callback_context); + + private: + // Setup crash handler. + void SetupHandler(); + // Setup signal handler for a signal. + void SetupHandler(int signo); + // Teardown the handler for a signal. + void TeardownHandler(int signo); + // Teardown all handlers. + void TeardownAllHandlers(); + + // Runs the main loop for the exception handler thread. + static void* ExceptionHandlerThreadMain(void* lpParameter); + + // Signal handler. + static void HandleException(int signo); + + // Write all the information to the dump file. + // If called from a signal handler, sighandler_ebp is the ebp of + // that signal handler's frame, and sig_ctx is an out parameter + // that will be set to point at the ucontext_t that was placed + // on the stack by the kernel. You can pass zero and NULL + // for the second and third parameters if you are not calling + // this from a signal handler. + bool InternalWriteMinidump(int signo, uintptr_t sighandler_ebp, + ucontext_t** sig_ctx); + + private: + // The callbacks before and after writing the dump file. + FilterCallback filter_; + MinidumpCallback callback_; + void* callback_context_; + + // The directory in which a minidump will be written, set by the dump_path + // argument to the constructor, or set_dump_path. + string dump_path_; + // C style dump path. Keep this when setting dump path, since calling + // c_str() of std::string when crashing may not be safe. + const char* dump_path_c_; + + // True if the ExceptionHandler installed an unhandled exception filter + // when created (with an install_handler parameter set to true). + bool installed_handler_; + + // Keep the previous handlers for the signal. + typedef void (*sighandler_t)(int); + std::map old_handlers_; + + // The global exception handler stack. This is need becuase there may exist + // multiple ExceptionHandler instances in a process. Each will have itself + // registered in this stack. + static std::vector* handler_stack_; + // The index of the handler that should handle the next exception. + static int handler_stack_index_; + static pthread_mutex_t handler_stack_mutex_; + + // The minidump generator. + MinidumpGenerator minidump_generator_; + + // disallow copy ctor and operator= + explicit ExceptionHandler(const ExceptionHandler&); + void operator=(const ExceptionHandler&); +}; + +} // namespace google_breakpad + +#endif // CLIENT_SOLARIS_HANDLER_EXCEPTION_HANDLER_H__ diff --git a/src/client/solaris/handler/exception_handler_test.cc b/src/client/solaris/handler/exception_handler_test.cc new file mode 100644 index 0000000..3d65682 --- /dev/null +++ b/src/client/solaris/handler/exception_handler_test.cc @@ -0,0 +1,122 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include +#include +#include + +#include "client/solaris/handler/exception_handler.h" +#include "client/solaris/handler/solaris_lwp.h" + +using namespace google_breakpad; + +// Thread use this to see if it should stop working. +static bool should_exit = false; + +static int foo2(int arg) { + // Stack variable, used for debugging stack dumps. + int c = 0xcccccccc; + fprintf(stderr, "Thread trying to crash: %x\n", getpid()); + c = *reinterpret_cast(0x5); + return c; +} + +static int foo(int arg) { + // Stack variable, used for debugging stack dumps. + int b = 0xbbbbbbbb; + b = foo2(b); + return b; +} + +static void* thread_crash(void*) { + // Stack variable, used for debugging stack dumps. + int a = 0xaaaaaaaa; + sleep(3); + a = foo(a); + printf("%x\n", a); + return NULL; +} + +static void* thread_main(void*) { + while (!should_exit) + sleep(1); + return NULL; +} + +static void CreateCrashThread() { + pthread_t h; + pthread_create(&h, NULL, thread_crash, NULL); + pthread_detach(h); +} + +// Create working threads. +static void CreateThread(int num) { + pthread_t h; + for (int i = 0; i < num; ++i) { + pthread_create(&h, NULL, thread_main, NULL); + pthread_detach(h); + } +} + +// Callback when minidump written. +static bool MinidumpCallback(const char* dump_path, + const char* minidump_id, + void* context, + bool succeeded) { + int index = reinterpret_cast(context); + if (index == 0) { + should_exit = true; + return true; + } + // Don't process it. + return false; +} + +int main(int argc, char* argv[]) { + int handler_index = 1; + ExceptionHandler handler_ignore(".", NULL, MinidumpCallback, + (void*)handler_index, true); + CreateCrashThread(); + CreateThread(10); + + while (true) + sleep(20); + should_exit = true; + + return 0; +} diff --git a/src/client/solaris/handler/minidump_generator.cc b/src/client/solaris/handler/minidump_generator.cc new file mode 100644 index 0000000..5d24d0a --- /dev/null +++ b/src/client/solaris/handler/minidump_generator.cc @@ -0,0 +1,790 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "client/solaris/handler/minidump_generator.h" +#include "client/minidump_file_writer-inl.h" +#include "common/solaris/file_id.h" + +namespace { + +using namespace google_breakpad; +using namespace google_breakpad::elf::FileID; + +// Argument for the writer function. +struct WriterArgument { + MinidumpFileWriter* minidump_writer; + + // Pid of the lwp who called WriteMinidumpToFile + int requester_pid; + + // The stack bottom of the lwp which caused the dump. + // Mainly used to find the lwp id of the crashed lwp since signal + // handler may not be called in the lwp who caused it. + uintptr_t crashed_stack_bottom; + + // Id of the crashing lwp. + int crashed_lwpid; + + // Signal number when crash happened. Can be 0 if this is a requested dump. + int signo; + + // The ebp of the signal handler frame on x86. Can be 0 if this is a + // requested dump. + uintptr_t sighandler_ebp; + + // User context when crash happens. Can be NULL if this is a requested dump. + // This is actually an out parameter, but it will be filled in at the start + // of the writer LWP. + ucontext_t* sig_ctx; + + // Used to get information about the lwps. + SolarisLwp* lwp_lister; +}; + +// Holding context information for the callback of finding the crashing lwp. +struct FindCrashLwpContext { + const SolarisLwp* lwp_lister; + uintptr_t crashing_stack_bottom; + int crashing_lwpid; + + FindCrashLwpContext() : + lwp_lister(NULL), + crashing_stack_bottom(0UL), + crashing_lwpid(-1) { + } +}; + +// Callback for list lwps. +// It will compare the stack bottom of the provided lwp with the stack +// bottom of the crashed lwp, it they are eqaul, this lwp is the one +// who crashed. +bool IsLwpCrashedCallback(lwpstatus_t* lsp, void* context) { + FindCrashLwpContext* crashing_context = + static_cast(context); + const SolarisLwp* lwp_lister = crashing_context->lwp_lister; + const prgregset_t* gregs = &(lsp->pr_reg); +#if TARGET_CPU_SPARC + uintptr_t last_ebp = (*gregs)[R_FP]; +#elif TARGET_CPU_X86 + uintptr_t last_ebp = (*gregs)[EBP]; +#endif + uintptr_t stack_bottom = lwp_lister->GetLwpStackBottom(last_ebp); + if (stack_bottom > last_ebp && + stack_bottom == crashing_context->crashing_stack_bottom) { + // Got it. Stop iteration. + crashing_context->crashing_lwpid = lsp->pr_lwpid; + return false; + } + + return true; +} + +// Find the crashing lwpid. +// This is done based on stack bottom comparing. +int FindCrashingLwp(uintptr_t crashing_stack_bottom, + int requester_pid, + const SolarisLwp* lwp_lister) { + FindCrashLwpContext context; + context.lwp_lister = lwp_lister; + context.crashing_stack_bottom = crashing_stack_bottom; + CallbackParam callback_param(IsLwpCrashedCallback, + &context); + lwp_lister->Lwp_iter_all(lwp_lister->getpid(), &callback_param); + return context.crashing_lwpid; +} + +bool WriteLwpStack(const SolarisLwp* lwp_lister, + uintptr_t last_esp, + UntypedMDRVA* memory, + MDMemoryDescriptor* loc) { + uintptr_t stack_bottom = lwp_lister->GetLwpStackBottom(last_esp); + if (stack_bottom >= last_esp) { + int size = stack_bottom - last_esp; + if (size > 0) { + if (!memory->Allocate(size)) + return false; + memory->Copy(reinterpret_cast(last_esp), size); + loc->start_of_memory_range = last_esp; + loc->memory = memory->location(); + } + return true; + } + return false; +} + +#if TARGET_CPU_SPARC +bool WriteContext(MDRawContextSPARC* context, ucontext_t* sig_ctx) { + assert(sig_ctx != NULL); + int* regs = sig_ctx->uc_mcontext.gregs; + context->context_flags = MD_CONTEXT_SPARC_FULL; + + context->ccr = (unsigned int)(regs[0]); + context->pc = (unsigned int)(regs[REG_PC]); + context->npc = (unsigned int)(regs[REG_nPC]); + context->y = (unsigned int)(regs[REG_Y]); + context->asi = (unsigned int)(regs[19]); + context->fprs = (unsigned int)(regs[20]); + + for ( int i = 0 ; i < 32; ++i ) { + context->g_r[i] = 0; + } + + for ( int i = 1 ; i < 16; ++i ) { + context->g_r[i] = (uintptr_t)(sig_ctx->uc_mcontext.gregs[i + 3]); + } + context->g_r[30] = (uintptr_t)(((struct frame*)context->g_r[14])->fr_savfp); + + return true; +} + +bool WriteContext(MDRawContextSPARC* context, prgregset_t regs, + prfpregset_t* fp_regs) { + if (!context || !regs) + return false; + + context->context_flags = MD_CONTEXT_SPARC_FULL; + + context->ccr = (uintptr_t)(regs[32]); + context->pc = (uintptr_t)(regs[R_PC]); + context->npc = (uintptr_t)(regs[R_nPC]); + context->y = (uintptr_t)(regs[R_Y]); + context->asi = (uintptr_t)(regs[36]); + context->fprs = (uintptr_t)(regs[37]); + for ( int i = 0 ; i < 32 ; ++i ){ + context->g_r[i] = (uintptr_t)(regs[i]); + } + + return true; +} +#elif TARGET_CPU_X86 +bool WriteContext(MDRawContextX86* context, prgregset_t regs, + prfpregset_t* fp_regs) { + if (!context || !regs) + return false; + + context->context_flags = MD_CONTEXT_X86_FULL; + + context->cs = regs[CS]; + context->ds = regs[DS]; + context->es = regs[ES]; + context->fs = regs[FS]; + context->gs = regs[GS]; + context->ss = regs[SS]; + context->edi = regs[EDI]; + context->esi = regs[ESI]; + context->ebx = regs[EBX]; + context->edx = regs[EDX]; + context->ecx = regs[ECX]; + context->eax = regs[EAX]; + context->ebp = regs[EBP]; + context->eip = regs[EIP]; + context->esp = regs[UESP]; + context->eflags = regs[EFL]; + + return true; +} +#endif /* TARGET_CPU_XXX */ + +// Write information about a crashed Lwp. +// When a lwp crash, kernel will write something on the stack for processing +// signal. This makes the current stack not reliable, and our stack walker +// won't figure out the whole call stack for this. So we write the stack at the +// time of the crash into the minidump file, not the current stack. +bool WriteCrashedLwpStream(MinidumpFileWriter* minidump_writer, + const WriterArgument* writer_args, + const lwpstatus_t* lsp, + MDRawThread* lwp) { + assert(writer_args->sig_ctx != NULL); + + lwp->thread_id = lsp->pr_lwpid; + +#if TARGET_CPU_SPARC + UntypedMDRVA memory(minidump_writer); + if (!WriteLwpStack(writer_args->lwp_lister, + writer_args->sig_ctx->uc_mcontext.gregs[REG_O6], + &memory, + &lwp->stack)) + return false; + + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + lwp->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextSPARC)); + return WriteContext(context.get(), writer_args->sig_ctx); +#elif TARGET_CPU_X86 + UntypedMDRVA memory(minidump_writer); + if (!WriteLwpStack(writer_args->lwp_lister, + writer_args->sig_ctx->uc_mcontext.gregs[UESP], + &memory, + &lwp->stack)) + return false; + + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + lwp->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextX86)); + return WriteContext(context.get(), + (int*)&writer_args->sig_ctx->uc_mcontext.gregs, + &writer_args->sig_ctx->uc_mcontext.fpregs); +#endif +} + +bool WriteLwpStream(MinidumpFileWriter* minidump_writer, + const SolarisLwp* lwp_lister, + const lwpstatus_t* lsp, MDRawThread* lwp) { + prfpregset_t fp_regs = lsp->pr_fpreg; + const prgregset_t* gregs = &(lsp->pr_reg); + UntypedMDRVA memory(minidump_writer); +#if TARGET_CPU_SPARC + if (!WriteLwpStack(lwp_lister, + (*gregs)[R_SP], + &memory, + &lwp->stack)) + return false; + + // Write context + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + // should be the thread_id + lwp->thread_id = lsp->pr_lwpid; + lwp->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextSPARC)); +#elif TARGET_CPU_X86 + if (!WriteLwpStack(lwp_lister, + (*gregs)[UESP], + &memory, + &lwp->stack)) + return false; + + // Write context + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + // should be the thread_id + lwp->thread_id = lsp->pr_lwpid; + lwp->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextX86)); +#endif /* TARGET_CPU_XXX */ + return WriteContext(context.get(), (int*)gregs, &fp_regs); +} + +bool WriteCPUInformation(MDRawSystemInfo* sys_info) { + struct utsname uts; + char *major, *minor, *build; + + sys_info->number_of_processors = sysconf(_SC_NPROCESSORS_CONF); + sys_info->processor_architecture = MD_CPU_ARCHITECTURE_UNKNOWN; + if (uname(&uts) != -1) { + // Match "i86pc" as X86 architecture. + if (strcmp(uts.machine, "i86pc") == 0) + sys_info->processor_architecture = MD_CPU_ARCHITECTURE_X86; + else if (strcmp(uts.machine, "sun4u") == 0) + sys_info->processor_architecture = MD_CPU_ARCHITECTURE_SPARC; + } + + major = uts.release; + minor = strchr(major, '.'); + *minor = '\0'; + ++minor; + sys_info->major_version = atoi(major); + sys_info->minor_version = atoi(minor); + + build = strchr(uts.version, '_'); + ++build; + sys_info->build_number = atoi(build); + + return true; +} + +bool WriteOSInformation(MinidumpFileWriter* minidump_writer, + MDRawSystemInfo* sys_info) { + sys_info->platform_id = MD_OS_SOLARIS; + + struct utsname uts; + if (uname(&uts) != -1) { + char os_version[512]; + size_t space_left = sizeof(os_version); + memset(os_version, 0, space_left); + const char* os_info_table[] = { + uts.sysname, + uts.release, + uts.version, + uts.machine, + "OpenSolaris", + NULL + }; + for (const char** cur_os_info = os_info_table; + *cur_os_info != NULL; + ++cur_os_info) { + if (cur_os_info != os_info_table && space_left > 1) { + strcat(os_version, " "); + --space_left; + } + if (space_left > strlen(*cur_os_info)) { + strcat(os_version, *cur_os_info); + space_left -= strlen(*cur_os_info); + } else { + break; + } + } + + MDLocationDescriptor location; + if (!minidump_writer->WriteString(os_version, 0, &location)) + return false; + sys_info->csd_version_rva = location.rva; + } + return true; +} + +// Callback context for get writting lwp information. +struct LwpInfoCallbackCtx { + MinidumpFileWriter* minidump_writer; + const WriterArgument* writer_args; + TypedMDRVA* list; + int lwp_index; +}; + +bool LwpInformationCallback(lwpstatus_t* lsp, void* context) { + bool success = true; + LwpInfoCallbackCtx* callback_context = + static_cast(context); + + // The current lwp is the one to handle the crash. Ignore it. + if (lsp->pr_lwpid != pthread_self()) { + LwpInfoCallbackCtx* callback_context = + static_cast(context); + MDRawThread lwp; + memset(&lwp, 0, sizeof(MDRawThread)); + + if (lsp->pr_lwpid != callback_context->writer_args->crashed_lwpid || + callback_context->writer_args->sig_ctx == NULL) { + success = WriteLwpStream(callback_context->minidump_writer, + callback_context->writer_args->lwp_lister, + lsp, &lwp); + } else { + success = WriteCrashedLwpStream(callback_context->minidump_writer, + callback_context->writer_args, + lsp, &lwp); + } + if (success) { + callback_context->list->CopyIndexAfterObject( + callback_context->lwp_index++, + &lwp, sizeof(MDRawThread)); + } + } + + return success; +} + +bool WriteLwpListStream(MinidumpFileWriter* minidump_writer, + const WriterArgument* writer_args, + MDRawDirectory* dir) { + // Get the lwp information. + const SolarisLwp* lwp_lister = writer_args->lwp_lister; + int lwp_count = lwp_lister->GetLwpCount(); + if (lwp_count < 0) + return false; + TypedMDRVA list(minidump_writer); + if (!list.AllocateObjectAndArray(lwp_count - 1, sizeof(MDRawThread))) + return false; + dir->stream_type = MD_THREAD_LIST_STREAM; + dir->location = list.location(); + list.get()->number_of_threads = lwp_count - 1; + + LwpInfoCallbackCtx context; + context.minidump_writer = minidump_writer; + context.writer_args = writer_args; + context.list = &list; + context.lwp_index = 0; + CallbackParam callback_param(LwpInformationCallback, + &context); + int written = + lwp_lister->Lwp_iter_all(lwp_lister->getpid(), &callback_param); + return written == lwp_count; +} + +bool WriteCVRecord(MinidumpFileWriter* minidump_writer, + MDRawModule* module, + const char* module_path, + char* realname) { + TypedMDRVA cv(minidump_writer); + + char path[PATH_MAX]; + const char* module_name = module_path ? module_path : ""; + snprintf(path, sizeof(path), "/proc/self/object/%s", module_name); + + size_t module_name_length = strlen(realname); + if (!cv.AllocateObjectAndArray(module_name_length + 1, sizeof(uint8_t))) + return false; + if (!cv.CopyIndexAfterObject(0, realname, module_name_length)) + return false; + + module->cv_record = cv.location(); + MDCVInfoPDB70* cv_ptr = cv.get(); + memset(cv_ptr, 0, sizeof(MDCVInfoPDB70)); + cv_ptr->cv_signature = MD_CVINFOPDB70_SIGNATURE; + cv_ptr->age = 0; + + // Get the module identifier + FileID file_id(path); + unsigned char identifier[16]; + + if (file_id.ElfFileIdentifier(identifier)) { + cv_ptr->signature.data1 = (uint32_t)identifier[0] << 24 | + (uint32_t)identifier[1] << 16 | (uint32_t)identifier[2] << 8 | + (uint32_t)identifier[3]; + cv_ptr->signature.data2 = (uint32_t)identifier[4] << 8 | identifier[5]; + cv_ptr->signature.data3 = (uint32_t)identifier[6] << 8 | identifier[7]; + cv_ptr->signature.data4[0] = identifier[8]; + cv_ptr->signature.data4[1] = identifier[9]; + cv_ptr->signature.data4[2] = identifier[10]; + cv_ptr->signature.data4[3] = identifier[11]; + cv_ptr->signature.data4[4] = identifier[12]; + cv_ptr->signature.data4[5] = identifier[13]; + cv_ptr->signature.data4[6] = identifier[14]; + cv_ptr->signature.data4[7] = identifier[15]; + } + return true; +} + +struct ModuleInfoCallbackCtx { + MinidumpFileWriter* minidump_writer; + const WriterArgument* writer_args; + TypedMDRVA* list; + int module_index; +}; + +bool ModuleInfoCallback(const ModuleInfo& module_info, void* context) { + ModuleInfoCallbackCtx* callback_context = + static_cast(context); + // Skip those modules without name, or those that are not modules. + if (strlen(module_info.name) == 0) + return true; + + MDRawModule module; + memset(&module, 0, sizeof(module)); + MDLocationDescriptor loc; + char path[PATH_MAX]; + char buf[PATH_MAX]; + char* realname; + int count; + + snprintf(path, sizeof (path), "/proc/self/path/%s", module_info.name); + if ((count = readlink(path, buf, PATH_MAX)) < 0) + return false; + buf[count] = '\0'; + + if ((realname = strrchr(buf, '/')) == NULL) + return false; + realname++; + + if (!callback_context->minidump_writer->WriteString(realname, 0, &loc)) + return false; + + module.base_of_image = (uint64_t)module_info.start_addr; + module.size_of_image = module_info.size; + module.module_name_rva = loc.rva; + + if (!WriteCVRecord(callback_context->minidump_writer, &module, + module_info.name, realname)) + return false; + + callback_context->list->CopyIndexAfterObject( + callback_context->module_index++, &module, MD_MODULE_SIZE); + return true; +} + +bool WriteModuleListStream(MinidumpFileWriter* minidump_writer, + const WriterArgument* writer_args, + MDRawDirectory* dir) { + TypedMDRVA list(minidump_writer); + int module_count = writer_args->lwp_lister->GetModuleCount(); + + if (module_count <= 0 || + !list.AllocateObjectAndArray(module_count, MD_MODULE_SIZE)) { + return false; + } + + dir->stream_type = MD_MODULE_LIST_STREAM; + dir->location = list.location(); + list.get()->number_of_modules = module_count; + ModuleInfoCallbackCtx context; + context.minidump_writer = minidump_writer; + context.writer_args = writer_args; + context.list = &list; + context.module_index = 0; + CallbackParam callback(ModuleInfoCallback, &context); + return writer_args->lwp_lister->ListModules(&callback) == module_count; +} + +bool WriteSystemInfoStream(MinidumpFileWriter* minidump_writer, + const WriterArgument* writer_args, + MDRawDirectory* dir) { + TypedMDRVA sys_info(minidump_writer); + + if (!sys_info.Allocate()) + return false; + + dir->stream_type = MD_SYSTEM_INFO_STREAM; + dir->location = sys_info.location(); + + return WriteCPUInformation(sys_info.get()) && + WriteOSInformation(minidump_writer, sys_info.get()); +} + +bool WriteExceptionStream(MinidumpFileWriter* minidump_writer, + const WriterArgument* writer_args, + MDRawDirectory* dir) { + // This happenes when this is not a crash, but a requested dump. + if (writer_args->sig_ctx == NULL) + return false; + + TypedMDRVA exception(minidump_writer); + if (!exception.Allocate()) + return false; + + dir->stream_type = MD_EXCEPTION_STREAM; + dir->location = exception.location(); + exception.get()->thread_id = writer_args->crashed_lwpid; + exception.get()->exception_record.exception_code = writer_args->signo; + exception.get()->exception_record.exception_flags = 0; + +#if TARGET_CPU_SPARC + if (writer_args->sig_ctx != NULL) { + exception.get()->exception_record.exception_address = + writer_args->sig_ctx->uc_mcontext.gregs[REG_PC]; + } else { + return true; + } + + // Write context of the exception. + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + exception.get()->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextSPARC)); + return WriteContext(context.get(), writer_args->sig_ctx); +#elif TARGET_CPU_X86 + if (writer_args->sig_ctx != NULL) { + exception.get()->exception_record.exception_address = + writer_args->sig_ctx->uc_mcontext.gregs[EIP]; + } else { + return true; + } + + // Write context of the exception. + TypedMDRVA context(minidump_writer); + if (!context.Allocate()) + return false; + exception.get()->thread_context = context.location(); + memset(context.get(), 0, sizeof(MDRawContextX86)); + return WriteContext(context.get(), + (int*)&writer_args->sig_ctx->uc_mcontext.gregs, + NULL); +#endif +} + +bool WriteMiscInfoStream(MinidumpFileWriter* minidump_writer, + const WriterArgument* writer_args, + MDRawDirectory* dir) { + TypedMDRVA info(minidump_writer); + + if (!info.Allocate()) + return false; + + dir->stream_type = MD_MISC_INFO_STREAM; + dir->location = info.location(); + info.get()->size_of_info = sizeof(MDRawMiscInfo); + info.get()->flags1 = MD_MISCINFO_FLAGS1_PROCESS_ID; + info.get()->process_id = writer_args->requester_pid; + + return true; +} + +bool WriteBreakpadInfoStream(MinidumpFileWriter* minidump_writer, + const WriterArgument* writer_args, + MDRawDirectory* dir) { + TypedMDRVA info(minidump_writer); + + if (!info.Allocate()) + return false; + + dir->stream_type = MD_BREAKPAD_INFO_STREAM; + dir->location = info.location(); + + info.get()->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; + info.get()->dump_thread_id = getpid(); + info.get()->requesting_thread_id = writer_args->requester_pid; + return true; +} + +class AutoLwpResumer { + public: + AutoLwpResumer(SolarisLwp* lwp) : lwp_(lwp) {} + ~AutoLwpResumer() { lwp_->ControlAllLwps(false); } + private: + SolarisLwp* lwp_; +}; + +// Prototype of writer functions. +typedef bool (*WriteStreamFN)(MinidumpFileWriter*, + const WriterArgument*, + MDRawDirectory*); + +// Function table to writer a full minidump. +const WriteStreamFN writers[] = { + WriteLwpListStream, + WriteModuleListStream, + WriteSystemInfoStream, + WriteExceptionStream, + WriteMiscInfoStream, + WriteBreakpadInfoStream, +}; + +// Will call each writer function in the writers table. +//void* MinidumpGenerator::Write(void* argument) { +void* Write(void* argument) { + WriterArgument* writer_args = static_cast(argument); + + if (!writer_args->lwp_lister->ControlAllLwps(true)) + return NULL; + + AutoLwpResumer lwpResumer(writer_args->lwp_lister); + + if (writer_args->sighandler_ebp != 0 && + writer_args->lwp_lister->FindSigContext(writer_args->sighandler_ebp, + &writer_args->sig_ctx)) { + writer_args->crashed_stack_bottom = + writer_args->lwp_lister->GetLwpStackBottom( +#if TARGET_CPU_SPARC + writer_args->sig_ctx->uc_mcontext.gregs[REG_O6] +#elif TARGET_CPU_X86 + writer_args->sig_ctx->uc_mcontext.gregs[UESP] +#endif + ); + + int crashed_lwpid = FindCrashingLwp(writer_args->crashed_stack_bottom, + writer_args->requester_pid, + writer_args->lwp_lister); + if (crashed_lwpid > 0) + writer_args->crashed_lwpid = crashed_lwpid; + } + + MinidumpFileWriter* minidump_writer = writer_args->minidump_writer; + TypedMDRVA header(minidump_writer); + TypedMDRVA dir(minidump_writer); + if (!header.Allocate()) + return 0; + + int writer_count = sizeof(writers) / sizeof(writers[0]); + // Need directory space for all writers. + if (!dir.AllocateArray(writer_count)) + return 0; + header.get()->signature = MD_HEADER_SIGNATURE; + header.get()->version = MD_HEADER_VERSION; + header.get()->time_date_stamp = time(NULL); + header.get()->stream_count = writer_count; + header.get()->stream_directory_rva = dir.position(); + + int dir_index = 0; + MDRawDirectory local_dir; + for (int i = 0; i < writer_count; ++i) { + if ((*writers[i])(minidump_writer, writer_args, &local_dir)) + dir.CopyIndex(dir_index++, &local_dir); + } + + return 0; +} + +} // namespace + +namespace google_breakpad { + +MinidumpGenerator::MinidumpGenerator() { +} + +MinidumpGenerator::~MinidumpGenerator() { +} + +// Write minidump into file. +// It runs in a different thread from the crashing thread. +bool MinidumpGenerator::WriteMinidumpToFile(const char* file_pathname, + int signo, + uintptr_t sighandler_ebp, + ucontext_t** sig_ctx) const { + // The exception handler thread. + pthread_t handler_thread; + + assert(file_pathname != NULL); + + if (file_pathname == NULL) + return false; + + MinidumpFileWriter minidump_writer; + if (minidump_writer.Open(file_pathname)) { + WriterArgument argument; + memset(&argument, 0, sizeof(argument)); + SolarisLwp lwp_lister(getpid()); + argument.lwp_lister = &lwp_lister; + argument.minidump_writer = &minidump_writer; + argument.requester_pid = getpid(); + argument.crashed_lwpid = pthread_self(); + argument.signo = signo; + argument.sighandler_ebp = sighandler_ebp; + argument.sig_ctx = NULL; + + pthread_create(&handler_thread, NULL, Write, (void*)&argument); + pthread_join(handler_thread, NULL); + return true; + } + + return false; +} + +} // namespace google_breakpad diff --git a/src/client/solaris/handler/minidump_generator.h b/src/client/solaris/handler/minidump_generator.h new file mode 100644 index 0000000..7d2adbc --- /dev/null +++ b/src/client/solaris/handler/minidump_generator.h @@ -0,0 +1,69 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifndef CLIENT_SOLARIS_HANDLER_MINIDUMP_GENERATOR_H__ +#define CLIENT_SOLARIS_HANDLER_MINIDUMP_GENERATOR_H__ + +#include + +#include "client/minidump_file_writer.h" +#include "client/solaris/handler/solaris_lwp.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// +// MinidumpGenerator +// +// A minidump generator should be created before any exception happen. +// +class MinidumpGenerator { + // Callback run for writing lwp information in the process. + friend bool LwpInformationCallback(lwpstatus_t* lsp, void* context); + + // Callback run for writing module information in the process. + friend bool ModuleInfoCallback(const ModuleInfo& module_info, void* context); + + public: + MinidumpGenerator(); + + ~MinidumpGenerator(); + + // Write minidump. + bool WriteMinidumpToFile(const char* file_pathname, + int signo, + uintptr_t sighandler_ebp, + ucontext_t** sig_ctx) const; +}; + +} // namespace google_breakpad + +#endif // CLIENT_SOLARIS_HANDLER_MINIDUMP_GENERATOR_H_ diff --git a/src/client/solaris/handler/minidump_test.cc b/src/client/solaris/handler/minidump_test.cc new file mode 100644 index 0000000..a8f6906 --- /dev/null +++ b/src/client/solaris/handler/minidump_test.cc @@ -0,0 +1,78 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "client/minidump_file_writer.h" +#include "client/solaris/handler/minidump_generator.h" + +using std::string; +using google_breakpad::MinidumpGenerator; + +static bool doneWritingReport = false; + +static void* Reporter(void*) { + char buffer[PATH_MAX]; + MinidumpGenerator md; + + // Write it to the desktop + snprintf(buffer, sizeof(buffer), "./minidump_test.out"); + fprintf(stdout, "Writing %s\n", buffer); + + md.WriteMinidumpToFile(buffer, 0, 0, NULL); + doneWritingReport = true; + + return NULL; +} + +static void SleepyFunction() { + while (!doneWritingReport) { + usleep(100); + } +} + +int main(int argc, char * const argv[]) { + pthread_t reporter_thread; + + if (pthread_create(&reporter_thread, NULL, Reporter, NULL) == 0) { + pthread_detach(reporter_thread); + } else { + perror("pthread_create"); + } + + SleepyFunction(); + + return 0; +} diff --git a/src/client/solaris/handler/solaris_lwp.cc b/src/client/solaris/handler/solaris_lwp.cc new file mode 100644 index 0000000..02f1c37 --- /dev/null +++ b/src/client/solaris/handler/solaris_lwp.cc @@ -0,0 +1,439 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "client/solaris/handler/solaris_lwp.h" +#include "common/solaris/message_output.h" + +using namespace google_breakpad; + +// This unamed namespace contains helper function. +namespace { + +uintptr_t stack_base_address = 0; +static const int HEADER_MAX = 2000; +static const int MAP_MAX = 1000; + +// Context information for the callbacks when validating address by listing +// modules. +struct AddressValidatingContext { + uintptr_t address; + bool is_mapped; + + AddressValidatingContext() : address(0UL), is_mapped(false) { + } +}; + +// Convert from string to int. +static bool LocalAtoi(char* s, int* r) { + assert(s != NULL); + assert(r != NULL); + char* endptr = NULL; + int ret = strtol(s, &endptr, 10); + if (endptr == s) + return false; + *r = ret; + return true; +} + +// Callback invoked for each mapped module. +// It uses the module's adderss range to validate the address. +static bool AddressNotInModuleCallback(const ModuleInfo& module_info, + void* context) { + AddressValidatingContext* addr = + reinterpret_cast(context); + if (addr->is_mapped = ((module_info.start_addr > 0) && + (addr->address >= module_info.start_addr) && + (addr->address <= module_info.start_addr + + module_info.size))) { + stack_base_address = module_info.start_addr + module_info.size; + } + + return !addr->is_mapped; +} + +static int IterateLwpAll(int pid, + CallbackParam* callback_param) { + char lwp_path[40]; + DIR* dir; + int count = 0; + + snprintf(lwp_path, sizeof (lwp_path), "/proc/%d/lwp", (int)pid); + if ((dir = opendir(lwp_path)) == NULL) + return -1; + + struct dirent* entry = NULL; + while ((entry = readdir(dir)) != NULL) { + if ((strcmp(entry->d_name, ".") != 0) && + (strcmp(entry->d_name, "..") != 0)) { + int lwpid = 0; + int last_pid = 0; + if (LocalAtoi(entry->d_name, &lwpid) && last_pid != lwpid) { + last_pid = lwpid; + ++count; + if (callback_param && + !(callback_param->call_back)(lwpid, callback_param->context)) { + break; + } + } + } + } + + closedir(dir); + return count; +} + +#if defined(__i386) && !defined(NO_FRAME_POINTER) +void* GetNextFrame(void** last_ebp) { + void* sp = *last_ebp; + if ((unsigned long)sp == (unsigned long)last_ebp) + return NULL; + if ((unsigned long)sp & (sizeof(void*) - 1)) + return NULL; + if ((unsigned long)sp - (unsigned long)last_ebp > 100000) + return NULL; + return sp; +} +#elif defined(__sparc) +void* GetNextFrame(void* last_ebp) { + return reinterpret_cast(last_ebp)->fr_savfp; +} +#else +void* GetNextFrame(void** last_ebp) { + return reinterpret_cast(last_ebp); +} +#endif + + +class AutoCloser { + public: + AutoCloser(int fd) : fd_(fd) {} + ~AutoCloser() { if (fd_) close(fd_); } + private: + int fd_; +}; + +// Control the execution of the lwp. +// Suspend/Resume lwp based on the value of context. +static bool ControlLwp(int lwpid, void* context) { + // The current thread is the one to handle the crash. Ignore it. + if (lwpid != pthread_self()) { + int ctlfd; + char procname[PATH_MAX]; + bool suspend = *(bool*)context; + + // Open the /proc/$pid/lwp/$lwpid/lwpctl files + snprintf(procname, sizeof (procname), "/proc/self/lwp/%d/lwpctl", lwpid); + + if ((ctlfd = open(procname, O_WRONLY|O_EXCL)) < 0) { + print_message2(2, "failed to open %s in ControlLwp\n", procname); + return false; + } + + AutoCloser autocloser(ctlfd); + + long ctl[2]; + ctl[0] = suspend ? PCSTOP : PCRUN; + ctl[1] = 0; + if (write(ctlfd, ctl, sizeof (ctl)) != sizeof (ctl)) { + print_message2(2, "failed in lwp %d\n", lwpid); + return false; + } + } + + return true; +} + +/* + * Utility function to read the contents of a file that contains a + * prheader_t at the start (/proc/$pid/lstatus or /proc/$pid/lpsinfo). + * Return true on success. + */ +static bool read_lfile(int pid, const char* lname, prheader_t* lhp) { + char lpath[PATH_MAX]; + struct stat statb; + int fd; + size_t size; + + snprintf(lpath, sizeof (lpath), "/proc/%d/%s", pid, lname); + if ((fd = open(lpath, O_RDONLY)) < 0) { + print_message2(2, "failed to open %s in read_lfile\n", lpath); + return false; + } + + AutoCloser autocloser(fd); + + if (fstat(fd, &statb) != 0) + return false; + + size = statb.st_size; + if ((size / sizeof (prheader_t)) + 32 > HEADER_MAX) { + print_message1(2, "map size overflow\n"); + return false; + } + + if (pread(fd, lhp, size, 0) <= sizeof (prheader_t)) + return false; + + return true; +} + +} // namespace + +namespace google_breakpad { + +SolarisLwp::SolarisLwp(int pid) : pid_(pid) { +} + +SolarisLwp::~SolarisLwp() { +} + +int SolarisLwp::ControlAllLwps(bool suspend) { + CallbackParam callback_param(ControlLwp, &suspend); + return IterateLwpAll(pid_, &callback_param); +} + +int SolarisLwp::GetLwpCount() const { + return IterateLwpAll(pid_, NULL); +} + +int SolarisLwp::Lwp_iter_all(int pid, + CallbackParam* callback_param) const { + lwpstatus_t* Lsp; + lwpstatus_t* sp; + prheader_t lphp[HEADER_MAX]; + prheader_t lhp[HEADER_MAX]; + prheader_t* Lphp = lphp; + prheader_t* Lhp = lhp; + lwpsinfo_t* Lpsp; + long nstat; + long ninfo; + int rv = 0; + + /* + * The /proc/pid/lstatus file has the array of lwpstatus_t's and the + * /proc/pid/lpsinfo file has the array of lwpsinfo_t's. + */ + if (read_lfile(pid, "lstatus", Lhp) == NULL) + return -1; + if (read_lfile(pid, "lpsinfo", Lphp) == NULL) { + return -1; + } + + Lsp = (lwpstatus_t*)(uintptr_t)(Lhp + 1); + Lpsp = (lwpsinfo_t*)(uintptr_t)(Lphp + 1); + + for (ninfo = Lphp->pr_nent; ninfo != 0; --ninfo) { + if (Lpsp->pr_sname != 'Z') { + sp = Lsp; + Lsp = (lwpstatus_t*)((uintptr_t)Lsp + Lhp->pr_entsize); + } else { + sp = NULL; + } + if (callback_param && + !(callback_param->call_back)(sp, callback_param->context)) + break; + ++rv; + Lpsp = (lwpsinfo_t*)((uintptr_t)Lpsp + Lphp->pr_entsize); + } + + return rv; +} + +uintptr_t SolarisLwp::GetLwpStackBottom(uintptr_t current_esp) const { + AddressValidatingContext addr; + addr.address = current_esp; + CallbackParam callback_param(AddressNotInModuleCallback, + &addr); + ListModules(&callback_param); + return stack_base_address; +} + +int SolarisLwp::GetModuleCount() const { + return ListModules(NULL); +} + +int SolarisLwp::ListModules( + CallbackParam* callback_param) const { + const char* maps_path = "/proc/self/map"; + struct stat status; + int fd = 0, num; + prmap_t map_array[MAP_MAX]; + prmap_t* maps = map_array; + size_t size; + + if ((fd = open(maps_path, O_RDONLY)) == -1) { + print_message2(2, "failed to open %s in ListModules\n", maps_path); + return -1; + } + + AutoCloser autocloser(fd); + + if (fstat(fd, &status)) + return -1; + + /* + * Determine number of mappings, this value must be + * larger than the actual module count + */ + size = status.st_size; + if ((num = (int)(size / sizeof (prmap_t))) > MAP_MAX) { + print_message1(2, "map size overflow\n"); + return -1; + } + + if (read(fd, (void*)maps, size) < 0) { + print_message2(2, "failed to read %d\n", fd); + return -1; + } + + prmap_t* _maps; + int _num; + int module_count = 0; + + /* + * Scan each mapping - note it is assummed that the mappings are + * presented in order. We fill holes between mappings. On intel + * the last mapping is usually the data segment of ld.so.1, after + * this comes a red zone into which non-fixed mapping won't get + * place. Thus we can simply bail from the loop after seeing the + * last mapping. + */ + for (_num = 0, _maps = maps; _num < num; ++_num, ++_maps) { + ModuleInfo module; + char* name = _maps->pr_mapname; + + memset(&module, 0, sizeof (module)); + module.start_addr = _maps->pr_vaddr; + module.size = _maps->pr_size; + if (strlen(name) > 0) { + int objectfd = 0; + char path[PATH_MAX]; + char buf[SELFMAG]; + + snprintf(path, sizeof (path), "/proc/self/object/%s", name); + if ((objectfd = open(path, O_RDONLY)) < 0) { + print_message1(2, "can't open module file\n"); + continue; + } + + AutoCloser autocloser(objectfd); + + if (read(objectfd, buf, SELFMAG) != SELFMAG) { + print_message1(2, "can't read module file\n"); + continue; + } + if (buf[0] != ELFMAG0 || buf[1] != ELFMAG1 || + buf[2] != ELFMAG2 || buf[3] != ELFMAG3) { + continue; + } + + strncpy(module.name, name, sizeof (module.name) - 1); + ++module_count; + } + if (callback_param && + (!callback_param->call_back(module, callback_param->context))) { + break; + } + } + + return module_count; +} + +// Check if the address is a valid virtual address. +// If the address is in any of the mapped modules, we take it as valid. +// Otherwise it is invalid. +bool SolarisLwp::IsAddressMapped(uintptr_t address) const { + AddressValidatingContext addr; + addr.address = address; + CallbackParam callback_param(AddressNotInModuleCallback, + &addr); + ListModules(&callback_param); + return addr.is_mapped; +} + +// We're looking for a ucontext_t as the second parameter +// to a signal handler function call. Luckily, the ucontext_t +// has an ebp(fp on SPARC) member which should match the ebp(fp) +// pointed to by the ebp(fp) of the signal handler frame. +// The Solaris stack looks like this: +// http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libproc/common/Pstack.c#81 +bool SolarisLwp::FindSigContext(uintptr_t sighandler_ebp, + ucontext_t** sig_ctx) { + uintptr_t previous_ebp; + uintptr_t sig_ebp; + const int MAX_STACK_DEPTH = 50; + int depth_counter = 0; + + do { +#if TARGET_CPU_SPARC + previous_ebp = reinterpret_cast(GetNextFrame( + reinterpret_cast(sighandler_ebp))); + *sig_ctx = reinterpret_cast(sighandler_ebp + sizeof (struct frame)); + uintptr_t sig_esp = (*sig_ctx)->uc_mcontext.gregs[REG_O6]; + if (sig_esp < previous_ebp && sig_esp > sighandler_ebp) + sig_ebp = (uintptr_t)(((struct frame*)sig_esp)->fr_savfp); + +#elif TARGET_CPU_X86 + previous_ebp = reinterpret_cast(GetNextFrame( + reinterpret_cast(sighandler_ebp))); + *sig_ctx = reinterpret_cast(sighandler_ebp + sizeof (struct frame) + + 3 * sizeof(uintptr_t)); + sig_ebp = (*sig_ctx)->uc_mcontext.gregs[EBP]; +#endif + sighandler_ebp = previous_ebp; + depth_counter++; + } while(previous_ebp != sig_ebp && sighandler_ebp != 0 && + IsAddressMapped(sighandler_ebp) && depth_counter < MAX_STACK_DEPTH); + + return previous_ebp == sig_ebp && previous_ebp != 0; +} + +} // namespace google_breakpad diff --git a/src/client/solaris/handler/solaris_lwp.h b/src/client/solaris/handler/solaris_lwp.h new file mode 100644 index 0000000..f27d6b7 --- /dev/null +++ b/src/client/solaris/handler/solaris_lwp.h @@ -0,0 +1,159 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifndef CLIENT_SOLARIS_HANDLER_SOLARIS_LWP_H__ +#define CLIENT_SOLARIS_HANDLER_SOLARIS_LWP_H__ + +#if defined(sparc) || defined(__sparc) +#define TARGET_CPU_SPARC 1 +#elif defined(i386) || defined(__i386) +#define TARGET_CPU_X86 1 +#else +#error "cannot determine cpu type" +#endif + +#include +#include +#include +#include + +#ifndef _KERNEL +#define _KERNEL +#define MUST_UNDEF_KERNEL +#endif // _KERNEL +#include +#ifdef MUST_UNDEF_KERNEL +#undef _KERNEL +#undef MUST_UNDEF_KERNEL +#endif // MUST_UNDEF_KERNEL + +namespace google_breakpad { + +// Max module path name length. +static const int kMaxModuleNameLength = 256; + +// Holding infomaton about a module in the process. +struct ModuleInfo { + char name[kMaxModuleNameLength]; + uintptr_t start_addr; + int size; +}; + +// A callback to run when getting a lwp in the process. +// Return true will go on to the next lwp while return false will stop the +// iteration. +typedef bool (*LwpCallback)(lwpstatus_t* lsp, void* context); + +// A callback to run when a new module is found in the process. +// Return true will go on to the next module while return false will stop the +// iteration. +typedef bool (*ModuleCallback)(const ModuleInfo& module_info, void* context); + +// A callback to run when getting a lwpid in the process. +// Return true will go on to the next lwp while return false will stop the +// iteration. +typedef bool (*LwpidCallback)(int lwpid, void* context); + +// Holding the callback information. +template +struct CallbackParam { + // Callback function address. + CallbackFunc call_back; + // Callback context; + void* context; + + CallbackParam() : call_back(NULL), context(NULL) { + } + + CallbackParam(CallbackFunc func, void* func_context) : + call_back(func), context(func_context) { + } +}; + +/////////////////////////////////////////////////////////////////////////////// + +// +// SolarisLwp +// +// Provides handy support for operation on Solaris lwps. +// It uses proc file system to get lwp information. +// +// TODO(Alfred): Currently it only supports x86. Add SPARC support. +// +class SolarisLwp { + public: + // Create a SolarisLwp instance to list all the lwps in a process. + explicit SolarisLwp(int pid); + ~SolarisLwp(); + + int getpid() const { return this->pid_; } + + // Control all the lwps in the process. + // Return the number of suspended/resumed lwps in the process. + // Return -1 means failed to control lwps. + int ControlAllLwps(bool suspend); + + // Get the count of lwps in the process. + // Return -1 means error. + int GetLwpCount() const; + + // Iterate the lwps of process. + // Whenever there is a lwp found, the callback will be invoked to process + // the information. + // Return the callback return value or -1 on error. + int Lwp_iter_all(int pid, CallbackParam* callback_param) const; + + // Get the module count of the current process. + int GetModuleCount() const; + + // Get the mapped modules in the address space. + // Whenever a module is found, the callback will be invoked to process the + // information. + // Return how may modules are found. + int ListModules(CallbackParam* callback_param) const; + + // Get the bottom of the stack from esp. + uintptr_t GetLwpStackBottom(uintptr_t current_esp) const; + + // Finds a signal context on the stack given the ebp of our signal handler. + bool FindSigContext(uintptr_t sighandler_ebp, ucontext_t** sig_ctx); + + private: + // Check if the address is a valid virtual address. + bool IsAddressMapped(uintptr_t address) const; + + private: + // The pid of the process we are listing lwps. + int pid_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_SOLARIS_HANDLER_SOLARIS_LWP_H__ diff --git a/src/client/windows/common/auto_critical_section.h b/src/client/windows/common/auto_critical_section.h new file mode 100644 index 0000000..75ed4b9 --- /dev/null +++ b/src/client/windows/common/auto_critical_section.h @@ -0,0 +1,80 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ +#define CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ + +#include + +namespace google_breakpad { + +// Automatically enters the critical section in the constructor and leaves +// the critical section in the destructor. +class AutoCriticalSection { + public: + // Creates a new instance with the given critical section object + // and enters the critical section immediately. + explicit AutoCriticalSection(CRITICAL_SECTION* cs) : cs_(cs), taken_(false) { + assert(cs_); + Acquire(); + } + + // Destructor: leaves the critical section. + ~AutoCriticalSection() { + if (taken_) { + Release(); + } + } + + // Enters the critical section. Recursive Acquire() calls are not allowed. + void Acquire() { + assert(!taken_); + EnterCriticalSection(cs_); + taken_ = true; + } + + // Leaves the critical section. The caller should not call Release() unless + // the critical seciton has been entered already. + void Release() { + assert(taken_); + taken_ = false; + LeaveCriticalSection(cs_); + } + + private: + // Disable copy ctor and operator=. + AutoCriticalSection(const AutoCriticalSection&); + AutoCriticalSection& operator=(const AutoCriticalSection&); + + CRITICAL_SECTION* cs_; + bool taken_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ diff --git a/src/client/windows/common/ipc_protocol.h b/src/client/windows/common/ipc_protocol.h new file mode 100644 index 0000000..7e0c24e --- /dev/null +++ b/src/client/windows/common/ipc_protocol.h @@ -0,0 +1,180 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ +#define CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ + +#include +#include +#include +#include +#include "common/windows/string_utils-inl.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Name/value pair for custom client information. +struct CustomInfoEntry { + // Maximum length for name and value for client custom info. + static const int kNameMaxLength = 64; + static const int kValueMaxLength = 64; + + CustomInfoEntry() { + // Putting name and value in initializer list makes VC++ show warning 4351. + set_name(NULL); + set_value(NULL); + } + + CustomInfoEntry(const wchar_t* name_arg, const wchar_t* value_arg) { + set_name(name_arg); + set_value(value_arg); + } + + void set_name(const wchar_t* name_arg) { + if (!name_arg) { + name[0] = L'\0'; + return; + } + WindowsStringUtils::safe_wcscpy(name, kNameMaxLength, name_arg); + } + + void set_value(const wchar_t* value_arg) { + if (!value_arg) { + value[0] = L'\0'; + return; + } + + WindowsStringUtils::safe_wcscpy(value, kValueMaxLength, value_arg); + } + + void set(const wchar_t* name_arg, const wchar_t* value_arg) { + set_name(name_arg); + set_value(value_arg); + } + + wchar_t name[kNameMaxLength]; + wchar_t value[kValueMaxLength]; +}; + +// Constants for the protocol between client and the server. + +// Tags sent with each message indicating the purpose of +// the message. +enum MessageTag { + MESSAGE_TAG_NONE = 0, + MESSAGE_TAG_REGISTRATION_REQUEST = 1, + MESSAGE_TAG_REGISTRATION_RESPONSE = 2, + MESSAGE_TAG_REGISTRATION_ACK = 3, + MESSAGE_TAG_UPLOAD_REQUEST = 4 +}; + +struct CustomClientInfo { + const CustomInfoEntry* entries; + size_t count; +}; + +// Message structure for IPC between crash client and crash server. +struct ProtocolMessage { + ProtocolMessage() + : tag(MESSAGE_TAG_NONE), + id(0), + dump_type(MiniDumpNormal), + thread_id(0), + exception_pointers(NULL), + assert_info(NULL), + custom_client_info(), + dump_request_handle(NULL), + dump_generated_handle(NULL), + server_alive_handle(NULL) { + } + + // Creates an instance with the given parameters. + ProtocolMessage(MessageTag arg_tag, + DWORD arg_id, + MINIDUMP_TYPE arg_dump_type, + DWORD* arg_thread_id, + EXCEPTION_POINTERS** arg_exception_pointers, + MDRawAssertionInfo* arg_assert_info, + const CustomClientInfo& custom_info, + HANDLE arg_dump_request_handle, + HANDLE arg_dump_generated_handle, + HANDLE arg_server_alive) + : tag(arg_tag), + id(arg_id), + dump_type(arg_dump_type), + thread_id(arg_thread_id), + exception_pointers(arg_exception_pointers), + assert_info(arg_assert_info), + custom_client_info(custom_info), + dump_request_handle(arg_dump_request_handle), + dump_generated_handle(arg_dump_generated_handle), + server_alive_handle(arg_server_alive) { + } + + // Tag in the message. + MessageTag tag; + + // The id for this message. This may be either a process id or a crash id + // depending on the type of message. + DWORD id; + + // Dump type requested. + MINIDUMP_TYPE dump_type; + + // Client thread id pointer. + DWORD* thread_id; + + // Exception information. + EXCEPTION_POINTERS** exception_pointers; + + // Assert information in case of an invalid parameter or + // pure call failure. + MDRawAssertionInfo* assert_info; + + // Custom client information. + CustomClientInfo custom_client_info; + + // Handle to signal the crash event. + HANDLE dump_request_handle; + + // Handle to check if server is done generating crash. + HANDLE dump_generated_handle; + + // Handle to a mutex that becomes signaled (WAIT_ABANDONED) + // if server process goes down. + HANDLE server_alive_handle; + + private: + // Disable copy ctor and operator=. + ProtocolMessage(const ProtocolMessage& msg); + ProtocolMessage& operator=(const ProtocolMessage& msg); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ diff --git a/src/client/windows/crash_generation/ReadMe.txt b/src/client/windows/crash_generation/ReadMe.txt new file mode 100644 index 0000000..b54d0e1 --- /dev/null +++ b/src/client/windows/crash_generation/ReadMe.txt @@ -0,0 +1,58 @@ +========================================================================= + State machine transitions for the Crash Generation Server +========================================================================= + +========================================================================= + | + STATE | ACTIONS + | +========================================================================= + ERROR | Clean up resources used to serve clients. + | Always remain in ERROR state. +------------------------------------------------------------------------- + INITIAL | Connect to the pipe asynchronously. + | If connection is successfully queued up asynchronously, + | go into CONNECTING state. + | If connection is done synchronously, go into CONNECTED + | state. + | For any unexpected problems, go into ERROR state. +------------------------------------------------------------------------- + CONNECTING | Get the result of async connection request. + | If I/O is still incomplete, remain in the CONNECTING + | state. + | If connection is complete, go into CONNECTED state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + CONNECTED | Read from the pipe asynchronously. + | If read request is successfully queued up asynchronously, + | go into READING state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + READING | Get the result of async read request. + | If read is done, go into READ_DONE state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + READ_DONE | Register the client, prepare the reply and write the + | reply to the pipe asynchronously. + | If write request is successfully queued up asynchronously, + | go into WRITING state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + WRITING | Get the result of the async write request. + | If write is done, go into WRITE_DONE state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + WRITE_DONE | Read from the pipe asynchronously (for an ACK). + | If read request is successfully queued up asynchonously, + | go into READING_ACK state. + | For any unexpected problems, go into DISCONNECTING state. +------------------------------------------------------------------------- + READING_ACK | Get the result of the async read request. + | If read is done, perform action for successful client + | connection. + | Go into DISCONNECTING state. +------------------------------------------------------------------------- + DISCONNECTING | Disconnect from the pipe, reset the event and go into + | INITIAL state and signal the event again. If anything + | fails, go into ERROR state. +========================================================================= diff --git a/src/client/windows/crash_generation/client_info.cc b/src/client/windows/crash_generation/client_info.cc new file mode 100644 index 0000000..61ee212 --- /dev/null +++ b/src/client/windows/crash_generation/client_info.cc @@ -0,0 +1,226 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/windows/crash_generation/client_info.h" +#include "client/windows/common/ipc_protocol.h" + +static const wchar_t kCustomInfoProcessUptimeName[] = L"ptime"; +static const size_t kMaxCustomInfoEntries = 4096; + +namespace google_breakpad { + +ClientInfo::ClientInfo(CrashGenerationServer* crash_server, + DWORD pid, + MINIDUMP_TYPE dump_type, + DWORD* thread_id, + EXCEPTION_POINTERS** ex_info, + MDRawAssertionInfo* assert_info, + const CustomClientInfo& custom_client_info) + : crash_server_(crash_server), + pid_(pid), + dump_type_(dump_type), + ex_info_(ex_info), + assert_info_(assert_info), + custom_client_info_(custom_client_info), + thread_id_(thread_id), + process_handle_(NULL), + dump_requested_handle_(NULL), + dump_generated_handle_(NULL), + dump_request_wait_handle_(NULL), + process_exit_wait_handle_(NULL), + crash_id_(NULL) { + GetSystemTimeAsFileTime(&start_time_); +} + +bool ClientInfo::Initialize() { + process_handle_ = OpenProcess(GENERIC_ALL, FALSE, pid_); + if (!process_handle_) { + return false; + } + + // The crash_id will be the low order word of the process creation time. + FILETIME creation_time, exit_time, kernel_time, user_time; + if (GetProcessTimes(process_handle_, &creation_time, &exit_time, + &kernel_time, &user_time)) { + start_time_ = creation_time; + } + crash_id_ = start_time_.dwLowDateTime; + + dump_requested_handle_ = CreateEvent(NULL, // Security attributes. + TRUE, // Manual reset. + FALSE, // Initial state. + NULL); // Name. + if (!dump_requested_handle_) { + return false; + } + + dump_generated_handle_ = CreateEvent(NULL, // Security attributes. + TRUE, // Manual reset. + FALSE, // Initial state. + NULL); // Name. + return dump_generated_handle_ != NULL; +} + +void ClientInfo::UnregisterDumpRequestWaitAndBlockUntilNoPending() { + if (dump_request_wait_handle_) { + // Wait for callbacks that might already be running to finish. + UnregisterWaitEx(dump_request_wait_handle_, INVALID_HANDLE_VALUE); + dump_request_wait_handle_ = NULL; + } +} + +void ClientInfo::UnregisterProcessExitWait(bool block_until_no_pending) { + if (process_exit_wait_handle_) { + if (block_until_no_pending) { + // Wait for the callback that might already be running to finish. + UnregisterWaitEx(process_exit_wait_handle_, INVALID_HANDLE_VALUE); + } else { + UnregisterWait(process_exit_wait_handle_); + } + process_exit_wait_handle_ = NULL; + } +} + +ClientInfo::~ClientInfo() { + // Waiting for the callback to finish here is safe because ClientInfo's are + // never destroyed from the dump request handling callback. + UnregisterDumpRequestWaitAndBlockUntilNoPending(); + + // This is a little tricky because ClientInfo's may be destroyed by the same + // callback (OnClientEnd) and waiting for it to finish will cause a deadlock. + // Regardless of this complication, wait for any running callbacks to finish + // so that the common case is properly handled. In order to avoid deadlocks, + // the OnClientEnd callback must call UnregisterProcessExitWait(false) + // before deleting the ClientInfo. + UnregisterProcessExitWait(true); + + if (process_handle_) { + CloseHandle(process_handle_); + } + + if (dump_requested_handle_) { + CloseHandle(dump_requested_handle_); + } + + if (dump_generated_handle_) { + CloseHandle(dump_generated_handle_); + } +} + +bool ClientInfo::GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const { + SIZE_T bytes_count = 0; + if (!ReadProcessMemory(process_handle_, + ex_info_, + ex_info, + sizeof(*ex_info), + &bytes_count)) { + return false; + } + + return bytes_count == sizeof(*ex_info); +} + +bool ClientInfo::GetClientThreadId(DWORD* thread_id) const { + SIZE_T bytes_count = 0; + if (!ReadProcessMemory(process_handle_, + thread_id_, + thread_id, + sizeof(*thread_id), + &bytes_count)) { + return false; + } + + return bytes_count == sizeof(*thread_id); +} + +void ClientInfo::SetProcessUptime() { + FILETIME now = {0}; + GetSystemTimeAsFileTime(&now); + + ULARGE_INTEGER time_start; + time_start.HighPart = start_time_.dwHighDateTime; + time_start.LowPart = start_time_.dwLowDateTime; + + ULARGE_INTEGER time_now; + time_now.HighPart = now.dwHighDateTime; + time_now.LowPart = now.dwLowDateTime; + + // Calculate the delay and convert it from 100-nanoseconds to milliseconds. + __int64 delay = (time_now.QuadPart - time_start.QuadPart) / 10 / 1000; + + // Convert it to a string. + wchar_t* value = custom_info_entries_.get()[custom_client_info_.count].value; + _i64tow_s(delay, value, CustomInfoEntry::kValueMaxLength, 10); +} + +bool ClientInfo::PopulateCustomInfo() { + if (custom_client_info_.count > kMaxCustomInfoEntries) + return false; + + SIZE_T bytes_count = 0; + SIZE_T read_count = sizeof(CustomInfoEntry) * custom_client_info_.count; + + // If the scoped array for custom info already has an array, it will be + // the same size as what we need. This is because the number of custom info + // entries is always the same. So allocate memory only if scoped array has + // a NULL pointer. + if (!custom_info_entries_.get()) { + // Allocate an extra entry for reporting uptime for the client process. + custom_info_entries_.reset( + new CustomInfoEntry[custom_client_info_.count + 1]); + // Use the last element in the array for uptime. + custom_info_entries_.get()[custom_client_info_.count].set_name( + kCustomInfoProcessUptimeName); + } + + if (!ReadProcessMemory(process_handle_, + custom_client_info_.entries, + custom_info_entries_.get(), + read_count, + &bytes_count)) { + return false; + } + + SetProcessUptime(); + return (bytes_count == read_count); +} + +CustomClientInfo ClientInfo::GetCustomInfo() const { + CustomClientInfo custom_info; + custom_info.entries = custom_info_entries_.get(); + // Add 1 to the count from the client process to account for extra entry for + // process uptime. + custom_info.count = custom_client_info_.count + 1; + return custom_info; +} + +} // namespace google_breakpad diff --git a/src/client/windows/crash_generation/client_info.h b/src/client/windows/crash_generation/client_info.h new file mode 100644 index 0000000..1c9cd3c --- /dev/null +++ b/src/client/windows/crash_generation/client_info.h @@ -0,0 +1,176 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ +#define CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ + +#include +#include +#include "client/windows/common/ipc_protocol.h" +#include "common/scoped_ptr.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +class CrashGenerationServer; + +// Abstraction for a crash client process. +class ClientInfo { + public: + // Creates an instance with the given values. Gets the process + // handle for the given process id and creates necessary event + // objects. + ClientInfo(CrashGenerationServer* crash_server, + DWORD pid, + MINIDUMP_TYPE dump_type, + DWORD* thread_id, + EXCEPTION_POINTERS** ex_info, + MDRawAssertionInfo* assert_info, + const CustomClientInfo& custom_client_info); + + ~ClientInfo(); + + CrashGenerationServer* crash_server() const { return crash_server_; } + DWORD pid() const { return pid_; } + MINIDUMP_TYPE dump_type() const { return dump_type_; } + EXCEPTION_POINTERS** ex_info() const { return ex_info_; } + MDRawAssertionInfo* assert_info() const { return assert_info_; } + DWORD* thread_id() const { return thread_id_; } + HANDLE process_handle() const { return process_handle_; } + HANDLE dump_requested_handle() const { return dump_requested_handle_; } + HANDLE dump_generated_handle() const { return dump_generated_handle_; } + DWORD crash_id() const { return crash_id_; } + const CustomClientInfo& custom_client_info() const { + return custom_client_info_; + } + + void set_dump_request_wait_handle(HANDLE value) { + dump_request_wait_handle_ = value; + } + + void set_process_exit_wait_handle(HANDLE value) { + process_exit_wait_handle_ = value; + } + + // Unregister the dump request wait operation and wait for all callbacks + // that might already be running to complete before returning. + void UnregisterDumpRequestWaitAndBlockUntilNoPending(); + + // Unregister the process exit wait operation. If block_until_no_pending is + // true, wait for all callbacks that might already be running to complete + // before returning. + void UnregisterProcessExitWait(bool block_until_no_pending); + + bool Initialize(); + bool GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const; + bool GetClientThreadId(DWORD* thread_id) const; + + // Reads the custom information from the client process address space. + bool PopulateCustomInfo(); + + // Returns the client custom information. + CustomClientInfo GetCustomInfo() const; + + private: + // Calcualtes the uptime for the client process, converts it to a string and + // stores it in the last entry of client custom info. + void SetProcessUptime(); + + // Crash generation server. + CrashGenerationServer* crash_server_; + + // Client process ID. + DWORD pid_; + + // Dump type requested by the client. + MINIDUMP_TYPE dump_type_; + + // Address of an EXCEPTION_POINTERS* variable in the client + // process address space that will point to an instance of + // EXCEPTION_POINTERS containing information about crash. + // + // WARNING: Do not dereference these pointers as they are pointers + // in the address space of another process. + EXCEPTION_POINTERS** ex_info_; + + // Address of an instance of MDRawAssertionInfo in the client + // process address space that will contain information about + // non-exception related crashes like invalid parameter assertion + // failures and pure calls. + // + // WARNING: Do not dereference these pointers as they are pointers + // in the address space of another process. + MDRawAssertionInfo* assert_info_; + + // Custom information about the client. + CustomClientInfo custom_client_info_; + + // Contains the custom client info entries read from the client process + // memory. This will be populated only if the method GetClientCustomInfo + // is called. + scoped_array custom_info_entries_; + + // Address of a variable in the client process address space that + // will contain the thread id of the crashing client thread. + // + // WARNING: Do not dereference these pointers as they are pointers + // in the address space of another process. + DWORD* thread_id_; + + // Client process handle. + HANDLE process_handle_; + + // Dump request event handle. + HANDLE dump_requested_handle_; + + // Dump generated event handle. + HANDLE dump_generated_handle_; + + // Wait handle for dump request event. + HANDLE dump_request_wait_handle_; + + // Wait handle for process exit event. + HANDLE process_exit_wait_handle_; + + // Time when the client process started. It is used to determine the uptime + // for the client process when it signals a crash. + FILETIME start_time_; + + // The crash id which can be used to request an upload. This will be the + // value of the low order dword of the process creation time for the process + // being dumped. + DWORD crash_id_; + + // Disallow copy ctor and operator=. + ClientInfo(const ClientInfo& client_info); + ClientInfo& operator=(const ClientInfo& client_info); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ diff --git a/src/client/windows/crash_generation/crash_generation_client.cc b/src/client/windows/crash_generation/crash_generation_client.cc new file mode 100644 index 0000000..c3d6a2b --- /dev/null +++ b/src/client/windows/crash_generation/crash_generation_client.cc @@ -0,0 +1,408 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/windows/crash_generation/crash_generation_client.h" +#include +#include +#include "client/windows/common/ipc_protocol.h" + +namespace google_breakpad { + +const int kPipeBusyWaitTimeoutMs = 2000; + +#ifdef _DEBUG +const DWORD kWaitForServerTimeoutMs = INFINITE; +#else +const DWORD kWaitForServerTimeoutMs = 15000; +#endif + +const int kPipeConnectMaxAttempts = 2; + +const DWORD kPipeDesiredAccess = FILE_READ_DATA | + FILE_WRITE_DATA | + FILE_WRITE_ATTRIBUTES; + +const DWORD kPipeFlagsAndAttributes = SECURITY_IDENTIFICATION | + SECURITY_SQOS_PRESENT; + +const DWORD kPipeMode = PIPE_READMODE_MESSAGE; + +const size_t kWaitEventCount = 2; + +// This function is orphan for production code. It can be used +// for debugging to help repro some scenarios like the client +// is slow in writing to the pipe after connecting, the client +// is slow in reading from the pipe after writing, etc. The parameter +// overlapped below is not used and it is present to match the signature +// of this function to TransactNamedPipe Win32 API. Uncomment if needed +// for debugging. +/** +static bool TransactNamedPipeDebugHelper(HANDLE pipe, + const void* in_buffer, + DWORD in_size, + void* out_buffer, + DWORD out_size, + DWORD* bytes_count, + LPOVERLAPPED) { + // Uncomment the next sleep to create a gap before writing + // to pipe. + // Sleep(5000); + + if (!WriteFile(pipe, + in_buffer, + in_size, + bytes_count, + NULL)) { + return false; + } + + // Uncomment the next sleep to create a gap between write + // and read. + // Sleep(5000); + + return ReadFile(pipe, out_buffer, out_size, bytes_count, NULL) != FALSE; +} +**/ + +CrashGenerationClient::CrashGenerationClient( + const wchar_t* pipe_name, + MINIDUMP_TYPE dump_type, + const CustomClientInfo* custom_info) + : pipe_name_(pipe_name), + pipe_handle_(NULL), + custom_info_(), + dump_type_(dump_type), + crash_event_(NULL), + crash_generated_(NULL), + server_alive_(NULL), + server_process_id_(0), + thread_id_(0), + exception_pointers_(NULL) { + memset(&assert_info_, 0, sizeof(assert_info_)); + if (custom_info) { + custom_info_ = *custom_info; + } +} + +CrashGenerationClient::CrashGenerationClient( + HANDLE pipe_handle, + MINIDUMP_TYPE dump_type, + const CustomClientInfo* custom_info) + : pipe_name_(), + pipe_handle_(pipe_handle), + custom_info_(), + dump_type_(dump_type), + crash_event_(NULL), + crash_generated_(NULL), + server_alive_(NULL), + server_process_id_(0), + thread_id_(0), + exception_pointers_(NULL) { + memset(&assert_info_, 0, sizeof(assert_info_)); + if (custom_info) { + custom_info_ = *custom_info; + } +} + +CrashGenerationClient::~CrashGenerationClient() { + if (crash_event_) { + CloseHandle(crash_event_); + } + + if (crash_generated_) { + CloseHandle(crash_generated_); + } + + if (server_alive_) { + CloseHandle(server_alive_); + } +} + +// Performs the registration step with the server process. +// The registration step involves communicating with the server +// via a named pipe. The client sends the following pieces of +// data to the server: +// +// * Message tag indicating the client is requesting registration. +// * Process id of the client process. +// * Address of a DWORD variable in the client address space +// that will contain the thread id of the client thread that +// caused the crash. +// * Address of a EXCEPTION_POINTERS* variable in the client +// address space that will point to an instance of EXCEPTION_POINTERS +// when the crash happens. +// * Address of an instance of MDRawAssertionInfo that will contain +// relevant information in case of non-exception crashes like assertion +// failures and pure calls. +// +// In return the client expects the following information from the server: +// +// * Message tag indicating successful registration. +// * Server process id. +// * Handle to an object that client can signal to request dump +// generation from the server. +// * Handle to an object that client can wait on after requesting +// dump generation for the server to finish dump generation. +// * Handle to a mutex object that client can wait on to make sure +// server is still alive. +// +// If any step of the expected behavior mentioned above fails, the +// registration step is not considered successful and hence out-of-process +// dump generation service is not available. +// +// Returns true if the registration is successful; false otherwise. +bool CrashGenerationClient::Register() { + if (IsRegistered()) { + return true; + } + + HANDLE pipe = ConnectToServer(); + if (!pipe) { + return false; + } + + bool success = RegisterClient(pipe); + CloseHandle(pipe); + return success; +} + +bool CrashGenerationClient::RequestUpload(DWORD crash_id) { + HANDLE pipe = ConnectToServer(); + if (!pipe) { + return false; + } + + CustomClientInfo custom_info = {NULL, 0}; + ProtocolMessage msg(MESSAGE_TAG_UPLOAD_REQUEST, crash_id, + static_cast(NULL), NULL, NULL, NULL, + custom_info, NULL, NULL, NULL); + DWORD bytes_count = 0; + bool success = WriteFile(pipe, &msg, sizeof(msg), &bytes_count, NULL) != 0; + + CloseHandle(pipe); + return success; +} + +HANDLE CrashGenerationClient::ConnectToServer() { + HANDLE pipe = ConnectToPipe(pipe_name_.c_str(), + kPipeDesiredAccess, + kPipeFlagsAndAttributes); + if (!pipe) { + return NULL; + } + + DWORD mode = kPipeMode; + if (!SetNamedPipeHandleState(pipe, &mode, NULL, NULL)) { + CloseHandle(pipe); + pipe = NULL; + } + + return pipe; +} + +bool CrashGenerationClient::RegisterClient(HANDLE pipe) { + ProtocolMessage msg(MESSAGE_TAG_REGISTRATION_REQUEST, + GetCurrentProcessId(), + dump_type_, + &thread_id_, + &exception_pointers_, + &assert_info_, + custom_info_, + NULL, + NULL, + NULL); + ProtocolMessage reply; + DWORD bytes_count = 0; + // The call to TransactNamedPipe below can be changed to a call + // to TransactNamedPipeDebugHelper to help repro some scenarios. + // For details see comments for TransactNamedPipeDebugHelper. + if (!TransactNamedPipe(pipe, + &msg, + sizeof(msg), + &reply, + sizeof(ProtocolMessage), + &bytes_count, + NULL)) { + return false; + } + + if (!ValidateResponse(reply)) { + return false; + } + + ProtocolMessage ack_msg; + ack_msg.tag = MESSAGE_TAG_REGISTRATION_ACK; + + if (!WriteFile(pipe, &ack_msg, sizeof(ack_msg), &bytes_count, NULL)) { + return false; + } + crash_event_ = reply.dump_request_handle; + crash_generated_ = reply.dump_generated_handle; + server_alive_ = reply.server_alive_handle; + server_process_id_ = reply.id; + + return true; +} + +HANDLE CrashGenerationClient::ConnectToPipe(const wchar_t* pipe_name, + DWORD pipe_access, + DWORD flags_attrs) { + if (pipe_handle_) { + HANDLE t = pipe_handle_; + pipe_handle_ = NULL; + return t; + } + + for (int i = 0; i < kPipeConnectMaxAttempts; ++i) { + HANDLE pipe = CreateFile(pipe_name, + pipe_access, + 0, + NULL, + OPEN_EXISTING, + flags_attrs, + NULL); + if (pipe != INVALID_HANDLE_VALUE) { + return pipe; + } + + // Cannot continue retrying if error is something other than + // ERROR_PIPE_BUSY. + if (GetLastError() != ERROR_PIPE_BUSY) { + break; + } + + // Cannot continue retrying if wait on pipe fails. + if (!WaitNamedPipe(pipe_name, kPipeBusyWaitTimeoutMs)) { + break; + } + } + + return NULL; +} + +bool CrashGenerationClient::ValidateResponse( + const ProtocolMessage& msg) const { + return (msg.tag == MESSAGE_TAG_REGISTRATION_RESPONSE) && + (msg.id != 0) && + (msg.dump_request_handle != NULL) && + (msg.dump_generated_handle != NULL) && + (msg.server_alive_handle != NULL); +} + +bool CrashGenerationClient::IsRegistered() const { + return crash_event_ != NULL; +} + +bool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info, + MDRawAssertionInfo* assert_info) { + if (!IsRegistered()) { + return false; + } + + exception_pointers_ = ex_info; + thread_id_ = GetCurrentThreadId(); + + if (assert_info) { + memcpy(&assert_info_, assert_info, sizeof(assert_info_)); + } else { + memset(&assert_info_, 0, sizeof(assert_info_)); + } + + return SignalCrashEventAndWait(); +} + +bool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info) { + return RequestDump(ex_info, NULL); +} + +bool CrashGenerationClient::RequestDump(MDRawAssertionInfo* assert_info) { + return RequestDump(NULL, assert_info); +} + +bool CrashGenerationClient::SignalCrashEventAndWait() { + assert(crash_event_); + assert(crash_generated_); + assert(server_alive_); + + // Reset the dump generated event before signaling the crash + // event so that the server can set the dump generated event + // once it is done generating the event. + if (!ResetEvent(crash_generated_)) { + return false; + } + + if (!SetEvent(crash_event_)) { + return false; + } + + HANDLE wait_handles[kWaitEventCount] = {crash_generated_, server_alive_}; + + DWORD result = WaitForMultipleObjects(kWaitEventCount, + wait_handles, + FALSE, + kWaitForServerTimeoutMs); + + // Crash dump was successfully generated only if the server + // signaled the crash generated event. + return result == WAIT_OBJECT_0; +} + +HANDLE CrashGenerationClient::DuplicatePipeToClientProcess(const wchar_t* pipe_name, + HANDLE hProcess) { + for (int i = 0; i < kPipeConnectMaxAttempts; ++i) { + HANDLE local_pipe = CreateFile(pipe_name, kPipeDesiredAccess, + 0, NULL, OPEN_EXISTING, + kPipeFlagsAndAttributes, NULL); + if (local_pipe != INVALID_HANDLE_VALUE) { + HANDLE remotePipe = INVALID_HANDLE_VALUE; + if (DuplicateHandle(GetCurrentProcess(), local_pipe, + hProcess, &remotePipe, 0, FALSE, + DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) { + return remotePipe; + } else { + return INVALID_HANDLE_VALUE; + } + } + + // Cannot continue retrying if the error wasn't a busy pipe. + if (GetLastError() != ERROR_PIPE_BUSY) { + return INVALID_HANDLE_VALUE; + } + + if (!WaitNamedPipe(pipe_name, kPipeBusyWaitTimeoutMs)) { + return INVALID_HANDLE_VALUE; + } + } + return INVALID_HANDLE_VALUE; +} + +} // namespace google_breakpad diff --git a/src/client/windows/crash_generation/crash_generation_client.h b/src/client/windows/crash_generation/crash_generation_client.h new file mode 100644 index 0000000..f912bf5 --- /dev/null +++ b/src/client/windows/crash_generation/crash_generation_client.h @@ -0,0 +1,181 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ +#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ + +#include +#include +#include +#include +#include "client/windows/common/ipc_protocol.h" +#include "common/scoped_ptr.h" + +namespace google_breakpad { + +struct CustomClientInfo; + +// Abstraction of client-side implementation of out of process +// crash generation. +// +// The process that desires to have out-of-process crash dump +// generation service can use this class in the following way: +// +// * Create an instance. +// * Call Register method so that the client tries to register +// with the server process and check the return value. If +// registration is not successful, out-of-process crash dump +// generation will not be available +// * Request dump generation by calling either of the two +// overloaded RequestDump methods - one in case of exceptions +// and the other in case of assertion failures +// +// Note that it is the responsibility of the client code of +// this class to set the unhandled exception filter with the +// system by calling the SetUnhandledExceptionFilter function +// and the client code should explicitly request dump generation. +class CrashGenerationClient { + public: + CrashGenerationClient(const wchar_t* pipe_name, + MINIDUMP_TYPE dump_type, + const CustomClientInfo* custom_info); + + CrashGenerationClient(HANDLE pipe_handle, + MINIDUMP_TYPE dump_type, + const CustomClientInfo* custom_info); + + ~CrashGenerationClient(); + + // Registers the client process with the crash server. + // + // Returns true if the registration is successful; false otherwise. + bool Register(); + + // Requests the crash server to upload a previous dump with the + // given crash id. + bool RequestUpload(DWORD crash_id); + + bool RequestDump(EXCEPTION_POINTERS* ex_info, + MDRawAssertionInfo* assert_info); + + // Requests the crash server to generate a dump with the given + // exception information. + // + // Returns true if the dump was successful; false otherwise. Note that + // if the registration step was not performed or it was not successful, + // false will be returned. + bool RequestDump(EXCEPTION_POINTERS* ex_info); + + // Requests the crash server to generate a dump with the given + // assertion information. + // + // Returns true if the dump was successful; false otherwise. Note that + // if the registration step was not performed or it was not successful, + // false will be returned. + bool RequestDump(MDRawAssertionInfo* assert_info); + + // If the crash generation client is running in a sandbox that prevents it + // from opening the named pipe directly, the server process may open the + // handle and duplicate it into the client process with this helper method. + // Returns INVALID_HANDLE_VALUE on failure. The process must have been opened + // with the PROCESS_DUP_HANDLE access right. + static HANDLE DuplicatePipeToClientProcess(const wchar_t* pipe_name, + HANDLE hProcess); + + private: + // Connects to the appropriate pipe and sets the pipe handle state. + // + // Returns the pipe handle if everything goes well; otherwise Returns NULL. + HANDLE ConnectToServer(); + + // Performs a handshake with the server over the given pipe which should be + // already connected to the server. + // + // Returns true if handshake with the server was successful; false otherwise. + bool RegisterClient(HANDLE pipe); + + // Validates the given server response. + bool ValidateResponse(const ProtocolMessage& msg) const; + + // Returns true if the registration step succeeded; false otherwise. + bool IsRegistered() const; + + // Connects to the given named pipe with given parameters. + // + // Returns true if the connection is successful; false otherwise. + HANDLE ConnectToPipe(const wchar_t* pipe_name, + DWORD pipe_access, + DWORD flags_attrs); + + // Signals the crash event and wait for the server to generate crash. + bool SignalCrashEventAndWait(); + + // Pipe name to use to talk to server. + std::wstring pipe_name_; + + // Pipe handle duplicated from server process. Only valid before + // Register is called. + HANDLE pipe_handle_; + + // Custom client information + CustomClientInfo custom_info_; + + // Type of dump to generate. + MINIDUMP_TYPE dump_type_; + + // Event to signal in case of a crash. + HANDLE crash_event_; + + // Handle to wait on after signaling a crash for the server + // to finish generating crash dump. + HANDLE crash_generated_; + + // Handle to a mutex that will become signaled with WAIT_ABANDONED + // if the server process goes down. + HANDLE server_alive_; + + // Server process id. + DWORD server_process_id_; + + // Id of the thread that caused the crash. + DWORD thread_id_; + + // Exception pointers for an exception crash. + EXCEPTION_POINTERS* exception_pointers_; + + // Assertion info for an invalid parameter or pure call crash. + MDRawAssertionInfo assert_info_; + + // Disable copy ctor and operator=. + CrashGenerationClient(const CrashGenerationClient& crash_client); + CrashGenerationClient& operator=(const CrashGenerationClient& crash_client); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ diff --git a/src/client/windows/crash_generation/crash_generation_server.cc b/src/client/windows/crash_generation/crash_generation_server.cc new file mode 100644 index 0000000..61b0cbc --- /dev/null +++ b/src/client/windows/crash_generation/crash_generation_server.cc @@ -0,0 +1,946 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/windows/crash_generation/crash_generation_server.h" +#include +#include +#include +#include "client/windows/common/auto_critical_section.h" +#include "common/scoped_ptr.h" + +#include "client/windows/crash_generation/client_info.h" + +namespace google_breakpad { + +// Output buffer size. +static const size_t kOutBufferSize = 64; + +// Input buffer size. +static const size_t kInBufferSize = 64; + +// Access flags for the client on the dump request event. +static const DWORD kDumpRequestEventAccess = EVENT_MODIFY_STATE; + +// Access flags for the client on the dump generated event. +static const DWORD kDumpGeneratedEventAccess = EVENT_MODIFY_STATE | + SYNCHRONIZE; + +// Access flags for the client on the mutex. +static const DWORD kMutexAccess = SYNCHRONIZE; + +// Attribute flags for the pipe. +static const DWORD kPipeAttr = FILE_FLAG_FIRST_PIPE_INSTANCE | + PIPE_ACCESS_DUPLEX | + FILE_FLAG_OVERLAPPED; + +// Mode for the pipe. +static const DWORD kPipeMode = PIPE_TYPE_MESSAGE | + PIPE_READMODE_MESSAGE | + PIPE_WAIT; + +// For pipe I/O, execute the callback in the wait thread itself, +// since the callback does very little work. The callback executes +// the code for one of the states of the server state machine and +// the code for all of the states perform async I/O and hence +// finish very quickly. +static const ULONG kPipeIOThreadFlags = WT_EXECUTEINWAITTHREAD; + +// Dump request threads will, most likely, generate dumps. That may +// take some time to finish, so specify WT_EXECUTELONGFUNCTION flag. +static const ULONG kDumpRequestThreadFlags = WT_EXECUTEINWAITTHREAD | + WT_EXECUTELONGFUNCTION; + +static bool IsClientRequestValid(const ProtocolMessage& msg) { + return msg.tag == MESSAGE_TAG_UPLOAD_REQUEST || + (msg.tag == MESSAGE_TAG_REGISTRATION_REQUEST && + msg.id != 0 && + msg.thread_id != NULL && + msg.exception_pointers != NULL && + msg.assert_info != NULL); +} + +#ifndef NDEBUG +static bool CheckForIOIncomplete(bool success) { + // We should never get an I/O incomplete since we should not execute this + // unless the operation has finished and the overlapped event is signaled. If + // we do get INCOMPLETE, we have a bug in our code. + return success ? false : (GetLastError() == ERROR_IO_INCOMPLETE); +} +#endif + +CrashGenerationServer::CrashGenerationServer( + const std::wstring& pipe_name, + SECURITY_ATTRIBUTES* pipe_sec_attrs, + OnClientConnectedCallback connect_callback, + void* connect_context, + OnClientDumpRequestCallback dump_callback, + void* dump_context, + OnClientExitedCallback exit_callback, + void* exit_context, + OnClientUploadRequestCallback upload_request_callback, + void* upload_context, + bool generate_dumps, + const std::wstring* dump_path) + : pipe_name_(pipe_name), + pipe_sec_attrs_(pipe_sec_attrs), + pipe_(NULL), + pipe_wait_handle_(NULL), + server_alive_handle_(NULL), + connect_callback_(connect_callback), + connect_context_(connect_context), + dump_callback_(dump_callback), + dump_context_(dump_context), + exit_callback_(exit_callback), + exit_context_(exit_context), + upload_request_callback_(upload_request_callback), + upload_context_(upload_context), + generate_dumps_(generate_dumps), + pre_fetch_custom_info_(true), + dump_path_(dump_path ? *dump_path : L""), + server_state_(IPC_SERVER_STATE_UNINITIALIZED), + shutting_down_(false), + overlapped_(), + client_info_(NULL) { + InitializeCriticalSection(&sync_); +} + +// This should never be called from the OnPipeConnected callback. +// Otherwise the UnregisterWaitEx call below will cause a deadlock. +CrashGenerationServer::~CrashGenerationServer() { + // New scope to release the lock automatically. + { + // Make sure no clients are added or removed beyond this point. + // Before adding or removing any clients, the critical section + // must be entered and the shutting_down_ flag checked. The + // critical section is then exited only after the clients_ list + // modifications are done and the list is in a consistent state. + AutoCriticalSection lock(&sync_); + + // Indicate to existing threads that server is shutting down. + shutting_down_ = true; + } + // No one will modify the clients_ list beyond this point - + // not even from another thread. + + // Even if there are no current worker threads running, it is possible that + // an I/O request is pending on the pipe right now but not yet done. + // In fact, it's very likely this is the case unless we are in an ERROR + // state. If we don't wait for the pending I/O to be done, then when the I/O + // completes, it may write to invalid memory. AppVerifier will flag this + // problem too. So we disconnect from the pipe and then wait for the server + // to get into error state so that the pending I/O will fail and get + // cleared. + DisconnectNamedPipe(pipe_); + int num_tries = 100; + while (num_tries-- && server_state_ != IPC_SERVER_STATE_ERROR) { + Sleep(10); + } + + // Unregister wait on the pipe. + if (pipe_wait_handle_) { + // Wait for already executing callbacks to finish. + UnregisterWaitEx(pipe_wait_handle_, INVALID_HANDLE_VALUE); + } + + // Close the pipe to avoid further client connections. + if (pipe_) { + CloseHandle(pipe_); + } + + // Request all ClientInfo objects to unregister all waits. + // No need to enter the critical section because no one is allowed to modify + // the clients_ list once the shutting_down_ flag is set. + std::list::iterator iter; + for (iter = clients_.begin(); iter != clients_.end(); ++iter) { + ClientInfo* client_info = *iter; + // Unregister waits. Wait for already executing callbacks to finish. + // Unregister the client process exit wait first and only then unregister + // the dump request wait. The reason is that the OnClientExit callback + // also unregisters the dump request wait and such a race (doing the same + // unregistration from two threads) is undesirable. + client_info->UnregisterProcessExitWait(true); + client_info->UnregisterDumpRequestWaitAndBlockUntilNoPending(); + + // Destroying the ClientInfo here is safe because all wait operations for + // this ClientInfo were unregistered and no pending or running callbacks + // for this ClientInfo can possible exist (block_until_no_pending option + // was used). + delete client_info; + } + + if (server_alive_handle_) { + // Release the mutex before closing the handle so that clients requesting + // dumps wait for a long time for the server to generate a dump. + ReleaseMutex(server_alive_handle_); + CloseHandle(server_alive_handle_); + } + + if (overlapped_.hEvent) { + CloseHandle(overlapped_.hEvent); + } + + DeleteCriticalSection(&sync_); +} + +bool CrashGenerationServer::Start() { + if (server_state_ != IPC_SERVER_STATE_UNINITIALIZED) { + return false; + } + + server_state_ = IPC_SERVER_STATE_INITIAL; + + server_alive_handle_ = CreateMutex(NULL, TRUE, NULL); + if (!server_alive_handle_) { + return false; + } + + // Event to signal the client connection and pipe reads and writes. + overlapped_.hEvent = CreateEvent(NULL, // Security descriptor. + TRUE, // Manual reset. + FALSE, // Initially nonsignaled. + NULL); // Name. + if (!overlapped_.hEvent) { + return false; + } + + // Register a callback with the thread pool for the client connection. + if (!RegisterWaitForSingleObject(&pipe_wait_handle_, + overlapped_.hEvent, + OnPipeConnected, + this, + INFINITE, + kPipeIOThreadFlags)) { + return false; + } + + pipe_ = CreateNamedPipe(pipe_name_.c_str(), + kPipeAttr, + kPipeMode, + 1, + kOutBufferSize, + kInBufferSize, + 0, + pipe_sec_attrs_); + if (pipe_ == INVALID_HANDLE_VALUE) { + return false; + } + + // Kick-start the state machine. This will initiate an asynchronous wait + // for client connections. + if (!SetEvent(overlapped_.hEvent)) { + server_state_ = IPC_SERVER_STATE_ERROR; + return false; + } + + // If we are in error state, it's because we failed to start listening. + return true; +} + +// If the server thread serving clients ever gets into the +// ERROR state, reset the event, close the pipe and remain +// in the error state forever. Error state means something +// that we didn't account for has happened, and it's dangerous +// to do anything unknowingly. +void CrashGenerationServer::HandleErrorState() { + assert(server_state_ == IPC_SERVER_STATE_ERROR); + + // If the server is shutting down anyway, don't clean up + // here since shut down process will clean up. + if (shutting_down_) { + return; + } + + if (pipe_wait_handle_) { + UnregisterWait(pipe_wait_handle_); + pipe_wait_handle_ = NULL; + } + + if (pipe_) { + CloseHandle(pipe_); + pipe_ = NULL; + } + + if (overlapped_.hEvent) { + CloseHandle(overlapped_.hEvent); + overlapped_.hEvent = NULL; + } +} + +// When the server thread serving clients is in the INITIAL state, +// try to connect to the pipe asynchronously. If the connection +// finishes synchronously, directly go into the CONNECTED state; +// otherwise go into the CONNECTING state. For any problems, go +// into the ERROR state. +void CrashGenerationServer::HandleInitialState() { + assert(server_state_ == IPC_SERVER_STATE_INITIAL); + + if (!ResetEvent(overlapped_.hEvent)) { + EnterErrorState(); + return; + } + + bool success = ConnectNamedPipe(pipe_, &overlapped_) != FALSE; + DWORD error_code = success ? ERROR_SUCCESS : GetLastError(); + + // From MSDN, it is not clear that when ConnectNamedPipe is used + // in an overlapped mode, will it ever return non-zero value, and + // if so, in what cases. + assert(!success); + + switch (error_code) { + case ERROR_IO_PENDING: + EnterStateWhenSignaled(IPC_SERVER_STATE_CONNECTING); + break; + + case ERROR_PIPE_CONNECTED: + EnterStateImmediately(IPC_SERVER_STATE_CONNECTED); + break; + + default: + EnterErrorState(); + break; + } +} + +// When the server thread serving the clients is in the CONNECTING state, +// try to get the result of the asynchronous connection request using +// the OVERLAPPED object. If the result indicates the connection is done, +// go into the CONNECTED state. If the result indicates I/O is still +// INCOMPLETE, remain in the CONNECTING state. For any problems, +// go into the DISCONNECTING state. +void CrashGenerationServer::HandleConnectingState() { + assert(server_state_ == IPC_SERVER_STATE_CONNECTING); + + DWORD bytes_count = 0; + bool success = GetOverlappedResult(pipe_, + &overlapped_, + &bytes_count, + FALSE) != FALSE; + DWORD error_code = success ? ERROR_SUCCESS : GetLastError(); + + if (success) { + EnterStateImmediately(IPC_SERVER_STATE_CONNECTED); + } else if (error_code != ERROR_IO_INCOMPLETE) { + EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING); + } else { + // remain in CONNECTING state + } +} + +// When the server thread serving the clients is in the CONNECTED state, +// try to issue an asynchronous read from the pipe. If read completes +// synchronously or if I/O is pending then go into the READING state. +// For any problems, go into the DISCONNECTING state. +void CrashGenerationServer::HandleConnectedState() { + assert(server_state_ == IPC_SERVER_STATE_CONNECTED); + + DWORD bytes_count = 0; + memset(&msg_, 0, sizeof(msg_)); + bool success = ReadFile(pipe_, + &msg_, + sizeof(msg_), + &bytes_count, + &overlapped_) != FALSE; + DWORD error_code = success ? ERROR_SUCCESS : GetLastError(); + + // Note that the asynchronous read issued above can finish before the + // code below executes. But, it is okay to change state after issuing + // the asynchronous read. This is because even if the asynchronous read + // is done, the callback for it would not be executed until the current + // thread finishes its execution. + if (success || error_code == ERROR_IO_PENDING) { + EnterStateWhenSignaled(IPC_SERVER_STATE_READING); + } else { + EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING); + } +} + +// When the server thread serving the clients is in the READING state, +// try to get the result of the async read. If async read is done, +// go into the READ_DONE state. For any problems, go into the +// DISCONNECTING state. +void CrashGenerationServer::HandleReadingState() { + assert(server_state_ == IPC_SERVER_STATE_READING); + + DWORD bytes_count = 0; + bool success = GetOverlappedResult(pipe_, + &overlapped_, + &bytes_count, + FALSE) != FALSE; + if (success && bytes_count == sizeof(ProtocolMessage)) { + EnterStateImmediately(IPC_SERVER_STATE_READ_DONE); + return; + } + + assert(!CheckForIOIncomplete(success)); + EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING); +} + +// When the server thread serving the client is in the READ_DONE state, +// validate the client's request message, register the client by +// creating appropriate objects and prepare the response. Then try to +// write the response to the pipe asynchronously. If that succeeds, +// go into the WRITING state. For any problems, go into the DISCONNECTING +// state. +void CrashGenerationServer::HandleReadDoneState() { + assert(server_state_ == IPC_SERVER_STATE_READ_DONE); + + if (!IsClientRequestValid(msg_)) { + EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING); + return; + } + + if (msg_.tag == MESSAGE_TAG_UPLOAD_REQUEST) { + if (upload_request_callback_) + upload_request_callback_(upload_context_, msg_.id); + EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING); + return; + } + + scoped_ptr client_info( + new ClientInfo(this, + msg_.id, + msg_.dump_type, + msg_.thread_id, + msg_.exception_pointers, + msg_.assert_info, + msg_.custom_client_info)); + + if (!client_info->Initialize()) { + EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING); + return; + } + + // Issues an asynchronous WriteFile call if successful. + // Iff successful, assigns ownership of the client_info pointer to the server + // instance, in which case we must be sure not to free it in this function. + if (!RespondToClient(client_info.get())) { + EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING); + return; + } + + // This is only valid as long as it can be found in the clients_ list + client_info_ = client_info.release(); + + // Note that the asynchronous write issued by RespondToClient function + // can finish before the code below executes. But it is okay to change + // state after issuing the asynchronous write. This is because even if + // the asynchronous write is done, the callback for it would not be + // executed until the current thread finishes its execution. + EnterStateWhenSignaled(IPC_SERVER_STATE_WRITING); +} + +// When the server thread serving the clients is in the WRITING state, +// try to get the result of the async write. If the async write is done, +// go into the WRITE_DONE state. For any problems, go into the +// DISONNECTING state. +void CrashGenerationServer::HandleWritingState() { + assert(server_state_ == IPC_SERVER_STATE_WRITING); + + DWORD bytes_count = 0; + bool success = GetOverlappedResult(pipe_, + &overlapped_, + &bytes_count, + FALSE) != FALSE; + if (success) { + EnterStateImmediately(IPC_SERVER_STATE_WRITE_DONE); + return; + } + + assert(!CheckForIOIncomplete(success)); + EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING); +} + +// When the server thread serving the clients is in the WRITE_DONE state, +// try to issue an async read on the pipe. If the read completes synchronously +// or if I/O is still pending then go into the READING_ACK state. For any +// issues, go into the DISCONNECTING state. +void CrashGenerationServer::HandleWriteDoneState() { + assert(server_state_ == IPC_SERVER_STATE_WRITE_DONE); + + DWORD bytes_count = 0; + bool success = ReadFile(pipe_, + &msg_, + sizeof(msg_), + &bytes_count, + &overlapped_) != FALSE; + DWORD error_code = success ? ERROR_SUCCESS : GetLastError(); + + if (success) { + EnterStateImmediately(IPC_SERVER_STATE_READING_ACK); + } else if (error_code == ERROR_IO_PENDING) { + EnterStateWhenSignaled(IPC_SERVER_STATE_READING_ACK); + } else { + EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING); + } +} + +// When the server thread serving the clients is in the READING_ACK state, +// try to get result of async read. Go into the DISCONNECTING state. +void CrashGenerationServer::HandleReadingAckState() { + assert(server_state_ == IPC_SERVER_STATE_READING_ACK); + + DWORD bytes_count = 0; + bool success = GetOverlappedResult(pipe_, + &overlapped_, + &bytes_count, + FALSE) != FALSE; + if (success) { + // The connection handshake with the client is now complete; perform + // the callback. + if (connect_callback_) { + // Note that there is only a single copy of the ClientInfo of the + // currently connected client. However it is being referenced from + // two different places: + // - the client_info_ member + // - the clients_ list + // The lifetime of this ClientInfo depends on the lifetime of the + // client process - basically it can go away at any time. + // However, as long as it is referenced by the clients_ list it + // is guaranteed to be valid. Enter the critical section and check + // to see whether the client_info_ can be found in the list. + // If found, execute the callback and only then leave the critical + // section. + AutoCriticalSection lock(&sync_); + + bool client_is_still_alive = false; + std::list::iterator iter; + for (iter = clients_.begin(); iter != clients_.end(); ++iter) { + if (client_info_ == *iter) { + client_is_still_alive = true; + break; + } + } + + if (client_is_still_alive) { + connect_callback_(connect_context_, client_info_); + } + } + } else { + assert(!CheckForIOIncomplete(success)); + } + + EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING); +} + +// When the server thread serving the client is in the DISCONNECTING state, +// disconnect from the pipe and reset the event. If anything fails, go into +// the ERROR state. If it goes well, go into the INITIAL state and set the +// event to start all over again. +void CrashGenerationServer::HandleDisconnectingState() { + assert(server_state_ == IPC_SERVER_STATE_DISCONNECTING); + + // Done serving the client. + client_info_ = NULL; + + overlapped_.Internal = NULL; + overlapped_.InternalHigh = NULL; + overlapped_.Offset = 0; + overlapped_.OffsetHigh = 0; + overlapped_.Pointer = NULL; + + if (!ResetEvent(overlapped_.hEvent)) { + EnterErrorState(); + return; + } + + if (!DisconnectNamedPipe(pipe_)) { + EnterErrorState(); + return; + } + + // If the server is shutting down do not connect to the + // next client. + if (shutting_down_) { + return; + } + + EnterStateImmediately(IPC_SERVER_STATE_INITIAL); +} + +void CrashGenerationServer::EnterErrorState() { + SetEvent(overlapped_.hEvent); + server_state_ = IPC_SERVER_STATE_ERROR; +} + +void CrashGenerationServer::EnterStateWhenSignaled(IPCServerState state) { + server_state_ = state; +} + +void CrashGenerationServer::EnterStateImmediately(IPCServerState state) { + server_state_ = state; + + if (!SetEvent(overlapped_.hEvent)) { + server_state_ = IPC_SERVER_STATE_ERROR; + } +} + +bool CrashGenerationServer::PrepareReply(const ClientInfo& client_info, + ProtocolMessage* reply) const { + reply->tag = MESSAGE_TAG_REGISTRATION_RESPONSE; + reply->id = GetCurrentProcessId(); + + if (CreateClientHandles(client_info, reply)) { + return true; + } + + // Closing of remote handles (belonging to a different process) can + // only be done through DuplicateHandle. + if (reply->dump_request_handle) { + DuplicateHandle(client_info.process_handle(), // hSourceProcessHandle + reply->dump_request_handle, // hSourceHandle + NULL, // hTargetProcessHandle + 0, // lpTargetHandle + 0, // dwDesiredAccess + FALSE, // bInheritHandle + DUPLICATE_CLOSE_SOURCE); // dwOptions + reply->dump_request_handle = NULL; + } + + if (reply->dump_generated_handle) { + DuplicateHandle(client_info.process_handle(), // hSourceProcessHandle + reply->dump_generated_handle, // hSourceHandle + NULL, // hTargetProcessHandle + 0, // lpTargetHandle + 0, // dwDesiredAccess + FALSE, // bInheritHandle + DUPLICATE_CLOSE_SOURCE); // dwOptions + reply->dump_generated_handle = NULL; + } + + if (reply->server_alive_handle) { + DuplicateHandle(client_info.process_handle(), // hSourceProcessHandle + reply->server_alive_handle, // hSourceHandle + NULL, // hTargetProcessHandle + 0, // lpTargetHandle + 0, // dwDesiredAccess + FALSE, // bInheritHandle + DUPLICATE_CLOSE_SOURCE); // dwOptions + reply->server_alive_handle = NULL; + } + + return false; +} + +bool CrashGenerationServer::CreateClientHandles(const ClientInfo& client_info, + ProtocolMessage* reply) const { + HANDLE current_process = GetCurrentProcess(); + if (!DuplicateHandle(current_process, + client_info.dump_requested_handle(), + client_info.process_handle(), + &reply->dump_request_handle, + kDumpRequestEventAccess, + FALSE, + 0)) { + return false; + } + + if (!DuplicateHandle(current_process, + client_info.dump_generated_handle(), + client_info.process_handle(), + &reply->dump_generated_handle, + kDumpGeneratedEventAccess, + FALSE, + 0)) { + return false; + } + + if (!DuplicateHandle(current_process, + server_alive_handle_, + client_info.process_handle(), + &reply->server_alive_handle, + kMutexAccess, + FALSE, + 0)) { + return false; + } + + return true; +} + +bool CrashGenerationServer::RespondToClient(ClientInfo* client_info) { + ProtocolMessage reply; + if (!PrepareReply(*client_info, &reply)) { + return false; + } + + DWORD bytes_count = 0; + bool success = WriteFile(pipe_, + &reply, + sizeof(reply), + &bytes_count, + &overlapped_) != FALSE; + DWORD error_code = success ? ERROR_SUCCESS : GetLastError(); + + if (!success && error_code != ERROR_IO_PENDING) { + return false; + } + + // Takes over ownership of client_info. We MUST return true if AddClient + // succeeds. + return AddClient(client_info); +} + +// The server thread servicing the clients runs this method. The method +// implements the state machine described in ReadMe.txt along with the +// helper methods HandleXXXState. +void CrashGenerationServer::HandleConnectionRequest() { + // If the server is shutting down, get into ERROR state, reset the event so + // more workers don't run and return immediately. + if (shutting_down_) { + server_state_ = IPC_SERVER_STATE_ERROR; + ResetEvent(overlapped_.hEvent); + return; + } + + switch (server_state_) { + case IPC_SERVER_STATE_ERROR: + HandleErrorState(); + break; + + case IPC_SERVER_STATE_INITIAL: + HandleInitialState(); + break; + + case IPC_SERVER_STATE_CONNECTING: + HandleConnectingState(); + break; + + case IPC_SERVER_STATE_CONNECTED: + HandleConnectedState(); + break; + + case IPC_SERVER_STATE_READING: + HandleReadingState(); + break; + + case IPC_SERVER_STATE_READ_DONE: + HandleReadDoneState(); + break; + + case IPC_SERVER_STATE_WRITING: + HandleWritingState(); + break; + + case IPC_SERVER_STATE_WRITE_DONE: + HandleWriteDoneState(); + break; + + case IPC_SERVER_STATE_READING_ACK: + HandleReadingAckState(); + break; + + case IPC_SERVER_STATE_DISCONNECTING: + HandleDisconnectingState(); + break; + + default: + assert(false); + // This indicates that we added one more state without + // adding handling code. + server_state_ = IPC_SERVER_STATE_ERROR; + break; + } +} + +bool CrashGenerationServer::AddClient(ClientInfo* client_info) { + HANDLE request_wait_handle = NULL; + if (!RegisterWaitForSingleObject(&request_wait_handle, + client_info->dump_requested_handle(), + OnDumpRequest, + client_info, + INFINITE, + kDumpRequestThreadFlags)) { + return false; + } + + client_info->set_dump_request_wait_handle(request_wait_handle); + + // OnClientEnd will be called when the client process terminates. + HANDLE process_wait_handle = NULL; + if (!RegisterWaitForSingleObject(&process_wait_handle, + client_info->process_handle(), + OnClientEnd, + client_info, + INFINITE, + WT_EXECUTEONLYONCE)) { + return false; + } + + client_info->set_process_exit_wait_handle(process_wait_handle); + + // New scope to hold the lock for the shortest time. + { + AutoCriticalSection lock(&sync_); + if (shutting_down_) { + // If server is shutting down, don't add new clients + return false; + } + clients_.push_back(client_info); + } + + return true; +} + +// static +void CALLBACK CrashGenerationServer::OnPipeConnected(void* context, BOOLEAN) { + assert(context); + + CrashGenerationServer* obj = + reinterpret_cast(context); + obj->HandleConnectionRequest(); +} + +// static +void CALLBACK CrashGenerationServer::OnDumpRequest(void* context, BOOLEAN) { + assert(context); + ClientInfo* client_info = reinterpret_cast(context); + + CrashGenerationServer* crash_server = client_info->crash_server(); + assert(crash_server); + if (crash_server->pre_fetch_custom_info_) { + client_info->PopulateCustomInfo(); + } + crash_server->HandleDumpRequest(*client_info); + + ResetEvent(client_info->dump_requested_handle()); +} + +// static +void CALLBACK CrashGenerationServer::OnClientEnd(void* context, BOOLEAN) { + assert(context); + ClientInfo* client_info = reinterpret_cast(context); + + CrashGenerationServer* crash_server = client_info->crash_server(); + assert(crash_server); + + crash_server->HandleClientProcessExit(client_info); +} + +void CrashGenerationServer::HandleClientProcessExit(ClientInfo* client_info) { + assert(client_info); + + // Must unregister the dump request wait operation and wait for any + // dump requests that might be pending to finish before proceeding + // with the client_info cleanup. + client_info->UnregisterDumpRequestWaitAndBlockUntilNoPending(); + + if (exit_callback_) { + exit_callback_(exit_context_, client_info); + } + + // Start a new scope to release lock automatically. + { + AutoCriticalSection lock(&sync_); + if (shutting_down_) { + // The crash generation server is shutting down and as part of the + // shutdown process it will delete all clients from the clients_ list. + return; + } + clients_.remove(client_info); + } + + // Explicitly unregister the process exit wait using the non-blocking method. + // Otherwise, the destructor will attempt to unregister it using the blocking + // method which will lead to a deadlock because it is being called from the + // callback of the same wait operation + client_info->UnregisterProcessExitWait(false); + + delete client_info; +} + +void CrashGenerationServer::HandleDumpRequest(const ClientInfo& client_info) { + bool execute_callback = true; + // Generate the dump only if it's explicitly requested by the + // server application; otherwise the server might want to generate + // dump in the callback. + std::wstring dump_path; + if (generate_dumps_) { + if (!GenerateDump(client_info, &dump_path)) { + // client proccess terminated or some other error + execute_callback = false; + } + } + + if (dump_callback_ && execute_callback) { + std::wstring* ptr_dump_path = (dump_path == L"") ? NULL : &dump_path; + dump_callback_(dump_context_, &client_info, ptr_dump_path); + } + + SetEvent(client_info.dump_generated_handle()); +} + +bool CrashGenerationServer::GenerateDump(const ClientInfo& client, + std::wstring* dump_path) { + assert(client.pid() != 0); + assert(client.process_handle()); + + // We have to get the address of EXCEPTION_INFORMATION from + // the client process address space. + EXCEPTION_POINTERS* client_ex_info = NULL; + if (!client.GetClientExceptionInfo(&client_ex_info)) { + return false; + } + + DWORD client_thread_id = 0; + if (!client.GetClientThreadId(&client_thread_id)) { + return false; + } + + MinidumpGenerator dump_generator(dump_path_, + client.process_handle(), + client.pid(), + client_thread_id, + GetCurrentThreadId(), + client_ex_info, + client.assert_info(), + client.dump_type(), + true); + + if (!dump_generator.GenerateDumpFile(dump_path)) { + return false; + } + + // If the client requests a full memory dump, we will write a normal mini + // dump and a full memory dump. Both dump files use the same uuid as file + // name prefix. + if (client.dump_type() & MiniDumpWithFullMemory) { + std::wstring full_dump_path; + if (!dump_generator.GenerateFullDumpFile(&full_dump_path)) { + return false; + } + } + + return dump_generator.WriteMinidump(); +} + +} // namespace google_breakpad diff --git a/src/client/windows/crash_generation/crash_generation_server.h b/src/client/windows/crash_generation/crash_generation_server.h new file mode 100644 index 0000000..74275a7 --- /dev/null +++ b/src/client/windows/crash_generation/crash_generation_server.h @@ -0,0 +1,298 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ +#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ + +#include +#include +#include "client/windows/common/ipc_protocol.h" +#include "client/windows/crash_generation/minidump_generator.h" +#include "common/scoped_ptr.h" + +namespace google_breakpad { +class ClientInfo; + +// Abstraction for server side implementation of out-of-process crash +// generation protocol for Windows platform only. It generates Windows +// minidump files for client processes that request dump generation. When +// the server is requested to start listening for clients (by calling the +// Start method), it creates a named pipe and waits for the clients to +// register. In response, it hands them event handles that the client can +// signal to request dump generation. When the clients request dump +// generation in this way, the server generates Windows minidump files. +class CrashGenerationServer { + public: + typedef void (*OnClientConnectedCallback)(void* context, + const ClientInfo* client_info); + + typedef void (*OnClientDumpRequestCallback)(void* context, + const ClientInfo* client_info, + const std::wstring* file_path); + + typedef void (*OnClientExitedCallback)(void* context, + const ClientInfo* client_info); + + typedef void (*OnClientUploadRequestCallback)(void* context, + const DWORD crash_id); + + // Creates an instance with the given parameters. + // + // Parameter pipe_name: Name of the Windows named pipe + // Parameter pipe_sec_attrs Security attributes to set on the pipe. Pass + // NULL to use default security on the pipe. By default, the pipe created + // allows Local System, Administrators and the Creator full control and + // the Everyone group read access on the pipe. + // Parameter connect_callback: Callback for a new client connection. + // Parameter connect_context: Context for client connection callback. + // Parameter crash_callback: Callback for a client crash dump request. + // Parameter crash_context: Context for client crash dump request callback. + // Parameter exit_callback: Callback for client process exit. + // Parameter exit_context: Context for client exit callback. + // Parameter generate_dumps: Whether to automatically generate dumps. + // Client code of this class might want to generate dumps explicitly in the + // crash dump request callback. In that case, false can be passed for this + // parameter. + // Parameter dump_path: Path for generating dumps; required only if true is + // passed for generateDumps parameter; NULL can be passed otherwise. + CrashGenerationServer(const std::wstring& pipe_name, + SECURITY_ATTRIBUTES* pipe_sec_attrs, + OnClientConnectedCallback connect_callback, + void* connect_context, + OnClientDumpRequestCallback dump_callback, + void* dump_context, + OnClientExitedCallback exit_callback, + void* exit_context, + OnClientUploadRequestCallback upload_request_callback, + void* upload_context, + bool generate_dumps, + const std::wstring* dump_path); + + ~CrashGenerationServer(); + + // Performs initialization steps needed to start listening to clients. Upon + // successful return clients may connect to this server's pipe. + // + // Returns true if initialization is successful; false otherwise. + bool Start(); + + void pre_fetch_custom_info(bool do_pre_fetch) { + pre_fetch_custom_info_ = do_pre_fetch; + } + + private: + // Various states the client can be in during the handshake with + // the server. + enum IPCServerState { + // Server starts in this state. + IPC_SERVER_STATE_UNINITIALIZED, + + // Server is in error state and it cannot serve any clients. + IPC_SERVER_STATE_ERROR, + + // Server starts in this state. + IPC_SERVER_STATE_INITIAL, + + // Server has issued an async connect to the pipe and it is waiting + // for the connection to be established. + IPC_SERVER_STATE_CONNECTING, + + // Server is connected successfully. + IPC_SERVER_STATE_CONNECTED, + + // Server has issued an async read from the pipe and it is waiting for + // the read to finish. + IPC_SERVER_STATE_READING, + + // Server is done reading from the pipe. + IPC_SERVER_STATE_READ_DONE, + + // Server has issued an async write to the pipe and it is waiting for + // the write to finish. + IPC_SERVER_STATE_WRITING, + + // Server is done writing to the pipe. + IPC_SERVER_STATE_WRITE_DONE, + + // Server has issued an async read from the pipe for an ack and it + // is waiting for the read to finish. + IPC_SERVER_STATE_READING_ACK, + + // Server is done writing to the pipe and it is now ready to disconnect + // and reconnect. + IPC_SERVER_STATE_DISCONNECTING + }; + + // + // Helper methods to handle various server IPC states. + // + void HandleErrorState(); + void HandleInitialState(); + void HandleConnectingState(); + void HandleConnectedState(); + void HandleReadingState(); + void HandleReadDoneState(); + void HandleWritingState(); + void HandleWriteDoneState(); + void HandleReadingAckState(); + void HandleDisconnectingState(); + + // Prepares reply for a client from the given parameters. + bool PrepareReply(const ClientInfo& client_info, + ProtocolMessage* reply) const; + + // Duplicates various handles in the ClientInfo object for the client + // process and stores them in the given ProtocolMessage instance. If + // creating any handle fails, ProtocolMessage will contain the handles + // already created successfully, which should be closed by the caller. + bool CreateClientHandles(const ClientInfo& client_info, + ProtocolMessage* reply) const; + + // Response to the given client. Return true if all steps of + // responding to the client succeed, false otherwise. + bool RespondToClient(ClientInfo* client_info); + + // Handles a connection request from the client. + void HandleConnectionRequest(); + + // Handles a dump request from the client. + void HandleDumpRequest(const ClientInfo& client_info); + + // Callback for pipe connected event. + static void CALLBACK OnPipeConnected(void* context, BOOLEAN timer_or_wait); + + // Callback for a dump request. + static void CALLBACK OnDumpRequest(void* context, BOOLEAN timer_or_wait); + + // Callback for client process exit event. + static void CALLBACK OnClientEnd(void* context, BOOLEAN timer_or_wait); + + // Handles client process exit. + void HandleClientProcessExit(ClientInfo* client_info); + + // Adds the given client to the list of registered clients. + bool AddClient(ClientInfo* client_info); + + // Generates dump for the given client. + bool GenerateDump(const ClientInfo& client, std::wstring* dump_path); + + // Puts the server in a permanent error state and sets a signal such that + // the state will be immediately entered after the current state transition + // is complete. + void EnterErrorState(); + + // Puts the server in the specified state and sets a signal such that the + // state is immediately entered after the current state transition is + // complete. + void EnterStateImmediately(IPCServerState state); + + // Puts the server in the specified state. No signal will be set, so the state + // transition will only occur when signaled manually or by completion of an + // asynchronous IO operation. + void EnterStateWhenSignaled(IPCServerState state); + + // Sync object for thread-safe access to the shared list of clients. + CRITICAL_SECTION sync_; + + // List of clients. + std::list clients_; + + // Pipe name. + std::wstring pipe_name_; + + // Pipe security attributes + SECURITY_ATTRIBUTES* pipe_sec_attrs_; + + // Handle to the pipe used for handshake with clients. + HANDLE pipe_; + + // Pipe wait handle. + HANDLE pipe_wait_handle_; + + // Handle to server-alive mutex. + HANDLE server_alive_handle_; + + // Callback for a successful client connection. + OnClientConnectedCallback connect_callback_; + + // Context for client connected callback. + void* connect_context_; + + // Callback for a client dump request. + OnClientDumpRequestCallback dump_callback_; + + // Context for client dump request callback. + void* dump_context_; + + // Callback for client process exit. + OnClientExitedCallback exit_callback_; + + // Context for client process exit callback. + void* exit_context_; + + // Callback for upload request. + OnClientUploadRequestCallback upload_request_callback_; + + // Context for upload request callback. + void* upload_context_; + + // Whether to generate dumps. + bool generate_dumps_; + + // Wether to populate custom information up-front. + bool pre_fetch_custom_info_; + + // The dump path for the server. + const std::wstring dump_path_; + + // State of the server in performing the IPC with the client. + // Note that since we restrict the pipe to one instance, we + // only need to keep one state of the server. Otherwise, server + // would have one state per client it is talking to. + IPCServerState server_state_; + + // Whether the server is shutting down. + bool shutting_down_; + + // Overlapped instance for async I/O on the pipe. + OVERLAPPED overlapped_; + + // Message object used in IPC with the client. + ProtocolMessage msg_; + + // Client Info for the client that's connecting to the server. + ClientInfo* client_info_; + + // Disable copy ctor and operator=. + CrashGenerationServer(const CrashGenerationServer& crash_server); + CrashGenerationServer& operator=(const CrashGenerationServer& crash_server); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ diff --git a/src/client/windows/crash_generation/minidump_generator.cc b/src/client/windows/crash_generation/minidump_generator.cc new file mode 100644 index 0000000..a0454cf --- /dev/null +++ b/src/client/windows/crash_generation/minidump_generator.cc @@ -0,0 +1,586 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/windows/crash_generation/minidump_generator.h" + +#include +#include + +#include +#include +#include +#include + +#include "client/windows/common/auto_critical_section.h" +#include "common/scoped_ptr.h" +#include "common/windows/guid_string.h" + +using std::wstring; + +namespace { + +// A helper class used to collect handle operations data. Unlike +// |MiniDumpWithHandleData| it records the operations for a single handle value +// only, making it possible to include this information to a minidump. +class HandleTraceData { + public: + HandleTraceData(); + ~HandleTraceData(); + + // Collects the handle operations data and formats a user stream to be added + // to the minidump. + bool CollectHandleData(HANDLE process_handle, + EXCEPTION_POINTERS* exception_pointers); + + // Fills the user dump entry with a pointer to the collected handle operations + // data. Returns |true| if the entry was initialized successfully, or |false| + // if no trace data is available. + bool GetUserStream(MINIDUMP_USER_STREAM* user_stream); + + private: + // Reads the exception code from the client process's address space. + // This routine assumes that the client process's pointer width matches ours. + static bool ReadExceptionCode(HANDLE process_handle, + EXCEPTION_POINTERS* exception_pointers, + DWORD* exception_code); + + // Stores handle operations retrieved by VerifierEnumerateResource(). + static ULONG CALLBACK RecordHandleOperations(void* resource_description, + void* enumeration_context, + ULONG* enumeration_level); + + // Function pointer type for VerifierEnumerateResource, which is looked up + // dynamically. + typedef BOOL (WINAPI* VerifierEnumerateResourceType)( + HANDLE Process, + ULONG Flags, + ULONG ResourceType, + AVRF_RESOURCE_ENUMERATE_CALLBACK ResourceCallback, + PVOID EnumerationContext); + + // Handle to dynamically loaded verifier.dll. + HMODULE verifier_module_; + + // Pointer to the VerifierEnumerateResource function. + VerifierEnumerateResourceType enumerate_resource_; + + // Handle value to look for. + ULONG64 handle_; + + // List of handle operations for |handle_|. + std::list operations_; + + // Minidump stream data. + std::vector stream_; +}; + +HandleTraceData::HandleTraceData() + : verifier_module_(NULL), + enumerate_resource_(NULL), + handle_(NULL) { +} + +HandleTraceData::~HandleTraceData() { + if (verifier_module_) { + FreeLibrary(verifier_module_); + } +} + +bool HandleTraceData::CollectHandleData( + HANDLE process_handle, + EXCEPTION_POINTERS* exception_pointers) { + DWORD exception_code; + if (!ReadExceptionCode(process_handle, exception_pointers, &exception_code)) { + return false; + } + + // Verify whether the execption is STATUS_INVALID_HANDLE. Do not record any + // handle information if it is a different exception to keep the minidump + // small. + if (exception_code != STATUS_INVALID_HANDLE) { + return true; + } + + // Load verifier!VerifierEnumerateResource() dynamically. + verifier_module_ = LoadLibrary(TEXT("verifier.dll")); + if (!verifier_module_) { + return false; + } + + enumerate_resource_ = reinterpret_cast( + GetProcAddress(verifier_module_, "VerifierEnumerateResource")); + if (!enumerate_resource_) { + return false; + } + + // STATUS_INVALID_HANDLE does not provide the offending handle value in + // the exception parameters so we have to guess. At the moment we scan + // the handle operations trace looking for the last invalid handle operation + // and record only the operations for that handle value. + if (enumerate_resource_(process_handle, + 0, + AvrfResourceHandleTrace, + &RecordHandleOperations, + this) != ERROR_SUCCESS) { + // The handle tracing must have not been enabled. + return true; + } + + // Now that |handle_| is initialized, purge all irrelevant operations. + std::list::iterator i = operations_.begin(); + std::list::iterator i_end = operations_.end(); + while (i != i_end) { + if (i->Handle == handle_) { + ++i; + } else { + i = operations_.erase(i); + } + } + + // Convert the list of recorded operations to a minidump stream. + stream_.resize(sizeof(MINIDUMP_HANDLE_OPERATION_LIST) + + sizeof(AVRF_HANDLE_OPERATION) * operations_.size()); + + MINIDUMP_HANDLE_OPERATION_LIST* stream_data = + reinterpret_cast( + &stream_.front()); + stream_data->SizeOfHeader = sizeof(MINIDUMP_HANDLE_OPERATION_LIST); + stream_data->SizeOfEntry = sizeof(AVRF_HANDLE_OPERATION); + stream_data->NumberOfEntries = static_cast(operations_.size()); + stream_data->Reserved = 0; + std::copy(operations_.begin(), + operations_.end(), +#if defined(_MSC_VER) && !defined(_LIBCPP_STD_VER) + stdext::checked_array_iterator( + reinterpret_cast(stream_data + 1), + operations_.size()) +#else + reinterpret_cast(stream_data + 1) +#endif + ); + + return true; +} + +bool HandleTraceData::GetUserStream(MINIDUMP_USER_STREAM* user_stream) { + if (stream_.empty()) { + return false; + } else { + user_stream->Type = HandleOperationListStream; + user_stream->BufferSize = static_cast(stream_.size()); + user_stream->Buffer = &stream_.front(); + return true; + } +} + +bool HandleTraceData::ReadExceptionCode( + HANDLE process_handle, + EXCEPTION_POINTERS* exception_pointers, + DWORD* exception_code) { + EXCEPTION_POINTERS pointers; + if (!ReadProcessMemory(process_handle, + exception_pointers, + &pointers, + sizeof(pointers), + NULL)) { + return false; + } + + if (!ReadProcessMemory(process_handle, + pointers.ExceptionRecord, + exception_code, + sizeof(*exception_code), + NULL)) { + return false; + } + + return true; +} + +ULONG CALLBACK HandleTraceData::RecordHandleOperations( + void* resource_description, + void* enumeration_context, + ULONG* enumeration_level) { + AVRF_HANDLE_OPERATION* description = + reinterpret_cast(resource_description); + HandleTraceData* self = + reinterpret_cast(enumeration_context); + + // Remember the last invalid handle operation. + if (description->OperationType == OperationDbBADREF) { + self->handle_ = description->Handle; + } + + // Record all handle operations. + self->operations_.push_back(*description); + + *enumeration_level = HeapEnumerationEverything; + return ERROR_SUCCESS; +} + +} // namespace + +namespace google_breakpad { + +MinidumpGenerator::MinidumpGenerator( + const std::wstring& dump_path, + const HANDLE process_handle, + const DWORD process_id, + const DWORD thread_id, + const DWORD requesting_thread_id, + EXCEPTION_POINTERS* exception_pointers, + MDRawAssertionInfo* assert_info, + const MINIDUMP_TYPE dump_type, + const bool is_client_pointers) + : dbghelp_module_(NULL), + write_dump_(NULL), + rpcrt4_module_(NULL), + create_uuid_(NULL), + process_handle_(process_handle), + process_id_(process_id), + thread_id_(thread_id), + requesting_thread_id_(requesting_thread_id), + exception_pointers_(exception_pointers), + assert_info_(assert_info), + dump_type_(dump_type), + is_client_pointers_(is_client_pointers), + dump_path_(dump_path), + uuid_generated_(false), + dump_file_(INVALID_HANDLE_VALUE), + full_dump_file_(INVALID_HANDLE_VALUE), + dump_file_is_internal_(false), + full_dump_file_is_internal_(false), + additional_streams_(NULL), + callback_info_(NULL) { + uuid_ = {0}; + InitializeCriticalSection(&module_load_sync_); + InitializeCriticalSection(&get_proc_address_sync_); +} + +MinidumpGenerator::~MinidumpGenerator() { + if (dump_file_is_internal_ && dump_file_ != INVALID_HANDLE_VALUE) { + CloseHandle(dump_file_); + } + + if (full_dump_file_is_internal_ && full_dump_file_ != INVALID_HANDLE_VALUE) { + CloseHandle(full_dump_file_); + } + + if (dbghelp_module_) { + FreeLibrary(dbghelp_module_); + } + + if (rpcrt4_module_) { + FreeLibrary(rpcrt4_module_); + } + + DeleteCriticalSection(&get_proc_address_sync_); + DeleteCriticalSection(&module_load_sync_); +} + +bool MinidumpGenerator::WriteMinidump() { + bool full_memory_dump = (dump_type_ & MiniDumpWithFullMemory) != 0; + if (dump_file_ == INVALID_HANDLE_VALUE || + (full_memory_dump && full_dump_file_ == INVALID_HANDLE_VALUE)) { + return false; + } + + MiniDumpWriteDumpType write_dump = GetWriteDump(); + if (!write_dump) { + return false; + } + + MINIDUMP_EXCEPTION_INFORMATION* dump_exception_pointers = NULL; + MINIDUMP_EXCEPTION_INFORMATION dump_exception_info; + + // Setup the exception information object only if it's a dump + // due to an exception. + if (exception_pointers_) { + dump_exception_pointers = &dump_exception_info; + dump_exception_info.ThreadId = thread_id_; + dump_exception_info.ExceptionPointers = exception_pointers_; + dump_exception_info.ClientPointers = is_client_pointers_; + } + + // Add an MDRawBreakpadInfo stream to the minidump, to provide additional + // information about the exception handler to the Breakpad processor. + // The information will help the processor determine which threads are + // relevant. The Breakpad processor does not require this information but + // can function better with Breakpad-generated dumps when it is present. + // The native debugger is not harmed by the presence of this information. + MDRawBreakpadInfo breakpad_info = {0}; + if (!is_client_pointers_) { + // Set the dump thread id and requesting thread id only in case of + // in-process dump generation. + breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; + breakpad_info.dump_thread_id = thread_id_; + breakpad_info.requesting_thread_id = requesting_thread_id_; + } + + int additional_streams_count = additional_streams_ ? + additional_streams_->UserStreamCount : 0; + scoped_array user_stream_array( + new MINIDUMP_USER_STREAM[3 + additional_streams_count]); + user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM; + user_stream_array[0].BufferSize = sizeof(breakpad_info); + user_stream_array[0].Buffer = &breakpad_info; + + MINIDUMP_USER_STREAM_INFORMATION user_streams; + user_streams.UserStreamCount = 1; + user_streams.UserStreamArray = user_stream_array.get(); + + MDRawAssertionInfo* actual_assert_info = assert_info_; + MDRawAssertionInfo client_assert_info = {{0}}; + + if (assert_info_) { + // If the assertion info object lives in the client process, + // read the memory of the client process. + if (is_client_pointers_) { + SIZE_T bytes_read = 0; + if (!ReadProcessMemory(process_handle_, + assert_info_, + &client_assert_info, + sizeof(client_assert_info), + &bytes_read)) { + if (dump_file_is_internal_) + CloseHandle(dump_file_); + if (full_dump_file_is_internal_ && + full_dump_file_ != INVALID_HANDLE_VALUE) + CloseHandle(full_dump_file_); + return false; + } + + if (bytes_read != sizeof(client_assert_info)) { + if (dump_file_is_internal_) + CloseHandle(dump_file_); + if (full_dump_file_is_internal_ && + full_dump_file_ != INVALID_HANDLE_VALUE) + CloseHandle(full_dump_file_); + return false; + } + + actual_assert_info = &client_assert_info; + } + + user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM; + user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo); + user_stream_array[1].Buffer = actual_assert_info; + ++user_streams.UserStreamCount; + } + + if (additional_streams_) { + for (size_t i = 0; + i < additional_streams_->UserStreamCount; + i++, user_streams.UserStreamCount++) { + user_stream_array[user_streams.UserStreamCount].Type = + additional_streams_->UserStreamArray[i].Type; + user_stream_array[user_streams.UserStreamCount].BufferSize = + additional_streams_->UserStreamArray[i].BufferSize; + user_stream_array[user_streams.UserStreamCount].Buffer = + additional_streams_->UserStreamArray[i].Buffer; + } + } + + // If the process is terminated by STATUS_INVALID_HANDLE exception store + // the trace of operations for the offending handle value. Do nothing special + // if the client already requested the handle trace to be stored in the dump. + HandleTraceData handle_trace_data; + if (exception_pointers_ && (dump_type_ & MiniDumpWithHandleData) == 0) { + if (!handle_trace_data.CollectHandleData(process_handle_, + exception_pointers_)) { + if (dump_file_is_internal_) + CloseHandle(dump_file_); + if (full_dump_file_is_internal_ && + full_dump_file_ != INVALID_HANDLE_VALUE) + CloseHandle(full_dump_file_); + return false; + } + } + + bool result_full_memory = true; + if (full_memory_dump) { + result_full_memory = write_dump( + process_handle_, + process_id_, + full_dump_file_, + static_cast((dump_type_ & (~MiniDumpNormal)) + | MiniDumpWithHandleData), + dump_exception_pointers, + &user_streams, + NULL) != FALSE; + } + + // Add handle operations trace stream to the minidump if it was collected. + if (handle_trace_data.GetUserStream( + &user_stream_array[user_streams.UserStreamCount])) { + ++user_streams.UserStreamCount; + } + + bool result_minidump = write_dump( + process_handle_, + process_id_, + dump_file_, + static_cast((dump_type_ & (~MiniDumpWithFullMemory)) + | MiniDumpNormal), + dump_exception_pointers, + &user_streams, + callback_info_) != FALSE; + + return result_minidump && result_full_memory; +} + +bool MinidumpGenerator::GenerateDumpFile(wstring* dump_path) { + // The dump file was already set by handle or this function was previously + // called. + if (dump_file_ != INVALID_HANDLE_VALUE) { + return false; + } + + wstring dump_file_path; + if (!GenerateDumpFilePath(&dump_file_path)) { + return false; + } + + dump_file_ = CreateFile(dump_file_path.c_str(), + GENERIC_WRITE, + 0, + NULL, + CREATE_NEW, + FILE_ATTRIBUTE_NORMAL, + NULL); + if (dump_file_ == INVALID_HANDLE_VALUE) { + return false; + } + + dump_file_is_internal_ = true; + *dump_path = dump_file_path; + return true; +} + +bool MinidumpGenerator::GenerateFullDumpFile(wstring* full_dump_path) { + // A full minidump was not requested. + if ((dump_type_ & MiniDumpWithFullMemory) == 0) { + return false; + } + + // The dump file was already set by handle or this function was previously + // called. + if (full_dump_file_ != INVALID_HANDLE_VALUE) { + return false; + } + + wstring full_dump_file_path; + if (!GenerateDumpFilePath(&full_dump_file_path)) { + return false; + } + full_dump_file_path.resize(full_dump_file_path.size() - 4); // strip .dmp + full_dump_file_path.append(TEXT("-full.dmp")); + + full_dump_file_ = CreateFile(full_dump_file_path.c_str(), + GENERIC_WRITE, + 0, + NULL, + CREATE_NEW, + FILE_ATTRIBUTE_NORMAL, + NULL); + if (full_dump_file_ == INVALID_HANDLE_VALUE) { + return false; + } + + full_dump_file_is_internal_ = true; + *full_dump_path = full_dump_file_path; + return true; +} + +HMODULE MinidumpGenerator::GetDbghelpModule() { + AutoCriticalSection lock(&module_load_sync_); + if (!dbghelp_module_) { + dbghelp_module_ = LoadLibrary(TEXT("dbghelp.dll")); + } + + return dbghelp_module_; +} + +MinidumpGenerator::MiniDumpWriteDumpType MinidumpGenerator::GetWriteDump() { + AutoCriticalSection lock(&get_proc_address_sync_); + if (!write_dump_) { + HMODULE module = GetDbghelpModule(); + if (module) { + FARPROC proc = GetProcAddress(module, "MiniDumpWriteDump"); + write_dump_ = reinterpret_cast(proc); + } + } + + return write_dump_; +} + +HMODULE MinidumpGenerator::GetRpcrt4Module() { + AutoCriticalSection lock(&module_load_sync_); + if (!rpcrt4_module_) { + rpcrt4_module_ = LoadLibrary(TEXT("rpcrt4.dll")); + } + + return rpcrt4_module_; +} + +MinidumpGenerator::UuidCreateType MinidumpGenerator::GetCreateUuid() { + AutoCriticalSection lock(&module_load_sync_); + if (!create_uuid_) { + HMODULE module = GetRpcrt4Module(); + if (module) { + FARPROC proc = GetProcAddress(module, "UuidCreate"); + create_uuid_ = reinterpret_cast(proc); + } + } + + return create_uuid_; +} + +bool MinidumpGenerator::GenerateDumpFilePath(wstring* file_path) { + if (!uuid_generated_) { + UuidCreateType create_uuid = GetCreateUuid(); + if (!create_uuid) { + return false; + } + + create_uuid(&uuid_); + uuid_generated_ = true; + } + + wstring id_str = GUIDString::GUIDToWString(&uuid_); + + *file_path = dump_path_ + TEXT("\\") + id_str + TEXT(".dmp"); + return true; +} + +} // namespace google_breakpad diff --git a/src/client/windows/crash_generation/minidump_generator.h b/src/client/windows/crash_generation/minidump_generator.h new file mode 100644 index 0000000..f960c5d --- /dev/null +++ b/src/client/windows/crash_generation/minidump_generator.h @@ -0,0 +1,202 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATOR_H_ +#define CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATOR_H_ + +#include +#include +#include +#include +#include +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// Abstraction for various objects and operations needed to generate +// minidump on Windows. This abstraction is useful to hide all the gory +// details for minidump generation and provide a clean interface to +// the clients to generate minidumps. +class MinidumpGenerator { + public: + // Creates an instance with the given parameters. + // is_client_pointers specifies whether the exception_pointers and + // assert_info point into the process that is being dumped. + // Before calling WriteMinidump on the returned instance a dump file muct be + // specified by a call to either SetDumpFile() or GenerateDumpFile(). + // If a full dump file will be requested via a subsequent call to either + // SetFullDumpFile or GenerateFullDumpFile() dump_type must include + // MiniDumpWithFullMemory. + MinidumpGenerator(const std::wstring& dump_path, + const HANDLE process_handle, + const DWORD process_id, + const DWORD thread_id, + const DWORD requesting_thread_id, + EXCEPTION_POINTERS* exception_pointers, + MDRawAssertionInfo* assert_info, + const MINIDUMP_TYPE dump_type, + const bool is_client_pointers); + + ~MinidumpGenerator(); + + void SetDumpFile(const HANDLE dump_file) { dump_file_ = dump_file; } + void SetFullDumpFile(const HANDLE full_dump_file) { + full_dump_file_ = full_dump_file; + } + + // Generate the name for the dump file that will be written to once + // WriteMinidump() is called. Can only be called once and cannot be called + // if the dump file is set via SetDumpFile(). + bool GenerateDumpFile(std::wstring* dump_path); + + // Generate the name for the full dump file that will be written to once + // WriteMinidump() is called. Cannot be called unless the minidump type + // includes MiniDumpWithFullMemory. Can only be called once and cannot be + // called if the dump file is set via SetFullDumpFile(). + bool GenerateFullDumpFile(std::wstring* full_dump_path); + + void SetAdditionalStreams( + MINIDUMP_USER_STREAM_INFORMATION* additional_streams) { + additional_streams_ = additional_streams; + } + + void SetCallback(MINIDUMP_CALLBACK_INFORMATION* callback_info) { + callback_info_ = callback_info; + } + + // Writes the minidump with the given parameters. Stores the + // dump file path in the dump_path parameter if dump generation + // succeeds. + bool WriteMinidump(); + + private: + // Function pointer type for MiniDumpWriteDump, which is looked up + // dynamically. + typedef BOOL (WINAPI* MiniDumpWriteDumpType)( + HANDLE hProcess, + DWORD ProcessId, + HANDLE hFile, + MINIDUMP_TYPE DumpType, + CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); + + // Function pointer type for UuidCreate, which is looked up dynamically. + typedef RPC_STATUS (RPC_ENTRY* UuidCreateType)(UUID* Uuid); + + // Loads the appropriate DLL lazily in a thread safe way. + HMODULE GetDbghelpModule(); + + // Loads the appropriate DLL and gets a pointer to the MiniDumpWriteDump + // function lazily and in a thread-safe manner. + MiniDumpWriteDumpType GetWriteDump(); + + // Loads the appropriate DLL lazily in a thread safe way. + HMODULE GetRpcrt4Module(); + + // Loads the appropriate DLL and gets a pointer to the UuidCreate + // function lazily and in a thread-safe manner. + UuidCreateType GetCreateUuid(); + + // Returns the path for the file to write dump to. + bool GenerateDumpFilePath(std::wstring* file_path); + + // Handle to dynamically loaded DbgHelp.dll. + HMODULE dbghelp_module_; + + // Pointer to the MiniDumpWriteDump function. + MiniDumpWriteDumpType write_dump_; + + // Handle to dynamically loaded rpcrt4.dll. + HMODULE rpcrt4_module_; + + // Pointer to the UuidCreate function. + UuidCreateType create_uuid_; + + // Handle for the process to dump. + HANDLE process_handle_; + + // Process ID for the process to dump. + DWORD process_id_; + + // The crashing thread ID. + DWORD thread_id_; + + // The thread ID which is requesting the dump. + DWORD requesting_thread_id_; + + // Pointer to the exception information for the crash. This may point to an + // address in the crashing process so it should not be dereferenced. + EXCEPTION_POINTERS* exception_pointers_; + + // Assertion info for the report. + MDRawAssertionInfo* assert_info_; + + // Type of minidump to generate. + MINIDUMP_TYPE dump_type_; + + // Specifies whether the exception_pointers_ reference memory in the crashing + // process. + bool is_client_pointers_; + + // Folder path to store dump files. + std::wstring dump_path_; + + // UUID used to make dump file names. + UUID uuid_; + bool uuid_generated_; + + // The file where the dump will be written. + HANDLE dump_file_; + + // The file where the full dump will be written. + HANDLE full_dump_file_; + + // Tracks whether the dump file handle is managed externally. + bool dump_file_is_internal_; + + // Tracks whether the full dump file handle is managed externally. + bool full_dump_file_is_internal_; + + // Additional streams to be written to the dump. + MINIDUMP_USER_STREAM_INFORMATION* additional_streams_; + + // The user defined callback for the various stages of the dump process. + MINIDUMP_CALLBACK_INFORMATION* callback_info_; + + // Critical section to sychronize action of loading modules dynamically. + CRITICAL_SECTION module_load_sync_; + + // Critical section to synchronize action of dynamically getting function + // addresses from modules. + CRITICAL_SECTION get_proc_address_sync_; +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATOR_H_ diff --git a/src/client/windows/handler/exception_handler.cc b/src/client/windows/handler/exception_handler.cc new file mode 100644 index 0000000..64b2979 --- /dev/null +++ b/src/client/windows/handler/exception_handler.cc @@ -0,0 +1,1085 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include +#include +#include + +#include "common/windows/string_utils-inl.h" + +#include "client/windows/common/ipc_protocol.h" +#include "client/windows/handler/exception_handler.h" +#include "common/windows/guid_string.h" + +namespace google_breakpad { + +// This is passed as the context to the MinidumpWriteDump callback. +typedef struct { + AppMemoryList::const_iterator iter; + AppMemoryList::const_iterator end; +} MinidumpCallbackContext; + +// This define is new to Windows 10. +#ifndef DBG_PRINTEXCEPTION_WIDE_C +#define DBG_PRINTEXCEPTION_WIDE_C ((DWORD)0x4001000A) +#endif + +vector* ExceptionHandler::handler_stack_ = NULL; +LONG ExceptionHandler::handler_stack_index_ = 0; +CRITICAL_SECTION ExceptionHandler::handler_stack_critical_section_; +volatile LONG ExceptionHandler::instance_count_ = 0; + +ExceptionHandler::ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + const CustomClientInfo* custom_info) { + Initialize(dump_path, + filter, + callback, + callback_context, + handler_types, + dump_type, + pipe_name, + NULL, // pipe_handle + NULL, // crash_generation_client + custom_info); +} + +ExceptionHandler::ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + HANDLE pipe_handle, + const CustomClientInfo* custom_info) { + Initialize(dump_path, + filter, + callback, + callback_context, + handler_types, + dump_type, + NULL, // pipe_name + pipe_handle, + NULL, // crash_generation_client + custom_info); +} + +ExceptionHandler::ExceptionHandler( + const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + CrashGenerationClient* crash_generation_client) { + // The dump_type, pipe_name and custom_info that are passed in to Initialize() + // are not used. The ones set in crash_generation_client are used instead. + Initialize(dump_path, + filter, + callback, + callback_context, + handler_types, + MiniDumpNormal, // dump_type - not used + NULL, // pipe_name - not used + NULL, // pipe_handle + crash_generation_client, + NULL); // custom_info - not used +} + +ExceptionHandler::ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types) { + Initialize(dump_path, + filter, + callback, + callback_context, + handler_types, + MiniDumpNormal, + NULL, // pipe_name + NULL, // pipe_handle + NULL, // crash_generation_client + NULL); // custom_info +} + +void ExceptionHandler::Initialize( + const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + HANDLE pipe_handle, + CrashGenerationClient* crash_generation_client, + const CustomClientInfo* custom_info) { + LONG instance_count = InterlockedIncrement(&instance_count_); + filter_ = filter; + callback_ = callback; + callback_context_ = callback_context; + dump_path_c_ = NULL; + next_minidump_id_c_ = NULL; + next_minidump_path_c_ = NULL; + dbghelp_module_ = NULL; + minidump_write_dump_ = NULL; + dump_type_ = dump_type; + rpcrt4_module_ = NULL; + uuid_create_ = NULL; + handler_types_ = handler_types; + previous_filter_ = NULL; +#if _MSC_VER >= 1400 // MSVC 2005/8 + previous_iph_ = NULL; +#endif // _MSC_VER >= 1400 + previous_pch_ = NULL; + handler_thread_ = NULL; + is_shutdown_ = false; + handler_start_semaphore_ = NULL; + handler_finish_semaphore_ = NULL; + requesting_thread_id_ = 0; + exception_info_ = NULL; + assertion_ = NULL; + handler_return_value_ = false; + handle_debug_exceptions_ = false; + consume_invalid_handle_exceptions_ = false; + + // Attempt to use out-of-process if user has specified a pipe or a + // crash generation client. + scoped_ptr client; + if (crash_generation_client) { + client.reset(crash_generation_client); + } else if (pipe_name) { + client.reset( + new CrashGenerationClient(pipe_name, dump_type_, custom_info)); + } else if (pipe_handle) { + client.reset( + new CrashGenerationClient(pipe_handle, dump_type_, custom_info)); + } + + if (client.get() != NULL) { + // If successful in registering with the monitoring process, + // there is no need to setup in-process crash generation. + if (client->Register()) { + crash_generation_client_.reset(client.release()); + } + } + + if (!IsOutOfProcess()) { + // Either client did not ask for out-of-process crash generation + // or registration with the server process failed. In either case, + // setup to do in-process crash generation. + + // Set synchronization primitives and the handler thread. Each + // ExceptionHandler object gets its own handler thread because that's the + // only way to reliably guarantee sufficient stack space in an exception, + // and it allows an easy way to get a snapshot of the requesting thread's + // context outside of an exception. + InitializeCriticalSection(&handler_critical_section_); + handler_start_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL); + assert(handler_start_semaphore_ != NULL); + + handler_finish_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL); + assert(handler_finish_semaphore_ != NULL); + + // Don't attempt to create the thread if we could not create the semaphores. + if (handler_finish_semaphore_ != NULL && handler_start_semaphore_ != NULL) { + DWORD thread_id; + const int kExceptionHandlerThreadInitialStackSize = 64 * 1024; + handler_thread_ = CreateThread(NULL, // lpThreadAttributes + kExceptionHandlerThreadInitialStackSize, + ExceptionHandlerThreadMain, + this, // lpParameter + 0, // dwCreationFlags + &thread_id); + assert(handler_thread_ != NULL); + } + + dbghelp_module_ = LoadLibrary(L"dbghelp.dll"); + if (dbghelp_module_) { + minidump_write_dump_ = reinterpret_cast( + GetProcAddress(dbghelp_module_, "MiniDumpWriteDump")); + } + + // Load this library dynamically to not affect existing projects. Most + // projects don't link against this directly, it's usually dynamically + // loaded by dependent code. + rpcrt4_module_ = LoadLibrary(L"rpcrt4.dll"); + if (rpcrt4_module_) { + uuid_create_ = reinterpret_cast( + GetProcAddress(rpcrt4_module_, "UuidCreate")); + } + + // set_dump_path calls UpdateNextID. This sets up all of the path and id + // strings, and their equivalent c_str pointers. + set_dump_path(dump_path); + } + + // Reserve one element for the instruction memory + AppMemory instruction_memory; + instruction_memory.ptr = NULL; + instruction_memory.length = 0; + app_memory_info_.push_back(instruction_memory); + + // There is a race condition here. If the first instance has not yet + // initialized the critical section, the second (and later) instances may + // try to use uninitialized critical section object. The feature of multiple + // instances in one module is not used much, so leave it as is for now. + // One way to solve this in the current design (that is, keeping the static + // handler stack) is to use spin locks with volatile bools to synchronize + // the handler stack. This works only if the compiler guarantees to generate + // cache coherent code for volatile. + // TODO(munjal): Fix this in a better way by changing the design if possible. + + // Lazy initialization of the handler_stack_critical_section_ + if (instance_count == 1) { + InitializeCriticalSection(&handler_stack_critical_section_); + } + + if (handler_types != HANDLER_NONE) { + EnterCriticalSection(&handler_stack_critical_section_); + + // The first time an ExceptionHandler that installs a handler is + // created, set up the handler stack. + if (!handler_stack_) { + handler_stack_ = new vector(); + } + handler_stack_->push_back(this); + + if (handler_types & HANDLER_EXCEPTION) + previous_filter_ = SetUnhandledExceptionFilter(HandleException); + +#if _MSC_VER >= 1400 // MSVC 2005/8 + if (handler_types & HANDLER_INVALID_PARAMETER) + previous_iph_ = _set_invalid_parameter_handler(HandleInvalidParameter); +#endif // _MSC_VER >= 1400 + + if (handler_types & HANDLER_PURECALL) + previous_pch_ = _set_purecall_handler(HandlePureVirtualCall); + + LeaveCriticalSection(&handler_stack_critical_section_); + } +} + +ExceptionHandler::~ExceptionHandler() { + if (dbghelp_module_) { + FreeLibrary(dbghelp_module_); + } + + if (rpcrt4_module_) { + FreeLibrary(rpcrt4_module_); + } + + if (handler_types_ != HANDLER_NONE) { + EnterCriticalSection(&handler_stack_critical_section_); + + if (handler_types_ & HANDLER_EXCEPTION) + SetUnhandledExceptionFilter(previous_filter_); + +#if _MSC_VER >= 1400 // MSVC 2005/8 + if (handler_types_ & HANDLER_INVALID_PARAMETER) + _set_invalid_parameter_handler(previous_iph_); +#endif // _MSC_VER >= 1400 + + if (handler_types_ & HANDLER_PURECALL) + _set_purecall_handler(previous_pch_); + + if (handler_stack_->back() == this) { + handler_stack_->pop_back(); + } else { + // TODO(mmentovai): use advapi32!ReportEvent to log the warning to the + // system's application event log. + fprintf(stderr, "warning: removing Breakpad handler out of order\n"); + vector::iterator iterator = handler_stack_->begin(); + while (iterator != handler_stack_->end()) { + if (*iterator == this) { + iterator = handler_stack_->erase(iterator); + } else { + ++iterator; + } + } + } + + if (handler_stack_->empty()) { + // When destroying the last ExceptionHandler that installed a handler, + // clean up the handler stack. + delete handler_stack_; + handler_stack_ = NULL; + } + + LeaveCriticalSection(&handler_stack_critical_section_); + } + + // Some of the objects were only initialized if out of process + // registration was not done. + if (!IsOutOfProcess()) { +#ifdef BREAKPAD_NO_TERMINATE_THREAD + // Clean up the handler thread and synchronization primitives. The handler + // thread is either waiting on the semaphore to handle a crash or it is + // handling a crash. Coming out of the wait is fast but wait more in the + // eventuality a crash is handled. This compilation option results in a + // deadlock if the exception handler is destroyed while executing code + // inside DllMain. + is_shutdown_ = true; + ReleaseSemaphore(handler_start_semaphore_, 1, NULL); + const int kWaitForHandlerThreadMs = 60000; + WaitForSingleObject(handler_thread_, kWaitForHandlerThreadMs); +#else + TerminateThread(handler_thread_, 1); +#endif // BREAKPAD_NO_TERMINATE_THREAD + + CloseHandle(handler_thread_); + handler_thread_ = NULL; + DeleteCriticalSection(&handler_critical_section_); + CloseHandle(handler_start_semaphore_); + CloseHandle(handler_finish_semaphore_); + } + + // There is a race condition in the code below: if this instance is + // deleting the static critical section and a new instance of the class + // is created, then there is a possibility that the critical section be + // initialized while the same critical section is being deleted. Given the + // usage pattern for the code, this race condition is unlikely to hit, but it + // is a race condition nonetheless. + if (InterlockedDecrement(&instance_count_) == 0) { + DeleteCriticalSection(&handler_stack_critical_section_); + } +} + +bool ExceptionHandler::RequestUpload(DWORD crash_id) { + return crash_generation_client_->RequestUpload(crash_id); +} + +// static +DWORD ExceptionHandler::ExceptionHandlerThreadMain(void* lpParameter) { + ExceptionHandler* self = reinterpret_cast(lpParameter); + assert(self); + assert(self->handler_start_semaphore_ != NULL); + assert(self->handler_finish_semaphore_ != NULL); + + for (;;) { + if (WaitForSingleObject(self->handler_start_semaphore_, INFINITE) == + WAIT_OBJECT_0) { + // Perform the requested action. + if (self->is_shutdown_) { + // The instance of the exception handler is being destroyed. + break; + } else { + self->handler_return_value_ = + self->WriteMinidumpWithException(self->requesting_thread_id_, + self->exception_info_, + self->assertion_); + } + + // Allow the requesting thread to proceed. + ReleaseSemaphore(self->handler_finish_semaphore_, 1, NULL); + } + } + + // This statement is not reached when the thread is unconditionally + // terminated by the ExceptionHandler destructor. + return 0; +} + +// HandleException and HandleInvalidParameter must create an +// AutoExceptionHandler object to maintain static state and to determine which +// ExceptionHandler instance to use. The constructor locates the correct +// instance, and makes it available through get_handler(). The destructor +// restores the state in effect prior to allocating the AutoExceptionHandler. +class AutoExceptionHandler { + public: + AutoExceptionHandler() { + // Increment handler_stack_index_ so that if another Breakpad handler is + // registered using this same HandleException function, and it needs to be + // called while this handler is running (either because this handler + // declines to handle the exception, or an exception occurs during + // handling), HandleException will find the appropriate ExceptionHandler + // object in handler_stack_ to deliver the exception to. + // + // Because handler_stack_ is addressed in reverse (as |size - index|), + // preincrementing handler_stack_index_ avoids needing to subtract 1 from + // the argument to |at|. + // + // The index is maintained instead of popping elements off of the handler + // stack and pushing them at the end of this method. This avoids ruining + // the order of elements in the stack in the event that some other thread + // decides to manipulate the handler stack (such as creating a new + // ExceptionHandler object) while an exception is being handled. + EnterCriticalSection(&ExceptionHandler::handler_stack_critical_section_); + handler_ = ExceptionHandler::handler_stack_->at( + ExceptionHandler::handler_stack_->size() - + ++ExceptionHandler::handler_stack_index_); + + // In case another exception occurs while this handler is doing its thing, + // it should be delivered to the previous filter. + SetUnhandledExceptionFilter(handler_->previous_filter_); +#if _MSC_VER >= 1400 // MSVC 2005/8 + _set_invalid_parameter_handler(handler_->previous_iph_); +#endif // _MSC_VER >= 1400 + _set_purecall_handler(handler_->previous_pch_); + } + + ~AutoExceptionHandler() { + // Put things back the way they were before entering this handler. + SetUnhandledExceptionFilter(ExceptionHandler::HandleException); +#if _MSC_VER >= 1400 // MSVC 2005/8 + _set_invalid_parameter_handler(ExceptionHandler::HandleInvalidParameter); +#endif // _MSC_VER >= 1400 + _set_purecall_handler(ExceptionHandler::HandlePureVirtualCall); + + --ExceptionHandler::handler_stack_index_; + LeaveCriticalSection(&ExceptionHandler::handler_stack_critical_section_); + } + + ExceptionHandler* get_handler() const { return handler_; } + + private: + ExceptionHandler* handler_; +}; + +// static +LONG ExceptionHandler::HandleException(EXCEPTION_POINTERS* exinfo) { + AutoExceptionHandler auto_exception_handler; + ExceptionHandler* current_handler = auto_exception_handler.get_handler(); + + // Ignore EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP exceptions. This + // logic will short-circuit before calling WriteMinidumpOnHandlerThread, + // allowing something else to handle the breakpoint without incurring the + // overhead transitioning to and from the handler thread. This behavior + // can be overridden by calling ExceptionHandler::set_handle_debug_exceptions. + DWORD code = exinfo->ExceptionRecord->ExceptionCode; + LONG action; + bool is_debug_exception = (code == EXCEPTION_BREAKPOINT) || + (code == EXCEPTION_SINGLE_STEP) || + (code == DBG_PRINTEXCEPTION_C) || + (code == DBG_PRINTEXCEPTION_WIDE_C); + + if (code == EXCEPTION_INVALID_HANDLE && + current_handler->consume_invalid_handle_exceptions_) { + return EXCEPTION_CONTINUE_EXECUTION; + } + + bool success = false; + + if (!is_debug_exception || + current_handler->get_handle_debug_exceptions()) { + // If out-of-proc crash handler client is available, we have to use that + // to generate dump and we cannot fall back on in-proc dump generation + // because we never prepared for an in-proc dump generation + + // In case of out-of-process dump generation, directly call + // WriteMinidumpWithException since there is no separate thread running. + if (current_handler->IsOutOfProcess()) { + success = current_handler->WriteMinidumpWithException( + GetCurrentThreadId(), + exinfo, + NULL); + } else { + success = current_handler->WriteMinidumpOnHandlerThread(exinfo, NULL); + } + } + + // The handler fully handled the exception. Returning + // EXCEPTION_EXECUTE_HANDLER indicates this to the system, and usually + // results in the application being terminated. + // + // Note: If the application was launched from within the Cygwin + // environment, returning EXCEPTION_EXECUTE_HANDLER seems to cause the + // application to be restarted. + if (success) { + action = EXCEPTION_EXECUTE_HANDLER; + } else { + // There was an exception, it was a breakpoint or something else ignored + // above, or it was passed to the handler, which decided not to handle it. + // This could be because the filter callback didn't want it, because + // minidump writing failed for some reason, or because the post-minidump + // callback function indicated failure. Give the previous handler a + // chance to do something with the exception. If there is no previous + // handler, return EXCEPTION_CONTINUE_SEARCH, which will allow a debugger + // or native "crashed" dialog to handle the exception. + if (current_handler->previous_filter_) { + action = current_handler->previous_filter_(exinfo); + } else { + action = EXCEPTION_CONTINUE_SEARCH; + } + } + + return action; +} + +#if _MSC_VER >= 1400 // MSVC 2005/8 +// static +void ExceptionHandler::HandleInvalidParameter(const wchar_t* expression, + const wchar_t* function, + const wchar_t* file, + unsigned int line, + uintptr_t reserved) { + // This is an invalid parameter, not an exception. It's safe to play with + // sprintf here. + AutoExceptionHandler auto_exception_handler; + ExceptionHandler* current_handler = auto_exception_handler.get_handler(); + + MDRawAssertionInfo assertion; + memset(&assertion, 0, sizeof(assertion)); + _snwprintf_s(reinterpret_cast(assertion.expression), + sizeof(assertion.expression) / sizeof(assertion.expression[0]), + _TRUNCATE, L"%s", expression); + _snwprintf_s(reinterpret_cast(assertion.function), + sizeof(assertion.function) / sizeof(assertion.function[0]), + _TRUNCATE, L"%s", function); + _snwprintf_s(reinterpret_cast(assertion.file), + sizeof(assertion.file) / sizeof(assertion.file[0]), + _TRUNCATE, L"%s", file); + assertion.line = line; + assertion.type = MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER; + + // Make up an exception record for the current thread and CPU context + // to make it possible for the crash processor to classify these + // as do regular crashes, and to make it humane for developers to + // analyze them. + EXCEPTION_RECORD exception_record = {}; + CONTEXT exception_context = {}; + EXCEPTION_POINTERS exception_ptrs = { &exception_record, &exception_context }; + + ::RtlCaptureContext(&exception_context); + + exception_record.ExceptionCode = STATUS_INVALID_PARAMETER; + + // We store pointers to the the expression and function strings, + // and the line as exception parameters to make them easy to + // access by the developer on the far side. + exception_record.NumberParameters = 3; + exception_record.ExceptionInformation[0] = + reinterpret_cast(&assertion.expression); + exception_record.ExceptionInformation[1] = + reinterpret_cast(&assertion.file); + exception_record.ExceptionInformation[2] = assertion.line; + + bool success = false; + // In case of out-of-process dump generation, directly call + // WriteMinidumpWithException since there is no separate thread running. + if (current_handler->IsOutOfProcess()) { + success = current_handler->WriteMinidumpWithException( + GetCurrentThreadId(), + &exception_ptrs, + &assertion); + } else { + success = current_handler->WriteMinidumpOnHandlerThread(&exception_ptrs, + &assertion); + } + + if (!success) { + if (current_handler->previous_iph_) { + // The handler didn't fully handle the exception. Give it to the + // previous invalid parameter handler. + current_handler->previous_iph_(expression, + function, + file, + line, + reserved); + } else { + // If there's no previous handler, pass the exception back in to the + // invalid parameter handler's core. That's the routine that called this + // function, but now, since this function is no longer registered (and in + // fact, no function at all is registered), this will result in the + // default code path being taken: _CRT_DEBUGGER_HOOK and _invoke_watson. + // Use _invalid_parameter where it exists (in _DEBUG builds) as it passes + // more information through. In non-debug builds, it is not available, + // so fall back to using _invalid_parameter_noinfo. See invarg.c in the + // CRT source. +#ifdef _DEBUG + _invalid_parameter(expression, function, file, line, reserved); +#else // _DEBUG + _invalid_parameter_noinfo(); +#endif // _DEBUG + } + } + + // The handler either took care of the invalid parameter problem itself, + // or passed it on to another handler. "Swallow" it by exiting, paralleling + // the behavior of "swallowing" exceptions. + exit(0); +} +#endif // _MSC_VER >= 1400 + +// static +void ExceptionHandler::HandlePureVirtualCall() { + // This is an pure virtual function call, not an exception. It's safe to + // play with sprintf here. + AutoExceptionHandler auto_exception_handler; + ExceptionHandler* current_handler = auto_exception_handler.get_handler(); + + MDRawAssertionInfo assertion; + memset(&assertion, 0, sizeof(assertion)); + assertion.type = MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL; + + // Make up an exception record for the current thread and CPU context + // to make it possible for the crash processor to classify these + // as do regular crashes, and to make it humane for developers to + // analyze them. + EXCEPTION_RECORD exception_record = {}; + CONTEXT exception_context = {}; + EXCEPTION_POINTERS exception_ptrs = { &exception_record, &exception_context }; + + ::RtlCaptureContext(&exception_context); + + exception_record.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION; + + // We store pointers to the the expression and function strings, + // and the line as exception parameters to make them easy to + // access by the developer on the far side. + exception_record.NumberParameters = 3; + exception_record.ExceptionInformation[0] = + reinterpret_cast(&assertion.expression); + exception_record.ExceptionInformation[1] = + reinterpret_cast(&assertion.file); + exception_record.ExceptionInformation[2] = assertion.line; + + bool success = false; + // In case of out-of-process dump generation, directly call + // WriteMinidumpWithException since there is no separate thread running. + + if (current_handler->IsOutOfProcess()) { + success = current_handler->WriteMinidumpWithException( + GetCurrentThreadId(), + &exception_ptrs, + &assertion); + } else { + success = current_handler->WriteMinidumpOnHandlerThread(&exception_ptrs, + &assertion); + } + + if (!success) { + if (current_handler->previous_pch_) { + // The handler didn't fully handle the exception. Give it to the + // previous purecall handler. + current_handler->previous_pch_(); + } else { + // If there's no previous handler, return and let _purecall handle it. + // This will just put up an assertion dialog. + return; + } + } + + // The handler either took care of the invalid parameter problem itself, + // or passed it on to another handler. "Swallow" it by exiting, paralleling + // the behavior of "swallowing" exceptions. + exit(0); +} + +bool ExceptionHandler::WriteMinidumpOnHandlerThread( + EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion) { + EnterCriticalSection(&handler_critical_section_); + + // There isn't much we can do if the handler thread + // was not successfully created. + if (handler_thread_ == NULL) { + LeaveCriticalSection(&handler_critical_section_); + return false; + } + + // The handler thread should only be created when the semaphores are valid. + assert(handler_start_semaphore_ != NULL); + assert(handler_finish_semaphore_ != NULL); + + // Set up data to be passed in to the handler thread. + requesting_thread_id_ = GetCurrentThreadId(); + exception_info_ = exinfo; + assertion_ = assertion; + + // This causes the handler thread to call WriteMinidumpWithException. + ReleaseSemaphore(handler_start_semaphore_, 1, NULL); + + // Wait until WriteMinidumpWithException is done and collect its return value. + WaitForSingleObject(handler_finish_semaphore_, INFINITE); + bool status = handler_return_value_; + + // Clean up. + requesting_thread_id_ = 0; + exception_info_ = NULL; + assertion_ = NULL; + + LeaveCriticalSection(&handler_critical_section_); + + return status; +} + +bool ExceptionHandler::WriteMinidump() { + // Make up an exception record for the current thread and CPU context + // to make it possible for the crash processor to classify these + // as do regular crashes, and to make it humane for developers to + // analyze them. + EXCEPTION_RECORD exception_record = {}; + CONTEXT exception_context = {}; + EXCEPTION_POINTERS exception_ptrs = { &exception_record, &exception_context }; + + ::RtlCaptureContext(&exception_context); + exception_record.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION; + + return WriteMinidumpForException(&exception_ptrs); +} + +bool ExceptionHandler::WriteMinidumpForException(EXCEPTION_POINTERS* exinfo) { + // In case of out-of-process dump generation, directly call + // WriteMinidumpWithException since there is no separate thread running. + if (IsOutOfProcess()) { + return WriteMinidumpWithException(GetCurrentThreadId(), + exinfo, + NULL); + } + + bool success = WriteMinidumpOnHandlerThread(exinfo, NULL); + UpdateNextID(); + return success; +} + +// static +bool ExceptionHandler::WriteMinidump(const wstring& dump_path, + MinidumpCallback callback, + void* callback_context, + MINIDUMP_TYPE dump_type) { + ExceptionHandler handler(dump_path, NULL, callback, callback_context, + HANDLER_NONE, dump_type, (HANDLE)NULL, NULL); + return handler.WriteMinidump(); +} + +// static +bool ExceptionHandler::WriteMinidumpForChild(HANDLE child, + DWORD child_blamed_thread, + const wstring& dump_path, + MinidumpCallback callback, + void* callback_context, + MINIDUMP_TYPE dump_type) { + EXCEPTION_RECORD ex; + CONTEXT ctx; + EXCEPTION_POINTERS exinfo = { NULL, NULL }; + // As documented on MSDN, on failure SuspendThread returns (DWORD) -1 + const DWORD kFailedToSuspendThread = static_cast(-1); + DWORD last_suspend_count = kFailedToSuspendThread; + HANDLE child_thread_handle = OpenThread(THREAD_GET_CONTEXT | + THREAD_QUERY_INFORMATION | + THREAD_SUSPEND_RESUME, + FALSE, + child_blamed_thread); + // This thread may have died already, so not opening the handle is a + // non-fatal error. + if (child_thread_handle != NULL) { + last_suspend_count = SuspendThread(child_thread_handle); + if (last_suspend_count != kFailedToSuspendThread) { + ctx.ContextFlags = CONTEXT_ALL; + if (GetThreadContext(child_thread_handle, &ctx)) { + memset(&ex, 0, sizeof(ex)); + ex.ExceptionCode = EXCEPTION_BREAKPOINT; +#if defined(_M_IX86) + ex.ExceptionAddress = reinterpret_cast(ctx.Eip); +#elif defined(_M_X64) + ex.ExceptionAddress = reinterpret_cast(ctx.Rip); +#endif + exinfo.ExceptionRecord = &ex; + exinfo.ContextRecord = &ctx; + } + } + } + + ExceptionHandler handler(dump_path, NULL, callback, callback_context, + HANDLER_NONE, dump_type, (HANDLE)NULL, NULL); + bool success = handler.WriteMinidumpWithExceptionForProcess( + child_blamed_thread, + exinfo.ExceptionRecord ? &exinfo : NULL, + NULL, child, false); + + if (last_suspend_count != kFailedToSuspendThread) { + ResumeThread(child_thread_handle); + } + + CloseHandle(child_thread_handle); + + if (callback) { + success = callback(handler.dump_path_c_, handler.next_minidump_id_c_, + callback_context, NULL, NULL, success); + } + + return success; +} + +bool ExceptionHandler::WriteMinidumpWithException( + DWORD requesting_thread_id, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion) { + // Give user code a chance to approve or prevent writing a minidump. If the + // filter returns false, don't handle the exception at all. If this method + // was called as a result of an exception, returning false will cause + // HandleException to call any previous handler or return + // EXCEPTION_CONTINUE_SEARCH on the exception thread, allowing it to appear + // as though this handler were not present at all. + if (filter_ && !filter_(callback_context_, exinfo, assertion)) { + return false; + } + + bool success = false; + if (IsOutOfProcess()) { + success = crash_generation_client_->RequestDump(exinfo, assertion); + } else { + success = WriteMinidumpWithExceptionForProcess(requesting_thread_id, + exinfo, + assertion, + GetCurrentProcess(), + true); + } + + if (callback_) { + // TODO(munjal): In case of out-of-process dump generation, both + // dump_path_c_ and next_minidump_id_ will be NULL. For out-of-process + // scenario, the server process ends up creating the dump path and dump + // id so they are not known to the client. + success = callback_(dump_path_c_, next_minidump_id_c_, callback_context_, + exinfo, assertion, success); + } + + return success; +} + +// static +BOOL CALLBACK ExceptionHandler::MinidumpWriteDumpCallback( + PVOID context, + const PMINIDUMP_CALLBACK_INPUT callback_input, + PMINIDUMP_CALLBACK_OUTPUT callback_output) { + switch (callback_input->CallbackType) { + case MemoryCallback: { + MinidumpCallbackContext* callback_context = + reinterpret_cast(context); + if (callback_context->iter == callback_context->end) + return FALSE; + + // Include the specified memory region. + callback_output->MemoryBase = callback_context->iter->ptr; + callback_output->MemorySize = callback_context->iter->length; + callback_context->iter++; + return TRUE; + } + + // Include all modules. + case IncludeModuleCallback: + case ModuleCallback: + return TRUE; + + // Include all threads. + case IncludeThreadCallback: + case ThreadCallback: + return TRUE; + + // Stop receiving cancel callbacks. + case CancelCallback: + callback_output->CheckCancel = FALSE; + callback_output->Cancel = FALSE; + return TRUE; + } + // Ignore other callback types. + return FALSE; +} + +bool ExceptionHandler::WriteMinidumpWithExceptionForProcess( + DWORD requesting_thread_id, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + HANDLE process, + bool write_requester_stream) { + bool success = false; + if (minidump_write_dump_) { + HANDLE dump_file = CreateFile(next_minidump_path_c_, + GENERIC_WRITE, + 0, // no sharing + NULL, + CREATE_NEW, // fail if exists + FILE_ATTRIBUTE_NORMAL, + NULL); + if (dump_file != INVALID_HANDLE_VALUE) { + MINIDUMP_EXCEPTION_INFORMATION except_info; + except_info.ThreadId = requesting_thread_id; + except_info.ExceptionPointers = exinfo; + except_info.ClientPointers = FALSE; + + // Leave room in user_stream_array for possible breakpad and + // assertion info streams. + MINIDUMP_USER_STREAM user_stream_array[2]; + MINIDUMP_USER_STREAM_INFORMATION user_streams; + user_streams.UserStreamCount = 0; + user_streams.UserStreamArray = user_stream_array; + + if (write_requester_stream) { + // Add an MDRawBreakpadInfo stream to the minidump, to provide + // additional information about the exception handler to the Breakpad + // processor. The information will help the processor determine which + // threads are relevant. The Breakpad processor does not require this + // information but can function better with Breakpad-generated dumps + // when it is present. The native debugger is not harmed by the + // presence of this information. + MDRawBreakpadInfo breakpad_info; + breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; + breakpad_info.dump_thread_id = GetCurrentThreadId(); + breakpad_info.requesting_thread_id = requesting_thread_id; + + int index = user_streams.UserStreamCount; + user_stream_array[index].Type = MD_BREAKPAD_INFO_STREAM; + user_stream_array[index].BufferSize = sizeof(breakpad_info); + user_stream_array[index].Buffer = &breakpad_info; + ++user_streams.UserStreamCount; + } + + if (assertion) { + int index = user_streams.UserStreamCount; + user_stream_array[index].Type = MD_ASSERTION_INFO_STREAM; + user_stream_array[index].BufferSize = sizeof(MDRawAssertionInfo); + user_stream_array[index].Buffer = assertion; + ++user_streams.UserStreamCount; + } + + // Older versions of DbgHelp.dll don't correctly put the memory around + // the faulting instruction pointer into the minidump. This + // callback will ensure that it gets included. + if (exinfo) { + // Find a memory region of 256 bytes centered on the + // faulting instruction pointer. + const ULONG64 instruction_pointer = +#if defined(_M_IX86) + exinfo->ContextRecord->Eip; +#elif defined(_M_AMD64) + exinfo->ContextRecord->Rip; +#elif defined(_M_ARM64) + exinfo->ContextRecord->Pc; +#else +#error Unsupported platform +#endif + + MEMORY_BASIC_INFORMATION info; + if (VirtualQueryEx(process, + reinterpret_cast(instruction_pointer), + &info, + sizeof(MEMORY_BASIC_INFORMATION)) != 0 && + info.State == MEM_COMMIT) { + // Attempt to get 128 bytes before and after the instruction + // pointer, but settle for whatever's available up to the + // boundaries of the memory region. + const ULONG64 kIPMemorySize = 256; + ULONG64 base = + (std::max)(reinterpret_cast(info.BaseAddress), + instruction_pointer - (kIPMemorySize / 2)); + ULONG64 end_of_range = + (std::min)(instruction_pointer + (kIPMemorySize / 2), + reinterpret_cast(info.BaseAddress) + + info.RegionSize); + ULONG size = static_cast(end_of_range - base); + + AppMemory& elt = app_memory_info_.front(); + elt.ptr = base; + elt.length = size; + } + } + + MinidumpCallbackContext context; + context.iter = app_memory_info_.begin(); + context.end = app_memory_info_.end(); + + // Skip the reserved element if there was no instruction memory + if (context.iter->ptr == 0) { + context.iter++; + } + + MINIDUMP_CALLBACK_INFORMATION callback; + callback.CallbackRoutine = MinidumpWriteDumpCallback; + callback.CallbackParam = reinterpret_cast(&context); + + // The explicit comparison to TRUE avoids a warning (C4800). + success = (minidump_write_dump_(process, + GetProcessId(process), + dump_file, + dump_type_, + exinfo ? &except_info : NULL, + &user_streams, + &callback) == TRUE); + + CloseHandle(dump_file); + } + } + + return success; +} + +void ExceptionHandler::UpdateNextID() { + assert(uuid_create_); + UUID id = {0}; + if (uuid_create_) { + uuid_create_(&id); + } + next_minidump_id_ = GUIDString::GUIDToWString(&id); + next_minidump_id_c_ = next_minidump_id_.c_str(); + + wchar_t minidump_path[MAX_PATH]; + swprintf(minidump_path, MAX_PATH, L"%s\\%s.dmp", + dump_path_c_, next_minidump_id_c_); + + // remove when VC++7.1 is no longer supported + minidump_path[MAX_PATH - 1] = L'\0'; + + next_minidump_path_ = minidump_path; + next_minidump_path_c_ = next_minidump_path_.c_str(); +} + +void ExceptionHandler::RegisterAppMemory(void* ptr, size_t length) { + AppMemoryList::iterator iter = + std::find(app_memory_info_.begin(), app_memory_info_.end(), ptr); + if (iter != app_memory_info_.end()) { + // Don't allow registering the same pointer twice. + return; + } + + AppMemory app_memory; + app_memory.ptr = reinterpret_cast(ptr); + app_memory.length = static_cast(length); + app_memory_info_.push_back(app_memory); +} + +void ExceptionHandler::UnregisterAppMemory(void* ptr) { + AppMemoryList::iterator iter = + std::find(app_memory_info_.begin(), app_memory_info_.end(), ptr); + if (iter != app_memory_info_.end()) { + app_memory_info_.erase(iter); + } +} + +} // namespace google_breakpad diff --git a/src/client/windows/handler/exception_handler.h b/src/client/windows/handler/exception_handler.h new file mode 100644 index 0000000..963572b --- /dev/null +++ b/src/client/windows/handler/exception_handler.h @@ -0,0 +1,523 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ExceptionHandler can write a minidump file when an exception occurs, +// or when WriteMinidump() is called explicitly by your program. +// +// To have the exception handler write minidumps when an uncaught exception +// (crash) occurs, you should create an instance early in the execution +// of your program, and keep it around for the entire time you want to +// have crash handling active (typically, until shutdown). +// +// If you want to write minidumps without installing the exception handler, +// you can create an ExceptionHandler with install_handler set to false, +// then call WriteMinidump. You can also use this technique if you want to +// use different minidump callbacks for different call sites. +// +// In either case, a callback function is called when a minidump is written, +// which receives the unqiue id of the minidump. The caller can use this +// id to collect and write additional application state, and to launch an +// external crash-reporting application. +// +// It is important that creation and destruction of ExceptionHandler objects +// be nested cleanly, when using install_handler = true. +// Avoid the following pattern: +// ExceptionHandler *e = new ExceptionHandler(...); +// ExceptionHandler *f = new ExceptionHandler(...); +// delete e; +// This will put the exception filter stack into an inconsistent state. + +#ifndef CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ +#define CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ + +#include +#include +#include +#include + +#pragma warning(push) +// Disable exception handler warnings. +#pragma warning(disable:4530) + +#include +#include +#include + +#include "client/windows/common/ipc_protocol.h" +#include "client/windows/crash_generation/crash_generation_client.h" +#include "common/scoped_ptr.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +using std::vector; +using std::wstring; + +// These entries store a list of memory regions that the client wants included +// in the minidump. +struct AppMemory { + ULONG64 ptr; + ULONG length; + + bool operator==(const struct AppMemory& other) const { + return ptr == other.ptr; + } + + bool operator==(const void* other) const { + return ptr == reinterpret_cast(other); + } +}; +typedef std::list AppMemoryList; + +class ExceptionHandler { + public: + // A callback function to run before Breakpad performs any substantial + // processing of an exception. A FilterCallback is called before writing + // a minidump. context is the parameter supplied by the user as + // callback_context when the handler was created. exinfo points to the + // exception record, if any; assertion points to assertion information, + // if any. + // + // If a FilterCallback returns true, Breakpad will continue processing, + // attempting to write a minidump. If a FilterCallback returns false, + // Breakpad will immediately report the exception as unhandled without + // writing a minidump, allowing another handler the opportunity to handle it. + typedef bool (*FilterCallback)(void* context, EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion); + + // A callback function to run after the minidump has been written. + // minidump_id is a unique id for the dump, so the minidump + // file is \.dmp. context is the parameter supplied + // by the user as callback_context when the handler was created. exinfo + // points to the exception record, or NULL if no exception occurred. + // succeeded indicates whether a minidump file was successfully written. + // assertion points to information about an assertion if the handler was + // invoked by an assertion. + // + // If an exception occurred and the callback returns true, Breakpad will treat + // the exception as fully-handled, suppressing any other handlers from being + // notified of the exception. If the callback returns false, Breakpad will + // treat the exception as unhandled, and allow another handler to handle it. + // If there are no other handlers, Breakpad will report the exception to the + // system as unhandled, allowing a debugger or native crash dialog the + // opportunity to handle the exception. Most callback implementations + // should normally return the value of |succeeded|, or when they wish to + // not report an exception of handled, false. Callbacks will rarely want to + // return true directly (unless |succeeded| is true). + // + // For out-of-process dump generation, dump path and minidump ID will always + // be NULL. In case of out-of-process dump generation, the dump path and + // minidump id are controlled by the server process and are not communicated + // back to the crashing process. + typedef bool (*MinidumpCallback)(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded); + + // HandlerType specifies which types of handlers should be installed, if + // any. Use HANDLER_NONE for an ExceptionHandler that remains idle, + // without catching any failures on its own. This type of handler may + // still be triggered by calling WriteMinidump. Otherwise, use a + // combination of the other HANDLER_ values, or HANDLER_ALL to install + // all handlers. + enum HandlerType { + HANDLER_NONE = 0, + HANDLER_EXCEPTION = 1 << 0, // SetUnhandledExceptionFilter + HANDLER_INVALID_PARAMETER = 1 << 1, // _set_invalid_parameter_handler + HANDLER_PURECALL = 1 << 2, // _set_purecall_handler + HANDLER_ALL = HANDLER_EXCEPTION | + HANDLER_INVALID_PARAMETER | + HANDLER_PURECALL + }; + + // Creates a new ExceptionHandler instance to handle writing minidumps. + // Before writing a minidump, the optional filter callback will be called. + // Its return value determines whether or not Breakpad should write a + // minidump. Minidump files will be written to dump_path, and the optional + // callback is called after writing the dump file, as described above. + // handler_types specifies the types of handlers that should be installed. + ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types); + + // Creates a new ExceptionHandler instance that can attempt to perform + // out-of-process dump generation if pipe_name is not NULL. If pipe_name is + // NULL, or if out-of-process dump generation registration step fails, + // in-process dump generation will be used. This also allows specifying + // the dump type to generate. + ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + const CustomClientInfo* custom_info); + + // As above, creates a new ExceptionHandler instance to perform + // out-of-process dump generation if the given pipe_handle is not NULL. + ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + HANDLE pipe_handle, + const CustomClientInfo* custom_info); + + // ExceptionHandler that ENSURES out-of-process dump generation. Expects a + // crash generation client that is already registered with a crash generation + // server. Takes ownership of the passed-in crash_generation_client. + // + // Usage example: + // crash_generation_client = new CrashGenerationClient(..); + // if (crash_generation_client->Register()) { + // // Registration with the crash generation server succeeded. + // // Out-of-process dump generation is guaranteed. + // g_handler = new ExceptionHandler(.., crash_generation_client, ..); + // return true; + // } + ExceptionHandler(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + CrashGenerationClient* crash_generation_client); + + ~ExceptionHandler(); + + // Get and set the minidump path. + wstring dump_path() const { return dump_path_; } + void set_dump_path(const wstring& dump_path) { + dump_path_ = dump_path; + dump_path_c_ = dump_path_.c_str(); + UpdateNextID(); // Necessary to put dump_path_ in next_minidump_path_. + } + + // Requests that a previously reported crash be uploaded. + bool RequestUpload(DWORD crash_id); + + // Writes a minidump immediately. This can be used to capture the + // execution state independently of a crash. Returns true on success. + bool WriteMinidump(); + + // Writes a minidump immediately, with the user-supplied exception + // information. + bool WriteMinidumpForException(EXCEPTION_POINTERS* exinfo); + + // Convenience form of WriteMinidump which does not require an + // ExceptionHandler instance. + static bool WriteMinidump(const wstring& dump_path, + MinidumpCallback callback, void* callback_context, + MINIDUMP_TYPE dump_type = MiniDumpNormal); + + // Write a minidump of |child| immediately. This can be used to + // capture the execution state of |child| independently of a crash. + // Pass a meaningful |child_blamed_thread| to make that thread in + // the child process the one from which a crash signature is + // extracted. + static bool WriteMinidumpForChild(HANDLE child, + DWORD child_blamed_thread, + const wstring& dump_path, + MinidumpCallback callback, + void* callback_context, + MINIDUMP_TYPE dump_type = MiniDumpNormal); + + // Get the thread ID of the thread requesting the dump (either the exception + // thread or any other thread that called WriteMinidump directly). This + // may be useful if you want to include additional thread state in your + // dumps. + DWORD get_requesting_thread_id() const { return requesting_thread_id_; } + + // Controls behavior of EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP. + bool get_handle_debug_exceptions() const { return handle_debug_exceptions_; } + void set_handle_debug_exceptions(bool handle_debug_exceptions) { + handle_debug_exceptions_ = handle_debug_exceptions; + } + + // Controls behavior of EXCEPTION_INVALID_HANDLE. + bool get_consume_invalid_handle_exceptions() const { + return consume_invalid_handle_exceptions_; + } + void set_consume_invalid_handle_exceptions( + bool consume_invalid_handle_exceptions) { + consume_invalid_handle_exceptions_ = consume_invalid_handle_exceptions; + } + + // Returns whether out-of-process dump generation is used or not. + bool IsOutOfProcess() const { return crash_generation_client_.get() != NULL; } + + // Calling RegisterAppMemory(p, len) causes len bytes starting + // at address p to be copied to the minidump when a crash happens. + void RegisterAppMemory(void* ptr, size_t length); + void UnregisterAppMemory(void* ptr); + + private: + friend class AutoExceptionHandler; + + // Initializes the instance with given values. + void Initialize(const wstring& dump_path, + FilterCallback filter, + MinidumpCallback callback, + void* callback_context, + int handler_types, + MINIDUMP_TYPE dump_type, + const wchar_t* pipe_name, + HANDLE pipe_handle, + CrashGenerationClient* crash_generation_client, + const CustomClientInfo* custom_info); + + // Function pointer type for MiniDumpWriteDump, which is looked up + // dynamically. + typedef BOOL (WINAPI *MiniDumpWriteDump_type)( + HANDLE hProcess, + DWORD dwPid, + HANDLE hFile, + MINIDUMP_TYPE DumpType, + CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); + + // Function pointer type for UuidCreate, which is looked up dynamically. + typedef RPC_STATUS (RPC_ENTRY *UuidCreate_type)(UUID* Uuid); + + // Runs the main loop for the exception handler thread. + static DWORD WINAPI ExceptionHandlerThreadMain(void* lpParameter); + + // Called on the exception thread when an unhandled exception occurs. + // Signals the exception handler thread to handle the exception. + static LONG WINAPI HandleException(EXCEPTION_POINTERS* exinfo); + +#if _MSC_VER >= 1400 // MSVC 2005/8 + // This function will be called by some CRT functions when they detect + // that they were passed an invalid parameter. Note that in _DEBUG builds, + // the CRT may display an assertion dialog before calling this function, + // and the function will not be called unless the assertion dialog is + // dismissed by clicking "Ignore." + static void HandleInvalidParameter(const wchar_t* expression, + const wchar_t* function, + const wchar_t* file, + unsigned int line, + uintptr_t reserved); +#endif // _MSC_VER >= 1400 + + // This function will be called by the CRT when a pure virtual + // function is called. + static void HandlePureVirtualCall(); + + // This is called on the exception thread or on another thread that + // the user wishes to produce a dump from. It calls + // WriteMinidumpWithException on the handler thread, avoiding stack + // overflows and inconsistent dumps due to writing the dump from + // the exception thread. If the dump is requested as a result of an + // exception, exinfo contains exception information, otherwise, it + // is NULL. If the dump is requested as a result of an assertion + // (such as an invalid parameter being passed to a CRT function), + // assertion contains data about the assertion, otherwise, it is NULL. + bool WriteMinidumpOnHandlerThread(EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion); + + // This function is called on the handler thread. It calls into + // WriteMinidumpWithExceptionForProcess() with a handle to the + // current process. requesting_thread_id is the ID of the thread + // that requested the dump. If the dump is requested as a result of + // an exception, exinfo contains exception information, otherwise, + // it is NULL. + bool WriteMinidumpWithException(DWORD requesting_thread_id, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion); + + // This function is used as a callback when calling MinidumpWriteDump, + // in order to add additional memory regions to the dump. + static BOOL CALLBACK MinidumpWriteDumpCallback( + PVOID context, + const PMINIDUMP_CALLBACK_INPUT callback_input, + PMINIDUMP_CALLBACK_OUTPUT callback_output); + + // This function does the actual writing of a minidump. It is + // called on the handler thread. requesting_thread_id is the ID of + // the thread that requested the dump, if that information is + // meaningful. If the dump is requested as a result of an + // exception, exinfo contains exception information, otherwise, it + // is NULL. process is the one that will be dumped. If + // requesting_thread_id is meaningful and should be added to the + // minidump, write_requester_stream is |true|. + bool WriteMinidumpWithExceptionForProcess(DWORD requesting_thread_id, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + HANDLE process, + bool write_requester_stream); + + // Generates a new ID and stores it in next_minidump_id_, and stores the + // path of the next minidump to be written in next_minidump_path_. + void UpdateNextID(); + + FilterCallback filter_; + MinidumpCallback callback_; + void* callback_context_; + + scoped_ptr crash_generation_client_; + + // The directory in which a minidump will be written, set by the dump_path + // argument to the constructor, or set_dump_path. + wstring dump_path_; + + // The basename of the next minidump to be written, without the extension. + wstring next_minidump_id_; + + // The full pathname of the next minidump to be written, including the file + // extension. + wstring next_minidump_path_; + + // Pointers to C-string representations of the above. These are set when + // the above wstring versions are set in order to avoid calling c_str during + // an exception, as c_str may attempt to allocate heap memory. These + // pointers are not owned by the ExceptionHandler object, but their lifetimes + // should be equivalent to the lifetimes of the associated wstring, provided + // that the wstrings are not altered. + const wchar_t* dump_path_c_; + const wchar_t* next_minidump_id_c_; + const wchar_t* next_minidump_path_c_; + + HMODULE dbghelp_module_; + MiniDumpWriteDump_type minidump_write_dump_; + MINIDUMP_TYPE dump_type_; + + HMODULE rpcrt4_module_; + UuidCreate_type uuid_create_; + + // Tracks the handler types that were installed according to the + // handler_types constructor argument. + int handler_types_; + + // When installed_handler_ is true, previous_filter_ is the unhandled + // exception filter that was set prior to installing ExceptionHandler as + // the unhandled exception filter and pointing it to |this|. NULL indicates + // that there is no previous unhandled exception filter. + LPTOP_LEVEL_EXCEPTION_FILTER previous_filter_; + +#if _MSC_VER >= 1400 // MSVC 2005/8 + // Beginning in VC 8, the CRT provides an invalid parameter handler that will + // be called when some CRT functions are passed invalid parameters. In + // earlier CRTs, the same conditions would cause unexpected behavior or + // crashes. + _invalid_parameter_handler previous_iph_; +#endif // _MSC_VER >= 1400 + + // The CRT allows you to override the default handler for pure + // virtual function calls. + _purecall_handler previous_pch_; + + // The exception handler thread. + HANDLE handler_thread_; + + // True if the exception handler is being destroyed. + // Starting with MSVC 2005, Visual C has stronger guarantees on volatile vars. + // It has release semantics on write and acquire semantics on reads. + // See the msdn documentation. + volatile bool is_shutdown_; + + // The critical section enforcing the requirement that only one exception be + // handled by a handler at a time. + CRITICAL_SECTION handler_critical_section_; + + // Semaphores used to move exception handling between the exception thread + // and the handler thread. handler_start_semaphore_ is signalled by the + // exception thread to wake up the handler thread when an exception occurs. + // handler_finish_semaphore_ is signalled by the handler thread to wake up + // the exception thread when handling is complete. + HANDLE handler_start_semaphore_; + HANDLE handler_finish_semaphore_; + + // The next 2 fields contain data passed from the requesting thread to + // the handler thread. + + // The thread ID of the thread requesting the dump (either the exception + // thread or any other thread that called WriteMinidump directly). + DWORD requesting_thread_id_; + + // The exception info passed to the exception handler on the exception + // thread, if an exception occurred. NULL for user-requested dumps. + EXCEPTION_POINTERS* exception_info_; + + // If the handler is invoked due to an assertion, this will contain a + // pointer to the assertion information. It is NULL at other times. + MDRawAssertionInfo* assertion_; + + // The return value of the handler, passed from the handler thread back to + // the requesting thread. + bool handler_return_value_; + + // If true, the handler will intercept EXCEPTION_BREAKPOINT and + // EXCEPTION_SINGLE_STEP exceptions. Leave this false (the default) + // to not interfere with debuggers. + bool handle_debug_exceptions_; + + // If true, the handler will consume any EXCEPTION_INVALID_HANDLE exceptions. + // Leave this false (the default) to handle these exceptions as normal. + bool consume_invalid_handle_exceptions_; + + // Callers can request additional memory regions to be included in + // the dump. + AppMemoryList app_memory_info_; + + // A stack of ExceptionHandler objects that have installed unhandled + // exception filters. This vector is used by HandleException to determine + // which ExceptionHandler object to route an exception to. When an + // ExceptionHandler is created with install_handler true, it will append + // itself to this list. + static vector* handler_stack_; + + // The index of the ExceptionHandler in handler_stack_ that will handle the + // next exception. Note that 0 means the last entry in handler_stack_, 1 + // means the next-to-last entry, and so on. This is used by HandleException + // to support multiple stacked Breakpad handlers. + static LONG handler_stack_index_; + + // handler_stack_critical_section_ guards operations on handler_stack_ and + // handler_stack_index_. The critical section is initialized by the + // first instance of the class and destroyed by the last instance of it. + static CRITICAL_SECTION handler_stack_critical_section_; + + // The number of instances of this class. + static volatile LONG instance_count_; + + // disallow copy ctor and operator= + explicit ExceptionHandler(const ExceptionHandler&); + void operator=(const ExceptionHandler&); +}; + +} // namespace google_breakpad + +#pragma warning(pop) + +#endif // CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ diff --git a/src/client/windows/sender/crash_report_sender.cc b/src/client/windows/sender/crash_report_sender.cc new file mode 100644 index 0000000..6ce0026 --- /dev/null +++ b/src/client/windows/sender/crash_report_sender.cc @@ -0,0 +1,145 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Disable exception handler warnings. +#pragma warning( disable : 4530 ) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "client/windows/sender/crash_report_sender.h" +#include "common/windows/http_upload.h" + +#if _MSC_VER < 1400 // MSVC 2005/8 +// Older MSVC doesn't have fscanf_s, but they are compatible as long as +// we don't use the string conversions (%s/%c/%S/%C). +#define fscanf_s fscanf +#endif + +namespace google_breakpad { + +static const char kCheckpointSignature[] = "GBP1\n"; + +CrashReportSender::CrashReportSender(const wstring& checkpoint_file) + : checkpoint_file_(checkpoint_file), + max_reports_per_day_(-1), + last_sent_date_(-1), + reports_sent_(0) { + FILE* fd; + if (OpenCheckpointFile(L"r", &fd) == 0) { + ReadCheckpoint(fd); + fclose(fd); + } +} + +ReportResult CrashReportSender::SendCrashReport( + const wstring& url, const map& parameters, + const map& files, wstring* report_code) { + int today = GetCurrentDate(); + if (today == last_sent_date_ && + max_reports_per_day_ != -1 && + reports_sent_ >= max_reports_per_day_) { + return RESULT_THROTTLED; + } + + int http_response = 0; + bool result = HTTPUpload::SendMultipartPostRequest( + url, parameters, files, NULL, report_code, + &http_response); + + if (result) { + ReportSent(today); + return RESULT_SUCCEEDED; + } else if (http_response >= 400 && http_response < 500) { + return RESULT_REJECTED; + } else { + return RESULT_FAILED; + } +} + +void CrashReportSender::ReadCheckpoint(FILE* fd) { + char buf[128]; + if (!fgets(buf, sizeof(buf), fd) || + strcmp(buf, kCheckpointSignature) != 0) { + return; + } + + if (fscanf_s(fd, "%d\n", &last_sent_date_) != 1) { + last_sent_date_ = -1; + return; + } + if (fscanf_s(fd, "%d\n", &reports_sent_) != 1) { + reports_sent_ = 0; + return; + } +} + +void CrashReportSender::ReportSent(int today) { + // Update the report stats + if (today != last_sent_date_) { + last_sent_date_ = today; + reports_sent_ = 0; + } + ++reports_sent_; + + // Update the checkpoint file + FILE* fd; + if (OpenCheckpointFile(L"w", &fd) == 0) { + fputs(kCheckpointSignature, fd); + fprintf(fd, "%d\n", last_sent_date_); + fprintf(fd, "%d\n", reports_sent_); + fclose(fd); + } +} + +int CrashReportSender::GetCurrentDate() const { + SYSTEMTIME system_time; + GetSystemTime(&system_time); + return (system_time.wYear * 10000) + (system_time.wMonth * 100) + + system_time.wDay; +} + +int CrashReportSender::OpenCheckpointFile(const wchar_t* mode, FILE** fd) { + if (checkpoint_file_.empty()) { + return ENOENT; + } +#if _MSC_VER >= 1400 // MSVC 2005/8 + return _wfopen_s(fd, checkpoint_file_.c_str(), mode); +#else + *fd = _wfopen(checkpoint_file_.c_str(), mode); + if (*fd == NULL) { + return errno; + } + return 0; +#endif +} + +} // namespace google_breakpad diff --git a/src/client/windows/sender/crash_report_sender.h b/src/client/windows/sender/crash_report_sender.h new file mode 100644 index 0000000..758adbb --- /dev/null +++ b/src/client/windows/sender/crash_report_sender.h @@ -0,0 +1,124 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__ +#define CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__ + +// CrashReportSender is a "static" class which provides an API to upload +// crash reports via HTTP(S). A crash report is formatted as a multipart POST +// request, which contains a set of caller-supplied string key/value pairs, +// and a minidump file to upload. +// +// To use this library in your project, you will need to link against +// wininet.lib. + +#pragma warning( push ) +// Disable exception handler warnings. +#pragma warning( disable : 4530 ) + +#include +#include + +namespace google_breakpad { + +using std::wstring; +using std::map; + +typedef enum { + RESULT_FAILED = 0, // Failed to communicate with the server; try later. + RESULT_REJECTED, // Successfully sent the crash report, but the + // server rejected it; don't resend this report. + RESULT_SUCCEEDED, // The server accepted the crash report. + RESULT_THROTTLED // No attempt was made to send the crash report, because + // we exceeded the maximum reports per day. +} ReportResult; + +class CrashReportSender { + public: + // Initializes a CrashReportSender instance. + // If checkpoint_file is non-empty, breakpad will persist crash report + // state to this file. A checkpoint file is required for + // set_max_reports_per_day() to function properly. + explicit CrashReportSender(const wstring& checkpoint_file); + ~CrashReportSender() {} + + // Sets the maximum number of crash reports that will be sent in a 24-hour + // period. This uses the state persisted to the checkpoint file. + // The default value of -1 means that there is no limit on reports sent. + void set_max_reports_per_day(int reports) { + max_reports_per_day_ = reports; + } + + int max_reports_per_day() const { return max_reports_per_day_; } + + // Sends the specified files, along with the map of + // name value pairs, as a multipart POST request to the given URL. + // Parameter names must contain only printable ASCII characters, + // and may not contain a quote (") character. + // Only HTTP(S) URLs are currently supported. The return value indicates + // the result of the operation (see above for possible results). + // If report_code is non-NULL and the report is sent successfully (that is, + // the return value is RESULT_SUCCEEDED), a code uniquely identifying the + // report will be returned in report_code. + // (Otherwise, report_code will be unchanged.) + ReportResult SendCrashReport(const wstring& url, + const map& parameters, + const map& files, + wstring* report_code); + + private: + // Reads persistent state from a checkpoint file. + void ReadCheckpoint(FILE* fd); + + // Called when a new report has been sent, to update the checkpoint state. + void ReportSent(int today); + + // Returns today's date (UTC) formatted as YYYYMMDD. + int GetCurrentDate() const; + + // Opens the checkpoint file with the specified mode. + // Returns zero on success, or an error code on failure. + int OpenCheckpointFile(const wchar_t* mode, FILE** fd); + + wstring checkpoint_file_; + int max_reports_per_day_; + // The last date on which we sent a report, expressed as YYYYMMDD. + int last_sent_date_; + // Number of reports sent on last_sent_date_ + int reports_sent_; + + // Disallow copy constructor and operator= + explicit CrashReportSender(const CrashReportSender&); + void operator=(const CrashReportSender&); +}; + +} // namespace google_breakpad + +#pragma warning( pop ) + +#endif // CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__ diff --git a/src/client/windows/tests/crash_generation_app/abstract_class.cc b/src/client/windows/tests/crash_generation_app/abstract_class.cc new file mode 100644 index 0000000..737c817 --- /dev/null +++ b/src/client/windows/tests/crash_generation_app/abstract_class.cc @@ -0,0 +1,56 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/windows/tests/crash_generation_app/abstract_class.h" + +namespace google_breakpad { + +Base::Base(Derived* derived) + : derived_(derived) { +} + +Base::~Base() { + derived_->DoSomething(); +} + +#pragma warning(push) +#pragma warning(disable:4355) +// Disable warning C4355: 'this' : used in base member initializer list. +Derived::Derived() + : Base(this) { // C4355 +} +#pragma warning(pop) + +void Derived::DoSomething() { +} + +} // namespace google_breakpad diff --git a/src/client/windows/tests/crash_generation_app/abstract_class.h b/src/client/windows/tests/crash_generation_app/abstract_class.h new file mode 100644 index 0000000..c996a21 --- /dev/null +++ b/src/client/windows/tests/crash_generation_app/abstract_class.h @@ -0,0 +1,56 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_ABSTRACT_CLASS_H__ +#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_ABSTRACT_CLASS_H__ + +namespace google_breakpad { + +// Dummy classes to help generate a pure call violation. + +class Derived; + +class Base { + public: + Base(Derived* derived); + virtual ~Base(); + virtual void DoSomething() = 0; + + private: + Derived* derived_; +}; + +class Derived : public Base { + public: + Derived(); + virtual void DoSomething(); +}; + +} // namespace google_breakpad + +#endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ diff --git a/src/client/windows/tests/crash_generation_app/crash_generation_app.cc b/src/client/windows/tests/crash_generation_app/crash_generation_app.cc new file mode 100644 index 0000000..9ae4679 --- /dev/null +++ b/src/client/windows/tests/crash_generation_app/crash_generation_app.cc @@ -0,0 +1,525 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// crash_generation_app.cpp : Defines the entry point for the application. +// + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/windows/tests/crash_generation_app/crash_generation_app.h" + +#include +#include + +#include "client/windows/crash_generation/client_info.h" +#include "client/windows/crash_generation/crash_generation_server.h" +#include "client/windows/handler/exception_handler.h" +#include "client/windows/common/ipc_protocol.h" + +#include "client/windows/tests/crash_generation_app/abstract_class.h" + +namespace google_breakpad { + +const int kMaxLoadString = 100; +const wchar_t kPipeName[] = L"\\\\.\\pipe\\BreakpadCrashServices\\TestServer"; + +const DWORD kEditBoxStyles = WS_CHILD | + WS_VISIBLE | + WS_VSCROLL | + ES_LEFT | + ES_MULTILINE | + ES_AUTOVSCROLL | + ES_READONLY; + +// Maximum length of a line in the edit box. +const size_t kMaximumLineLength = 256; + +// CS to access edit control in a thread safe way. +static CRITICAL_SECTION* cs_edit = NULL; + +// Edit control. +static HWND client_status_edit_box; + +HINSTANCE current_instance; // Current instance. +TCHAR title[kMaxLoadString]; // Title bar text. +TCHAR window_class[kMaxLoadString]; // Main window class name. + +ATOM MyRegisterClass(HINSTANCE instance); +BOOL InitInstance(HINSTANCE, int); +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); +INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); + +static size_t kCustomInfoCount = 2; +static CustomInfoEntry kCustomInfoEntries[] = { + CustomInfoEntry(L"prod", L"CrashTestApp"), + CustomInfoEntry(L"ver", L"1.0"), +}; + +static ExceptionHandler* handler = NULL; +static CrashGenerationServer* crash_server = NULL; + +// Registers the window class. +// +// This function and its usage are only necessary if you want this code +// to be compatible with Win32 systems prior to the 'RegisterClassEx' +// function that was added to Windows 95. It is important to call this +// function so that the application will get 'well formed' small icons +// associated with it. +ATOM MyRegisterClass(HINSTANCE instance) { + WNDCLASSEX wcex; + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = instance; + wcex.hIcon = LoadIcon(instance, + MAKEINTRESOURCE(IDI_CRASHGENERATIONAPP)); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP); + wcex.lpszClassName = window_class; + wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); + + return RegisterClassEx(&wcex); +} + +// Saves instance handle and creates main window +// +// In this function, we save the instance handle in a global variable and +// create and display the main program window. +BOOL InitInstance(HINSTANCE instance, int command_show) { + current_instance = instance; + HWND wnd = CreateWindow(window_class, + title, + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + 0, + CW_USEDEFAULT, + 0, + NULL, + NULL, + instance, + NULL); + + if (!wnd) { + return FALSE; + } + + ShowWindow(wnd, command_show); + UpdateWindow(wnd); + + return TRUE; +} + +static void AppendTextToEditBox(TCHAR* text) { + EnterCriticalSection(cs_edit); + SYSTEMTIME current_time; + GetLocalTime(¤t_time); + TCHAR line[kMaximumLineLength]; + int result = swprintf_s(line, + kMaximumLineLength, + L"[%.2d-%.2d-%.4d %.2d:%.2d:%.2d] %s", + current_time.wMonth, + current_time.wDay, + current_time.wYear, + current_time.wHour, + current_time.wMinute, + current_time.wSecond, + text); + + if (result == -1) { + return; + } + + int length = GetWindowTextLength(client_status_edit_box); + SendMessage(client_status_edit_box, + EM_SETSEL, + (WPARAM)length, + (LPARAM)length); + SendMessage(client_status_edit_box, + EM_REPLACESEL, + (WPARAM)FALSE, + (LPARAM)line); + LeaveCriticalSection(cs_edit); +} + +static DWORD WINAPI AppendTextWorker(void* context) { + TCHAR* text = reinterpret_cast(context); + + AppendTextToEditBox(text); + delete[] text; + + return 0; +} + +bool ShowDumpResults(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded) { + TCHAR* text = new TCHAR[kMaximumLineLength]; + text[0] = _T('\0'); + int result = swprintf_s(text, + kMaximumLineLength, + TEXT("Dump generation request %s\r\n"), + succeeded ? TEXT("succeeded") : TEXT("failed")); + if (result == -1) { + delete [] text; + } + + QueueUserWorkItem(AppendTextWorker, text, WT_EXECUTEDEFAULT); + return succeeded; +} + +static void ShowClientConnected(void* context, + const ClientInfo* client_info) { + TCHAR* line = new TCHAR[kMaximumLineLength]; + line[0] = _T('\0'); + int result = swprintf_s(line, + kMaximumLineLength, + L"Client connected:\t\t%d\r\n", + client_info->pid()); + + if (result == -1) { + delete[] line; + return; + } + + QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); +} + +static void ShowClientCrashed(void* context, + const ClientInfo* client_info, + const wstring* dump_path) { + TCHAR* line = new TCHAR[kMaximumLineLength]; + line[0] = _T('\0'); + int result = swprintf_s(line, + kMaximumLineLength, + TEXT("Client requested dump:\t%d\r\n"), + client_info->pid()); + + if (result == -1) { + delete[] line; + return; + } + + QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); + + CustomClientInfo custom_info = client_info->GetCustomInfo(); + if (custom_info.count <= 0) { + return; + } + + wstring str_line; + for (size_t i = 0; i < custom_info.count; ++i) { + if (i > 0) { + str_line += L", "; + } + str_line += custom_info.entries[i].name; + str_line += L": "; + str_line += custom_info.entries[i].value; + } + + line = new TCHAR[kMaximumLineLength]; + line[0] = _T('\0'); + result = swprintf_s(line, + kMaximumLineLength, + L"%s\n", + str_line.c_str()); + if (result == -1) { + delete[] line; + return; + } + QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); +} + +static void ShowClientExited(void* context, + const ClientInfo* client_info) { + TCHAR* line = new TCHAR[kMaximumLineLength]; + line[0] = _T('\0'); + int result = swprintf_s(line, + kMaximumLineLength, + TEXT("Client exited:\t\t%d\r\n"), + client_info->pid()); + + if (result == -1) { + delete[] line; + return; + } + + QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); +} + +void CrashServerStart() { + // Do not create another instance of the server. + if (crash_server) { + return; + } + + std::wstring dump_path = L"C:\\Dumps\\"; + + if (_wmkdir(dump_path.c_str()) && (errno != EEXIST)) { + MessageBoxW(NULL, L"Unable to create dump directory", L"Dumper", MB_OK); + return; + } + + crash_server = new CrashGenerationServer(kPipeName, + NULL, + ShowClientConnected, + NULL, + ShowClientCrashed, + NULL, + ShowClientExited, + NULL, + NULL, + NULL, + true, + &dump_path); + + if (!crash_server->Start()) { + MessageBoxW(NULL, L"Unable to start server", L"Dumper", MB_OK); + delete crash_server; + crash_server = NULL; + } +} + +void CrashServerStop() { + delete crash_server; + crash_server = NULL; +} + +void DerefZeroCrash() { + int* x = 0; + *x = 1; +} + +void InvalidParamCrash() { + printf(NULL); +} + +void PureCallCrash() { + Derived derived; +} + +void RequestDump() { + if (!handler->WriteMinidump()) { + MessageBoxW(NULL, L"Dump request failed", L"Dumper", MB_OK); + } + kCustomInfoEntries[1].set_value(L"1.1"); +} + +void CleanUp() { + if (cs_edit) { + DeleteCriticalSection(cs_edit); + delete cs_edit; + } + + if (handler) { + delete handler; + } + + if (crash_server) { + delete crash_server; + } +} + +// Processes messages for the main window. +// +// WM_COMMAND - process the application menu. +// WM_PAINT - Paint the main window. +// WM_DESTROY - post a quit message and return. +LRESULT CALLBACK WndProc(HWND wnd, + UINT message, + WPARAM w_param, + LPARAM l_param) { + int message_id; + int message_event; + PAINTSTRUCT ps; + HDC hdc; + + HINSTANCE instance = (HINSTANCE)GetWindowLongPtr(wnd, GWLP_HINSTANCE); + + switch (message) { + case WM_COMMAND: + // Parse the menu selections. + message_id = LOWORD(w_param); + message_event = HIWORD(w_param); + switch (message_id) { + case IDM_ABOUT: + DialogBox(current_instance, + MAKEINTRESOURCE(IDD_ABOUTBOX), + wnd, + About); + break; + case IDM_EXIT: + DestroyWindow(wnd); + break; + case ID_SERVER_START: + CrashServerStart(); + break; + case ID_SERVER_STOP: + CrashServerStop(); + break; + case ID_CLIENT_DEREFZERO: + DerefZeroCrash(); + break; + case ID_CLIENT_INVALIDPARAM: + InvalidParamCrash(); + break; + case ID_CLIENT_PURECALL: + PureCallCrash(); + break; + case ID_CLIENT_REQUESTEXPLICITDUMP: + RequestDump(); + break; + default: + return DefWindowProc(wnd, message, w_param, l_param); + } + break; + case WM_CREATE: + client_status_edit_box = CreateWindow(TEXT("EDIT"), + NULL, + kEditBoxStyles, + 0, + 0, + 0, + 0, + wnd, + NULL, + instance, + NULL); + break; + case WM_SIZE: + // Make the edit control the size of the window's client area. + MoveWindow(client_status_edit_box, + 0, + 0, + LOWORD(l_param), // width of client area. + HIWORD(l_param), // height of client area. + TRUE); // repaint window. + break; + case WM_SETFOCUS: + SetFocus(client_status_edit_box); + break; + case WM_PAINT: + hdc = BeginPaint(wnd, &ps); + EndPaint(wnd, &ps); + break; + case WM_DESTROY: + CleanUp(); + PostQuitMessage(0); + break; + default: + return DefWindowProc(wnd, message, w_param, l_param); + } + + return 0; +} + +// Message handler for about box. +INT_PTR CALLBACK About(HWND dlg, + UINT message, + WPARAM w_param, + LPARAM l_param) { + UNREFERENCED_PARAMETER(l_param); + switch (message) { + case WM_INITDIALOG: + return (INT_PTR)TRUE; + + case WM_COMMAND: + if (LOWORD(w_param) == IDOK || LOWORD(w_param) == IDCANCEL) { + EndDialog(dlg, LOWORD(w_param)); + return (INT_PTR)TRUE; + } + break; + } + + return (INT_PTR)FALSE; +} + +} // namespace google_breakpad + +int APIENTRY _tWinMain(HINSTANCE instance, + HINSTANCE previous_instance, + LPTSTR command_line, + int command_show) { + using namespace google_breakpad; + + UNREFERENCED_PARAMETER(previous_instance); + UNREFERENCED_PARAMETER(command_line); + + cs_edit = new CRITICAL_SECTION(); + InitializeCriticalSection(cs_edit); + + CustomClientInfo custom_info = {kCustomInfoEntries, kCustomInfoCount}; + + CrashServerStart(); + // This is needed for CRT to not show dialog for invalid param + // failures and instead let the code handle it. + _CrtSetReportMode(_CRT_ASSERT, 0); + handler = new ExceptionHandler(L"C:\\dumps\\", + NULL, + google_breakpad::ShowDumpResults, + NULL, + ExceptionHandler::HANDLER_ALL, + MiniDumpNormal, + kPipeName, + &custom_info); + + // Initialize global strings. + LoadString(instance, IDS_APP_TITLE, title, kMaxLoadString); + LoadString(instance, + IDC_CRASHGENERATIONAPP, + window_class, + kMaxLoadString); + MyRegisterClass(instance); + + // Perform application initialization. + if (!InitInstance(instance, command_show)) { + return FALSE; + } + + HACCEL accel_table = LoadAccelerators( + instance, + MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP)); + + // Main message loop. + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) { + if (!TranslateAccelerator(msg.hwnd, accel_table, &msg)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return static_cast(msg.wParam); +} diff --git a/src/client/windows/tests/crash_generation_app/crash_generation_app.h b/src/client/windows/tests/crash_generation_app/crash_generation_app.h new file mode 100644 index 0000000..1d1deea --- /dev/null +++ b/src/client/windows/tests/crash_generation_app/crash_generation_app.h @@ -0,0 +1,34 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ +#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ + +#include "resource.h" + +#endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ diff --git a/src/client/windows/tests/crash_generation_app/crash_generation_app.ico b/src/client/windows/tests/crash_generation_app/crash_generation_app.ico new file mode 100644 index 0000000000000000000000000000000000000000..d551aa3aaf80adf9b7760e2eb8de95a5c3e53df6 GIT binary patch literal 23558 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 // Must come first +#endif + +#include "breakpad_googletest_includes.h" +#include "client/windows/crash_generation/crash_generation_server.h" +#include "client/windows/common/ipc_protocol.h" + +using testing::_; + +namespace { + +const wchar_t kPipeName[] = + L"\\\\.\\pipe\\CrashGenerationServerTest\\TestCaseServer"; + +const DWORD kPipeDesiredAccess = FILE_READ_DATA | + FILE_WRITE_DATA | + FILE_WRITE_ATTRIBUTES; + +const DWORD kPipeFlagsAndAttributes = SECURITY_IDENTIFICATION | + SECURITY_SQOS_PRESENT; + +const DWORD kPipeMode = PIPE_READMODE_MESSAGE; + +#define arraysize(f) (sizeof(f) / sizeof(*f)) +const google_breakpad::CustomInfoEntry kCustomInfoEntries[] = { + google_breakpad::CustomInfoEntry(L"prod", L"CrashGenerationServerTest"), + google_breakpad::CustomInfoEntry(L"ver", L"1.0"), +}; + +class CrashGenerationServerTest : public ::testing::Test { + public: + CrashGenerationServerTest() + : crash_generation_server_(kPipeName, + NULL, + CallOnClientConnected, &mock_callbacks_, + CallOnClientDumpRequested, &mock_callbacks_, + CallOnClientExited, &mock_callbacks_, + CallOnClientUploadRequested, &mock_callbacks_, + false, + NULL), + thread_id_(0), + exception_pointers_(NULL) { + memset(&assert_info_, 0, sizeof(assert_info_)); + } + + protected: + class MockCrashGenerationServerCallbacks { + public: + MOCK_METHOD1(OnClientConnected, + void(const google_breakpad::ClientInfo* client_info)); + MOCK_METHOD2(OnClientDumpRequested, + void(const google_breakpad::ClientInfo* client_info, + const std::wstring* file_path)); + MOCK_METHOD1(OnClientExited, + void(const google_breakpad::ClientInfo* client_info)); + MOCK_METHOD1(OnClientUploadRequested, + void(const DWORD crash_id)); + }; + + enum ClientFault { + NO_FAULT, + CLOSE_AFTER_CONNECT, + SEND_INVALID_REGISTRATION, + TRUNCATE_REGISTRATION, + CLOSE_AFTER_REGISTRATION, + RESPONSE_BUFFER_TOO_SMALL, + CLOSE_AFTER_RESPONSE, + SEND_INVALID_ACK + }; + + void SetUp() { + ASSERT_TRUE(crash_generation_server_.Start()); + } + + void FaultyClient(ClientFault fault_type) { + HANDLE pipe = CreateFile(kPipeName, + kPipeDesiredAccess, + 0, + NULL, + OPEN_EXISTING, + kPipeFlagsAndAttributes, + NULL); + + if (pipe == INVALID_HANDLE_VALUE) { + ASSERT_EQ(ERROR_PIPE_BUSY, GetLastError()); + + // Cannot continue retrying if wait on pipe fails. + ASSERT_TRUE(WaitNamedPipe(kPipeName, 500)); + + pipe = CreateFile(kPipeName, + kPipeDesiredAccess, + 0, + NULL, + OPEN_EXISTING, + kPipeFlagsAndAttributes, + NULL); + } + + ASSERT_NE(pipe, INVALID_HANDLE_VALUE); + + DWORD mode = kPipeMode; + ASSERT_TRUE(SetNamedPipeHandleState(pipe, &mode, NULL, NULL)); + + DoFaultyClient(fault_type, pipe); + + CloseHandle(pipe); + } + + void DoTestFault(ClientFault fault) { + EXPECT_CALL(mock_callbacks_, OnClientConnected(_)).Times(0); + ASSERT_NO_FATAL_FAILURE(FaultyClient(fault)); + ASSERT_NO_FATAL_FAILURE(FaultyClient(fault)); + ASSERT_NO_FATAL_FAILURE(FaultyClient(fault)); + + EXPECT_CALL(mock_callbacks_, OnClientConnected(_)); + + ASSERT_NO_FATAL_FAILURE(FaultyClient(NO_FAULT)); + + // Slight hack. The OnClientConnected is only invoked after the ack is + // received by the server. At that point, the FaultyClient call has already + // returned. The best way to wait until the server is done handling that is + // to send one more ping, whose processing will be blocked by delivery of + // the OnClientConnected message. + ASSERT_NO_FATAL_FAILURE(FaultyClient(CLOSE_AFTER_CONNECT)); + } + + MockCrashGenerationServerCallbacks mock_callbacks_; + + private: + // Depends on the caller to successfully open the pipe before invocation and + // to close it immediately afterwards. + void DoFaultyClient(ClientFault fault_type, HANDLE pipe) { + if (fault_type == CLOSE_AFTER_CONNECT) { + return; + } + + google_breakpad::CustomClientInfo custom_info = {kCustomInfoEntries, + arraysize(kCustomInfoEntries)}; + + google_breakpad::ProtocolMessage msg( + fault_type == SEND_INVALID_REGISTRATION ? + google_breakpad::MESSAGE_TAG_NONE : + google_breakpad::MESSAGE_TAG_REGISTRATION_REQUEST, + GetCurrentProcessId(), + MiniDumpNormal, + &thread_id_, + &exception_pointers_, + &assert_info_, + custom_info, + NULL, + NULL, + NULL); + + DWORD bytes_count = 0; + + ASSERT_TRUE(WriteFile(pipe, + &msg, + fault_type == TRUNCATE_REGISTRATION ? + sizeof(msg) / 2 : sizeof(msg), + &bytes_count, + NULL)); + + if (fault_type == CLOSE_AFTER_REGISTRATION) { + return; + } + + google_breakpad::ProtocolMessage reply; + + if (!ReadFile(pipe, + &reply, + fault_type == RESPONSE_BUFFER_TOO_SMALL ? + sizeof(google_breakpad::ProtocolMessage) / 2 : + sizeof(google_breakpad::ProtocolMessage), + &bytes_count, + NULL)) { + switch (fault_type) { + case TRUNCATE_REGISTRATION: + case RESPONSE_BUFFER_TOO_SMALL: + case SEND_INVALID_REGISTRATION: + return; + + default: + FAIL() << "Unexpectedly failed to register."; + } + } + + if (fault_type == CLOSE_AFTER_RESPONSE) { + return; + } + + google_breakpad::ProtocolMessage ack_msg; + ack_msg.tag = google_breakpad::MESSAGE_TAG_REGISTRATION_ACK; + + ASSERT_TRUE(WriteFile(pipe, + &ack_msg, + SEND_INVALID_ACK ? + sizeof(ack_msg) : sizeof(ack_msg) / 2, + &bytes_count, + NULL)); + + return; + } + + static void CallOnClientConnected( + void* context, const google_breakpad::ClientInfo* client_info) { + static_cast(context)-> + OnClientConnected(client_info); + } + + static void CallOnClientDumpRequested( + void* context, + const google_breakpad::ClientInfo* client_info, + const std::wstring* file_path) { + static_cast(context)-> + OnClientDumpRequested(client_info, file_path); + } + + static void CallOnClientExited( + void* context, const google_breakpad::ClientInfo* client_info) { + static_cast(context)-> + OnClientExited(client_info); + } + + static void CallOnClientUploadRequested(void* context, const DWORD crash_id) { + static_cast(context)-> + OnClientUploadRequested(crash_id); + } + + DWORD thread_id_; + EXCEPTION_POINTERS* exception_pointers_; + MDRawAssertionInfo assert_info_; + + google_breakpad::CrashGenerationServer crash_generation_server_; +}; + +TEST_F(CrashGenerationServerTest, PingServerTest) { + DoTestFault(CLOSE_AFTER_CONNECT); +} + +TEST_F(CrashGenerationServerTest, InvalidRegistration) { + DoTestFault(SEND_INVALID_REGISTRATION); +} + +TEST_F(CrashGenerationServerTest, TruncateRegistration) { + DoTestFault(TRUNCATE_REGISTRATION); +} + +TEST_F(CrashGenerationServerTest, CloseAfterRegistration) { + DoTestFault(CLOSE_AFTER_REGISTRATION); +} + +TEST_F(CrashGenerationServerTest, ResponseBufferTooSmall) { + DoTestFault(RESPONSE_BUFFER_TOO_SMALL); +} + +TEST_F(CrashGenerationServerTest, CloseAfterResponse) { + DoTestFault(CLOSE_AFTER_RESPONSE); +} + +// It turns out that, as long as you send one byte, the ACK is accepted and +// registration succeeds. +TEST_F(CrashGenerationServerTest, SendInvalidAck) { + EXPECT_CALL(mock_callbacks_, OnClientConnected(_)); + ASSERT_NO_FATAL_FAILURE(FaultyClient(SEND_INVALID_ACK)); + + // See DoTestFault for an explanation of this line + ASSERT_NO_FATAL_FAILURE(FaultyClient(CLOSE_AFTER_CONNECT)); + + EXPECT_CALL(mock_callbacks_, OnClientConnected(_)); + ASSERT_NO_FATAL_FAILURE(FaultyClient(NO_FAULT)); + + // See DoTestFault for an explanation of this line + ASSERT_NO_FATAL_FAILURE(FaultyClient(CLOSE_AFTER_CONNECT)); +} + +} // anonymous namespace diff --git a/src/client/windows/unittests/dump_analysis.cc b/src/client/windows/unittests/dump_analysis.cc new file mode 100644 index 0000000..c403d85 --- /dev/null +++ b/src/client/windows/unittests/dump_analysis.cc @@ -0,0 +1,187 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "client/windows/unittests/dump_analysis.h" // NOLINT + +DumpAnalysis::~DumpAnalysis() { + if (dump_file_view_ != NULL) { + EXPECT_TRUE(::UnmapViewOfFile(dump_file_view_)); + ::CloseHandle(dump_file_mapping_); + dump_file_mapping_ = NULL; + } + + if (dump_file_handle_ != NULL) { + ::CloseHandle(dump_file_handle_); + dump_file_handle_ = NULL; + } +} + +void DumpAnalysis::EnsureDumpMapped() { + if (dump_file_view_ == NULL) { + dump_file_handle_ = ::CreateFile(dump_file_.c_str(), + GENERIC_READ, + 0, + NULL, + OPEN_EXISTING, + 0, + NULL); + ASSERT_TRUE(dump_file_handle_ != NULL); + ASSERT_TRUE(dump_file_mapping_ == NULL); + + dump_file_mapping_ = ::CreateFileMapping(dump_file_handle_, + NULL, + PAGE_READONLY, + 0, + 0, + NULL); + ASSERT_TRUE(dump_file_mapping_ != NULL); + + dump_file_view_ = ::MapViewOfFile(dump_file_mapping_, + FILE_MAP_READ, + 0, + 0, + 0); + ASSERT_TRUE(dump_file_view_ != NULL); + } +} + +bool DumpAnalysis::HasTebs() const { + MINIDUMP_THREAD_LIST* thread_list = NULL; + size_t thread_list_size = GetStream(ThreadListStream, &thread_list); + + if (thread_list_size > 0 && thread_list != NULL) { + for (ULONG i = 0; i < thread_list->NumberOfThreads; ++i) { + if (!HasMemory(thread_list->Threads[i].Teb)) + return false; + } + + return true; + } + + // No thread list, no TEB info. + return false; +} + +bool DumpAnalysis::HasPeb() const { + MINIDUMP_THREAD_LIST* thread_list = NULL; + size_t thread_list_size = GetStream(ThreadListStream, &thread_list); + + if (thread_list_size > 0 && thread_list != NULL && + thread_list->NumberOfThreads > 0) { + FakeTEB* teb = NULL; + if (!HasMemory(thread_list->Threads[0].Teb, &teb)) + return false; + + return HasMemory(teb->peb); + } + + return false; +} + +bool DumpAnalysis::HasStream(ULONG stream_number) const { + void* stream = NULL; + size_t stream_size = GetStreamImpl(stream_number, &stream); + return stream_size > 0 && stream != NULL; +} + +size_t DumpAnalysis::GetStreamImpl(ULONG stream_number, void** stream) const { + MINIDUMP_DIRECTORY* directory = NULL; + ULONG memory_list_size = 0; + BOOL ret = ::MiniDumpReadDumpStream(dump_file_view_, + stream_number, + &directory, + stream, + &memory_list_size); + + return ret ? memory_list_size : 0; +} + +bool DumpAnalysis::HasMemoryImpl(const void* addr_in, size_t structuresize, + void** structure) const { + uintptr_t address = reinterpret_cast(addr_in); + MINIDUMP_MEMORY_LIST* memory_list = NULL; + size_t memory_list_size = GetStream(MemoryListStream, &memory_list); + if (memory_list_size > 0 && memory_list != NULL) { + for (ULONG i = 0; i < memory_list->NumberOfMemoryRanges; ++i) { + MINIDUMP_MEMORY_DESCRIPTOR& descr = memory_list->MemoryRanges[i]; + const uintptr_t range_start = + static_cast(descr.StartOfMemoryRange); + uintptr_t range_end = range_start + descr.Memory.DataSize; + + if (address >= range_start && + address + structuresize < range_end) { + // The start address falls in the range, and the end address is + // in bounds, return a pointer to the structure if requested. + if (structure != NULL) + *structure = RVA_TO_ADDR(dump_file_view_, descr.Memory.Rva); + + return true; + } + } + } + + // We didn't find the range in a MINIDUMP_MEMORY_LIST, so maybe this + // is a full dump using MINIDUMP_MEMORY64_LIST with all the memory at the + // end of the dump file. + MINIDUMP_MEMORY64_LIST* memory64_list = NULL; + memory_list_size = GetStream(Memory64ListStream, &memory64_list); + if (memory_list_size > 0 && memory64_list != NULL) { + // Keep track of where the current descriptor maps to. + RVA64 curr_rva = memory64_list->BaseRva; + for (ULONG i = 0; i < memory64_list->NumberOfMemoryRanges; ++i) { + MINIDUMP_MEMORY_DESCRIPTOR64& descr = memory64_list->MemoryRanges[i]; + uintptr_t range_start = + static_cast(descr.StartOfMemoryRange); + uintptr_t range_end = range_start + static_cast(descr.DataSize); + + if (address >= range_start && + address + structuresize < range_end) { + // The start address falls in the range, and the end address is + // in bounds, return a pointer to the structure if requested. + if (structure != NULL) + *structure = RVA_TO_ADDR(dump_file_view_, curr_rva); + + return true; + } + + // Advance the current RVA. + curr_rva += descr.DataSize; + } + } + + return false; +} diff --git a/src/client/windows/unittests/dump_analysis.h b/src/client/windows/unittests/dump_analysis.h new file mode 100644 index 0000000..f8acc26 --- /dev/null +++ b/src/client/windows/unittests/dump_analysis.h @@ -0,0 +1,101 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_UNITTESTS_DUMP_ANALYSIS_H_ +#define CLIENT_WINDOWS_UNITTESTS_DUMP_ANALYSIS_H_ + +#include "client/windows/crash_generation/minidump_generator.h" + +// Convenience to get to the PEB pointer in a TEB. +struct FakeTEB { + char dummy[0x30]; + void* peb; +}; + +class DumpAnalysis { + public: + explicit DumpAnalysis(const std::wstring& file_path) + : dump_file_(file_path), dump_file_view_(NULL), dump_file_mapping_(NULL), + dump_file_handle_(NULL) { + EnsureDumpMapped(); + } + ~DumpAnalysis(); + + bool HasStream(ULONG stream_number) const; + + // This is template to keep type safety in the front, but we end up casting + // to void** inside the implementation to pass the pointer to Win32. So + // casting here is considered safe. + template + size_t GetStream(ULONG stream_number, StreamType** stream) const { + return GetStreamImpl(stream_number, reinterpret_cast(stream)); + } + + bool HasTebs() const; + bool HasPeb() const; + bool HasMemory(ULONG64 address) const { + return HasMemory(address, NULL); + } + + bool HasMemory(const void* address) const { + return HasMemory(address, NULL); + } + + template + bool HasMemory(ULONG64 address, StructureType** structure = NULL) const { + // We can't cope with 64 bit addresses for now. + if (address > 0xFFFFFFFFUL) + return false; + + return HasMemory(reinterpret_cast(address), structure); + } + + template + bool HasMemory(const void* addr_in, StructureType** structure = NULL) const { + return HasMemoryImpl(addr_in, sizeof(StructureType), + reinterpret_cast(structure)); + } + + protected: + void EnsureDumpMapped(); + + HANDLE dump_file_mapping_; + HANDLE dump_file_handle_; + void* dump_file_view_; + std::wstring dump_file_; + + private: + // This is the implementation of GetStream<>. + size_t GetStreamImpl(ULONG stream_number, void** stream) const; + + // This is the implementation of HasMemory<>. + bool HasMemoryImpl(const void* addr_in, size_t pointersize, + void** structure) const; +}; + +#endif // CLIENT_WINDOWS_UNITTESTS_DUMP_ANALYSIS_H_ diff --git a/src/client/windows/unittests/exception_handler_death_test.cc b/src/client/windows/unittests/exception_handler_death_test.cc new file mode 100644 index 0000000..50d3fda --- /dev/null +++ b/src/client/windows/unittests/exception_handler_death_test.cc @@ -0,0 +1,590 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "client/windows/crash_generation/crash_generation_server.h" +#include "client/windows/handler/exception_handler.h" +#include "client/windows/unittests/exception_handler_test.h" +#include "common/windows/string_utils-inl.h" +#include "google_breakpad/processor/minidump.h" + +namespace { + +using std::wstring; +using namespace google_breakpad; + +const wchar_t kPipeName[] = L"\\\\.\\pipe\\BreakpadCrashTest\\TestCaseServer"; +const char kSuccessIndicator[] = "success"; +const char kFailureIndicator[] = "failure"; + +// Utility function to test for a path's existence. +BOOL DoesPathExist(const TCHAR* path_name); + +enum OutOfProcGuarantee { + OUT_OF_PROC_GUARANTEED, + OUT_OF_PROC_BEST_EFFORT, +}; + +class ExceptionHandlerDeathTest : public ::testing::Test { + protected: + // Member variable for each test that they can use + // for temporary storage. + TCHAR temp_path_[MAX_PATH]; + // Actually constructs a temp path name. + virtual void SetUp(); + // A helper method that tests can use to crash. + void DoCrashAccessViolation(const OutOfProcGuarantee out_of_proc_guarantee); + void DoCrashPureVirtualCall(); +}; + +void ExceptionHandlerDeathTest::SetUp() { + const ::testing::TestInfo* const test_info = + ::testing::UnitTest::GetInstance()->current_test_info(); + TCHAR temp_path[MAX_PATH] = { '\0' }; + TCHAR test_name_wide[MAX_PATH] = { '\0' }; + // We want the temporary directory to be what the OS returns + // to us, + the test case name. + GetTempPath(MAX_PATH, temp_path); + // The test case name is exposed as a c-style string, + // convert it to a wchar_t string. + int dwRet = MultiByteToWideChar(CP_ACP, 0, test_info->name(), + static_cast(strlen(test_info->name())), + test_name_wide, + MAX_PATH); + if (!dwRet) { + assert(false); + } + StringCchPrintfW(temp_path_, MAX_PATH, L"%s%s", temp_path, test_name_wide); + CreateDirectory(temp_path_, NULL); +} + +BOOL DoesPathExist(const TCHAR* path_name) { + DWORD flags = GetFileAttributes(path_name); + if (flags == INVALID_FILE_ATTRIBUTES) { + return FALSE; + } + return TRUE; +} + +bool MinidumpWrittenCallback(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded) { + if (succeeded && DoesPathExist(dump_path)) { + fprintf(stderr, kSuccessIndicator); + } else { + fprintf(stderr, kFailureIndicator); + } + // If we don't flush, the output doesn't get sent before + // this process dies. + fflush(stderr); + return succeeded; +} + +TEST_F(ExceptionHandlerDeathTest, InProcTest) { + // For the in-proc test, we just need to instantiate an exception + // handler in in-proc mode, and crash. Since the entire test is + // reexecuted in the child process, we don't have to worry about + // the semantics of the exception handler being inherited/not + // inherited across CreateProcess(). + ASSERT_TRUE(DoesPathExist(temp_path_)); + scoped_ptr exc( + new google_breakpad::ExceptionHandler( + temp_path_, + NULL, + &MinidumpWrittenCallback, + NULL, + google_breakpad::ExceptionHandler::HANDLER_ALL)); + + // Disable GTest SEH handler + testing::DisableExceptionHandlerInScope disable_exception_handler; + + int* i = NULL; + ASSERT_DEATH((*i)++, kSuccessIndicator); +} + +static bool gDumpCallbackCalled = false; + +void clientDumpCallback(void* dump_context, + const google_breakpad::ClientInfo* client_info, + const std::wstring* dump_path) { + gDumpCallbackCalled = true; +} + +void ExceptionHandlerDeathTest::DoCrashAccessViolation( + const OutOfProcGuarantee out_of_proc_guarantee) { + scoped_ptr exc; + + if (out_of_proc_guarantee == OUT_OF_PROC_GUARANTEED) { + google_breakpad::CrashGenerationClient* client = + new google_breakpad::CrashGenerationClient(kPipeName, + MiniDumpNormal, + NULL); // custom_info + ASSERT_TRUE(client->Register()); + exc.reset(new google_breakpad::ExceptionHandler( + temp_path_, + NULL, // filter + NULL, // callback + NULL, // callback_context + google_breakpad::ExceptionHandler::HANDLER_ALL, + client)); + } else { + ASSERT_TRUE(out_of_proc_guarantee == OUT_OF_PROC_BEST_EFFORT); + exc.reset(new google_breakpad::ExceptionHandler( + temp_path_, + NULL, // filter + NULL, // callback + NULL, // callback_context + google_breakpad::ExceptionHandler::HANDLER_ALL, + MiniDumpNormal, + kPipeName, + NULL)); // custom_info + } + + // Disable GTest SEH handler + testing::DisableExceptionHandlerInScope disable_exception_handler; + + // Although this is executing in the child process of the death test, + // if it's not true we'll still get an error rather than the crash + // being expected. + ASSERT_TRUE(exc->IsOutOfProcess()); + int* i = NULL; + printf("%d\n", (*i)++); +} + +TEST_F(ExceptionHandlerDeathTest, OutOfProcTest) { + // We can take advantage of a detail of google test here to save some + // complexity in testing: when you do a death test, it actually forks. + // So we can make the main test harness the crash generation server, + // and call ASSERT_DEATH on a NULL dereference, it to expecting test + // the out of process scenario, since it's happening in a different + // process! This is different from the above because, above, we pass + // a NULL pipe name, and we also don't start a crash generation server. + + ASSERT_TRUE(DoesPathExist(temp_path_)); + std::wstring dump_path(temp_path_); + google_breakpad::CrashGenerationServer server( + kPipeName, NULL, NULL, NULL, &clientDumpCallback, NULL, NULL, NULL, NULL, + NULL, true, &dump_path); + + // This HAS to be EXPECT_, because when this test case is executed in the + // child process, the server registration will fail due to the named pipe + // being the same. + EXPECT_TRUE(server.Start()); + gDumpCallbackCalled = false; + ASSERT_DEATH(this->DoCrashAccessViolation(OUT_OF_PROC_BEST_EFFORT), ""); + EXPECT_TRUE(gDumpCallbackCalled); +} + +TEST_F(ExceptionHandlerDeathTest, OutOfProcGuaranteedTest) { + // This is similar to the previous test (OutOfProcTest). The only difference + // is that in this test, the crash generation client is created and registered + // with the crash generation server outside of the ExceptionHandler + // constructor which allows breakpad users to opt out of the default + // in-process dump generation when the registration with the crash generation + // server fails. + + ASSERT_TRUE(DoesPathExist(temp_path_)); + std::wstring dump_path(temp_path_); + google_breakpad::CrashGenerationServer server( + kPipeName, NULL, NULL, NULL, &clientDumpCallback, NULL, NULL, NULL, NULL, + NULL, true, &dump_path); + + // This HAS to be EXPECT_, because when this test case is executed in the + // child process, the server registration will fail due to the named pipe + // being the same. + EXPECT_TRUE(server.Start()); + gDumpCallbackCalled = false; + ASSERT_DEATH(this->DoCrashAccessViolation(OUT_OF_PROC_GUARANTEED), ""); + EXPECT_TRUE(gDumpCallbackCalled); +} + +TEST_F(ExceptionHandlerDeathTest, InvalidParameterTest) { + using google_breakpad::ExceptionHandler; + + ASSERT_TRUE(DoesPathExist(temp_path_)); + ExceptionHandler handler(temp_path_, NULL, NULL, NULL, + ExceptionHandler::HANDLER_INVALID_PARAMETER); + + // Disable the message box for assertions + _CrtSetReportMode(_CRT_ASSERT, 0); + + // Call with a bad argument. The invalid parameter will be swallowed + // and a dump will be generated, the process will exit(0). + ASSERT_EXIT(printf(NULL), ::testing::ExitedWithCode(0), ""); +} + + +struct PureVirtualCallBase { + PureVirtualCallBase() { + // We have to reinterpret so the linker doesn't get confused because the + // method isn't defined. + reinterpret_cast(this)->PureFunction(); + } + virtual ~PureVirtualCallBase() {} + virtual void PureFunction() const = 0; +}; +struct PureVirtualCall : public PureVirtualCallBase { + PureVirtualCall() { PureFunction(); } + virtual void PureFunction() const {} +}; + +void ExceptionHandlerDeathTest::DoCrashPureVirtualCall() { + PureVirtualCall instance; +} + +TEST_F(ExceptionHandlerDeathTest, PureVirtualCallTest) { + using google_breakpad::ExceptionHandler; + + ASSERT_TRUE(DoesPathExist(temp_path_)); + ExceptionHandler handler(temp_path_, NULL, NULL, NULL, + ExceptionHandler::HANDLER_PURECALL); + + // Disable the message box for assertions + _CrtSetReportMode(_CRT_ASSERT, 0); + + // Calls a pure virtual function. + EXPECT_EXIT(DoCrashPureVirtualCall(), ::testing::ExitedWithCode(0), ""); +} + +wstring find_minidump_in_directory(const wstring& directory) { + wstring search_path = directory + L"\\*"; + WIN32_FIND_DATA find_data; + HANDLE find_handle = FindFirstFileW(search_path.c_str(), &find_data); + if (find_handle == INVALID_HANDLE_VALUE) + return wstring(); + + wstring filename; + do { + const wchar_t extension[] = L".dmp"; + const size_t extension_length = sizeof(extension) / sizeof(extension[0]) - 1; + const size_t filename_length = wcslen(find_data.cFileName); + if (filename_length > extension_length && + wcsncmp(extension, + find_data.cFileName + filename_length - extension_length, + extension_length) == 0) { + filename = directory + L"\\" + find_data.cFileName; + break; + } + } while (FindNextFile(find_handle, &find_data)); + FindClose(find_handle); + return filename; +} + +#ifndef ADDRESS_SANITIZER + +TEST_F(ExceptionHandlerDeathTest, InstructionPointerMemory) { + ASSERT_TRUE(DoesPathExist(temp_path_)); + scoped_ptr exc( + new google_breakpad::ExceptionHandler( + temp_path_, + NULL, + NULL, + NULL, + google_breakpad::ExceptionHandler::HANDLER_ALL)); + + // Disable GTest SEH handler + testing::DisableExceptionHandlerInScope disable_exception_handler; + + // Get some executable memory. + const uint32_t kMemorySize = 256; // bytes + const int kOffset = kMemorySize / 2; + // This crashes with SIGILL on x86/x86-64/arm. + const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff }; + char* memory = reinterpret_cast(VirtualAlloc(NULL, + kMemorySize, + MEM_COMMIT | MEM_RESERVE, + PAGE_EXECUTE_READWRITE)); + ASSERT_TRUE(memory); + + // Write some instructions that will crash. Put them + // in the middle of the block of memory, because the + // minidump should contain 128 bytes on either side of the + // instruction pointer. + memcpy(memory + kOffset, instructions, sizeof(instructions)); + + // Now execute the instructions, which should crash. + typedef void (*void_function)(void); + void_function memory_function = + reinterpret_cast(memory + kOffset); + ASSERT_DEATH(memory_function(), ""); + + // free the memory. + VirtualFree(memory, 0, MEM_RELEASE); + + // Verify that the resulting minidump contains the memory around the IP + wstring minidump_filename_wide = find_minidump_in_directory(temp_path_); + ASSERT_FALSE(minidump_filename_wide.empty()); + string minidump_filename; + ASSERT_TRUE(WindowsStringUtils::safe_wcstombs(minidump_filename_wide, + &minidump_filename)); + + // Read the minidump. Locate the exception record and the + // memory list, and then ensure that there is a memory region + // in the memory list that covers at least 128 bytes on either + // side of the instruction pointer from the exception record. + { + Minidump minidump(minidump_filename); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(exception); + ASSERT_TRUE(memory_list); + ASSERT_LT((unsigned)0, memory_list->region_count()); + + MinidumpContext* context = exception->GetContext(); + ASSERT_TRUE(context); + + uint64_t instruction_pointer; + ASSERT_TRUE(context->GetInstructionPointer(&instruction_pointer)); + + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionForAddress(instruction_pointer); + ASSERT_TRUE(region); + + EXPECT_LE(kMemorySize, region->GetSize()); + const uint8_t* bytes = region->GetMemory(); + ASSERT_TRUE(bytes); + + uint64_t ip_offset = instruction_pointer - region->GetBase(); + EXPECT_GE(region->GetSize() - kOffset, ip_offset); + EXPECT_LE(kOffset, ip_offset); + + uint8_t prefix_bytes[kOffset]; + uint8_t suffix_bytes[kMemorySize - kOffset - sizeof(instructions)]; + memset(prefix_bytes, 0, sizeof(prefix_bytes)); + memset(suffix_bytes, 0, sizeof(suffix_bytes)); + EXPECT_EQ(0, memcmp(bytes + ip_offset - kOffset, prefix_bytes, + sizeof(prefix_bytes))); + EXPECT_EQ(0, memcmp(bytes + ip_offset, instructions, sizeof(instructions))); + EXPECT_EQ(0, memcmp(bytes + ip_offset + sizeof(instructions), suffix_bytes, + sizeof(suffix_bytes))); + } + + DeleteFileW(minidump_filename_wide.c_str()); +} + +TEST_F(ExceptionHandlerDeathTest, InstructionPointerMemoryMinBound) { + ASSERT_TRUE(DoesPathExist(temp_path_)); + scoped_ptr exc( + new google_breakpad::ExceptionHandler( + temp_path_, + NULL, + NULL, + NULL, + google_breakpad::ExceptionHandler::HANDLER_ALL)); + + // Disable GTest SEH handler + testing::DisableExceptionHandlerInScope disable_exception_handler; + + SYSTEM_INFO sSysInfo; // Useful information about the system + GetSystemInfo(&sSysInfo); // Initialize the structure. + + const uint32_t kMemorySize = 256; // bytes + const DWORD kPageSize = sSysInfo.dwPageSize; + const int kOffset = 0; + // This crashes with SIGILL on x86/x86-64/arm. + const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff }; + // Get some executable memory. Specifically, reserve two pages, + // but only commit the second. + char* all_memory = reinterpret_cast(VirtualAlloc(NULL, + kPageSize * 2, + MEM_RESERVE, + PAGE_NOACCESS)); + ASSERT_TRUE(all_memory); + char* memory = all_memory + kPageSize; + ASSERT_TRUE(VirtualAlloc(memory, kPageSize, + MEM_COMMIT, PAGE_EXECUTE_READWRITE)); + + // Write some instructions that will crash. Put them + // in the middle of the block of memory, because the + // minidump should contain 128 bytes on either side of the + // instruction pointer. + memcpy(memory + kOffset, instructions, sizeof(instructions)); + + // Now execute the instructions, which should crash. + typedef void (*void_function)(void); + void_function memory_function = + reinterpret_cast(memory + kOffset); + ASSERT_DEATH(memory_function(), ""); + + // free the memory. + VirtualFree(memory, 0, MEM_RELEASE); + + // Verify that the resulting minidump contains the memory around the IP + wstring minidump_filename_wide = find_minidump_in_directory(temp_path_); + ASSERT_FALSE(minidump_filename_wide.empty()); + string minidump_filename; + ASSERT_TRUE(WindowsStringUtils::safe_wcstombs(minidump_filename_wide, + &minidump_filename)); + + // Read the minidump. Locate the exception record and the + // memory list, and then ensure that there is a memory region + // in the memory list that covers the instruction pointer from + // the exception record. + { + Minidump minidump(minidump_filename); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(exception); + ASSERT_TRUE(memory_list); + ASSERT_LT((unsigned)0, memory_list->region_count()); + + MinidumpContext* context = exception->GetContext(); + ASSERT_TRUE(context); + + uint64_t instruction_pointer; + ASSERT_TRUE(context->GetInstructionPointer(&instruction_pointer)); + + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionForAddress(instruction_pointer); + ASSERT_TRUE(region); + + EXPECT_EQ(kMemorySize / 2, region->GetSize()); + const uint8_t* bytes = region->GetMemory(); + ASSERT_TRUE(bytes); + + uint8_t suffix_bytes[kMemorySize / 2 - sizeof(instructions)]; + memset(suffix_bytes, 0, sizeof(suffix_bytes)); + EXPECT_TRUE(memcmp(bytes + kOffset, + instructions, sizeof(instructions)) == 0); + EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(instructions), + suffix_bytes, sizeof(suffix_bytes)) == 0); + } + + DeleteFileW(minidump_filename_wide.c_str()); +} + +TEST_F(ExceptionHandlerDeathTest, InstructionPointerMemoryMaxBound) { + ASSERT_TRUE(DoesPathExist(temp_path_)); + scoped_ptr exc( + new google_breakpad::ExceptionHandler( + temp_path_, + NULL, + NULL, + NULL, + google_breakpad::ExceptionHandler::HANDLER_ALL)); + + // Disable GTest SEH handler + testing::DisableExceptionHandlerInScope disable_exception_handler; + + SYSTEM_INFO sSysInfo; // Useful information about the system + GetSystemInfo(&sSysInfo); // Initialize the structure. + + const DWORD kPageSize = sSysInfo.dwPageSize; + // This crashes with SIGILL on x86/x86-64/arm. + const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff }; + const int kOffset = kPageSize - sizeof(instructions); + // Get some executable memory. Specifically, reserve two pages, + // but only commit the first. + char* memory = reinterpret_cast(VirtualAlloc(NULL, + kPageSize * 2, + MEM_RESERVE, + PAGE_NOACCESS)); + ASSERT_TRUE(memory); + ASSERT_TRUE(VirtualAlloc(memory, kPageSize, + MEM_COMMIT, PAGE_EXECUTE_READWRITE)); + + // Write some instructions that will crash. + memcpy(memory + kOffset, instructions, sizeof(instructions)); + + // Now execute the instructions, which should crash. + typedef void (*void_function)(void); + void_function memory_function = + reinterpret_cast(memory + kOffset); + ASSERT_DEATH(memory_function(), ""); + + // free the memory. + VirtualFree(memory, 0, MEM_RELEASE); + + // Verify that the resulting minidump contains the memory around the IP + wstring minidump_filename_wide = find_minidump_in_directory(temp_path_); + ASSERT_FALSE(minidump_filename_wide.empty()); + string minidump_filename; + ASSERT_TRUE(WindowsStringUtils::safe_wcstombs(minidump_filename_wide, + &minidump_filename)); + + // Read the minidump. Locate the exception record and the + // memory list, and then ensure that there is a memory region + // in the memory list that covers the instruction pointer from + // the exception record. + { + Minidump minidump(minidump_filename); + ASSERT_TRUE(minidump.Read()); + + MinidumpException* exception = minidump.GetException(); + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(exception); + ASSERT_TRUE(memory_list); + ASSERT_LT((unsigned)0, memory_list->region_count()); + + MinidumpContext* context = exception->GetContext(); + ASSERT_TRUE(context); + + uint64_t instruction_pointer; + ASSERT_TRUE(context->GetInstructionPointer(&instruction_pointer)); + + MinidumpMemoryRegion* region = + memory_list->GetMemoryRegionForAddress(instruction_pointer); + ASSERT_TRUE(region); + + const size_t kPrefixSize = 128; // bytes + EXPECT_EQ(kPrefixSize + sizeof(instructions), region->GetSize()); + const uint8_t* bytes = region->GetMemory(); + ASSERT_TRUE(bytes); + + uint8_t prefix_bytes[kPrefixSize]; + memset(prefix_bytes, 0, sizeof(prefix_bytes)); + EXPECT_EQ(0, memcmp(bytes, prefix_bytes, sizeof(prefix_bytes))); + EXPECT_EQ(0, memcmp(bytes + kPrefixSize, + instructions, sizeof(instructions))); + } + + DeleteFileW(minidump_filename_wide.c_str()); +} + +#endif // !ADDRESS_SANITIZER + +} // namespace diff --git a/src/client/windows/unittests/exception_handler_nesting_test.cc b/src/client/windows/unittests/exception_handler_nesting_test.cc new file mode 100644 index 0000000..7fa6ac2 --- /dev/null +++ b/src/client/windows/unittests/exception_handler_nesting_test.cc @@ -0,0 +1,330 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "client/windows/handler/exception_handler.h" +#include "client/windows/unittests/exception_handler_test.h" + +namespace { + +const char kFoo[] = "foo"; +const char kBar[] = "bar"; + +const char kStartOfLine[] = "^"; +const char kEndOfLine[] = "$"; + +const char kFilterReturnsTrue[] = "filter_returns_true"; +const char kFilterReturnsFalse[] = "filter_returns_false"; + +const char kCallbackReturnsTrue[] = "callback_returns_true"; +const char kCallbackReturnsFalse[] = "callback_returns_false"; + +bool DoesPathExist(const wchar_t* path_name) { + DWORD flags = GetFileAttributes(path_name); + if (flags == INVALID_FILE_ATTRIBUTES) { + return false; + } + return true; +} + +// A callback function to run before Breakpad performs any substantial +// processing of an exception. A FilterCallback is called before writing +// a minidump. context is the parameter supplied by the user as +// callback_context when the handler was created. exinfo points to the +// exception record, if any; assertion points to assertion information, +// if any. +// +// If a FilterCallback returns true, Breakpad will continue processing, +// attempting to write a minidump. If a FilterCallback returns false, +// Breakpad will immediately report the exception as unhandled without +// writing a minidump, allowing another handler the opportunity to handle it. +template +bool CrashHandlerFilter(void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion) { + if (filter_return_value) { + fprintf(stderr, kFilterReturnsTrue); + } else { + fprintf(stderr, kFilterReturnsFalse); + } + fflush(stderr); + + return filter_return_value; +} + +// A callback function to run after the minidump has been written. +// minidump_id is a unique id for the dump, so the minidump +// file is \.dmp. context is the parameter supplied +// by the user as callback_context when the handler was created. exinfo +// points to the exception record, or NULL if no exception occurred. +// succeeded indicates whether a minidump file was successfully written. +// assertion points to information about an assertion if the handler was +// invoked by an assertion. +// +// If an exception occurred and the callback returns true, Breakpad will treat +// the exception as fully-handled, suppressing any other handlers from being +// notified of the exception. If the callback returns false, Breakpad will +// treat the exception as unhandled, and allow another handler to handle it. +// If there are no other handlers, Breakpad will report the exception to the +// system as unhandled, allowing a debugger or native crash dialog the +// opportunity to handle the exception. Most callback implementations +// should normally return the value of |succeeded|, or when they wish to +// not report an exception of handled, false. Callbacks will rarely want to +// return true directly (unless |succeeded| is true). +// +// For out-of-process dump generation, dump path and minidump ID will always +// be NULL. In case of out-of-process dump generation, the dump path and +// minidump id are controlled by the server process and are not communicated +// back to the crashing process. +template +bool MinidumpWrittenCallback(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded) { + bool rv = false; + if (callback_return_value && + succeeded && + DoesPathExist(dump_path)) { + rv = true; + fprintf(stderr, kCallbackReturnsTrue); + } else { + fprintf(stderr, kCallbackReturnsFalse); + } + fflush(stderr); + + return rv; +} + + +void DoCrash(const char* message) { + if (message) { + fprintf(stderr, "%s", message); + fflush(stderr); + } + int* i = NULL; + (*i)++; + + ASSERT_TRUE(false); +} + +void InstallExceptionHandlerAndCrash(bool install_filter, + bool filter_return_value, + bool install_callback, + bool callback_return_value) { + wchar_t temp_path[MAX_PATH] = { '\0' }; + GetTempPath(MAX_PATH, temp_path); + + ASSERT_TRUE(DoesPathExist(temp_path)); + google_breakpad::ExceptionHandler exc( + temp_path, + install_filter ? + (filter_return_value ? + &CrashHandlerFilter : + &CrashHandlerFilter) : + NULL, + install_callback ? + (callback_return_value ? + &MinidumpWrittenCallback : + &MinidumpWrittenCallback) : + NULL, + NULL, // callback_context + google_breakpad::ExceptionHandler::HANDLER_EXCEPTION); + + // Disable GTest SEH handler + testing::DisableExceptionHandlerInScope disable_exception_handler; + + DoCrash(NULL); +} + +TEST(AssertDeathSanity, Simple) { + ASSERT_DEATH(DoCrash(NULL), ""); +} + +TEST(AssertDeathSanity, Regex) { + ASSERT_DEATH(DoCrash(kFoo), + std::string(kStartOfLine) + + std::string(kFoo) + + std::string(kEndOfLine)); + + ASSERT_DEATH(DoCrash(kBar), + std::string(kStartOfLine) + + std::string(kBar) + + std::string(kEndOfLine)); +} + +TEST(ExceptionHandlerCallbacks, FilterTrue_No_Callback) { + ASSERT_DEATH( + InstallExceptionHandlerAndCrash(true, // install_filter + true, // filter_return_value + false, // install_callback + false), // callback_return_value + std::string(kStartOfLine) + + std::string(kFilterReturnsTrue) + + std::string(kEndOfLine)); +} + +TEST(ExceptionHandlerCallbacks, FilterTrue_Callback) { + ASSERT_DEATH( + InstallExceptionHandlerAndCrash(true, // install_filter + true, // filter_return_value + true, // install_callback + false), // callback_return_value + std::string(kStartOfLine) + + std::string(kFilterReturnsTrue) + + std::string(kCallbackReturnsFalse) + + std::string(kEndOfLine)); +} + +TEST(ExceptionHandlerCallbacks, FilterFalse_No_Callback) { + ASSERT_DEATH( + InstallExceptionHandlerAndCrash(true, // install_filter + false, // filter_return_value + false, // install_callback + false), // callback_return_value + std::string(kStartOfLine) + + std::string(kFilterReturnsFalse) + + std::string(kEndOfLine)); +} + +// Callback shouldn't be executed when filter returns false +TEST(ExceptionHandlerCallbacks, FilterFalse_Callback) { + ASSERT_DEATH( + InstallExceptionHandlerAndCrash(true, // install_filter + false, // filter_return_value + true, // install_callback + false), // callback_return_value + std::string(kStartOfLine) + + std::string(kFilterReturnsFalse) + + std::string(kEndOfLine)); +} + +TEST(ExceptionHandlerCallbacks, No_Filter_No_Callback) { + ASSERT_DEATH( + InstallExceptionHandlerAndCrash(false, // install_filter + true, // filter_return_value + false, // install_callback + false), // callback_return_value + std::string(kStartOfLine) + + std::string(kEndOfLine)); +} + +TEST(ExceptionHandlerCallbacks, No_Filter_Callback) { + ASSERT_DEATH( + InstallExceptionHandlerAndCrash(false, // install_filter + true, // filter_return_value + true, // install_callback + false), // callback_return_value + std::string(kStartOfLine) + + std::string(kCallbackReturnsFalse) + + std::string(kEndOfLine)); +} + + +TEST(ExceptionHandlerNesting, Skip_From_Inner_Filter) { + wchar_t temp_path[MAX_PATH] = { '\0' }; + GetTempPath(MAX_PATH, temp_path); + + ASSERT_TRUE(DoesPathExist(temp_path)); + google_breakpad::ExceptionHandler exc( + temp_path, + &CrashHandlerFilter, + &MinidumpWrittenCallback, + NULL, // callback_context + google_breakpad::ExceptionHandler::HANDLER_EXCEPTION); + + ASSERT_DEATH( + InstallExceptionHandlerAndCrash(true, // install_filter + false, // filter_return_value + true, // install_callback + true), // callback_return_value + std::string(kStartOfLine) + + std::string(kFilterReturnsFalse) + // inner filter + std::string(kFilterReturnsTrue) + // outer filter + std::string(kCallbackReturnsFalse) + // outer callback + std::string(kEndOfLine)); +} + +TEST(ExceptionHandlerNesting, Skip_From_Inner_Callback) { + wchar_t temp_path[MAX_PATH] = { '\0' }; + GetTempPath(MAX_PATH, temp_path); + + ASSERT_TRUE(DoesPathExist(temp_path)); + google_breakpad::ExceptionHandler exc( + temp_path, + &CrashHandlerFilter, + &MinidumpWrittenCallback, + NULL, // callback_context + google_breakpad::ExceptionHandler::HANDLER_EXCEPTION); + + ASSERT_DEATH( + InstallExceptionHandlerAndCrash(true, // install_filter + true, // filter_return_value + true, // install_callback + false), // callback_return_value + std::string(kStartOfLine) + + std::string(kFilterReturnsTrue) + // inner filter + std::string(kCallbackReturnsFalse) + // inner callback + std::string(kFilterReturnsTrue) + // outer filter + std::string(kCallbackReturnsFalse) + // outer callback + std::string(kEndOfLine)); +} + +TEST(ExceptionHandlerNesting, Handled_By_Inner_Handler) { + wchar_t temp_path[MAX_PATH] = { '\0' }; + GetTempPath(MAX_PATH, temp_path); + + ASSERT_TRUE(DoesPathExist(temp_path)); + google_breakpad::ExceptionHandler exc( + temp_path, + &CrashHandlerFilter, + &MinidumpWrittenCallback, + NULL, // callback_context + google_breakpad::ExceptionHandler::HANDLER_EXCEPTION); + + ASSERT_DEATH( + InstallExceptionHandlerAndCrash(true, // install_filter + true, // filter_return_value + true, // install_callback + true), // callback_return_value + std::string(kStartOfLine) + + std::string(kFilterReturnsTrue) + // inner filter + std::string(kCallbackReturnsTrue) + // inner callback + std::string(kEndOfLine)); +} + +} // namespace diff --git a/src/client/windows/unittests/exception_handler_test.cc b/src/client/windows/unittests/exception_handler_test.cc new file mode 100644 index 0000000..f658726 --- /dev/null +++ b/src/client/windows/unittests/exception_handler_test.cc @@ -0,0 +1,506 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "client/windows/unittests/exception_handler_test.h" + +#include +#include +#include +#include +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "client/windows/crash_generation/crash_generation_server.h" +#include "client/windows/handler/exception_handler.h" +#include "client/windows/unittests/dump_analysis.h" // NOLINT +#include "common/windows/string_utils-inl.h" +#include "google_breakpad/processor/minidump.h" + +namespace testing { + +DisableExceptionHandlerInScope::DisableExceptionHandlerInScope() { + catch_exceptions_ = GTEST_FLAG(catch_exceptions); + GTEST_FLAG(catch_exceptions) = false; +} + +DisableExceptionHandlerInScope::~DisableExceptionHandlerInScope() { + GTEST_FLAG(catch_exceptions) = catch_exceptions_; +} + +} // namespace testing + +namespace { + +using std::wstring; +using namespace google_breakpad; + +const wchar_t kPipeName[] = L"\\\\.\\pipe\\BreakpadCrashTest\\TestCaseServer"; +const char kSuccessIndicator[] = "success"; +const char kFailureIndicator[] = "failure"; + +const MINIDUMP_TYPE kFullDumpType = static_cast( + MiniDumpWithFullMemory | // Full memory from process. + MiniDumpWithProcessThreadData | // Get PEB and TEB. + MiniDumpWithHandleData); // Get all handle information. + +class ExceptionHandlerTest : public ::testing::Test { + protected: + // Member variable for each test that they can use + // for temporary storage. + TCHAR temp_path_[MAX_PATH]; + + // Actually constructs a temp path name. + virtual void SetUp(); + + // Deletes temporary files. + virtual void TearDown(); + + void DoCrashInvalidParameter(); + void DoCrashPureVirtualCall(); + + // Utility function to test for a path's existence. + static BOOL DoesPathExist(const TCHAR* path_name); + + // Client callback. + static void ClientDumpCallback( + void* dump_context, + const google_breakpad::ClientInfo* client_info, + const std::wstring* dump_path); + + static bool DumpCallback(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded); + + static std::wstring dump_file; + static std::wstring full_dump_file; +}; + +std::wstring ExceptionHandlerTest::dump_file; +std::wstring ExceptionHandlerTest::full_dump_file; + +void ExceptionHandlerTest::SetUp() { + const ::testing::TestInfo* const test_info = + ::testing::UnitTest::GetInstance()->current_test_info(); + TCHAR temp_path[MAX_PATH] = { '\0' }; + TCHAR test_name_wide[MAX_PATH] = { '\0' }; + // We want the temporary directory to be what the OS returns + // to us, + the test case name. + GetTempPath(MAX_PATH, temp_path); + // THe test case name is exposed to use as a c-style string, + // But we might be working in UNICODE here on Windows. + int dwRet = MultiByteToWideChar(CP_ACP, 0, test_info->name(), + static_cast(strlen(test_info->name())), + test_name_wide, + MAX_PATH); + if (!dwRet) { + assert(false); + } + StringCchPrintfW(temp_path_, MAX_PATH, L"%s%s", temp_path, test_name_wide); + CreateDirectory(temp_path_, NULL); +} + +void ExceptionHandlerTest::TearDown() { + if (!dump_file.empty()) { + ::DeleteFile(dump_file.c_str()); + dump_file = L""; + } + if (!full_dump_file.empty()) { + ::DeleteFile(full_dump_file.c_str()); + full_dump_file = L""; + } +} + +BOOL ExceptionHandlerTest::DoesPathExist(const TCHAR* path_name) { + DWORD flags = GetFileAttributes(path_name); + if (flags == INVALID_FILE_ATTRIBUTES) { + return FALSE; + } + return TRUE; +} + +// static +void ExceptionHandlerTest::ClientDumpCallback( + void* dump_context, + const google_breakpad::ClientInfo* client_info, + const wstring* dump_path) { + dump_file = *dump_path; + // Create the full dump file name from the dump path. + full_dump_file = dump_file.substr(0, dump_file.length() - 4) + L"-full.dmp"; +} + +// static +bool ExceptionHandlerTest::DumpCallback(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded) { + dump_file = dump_path; + dump_file += L"\\"; + dump_file += minidump_id; + dump_file += L".dmp"; + return succeeded; +} + +void ExceptionHandlerTest::DoCrashInvalidParameter() { + google_breakpad::ExceptionHandler* exc = + new google_breakpad::ExceptionHandler( + temp_path_, NULL, NULL, NULL, + google_breakpad::ExceptionHandler::HANDLER_INVALID_PARAMETER, + kFullDumpType, kPipeName, NULL); + + // Disable the message box for assertions + _CrtSetReportMode(_CRT_ASSERT, 0); + + // Although this is executing in the child process of the death test, + // if it's not true we'll still get an error rather than the crash + // being expected. + ASSERT_TRUE(exc->IsOutOfProcess()); + printf(NULL); +} + + +struct PureVirtualCallBase { + PureVirtualCallBase() { + // We have to reinterpret so the linker doesn't get confused because the + // method isn't defined. + reinterpret_cast(this)->PureFunction(); + } + virtual ~PureVirtualCallBase() {} + virtual void PureFunction() const = 0; +}; +struct PureVirtualCall : public PureVirtualCallBase { + PureVirtualCall() { PureFunction(); } + virtual void PureFunction() const {} +}; + +void ExceptionHandlerTest::DoCrashPureVirtualCall() { + google_breakpad::ExceptionHandler* exc = + new google_breakpad::ExceptionHandler( + temp_path_, NULL, NULL, NULL, + google_breakpad::ExceptionHandler::HANDLER_PURECALL, + kFullDumpType, kPipeName, NULL); + + // Disable the message box for assertions + _CrtSetReportMode(_CRT_ASSERT, 0); + + // Although this is executing in the child process of the death test, + // if it's not true we'll still get an error rather than the crash + // being expected. + ASSERT_TRUE(exc->IsOutOfProcess()); + + // Create a new frame to ensure PureVirtualCall is not optimized to some + // other line in this function. + { + PureVirtualCall instance; + } +} + +// This test validates that the minidump is written correctly. +TEST_F(ExceptionHandlerTest, InvalidParameterMiniDumpTest) { + ASSERT_TRUE(DoesPathExist(temp_path_)); + + // Call with a bad argument + ASSERT_TRUE(DoesPathExist(temp_path_)); + wstring dump_path(temp_path_); + google_breakpad::CrashGenerationServer server( + kPipeName, NULL, NULL, NULL, ClientDumpCallback, NULL, NULL, NULL, NULL, + NULL, true, &dump_path); + + ASSERT_TRUE(dump_file.empty() && full_dump_file.empty()); + + // This HAS to be EXPECT_, because when this test case is executed in the + // child process, the server registration will fail due to the named pipe + // being the same. + EXPECT_TRUE(server.Start()); + EXPECT_EXIT(DoCrashInvalidParameter(), ::testing::ExitedWithCode(0), ""); + ASSERT_TRUE(!dump_file.empty() && !full_dump_file.empty()); + ASSERT_TRUE(DoesPathExist(dump_file.c_str())); + ASSERT_TRUE(DoesPathExist(full_dump_file.c_str())); + + // Verify the dump for infos. + DumpAnalysis mini(dump_file); + DumpAnalysis full(full_dump_file); + + // The dump should have all of these streams. + EXPECT_TRUE(mini.HasStream(ThreadListStream)); + EXPECT_TRUE(full.HasStream(ThreadListStream)); + EXPECT_TRUE(mini.HasStream(ModuleListStream)); + EXPECT_TRUE(full.HasStream(ModuleListStream)); + EXPECT_TRUE(mini.HasStream(ExceptionStream)); + EXPECT_TRUE(full.HasStream(ExceptionStream)); + EXPECT_TRUE(mini.HasStream(SystemInfoStream)); + EXPECT_TRUE(full.HasStream(SystemInfoStream)); + EXPECT_TRUE(mini.HasStream(MiscInfoStream)); + EXPECT_TRUE(full.HasStream(MiscInfoStream)); + EXPECT_TRUE(mini.HasStream(HandleDataStream)); + EXPECT_TRUE(full.HasStream(HandleDataStream)); + + // We expect PEB and TEBs in this dump. + EXPECT_TRUE(mini.HasTebs() || full.HasTebs()); + EXPECT_TRUE(mini.HasPeb() || full.HasPeb()); + + // Minidump should have a memory listing, but no 64-bit memory. + EXPECT_TRUE(mini.HasStream(MemoryListStream)); + EXPECT_FALSE(mini.HasStream(Memory64ListStream)); + + EXPECT_FALSE(full.HasStream(MemoryListStream)); + EXPECT_TRUE(full.HasStream(Memory64ListStream)); + + // This is the only place we don't use OR because we want both not + // to have the streams. + EXPECT_FALSE(mini.HasStream(ThreadExListStream)); + EXPECT_FALSE(full.HasStream(ThreadExListStream)); + EXPECT_FALSE(mini.HasStream(CommentStreamA)); + EXPECT_FALSE(full.HasStream(CommentStreamA)); + EXPECT_FALSE(mini.HasStream(CommentStreamW)); + EXPECT_FALSE(full.HasStream(CommentStreamW)); + EXPECT_FALSE(mini.HasStream(FunctionTableStream)); + EXPECT_FALSE(full.HasStream(FunctionTableStream)); + EXPECT_FALSE(mini.HasStream(MemoryInfoListStream)); + EXPECT_FALSE(full.HasStream(MemoryInfoListStream)); + EXPECT_FALSE(mini.HasStream(ThreadInfoListStream)); + EXPECT_FALSE(full.HasStream(ThreadInfoListStream)); + EXPECT_FALSE(mini.HasStream(HandleOperationListStream)); + EXPECT_FALSE(full.HasStream(HandleOperationListStream)); + EXPECT_FALSE(mini.HasStream(TokenStream)); + EXPECT_FALSE(full.HasStream(TokenStream)); +} + + +// This test validates that the minidump is written correctly. +TEST_F(ExceptionHandlerTest, PureVirtualCallMiniDumpTest) { + ASSERT_TRUE(DoesPathExist(temp_path_)); + + // Call with a bad argument + ASSERT_TRUE(DoesPathExist(temp_path_)); + wstring dump_path(temp_path_); + google_breakpad::CrashGenerationServer server( + kPipeName, NULL, NULL, NULL, ClientDumpCallback, NULL, NULL, NULL, NULL, + NULL, true, &dump_path); + + ASSERT_TRUE(dump_file.empty() && full_dump_file.empty()); + + // This HAS to be EXPECT_, because when this test case is executed in the + // child process, the server registration will fail due to the named pipe + // being the same. + EXPECT_TRUE(server.Start()); + EXPECT_EXIT(DoCrashPureVirtualCall(), ::testing::ExitedWithCode(0), ""); + ASSERT_TRUE(!dump_file.empty() && !full_dump_file.empty()); + ASSERT_TRUE(DoesPathExist(dump_file.c_str())); + ASSERT_TRUE(DoesPathExist(full_dump_file.c_str())); + + // Verify the dump for infos. + DumpAnalysis mini(dump_file); + DumpAnalysis full(full_dump_file); + + // The dump should have all of these streams. + EXPECT_TRUE(mini.HasStream(ThreadListStream)); + EXPECT_TRUE(full.HasStream(ThreadListStream)); + EXPECT_TRUE(mini.HasStream(ModuleListStream)); + EXPECT_TRUE(full.HasStream(ModuleListStream)); + EXPECT_TRUE(mini.HasStream(ExceptionStream)); + EXPECT_TRUE(full.HasStream(ExceptionStream)); + EXPECT_TRUE(mini.HasStream(SystemInfoStream)); + EXPECT_TRUE(full.HasStream(SystemInfoStream)); + EXPECT_TRUE(mini.HasStream(MiscInfoStream)); + EXPECT_TRUE(full.HasStream(MiscInfoStream)); + EXPECT_TRUE(mini.HasStream(HandleDataStream)); + EXPECT_TRUE(full.HasStream(HandleDataStream)); + + // We expect PEB and TEBs in this dump. + EXPECT_TRUE(mini.HasTebs() || full.HasTebs()); + EXPECT_TRUE(mini.HasPeb() || full.HasPeb()); + + // Minidump should have a memory listing, but no 64-bit memory. + EXPECT_TRUE(mini.HasStream(MemoryListStream)); + EXPECT_FALSE(mini.HasStream(Memory64ListStream)); + + EXPECT_FALSE(full.HasStream(MemoryListStream)); + EXPECT_TRUE(full.HasStream(Memory64ListStream)); + + // This is the only place we don't use OR because we want both not + // to have the streams. + EXPECT_FALSE(mini.HasStream(ThreadExListStream)); + EXPECT_FALSE(full.HasStream(ThreadExListStream)); + EXPECT_FALSE(mini.HasStream(CommentStreamA)); + EXPECT_FALSE(full.HasStream(CommentStreamA)); + EXPECT_FALSE(mini.HasStream(CommentStreamW)); + EXPECT_FALSE(full.HasStream(CommentStreamW)); + EXPECT_FALSE(mini.HasStream(FunctionTableStream)); + EXPECT_FALSE(full.HasStream(FunctionTableStream)); + EXPECT_FALSE(mini.HasStream(MemoryInfoListStream)); + EXPECT_FALSE(full.HasStream(MemoryInfoListStream)); + EXPECT_FALSE(mini.HasStream(ThreadInfoListStream)); + EXPECT_FALSE(full.HasStream(ThreadInfoListStream)); + EXPECT_FALSE(mini.HasStream(HandleOperationListStream)); + EXPECT_FALSE(full.HasStream(HandleOperationListStream)); + EXPECT_FALSE(mini.HasStream(TokenStream)); + EXPECT_FALSE(full.HasStream(TokenStream)); +} + +// Test that writing a minidump produces a valid minidump containing +// some expected structures. +TEST_F(ExceptionHandlerTest, WriteMinidumpTest) { + ExceptionHandler handler(temp_path_, + NULL, + DumpCallback, + NULL, + ExceptionHandler::HANDLER_ALL); + + // Disable GTest SEH handler + testing::DisableExceptionHandlerInScope disable_exception_handler; + + ASSERT_TRUE(handler.WriteMinidump()); + ASSERT_FALSE(dump_file.empty()); + + string minidump_filename; + ASSERT_TRUE(WindowsStringUtils::safe_wcstombs(dump_file, + &minidump_filename)); + + // Read the minidump and verify some info. + Minidump minidump(minidump_filename); + ASSERT_TRUE(minidump.Read()); + // TODO(ted): more comprehensive tests... +} + +// Test that an additional memory region can be included in the minidump. +TEST_F(ExceptionHandlerTest, AdditionalMemory) { + SYSTEM_INFO si; + GetSystemInfo(&si); + const uint32_t kMemorySize = si.dwPageSize; + + // Get some heap memory. + uint8_t* memory = new uint8_t[kMemorySize]; + const uintptr_t kMemoryAddress = reinterpret_cast(memory); + ASSERT_TRUE(memory); + + // Stick some data into the memory so the contents can be verified. + for (uint32_t i = 0; i < kMemorySize; ++i) { + memory[i] = i % 255; + } + + ExceptionHandler handler(temp_path_, + NULL, + DumpCallback, + NULL, + ExceptionHandler::HANDLER_ALL); + + // Disable GTest SEH handler + testing::DisableExceptionHandlerInScope disable_exception_handler; + + // Add the memory region to the list of memory to be included. + handler.RegisterAppMemory(memory, kMemorySize); + ASSERT_TRUE(handler.WriteMinidump()); + ASSERT_FALSE(dump_file.empty()); + + string minidump_filename; + ASSERT_TRUE(WindowsStringUtils::safe_wcstombs(dump_file, + &minidump_filename)); + + // Read the minidump. Ensure that the memory region is present + Minidump minidump(minidump_filename); + ASSERT_TRUE(minidump.Read()); + + MinidumpMemoryList* dump_memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(dump_memory_list); + const MinidumpMemoryRegion* region = + dump_memory_list->GetMemoryRegionForAddress(kMemoryAddress); + ASSERT_TRUE(region); + + EXPECT_EQ(kMemoryAddress, region->GetBase()); + EXPECT_EQ(kMemorySize, region->GetSize()); + + // Verify memory contents. + EXPECT_EQ(0, memcmp(region->GetMemory(), memory, kMemorySize)); + + delete[] memory; +} + +// Test that a memory region that was previously registered +// can be unregistered. +TEST_F(ExceptionHandlerTest, AdditionalMemoryRemove) { + SYSTEM_INFO si; + GetSystemInfo(&si); + const uint32_t kMemorySize = si.dwPageSize; + + // Get some heap memory. + uint8_t* memory = new uint8_t[kMemorySize]; + const uintptr_t kMemoryAddress = reinterpret_cast(memory); + ASSERT_TRUE(memory); + + // Stick some data into the memory so the contents can be verified. + for (uint32_t i = 0; i < kMemorySize; ++i) { + memory[i] = i % 255; + } + + ExceptionHandler handler(temp_path_, + NULL, + DumpCallback, + NULL, + ExceptionHandler::HANDLER_ALL); + + // Disable GTest SEH handler + testing::DisableExceptionHandlerInScope disable_exception_handler; + + // Add the memory region to the list of memory to be included. + handler.RegisterAppMemory(memory, kMemorySize); + + // ...and then remove it + handler.UnregisterAppMemory(memory); + + ASSERT_TRUE(handler.WriteMinidump()); + ASSERT_FALSE(dump_file.empty()); + + string minidump_filename; + ASSERT_TRUE(WindowsStringUtils::safe_wcstombs(dump_file, + &minidump_filename)); + + // Read the minidump. Ensure that the memory region is not present. + Minidump minidump(minidump_filename); + ASSERT_TRUE(minidump.Read()); + + MinidumpMemoryList* dump_memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(dump_memory_list); + const MinidumpMemoryRegion* region = + dump_memory_list->GetMemoryRegionForAddress(kMemoryAddress); + EXPECT_FALSE(region); + + delete[] memory; +} + +} // namespace diff --git a/src/client/windows/unittests/exception_handler_test.h b/src/client/windows/unittests/exception_handler_test.h new file mode 100644 index 0000000..9d4e44e --- /dev/null +++ b/src/client/windows/unittests/exception_handler_test.h @@ -0,0 +1,60 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CLIENT_WINDOWS_UNITTESTS_EXCEPTION_HANDLER_TEST_H_ +#define CLIENT_WINDOWS_UNITTESTS_EXCEPTION_HANDLER_TEST_H_ + +namespace testing { + +// By default, GTest (on Windows) installs a SEH filter (and a handler) before +// starting to run all the tests in order to avoid test interruptions is some +// of the tests are crashing. Unfortunately, this functionality prevents the +// execution to reach the UnhandledExceptionFilter installed by Google-Breakpad +// ExceptionHandler so in order to test the Google-Breakpad exception handling +// code the exception handling done by GTest must be disabled. +// Usage: +// +// google_breakpad::ExceptionHandler exc(...); +// +// // Disable GTest SEH handler +// testing::DisableExceptionHandlerInScope disable_exception_handler; +// ... +// ASSERT_DEATH( ... some crash ...); +// +class DisableExceptionHandlerInScope { + public: + DisableExceptionHandlerInScope(); + ~DisableExceptionHandlerInScope(); + + private: + bool catch_exceptions_; +}; + +} // namespace testing + +#endif // CLIENT_WINDOWS_UNITTESTS_EXCEPTION_HANDLER_TEST_H_ diff --git a/src/client/windows/unittests/minidump_test.cc b/src/client/windows/unittests/minidump_test.cc new file mode 100644 index 0000000..741447d --- /dev/null +++ b/src/client/windows/unittests/minidump_test.cc @@ -0,0 +1,335 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "client/windows/crash_generation/minidump_generator.h" +#include "client/windows/unittests/dump_analysis.h" // NOLINT + +namespace { + +// Minidump with stacks, PEB, TEB, and unloaded module list. +const MINIDUMP_TYPE kSmallDumpType = static_cast( + MiniDumpWithProcessThreadData | // Get PEB and TEB. + MiniDumpWithUnloadedModules); // Get unloaded modules when available. + +// Minidump with all of the above, plus memory referenced from stack. +const MINIDUMP_TYPE kLargerDumpType = static_cast( + MiniDumpWithProcessThreadData | // Get PEB and TEB. + MiniDumpWithUnloadedModules | // Get unloaded modules when available. + MiniDumpWithIndirectlyReferencedMemory); // Get memory referenced by stack. + +// Large dump with all process memory. +const MINIDUMP_TYPE kFullDumpType = static_cast( + MiniDumpWithFullMemory | // Full memory from process. + MiniDumpWithProcessThreadData | // Get PEB and TEB. + MiniDumpWithHandleData | // Get all handle information. + MiniDumpWithUnloadedModules); // Get unloaded modules when available. + +class MinidumpTest: public testing::Test { + public: + MinidumpTest() { + wchar_t temp_dir_path[ MAX_PATH ] = {0}; + ::GetTempPath(MAX_PATH, temp_dir_path); + dump_path_ = temp_dir_path; + } + + virtual void SetUp() { + // Make sure URLMon isn't loaded into our process. + ASSERT_EQ(NULL, ::GetModuleHandle(L"urlmon.dll")); + + // Then load and unload it to ensure we have something to + // stock the unloaded module list with. + HMODULE urlmon = ::LoadLibrary(L"urlmon.dll"); + ASSERT_TRUE(urlmon != NULL); + ASSERT_TRUE(::FreeLibrary(urlmon)); + } + + virtual void TearDown() { + if (!dump_file_.empty()) { + ::DeleteFile(dump_file_.c_str()); + dump_file_ = L""; + } + if (!full_dump_file_.empty()) { + ::DeleteFile(full_dump_file_.c_str()); + full_dump_file_ = L""; + } + } + + bool WriteDump(ULONG flags) { + using google_breakpad::MinidumpGenerator; + + // Fake exception is access violation on write to this. + EXCEPTION_RECORD ex_record = { + STATUS_ACCESS_VIOLATION, // ExceptionCode + 0, // ExceptionFlags + NULL, // ExceptionRecord; + reinterpret_cast(static_cast(0xCAFEBABE)), // ExceptionAddress; + 2, // NumberParameters; + { EXCEPTION_WRITE_FAULT, reinterpret_cast(this) } + }; + CONTEXT ctx_record = {}; + EXCEPTION_POINTERS ex_ptrs = { + &ex_record, + &ctx_record, + }; + + MinidumpGenerator generator(dump_path_, + ::GetCurrentProcess(), + ::GetCurrentProcessId(), + ::GetCurrentThreadId(), + ::GetCurrentThreadId(), + &ex_ptrs, + NULL, + static_cast(flags), + TRUE); + generator.GenerateDumpFile(&dump_file_); + generator.GenerateFullDumpFile(&full_dump_file_); + // And write a dump + bool result = generator.WriteMinidump(); + return result == TRUE; + } + + protected: + std::wstring dump_file_; + std::wstring full_dump_file_; + + std::wstring dump_path_; +}; + +// We need to be able to get file information from Windows +bool HasFileInfo(const std::wstring& file_path) { + DWORD dummy; + const wchar_t* path = file_path.c_str(); + DWORD length = ::GetFileVersionInfoSize(path, &dummy); + if (length == 0) + return NULL; + + void* data = calloc(length, 1); + if (!data) + return false; + + if (!::GetFileVersionInfo(path, dummy, length, data)) { + free(data); + return false; + } + + void* translate = NULL; + UINT page_count; + BOOL query_result = VerQueryValue( + data, + L"\\VarFileInfo\\Translation", + static_cast(&translate), + &page_count); + + free(data); + if (query_result && translate) { + return true; + } else { + return false; + } +} + +TEST_F(MinidumpTest, Version) { + // Loads DbgHelp.dll in process + ImagehlpApiVersion(); + + HMODULE dbg_help = ::GetModuleHandle(L"dbghelp.dll"); + ASSERT_TRUE(dbg_help != NULL); + + wchar_t dbg_help_file[1024] = {}; + ASSERT_TRUE(::GetModuleFileName(dbg_help, + dbg_help_file, + sizeof(dbg_help_file) / + sizeof(*dbg_help_file))); + ASSERT_TRUE(HasFileInfo(std::wstring(dbg_help_file)) != NULL); + +// LOG(INFO) << "DbgHelp.dll version: " << file_info->file_version(); +} + +TEST_F(MinidumpTest, Normal) { + EXPECT_TRUE(WriteDump(MiniDumpNormal)); + DumpAnalysis mini(dump_file_); + + // We expect threads, modules and some memory. + EXPECT_TRUE(mini.HasStream(ThreadListStream)); + EXPECT_TRUE(mini.HasStream(ModuleListStream)); + EXPECT_TRUE(mini.HasStream(MemoryListStream)); + EXPECT_TRUE(mini.HasStream(ExceptionStream)); + EXPECT_TRUE(mini.HasStream(SystemInfoStream)); + EXPECT_TRUE(mini.HasStream(MiscInfoStream)); + + EXPECT_FALSE(mini.HasStream(ThreadExListStream)); + EXPECT_FALSE(mini.HasStream(Memory64ListStream)); + EXPECT_FALSE(mini.HasStream(CommentStreamA)); + EXPECT_FALSE(mini.HasStream(CommentStreamW)); + EXPECT_FALSE(mini.HasStream(HandleDataStream)); + EXPECT_FALSE(mini.HasStream(FunctionTableStream)); + EXPECT_FALSE(mini.HasStream(UnloadedModuleListStream)); + EXPECT_FALSE(mini.HasStream(MemoryInfoListStream)); + EXPECT_FALSE(mini.HasStream(ThreadInfoListStream)); + EXPECT_FALSE(mini.HasStream(HandleOperationListStream)); + EXPECT_FALSE(mini.HasStream(TokenStream)); + + // We expect no PEB nor TEBs in this dump. + EXPECT_FALSE(mini.HasTebs()); + EXPECT_FALSE(mini.HasPeb()); + + // We expect no off-stack memory in this dump. + EXPECT_FALSE(mini.HasMemory(this)); +} + +TEST_F(MinidumpTest, SmallDump) { + ASSERT_TRUE(WriteDump(kSmallDumpType)); + DumpAnalysis mini(dump_file_); + + EXPECT_TRUE(mini.HasStream(ThreadListStream)); + EXPECT_TRUE(mini.HasStream(ModuleListStream)); + EXPECT_TRUE(mini.HasStream(MemoryListStream)); + EXPECT_TRUE(mini.HasStream(ExceptionStream)); + EXPECT_TRUE(mini.HasStream(SystemInfoStream)); + EXPECT_TRUE(mini.HasStream(UnloadedModuleListStream)); + EXPECT_TRUE(mini.HasStream(MiscInfoStream)); + + // We expect PEB and TEBs in this dump. + EXPECT_TRUE(mini.HasTebs()); + EXPECT_TRUE(mini.HasPeb()); + + EXPECT_FALSE(mini.HasStream(ThreadExListStream)); + EXPECT_FALSE(mini.HasStream(Memory64ListStream)); + EXPECT_FALSE(mini.HasStream(CommentStreamA)); + EXPECT_FALSE(mini.HasStream(CommentStreamW)); + EXPECT_FALSE(mini.HasStream(HandleDataStream)); + EXPECT_FALSE(mini.HasStream(FunctionTableStream)); + EXPECT_FALSE(mini.HasStream(MemoryInfoListStream)); + EXPECT_FALSE(mini.HasStream(ThreadInfoListStream)); + EXPECT_FALSE(mini.HasStream(HandleOperationListStream)); + EXPECT_FALSE(mini.HasStream(TokenStream)); + + // We expect no off-stack memory in this dump. + EXPECT_FALSE(mini.HasMemory(this)); +} + +TEST_F(MinidumpTest, LargerDump) { + ASSERT_TRUE(WriteDump(kLargerDumpType)); + DumpAnalysis mini(dump_file_); + + // The dump should have all of these streams. + EXPECT_TRUE(mini.HasStream(ThreadListStream)); + EXPECT_TRUE(mini.HasStream(ModuleListStream)); + EXPECT_TRUE(mini.HasStream(MemoryListStream)); + EXPECT_TRUE(mini.HasStream(ExceptionStream)); + EXPECT_TRUE(mini.HasStream(SystemInfoStream)); + EXPECT_TRUE(mini.HasStream(UnloadedModuleListStream)); + EXPECT_TRUE(mini.HasStream(MiscInfoStream)); + + // We expect memory referenced by stack in this dump. + EXPECT_TRUE(mini.HasMemory(this)); + + // We expect PEB and TEBs in this dump. + EXPECT_TRUE(mini.HasTebs()); + EXPECT_TRUE(mini.HasPeb()); + + EXPECT_FALSE(mini.HasStream(ThreadExListStream)); + EXPECT_FALSE(mini.HasStream(Memory64ListStream)); + EXPECT_FALSE(mini.HasStream(CommentStreamA)); + EXPECT_FALSE(mini.HasStream(CommentStreamW)); + EXPECT_FALSE(mini.HasStream(HandleDataStream)); + EXPECT_FALSE(mini.HasStream(FunctionTableStream)); + EXPECT_FALSE(mini.HasStream(MemoryInfoListStream)); + EXPECT_FALSE(mini.HasStream(ThreadInfoListStream)); + EXPECT_FALSE(mini.HasStream(HandleOperationListStream)); + EXPECT_FALSE(mini.HasStream(TokenStream)); +} + +TEST_F(MinidumpTest, FullDump) { + ASSERT_TRUE(WriteDump(kFullDumpType)); + ASSERT_TRUE(dump_file_ != L""); + ASSERT_TRUE(full_dump_file_ != L""); + DumpAnalysis mini(dump_file_); + DumpAnalysis full(full_dump_file_); + + // Either dumps can contain part of the information. + + // The dump should have all of these streams. + EXPECT_TRUE(mini.HasStream(ThreadListStream)); + EXPECT_TRUE(full.HasStream(ThreadListStream)); + EXPECT_TRUE(mini.HasStream(ModuleListStream)); + EXPECT_TRUE(full.HasStream(ModuleListStream)); + EXPECT_TRUE(mini.HasStream(ExceptionStream)); + EXPECT_TRUE(full.HasStream(ExceptionStream)); + EXPECT_TRUE(mini.HasStream(SystemInfoStream)); + EXPECT_TRUE(full.HasStream(SystemInfoStream)); + EXPECT_TRUE(mini.HasStream(UnloadedModuleListStream)); + EXPECT_TRUE(full.HasStream(UnloadedModuleListStream)); + EXPECT_TRUE(mini.HasStream(MiscInfoStream)); + EXPECT_TRUE(full.HasStream(MiscInfoStream)); + EXPECT_TRUE(mini.HasStream(HandleDataStream)); + EXPECT_TRUE(full.HasStream(HandleDataStream)); + + // We expect memory referenced by stack in this dump. + EXPECT_FALSE(mini.HasMemory(this)); + EXPECT_TRUE(full.HasMemory(this)); + + // We expect PEB and TEBs in this dump. + EXPECT_TRUE(mini.HasTebs() || full.HasTebs()); + EXPECT_TRUE(mini.HasPeb() || full.HasPeb()); + + EXPECT_TRUE(mini.HasStream(MemoryListStream)); + EXPECT_TRUE(full.HasStream(Memory64ListStream)); + EXPECT_FALSE(mini.HasStream(Memory64ListStream)); + EXPECT_FALSE(full.HasStream(MemoryListStream)); + + // This is the only place we don't use OR because we want both not + // to have the streams. + EXPECT_FALSE(mini.HasStream(ThreadExListStream)); + EXPECT_FALSE(full.HasStream(ThreadExListStream)); + EXPECT_FALSE(mini.HasStream(CommentStreamA)); + EXPECT_FALSE(full.HasStream(CommentStreamA)); + EXPECT_FALSE(mini.HasStream(CommentStreamW)); + EXPECT_FALSE(full.HasStream(CommentStreamW)); + EXPECT_FALSE(mini.HasStream(FunctionTableStream)); + EXPECT_FALSE(full.HasStream(FunctionTableStream)); + EXPECT_FALSE(mini.HasStream(MemoryInfoListStream)); + EXPECT_FALSE(full.HasStream(MemoryInfoListStream)); + EXPECT_FALSE(mini.HasStream(ThreadInfoListStream)); + EXPECT_FALSE(full.HasStream(ThreadInfoListStream)); + EXPECT_FALSE(mini.HasStream(HandleOperationListStream)); + EXPECT_FALSE(full.HasStream(HandleOperationListStream)); + EXPECT_FALSE(mini.HasStream(TokenStream)); + EXPECT_FALSE(full.HasStream(TokenStream)); +} + +} // namespace diff --git a/src/common/android/include/asm-mips/README.md b/src/common/android/include/asm-mips/README.md new file mode 100644 index 0000000..b56ee60 --- /dev/null +++ b/src/common/android/include/asm-mips/README.md @@ -0,0 +1,9 @@ +# asm-mips + +The files in this directory are almost direct copies from Android NDK r12, with +the exception of changing the include guards to Breakpad ones. They are copied +from the MIPS asm/ directory, but are meant to be used as replacements for both +asm/ and machine/ includes since the files in each are largely duplicates. + +Some MIPS asm/ and all machine/ headers were removed in the move to unified NDK +headers, so Breakpad fails to compile on newer NDK versions without these files. \ No newline at end of file diff --git a/src/common/android/include/asm-mips/asm.h b/src/common/android/include/asm-mips/asm.h new file mode 100644 index 0000000..8f086e7 --- /dev/null +++ b/src/common/android/include/asm-mips/asm.h @@ -0,0 +1,270 @@ +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_ASM_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_ASM_H + +#if defined(__has_include_next) && __has_include_next() +#include_next +#else + +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ + +#include +#ifndef CAT +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#ifdef __STDC__ +#define __CAT(str1, str2) str1##str2 +#else +#define __CAT(str1, str2) str1 str2 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#define CAT(str1, str2) __CAT(str1, str2) +#endif +#ifdef __PIC__ +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define CPRESTORE(register) .cprestore register +#define CPADD(register) .cpadd register +#define CPLOAD(register) .cpload register +#else +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define CPRESTORE(register) +#define CPADD(register) +#define CPLOAD(register) +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LEAF(symbol) .globl symbol; .align 2; .type symbol, @function; .ent symbol, 0; symbol: .frame sp, 0, ra +#define NESTED(symbol, framesize, rpc) .globl symbol; .align 2; .type symbol, @function; .ent symbol, 0; symbol: .frame sp, framesize, rpc +#define END(function) .end function; .size function, .-function +#define EXPORT(symbol) .globl symbol; symbol: +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define FEXPORT(symbol) .globl symbol; .type symbol, @function; symbol: +#define ABS(symbol,value) .globl symbol; symbol = value +#define PANIC(msg) .set push; .set reorder; PTR_LA a0, 8f; jal panic; 9: b 9b; .set pop; TEXT(msg) +#define PRINT(string) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define TEXT(msg) .pushsection .data; 8: .asciiz msg; .popsection; +#define TTABLE(string) .pushsection .text; .word 1f; .popsection .pushsection .data; 1: .asciiz string; .popsection +#define PREF(hint, addr) +#define PREFX(hint, addr) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#if _MIPS_ISA == _MIPS_ISA_MIPS1 +#define MOVN(rd, rs, rt) .set push; .set reorder; beqz rt, 9f; move rd, rs; .set pop; 9: +#define MOVZ(rd, rs, rt) .set push; .set reorder; bnez rt, 9f; move rd, rs; .set pop; 9: +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#if _MIPS_ISA == _MIPS_ISA_MIPS2 || _MIPS_ISA == _MIPS_ISA_MIPS3 +#define MOVN(rd, rs, rt) .set push; .set noreorder; bnezl rt, 9f; move rd, rs; .set pop; 9: +#define MOVZ(rd, rs, rt) .set push; .set noreorder; beqzl rt, 9f; move rd, rs; .set pop; 9: +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#if _MIPS_ISA == _MIPS_ISA_MIPS4 || _MIPS_ISA == _MIPS_ISA_MIPS5 || _MIPS_ISA == _MIPS_ISA_MIPS32 || _MIPS_ISA == _MIPS_ISA_MIPS64 +#define MOVN(rd, rs, rt) movn rd, rs, rt +#define MOVZ(rd, rs, rt) movz rd, rs, rt +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#if _MIPS_SIM == _MIPS_SIM_ABI32 +#define ALSZ 7 +#define ALMASK ~7 +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#if _MIPS_SIM == _MIPS_SIM_NABI32 || _MIPS_SIM == _MIPS_SIM_ABI64 +#define ALSZ 15 +#define ALMASK ~15 +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#ifdef __mips64 +#define SZREG 8 +#else +#define SZREG 4 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SIM == _MIPS_SIM_ABI32 +#define REG_S sw +#define REG_L lw +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define REG_SUBU subu +#define REG_ADDU addu +#endif +#if _MIPS_SIM == _MIPS_SIM_NABI32 || _MIPS_SIM == _MIPS_SIM_ABI64 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define REG_S sd +#define REG_L ld +#define REG_SUBU dsubu +#define REG_ADDU daddu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SZINT == 32 +#define INT_ADD add +#define INT_ADDU addu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_ADDI addi +#define INT_ADDIU addiu +#define INT_SUB sub +#define INT_SUBU subu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_L lw +#define INT_S sw +#define INT_SLL sll +#define INT_SLLV sllv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_SRL srl +#define INT_SRLV srlv +#define INT_SRA sra +#define INT_SRAV srav +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SZINT == 64 +#define INT_ADD dadd +#define INT_ADDU daddu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_ADDI daddi +#define INT_ADDIU daddiu +#define INT_SUB dsub +#define INT_SUBU dsubu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_L ld +#define INT_S sd +#define INT_SLL dsll +#define INT_SLLV dsllv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_SRL dsrl +#define INT_SRLV dsrlv +#define INT_SRA dsra +#define INT_SRAV dsrav +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SZLONG == 32 +#define LONG_ADD add +#define LONG_ADDU addu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_ADDI addi +#define LONG_ADDIU addiu +#define LONG_SUB sub +#define LONG_SUBU subu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_L lw +#define LONG_S sw +#define LONG_SLL sll +#define LONG_SLLV sllv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_SRL srl +#define LONG_SRLV srlv +#define LONG_SRA sra +#define LONG_SRAV srav +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG .word +#define LONGSIZE 4 +#define LONGMASK 3 +#define LONGLOG 2 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SZLONG == 64 +#define LONG_ADD dadd +#define LONG_ADDU daddu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_ADDI daddi +#define LONG_ADDIU daddiu +#define LONG_SUB dsub +#define LONG_SUBU dsubu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_L ld +#define LONG_S sd +#define LONG_SLL dsll +#define LONG_SLLV dsllv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_SRL dsrl +#define LONG_SRLV dsrlv +#define LONG_SRA dsra +#define LONG_SRAV dsrav +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG .dword +#define LONGSIZE 8 +#define LONGMASK 7 +#define LONGLOG 3 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SZPTR == 32 +#define PTR_ADD add +#define PTR_ADDU addu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_ADDI addi +#define PTR_ADDIU addiu +#define PTR_SUB sub +#define PTR_SUBU subu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_L lw +#define PTR_S sw +#define PTR_LA la +#define PTR_LI li +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_SLL sll +#define PTR_SLLV sllv +#define PTR_SRL srl +#define PTR_SRLV srlv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_SRA sra +#define PTR_SRAV srav +#define PTR_SCALESHIFT 2 +#define PTR .word +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTRSIZE 4 +#define PTRLOG 2 +#endif +#if _MIPS_SZPTR == 64 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_ADD dadd +#define PTR_ADDU daddu +#define PTR_ADDI daddi +#define PTR_ADDIU daddiu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_SUB dsub +#define PTR_SUBU dsubu +#define PTR_L ld +#define PTR_S sd +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_LA dla +#define PTR_LI dli +#define PTR_SLL dsll +#define PTR_SLLV dsllv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_SRL dsrl +#define PTR_SRLV dsrlv +#define PTR_SRA dsra +#define PTR_SRAV dsrav +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_SCALESHIFT 3 +#define PTR .dword +#define PTRSIZE 8 +#define PTRLOG 3 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SIM == _MIPS_SIM_ABI32 +#define MFC0 mfc0 +#define MTC0 mtc0 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SIM == _MIPS_SIM_NABI32 || _MIPS_SIM == _MIPS_SIM_ABI64 +#define MFC0 dmfc0 +#define MTC0 dmtc0 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#define SSNOP sll zero, zero, 1 +#define R10KCBARRIER(addr) +#endif // defined(__has_include_next) && __has_include_next() +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_ASM_H +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ diff --git a/src/common/android/include/asm-mips/fpregdef.h b/src/common/android/include/asm-mips/fpregdef.h new file mode 100644 index 0000000..a6eedc0 --- /dev/null +++ b/src/common/android/include/asm-mips/fpregdef.h @@ -0,0 +1,117 @@ +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_FPREGDEF_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_FPREGDEF_H + +#if defined(__has_include_next) && __has_include_next() +#include_next +#else + +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ + +#include +#if _MIPS_SIM == _MIPS_SIM_ABI32 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fv0 $f0 +#define fv0f $f1 +#define fv1 $f2 +#define fv1f $f3 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fa0 $f12 +#define fa0f $f13 +#define fa1 $f14 +#define fa1f $f15 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft0 $f4 +#define ft0f $f5 +#define ft1 $f6 +#define ft1f $f7 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft2 $f8 +#define ft2f $f9 +#define ft3 $f10 +#define ft3f $f11 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft4 $f16 +#define ft4f $f17 +#define ft5 $f18 +#define ft5f $f19 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fs0 $f20 +#define fs0f $f21 +#define fs1 $f22 +#define fs1f $f23 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fs2 $f24 +#define fs2f $f25 +#define fs3 $f26 +#define fs3f $f27 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fs4 $f28 +#define fs4f $f29 +#define fs5 $f30 +#define fs5f $f31 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fcr31 $31 +#endif +#if _MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32 +#define fv0 $f0 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fv1 $f2 +#define fa0 $f12 +#define fa1 $f13 +#define fa2 $f14 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fa3 $f15 +#define fa4 $f16 +#define fa5 $f17 +#define fa6 $f18 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fa7 $f19 +#define ft0 $f4 +#define ft1 $f5 +#define ft2 $f6 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft3 $f7 +#define ft4 $f8 +#define ft5 $f9 +#define ft6 $f10 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft7 $f11 +#define ft8 $f20 +#define ft9 $f21 +#define ft10 $f22 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft11 $f23 +#define ft12 $f1 +#define ft13 $f3 +#define fs0 $f24 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fs1 $f25 +#define fs2 $f26 +#define fs3 $f27 +#define fs4 $f28 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fs5 $f29 +#define fs6 $f30 +#define fs7 $f31 +#define fcr31 $31 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#endif // defined(__has_include_next) && __has_include_next() +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_FPREGDEF_H diff --git a/src/common/android/include/asm-mips/regdef.h b/src/common/android/include/asm-mips/regdef.h new file mode 100644 index 0000000..a7fd769 --- /dev/null +++ b/src/common/android/include/asm-mips/regdef.h @@ -0,0 +1,125 @@ +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_REGDEF_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_REGDEF_H + +#if defined(__has_include_next) && __has_include_next() +#include_next +#else + +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ + +#include +#if _MIPS_SIM == _MIPS_SIM_ABI32 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define zero $0 +#define AT $1 +#define v0 $2 +#define v1 $3 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define t0 $8 +#define t1 $9 +#define t2 $10 +#define t3 $11 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define t4 $12 +#define t5 $13 +#define t6 $14 +#define t7 $15 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s8 $30 +#define ra $31 +#endif +#if _MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define zero $0 +#define AT $at +#define v0 $2 +#define v1 $3 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define a4 $8 +#define ta0 $8 +#define a5 $9 +#define ta1 $9 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define a6 $10 +#define ta2 $10 +#define a7 $11 +#define ta3 $11 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define t0 $12 +#define t1 $13 +#define t2 $14 +#define t3 $15 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s8 $30 +#define ra $31 +#endif +#endif // defined(__has_include_next) && __has_include_next() +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_REGDEF_H +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ diff --git a/src/common/android/include/elf.h b/src/common/android/include/elf.h new file mode 100644 index 0000000..80e4c83 --- /dev/null +++ b/src/common/android/include/elf.h @@ -0,0 +1,156 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ELF_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ELF_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// The Android provides BSD-based definitions for the ElfXX_Nhdr +// types +// always source-compatible with the GLibc/kernel ones. To overcome this +// issue without modifying a lot of code in Breakpad, use an ugly macro +// renaming trick with #include_next + +// Avoid conflict with BSD-based definition of ElfXX_Nhdr. +// Unfortunately, their field member names do not use a 'n_' prefix. +#define Elf32_Nhdr __bsd_Elf32_Nhdr +#define Elf64_Nhdr __bsd_Elf64_Nhdr + +// In case they are defined by the NDK version +#define Elf32_auxv_t __bionic_Elf32_auxv_t +#define Elf64_auxv_t __bionic_Elf64_auxv_t + +#define Elf32_Dyn __bionic_Elf32_Dyn +#define Elf64_Dyn __bionic_Elf64_Dyn + +#include_next + +#undef Elf32_Nhdr +#undef Elf64_Nhdr + +typedef struct { + Elf32_Word n_namesz; + Elf32_Word n_descsz; + Elf32_Word n_type; +} Elf32_Nhdr; + +typedef struct { + Elf64_Word n_namesz; + Elf64_Word n_descsz; + Elf64_Word n_type; +} Elf64_Nhdr; + +#undef Elf32_auxv_t +#undef Elf64_auxv_t + +typedef struct { + uint32_t a_type; + union { + uint32_t a_val; + } a_un; +} Elf32_auxv_t; + +typedef struct { + uint64_t a_type; + union { + uint64_t a_val; + } a_un; +} Elf64_auxv_t; + +#undef Elf32_Dyn +#undef Elf64_Dyn + +typedef struct { + Elf32_Sword d_tag; + union { + Elf32_Word d_val; + Elf32_Addr d_ptr; + } d_un; +} Elf32_Dyn; + +typedef struct { + Elf64_Sxword d_tag; + union { + Elf64_Xword d_val; + Elf64_Addr d_ptr; + } d_un; +} Elf64_Dyn; + + +// The Android headers don't always define this constant. +#ifndef EM_X86_64 +#define EM_X86_64 62 +#endif + +#ifndef EM_PPC64 +#define EM_PPC64 21 +#endif + +#ifndef EM_S390 +#define EM_S390 22 +#endif + +#if !defined(AT_SYSINFO_EHDR) +#define AT_SYSINFO_EHDR 33 +#endif + +#if !defined(NT_PRSTATUS) +#define NT_PRSTATUS 1 +#endif + +#if !defined(NT_PRPSINFO) +#define NT_PRPSINFO 3 +#endif + +#if !defined(NT_AUXV) +#define NT_AUXV 6 +#endif + +#if !defined(NT_PRXFPREG) +#define NT_PRXFPREG 0x46e62b7f +#endif + +#if !defined(NT_FPREGSET) +#define NT_FPREGSET 2 +#endif + +#if !defined(SHT_MIPS_DWARF) +#define SHT_MIPS_DWARF 0x7000001e +#endif + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ELF_H diff --git a/src/common/android/include/link.h b/src/common/android/include/link.h new file mode 100644 index 0000000..02d2db2 --- /dev/null +++ b/src/common/android/include/link.h @@ -0,0 +1,76 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_ANDROID_INCLUDE_LINK_H +#define GOOGLE_BREAKPAD_ANDROID_INCLUDE_LINK_H + +/* Android doesn't provide all the data-structures required in its . + Provide custom version here. */ +#include_next + +#include + +// TODO(rmcilroy): Remove this file once the NDK API level is updated to at +// least 21 for all architectures. https://crbug.com/358831 + +// These structures are only present in traditional headers at API level 21 and +// above. Unified headers define these structures regardless of the chosen API +// level. __ANDROID_API_N__ is a proxy for determining whether unified headers +// are in use. It’s only defined by unified headers. +#if __ANDROID_API__ < 21 && !defined(__ANDROID_API_N__) + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +struct r_debug { + int r_version; + struct link_map* r_map; + ElfW(Addr) r_brk; + enum { + RT_CONSISTENT, + RT_ADD, + RT_DELETE } r_state; + ElfW(Addr) r_ldbase; +}; + +struct link_map { + ElfW(Addr) l_addr; + char* l_name; + ElfW(Dyn)* l_ld; + struct link_map* l_next; + struct link_map* l_prev; +}; + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // __ANDROID_API__ < 21 && !defined(__ANDROID_API_N__) + +#endif /* GOOGLE_BREAKPAD_ANDROID_INCLUDE_LINK_H */ diff --git a/src/common/android/include/stab.h b/src/common/android/include/stab.h new file mode 100644 index 0000000..2888244 --- /dev/null +++ b/src/common/android/include/stab.h @@ -0,0 +1,99 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_STAB_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_STAB_H + +#include + +#ifdef __BIONIC_HAVE_STAB_H +#include +#else + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +#define _STAB_CODE_LIST \ + _STAB_CODE_DEF(UNDF,0x00) \ + _STAB_CODE_DEF(GSYM,0x20) \ + _STAB_CODE_DEF(FNAME,0x22) \ + _STAB_CODE_DEF(FUN,0x24) \ + _STAB_CODE_DEF(STSYM,0x26) \ + _STAB_CODE_DEF(LCSYM,0x28) \ + _STAB_CODE_DEF(MAIN,0x2a) \ + _STAB_CODE_DEF(PC,0x30) \ + _STAB_CODE_DEF(NSYMS,0x32) \ + _STAB_CODE_DEF(NOMAP,0x34) \ + _STAB_CODE_DEF(OBJ,0x38) \ + _STAB_CODE_DEF(OPT,0x3c) \ + _STAB_CODE_DEF(RSYM,0x40) \ + _STAB_CODE_DEF(M2C,0x42) \ + _STAB_CODE_DEF(SLINE,0x44) \ + _STAB_CODE_DEF(DSLINE,0x46) \ + _STAB_CODE_DEF(BSLINE,0x48) \ + _STAB_CODE_DEF(BROWS,0x48) \ + _STAB_CODE_DEF(DEFD,0x4a) \ + _STAB_CODE_DEF(EHDECL,0x50) \ + _STAB_CODE_DEF(MOD2,0x50) \ + _STAB_CODE_DEF(CATCH,0x54) \ + _STAB_CODE_DEF(SSYM,0x60) \ + _STAB_CODE_DEF(SO,0x64) \ + _STAB_CODE_DEF(LSYM,0x80) \ + _STAB_CODE_DEF(BINCL,0x82) \ + _STAB_CODE_DEF(SOL,0x84) \ + _STAB_CODE_DEF(PSYM,0xa0) \ + _STAB_CODE_DEF(EINCL,0xa2) \ + _STAB_CODE_DEF(ENTRY,0xa4) \ + _STAB_CODE_DEF(LBRAC,0xc0) \ + _STAB_CODE_DEF(EXCL,0xc2) \ + _STAB_CODE_DEF(SCOPE,0xc4) \ + _STAB_CODE_DEF(RBRAC,0xe0) \ + _STAB_CODE_DEF(BCOMM,0xe2) \ + _STAB_CODE_DEF(ECOMM,0xe4) \ + _STAB_CODE_DEF(ECOML,0xe8) \ + _STAB_CODE_DEF(NBTEXT,0xf0) \ + _STAB_CODE_DEF(NBDATA,0xf2) \ + _STAB_CODE_DEF(NBBSS,0xf4) \ + _STAB_CODE_DEF(NBSTS,0xf6) \ + _STAB_CODE_DEF(NBLCS,0xf8) \ + _STAB_CODE_DEF(LENG,0xfe) + +enum __stab_debug_code { +#define _STAB_CODE_DEF(x,y) N_##x = y, +_STAB_CODE_LIST +#undef _STAB_CODE_DEF +}; + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // __BIONIC_HAVE_STAB_H + +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_STAB_H diff --git a/src/common/android/include/sys/procfs.h b/src/common/android/include/sys/procfs.h new file mode 100644 index 0000000..f7ff977 --- /dev/null +++ b/src/common/android/include/sys/procfs.h @@ -0,0 +1,123 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_SYS_PROCFS_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_SYS_PROCFS_H + +#ifdef __BIONIC_HAVE_SYS_PROCFS_H + +#include_next + +#else + +#include +#include +#if defined (__mips__) +#include +#endif +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +#if defined(__x86_64__) || defined(__aarch64__) +typedef unsigned long long elf_greg_t; +#else +typedef unsigned long elf_greg_t; +#endif + +#ifdef __arm__ +#define ELF_NGREG (sizeof(struct user_regs) / sizeof(elf_greg_t)) +#elif defined(__aarch64__) +#define ELF_NGREG (sizeof(struct user_pt_regs) / sizeof(elf_greg_t)) +#elif defined(__mips__) +#define ELF_NGREG 45 +#else +#define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t)) +#endif + +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + +struct elf_siginfo { + int si_signo; + int si_code; + int si_errno; +}; + +struct elf_prstatus { + struct elf_siginfo pr_info; + short pr_cursig; + unsigned long pr_sigpend; + unsigned long pr_sighold; + pid_t pr_pid; + pid_t pr_ppid; + pid_t pr_pgrp; + pid_t pd_sid; + struct timeval pr_utime; + struct timeval pr_stime; + struct timeval pr_cutime; + struct timeval pr_cstime; + elf_gregset_t pr_reg; + int pr_fpvalid; +}; + +#define ELF_PRARGSZ 80 + +struct elf_prpsinfo { + char pr_state; + char pr_sname; + char pr_zomb; + char pr_nice; + unsigned long pr_flags; +#ifdef __x86_64__ + unsigned int pr_uid; + unsigned int pr_gid; +#elif defined(__mips__) + __kernel_uid_t pr_uid; + __kernel_gid_t pr_gid; +#else + unsigned short pr_uid; + unsigned short pr_gid; +#endif + int pr_pid; + int pr_ppid; + int pr_pgrp; + int pr_sid; + char pr_fname[16]; + char pr_psargs[ELF_PRARGSZ]; +}; + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // __BIONIC_HAVE_SYS_PROCFS_H + +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_SYS_PROCFS_H diff --git a/src/common/android/include/sys/user.h b/src/common/android/include/sys/user.h new file mode 100644 index 0000000..021ec90 --- /dev/null +++ b/src/common/android/include/sys/user.h @@ -0,0 +1,68 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_USER_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_USER_H + +// The purpose of this file is to glue the mismatching headers (Android NDK vs +// glibc) and therefore avoid doing otherwise awkward #ifdefs in the code. +// The following quirks are currently handled by this file: +// - i386: Use the Android NDK but alias user_fxsr_struct > user_fpxregs_struct. + +// TODO(primiano): remove these changes after Chromium has stably rolled to +// an NDK with the appropriate fixes. https://crbug.com/358831 + +// With traditional headers, forgot to do this. Unified headers get +// it right. +#include + +#include_next + +#include + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +#if defined(__i386__) +#if __ANDROID_API__ < 21 && !defined(__ANDROID_API_N__) + +// user_fpxregs_struct was called user_fxsr_struct in traditional headers before +// API level 21. Unified headers call it user_fpxregs_struct regardless of the +// chosen API level. __ANDROID_API_N__ is a proxy for determining whether +// unified headers are in use. It’s only defined by unified headers. +typedef struct user_fxsr_struct user_fpxregs_struct; + +#endif // __ANDROID_API__ < 21 && !defined(__ANDROID_API_N__) +#endif // defined(__i386__) + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_USER_H diff --git a/src/common/android/testing/include/wchar.h b/src/common/android/testing/include/wchar.h new file mode 100644 index 0000000..aa17c73 --- /dev/null +++ b/src/common/android/testing/include/wchar.h @@ -0,0 +1,75 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Android doesn't provide wcscasecmp(), so provide an alternative here. +// +// Note that this header is not needed when Breakpad is compiled against +// a recent version of Googletest. It shall be considered for removal once +// src/testing/ is updated to an appropriate revision in the future. + +#ifndef GOOGLEBREAKPAD_COMMON_ANDROID_INCLUDE_WCHAR_H +#define GOOGLEBREAKPAD_COMMON_ANDROID_INCLUDE_WCHAR_H + +#include_next + +#if !defined(__aarch64__) && !defined(__x86_64__) && \ + !(defined(__mips__) && _MIPS_SIM == _ABI64) + +// This needs to be in an extern "C" namespace, or Googletest will not +// compile against it. +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +static wchar_t inline wcstolower(wchar_t ch) { + if (ch >= L'a' && ch <= L'A') + ch -= L'a' - L'A'; + return ch; +} + +static int inline wcscasecmp(const wchar_t* s1, const wchar_t* s2) { + for (;;) { + wchar_t c1 = wcstolower(*s1); + wchar_t c2 = wcstolower(*s2); + if (c1 < c2) + return -1; + if (c1 > c2) + return 1; + if (c1 == L'0') + return 0; + s1++; + s2++; + } +} + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus +#endif + +#endif // GOOGLEBREAKPAD_COMMON_ANDROID_INCLUDE_WCHAR_H diff --git a/src/common/android/testing/mkdtemp.h b/src/common/android/testing/mkdtemp.h new file mode 100644 index 0000000..f05cf65 --- /dev/null +++ b/src/common/android/testing/mkdtemp.h @@ -0,0 +1,109 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// mkdtemp() wasn't declared in until NDK r9b due to a simple +// packaging bug (the function has always been implemented in all versions +// of the C library). This header is provided to build Breakpad with earlier +// NDK revisions (e.g. the one used by Chromium). It may be removed in the +// future once all major projects upgrade to use a more recent NDK. +// +// The reason this is inlined here is to avoid linking a new object file +// into each unit test program (i.e. keep build files simple). + +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_MKDTEMP_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_MKDTEMP_H + +#include +#include +#include +#include +#include +#include + +// Using a macro renaming trick here is necessary when building against +// NDK r9b. Otherwise the compiler will complain that calls to mkdtemp() +// are ambiguous. +#define mkdtemp breakpad_mkdtemp + +namespace { + +char* breakpad_mkdtemp(char* path) { + if (path == NULL) { + errno = EINVAL; + return NULL; + } + + // 'path' must be terminated with six 'X' + const char kSuffix[] = "XXXXXX"; + const size_t kSuffixLen = strlen(kSuffix); + char* path_end = path + strlen(path); + + if (static_cast(path_end - path) < kSuffixLen || + memcmp(path_end - kSuffixLen, kSuffix, kSuffixLen) != 0) { + errno = EINVAL; + return NULL; + } + + // If 'path' contains a directory separator, check that it exists to + // avoid looping later. + char* sep = strrchr(path, '/'); + if (sep != NULL) { + struct stat st; + int ret; + *sep = '\0'; // temporarily zero-terminate the dirname. + ret = stat(path, &st); + *sep = '/'; // restore full path. + if (ret < 0) + return NULL; + if (!S_ISDIR(st.st_mode)) { + errno = ENOTDIR; + return NULL; + } + } + + // Loop. On each iteration, replace the XXXXXX suffix with a random + // number. + int tries; + for (tries = 128; tries > 0; tries--) { + int random = rand() % 1000000; + + snprintf(path_end - kSuffixLen, kSuffixLen + 1, "%0d", random); + if (mkdir(path, 0700) == 0) + return path; // Success + + if (errno != EEXIST) + return NULL; + } + + assert(errno == EEXIST); + return NULL; +} + +} // namespace + +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_MKDTEMP_H diff --git a/src/common/android/testing/pthread_fixes.h b/src/common/android/testing/pthread_fixes.h new file mode 100644 index 0000000..04bf636 --- /dev/null +++ b/src/common/android/testing/pthread_fixes.h @@ -0,0 +1,93 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This contains Pthread-related functions not provided by the Android NDK +// but required by the Breakpad unit test. The functions are inlined here +// in a C++ anonymous namespace in order to keep the build files simples. + +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_PTHREAD_FIXES_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_PTHREAD_FIXES_H + +#include + +namespace { + +// Android doesn't provide pthread_barrier_t for now. +#ifndef PTHREAD_BARRIER_SERIAL_THREAD + +// Anything except 0 will do here. +#define PTHREAD_BARRIER_SERIAL_THREAD 0x12345 + +typedef struct { + pthread_mutex_t mutex; + pthread_cond_t cond; + unsigned count; +} pthread_barrier_t; + +int pthread_barrier_init(pthread_barrier_t* barrier, + const void* /* barrier_attr */, + unsigned count) { + barrier->count = count; + pthread_mutex_init(&barrier->mutex, NULL); + pthread_cond_init(&barrier->cond, NULL); + return 0; +} + +int pthread_barrier_wait(pthread_barrier_t* barrier) { + // Lock the mutex + pthread_mutex_lock(&barrier->mutex); + // Decrement the count. If this is the first thread to reach 0, wake up + // waiters, unlock the mutex, then return PTHREAD_BARRIER_SERIAL_THREAD. + if (--barrier->count == 0) { + // First thread to reach the barrier + pthread_cond_broadcast(&barrier->cond); + pthread_mutex_unlock(&barrier->mutex); + return PTHREAD_BARRIER_SERIAL_THREAD; + } + // Otherwise, wait for other threads until the count reaches 0, then + // return 0 to indicate this is not the first thread. + do { + pthread_cond_wait(&barrier->cond, &barrier->mutex); + } while (barrier->count > 0); + + pthread_mutex_unlock(&barrier->mutex); + return 0; +} + +int pthread_barrier_destroy(pthread_barrier_t* barrier) { + barrier->count = 0; + pthread_cond_destroy(&barrier->cond); + pthread_mutex_destroy(&barrier->mutex); + return 0; +} + +#endif // defined(PTHREAD_BARRIER_SERIAL_THREAD) + +} // namespace + +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_TESTING_PTHREAD_FIXES_H diff --git a/src/common/basictypes.h b/src/common/basictypes.h new file mode 100644 index 0000000..79c9b77 --- /dev/null +++ b/src/common/basictypes.h @@ -0,0 +1,49 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_BASICTYPES_H_ +#define COMMON_BASICTYPES_H_ + +namespace google_breakpad { + +// Used to explicitly mark the return value of a function as unused. If you are +// really sure you don't want to do anything with the return value of a function +// that has been marked with __attribute__((warn_unused_result)), wrap it with +// this. Example: +// +// scoped_ptr my_var = ...; +// if (TakeOwnership(my_var.get()) == SUCCESS) +// ignore_result(my_var.release()); +// +template +inline void ignore_result(const T&) { +} + +} // namespace google_breakpad + +#endif // COMMON_BASICTYPES_H_ diff --git a/src/common/byte_cursor.h b/src/common/byte_cursor.h new file mode 100644 index 0000000..fd0e45f --- /dev/null +++ b/src/common/byte_cursor.h @@ -0,0 +1,265 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// byte_cursor.h: Classes for parsing values from a buffer of bytes. +// The ByteCursor class provides a convenient interface for reading +// fixed-size integers of arbitrary endianness, being thorough about +// checking for buffer overruns. + +#ifndef COMMON_BYTE_CURSOR_H_ +#define COMMON_BYTE_CURSOR_H_ + +#include +#include +#include +#include +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +// A buffer holding a series of bytes. +struct ByteBuffer { + ByteBuffer() : start(0), end(0) { } + ByteBuffer(const uint8_t* set_start, size_t set_size) + : start(set_start), end(set_start + set_size) { } + ~ByteBuffer() { }; + + // Equality operators. Useful in unit tests, and when we're using + // ByteBuffers to refer to regions of a larger buffer. + bool operator==(const ByteBuffer& that) const { + return start == that.start && end == that.end; + } + bool operator!=(const ByteBuffer& that) const { + return start != that.start || end != that.end; + } + + // Not C++ style guide compliant, but this definitely belongs here. + size_t Size() const { + assert(start <= end); + return end - start; + } + + const uint8_t* start; + const uint8_t* end; +}; + +// A cursor pointing into a ByteBuffer that can parse numbers of various +// widths and representations, strings, and data blocks, advancing through +// the buffer as it goes. All ByteCursor operations check that accesses +// haven't gone beyond the end of the enclosing ByteBuffer. +class ByteCursor { + public: + // Create a cursor reading bytes from the start of BUFFER. By default, the + // cursor reads multi-byte values in little-endian form. + ByteCursor(const ByteBuffer* buffer, bool big_endian = false) + : buffer_(buffer), here_(buffer->start), + big_endian_(big_endian), complete_(true) { } + + // Accessor and setter for this cursor's endianness flag. + bool big_endian() const { return big_endian_; } + void set_big_endian(bool big_endian) { big_endian_ = big_endian; } + + // Accessor and setter for this cursor's current position. The setter + // returns a reference to this cursor. + const uint8_t* here() const { return here_; } + ByteCursor& set_here(const uint8_t* here) { + assert(buffer_->start <= here && here <= buffer_->end); + here_ = here; + return *this; + } + + // Return the number of bytes available to read at the cursor. + size_t Available() const { return size_t(buffer_->end - here_); } + + // Return true if this cursor is at the end of its buffer. + bool AtEnd() const { return Available() == 0; } + + // When used as a boolean value this cursor converts to true if all + // prior reads have been completed, or false if we ran off the end + // of the buffer. + operator bool() const { return complete_; } + + // Read a SIZE-byte integer at this cursor, signed if IS_SIGNED is true, + // unsigned otherwise, using the cursor's established endianness, and set + // *RESULT to the number. If we read off the end of our buffer, clear + // this cursor's complete_ flag, and store a dummy value in *RESULT. + // Return a reference to this cursor. + template + ByteCursor& Read(size_t size, bool is_signed, T* result) { + if (CheckAvailable(size)) { + T v = 0; + if (big_endian_) { + for (size_t i = 0; i < size; i++) + v = (v << 8) + here_[i]; + } else { + // This loop condition looks weird, but size_t is unsigned, so + // decrementing i after it is zero yields the largest size_t value. + for (size_t i = size - 1; i < size; i--) + v = (v << 8) + here_[i]; + } + if (is_signed && size < sizeof(T)) { + size_t sign_bit = (T)1 << (size * 8 - 1); + v = (v ^ sign_bit) - sign_bit; + } + here_ += size; + *result = v; + } else { + *result = (T) 0xdeadbeef; + } + return *this; + } + + // Read an integer, using the cursor's established endianness and + // *RESULT's size and signedness, and set *RESULT to the number. If we + // read off the end of our buffer, clear this cursor's complete_ flag. + // Return a reference to this cursor. + template + ByteCursor& operator>>(T& result) { + bool T_is_signed = (T)-1 < 0; + return Read(sizeof(T), T_is_signed, &result); + } + + // Copy the SIZE bytes at the cursor to BUFFER, and advance this + // cursor to the end of them. If we read off the end of our buffer, + // clear this cursor's complete_ flag, and set *POINTER to NULL. + // Return a reference to this cursor. + ByteCursor& Read(uint8_t* buffer, size_t size) { + if (CheckAvailable(size)) { + memcpy(buffer, here_, size); + here_ += size; + } + return *this; + } + + // Set STR to a copy of the '\0'-terminated string at the cursor. If the + // byte buffer does not contain a terminating zero, clear this cursor's + // complete_ flag, and set STR to the empty string. Return a reference to + // this cursor. + ByteCursor& CString(string* str) { + const uint8_t* end + = static_cast(memchr(here_, '\0', Available())); + if (end) { + str->assign(reinterpret_cast(here_), end - here_); + here_ = end + 1; + } else { + str->clear(); + here_ = buffer_->end; + complete_ = false; + } + return *this; + } + + // Like CString(STR), but extract the string from a fixed-width buffer + // LIMIT bytes long, which may or may not contain a terminating '\0' + // byte. Specifically: + // + // - If there are not LIMIT bytes available at the cursor, clear the + // cursor's complete_ flag and set STR to the empty string. + // + // - Otherwise, if the LIMIT bytes at the cursor contain any '\0' + // characters, set *STR to a copy of the bytes before the first '\0', + // and advance the cursor by LIMIT bytes. + // + // - Otherwise, set *STR to a copy of those LIMIT bytes, and advance the + // cursor by LIMIT bytes. + ByteCursor& CString(string* str, size_t limit) { + if (CheckAvailable(limit)) { + const uint8_t* end + = static_cast(memchr(here_, '\0', limit)); + if (end) + str->assign(reinterpret_cast(here_), end - here_); + else + str->assign(reinterpret_cast(here_), limit); + here_ += limit; + } else { + str->clear(); + } + return *this; + } + + // Set *POINTER to point to the SIZE bytes at the cursor, and advance + // this cursor to the end of them. If SIZE is omitted, don't move the + // cursor. If we read off the end of our buffer, clear this cursor's + // complete_ flag, and set *POINTER to NULL. Return a reference to this + // cursor. + ByteCursor& PointTo(const uint8_t** pointer, size_t size = 0) { + if (CheckAvailable(size)) { + *pointer = here_; + here_ += size; + } else { + *pointer = NULL; + } + return *this; + } + + // Skip SIZE bytes at the cursor. If doing so would advance us off + // the end of our buffer, clear this cursor's complete_ flag, and + // set *POINTER to NULL. Return a reference to this cursor. + ByteCursor& Skip(size_t size) { + if (CheckAvailable(size)) + here_ += size; + return *this; + } + + private: + // If there are at least SIZE bytes available to read from the buffer, + // return true. Otherwise, set here_ to the end of the buffer, set + // complete_ to false, and return false. + bool CheckAvailable(size_t size) { + if (Available() >= size) { + return true; + } else { + here_ = buffer_->end; + complete_ = false; + return false; + } + } + + // The buffer we're reading bytes from. + const ByteBuffer* buffer_; + + // The next byte within buffer_ that we'll read. + const uint8_t* here_; + + // True if we should read numbers in big-endian form; false if we + // should read in little-endian form. + bool big_endian_; + + // True if we've been able to read all we've been asked to. + bool complete_; +}; + +} // namespace google_breakpad + +#endif // COMMON_BYTE_CURSOR_H_ diff --git a/src/common/byte_cursor_unittest.cc b/src/common/byte_cursor_unittest.cc new file mode 100644 index 0000000..41180ca --- /dev/null +++ b/src/common/byte_cursor_unittest.cc @@ -0,0 +1,779 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// byte_cursor_unittest.cc: Unit tests for google_breakpad::ByteBuffer +// and google_breakpad::ByteCursor. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "common/byte_cursor.h" +#include "common/using_std_string.h" + +using google_breakpad::ByteBuffer; +using google_breakpad::ByteCursor; + +TEST(Buffer, SizeOfNothing) { + uint8_t data[1]; + ByteBuffer buffer(data, 0); + EXPECT_EQ(0U, buffer.Size()); +} + +TEST(Buffer, SizeOfSomething) { + uint8_t data[10]; + ByteBuffer buffer(data, sizeof(data)); + EXPECT_EQ(10U, buffer.Size()); +} + +TEST(Extent, AvailableEmpty) { + uint8_t data[1]; + ByteBuffer buffer(data, 0); + ByteCursor cursor(&buffer); + EXPECT_EQ(0U, cursor.Available()); +} + +TEST(Extent, AtEndEmpty) { + uint8_t data[1]; + ByteBuffer buffer(data, 0); + ByteCursor cursor(&buffer); + EXPECT_TRUE(cursor.AtEnd()); +} + +TEST(Extent, AsBoolEmpty) { + uint8_t data[1]; + ByteBuffer buffer(data, 0); + ByteCursor cursor(&buffer); + EXPECT_TRUE(cursor); +} + +TEST(Extent, AvailableSome) { + uint8_t data[10]; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + EXPECT_EQ(10U, cursor.Available()); +} + +TEST(Extent, AtEndSome) { + uint8_t data[10]; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + EXPECT_FALSE(cursor.AtEnd()); + EXPECT_TRUE(cursor.Skip(sizeof(data)).AtEnd()); +} + +TEST(Extent, AsBoolSome) { + uint8_t data[10]; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + EXPECT_TRUE(cursor); + EXPECT_TRUE(cursor.Skip(sizeof(data))); + EXPECT_FALSE(cursor.Skip(1)); +} + +TEST(Extent, Cursor) { + uint8_t data[] = { 0xf7, + 0x9f, 0xbe, + 0x67, 0xfb, 0xd3, 0x58, + 0x6f, 0x36, 0xde, 0xd1, + 0x2a, 0x2a, 0x2a }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + + uint8_t a; + uint16_t b; + uint32_t c; + uint32_t d; + uint8_t stars[3]; + + EXPECT_EQ(data + 0U, cursor.here()); + + EXPECT_TRUE(cursor >> a); + EXPECT_EQ(data + 1U, cursor.here()); + + EXPECT_TRUE(cursor >> b); + EXPECT_EQ(data + 3U, cursor.here()); + + EXPECT_TRUE(cursor >> c); + EXPECT_EQ(data + 7U, cursor.here()); + + EXPECT_TRUE(cursor.Skip(4)); + EXPECT_EQ(data + 11U, cursor.here()); + + EXPECT_TRUE(cursor.Read(stars, 3)); + EXPECT_EQ(data + 14U, cursor.here()); + + EXPECT_FALSE(cursor >> d); + EXPECT_EQ(data + 14U, cursor.here()); +} + +TEST(Extent, SetOffset) { + uint8_t data[] = { 0x5c, 0x79, 0x8c, 0xd5 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + + uint8_t a, b, c, d, e; + EXPECT_TRUE(cursor >> a); + EXPECT_EQ(0x5cU, a); + EXPECT_EQ(data + 1U, cursor.here()); + EXPECT_TRUE(((cursor >> b).set_here(data + 3) >> c).set_here(data + 1) + >> d >> e); + EXPECT_EQ(0x79U, b); + EXPECT_EQ(0xd5U, c); + EXPECT_EQ(0x79U, d); + EXPECT_EQ(0x8cU, e); + EXPECT_EQ(data + 3U, cursor.here()); +} + +TEST(BigEndian, Signed1) { + uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + cursor.set_big_endian(true); + int a, b, c, d, e; + ASSERT_TRUE(cursor + .Read(1, true, &a) + .Read(1, true, &b) + .Read(1, true, &c) + .Read(1, true, &d)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x7f, b); + EXPECT_EQ(-0x80, c); + EXPECT_EQ(-1, d); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(1, true, &e)); +} + +TEST(BigEndian, Signed2) { + uint8_t data[] = { 0x00, 0x00, 0x00, 0x80, 0x7f, 0xff, + 0x80, 0x00, 0x80, 0x80, 0xff, 0xff, + 0x39, 0xf1, 0x8a, 0xbc, 0x5a, 0xec }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer, true); + int a, b, c, d, e, f, g, h, i, j; + ASSERT_TRUE(cursor + .Read(2, true, &a) + .Read(2, true, &b) + .Read(2, true, &c) + .Read(2, true, &d) + .Read(2, true, &e) + .Read(2, true, &f) + .Read(2, true, &g) + .Read(2, true, &h) + .Read(2, true, &i)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x80, b); + EXPECT_EQ(0x7fff, c); + EXPECT_EQ(-0x8000, d); + EXPECT_EQ(-0x7f80, e); + EXPECT_EQ(-1, f); + EXPECT_EQ(0x39f1, g); + EXPECT_EQ(-0x7544, h); + EXPECT_EQ(0x5aec, i); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(2, true, &j)); +} + +TEST(BigEndian, Signed4) { + uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xff, 0xff, 0xff, + 0x80, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, + 0xb6, 0xb1, 0xff, 0xef, + 0x19, 0x6a, 0xca, 0x46 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + cursor.set_big_endian(true); + int64_t a, b, c, d, e, f, g; + ASSERT_TRUE(cursor + .Read(4, true, &a) + .Read(4, true, &b) + .Read(4, true, &c) + .Read(4, true, &d) + .Read(4, true, &e) + .Read(4, true, &f)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x7fffffff, b); + EXPECT_EQ(-0x80000000LL, c); + EXPECT_EQ(-1, d); + EXPECT_EQ((int32_t) 0xb6b1ffef, e); + EXPECT_EQ(0x196aca46, f); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(4, true, &g)); +} + +TEST(BigEndian, Signed8) { + uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x93, 0x20, 0xd5, 0xe9, 0xd2, 0xd5, 0x87, 0x9c, + 0x4e, 0x42, 0x49, 0xd2, 0x7f, 0x84, 0x14, 0xa4 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer, true); + int64_t a, b, c, d, e, f, g; + ASSERT_TRUE(cursor + .Read(8, true, &a) + .Read(8, true, &b) + .Read(8, true, &c) + .Read(8, true, &d) + .Read(8, true, &e) + .Read(8, true, &f)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x7fffffffffffffffLL, b); + EXPECT_EQ(-0x7fffffffffffffffLL - 1, c); + EXPECT_EQ(-1, d); + EXPECT_EQ((int64_t) 0x9320d5e9d2d5879cULL, e); + EXPECT_EQ(0x4e4249d27f8414a4LL, f); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(8, true, &g)); +} + +TEST(BigEndian, Unsigned1) { + uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + cursor.set_big_endian(true); + int32_t a, b, c, d, e; + ASSERT_TRUE(cursor + .Read(1, false, &a) + .Read(1, false, &b) + .Read(1, false, &c) + .Read(1, false, &d)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x7f, b); + EXPECT_EQ(0x80, c); + EXPECT_EQ(0xff, d); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(1, false, &e)); +} + +TEST(BigEndian, Unsigned2) { + uint8_t data[] = { 0x00, 0x00, 0x00, 0x80, 0x7f, 0xff, + 0x80, 0x00, 0x80, 0x80, 0xff, 0xff, + 0x39, 0xf1, 0x8a, 0xbc, 0x5a, 0xec }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer, true); + int64_t a, b, c, d, e, f, g, h, i, j; + ASSERT_TRUE(cursor + .Read(2, false, &a) + .Read(2, false, &b) + .Read(2, false, &c) + .Read(2, false, &d) + .Read(2, false, &e) + .Read(2, false, &f) + .Read(2, false, &g) + .Read(2, false, &h) + .Read(2, false, &i)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x80, b); + EXPECT_EQ(0x7fff, c); + EXPECT_EQ(0x8000, d); + EXPECT_EQ(0x8080, e); + EXPECT_EQ(0xffff, f); + EXPECT_EQ(0x39f1, g); + EXPECT_EQ(0x8abc, h); + EXPECT_EQ(0x5aec, i); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(2, false, &j)); +} + +TEST(BigEndian, Unsigned4) { + uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xff, 0xff, 0xff, + 0x80, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, + 0xb6, 0xb1, 0xff, 0xef, + 0x19, 0x6a, 0xca, 0x46 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + cursor.set_big_endian(true); + int64_t a, b, c, d, e, f, g; + ASSERT_TRUE(cursor + .Read(4, false, &a) + .Read(4, false, &b) + .Read(4, false, &c) + .Read(4, false, &d) + .Read(4, false, &e) + .Read(4, false, &f)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x7fffffff, b); + EXPECT_EQ(0x80000000, c); + EXPECT_EQ(0xffffffff, d); + EXPECT_EQ(0xb6b1ffef, e); + EXPECT_EQ(0x196aca46, f); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(4, false, &g)); +} + +TEST(BigEndian, Unsigned8) { + uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x93, 0x20, 0xd5, 0xe9, 0xd2, 0xd5, 0x87, 0x9c, + 0x4e, 0x42, 0x49, 0xd2, 0x7f, 0x84, 0x14, 0xa4 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer, true); + uint64_t a, b, c, d, e, f, g; + ASSERT_TRUE(cursor + .Read(8, false, &a) + .Read(8, false, &b) + .Read(8, false, &c) + .Read(8, false, &d) + .Read(8, false, &e) + .Read(8, false, &f)); + EXPECT_EQ(0U, a); + EXPECT_EQ(0x7fffffffffffffffULL, b); + EXPECT_EQ(0x8000000000000000ULL, c); + EXPECT_EQ(0xffffffffffffffffULL, d); + EXPECT_EQ(0x9320d5e9d2d5879cULL, e); + EXPECT_EQ(0x4e4249d27f8414a4ULL, f); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(8, false, &g)); +} + +TEST(LittleEndian, Signed1) { + uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + int32_t a, b, c, d, e; + ASSERT_TRUE(cursor + .Read(1, true, &a) + .Read(1, true, &b) + .Read(1, true, &c) + .Read(1, true, &d)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x7f, b); + EXPECT_EQ(-0x80, c); + EXPECT_EQ(-1, d); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(1, true, &e)); +} + +TEST(LittleEndian, Signed2) { + uint8_t data[] = { 0x00, 0x00, 0x80, 0x00, 0xff, 0x7f, + 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, + 0xf1, 0x39, 0xbc, 0x8a, 0xec, 0x5a }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer, false); + int32_t a, b, c, d, e, f, g, h, i, j; + ASSERT_TRUE(cursor + .Read(2, true, &a) + .Read(2, true, &b) + .Read(2, true, &c) + .Read(2, true, &d) + .Read(2, true, &e) + .Read(2, true, &f) + .Read(2, true, &g) + .Read(2, true, &h) + .Read(2, true, &i)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x80, b); + EXPECT_EQ(0x7fff, c); + EXPECT_EQ(-0x8000, d); + EXPECT_EQ(-0x7f80, e); + EXPECT_EQ(-1, f); + EXPECT_EQ(0x39f1, g); + EXPECT_EQ(-0x7544, h); + EXPECT_EQ(0x5aec, i); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(2, true, &j)); +} + +TEST(LittleEndian, Signed4) { + uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xb1, 0xb6, + 0x46, 0xca, 0x6a, 0x19 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + int64_t a, b, c, d, e, f, g; + ASSERT_TRUE(cursor + .Read(4, true, &a) + .Read(4, true, &b) + .Read(4, true, &c) + .Read(4, true, &d) + .Read(4, true, &e) + .Read(4, true, &f)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x7fffffff, b); + EXPECT_EQ(-0x80000000LL, c); + EXPECT_EQ(-1, d); + EXPECT_EQ((int32_t) 0xb6b1ffef, e); + EXPECT_EQ(0x196aca46, f); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(4, true, &g)); +} + +TEST(LittleEndian, Signed8) { + uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9c, 0x87, 0xd5, 0xd2, 0xe9, 0xd5, 0x20, 0x93, + 0xa4, 0x14, 0x84, 0x7f, 0xd2, 0x49, 0x42, 0x4e }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer, false); + int64_t a, b, c, d, e, f, g; + ASSERT_TRUE(cursor + .Read(8, true, &a) + .Read(8, true, &b) + .Read(8, true, &c) + .Read(8, true, &d) + .Read(8, true, &e) + .Read(8, true, &f)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x7fffffffffffffffLL, b); + EXPECT_EQ(-0x7fffffffffffffffLL - 1, c); + EXPECT_EQ(-1, d); + EXPECT_EQ((int64_t) 0x9320d5e9d2d5879cULL, e); + EXPECT_EQ(0x4e4249d27f8414a4LL, f); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(8, true, &g)); +} + +TEST(LittleEndian, Unsigned1) { + uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + int32_t a, b, c, d, e; + ASSERT_TRUE(cursor + .Read(1, false, &a) + .Read(1, false, &b) + .Read(1, false, &c) + .Read(1, false, &d)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x7f, b); + EXPECT_EQ(0x80, c); + EXPECT_EQ(0xff, d); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(1, false, &e)); +} + +TEST(LittleEndian, Unsigned2) { + uint8_t data[] = { 0x00, 0x00, 0x80, 0x00, 0xff, 0x7f, + 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, + 0xf1, 0x39, 0xbc, 0x8a, 0xec, 0x5a }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + int32_t a, b, c, d, e, f, g, h, i, j; + ASSERT_TRUE(cursor + .Read(2, false, &a) + .Read(2, false, &b) + .Read(2, false, &c) + .Read(2, false, &d) + .Read(2, false, &e) + .Read(2, false, &f) + .Read(2, false, &g) + .Read(2, false, &h) + .Read(2, false, &i)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x80, b); + EXPECT_EQ(0x7fff, c); + EXPECT_EQ(0x8000, d); + EXPECT_EQ(0x8080, e); + EXPECT_EQ(0xffff, f); + EXPECT_EQ(0x39f1, g); + EXPECT_EQ(0x8abc, h); + EXPECT_EQ(0x5aec, i); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(2, false, &j)); +} + +TEST(LittleEndian, Unsigned4) { + uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xb1, 0xb6, + 0x46, 0xca, 0x6a, 0x19 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + int64_t a, b, c, d, e, f, g; + ASSERT_TRUE(cursor + .Read(4, false, &a) + .Read(4, false, &b) + .Read(4, false, &c) + .Read(4, false, &d) + .Read(4, false, &e) + .Read(4, false, &f)); + EXPECT_EQ(0, a); + EXPECT_EQ(0x7fffffff, b); + EXPECT_EQ(0x80000000, c); + EXPECT_EQ(0xffffffff, d); + EXPECT_EQ(0xb6b1ffef, e); + EXPECT_EQ(0x196aca46, f); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(4, false, &g)); +} + +TEST(LittleEndian, Unsigned8) { + uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9c, 0x87, 0xd5, 0xd2, 0xe9, 0xd5, 0x20, 0x93, + 0xa4, 0x14, 0x84, 0x7f, 0xd2, 0x49, 0x42, 0x4e }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + uint64_t a, b, c, d, e, f, g; + ASSERT_TRUE(cursor + .Read(8, false, &a) + .Read(8, false, &b) + .Read(8, false, &c) + .Read(8, false, &d) + .Read(8, false, &e) + .Read(8, false, &f)); + EXPECT_EQ(0U, a); + EXPECT_EQ(0x7fffffffffffffffULL, b); + EXPECT_EQ(0x8000000000000000ULL, c); + EXPECT_EQ(0xffffffffffffffffULL, d); + EXPECT_EQ(0x9320d5e9d2d5879cULL, e); + EXPECT_EQ(0x4e4249d27f8414a4ULL, f); + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor.Read(8, false, &g)); +} + +TEST(Extractor, Signed1) { + uint8_t data[] = { 0xfd }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + int8_t a; + EXPECT_TRUE(cursor >> a); + EXPECT_EQ(-3, a); + EXPECT_FALSE(cursor >> a); +} + +TEST(Extractor, Signed2) { + uint8_t data[] = { 0x13, 0xcd }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + int16_t a; + EXPECT_TRUE(cursor >> a); + EXPECT_EQ(-13037, a); + EXPECT_FALSE(cursor >> a); +} + +TEST(Extractor, Signed4) { + uint8_t data[] = { 0xd2, 0xe4, 0x53, 0xe9 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + int32_t a; + // For some reason, G++ 4.4.1 complains: + // warning: array subscript is above array bounds + // in ByteCursor::Read(size_t, bool, T*) as it inlines this call, but + // I'm not able to see how such a reference would occur. + EXPECT_TRUE(cursor >> a); + EXPECT_EQ(-380377902, a); + EXPECT_FALSE(cursor >> a); +} + +TEST(Extractor, Unsigned1) { + uint8_t data[] = { 0xfd }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + uint8_t a; + EXPECT_TRUE(cursor >> a); + EXPECT_EQ(0xfd, a); + EXPECT_FALSE(cursor >> a); +} + +TEST(Extractor, Unsigned2) { + uint8_t data[] = { 0x13, 0xcd }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + uint16_t a; + EXPECT_TRUE(cursor >> a); + EXPECT_EQ(0xcd13, a); + EXPECT_FALSE(cursor >> a); +} + +TEST(Extractor, Unsigned4) { + uint8_t data[] = { 0xd2, 0xe4, 0x53, 0xe9 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + uint32_t a; + // For some reason, G++ 4.4.1 complains: + // warning: array subscript is above array bounds + // in ByteCursor::Read(size_t, bool, T*) as it inlines this call, but + // I'm not able to see how such a reference would occur. + EXPECT_TRUE(cursor >> a); + EXPECT_EQ(0xe953e4d2, a); + EXPECT_FALSE(cursor >> a); + EXPECT_FALSE(cursor >> a); +} + +TEST(Extractor, Mixed) { + uint8_t data[] = { 0x42, + 0x25, 0x0b, + 0x3d, 0x25, 0xed, 0x2a, + 0xec, 0x16, 0x9e, 0x14, 0x61, 0x5b, 0x2c, 0xcf, + 0xd8, + 0x22, 0xa5, + 0x3a, 0x02, 0x6a, 0xd7, + 0x93, 0x2a, 0x2d, 0x8d, 0xb4, 0x95, 0xe0, 0xc6 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + cursor.set_big_endian(true); + + uint8_t a; + uint16_t b; + uint32_t c; + uint64_t d; + int8_t e; + int16_t f; + int32_t g; + int64_t h; + int z; + EXPECT_FALSE(cursor.AtEnd()); + EXPECT_TRUE(cursor >> a >> b >> c >> d >> e >> f >> g >> h); + EXPECT_EQ(0x42U, a); + EXPECT_EQ(0x250bU, b); + EXPECT_EQ(0x3d25ed2aU, c); + EXPECT_EQ(0xec169e14615b2ccfULL, d); + EXPECT_EQ(-40, e); + EXPECT_EQ(0x22a5, f); + EXPECT_EQ(0x3a026ad7, g); + EXPECT_EQ(-7842405714468937530LL, h); + + EXPECT_TRUE(cursor.AtEnd()); + EXPECT_FALSE(cursor >> z); +} + +TEST(Strings, Zero) { + uint8_t data[] = { 0xa6 }; + ByteBuffer buffer(data, 0); + ByteCursor cursor(&buffer); + + uint8_t received[1]; + received[0] = 0xc2; + EXPECT_TRUE(cursor.Read(received, 0)); + EXPECT_EQ(0xc2U, received[0]); +} + +TEST(Strings, Some) { + uint8_t data[] = { 0x5d, 0x31, 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xbb }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + + uint8_t received[7] = { 0xa7, 0xf7, 0x43, 0x0c, 0x27, 0xea, 0xed }; + EXPECT_TRUE(cursor.Skip(2).Read(received, 5)); + uint8_t expected[7] = { 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xea, 0xed }; + EXPECT_TRUE(memcmp(received, expected, 7) == 0); +} + +TEST(Strings, TooMuch) { + uint8_t data[] = { 0x5d, 0x31, 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xbb }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + + uint8_t received1[3]; + uint8_t received2[3]; + uint8_t received3[3]; + EXPECT_FALSE(cursor + .Read(received1, 3) + .Read(received2, 3) + .Read(received3, 3)); + uint8_t expected1[3] = { 0x5d, 0x31, 0x09 }; + uint8_t expected2[3] = { 0xa6, 0x2e, 0x2c }; + + EXPECT_TRUE(memcmp(received1, expected1, 3) == 0); + EXPECT_TRUE(memcmp(received2, expected2, 3) == 0); +} + +TEST(Strings, PointTo) { + uint8_t data[] = { 0x83, 0x80, 0xb4, 0x38, 0x00, 0x2c, 0x0a, 0x27 }; + ByteBuffer buffer(data, sizeof(data)); + ByteCursor cursor(&buffer); + + const uint8_t* received1; + const uint8_t* received2; + const uint8_t* received3; + const uint8_t* received4; + EXPECT_FALSE(cursor + .PointTo(&received1, 3) + .PointTo(&received2, 3) + .PointTo(&received3) + .PointTo(&received4, 3)); + EXPECT_EQ(data + 0, received1); + EXPECT_EQ(data + 3, received2); + EXPECT_EQ(data + 6, received3); + EXPECT_EQ(NULL, received4); +} + +TEST(Strings, CString) { + uint8_t data[] = "abc\0\0foo"; + ByteBuffer buffer(data, sizeof(data) - 1); // don't include terminating '\0' + ByteCursor cursor(&buffer); + + string a, b, c; + EXPECT_TRUE(cursor.CString(&a).CString(&b)); + EXPECT_EQ("abc", a); + EXPECT_EQ("", b); + EXPECT_FALSE(cursor.CString(&c)); + EXPECT_EQ("", c); + EXPECT_TRUE(cursor.AtEnd()); +} + +TEST(Strings, CStringLimit) { + uint8_t data[] = "abcdef\0\0foobar"; + ByteBuffer buffer(data, sizeof(data) - 1); // don't include terminating '\0' + ByteCursor cursor(&buffer); + + string a, b, c, d, e; + + EXPECT_TRUE(cursor.CString(&a, 3)); + EXPECT_EQ("abc", a); + + EXPECT_TRUE(cursor.CString(&b, 0)); + EXPECT_EQ("", b); + + EXPECT_TRUE(cursor.CString(&c, 6)); + EXPECT_EQ("def", c); + + EXPECT_TRUE(cursor.CString(&d, 4)); + EXPECT_EQ("ooba", d); + + EXPECT_FALSE(cursor.CString(&e, 4)); + EXPECT_EQ("", e); + + EXPECT_TRUE(cursor.AtEnd()); +} + +// uint8_t data[] = { 0xa6, 0x54, 0xdf, 0x67, 0x51, 0x43, 0xac, 0xf1 }; +// ByteBuffer buffer(data, sizeof(data)); diff --git a/src/common/convert_UTF.cc b/src/common/convert_UTF.cc new file mode 100644 index 0000000..6e95b2f --- /dev/null +++ b/src/common/convert_UTF.cc @@ -0,0 +1,595 @@ +/* + * Copyright © 1991-2015 Unicode, Inc. All rights reserved. + * Distributed under the Terms of Use in + * http://www.unicode.org/copyright.html. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of the Unicode data files and any associated documentation + * (the "Data Files") or Unicode software and any associated documentation + * (the "Software") to deal in the Data Files or Software + * without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, and/or sell copies of + * the Data Files or Software, and to permit persons to whom the Data Files + * or Software are furnished to do so, provided that + * (a) this copyright and permission notice appear with all copies + * of the Data Files or Software, + * (b) this copyright and permission notice appear in associated + * documentation, and + * (c) there is clear notice in each modified Data File or in the Software + * as well as in the documentation associated with the Data File(s) or + * Software that the data or software has been modified. + * + * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF + * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT OF THIRD PARTY RIGHTS. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + * DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THE DATA FILES OR SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, + * use or other dealings in these Data Files or Software without prior + * written authorization of the copyright holder. + */ + +/* --------------------------------------------------------------------- + +Conversions between UTF32, UTF-16, and UTF-8. Source code file. +Author: Mark E. Davis, 1994. +Rev History: Rick McGowan, fixes & updates May 2001. +Sept 2001: fixed const & error conditions per +mods suggested by S. Parent & A. Lillich. +June 2002: Tim Dodd added detection and handling of incomplete +source sequences, enhanced error detection, added casts +to eliminate compiler warnings. +July 2003: slight mods to back out aggressive FFFE detection. +Jan 2004: updated switches in from-UTF8 conversions. +Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions. + +See the header file "ConvertUTF.h" for complete documentation. + +------------------------------------------------------------------------ */ + + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "convert_UTF.h" +#ifdef CVTUTF_DEBUG +#include +#endif + +#include "common/macros.h" + +namespace google_breakpad { + +namespace { + +const int halfShift = 10; /* used for shifting by 10 bits */ + +const UTF32 halfBase = 0x0010000UL; +const UTF32 halfMask = 0x3FFUL; + +} // namespace + +#define UNI_SUR_HIGH_START (UTF32)0xD800 +#define UNI_SUR_HIGH_END (UTF32)0xDBFF +#define UNI_SUR_LOW_START (UTF32)0xDC00 +#define UNI_SUR_LOW_END (UTF32)0xDFFF + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF32* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + if (target >= targetEnd) { + result = targetExhausted; break; + } + ch = *source++; + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = (UTF16)ch; /* normal case */ + } + } else if (ch > UNI_MAX_LEGAL_UTF32) { + if (flags == strictConversion) { + result = sourceIllegal; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + --source; /* Back up source pointer! */ + result = targetExhausted; break; + } + ch -= halfBase; + *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); + } + } +*sourceStart = source; +*targetStart = target; +return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF16* source = *sourceStart; + UTF32* target = *targetStart; + UTF32 ch, ch2; + while (source < sourceEnd) { + const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { + /* If the 16 bits following the high surrogate are in the source buffer... */ + if (source < sourceEnd) { + ch2 = *source; + /* If it's a low surrogate, convert to UTF32. */ + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else { /* We don't have the 16 bits following the high surrogate. */ + --source; /* return to the high surrogate */ + result = sourceExhausted; + break; + } + } else if (flags == strictConversion) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + if (target >= targetEnd) { + source = oldSource; /* Back up source pointer! */ + result = targetExhausted; break; + } + *target++ = ch; + } + *sourceStart = source; + *targetStart = target; +#ifdef CVTUTF_DEBUG + if (result == sourceIllegal) { + fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2); + fflush(stderr); + } +#endif + return result; +} + +/* --------------------------------------------------------------------- */ + +namespace { + +/* + * Index into the table below with the first byte of a UTF-8 sequence to + * get the number of trailing bytes that are supposed to follow it. + * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is + * left as-is for anyone who may want to do such conversion, which was + * allowed in earlier algorithms. + */ +const char trailingBytesForUTF8[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 +}; + +/* + * Magic values subtracted from a buffer value during UTF8 conversion. + * This table contains as many values as there might be trailing bytes + * in a UTF-8 sequence. + */ +const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, + 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; + +/* + * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed + * into the first byte, depending on how many bytes follow. There are + * as many entries in this table as there are UTF-8 sequence types. + * (I.e., one byte sequence, two byte... etc.). Remember that sequencs + * for *legal* UTF-8 will be 4 or fewer bytes total. + */ +const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + +/* --------------------------------------------------------------------- */ + +/* The interface converts a whole buffer to avoid function-call overhead. +* Constants have been gathered. Loops & conditionals have been removed as +* much as possible for efficiency, in favor of drop-through switches. +* (See "Note A" at the bottom of the file for equivalent code.) +* If your compiler supports it, the "isLegalUTF8" call can be turned +* into an inline function. +*/ + +} // namespace + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF16* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { + /* If the 16 bits following the high surrogate are in the source buffer... */ + if (source < sourceEnd) { + UTF32 ch2 = *source; + /* If it's a low surrogate, convert to UTF32. */ + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else { /* We don't have the 16 bits following the high surrogate. */ + --source; /* return to the high surrogate */ + result = sourceExhausted; + break; + } + } else if (flags == strictConversion) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* Figure out how many bytes the result will require */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch < (UTF32)0x110000) { bytesToWrite = 4; + } else { bytesToWrite = 3; + ch = UNI_REPLACEMENT_CHAR; + } + + target += bytesToWrite; + if (target > targetEnd) { + source = oldSource; /* Back up source pointer! */ + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: + *--target = (UTF8)((ch | byteMark) & byteMask); + ch >>= 6; + BP_FALLTHROUGH; + case 3: + *--target = (UTF8)((ch | byteMark) & byteMask); + ch >>= 6; + BP_FALLTHROUGH; + case 2: + *--target = (UTF8)((ch | byteMark) & byteMask); + ch >>= 6; + BP_FALLTHROUGH; + case 1: + *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } +*sourceStart = source; +*targetStart = target; +return result; +} + +/* --------------------------------------------------------------------- */ + +namespace { + +/* + * Utility routine to tell whether a sequence of bytes is legal UTF-8. + * This must be called with the length pre-determined by the first byte. + * If not calling this from ConvertUTF8to*, then the length can be set by: + * length = trailingBytesForUTF8[*source]+1; + * and the sequence is illegal right away if there aren't that many bytes + * available. + * If presented with a length > 4, this returns false. The Unicode + * definition of UTF-8 goes up to 4-byte sequences. + */ +Boolean isLegalUTF8(const UTF8 *source, int length) { + UTF8 a; + const UTF8 *srcptr = source+length; + switch (length) { + default: return false; + /* Everything else falls through when "true"... */ + case 4: + if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; + BP_FALLTHROUGH; + case 3: + if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; + BP_FALLTHROUGH; + case 2: + if ((a = (*--srcptr)) > 0xBF) return false; + + switch (*source) { + /* no fall-through in this inner switch */ + case 0xE0: if (a < 0xA0) return false; break; + case 0xED: if (a > 0x9F) return false; break; + case 0xF0: if (a < 0x90) return false; break; + case 0xF4: if (a > 0x8F) return false; break; + default: if (a < 0x80) return false; + } + BP_FALLTHROUGH; + case 1: if (*source >= 0x80 && *source < 0xC2) return false; + } + if (*source > 0xF4) return false; + return true; +} + +} // namespace + +/* --------------------------------------------------------------------- */ + +/* + * Exported function to return whether a UTF-8 sequence is legal or not. + * This is not used here; it's just exported. + */ +Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { + int length = trailingBytesForUTF8[*source]+1; + if (source+length > sourceEnd) { + return false; + } + return isLegalUTF8(source, length); +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF8* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! isLegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + /* remember, illegal UTF-8 */ + case 5: ch += *source++; ch <<= 6; BP_FALLTHROUGH; + /* remember, illegal UTF-8 */ + case 4: ch += *source++; ch <<= 6; BP_FALLTHROUGH; + case 3: ch += *source++; ch <<= 6; BP_FALLTHROUGH; + case 2: ch += *source++; ch <<= 6; BP_FALLTHROUGH; + case 1: ch += *source++; ch <<= 6; BP_FALLTHROUGH; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up source pointer! */ + result = targetExhausted; break; + } + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + source -= (extraBytesToRead+1); /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = (UTF16)ch; /* normal case */ + } + } else if (ch > UNI_MAX_UTF16) { + if (flags == strictConversion) { + result = sourceIllegal; + source -= (extraBytesToRead+1); /* return to the start */ + break; /* Bail out; shouldn't continue */ + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up source pointer! */ + result = targetExhausted; break; + } + ch -= halfBase; + *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); + } + } +*sourceStart = source; +*targetStart = target; +return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF32* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + ch = *source++; + if (flags == strictConversion ) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* + * Figure out how many bytes the result will require. Turn any + * illegally large UTF32 things (> Plane 17) into replacement chars. + */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; + } else { bytesToWrite = 3; + ch = UNI_REPLACEMENT_CHAR; + result = sourceIllegal; + } + + target += bytesToWrite; + if (target > targetEnd) { + --source; /* Back up source pointer! */ + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: + *--target = (UTF8)((ch | byteMark) & byteMask); + ch >>= 6; + BP_FALLTHROUGH; + case 3: + *--target = (UTF8)((ch | byteMark) & byteMask); + ch >>= 6; + BP_FALLTHROUGH; + case 2: + *--target = (UTF8)((ch | byteMark) & byteMask); + ch >>= 6; + BP_FALLTHROUGH; + case 1: + *--target = (UTF8) (ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } +*sourceStart = source; +*targetStart = target; +return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF8* source = *sourceStart; + UTF32* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! isLegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 5: ch += *source++; ch <<= 6; BP_FALLTHROUGH; + case 4: ch += *source++; ch <<= 6; BP_FALLTHROUGH; + case 3: ch += *source++; ch <<= 6; BP_FALLTHROUGH; + case 2: ch += *source++; ch <<= 6; BP_FALLTHROUGH; + case 1: ch += *source++; ch <<= 6; BP_FALLTHROUGH; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up the source pointer! */ + result = targetExhausted; break; + } + if (ch <= UNI_MAX_LEGAL_UTF32) { + /* + * UTF-16 surrogate values are illegal in UTF-32, and anything + * over Plane 17 (> 0x10FFFF) is illegal. + */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + source -= (extraBytesToRead+1); /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = ch; + } + } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */ + result = sourceIllegal; + *target++ = UNI_REPLACEMENT_CHAR; + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- + +Note A. +The fall-through switches in UTF-8 reading code save a +temp variable, some decrements & conditionals. The switches +are equivalent to the following loop: +{ + int tmpBytesToRead = extraBytesToRead+1; + do { + ch += *source++; + --tmpBytesToRead; + if (tmpBytesToRead) ch <<= 6; + } while (tmpBytesToRead > 0); +} +In UTF-8 writing code, the switches on "bytesToWrite" are +similarly unrolled loops. + +--------------------------------------------------------------------- */ + +} // namespace google_breakpad diff --git a/src/common/convert_UTF.h b/src/common/convert_UTF.h new file mode 100644 index 0000000..2f69495 --- /dev/null +++ b/src/common/convert_UTF.h @@ -0,0 +1,159 @@ +/* + * Copyright © 1991-2015 Unicode, Inc. All rights reserved. + * Distributed under the Terms of Use in + * http://www.unicode.org/copyright.html. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of the Unicode data files and any associated documentation + * (the "Data Files") or Unicode software and any associated documentation + * (the "Software") to deal in the Data Files or Software + * without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, and/or sell copies of + * the Data Files or Software, and to permit persons to whom the Data Files + * or Software are furnished to do so, provided that + * (a) this copyright and permission notice appear with all copies + * of the Data Files or Software, + * (b) this copyright and permission notice appear in associated + * documentation, and + * (c) there is clear notice in each modified Data File or in the Software + * as well as in the documentation associated with the Data File(s) or + * Software that the data or software has been modified. + * + * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF + * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT OF THIRD PARTY RIGHTS. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + * DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THE DATA FILES OR SOFTWARE. + * + * Except as contained in this notice, the name of a copyright holder + * shall not be used in advertising or otherwise to promote the sale, + * use or other dealings in these Data Files or Software without prior + * written authorization of the copyright holder. + */ + +#ifndef COMMON_CONVERT_UTF_H_ +#define COMMON_CONVERT_UTF_H_ + +/* --------------------------------------------------------------------- + +Conversions between UTF32, UTF-16, and UTF-8. Header file. + +Several funtions are included here, forming a complete set of +conversions between the three formats. UTF-7 is not included +here, but is handled in a separate source file. + +Each of these routines takes pointers to input buffers and output +buffers. The input buffers are const. + +Each routine converts the text between *sourceStart and sourceEnd, +putting the result into the buffer between *targetStart and +targetEnd. Note: the end pointers are *after* the last item: e.g. +*(sourceEnd - 1) is the last item. + +The return result indicates whether the conversion was successful, +and if not, whether the problem was in the source or target buffers. +(Only the first encountered problem is indicated.) + +After the conversion, *sourceStart and *targetStart are both +updated to point to the end of last text successfully converted in +the respective buffers. + +Input parameters: +sourceStart - pointer to a pointer to the source buffer. +The contents of this are modified on return so that +it points at the next thing to be converted. +targetStart - similarly, pointer to pointer to the target buffer. +sourceEnd, targetEnd - respectively pointers to the ends of the +two buffers, for overflow checking only. + +These conversion functions take a ConversionFlags argument. When this +flag is set to strict, both irregular sequences and isolated surrogates +will cause an error. When the flag is set to lenient, both irregular +sequences and isolated surrogates are converted. + +Whether the flag is strict or lenient, all illegal sequences will cause +an error return. This includes sequences such as: , , +or in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code +must check for illegal sequences. + +When the flag is set to lenient, characters over 0x10FFFF are converted +to the replacement character; otherwise (when the flag is set to strict) +they constitute an error. + +Output parameters: +The value "sourceIllegal" is returned from some routines if the input +sequence is malformed. When "sourceIllegal" is returned, the source +value will point to the illegal value that caused the problem. E.g., +in UTF-8 when a sequence is malformed, it points to the start of the +malformed sequence. + +Author: Mark E. Davis, 1994. +Rev History: Rick McGowan, fixes & updates May 2001. +Fixes & updates, Sept 2001. + +------------------------------------------------------------------------ */ + +/* --------------------------------------------------------------------- +The following 4 definitions are compiler-specific. +The C standard does not guarantee that wchar_t has at least +16 bits, so wchar_t is no less portable than unsigned short! +All should be unsigned values to avoid sign extension during +bit mask & shift operations. +------------------------------------------------------------------------ */ + +namespace google_breakpad { + +typedef unsigned long UTF32; /* at least 32 bits */ +typedef unsigned short UTF16; /* at least 16 bits */ +typedef unsigned char UTF8; /* typically 8 bits */ +typedef unsigned char Boolean; /* 0 or 1 */ + +/* Some fundamental constants */ +#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD +#define UNI_MAX_BMP (UTF32)0x0000FFFF +#define UNI_MAX_UTF16 (UTF32)0x0010FFFF +#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF +#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF + +typedef enum { + conversionOK, /* conversion successful */ + sourceExhausted, /* partial character in source, but hit end */ + targetExhausted, /* insuff. room in target for conversion */ + sourceIllegal /* source sequence is illegal/malformed */ +} ConversionResult; + +typedef enum { + strictConversion = 0, + lenientConversion +} ConversionFlags; + +ConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); + +} // namespace google_breakpad + +/* --------------------------------------------------------------------- */ + +#endif // COMMON_CONVERT_UTF_H_ diff --git a/src/common/dwarf/bytereader-inl.h b/src/common/dwarf/bytereader-inl.h new file mode 100644 index 0000000..2102648 --- /dev/null +++ b/src/common/dwarf/bytereader-inl.h @@ -0,0 +1,181 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef UTIL_DEBUGINFO_BYTEREADER_INL_H__ +#define UTIL_DEBUGINFO_BYTEREADER_INL_H__ + +#include "common/dwarf/bytereader.h" + +#include +#include + +namespace google_breakpad { + +inline uint8_t ByteReader::ReadOneByte(const uint8_t* buffer) const { + return buffer[0]; +} + +inline uint16_t ByteReader::ReadTwoBytes(const uint8_t* buffer) const { + const uint16_t buffer0 = buffer[0]; + const uint16_t buffer1 = buffer[1]; + if (endian_ == ENDIANNESS_LITTLE) { + return buffer0 | buffer1 << 8; + } else { + return buffer1 | buffer0 << 8; + } +} + +inline uint64_t ByteReader::ReadThreeBytes(const uint8_t* buffer) const { + const uint32_t buffer0 = buffer[0]; + const uint32_t buffer1 = buffer[1]; + const uint32_t buffer2 = buffer[2]; + if (endian_ == ENDIANNESS_LITTLE) { + return buffer0 | buffer1 << 8 | buffer2 << 16; + } else { + return buffer2 | buffer1 << 8 | buffer0 << 16; + } +} + +inline uint64_t ByteReader::ReadFourBytes(const uint8_t* buffer) const { + const uint32_t buffer0 = buffer[0]; + const uint32_t buffer1 = buffer[1]; + const uint32_t buffer2 = buffer[2]; + const uint32_t buffer3 = buffer[3]; + if (endian_ == ENDIANNESS_LITTLE) { + return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24; + } else { + return buffer3 | buffer2 << 8 | buffer1 << 16 | buffer0 << 24; + } +} + +inline uint64_t ByteReader::ReadEightBytes(const uint8_t* buffer) const { + const uint64_t buffer0 = buffer[0]; + const uint64_t buffer1 = buffer[1]; + const uint64_t buffer2 = buffer[2]; + const uint64_t buffer3 = buffer[3]; + const uint64_t buffer4 = buffer[4]; + const uint64_t buffer5 = buffer[5]; + const uint64_t buffer6 = buffer[6]; + const uint64_t buffer7 = buffer[7]; + if (endian_ == ENDIANNESS_LITTLE) { + return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24 | + buffer4 << 32 | buffer5 << 40 | buffer6 << 48 | buffer7 << 56; + } else { + return buffer7 | buffer6 << 8 | buffer5 << 16 | buffer4 << 24 | + buffer3 << 32 | buffer2 << 40 | buffer1 << 48 | buffer0 << 56; + } +} + +// Read an unsigned LEB128 number. Each byte contains 7 bits of +// information, plus one bit saying whether the number continues or +// not. + +inline uint64_t ByteReader::ReadUnsignedLEB128(const uint8_t* buffer, + size_t* len) const { + uint64_t result = 0; + size_t num_read = 0; + unsigned int shift = 0; + uint8_t byte; + + do { + byte = *buffer++; + num_read++; + + result |= (static_cast(byte & 0x7f)) << shift; + + shift += 7; + + } while (byte & 0x80); + + *len = num_read; + + return result; +} + +// Read a signed LEB128 number. These are like regular LEB128 +// numbers, except the last byte may have a sign bit set. + +inline int64_t ByteReader::ReadSignedLEB128(const uint8_t* buffer, + size_t* len) const { + int64_t result = 0; + unsigned int shift = 0; + size_t num_read = 0; + uint8_t byte; + + do { + byte = *buffer++; + num_read++; + result |= (static_cast(byte & 0x7f) << shift); + shift += 7; + } while (byte & 0x80); + + if ((shift < 8 * sizeof (result)) && (byte & 0x40)) + result |= -((static_cast(1)) << shift); + *len = num_read; + return result; +} + +inline uint64_t ByteReader::ReadOffset(const uint8_t* buffer) const { + assert(this->offset_reader_); + return (this->*offset_reader_)(buffer); +} + +inline uint64_t ByteReader::ReadAddress(const uint8_t* buffer) const { + assert(this->address_reader_); + return (this->*address_reader_)(buffer); +} + +inline void ByteReader::SetCFIDataBase(uint64_t section_base, + const uint8_t* buffer_base) { + section_base_ = section_base; + buffer_base_ = buffer_base; + have_section_base_ = true; +} + +inline void ByteReader::SetTextBase(uint64_t text_base) { + text_base_ = text_base; + have_text_base_ = true; +} + +inline void ByteReader::SetDataBase(uint64_t data_base) { + data_base_ = data_base; + have_data_base_ = true; +} + +inline void ByteReader::SetFunctionBase(uint64_t function_base) { + function_base_ = function_base; + have_function_base_ = true; +} + +inline void ByteReader::ClearFunctionBase() { + have_function_base_ = false; +} + +} // namespace google_breakpad + +#endif // UTIL_DEBUGINFO_BYTEREADER_INL_H__ diff --git a/src/common/dwarf/bytereader.cc b/src/common/dwarf/bytereader.cc new file mode 100644 index 0000000..faa7d68 --- /dev/null +++ b/src/common/dwarf/bytereader.cc @@ -0,0 +1,254 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "common/dwarf/bytereader-inl.h" +#include "common/dwarf/bytereader.h" + +namespace google_breakpad { + +ByteReader::ByteReader(enum Endianness endian) + :offset_reader_(NULL), address_reader_(NULL), endian_(endian), + address_size_(0), offset_size_(0), + have_section_base_(), have_text_base_(), have_data_base_(), + have_function_base_() { } + +ByteReader::~ByteReader() { } + +void ByteReader::SetOffsetSize(uint8_t size) { + offset_size_ = size; + assert(size == 4 || size == 8); + if (size == 4) { + this->offset_reader_ = &ByteReader::ReadFourBytes; + } else { + this->offset_reader_ = &ByteReader::ReadEightBytes; + } +} + +void ByteReader::SetAddressSize(uint8_t size) { + address_size_ = size; + assert(size == 4 || size == 8); + if (size == 4) { + this->address_reader_ = &ByteReader::ReadFourBytes; + } else { + this->address_reader_ = &ByteReader::ReadEightBytes; + } +} + +uint64_t ByteReader::ReadInitialLength(const uint8_t* start, size_t* len) { + const uint64_t initial_length = ReadFourBytes(start); + start += 4; + + // In DWARF2/3, if the initial length is all 1 bits, then the offset + // size is 8 and we need to read the next 8 bytes for the real length. + if (initial_length == 0xffffffff) { + SetOffsetSize(8); + *len = 12; + return ReadOffset(start); + } else { + SetOffsetSize(4); + *len = 4; + } + return initial_length; +} + +bool ByteReader::ValidEncoding(DwarfPointerEncoding encoding) const { + if (encoding == DW_EH_PE_omit) return true; + if (encoding == DW_EH_PE_aligned) return true; + if ((encoding & 0x7) > DW_EH_PE_udata8) + return false; + if ((encoding & 0x70) > DW_EH_PE_funcrel) + return false; + return true; +} + +bool ByteReader::UsableEncoding(DwarfPointerEncoding encoding) const { + switch (encoding & 0x70) { + case DW_EH_PE_absptr: return true; + case DW_EH_PE_pcrel: return have_section_base_; + case DW_EH_PE_textrel: return have_text_base_; + case DW_EH_PE_datarel: return have_data_base_; + case DW_EH_PE_funcrel: return have_function_base_; + default: return false; + } +} + +uint64_t ByteReader::ReadEncodedPointer(const uint8_t* buffer, + DwarfPointerEncoding encoding, + size_t* len) const { + // UsableEncoding doesn't approve of DW_EH_PE_omit, so we shouldn't + // see it here. + assert(encoding != DW_EH_PE_omit); + + // The Linux Standards Base 4.0 does not make this clear, but the + // GNU tools (gcc/unwind-pe.h; readelf/dwarf.c; gdb/dwarf2-frame.c) + // agree that aligned pointers are always absolute, machine-sized, + // machine-signed pointers. + if (encoding == DW_EH_PE_aligned) { + assert(have_section_base_); + + // We don't need to align BUFFER in *our* address space. Rather, we + // need to find the next position in our buffer that would be aligned + // when the .eh_frame section the buffer contains is loaded into the + // program's memory. So align assuming that buffer_base_ gets loaded at + // address section_base_, where section_base_ itself may or may not be + // aligned. + + // First, find the offset to START from the closest prior aligned + // address. + uint64_t skew = section_base_ & (AddressSize() - 1); + // Now find the offset from that aligned address to buffer. + uint64_t offset = skew + (buffer - buffer_base_); + // Round up to the next boundary. + uint64_t aligned = (offset + AddressSize() - 1) & -AddressSize(); + // Convert back to a pointer. + const uint8_t* aligned_buffer = buffer_base_ + (aligned - skew); + // Finally, store the length and actually fetch the pointer. + *len = aligned_buffer - buffer + AddressSize(); + return ReadAddress(aligned_buffer); + } + + // Extract the value first, ignoring whether it's a pointer or an + // offset relative to some base. + uint64_t offset; + switch (encoding & 0x0f) { + case DW_EH_PE_absptr: + // DW_EH_PE_absptr is weird, as it is used as a meaningful value for + // both the high and low nybble of encoding bytes. When it appears in + // the high nybble, it means that the pointer is absolute, not an + // offset from some base address. When it appears in the low nybble, + // as here, it means that the pointer is stored as a normal + // machine-sized and machine-signed address. A low nybble of + // DW_EH_PE_absptr does not imply that the pointer is absolute; it is + // correct for us to treat the value as an offset from a base address + // if the upper nybble is not DW_EH_PE_absptr. + offset = ReadAddress(buffer); + *len = AddressSize(); + break; + + case DW_EH_PE_uleb128: + offset = ReadUnsignedLEB128(buffer, len); + break; + + case DW_EH_PE_udata2: + offset = ReadTwoBytes(buffer); + *len = 2; + break; + + case DW_EH_PE_udata4: + offset = ReadFourBytes(buffer); + *len = 4; + break; + + case DW_EH_PE_udata8: + offset = ReadEightBytes(buffer); + *len = 8; + break; + + case DW_EH_PE_sleb128: + offset = ReadSignedLEB128(buffer, len); + break; + + case DW_EH_PE_sdata2: + offset = ReadTwoBytes(buffer); + // Sign-extend from 16 bits. + offset = (offset ^ 0x8000) - 0x8000; + *len = 2; + break; + + case DW_EH_PE_sdata4: + offset = ReadFourBytes(buffer); + // Sign-extend from 32 bits. + offset = (offset ^ 0x80000000ULL) - 0x80000000ULL; + *len = 4; + break; + + case DW_EH_PE_sdata8: + // No need to sign-extend; this is the full width of our type. + offset = ReadEightBytes(buffer); + *len = 8; + break; + + default: + abort(); + } + + // Find the appropriate base address. + uint64_t base; + switch (encoding & 0x70) { + case DW_EH_PE_absptr: + base = 0; + break; + + case DW_EH_PE_pcrel: + assert(have_section_base_); + base = section_base_ + (buffer - buffer_base_); + break; + + case DW_EH_PE_textrel: + assert(have_text_base_); + base = text_base_; + break; + + case DW_EH_PE_datarel: + assert(have_data_base_); + base = data_base_; + break; + + case DW_EH_PE_funcrel: + assert(have_function_base_); + base = function_base_; + break; + + default: + abort(); + } + + uint64_t pointer = base + offset; + + // Remove inappropriate upper bits. + if (AddressSize() == 4) + pointer = pointer & 0xffffffff; + else + assert(AddressSize() == sizeof(uint64_t)); + + return pointer; +} + +Endianness ByteReader::GetEndianness() const { + return endian_; +} + +} // namespace google_breakpad diff --git a/src/common/dwarf/bytereader.h b/src/common/dwarf/bytereader.h new file mode 100644 index 0000000..761eaf6 --- /dev/null +++ b/src/common/dwarf/bytereader.h @@ -0,0 +1,320 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_DWARF_BYTEREADER_H__ +#define COMMON_DWARF_BYTEREADER_H__ + +#include + +#include + +#include "common/dwarf/types.h" +#include "common/dwarf/dwarf2enums.h" + +namespace google_breakpad { + +// We can't use the obvious name of LITTLE_ENDIAN and BIG_ENDIAN +// because it conflicts with a macro +enum Endianness { + ENDIANNESS_BIG, + ENDIANNESS_LITTLE +}; + +// A ByteReader knows how to read single- and multi-byte values of +// various endiannesses, sizes, and encodings, as used in DWARF +// debugging information and Linux C++ exception handling data. +class ByteReader { + public: + // Construct a ByteReader capable of reading one-, two-, four-, and + // eight-byte values according to ENDIANNESS, absolute machine-sized + // addresses, DWARF-style "initial length" values, signed and + // unsigned LEB128 numbers, and Linux C++ exception handling data's + // encoded pointers. + explicit ByteReader(enum Endianness endianness); + virtual ~ByteReader(); + + // Read a single byte from BUFFER and return it as an unsigned 8 bit + // number. + uint8_t ReadOneByte(const uint8_t* buffer) const; + + // Read two bytes from BUFFER and return them as an unsigned 16 bit + // number, using this ByteReader's endianness. + uint16_t ReadTwoBytes(const uint8_t* buffer) const; + + // Read three bytes from BUFFER and return them as an unsigned 64 bit + // number, using this ByteReader's endianness. DWARF 5 uses this encoding + // for various index-related DW_FORMs. + uint64_t ReadThreeBytes(const uint8_t* buffer) const; + + // Read four bytes from BUFFER and return them as an unsigned 32 bit + // number, using this ByteReader's endianness. This function returns + // a uint64_t so that it is compatible with ReadAddress and + // ReadOffset. The number it returns will never be outside the range + // of an unsigned 32 bit integer. + uint64_t ReadFourBytes(const uint8_t* buffer) const; + + // Read eight bytes from BUFFER and return them as an unsigned 64 + // bit number, using this ByteReader's endianness. + uint64_t ReadEightBytes(const uint8_t* buffer) const; + + // Read an unsigned LEB128 (Little Endian Base 128) number from + // BUFFER and return it as an unsigned 64 bit integer. Set LEN to + // the number of bytes read. + // + // The unsigned LEB128 representation of an integer N is a variable + // number of bytes: + // + // - If N is between 0 and 0x7f, then its unsigned LEB128 + // representation is a single byte whose value is N. + // + // - Otherwise, its unsigned LEB128 representation is (N & 0x7f) | + // 0x80, followed by the unsigned LEB128 representation of N / + // 128, rounded towards negative infinity. + // + // In other words, we break VALUE into groups of seven bits, put + // them in little-endian order, and then write them as eight-bit + // bytes with the high bit on all but the last. + uint64_t ReadUnsignedLEB128(const uint8_t* buffer, size_t* len) const; + + // Read a signed LEB128 number from BUFFER and return it as an + // signed 64 bit integer. Set LEN to the number of bytes read. + // + // The signed LEB128 representation of an integer N is a variable + // number of bytes: + // + // - If N is between -0x40 and 0x3f, then its signed LEB128 + // representation is a single byte whose value is N in two's + // complement. + // + // - Otherwise, its signed LEB128 representation is (N & 0x7f) | + // 0x80, followed by the signed LEB128 representation of N / 128, + // rounded towards negative infinity. + // + // In other words, we break VALUE into groups of seven bits, put + // them in little-endian order, and then write them as eight-bit + // bytes with the high bit on all but the last. + int64_t ReadSignedLEB128(const uint8_t* buffer, size_t* len) const; + + // Indicate that addresses on this architecture are SIZE bytes long. SIZE + // must be either 4 or 8. (DWARF allows addresses to be any number of + // bytes in length from 1 to 255, but we only support 32- and 64-bit + // addresses at the moment.) You must call this before using the + // ReadAddress member function. + // + // For data in a .debug_info section, or something that .debug_info + // refers to like line number or macro data, the compilation unit + // header's address_size field indicates the address size to use. Call + // frame information doesn't indicate its address size (a shortcoming of + // the spec); you must supply the appropriate size based on the + // architecture of the target machine. + void SetAddressSize(uint8_t size); + + // Return the current address size, in bytes. This is either 4, + // indicating 32-bit addresses, or 8, indicating 64-bit addresses. + uint8_t AddressSize() const { return address_size_; } + + // Read an address from BUFFER and return it as an unsigned 64 bit + // integer, respecting this ByteReader's endianness and address size. You + // must call SetAddressSize before calling this function. + uint64_t ReadAddress(const uint8_t* buffer) const; + + // DWARF actually defines two slightly different formats: 32-bit DWARF + // and 64-bit DWARF. This is *not* related to the size of registers or + // addresses on the target machine; it refers only to the size of section + // offsets and data lengths appearing in the DWARF data. One only needs + // 64-bit DWARF when the debugging data itself is larger than 4GiB. + // 32-bit DWARF can handle x86_64 or PPC64 code just fine, unless the + // debugging data itself is very large. + // + // DWARF information identifies itself as 32-bit or 64-bit DWARF: each + // compilation unit and call frame information entry begins with an + // "initial length" field, which, in addition to giving the length of the + // data, also indicates the size of section offsets and lengths appearing + // in that data. The ReadInitialLength member function, below, reads an + // initial length and sets the ByteReader's offset size as a side effect. + // Thus, in the normal process of reading DWARF data, the appropriate + // offset size is set automatically. So, you should only need to call + // SetOffsetSize if you are using the same ByteReader to jump from the + // midst of one block of DWARF data into another. + + // Read a DWARF "initial length" field from START, and return it as + // an unsigned 64 bit integer, respecting this ByteReader's + // endianness. Set *LEN to the length of the initial length in + // bytes, either four or twelve. As a side effect, set this + // ByteReader's offset size to either 4 (if we see a 32-bit DWARF + // initial length) or 8 (if we see a 64-bit DWARF initial length). + // + // A DWARF initial length is either: + // + // - a byte count stored as an unsigned 32-bit value less than + // 0xffffff00, indicating that the data whose length is being + // measured uses the 32-bit DWARF format, or + // + // - The 32-bit value 0xffffffff, followed by a 64-bit byte count, + // indicating that the data whose length is being measured uses + // the 64-bit DWARF format. + uint64_t ReadInitialLength(const uint8_t* start, size_t* len); + + // Read an offset from BUFFER and return it as an unsigned 64 bit + // integer, respecting the ByteReader's endianness. In 32-bit DWARF, the + // offset is 4 bytes long; in 64-bit DWARF, the offset is eight bytes + // long. You must call ReadInitialLength or SetOffsetSize before calling + // this function; see the comments above for details. + uint64_t ReadOffset(const uint8_t* buffer) const; + + // Return the current offset size, in bytes. + // A return value of 4 indicates that we are reading 32-bit DWARF. + // A return value of 8 indicates that we are reading 64-bit DWARF. + uint8_t OffsetSize() const { return offset_size_; } + + // Indicate that section offsets and lengths are SIZE bytes long. SIZE + // must be either 4 (meaning 32-bit DWARF) or 8 (meaning 64-bit DWARF). + // Usually, you should not call this function yourself; instead, let a + // call to ReadInitialLength establish the data's offset size + // automatically. + void SetOffsetSize(uint8_t size); + + // The Linux C++ ABI uses a variant of DWARF call frame information + // for exception handling. This data is included in the program's + // address space as the ".eh_frame" section, and intepreted at + // runtime to walk the stack, find exception handlers, and run + // cleanup code. The format is mostly the same as DWARF CFI, with + // some adjustments made to provide the additional + // exception-handling data, and to make the data easier to work with + // in memory --- for example, to allow it to be placed in read-only + // memory even when describing position-independent code. + // + // In particular, exception handling data can select a number of + // different encodings for pointers that appear in the data, as + // described by the DwarfPointerEncoding enum. There are actually + // four axes(!) to the encoding: + // + // - The pointer size: pointers can be 2, 4, or 8 bytes long, or use + // the DWARF LEB128 encoding. + // + // - The pointer's signedness: pointers can be signed or unsigned. + // + // - The pointer's base address: the data stored in the exception + // handling data can be the actual address (that is, an absolute + // pointer), or relative to one of a number of different base + // addreses --- including that of the encoded pointer itself, for + // a form of "pc-relative" addressing. + // + // - The pointer may be indirect: it may be the address where the + // true pointer is stored. (This is used to refer to things via + // global offset table entries, program linkage table entries, or + // other tricks used in position-independent code.) + // + // There are also two options that fall outside that matrix + // altogether: the pointer may be omitted, or it may have padding to + // align it on an appropriate address boundary. (That last option + // may seem like it should be just another axis, but it is not.) + + // Indicate that the exception handling data is loaded starting at + // SECTION_BASE, and that the start of its buffer in our own memory + // is BUFFER_BASE. This allows us to find the address that a given + // byte in our buffer would have when loaded into the program the + // data describes. We need this to resolve DW_EH_PE_pcrel pointers. + void SetCFIDataBase(uint64_t section_base, const uint8_t* buffer_base); + + // Indicate that the base address of the program's ".text" section + // is TEXT_BASE. We need this to resolve DW_EH_PE_textrel pointers. + void SetTextBase(uint64_t text_base); + + // Indicate that the base address for DW_EH_PE_datarel pointers is + // DATA_BASE. The proper value depends on the ABI; it is usually the + // address of the global offset table, held in a designated register in + // position-independent code. You will need to look at the startup code + // for the target system to be sure. I tried; my eyes bled. + void SetDataBase(uint64_t data_base); + + // Indicate that the base address for the FDE we are processing is + // FUNCTION_BASE. This is the start address of DW_EH_PE_funcrel + // pointers. (This encoding does not seem to be used by the GNU + // toolchain.) + void SetFunctionBase(uint64_t function_base); + + // Indicate that we are no longer processing any FDE, so any use of + // a DW_EH_PE_funcrel encoding is an error. + void ClearFunctionBase(); + + // Return true if ENCODING is a valid pointer encoding. + bool ValidEncoding(DwarfPointerEncoding encoding) const; + + // Return true if we have all the information we need to read a + // pointer that uses ENCODING. This checks that the appropriate + // SetFooBase function for ENCODING has been called. + bool UsableEncoding(DwarfPointerEncoding encoding) const; + + // Read an encoded pointer from BUFFER using ENCODING; return the + // absolute address it represents, and set *LEN to the pointer's + // length in bytes, including any padding for aligned pointers. + // + // This function calls 'abort' if ENCODING is invalid or refers to a + // base address this reader hasn't been given, so you should check + // with ValidEncoding and UsableEncoding first if you would rather + // die in a more helpful way. + uint64_t ReadEncodedPointer(const uint8_t* buffer, + DwarfPointerEncoding encoding, + size_t* len) const; + + Endianness GetEndianness() const; + private: + + // Function pointer type for our address and offset readers. + typedef uint64_t (ByteReader::*AddressReader)(const uint8_t*) const; + + // Read an offset from BUFFER and return it as an unsigned 64 bit + // integer. DWARF2/3 define offsets as either 4 or 8 bytes, + // generally depending on the amount of DWARF2/3 info present. + // This function pointer gets set by SetOffsetSize. + AddressReader offset_reader_; + + // Read an address from BUFFER and return it as an unsigned 64 bit + // integer. DWARF2/3 allow addresses to be any size from 0-255 + // bytes currently. Internally we support 4 and 8 byte addresses, + // and will CHECK on anything else. + // This function pointer gets set by SetAddressSize. + AddressReader address_reader_; + + Endianness endian_; + uint8_t address_size_; + uint8_t offset_size_; + + // Base addresses for Linux C++ exception handling data's encoded pointers. + bool have_section_base_, have_text_base_, have_data_base_; + bool have_function_base_; + uint64_t section_base_, text_base_, data_base_, function_base_; + const uint8_t* buffer_base_; +}; + +} // namespace google_breakpad + +#endif // COMMON_DWARF_BYTEREADER_H__ diff --git a/src/common/dwarf/bytereader_unittest.cc b/src/common/dwarf/bytereader_unittest.cc new file mode 100644 index 0000000..a5eb0da --- /dev/null +++ b/src/common/dwarf/bytereader_unittest.cc @@ -0,0 +1,710 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// bytereader_unittest.cc: Unit tests for google_breakpad::ByteReader + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "common/dwarf/bytereader.h" +#include "common/dwarf/bytereader-inl.h" +#include "common/dwarf/cfi_assembler.h" +#include "common/using_std_string.h" + +using google_breakpad::ByteReader; +using google_breakpad::DwarfPointerEncoding; +using google_breakpad::ENDIANNESS_BIG; +using google_breakpad::ENDIANNESS_LITTLE; +using google_breakpad::CFISection; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::kBigEndian; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Section; +using testing::Test; + +struct ReaderFixture { + string contents; + size_t pointer_size; +}; + +class Reader: public ReaderFixture, public Test { }; +class ReaderDeathTest: public ReaderFixture, public Test { }; + +TEST_F(Reader, SimpleConstructor) { + ByteReader reader(ENDIANNESS_BIG); + reader.SetAddressSize(4); + CFISection section(kBigEndian, 4); + section + .D8(0xc0) + .D16(0xcf0d) + .D32(0x96fdd219) + .D64(0xbbf55fef0825f117ULL) + .ULEB128(0xa0927048ba8121afULL) + .LEB128(-0x4f337badf4483f83LL) + .D32(0xfec319c9); + ASSERT_TRUE(section.GetContents(&contents)); + const uint8_t* data = reinterpret_cast(contents.data()); + EXPECT_EQ(0xc0U, reader.ReadOneByte(data)); + EXPECT_EQ(0xcf0dU, reader.ReadTwoBytes(data + 1)); + EXPECT_EQ(0x96fdd219U, reader.ReadFourBytes(data + 3)); + EXPECT_EQ(0xbbf55fef0825f117ULL, reader.ReadEightBytes(data + 7)); + size_t leb128_size; + EXPECT_EQ(0xa0927048ba8121afULL, + reader.ReadUnsignedLEB128(data + 15, &leb128_size)); + EXPECT_EQ(10U, leb128_size); + EXPECT_EQ(-0x4f337badf4483f83LL, + reader.ReadSignedLEB128(data + 25, &leb128_size)); + EXPECT_EQ(10U, leb128_size); + EXPECT_EQ(0xfec319c9, reader.ReadAddress(data + 35)); +} + +TEST_F(Reader, ValidEncodings) { + ByteReader reader(ENDIANNESS_LITTLE); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_absptr))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_omit))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_aligned))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_uleb128))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata2))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata4))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata8))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sleb128))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata2))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata4))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata8))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_absptr | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_uleb128 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata2 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata4 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata8 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sleb128 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata2 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata4 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata8 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_absptr | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_uleb128 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata2 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata4 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata8 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sleb128 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata2 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata4 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata8 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_absptr | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_uleb128 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata2 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata4 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata8 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sleb128 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata2 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata4 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata8 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_absptr | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_uleb128 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata2 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata4 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_udata8 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sleb128 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata2 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata4 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_sdata8 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_absptr | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_uleb128 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata2 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata4 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata8 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sleb128 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata2 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata4 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata8 | + google_breakpad::DW_EH_PE_pcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_absptr | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_uleb128 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata2 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata4 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata8 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sleb128 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata2 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata4 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata8 | + google_breakpad::DW_EH_PE_textrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_absptr | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_uleb128 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata2 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata4 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata8 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sleb128 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata2 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata4 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata8 | + google_breakpad::DW_EH_PE_datarel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_absptr | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_uleb128 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata2 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata4 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_udata8 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sleb128 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata2 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata4 | + google_breakpad::DW_EH_PE_funcrel))); + EXPECT_TRUE(reader.ValidEncoding( + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect | + google_breakpad::DW_EH_PE_sdata8 | + google_breakpad::DW_EH_PE_funcrel))); + + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x05))); + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x07))); + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0d))); + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0f))); + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x51))); + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x60))); + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x70))); + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xf0))); + EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xd0))); +} + +TEST_F(ReaderDeathTest, DW_EH_PE_omit) { + static const uint8_t data[] = { 42 }; + ByteReader reader(ENDIANNESS_BIG); + reader.SetAddressSize(4); + EXPECT_DEATH(reader.ReadEncodedPointer(data, google_breakpad::DW_EH_PE_omit, + &pointer_size), + "encoding != DW_EH_PE_omit"); +} + +TEST_F(Reader, DW_EH_PE_absptr4) { + static const uint8_t data[] = { 0x27, 0x57, 0xea, 0x40 }; + ByteReader reader(ENDIANNESS_LITTLE); + reader.SetAddressSize(4); + EXPECT_EQ(0x40ea5727U, + reader.ReadEncodedPointer(data, google_breakpad::DW_EH_PE_absptr, + &pointer_size)); + EXPECT_EQ(4U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_absptr8) { + static const uint8_t data[] = { + 0x60, 0x27, 0x57, 0xea, 0x40, 0xc2, 0x98, 0x05, 0x01, 0x50 + }; + ByteReader reader(ENDIANNESS_LITTLE); + reader.SetAddressSize(8); + EXPECT_EQ(0x010598c240ea5727ULL, + reader.ReadEncodedPointer(data + 1, google_breakpad::DW_EH_PE_absptr, + &pointer_size)); + EXPECT_EQ(8U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_uleb128) { + static const uint8_t data[] = { 0x81, 0x84, 0x4c }; + ByteReader reader(ENDIANNESS_LITTLE); + reader.SetAddressSize(4); + EXPECT_EQ(0x130201U, + reader.ReadEncodedPointer(data, google_breakpad::DW_EH_PE_uleb128, + &pointer_size)); + EXPECT_EQ(3U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_udata2) { + static const uint8_t data[] = { 0xf4, 0x8d }; + ByteReader reader(ENDIANNESS_BIG); + reader.SetAddressSize(4); + EXPECT_EQ(0xf48dU, + reader.ReadEncodedPointer(data, google_breakpad::DW_EH_PE_udata2, + &pointer_size)); + EXPECT_EQ(2U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_udata4) { + static const uint8_t data[] = { 0xb2, 0x68, 0xa5, 0x62, 0x8f, 0x8b }; + ByteReader reader(ENDIANNESS_BIG); + reader.SetAddressSize(8); + EXPECT_EQ(0xa5628f8b, + reader.ReadEncodedPointer(data + 2, google_breakpad::DW_EH_PE_udata4, + &pointer_size)); + EXPECT_EQ(4U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_udata8Addr8) { + static const uint8_t data[] = { + 0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe + }; + ByteReader reader(ENDIANNESS_LITTLE); + reader.SetAddressSize(8); + EXPECT_EQ(0x8fed199f69047304ULL, + reader.ReadEncodedPointer(data + 1, google_breakpad::DW_EH_PE_udata8, + &pointer_size)); + EXPECT_EQ(8U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_udata8Addr4) { + static const uint8_t data[] = { + 0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe + }; + ByteReader reader(ENDIANNESS_LITTLE); + reader.SetAddressSize(4); + EXPECT_EQ(0x69047304ULL, + reader.ReadEncodedPointer(data + 1, google_breakpad::DW_EH_PE_udata8, + &pointer_size)); + EXPECT_EQ(8U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_sleb128) { + static const uint8_t data[] = { 0x42, 0xff, 0xfb, 0x73 }; + ByteReader reader(ENDIANNESS_BIG); + reader.SetAddressSize(4); + EXPECT_EQ(-0x030201U & 0xffffffff, + reader.ReadEncodedPointer(data + 1, google_breakpad::DW_EH_PE_sleb128, + &pointer_size)); + EXPECT_EQ(3U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_sdata2) { + static const uint8_t data[] = { 0xb9, 0xbf }; + ByteReader reader(ENDIANNESS_LITTLE); + reader.SetAddressSize(8); + EXPECT_EQ(0xffffffffffffbfb9ULL, + reader.ReadEncodedPointer(data, google_breakpad::DW_EH_PE_sdata2, + &pointer_size)); + EXPECT_EQ(2U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_sdata4) { + static const uint8_t data[] = { 0xa0, 0xca, 0xf2, 0xb8, 0xc2, 0xad }; + ByteReader reader(ENDIANNESS_LITTLE); + reader.SetAddressSize(8); + EXPECT_EQ(0xffffffffadc2b8f2ULL, + reader.ReadEncodedPointer(data + 2, google_breakpad::DW_EH_PE_sdata4, + &pointer_size)); + EXPECT_EQ(4U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_sdata8) { + static const uint8_t data[] = { + 0xf6, 0x66, 0x57, 0x79, 0xe0, 0x0c, 0x9b, 0x26, 0x87 + }; + ByteReader reader(ENDIANNESS_LITTLE); + reader.SetAddressSize(8); + EXPECT_EQ(0x87269b0ce0795766ULL, + reader.ReadEncodedPointer(data + 1, google_breakpad::DW_EH_PE_sdata8, + &pointer_size)); + EXPECT_EQ(8U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_pcrel) { + static const uint8_t data[] = { + 0x4a, 0x8b, 0x1b, 0x14, 0xc8, 0xc4, 0x02, 0xce + }; + ByteReader reader(ENDIANNESS_BIG); + reader.SetAddressSize(4); + DwarfPointerEncoding encoding = + DwarfPointerEncoding(google_breakpad::DW_EH_PE_pcrel + | google_breakpad::DW_EH_PE_absptr); + reader.SetCFIDataBase(0x89951377, data); + EXPECT_EQ(0x89951377 + 3 + 0x14c8c402, + reader.ReadEncodedPointer(data + 3, encoding, &pointer_size)); + EXPECT_EQ(4U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_textrel) { + static const uint8_t data[] = { + 0xd9, 0x0d, 0x05, 0x17, 0xc9, 0x7a, 0x42, 0x1e + }; + ByteReader reader(ENDIANNESS_LITTLE); + reader.SetAddressSize(4); + reader.SetTextBase(0xb91beaf0); + DwarfPointerEncoding encoding = + DwarfPointerEncoding(google_breakpad::DW_EH_PE_textrel + | google_breakpad::DW_EH_PE_sdata2); + EXPECT_EQ((0xb91beaf0 + 0xffffc917) & 0xffffffff, + reader.ReadEncodedPointer(data + 3, encoding, &pointer_size)); + EXPECT_EQ(2U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_datarel) { + static const uint8_t data[] = { + 0x16, 0xf2, 0xbb, 0x82, 0x68, 0xa7, 0xbc, 0x39 + }; + ByteReader reader(ENDIANNESS_BIG); + reader.SetAddressSize(8); + reader.SetDataBase(0xbef308bd25ce74f0ULL); + DwarfPointerEncoding encoding = + DwarfPointerEncoding(google_breakpad::DW_EH_PE_datarel + | google_breakpad::DW_EH_PE_sleb128); + EXPECT_EQ(0xbef308bd25ce74f0ULL + 0xfffffffffffa013bULL, + reader.ReadEncodedPointer(data + 2, encoding, &pointer_size)); + EXPECT_EQ(3U, pointer_size); +} + +TEST_F(Reader, DW_EH_PE_funcrel) { + static const uint8_t data[] = { + 0x84, 0xf8, 0x14, 0x01, 0x61, 0xd1, 0x48, 0xc9 + }; + ByteReader reader(ENDIANNESS_BIG); + reader.SetAddressSize(4); + reader.SetFunctionBase(0x823c3520); + DwarfPointerEncoding encoding = + DwarfPointerEncoding(google_breakpad::DW_EH_PE_funcrel + | google_breakpad::DW_EH_PE_udata2); + EXPECT_EQ(0x823c3520 + 0xd148, + reader.ReadEncodedPointer(data + 5, encoding, &pointer_size)); + EXPECT_EQ(2U, pointer_size); +} + +TEST(UsableBase, CFI) { + static const uint8_t data[] = { 0x42 }; + ByteReader reader(ENDIANNESS_BIG); + reader.SetCFIDataBase(0xb31cbd20, data); + EXPECT_TRUE(reader.UsableEncoding(google_breakpad::DW_EH_PE_absptr)); + EXPECT_TRUE(reader.UsableEncoding(google_breakpad::DW_EH_PE_pcrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_textrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_datarel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_funcrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_omit)); + EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); +} + +TEST(UsableBase, Text) { + ByteReader reader(ENDIANNESS_BIG); + reader.SetTextBase(0xa899ccb9); + EXPECT_TRUE(reader.UsableEncoding(google_breakpad::DW_EH_PE_absptr)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_pcrel)); + EXPECT_TRUE(reader.UsableEncoding(google_breakpad::DW_EH_PE_textrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_datarel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_funcrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_omit)); + EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); +} + +TEST(UsableBase, Data) { + ByteReader reader(ENDIANNESS_BIG); + reader.SetDataBase(0xf7b10bcd); + EXPECT_TRUE(reader.UsableEncoding(google_breakpad::DW_EH_PE_absptr)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_pcrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_textrel)); + EXPECT_TRUE(reader.UsableEncoding(google_breakpad::DW_EH_PE_datarel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_funcrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_omit)); + EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); +} + +TEST(UsableBase, Function) { + ByteReader reader(ENDIANNESS_BIG); + reader.SetFunctionBase(0xc2c0ed81); + EXPECT_TRUE(reader.UsableEncoding(google_breakpad::DW_EH_PE_absptr)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_pcrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_textrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_datarel)); + EXPECT_TRUE(reader.UsableEncoding(google_breakpad::DW_EH_PE_funcrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_omit)); + EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); +} + +TEST(UsableBase, ClearFunction) { + ByteReader reader(ENDIANNESS_BIG); + reader.SetFunctionBase(0xc2c0ed81); + reader.ClearFunctionBase(); + EXPECT_TRUE(reader.UsableEncoding(google_breakpad::DW_EH_PE_absptr)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_pcrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_textrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_datarel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_funcrel)); + EXPECT_FALSE(reader.UsableEncoding(google_breakpad::DW_EH_PE_omit)); + EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60))); +} + +struct AlignedFixture { + AlignedFixture() : reader(ENDIANNESS_BIG) { reader.SetAddressSize(4); } + static const uint8_t data[10]; + ByteReader reader; + size_t pointer_size; +}; + +const uint8_t AlignedFixture::data[10] = { + 0xfe, 0x6e, 0x93, 0xd8, 0x34, 0xd5, 0x1c, 0xd3, 0xac, 0x2b +}; + +class Aligned: public AlignedFixture, public Test { }; + +TEST_F(Aligned, DW_EH_PE_aligned0) { + reader.SetCFIDataBase(0xb440305c, data); + EXPECT_EQ(0xfe6e93d8U, + reader.ReadEncodedPointer(data, google_breakpad::DW_EH_PE_aligned, + &pointer_size)); + EXPECT_EQ(4U, pointer_size); +} + +TEST_F(Aligned, DW_EH_PE_aligned1) { + reader.SetCFIDataBase(0xb440305d, data); + EXPECT_EQ(0xd834d51cU, + reader.ReadEncodedPointer(data, google_breakpad::DW_EH_PE_aligned, + &pointer_size)); + EXPECT_EQ(7U, pointer_size); +} + +TEST_F(Aligned, DW_EH_PE_aligned2) { + reader.SetCFIDataBase(0xb440305e, data); + EXPECT_EQ(0x93d834d5U, + reader.ReadEncodedPointer(data, google_breakpad::DW_EH_PE_aligned, + &pointer_size)); + EXPECT_EQ(6U, pointer_size); +} + +TEST_F(Aligned, DW_EH_PE_aligned3) { + reader.SetCFIDataBase(0xb440305f, data); + EXPECT_EQ(0x6e93d834U, + reader.ReadEncodedPointer(data, google_breakpad::DW_EH_PE_aligned, + &pointer_size)); + EXPECT_EQ(5U, pointer_size); +} + +TEST_F(Aligned, DW_EH_PE_aligned11) { + reader.SetCFIDataBase(0xb4403061, data); + EXPECT_EQ(0xd834d51cU, + reader.ReadEncodedPointer(data + 1, + google_breakpad::DW_EH_PE_aligned, + &pointer_size)); + EXPECT_EQ(6U, pointer_size); +} + +TEST_F(Aligned, DW_EH_PE_aligned30) { + reader.SetCFIDataBase(0xb4403063, data); + EXPECT_EQ(0x6e93d834U, + reader.ReadEncodedPointer(data + 1, + google_breakpad::DW_EH_PE_aligned, + &pointer_size)); + EXPECT_EQ(4U, pointer_size); +} + +TEST_F(Aligned, DW_EH_PE_aligned23) { + reader.SetCFIDataBase(0xb4403062, data); + EXPECT_EQ(0x1cd3ac2bU, + reader.ReadEncodedPointer(data + 3, + google_breakpad::DW_EH_PE_aligned, + &pointer_size)); + EXPECT_EQ(7U, pointer_size); +} + +TEST_F(Aligned, DW_EH_PE_aligned03) { + reader.SetCFIDataBase(0xb4403064, data); + EXPECT_EQ(0x34d51cd3U, + reader.ReadEncodedPointer(data + 3, + google_breakpad::DW_EH_PE_aligned, + &pointer_size)); + EXPECT_EQ(5U, pointer_size); +} diff --git a/src/common/dwarf/cfi_assembler.cc b/src/common/dwarf/cfi_assembler.cc new file mode 100644 index 0000000..b3e064f --- /dev/null +++ b/src/common/dwarf/cfi_assembler.cc @@ -0,0 +1,205 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// cfi_assembler.cc: Implementation of google_breakpad::CFISection class. +// See cfi_assembler.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/dwarf/cfi_assembler.h" + +#include +#include + +namespace google_breakpad { + +CFISection& CFISection::CIEHeader(uint64_t code_alignment_factor, + int data_alignment_factor, + unsigned return_address_register, + uint8_t version, + const string& augmentation, + bool dwarf64, + uint8_t address_size, + uint8_t segment_size) { + assert(!entry_length_); + entry_length_ = new PendingLength(); + in_fde_ = false; + + if (dwarf64) { + D32(kDwarf64InitialLengthMarker); + D64(entry_length_->length); + entry_length_->start = Here(); + D64(eh_frame_ ? kEHFrame64CIEIdentifier : kDwarf64CIEIdentifier); + } else { + D32(entry_length_->length); + entry_length_->start = Here(); + D32(eh_frame_ ? kEHFrame32CIEIdentifier : kDwarf32CIEIdentifier); + } + D8(version); + AppendCString(augmentation); + if (version >= 4) { + D8(address_size); + D8(segment_size); + } + ULEB128(code_alignment_factor); + LEB128(data_alignment_factor); + if (version == 1) + D8(return_address_register); + else + ULEB128(return_address_register); + return *this; +} + +CFISection& CFISection::FDEHeader(Label cie_pointer, + uint64_t initial_location, + uint64_t address_range, + bool dwarf64) { + assert(!entry_length_); + entry_length_ = new PendingLength(); + in_fde_ = true; + fde_start_address_ = initial_location; + + if (dwarf64) { + D32(0xffffffff); + D64(entry_length_->length); + entry_length_->start = Here(); + if (eh_frame_) + D64(Here() - cie_pointer); + else + D64(cie_pointer); + } else { + D32(entry_length_->length); + entry_length_->start = Here(); + if (eh_frame_) + D32(Here() - cie_pointer); + else + D32(cie_pointer); + } + EncodedPointer(initial_location); + // The FDE length in an .eh_frame section uses the same encoding as the + // initial location, but ignores the base address (selected by the upper + // nybble of the encoding), as it's a length, not an address that can be + // made relative. + EncodedPointer(address_range, + DwarfPointerEncoding(pointer_encoding_ & 0x0f)); + return *this; +} + +CFISection& CFISection::FinishEntry() { + assert(entry_length_); + Align(address_size_, DW_CFA_nop); + entry_length_->length = Here() - entry_length_->start; + delete entry_length_; + entry_length_ = NULL; + in_fde_ = false; + return *this; +} + +CFISection& CFISection::EncodedPointer(uint64_t address, + DwarfPointerEncoding encoding, + const EncodedPointerBases& bases) { + // Omitted data is extremely easy to emit. + if (encoding == DW_EH_PE_omit) + return *this; + + // If (encoding & DW_EH_PE_indirect) != 0, then we assume + // that ADDRESS is the address at which the pointer is stored --- in + // other words, that bit has no effect on how we write the pointer. + encoding = DwarfPointerEncoding(encoding & ~DW_EH_PE_indirect); + + // Find the base address to which this pointer is relative. The upper + // nybble of the encoding specifies this. + uint64_t base; + switch (encoding & 0xf0) { + case DW_EH_PE_absptr: base = 0; break; + case DW_EH_PE_pcrel: base = bases.cfi + Size(); break; + case DW_EH_PE_textrel: base = bases.text; break; + case DW_EH_PE_datarel: base = bases.data; break; + case DW_EH_PE_funcrel: base = fde_start_address_; break; + case DW_EH_PE_aligned: base = 0; break; + default: abort(); + }; + + // Make ADDRESS relative. Yes, this is appropriate even for "absptr" + // values; see gcc/unwind-pe.h. + address -= base; + + // Align the pointer, if required. + if ((encoding & 0xf0) == DW_EH_PE_aligned) + Align(AddressSize()); + + // Append ADDRESS to this section in the appropriate form. For the + // fixed-width forms, we don't need to differentiate between signed and + // unsigned encodings, because ADDRESS has already been extended to 64 + // bits before it was passed to us. + switch (encoding & 0x0f) { + case DW_EH_PE_absptr: + Address(address); + break; + + case DW_EH_PE_uleb128: + ULEB128(address); + break; + + case DW_EH_PE_sleb128: + LEB128(address); + break; + + case DW_EH_PE_udata2: + case DW_EH_PE_sdata2: + D16(address); + break; + + case DW_EH_PE_udata4: + case DW_EH_PE_sdata4: + D32(address); + break; + + case DW_EH_PE_udata8: + case DW_EH_PE_sdata8: + D64(address); + break; + + default: + abort(); + } + + return *this; +}; + +const uint32_t CFISection::kDwarf64InitialLengthMarker; +const uint32_t CFISection::kDwarf32CIEIdentifier; +const uint64_t CFISection::kDwarf64CIEIdentifier; +const uint32_t CFISection::kEHFrame32CIEIdentifier; +const uint64_t CFISection::kEHFrame64CIEIdentifier; + +} // namespace google_breakpad diff --git a/src/common/dwarf/cfi_assembler.h b/src/common/dwarf/cfi_assembler.h new file mode 100644 index 0000000..a33d5d8 --- /dev/null +++ b/src/common/dwarf/cfi_assembler.h @@ -0,0 +1,268 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// cfi_assembler.h: Define CFISection, a class for creating properly +// (and improperly) formatted DWARF CFI data for unit tests. + +#ifndef PROCESSOR_CFI_ASSEMBLER_H_ +#define PROCESSOR_CFI_ASSEMBLER_H_ + +#include + +#include "common/dwarf/dwarf2enums.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; + +class CFISection: public Section { + public: + + // CFI augmentation strings beginning with 'z', defined by the + // Linux/IA-64 C++ ABI, can specify interesting encodings for + // addresses appearing in FDE headers and call frame instructions (and + // for additional fields whose presence the augmentation string + // specifies). In particular, pointers can be specified to be relative + // to various base address: the start of the .text section, the + // location holding the address itself, and so on. These allow the + // frame data to be position-independent even when they live in + // write-protected pages. These variants are specified at the + // following two URLs: + // + // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/dwarfext.html + // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html + // + // CFISection leaves the production of well-formed 'z'-augmented CIEs and + // FDEs to the user, but does provide EncodedPointer, to emit + // properly-encoded addresses for a given pointer encoding. + // EncodedPointer uses an instance of this structure to find the base + // addresses it should use; you can establish a default for all encoded + // pointers appended to this section with SetEncodedPointerBases. + struct EncodedPointerBases { + EncodedPointerBases() : cfi(), text(), data() { } + + // The starting address of this CFI section in memory, for + // DW_EH_PE_pcrel. DW_EH_PE_pcrel pointers may only be used in data + // that has is loaded into the program's address space. + uint64_t cfi; + + // The starting address of this file's .text section, for DW_EH_PE_textrel. + uint64_t text; + + // The starting address of this file's .got or .eh_frame_hdr section, + // for DW_EH_PE_datarel. + uint64_t data; + }; + + // Create a CFISection whose endianness is ENDIANNESS, and where + // machine addresses are ADDRESS_SIZE bytes long. If EH_FRAME is + // true, use the .eh_frame format, as described by the Linux + // Standards Base Core Specification, instead of the DWARF CFI + // format. + CFISection(google_breakpad::test_assembler::Endianness endianness, size_t address_size, + bool eh_frame = false) + : Section(endianness), address_size_(address_size), eh_frame_(eh_frame), + pointer_encoding_(DW_EH_PE_absptr), + encoded_pointer_bases_(), entry_length_(NULL), in_fde_(false) { + // The 'start', 'Here', and 'Mark' members of a CFISection all refer + // to section offsets. + start() = 0; + } + + // Return this CFISection's address size. + size_t AddressSize() const { return address_size_; } + + // Return true if this CFISection uses the .eh_frame format, or + // false if it contains ordinary DWARF CFI data. + bool ContainsEHFrame() const { return eh_frame_; } + + // Use ENCODING for pointers in calls to FDEHeader and EncodedPointer. + void SetPointerEncoding(DwarfPointerEncoding encoding) { + pointer_encoding_ = encoding; + } + + // Use the addresses in BASES as the base addresses for encoded + // pointers in subsequent calls to FDEHeader or EncodedPointer. + // This function makes a copy of BASES. + void SetEncodedPointerBases(const EncodedPointerBases& bases) { + encoded_pointer_bases_ = bases; + } + + // Append a Common Information Entry header to this section with the + // given values. If dwarf64 is true, use the 64-bit DWARF initial + // length format for the CIE's initial length. Return a reference to + // this section. You should call FinishEntry after writing the last + // instruction for the CIE. + // + // Before calling this function, you will typically want to use Mark + // or Here to make a label to pass to FDEHeader that refers to this + // CIE's position in the section. + CFISection& CIEHeader(uint64_t code_alignment_factor, + int data_alignment_factor, + unsigned return_address_register, + uint8_t version = 3, + const string& augmentation = "", + bool dwarf64 = false, + uint8_t address_size = 8, + uint8_t segment_size = 0); + + // Append a Frame Description Entry header to this section with the + // given values. If dwarf64 is true, use the 64-bit DWARF initial + // length format for the CIE's initial length. Return a reference to + // this section. You should call FinishEntry after writing the last + // instruction for the CIE. + // + // This function doesn't support entries that are longer than + // 0xffffff00 bytes. (The "initial length" is always a 32-bit + // value.) Nor does it support .debug_frame sections longer than + // 0xffffff00 bytes. + CFISection& FDEHeader(Label cie_pointer, + uint64_t initial_location, + uint64_t address_range, + bool dwarf64 = false); + + // Note the current position as the end of the last CIE or FDE we + // started, after padding with DW_CFA_nops for alignment. This + // defines the label representing the entry's length, cited in the + // entry's header. Return a reference to this section. + CFISection& FinishEntry(); + + // Append the contents of BLOCK as a DW_FORM_block value: an + // unsigned LEB128 length, followed by that many bytes of data. + CFISection& Block(const string& block) { + ULEB128(block.size()); + Append(block); + return *this; + } + + // Append ADDRESS to this section, in the appropriate size and + // endianness. Return a reference to this section. + CFISection& Address(uint64_t address) { + Section::Append(endianness(), address_size_, address); + return *this; + } + CFISection& Address(Label address) { + Section::Append(endianness(), address_size_, address); + return *this; + } + + // Append ADDRESS to this section, using ENCODING and BASES. ENCODING + // defaults to this section's default encoding, established by + // SetPointerEncoding. BASES defaults to this section's bases, set by + // SetEncodedPointerBases. If the DW_EH_PE_indirect bit is set in the + // encoding, assume that ADDRESS is where the true address is stored. + // Return a reference to this section. + // + // (C++ doesn't let me use default arguments here, because I want to + // refer to members of *this in the default argument expression.) + CFISection& EncodedPointer(uint64_t address) { + return EncodedPointer(address, pointer_encoding_, encoded_pointer_bases_); + } + CFISection& EncodedPointer(uint64_t address, DwarfPointerEncoding encoding) { + return EncodedPointer(address, encoding, encoded_pointer_bases_); + } + CFISection& EncodedPointer(uint64_t address, DwarfPointerEncoding encoding, + const EncodedPointerBases& bases); + + // Restate some member functions, to keep chaining working nicely. + CFISection& Mark(Label* label) { Section::Mark(label); return *this; } + CFISection& D8(uint8_t v) { Section::D8(v); return *this; } + CFISection& D16(uint16_t v) { Section::D16(v); return *this; } + CFISection& D16(Label v) { Section::D16(v); return *this; } + CFISection& D32(uint32_t v) { Section::D32(v); return *this; } + CFISection& D32(const Label& v) { Section::D32(v); return *this; } + CFISection& D64(uint64_t v) { Section::D64(v); return *this; } + CFISection& D64(const Label& v) { Section::D64(v); return *this; } + CFISection& LEB128(long long v) { Section::LEB128(v); return *this; } + CFISection& ULEB128(uint64_t v) { Section::ULEB128(v); return *this; } + + private: + // A length value that we've appended to the section, but is not yet + // known. LENGTH is the appended value; START is a label referring + // to the start of the data whose length was cited. + struct PendingLength { + Label length; + Label start; + }; + + // Constants used in CFI/.eh_frame data: + + // If the first four bytes of an "initial length" are this constant, then + // the data uses the 64-bit DWARF format, and the length itself is the + // subsequent eight bytes. + static const uint32_t kDwarf64InitialLengthMarker = 0xffffffffU; + + // The CIE identifier for 32- and 64-bit DWARF CFI and .eh_frame data. + static const uint32_t kDwarf32CIEIdentifier = ~(uint32_t)0; + static const uint64_t kDwarf64CIEIdentifier = ~(uint64_t)0; + static const uint32_t kEHFrame32CIEIdentifier = 0; + static const uint64_t kEHFrame64CIEIdentifier = 0; + + // The size of a machine address for the data in this section. + size_t address_size_; + + // If true, we are generating a Linux .eh_frame section, instead of + // a standard DWARF .debug_frame section. + bool eh_frame_; + + // The encoding to use for FDE pointers. + DwarfPointerEncoding pointer_encoding_; + + // The base addresses to use when emitting encoded pointers. + EncodedPointerBases encoded_pointer_bases_; + + // The length value for the current entry. + // + // Oddly, this must be dynamically allocated. Labels never get new + // values; they only acquire constraints on the value they already + // have, or assert if you assign them something incompatible. So + // each header needs truly fresh Label objects to cite in their + // headers and track their positions. The alternative is explicit + // destructor invocation and a placement new. Ick. + PendingLength *entry_length_; + + // True if we are currently emitting an FDE --- that is, we have + // called FDEHeader but have not yet called FinishEntry. + bool in_fde_; + + // If in_fde_ is true, this is its starting address. We use this for + // emitting DW_EH_PE_funcrel pointers. + uint64_t fde_start_address_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_CFI_ASSEMBLER_H_ diff --git a/src/common/dwarf/dwarf2diehandler.cc b/src/common/dwarf/dwarf2diehandler.cc new file mode 100644 index 0000000..8aea0f2 --- /dev/null +++ b/src/common/dwarf/dwarf2diehandler.cc @@ -0,0 +1,203 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf2diehandler.cc: Implement the dwarf2reader::DieDispatcher class. +// See dwarf2diehandler.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include + +#include "common/dwarf/dwarf2diehandler.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +DIEDispatcher::~DIEDispatcher() { + while (!die_handlers_.empty()) { + HandlerStack& entry = die_handlers_.top(); + if (entry.handler_ != root_handler_) + delete entry.handler_; + die_handlers_.pop(); + } +} + +bool DIEDispatcher::StartCompilationUnit(uint64_t offset, uint8_t address_size, + uint8_t offset_size, uint64_t cu_length, + uint8_t dwarf_version) { + return root_handler_->StartCompilationUnit(offset, address_size, + offset_size, cu_length, + dwarf_version); +} + +bool DIEDispatcher::StartDIE(uint64_t offset, enum DwarfTag tag) { + // The stack entry for the parent of this DIE, if there is one. + HandlerStack* parent = die_handlers_.empty() ? NULL : &die_handlers_.top(); + + // Does this call indicate that we're done receiving the parent's + // attributes' values? If so, call its EndAttributes member function. + if (parent && parent->handler_ && !parent->reported_attributes_end_) { + parent->reported_attributes_end_ = true; + if (!parent->handler_->EndAttributes()) { + // Finish off this handler now. and edit *PARENT to indicate that + // we don't want to visit any of the children. + parent->handler_->Finish(); + if (parent->handler_ != root_handler_) + delete parent->handler_; + parent->handler_ = NULL; + return false; + } + } + + // Find a handler for this DIE. + DIEHandler* handler; + if (parent) { + if (parent->handler_) + // Ask the parent to find a handler. + handler = parent->handler_->FindChildHandler(offset, tag); + else + // No parent handler means we're not interested in any of our + // children. + handler = NULL; + } else { + // This is the root DIE. For a non-root DIE, the parent's handler + // decides whether to visit it, but the root DIE has no parent + // handler, so we have a special method on the root DIE handler + // itself to decide. + if (root_handler_->StartRootDIE(offset, tag)) + handler = root_handler_; + else + handler = NULL; + } + + // Push a handler stack entry for this new handler. As an + // optimization, we don't push NULL-handler entries on top of other + // NULL-handler entries; we just let the oldest such entry stand for + // the whole subtree. + if (handler || !parent || parent->handler_) { + HandlerStack entry; + entry.offset_ = offset; + entry.handler_ = handler; + entry.reported_attributes_end_ = false; + die_handlers_.push(entry); + } + + return handler != NULL; +} + +void DIEDispatcher::EndDIE(uint64_t offset) { + assert(!die_handlers_.empty()); + HandlerStack* entry = &die_handlers_.top(); + if (entry->handler_) { + // This entry had better be the handler for this DIE. + assert(entry->offset_ == offset); + // If a DIE has no children, this EndDIE call indicates that we're + // done receiving its attributes' values. + if (!entry->reported_attributes_end_) + entry->handler_->EndAttributes(); // Ignore return value: no children. + entry->handler_->Finish(); + if (entry->handler_ != root_handler_) + delete entry->handler_; + } else { + // If this DIE is within a tree we're ignoring, then don't pop the + // handler stack: that entry stands for the whole tree. + if (entry->offset_ != offset) + return; + } + die_handlers_.pop(); +} + +void DIEDispatcher::ProcessAttributeUnsigned(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { + HandlerStack& current = die_handlers_.top(); + // This had better be an attribute of the DIE we were meant to handle. + assert(offset == current.offset_); + current.handler_->ProcessAttributeUnsigned(attr, form, data); +} + +void DIEDispatcher::ProcessAttributeSigned(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + int64_t data) { + HandlerStack& current = die_handlers_.top(); + // This had better be an attribute of the DIE we were meant to handle. + assert(offset == current.offset_); + current.handler_->ProcessAttributeSigned(attr, form, data); +} + +void DIEDispatcher::ProcessAttributeReference(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { + HandlerStack& current = die_handlers_.top(); + // This had better be an attribute of the DIE we were meant to handle. + assert(offset == current.offset_); + current.handler_->ProcessAttributeReference(attr, form, data); +} + +void DIEDispatcher::ProcessAttributeBuffer(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const uint8_t* data, + uint64_t len) { + HandlerStack& current = die_handlers_.top(); + // This had better be an attribute of the DIE we were meant to handle. + assert(offset == current.offset_); + current.handler_->ProcessAttributeBuffer(attr, form, data, len); +} + +void DIEDispatcher::ProcessAttributeString(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const string& data) { + HandlerStack& current = die_handlers_.top(); + // This had better be an attribute of the DIE we were meant to handle. + assert(offset == current.offset_); + current.handler_->ProcessAttributeString(attr, form, data); +} + +void DIEDispatcher::ProcessAttributeSignature(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t signature) { + HandlerStack& current = die_handlers_.top(); + // This had better be an attribute of the DIE we were meant to handle. + assert(offset == current.offset_); + current.handler_->ProcessAttributeSignature(attr, form, signature); +} + +} // namespace google_breakpad diff --git a/src/common/dwarf/dwarf2diehandler.h b/src/common/dwarf/dwarf2diehandler.h new file mode 100644 index 0000000..02c2285 --- /dev/null +++ b/src/common/dwarf/dwarf2diehandler.h @@ -0,0 +1,368 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf2reader::CompilationUnit is a simple and direct parser for +// DWARF data, but its handler interface is not convenient to use. In +// particular: +// +// - CompilationUnit calls Dwarf2Handler's member functions to report +// every attribute's value, regardless of what sort of DIE it is. +// As a result, the ProcessAttributeX functions end up looking like +// this: +// +// switch (parent_die_tag) { +// case DW_TAG_x: +// switch (attribute_name) { +// case DW_AT_y: +// handle attribute y of DIE type x +// ... +// } break; +// ... +// } +// +// In C++ it's much nicer to use virtual function dispatch to find +// the right code for a given case than to switch on the DIE tag +// like this. +// +// - Processing different kinds of DIEs requires different sets of +// data: lexical block DIEs have start and end addresses, but struct +// type DIEs don't. It would be nice to be able to have separate +// handler classes for separate kinds of DIEs, each with the members +// appropriate to its role, instead of having one handler class that +// needs to hold data for every DIE type. +// +// - There should be a separate instance of the appropriate handler +// class for each DIE, instead of a single object with tables +// tracking all the dies in the compilation unit. +// +// - It's not convenient to take some action after all a DIE's +// attributes have been seen, but before visiting any of its +// children. The only indication you have that a DIE's attribute +// list is complete is that you get either a StartDIE or an EndDIE +// call. +// +// - It's not convenient to make use of the tree structure of the +// DIEs. Skipping all the children of a given die requires +// maintaining state and returning false from StartDIE until we get +// an EndDIE call with the appropriate offset. +// +// This interface tries to take care of all that. (You're shocked, I'm sure.) +// +// Using the classes here, you provide an initial handler for the root +// DIE of the compilation unit. Each handler receives its DIE's +// attributes, and provides fresh handler objects for children of +// interest, if any. The three classes are: +// +// - DIEHandler: the base class for your DIE-type-specific handler +// classes. +// +// - RootDIEHandler: derived from DIEHandler, the base class for your +// root DIE handler class. +// +// - DIEDispatcher: derived from Dwarf2Handler, an instance of this +// invokes your DIE-type-specific handler objects. +// +// In detail: +// +// - Define handler classes specialized for the DIE types you're +// interested in. These handler classes must inherit from +// DIEHandler. Thus: +// +// class My_DW_TAG_X_Handler: public DIEHandler { ... }; +// class My_DW_TAG_Y_Handler: public DIEHandler { ... }; +// +// DIEHandler subclasses needn't correspond exactly to single DIE +// types, as shown here; the point is that you can have several +// different classes appropriate to different kinds of DIEs. +// +// - In particular, define a handler class for the compilation +// unit's root DIE, that inherits from RootDIEHandler: +// +// class My_DW_TAG_compile_unit_Handler: public RootDIEHandler { ... }; +// +// RootDIEHandler inherits from DIEHandler, adding a few additional +// member functions for examining the compilation unit as a whole, +// and other quirks of rootness. +// +// - Then, create a DIEDispatcher instance, passing it an instance of +// your root DIE handler class, and use that DIEDispatcher as the +// dwarf2reader::CompilationUnit's handler: +// +// My_DW_TAG_compile_unit_Handler root_die_handler(...); +// DIEDispatcher die_dispatcher(&root_die_handler); +// CompilationUnit reader(sections, offset, bytereader, &die_dispatcher); +// +// Here, 'die_dispatcher' acts as a shim between 'reader' and the +// various DIE-specific handlers you have defined. +// +// - When you call reader.Start(), die_dispatcher behaves as follows, +// starting with your root die handler and the compilation unit's +// root DIE: +// +// - It calls the handler's ProcessAttributeX member functions for +// each of the DIE's attributes. +// +// - It calls the handler's EndAttributes member function. This +// should return true if any of the DIE's children should be +// visited, in which case: +// +// - For each of the DIE's children, die_dispatcher calls the +// DIE's handler's FindChildHandler member function. If that +// returns a pointer to a DIEHandler instance, then +// die_dispatcher uses that handler to process the child, using +// this procedure recursively. Alternatively, if +// FindChildHandler returns NULL, die_dispatcher ignores that +// child and its descendants. +// +// - When die_dispatcher has finished processing all the DIE's +// children, it invokes the handler's Finish() member function, +// and destroys the handler. (As a special case, it doesn't +// destroy the root DIE handler.) +// +// This allows the code for handling a particular kind of DIE to be +// gathered together in a single class, makes it easy to skip all the +// children or individual children of a particular DIE, and provides +// appropriate parental context for each die. + +#ifndef COMMON_DWARF_DWARF2DIEHANDLER_H__ +#define COMMON_DWARF_DWARF2DIEHANDLER_H__ + +#include + +#include +#include + +#include "common/dwarf/types.h" +#include "common/dwarf/dwarf2enums.h" +#include "common/dwarf/dwarf2reader.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +// A base class for handlers for specific DIE types. The series of +// calls made on a DIE handler is as follows: +// +// - for each attribute of the DIE: +// - ProcessAttributeX() +// - EndAttributes() +// - if that returned true, then for each child: +// - FindChildHandler() +// - if that returns a non-NULL pointer to a new handler: +// - recurse, with the new handler and the child die +// - Finish() +// - destruction +class DIEHandler { + public: + DIEHandler() { } + virtual ~DIEHandler() { } + + // When we visit a DIE, we first use these member functions to + // report the DIE's attributes and their values. These have the + // same restrictions as the corresponding member functions of + // dwarf2reader::Dwarf2Handler. + // + // Since DWARF does not specify in what order attributes must + // appear, avoid making decisions in these functions that would be + // affected by the presence of other attributes. The EndAttributes + // function is a more appropriate place for such work, as all the + // DIE's attributes have been seen at that point. + // + // The default definitions ignore the values they are passed. + virtual void ProcessAttributeUnsigned(enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { } + virtual void ProcessAttributeSigned(enum DwarfAttribute attr, + enum DwarfForm form, + int64_t data) { } + virtual void ProcessAttributeReference(enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { } + virtual void ProcessAttributeBuffer(enum DwarfAttribute attr, + enum DwarfForm form, + const uint8_t* data, + uint64_t len) { } + virtual void ProcessAttributeString(enum DwarfAttribute attr, + enum DwarfForm form, + const string& data) { } + virtual void ProcessAttributeSignature(enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t signture) { } + + // Once we have reported all the DIE's attributes' values, we call + // this member function. If it returns false, we skip all the DIE's + // children. If it returns true, we call FindChildHandler on each + // child. If that returns a handler object, we use that to visit + // the child; otherwise, we skip the child. + // + // This is a good place to make decisions that depend on more than + // one attribute. DWARF does not specify in what order attributes + // must appear, so only when the EndAttributes function is called + // does the handler have a complete picture of the DIE's attributes. + // + // The default definition elects to ignore the DIE's children. + // You'll need to override this if you override FindChildHandler, + // but at least the default behavior isn't to pass the children to + // FindChildHandler, which then ignores them all. + virtual bool EndAttributes() { return false; } + + // If EndAttributes returns true to indicate that some of the DIE's + // children might be of interest, then we apply this function to + // each of the DIE's children. If it returns a handler object, then + // we use that to visit the child DIE. If it returns NULL, we skip + // that child DIE (and all its descendants). + // + // OFFSET is the offset of the child; TAG indicates what kind of DIE + // it is. + // + // The default definition skips all children. + virtual DIEHandler* FindChildHandler(uint64_t offset, enum DwarfTag tag) { + return NULL; + } + + // When we are done processing a DIE, we call this member function. + // This happens after the EndAttributes call, all FindChildHandler + // calls (if any), and all operations on the children themselves (if + // any). We call Finish on every handler --- even if EndAttributes + // returns false. + virtual void Finish() { }; +}; + +// A subclass of DIEHandler, with additional kludges for handling the +// compilation unit's root die. +class RootDIEHandler : public DIEHandler { + public: + bool handle_inline; + + explicit RootDIEHandler(bool handle_inline = false) + : handle_inline(handle_inline) {} + virtual ~RootDIEHandler() {} + + // We pass the values reported via Dwarf2Handler::StartCompilationUnit + // to this member function, and skip the entire compilation unit if it + // returns false. So the root DIE handler is actually also + // responsible for handling the compilation unit metadata. + // The default definition always visits the compilation unit. + virtual bool StartCompilationUnit(uint64_t offset, uint8_t address_size, + uint8_t offset_size, uint64_t cu_length, + uint8_t dwarf_version) { return true; } + + // For the root DIE handler only, we pass the offset, tag and + // attributes of the compilation unit's root DIE. This is the only + // way the root DIE handler can find the root DIE's tag. If this + // function returns true, we will visit the root DIE using the usual + // DIEHandler methods; otherwise, we skip the entire compilation + // unit. + // + // The default definition elects to visit the root DIE. + virtual bool StartRootDIE(uint64_t offset, enum DwarfTag tag) { return true; } +}; + +class DIEDispatcher: public Dwarf2Handler { + public: + // Create a Dwarf2Handler which uses ROOT_HANDLER as the handler for + // the compilation unit's root die, as described for the DIEHandler + // class. + DIEDispatcher(RootDIEHandler* root_handler) : root_handler_(root_handler) { } + // Destroying a DIEDispatcher destroys all active handler objects + // except the root handler. + ~DIEDispatcher(); + bool StartCompilationUnit(uint64_t offset, uint8_t address_size, + uint8_t offset_size, uint64_t cu_length, + uint8_t dwarf_version); + bool StartDIE(uint64_t offset, enum DwarfTag tag); + void ProcessAttributeUnsigned(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data); + void ProcessAttributeSigned(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + int64_t data); + void ProcessAttributeReference(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data); + void ProcessAttributeBuffer(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const uint8_t* data, + uint64_t len); + void ProcessAttributeString(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const string& data); + void ProcessAttributeSignature(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t signature); + void EndDIE(uint64_t offset); + + private: + + // The type of a handler stack entry. This includes some fields + // which don't really need to be on the stack --- they could just be + // single data members of DIEDispatcher --- but putting them here + // makes it easier to see that the code is correct. + struct HandlerStack { + // The offset of the DIE for this handler stack entry. + uint64_t offset_; + + // The handler object interested in this DIE's attributes and + // children. If NULL, we're not interested in either. + DIEHandler* handler_; + + // Have we reported the end of this DIE's attributes to the handler? + bool reported_attributes_end_; + }; + + // Stack of DIE attribute handlers. At StartDIE(D), the top of the + // stack is the handler of D's parent, whom we may ask for a handler + // for D itself. At EndDIE(D), the top of the stack is D's handler. + // Special cases: + // + // - Before we've seen the compilation unit's root DIE, the stack is + // empty; we'll call root_handler_'s special member functions, and + // perhaps push root_handler_ on the stack to look at the root's + // immediate children. + // + // - When we decide to ignore a subtree, we only push an entry on + // the stack for the root of the tree being ignored, rather than + // pushing lots of stack entries with handler_ set to NULL. + std::stack die_handlers_; + + // The root handler. We don't push it on die_handlers_ until we + // actually get the StartDIE call for the root. + RootDIEHandler* root_handler_; +}; + +} // namespace google_breakpad +#endif // COMMON_DWARF_DWARF2DIEHANDLER_H__ diff --git a/src/common/dwarf/dwarf2diehandler_unittest.cc b/src/common/dwarf/dwarf2diehandler_unittest.cc new file mode 100644 index 0000000..afcbf62 --- /dev/null +++ b/src/common/dwarf/dwarf2diehandler_unittest.cc @@ -0,0 +1,532 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf2diehander_unittest.cc: Unit tests for google_breakpad::DIEDispatcher. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include +#include + +#include "breakpad_googletest_includes.h" + +#include "common/dwarf/dwarf2diehandler.h" +#include "common/using_std_string.h" + +using std::make_pair; + +using ::testing::_; +using ::testing::ContainerEq; +using ::testing::ElementsAreArray; +using ::testing::Eq; +using ::testing::InSequence; +using ::testing::Return; +using ::testing::Sequence; +using ::testing::StrEq; + +using google_breakpad::DIEDispatcher; +using google_breakpad::DIEHandler; +using google_breakpad::DwarfAttribute; +using google_breakpad::DwarfForm; +using google_breakpad::DwarfTag; +using google_breakpad::RootDIEHandler; + +class MockDIEHandler: public DIEHandler { + public: + MOCK_METHOD3(ProcessAttributeUnsigned, + void(DwarfAttribute, DwarfForm, uint64_t)); + MOCK_METHOD3(ProcessAttributeSigned, + void(DwarfAttribute, DwarfForm, int64_t)); + MOCK_METHOD3(ProcessAttributeReference, + void(DwarfAttribute, DwarfForm, uint64_t)); + MOCK_METHOD4(ProcessAttributeBuffer, + void(DwarfAttribute, DwarfForm, const uint8_t*, uint64_t)); + MOCK_METHOD3(ProcessAttributeString, + void(DwarfAttribute, DwarfForm, const string&)); + MOCK_METHOD3(ProcessAttributeSignature, + void(DwarfAttribute, DwarfForm, uint64_t)); + MOCK_METHOD0(EndAttributes, bool()); + MOCK_METHOD2(FindChildHandler, DIEHandler *(uint64_t, DwarfTag)); + MOCK_METHOD0(Finish, void()); +}; + +class MockRootDIEHandler: public RootDIEHandler { + public: + MOCK_METHOD3(ProcessAttributeUnsigned, + void(DwarfAttribute, DwarfForm, uint64_t)); + MOCK_METHOD3(ProcessAttributeSigned, + void(DwarfAttribute, DwarfForm, int64_t)); + MOCK_METHOD3(ProcessAttributeReference, + void(DwarfAttribute, DwarfForm, uint64_t)); + MOCK_METHOD4(ProcessAttributeBuffer, + void(DwarfAttribute, DwarfForm, const uint8_t*, uint64_t)); + MOCK_METHOD3(ProcessAttributeString, + void(DwarfAttribute, DwarfForm, const string&)); + MOCK_METHOD3(ProcessAttributeSignature, + void(DwarfAttribute, DwarfForm, uint64_t)); + MOCK_METHOD0(EndAttributes, bool()); + MOCK_METHOD2(FindChildHandler, DIEHandler *(uint64_t, DwarfTag)); + MOCK_METHOD0(Finish, void()); + MOCK_METHOD5(StartCompilationUnit, bool(uint64_t, uint8_t, uint8_t, uint64_t, + uint8_t)); + MOCK_METHOD2(StartRootDIE, bool(uint64_t, DwarfTag)); +}; + +// If the handler elects to skip the compilation unit, the dispatcher +// should tell the reader so. +TEST(Dwarf2DIEHandler, SkipCompilationUnit) { + Sequence s; + MockRootDIEHandler mock_root_handler; + DIEDispatcher die_dispatcher(&mock_root_handler); + + EXPECT_CALL(mock_root_handler, + StartCompilationUnit(0x8d42aed77cfccf3eLL, + 0x89, 0xdc, + 0x2ecb4dc778a80f21LL, + 0x66)) + .InSequence(s) + .WillOnce(Return(false)); + + EXPECT_FALSE(die_dispatcher.StartCompilationUnit(0x8d42aed77cfccf3eLL, + 0x89, 0xdc, + 0x2ecb4dc778a80f21LL, + 0x66)); +} + +// If the handler elects to skip the root DIE, the dispatcher should +// tell the reader so. +TEST(Dwarf2DIEHandler, SkipRootDIE) { + Sequence s; + MockRootDIEHandler mock_root_handler; + DIEDispatcher die_dispatcher(&mock_root_handler); + + EXPECT_CALL(mock_root_handler, + StartCompilationUnit(0xde8994029fc8b999LL, 0xf4, 0x02, + 0xb00febffa76e2b2bLL, 0x5c)) + .InSequence(s) + .WillOnce(Return(true)); + EXPECT_CALL(mock_root_handler, + StartRootDIE(0x7d08242b4b510cf2LL, (DwarfTag) 0xb4f98da6)) + .InSequence(s) + .WillOnce(Return(false)); + + EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0xde8994029fc8b999LL, + 0xf4, 0x02, + 0xb00febffa76e2b2bLL, 0x5c)); + EXPECT_FALSE(die_dispatcher.StartDIE(0x7d08242b4b510cf2LL, + (DwarfTag) 0xb4f98da6)); + die_dispatcher.EndDIE(0x7d08242b4b510cf2LL); +} + +// If the handler elects to skip the root DIE's children, the +// dispatcher should tell the reader so --- and avoid deleting the +// root handler. +TEST(Dwarf2DIEHandler, SkipRootDIEChildren) { + MockRootDIEHandler mock_root_handler; + DIEDispatcher die_dispatcher(&mock_root_handler); + + { + InSequence s; + + EXPECT_CALL(mock_root_handler, + StartCompilationUnit(0x15d6897480cc65a7LL, 0x26, 0xa0, + 0x09f8bf0767f91675LL, 0xdb)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_root_handler, + StartRootDIE(0x7d08242b4b510cf2LL, (DwarfTag) 0xb4f98da6)) + .WillOnce(Return(true)); + // Please don't tell me about my children. + EXPECT_CALL(mock_root_handler, EndAttributes()) + .WillOnce(Return(false)); + EXPECT_CALL(mock_root_handler, Finish()) + .WillOnce(Return()); + } + + EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0x15d6897480cc65a7LL, + 0x26, 0xa0, + 0x09f8bf0767f91675LL, 0xdb)); + EXPECT_TRUE(die_dispatcher.StartDIE(0x7d08242b4b510cf2LL, + (DwarfTag) 0xb4f98da6)); + EXPECT_FALSE(die_dispatcher.StartDIE(0x435150ceedccda18LL, + (DwarfTag) 0xc3a17bba)); + die_dispatcher.EndDIE(0x435150ceedccda18LL); + die_dispatcher.EndDIE(0x7d08242b4b510cf2LL); +} + +// The dispatcher should pass attribute values through to the die +// handler accurately. +TEST(Dwarf2DIEHandler, PassAttributeValues) { + MockRootDIEHandler mock_root_handler; + DIEDispatcher die_dispatcher(&mock_root_handler); + + const uint8_t buffer[10] = { + 0x24, 0x24, 0x35, 0x9a, 0xca, 0xcf, 0xa8, 0x84, 0xa7, 0x18 + }; + string str = "\xc8\x26\x2e\x0d\xa4\x9c\x37\xd6\xfb\x1d"; + + // Set expectations. + { + InSequence s; + + // We'll like the compilation unit header. + EXPECT_CALL(mock_root_handler, + StartCompilationUnit(0x8d42aed77cfccf3eLL, 0x89, 0xdc, + 0x2ecb4dc778a80f21LL, 0x66)) + .WillOnce(Return(true)); + + // We'll like the root DIE. + EXPECT_CALL(mock_root_handler, + StartRootDIE(0xe2222da01e29f2a9LL, (DwarfTag) 0x9829445c)) + .WillOnce(Return(true)); + + // Expect some attribute values. + EXPECT_CALL(mock_root_handler, + ProcessAttributeUnsigned((DwarfAttribute) 0x1cc0bfed, + (DwarfForm) 0x424f1468, + 0xa592571997facda1ULL)) + .WillOnce(Return()); + EXPECT_CALL(mock_root_handler, + ProcessAttributeSigned((DwarfAttribute) 0x43694dc9, + (DwarfForm) 0xf6f78901L, + 0x92602a4e3bf1f446LL)) + .WillOnce(Return()); + EXPECT_CALL(mock_root_handler, + ProcessAttributeReference((DwarfAttribute) 0x4033e8cL, + (DwarfForm) 0xf66fbe0bL, + 0x50fddef44734fdecULL)) + .WillOnce(Return()); + EXPECT_CALL(mock_root_handler, + ProcessAttributeBuffer((DwarfAttribute) 0x25d7e0af, + (DwarfForm) 0xe99a539a, + buffer, sizeof(buffer))) + .WillOnce(Return()); + EXPECT_CALL(mock_root_handler, + ProcessAttributeString((DwarfAttribute) 0x310ed065, + (DwarfForm) 0x15762fec, + StrEq(str))) + .WillOnce(Return()); + EXPECT_CALL(mock_root_handler, + ProcessAttributeSignature((DwarfAttribute) 0x58790d72, + (DwarfForm) 0x4159f138, + 0x94682463613e6a5fULL)) + .WillOnce(Return()); + EXPECT_CALL(mock_root_handler, EndAttributes()) + .WillOnce(Return(true)); + EXPECT_CALL(mock_root_handler, FindChildHandler(_, _)) + .Times(0); + EXPECT_CALL(mock_root_handler, Finish()) + .WillOnce(Return()); + } + + // Drive the dispatcher. + + // Report the CU header. + EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0x8d42aed77cfccf3eLL, + 0x89, 0xdc, + 0x2ecb4dc778a80f21LL, + 0x66)); + // Report the root DIE. + EXPECT_TRUE(die_dispatcher.StartDIE(0xe2222da01e29f2a9LL, + (DwarfTag) 0x9829445c)); + + // Report some attribute values. + die_dispatcher.ProcessAttributeUnsigned(0xe2222da01e29f2a9LL, + (DwarfAttribute) 0x1cc0bfed, + (DwarfForm) 0x424f1468, + 0xa592571997facda1ULL); + die_dispatcher.ProcessAttributeSigned(0xe2222da01e29f2a9LL, + (DwarfAttribute) 0x43694dc9, + (DwarfForm) 0xf6f78901, + 0x92602a4e3bf1f446LL); + die_dispatcher.ProcessAttributeReference(0xe2222da01e29f2a9LL, + (DwarfAttribute) 0x4033e8c, + (DwarfForm) 0xf66fbe0b, + 0x50fddef44734fdecULL); + die_dispatcher.ProcessAttributeBuffer(0xe2222da01e29f2a9LL, + (DwarfAttribute) 0x25d7e0af, + (DwarfForm) 0xe99a539a, + buffer, sizeof(buffer)); + die_dispatcher.ProcessAttributeString(0xe2222da01e29f2a9LL, + (DwarfAttribute) 0x310ed065, + (DwarfForm) 0x15762fec, + str); + die_dispatcher.ProcessAttributeSignature(0xe2222da01e29f2a9LL, + (DwarfAttribute) 0x58790d72, + (DwarfForm) 0x4159f138, + 0x94682463613e6a5fULL); + + // Finish the root DIE (and thus the CU). + die_dispatcher.EndDIE(0xe2222da01e29f2a9LL); +} + +TEST(Dwarf2DIEHandler, FindAndSkipChildren) { + MockRootDIEHandler mock_root_handler; + MockDIEHandler *mock_child1_handler = new(MockDIEHandler); + MockDIEHandler *mock_child3_handler = new(MockDIEHandler); + DIEDispatcher die_dispatcher(&mock_root_handler); + + { + InSequence s; + + // We'll like the compilation unit header. + EXPECT_CALL(mock_root_handler, + StartCompilationUnit(0x9ec1e6d05e434a0eLL, 0xeb, 0x21, + 0x47dd3c764275a216LL, 0xa5)) + .WillOnce(Return(true)); + + // Root DIE. + { + EXPECT_CALL(mock_root_handler, + StartRootDIE(0x15f0e06bdfe3c372LL, (DwarfTag) 0xf5d60c59)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_root_handler, + ProcessAttributeSigned((DwarfAttribute) 0xf779a642, + (DwarfForm) 0x2cb63027, + 0x18e744661769d08fLL)) + .WillOnce(Return()); + EXPECT_CALL(mock_root_handler, EndAttributes()) + .WillOnce(Return(true)); + + // First child DIE. + EXPECT_CALL(mock_root_handler, + FindChildHandler(0x149f644f8116fe8cLL, + (DwarfTag) 0xac2cbd8c)) + .WillOnce(Return(mock_child1_handler)); + { + EXPECT_CALL(*mock_child1_handler, + ProcessAttributeSigned((DwarfAttribute) 0xa6fd6f65, + (DwarfForm) 0xe4f64c41, + 0x1b04e5444a55fe67LL)) + .WillOnce(Return()); + EXPECT_CALL(*mock_child1_handler, EndAttributes()) + .WillOnce(Return(false)); + // Skip first grandchild DIE and first great-grandchild DIE. + EXPECT_CALL(*mock_child1_handler, Finish()) + .WillOnce(Return()); + } + + // Second child DIE. Root handler will decline to return a handler + // for this child. + EXPECT_CALL(mock_root_handler, + FindChildHandler(0x97412be24875de9dLL, + (DwarfTag) 0x505a068b)) + .WillOnce(Return((DIEHandler*) NULL)); + + // Third child DIE. + EXPECT_CALL(mock_root_handler, + FindChildHandler(0x753c964c8ab538aeLL, + (DwarfTag) 0x8c22970e)) + .WillOnce(Return(mock_child3_handler)); + { + EXPECT_CALL(*mock_child3_handler, + ProcessAttributeSigned((DwarfAttribute) 0x4e2b7cfb, + (DwarfForm) 0x610b7ae1, + 0x3ea5c609d7d7560fLL)) + .WillOnce(Return()); + EXPECT_CALL(*mock_child3_handler, EndAttributes()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_child3_handler, Finish()) + .WillOnce(Return()); + } + + EXPECT_CALL(mock_root_handler, Finish()) + .WillOnce(Return()); + } + } + + + // Drive the dispatcher. + + // Report the CU header. + EXPECT_TRUE(die_dispatcher + .StartCompilationUnit(0x9ec1e6d05e434a0eLL, 0xeb, 0x21, + 0x47dd3c764275a216LL, 0xa5)); + // Report the root DIE. + { + EXPECT_TRUE(die_dispatcher.StartDIE(0x15f0e06bdfe3c372LL, + (DwarfTag) 0xf5d60c59)); + die_dispatcher.ProcessAttributeSigned(0x15f0e06bdfe3c372LL, + (DwarfAttribute) 0xf779a642, + (DwarfForm) 0x2cb63027, + 0x18e744661769d08fLL); + + // First child DIE. + { + EXPECT_TRUE(die_dispatcher.StartDIE(0x149f644f8116fe8cLL, + (DwarfTag) 0xac2cbd8c)); + die_dispatcher.ProcessAttributeSigned(0x149f644f8116fe8cLL, + (DwarfAttribute) 0xa6fd6f65, + (DwarfForm) 0xe4f64c41, + 0x1b04e5444a55fe67LL); + + // First grandchild DIE. Will be skipped. + { + EXPECT_FALSE(die_dispatcher.StartDIE(0xd68de1ee0bd29419LL, + (DwarfTag) 0x22f05a15)); + // First great-grandchild DIE. Will be skipped without being + // mentioned to any handler. + { + EXPECT_FALSE(die_dispatcher + .StartDIE(0xb3076285d25cac25LL, + (DwarfTag) 0xcff4061b)); + die_dispatcher.EndDIE(0xb3076285d25cac25LL); + } + die_dispatcher.EndDIE(0xd68de1ee0bd29419LL); + } + die_dispatcher.EndDIE(0x149f644f8116fe8cLL); + } + + // Second child DIE. Root handler will decline to find a handler for it. + { + EXPECT_FALSE(die_dispatcher.StartDIE(0x97412be24875de9dLL, + (DwarfTag) 0x505a068b)); + die_dispatcher.EndDIE(0x97412be24875de9dLL); + } + + // Third child DIE. + { + EXPECT_TRUE(die_dispatcher.StartDIE(0x753c964c8ab538aeLL, + (DwarfTag) 0x8c22970e)); + die_dispatcher.ProcessAttributeSigned(0x753c964c8ab538aeLL, + (DwarfAttribute) 0x4e2b7cfb, + (DwarfForm) 0x610b7ae1, + 0x3ea5c609d7d7560fLL); + die_dispatcher.EndDIE(0x753c964c8ab538aeLL); + } + + // Finish the root DIE (and thus the CU). + die_dispatcher.EndDIE(0x15f0e06bdfe3c372LL); + } +} + +// The DIEDispatcher destructor is supposed to delete all handlers on +// the stack, except for the root. +TEST(Dwarf2DIEHandler, FreeHandlersOnStack) { + MockRootDIEHandler mock_root_handler; + MockDIEHandler *mock_child_handler = new(MockDIEHandler); + MockDIEHandler *mock_grandchild_handler = new(MockDIEHandler); + + { + InSequence s; + + // We'll like the compilation unit header. + EXPECT_CALL(mock_root_handler, + StartCompilationUnit(0x87b41ba8381cd71cLL, 0xff, 0x89, + 0x76d392ff393ddda2LL, 0xbf)) + .WillOnce(Return(true)); + + // Root DIE. + { + EXPECT_CALL(mock_root_handler, + StartRootDIE(0xbf13b761691ddc91LL, (DwarfTag) 0x98980361)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_root_handler, EndAttributes()) + .WillOnce(Return(true)); + + // Child DIE. + EXPECT_CALL(mock_root_handler, + FindChildHandler(0x058f09240c5fc8c9LL, + (DwarfTag) 0x898bf0d0)) + .WillOnce(Return(mock_child_handler)); + { + EXPECT_CALL(*mock_child_handler, EndAttributes()) + .WillOnce(Return(true)); + + // Grandchild DIE. + EXPECT_CALL(*mock_child_handler, + FindChildHandler(0x32dc00c9945dc0c8LL, + (DwarfTag) 0x2802d007)) + .WillOnce(Return(mock_grandchild_handler)); + { + EXPECT_CALL(*mock_grandchild_handler, + ProcessAttributeSigned((DwarfAttribute) 0x4e2b7cfb, + (DwarfForm) 0x610b7ae1, + 0x3ea5c609d7d7560fLL)) + .WillOnce(Return()); + + // At this point, we abandon the traversal, so none of the + // usual stuff should get called. + EXPECT_CALL(*mock_grandchild_handler, EndAttributes()) + .Times(0); + EXPECT_CALL(*mock_grandchild_handler, Finish()) + .Times(0); + } + + EXPECT_CALL(*mock_child_handler, Finish()) + .Times(0); + } + + EXPECT_CALL(mock_root_handler, Finish()) + .Times(0); + } + } + + // The dispatcher. + DIEDispatcher die_dispatcher(&mock_root_handler); + + // Report the CU header. + EXPECT_TRUE(die_dispatcher + .StartCompilationUnit(0x87b41ba8381cd71cLL, 0xff, 0x89, + 0x76d392ff393ddda2LL, 0xbf)); + // Report the root DIE. + { + EXPECT_TRUE(die_dispatcher.StartDIE(0xbf13b761691ddc91LL, + (DwarfTag) 0x98980361)); + + // Child DIE. + { + EXPECT_TRUE(die_dispatcher.StartDIE(0x058f09240c5fc8c9LL, + (DwarfTag) 0x898bf0d0)); + + // Grandchild DIE. + { + EXPECT_TRUE(die_dispatcher.StartDIE(0x32dc00c9945dc0c8LL, + (DwarfTag) 0x2802d007)); + die_dispatcher.ProcessAttributeSigned(0x32dc00c9945dc0c8LL, + (DwarfAttribute) 0x4e2b7cfb, + (DwarfForm) 0x610b7ae1, + 0x3ea5c609d7d7560fLL); + + // Stop the traversal abruptly, so that there will still be + // handlers on the stack when the dispatcher is destructed. + + // No EndDIE call... + } + // No EndDIE call... + } + // No EndDIE call... + } +} diff --git a/src/common/dwarf/dwarf2enums.h b/src/common/dwarf/dwarf2enums.h new file mode 100644 index 0000000..f1c995f --- /dev/null +++ b/src/common/dwarf/dwarf2enums.h @@ -0,0 +1,744 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_DWARF_DWARF2ENUMS_H__ +#define COMMON_DWARF_DWARF2ENUMS_H__ + +namespace google_breakpad { + +// These enums do not follow the google3 style only because they are +// known universally (specs, other implementations) by the names in +// exactly this capitalization. +// Tag names and codes. +enum DwarfTag { + DW_TAG_padding = 0x00, + DW_TAG_array_type = 0x01, + DW_TAG_class_type = 0x02, + DW_TAG_entry_point = 0x03, + DW_TAG_enumeration_type = 0x04, + DW_TAG_formal_parameter = 0x05, + DW_TAG_imported_declaration = 0x08, + DW_TAG_label = 0x0a, + DW_TAG_lexical_block = 0x0b, + DW_TAG_member = 0x0d, + DW_TAG_pointer_type = 0x0f, + DW_TAG_reference_type = 0x10, + DW_TAG_compile_unit = 0x11, + DW_TAG_string_type = 0x12, + DW_TAG_structure_type = 0x13, + DW_TAG_subroutine_type = 0x15, + DW_TAG_typedef = 0x16, + DW_TAG_union_type = 0x17, + DW_TAG_unspecified_parameters = 0x18, + DW_TAG_variant = 0x19, + DW_TAG_common_block = 0x1a, + DW_TAG_common_inclusion = 0x1b, + DW_TAG_inheritance = 0x1c, + DW_TAG_inlined_subroutine = 0x1d, + DW_TAG_module = 0x1e, + DW_TAG_ptr_to_member_type = 0x1f, + DW_TAG_set_type = 0x20, + DW_TAG_subrange_type = 0x21, + DW_TAG_with_stmt = 0x22, + DW_TAG_access_declaration = 0x23, + DW_TAG_base_type = 0x24, + DW_TAG_catch_block = 0x25, + DW_TAG_const_type = 0x26, + DW_TAG_constant = 0x27, + DW_TAG_enumerator = 0x28, + DW_TAG_file_type = 0x29, + DW_TAG_friend = 0x2a, + DW_TAG_namelist = 0x2b, + DW_TAG_namelist_item = 0x2c, + DW_TAG_packed_type = 0x2d, + DW_TAG_subprogram = 0x2e, + DW_TAG_template_type_param = 0x2f, + DW_TAG_template_value_param = 0x30, + DW_TAG_thrown_type = 0x31, + DW_TAG_try_block = 0x32, + DW_TAG_variant_part = 0x33, + DW_TAG_variable = 0x34, + DW_TAG_volatile_type = 0x35, + // DWARF 3. + DW_TAG_dwarf_procedure = 0x36, + DW_TAG_restrict_type = 0x37, + DW_TAG_interface_type = 0x38, + DW_TAG_namespace = 0x39, + DW_TAG_imported_module = 0x3a, + DW_TAG_unspecified_type = 0x3b, + DW_TAG_partial_unit = 0x3c, + DW_TAG_imported_unit = 0x3d, + // DWARF 4. + DW_TAG_type_unit = 0x41, + // DWARF 5. + DW_TAG_skeleton_unit = 0x4a, + // SGI/MIPS Extensions. + DW_TAG_MIPS_loop = 0x4081, + // HP extensions. See: + // ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz + DW_TAG_HP_array_descriptor = 0x4090, + // GNU extensions. + DW_TAG_format_label = 0x4101, // For FORTRAN 77 and Fortran 90. + DW_TAG_function_template = 0x4102, // For C++. + DW_TAG_class_template = 0x4103, // For C++. + DW_TAG_GNU_BINCL = 0x4104, + DW_TAG_GNU_EINCL = 0x4105, + // Extensions for UPC. See: http://upc.gwu.edu/~upc. + DW_TAG_upc_shared_type = 0x8765, + DW_TAG_upc_strict_type = 0x8766, + DW_TAG_upc_relaxed_type = 0x8767, + // PGI (STMicroelectronics) extensions. No documentation available. + DW_TAG_PGI_kanji_type = 0xA000, + DW_TAG_PGI_interface_block = 0xA020 +}; + +enum DwarfUnitHeader { + DW_UT_compile = 0x01, + DW_UT_type = 0x02, + DW_UT_partial = 0x03, + DW_UT_skeleton = 0x04, + DW_UT_split_compile = 0x05, + DW_UT_split_type = 0x06, + DW_UT_lo_user = 0x80, + DW_UT_hi_user = 0xFF +}; + +enum DwarfHasChild { + DW_children_no = 0, + DW_children_yes = 1 +}; + +// Form names and codes. +enum DwarfForm { + DW_FORM_addr = 0x01, + DW_FORM_block2 = 0x03, + DW_FORM_block4 = 0x04, + DW_FORM_data2 = 0x05, + DW_FORM_data4 = 0x06, + DW_FORM_data8 = 0x07, + DW_FORM_string = 0x08, + DW_FORM_block = 0x09, + DW_FORM_block1 = 0x0a, + DW_FORM_data1 = 0x0b, + DW_FORM_flag = 0x0c, + DW_FORM_sdata = 0x0d, + DW_FORM_strp = 0x0e, + DW_FORM_udata = 0x0f, + DW_FORM_ref_addr = 0x10, + DW_FORM_ref1 = 0x11, + DW_FORM_ref2 = 0x12, + DW_FORM_ref4 = 0x13, + DW_FORM_ref8 = 0x14, + DW_FORM_ref_udata = 0x15, + DW_FORM_indirect = 0x16, + + // Added in DWARF 4: + DW_FORM_sec_offset = 0x17, + DW_FORM_exprloc = 0x18, + DW_FORM_flag_present = 0x19, + + // Added in DWARF 5: + DW_FORM_strx = 0x1a, + DW_FORM_addrx = 0x1b, + DW_FORM_ref_sup4 = 0x1c, + DW_FORM_strp_sup = 0x1d, + DW_FORM_data16 = 0x1e, + DW_FORM_line_strp = 0x1f, + + // DWARF 4, but value out of order. + DW_FORM_ref_sig8 = 0x20, + + // Added in DWARF 5: + DW_FORM_implicit_const = 0x21, + DW_FORM_loclistx = 0x22, + DW_FORM_rnglistx = 0x23, + DW_FORM_ref_sup8 = 0x24, + DW_FORM_strx1 = 0x25, + DW_FORM_strx2 = 0x26, + DW_FORM_strx3 = 0x27, + DW_FORM_strx4 = 0x28, + + DW_FORM_addrx1 = 0x29, + DW_FORM_addrx2 = 0x2a, + DW_FORM_addrx3 = 0x2b, + DW_FORM_addrx4 = 0x2c, + + // Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. + DW_FORM_GNU_addr_index = 0x1f01, + DW_FORM_GNU_str_index = 0x1f02 +}; + +// Attribute names and codes +enum DwarfAttribute { + DW_AT_sibling = 0x01, + DW_AT_location = 0x02, + DW_AT_name = 0x03, + DW_AT_ordering = 0x09, + DW_AT_subscr_data = 0x0a, + DW_AT_byte_size = 0x0b, + DW_AT_bit_offset = 0x0c, + DW_AT_bit_size = 0x0d, + DW_AT_element_list = 0x0f, + DW_AT_stmt_list = 0x10, + DW_AT_low_pc = 0x11, + DW_AT_high_pc = 0x12, + DW_AT_language = 0x13, + DW_AT_member = 0x14, + DW_AT_discr = 0x15, + DW_AT_discr_value = 0x16, + DW_AT_visibility = 0x17, + DW_AT_import = 0x18, + DW_AT_string_length = 0x19, + DW_AT_common_reference = 0x1a, + DW_AT_comp_dir = 0x1b, + DW_AT_const_value = 0x1c, + DW_AT_containing_type = 0x1d, + DW_AT_default_value = 0x1e, + DW_AT_inline = 0x20, + DW_AT_is_optional = 0x21, + DW_AT_lower_bound = 0x22, + DW_AT_producer = 0x25, + DW_AT_prototyped = 0x27, + DW_AT_return_addr = 0x2a, + DW_AT_start_scope = 0x2c, + DW_AT_stride_size = 0x2e, + DW_AT_upper_bound = 0x2f, + DW_AT_abstract_origin = 0x31, + DW_AT_accessibility = 0x32, + DW_AT_address_class = 0x33, + DW_AT_artificial = 0x34, + DW_AT_base_types = 0x35, + DW_AT_calling_convention = 0x36, + DW_AT_count = 0x37, + DW_AT_data_member_location = 0x38, + DW_AT_decl_column = 0x39, + DW_AT_decl_file = 0x3a, + DW_AT_decl_line = 0x3b, + DW_AT_declaration = 0x3c, + DW_AT_discr_list = 0x3d, + DW_AT_encoding = 0x3e, + DW_AT_external = 0x3f, + DW_AT_frame_base = 0x40, + DW_AT_friend = 0x41, + DW_AT_identifier_case = 0x42, + DW_AT_macro_info = 0x43, + DW_AT_namelist_items = 0x44, + DW_AT_priority = 0x45, + DW_AT_segment = 0x46, + DW_AT_specification = 0x47, + DW_AT_static_link = 0x48, + DW_AT_type = 0x49, + DW_AT_use_location = 0x4a, + DW_AT_variable_parameter = 0x4b, + DW_AT_virtuality = 0x4c, + DW_AT_vtable_elem_location = 0x4d, + // DWARF 3 values. + DW_AT_allocated = 0x4e, + DW_AT_associated = 0x4f, + DW_AT_data_location = 0x50, + DW_AT_stride = 0x51, + DW_AT_entry_pc = 0x52, + DW_AT_use_UTF8 = 0x53, + DW_AT_extension = 0x54, + DW_AT_ranges = 0x55, + DW_AT_trampoline = 0x56, + DW_AT_call_column = 0x57, + DW_AT_call_file = 0x58, + DW_AT_call_line = 0x59, + // DWARF 4 + DW_AT_linkage_name = 0x6e, + // DWARF 5 + DW_AT_str_offsets_base = 0x72, + DW_AT_addr_base = 0x73, + DW_AT_rnglists_base = 0x74, + DW_AT_dwo_name = 0x76, + // SGI/MIPS extensions. + DW_AT_MIPS_fde = 0x2001, + DW_AT_MIPS_loop_begin = 0x2002, + DW_AT_MIPS_tail_loop_begin = 0x2003, + DW_AT_MIPS_epilog_begin = 0x2004, + DW_AT_MIPS_loop_unroll_factor = 0x2005, + DW_AT_MIPS_software_pipeline_depth = 0x2006, + DW_AT_MIPS_linkage_name = 0x2007, + DW_AT_MIPS_stride = 0x2008, + DW_AT_MIPS_abstract_name = 0x2009, + DW_AT_MIPS_clone_origin = 0x200a, + DW_AT_MIPS_has_inlines = 0x200b, + // HP extensions. + DW_AT_HP_block_index = 0x2000, + DW_AT_HP_unmodifiable = 0x2001, // Same as DW_AT_MIPS_fde. + DW_AT_HP_actuals_stmt_list = 0x2010, + DW_AT_HP_proc_per_section = 0x2011, + DW_AT_HP_raw_data_ptr = 0x2012, + DW_AT_HP_pass_by_reference = 0x2013, + DW_AT_HP_opt_level = 0x2014, + DW_AT_HP_prof_version_id = 0x2015, + DW_AT_HP_opt_flags = 0x2016, + DW_AT_HP_cold_region_low_pc = 0x2017, + DW_AT_HP_cold_region_high_pc = 0x2018, + DW_AT_HP_all_variables_modifiable = 0x2019, + DW_AT_HP_linkage_name = 0x201a, + DW_AT_HP_prof_flags = 0x201b, // In comp unit of procs_info for -g. + // GNU extensions. + DW_AT_sf_names = 0x2101, + DW_AT_src_info = 0x2102, + DW_AT_mac_info = 0x2103, + DW_AT_src_coords = 0x2104, + DW_AT_body_begin = 0x2105, + DW_AT_body_end = 0x2106, + DW_AT_GNU_vector = 0x2107, + // Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. + DW_AT_GNU_dwo_name = 0x2130, + DW_AT_GNU_dwo_id = 0x2131, + DW_AT_GNU_ranges_base = 0x2132, + DW_AT_GNU_addr_base = 0x2133, + DW_AT_GNU_pubnames = 0x2134, + DW_AT_GNU_pubtypes = 0x2135, + // VMS extensions. + DW_AT_VMS_rtnbeg_pd_address = 0x2201, + // UPC extension. + DW_AT_upc_threads_scaled = 0x3210, + // PGI (STMicroelectronics) extensions. + DW_AT_PGI_lbase = 0x3a00, + DW_AT_PGI_soffset = 0x3a01, + DW_AT_PGI_lstride = 0x3a02 +}; + +// .debug_rngslist entry types +enum DwarfRngListEntry { + DW_RLE_end_of_list = 0, + DW_RLE_base_addressx = 1, + DW_RLE_startx_endx = 2, + DW_RLE_startx_length = 3, + DW_RLE_offset_pair = 4, + DW_RLE_base_address = 5, + DW_RLE_start_end = 6, + DW_RLE_start_length = 7, +}; + +// Line number content type codes (DWARF 5). +enum DwarfLineNumberContentType { + DW_LNCT_path = 1, + DW_LNCT_directory_index = 2, + DW_LNCT_timestamp = 3, + DW_LNCT_size = 4, + DW_LNCT_MD5 = 5, +}; + +// Line number opcodes. +enum DwarfLineNumberOps { + DW_LNS_extended_op = 0, + DW_LNS_copy = 1, + DW_LNS_advance_pc = 2, + DW_LNS_advance_line = 3, + DW_LNS_set_file = 4, + DW_LNS_set_column = 5, + DW_LNS_negate_stmt = 6, + DW_LNS_set_basic_block = 7, + DW_LNS_const_add_pc = 8, + DW_LNS_fixed_advance_pc = 9, + // DWARF 3. + DW_LNS_set_prologue_end = 10, + DW_LNS_set_epilogue_begin = 11, + DW_LNS_set_isa = 12 +}; + +// Line number extended opcodes. +enum DwarfLineNumberExtendedOps { + DW_LNE_end_sequence = 1, + DW_LNE_set_address = 2, + DW_LNE_define_file = 3, + // HP extensions. + DW_LNE_HP_negate_is_UV_update = 0x11, + DW_LNE_HP_push_context = 0x12, + DW_LNE_HP_pop_context = 0x13, + DW_LNE_HP_set_file_line_column = 0x14, + DW_LNE_HP_set_routine_name = 0x15, + DW_LNE_HP_set_sequence = 0x16, + DW_LNE_HP_negate_post_semantics = 0x17, + DW_LNE_HP_negate_function_exit = 0x18, + DW_LNE_HP_negate_front_end_logical = 0x19, + DW_LNE_HP_define_proc = 0x20 +}; + +// Type encoding names and codes +enum DwarfEncoding { + DW_ATE_address =0x1, + DW_ATE_boolean =0x2, + DW_ATE_complex_float =0x3, + DW_ATE_float =0x4, + DW_ATE_signed =0x5, + DW_ATE_signed_char =0x6, + DW_ATE_unsigned =0x7, + DW_ATE_unsigned_char =0x8, + // DWARF3/DWARF3f + DW_ATE_imaginary_float =0x9, + DW_ATE_packed_decimal =0xa, + DW_ATE_numeric_string =0xb, + DW_ATE_edited =0xc, + DW_ATE_signed_fixed =0xd, + DW_ATE_unsigned_fixed =0xe, + DW_ATE_decimal_float =0xf, + DW_ATE_lo_user =0x80, + DW_ATE_hi_user =0xff +}; + +// Location virtual machine opcodes +enum DwarfOpcode { + DW_OP_addr =0x03, + DW_OP_deref =0x06, + DW_OP_const1u =0x08, + DW_OP_const1s =0x09, + DW_OP_const2u =0x0a, + DW_OP_const2s =0x0b, + DW_OP_const4u =0x0c, + DW_OP_const4s =0x0d, + DW_OP_const8u =0x0e, + DW_OP_const8s =0x0f, + DW_OP_constu =0x10, + DW_OP_consts =0x11, + DW_OP_dup =0x12, + DW_OP_drop =0x13, + DW_OP_over =0x14, + DW_OP_pick =0x15, + DW_OP_swap =0x16, + DW_OP_rot =0x17, + DW_OP_xderef =0x18, + DW_OP_abs =0x19, + DW_OP_and =0x1a, + DW_OP_div =0x1b, + DW_OP_minus =0x1c, + DW_OP_mod =0x1d, + DW_OP_mul =0x1e, + DW_OP_neg =0x1f, + DW_OP_not =0x20, + DW_OP_or =0x21, + DW_OP_plus =0x22, + DW_OP_plus_uconst =0x23, + DW_OP_shl =0x24, + DW_OP_shr =0x25, + DW_OP_shra =0x26, + DW_OP_xor =0x27, + DW_OP_bra =0x28, + DW_OP_eq =0x29, + DW_OP_ge =0x2a, + DW_OP_gt =0x2b, + DW_OP_le =0x2c, + DW_OP_lt =0x2d, + DW_OP_ne =0x2e, + DW_OP_skip =0x2f, + DW_OP_lit0 =0x30, + DW_OP_lit1 =0x31, + DW_OP_lit2 =0x32, + DW_OP_lit3 =0x33, + DW_OP_lit4 =0x34, + DW_OP_lit5 =0x35, + DW_OP_lit6 =0x36, + DW_OP_lit7 =0x37, + DW_OP_lit8 =0x38, + DW_OP_lit9 =0x39, + DW_OP_lit10 =0x3a, + DW_OP_lit11 =0x3b, + DW_OP_lit12 =0x3c, + DW_OP_lit13 =0x3d, + DW_OP_lit14 =0x3e, + DW_OP_lit15 =0x3f, + DW_OP_lit16 =0x40, + DW_OP_lit17 =0x41, + DW_OP_lit18 =0x42, + DW_OP_lit19 =0x43, + DW_OP_lit20 =0x44, + DW_OP_lit21 =0x45, + DW_OP_lit22 =0x46, + DW_OP_lit23 =0x47, + DW_OP_lit24 =0x48, + DW_OP_lit25 =0x49, + DW_OP_lit26 =0x4a, + DW_OP_lit27 =0x4b, + DW_OP_lit28 =0x4c, + DW_OP_lit29 =0x4d, + DW_OP_lit30 =0x4e, + DW_OP_lit31 =0x4f, + DW_OP_reg0 =0x50, + DW_OP_reg1 =0x51, + DW_OP_reg2 =0x52, + DW_OP_reg3 =0x53, + DW_OP_reg4 =0x54, + DW_OP_reg5 =0x55, + DW_OP_reg6 =0x56, + DW_OP_reg7 =0x57, + DW_OP_reg8 =0x58, + DW_OP_reg9 =0x59, + DW_OP_reg10 =0x5a, + DW_OP_reg11 =0x5b, + DW_OP_reg12 =0x5c, + DW_OP_reg13 =0x5d, + DW_OP_reg14 =0x5e, + DW_OP_reg15 =0x5f, + DW_OP_reg16 =0x60, + DW_OP_reg17 =0x61, + DW_OP_reg18 =0x62, + DW_OP_reg19 =0x63, + DW_OP_reg20 =0x64, + DW_OP_reg21 =0x65, + DW_OP_reg22 =0x66, + DW_OP_reg23 =0x67, + DW_OP_reg24 =0x68, + DW_OP_reg25 =0x69, + DW_OP_reg26 =0x6a, + DW_OP_reg27 =0x6b, + DW_OP_reg28 =0x6c, + DW_OP_reg29 =0x6d, + DW_OP_reg30 =0x6e, + DW_OP_reg31 =0x6f, + DW_OP_breg0 =0x70, + DW_OP_breg1 =0x71, + DW_OP_breg2 =0x72, + DW_OP_breg3 =0x73, + DW_OP_breg4 =0x74, + DW_OP_breg5 =0x75, + DW_OP_breg6 =0x76, + DW_OP_breg7 =0x77, + DW_OP_breg8 =0x78, + DW_OP_breg9 =0x79, + DW_OP_breg10 =0x7a, + DW_OP_breg11 =0x7b, + DW_OP_breg12 =0x7c, + DW_OP_breg13 =0x7d, + DW_OP_breg14 =0x7e, + DW_OP_breg15 =0x7f, + DW_OP_breg16 =0x80, + DW_OP_breg17 =0x81, + DW_OP_breg18 =0x82, + DW_OP_breg19 =0x83, + DW_OP_breg20 =0x84, + DW_OP_breg21 =0x85, + DW_OP_breg22 =0x86, + DW_OP_breg23 =0x87, + DW_OP_breg24 =0x88, + DW_OP_breg25 =0x89, + DW_OP_breg26 =0x8a, + DW_OP_breg27 =0x8b, + DW_OP_breg28 =0x8c, + DW_OP_breg29 =0x8d, + DW_OP_breg30 =0x8e, + DW_OP_breg31 =0x8f, + DW_OP_regX =0x90, + DW_OP_fbreg =0x91, + DW_OP_bregX =0x92, + DW_OP_piece =0x93, + DW_OP_deref_size =0x94, + DW_OP_xderef_size =0x95, + DW_OP_nop =0x96, + // DWARF3/DWARF3f + DW_OP_push_object_address =0x97, + DW_OP_call2 =0x98, + DW_OP_call4 =0x99, + DW_OP_call_ref =0x9a, + DW_OP_form_tls_address =0x9b, + DW_OP_call_frame_cfa =0x9c, + DW_OP_bit_piece =0x9d, + DW_OP_lo_user =0xe0, + DW_OP_hi_user =0xff, + // GNU extensions + DW_OP_GNU_push_tls_address =0xe0, + // Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. + DW_OP_GNU_addr_index =0xfb, + DW_OP_GNU_const_index =0xfc +}; + +// Section identifiers for DWP files +enum DwarfSectionId { + DW_SECT_INFO = 1, + DW_SECT_TYPES = 2, + DW_SECT_ABBREV = 3, + DW_SECT_LINE = 4, + DW_SECT_LOCLISTS = 5, + DW_SECT_STR_OFFSETS = 6, + DW_SECT_MACRO = 7, + DW_SECT_RNGLISTS = 8 +}; + +// Source languages. These are values for DW_AT_language. +enum DwarfLanguage + { + DW_LANG_none =0x0000, + DW_LANG_C89 =0x0001, + DW_LANG_C =0x0002, + DW_LANG_Ada83 =0x0003, + DW_LANG_C_plus_plus =0x0004, + DW_LANG_Cobol74 =0x0005, + DW_LANG_Cobol85 =0x0006, + DW_LANG_Fortran77 =0x0007, + DW_LANG_Fortran90 =0x0008, + DW_LANG_Pascal83 =0x0009, + DW_LANG_Modula2 =0x000a, + DW_LANG_Java =0x000b, + DW_LANG_C99 =0x000c, + DW_LANG_Ada95 =0x000d, + DW_LANG_Fortran95 =0x000e, + DW_LANG_PLI =0x000f, + DW_LANG_ObjC =0x0010, + DW_LANG_ObjC_plus_plus =0x0011, + DW_LANG_UPC =0x0012, + DW_LANG_D =0x0013, + DW_LANG_Rust =0x001c, + DW_LANG_Swift =0x001e, + // Implementation-defined language code range. + DW_LANG_lo_user = 0x8000, + DW_LANG_hi_user = 0xffff, + + // Extensions. + + // MIPS assembly language. The GNU toolchain uses this for all + // assembly languages, since there's no generic DW_LANG_ value for that. + // See include/dwarf2.h in the binutils, gdb, or gcc source trees. + DW_LANG_Mips_Assembler =0x8001, + DW_LANG_Upc =0x8765 // Unified Parallel C + }; + +// Inline codes. These are values for DW_AT_inline. +enum DwarfInline { + DW_INL_not_inlined =0x0, + DW_INL_inlined =0x1, + DW_INL_declared_not_inlined =0x2, + DW_INL_declared_inlined =0x3 +}; + +// Call Frame Info instructions. +enum DwarfCFI + { + DW_CFA_advance_loc = 0x40, + DW_CFA_offset = 0x80, + DW_CFA_restore = 0xc0, + DW_CFA_nop = 0x00, + DW_CFA_set_loc = 0x01, + DW_CFA_advance_loc1 = 0x02, + DW_CFA_advance_loc2 = 0x03, + DW_CFA_advance_loc4 = 0x04, + DW_CFA_offset_extended = 0x05, + DW_CFA_restore_extended = 0x06, + DW_CFA_undefined = 0x07, + DW_CFA_same_value = 0x08, + DW_CFA_register = 0x09, + DW_CFA_remember_state = 0x0a, + DW_CFA_restore_state = 0x0b, + DW_CFA_def_cfa = 0x0c, + DW_CFA_def_cfa_register = 0x0d, + DW_CFA_def_cfa_offset = 0x0e, + DW_CFA_def_cfa_expression = 0x0f, + DW_CFA_expression = 0x10, + DW_CFA_offset_extended_sf = 0x11, + DW_CFA_def_cfa_sf = 0x12, + DW_CFA_def_cfa_offset_sf = 0x13, + DW_CFA_val_offset = 0x14, + DW_CFA_val_offset_sf = 0x15, + DW_CFA_val_expression = 0x16, + + // Opcodes in this range are reserved for user extensions. + DW_CFA_lo_user = 0x1c, + DW_CFA_hi_user = 0x3f, + + // SGI/MIPS specific. + DW_CFA_MIPS_advance_loc8 = 0x1d, + + // GNU extensions. + DW_CFA_GNU_window_save = 0x2d, + DW_CFA_GNU_args_size = 0x2e, + DW_CFA_GNU_negative_offset_extended = 0x2f + }; + +// Exception handling 'z' augmentation letters. +enum DwarfZAugmentationCodes { + // If the CFI augmentation string begins with 'z', then the CIE and FDE + // have an augmentation data area just before the instructions, whose + // contents are determined by the subsequent augmentation letters. + DW_Z_augmentation_start = 'z', + + // If this letter is present in a 'z' augmentation string, the CIE + // augmentation data includes a pointer encoding, and the FDE + // augmentation data includes a language-specific data area pointer, + // represented using that encoding. + DW_Z_has_LSDA = 'L', + + // If this letter is present in a 'z' augmentation string, the CIE + // augmentation data includes a pointer encoding, followed by a pointer + // to a personality routine, represented using that encoding. + DW_Z_has_personality_routine = 'P', + + // If this letter is present in a 'z' augmentation string, the CIE + // augmentation data includes a pointer encoding describing how the FDE's + // initial location, address range, and DW_CFA_set_loc operands are + // encoded. + DW_Z_has_FDE_address_encoding = 'R', + + // If this letter is present in a 'z' augmentation string, then code + // addresses covered by FDEs that cite this CIE are signal delivery + // trampolines. Return addresses of frames in trampolines should not be + // adjusted as described in section 6.4.4 of the DWARF 3 spec. + DW_Z_is_signal_trampoline = 'S' +}; + +// Exception handling frame description pointer formats, as described +// by the Linux Standard Base Core Specification 4.0, section 11.5, +// DWARF Extensions. +enum DwarfPointerEncoding + { + DW_EH_PE_absptr = 0x00, + DW_EH_PE_omit = 0xff, + DW_EH_PE_uleb128 = 0x01, + DW_EH_PE_udata2 = 0x02, + DW_EH_PE_udata4 = 0x03, + DW_EH_PE_udata8 = 0x04, + DW_EH_PE_sleb128 = 0x09, + DW_EH_PE_sdata2 = 0x0A, + DW_EH_PE_sdata4 = 0x0B, + DW_EH_PE_sdata8 = 0x0C, + DW_EH_PE_pcrel = 0x10, + DW_EH_PE_textrel = 0x20, + DW_EH_PE_datarel = 0x30, + DW_EH_PE_funcrel = 0x40, + DW_EH_PE_aligned = 0x50, + + // The GNU toolchain sources define this enum value as well, + // simply to help classify the lower nybble values into signed and + // unsigned groups. + DW_EH_PE_signed = 0x08, + + // This is not documented in LSB 4.0, but it is used in both the + // Linux and OS X toolchains. It can be added to any other + // encoding (except DW_EH_PE_aligned), and indicates that the + // encoded value represents the address at which the true address + // is stored, not the true address itself. + DW_EH_PE_indirect = 0x80 + }; + +} // namespace google_breakpad +#endif // COMMON_DWARF_DWARF2ENUMS_H__ diff --git a/src/common/dwarf/dwarf2reader.cc b/src/common/dwarf/dwarf2reader.cc new file mode 100644 index 0000000..8a8bf6f --- /dev/null +++ b/src/common/dwarf/dwarf2reader.cc @@ -0,0 +1,3487 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// CFI reader author: Jim Blandy + +// Implementation of LineInfo, CompilationUnit, +// and CallFrameInfo. See dwarf2reader.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/dwarf/dwarf2reader.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "common/dwarf/bytereader-inl.h" +#include "common/dwarf/bytereader.h" +#include "common/dwarf/line_state_machine.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +const SectionMap::const_iterator GetSectionByName(const SectionMap& + sections, const char *name) { + assert(name[0] == '.'); + auto iter = sections.find(name); + if (iter != sections.end()) + return iter; + std::string macho_name("__"); + macho_name += name + 1; + iter = sections.find(macho_name); + return iter; +} + +CompilationUnit::CompilationUnit(const string& path, + const SectionMap& sections, uint64_t offset, + ByteReader* reader, Dwarf2Handler* handler) + : path_(path), offset_from_section_start_(offset), reader_(reader), + sections_(sections), handler_(handler), abbrevs_(), + string_buffer_(NULL), string_buffer_length_(0), + line_string_buffer_(NULL), line_string_buffer_length_(0), + str_offsets_buffer_(NULL), str_offsets_buffer_length_(0), + addr_buffer_(NULL), addr_buffer_length_(0), + is_split_dwarf_(false), is_type_unit_(false), dwo_id_(0), dwo_name_(), + skeleton_dwo_id_(0), addr_base_(0), + str_offsets_base_(0), have_checked_for_dwp_(false), + should_process_split_dwarf_(false), low_pc_(0), + has_source_line_info_(false), source_line_offset_(0) {} + +// Initialize a compilation unit from a .dwo or .dwp file. +// In this case, we need the .debug_addr section from the +// executable file that contains the corresponding skeleton +// compilation unit. We also inherit the Dwarf2Handler from +// the executable file, and call it as if we were still +// processing the original compilation unit. + +void CompilationUnit::SetSplitDwarf(uint64_t addr_base, + uint64_t dwo_id) { + is_split_dwarf_ = true; + addr_base_ = addr_base; + skeleton_dwo_id_ = dwo_id; +} + +// Read a DWARF2/3 abbreviation section. +// Each abbrev consists of a abbreviation number, a tag, a byte +// specifying whether the tag has children, and a list of +// attribute/form pairs. +// The list of forms is terminated by a 0 for the attribute, and a +// zero for the form. The entire abbreviation section is terminated +// by a zero for the code. + +void CompilationUnit::ReadAbbrevs() { + if (abbrevs_) + return; + + // First get the debug_abbrev section. + SectionMap::const_iterator iter = + GetSectionByName(sections_, ".debug_abbrev"); + assert(iter != sections_.end()); + + abbrevs_ = new std::vector; + abbrevs_->resize(1); + + // The only way to check whether we are reading over the end of the + // buffer would be to first compute the size of the leb128 data by + // reading it, then go back and read it again. + const uint8_t* abbrev_start = iter->second.first + + header_.abbrev_offset; + const uint8_t* abbrevptr = abbrev_start; +#ifndef NDEBUG + const uint64_t abbrev_length = iter->second.second - header_.abbrev_offset; +#endif + + uint64_t highest_number = 0; + + while (1) { + CompilationUnit::Abbrev abbrev; + size_t len; + const uint64_t number = reader_->ReadUnsignedLEB128(abbrevptr, &len); + highest_number = std::max(highest_number, number); + + if (number == 0) + break; + abbrev.number = number; + abbrevptr += len; + + assert(abbrevptr < abbrev_start + abbrev_length); + const uint64_t tag = reader_->ReadUnsignedLEB128(abbrevptr, &len); + abbrevptr += len; + abbrev.tag = static_cast(tag); + + assert(abbrevptr < abbrev_start + abbrev_length); + abbrev.has_children = reader_->ReadOneByte(abbrevptr); + abbrevptr += 1; + + assert(abbrevptr < abbrev_start + abbrev_length); + + while (1) { + const uint64_t nametemp = reader_->ReadUnsignedLEB128(abbrevptr, &len); + abbrevptr += len; + + assert(abbrevptr < abbrev_start + abbrev_length); + const uint64_t formtemp = reader_->ReadUnsignedLEB128(abbrevptr, &len); + abbrevptr += len; + if (nametemp == 0 && formtemp == 0) + break; + + uint64_t value = 0; + if (formtemp == DW_FORM_implicit_const) { + value = reader_->ReadUnsignedLEB128(abbrevptr, &len); + abbrevptr += len; + } + AttrForm abbrev_attr(static_cast(nametemp), + static_cast(formtemp), + value); + abbrev.attributes.push_back(abbrev_attr); + } + abbrevs_->push_back(abbrev); + } + + // Account of cases where entries are out of order. + std::sort(abbrevs_->begin(), abbrevs_->end(), + [](const CompilationUnit::Abbrev& lhs, const CompilationUnit::Abbrev& rhs) { + return lhs.number < rhs.number; + }); + + // Ensure that there are no missing sections. + assert(abbrevs_->size() == highest_number + 1); +} + +// Skips a single DIE's attributes. +const uint8_t* CompilationUnit::SkipDIE(const uint8_t* start, + const Abbrev& abbrev) { + for (AttributeList::const_iterator i = abbrev.attributes.begin(); + i != abbrev.attributes.end(); + i++) { + start = SkipAttribute(start, i->form_); + } + return start; +} + +// Skips a single attribute form's data. +const uint8_t* CompilationUnit::SkipAttribute(const uint8_t* start, + enum DwarfForm form) { + size_t len; + + switch (form) { + case DW_FORM_indirect: + form = static_cast(reader_->ReadUnsignedLEB128(start, + &len)); + start += len; + return SkipAttribute(start, form); + + case DW_FORM_flag_present: + case DW_FORM_implicit_const: + return start; + case DW_FORM_addrx1: + case DW_FORM_data1: + case DW_FORM_flag: + case DW_FORM_ref1: + case DW_FORM_strx1: + return start + 1; + case DW_FORM_addrx2: + case DW_FORM_ref2: + case DW_FORM_data2: + case DW_FORM_strx2: + return start + 2; + case DW_FORM_addrx3: + case DW_FORM_strx3: + return start + 3; + case DW_FORM_addrx4: + case DW_FORM_ref4: + case DW_FORM_data4: + case DW_FORM_strx4: + case DW_FORM_ref_sup4: + return start + 4; + case DW_FORM_ref8: + case DW_FORM_data8: + case DW_FORM_ref_sig8: + case DW_FORM_ref_sup8: + return start + 8; + case DW_FORM_data16: + return start + 16; + case DW_FORM_string: + return start + strlen(reinterpret_cast(start)) + 1; + case DW_FORM_udata: + case DW_FORM_ref_udata: + case DW_FORM_strx: + case DW_FORM_GNU_str_index: + case DW_FORM_GNU_addr_index: + case DW_FORM_addrx: + case DW_FORM_rnglistx: + case DW_FORM_loclistx: + reader_->ReadUnsignedLEB128(start, &len); + return start + len; + + case DW_FORM_sdata: + reader_->ReadSignedLEB128(start, &len); + return start + len; + case DW_FORM_addr: + return start + reader_->AddressSize(); + case DW_FORM_ref_addr: + // DWARF2 and 3/4 differ on whether ref_addr is address size or + // offset size. + assert(header_.version >= 2); + if (header_.version == 2) { + return start + reader_->AddressSize(); + } else if (header_.version >= 3) { + return start + reader_->OffsetSize(); + } + break; + + case DW_FORM_block1: + return start + 1 + reader_->ReadOneByte(start); + case DW_FORM_block2: + return start + 2 + reader_->ReadTwoBytes(start); + case DW_FORM_block4: + return start + 4 + reader_->ReadFourBytes(start); + case DW_FORM_block: + case DW_FORM_exprloc: { + uint64_t size = reader_->ReadUnsignedLEB128(start, &len); + return start + size + len; + } + case DW_FORM_strp: + case DW_FORM_line_strp: + case DW_FORM_strp_sup: + case DW_FORM_sec_offset: + return start + reader_->OffsetSize(); + } + fprintf(stderr,"Unhandled form type"); + return NULL; +} + +// Read the abbreviation offset from a compilation unit header. +size_t CompilationUnit::ReadAbbrevOffset(const uint8_t* headerptr) { + assert(headerptr + reader_->OffsetSize() < buffer_ + buffer_length_); + header_.abbrev_offset = reader_->ReadOffset(headerptr); + return reader_->OffsetSize(); +} + +// Read the address size from a compilation unit header. +size_t CompilationUnit::ReadAddressSize(const uint8_t* headerptr) { + // Compare against less than or equal because this may be the last + // section in the file. + assert(headerptr + 1 <= buffer_ + buffer_length_); + header_.address_size = reader_->ReadOneByte(headerptr); + reader_->SetAddressSize(header_.address_size); + return 1; +} + +// Read the DWO id from a split or skeleton compilation unit header. +size_t CompilationUnit::ReadDwoId(const uint8_t* headerptr) { + assert(headerptr + 8 <= buffer_ + buffer_length_); + dwo_id_ = reader_->ReadEightBytes(headerptr); + return 8; +} + +// Read the type signature from a type or split type compilation unit header. +size_t CompilationUnit::ReadTypeSignature(const uint8_t* headerptr) { + assert(headerptr + 8 <= buffer_ + buffer_length_); + type_signature_ = reader_->ReadEightBytes(headerptr); + return 8; +} + +// Read the DWO id from a split or skeleton compilation unit header. +size_t CompilationUnit::ReadTypeOffset(const uint8_t* headerptr) { + assert(headerptr + reader_->OffsetSize() < buffer_ + buffer_length_); + type_offset_ = reader_->ReadOffset(headerptr); + return reader_->OffsetSize(); +} + + +// Read a DWARF header. The header is variable length in DWARF3 and DWARF4 +// (and DWARF2 as extended by most compilers), and consists of an length +// field, a version number, the offset in the .debug_abbrev section for our +// abbrevs, and an address size. DWARF5 adds a unit_type to distinguish +// between partial-, full-, skeleton-, split-, and type- compilation units. +void CompilationUnit::ReadHeader() { + const uint8_t* headerptr = buffer_; + size_t initial_length_size; + + assert(headerptr + 4 < buffer_ + buffer_length_); + const uint64_t initial_length + = reader_->ReadInitialLength(headerptr, &initial_length_size); + headerptr += initial_length_size; + header_.length = initial_length; + + assert(headerptr + 2 < buffer_ + buffer_length_); + header_.version = reader_->ReadTwoBytes(headerptr); + headerptr += 2; + + if (header_.version <= 4) { + // Older versions of dwarf have a relatively simple structure. + headerptr += ReadAbbrevOffset(headerptr); + headerptr += ReadAddressSize(headerptr); + } else { + // DWARF5 adds a unit_type field, and various fields based on unit_type. + assert(headerptr + 1 < buffer_ + buffer_length_); + uint8_t unit_type = reader_->ReadOneByte(headerptr); + headerptr += 1; + headerptr += ReadAddressSize(headerptr); + headerptr += ReadAbbrevOffset(headerptr); + switch (unit_type) { + case DW_UT_compile: + case DW_UT_partial: + // nothing else to read + break; + case DW_UT_skeleton: + case DW_UT_split_compile: + headerptr += ReadDwoId(headerptr); + break; + case DW_UT_type: + case DW_UT_split_type: + is_type_unit_ = true; + headerptr += ReadTypeSignature(headerptr); + headerptr += ReadTypeOffset(headerptr); + break; + default: + fprintf(stderr, "Unhandled compilation unit type 0x%x", unit_type); + break; + } + } + after_header_ = headerptr; + + // This check ensures that we don't have to do checking during the + // reading of DIEs. header_.length does not include the size of the + // initial length. + assert(buffer_ + initial_length_size + header_.length <= + buffer_ + buffer_length_); +} + +uint64_t CompilationUnit::Start() { + // First get the debug_info section. + SectionMap::const_iterator iter = + GetSectionByName(sections_, ".debug_info"); + assert(iter != sections_.end()); + + // Set up our buffer + buffer_ = iter->second.first + offset_from_section_start_; + if (is_split_dwarf_) { + iter = GetSectionByName(sections_, ".debug_info_offset"); + assert(iter != sections_.end()); + buffer_length_ = iter->second.second; + } else { + buffer_length_ = iter->second.second - offset_from_section_start_; + } + + // Read the header + ReadHeader(); + + // Figure out the real length from the end of the initial length to + // the end of the compilation unit, since that is the value we + // return. + uint64_t ourlength = header_.length; + if (reader_->OffsetSize() == 8) + ourlength += 12; + else + ourlength += 4; + + // See if the user wants this compilation unit, and if not, just return. + if (!handler_->StartCompilationUnit(offset_from_section_start_, + reader_->AddressSize(), + reader_->OffsetSize(), + header_.length, + header_.version)) + return ourlength; + else if (header_.version == 5 && is_type_unit_) + return ourlength; + + // Otherwise, continue by reading our abbreviation entries. + ReadAbbrevs(); + + // Set the string section if we have one. + iter = GetSectionByName(sections_, ".debug_str"); + if (iter != sections_.end()) { + string_buffer_ = iter->second.first; + string_buffer_length_ = iter->second.second; + } + + iter = GetSectionByName(sections_, ".debug_line"); + if (iter != sections_.end()) { + line_buffer_ = iter->second.first; + line_buffer_length_ = iter->second.second; + } + + // Set the line string section if we have one. + iter = GetSectionByName(sections_, ".debug_line_str"); + if (iter != sections_.end()) { + line_string_buffer_ = iter->second.first; + line_string_buffer_length_ = iter->second.second; + } + + // Set the string offsets section if we have one. + iter = GetSectionByName(sections_, ".debug_str_offsets"); + if (iter != sections_.end()) { + str_offsets_buffer_ = iter->second.first; + str_offsets_buffer_length_ = iter->second.second; + } + + // Set the address section if we have one. + iter = GetSectionByName(sections_, ".debug_addr"); + if (iter != sections_.end()) { + addr_buffer_ = iter->second.first; + addr_buffer_length_ = iter->second.second; + } + + // Now that we have our abbreviations, start processing DIE's. + ProcessDIEs(); + + // If this is a skeleton compilation unit generated with split DWARF, + // and the client needs the full debug info, we need to find the full + // compilation unit in a .dwo or .dwp file. + should_process_split_dwarf_ = + !is_split_dwarf_ && dwo_name_ != NULL && handler_->NeedSplitDebugInfo(); + + return ourlength; +} + +void CompilationUnit::ProcessFormStringIndex( + uint64_t dieoffset, enum DwarfAttribute attr, enum DwarfForm form, + uint64_t str_index) { + const size_t kStringOffsetsTableHeaderSize = + header_.version >= 5 ? (reader_->OffsetSize() == 8 ? 16 : 8) : 0; + const uint8_t* str_offsets_table_after_header = str_offsets_base_ ? + str_offsets_buffer_ + str_offsets_base_ : + str_offsets_buffer_ + kStringOffsetsTableHeaderSize; + const uint8_t* offset_ptr = + str_offsets_table_after_header + str_index * reader_->OffsetSize(); + + const uint64_t offset = reader_->ReadOffset(offset_ptr); + if (offset >= string_buffer_length_) { + return; + } + + const char* str = reinterpret_cast(string_buffer_) + offset; + ProcessAttributeString(dieoffset, attr, form, str); +} + +// Special function for pre-processing the +// DW_AT_str_offsets_base and DW_AT_addr_base in a DW_TAG_compile_unit die (for +// DWARF v5). We must make sure to find and process the +// DW_AT_str_offsets_base and DW_AT_addr_base attributes before attempting to +// read any string and address attribute in the compile unit. +const uint8_t* CompilationUnit::ProcessOffsetBaseAttribute( + uint64_t dieoffset, const uint8_t* start, enum DwarfAttribute attr, + enum DwarfForm form, uint64_t implicit_const) { + size_t len; + + switch (form) { + // DW_FORM_indirect is never used because it is such a space + // waster. + case DW_FORM_indirect: + form = static_cast(reader_->ReadUnsignedLEB128(start, + &len)); + start += len; + return ProcessOffsetBaseAttribute(dieoffset, start, attr, form, + implicit_const); + + case DW_FORM_flag_present: + return start; + case DW_FORM_data1: + case DW_FORM_flag: + return start + 1; + case DW_FORM_data2: + return start + 2; + case DW_FORM_data4: + return start + 4; + case DW_FORM_data8: + return start + 8; + case DW_FORM_data16: + // This form is designed for an md5 checksum inside line tables. + return start + 16; + case DW_FORM_string: { + const char* str = reinterpret_cast(start); + return start + strlen(str) + 1; + } + case DW_FORM_udata: + reader_->ReadUnsignedLEB128(start, &len); + return start + len; + case DW_FORM_sdata: + reader_->ReadSignedLEB128(start, &len); + return start + len; + case DW_FORM_addr: + reader_->ReadAddress(start); + return start + reader_->AddressSize(); + + // This is the important one here! + case DW_FORM_sec_offset: + if (attr == DW_AT_str_offsets_base || + attr == DW_AT_addr_base) + ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadOffset(start)); + else + reader_->ReadOffset(start); + return start + reader_->OffsetSize(); + + case DW_FORM_ref1: + return start + 1; + case DW_FORM_ref2: + return start + 2; + case DW_FORM_ref4: + return start + 4; + case DW_FORM_ref8: + return start + 8; + case DW_FORM_ref_udata: + reader_->ReadUnsignedLEB128(start, &len); + return start + len; + case DW_FORM_ref_addr: + // DWARF2 and 3/4 differ on whether ref_addr is address size or + // offset size. + assert(header_.version >= 2); + if (header_.version == 2) { + reader_->ReadAddress(start); + return start + reader_->AddressSize(); + } else if (header_.version >= 3) { + reader_->ReadOffset(start); + return start + reader_->OffsetSize(); + } + break; + case DW_FORM_ref_sig8: + return start + 8; + case DW_FORM_implicit_const: + return start; + case DW_FORM_block1: { + uint64_t datalen = reader_->ReadOneByte(start); + return start + 1 + datalen; + } + case DW_FORM_block2: { + uint64_t datalen = reader_->ReadTwoBytes(start); + return start + 2 + datalen; + } + case DW_FORM_block4: { + uint64_t datalen = reader_->ReadFourBytes(start); + return start + 4 + datalen; + } + case DW_FORM_block: + case DW_FORM_exprloc: { + uint64_t datalen = reader_->ReadUnsignedLEB128(start, &len); + return start + datalen + len; + } + case DW_FORM_strp: { + reader_->ReadOffset(start); + return start + reader_->OffsetSize(); + } + case DW_FORM_line_strp: { + reader_->ReadOffset(start); + return start + reader_->OffsetSize(); + } + case DW_FORM_strp_sup: + return start + 4; + case DW_FORM_ref_sup4: + return start + 4; + case DW_FORM_ref_sup8: + return start + 8; + case DW_FORM_loclistx: + reader_->ReadUnsignedLEB128(start, &len); + return start + len; + case DW_FORM_strx: + case DW_FORM_GNU_str_index: { + reader_->ReadUnsignedLEB128(start, &len); + return start + len; + } + case DW_FORM_strx1: { + return start + 1; + } + case DW_FORM_strx2: { + return start + 2; + } + case DW_FORM_strx3: { + return start + 3; + } + case DW_FORM_strx4: { + return start + 4; + } + + case DW_FORM_addrx: + case DW_FORM_GNU_addr_index: + reader_->ReadUnsignedLEB128(start, &len); + return start + len; + case DW_FORM_addrx1: + return start + 1; + case DW_FORM_addrx2: + return start + 2; + case DW_FORM_addrx3: + return start + 3; + case DW_FORM_addrx4: + return start + 4; + case DW_FORM_rnglistx: + reader_->ReadUnsignedLEB128(start, &len); + return start + len; + } + fprintf(stderr, "Unhandled form type\n"); + return NULL; +} + +// If one really wanted, you could merge SkipAttribute and +// ProcessAttribute +// This is all boring data manipulation and calling of the handler. +const uint8_t* CompilationUnit::ProcessAttribute( + uint64_t dieoffset, const uint8_t* start, enum DwarfAttribute attr, + enum DwarfForm form, uint64_t implicit_const) { + size_t len; + + switch (form) { + // DW_FORM_indirect is never used because it is such a space + // waster. + case DW_FORM_indirect: + form = static_cast(reader_->ReadUnsignedLEB128(start, + &len)); + start += len; + return ProcessAttribute(dieoffset, start, attr, form, implicit_const); + + case DW_FORM_flag_present: + ProcessAttributeUnsigned(dieoffset, attr, form, 1); + return start; + case DW_FORM_data1: + case DW_FORM_flag: + ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadOneByte(start)); + return start + 1; + case DW_FORM_data2: + ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadTwoBytes(start)); + return start + 2; + case DW_FORM_data4: + ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadFourBytes(start)); + return start + 4; + case DW_FORM_data8: + ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadEightBytes(start)); + return start + 8; + case DW_FORM_data16: + // This form is designed for an md5 checksum inside line tables. + fprintf(stderr, "Unhandled form type: DW_FORM_data16\n"); + return start + 16; + case DW_FORM_string: { + const char* str = reinterpret_cast(start); + ProcessAttributeString(dieoffset, attr, form, str); + return start + strlen(str) + 1; + } + case DW_FORM_udata: + ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadUnsignedLEB128(start, &len)); + return start + len; + + case DW_FORM_sdata: + ProcessAttributeSigned(dieoffset, attr, form, + reader_->ReadSignedLEB128(start, &len)); + return start + len; + case DW_FORM_addr: + ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadAddress(start)); + return start + reader_->AddressSize(); + case DW_FORM_sec_offset: + ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadOffset(start)); + return start + reader_->OffsetSize(); + + case DW_FORM_ref1: + handler_->ProcessAttributeReference(dieoffset, attr, form, + reader_->ReadOneByte(start) + + offset_from_section_start_); + return start + 1; + case DW_FORM_ref2: + handler_->ProcessAttributeReference(dieoffset, attr, form, + reader_->ReadTwoBytes(start) + + offset_from_section_start_); + return start + 2; + case DW_FORM_ref4: + handler_->ProcessAttributeReference(dieoffset, attr, form, + reader_->ReadFourBytes(start) + + offset_from_section_start_); + return start + 4; + case DW_FORM_ref8: + handler_->ProcessAttributeReference(dieoffset, attr, form, + reader_->ReadEightBytes(start) + + offset_from_section_start_); + return start + 8; + case DW_FORM_ref_udata: + handler_->ProcessAttributeReference(dieoffset, attr, form, + reader_->ReadUnsignedLEB128(start, + &len) + + offset_from_section_start_); + return start + len; + case DW_FORM_ref_addr: + // DWARF2 and 3/4 differ on whether ref_addr is address size or + // offset size. + assert(header_.version >= 2); + if (header_.version == 2) { + handler_->ProcessAttributeReference(dieoffset, attr, form, + reader_->ReadAddress(start)); + return start + reader_->AddressSize(); + } else if (header_.version >= 3) { + handler_->ProcessAttributeReference(dieoffset, attr, form, + reader_->ReadOffset(start)); + return start + reader_->OffsetSize(); + } + break; + case DW_FORM_ref_sig8: + handler_->ProcessAttributeSignature(dieoffset, attr, form, + reader_->ReadEightBytes(start)); + return start + 8; + case DW_FORM_implicit_const: + handler_->ProcessAttributeUnsigned(dieoffset, attr, form, + implicit_const); + return start; + case DW_FORM_block1: { + uint64_t datalen = reader_->ReadOneByte(start); + handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 1, + datalen); + return start + 1 + datalen; + } + case DW_FORM_block2: { + uint64_t datalen = reader_->ReadTwoBytes(start); + handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 2, + datalen); + return start + 2 + datalen; + } + case DW_FORM_block4: { + uint64_t datalen = reader_->ReadFourBytes(start); + handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 4, + datalen); + return start + 4 + datalen; + } + case DW_FORM_block: + case DW_FORM_exprloc: { + uint64_t datalen = reader_->ReadUnsignedLEB128(start, &len); + handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + len, + datalen); + return start + datalen + len; + } + case DW_FORM_strp: { + assert(string_buffer_ != NULL); + + const uint64_t offset = reader_->ReadOffset(start); + assert(string_buffer_ + offset < string_buffer_ + string_buffer_length_); + + const char* str = reinterpret_cast(string_buffer_ + offset); + ProcessAttributeString(dieoffset, attr, form, str); + return start + reader_->OffsetSize(); + } + case DW_FORM_line_strp: { + assert(line_string_buffer_ != NULL); + + const uint64_t offset = reader_->ReadOffset(start); + assert(line_string_buffer_ + offset < + line_string_buffer_ + line_string_buffer_length_); + + const char* str = + reinterpret_cast(line_string_buffer_ + offset); + ProcessAttributeString(dieoffset, attr, form, str); + return start + reader_->OffsetSize(); + } + case DW_FORM_strp_sup: + // No support currently for suplementary object files. + fprintf(stderr, "Unhandled form type: DW_FORM_strp_sup\n"); + return start + 4; + case DW_FORM_ref_sup4: + // No support currently for suplementary object files. + fprintf(stderr, "Unhandled form type: DW_FORM_ref_sup4\n"); + return start + 4; + case DW_FORM_ref_sup8: + // No support currently for suplementary object files. + fprintf(stderr, "Unhandled form type: DW_FORM_ref_sup8\n"); + return start + 8; + case DW_FORM_loclistx: + ProcessAttributeUnsigned(dieoffset, attr, form, + reader_->ReadUnsignedLEB128(start, &len)); + return start + len; + case DW_FORM_strx: + case DW_FORM_GNU_str_index: { + uint64_t str_index = reader_->ReadUnsignedLEB128(start, &len); + ProcessFormStringIndex(dieoffset, attr, form, str_index); + return start + len; + } + case DW_FORM_strx1: { + uint64_t str_index = reader_->ReadOneByte(start); + ProcessFormStringIndex(dieoffset, attr, form, str_index); + return start + 1; + } + case DW_FORM_strx2: { + uint64_t str_index = reader_->ReadTwoBytes(start); + ProcessFormStringIndex(dieoffset, attr, form, str_index); + return start + 2; + } + case DW_FORM_strx3: { + uint64_t str_index = reader_->ReadThreeBytes(start); + ProcessFormStringIndex(dieoffset, attr, form, str_index); + return start + 3; + } + case DW_FORM_strx4: { + uint64_t str_index = reader_->ReadFourBytes(start); + ProcessFormStringIndex(dieoffset, attr, form, str_index); + return start + 4; + } + + case DW_FORM_addrx: + case DW_FORM_GNU_addr_index: + ProcessAttributeAddrIndex( + dieoffset, attr, form, reader_->ReadUnsignedLEB128(start, &len)); + return start + len; + case DW_FORM_addrx1: + ProcessAttributeAddrIndex( + dieoffset, attr, form, reader_->ReadOneByte(start)); + return start + 1; + case DW_FORM_addrx2: + ProcessAttributeAddrIndex( + dieoffset, attr, form, reader_->ReadTwoBytes(start)); + return start + 2; + case DW_FORM_addrx3: + ProcessAttributeAddrIndex( + dieoffset, attr, form, reader_->ReadThreeBytes(start)); + return start + 3; + case DW_FORM_addrx4: + ProcessAttributeAddrIndex( + dieoffset, attr, form, reader_->ReadFourBytes(start)); + return start + 4; + case DW_FORM_rnglistx: + ProcessAttributeUnsigned( + dieoffset, attr, form, reader_->ReadUnsignedLEB128(start, &len)); + return start + len; + } + fprintf(stderr, "Unhandled form type\n"); + return NULL; +} + +const uint8_t* CompilationUnit::ProcessDIE(uint64_t dieoffset, + const uint8_t* start, + const Abbrev& abbrev) { + // With DWARF v5, the compile_unit die may contain a + // DW_AT_str_offsets_base or DW_AT_addr_base. If it does, that attribute must + // be found and processed before trying to process the other attributes; + // otherwise the string or address values will all come out incorrect. + if ((abbrev.tag == DW_TAG_compile_unit || + abbrev.tag == DW_TAG_skeleton_unit) && + header_.version == 5) { + uint64_t dieoffset_copy = dieoffset; + const uint8_t* start_copy = start; + for (AttributeList::const_iterator i = abbrev.attributes.begin(); + i != abbrev.attributes.end(); + i++) { + start_copy = ProcessOffsetBaseAttribute(dieoffset_copy, start_copy, + i->attr_, i->form_, + i->value_); + } + } + + for (AttributeList::const_iterator i = abbrev.attributes.begin(); + i != abbrev.attributes.end(); + i++) { + start = ProcessAttribute(dieoffset, start, i->attr_, i->form_, i->value_); + } + + // If this is a compilation unit in a split DWARF object, verify that + // the dwo_id matches. If it does not match, we will ignore this + // compilation unit. + if (abbrev.tag == DW_TAG_compile_unit + && is_split_dwarf_ + && dwo_id_ != skeleton_dwo_id_) { + return NULL; + } + + return start; +} + +void CompilationUnit::ProcessDIEs() { + const uint8_t* dieptr = after_header_; + size_t len; + + // lengthstart is the place the length field is based on. + // It is the point in the header after the initial length field + const uint8_t* lengthstart = buffer_; + + // In 64 bit dwarf, the initial length is 12 bytes, because of the + // 0xffffffff at the start. + if (reader_->OffsetSize() == 8) + lengthstart += 12; + else + lengthstart += 4; + + std::stack die_stack; + + while (dieptr < (lengthstart + header_.length)) { + // We give the user the absolute offset from the beginning of + // debug_info, since they need it to deal with ref_addr forms. + uint64_t absolute_offset = (dieptr - buffer_) + offset_from_section_start_; + + uint64_t abbrev_num = reader_->ReadUnsignedLEB128(dieptr, &len); + + dieptr += len; + + // Abbrev == 0 represents the end of a list of children, or padding + // at the end of the compilation unit. + if (abbrev_num == 0) { + if (die_stack.size() == 0) + // If it is padding, then we are done with the compilation unit's DIEs. + return; + const uint64_t offset = die_stack.top(); + die_stack.pop(); + handler_->EndDIE(offset); + continue; + } + + const Abbrev& abbrev = abbrevs_->at(static_cast(abbrev_num)); + const enum DwarfTag tag = abbrev.tag; + if (!handler_->StartDIE(absolute_offset, tag)) { + dieptr = SkipDIE(dieptr, abbrev); + if (!dieptr) { + fprintf(stderr, + "An error happens when skipping a DIE's attributes at offset " + "0x%" PRIx64 + ". Stopped processing following DIEs in this CU.\n", + absolute_offset); + exit(1); + } + } else { + dieptr = ProcessDIE(absolute_offset, dieptr, abbrev); + if (!dieptr) { + fprintf(stderr, + "An error happens when processing a DIE at offset 0x%" PRIx64 + ". Stopped processing following DIEs in this CU.\n", + absolute_offset); + exit(1); + } + } + + if (abbrev.has_children) { + die_stack.push(absolute_offset); + } else { + handler_->EndDIE(absolute_offset); + } + } +} + +// Check for a valid ELF file and return the Address size. +// Returns 0 if not a valid ELF file. +inline int GetElfWidth(const ElfReader& elf) { + if (elf.IsElf32File()) + return 4; + if (elf.IsElf64File()) + return 8; + return 0; +} + +bool CompilationUnit::ProcessSplitDwarf(std::string& split_file, + SectionMap& sections, + ByteReader& split_byte_reader, + uint64_t& cu_offset) { + if (!should_process_split_dwarf_) + return false; + struct stat statbuf; + bool found_in_dwp = false; + if (!have_checked_for_dwp_) { + // Look for a .dwp file in the same directory as the executable. + have_checked_for_dwp_ = true; + string dwp_suffix(".dwp"); + std::string dwp_path = path_ + dwp_suffix; + if (stat(dwp_path.c_str(), &statbuf) != 0) { + // Fall back to a split .debug file in the same directory. + string debug_suffix(".debug"); + dwp_path = path_; + size_t found = path_.rfind(debug_suffix); + if (found != string::npos && + found + debug_suffix.length() == path_.length()) + dwp_path = dwp_path.replace(found, debug_suffix.length(), dwp_suffix); + } + if (stat(dwp_path.c_str(), &statbuf) == 0) { + split_elf_reader_ = std::make_unique(dwp_path); + int width = GetElfWidth(*split_elf_reader_.get()); + if (width != 0) { + split_byte_reader = ByteReader(reader_->GetEndianness()); + split_byte_reader.SetAddressSize(width); + dwp_reader_ = std::make_unique(split_byte_reader, + split_elf_reader_.get()); + dwp_reader_->Initialize(); + // If we have a .dwp file, read the debug sections for the requested CU. + dwp_reader_->ReadDebugSectionsForCU(dwo_id_, §ions); + if (!sections.empty()) { + SectionMap::const_iterator cu_iter = + GetSectionByName(sections, ".debug_info_offset"); + SectionMap::const_iterator debug_info_iter = + GetSectionByName(sections, ".debug_info"); + assert(cu_iter != sections.end()); + assert(debug_info_iter != sections.end()); + cu_offset = cu_iter->second.first - debug_info_iter->second.first; + found_in_dwp = true; + split_file = dwp_path; + } + } + } + } + if (!found_in_dwp) { + // If no .dwp file, try to open the .dwo file. + if (stat(dwo_name_, &statbuf) == 0) { + split_elf_reader_ = std::make_unique(dwo_name_); + int width = GetElfWidth(*split_elf_reader_.get()); + if (width != 0) { + split_byte_reader = ByteReader(ENDIANNESS_LITTLE); + split_byte_reader.SetAddressSize(width); + ReadDebugSectionsFromDwo(split_elf_reader_.get(), §ions); + if (!sections.empty()) { + split_file = dwo_name_; + } + } + } + } + return !split_file.empty(); +} + +void CompilationUnit::ReadDebugSectionsFromDwo(ElfReader* elf_reader, + SectionMap* sections) { + static const char* const section_names[] = { + ".debug_abbrev", + ".debug_info", + ".debug_str_offsets", + ".debug_str" + }; + for (unsigned int i = 0u; + i < sizeof(section_names)/sizeof(*(section_names)); ++i) { + string base_name = section_names[i]; + string dwo_name = base_name + ".dwo"; + size_t section_size; + const char* section_data = elf_reader->GetSectionByName(dwo_name, + §ion_size); + if (section_data != NULL) + sections->insert(std::make_pair( + base_name, std::make_pair( + reinterpret_cast(section_data), + section_size))); + } +} + +DwpReader::DwpReader(const ByteReader& byte_reader, ElfReader* elf_reader) + : elf_reader_(elf_reader), byte_reader_(byte_reader), + cu_index_(NULL), cu_index_size_(0), string_buffer_(NULL), + string_buffer_size_(0), version_(0), ncolumns_(0), nunits_(0), + nslots_(0), phash_(NULL), pindex_(NULL), shndx_pool_(NULL), + offset_table_(NULL), size_table_(NULL), abbrev_data_(NULL), + abbrev_size_(0), info_data_(NULL), info_size_(0), + str_offsets_data_(NULL), str_offsets_size_(0) {} + +void DwpReader::Initialize() { + cu_index_ = elf_reader_->GetSectionByName(".debug_cu_index", + &cu_index_size_); + if (cu_index_ == NULL) { + return; + } + // The .debug_str.dwo section is shared by all CUs in the file. + string_buffer_ = elf_reader_->GetSectionByName(".debug_str.dwo", + &string_buffer_size_); + + version_ = byte_reader_.ReadFourBytes( + reinterpret_cast(cu_index_)); + + if (version_ == 1) { + nslots_ = byte_reader_.ReadFourBytes( + reinterpret_cast(cu_index_) + + 3 * sizeof(uint32_t)); + phash_ = cu_index_ + 4 * sizeof(uint32_t); + pindex_ = phash_ + nslots_ * sizeof(uint64_t); + shndx_pool_ = pindex_ + nslots_ * sizeof(uint32_t); + if (shndx_pool_ >= cu_index_ + cu_index_size_) { + version_ = 0; + } + } else if (version_ == 2 || version_ == 5) { + ncolumns_ = byte_reader_.ReadFourBytes( + reinterpret_cast(cu_index_) + sizeof(uint32_t)); + nunits_ = byte_reader_.ReadFourBytes( + reinterpret_cast(cu_index_) + 2 * sizeof(uint32_t)); + nslots_ = byte_reader_.ReadFourBytes( + reinterpret_cast(cu_index_) + 3 * sizeof(uint32_t)); + phash_ = cu_index_ + 4 * sizeof(uint32_t); + pindex_ = phash_ + nslots_ * sizeof(uint64_t); + offset_table_ = pindex_ + nslots_ * sizeof(uint32_t); + size_table_ = offset_table_ + ncolumns_ * (nunits_ + 1) * sizeof(uint32_t); + abbrev_data_ = elf_reader_->GetSectionByName(".debug_abbrev.dwo", + &abbrev_size_); + info_data_ = elf_reader_->GetSectionByName(".debug_info.dwo", &info_size_); + str_offsets_data_ = elf_reader_->GetSectionByName(".debug_str_offsets.dwo", + &str_offsets_size_); + rnglist_data_ = + elf_reader_->GetSectionByName(".debug_rnglists.dwo", &rnglist_size_); + if (size_table_ >= cu_index_ + cu_index_size_) { + version_ = 0; + } + } +} + +void DwpReader::ReadDebugSectionsForCU(uint64_t dwo_id, + SectionMap* sections) { + if (version_ == 1) { + int slot = LookupCU(dwo_id); + if (slot == -1) { + return; + } + + // The index table points to the section index pool, where we + // can read a list of section indexes for the debug sections + // for the CU whose dwo_id we are looking for. + int index = byte_reader_.ReadFourBytes( + reinterpret_cast(pindex_) + + slot * sizeof(uint32_t)); + const char* shndx_list = shndx_pool_ + index * sizeof(uint32_t); + for (;;) { + if (shndx_list >= cu_index_ + cu_index_size_) { + version_ = 0; + return; + } + unsigned int shndx = byte_reader_.ReadFourBytes( + reinterpret_cast(shndx_list)); + shndx_list += sizeof(uint32_t); + if (shndx == 0) + break; + const char* section_name = elf_reader_->GetSectionName(shndx); + size_t section_size; + const char* section_data; + // We're only interested in these four debug sections. + // The section names in the .dwo file end with ".dwo", but we + // add them to the sections table with their normal names. + if (!strncmp(section_name, ".debug_abbrev", strlen(".debug_abbrev"))) { + section_data = elf_reader_->GetSectionByIndex(shndx, §ion_size); + sections->insert(std::make_pair( + ".debug_abbrev", + std::make_pair(reinterpret_cast (section_data), + section_size))); + } else if (!strncmp(section_name, ".debug_info", strlen(".debug_info"))) { + section_data = elf_reader_->GetSectionByIndex(shndx, §ion_size); + sections->insert(std::make_pair( + ".debug_info", + std::make_pair(reinterpret_cast (section_data), + section_size))); + } else if (!strncmp(section_name, ".debug_str_offsets", + strlen(".debug_str_offsets"))) { + section_data = elf_reader_->GetSectionByIndex(shndx, §ion_size); + sections->insert(std::make_pair( + ".debug_str_offsets", + std::make_pair(reinterpret_cast (section_data), + section_size))); + } + } + sections->insert(std::make_pair( + ".debug_str", + std::make_pair(reinterpret_cast (string_buffer_), + string_buffer_size_))); + } else if (version_ == 2 || version_ == 5) { + uint32_t index = LookupCUv2(dwo_id); + if (index == 0) { + return; + } + + // The index points to a row in each of the section offsets table + // and the section size table, where we can read the offsets and sizes + // of the contributions to each debug section from the CU whose dwo_id + // we are looking for. Row 0 of the section offsets table has the + // section ids for each column of the table. The size table begins + // with row 1. + const char* id_row = offset_table_; + const char* offset_row = offset_table_ + + index * ncolumns_ * sizeof(uint32_t); + const char* size_row = + size_table_ + (index - 1) * ncolumns_ * sizeof(uint32_t); + if (size_row + ncolumns_ * sizeof(uint32_t) > cu_index_ + cu_index_size_) { + version_ = 0; + return; + } + for (unsigned int col = 0u; col < ncolumns_; ++col) { + uint32_t section_id = + byte_reader_.ReadFourBytes(reinterpret_cast(id_row) + + col * sizeof(uint32_t)); + uint32_t offset = byte_reader_.ReadFourBytes( + reinterpret_cast(offset_row) + + col * sizeof(uint32_t)); + uint32_t size = byte_reader_.ReadFourBytes( + reinterpret_cast(size_row) + col * sizeof(uint32_t)); + if (section_id == DW_SECT_ABBREV) { + sections->insert(std::make_pair( + ".debug_abbrev", + std::make_pair(reinterpret_cast (abbrev_data_) + + offset, size))); + } else if (section_id == DW_SECT_INFO) { + sections->insert(std::make_pair( + ".debug_info", + std::make_pair(reinterpret_cast(info_data_), 0))); + // .debug_info_offset will points the buffer for the CU with given + // dwo_id. + sections->insert(std::make_pair( + ".debug_info_offset", + std::make_pair( + reinterpret_cast(info_data_) + offset, size))); + } else if (section_id == DW_SECT_STR_OFFSETS) { + sections->insert(std::make_pair( + ".debug_str_offsets", + std::make_pair(reinterpret_cast (str_offsets_data_) + + offset, size))); + } else if (section_id == DW_SECT_RNGLISTS) { + sections->insert(std::make_pair( + ".debug_rnglists", + std::make_pair( + reinterpret_cast(rnglist_data_) + offset, + size))); + } + } + sections->insert(std::make_pair( + ".debug_str", + std::make_pair(reinterpret_cast (string_buffer_), + string_buffer_size_))); + } +} + +int DwpReader::LookupCU(uint64_t dwo_id) { + uint32_t slot = static_cast(dwo_id) & (nslots_ - 1); + uint64_t probe = byte_reader_.ReadEightBytes( + reinterpret_cast(phash_) + slot * sizeof(uint64_t)); + if (probe != 0 && probe != dwo_id) { + uint32_t secondary_hash = + (static_cast(dwo_id >> 32) & (nslots_ - 1)) | 1; + do { + slot = (slot + secondary_hash) & (nslots_ - 1); + probe = byte_reader_.ReadEightBytes( + reinterpret_cast(phash_) + slot * sizeof(uint64_t)); + } while (probe != 0 && probe != dwo_id); + } + if (probe == 0) + return -1; + return slot; +} + +uint32_t DwpReader::LookupCUv2(uint64_t dwo_id) { + uint32_t slot = static_cast(dwo_id) & (nslots_ - 1); + uint64_t probe = byte_reader_.ReadEightBytes( + reinterpret_cast(phash_) + slot * sizeof(uint64_t)); + uint32_t index = byte_reader_.ReadFourBytes( + reinterpret_cast(pindex_) + slot * sizeof(uint32_t)); + if (index != 0 && probe != dwo_id) { + uint32_t secondary_hash = + (static_cast(dwo_id >> 32) & (nslots_ - 1)) | 1; + do { + slot = (slot + secondary_hash) & (nslots_ - 1); + probe = byte_reader_.ReadEightBytes( + reinterpret_cast(phash_) + slot * sizeof(uint64_t)); + index = byte_reader_.ReadFourBytes( + reinterpret_cast(pindex_) + slot * sizeof(uint32_t)); + } while (index != 0 && probe != dwo_id); + } + return index; +} + +LineInfo::LineInfo(const uint8_t* buffer, uint64_t buffer_length, + ByteReader* reader, const uint8_t* string_buffer, + size_t string_buffer_length, + const uint8_t* line_string_buffer, + size_t line_string_buffer_length, LineInfoHandler* handler): + handler_(handler), reader_(reader), buffer_(buffer), + string_buffer_(string_buffer), + line_string_buffer_(line_string_buffer) { +#ifndef NDEBUG + buffer_length_ = buffer_length; + string_buffer_length_ = string_buffer_length; + line_string_buffer_length_ = line_string_buffer_length; +#endif + header_.std_opcode_lengths = NULL; +} + +uint64_t LineInfo::Start() { + ReadHeader(); + ReadLines(); + return after_header_ - buffer_; +} + +void LineInfo::ReadTypesAndForms(const uint8_t** lineptr, + uint32_t* content_types, + uint32_t* content_forms, + uint32_t max_types, + uint32_t* format_count) { + size_t len; + + uint32_t count = reader_->ReadUnsignedLEB128(*lineptr, &len); + *lineptr += len; + if (count < 1 || count > max_types) { + return; + } + for (uint32_t col = 0; col < count; ++col) { + content_types[col] = reader_->ReadUnsignedLEB128(*lineptr, &len); + *lineptr += len; + content_forms[col] = reader_->ReadUnsignedLEB128(*lineptr, &len); + *lineptr += len; + } + *format_count = count; +} + +const char* LineInfo::ReadStringForm(uint32_t form, const uint8_t** lineptr) { + const char* name = nullptr; + if (form == DW_FORM_string) { + name = reinterpret_cast(*lineptr); + *lineptr += strlen(name) + 1; + return name; + } else if (form == DW_FORM_strp) { + uint64_t offset = reader_->ReadOffset(*lineptr); + assert(offset < string_buffer_length_); + *lineptr += reader_->OffsetSize(); + if (string_buffer_ != nullptr) { + name = reinterpret_cast(string_buffer_) + offset; + return name; + } + } else if (form == DW_FORM_line_strp) { + uint64_t offset = reader_->ReadOffset(*lineptr); + assert(offset < line_string_buffer_length_); + *lineptr += reader_->OffsetSize(); + if (line_string_buffer_ != nullptr) { + name = reinterpret_cast(line_string_buffer_) + offset; + return name; + } + } + // Shouldn't be called with a non-string-form, and + // if there is a string form but no string buffer, + // that is a problem too. + assert(0); + return nullptr; +} + +uint64_t LineInfo::ReadUnsignedData(uint32_t form, const uint8_t** lineptr) { + size_t len; + uint64_t value; + + switch (form) { + case DW_FORM_data1: + value = reader_->ReadOneByte(*lineptr); + *lineptr += 1; + return value; + case DW_FORM_data2: + value = reader_->ReadTwoBytes(*lineptr); + *lineptr += 2; + return value; + case DW_FORM_data4: + value = reader_->ReadFourBytes(*lineptr); + *lineptr += 4; + return value; + case DW_FORM_data8: + value = reader_->ReadEightBytes(*lineptr); + *lineptr += 8; + return value; + case DW_FORM_udata: + value = reader_->ReadUnsignedLEB128(*lineptr, &len); + *lineptr += len; + return value; + default: + fprintf(stderr, "Unrecognized data form."); + return 0; + } +} + +void LineInfo::ReadFileRow(const uint8_t** lineptr, + const uint32_t* content_types, + const uint32_t* content_forms, uint32_t row, + uint32_t format_count) { + const char* filename = nullptr; + uint64_t dirindex = 0; + uint64_t mod_time = 0; + uint64_t filelength = 0; + + for (uint32_t col = 0; col < format_count; ++col) { + switch (content_types[col]) { + case DW_LNCT_path: + filename = ReadStringForm(content_forms[col], lineptr); + break; + case DW_LNCT_directory_index: + dirindex = ReadUnsignedData(content_forms[col], lineptr); + break; + case DW_LNCT_timestamp: + mod_time = ReadUnsignedData(content_forms[col], lineptr); + break; + case DW_LNCT_size: + filelength = ReadUnsignedData(content_forms[col], lineptr); + break; + case DW_LNCT_MD5: + // MD5 entries help a debugger sort different versions of files with + // the same name. It is always paired with a DW_FORM_data16 and is + // unused in this case. + *lineptr += 16; + break; + default: + fprintf(stderr, "Unrecognized form in line table header. %d\n", + content_types[col]); + assert(false); + break; + } + } + assert(filename != nullptr); + handler_->DefineFile(filename, row, dirindex, mod_time, filelength); +} + +// The header for a debug_line section is mildly complicated, because +// the line info is very tightly encoded. +void LineInfo::ReadHeader() { + const uint8_t* lineptr = buffer_; + size_t initial_length_size; + + const uint64_t initial_length + = reader_->ReadInitialLength(lineptr, &initial_length_size); + + lineptr += initial_length_size; + header_.total_length = initial_length; + assert(buffer_ + initial_length_size + header_.total_length <= + buffer_ + buffer_length_); + + + header_.version = reader_->ReadTwoBytes(lineptr); + lineptr += 2; + + if (header_.version >= 5) { + uint8_t address_size = reader_->ReadOneByte(lineptr); + reader_->SetAddressSize(address_size); + lineptr += 1; + uint8_t segment_selector_size = reader_->ReadOneByte(lineptr); + if (segment_selector_size != 0) { + fprintf(stderr,"No support for segmented memory."); + } + lineptr += 1; + } else { + // Address size *must* be set by CU ahead of time. + assert(reader_->AddressSize() != 0); + } + + header_.prologue_length = reader_->ReadOffset(lineptr); + lineptr += reader_->OffsetSize(); + + header_.min_insn_length = reader_->ReadOneByte(lineptr); + lineptr += 1; + + if (header_.version >= 4) { + __attribute__((unused)) uint8_t max_ops_per_insn = + reader_->ReadOneByte(lineptr); + ++lineptr; + assert(max_ops_per_insn == 1); + } + + header_.default_is_stmt = reader_->ReadOneByte(lineptr); + lineptr += 1; + + header_.line_base = *reinterpret_cast(lineptr); + lineptr += 1; + + header_.line_range = reader_->ReadOneByte(lineptr); + lineptr += 1; + + header_.opcode_base = reader_->ReadOneByte(lineptr); + lineptr += 1; + + header_.std_opcode_lengths = new std::vector; + header_.std_opcode_lengths->resize(header_.opcode_base + 1); + (*header_.std_opcode_lengths)[0] = 0; + for (int i = 1; i < header_.opcode_base; i++) { + (*header_.std_opcode_lengths)[i] = reader_->ReadOneByte(lineptr); + lineptr += 1; + } + + if (header_.version <= 4) { + // Directory zero is assumed to be the compilation directory and special + // cased where used. It is not actually stored in the dwarf data. But an + // empty entry here avoids off-by-one errors elsewhere in the code. + handler_->DefineDir("", 0); + // It is legal for the directory entry table to be empty. + if (*lineptr) { + uint32_t dirindex = 1; + while (*lineptr) { + const char* dirname = reinterpret_cast(lineptr); + handler_->DefineDir(dirname, dirindex); + lineptr += strlen(dirname) + 1; + dirindex++; + } + } + lineptr++; + // It is also legal for the file entry table to be empty. + + // Similarly for file zero. + handler_->DefineFile("", 0, 0, 0, 0); + if (*lineptr) { + uint32_t fileindex = 1; + size_t len; + while (*lineptr) { + const char* filename = ReadStringForm(DW_FORM_string, &lineptr); + + uint64_t dirindex = reader_->ReadUnsignedLEB128(lineptr, &len); + lineptr += len; + + uint64_t mod_time = reader_->ReadUnsignedLEB128(lineptr, &len); + lineptr += len; + + uint64_t filelength = reader_->ReadUnsignedLEB128(lineptr, &len); + lineptr += len; + handler_->DefineFile(filename, fileindex, + static_cast(dirindex), mod_time, + filelength); + fileindex++; + } + } + lineptr++; + } else { + // Read the DWARF-5 directory table. + + // Dwarf5 supports five different types and forms per directory- and + // file-table entry. Theoretically, there could be duplicate entries + // in this table, but that would be quite unusual. + static const uint32_t kMaxTypesAndForms = 5; + uint32_t content_types[kMaxTypesAndForms]; + uint32_t content_forms[kMaxTypesAndForms]; + uint32_t format_count; + size_t len; + + ReadTypesAndForms(&lineptr, content_types, content_forms, kMaxTypesAndForms, + &format_count); + uint32_t entry_count = reader_->ReadUnsignedLEB128(lineptr, &len); + lineptr += len; + for (uint32_t row = 0; row < entry_count; ++row) { + const char* dirname = nullptr; + for (uint32_t col = 0; col < format_count; ++col) { + // The path is the only relevant content type for this implementation. + if (content_types[col] == DW_LNCT_path) { + dirname = ReadStringForm(content_forms[col], &lineptr); + } + } + handler_->DefineDir(dirname, row); + } + + // Read the DWARF-5 filename table. + ReadTypesAndForms(&lineptr, content_types, content_forms, kMaxTypesAndForms, + &format_count); + entry_count = reader_->ReadUnsignedLEB128(lineptr, &len); + lineptr += len; + + for (uint32_t row = 0; row < entry_count; ++row) { + ReadFileRow(&lineptr, content_types, content_forms, row, format_count); + } + } + after_header_ = lineptr; +} + +/* static */ +bool LineInfo::ProcessOneOpcode(ByteReader* reader, + LineInfoHandler* handler, + const struct LineInfoHeader& header, + const uint8_t* start, + struct LineStateMachine* lsm, + size_t* len, + uintptr pc, + bool* lsm_passes_pc) { + size_t oplen = 0; + size_t templen; + uint8_t opcode = reader->ReadOneByte(start); + oplen++; + start++; + + // If the opcode is great than the opcode_base, it is a special + // opcode. Most line programs consist mainly of special opcodes. + if (opcode >= header.opcode_base) { + opcode -= header.opcode_base; + const int64_t advance_address = (opcode / header.line_range) + * header.min_insn_length; + const int32_t advance_line = (opcode % header.line_range) + + header.line_base; + + // Check if the lsm passes "pc". If so, mark it as passed. + if (lsm_passes_pc && + lsm->address <= pc && pc < lsm->address + advance_address) { + *lsm_passes_pc = true; + } + + lsm->address += advance_address; + lsm->line_num += advance_line; + lsm->basic_block = true; + *len = oplen; + return true; + } + + // Otherwise, we have the regular opcodes + switch (opcode) { + case DW_LNS_copy: { + lsm->basic_block = false; + *len = oplen; + return true; + } + + case DW_LNS_advance_pc: { + uint64_t advance_address = reader->ReadUnsignedLEB128(start, &templen); + oplen += templen; + + // Check if the lsm passes "pc". If so, mark it as passed. + if (lsm_passes_pc && lsm->address <= pc && + pc < lsm->address + header.min_insn_length * advance_address) { + *lsm_passes_pc = true; + } + + lsm->address += header.min_insn_length * advance_address; + } + break; + case DW_LNS_advance_line: { + const int64_t advance_line = reader->ReadSignedLEB128(start, &templen); + oplen += templen; + lsm->line_num += static_cast(advance_line); + + // With gcc 4.2.1, we can get the line_no here for the first time + // since DW_LNS_advance_line is called after DW_LNE_set_address is + // called. So we check if the lsm passes "pc" here, not in + // DW_LNE_set_address. + if (lsm_passes_pc && lsm->address == pc) { + *lsm_passes_pc = true; + } + } + break; + case DW_LNS_set_file: { + const uint64_t fileno = reader->ReadUnsignedLEB128(start, &templen); + oplen += templen; + lsm->file_num = static_cast(fileno); + } + break; + case DW_LNS_set_column: { + const uint64_t colno = reader->ReadUnsignedLEB128(start, &templen); + oplen += templen; + lsm->column_num = static_cast(colno); + } + break; + case DW_LNS_negate_stmt: { + lsm->is_stmt = !lsm->is_stmt; + } + break; + case DW_LNS_set_basic_block: { + lsm->basic_block = true; + } + break; + case DW_LNS_fixed_advance_pc: { + const uint16_t advance_address = reader->ReadTwoBytes(start); + oplen += 2; + + // Check if the lsm passes "pc". If so, mark it as passed. + if (lsm_passes_pc && + lsm->address <= pc && pc < lsm->address + advance_address) { + *lsm_passes_pc = true; + } + + lsm->address += advance_address; + } + break; + case DW_LNS_const_add_pc: { + const int64_t advance_address = header.min_insn_length + * ((255 - header.opcode_base) + / header.line_range); + + // Check if the lsm passes "pc". If so, mark it as passed. + if (lsm_passes_pc && + lsm->address <= pc && pc < lsm->address + advance_address) { + *lsm_passes_pc = true; + } + + lsm->address += advance_address; + } + break; + case DW_LNS_extended_op: { + const uint64_t extended_op_len = reader->ReadUnsignedLEB128(start, + &templen); + start += templen; + oplen += templen + extended_op_len; + + const uint64_t extended_op = reader->ReadOneByte(start); + start++; + + switch (extended_op) { + case DW_LNE_end_sequence: { + lsm->end_sequence = true; + *len = oplen; + return true; + } + break; + case DW_LNE_set_address: { + // With gcc 4.2.1, we cannot tell the line_no here since + // DW_LNE_set_address is called before DW_LNS_advance_line is + // called. So we do not check if the lsm passes "pc" here. See + // also the comment in DW_LNS_advance_line. + uint64_t address = reader->ReadAddress(start); + lsm->address = address; + } + break; + case DW_LNE_define_file: { + const char* filename = reinterpret_cast(start); + + templen = strlen(filename) + 1; + start += templen; + + uint64_t dirindex = reader->ReadUnsignedLEB128(start, &templen); + oplen += templen; + + const uint64_t mod_time = reader->ReadUnsignedLEB128(start, + &templen); + oplen += templen; + + const uint64_t filelength = reader->ReadUnsignedLEB128(start, + &templen); + oplen += templen; + + if (handler) { + handler->DefineFile(filename, -1, static_cast(dirindex), + mod_time, filelength); + } + } + break; + } + } + break; + + default: { + // Ignore unknown opcode silently + if (header.std_opcode_lengths) { + for (int i = 0; i < (*header.std_opcode_lengths)[opcode]; i++) { + reader->ReadUnsignedLEB128(start, &templen); + start += templen; + oplen += templen; + } + } + } + break; + } + *len = oplen; + return false; +} + +void LineInfo::ReadLines() { + struct LineStateMachine lsm; + + // lengthstart is the place the length field is based on. + // It is the point in the header after the initial length field + const uint8_t* lengthstart = buffer_; + + // In 64 bit dwarf, the initial length is 12 bytes, because of the + // 0xffffffff at the start. + if (reader_->OffsetSize() == 8) + lengthstart += 12; + else + lengthstart += 4; + + const uint8_t* lineptr = after_header_; + lsm.Reset(header_.default_is_stmt); + + // The LineInfoHandler interface expects each line's length along + // with its address, but DWARF only provides addresses (sans + // length), and an end-of-sequence address; one infers the length + // from the next address. So we report a line only when we get the + // next line's address, or the end-of-sequence address. + bool have_pending_line = false; + uint64_t pending_address = 0; + uint32_t pending_file_num = 0, pending_line_num = 0, pending_column_num = 0; + + while (lineptr < lengthstart + header_.total_length) { + size_t oplength; + bool add_row = ProcessOneOpcode(reader_, handler_, header_, + lineptr, &lsm, &oplength, (uintptr)-1, + NULL); + if (add_row) { + if (have_pending_line) + handler_->AddLine(pending_address, lsm.address - pending_address, + pending_file_num, pending_line_num, + pending_column_num); + if (lsm.end_sequence) { + lsm.Reset(header_.default_is_stmt); + have_pending_line = false; + } else { + pending_address = lsm.address; + pending_file_num = lsm.file_num; + pending_line_num = lsm.line_num; + pending_column_num = lsm.column_num; + have_pending_line = true; + } + } + lineptr += oplength; + } + + after_header_ = lengthstart + header_.total_length; +} + +bool RangeListReader::ReadRanges(enum DwarfForm form, uint64_t data) { + if (form == DW_FORM_sec_offset) { + if (cu_info_->version_ <= 4) { + return ReadDebugRanges(data); + } else { + return ReadDebugRngList(data); + } + } else if (form == DW_FORM_rnglistx) { + if (cu_info_->ranges_base_ == 0) { + // In split dwarf, there's no DW_AT_rnglists_base attribute, range_base + // will just be the first byte after the header. + cu_info_->ranges_base_ = reader_->OffsetSize() == 4? 12: 20; + } + offset_array_ = cu_info_->ranges_base_; + uint64_t index_offset = reader_->OffsetSize() * data; + uint64_t range_list_offset = + reader_->ReadOffset(cu_info_->buffer_ + offset_array_ + index_offset); + + return ReadDebugRngList(offset_array_ + range_list_offset); + } + return false; +} + +bool RangeListReader::ReadDebugRanges(uint64_t offset) { + const uint64_t max_address = + (reader_->AddressSize() == 4) ? 0xffffffffUL + : 0xffffffffffffffffULL; + const uint64_t entry_size = reader_->AddressSize() * 2; + bool list_end = false; + + do { + if (offset > cu_info_->size_ - entry_size) { + return false; // Invalid range detected + } + + uint64_t start_address = reader_->ReadAddress(cu_info_->buffer_ + offset); + uint64_t end_address = reader_->ReadAddress( + cu_info_->buffer_ + offset + reader_->AddressSize()); + + if (start_address == max_address) { // Base address selection + cu_info_->base_address_ = end_address; + } else if (start_address == 0 && end_address == 0) { // End-of-list + handler_->Finish(); + list_end = true; + } else { // Add a range entry + handler_->AddRange(start_address + cu_info_->base_address_, + end_address + cu_info_->base_address_); + } + + offset += entry_size; + } while (!list_end); + + return true; +} + +bool RangeListReader::ReadDebugRngList(uint64_t offset) { + uint64_t start = 0; + uint64_t end = 0; + uint64_t range_len = 0; + uint64_t index = 0; + // A uleb128's length isn't known until after it has been read, so overruns + // are only caught after an entire entry. + while (offset < cu_info_->size_) { + uint8_t entry_type = reader_->ReadOneByte(cu_info_->buffer_ + offset); + offset += 1; + // Handle each entry type per Dwarf 5 Standard, section 2.17.3. + switch (entry_type) { + case DW_RLE_end_of_list: + handler_->Finish(); + return true; + case DW_RLE_base_addressx: + offset += ReadULEB(offset, &index); + cu_info_->base_address_ = GetAddressAtIndex(index); + break; + case DW_RLE_startx_endx: + offset += ReadULEB(offset, &index); + start = GetAddressAtIndex(index); + offset += ReadULEB(offset, &index); + end = GetAddressAtIndex(index); + handler_->AddRange(start, end); + break; + case DW_RLE_startx_length: + offset += ReadULEB(offset, &index); + start = GetAddressAtIndex(index); + offset += ReadULEB(offset, &range_len); + handler_->AddRange(start, start + range_len); + break; + case DW_RLE_offset_pair: + offset += ReadULEB(offset, &start); + offset += ReadULEB(offset, &end); + handler_->AddRange(start + cu_info_->base_address_, + end + cu_info_->base_address_); + break; + case DW_RLE_base_address: + offset += ReadAddress(offset, &cu_info_->base_address_); + break; + case DW_RLE_start_end: + offset += ReadAddress(offset, &start); + offset += ReadAddress(offset, &end); + handler_->AddRange(start, end); + break; + case DW_RLE_start_length: + offset += ReadAddress(offset, &start); + offset += ReadULEB(offset, &end); + handler_->AddRange(start, start + end); + break; + } + } + return false; +} + +// A DWARF rule for recovering the address or value of a register, or +// computing the canonical frame address. There is one subclass of this for +// each '*Rule' member function in CallFrameInfo::Handler. +// +// It's annoying that we have to handle Rules using pointers (because +// the concrete instances can have an arbitrary size). They're small, +// so it would be much nicer if we could just handle them by value +// instead of fretting about ownership and destruction. +// +// It seems like all these could simply be instances of std::tr1::bind, +// except that we need instances to be EqualityComparable, too. +// +// This could logically be nested within State, but then the qualified names +// get horrendous. +class CallFrameInfo::Rule { + public: + virtual ~Rule() { } + + // Tell HANDLER that, at ADDRESS in the program, REG can be recovered using + // this rule. If REG is kCFARegister, then this rule describes how to compute + // the canonical frame address. Return what the HANDLER member function + // returned. + virtual bool Handle(Handler* handler, + uint64_t address, int reg) const = 0; + + // Equality on rules. We use these to decide which rules we need + // to report after a DW_CFA_restore_state instruction. + virtual bool operator==(const Rule& rhs) const = 0; + + bool operator!=(const Rule& rhs) const { return ! (*this == rhs); } + + // Return a pointer to a copy of this rule. + virtual Rule* Copy() const = 0; + + // If this is a base+offset rule, change its base register to REG. + // Otherwise, do nothing. (Ugly, but required for DW_CFA_def_cfa_register.) + virtual void SetBaseRegister(unsigned reg) { } + + // If this is a base+offset rule, change its offset to OFFSET. Otherwise, + // do nothing. (Ugly, but required for DW_CFA_def_cfa_offset.) + virtual void SetOffset(long long offset) { } +}; + +// Rule: the value the register had in the caller cannot be recovered. +class CallFrameInfo::UndefinedRule: public CallFrameInfo::Rule { + public: + UndefinedRule() { } + ~UndefinedRule() { } + bool Handle(Handler* handler, uint64_t address, int reg) const { + return handler->UndefinedRule(address, reg); + } + bool operator==(const Rule& rhs) const { + // dynamic_cast is allowed by the Google C++ Style Guide, if the use has + // been carefully considered; cheap RTTI-like workarounds are forbidden. + const UndefinedRule* our_rhs = dynamic_cast(&rhs); + return (our_rhs != NULL); + } + Rule* Copy() const { return new UndefinedRule(*this); } +}; + +// Rule: the register's value is the same as that it had in the caller. +class CallFrameInfo::SameValueRule: public CallFrameInfo::Rule { + public: + SameValueRule() { } + ~SameValueRule() { } + bool Handle(Handler* handler, uint64_t address, int reg) const { + return handler->SameValueRule(address, reg); + } + bool operator==(const Rule& rhs) const { + // dynamic_cast is allowed by the Google C++ Style Guide, if the use has + // been carefully considered; cheap RTTI-like workarounds are forbidden. + const SameValueRule* our_rhs = dynamic_cast(&rhs); + return (our_rhs != NULL); + } + Rule* Copy() const { return new SameValueRule(*this); } +}; + +// Rule: the register is saved at OFFSET from BASE_REGISTER. BASE_REGISTER +// may be CallFrameInfo::Handler::kCFARegister. +class CallFrameInfo::OffsetRule: public CallFrameInfo::Rule { + public: + OffsetRule(int base_register, long offset) + : base_register_(base_register), offset_(offset) { } + ~OffsetRule() { } + bool Handle(Handler* handler, uint64_t address, int reg) const { + return handler->OffsetRule(address, reg, base_register_, offset_); + } + bool operator==(const Rule& rhs) const { + // dynamic_cast is allowed by the Google C++ Style Guide, if the use has + // been carefully considered; cheap RTTI-like workarounds are forbidden. + const OffsetRule* our_rhs = dynamic_cast(&rhs); + return (our_rhs && + base_register_ == our_rhs->base_register_ && + offset_ == our_rhs->offset_); + } + Rule* Copy() const { return new OffsetRule(*this); } + // We don't actually need SetBaseRegister or SetOffset here, since they + // are only ever applied to CFA rules, for DW_CFA_def_cfa_offset, and it + // doesn't make sense to use OffsetRule for computing the CFA: it + // computes the address at which a register is saved, not a value. + private: + int base_register_; + long offset_; +}; + +// Rule: the value the register had in the caller is the value of +// BASE_REGISTER plus offset. BASE_REGISTER may be +// CallFrameInfo::Handler::kCFARegister. +class CallFrameInfo::ValOffsetRule: public CallFrameInfo::Rule { + public: + ValOffsetRule(int base_register, long offset) + : base_register_(base_register), offset_(offset) { } + ~ValOffsetRule() { } + bool Handle(Handler* handler, uint64_t address, int reg) const { + return handler->ValOffsetRule(address, reg, base_register_, offset_); + } + bool operator==(const Rule& rhs) const { + // dynamic_cast is allowed by the Google C++ Style Guide, if the use has + // been carefully considered; cheap RTTI-like workarounds are forbidden. + const ValOffsetRule* our_rhs = dynamic_cast(&rhs); + return (our_rhs && + base_register_ == our_rhs->base_register_ && + offset_ == our_rhs->offset_); + } + Rule* Copy() const { return new ValOffsetRule(*this); } + void SetBaseRegister(unsigned reg) { base_register_ = reg; } + void SetOffset(long long offset) { offset_ = offset; } + private: + int base_register_; + long offset_; +}; + +// Rule: the register has been saved in another register REGISTER_NUMBER_. +class CallFrameInfo::RegisterRule: public CallFrameInfo::Rule { + public: + explicit RegisterRule(int register_number) + : register_number_(register_number) { } + ~RegisterRule() { } + bool Handle(Handler* handler, uint64_t address, int reg) const { + return handler->RegisterRule(address, reg, register_number_); + } + bool operator==(const Rule& rhs) const { + // dynamic_cast is allowed by the Google C++ Style Guide, if the use has + // been carefully considered; cheap RTTI-like workarounds are forbidden. + const RegisterRule* our_rhs = dynamic_cast(&rhs); + return (our_rhs && register_number_ == our_rhs->register_number_); + } + Rule* Copy() const { return new RegisterRule(*this); } + private: + int register_number_; +}; + +// Rule: EXPRESSION evaluates to the address at which the register is saved. +class CallFrameInfo::ExpressionRule: public CallFrameInfo::Rule { + public: + explicit ExpressionRule(const string& expression) + : expression_(expression) { } + ~ExpressionRule() { } + bool Handle(Handler* handler, uint64_t address, int reg) const { + return handler->ExpressionRule(address, reg, expression_); + } + bool operator==(const Rule& rhs) const { + // dynamic_cast is allowed by the Google C++ Style Guide, if the use has + // been carefully considered; cheap RTTI-like workarounds are forbidden. + const ExpressionRule* our_rhs = dynamic_cast(&rhs); + return (our_rhs && expression_ == our_rhs->expression_); + } + Rule* Copy() const { return new ExpressionRule(*this); } + private: + string expression_; +}; + +// Rule: EXPRESSION evaluates to the address at which the register is saved. +class CallFrameInfo::ValExpressionRule: public CallFrameInfo::Rule { + public: + explicit ValExpressionRule(const string& expression) + : expression_(expression) { } + ~ValExpressionRule() { } + bool Handle(Handler* handler, uint64_t address, int reg) const { + return handler->ValExpressionRule(address, reg, expression_); + } + bool operator==(const Rule& rhs) const { + // dynamic_cast is allowed by the Google C++ Style Guide, if the use has + // been carefully considered; cheap RTTI-like workarounds are forbidden. + const ValExpressionRule* our_rhs = + dynamic_cast(&rhs); + return (our_rhs && expression_ == our_rhs->expression_); + } + Rule* Copy() const { return new ValExpressionRule(*this); } + private: + string expression_; +}; + +// A map from register numbers to rules. +class CallFrameInfo::RuleMap { + public: + RuleMap() : cfa_rule_(NULL) { } + RuleMap(const RuleMap& rhs) : cfa_rule_(NULL) { *this = rhs; } + ~RuleMap() { Clear(); } + + RuleMap& operator=(const RuleMap& rhs); + + // Set the rule for computing the CFA to RULE. Take ownership of RULE. + void SetCFARule(Rule* rule) { delete cfa_rule_; cfa_rule_ = rule; } + + // Return the current CFA rule. Unlike RegisterRule, this RuleMap retains + // ownership of the rule. We use this for DW_CFA_def_cfa_offset and + // DW_CFA_def_cfa_register, and for detecting references to the CFA before + // a rule for it has been established. + Rule* CFARule() const { return cfa_rule_; } + + // Return the rule for REG, or NULL if there is none. The caller takes + // ownership of the result. + Rule* RegisterRule(int reg) const; + + // Set the rule for computing REG to RULE. Take ownership of RULE. + void SetRegisterRule(int reg, Rule* rule); + + // Make all the appropriate calls to HANDLER as if we were changing from + // this RuleMap to NEW_RULES at ADDRESS. We use this to implement + // DW_CFA_restore_state, where lots of rules can change simultaneously. + // Return true if all handlers returned true; otherwise, return false. + bool HandleTransitionTo(Handler* handler, uint64_t address, + const RuleMap& new_rules) const; + + private: + // A map from register numbers to Rules. + typedef std::map RuleByNumber; + + // Remove all register rules and clear cfa_rule_. + void Clear(); + + // The rule for computing the canonical frame address. This RuleMap owns + // this rule. + Rule* cfa_rule_; + + // A map from register numbers to postfix expressions to recover + // their values. This RuleMap owns the Rules the map refers to. + RuleByNumber registers_; +}; + +CallFrameInfo::RuleMap& CallFrameInfo::RuleMap::operator=(const RuleMap& rhs) { + Clear(); + // Since each map owns the rules it refers to, assignment must copy them. + if (rhs.cfa_rule_) cfa_rule_ = rhs.cfa_rule_->Copy(); + for (RuleByNumber::const_iterator it = rhs.registers_.begin(); + it != rhs.registers_.end(); it++) + registers_[it->first] = it->second->Copy(); + return *this; +} + +CallFrameInfo::Rule* CallFrameInfo::RuleMap::RegisterRule(int reg) const { + assert(reg != Handler::kCFARegister); + RuleByNumber::const_iterator it = registers_.find(reg); + if (it != registers_.end()) + return it->second->Copy(); + else + return NULL; +} + +void CallFrameInfo::RuleMap::SetRegisterRule(int reg, Rule* rule) { + assert(reg != Handler::kCFARegister); + assert(rule); + Rule** slot = ®isters_[reg]; + delete *slot; + *slot = rule; +} + +bool CallFrameInfo::RuleMap::HandleTransitionTo( + Handler* handler, + uint64_t address, + const RuleMap& new_rules) const { + // Transition from cfa_rule_ to new_rules.cfa_rule_. + if (cfa_rule_ && new_rules.cfa_rule_) { + if (*cfa_rule_ != *new_rules.cfa_rule_ && + !new_rules.cfa_rule_->Handle(handler, address, + Handler::kCFARegister)) + return false; + } else if (cfa_rule_) { + // this RuleMap has a CFA rule but new_rules doesn't. + // CallFrameInfo::Handler has no way to handle this --- and shouldn't; + // it's garbage input. The instruction interpreter should have + // detected this and warned, so take no action here. + } else if (new_rules.cfa_rule_) { + // This shouldn't be possible: NEW_RULES is some prior state, and + // there's no way to remove entries. + assert(0); + } else { + // Both CFA rules are empty. No action needed. + } + + // Traverse the two maps in order by register number, and report + // whatever differences we find. + RuleByNumber::const_iterator old_it = registers_.begin(); + RuleByNumber::const_iterator new_it = new_rules.registers_.begin(); + while (old_it != registers_.end() && new_it != new_rules.registers_.end()) { + if (old_it->first < new_it->first) { + // This RuleMap has an entry for old_it->first, but NEW_RULES + // doesn't. + // + // This isn't really the right thing to do, but since CFI generally + // only mentions callee-saves registers, and GCC's convention for + // callee-saves registers is that they are unchanged, it's a good + // approximation. + if (!handler->SameValueRule(address, old_it->first)) + return false; + old_it++; + } else if (old_it->first > new_it->first) { + // NEW_RULES has entry for new_it->first, but this RuleMap + // doesn't. This shouldn't be possible: NEW_RULES is some prior + // state, and there's no way to remove entries. + assert(0); + } else { + // Both maps have an entry for this register. Report the new + // rule if it is different. + if (*old_it->second != *new_it->second && + !new_it->second->Handle(handler, address, new_it->first)) + return false; + new_it++, old_it++; + } + } + // Finish off entries from this RuleMap with no counterparts in new_rules. + while (old_it != registers_.end()) { + if (!handler->SameValueRule(address, old_it->first)) + return false; + old_it++; + } + // Since we only make transitions from a rule set to some previously + // saved rule set, and we can only add rules to the map, NEW_RULES + // must have fewer rules than *this. + assert(new_it == new_rules.registers_.end()); + + return true; +} + +// Remove all register rules and clear cfa_rule_. +void CallFrameInfo::RuleMap::Clear() { + delete cfa_rule_; + cfa_rule_ = NULL; + for (RuleByNumber::iterator it = registers_.begin(); + it != registers_.end(); it++) + delete it->second; + registers_.clear(); +} + +// The state of the call frame information interpreter as it processes +// instructions from a CIE and FDE. +class CallFrameInfo::State { + public: + // Create a call frame information interpreter state with the given + // reporter, reader, handler, and initial call frame info address. + State(ByteReader* reader, Handler* handler, Reporter* reporter, + uint64_t address) + : reader_(reader), handler_(handler), reporter_(reporter), + address_(address), entry_(NULL), cursor_(NULL) { } + + // Interpret instructions from CIE, save the resulting rule set for + // DW_CFA_restore instructions, and return true. On error, report + // the problem to reporter_ and return false. + bool InterpretCIE(const CIE& cie); + + // Interpret instructions from FDE, and return true. On error, + // report the problem to reporter_ and return false. + bool InterpretFDE(const FDE& fde); + + private: + // The operands of a CFI instruction, for ParseOperands. + struct Operands { + unsigned register_number; // A register number. + uint64_t offset; // An offset or address. + long signed_offset; // A signed offset. + string expression; // A DWARF expression. + }; + + // Parse CFI instruction operands from STATE's instruction stream as + // described by FORMAT. On success, populate OPERANDS with the + // results, and return true. On failure, report the problem and + // return false. + // + // Each character of FORMAT should be one of the following: + // + // 'r' unsigned LEB128 register number (OPERANDS->register_number) + // 'o' unsigned LEB128 offset (OPERANDS->offset) + // 's' signed LEB128 offset (OPERANDS->signed_offset) + // 'a' machine-size address (OPERANDS->offset) + // (If the CIE has a 'z' augmentation string, 'a' uses the + // encoding specified by the 'R' argument.) + // '1' a one-byte offset (OPERANDS->offset) + // '2' a two-byte offset (OPERANDS->offset) + // '4' a four-byte offset (OPERANDS->offset) + // '8' an eight-byte offset (OPERANDS->offset) + // 'e' a DW_FORM_block holding a (OPERANDS->expression) + // DWARF expression + bool ParseOperands(const char* format, Operands* operands); + + // Interpret one CFI instruction from STATE's instruction stream, update + // STATE, report any rule changes to handler_, and return true. On + // failure, report the problem and return false. + bool DoInstruction(); + + // The following Do* member functions are subroutines of DoInstruction, + // factoring out the actual work of operations that have several + // different encodings. + + // Set the CFA rule to be the value of BASE_REGISTER plus OFFSET, and + // return true. On failure, report and return false. (Used for + // DW_CFA_def_cfa and DW_CFA_def_cfa_sf.) + bool DoDefCFA(unsigned base_register, long offset); + + // Change the offset of the CFA rule to OFFSET, and return true. On + // failure, report and return false. (Subroutine for + // DW_CFA_def_cfa_offset and DW_CFA_def_cfa_offset_sf.) + bool DoDefCFAOffset(long offset); + + // Specify that REG can be recovered using RULE, and return true. On + // failure, report and return false. + bool DoRule(unsigned reg, Rule* rule); + + // Specify that REG can be found at OFFSET from the CFA, and return true. + // On failure, report and return false. (Subroutine for DW_CFA_offset, + // DW_CFA_offset_extended, and DW_CFA_offset_extended_sf.) + bool DoOffset(unsigned reg, long offset); + + // Specify that the caller's value for REG is the CFA plus OFFSET, + // and return true. On failure, report and return false. (Subroutine + // for DW_CFA_val_offset and DW_CFA_val_offset_sf.) + bool DoValOffset(unsigned reg, long offset); + + // Restore REG to the rule established in the CIE, and return true. On + // failure, report and return false. (Subroutine for DW_CFA_restore and + // DW_CFA_restore_extended.) + bool DoRestore(unsigned reg); + + // Return the section offset of the instruction at cursor. For use + // in error messages. + uint64_t CursorOffset() { return entry_->offset + (cursor_ - entry_->start); } + + // Report that entry_ is incomplete, and return false. For brevity. + bool ReportIncomplete() { + reporter_->Incomplete(entry_->offset, entry_->kind); + return false; + } + + // For reading multi-byte values with the appropriate endianness. + ByteReader* reader_; + + // The handler to which we should report the data we find. + Handler* handler_; + + // For reporting problems in the info we're parsing. + Reporter* reporter_; + + // The code address to which the next instruction in the stream applies. + uint64_t address_; + + // The entry whose instructions we are currently processing. This is + // first a CIE, and then an FDE. + const Entry* entry_; + + // The next instruction to process. + const uint8_t* cursor_; + + // The current set of rules. + RuleMap rules_; + + // The set of rules established by the CIE, used by DW_CFA_restore + // and DW_CFA_restore_extended. We set this after interpreting the + // CIE's instructions. + RuleMap cie_rules_; + + // A stack of saved states, for DW_CFA_remember_state and + // DW_CFA_restore_state. + std::stack saved_rules_; +}; + +bool CallFrameInfo::State::InterpretCIE(const CIE& cie) { + entry_ = &cie; + cursor_ = entry_->instructions; + while (cursor_ < entry_->end) + if (!DoInstruction()) + return false; + // Note the rules established by the CIE, for use by DW_CFA_restore + // and DW_CFA_restore_extended. + cie_rules_ = rules_; + return true; +} + +bool CallFrameInfo::State::InterpretFDE(const FDE& fde) { + entry_ = &fde; + cursor_ = entry_->instructions; + while (cursor_ < entry_->end) + if (!DoInstruction()) + return false; + return true; +} + +bool CallFrameInfo::State::ParseOperands(const char* format, + Operands* operands) { + size_t len; + const char* operand; + + for (operand = format; *operand; operand++) { + size_t bytes_left = entry_->end - cursor_; + switch (*operand) { + case 'r': + operands->register_number = reader_->ReadUnsignedLEB128(cursor_, &len); + if (len > bytes_left) return ReportIncomplete(); + cursor_ += len; + break; + + case 'o': + operands->offset = reader_->ReadUnsignedLEB128(cursor_, &len); + if (len > bytes_left) return ReportIncomplete(); + cursor_ += len; + break; + + case 's': + operands->signed_offset = reader_->ReadSignedLEB128(cursor_, &len); + if (len > bytes_left) return ReportIncomplete(); + cursor_ += len; + break; + + case 'a': + operands->offset = + reader_->ReadEncodedPointer(cursor_, entry_->cie->pointer_encoding, + &len); + if (len > bytes_left) return ReportIncomplete(); + cursor_ += len; + break; + + case '1': + if (1 > bytes_left) return ReportIncomplete(); + operands->offset = static_cast(*cursor_++); + break; + + case '2': + if (2 > bytes_left) return ReportIncomplete(); + operands->offset = reader_->ReadTwoBytes(cursor_); + cursor_ += 2; + break; + + case '4': + if (4 > bytes_left) return ReportIncomplete(); + operands->offset = reader_->ReadFourBytes(cursor_); + cursor_ += 4; + break; + + case '8': + if (8 > bytes_left) return ReportIncomplete(); + operands->offset = reader_->ReadEightBytes(cursor_); + cursor_ += 8; + break; + + case 'e': { + size_t expression_length = reader_->ReadUnsignedLEB128(cursor_, &len); + if (len > bytes_left || expression_length > bytes_left - len) + return ReportIncomplete(); + cursor_ += len; + operands->expression = string(reinterpret_cast(cursor_), + expression_length); + cursor_ += expression_length; + break; + } + + default: + assert(0); + } + } + + return true; +} + +bool CallFrameInfo::State::DoInstruction() { + CIE* cie = entry_->cie; + Operands ops; + + // Our entry's kind should have been set by now. + assert(entry_->kind != kUnknown); + + // We shouldn't have been invoked unless there were more + // instructions to parse. + assert(cursor_ < entry_->end); + + unsigned opcode = *cursor_++; + if ((opcode & 0xc0) != 0) { + switch (opcode & 0xc0) { + // Advance the address. + case DW_CFA_advance_loc: { + size_t code_offset = opcode & 0x3f; + address_ += code_offset * cie->code_alignment_factor; + break; + } + + // Find a register at an offset from the CFA. + case DW_CFA_offset: + if (!ParseOperands("o", &ops) || + !DoOffset(opcode & 0x3f, ops.offset * cie->data_alignment_factor)) + return false; + break; + + // Restore the rule established for a register by the CIE. + case DW_CFA_restore: + if (!DoRestore(opcode & 0x3f)) return false; + break; + + // The 'if' above should have excluded this possibility. + default: + assert(0); + } + + // Return here, so the big switch below won't be indented. + return true; + } + + switch (opcode) { + // Set the address. + case DW_CFA_set_loc: + if (!ParseOperands("a", &ops)) return false; + address_ = ops.offset; + break; + + // Advance the address. + case DW_CFA_advance_loc1: + if (!ParseOperands("1", &ops)) return false; + address_ += ops.offset * cie->code_alignment_factor; + break; + + // Advance the address. + case DW_CFA_advance_loc2: + if (!ParseOperands("2", &ops)) return false; + address_ += ops.offset * cie->code_alignment_factor; + break; + + // Advance the address. + case DW_CFA_advance_loc4: + if (!ParseOperands("4", &ops)) return false; + address_ += ops.offset * cie->code_alignment_factor; + break; + + // Advance the address. + case DW_CFA_MIPS_advance_loc8: + if (!ParseOperands("8", &ops)) return false; + address_ += ops.offset * cie->code_alignment_factor; + break; + + // Compute the CFA by adding an offset to a register. + case DW_CFA_def_cfa: + if (!ParseOperands("ro", &ops) || + !DoDefCFA(ops.register_number, ops.offset)) + return false; + break; + + // Compute the CFA by adding an offset to a register. + case DW_CFA_def_cfa_sf: + if (!ParseOperands("rs", &ops) || + !DoDefCFA(ops.register_number, + ops.signed_offset * cie->data_alignment_factor)) + return false; + break; + + // Change the base register used to compute the CFA. + case DW_CFA_def_cfa_register: { + if (!ParseOperands("r", &ops)) return false; + Rule* cfa_rule = rules_.CFARule(); + if (!cfa_rule) { + if (!DoDefCFA(ops.register_number, ops.offset)) { + reporter_->NoCFARule(entry_->offset, entry_->kind, CursorOffset()); + return false; + } + } else { + cfa_rule->SetBaseRegister(ops.register_number); + if (!cfa_rule->Handle(handler_, address_, + Handler::kCFARegister)) + return false; + } + break; + } + + // Change the offset used to compute the CFA. + case DW_CFA_def_cfa_offset: + if (!ParseOperands("o", &ops) || + !DoDefCFAOffset(ops.offset)) + return false; + break; + + // Change the offset used to compute the CFA. + case DW_CFA_def_cfa_offset_sf: + if (!ParseOperands("s", &ops) || + !DoDefCFAOffset(ops.signed_offset * cie->data_alignment_factor)) + return false; + break; + + // Specify an expression whose value is the CFA. + case DW_CFA_def_cfa_expression: { + if (!ParseOperands("e", &ops)) + return false; + Rule* rule = new ValExpressionRule(ops.expression); + rules_.SetCFARule(rule); + if (!rule->Handle(handler_, address_, + Handler::kCFARegister)) + return false; + break; + } + + // The register's value cannot be recovered. + case DW_CFA_undefined: { + if (!ParseOperands("r", &ops) || + !DoRule(ops.register_number, new UndefinedRule())) + return false; + break; + } + + // The register's value is unchanged from its value in the caller. + case DW_CFA_same_value: { + if (!ParseOperands("r", &ops) || + !DoRule(ops.register_number, new SameValueRule())) + return false; + break; + } + + // Find a register at an offset from the CFA. + case DW_CFA_offset_extended: + if (!ParseOperands("ro", &ops) || + !DoOffset(ops.register_number, + ops.offset * cie->data_alignment_factor)) + return false; + break; + + // The register is saved at an offset from the CFA. + case DW_CFA_offset_extended_sf: + if (!ParseOperands("rs", &ops) || + !DoOffset(ops.register_number, + ops.signed_offset * cie->data_alignment_factor)) + return false; + break; + + // The register is saved at an offset from the CFA. + case DW_CFA_GNU_negative_offset_extended: + if (!ParseOperands("ro", &ops) || + !DoOffset(ops.register_number, + -ops.offset * cie->data_alignment_factor)) + return false; + break; + + // The register's value is the sum of the CFA plus an offset. + case DW_CFA_val_offset: + if (!ParseOperands("ro", &ops) || + !DoValOffset(ops.register_number, + ops.offset * cie->data_alignment_factor)) + return false; + break; + + // The register's value is the sum of the CFA plus an offset. + case DW_CFA_val_offset_sf: + if (!ParseOperands("rs", &ops) || + !DoValOffset(ops.register_number, + ops.signed_offset * cie->data_alignment_factor)) + return false; + break; + + // The register has been saved in another register. + case DW_CFA_register: { + if (!ParseOperands("ro", &ops) || + !DoRule(ops.register_number, new RegisterRule(ops.offset))) + return false; + break; + } + + // An expression yields the address at which the register is saved. + case DW_CFA_expression: { + if (!ParseOperands("re", &ops) || + !DoRule(ops.register_number, new ExpressionRule(ops.expression))) + return false; + break; + } + + // An expression yields the caller's value for the register. + case DW_CFA_val_expression: { + if (!ParseOperands("re", &ops) || + !DoRule(ops.register_number, new ValExpressionRule(ops.expression))) + return false; + break; + } + + // Restore the rule established for a register by the CIE. + case DW_CFA_restore_extended: + if (!ParseOperands("r", &ops) || + !DoRestore( ops.register_number)) + return false; + break; + + // Save the current set of rules on a stack. + case DW_CFA_remember_state: + saved_rules_.push(rules_); + break; + + // Pop the current set of rules off the stack. + case DW_CFA_restore_state: { + if (saved_rules_.empty()) { + reporter_->EmptyStateStack(entry_->offset, entry_->kind, + CursorOffset()); + return false; + } + const RuleMap& new_rules = saved_rules_.top(); + if (rules_.CFARule() && !new_rules.CFARule()) { + reporter_->ClearingCFARule(entry_->offset, entry_->kind, + CursorOffset()); + return false; + } + rules_.HandleTransitionTo(handler_, address_, new_rules); + rules_ = new_rules; + saved_rules_.pop(); + break; + } + + // No operation. (Padding instruction.) + case DW_CFA_nop: + break; + + // case DW_CFA_AARCH64_negate_ra_state + case DW_CFA_GNU_window_save: { + if (handler_->Architecture() == "arm64") { + // Indicates that the return address, x30 has been signed. + // Breakpad will speculatively remove pointer-authentication codes when + // interpreting return addresses, regardless of this bit. + } else if (handler_->Architecture() == "sparc" || + handler_->Architecture() == "sparcv9") { + // A SPARC register window save: Registers 8 through 15 (%o0-%o7) + // are saved in registers 24 through 31 (%i0-%i7), and registers + // 16 through 31 (%l0-%l7 and %i0-%i7) are saved at CFA offsets + // (0-15 * the register size). The register numbers must be + // hard-coded. A GNU extension, and not a pretty one. + + // Save %o0-%o7 in %i0-%i7. + for (int i = 8; i < 16; i++) + if (!DoRule(i, new RegisterRule(i + 16))) + return false; + // Save %l0-%l7 and %i0-%i7 at the CFA. + for (int i = 16; i < 32; i++) + // Assume that the byte reader's address size is the same as + // the architecture's register size. !@#%*^ hilarious. + if (!DoRule(i, new OffsetRule(Handler::kCFARegister, + (i - 16) * reader_->AddressSize()))) + return false; + } + break; + } + + // I'm not sure what this is. GDB doesn't use it for unwinding. + case DW_CFA_GNU_args_size: + if (!ParseOperands("o", &ops)) return false; + break; + + // An opcode we don't recognize. + default: { + reporter_->BadInstruction(entry_->offset, entry_->kind, CursorOffset()); + return false; + } + } + + return true; +} + +bool CallFrameInfo::State::DoDefCFA(unsigned base_register, long offset) { + Rule* rule = new ValOffsetRule(base_register, offset); + rules_.SetCFARule(rule); + return rule->Handle(handler_, address_, + Handler::kCFARegister); +} + +bool CallFrameInfo::State::DoDefCFAOffset(long offset) { + Rule* cfa_rule = rules_.CFARule(); + if (!cfa_rule) { + reporter_->NoCFARule(entry_->offset, entry_->kind, CursorOffset()); + return false; + } + cfa_rule->SetOffset(offset); + return cfa_rule->Handle(handler_, address_, + Handler::kCFARegister); +} + +bool CallFrameInfo::State::DoRule(unsigned reg, Rule* rule) { + rules_.SetRegisterRule(reg, rule); + return rule->Handle(handler_, address_, reg); +} + +bool CallFrameInfo::State::DoOffset(unsigned reg, long offset) { + if (!rules_.CFARule()) { + reporter_->NoCFARule(entry_->offset, entry_->kind, CursorOffset()); + return false; + } + return DoRule(reg, + new OffsetRule(Handler::kCFARegister, offset)); +} + +bool CallFrameInfo::State::DoValOffset(unsigned reg, long offset) { + if (!rules_.CFARule()) { + reporter_->NoCFARule(entry_->offset, entry_->kind, CursorOffset()); + return false; + } + return DoRule(reg, + new ValOffsetRule(Handler::kCFARegister, offset)); +} + +bool CallFrameInfo::State::DoRestore(unsigned reg) { + // DW_CFA_restore and DW_CFA_restore_extended don't make sense in a CIE. + if (entry_->kind == kCIE) { + reporter_->RestoreInCIE(entry_->offset, CursorOffset()); + return false; + } + Rule* rule = cie_rules_.RegisterRule(reg); + if (!rule) { + // This isn't really the right thing to do, but since CFI generally + // only mentions callee-saves registers, and GCC's convention for + // callee-saves registers is that they are unchanged, it's a good + // approximation. + rule = new SameValueRule(); + } + return DoRule(reg, rule); +} + +bool CallFrameInfo::ReadEntryPrologue(const uint8_t* cursor, Entry* entry) { + const uint8_t* buffer_end = buffer_ + buffer_length_; + + // Initialize enough of ENTRY for use in error reporting. + entry->offset = cursor - buffer_; + entry->start = cursor; + entry->kind = kUnknown; + entry->end = NULL; + + // Read the initial length. This sets reader_'s offset size. + size_t length_size; + uint64_t length = reader_->ReadInitialLength(cursor, &length_size); + if (length_size > size_t(buffer_end - cursor)) + return ReportIncomplete(entry); + cursor += length_size; + + // In a .eh_frame section, a length of zero marks the end of the series + // of entries. + if (length == 0 && eh_frame_) { + entry->kind = kTerminator; + entry->end = cursor; + return true; + } + + // Validate the length. + if (length > size_t(buffer_end - cursor)) + return ReportIncomplete(entry); + + // The length is the number of bytes after the initial length field; + // we have that position handy at this point, so compute the end + // now. (If we're parsing 64-bit-offset DWARF on a 32-bit machine, + // and the length didn't fit in a size_t, we would have rejected it + // above.) + entry->end = cursor + length; + + // Parse the next field: either the offset of a CIE or a CIE id. + size_t offset_size = reader_->OffsetSize(); + if (offset_size > size_t(entry->end - cursor)) return ReportIncomplete(entry); + entry->id = reader_->ReadOffset(cursor); + + // Don't advance cursor past id field yet; in .eh_frame data we need + // the id's position to compute the section offset of an FDE's CIE. + + // Now we can decide what kind of entry this is. + if (eh_frame_) { + // In .eh_frame data, an ID of zero marks the entry as a CIE, and + // anything else is an offset from the id field of the FDE to the start + // of the CIE. + if (entry->id == 0) { + entry->kind = kCIE; + } else { + entry->kind = kFDE; + // Turn the offset from the id into an offset from the buffer's start. + entry->id = (cursor - buffer_) - entry->id; + } + } else { + // In DWARF CFI data, an ID of ~0 (of the appropriate width, given the + // offset size for the entry) marks the entry as a CIE, and anything + // else is the offset of the CIE from the beginning of the section. + if (offset_size == 4) + entry->kind = (entry->id == 0xffffffff) ? kCIE : kFDE; + else { + assert(offset_size == 8); + entry->kind = (entry->id == 0xffffffffffffffffULL) ? kCIE : kFDE; + } + } + + // Now advance cursor past the id. + cursor += offset_size; + + // The fields specific to this kind of entry start here. + entry->fields = cursor; + + entry->cie = NULL; + + return true; +} + +bool CallFrameInfo::ReadCIEFields(CIE* cie) { + const uint8_t* cursor = cie->fields; + size_t len; + + assert(cie->kind == kCIE); + + // Prepare for early exit. + cie->version = 0; + cie->augmentation.clear(); + cie->code_alignment_factor = 0; + cie->data_alignment_factor = 0; + cie->return_address_register = 0; + cie->has_z_augmentation = false; + cie->pointer_encoding = DW_EH_PE_absptr; + cie->instructions = 0; + + // Parse the version number. + if (cie->end - cursor < 1) + return ReportIncomplete(cie); + cie->version = reader_->ReadOneByte(cursor); + cursor++; + + // If we don't recognize the version, we can't parse any more fields of the + // CIE. For DWARF CFI, we handle versions 1 through 4 (there was never a + // version 2 of CFI data). For .eh_frame, we handle versions 1 and 4 as well; + // the difference between those versions seems to be the same as for + // .debug_frame. + if (cie->version < 1 || cie->version > 4) { + reporter_->UnrecognizedVersion(cie->offset, cie->version); + return false; + } + + const uint8_t* augmentation_start = cursor; + const uint8_t* augmentation_end = + reinterpret_cast(memchr(augmentation_start, '\0', + cie->end - augmentation_start)); + if (! augmentation_end) return ReportIncomplete(cie); + cursor = augmentation_end; + cie->augmentation = string(reinterpret_cast(augmentation_start), + cursor - augmentation_start); + // Skip the terminating '\0'. + cursor++; + + // Is this CFI augmented? + if (!cie->augmentation.empty()) { + // Is it an augmentation we recognize? + if (cie->augmentation[0] == DW_Z_augmentation_start) { + // Linux C++ ABI 'z' augmentation, used for exception handling data. + cie->has_z_augmentation = true; + } else { + // Not an augmentation we recognize. Augmentations can have arbitrary + // effects on the form of rest of the content, so we have to give up. + reporter_->UnrecognizedAugmentation(cie->offset, cie->augmentation); + return false; + } + } + + if (cie->version >= 4) { + cie->address_size = *cursor++; + if (cie->address_size != 8 && cie->address_size != 4) { + reporter_->UnexpectedAddressSize(cie->offset, cie->address_size); + return false; + } + + cie->segment_size = *cursor++; + if (cie->segment_size != 0) { + reporter_->UnexpectedSegmentSize(cie->offset, cie->segment_size); + return false; + } + } + + // Parse the code alignment factor. + cie->code_alignment_factor = reader_->ReadUnsignedLEB128(cursor, &len); + if (size_t(cie->end - cursor) < len) return ReportIncomplete(cie); + cursor += len; + + // Parse the data alignment factor. + cie->data_alignment_factor = reader_->ReadSignedLEB128(cursor, &len); + if (size_t(cie->end - cursor) < len) return ReportIncomplete(cie); + cursor += len; + + // Parse the return address register. This is a ubyte in version 1, and + // a ULEB128 in version 3. + if (cie->version == 1) { + if (cursor >= cie->end) return ReportIncomplete(cie); + cie->return_address_register = uint8_t(*cursor++); + } else { + cie->return_address_register = reader_->ReadUnsignedLEB128(cursor, &len); + if (size_t(cie->end - cursor) < len) return ReportIncomplete(cie); + cursor += len; + } + + // If we have a 'z' augmentation string, find the augmentation data and + // use the augmentation string to parse it. + if (cie->has_z_augmentation) { + uint64_t data_size = reader_->ReadUnsignedLEB128(cursor, &len); + if (size_t(cie->end - cursor) < len + data_size) + return ReportIncomplete(cie); + cursor += len; + const uint8_t* data = cursor; + cursor += data_size; + const uint8_t* data_end = cursor; + + cie->has_z_lsda = false; + cie->has_z_personality = false; + cie->has_z_signal_frame = false; + + // Walk the augmentation string, and extract values from the + // augmentation data as the string directs. + for (size_t i = 1; i < cie->augmentation.size(); i++) { + switch (cie->augmentation[i]) { + case DW_Z_has_LSDA: + // The CIE's augmentation data holds the language-specific data + // area pointer's encoding, and the FDE's augmentation data holds + // the pointer itself. + cie->has_z_lsda = true; + // Fetch the LSDA encoding from the augmentation data. + if (data >= data_end) return ReportIncomplete(cie); + cie->lsda_encoding = DwarfPointerEncoding(*data++); + if (!reader_->ValidEncoding(cie->lsda_encoding)) { + reporter_->InvalidPointerEncoding(cie->offset, cie->lsda_encoding); + return false; + } + // Don't check if the encoding is usable here --- we haven't + // read the FDE's fields yet, so we're not prepared for + // DW_EH_PE_funcrel, although that's a fine encoding for the + // LSDA to use, since it appears in the FDE. + break; + + case DW_Z_has_personality_routine: + // The CIE's augmentation data holds the personality routine + // pointer's encoding, followed by the pointer itself. + cie->has_z_personality = true; + // Fetch the personality routine pointer's encoding from the + // augmentation data. + if (data >= data_end) return ReportIncomplete(cie); + cie->personality_encoding = DwarfPointerEncoding(*data++); + if (!reader_->ValidEncoding(cie->personality_encoding)) { + reporter_->InvalidPointerEncoding(cie->offset, + cie->personality_encoding); + return false; + } + if (!reader_->UsableEncoding(cie->personality_encoding)) { + reporter_->UnusablePointerEncoding(cie->offset, + cie->personality_encoding); + return false; + } + // Fetch the personality routine's pointer itself from the data. + cie->personality_address = + reader_->ReadEncodedPointer(data, cie->personality_encoding, + &len); + if (len > size_t(data_end - data)) + return ReportIncomplete(cie); + data += len; + break; + + case DW_Z_has_FDE_address_encoding: + // The CIE's augmentation data holds the pointer encoding to use + // for addresses in the FDE. + if (data >= data_end) return ReportIncomplete(cie); + cie->pointer_encoding = DwarfPointerEncoding(*data++); + if (!reader_->ValidEncoding(cie->pointer_encoding)) { + reporter_->InvalidPointerEncoding(cie->offset, + cie->pointer_encoding); + return false; + } + if (!reader_->UsableEncoding(cie->pointer_encoding)) { + reporter_->UnusablePointerEncoding(cie->offset, + cie->pointer_encoding); + return false; + } + break; + + case DW_Z_is_signal_trampoline: + // Frames using this CIE are signal delivery frames. + cie->has_z_signal_frame = true; + break; + + default: + // An augmentation we don't recognize. + reporter_->UnrecognizedAugmentation(cie->offset, cie->augmentation); + return false; + } + } + } + + // The CIE's instructions start here. + cie->instructions = cursor; + + return true; +} + +bool CallFrameInfo::ReadFDEFields(FDE* fde) { + const uint8_t* cursor = fde->fields; + size_t size; + + fde->address = reader_->ReadEncodedPointer(cursor, fde->cie->pointer_encoding, + &size); + if (size > size_t(fde->end - cursor)) + return ReportIncomplete(fde); + cursor += size; + reader_->SetFunctionBase(fde->address); + + // For the length, we strip off the upper nybble of the encoding used for + // the starting address. + DwarfPointerEncoding length_encoding = + DwarfPointerEncoding(fde->cie->pointer_encoding & 0x0f); + fde->size = reader_->ReadEncodedPointer(cursor, length_encoding, &size); + if (size > size_t(fde->end - cursor)) + return ReportIncomplete(fde); + cursor += size; + + // If the CIE has a 'z' augmentation string, then augmentation data + // appears here. + if (fde->cie->has_z_augmentation) { + uint64_t data_size = reader_->ReadUnsignedLEB128(cursor, &size); + if (size_t(fde->end - cursor) < size + data_size) + return ReportIncomplete(fde); + cursor += size; + + // In the abstract, we should walk the augmentation string, and extract + // items from the FDE's augmentation data as we encounter augmentation + // string characters that specify their presence: the ordering of items + // in the augmentation string determines the arrangement of values in + // the augmentation data. + // + // In practice, there's only ever one value in FDE augmentation data + // that we support --- the LSDA pointer --- and we have to bail if we + // see any unrecognized augmentation string characters. So if there is + // anything here at all, we know what it is, and where it starts. + if (fde->cie->has_z_lsda) { + // Check whether the LSDA's pointer encoding is usable now: only once + // we've parsed the FDE's starting address do we call reader_-> + // SetFunctionBase, so that the DW_EH_PE_funcrel encoding becomes + // usable. + if (!reader_->UsableEncoding(fde->cie->lsda_encoding)) { + reporter_->UnusablePointerEncoding(fde->cie->offset, + fde->cie->lsda_encoding); + return false; + } + + fde->lsda_address = + reader_->ReadEncodedPointer(cursor, fde->cie->lsda_encoding, &size); + if (size > data_size) + return ReportIncomplete(fde); + // Ideally, we would also complain here if there were unconsumed + // augmentation data. + } + + cursor += data_size; + } + + // The FDE's instructions start after those. + fde->instructions = cursor; + + return true; +} + +bool CallFrameInfo::Start() { + const uint8_t* buffer_end = buffer_ + buffer_length_; + const uint8_t* cursor; + bool all_ok = true; + const uint8_t* entry_end; + bool ok; + + // Traverse all the entries in buffer_, skipping CIEs and offering + // FDEs to the handler. + for (cursor = buffer_; cursor < buffer_end; + cursor = entry_end, all_ok = all_ok && ok) { + FDE fde; + + // Make it easy to skip this entry with 'continue': assume that + // things are not okay until we've checked all the data, and + // prepare the address of the next entry. + ok = false; + + // Read the entry's prologue. + if (!ReadEntryPrologue(cursor, &fde)) { + if (!fde.end) { + // If we couldn't even figure out this entry's extent, then we + // must stop processing entries altogether. + all_ok = false; + break; + } + entry_end = fde.end; + continue; + } + + // The next iteration picks up after this entry. + entry_end = fde.end; + + // Did we see an .eh_frame terminating mark? + if (fde.kind == kTerminator) { + // If there appears to be more data left in the section after the + // terminating mark, warn the user. But this is just a warning; + // we leave all_ok true. + if (fde.end < buffer_end) reporter_->EarlyEHTerminator(fde.offset); + break; + } + + // In this loop, we skip CIEs. We only parse them fully when we + // parse an FDE that refers to them. This limits our memory + // consumption (beyond the buffer itself) to that needed to + // process the largest single entry. + if (fde.kind != kFDE) { + ok = true; + continue; + } + + // Validate the CIE pointer. + if (fde.id > buffer_length_) { + reporter_->CIEPointerOutOfRange(fde.offset, fde.id); + continue; + } + + CIE cie; + + // Parse this FDE's CIE header. + if (!ReadEntryPrologue(buffer_ + fde.id, &cie)) + continue; + // This had better be an actual CIE. + if (cie.kind != kCIE) { + reporter_->BadCIEId(fde.offset, fde.id); + continue; + } + if (!ReadCIEFields(&cie)) + continue; + + // TODO(nbilling): This could lead to strange behavior if a single buffer + // contained a mixture of DWARF versions as well as address sizes. Not + // sure if it's worth handling such a case. + + // DWARF4 CIE specifies address_size, so use it for this call frame. + if (cie.version >= 4) { + reader_->SetAddressSize(cie.address_size); + } + + // We now have the values that govern both the CIE and the FDE. + cie.cie = &cie; + fde.cie = &cie; + + // Parse the FDE's header. + if (!ReadFDEFields(&fde)) + continue; + + // Call Entry to ask the consumer if they're interested. + if (!handler_->Entry(fde.offset, fde.address, fde.size, + cie.version, cie.augmentation, + cie.return_address_register)) { + // The handler isn't interested in this entry. That's not an error. + ok = true; + continue; + } + + if (cie.has_z_augmentation) { + // Report the personality routine address, if we have one. + if (cie.has_z_personality) { + if (!handler_ + ->PersonalityRoutine(cie.personality_address, + IsIndirectEncoding(cie.personality_encoding))) + continue; + } + + // Report the language-specific data area address, if we have one. + if (cie.has_z_lsda) { + if (!handler_ + ->LanguageSpecificDataArea(fde.lsda_address, + IsIndirectEncoding(cie.lsda_encoding))) + continue; + } + + // If this is a signal-handling frame, report that. + if (cie.has_z_signal_frame) { + if (!handler_->SignalHandler()) + continue; + } + } + + // Interpret the CIE's instructions, and then the FDE's instructions. + State state(reader_, handler_, reporter_, fde.address); + ok = state.InterpretCIE(cie) && state.InterpretFDE(fde); + + // Tell the ByteReader that the function start address from the + // FDE header is no longer valid. + reader_->ClearFunctionBase(); + + // Report the end of the entry. + handler_->End(); + } + + return all_ok; +} + +const char* CallFrameInfo::KindName(EntryKind kind) { + if (kind == CallFrameInfo::kUnknown) + return "entry"; + else if (kind == CallFrameInfo::kCIE) + return "common information entry"; + else if (kind == CallFrameInfo::kFDE) + return "frame description entry"; + else { + assert (kind == CallFrameInfo::kTerminator); + return ".eh_frame sequence terminator"; + } +} + +bool CallFrameInfo::ReportIncomplete(Entry* entry) { + reporter_->Incomplete(entry->offset, entry->kind); + return false; +} + +void CallFrameInfo::Reporter::Incomplete(uint64_t offset, + CallFrameInfo::EntryKind kind) { + fprintf(stderr, + "%s: CFI %s at offset 0x%" PRIx64 " in '%s': entry ends early\n", + filename_.c_str(), CallFrameInfo::KindName(kind), offset, + section_.c_str()); +} + +void CallFrameInfo::Reporter::EarlyEHTerminator(uint64_t offset) { + fprintf(stderr, + "%s: CFI at offset 0x%" PRIx64 " in '%s': saw end-of-data marker" + " before end of section contents\n", + filename_.c_str(), offset, section_.c_str()); +} + +void CallFrameInfo::Reporter::CIEPointerOutOfRange(uint64_t offset, + uint64_t cie_offset) { + fprintf(stderr, + "%s: CFI frame description entry at offset 0x%" PRIx64 " in '%s':" + " CIE pointer is out of range: 0x%" PRIx64 "\n", + filename_.c_str(), offset, section_.c_str(), cie_offset); +} + +void CallFrameInfo::Reporter::BadCIEId(uint64_t offset, uint64_t cie_offset) { + fprintf(stderr, + "%s: CFI frame description entry at offset 0x%" PRIx64 " in '%s':" + " CIE pointer does not point to a CIE: 0x%" PRIx64 "\n", + filename_.c_str(), offset, section_.c_str(), cie_offset); +} + +void CallFrameInfo::Reporter::UnexpectedAddressSize(uint64_t offset, + uint8_t address_size) { + fprintf(stderr, + "%s: CFI frame description entry at offset 0x%" PRIx64 " in '%s':" + " CIE specifies unexpected address size: %d\n", + filename_.c_str(), offset, section_.c_str(), address_size); +} + +void CallFrameInfo::Reporter::UnexpectedSegmentSize(uint64_t offset, + uint8_t segment_size) { + fprintf(stderr, + "%s: CFI frame description entry at offset 0x%" PRIx64 " in '%s':" + " CIE specifies unexpected segment size: %d\n", + filename_.c_str(), offset, section_.c_str(), segment_size); +} + +void CallFrameInfo::Reporter::UnrecognizedVersion(uint64_t offset, int version) { + fprintf(stderr, + "%s: CFI frame description entry at offset 0x%" PRIx64 " in '%s':" + " CIE specifies unrecognized version: %d\n", + filename_.c_str(), offset, section_.c_str(), version); +} + +void CallFrameInfo::Reporter::UnrecognizedAugmentation(uint64_t offset, + const string& aug) { + fprintf(stderr, + "%s: CFI frame description entry at offset 0x%" PRIx64 " in '%s':" + " CIE specifies unrecognized augmentation: '%s'\n", + filename_.c_str(), offset, section_.c_str(), aug.c_str()); +} + +void CallFrameInfo::Reporter::InvalidPointerEncoding(uint64_t offset, + uint8_t encoding) { + fprintf(stderr, + "%s: CFI common information entry at offset 0x%" PRIx64 " in '%s':" + " 'z' augmentation specifies invalid pointer encoding: 0x%02x\n", + filename_.c_str(), offset, section_.c_str(), encoding); +} + +void CallFrameInfo::Reporter::UnusablePointerEncoding(uint64_t offset, + uint8_t encoding) { + fprintf(stderr, + "%s: CFI common information entry at offset 0x%" PRIx64 " in '%s':" + " 'z' augmentation specifies a pointer encoding for which" + " we have no base address: 0x%02x\n", + filename_.c_str(), offset, section_.c_str(), encoding); +} + +void CallFrameInfo::Reporter::RestoreInCIE(uint64_t offset, uint64_t insn_offset) { + fprintf(stderr, + "%s: CFI common information entry at offset 0x%" PRIx64 " in '%s':" + " the DW_CFA_restore instruction at offset 0x%" PRIx64 + " cannot be used in a common information entry\n", + filename_.c_str(), offset, section_.c_str(), insn_offset); +} + +void CallFrameInfo::Reporter::BadInstruction(uint64_t offset, + CallFrameInfo::EntryKind kind, + uint64_t insn_offset) { + fprintf(stderr, + "%s: CFI %s at offset 0x%" PRIx64 " in section '%s':" + " the instruction at offset 0x%" PRIx64 " is unrecognized\n", + filename_.c_str(), CallFrameInfo::KindName(kind), + offset, section_.c_str(), insn_offset); +} + +void CallFrameInfo::Reporter::NoCFARule(uint64_t offset, + CallFrameInfo::EntryKind kind, + uint64_t insn_offset) { + fprintf(stderr, + "%s: CFI %s at offset 0x%" PRIx64 " in section '%s':" + " the instruction at offset 0x%" PRIx64 " assumes that a CFA rule has" + " been set, but none has been set\n", + filename_.c_str(), CallFrameInfo::KindName(kind), offset, + section_.c_str(), insn_offset); +} + +void CallFrameInfo::Reporter::EmptyStateStack(uint64_t offset, + CallFrameInfo::EntryKind kind, + uint64_t insn_offset) { + fprintf(stderr, + "%s: CFI %s at offset 0x%" PRIx64 " in section '%s':" + " the DW_CFA_restore_state instruction at offset 0x%" PRIx64 + " should pop a saved state from the stack, but the stack is empty\n", + filename_.c_str(), CallFrameInfo::KindName(kind), offset, + section_.c_str(), insn_offset); +} + +void CallFrameInfo::Reporter::ClearingCFARule(uint64_t offset, + CallFrameInfo::EntryKind kind, + uint64_t insn_offset) { + fprintf(stderr, + "%s: CFI %s at offset 0x%" PRIx64 " in section '%s':" + " the DW_CFA_restore_state instruction at offset 0x%" PRIx64 + " would clear the CFA rule in effect\n", + filename_.c_str(), CallFrameInfo::KindName(kind), offset, + section_.c_str(), insn_offset); +} + +} // namespace google_breakpad diff --git a/src/common/dwarf/dwarf2reader.h b/src/common/dwarf/dwarf2reader.h new file mode 100644 index 0000000..b6bd2f3 --- /dev/null +++ b/src/common/dwarf/dwarf2reader.h @@ -0,0 +1,1527 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// CFI reader author: Jim Blandy + +// This file contains definitions related to the DWARF2/3 reader and +// it's handler interfaces. +// The DWARF2/3 specification can be found at +// http://dwarf.freestandards.org and should be considered required +// reading if you wish to modify the implementation. +// Only a cursory attempt is made to explain terminology that is +// used here, as it is much better explained in the standard documents +#ifndef COMMON_DWARF_DWARF2READER_H__ +#define COMMON_DWARF_DWARF2READER_H__ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "common/dwarf/bytereader.h" +#include "common/dwarf/dwarf2enums.h" +#include "common/dwarf/types.h" +#include "common/using_std_string.h" +#include "common/dwarf/elf_reader.h" + +namespace google_breakpad { +struct LineStateMachine; +class Dwarf2Handler; +class LineInfoHandler; +class DwpReader; + +// This maps from a string naming a section to a pair containing a +// the data for the section, and the size of the section. +typedef std::map > SectionMap; + +// Abstract away the difference between elf and mach-o section names. +// Elf-names use ".section_name, mach-o uses "__section_name". Pass "name" in +// the elf form, ".section_name". +const SectionMap::const_iterator GetSectionByName(const SectionMap& + sections, const char* name); + +// Most of the time, this struct functions as a simple attribute and form pair. +// However, Dwarf5 DW_FORM_implicit_const means that a form may have its value +// in line in the abbrev table, and that value must be associated with the +// pair until the attr's value is needed. +struct AttrForm { + AttrForm(enum DwarfAttribute attr, enum DwarfForm form, uint64_t value) : + attr_(attr), form_(form), value_(value) { } + + enum DwarfAttribute attr_; + enum DwarfForm form_; + uint64_t value_; +}; +typedef std::list AttributeList; +typedef AttributeList::iterator AttributeIterator; +typedef AttributeList::const_iterator ConstAttributeIterator; + +struct LineInfoHeader { + uint64_t total_length; + uint16_t version; + uint64_t prologue_length; + uint8_t min_insn_length; // insn stands for instructin + bool default_is_stmt; // stmt stands for statement + int8_t line_base; + uint8_t line_range; + uint8_t opcode_base; + // Use a pointer so that signalsafe_addr2line is able to use this structure + // without heap allocation problem. + std::vector* std_opcode_lengths; +}; + +class LineInfo { + public: + + // Initializes a .debug_line reader. Buffer and buffer length point + // to the beginning and length of the line information to read. + // Reader is a ByteReader class that has the endianness set + // properly. + LineInfo(const uint8_t* buffer, uint64_t buffer_length, + ByteReader* reader, const uint8_t* string_buffer, + size_t string_buffer_length, const uint8_t* line_string_buffer, + size_t line_string_buffer_length, LineInfoHandler* handler); + + virtual ~LineInfo() { + if (header_.std_opcode_lengths) { + delete header_.std_opcode_lengths; + } + } + + // Start processing line info, and calling callbacks in the handler. + // Consumes the line number information for a single compilation unit. + // Returns the number of bytes processed. + uint64_t Start(); + + // Process a single line info opcode at START using the state + // machine at LSM. Return true if we should define a line using the + // current state of the line state machine. Place the length of the + // opcode in LEN. + // If LSM_PASSES_PC is non-NULL, this function also checks if the lsm + // passes the address of PC. In other words, LSM_PASSES_PC will be + // set to true, if the following condition is met. + // + // lsm's old address < PC <= lsm's new address + static bool ProcessOneOpcode(ByteReader* reader, + LineInfoHandler* handler, + const struct LineInfoHeader& header, + const uint8_t* start, + struct LineStateMachine* lsm, + size_t* len, + uintptr pc, + bool* lsm_passes_pc); + + private: + // Reads the DWARF2/3 header for this line info. + void ReadHeader(); + + // Reads the DWARF2/3 line information + void ReadLines(); + + // Read the DWARF5 types and forms for the file and directory tables. + void ReadTypesAndForms(const uint8_t** lineptr, uint32_t* content_types, + uint32_t* content_forms, uint32_t max_types, + uint32_t* format_count); + + // Read a row from the dwarf5 LineInfo file table. + void ReadFileRow(const uint8_t** lineptr, const uint32_t* content_types, + const uint32_t* content_forms, uint32_t row, + uint32_t format_count); + + // Read and return the data at *lineptr according to form. Advance + // *lineptr appropriately. + uint64_t ReadUnsignedData(uint32_t form, const uint8_t** lineptr); + + // Read and return the data at *lineptr according to form. Advance + // *lineptr appropriately. + const char* ReadStringForm(uint32_t form, const uint8_t** lineptr); + + // The associated handler to call processing functions in + LineInfoHandler* handler_; + + // The associated ByteReader that handles endianness issues for us + ByteReader* reader_; + + // A DWARF line info header. This is not the same size as in the actual file, + // as the one in the file may have a 32 bit or 64 bit lengths + + struct LineInfoHeader header_; + + // buffer is the buffer for our line info, starting at exactly where + // the line info to read is. after_header is the place right after + // the end of the line information header. + const uint8_t* buffer_; +#ifndef NDEBUG + uint64_t buffer_length_; +#endif + // Convenience pointers into .debug_str and .debug_line_str. These exactly + // correspond to those in the compilation unit. + const uint8_t* string_buffer_; +#ifndef NDEBUG + uint64_t string_buffer_length_; +#endif + const uint8_t* line_string_buffer_; +#ifndef NDEBUG + uint64_t line_string_buffer_length_; +#endif + + const uint8_t* after_header_; +}; + +// This class is the main interface between the line info reader and +// the client. The virtual functions inside this get called for +// interesting events that happen during line info reading. The +// default implementation does nothing + +class LineInfoHandler { + public: + LineInfoHandler() { } + + virtual ~LineInfoHandler() { } + + // Called when we define a directory. NAME is the directory name, + // DIR_NUM is the directory number + virtual void DefineDir(const string& name, uint32_t dir_num) { } + + // Called when we define a filename. NAME is the filename, FILE_NUM + // is the file number which is -1 if the file index is the next + // index after the last numbered index (this happens when files are + // dynamically defined by the line program), DIR_NUM is the + // directory index for the directory name of this file, MOD_TIME is + // the modification time of the file, and LENGTH is the length of + // the file + virtual void DefineFile(const string& name, int32_t file_num, + uint32_t dir_num, uint64_t mod_time, + uint64_t length) { } + + // Called when the line info reader has a new line, address pair + // ready for us. ADDRESS is the address of the code, LENGTH is the + // length of its machine code in bytes, FILE_NUM is the file number + // containing the code, LINE_NUM is the line number in that file for + // the code, and COLUMN_NUM is the column number the code starts at, + // if we know it (0 otherwise). + virtual void AddLine(uint64_t address, uint64_t length, + uint32_t file_num, uint32_t line_num, uint32_t column_num) { } +}; + +class RangeListHandler { + public: + RangeListHandler() { } + + virtual ~RangeListHandler() { } + + // Add a range. + virtual void AddRange(uint64_t begin, uint64_t end) { }; + + // Finish processing the range list. + virtual void Finish() { }; +}; + +class RangeListReader { + public: + // Reading a range list requires quite a bit of information + // from the compilation unit. Package it conveniently. + struct CURangesInfo { + CURangesInfo() : + version_(0), base_address_(0), ranges_base_(0), + buffer_(nullptr), size_(0), addr_buffer_(nullptr), + addr_buffer_size_(0), addr_base_(0) { } + + uint16_t version_; + // Ranges base address. Ordinarily the CU's low_pc. + uint64_t base_address_; + // Offset into .debug_rnglists for this CU's rangelists. + uint64_t ranges_base_; + // Contents of either .debug_ranges or .debug_rnglists. + const uint8_t* buffer_; + uint64_t size_; + // Contents of .debug_addr. This cu's contribution starts at + // addr_base_ + const uint8_t* addr_buffer_; + uint64_t addr_buffer_size_; + uint64_t addr_base_; + }; + + RangeListReader(ByteReader* reader, CURangesInfo* cu_info, + RangeListHandler* handler) : + reader_(reader), cu_info_(cu_info), handler_(handler), + offset_array_(0) { } + + // Read ranges from cu_info as specified by form and data. + bool ReadRanges(enum DwarfForm form, uint64_t data); + + private: + // Read dwarf4 .debug_ranges at offset. + bool ReadDebugRanges(uint64_t offset); + // Read dwarf5 .debug_rngslist at offset. + bool ReadDebugRngList(uint64_t offset); + + // Convenience functions to handle the mechanics of reading entries in the + // ranges section. + uint64_t ReadULEB(uint64_t offset, uint64_t* value) { + size_t len; + *value = reader_->ReadUnsignedLEB128(cu_info_->buffer_ + offset, &len); + return len; + } + + uint64_t ReadAddress(uint64_t offset, uint64_t* value) { + *value = reader_->ReadAddress(cu_info_->buffer_ + offset); + return reader_->AddressSize(); + } + + // Read the address at this CU's addr_index in the .debug_addr section. + uint64_t GetAddressAtIndex(uint64_t addr_index) { + assert(cu_info_->addr_buffer_ != nullptr); + uint64_t offset = + cu_info_->addr_base_ + addr_index * reader_->AddressSize(); + assert(offset < cu_info_->addr_buffer_size_); + return reader_->ReadAddress(cu_info_->addr_buffer_ + offset); + } + + ByteReader* reader_; + CURangesInfo* cu_info_; + RangeListHandler* handler_; + uint64_t offset_array_; +}; + +// This class is the main interface between the reader and the +// client. The virtual functions inside this get called for +// interesting events that happen during DWARF2 reading. +// The default implementation skips everything. +class Dwarf2Handler { + public: + Dwarf2Handler() { } + + virtual ~Dwarf2Handler() { } + + // Start to process a compilation unit at OFFSET from the beginning of the + // .debug_info section. Return false if you would like to skip this + // compilation unit. + virtual bool StartCompilationUnit(uint64_t offset, uint8_t address_size, + uint8_t offset_size, uint64_t cu_length, + uint8_t dwarf_version) { return false; } + + // When processing a skeleton compilation unit, resulting from a split + // DWARF compilation, once the skeleton debug info has been read, + // the reader will call this function to ask the client if it needs + // the full debug info from the .dwo or .dwp file. Return true if + // you need it, or false to skip processing the split debug info. + virtual bool NeedSplitDebugInfo() { return true; } + + // Start to process a split compilation unit at OFFSET from the beginning of + // the debug_info section in the .dwp/.dwo file. Return false if you would + // like to skip this compilation unit. + virtual bool StartSplitCompilationUnit(uint64_t offset, + uint64_t cu_length) { return false; } + + // Start to process a DIE at OFFSET from the beginning of the .debug_info + // section. Return false if you would like to skip this DIE. + virtual bool StartDIE(uint64_t offset, enum DwarfTag tag) { return false; } + + // Called when we have an attribute with unsigned data to give to our + // handler. The attribute is for the DIE at OFFSET from the beginning of the + // .debug_info section. Its name is ATTR, its form is FORM, and its value is + // DATA. + virtual void ProcessAttributeUnsigned(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { } + + // Called when we have an attribute with signed data to give to our handler. + // The attribute is for the DIE at OFFSET from the beginning of the + // .debug_info section. Its name is ATTR, its form is FORM, and its value is + // DATA. + virtual void ProcessAttributeSigned(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + int64_t data) { } + + // Called when we have an attribute whose value is a reference to + // another DIE. The attribute belongs to the DIE at OFFSET from the + // beginning of the .debug_info section. Its name is ATTR, its form + // is FORM, and the offset of the DIE being referred to from the + // beginning of the .debug_info section is DATA. + virtual void ProcessAttributeReference(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { } + + // Called when we have an attribute with a buffer of data to give to our + // handler. The attribute is for the DIE at OFFSET from the beginning of the + // .debug_info section. Its name is ATTR, its form is FORM, DATA points to + // the buffer's contents, and its length in bytes is LENGTH. The buffer is + // owned by the caller, not the callee, and may not persist for very long. + // If you want the data to be available later, it needs to be copied. + virtual void ProcessAttributeBuffer(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const uint8_t* data, + uint64_t len) { } + + // Called when we have an attribute with string data to give to our handler. + // The attribute is for the DIE at OFFSET from the beginning of the + // .debug_info section. Its name is ATTR, its form is FORM, and its value is + // DATA. + virtual void ProcessAttributeString(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const string& data) { } + + // Called when we have an attribute whose value is the 64-bit signature + // of a type unit in the .debug_types section. OFFSET is the offset of + // the DIE whose attribute we're reporting. ATTR and FORM are the + // attribute's name and form. SIGNATURE is the type unit's signature. + virtual void ProcessAttributeSignature(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t signature) { } + + // Called when finished processing the DIE at OFFSET. + // Because DWARF2/3 specifies a tree of DIEs, you may get starts + // before ends of the previous DIE, as we process children before + // ending the parent. + virtual void EndDIE(uint64_t offset) { } + +}; + +// The base of DWARF2/3 debug info is a DIE (Debugging Information +// Entry. +// DWARF groups DIE's into a tree and calls the root of this tree a +// "compilation unit". Most of the time, there is one compilation +// unit in the .debug_info section for each file that had debug info +// generated. +// Each DIE consists of + +// 1. a tag specifying a thing that is being described (ie +// DW_TAG_subprogram for functions, DW_TAG_variable for variables, etc +// 2. attributes (such as DW_AT_location for location in memory, +// DW_AT_name for name), and data for each attribute. +// 3. A flag saying whether the DIE has children or not + +// In order to gain some amount of compression, the format of +// each DIE (tag name, attributes and data forms for the attributes) +// are stored in a separate table called the "abbreviation table". +// This is done because a large number of DIEs have the exact same tag +// and list of attributes, but different data for those attributes. +// As a result, the .debug_info section is just a stream of data, and +// requires reading of the .debug_abbrev section to say what the data +// means. + +// As a warning to the user, it should be noted that the reason for +// using absolute offsets from the beginning of .debug_info is that +// DWARF2/3 supports referencing DIE's from other DIE's by their offset +// from either the current compilation unit start, *or* the beginning +// of the .debug_info section. This means it is possible to reference +// a DIE in one compilation unit from a DIE in another compilation +// unit. This style of reference is usually used to eliminate +// duplicated information that occurs across compilation +// units, such as base types, etc. GCC 3.4+ support this with +// -feliminate-dwarf2-dups. Other toolchains will sometimes do +// duplicate elimination in the linker. + +class CompilationUnit { + public: + + // Initialize a compilation unit. This requires a map of sections, + // the offset of this compilation unit in the .debug_info section, a + // ByteReader, and a Dwarf2Handler class to call callbacks in. + CompilationUnit(const string& path, const SectionMap& sections, + uint64_t offset, ByteReader* reader, Dwarf2Handler* handler); + virtual ~CompilationUnit() { + if (abbrevs_) delete abbrevs_; + } + + // Initialize a compilation unit from a .dwo or .dwp file. + // In this case, we need the .debug_addr section from the + // executable file that contains the corresponding skeleton + // compilation unit. We also inherit the Dwarf2Handler from + // the executable file, and call it as if we were still + // processing the original compilation unit. + void SetSplitDwarf(uint64_t addr_base, uint64_t dwo_id); + + // Begin reading a Dwarf2 compilation unit, and calling the + // callbacks in the Dwarf2Handler + + // Return the full length of the compilation unit, including + // headers. This plus the starting offset passed to the constructor + // is the offset of the end of the compilation unit --- and the + // start of the next compilation unit, if there is one. + uint64_t Start(); + + // Process the actual debug information in a split DWARF file. + bool ProcessSplitDwarf(std::string& split_file, + SectionMap& sections, + ByteReader& split_byte_reader, + uint64_t& cu_offset); + + const uint8_t* GetAddrBuffer() { return addr_buffer_; } + + uint64_t GetAddrBufferLen() { return addr_buffer_length_; } + + uint64_t GetAddrBase() { return addr_base_; } + + uint64_t GetLowPC() { return low_pc_; } + + uint64_t GetDWOID() { return dwo_id_; } + + const uint8_t* GetLineBuffer() { return line_buffer_; } + + uint64_t GetLineBufferLen() { return line_buffer_length_; } + + const uint8_t* GetLineStrBuffer() { return line_string_buffer_; } + + uint64_t GetLineStrBufferLen() { return line_string_buffer_length_; } + + bool HasSourceLineInfo() { return has_source_line_info_; } + + uint64_t GetSourceLineOffset() { return source_line_offset_; } + + bool ShouldProcessSplitDwarf() { return should_process_split_dwarf_; } + + private: + + // This struct represents a single DWARF2/3 abbreviation + // The abbreviation tells how to read a DWARF2/3 DIE, and consist of a + // tag and a list of attributes, as well as the data form of each attribute. + struct Abbrev { + uint64_t number; + enum DwarfTag tag; + bool has_children; + AttributeList attributes; + }; + + // A DWARF2/3 compilation unit header. This is not the same size as + // in the actual file, as the one in the file may have a 32 bit or + // 64 bit length. + struct CompilationUnitHeader { + uint64_t length; + uint16_t version; + uint64_t abbrev_offset; + uint8_t address_size; + } header_; + + // Reads the DWARF2/3 header for this compilation unit. + void ReadHeader(); + + // Reads the DWARF2/3 abbreviations for this compilation unit + void ReadAbbrevs(); + + // Read the abbreviation offset for this compilation unit + size_t ReadAbbrevOffset(const uint8_t* headerptr); + + // Read the address size for this compilation unit + size_t ReadAddressSize(const uint8_t* headerptr); + + // Read the DWO id from a split or skeleton compilation unit header + size_t ReadDwoId(const uint8_t* headerptr); + + // Read the type signature from a type or split type compilation unit header + size_t ReadTypeSignature(const uint8_t* headerptr); + + // Read the DWO id from a split or skeleton compilation unit header + size_t ReadTypeOffset(const uint8_t* headerptr); + + // Processes a single DIE for this compilation unit and return a new + // pointer just past the end of it + const uint8_t* ProcessDIE(uint64_t dieoffset, + const uint8_t* start, + const Abbrev& abbrev); + + // Processes a single attribute and return a new pointer just past the + // end of it + const uint8_t* ProcessAttribute(uint64_t dieoffset, + const uint8_t* start, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t implicit_const); + + // Special version of ProcessAttribute, for finding str_offsets_base and + // DW_AT_addr_base in DW_TAG_compile_unit, for DWARF v5. + const uint8_t* ProcessOffsetBaseAttribute(uint64_t dieoffset, + const uint8_t* start, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t implicit_const); + + // Called when we have an attribute with unsigned data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of compilation unit, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA. + // If we see a DW_AT_GNU_dwo_id attribute, save the value so that + // we can find the debug info in a .dwo or .dwp file. + void ProcessAttributeUnsigned(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { + if (attr == DW_AT_GNU_dwo_id) { + dwo_id_ = data; + } + else if (attr == DW_AT_GNU_addr_base || attr == DW_AT_addr_base) { + addr_base_ = data; + } + else if (attr == DW_AT_str_offsets_base) { + str_offsets_base_ = data; + } + else if (attr == DW_AT_low_pc) { + low_pc_ = data; + } + else if (attr == DW_AT_stmt_list) { + has_source_line_info_ = true; + source_line_offset_ = data; + } + handler_->ProcessAttributeUnsigned(offset, attr, form, data); + } + + // Called when we have an attribute with signed data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of compilation unit, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA. + void ProcessAttributeSigned(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + int64_t data) { + handler_->ProcessAttributeSigned(offset, attr, form, data); + } + + // Called when we have an attribute with a buffer of data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of compilation unit, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA, and the + // length of the buffer is LENGTH. + void ProcessAttributeBuffer(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const uint8_t* data, + uint64_t len) { + handler_->ProcessAttributeBuffer(offset, attr, form, data, len); + } + + // Handles the common parts of DW_FORM_GNU_str_index, DW_FORM_strx, + // DW_FORM_strx1, DW_FORM_strx2, DW_FORM_strx3, and DW_FORM_strx4. + // Retrieves the data and calls through to ProcessAttributeString. + void ProcessFormStringIndex(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t str_index); + + // Called when we have an attribute with string data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of compilation unit, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA. + // If we see a DW_AT_GNU_dwo_name attribute, save the value so + // that we can find the debug info in a .dwo or .dwp file. + void ProcessAttributeString(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const char* data) { + if (attr == DW_AT_GNU_dwo_name || attr == DW_AT_dwo_name) + dwo_name_ = data; + handler_->ProcessAttributeString(offset, attr, form, data); + } + + // Called to handle common portions of DW_FORM_addrx and variations, as well + // as DW_FORM_GNU_addr_index. + void ProcessAttributeAddrIndex(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t addr_index) { + const uint8_t* addr_ptr = + addr_buffer_ + addr_base_ + addr_index * reader_->AddressSize(); + ProcessAttributeUnsigned( + offset, attr, form, reader_->ReadAddress(addr_ptr)); + } + + // Processes all DIEs for this compilation unit + void ProcessDIEs(); + + // Skips the die with attributes specified in ABBREV starting at + // START, and return the new place to position the stream to. + const uint8_t* SkipDIE(const uint8_t* start, const Abbrev& abbrev); + + // Skips the attribute starting at START, with FORM, and return the + // new place to position the stream to. + const uint8_t* SkipAttribute(const uint8_t* start, enum DwarfForm form); + + // Read the debug sections from a .dwo file. + void ReadDebugSectionsFromDwo(ElfReader* elf_reader, + SectionMap* sections); + + // Path of the file containing the debug information. + const string path_; + + // Offset from section start is the offset of this compilation unit + // from the beginning of the .debug_info/.debug_info.dwo section. + uint64_t offset_from_section_start_; + + // buffer is the buffer for our CU, starting at .debug_info + offset + // passed in from constructor. + // after_header points to right after the compilation unit header. + const uint8_t* buffer_; + uint64_t buffer_length_; + const uint8_t* after_header_; + + // The associated ByteReader that handles endianness issues for us + ByteReader* reader_; + + // The map of sections in our file to buffers containing their data + const SectionMap& sections_; + + // The associated handler to call processing functions in + Dwarf2Handler* handler_; + + // Set of DWARF2/3 abbreviations for this compilation unit. Indexed + // by abbreviation number, which means that abbrevs_[0] is not + // valid. + std::vector* abbrevs_; + + // String section buffer and length, if we have a string section. + // This is here to avoid doing a section lookup for strings in + // ProcessAttribute, which is in the hot path for DWARF2 reading. + const uint8_t* string_buffer_; + uint64_t string_buffer_length_; + + // Similarly for .debug_line_str. + const uint8_t* line_string_buffer_; + uint64_t line_string_buffer_length_; + + // String offsets section buffer and length, if we have a string offsets + // section (.debug_str_offsets or .debug_str_offsets.dwo). + const uint8_t* str_offsets_buffer_; + uint64_t str_offsets_buffer_length_; + + // Address section buffer and length, if we have an address section + // (.debug_addr). + const uint8_t* addr_buffer_; + uint64_t addr_buffer_length_; + + // .debug_line section buffer and length. + const uint8_t* line_buffer_; + uint64_t line_buffer_length_; + + // Flag indicating whether this compilation unit is part of a .dwo + // or .dwp file. If true, we are reading this unit because a + // skeleton compilation unit in an executable file had a + // DW_AT_GNU_dwo_name or DW_AT_GNU_dwo_id attribute. + // In a .dwo file, we expect the string offsets section to + // have a ".dwo" suffix, and we will use the ".debug_addr" section + // associated with the skeleton compilation unit. + bool is_split_dwarf_; + + // Flag indicating if it's a Type Unit (only applicable to DWARF v5). + bool is_type_unit_; + + // The value of the DW_AT_GNU_dwo_id attribute, if any. + uint64_t dwo_id_; + + // The value of the DW_AT_GNU_type_signature attribute, if any. + uint64_t type_signature_; + + // The value of the DW_AT_GNU_type_offset attribute, if any. + size_t type_offset_; + + // The value of the DW_AT_GNU_dwo_name attribute, if any. + const char* dwo_name_; + + // If this is a split DWARF CU, the value of the DW_AT_GNU_dwo_id attribute + // from the skeleton CU. + uint64_t skeleton_dwo_id_; + + // The value of the DW_AT_GNU_addr_base attribute, if any. + uint64_t addr_base_; + + // The value of DW_AT_str_offsets_base attribute, if any. + uint64_t str_offsets_base_; + + // True if we have already looked for a .dwp file. + bool have_checked_for_dwp_; + + // ElfReader for the dwo/dwo file. + std::unique_ptr split_elf_reader_; + + // DWP reader. + std::unique_ptr dwp_reader_; + + bool should_process_split_dwarf_; + + // The value of the DW_AT_low_pc attribute, if any. + uint64_t low_pc_; + + // The value of DW_AT_stmt_list attribute if any. + bool has_source_line_info_; + uint64_t source_line_offset_; +}; + +// A Reader for a .dwp file. Supports the fetching of DWARF debug +// info for a given dwo_id. +// +// There are two versions of .dwp files. In both versions, the +// .dwp file is an ELF file containing only debug sections. +// In Version 1, the file contains many copies of each debug +// section, one for each .dwo file that is packaged in the .dwp +// file, and the .debug_cu_index section maps from the dwo_id +// to a set of section indexes. In Version 2, the file contains +// one of each debug section, and the .debug_cu_index section +// maps from the dwo_id to a set of offsets and lengths that +// identify each .dwo file's contribution to the larger sections. + +class DwpReader { + public: + DwpReader(const ByteReader& byte_reader, ElfReader* elf_reader); + + // Read the CU index and initialize data members. + void Initialize(); + + // Read the debug sections for the given dwo_id. + void ReadDebugSectionsForCU(uint64_t dwo_id, SectionMap* sections); + + private: + // Search a v1 hash table for "dwo_id". Returns the slot index + // where the dwo_id was found, or -1 if it was not found. + int LookupCU(uint64_t dwo_id); + + // Search a v2 hash table for "dwo_id". Returns the row index + // in the offsets and sizes tables, or 0 if it was not found. + uint32_t LookupCUv2(uint64_t dwo_id); + + // The ELF reader for the .dwp file. + ElfReader* elf_reader_; + + // The ByteReader for the .dwp file. + const ByteReader& byte_reader_; + + // Pointer to the .debug_cu_index section. + const char* cu_index_; + + // Size of the .debug_cu_index section. + size_t cu_index_size_; + + // Pointer to the .debug_str.dwo section. + const char* string_buffer_; + + // Size of the .debug_str.dwo section. + size_t string_buffer_size_; + + // Version of the .dwp file. We support versions 1 and 2 currently. + int version_; + + // Number of columns in the section tables (version 2). + unsigned int ncolumns_; + + // Number of units in the section tables (version 2). + unsigned int nunits_; + + // Number of slots in the hash table. + unsigned int nslots_; + + // Pointer to the beginning of the hash table. + const char* phash_; + + // Pointer to the beginning of the index table. + const char* pindex_; + + // Pointer to the beginning of the section index pool (version 1). + const char* shndx_pool_; + + // Pointer to the beginning of the section offset table (version 2). + const char* offset_table_; + + // Pointer to the beginning of the section size table (version 2). + const char* size_table_; + + // Contents of the sections of interest (version 2). + const char* abbrev_data_; + size_t abbrev_size_; + const char* info_data_; + size_t info_size_; + const char* str_offsets_data_; + size_t str_offsets_size_; + const char* rnglist_data_; + size_t rnglist_size_; +}; + +// This class is a reader for DWARF's Call Frame Information. CFI +// describes how to unwind stack frames --- even for functions that do +// not follow fixed conventions for saving registers, whose frame size +// varies as they execute, etc. +// +// CFI describes, at each machine instruction, how to compute the +// stack frame's base address, how to find the return address, and +// where to find the saved values of the caller's registers (if the +// callee has stashed them somewhere to free up the registers for its +// own use). +// +// For example, suppose we have a function whose machine code looks +// like this (imagine an assembly language that looks like C, for a +// machine with 32-bit registers, and a stack that grows towards lower +// addresses): +// +// func: ; entry point; return address at sp +// func+0: sp = sp - 16 ; allocate space for stack frame +// func+1: sp[12] = r0 ; save r0 at sp+12 +// ... ; other code, not frame-related +// func+10: sp -= 4; *sp = x ; push some x on the stack +// ... ; other code, not frame-related +// func+20: r0 = sp[16] ; restore saved r0 +// func+21: sp += 20 ; pop whole stack frame +// func+22: pc = *sp; sp += 4 ; pop return address and jump to it +// +// DWARF CFI is (a very compressed representation of) a table with a +// row for each machine instruction address and a column for each +// register showing how to restore it, if possible. +// +// A special column named "CFA", for "Canonical Frame Address", tells how +// to compute the base address of the frame; registers' entries may +// refer to the CFA in describing where the registers are saved. +// +// Another special column, named "RA", represents the return address. +// +// For example, here is a complete (uncompressed) table describing the +// function above: +// +// insn cfa r0 r1 ... ra +// ======================================= +// func+0: sp cfa[0] +// func+1: sp+16 cfa[0] +// func+2: sp+16 cfa[-4] cfa[0] +// func+11: sp+20 cfa[-4] cfa[0] +// func+21: sp+20 cfa[0] +// func+22: sp cfa[0] +// +// Some things to note here: +// +// - Each row describes the state of affairs *before* executing the +// instruction at the given address. Thus, the row for func+0 +// describes the state before we allocate the stack frame. In the +// next row, the formula for computing the CFA has changed, +// reflecting that allocation. +// +// - The other entries are written in terms of the CFA; this allows +// them to remain unchanged as the stack pointer gets bumped around. +// For example, the rule for recovering the return address (the "ra" +// column) remains unchanged throughout the function, even as the +// stack pointer takes on three different offsets from the return +// address. +// +// - Although we haven't shown it, most calling conventions designate +// "callee-saves" and "caller-saves" registers. The callee must +// preserve the values of callee-saves registers; if it uses them, +// it must save their original values somewhere, and restore them +// before it returns. In contrast, the callee is free to trash +// caller-saves registers; if the callee uses these, it will +// probably not bother to save them anywhere, and the CFI will +// probably mark their values as "unrecoverable". +// +// (However, since the caller cannot assume the callee was going to +// save them, caller-saves registers are probably dead in the caller +// anyway, so compilers usually don't generate CFA for caller-saves +// registers.) +// +// - Exactly where the CFA points is a matter of convention that +// depends on the architecture and ABI in use. In the example, the +// CFA is the value the stack pointer had upon entry to the +// function, pointing at the saved return address. But on the x86, +// the call frame information generated by GCC follows the +// convention that the CFA is the address *after* the saved return +// address. +// +// But by definition, the CFA remains constant throughout the +// lifetime of the frame. This makes it a useful value for other +// columns to refer to. It is also gives debuggers a useful handle +// for identifying a frame. +// +// If you look at the table above, you'll notice that a given entry is +// often the same as the one immediately above it: most instructions +// change only one or two aspects of the stack frame, if they affect +// it at all. The DWARF format takes advantage of this fact, and +// reduces the size of the data by mentioning only the addresses and +// columns at which changes take place. So for the above, DWARF CFI +// data would only actually mention the following: +// +// insn cfa r0 r1 ... ra +// ======================================= +// func+0: sp cfa[0] +// func+1: sp+16 +// func+2: cfa[-4] +// func+11: sp+20 +// func+21: r0 +// func+22: sp +// +// In fact, this is the way the parser reports CFI to the consumer: as +// a series of statements of the form, "At address X, column Y changed +// to Z," and related conventions for describing the initial state. +// +// Naturally, it would be impractical to have to scan the entire +// program's CFI, noting changes as we go, just to recover the +// unwinding rules in effect at one particular instruction. To avoid +// this, CFI data is grouped into "entries", each of which covers a +// specified range of addresses and begins with a complete statement +// of the rules for all recoverable registers at that starting +// address. Each entry typically covers a single function. +// +// Thus, to compute the contents of a given row of the table --- that +// is, rules for recovering the CFA, RA, and registers at a given +// instruction --- the consumer should find the entry that covers that +// instruction's address, start with the initial state supplied at the +// beginning of the entry, and work forward until it has processed all +// the changes up to and including those for the present instruction. +// +// There are seven kinds of rules that can appear in an entry of the +// table: +// +// - "undefined": The given register is not preserved by the callee; +// its value cannot be recovered. +// +// - "same value": This register has the same value it did in the callee. +// +// - offset(N): The register is saved at offset N from the CFA. +// +// - val_offset(N): The value the register had in the caller is the +// CFA plus offset N. (This is usually only useful for describing +// the stack pointer.) +// +// - register(R): The register's value was saved in another register R. +// +// - expression(E): Evaluating the DWARF expression E using the +// current frame's registers' values yields the address at which the +// register was saved. +// +// - val_expression(E): Evaluating the DWARF expression E using the +// current frame's registers' values yields the value the register +// had in the caller. + +class CallFrameInfo { + public: + // The different kinds of entries one finds in CFI. Used internally, + // and for error reporting. + enum EntryKind { kUnknown, kCIE, kFDE, kTerminator }; + + // The handler class to which the parser hands the parsed call frame + // information. Defined below. + class Handler; + + // A reporter class, which CallFrameInfo uses to report errors + // encountered while parsing call frame information. Defined below. + class Reporter; + + // Create a DWARF CFI parser. BUFFER points to the contents of the + // .debug_frame section to parse; BUFFER_LENGTH is its length in bytes. + // REPORTER is an error reporter the parser should use to report + // problems. READER is a ByteReader instance that has the endianness and + // address size set properly. Report the data we find to HANDLER. + // + // This class can also parse Linux C++ exception handling data, as found + // in '.eh_frame' sections. This data is a variant of DWARF CFI that is + // placed in loadable segments so that it is present in the program's + // address space, and is interpreted by the C++ runtime to search the + // call stack for a handler interested in the exception being thrown, + // actually pop the frames, and find cleanup code to run. + // + // There are two differences between the call frame information described + // in the DWARF standard and the exception handling data Linux places in + // the .eh_frame section: + // + // - Exception handling data uses uses a different format for call frame + // information entry headers. The distinguished CIE id, the way FDEs + // refer to their CIEs, and the way the end of the series of entries is + // determined are all slightly different. + // + // If the constructor's EH_FRAME argument is true, then the + // CallFrameInfo parses the entry headers as Linux C++ exception + // handling data. If EH_FRAME is false or omitted, the CallFrameInfo + // parses standard DWARF call frame information. + // + // - Linux C++ exception handling data uses CIE augmentation strings + // beginning with 'z' to specify the presence of additional data after + // the CIE and FDE headers and special encodings used for addresses in + // frame description entries. + // + // CallFrameInfo can handle 'z' augmentations in either DWARF CFI or + // exception handling data if you have supplied READER with the base + // addresses needed to interpret the pointer encodings that 'z' + // augmentations can specify. See the ByteReader interface for details + // about the base addresses. See the CallFrameInfo::Handler interface + // for details about the additional information one might find in + // 'z'-augmented data. + // + // Thus: + // + // - If you are parsing standard DWARF CFI, as found in a .debug_frame + // section, you should pass false for the EH_FRAME argument, or omit + // it, and you need not worry about providing READER with the + // additional base addresses. + // + // - If you want to parse Linux C++ exception handling data from a + // .eh_frame section, you should pass EH_FRAME as true, and call + // READER's Set*Base member functions before calling our Start method. + // + // - If you want to parse DWARF CFI that uses the 'z' augmentations + // (although I don't think any toolchain ever emits such data), you + // could pass false for EH_FRAME, but call READER's Set*Base members. + // + // The extensions the Linux C++ ABI makes to DWARF for exception + // handling are described here, rather poorly: + // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/dwarfext.html + // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html + // + // The mechanics of C++ exception handling, personality routines, + // and language-specific data areas are described here, rather nicely: + // http://www.codesourcery.com/public/cxx-abi/abi-eh.html + CallFrameInfo(const uint8_t* buffer, size_t buffer_length, + ByteReader* reader, Handler* handler, Reporter* reporter, + bool eh_frame = false) + : buffer_(buffer), buffer_length_(buffer_length), + reader_(reader), handler_(handler), reporter_(reporter), + eh_frame_(eh_frame) { } + + ~CallFrameInfo() { } + + // Parse the entries in BUFFER, reporting what we find to HANDLER. + // Return true if we reach the end of the section successfully, or + // false if we encounter an error. + bool Start(); + + // Return the textual name of KIND. For error reporting. + static const char* KindName(EntryKind kind); + + private: + + struct CIE; + + // A CFI entry, either an FDE or a CIE. + struct Entry { + // The starting offset of the entry in the section, for error + // reporting. + size_t offset; + + // The start of this entry in the buffer. + const uint8_t* start; + + // Which kind of entry this is. + // + // We want to be able to use this for error reporting even while we're + // in the midst of parsing. Error reporting code may assume that kind, + // offset, and start fields are valid, although kind may be kUnknown. + EntryKind kind; + + // The end of this entry's common prologue (initial length and id), and + // the start of this entry's kind-specific fields. + const uint8_t* fields; + + // The start of this entry's instructions. + const uint8_t* instructions; + + // The address past the entry's last byte in the buffer. (Note that + // since offset points to the entry's initial length field, and the + // length field is the number of bytes after that field, this is not + // simply buffer_ + offset + length.) + const uint8_t* end; + + // For both DWARF CFI and .eh_frame sections, this is the CIE id in a + // CIE, and the offset of the associated CIE in an FDE. + uint64_t id; + + // The CIE that applies to this entry, if we've parsed it. If this is a + // CIE, then this field points to this structure. + CIE* cie; + }; + + // A common information entry (CIE). + struct CIE: public Entry { + uint8_t version; // CFI data version number + string augmentation; // vendor format extension markers + uint64_t code_alignment_factor; // scale for code address adjustments + int data_alignment_factor; // scale for stack pointer adjustments + unsigned return_address_register; // which register holds the return addr + + // True if this CIE includes Linux C++ ABI 'z' augmentation data. + bool has_z_augmentation; + + // Parsed 'z' augmentation data. These are meaningful only if + // has_z_augmentation is true. + bool has_z_lsda; // The 'z' augmentation included 'L'. + bool has_z_personality; // The 'z' augmentation included 'P'. + bool has_z_signal_frame; // The 'z' augmentation included 'S'. + + // If has_z_lsda is true, this is the encoding to be used for language- + // specific data area pointers in FDEs. + DwarfPointerEncoding lsda_encoding; + + // If has_z_personality is true, this is the encoding used for the + // personality routine pointer in the augmentation data. + DwarfPointerEncoding personality_encoding; + + // If has_z_personality is true, this is the address of the personality + // routine --- or, if personality_encoding & DW_EH_PE_indirect, the + // address where the personality routine's address is stored. + uint64_t personality_address; + + // This is the encoding used for addresses in the FDE header and + // in DW_CFA_set_loc instructions. This is always valid, whether + // or not we saw a 'z' augmentation string; its default value is + // DW_EH_PE_absptr, which is what normal DWARF CFI uses. + DwarfPointerEncoding pointer_encoding; + + // These were only introduced in DWARF4, so will not be set in older + // versions. + uint8_t address_size; + uint8_t segment_size; + }; + + // A frame description entry (FDE). + struct FDE: public Entry { + uint64_t address; // start address of described code + uint64_t size; // size of described code, in bytes + + // If cie->has_z_lsda is true, then this is the language-specific data + // area's address --- or its address's address, if cie->lsda_encoding + // has the DW_EH_PE_indirect bit set. + uint64_t lsda_address; + }; + + // Internal use. + class Rule; + class UndefinedRule; + class SameValueRule; + class OffsetRule; + class ValOffsetRule; + class RegisterRule; + class ExpressionRule; + class ValExpressionRule; + class RuleMap; + class State; + + // Parse the initial length and id of a CFI entry, either a CIE, an FDE, + // or a .eh_frame end-of-data mark. CURSOR points to the beginning of the + // data to parse. On success, populate ENTRY as appropriate, and return + // true. On failure, report the problem, and return false. Even if we + // return false, set ENTRY->end to the first byte after the entry if we + // were able to figure that out, or NULL if we weren't. + bool ReadEntryPrologue(const uint8_t* cursor, Entry* entry); + + // Parse the fields of a CIE after the entry prologue, including any 'z' + // augmentation data. Assume that the 'Entry' fields of CIE are + // populated; use CIE->fields and CIE->end as the start and limit for + // parsing. On success, populate the rest of *CIE, and return true; on + // failure, report the problem and return false. + bool ReadCIEFields(CIE* cie); + + // Parse the fields of an FDE after the entry prologue, including any 'z' + // augmentation data. Assume that the 'Entry' fields of *FDE are + // initialized; use FDE->fields and FDE->end as the start and limit for + // parsing. Assume that FDE->cie is fully initialized. On success, + // populate the rest of *FDE, and return true; on failure, report the + // problem and return false. + bool ReadFDEFields(FDE* fde); + + // Report that ENTRY is incomplete, and return false. This is just a + // trivial wrapper for invoking reporter_->Incomplete; it provides a + // little brevity. + bool ReportIncomplete(Entry* entry); + + // Return true if ENCODING has the DW_EH_PE_indirect bit set. + static bool IsIndirectEncoding(DwarfPointerEncoding encoding) { + return encoding & DW_EH_PE_indirect; + } + + // The contents of the DWARF .debug_info section we're parsing. + const uint8_t* buffer_; + size_t buffer_length_; + + // For reading multi-byte values with the appropriate endianness. + ByteReader* reader_; + + // The handler to which we should report the data we find. + Handler* handler_; + + // For reporting problems in the info we're parsing. + Reporter* reporter_; + + // True if we are processing .eh_frame-format data. + bool eh_frame_; +}; + +// The handler class for CallFrameInfo. The a CFI parser calls the +// member functions of a handler object to report the data it finds. +class CallFrameInfo::Handler { + public: + // The pseudo-register number for the canonical frame address. + enum { kCFARegister = -1 }; + + Handler() { } + virtual ~Handler() { } + + // The parser has found CFI for the machine code at ADDRESS, + // extending for LENGTH bytes. OFFSET is the offset of the frame + // description entry in the section, for use in error messages. + // VERSION is the version number of the CFI format. AUGMENTATION is + // a string describing any producer-specific extensions present in + // the data. RETURN_ADDRESS is the number of the register that holds + // the address to which the function should return. + // + // Entry should return true to process this CFI, or false to skip to + // the next entry. + // + // The parser invokes Entry for each Frame Description Entry (FDE) + // it finds. The parser doesn't report Common Information Entries + // to the handler explicitly; instead, if the handler elects to + // process a given FDE, the parser reiterates the appropriate CIE's + // contents at the beginning of the FDE's rules. + virtual bool Entry(size_t offset, uint64_t address, uint64_t length, + uint8_t version, const string& augmentation, + unsigned return_address) = 0; + + // When the Entry function returns true, the parser calls these + // handler functions repeatedly to describe the rules for recovering + // registers at each instruction in the given range of machine code. + // Immediately after a call to Entry, the handler should assume that + // the rule for each callee-saves register is "unchanged" --- that + // is, that the register still has the value it had in the caller. + // + // If a *Rule function returns true, we continue processing this entry's + // instructions. If a *Rule function returns false, we stop evaluating + // instructions, and skip to the next entry. Either way, we call End + // before going on to the next entry. + // + // In all of these functions, if the REG parameter is kCFARegister, then + // the rule describes how to find the canonical frame address. + // kCFARegister may be passed as a BASE_REGISTER argument, meaning that + // the canonical frame address should be used as the base address for the + // computation. All other REG values will be positive. + + // At ADDRESS, register REG's value is not recoverable. + virtual bool UndefinedRule(uint64_t address, int reg) = 0; + + // At ADDRESS, register REG's value is the same as that it had in + // the caller. + virtual bool SameValueRule(uint64_t address, int reg) = 0; + + // At ADDRESS, register REG has been saved at offset OFFSET from + // BASE_REGISTER. + virtual bool OffsetRule(uint64_t address, int reg, + int base_register, long offset) = 0; + + // At ADDRESS, the caller's value of register REG is the current + // value of BASE_REGISTER plus OFFSET. (This rule doesn't provide an + // address at which the register's value is saved.) + virtual bool ValOffsetRule(uint64_t address, int reg, + int base_register, long offset) = 0; + + // At ADDRESS, register REG has been saved in BASE_REGISTER. This differs + // from ValOffsetRule(ADDRESS, REG, BASE_REGISTER, 0), in that + // BASE_REGISTER is the "home" for REG's saved value: if you want to + // assign to a variable whose home is REG in the calling frame, you + // should put the value in BASE_REGISTER. + virtual bool RegisterRule(uint64_t address, int reg, int base_register) = 0; + + // At ADDRESS, the DWARF expression EXPRESSION yields the address at + // which REG was saved. + virtual bool ExpressionRule(uint64_t address, int reg, + const string& expression) = 0; + + // At ADDRESS, the DWARF expression EXPRESSION yields the caller's + // value for REG. (This rule doesn't provide an address at which the + // register's value is saved.) + virtual bool ValExpressionRule(uint64_t address, int reg, + const string& expression) = 0; + + // Indicate that the rules for the address range reported by the + // last call to Entry are complete. End should return true if + // everything is okay, or false if an error has occurred and parsing + // should stop. + virtual bool End() = 0; + + // The target architecture for the data. + virtual string Architecture() = 0; + + // Handler functions for Linux C++ exception handling data. These are + // only called if the data includes 'z' augmentation strings. + + // The Linux C++ ABI uses an extension of the DWARF CFI format to + // walk the stack to propagate exceptions from the throw to the + // appropriate catch, and do the appropriate cleanups along the way. + // CFI entries used for exception handling have two additional data + // associated with them: + // + // - The "language-specific data area" describes which exception + // types the function has 'catch' clauses for, and indicates how + // to go about re-entering the function at the appropriate catch + // clause. If the exception is not caught, it describes the + // destructors that must run before the frame is popped. + // + // - The "personality routine" is responsible for interpreting the + // language-specific data area's contents, and deciding whether + // the exception should continue to propagate down the stack, + // perhaps after doing some cleanup for this frame, or whether the + // exception will be caught here. + // + // In principle, the language-specific data area is opaque to + // everybody but the personality routine. In practice, these values + // may be useful or interesting to readers with extra context, and + // we have to at least skip them anyway, so we might as well report + // them to the handler. + + // This entry's exception handling personality routine's address is + // ADDRESS. If INDIRECT is true, then ADDRESS is the address at + // which the routine's address is stored. The default definition for + // this handler function simply returns true, allowing parsing of + // the entry to continue. + virtual bool PersonalityRoutine(uint64_t address, bool indirect) { + return true; + } + + // This entry's language-specific data area (LSDA) is located at + // ADDRESS. If INDIRECT is true, then ADDRESS is the address at + // which the area's address is stored. The default definition for + // this handler function simply returns true, allowing parsing of + // the entry to continue. + virtual bool LanguageSpecificDataArea(uint64_t address, bool indirect) { + return true; + } + + // This entry describes a signal trampoline --- this frame is the + // caller of a signal handler. The default definition for this + // handler function simply returns true, allowing parsing of the + // entry to continue. + // + // The best description of the rationale for and meaning of signal + // trampoline CFI entries seems to be in the GCC bug database: + // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26208 + virtual bool SignalHandler() { return true; } +}; + +// The CallFrameInfo class makes calls on an instance of this class to +// report errors or warn about problems in the data it is parsing. The +// default definitions of these methods print a message to stderr, but +// you can make a derived class that overrides them. +class CallFrameInfo::Reporter { + public: + // Create an error reporter which attributes troubles to the section + // named SECTION in FILENAME. + // + // Normally SECTION would be .debug_frame, but the Mac puts CFI data + // in a Mach-O section named __debug_frame. If we support + // Linux-style exception handling data, we could be reading an + // .eh_frame section. + Reporter(const string& filename, + const string& section = ".debug_frame") + : filename_(filename), section_(section) { } + virtual ~Reporter() { } + + // The CFI entry at OFFSET ends too early to be well-formed. KIND + // indicates what kind of entry it is; KIND can be kUnknown if we + // haven't parsed enough of the entry to tell yet. + virtual void Incomplete(uint64_t offset, CallFrameInfo::EntryKind kind); + + // The .eh_frame data has a four-byte zero at OFFSET where the next + // entry's length would be; this is a terminator. However, the buffer + // length as given to the CallFrameInfo constructor says there should be + // more data. + virtual void EarlyEHTerminator(uint64_t offset); + + // The FDE at OFFSET refers to the CIE at CIE_OFFSET, but the + // section is not that large. + virtual void CIEPointerOutOfRange(uint64_t offset, uint64_t cie_offset); + + // The FDE at OFFSET refers to the CIE at CIE_OFFSET, but the entry + // there is not a CIE. + virtual void BadCIEId(uint64_t offset, uint64_t cie_offset); + + // The FDE at OFFSET refers to a CIE with an address size we don't know how + // to handle. + virtual void UnexpectedAddressSize(uint64_t offset, uint8_t address_size); + + // The FDE at OFFSET refers to a CIE with an segment descriptor size we + // don't know how to handle. + virtual void UnexpectedSegmentSize(uint64_t offset, uint8_t segment_size); + + // The FDE at OFFSET refers to a CIE with version number VERSION, + // which we don't recognize. We cannot parse DWARF CFI if it uses + // a version number we don't recognize. + virtual void UnrecognizedVersion(uint64_t offset, int version); + + // The FDE at OFFSET refers to a CIE with augmentation AUGMENTATION, + // which we don't recognize. We cannot parse DWARF CFI if it uses + // augmentations we don't recognize. + virtual void UnrecognizedAugmentation(uint64_t offset, + const string& augmentation); + + // The pointer encoding ENCODING, specified by the CIE at OFFSET, is not + // a valid encoding. + virtual void InvalidPointerEncoding(uint64_t offset, uint8_t encoding); + + // The pointer encoding ENCODING, specified by the CIE at OFFSET, depends + // on a base address which has not been supplied. + virtual void UnusablePointerEncoding(uint64_t offset, uint8_t encoding); + + // The CIE at OFFSET contains a DW_CFA_restore instruction at + // INSN_OFFSET, which may not appear in a CIE. + virtual void RestoreInCIE(uint64_t offset, uint64_t insn_offset); + + // The entry at OFFSET, of kind KIND, has an unrecognized + // instruction at INSN_OFFSET. + virtual void BadInstruction(uint64_t offset, CallFrameInfo::EntryKind kind, + uint64_t insn_offset); + + // The instruction at INSN_OFFSET in the entry at OFFSET, of kind + // KIND, establishes a rule that cites the CFA, but we have not + // established a CFA rule yet. + virtual void NoCFARule(uint64_t offset, CallFrameInfo::EntryKind kind, + uint64_t insn_offset); + + // The instruction at INSN_OFFSET in the entry at OFFSET, of kind + // KIND, is a DW_CFA_restore_state instruction, but the stack of + // saved states is empty. + virtual void EmptyStateStack(uint64_t offset, CallFrameInfo::EntryKind kind, + uint64_t insn_offset); + + // The DW_CFA_remember_state instruction at INSN_OFFSET in the entry + // at OFFSET, of kind KIND, would restore a state that has no CFA + // rule, whereas the current state does have a CFA rule. This is + // bogus input, which the CallFrameInfo::Handler interface doesn't + // (and shouldn't) have any way to report. + virtual void ClearingCFARule(uint64_t offset, CallFrameInfo::EntryKind kind, + uint64_t insn_offset); + + protected: + // The name of the file whose CFI we're reading. + string filename_; + + // The name of the CFI section in that file. + string section_; +}; + +} // namespace google_breakpad + +#endif // UTIL_DEBUGINFO_DWARF2READER_H__ diff --git a/src/common/dwarf/dwarf2reader_cfi_unittest.cc b/src/common/dwarf/dwarf2reader_cfi_unittest.cc new file mode 100644 index 0000000..67b662a --- /dev/null +++ b/src/common/dwarf/dwarf2reader_cfi_unittest.cc @@ -0,0 +1,2590 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf2reader_cfi_unittest.cc: Unit tests for google_breakpad::CallFrameInfo + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include + +// The '.eh_frame' format, used by the Linux C++ ABI for exception +// handling, is poorly specified. To help test our support for .eh_frame, +// if you #define WRITE_ELF while compiling this file, and add the +// 'include' directory from the binutils, gcc, or gdb source tree to the +// #include path, then each test that calls the +// PERHAPS_WRITE_DEBUG_FRAME_FILE or PERHAPS_WRITE_EH_FRAME_FILE will write +// an ELF file containing a .debug_frame or .eh_frame section; you can then +// use tools like readelf to examine the test data, and check the tools' +// interpretation against the test's intentions. Each ELF file is named +// "cfitest-TEST", where TEST identifies the particular test. +#ifdef WRITE_ELF +#include +#include +#include +extern "C" { +// To compile with WRITE_ELF, you should add the 'include' directory +// of the binutils, gcc, or gdb source tree to your #include path; +// that directory contains this header. +#include "elf/common.h" +} +#endif + +#include "breakpad_googletest_includes.h" +#include "common/dwarf/bytereader-inl.h" +#include "common/dwarf/cfi_assembler.h" +#include "common/dwarf/dwarf2reader.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +using google_breakpad::CFISection; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::kBigEndian; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Section; + +using google_breakpad::DwarfPointerEncoding; +using google_breakpad::ENDIANNESS_BIG; +using google_breakpad::ENDIANNESS_LITTLE; +using google_breakpad::ByteReader; +using google_breakpad::CallFrameInfo; + +using std::vector; +using testing::InSequence; +using testing::Return; +using testing::Sequence; +using testing::Test; +using testing::_; + +#ifdef WRITE_ELF +void WriteELFFrameSection(const char *filename, const char *section_name, + const CFISection& section); +#define PERHAPS_WRITE_DEBUG_FRAME_FILE(name, section) \ + WriteELFFrameSection("cfitest-" name, ".debug_frame", section); +#define PERHAPS_WRITE_EH_FRAME_FILE(name, section) \ + WriteELFFrameSection("cfitest-" name, ".eh_frame", section); +#else +#define PERHAPS_WRITE_DEBUG_FRAME_FILE(name, section) +#define PERHAPS_WRITE_EH_FRAME_FILE(name, section) +#endif + +class MockCallFrameInfoHandler: public CallFrameInfo::Handler { + public: + MOCK_METHOD6(Entry, bool(size_t offset, uint64_t address, uint64_t length, + uint8_t version, const string& augmentation, + unsigned return_address)); + MOCK_METHOD2(UndefinedRule, bool(uint64_t address, int reg)); + MOCK_METHOD2(SameValueRule, bool(uint64_t address, int reg)); + MOCK_METHOD4(OffsetRule, bool(uint64_t address, int reg, int base_register, + long offset)); + MOCK_METHOD4(ValOffsetRule, bool(uint64_t address, int reg, int base_register, + long offset)); + MOCK_METHOD3(RegisterRule, bool(uint64_t address, int reg, int base_register)); + MOCK_METHOD3(ExpressionRule, bool(uint64_t address, int reg, + const string& expression)); + MOCK_METHOD3(ValExpressionRule, bool(uint64_t address, int reg, + const string& expression)); + MOCK_METHOD0(End, bool()); + MOCK_METHOD0(Architecture, string()); + MOCK_METHOD2(PersonalityRoutine, bool(uint64_t address, bool indirect)); + MOCK_METHOD2(LanguageSpecificDataArea, bool(uint64_t address, bool indirect)); + MOCK_METHOD0(SignalHandler, bool()); +}; + +class MockCallFrameErrorReporter: public CallFrameInfo::Reporter { + public: + MockCallFrameErrorReporter() : Reporter("mock filename", "mock section") { } + MOCK_METHOD2(Incomplete, void(uint64_t, CallFrameInfo::EntryKind)); + MOCK_METHOD1(EarlyEHTerminator, void(uint64_t)); + MOCK_METHOD2(CIEPointerOutOfRange, void(uint64_t, uint64_t)); + MOCK_METHOD2(BadCIEId, void(uint64_t, uint64_t)); + MOCK_METHOD2(UnexpectedAddressSize, void(uint64_t, uint8_t)); + MOCK_METHOD2(UnexpectedSegmentSize, void(uint64_t, uint8_t)); + MOCK_METHOD2(UnrecognizedVersion, void(uint64_t, int version)); + MOCK_METHOD2(UnrecognizedAugmentation, void(uint64_t, const string&)); + MOCK_METHOD2(InvalidPointerEncoding, void(uint64_t, uint8_t)); + MOCK_METHOD2(UnusablePointerEncoding, void(uint64_t, uint8_t)); + MOCK_METHOD2(RestoreInCIE, void(uint64_t, uint64_t)); + MOCK_METHOD3(BadInstruction, void(uint64_t, CallFrameInfo::EntryKind, + uint64_t)); + MOCK_METHOD3(NoCFARule, void(uint64_t, CallFrameInfo::EntryKind, uint64_t)); + MOCK_METHOD3(EmptyStateStack, void(uint64_t, CallFrameInfo::EntryKind, + uint64_t)); +}; + +struct CFIFixture { + + enum { kCFARegister = CallFrameInfo::Handler::kCFARegister }; + + CFIFixture() { + // Default expectations for the data handler. + // + // - Leave Entry and End without expectations, as it's probably a + // good idea to set those explicitly in each test. + // + // - Expect the *Rule functions to not be called, + // so that each test can simply list the calls they expect. + // + // I gather I could use StrictMock for this, but the manual seems + // to suggest using that only as a last resort, and this isn't so + // bad. + EXPECT_CALL(handler, UndefinedRule(_, _)).Times(0); + EXPECT_CALL(handler, SameValueRule(_, _)).Times(0); + EXPECT_CALL(handler, OffsetRule(_, _, _, _)).Times(0); + EXPECT_CALL(handler, ValOffsetRule(_, _, _, _)).Times(0); + EXPECT_CALL(handler, RegisterRule(_, _, _)).Times(0); + EXPECT_CALL(handler, ExpressionRule(_, _, _)).Times(0); + EXPECT_CALL(handler, ValExpressionRule(_, _, _)).Times(0); + EXPECT_CALL(handler, PersonalityRoutine(_, _)).Times(0); + EXPECT_CALL(handler, LanguageSpecificDataArea(_, _)).Times(0); + EXPECT_CALL(handler, SignalHandler()).Times(0); + + // Default expectations for the error/warning reporer. + EXPECT_CALL(reporter, Incomplete(_, _)).Times(0); + EXPECT_CALL(reporter, EarlyEHTerminator(_)).Times(0); + EXPECT_CALL(reporter, CIEPointerOutOfRange(_, _)).Times(0); + EXPECT_CALL(reporter, BadCIEId(_, _)).Times(0); + EXPECT_CALL(reporter, UnrecognizedVersion(_, _)).Times(0); + EXPECT_CALL(reporter, UnrecognizedAugmentation(_, _)).Times(0); + EXPECT_CALL(reporter, InvalidPointerEncoding(_, _)).Times(0); + EXPECT_CALL(reporter, UnusablePointerEncoding(_, _)).Times(0); + EXPECT_CALL(reporter, RestoreInCIE(_, _)).Times(0); + EXPECT_CALL(reporter, BadInstruction(_, _, _)).Times(0); + EXPECT_CALL(reporter, NoCFARule(_, _, _)).Times(0); + EXPECT_CALL(reporter, EmptyStateStack(_, _, _)).Times(0); + } + + MockCallFrameInfoHandler handler; + MockCallFrameErrorReporter reporter; +}; + +class CFI: public CFIFixture, public Test { }; + +TEST_F(CFI, EmptyRegion) { + EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0); + EXPECT_CALL(handler, End()).Times(0); + static const uint8_t data[] = { 42 }; + + ByteReader byte_reader(ENDIANNESS_BIG); + CallFrameInfo parser(data, 0, &byte_reader, &handler, &reporter); + EXPECT_TRUE(parser.Start()); +} + +TEST_F(CFI, IncompleteLength32) { + CFISection section(kBigEndian, 8); + section + // Not even long enough for an initial length. + .D16(0xa0f) + // Padding to keep valgrind happy. We subtract these off when we + // construct the parser. + .D16(0); + + EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0); + EXPECT_CALL(handler, End()).Times(0); + + EXPECT_CALL(reporter, Incomplete(_, CallFrameInfo::kUnknown)) + .WillOnce(Return()); + + string contents; + ASSERT_TRUE(section.GetContents(&contents)); + + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetAddressSize(8); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size() - 2, + &byte_reader, &handler, &reporter); + EXPECT_FALSE(parser.Start()); +} + +TEST_F(CFI, IncompleteLength64) { + CFISection section(kLittleEndian, 4); + section + // An incomplete 64-bit DWARF initial length. + .D32(0xffffffff).D32(0x71fbaec2) + // Padding to keep valgrind happy. We subtract these off when we + // construct the parser. + .D32(0); + + EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0); + EXPECT_CALL(handler, End()).Times(0); + + EXPECT_CALL(reporter, Incomplete(_, CallFrameInfo::kUnknown)) + .WillOnce(Return()); + + string contents; + ASSERT_TRUE(section.GetContents(&contents)); + + ByteReader byte_reader(ENDIANNESS_LITTLE); + byte_reader.SetAddressSize(4); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size() - 4, + &byte_reader, &handler, &reporter); + EXPECT_FALSE(parser.Start()); +} + +TEST_F(CFI, IncompleteId32) { + CFISection section(kBigEndian, 8); + section + .D32(3) // Initial length, not long enough for id + .D8(0xd7).D8(0xe5).D8(0xf1) // incomplete id + .CIEHeader(8727, 3983, 8889, 3, "") + .FinishEntry(); + + EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0); + EXPECT_CALL(handler, End()).Times(0); + + EXPECT_CALL(reporter, Incomplete(_, CallFrameInfo::kUnknown)) + .WillOnce(Return()); + + string contents; + ASSERT_TRUE(section.GetContents(&contents)); + + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetAddressSize(8); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_FALSE(parser.Start()); +} + +TEST_F(CFI, BadId32) { + CFISection section(kBigEndian, 8); + section + .D32(0x100) // Initial length + .D32(0xe802fade) // bogus ID + .Append(0x100 - 4, 0x42); // make the length true + section + .CIEHeader(1672, 9872, 8529, 3, "") + .FinishEntry(); + + EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0); + EXPECT_CALL(handler, End()).Times(0); + + EXPECT_CALL(reporter, CIEPointerOutOfRange(_, 0xe802fade)) + .WillOnce(Return()); + + string contents; + ASSERT_TRUE(section.GetContents(&contents)); + + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetAddressSize(8); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_FALSE(parser.Start()); +} + +// A lone CIE shouldn't cause any handler calls. +TEST_F(CFI, SingleCIE) { + CFISection section(kLittleEndian, 4); + section.CIEHeader(0xffe799a8, 0x3398dcdd, 0x6e9683de, 3, ""); + section.Append(10, google_breakpad::DW_CFA_nop); + section.FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("SingleCIE", section); + + EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0); + EXPECT_CALL(handler, End()).Times(0); + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_LITTLE); + byte_reader.SetAddressSize(4); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_TRUE(parser.Start()); +} + +// One FDE, one CIE. +TEST_F(CFI, OneFDE) { + CFISection section(kBigEndian, 4); + Label cie; + section + .Mark(&cie) + .CIEHeader(0x4be22f75, 0x2492236e, 0x6b6efb87, 3, "") + .FinishEntry() + .FDEHeader(cie, 0x7714740d, 0x3d5a10cd) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("OneFDE", section); + + { + InSequence s; + EXPECT_CALL(handler, + Entry(_, 0x7714740d, 0x3d5a10cd, 3, "", 0x6b6efb87)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetAddressSize(4); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_TRUE(parser.Start()); +} + +// Two FDEs share a CIE. +TEST_F(CFI, TwoFDEsOneCIE) { + CFISection section(kBigEndian, 4); + Label cie; + section + // First FDE. readelf complains about this one because it makes + // a forward reference to its CIE. + .FDEHeader(cie, 0xa42744df, 0xa3b42121) + .FinishEntry() + // CIE. + .Mark(&cie) + .CIEHeader(0x04f7dc7b, 0x3d00c05f, 0xbd43cb59, 3, "") + .FinishEntry() + // Second FDE. + .FDEHeader(cie, 0x6057d391, 0x700f608d) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("TwoFDEsOneCIE", section); + + { + InSequence s; + EXPECT_CALL(handler, + Entry(_, 0xa42744df, 0xa3b42121, 3, "", 0xbd43cb59)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + { + InSequence s; + EXPECT_CALL(handler, + Entry(_, 0x6057d391, 0x700f608d, 3, "", 0xbd43cb59)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetAddressSize(4); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_TRUE(parser.Start()); +} + +// Two FDEs, two CIEs. +TEST_F(CFI, TwoFDEsTwoCIEs) { + CFISection section(kLittleEndian, 8); + Label cie1, cie2; + section + // First CIE. + .Mark(&cie1) + .CIEHeader(0x694d5d45, 0x4233221b, 0xbf45e65a, 3, "") + .FinishEntry() + // First FDE which cites second CIE. readelf complains about + // this one because it makes a forward reference to its CIE. + .FDEHeader(cie2, 0x778b27dfe5871f05ULL, 0x324ace3448070926ULL) + .FinishEntry() + // Second FDE, which cites first CIE. + .FDEHeader(cie1, 0xf6054ca18b10bf5fULL, 0x45fdb970d8bca342ULL) + .FinishEntry() + // Second CIE. + .Mark(&cie2) + .CIEHeader(0xfba3fad7, 0x6287e1fd, 0x61d2c581, 2, "") + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("TwoFDEsTwoCIEs", section); + + { + InSequence s; + EXPECT_CALL(handler, + Entry(_, 0x778b27dfe5871f05ULL, 0x324ace3448070926ULL, 2, + "", 0x61d2c581)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + { + InSequence s; + EXPECT_CALL(handler, + Entry(_, 0xf6054ca18b10bf5fULL, 0x45fdb970d8bca342ULL, 3, + "", 0xbf45e65a)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_LITTLE); + byte_reader.SetAddressSize(8); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_TRUE(parser.Start()); +} + +// An FDE whose CIE specifies a version we don't recognize. +TEST_F(CFI, BadVersion) { + CFISection section(kBigEndian, 4); + Label cie1, cie2; + section + .Mark(&cie1) + .CIEHeader(0xca878cf0, 0x7698ec04, 0x7b616f54, 0x52, "") + .FinishEntry() + // We should skip this entry, as its CIE specifies a version we + // don't recognize. + .FDEHeader(cie1, 0x08852292, 0x2204004a) + .FinishEntry() + // Despite the above, we should visit this entry. + .Mark(&cie2) + .CIEHeader(0x7c3ae7c9, 0xb9b9a512, 0x96cb3264, 3, "") + .FinishEntry() + .FDEHeader(cie2, 0x2094735a, 0x6e875501) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("BadVersion", section); + + EXPECT_CALL(reporter, UnrecognizedVersion(_, 0x52)) + .WillOnce(Return()); + + { + InSequence s; + // We should see no mention of the first FDE, but we should get + // a call to Entry for the second. + EXPECT_CALL(handler, Entry(_, 0x2094735a, 0x6e875501, 3, "", + 0x96cb3264)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .WillOnce(Return(true)); + } + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetAddressSize(4); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_FALSE(parser.Start()); +} + +// An FDE whose CIE specifies an augmentation we don't recognize. +TEST_F(CFI, BadAugmentation) { + CFISection section(kBigEndian, 4); + Label cie1, cie2; + section + .Mark(&cie1) + .CIEHeader(0x4be22f75, 0x2492236e, 0x6b6efb87, 3, "spaniels!") + .FinishEntry() + // We should skip this entry, as its CIE specifies an + // augmentation we don't recognize. + .FDEHeader(cie1, 0x7714740d, 0x3d5a10cd) + .FinishEntry() + // Despite the above, we should visit this entry. + .Mark(&cie2) + .CIEHeader(0xf8bc4399, 0x8cf09931, 0xf2f519b2, 3, "") + .FinishEntry() + .FDEHeader(cie2, 0x7bf0fda0, 0xcbcd28d8) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("BadAugmentation", section); + + EXPECT_CALL(reporter, UnrecognizedAugmentation(_, "spaniels!")) + .WillOnce(Return()); + + { + InSequence s; + // We should see no mention of the first FDE, but we should get + // a call to Entry for the second. + EXPECT_CALL(handler, Entry(_, 0x7bf0fda0, 0xcbcd28d8, 3, "", + 0xf2f519b2)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .WillOnce(Return(true)); + } + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetAddressSize(4); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_FALSE(parser.Start()); +} + +// The return address column field is a byte in CFI version 1 +// (DWARF2), but a ULEB128 value in version 3 (DWARF3). +TEST_F(CFI, CIEVersion1ReturnColumn) { + CFISection section(kBigEndian, 4); + Label cie; + section + // CIE, using the version 1 format: return column is a ubyte. + .Mark(&cie) + // Use a value for the return column that is parsed differently + // as a ubyte and as a ULEB128. + .CIEHeader(0xbcdea24f, 0x5be28286, 0x9f, 1, "") + .FinishEntry() + // FDE, citing that CIE. + .FDEHeader(cie, 0xb8d347b5, 0x825e55dc) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("CIEVersion1ReturnColumn", section); + + { + InSequence s; + EXPECT_CALL(handler, Entry(_, 0xb8d347b5, 0x825e55dc, 1, "", 0x9f)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetAddressSize(4); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_TRUE(parser.Start()); +} + +// The return address column field is a byte in CFI version 1 +// (DWARF2), but a ULEB128 value in version 3 (DWARF3). +TEST_F(CFI, CIEVersion3ReturnColumn) { + CFISection section(kBigEndian, 4); + Label cie; + section + // CIE, using the version 3 format: return column is a ULEB128. + .Mark(&cie) + // Use a value for the return column that is parsed differently + // as a ubyte and as a ULEB128. + .CIEHeader(0x0ab4758d, 0xc010fdf7, 0x89, 3, "") + .FinishEntry() + // FDE, citing that CIE. + .FDEHeader(cie, 0x86763f2b, 0x2a66dc23) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("CIEVersion3ReturnColumn", section); + + { + InSequence s; + EXPECT_CALL(handler, Entry(_, 0x86763f2b, 0x2a66dc23, 3, "", 0x89)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetAddressSize(4); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_TRUE(parser.Start()); +} + +TEST_F(CFI, CIEVersion4AdditionalFields) { + CFISection section(kBigEndian, 8); + Label cie; + section + .Mark(&cie) + // CIE version 4 with expected address (64bit) and segment size. + .CIEHeader(0x0ab4758d, 0xc010fdf7, 0x89, 4, "", true, 8, 0) + .FinishEntry() + // FDE, citing that CIE. + .FDEHeader(cie, 0x86763f2b, 0x2a66dc23) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("CIEVersion3ReturnColumn", section); + + { + InSequence s; + EXPECT_CALL(handler, Entry(_, 0x86763f2b, 0x2a66dc23, 4, "", 0x89)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_BIG); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_TRUE(parser.Start()); +} + +TEST_F(CFI, CIEVersion4AdditionalFields32BitAddress) { + CFISection section(kBigEndian, 4); + Label cie; + section + .Mark(&cie) + // CIE version 4 with expected address (32bit) and segment size. + .CIEHeader(0x0ab4758d, 0xc010fdf7, 0x89, 4, "", true, 4, 0) + .FinishEntry() + // FDE, citing that CIE. + .FDEHeader(cie, 0x86763f2b, 0x2a66dc23) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("CIEVersion3ReturnColumn", section); + + { + InSequence s; + EXPECT_CALL(handler, Entry(_, 0x86763f2b, 0x2a66dc23, 4, "", 0x89)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_BIG); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_TRUE(parser.Start()); +} + +TEST_F(CFI, CIEVersion4AdditionalFieldsUnexpectedAddressSize) { + CFISection section(kBigEndian, 4); + Label cie; + + section + .Mark(&cie) + // Unexpected address size. + .CIEHeader(0x4be22f75, 0x2492236e, 0x6b6efb87, 4, "", true, 3, 0) + .FinishEntry() + // FDE, citing that CIE. + .FDEHeader(cie, 0x86763f2b, 0x2a66dc23) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("AdditionalFieldsUnexpectedAddress", section); + + EXPECT_CALL(reporter, UnexpectedAddressSize(_, 3)) + .WillOnce(Return()); + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_BIG); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_FALSE(parser.Start()); +} + +TEST_F(CFI, CIEVersion4AdditionalFieldsUnexpectedSegmentSize) { + CFISection section(kBigEndian, 8); + Label cie; + + section + .Mark(&cie) + .CIEHeader(0xf8bc4399, 0x8cf09931, 0xf2f519b2, 4, "", true, 8, 7) + .FinishEntry() + .FDEHeader(cie, 0x7bf0fda0, 0xcbcd28d8) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("AdditionalFieldsUnexpectedSegment", section); + + EXPECT_CALL(reporter, UnexpectedSegmentSize(_, 7)) + .WillOnce(Return()); + + string contents; + EXPECT_TRUE(section.GetContents(&contents)); + ByteReader byte_reader(ENDIANNESS_BIG); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + EXPECT_FALSE(parser.Start()); +} + +struct CFIInsnFixture: public CFIFixture { + CFIInsnFixture() : CFIFixture() { + data_factor = 0xb6f; + return_register = 0x9be1ed9f; + version = 3; + cfa_base_register = 0x383a3aa; + cfa_offset = 0xf748; + } + + // Prepare SECTION to receive FDE instructions. + // + // - Append a stock CIE header that establishes the fixture's + // code_factor, data_factor, return_register, version, and + // augmentation values. + // - Have the CIE set up a CFA rule using cfa_base_register and + // cfa_offset. + // - Append a stock FDE header, referring to the above CIE, for the + // fde_size bytes at fde_start. Choose fde_start and fde_size + // appropriately for the section's address size. + // - Set appropriate expectations on handler in sequence s for the + // frame description entry and the CIE's CFA rule. + // + // On return, SECTION is ready to have FDE instructions appended to + // it, and its FinishEntry member called. + void StockCIEAndFDE(CFISection *section) { + // Choose appropriate constants for our address size. + if (section->AddressSize() == 4) { + fde_start = 0xc628ecfbU; + fde_size = 0x5dee04a2; + code_factor = 0x60b; + } else { + assert(section->AddressSize() == 8); + fde_start = 0x0005c57ce7806bd3ULL; + fde_size = 0x2699521b5e333100ULL; + code_factor = 0x01008e32855274a8ULL; + } + + // Create the CIE. + (*section) + .Mark(&cie_label) + .CIEHeader(code_factor, data_factor, return_register, version, + "") + .D8(google_breakpad::DW_CFA_def_cfa) + .ULEB128(cfa_base_register) + .ULEB128(cfa_offset) + .FinishEntry(); + + // Create the FDE. + section->FDEHeader(cie_label, fde_start, fde_size); + + // Expect an Entry call for the FDE and a ValOffsetRule call for the + // CIE's CFA rule. + EXPECT_CALL(handler, Entry(_, fde_start, fde_size, version, "", + return_register)) + .InSequence(s) + .WillOnce(Return(true)); + EXPECT_CALL(handler, ValOffsetRule(fde_start, kCFARegister, + cfa_base_register, cfa_offset)) + .InSequence(s) + .WillOnce(Return(true)); + } + + // Run the contents of SECTION through a CallFrameInfo parser, + // expecting parser.Start to return SUCCEEDS + void ParseSection(CFISection *section, bool succeeds = true) { + string contents; + EXPECT_TRUE(section->GetContents(&contents)); + google_breakpad::Endianness endianness; + if (section->endianness() == kBigEndian) + endianness = ENDIANNESS_BIG; + else { + assert(section->endianness() == kLittleEndian); + endianness = ENDIANNESS_LITTLE; + } + ByteReader byte_reader(endianness); + byte_reader.SetAddressSize(section->AddressSize()); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter); + if (succeeds) + EXPECT_TRUE(parser.Start()); + else + EXPECT_FALSE(parser.Start()); + } + + Label cie_label; + Sequence s; + uint64_t code_factor; + int data_factor; + unsigned return_register; + unsigned version; + unsigned cfa_base_register; + int cfa_offset; + uint64_t fde_start, fde_size; +}; + +class CFIInsn: public CFIInsnFixture, public Test { }; + +TEST_F(CFIInsn, DW_CFA_set_loc) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_set_loc).D32(0xb1ee3e7a) + // Use DW_CFA_def_cfa to force a handler call that we can use to + // check the effect of the DW_CFA_set_loc. + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x4defb431).ULEB128(0x6d17b0ee) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_set_loc", section); + + EXPECT_CALL(handler, + ValOffsetRule(0xb1ee3e7a, kCFARegister, 0x4defb431, 0x6d17b0ee)) + .InSequence(s) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_advance_loc) { + CFISection section(kBigEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_advance_loc | 0x2a) + // Use DW_CFA_def_cfa to force a handler call that we can use to + // check the effect of the DW_CFA_advance_loc. + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x5bbb3715).ULEB128(0x0186c7bf) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_advance_loc", section); + + EXPECT_CALL(handler, + ValOffsetRule(fde_start + 0x2a * code_factor, + kCFARegister, 0x5bbb3715, 0x0186c7bf)) + .InSequence(s) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_advance_loc1) { + CFISection section(kLittleEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_advance_loc1).D8(0xd8) + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x69d5696a).ULEB128(0x1eb7fc93) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_advance_loc1", section); + + EXPECT_CALL(handler, + ValOffsetRule((fde_start + 0xd8 * code_factor), + kCFARegister, 0x69d5696a, 0x1eb7fc93)) + .InSequence(s) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_advance_loc2) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_advance_loc2).D16(0x3adb) + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x3a368bed).ULEB128(0x3194ee37) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_advance_loc2", section); + + EXPECT_CALL(handler, + ValOffsetRule((fde_start + 0x3adb * code_factor), + kCFARegister, 0x3a368bed, 0x3194ee37)) + .InSequence(s) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_advance_loc4) { + CFISection section(kBigEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_advance_loc4).D32(0x15813c88) + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x135270c5).ULEB128(0x24bad7cb) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_advance_loc4", section); + + EXPECT_CALL(handler, + ValOffsetRule((fde_start + 0x15813c88ULL * code_factor), + kCFARegister, 0x135270c5, 0x24bad7cb)) + .InSequence(s) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_MIPS_advance_loc8) { + code_factor = 0x2d; + CFISection section(kBigEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_MIPS_advance_loc8).D64(0x3c4f3945b92c14ULL) + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0xe17ed602).ULEB128(0x3d162e7f) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_advance_loc8", section); + + EXPECT_CALL(handler, + ValOffsetRule((fde_start + 0x3c4f3945b92c14ULL * code_factor), + kCFARegister, 0xe17ed602, 0x3d162e7f)) + .InSequence(s) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_def_cfa) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x4e363a85).ULEB128(0x815f9aa7) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_def_cfa", section); + + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, 0x4e363a85, 0x815f9aa7)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_def_cfa_sf) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_def_cfa_sf).ULEB128(0x8ccb32b7).LEB128(0x9ea) + .D8(google_breakpad::DW_CFA_def_cfa_sf).ULEB128(0x9b40f5da).LEB128(-0x40a2) + .FinishEntry(); + + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, 0x8ccb32b7, + 0x9ea * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, 0x9b40f5da, + -0x40a2 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_def_cfa_register) { + CFISection section(kLittleEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_def_cfa_register).ULEB128(0x3e7e9363) + .FinishEntry(); + + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, 0x3e7e9363, cfa_offset)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +// DW_CFA_def_cfa_register should have no effect when applied to a +// non-base/offset rule. +TEST_F(CFIInsn, DW_CFA_def_cfa_registerBadRule) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_def_cfa_expression).Block("needle in a haystack") + .D8(google_breakpad::DW_CFA_def_cfa_register).ULEB128(0xf1b49e49) + .FinishEntry(); + + EXPECT_CALL(handler, + ValExpressionRule(fde_start, kCFARegister, + "needle in a haystack")) + .WillRepeatedly(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_def_cfa_offset) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_def_cfa_offset).ULEB128(0x1e8e3b9b) + .FinishEntry(); + + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, cfa_base_register, + 0x1e8e3b9b)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_def_cfa_offset_sf) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_def_cfa_offset_sf).LEB128(0x970) + .D8(google_breakpad::DW_CFA_def_cfa_offset_sf).LEB128(-0x2cd) + .FinishEntry(); + + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, cfa_base_register, + 0x970 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, cfa_base_register, + -0x2cd * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +// DW_CFA_def_cfa_offset should have no effect when applied to a +// non-base/offset rule. +TEST_F(CFIInsn, DW_CFA_def_cfa_offsetBadRule) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_def_cfa_expression).Block("six ways to Sunday") + .D8(google_breakpad::DW_CFA_def_cfa_offset).ULEB128(0x1e8e3b9b) + .FinishEntry(); + + EXPECT_CALL(handler, + ValExpressionRule(fde_start, kCFARegister, "six ways to Sunday")) + .WillRepeatedly(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_def_cfa_expression) { + CFISection section(kLittleEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_def_cfa_expression).Block("eating crow") + .FinishEntry(); + + EXPECT_CALL(handler, ValExpressionRule(fde_start, kCFARegister, + "eating crow")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_undefined) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_undefined).ULEB128(0x300ce45d) + .FinishEntry(); + + EXPECT_CALL(handler, UndefinedRule(fde_start, 0x300ce45d)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_same_value) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_same_value).ULEB128(0x3865a760) + .FinishEntry(); + + EXPECT_CALL(handler, SameValueRule(fde_start, 0x3865a760)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_offset) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_offset | 0x2c).ULEB128(0x9f6) + .FinishEntry(); + + EXPECT_CALL(handler, + OffsetRule(fde_start, 0x2c, kCFARegister, 0x9f6 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_offset_extended) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_offset_extended).ULEB128(0x402b).ULEB128(0xb48) + .FinishEntry(); + + EXPECT_CALL(handler, + OffsetRule(fde_start, 0x402b, kCFARegister, 0xb48 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_offset_extended_sf) { + CFISection section(kBigEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_offset_extended_sf) + .ULEB128(0x997c23ee).LEB128(0x2d00) + .D8(google_breakpad::DW_CFA_offset_extended_sf) + .ULEB128(0x9519eb82).LEB128(-0xa77) + .FinishEntry(); + + EXPECT_CALL(handler, + OffsetRule(fde_start, 0x997c23ee, + kCFARegister, 0x2d00 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, + OffsetRule(fde_start, 0x9519eb82, + kCFARegister, -0xa77 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_val_offset) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_val_offset).ULEB128(0x623562fe).ULEB128(0x673) + .FinishEntry(); + + EXPECT_CALL(handler, + ValOffsetRule(fde_start, 0x623562fe, + kCFARegister, 0x673 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_val_offset_sf) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_val_offset_sf).ULEB128(0x6f4f).LEB128(0xaab) + .D8(google_breakpad::DW_CFA_val_offset_sf).ULEB128(0x2483).LEB128(-0x8a2) + .FinishEntry(); + + EXPECT_CALL(handler, + ValOffsetRule(fde_start, 0x6f4f, + kCFARegister, 0xaab * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, + ValOffsetRule(fde_start, 0x2483, + kCFARegister, -0x8a2 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_register) { + CFISection section(kLittleEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_register).ULEB128(0x278d18f9).ULEB128(0x1a684414) + .FinishEntry(); + + EXPECT_CALL(handler, RegisterRule(fde_start, 0x278d18f9, 0x1a684414)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_expression) { + CFISection section(kBigEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_expression).ULEB128(0xa1619fb2) + .Block("plus ça change, plus c'est la même chose") + .FinishEntry(); + + EXPECT_CALL(handler, + ExpressionRule(fde_start, 0xa1619fb2, + "plus ça change, plus c'est la même chose")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_val_expression) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_val_expression).ULEB128(0xc5e4a9e3) + .Block("he who has the gold makes the rules") + .FinishEntry(); + + EXPECT_CALL(handler, + ValExpressionRule(fde_start, 0xc5e4a9e3, + "he who has the gold makes the rules")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_restore) { + CFISection section(kLittleEndian, 8); + code_factor = 0x01bd188a9b1fa083ULL; + data_factor = -0x1ac8; + return_register = 0x8c35b049; + version = 2; + fde_start = 0x2d70fe998298bbb1ULL; + fde_size = 0x46ccc2e63cf0b108ULL; + Label cie; + section + .Mark(&cie) + .CIEHeader(code_factor, data_factor, return_register, version, + "") + // Provide a CFA rule, because register rules require them. + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x6ca1d50e).ULEB128(0x372e38e8) + // Provide an offset(N) rule for register 0x3c. + .D8(google_breakpad::DW_CFA_offset | 0x3c).ULEB128(0xb348) + .FinishEntry() + // In the FDE... + .FDEHeader(cie, fde_start, fde_size) + // At a second address, provide a new offset(N) rule for register 0x3c. + .D8(google_breakpad::DW_CFA_advance_loc | 0x13) + .D8(google_breakpad::DW_CFA_offset | 0x3c).ULEB128(0x9a50) + // At a third address, restore the original rule for register 0x3c. + .D8(google_breakpad::DW_CFA_advance_loc | 0x01) + .D8(google_breakpad::DW_CFA_restore | 0x3c) + .FinishEntry(); + + { + InSequence s; + EXPECT_CALL(handler, + Entry(_, fde_start, fde_size, version, "", return_register)) + .WillOnce(Return(true)); + // CIE's CFA rule. + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, 0x6ca1d50e, 0x372e38e8)) + .WillOnce(Return(true)); + // CIE's rule for register 0x3c. + EXPECT_CALL(handler, + OffsetRule(fde_start, 0x3c, kCFARegister, 0xb348 * data_factor)) + .WillOnce(Return(true)); + // FDE's rule for register 0x3c. + EXPECT_CALL(handler, + OffsetRule(fde_start + 0x13 * code_factor, 0x3c, + kCFARegister, 0x9a50 * data_factor)) + .WillOnce(Return(true)); + // Restore CIE's rule for register 0x3c. + EXPECT_CALL(handler, + OffsetRule(fde_start + (0x13 + 0x01) * code_factor, 0x3c, + kCFARegister, 0xb348 * data_factor)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_restoreNoRule) { + CFISection section(kBigEndian, 4); + code_factor = 0x005f78143c1c3b82ULL; + data_factor = 0x25d0; + return_register = 0xe8; + version = 1; + fde_start = 0x4062e30f; + fde_size = 0x5302a389; + Label cie; + section + .Mark(&cie) + .CIEHeader(code_factor, data_factor, return_register, version, "") + // Provide a CFA rule, because register rules require them. + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x470aa334).ULEB128(0x099ef127) + .FinishEntry() + // In the FDE... + .FDEHeader(cie, fde_start, fde_size) + // At a second address, provide an offset(N) rule for register 0x2c. + .D8(google_breakpad::DW_CFA_advance_loc | 0x7) + .D8(google_breakpad::DW_CFA_offset | 0x2c).ULEB128(0x1f47) + // At a third address, restore the (missing) CIE rule for register 0x2c. + .D8(google_breakpad::DW_CFA_advance_loc | 0xb) + .D8(google_breakpad::DW_CFA_restore | 0x2c) + .FinishEntry(); + + { + InSequence s; + EXPECT_CALL(handler, + Entry(_, fde_start, fde_size, version, "", return_register)) + .WillOnce(Return(true)); + // CIE's CFA rule. + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, 0x470aa334, 0x099ef127)) + .WillOnce(Return(true)); + // FDE's rule for register 0x2c. + EXPECT_CALL(handler, + OffsetRule(fde_start + 0x7 * code_factor, 0x2c, + kCFARegister, 0x1f47 * data_factor)) + .WillOnce(Return(true)); + // Restore CIE's (missing) rule for register 0x2c. + EXPECT_CALL(handler, + SameValueRule(fde_start + (0x7 + 0xb) * code_factor, 0x2c)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_restore_extended) { + CFISection section(kBigEndian, 4); + code_factor = 0x126e; + data_factor = -0xd8b; + return_register = 0x77711787; + version = 3; + fde_start = 0x01f55a45; + fde_size = 0x452adb80; + Label cie; + section + .Mark(&cie) + .CIEHeader(code_factor, data_factor, return_register, version, + "", true /* dwarf64 */ ) + // Provide a CFA rule, because register rules require them. + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x56fa0edd).ULEB128(0x097f78a5) + // Provide an offset(N) rule for register 0x0f9b8a1c. + .D8(google_breakpad::DW_CFA_offset_extended) + .ULEB128(0x0f9b8a1c).ULEB128(0xc979) + .FinishEntry() + // In the FDE... + .FDEHeader(cie, fde_start, fde_size) + // At a second address, provide a new offset(N) rule for reg 0x0f9b8a1c. + .D8(google_breakpad::DW_CFA_advance_loc | 0x3) + .D8(google_breakpad::DW_CFA_offset_extended) + .ULEB128(0x0f9b8a1c).ULEB128(0x3b7b) + // At a third address, restore the original rule for register 0x0f9b8a1c. + .D8(google_breakpad::DW_CFA_advance_loc | 0x04) + .D8(google_breakpad::DW_CFA_restore_extended).ULEB128(0x0f9b8a1c) + .FinishEntry(); + + { + InSequence s; + EXPECT_CALL(handler, + Entry(_, fde_start, fde_size, version, "", return_register)) + .WillOnce(Return(true)); + // CIE's CFA rule. + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, 0x56fa0edd, 0x097f78a5)) + .WillOnce(Return(true)); + // CIE's rule for register 0x0f9b8a1c. + EXPECT_CALL(handler, + OffsetRule(fde_start, 0x0f9b8a1c, kCFARegister, + 0xc979 * data_factor)) + .WillOnce(Return(true)); + // FDE's rule for register 0x0f9b8a1c. + EXPECT_CALL(handler, + OffsetRule(fde_start + 0x3 * code_factor, 0x0f9b8a1c, + kCFARegister, 0x3b7b * data_factor)) + .WillOnce(Return(true)); + // Restore CIE's rule for register 0x0f9b8a1c. + EXPECT_CALL(handler, + OffsetRule(fde_start + (0x3 + 0x4) * code_factor, 0x0f9b8a1c, + kCFARegister, 0xc979 * data_factor)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + } + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_remember_and_restore_state) { + CFISection section(kLittleEndian, 8); + StockCIEAndFDE(§ion); + + // We create a state, save it, modify it, and then restore. We + // refer to the state that is overridden the restore as the + // "outgoing" state, and the restored state the "incoming" state. + // + // Register outgoing incoming expect + // 1 offset(N) no rule new "same value" rule + // 2 register(R) offset(N) report changed rule + // 3 offset(N) offset(M) report changed offset + // 4 offset(N) offset(N) no report + // 5 offset(N) no rule new "same value" rule + section + // Create the "incoming" state, which we will save and later restore. + .D8(google_breakpad::DW_CFA_offset | 2).ULEB128(0x9806) + .D8(google_breakpad::DW_CFA_offset | 3).ULEB128(0x995d) + .D8(google_breakpad::DW_CFA_offset | 4).ULEB128(0x7055) + .D8(google_breakpad::DW_CFA_remember_state) + // Advance to a new instruction; an implementation could legitimately + // ignore all but the final rule for a given register at a given address. + .D8(google_breakpad::DW_CFA_advance_loc | 1) + // Create the "outgoing" state, which we will discard. + .D8(google_breakpad::DW_CFA_offset | 1).ULEB128(0xea1a) + .D8(google_breakpad::DW_CFA_register).ULEB128(2).ULEB128(0x1d2a3767) + .D8(google_breakpad::DW_CFA_offset | 3).ULEB128(0xdd29) + .D8(google_breakpad::DW_CFA_offset | 5).ULEB128(0xf1ce) + // At a third address, restore the incoming state. + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + uint64_t addr = fde_start; + + // Expect the incoming rules to be reported. + EXPECT_CALL(handler, OffsetRule(addr, 2, kCFARegister, 0x9806 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, OffsetRule(addr, 3, kCFARegister, 0x995d * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, OffsetRule(addr, 4, kCFARegister, 0x7055 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + + addr += code_factor; + + // After the save, we establish the outgoing rule set. + EXPECT_CALL(handler, OffsetRule(addr, 1, kCFARegister, 0xea1a * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, RegisterRule(addr, 2, 0x1d2a3767)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, OffsetRule(addr, 3, kCFARegister, 0xdd29 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, OffsetRule(addr, 5, kCFARegister, 0xf1ce * data_factor)) + .InSequence(s).WillOnce(Return(true)); + + addr += code_factor; + + // Finally, after the restore, expect to see the differences from + // the outgoing to the incoming rules reported. + EXPECT_CALL(handler, SameValueRule(addr, 1)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, OffsetRule(addr, 2, kCFARegister, 0x9806 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, OffsetRule(addr, 3, kCFARegister, 0x995d * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, SameValueRule(addr, 5)) + .InSequence(s).WillOnce(Return(true)); + + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +// Check that restoring a rule set reports changes to the CFA rule. +TEST_F(CFIInsn, DW_CFA_remember_and_restore_stateCFA) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + + section + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_def_cfa_offset).ULEB128(0x90481102) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, ValOffsetRule(fde_start + code_factor, kCFARegister, + cfa_base_register, 0x90481102)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ValOffsetRule(fde_start + code_factor * 2, kCFARegister, + cfa_base_register, cfa_offset)) + .InSequence(s).WillOnce(Return(true)); + + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_nop) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_nop) + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x3fb8d4f1).ULEB128(0x078dc67b) + .D8(google_breakpad::DW_CFA_nop) + .FinishEntry(); + + EXPECT_CALL(handler, + ValOffsetRule(fde_start, kCFARegister, 0x3fb8d4f1, 0x078dc67b)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_GNU_window_save) { + CFISection section(kBigEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_GNU_window_save) + .FinishEntry(); + + EXPECT_CALL(handler, Architecture()).WillRepeatedly(Return("sparc")); + + // Don't include all the rules in any particular sequence. + + // The caller's %o0-%o7 have become the callee's %i0-%i7. This is + // the GCC register numbering. + for (int i = 8; i < 16; i++) + EXPECT_CALL(handler, RegisterRule(fde_start, i, i + 16)) + .WillOnce(Return(true)); + // The caller's %l0-%l7 and %i0-%i7 have been saved at the top of + // its frame. + for (int i = 16; i < 32; i++) + EXPECT_CALL(handler, OffsetRule(fde_start, i, kCFARegister, (i-16) * 4)) + .WillOnce(Return(true)); + + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_GNU_args_size) { + CFISection section(kLittleEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_GNU_args_size).ULEB128(0xeddfa520) + // Verify that we see this, meaning we parsed the above properly. + .D8(google_breakpad::DW_CFA_offset | 0x23).ULEB128(0x269) + .FinishEntry(); + + EXPECT_CALL(handler, + OffsetRule(fde_start, 0x23, kCFARegister, 0x269 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIInsn, DW_CFA_GNU_negative_offset_extended) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_GNU_negative_offset_extended) + .ULEB128(0x430cc87a).ULEB128(0x613) + .FinishEntry(); + + EXPECT_CALL(handler, + OffsetRule(fde_start, 0x430cc87a, + kCFARegister, -0x613 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion); +} + +// Three FDEs: skip the second +TEST_F(CFIInsn, SkipFDE) { + CFISection section(kBigEndian, 4); + Label cie; + section + // CIE, used by all FDEs. + .Mark(&cie) + .CIEHeader(0x010269f2, 0x9177, 0xedca5849, 2, "") + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(0x42ed390b).ULEB128(0x98f43aad) + .FinishEntry() + // First FDE. + .FDEHeader(cie, 0xa870ebdd, 0x60f6aa4) + .D8(google_breakpad::DW_CFA_register).ULEB128(0x3a860351).ULEB128(0x6c9a6bcf) + .FinishEntry() + // Second FDE. + .FDEHeader(cie, 0xc534f7c0, 0xf6552e9, true /* dwarf64 */) + .D8(google_breakpad::DW_CFA_register).ULEB128(0x1b62c234).ULEB128(0x26586b18) + .FinishEntry() + // Third FDE. + .FDEHeader(cie, 0xf681cfc8, 0x7e4594e) + .D8(google_breakpad::DW_CFA_register).ULEB128(0x26c53934).ULEB128(0x18eeb8a4) + .FinishEntry(); + + { + InSequence s; + + // Process the first FDE. + EXPECT_CALL(handler, Entry(_, 0xa870ebdd, 0x60f6aa4, 2, "", 0xedca5849)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, ValOffsetRule(0xa870ebdd, kCFARegister, + 0x42ed390b, 0x98f43aad)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, RegisterRule(0xa870ebdd, 0x3a860351, 0x6c9a6bcf)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .WillOnce(Return(true)); + + // Skip the second FDE. + EXPECT_CALL(handler, Entry(_, 0xc534f7c0, 0xf6552e9, 2, "", 0xedca5849)) + .WillOnce(Return(false)); + + // Process the third FDE. + EXPECT_CALL(handler, Entry(_, 0xf681cfc8, 0x7e4594e, 2, "", 0xedca5849)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, ValOffsetRule(0xf681cfc8, kCFARegister, + 0x42ed390b, 0x98f43aad)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, RegisterRule(0xf681cfc8, 0x26c53934, 0x18eeb8a4)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .WillOnce(Return(true)); + } + + ParseSection(§ion); +} + +// Quit processing in the middle of an entry's instructions. +TEST_F(CFIInsn, QuitMidentry) { + CFISection section(kLittleEndian, 8); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_register).ULEB128(0xe0cf850d).ULEB128(0x15aab431) + .D8(google_breakpad::DW_CFA_expression).ULEB128(0x46750aa5).Block("meat") + .FinishEntry(); + + EXPECT_CALL(handler, RegisterRule(fde_start, 0xe0cf850d, 0x15aab431)) + .InSequence(s).WillOnce(Return(false)); + EXPECT_CALL(handler, End()) + .InSequence(s).WillOnce(Return(true)); + + ParseSection(§ion, false); +} + +class CFIRestore: public CFIInsnFixture, public Test { }; + +TEST_F(CFIRestore, RestoreUndefinedRuleUnchanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_undefined).ULEB128(0x0bac878e) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, UndefinedRule(fde_start, 0x0bac878e)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreUndefinedRuleChanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_undefined).ULEB128(0x7dedff5f) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_same_value).ULEB128(0x7dedff5f) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, UndefinedRule(fde_start, 0x7dedff5f)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, SameValueRule(fde_start + code_factor, 0x7dedff5f)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, UndefinedRule(fde_start + 2 * code_factor, 0x7dedff5f)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreSameValueRuleUnchanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_same_value).ULEB128(0xadbc9b3a) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, SameValueRule(fde_start, 0xadbc9b3a)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreSameValueRuleChanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_same_value).ULEB128(0x3d90dcb5) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_undefined).ULEB128(0x3d90dcb5) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, SameValueRule(fde_start, 0x3d90dcb5)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0x3d90dcb5)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, SameValueRule(fde_start + 2 * code_factor, 0x3d90dcb5)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreOffsetRuleUnchanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_offset | 0x14).ULEB128(0xb6f) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, OffsetRule(fde_start, 0x14, + kCFARegister, 0xb6f * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreOffsetRuleChanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_offset | 0x21).ULEB128(0xeb7) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_undefined).ULEB128(0x21) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, OffsetRule(fde_start, 0x21, + kCFARegister, 0xeb7 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0x21)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, OffsetRule(fde_start + 2 * code_factor, 0x21, + kCFARegister, 0xeb7 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreOffsetRuleChangedOffset) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_offset | 0x21).ULEB128(0x134) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_offset | 0x21).ULEB128(0xf4f) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, OffsetRule(fde_start, 0x21, + kCFARegister, 0x134 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, OffsetRule(fde_start + code_factor, 0x21, + kCFARegister, 0xf4f * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, OffsetRule(fde_start + 2 * code_factor, 0x21, + kCFARegister, 0x134 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreValOffsetRuleUnchanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_val_offset).ULEB128(0x829caee6).ULEB128(0xe4c) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, ValOffsetRule(fde_start, 0x829caee6, + kCFARegister, 0xe4c * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreValOffsetRuleChanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_val_offset).ULEB128(0xf17c36d6).ULEB128(0xeb7) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_undefined).ULEB128(0xf17c36d6) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, ValOffsetRule(fde_start, 0xf17c36d6, + kCFARegister, 0xeb7 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xf17c36d6)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ValOffsetRule(fde_start + 2 * code_factor, 0xf17c36d6, + kCFARegister, 0xeb7 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreValOffsetRuleChangedValOffset) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_val_offset).ULEB128(0x2cf0ab1b).ULEB128(0x562) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_val_offset).ULEB128(0x2cf0ab1b).ULEB128(0xe88) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, ValOffsetRule(fde_start, 0x2cf0ab1b, + kCFARegister, 0x562 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ValOffsetRule(fde_start + code_factor, 0x2cf0ab1b, + kCFARegister, 0xe88 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ValOffsetRule(fde_start + 2 * code_factor, 0x2cf0ab1b, + kCFARegister, 0x562 * data_factor)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreRegisterRuleUnchanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_register).ULEB128(0x77514acc).ULEB128(0x464de4ce) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, RegisterRule(fde_start, 0x77514acc, 0x464de4ce)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreRegisterRuleChanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_register).ULEB128(0xe39acce5).ULEB128(0x095f1559) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_undefined).ULEB128(0xe39acce5) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, RegisterRule(fde_start, 0xe39acce5, 0x095f1559)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xe39acce5)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, RegisterRule(fde_start + 2 * code_factor, 0xe39acce5, + 0x095f1559)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreRegisterRuleChangedRegister) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_register).ULEB128(0xd40e21b1).ULEB128(0x16607d6a) + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_register).ULEB128(0xd40e21b1).ULEB128(0xbabb4742) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, RegisterRule(fde_start, 0xd40e21b1, 0x16607d6a)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, RegisterRule(fde_start + code_factor, 0xd40e21b1, + 0xbabb4742)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, RegisterRule(fde_start + 2 * code_factor, 0xd40e21b1, + 0x16607d6a)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreExpressionRuleUnchanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_expression).ULEB128(0x666ae152).Block("dwarf") + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, ExpressionRule(fde_start, 0x666ae152, "dwarf")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreExpressionRuleChanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_expression).ULEB128(0xb5ca5c46).Block("elf") + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_undefined).ULEB128(0xb5ca5c46) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, ExpressionRule(fde_start, 0xb5ca5c46, "elf")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xb5ca5c46)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ExpressionRule(fde_start + 2 * code_factor, 0xb5ca5c46, + "elf")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreExpressionRuleChangedExpression) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_expression).ULEB128(0x500f5739).Block("smurf") + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_expression).ULEB128(0x500f5739).Block("orc") + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, ExpressionRule(fde_start, 0x500f5739, "smurf")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ExpressionRule(fde_start + code_factor, 0x500f5739, + "orc")) + .InSequence(s).WillOnce(Return(true)); + // Expectations are not wishes. + EXPECT_CALL(handler, ExpressionRule(fde_start + 2 * code_factor, 0x500f5739, + "smurf")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreValExpressionRuleUnchanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_val_expression).ULEB128(0x666ae152) + .Block("hideous") + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + EXPECT_CALL(handler, ValExpressionRule(fde_start, 0x666ae152, "hideous")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreValExpressionRuleChanged) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_val_expression).ULEB128(0xb5ca5c46) + .Block("revolting") + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_undefined).ULEB128(0xb5ca5c46) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("RestoreValExpressionRuleChanged", section); + + EXPECT_CALL(handler, ValExpressionRule(fde_start, 0xb5ca5c46, "revolting")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xb5ca5c46)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ValExpressionRule(fde_start + 2 * code_factor, 0xb5ca5c46, + "revolting")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +TEST_F(CFIRestore, RestoreValExpressionRuleChangedValExpression) { + CFISection section(kLittleEndian, 4); + StockCIEAndFDE(§ion); + section + .D8(google_breakpad::DW_CFA_val_expression).ULEB128(0x500f5739) + .Block("repulsive") + .D8(google_breakpad::DW_CFA_remember_state) + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_val_expression).ULEB128(0x500f5739) + .Block("nauseous") + .D8(google_breakpad::DW_CFA_advance_loc | 1) + .D8(google_breakpad::DW_CFA_restore_state) + .FinishEntry(); + + PERHAPS_WRITE_DEBUG_FRAME_FILE("RestoreValExpressionRuleChangedValExpression", + section); + + EXPECT_CALL(handler, ValExpressionRule(fde_start, 0x500f5739, "repulsive")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ValExpressionRule(fde_start + code_factor, 0x500f5739, + "nauseous")) + .InSequence(s).WillOnce(Return(true)); + // Expectations are not wishes. + EXPECT_CALL(handler, ValExpressionRule(fde_start + 2 * code_factor, 0x500f5739, + "repulsive")) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()).WillOnce(Return(true)); + + ParseSection(§ion); +} + +struct EHFrameFixture: public CFIInsnFixture { + EHFrameFixture() + : CFIInsnFixture(), section(kBigEndian, 4, true) { + encoded_pointer_bases.cfi = 0x7f496cb2; + encoded_pointer_bases.text = 0x540f67b6; + encoded_pointer_bases.data = 0xe3eab768; + section.SetEncodedPointerBases(encoded_pointer_bases); + } + CFISection section; + CFISection::EncodedPointerBases encoded_pointer_bases; + + // Parse CFIInsnFixture::ParseSection, but parse the section as + // .eh_frame data, supplying stock base addresses. + void ParseEHFrameSection(CFISection *section, bool succeeds = true) { + EXPECT_TRUE(section->ContainsEHFrame()); + string contents; + EXPECT_TRUE(section->GetContents(&contents)); + google_breakpad::Endianness endianness; + if (section->endianness() == kBigEndian) + endianness = ENDIANNESS_BIG; + else { + assert(section->endianness() == kLittleEndian); + endianness = ENDIANNESS_LITTLE; + } + ByteReader byte_reader(endianness); + byte_reader.SetAddressSize(section->AddressSize()); + byte_reader.SetCFIDataBase(encoded_pointer_bases.cfi, + reinterpret_cast(contents.data())); + byte_reader.SetTextBase(encoded_pointer_bases.text); + byte_reader.SetDataBase(encoded_pointer_bases.data); + CallFrameInfo parser(reinterpret_cast(contents.data()), + contents.size(), + &byte_reader, &handler, &reporter, true); + if (succeeds) + EXPECT_TRUE(parser.Start()); + else + EXPECT_FALSE(parser.Start()); + } + +}; + +class EHFrame: public EHFrameFixture, public Test { }; + +// A simple CIE, an FDE, and a terminator. +TEST_F(EHFrame, Terminator) { + Label cie; + section + .Mark(&cie) + .CIEHeader(9968, 2466, 67, 1, "") + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(3772).ULEB128(1372) + .FinishEntry() + .FDEHeader(cie, 0x848037a1, 0x7b30475e) + .D8(google_breakpad::DW_CFA_set_loc).D32(0x17713850) + .D8(google_breakpad::DW_CFA_undefined).ULEB128(5721) + .FinishEntry() + .D32(0) // Terminate the sequence. + // This FDE should be ignored. + .FDEHeader(cie, 0xf19629fe, 0x439fb09b) + .FinishEntry(); + + PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.Terminator", section); + + EXPECT_CALL(handler, Entry(_, 0x848037a1, 0x7b30475e, 1, "", 67)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ValOffsetRule(0x848037a1, kCFARegister, 3772, 1372)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, UndefinedRule(0x17713850, 5721)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(reporter, EarlyEHTerminator(_)) + .InSequence(s).WillOnce(Return()); + + ParseEHFrameSection(§ion); +} + +// The parser should recognize the Linux Standards Base 'z' augmentations. +TEST_F(EHFrame, SimpleFDE) { + DwarfPointerEncoding lsda_encoding = + DwarfPointerEncoding(google_breakpad::DW_EH_PE_indirect + | google_breakpad::DW_EH_PE_datarel + | google_breakpad::DW_EH_PE_sdata2); + DwarfPointerEncoding fde_encoding = + DwarfPointerEncoding(google_breakpad::DW_EH_PE_textrel + | google_breakpad::DW_EH_PE_udata2); + + section.SetPointerEncoding(fde_encoding); + section.SetEncodedPointerBases(encoded_pointer_bases); + Label cie; + section + .Mark(&cie) + .CIEHeader(4873, 7012, 100, 1, "zSLPR") + .ULEB128(7) // Augmentation data length + .D8(lsda_encoding) // LSDA pointer format + .D8(google_breakpad::DW_EH_PE_pcrel) // personality pointer format + .EncodedPointer(0x97baa00, google_breakpad::DW_EH_PE_pcrel) // and value + .D8(fde_encoding) // FDE pointer format + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(6706).ULEB128(31) + .FinishEntry() + .FDEHeader(cie, 0x540f6b56, 0xf686) + .ULEB128(2) // Augmentation data length + .EncodedPointer(0xe3eab475, lsda_encoding) // LSDA pointer, signed + .D8(google_breakpad::DW_CFA_set_loc) + .EncodedPointer(0x540fa4ce, fde_encoding) + .D8(google_breakpad::DW_CFA_undefined).ULEB128(0x675e) + .FinishEntry() + .D32(0); // terminator + + PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.SimpleFDE", section); + + EXPECT_CALL(handler, Entry(_, 0x540f6b56, 0xf686, 1, "zSLPR", 100)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, PersonalityRoutine(0x97baa00, false)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, LanguageSpecificDataArea(0xe3eab475, true)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, SignalHandler()) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ValOffsetRule(0x540f6b56, kCFARegister, 6706, 31)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, UndefinedRule(0x540fa4ce, 0x675e)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .InSequence(s).WillOnce(Return(true)); + + ParseEHFrameSection(§ion); +} + +// Check that we can handle an empty 'z' augmentation. +TEST_F(EHFrame, EmptyZ) { + Label cie; + section + .Mark(&cie) + .CIEHeader(5955, 5805, 228, 1, "z") + .ULEB128(0) // Augmentation data length + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(3629).ULEB128(247) + .FinishEntry() + .FDEHeader(cie, 0xda007738, 0xfb55c641) + .ULEB128(0) // Augmentation data length + .D8(google_breakpad::DW_CFA_advance_loc1).D8(11) + .D8(google_breakpad::DW_CFA_undefined).ULEB128(3769) + .FinishEntry(); + + PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.EmptyZ", section); + + EXPECT_CALL(handler, Entry(_, 0xda007738, 0xfb55c641, 1, "z", 228)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, ValOffsetRule(0xda007738, kCFARegister, 3629, 247)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, UndefinedRule(0xda007738 + 11 * 5955, 3769)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .InSequence(s).WillOnce(Return(true)); + + ParseEHFrameSection(§ion); +} + +// Check that we recognize bad 'z' augmentation characters. +TEST_F(EHFrame, BadZ) { + Label cie; + section + .Mark(&cie) + .CIEHeader(6937, 1045, 142, 1, "zQ") + .ULEB128(0) // Augmentation data length + .D8(google_breakpad::DW_CFA_def_cfa).ULEB128(9006).ULEB128(7725) + .FinishEntry() + .FDEHeader(cie, 0x1293efa8, 0x236f53f2) + .ULEB128(0) // Augmentation data length + .D8(google_breakpad::DW_CFA_advance_loc | 12) + .D8(google_breakpad::DW_CFA_register).ULEB128(5667).ULEB128(3462) + .FinishEntry(); + + PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.BadZ", section); + + EXPECT_CALL(reporter, UnrecognizedAugmentation(_, "zQ")) + .WillOnce(Return()); + + ParseEHFrameSection(§ion, false); +} + +TEST_F(EHFrame, zL) { + Label cie; + DwarfPointerEncoding lsda_encoding = + DwarfPointerEncoding(google_breakpad::DW_EH_PE_funcrel + | google_breakpad::DW_EH_PE_udata2); + section + .Mark(&cie) + .CIEHeader(9285, 9959, 54, 1, "zL") + .ULEB128(1) // Augmentation data length + .D8(lsda_encoding) // encoding for LSDA pointer in FDE + + .FinishEntry() + .FDEHeader(cie, 0xd40091aa, 0x9aa6e746) + .ULEB128(2) // Augmentation data length + .EncodedPointer(0xd40099cd, lsda_encoding) // LSDA pointer + .FinishEntry() + .D32(0); // terminator + + PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.zL", section); + + EXPECT_CALL(handler, Entry(_, 0xd40091aa, 0x9aa6e746, 1, "zL", 54)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, LanguageSpecificDataArea(0xd40099cd, false)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .InSequence(s).WillOnce(Return(true)); + + ParseEHFrameSection(§ion); +} + +TEST_F(EHFrame, zP) { + Label cie; + DwarfPointerEncoding personality_encoding = + DwarfPointerEncoding(google_breakpad::DW_EH_PE_datarel + | google_breakpad::DW_EH_PE_udata2); + section + .Mark(&cie) + .CIEHeader(1097, 6313, 17, 1, "zP") + .ULEB128(3) // Augmentation data length + .D8(personality_encoding) // encoding for personality routine + .EncodedPointer(0xe3eaccac, personality_encoding) // value + .FinishEntry() + .FDEHeader(cie, 0x0c8350c9, 0xbef11087) + .ULEB128(0) // Augmentation data length + .FinishEntry() + .D32(0); // terminator + + PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.zP", section); + + EXPECT_CALL(handler, Entry(_, 0x0c8350c9, 0xbef11087, 1, "zP", 17)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, PersonalityRoutine(0xe3eaccac, false)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .InSequence(s).WillOnce(Return(true)); + + ParseEHFrameSection(§ion); +} + +TEST_F(EHFrame, zR) { + Label cie; + DwarfPointerEncoding pointer_encoding = + DwarfPointerEncoding(google_breakpad::DW_EH_PE_textrel + | google_breakpad::DW_EH_PE_sdata2); + section.SetPointerEncoding(pointer_encoding); + section + .Mark(&cie) + .CIEHeader(8011, 5496, 75, 1, "zR") + .ULEB128(1) // Augmentation data length + .D8(pointer_encoding) // encoding for FDE addresses + .FinishEntry() + .FDEHeader(cie, 0x540f9431, 0xbd0) + .ULEB128(0) // Augmentation data length + .FinishEntry() + .D32(0); // terminator + + PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.zR", section); + + EXPECT_CALL(handler, Entry(_, 0x540f9431, 0xbd0, 1, "zR", 75)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .InSequence(s).WillOnce(Return(true)); + + ParseEHFrameSection(§ion); +} + +TEST_F(EHFrame, zS) { + Label cie; + section + .Mark(&cie) + .CIEHeader(9217, 7694, 57, 1, "zS") + .ULEB128(0) // Augmentation data length + .FinishEntry() + .FDEHeader(cie, 0xd40091aa, 0x9aa6e746) + .ULEB128(0) // Augmentation data length + .FinishEntry() + .D32(0); // terminator + + PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.zS", section); + + EXPECT_CALL(handler, Entry(_, 0xd40091aa, 0x9aa6e746, 1, "zS", 57)) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, SignalHandler()) + .InSequence(s).WillOnce(Return(true)); + EXPECT_CALL(handler, End()) + .InSequence(s).WillOnce(Return(true)); + + ParseEHFrameSection(§ion); +} + +// These tests require manual inspection of the test output. +struct CFIReporterFixture { + CFIReporterFixture() : reporter("test file name", "test section name") { } + CallFrameInfo::Reporter reporter; +}; + +class CFIReporter: public CFIReporterFixture, public Test { }; + +TEST_F(CFIReporter, Incomplete) { + reporter.Incomplete(0x0102030405060708ULL, CallFrameInfo::kUnknown); +} + +TEST_F(CFIReporter, EarlyEHTerminator) { + reporter.EarlyEHTerminator(0x0102030405060708ULL); +} + +TEST_F(CFIReporter, CIEPointerOutOfRange) { + reporter.CIEPointerOutOfRange(0x0123456789abcdefULL, 0xfedcba9876543210ULL); +} + +TEST_F(CFIReporter, BadCIEId) { + reporter.BadCIEId(0x0123456789abcdefULL, 0xfedcba9876543210ULL); +} + +TEST_F(CFIReporter, UnrecognizedVersion) { + reporter.UnrecognizedVersion(0x0123456789abcdefULL, 43); +} + +TEST_F(CFIReporter, UnrecognizedAugmentation) { + reporter.UnrecognizedAugmentation(0x0123456789abcdefULL, "poodles"); +} + +TEST_F(CFIReporter, InvalidPointerEncoding) { + reporter.InvalidPointerEncoding(0x0123456789abcdefULL, 0x42); +} + +TEST_F(CFIReporter, UnusablePointerEncoding) { + reporter.UnusablePointerEncoding(0x0123456789abcdefULL, 0x42); +} + +TEST_F(CFIReporter, RestoreInCIE) { + reporter.RestoreInCIE(0x0123456789abcdefULL, 0xfedcba9876543210ULL); +} + +TEST_F(CFIReporter, BadInstruction) { + reporter.BadInstruction(0x0123456789abcdefULL, CallFrameInfo::kFDE, + 0xfedcba9876543210ULL); +} + +TEST_F(CFIReporter, NoCFARule) { + reporter.NoCFARule(0x0123456789abcdefULL, CallFrameInfo::kCIE, + 0xfedcba9876543210ULL); +} + +TEST_F(CFIReporter, EmptyStateStack) { + reporter.EmptyStateStack(0x0123456789abcdefULL, CallFrameInfo::kTerminator, + 0xfedcba9876543210ULL); +} + +TEST_F(CFIReporter, ClearingCFARule) { + reporter.ClearingCFARule(0x0123456789abcdefULL, CallFrameInfo::kFDE, + 0xfedcba9876543210ULL); +} + +#ifdef WRITE_ELF +// See comments at the top of the file mentioning WRITE_ELF for details. + +using google_breakpad::test_assembler::Section; + +struct ELFSectionHeader { + ELFSectionHeader(unsigned int set_type) + : type(set_type), flags(0), address(0), link(0), info(0), + alignment(1), entry_size(0) { } + Label name; + unsigned int type; + uint64_t flags; + uint64_t address; + Label file_offset; + Label file_size; + unsigned int link; + unsigned int info; + uint64_t alignment; + uint64_t entry_size; +}; + +void AppendSectionHeader(CFISection* table, const ELFSectionHeader& header) { + (*table) + .D32(header.name) // name, index in string tbl + .D32(header.type) // type + .Address(header.flags) // flags + .Address(header.address) // address in memory + .Address(header.file_offset) // offset in ELF file + .Address(header.file_size) // length in bytes + .D32(header.link) // link to related section + .D32(header.info) // miscellaneous + .Address(header.alignment) // alignment + .Address(header.entry_size); // entry size +} + +void WriteELFFrameSection(const char *filename, const char *cfi_name, + const CFISection& cfi) { + int elf_class = cfi.AddressSize() == 4 ? ELFCLASS32 : ELFCLASS64; + int elf_data = (cfi.endianness() == kBigEndian + ? ELFDATA2MSB : ELFDATA2LSB); + CFISection elf(cfi.endianness(), cfi.AddressSize()); + Label elf_header_size, section_table_offset; + elf + .Append("\x7f" "ELF") + .D8(elf_class) // 32-bit or 64-bit ELF + .D8(elf_data) // endianness + .D8(1) // ELF version + .D8(ELFOSABI_LINUX) // Operating System/ABI indication + .D8(0) // ABI version + .Append(7, 0xda) // padding + .D16(ET_EXEC) // file type: executable file + .D16(EM_386) // architecture: Intel IA-32 + .D32(EV_CURRENT); // ELF version + elf + .Address(0x0123456789abcdefULL) // program entry point + .Address(0) // program header offset + .Address(section_table_offset) // section header offset + .D32(0) // processor-specific flags + .D16(elf_header_size) // ELF header size in bytes */ + .D16(elf_class == ELFCLASS32 ? 32 : 56) // program header entry size + .D16(0) // program header table entry count + .D16(elf_class == ELFCLASS32 ? 40 : 64) // section header entry size + .D16(3) // section count + .D16(1) // section name string table + .Mark(&elf_header_size); + + // The null section. Every ELF file has one, as the first entry in + // the section header table. + ELFSectionHeader null_header(SHT_NULL); + null_header.file_offset = 0; + null_header.file_size = 0; + + // The CFI section. The whole reason for writing out this ELF file + // is to put this in it so that we can run other dumping programs on + // it to check its contents. + ELFSectionHeader cfi_header(SHT_PROGBITS); + cfi_header.file_size = cfi.Size(); + + // The section holding the names of the sections. This is the + // section whose index appears in the e_shstrndx member of the ELF + // header. + ELFSectionHeader section_names_header(SHT_STRTAB); + CFISection section_names(cfi.endianness(), cfi.AddressSize()); + section_names + .Mark(&null_header.name) + .AppendCString("") + .Mark(§ion_names_header.name) + .AppendCString(".shstrtab") + .Mark(&cfi_header.name) + .AppendCString(cfi_name) + .Mark(§ion_names_header.file_size); + + // Create the section table. The ELF header's e_shoff member refers + // to this, and the e_shnum member gives the number of entries it + // contains. + CFISection section_table(cfi.endianness(), cfi.AddressSize()); + AppendSectionHeader(§ion_table, null_header); + AppendSectionHeader(§ion_table, section_names_header); + AppendSectionHeader(§ion_table, cfi_header); + + // Append the section table and the section contents to the ELF file. + elf + .Mark(§ion_table_offset) + .Append(section_table) + .Mark(§ion_names_header.file_offset) + .Append(section_names) + .Mark(&cfi_header.file_offset) + .Append(cfi); + + string contents; + if (!elf.GetContents(&contents)) { + fprintf(stderr, "failed to get ELF file contents\n"); + exit(1); + } + + FILE *out = fopen(filename, "w"); + if (!out) { + fprintf(stderr, "error opening ELF file '%s': %s\n", + filename, strerror(errno)); + exit(1); + } + + if (fwrite(contents.data(), 1, contents.size(), out) != contents.size()) { + fprintf(stderr, "error writing ELF data to '%s': %s\n", + filename, strerror(errno)); + exit(1); + } + + if (fclose(out) == EOF) { + fprintf(stderr, "error closing ELF file '%s': %s\n", + filename, strerror(errno)); + exit(1); + } +} +#endif diff --git a/src/common/dwarf/dwarf2reader_die_unittest.cc b/src/common/dwarf/dwarf2reader_die_unittest.cc new file mode 100644 index 0000000..2b36539 --- /dev/null +++ b/src/common/dwarf/dwarf2reader_die_unittest.cc @@ -0,0 +1,968 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf2reader_die_unittest.cc: Unit tests for google_breakpad::CompilationUnit + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/dwarf/bytereader-inl.h" +#include "common/dwarf/dwarf2reader_test_common.h" +#include "common/dwarf/dwarf2reader.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +using google_breakpad::test_assembler::Endianness; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using google_breakpad::test_assembler::kBigEndian; +using google_breakpad::test_assembler::kLittleEndian; + +using google_breakpad::ByteReader; +using google_breakpad::CompilationUnit; +using google_breakpad::Dwarf2Handler; +using google_breakpad::DwarfAttribute; +using google_breakpad::DwarfForm; +using google_breakpad::DwarfHasChild; +using google_breakpad::DwarfTag; +using google_breakpad::ENDIANNESS_BIG; +using google_breakpad::ENDIANNESS_LITTLE; +using google_breakpad::SectionMap; + +using std::vector; +using testing::InSequence; +using testing::Pointee; +using testing::Return; +using testing::Sequence; +using testing::Test; +using testing::TestWithParam; +using testing::_; + +class MockDwarf2Handler: public Dwarf2Handler { + public: + MOCK_METHOD5(StartCompilationUnit, bool(uint64_t offset, uint8_t address_size, + uint8_t offset_size, + uint64_t cu_length, + uint8_t dwarf_version)); + MOCK_METHOD2(StartDIE, bool(uint64_t offset, enum DwarfTag tag)); + MOCK_METHOD4(ProcessAttributeUnsigned, void(uint64_t offset, + DwarfAttribute attr, + enum DwarfForm form, + uint64_t data)); + MOCK_METHOD4(ProcessAttributeSigned, void(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + int64_t data)); + MOCK_METHOD4(ProcessAttributeReference, void(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data)); + MOCK_METHOD5(ProcessAttributeBuffer, void(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const uint8_t* data, + uint64_t len)); + MOCK_METHOD4(ProcessAttributeString, void(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const string& data)); + MOCK_METHOD4(ProcessAttributeSignature, void(uint64_t offset, + DwarfAttribute attr, + enum DwarfForm form, + uint64_t signature)); + MOCK_METHOD1(EndDIE, void(uint64_t offset)); +}; + +struct DIEFixture { + + DIEFixture() { + // Fix the initial offset of the .debug_info and .debug_abbrev sections. + info.start() = 0; + abbrevs.start() = 0; + + // Default expectations for the data handler. + EXPECT_CALL(handler, StartCompilationUnit(_, _, _, _, _)).Times(0); + EXPECT_CALL(handler, StartDIE(_, _)).Times(0); + EXPECT_CALL(handler, ProcessAttributeUnsigned(_, _, _, _)).Times(0); + EXPECT_CALL(handler, ProcessAttributeSigned(_, _, _, _)).Times(0); + EXPECT_CALL(handler, ProcessAttributeReference(_, _, _, _)).Times(0); + EXPECT_CALL(handler, ProcessAttributeBuffer(_, _, _, _, _)).Times(0); + EXPECT_CALL(handler, ProcessAttributeString(_, _, _, _)).Times(0); + EXPECT_CALL(handler, EndDIE(_)).Times(0); + } + + // Return a reference to a section map whose .debug_info section refers + // to |info|, and whose .debug_abbrev section refers to |abbrevs|. This + // function returns a reference to the same SectionMap each time; new + // calls wipe out maps established by earlier calls. + const SectionMap& MakeSectionMap() { + // Copy the sections' contents into strings that will live as long as + // the map itself. + assert(info.GetContents(&info_contents)); + assert(abbrevs.GetContents(&abbrevs_contents)); + section_map.clear(); + section_map[".debug_info"].first + = reinterpret_cast(info_contents.data()); + section_map[".debug_info"].second = info_contents.size(); + section_map[".debug_abbrev"].first + = reinterpret_cast(abbrevs_contents.data()); + section_map[".debug_abbrev"].second = abbrevs_contents.size(); + return section_map; + } + + TestCompilationUnit info; + TestAbbrevTable abbrevs; + MockDwarf2Handler handler; + string abbrevs_contents, info_contents; + SectionMap section_map; +}; + +struct DwarfHeaderParams { + DwarfHeaderParams(Endianness endianness, size_t format_size, + int version, size_t address_size, int header_type) + : endianness(endianness), format_size(format_size), + version(version), address_size(address_size), header_type(header_type) + { } + Endianness endianness; + size_t format_size; // 4-byte or 8-byte DWARF offsets + int version; + size_t address_size; + int header_type; // DW_UT_{compile, type, partial, skeleton, etc} +}; + +class DwarfHeader: public DIEFixture, + public TestWithParam { }; + +TEST_P(DwarfHeader, Header) { + Label abbrev_table = abbrevs.Here(); + abbrevs.Abbrev(1, google_breakpad::DW_TAG_compile_unit, + google_breakpad::DW_children_yes) + .Attribute(google_breakpad::DW_AT_name, google_breakpad::DW_FORM_string) + .EndAbbrev() + .EndTable(); + + info.set_format_size(GetParam().format_size); + info.set_endianness(GetParam().endianness); + + info.Header(GetParam().version, abbrev_table, GetParam().address_size, + google_breakpad::DW_UT_compile) + .ULEB128(1) // DW_TAG_compile_unit, with children + .AppendCString("sam") // DW_AT_name, DW_FORM_string + .D8(0); // end of children + info.Finish(); + + { + InSequence s; + EXPECT_CALL(handler, + StartCompilationUnit(0, GetParam().address_size, + GetParam().format_size, _, + GetParam().version)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, StartDIE(_, google_breakpad::DW_TAG_compile_unit)) + .WillOnce(Return(true)); + EXPECT_CALL(handler, ProcessAttributeString(_, google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_string, + "sam")) + .WillOnce(Return()); + EXPECT_CALL(handler, EndDIE(_)) + .WillOnce(Return()); + } + + ByteReader byte_reader(GetParam().endianness == kLittleEndian ? + ENDIANNESS_LITTLE : ENDIANNESS_BIG); + CompilationUnit parser("", MakeSectionMap(), 0, &byte_reader, &handler); + EXPECT_EQ(parser.Start(), info_contents.size()); +} + +TEST_P(DwarfHeader, TypeUnitHeader) { + Label abbrev_table = abbrevs.Here(); + int version = 5; + abbrevs.Abbrev(1, google_breakpad::DW_TAG_type_unit, + google_breakpad::DW_children_yes) + .Attribute(google_breakpad::DW_AT_name, google_breakpad::DW_FORM_string) + .EndAbbrev() + .EndTable(); + + info.set_format_size(GetParam().format_size); + info.set_endianness(GetParam().endianness); + + info.Header(version, abbrev_table, GetParam().address_size, + google_breakpad::DW_UT_type) + .ULEB128(0x41) // DW_TAG_type_unit, with children + .AppendCString("sam") // DW_AT_name, DW_FORM_string + .D8(0); // end of children + info.Finish(); + + { + InSequence s; + EXPECT_CALL(handler, + StartCompilationUnit(0, GetParam().address_size, + GetParam().format_size, _, + version)) + .WillOnce(Return(true)); + // If the type unit is handled properly, these calls will be skipped. + EXPECT_CALL(handler, StartDIE(_, google_breakpad::DW_TAG_type_unit)) + .Times(0); + EXPECT_CALL(handler, ProcessAttributeString(_, google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_string, + "sam")) + .Times(0); + EXPECT_CALL(handler, EndDIE(_)) + .Times(0); + } + + ByteReader byte_reader(GetParam().endianness == kLittleEndian ? + ENDIANNESS_LITTLE : ENDIANNESS_BIG); + CompilationUnit parser("", MakeSectionMap(), 0, &byte_reader, &handler); + EXPECT_EQ(parser.Start(), info_contents.size()); +} + +INSTANTIATE_TEST_SUITE_P( + HeaderVariants, DwarfHeader, + ::testing::Values(DwarfHeaderParams(kLittleEndian, 4, 2, 4, 1), + DwarfHeaderParams(kLittleEndian, 4, 2, 8, 1), + DwarfHeaderParams(kLittleEndian, 4, 3, 4, 1), + DwarfHeaderParams(kLittleEndian, 4, 3, 8, 1), + DwarfHeaderParams(kLittleEndian, 4, 4, 4, 1), + DwarfHeaderParams(kLittleEndian, 4, 4, 8, 1), + DwarfHeaderParams(kLittleEndian, 8, 2, 4, 1), + DwarfHeaderParams(kLittleEndian, 8, 2, 8, 1), + DwarfHeaderParams(kLittleEndian, 8, 3, 4, 1), + DwarfHeaderParams(kLittleEndian, 8, 3, 8, 1), + DwarfHeaderParams(kLittleEndian, 8, 4, 4, 1), + DwarfHeaderParams(kLittleEndian, 8, 4, 8, 1), + DwarfHeaderParams(kLittleEndian, 8, 5, 4, 1), + DwarfHeaderParams(kLittleEndian, 8, 5, 8, 1), + DwarfHeaderParams(kBigEndian, 4, 2, 4, 1), + DwarfHeaderParams(kBigEndian, 4, 2, 8, 1), + DwarfHeaderParams(kBigEndian, 4, 3, 4, 1), + DwarfHeaderParams(kBigEndian, 4, 3, 8, 1), + DwarfHeaderParams(kBigEndian, 4, 4, 4, 1), + DwarfHeaderParams(kBigEndian, 4, 4, 8, 1), + DwarfHeaderParams(kBigEndian, 8, 2, 4, 1), + DwarfHeaderParams(kBigEndian, 8, 2, 8, 1), + DwarfHeaderParams(kBigEndian, 8, 3, 4, 1), + DwarfHeaderParams(kBigEndian, 8, 3, 8, 1), + DwarfHeaderParams(kBigEndian, 8, 4, 4, 1), + DwarfHeaderParams(kBigEndian, 8, 4, 8, 1), + DwarfHeaderParams(kBigEndian, 8, 5, 4, 1), + DwarfHeaderParams(kBigEndian, 8, 5, 8, 1))); + +struct DwarfFormsFixture: public DIEFixture { + // Start a compilation unit, as directed by |params|, containing one + // childless DIE of the given tag, with one attribute of the given name + // and form. The 'info' fixture member is left just after the abbrev + // code, waiting for the attribute value to be appended. + void StartSingleAttributeDIE(const DwarfHeaderParams& params, + DwarfTag tag, DwarfAttribute name, + DwarfForm form) { + // Create the abbreviation table. + Label abbrev_table = abbrevs.Here(); + abbrevs.Abbrev(1, tag, google_breakpad::DW_children_no) + .Attribute(name, form) + .EndAbbrev() + .EndTable(); + + // Create the compilation unit, up to the attribute value. + info.set_format_size(params.format_size); + info.set_endianness(params.endianness); + info.Header(params.version, abbrev_table, params.address_size, + google_breakpad::DW_UT_compile) + .ULEB128(1); // abbrev code + } + + // Set up handler to expect a compilation unit matching |params|, + // containing one childless DIE of the given tag, in the sequence s. Stop + // just before the expectations. + void ExpectBeginCompilationUnit(const DwarfHeaderParams& params, + DwarfTag tag, uint64_t offset=0) { + EXPECT_CALL(handler, + StartCompilationUnit(offset, params.address_size, + params.format_size, _, + params.version)) + .InSequence(s) + .WillOnce(Return(true)); + EXPECT_CALL(handler, StartDIE(_, tag)) + .InSequence(s) + .WillOnce(Return(true)); + } + + void ExpectEndCompilationUnit() { + EXPECT_CALL(handler, EndDIE(_)) + .InSequence(s) + .WillOnce(Return()); + } + + void ParseCompilationUnit(const DwarfHeaderParams& params, + uint64_t offset=0) { + ByteReader byte_reader(params.endianness == kLittleEndian ? + ENDIANNESS_LITTLE : ENDIANNESS_BIG); + CompilationUnit parser("", MakeSectionMap(), offset, &byte_reader, + &handler); + EXPECT_EQ(offset + parser.Start(), info_contents.size()); + } + + // The sequence to which the fixture's methods append expectations. + Sequence s; +}; + +struct DwarfForms: public DwarfFormsFixture, + public TestWithParam { }; + +TEST_P(DwarfForms, addr) { + StartSingleAttributeDIE(GetParam(), google_breakpad::DW_TAG_compile_unit, + google_breakpad::DW_AT_low_pc, + google_breakpad::DW_FORM_addr); + uint64_t value; + if (GetParam().address_size == 4) { + value = 0xc8e9ffcc; + info.D32(value); + } else { + value = 0xe942517fc2768564ULL; + info.D64(value); + } + info.Finish(); + + ExpectBeginCompilationUnit(GetParam(), google_breakpad::DW_TAG_compile_unit); + EXPECT_CALL(handler, ProcessAttributeUnsigned(_, google_breakpad::DW_AT_low_pc, + google_breakpad::DW_FORM_addr, + value)) + .InSequence(s) + .WillOnce(Return()); + ExpectEndCompilationUnit(); + + ParseCompilationUnit(GetParam()); +} + +TEST_P(DwarfForms, strx1) { + if (GetParam().version != 5) { + return; + } + Label abbrev_table = abbrevs.Here(); + abbrevs.Abbrev(1, google_breakpad::DW_TAG_compile_unit, + google_breakpad::DW_children_no) + .Attribute(google_breakpad::DW_AT_name, google_breakpad::DW_FORM_strx1) + .Attribute(google_breakpad::DW_AT_low_pc, google_breakpad::DW_FORM_addr) + .Attribute(google_breakpad::DW_AT_str_offsets_base, + google_breakpad::DW_FORM_sec_offset) + .EndAbbrev() + .EndTable(); + + info.set_format_size(GetParam().format_size); + info.set_endianness(GetParam().endianness); + info.Header(GetParam().version, abbrev_table, GetParam().address_size, + google_breakpad::DW_UT_compile) + .ULEB128(1) // abbrev index + .D8(2); // string index + + uint64_t value; + uint64_t offsets_base; + if (GetParam().address_size == 4) { + value = 0xc8e9ffcc; + offsets_base = 8; + info.D32(value); // low pc + info.D32(offsets_base); // str_offsets_base + } else { + value = 0xe942517fc2768564ULL; + offsets_base = 16; + info.D64(value); // low_pc + info.D64(offsets_base); // str_offsets_base + } + info.Finish(); + + Section debug_strings; + // no header, just a series of null-terminated strings. + debug_strings.AppendCString("apple"); // offset = 0 + debug_strings.AppendCString("bird"); // offset = 6 + debug_strings.AppendCString("canary"); // offset = 11 + debug_strings.AppendCString("dinosaur"); // offset = 18 + + Section str_offsets; + str_offsets.set_endianness(GetParam().endianness); + // Header for .debug_str_offsets + if (GetParam().address_size == 4) { + str_offsets.D32(24); // section length (4 bytes) + } else { + str_offsets.D32(0xffffffff); + str_offsets.D64(48); // section length (12 bytes) + } + str_offsets.D16(GetParam().version); // version (2 bytes) + str_offsets.D16(0); // padding (2 bytes) + + // .debug_str_offsets data (the offsets) + if (GetParam().address_size == 4) { + str_offsets.D32(0); + str_offsets.D32(6); + str_offsets.D32(11); + str_offsets.D32(18); + } else { + str_offsets.D64(0); + str_offsets.D64(6); + str_offsets.D64(11); + str_offsets.D64(18); + } + + + ExpectBeginCompilationUnit(GetParam(), google_breakpad::DW_TAG_compile_unit); + EXPECT_CALL(handler, ProcessAttributeString(_, google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_strx1, + "bird")) + .WillOnce(Return()); + EXPECT_CALL(handler, ProcessAttributeUnsigned(_, google_breakpad::DW_AT_low_pc, + google_breakpad::DW_FORM_addr, + value)) + .InSequence(s) + .WillOnce(Return()); + ExpectEndCompilationUnit(); + + ParseCompilationUnit(GetParam()); +} + +TEST_P(DwarfForms, block2_empty) { + StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x16e4d2f7, + (DwarfAttribute) 0xe52c4463, + google_breakpad::DW_FORM_block2); + info.D16(0); + info.Finish(); + + ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x16e4d2f7); + EXPECT_CALL(handler, ProcessAttributeBuffer(_, (DwarfAttribute) 0xe52c4463, + google_breakpad::DW_FORM_block2, + _, 0)) + .InSequence(s) + .WillOnce(Return()); + ExpectEndCompilationUnit(); + + ParseCompilationUnit(GetParam()); +} + +TEST_P(DwarfForms, block2) { + StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x16e4d2f7, + (DwarfAttribute) 0xe52c4463, + google_breakpad::DW_FORM_block2); + unsigned char data[258]; + memset(data, '*', sizeof(data)); + info.D16(sizeof(data)) + .Append(data, sizeof(data)); + info.Finish(); + + ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x16e4d2f7); + EXPECT_CALL(handler, ProcessAttributeBuffer(_, (DwarfAttribute) 0xe52c4463, + google_breakpad::DW_FORM_block2, + Pointee('*'), 258)) + .InSequence(s) + .WillOnce(Return()); + ExpectEndCompilationUnit(); + + ParseCompilationUnit(GetParam()); +} + +TEST_P(DwarfForms, flag_present) { + StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x3e449ac2, + (DwarfAttribute) 0x359d1972, + google_breakpad::DW_FORM_flag_present); + // DW_FORM_flag_present occupies no space in the DIE. + info.Finish(); + + ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x3e449ac2); + EXPECT_CALL(handler, + ProcessAttributeUnsigned(_, (DwarfAttribute) 0x359d1972, + google_breakpad::DW_FORM_flag_present, + 1)) + .InSequence(s) + .WillOnce(Return()); + ExpectEndCompilationUnit(); + + ParseCompilationUnit(GetParam()); +} + +TEST_P(DwarfForms, sec_offset) { + StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x1d971689, + (DwarfAttribute) 0xa060bfd1, + google_breakpad::DW_FORM_sec_offset); + uint64_t value; + if (GetParam().format_size == 4) { + value = 0xacc9c388; + info.D32(value); + } else { + value = 0xcffe5696ffe3ed0aULL; + info.D64(value); + } + info.Finish(); + + ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x1d971689); + EXPECT_CALL(handler, ProcessAttributeUnsigned(_, (DwarfAttribute) 0xa060bfd1, + google_breakpad::DW_FORM_sec_offset, + value)) + .InSequence(s) + .WillOnce(Return()); + ExpectEndCompilationUnit(); + + ParseCompilationUnit(GetParam()); +} + +TEST_P(DwarfForms, exprloc) { + StartSingleAttributeDIE(GetParam(), (DwarfTag) 0xb6d167bb, + (DwarfAttribute) 0xba3ae5cb, + google_breakpad::DW_FORM_exprloc); + info.ULEB128(29) + .Append(29, 173); + info.Finish(); + + ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0xb6d167bb); + EXPECT_CALL(handler, ProcessAttributeBuffer(_, (DwarfAttribute) 0xba3ae5cb, + google_breakpad::DW_FORM_exprloc, + Pointee(173), 29)) + .InSequence(s) + .WillOnce(Return()); + ExpectEndCompilationUnit(); + + ParseCompilationUnit(GetParam()); +} + +TEST_P(DwarfForms, ref_sig8) { + StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x253e7b2b, + (DwarfAttribute) 0xd708d908, + google_breakpad::DW_FORM_ref_sig8); + info.D64(0xf72fa0cb6ddcf9d6ULL); + info.Finish(); + + ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x253e7b2b); + EXPECT_CALL(handler, ProcessAttributeSignature(_, (DwarfAttribute) 0xd708d908, + google_breakpad::DW_FORM_ref_sig8, + 0xf72fa0cb6ddcf9d6ULL)) + .InSequence(s) + .WillOnce(Return()); + ExpectEndCompilationUnit(); + + ParseCompilationUnit(GetParam()); +} + +// A value passed to ProcessAttributeSignature is just an absolute number, +// not an offset within the compilation unit as most of the other +// DW_FORM_ref forms are. Check that the reader doesn't try to apply any +// offset to the signature, by reading it from a compilation unit that does +// not start at the beginning of the section. +TEST_P(DwarfForms, ref_sig8_not_first) { + info.Append(98, '*'); + StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x253e7b2b, + (DwarfAttribute) 0xd708d908, + google_breakpad::DW_FORM_ref_sig8); + info.D64(0xf72fa0cb6ddcf9d6ULL); + info.Finish(); + + ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x253e7b2b, 98); + EXPECT_CALL(handler, ProcessAttributeSignature(_, (DwarfAttribute) 0xd708d908, + google_breakpad::DW_FORM_ref_sig8, + 0xf72fa0cb6ddcf9d6ULL)) + .InSequence(s) + .WillOnce(Return()); + ExpectEndCompilationUnit(); + + ParseCompilationUnit(GetParam(), 98); +} + +TEST_P(DwarfForms, implicit_const) { + const DwarfHeaderParams& params = GetParam(); + const uint64_t implicit_constant_value = 0x1234; + // Create the abbreviation table. + Label abbrev_table = abbrevs.Here(); + abbrevs.Abbrev(1, (DwarfTag) 0x253e7b2b, google_breakpad::DW_children_no) + .Attribute((DwarfAttribute) 0xd708d908, + google_breakpad::DW_FORM_implicit_const) + .ULEB128(implicit_constant_value); + abbrevs.EndAbbrev().EndTable(); + + info.set_format_size(params.format_size); + info.set_endianness(params.endianness); + info.Header(params.version, abbrev_table, params.address_size, + google_breakpad::DW_UT_compile) + .ULEB128(1); // abbrev code + info.Finish(); + + ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x253e7b2b); + EXPECT_CALL(handler, + ProcessAttributeUnsigned(_, (DwarfAttribute) 0xd708d908, + google_breakpad::DW_FORM_implicit_const, + implicit_constant_value)) + .InSequence(s) + .WillOnce(Return()); + ExpectEndCompilationUnit(); + + ParseCompilationUnit(GetParam()); +} + +// Tests for the other attribute forms could go here. + +INSTANTIATE_TEST_SUITE_P( + HeaderVariants, DwarfForms, + ::testing::Values(DwarfHeaderParams(kLittleEndian, 4, 2, 4, 1), + DwarfHeaderParams(kLittleEndian, 4, 2, 8, 1), + DwarfHeaderParams(kLittleEndian, 4, 3, 4, 1), + DwarfHeaderParams(kLittleEndian, 4, 3, 8, 1), + DwarfHeaderParams(kLittleEndian, 4, 4, 4, 1), + DwarfHeaderParams(kLittleEndian, 4, 4, 8, 1), + DwarfHeaderParams(kLittleEndian, 8, 2, 4, 1), + DwarfHeaderParams(kLittleEndian, 8, 2, 8, 1), + DwarfHeaderParams(kLittleEndian, 8, 3, 4, 1), + DwarfHeaderParams(kLittleEndian, 8, 3, 8, 1), + DwarfHeaderParams(kLittleEndian, 8, 4, 4, 1), + DwarfHeaderParams(kLittleEndian, 8, 4, 8, 1), + DwarfHeaderParams(kBigEndian, 4, 2, 4, 1), + DwarfHeaderParams(kBigEndian, 4, 2, 8, 1), + DwarfHeaderParams(kBigEndian, 4, 3, 4, 1), + DwarfHeaderParams(kBigEndian, 4, 3, 8, 1), + DwarfHeaderParams(kBigEndian, 4, 4, 4, 1), + DwarfHeaderParams(kBigEndian, 4, 4, 8, 1), + DwarfHeaderParams(kBigEndian, 8, 2, 4, 1), + DwarfHeaderParams(kBigEndian, 8, 2, 8, 1), + DwarfHeaderParams(kBigEndian, 8, 3, 4, 1), + DwarfHeaderParams(kBigEndian, 8, 3, 8, 1), + DwarfHeaderParams(kBigEndian, 8, 4, 4, 1), + DwarfHeaderParams(kBigEndian, 8, 4, 8, 1))); + +class MockRangeListHandler: public google_breakpad::RangeListHandler { + public: + MOCK_METHOD(void, AddRange, (uint64_t begin, uint64_t end)); + MOCK_METHOD(void, Finish, ()); +}; + +TEST(RangeList, Dwarf4ReadRangeList) { + using google_breakpad::RangeListReader; + using google_breakpad::DW_FORM_sec_offset; + + // Create a dwarf4 .debug_ranges section. + google_breakpad::test_assembler::Section ranges(kBigEndian); + std::string padding_offset = "padding offset"; + ranges.Append(padding_offset); + const uint64_t section_offset = ranges.Size(); + ranges.D32(1).D32(2); // (2, 3) + ranges.D32(0xFFFFFFFF).D32(3); // base_address = 3. + ranges.D32(1).D32(2); // (4, 5) + ranges.D32(0).D32(1); // (3, 4) An out of order entry is legal. + ranges.D32(0).D32(0); // End of range. + + std::string section_contents; + ranges.GetContents(§ion_contents); + + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetAddressSize(4); + + RangeListReader::CURangesInfo cu_info; + // Only set the fields that matter for dwarf 4. + cu_info.version_ = 4; + cu_info.base_address_ = 1; + cu_info.buffer_ = reinterpret_cast(section_contents.data()); + cu_info.size_ = section_contents.size(); + + MockRangeListHandler handler; + google_breakpad::RangeListReader range_list_reader(&byte_reader, &cu_info, + &handler); + EXPECT_CALL(handler, AddRange(2, 3)); + EXPECT_CALL(handler, AddRange(4, 5)); + EXPECT_CALL(handler, AddRange(3, 4)); + EXPECT_CALL(handler, Finish()); + EXPECT_TRUE(range_list_reader.ReadRanges(DW_FORM_sec_offset, + section_offset)); +} + +TEST(RangeList, Dwarf5ReadRangeList_rnglists) { + using google_breakpad::RangeListReader; + using google_breakpad::DW_RLE_base_addressx; + using google_breakpad::DW_RLE_startx_endx; + using google_breakpad::DW_RLE_startx_length; + using google_breakpad::DW_RLE_offset_pair; + using google_breakpad::DW_RLE_end_of_list; + using google_breakpad::DW_RLE_base_address; + using google_breakpad::DW_RLE_start_end; + using google_breakpad::DW_RLE_start_length; + using google_breakpad::DW_FORM_sec_offset; + using google_breakpad::DW_FORM_rnglistx; + + // Size of header + const uint64_t header_size = 12; + // Size of length field in header + const uint64_t length_size = 4; + + // .debug_addr for the indexed entries like startx. + Section addr; + addr.set_endianness(kBigEndian); + // Test addr_base handling with a padding address at 0. + addr.D32(0).D32(1).D32(2).D32(3).D32(4); + std::string addr_contents; + assert(addr.GetContents(&addr_contents)); + + // .debug_rnglists is the dwarf 5 section. + Section rnglists1(kBigEndian); + Section rnglists2(kBigEndian); + + // First header and body. + Label section_size1; + rnglists1.Append(kBigEndian, length_size, section_size1); + rnglists1.D16(5); // Version + rnglists1.D8(4); // Address size + rnglists1.D8(0); // Segment selector size + rnglists1.D32(2); // Offset entry count + const uint64_t ranges_base_1 = rnglists1.Size(); + + // Offset entries. + Label range0; + rnglists1.Append(kBigEndian, 4, range0); + Label range1; + rnglists1.Append(kBigEndian, 4, range1); + + // Range 0 (will be read via DW_AT_ranges, DW_FORM_rnglistx). + range0 = rnglists1.Size() - header_size; + rnglists1.D8(DW_RLE_base_addressx).ULEB128(0); // base_addr = 1 + rnglists1.D8(DW_RLE_startx_endx).ULEB128(1).ULEB128(2); // [2, 3) + rnglists1.D8(DW_RLE_startx_length).ULEB128(3).ULEB128(1); // [4, 5) + rnglists1.D8(DW_RLE_offset_pair).ULEB128(5).ULEB128(6); // [6, 7) + rnglists1.D8(DW_RLE_end_of_list); + + // Range 1 (will be read via DW_AT_ranges, DW_FORM_rnglistx). + range1 = rnglists1.Size() - header_size; + rnglists1.D8(DW_RLE_base_address).D32(8); // base_addr = 8 + rnglists1.D8(DW_RLE_offset_pair).ULEB128(1).ULEB128(2); // [9, 10) + rnglists1.D8(DW_RLE_start_end).D32(10).D32(11); // [10, 11) + rnglists1.D8(DW_RLE_start_length).D32(12).ULEB128(1); // [12, 13) + rnglists1.D8(DW_RLE_end_of_list); + // The size doesn't include the size of length field itself. + section_size1 = rnglists1.Size() - length_size; + + // Second header and body. + Label section_size2; + rnglists2.Append(kBigEndian, length_size, section_size2); + rnglists2.D16(5); // Version + rnglists2.D8(4); // Address size + rnglists2.D8(0); // Segment selector size + rnglists2.D32(2); // Offset entry count + const uint64_t ranges_base_2 = rnglists1.Size() + rnglists2.Size(); + + // Offset entries. + Label range2; + rnglists2.Append(kBigEndian, 4, range2); + Label range3; + rnglists2.Append(kBigEndian, 4, range3); + + // Range 2 (will be read via DW_AT_ranges, DW_FORM_sec_offset). + range2 = rnglists2.Size() - header_size; + rnglists2.D8(DW_RLE_base_addressx).ULEB128(0); // base_addr = 1 + rnglists2.D8(DW_RLE_startx_endx).ULEB128(1).ULEB128(2); // [2, 3) + rnglists2.D8(DW_RLE_startx_length).ULEB128(3).ULEB128(1); // [4, 5) + rnglists2.D8(DW_RLE_offset_pair).ULEB128(5).ULEB128(6); // [6, 7) + rnglists2.D8(DW_RLE_end_of_list); + + // Range 3 (will be read via DW_AT_ranges, DW_FORM_rnglistx). + range3 = rnglists2.Size() - header_size; + rnglists2.D8(DW_RLE_base_address).D32(15); // base_addr = 15 + rnglists2.D8(DW_RLE_offset_pair).ULEB128(1).ULEB128(2); // [16, 17) + rnglists2.D8(DW_RLE_start_end).D32(17).D32(18); // [17, 18) + rnglists2.D8(DW_RLE_start_length).D32(19).ULEB128(1); // [19, 20) + rnglists2.D8(DW_RLE_end_of_list); + // The size doesn't include the size of length field itself. + section_size2 = rnglists2.Size() - length_size; + + rnglists1.Append(rnglists2); + string rnglists_contents; + assert(rnglists1.GetContents(&rnglists_contents)); + + RangeListReader::CURangesInfo cu_info; + cu_info.version_ = 5; + cu_info.base_address_ = 1; + cu_info.ranges_base_ = ranges_base_1; + cu_info.buffer_ = + reinterpret_cast(rnglists_contents.data()); + cu_info.size_ = rnglists_contents.size(); + cu_info.addr_buffer_ = + reinterpret_cast(addr_contents.data()); + cu_info.addr_buffer_size_ = addr_contents.size(); + cu_info.addr_base_ = 4; + + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetOffsetSize(4); + byte_reader.SetAddressSize(4); + MockRangeListHandler handler; + google_breakpad::RangeListReader range_list_reader1(&byte_reader, &cu_info, + &handler); + EXPECT_CALL(handler, AddRange(2, 3)); + EXPECT_CALL(handler, AddRange(4, 5)); + EXPECT_CALL(handler, AddRange(6, 7)); + EXPECT_CALL(handler, AddRange(9, 10)); + EXPECT_CALL(handler, AddRange(10, 11)); + EXPECT_CALL(handler, AddRange(12, 13)); + EXPECT_CALL(handler, Finish()).Times(2); + EXPECT_TRUE(range_list_reader1.ReadRanges(DW_FORM_rnglistx, 0)); + EXPECT_TRUE(range_list_reader1.ReadRanges(DW_FORM_rnglistx, 1)); + // Out of range index, should result in no calls. + EXPECT_FALSE(range_list_reader1.ReadRanges(DW_FORM_rnglistx, 2)); + + // Set to new ranges_base + cu_info.ranges_base_ = ranges_base_2; + google_breakpad::RangeListReader range_list_reader2(&byte_reader, &cu_info, + &handler); + EXPECT_CALL(handler, AddRange(2, 3)); + EXPECT_CALL(handler, AddRange(4, 5)); + EXPECT_CALL(handler, AddRange(6, 7)); + EXPECT_CALL(handler, AddRange(16, 17)); + EXPECT_CALL(handler, AddRange(17, 18)); + EXPECT_CALL(handler, AddRange(19, 20)); + EXPECT_CALL(handler, Finish()).Times(2); + EXPECT_TRUE(range_list_reader2.ReadRanges(DW_FORM_rnglistx, 0)); + EXPECT_TRUE(range_list_reader2.ReadRanges(DW_FORM_rnglistx, 1)); + // Out of range index, should result in no calls. + EXPECT_FALSE(range_list_reader2.ReadRanges(DW_FORM_rnglistx, 2)); +} + +TEST(RangeList, Dwarf5ReadRangeList_sec_offset) { + using google_breakpad::RangeListReader; + using google_breakpad::DW_RLE_base_addressx; + using google_breakpad::DW_RLE_startx_endx; + using google_breakpad::DW_RLE_startx_length; + using google_breakpad::DW_RLE_offset_pair; + using google_breakpad::DW_RLE_end_of_list; + using google_breakpad::DW_RLE_base_address; + using google_breakpad::DW_RLE_start_end; + using google_breakpad::DW_RLE_start_length; + using google_breakpad::DW_FORM_sec_offset; + using google_breakpad::DW_FORM_rnglistx; + + // Size of length field in header + const uint64_t length_size = 4; + + // .debug_addr for the indexed entries like startx. + Section addr; + addr.set_endianness(kBigEndian); + // Test addr_base handling with a padding address at 0. + addr.D32(0).D32(1).D32(2).D32(3).D32(4).D32(21).D32(22); + std::string addr_contents; + assert(addr.GetContents(&addr_contents)); + + // .debug_rnglists is the dwarf 5 section. + Section rnglists1(kBigEndian); + Section rnglists2(kBigEndian); + + // First header and body. + Label section_size1; + rnglists1.Append(kBigEndian, length_size, section_size1); + rnglists1.D16(5); // Version + rnglists1.D8(4); // Address size + rnglists1.D8(0); // Segment selector size + rnglists1.D32(0); // Offset entry count + + const uint64_t offset1 = rnglists1.Size(); + + rnglists1.D8(DW_RLE_base_addressx).ULEB128(0); // base_addr = 1 + rnglists1.D8(DW_RLE_startx_endx).ULEB128(1).ULEB128(2); // [2, 3) + rnglists1.D8(DW_RLE_startx_length).ULEB128(3).ULEB128(1); // [4, 5) + rnglists1.D8(DW_RLE_offset_pair).ULEB128(5).ULEB128(6); // [6, 7) + rnglists1.D8(DW_RLE_base_address).D32(8); // base_addr = 8 + rnglists1.D8(DW_RLE_offset_pair).ULEB128(1).ULEB128(2); // [9, 10) + rnglists1.D8(DW_RLE_start_end).D32(10).D32(11); // [10, 11) + rnglists1.D8(DW_RLE_start_length).D32(12).ULEB128(1); // [12, 13) + rnglists1.D8(DW_RLE_end_of_list); + // The size doesn't include the size of length field itself. + section_size1 = rnglists1.Size() - length_size; + + // Second header and body. + Label section_size2; + rnglists2.Append(kBigEndian, length_size, section_size2); + rnglists2.D16(5); // Version + rnglists2.D8(4); // Address size + rnglists2.D8(0); // Segment selector size + rnglists2.D32(0); // Offset entry count + + const uint64_t offset2 = rnglists1.Size() + rnglists2.Size(); + + rnglists2.D8(DW_RLE_base_addressx).ULEB128(0); // base_addr = 1 + rnglists2.D8(DW_RLE_startx_endx).ULEB128(1).ULEB128(2); // [2, 3) + rnglists2.D8(DW_RLE_startx_length).ULEB128(3).ULEB128(1); // [4, 5) + rnglists2.D8(DW_RLE_offset_pair).ULEB128(5).ULEB128(6); // [6, 7) + rnglists2.D8(DW_RLE_base_address).D32(15); // base_addr = 15 + rnglists2.D8(DW_RLE_offset_pair).ULEB128(1).ULEB128(2); // [16, 17) + rnglists2.D8(DW_RLE_start_end).D32(17).D32(18); // [17, 18) + rnglists2.D8(DW_RLE_start_length).D32(19).ULEB128(1); // [19, 20) + rnglists2.D8(DW_RLE_end_of_list); + // The size doesn't include the size of length field itself. + section_size2 = rnglists2.Size() - length_size; + + rnglists1.Append(rnglists2); + string rnglists_contents; + assert(rnglists1.GetContents(&rnglists_contents)); + + RangeListReader::CURangesInfo cu_info; + cu_info.version_ = 5; + cu_info.base_address_ = 1; + cu_info.buffer_ = + reinterpret_cast(rnglists_contents.data()); + cu_info.size_ = rnglists_contents.size(); + cu_info.addr_buffer_ = + reinterpret_cast(addr_contents.data()); + cu_info.addr_buffer_size_ = addr_contents.size(); + cu_info.addr_base_ = 4; + + ByteReader byte_reader(ENDIANNESS_BIG); + byte_reader.SetOffsetSize(4); + byte_reader.SetAddressSize(4); + MockRangeListHandler handler; + google_breakpad::RangeListReader range_list_reader(&byte_reader, &cu_info, + &handler); + EXPECT_CALL(handler, AddRange(2, 3)); + EXPECT_CALL(handler, AddRange(4, 5)); + EXPECT_CALL(handler, AddRange(6, 7)); + EXPECT_CALL(handler, AddRange(9, 10)); + EXPECT_CALL(handler, AddRange(10, 11)); + EXPECT_CALL(handler, AddRange(12, 13)); + EXPECT_CALL(handler, Finish()).Times(1); + EXPECT_TRUE(range_list_reader.ReadRanges(DW_FORM_sec_offset, offset1)); + // Out of range index, should result in no calls. + EXPECT_FALSE(range_list_reader.ReadRanges(DW_FORM_sec_offset, + rnglists_contents.size())); + + EXPECT_CALL(handler, AddRange(2, 3)); + EXPECT_CALL(handler, AddRange(4, 5)); + EXPECT_CALL(handler, AddRange(6, 7)); + EXPECT_CALL(handler, AddRange(16, 17)); + EXPECT_CALL(handler, AddRange(17, 18)); + EXPECT_CALL(handler, AddRange(19, 20)); + EXPECT_CALL(handler, Finish()).Times(1); + EXPECT_TRUE(range_list_reader.ReadRanges(DW_FORM_sec_offset, offset2)); + // Out of range index, should result in no calls. + EXPECT_FALSE(range_list_reader.ReadRanges(DW_FORM_sec_offset, + rnglists_contents.size())); +} diff --git a/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc b/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc new file mode 100644 index 0000000..7de627d --- /dev/null +++ b/src/common/dwarf/dwarf2reader_lineinfo_unittest.cc @@ -0,0 +1,190 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Sterling Augustine + +// dwarf2reader_lineinfo_unittest.cc: Unit tests for google_breakpad::LineInfo + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/dwarf/bytereader.h" +#include "common/dwarf/dwarf2reader.h" +#include "google_breakpad/common/breakpad_types.h" + +using std::vector; +using testing::InSequence; +using testing::Return; +using testing::Sequence; +using testing::Test; +using testing::_; + +using namespace google_breakpad; + +namespace { + +const uint8_t dwarf5_line_program[] = { + 0x40, 0x0, 0x0, 0x0, // unit_length (end - begin) + // begin + 0x05, 0x0, // version + 0x8, // address_size + 0x0, // segment_selector_size + 0x26, 0x0, 0x0, 0x0, // header_length (end_header_end - begin_header) + // begin_header: + 0x1, // minimum_instruction_length + 0x1, // maximum_operations_per_instruction + 0x1, // default_is_stmt + 0xfb, // line_base + 0xe, // line_range + 0xd, // opcode_base and lengths + 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, + 0x1, // directory entry format count + DW_LNCT_path, DW_FORM_strp, + 0x1, // directories count + 0x1, 0x0, 0x0, 0x0, // offset into .debug_line_str + 0x2, // file_name_entry_format_count + DW_LNCT_directory_index, DW_FORM_data1, + DW_LNCT_path, DW_FORM_line_strp, + 0x1, // filename count + 0x0, // directory index + 0x1, 0x0, 0x0, 0x0, // offset into .debug_str + // end_header + DW_LNS_set_file, 0x0, + // set address to 0x0 + 0x0, 0x9, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + // Advance Address by 0 and line by 3 + 0x15, + // Advance PC by 1 + 0x2, 0x1, + 0x0, + DW_LNE_end_sequence, + DW_LNE_end_sequence, + // end +}; + +const uint8_t dwarf4_line_program[] = { + 0x37, 0x0, 0x0, 0x0, // unit_length (end - begin) + // begin + 0x04, 0x0, // version + 0x1d, 0x0, 0x0, 0x0, // header_length (end_header - begin_header) + // begin_header: + 0x1, // minimum_instruction_length + 0x1, // maximum_operations_per_instruction + 0x1, // default_is_stmt + 0xfb, // line_base + 0xe, // line_range + 0xd, // opcode_base and lengths + 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, + '/', 'a', '\0', // directory entry 1 (zeroth entry implied) + '\0', // end of directory table + 'b', '/', 'c', '\0', // file entry 1 (zeroth entry implied) + 0, // file 1 directory + 0, // file 1 modification time + 0, // file 1 length + '\0', // end of file table + // end_header + DW_LNS_set_file, 0x0, + // set address to 0x0 + 0x0, 0x9, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + // Advance Address by 0 and line by 3 + 0x15, + // Advance PC by 1 + 0x2, 0x1, + 0x0, + DW_LNE_end_sequence, + DW_LNE_end_sequence, + // end +}; + +class MockLineInfoHandler: public LineInfoHandler { + public: + MOCK_METHOD(void, DefineDir, (const string&, uint32_t dir_num), (override)); + MOCK_METHOD(void, DefineFile, (const string& name, int32_t file_num, + uint32_t dir_num, uint64_t mod_time, + uint64_t length), (override)); + MOCK_METHOD(void, AddLine, (uint64_t address, uint64_t length, + uint32_t file_num, uint32_t line_num, + uint32_t column_num), (override)); +}; + +const uint8_t string_section[] = {'x', '/', 'a', '\0'}; +const uint8_t line_string_section[] = {'x', 'b', '/', 'c', '\0' }; + +struct LineProgram: public Test { + MockLineInfoHandler handler_; +}; + +TEST_F(LineProgram, ReadLinesDwarf5) { + ByteReader byte_reader(ENDIANNESS_LITTLE); + // LineTables don't specify the offset size like Compilation Units do. + byte_reader.SetOffsetSize(4); + LineInfo line_reader(dwarf5_line_program, + sizeof(dwarf5_line_program), + &byte_reader, + string_section, + sizeof(string_section), + line_string_section, + sizeof(line_string_section), + &handler_); + EXPECT_CALL(handler_, DefineDir("/a", 0)).Times(1); + EXPECT_CALL(handler_, DefineFile("b/c", 0, 0, 0, 0)).Times(1); + EXPECT_CALL(handler_, AddLine(0, 1, 0, 4, 0)).Times(1); + EXPECT_EQ(line_reader.Start(), sizeof(dwarf5_line_program)); +} + +TEST_F(LineProgram, ReadLinesDwarf4) { + ByteReader byte_reader(ENDIANNESS_LITTLE); + // LineTables don't specify the offset size like Compilation Units do. + byte_reader.SetOffsetSize(4); + // dwarf4 line info headers don't encode the address size. + byte_reader.SetAddressSize(8); + LineInfo line_reader(dwarf4_line_program, + sizeof(dwarf4_line_program), + &byte_reader, + // dwarf4 line tables can't access the string sections + // so pass values likely to make assertions fail if + // the code uses them improperly. + nullptr, 0, nullptr, 0, + &handler_); + EXPECT_CALL(handler_, DefineDir("", 0)).Times(1); + EXPECT_CALL(handler_, DefineDir("/a", 1)).Times(1); + EXPECT_CALL(handler_, DefineFile("", 0, 0, 0, 0)).Times(1); + EXPECT_CALL(handler_, DefineFile("b/c", 1, 0, 0, 0)).Times(1); + EXPECT_CALL(handler_, AddLine(0, 1, 0, 4, 0)).Times(1); + EXPECT_EQ(line_reader.Start(), sizeof(dwarf4_line_program)); +} + +} // anonymous namespace diff --git a/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc b/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc new file mode 100644 index 0000000..12b27e6 --- /dev/null +++ b/src/common/dwarf/dwarf2reader_splitfunctions_unittest.cc @@ -0,0 +1,129 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Snehasish Kumar + +// dwarf2reader_splitfunctions_unittest.cc: Unit tests for with a focus on debug +// information generated when with splitting optimizations such as +// -fsplit-machine-functions (clang) -freorder-blocks-and-partition (gcc). + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "common/dwarf/bytereader.h" +#include "common/dwarf/dwarf2reader.h" +#include "google_breakpad/common/breakpad_types.h" + +using testing::_; +using namespace google_breakpad; + +namespace { + +class MockLineInfoHandler: public LineInfoHandler { + public: + MOCK_METHOD(void, DefineFile, (const string& name, int32_t file_num, + uint32_t dir_num, uint64_t mod_time, + uint64_t length), (override)); + MOCK_METHOD(void, AddLine, (uint64_t address, uint64_t length, + uint32_t file_num, uint32_t line_num, + uint32_t column_num), (override)); +}; + +struct LineProgram: public testing::Test { + MockLineInfoHandler handler_; +}; + +// The debug information is generated from the following program -- +// $ cat -n split_functions.c +// 1 #include +// 2 +// 3 __attribute__((noinline)) int foo(int i) { +// 4 if (i % 100) { +// 5 return i + 1; +// 6 } else { +// 7 return i * 10 % 3; +// 8 } +// 9 } +// 10 +// 11 +// 12 int main(int argc, char *argv[]) { +// 13 int total = 0; +// 14 for (int i = 0; i < 1000; ++i) { +// 15 total += foo(i); +// 16 } +// 17 printf("%d\n", total); +// 18 } +// +// $ bin/clang -fprofile-generate -O2 split_functions.c +// $ ./a.out > /dev/null +// $ bin/llvm-profdata merge -o default.profdata default_*.profraw +// $ bin/clang -fprofile-use -O2 -gmlt -gdwarf-5 -fsplit-machine-functions \ +// split_functions.c -o split.out +// +// For the test we pick the first instruction in foo.cold which should be the +// else part of the function foo above. + +const uint8_t debug_line[] = { + 0xb0,0x0,0x0,0x0,0x5,0x0,0x8,0x0,0x37,0x0,0x0,0x0,0x1,0x1,0x1,0xfb,0xe,0xd,0x0,0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x1,0x1,0x1,0x1f,0x1,0x0,0x0,0x0,0x0,0x3,0x1,0x1f,0x2,0xf,0x5,0x1e,0x1,0x3d,0x0,0x0,0x0,0x0,0x24,0xb2,0xb6,0xb5,0xbb,0xf,0xf7,0x6d,0x27,0x92,0xab,0x55,0x3a,0x29,0x48,0x81,0x4,0x0,0x0,0x9,0x2,0x40,0x10,0x40,0x0,0x0,0x0,0x0,0x0,0x14,0x5,0x9,0xa,0x2f,0x5,0x7,0x6,0x8,0x4a,0x5,0xe,0x6,0x67,0x5,0x1,0x40,0x5,0x0,0xf5,0x5,0xe,0xa,0xf5,0x5,0xb,0x6,0x74,0x5,0x1d,0x6,0x2d,0x5,0x15,0x6,0x3c,0x5,0x3,0x66,0x2,0x7,0x0,0x1,0x1,0x4,0x0,0x5,0xe,0x0,0x9,0x2,0x84,0x11,0x40,0x0,0x0,0x0,0x0,0x0,0x18,0x5,0x13,0x6,0x58,0x5,0x1,0x6,0x8,0xa0,0x2,0x1,0x0,0x1,0x1,0x4,0x0,0x5,0x3,0x0,0x9,0x2,0xa5,0x11,0x40,0x0,0x0,0x0,0x0,0x0,0x3,0x10,0x1,0x5,0x1,0xd7,0x2,0x9,0x0,0x1,0x1 +}; + +const uint8_t debug_str[] = { + 0x63,0x6c,0x61,0x6e,0x67,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x31,0x32,0x2e,0x30,0x2e,0x30,0x20,0x28,0x67,0x69,0x74,0x40,0x67,0x69,0x74,0x68,0x75,0x62,0x2e,0x63,0x6f,0x6d,0x3a,0x6c,0x6c,0x76,0x6d,0x2f,0x6c,0x6c,0x76,0x6d,0x2d,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x2e,0x67,0x69,0x74,0x20,0x63,0x37,0x35,0x61,0x30,0x61,0x31,0x65,0x39,0x64,0x63,0x32,0x39,0x62,0x65,0x34,0x65,0x30,0x30,0x64,0x33,0x37,0x64,0x30,0x64,0x30,0x30,0x32,0x38,0x38,0x61,0x66,0x63,0x31,0x61,0x36,0x31,0x35,0x33,0x66,0x29,0x0,0x73,0x70,0x6c,0x69,0x74,0x5f,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x73,0x2e,0x63,0x0,0x2f,0x75,0x73,0x72,0x2f,0x6c,0x6f,0x63,0x61,0x6c,0x2f,0x67,0x6f,0x6f,0x67,0x6c,0x65,0x2f,0x68,0x6f,0x6d,0x65,0x2f,0x73,0x6e,0x65,0x68,0x61,0x73,0x69,0x73,0x68,0x6b,0x2f,0x77,0x6f,0x72,0x6b,0x69,0x6e,0x67,0x2f,0x6c,0x6c,0x76,0x6d,0x2d,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x2f,0x62,0x75,0x69,0x6c,0x64,0x0,0x66,0x6f,0x6f,0x0,0x69,0x6e,0x74,0x0,0x6d,0x61,0x69,0x6e,0x0,0x69,0x0,0x61,0x72,0x67,0x63,0x0,0x61,0x72,0x67,0x76,0x0,0x63,0x68,0x61,0x72,0x0,0x74,0x6f,0x74,0x61,0x6c,0x0 +}; + +const uint8_t debug_line_str[] = { + 0x2f,0x75,0x73,0x72,0x2f,0x6c,0x6f,0x63,0x61,0x6c,0x2f,0x67,0x6f,0x6f,0x67,0x6c,0x65,0x2f,0x68,0x6f,0x6d,0x65,0x2f,0x73,0x6e,0x65,0x68,0x61,0x73,0x69,0x73,0x68,0x6b,0x2f,0x77,0x6f,0x72,0x6b,0x69,0x6e,0x67,0x2f,0x6c,0x6c,0x76,0x6d,0x2d,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x2f,0x62,0x75,0x69,0x6c,0x64,0x0,0x73,0x70,0x6c,0x69,0x74,0x5f,0x66,0x75,0x6e,0x63,0x74,0x69,0x6f,0x6e,0x73,0x2e,0x63,0x0 +}; + +TEST_F(LineProgram, ReadLinesSplitFunctions) { + ByteReader byte_reader(ENDIANNESS_LITTLE); + // LineTables don't specify the offset size like Compilation Units do. + byte_reader.SetOffsetSize(4); + LineInfo line_reader(debug_line, + sizeof(debug_line), + &byte_reader, + debug_str, + sizeof(debug_str), + debug_line_str, + sizeof(debug_line_str), + &handler_); + EXPECT_CALL(handler_, DefineFile("split_functions.c", 0, 0, 0, 0)).Times(1); + EXPECT_CALL(handler_, AddLine(_, _, _, _, _)).Times(testing::AtLeast(1)); + // Pick the first address from the foo.cold symbol and check the line number. + EXPECT_CALL(handler_, AddLine(testing::Eq(0x401184lu), _, _, /*line_num*/ 7, _)).Times(1); + EXPECT_EQ(line_reader.Start(), sizeof(debug_line)); +} + +} // anonymous namespace diff --git a/src/common/dwarf/dwarf2reader_test_common.h b/src/common/dwarf/dwarf2reader_test_common.h new file mode 100644 index 0000000..1c45d52 --- /dev/null +++ b/src/common/dwarf/dwarf2reader_test_common.h @@ -0,0 +1,163 @@ +// -*- mode: c++ -*- + +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf2reader_test_common.h: Define TestCompilationUnit and +// TestAbbrevTable, classes for creating properly (and improperly) +// formatted DWARF compilation unit data for unit tests. + +#ifndef COMMON_DWARF_DWARF2READER_TEST_COMMON_H__ +#define COMMON_DWARF_DWARF2READER_TEST_COMMON_H__ + +#include "common/test_assembler.h" +#include "common/dwarf/dwarf2enums.h" + +// A subclass of test_assembler::Section, specialized for constructing +// DWARF compilation units. +class TestCompilationUnit: public google_breakpad::test_assembler::Section { + public: + typedef google_breakpad::DwarfTag DwarfTag; + typedef google_breakpad::DwarfAttribute DwarfAttribute; + typedef google_breakpad::DwarfForm DwarfForm; + typedef google_breakpad::test_assembler::Label Label; + + // Set the section's DWARF format size (the 32-bit DWARF format or the + // 64-bit DWARF format, for lengths and section offsets --- not the + // address size) to format_size. + void set_format_size(size_t format_size) { + assert(format_size == 4 || format_size == 8); + format_size_ = format_size; + } + + // Append a DWARF section offset value, of the appropriate size for this + // compilation unit. + template + void SectionOffset(T offset) { + if (format_size_ == 4) + D32(offset); + else + D64(offset); + } + + // Append a DWARF compilation unit header to the section, with the given + // DWARF version, abbrev table offset, and address size. + TestCompilationUnit& Header(int version, const Label& abbrev_offset, + size_t address_size, int header_type) { + if (format_size_ == 4) { + D32(length_); + } else { + D32(0xffffffff); + D64(length_); + } + post_length_offset_ = Size(); + D16(version); + if (version <= 4) { + SectionOffset(abbrev_offset); + D8(address_size); + } else { + D8(header_type); // DW_UT_compile, DW_UT_type, etc. + D8(address_size); + SectionOffset(abbrev_offset); + if (header_type == google_breakpad::DW_UT_type) { + uint64_t dummy_type_signature = 0xdeadbeef; + uint64_t dummy_type_offset = 0x2b; + D64(dummy_type_signature); + if (format_size_ == 4) + D32(dummy_type_offset); + else + D64(dummy_type_offset); + } + } + return *this; + } + + // Mark the end of this header's DIEs. + TestCompilationUnit& Finish() { + length_ = Size() - post_length_offset_; + return *this; + } + + private: + // The DWARF format size for this compilation unit. + size_t format_size_; + + // The offset of the point in the compilation unit header immediately + // after the initial length field. + uint64_t post_length_offset_; + + // The length of the compilation unit, not including the initial length field. + Label length_; +}; + +// A subclass of test_assembler::Section specialized for constructing DWARF +// abbreviation tables. +class TestAbbrevTable: public google_breakpad::test_assembler::Section { + public: + typedef google_breakpad::DwarfTag DwarfTag; + typedef google_breakpad::DwarfAttribute DwarfAttribute; + typedef google_breakpad::DwarfForm DwarfForm; + typedef google_breakpad::DwarfHasChild DwarfHasChild; + typedef google_breakpad::test_assembler::Label Label; + + // Start a new abbreviation table entry for abbreviation code |code|, + // encoding a DIE whose tag is |tag|, and which has children if and only + // if |has_children| is true. + TestAbbrevTable& Abbrev(int code, DwarfTag tag, DwarfHasChild has_children) { + assert(code != 0); + ULEB128(code); + ULEB128(static_cast(tag)); + D8(static_cast(has_children)); + return *this; + }; + + // Add an attribute to the current abbreviation code whose name is |name| + // and whose form is |form|. + TestAbbrevTable& Attribute(DwarfAttribute name, DwarfForm form) { + ULEB128(static_cast(name)); + ULEB128(static_cast(form)); + return *this; + } + + // Finish the current abbreviation code. + TestAbbrevTable& EndAbbrev() { + ULEB128(0); + ULEB128(0); + return *this; + } + + // Finish the current abbreviation table. + TestAbbrevTable& EndTable() { + ULEB128(0); + return *this; + } +}; + +#endif // COMMON_DWARF_DWARF2READER_TEST_COMMON_H__ diff --git a/src/common/dwarf/elf_reader.cc b/src/common/dwarf/elf_reader.cc new file mode 100644 index 0000000..31deb9d --- /dev/null +++ b/src/common/dwarf/elf_reader.cc @@ -0,0 +1,1302 @@ +// Copyright 2005 Google LLC +// Author: chatham@google.com (Andrew Chatham) +// Author: satorux@google.com (Satoru Takabayashi) +// +// Code for reading in ELF files. +// +// For information on the ELF format, see +// http://www.x86.org/ftp/manuals/tools/elf.pdf +// +// I also liked: +// http://www.caldera.com/developers/gabi/1998-04-29/contents.html +// +// A note about types: When dealing with the file format, we use types +// like Elf32_Word, but in the public interfaces we treat all +// addresses as uint64. As a result, we should be able to symbolize +// 64-bit binaries from a 32-bit process (which we don't do, +// anyway). size_t should therefore be avoided, except where required +// by things like mmap(). +// +// Although most of this code can deal with arbitrary ELF files of +// either word size, the public ElfReader interface only examines +// files loaded into the current address space, which must all match +// the machine's native word size. This code cannot handle ELF files +// with a non-native byte ordering. +// +// TODO(chatham): It would be nice if we could accomplish this task +// without using malloc(), so we could use it as the process is dying. + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE // needed for pread() +#endif + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +// TODO(saugustine): Add support for compressed debug. +// Also need to add configure tests for zlib. +//#include "zlib.h" + +#include "third_party/musl/include/elf.h" +#include "elf_reader.h" +#include "common/using_std_string.h" + +// EM_AARCH64 is not defined by elf.h of GRTE v3 on x86. +// TODO(dougkwan): Remove this when v17 is retired. +#if !defined(EM_AARCH64) +#define EM_AARCH64 183 /* ARM AARCH64 */ +#endif + +// Map Linux macros to their Apple equivalents. +#if __APPLE__ +#ifndef __LITTLE_ENDIAN +#define __LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ +#endif // __LITTLE_ENDIAN +#ifndef __BIG_ENDIAN +#define __BIG_ENDIAN __ORDER_BIG_ENDIAN__ +#endif // __BIG_ENDIAN +#ifndef __BYTE_ORDER +#define __BYTE_ORDER __BYTE_ORDER__ +#endif // __BYTE_ORDER +#endif // __APPLE__ + +// TODO(dthomson): Can be removed once all Java code is using the Google3 +// launcher. We need to avoid processing PLT functions as it causes memory +// fragmentation in malloc, which is fixed in tcmalloc - and if the Google3 +// launcher is used the JVM will then use tcmalloc. b/13735638 +//DEFINE_bool(elfreader_process_dynsyms, true, +// "Activate PLT function processing"); + +using std::vector; + +namespace { + +// The lowest bit of an ARM symbol value is used to indicate a Thumb address. +const int kARMThumbBitOffset = 0; + +// Converts an ARM Thumb symbol value to a true aligned address value. +template +T AdjustARMThumbSymbolValue(const T& symbol_table_value) { + return symbol_table_value & ~(1 << kARMThumbBitOffset); +} + +// Names of PLT-related sections. +const char kElfPLTRelSectionName[] = ".rel.plt"; // Use Rel struct. +const char kElfPLTRelaSectionName[] = ".rela.plt"; // Use Rela struct. +const char kElfPLTSectionName[] = ".plt"; +const char kElfDynSymSectionName[] = ".dynsym"; + +const int kX86PLTCodeSize = 0x10; // Size of one x86 PLT function in bytes. +const int kARMPLTCodeSize = 0xc; +const int kAARCH64PLTCodeSize = 0x10; + +const int kX86PLT0Size = 0x10; // Size of the special PLT0 entry. +const int kARMPLT0Size = 0x14; +const int kAARCH64PLT0Size = 0x20; + +// Suffix for PLT functions when it needs to be explicitly identified as such. +const char kPLTFunctionSuffix[] = "@plt"; + +// Replace callsites of this function to std::string_view::starts_with after +// adopting C++20. +bool StringViewStartsWith(std::string_view sv, std::string_view prefix) { + return sv.compare(0, prefix.size(), prefix) == 0; +} + +} // namespace + +namespace google_breakpad { + +template class ElfReaderImpl; + +// 32-bit and 64-bit ELF files are processed exactly the same, except +// for various field sizes. Elf32 and Elf64 encompass all of the +// differences between the two formats, and all format-specific code +// in this file is templated on one of them. +class Elf32 { + public: + typedef Elf32_Ehdr Ehdr; + typedef Elf32_Shdr Shdr; + typedef Elf32_Phdr Phdr; + typedef Elf32_Word Word; + typedef Elf32_Sym Sym; + typedef Elf32_Rel Rel; + typedef Elf32_Rela Rela; + + // What should be in the EI_CLASS header. + static const int kElfClass = ELFCLASS32; + + // Given a symbol pointer, return the binding type (eg STB_WEAK). + static char Bind(const Elf32_Sym* sym) { + return ELF32_ST_BIND(sym->st_info); + } + // Given a symbol pointer, return the symbol type (eg STT_FUNC). + static char Type(const Elf32_Sym* sym) { + return ELF32_ST_TYPE(sym->st_info); + } + + // Extract the symbol index from the r_info field of a relocation. + static int r_sym(const Elf32_Word r_info) { + return ELF32_R_SYM(r_info); + } +}; + + +class Elf64 { + public: + typedef Elf64_Ehdr Ehdr; + typedef Elf64_Shdr Shdr; + typedef Elf64_Phdr Phdr; + typedef Elf64_Word Word; + typedef Elf64_Sym Sym; + typedef Elf64_Rel Rel; + typedef Elf64_Rela Rela; + + // What should be in the EI_CLASS header. + static const int kElfClass = ELFCLASS64; + + static char Bind(const Elf64_Sym* sym) { + return ELF64_ST_BIND(sym->st_info); + } + static char Type(const Elf64_Sym* sym) { + return ELF64_ST_TYPE(sym->st_info); + } + static int r_sym(const Elf64_Xword r_info) { + return ELF64_R_SYM(r_info); + } +}; + + +// ElfSectionReader mmaps a section of an ELF file ("section" is ELF +// terminology). The ElfReaderImpl object providing the section header +// must exist for the lifetime of this object. +// +// The motivation for mmaping individual sections of the file is that +// many Google executables are large enough when unstripped that we +// have to worry about running out of virtual address space. +// +// For compressed sections we have no choice but to allocate memory. +template +class ElfSectionReader { + public: + ElfSectionReader(const char* cname, const string& path, int fd, + const typename ElfArch::Shdr& section_header) + : contents_aligned_(NULL), + contents_(NULL), + header_(section_header) { + // Back up to the beginning of the page we're interested in. + const size_t additional = header_.sh_offset % getpagesize(); + const size_t offset_aligned = header_.sh_offset - additional; + section_size_ = header_.sh_size; + size_aligned_ = section_size_ + additional; + // If the section has been stripped or is empty, do not attempt + // to process its contents. + if (header_.sh_type == SHT_NOBITS || header_.sh_size == 0) + return; + // extra sh_type check for string table. + std::string_view name{cname}; + if ((name == ".strtab" || name == ".shstrtab") && + header_.sh_type != SHT_STRTAB) { + fprintf(stderr, + "Invalid sh_type for string table section: expected " + "SHT_STRTAB or SHT_DYNSYM, but got %d\n", + header_.sh_type); + return; + } + + contents_aligned_ = mmap(NULL, size_aligned_, PROT_READ, MAP_SHARED, + fd, offset_aligned); + // Set where the offset really should begin. + contents_ = reinterpret_cast(contents_aligned_) + + (header_.sh_offset - offset_aligned); + + // Check for and handle any compressed contents. + //if (StringViewStartsWith(name, ".zdebug_")) + // DecompressZlibContents(); + // TODO(saugustine): Add support for proposed elf-section flag + // "SHF_COMPRESS". + } + + ~ElfSectionReader() { + if (contents_aligned_ != NULL) + munmap(contents_aligned_, size_aligned_); + else + delete[] contents_; + } + + // Return the section header for this section. + typename ElfArch::Shdr const& header() const { return header_; } + + // Return memory at the given offset within this section. + const char* GetOffset(typename ElfArch::Word bytes) const { + return contents_ + bytes; + } + + const char* contents() const { return contents_; } + size_t section_size() const { return section_size_; } + + private: + // page-aligned file contents + void* contents_aligned_; + // contents as usable by the client. For non-compressed sections, + // pointer within contents_aligned_ to where the section data + // begins; for compressed sections, pointer to the decompressed + // data. + char* contents_; + // size of contents_aligned_ + size_t size_aligned_; + // size of contents. + size_t section_size_; + const typename ElfArch::Shdr header_; +}; + +// An iterator over symbols in a given section. It handles walking +// through the entries in the specified section and mapping symbol +// entries to their names in the appropriate string table (in +// another section). +template +class SymbolIterator { + public: + SymbolIterator(ElfReaderImpl* reader, + typename ElfArch::Word section_type) + : symbol_section_(reader->GetSectionByType(section_type)), + string_section_(NULL), + num_symbols_in_section_(0), + symbol_within_section_(0) { + + // If this section type doesn't exist, leave + // num_symbols_in_section_ as zero, so this iterator is already + // done(). + if (symbol_section_ != NULL) { + num_symbols_in_section_ = symbol_section_->header().sh_size / + symbol_section_->header().sh_entsize; + + // Symbol sections have sh_link set to the section number of + // the string section containing the symbol names. + string_section_ = reader->GetSection(symbol_section_->header().sh_link); + } + } + + // Return true iff we have passed all symbols in this section. + bool done() const { + return symbol_within_section_ >= num_symbols_in_section_; + } + + // Advance to the next symbol in this section. + // REQUIRES: !done() + void Next() { ++symbol_within_section_; } + + // Return a pointer to the current symbol. + // REQUIRES: !done() + const typename ElfArch::Sym* GetSymbol() const { + return reinterpret_cast( + symbol_section_->GetOffset(symbol_within_section_ * + symbol_section_->header().sh_entsize)); + } + + // Return the name of the current symbol, NULL if it has none. + // REQUIRES: !done() + const char* GetSymbolName() const { + int name_offset = GetSymbol()->st_name; + if (name_offset == 0) + return NULL; + return string_section_->GetOffset(name_offset); + } + + int GetCurrentSymbolIndex() const { + return symbol_within_section_; + } + + private: + const ElfSectionReader* const symbol_section_; + const ElfSectionReader* string_section_; + int num_symbols_in_section_; + int symbol_within_section_; +}; + + +// Copied from strings/strutil.h. Per chatham, +// this library should not depend on strings. + +static inline bool MyHasSuffixString(const string& str, const string& suffix) { + int len = str.length(); + int suflen = suffix.length(); + return (suflen <= len) && (str.compare(len-suflen, suflen, suffix) == 0); +} + + +// ElfReader loads an ELF binary and can provide information about its +// contents. It is most useful for matching addresses to function +// names. It does not understand debugging formats (eg dwarf2), so it +// can't print line numbers. It takes a path to an elf file and a +// readable file descriptor for that file, which it does not assume +// ownership of. +template +class ElfReaderImpl { + public: + explicit ElfReaderImpl(const string& path, int fd) + : path_(path), + fd_(fd), + section_headers_(NULL), + program_headers_(NULL), + opd_section_(NULL), + base_for_text_(0), + plts_supported_(false), + plt_code_size_(0), + plt0_size_(0), + visited_relocation_entries_(false) { + string error; + is_dwp_ = MyHasSuffixString(path, ".dwp"); + ParseHeaders(fd, path); + // Currently we need some extra information for PowerPC64 binaries + // including a way to read the .opd section for function descriptors and a + // way to find the linked base for function symbols. + if (header_.e_machine == EM_PPC64) { + // "opd_section_" must always be checked for NULL before use. + opd_section_ = GetSectionInfoByName(".opd", &opd_info_); + for (unsigned int k = 0u; k < GetNumSections(); ++k) { + std::string_view name{GetSectionName(section_headers_[k].sh_name)}; + if (StringViewStartsWith(name, ".text")) { + base_for_text_ = + section_headers_[k].sh_addr - section_headers_[k].sh_offset; + break; + } + } + } + // Turn on PLTs. + if (header_.e_machine == EM_386 || header_.e_machine == EM_X86_64) { + plt_code_size_ = kX86PLTCodeSize; + plt0_size_ = kX86PLT0Size; + plts_supported_ = true; + } else if (header_.e_machine == EM_ARM) { + plt_code_size_ = kARMPLTCodeSize; + plt0_size_ = kARMPLT0Size; + plts_supported_ = true; + } else if (header_.e_machine == EM_AARCH64) { + plt_code_size_ = kAARCH64PLTCodeSize; + plt0_size_ = kAARCH64PLT0Size; + plts_supported_ = true; + } + } + + ~ElfReaderImpl() { + for (unsigned int i = 0u; i < sections_.size(); ++i) + delete sections_[i]; + delete [] section_headers_; + delete [] program_headers_; + } + + // Examine the headers of the file and return whether the file looks + // like an ELF file for this architecture. Takes an already-open + // file descriptor for the candidate file, reading in the prologue + // to see if the ELF file appears to match the current + // architecture. If error is non-NULL, it will be set with a reason + // in case of failure. + static bool IsArchElfFile(int fd, string* error) { + unsigned char header[EI_NIDENT]; + if (pread(fd, header, sizeof(header), 0) != sizeof(header)) { + if (error != NULL) *error = "Could not read header"; + return false; + } + + if (memcmp(header, ELFMAG, SELFMAG) != 0) { + if (error != NULL) *error = "Missing ELF magic"; + return false; + } + + if (header[EI_CLASS] != ElfArch::kElfClass) { + if (error != NULL) *error = "Different word size"; + return false; + } + + int endian = 0; + if (header[EI_DATA] == ELFDATA2LSB) + endian = __LITTLE_ENDIAN; + else if (header[EI_DATA] == ELFDATA2MSB) + endian = __BIG_ENDIAN; + if (endian != __BYTE_ORDER) { + if (error != NULL) *error = "Different byte order"; + return false; + } + + return true; + } + + // Return true if we can use this symbol in Address-to-Symbol map. + bool CanUseSymbol(const char* name, const typename ElfArch::Sym* sym) { + // For now we only save FUNC and NOTYPE symbols. For now we just + // care about functions, but some functions written in assembler + // don't have a proper ELF type attached to them, so we store + // NOTYPE symbols as well. The remaining significant type is + // OBJECT (eg global variables), which represent about 25% of + // the symbols in a typical google3 binary. + if (ElfArch::Type(sym) != STT_FUNC && + ElfArch::Type(sym) != STT_NOTYPE) { + return false; + } + + // Target specific filtering. + switch (header_.e_machine) { + case EM_AARCH64: + case EM_ARM: + // Filter out '$x' special local symbols used by tools + return name[0] != '$' || ElfArch::Bind(sym) != STB_LOCAL; + case EM_X86_64: + // Filter out read-only constants like .LC123. + return name[0] != '.' || ElfArch::Bind(sym) != STB_LOCAL; + default: + return true; + } + } + + // Iterate over the symbols in a section, either SHT_DYNSYM or + // SHT_SYMTAB. Add all symbols to the given SymbolMap. + /* + void GetSymbolPositions(SymbolMap* symbols, + typename ElfArch::Word section_type, + uint64_t mem_offset, + uint64_t file_offset) { + // This map is used to filter out "nested" functions. + // See comment below. + AddrToSymMap addr_to_sym_map; + for (SymbolIterator it(this, section_type); + !it.done(); it.Next()) { + const char* name = it.GetSymbolName(); + if (name == NULL) + continue; + const typename ElfArch::Sym* sym = it.GetSymbol(); + if (CanUseSymbol(name, sym)) { + const int sec = sym->st_shndx; + + // We don't support special section indices. The most common + // is SHN_ABS, for absolute symbols used deep in the bowels of + // glibc. Also ignore any undefined symbols. + if (sec == SHN_UNDEF || + (sec >= SHN_LORESERVE && sec <= SHN_HIRESERVE)) { + continue; + } + + const typename ElfArch::Shdr& hdr = section_headers_[sec]; + + // Adjust for difference between where we expected to mmap + // this section, and where it was actually mmapped. + const int64_t expected_base = hdr.sh_addr - hdr.sh_offset; + const int64_t real_base = mem_offset - file_offset; + const int64_t adjust = real_base - expected_base; + + uint64_t start = sym->st_value + adjust; + + // Adjust function symbols for PowerPC64 by dereferencing and adjusting + // the function descriptor to get the function address. + if (header_.e_machine == EM_PPC64 && ElfArch::Type(sym) == STT_FUNC) { + const uint64_t opd_addr = + AdjustPPC64FunctionDescriptorSymbolValue(sym->st_value); + // Only adjust the returned value if the function address was found. + if (opd_addr != sym->st_value) { + const int64_t adjust_function_symbols = + real_base - base_for_text_; + start = opd_addr + adjust_function_symbols; + } + } + + addr_to_sym_map.push_back(std::make_pair(start, sym)); + } + } + std::sort(addr_to_sym_map.begin(), addr_to_sym_map.end(), &AddrToSymSorter); + addr_to_sym_map.erase(std::unique(addr_to_sym_map.begin(), + addr_to_sym_map.end(), &AddrToSymEquals), + addr_to_sym_map.end()); + + // Squeeze out any "nested functions". + // Nested functions are not allowed in C, but libc plays tricks. + // + // For example, here is disassembly of /lib64/tls/libc-2.3.5.so: + // 0x00000000000aa380 : cmpl $0x0,0x2781b9(%rip) + // 0x00000000000aa387 : jne 0xaa39b + // 0x00000000000aa389 <__read_nocancel+0>: mov $0x0,%rax + // 0x00000000000aa390 <__read_nocancel+7>: syscall + // 0x00000000000aa392 <__read_nocancel+9>: cmp $0xfffffffffffff001,%rax + // 0x00000000000aa398 <__read_nocancel+15>: jae 0xaa3ef + // 0x00000000000aa39a <__read_nocancel+17>: retq + // 0x00000000000aa39b : sub $0x28,%rsp + // 0x00000000000aa39f : mov %rdi,0x8(%rsp) + // ... + // Without removing __read_nocancel, symbolizer will return NULL + // given e.g. 0xaa39f (because the lower bound is __read_nocancel, + // but 0xaa39f is beyond its end. + if (addr_to_sym_map.empty()) { + return; + } + const ElfSectionReader* const symbol_section = + this->GetSectionByType(section_type); + const ElfSectionReader* const string_section = + this->GetSection(symbol_section->header().sh_link); + + typename AddrToSymMap::iterator curr = addr_to_sym_map.begin(); + // Always insert the first symbol. + symbols->AddSymbol(string_section->GetOffset(curr->second->st_name), + curr->first, curr->second->st_size); + typename AddrToSymMap::iterator prev = curr++; + for (; curr != addr_to_sym_map.end(); ++curr) { + const uint64_t prev_addr = prev->first; + const uint64_t curr_addr = curr->first; + const typename ElfArch::Sym* const prev_sym = prev->second; + const typename ElfArch::Sym* const curr_sym = curr->second; + if (prev_addr + prev_sym->st_size <= curr_addr || + // The next condition is true if two symbols overlap like this: + // + // Previous symbol |----------------------------| + // Current symbol |-------------------------------| + // + // These symbols are not found in google3 codebase, but in + // jdk1.6.0_01_gg1/jre/lib/i386/server/libjvm.so. + // + // 0619e040 00000046 t CardTableModRefBS::write_region_work() + // 0619e070 00000046 t CardTableModRefBS::write_ref_array_work() + // + // We allow overlapped symbols rather than ignore these. + // Due to the way SymbolMap::GetSymbolAtPosition() works, + // lookup for any address in [curr_addr, curr_addr + its size) + // (e.g. 0619e071) will produce the current symbol, + // which is the desired outcome. + prev_addr + prev_sym->st_size < curr_addr + curr_sym->st_size) { + const char* name = string_section->GetOffset(curr_sym->st_name); + symbols->AddSymbol(name, curr_addr, curr_sym->st_size); + prev = curr; + } else { + // Current symbol is "nested" inside previous one like this: + // + // Previous symbol |----------------------------| + // Current symbol |---------------------| + // + // This happens within glibc, e.g. __read_nocancel is nested + // "inside" __read. Ignore "inner" symbol. + //DCHECK_LE(curr_addr + curr_sym->st_size, + // prev_addr + prev_sym->st_size); + ; + } + } + } +*/ + + void VisitSymbols(typename ElfArch::Word section_type, + ElfReader::SymbolSink* sink) { + VisitSymbols(section_type, sink, -1, -1, false); + } + + void VisitSymbols(typename ElfArch::Word section_type, + ElfReader::SymbolSink* sink, + int symbol_binding, + int symbol_type, + bool get_raw_symbol_values) { + for (SymbolIterator it(this, section_type); + !it.done(); it.Next()) { + const char* name = it.GetSymbolName(); + if (!name) continue; + const typename ElfArch::Sym* sym = it.GetSymbol(); + if ((symbol_binding < 0 || ElfArch::Bind(sym) == symbol_binding) && + (symbol_type < 0 || ElfArch::Type(sym) == symbol_type)) { + typename ElfArch::Sym symbol = *sym; + // Add a PLT symbol in addition to the main undefined symbol. + // Only do this for SHT_DYNSYM, because PLT symbols are dynamic. + int symbol_index = it.GetCurrentSymbolIndex(); + // TODO(dthomson): Can be removed once all Java code is using the + // Google3 launcher. + if (section_type == SHT_DYNSYM && + static_cast(symbol_index) < symbols_plt_offsets_.size() && + symbols_plt_offsets_[symbol_index] != 0) { + string plt_name = string(name) + kPLTFunctionSuffix; + if (plt_function_names_[symbol_index].empty()) { + plt_function_names_[symbol_index] = plt_name; + } else if (plt_function_names_[symbol_index] != plt_name) { + ; + } + sink->AddSymbol(plt_function_names_[symbol_index].c_str(), + symbols_plt_offsets_[it.GetCurrentSymbolIndex()], + plt_code_size_); + } + if (!get_raw_symbol_values) + AdjustSymbolValue(&symbol); + sink->AddSymbol(name, symbol.st_value, symbol.st_size); + } + } + } + + void VisitRelocationEntries() { + if (visited_relocation_entries_) { + return; + } + visited_relocation_entries_ = true; + + if (!plts_supported_) { + return; + } + // First determine if PLTs exist. If not, then there is nothing to do. + ElfReader::SectionInfo plt_section_info; + const char* plt_section = + GetSectionInfoByName(kElfPLTSectionName, &plt_section_info); + if (!plt_section) { + return; + } + if (plt_section_info.size == 0) { + return; + } + + // The PLTs could be referenced by either a Rel or Rela (Rel with Addend) + // section. + ElfReader::SectionInfo rel_section_info; + ElfReader::SectionInfo rela_section_info; + const char* rel_section = + GetSectionInfoByName(kElfPLTRelSectionName, &rel_section_info); + const char* rela_section = + GetSectionInfoByName(kElfPLTRelaSectionName, &rela_section_info); + + const typename ElfArch::Rel* rel = + reinterpret_cast(rel_section); + const typename ElfArch::Rela* rela = + reinterpret_cast(rela_section); + + if (!rel_section && !rela_section) { + return; + } + + // Use either Rel or Rela section, depending on which one exists. + size_t section_size = rel_section ? rel_section_info.size + : rela_section_info.size; + size_t entry_size = rel_section ? sizeof(typename ElfArch::Rel) + : sizeof(typename ElfArch::Rela); + + // Determine the number of entries in the dynamic symbol table. + ElfReader::SectionInfo dynsym_section_info; + const char* dynsym_section = + GetSectionInfoByName(kElfDynSymSectionName, &dynsym_section_info); + // The dynsym section might not exist, or it might be empty. In either case + // there is nothing to be done so return. + if (!dynsym_section || dynsym_section_info.size == 0) { + return; + } + size_t num_dynamic_symbols = + dynsym_section_info.size / dynsym_section_info.entsize; + symbols_plt_offsets_.resize(num_dynamic_symbols, 0); + + // TODO(dthomson): Can be removed once all Java code is using the + // Google3 launcher. + // Make storage room for PLT function name strings. + plt_function_names_.resize(num_dynamic_symbols); + + for (size_t i = 0; i < section_size / entry_size; ++i) { + // Determine symbol index from the |r_info| field. + int sym_index = ElfArch::r_sym(rel_section ? rel[i].r_info + : rela[i].r_info); + if (static_cast(sym_index) >= symbols_plt_offsets_.size()) { + continue; + } + symbols_plt_offsets_[sym_index] = + plt_section_info.addr + plt0_size_ + i * plt_code_size_; + } + } + + // Return an ElfSectionReader for the first section of the given + // type by iterating through all section headers. Returns NULL if + // the section type is not found. + const ElfSectionReader* GetSectionByType( + typename ElfArch::Word section_type) { + for (unsigned int k = 0u; k < GetNumSections(); ++k) { + if (section_headers_[k].sh_type == section_type) { + return GetSection(k); + } + } + return NULL; + } + + // Return the name of section "shndx". Returns NULL if the section + // is not found. + const char* GetSectionNameByIndex(int shndx) { + return GetSectionName(section_headers_[shndx].sh_name); + } + + // Return a pointer to section "shndx", and store the size in + // "size". Returns NULL if the section is not found. + const char* GetSectionContentsByIndex(int shndx, size_t* size) { + const ElfSectionReader* section = GetSection(shndx); + if (section != NULL) { + *size = section->section_size(); + return section->contents(); + } + return NULL; + } + + // Return a pointer to the first section of the given name by + // iterating through all section headers, and store the size in + // "size". Returns NULL if the section name is not found. + const char* GetSectionContentsByName(const string& section_name, + size_t* size) { + for (unsigned int k = 0u; k < GetNumSections(); ++k) { + // When searching for sections in a .dwp file, the sections + // we're looking for will always be at the end of the section + // table, so reverse the direction of iteration. + int shndx = is_dwp_ ? GetNumSections() - k - 1 : k; + const char* name = GetSectionName(section_headers_[shndx].sh_name); + if (name != NULL && ElfReader::SectionNamesMatch(section_name, name)) { + const ElfSectionReader* section = GetSection(shndx); + if (section == NULL) { + return NULL; + } else { + *size = section->section_size(); + return section->contents(); + } + } + } + return NULL; + } + + // This is like GetSectionContentsByName() but it returns a lot of extra + // information about the section. + const char* GetSectionInfoByName(const string& section_name, + ElfReader::SectionInfo* info) { + for (unsigned int k = 0u; k < GetNumSections(); ++k) { + // When searching for sections in a .dwp file, the sections + // we're looking for will always be at the end of the section + // table, so reverse the direction of iteration. + int shndx = is_dwp_ ? GetNumSections() - k - 1 : k; + const char* name = GetSectionName(section_headers_[shndx].sh_name); + if (name != NULL && ElfReader::SectionNamesMatch(section_name, name)) { + const ElfSectionReader* section = GetSection(shndx); + if (section == NULL) { + return NULL; + } else { + info->type = section->header().sh_type; + info->flags = section->header().sh_flags; + info->addr = section->header().sh_addr; + info->offset = section->header().sh_offset; + info->size = section->header().sh_size; + info->link = section->header().sh_link; + info->info = section->header().sh_info; + info->addralign = section->header().sh_addralign; + info->entsize = section->header().sh_entsize; + return section->contents(); + } + } + } + return NULL; + } + + // p_vaddr of the first PT_LOAD segment (if any), or 0 if no PT_LOAD + // segments are present. This is the address an ELF image was linked + // (by static linker) to be loaded at. Usually (but not always) 0 for + // shared libraries and position-independent executables. + uint64_t VaddrOfFirstLoadSegment() const { + // Relocatable objects (of type ET_REL) do not have LOAD segments. + if (header_.e_type == ET_REL) { + return 0; + } + for (int i = 0; i < GetNumProgramHeaders(); ++i) { + if (program_headers_[i].p_type == PT_LOAD) { + return program_headers_[i].p_vaddr; + } + } + return 0; + } + + // According to the LSB ("ELF special sections"), sections with debug + // info are prefixed by ".debug". The names are not specified, but they + // look like ".debug_line", ".debug_info", etc. + bool HasDebugSections() { + // Debug sections are likely to be near the end, so reverse the + // direction of iteration. + for (int k = GetNumSections() - 1; k >= 0; --k) { + std::string_view name{GetSectionName(section_headers_[k].sh_name)}; + if (StringViewStartsWith(name, ".debug") || + StringViewStartsWith(name, ".zdebug")) { + return true; + } + } + return false; + } + + bool IsDynamicSharedObject() const { + return header_.e_type == ET_DYN; + } + + // Return the number of sections. + uint64_t GetNumSections() const { + if (HasManySections()) + return first_section_header_.sh_size; + return header_.e_shnum; + } + + private: + typedef vector > AddrToSymMap; + + static bool AddrToSymSorter(const typename AddrToSymMap::value_type& lhs, + const typename AddrToSymMap::value_type& rhs) { + return lhs.first < rhs.first; + } + + static bool AddrToSymEquals(const typename AddrToSymMap::value_type& lhs, + const typename AddrToSymMap::value_type& rhs) { + return lhs.first == rhs.first; + } + + // Does this ELF file have too many sections to fit in the program header? + bool HasManySections() const { + return header_.e_shnum == SHN_UNDEF; + } + + // Return the number of program headers. + int GetNumProgramHeaders() const { + if (HasManySections() && header_.e_phnum == 0xffff && + first_section_header_.sh_info != 0) + return first_section_header_.sh_info; + return header_.e_phnum; + } + + // Return the index of the string table. + int GetStringTableIndex() const { + if (HasManySections()) { + if (header_.e_shstrndx == 0xffff) + return first_section_header_.sh_link; + else if (header_.e_shstrndx >= GetNumSections()) + return 0; + } + return header_.e_shstrndx; + } + + // Given an offset into the section header string table, return the + // section name. + const char* GetSectionName(typename ElfArch::Word sh_name) { + const ElfSectionReader* shstrtab = + GetSection(GetStringTableIndex()); + if (shstrtab != NULL) { + return shstrtab->GetOffset(sh_name); + } + return NULL; + } + + // Return an ElfSectionReader for the given section. The reader will + // be freed when this object is destroyed. + const ElfSectionReader* GetSection(int num) { + const char* name; + // Hard-coding the name for the section-name string table prevents + // infinite recursion. + if (num == GetStringTableIndex()) + name = ".shstrtab"; + else + name = GetSectionNameByIndex(num); + ElfSectionReader*& reader = sections_[num]; + if (reader == NULL) + reader = new ElfSectionReader(name, path_, fd_, + section_headers_[num]); + return reader->contents() ? reader : nullptr; + } + + // Parse out the overall header information from the file and assert + // that it looks sane. This contains information like the magic + // number and target architecture. + bool ParseHeaders(int fd, const string& path) { + // Read in the global ELF header. + if (pread(fd, &header_, sizeof(header_), 0) != sizeof(header_)) { + return false; + } + + // Must be an executable, dynamic shared object or relocatable object + if (header_.e_type != ET_EXEC && + header_.e_type != ET_DYN && + header_.e_type != ET_REL) { + return false; + } + // Need a section header. + if (header_.e_shoff == 0) { + return false; + } + + if (header_.e_shnum == SHN_UNDEF) { + // The number of sections in the program header is only a 16-bit value. In + // the event of overflow (greater than SHN_LORESERVE sections), e_shnum + // will read SHN_UNDEF and the true number of section header table entries + // is found in the sh_size field of the first section header. + // See: http://www.sco.com/developers/gabi/2003-12-17/ch4.sheader.html + if (pread(fd, &first_section_header_, sizeof(first_section_header_), + header_.e_shoff) != sizeof(first_section_header_)) { + return false; + } + } + + // Dynamically allocate enough space to store the section headers + // and read them out of the file. + const int section_headers_size = + GetNumSections() * sizeof(*section_headers_); + section_headers_ = new typename ElfArch::Shdr[section_headers_size]; + if (pread(fd, section_headers_, section_headers_size, header_.e_shoff) != + section_headers_size) { + return false; + } + + // Dynamically allocate enough space to store the program headers + // and read them out of the file. + //const int program_headers_size = + // GetNumProgramHeaders() * sizeof(*program_headers_); + program_headers_ = new typename ElfArch::Phdr[GetNumProgramHeaders()]; + + // Presize the sections array for efficiency. + sections_.resize(GetNumSections(), NULL); + return true; + } + + // Given the "value" of a function descriptor return the address of the + // function (i.e. the dereferenced value). Otherwise return "value". + uint64_t AdjustPPC64FunctionDescriptorSymbolValue(uint64_t value) { + if (opd_section_ != NULL && + opd_info_.addr <= value && + value < opd_info_.addr + opd_info_.size) { + uint64_t offset = value - opd_info_.addr; + return (*reinterpret_cast(opd_section_ + offset)); + } + return value; + } + + void AdjustSymbolValue(typename ElfArch::Sym* sym) { + switch (header_.e_machine) { + case EM_ARM: + // For ARM architecture, if the LSB of the function symbol offset is set, + // it indicates a Thumb function. This bit should not be taken literally. + // Clear it. + if (ElfArch::Type(sym) == STT_FUNC) + sym->st_value = AdjustARMThumbSymbolValue(sym->st_value); + break; + case EM_386: + // No adjustment needed for Intel x86 architecture. However, explicitly + // define this case as we use it quite often. + break; + case EM_PPC64: + // PowerPC64 currently has function descriptors as part of the ABI. + // Function symbols need to be adjusted accordingly. + if (ElfArch::Type(sym) == STT_FUNC) + sym->st_value = AdjustPPC64FunctionDescriptorSymbolValue(sym->st_value); + break; + default: + break; + } + } + + friend class SymbolIterator; + + // The file we're reading. + const string path_; + // Open file descriptor for path_. Not owned by this object. + const int fd_; + + // The global header of the ELF file. + typename ElfArch::Ehdr header_; + + // The header of the first section. This may be used to supplement the ELF + // file header. + typename ElfArch::Shdr first_section_header_; + + // Array of GetNumSections() section headers, allocated when we read + // in the global header. + typename ElfArch::Shdr* section_headers_; + + // Array of GetNumProgramHeaders() program headers, allocated when we read + // in the global header. + typename ElfArch::Phdr* program_headers_; + + // An array of pointers to ElfSectionReaders. Sections are + // mmaped as they're needed and not released until this object is + // destroyed. + vector*> sections_; + + // For PowerPC64 we need to keep track of function descriptors when looking up + // values for funtion symbols values. Function descriptors are kept in the + // .opd section and are dereferenced to find the function address. + ElfReader::SectionInfo opd_info_; + const char* opd_section_; // Must be checked for NULL before use. + int64_t base_for_text_; + + // Read PLT-related sections for the current architecture. + bool plts_supported_; + // Code size of each PLT function for the current architecture. + size_t plt_code_size_; + // Size of the special first entry in the .plt section that calls the runtime + // loader resolution routine, and that all other entries jump to when doing + // lazy symbol binding. + size_t plt0_size_; + + // Maps a dynamic symbol index to a PLT offset. + // The vector entry index is the dynamic symbol index. + std::vector symbols_plt_offsets_; + + // Container for PLT function name strings. These strings are passed by + // reference to SymbolSink::AddSymbol() so they need to be stored somewhere. + std::vector plt_function_names_; + + bool visited_relocation_entries_; + + // True if this is a .dwp file. + bool is_dwp_; +}; + +ElfReader::ElfReader(const string& path) + : path_(path), fd_(-1), impl32_(NULL), impl64_(NULL) { + // linux 2.6.XX kernel can show deleted files like this: + // /var/run/nscd/dbYLJYaE (deleted) + // and the kernel-supplied vdso and vsyscall mappings like this: + // [vdso] + // [vsyscall] + if (MyHasSuffixString(path, " (deleted)")) + return; + if (path == "[vdso]") + return; + if (path == "[vsyscall]") + return; + + fd_ = open(path.c_str(), O_RDONLY); +} + +ElfReader::~ElfReader() { + if (fd_ != -1) + close(fd_); + if (impl32_ != NULL) + delete impl32_; + if (impl64_ != NULL) + delete impl64_; +} + + +// The only word-size specific part of this file is IsNativeElfFile(). +#if ULONG_MAX == 0xffffffff +#define NATIVE_ELF_ARCH Elf32 +#elif ULONG_MAX == 0xffffffffffffffff +#define NATIVE_ELF_ARCH Elf64 +#else +#error "Invalid word size" +#endif + +template +static bool IsElfFile(const int fd, const string& path) { + if (fd < 0) + return false; + if (!ElfReaderImpl::IsArchElfFile(fd, NULL)) { + // No error message here. IsElfFile gets called many times. + return false; + } + return true; +} + +bool ElfReader::IsNativeElfFile() const { + return IsElfFile(fd_, path_); +} + +bool ElfReader::IsElf32File() const { + return IsElfFile(fd_, path_); +} + +bool ElfReader::IsElf64File() const { + return IsElfFile(fd_, path_); +} + +/* +void ElfReader::AddSymbols(SymbolMap* symbols, + uint64_t mem_offset, uint64_t file_offset, + uint64_t length) { + if (fd_ < 0) + return; + // TODO(chatham): Actually use the information about file offset and + // the length of the mapped section. On some machines the data + // section gets mapped as executable, and we'll end up reading the + // file twice and getting some of the offsets wrong. + if (IsElf32File()) { + GetImpl32()->GetSymbolPositions(symbols, SHT_SYMTAB, + mem_offset, file_offset); + GetImpl32()->GetSymbolPositions(symbols, SHT_DYNSYM, + mem_offset, file_offset); + } else if (IsElf64File()) { + GetImpl64()->GetSymbolPositions(symbols, SHT_SYMTAB, + mem_offset, file_offset); + GetImpl64()->GetSymbolPositions(symbols, SHT_DYNSYM, + mem_offset, file_offset); + } +} +*/ + +void ElfReader::VisitSymbols(ElfReader::SymbolSink* sink) { + VisitSymbols(sink, -1, -1); +} + +void ElfReader::VisitSymbols(ElfReader::SymbolSink* sink, + int symbol_binding, + int symbol_type) { + VisitSymbols(sink, symbol_binding, symbol_type, false); +} + +void ElfReader::VisitSymbols(ElfReader::SymbolSink* sink, + int symbol_binding, + int symbol_type, + bool get_raw_symbol_values) { + if (IsElf32File()) { + GetImpl32()->VisitRelocationEntries(); + GetImpl32()->VisitSymbols(SHT_SYMTAB, sink, symbol_binding, symbol_type, + get_raw_symbol_values); + GetImpl32()->VisitSymbols(SHT_DYNSYM, sink, symbol_binding, symbol_type, + get_raw_symbol_values); + } else if (IsElf64File()) { + GetImpl64()->VisitRelocationEntries(); + GetImpl64()->VisitSymbols(SHT_SYMTAB, sink, symbol_binding, symbol_type, + get_raw_symbol_values); + GetImpl64()->VisitSymbols(SHT_DYNSYM, sink, symbol_binding, symbol_type, + get_raw_symbol_values); + } +} + +uint64_t ElfReader::VaddrOfFirstLoadSegment() { + if (IsElf32File()) { + return GetImpl32()->VaddrOfFirstLoadSegment(); + } else if (IsElf64File()) { + return GetImpl64()->VaddrOfFirstLoadSegment(); + } else { + return 0; + } +} + +const char* ElfReader::GetSectionName(int shndx) { + if (shndx < 0 || static_cast(shndx) >= GetNumSections()) return NULL; + if (IsElf32File()) { + return GetImpl32()->GetSectionNameByIndex(shndx); + } else if (IsElf64File()) { + return GetImpl64()->GetSectionNameByIndex(shndx); + } else { + return NULL; + } +} + +uint64_t ElfReader::GetNumSections() { + if (IsElf32File()) { + return GetImpl32()->GetNumSections(); + } else if (IsElf64File()) { + return GetImpl64()->GetNumSections(); + } else { + return 0; + } +} + +const char* ElfReader::GetSectionByIndex(int shndx, size_t* size) { + if (IsElf32File()) { + return GetImpl32()->GetSectionContentsByIndex(shndx, size); + } else if (IsElf64File()) { + return GetImpl64()->GetSectionContentsByIndex(shndx, size); + } else { + return NULL; + } +} + +const char* ElfReader::GetSectionByName(const string& section_name, + size_t* size) { + if (IsElf32File()) { + return GetImpl32()->GetSectionContentsByName(section_name, size); + } else if (IsElf64File()) { + return GetImpl64()->GetSectionContentsByName(section_name, size); + } else { + return NULL; + } +} + +const char* ElfReader::GetSectionInfoByName(const string& section_name, + SectionInfo* info) { + if (IsElf32File()) { + return GetImpl32()->GetSectionInfoByName(section_name, info); + } else if (IsElf64File()) { + return GetImpl64()->GetSectionInfoByName(section_name, info); + } else { + return NULL; + } +} + +bool ElfReader::SectionNamesMatch(std::string_view name, + std::string_view sh_name) { + std::string_view debug_prefix{".debug_"}; + std::string_view zdebug_prefix{".zdebug_"}; + if (StringViewStartsWith(name, debug_prefix) && + StringViewStartsWith(sh_name, zdebug_prefix)) { + name.remove_prefix(debug_prefix.length()); + sh_name.remove_prefix(zdebug_prefix.length()); + return name == sh_name; + } + return name == sh_name; +} + +bool ElfReader::IsDynamicSharedObject() { + if (IsElf32File()) { + return GetImpl32()->IsDynamicSharedObject(); + } else if (IsElf64File()) { + return GetImpl64()->IsDynamicSharedObject(); + } else { + return false; + } +} + +ElfReaderImpl* ElfReader::GetImpl32() { + if (impl32_ == NULL) { + impl32_ = new ElfReaderImpl(path_, fd_); + } + return impl32_; +} + +ElfReaderImpl* ElfReader::GetImpl64() { + if (impl64_ == NULL) { + impl64_ = new ElfReaderImpl(path_, fd_); + } + return impl64_; +} + +// Return true if file is an ELF binary of ElfArch, with unstripped +// debug info (debug_only=true) or symbol table (debug_only=false). +// Otherwise, return false. +template +static bool IsNonStrippedELFBinaryImpl(const string& path, const int fd, + bool debug_only) { + if (!ElfReaderImpl::IsArchElfFile(fd, NULL)) return false; + ElfReaderImpl elf_reader(path, fd); + return debug_only ? + elf_reader.HasDebugSections() + : (elf_reader.GetSectionByType(SHT_SYMTAB) != NULL); +} + +// Helper for the IsNon[Debug]StrippedELFBinary functions. +static bool IsNonStrippedELFBinaryHelper(const string& path, + bool debug_only) { + const int fd = open(path.c_str(), O_RDONLY); + if (fd == -1) { + return false; + } + + if (IsNonStrippedELFBinaryImpl(path, fd, debug_only) || + IsNonStrippedELFBinaryImpl(path, fd, debug_only)) { + close(fd); + return true; + } + close(fd); + return false; +} + +bool ElfReader::IsNonStrippedELFBinary(const string& path) { + return IsNonStrippedELFBinaryHelper(path, false); +} + +bool ElfReader::IsNonDebugStrippedELFBinary(const string& path) { + return IsNonStrippedELFBinaryHelper(path, true); +} +} // namespace google_breakpad diff --git a/src/common/dwarf/elf_reader.h b/src/common/dwarf/elf_reader.h new file mode 100644 index 0000000..a6dec75 --- /dev/null +++ b/src/common/dwarf/elf_reader.h @@ -0,0 +1,169 @@ +// Copyright 2005 Google LLC +// Author: chatham@google.com (Andrew Chatham) +// Author: satorux@google.com (Satoru Takabayashi) +// +// ElfReader handles reading in ELF. It can extract symbols from the +// current process, which may be used to symbolize stack traces +// without having to make a potentially dangerous call to fork(). +// +// ElfReader dynamically allocates memory, so it is not appropriate to +// use once the address space might be corrupted, such as during +// process death. +// +// ElfReader supports both 32-bit and 64-bit ELF binaries. + +#ifndef COMMON_DWARF_ELF_READER_H__ +#define COMMON_DWARF_ELF_READER_H__ + +#include +#include +#include + +#include "common/dwarf/types.h" +#include "common/using_std_string.h" + +using std::vector; +using std::pair; + +namespace google_breakpad { + +class SymbolMap; +class Elf32; +class Elf64; +template +class ElfReaderImpl; + +class ElfReader { + public: + explicit ElfReader(const string& path); + ~ElfReader(); + + // Parse the ELF prologue of this file and return whether it was + // successfully parsed and matches the word size and byte order of + // the current process. + bool IsNativeElfFile() const; + + // Similar to IsNativeElfFile but checks if it's a 32-bit ELF file. + bool IsElf32File() const; + + // Similar to IsNativeElfFile but checks if it's a 64-bit ELF file. + bool IsElf64File() const; + + // Checks if it's an ELF file of type ET_DYN (shared object file). + bool IsDynamicSharedObject(); + + // Add symbols in the given ELF file into the provided SymbolMap, + // assuming that the file has been loaded into the specified + // offset. + // + // The remaining arguments are typically taken from a + // ProcMapsIterator (base/sysinfo.h) and describe which portions of + // the ELF file are mapped into which parts of memory: + // + // mem_offset - position at which the segment is mapped into memory + // file_offset - offset in the file where the mapping begins + // length - length of the mapped segment + void AddSymbols(SymbolMap* symbols, + uint64_t mem_offset, uint64_t file_offset, + uint64_t length); + + class SymbolSink { + public: + virtual ~SymbolSink() {} + virtual void AddSymbol(const char* name, uint64_t address, + uint64_t size) = 0; + }; + + // Like AddSymbols above, but with no address correction. + // Processes any SHT_SYMTAB section, followed by any SHT_DYNSYM section. + void VisitSymbols(SymbolSink* sink); + + // Like VisitSymbols above, but for a specific symbol binding/type. + // A negative value for the binding and type parameters means any + // binding or type. + void VisitSymbols(SymbolSink* sink, int symbol_binding, int symbol_type); + + // Like VisitSymbols above but can optionally export raw symbol values instead + // of adjusted ones. + void VisitSymbols(SymbolSink* sink, int symbol_binding, int symbol_type, + bool get_raw_symbol_values); + + // p_vaddr of the first PT_LOAD segment (if any), or 0 if no PT_LOAD + // segments are present. This is the address an ELF image was linked + // (by static linker) to be loaded at. Usually (but not always) 0 for + // shared libraries and position-independent executables. + uint64_t VaddrOfFirstLoadSegment(); + + // Return the name of section "shndx". Returns NULL if the section + // is not found. + const char* GetSectionName(int shndx); + + // Return the number of sections in the given ELF file. + uint64_t GetNumSections(); + + // Get section "shndx" from the given ELF file. On success, return + // the pointer to the section and store the size in "size". + // On error, return NULL. The returned section data is only valid + // until the ElfReader gets destroyed. + const char* GetSectionByIndex(int shndx, size_t* size); + + // Get section with "section_name" (ex. ".text", ".symtab") in the + // given ELF file. On success, return the pointer to the section + // and store the size in "size". On error, return NULL. The + // returned section data is only valid until the ElfReader gets + // destroyed. + const char* GetSectionByName(const string& section_name, size_t* size); + + // This is like GetSectionByName() but it returns a lot of extra information + // about the section. The SectionInfo structure is almost identical to + // the typedef struct Elf64_Shdr defined in , but is redefined + // here so that the many short macro names in don't have to be + // added to our already cluttered namespace. + struct SectionInfo { + uint32_t type; // Section type (SHT_xxx constant from elf.h). + uint64_t flags; // Section flags (SHF_xxx constants from elf.h). + uint64_t addr; // Section virtual address at execution. + uint64_t offset; // Section file offset. + uint64_t size; // Section size in bytes. + uint32_t link; // Link to another section. + uint32_t info; // Additional section information. + uint64_t addralign; // Section alignment. + uint64_t entsize; // Entry size if section holds a table. + }; + const char* GetSectionInfoByName(const string& section_name, + SectionInfo* info); + + // Check if "path" is an ELF binary that has not been stripped of symbol + // tables. This function supports both 32-bit and 64-bit ELF binaries. + static bool IsNonStrippedELFBinary(const string& path); + + // Check if "path" is an ELF binary that has not been stripped of debug + // info. Unlike IsNonStrippedELFBinary, this function will return + // false for binaries passed through "strip -S". + static bool IsNonDebugStrippedELFBinary(const string& path); + + // Match a requested section name with the section name as it + // appears in the elf-file, adjusting for compressed debug section + // names. For example, returns true if name == ".debug_abbrev" and + // sh_name == ".zdebug_abbrev" + static bool SectionNamesMatch(std::string_view name, + std::string_view sh_name); + + private: + // Lazily initialize impl32_ and return it. + ElfReaderImpl* GetImpl32(); + // Ditto for impl64_. + ElfReaderImpl* GetImpl64(); + + // Path of the file we're reading. + const string path_; + // Read-only file descriptor for the file. May be -1 if there was an + // error during open. + int fd_; + ElfReaderImpl* impl32_; + ElfReaderImpl* impl64_; +}; + +} // namespace google_breakpad + +#endif // COMMON_DWARF_ELF_READER_H__ diff --git a/src/common/dwarf/functioninfo.cc b/src/common/dwarf/functioninfo.cc new file mode 100644 index 0000000..5b0ce81 --- /dev/null +++ b/src/common/dwarf/functioninfo.cc @@ -0,0 +1,232 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This is a client for the dwarf2reader to extract function and line +// information from the debug info. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include +#include +#include + +#include "common/dwarf/functioninfo.h" +#include "common/dwarf/bytereader.h" +#include "common/scoped_ptr.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +CULineInfoHandler::CULineInfoHandler(std::vector* files, + std::vector* dirs, + LineMap* linemap):linemap_(linemap), + files_(files), + dirs_(dirs) { + // In dwarf4, the dirs and files are 1 indexed, and in dwarf5 they are zero + // indexed. This is handled in the LineInfo reader, so empty files are not + // needed here. +} + +void CULineInfoHandler::DefineDir(const string& name, uint32_t dir_num) { + // These should never come out of order, actually + assert(dir_num == dirs_->size()); + dirs_->push_back(name); +} + +void CULineInfoHandler::DefineFile(const string& name, + int32 file_num, uint32_t dir_num, + uint64_t mod_time, uint64_t length) { + assert(dir_num >= 0); + assert(dir_num < dirs_->size()); + + // These should never come out of order, actually. + if (file_num == (int32)files_->size() || file_num == -1) { + string dir = dirs_->at(dir_num); + + SourceFileInfo s; + s.lowpc = ULLONG_MAX; + + if (dir == "") { + s.name = name; + } else { + s.name = dir + "/" + name; + } + + files_->push_back(s); + } else { + fprintf(stderr, "error in DefineFile"); + } +} + +void CULineInfoHandler::AddLine(uint64_t address, uint64_t length, + uint32_t file_num, uint32_t line_num, + uint32_t column_num) { + if (file_num < files_->size()) { + linemap_->insert( + std::make_pair(address, + std::make_pair(files_->at(file_num).name.c_str(), + line_num))); + + if (address < files_->at(file_num).lowpc) { + files_->at(file_num).lowpc = address; + } + } else { + fprintf(stderr, "error in AddLine"); + } +} + +bool CUFunctionInfoHandler::StartCompilationUnit(uint64_t offset, + uint8_t address_size, + uint8_t offset_size, + uint64_t cu_length, + uint8_t dwarf_version) { + current_compilation_unit_offset_ = offset; + return true; +} + + +// For function info, we only care about subprograms and inlined +// subroutines. For line info, the DW_AT_stmt_list lives in the +// compile unit tag. + +bool CUFunctionInfoHandler::StartDIE(uint64_t offset, enum DwarfTag tag) { + switch (tag) { + case DW_TAG_subprogram: + case DW_TAG_inlined_subroutine: { + current_function_info_ = new FunctionInfo; + current_function_info_->lowpc = current_function_info_->highpc = 0; + current_function_info_->name = ""; + current_function_info_->line = 0; + current_function_info_->file = ""; + offset_to_funcinfo_->insert(std::make_pair(offset, + current_function_info_)); + }; + // FALLTHROUGH + case DW_TAG_compile_unit: + return true; + default: + return false; + } + return false; +} + +// Only care about the name attribute for functions + +void CUFunctionInfoHandler::ProcessAttributeString(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const string& data) { + if (current_function_info_) { + if (attr == DW_AT_name) + current_function_info_->name = data; + else if (attr == DW_AT_MIPS_linkage_name) + current_function_info_->mangled_name = data; + } +} + +void CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { + if (attr == DW_AT_stmt_list) { + SectionMap::const_iterator iter = + GetSectionByName(sections_, ".debug_line"); + assert(iter != sections_.end()); + + scoped_ptr lireader(new LineInfo(iter->second.first + data, + iter->second.second - data, + reader_, linehandler_)); + lireader->Start(); + } else if (current_function_info_) { + switch (attr) { + case DW_AT_low_pc: + current_function_info_->lowpc = data; + break; + case DW_AT_high_pc: + current_function_info_->highpc = data; + break; + case DW_AT_decl_line: + current_function_info_->line = data; + break; + case DW_AT_decl_file: + current_function_info_->file = files_->at(data).name; + break; + case DW_AT_ranges: + current_function_info_->ranges = data; + break; + default: + break; + } + } +} + +void CUFunctionInfoHandler::ProcessAttributeReference(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { + if (current_function_info_) { + switch (attr) { + case DW_AT_specification: { + // Some functions have a "specification" attribute + // which means they were defined elsewhere. The name + // attribute is not repeated, and must be taken from + // the specification DIE. Here we'll assume that + // any DIE referenced in this manner will already have + // been seen, but that's not really required by the spec. + FunctionMap::iterator iter = offset_to_funcinfo_->find(data); + if (iter != offset_to_funcinfo_->end()) { + current_function_info_->name = iter->second->name; + current_function_info_->mangled_name = iter->second->mangled_name; + } else { + // If you hit this, this code probably needs to be rewritten. + fprintf(stderr, + "Error: DW_AT_specification was seen before the referenced " + "DIE! (Looking for DIE at offset %08llx, in DIE at " + "offset %08llx)\n", data, offset); + } + break; + } + default: + break; + } + } +} + +void CUFunctionInfoHandler::EndDIE(uint64_t offset) { + if (current_function_info_ && current_function_info_->lowpc) + address_to_funcinfo_->insert(std::make_pair(current_function_info_->lowpc, + current_function_info_)); +} + +} // namespace google_breakpad diff --git a/src/common/dwarf/functioninfo.h b/src/common/dwarf/functioninfo.h new file mode 100644 index 0000000..1387c5b --- /dev/null +++ b/src/common/dwarf/functioninfo.h @@ -0,0 +1,191 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// This file contains the definitions for a DWARF2/3 information +// collector that uses the DWARF2/3 reader interface to build a mapping +// of addresses to files, lines, and functions. + +#ifndef COMMON_DWARF_FUNCTIONINFO_H__ +#define COMMON_DWARF_FUNCTIONINFO_H__ + +#include +#include +#include +#include + +#include "common/dwarf/dwarf2reader.h" +#include "common/using_std_string.h" + + +namespace google_breakpad { + +struct FunctionInfo { + // Name of the function + string name; + // Mangled name of the function + string mangled_name; + // File containing this function + string file; + // Line number for start of function. + uint32_t line; + // Beginning address for this function + uint64_t lowpc; + // End address for this function. + uint64_t highpc; + // Ranges offset + uint64_t ranges; +}; + +struct SourceFileInfo { + // Name of the source file name + string name; + // Low address of source file name + uint64_t lowpc; +}; + +typedef std::map FunctionMap; +typedef std::map > LineMap; + +// This class is a basic line info handler that fills in the dirs, +// file, and linemap passed into it with the data produced from the +// LineInfoHandler. +class CULineInfoHandler: public LineInfoHandler { + public: + + // + CULineInfoHandler(std::vector* files, + std::vector* dirs, + LineMap* linemap); + virtual ~CULineInfoHandler() { } + + // Called when we define a directory. We just place NAME into dirs_ + // at position DIR_NUM. + virtual void DefineDir(const string& name, uint32_t dir_num); + + // Called when we define a filename. We just place + // concat(dirs_[DIR_NUM], NAME) into files_ at position FILE_NUM. + virtual void DefineFile(const string& name, int32 file_num, + uint32_t dir_num, uint64_t mod_time, uint64_t length); + + + // Called when the line info reader has a new line, address pair + // ready for us. ADDRESS is the address of the code, LENGTH is the + // length of its machine code in bytes, FILE_NUM is the file number + // containing the code, LINE_NUM is the line number in that file for + // the code, and COLUMN_NUM is the column number the code starts at, + // if we know it (0 otherwise). + virtual void AddLine(uint64_t address, uint64_t length, + uint32_t file_num, uint32_t line_num, + uint32_t column_num); + + private: + LineMap* linemap_; + std::vector* files_; + std::vector* dirs_; +}; + +class CUFunctionInfoHandler: public Dwarf2Handler { + public: + CUFunctionInfoHandler(std::vector* files, + std::vector* dirs, + LineMap* linemap, + FunctionMap* offset_to_funcinfo, + FunctionMap* address_to_funcinfo, + CULineInfoHandler* linehandler, + const SectionMap& sections, + ByteReader* reader) + : files_(files), dirs_(dirs), linemap_(linemap), + offset_to_funcinfo_(offset_to_funcinfo), + address_to_funcinfo_(address_to_funcinfo), + linehandler_(linehandler), sections_(sections), + reader_(reader), current_function_info_(NULL) { } + + virtual ~CUFunctionInfoHandler() { } + + // Start to process a compilation unit at OFFSET from the beginning of the + // .debug_info section. We want to see all compilation units, so we + // always return true. + + virtual bool StartCompilationUnit(uint64_t offset, uint8_t address_size, + uint8_t offset_size, uint64_t cu_length, + uint8_t dwarf_version); + + // Start to process a DIE at OFFSET from the beginning of the + // .debug_info section. We only care about function related DIE's. + virtual bool StartDIE(uint64_t offset, enum DwarfTag tag); + + // Called when we have an attribute with unsigned data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of the .debug_info section, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA. + virtual void ProcessAttributeUnsigned(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data); + + // Called when we have an attribute with a DIE reference to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of the .debug_info section, has a name of ATTR, a form of + // FORM, and the offset of the referenced DIE from the start of the + // .debug_info section is in DATA. + virtual void ProcessAttributeReference(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data); + + // Called when we have an attribute with string data to give to + // our handler. The attribute is for the DIE at OFFSET from the + // beginning of the .debug_info section, has a name of ATTR, a form of + // FORM, and the actual data of the attribute is in DATA. + virtual void ProcessAttributeString(uint64_t offset, + enum DwarfAttribute attr, + enum DwarfForm form, + const string& data); + + // Called when finished processing the DIE at OFFSET. + // Because DWARF2/3 specifies a tree of DIEs, you may get starts + // before ends of the previous DIE, as we process children before + // ending the parent. + virtual void EndDIE(uint64_t offset); + + private: + std::vector* files_; + std::vector* dirs_; + LineMap* linemap_; + FunctionMap* offset_to_funcinfo_; + FunctionMap* address_to_funcinfo_; + CULineInfoHandler* linehandler_; + const SectionMap& sections_; + ByteReader* reader_; + FunctionInfo* current_function_info_; + uint64_t current_compilation_unit_offset_; +}; + +} // namespace google_breakpad +#endif // COMMON_DWARF_FUNCTIONINFO_H__ diff --git a/src/common/dwarf/line_state_machine.h b/src/common/dwarf/line_state_machine.h new file mode 100644 index 0000000..1797e3b --- /dev/null +++ b/src/common/dwarf/line_state_machine.h @@ -0,0 +1,63 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#ifndef COMMON_DWARF_LINE_STATE_MACHINE_H__ +#define COMMON_DWARF_LINE_STATE_MACHINE_H__ + +#include + +namespace google_breakpad { + +// This is the format of a DWARF2/3 line state machine that we process +// opcodes using. There is no need for anything outside the lineinfo +// processor to know how this works. +struct LineStateMachine { + void Reset(bool default_is_stmt) { + file_num = 1; + address = 0; + line_num = 1; + column_num = 0; + is_stmt = default_is_stmt; + basic_block = false; + end_sequence = false; + } + + uint32_t file_num; + uint64_t address; + uint32_t line_num; + uint32_t column_num; + bool is_stmt; // stmt means statement. + bool basic_block; + bool end_sequence; +}; + +} // namespace google_breakpad + + +#endif // COMMON_DWARF_LINE_STATE_MACHINE_H__ diff --git a/src/common/dwarf/types.h b/src/common/dwarf/types.h new file mode 100644 index 0000000..b14d7a3 --- /dev/null +++ b/src/common/dwarf/types.h @@ -0,0 +1,41 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// This file contains some typedefs for basic types + + +#ifndef _COMMON_DWARF_TYPES_H__ +#define _COMMON_DWARF_TYPES_H__ + +#include + +typedef intptr_t intptr; +typedef uintptr_t uintptr; + +#endif // _COMMON_DWARF_TYPES_H__ diff --git a/src/common/dwarf_cfi_to_module.cc b/src/common/dwarf_cfi_to_module.cc new file mode 100644 index 0000000..4c59417 --- /dev/null +++ b/src/common/dwarf_cfi_to_module.cc @@ -0,0 +1,324 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// Implementation of google_breakpad::DwarfCFIToModule. +// See dwarf_cfi_to_module.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "common/dwarf_cfi_to_module.h" + +namespace google_breakpad { + +using std::ostringstream; + +vector DwarfCFIToModule::RegisterNames::MakeVector( + const char * const *strings, + size_t size) { + vector names(strings, strings + size); + return names; +} + +vector DwarfCFIToModule::RegisterNames::I386() { + static const char *const names[] = { + "$eax", "$ecx", "$edx", "$ebx", "$esp", "$ebp", "$esi", "$edi", + "$eip", "$eflags", "$unused1", + "$st0", "$st1", "$st2", "$st3", "$st4", "$st5", "$st6", "$st7", + "$unused2", "$unused3", + "$xmm0", "$xmm1", "$xmm2", "$xmm3", "$xmm4", "$xmm5", "$xmm6", "$xmm7", + "$mm0", "$mm1", "$mm2", "$mm3", "$mm4", "$mm5", "$mm6", "$mm7", + "$fcw", "$fsw", "$mxcsr", + "$es", "$cs", "$ss", "$ds", "$fs", "$gs", "$unused4", "$unused5", + "$tr", "$ldtr" + }; + + return MakeVector(names, sizeof(names) / sizeof(names[0])); +} + +vector DwarfCFIToModule::RegisterNames::X86_64() { + static const char *const names[] = { + "$rax", "$rdx", "$rcx", "$rbx", "$rsi", "$rdi", "$rbp", "$rsp", + "$r8", "$r9", "$r10", "$r11", "$r12", "$r13", "$r14", "$r15", + "$rip", + "$xmm0","$xmm1","$xmm2", "$xmm3", "$xmm4", "$xmm5", "$xmm6", "$xmm7", + "$xmm8","$xmm9","$xmm10","$xmm11","$xmm12","$xmm13","$xmm14","$xmm15", + "$st0", "$st1", "$st2", "$st3", "$st4", "$st5", "$st6", "$st7", + "$mm0", "$mm1", "$mm2", "$mm3", "$mm4", "$mm5", "$mm6", "$mm7", + "$rflags", + "$es", "$cs", "$ss", "$ds", "$fs", "$gs", "$unused1", "$unused2", + "$fs.base", "$gs.base", "$unused3", "$unused4", + "$tr", "$ldtr", + "$mxcsr", "$fcw", "$fsw" + }; + + return MakeVector(names, sizeof(names) / sizeof(names[0])); +} + +// Per ARM IHI 0040A, section 3.1 +vector DwarfCFIToModule::RegisterNames::ARM() { + static const char *const names[] = { + "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", + "fps", "cpsr", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", + "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", + "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", + "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7" + }; + + return MakeVector(names, sizeof(names) / sizeof(names[0])); +} + +// Per ARM IHI 0057A, section 3.1 +vector DwarfCFIToModule::RegisterNames::ARM64() { + static const char *const names[] = { + "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", + "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", + "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", + "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" + }; + + return MakeVector(names, sizeof(names) / sizeof(names[0])); +} + +vector DwarfCFIToModule::RegisterNames::MIPS() { + static const char* const kRegisterNames[] = { + "$zero", "$at", "$v0", "$v1", "$a0", "$a1", "$a2", "$a3", + "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", + "$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6", "$s7", + "$t8", "$t9", "$k0", "$k1", "$gp", "$sp", "$fp", "$ra", + "$lo", "$hi", "$pc", "$f0", "$f2", "$f3", "$f4", "$f5", + "$f6", "$f7", "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", + "$f14", "$f15", "$f16", "$f17", "$f18", "$f19", "$f20", + "$f21", "$f22", "$f23", "$f24", "$f25", "$f26", "$f27", + "$f28", "$f29", "$f30", "$f31", "$fcsr", "$fir" + }; + + return MakeVector(kRegisterNames, + sizeof(kRegisterNames) / sizeof(kRegisterNames[0])); +} + +vector DwarfCFIToModule::RegisterNames::RISCV() { + static const char *const names[] = { + "pc", "ra", "sp", "gp", "tp", "t0", "t1", "t2", + "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", + "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", + "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", + "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", + "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" + }; + + return MakeVector(names, sizeof(names) / sizeof(names[0])); +} + +bool DwarfCFIToModule::Entry(size_t offset, uint64_t address, uint64_t length, + uint8_t version, const string& augmentation, + unsigned return_address) { + assert(!entry_); + + // If CallFrameInfo can handle this version and + // augmentation, then we should be okay with that, so there's no + // need to check them here. + + // Get ready to collect entries. + entry_ = std::make_unique(); + entry_->address = address; + entry_->size = length; + entry_offset_ = offset; + return_address_ = return_address; + + // Breakpad STACK CFI records must provide a .ra rule, but DWARF CFI + // may not establish any rule for .ra if the return address column + // is an ordinary register, and that register holds the return + // address on entry to the function. So establish an initial .ra + // rule citing the return address register. + if (return_address_ < register_names_.size()) + entry_->initial_rules[ra_name_] = register_names_[return_address_]; + + return true; +} + +string DwarfCFIToModule::RegisterName(int i) { + assert(entry_); + if (i < 0) { + assert(i == kCFARegister); + return cfa_name_; + } + unsigned reg = i; + if (reg == return_address_) + return ra_name_; + + // Ensure that a non-empty name exists for this register value. + if (reg < register_names_.size() && !register_names_[reg].empty()) + return register_names_[reg]; + + reporter_->UnnamedRegister(entry_offset_, reg); + return string("unnamed_register") + std::to_string(reg); +} + +void DwarfCFIToModule::Record(Module::Address address, int reg, + const string& rule) { + assert(entry_); + + // Place the name in our global set of strings, and then use the string + // from the set. Even though the assignment looks like a copy, all the + // major string implementations use reference counting internally, + // so the effect is to have all our data structures share copies of rules + // whenever possible. Since register names are drawn from a + // vector, register names are already shared. + string shared_rule = *common_strings_.insert(rule).first; + + // Is this one of this entry's initial rules? + if (address == entry_->address) + entry_->initial_rules[RegisterName(reg)] = shared_rule; + // File it under the appropriate address. + else + entry_->rule_changes[address][RegisterName(reg)] = shared_rule; +} + +bool DwarfCFIToModule::UndefinedRule(uint64_t address, int reg) { + reporter_->UndefinedNotSupported(entry_offset_, RegisterName(reg)); + // Treat this as a non-fatal error. + return true; +} + +bool DwarfCFIToModule::SameValueRule(uint64_t address, int reg) { + ostringstream s; + s << RegisterName(reg); + Record(address, reg, s.str()); + return true; +} + +bool DwarfCFIToModule::OffsetRule(uint64_t address, int reg, + int base_register, long offset) { + ostringstream s; + s << RegisterName(base_register) << " " << offset << " + ^"; + Record(address, reg, s.str()); + return true; +} + +bool DwarfCFIToModule::ValOffsetRule(uint64_t address, int reg, + int base_register, long offset) { + ostringstream s; + s << RegisterName(base_register) << " " << offset << " +"; + Record(address, reg, s.str()); + return true; +} + +bool DwarfCFIToModule::RegisterRule(uint64_t address, int reg, + int base_register) { + ostringstream s; + s << RegisterName(base_register); + Record(address, reg, s.str()); + return true; +} + +bool DwarfCFIToModule::ExpressionRule(uint64_t address, int reg, + const string& expression) { + reporter_->ExpressionsNotSupported(entry_offset_, RegisterName(reg)); + // Treat this as a non-fatal error. + return true; +} + +bool DwarfCFIToModule::ValExpressionRule(uint64_t address, int reg, + const string& expression) { + reporter_->ExpressionsNotSupported(entry_offset_, RegisterName(reg)); + // Treat this as a non-fatal error. + return true; +} + +bool DwarfCFIToModule::End() { + module_->AddStackFrameEntry(std::move(entry_)); + return true; +} + +string DwarfCFIToModule::Architecture() { + return module_->architecture(); +} + +void DwarfCFIToModule::Reporter::UnnamedRegister(size_t offset, int reg) { + fprintf(stderr, "%s, section '%s': " + "the call frame entry at offset 0x%zx refers to register %d," + " whose name we don't know\n", + file_.c_str(), section_.c_str(), offset, reg); +} + +void DwarfCFIToModule::Reporter::UndefinedNotSupported(size_t offset, + const string& reg) { + fprintf(stderr, "%s, section '%s': " + "the call frame entry at offset 0x%zx sets the rule for " + "register '%s' to 'undefined', but the Breakpad symbol file format" + " cannot express this\n", + file_.c_str(), section_.c_str(), offset, reg.c_str()); +} + +void DwarfCFIToModule::Reporter::ExpressionsNotSupported(size_t offset, + const string& reg) { + fprintf(stderr, "%s, section '%s': " + "the call frame entry at offset 0x%zx uses a DWARF expression to" + " describe how to recover register '%s', " + " but this translator cannot yet translate DWARF expressions to" + " Breakpad postfix expressions\n", + file_.c_str(), section_.c_str(), offset, reg.c_str()); +} + +} // namespace google_breakpad diff --git a/src/common/dwarf_cfi_to_module.h b/src/common/dwarf_cfi_to_module.h new file mode 100644 index 0000000..19297db --- /dev/null +++ b/src/common/dwarf_cfi_to_module.h @@ -0,0 +1,206 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf_cfi_to_module.h: Define the DwarfCFIToModule class, which +// accepts parsed DWARF call frame info and adds it to a +// google_breakpad::Module object, which can write that information to +// a Breakpad symbol file. + +#ifndef COMMON_LINUX_DWARF_CFI_TO_MODULE_H +#define COMMON_LINUX_DWARF_CFI_TO_MODULE_H + +#include +#include + +#include +#include +#include +#include + +#include "common/module.h" +#include "common/dwarf/dwarf2reader.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +using google_breakpad::Module; +using std::set; +using std::vector; + +// A class that accepts parsed call frame information from the DWARF +// CFI parser and populates a google_breakpad::Module object with the +// contents. +class DwarfCFIToModule: public CallFrameInfo::Handler { + public: + + // DwarfCFIToModule uses an instance of this class to report errors + // detected while converting DWARF CFI to Breakpad STACK CFI records. + class Reporter { + public: + // Create a reporter that writes messages to the standard error + // stream. FILE is the name of the file we're processing, and + // SECTION is the name of the section within that file that we're + // looking at (.debug_frame, .eh_frame, etc.). + Reporter(const string& file, const string& section) + : file_(file), section_(section) { } + virtual ~Reporter() { } + + // The DWARF CFI entry at OFFSET cites register REG, but REG is not + // covered by the vector of register names passed to the + // DwarfCFIToModule constructor, nor does it match the return + // address column number for this entry. + virtual void UnnamedRegister(size_t offset, int reg); + + // The DWARF CFI entry at OFFSET says that REG is undefined, but the + // Breakpad symbol file format cannot express this. + virtual void UndefinedNotSupported(size_t offset, const string& reg); + + // The DWARF CFI entry at OFFSET says that REG uses a DWARF + // expression to find its value, but DwarfCFIToModule is not + // capable of translating DWARF expressions to Breakpad postfix + // expressions. + virtual void ExpressionsNotSupported(size_t offset, const string& reg); + + protected: + string file_, section_; + }; + + // Register name tables. If TABLE is a vector returned by one of these + // functions, then TABLE[R] is the name of the register numbered R in + // DWARF call frame information. + class RegisterNames { + public: + // Intel's "x86" or IA-32. + static vector I386(); + + // AMD x86_64, AMD64, Intel EM64T, or Intel 64 + static vector X86_64(); + + // ARM. + static vector ARM(); + + // ARM64, aka AARCH64. + static vector ARM64(); + + // MIPS. + static vector MIPS(); + + // RISC-V. + static vector RISCV(); + + private: + // Given STRINGS, an array of C strings with SIZE elements, return an + // equivalent vector. + static vector MakeVector(const char* const* strings, size_t size); + }; + + // Create a handler for the CallFrameInfo parser that + // records the stack unwinding information it receives in MODULE. + // + // Use REGISTER_NAMES[I] as the name of register number I; *this + // keeps a reference to the vector, so the vector should remain + // alive for as long as the DwarfCFIToModule does. + // + // Use REPORTER for reporting problems encountered in the conversion + // process. + DwarfCFIToModule(Module* module, const vector& register_names, + Reporter* reporter) + : module_(module), register_names_(register_names), reporter_(reporter), + return_address_(-1), cfa_name_(".cfa"), ra_name_(".ra") { + } + virtual ~DwarfCFIToModule() = default; + + virtual bool Entry(size_t offset, uint64_t address, uint64_t length, + uint8_t version, const string& augmentation, + unsigned return_address); + virtual bool UndefinedRule(uint64_t address, int reg); + virtual bool SameValueRule(uint64_t address, int reg); + virtual bool OffsetRule(uint64_t address, int reg, + int base_register, long offset); + virtual bool ValOffsetRule(uint64_t address, int reg, + int base_register, long offset); + virtual bool RegisterRule(uint64_t address, int reg, int base_register); + virtual bool ExpressionRule(uint64_t address, int reg, + const string& expression); + virtual bool ValExpressionRule(uint64_t address, int reg, + const string& expression); + virtual bool End(); + + virtual string Architecture(); + + private: + // Return the name to use for register REG. + string RegisterName(int i); + + // Record RULE for register REG at ADDRESS. + void Record(Module::Address address, int reg, const string& rule); + + // The module to which we should add entries. + Module* module_; + + // Map from register numbers to register names. + const vector& register_names_; + + // The reporter to use to report problems. + Reporter* reporter_; + + // The current entry we're constructing. + std::unique_ptr entry_; + + // The section offset of the current frame description entry, for + // use in error messages. + size_t entry_offset_; + + // The return address column for that entry. + unsigned return_address_; + + // The names of the return address and canonical frame address. Putting + // these here instead of using string literals allows us to share their + // texts in reference-counted string implementations (all the + // popular ones). Many, many rules cite these strings. + string cfa_name_, ra_name_; + + // A set of strings used by this CFI. Before storing a string in one of + // our data structures, insert it into this set, and then use the string + // from the set. + // + // Because string uses reference counting internally, simply using + // strings from this set, even if passed by value, assigned, or held + // directly in structures and containers (map, for example), + // causes those strings to share a single instance of each distinct piece + // of text. + set common_strings_; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_DWARF_CFI_TO_MODULE_H diff --git a/src/common/dwarf_cfi_to_module_unittest.cc b/src/common/dwarf_cfi_to_module_unittest.cc new file mode 100644 index 0000000..52653ec --- /dev/null +++ b/src/common/dwarf_cfi_to_module_unittest.cc @@ -0,0 +1,321 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf_cfi_to_module_unittest.cc: Tests for google_breakpad::DwarfCFIToModule. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/dwarf_cfi_to_module.h" +#include "common/using_std_string.h" + +using std::vector; + +using google_breakpad::Module; +using google_breakpad::DwarfCFIToModule; +using testing::ContainerEq; +using testing::Test; +using testing::_; + +struct MockCFIReporter: public DwarfCFIToModule::Reporter { + MockCFIReporter(const string& file, const string& section) + : Reporter(file, section) { } + MOCK_METHOD2(UnnamedRegister, void(size_t offset, int reg)); + MOCK_METHOD2(UndefinedNotSupported, void(size_t offset, const string& reg)); + MOCK_METHOD2(ExpressionsNotSupported, void(size_t offset, const string& reg)); +}; + +struct DwarfCFIToModuleFixture { + DwarfCFIToModuleFixture() + : module("module name", "module os", "module arch", "module id"), + reporter("reporter file", "reporter section"), + handler(&module, register_names, &reporter) { + register_names.push_back("reg0"); + register_names.push_back("reg1"); + register_names.push_back("reg2"); + register_names.push_back("reg3"); + register_names.push_back("reg4"); + register_names.push_back("reg5"); + register_names.push_back("reg6"); + register_names.push_back("reg7"); + register_names.push_back("sp"); + register_names.push_back("pc"); + register_names.push_back(""); + + EXPECT_CALL(reporter, UnnamedRegister(_, _)).Times(0); + EXPECT_CALL(reporter, UndefinedNotSupported(_, _)).Times(0); + EXPECT_CALL(reporter, ExpressionsNotSupported(_, _)).Times(0); + } + + Module module; + vector register_names; + MockCFIReporter reporter; + DwarfCFIToModule handler; + vector entries; +}; + +class Entry: public DwarfCFIToModuleFixture, public Test { }; + +TEST_F(Entry, Accept) { + ASSERT_TRUE(handler.Entry(0x3b8961b8, 0xa21069698096fc98ULL, + 0xb440ce248169c8d6ULL, 3, "", 0xea93c106)); + ASSERT_TRUE(handler.End()); + module.GetStackFrameEntries(&entries); + EXPECT_EQ(1U, entries.size()); + EXPECT_EQ(0xa21069698096fc98ULL, entries[0]->address); + EXPECT_EQ(0xb440ce248169c8d6ULL, entries[0]->size); + EXPECT_EQ(0U, entries[0]->initial_rules.size()); + EXPECT_EQ(0U, entries[0]->rule_changes.size()); +} + +TEST_F(Entry, AcceptOldVersion) { + ASSERT_TRUE(handler.Entry(0xeb60e0fc, 0x75b8806bb09eab78ULL, + 0xc771f44958d40bbcULL, 1, "", 0x093c945e)); + ASSERT_TRUE(handler.End()); + module.GetStackFrameEntries(&entries); + EXPECT_EQ(1U, entries.size()); + EXPECT_EQ(0x75b8806bb09eab78ULL, entries[0]->address); + EXPECT_EQ(0xc771f44958d40bbcULL, entries[0]->size); + EXPECT_EQ(0U, entries[0]->initial_rules.size()); + EXPECT_EQ(0U, entries[0]->rule_changes.size()); +} + +struct RuleFixture: public DwarfCFIToModuleFixture { + RuleFixture() : DwarfCFIToModuleFixture() { + entry_address = 0x89327ebf86b47492ULL; + entry_size = 0x2f8cd573072fe02aULL; + return_reg = 0x7886a346; + } + void StartEntry() { + ASSERT_TRUE(handler.Entry(0x4445c05c, entry_address, entry_size, + 3, "", return_reg)); + } + void CheckEntry() { + module.GetStackFrameEntries(&entries); + EXPECT_EQ(1U, entries.size()); + EXPECT_EQ(entry_address, entries[0]->address); + EXPECT_EQ(entry_size, entries[0]->size); + } + uint64_t entry_address, entry_size; + unsigned return_reg; +}; + +class Rule: public RuleFixture, public Test { }; + +TEST_F(Rule, UndefinedRule) { + EXPECT_CALL(reporter, UndefinedNotSupported(_, "reg7")); + StartEntry(); + ASSERT_TRUE(handler.UndefinedRule(entry_address, 7)); + ASSERT_TRUE(handler.End()); + CheckEntry(); + EXPECT_EQ(0U, entries[0]->initial_rules.size()); + EXPECT_EQ(0U, entries[0]->rule_changes.size()); +} + +TEST_F(Rule, RegisterWithEmptyName) { + EXPECT_CALL(reporter, UnnamedRegister(_, 10)); + EXPECT_CALL(reporter, UndefinedNotSupported(_, "unnamed_register10")); + StartEntry(); + ASSERT_TRUE(handler.UndefinedRule(entry_address, 10)); + ASSERT_TRUE(handler.End()); + CheckEntry(); + EXPECT_EQ(0U, entries[0]->initial_rules.size()); + EXPECT_EQ(0U, entries[0]->rule_changes.size()); +} + +TEST_F(Rule, SameValueRule) { + StartEntry(); + ASSERT_TRUE(handler.SameValueRule(entry_address, 6)); + ASSERT_TRUE(handler.End()); + CheckEntry(); + Module::RuleMap expected_initial; + expected_initial["reg6"] = "reg6"; + EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial)); + EXPECT_EQ(0U, entries[0]->rule_changes.size()); +} + +TEST_F(Rule, OffsetRule) { + StartEntry(); + ASSERT_TRUE(handler.OffsetRule(entry_address + 1, return_reg, + DwarfCFIToModule::kCFARegister, + 16927065)); + ASSERT_TRUE(handler.End()); + CheckEntry(); + EXPECT_EQ(0U, entries[0]->initial_rules.size()); + Module::RuleChangeMap expected_changes; + expected_changes[entry_address + 1][".ra"] = ".cfa 16927065 + ^"; + EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes)); +} + +TEST_F(Rule, OffsetRuleNegative) { + StartEntry(); + ASSERT_TRUE(handler.OffsetRule(entry_address + 1, + DwarfCFIToModule::kCFARegister, 4, -34530721)); + ASSERT_TRUE(handler.End()); + CheckEntry(); + EXPECT_EQ(0U, entries[0]->initial_rules.size()); + Module::RuleChangeMap expected_changes; + expected_changes[entry_address + 1][".cfa"] = "reg4 -34530721 + ^"; + EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes)); +} + +TEST_F(Rule, ValOffsetRule) { + // Use an unnamed register number, to exercise that branch of RegisterName. + EXPECT_CALL(reporter, UnnamedRegister(_, 11)); + StartEntry(); + ASSERT_TRUE(handler.ValOffsetRule(entry_address + 0x5ab7, + DwarfCFIToModule::kCFARegister, + 11, 61812979)); + ASSERT_TRUE(handler.End()); + CheckEntry(); + EXPECT_EQ(0U, entries[0]->initial_rules.size()); + Module::RuleChangeMap expected_changes; + expected_changes[entry_address + 0x5ab7][".cfa"] = + "unnamed_register11 61812979 +"; + EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes)); +} + +TEST_F(Rule, RegisterRule) { + StartEntry(); + ASSERT_TRUE(handler.RegisterRule(entry_address, return_reg, 3)); + ASSERT_TRUE(handler.End()); + CheckEntry(); + Module::RuleMap expected_initial; + expected_initial[".ra"] = "reg3"; + EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial)); + EXPECT_EQ(0U, entries[0]->rule_changes.size()); +} + +TEST_F(Rule, ExpressionRule) { + EXPECT_CALL(reporter, ExpressionsNotSupported(_, "reg2")); + StartEntry(); + ASSERT_TRUE(handler.ExpressionRule(entry_address + 0xf326, 2, + "it takes two to tango")); + ASSERT_TRUE(handler.End()); + CheckEntry(); + EXPECT_EQ(0U, entries[0]->initial_rules.size()); + EXPECT_EQ(0U, entries[0]->rule_changes.size()); +} + +TEST_F(Rule, ValExpressionRule) { + EXPECT_CALL(reporter, ExpressionsNotSupported(_, "reg0")); + StartEntry(); + ASSERT_TRUE(handler.ValExpressionRule(entry_address + 0x6367, 0, + "bit off more than he could chew")); + ASSERT_TRUE(handler.End()); + CheckEntry(); + EXPECT_EQ(0U, entries[0]->initial_rules.size()); + EXPECT_EQ(0U, entries[0]->rule_changes.size()); +} + +TEST_F(Rule, DefaultReturnAddressRule) { + return_reg = 2; + StartEntry(); + ASSERT_TRUE(handler.RegisterRule(entry_address, 0, 1)); + ASSERT_TRUE(handler.End()); + CheckEntry(); + Module::RuleMap expected_initial; + expected_initial[".ra"] = "reg2"; + expected_initial["reg0"] = "reg1"; + EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial)); + EXPECT_EQ(0U, entries[0]->rule_changes.size()); +} + +TEST_F(Rule, DefaultReturnAddressRuleOverride) { + return_reg = 2; + StartEntry(); + ASSERT_TRUE(handler.RegisterRule(entry_address, return_reg, 1)); + ASSERT_TRUE(handler.End()); + CheckEntry(); + Module::RuleMap expected_initial; + expected_initial[".ra"] = "reg1"; + EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial)); + EXPECT_EQ(0U, entries[0]->rule_changes.size()); +} + +TEST_F(Rule, DefaultReturnAddressRuleLater) { + return_reg = 2; + StartEntry(); + ASSERT_TRUE(handler.RegisterRule(entry_address + 1, return_reg, 1)); + ASSERT_TRUE(handler.End()); + CheckEntry(); + Module::RuleMap expected_initial; + expected_initial[".ra"] = "reg2"; + EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial)); + Module::RuleChangeMap expected_changes; + expected_changes[entry_address + 1][".ra"] = "reg1"; + EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes)); +} + +TEST(RegisterNames, I386) { + vector names = DwarfCFIToModule::RegisterNames::I386(); + + EXPECT_EQ("$eax", names[0]); + EXPECT_EQ("$ecx", names[1]); + EXPECT_EQ("$esp", names[4]); + EXPECT_EQ("$eip", names[8]); +} + +TEST(RegisterNames, ARM) { + vector names = DwarfCFIToModule::RegisterNames::ARM(); + + EXPECT_EQ("r0", names[0]); + EXPECT_EQ("r10", names[10]); + EXPECT_EQ("sp", names[13]); + EXPECT_EQ("lr", names[14]); + EXPECT_EQ("pc", names[15]); +} + +TEST(RegisterNames, X86_64) { + vector names = DwarfCFIToModule::RegisterNames::X86_64(); + + EXPECT_EQ("$rax", names[0]); + EXPECT_EQ("$rdx", names[1]); + EXPECT_EQ("$rbp", names[6]); + EXPECT_EQ("$rsp", names[7]); + EXPECT_EQ("$rip", names[16]); +} + +TEST(RegisterNames, RISCV) { + vector names = DwarfCFIToModule::RegisterNames::RISCV(); + + EXPECT_EQ("pc", names[0]); + EXPECT_EQ("t6", names[31]); + EXPECT_EQ("f0", names[32]); + EXPECT_EQ("f31", names[63]); + EXPECT_EQ("v0", names[96]); + EXPECT_EQ("v31", names[127]); +} + diff --git a/src/common/dwarf_cu_to_module.cc b/src/common/dwarf_cu_to_module.cc new file mode 100644 index 0000000..94a0d42 --- /dev/null +++ b/src/common/dwarf_cu_to_module.cc @@ -0,0 +1,1589 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// Implement the DwarfCUToModule class; see dwarf_cu_to_module.h. + +// For PRI* macros, before anything else might #include it. +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif /* __STDC_FORMAT_MACROS */ + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/dwarf_cu_to_module.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "common/string_view.h" +#include "common/dwarf_line_to_module.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::accumulate; +using std::map; +using std::pair; +using std::sort; +using std::vector; +using std::unique_ptr; + +// Data provided by a DWARF specification DIE. +// +// In DWARF, the DIE for a definition may contain a DW_AT_specification +// attribute giving the offset of the corresponding declaration DIE, and +// the definition DIE may omit information given in the declaration. For +// example, it's common for a function's address range to appear only in +// its definition DIE, but its name to appear only in its declaration +// DIE. +// +// The dumper needs to be able to follow DW_AT_specification links to +// bring all this information together in a FUNC record. Conveniently, +// DIEs that are the target of such links have a DW_AT_declaration flag +// set, so we can identify them when we first see them, and record their +// contents for later reference. +// +// A Specification holds information gathered from a declaration DIE that +// we may need if we find a DW_AT_specification link pointing to it. +struct DwarfCUToModule::Specification { + // The qualified name that can be found by demangling DW_AT_MIPS_linkage_name. + StringView qualified_name; + + // The name of the enclosing scope, or the empty string if there is none. + StringView enclosing_name; + + // The name for the specification DIE itself, without any enclosing + // name components. + StringView unqualified_name; +}; + +// An abstract origin -- base definition of an inline function. +struct AbstractOrigin { + explicit AbstractOrigin(StringView name) : name(name) {} + + StringView name; +}; + +typedef map AbstractOriginByOffset; + +// Data global to the DWARF-bearing file that is private to the +// DWARF-to-Module process. +struct DwarfCUToModule::FilePrivate { + // A map from offsets of DIEs within the .debug_info section to + // Specifications describing those DIEs. Specification references can + // cross compilation unit boundaries. + SpecificationByOffset specifications; + + AbstractOriginByOffset origins; + + // Keep a list of forward references from DW_AT_abstract_origin and + // DW_AT_specification attributes so names can be fixed up. + std::map forward_ref_die_to_func; +}; + +DwarfCUToModule::FileContext::FileContext(const string& filename, + Module* module, + bool handle_inter_cu_refs) + : filename_(filename), + module_(module), + handle_inter_cu_refs_(handle_inter_cu_refs), + file_private_(new FilePrivate()) { +} + +DwarfCUToModule::FileContext::~FileContext() { + for (std::vector::iterator i = uncompressed_sections_.begin(); + i != uncompressed_sections_.end(); ++i) { + delete[] *i; + } +} + +void DwarfCUToModule::FileContext::AddSectionToSectionMap( + const string& name, const uint8_t* contents, uint64_t length) { + section_map_[name] = std::make_pair(contents, length); +} + +void DwarfCUToModule::FileContext::AddManagedSectionToSectionMap( + const string& name, uint8_t* contents, uint64_t length) { + section_map_[name] = std::make_pair(contents, length); + uncompressed_sections_.push_back(contents); +} + +void DwarfCUToModule::FileContext::ClearSectionMapForTest() { + section_map_.clear(); +} + +const SectionMap& +DwarfCUToModule::FileContext::section_map() const { + return section_map_; +} + +void DwarfCUToModule::FileContext::ClearSpecifications() { + if (!handle_inter_cu_refs_) + file_private_->specifications.clear(); +} + +bool DwarfCUToModule::FileContext::IsUnhandledInterCUReference( + uint64_t offset, uint64_t compilation_unit_start) const { + if (handle_inter_cu_refs_) + return false; + return offset < compilation_unit_start; +} + +// Information global to the particular compilation unit we're +// parsing. This is for data shared across the CU's entire DIE tree, +// and parameters from the code invoking the CU parser. +struct DwarfCUToModule::CUContext { + CUContext(FileContext* file_context_arg, + WarningReporter* reporter_arg, + RangesHandler* ranges_handler_arg, + uint64_t low_pc, + uint64_t addr_base) + : version(0), + file_context(file_context_arg), + reporter(reporter_arg), + ranges_handler(ranges_handler_arg), + language(Language::CPlusPlus), + low_pc(low_pc), + high_pc(0), + ranges_form(DW_FORM_sec_offset), + ranges_data(0), + ranges_base(0), + addr_base(addr_base), + str_offsets_base(0) {} + + ~CUContext() { + for (vector::iterator it = functions.begin(); + it != functions.end(); ++it) { + delete *it; + } + }; + + // Dwarf version of the source CU. + uint8_t version; + + // The DWARF-bearing file into which this CU was incorporated. + FileContext* file_context; + + // For printing error messages. + WarningReporter* reporter; + + // For reading ranges from the .debug_ranges section + RangesHandler* ranges_handler; + + // The source language of this compilation unit. + const Language* language; + + // Addresses covered by this CU. If high_pc_ is non-zero then the CU covers + // low_pc to high_pc, otherwise ranges_data is non-zero and low_pc represents + // the base address of the ranges covered by the CU. ranges_data will define + // the CU's actual ranges. + uint64_t low_pc; + uint64_t high_pc; + + // Ranges for this CU are read according to this form. + enum DwarfForm ranges_form; + uint64_t ranges_data; + + // Offset into .debug_rngslists where this CU's ranges are stored. + // Data in DW_FORM_rnglistx is relative to this offset. + uint64_t ranges_base; + + // Offset into .debug_addr where this CU's addresses are stored. Data in + // form DW_FORM_addrxX is relative to this offset. + uint64_t addr_base; + + // Offset into this CU's contribution to .debug_str_offsets. + uint64_t str_offsets_base; + + // Collect all the data from the CU that a RangeListReader needs to read a + // range. + bool AssembleRangeListInfo( + RangeListReader::CURangesInfo* info) { + const SectionMap& section_map + = file_context->section_map(); + info->version_ = version; + info->base_address_ = low_pc; + info->ranges_base_ = ranges_base; + const char* section_name = (version <= 4 ? + ".debug_ranges" : ".debug_rnglists"); + SectionMap::const_iterator map_entry + = GetSectionByName(section_map, section_name); + if (map_entry == section_map.end()) { + return false; + } + info->buffer_ = map_entry->second.first; + info->size_ = map_entry->second.second; + if (version > 4) { + SectionMap::const_iterator map_entry + = GetSectionByName(section_map, ".debug_addr"); + if (map_entry == section_map.end()) { + return false; + } + info->addr_buffer_ = map_entry->second.first; + info->addr_buffer_size_ = map_entry->second.second; + info->addr_base_ = addr_base; + } + return true; + } + + // The functions defined in this compilation unit. We accumulate + // them here during parsing. Then, in DwarfCUToModule::Finish, we + // assign them lines and add them to file_context->module. + // + // Destroying this destroys all the functions this vector points to. + vector functions; + + // A map of function pointers to the its forward specification DIE's offset. + map spec_function_offsets; +}; + +// Information about the context of a particular DIE. This is for +// information that changes as we descend the tree towards the leaves: +// the containing classes/namespaces, etc. +struct DwarfCUToModule::DIEContext { + // The fully-qualified name of the context. For example, for a + // tree like: + // + // DW_TAG_namespace Foo + // DW_TAG_class Bar + // DW_TAG_subprogram Baz + // + // in a C++ compilation unit, the DIEContext's name for the + // DW_TAG_subprogram DIE would be "Foo::Bar". The DIEContext's + // name for the DW_TAG_namespace DIE would be "". + StringView name; +}; + +// An abstract base class for all the dumper's DIE handlers. +class DwarfCUToModule::GenericDIEHandler: public DIEHandler { + public: + // Create a handler for the DIE at OFFSET whose compilation unit is + // described by CU_CONTEXT, and whose immediate context is described + // by PARENT_CONTEXT. + GenericDIEHandler(CUContext* cu_context, DIEContext* parent_context, + uint64_t offset) + : cu_context_(cu_context), + parent_context_(parent_context), + offset_(offset), + declaration_(false), + specification_(NULL), + no_specification(false), + abstract_origin_(NULL), + forward_ref_die_offset_(0), specification_offset_(0) { } + + // Derived classes' ProcessAttributeUnsigned can defer to this to + // handle DW_AT_declaration, or simply not override it. + void ProcessAttributeUnsigned(enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data); + + // Derived classes' ProcessAttributeReference can defer to this to + // handle DW_AT_specification, or simply not override it. + void ProcessAttributeReference(enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data); + + // Derived classes' ProcessAttributeReference can defer to this to + // handle DW_AT_specification, or simply not override it. + void ProcessAttributeString(enum DwarfAttribute attr, + enum DwarfForm form, + const string& data); + + protected: + // Compute and return the fully-qualified name of the DIE. If this + // DIE is a declaration DIE, to be cited by other DIEs' + // DW_AT_specification attributes, record its enclosing name and + // unqualified name in the specification table. + // + // Use this from EndAttributes member functions, not ProcessAttribute* + // functions; only the former can be sure that all the DIE's attributes + // have been seen. + // + // On return, if has_qualified_name is non-NULL, *has_qualified_name is set to + // true if the DIE includes a fully-qualified name, false otherwise. + StringView ComputeQualifiedName(bool* has_qualified_name); + + CUContext* cu_context_; + DIEContext* parent_context_; + uint64_t offset_; + + // If this DIE has a DW_AT_declaration attribute, this is its value. + // It is false on DIEs with no DW_AT_declaration attribute. + bool declaration_; + + // If this DIE has a DW_AT_specification attribute, this is the + // Specification structure for the DIE the attribute refers to. + // Otherwise, this is NULL. + Specification* specification_; + + // If this DIE has DW_AT_specification with offset smaller than this DIE and + // we can't find that in the specification map. + bool no_specification; + + // If this DIE has a DW_AT_abstract_origin attribute, this is the + // AbstractOrigin structure for the DIE the attribute refers to. + // Otherwise, this is NULL. + const AbstractOrigin* abstract_origin_; + + // If this DIE has a DW_AT_specification or DW_AT_abstract_origin and it is a + // forward reference, no Specification will be available. Track the reference + // to be fixed up when the DIE is parsed. + uint64_t forward_ref_die_offset_; + + // The root offset of Specification or abstract origin. + uint64_t specification_offset_; + + // The value of the DW_AT_name attribute, or the empty string if the + // DIE has no such attribute. + StringView name_attribute_; + + // The demangled value of the DW_AT_MIPS_linkage_name attribute, or the empty + // string if the DIE has no such attribute or its content could not be + // demangled. + StringView demangled_name_; + + // The non-demangled value of the DW_AT_MIPS_linkage_name attribute, + // it its content count not be demangled. + StringView raw_name_; +}; + +void DwarfCUToModule::GenericDIEHandler::ProcessAttributeUnsigned( + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { + switch (attr) { + case DW_AT_declaration: declaration_ = (data != 0); break; + default: break; + } +} + +void DwarfCUToModule::GenericDIEHandler::ProcessAttributeReference( + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { + switch (attr) { + case DW_AT_specification: { + FileContext* file_context = cu_context_->file_context; + if (file_context->IsUnhandledInterCUReference( + data, cu_context_->reporter->cu_offset())) { + cu_context_->reporter->UnhandledInterCUReference(offset_, data); + break; + } + // Find the Specification to which this attribute refers, and + // set specification_ appropriately. We could do more processing + // here, but it's better to leave the real work to our + // EndAttribute member function, at which point we know we have + // seen all the DIE's attributes. + SpecificationByOffset* specifications = + &file_context->file_private_->specifications; + SpecificationByOffset::iterator spec = specifications->find(data); + if (spec != specifications->end()) { + specification_ = &spec->second; + } else if (data > offset_) { + forward_ref_die_offset_ = data; + } else { + no_specification = true; + } + specification_offset_ = data; + break; + } + case DW_AT_abstract_origin: { + const AbstractOriginByOffset& origins = + cu_context_->file_context->file_private_->origins; + AbstractOriginByOffset::const_iterator origin = origins.find(data); + if (origin != origins.end()) { + abstract_origin_ = &(origin->second); + } else if (data > offset_) { + forward_ref_die_offset_ = data; + } + specification_offset_ = data; + break; + } + default: break; + } +} + +void DwarfCUToModule::GenericDIEHandler::ProcessAttributeString( + enum DwarfAttribute attr, + enum DwarfForm form, + const string& data) { + switch (attr) { + case DW_AT_name: + name_attribute_ = + cu_context_->file_context->module_->AddStringToPool(data); + break; + case DW_AT_MIPS_linkage_name: + case DW_AT_linkage_name: { + string demangled; + Language::DemangleResult result = + cu_context_->language->DemangleName(data, &demangled); + switch (result) { + case Language::kDemangleSuccess: + demangled_name_ = + cu_context_->file_context->module_->AddStringToPool(demangled); + break; + + case Language::kDemangleFailure: + cu_context_->reporter->DemangleError(data); + // fallthrough + case Language::kDontDemangle: + demangled_name_ = StringView(); + raw_name_ = cu_context_->file_context->module_->AddStringToPool(data); + break; + } + break; + } + default: break; + } +} + +StringView DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName( + bool* has_qualified_name) { + // Use the demangled name, if one is available. Demangled names are + // preferable to those inferred from the DWARF structure because they + // include argument types. + StringView* qualified_name = nullptr; + if (!demangled_name_.empty()) { + // Found it is this DIE. + qualified_name = &demangled_name_; + } else if (specification_ && !specification_->qualified_name.empty()) { + // Found it on the specification. + qualified_name = &specification_->qualified_name; + } + + StringView* unqualified_name = nullptr; + StringView* enclosing_name = nullptr; + if (!qualified_name) { + if (has_qualified_name) { + // dSYMs built with -gmlt do not include the DW_AT_linkage_name + // with the unmangled symbol, but rather include it in the + // LC_SYMTAB STABS, which end up in the externs of the module. + // + // Remember this so the Module can copy over the extern name later. + *has_qualified_name = false; + } + + // Find the unqualified name. If the DIE has its own DW_AT_name + // attribute, then use that; otherwise, check the specification. + if (!name_attribute_.empty()) { + unqualified_name = &name_attribute_; + } else if (specification_) { + unqualified_name = &specification_->unqualified_name; + } else if (!raw_name_.empty()) { + unqualified_name = &raw_name_; + } + + // Find the name of the enclosing context. If this DIE has a + // specification, it's the specification's enclosing context that + // counts; otherwise, use this DIE's context. + if (specification_) { + enclosing_name = &specification_->enclosing_name; + } else if (parent_context_) { + enclosing_name = &parent_context_->name; + } + } else { + if (has_qualified_name) { + *has_qualified_name = true; + } + } + + // Prepare the return value before upcoming mutations possibly invalidate the + // existing pointers. + string return_value; + if (qualified_name) { + return_value = qualified_name->str(); + } else if (unqualified_name && enclosing_name) { + // Combine the enclosing name and unqualified name to produce our + // own fully-qualified name. + return_value = cu_context_->language->MakeQualifiedName( + enclosing_name->str(), unqualified_name->str()); + } + + // If this DIE was marked as a declaration, record its names in the + // specification table. + if ((declaration_ && qualified_name) || + (unqualified_name && enclosing_name)) { + Specification spec; + if (qualified_name) { + spec.qualified_name = *qualified_name; + } else { + spec.enclosing_name = *enclosing_name; + spec.unqualified_name = *unqualified_name; + } + cu_context_->file_context->file_private_->specifications[offset_] = spec; + } + + return cu_context_->file_context->module_->AddStringToPool(return_value); +} + +static bool IsEmptyRange(const vector& ranges) { + uint64_t size = accumulate(ranges.cbegin(), ranges.cend(), 0, + [](uint64_t total, Module::Range entry) { + return total + entry.size; + } + ); + + return size == 0; +} + + +// A handler for DW_TAG_inlined_subroutine DIEs. +class DwarfCUToModule::InlineHandler : public GenericDIEHandler { + public: + InlineHandler(CUContext* cu_context, + DIEContext* parent_context, + uint64_t offset, + int inline_nest_level, + vector>& inlines) + : GenericDIEHandler(cu_context, parent_context, offset), + low_pc_(0), + high_pc_(0), + high_pc_form_(DW_FORM_addr), + ranges_form_(DW_FORM_sec_offset), + ranges_data_(0), + call_site_line_(0), + inline_nest_level_(inline_nest_level), + has_range_data_(false), + inlines_(inlines) {} + + void ProcessAttributeUnsigned(enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data); + DIEHandler* FindChildHandler(uint64_t offset, enum DwarfTag tag); + bool EndAttributes(); + void Finish(); + + private: + // The fully-qualified name, as derived from name_attribute_, + // specification_, parent_context_. Computed in EndAttributes. + StringView name_; + uint64_t low_pc_; // DW_AT_low_pc + uint64_t high_pc_; // DW_AT_high_pc + DwarfForm high_pc_form_; // DW_AT_high_pc can be length or address. + DwarfForm ranges_form_; // DW_FORM_sec_offset or DW_FORM_rnglistx + uint64_t ranges_data_; // DW_AT_ranges + int call_site_line_; // DW_AT_call_line + int call_site_file_id_; // DW_AT_call_file + int inline_nest_level_; + bool has_range_data_; + // A vector of inlines in the same nest level. It's owned by its parent + // function/inline. At Finish(), add this inline into the vector. + vector>& inlines_; + // A vector of child inlines. + vector> child_inlines_; +}; + +void DwarfCUToModule::InlineHandler::ProcessAttributeUnsigned( + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { + switch (attr) { + case DW_AT_low_pc: + low_pc_ = data; + break; + case DW_AT_high_pc: + high_pc_form_ = form; + high_pc_ = data; + break; + case DW_AT_ranges: + has_range_data_ = true; + ranges_data_ = data; + ranges_form_ = form; + break; + case DW_AT_call_line: + call_site_line_ = data; + break; + case DW_AT_call_file: + call_site_file_id_ = data; + break; + default: + GenericDIEHandler::ProcessAttributeUnsigned(attr, form, data); + break; + } +} + +DIEHandler* DwarfCUToModule::InlineHandler::FindChildHandler( + uint64_t offset, + enum DwarfTag tag) { + switch (tag) { + case DW_TAG_inlined_subroutine: + return new InlineHandler(cu_context_, nullptr, offset, + inline_nest_level_ + 1, child_inlines_); + default: + return NULL; + } +} + +bool DwarfCUToModule::InlineHandler::EndAttributes() { + if (abstract_origin_) + name_ = abstract_origin_->name; + if (name_.empty()) { + // We haven't seen the abstract origin yet, which might appears later and we + // will fix the name after calling + // InlineOriginMap::GetOrCreateInlineOrigin with right name. + name_ = + cu_context_->file_context->module_->AddStringToPool(""); + } + return true; +} + +void DwarfCUToModule::InlineHandler::Finish() { + vector ranges; + + if (!has_range_data_) { + if (high_pc_form_ != DW_FORM_addr && + high_pc_form_ != DW_FORM_GNU_addr_index && + high_pc_form_ != DW_FORM_addrx && + high_pc_form_ != DW_FORM_addrx1 && + high_pc_form_ != DW_FORM_addrx2 && + high_pc_form_ != DW_FORM_addrx3 && + high_pc_form_ != DW_FORM_addrx4) { + high_pc_ += low_pc_; + } + + Module::Range range(low_pc_, high_pc_ - low_pc_); + ranges.push_back(range); + } else { + RangesHandler* ranges_handler = cu_context_->ranges_handler; + if (ranges_handler) { + RangeListReader::CURangesInfo cu_info; + if (cu_context_->AssembleRangeListInfo(&cu_info)) { + if (!ranges_handler->ReadRanges(ranges_form_, ranges_data_, + &cu_info, &ranges)) { + ranges.clear(); + cu_context_->reporter->MalformedRangeList(ranges_data_); + } + } else { + cu_context_->reporter->MissingRanges(); + } + } + } + + // Ignore DW_TAG_inlined_subroutine with empty range. + if (ranges.empty()) { + return; + } + + // Every DW_TAG_inlined_subroutine should have a DW_AT_abstract_origin. + assert(specification_offset_ != 0); + + Module::InlineOriginMap& inline_origin_map = + cu_context_->file_context->module_ + ->inline_origin_maps[cu_context_->file_context->filename_]; + inline_origin_map.SetReference(specification_offset_, specification_offset_); + Module::InlineOrigin* origin = + inline_origin_map.GetOrCreateInlineOrigin(specification_offset_, name_); + unique_ptr in( + new Module::Inline(origin, ranges, call_site_line_, call_site_file_id_, + inline_nest_level_, std::move(child_inlines_))); + inlines_.push_back(std::move(in)); +} + +// A handler for DIEs that contain functions and contribute a +// component to their names: namespaces, classes, etc. +class DwarfCUToModule::NamedScopeHandler: public GenericDIEHandler { + public: + NamedScopeHandler(CUContext* cu_context, + DIEContext* parent_context, + uint64_t offset, + bool handle_inline) + : GenericDIEHandler(cu_context, parent_context, offset), + handle_inline_(handle_inline) {} + bool EndAttributes(); + DIEHandler* FindChildHandler(uint64_t offset, enum DwarfTag tag); + + private: + DIEContext child_context_; // A context for our children. + bool handle_inline_; +}; + +// A handler class for DW_TAG_subprogram DIEs. +class DwarfCUToModule::FuncHandler: public GenericDIEHandler { + public: + FuncHandler(CUContext* cu_context, + DIEContext* parent_context, + uint64_t offset, + bool handle_inline) + : GenericDIEHandler(cu_context, parent_context, offset), + low_pc_(0), + high_pc_(0), + high_pc_form_(DW_FORM_addr), + ranges_form_(DW_FORM_sec_offset), + ranges_data_(0), + inline_(false), + handle_inline_(handle_inline), + has_qualified_name_(false), + has_range_data_(false) {} + + void ProcessAttributeUnsigned(enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data); + void ProcessAttributeSigned(enum DwarfAttribute attr, + enum DwarfForm form, + int64_t data); + DIEHandler* FindChildHandler(uint64_t offset, enum DwarfTag tag); + bool EndAttributes(); + void Finish(); + + private: + // The fully-qualified name, as derived from name_attribute_, + // specification_, parent_context_. Computed in EndAttributes. + StringView name_; + uint64_t low_pc_, high_pc_; // DW_AT_low_pc, DW_AT_high_pc + DwarfForm high_pc_form_; // DW_AT_high_pc can be length or address. + DwarfForm ranges_form_; // DW_FORM_sec_offset or DW_FORM_rnglistx + uint64_t ranges_data_; // DW_AT_ranges + bool inline_; + vector> child_inlines_; + bool handle_inline_; + bool has_qualified_name_; + bool has_range_data_; + DIEContext child_context_; // A context for our children. +}; + +void DwarfCUToModule::FuncHandler::ProcessAttributeUnsigned( + enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { + switch (attr) { + // If this attribute is present at all --- even if its value is + // DW_INL_not_inlined --- then GCC may cite it as someone else's + // DW_AT_abstract_origin attribute. + case DW_AT_inline: inline_ = true; break; + + case DW_AT_low_pc: low_pc_ = data; break; + case DW_AT_high_pc: + high_pc_form_ = form; + high_pc_ = data; + break; + case DW_AT_ranges: + has_range_data_ = true; + ranges_data_ = data; + ranges_form_ = form; + break; + default: + GenericDIEHandler::ProcessAttributeUnsigned(attr, form, data); + break; + } +} + +void DwarfCUToModule::FuncHandler::ProcessAttributeSigned( + enum DwarfAttribute attr, + enum DwarfForm form, + int64_t data) { + switch (attr) { + // If this attribute is present at all --- even if its value is + // DW_INL_not_inlined --- then GCC may cite it as someone else's + // DW_AT_abstract_origin attribute. + case DW_AT_inline: inline_ = true; break; + + default: + break; + } +} + +DIEHandler* DwarfCUToModule::FuncHandler::FindChildHandler( + uint64_t offset, + enum DwarfTag tag) { + switch (tag) { + case DW_TAG_inlined_subroutine: + if (handle_inline_) + return new InlineHandler(cu_context_, nullptr, offset, 0, + child_inlines_); + case DW_TAG_class_type: + case DW_TAG_structure_type: + case DW_TAG_union_type: + return new NamedScopeHandler(cu_context_, &child_context_, offset, + handle_inline_); + default: + return NULL; + } +} + +bool DwarfCUToModule::FuncHandler::EndAttributes() { + // Compute our name, and record a specification, if appropriate. + name_ = ComputeQualifiedName(&has_qualified_name_); + if (name_.empty() && abstract_origin_) { + name_ = abstract_origin_->name; + } + child_context_.name = name_; + if (name_.empty() && no_specification) { + cu_context_->reporter->UnknownSpecification(offset_, specification_offset_); + } + return true; +} + +void DwarfCUToModule::FuncHandler::Finish() { + vector ranges; + + // Check if this DIE was one of the forward references that was not able + // to be processed, and fix up the name of the appropriate Module::Function. + // "name_" will have already been fixed up in EndAttributes(). + if (!name_.empty()) { + auto iter = + cu_context_->file_context->file_private_->forward_ref_die_to_func.find( + offset_); + if (iter != + cu_context_->file_context->file_private_->forward_ref_die_to_func.end()) + iter->second->name = name_; + } + + if (!has_range_data_) { + // Make high_pc_ an address, if it isn't already. + if (high_pc_form_ != DW_FORM_addr && + high_pc_form_ != DW_FORM_GNU_addr_index && + high_pc_form_ != DW_FORM_addrx && + high_pc_form_ != DW_FORM_addrx1 && + high_pc_form_ != DW_FORM_addrx2 && + high_pc_form_ != DW_FORM_addrx3 && + high_pc_form_ != DW_FORM_addrx4) { + high_pc_ += low_pc_; + } + + Module::Range range(low_pc_, high_pc_ - low_pc_); + ranges.push_back(range); + } else { + RangesHandler* ranges_handler = cu_context_->ranges_handler; + if (ranges_handler) { + RangeListReader::CURangesInfo cu_info; + if (cu_context_->AssembleRangeListInfo(&cu_info)) { + if (!ranges_handler->ReadRanges(ranges_form_, ranges_data_, + &cu_info, &ranges)) { + ranges.clear(); + cu_context_->reporter->MalformedRangeList(ranges_data_); + } + } else { + cu_context_->reporter->MissingRanges(); + } + } + } + + StringView name_omitted = + cu_context_->file_context->module_->AddStringToPool(""); + bool empty_range = IsEmptyRange(ranges); + // Did we collect the information we need? Not all DWARF function + // entries are non-empty (for example, inlined functions that were never + // used), but all the ones we're interested in cover a non-empty range of + // bytes. + if (!empty_range) { + low_pc_ = ranges.front().address; + // Malformed DWARF may omit the name, but all Module::Functions must + // have names. + StringView name = name_.empty() ? name_omitted : name_; + // Create a Module::Function based on the data we've gathered, and + // add it to the functions_ list. + scoped_ptr func(new Module::Function(name, low_pc_)); + func->ranges = ranges; + func->parameter_size = 0; + // If the name was unqualified, prefer the Extern name if there's a mismatch + // (the Extern name will be fully-qualified in that case). + func->prefer_extern_name = !has_qualified_name_; + if (func->address) { + // If the function address is zero this is a sign that this function + // description is just empty debug data and should just be discarded. + cu_context_->functions.push_back(func.release()); + if (forward_ref_die_offset_ != 0) { + cu_context_->file_context->file_private_ + ->forward_ref_die_to_func[forward_ref_die_offset_] = + cu_context_->functions.back(); + + cu_context_->spec_function_offsets[cu_context_->functions.back()] = + forward_ref_die_offset_; + } + + cu_context_->functions.back()->inlines.swap(child_inlines_); + } + } else if (inline_) { + AbstractOrigin origin(name_); + cu_context_->file_context->file_private_->origins.insert({offset_, origin}); + } + + // Only keep track of DW_TAG_subprogram which have the attributes we are + // interested. + if (handle_inline_ && (!empty_range || inline_)) { + StringView name = name_.empty() ? name_omitted : name_; + uint64_t offset = + specification_offset_ != 0 ? specification_offset_ : offset_; + Module::InlineOriginMap& inline_origin_map = + cu_context_->file_context->module_ + ->inline_origin_maps[cu_context_->file_context->filename_]; + inline_origin_map.SetReference(offset_, offset); + inline_origin_map.GetOrCreateInlineOrigin(offset_, name); + } +} + +bool DwarfCUToModule::NamedScopeHandler::EndAttributes() { + child_context_.name = ComputeQualifiedName(NULL); + if (child_context_.name.empty() && no_specification) { + cu_context_->reporter->UnknownSpecification(offset_, specification_offset_); + } + return true; +} + +DIEHandler* DwarfCUToModule::NamedScopeHandler::FindChildHandler( + uint64_t offset, + enum DwarfTag tag) { + switch (tag) { + case DW_TAG_subprogram: + return new FuncHandler(cu_context_, &child_context_, offset, + handle_inline_); + case DW_TAG_namespace: + case DW_TAG_class_type: + case DW_TAG_structure_type: + case DW_TAG_union_type: + return new NamedScopeHandler(cu_context_, &child_context_, offset, + handle_inline_); + default: + return NULL; + } +} + +void DwarfCUToModule::WarningReporter::CUHeading() { + if (printed_cu_header_) + return; + fprintf(stderr, "%s: in compilation unit '%s' (offset 0x%" PRIx64 "):\n", + filename_.c_str(), cu_name_.c_str(), cu_offset_); + printed_cu_header_ = true; +} + +void DwarfCUToModule::WarningReporter::UnknownSpecification(uint64_t offset, + uint64_t target) { + CUHeading(); + fprintf(stderr, "%s: the DIE at offset 0x%" PRIx64 " has a " + "DW_AT_specification attribute referring to the DIE at offset 0x%" + PRIx64 ", which was not marked as a declaration\n", + filename_.c_str(), offset, target); +} + +void DwarfCUToModule::WarningReporter::UnknownAbstractOrigin(uint64_t offset, + uint64_t target) { + CUHeading(); + fprintf(stderr, "%s: the DIE at offset 0x%" PRIx64 " has a " + "DW_AT_abstract_origin attribute referring to the DIE at offset 0x%" + PRIx64 ", which was not marked as an inline\n", + filename_.c_str(), offset, target); +} + +void DwarfCUToModule::WarningReporter::MissingSection(const string& name) { + CUHeading(); + fprintf(stderr, "%s: warning: couldn't find DWARF '%s' section\n", + filename_.c_str(), name.c_str()); +} + +void DwarfCUToModule::WarningReporter::BadLineInfoOffset(uint64_t offset) { + CUHeading(); + fprintf(stderr, "%s: warning: line number data offset beyond end" + " of '.debug_line' section\n", + filename_.c_str()); +} + +void DwarfCUToModule::WarningReporter::UncoveredHeading() { + if (printed_unpaired_header_) + return; + CUHeading(); + fprintf(stderr, "%s: warning: skipping unpaired lines/functions:\n", + filename_.c_str()); + printed_unpaired_header_ = true; +} + +void DwarfCUToModule::WarningReporter::UncoveredFunction( + const Module::Function& function) { + if (!uncovered_warnings_enabled_) + return; + UncoveredHeading(); + fprintf(stderr, " function%s: %s\n", + IsEmptyRange(function.ranges) ? " (zero-length)" : "", + function.name.str().c_str()); +} + +void DwarfCUToModule::WarningReporter::UncoveredLine(const Module::Line& line) { + if (!uncovered_warnings_enabled_) + return; + UncoveredHeading(); + fprintf(stderr, " line%s: %s:%d at 0x%" PRIx64 "\n", + (line.size == 0 ? " (zero-length)" : ""), + line.file->name.c_str(), line.number, line.address); +} + +void DwarfCUToModule::WarningReporter::UnnamedFunction(uint64_t offset) { + CUHeading(); + fprintf(stderr, "%s: warning: function at offset 0x%" PRIx64 " has no name\n", + filename_.c_str(), offset); +} + +void DwarfCUToModule::WarningReporter::DemangleError(const string& input) { + CUHeading(); + fprintf(stderr, "%s: warning: failed to demangle %s\n", + filename_.c_str(), input.c_str()); +} + +void DwarfCUToModule::WarningReporter::UnhandledInterCUReference( + uint64_t offset, uint64_t target) { + CUHeading(); + fprintf(stderr, "%s: warning: the DIE at offset 0x%" PRIx64 " has a " + "DW_FORM_ref_addr attribute with an inter-CU reference to " + "0x%" PRIx64 ", but inter-CU reference handling is turned " + " off.\n", filename_.c_str(), offset, target); +} + +void DwarfCUToModule::WarningReporter::MalformedRangeList(uint64_t offset) { + CUHeading(); + fprintf(stderr, "%s: warning: the range list at offset 0x%" PRIx64 " falls " + " out of the .debug_ranges section.\n", + filename_.c_str(), offset); +} + +void DwarfCUToModule::WarningReporter::MissingRanges() { + CUHeading(); + fprintf(stderr, "%s: warning: A DW_AT_ranges attribute was encountered but " + "the .debug_ranges section is missing.\n", filename_.c_str()); +} + +DwarfCUToModule::DwarfCUToModule(FileContext* file_context, + LineToModuleHandler* line_reader, + RangesHandler* ranges_handler, + WarningReporter* reporter, + bool handle_inline, + uint64_t low_pc, + uint64_t addr_base, + bool has_source_line_info, + uint64_t source_line_offset) + : RootDIEHandler(handle_inline), + line_reader_(line_reader), + cu_context_(new CUContext(file_context, + reporter, + ranges_handler, + low_pc, + addr_base)), + child_context_(new DIEContext()), + has_source_line_info_(has_source_line_info), + source_line_offset_(source_line_offset) {} + +DwarfCUToModule::~DwarfCUToModule() { +} + +void DwarfCUToModule::ProcessAttributeSigned(enum DwarfAttribute attr, + enum DwarfForm form, + int64_t data) { + switch (attr) { + case DW_AT_language: // source language of this CU + SetLanguage(static_cast(data)); + break; + default: + break; + } +} + +void DwarfCUToModule::ProcessAttributeUnsigned(enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data) { + switch (attr) { + case DW_AT_stmt_list: // Line number information. + has_source_line_info_ = true; + source_line_offset_ = data; + break; + case DW_AT_language: // source language of this CU + SetLanguage(static_cast(data)); + break; + case DW_AT_low_pc: + cu_context_->low_pc = data; + break; + case DW_AT_high_pc: + cu_context_->high_pc = data; + break; + case DW_AT_ranges: + cu_context_->ranges_data = data; + cu_context_->ranges_form = form; + break; + case DW_AT_rnglists_base: + cu_context_->ranges_base = data; + break; + case DW_AT_addr_base: + case DW_AT_GNU_addr_base: + cu_context_->addr_base = data; + break; + case DW_AT_str_offsets_base: + cu_context_->str_offsets_base = data; + break; + default: + break; + } +} + +void DwarfCUToModule::ProcessAttributeString(enum DwarfAttribute attr, + enum DwarfForm form, + const string& data) { + switch (attr) { + case DW_AT_name: + cu_context_->reporter->SetCUName(data); + break; + case DW_AT_comp_dir: + line_reader_->StartCompilationUnit(data); + break; + default: + break; + } +} + +bool DwarfCUToModule::EndAttributes() { + return true; +} + +DIEHandler* DwarfCUToModule::FindChildHandler( + uint64_t offset, + enum DwarfTag tag) { + switch (tag) { + case DW_TAG_subprogram: + return new FuncHandler(cu_context_.get(), child_context_.get(), offset, + handle_inline); + case DW_TAG_namespace: + case DW_TAG_class_type: + case DW_TAG_structure_type: + case DW_TAG_union_type: + case DW_TAG_module: + return new NamedScopeHandler(cu_context_.get(), child_context_.get(), + offset, handle_inline); + default: + return NULL; + } +} + +void DwarfCUToModule::SetLanguage(DwarfLanguage language) { + switch (language) { + case DW_LANG_Java: + cu_context_->language = Language::Java; + break; + + case DW_LANG_Swift: + cu_context_->language = Language::Swift; + break; + + case DW_LANG_Rust: + cu_context_->language = Language::Rust; + break; + + // DWARF has no generic language code for assembly language; this is + // what the GNU toolchain uses. + case DW_LANG_Mips_Assembler: + cu_context_->language = Language::Assembler; + break; + + // C++ covers so many cases that it probably has some way to cope + // with whatever the other languages throw at us. So make it the + // default. + // + // Objective C and Objective C++ seem to create entries for + // methods whose DW_AT_name values are already fully-qualified: + // "-[Classname method:]". These appear at the top level. + // + // DWARF data for C should never include namespaces or functions + // nested in struct types, but if it ever does, then C++'s + // notation is probably not a bad choice for that. + default: + case DW_LANG_ObjC: + case DW_LANG_ObjC_plus_plus: + case DW_LANG_C: + case DW_LANG_C89: + case DW_LANG_C99: + case DW_LANG_C_plus_plus: + cu_context_->language = Language::CPlusPlus; + break; + } +} + +void DwarfCUToModule::ReadSourceLines(uint64_t offset) { + const SectionMap& section_map + = cu_context_->file_context->section_map(); + SectionMap::const_iterator map_entry + = GetSectionByName(section_map, ".debug_line"); + if (map_entry == section_map.end()) { + cu_context_->reporter->MissingSection(".debug_line"); + return; + } + const uint8_t* line_section_start = map_entry->second.first + offset; + uint64_t line_section_length = map_entry->second.second; + if (offset >= line_section_length) { + cu_context_->reporter->BadLineInfoOffset(offset); + return; + } + line_section_length -= offset; + // When reading line tables, string sections are never needed for dwarf4, and + // may or may not be needed by dwarf5, so no error if they are missing. + const uint8_t* string_section_start = nullptr; + uint64_t string_section_length = 0; + map_entry = GetSectionByName(section_map, ".debug_str"); + if (map_entry != section_map.end()) { + string_section_start = map_entry->second.first; + string_section_length = map_entry->second.second; + } + const uint8_t* line_string_section_start = nullptr; + uint64_t line_string_section_length = 0; + map_entry = GetSectionByName(section_map, ".debug_line_str"); + if (map_entry != section_map.end()) { + line_string_section_start = map_entry->second.first; + line_string_section_length = map_entry->second.second; + } + line_reader_->ReadProgram( + line_section_start, line_section_length, + string_section_start, string_section_length, + line_string_section_start, line_string_section_length, + cu_context_->file_context->module_, &lines_, &files_); +} + +namespace { +class FunctionRange { + public: + FunctionRange(const Module::Range& range, Module::Function* function) : + address(range.address), size(range.size), function(function) { } + + void AddLine(Module::Line& line) { + function->lines.push_back(line); + } + + Module::Address address; + Module::Address size; + Module::Function* function; +}; + +// Fills an array of ranges with pointers to the functions which owns +// them. The array is sorted in ascending order and the ranges are non +// empty and non-overlapping. + +static void FillSortedFunctionRanges(vector& dest_ranges, + vector* functions) { + for (vector::const_iterator func_it = functions->cbegin(); + func_it != functions->cend(); + func_it++) + { + Module::Function* func = *func_it; + vector& ranges = func->ranges; + for (vector::const_iterator ranges_it = ranges.cbegin(); + ranges_it != ranges.cend(); + ++ranges_it) { + FunctionRange range(*ranges_it, func); + if (range.size != 0) { + dest_ranges.push_back(range); + } + } + } + + sort(dest_ranges.begin(), dest_ranges.end(), + [](const FunctionRange& fr1, const FunctionRange& fr2) { + return fr1.address < fr2.address; + } + ); +} + +// Return true if ADDRESS falls within the range of ITEM. +template +inline bool within(const T& item, Module::Address address) { + // Because Module::Address is unsigned, and unsigned arithmetic + // wraps around, this will be false if ADDRESS falls before the + // start of ITEM, or if it falls after ITEM's end. + return address - item.address < item.size; +} +} + +void DwarfCUToModule::AssignLinesToFunctions() { + vector* functions = &cu_context_->functions; + WarningReporter* reporter = cu_context_->reporter; + + // This would be simpler if we assumed that source line entries + // don't cross function boundaries. However, there's no real reason + // to assume that (say) a series of function definitions on the same + // line wouldn't get coalesced into one line number entry. The + // DWARF spec certainly makes no such promises. + // + // So treat the functions and lines as peers, and take the trouble + // to compute their ranges' intersections precisely. In any case, + // the hair here is a constant factor for performance; the + // complexity from here on out is linear. + + // Put both our functions and lines in order by address. + std::sort(functions->begin(), functions->end(), + Module::Function::CompareByAddress); + std::sort(lines_.begin(), lines_.end(), Module::Line::CompareByAddress); + + // The last line that we used any piece of. We use this only for + // generating warnings. + const Module::Line* last_line_used = NULL; + + // The last function and line we warned about --- so we can avoid + // doing so more than once. + const Module::Function* last_function_cited = NULL; + const Module::Line* last_line_cited = NULL; + + // Prepare a sorted list of ranges with range-to-function mapping + vector sorted_ranges; + FillSortedFunctionRanges(sorted_ranges, functions); + + // Make a single pass through both the range and line vectors from lower to + // higher addresses, populating each range's function lines vector with lines + // from our lines_ vector that fall within the range. + vector::iterator range_it = sorted_ranges.begin(); + vector::const_iterator line_it = lines_.begin(); + + Module::Address current; + + // Pointers to the referents of func_it and line_it, or NULL if the + // iterator is at the end of the sequence. + FunctionRange* range; + const Module::Line* line; + + // Start current at the beginning of the first line or function, + // whichever is earlier. + if (range_it != sorted_ranges.end() && line_it != lines_.end()) { + range = &*range_it; + line = &*line_it; + current = std::min(range->address, line->address); + } else if (line_it != lines_.end()) { + range = NULL; + line = &*line_it; + current = line->address; + } else if (range_it != sorted_ranges.end()) { + range = &*range_it; + line = NULL; + current = range->address; + } else { + return; + } + + // Some dwarf producers handle linker-removed functions by using -1 as a + // tombstone in the line table. So the end marker can be -1. + if (current == Module::kMaxAddress) + return; + + while (range || line) { + // This loop has two invariants that hold at the top. + // + // First, at least one of the iterators is not at the end of its + // sequence, and those that are not refer to the earliest + // range or line that contains or starts after CURRENT. + // + // Note that every byte is in one of four states: it is covered + // or not covered by a range, and, independently, it is + // covered or not covered by a line. + // + // The second invariant is that CURRENT refers to a byte whose + // state is different from its predecessor, or it refers to the + // first byte in the address space. In other words, CURRENT is + // always the address of a transition. + // + // Note that, although each iteration advances CURRENT from one + // transition address to the next in each iteration, it might + // not advance the iterators. Suppose we have a range that + // starts with a line, has a gap, and then a second line, and + // suppose that we enter an iteration with CURRENT at the end of + // the first line. The next transition address is the start of + // the second line, after the gap, so the iteration should + // advance CURRENT to that point. At the head of that iteration, + // the invariants require that the line iterator be pointing at + // the second line. But this is also true at the head of the + // next. And clearly, the iteration must not change the range + // iterator. So neither iterator moves. + + // Assert the first invariant (see above). + assert(!range || current < range->address || within(*range, current)); + assert(!line || current < line->address || within(*line, current)); + + // The next transition after CURRENT. + Module::Address next_transition; + + // Figure out which state we're in, add lines or warn, and compute + // the next transition address. + if (range && current >= range->address) { + if (line && current >= line->address) { + // Covered by both a line and a range. + Module::Address range_left = range->size - (current - range->address); + Module::Address line_left = line->size - (current - line->address); + // This may overflow, but things work out. + next_transition = current + std::min(range_left, line_left); + Module::Line l = *line; + l.address = current; + l.size = next_transition - current; + range->AddLine(l); + last_line_used = line; + } else { + // Covered by a range, but no line. + if (range->function != last_function_cited) { + reporter->UncoveredFunction(*(range->function)); + last_function_cited = range->function; + } + if (line && within(*range, line->address)) + next_transition = line->address; + else + // If this overflows, we'll catch it below. + next_transition = range->address + range->size; + } + } else { + if (line && current >= line->address) { + // Covered by a line, but no range. + // + // If GCC emits padding after one function to align the start + // of the next, then it will attribute the padding + // instructions to the last source line of function (to reduce + // the size of the line number info), but omit it from the + // DW_AT_{low,high}_pc range given in .debug_info (since it + // costs nothing to be precise there). If we did use at least + // some of the line we're about to skip, and it ends at the + // start of the next function, then assume this is what + // happened, and don't warn. + if (line != last_line_cited + && !(range + && line == last_line_used + && range->address - line->address == line->size)) { + reporter->UncoveredLine(*line); + last_line_cited = line; + } + if (range && within(*line, range->address)) + next_transition = range->address; + else + // If this overflows, we'll catch it below. + next_transition = line->address + line->size; + } else { + // Covered by neither a range nor a line. By the invariant, + // both range and line begin after CURRENT. The next transition + // is the start of the next range or next line, whichever + // is earliest. + assert(range || line); + if (range && line) + next_transition = std::min(range->address, line->address); + else if (range) + next_transition = range->address; + else + next_transition = line->address; + } + } + + // If a function or line abuts the end of the address space, then + // next_transition may end up being zero, in which case we've completed + // our pass. Handle that here, instead of trying to deal with it in + // each place we compute next_transition. + + // Some dwarf producers handle linker-removed functions by using -1 as a + // tombstone in the line table. So the end marker can be -1. + if (!next_transition || next_transition == Module::kMaxAddress) + break; + + // Advance iterators as needed. If lines overlap or functions overlap, + // then we could go around more than once. We don't worry too much + // about what result we produce in that case, just as long as we don't + // hang or crash. + while (range_it != sorted_ranges.end() + && next_transition >= range_it->address + && !within(*range_it, next_transition)) + range_it++; + range = (range_it != sorted_ranges.end()) ? &(*range_it) : NULL; + while (line_it != lines_.end() + && next_transition >= line_it->address + && !within(*line_it, next_transition)) + line_it++; + line = (line_it != lines_.end()) ? &*line_it : NULL; + + // We must make progress. + assert(next_transition > current); + current = next_transition; + } +} + +void DwarfCUToModule::AssignFilesToInlines() { + // Assign File* to Inlines inside this CU. + auto assignFile = [this](unique_ptr& in) { + in->call_site_file = files_[in->call_site_file_id]; + }; + for (auto func : cu_context_->functions) { + Module::Inline::InlineDFS(func->inlines, assignFile); + } +} + +void DwarfCUToModule::Finish() { + // Assembly language files have no function data, and that gives us + // no place to store our line numbers (even though the GNU toolchain + // will happily produce source line info for assembly language + // files). To avoid spurious warnings about lines we can't assign + // to functions, skip CUs in languages that lack functions. + if (!cu_context_->language->HasFunctions()) + return; + + // Read source line info, if we have any. + if (has_source_line_info_) + ReadSourceLines(source_line_offset_); + + vector* functions = &cu_context_->functions; + + // Dole out lines to the appropriate functions. + AssignLinesToFunctions(); + + AssignFilesToInlines(); + + // Add our functions, which now have source lines assigned to them, + // to module_, and remove duplicate functions. + for (Module::Function* func : *functions) + if (!cu_context_->file_context->module_->AddFunction(func)) { + auto iter = cu_context_->spec_function_offsets.find(func); + if (iter != cu_context_->spec_function_offsets.end()) + cu_context_->file_context->file_private_->forward_ref_die_to_func.erase( + iter->second); + delete func; + } + + // Ownership of the function objects has shifted from cu_context to + // the Module. + functions->clear(); + + cu_context_->file_context->ClearSpecifications(); +} + +bool DwarfCUToModule::StartCompilationUnit(uint64_t offset, + uint8_t address_size, + uint8_t offset_size, + uint64_t cu_length, + uint8_t dwarf_version) { + cu_context_->version = dwarf_version; + return dwarf_version >= 2; +} + +bool DwarfCUToModule::StartRootDIE(uint64_t offset, enum DwarfTag tag) { + // We don't deal with partial compilation units (the only other tag + // likely to be used for root DIE). + return (tag == DW_TAG_compile_unit + || tag == DW_TAG_skeleton_unit); +} + +} // namespace google_breakpad diff --git a/src/common/dwarf_cu_to_module.h b/src/common/dwarf_cu_to_module.h new file mode 100644 index 0000000..1ff0ebc --- /dev/null +++ b/src/common/dwarf_cu_to_module.h @@ -0,0 +1,359 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// Add DWARF debugging information to a Breakpad symbol file. This +// file defines the DwarfCUToModule class, which accepts parsed DWARF +// data and populates a google_breakpad::Module with the results; the +// Module can then write its contents as a Breakpad symbol file. + +#ifndef COMMON_LINUX_DWARF_CU_TO_MODULE_H__ +#define COMMON_LINUX_DWARF_CU_TO_MODULE_H__ + +#include + +#include +#include + +#include "common/language.h" +#include "common/module.h" +#include "common/dwarf/dwarf2diehandler.h" +#include "common/dwarf/dwarf2reader.h" +#include "common/scoped_ptr.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +// Populate a google_breakpad::Module with DWARF debugging information. +// +// An instance of this class can be provided as a handler to a +// DIEDispatcher, which can in turn be a handler for a +// CompilationUnit DWARF parser. The handler uses the results +// of parsing to populate a google_breakpad::Module with source file, +// function, and source line information. +class DwarfCUToModule: public RootDIEHandler { + struct FilePrivate; + public: + // Information global to the DWARF-bearing file we are processing, + // for use by DwarfCUToModule. Each DwarfCUToModule instance deals + // with a single compilation unit within the file, but information + // global to the whole file is held here. The client is responsible + // for filling it in appropriately (except for the 'file_private' + // field, which the constructor and destructor take care of), and + // then providing it to the DwarfCUToModule instance for each + // compilation unit we process in that file. Set HANDLE_INTER_CU_REFS + // to true to handle debugging symbols with DW_FORM_ref_addr entries. + class FileContext { + public: + FileContext(const string& filename, + Module* module, + bool handle_inter_cu_refs); + ~FileContext(); + + // Add CONTENTS of size LENGTH to the section map as NAME. + void AddSectionToSectionMap(const string& name, + const uint8_t* contents, + uint64_t length); + + void AddManagedSectionToSectionMap(const string& name, + uint8_t* contents, + uint64_t length); + + // Clear the section map for testing. + void ClearSectionMapForTest(); + + const SectionMap& section_map() const; + + private: + friend class DwarfCUToModule; + + // Clears all the Specifications if HANDLE_INTER_CU_REFS_ is false. + void ClearSpecifications(); + + // Given an OFFSET and a CU that starts at COMPILATION_UNIT_START, returns + // true if this is an inter-compilation unit reference that is not being + // handled. + bool IsUnhandledInterCUReference(uint64_t offset, + uint64_t compilation_unit_start) const; + + // The name of this file, for use in error messages. + const string filename_; + + // A map of this file's sections, used for finding other DWARF + // sections that the .debug_info section may refer to. + SectionMap section_map_; + + // The Module to which we're contributing definitions. + Module* module_; + + // True if we are handling references between compilation units. + const bool handle_inter_cu_refs_; + + // Inter-compilation unit data used internally by the handlers. + scoped_ptr file_private_; + std::vector uncompressed_sections_; + }; + + // An abstract base class for handlers that handle DWARF range lists for + // DwarfCUToModule. + class RangesHandler { + public: + RangesHandler() { } + virtual ~RangesHandler() { } + + // Called when finishing a function to populate the function's ranges. + // The entries are read according to the form and data. + virtual bool ReadRanges( + enum DwarfForm form, uint64_t data, + RangeListReader::CURangesInfo* cu_info, + vector* ranges) = 0; + }; + + // An abstract base class for handlers that handle DWARF line data + // for DwarfCUToModule. DwarfCUToModule could certainly just use + // LineInfo itself directly, but decoupling things + // this way makes unit testing a little easier. + class LineToModuleHandler { + public: + LineToModuleHandler() { } + virtual ~LineToModuleHandler() { } + + // Called at the beginning of a new compilation unit, prior to calling + // ReadProgram(). compilation_dir will indicate the path that the + // current compilation unit was compiled in, consistent with the + // DW_AT_comp_dir DIE. + virtual void StartCompilationUnit(const string& compilation_dir) = 0; + + // Populate MODULE and LINES with source file names and code/line + // mappings, given a pointer to some DWARF line number data + // PROGRAM, and an overestimate of its size. Add no zero-length + // lines to LINES. + virtual void ReadProgram(const uint8_t* program, uint64_t length, + const uint8_t* string_section, + uint64_t string_section_length, + const uint8_t* line_string_section, + uint64_t line_string_length, + Module* module, vector* lines, + map* files) = 0; + }; + + // The interface DwarfCUToModule uses to report warnings. The member + // function definitions for this class write messages to stderr, but + // you can override them if you'd like to detect or report these + // conditions yourself. + class WarningReporter { + public: + // Warn about problems in the DWARF file FILENAME, in the + // compilation unit at OFFSET. + WarningReporter(const string& filename, uint64_t cu_offset) + : filename_(filename), cu_offset_(cu_offset), printed_cu_header_(false), + printed_unpaired_header_(false), + uncovered_warnings_enabled_(false) { } + virtual ~WarningReporter() { } + + // Set the name of the compilation unit we're processing to NAME. + virtual void SetCUName(const string& name) { cu_name_ = name; } + + // Accessor and setter for uncovered_warnings_enabled_. + // UncoveredFunction and UncoveredLine only report a problem if that is + // true. By default, these warnings are disabled, because those + // conditions occur occasionally in healthy code. + virtual bool uncovered_warnings_enabled() const { + return uncovered_warnings_enabled_; + } + virtual void set_uncovered_warnings_enabled(bool value) { + uncovered_warnings_enabled_ = value; + } + + // A DW_AT_specification in the DIE at OFFSET refers to a DIE we + // haven't processed yet, or that wasn't marked as a declaration, + // at TARGET. + virtual void UnknownSpecification(uint64_t offset, uint64_t target); + + // A DW_AT_abstract_origin in the DIE at OFFSET refers to a DIE we + // haven't processed yet, or that wasn't marked as inline, at TARGET. + virtual void UnknownAbstractOrigin(uint64_t offset, uint64_t target); + + // We were unable to find the DWARF section named SECTION_NAME. + virtual void MissingSection(const string& section_name); + + // The CU's DW_AT_stmt_list offset OFFSET is bogus. + virtual void BadLineInfoOffset(uint64_t offset); + + // FUNCTION includes code covered by no line number data. + virtual void UncoveredFunction(const Module::Function& function); + + // Line number NUMBER in LINE_FILE, of length LENGTH, includes code + // covered by no function. + virtual void UncoveredLine(const Module::Line& line); + + // The DW_TAG_subprogram DIE at OFFSET has no name specified directly + // in the DIE, nor via a DW_AT_specification or DW_AT_abstract_origin + // link. + virtual void UnnamedFunction(uint64_t offset); + + // __cxa_demangle() failed to demangle INPUT. + virtual void DemangleError(const string& input); + + // The DW_FORM_ref_addr at OFFSET to TARGET was not handled because + // FilePrivate did not retain the inter-CU specification data. + virtual void UnhandledInterCUReference(uint64_t offset, uint64_t target); + + // The DW_AT_ranges at offset is malformed (truncated or outside of the + // .debug_ranges section's bound). + virtual void MalformedRangeList(uint64_t offset); + + // A DW_AT_ranges attribute was encountered but the no .debug_ranges + // section was found. + virtual void MissingRanges(); + + uint64_t cu_offset() const { + return cu_offset_; + } + + protected: + const string filename_; + const uint64_t cu_offset_; + string cu_name_; + bool printed_cu_header_; + bool printed_unpaired_header_; + bool uncovered_warnings_enabled_; + + private: + // Print a per-CU heading, once. + void CUHeading(); + // Print an unpaired function/line heading, once. + void UncoveredHeading(); + }; + + // Create a DWARF debugging info handler for a compilation unit + // within FILE_CONTEXT. This uses information received from the + // CompilationUnit DWARF parser to populate + // FILE_CONTEXT->module. Use LINE_READER to handle the compilation + // unit's line number data. Use REPORTER to report problems with the + // data we find. + DwarfCUToModule(FileContext* file_context, + LineToModuleHandler* line_reader, + RangesHandler* ranges_handler, + WarningReporter* reporter, + bool handle_inline = false, + uint64_t low_pc = 0, + uint64_t addr_base = 0, + bool has_source_line_info = false, + uint64_t source_line_offset = 0); + ~DwarfCUToModule(); + + void ProcessAttributeSigned(enum DwarfAttribute attr, + enum DwarfForm form, + int64_t data); + void ProcessAttributeUnsigned(enum DwarfAttribute attr, + enum DwarfForm form, + uint64_t data); + void ProcessAttributeString(enum DwarfAttribute attr, + enum DwarfForm form, + const string& data); + bool EndAttributes(); + DIEHandler* FindChildHandler(uint64_t offset, enum DwarfTag tag); + + // Assign all our source Lines to the Functions that cover their + // addresses, and then add them to module_. + void Finish(); + + bool StartCompilationUnit(uint64_t offset, uint8_t address_size, + uint8_t offset_size, uint64_t cu_length, + uint8_t dwarf_version); + bool StartRootDIE(uint64_t offset, enum DwarfTag tag); + + private: + // Used internally by the handler. Full definitions are in + // dwarf_cu_to_module.cc. + struct CUContext; + struct DIEContext; + struct Specification; + class GenericDIEHandler; + class FuncHandler; + class InlineHandler; + class NamedScopeHandler; + + // A map from section offsets to specifications. + typedef map SpecificationByOffset; + + // Set this compilation unit's source language to LANGUAGE. + void SetLanguage(DwarfLanguage language); + + // Read source line information at OFFSET in the .debug_line + // section. Record source files in module_, but record source lines + // in lines_; we apportion them to functions in + // AssignLinesToFunctions. + void ReadSourceLines(uint64_t offset); + + // Assign the lines in lines_ to the individual line lists of the + // functions in functions_. (DWARF line information maps an entire + // compilation unit at a time, and gives no indication of which + // lines belong to which functions, beyond their addresses.) + void AssignLinesToFunctions(); + + void AssignFilesToInlines(); + + // The only reason cu_context_ and child_context_ are pointers is + // that we want to keep their definitions private to + // dwarf_cu_to_module.cc, instead of listing them all here. They are + // owned by this DwarfCUToModule: the constructor sets them, and the + // destructor deletes them. + + // The handler to use to handle line number data. + LineToModuleHandler* line_reader_; + + // This compilation unit's context. + scoped_ptr cu_context_; + + // A context for our children. + scoped_ptr child_context_; + + // True if this compilation unit has source line information. + bool has_source_line_info_; + + // The offset of this compilation unit's line number information in + // the .debug_line section. + uint64_t source_line_offset_; + + // The line numbers we have seen thus far. We accumulate these here + // during parsing. Then, in Finish, we call AssignLinesToFunctions + // to dole them out to the appropriate functions. + vector lines_; + + // The map from file index to File* in this CU. + std::map files_; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_DWARF_CU_TO_MODULE_H__ diff --git a/src/common/dwarf_cu_to_module_unittest.cc b/src/common/dwarf_cu_to_module_unittest.cc new file mode 100644 index 0000000..134b2c2 --- /dev/null +++ b/src/common/dwarf_cu_to_module_unittest.cc @@ -0,0 +1,1872 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf_cu_to_module.cc: Unit tests for google_breakpad::DwarfCUToModule. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/dwarf_cu_to_module.h" +#include "common/using_std_string.h" + +using std::make_pair; +using std::vector; + +using google_breakpad::DIEHandler; +using google_breakpad::DwarfTag; +using google_breakpad::DwarfAttribute; +using google_breakpad::DwarfForm; +using google_breakpad::DwarfInline; +using google_breakpad::DwarfCUToModule; +using google_breakpad::Module; + +using ::testing::_; +using ::testing::AtMost; +using ::testing::DoAll; +using ::testing::Invoke; +using ::testing::Return; +using ::testing::Test; +using ::testing::TestWithParam; +using ::testing::Values; +using ::testing::ValuesIn; + +// Mock classes. + +class MockLineToModuleHandler: public DwarfCUToModule::LineToModuleHandler { + public: + MOCK_METHOD1(StartCompilationUnit, void(const string& compilation_dir)); + MOCK_METHOD9(ReadProgram, void(const uint8_t* program, uint64_t length, + const uint8_t* string_section, + uint64_t string_section_length, + const uint8_t* line_string_section, + uint64_t line_string_section_length, + Module* module, vector* lines, + std::map* files)); +}; + +class MockWarningReporter: public DwarfCUToModule::WarningReporter { + public: + MockWarningReporter(const string& filename, uint64_t cu_offset) + : DwarfCUToModule::WarningReporter(filename, cu_offset) { } + MOCK_METHOD1(SetCUName, void(const string& name)); + MOCK_METHOD2(UnknownSpecification, void(uint64_t offset, uint64_t target)); + MOCK_METHOD2(UnknownAbstractOrigin, void(uint64_t offset, uint64_t target)); + MOCK_METHOD1(MissingSection, void(const string& section_name)); + MOCK_METHOD1(BadLineInfoOffset, void(uint64_t offset)); + MOCK_METHOD1(UncoveredFunction, void(const Module::Function& function)); + MOCK_METHOD1(UncoveredLine, void(const Module::Line& line)); + MOCK_METHOD1(UnnamedFunction, void(uint64_t offset)); + MOCK_METHOD1(DemangleError, void(const string& input)); + MOCK_METHOD2(UnhandledInterCUReference, void(uint64_t offset, uint64_t target)); +}; + +// A fixture class including all the objects needed to handle a +// compilation unit, and their entourage. It includes member functions +// for doing common kinds of setup and tests. +class CUFixtureBase { + public: + // If we have: + // + // vector lines; + // AppendLinesFunctor appender(lines); + // + // then doing: + // + // appender(line_program, length, module, line_vector); + // + // will append lines to the end of line_vector. We can use this with + // MockLineToModuleHandler like this: + // + // MockLineToModuleHandler l2m; + // EXPECT_CALL(l2m, ReadProgram(_,_,_,_)) + // .WillOnce(DoAll(Invoke(appender), Return())); + // + // in which case calling l2m with some line vector will append lines. + class AppendLinesFunctor { + public: + explicit AppendLinesFunctor( + const vector* lines) : lines_(lines) { } + void operator()(const uint8_t* program, uint64_t length, + const uint8_t* string_section, + uint64_t string_section_length, + const uint8_t* line_string_section, + uint64_t line_string_section_length, + Module *module, vector* lines, + std::map* files) { + lines->insert(lines->end(), lines_->begin(), lines_->end()); + } + private: + const vector* lines_; + }; + + CUFixtureBase() + : module_("module-name", "module-os", "module-arch", "module-id"), + file_context_("dwarf-filename", &module_, true), + language_(google_breakpad::DW_LANG_none), + language_signed_(false), + appender_(&lines_), + reporter_("dwarf-filename", 0xcf8f9bb6443d29b5LL), + root_handler_(&file_context_, &line_reader_, + /* ranges_reader */ nullptr, &reporter_), + functions_filled_(false) { + // By default, expect no warnings to be reported, and expect the + // compilation unit's name to be provided. The test can override + // these expectations. + EXPECT_CALL(reporter_, SetCUName("compilation-unit-name")).Times(1); + EXPECT_CALL(reporter_, UnknownSpecification(_, _)).Times(0); + EXPECT_CALL(reporter_, UnknownAbstractOrigin(_, _)).Times(0); + EXPECT_CALL(reporter_, MissingSection(_)).Times(0); + EXPECT_CALL(reporter_, BadLineInfoOffset(_)).Times(0); + EXPECT_CALL(reporter_, UncoveredFunction(_)).Times(0); + EXPECT_CALL(reporter_, UncoveredLine(_)).Times(0); + EXPECT_CALL(reporter_, UnnamedFunction(_)).Times(0); + EXPECT_CALL(reporter_, UnhandledInterCUReference(_, _)).Times(0); + + // By default, expect the line program reader not to be invoked. We + // may override this in StartCU. + EXPECT_CALL(line_reader_, StartCompilationUnit(_)).Times(0); + EXPECT_CALL(line_reader_, ReadProgram(_,_,_,_,_,_,_,_,_)).Times(0); + + // The handler will consult this section map to decide what to + // pass to our line reader. + file_context_.AddSectionToSectionMap(".debug_line", + dummy_line_program_, + dummy_line_size_); + } + + // Add a line with the given address, size, filename, and line + // number to the end of the statement list the handler will receive + // when it invokes its LineToModuleHandler. Call this before calling + // StartCU. + void PushLine(Module::Address address, Module::Address size, + const string& filename, int line_number); + + // Use LANGUAGE for the compilation unit. More precisely, arrange + // for StartCU to pass the compilation unit's root DIE a + // DW_AT_language attribute whose value is LANGUAGE. + void SetLanguage(google_breakpad::DwarfLanguage language) { + language_ = language; + } + + // If SIGNED true, have StartCU report DW_AT_language as a signed + // attribute; if false, have it report it as unsigned. + void SetLanguageSigned(bool is_signed) { language_signed_ = is_signed; } + + // Call the handler this.root_handler_'s StartCompilationUnit and + // StartRootDIE member functions, passing it appropriate attributes as + // determined by prior calls to PushLine and SetLanguage. Leave + // this.root_handler_ ready to hear about children: call + // this.root_handler_.EndAttributes, but not this.root_handler_.Finish. + void StartCU(); + + // Have HANDLER process some strange attribute/form/value triples. + void ProcessStrangeAttributes(google_breakpad::DIEHandler* handler); + + // Start a child DIE of PARENT with the given tag and name. Leave + // the handler ready to hear about children: call EndAttributes, but + // not Finish. + DIEHandler* StartNamedDIE(DIEHandler* parent, DwarfTag tag, + const string& name); + + // Start a child DIE of PARENT with the given tag and a + // DW_AT_specification attribute whose value is SPECIFICATION. Leave + // the handler ready to hear about children: call EndAttributes, but + // not Finish. If NAME is non-zero, use it as the DW_AT_name + // attribute. + DIEHandler* StartSpecifiedDIE(DIEHandler* parent, DwarfTag tag, + uint64_t specification, const char* name = NULL); + + // Define a function as a child of PARENT with the given name, address, and + // size. If high_pc_form is DW_FORM_addr then the DW_AT_high_pc attribute + // will be written as an address; otherwise it will be written as the + // function's size. Call EndAttributes and Finish; one cannot define + // children of the defined function's DIE. + void DefineFunction(DIEHandler* parent, const string& name, + Module::Address address, Module::Address size, + const char* mangled_name, + DwarfForm high_pc_form = google_breakpad::DW_FORM_addr); + + // Create a declaration DIE as a child of PARENT with the given + // offset, tag and name. If NAME is the empty string, don't provide + // a DW_AT_name attribute. Call EndAttributes and Finish. + void DeclarationDIE(DIEHandler* parent, uint64_t offset, + DwarfTag tag, const string& name, + const string& mangled_name); + + // Create a definition DIE as a child of PARENT with the given tag + // that refers to the declaration DIE at offset SPECIFICATION as its + // specification. If NAME is non-empty, pass it as the DW_AT_name + // attribute. If SIZE is non-zero, record ADDRESS and SIZE as + // low_pc/high_pc attributes. + void DefinitionDIE(DIEHandler* parent, DwarfTag tag, + uint64_t specification, const string& name, + Module::Address address = 0, Module::Address size = 0); + + // Create an inline DW_TAG_subprogram DIE as a child of PARENT. If + // SPECIFICATION is non-zero, then the DIE refers to the declaration DIE at + // offset SPECIFICATION as its specification. If Name is non-empty, pass it + // as the DW_AT_name attribute. + void AbstractInstanceDIE(DIEHandler* parent, uint64_t offset, + DwarfInline type, uint64_t specification, + const string& name, + DwarfForm form = google_breakpad::DW_FORM_data1); + + // Create a DW_TAG_subprogram DIE as a child of PARENT that refers to + // ORIGIN in its DW_AT_abstract_origin attribute. If NAME is the empty + // string, don't provide a DW_AT_name attribute. + void DefineInlineInstanceDIE(DIEHandler* parent, const string& name, + uint64_t origin, Module::Address address, + Module::Address size); + + // The following Test* functions should be called after calling + // this.root_handler_.Finish. After that point, no further calls + // should be made on the handler. + + // Test that the number of functions defined in the module this.module_ is + // equal to EXPECTED. + void TestFunctionCount(size_t expected); + + // Test that the I'th function (ordered by address) in the module + // this.module_ has the given name, address, and size, and that its + // parameter size is zero. + void TestFunction(int i, const string& name, + Module::Address address, Module::Address size); + + // Test that the I'th function (ordered by address) in the module + // this.module_ has the given prefer_extern_name. + void TestFunctionPreferExternName(int i, bool prefer_extern_name); + + // Test that the number of source lines owned by the I'th function + // in the module this.module_ is equal to EXPECTED. + void TestLineCount(int i, size_t expected); + + // Test that the J'th line (ordered by address) of the I'th function + // (again, by address) has the given address, size, filename, and + // line number. + void TestLine(int i, int j, Module::Address address, Module::Address size, + const string& filename, int number); + + // Actual objects under test. + Module module_; + DwarfCUToModule::FileContext file_context_; + + // If this is not DW_LANG_none, we'll pass it as a DW_AT_language + // attribute to the compilation unit. This defaults to DW_LANG_none. + google_breakpad::DwarfLanguage language_; + + // If this is true, report DW_AT_language as a signed value; if false, + // report it as an unsigned value. + bool language_signed_; + + // If this is not empty, we'll give the CU a DW_AT_comp_dir attribute that + // indicates the path that this compilation unit was compiled in. + string compilation_dir_; + + // If this is not empty, we'll give the CU a DW_AT_stmt_list + // attribute that, when passed to line_reader_, adds these lines to the + // provided lines array. + vector lines_; + + // Mock line program reader. + MockLineToModuleHandler line_reader_; + AppendLinesFunctor appender_; + static const uint8_t dummy_line_program_[]; + static const size_t dummy_line_size_; + + MockWarningReporter reporter_; + DwarfCUToModule root_handler_; + + private: + // Fill functions_, if we haven't already. + void FillFunctions(); + + // If functions_filled_ is true, this is a table of functions we've + // extracted from module_, sorted by address. + vector functions_; + // True if we have filled the above vector with this.module_'s function list. + bool functions_filled_; +}; + +const uint8_t CUFixtureBase::dummy_line_program_[] = "lots of fun data"; +const size_t CUFixtureBase::dummy_line_size_ = + sizeof(CUFixtureBase::dummy_line_program_); + +void CUFixtureBase::PushLine(Module::Address address, Module::Address size, + const string& filename, int line_number) { + Module::Line l; + l.address = address; + l.size = size; + l.file = module_.FindFile(filename); + l.number = line_number; + lines_.push_back(l); +} + +void CUFixtureBase::StartCU() { + if (!compilation_dir_.empty()) + EXPECT_CALL(line_reader_, + StartCompilationUnit(compilation_dir_)).Times(1); + + // If we have lines, make the line reader expect to be invoked at + // most once. (Hey, if the handler can pass its tests without + // bothering to read the line number data, that's great.) + // Have it add the lines passed to PushLine. Otherwise, leave the + // initial expectation (no calls) in force. + if (!lines_.empty()) + EXPECT_CALL(line_reader_, + ReadProgram(&dummy_line_program_[0], dummy_line_size_, + _,_,_,_, + &module_, _,_)) + .Times(AtMost(1)) + .WillOnce(DoAll(Invoke(appender_), Return())); + ASSERT_TRUE(root_handler_ + .StartCompilationUnit(0x51182ec307610b51ULL, 0x81, 0x44, + 0x4241b4f33720dd5cULL, 3)); + { + ASSERT_TRUE(root_handler_.StartRootDIE(0x02e56bfbda9e7337ULL, + google_breakpad::DW_TAG_compile_unit)); + } + root_handler_.ProcessAttributeString(google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_strp, + "compilation-unit-name"); + if (!compilation_dir_.empty()) + root_handler_.ProcessAttributeString(google_breakpad::DW_AT_comp_dir, + google_breakpad::DW_FORM_strp, + compilation_dir_); + if (!lines_.empty()) + root_handler_.ProcessAttributeUnsigned(google_breakpad::DW_AT_stmt_list, + google_breakpad::DW_FORM_ref4, + 0); + if (language_ != google_breakpad::DW_LANG_none) { + if (language_signed_) + root_handler_.ProcessAttributeSigned(google_breakpad::DW_AT_language, + google_breakpad::DW_FORM_sdata, + language_); + else + root_handler_.ProcessAttributeUnsigned(google_breakpad::DW_AT_language, + google_breakpad::DW_FORM_udata, + language_); + } + ASSERT_TRUE(root_handler_.EndAttributes()); +} + +void CUFixtureBase::ProcessStrangeAttributes( + google_breakpad::DIEHandler* handler) { + handler->ProcessAttributeUnsigned((DwarfAttribute) 0xf560dead, + (DwarfForm) 0x4106e4db, + 0xa592571997facda1ULL); + handler->ProcessAttributeSigned((DwarfAttribute) 0x85380095, + (DwarfForm) 0x0f16fe87, + 0x12602a4e3bf1f446LL); + handler->ProcessAttributeReference((DwarfAttribute) 0xf7f7480f, + (DwarfForm) 0x829e038a, + 0x50fddef44734fdecULL); + static const uint8_t buffer[10] = "frobynode"; + handler->ProcessAttributeBuffer((DwarfAttribute) 0xa55ffb51, + (DwarfForm) 0x2f43b041, + buffer, sizeof(buffer)); + handler->ProcessAttributeString((DwarfAttribute) 0x2f43b041, + (DwarfForm) 0x895ffa23, + "strange string"); +} + +DIEHandler* CUFixtureBase::StartNamedDIE(DIEHandler* parent, + DwarfTag tag, + const string& name) { + google_breakpad::DIEHandler* handler + = parent->FindChildHandler(0x8f4c783c0467c989ULL, tag); + if (!handler) + return NULL; + handler->ProcessAttributeString(google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_strp, + name); + ProcessStrangeAttributes(handler); + if (!handler->EndAttributes()) { + handler->Finish(); + delete handler; + return NULL; + } + + return handler; +} + +DIEHandler* CUFixtureBase::StartSpecifiedDIE(DIEHandler* parent, + DwarfTag tag, + uint64_t specification, + const char* name) { + google_breakpad::DIEHandler* handler + = parent->FindChildHandler(0x8f4c783c0467c989ULL, tag); + if (!handler) + return NULL; + if (name) + handler->ProcessAttributeString(google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_strp, + name); + handler->ProcessAttributeReference(google_breakpad::DW_AT_specification, + google_breakpad::DW_FORM_ref4, + specification); + if (!handler->EndAttributes()) { + handler->Finish(); + delete handler; + return NULL; + } + + return handler; +} + +void CUFixtureBase::DefineFunction(google_breakpad::DIEHandler* parent, + const string& name, Module::Address address, + Module::Address size, + const char* mangled_name, + DwarfForm high_pc_form) { + google_breakpad::DIEHandler* func + = parent->FindChildHandler(0xe34797c7e68590a8LL, + google_breakpad::DW_TAG_subprogram); + ASSERT_TRUE(func != NULL); + func->ProcessAttributeString(google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_strp, + name); + func->ProcessAttributeUnsigned(google_breakpad::DW_AT_low_pc, + google_breakpad::DW_FORM_addr, + address); + + Module::Address high_pc = size; + if (high_pc_form == google_breakpad::DW_FORM_addr) { + high_pc += address; + } + func->ProcessAttributeUnsigned(google_breakpad::DW_AT_high_pc, + high_pc_form, + high_pc); + + if (mangled_name) + func->ProcessAttributeString(google_breakpad::DW_AT_MIPS_linkage_name, + google_breakpad::DW_FORM_strp, + mangled_name); + + ProcessStrangeAttributes(func); + EXPECT_TRUE(func->EndAttributes()); + func->Finish(); + delete func; +} + +void CUFixtureBase::DeclarationDIE(DIEHandler* parent, uint64_t offset, + DwarfTag tag, + const string& name, + const string& mangled_name) { + google_breakpad::DIEHandler* die = parent->FindChildHandler(offset, tag); + ASSERT_TRUE(die != NULL); + if (!name.empty()) + die->ProcessAttributeString(google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_strp, + name); + if (!mangled_name.empty()) + die->ProcessAttributeString(google_breakpad::DW_AT_MIPS_linkage_name, + google_breakpad::DW_FORM_strp, + mangled_name); + + die->ProcessAttributeUnsigned(google_breakpad::DW_AT_declaration, + google_breakpad::DW_FORM_flag, + 1); + EXPECT_TRUE(die->EndAttributes()); + die->Finish(); + delete die; +} + +void CUFixtureBase::DefinitionDIE(DIEHandler* parent, + DwarfTag tag, + uint64_t specification, + const string& name, + Module::Address address, + Module::Address size) { + google_breakpad::DIEHandler* die + = parent->FindChildHandler(0x6ccfea031a9e6cc9ULL, tag); + ASSERT_TRUE(die != NULL); + die->ProcessAttributeReference(google_breakpad::DW_AT_specification, + google_breakpad::DW_FORM_ref4, + specification); + if (!name.empty()) + die->ProcessAttributeString(google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_strp, + name); + if (size) { + die->ProcessAttributeUnsigned(google_breakpad::DW_AT_low_pc, + google_breakpad::DW_FORM_addr, + address); + die->ProcessAttributeUnsigned(google_breakpad::DW_AT_high_pc, + google_breakpad::DW_FORM_addr, + address + size); + } + EXPECT_TRUE(die->EndAttributes()); + die->Finish(); + delete die; +} + +void CUFixtureBase::AbstractInstanceDIE(DIEHandler* parent, + uint64_t offset, + DwarfInline type, + uint64_t specification, + const string& name, + DwarfForm form) { + google_breakpad::DIEHandler* die + = parent->FindChildHandler(offset, google_breakpad::DW_TAG_subprogram); + ASSERT_TRUE(die != NULL); + if (specification != 0ULL) + die->ProcessAttributeReference(google_breakpad::DW_AT_specification, + google_breakpad::DW_FORM_ref4, + specification); + if (form == google_breakpad::DW_FORM_sdata) { + die->ProcessAttributeSigned(google_breakpad::DW_AT_inline, form, type); + } else { + die->ProcessAttributeUnsigned(google_breakpad::DW_AT_inline, form, type); + } + if (!name.empty()) + die->ProcessAttributeString(google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_strp, + name); + + EXPECT_TRUE(die->EndAttributes()); + die->Finish(); + delete die; +} + +void CUFixtureBase::DefineInlineInstanceDIE(DIEHandler* parent, + const string& name, + uint64_t origin, + Module::Address address, + Module::Address size) { + google_breakpad::DIEHandler* func + = parent->FindChildHandler(0x11c70f94c6e87ccdLL, + google_breakpad::DW_TAG_subprogram); + ASSERT_TRUE(func != NULL); + if (!name.empty()) { + func->ProcessAttributeString(google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_strp, + name); + } + func->ProcessAttributeUnsigned(google_breakpad::DW_AT_low_pc, + google_breakpad::DW_FORM_addr, + address); + func->ProcessAttributeUnsigned(google_breakpad::DW_AT_high_pc, + google_breakpad::DW_FORM_addr, + address + size); + func->ProcessAttributeReference(google_breakpad::DW_AT_abstract_origin, + google_breakpad::DW_FORM_ref4, + origin); + ProcessStrangeAttributes(func); + EXPECT_TRUE(func->EndAttributes()); + func->Finish(); + delete func; +} + +void CUFixtureBase::FillFunctions() { + if (functions_filled_) + return; + module_.GetFunctions(&functions_, functions_.end()); + sort(functions_.begin(), functions_.end(), + Module::Function::CompareByAddress); + functions_filled_ = true; +} + +void CUFixtureBase::TestFunctionCount(size_t expected) { + FillFunctions(); + ASSERT_EQ(expected, functions_.size()); +} + +void CUFixtureBase::TestFunction(int i, const string& name, + Module::Address address, + Module::Address size) { + FillFunctions(); + ASSERT_LT((size_t) i, functions_.size()); + + Module::Function* function = functions_[i]; + EXPECT_EQ(name, function->name); + EXPECT_EQ(address, function->address); + EXPECT_EQ(size, function->ranges[0].size); + EXPECT_EQ(0U, function->parameter_size); +} + +void CUFixtureBase::TestFunctionPreferExternName(int i, + bool prefer_extern_name) { + FillFunctions(); + ASSERT_LT((size_t)i, functions_.size()); + + Module::Function* function = functions_[i]; + EXPECT_EQ(prefer_extern_name, function->prefer_extern_name); +} + +void CUFixtureBase::TestLineCount(int i, size_t expected) { + FillFunctions(); + ASSERT_LT((size_t) i, functions_.size()); + + ASSERT_EQ(expected, functions_[i]->lines.size()); +} + +void CUFixtureBase::TestLine(int i, int j, + Module::Address address, Module::Address size, + const string& filename, int number) { + FillFunctions(); + ASSERT_LT((size_t) i, functions_.size()); + ASSERT_LT((size_t) j, functions_[i]->lines.size()); + + Module::Line* line = &functions_[i]->lines[j]; + EXPECT_EQ(address, line->address); + EXPECT_EQ(size, line->size); + EXPECT_EQ(filename, line->file->name.c_str()); + EXPECT_EQ(number, line->number); +} + +// Include caller locations for our test subroutines. +#define TRACE(call) do { SCOPED_TRACE("called from here"); call; } while (0) +#define PushLine(a,b,c,d) TRACE(PushLine((a),(b),(c),(d))) +#define SetLanguage(a) TRACE(SetLanguage(a)) +#define StartCU() TRACE(StartCU()) +#define DefineFunction(a,b,c,d,e) TRACE(DefineFunction((a),(b),(c),(d),(e))) +// (DefineFunction) instead of DefineFunction to avoid macro expansion. +#define DefineFunction6(a,b,c,d,e,f) \ + TRACE((DefineFunction)((a),(b),(c),(d),(e),(f))) +#define DeclarationDIE(a,b,c,d,e) TRACE(DeclarationDIE((a),(b),(c),(d),(e))) +#define DefinitionDIE(a,b,c,d,e,f) \ + TRACE(DefinitionDIE((a),(b),(c),(d),(e),(f))) +#define TestFunctionCount(a) TRACE(TestFunctionCount(a)) +#define TestFunction(a,b,c,d) TRACE(TestFunction((a),(b),(c),(d))) +#define TestLineCount(a,b) TRACE(TestLineCount((a),(b))) +#define TestLine(a,b,c,d,e,f) TRACE(TestLine((a),(b),(c),(d),(e),(f))) + +class SimpleCU: public CUFixtureBase, public Test { +}; + +TEST_F(SimpleCU, CompilationDir) { + compilation_dir_ = "/src/build/"; + + StartCU(); + root_handler_.Finish(); +} + +TEST_F(SimpleCU, OneFunc) { + PushLine(0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "line-file", 246571772); + + StartCU(); + DefineFunction(&root_handler_, "function1", + 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, NULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "function1", 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL); + TestLineCount(0, 1); + TestLine(0, 0, 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "line-file", + 246571772); +} + +// As above, only DW_AT_high_pc is a length rather than an address. +TEST_F(SimpleCU, OneFuncHighPcIsLength) { + PushLine(0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "line-file", 246571772); + + StartCU(); + DefineFunction6(&root_handler_, "function1", + 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, NULL, + google_breakpad::DW_FORM_udata); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "function1", 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL); + TestLineCount(0, 1); + TestLine(0, 0, 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "line-file", + 246571772); +} + +TEST_F(SimpleCU, MangledName) { + PushLine(0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "line-file", 246571772); + + StartCU(); + DefineFunction(&root_handler_, "function1", + 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "_ZN1n1fEi"); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "n::f(int)", 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL); +} + +TEST_F(SimpleCU, IrrelevantRootChildren) { + StartCU(); + EXPECT_FALSE(root_handler_ + .FindChildHandler(0x7db32bff4e2dcfb1ULL, + google_breakpad::DW_TAG_lexical_block)); +} + +TEST_F(SimpleCU, IrrelevantNamedScopeChildren) { + StartCU(); + DIEHandler* class_A_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_class_type, "class_A"); + EXPECT_TRUE(class_A_handler != NULL); + EXPECT_FALSE(class_A_handler + ->FindChildHandler(0x02e55999b865e4e9ULL, + google_breakpad::DW_TAG_lexical_block)); + delete class_A_handler; +} + +// Verify that FileContexts can safely be deleted unused. +TEST_F(SimpleCU, UnusedFileContext) { + Module m("module-name", "module-os", "module-arch", "module-id"); + DwarfCUToModule::FileContext fc("dwarf-filename", &m, true); + + // Kludge: satisfy reporter_'s expectation. + reporter_.SetCUName("compilation-unit-name"); +} + +TEST_F(SimpleCU, InlineFunction) { + PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118); + + StartCU(); + AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL, + google_breakpad::DW_INL_inlined, 0, "inline-name"); + DefineInlineInstanceDIE(&root_handler_, "", 0x1e8dac5d507ed7abULL, + 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "inline-name", + 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); +} + +TEST_F(SimpleCU, InlineFunctionSignedAttribute) { + PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118); + + StartCU(); + AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL, + google_breakpad::DW_INL_inlined, 0, "inline-name", + google_breakpad::DW_FORM_sdata); + DefineInlineInstanceDIE(&root_handler_, "", 0x1e8dac5d507ed7abULL, + 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "inline-name", + 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); +} + +// Any DIE with an DW_AT_inline attribute can be cited by +// DW_AT_abstract_origin attributes --- even if the value of the +// DW_AT_inline attribute is DW_INL_not_inlined. +TEST_F(SimpleCU, AbstractOriginNotInlined) { + PushLine(0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL, "line-file", 6111581); + + StartCU(); + AbstractInstanceDIE(&root_handler_, 0x93e9cdad52826b39ULL, + google_breakpad::DW_INL_not_inlined, 0, "abstract-instance"); + DefineInlineInstanceDIE(&root_handler_, "", 0x93e9cdad52826b39ULL, + 0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "abstract-instance", + 0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL); +} + +TEST_F(SimpleCU, UnknownAbstractOrigin) { + PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118); + + StartCU(); + AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL, + google_breakpad::DW_INL_inlined, 0, "inline-name"); + DefineInlineInstanceDIE(&root_handler_, "", 1ULL, + 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "", + 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); +} + +TEST_F(SimpleCU, UnnamedFunction) { + PushLine(0x72b80e41a0ac1d40ULL, 0x537174f231ee181cULL, "line-file", 14044850); + + StartCU(); + DefineFunction(&root_handler_, "", + 0x72b80e41a0ac1d40ULL, 0x537174f231ee181cULL, NULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "", + 0x72b80e41a0ac1d40ULL, 0x537174f231ee181cULL); +} + +// An address range. +struct Range { + Module::Address start, end; +}; + +// Test data for pairing functions and lines. +struct Situation { + // Two function intervals, and two line intervals. + Range functions[2], lines[2]; + + // The number of lines we expect to be assigned to each of the + // functions, and the address ranges. + int paired_count[2]; + Range paired[2][2]; + + // The number of functions that are not entirely covered by lines, + // and vice versa. + int uncovered_functions, uncovered_lines; +}; + +#define PAIRING(func1_start, func1_end, func2_start, func2_end, \ + line1_start, line1_end, line2_start, line2_end, \ + func1_num_lines, func2_num_lines, \ + func1_line1_start, func1_line1_end, \ + func1_line2_start, func1_line2_end, \ + func2_line1_start, func2_line1_end, \ + func2_line2_start, func2_line2_end, \ + uncovered_functions, uncovered_lines) \ + { { { func1_start, func1_end }, { func2_start, func2_end } }, \ + { { line1_start, line1_end }, { line2_start, line2_end } }, \ + { func1_num_lines, func2_num_lines }, \ + { { { func1_line1_start, func1_line1_end }, \ + { func1_line2_start, func1_line2_end } }, \ + { { func2_line1_start, func2_line1_end }, \ + { func2_line2_start, func2_line2_end } } }, \ + uncovered_functions, uncovered_lines }, + +Situation situations[] = { +#include "common/testdata/func-line-pairing.h" +}; + +#undef PAIRING + +class FuncLinePairing: public CUFixtureBase, + public TestWithParam { }; + +INSTANTIATE_TEST_SUITE_P(AllSituations, FuncLinePairing, + ValuesIn(situations)); + +TEST_P(FuncLinePairing, Pairing) { + const Situation& s = GetParam(); + PushLine(s.lines[0].start, + s.lines[0].end - s.lines[0].start, + "line-file", 67636963); + PushLine(s.lines[1].start, + s.lines[1].end - s.lines[1].start, + "line-file", 67636963); + if (s.uncovered_functions) + EXPECT_CALL(reporter_, UncoveredFunction(_)) + .Times(s.uncovered_functions) + .WillRepeatedly(Return()); + if (s.uncovered_lines) + EXPECT_CALL(reporter_, UncoveredLine(_)) + .Times(s.uncovered_lines) + .WillRepeatedly(Return()); + + StartCU(); + DefineFunction(&root_handler_, "function1", + s.functions[0].start, + s.functions[0].end - s.functions[0].start, NULL); + DefineFunction(&root_handler_, "function2", + s.functions[1].start, + s.functions[1].end - s.functions[1].start, NULL); + root_handler_.Finish(); + + TestFunctionCount(2); + TestFunction(0, "function1", + s.functions[0].start, + s.functions[0].end - s.functions[0].start); + TestLineCount(0, s.paired_count[0]); + for (int i = 0; i < s.paired_count[0]; i++) + TestLine(0, i, s.paired[0][i].start, + s.paired[0][i].end - s.paired[0][i].start, + "line-file", 67636963); + TestFunction(1, "function2", + s.functions[1].start, + s.functions[1].end - s.functions[1].start); + TestLineCount(1, s.paired_count[1]); + for (int i = 0; i < s.paired_count[1]; i++) + TestLine(1, i, s.paired[1][i].start, + s.paired[1][i].end - s.paired[1][i].start, + "line-file", 67636963); +} + +TEST_F(FuncLinePairing, EmptyCU) { + StartCU(); + root_handler_.Finish(); + + TestFunctionCount(0); +} + +TEST_F(FuncLinePairing, LinesNoFuncs) { + PushLine(40, 2, "line-file", 82485646); + EXPECT_CALL(reporter_, UncoveredLine(_)).WillOnce(Return()); + + StartCU(); + root_handler_.Finish(); + + TestFunctionCount(0); +} + +TEST_F(FuncLinePairing, FuncsNoLines) { + EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return()); + + StartCU(); + DefineFunction(&root_handler_, "function1", 0x127da12ffcf5c51fULL, 0x1000U, + NULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "function1", 0x127da12ffcf5c51fULL, 0x1000U); +} + +TEST_F(FuncLinePairing, GapThenFunction) { + PushLine(20, 2, "line-file-2", 174314698); + PushLine(10, 2, "line-file-1", 263008005); + + StartCU(); + DefineFunction(&root_handler_, "function1", 10, 2, NULL); + DefineFunction(&root_handler_, "function2", 20, 2, NULL); + root_handler_.Finish(); + + TestFunctionCount(2); + TestFunction(0, "function1", 10, 2); + TestLineCount(0, 1); + TestLine(0, 0, 10, 2, "line-file-1", 263008005); + TestFunction(1, "function2", 20, 2); + TestLineCount(1, 1); + TestLine(1, 0, 20, 2, "line-file-2", 174314698); +} + +// If GCC emits padding after one function to align the start of +// the next, then it will attribute the padding instructions to +// the last source line of function (to reduce the size of the +// line number info), but omit it from the DW_AT_{low,high}_pc +// range given in .debug_info (since it costs nothing to be +// precise there). If we did use at least some of the line +// we're about to skip, then assume this is what happened, and +// don't warn. +TEST_F(FuncLinePairing, GCCAlignmentStretch) { + PushLine(10, 10, "line-file", 63351048); + PushLine(20, 10, "line-file", 61661044); + + StartCU(); + DefineFunction(&root_handler_, "function1", 10, 5, NULL); + // five-byte gap between functions, covered by line 63351048. + // This should not elicit a warning. + DefineFunction(&root_handler_, "function2", 20, 10, NULL); + root_handler_.Finish(); + + TestFunctionCount(2); + TestFunction(0, "function1", 10, 5); + TestLineCount(0, 1); + TestLine(0, 0, 10, 5, "line-file", 63351048); + TestFunction(1, "function2", 20, 10); + TestLineCount(1, 1); + TestLine(1, 0, 20, 10, "line-file", 61661044); +} + +// Unfortunately, neither the DWARF parser's handler interface nor the +// DIEHandler interface is capable of expressing a function that abuts +// the end of the address space: the high_pc value looks like zero. + +TEST_F(FuncLinePairing, LineAtEndOfAddressSpace) { + PushLine(0xfffffffffffffff0ULL, 16, "line-file", 63351048); + EXPECT_CALL(reporter_, UncoveredLine(_)).WillOnce(Return()); + + StartCU(); + DefineFunction(&root_handler_, "function1", 0xfffffffffffffff0ULL, 6, NULL); + DefineFunction(&root_handler_, "function2", 0xfffffffffffffffaULL, 5, NULL); + root_handler_.Finish(); + + TestFunctionCount(2); + TestFunction(0, "function1", 0xfffffffffffffff0ULL, 6); + TestLineCount(0, 1); + TestLine(0, 0, 0xfffffffffffffff0ULL, 6, "line-file", 63351048); + TestFunction(1, "function2", 0xfffffffffffffffaULL, 5); + TestLineCount(1, 1); + TestLine(1, 0, 0xfffffffffffffffaULL, 5, "line-file", 63351048); +} + +// A function with more than one uncovered area should only be warned +// about once. +TEST_F(FuncLinePairing, WarnOnceFunc) { + PushLine(20, 1, "line-file-2", 262951329); + PushLine(11, 1, "line-file-1", 219964021); + EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return()); + + StartCU(); + DefineFunction(&root_handler_, "function", 10, 11, NULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "function", 10, 11); + TestLineCount(0, 2); + TestLine(0, 0, 11, 1, "line-file-1", 219964021); + TestLine(0, 1, 20, 1, "line-file-2", 262951329); +} + +// A line with more than one uncovered area should only be warned +// about once. +TEST_F(FuncLinePairing, WarnOnceLine) { + PushLine(10, 20, "filename1", 118581871); + EXPECT_CALL(reporter_, UncoveredLine(_)).WillOnce(Return()); + + StartCU(); + DefineFunction(&root_handler_, "function1", 11, 1, NULL); + DefineFunction(&root_handler_, "function2", 13, 1, NULL); + root_handler_.Finish(); + + TestFunctionCount(2); + TestFunction(0, "function1", 11, 1); + TestLineCount(0, 1); + TestLine(0, 0, 11, 1, "filename1", 118581871); + TestFunction(1, "function2", 13, 1); + TestLineCount(1, 1); + TestLine(1, 0, 13, 1, "filename1", 118581871); +} + +class CXXQualifiedNames: public CUFixtureBase, + public TestWithParam { }; + +INSTANTIATE_TEST_SUITE_P(VersusEnclosures, CXXQualifiedNames, + Values(google_breakpad::DW_TAG_class_type, + google_breakpad::DW_TAG_structure_type, + google_breakpad::DW_TAG_union_type, + google_breakpad::DW_TAG_namespace)); + +TEST_P(CXXQualifiedNames, TwoFunctions) { + DwarfTag tag = GetParam(); + + SetLanguage(google_breakpad::DW_LANG_C_plus_plus); + PushLine(10, 1, "filename1", 69819327); + PushLine(20, 1, "filename2", 95115701); + + StartCU(); + DIEHandler* enclosure_handler = StartNamedDIE(&root_handler_, tag, + "Enclosure"); + EXPECT_TRUE(enclosure_handler != NULL); + DefineFunction(enclosure_handler, "func_B", 10, 1, NULL); + DefineFunction(enclosure_handler, "func_C", 20, 1, NULL); + enclosure_handler->Finish(); + delete enclosure_handler; + root_handler_.Finish(); + + TestFunctionCount(2); + TestFunction(0, "Enclosure::func_B", 10, 1); + TestFunction(1, "Enclosure::func_C", 20, 1); +} + +TEST_P(CXXQualifiedNames, FuncInEnclosureInNamespace) { + DwarfTag tag = GetParam(); + + SetLanguage(google_breakpad::DW_LANG_C_plus_plus); + PushLine(10, 1, "line-file", 69819327); + + StartCU(); + DIEHandler* namespace_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_namespace, + "Namespace"); + EXPECT_TRUE(namespace_handler != NULL); + DIEHandler* enclosure_handler = StartNamedDIE(namespace_handler, tag, + "Enclosure"); + EXPECT_TRUE(enclosure_handler != NULL); + DefineFunction(enclosure_handler, "function", 10, 1, NULL); + enclosure_handler->Finish(); + delete enclosure_handler; + namespace_handler->Finish(); + delete namespace_handler; + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "Namespace::Enclosure::function", 10, 1); +} + +TEST_F(CXXQualifiedNames, FunctionInClassInStructInNamespace) { + SetLanguage(google_breakpad::DW_LANG_C_plus_plus); + PushLine(10, 1, "filename1", 69819327); + + StartCU(); + DIEHandler* namespace_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_namespace, + "namespace_A"); + EXPECT_TRUE(namespace_handler != NULL); + DIEHandler* struct_handler + = StartNamedDIE(namespace_handler, google_breakpad::DW_TAG_structure_type, + "struct_B"); + EXPECT_TRUE(struct_handler != NULL); + DIEHandler* class_handler + = StartNamedDIE(struct_handler, google_breakpad::DW_TAG_class_type, + "class_C"); + DefineFunction(class_handler, "function_D", 10, 1, NULL); + class_handler->Finish(); + delete class_handler; + struct_handler->Finish(); + delete struct_handler; + namespace_handler->Finish(); + delete namespace_handler; + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "namespace_A::struct_B::class_C::function_D", 10, 1); +} + +struct LanguageAndQualifiedName { + google_breakpad::DwarfLanguage language; + const char* name; +}; + +const LanguageAndQualifiedName LanguageAndQualifiedNameCases[] = { + { google_breakpad::DW_LANG_none, "class_A::function_B" }, + { google_breakpad::DW_LANG_C, "class_A::function_B" }, + { google_breakpad::DW_LANG_C89, "class_A::function_B" }, + { google_breakpad::DW_LANG_C99, "class_A::function_B" }, + { google_breakpad::DW_LANG_C_plus_plus, "class_A::function_B" }, + { google_breakpad::DW_LANG_Java, "class_A.function_B" }, + { google_breakpad::DW_LANG_Cobol74, "class_A::function_B" }, + { google_breakpad::DW_LANG_Mips_Assembler, NULL } +}; + +class QualifiedForLanguage + : public CUFixtureBase, + public TestWithParam { }; + +INSTANTIATE_TEST_SUITE_P(LanguageAndQualifiedName, QualifiedForLanguage, + ValuesIn(LanguageAndQualifiedNameCases)); + +TEST_P(QualifiedForLanguage, MemberFunction) { + const LanguageAndQualifiedName& param = GetParam(); + + PushLine(10, 1, "line-file", 212966758); + SetLanguage(param.language); + + StartCU(); + DIEHandler* class_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_class_type, + "class_A"); + DefineFunction(class_handler, "function_B", 10, 1, NULL); + class_handler->Finish(); + delete class_handler; + root_handler_.Finish(); + + if (param.name) { + TestFunctionCount(1); + TestFunction(0, param.name, 10, 1); + } else { + TestFunctionCount(0); + } +} + +TEST_P(QualifiedForLanguage, MemberFunctionSignedLanguage) { + const LanguageAndQualifiedName& param = GetParam(); + + PushLine(10, 1, "line-file", 212966758); + SetLanguage(param.language); + SetLanguageSigned(true); + + StartCU(); + DIEHandler* class_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_class_type, + "class_A"); + DefineFunction(class_handler, "function_B", 10, 1, NULL); + class_handler->Finish(); + delete class_handler; + root_handler_.Finish(); + + if (param.name) { + TestFunctionCount(1); + TestFunction(0, param.name, 10, 1); + } else { + TestFunctionCount(0); + } +} + +class Specifications: public CUFixtureBase, public Test { }; + +TEST_F(Specifications, Function) { + PushLine(0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL, "line-file", 54883661); + + StartCU(); + DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL, + google_breakpad::DW_TAG_subprogram, "declaration-name", ""); + DefinitionDIE(&root_handler_, google_breakpad::DW_TAG_subprogram, + 0xcd3c51b946fb1eeeLL, "", + 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "declaration-name", + 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); +} + +TEST_F(Specifications, MangledName) { + // Language defaults to C++, so no need to set it here. + PushLine(0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL, "line-file", 54883661); + + StartCU(); + DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL, + google_breakpad::DW_TAG_subprogram, "declaration-name", + "_ZN1C1fEi"); + DefinitionDIE(&root_handler_, google_breakpad::DW_TAG_subprogram, + 0xcd3c51b946fb1eeeLL, "", + 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "C::f(int)", + 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); +} + +TEST_F(Specifications, MangledNameSwift) { + // Swift mangled names should pass through untouched. + SetLanguage(google_breakpad::DW_LANG_Swift); + PushLine(0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL, "line-file", 54883661); + StartCU(); + const string kName = "_TFC9swifttest5Shape17simpleDescriptionfS0_FT_Si"; + DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL, + google_breakpad::DW_TAG_subprogram, "declaration-name", + kName); + DefinitionDIE(&root_handler_, google_breakpad::DW_TAG_subprogram, + 0xcd3c51b946fb1eeeLL, "", + 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, kName, + 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); +} + +TEST_F(Specifications, MangledNameRust) { + SetLanguage(google_breakpad::DW_LANG_Rust); + PushLine(0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL, "line-file", 54883661); + + StartCU(); + const string kName = "_ZN14rustc_demangle8demangle17h373defa94bffacdeE"; + DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL, + google_breakpad::DW_TAG_subprogram, "declaration-name", + kName); + DefinitionDIE(&root_handler_, google_breakpad::DW_TAG_subprogram, + 0xcd3c51b946fb1eeeLL, "", + 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, +#ifndef HAVE_RUSTC_DEMANGLE + // Rust mangled names should pass through untouched if not + // using rustc-demangle. + kName, +#else + // If rustc-demangle is available this should be properly + // demangled. + "rustc_demangle::demangle", +#endif + 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL); +} + +TEST_F(Specifications, MemberFunction) { + PushLine(0x3341a248634e7170ULL, 0x5f6938ee5553b953ULL, "line-file", 18116691); + + StartCU(); + DIEHandler* class_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_class_type, "class_A"); + DeclarationDIE(class_handler, 0x7d83028c431406e8ULL, + google_breakpad::DW_TAG_subprogram, "declaration-name", ""); + class_handler->Finish(); + delete class_handler; + DefinitionDIE(&root_handler_, google_breakpad::DW_TAG_subprogram, + 0x7d83028c431406e8ULL, "", + 0x3341a248634e7170ULL, 0x5f6938ee5553b953ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "class_A::declaration-name", + 0x3341a248634e7170ULL, 0x5f6938ee5553b953ULL); +} + +// This case should gather the name from both the definition and the +// declaration's parent. +TEST_F(Specifications, FunctionDeclarationParent) { + PushLine(0x463c9ddf405be227ULL, 0x6a47774af5049680ULL, "line-file", 70254922); + + StartCU(); + { + DIEHandler* class_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_class_type, + "class_A"); + ASSERT_TRUE(class_handler != NULL); + DeclarationDIE(class_handler, 0x0e0e877c8404544aULL, + google_breakpad::DW_TAG_subprogram, "declaration-name", ""); + class_handler->Finish(); + delete class_handler; + } + + DefinitionDIE(&root_handler_, google_breakpad::DW_TAG_subprogram, + 0x0e0e877c8404544aULL, "definition-name", + 0x463c9ddf405be227ULL, 0x6a47774af5049680ULL); + + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "class_A::definition-name", + 0x463c9ddf405be227ULL, 0x6a47774af5049680ULL); +} + +// Named scopes should also gather enclosing name components from +// their declarations. +TEST_F(Specifications, NamedScopeDeclarationParent) { + PushLine(0x5d13433d0df13d00ULL, 0x48ebebe5ade2cab4ULL, "line-file", 77392604); + + StartCU(); + { + DIEHandler* space_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_namespace, + "space_A"); + ASSERT_TRUE(space_handler != NULL); + DeclarationDIE(space_handler, 0x419bb1d12f9a73a2ULL, + google_breakpad::DW_TAG_class_type, "class-declaration-name", + ""); + space_handler->Finish(); + delete space_handler; + } + + { + DIEHandler* class_handler + = StartSpecifiedDIE(&root_handler_, google_breakpad::DW_TAG_class_type, + 0x419bb1d12f9a73a2ULL, "class-definition-name"); + ASSERT_TRUE(class_handler != NULL); + DefineFunction(class_handler, "function", + 0x5d13433d0df13d00ULL, 0x48ebebe5ade2cab4ULL, NULL); + class_handler->Finish(); + delete class_handler; + } + + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "space_A::class-definition-name::function", + 0x5d13433d0df13d00ULL, 0x48ebebe5ade2cab4ULL); +} + +// This test recreates bug 364. +TEST_F(Specifications, InlineFunction) { + PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118); + + StartCU(); + DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL, + google_breakpad::DW_TAG_subprogram, "inline-name", ""); + AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL, + google_breakpad::DW_INL_inlined, 0xcd3c51b946fb1eeeLL, ""); + DefineInlineInstanceDIE(&root_handler_, "", 0x1e8dac5d507ed7abULL, + 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "inline-name", + 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); +} + +// An inline function in a namespace should correctly derive its +// name from its abstract origin, and not just the namespace name. +TEST_F(Specifications, InlineFunctionInNamespace) { + PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118); + + StartCU(); + DIEHandler* space_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_namespace, + "Namespace"); + ASSERT_TRUE(space_handler != NULL); + AbstractInstanceDIE(space_handler, 0x1e8dac5d507ed7abULL, + google_breakpad::DW_INL_inlined, 0LL, "func-name"); + DefineInlineInstanceDIE(space_handler, "", 0x1e8dac5d507ed7abULL, + 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); + space_handler->Finish(); + delete space_handler; + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "Namespace::func-name", + 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL); +} + +// Check name construction for a long chain containing each combination of: +// - struct, union, class, namespace +// - direct and definition +TEST_F(Specifications, LongChain) { + PushLine(0x5a0dd6bb85db754cULL, 0x3bccb213d08c7fd3ULL, "line-file", 21192926); + SetLanguage(google_breakpad::DW_LANG_C_plus_plus); + + StartCU(); + // The structure we're building here is: + // space_A full definition + // space_B declaration + // space_B definition + // struct_C full definition + // struct_D declaration + // struct_D definition + // union_E full definition + // union_F declaration + // union_F definition + // class_G full definition + // class_H declaration + // class_H definition + // func_I declaration + // func_I definition + // + // So: + // - space_A, struct_C, union_E, and class_G don't use specifications; + // - space_B, struct_D, union_F, and class_H do. + // - func_I uses a specification. + // + // The full name for func_I is thus: + // + // space_A::space_B::struct_C::struct_D::union_E::union_F:: + // class_G::class_H::func_I + { + DIEHandler* space_A_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_namespace, + "space_A"); + DeclarationDIE(space_A_handler, 0x2e111126496596e2ULL, + google_breakpad::DW_TAG_namespace, "space_B", ""); + space_A_handler->Finish(); + delete space_A_handler; + } + + { + DIEHandler* space_B_handler + = StartSpecifiedDIE(&root_handler_, google_breakpad::DW_TAG_namespace, + 0x2e111126496596e2ULL); + DIEHandler* struct_C_handler + = StartNamedDIE(space_B_handler, google_breakpad::DW_TAG_structure_type, + "struct_C"); + DeclarationDIE(struct_C_handler, 0x20cd423bf2a25a4cULL, + google_breakpad::DW_TAG_structure_type, "struct_D", ""); + struct_C_handler->Finish(); + delete struct_C_handler; + space_B_handler->Finish(); + delete space_B_handler; + } + + { + DIEHandler* struct_D_handler + = StartSpecifiedDIE(&root_handler_, google_breakpad::DW_TAG_structure_type, + 0x20cd423bf2a25a4cULL); + DIEHandler* union_E_handler + = StartNamedDIE(struct_D_handler, google_breakpad::DW_TAG_union_type, + "union_E"); + DeclarationDIE(union_E_handler, 0xe25c84805aa58c32ULL, + google_breakpad::DW_TAG_union_type, "union_F", ""); + union_E_handler->Finish(); + delete union_E_handler; + struct_D_handler->Finish(); + delete struct_D_handler; + } + + { + DIEHandler* union_F_handler + = StartSpecifiedDIE(&root_handler_, google_breakpad::DW_TAG_union_type, + 0xe25c84805aa58c32ULL); + DIEHandler* class_G_handler + = StartNamedDIE(union_F_handler, google_breakpad::DW_TAG_class_type, + "class_G"); + DeclarationDIE(class_G_handler, 0xb70d960dcc173b6eULL, + google_breakpad::DW_TAG_class_type, "class_H", ""); + class_G_handler->Finish(); + delete class_G_handler; + union_F_handler->Finish(); + delete union_F_handler; + } + + { + DIEHandler* class_H_handler + = StartSpecifiedDIE(&root_handler_, google_breakpad::DW_TAG_class_type, + 0xb70d960dcc173b6eULL); + DeclarationDIE(class_H_handler, 0x27ff829e3bf69f37ULL, + google_breakpad::DW_TAG_subprogram, "func_I", ""); + class_H_handler->Finish(); + delete class_H_handler; + } + + DefinitionDIE(&root_handler_, google_breakpad::DW_TAG_subprogram, + 0x27ff829e3bf69f37ULL, "", + 0x5a0dd6bb85db754cULL, 0x3bccb213d08c7fd3ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "space_A::space_B::struct_C::struct_D::union_E::union_F" + "::class_G::class_H::func_I", + 0x5a0dd6bb85db754cULL, 0x3bccb213d08c7fd3ULL); +} + +TEST_F(Specifications, InterCU) { + Module m("module-name", "module-os", "module-arch", "module-id"); + DwarfCUToModule::FileContext fc("dwarf-filename", &m, true); + EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return()); + MockLineToModuleHandler lr; + EXPECT_CALL(lr, ReadProgram(_,_,_,_,_,_,_,_,_)).Times(0); + + // Kludge: satisfy reporter_'s expectation. + reporter_.SetCUName("compilation-unit-name"); + + // First CU. Declares class_A. + { + DwarfCUToModule root1_handler(&fc, &lr, nullptr, &reporter_); + ASSERT_TRUE(root1_handler.StartCompilationUnit(0, 1, 2, 3, 3)); + ASSERT_TRUE(root1_handler.StartRootDIE(1, + google_breakpad::DW_TAG_compile_unit)); + ProcessStrangeAttributes(&root1_handler); + ASSERT_TRUE(root1_handler.EndAttributes()); + DeclarationDIE(&root1_handler, 0xb8fbfdd5f0b26fceULL, + google_breakpad::DW_TAG_class_type, "class_A", ""); + root1_handler.Finish(); + } + + // Second CU. Defines class_A, declares member_func_B. + { + DwarfCUToModule root2_handler(&fc, &lr, nullptr, &reporter_); + ASSERT_TRUE(root2_handler.StartCompilationUnit(0, 1, 2, 3, 3)); + ASSERT_TRUE(root2_handler.StartRootDIE(1, + google_breakpad::DW_TAG_compile_unit)); + ASSERT_TRUE(root2_handler.EndAttributes()); + DIEHandler* class_A_handler + = StartSpecifiedDIE(&root2_handler, google_breakpad::DW_TAG_class_type, + 0xb8fbfdd5f0b26fceULL); + DeclarationDIE(class_A_handler, 0xb01fef8b380bd1a2ULL, + google_breakpad::DW_TAG_subprogram, "member_func_B", ""); + class_A_handler->Finish(); + delete class_A_handler; + root2_handler.Finish(); + } + + // Third CU. Defines member_func_B. + { + DwarfCUToModule root3_handler(&fc, &lr, nullptr, &reporter_); + ASSERT_TRUE(root3_handler.StartCompilationUnit(0, 1, 2, 3, 3)); + ASSERT_TRUE(root3_handler.StartRootDIE(1, + google_breakpad::DW_TAG_compile_unit)); + ASSERT_TRUE(root3_handler.EndAttributes()); + DefinitionDIE(&root3_handler, google_breakpad::DW_TAG_subprogram, + 0xb01fef8b380bd1a2ULL, "", + 0x2618f00a1a711e53ULL, 0x4fd94b76d7c2caf5ULL); + root3_handler.Finish(); + } + + vector functions; + m.GetFunctions(&functions, functions.end()); + EXPECT_EQ(1U, functions.size()); + EXPECT_STREQ("class_A::member_func_B", functions[0]->name.str().c_str()); +} + +TEST_F(Specifications, UnhandledInterCU) { + Module m("module-name", "module-os", "module-arch", "module-id"); + DwarfCUToModule::FileContext fc("dwarf-filename", &m, false); + EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return()); + MockLineToModuleHandler lr; + EXPECT_CALL(lr, ReadProgram(_,_,_,_,_,_,_,_,_)).Times(0); + + // Kludge: satisfy reporter_'s expectation. + reporter_.SetCUName("compilation-unit-name"); + + // First CU. Declares class_A. + { + DwarfCUToModule root1_handler(&fc, &lr, nullptr, &reporter_); + ASSERT_TRUE(root1_handler.StartCompilationUnit(0, 1, 2, 3, 3)); + ASSERT_TRUE(root1_handler.StartRootDIE(1, + google_breakpad::DW_TAG_compile_unit)); + ProcessStrangeAttributes(&root1_handler); + ASSERT_TRUE(root1_handler.EndAttributes()); + DeclarationDIE(&root1_handler, 0xb8fbfdd5f0b26fceULL, + google_breakpad::DW_TAG_class_type, "class_A", ""); + root1_handler.Finish(); + } + + // Second CU. Defines class_A, declares member_func_B. + { + DwarfCUToModule root2_handler(&fc, &lr, nullptr, &reporter_); + ASSERT_TRUE(root2_handler.StartCompilationUnit(0, 1, 2, 3, 3)); + ASSERT_TRUE(root2_handler.StartRootDIE(1, + google_breakpad::DW_TAG_compile_unit)); + ASSERT_TRUE(root2_handler.EndAttributes()); + EXPECT_CALL(reporter_, UnhandledInterCUReference(_, _)).Times(1); + DIEHandler* class_A_handler + = StartSpecifiedDIE(&root2_handler, google_breakpad::DW_TAG_class_type, + 0xb8fbfdd5f0b26fceULL); + DeclarationDIE(class_A_handler, 0xb01fef8b380bd1a2ULL, + google_breakpad::DW_TAG_subprogram, "member_func_B", ""); + class_A_handler->Finish(); + delete class_A_handler; + root2_handler.Finish(); + } + + // Third CU. Defines member_func_B. + { + DwarfCUToModule root3_handler(&fc, &lr, nullptr, &reporter_); + ASSERT_TRUE(root3_handler.StartCompilationUnit(0, 1, 2, 3, 3)); + ASSERT_TRUE(root3_handler.StartRootDIE(1, + google_breakpad::DW_TAG_compile_unit)); + ASSERT_TRUE(root3_handler.EndAttributes()); + EXPECT_CALL(reporter_, UnhandledInterCUReference(_, _)).Times(1); + DefinitionDIE(&root3_handler, google_breakpad::DW_TAG_subprogram, + 0xb01fef8b380bd1a2ULL, "", + 0x2618f00a1a711e53ULL, 0x4fd94b76d7c2caf5ULL); + root3_handler.Finish(); + } +} + +TEST_F(Specifications, BadOffset) { + PushLine(0xa0277efd7ce83771ULL, 0x149554a184c730c1ULL, "line-file", 56636272); + + StartCU(); + DeclarationDIE(&root_handler_, 0xefd7f7752c27b7e4ULL, + google_breakpad::DW_TAG_subprogram, "", ""); + DefinitionDIE(&root_handler_, google_breakpad::DW_TAG_subprogram, + 0x2be953efa6f9a996ULL, "function", + 0xa0277efd7ce83771ULL, 0x149554a184c730c1ULL); + root_handler_.Finish(); +} + +TEST_F(Specifications, FunctionDefinitionHasOwnName) { + PushLine(0xced50b3eea81022cULL, 0x08dd4d301cc7a7d2ULL, "line-file", 56792403); + + StartCU(); + DeclarationDIE(&root_handler_, 0xc34ff4786cae78bdULL, + google_breakpad::DW_TAG_subprogram, "declaration-name", ""); + DefinitionDIE(&root_handler_, google_breakpad::DW_TAG_subprogram, + 0xc34ff4786cae78bdULL, "definition-name", + 0xced50b3eea81022cULL, 0x08dd4d301cc7a7d2ULL); + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "definition-name", + 0xced50b3eea81022cULL, 0x08dd4d301cc7a7d2ULL); +} + +TEST_F(Specifications, ClassDefinitionHasOwnName) { + PushLine(0x1d0f5e0f6ce309bdULL, 0x654e1852ec3599e7ULL, "line-file", 57119241); + + StartCU(); + DeclarationDIE(&root_handler_, 0xd0fe467ec2f1a58cULL, + google_breakpad::DW_TAG_class_type, "class-declaration-name", ""); + + google_breakpad::DIEHandler* class_definition + = StartSpecifiedDIE(&root_handler_, google_breakpad::DW_TAG_class_type, + 0xd0fe467ec2f1a58cULL, "class-definition-name"); + ASSERT_TRUE(class_definition); + DeclarationDIE(class_definition, 0x6d028229c15623dbULL, + google_breakpad::DW_TAG_subprogram, + "function-declaration-name", ""); + class_definition->Finish(); + delete class_definition; + + DefinitionDIE(&root_handler_, google_breakpad::DW_TAG_subprogram, + 0x6d028229c15623dbULL, "function-definition-name", + 0x1d0f5e0f6ce309bdULL, 0x654e1852ec3599e7ULL); + + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "class-definition-name::function-definition-name", + 0x1d0f5e0f6ce309bdULL, 0x654e1852ec3599e7ULL); +} + +// DIEs that cite a specification should prefer the specification's +// parents over their own when choosing qualified names. In this test, +// we take the name from our definition but the enclosing scope name +// from our declaration. I don't see why they'd ever be different, but +// we want to verify what DwarfCUToModule is looking at. +TEST_F(Specifications, PreferSpecificationParents) { + PushLine(0xbbd9d54dce3b95b7ULL, 0x39188b7b52b0899fULL, "line-file", 79488694); + + StartCU(); + { + google_breakpad::DIEHandler* declaration_class_handler = + StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_class_type, + "declaration-class"); + DeclarationDIE(declaration_class_handler, 0x9ddb35517455ef7aULL, + google_breakpad::DW_TAG_subprogram, "function-declaration", + ""); + declaration_class_handler->Finish(); + delete declaration_class_handler; + } + { + google_breakpad::DIEHandler* definition_class_handler + = StartNamedDIE(&root_handler_, google_breakpad::DW_TAG_class_type, + "definition-class"); + DefinitionDIE(definition_class_handler, google_breakpad::DW_TAG_subprogram, + 0x9ddb35517455ef7aULL, "function-definition", + 0xbbd9d54dce3b95b7ULL, 0x39188b7b52b0899fULL); + definition_class_handler->Finish(); + delete definition_class_handler; + } + root_handler_.Finish(); + + TestFunctionCount(1); + TestFunction(0, "declaration-class::function-definition", + 0xbbd9d54dce3b95b7ULL, 0x39188b7b52b0899fULL); +} + +class CUErrors: public CUFixtureBase, public Test { }; + +TEST_F(CUErrors, BadStmtList) { + EXPECT_CALL(reporter_, BadLineInfoOffset(dummy_line_size_ + 10)).Times(1); + + ASSERT_TRUE(root_handler_ + .StartCompilationUnit(0xc591d5b037543d7cULL, 0x11, 0xcd, + 0x2d7d19546cf6590cULL, 3)); + ASSERT_TRUE(root_handler_.StartRootDIE(0xae789dc102cfca54ULL, + google_breakpad::DW_TAG_compile_unit)); + root_handler_.ProcessAttributeString(google_breakpad::DW_AT_name, + google_breakpad::DW_FORM_strp, + "compilation-unit-name"); + root_handler_.ProcessAttributeUnsigned(google_breakpad::DW_AT_stmt_list, + google_breakpad::DW_FORM_ref4, + dummy_line_size_ + 10); + root_handler_.EndAttributes(); + root_handler_.Finish(); +} + +TEST_F(CUErrors, NoLineSection) { + EXPECT_CALL(reporter_, MissingSection(".debug_line")).Times(1); + PushLine(0x88507fb678052611ULL, 0x42c8e9de6bbaa0faULL, "line-file", 64472290); + // Delete the entry for .debug_line added by the fixture class's constructor. + file_context_.ClearSectionMapForTest(); + + StartCU(); + root_handler_.Finish(); +} + +TEST_F(CUErrors, BadDwarfVersion1) { + // Kludge: satisfy reporter_'s expectation. + reporter_.SetCUName("compilation-unit-name"); + + ASSERT_FALSE(root_handler_ + .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90, + 0xc9de224ccb99ac3eULL, 1)); +} + +TEST_F(CUErrors, GoodDwarfVersion2) { + // Kludge: satisfy reporter_'s expectation. + reporter_.SetCUName("compilation-unit-name"); + + ASSERT_TRUE(root_handler_ + .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90, + 0xc9de224ccb99ac3eULL, 2)); +} + +TEST_F(CUErrors, GoodDwarfVersion3) { + // Kludge: satisfy reporter_'s expectation. + reporter_.SetCUName("compilation-unit-name"); + + ASSERT_TRUE(root_handler_ + .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90, + 0xc9de224ccb99ac3eULL, 3)); +} + +TEST_F(CUErrors, BadCURootDIETag) { + // Kludge: satisfy reporter_'s expectation. + reporter_.SetCUName("compilation-unit-name"); + + ASSERT_TRUE(root_handler_ + .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90, + 0xc9de224ccb99ac3eULL, 3)); + + ASSERT_FALSE(root_handler_.StartRootDIE(0x02e56bfbda9e7337ULL, + google_breakpad::DW_TAG_subprogram)); +} + +// Tests for DwarfCUToModule::Reporter. These just produce (or fail to +// produce) output, so their results need to be checked by hand. +struct Reporter: public Test { + Reporter() + : reporter("filename", 0x123456789abcdef0ULL), + function("function name", 0x19c45c30770c1eb0ULL), + file("source file name") { + reporter.SetCUName("compilation-unit-name"); + + Module::Range range(0x19c45c30770c1eb0ULL, 0x89808a5bdfa0a6a3ULL); + function.ranges.push_back(range); + function.parameter_size = 0x6a329f18683dcd51ULL; + + line.address = 0x3606ac6267aebeccULL; + line.size = 0x5de482229f32556aULL; + line.file = &file; + line.number = 93400201; + } + + DwarfCUToModule::WarningReporter reporter; + Module::Function function; + Module::File file; + Module::Line line; +}; + +TEST_F(Reporter, UnknownSpecification) { + reporter.UnknownSpecification(0x123456789abcdef1ULL, 0x323456789abcdef2ULL); +} + +TEST_F(Reporter, UnknownAbstractOrigin) { + reporter.UnknownAbstractOrigin(0x123456789abcdef1ULL, 0x323456789abcdef2ULL); +} + +TEST_F(Reporter, MissingSection) { + reporter.MissingSection("section name"); +} + +TEST_F(Reporter, BadLineInfoOffset) { + reporter.BadLineInfoOffset(0x123456789abcdef1ULL); +} + +TEST_F(Reporter, UncoveredFunctionDisabled) { + reporter.UncoveredFunction(function); + EXPECT_FALSE(reporter.uncovered_warnings_enabled()); +} + +TEST_F(Reporter, UncoveredFunctionEnabled) { + reporter.set_uncovered_warnings_enabled(true); + reporter.UncoveredFunction(function); + EXPECT_TRUE(reporter.uncovered_warnings_enabled()); +} + +TEST_F(Reporter, UncoveredLineDisabled) { + reporter.UncoveredLine(line); + EXPECT_FALSE(reporter.uncovered_warnings_enabled()); +} + +TEST_F(Reporter, UncoveredLineEnabled) { + reporter.set_uncovered_warnings_enabled(true); + reporter.UncoveredLine(line); + EXPECT_TRUE(reporter.uncovered_warnings_enabled()); +} + +TEST_F(Reporter, UnnamedFunction) { + reporter.UnnamedFunction(0x90c0baff9dedb2d9ULL); +} + +// Would be nice to also test: +// - overlapping lines, functions diff --git a/src/common/dwarf_line_to_module.cc b/src/common/dwarf_line_to_module.cc new file mode 100644 index 0000000..940ab2d --- /dev/null +++ b/src/common/dwarf_line_to_module.cc @@ -0,0 +1,146 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf_line_to_module.cc: Implementation of DwarfLineToModule class. +// See dwarf_line_to_module.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include + +#include "common/dwarf_line_to_module.h" +#include "common/using_std_string.h" + +// Trying to support Windows paths in a reasonable way adds a lot of +// variations to test; it would be better to just put off dealing with +// it until we actually have to deal with DWARF on Windows. + +// Return true if PATH is an absolute path, false if it is relative. +static bool PathIsAbsolute(const string& path) { + return (path.size() >= 1 && path[0] == '/'); +} + +static bool HasTrailingSlash(const string& path) { + return (path.size() >= 1 && path[path.size() - 1] == '/'); +} + +// If PATH is an absolute path, return PATH. If PATH is a relative path, +// treat it as relative to BASE and return the combined path. +static string ExpandPath(const string& path, + const string& base) { + if (PathIsAbsolute(path) || base.empty()) + return path; + return base + (HasTrailingSlash(base) ? "" : "/") + path; +} + +namespace google_breakpad { + +void DwarfLineToModule::DefineDir(const string& name, uint32_t dir_num) { + // Directory number zero is reserved to mean the compilation + // directory. Silently ignore attempts to redefine it. + if (dir_num != 0) + directories_[dir_num] = ExpandPath(name, compilation_dir_); +} + +void DwarfLineToModule::DefineFile(const string& name, int32_t file_num, + uint32_t dir_num, uint64_t mod_time, + uint64_t length) { + if (file_num == -1) + file_num = ++highest_file_number_; + else if (file_num > highest_file_number_) + highest_file_number_ = file_num; + + string dir_name; + if (dir_num == 0) { + // Directory number zero is the compilation directory, and is stored as + // an attribute on the compilation unit, rather than in the program table. + dir_name = compilation_dir_; + } else { + DirectoryTable::const_iterator directory_it = directories_.find(dir_num); + if (directory_it != directories_.end()) { + dir_name = directory_it->second; + } else { + if (!warned_bad_directory_number_) { + fprintf(stderr, "warning: DWARF line number data refers to undefined" + " directory numbers\n"); + warned_bad_directory_number_ = true; + } + } + } + + string full_name = ExpandPath(name, dir_name); + + // Find a Module::File object of the given name, and add it to the + // file table. + (*files_)[file_num] = module_->FindFile(full_name); +} + +void DwarfLineToModule::AddLine(uint64_t address, uint64_t length, + uint32_t file_num, uint32_t line_num, + uint32_t column_num) { + if (length == 0) + return; + + // Clip lines not to extend beyond the end of the address space. + if (address + length < address) + length = -address; + + // Should we omit this line? (See the comments for omitted_line_end_.) + if (address == 0 || address == omitted_line_end_) { + omitted_line_end_ = address + length; + return; + } else { + omitted_line_end_ = 0; + } + + // Find the source file being referred to. + Module::File *file = (*files_)[file_num]; + if (!file) { + if (!warned_bad_file_number_) { + fprintf(stderr, "warning: DWARF line number data refers to " + "undefined file numbers\n"); + warned_bad_file_number_ = true; + } + return; + } + Module::Line line; + line.address = address; + // We set the size when we get the next line or the EndSequence call. + line.size = length; + line.file = file; + line.number = line_num; + lines_->push_back(line); +} + +} // namespace google_breakpad diff --git a/src/common/dwarf_line_to_module.h b/src/common/dwarf_line_to_module.h new file mode 100644 index 0000000..c93a9bf --- /dev/null +++ b/src/common/dwarf_line_to_module.h @@ -0,0 +1,190 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// The DwarfLineToModule class accepts line number information from a +// DWARF parser and adds it to a google_breakpad::Module. The Module +// can write that data out as a Breakpad symbol file. + +#ifndef COMMON_LINUX_DWARF_LINE_TO_MODULE_H +#define COMMON_LINUX_DWARF_LINE_TO_MODULE_H + +#include + +#include "common/module.h" +#include "common/dwarf/dwarf2reader.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +// A class for producing a vector of google_breakpad::Module::Line +// instances from parsed DWARF line number data. +// +// An instance of this class can be provided as a handler to a +// LineInfo DWARF line number information parser. The +// handler accepts source location information from the parser and +// uses it to produce a vector of google_breakpad::Module::Line +// objects, referring to google_breakpad::Module::File objects added +// to a particular google_breakpad::Module. +// +// GNU toolchain omitted sections support: +// ====================================== +// +// Given the right options, the GNU toolchain will omit unreferenced +// functions from the final executable. Unfortunately, when it does so, it +// does not remove the associated portions of the DWARF line number +// program; instead, it gives the DW_LNE_set_address instructions referring +// to the now-deleted code addresses of zero. Given this input, the DWARF +// line parser will call AddLine with a series of lines starting at address +// zero. For example, here is the output from 'readelf -wl' for a program +// with four functions, the first three of which have been omitted: +// +// Line Number Statements: +// Extended opcode 2: set Address to 0x0 +// Advance Line by 14 to 15 +// Copy +// Special opcode 48: advance Address by 3 to 0x3 and Line by 1 to 16 +// Special opcode 119: advance Address by 8 to 0xb and Line by 2 to 18 +// Advance PC by 2 to 0xd +// Extended opcode 1: End of Sequence +// +// Extended opcode 2: set Address to 0x0 +// Advance Line by 14 to 15 +// Copy +// Special opcode 48: advance Address by 3 to 0x3 and Line by 1 to 16 +// Special opcode 119: advance Address by 8 to 0xb and Line by 2 to 18 +// Advance PC by 2 to 0xd +// Extended opcode 1: End of Sequence +// +// Extended opcode 2: set Address to 0x0 +// Advance Line by 19 to 20 +// Copy +// Special opcode 48: advance Address by 3 to 0x3 and Line by 1 to 21 +// Special opcode 76: advance Address by 5 to 0x8 and Line by 1 to 22 +// Advance PC by 2 to 0xa +// Extended opcode 1: End of Sequence +// +// Extended opcode 2: set Address to 0x80483a4 +// Advance Line by 23 to 24 +// Copy +// Special opcode 202: advance Address by 14 to 0x80483b2 and Line by 1 to 25 +// Special opcode 76: advance Address by 5 to 0x80483b7 and Line by 1 to 26 +// Advance PC by 6 to 0x80483bd +// Extended opcode 1: End of Sequence +// +// Instead of collecting runs of lines describing code that is not there, +// we try to recognize and drop them. Since the linker doesn't explicitly +// distinguish references to dropped sections from genuine references to +// code at address zero, we must use a heuristic. We have chosen: +// +// - If a line starts at address zero, omit it. (On the platforms +// breakpad targets, it is extremely unlikely that there will be code +// at address zero.) +// +// - If a line starts immediately after an omitted line, omit it too. +class DwarfLineToModule: public LineInfoHandler { + public: + // As the DWARF line info parser passes us line records, add source + // files to MODULE, and add all lines to the end of LINES. LINES + // need not be empty. If the parser hands us a zero-length line, we + // omit it. If the parser hands us a line that extends beyond the + // end of the address space, we clip it. It's up to our client to + // sort out which lines belong to which functions; we don't add them + // to any particular function in MODULE ourselves. + DwarfLineToModule(Module* module, + const string& compilation_dir, + vector* lines, + std::map* files) + : module_(module), + compilation_dir_(compilation_dir), + lines_(lines), + files_(files), + highest_file_number_(-1), + omitted_line_end_(0), + warned_bad_file_number_(false), + warned_bad_directory_number_(false) { } + + ~DwarfLineToModule() { } + + void DefineDir(const string& name, uint32_t dir_num); + void DefineFile(const string& name, int32_t file_num, + uint32_t dir_num, uint64_t mod_time, + uint64_t length); + void AddLine(uint64_t address, uint64_t length, + uint32_t file_num, uint32_t line_num, uint32_t column_num); + + private: + + typedef std::map DirectoryTable; + typedef std::map FileTable; + + // The module we're contributing debugging info to. Owned by our + // client. + Module *module_; + + // The compilation directory for the current compilation unit whose + // lines are being accumulated. + string compilation_dir_; + + // The vector of lines we're accumulating. Owned by our client. + // + // In a Module, as in a breakpad symbol file, lines belong to + // specific functions, but DWARF simply assigns lines to addresses; + // one must infer the line/function relationship using the + // functions' beginning and ending addresses. So we can't add these + // to the appropriate function from module_ until we've read the + // function info as well. Instead, we accumulate lines here, and let + // whoever constructed this sort it all out. + vector* lines_; + + // A table mapping directory numbers to paths. + DirectoryTable directories_; + + // A table mapping file numbers to Module::File pointers. + FileTable* files_; + + // The highest file number we've seen so far, or -1 if we've seen + // none. Used for dynamically defined file numbers. + int32_t highest_file_number_; + + // This is the ending address of the last line we omitted, or zero if we + // didn't omit the previous line. It is zero before we have received any + // AddLine calls. + uint64_t omitted_line_end_; + + // True if we've warned about: + bool warned_bad_file_number_; // bad file numbers + bool warned_bad_directory_number_; // bad directory numbers +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_DWARF_LINE_TO_MODULE_H diff --git a/src/common/dwarf_line_to_module_unittest.cc b/src/common/dwarf_line_to_module_unittest.cc new file mode 100644 index 0000000..9eb1469 --- /dev/null +++ b/src/common/dwarf_line_to_module_unittest.cc @@ -0,0 +1,413 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dwarf_line_to_module.cc: Unit tests for google_breakpad::DwarfLineToModule. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "breakpad_googletest_includes.h" +#include "common/dwarf_line_to_module.h" + +using std::vector; + +using google_breakpad::DwarfLineToModule; +using google_breakpad::Module; +using google_breakpad::Module; + +TEST(SimpleModule, One) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineFile("file1", 0x30bf0f27, 0, 0, 0); + h.AddLine(0x6fd126fbf74f2680LL, 0x63c9a14cf556712bLL, 0x30bf0f27, + 0x4c090cbf, 0x1cf9fe0d); + + vector files; + m.GetFiles(&files); + EXPECT_EQ(1U, files.size()); + EXPECT_STREQ("/file1", files[0]->name.c_str()); + + EXPECT_EQ(1U, lines.size()); + EXPECT_EQ(0x6fd126fbf74f2680ULL, lines[0].address); + EXPECT_EQ(0x63c9a14cf556712bULL, lines[0].size); + EXPECT_TRUE(lines[0].file == files[0]); + EXPECT_EQ(0x4c090cbf, lines[0].number); +} + +TEST(SimpleModule, Many) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineDir("directory1", 0x838299ab); + h.DefineDir("directory2", 0xf85de023); + h.DefineFile("file1", 0x2b80377a, 0x838299ab, 0, 0); + h.DefineFile("file1", 0x63beb4a4, 0xf85de023, 0, 0); + h.DefineFile("file2", 0x1d161d56, 0x838299ab, 0, 0); + h.DefineFile("file2", 0x1e7a667c, 0xf85de023, 0, 0); + h.AddLine(0x69900c5d553b7274ULL, 0x90fded183f0d0d3cULL, 0x2b80377a, + 0x15b0f0a9U, 0x3ff5abd6U); + h.AddLine(0x45811219a39b7101ULL, 0x25a5e6a924afc41fULL, 0x63beb4a4, + 0x4d259ce9U, 0x41c5ee32U); + h.AddLine(0xfa90514c1dc9704bULL, 0x0063efeabc02f313ULL, 0x1d161d56, + 0x1ee9fa4fU, 0xbf70e46aU); + h.AddLine(0x556b55fb6a647b10ULL, 0x3f3089ca2bfd80f5ULL, 0x1e7a667c, + 0x77fc280eU, 0x2c4a728cU); + h.DefineFile("file3", -1, 0, 0, 0); + h.AddLine(0xe2d72a37f8d9403aULL, 0x034dfab5b0d4d236ULL, 0x63beb4a5, + 0x75047044U, 0xb6a0016cU); + + vector files; + m.GetFiles(&files); + ASSERT_EQ(5U, files.size()); + EXPECT_STREQ("/directory1/file1", files[0]->name.c_str()); + EXPECT_STREQ("/directory1/file2", files[1]->name.c_str()); + EXPECT_STREQ("/directory2/file1", files[2]->name.c_str()); + EXPECT_STREQ("/directory2/file2", files[3]->name.c_str()); + EXPECT_STREQ("/file3", files[4]->name.c_str()); + + ASSERT_EQ(5U, lines.size()); + + EXPECT_EQ(0x69900c5d553b7274ULL, lines[0].address); + EXPECT_EQ(0x90fded183f0d0d3cULL, lines[0].size); + EXPECT_TRUE(lines[0].file == files[0]); + EXPECT_EQ(0x15b0f0a9, lines[0].number); + + EXPECT_EQ(0x45811219a39b7101ULL, lines[1].address); + EXPECT_EQ(0x25a5e6a924afc41fULL, lines[1].size); + EXPECT_TRUE(lines[1].file == files[2]); + EXPECT_EQ(0x4d259ce9, lines[1].number); + + EXPECT_EQ(0xfa90514c1dc9704bULL, lines[2].address); + EXPECT_EQ(0x0063efeabc02f313ULL, lines[2].size); + EXPECT_TRUE(lines[2].file == files[1]); + EXPECT_EQ(0x1ee9fa4f, lines[2].number); + + EXPECT_EQ(0x556b55fb6a647b10ULL, lines[3].address); + EXPECT_EQ(0x3f3089ca2bfd80f5ULL, lines[3].size); + EXPECT_TRUE(lines[3].file == files[3]); + EXPECT_EQ(0x77fc280e, lines[3].number); + + EXPECT_EQ(0xe2d72a37f8d9403aULL, lines[4].address); + EXPECT_EQ(0x034dfab5b0d4d236ULL, lines[4].size); + EXPECT_TRUE(lines[4].file == files[4]); + EXPECT_EQ(0x75047044, lines[4].number); +} + +TEST(Filenames, Absolute) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineDir("directory1", 1); + h.DefineFile("/absolute", 1, 1, 0, 0); + + h.AddLine(1, 1, 1, 0, 0); + + vector files; + m.GetFiles(&files); + ASSERT_EQ(1U, files.size()); + EXPECT_STREQ("/absolute", files[0]->name.c_str()); + ASSERT_EQ(1U, lines.size()); + EXPECT_TRUE(lines[0].file == files[0]); +} + +TEST(Filenames, Relative) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineDir("directory1", 1); + h.DefineFile("relative", 1, 1, 0, 0); + + h.AddLine(1, 1, 1, 0, 0); + + vector files; + m.GetFiles(&files); + ASSERT_EQ(1U, files.size()); + EXPECT_STREQ("/directory1/relative", files[0]->name.c_str()); + ASSERT_EQ(1U, lines.size()); + EXPECT_TRUE(lines[0].file == files[0]); +} + +TEST(Filenames, StrangeFile) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineDir("directory1", 1); + h.DefineFile("", 1, 1, 0, 0); + h.AddLine(1, 1, 1, 0, 0); + + ASSERT_EQ(1U, lines.size()); + EXPECT_STREQ("/directory1/", lines[0].file->name.c_str()); +} + +TEST(Filenames, StrangeDirectory) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineDir("", 1); + h.DefineFile("file1", 1, 1, 0, 0); + h.AddLine(1, 1, 1, 0, 0); + + ASSERT_EQ(1U, lines.size()); + EXPECT_STREQ("/file1", lines[0].file->name.c_str()); +} + +TEST(Filenames, StrangeDirectoryAndFile) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineDir("", 1); + h.DefineFile("", 1, 1, 0, 0); + h.AddLine(1, 1, 1, 0, 0); + + ASSERT_EQ(1U, lines.size()); + EXPECT_STREQ("/", lines[0].file->name.c_str()); +} + +// We should use the compilation directory when encountering a file for +// directory number zero. +TEST(Filenames, DirectoryZeroFileIsRelativeToCompilationDir) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "src/build", &lines, &cu_files); + + h.DefineDir("Dir", 1); + h.DefineFile("File", 1, 0, 0, 0); + + h.AddLine(1, 1, 1, 0, 0); + + ASSERT_EQ(1U, lines.size()); + EXPECT_STREQ("src/build/File", lines[0].file->name.c_str()); +} + +// We should treat non-absolute directories as relative to the compilation +// directory. +TEST(Filenames, IncludeDirectoryRelativeToDirectoryZero) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "src/build", &lines, &cu_files); + + h.DefineDir("Dir", 1); + h.DefineFile("File", 1, 1, 0, 0); + + h.AddLine(1, 1, 1, 0, 0); + + ASSERT_EQ(1U, lines.size()); + EXPECT_STREQ("src/build/Dir/File", lines[0].file->name.c_str()); +} + +// We should treat absolute directories as absolute, and not relative to +// the compilation dir. +TEST(Filenames, IncludeDirectoryAbsolute) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "src/build", &lines, &cu_files); + + h.DefineDir("/Dir", 1); + h.DefineFile("File", 1, 1, 0, 0); + + h.AddLine(1, 1, 1, 0, 0); + + ASSERT_EQ(1U, lines.size()); + EXPECT_STREQ("/Dir/File", lines[0].file->name.c_str()); +} + +// We should silently ignore attempts to define directory number zero, +// since that is always the compilation directory. +TEST(ModuleErrors, DirectoryZero) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineDir("directory0", 0); // should be ignored + h.DefineFile("relative", 1, 0, 0, 0); + + h.AddLine(1, 1, 1, 0, 0); + + ASSERT_EQ(1U, lines.size()); + EXPECT_STREQ("/relative", lines[0].file->name.c_str()); +} + +// We should refuse to add lines with bogus file numbers. We should +// produce only one warning, however. +TEST(ModuleErrors, BadFileNumber) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineFile("relative", 1, 0, 0, 0); + h.AddLine(1, 1, 2, 0, 0); // bad file number + h.AddLine(2, 1, 2, 0, 0); // bad file number (no duplicate warning) + + EXPECT_EQ(0U, lines.size()); +} + +// We should treat files with bogus directory numbers as relative to +// the compilation unit. +TEST(ModuleErrors, BadDirectoryNumber) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineDir("directory1", 1); + h.DefineFile("baddirnumber1", 1, 2, 0, 0); // bad directory number + h.DefineFile("baddirnumber2", 2, 2, 0, 0); // bad dir number (no warning) + h.AddLine(1, 1, 1, 0, 0); + + ASSERT_EQ(1U, lines.size()); + EXPECT_STREQ("baddirnumber1", lines[0].file->name.c_str()); +} + +// We promise not to report empty lines. +TEST(ModuleErrors, EmptyLine) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineFile("filename1", 1, 0, 0, 0); + h.AddLine(1, 0, 1, 0, 0); + + ASSERT_EQ(0U, lines.size()); +} + +// We are supposed to clip lines that extend beyond the end of the +// address space. +TEST(ModuleErrors, BigLine) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineFile("filename1", 1, 0, 0, 0); + h.AddLine(0xffffffffffffffffULL, 2, 1, 0, 0); + + ASSERT_EQ(1U, lines.size()); + EXPECT_EQ(1U, lines[0].size); +} + +// The 'Omitted' tests verify that we correctly omit line information +// for code in sections that the linker has dropped. See "GNU +// toolchain omitted sections support" at the top of the +// DwarfLineToModule class. + +TEST(Omitted, DroppedThenGood) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineFile("filename1", 1, 0, 0, 0); + h.AddLine(0, 10, 1, 83816211, 0); // should be omitted + h.AddLine(20, 10, 1, 13059195, 0); // should be recorded + + ASSERT_EQ(1U, lines.size()); + EXPECT_EQ(13059195, lines[0].number); +} + +TEST(Omitted, GoodThenDropped) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineFile("filename1", 1, 0, 0, 0); + h.AddLine(0x9dd6a372, 10, 1, 41454594, 0); // should be recorded + h.AddLine(0, 10, 1, 44793413, 0); // should be omitted + + ASSERT_EQ(1U, lines.size()); + EXPECT_EQ(41454594, lines[0].number); +} + +TEST(Omitted, Mix1) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineFile("filename1", 1, 0, 0, 0); + h.AddLine(0x679ed72f, 10, 1, 58932642, 0); // should be recorded + h.AddLine(0xdfb5a72d, 10, 1, 39847385, 0); // should be recorded + h.AddLine(0, 0x78, 1, 23053829, 0); // should be omitted + h.AddLine(0x78, 0x6a, 1, 65317783, 0); // should be omitted + h.AddLine(0x78 + 0x6a, 0x2a, 1, 77601423, 0); // should be omitted + h.AddLine(0x9fe0cea5, 10, 1, 91806582, 0); // should be recorded + h.AddLine(0x7e41a109, 10, 1, 56169221, 0); // should be recorded + + ASSERT_EQ(4U, lines.size()); + EXPECT_EQ(58932642, lines[0].number); + EXPECT_EQ(39847385, lines[1].number); + EXPECT_EQ(91806582, lines[2].number); + EXPECT_EQ(56169221, lines[3].number); +} + +TEST(Omitted, Mix2) { + Module m("name", "os", "architecture", "id"); + vector lines; + std::map cu_files; + DwarfLineToModule h(&m, "/", &lines, &cu_files); + + h.DefineFile("filename1", 1, 0, 0, 0); + h.AddLine(0, 0xf2, 1, 58802211, 0); // should be omitted + h.AddLine(0xf2, 0xb9, 1, 78958222, 0); // should be omitted + h.AddLine(0xf2 + 0xb9, 0xf7, 1, 64861892, 0); // should be omitted + h.AddLine(0x4e4d271e, 9, 1, 67355743, 0); // should be recorded + h.AddLine(0xdfb5a72d, 30, 1, 23365776, 0); // should be recorded + h.AddLine(0, 0x64, 1, 76196762, 0); // should be omitted + h.AddLine(0x64, 0x33, 1, 71066611, 0); // should be omitted + h.AddLine(0x64 + 0x33, 0xe3, 1, 61749337, 0); // should be omitted + + ASSERT_EQ(2U, lines.size()); + EXPECT_EQ(67355743, lines[0].number); + EXPECT_EQ(23365776, lines[1].number); +} diff --git a/src/common/dwarf_range_list_handler.cc b/src/common/dwarf_range_list_handler.cc new file mode 100644 index 0000000..c40a5c3 --- /dev/null +++ b/src/common/dwarf_range_list_handler.cc @@ -0,0 +1,59 @@ +// Copyright 2018 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Gabriele Svelto +// + +// dwarf_range_list_handler.cc: Implementation of DwarfRangeListHandler class. +// See dwarf_range_list_handler.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "common/dwarf_range_list_handler.h" + +namespace google_breakpad { + +void DwarfRangeListHandler::AddRange(uint64_t begin, uint64_t end) { + Module::Range r(begin, end - begin); + + ranges_->push_back(r); +} + +void DwarfRangeListHandler::Finish() { + std::sort(ranges_->begin(), ranges_->end(), + [](const Module::Range& a, const Module::Range& b) { + return a.address < b.address; + } + ); +} + +} // namespace google_breakpad diff --git a/src/common/dwarf_range_list_handler.h b/src/common/dwarf_range_list_handler.h new file mode 100644 index 0000000..cb1b8b1 --- /dev/null +++ b/src/common/dwarf_range_list_handler.h @@ -0,0 +1,71 @@ +// -*- mode: c++ -*- + +// Copyright 2018 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Gabriele Svelto +// + +// The DwarfRangeListHandler class accepts rangelist data from a DWARF parser +// and adds it to a google_breakpad::Function or other objects supporting +// ranges. + +#ifndef COMMON_LINUX_DWARF_RANGE_LIST_HANDLER_H +#define COMMON_LINUX_DWARF_RANGE_LIST_HANDLER_H + +#include + +#include "common/module.h" +#include "common/dwarf/dwarf2reader.h" + +namespace google_breakpad { + +// A class for producing a vector of google_breakpad::Module::Range +// instances from a parsed DWARF range list. + +class DwarfRangeListHandler: public RangeListHandler { + public: + DwarfRangeListHandler(vector* ranges) + : ranges_(ranges) { } + + ~DwarfRangeListHandler() { } + + // Add a range to the list + void AddRange(uint64_t begin, uint64_t end); + + // Sort the ranges so that they are in ascending order of starting address + void Finish(); + + private: + // The list of ranges to be populated + vector* ranges_; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_DWARF_RANGE_LIST_HANDLER_H diff --git a/src/common/language.cc b/src/common/language.cc new file mode 100644 index 0000000..61693a8 --- /dev/null +++ b/src/common/language.cc @@ -0,0 +1,223 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// language.cc: Subclasses and singletons for google_breakpad::Language. +// See language.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/language.h" + +#include +#include + +#if !defined(__ANDROID__) +#include +#endif + +#if defined(HAVE_RUSTC_DEMANGLE) +#include +#endif + +#include + +namespace { + +string MakeQualifiedNameWithSeparator(const string& parent_name, + const char* separator, + const string& name) { + if (parent_name.empty()) { + return name; + } + + return parent_name + separator + name; +} + +} // namespace + +namespace google_breakpad { + +// C++ language-specific operations. +class CPPLanguage: public Language { + public: + CPPLanguage() {} + + string MakeQualifiedName(const string& parent_name, + const string& name) const { + return MakeQualifiedNameWithSeparator(parent_name, "::", name); + } + + virtual DemangleResult DemangleName(const string& mangled, + string* demangled) const { +#if defined(__ANDROID__) + // Android NDK doesn't provide abi::__cxa_demangle. + demangled->clear(); + return kDontDemangle; +#else + // Attempting to demangle non-C++ symbols with the C++ demangler would print + // warnings and fail, so return kDontDemangle for these. + if (!IsMangledName(mangled)) { + demangled->clear(); + return kDontDemangle; + } + + int status; + char* demangled_c = + abi::__cxa_demangle(mangled.c_str(), NULL, NULL, &status); + + DemangleResult result; + if (status == 0) { + result = kDemangleSuccess; + demangled->assign(demangled_c); + } else { + result = kDemangleFailure; + demangled->clear(); + } + + if (demangled_c) { + free(reinterpret_cast(demangled_c)); + } + + return result; +#endif + } + + private: + static bool IsMangledName(const string& name) { + // NOTE: For proper cross-compilation support, this should depend on target + // binary's platform, not current build platform. +#if defined(__APPLE__) + // Mac C++ symbols can have up to 4 underscores, followed by a "Z". + // Non-C++ symbols are not coded that way, but may have leading underscores. + size_t i = name.find_first_not_of('_'); + return i > 0 && i != string::npos && i <= 4 && name[i] == 'Z'; +#else + // Linux C++ symbols always start with "_Z". + return name.size() > 2 && name[0] == '_' && name[1] == 'Z'; +#endif + } +}; + +CPPLanguage CPPLanguageSingleton; + +// Java language-specific operations. +class JavaLanguage: public Language { + public: + JavaLanguage() {} + + string MakeQualifiedName(const string& parent_name, + const string& name) const { + return MakeQualifiedNameWithSeparator(parent_name, ".", name); + } +}; + +JavaLanguage JavaLanguageSingleton; + +// Swift language-specific operations. +class SwiftLanguage: public Language { + public: + SwiftLanguage() {} + + string MakeQualifiedName(const string& parent_name, + const string& name) const { + return MakeQualifiedNameWithSeparator(parent_name, ".", name); + } + + virtual DemangleResult DemangleName(const string& mangled, + string* demangled) const { + // There is no programmatic interface to a Swift demangler. Pass through the + // mangled form because it encodes more information than the qualified name + // that would have been built by MakeQualifiedName(). The output can be + // post-processed by xcrun swift-demangle to transform mangled Swift names + // into something more readable. + demangled->assign(mangled); + return kDemangleSuccess; + } +}; + +SwiftLanguage SwiftLanguageSingleton; + +// Rust language-specific operations. +class RustLanguage: public Language { + public: + RustLanguage() {} + + string MakeQualifiedName(const string& parent_name, + const string& name) const { + return MakeQualifiedNameWithSeparator(parent_name, ".", name); + } + + virtual DemangleResult DemangleName(const string& mangled, + string* demangled) const { + // Rust names use GCC C++ name mangling, but demangling them with + // abi_demangle doesn't produce stellar results due to them having + // another layer of encoding. + // If callers provide rustc-demangle, use that. +#if defined(HAVE_RUSTC_DEMANGLE) + std::array rustc_demangled; + if (rustc_demangle(mangled.c_str(), rustc_demangled.data(), + rustc_demangled.size()) == 0) { + return kDemangleFailure; + } + demangled->assign(rustc_demangled.data()); +#else + // Otherwise, pass through the mangled name so callers can demangle + // after the fact. + demangled->assign(mangled); +#endif + return kDemangleSuccess; + } +}; + +RustLanguage RustLanguageSingleton; + +// Assembler language-specific operations. +class AssemblerLanguage: public Language { + public: + AssemblerLanguage() {} + + bool HasFunctions() const { return false; } + string MakeQualifiedName(const string& parent_name, + const string& name) const { + return name; + } +}; + +AssemblerLanguage AssemblerLanguageSingleton; + +const Language * const Language::CPlusPlus = &CPPLanguageSingleton; +const Language * const Language::Java = &JavaLanguageSingleton; +const Language * const Language::Swift = &SwiftLanguageSingleton; +const Language * const Language::Rust = &RustLanguageSingleton; +const Language * const Language::Assembler = &AssemblerLanguageSingleton; + +} // namespace google_breakpad diff --git a/src/common/language.h b/src/common/language.h new file mode 100644 index 0000000..9ce8f1a --- /dev/null +++ b/src/common/language.h @@ -0,0 +1,104 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// language.h: Define google_breakpad::Language. Instances of +// subclasses of this class provide language-appropriate operations +// for the Breakpad symbol dumper. + +#ifndef COMMON_LINUX_LANGUAGE_H__ +#define COMMON_LINUX_LANGUAGE_H__ + +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +// An abstract base class for language-specific operations. We choose +// an instance of a subclass of this when we find the CU's language. +// This class's definitions are appropriate for CUs with no specified +// language. +class Language { + public: + // A base class destructor should be either public and virtual, + // or protected and nonvirtual. + virtual ~Language() {} + + // Return true if this language has functions to which we can assign + // line numbers. (Debugging info for assembly language, for example, + // can have source location information, but does not have functions + // recorded using DW_TAG_subprogram DIEs.) + virtual bool HasFunctions() const { return true; } + + // Construct a fully-qualified, language-appropriate form of NAME, + // given that PARENT_NAME is the name of the construct enclosing + // NAME. If PARENT_NAME is the empty string, then NAME is a + // top-level name. + // + // This API sort of assumes that a fully-qualified name is always + // some simple textual composition of the unqualified name and its + // parent's name, and that we don't need to know anything else about + // the parent or the child (say, their DIEs' tags) to do the job. + // This is true for the languages we support at the moment, and + // keeps things concrete. Perhaps a more refined operation would + // take into account the parent and child DIE types, allow languages + // to use their own data type for complex parent names, etc. But if + // C++ doesn't need all that, who would? + virtual string MakeQualifiedName (const string& parent_name, + const string& name) const = 0; + + enum DemangleResult { + // Demangling was not performed because it’s not appropriate to attempt. + kDontDemangle = -1, + + kDemangleSuccess, + kDemangleFailure, + }; + + // Wraps abi::__cxa_demangle() or similar for languages where appropriate. + virtual DemangleResult DemangleName(const string& mangled, + string* demangled) const { + demangled->clear(); + return kDontDemangle; + } + + // Instances for specific languages. + static const Language * const CPlusPlus, + * const Java, + * const Swift, + * const Rust, + * const Assembler; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_LANGUAGE_H__ diff --git a/src/common/linux/breakpad_getcontext.S b/src/common/linux/breakpad_getcontext.S new file mode 100644 index 0000000..286047b --- /dev/null +++ b/src/common/linux/breakpad_getcontext.S @@ -0,0 +1,645 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A minimalistic implementation of getcontext() to be used by +// Google Breakpad when getcontext() is not available in libc. + +#include "common/linux/ucontext_constants.h" + +/* int getcontext (ucontext_t* ucp) */ + +#if defined(__arm__) + + .text + .global breakpad_getcontext + .hidden breakpad_getcontext + .type breakpad_getcontext, #function + .align 0 + .fnstart +breakpad_getcontext: + + /* First, save r4-r11 */ + add r1, r0, #(MCONTEXT_GREGS_OFFSET + 4*4) + stm r1, {r4-r11} + + /* r12 is a scratch register, don't save it */ + + /* Save sp and lr explicitly. */ + /* - sp can't be stored with stmia in Thumb-2 */ + /* - STM instructions that store sp and pc are deprecated in ARM */ + str sp, [r0, #(MCONTEXT_GREGS_OFFSET + 13*4)] + str lr, [r0, #(MCONTEXT_GREGS_OFFSET + 14*4)] + + /* Save the caller's address in 'pc' */ + str lr, [r0, #(MCONTEXT_GREGS_OFFSET + 15*4)] + + /* Save ucontext_t* pointer across next call */ + mov r4, r0 + + /* Call sigprocmask(SIG_BLOCK, NULL, &(ucontext->uc_sigmask)) */ + mov r0, #0 /* SIG_BLOCK */ + mov r1, #0 /* NULL */ + add r2, r4, #UCONTEXT_SIGMASK_OFFSET + bl sigprocmask(PLT) + + /* Intentionally do not save the FPU state here. This is because on + * Linux/ARM, one should instead use ptrace(PTRACE_GETFPREGS) or + * ptrace(PTRACE_GETVFPREGS) to get it. + * + * Note that a real implementation of getcontext() would need to save + * this here to allow setcontext()/swapcontext() to work correctly. + */ + + /* Restore the values of r4 and lr */ + mov r0, r4 + ldr lr, [r0, #(MCONTEXT_GREGS_OFFSET + 14*4)] + ldr r4, [r0, #(MCONTEXT_GREGS_OFFSET + 4*4)] + + /* Return 0 */ + mov r0, #0 + bx lr + + .fnend + .size breakpad_getcontext, . - breakpad_getcontext + +#elif defined(__aarch64__) + +#if defined(__ARM_FEATURE_PAC_DEFAULT) && __ARM_FEATURE_PAC_DEFAULT + // ENABLE_PAUTH must be defined to 1 since this value will be used in + // bitwise-shift later! + #define ENABLE_PAUTH 1 + + #if ((__ARM_FEATURE_PAC_DEFAULT&((1<<0)|(1<<1)))==0) + #error Pointer authentication defines no valid key! + #endif +#else + #define ENABLE_PAUTH 0 +#endif + +#if defined(__ARM_FEATURE_BTI_DEFAULT) && (__ARM_FEATURE_BTI_DEFAULT==1) + // ENABLE_BTI must be defined to 1 since this value will be used in + // bitwise-shift later! + #define ENABLE_BTI 1 +#else + #define ENABLE_BTI 0 +#endif + + +// Although Pointer Authentication and Branch Target Instructions are technically +// seperate features they work together, i.e. the paciasp and pacibsp instructions +// serve as BTI landing pads. +// Therefore PA-instructions are enabled when PA _or_ BTI is enabled! +#if ENABLE_PAUTH || ENABLE_BTI + // See section "Pointer Authentication" of + // https://developer.arm.com/documentation/101028/0012/5--Feature-test-macros + // for details how to interpret __ARM_FEATURE_PAC_DEFAULT + #if (__ARM_FEATURE_PAC_DEFAULT & (1<<0)) + #define PAUTH_SIGN_SP paciasp + #define PAUTH_AUTH_SP autiasp + #else + #define PAUTH_SIGN_SP pacibsp + #define PAUTH_AUTH_SP autibsp + #endif +#else + #define PAUTH_SIGN_SP + #define PAUTH_AUTH_SP +#endif + +#define _NSIG 64 +#define __NR_rt_sigprocmask 135 + + .text + .global breakpad_getcontext + .hidden breakpad_getcontext + .type breakpad_getcontext, #function + .align 4 + .cfi_startproc +breakpad_getcontext: + + PAUTH_SIGN_SP + + /* The saved context will return to the getcontext() call point + with a return value of 0 */ + str xzr, [x0, MCONTEXT_GREGS_OFFSET + 0 * REGISTER_SIZE] + + stp x18, x19, [x0, MCONTEXT_GREGS_OFFSET + 18 * REGISTER_SIZE] + stp x20, x21, [x0, MCONTEXT_GREGS_OFFSET + 20 * REGISTER_SIZE] + stp x22, x23, [x0, MCONTEXT_GREGS_OFFSET + 22 * REGISTER_SIZE] + stp x24, x25, [x0, MCONTEXT_GREGS_OFFSET + 24 * REGISTER_SIZE] + stp x26, x27, [x0, MCONTEXT_GREGS_OFFSET + 26 * REGISTER_SIZE] + stp x28, x29, [x0, MCONTEXT_GREGS_OFFSET + 28 * REGISTER_SIZE] + str x30, [x0, MCONTEXT_GREGS_OFFSET + 30 * REGISTER_SIZE] + + /* Place LR into the saved PC, this will ensure that when + switching to this saved context with setcontext() control + will pass back to the caller of getcontext(), we have + already arranged to return the appropriate return value in x0 + above. */ + str x30, [x0, MCONTEXT_PC_OFFSET] + + /* Save the current SP */ + mov x2, sp + str x2, [x0, MCONTEXT_SP_OFFSET] + + /* Initialize the pstate. */ + str xzr, [x0, MCONTEXT_PSTATE_OFFSET] + + /* Figure out where to place the first context extension + block. */ + add x2, x0, #MCONTEXT_EXTENSION_OFFSET + + /* Write the context extension fpsimd header. */ + mov w3, #(FPSIMD_MAGIC & 0xffff) + movk w3, #(FPSIMD_MAGIC >> 16), lsl #16 + str w3, [x2, #FPSIMD_CONTEXT_MAGIC_OFFSET] + mov w3, #FPSIMD_CONTEXT_SIZE + str w3, [x2, #FPSIMD_CONTEXT_SIZE_OFFSET] + + /* Fill in the FP SIMD context. */ + add x3, x2, #(FPSIMD_CONTEXT_VREGS_OFFSET + 8 * SIMD_REGISTER_SIZE) + stp d8, d9, [x3], #(2 * SIMD_REGISTER_SIZE) + stp d10, d11, [x3], #(2 * SIMD_REGISTER_SIZE) + stp d12, d13, [x3], #(2 * SIMD_REGISTER_SIZE) + stp d14, d15, [x3], #(2 * SIMD_REGISTER_SIZE) + + add x3, x2, FPSIMD_CONTEXT_FPSR_OFFSET + + mrs x4, fpsr + str w4, [x3] + + mrs x4, fpcr + str w4, [x3, FPSIMD_CONTEXT_FPCR_OFFSET - FPSIMD_CONTEXT_FPSR_OFFSET] + + /* Write the termination context extension header. */ + add x2, x2, #FPSIMD_CONTEXT_SIZE + + str xzr, [x2, #FPSIMD_CONTEXT_MAGIC_OFFSET] + str xzr, [x2, #FPSIMD_CONTEXT_SIZE_OFFSET] + + /* Grab the signal mask */ + /* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */ + add x2, x0, #UCONTEXT_SIGMASK_OFFSET + mov x0, #0 /* SIG_BLOCK */ + mov x1, #0 /* NULL */ + mov x3, #(_NSIG / 8) + mov x8, #__NR_rt_sigprocmask + svc 0 + + /* Return x0 for success */ + mov x0, 0 + + PAUTH_AUTH_SP + + ret + + .cfi_endproc + .size breakpad_getcontext, . - breakpad_getcontext + +#elif defined(__i386__) + + .text + .global breakpad_getcontext + .hidden breakpad_getcontext + .align 4 + .type breakpad_getcontext, @function + +breakpad_getcontext: + + movl 4(%esp), %eax /* eax = uc */ + + /* Save register values */ + movl %ecx, MCONTEXT_ECX_OFFSET(%eax) + movl %edx, MCONTEXT_EDX_OFFSET(%eax) + movl %ebx, MCONTEXT_EBX_OFFSET(%eax) + movl %edi, MCONTEXT_EDI_OFFSET(%eax) + movl %esi, MCONTEXT_ESI_OFFSET(%eax) + movl %ebp, MCONTEXT_EBP_OFFSET(%eax) + + movl (%esp), %edx /* return address */ + lea 4(%esp), %ecx /* exclude return address from stack */ + mov %edx, MCONTEXT_EIP_OFFSET(%eax) + mov %ecx, MCONTEXT_ESP_OFFSET(%eax) + + xorl %ecx, %ecx + movw %fs, %cx + mov %ecx, MCONTEXT_FS_OFFSET(%eax) + + movl $0, MCONTEXT_EAX_OFFSET(%eax) + + /* Save floating point state to fpregstate, then update + * the fpregs pointer to point to it */ + leal UCONTEXT_FPREGS_MEM_OFFSET(%eax), %ecx + fnstenv (%ecx) + fldenv (%ecx) + mov %ecx, UCONTEXT_FPREGS_OFFSET(%eax) + + /* Save signal mask: sigprocmask(SIGBLOCK, NULL, &uc->uc_sigmask) */ + leal UCONTEXT_SIGMASK_OFFSET(%eax), %edx + xorl %ecx, %ecx + push %edx /* &uc->uc_sigmask */ + push %ecx /* NULL */ + push %ecx /* SIGBLOCK == 0 on i386 */ + call sigprocmask@PLT + addl $12, %esp + + movl $0, %eax + ret + + .size breakpad_getcontext, . - breakpad_getcontext + +#elif defined(__mips__) + +// This implementation is inspired by implementation of getcontext in glibc. +#include +#include +#if _MIPS_SIM == _ABIO32 +#include +#endif + +// from asm-mips/asm.h +#if _MIPS_SIM == _ABIO32 +#define ALSZ 7 +#define ALMASK ~7 +#define SZREG 4 +#else // _MIPS_SIM != _ABIO32 +#define ALSZ 15 +#define ALMASK ~15 +#define SZREG 8 +#endif + +#include // for __NR_rt_sigprocmask + +#define _NSIG8 128 / 8 +#define SIG_BLOCK 1 + + + .text +LOCALS_NUM = 1 // save gp on stack +FRAME_SIZE = ((LOCALS_NUM * SZREG) + ALSZ) & ALMASK + +GP_FRAME_OFFSET = FRAME_SIZE - (1 * SZREG) +MCONTEXT_REG_SIZE = 8 + +#if _MIPS_SIM == _ABIO32 + +NESTED (breakpad_getcontext, FRAME_SIZE, ra) + .mask 0x00000000, 0 + .fmask 0x00000000, 0 + + .set noreorder + .cpload t9 + .set reorder + + move a2, sp +#define _SP a2 + + addiu sp, -FRAME_SIZE + .cprestore GP_FRAME_OFFSET + + sw s0, (16 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw s1, (17 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw s2, (18 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw s3, (19 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw s4, (20 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw s5, (21 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw s6, (22 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw s7, (23 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw _SP, (29 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw fp, (30 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw ra, (31 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sw ra, MCONTEXT_PC_OFFSET(a0) + +#ifdef __mips_hard_float + s.d fs0, (20 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d fs1, (22 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d fs2, (24 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d fs3, (26 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d fs4, (28 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d fs5, (30 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + + cfc1 v1, fcr31 + sw v1, MCONTEXT_FPC_CSR(a0) +#endif // __mips_hard_float + + /* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */ + li a3, _NSIG8 + addu a2, a0, UCONTEXT_SIGMASK_OFFSET + move a1, zero + li a0, SIG_BLOCK + li v0, __NR_rt_sigprocmask + syscall + + addiu sp, FRAME_SIZE + jr ra + +END (breakpad_getcontext) +#else + +#ifndef NESTED +/* + * NESTED - declare nested routine entry point + */ +#define NESTED(symbol, framesize, rpc) \ + .globl symbol; \ + .align 2; \ + .type symbol,@function; \ + .ent symbol,0; \ +symbol: .frame sp, framesize, rpc; +#endif + +/* + * END - mark end of function + */ +#ifndef END +# define END(function) \ + .end function; \ + .size function,.-function +#endif + +/* int getcontext (ucontext_t* ucp) */ + +NESTED (breakpad_getcontext, FRAME_SIZE, ra) + .mask 0x10000000, 0 + .fmask 0x00000000, 0 + + move a2, sp +#define _SP a2 + move a3, gp +#define _GP a3 + + daddiu sp, -FRAME_SIZE + .cpsetup $25, GP_FRAME_OFFSET, breakpad_getcontext + + /* Store a magic flag. */ + li v1, 1 + sd v1, (0 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) /* zero */ + + sd s0, (16 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd s1, (17 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd s2, (18 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd s3, (19 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd s4, (20 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd s5, (21 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd s6, (22 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd s7, (23 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd _GP, (28 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd _SP, (29 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd s8, (30 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd ra, (31 * MCONTEXT_REG_SIZE + MCONTEXT_GREGS_OFFSET)(a0) + sd ra, MCONTEXT_PC_OFFSET(a0) + +#ifdef __mips_hard_float + s.d $f24, (24 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d $f25, (25 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d $f26, (26 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d $f27, (27 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d $f28, (28 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d $f29, (29 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d $f30, (30 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + s.d $f31, (31 * MCONTEXT_REG_SIZE + MCONTEXT_FPREGS_OFFSET)(a0) + + cfc1 v1, $31 + sw v1, MCONTEXT_FPC_CSR(a0) +#endif /* __mips_hard_float */ + +/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */ + li a3, _NSIG8 + daddu a2, a0, UCONTEXT_SIGMASK_OFFSET + move a1, zero + li a0, SIG_BLOCK + + li v0, __NR_rt_sigprocmask + syscall + + .cpreturn + daddiu sp, FRAME_SIZE + move v0, zero + jr ra + +END (breakpad_getcontext) +#endif // _MIPS_SIM == _ABIO32 + +#elif defined(__x86_64__) +/* The x64 implementation of breakpad_getcontext was derived in part + from the implementation of libunwind which requires the following + notice. */ +/* libunwind - a platform-independent unwind library + Copyright (C) 2008 Google, Inc + Contributed by Paul Pluzhnikov + Copyright (C) 2010 Konstantin Belousov + +This file is part of libunwind. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + + .text + .global breakpad_getcontext + .hidden breakpad_getcontext + .align 4 + .type breakpad_getcontext, @function + +breakpad_getcontext: + .cfi_startproc + + /* Callee saved: RBX, RBP, R12-R15 */ + movq %r12, MCONTEXT_GREGS_R12(%rdi) + movq %r13, MCONTEXT_GREGS_R13(%rdi) + movq %r14, MCONTEXT_GREGS_R14(%rdi) + movq %r15, MCONTEXT_GREGS_R15(%rdi) + movq %rbp, MCONTEXT_GREGS_RBP(%rdi) + movq %rbx, MCONTEXT_GREGS_RBX(%rdi) + + /* Save argument registers (not strictly needed, but setcontext + restores them, so don't restore garbage). */ + movq %r8, MCONTEXT_GREGS_R8(%rdi) + movq %r9, MCONTEXT_GREGS_R9(%rdi) + movq %rdi, MCONTEXT_GREGS_RDI(%rdi) + movq %rsi, MCONTEXT_GREGS_RSI(%rdi) + movq %rdx, MCONTEXT_GREGS_RDX(%rdi) + movq %rax, MCONTEXT_GREGS_RAX(%rdi) + movq %rcx, MCONTEXT_GREGS_RCX(%rdi) + + /* Save fp state (not needed, except for setcontext not + restoring garbage). */ + leaq MCONTEXT_FPREGS_MEM(%rdi),%r8 + movq %r8, MCONTEXT_FPREGS_PTR(%rdi) + fnstenv (%r8) + stmxcsr FPREGS_OFFSET_MXCSR(%r8) + + leaq 8(%rsp), %rax /* exclude this call. */ + movq %rax, MCONTEXT_GREGS_RSP(%rdi) + + movq 0(%rsp), %rax + movq %rax, MCONTEXT_GREGS_RIP(%rdi) + + /* Save signal mask: sigprocmask(SIGBLOCK, NULL, &uc->uc_sigmask) */ + leaq UCONTEXT_SIGMASK_OFFSET(%rdi), %rdx // arg3 + xorq %rsi, %rsi // arg2 NULL + xorq %rdi, %rdi // arg1 SIGBLOCK == 0 + call sigprocmask@PLT + + /* Always return 0 for success, even if sigprocmask failed. */ + xorl %eax, %eax + ret + .cfi_endproc + .size breakpad_getcontext, . - breakpad_getcontext + +#elif defined(__riscv) + +# define SIG_BLOCK 0 +# define _NSIG8 8 +# define __NR_rt_sigprocmask 135 + + .text + .globl breakpad_getcontext + .type breakpad_getcontext, @function + .align 0 + .cfi_startproc +breakpad_getcontext: + REG_S ra, MCONTEXT_GREGS_PC(a0) + REG_S ra, MCONTEXT_GREGS_RA(a0) + REG_S sp, MCONTEXT_GREGS_SP(a0) + REG_S gp, MCONTEXT_GREGS_SP(a0) + REG_S tp, MCONTEXT_GREGS_TP(a0) + REG_S t0, MCONTEXT_GREGS_T0(a0) + REG_S t1, MCONTEXT_GREGS_T1(a0) + REG_S t2, MCONTEXT_GREGS_T2(a0) + REG_S s0, MCONTEXT_GREGS_S0(a0) + REG_S s1, MCONTEXT_GREGS_S1(a0) + REG_S a0, MCONTEXT_GREGS_A0(a0) + REG_S a1, MCONTEXT_GREGS_A1(a0) + REG_S a2, MCONTEXT_GREGS_A2(a0) + REG_S a3, MCONTEXT_GREGS_A3(a0) + REG_S a4, MCONTEXT_GREGS_A4(a0) + REG_S a5, MCONTEXT_GREGS_A5(a0) + REG_S a6, MCONTEXT_GREGS_A6(a0) + REG_S a7, MCONTEXT_GREGS_A7(a0) + REG_S s2, MCONTEXT_GREGS_S2(a0) + REG_S s3, MCONTEXT_GREGS_S3(a0) + REG_S s4, MCONTEXT_GREGS_S4(a0) + REG_S s5, MCONTEXT_GREGS_S5(a0) + REG_S s6, MCONTEXT_GREGS_S6(a0) + REG_S s7, MCONTEXT_GREGS_S7(a0) + REG_S s8, MCONTEXT_GREGS_S8(a0) + REG_S s9, MCONTEXT_GREGS_S9(a0) + REG_S s10, MCONTEXT_GREGS_S10(a0) + REG_S s11, MCONTEXT_GREGS_S11(a0) + REG_S t3, MCONTEXT_GREGS_T3(a0) + REG_S t4, MCONTEXT_GREGS_T4(a0) + REG_S t5, MCONTEXT_GREGS_T5(a0) + REG_S t6 , MCONTEXT_GREGS_T6(a0) +# ifndef __riscv_float_abi_soft + frsr a1 + + FREG_S ft0, MCONTEXT_FPREGS_FT0(a0) + FREG_S ft1, MCONTEXT_FPREGS_FT1(a0) + FREG_S ft2, MCONTEXT_FPREGS_FT2(a0) + FREG_S ft3, MCONTEXT_FPREGS_FT3(a0) + FREG_S ft4, MCONTEXT_FPREGS_FT4(a0) + FREG_S ft5, MCONTEXT_FPREGS_FT5(a0) + FREG_S ft6, MCONTEXT_FPREGS_FT6(a0) + FREG_S ft7, MCONTEXT_FPREGS_FT7(a0) + FREG_S fs0, MCONTEXT_FPREGS_FS0(a0) + FREG_S fs1, MCONTEXT_FPREGS_FS1(a0) + FREG_S fa0, MCONTEXT_FPREGS_FA0(a0) + FREG_S fa1, MCONTEXT_FPREGS_FA1(a0) + FREG_S fa2, MCONTEXT_FPREGS_FA2(a0) + FREG_S fa3, MCONTEXT_FPREGS_FA3(a0) + FREG_S fa4, MCONTEXT_FPREGS_FA4(a0) + FREG_S fa5, MCONTEXT_FPREGS_FA5(a0) + FREG_S fa6, MCONTEXT_FPREGS_FA6(a0) + FREG_S fa7, MCONTEXT_FPREGS_FA7(a0) + FREG_S fs2, MCONTEXT_FPREGS_FS2(a0) + FREG_S fs3, MCONTEXT_FPREGS_FS3(a0) + FREG_S fs4, MCONTEXT_FPREGS_FS4(a0) + FREG_S fs5, MCONTEXT_FPREGS_FS5(a0) + FREG_S fs6, MCONTEXT_FPREGS_FS6(a0) + FREG_S fs7, MCONTEXT_FPREGS_FS7(a0) + FREG_S fs8, MCONTEXT_FPREGS_FS8(a0) + FREG_S fs9, MCONTEXT_FPREGS_FS9(a0) + FREG_S fs10, MCONTEXT_FPREGS_FS10(a0) + FREG_S fs11, MCONTEXT_FPREGS_FS11(a0) + FREG_S ft8, MCONTEXT_FPREGS_FT8(a0) + FREG_S ft9, MCONTEXT_FPREGS_FT9(a0) + FREG_S ft10, MCONTEXT_FPREGS_FT10(a0) + FREG_S ft11, MCONTEXT_FPREGS_FT11(a0) + + sw a1, MCONTEXT_FPC_CSR(a0) +# endif // __riscv_float_abi_soft + mv a1, zero + add a2, a0, UCONTEXT_SIGMASK_OFFSET + li a3, _NSIG8 + mv a0, zero + li a7, __NR_rt_sigprocmask + ecall + mv a0, zero + ret + + .cfi_endproc + .size breakpad_getcontext, . - breakpad_getcontext + +#else +# error "This file has not been ported for your CPU!" +#endif + +#if defined(__aarch64__) +// ENABLE_PAUTH and ENABLE_BTI would be enabled at the definition +// of AArch64 specific breakpad_getcontext function +#if ENABLE_PAUTH || ENABLE_BTI +// for further information on the .note.gnu.property section see +// https://github.com/ARM-software/abi-aa/blob/main/aaelf64/aaelf64.rst#program-property +.pushsection .note.gnu.property, "a"; + .balign 8 + .long 4 + .long 0x10 + .long 0x5 + .asciz "GNU" + .long 0xc0000000 /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */ + .long 4 + .long ((ENABLE_PAUTH)<<1) | ((ENABLE_BTI)<<0) /* PAuth and BTI */ + .long 0 +.popsection +#endif +#endif diff --git a/src/common/linux/breakpad_getcontext.h b/src/common/linux/breakpad_getcontext.h new file mode 100644 index 0000000..d64784d --- /dev/null +++ b/src/common/linux/breakpad_getcontext.h @@ -0,0 +1,51 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_COMMON_LINUX_INCLUDE_UCONTEXT_H +#define GOOGLE_BREAKPAD_COMMON_LINUX_INCLUDE_UCONTEXT_H + +#ifndef HAVE_GETCONTEXT + +#include + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Provided by src/common/linux/breakpad_getcontext.S +int breakpad_getcontext(ucontext_t* ucp); + +#define getcontext(x) breakpad_getcontext(x) + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // HAVE_GETCONTEXT + +#endif // GOOGLE_BREAKPAD_COMMON_LINUX_INCLUDE_UCONTEXT_H diff --git a/src/common/linux/breakpad_getcontext_unittest.cc b/src/common/linux/breakpad_getcontext_unittest.cc new file mode 100644 index 0000000..5b340eb --- /dev/null +++ b/src/common/linux/breakpad_getcontext_unittest.cc @@ -0,0 +1,216 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// asm/sigcontext.h can't be included with signal.h on glibc or +// musl, so only compare _libc_fpstate and _fpstate on Android. +#if defined(__ANDROID__) && defined(__x86_64__) +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#endif + +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "common/linux/ucontext_constants.h" + +template +struct CompileAssertEquals { + // a compilation error here indicates left and right are not equal. + char left_too_large[right - left]; + // a compilation error here indicates left and right are not equal. + char right_too_large[left - right]; +}; + +#define COMPILE_ASSERT_EQ(left, right, tag) \ + CompileAssertEquals tag; + +TEST(AndroidUContext, GRegsOffset) { +#if defined(__arm__) + // There is no gregs[] array on ARM, so compare to the offset of + // first register fields, since they're stored in order. + ASSERT_EQ(static_cast(MCONTEXT_GREGS_OFFSET), + offsetof(ucontext_t,uc_mcontext.arm_r0)); +#elif defined(__aarch64__) + // There is no gregs[] array on ARM, so compare to the offset of + // first register fields, since they're stored in order. + ASSERT_EQ(static_cast(MCONTEXT_GREGS_OFFSET), + offsetof(ucontext_t,uc_mcontext.regs[0])); + ASSERT_EQ(static_cast(MCONTEXT_SP_OFFSET), + offsetof(ucontext_t,uc_mcontext.sp)); + ASSERT_EQ(static_cast(MCONTEXT_PC_OFFSET), + offsetof(ucontext_t,uc_mcontext.pc)); + ASSERT_EQ(static_cast(MCONTEXT_PSTATE_OFFSET), + offsetof(ucontext_t,uc_mcontext.pstate)); + ASSERT_EQ(static_cast(MCONTEXT_EXTENSION_OFFSET), + offsetof(ucontext_t,uc_mcontext.__reserved)); +#elif defined(__i386__) + ASSERT_EQ(static_cast(MCONTEXT_GREGS_OFFSET), + offsetof(ucontext_t,uc_mcontext.gregs)); +#define CHECK_REG(x) \ + ASSERT_EQ(static_cast(MCONTEXT_##x##_OFFSET), \ + offsetof(ucontext_t,uc_mcontext.gregs[REG_##x])) + CHECK_REG(GS); + CHECK_REG(FS); + CHECK_REG(ES); + CHECK_REG(DS); + CHECK_REG(EDI); + CHECK_REG(ESI); + CHECK_REG(EBP); + CHECK_REG(ESP); + CHECK_REG(EBX); + CHECK_REG(EDX); + CHECK_REG(ECX); + CHECK_REG(EAX); + CHECK_REG(TRAPNO); + CHECK_REG(ERR); + CHECK_REG(EIP); + CHECK_REG(CS); + CHECK_REG(EFL); + CHECK_REG(UESP); + CHECK_REG(SS); + + ASSERT_EQ(static_cast(UCONTEXT_FPREGS_OFFSET), + offsetof(ucontext_t,uc_mcontext.fpregs)); + + ASSERT_EQ(static_cast(UCONTEXT_FPREGS_MEM_OFFSET), + offsetof(ucontext_t,__fpregs_mem)); +#elif defined(__mips__) + ASSERT_EQ(static_cast(MCONTEXT_GREGS_OFFSET), + offsetof(ucontext_t,uc_mcontext.gregs)); + + // PC for mips is not part of gregs. + ASSERT_EQ(static_cast(MCONTEXT_PC_OFFSET), + offsetof(ucontext_t,uc_mcontext.pc)); + + ASSERT_EQ(static_cast(MCONTEXT_FPREGS_OFFSET), + offsetof(ucontext_t,uc_mcontext.fpregs)); + + ASSERT_EQ(static_cast(MCONTEXT_FPC_CSR), + offsetof(ucontext_t,uc_mcontext.fpc_csr)); +#elif defined(__riscv) + ASSERT_EQ(static_cast(MCONTEXT_GREGS_OFFSET), + offsetof(ucontext_t,uc_mcontext.__gregs[0])); + +#define CHECK_REG(x) \ + ASSERT_EQ(static_cast(MCONTEXT_##x##_OFFSET), \ + offsetof(ucontext_t,uc_mcontext.__gregs[REG_##x])) + CHECK_REG(PC) + CHECK_REG(RA) + CHECK_REG(SP) + CHECK_REG(S0) + CHECK_REG(S1) + CHECK_REG(S2) + + ASSERT_EQ(static_cast(MCONTEXT_FPREGS_OFFSET), + offsetof(ucontext_t,uc_mcontext.__fpregs)); + + ASSERT_EQ(static_cast(MCONTEXT_FPC_CSR), + offsetof(ucontext_t,uc_mcontext.__fpregs.__fcsr)); +#elif defined(__x86_64__) + + COMPILE_ASSERT_EQ(static_cast(MCONTEXT_GREGS_OFFSET), + offsetof(ucontext_t,uc_mcontext.gregs), + mcontext_gregs_offset); +#define CHECK_REG(x) \ + COMPILE_ASSERT_EQ(static_cast(MCONTEXT_GREGS_##x), \ + offsetof(ucontext_t,uc_mcontext.gregs[REG_##x]), reg_##x) + CHECK_REG(R8); + CHECK_REG(R9); + CHECK_REG(R10); + CHECK_REG(R11); + CHECK_REG(R12); + CHECK_REG(R13); + CHECK_REG(R14); + CHECK_REG(R15); + CHECK_REG(RDI); + CHECK_REG(RSI); + CHECK_REG(RBP); + CHECK_REG(RBX); + CHECK_REG(RDX); + CHECK_REG(RAX); + CHECK_REG(RCX); + CHECK_REG(RSP); + CHECK_REG(RIP); + + // sigcontext is an analog to mcontext_t. The layout should be the same. + COMPILE_ASSERT_EQ(offsetof(mcontext_t,fpregs), + offsetof(sigcontext,fpstate), sigcontext_fpstate); + +#if defined(__ANDROID__) + // Check that _fpstate from asm/sigcontext.h is essentially the same + // as _libc_fpstate. + COMPILE_ASSERT_EQ(sizeof(_libc_fpstate), sizeof(_fpstate), + sigcontext_fpstate_size); + COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,cwd),offsetof(_fpstate,cwd), + sigcontext_fpstate_cwd); + COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,swd),offsetof(_fpstate,swd), + sigcontext_fpstate_swd); + COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,ftw),offsetof(_fpstate,twd), + sigcontext_fpstate_twd); + COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,fop),offsetof(_fpstate,fop), + sigcontext_fpstate_fop); + COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,rip),offsetof(_fpstate,rip), + sigcontext_fpstate_rip); + COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,rdp),offsetof(_fpstate,rdp), + sigcontext_fpstate_rdp); + COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,mxcsr),offsetof(_fpstate,mxcsr), + sigcontext_fpstate_mxcsr); + COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,mxcr_mask), + offsetof(_fpstate,mxcsr_mask), + sigcontext_fpstate_mxcsr_mask); + COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,_st), offsetof(_fpstate,st_space), + sigcontext_fpstate_stspace); + COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,_xmm), offsetof(_fpstate,xmm_space), + sigcontext_fpstate_xmm_space); +#endif + + COMPILE_ASSERT_EQ(MCONTEXT_FPREGS_PTR, + offsetof(ucontext_t,uc_mcontext.fpregs), + mcontext_fpregs_ptr); + COMPILE_ASSERT_EQ(MCONTEXT_FPREGS_MEM, offsetof(ucontext_t,__fpregs_mem), + mcontext_fpregs_mem); + COMPILE_ASSERT_EQ(FPREGS_OFFSET_MXCSR, + offsetof(std::remove_pointer::type,mxcsr), + fpregs_offset_mxcsr); + COMPILE_ASSERT_EQ(UCONTEXT_SIGMASK_OFFSET, offsetof(ucontext_t, uc_sigmask), + ucontext_sigmask); +#else + ASSERT_EQ(static_cast(MCONTEXT_GREGS_OFFSET), + offsetof(ucontext_t,uc_mcontext.gregs)); +#endif +} + +TEST(AndroidUContext, SigmakOffset) { + ASSERT_EQ(static_cast(UCONTEXT_SIGMASK_OFFSET), + offsetof(ucontext_t,uc_sigmask)); +} diff --git a/src/common/linux/crc32.cc b/src/common/linux/crc32.cc new file mode 100644 index 0000000..cf386a2 --- /dev/null +++ b/src/common/linux/crc32.cc @@ -0,0 +1,73 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/crc32.h" + +namespace google_breakpad { + +// This implementation is based on the sample implementation in RFC 1952. + +// CRC32 polynomial, in reversed form. +// See RFC 1952, or http://en.wikipedia.org/wiki/Cyclic_redundancy_check +static const uint32_t kCrc32Polynomial = 0xEDB88320; +static uint32_t kCrc32Table[256] = { 0 }; + +#define arraysize(f) (sizeof(f) / sizeof(*f)) + +static void EnsureCrc32TableInited() { + if (kCrc32Table[arraysize(kCrc32Table) - 1]) + return; // already inited + for (uint32_t i = 0; i < arraysize(kCrc32Table); ++i) { + uint32_t c = i; + for (size_t j = 0; j < 8; ++j) { + if (c & 1) { + c = kCrc32Polynomial ^ (c >> 1); + } else { + c >>= 1; + } + } + kCrc32Table[i] = c; + } +} + +uint32_t UpdateCrc32(uint32_t start, const void* buf, size_t len) { + EnsureCrc32TableInited(); + + uint32_t c = start ^ 0xFFFFFFFF; + const uint8_t* u = static_cast(buf); + for (size_t i = 0; i < len; ++i) { + c = kCrc32Table[(c ^ u[i]) & 0xFF] ^ (c >> 8); + } + return c ^ 0xFFFFFFFF; +} + +} // namespace google_breakpad diff --git a/src/common/linux/crc32.h b/src/common/linux/crc32.h new file mode 100644 index 0000000..7df4699 --- /dev/null +++ b/src/common/linux/crc32.h @@ -0,0 +1,52 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_LINUX_CRC32_H_ +#define COMMON_LINUX_CRC32_H_ + +#include + +#include + +namespace google_breakpad { + +// Updates a CRC32 checksum with |len| bytes from |buf|. |initial| holds the +// checksum result from the previous update; for the first call, it should be 0. +uint32_t UpdateCrc32(uint32_t initial, const void* buf, size_t len); + +// Computes a CRC32 checksum using |len| bytes from |buf|. +inline uint32_t ComputeCrc32(const void* buf, size_t len) { + return UpdateCrc32(0, buf, len); +} +inline uint32_t ComputeCrc32(const std::string& str) { + return ComputeCrc32(str.c_str(), str.size()); +} + +} // namespace google_breakpad + +#endif // COMMON_LINUX_CRC32_H_ diff --git a/src/common/linux/dump_symbols.cc b/src/common/linux/dump_symbols.cc new file mode 100644 index 0000000..b693fc9 --- /dev/null +++ b/src/common/linux/dump_symbols.cc @@ -0,0 +1,1360 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Restructured in 2009 by: Jim Blandy + +// dump_symbols.cc: implement google_breakpad::WriteSymbolFile: +// Find all the debugging info in a file and dump it as a Breakpad symbol file. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/dump_symbols.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_LIBZSTD +#include +#endif + +#include +#include +#include +#include + +#include "common/dwarf/bytereader-inl.h" +#include "common/dwarf/dwarf2diehandler.h" +#include "common/dwarf_cfi_to_module.h" +#include "common/dwarf_cu_to_module.h" +#include "common/dwarf_line_to_module.h" +#include "common/dwarf_range_list_handler.h" +#include "common/linux/crc32.h" +#include "common/linux/eintr_wrapper.h" +#include "common/linux/elfutils.h" +#include "common/linux/elfutils-inl.h" +#include "common/linux/elf_symbols_to_module.h" +#include "common/linux/file_id.h" +#include "common/memory_allocator.h" +#include "common/module.h" +#include "common/path_helper.h" +#include "common/scoped_ptr.h" +#ifndef NO_STABS_SUPPORT +#include "common/stabs_reader.h" +#include "common/stabs_to_module.h" +#endif +#include "common/using_std_string.h" + +// This namespace contains helper functions. +namespace { + +using google_breakpad::DumpOptions; +using google_breakpad::DwarfCFIToModule; +using google_breakpad::DwarfCUToModule; +using google_breakpad::DwarfLineToModule; +using google_breakpad::DwarfRangeListHandler; +using google_breakpad::ElfClass; +using google_breakpad::ElfClass32; +using google_breakpad::ElfClass64; +using google_breakpad::elf::FileID; +using google_breakpad::FindElfSectionByName; +using google_breakpad::GetOffset; +using google_breakpad::IsValidElf; +using google_breakpad::elf::kDefaultBuildIdSize; +using google_breakpad::Module; +using google_breakpad::PageAllocator; +#ifndef NO_STABS_SUPPORT +using google_breakpad::StabsToModule; +#endif +using google_breakpad::scoped_ptr; +using google_breakpad::wasteful_vector; + +// Define AARCH64 ELF architecture if host machine does not include this define. +#ifndef EM_AARCH64 +#define EM_AARCH64 183 +#endif + +// Define ZStd compression if host machine does not include this define. +#ifndef ELFCOMPRESS_ZSTD +#define ELFCOMPRESS_ZSTD 2 +#endif + +// +// FDWrapper +// +// Wrapper class to make sure opened file is closed. +// +class FDWrapper { + public: + explicit FDWrapper(int fd) : + fd_(fd) {} + ~FDWrapper() { + if (fd_ != -1) + close(fd_); + } + int get() { + return fd_; + } + int release() { + int fd = fd_; + fd_ = -1; + return fd; + } + private: + int fd_; +}; + +// +// MmapWrapper +// +// Wrapper class to make sure mapped regions are unmapped. +// +class MmapWrapper { + public: + MmapWrapper() : is_set_(false) {} + ~MmapWrapper() { + if (is_set_ && base_ != NULL) { + assert(size_ > 0); + munmap(base_, size_); + } + } + void set(void* mapped_address, size_t mapped_size) { + is_set_ = true; + base_ = mapped_address; + size_ = mapped_size; + } + void release() { + assert(is_set_); + is_set_ = false; + base_ = NULL; + size_ = 0; + } + + private: + bool is_set_; + void* base_; + size_t size_; +}; + +// Find the preferred loading address of the binary. +template +typename ElfClass::Addr GetLoadingAddress( + const typename ElfClass::Phdr* program_headers, + int nheader) { + typedef typename ElfClass::Phdr Phdr; + + // For non-PIC executables (e_type == ET_EXEC), the load address is + // the start address of the first PT_LOAD segment. (ELF requires + // the segments to be sorted by load address.) For PIC executables + // and dynamic libraries (e_type == ET_DYN), this address will + // normally be zero. + for (int i = 0; i < nheader; ++i) { + const Phdr& header = program_headers[i]; + if (header.p_type == PT_LOAD) + return header.p_vaddr; + } + return 0; +} + +// Find the set of address ranges for all PT_LOAD segments. +template +vector GetPtLoadSegmentRanges( + const typename ElfClass::Phdr* program_headers, + int nheader) { + typedef typename ElfClass::Phdr Phdr; + vector ranges; + + for (int i = 0; i < nheader; ++i) { + const Phdr& header = program_headers[i]; + if (header.p_type == PT_LOAD) { + ranges.push_back(Module::Range(header.p_vaddr, header.p_memsz)); + } + } + return ranges; +} + +#ifndef NO_STABS_SUPPORT +template +bool LoadStabs(const typename ElfClass::Ehdr* elf_header, + const typename ElfClass::Shdr* stab_section, + const typename ElfClass::Shdr* stabstr_section, + const bool big_endian, + Module* module) { + // A callback object to handle data from the STABS reader. + StabsToModule handler(module); + // Find the addresses of the STABS data, and create a STABS reader object. + // On Linux, STABS entries always have 32-bit values, regardless of the + // address size of the architecture whose code they're describing, and + // the strings are always "unitized". + const uint8_t* stabs = + GetOffset(elf_header, stab_section->sh_offset); + const uint8_t* stabstr = + GetOffset(elf_header, stabstr_section->sh_offset); + google_breakpad::StabsReader reader(stabs, stab_section->sh_size, + stabstr, stabstr_section->sh_size, + big_endian, 4, true, &handler); + // Read the STABS data, and do post-processing. + if (!reader.Process()) + return false; + handler.Finalize(); + return true; +} +#endif // NO_STABS_SUPPORT + +// A range handler that accepts rangelist data parsed by +// google_breakpad::RangeListReader and populates a range vector (typically +// owned by a function) with the results. +class DumperRangesHandler : public DwarfCUToModule::RangesHandler { + public: + DumperRangesHandler(google_breakpad::ByteReader* reader) : + reader_(reader) { } + + bool ReadRanges( + enum google_breakpad::DwarfForm form, uint64_t data, + google_breakpad::RangeListReader::CURangesInfo* cu_info, + vector* ranges) { + DwarfRangeListHandler handler(ranges); + google_breakpad::RangeListReader range_list_reader(reader_, cu_info, + &handler); + return range_list_reader.ReadRanges(form, data); + } + + private: + google_breakpad::ByteReader* reader_; +}; + +// A line-to-module loader that accepts line number info parsed by +// google_breakpad::LineInfo and populates a Module and a line vector +// with the results. +class DumperLineToModule: public DwarfCUToModule::LineToModuleHandler { + public: + // Create a line-to-module converter using BYTE_READER. + explicit DumperLineToModule(google_breakpad::ByteReader* byte_reader) + : byte_reader_(byte_reader) { } + void StartCompilationUnit(const string& compilation_dir) { + compilation_dir_ = compilation_dir; + } + void ReadProgram(const uint8_t* program, + uint64_t length, + const uint8_t* string_section, + uint64_t string_section_length, + const uint8_t* line_string_section, + uint64_t line_string_section_length, + Module* module, + std::vector* lines, + std::map* files) { + DwarfLineToModule handler(module, compilation_dir_, lines, files); + google_breakpad::LineInfo parser(program, length, byte_reader_, + string_section, string_section_length, + line_string_section, + line_string_section_length, + &handler); + parser.Start(); + } + private: + string compilation_dir_; + google_breakpad::ByteReader* byte_reader_; +}; + +template +bool IsCompressedHeader(const typename ElfClass::Shdr* section) { + return (section->sh_flags & SHF_COMPRESSED) != 0; +} + +template +uint32_t GetCompressionHeader( + typename ElfClass::Chdr& compression_header, + const uint8_t* content, uint64_t size) { + const typename ElfClass::Chdr* header = + reinterpret_cast(content); + + if (size < sizeof (*header)) { + return 0; + } + + compression_header = *header; + return sizeof (*header); +} + +std::pair UncompressZlibSectionContents( + const uint8_t* compressed_buffer, uint64_t compressed_size, uint64_t uncompressed_size) { + z_stream stream; + memset(&stream, 0, sizeof stream); + + stream.avail_in = compressed_size; + stream.avail_out = uncompressed_size; + stream.next_in = const_cast(compressed_buffer); + + google_breakpad::scoped_array uncompressed_buffer( + new uint8_t[uncompressed_size]); + + int status = inflateInit(&stream); + while (stream.avail_in != 0 && status == Z_OK) { + stream.next_out = + uncompressed_buffer.get() + uncompressed_size - stream.avail_out; + + if ((status = inflate(&stream, Z_FINISH)) != Z_STREAM_END) { + break; + } + + status = inflateReset(&stream); + } + + return inflateEnd(&stream) != Z_OK || status != Z_OK || stream.avail_out != 0 + ? std::make_pair(nullptr, 0) + : std::make_pair(uncompressed_buffer.release(), uncompressed_size); +} + +#ifdef HAVE_LIBZSTD +std::pair UncompressZstdSectionContents( + const uint8_t* compressed_buffer, uint64_t compressed_size,uint64_t uncompressed_size) { + + google_breakpad::scoped_array uncompressed_buffer(new uint8_t[uncompressed_size]); + size_t out_size = ZSTD_decompress(uncompressed_buffer.get(), uncompressed_size, + compressed_buffer, compressed_size); + if (ZSTD_isError(out_size)) { + return std::make_pair(nullptr, 0); + } + assert(out_size == uncompressed_size); + return std::make_pair(uncompressed_buffer.release(), uncompressed_size); +} +#endif + +std::pair UncompressSectionContents( + uint64_t compression_type, const uint8_t* compressed_buffer, + uint64_t compressed_size, uint64_t uncompressed_size) { + if (compression_type == ELFCOMPRESS_ZLIB) { + return UncompressZlibSectionContents(compressed_buffer, compressed_size, uncompressed_size); + } + +#ifdef HAVE_LIBZSTD + if (compression_type == ELFCOMPRESS_ZSTD) { + return UncompressZstdSectionContents(compressed_buffer, compressed_size, uncompressed_size); + } +#endif + + return std::make_pair(nullptr, 0); +} + +void StartProcessSplitDwarf(google_breakpad::CompilationUnit* reader, + Module* module, + google_breakpad::Endianness endianness, + bool handle_inter_cu_refs, + bool handle_inline) { + std::string split_file; + google_breakpad::SectionMap split_sections; + google_breakpad::ByteReader split_byte_reader(endianness); + uint64_t cu_offset = 0; + if (!reader->ProcessSplitDwarf(split_file, split_sections, split_byte_reader, + cu_offset)) + return; + DwarfCUToModule::FileContext file_context(split_file, module, + handle_inter_cu_refs); + for (auto section : split_sections) + file_context.AddSectionToSectionMap(section.first, section.second.first, + section.second.second); + // Because DWP/DWO file doesn't have .debug_addr/.debug_line/.debug_line_str, + // its debug info will refer to .debug_addr/.debug_line in the main binary. + if (file_context.section_map().find(".debug_addr") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_addr", reader->GetAddrBuffer(), + reader->GetAddrBufferLen()); + if (file_context.section_map().find(".debug_line") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_line", reader->GetLineBuffer(), + reader->GetLineBufferLen()); + if (file_context.section_map().find(".debug_line_str") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_line_str", + reader->GetLineStrBuffer(), + reader->GetLineStrBufferLen()); + + DumperRangesHandler ranges_handler(&split_byte_reader); + DumperLineToModule line_to_module(&split_byte_reader); + DwarfCUToModule::WarningReporter reporter(split_file, cu_offset); + DwarfCUToModule root_handler( + &file_context, &line_to_module, &ranges_handler, &reporter, handle_inline, + reader->GetLowPC(), reader->GetAddrBase(), reader->HasSourceLineInfo(), + reader->GetSourceLineOffset()); + google_breakpad::DIEDispatcher die_dispatcher(&root_handler); + google_breakpad::CompilationUnit split_reader( + split_file, file_context.section_map(), cu_offset, &split_byte_reader, + &die_dispatcher); + split_reader.SetSplitDwarf(reader->GetAddrBase(), reader->GetDWOID()); + split_reader.Start(); + // Normally, it won't happen unless we have transitive reference. + if (split_reader.ShouldProcessSplitDwarf()) { + StartProcessSplitDwarf(&split_reader, module, endianness, + handle_inter_cu_refs, handle_inline); + } +} + +template +bool LoadDwarf(const string& dwarf_filename, + const typename ElfClass::Ehdr* elf_header, + const bool big_endian, + bool handle_inter_cu_refs, + bool handle_inline, + Module* module) { + typedef typename ElfClass::Shdr Shdr; + + const google_breakpad::Endianness endianness = big_endian ? + google_breakpad::ENDIANNESS_BIG : google_breakpad::ENDIANNESS_LITTLE; + google_breakpad::ByteReader byte_reader(endianness); + + // Construct a context for this file. + DwarfCUToModule::FileContext file_context(dwarf_filename, + module, + handle_inter_cu_refs); + + // Build a map of the ELF file's sections. + const Shdr* sections = + GetOffset(elf_header, elf_header->e_shoff); + int num_sections = elf_header->e_shnum; + const Shdr* section_names = sections + elf_header->e_shstrndx; + for (int i = 0; i < num_sections; i++) { + const Shdr* section = §ions[i]; + string name = GetOffset(elf_header, + section_names->sh_offset) + + section->sh_name; + const uint8_t* contents = GetOffset(elf_header, + section->sh_offset); + uint64_t size = section->sh_size; + + if (!IsCompressedHeader(section)) { + file_context.AddSectionToSectionMap(name, contents, size); + continue; + } + + typename ElfClass::Chdr chdr; + + uint32_t compression_header_size = + GetCompressionHeader(chdr, contents, size); + + if (compression_header_size == 0 || chdr.ch_size == 0) { + continue; + } + + contents += compression_header_size; + size -= compression_header_size; + + std::pair uncompressed = + UncompressSectionContents(chdr.ch_type, contents, size, chdr.ch_size); + + if (uncompressed.first != nullptr && uncompressed.second != 0) { + file_context.AddManagedSectionToSectionMap(name, uncompressed.first, uncompressed.second); + } + } + + // .debug_ranges and .debug_rnglists reader + DumperRangesHandler ranges_handler(&byte_reader); + + // Parse all the compilation units in the .debug_info section. + DumperLineToModule line_to_module(&byte_reader); + google_breakpad::SectionMap::const_iterator debug_info_entry = + file_context.section_map().find(".debug_info"); + assert(debug_info_entry != file_context.section_map().end()); + const std::pair& debug_info_section = + debug_info_entry->second; + // This should never have been called if the file doesn't have a + // .debug_info section. + assert(debug_info_section.first); + uint64_t debug_info_length = debug_info_section.second; + for (uint64_t offset = 0; offset < debug_info_length;) { + // Make a handler for the root DIE that populates MODULE with the + // data that was found. + DwarfCUToModule::WarningReporter reporter(dwarf_filename, offset); + DwarfCUToModule root_handler(&file_context, &line_to_module, + &ranges_handler, &reporter, handle_inline); + // Make a Dwarf2Handler that drives the DIEHandler. + google_breakpad::DIEDispatcher die_dispatcher(&root_handler); + // Make a DWARF parser for the compilation unit at OFFSET. + google_breakpad::CompilationUnit reader(dwarf_filename, + file_context.section_map(), + offset, + &byte_reader, + &die_dispatcher); + // Process the entire compilation unit; get the offset of the next. + offset += reader.Start(); + // Start to process split dwarf file. + if (reader.ShouldProcessSplitDwarf()) { + StartProcessSplitDwarf(&reader, module, endianness, handle_inter_cu_refs, + handle_inline); + } + } + return true; +} + +// Fill REGISTER_NAMES with the register names appropriate to the +// machine architecture given in HEADER, indexed by the register +// numbers used in DWARF call frame information. Return true on +// success, or false if HEADER's machine architecture is not +// supported. +template +bool DwarfCFIRegisterNames(const typename ElfClass::Ehdr* elf_header, + std::vector* register_names) { + switch (elf_header->e_machine) { + case EM_386: + *register_names = DwarfCFIToModule::RegisterNames::I386(); + return true; + case EM_ARM: + *register_names = DwarfCFIToModule::RegisterNames::ARM(); + return true; + case EM_AARCH64: + *register_names = DwarfCFIToModule::RegisterNames::ARM64(); + return true; + case EM_MIPS: + *register_names = DwarfCFIToModule::RegisterNames::MIPS(); + return true; + case EM_X86_64: + *register_names = DwarfCFIToModule::RegisterNames::X86_64(); + return true; + case EM_RISCV: + *register_names = DwarfCFIToModule::RegisterNames::RISCV(); + return true; + default: + return false; + } +} + +template +bool LoadDwarfCFI(const string& dwarf_filename, + const typename ElfClass::Ehdr* elf_header, + const char* section_name, + const typename ElfClass::Shdr* section, + const bool eh_frame, + const typename ElfClass::Shdr* got_section, + const typename ElfClass::Shdr* text_section, + const bool big_endian, + Module* module) { + // Find the appropriate set of register names for this file's + // architecture. + std::vector register_names; + if (!DwarfCFIRegisterNames(elf_header, ®ister_names)) { + fprintf(stderr, "%s: unrecognized ELF machine architecture '%d';" + " cannot convert DWARF call frame information\n", + dwarf_filename.c_str(), elf_header->e_machine); + return false; + } + + const google_breakpad::Endianness endianness = big_endian ? + google_breakpad::ENDIANNESS_BIG : google_breakpad::ENDIANNESS_LITTLE; + + // Find the call frame information and its size. + const uint8_t* cfi = + GetOffset(elf_header, section->sh_offset); + size_t cfi_size = section->sh_size; + + // Plug together the parser, handler, and their entourages. + DwarfCFIToModule::Reporter module_reporter(dwarf_filename, section_name); + DwarfCFIToModule handler(module, register_names, &module_reporter); + google_breakpad::ByteReader byte_reader(endianness); + + byte_reader.SetAddressSize(ElfClass::kAddrSize); + + // Provide the base addresses for .eh_frame encoded pointers, if + // possible. + byte_reader.SetCFIDataBase(section->sh_addr, cfi); + if (got_section) + byte_reader.SetDataBase(got_section->sh_addr); + if (text_section) + byte_reader.SetTextBase(text_section->sh_addr); + + google_breakpad::CallFrameInfo::Reporter dwarf_reporter(dwarf_filename, + section_name); + if (!IsCompressedHeader(section)) { + google_breakpad::CallFrameInfo parser(cfi, cfi_size, + &byte_reader, &handler, + &dwarf_reporter, eh_frame); + parser.Start(); + return true; + } + + typename ElfClass::Chdr chdr; + uint32_t compression_header_size = + GetCompressionHeader(chdr, cfi, cfi_size); + + if (compression_header_size == 0 || chdr.ch_size == 0) { + fprintf(stderr, "%s: decompression failed at header\n", + dwarf_filename.c_str()); + return false; + } + if (compression_header_size > cfi_size) { + fprintf(stderr, "%s: decompression error, compression_header too large\n", + dwarf_filename.c_str()); + return false; + } + + cfi += compression_header_size; + cfi_size -= compression_header_size; + + std::pair uncompressed = + UncompressSectionContents(chdr.ch_type, cfi, cfi_size, chdr.ch_size); + + if (uncompressed.first == nullptr || uncompressed.second == 0) { + fprintf(stderr, "%s: decompression failed\n", dwarf_filename.c_str()); + return false; + } + google_breakpad::CallFrameInfo parser(uncompressed.first, uncompressed.second, + &byte_reader, &handler, &dwarf_reporter, + eh_frame); + parser.Start(); + return true; +} + +bool LoadELF(const string& obj_file, MmapWrapper* map_wrapper, + void** elf_header) { + int obj_fd = open(obj_file.c_str(), O_RDONLY); + if (obj_fd < 0) { + fprintf(stderr, "Failed to open ELF file '%s': %s\n", + obj_file.c_str(), strerror(errno)); + return false; + } + FDWrapper obj_fd_wrapper(obj_fd); + struct stat st; + if (fstat(obj_fd, &st) != 0 && st.st_size <= 0) { + fprintf(stderr, "Unable to fstat ELF file '%s': %s\n", + obj_file.c_str(), strerror(errno)); + return false; + } + void* obj_base = mmap(NULL, st.st_size, + PROT_READ | PROT_WRITE, MAP_PRIVATE, obj_fd, 0); + if (obj_base == MAP_FAILED) { + fprintf(stderr, "Failed to mmap ELF file '%s': %s\n", + obj_file.c_str(), strerror(errno)); + return false; + } + map_wrapper->set(obj_base, st.st_size); + *elf_header = obj_base; + if (!IsValidElf(*elf_header)) { + fprintf(stderr, "Not a valid ELF file: %s\n", obj_file.c_str()); + return false; + } + return true; +} + +// Get the endianness of ELF_HEADER. If it's invalid, return false. +template +bool ElfEndianness(const typename ElfClass::Ehdr* elf_header, + bool* big_endian) { + if (elf_header->e_ident[EI_DATA] == ELFDATA2LSB) { + *big_endian = false; + return true; + } + if (elf_header->e_ident[EI_DATA] == ELFDATA2MSB) { + *big_endian = true; + return true; + } + + fprintf(stderr, "bad data encoding in ELF header: %d\n", + elf_header->e_ident[EI_DATA]); + return false; +} + +// Given |left_abspath|, find the absolute path for |right_path| and see if the +// two absolute paths are the same. +bool IsSameFile(const char* left_abspath, const string& right_path) { + char right_abspath[PATH_MAX]; + if (!realpath(right_path.c_str(), right_abspath)) + return false; + return strcmp(left_abspath, right_abspath) == 0; +} + +// Read the .gnu_debuglink and get the debug file name. If anything goes +// wrong, return an empty string. +string ReadDebugLink(const uint8_t* debuglink, + const size_t debuglink_size, + const bool big_endian, + const string& obj_file, + const std::vector& debug_dirs) { + // Include '\0' + CRC32 (4 bytes). + size_t debuglink_len = strlen(reinterpret_cast(debuglink)) + 5; + debuglink_len = 4 * ((debuglink_len + 3) / 4); // Round up to 4 bytes. + + // Sanity check. + if (debuglink_len != debuglink_size) { + fprintf(stderr, "Mismatched .gnu_debuglink string / section size: " + "%zx %zx\n", debuglink_len, debuglink_size); + return string(); + } + + char obj_file_abspath[PATH_MAX]; + if (!realpath(obj_file.c_str(), obj_file_abspath)) { + fprintf(stderr, "Cannot resolve absolute path for %s\n", obj_file.c_str()); + return string(); + } + + std::vector searched_paths; + string debuglink_path; + std::vector::const_iterator it; + for (it = debug_dirs.begin(); it < debug_dirs.end(); ++it) { + const string& debug_dir = *it; + debuglink_path = debug_dir + "/" + + reinterpret_cast(debuglink); + + // There is the annoying case of /path/to/foo.so having foo.so as the + // debug link file name. Thus this may end up opening /path/to/foo.so again, + // and there is a small chance of the two files having the same CRC. + if (IsSameFile(obj_file_abspath, debuglink_path)) + continue; + + searched_paths.push_back(debug_dir); + int debuglink_fd = open(debuglink_path.c_str(), O_RDONLY); + if (debuglink_fd < 0) + continue; + + FDWrapper debuglink_fd_wrapper(debuglink_fd); + + // The CRC is the last 4 bytes in |debuglink|. + const google_breakpad::Endianness endianness = big_endian ? + google_breakpad::ENDIANNESS_BIG : google_breakpad::ENDIANNESS_LITTLE; + google_breakpad::ByteReader byte_reader(endianness); + uint32_t expected_crc = + byte_reader.ReadFourBytes(&debuglink[debuglink_size - 4]); + + uint32_t actual_crc = 0; + while (true) { + const size_t kReadSize = 4096; + char buf[kReadSize]; + ssize_t bytes_read = HANDLE_EINTR(read(debuglink_fd, &buf, kReadSize)); + if (bytes_read < 0) { + fprintf(stderr, "Error reading debug ELF file %s.\n", + debuglink_path.c_str()); + return string(); + } + if (bytes_read == 0) + break; + actual_crc = google_breakpad::UpdateCrc32(actual_crc, buf, bytes_read); + } + if (actual_crc != expected_crc) { + fprintf(stderr, "Error reading debug ELF file - CRC32 mismatch: %s\n", + debuglink_path.c_str()); + continue; + } + + // Found debug file. + return debuglink_path; + } + + // Not found case. + fprintf(stderr, "Failed to find debug ELF file for '%s' after trying:\n", + obj_file.c_str()); + for (it = searched_paths.begin(); it < searched_paths.end(); ++it) { + const string& debug_dir = *it; + fprintf(stderr, " %s/%s\n", debug_dir.c_str(), debuglink); + } + return string(); +} + +// +// LoadSymbolsInfo +// +// Holds the state between the two calls to LoadSymbols() in case it's necessary +// to follow the .gnu_debuglink section and load debug information from a +// different file. +// +template +class LoadSymbolsInfo { + public: + typedef typename ElfClass::Addr Addr; + + explicit LoadSymbolsInfo(const std::vector& dbg_dirs) : + debug_dirs_(dbg_dirs), + has_loading_addr_(false) {} + + // Keeps track of which sections have been loaded so sections don't + // accidentally get loaded twice from two different files. + void LoadedSection(const string& section) { + if (loaded_sections_.count(section) == 0) { + loaded_sections_.insert(section); + } else { + fprintf(stderr, "Section %s has already been loaded.\n", + section.c_str()); + } + } + + // The ELF file and linked debug file are expected to have the same preferred + // loading address. + void set_loading_addr(Addr addr, const string& filename) { + if (!has_loading_addr_) { + loading_addr_ = addr; + loaded_file_ = filename; + return; + } + + if (addr != loading_addr_) { + fprintf(stderr, + "ELF file '%s' and debug ELF file '%s' " + "have different load addresses.\n", + loaded_file_.c_str(), filename.c_str()); + assert(false); + } + } + + // Setters and getters + const std::vector& debug_dirs() const { + return debug_dirs_; + } + + string debuglink_file() const { + return debuglink_file_; + } + void set_debuglink_file(string file) { + debuglink_file_ = file; + } + + private: + const std::vector& debug_dirs_; // Directories in which to + // search for the debug ELF file. + + string debuglink_file_; // Full path to the debug ELF file. + + bool has_loading_addr_; // Indicate if LOADING_ADDR_ is valid. + + Addr loading_addr_; // Saves the preferred loading address from the + // first call to LoadSymbols(). + + string loaded_file_; // Name of the file loaded from the first call to + // LoadSymbols(). + + std::set loaded_sections_; // Tracks the Loaded ELF sections + // between calls to LoadSymbols(). +}; + +template +bool LoadSymbols(const string& obj_file, + const bool big_endian, + const typename ElfClass::Ehdr* elf_header, + const bool read_gnu_debug_link, + LoadSymbolsInfo* info, + const DumpOptions& options, + Module* module) { + typedef typename ElfClass::Addr Addr; + typedef typename ElfClass::Phdr Phdr; + typedef typename ElfClass::Shdr Shdr; + + Addr loading_addr = GetLoadingAddress( + GetOffset(elf_header, elf_header->e_phoff), + elf_header->e_phnum); + module->SetLoadAddress(loading_addr); + info->set_loading_addr(loading_addr, obj_file); + + // Allow filtering of extraneous debug information in partitioned libraries. + // Such libraries contain debug information for all libraries extracted from + // the same combined library, implying extensive duplication. + vector address_ranges = GetPtLoadSegmentRanges( + GetOffset(elf_header, elf_header->e_phoff), + elf_header->e_phnum); + module->SetAddressRanges(address_ranges); + + const Shdr* sections = + GetOffset(elf_header, elf_header->e_shoff); + const Shdr* section_names = sections + elf_header->e_shstrndx; + const char* names = + GetOffset(elf_header, section_names->sh_offset); + const char* names_end = names + section_names->sh_size; + bool found_debug_info_section = false; + bool found_usable_info = false; + + if ((options.symbol_data & SYMBOLS_AND_FILES) || + (options.symbol_data & INLINES)) { +#ifndef NO_STABS_SUPPORT + // Look for STABS debugging information, and load it if present. + const Shdr* stab_section = + FindElfSectionByName(".stab", SHT_PROGBITS, + sections, names, names_end, + elf_header->e_shnum); + if (stab_section) { + const Shdr* stabstr_section = stab_section->sh_link + sections; + if (stabstr_section) { + found_debug_info_section = true; + found_usable_info = true; + info->LoadedSection(".stab"); + if (!LoadStabs(elf_header, stab_section, stabstr_section, + big_endian, module)) { + fprintf(stderr, "%s: \".stab\" section found, but failed to load" + " STABS debugging information\n", obj_file.c_str()); + } + } + } +#endif // NO_STABS_SUPPORT + + // See if there are export symbols available. + const Shdr* symtab_section = + FindElfSectionByName(".symtab", SHT_SYMTAB, + sections, names, names_end, + elf_header->e_shnum); + const Shdr* strtab_section = + FindElfSectionByName(".strtab", SHT_STRTAB, + sections, names, names_end, + elf_header->e_shnum); + if (symtab_section && strtab_section) { + info->LoadedSection(".symtab"); + + const uint8_t* symtab = + GetOffset(elf_header, + symtab_section->sh_offset); + const uint8_t* strtab = + GetOffset(elf_header, + strtab_section->sh_offset); + bool result = + ELFSymbolsToModule(symtab, + symtab_section->sh_size, + strtab, + strtab_section->sh_size, + big_endian, + ElfClass::kAddrSize, + module); + found_usable_info = found_usable_info || result; + } else { + // Look in dynsym only if full symbol table was not available. + const Shdr* dynsym_section = + FindElfSectionByName(".dynsym", SHT_DYNSYM, + sections, names, names_end, + elf_header->e_shnum); + const Shdr* dynstr_section = + FindElfSectionByName(".dynstr", SHT_STRTAB, + sections, names, names_end, + elf_header->e_shnum); + if (dynsym_section && dynstr_section) { + info->LoadedSection(".dynsym"); + + const uint8_t* dynsyms = + GetOffset(elf_header, + dynsym_section->sh_offset); + const uint8_t* dynstrs = + GetOffset(elf_header, + dynstr_section->sh_offset); + bool result = + ELFSymbolsToModule(dynsyms, + dynsym_section->sh_size, + dynstrs, + dynstr_section->sh_size, + big_endian, + ElfClass::kAddrSize, + module); + found_usable_info = found_usable_info || result; + } + } + + // Only Load .debug_info after loading symbol table to avoid duplicate + // PUBLIC records. + // Look for DWARF debugging information, and load it if present. + const Shdr* dwarf_section = + FindElfSectionByName(".debug_info", SHT_PROGBITS, + sections, names, names_end, + elf_header->e_shnum); + + // .debug_info section type is SHT_PROGBITS for mips on pnacl toolchains, + // but MIPS_DWARF for regular gnu toolchains, so both need to be checked + if (elf_header->e_machine == EM_MIPS && !dwarf_section) { + dwarf_section = + FindElfSectionByName(".debug_info", SHT_MIPS_DWARF, + sections, names, names_end, + elf_header->e_shnum); + } + + if (dwarf_section) { + found_debug_info_section = true; + found_usable_info = true; + info->LoadedSection(".debug_info"); + if (!LoadDwarf(obj_file, elf_header, big_endian, + options.handle_inter_cu_refs, + options.symbol_data & INLINES, module)) { + fprintf(stderr, "%s: \".debug_info\" section found, but failed to load " + "DWARF debugging information\n", obj_file.c_str()); + } + } + } + + if (options.symbol_data & CFI) { + // Dwarf Call Frame Information (CFI) is actually independent from + // the other DWARF debugging information, and can be used alone. + const Shdr* dwarf_cfi_section = + FindElfSectionByName(".debug_frame", SHT_PROGBITS, + sections, names, names_end, + elf_header->e_shnum); + + // .debug_frame section type is SHT_PROGBITS for mips on pnacl toolchains, + // but MIPS_DWARF for regular gnu toolchains, so both need to be checked + if (elf_header->e_machine == EM_MIPS && !dwarf_cfi_section) { + dwarf_cfi_section = + FindElfSectionByName(".debug_frame", SHT_MIPS_DWARF, + sections, names, names_end, + elf_header->e_shnum); + } + + if (dwarf_cfi_section) { + // Ignore the return value of this function; even without call frame + // information, the other debugging information could be perfectly + // useful. + info->LoadedSection(".debug_frame"); + bool result = + LoadDwarfCFI(obj_file, elf_header, ".debug_frame", + dwarf_cfi_section, false, 0, 0, big_endian, + module); + found_usable_info = found_usable_info || result; + } + + // Linux C++ exception handling information can also provide + // unwinding data. + const Shdr* eh_frame_section = + FindElfSectionByName(".eh_frame", SHT_PROGBITS, + sections, names, names_end, + elf_header->e_shnum); + if (eh_frame_section) { + // Pointers in .eh_frame data may be relative to the base addresses of + // certain sections. Provide those sections if present. + const Shdr* got_section = + FindElfSectionByName(".got", SHT_PROGBITS, + sections, names, names_end, + elf_header->e_shnum); + const Shdr* text_section = + FindElfSectionByName(".text", SHT_PROGBITS, + sections, names, names_end, + elf_header->e_shnum); + info->LoadedSection(".eh_frame"); + // As above, ignore the return value of this function. + bool result = + LoadDwarfCFI(obj_file, elf_header, ".eh_frame", + eh_frame_section, true, + got_section, text_section, big_endian, module); + found_usable_info = found_usable_info || result; + } + } + + if (!found_debug_info_section) { + fprintf(stderr, "%s: file contains no debugging information" + " (no \".stab\" or \".debug_info\" sections)\n", + obj_file.c_str()); + + // Failed, but maybe there's a .gnu_debuglink section? + if (read_gnu_debug_link) { + const Shdr* gnu_debuglink_section + = FindElfSectionByName(".gnu_debuglink", SHT_PROGBITS, + sections, names, + names_end, elf_header->e_shnum); + if (gnu_debuglink_section) { + if (!info->debug_dirs().empty()) { + const uint8_t* debuglink_contents = + GetOffset(elf_header, + gnu_debuglink_section->sh_offset); + string debuglink_file = + ReadDebugLink(debuglink_contents, + gnu_debuglink_section->sh_size, + big_endian, + obj_file, + info->debug_dirs()); + info->set_debuglink_file(debuglink_file); + } else { + fprintf(stderr, ".gnu_debuglink section found in '%s', " + "but no debug path specified.\n", obj_file.c_str()); + } + } else { + fprintf(stderr, "%s does not contain a .gnu_debuglink section.\n", + obj_file.c_str()); + } + } else { + // Return true if some usable information was found, since the caller + // doesn't want to use .gnu_debuglink. + return found_usable_info; + } + + // No debug info was found, let the user try again with .gnu_debuglink + // if present. + return false; + } + + return true; +} + +// Return the breakpad symbol file identifier for the architecture of +// ELF_HEADER. +template +const char* ElfArchitecture(const typename ElfClass::Ehdr* elf_header) { + typedef typename ElfClass::Half Half; + Half arch = elf_header->e_machine; + switch (arch) { + case EM_386: return "x86"; + case EM_ARM: return "arm"; + case EM_AARCH64: return "arm64"; + case EM_MIPS: return "mips"; + case EM_PPC64: return "ppc64"; + case EM_PPC: return "ppc"; + case EM_S390: return "s390"; + case EM_SPARC: return "sparc"; + case EM_SPARCV9: return "sparcv9"; + case EM_X86_64: return "x86_64"; + case EM_RISCV: return "riscv"; + default: return NULL; + } +} + +template +bool SanitizeDebugFile(const typename ElfClass::Ehdr* debug_elf_header, + const string& debuglink_file, + const string& obj_filename, + const char* obj_file_architecture, + const bool obj_file_is_big_endian) { + const char* debug_architecture = + ElfArchitecture(debug_elf_header); + if (!debug_architecture) { + fprintf(stderr, "%s: unrecognized ELF machine architecture: %d\n", + debuglink_file.c_str(), debug_elf_header->e_machine); + return false; + } + if (strcmp(obj_file_architecture, debug_architecture)) { + fprintf(stderr, "%s with ELF machine architecture %s does not match " + "%s with ELF architecture %s\n", + debuglink_file.c_str(), debug_architecture, + obj_filename.c_str(), obj_file_architecture); + return false; + } + bool debug_big_endian; + if (!ElfEndianness(debug_elf_header, &debug_big_endian)) + return false; + if (debug_big_endian != obj_file_is_big_endian) { + fprintf(stderr, "%s and %s does not match in endianness\n", + obj_filename.c_str(), debuglink_file.c_str()); + return false; + } + return true; +} + +template +bool InitModuleForElfClass(const typename ElfClass::Ehdr* elf_header, + const string& obj_filename, + const string& obj_os, + scoped_ptr& module, + bool enable_multiple_field) { + PageAllocator allocator; + wasteful_vector identifier(&allocator, kDefaultBuildIdSize); + if (!FileID::ElfFileIdentifierFromMappedFile(elf_header, identifier)) { + fprintf(stderr, "%s: unable to generate file identifier\n", + obj_filename.c_str()); + return false; + } + + const char* architecture = ElfArchitecture(elf_header); + if (!architecture) { + fprintf(stderr, "%s: unrecognized ELF machine architecture: %d\n", + obj_filename.c_str(), elf_header->e_machine); + return false; + } + + char name_buf[NAME_MAX] = {}; + std::string name = google_breakpad::ElfFileSoNameFromMappedFile( + elf_header, name_buf, sizeof(name_buf)) + ? name_buf + : google_breakpad::BaseName(obj_filename); + + // Add an extra "0" at the end. PDB files on Windows have an 'age' + // number appended to the end of the file identifier; this isn't + // really used or necessary on other platforms, but be consistent. + string id = FileID::ConvertIdentifierToUUIDString(identifier) + "0"; + // This is just the raw Build ID in hex. + string code_id = FileID::ConvertIdentifierToString(identifier); + + module.reset(new Module(name, obj_os, architecture, id, code_id, + enable_multiple_field)); + + return true; +} + +template +bool ReadSymbolDataElfClass(const typename ElfClass::Ehdr* elf_header, + const string& obj_filename, + const string& obj_os, + const std::vector& debug_dirs, + const DumpOptions& options, + Module** out_module) { + typedef typename ElfClass::Ehdr Ehdr; + + *out_module = NULL; + + scoped_ptr module; + if (!InitModuleForElfClass(elf_header, obj_filename, obj_os, module, + options.enable_multiple_field)) { + return false; + } + + // Figure out what endianness this file is. + bool big_endian; + if (!ElfEndianness(elf_header, &big_endian)) + return false; + + LoadSymbolsInfo info(debug_dirs); + if (!LoadSymbols(obj_filename, big_endian, elf_header, + !debug_dirs.empty(), &info, + options, module.get())) { + const string debuglink_file = info.debuglink_file(); + if (debuglink_file.empty()) + return false; + + // Load debuglink ELF file. + fprintf(stderr, "Found debugging info in %s\n", debuglink_file.c_str()); + MmapWrapper debug_map_wrapper; + Ehdr* debug_elf_header = NULL; + if (!LoadELF(debuglink_file, &debug_map_wrapper, + reinterpret_cast(&debug_elf_header)) || + !SanitizeDebugFile(debug_elf_header, debuglink_file, + obj_filename, + module->architecture().c_str(), + big_endian)) { + return false; + } + + if (!LoadSymbols(debuglink_file, big_endian, + debug_elf_header, false, &info, + options, module.get())) { + return false; + } + } + + *out_module = module.release(); + return true; +} + +} // namespace + +namespace google_breakpad { + +// Not explicitly exported, but not static so it can be used in unit tests. +bool ReadSymbolDataInternal(const uint8_t* obj_file, + const string& obj_filename, + const string& obj_os, + const std::vector& debug_dirs, + const DumpOptions& options, + Module** module) { + if (!IsValidElf(obj_file)) { + fprintf(stderr, "Not a valid ELF file: %s\n", obj_filename.c_str()); + return false; + } + + int elfclass = ElfClass(obj_file); + if (elfclass == ELFCLASS32) { + return ReadSymbolDataElfClass( + reinterpret_cast(obj_file), obj_filename, obj_os, + debug_dirs, options, module); + } + if (elfclass == ELFCLASS64) { + return ReadSymbolDataElfClass( + reinterpret_cast(obj_file), obj_filename, obj_os, + debug_dirs, options, module); + } + + return false; +} + +bool WriteSymbolFile(const string& load_path, + const string& obj_file, + const string& obj_os, + const std::vector& debug_dirs, + const DumpOptions& options, + std::ostream& sym_stream) { + Module* module; + if (!ReadSymbolData(load_path, obj_file, obj_os, debug_dirs, options, + &module)) + return false; + + bool result = module->Write(sym_stream, options.symbol_data); + delete module; + return result; +} + +// Read the selected object file's debugging information, and write out the +// header only to |stream|. Return true on success; if an error occurs, report +// it and return false. +bool WriteSymbolFileHeader(const string& load_path, + const string& obj_file, + const string& obj_os, + std::ostream& sym_stream) { + MmapWrapper map_wrapper; + void* elf_header = NULL; + if (!LoadELF(load_path, &map_wrapper, &elf_header)) { + fprintf(stderr, "Could not load ELF file: %s\n", obj_file.c_str()); + return false; + } + + if (!IsValidElf(elf_header)) { + fprintf(stderr, "Not a valid ELF file: %s\n", obj_file.c_str()); + return false; + } + + int elfclass = ElfClass(elf_header); + scoped_ptr module; + if (elfclass == ELFCLASS32) { + if (!InitModuleForElfClass( + reinterpret_cast(elf_header), obj_file, obj_os, + module, /*enable_multiple_field=*/false)) { + fprintf(stderr, "Failed to load ELF module: %s\n", obj_file.c_str()); + return false; + } + } else if (elfclass == ELFCLASS64) { + if (!InitModuleForElfClass( + reinterpret_cast(elf_header), obj_file, obj_os, + module, /*enable_multiple_field=*/false)) { + fprintf(stderr, "Failed to load ELF module: %s\n", obj_file.c_str()); + return false; + } + } else { + fprintf(stderr, "Unsupported module file: %s\n", obj_file.c_str()); + return false; + } + + return module->Write(sym_stream, ALL_SYMBOL_DATA); +} + +bool ReadSymbolData(const string& load_path, + const string& obj_file, + const string& obj_os, + const std::vector& debug_dirs, + const DumpOptions& options, + Module** module) { + MmapWrapper map_wrapper; + void* elf_header = NULL; + if (!LoadELF(load_path, &map_wrapper, &elf_header)) + return false; + + return ReadSymbolDataInternal(reinterpret_cast(elf_header), + obj_file, obj_os, debug_dirs, options, module); +} + +} // namespace google_breakpad diff --git a/src/common/linux/dump_symbols.h b/src/common/linux/dump_symbols.h new file mode 100644 index 0000000..f1802ec --- /dev/null +++ b/src/common/linux/dump_symbols.h @@ -0,0 +1,95 @@ +// -*- mode: c++ -*- + +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dump_symbols.h: Read debugging information from an ELF file, and write +// it out as a Breakpad symbol file. + +#ifndef COMMON_LINUX_DUMP_SYMBOLS_H__ +#define COMMON_LINUX_DUMP_SYMBOLS_H__ + +#include +#include +#include + +#include "common/symbol_data.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +class Module; + +struct DumpOptions { + DumpOptions(SymbolData symbol_data, + bool handle_inter_cu_refs, + bool enable_multiple_field) + : symbol_data(symbol_data), + handle_inter_cu_refs(handle_inter_cu_refs), + enable_multiple_field(enable_multiple_field) {} + + SymbolData symbol_data; + bool handle_inter_cu_refs; + bool enable_multiple_field; +}; + +// Find all the debugging information in OBJ_FILE, an ELF executable +// or shared library, and write it to SYM_STREAM in the Breakpad symbol +// file format. +// If OBJ_FILE has been stripped but contains a .gnu_debuglink section, +// then look for the debug file in DEBUG_DIRS. +// SYMBOL_DATA allows limiting the type of symbol data written. +bool WriteSymbolFile(const string& load_path, + const string& obj_file, + const string& obj_os, + const std::vector& debug_dirs, + const DumpOptions& options, + std::ostream& sym_stream); + +// Read the selected object file's debugging information, and write out the +// header only to |stream|. Return true on success; if an error occurs, report +// it and return false. |obj_file| becomes the MODULE file name and |obj_os| +// becomes the MODULE operating system. +bool WriteSymbolFileHeader(const string& load_path, + const string& obj_file, + const string& obj_os, + std::ostream& sym_stream); + +// As above, but simply return the debugging information in MODULE +// instead of writing it to a stream. The caller owns the resulting +// Module object and must delete it when finished. +bool ReadSymbolData(const string& load_path, + const string& obj_file, + const string& obj_os, + const std::vector& debug_dirs, + const DumpOptions& options, + Module** module); + +} // namespace google_breakpad + +#endif // COMMON_LINUX_DUMP_SYMBOLS_H__ diff --git a/src/common/linux/dump_symbols_unittest.cc b/src/common/linux/dump_symbols_unittest.cc new file mode 100644 index 0000000..55dcdee --- /dev/null +++ b/src/common/linux/dump_symbols_unittest.cc @@ -0,0 +1,211 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Ted Mielczarek + +// dump_symbols_unittest.cc: +// Unittests for google_breakpad::DumpSymbols + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/linux/elf_gnu_compat.h" +#include "common/linux/elfutils.h" +#include "common/linux/dump_symbols.h" +#include "common/linux/synth_elf.h" +#include "common/module.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +bool ReadSymbolDataInternal(const uint8_t* obj_file, + const string& obj_filename, + const string& obj_os, + const std::vector& debug_dir, + const DumpOptions& options, + Module** module); + +using google_breakpad::synth_elf::ELF; +using google_breakpad::synth_elf::Notes; +using google_breakpad::synth_elf::StringTable; +using google_breakpad::synth_elf::SymbolTable; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Section; +using std::stringstream; +using std::vector; +using ::testing::Test; +using ::testing::Types; + +template +class DumpSymbols : public Test { + public: + void GetElfContents(ELF& elf) { + string contents; + ASSERT_TRUE(elf.GetContents(&contents)); + ASSERT_LT(0U, contents.size()); + + elfdata_v.clear(); + elfdata_v.insert(elfdata_v.begin(), contents.begin(), contents.end()); + elfdata = &elfdata_v[0]; + } + + vector elfdata_v; + uint8_t* elfdata; +}; + +typedef Types ElfClasses; + +TYPED_TEST_SUITE(DumpSymbols, ElfClasses); + +TYPED_TEST(DumpSymbols, Invalid) { + Elf32_Ehdr header; + memset(&header, 0, sizeof(header)); + Module* module; + DumpOptions options(ALL_SYMBOL_DATA, true, false); + EXPECT_FALSE(ReadSymbolDataInternal(reinterpret_cast(&header), + "foo", + "Linux", + vector(), + options, + &module)); +} + +TYPED_TEST(DumpSymbols, SimplePublic) { + ELF elf(TypeParam::kMachine, TypeParam::kClass, kLittleEndian); + // Zero out text section for simplicity. + Section text(kLittleEndian); + text.Append(4096, 0); + elf.AddSection(".text", text, SHT_PROGBITS); + + // Add a public symbol. + StringTable table(kLittleEndian); + SymbolTable syms(kLittleEndian, TypeParam::kAddrSize, table); + syms.AddSymbol("superfunc", + (typename TypeParam::Addr)0x1000, + (typename TypeParam::Addr)0x10, + // ELF32_ST_INFO works for 32-or 64-bit. + ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), + SHN_UNDEF + 1); + int index = elf.AddSection(".dynstr", table, SHT_STRTAB); + elf.AddSection(".dynsym", syms, + SHT_DYNSYM, // type + SHF_ALLOC, // flags + 0, // addr + index, // link + sizeof(typename TypeParam::Sym)); // entsize + + elf.Finish(); + this->GetElfContents(elf); + + Module* module; + DumpOptions options(ALL_SYMBOL_DATA, true, false); + EXPECT_TRUE(ReadSymbolDataInternal(this->elfdata, + "foo", + "Linux", + vector(), + options, + &module)); + + stringstream s; + module->Write(s, ALL_SYMBOL_DATA); + const string expected = + string("MODULE Linux ") + TypeParam::kMachineName + + " 000000000000000000000000000000000 foo\n" + "INFO CODE_ID 00000000000000000000000000000000\n" + "PUBLIC 1000 0 superfunc\n"; + EXPECT_EQ(expected, s.str()); + delete module; +} + +TYPED_TEST(DumpSymbols, SimpleBuildID) { + ELF elf(TypeParam::kMachine, TypeParam::kClass, kLittleEndian); + // Zero out text section for simplicity. + Section text(kLittleEndian); + text.Append(4096, 0); + elf.AddSection(".text", text, SHT_PROGBITS); + + // Add a Build ID + const uint8_t kExpectedIdentifierBytes[] = + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13}; + Notes notes(kLittleEndian); + notes.AddNote(NT_GNU_BUILD_ID, "GNU", kExpectedIdentifierBytes, + sizeof(kExpectedIdentifierBytes)); + elf.AddSection(".note.gnu.build-id", notes, SHT_NOTE); + + // Add a public symbol. + StringTable table(kLittleEndian); + SymbolTable syms(kLittleEndian, TypeParam::kAddrSize, table); + syms.AddSymbol("superfunc", + (typename TypeParam::Addr)0x1000, + (typename TypeParam::Addr)0x10, + // ELF32_ST_INFO works for 32-or 64-bit. + ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), + SHN_UNDEF + 1); + int index = elf.AddSection(".dynstr", table, SHT_STRTAB); + elf.AddSection(".dynsym", syms, + SHT_DYNSYM, // type + SHF_ALLOC, // flags + 0, // addr + index, // link + sizeof(typename TypeParam::Sym)); // entsize + + elf.Finish(); + this->GetElfContents(elf); + + Module* module; + DumpOptions options(ALL_SYMBOL_DATA, true, false); + EXPECT_TRUE(ReadSymbolDataInternal(this->elfdata, + "foo", + "Linux", + vector(), + options, + &module)); + + stringstream s; + module->Write(s, ALL_SYMBOL_DATA); + const string expected = + string("MODULE Linux ") + TypeParam::kMachineName + + " 030201000504070608090A0B0C0D0E0F0 foo\n" + "INFO CODE_ID 000102030405060708090A0B0C0D0E0F10111213\n" + "PUBLIC 1000 0 superfunc\n"; + EXPECT_EQ(expected, s.str()); + delete module; +} + +} // namespace google_breakpad diff --git a/src/common/linux/eintr_wrapper.h b/src/common/linux/eintr_wrapper.h new file mode 100644 index 0000000..a8428a9 --- /dev/null +++ b/src/common/linux/eintr_wrapper.h @@ -0,0 +1,57 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_LINUX_EINTR_WRAPPER_H_ +#define COMMON_LINUX_EINTR_WRAPPER_H_ + +#include + +// This provides a wrapper around system calls which may be interrupted by a +// signal and return EINTR. See man 7 signal. +// + +#define HANDLE_EINTR(x) ({ \ + __typeof__(x) eintr_wrapper_result; \ + do { \ + eintr_wrapper_result = (x); \ + } while (eintr_wrapper_result == -1 && errno == EINTR); \ + eintr_wrapper_result; \ +}) + +#define IGNORE_EINTR(x) ({ \ + __typeof__(x) eintr_wrapper_result; \ + do { \ + eintr_wrapper_result = (x); \ + if (eintr_wrapper_result == -1 && errno == EINTR) { \ + eintr_wrapper_result = 0; \ + } \ + } while (0); \ + eintr_wrapper_result; \ +}) + +#endif // COMMON_LINUX_EINTR_WRAPPER_H_ diff --git a/src/common/linux/elf_core_dump.cc b/src/common/linux/elf_core_dump.cc new file mode 100644 index 0000000..67257fd --- /dev/null +++ b/src/common/linux/elf_core_dump.cc @@ -0,0 +1,206 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// elf_core_dump.cc: Implement google_breakpad::ElfCoreDump. +// See elf_core_dump.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/elf_core_dump.h" + +#include +#include +#include + +namespace google_breakpad { + +// Implementation of ElfCoreDump::Note. + +ElfCoreDump::Note::Note() {} + +ElfCoreDump::Note::Note(const MemoryRange& content) : content_(content) {} + +bool ElfCoreDump::Note::IsValid() const { + return GetHeader() != NULL; +} + +const ElfCoreDump::Nhdr* ElfCoreDump::Note::GetHeader() const { + return content_.GetData(0); +} + +ElfCoreDump::Word ElfCoreDump::Note::GetType() const { + const Nhdr* header = GetHeader(); + // 0 is not being used as a NOTE type. + return header ? header->n_type : 0; +} + +MemoryRange ElfCoreDump::Note::GetName() const { + const Nhdr* header = GetHeader(); + if (header) { + return content_.Subrange(sizeof(Nhdr), header->n_namesz); + } + return MemoryRange(); +} + +MemoryRange ElfCoreDump::Note::GetDescription() const { + const Nhdr* header = GetHeader(); + if (header) { + return content_.Subrange(AlignedSize(sizeof(Nhdr) + header->n_namesz), + header->n_descsz); + } + return MemoryRange(); +} + +ElfCoreDump::Note ElfCoreDump::Note::GetNextNote() const { + MemoryRange next_content; + const Nhdr* header = GetHeader(); + if (header) { + size_t next_offset = AlignedSize(sizeof(Nhdr) + header->n_namesz); + next_offset = AlignedSize(next_offset + header->n_descsz); + next_content = + content_.Subrange(next_offset, content_.length() - next_offset); + } + return Note(next_content); +} + +// static +size_t ElfCoreDump::Note::AlignedSize(size_t size) { + size_t mask = sizeof(Word) - 1; + return (size + mask) & ~mask; +} + + +// Implementation of ElfCoreDump. + +ElfCoreDump::ElfCoreDump() : proc_mem_fd_(-1) {} + +ElfCoreDump::ElfCoreDump(const MemoryRange& content) + : content_(content), proc_mem_fd_(-1) {} + +ElfCoreDump::~ElfCoreDump() { + if (proc_mem_fd_ != -1) { + close(proc_mem_fd_); + proc_mem_fd_ = -1; + } +} + +void ElfCoreDump::SetContent(const MemoryRange& content) { + content_ = content; +} + +void ElfCoreDump::SetProcMem(int fd) { + if (proc_mem_fd_ != -1) { + close(proc_mem_fd_); + } + proc_mem_fd_ = fd; +} + +bool ElfCoreDump::IsValid() const { + const Ehdr* header = GetHeader(); + return (header && + header->e_ident[0] == ELFMAG0 && + header->e_ident[1] == ELFMAG1 && + header->e_ident[2] == ELFMAG2 && + header->e_ident[3] == ELFMAG3 && + header->e_ident[4] == kClass && + header->e_version == EV_CURRENT && + header->e_type == ET_CORE); +} + +const ElfCoreDump::Ehdr* ElfCoreDump::GetHeader() const { + return content_.GetData(0); +} + +const ElfCoreDump::Phdr* ElfCoreDump::GetProgramHeader(unsigned index) const { + const Ehdr* header = GetHeader(); + if (header) { + return reinterpret_cast(content_.GetArrayElement( + header->e_phoff, header->e_phentsize, index)); + } + return NULL; +} + +const ElfCoreDump::Phdr* ElfCoreDump::GetFirstProgramHeaderOfType( + Word type) const { + for (unsigned i = 0, n = GetProgramHeaderCount(); i < n; ++i) { + const Phdr* program = GetProgramHeader(i); + if (program->p_type == type) { + return program; + } + } + return NULL; +} + +unsigned ElfCoreDump::GetProgramHeaderCount() const { + const Ehdr* header = GetHeader(); + return header ? header->e_phnum : 0; +} + +bool ElfCoreDump::CopyData(void* buffer, Addr virtual_address, size_t length) { + for (unsigned i = 0, n = GetProgramHeaderCount(); i < n; ++i) { + const Phdr* program = GetProgramHeader(i); + if (program->p_type != PT_LOAD) + continue; + + size_t offset_in_segment = virtual_address - program->p_vaddr; + if (virtual_address >= program->p_vaddr && + offset_in_segment < program->p_filesz) { + const void* data = + content_.GetData(program->p_offset + offset_in_segment, length); + if (data) { + memcpy(buffer, data, length); + return true; + } + } + } + + /* fallback: if available, read from /proc//mem */ + if (proc_mem_fd_ != -1) { + off_t offset = virtual_address; + ssize_t r = pread(proc_mem_fd_, buffer, length, offset); + if (r < ssize_t(length)) { + return false; + } + return true; + } + return false; +} + +ElfCoreDump::Note ElfCoreDump::GetFirstNote() const { + MemoryRange note_content; + const Phdr* program_header = GetFirstProgramHeaderOfType(PT_NOTE); + if (program_header) { + note_content = content_.Subrange(program_header->p_offset, + program_header->p_filesz); + } + return Note(note_content); +} + +} // namespace google_breakpad diff --git a/src/common/linux/elf_core_dump.h b/src/common/linux/elf_core_dump.h new file mode 100644 index 0000000..4f27179 --- /dev/null +++ b/src/common/linux/elf_core_dump.h @@ -0,0 +1,156 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// elf_core_dump.h: Define the google_breakpad::ElfCoreDump class, which +// encapsulates an ELF core dump file mapped into memory. + +#ifndef COMMON_LINUX_ELF_CORE_DUMP_H_ +#define COMMON_LINUX_ELF_CORE_DUMP_H_ + +#include +#include +#include +#include + +#include "common/memory_range.h" + +namespace google_breakpad { + +// A class encapsulating an ELF core dump file mapped into memory, which +// provides methods for accessing program headers and the note section. +class ElfCoreDump { + public: + // ELF types based on the native word size. + typedef ElfW(Ehdr) Ehdr; + typedef ElfW(Nhdr) Nhdr; + typedef ElfW(Phdr) Phdr; + typedef ElfW(Word) Word; + typedef ElfW(Addr) Addr; +#if ULONG_MAX == 0xffffffff + static const int kClass = ELFCLASS32; +#elif ULONG_MAX == 0xffffffffffffffff + static const int kClass = ELFCLASS64; +#else +#error "Unsupported word size for ElfCoreDump." +#endif + + // A class encapsulating the note content in a core dump, which provides + // methods for accessing the name and description of a note. + class Note { + public: + Note(); + + // Constructor that takes the note content from |content|. + explicit Note(const MemoryRange& content); + + // Returns true if this note is valid, i,e. a note header is found in + // |content_|, or false otherwise. + bool IsValid() const; + + // Returns the note header, or NULL if no note header is found in + // |content_|. + const Nhdr* GetHeader() const; + + // Returns the note type, or 0 if no note header is found in |content_|. + Word GetType() const; + + // Returns a memory range covering the note name, or an empty range + // if no valid note name is found in |content_|. + MemoryRange GetName() const; + + // Returns a memory range covering the note description, or an empty + // range if no valid note description is found in |content_|. + MemoryRange GetDescription() const; + + // Returns the note following this note, or an empty note if no valid + // note is found after this note. + Note GetNextNote() const; + + private: + // Returns the size in bytes round up to the word alignment, specified + // for the note section, of a given size in bytes. + static size_t AlignedSize(size_t size); + + // Note content. + MemoryRange content_; + }; + + ElfCoreDump(); + + // Constructor that takes the core dump content from |content|. + explicit ElfCoreDump(const MemoryRange& content); + + ~ElfCoreDump(); + + // Sets the core dump content to |content|. + void SetContent(const MemoryRange& content); + + // Returns true if a valid ELF header in the core dump, or false otherwise. + bool IsValid() const; + + // Returns the ELF header in the core dump, or NULL if no ELF header + // is found in |content_|. + const Ehdr* GetHeader() const; + + // Returns the |index|-th program header in the core dump, or NULL if no + // ELF header is found in |content_| or |index| is out of bounds. + const Phdr* GetProgramHeader(unsigned index) const; + + // Returns the first program header of |type| in the core dump, or NULL if + // no ELF header is found in |content_| or no program header of |type| is + // found. + const Phdr* GetFirstProgramHeaderOfType(Word type) const; + + // Returns the number of program headers in the core dump, or 0 if no + // ELF header is found in |content_|. + unsigned GetProgramHeaderCount() const; + + // Copies |length| bytes of data starting at |virtual_address| in the core + // dump to |buffer|. |buffer| should be a valid pointer to a buffer of at + // least |length| bytes. Returns true if the data to be copied is found in + // the core dump, or false otherwise. + bool CopyData(void* buffer, Addr virtual_address, size_t length); + + // Returns the first note found in the note section of the core dump, or + // an empty note if no note is found. + Note GetFirstNote() const; + + // Sets the mem fd. + void SetProcMem(const int fd); + + private: + // Core dump content. + MemoryRange content_; + + // Descriptor for /proc//mem. + int proc_mem_fd_; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_ELF_CORE_DUMP_H_ diff --git a/src/common/linux/elf_core_dump_unittest.cc b/src/common/linux/elf_core_dump_unittest.cc new file mode 100644 index 0000000..25cab99 --- /dev/null +++ b/src/common/linux/elf_core_dump_unittest.cc @@ -0,0 +1,272 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// elf_core_dump_unittest.cc: Unit tests for google_breakpad::ElfCoreDump. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/linux/elf_core_dump.h" +#include "common/linux/memory_mapped_file.h" +#include "common/tests/file_utils.h" +#include "common/linux/tests/crash_generator.h" +#include "common/using_std_string.h" + +using google_breakpad::AutoTempDir; +using google_breakpad::CrashGenerator; +using google_breakpad::ElfCoreDump; +using google_breakpad::MemoryMappedFile; +using google_breakpad::MemoryRange; +using google_breakpad::WriteFile; +using std::set; + +TEST(ElfCoreDumpTest, DefaultConstructor) { + ElfCoreDump core; + EXPECT_FALSE(core.IsValid()); + EXPECT_EQ(NULL, core.GetHeader()); + EXPECT_EQ(0U, core.GetProgramHeaderCount()); + EXPECT_EQ(NULL, core.GetProgramHeader(0)); + EXPECT_EQ(NULL, core.GetFirstProgramHeaderOfType(PT_LOAD)); + EXPECT_FALSE(core.GetFirstNote().IsValid()); +} + +TEST(ElfCoreDumpTest, TestElfHeader) { + ElfCoreDump::Ehdr header; + memset(&header, 0, sizeof(header)); + + AutoTempDir temp_dir; + string core_path = temp_dir.path() + "/core"; + const char* core_file = core_path.c_str(); + MemoryMappedFile mapped_core_file; + ElfCoreDump core; + + ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header) - 1)); + ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); + core.SetContent(mapped_core_file.content()); + EXPECT_FALSE(core.IsValid()); + EXPECT_EQ(NULL, core.GetHeader()); + EXPECT_EQ(0U, core.GetProgramHeaderCount()); + EXPECT_EQ(NULL, core.GetProgramHeader(0)); + EXPECT_EQ(NULL, core.GetFirstProgramHeaderOfType(PT_LOAD)); + EXPECT_FALSE(core.GetFirstNote().IsValid()); + + ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); + ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); + core.SetContent(mapped_core_file.content()); + EXPECT_FALSE(core.IsValid()); + + header.e_ident[0] = ELFMAG0; + ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); + ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); + core.SetContent(mapped_core_file.content()); + EXPECT_FALSE(core.IsValid()); + + header.e_ident[1] = ELFMAG1; + ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); + ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); + core.SetContent(mapped_core_file.content()); + EXPECT_FALSE(core.IsValid()); + + header.e_ident[2] = ELFMAG2; + ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); + ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); + core.SetContent(mapped_core_file.content()); + EXPECT_FALSE(core.IsValid()); + + header.e_ident[3] = ELFMAG3; + ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); + ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); + core.SetContent(mapped_core_file.content()); + EXPECT_FALSE(core.IsValid()); + + header.e_ident[4] = ElfCoreDump::kClass; + ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); + ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); + core.SetContent(mapped_core_file.content()); + EXPECT_FALSE(core.IsValid()); + + header.e_version = EV_CURRENT; + ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); + ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); + core.SetContent(mapped_core_file.content()); + EXPECT_FALSE(core.IsValid()); + + header.e_type = ET_CORE; + ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header))); + ASSERT_TRUE(mapped_core_file.Map(core_file, 0)); + core.SetContent(mapped_core_file.content()); + EXPECT_TRUE(core.IsValid()); +} + +TEST(ElfCoreDumpTest, ValidCoreFile) { + CrashGenerator crash_generator; + if (!crash_generator.HasDefaultCorePattern()) { + GTEST_SKIP() << "ElfCoreDumpTest.ValidCoreFile test is skipped " + "due to non-default core pattern"; + } + + if (!crash_generator.HasResourceLimitsAmenableToCrashCollection()) { + GTEST_SKIP() << "ElfCoreDumpTest.ValidCoreFile test is skipped " + "due to inadequate system resource limits"; + } + + const unsigned kNumOfThreads = 3; + const unsigned kCrashThread = 1; + const int kCrashSignal = SIGABRT; + ASSERT_TRUE(crash_generator.CreateChildCrash(kNumOfThreads, kCrashThread, + kCrashSignal, NULL)); + pid_t expected_crash_thread_id = crash_generator.GetThreadId(kCrashThread); + set expected_thread_ids; + for (unsigned i = 0; i < kNumOfThreads; ++i) { + expected_thread_ids.insert(crash_generator.GetThreadId(i)); + } + +#if defined(__ANDROID__) + struct stat st; + if (stat(crash_generator.GetCoreFilePath().c_str(), &st) != 0) { + fprintf(stderr, "ElfCoreDumpTest.ValidCoreFile test is skipped " + "due to no core file being generated"); + return; + } +#endif + + MemoryMappedFile mapped_core_file; + ASSERT_TRUE( + mapped_core_file.Map(crash_generator.GetCoreFilePath().c_str(), 0)); + + ElfCoreDump core; + core.SetContent(mapped_core_file.content()); + EXPECT_TRUE(core.IsValid()); + + // Based on write_note_info() in linux/kernel/fs/binfmt_elf.c, notes are + // ordered as follows (NT_PRXFPREG and NT_386_TLS are i386 specific): + // Thread Name Type + // ------------------------------------------------------------------- + // 1st thread CORE NT_PRSTATUS + // process-wide CORE NT_PRPSINFO + // process-wide CORE NT_AUXV + // 1st thread CORE NT_FPREGSET + // 1st thread LINUX NT_PRXFPREG + // 1st thread LINUX NT_386_TLS + // + // 2nd thread CORE NT_PRSTATUS + // 2nd thread CORE NT_FPREGSET + // 2nd thread LINUX NT_PRXFPREG + // 2nd thread LINUX NT_386_TLS + // + // 3rd thread CORE NT_PRSTATUS + // 3rd thread CORE NT_FPREGSET + // 3rd thread LINUX NT_PRXFPREG + // 3rd thread LINUX NT_386_TLS + + size_t num_nt_prpsinfo = 0; + size_t num_nt_prstatus = 0; + size_t num_pr_fpvalid = 0; +#if defined(__i386__) || defined(__x86_64__) + size_t num_nt_fpregset = 0; +#endif +#if defined(__i386__) + size_t num_nt_prxfpreg = 0; +#endif + set actual_thread_ids; + ElfCoreDump::Note note = core.GetFirstNote(); + while (note.IsValid()) { + MemoryRange name = note.GetName(); + MemoryRange description = note.GetDescription(); + EXPECT_FALSE(name.IsEmpty()); + EXPECT_FALSE(description.IsEmpty()); + + switch (note.GetType()) { + case NT_PRPSINFO: { + EXPECT_TRUE(description.data() != NULL); + EXPECT_EQ(sizeof(elf_prpsinfo), description.length()); + ++num_nt_prpsinfo; + break; + } + case NT_PRSTATUS: { + EXPECT_TRUE(description.data() != NULL); + EXPECT_EQ(sizeof(elf_prstatus), description.length()); + const elf_prstatus* status = description.GetData(0); + actual_thread_ids.insert(status->pr_pid); + if (num_nt_prstatus == 0) { + EXPECT_EQ(expected_crash_thread_id, status->pr_pid); + EXPECT_EQ(kCrashSignal, status->pr_info.si_signo); + } + ++num_nt_prstatus; + if (status->pr_fpvalid) + ++num_pr_fpvalid; + break; + } +#if defined(__i386__) || defined(__x86_64__) + case NT_FPREGSET: { + EXPECT_TRUE(description.data() != NULL); + EXPECT_EQ(sizeof(user_fpregs_struct), description.length()); + ++num_nt_fpregset; + break; + } +#endif +#if defined(__i386__) + case NT_PRXFPREG: { + EXPECT_TRUE(description.data() != NULL); + EXPECT_EQ(sizeof(user_fpxregs_struct), description.length()); + ++num_nt_prxfpreg; + break; + } +#endif + default: + break; + } + note = note.GetNextNote(); + } + +#if defined(THREAD_SANITIZER) + for (std::set::const_iterator expected = expected_thread_ids.begin(); + expected != expected_thread_ids.end(); + ++expected) { + EXPECT_NE(actual_thread_ids.find(*expected), actual_thread_ids.end()); + } + EXPECT_GE(num_nt_prstatus, kNumOfThreads); +#else + EXPECT_EQ(actual_thread_ids, expected_thread_ids); + EXPECT_EQ(num_nt_prstatus, kNumOfThreads); +#endif + EXPECT_EQ(1U, num_nt_prpsinfo); +#if defined(__i386__) || defined(__x86_64__) + EXPECT_EQ(num_pr_fpvalid, num_nt_fpregset); +#endif +#if defined(__i386__) + EXPECT_EQ(num_pr_fpvalid, num_nt_prxfpreg); +#endif +} diff --git a/src/common/linux/elf_gnu_compat.h b/src/common/linux/elf_gnu_compat.h new file mode 100644 index 0000000..5d56c1e --- /dev/null +++ b/src/common/linux/elf_gnu_compat.h @@ -0,0 +1,50 @@ +// -*- mode: C++ -*- + +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Lei Zhang + +// elf_gnu_compat.h: #defines unique to glibc's elf.h. + +#ifndef COMMON_LINUX_ELF_GNU_COMPAT_H_ +#define COMMON_LINUX_ELF_GNU_COMPAT_H_ + +#include + +// A note type on GNU systems corresponding to the .note.gnu.build-id section. +#ifndef NT_GNU_BUILD_ID +#define NT_GNU_BUILD_ID 3 +#endif + +// Newer Linux systems offer this. +#ifndef NT_SIGINFO +#define NT_SIGINFO 0x53494749 +#endif + +#endif // COMMON_LINUX_ELF_GNU_COMPAT_H_ diff --git a/src/common/linux/elf_symbols_to_module.cc b/src/common/linux/elf_symbols_to_module.cc new file mode 100644 index 0000000..70d50f8 --- /dev/null +++ b/src/common/linux/elf_symbols_to_module.cc @@ -0,0 +1,185 @@ +// -*- mode: c++ -*- + +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Ted Mielczarek + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/elf_symbols_to_module.h" + +#include +#include +#include + +#include +#include + +#include "common/byte_cursor.h" +#include "common/module.h" + +namespace google_breakpad { + +class ELFSymbolIterator { +public: + // The contents of an ELF symbol, adjusted for the host's endianness, + // word size, and so on. Corresponds to the data in Elf32_Sym / Elf64_Sym. + struct Symbol { + // True if this iterator has reached the end of the symbol array. When + // this is set, the other members of this structure are not valid. + bool at_end; + + // The number of this symbol within the list. + size_t index; + + // The current symbol's name offset. This is the offset within the + // string table. + size_t name_offset; + + // The current symbol's value, size, info and shndx fields. + uint64_t value; + uint64_t size; + unsigned char info; + uint16_t shndx; + }; + + // Create an ELFSymbolIterator walking the symbols in BUFFER. Treat the + // symbols as big-endian if BIG_ENDIAN is true, as little-endian + // otherwise. Assume each symbol has a 'value' field whose size is + // VALUE_SIZE. + // + ELFSymbolIterator(const ByteBuffer* buffer, bool big_endian, + size_t value_size) + : value_size_(value_size), cursor_(buffer, big_endian) { + // Actually, weird sizes could be handled just fine, but they're + // probably mistakes --- expressed in bits, say. + assert(value_size == 4 || value_size == 8); + symbol_.index = 0; + Fetch(); + } + + // Move to the next symbol. This function's behavior is undefined if + // at_end() is true when it is called. + ELFSymbolIterator& operator++() { Fetch(); symbol_.index++; return *this; } + + // Dereferencing this iterator produces a reference to an Symbol structure + // that holds the current symbol's values. The symbol is owned by this + // SymbolIterator, and will be invalidated at the next call to operator++. + const Symbol& operator*() const { return symbol_; } + const Symbol* operator->() const { return &symbol_; } + +private: + // Read the symbol at cursor_, and set symbol_ appropriately. + void Fetch() { + // Elf32_Sym and Elf64_Sym have different layouts. + unsigned char other; + if (value_size_ == 4) { + // Elf32_Sym + cursor_ + .Read(4, false, &symbol_.name_offset) + .Read(4, false, &symbol_.value) + .Read(4, false, &symbol_.size) + .Read(1, false, &symbol_.info) + .Read(1, false, &other) + .Read(2, false, &symbol_.shndx); + } else { + // Elf64_Sym + cursor_ + .Read(4, false, &symbol_.name_offset) + .Read(1, false, &symbol_.info) + .Read(1, false, &other) + .Read(2, false, &symbol_.shndx) + .Read(8, false, &symbol_.value) + .Read(8, false, &symbol_.size); + } + symbol_.at_end = !cursor_; + } + + // The size of symbols' value field, in bytes. + size_t value_size_; + + // A byte cursor traversing buffer_. + ByteCursor cursor_; + + // Values for the symbol this iterator refers to. + Symbol symbol_; +}; + +const char* SymbolString(ptrdiff_t offset, ByteBuffer& strings) { + if (offset < 0 || (size_t) offset >= strings.Size()) { + // Return the null string. + offset = 0; + } + return reinterpret_cast(strings.start + offset); +} + +bool ELFSymbolsToModule(const uint8_t* symtab_section, + size_t symtab_size, + const uint8_t* string_section, + size_t string_size, + const bool big_endian, + size_t value_size, + Module* module) { + ByteBuffer symbols(symtab_section, symtab_size); + // Ensure that the string section is null-terminated. + if (string_section[string_size - 1] != '\0') { + const void* null_terminator = memrchr(string_section, '\0', string_size); + string_size = reinterpret_cast(null_terminator) + - string_section; + } + ByteBuffer strings(string_section, string_size); + + // The iterator walking the symbol table. + ELFSymbolIterator iterator(&symbols, big_endian, value_size); + + while(!iterator->at_end) { + if (ELF32_ST_TYPE(iterator->info) == STT_FUNC && + iterator->shndx != SHN_UNDEF) { + auto ext = std::make_unique(iterator->value); + ext->name = SymbolString(iterator->name_offset, strings); +#if !defined(__ANDROID__) // Android NDK doesn't provide abi::__cxa_demangle. + int status = 0; + char* demangled = + abi::__cxa_demangle(ext->name.c_str(), NULL, NULL, &status); + if (demangled) { + if (status == 0) + ext->name = demangled; + free(demangled); + } +#endif + module->AddExtern(std::move(ext)); + } + ++iterator; + } + return true; +} + +} // namespace google_breakpad diff --git a/src/common/linux/elf_symbols_to_module.h b/src/common/linux/elf_symbols_to_module.h new file mode 100644 index 0000000..ab27ef6 --- /dev/null +++ b/src/common/linux/elf_symbols_to_module.h @@ -0,0 +1,58 @@ +// -*- mode: c++ -*- + +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Ted Mielczarek + +// elf_symbols_to_module.h: Exposes ELFSymbolsToModule, a function +// for reading ELF symbol tables and inserting exported symbol names +// into a google_breakpad::Module as Extern definitions. + +#ifndef BREAKPAD_COMMON_LINUX_ELF_SYMBOLS_TO_MODULE_H_ +#define BREAKPAD_COMMON_LINUX_ELF_SYMBOLS_TO_MODULE_H_ + +#include +#include + +namespace google_breakpad { + +class Module; + +bool ELFSymbolsToModule(const uint8_t* symtab_section, + size_t symtab_size, + const uint8_t* string_section, + size_t string_size, + const bool big_endian, + size_t value_size, + Module* module); + +} // namespace google_breakpad + + +#endif // BREAKPAD_COMMON_LINUX_ELF_SYMBOLS_TO_MODULE_H_ diff --git a/src/common/linux/elf_symbols_to_module_unittest.cc b/src/common/linux/elf_symbols_to_module_unittest.cc new file mode 100644 index 0000000..a74b29f --- /dev/null +++ b/src/common/linux/elf_symbols_to_module_unittest.cc @@ -0,0 +1,373 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Ted Mielczarek + +// elf_symbols_to_module_unittest.cc: +// Unittests for google_breakpad::ELFSymbolsToModule + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/linux/elf_symbols_to_module.h" +#include "common/linux/synth_elf.h" +#include "common/module.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" + +using google_breakpad::Module; +using google_breakpad::synth_elf::StringTable; +using google_breakpad::test_assembler::Endianness; +using google_breakpad::test_assembler::kBigEndian; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using ::testing::Test; +using ::testing::TestWithParam; +using std::vector; + +class ELFSymbolsToModuleTestFixture { +public: + ELFSymbolsToModuleTestFixture(Endianness endianness, + size_t value_size) : module("a", "b", "c", "d"), + section(endianness), + table(endianness), + value_size(value_size) {} + + bool ProcessSection() { + string section_contents, table_contents; + section.GetContents(§ion_contents); + table.GetContents(&table_contents); + + bool ret = ELFSymbolsToModule(reinterpret_cast(section_contents.data()), + section_contents.size(), + reinterpret_cast(table_contents.data()), + table_contents.size(), + section.endianness() == kBigEndian, + value_size, + &module); + module.GetExterns(&externs, externs.end()); + return ret; + } + + Module module; + Section section; + StringTable table; + string section_contents; + // 4 or 8 (bytes) + size_t value_size; + + vector externs; +}; + +class ELFSymbolsToModuleTest32 : public ELFSymbolsToModuleTestFixture, + public TestWithParam { +public: + ELFSymbolsToModuleTest32() : ELFSymbolsToModuleTestFixture(GetParam(), 4) {} + + void AddElf32Sym(const string& name, uint32_t value, + uint32_t size, unsigned info, uint16_t shndx) { + section + .D32(table.Add(name)) + .D32(value) + .D32(size) + .D8(info) + .D8(0) // other + .D16(shndx); + } +}; + +TEST_P(ELFSymbolsToModuleTest32, NoFuncs) { + ProcessSection(); + + ASSERT_EQ((size_t)0, externs.size()); +} + +TEST_P(ELFSymbolsToModuleTest32, OneFunc) { + const string kFuncName = "superfunc"; + const uint32_t kFuncAddr = 0x1000; + const uint32_t kFuncSize = 0x10; + + AddElf32Sym(kFuncName, kFuncAddr, kFuncSize, + ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), + // Doesn't really matter, just can't be SHN_UNDEF. + SHN_UNDEF + 1); + + ProcessSection(); + + ASSERT_EQ((size_t)1, externs.size()); + Module::Extern *extern1 = externs[0]; + EXPECT_EQ(kFuncName, extern1->name); + EXPECT_EQ((Module::Address)kFuncAddr, extern1->address); +} + +TEST_P(ELFSymbolsToModuleTest32, NameOutOfBounds) { + const string kFuncName = ""; + const uint32_t kFuncAddr = 0x1000; + const uint32_t kFuncSize = 0x10; + + table.Add("Foo"); + table.Add("Bar"); + // Can't use AddElf32Sym because it puts in a valid string offset. + section + .D32((uint32_t)table.Here().Value() + 1) + .D32(kFuncAddr) + .D32(kFuncSize) + .D8(ELF32_ST_INFO(STB_GLOBAL, STT_FUNC)) + .D8(0) // other + .D16(SHN_UNDEF + 1); + + ProcessSection(); + + ASSERT_EQ((size_t)1, externs.size()); + Module::Extern *extern1 = externs[0]; + EXPECT_EQ(kFuncName, extern1->name); + EXPECT_EQ((Module::Address)kFuncAddr, extern1->address); +} + +TEST_P(ELFSymbolsToModuleTest32, NonTerminatedStringTable) { + const string kFuncName = ""; + const uint32_t kFuncAddr = 0x1000; + const uint32_t kFuncSize = 0x10; + + table.Add("Foo"); + table.Add("Bar"); + // Add a non-null-terminated string to the end of the string table + Label l; + table + .Mark(&l) + .Append("Unterminated"); + // Can't use AddElf32Sym because it puts in a valid string offset. + section + .D32((uint32_t)l.Value()) + .D32(kFuncAddr) + .D32(kFuncSize) + .D8(ELF32_ST_INFO(STB_GLOBAL, STT_FUNC)) + .D8(0) // other + .D16(SHN_UNDEF + 1); + + ProcessSection(); + + ASSERT_EQ((size_t)1, externs.size()); + Module::Extern *extern1 = externs[0]; + EXPECT_EQ(kFuncName, extern1->name); + EXPECT_EQ((Module::Address)kFuncAddr, extern1->address); +} + +TEST_P(ELFSymbolsToModuleTest32, MultipleFuncs) { + const string kFuncName1 = "superfunc"; + const uint32_t kFuncAddr1 = 0x10001000; + const uint32_t kFuncSize1 = 0x10; + const string kFuncName2 = "awesomefunc"; + const uint32_t kFuncAddr2 = 0x20002000; + const uint32_t kFuncSize2 = 0x2f; + const string kFuncName3 = "megafunc"; + const uint32_t kFuncAddr3 = 0x30003000; + const uint32_t kFuncSize3 = 0x3c; + + AddElf32Sym(kFuncName1, kFuncAddr1, kFuncSize1, + ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), + // Doesn't really matter, just can't be SHN_UNDEF. + SHN_UNDEF + 1); + AddElf32Sym(kFuncName2, kFuncAddr2, kFuncSize2, + ELF32_ST_INFO(STB_LOCAL, STT_FUNC), + // Doesn't really matter, just can't be SHN_UNDEF. + SHN_UNDEF + 2); + AddElf32Sym(kFuncName3, kFuncAddr3, kFuncSize3, + ELF32_ST_INFO(STB_LOCAL, STT_FUNC), + // Doesn't really matter, just can't be SHN_UNDEF. + SHN_UNDEF + 3); + + ProcessSection(); + + ASSERT_EQ((size_t)3, externs.size()); + Module::Extern *extern1 = externs[0]; + EXPECT_EQ(kFuncName1, extern1->name); + EXPECT_EQ((Module::Address)kFuncAddr1, extern1->address); + Module::Extern *extern2 = externs[1]; + EXPECT_EQ(kFuncName2, extern2->name); + EXPECT_EQ((Module::Address)kFuncAddr2, extern2->address); + Module::Extern *extern3 = externs[2]; + EXPECT_EQ(kFuncName3, extern3->name); + EXPECT_EQ((Module::Address)kFuncAddr3, extern3->address); +} + +TEST_P(ELFSymbolsToModuleTest32, SkipStuff) { + const string kFuncName = "superfunc"; + const uint32_t kFuncAddr = 0x1000; + const uint32_t kFuncSize = 0x10; + + // Should skip functions in SHN_UNDEF + AddElf32Sym("skipme", 0xFFFF, 0x10, + ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), + SHN_UNDEF); + AddElf32Sym(kFuncName, kFuncAddr, kFuncSize, + ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), + // Doesn't really matter, just can't be SHN_UNDEF. + SHN_UNDEF + 1); + // Should skip non-STT_FUNC entries. + AddElf32Sym("skipmetoo", 0xAAAA, 0x10, + ELF32_ST_INFO(STB_GLOBAL, STT_FILE), + SHN_UNDEF + 1); + + ProcessSection(); + + ASSERT_EQ((size_t)1, externs.size()); + Module::Extern *extern1 = externs[0]; + EXPECT_EQ(kFuncName, extern1->name); + EXPECT_EQ((Module::Address)kFuncAddr, extern1->address); +} + +// Run all the 32-bit tests with both endianness +INSTANTIATE_TEST_SUITE_P(Endian, + ELFSymbolsToModuleTest32, + ::testing::Values(kLittleEndian, kBigEndian)); + +// Similar tests, but with 64-bit values. Ostensibly this could be +// shoehorned into the parameterization by using ::testing::Combine, +// but that would make it difficult to get the types right since these +// actual test cases aren't parameterized. This could also be written +// as a type-parameterized test, but combining that with a value-parameterized +// test seemed really ugly, and also makes it harder to test 64-bit +// values. +class ELFSymbolsToModuleTest64 : public ELFSymbolsToModuleTestFixture, + public TestWithParam { +public: + ELFSymbolsToModuleTest64() : ELFSymbolsToModuleTestFixture(GetParam(), 8) {} + + void AddElf64Sym(const string& name, uint64_t value, + uint64_t size, unsigned info, uint16_t shndx) { + section + .D32(table.Add(name)) + .D8(info) + .D8(0) // other + .D16(shndx) + .D64(value) + .D64(size); + } +}; + +TEST_P(ELFSymbolsToModuleTest64, NoFuncs) { + ProcessSection(); + + ASSERT_EQ((size_t)0, externs.size()); +} + +TEST_P(ELFSymbolsToModuleTest64, OneFunc) { + const string kFuncName = "superfunc"; + const uint64_t kFuncAddr = 0x1000200030004000ULL; + const uint64_t kFuncSize = 0x1000; + + AddElf64Sym(kFuncName, kFuncAddr, kFuncSize, + ELF64_ST_INFO(STB_GLOBAL, STT_FUNC), + // Doesn't really matter, just can't be SHN_UNDEF. + SHN_UNDEF + 1); + + ProcessSection(); + + ASSERT_EQ((size_t)1, externs.size()); + Module::Extern *extern1 = externs[0]; + EXPECT_EQ(kFuncName, extern1->name); + EXPECT_EQ((Module::Address)kFuncAddr, extern1->address); +} + +TEST_P(ELFSymbolsToModuleTest64, MultipleFuncs) { + const string kFuncName1 = "superfunc"; + const uint64_t kFuncAddr1 = 0x1000100010001000ULL; + const uint64_t kFuncSize1 = 0x1000; + const string kFuncName2 = "awesomefunc"; + const uint64_t kFuncAddr2 = 0x2000200020002000ULL; + const uint64_t kFuncSize2 = 0x2f00; + const string kFuncName3 = "megafunc"; + const uint64_t kFuncAddr3 = 0x3000300030003000ULL; + const uint64_t kFuncSize3 = 0x3c00; + + AddElf64Sym(kFuncName1, kFuncAddr1, kFuncSize1, + ELF64_ST_INFO(STB_GLOBAL, STT_FUNC), + // Doesn't really matter, just can't be SHN_UNDEF. + SHN_UNDEF + 1); + AddElf64Sym(kFuncName2, kFuncAddr2, kFuncSize2, + ELF64_ST_INFO(STB_LOCAL, STT_FUNC), + // Doesn't really matter, just can't be SHN_UNDEF. + SHN_UNDEF + 2); + AddElf64Sym(kFuncName3, kFuncAddr3, kFuncSize3, + ELF64_ST_INFO(STB_LOCAL, STT_FUNC), + // Doesn't really matter, just can't be SHN_UNDEF. + SHN_UNDEF + 3); + + ProcessSection(); + + ASSERT_EQ((size_t)3, externs.size()); + Module::Extern *extern1 = externs[0]; + EXPECT_EQ(kFuncName1, extern1->name); + EXPECT_EQ((Module::Address)kFuncAddr1, extern1->address); + Module::Extern *extern2 = externs[1]; + EXPECT_EQ(kFuncName2, extern2->name); + EXPECT_EQ((Module::Address)kFuncAddr2, extern2->address); + Module::Extern *extern3 = externs[2]; + EXPECT_EQ(kFuncName3, extern3->name); + EXPECT_EQ((Module::Address)kFuncAddr3, extern3->address); +} + +TEST_P(ELFSymbolsToModuleTest64, SkipStuff) { + const string kFuncName = "superfunc"; + const uint64_t kFuncAddr = 0x1000100010001000ULL; + const uint64_t kFuncSize = 0x1000; + + // Should skip functions in SHN_UNDEF + AddElf64Sym("skipme", 0xFFFF, 0x10, + ELF64_ST_INFO(STB_GLOBAL, STT_FUNC), + SHN_UNDEF); + AddElf64Sym(kFuncName, kFuncAddr, kFuncSize, + ELF64_ST_INFO(STB_GLOBAL, STT_FUNC), + // Doesn't really matter, just can't be SHN_UNDEF. + SHN_UNDEF + 1); + // Should skip non-STT_FUNC entries. + AddElf64Sym("skipmetoo", 0xAAAA, 0x10, + ELF64_ST_INFO(STB_GLOBAL, STT_FILE), + SHN_UNDEF + 1); + + ProcessSection(); + + ASSERT_EQ((size_t)1, externs.size()); + Module::Extern *extern1 = externs[0]; + EXPECT_EQ(kFuncName, extern1->name); + EXPECT_EQ((Module::Address)kFuncAddr, extern1->address); +} + +// Run all the 64-bit tests with both endianness +INSTANTIATE_TEST_SUITE_P(Endian, + ELFSymbolsToModuleTest64, + ::testing::Values(kLittleEndian, kBigEndian)); diff --git a/src/common/linux/elfutils-inl.h b/src/common/linux/elfutils-inl.h new file mode 100644 index 0000000..5fcc9c4 --- /dev/null +++ b/src/common/linux/elfutils-inl.h @@ -0,0 +1,73 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_LINUX_ELFUTILS_INL_H__ +#define COMMON_LINUX_ELFUTILS_INL_H__ + +#include "common/linux/linux_libc_support.h" +#include "elfutils.h" + +namespace google_breakpad { + +template +const T* GetOffset(const typename ElfClass::Ehdr* elf_header, + typename ElfClass::Off offset) { + return reinterpret_cast(reinterpret_cast(elf_header) + + offset); +} + +template +const typename ElfClass::Shdr* FindElfSectionByName( + const char* name, + typename ElfClass::Word section_type, + const typename ElfClass::Shdr* sections, + const char* section_names, + const char* names_end, + int nsection) { + assert(name != NULL); + assert(sections != NULL); + assert(nsection > 0); + + int name_len = my_strlen(name); + if (name_len == 0) + return NULL; + + for (int i = 0; i < nsection; ++i) { + const char* section_name = section_names + sections[i].sh_name; + if (sections[i].sh_type == section_type && + names_end - section_name >= name_len + 1 && + my_strcmp(name, section_name) == 0) { + return sections + i; + } + } + return NULL; +} + +} // namespace google_breakpad + +#endif // COMMON_LINUX_ELFUTILS_INL_H__ diff --git a/src/common/linux/elfutils.cc b/src/common/linux/elfutils.cc new file mode 100644 index 0000000..95b5db8 --- /dev/null +++ b/src/common/linux/elfutils.cc @@ -0,0 +1,246 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/elfutils.h" + +#include +#include + +#include "common/linux/linux_libc_support.h" +#include "common/linux/elfutils-inl.h" + +namespace google_breakpad { + +namespace { + +template +void FindElfClassSection(const char* elf_base, + const char* section_name, + typename ElfClass::Word section_type, + const void** section_start, + size_t* section_size) { + typedef typename ElfClass::Ehdr Ehdr; + typedef typename ElfClass::Shdr Shdr; + + assert(elf_base); + assert(section_start); + assert(section_size); + + assert(my_strncmp(elf_base, ELFMAG, SELFMAG) == 0); + + const Ehdr* elf_header = reinterpret_cast(elf_base); + assert(elf_header->e_ident[EI_CLASS] == ElfClass::kClass); + + if (elf_header->e_shoff == 0) { + *section_start = NULL; + *section_size = 0; + return; + } + + const Shdr* sections = + GetOffset(elf_header, elf_header->e_shoff); + const Shdr* section_names = sections + elf_header->e_shstrndx; + const char* names = + GetOffset(elf_header, section_names->sh_offset); + const char* names_end = names + section_names->sh_size; + + const Shdr* section = + FindElfSectionByName(section_name, section_type, + sections, names, names_end, + elf_header->e_shnum); + + if (section != NULL && section->sh_size > 0) { + *section_start = elf_base + section->sh_offset; + *section_size = section->sh_size; + } +} + +template +void FindElfClassSegment(const char* elf_base, + typename ElfClass::Word segment_type, + wasteful_vector* segments) { + typedef typename ElfClass::Ehdr Ehdr; + typedef typename ElfClass::Phdr Phdr; + + assert(elf_base); + assert(segments); + + assert(my_strncmp(elf_base, ELFMAG, SELFMAG) == 0); + + const Ehdr* elf_header = reinterpret_cast(elf_base); + assert(elf_header->e_ident[EI_CLASS] == ElfClass::kClass); + + const Phdr* phdrs = + GetOffset(elf_header, elf_header->e_phoff); + + for (int i = 0; i < elf_header->e_phnum; ++i) { + if (phdrs[i].p_type == segment_type) { + ElfSegment seg = {}; + seg.start = elf_base + phdrs[i].p_offset; + seg.size = phdrs[i].p_filesz; + segments->push_back(seg); + } + } +} + +} // namespace + +bool IsValidElf(const void* elf_base) { + return my_strncmp(reinterpret_cast(elf_base), + ELFMAG, SELFMAG) == 0; +} + +int ElfClass(const void* elf_base) { + const ElfW(Ehdr)* elf_header = + reinterpret_cast(elf_base); + + return elf_header->e_ident[EI_CLASS]; +} + +bool FindElfSection(const void* elf_mapped_base, + const char* section_name, + uint32_t section_type, + const void** section_start, + size_t* section_size) { + assert(elf_mapped_base); + assert(section_start); + assert(section_size); + + *section_start = NULL; + *section_size = 0; + + if (!IsValidElf(elf_mapped_base)) + return false; + + int cls = ElfClass(elf_mapped_base); + const char* elf_base = + static_cast(elf_mapped_base); + + if (cls == ELFCLASS32) { + FindElfClassSection(elf_base, section_name, section_type, + section_start, section_size); + return *section_start != NULL; + } else if (cls == ELFCLASS64) { + FindElfClassSection(elf_base, section_name, section_type, + section_start, section_size); + return *section_start != NULL; + } + + return false; +} + +bool FindElfSegments(const void* elf_mapped_base, + uint32_t segment_type, + wasteful_vector* segments) { + assert(elf_mapped_base); + assert(segments); + + if (!IsValidElf(elf_mapped_base)) + return false; + + int cls = ElfClass(elf_mapped_base); + const char* elf_base = + static_cast(elf_mapped_base); + + if (cls == ELFCLASS32) { + FindElfClassSegment(elf_base, segment_type, segments); + return true; + } else if (cls == ELFCLASS64) { + FindElfClassSegment(elf_base, segment_type, segments); + return true; + } + + return false; +} + +template +bool FindElfSoNameFromDynamicSection(const void* section_start, + size_t section_size, + const void* dynstr_start, + size_t dynstr_size, + char* soname, + size_t soname_size) { + typedef typename ElfClass::Dyn Dyn; + + auto* dynamic = static_cast(section_start); + size_t dcount = section_size / sizeof(Dyn); + for (const Dyn* dyn = dynamic; dyn < dynamic + dcount; ++dyn) { + if (dyn->d_tag == DT_SONAME) { + const char* dynstr = static_cast(dynstr_start); + if (dyn->d_un.d_val >= dynstr_size) { + // Beyond the end of the dynstr section + return false; + } + const char* str = dynstr + dyn->d_un.d_val; + const size_t maxsize = dynstr_size - dyn->d_un.d_val; + my_strlcpy(soname, str, maxsize < soname_size ? maxsize : soname_size); + return true; + } + } + + return false; +} + +bool ElfFileSoNameFromMappedFile(const void* elf_base, + char* soname, + size_t soname_size) { + if (!IsValidElf(elf_base)) { + // Not ELF + return false; + } + + const void* segment_start; + size_t segment_size; + if (!FindElfSection(elf_base, ".dynamic", SHT_DYNAMIC, &segment_start, + &segment_size)) { + // No dynamic section + return false; + } + + const void* dynstr_start; + size_t dynstr_size; + if (!FindElfSection(elf_base, ".dynstr", SHT_STRTAB, &dynstr_start, + &dynstr_size)) { + // No dynstr section + return false; + } + + int cls = ElfClass(elf_base); + return cls == ELFCLASS32 ? FindElfSoNameFromDynamicSection( + segment_start, segment_size, dynstr_start, + dynstr_size, soname, soname_size) + : FindElfSoNameFromDynamicSection( + segment_start, segment_size, dynstr_start, + dynstr_size, soname, soname_size); +} + +} // namespace google_breakpad diff --git a/src/common/linux/elfutils.h b/src/common/linux/elfutils.h new file mode 100644 index 0000000..130a8ac --- /dev/null +++ b/src/common/linux/elfutils.h @@ -0,0 +1,169 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// elfutils.h: Utilities for dealing with ELF files. +// + +#ifndef COMMON_LINUX_ELFUTILS_H_ +#define COMMON_LINUX_ELFUTILS_H_ + +#include +#include +#include + +#include "common/memory_allocator.h" + +namespace google_breakpad { + +typedef struct Elf32_Chdr { + typedef Elf32_Word Type; + typedef Elf32_Word Size; + typedef Elf32_Addr Addr; + + static_assert(sizeof (Type) == 4); + static_assert(sizeof (Size) == 4); + static_assert(sizeof (Addr) == 4); + + Type ch_type; // Compression type + Size ch_size; // Uncompressed data size in bytes + Addr ch_addralign; // Uncompressed data alignment +} Elf32_Chdr; + +static_assert(sizeof (Elf32_Chdr) == 12); + +typedef struct Elf64_Chdr { + typedef Elf64_Word Type; + typedef Elf64_Xword Size; + typedef Elf64_Addr Addr; + + static_assert(sizeof (Type) == 4); + static_assert(sizeof (Size) == 8); + static_assert(sizeof (Addr) == 8); + + Type ch_type; // Compression type + Type ch_reserved; // Padding + Size ch_size; // Uncompressed data size in bytes + Addr ch_addralign; // Uncompressed data alignment +} Elf64_Chdr; + +static_assert(sizeof (Elf64_Chdr) == 24); + +// Traits classes so consumers can write templatized code to deal +// with specific ELF bits. +struct ElfClass32 { + typedef Elf32_Addr Addr; + typedef Elf32_Dyn Dyn; + typedef Elf32_Ehdr Ehdr; + typedef Elf32_Nhdr Nhdr; + typedef Elf32_Phdr Phdr; + typedef Elf32_Shdr Shdr; + typedef Elf32_Chdr Chdr; + typedef Elf32_Half Half; + typedef Elf32_Off Off; + typedef Elf32_Sym Sym; + typedef Elf32_Word Word; + + static const int kClass = ELFCLASS32; + static const uint16_t kMachine = EM_386; + static const size_t kAddrSize = sizeof(Elf32_Addr); + static constexpr const char* kMachineName = "x86"; +}; + +struct ElfClass64 { + typedef Elf64_Addr Addr; + typedef Elf64_Dyn Dyn; + typedef Elf64_Ehdr Ehdr; + typedef Elf64_Nhdr Nhdr; + typedef Elf64_Phdr Phdr; + typedef Elf64_Shdr Shdr; + typedef Elf64_Chdr Chdr; + typedef Elf64_Half Half; + typedef Elf64_Off Off; + typedef Elf64_Sym Sym; + typedef Elf64_Word Word; + + static const int kClass = ELFCLASS64; + static const uint16_t kMachine = EM_X86_64; + static const size_t kAddrSize = sizeof(Elf64_Addr); + static constexpr const char* kMachineName = "x86_64"; +}; + +bool IsValidElf(const void* elf_header); +int ElfClass(const void* elf_base); + +// Attempt to find a section named |section_name| of type |section_type| +// in the ELF binary data at |elf_mapped_base|. On success, returns true +// and sets |*section_start| to point to the start of the section data, +// and |*section_size| to the size of the section's data. +bool FindElfSection(const void* elf_mapped_base, + const char* section_name, + uint32_t section_type, + const void** section_start, + size_t* section_size); + +// Internal helper method, exposed for convenience for callers +// that already have more info. +template +const typename ElfClass::Shdr* +FindElfSectionByName(const char* name, + typename ElfClass::Word section_type, + const typename ElfClass::Shdr* sections, + const char* section_names, + const char* names_end, + int nsection); + +struct ElfSegment { + const void* start; + size_t size; +}; + +// Attempt to find all segments of type |segment_type| in the ELF +// binary data at |elf_mapped_base|. On success, returns true and fills +// |*segments| with a list of segments of the given type. +bool FindElfSegments(const void* elf_mapped_base, + uint32_t segment_type, + wasteful_vector* segments); + +// Convert an offset from an Elf header into a pointer to the mapped +// address in the current process. Takes an extra template parameter +// to specify the return type to avoid having to dynamic_cast the +// result. +template +const T* +GetOffset(const typename ElfClass::Ehdr* elf_header, + typename ElfClass::Off offset); + +// Read the value of DT_SONAME from the elf file mapped at |elf_base|. Returns +// true and fills |soname| with the result if found. +bool ElfFileSoNameFromMappedFile(const void* elf_base, + char* soname, + size_t soname_size); + +} // namespace google_breakpad + +#endif // COMMON_LINUX_ELFUTILS_H_ diff --git a/src/common/linux/file_id.cc b/src/common/linux/file_id.cc new file mode 100644 index 0000000..d8fcbd8 --- /dev/null +++ b/src/common/linux/file_id.cc @@ -0,0 +1,206 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// file_id.cc: Return a unique identifier for a file +// +// See file_id.h for documentation +// + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/file_id.h" + +#include +#include +#include + +#include +#include + +#include "common/linux/elf_gnu_compat.h" +#include "common/linux/elfutils.h" +#include "common/linux/linux_libc_support.h" +#include "common/linux/memory_mapped_file.h" +#include "common/using_std_string.h" +#include "third_party/lss/linux_syscall_support.h" + +namespace google_breakpad { +namespace elf { + +// Used in a few places for backwards-compatibility. +const size_t kMDGUIDSize = sizeof(MDGUID); + +FileID::FileID(const char* path) : path_(path) {} + +// ELF note name and desc are 32-bits word padded. +#define NOTE_PADDING(a) ((a + 3) & ~3) + +// These functions are also used inside the crashed process, so be safe +// and use the syscall/libc wrappers instead of direct syscalls or libc. + +static bool ElfClassBuildIDNoteIdentifier(const void* section, size_t length, + wasteful_vector& identifier) { + static_assert(sizeof(ElfClass32::Nhdr) == sizeof(ElfClass64::Nhdr), + "Elf32_Nhdr and Elf64_Nhdr should be the same"); + typedef typename ElfClass32::Nhdr Nhdr; + + const void* section_end = reinterpret_cast(section) + length; + const Nhdr* note_header = reinterpret_cast(section); + while (reinterpret_cast(note_header) < section_end) { + if (note_header->n_type == NT_GNU_BUILD_ID) + break; + note_header = reinterpret_cast( + reinterpret_cast(note_header) + sizeof(Nhdr) + + NOTE_PADDING(note_header->n_namesz) + + NOTE_PADDING(note_header->n_descsz)); + } + if (reinterpret_cast(note_header) >= section_end || + note_header->n_descsz == 0) { + return false; + } + + const uint8_t* build_id = reinterpret_cast(note_header) + + sizeof(Nhdr) + NOTE_PADDING(note_header->n_namesz); + identifier.insert(identifier.end(), + build_id, + build_id + note_header->n_descsz); + + return true; +} + +// Attempt to locate a .note.gnu.build-id section in an ELF binary +// and copy it into |identifier|. +static bool FindElfBuildIDNote(const void* elf_mapped_base, + wasteful_vector& identifier) { + PageAllocator allocator; + // lld normally creates 2 PT_NOTEs, gold normally creates 1. + auto_wasteful_vector segs(&allocator); + if (FindElfSegments(elf_mapped_base, PT_NOTE, &segs)) { + for (ElfSegment& seg : segs) { + if (ElfClassBuildIDNoteIdentifier(seg.start, seg.size, identifier)) { + return true; + } + } + } + + void* note_section; + size_t note_size; + if (FindElfSection(elf_mapped_base, ".note.gnu.build-id", SHT_NOTE, + (const void**)¬e_section, ¬e_size)) { + return ElfClassBuildIDNoteIdentifier(note_section, note_size, identifier); + } + + return false; +} + +// Attempt to locate the .text section of an ELF binary and generate +// a simple hash by XORing the first page worth of bytes into |identifier|. +static bool HashElfTextSection(const void* elf_mapped_base, + wasteful_vector& identifier) { + identifier.resize(kMDGUIDSize); + + void* text_section; + size_t text_size; + if (!FindElfSection(elf_mapped_base, ".text", SHT_PROGBITS, + (const void**)&text_section, &text_size) || + text_size == 0) { + return false; + } + + // Only provide |kMDGUIDSize| bytes to keep identifiers produced by this + // function backwards-compatible. + my_memset(&identifier[0], 0, kMDGUIDSize); + const uint8_t* ptr = reinterpret_cast(text_section); + const uint8_t* ptr_end = ptr + std::min(text_size, static_cast(4096)); + while (ptr < ptr_end) { + for (unsigned i = 0; i < kMDGUIDSize; i++) + identifier[i] ^= ptr[i]; + ptr += kMDGUIDSize; + } + return true; +} + +// static +bool FileID::ElfFileIdentifierFromMappedFile(const void* base, + wasteful_vector& identifier) { + // Look for a build id note first. + if (FindElfBuildIDNote(base, identifier)) + return true; + + // Fall back on hashing the first page of the text section. + return HashElfTextSection(base, identifier); +} + +bool FileID::ElfFileIdentifier(wasteful_vector& identifier) { + MemoryMappedFile mapped_file(path_.c_str(), 0); + if (!mapped_file.data()) // Should probably check if size >= ElfW(Ehdr)? + return false; + + return ElfFileIdentifierFromMappedFile(mapped_file.data(), identifier); +} + +// These three functions are not ever called in an unsafe context, so it's OK +// to allocate memory and use libc. +static string bytes_to_hex_string(const uint8_t* bytes, size_t count) { + string result; + for (unsigned int idx = 0; idx < count; ++idx) { + char buf[3]; + snprintf(buf, sizeof(buf), "%02X", bytes[idx]); + result.append(buf); + } + return result; +} + +// static +string FileID::ConvertIdentifierToUUIDString( + const wasteful_vector& identifier) { + uint8_t identifier_swapped[kMDGUIDSize] = { 0 }; + + // Endian-ness swap to match dump processor expectation. + memcpy(identifier_swapped, &identifier[0], + std::min(kMDGUIDSize, identifier.size())); + uint32_t* data1 = reinterpret_cast(identifier_swapped); + *data1 = htonl(*data1); + uint16_t* data2 = reinterpret_cast(identifier_swapped + 4); + *data2 = htons(*data2); + uint16_t* data3 = reinterpret_cast(identifier_swapped + 6); + *data3 = htons(*data3); + + return bytes_to_hex_string(identifier_swapped, kMDGUIDSize); +} + +// static +string FileID::ConvertIdentifierToString( + const wasteful_vector& identifier) { + return bytes_to_hex_string(&identifier[0], identifier.size()); +} + +} // elf +} // namespace google_breakpad diff --git a/src/common/linux/file_id.h b/src/common/linux/file_id.h new file mode 100644 index 0000000..8e58d56 --- /dev/null +++ b/src/common/linux/file_id.h @@ -0,0 +1,89 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// file_id.h: Return a unique identifier for a file +// + +#ifndef COMMON_LINUX_FILE_ID_H__ +#define COMMON_LINUX_FILE_ID_H__ + +#include +#include + +#include "common/linux/guid_creator.h" +#include "common/memory_allocator.h" +#include "common/using_std_string.h" + +namespace google_breakpad { +namespace elf { + +// GNU binutils' ld defaults to 'sha1', which is 160 bits == 20 bytes, +// so this is enough to fit that, which most binaries will use. +// This is just a sensible default for auto_wasteful_vector so most +// callers can get away with stack allocation. +static const size_t kDefaultBuildIdSize = 20; + +class FileID { + public: + explicit FileID(const char* path); + ~FileID() {} + + // Load the identifier for the elf file path specified in the constructor into + // |identifier|. + // + // The current implementation will look for a .note.gnu.build-id + // section and use that as the file id, otherwise it falls back to + // XORing the first 4096 bytes of the .text section to generate an identifier. + bool ElfFileIdentifier(wasteful_vector& identifier); + + // Load the identifier for the elf file mapped into memory at |base| into + // |identifier|. Return false if the identifier could not be created for this + // file. + static bool ElfFileIdentifierFromMappedFile( + const void* base, + wasteful_vector& identifier); + + // Convert the |identifier| data to a string. The string will + // be formatted as a UUID in all uppercase without dashes. + // (e.g., 22F065BBFC9C49F780FE26A7CEBD7BCE). + static string ConvertIdentifierToUUIDString( + const wasteful_vector& identifier); + + // Convert the entire |identifier| data to a hex string. + static string ConvertIdentifierToString( + const wasteful_vector& identifier); + + private: + // Storage for the path specified + string path_; +}; + +} // namespace elf +} // namespace google_breakpad + +#endif // COMMON_LINUX_FILE_ID_H__ diff --git a/src/common/linux/file_id_unittest.cc b/src/common/linux/file_id_unittest.cc new file mode 100644 index 0000000..0ef4535 --- /dev/null +++ b/src/common/linux/file_id_unittest.cc @@ -0,0 +1,386 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Unit tests for FileID + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include + +#include +#include + +#include "common/linux/elf_gnu_compat.h" +#include "common/linux/elfutils.h" +#include "common/linux/file_id.h" +#include "common/linux/safe_readlink.h" +#include "common/linux/synth_elf.h" +#include "common/test_assembler.h" +#include "common/tests/auto_tempdir.h" +#include "common/tests/file_utils.h" +#include "common/using_std_string.h" +#include "breakpad_googletest_includes.h" + +using namespace google_breakpad; +using google_breakpad::elf::FileID; +using google_breakpad::elf::kDefaultBuildIdSize; +using google_breakpad::synth_elf::ELF; +using google_breakpad::synth_elf::Notes; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Section; +using std::vector; +using ::testing::Types; + +namespace { + +// Simply calling Section::Append(size, byte) produces a uninteresting pattern +// that tends to get hashed to 0000...0000. This populates the section with +// data to produce better hashes. +void PopulateSection(Section* section, int size, int prime_number) { + for (int i = 0; i < size; i++) + section->Append(1, (i % prime_number) % 256); +} + +typedef wasteful_vector id_vector; + +} // namespace + +#ifndef __ANDROID__ +// This test is disabled on Android: It will always fail, since there is no +// 'strip' binary installed on test devices. +TEST(FileIDStripTest, StripSelf) { + // Calculate the File ID of this binary using + // FileID::ElfFileIdentifier, then make a copy of this binary, + // strip it, and ensure that the result is the same. + char exe_name[PATH_MAX]; + ASSERT_TRUE(SafeReadLink("/proc/self/exe", exe_name)); + + // copy our binary to a temp file, and strip it + AutoTempDir temp_dir; + string templ = temp_dir.path() + "/file-id-unittest"; + ASSERT_TRUE(CopyFile(exe_name, templ)); + pid_t pid; + char* argv[] = { + const_cast("strip"), + const_cast(templ.c_str()), + nullptr, + }; + ASSERT_EQ(0, posix_spawnp(&pid, argv[0], nullptr, nullptr, argv, nullptr)); + int status; + ASSERT_EQ(pid, waitpid(pid, &status, 0)); + ASSERT_TRUE(WIFEXITED(status)); + ASSERT_EQ(0, WEXITSTATUS(status)); + + PageAllocator allocator; + id_vector identifier1(&allocator, kDefaultBuildIdSize); + id_vector identifier2(&allocator, kDefaultBuildIdSize); + + FileID fileid1(exe_name); + EXPECT_TRUE(fileid1.ElfFileIdentifier(identifier1)); + FileID fileid2(templ.c_str()); + EXPECT_TRUE(fileid2.ElfFileIdentifier(identifier2)); + + string identifier_string1 = + FileID::ConvertIdentifierToUUIDString(identifier1); + string identifier_string2 = + FileID::ConvertIdentifierToUUIDString(identifier2); + EXPECT_EQ(identifier_string1, identifier_string2); +} +#endif // !__ANDROID__ + +template +class FileIDTest : public testing::Test { +public: + void GetElfContents(ELF& elf) { + string contents; + ASSERT_TRUE(elf.GetContents(&contents)); + ASSERT_LT(0U, contents.size()); + + elfdata_v.clear(); + elfdata_v.insert(elfdata_v.begin(), contents.begin(), contents.end()); + elfdata = &elfdata_v[0]; + } + + id_vector make_vector() { + return id_vector(&allocator, kDefaultBuildIdSize); + } + + template + string get_file_id(const uint8_t (&data)[N]) { + id_vector expected_identifier(make_vector()); + expected_identifier.insert(expected_identifier.end(), + &data[0], + data + N); + return FileID::ConvertIdentifierToUUIDString(expected_identifier); + } + + vector elfdata_v; + uint8_t* elfdata; + PageAllocator allocator; +}; + +typedef Types ElfClasses; + +TYPED_TEST_SUITE(FileIDTest, ElfClasses); + +TYPED_TEST(FileIDTest, ElfClass) { + const char expected_identifier_string[] = + "80808080808000000000008080808080"; + const size_t kTextSectionSize = 128; + + ELF elf(EM_386, TypeParam::kClass, kLittleEndian); + Section text(kLittleEndian); + for (size_t i = 0; i < kTextSectionSize; ++i) { + text.D8(i * 3); + } + elf.AddSection(".text", text, SHT_PROGBITS); + elf.Finish(); + this->GetElfContents(elf); + + id_vector identifier(this->make_vector()); + EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, + identifier)); + + string identifier_string = FileID::ConvertIdentifierToUUIDString(identifier); + EXPECT_EQ(expected_identifier_string, identifier_string); +} + +TYPED_TEST(FileIDTest, BuildID) { + const uint8_t kExpectedIdentifierBytes[] = + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13}; + const string expected_identifier_string = + this->get_file_id(kExpectedIdentifierBytes); + + ELF elf(EM_386, TypeParam::kClass, kLittleEndian); + Section text(kLittleEndian); + text.Append(4096, 0); + elf.AddSection(".text", text, SHT_PROGBITS); + Notes notes(kLittleEndian); + notes.AddNote(NT_GNU_BUILD_ID, "GNU", kExpectedIdentifierBytes, + sizeof(kExpectedIdentifierBytes)); + elf.AddSection(".note.gnu.build-id", notes, SHT_NOTE); + elf.Finish(); + this->GetElfContents(elf); + + id_vector identifier(this->make_vector()); + EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, + identifier)); + EXPECT_EQ(sizeof(kExpectedIdentifierBytes), identifier.size()); + + string identifier_string = FileID::ConvertIdentifierToUUIDString(identifier); + EXPECT_EQ(expected_identifier_string, identifier_string); +} + +// Test that a build id note with fewer bytes than usual is handled. +TYPED_TEST(FileIDTest, BuildIDShort) { + const uint8_t kExpectedIdentifierBytes[] = + {0x00, 0x01, 0x02, 0x03}; + const string expected_identifier_string = + this->get_file_id(kExpectedIdentifierBytes); + + ELF elf(EM_386, TypeParam::kClass, kLittleEndian); + Section text(kLittleEndian); + text.Append(4096, 0); + elf.AddSection(".text", text, SHT_PROGBITS); + Notes notes(kLittleEndian); + notes.AddNote(NT_GNU_BUILD_ID, "GNU", kExpectedIdentifierBytes, + sizeof(kExpectedIdentifierBytes)); + elf.AddSection(".note.gnu.build-id", notes, SHT_NOTE); + elf.Finish(); + this->GetElfContents(elf); + + id_vector identifier(this->make_vector()); + EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, + identifier)); + EXPECT_EQ(sizeof(kExpectedIdentifierBytes), identifier.size()); + + string identifier_string = FileID::ConvertIdentifierToUUIDString(identifier); + EXPECT_EQ(expected_identifier_string, identifier_string); +} + +// Test that a build id note with more bytes than usual is handled. +TYPED_TEST(FileIDTest, BuildIDLong) { + const uint8_t kExpectedIdentifierBytes[] = + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F}; + const string expected_identifier_string = + this->get_file_id(kExpectedIdentifierBytes); + + ELF elf(EM_386, TypeParam::kClass, kLittleEndian); + Section text(kLittleEndian); + text.Append(4096, 0); + elf.AddSection(".text", text, SHT_PROGBITS); + Notes notes(kLittleEndian); + notes.AddNote(NT_GNU_BUILD_ID, "GNU", kExpectedIdentifierBytes, + sizeof(kExpectedIdentifierBytes)); + elf.AddSection(".note.gnu.build-id", notes, SHT_NOTE); + elf.Finish(); + this->GetElfContents(elf); + + id_vector identifier(this->make_vector()); + EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, + identifier)); + EXPECT_EQ(sizeof(kExpectedIdentifierBytes), identifier.size()); + + string identifier_string = FileID::ConvertIdentifierToUUIDString(identifier); + EXPECT_EQ(expected_identifier_string, identifier_string); +} + +TYPED_TEST(FileIDTest, BuildIDPH) { + const uint8_t kExpectedIdentifierBytes[] = + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13}; + const string expected_identifier_string = + this->get_file_id(kExpectedIdentifierBytes); + + ELF elf(EM_386, TypeParam::kClass, kLittleEndian); + Section text(kLittleEndian); + text.Append(4096, 0); + elf.AddSection(".text", text, SHT_PROGBITS); + Notes notes(kLittleEndian); + notes.AddNote(0, "Linux", + reinterpret_cast("\0x42\0x02\0\0"), 4); + notes.AddNote(NT_GNU_BUILD_ID, "GNU", kExpectedIdentifierBytes, + sizeof(kExpectedIdentifierBytes)); + int note_idx = elf.AddSection(".note", notes, SHT_NOTE); + elf.AddSegment(note_idx, note_idx, PT_NOTE); + elf.Finish(); + this->GetElfContents(elf); + + id_vector identifier(this->make_vector()); + EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, + identifier)); + EXPECT_EQ(sizeof(kExpectedIdentifierBytes), identifier.size()); + + string identifier_string = FileID::ConvertIdentifierToUUIDString(identifier); + EXPECT_EQ(expected_identifier_string, identifier_string); +} + +TYPED_TEST(FileIDTest, BuildIDMultiplePH) { + const uint8_t kExpectedIdentifierBytes[] = + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13}; + const string expected_identifier_string = + this->get_file_id(kExpectedIdentifierBytes); + + ELF elf(EM_386, TypeParam::kClass, kLittleEndian); + Section text(kLittleEndian); + text.Append(4096, 0); + elf.AddSection(".text", text, SHT_PROGBITS); + Notes notes1(kLittleEndian); + notes1.AddNote(0, "Linux", + reinterpret_cast("\0x42\0x02\0\0"), 4); + Notes notes2(kLittleEndian); + notes2.AddNote(NT_GNU_BUILD_ID, "GNU", kExpectedIdentifierBytes, + sizeof(kExpectedIdentifierBytes)); + int note1_idx = elf.AddSection(".note1", notes1, SHT_NOTE); + int note2_idx = elf.AddSection(".note2", notes2, SHT_NOTE); + elf.AddSegment(note1_idx, note1_idx, PT_NOTE); + elf.AddSegment(note2_idx, note2_idx, PT_NOTE); + elf.Finish(); + this->GetElfContents(elf); + + id_vector identifier(this->make_vector()); + EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, + identifier)); + EXPECT_EQ(sizeof(kExpectedIdentifierBytes), identifier.size()); + + string identifier_string = FileID::ConvertIdentifierToUUIDString(identifier); + EXPECT_EQ(expected_identifier_string, identifier_string); +} + +// Test to make sure two files with different text sections produce +// different hashes when not using a build id. +TYPED_TEST(FileIDTest, UniqueHashes) { + { + ELF elf1(EM_386, TypeParam::kClass, kLittleEndian); + Section foo_1(kLittleEndian); + PopulateSection(&foo_1, 32, 5); + elf1.AddSection(".foo", foo_1, SHT_PROGBITS); + Section text_1(kLittleEndian); + PopulateSection(&text_1, 4096, 17); + elf1.AddSection(".text", text_1, SHT_PROGBITS); + elf1.Finish(); + this->GetElfContents(elf1); + } + + id_vector identifier_1(this->make_vector()); + EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, + identifier_1)); + string identifier_string_1 = + FileID::ConvertIdentifierToUUIDString(identifier_1); + + { + ELF elf2(EM_386, TypeParam::kClass, kLittleEndian); + Section text_2(kLittleEndian); + Section foo_2(kLittleEndian); + PopulateSection(&foo_2, 32, 5); + elf2.AddSection(".foo", foo_2, SHT_PROGBITS); + PopulateSection(&text_2, 4096, 31); + elf2.AddSection(".text", text_2, SHT_PROGBITS); + elf2.Finish(); + this->GetElfContents(elf2); + } + + id_vector identifier_2(this->make_vector()); + EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata, + identifier_2)); + string identifier_string_2 = + FileID::ConvertIdentifierToUUIDString(identifier_2); + + EXPECT_NE(identifier_string_1, identifier_string_2); +} + +TYPED_TEST(FileIDTest, ConvertIdentifierToString) { + const uint8_t kIdentifierBytes[] = + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F}; + const char* kExpected = + "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"; + + id_vector identifier(this->make_vector()); + identifier.insert(identifier.end(), + kIdentifierBytes, + kIdentifierBytes + sizeof(kIdentifierBytes)); + ASSERT_EQ(kExpected, + FileID::ConvertIdentifierToString(identifier)); +} diff --git a/src/common/linux/google_crashdump_uploader.cc b/src/common/linux/google_crashdump_uploader.cc new file mode 100644 index 0000000..8c5e049 --- /dev/null +++ b/src/common/linux/google_crashdump_uploader.cc @@ -0,0 +1,212 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/google_crashdump_uploader.h" + +#include +#include +#include + +#include +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +GoogleCrashdumpUploader::GoogleCrashdumpUploader(const string& product, + const string& version, + const string& guid, + const string& ptime, + const string& ctime, + const string& email, + const string& comments, + const string& minidump_pathname, + const string& crash_server, + const string& proxy_host, + const string& proxy_userpassword) { + std::unique_ptr http_layer{new LibcurlWrapper()}; + Init(product, + version, + guid, + ptime, + ctime, + email, + comments, + minidump_pathname, + crash_server, + proxy_host, + proxy_userpassword, + std::move(http_layer)); +} + +GoogleCrashdumpUploader::GoogleCrashdumpUploader( + const string& product, + const string& version, + const string& guid, + const string& ptime, + const string& ctime, + const string& email, + const string& comments, + const string& minidump_pathname, + const string& crash_server, + const string& proxy_host, + const string& proxy_userpassword, + std::unique_ptr http_layer) { + Init(product, + version, + guid, + ptime, + ctime, + email, + comments, + minidump_pathname, + crash_server, + proxy_host, + proxy_userpassword, + std::move(http_layer)); +} + +void GoogleCrashdumpUploader::Init(const string& product, + const string& version, + const string& guid, + const string& ptime, + const string& ctime, + const string& email, + const string& comments, + const string& minidump_pathname, + const string& crash_server, + const string& proxy_host, + const string& proxy_userpassword, + std::unique_ptr http_layer) { + product_ = product; + version_ = version; + guid_ = guid; + ptime_ = ptime; + ctime_ = ctime; + email_ = email; + comments_ = comments; + http_layer_ = std::move(http_layer); + + crash_server_ = crash_server; + proxy_host_ = proxy_host; + proxy_userpassword_ = proxy_userpassword; + minidump_pathname_ = minidump_pathname; + std::cout << "Uploader initializing"; + std::cout << "\tProduct: " << product_; + std::cout << "\tVersion: " << version_; + std::cout << "\tGUID: " << guid_; + if (!ptime_.empty()) { + std::cout << "\tProcess uptime: " << ptime_; + } + if (!ctime_.empty()) { + std::cout << "\tCumulative Process uptime: " << ctime_; + } + if (!email_.empty()) { + std::cout << "\tEmail: " << email_; + } + if (!comments_.empty()) { + std::cout << "\tComments: " << comments_; + } +} + +bool GoogleCrashdumpUploader::CheckRequiredParametersArePresent() { + string error_text; + if (product_.empty()) { + error_text.append("\nProduct name must be specified."); + } + + if (version_.empty()) { + error_text.append("\nProduct version must be specified."); + } + + if (guid_.empty()) { + error_text.append("\nClient ID must be specified."); + } + + if (minidump_pathname_.empty()) { + error_text.append("\nMinidump pathname must be specified."); + } + + if (!error_text.empty()) { + std::cout << error_text; + return false; + } + return true; + +} + +bool GoogleCrashdumpUploader::Upload(int* http_status_code, + string* http_response_header, + string* http_response_body) { + bool ok = http_layer_->Init(); + if (!ok) { + std::cout << "http layer init failed"; + return ok; + } + + if (!CheckRequiredParametersArePresent()) { + return false; + } + + struct stat st; + int err = stat(minidump_pathname_.c_str(), &st); + if (err) { + std::cout << minidump_pathname_ << " could not be found"; + return false; + } + + parameters_["prod"] = product_; + parameters_["ver"] = version_; + parameters_["guid"] = guid_; + parameters_["ptime"] = ptime_; + parameters_["ctime"] = ctime_; + parameters_["email"] = email_; + parameters_["comments_"] = comments_; + if (!http_layer_->AddFile(minidump_pathname_, + "upload_file_minidump")) { + return false; + } + std::cout << "Sending request to " << crash_server_; + long status_code; + bool success = http_layer_->SendRequest(crash_server_, + parameters_, + &status_code, + http_response_header, + http_response_body); + if (http_status_code) { + *http_status_code = status_code; + } + return success; +} +} diff --git a/src/common/linux/google_crashdump_uploader.h b/src/common/linux/google_crashdump_uploader.h new file mode 100644 index 0000000..74b5e1b --- /dev/null +++ b/src/common/linux/google_crashdump_uploader.h @@ -0,0 +1,106 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +#ifndef COMMON_LINUX_GOOGLE_CRASHDUMP_UPLOADER_H_ +#define COMMON_LINUX_GOOGLE_CRASHDUMP_UPLOADER_H_ + +#include +#include +#include + +#include "common/linux/libcurl_wrapper.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +class GoogleCrashdumpUploader { + public: + GoogleCrashdumpUploader(const string& product, + const string& version, + const string& guid, + const string& ptime, + const string& ctime, + const string& email, + const string& comments, + const string& minidump_pathname, + const string& crash_server, + const string& proxy_host, + const string& proxy_userpassword); + + GoogleCrashdumpUploader(const string& product, + const string& version, + const string& guid, + const string& ptime, + const string& ctime, + const string& email, + const string& comments, + const string& minidump_pathname, + const string& crash_server, + const string& proxy_host, + const string& proxy_userpassword, + std::unique_ptr http_layer); + + void Init(const string& product, + const string& version, + const string& guid, + const string& ptime, + const string& ctime, + const string& email, + const string& comments, + const string& minidump_pathname, + const string& crash_server, + const string& proxy_host, + const string& proxy_userpassword, + std::unique_ptr http_layer); + bool Upload(int* http_status_code, + string* http_response_header, + string* http_response_body); + + private: + bool CheckRequiredParametersArePresent(); + + std::unique_ptr http_layer_; + string product_; + string version_; + string guid_; + string ptime_; + string ctime_; + string email_; + string comments_; + string minidump_pathname_; + + string crash_server_; + string proxy_host_; + string proxy_userpassword_; + + std::map parameters_; +}; +} + +#endif // COMMON_LINUX_GOOGLE_CRASHDUMP_UPLOADER_H_ diff --git a/src/common/linux/google_crashdump_uploader_test.cc b/src/common/linux/google_crashdump_uploader_test.cc new file mode 100644 index 0000000..e81f21d --- /dev/null +++ b/src/common/linux/google_crashdump_uploader_test.cc @@ -0,0 +1,147 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Unit test for crash dump uploader. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "common/linux/google_crashdump_uploader.h" +#include "breakpad_googletest_includes.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +using ::testing::Return; +using ::testing::_; + +class MockLibcurlWrapper : public LibcurlWrapper { + public: + MOCK_METHOD0(Init, bool()); + MOCK_METHOD2(SetProxy, bool(const string& proxy_host, + const string& proxy_userpwd)); + MOCK_METHOD2(AddFile, bool(const string& upload_file_path, + const string& basename)); + MOCK_METHOD5(SendRequest, + bool(const string& url, + const std::map& parameters, + long* http_status_code, + string* http_header_data, + string* http_response_data)); +}; + +class GoogleCrashdumpUploaderTest : public ::testing::Test { +}; + +TEST_F(GoogleCrashdumpUploaderTest, InitFailsCausesUploadFailure) { + std::unique_ptr m{new MockLibcurlWrapper()}; + EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(false)); + GoogleCrashdumpUploader uploader("foobar", "1.0", "AAA-BBB", "", "", + "test@test.com", "none", "/tmp/foo.dmp", + "http://foo.com", "", "", std::move(m)); + ASSERT_FALSE(uploader.Upload(NULL, NULL, NULL)); +} + +TEST_F(GoogleCrashdumpUploaderTest, TestSendRequestHappensWithValidParameters) { + // Create a temp file + char tempfn[80] = "/tmp/googletest-upload-XXXXXX"; + int fd = mkstemp(tempfn); + ASSERT_NE(fd, -1); + close(fd); + + std::unique_ptr m{new MockLibcurlWrapper()}; + EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*m, AddFile(tempfn, _)).WillOnce(Return(true)); + EXPECT_CALL(*m, SendRequest("http://foo.com", _, _, _, _)) + .Times(1) + .WillOnce(Return(true)); + GoogleCrashdumpUploader uploader("foobar", "1.0", "AAA-BBB", "", "", + "test@test.com", "none", tempfn, + "http://foo.com", "", "", std::move(m)); + ASSERT_TRUE(uploader.Upload(NULL, NULL, NULL)); +} + + +TEST_F(GoogleCrashdumpUploaderTest, InvalidPathname) { + std::unique_ptr m{new MockLibcurlWrapper()}; + EXPECT_CALL(*m, Init()).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*m, SendRequest(_,_,_,_,_)).Times(0); + GoogleCrashdumpUploader uploader("foobar", "1.0", "AAA-BBB", "", "", + "test@test.com", "none", "/tmp/foo.dmp", + "http://foo.com", "", "", std::move(m)); + ASSERT_FALSE(uploader.Upload(NULL, NULL, NULL)); +} + +TEST_F(GoogleCrashdumpUploaderTest, TestRequiredParametersMustBePresent) { + // Test with empty product name. + GoogleCrashdumpUploader uploader("", + "1.0", + "AAA-BBB", + "", + "", + "test@test.com", + "none", + "/tmp/foo.dmp", + "http://foo.com", + "", + ""); + ASSERT_FALSE(uploader.Upload(NULL, NULL, NULL)); + + // Test with empty product version. + GoogleCrashdumpUploader uploader1("product", + "", + "AAA-BBB", + "", + "", + "", + "", + "/tmp/foo.dmp", + "", + "", + ""); + + ASSERT_FALSE(uploader1.Upload(NULL, NULL, NULL)); + + // Test with empty client GUID. + GoogleCrashdumpUploader uploader2("product", + "1.0", + "", + "", + "", + "", + "", + "/tmp/foo.dmp", + "", + "", + ""); + ASSERT_FALSE(uploader2.Upload(NULL, NULL, NULL)); +} +} diff --git a/src/common/linux/guid_creator.cc b/src/common/linux/guid_creator.cc new file mode 100644 index 0000000..8635f9d --- /dev/null +++ b/src/common/linux/guid_creator.cc @@ -0,0 +1,188 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/eintr_wrapper.h" +#include "common/linux/guid_creator.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(HAVE_SYS_RANDOM_H) +#include +#endif + +// +// GUIDGenerator +// +// This class is used to generate random GUID. +// Currently use random number to generate a GUID since Linux has +// no native GUID generator. This should be OK since we don't expect +// crash to happen very offen. +// +class GUIDGenerator { + public: + static uint32_t BytesToUInt32(const uint8_t bytes[]) { + return ((uint32_t) bytes[0] + | ((uint32_t) bytes[1] << 8) + | ((uint32_t) bytes[2] << 16) + | ((uint32_t) bytes[3] << 24)); + } + + static void UInt32ToBytes(uint8_t bytes[], uint32_t n) { + bytes[0] = n & 0xff; + bytes[1] = (n >> 8) & 0xff; + bytes[2] = (n >> 16) & 0xff; + bytes[3] = (n >> 24) & 0xff; + } + + static bool CreateGUID(GUID *guid) { +#if defined(HAVE_ARC4RANDOM) // Android, BSD, ... + CreateGuidFromArc4Random(guid); +#else // Linux + bool success = false; + +#if defined(HAVE_SYS_RANDOM_H) && defined(HAVE_GETRANDOM) + success = CreateGUIDFromGetrandom(guid); +#endif // HAVE_SYS_RANDOM_H && HAVE_GETRANDOM + if (!success) { + success = CreateGUIDFromDevUrandom(guid); + } + + if (!success) { + CreateGUIDFromRand(guid); + success = true; + } +#endif + + // Put in the version according to RFC 4122. + guid->data3 &= 0x0fff; + guid->data3 |= 0x4000; + + // Put in the variant according to RFC 4122. + guid->data4[0] &= 0x3f; + guid->data4[0] |= 0x80; + + return true; + } + + private: +#ifdef HAVE_ARC4RANDOM + static void CreateGuidFromArc4Random(GUID *guid) { + char *buf = reinterpret_cast(guid); + + for (size_t i = 0; i < sizeof(GUID); i += sizeof(uint32_t)) { + uint32_t random_data = arc4random(); + + memcpy(buf + i, &random_data, sizeof(uint32_t)); + } + } +#else + static void InitOnce() { + pthread_once(&once_control, &InitOnceImpl); + } + + static void InitOnceImpl() { + // time(NULL) is a very poor seed, so lacking anything better mix an + // address into it. We drop the four rightmost bits as they're likely to + // be 0 on almost all architectures. + srand(time(NULL) | ((uintptr_t)&once_control >> 4)); + } + + static pthread_once_t once_control; + +#if defined(HAVE_SYS_RANDOM_H) && defined(HAVE_GETRANDOM) + static bool CreateGUIDFromGetrandom(GUID *guid) { + char *buf = reinterpret_cast(guid); + int read_bytes = getrandom(buf, sizeof(GUID), GRND_NONBLOCK); + + return (read_bytes == static_cast(sizeof(GUID))); + } +#endif // HAVE_SYS_RANDOM_H && HAVE_GETRANDOM + + // Populate the GUID using random bytes read from /dev/urandom, returns false + // if the GUID wasn't fully populated with random data. + static bool CreateGUIDFromDevUrandom(GUID *guid) { + char *buf = reinterpret_cast(guid); + int fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC); + + if (fd == -1) { + return false; + } + + ssize_t read_bytes = HANDLE_EINTR(read(fd, buf, sizeof(GUID))); + close(fd); + + return (read_bytes == static_cast(sizeof(GUID))); + } + + // Populate the GUID using a stream of random bytes obtained from rand(). + static void CreateGUIDFromRand(GUID *guid) { + char *buf = reinterpret_cast(guid); + + InitOnce(); + + for (size_t i = 0; i < sizeof(GUID); i++) { + buf[i] = rand(); + } + } +#endif +}; + +#ifndef HAVE_ARC4RANDOM +pthread_once_t GUIDGenerator::once_control = PTHREAD_ONCE_INIT; +#endif + +bool CreateGUID(GUID *guid) { + return GUIDGenerator::CreateGUID(guid); +} + +// Parse guid to string. +bool GUIDToString(const GUID *guid, char *buf, int buf_len) { + // Should allow more space the the max length of GUID. + assert(buf_len > kGUIDStringLength); + int num = snprintf(buf, buf_len, kGUIDFormatString, + guid->data1, guid->data2, guid->data3, + GUIDGenerator::BytesToUInt32(&(guid->data4[0])), + GUIDGenerator::BytesToUInt32(&(guid->data4[4]))); + if (num != kGUIDStringLength) + return false; + + buf[num] = '\0'; + return true; +} diff --git a/src/common/linux/guid_creator.h b/src/common/linux/guid_creator.h new file mode 100644 index 0000000..c02f555 --- /dev/null +++ b/src/common/linux/guid_creator.h @@ -0,0 +1,47 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_LINUX_GUID_CREATOR_H__ +#define COMMON_LINUX_GUID_CREATOR_H__ + +#include "google_breakpad/common/minidump_format.h" + +typedef MDGUID GUID; + +// Format string for parsing GUID. +#define kGUIDFormatString "%08x-%04x-%04x-%08x-%08x" +// Length of GUID string. Don't count the ending '\0'. +#define kGUIDStringLength 36 + +// Create a guid. +bool CreateGUID(GUID *guid); + +// Get the string from guid. +bool GUIDToString(const GUID *guid, char *buf, int buf_len); + +#endif diff --git a/src/common/linux/http_upload.cc b/src/common/linux/http_upload.cc new file mode 100644 index 0000000..0a5bdb5 --- /dev/null +++ b/src/common/linux/http_upload.cc @@ -0,0 +1,233 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/http_upload.h" + +#include +#include +#include "third_party/curl/curl.h" + +namespace { + +// Callback to get the response data from server. +static size_t WriteCallback(void* ptr, size_t size, + size_t nmemb, void* userp) { + if (!userp) + return 0; + + string* response = reinterpret_cast(userp); + size_t real_size = size * nmemb; + response->append(reinterpret_cast(ptr), real_size); + return real_size; +} + +} // namespace + +namespace google_breakpad { + +static const char kUserAgent[] = "Breakpad/1.0 (Linux)"; + +// static +bool HTTPUpload::SendRequest(const string& url, + const map& parameters, + const map& files, + const string& proxy, + const string& proxy_user_pwd, + const string& ca_certificate_file, + string* response_body, + long* response_code, + string* error_description) { + if (response_code != NULL) + *response_code = 0; + + if (!CheckParameters(parameters)) + return false; + + // We may have been linked statically; if curl_easy_init is in the + // current binary, no need to search for a dynamic version. + void* curl_lib = dlopen(NULL, RTLD_NOW); + if (!CheckCurlLib(curl_lib)) { + fprintf(stderr, + "Failed to open curl lib from binary, use libcurl.so instead\n"); + dlerror(); // Clear dlerror before attempting to open libraries. + dlclose(curl_lib); + curl_lib = NULL; + } + if (!curl_lib) { + curl_lib = dlopen("libcurl.so", RTLD_NOW); + } + if (!curl_lib) { + if (error_description != NULL) + *error_description = dlerror(); + curl_lib = dlopen("libcurl.so.4", RTLD_NOW); + } + if (!curl_lib) { + // Debian gives libcurl a different name when it is built against GnuTLS + // instead of OpenSSL. + curl_lib = dlopen("libcurl-gnutls.so.4", RTLD_NOW); + } + if (!curl_lib) { + curl_lib = dlopen("libcurl.so.3", RTLD_NOW); + } + if (!curl_lib) { + return false; + } + + CURL* (*curl_easy_init)(void); + *(void**) (&curl_easy_init) = dlsym(curl_lib, "curl_easy_init"); + CURL* curl = (*curl_easy_init)(); + if (error_description != NULL) + *error_description = "No Error"; + + if (!curl) { + dlclose(curl_lib); + return false; + } + + CURLcode err_code = CURLE_OK; + CURLcode (*curl_easy_setopt)(CURL*, CURLoption, ...); + *(void**) (&curl_easy_setopt) = dlsym(curl_lib, "curl_easy_setopt"); + (*curl_easy_setopt)(curl, CURLOPT_URL, url.c_str()); + (*curl_easy_setopt)(curl, CURLOPT_USERAGENT, kUserAgent); + // Support multithread by disabling timeout handling, would get SIGSEGV with + // Curl_resolv_timeout in stack trace otherwise. + // See https://curl.haxx.se/libcurl/c/threadsafe.html + (*curl_easy_setopt)(curl, CURLOPT_NOSIGNAL, 1); + // Set proxy information if necessary. + if (!proxy.empty()) + (*curl_easy_setopt)(curl, CURLOPT_PROXY, proxy.c_str()); + if (!proxy_user_pwd.empty()) + (*curl_easy_setopt)(curl, CURLOPT_PROXYUSERPWD, proxy_user_pwd.c_str()); + + if (!ca_certificate_file.empty()) + (*curl_easy_setopt)(curl, CURLOPT_CAINFO, ca_certificate_file.c_str()); + + struct curl_httppost* formpost = NULL; + struct curl_httppost* lastptr = NULL; + // Add form data. + CURLFORMcode (*curl_formadd)(struct curl_httppost**, struct curl_httppost**, ...); + *(void**) (&curl_formadd) = dlsym(curl_lib, "curl_formadd"); + map::const_iterator iter = parameters.begin(); + for (; iter != parameters.end(); ++iter) + (*curl_formadd)(&formpost, &lastptr, + CURLFORM_COPYNAME, iter->first.c_str(), + CURLFORM_COPYCONTENTS, iter->second.c_str(), + CURLFORM_END); + + // Add form files. + for (iter = files.begin(); iter != files.end(); ++iter) { + (*curl_formadd)(&formpost, &lastptr, + CURLFORM_COPYNAME, iter->first.c_str(), + CURLFORM_FILE, iter->second.c_str(), + CURLFORM_END); + } + + (*curl_easy_setopt)(curl, CURLOPT_HTTPPOST, formpost); + + // Disable 100-continue header. + struct curl_slist* headerlist = NULL; + char buf[] = "Expect:"; + struct curl_slist* (*curl_slist_append)(struct curl_slist*, const char*); + *(void**) (&curl_slist_append) = dlsym(curl_lib, "curl_slist_append"); + headerlist = (*curl_slist_append)(headerlist, buf); + (*curl_easy_setopt)(curl, CURLOPT_HTTPHEADER, headerlist); + + if (response_body != NULL) { + (*curl_easy_setopt)(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + (*curl_easy_setopt)(curl, CURLOPT_WRITEDATA, + reinterpret_cast(response_body)); + } + + // Fail if 400+ is returned from the web server. + (*curl_easy_setopt)(curl, CURLOPT_FAILONERROR, 1); + + CURLcode (*curl_easy_perform)(CURL*); + *(void**) (&curl_easy_perform) = dlsym(curl_lib, "curl_easy_perform"); + err_code = (*curl_easy_perform)(curl); + if (response_code != NULL) { + CURLcode (*curl_easy_getinfo)(CURL*, CURLINFO, ...); + *(void**) (&curl_easy_getinfo) = dlsym(curl_lib, "curl_easy_getinfo"); + (*curl_easy_getinfo)(curl, CURLINFO_RESPONSE_CODE, response_code); + } + const char* (*curl_easy_strerror)(CURLcode); + *(void**) (&curl_easy_strerror) = dlsym(curl_lib, "curl_easy_strerror"); +#ifndef NDEBUG + if (err_code != CURLE_OK) + fprintf(stderr, "Failed to send http request to %s, error: %s\n", + url.c_str(), + (*curl_easy_strerror)(err_code)); +#endif + if (error_description != NULL) + *error_description = (*curl_easy_strerror)(err_code); + + void (*curl_easy_cleanup)(CURL*); + *(void**) (&curl_easy_cleanup) = dlsym(curl_lib, "curl_easy_cleanup"); + (*curl_easy_cleanup)(curl); + if (formpost != NULL) { + void (*curl_formfree)(struct curl_httppost*); + *(void**) (&curl_formfree) = dlsym(curl_lib, "curl_formfree"); + (*curl_formfree)(formpost); + } + if (headerlist != NULL) { + void (*curl_slist_free_all)(struct curl_slist*); + *(void**) (&curl_slist_free_all) = dlsym(curl_lib, "curl_slist_free_all"); + (*curl_slist_free_all)(headerlist); + } + dlclose(curl_lib); + return err_code == CURLE_OK; +} + +// static +bool HTTPUpload::CheckCurlLib(void* curl_lib) { + return curl_lib && + dlsym(curl_lib, "curl_easy_init") && + dlsym(curl_lib, "curl_easy_setopt"); +} + +// static +bool HTTPUpload::CheckParameters(const map& parameters) { + for (map::const_iterator pos = parameters.begin(); + pos != parameters.end(); ++pos) { + const string& str = pos->first; + if (str.size() == 0) + return false; // disallow empty parameter names + for (unsigned int i = 0; i < str.size(); ++i) { + int c = str[i]; + if (c < 32 || c == '"' || c > 127) { + return false; + } + } + } + return true; +} + +} // namespace google_breakpad diff --git a/src/common/linux/http_upload.h b/src/common/linux/http_upload.h new file mode 100644 index 0000000..b7e557a --- /dev/null +++ b/src/common/linux/http_upload.h @@ -0,0 +1,89 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// HTTPUpload provides a "nice" API to send a multipart HTTP(S) POST +// request using libcurl. It currently supports requests that contain +// a set of string parameters (key/value pairs), and a file to upload. + +#ifndef COMMON_LINUX_HTTP_UPLOAD_H__ +#define COMMON_LINUX_HTTP_UPLOAD_H__ + +#include +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +using std::map; + +class HTTPUpload { + public: + // Sends the given sets of parameters and files as a multipart POST + // request to the given URL. + // Each key in |files| is the name of the file part of the request + // (i.e. it corresponds to the name= attribute on an . + // Parameter names must contain only printable ASCII characters, + // and may not contain a quote (") character. + // Only HTTP(S) URLs are currently supported. Returns true on success. + // If the request is successful and response_body is non-NULL, + // the response body will be returned in response_body. + // If response_code is non-NULL, it will be set to the HTTP response code + // received (or 0 if the request failed before getting an HTTP response). + // If the send fails, a description of the error will be + // returned in error_description. + static bool SendRequest(const string& url, + const map& parameters, + const map& files, + const string& proxy, + const string& proxy_user_pwd, + const string& ca_certificate_file, + string* response_body, + long* response_code, + string* error_description); + + private: + // Checks that the given list of parameters has only printable + // ASCII characters in the parameter name, and does not contain + // any quote (") characters. Returns true if so. + static bool CheckParameters(const map& parameters); + + // Checks the curl_lib parameter points to a valid curl lib. + static bool CheckCurlLib(void* curl_lib); + + // No instances of this class should be created. + // Disallow all constructors, destructors, and operator=. + HTTPUpload(); + explicit HTTPUpload(const HTTPUpload&); + void operator=(const HTTPUpload&); + ~HTTPUpload(); +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_HTTP_UPLOAD_H__ diff --git a/src/common/linux/ignore_ret.h b/src/common/linux/ignore_ret.h new file mode 100644 index 0000000..1f879e8 --- /dev/null +++ b/src/common/linux/ignore_ret.h @@ -0,0 +1,39 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_LINUX_IGNORE_RET_H_ +#define COMMON_LINUX_IGNORE_RET_H_ + +// Some compilers are prone to warn about unused return values. In cases where +// either a) the call cannot fail, or b) there is nothing that can be done when +// the call fails, IGNORE_RET() can be used to mark the return code as ignored. +// This avoids spurious compiler warnings. + +#define IGNORE_RET(x) do { if (x) {} } while (0) + +#endif // COMMON_LINUX_IGNORE_RET_H_ diff --git a/src/common/linux/libcurl_wrapper.cc b/src/common/linux/libcurl_wrapper.cc new file mode 100644 index 0000000..2b63909 --- /dev/null +++ b/src/common/linux/libcurl_wrapper.cc @@ -0,0 +1,344 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include +#include + +#include "common/linux/libcurl_wrapper.h" +#include "common/using_std_string.h" + +namespace google_breakpad { +LibcurlWrapper::LibcurlWrapper() + : init_ok_(false), + curl_lib_(nullptr), + last_curl_error_(""), + curl_(nullptr), + formpost_(nullptr), + lastptr_(nullptr), + headerlist_(nullptr) {} + +LibcurlWrapper::~LibcurlWrapper() { + if (init_ok_) { + (*easy_cleanup_)(curl_); + (*global_cleanup_)(); + dlclose(curl_lib_); + } +} + +bool LibcurlWrapper::SetProxy(const string& proxy_host, + const string& proxy_userpwd) { + if (!CheckInit()) return false; + + // Set proxy information if necessary. + if (!proxy_host.empty()) { + (*easy_setopt_)(curl_, CURLOPT_PROXY, proxy_host.c_str()); + } else { + std::cout << "SetProxy called with empty proxy host."; + return false; + } + if (!proxy_userpwd.empty()) { + (*easy_setopt_)(curl_, CURLOPT_PROXYUSERPWD, proxy_userpwd.c_str()); + } else { + std::cout << "SetProxy called with empty proxy username/password."; + return false; + } + std::cout << "Set proxy host to " << proxy_host; + return true; +} + +bool LibcurlWrapper::AddFile(const string& upload_file_path, + const string& basename) { + if (!CheckInit()) return false; + + std::cout << "Adding " << upload_file_path << " to form upload."; + // Add form file. + (*formadd_)(&formpost_, &lastptr_, + CURLFORM_COPYNAME, basename.c_str(), + CURLFORM_FILE, upload_file_path.c_str(), + CURLFORM_END); + + return true; +} + +// Callback to get the response data from server. +static size_t WriteCallback(void* ptr, size_t size, + size_t nmemb, void* userp) { + if (!userp) + return 0; + + string* response = reinterpret_cast(userp); + size_t real_size = size * nmemb; + response->append(reinterpret_cast(ptr), real_size); + return real_size; +} + +bool LibcurlWrapper::SendRequest(const string& url, + const std::map& parameters, + long* http_status_code, + string* http_header_data, + string* http_response_data) { + if (!CheckInit()) return false; + + std::map::const_iterator iter = parameters.begin(); + for (; iter != parameters.end(); ++iter) + (*formadd_)(&formpost_, &lastptr_, + CURLFORM_COPYNAME, iter->first.c_str(), + CURLFORM_COPYCONTENTS, iter->second.c_str(), + CURLFORM_END); + + (*easy_setopt_)(curl_, CURLOPT_HTTPPOST, formpost_); + + return SendRequestInner(url, http_status_code, http_header_data, + http_response_data); +} + +bool LibcurlWrapper::SendGetRequest(const string& url, + long* http_status_code, + string* http_header_data, + string* http_response_data) { + if (!CheckInit()) return false; + + (*easy_setopt_)(curl_, CURLOPT_HTTPGET, 1L); + + return SendRequestInner(url, http_status_code, http_header_data, + http_response_data); +} + +bool LibcurlWrapper::SendPutRequest(const string& url, + const string& path, + long* http_status_code, + string* http_header_data, + string* http_response_data) { + if (!CheckInit()) return false; + + FILE* file = fopen(path.c_str(), "rb"); + (*easy_setopt_)(curl_, CURLOPT_UPLOAD, 1L); + (*easy_setopt_)(curl_, CURLOPT_PUT, 1L); + (*easy_setopt_)(curl_, CURLOPT_READDATA, file); + + bool success = SendRequestInner(url, http_status_code, http_header_data, + http_response_data); + + fclose(file); + return success; +} + +bool LibcurlWrapper::SendSimplePostRequest(const string& url, + const string& body, + const string& content_type, + long* http_status_code, + string* http_header_data, + string* http_response_data) { + if (!CheckInit()) return false; + + (*easy_setopt_)(curl_, CURLOPT_POSTFIELDSIZE, body.size()); + (*easy_setopt_)(curl_, CURLOPT_COPYPOSTFIELDS, body.c_str()); + + if (!content_type.empty()) { + string content_type_header = "Content-Type: " + content_type; + headerlist_ = (*slist_append_)( + headerlist_, + content_type_header.c_str()); + } + + return SendRequestInner(url, http_status_code, http_header_data, + http_response_data); +} + +bool LibcurlWrapper::Init() { + // First check to see if libcurl was statically linked: + curl_lib_ = dlopen(nullptr, RTLD_NOW); + if (curl_lib_ && + (!dlsym(curl_lib_, "curl_easy_init") || + !dlsym(curl_lib_, "curl_easy_setopt"))) { + // Not statically linked, try again below. + dlerror(); // Clear dlerror before attempting to open libraries. + dlclose(curl_lib_); + curl_lib_ = nullptr; + } + if (!curl_lib_) { + curl_lib_ = dlopen("libcurl.so", RTLD_NOW); + } + if (!curl_lib_) { + curl_lib_ = dlopen("libcurl.so.4", RTLD_NOW); + } + if (!curl_lib_) { + curl_lib_ = dlopen("libcurl.so.3", RTLD_NOW); + } + if (!curl_lib_) { + std::cout << "Could not find libcurl via dlopen"; + return false; + } + + if (!SetFunctionPointers()) { + std::cout << "Could not find function pointers"; + return false; + } + + curl_ = (*easy_init_)(); + + last_curl_error_ = "No Error"; + + if (!curl_) { + dlclose(curl_lib_); + std::cout << "Curl initialization failed"; + return false; + } + + init_ok_ = true; + return true; +} + +#define SET_AND_CHECK_FUNCTION_POINTER(var, function_name, type) \ + var = reinterpret_cast(dlsym(curl_lib_, function_name)); \ + if (!var) { \ + std::cout << "Could not find libcurl function " << function_name; \ + init_ok_ = false; \ + return false; \ + } + +bool LibcurlWrapper::SetFunctionPointers() { + + SET_AND_CHECK_FUNCTION_POINTER(easy_init_, + "curl_easy_init", + CURL*(*)()); + + SET_AND_CHECK_FUNCTION_POINTER(easy_setopt_, + "curl_easy_setopt", + CURLcode(*)(CURL*, CURLoption, ...)); + + SET_AND_CHECK_FUNCTION_POINTER(formadd_, "curl_formadd", + CURLFORMcode(*)(curl_httppost**, curl_httppost**, ...)); + + SET_AND_CHECK_FUNCTION_POINTER(slist_append_, "curl_slist_append", + curl_slist*(*)(curl_slist*, const char*)); + + SET_AND_CHECK_FUNCTION_POINTER(easy_perform_, + "curl_easy_perform", + CURLcode(*)(CURL*)); + + SET_AND_CHECK_FUNCTION_POINTER(easy_cleanup_, + "curl_easy_cleanup", + void(*)(CURL*)); + + SET_AND_CHECK_FUNCTION_POINTER(easy_getinfo_, + "curl_easy_getinfo", + CURLcode(*)(CURL*, CURLINFO info, ...)); + + SET_AND_CHECK_FUNCTION_POINTER(easy_reset_, + "curl_easy_reset", + void(*)(CURL*)); + + SET_AND_CHECK_FUNCTION_POINTER(slist_free_all_, + "curl_slist_free_all", + void(*)(curl_slist*)); + + SET_AND_CHECK_FUNCTION_POINTER(formfree_, + "curl_formfree", + void(*)(curl_httppost*)); + + SET_AND_CHECK_FUNCTION_POINTER(global_cleanup_, + "curl_global_cleanup", + void(*)(void)); + return true; +} + +bool LibcurlWrapper::SendRequestInner(const string& url, + long* http_status_code, + string* http_header_data, + string* http_response_data) { + string url_copy(url); + (*easy_setopt_)(curl_, CURLOPT_URL, url_copy.c_str()); + + // Disable 100-continue header. + char buf[] = "Expect:"; + headerlist_ = (*slist_append_)(headerlist_, buf); + (*easy_setopt_)(curl_, CURLOPT_HTTPHEADER, headerlist_); + + if (http_response_data != nullptr) { + http_response_data->clear(); + (*easy_setopt_)(curl_, CURLOPT_WRITEFUNCTION, WriteCallback); + (*easy_setopt_)(curl_, CURLOPT_WRITEDATA, + reinterpret_cast(http_response_data)); + } + if (http_header_data != nullptr) { + http_header_data->clear(); + (*easy_setopt_)(curl_, CURLOPT_HEADERFUNCTION, WriteCallback); + (*easy_setopt_)(curl_, CURLOPT_HEADERDATA, + reinterpret_cast(http_header_data)); + } + CURLcode err_code = CURLE_OK; + err_code = (*easy_perform_)(curl_); + easy_strerror_ = reinterpret_cast + (dlsym(curl_lib_, "curl_easy_strerror")); + + if (http_status_code != nullptr) { + (*easy_getinfo_)(curl_, CURLINFO_RESPONSE_CODE, http_status_code); + } + + if (err_code != CURLE_OK) + fprintf(stderr, "Failed to send http request to %s, error: %s\n", + url.c_str(), + (*easy_strerror_)(err_code)); + + Reset(); + + return err_code == CURLE_OK; +} + +void LibcurlWrapper::Reset() { + if (headerlist_ != nullptr) { + (*slist_free_all_)(headerlist_); + headerlist_ = nullptr; + } + + if (formpost_ != nullptr) { + (*formfree_)(formpost_); + formpost_ = nullptr; + } + + (*easy_reset_)(curl_); +} + +bool LibcurlWrapper::CheckInit() { + if (!init_ok_) { + std::cout << "LibcurlWrapper: You must call Init(), and have it return " + "'true' before invoking any other methods.\n"; + return false; + } + + return true; +} + +} // namespace google_breakpad diff --git a/src/common/linux/libcurl_wrapper.h b/src/common/linux/libcurl_wrapper.h new file mode 100644 index 0000000..f8f961c --- /dev/null +++ b/src/common/linux/libcurl_wrapper.h @@ -0,0 +1,122 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A wrapper for libcurl to do HTTP Uploads, to support easy mocking +// and unit testing of the HTTPUpload class. + +#ifndef COMMON_LINUX_LIBCURL_WRAPPER_H_ +#define COMMON_LINUX_LIBCURL_WRAPPER_H_ + +#include +#include + +#include "common/using_std_string.h" +#include "third_party/curl/curl.h" + +namespace google_breakpad { + +// This class is only safe to be used on single-threaded code because of its +// usage of libcurl's curl_global_cleanup(). +class LibcurlWrapper { + public: + LibcurlWrapper(); + virtual ~LibcurlWrapper(); + virtual bool Init(); + virtual bool SetProxy(const string& proxy_host, + const string& proxy_userpwd); + virtual bool AddFile(const string& upload_file_path, + const string& basename); + virtual bool SendRequest(const string& url, + const std::map& parameters, + long* http_status_code, + string* http_header_data, + string* http_response_data); + bool SendGetRequest(const string& url, + long* http_status_code, + string* http_header_data, + string* http_response_data); + bool SendPutRequest(const string& url, + const string& path, + long* http_status_code, + string* http_header_data, + string* http_response_data); + bool SendSimplePostRequest(const string& url, + const string& body, + const string& content_type, + long* http_status_code, + string* http_header_data, + string* http_response_data); + + private: + // This function initializes class state corresponding to function + // pointers into the CURL library. + bool SetFunctionPointers(); + + bool SendRequestInner(const string& url, + long* http_status_code, + string* http_header_data, + string* http_response_data); + + void Reset(); + + bool CheckInit(); + + bool init_ok_; // Whether init succeeded + void* curl_lib_; // Pointer to result of dlopen() on + // curl library + string last_curl_error_; // The text of the last error when + // dealing + // with CURL. + + CURL* curl_; // Pointer for handle for CURL calls. + + CURL* (*easy_init_)(void); + + // Stateful pointers for calling into curl_formadd() + struct curl_httppost* formpost_; + struct curl_httppost* lastptr_; + struct curl_slist* headerlist_; + + // Function pointers into CURL library + CURLcode (*easy_setopt_)(CURL*, CURLoption, ...); + CURLFORMcode (*formadd_)(struct curl_httppost**, + struct curl_httppost**, ...); + struct curl_slist* (*slist_append_)(struct curl_slist*, const char*); + void (*slist_free_all_)(struct curl_slist*); + CURLcode (*easy_perform_)(CURL*); + const char* (*easy_strerror_)(CURLcode); + void (*easy_cleanup_)(CURL*); + CURLcode (*easy_getinfo_)(CURL*, CURLINFO info, ...); + void (*easy_reset_)(CURL*); + void (*formfree_)(struct curl_httppost*); + void (*global_cleanup_)(void); + +}; +} + +#endif // COMMON_LINUX_LIBCURL_WRAPPER_H_ diff --git a/src/common/linux/linux_libc_support.cc b/src/common/linux/linux_libc_support.cc new file mode 100644 index 0000000..abcbfde --- /dev/null +++ b/src/common/linux/linux_libc_support.cc @@ -0,0 +1,240 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This source file provides replacements for libc functions that we need. If +// we call the libc functions directly we risk crashing in the dynamic linker +// as it tries to resolve uncached PLT entries. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/linux_libc_support.h" + +#include + +extern "C" { + +size_t my_strlen(const char* s) { + size_t len = 0; + while (*s++) len++; + return len; +} + +int my_strcmp(const char* a, const char* b) { + for (;;) { + if (*a < *b) + return -1; + else if (*a > *b) + return 1; + else if (*a == 0) + return 0; + a++; + b++; + } +} + +int my_strncmp(const char* a, const char* b, size_t len) { + for (size_t i = 0; i < len; ++i) { + if (*a < *b) + return -1; + else if (*a > *b) + return 1; + else if (*a == 0) + return 0; + a++; + b++; + } + + return 0; +} + +// Parse a non-negative integer. +// result: (output) the resulting non-negative integer +// s: a NUL terminated string +// Return true iff successful. +bool my_strtoui(int* result, const char* s) { + if (*s == 0) + return false; + int r = 0; + for (;; s++) { + if (*s == 0) + break; + const int old_r = r; + r *= 10; + if (*s < '0' || *s > '9') + return false; + r += *s - '0'; + if (r < old_r) + return false; + } + + *result = r; + return true; +} + +// Return the length of the given unsigned integer when expressed in base 10. +unsigned my_uint_len(uintmax_t i) { + if (!i) + return 1; + + int len = 0; + while (i) { + len++; + i /= 10; + } + + return len; +} + +// Convert an unsigned integer to a string +// output: (output) the resulting string is written here. This buffer must be +// large enough to hold the resulting string. Call |my_uint_len| to get the +// required length. +// i: the unsigned integer to serialise. +// i_len: the length of the integer in base 10 (see |my_uint_len|). +void my_uitos(char* output, uintmax_t i, unsigned i_len) { + for (unsigned index = i_len; index; --index, i /= 10) + output[index - 1] = '0' + (i % 10); +} + +const char* my_strchr(const char* haystack, char needle) { + while (*haystack && *haystack != needle) + haystack++; + if (*haystack == needle) + return haystack; + return (const char*) 0; +} + +const char* my_strrchr(const char* haystack, char needle) { + const char* ret = NULL; + while (*haystack) { + if (*haystack == needle) + ret = haystack; + haystack++; + } + return ret; +} + +void* my_memchr(const void* src, int needle, size_t src_len) { + const unsigned char* p = (const unsigned char*)src; + const unsigned char* p_end = p + src_len; + for (; p < p_end; ++p) { + if (*p == needle) + return (void*)p; + } + return NULL; +} + +// Read a hex value +// result: (output) the resulting value +// s: a string +// Returns a pointer to the first invalid charactor. +const char* my_read_hex_ptr(uintptr_t* result, const char* s) { + uintptr_t r = 0; + + for (;; ++s) { + if (*s >= '0' && *s <= '9') { + r <<= 4; + r += *s - '0'; + } else if (*s >= 'a' && *s <= 'f') { + r <<= 4; + r += (*s - 'a') + 10; + } else if (*s >= 'A' && *s <= 'F') { + r <<= 4; + r += (*s - 'A') + 10; + } else { + break; + } + } + + *result = r; + return s; +} + +const char* my_read_decimal_ptr(uintptr_t* result, const char* s) { + uintptr_t r = 0; + + for (;; ++s) { + if (*s >= '0' && *s <= '9') { + r *= 10; + r += *s - '0'; + } else { + break; + } + } + *result = r; + return s; +} + +void my_memset(void* ip, char c, size_t len) { + char* p = (char*) ip; + while (len--) + *p++ = c; +} + +size_t my_strlcpy(char* s1, const char* s2, size_t len) { + size_t pos1 = 0; + size_t pos2 = 0; + + while (s2[pos2] != '\0') { + if (pos1 + 1 < len) { + s1[pos1] = s2[pos2]; + pos1++; + } + pos2++; + } + if (len > 0) + s1[pos1] = '\0'; + + return pos2; +} + +size_t my_strlcat(char* s1, const char* s2, size_t len) { + size_t pos1 = 0; + + while (pos1 < len && s1[pos1] != '\0') + pos1++; + + if (pos1 == len) + return pos1; + + return pos1 + my_strlcpy(s1 + pos1, s2, len - pos1); +} + +int my_isspace(int ch) { + // Matches the C locale. + const char spaces[] = " \t\f\n\r\t\v"; + for (size_t i = 0; i < sizeof(spaces); i++) { + if (ch == spaces[i]) + return 1; + } + return 0; +} + +} // extern "C" diff --git a/src/common/linux/linux_libc_support.h b/src/common/linux/linux_libc_support.h new file mode 100644 index 0000000..05e2aa2 --- /dev/null +++ b/src/common/linux/linux_libc_support.h @@ -0,0 +1,95 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This header provides replacements for libc functions that we need. We if +// call the libc functions directly we risk crashing in the dynamic linker as +// it tries to resolve uncached PLT entries. + +#ifndef CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_ +#define CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_ + +#include +#include +#include + +extern "C" { + +extern size_t my_strlen(const char* s); + +extern int my_strcmp(const char* a, const char* b); + +extern int my_strncmp(const char* a, const char* b, size_t len); + +// Parse a non-negative integer. +// result: (output) the resulting non-negative integer +// s: a NUL terminated string +// Return true iff successful. +extern bool my_strtoui(int* result, const char* s); + +// Return the length of the given unsigned integer when expressed in base 10. +extern unsigned my_uint_len(uintmax_t i); + +// Convert an unsigned integer to a string +// output: (output) the resulting string is written here. This buffer must be +// large enough to hold the resulting string. Call |my_uint_len| to get the +// required length. +// i: the unsigned integer to serialise. +// i_len: the length of the integer in base 10 (see |my_uint_len|). +extern void my_uitos(char* output, uintmax_t i, unsigned i_len); + +extern const char* my_strchr(const char* haystack, char needle); + +extern const char* my_strrchr(const char* haystack, char needle); + +// Read a hex value +// result: (output) the resulting value +// s: a string +// Returns a pointer to the first invalid charactor. +extern const char* my_read_hex_ptr(uintptr_t* result, const char* s); + +extern const char* my_read_decimal_ptr(uintptr_t* result, const char* s); + +extern void my_memset(void* ip, char c, size_t len); + +extern void* my_memchr(const void* src, int c, size_t len); + +// The following are considered safe to use in a compromised environment. +// Besides, this gives the compiler an opportunity to optimize their calls. +#define my_memcpy memcpy +#define my_memmove memmove +#define my_memcmp memcmp + +extern size_t my_strlcpy(char* s1, const char* s2, size_t len); + +extern size_t my_strlcat(char* s1, const char* s2, size_t len); + +extern int my_isspace(int ch); + +} // extern "C" + +#endif // CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_ diff --git a/src/common/linux/linux_libc_support_unittest.cc b/src/common/linux/linux_libc_support_unittest.cc new file mode 100644 index 0000000..30dd143 --- /dev/null +++ b/src/common/linux/linux_libc_support_unittest.cc @@ -0,0 +1,216 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "breakpad_googletest_includes.h" +#include "common/linux/linux_libc_support.h" + +namespace { +typedef testing::Test LinuxLibcSupportTest; +} + +TEST(LinuxLibcSupportTest, strlen) { + static const char* test_data[] = { "", "a", "aa", "aaa", "aabc", NULL }; + for (unsigned i = 0; ; ++i) { + if (!test_data[i]) + break; + ASSERT_EQ(strlen(test_data[i]), my_strlen(test_data[i])); + } +} + +TEST(LinuxLibcSupportTest, strcmp) { + static const char* test_data[] = { + "", "", + "a", "", + "", "a", + "a", "b", + "a", "a", + "ab", "aa", + "abc", "ab", + "abc", "abc", + NULL, + }; + + for (unsigned i = 0; ; ++i) { + if (!test_data[i*2]) + break; + int libc_result = strcmp(test_data[i*2], test_data[i*2 + 1]); + if (libc_result > 1) + libc_result = 1; + else if (libc_result < -1) + libc_result = -1; + ASSERT_EQ(my_strcmp(test_data[i*2], test_data[i*2 + 1]), libc_result); + } +} + +TEST(LinuxLibcSupportTest, strtoui) { + int result; + + ASSERT_FALSE(my_strtoui(&result, "")); + ASSERT_FALSE(my_strtoui(&result, "-1")); + ASSERT_FALSE(my_strtoui(&result, "-")); + ASSERT_FALSE(my_strtoui(&result, "a")); + ASSERT_FALSE(my_strtoui(&result, "23472893472938472987987398472398")); + + ASSERT_TRUE(my_strtoui(&result, "0")); + ASSERT_EQ(result, 0); + ASSERT_TRUE(my_strtoui(&result, "1")); + ASSERT_EQ(result, 1); + ASSERT_TRUE(my_strtoui(&result, "12")); + ASSERT_EQ(result, 12); + ASSERT_TRUE(my_strtoui(&result, "123")); + ASSERT_EQ(result, 123); + ASSERT_TRUE(my_strtoui(&result, "0123")); + ASSERT_EQ(result, 123); +} + +TEST(LinuxLibcSupportTest, uint_len) { + ASSERT_EQ(my_uint_len(0), 1U); + ASSERT_EQ(my_uint_len(2), 1U); + ASSERT_EQ(my_uint_len(5), 1U); + ASSERT_EQ(my_uint_len(9), 1U); + ASSERT_EQ(my_uint_len(10), 2U); + ASSERT_EQ(my_uint_len(99), 2U); + ASSERT_EQ(my_uint_len(100), 3U); + ASSERT_EQ(my_uint_len(101), 3U); + ASSERT_EQ(my_uint_len(1000), 4U); + // 0xFFFFFFFFFFFFFFFF + ASSERT_EQ(my_uint_len(18446744073709551615LLU), 20U); +} + +TEST(LinuxLibcSupportTest, uitos) { + char buf[32]; + + my_uitos(buf, 0, 1); + ASSERT_EQ(0, memcmp(buf, "0", 1)); + + my_uitos(buf, 1, 1); + ASSERT_EQ(0, memcmp(buf, "1", 1)); + + my_uitos(buf, 10, 2); + ASSERT_EQ(0, memcmp(buf, "10", 2)); + + my_uitos(buf, 63, 2); + ASSERT_EQ(0, memcmp(buf, "63", 2)); + + my_uitos(buf, 101, 3); + ASSERT_EQ(0, memcmp(buf, "101", 2)); + + // 0xFFFFFFFFFFFFFFFF + my_uitos(buf, 18446744073709551615LLU, 20); + ASSERT_EQ(0, memcmp(buf, "18446744073709551615", 20)); +} + +TEST(LinuxLibcSupportTest, strchr) { + ASSERT_EQ(NULL, my_strchr("abc", 'd')); + ASSERT_EQ(NULL, my_strchr("", 'd')); + ASSERT_EQ(NULL, my_strchr("efghi", 'd')); + + ASSERT_TRUE(my_strchr("a", 'a')); + ASSERT_TRUE(my_strchr("abc", 'a')); + ASSERT_TRUE(my_strchr("bcda", 'a')); + ASSERT_TRUE(my_strchr("sdfasdf", 'a')); + + static const char abc3[] = "abcabcabc"; + ASSERT_EQ(abc3, my_strchr(abc3, 'a')); +} + +TEST(LinuxLibcSupportTest, strrchr) { + ASSERT_EQ(NULL, my_strrchr("abc", 'd')); + ASSERT_EQ(NULL, my_strrchr("", 'd')); + ASSERT_EQ(NULL, my_strrchr("efghi", 'd')); + + ASSERT_TRUE(my_strrchr("a", 'a')); + ASSERT_TRUE(my_strrchr("abc", 'a')); + ASSERT_TRUE(my_strrchr("bcda", 'a')); + ASSERT_TRUE(my_strrchr("sdfasdf", 'a')); + + static const char abc3[] = "abcabcabc"; + ASSERT_EQ(abc3 + 6, my_strrchr(abc3, 'a')); +} + +TEST(LinuxLibcSupportTest, memchr) { + ASSERT_EQ(NULL, my_memchr("abc", 'd', 3)); + ASSERT_EQ(NULL, my_memchr("abcd", 'd', 3)); + ASSERT_EQ(NULL, my_memchr("a", 'a', 0)); + + static const char abc3[] = "abcabcabc"; + ASSERT_EQ(abc3, my_memchr(abc3, 'a', 3)); + ASSERT_EQ(abc3, my_memchr(abc3, 'a', 9)); + ASSERT_EQ(abc3+1, my_memchr(abc3, 'b', 9)); + ASSERT_EQ(abc3+2, my_memchr(abc3, 'c', 9)); +} + +TEST(LinuxLibcSupportTest, read_hex_ptr) { + uintptr_t result; + const char* last; + + last = my_read_hex_ptr(&result, ""); + ASSERT_EQ(result, 0U); + ASSERT_EQ(*last, 0); + + last = my_read_hex_ptr(&result, "0"); + ASSERT_EQ(result, 0U); + ASSERT_EQ(*last, 0); + + last = my_read_hex_ptr(&result, "0123"); + ASSERT_EQ(result, 0x123U); + ASSERT_EQ(*last, 0); + + last = my_read_hex_ptr(&result, "0123a"); + ASSERT_EQ(result, 0x123aU); + ASSERT_EQ(*last, 0); + + last = my_read_hex_ptr(&result, "0123a-"); + ASSERT_EQ(result, 0x123aU); + ASSERT_EQ(*last, '-'); +} + +TEST(LinuxLibcSupportTest, read_decimal_ptr) { + uintptr_t result; + const char* last; + + last = my_read_decimal_ptr(&result, "0"); + ASSERT_EQ(result, 0U); + ASSERT_EQ(*last, 0); + + last = my_read_decimal_ptr(&result, "0123"); + ASSERT_EQ(result, 123U); + ASSERT_EQ(*last, 0); + + last = my_read_decimal_ptr(&result, "1234"); + ASSERT_EQ(result, 1234U); + ASSERT_EQ(*last, 0); + + last = my_read_decimal_ptr(&result, "01234-"); + ASSERT_EQ(result, 1234U); + ASSERT_EQ(*last, '-'); +} diff --git a/src/common/linux/memory_mapped_file.cc b/src/common/linux/memory_mapped_file.cc new file mode 100644 index 0000000..a7b96eb --- /dev/null +++ b/src/common/linux/memory_mapped_file.cc @@ -0,0 +1,115 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// memory_mapped_file.cc: Implement google_breakpad::MemoryMappedFile. +// See memory_mapped_file.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/memory_mapped_file.h" + +#include +#include +#if defined(__ANDROID__) +#include +#endif +#include + +#include "common/memory_range.h" +#include "third_party/lss/linux_syscall_support.h" + +namespace google_breakpad { + +MemoryMappedFile::MemoryMappedFile() {} + +MemoryMappedFile::MemoryMappedFile(const char* path, size_t offset) { + Map(path, offset); +} + +MemoryMappedFile::~MemoryMappedFile() { + Unmap(); +} + +#include + +bool MemoryMappedFile::Map(const char* path, size_t offset) { + Unmap(); + // Based on https://pubs.opengroup.org/onlinepubs/7908799/xsh/open.html + // If O_NONBLOCK is set: The open() function will return without blocking + // for the device to be ready or available. Setting this value will provent + // hanging if file is not avilable. + int fd = sys_open(path, O_RDONLY | O_NONBLOCK, 0); + if (fd == -1) { + return false; + } + +#if defined(__x86_64__) || defined(__aarch64__) || \ + (defined(__mips__) && _MIPS_SIM == _ABI64) || \ + (defined(__riscv) && __riscv_xlen == 64) + + struct kernel_stat st; + if (sys_fstat(fd, &st) == -1 || st.st_size < 0) { +#else + struct kernel_stat64 st; + if (sys_fstat64(fd, &st) == -1 || st.st_size < 0) { +#endif + sys_close(fd); + return false; + } + + // Strangely file size can be negative, but we check above that it is not. + size_t file_len = static_cast(st.st_size); + // If the file does not extend beyond the offset, simply use an empty + // MemoryRange and return true. Don't bother to call mmap() + // even though mmap() can handle an empty file on some platforms. + if (offset >= file_len) { + sys_close(fd); + return true; + } + + size_t content_len = file_len - offset; + void* data = sys_mmap(NULL, content_len, PROT_READ, MAP_PRIVATE, fd, offset); + sys_close(fd); + if (data == MAP_FAILED) { + return false; + } + + content_.Set(data, content_len); + return true; +} + +void MemoryMappedFile::Unmap() { + if (content_.data()) { + sys_munmap(const_cast(content_.data()), content_.length()); + content_.Set(NULL, 0); + } +} + +} // namespace google_breakpad diff --git a/src/common/linux/memory_mapped_file.h b/src/common/linux/memory_mapped_file.h new file mode 100644 index 0000000..462e116 --- /dev/null +++ b/src/common/linux/memory_mapped_file.h @@ -0,0 +1,87 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// memory_mapped_file.h: Define the google_breakpad::MemoryMappedFile +// class, which maps a file into memory for read-only access. + +#ifndef COMMON_LINUX_MEMORY_MAPPED_FILE_H_ +#define COMMON_LINUX_MEMORY_MAPPED_FILE_H_ + +#include + +#include "common/memory_range.h" + +namespace google_breakpad { + +// A utility class for mapping a file into memory for read-only access of +// the file content. Its implementation avoids calling into libc functions +// by directly making system calls for open, close, mmap, and munmap. +class MemoryMappedFile { + public: + MemoryMappedFile(); + + // Constructor that calls Map() to map a file at |path| into memory. + // If Map() fails, the object behaves as if it is default constructed. + MemoryMappedFile(const char* path, size_t offset); + + MemoryMappedFile(const MemoryMappedFile&) = delete; + void operator=(const MemoryMappedFile&) = delete; + + ~MemoryMappedFile(); + + // Maps a file at |path| into memory, which can then be accessed via + // content() as a MemoryRange object or via data(), and returns true on + // success. Mapping an empty file will succeed but with data() and size() + // returning NULL and 0, respectively. An existing mapping is unmapped + // before a new mapping is created. + bool Map(const char* path, size_t offset); + + // Unmaps the memory for the mapped file. It's a no-op if no file is + // mapped. + void Unmap(); + + // Returns a MemoryRange object that covers the memory for the mapped + // file. The MemoryRange object is empty if no file is mapped. + const MemoryRange& content() const { return content_; } + + // Returns a pointer to the beginning of the memory for the mapped file. + // or NULL if no file is mapped or the mapped file is empty. + const void* data() const { return content_.data(); } + + // Returns the size in bytes of the mapped file, or zero if no file + // is mapped. + size_t size() const { return content_.length(); } + + private: + // Mapped file content as a MemoryRange object. + MemoryRange content_; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_MEMORY_MAPPED_FILE_H_ diff --git a/src/common/linux/memory_mapped_file_unittest.cc b/src/common/linux/memory_mapped_file_unittest.cc new file mode 100644 index 0000000..b7a61a7 --- /dev/null +++ b/src/common/linux/memory_mapped_file_unittest.cc @@ -0,0 +1,211 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// memory_mapped_file_unittest.cc: +// Unit tests for google_breakpad::MemoryMappedFile. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "common/linux/memory_mapped_file.h" +#include "common/tests/auto_tempdir.h" +#include "common/tests/file_utils.h" +#include "common/using_std_string.h" + +using google_breakpad::AutoTempDir; +using google_breakpad::MemoryMappedFile; +using google_breakpad::WriteFile; + +namespace { + +class MemoryMappedFileTest : public testing::Test { + protected: + void ExpectNoMappedData(const MemoryMappedFile& mapped_file) { + EXPECT_TRUE(mapped_file.content().IsEmpty()); + EXPECT_TRUE(mapped_file.data() == NULL); + EXPECT_EQ(0U, mapped_file.size()); + } +}; + +} // namespace + +TEST_F(MemoryMappedFileTest, DefaultConstructor) { + MemoryMappedFile mapped_file; + ExpectNoMappedData(mapped_file); +} + +TEST_F(MemoryMappedFileTest, UnmapWithoutMap) { + MemoryMappedFile mapped_file; + mapped_file.Unmap(); +} + +TEST_F(MemoryMappedFileTest, MapNonexistentFile) { + { + MemoryMappedFile mapped_file("nonexistent-file", 0); + ExpectNoMappedData(mapped_file); + } + { + MemoryMappedFile mapped_file; + EXPECT_FALSE(mapped_file.Map("nonexistent-file", 0)); + ExpectNoMappedData(mapped_file); + } +} + +TEST_F(MemoryMappedFileTest, MapEmptyFile) { + AutoTempDir temp_dir; + string test_file = temp_dir.path() + "/empty_file"; + ASSERT_TRUE(WriteFile(test_file.c_str(), NULL, 0)); + + { + MemoryMappedFile mapped_file(test_file.c_str(), 0); + ExpectNoMappedData(mapped_file); + } + { + MemoryMappedFile mapped_file; + EXPECT_TRUE(mapped_file.Map(test_file.c_str(), 0)); + ExpectNoMappedData(mapped_file); + } +} + +TEST_F(MemoryMappedFileTest, MapNonEmptyFile) { + char data[256]; + size_t data_size = sizeof(data); + for (size_t i = 0; i < data_size; ++i) { + data[i] = i; + } + + AutoTempDir temp_dir; + string test_file = temp_dir.path() + "/test_file"; + ASSERT_TRUE(WriteFile(test_file.c_str(), data, data_size)); + + { + MemoryMappedFile mapped_file(test_file.c_str(), 0); + EXPECT_FALSE(mapped_file.content().IsEmpty()); + EXPECT_TRUE(mapped_file.data() != NULL); + EXPECT_EQ(data_size, mapped_file.size()); + EXPECT_EQ(0, memcmp(data, mapped_file.data(), data_size)); + } + { + MemoryMappedFile mapped_file; + EXPECT_TRUE(mapped_file.Map(test_file.c_str(), 0)); + EXPECT_FALSE(mapped_file.content().IsEmpty()); + EXPECT_TRUE(mapped_file.data() != NULL); + EXPECT_EQ(data_size, mapped_file.size()); + EXPECT_EQ(0, memcmp(data, mapped_file.data(), data_size)); + } +} + +TEST_F(MemoryMappedFileTest, RemapAfterMap) { + char data1[256]; + size_t data1_size = sizeof(data1); + for (size_t i = 0; i < data1_size; ++i) { + data1[i] = i; + } + + char data2[50]; + size_t data2_size = sizeof(data2); + for (size_t i = 0; i < data2_size; ++i) { + data2[i] = 255 - i; + } + + AutoTempDir temp_dir; + string test_file1 = temp_dir.path() + "/test_file1"; + string test_file2 = temp_dir.path() + "/test_file2"; + ASSERT_TRUE(WriteFile(test_file1.c_str(), data1, data1_size)); + ASSERT_TRUE(WriteFile(test_file2.c_str(), data2, data2_size)); + + { + MemoryMappedFile mapped_file(test_file1.c_str(), 0); + EXPECT_FALSE(mapped_file.content().IsEmpty()); + EXPECT_TRUE(mapped_file.data() != NULL); + EXPECT_EQ(data1_size, mapped_file.size()); + EXPECT_EQ(0, memcmp(data1, mapped_file.data(), data1_size)); + + mapped_file.Map(test_file2.c_str(), 0); + EXPECT_FALSE(mapped_file.content().IsEmpty()); + EXPECT_TRUE(mapped_file.data() != NULL); + EXPECT_EQ(data2_size, mapped_file.size()); + EXPECT_EQ(0, memcmp(data2, mapped_file.data(), data2_size)); + } + { + MemoryMappedFile mapped_file; + EXPECT_TRUE(mapped_file.Map(test_file1.c_str(), 0)); + EXPECT_FALSE(mapped_file.content().IsEmpty()); + EXPECT_TRUE(mapped_file.data() != NULL); + EXPECT_EQ(data1_size, mapped_file.size()); + EXPECT_EQ(0, memcmp(data1, mapped_file.data(), data1_size)); + + mapped_file.Map(test_file2.c_str(), 0); + EXPECT_FALSE(mapped_file.content().IsEmpty()); + EXPECT_TRUE(mapped_file.data() != NULL); + EXPECT_EQ(data2_size, mapped_file.size()); + EXPECT_EQ(0, memcmp(data2, mapped_file.data(), data2_size)); + } +} + +TEST_F(MemoryMappedFileTest, MapWithOffset) { + // Put more data in the test file this time. Offsets can only be + // done on page boundaries, so we need a two page file to test this. + const int page_size = 4096; + char data1[2 * page_size]; + size_t data1_size = sizeof(data1); + for (size_t i = 0; i < data1_size; ++i) { + data1[i] = i & 0x7f; + } + + AutoTempDir temp_dir; + string test_file1 = temp_dir.path() + "/test_file1"; + ASSERT_TRUE(WriteFile(test_file1.c_str(), data1, data1_size)); + { + MemoryMappedFile mapped_file(test_file1.c_str(), page_size); + EXPECT_FALSE(mapped_file.content().IsEmpty()); + EXPECT_TRUE(mapped_file.data() != NULL); + EXPECT_EQ(data1_size - page_size, mapped_file.size()); + EXPECT_EQ( + 0, + memcmp(data1 + page_size, mapped_file.data(), data1_size - page_size)); + } + { + MemoryMappedFile mapped_file; + mapped_file.Map(test_file1.c_str(), page_size); + EXPECT_FALSE(mapped_file.content().IsEmpty()); + EXPECT_TRUE(mapped_file.data() != NULL); + EXPECT_EQ(data1_size - page_size, mapped_file.size()); + EXPECT_EQ( + 0, + memcmp(data1 + page_size, mapped_file.data(), data1_size - page_size)); + } +} diff --git a/src/common/linux/safe_readlink.cc b/src/common/linux/safe_readlink.cc new file mode 100644 index 0000000..a42b01a --- /dev/null +++ b/src/common/linux/safe_readlink.cc @@ -0,0 +1,56 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// safe_readlink.cc: Implement google_breakpad::SafeReadLink. +// See safe_readlink.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "third_party/lss/linux_syscall_support.h" + +namespace google_breakpad { + +bool SafeReadLink(const char* path, char* buffer, size_t buffer_size) { + // sys_readlink() does not add a NULL byte to |buffer|. In order to return + // a NULL-terminated string in |buffer|, |buffer_size| should be at least + // one byte longer than the expected path length. Also, sys_readlink() + // returns the actual path length on success, which does not count the + // NULL byte, so |result_size| should be less than |buffer_size|. + ssize_t result_size = sys_readlink(path, buffer, buffer_size); + if (result_size >= 0 && static_cast(result_size) < buffer_size) { + buffer[result_size] = '\0'; + return true; + } + return false; +} + +} // namespace google_breakpad diff --git a/src/common/linux/safe_readlink.h b/src/common/linux/safe_readlink.h new file mode 100644 index 0000000..f3aa933 --- /dev/null +++ b/src/common/linux/safe_readlink.h @@ -0,0 +1,64 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// safe_readlink.h: Define the google_breakpad::SafeReadLink function, +// which wraps sys_readlink and gurantees the result is NULL-terminated. + +#ifndef COMMON_LINUX_SAFE_READLINK_H_ +#define COMMON_LINUX_SAFE_READLINK_H_ + +#include + +namespace google_breakpad { + +// This function wraps sys_readlink() and performs the same functionalty, +// but guarantees |buffer| is NULL-terminated if sys_readlink() returns +// no error. It takes the same arguments as sys_readlink(), but unlike +// sys_readlink(), it returns true on success. +// +// |buffer_size| specifies the size of |buffer| in bytes. As this function +// always NULL-terminates |buffer| on success, |buffer_size| should be +// at least one byte longer than the expected path length (e.g. PATH_MAX, +// which is typically defined as the maximum length of a path name +// including the NULL byte). +// +// The implementation of this function calls sys_readlink() instead of +// readlink(), it can thus be used in the context where calling to libc +// functions is discouraged. +bool SafeReadLink(const char* path, char* buffer, size_t buffer_size); + +// Same as the three-argument version of SafeReadLink() but deduces the +// size of |buffer| if it is a char array of known size. +template +bool SafeReadLink(const char* path, char (&buffer)[N]) { + return SafeReadLink(path, buffer, sizeof(buffer)); +} + +} // namespace google_breakpad + +#endif // COMMON_LINUX_SAFE_READLINK_H_ diff --git a/src/common/linux/safe_readlink_unittest.cc b/src/common/linux/safe_readlink_unittest.cc new file mode 100644 index 0000000..8fa6d06 --- /dev/null +++ b/src/common/linux/safe_readlink_unittest.cc @@ -0,0 +1,92 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// safe_readlink_unittest.cc: Unit tests for google_breakpad::SafeReadLink. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "breakpad_googletest_includes.h" +#include "common/linux/safe_readlink.h" + +using google_breakpad::SafeReadLink; + +TEST(SafeReadLinkTest, ZeroBufferSize) { + char buffer[1]; + EXPECT_FALSE(SafeReadLink("/proc/self/exe", buffer, 0)); +} + +TEST(SafeReadLinkTest, BufferSizeTooSmall) { + char buffer[1]; + EXPECT_FALSE(SafeReadLink("/proc/self/exe", buffer, 1)); +} + +TEST(SafeReadLinkTest, BoundaryBufferSize) { + char buffer[PATH_MAX]; + EXPECT_TRUE(SafeReadLink("/proc/self/exe", buffer, sizeof(buffer))); + size_t path_length = strlen(buffer); + EXPECT_LT(0U, path_length); + EXPECT_GT(sizeof(buffer), path_length); + + // Buffer size equals to the expected path length plus 1 for the NULL byte. + char buffer2[PATH_MAX]; + EXPECT_TRUE(SafeReadLink("/proc/self/exe", buffer2, path_length + 1)); + EXPECT_EQ(path_length, strlen(buffer2)); + EXPECT_EQ(0, strncmp(buffer, buffer2, PATH_MAX)); + + // Buffer size equals to the expected path length. + EXPECT_FALSE(SafeReadLink("/proc/self/exe", buffer, path_length)); +} + +TEST(SafeReadLinkTest, NonexistentPath) { + char buffer[PATH_MAX]; + EXPECT_FALSE(SafeReadLink("nonexistent_path", buffer, sizeof(buffer))); +} + +TEST(SafeReadLinkTest, NonSymbolicLinkPath) { + char actual_path[PATH_MAX]; + EXPECT_TRUE(SafeReadLink("/proc/self/exe", actual_path, sizeof(actual_path))); + + char buffer[PATH_MAX]; + EXPECT_FALSE(SafeReadLink(actual_path, buffer, sizeof(buffer))); +} + +TEST(SafeReadLinkTest, DeduceBufferSizeFromCharArray) { + char buffer[PATH_MAX]; + char* buffer_pointer = buffer; + EXPECT_TRUE(SafeReadLink("/proc/self/exe", buffer_pointer, sizeof(buffer))); + size_t path_length = strlen(buffer); + + // Use the template version of SafeReadLink to deduce the buffer size + // from the char array. + char buffer2[PATH_MAX]; + EXPECT_TRUE(SafeReadLink("/proc/self/exe", buffer2)); + EXPECT_EQ(path_length, strlen(buffer2)); + EXPECT_EQ(0, strncmp(buffer, buffer2, PATH_MAX)); +} diff --git a/src/common/linux/scoped_pipe.cc b/src/common/linux/scoped_pipe.cc new file mode 100644 index 0000000..8de04ce --- /dev/null +++ b/src/common/linux/scoped_pipe.cc @@ -0,0 +1,132 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/scoped_pipe.h" + +#include + +#include "common/linux/eintr_wrapper.h" + +namespace google_breakpad { + +ScopedPipe::ScopedPipe() { + fds_[0] = -1; + fds_[1] = -1; +} + +ScopedPipe::~ScopedPipe() { + CloseReadFd(); + CloseWriteFd(); +} + +bool ScopedPipe::Init() { + return pipe(fds_) == 0; +} + +void ScopedPipe::CloseReadFd() { + if (fds_[0] != -1) { + close(fds_[0]); + fds_[0] = -1; + } +} + +void ScopedPipe::CloseWriteFd() { + if (fds_[1] != -1) { + close(fds_[1]); + fds_[1] = -1; + } +} + +bool ScopedPipe::ReadLine(std::string& line) { + // Simple buffered file read. `read_buffer_` stores previously read bytes, and + // we either return a line from this buffer, or we append blocks of read bytes + // to the buffer until we have a complete line. + size_t eol_index = read_buffer_.find('\n'); + + // While we don't have a full line, and read pipe is valid. + while (eol_index == std::string::npos && GetReadFd() != -1) { + // Read a block of 128 bytes from the read pipe. + char read_buf[128]; + ssize_t read_len = HANDLE_EINTR( + read(GetReadFd(), read_buf, sizeof(read_buf))); + if (read_len <= 0) { + // Pipe error, or pipe has been closed. + CloseReadFd(); + break; + } + + // Append the block, and check if we have a full line now. + read_buffer_.append(read_buf, read_len); + eol_index = read_buffer_.find('\n'); + } + + if (eol_index != std::string::npos) { + // We have a full line to output. + line = read_buffer_.substr(0, eol_index); + if (eol_index < read_buffer_.size()) { + read_buffer_ = read_buffer_.substr(eol_index + 1); + } else { + read_buffer_ = ""; + } + + return true; + } + + if (read_buffer_.size()) { + // We don't have a full line to output, but we can only reach here if the + // pipe has closed and there are some bytes left at the end, so we should + // return those bytes. + line = std::move(read_buffer_); + read_buffer_ = ""; + + return true; + } + + // We don't have any buffered data left, and the pipe has closed. + return false; +} + +int ScopedPipe::Dup2WriteFd(int new_fd) const { + return dup2(fds_[1], new_fd); +} + +bool ScopedPipe::WriteForTesting(const void* bytes, size_t bytes_len) { + ssize_t r = HANDLE_EINTR(write(GetWriteFd(), bytes, bytes_len)); + if (r != static_cast(bytes_len)) { + CloseWriteFd(); + return false; + } + + return true; +} + +} // namespace google_breakpad diff --git a/src/common/linux/scoped_pipe.h b/src/common/linux/scoped_pipe.h new file mode 100644 index 0000000..25394c2 --- /dev/null +++ b/src/common/linux/scoped_pipe.h @@ -0,0 +1,115 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_LINUX_SCOPED_PIPE_H_ +#define COMMON_LINUX_SCOPED_PIPE_H_ + +#include +#include + +namespace google_breakpad { + +// Small RAII wrapper for a pipe pair. +// +// Example (both ends of pipe in same process): +// ScopedPipe tmp; +// std::string line; +// if (tmp.Init() && tmp.Write(bytes, bytes_len)) { +// tmp.CloseWriteFd(); +// while (tmp.ReadLine(&line)) { +// std::cerr << line << std::endl; +// } +// } +// +// Example (reading output from a child process): +// ScopedPipe tmp; +// if (fork()) { +// // Parent process, read from the read end of the pipe. +// std::string line; +// while (tmp.ReadLine(line)) { +// // Process output... +// } +// // Close read pipe once done processing the output that we wanted, this +// // should ensure that the child process exits even if we didn't read all +// // of the output. +// tmp.CloseReadFd(); +// // Parent process should handle waiting for child to exit here... +// } else { +// // Child process, close the read fd and dup the write fd before exec'ing. +// tmp.CloseReadFd(); +// tmp.Dup2WriteFd(STDOUT_FILENO); +// tmp.Dup2WriteFd(STDERR_FILENO); +// execl("some-command", "some-arguments"); +// } +class ScopedPipe { + public: + ScopedPipe(); + ~ScopedPipe(); + + // Creates the pipe pair - returns false on error. + bool Init(); + + // Close the read pipe. This only needs to be used when the read pipe needs to + // be closed earlier. + void CloseReadFd(); + + // Close the write pipe. This only needs to be used when the write pipe needs + // to be closed earlier. + void CloseWriteFd(); + + // Reads characters until newline or end of pipe. On read failure this will + // close the read pipe, but continue to return true and read buffered lines + // until the internal buffering is exhausted. This will block if there is no + // data available on the read pipe. + bool ReadLine(std::string& line); + + // Writes bytes to the write end of the pipe, returns false and closes write + // pipe on failure. + bool WriteForTesting(const void* bytes, size_t bytes_len); + + // Calls the dup2 system call to replace any existing open file descriptor + // with number new_fd with a copy of the current write end file descriptor + // for the pipe. + int Dup2WriteFd(int new_fd) const; + + private: + int GetReadFd() const { + return fds_[0]; + } + + int GetWriteFd() const { + return fds_[1]; + } + + int fds_[2]; + std::string read_buffer_; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_SCOPED_PIPE_H_ diff --git a/src/common/linux/scoped_pipe_unittest.cc b/src/common/linux/scoped_pipe_unittest.cc new file mode 100644 index 0000000..4daa5c2 --- /dev/null +++ b/src/common/linux/scoped_pipe_unittest.cc @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// scoped_pipe_unittest.cc: Unit tests for google_breakpad::ScopedPipe. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/scoped_pipe.h" + +#include "breakpad_googletest_includes.h" + +namespace google_breakpad { + +TEST(ScopedPipeTest, WriteAndClose) { + const char kTestData[] = "One\nTwo\nThree"; + ScopedPipe pipe; + std::string line; + + ASSERT_TRUE(pipe.Init()); + ASSERT_TRUE(pipe.WriteForTesting(kTestData, strlen(kTestData))); + pipe.CloseWriteFd(); + + ASSERT_TRUE(pipe.ReadLine(line)); + ASSERT_EQ(line, "One"); + ASSERT_TRUE(pipe.ReadLine(line)); + ASSERT_EQ(line, "Two"); + ASSERT_TRUE(pipe.ReadLine(line)); + ASSERT_EQ(line, "Three"); + ASSERT_FALSE(pipe.ReadLine(line)); +} + +TEST(ScopedPipeTest, MultipleWrites) { + const char kTestDataOne[] = "One\n"; + const char kTestDataTwo[] = "Two\n"; + ScopedPipe pipe; + std::string line; + + ASSERT_TRUE(pipe.Init()); + ASSERT_TRUE(pipe.WriteForTesting(kTestDataOne, strlen(kTestDataOne))); + ASSERT_TRUE(pipe.ReadLine(line)); + ASSERT_EQ(line, "One"); + + ASSERT_TRUE(pipe.WriteForTesting(kTestDataTwo, strlen(kTestDataTwo))); + ASSERT_TRUE(pipe.ReadLine(line)); + ASSERT_EQ(line, "Two"); +} + +} // namespace google_breakpad diff --git a/src/common/linux/scoped_tmpfile.cc b/src/common/linux/scoped_tmpfile.cc new file mode 100644 index 0000000..2395a64 --- /dev/null +++ b/src/common/linux/scoped_tmpfile.cc @@ -0,0 +1,103 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Utility class for creating a temporary file that is deleted in the +// destructor. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/scoped_tmpfile.h" + +#include +#include +#include +#include +#include + +#include "common/linux/eintr_wrapper.h" + +#if !defined(__ANDROID__) +#define TEMPDIR "/tmp" +#else +#define TEMPDIR "/data/local/tmp" +#endif + +namespace google_breakpad { + +ScopedTmpFile::ScopedTmpFile() = default; + +ScopedTmpFile::~ScopedTmpFile() { + if (fd_ >= 0) { + close(fd_); + fd_ = -1; + } +} + +bool ScopedTmpFile::InitEmpty() { + // Prevent calling Init when fd_ is already valid, leaking the file. + if (fd_ != -1) { + return false; + } + + // Respect the TMPDIR environment variable. + const char* tempdir = getenv("TMPDIR"); + if (!tempdir) { + tempdir = TEMPDIR; + } + + // Create a temporary file that is not linked in to the filesystem, and that + // is only accessible by the current user. + fd_ = open(tempdir, O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR); + + return fd_ >= 0; +} + +bool ScopedTmpFile::InitString(const char* text) { + return InitData(text, strlen(text)); +} + +bool ScopedTmpFile::InitData(const void* data, size_t data_len) { + if (!InitEmpty()) { + return false; + } + + return SetContents(data, data_len); +} + +bool ScopedTmpFile::SetContents(const void* data, size_t data_len) { + ssize_t r = HANDLE_EINTR(write(fd_, data, data_len)); + if (r != static_cast(data_len)) { + return false; + } + + return 0 == lseek(fd_, 0, SEEK_SET); +} + +} // namespace google_breakpad diff --git a/src/common/linux/scoped_tmpfile.h b/src/common/linux/scoped_tmpfile.h new file mode 100644 index 0000000..dffec18 --- /dev/null +++ b/src/common/linux/scoped_tmpfile.h @@ -0,0 +1,85 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Utility class for creating a temporary file for that is deleted in the +// destructor. + +#ifndef COMMON_LINUX_SCOPED_TMPFILE_H_ +#define COMMON_LINUX_SCOPED_TMPFILE_H_ + +#include + +namespace google_breakpad { + +// Small RAII wrapper for temporary files. +// +// Example: +// ScopedTmpFile tmp; +// if (tmp.Init("Some file contents")) { +// ... +// } +class ScopedTmpFile { + public: + // Initialize the ScopedTmpFile object - this does not create the temporary + // file until Init is called. + ScopedTmpFile(); + + // Destroy temporary file on scope exit. + ~ScopedTmpFile(); + + // Creates the empty temporary file - returns true iff the temporary file was + // created successfully. Should always be checked before using the file. + bool InitEmpty(); + + // Creates the temporary file with the provided C string. The terminating null + // is not written. Returns true iff the temporary file was created + // successfully and the contents were written successfully. + bool InitString(const char* text); + + // Creates the temporary file with the provided data. Returns true iff the + // temporary file was created successfully and the contents were written + // successfully. + bool InitData(const void* data, size_t data_len); + + // Returns the Posix file descriptor for the test file, or -1 if Init() + // returned false. Note: on Windows, this always returns -1. + int GetFd() const { + return fd_; + } + + private: + // Set the contents of the temporary file, and seek back to the start of the + // file. On failure, returns false. + bool SetContents(const void* data, size_t data_len); + + int fd_ = -1; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_SCOPED_TMPFILE_H_ diff --git a/src/common/linux/scoped_tmpfile_unittest.cc b/src/common/linux/scoped_tmpfile_unittest.cc new file mode 100644 index 0000000..f0bb2bb --- /dev/null +++ b/src/common/linux/scoped_tmpfile_unittest.cc @@ -0,0 +1,50 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// scoped_tmpfile_unittest.cc: Unit tests for google_breakpad::ScopedTmpfile. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/scoped_tmpfile.h" + +#include + +#include "breakpad_googletest_includes.h" + +using google_breakpad::ScopedTmpFile; + +TEST(ScopedTmpFileTest, CheckContentsMatch) { + ScopedTmpFile file; + ASSERT_TRUE(file.InitString("Test")); + + char file_contents[5] = {0}; + ASSERT_EQ(4, read(file.GetFd(), file_contents, sizeof(file_contents))); + EXPECT_STREQ(file_contents, "Test"); +} diff --git a/src/common/linux/symbol_collector_client.cc b/src/common/linux/symbol_collector_client.cc new file mode 100644 index 0000000..e9a1893 --- /dev/null +++ b/src/common/linux/symbol_collector_client.cc @@ -0,0 +1,198 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/symbol_collector_client.h" + +#include + +#include +#include + +#include "common/linux/libcurl_wrapper.h" + +namespace google_breakpad { +namespace sym_upload { + +// static +bool SymbolCollectorClient::CreateUploadUrl( + LibcurlWrapper* libcurl_wrapper, + const string& api_url, + const string& api_key, + UploadUrlResponse* uploadUrlResponse) { + string header, response; + long response_code; + + string url = api_url + "/v1/uploads:create"; + if (!api_key.empty()) { + url += "?key=" + api_key; + } + + if (!libcurl_wrapper->SendSimplePostRequest(url, + /*body=*/"", + /*content_type=*/"", + &response_code, + &header, + &response)) { + printf("Failed to create upload url.\n"); + printf("Response code: %ld\n", response_code); + printf("Response:\n"); + printf("%s\n", response.c_str()); + return false; + } + + // Note camel-case rather than underscores. + std::regex upload_url_regex("\"uploadUrl\": \"([^\"]+)\""); + std::regex upload_key_regex("\"uploadKey\": \"([^\"]+)\""); + + std::smatch upload_url_match; + if (!std::regex_search(response, upload_url_match, upload_url_regex) || + upload_url_match.size() != 2) { + printf("Failed to parse create url response."); + printf("Response:\n"); + printf("%s\n", response.c_str()); + return false; + } + string upload_url = upload_url_match[1].str(); + + std::smatch upload_key_match; + if (!std::regex_search(response, upload_key_match, upload_key_regex) || + upload_key_match.size() != 2) { + printf("Failed to parse create url response."); + printf("Response:\n"); + printf("%s\n", response.c_str()); + return false; + } + string upload_key = upload_key_match[1].str(); + + uploadUrlResponse->upload_url = upload_url; + uploadUrlResponse->upload_key = upload_key; + return true; +} + +// static +CompleteUploadResult SymbolCollectorClient::CompleteUpload( + LibcurlWrapper* libcurl_wrapper, + const string& api_url, + const string& api_key, + const string& upload_key, + const string& debug_file, + const string& debug_id, + const string& type) { + string header, response; + long response_code; + + string url = api_url + "/v1/uploads/" + upload_key + ":complete"; + if (!api_key.empty()) { + url += "?key=" + api_key; + } + string body = + "{ symbol_id: {" + "debug_file: \"" + debug_file + "\", " + "debug_id: \"" + debug_id + "\" }, " + "symbol_upload_type: \"" + type + "\" }"; + + if (!libcurl_wrapper->SendSimplePostRequest(url, + body, + "application/son", + &response_code, + &header, + &response)) { + printf("Failed to complete upload.\n"); + printf("Response code: %ld\n", response_code); + printf("Response:\n"); + printf("%s\n", response.c_str()); + return CompleteUploadResult::Error; + } + + std::regex result_regex("\"result\": \"([^\"]+)\""); + std::smatch result_match; + if (!std::regex_search(response, result_match, result_regex) || + result_match.size() != 2) { + printf("Failed to parse complete upload response."); + printf("Response:\n"); + printf("%s\n", response.c_str()); + return CompleteUploadResult::Error; + } + string result = result_match[1].str(); + + if (result.compare("DUPLICATE_DATA") == 0) { + return CompleteUploadResult::DuplicateData; + } + + return CompleteUploadResult::Ok; +} + +// static +SymbolStatus SymbolCollectorClient::CheckSymbolStatus( + LibcurlWrapper* libcurl_wrapper, + const string& api_url, + const string& api_key, + const string& debug_file, + const string& debug_id) { + string header, response; + long response_code; + string url = api_url + + "/v1/symbols/" + debug_file + "/" + debug_id + ":checkStatus"; + if (!api_key.empty()) { + url += "?key=" + api_key; + } + + if (!libcurl_wrapper->SendGetRequest( + url, + &response_code, + &header, + &response)) { + printf("Failed to check symbol status, error message.\n"); + printf("Response code: %ld\n", response_code); + printf("Response:\n"); + printf("%s\n", response.c_str()); + return SymbolStatus::Unknown; + } + + std::regex status_regex("\"status\": \"([^\"]+)\""); + std::smatch status_match; + if (!std::regex_search(response, status_match, status_regex) || + status_match.size() != 2) { + printf("Failed to parse check symbol status response."); + printf("Response:\n"); + printf("%s\n", response.c_str()); + return SymbolStatus::Unknown; + } + string status = status_match[1].str(); + + return (status.compare("FOUND") == 0) ? + SymbolStatus::Found : + SymbolStatus::Missing; +} + +} // namespace sym_upload +} // namespace google_breakpad diff --git a/src/common/linux/symbol_collector_client.h b/src/common/linux/symbol_collector_client.h new file mode 100644 index 0000000..6190376 --- /dev/null +++ b/src/common/linux/symbol_collector_client.h @@ -0,0 +1,87 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_LINUX_SYMBOL_COLLECTOR_CLIENT_H_ +#define COMMON_LINUX_SYMBOL_COLLECTOR_CLIENT_H_ + +#include + +#include "common/linux/libcurl_wrapper.h" +#include "common/using_std_string.h" + +namespace google_breakpad { +namespace sym_upload { + +struct UploadUrlResponse { + string upload_url; + string upload_key; +}; + +enum SymbolStatus { + Found, + Missing, + Unknown +}; + +enum CompleteUploadResult { + Ok, + DuplicateData, + Error +}; + +// Helper class to communicate with a sym-upload-v2 service over HTTP/REST, +// via libcurl. +class SymbolCollectorClient { + public: + static bool CreateUploadUrl( + LibcurlWrapper* libcurl_wrapper, + const string& api_url, + const string& api_key, + UploadUrlResponse* uploadUrlResponse); + + static CompleteUploadResult CompleteUpload( + LibcurlWrapper* libcurl_wrapper, + const string& api_url, + const string& api_key, + const string& upload_key, + const string& debug_file, + const string& debug_id, + const string& type); + + static SymbolStatus CheckSymbolStatus( + LibcurlWrapper* libcurl_wrapper, + const string& api_url, + const string& api_key, + const string& debug_file, + const string& debug_id); +}; + +} // namespace sym_upload +} // namespace google_breakpad + +#endif // COMMON_LINUX_SYMBOL_COLLECTOR_CLIENT_H_ diff --git a/src/common/linux/symbol_upload.cc b/src/common/linux/symbol_upload.cc new file mode 100644 index 0000000..8ab143c --- /dev/null +++ b/src/common/linux/symbol_upload.cc @@ -0,0 +1,287 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// symbol_upload.cc: implemented google_breakpad::sym_upload::Start, a helper +// function for linux symbol upload tool. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/symbol_upload.h" + +#include +#include + +#include +#include +#include + +#include "common/linux/http_upload.h" +#include "common/linux/libcurl_wrapper.h" +#include "common/linux/symbol_collector_client.h" + +namespace google_breakpad { +namespace sym_upload { + +void TokenizeByChar(const string& source_string, int c, + std::vector* results) { + assert(results); + string::size_type cur_pos = 0, next_pos = 0; + while ((next_pos = source_string.find(c, cur_pos)) != string::npos) { + if (next_pos != cur_pos) + results->push_back(source_string.substr(cur_pos, next_pos - cur_pos)); + cur_pos = next_pos + 1; + } + if (cur_pos < source_string.size() && next_pos != cur_pos) + results->push_back(source_string.substr(cur_pos)); +} + +//============================================================================= +// Parse out the module line which have 5 parts. +// MODULE +bool ModuleDataForSymbolFile(const string& file, + std::vector* module_parts) { + assert(module_parts); + const size_t kModulePartNumber = 5; + FILE* fp = fopen(file.c_str(), "r"); + if (fp) { + char buffer[1024]; + if (fgets(buffer, sizeof(buffer), fp)) { + string line(buffer); + string::size_type line_break_pos = line.find_first_of('\n'); + if (line_break_pos == string::npos) { + assert(0 && "The file is invalid!"); + fclose(fp); + return false; + } + line.resize(line_break_pos); + const char kDelimiter = ' '; + TokenizeByChar(line, kDelimiter, module_parts); + if (module_parts->size() != kModulePartNumber) + module_parts->clear(); + } + fclose(fp); + } + + return module_parts->size() == kModulePartNumber; +} + +//============================================================================= +string CompactIdentifier(const string& uuid) { + std::vector components; + TokenizeByChar(uuid, '-', &components); + string result; + for (size_t i = 0; i < components.size(); ++i) + result += components[i]; + return result; +} + +// |options| describes the current sym_upload options. +// |module_parts| contains the strings parsed from the MODULE entry of the +// Breakpad symbol file being uploaded. +// |compacted_id| is the debug_id from the MODULE entry of the Breakpad symbol +// file being uploaded, with all hyphens removed. +bool SymUploadV1Start( + const Options& options, + std::vector module_parts, + const string& compacted_id) { + std::map parameters; + // Add parameters + if (!options.version.empty()) + parameters["version"] = options.version; + + // MODULE + // 0 1 2 3 4 + parameters["os"] = module_parts[1]; + parameters["cpu"] = module_parts[2]; + parameters["debug_file"] = module_parts[4]; + parameters["code_file"] = module_parts[4]; + parameters["debug_identifier"] = compacted_id; + + std::map files; + files["symbol_file"] = options.symbolsPath; + + string response, error; + long response_code; + bool success = HTTPUpload::SendRequest(options.uploadURLStr, + parameters, + files, + options.proxy, + options.proxy_user_pwd, + /*ca_certificate_file=*/"", + &response, + &response_code, + &error); + + if (!success) { + printf("Failed to send symbol file: %s\n", error.c_str()); + printf("Response code: %ld\n", response_code); + printf("Response:\n"); + printf("%s\n", response.c_str()); + } else if (response_code == 0) { + printf("Failed to send symbol file: No response code\n"); + } else if (response_code != 200) { + printf("Failed to send symbol file: Response code %ld\n", response_code); + printf("Response:\n"); + printf("%s\n", response.c_str()); + } else { + printf("Successfully sent the symbol file.\n"); + } + + return success; +} + +// |options| describes the current sym_upload options. +// |code_id| is the basename of the module for which symbols are being +// uploaded. +// |debug_id| is the debug_id of the module for which symbols are being +// uploaded. +bool SymUploadV2Start( + const Options& options, + const string& code_file, + const string& debug_id, + const string& type) { + google_breakpad::LibcurlWrapper libcurl_wrapper; + if (!libcurl_wrapper.Init()) { + printf("Failed to init google_breakpad::LibcurlWrapper.\n"); + return false; + } + + if (!options.force) { + SymbolStatus symbolStatus = SymbolCollectorClient::CheckSymbolStatus( + &libcurl_wrapper, + options.uploadURLStr, + options.api_key, + code_file, + debug_id); + if (symbolStatus == SymbolStatus::Found) { + printf("Symbol file already exists, upload aborted." + " Use \"-f\" to overwrite.\n"); + return true; + } else if (symbolStatus == SymbolStatus::Unknown) { + printf("Failed to check for existing symbol.\n"); + return false; + } + } + + UploadUrlResponse uploadUrlResponse; + if (!SymbolCollectorClient::CreateUploadUrl( + &libcurl_wrapper, + options.uploadURLStr, + options.api_key, + &uploadUrlResponse)) { + printf("Failed to create upload URL.\n"); + return false; + } + + string signed_url = uploadUrlResponse.upload_url; + string upload_key = uploadUrlResponse.upload_key; + string header; + string response; + long response_code; + + if (!libcurl_wrapper.SendPutRequest(signed_url, + options.symbolsPath, + &response_code, + &header, + &response)) { + printf("Failed to send symbol file.\n"); + printf("Response code: %ld\n", response_code); + printf("Response:\n"); + printf("%s\n", response.c_str()); + return false; + } else if (response_code == 0) { + printf("Failed to send symbol file: No response code\n"); + return false; + } else if (response_code != 200) { + printf("Failed to send symbol file: Response code %ld\n", response_code); + printf("Response:\n"); + printf("%s\n", response.c_str()); + return false; + } + + CompleteUploadResult completeUploadResult = + SymbolCollectorClient::CompleteUpload(&libcurl_wrapper, + options.uploadURLStr, + options.api_key, + upload_key, + code_file, + debug_id, + type); + if (completeUploadResult == CompleteUploadResult::Error) { + printf("Failed to complete upload.\n"); + return false; + } else if (completeUploadResult == CompleteUploadResult::DuplicateData) { + printf("Uploaded file checksum matched existing file checksum," + " no change necessary.\n"); + } else { + printf("Successfully sent the symbol file.\n"); + } + + return true; +} + +//============================================================================= +void Start(Options* options) { + if (options->upload_protocol == UploadProtocol::SYM_UPLOAD_V2) { + string code_file; + string debug_id; + string type; + + if (options->type.empty() || options->type == kBreakpadSymbolType) { + // Breakpad upload so read these from input file. + std::vector module_parts; + if (!ModuleDataForSymbolFile(options->symbolsPath, &module_parts)) { + fprintf(stderr, "Failed to parse symbol file!\n"); + return; + } + code_file = module_parts[4]; + debug_id = CompactIdentifier(module_parts[3]); + type = kBreakpadSymbolType; + } else { + // Native upload so these must be explicitly set. + code_file = options->code_file; + debug_id = options->debug_id; + type = options->type; + } + + options->success = SymUploadV2Start(*options, code_file, debug_id, type); + } else { + std::vector module_parts; + if (!ModuleDataForSymbolFile(options->symbolsPath, &module_parts)) { + fprintf(stderr, "Failed to parse symbol file!\n"); + return; + } + const string compacted_id = CompactIdentifier(module_parts[3]); + options->success = SymUploadV1Start(*options, module_parts, compacted_id); + } +} + +} // namespace sym_upload +} // namespace google_breakpad diff --git a/src/common/linux/symbol_upload.h b/src/common/linux/symbol_upload.h new file mode 100644 index 0000000..a9d30e7 --- /dev/null +++ b/src/common/linux/symbol_upload.h @@ -0,0 +1,75 @@ +// -*- mode: c++ -*- + +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// symbol_upload.h: helper functions for linux symbol upload tool. + +#ifndef COMMON_LINUX_SYMBOL_UPLOAD_H_ +#define COMMON_LINUX_SYMBOL_UPLOAD_H_ + +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { +namespace sym_upload { + +enum class UploadProtocol { + SYM_UPLOAD_V1, + SYM_UPLOAD_V2, +}; + +constexpr char kBreakpadSymbolType[] = "BREAKPAD"; + +struct Options { + Options() : upload_protocol(UploadProtocol::SYM_UPLOAD_V1), force(false) {} + + string symbolsPath; + string uploadURLStr; + string proxy; + string proxy_user_pwd; + string version; + bool success; + UploadProtocol upload_protocol; + bool force; + string api_key; + + // These only need to be set for native symbol uploads. + string code_file; + string debug_id; + string type; +}; + +// Starts upload to symbol server with options. +void Start(Options* options); + +} // namespace sym_upload +} // namespace google_breakpad + +#endif // COMMON_LINUX_SYMBOL_UPLOAD_H_ diff --git a/src/common/linux/synth_elf.cc b/src/common/linux/synth_elf.cc new file mode 100644 index 0000000..8e9170e --- /dev/null +++ b/src/common/linux/synth_elf.cc @@ -0,0 +1,267 @@ +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/synth_elf.h" + +#include +#include +#include +#include + +#include "common/linux/elf_gnu_compat.h" +#include "common/using_std_string.h" + +namespace google_breakpad { +namespace synth_elf { + +ELF::ELF(uint16_t machine, + uint8_t file_class, + Endianness endianness) + : Section(endianness), + addr_size_(file_class == ELFCLASS64 ? 8 : 4), + program_count_(0), + program_header_table_(endianness), + section_count_(0), + section_header_table_(endianness), + section_header_strings_(endianness) { + // Could add support for more machine types here if needed. + assert(machine == EM_386 || + machine == EM_X86_64 || + machine == EM_ARM); + assert(file_class == ELFCLASS32 || file_class == ELFCLASS64); + + start() = 0; + // Add ELF header + // e_ident + // EI_MAG0...EI_MAG3 + D8(ELFMAG0); + D8(ELFMAG1); + D8(ELFMAG2); + D8(ELFMAG3); + // EI_CLASS + D8(file_class); + // EI_DATA + D8(endianness == kLittleEndian ? ELFDATA2LSB : ELFDATA2MSB); + // EI_VERSION + D8(EV_CURRENT); + // EI_OSABI + D8(ELFOSABI_SYSV); + // EI_ABIVERSION + D8(0); + // EI_PAD + Append(7, 0); + assert(Size() == EI_NIDENT); + + // e_type + D16(ET_EXEC); //TODO: allow passing ET_DYN? + // e_machine + D16(machine); + // e_version + D32(EV_CURRENT); + // e_entry + Append(endianness, addr_size_, 0); + // e_phoff + Append(endianness, addr_size_, program_header_label_); + // e_shoff + Append(endianness, addr_size_, section_header_label_); + // e_flags + D32(0); + // e_ehsize + D16(addr_size_ == 8 ? sizeof(Elf64_Ehdr) : sizeof(Elf32_Ehdr)); + // e_phentsize + D16(addr_size_ == 8 ? sizeof(Elf64_Phdr) : sizeof(Elf32_Phdr)); + // e_phnum + D16(program_count_label_); + // e_shentsize + D16(addr_size_ == 8 ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr)); + // e_shnum + D16(section_count_label_); + // e_shstrndx + D16(section_header_string_index_); + + // Add an empty section for SHN_UNDEF. + Section shn_undef; + AddSection("", shn_undef, SHT_NULL); +} + +int ELF::AddSection(const string& name, const Section& section, + uint32_t type, uint32_t flags, uint64_t addr, + uint32_t link, uint64_t entsize, uint64_t offset) { + Label offset_label; + Label string_label(section_header_strings_.Add(name)); + size_t size = section.Size(); + + int index = section_count_; + ++section_count_; + + section_header_table_ + // sh_name + .D32(string_label) + // sh_type + .D32(type) + // sh_flags + .Append(endianness(), addr_size_, flags) + // sh_addr + .Append(endianness(), addr_size_, addr) + // sh_offset + .Append(endianness(), addr_size_, offset_label) + // sh_size + .Append(endianness(), addr_size_, size) + // sh_link + .D32(link) + // sh_info + .D32(0) + // sh_addralign + .Append(endianness(), addr_size_, 0) + // sh_entsize + .Append(endianness(), addr_size_, entsize); + + sections_.push_back(ElfSection(section, type, addr, offset, offset_label, + size)); + return index; +} + +void ELF::AppendSection(ElfSection& section) { + // NULL and NOBITS sections have no content, so they + // don't need to be written to the file. + if (section.type_ == SHT_NULL) { + section.offset_label_ = 0; + } else if (section.type_ == SHT_NOBITS) { + section.offset_label_ = section.offset_; + } else { + Mark(§ion.offset_label_); + Append(section); + Align(4); + } +} + +void ELF::AddSegment(int start, int end, uint32_t type, uint32_t flags) { + assert(start > 0); + assert(size_t(start) < sections_.size()); + assert(end > 0); + assert(size_t(end) < sections_.size()); + ++program_count_; + + // p_type + program_header_table_.D32(type); + + if (addr_size_ == 8) { + // p_flags + program_header_table_.D32(flags); + } + + size_t filesz = 0; + size_t memsz = 0; + bool prev_was_nobits = false; + for (int i = start; i <= end; ++i) { + size_t size = sections_[i].size_; + if (sections_[i].type_ != SHT_NOBITS) { + assert(!prev_was_nobits); + // non SHT_NOBITS sections are 4-byte aligned (see AddSection) + size = (size + 3) & ~3; + filesz += size; + } else { + prev_was_nobits = true; + } + memsz += size; + } + + program_header_table_ + // p_offset + .Append(endianness(), addr_size_, sections_[start].offset_label_) + // p_vaddr + .Append(endianness(), addr_size_, sections_[start].addr_) + // p_paddr + .Append(endianness(), addr_size_, sections_[start].addr_) + // p_filesz + .Append(endianness(), addr_size_, filesz) + // p_memsz + .Append(endianness(), addr_size_, memsz); + + if (addr_size_ == 4) { + // p_flags + program_header_table_.D32(flags); + } + + // p_align + program_header_table_.Append(endianness(), addr_size_, 0); +} + +void ELF::Finish() { + // Add the section header string table at the end. + section_header_string_index_ = section_count_; + //printf(".shstrtab size: %ld\n", section_header_strings_.Size()); + AddSection(".shstrtab", section_header_strings_, SHT_STRTAB); + //printf("section_count_: %ld, sections_.size(): %ld\n", + // section_count_, sections_.size()); + if (program_count_) { + Mark(&program_header_label_); + Append(program_header_table_); + } else { + program_header_label_ = 0; + } + + for (vector::iterator it = sections_.begin(); + it < sections_.end(); ++it) { + AppendSection(*it); + } + section_count_label_ = section_count_; + program_count_label_ = program_count_; + + // Section header table starts here. + Mark(§ion_header_label_); + Append(section_header_table_); +} + +SymbolTable::SymbolTable(Endianness endianness, + size_t addr_size, + StringTable& table) : Section(endianness), + table_(table) { +#ifndef NDEBUG + addr_size_ = addr_size; +#endif + assert(addr_size_ == 4 || addr_size_ == 8); +} + +void SymbolTable::AddSymbol(const string& name, uint32_t value, + uint32_t size, unsigned info, uint16_t shndx) { + assert(addr_size_ == 4); + D32(table_.Add(name)); + D32(value); + D32(size); + D8(info); + D8(0); // other + D16(shndx); +} + +void SymbolTable::AddSymbol(const string& name, uint64_t value, + uint64_t size, unsigned info, uint16_t shndx) { + assert(addr_size_ == 8); + D32(table_.Add(name)); + D8(info); + D8(0); // other + D16(shndx); + D64(value); + D64(size); +} + +void Notes::AddNote(int type, const string& name, const uint8_t* desc_bytes, + size_t desc_size) { + // Elf32_Nhdr and Elf64_Nhdr are exactly the same. + Elf32_Nhdr note_header; + memset(¬e_header, 0, sizeof(note_header)); + note_header.n_namesz = name.length() + 1; + note_header.n_descsz = desc_size; + note_header.n_type = type; + + Append(reinterpret_cast(¬e_header), + sizeof(note_header)); + AppendCString(name); + Align(4); + Append(desc_bytes, desc_size); + Align(4); +} + +} // namespace synth_elf +} // namespace google_breakpad diff --git a/src/common/linux/synth_elf.h b/src/common/linux/synth_elf.h new file mode 100644 index 0000000..bf22081 --- /dev/null +++ b/src/common/linux/synth_elf.h @@ -0,0 +1,196 @@ +// -*- mode: C++ -*- + +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Ted Mielczarek + +// synth_elf.h: Interface to synth_elf::ELF: fake ELF generator. + +#ifndef COMMON_LINUX_SYNTH_ELF_H_ +#define COMMON_LINUX_SYNTH_ELF_H_ + +#include "common/test_assembler.h" + +#include +#include +#include +#include +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { +namespace synth_elf { + +using std::list; +using std::vector; +using std::map; +using std::pair; +using test_assembler::Endianness; +using test_assembler::kLittleEndian; +using test_assembler::kUnsetEndian; +using test_assembler::Label; +using test_assembler::Section; + +// String tables are common in ELF headers, so subclass Section +// to make them easy to generate. +class StringTable : public Section { +public: + StringTable(Endianness endianness = kUnsetEndian) + : Section(endianness) { + start() = 0; + empty_string = Add(""); + } + + // Add the string s to the string table, and return + // a label containing the offset into the string table + // at which it was added. + Label Add(const string& s) { + if (strings_.find(s) != strings_.end()) + return strings_[s]; + + Label string_label(Here()); + AppendCString(s); + strings_[s] = string_label; + return string_label; + } + + // All StringTables contain an empty string as their first + // entry. + Label empty_string; + + // Avoid inserting duplicate strings. + map strings_; +}; + +// A Section representing an entire ELF file. +class ELF : public Section { + public: + ELF(uint16_t machine, // EM_386, etc + uint8_t file_class, // ELFCLASS{32,64} + Endianness endianness = kLittleEndian); + + // Add the Section section to the section header table and append it + // to the file. Returns the index of the section in the section + // header table. + int AddSection(const string& name, const Section& section, + uint32_t type, uint32_t flags = 0, uint64_t addr = 0, + uint32_t link = 0, uint64_t entsize = 0, uint64_t offset = 0); + + // Add a segment containing from section index start to section index end. + // The indexes must have been gotten from AddSection. + void AddSegment(int start, int end, uint32_t type, uint32_t flags = 0); + + // Write out all data. GetContents may be used after this. + void Finish(); + + private: + // Size of an address, in bytes. + const size_t addr_size_; + + // Offset to the program header table. + Label program_header_label_; + // Number of entries in the program header table. + int program_count_; + Label program_count_label_; + // The program header table itself. + Section program_header_table_; + + // Offset to the section header table. + Label section_header_label_; + // Number of entries in the section header table. + int section_count_; + Label section_count_label_; + // The section header table itself. + Section section_header_table_; + + // Index of the section header string table in the section + // header table. + Label section_header_string_index_; + // Section containing the names of section header table entries. + StringTable section_header_strings_; + + // Record of an added section + struct ElfSection : public Section { + ElfSection(const Section& section, uint32_t type, uint32_t addr, + uint32_t offset, Label offset_label, uint32_t size) + : Section(section), type_(type), addr_(addr), offset_(offset) + , offset_label_(offset_label), size_(size) { + } + + uint32_t type_; + uint32_t addr_; + uint32_t offset_; + Label offset_label_; + uint32_t size_; + }; + + vector sections_; + + void AppendSection(ElfSection& section); +}; + +// A class to build .symtab or .dynsym sections. +class SymbolTable : public Section { + public: + // table is the StringTable that contains symbol names. The caller + // must ensure that it remains alive for the life of the + // SymbolTable. + SymbolTable(Endianness endianness, size_t addr_size, StringTable& table); + + // Add an Elf32_Sym. + void AddSymbol(const string& name, uint32_t value, + uint32_t size, unsigned info, uint16_t shndx); + // Add an Elf64_Sym. + void AddSymbol(const string& name, uint64_t value, + uint64_t size, unsigned info, uint16_t shndx); + + private: +#ifndef NDEBUG + size_t addr_size_; +#endif + StringTable& table_; +}; + +// A class for note sections +class Notes : public Section { +public: + Notes(Endianness endianness) + : Section(endianness) { + } + + // Add a note. + void AddNote(int type, const string& name, const uint8_t* desc_bytes, + size_t desc_size); +}; + +} // namespace synth_elf +} // namespace google_breakpad + +#endif // COMMON_LINUX_SYNTH_ELF_H_ diff --git a/src/common/linux/synth_elf_unittest.cc b/src/common/linux/synth_elf_unittest.cc new file mode 100644 index 0000000..578f6a2 --- /dev/null +++ b/src/common/linux/synth_elf_unittest.cc @@ -0,0 +1,416 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Ted Mielczarek + +// synth_elf_unittest.cc: +// Unittests for google_breakpad::synth_elf::ELF + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "breakpad_googletest_includes.h" +#include "common/linux/elfutils.h" +#include "common/linux/synth_elf.h" +#include "common/using_std_string.h" + +using google_breakpad::ElfClass32; +using google_breakpad::ElfClass64; +using google_breakpad::synth_elf::ELF; +using google_breakpad::synth_elf::Notes; +using google_breakpad::synth_elf::Section; +using google_breakpad::synth_elf::StringTable; +using google_breakpad::synth_elf::SymbolTable; +using google_breakpad::test_assembler::Endianness; +using google_breakpad::test_assembler::kBigEndian; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; +using ::testing::Test; +using ::testing::Types; + +class StringTableTest : public Test { +public: + StringTableTest() : table(kLittleEndian) {} + + StringTable table; +}; + +TEST_F(StringTableTest, Empty) { + EXPECT_EQ(1U, table.Size()); + string contents; + ASSERT_TRUE(table.GetContents(&contents)); + const char* kExpectedContents = "\0"; + EXPECT_EQ(0, memcmp(kExpectedContents, + contents.c_str(), + contents.size())); + ASSERT_TRUE(table.empty_string.IsKnownConstant()); + EXPECT_EQ(0U, table.empty_string.Value()); +} + +TEST_F(StringTableTest, Basic) { + const string s1("table fills with strings"); + const string s2("offsets preserved as labels"); + const string s3("verified with tests"); + const char* kExpectedContents = + "\0table fills with strings\0" + "offsets preserved as labels\0" + "verified with tests\0"; + Label l1(table.Add(s1)); + Label l2(table.Add(s2)); + Label l3(table.Add(s3)); + string contents; + ASSERT_TRUE(table.GetContents(&contents)); + EXPECT_EQ(0, memcmp(kExpectedContents, + contents.c_str(), + contents.size())); + // empty_string is at zero, other strings start at 1. + ASSERT_TRUE(l1.IsKnownConstant()); + EXPECT_EQ(1U, l1.Value()); + // Each string has an extra byte for a trailing null. + EXPECT_EQ(1 + s1.length() + 1, l2.Value()); + EXPECT_EQ(1 + s1.length() + 1 + s2.length() + 1, l3.Value()); +} + +TEST_F(StringTableTest, Duplicates) { + const string s1("string 1"); + const string s2("string 2"); + const string s3(""); + const char* kExpectedContents = "\0string 1\0string 2\0"; + Label l1(table.Add(s1)); + Label l2(table.Add(s2)); + // Adding strings twice should return the same Label. + Label l3(table.Add(s3)); + Label l4(table.Add(s2)); + string contents; + ASSERT_TRUE(table.GetContents(&contents)); + EXPECT_EQ(0, memcmp(kExpectedContents, + contents.c_str(), + contents.size())); + EXPECT_EQ(0U, table.empty_string.Value()); + EXPECT_EQ(table.empty_string.Value(), l3.Value()); + EXPECT_EQ(l2.Value(), l4.Value()); +} + +class SymbolTableTest : public Test {}; + +TEST_F(SymbolTableTest, Simple32) { + StringTable table(kLittleEndian); + SymbolTable syms(kLittleEndian, 4, table); + + const string kFuncName1 = "superfunc"; + const uint32_t kFuncAddr1 = 0x10001000; + const uint32_t kFuncSize1 = 0x10; + const string kFuncName2 = "awesomefunc"; + const uint32_t kFuncAddr2 = 0x20002000; + const uint32_t kFuncSize2 = 0x2f; + const string kFuncName3 = "megafunc"; + const uint32_t kFuncAddr3 = 0x30003000; + const uint32_t kFuncSize3 = 0x3c; + + syms.AddSymbol(kFuncName1, kFuncAddr1, kFuncSize1, + ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), + SHN_UNDEF + 1); + syms.AddSymbol(kFuncName2, kFuncAddr2, kFuncSize2, + ELF32_ST_INFO(STB_LOCAL, STT_FUNC), + SHN_UNDEF + 2); + syms.AddSymbol(kFuncName3, kFuncAddr3, kFuncSize3, + ELF32_ST_INFO(STB_LOCAL, STT_FUNC), + SHN_UNDEF + 3); + + const char kExpectedStringTable[] = "\0superfunc\0awesomefunc\0megafunc"; + const size_t kExpectedStringTableSize = sizeof(kExpectedStringTable); + EXPECT_EQ(kExpectedStringTableSize, table.Size()); + string table_contents; + table.GetContents(&table_contents); + EXPECT_EQ(0, memcmp(kExpectedStringTable, + table_contents.c_str(), + table_contents.size())); + + const uint8_t kExpectedSymbolContents[] = { + // Symbol 1 + 0x01, 0x00, 0x00, 0x00, // name + 0x00, 0x10, 0x00, 0x10, // value + 0x10, 0x00, 0x00, 0x00, // size + ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), // info + 0x00, // other + 0x01, 0x00, // shndx + // Symbol 2 + 0x0B, 0x00, 0x00, 0x00, // name + 0x00, 0x20, 0x00, 0x20, // value + 0x2f, 0x00, 0x00, 0x00, // size + ELF32_ST_INFO(STB_LOCAL, STT_FUNC), // info + 0x00, // other + 0x02, 0x00, // shndx + // Symbol 3 + 0x17, 0x00, 0x00, 0x00, // name + 0x00, 0x30, 0x00, 0x30, // value + 0x3c, 0x00, 0x00, 0x00, // size + ELF32_ST_INFO(STB_LOCAL, STT_FUNC), // info + 0x00, // other + 0x03, 0x00, // shndx + }; + const size_t kExpectedSymbolSize = sizeof(kExpectedSymbolContents); + EXPECT_EQ(kExpectedSymbolSize, syms.Size()); + + string symbol_contents; + syms.GetContents(&symbol_contents); + EXPECT_EQ(0, memcmp(kExpectedSymbolContents, + symbol_contents.c_str(), + symbol_contents.size())); +} + +template +class BasicElf : public Test {}; + +// Doesn't seem worthwhile writing the tests to be endian-independent +// when they're unlikely to ever be run on big-endian systems. +#if defined(__i386__) || defined(__x86_64__) + +typedef Types ElfClasses; + +TYPED_TEST_SUITE(BasicElf, ElfClasses); + +TYPED_TEST(BasicElf, EmptyLE) { + typedef typename TypeParam::Ehdr Ehdr; + typedef typename TypeParam::Phdr Phdr; + typedef typename TypeParam::Shdr Shdr; + const size_t kStringTableSize = sizeof("\0.shstrtab"); + const size_t kStringTableAlign = 4 - kStringTableSize % 4; + const size_t kExpectedSize = sizeof(Ehdr) + + // Two sections, SHT_NULL + the section header string table. + 2 * sizeof(Shdr) + + kStringTableSize + kStringTableAlign; + + // It doesn't really matter that the machine type is right for the class. + ELF elf(EM_386, TypeParam::kClass, kLittleEndian); + elf.Finish(); + EXPECT_EQ(kExpectedSize, elf.Size()); + + string contents; + ASSERT_TRUE(elf.GetContents(&contents)); + ASSERT_EQ(kExpectedSize, contents.size()); + const Ehdr* header = + reinterpret_cast(contents.data()); + const uint8_t kIdent[] = { + ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, + TypeParam::kClass, ELFDATA2LSB, EV_CURRENT, ELFOSABI_SYSV, + 0, 0, 0, 0, 0, 0, 0, 0 + }; + EXPECT_EQ(0, memcmp(kIdent, header->e_ident, sizeof(kIdent))); + EXPECT_EQ(ET_EXEC, header->e_type); + EXPECT_EQ(EM_386, header->e_machine); + EXPECT_EQ(static_cast(EV_CURRENT), header->e_version); + EXPECT_EQ(0U, header->e_entry); + EXPECT_EQ(0U, header->e_phoff); + EXPECT_EQ(sizeof(Ehdr) + kStringTableSize + kStringTableAlign, + header->e_shoff); + EXPECT_EQ(0U, header->e_flags); + EXPECT_EQ(sizeof(Ehdr), header->e_ehsize); + EXPECT_EQ(sizeof(Phdr), header->e_phentsize); + EXPECT_EQ(0, header->e_phnum); + EXPECT_EQ(sizeof(Shdr), header->e_shentsize); + EXPECT_EQ(2, header->e_shnum); + EXPECT_EQ(1, header->e_shstrndx); + + const Shdr* shdr = + reinterpret_cast(contents.data() + header->e_shoff); + EXPECT_EQ(0U, shdr[0].sh_name); + EXPECT_EQ(static_cast(SHT_NULL), shdr[0].sh_type); + EXPECT_EQ(0U, shdr[0].sh_flags); + EXPECT_EQ(0U, shdr[0].sh_addr); + EXPECT_EQ(0U, shdr[0].sh_offset); + EXPECT_EQ(0U, shdr[0].sh_size); + EXPECT_EQ(0U, shdr[0].sh_link); + EXPECT_EQ(0U, shdr[0].sh_info); + EXPECT_EQ(0U, shdr[0].sh_addralign); + EXPECT_EQ(0U, shdr[0].sh_entsize); + + EXPECT_EQ(1U, shdr[1].sh_name); + EXPECT_EQ(static_cast(SHT_STRTAB), shdr[1].sh_type); + EXPECT_EQ(0U, shdr[1].sh_flags); + EXPECT_EQ(0U, shdr[1].sh_addr); + EXPECT_EQ(sizeof(Ehdr), shdr[1].sh_offset); + EXPECT_EQ(kStringTableSize, shdr[1].sh_size); + EXPECT_EQ(0U, shdr[1].sh_link); + EXPECT_EQ(0U, shdr[1].sh_info); + EXPECT_EQ(0U, shdr[1].sh_addralign); + EXPECT_EQ(0U, shdr[1].sh_entsize); +} + +TYPED_TEST(BasicElf, BasicLE) { + typedef typename TypeParam::Ehdr Ehdr; + typedef typename TypeParam::Phdr Phdr; + typedef typename TypeParam::Shdr Shdr; + const size_t kStringTableSize = sizeof("\0.text\0.bss\0.shstrtab"); + const size_t kStringTableAlign = 4 - kStringTableSize % 4; + const size_t kExpectedSize = sizeof(Ehdr) + + // Four sections, SHT_NULL + the section header string table + + // 4096 bytes of the size-aligned .text section + one program header. + sizeof(Phdr) + 4 * sizeof(Shdr) + 4096 + + kStringTableSize + kStringTableAlign; + + // It doesn't really matter that the machine type is right for the class. + ELF elf(EM_386, TypeParam::kClass, kLittleEndian); + Section text(kLittleEndian); + text.Append(4094, 0); + int text_idx = elf.AddSection(".text", text, SHT_PROGBITS); + Section bss(kLittleEndian); + bss.Append(16, 0); + int bss_idx = elf.AddSection(".bss", bss, SHT_NOBITS); + elf.AddSegment(text_idx, bss_idx, PT_LOAD); + elf.Finish(); + EXPECT_EQ(kExpectedSize, elf.Size()); + + string contents; + ASSERT_TRUE(elf.GetContents(&contents)); + ASSERT_EQ(kExpectedSize, contents.size()); + const Ehdr* header = + reinterpret_cast(contents.data()); + const uint8_t kIdent[] = { + ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, + TypeParam::kClass, ELFDATA2LSB, EV_CURRENT, ELFOSABI_SYSV, + 0, 0, 0, 0, 0, 0, 0, 0 + }; + EXPECT_EQ(0, memcmp(kIdent, header->e_ident, sizeof(kIdent))); + EXPECT_EQ(ET_EXEC, header->e_type); + EXPECT_EQ(EM_386, header->e_machine); + EXPECT_EQ(static_cast(EV_CURRENT), header->e_version); + EXPECT_EQ(0U, header->e_entry); + EXPECT_EQ(sizeof(Ehdr), header->e_phoff); + EXPECT_EQ(sizeof(Ehdr) + sizeof(Phdr) + 4096 + kStringTableSize + + kStringTableAlign, header->e_shoff); + EXPECT_EQ(0U, header->e_flags); + EXPECT_EQ(sizeof(Ehdr), header->e_ehsize); + EXPECT_EQ(sizeof(Phdr), header->e_phentsize); + EXPECT_EQ(1, header->e_phnum); + EXPECT_EQ(sizeof(Shdr), header->e_shentsize); + EXPECT_EQ(4, header->e_shnum); + EXPECT_EQ(3, header->e_shstrndx); + + const Shdr* shdr = + reinterpret_cast(contents.data() + header->e_shoff); + EXPECT_EQ(0U, shdr[0].sh_name); + EXPECT_EQ(static_cast(SHT_NULL), shdr[0].sh_type); + EXPECT_EQ(0U, shdr[0].sh_flags); + EXPECT_EQ(0U, shdr[0].sh_addr); + EXPECT_EQ(0U, shdr[0].sh_offset); + EXPECT_EQ(0U, shdr[0].sh_size); + EXPECT_EQ(0U, shdr[0].sh_link); + EXPECT_EQ(0U, shdr[0].sh_info); + EXPECT_EQ(0U, shdr[0].sh_addralign); + EXPECT_EQ(0U, shdr[0].sh_entsize); + + EXPECT_EQ(1U, shdr[1].sh_name); + EXPECT_EQ(static_cast(SHT_PROGBITS), shdr[1].sh_type); + EXPECT_EQ(0U, shdr[1].sh_flags); + EXPECT_EQ(0U, shdr[1].sh_addr); + EXPECT_EQ(sizeof(Ehdr) + sizeof(Phdr), shdr[1].sh_offset); + EXPECT_EQ(4094U, shdr[1].sh_size); + EXPECT_EQ(0U, shdr[1].sh_link); + EXPECT_EQ(0U, shdr[1].sh_info); + EXPECT_EQ(0U, shdr[1].sh_addralign); + EXPECT_EQ(0U, shdr[1].sh_entsize); + + EXPECT_EQ(sizeof("\0.text"), shdr[2].sh_name); + EXPECT_EQ(static_cast(SHT_NOBITS), shdr[2].sh_type); + EXPECT_EQ(0U, shdr[2].sh_flags); + EXPECT_EQ(0U, shdr[2].sh_addr); + EXPECT_EQ(0U, shdr[2].sh_offset); + EXPECT_EQ(16U, shdr[2].sh_size); + EXPECT_EQ(0U, shdr[2].sh_link); + EXPECT_EQ(0U, shdr[2].sh_info); + EXPECT_EQ(0U, shdr[2].sh_addralign); + EXPECT_EQ(0U, shdr[2].sh_entsize); + + EXPECT_EQ(sizeof("\0.text\0.bss"), shdr[3].sh_name); + EXPECT_EQ(static_cast(SHT_STRTAB), shdr[3].sh_type); + EXPECT_EQ(0U, shdr[3].sh_flags); + EXPECT_EQ(0U, shdr[3].sh_addr); + EXPECT_EQ(sizeof(Ehdr) + sizeof(Phdr) + 4096, shdr[3].sh_offset); + EXPECT_EQ(kStringTableSize, shdr[3].sh_size); + EXPECT_EQ(0U, shdr[3].sh_link); + EXPECT_EQ(0U, shdr[3].sh_info); + EXPECT_EQ(0U, shdr[3].sh_addralign); + EXPECT_EQ(0U, shdr[3].sh_entsize); + + const Phdr* phdr = + reinterpret_cast(contents.data() + header->e_phoff); + EXPECT_EQ(static_cast(PT_LOAD), phdr->p_type); + EXPECT_EQ(sizeof(Ehdr) + sizeof(Phdr), phdr->p_offset); + EXPECT_EQ(0U, phdr->p_vaddr); + EXPECT_EQ(0U, phdr->p_paddr); + EXPECT_EQ(4096U, phdr->p_filesz); + EXPECT_EQ(4096U + 16U, phdr->p_memsz); + EXPECT_EQ(0U, phdr->p_flags); + EXPECT_EQ(0U, phdr->p_align); +} + +class ElfNotesTest : public Test {}; + +TEST_F(ElfNotesTest, Empty) { + Notes notes(kLittleEndian); + string contents; + ASSERT_TRUE(notes.GetContents(&contents)); + EXPECT_EQ(0U, contents.size()); +} + +TEST_F(ElfNotesTest, Notes) { + Notes notes(kLittleEndian); + notes.AddNote(1, "Linux", reinterpret_cast("\x42\x02\0\0"), + 4); + notes.AddNote(2, "a", reinterpret_cast("foobar"), + sizeof("foobar") - 1); + + const uint8_t kExpectedNotesContents[] = { + // Note 1 + 0x06, 0x00, 0x00, 0x00, // name size, including terminating zero + 0x04, 0x00, 0x00, 0x00, // desc size + 0x01, 0x00, 0x00, 0x00, // type + 'L', 'i', 'n', 'u', 'x', 0x00, 0x00, 0x00, // padded "Linux" + 0x42, 0x02, 0x00, 0x00, // desc + // Note 2 + 0x02, 0x00, 0x00, 0x00, // name size + 0x06, 0x00, 0x00, 0x00, // desc size + 0x02, 0x00, 0x00, 0x00, // type + 'a', 0x00, 0x00, 0x00, // padded "a" + 'f', 'o', 'o', 'b', 'a', 'r', 0x00, 0x00, // padded "foobar" + }; + const size_t kExpectedNotesSize = sizeof(kExpectedNotesContents); + EXPECT_EQ(kExpectedNotesSize, notes.Size()); + + string notes_contents; + ASSERT_TRUE(notes.GetContents(¬es_contents)); + EXPECT_EQ(0, memcmp(kExpectedNotesContents, + notes_contents.data(), + notes_contents.size())); +} + +#endif // defined(__i386__) || defined(__x86_64__) diff --git a/src/common/linux/tests/crash_generator.cc b/src/common/linux/tests/crash_generator.cc new file mode 100644 index 0000000..1cad9ae --- /dev/null +++ b/src/common/linux/tests/crash_generator.cc @@ -0,0 +1,341 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// crash_generator.cc: Implement google_breakpad::CrashGenerator. +// See crash_generator.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/linux/tests/crash_generator.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#if defined(__ANDROID__) +#include "common/android/testing/pthread_fixes.h" +#endif +#include "common/linux/eintr_wrapper.h" +#include "common/tests/auto_tempdir.h" +#include "common/tests/file_utils.h" +#include "common/using_std_string.h" + +namespace { + +struct ThreadData { + pthread_t thread; + pthread_barrier_t* barrier; + pid_t* thread_id_ptr; +}; + +const char* const kProcFilesToCopy[] = { + "auxv", "cmdline", "environ", "maps", "status" +}; +const size_t kNumProcFilesToCopy = + sizeof(kProcFilesToCopy) / sizeof(kProcFilesToCopy[0]); + +int gettid() { + // Glibc does not provide a wrapper for this. + return syscall(__NR_gettid); +} + +int tkill(pid_t tid, int sig) { + // Glibc does not provide a wrapper for this. + return syscall(__NR_tkill, tid, sig); +} + +// Core file size limit set to 1 MB, which is big enough for test purposes. +const rlim_t kCoreSizeLimit = 1024 * 1024; + +void* thread_function(void* data) { + ThreadData* thread_data = reinterpret_cast(data); + volatile pid_t thread_id = gettid(); + *(thread_data->thread_id_ptr) = thread_id; + int result = pthread_barrier_wait(thread_data->barrier); + if (result != 0 && result != PTHREAD_BARRIER_SERIAL_THREAD) { + perror("Failed to wait for sync barrier"); + exit(1); + } + while (true) { + sched_yield(); + } +} + +} // namespace + +namespace google_breakpad { + +CrashGenerator::CrashGenerator() + : shared_memory_(NULL), + shared_memory_size_(0) { +} + +CrashGenerator::~CrashGenerator() { + UnmapSharedMemory(); +} + +bool CrashGenerator::HasDefaultCorePattern() const { + char buffer[8]; + ssize_t buffer_size = sizeof(buffer); + return ReadFile("/proc/sys/kernel/core_pattern", buffer, &buffer_size) && + buffer_size == 5 && memcmp(buffer, "core", 4) == 0; +} + +string CrashGenerator::GetCoreFilePath() const { + return temp_dir_.path() + "/core"; +} + +string CrashGenerator::GetDirectoryOfProcFilesCopy() const { + return temp_dir_.path() + "/proc"; +} + +pid_t CrashGenerator::GetThreadId(unsigned index) const { + return reinterpret_cast(shared_memory_)[index]; +} + +pid_t* CrashGenerator::GetThreadIdPointer(unsigned index) { + return reinterpret_cast(shared_memory_) + index; +} + +bool CrashGenerator::MapSharedMemory(size_t memory_size) { + if (!UnmapSharedMemory()) + return false; + + void* mapped_memory = mmap(0, memory_size, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (mapped_memory == MAP_FAILED) { + perror("CrashGenerator: Failed to map shared memory"); + return false; + } + + memset(mapped_memory, 0, memory_size); + shared_memory_ = mapped_memory; + shared_memory_size_ = memory_size; + return true; +} + +bool CrashGenerator::UnmapSharedMemory() { + if (!shared_memory_) + return true; + + if (munmap(shared_memory_, shared_memory_size_) == 0) { + shared_memory_ = NULL; + shared_memory_size_ = 0; + return true; + } + + perror("CrashGenerator: Failed to unmap shared memory"); + return false; +} + +bool CrashGenerator::SetCoreFileSizeLimit(rlim_t limit) const { + struct rlimit limits = { limit, limit }; + if (setrlimit(RLIMIT_CORE, &limits) == -1) { + perror("CrashGenerator: Failed to set core file size limit"); + return false; + } + return true; +} + +bool CrashGenerator::HasResourceLimitsAmenableToCrashCollection() const { + struct rlimit limits; + if (getrlimit(RLIMIT_CORE, &limits) == -1) { + perror("CrashGenerator: Failed to get core file size limit"); + return false; + } + return limits.rlim_max >= kCoreSizeLimit; +} + +bool CrashGenerator::CreateChildCrash( + unsigned num_threads, unsigned crash_thread, int crash_signal, + pid_t* child_pid) { + if (num_threads == 0 || crash_thread >= num_threads) { + fprintf(stderr, "CrashGenerator: Invalid thread counts; num_threads=%u" + " crash_thread=%u\n", num_threads, crash_thread); + return false; + } + + if (!MapSharedMemory(num_threads * sizeof(pid_t))) { + perror("CrashGenerator: Unable to map shared memory"); + return false; + } + + pid_t pid = fork(); + if (pid == 0) { + // Custom signal handlers, which may have been installed by a test launcher, + // are undesirable in this child. + if (signal(crash_signal, SIG_DFL) == SIG_ERR) { + perror("CrashGenerator: signal"); + exit(1); + } + if (chdir(temp_dir_.path().c_str()) == -1) { + perror("CrashGenerator: Failed to change directory"); + exit(1); + } + if (SetCoreFileSizeLimit(kCoreSizeLimit)) { + CreateThreadsInChildProcess(num_threads); + string proc_dir = GetDirectoryOfProcFilesCopy(); + if (mkdir(proc_dir.c_str(), 0755) == -1) { + perror("CrashGenerator: Failed to create proc directory"); + exit(1); + } + if (!CopyProcFiles(getpid(), proc_dir.c_str())) { + fprintf(stderr, "CrashGenerator: Failed to copy proc files\n"); + exit(1); + } + // On Android the signal sometimes doesn't seem to get sent even though + // tkill returns '0'. Retry a couple of times if the signal doesn't get + // through on the first go: + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=579 +#if defined(__ANDROID__) + const int kRetries = 60; + const unsigned int kSleepTimeInSeconds = 1; +#else + const int kRetries = 1; + const unsigned int kSleepTimeInSeconds = 600; +#endif + for (int i = 0; i < kRetries; i++) { + if (tkill(*GetThreadIdPointer(crash_thread), crash_signal) == -1) { + perror("CrashGenerator: Failed to kill thread by signal"); + } else { + // At this point, we've queued the signal for delivery, but there's no + // guarantee when it'll be delivered. We don't want the main thread to + // race and exit before the thread we signaled is processed. So sleep + // long enough that we won't flake even under fairly high load. + // TODO: See if we can't be a bit more deterministic. There doesn't + // seem to be an API to check on signal delivery status, so we can't + // really poll and wait for the kernel to declare the signal has been + // delivered. If it has, and things worked, we'd be killed, so the + // sleep length doesn't really matter. + sleep(kSleepTimeInSeconds); + } + } + } else { + perror("CrashGenerator: Failed to set core limit"); + } + exit(1); + } else if (pid == -1) { + perror("CrashGenerator: Failed to create child process"); + return false; + } + + int status; + if (HANDLE_EINTR(waitpid(pid, &status, 0)) == -1) { + perror("CrashGenerator: Failed to wait for child process"); + return false; + } + if (!WIFSIGNALED(status) || WTERMSIG(status) != crash_signal) { + fprintf(stderr, "CrashGenerator: Child process not killed by the expected signal\n" + " exit status=0x%x pid=%u signaled=%s sig=%d expected=%d\n", + status, pid, WIFSIGNALED(status) ? "true" : "false", + WTERMSIG(status), crash_signal); + return false; + } + + if (child_pid) + *child_pid = pid; + return true; +} + +bool CrashGenerator::CopyProcFiles(pid_t pid, const char* path) const { + char from_path[PATH_MAX], to_path[PATH_MAX]; + for (size_t i = 0; i < kNumProcFilesToCopy; ++i) { + int num_chars = snprintf(from_path, PATH_MAX, "/proc/%d/%s", + pid, kProcFilesToCopy[i]); + if (num_chars < 0 || num_chars >= PATH_MAX) + return false; + + num_chars = snprintf(to_path, PATH_MAX, "%s/%s", + path, kProcFilesToCopy[i]); + if (num_chars < 0 || num_chars >= PATH_MAX) + return false; + + if (!CopyFile(from_path, to_path)) + return false; + } + return true; +} + +void CrashGenerator::CreateThreadsInChildProcess(unsigned num_threads) { + *GetThreadIdPointer(0) = getpid(); + + if (num_threads <= 1) + return; + + // This method does not clean up any pthread resource, as the process + // is expected to be killed anyway. + ThreadData* thread_data = new ThreadData[num_threads]; + + // Create detached threads so that we do not worry about pthread_join() + // later being called or not. + pthread_attr_t thread_attributes; + if (pthread_attr_init(&thread_attributes) != 0 || + pthread_attr_setdetachstate(&thread_attributes, + PTHREAD_CREATE_DETACHED) != 0) { + fprintf(stderr, "CrashGenerator: Failed to initialize thread attribute\n"); + exit(1); + } + + pthread_barrier_t thread_barrier; + if (pthread_barrier_init(&thread_barrier, NULL, num_threads) != 0) { + fprintf(stderr, "CrashGenerator: Failed to initialize thread barrier\n"); + exit(1); + } + + for (unsigned i = 1; i < num_threads; ++i) { + thread_data[i].barrier = &thread_barrier; + thread_data[i].thread_id_ptr = GetThreadIdPointer(i); + if (pthread_create(&thread_data[i].thread, &thread_attributes, + thread_function, &thread_data[i]) != 0) { + fprintf(stderr, "CrashGenerator: Failed to create thread %d\n", i); + exit(1); + } + } + + int result = pthread_barrier_wait(&thread_barrier); + if (result != 0 && result != PTHREAD_BARRIER_SERIAL_THREAD) { + fprintf(stderr, "CrashGenerator: Failed to wait for thread barrier\n"); + exit(1); + } + + pthread_barrier_destroy(&thread_barrier); + pthread_attr_destroy(&thread_attributes); + delete[] thread_data; +} + +} // namespace google_breakpad diff --git a/src/common/linux/tests/crash_generator.h b/src/common/linux/tests/crash_generator.h new file mode 100644 index 0000000..71c05d2 --- /dev/null +++ b/src/common/linux/tests/crash_generator.h @@ -0,0 +1,120 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// crash_generator.h: Define the google_breakpad::CrashGenerator class, +// which is used to generate a crash (and a core dump file) for testing. + +#ifndef COMMON_LINUX_TESTS_CRASH_GENERATOR_H_ +#define COMMON_LINUX_TESTS_CRASH_GENERATOR_H_ + +#include + +#include + +#include "common/tests/auto_tempdir.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +// A utility class for generating a crash (and a core dump file) for +// testing. It creates a child process with the specified number of +// threads, which is then termainated by the specified signal. A core +// dump file is expected to be created upon the termination of the child +// process, which can then be used for testing code that processes core +// dump files. +class CrashGenerator { + public: + CrashGenerator(); + + ~CrashGenerator(); + + // Returns true if a core dump file named 'core' will be generated in + // the current directory for a test that produces a crash by checking + // if /proc/sys/kernel/core_pattern has the default value 'core'. + bool HasDefaultCorePattern() const; + + // Returns the expected path of the core dump file. + string GetCoreFilePath() const; + + // Returns the directory of a copy of proc files of the child process. + string GetDirectoryOfProcFilesCopy() const; + + // Returns whether current resource limits would prevent `CreateChildCrash` + // from operating. + bool HasResourceLimitsAmenableToCrashCollection() const; + + // Creates a crash (and a core dump file) by creating a child process with + // |num_threads| threads, and the terminating the child process by sending + // a signal with number |crash_signal| to the |crash_thread|-th thread. + // Returns true on success. + bool CreateChildCrash(unsigned num_threads, unsigned crash_thread, + int crash_signal, pid_t* child_pid); + + // Returns the thread ID of the |index|-th thread in the child process. + // This method does not validate |index|. + pid_t GetThreadId(unsigned index) const; + + private: + // Copies the following proc files of the process with |pid| to the directory + // at |path|: auxv, cmdline, environ, maps, status + // The directory must have been created. Returns true on success. + bool CopyProcFiles(pid_t pid, const char* path) const; + + // Creates |num_threads| threads in the child process. + void CreateThreadsInChildProcess(unsigned num_threads); + + // Sets the maximum size of core dump file (both the soft and hard limit) + // to |limit| bytes. Returns true on success. + bool SetCoreFileSizeLimit(rlim_t limit) const; + + // Creates a shared memory of |memory_size| bytes for communicating thread + // IDs between the parent and child process. Returns true on success. + bool MapSharedMemory(size_t memory_size); + + // Releases any shared memory created by MapSharedMemory(). Returns true on + // success. + bool UnmapSharedMemory(); + + // Returns the pointer to the thread ID of the |index|-th thread in the child + // process. This method does not validate |index|. + pid_t* GetThreadIdPointer(unsigned index); + + // Temporary directory in which a core file is generated. + AutoTempDir temp_dir_; + + // Shared memory for communicating thread IDs between the parent and + // child process. + void* shared_memory_; + + // Number of bytes mapped for |shared_memory_|. + size_t shared_memory_size_; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_TESTS_CRASH_GENERATOR_H_ diff --git a/src/common/linux/ucontext_constants.h b/src/common/linux/ucontext_constants.h new file mode 100644 index 0000000..3dcdecb --- /dev/null +++ b/src/common/linux/ucontext_constants.h @@ -0,0 +1,251 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This header can be included either from a C, C++ or Assembly file. +// Its purpose is to contain constants that must match the offsets of +// various fields in ucontext_t. +// +// They should match the definitions from signal.h. +// +// Used by src/common/linux/breakpad_getcontext.S +// Tested by src/common/linux/breakpad_getcontext_unittest.cc +// +// This header should not be used by anything else. + +#ifndef GOOGLEBREAKPAD_COMMON_LINUX_UCONTEXT_CONSTANTS_H +#define GOOGLEBREAKPAD_COMMON_LINUX_UCONTEXT_CONSTANTS_H + +#if defined(__arm__) + +#define MCONTEXT_GREGS_OFFSET 32 +#define UCONTEXT_SIGMASK_OFFSET 104 + +#elif defined(__aarch64__) + +#define UCONTEXT_SIGMASK_OFFSET 40 + +#define MCONTEXT_GREGS_OFFSET 184 +#define MCONTEXT_SP_OFFSET 432 +#define MCONTEXT_PC_OFFSET 440 +#define MCONTEXT_PSTATE_OFFSET 448 +#define MCONTEXT_EXTENSION_OFFSET 464 + +#define FPSIMD_MAGIC 0x46508001 + +#define FPSIMD_CONTEXT_MAGIC_OFFSET 0 +#define FPSIMD_CONTEXT_SIZE_OFFSET 4 +#define FPSIMD_CONTEXT_FPSR_OFFSET 8 +#define FPSIMD_CONTEXT_FPCR_OFFSET 12 +#define FPSIMD_CONTEXT_VREGS_OFFSET 16 +#define FPSIMD_CONTEXT_SIZE 528 + +#define REGISTER_SIZE 8 +#define SIMD_REGISTER_SIZE 16 + +#elif defined(__i386__) + +#define MCONTEXT_GREGS_OFFSET 20 +#define MCONTEXT_GS_OFFSET (MCONTEXT_GREGS_OFFSET + 0*4) +#define MCONTEXT_FS_OFFSET (MCONTEXT_GREGS_OFFSET + 1*4) +#define MCONTEXT_ES_OFFSET (MCONTEXT_GREGS_OFFSET + 2*4) +#define MCONTEXT_DS_OFFSET (MCONTEXT_GREGS_OFFSET + 3*4) +#define MCONTEXT_EDI_OFFSET (MCONTEXT_GREGS_OFFSET + 4*4) +#define MCONTEXT_ESI_OFFSET (MCONTEXT_GREGS_OFFSET + 5*4) +#define MCONTEXT_EBP_OFFSET (MCONTEXT_GREGS_OFFSET + 6*4) +#define MCONTEXT_ESP_OFFSET (MCONTEXT_GREGS_OFFSET + 7*4) +#define MCONTEXT_EBX_OFFSET (MCONTEXT_GREGS_OFFSET + 8*4) +#define MCONTEXT_EDX_OFFSET (MCONTEXT_GREGS_OFFSET + 9*4) +#define MCONTEXT_ECX_OFFSET (MCONTEXT_GREGS_OFFSET + 10*4) +#define MCONTEXT_EAX_OFFSET (MCONTEXT_GREGS_OFFSET + 11*4) +#define MCONTEXT_TRAPNO_OFFSET (MCONTEXT_GREGS_OFFSET + 12*4) +#define MCONTEXT_ERR_OFFSET (MCONTEXT_GREGS_OFFSET + 13*4) +#define MCONTEXT_EIP_OFFSET (MCONTEXT_GREGS_OFFSET + 14*4) +#define MCONTEXT_CS_OFFSET (MCONTEXT_GREGS_OFFSET + 15*4) +#define MCONTEXT_EFL_OFFSET (MCONTEXT_GREGS_OFFSET + 16*4) +#define MCONTEXT_UESP_OFFSET (MCONTEXT_GREGS_OFFSET + 17*4) +#define MCONTEXT_SS_OFFSET (MCONTEXT_GREGS_OFFSET + 18*4) + +#define UCONTEXT_SIGMASK_OFFSET 108 + +#define UCONTEXT_FPREGS_OFFSET 96 +#if defined(__BIONIC__) +#define UCONTEXT_FPREGS_MEM_OFFSET 116 +#else +#define UCONTEXT_FPREGS_MEM_OFFSET 236 +#endif + +#elif defined(__mips__) + +#if _MIPS_SIM == _ABIO32 +#define MCONTEXT_PC_OFFSET 32 +#define MCONTEXT_GREGS_OFFSET 40 +#define MCONTEXT_FPREGS_OFFSET 296 +#define MCONTEXT_FPC_CSR 556 +#define UCONTEXT_SIGMASK_OFFSET 616 +#else +#define MCONTEXT_GREGS_OFFSET 40 +#define MCONTEXT_FPREGS_OFFSET 296 +#define MCONTEXT_PC_OFFSET 616 +#define MCONTEXT_FPC_CSR 624 +#define UCONTEXT_SIGMASK_OFFSET 640 +#endif + +#elif defined(__x86_64__) + +#define MCONTEXT_GREGS_OFFSET 40 +#define UCONTEXT_SIGMASK_OFFSET 296 + +#define MCONTEXT_GREGS_R8 40 +#define MCONTEXT_GREGS_R9 48 +#define MCONTEXT_GREGS_R10 56 +#define MCONTEXT_GREGS_R11 64 +#define MCONTEXT_GREGS_R12 72 +#define MCONTEXT_GREGS_R13 80 +#define MCONTEXT_GREGS_R14 88 +#define MCONTEXT_GREGS_R15 96 +#define MCONTEXT_GREGS_RDI 104 +#define MCONTEXT_GREGS_RSI 112 +#define MCONTEXT_GREGS_RBP 120 +#define MCONTEXT_GREGS_RBX 128 +#define MCONTEXT_GREGS_RDX 136 +#define MCONTEXT_GREGS_RAX 144 +#define MCONTEXT_GREGS_RCX 152 +#define MCONTEXT_GREGS_RSP 160 +#define MCONTEXT_GREGS_RIP 168 +#define MCONTEXT_FPREGS_PTR 224 +#if defined(__BIONIC__) +#define MCONTEXT_FPREGS_MEM 304 +#else +#define MCONTEXT_FPREGS_MEM 424 +#endif +#define FPREGS_OFFSET_MXCSR 24 + +#elif defined(__riscv) + +#if __riscv_xlen == 32 +#define UCONTEXT_SIGMASK_OFFSET 20 +#define MCONTEXT_GREGS_OFFSET 148 +#define MCONTEXT_GREGS_SIZE 4 +#define REG_S sw +#elif __riscv_xlen == 64 +#define UCONTEXT_SIGMASK_OFFSET 40 +#define MCONTEXT_GREGS_OFFSET 168 +#define MCONTEXT_GREGS_SIZE 8 +#define REG_S sd +#else +#error "Unexpected __riscv_xlen" +#endif + +#define MCONTEXT_GREGS_PC MCONTEXT_GREGS_OFFSET + 0*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_RA MCONTEXT_GREGS_OFFSET + 1*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_SP MCONTEXT_GREGS_OFFSET + 2*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_GP MCONTEXT_GREGS_OFFSET + 3*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_TP MCONTEXT_GREGS_OFFSET + 4*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_T0 MCONTEXT_GREGS_OFFSET + 5*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_T1 MCONTEXT_GREGS_OFFSET + 6*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_T2 MCONTEXT_GREGS_OFFSET + 7*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S0 MCONTEXT_GREGS_OFFSET + 8*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S1 MCONTEXT_GREGS_OFFSET + 9*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_A0 MCONTEXT_GREGS_OFFSET + 10*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_A1 MCONTEXT_GREGS_OFFSET + 11*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_A2 MCONTEXT_GREGS_OFFSET + 12*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_A3 MCONTEXT_GREGS_OFFSET + 13*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_A4 MCONTEXT_GREGS_OFFSET + 14*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_A5 MCONTEXT_GREGS_OFFSET + 15*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_A6 MCONTEXT_GREGS_OFFSET + 16*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_A7 MCONTEXT_GREGS_OFFSET + 17*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S2 MCONTEXT_GREGS_OFFSET + 18*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S3 MCONTEXT_GREGS_OFFSET + 19*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S4 MCONTEXT_GREGS_OFFSET + 20*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S5 MCONTEXT_GREGS_OFFSET + 21*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S6 MCONTEXT_GREGS_OFFSET + 22*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S7 MCONTEXT_GREGS_OFFSET + 23*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S8 MCONTEXT_GREGS_OFFSET + 24*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S9 MCONTEXT_GREGS_OFFSET + 25*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S10 MCONTEXT_GREGS_OFFSET + 26*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_S11 MCONTEXT_GREGS_OFFSET + 27*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_T3 MCONTEXT_GREGS_OFFSET + 28*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_T4 MCONTEXT_GREGS_OFFSET + 29*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_T5 MCONTEXT_GREGS_OFFSET + 30*MCONTEXT_GREGS_SIZE +#define MCONTEXT_GREGS_T6 MCONTEXT_GREGS_OFFSET + 31*MCONTEXT_GREGS_SIZE + +#define MCONTEXT_FPREGS_OFFSET MCONTEXT_GREGS_OFFSET + 32*MCONTEXT_GREGS_SIZE + +#if __riscv_flen == 32 +#define MCONTEXT_FPREGS_SIZE 4 +#define FREG_S fsw +#elif __riscv_flen == 64 +#define MCONTEXT_FPREGS_SIZE 8 +#define FREG_S fsd +#elif __riscv_flen == 128 +#define MCONTEXT_FPREGS_SIZE 16 +#define FREG_S fsq +#else +#error "Unexpected __riscv_flen" +#endif + +#define MCONTEXT_FPREGS_FT0 MCONTEXT_FPREGS_OFFSET + 0*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT1 MCONTEXT_FPREGS_OFFSET + 1*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT2 MCONTEXT_FPREGS_OFFSET + 2*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT3 MCONTEXT_FPREGS_OFFSET + 3*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT4 MCONTEXT_FPREGS_OFFSET + 4*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT5 MCONTEXT_FPREGS_OFFSET + 5*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT6 MCONTEXT_FPREGS_OFFSET + 6*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT7 MCONTEXT_FPREGS_OFFSET + 7*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS0 MCONTEXT_FPREGS_OFFSET + 8*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS1 MCONTEXT_FPREGS_OFFSET + 9*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FA0 MCONTEXT_FPREGS_OFFSET + 10*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FA1 MCONTEXT_FPREGS_OFFSET + 11*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FA2 MCONTEXT_FPREGS_OFFSET + 12*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FA3 MCONTEXT_FPREGS_OFFSET + 13*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FA4 MCONTEXT_FPREGS_OFFSET + 14*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FA5 MCONTEXT_FPREGS_OFFSET + 15*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FA6 MCONTEXT_FPREGS_OFFSET + 16*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FA7 MCONTEXT_FPREGS_OFFSET + 17*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS2 MCONTEXT_FPREGS_OFFSET + 18*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS3 MCONTEXT_FPREGS_OFFSET + 19*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS4 MCONTEXT_FPREGS_OFFSET + 20*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS5 MCONTEXT_FPREGS_OFFSET + 21*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS6 MCONTEXT_FPREGS_OFFSET + 22*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS7 MCONTEXT_FPREGS_OFFSET + 23*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS8 MCONTEXT_FPREGS_OFFSET + 24*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS9 MCONTEXT_FPREGS_OFFSET + 25*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS10 MCONTEXT_FPREGS_OFFSET + 26*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FS11 MCONTEXT_FPREGS_OFFSET + 27*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT8 MCONTEXT_FPREGS_OFFSET + 28*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT9 MCONTEXT_FPREGS_OFFSET + 29*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT10 MCONTEXT_FPREGS_OFFSET + 30*MCONTEXT_FPREGS_SIZE +#define MCONTEXT_FPREGS_FT11 MCONTEXT_FPREGS_OFFSET + 31*MCONTEXT_FPREGS_SIZE + +#define MCONTEXT_FPC_CSR MCONTEXT_FPREGS_OFFSET + 32*MCONTEXT_FPREGS_SIZE + +#else +# error "This header has not been ported for your CPU" +#endif + +#endif // GOOGLEBREAKPAD_COMMON_ANDROID_UCONTEXT_CONSTANTS_H diff --git a/src/common/long_string_dictionary.cc b/src/common/long_string_dictionary.cc new file mode 100644 index 0000000..19a649e --- /dev/null +++ b/src/common/long_string_dictionary.cc @@ -0,0 +1,181 @@ +// Copyright 2017 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/long_string_dictionary.h" + +#include +#include + +#include +#include + +#include "common/simple_string_dictionary.h" + +#define arraysize(f) (sizeof(f) / sizeof(*f)) + +namespace { +// Suffixes for segment keys. +const char* const kSuffixes[] = {"__1", "__2", "__3", "__4", "__5", "__6", + "__7", "__8", "__9", "__10"}; +#if !defined(NDEBUG) +// The maximum suffix string length. +const size_t kMaxSuffixLength = 4; +#endif +} // namespace + +namespace google_breakpad { + +using std::string; + +void LongStringDictionary::SetKeyValue(const char* key, const char* value) { + assert(key); + if (!key) + return; + + RemoveKey(key); + + if (!value) { + return; + } + + // Key must not be an empty string. + assert(key[0] != '\0'); + if (key[0] == '\0') + return; + + // If the value is not valid for segmentation, forwards the key and the value + // to SetKeyValue of SimpleStringDictionary and returns. + size_t value_length = strlen(value); + if (value_length <= (value_size - 1)) { + SimpleStringDictionary::SetKeyValue(key, value); + return; + } + + size_t key_length = strlen(key); + assert(key_length + kMaxSuffixLength <= (key_size - 1)); + + char segment_key[key_size]; + char segment_value[value_size]; + + strcpy(segment_key, key); + + const char* remain_value = value; + size_t remain_value_length = strlen(value); + + for (unsigned long i = 0; i < arraysize(kSuffixes); i++) { + if (remain_value_length == 0) { + return; + } + + strcpy(segment_key + key_length, kSuffixes[i]); + + size_t segment_value_length = + std::min(remain_value_length, value_size - 1); + + strncpy(segment_value, remain_value, segment_value_length); + segment_value[segment_value_length] = '\0'; + + remain_value += segment_value_length; + remain_value_length -= segment_value_length; + + SimpleStringDictionary::SetKeyValue(segment_key, segment_value); + } +} + +bool LongStringDictionary::RemoveKey(const char* key) { + assert(key); + if (!key) + return false; + + if (SimpleStringDictionary::RemoveKey(key)) { + return true; + } + + size_t key_length = strlen(key); + assert(key_length + kMaxSuffixLength <= (key_size - 1)); + + char segment_key[key_size]; + strcpy(segment_key, key); + + unsigned long i = 0; + for (; i < arraysize(kSuffixes); i++) { + strcpy(segment_key + key_length, kSuffixes[i]); + if (!SimpleStringDictionary::RemoveKey(segment_key)) { + break; + } + } + return i != 0; +} + +const string LongStringDictionary::GetValueForKey(const char* key) const { + assert(key); + if (!key) + return ""; + + // Key must not be an empty string. + assert(key[0] != '\0'); + if (key[0] == '\0') + return ""; + + const char* value = SimpleStringDictionary::GetValueForKey(key); + if (value) + return string(value); + + size_t key_length = strlen(key); + assert(key_length + kMaxSuffixLength <= (key_size - 1)); + + bool found_segment = false; + char segment_key[key_size]; + string return_value; + + strcpy(segment_key, key); + for (unsigned long i = 0; i < arraysize(kSuffixes); i++) { + strcpy(segment_key + key_length, kSuffixes[i]); + + const char* segment_value = + SimpleStringDictionary::GetValueForKey(segment_key); + + if (segment_value != NULL) { + found_segment = true; + return_value.append(segment_value); + } else { + break; + } + } + + if (found_segment) { + return return_value; + } + return ""; +} + +} // namespace google_breakpad diff --git a/src/common/long_string_dictionary.h b/src/common/long_string_dictionary.h new file mode 100644 index 0000000..9319b27 --- /dev/null +++ b/src/common/long_string_dictionary.h @@ -0,0 +1,86 @@ +// Copyright 2017 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_LONG_STRING_DICTIONARY_H_ +#define COMMON_LONG_STRING_DICTIONARY_H_ + +#include + +#include "common/simple_string_dictionary.h" + +namespace google_breakpad { +// key_size is the maxium size that |key| can take in +// SimpleStringDictionary which is defined in simple_string_dictionary.h. +// +// value_size is the maxium size that |value| can take in +// SimpleStringDictionary which is defined in simple_string_dictionary.h. +// +// LongStringDictionary is a subclass of SimpleStringDictionary which supports +// longer values to be stored in the dictionary. The maximum length supported is +// (value_size - 1) * 10. +// +// For example, LongStringDictionary will store long value with key 'abc' into +// segment values with segment keys 'abc__1', 'abc__2', 'abc__3', ... +// +// Clients must avoid using the same suffixes as their key's suffix when +// LongStringDictionary is used. +class LongStringDictionary : public SimpleStringDictionary { + public: + // Stores |value| into |key|, or segment values into segment keys. The maxium + // number of segments is 10. If |value| can not be stored in 10 segments, it + // will be truncated. Replacing the existing value if |key| is already present + // and replacing the existing segment values if segment keys are already + // present. + // + // |key| must not be NULL. If the |value| need to be divided into segments, + // the lengh of |key| must be smaller enough so that lengths of segment keys + // which are key with suffixes are all samller than (key_size - 1). Currently, + // the max length of suffixes are 4. + // + // If |value| is NULL, the key and its corresponding segment keys are removed + // from the map. If there is no more space in the map, then the operation + // silently fails. + void SetKeyValue(const char* key, const char* value); + + // Given |key|, removes any associated value or associated segment values. + // |key| must not be NULL. If the key is not found, searchs its segment keys + // and removes corresponding segment values if found. + bool RemoveKey(const char* key); + + // Given |key|, returns its corresponding |value|. |key| must not be NULL. If + // the key is found, its corresponding |value| is returned. + // + // If no corresponding |value| is found, segment keys of the given |key| will + // be used to search for corresponding segment values. If segment values + // exist, assembled value from them is returned. If no segment value exists, + // NULL is returned. + const std::string GetValueForKey(const char* key) const; +}; +} // namespace google_breakpad + +#endif // COMMON_LONG_STRING_DICTIONARY_H_ diff --git a/src/common/long_string_dictionary_unittest.cc b/src/common/long_string_dictionary_unittest.cc new file mode 100644 index 0000000..f10dc0d --- /dev/null +++ b/src/common/long_string_dictionary_unittest.cc @@ -0,0 +1,304 @@ +// Copyright 2017 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/long_string_dictionary.h" + +namespace google_breakpad { + +using std::string; + +TEST(LongStringDictionary, LongStringDictionary) { + // Make a new dictionary + LongStringDictionary dict; + + // Set three distinct values on three keys + dict.SetKeyValue("key1", "value1"); + dict.SetKeyValue("key2", "value2"); + dict.SetKeyValue("key3", "value3"); + + EXPECT_EQ("value1", dict.GetValueForKey("key1")); + EXPECT_EQ("value2", dict.GetValueForKey("key2")); + EXPECT_EQ("value3", dict.GetValueForKey("key3")); + EXPECT_EQ(3u, dict.GetCount()); + // try an unknown key + EXPECT_EQ("", dict.GetValueForKey("key4")); + + // Remove a key + dict.RemoveKey("key3"); + + // Now make sure it's not there anymore + EXPECT_EQ("", dict.GetValueForKey("key3")); + + // Remove by setting value to NULL + dict.SetKeyValue("key2", NULL); + + // Now make sure it's not there anymore + EXPECT_EQ("", dict.GetValueForKey("key2")); +} + +// Add a bunch of values to the dictionary, remove some entries in the middle, +// and then add more. +TEST(LongStringDictionary, Iterator) { + LongStringDictionary* dict = new LongStringDictionary(); + ASSERT_TRUE(dict); + + char key[LongStringDictionary::key_size]; + char value[LongStringDictionary::value_size]; + + const int kDictionaryCapacity = LongStringDictionary::num_entries; + const int kPartitionIndex = kDictionaryCapacity - 5; + + // We assume at least this size in the tests below + ASSERT_GE(kDictionaryCapacity, 64); + + // We'll keep track of the number of key/value pairs we think should + // be in the dictionary + int expectedDictionarySize = 0; + + // Set a bunch of key/value pairs like key0/value0, key1/value1, ... + for (int i = 0; i < kPartitionIndex; ++i) { + sprintf(key, "key%d", i); + sprintf(value, "value%d", i); + dict->SetKeyValue(key, value); + } + expectedDictionarySize = kPartitionIndex; + + // set a couple of the keys twice (with the same value) - should be nop + dict->SetKeyValue("key2", "value2"); + dict->SetKeyValue("key4", "value4"); + dict->SetKeyValue("key15", "value15"); + + // Remove some random elements in the middle + dict->RemoveKey("key7"); + dict->RemoveKey("key18"); + dict->RemoveKey("key23"); + dict->RemoveKey("key31"); + expectedDictionarySize -= 4; // we just removed four key/value pairs + + // Set some more key/value pairs like key59/value59, key60/value60, ... + for (int i = kPartitionIndex; i < kDictionaryCapacity; ++i) { + sprintf(key, "key%d", i); + sprintf(value, "value%d", i); + dict->SetKeyValue(key, value); + } + expectedDictionarySize += kDictionaryCapacity - kPartitionIndex; + + // Now create an iterator on the dictionary + SimpleStringDictionary::Iterator iter(*dict); + + // We then verify that it iterates through exactly the number of + // key/value pairs we expect, and that they match one-for-one with what we + // would expect. The ordering of the iteration does not matter... + + // used to keep track of number of occurrences found for key/value pairs + int count[kDictionaryCapacity]; + memset(count, 0, sizeof(count)); + + int totalCount = 0; + + const SimpleStringDictionary::Entry* entry; + while ((entry = iter.Next())) { + totalCount++; + + // Extract keyNumber from a string of the form key + int keyNumber; + sscanf(entry->key, "key%d", &keyNumber); + + // Extract valueNumber from a string of the form value + int valueNumber; + sscanf(entry->value, "value%d", &valueNumber); + + // The value number should equal the key number since that's how we set them + EXPECT_EQ(keyNumber, valueNumber); + + // Key and value numbers should be in proper range: + // 0 <= keyNumber < kDictionaryCapacity + bool isKeyInGoodRange = (keyNumber >= 0 && keyNumber < kDictionaryCapacity); + bool isValueInGoodRange = + (valueNumber >= 0 && valueNumber < kDictionaryCapacity); + EXPECT_TRUE(isKeyInGoodRange); + EXPECT_TRUE(isValueInGoodRange); + + if (isKeyInGoodRange && isValueInGoodRange) { + ++count[keyNumber]; + } + } + + // Make sure each of the key/value pairs showed up exactly one time, except + // for the ones which we removed. + for (size_t i = 0; i < kDictionaryCapacity; ++i) { + // Skip over key7, key18, key23, and key31, since we removed them + if (!(i == 7 || i == 18 || i == 23 || i == 31)) { + EXPECT_EQ(count[i], 1); + } + } + + // Make sure the number of iterations matches the expected dictionary size. + EXPECT_EQ(totalCount, expectedDictionarySize); +} + +TEST(LongStringDictionary, AddRemove) { + LongStringDictionary dict; + dict.SetKeyValue("rob", "ert"); + dict.SetKeyValue("mike", "pink"); + dict.SetKeyValue("mark", "allays"); + + EXPECT_EQ(3u, dict.GetCount()); + EXPECT_EQ("ert", dict.GetValueForKey("rob")); + EXPECT_EQ("pink", dict.GetValueForKey("mike")); + EXPECT_EQ("allays", dict.GetValueForKey("mark")); + + dict.RemoveKey("mike"); + + EXPECT_EQ(2u, dict.GetCount()); + EXPECT_EQ("", dict.GetValueForKey("mike")); + + dict.SetKeyValue("mark", "mal"); + EXPECT_EQ(2u, dict.GetCount()); + EXPECT_EQ("mal", dict.GetValueForKey("mark")); + + dict.RemoveKey("mark"); + EXPECT_EQ(1u, dict.GetCount()); + EXPECT_EQ("", dict.GetValueForKey("mark")); +} + +TEST(LongStringDictionary, AddRemoveLongValue) { + LongStringDictionary dict; + + string long_value = string(256, 'x'); + dict.SetKeyValue("rob", long_value.c_str()); + + EXPECT_EQ(2u, dict.GetCount()); + + string long_value_part_1 = string(255, 'x'); + + EXPECT_EQ(long_value_part_1, dict.GetValueForKey("rob__1")); + EXPECT_EQ("x", dict.GetValueForKey("rob__2")); + + EXPECT_EQ(long_value, dict.GetValueForKey("rob")); + + dict.RemoveKey("rob"); + EXPECT_EQ(0u, dict.GetCount()); +} + +TEST(LongStringDictionary, AddRemoveSuperLongValue) { + LongStringDictionary dict; + + string long_value = string(255 * 10, 'x'); + dict.SetKeyValue("rob", long_value.c_str()); + + EXPECT_EQ(10u, dict.GetCount()); + + string long_value_part = string(255, 'x'); + + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__1")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__2")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__3")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__4")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__5")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__6")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__7")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__8")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__9")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__10")); + EXPECT_EQ(10u, dict.GetCount()); + + EXPECT_EQ(long_value, dict.GetValueForKey("rob")); + + dict.RemoveKey("rob"); + EXPECT_EQ(0u, dict.GetCount()); +} + +TEST(LongStringDictionary, TruncateSuperLongValue) { + LongStringDictionary dict; + + string long_value = string(255 * 11, 'x'); + dict.SetKeyValue("rob", long_value.c_str()); + + EXPECT_EQ(10u, dict.GetCount()); + + string long_value_part = string(255, 'x'); + + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__1")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__2")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__3")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__4")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__5")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__6")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__7")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__8")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__9")); + EXPECT_EQ(long_value_part, dict.GetValueForKey("rob__10")); + EXPECT_EQ(10u, dict.GetCount()); + + string expected_long_value = string(255 * 10, 'x'); + EXPECT_EQ(expected_long_value, dict.GetValueForKey("rob")); + + dict.RemoveKey("rob"); + EXPECT_EQ(0u, dict.GetCount()); +} + +TEST(LongStringDictionary, OverrideLongValue) { + LongStringDictionary dict; + + string long_value = string(255 * 10, 'x'); + dict.SetKeyValue("rob", long_value.c_str()); + + EXPECT_EQ(10u, dict.GetCount()); + EXPECT_EQ(long_value, dict.GetValueForKey("rob")); + + dict.SetKeyValue("rob", "short_value"); + + EXPECT_EQ(1u, dict.GetCount()); + EXPECT_EQ("short_value", dict.GetValueForKey("rob")); +} + +TEST(LongStringDictionary, OverrideShortValue) { + LongStringDictionary dict; + + dict.SetKeyValue("rob", "short_value"); + + EXPECT_EQ(1u, dict.GetCount()); + EXPECT_EQ("short_value", dict.GetValueForKey("rob")); + + string long_value = string(255 * 10, 'x'); + dict.SetKeyValue("rob", long_value.c_str()); + + EXPECT_EQ(10u, dict.GetCount()); + EXPECT_EQ(long_value, dict.GetValueForKey("rob")); +} + +} // namespace google_breakpad diff --git a/src/common/mac/Breakpad.xcconfig b/src/common/mac/Breakpad.xcconfig new file mode 100644 index 0000000..fd28d3c --- /dev/null +++ b/src/common/mac/Breakpad.xcconfig @@ -0,0 +1,51 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +GCC_C_LANGUAGE_STANDARD = c99 + +GCC_WARN_CHECK_SWITCH_STATEMENTS = YES +// TODO(nealsid): Get the code so we can turn on the 64_TO_32 warning. +GCC_WARN_64_TO_32_BIT_CONVERSION = NO +GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES +GCC_WARN_ABOUT_RETURN_TYPE = YES +GCC_WARN_MISSING_PARENTHESES = YES + +// Once https://bugs.chromium.org/p/google-breakpad/issues/detail?id=697 +// is fixed this should be reenabled. +//GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES +GCC_WARN_ABOUT_MISSING_NEWLINE = YES +GCC_WARN_SIGN_COMPARE = YES +GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES +GCC_WARN_UNDECLARED_SELECTOR = YES +GCC_WARN_UNKNOWN_PRAGMAS = YES +GCC_WARN_UNUSED_VARIABLE = YES +GCC_TREAT_WARNINGS_AS_ERRORS = YES + +DEBUG_INFORMATION_FORMAT = dwarf-with-dsym + +ALWAYS_SEARCH_USER_PATHS = NO diff --git a/src/common/mac/BreakpadDebug.xcconfig b/src/common/mac/BreakpadDebug.xcconfig new file mode 100644 index 0000000..6ec7c00 --- /dev/null +++ b/src/common/mac/BreakpadDebug.xcconfig @@ -0,0 +1,31 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "Breakpad.xcconfig" + +GCC_OPTIMIZATION_LEVEL = 0 diff --git a/src/common/mac/BreakpadRelease.xcconfig b/src/common/mac/BreakpadRelease.xcconfig new file mode 100644 index 0000000..9121b0d --- /dev/null +++ b/src/common/mac/BreakpadRelease.xcconfig @@ -0,0 +1,33 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "Breakpad.xcconfig" + +GCC_OPTIMIZATION_LEVEL = s +GCC_WARN_UNINITIALIZED_AUTOS = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) NDEBUG diff --git a/src/common/mac/GTMDefines.h b/src/common/mac/GTMDefines.h new file mode 100644 index 0000000..ae5368c --- /dev/null +++ b/src/common/mac/GTMDefines.h @@ -0,0 +1,456 @@ +// +// GTMDefines.h +// +// Copyright 2008 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// ============================================================================ + +#include +#include + +#ifdef __OBJC__ +#include +#endif // __OBJC__ + +#if TARGET_OS_IPHONE +#include +#endif // TARGET_OS_IPHONE + +// Not all MAC_OS_X_VERSION_10_X macros defined in past SDKs +#ifndef MAC_OS_X_VERSION_10_5 + #define MAC_OS_X_VERSION_10_5 1050 +#endif +#ifndef MAC_OS_X_VERSION_10_6 + #define MAC_OS_X_VERSION_10_6 1060 +#endif +#ifndef MAC_OS_X_VERSION_10_7 + #define MAC_OS_X_VERSION_10_7 1070 +#endif + +// Not all __IPHONE_X macros defined in past SDKs +#ifndef __IPHONE_3_0 + #define __IPHONE_3_0 30000 +#endif +#ifndef __IPHONE_3_1 + #define __IPHONE_3_1 30100 +#endif +#ifndef __IPHONE_3_2 + #define __IPHONE_3_2 30200 +#endif +#ifndef __IPHONE_4_0 + #define __IPHONE_4_0 40000 +#endif +#ifndef __IPHONE_4_3 + #define __IPHONE_4_3 40300 +#endif +#ifndef __IPHONE_5_0 + #define __IPHONE_5_0 50000 +#endif + +// ---------------------------------------------------------------------------- +// CPP symbols that can be overridden in a prefix to control how the toolbox +// is compiled. +// ---------------------------------------------------------------------------- + + +// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and +// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens +// when a validation fails. If you implement your own validators, you may want +// to control their internals using the same macros for consistency. +#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT + #define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0 +#endif + +// Give ourselves a consistent way to do inlines. Apple's macros even use +// a few different actual definitions, so we're based off of the foundation +// one. +#if !defined(GTM_INLINE) + #if (defined (__GNUC__) && (__GNUC__ == 4)) || defined (__clang__) + #define GTM_INLINE static __inline__ __attribute__((always_inline)) + #else + #define GTM_INLINE static __inline__ + #endif +#endif + +// Give ourselves a consistent way of doing externs that links up nicely +// when mixing objc and objc++ +#if !defined (GTM_EXTERN) + #if defined __cplusplus + #define GTM_EXTERN extern "C" + #define GTM_EXTERN_C_BEGIN extern "C" { + #define GTM_EXTERN_C_END } + #else + #define GTM_EXTERN extern + #define GTM_EXTERN_C_BEGIN + #define GTM_EXTERN_C_END + #endif +#endif + +// Give ourselves a consistent way of exporting things if we have visibility +// set to hidden. +#if !defined (GTM_EXPORT) + #define GTM_EXPORT __attribute__((visibility("default"))) +#endif + +// Give ourselves a consistent way of declaring something as unused. This +// doesn't use __unused because that is only supported in gcc 4.2 and greater. +#if !defined (GTM_UNUSED) +#define GTM_UNUSED(x) ((void)(x)) +#endif + +// _GTMDevLog & _GTMDevAssert +// +// _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for +// developer level errors. This implementation simply macros to NSLog/NSAssert. +// It is not intended to be a general logging/reporting system. +// +// Please see https://github.com/google/google-toolbox-for-mac/wiki/DevLogNAssert +// for a little more background on the usage of these macros. +// +// _GTMDevLog log some error/problem in debug builds +// _GTMDevAssert assert if conditon isn't met w/in a method/function +// in all builds. +// +// To replace this system, just provide different macro definitions in your +// prefix header. Remember, any implementation you provide *must* be thread +// safe since this could be called by anything in what ever situtation it has +// been placed in. +// + +// We only define the simple macros if nothing else has defined this. +#ifndef _GTMDevLog + +#ifdef DEBUG + #define _GTMDevLog(...) NSLog(__VA_ARGS__) +#else + #define _GTMDevLog(...) do { } while (0) +#endif + +#endif // _GTMDevLog + +#ifndef _GTMDevAssert +// we directly invoke the NSAssert handler so we can pass on the varargs +// (NSAssert doesn't have a macro we can use that takes varargs) +#if !defined(NS_BLOCK_ASSERTIONS) + #define _GTMDevAssert(condition, ...) \ + do { \ + if (!(condition)) { \ + [[NSAssertionHandler currentHandler] \ + handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \ + file:[NSString stringWithUTF8String:__FILE__] \ + lineNumber:__LINE__ \ + description:__VA_ARGS__]; \ + } \ + } while(0) +#else // !defined(NS_BLOCK_ASSERTIONS) + #define _GTMDevAssert(condition, ...) do { } while (0) +#endif // !defined(NS_BLOCK_ASSERTIONS) + +#endif // _GTMDevAssert + +// _GTMCompileAssert +// _GTMCompileAssert is an assert that is meant to fire at compile time if you +// want to check things at compile instead of runtime. For example if you +// want to check that a wchar is 4 bytes instead of 2 you would use +// _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X) +// Note that the second "arg" is not in quotes, and must be a valid processor +// symbol in it's own right (no spaces, punctuation etc). + +// Wrapping this in an #ifndef allows external groups to define their own +// compile time assert scheme. +#ifndef _GTMCompileAssert + // We got this technique from here: + // http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html + + #define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg + #define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg) + #define _GTMCompileAssert(test, msg) \ + typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ] +#endif // _GTMCompileAssert + +// ---------------------------------------------------------------------------- +// CPP symbols defined based on the project settings so the GTM code has +// simple things to test against w/o scattering the knowledge of project +// setting through all the code. +// ---------------------------------------------------------------------------- + +// Provide a single constant CPP symbol that all of GTM uses for ifdefing +// iPhone code. +#if TARGET_OS_IPHONE // iPhone SDK + // For iPhone specific stuff + #define GTM_IPHONE_SDK 1 + #if TARGET_IPHONE_SIMULATOR + #define GTM_IPHONE_DEVICE 0 + #define GTM_IPHONE_SIMULATOR 1 + #else + #define GTM_IPHONE_DEVICE 1 + #define GTM_IPHONE_SIMULATOR 0 + #endif // TARGET_IPHONE_SIMULATOR + // By default, GTM has provided it's own unittesting support, define this + // to use the support provided by Xcode, especially for the Xcode4 support + // for unittesting. + #ifndef GTM_IPHONE_USE_SENTEST + #define GTM_IPHONE_USE_SENTEST 0 + #endif + #define GTM_MACOS_SDK 0 +#else + // For MacOS specific stuff + #define GTM_MACOS_SDK 1 + #define GTM_IPHONE_SDK 0 + #define GTM_IPHONE_SIMULATOR 0 + #define GTM_IPHONE_DEVICE 0 + #define GTM_IPHONE_USE_SENTEST 0 +#endif + +// Some of our own availability macros +#if GTM_MACOS_SDK +#define GTM_AVAILABLE_ONLY_ON_IPHONE UNAVAILABLE_ATTRIBUTE +#define GTM_AVAILABLE_ONLY_ON_MACOS +#else +#define GTM_AVAILABLE_ONLY_ON_IPHONE +#define GTM_AVAILABLE_ONLY_ON_MACOS UNAVAILABLE_ATTRIBUTE +#endif + +// GC was dropped by Apple, define the old constant incase anyone still keys +// off of it. +#ifndef GTM_SUPPORT_GC + #define GTM_SUPPORT_GC 0 +#endif + +// To simplify support for 64bit (and Leopard in general), we provide the type +// defines for non Leopard SDKs +#if !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) + // NSInteger/NSUInteger and Max/Mins + #ifndef NSINTEGER_DEFINED + #if (defined(__LP64__) && __LP64__) || NS_BUILD_32_LIKE_64 + typedef long NSInteger; + typedef unsigned long NSUInteger; + #else + typedef int NSInteger; + typedef unsigned int NSUInteger; + #endif + #define NSIntegerMax LONG_MAX + #define NSIntegerMin LONG_MIN + #define NSUIntegerMax ULONG_MAX + #define NSINTEGER_DEFINED 1 + #endif // NSINTEGER_DEFINED + // CGFloat + #ifndef CGFLOAT_DEFINED + #if defined(__LP64__) && __LP64__ + // This really is an untested path (64bit on Tiger?) + typedef double CGFloat; + #define CGFLOAT_MIN DBL_MIN + #define CGFLOAT_MAX DBL_MAX + #define CGFLOAT_IS_DOUBLE 1 + #else /* !defined(__LP64__) || !__LP64__ */ + typedef float CGFloat; + #define CGFLOAT_MIN FLT_MIN + #define CGFLOAT_MAX FLT_MAX + #define CGFLOAT_IS_DOUBLE 0 + #endif /* !defined(__LP64__) || !__LP64__ */ + #define CGFLOAT_DEFINED 1 + #endif // CGFLOAT_DEFINED +#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + +// Some support for advanced clang static analysis functionality +// See http://clang-analyzer.llvm.org/annotations.html +#ifndef __has_feature // Optional. + #define __has_feature(x) 0 // Compatibility with non-clang compilers. +#endif + +#ifndef NS_RETURNS_RETAINED + #if __has_feature(attribute_ns_returns_retained) + #define NS_RETURNS_RETAINED __attribute__((ns_returns_retained)) + #else + #define NS_RETURNS_RETAINED + #endif +#endif + +#ifndef NS_RETURNS_NOT_RETAINED + #if __has_feature(attribute_ns_returns_not_retained) + #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) + #else + #define NS_RETURNS_NOT_RETAINED + #endif +#endif + +#ifndef CF_RETURNS_RETAINED + #if __has_feature(attribute_cf_returns_retained) + #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) + #else + #define CF_RETURNS_RETAINED + #endif +#endif + +#ifndef CF_RETURNS_NOT_RETAINED + #if __has_feature(attribute_cf_returns_not_retained) + #define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained)) + #else + #define CF_RETURNS_NOT_RETAINED + #endif +#endif + +#ifndef NS_CONSUMED + #if __has_feature(attribute_ns_consumed) + #define NS_CONSUMED __attribute__((ns_consumed)) + #else + #define NS_CONSUMED + #endif +#endif + +#ifndef CF_CONSUMED + #if __has_feature(attribute_cf_consumed) + #define CF_CONSUMED __attribute__((cf_consumed)) + #else + #define CF_CONSUMED + #endif +#endif + +#ifndef NS_CONSUMES_SELF + #if __has_feature(attribute_ns_consumes_self) + #define NS_CONSUMES_SELF __attribute__((ns_consumes_self)) + #else + #define NS_CONSUMES_SELF + #endif +#endif + +// Defined on 10.6 and above. +#ifndef NS_FORMAT_ARGUMENT + #define NS_FORMAT_ARGUMENT(A) +#endif + +// Defined on 10.6 and above. +#ifndef NS_FORMAT_FUNCTION + #define NS_FORMAT_FUNCTION(F,A) +#endif + +// Defined on 10.6 and above. +#ifndef CF_FORMAT_ARGUMENT + #define CF_FORMAT_ARGUMENT(A) +#endif + +// Defined on 10.6 and above. +#ifndef CF_FORMAT_FUNCTION + #define CF_FORMAT_FUNCTION(F,A) +#endif + +#ifndef GTM_NONNULL + #if defined(__has_attribute) + #if __has_attribute(nonnull) + #define GTM_NONNULL(x) __attribute__((nonnull x)) + #else + #define GTM_NONNULL(x) + #endif + #else + #define GTM_NONNULL(x) + #endif +#endif + +// Invalidates the initializer from which it's called. +#ifndef GTMInvalidateInitializer + #if __has_feature(objc_arc) + #define GTMInvalidateInitializer() \ + do { \ + [self class]; /* Avoid warning of dead store to |self|. */ \ + _GTMDevAssert(NO, @"Invalid initializer."); \ + return nil; \ + } while (0) + #else + #define GTMInvalidateInitializer() \ + do { \ + [self release]; \ + _GTMDevAssert(NO, @"Invalid initializer."); \ + return nil; \ + } while (0) + #endif +#endif + +#ifndef GTMCFAutorelease + #if __has_feature(objc_arc) + #define GTMCFAutorelease(x) CFBridgingRelease(x) + #else + #define GTMCFAutorelease(x) ([(id)x autorelease]) + #endif +#endif + +#ifdef __OBJC__ + +// Declared here so that it can easily be used for logging tracking if +// necessary. See GTMUnitTestDevLog.h for details. +@class NSString; +GTM_EXTERN void _GTMUnitTestDevLog(NSString *format, ...) NS_FORMAT_FUNCTION(1, 2); + +// Macro to allow you to create NSStrings out of other macros. +// #define FOO foo +// NSString *fooString = GTM_NSSTRINGIFY(FOO); +#if !defined (GTM_NSSTRINGIFY) + #define GTM_NSSTRINGIFY_INNER(x) @#x + #define GTM_NSSTRINGIFY(x) GTM_NSSTRINGIFY_INNER(x) +#endif + +// Macro to allow fast enumeration when building for 10.5 or later, and +// reliance on NSEnumerator for 10.4. Remember, NSDictionary w/ FastEnumeration +// does keys, so pick the right thing, nothing is done on the FastEnumeration +// side to be sure you're getting what you wanted. +#ifndef GTM_FOREACH_OBJECT + #if TARGET_OS_IPHONE || !(MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) + #define GTM_FOREACH_ENUMEREE(element, enumeration) \ + for (element in enumeration) + #define GTM_FOREACH_OBJECT(element, collection) \ + for (element in collection) + #define GTM_FOREACH_KEY(element, collection) \ + for (element in collection) + #else + #define GTM_FOREACH_ENUMEREE(element, enumeration) \ + for (NSEnumerator *_ ## element ## _enum = enumeration; \ + (element = [_ ## element ## _enum nextObject]) != nil; ) + #define GTM_FOREACH_OBJECT(element, collection) \ + GTM_FOREACH_ENUMEREE(element, [collection objectEnumerator]) + #define GTM_FOREACH_KEY(element, collection) \ + GTM_FOREACH_ENUMEREE(element, [collection keyEnumerator]) + #endif +#endif + +// ============================================================================ + +// To simplify support for both Leopard and Snow Leopard we declare +// the Snow Leopard protocols that we need here. +#if !defined(GTM_10_6_PROTOCOLS_DEFINED) && !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) +#define GTM_10_6_PROTOCOLS_DEFINED 1 +@protocol NSConnectionDelegate +@end +@protocol NSAnimationDelegate +@end +@protocol NSImageDelegate +@end +@protocol NSTabViewDelegate +@end +#endif // !defined(GTM_10_6_PROTOCOLS_DEFINED) && !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) + +// GTM_SEL_STRING is for specifying selector (usually property) names to KVC +// or KVO methods. +// In debug it will generate warnings for undeclared selectors if +// -Wunknown-selector is turned on. +// In release it will have no runtime overhead. +#ifndef GTM_SEL_STRING + #ifdef DEBUG + #define GTM_SEL_STRING(selName) NSStringFromSelector(@selector(selName)) + #else + #define GTM_SEL_STRING(selName) @#selName + #endif // DEBUG +#endif // GTM_SEL_STRING + +#endif // __OBJC__ diff --git a/src/common/mac/GTMLogger.h b/src/common/mac/GTMLogger.h new file mode 100644 index 0000000..dcc7da4 --- /dev/null +++ b/src/common/mac/GTMLogger.h @@ -0,0 +1,504 @@ +// +// GTMLogger.h +// +// Copyright 2007-2008 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Key Abstractions +// ---------------- +// +// This file declares multiple classes and protocols that are used by the +// GTMLogger logging system. The 4 main abstractions used in this file are the +// following: +// +// * logger (GTMLogger) - The main logging class that users interact with. It +// has methods for logging at different levels and uses a log writer, a log +// formatter, and a log filter to get the job done. +// +// * log writer (GTMLogWriter) - Writes a given string to some log file, where +// a "log file" can be a physical file on disk, a POST over HTTP to some URL, +// or even some in-memory structure (e.g., a ring buffer). +// +// * log formatter (GTMLogFormatter) - Given a format string and arguments as +// a va_list, returns a single formatted NSString. A "formatted string" could +// be a string with the date prepended, a string with values in a CSV format, +// or even a string of XML. +// +// * log filter (GTMLogFilter) - Given a formatted log message as an NSString +// and the level at which the message is to be logged, this class will decide +// whether the given message should be logged or not. This is a flexible way +// to filter out messages logged at a certain level, messages that contain +// certain text, or filter nothing out at all. This gives the caller the +// flexibility to dynamically enable debug logging in Release builds. +// +// This file also declares some classes to handle the common log writer, log +// formatter, and log filter cases. Callers can also create their own writers, +// formatters, and filters and they can even build them on top of the ones +// declared here. Keep in mind that your custom writer/formatter/filter may be +// called from multiple threads, so it must be thread-safe. + +#import +#import "GTMDefines.h" + +// Predeclaration of used protocols that are declared later in this file. +@protocol GTMLogWriter, GTMLogFormatter, GTMLogFilter; + +// GTMLogger +// +// GTMLogger is the primary user-facing class for an object-oriented logging +// system. It is built on the concept of log formatters (GTMLogFormatter), log +// writers (GTMLogWriter), and log filters (GTMLogFilter). When a message is +// sent to a GTMLogger to log a message, the message is formatted using the log +// formatter, then the log filter is consulted to see if the message should be +// logged, and if so, the message is sent to the log writer to be written out. +// +// GTMLogger is intended to be a flexible and thread-safe logging solution. Its +// flexibility comes from the fact that GTMLogger instances can be customized +// with user defined formatters, filters, and writers. And these writers, +// filters, and formatters can be combined, stacked, and customized in arbitrary +// ways to suit the needs at hand. For example, multiple writers can be used at +// the same time, and a GTMLogger instance can even be used as another +// GTMLogger's writer. This allows for arbitrarily deep logging trees. +// +// A standard GTMLogger uses a writer that sends messages to standard out, a +// formatter that smacks a timestamp and a few other bits of interesting +// information on the message, and a filter that filters out debug messages from +// release builds. Using the standard log settings, a log message will look like +// the following: +// +// 2007-12-30 10:29:24.177 myapp[4588/0xa07d0f60] [lvl=1] foo= +// +// The output contains the date and time of the log message, the name of the +// process followed by its process ID/thread ID, the log level at which the +// message was logged (in the previous example the level was 1: +// kGTMLoggerLevelDebug), and finally, the user-specified log message itself (in +// this case, the log message was @"foo=%@", foo). +// +// Multiple instances of GTMLogger can be created, each configured their own +// way. Though GTMLogger is not a singleton (in the GoF sense), it does provide +// access to a shared (i.e., globally accessible) GTMLogger instance. This makes +// it convenient for all code in a process to use the same GTMLogger instance. +// The shared GTMLogger instance can also be configured in an arbitrary, and +// these configuration changes will affect all code that logs through the shared +// instance. + +// +// Log Levels +// ---------- +// GTMLogger has 3 different log levels: Debug, Info, and Error. GTMLogger +// doesn't take any special action based on the log level; it simply forwards +// this information on to formatters, filters, and writers, each of which may +// optionally take action based on the level. Since log level filtering is +// performed at runtime, log messages are typically not filtered out at compile +// time. The exception to this rule is that calls to the GTMLoggerDebug() macro +// *ARE* filtered out of non-DEBUG builds. This is to be backwards compatible +// with behavior that many developers are currently used to. Note that this +// means that GTMLoggerDebug(@"hi") will be compiled out of Release builds, but +// [[GTMLogger sharedLogger] logDebug:@"hi"] will NOT be compiled out. +// +// Standard loggers are created with the GTMLogLevelFilter log filter, which +// filters out certain log messages based on log level, and some other settings. +// +// In addition to the -logDebug:, -logInfo:, and -logError: methods defined on +// GTMLogger itself, there are also C macros that make usage of the shared +// GTMLogger instance very convenient. These macros are: +// +// GTMLoggerDebug(...) +// GTMLoggerInfo(...) +// GTMLoggerError(...) +// +// Again, a notable feature of these macros is that GTMLogDebug() calls *will be +// compiled out of non-DEBUG builds*. +// +// Standard Loggers +// ---------------- +// GTMLogger has the concept of "standard loggers". A standard logger is simply +// a logger that is pre-configured with some standard/common writer, formatter, +// and filter combination. Standard loggers are created using the creation +// methods beginning with "standard". The alternative to a standard logger is a +// regular logger, which will send messages to stdout, with no special +// formatting, and no filtering. +// +// How do I use GTMLogger? +// ---------------------- +// The typical way you will want to use GTMLogger is to simply use the +// GTMLogger*() macros for logging from code. That way we can easily make +// changes to the GTMLogger class and simply update the macros accordingly. Only +// your application startup code (perhaps, somewhere in main()) should use the +// GTMLogger class directly in order to configure the shared logger, which all +// of the code using the macros will be using. Again, this is just the typical +// situation. +// +// To be complete, there are cases where you may want to use GTMLogger directly, +// or even create separate GTMLogger instances for some reason. That's fine, +// too. +// +// Examples +// -------- +// The following show some common GTMLogger use cases. +// +// 1. You want to log something as simply as possible. Also, this call will only +// appear in debug builds. In non-DEBUG builds it will be completely removed. +// +// GTMLoggerDebug(@"foo = %@", foo); +// +// 2. The previous example is similar to the following. The major difference is +// that the previous call (example 1) will be compiled out of Release builds +// but this statement will not be compiled out. +// +// [[GTMLogger sharedLogger] logDebug:@"foo = %@", foo]; +// +// 3. Send all logging output from the shared logger to a file. We do this by +// creating an NSFileHandle for writing associated with a file, and setting +// that file handle as the logger's writer. +// +// NSFileHandle *f = [NSFileHandle fileHandleForWritingAtPath:@"/tmp/f.log" +// create:YES]; +// [[GTMLogger sharedLogger] setWriter:f]; +// GTMLoggerError(@"hi"); // This will be sent to /tmp/f.log +// +// 4. Create a new GTMLogger that will log to a file. This example differs from +// the previous one because here we create a new GTMLogger that is different +// from the shared logger. +// +// GTMLogger *logger = [GTMLogger standardLoggerWithPath:@"/tmp/temp.log"]; +// [logger logInfo:@"hi temp log file"]; +// +// 5. Create a logger that writes to stdout and does NOT do any formatting to +// the log message. This might be useful, for example, when writing a help +// screen for a command-line tool to standard output. +// +// GTMLogger *logger = [GTMLogger logger]; +// [logger logInfo:@"%@ version 0.1 usage", progName]; +// +// 6. Send log output to stdout AND to a log file. The trick here is that +// NSArrays function as composite log writers, which means when an array is +// set as the log writer, it forwards all logging messages to all of its +// contained GTMLogWriters. +// +// // Create array of GTMLogWriters +// NSArray *writers = [NSArray arrayWithObjects: +// [NSFileHandle fileHandleForWritingAtPath:@"/tmp/f.log" create:YES], +// [NSFileHandle fileHandleWithStandardOutput], nil]; +// +// GTMLogger *logger = [GTMLogger standardLogger]; +// [logger setWriter:writers]; +// [logger logInfo:@"hi"]; // Output goes to stdout and /tmp/f.log +// +// For futher details on log writers, formatters, and filters, see the +// documentation below. +// +// NOTE: GTMLogger is application level logging. By default it does nothing +// with _GTMDevLog/_GTMDevAssert (see GTMDefines.h). An application can choose +// to bridge _GTMDevLog/_GTMDevAssert to GTMLogger by providing macro +// definitions in its prefix header (see GTMDefines.h for how one would do +// that). +// +@interface GTMLogger : NSObject { + @private + id writer_; + id formatter_; + id filter_; +} + +// +// Accessors for the shared logger instance +// + +// Returns a shared/global standard GTMLogger instance. Callers should typically +// use this method to get a GTMLogger instance, unless they explicitly want +// their own instance to configure for their own needs. This is the only method +// that returns a shared instance; all the rest return new GTMLogger instances. ++ (id)sharedLogger; + +// Sets the shared logger instance to |logger|. Future calls to +sharedLogger +// will return |logger| instead. ++ (void)setSharedLogger:(GTMLogger *)logger; + +// +// Creation methods +// + +// Returns a new autoreleased GTMLogger instance that will log to stdout, using +// the GTMLogStandardFormatter, and the GTMLogLevelFilter filter. ++ (id)standardLogger; + +// Same as +standardLogger, but logs to stderr. ++ (id)standardLoggerWithStderr; + +// Same as +standardLogger but levels >= kGTMLoggerLevelError are routed to +// stderr, everything else goes to stdout. ++ (id)standardLoggerWithStdoutAndStderr; + +// Returns a new standard GTMLogger instance with a log writer that will +// write to the file at |path|, and will use the GTMLogStandardFormatter and +// GTMLogLevelFilter classes. If |path| does not exist, it will be created. ++ (id)standardLoggerWithPath:(NSString *)path; + +// Returns an autoreleased GTMLogger instance that will use the specified +// |writer|, |formatter|, and |filter|. ++ (id)loggerWithWriter:(id)writer + formatter:(id)formatter + filter:(id)filter; + +// Returns an autoreleased GTMLogger instance that logs to stdout, with the +// basic formatter, and no filter. The returned logger differs from the logger +// returned by +standardLogger because this one does not do any filtering and +// does not do any special log formatting; this is the difference between a +// "regular" logger and a "standard" logger. ++ (id)logger; + +// Designated initializer. This method returns a GTMLogger initialized with the +// specified |writer|, |formatter|, and |filter|. See the setter methods below +// for what values will be used if nil is passed for a parameter. +- (id)initWithWriter:(id)writer + formatter:(id)formatter + filter:(id)filter; + +// +// Logging methods +// + +// Logs a message at the debug level (kGTMLoggerLevelDebug). +- (void)logDebug:(NSString *)fmt, ... NS_FORMAT_FUNCTION(1, 2); +// Logs a message at the info level (kGTMLoggerLevelInfo). +- (void)logInfo:(NSString *)fmt, ... NS_FORMAT_FUNCTION(1, 2); +// Logs a message at the error level (kGTMLoggerLevelError). +- (void)logError:(NSString *)fmt, ... NS_FORMAT_FUNCTION(1, 2); +// Logs a message at the assert level (kGTMLoggerLevelAssert). +- (void)logAssert:(NSString *)fmt, ... NS_FORMAT_FUNCTION(1, 2); + + +// +// Accessors +// + +// Accessor methods for the log writer. If the log writer is set to nil, +// [NSFileHandle fileHandleWithStandardOutput] is used. +- (id)writer; +- (void)setWriter:(id)writer; + +// Accessor methods for the log formatter. If the log formatter is set to nil, +// GTMLogBasicFormatter is used. This formatter will format log messages in a +// plain printf style. +- (id)formatter; +- (void)setFormatter:(id)formatter; + +// Accessor methods for the log filter. If the log filter is set to nil, +// GTMLogNoFilter is used, which allows all log messages through. +- (id)filter; +- (void)setFilter:(id)filter; + +@end // GTMLogger + + +// Helper functions that are used by the convenience GTMLogger*() macros that +// enable the logging of function names. +@interface GTMLogger (GTMLoggerMacroHelpers) +- (void)logFuncDebug:(const char *)func msg:(NSString *)fmt, ... + NS_FORMAT_FUNCTION(2, 3); +- (void)logFuncInfo:(const char *)func msg:(NSString *)fmt, ... + NS_FORMAT_FUNCTION(2, 3); +- (void)logFuncError:(const char *)func msg:(NSString *)fmt, ... + NS_FORMAT_FUNCTION(2, 3); +- (void)logFuncAssert:(const char *)func msg:(NSString *)fmt, ... + NS_FORMAT_FUNCTION(2, 3); +@end // GTMLoggerMacroHelpers + + +// The convenience macros are only defined if they haven't already been defined. +#ifndef GTMLoggerInfo + +// Convenience macros that log to the shared GTMLogger instance. These macros +// are how users should typically log to GTMLogger. Notice that GTMLoggerDebug() +// calls will be compiled out of non-Debug builds. +#define GTMLoggerDebug(...) \ + [[GTMLogger sharedLogger] logFuncDebug:__func__ msg:__VA_ARGS__] +#define GTMLoggerInfo(...) \ + [[GTMLogger sharedLogger] logFuncInfo:__func__ msg:__VA_ARGS__] +#define GTMLoggerError(...) \ + [[GTMLogger sharedLogger] logFuncError:__func__ msg:__VA_ARGS__] +#define GTMLoggerAssert(...) \ + [[GTMLogger sharedLogger] logFuncAssert:__func__ msg:__VA_ARGS__] + +// If we're not in a debug build, remove the GTMLoggerDebug statements. This +// makes calls to GTMLoggerDebug "compile out" of Release builds +#ifndef DEBUG +#undef GTMLoggerDebug +#define GTMLoggerDebug(...) do {} while(0) +#endif + +#endif // !defined(GTMLoggerInfo) + +// Log levels. +typedef enum { + kGTMLoggerLevelUnknown, + kGTMLoggerLevelDebug, + kGTMLoggerLevelInfo, + kGTMLoggerLevelError, + kGTMLoggerLevelAssert, +} GTMLoggerLevel; + + +// +// Log Writers +// + +// Protocol to be implemented by a GTMLogWriter instance. +@protocol GTMLogWriter +// Writes the given log message to where the log writer is configured to write. +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level; +@end // GTMLogWriter + + +// Simple category on NSFileHandle that makes NSFileHandles valid log writers. +// This is convenient because something like, say, +fileHandleWithStandardError +// now becomes a valid log writer. Log messages are written to the file handle +// with a newline appended. +@interface NSFileHandle (GTMFileHandleLogWriter) +// Opens the file at |path| in append mode, and creates the file with |mode| +// if it didn't previously exist. ++ (id)fileHandleForLoggingAtPath:(NSString *)path mode:(mode_t)mode; +@end // NSFileHandle + + +// This category makes NSArray a GTMLogWriter that can be composed of other +// GTMLogWriters. This is the classic Composite GoF design pattern. When the +// GTMLogWriter -logMessage:level: message is sent to the array, the array +// forwards the message to all of its elements that implement the GTMLogWriter +// protocol. +// +// This is useful in situations where you would like to send log output to +// multiple log writers at the same time. Simply create an NSArray of the log +// writers you wish to use, then set the array as the "writer" for your +// GTMLogger instance. +@interface NSArray (GTMArrayCompositeLogWriter) +@end // GTMArrayCompositeLogWriter + + +// This category adapts the GTMLogger interface so that it can be used as a log +// writer; it's an "adapter" in the GoF Adapter pattern sense. +// +// This is useful when you want to configure a logger to log to a specific +// writer with a specific formatter and/or filter. But you want to also compose +// that with a different log writer that may have its own formatter and/or +// filter. +@interface GTMLogger (GTMLoggerLogWriter) +@end // GTMLoggerLogWriter + + +// +// Log Formatters +// + +// Protocol to be implemented by a GTMLogFormatter instance. +@protocol GTMLogFormatter +// Returns a formatted string using the format specified in |fmt| and the va +// args specified in |args|. +- (NSString *)stringForFunc:(NSString *)func + withFormat:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level NS_FORMAT_FUNCTION(2, 0); +@end // GTMLogFormatter + + +// A basic log formatter that formats a string the same way that NSLog (or +// printf) would. It does not do anything fancy, nor does it add any data of its +// own. +@interface GTMLogBasicFormatter : NSObject + +// Helper method for prettying C99 __func__ and GCC __PRETTY_FUNCTION__ +- (NSString *)prettyNameForFunc:(NSString *)func; + +@end // GTMLogBasicFormatter + + +// A log formatter that formats the log string like the basic formatter, but +// also prepends a timestamp and some basic process info to the message, as +// shown in the following sample output. +// 2007-12-30 10:29:24.177 myapp[4588/0xa07d0f60] [lvl=1] log mesage here +@interface GTMLogStandardFormatter : GTMLogBasicFormatter { + @private + NSDateFormatter *dateFormatter_; // yyyy-MM-dd HH:mm:ss.SSS + NSString *pname_; + pid_t pid_; +} +@end // GTMLogStandardFormatter + + +// +// Log Filters +// + +// Protocol to be imlemented by a GTMLogFilter instance. +@protocol GTMLogFilter +// Returns YES if |msg| at |level| should be filtered out; NO otherwise. +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level; +@end // GTMLogFilter + + +// A log filter that filters messages at the kGTMLoggerLevelDebug level out of +// non-debug builds. Messages at the kGTMLoggerLevelInfo level are also filtered +// out of non-debug builds unless GTMVerboseLogging is set in the environment or +// the processes's defaults. Messages at the kGTMLoggerLevelError level are +// never filtered. +@interface GTMLogLevelFilter : NSObject +@end // GTMLogLevelFilter + +// A simple log filter that does NOT filter anything out; +// -filterAllowsMessage:level will always return YES. This can be a convenient +// way to enable debug-level logging in release builds (if you so desire). +@interface GTMLogNoFilter : NSObject +@end // GTMLogNoFilter + + +// Base class for custom level filters. Not for direct use, use the minimum +// or maximum level subclasses below. +@interface GTMLogAllowedLevelFilter : NSObject { + @private + NSIndexSet *allowedLevels_; +} +@end + +// A log filter that allows you to set a minimum log level. Messages below this +// level will be filtered. +@interface GTMLogMininumLevelFilter : GTMLogAllowedLevelFilter + +// Designated initializer, logs at levels < |level| will be filtered. +- (id)initWithMinimumLevel:(GTMLoggerLevel)level; + +@end + +// A log filter that allows you to set a maximum log level. Messages whose level +// exceeds this level will be filtered. This is really only useful if you have +// a composite GTMLogger that is sending the other messages elsewhere. +@interface GTMLogMaximumLevelFilter : GTMLogAllowedLevelFilter + +// Designated initializer, logs at levels > |level| will be filtered. +- (id)initWithMaximumLevel:(GTMLoggerLevel)level; + +@end + + +// For subclasses only +@interface GTMLogger (PrivateMethods) + +- (void)logInternalFunc:(const char *)func + format:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level NS_FORMAT_FUNCTION(2, 0); + +@end + diff --git a/src/common/mac/GTMLogger.m b/src/common/mac/GTMLogger.m new file mode 100644 index 0000000..17db83d --- /dev/null +++ b/src/common/mac/GTMLogger.m @@ -0,0 +1,611 @@ +// +// GTMLogger.m +// +// Copyright 2007-2008 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMLogger.h" +#import +#import +#import +#import + + +#if !defined(__clang__) && (__GNUC__*10+__GNUC_MINOR__ >= 42) +// Some versions of GCC (4.2 and below AFAIK) aren't great about supporting +// -Wmissing-format-attribute +// when the function is anything more complex than foo(NSString *fmt, ...). +// You see the error inside the function when you turn ... into va_args and +// attempt to call another function (like vsprintf for example). +// So we just shut off the warning for this file. We reenable it at the end. +#pragma GCC diagnostic ignored "-Wmissing-format-attribute" +#endif // !__clang__ + +// Reference to the shared GTMLogger instance. This is not a singleton, it's +// just an easy reference to one shared instance. +static GTMLogger *gSharedLogger = nil; + + +@implementation GTMLogger + +// Returns a pointer to the shared logger instance. If none exists, a standard +// logger is created and returned. ++ (id)sharedLogger { + @synchronized(self) { + if (gSharedLogger == nil) { + gSharedLogger = [[self standardLogger] retain]; + } + } + return [[gSharedLogger retain] autorelease]; +} + ++ (void)setSharedLogger:(GTMLogger *)logger { + @synchronized(self) { + [gSharedLogger autorelease]; + gSharedLogger = [logger retain]; + } +} + ++ (id)standardLogger { + // Don't trust NSFileHandle not to throw + @try { + id writer = [NSFileHandle fileHandleWithStandardOutput]; + id fr = [[[GTMLogStandardFormatter alloc] init] + autorelease]; + id filter = [[[GTMLogLevelFilter alloc] init] autorelease]; + return [[[self alloc] initWithWriter:writer + formatter:fr + filter:filter] autorelease]; + } + @catch (id e) { + // Ignored + } + return nil; +} + ++ (id)standardLoggerWithStderr { + // Don't trust NSFileHandle not to throw + @try { + id me = [self standardLogger]; + [me setWriter:[NSFileHandle fileHandleWithStandardError]]; + return me; + } + @catch (id e) { + // Ignored + } + return nil; +} + ++ (id)standardLoggerWithStdoutAndStderr { + // We're going to take advantage of the GTMLogger to GTMLogWriter adaptor + // and create a composite logger that an outer "standard" logger can use + // as a writer. Our inner loggers should apply no formatting since the main + // logger does that and we want the caller to be able to change formatters + // or add writers without knowing the inner structure of our composite. + + // Don't trust NSFileHandle not to throw + @try { + GTMLogBasicFormatter *formatter = [[[GTMLogBasicFormatter alloc] init] + autorelease]; + GTMLogger *stdoutLogger = + [self loggerWithWriter:[NSFileHandle fileHandleWithStandardOutput] + formatter:formatter + filter:[[[GTMLogMaximumLevelFilter alloc] + initWithMaximumLevel:kGTMLoggerLevelInfo] + autorelease]]; + GTMLogger *stderrLogger = + [self loggerWithWriter:[NSFileHandle fileHandleWithStandardError] + formatter:formatter + filter:[[[GTMLogMininumLevelFilter alloc] + initWithMinimumLevel:kGTMLoggerLevelError] + autorelease]]; + GTMLogger *compositeWriter = + [self loggerWithWriter:[NSArray arrayWithObjects: + stdoutLogger, stderrLogger, nil] + formatter:formatter + filter:[[[GTMLogNoFilter alloc] init] autorelease]]; + GTMLogger *outerLogger = [self standardLogger]; + [outerLogger setWriter:compositeWriter]; + return outerLogger; + } + @catch (id e) { + // Ignored + } + return nil; +} + ++ (id)standardLoggerWithPath:(NSString *)path { + @try { + NSFileHandle *fh = [NSFileHandle fileHandleForLoggingAtPath:path mode:0644]; + if (fh == nil) return nil; + id me = [self standardLogger]; + [me setWriter:fh]; + return me; + } + @catch (id e) { + // Ignored + } + return nil; +} + ++ (id)loggerWithWriter:(id)writer + formatter:(id)formatter + filter:(id)filter { + return [[[self alloc] initWithWriter:writer + formatter:formatter + filter:filter] autorelease]; +} + ++ (id)logger { + return [[[self alloc] init] autorelease]; +} + +- (id)init { + return [self initWithWriter:nil formatter:nil filter:nil]; +} + +- (id)initWithWriter:(id)writer + formatter:(id)formatter + filter:(id)filter { + if ((self = [super init])) { + [self setWriter:writer]; + [self setFormatter:formatter]; + [self setFilter:filter]; + } + return self; +} + +- (void)dealloc { + // Unlikely, but |writer_| may be an NSFileHandle, which can throw + @try { + [formatter_ release]; + [filter_ release]; + [writer_ release]; + } + @catch (id e) { + // Ignored + } + [super dealloc]; +} + +- (id)writer { + return [[writer_ retain] autorelease]; +} + +- (void)setWriter:(id)writer { + @synchronized(self) { + [writer_ autorelease]; + writer_ = nil; + if (writer == nil) { + // Try to use stdout, but don't trust NSFileHandle + @try { + writer_ = [[NSFileHandle fileHandleWithStandardOutput] retain]; + } + @catch (id e) { + // Leave |writer_| nil + } + } else { + writer_ = [writer retain]; + } + } +} + +- (id)formatter { + return [[formatter_ retain] autorelease]; +} + +- (void)setFormatter:(id)formatter { + @synchronized(self) { + [formatter_ autorelease]; + formatter_ = nil; + if (formatter == nil) { + @try { + formatter_ = [[GTMLogBasicFormatter alloc] init]; + } + @catch (id e) { + // Leave |formatter_| nil + } + } else { + formatter_ = [formatter retain]; + } + } +} + +- (id)filter { + return [[filter_ retain] autorelease]; +} + +- (void)setFilter:(id)filter { + @synchronized(self) { + [filter_ autorelease]; + filter_ = nil; + if (filter == nil) { + @try { + filter_ = [[GTMLogNoFilter alloc] init]; + } + @catch (id e) { + // Leave |filter_| nil + } + } else { + filter_ = [filter retain]; + } + } +} + +- (void)logDebug:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelDebug]; + va_end(args); +} + +- (void)logInfo:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelInfo]; + va_end(args); +} + +- (void)logError:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelError]; + va_end(args); +} + +- (void)logAssert:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelAssert]; + va_end(args); +} + +@end // GTMLogger + +@implementation GTMLogger (GTMLoggerMacroHelpers) + +- (void)logFuncDebug:(const char *)func msg:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelDebug]; + va_end(args); +} + +- (void)logFuncInfo:(const char *)func msg:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelInfo]; + va_end(args); +} + +- (void)logFuncError:(const char *)func msg:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelError]; + va_end(args); +} + +- (void)logFuncAssert:(const char *)func msg:(NSString *)fmt, ... { + va_list args; + va_start(args, fmt); + [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelAssert]; + va_end(args); +} + +@end // GTMLoggerMacroHelpers + +@implementation GTMLogger (PrivateMethods) + +- (void)logInternalFunc:(const char *)func + format:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level { + // Primary point where logging happens, logging should never throw, catch + // everything. + @try { + NSString *fname = func ? [NSString stringWithUTF8String:func] : nil; + NSString *msg = [formatter_ stringForFunc:fname + withFormat:fmt + valist:args + level:level]; + if (msg && [filter_ filterAllowsMessage:msg level:level]) + [writer_ logMessage:msg level:level]; + } + @catch (id e) { + // Ignored + } +} + +@end // PrivateMethods + + +@implementation NSFileHandle (GTMFileHandleLogWriter) + ++ (id)fileHandleForLoggingAtPath:(NSString *)path mode:(mode_t)mode { + int fd = -1; + if (path) { + int flags = O_WRONLY | O_APPEND | O_CREAT; + fd = open([path fileSystemRepresentation], flags, mode); + } + if (fd == -1) return nil; + return [[[self alloc] initWithFileDescriptor:fd + closeOnDealloc:YES] autorelease]; +} + +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level { + @synchronized(self) { + // Closed pipes should not generate exceptions in our caller. Catch here + // as well [GTMLogger logInternalFunc:...] so that an exception in this + // writer does not prevent other writers from having a chance. + @try { + NSString *line = [NSString stringWithFormat:@"%@\n", msg]; + [self writeData:[line dataUsingEncoding:NSUTF8StringEncoding]]; + } + @catch (id e) { + // Ignored + } + } +} + +@end // GTMFileHandleLogWriter + + +@implementation NSArray (GTMArrayCompositeLogWriter) + +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level { + @synchronized(self) { + id child = nil; + GTM_FOREACH_OBJECT(child, self) { + if ([child conformsToProtocol:@protocol(GTMLogWriter)]) + [child logMessage:msg level:level]; + } + } +} + +@end // GTMArrayCompositeLogWriter + + +@implementation GTMLogger (GTMLoggerLogWriter) + +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level { + switch (level) { + case kGTMLoggerLevelDebug: + [self logDebug:@"%@", msg]; + break; + case kGTMLoggerLevelInfo: + [self logInfo:@"%@", msg]; + break; + case kGTMLoggerLevelError: + [self logError:@"%@", msg]; + break; + case kGTMLoggerLevelAssert: + [self logAssert:@"%@", msg]; + break; + default: + // Ignore the message. + break; + } +} + +@end // GTMLoggerLogWriter + + +@implementation GTMLogBasicFormatter + +- (NSString *)prettyNameForFunc:(NSString *)func { + NSString *name = [func stringByTrimmingCharactersInSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + NSString *function = @"(unknown)"; + if ([name length]) { + if (// Objective C __func__ and __PRETTY_FUNCTION__ + [name hasPrefix:@"-["] || [name hasPrefix:@"+["] || + // C++ __PRETTY_FUNCTION__ and other preadorned formats + [name hasSuffix:@")"]) { + function = name; + } else { + // Assume C99 __func__ + function = [NSString stringWithFormat:@"%@()", name]; + } + } + return function; +} + +- (NSString *)stringForFunc:(NSString *)func + withFormat:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level { + // Performance note: We may want to do a quick check here to see if |fmt| + // contains a '%', and if not, simply return 'fmt'. + if (!(fmt && args)) return nil; + return [[[NSString alloc] initWithFormat:fmt arguments:args] autorelease]; +} + +@end // GTMLogBasicFormatter + + +@implementation GTMLogStandardFormatter + +- (id)init { + if ((self = [super init])) { + dateFormatter_ = [[NSDateFormatter alloc] init]; + [dateFormatter_ setFormatterBehavior:NSDateFormatterBehavior10_4]; + [dateFormatter_ setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"]; + pname_ = [[[NSProcessInfo processInfo] processName] copy]; + pid_ = [[NSProcessInfo processInfo] processIdentifier]; + if (!(dateFormatter_ && pname_)) { + [self release]; + return nil; + } + } + return self; +} + +- (void)dealloc { + [dateFormatter_ release]; + [pname_ release]; + [super dealloc]; +} + +- (NSString *)stringForFunc:(NSString *)func + withFormat:(NSString *)fmt + valist:(va_list)args + level:(GTMLoggerLevel)level { + NSString *tstamp = nil; + @synchronized (dateFormatter_) { + tstamp = [dateFormatter_ stringFromDate:[NSDate date]]; + } + return [NSString stringWithFormat:@"%@ %@[%d/%p] [lvl=%d] %@ %@", + tstamp, pname_, pid_, pthread_self(), + level, [self prettyNameForFunc:func], + // |super| has guard for nil |fmt| and |args| + [super stringForFunc:func withFormat:fmt valist:args level:level]]; +} + +@end // GTMLogStandardFormatter + + +@implementation GTMLogLevelFilter + +// Check the environment and the user preferences for the GTMVerboseLogging key +// to see if verbose logging has been enabled. The environment variable will +// override the defaults setting, so check the environment first. +// COV_NF_START +static BOOL IsVerboseLoggingEnabled(void) { + static NSString *const kVerboseLoggingKey = @"GTMVerboseLogging"; + NSString *value = [[[NSProcessInfo processInfo] environment] + objectForKey:kVerboseLoggingKey]; + if (value) { + // Emulate [NSString boolValue] for pre-10.5 + value = [value stringByTrimmingCharactersInSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if ([[value uppercaseString] hasPrefix:@"Y"] || + [[value uppercaseString] hasPrefix:@"T"] || + [value intValue]) { + return YES; + } else { + return NO; + } + } + return [[NSUserDefaults standardUserDefaults] boolForKey:kVerboseLoggingKey]; +} +// COV_NF_END + +// In DEBUG builds, log everything. If we're not in a debug build we'll assume +// that we're in a Release build. +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level { +#if defined(DEBUG) && DEBUG + return YES; +#endif + + BOOL allow = YES; + + switch (level) { + case kGTMLoggerLevelDebug: + allow = NO; + break; + case kGTMLoggerLevelInfo: + allow = IsVerboseLoggingEnabled(); + break; + case kGTMLoggerLevelError: + allow = YES; + break; + case kGTMLoggerLevelAssert: + allow = YES; + break; + default: + allow = YES; + break; + } + + return allow; +} + +@end // GTMLogLevelFilter + + +@implementation GTMLogNoFilter + +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level { + return YES; // Allow everything through +} + +@end // GTMLogNoFilter + + +@implementation GTMLogAllowedLevelFilter + +// Private designated initializer +- (id)initWithAllowedLevels:(NSIndexSet *)levels { + self = [super init]; + if (self != nil) { + allowedLevels_ = [levels retain]; + // Cap min/max level + if (!allowedLevels_ || + // NSIndexSet is unsigned so only check the high bound, but need to + // check both first and last index because NSIndexSet appears to allow + // wraparound. + ([allowedLevels_ firstIndex] > kGTMLoggerLevelAssert) || + ([allowedLevels_ lastIndex] > kGTMLoggerLevelAssert)) { + [self release]; + return nil; + } + } + return self; +} + +- (id)init { + // Allow all levels in default init + return [self initWithAllowedLevels:[NSIndexSet indexSetWithIndexesInRange: + NSMakeRange(kGTMLoggerLevelUnknown, + (kGTMLoggerLevelAssert - kGTMLoggerLevelUnknown + 1))]]; +} + +- (void)dealloc { + [allowedLevels_ release]; + [super dealloc]; +} + +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level { + return [allowedLevels_ containsIndex:level]; +} + +@end // GTMLogAllowedLevelFilter + + +@implementation GTMLogMininumLevelFilter + +- (id)initWithMinimumLevel:(GTMLoggerLevel)level { + return [super initWithAllowedLevels:[NSIndexSet indexSetWithIndexesInRange: + NSMakeRange(level, + (kGTMLoggerLevelAssert - level + 1))]]; +} + +@end // GTMLogMininumLevelFilter + + +@implementation GTMLogMaximumLevelFilter + +- (id)initWithMaximumLevel:(GTMLoggerLevel)level { + return [super initWithAllowedLevels:[NSIndexSet indexSetWithIndexesInRange: + NSMakeRange(kGTMLoggerLevelUnknown, level + 1)]]; +} + +@end // GTMLogMaximumLevelFilter + +#if !defined(__clang__) && (__GNUC__*10+__GNUC_MINOR__ >= 42) +// See comment at top of file. +#pragma GCC diagnostic error "-Wmissing-format-attribute" +#endif // !__clang__ + diff --git a/src/common/mac/HTTPGetRequest.h b/src/common/mac/HTTPGetRequest.h new file mode 100644 index 0000000..9c3cb3f --- /dev/null +++ b/src/common/mac/HTTPGetRequest.h @@ -0,0 +1,41 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +#import "HTTPRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Represents a HTTP GET request + */ +@interface HTTPGetRequest : HTTPRequest +@end + +NS_ASSUME_NONNULL_END diff --git a/src/common/mac/HTTPGetRequest.m b/src/common/mac/HTTPGetRequest.m new file mode 100644 index 0000000..e151cfd --- /dev/null +++ b/src/common/mac/HTTPGetRequest.m @@ -0,0 +1,38 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "HTTPGetRequest.h" + +@implementation HTTPGetRequest + +//============================================================================= +- (NSString*)HTTPMethod { + return @"GET"; +} + +@end diff --git a/src/common/mac/HTTPMultipartUpload.h b/src/common/mac/HTTPMultipartUpload.h new file mode 100644 index 0000000..27b9cf8 --- /dev/null +++ b/src/common/mac/HTTPMultipartUpload.h @@ -0,0 +1,62 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +#import "HTTPRequest.h" +/** + Represents a multipart/form-data HTTP upload (POST request). + Each parameter pair is sent as a boundary. + Each file is sent with a name field in addition to the filename and data. + */ +@interface HTTPMultipartUpload : HTTPRequest { + @protected + NSDictionary* parameters_; // The key/value pairs for sending data (STRONG) + NSMutableDictionary* files_; // Dictionary of name/file-path (STRONG) + NSString* boundary_; // The boundary string (STRONG) +} + +/** + Sets the parameters that will be sent in the multipart POST request. + */ +- (void)setParameters:(NSDictionary*)parameters; +- (NSDictionary*)parameters; + +/** + Adds a file to be uploaded in the multipart POST request, by its file path. + */ +- (void)addFileAtPath:(NSString*)path name:(NSString*)name; + +/** + Adds a file to be uploaded in the multipart POST request, by its name and + contents. + */ +- (void)addFileContents:(NSData*)data name:(NSString*)name; +- (NSDictionary*)files; + +@end diff --git a/src/common/mac/HTTPMultipartUpload.m b/src/common/mac/HTTPMultipartUpload.m new file mode 100644 index 0000000..b3a084a --- /dev/null +++ b/src/common/mac/HTTPMultipartUpload.m @@ -0,0 +1,169 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "HTTPMultipartUpload.h" + +#import "GTMDefines.h" +#import "encoding_util.h" + +@interface HTTPMultipartUpload (PrivateMethods) +- (NSString*)multipartBoundary; +// Each of the following methods will append the starting multipart boundary, +// but not the ending one. +- (NSData*)formDataForKey:(NSString*)key value:(NSString*)value; +- (NSData*)formDataForFileContents:(NSData*)contents name:(NSString*)name; +- (NSData*)formDataForFile:(NSString*)file name:(NSString*)name; +@end + +@implementation HTTPMultipartUpload +//============================================================================= +#pragma mark - +#pragma mark || Private || +//============================================================================= +- (NSString*)multipartBoundary { + // The boundary has 27 '-' characters followed by 16 hex digits + return [NSString + stringWithFormat:@"---------------------------%08X%08X", rand(), rand()]; +} + +//============================================================================= +- (NSData*)formDataForKey:(NSString*)key value:(NSString*)value { + NSMutableData* data = [NSMutableData data]; + [self appendBoundaryData:data]; + + NSString* escaped = PercentEncodeNSString(key); + NSString* fmt = @"Content-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n"; + NSString *form = [NSString stringWithFormat:fmt, escaped, value]; + + [data appendData:[form dataUsingEncoding:NSUTF8StringEncoding]]; + return data; +} + +//============================================================================= +- (void)appendBoundaryData:(NSMutableData*)data { + NSString* fmt = @"--%@\r\n"; + NSString* pre = [NSString stringWithFormat:fmt, boundary_]; + + [data appendData:[pre dataUsingEncoding:NSUTF8StringEncoding]]; +} + +//============================================================================= +#pragma mark - +#pragma mark || Public || +//============================================================================= +- (id)initWithURL:(NSURL*)url { + if ((self = [super initWithURL:url])) { + boundary_ = [[self multipartBoundary] retain]; + files_ = [[NSMutableDictionary alloc] init]; + } + + return self; +} + +//============================================================================= +- (void)dealloc { + [parameters_ release]; + [files_ release]; + [boundary_ release]; + + [super dealloc]; +} + +//============================================================================= +- (void)setParameters:(NSDictionary*)parameters { + if (parameters != parameters_) { + [parameters_ release]; + parameters_ = [parameters copy]; + } +} + +//============================================================================= +- (NSDictionary*)parameters { + return parameters_; +} + +//============================================================================= +- (void)addFileAtPath:(NSString*)path name:(NSString*)name { + [files_ setObject:path forKey:name]; +} + +//============================================================================= +- (void)addFileContents:(NSData*)data name:(NSString*)name { + [files_ setObject:data forKey:name]; +} + +//============================================================================= +- (NSDictionary*)files { + return files_; +} + +//============================================================================= +- (NSString*)HTTPMethod { + return @"POST"; +} + +//============================================================================= +- (NSString*)contentType { + return [NSString + stringWithFormat:@"multipart/form-data; boundary=%@", boundary_]; +} + +//============================================================================= +- (NSData*)bodyData { + NSMutableData* postBody = [NSMutableData data]; + + // Add any parameters to the message + NSArray* parameterKeys = [parameters_ allKeys]; + NSString* key; + + NSInteger count = [parameterKeys count]; + for (NSInteger i = 0; i < count; ++i) { + key = [parameterKeys objectAtIndex:i]; + [postBody appendData:[self formDataForKey:key + value:[parameters_ objectForKey:key]]]; + } + + // Add any files to the message + NSArray* fileNames = [files_ allKeys]; + for (NSString* name in fileNames) { + // First append boundary + [self appendBoundaryData:postBody]; + // Then the formdata + id fileOrData = [files_ objectForKey:name]; + [HTTPRequest appendFileToBodyData:postBody + withName:name + withFileOrData:fileOrData]; + } + + NSString* epilogue = [NSString stringWithFormat:@"\r\n--%@--\r\n", boundary_]; + [postBody appendData:[epilogue dataUsingEncoding:NSUTF8StringEncoding]]; + + return postBody; +} + +@end diff --git a/src/common/mac/HTTPPutRequest.h b/src/common/mac/HTTPPutRequest.h new file mode 100644 index 0000000..36d38c0 --- /dev/null +++ b/src/common/mac/HTTPPutRequest.h @@ -0,0 +1,50 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +#import "HTTPRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Represents an HTTP PUT request. + */ +@interface HTTPPutRequest : HTTPRequest { + @protected + NSString* file_; +} + +/** + Sets the path of the file that will be sent in the PUT request. + */ +- (void)setFile:(NSString*)file; + +@end + +NS_ASSUME_NONNULL_END diff --git a/src/common/mac/HTTPPutRequest.m b/src/common/mac/HTTPPutRequest.m new file mode 100644 index 0000000..b7c7e09 --- /dev/null +++ b/src/common/mac/HTTPPutRequest.m @@ -0,0 +1,55 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "HTTPPutRequest.h" + +@implementation HTTPPutRequest + +//============================================================================= +- (void)dealloc { + [file_ release]; + + [super dealloc]; +} + +//============================================================================= +- (void)setFile:(NSString*)file { + file_ = [file copy]; +} + +//============================================================================= +- (NSString*)HTTPMethod { + return @"PUT"; +} + +//============================================================================= +- (NSData*)bodyData { + return [NSData dataWithContentsOfFile:file_]; +} + +@end diff --git a/src/common/mac/HTTPRequest.h b/src/common/mac/HTTPRequest.h new file mode 100644 index 0000000..4937414 --- /dev/null +++ b/src/common/mac/HTTPRequest.h @@ -0,0 +1,72 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +NS_ASSUME_NONNULL_BEGIN +/** + Represents a single HTTP request. Sending the request is synchronous. + Once the send is complete, the response will be set. + + This is a base interface that specific HTTP requests derive from. + It is not intended to be instantiated directly. + */ +@interface HTTPRequest : NSObject { + @protected + NSURL* URL_; // The destination URL (STRONG) + NSHTTPURLResponse* response_; // The response from the send (STRONG) +} + +/** + Initializes the HTTPRequest and sets its URL. + */ +- (id)initWithURL:(NSURL*)URL; + +- (NSURL*)URL; + +- (NSHTTPURLResponse*)response; + +- (NSString*)HTTPMethod; // Internal, don't call outside class hierarchy. + +- (NSString*)contentType; // Internal, don't call outside class hierarchy. + +- (NSData*)bodyData; // Internal, don't call outside class hierarchy. + +- (NSData*)send:(NSError**)error; + +/** + Appends a file to the HTTP request, either by filename or by file content + (in the form of NSData). + */ ++ (void)appendFileToBodyData:(NSMutableData*)data + withName:(NSString*)name + withFileOrData:(id)fileOrData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/src/common/mac/HTTPRequest.m b/src/common/mac/HTTPRequest.m new file mode 100644 index 0000000..af21874 --- /dev/null +++ b/src/common/mac/HTTPRequest.m @@ -0,0 +1,267 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "HTTPRequest.h" + +#include +#include + +#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && defined(__IPHONE_7_0) && \ + __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0) +#import +#define HAS_BACKGROUND_TASK_API 1 +#else +#define HAS_BACKGROUND_TASK_API 0 +#endif + +#import "encoding_util.h" + +#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && defined(__IPHONE_7_0) && \ + __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0) || \ + (defined(MAC_OS_X_VERSION_MIN_REQUIRED) && \ + defined(MAC_OS_X_VERSION_10_11) && \ + MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11) +#define USE_NSURLSESSION 1 +#else +#define USE_NSURLSESSION 0 +#endif + +// As -[NSURLConnection sendSynchronousRequest:returningResponse:error:] has +// been deprecated with iOS 9.0 / OS X 10.11 SDKs, this function re-implements +// it using -[NSURLSession dataTaskWithRequest:completionHandler:] which is +// available on iOS 7+. +static NSData* SendSynchronousNSURLRequest(NSURLRequest* req, + NSURLResponse** outResponse, + NSError** outError) { +#if USE_NSURLSESSION + __block NSData* result = nil; + __block NSError* error = nil; + __block NSURLResponse* response = nil; + dispatch_semaphore_t waitSemaphone = dispatch_semaphore_create(0); + + NSURLSessionConfiguration* config = + [NSURLSessionConfiguration defaultSessionConfiguration]; + [config setTimeoutIntervalForRequest:240.0]; + NSURLSession* session = [NSURLSession sessionWithConfiguration:config]; + NSURLSessionDataTask *task = [session + dataTaskWithRequest:req + completionHandler:^(NSData* data, NSURLResponse* resp, NSError* err) { + if (outError) + error = [err retain]; + if (outResponse) + response = [resp retain]; + if (err == nil) + result = [data retain]; + dispatch_semaphore_signal(waitSemaphone); + }]; + [task resume]; + +#if HAS_BACKGROUND_TASK_API + // Used to guard against ending the background task twice, which UIKit + // considers to be an error. + __block BOOL isBackgroundTaskActive = YES; + __block UIBackgroundTaskIdentifier backgroundTaskIdentifier = + UIBackgroundTaskInvalid; + backgroundTaskIdentifier = [UIApplication.sharedApplication + beginBackgroundTaskWithName:@"Breakpad Upload" + expirationHandler:^{ + if (!isBackgroundTaskActive) { + return; + } + isBackgroundTaskActive = NO; + + [task cancel]; + [UIApplication.sharedApplication + endBackgroundTask:backgroundTaskIdentifier]; + }]; +#endif // HAS_BACKGROUND_TASK_API + + dispatch_semaphore_wait(waitSemaphone, DISPATCH_TIME_FOREVER); + dispatch_release(waitSemaphone); + +#if HAS_BACKGROUND_TASK_API + if (backgroundTaskIdentifier != UIBackgroundTaskInvalid) { + // Dispatch to main queue in order to synchronize access to + // `isBackgroundTaskActive` with the background task expiration handler, + // which is always run on the main thread. + dispatch_async(dispatch_get_main_queue(), ^{ + if (!isBackgroundTaskActive) { + return; + } + isBackgroundTaskActive = NO; + + [UIApplication.sharedApplication + endBackgroundTask:backgroundTaskIdentifier]; + }); + } +#endif // HAS_BACKGROUND_TASK_API + + if (outError) + *outError = [error autorelease]; + if (outResponse) + *outResponse = [response autorelease]; + return [result autorelease]; +#else // USE_NSURLSESSION + return [NSURLConnection sendSynchronousRequest:req + returningResponse:outResponse + error:outError]; +#endif // USE_NSURLSESSION +} + +@implementation HTTPRequest + +//============================================================================= +- (id)initWithURL:(NSURL*)URL { + if ((self = [super init])) { + URL_ = [URL copy]; + } + + return self; +} + +//============================================================================= +- (void)dealloc { + [URL_ release]; + [response_ release]; + + [super dealloc]; +} + +//============================================================================= +- (NSURL*)URL { + return URL_; +} + +//============================================================================= +- (NSHTTPURLResponse*)response { + return response_; +} + +//============================================================================= +- (NSString*)HTTPMethod { + @throw [NSException + exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must" + "override %@ in a subclass", + NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +//============================================================================= +- (NSString*)contentType { + return nil; +} + +//============================================================================= +- (NSData*)bodyData { + return nil; +} + +//============================================================================= +- (NSData*)send:(NSError**)withError { + NSMutableURLRequest* req = [[NSMutableURLRequest alloc] + initWithURL:URL_ + cachePolicy:NSURLRequestUseProtocolCachePolicy + timeoutInterval:60.0]; + + NSString* contentType = [self contentType]; + if ([contentType length] > 0) { + [req setValue:contentType forHTTPHeaderField:@"Content-type"]; + } + + NSData* bodyData = [self bodyData]; + if ([bodyData length] > 0) { + [req setHTTPBody:bodyData]; + } + + [req setHTTPMethod:[self HTTPMethod]]; + + [response_ release]; + response_ = nil; + + NSData* data = nil; + if ([[req URL] isFileURL]) { + [[req HTTPBody] writeToURL:[req URL] options:0 error:withError]; + } else { + NSURLResponse* response = nil; + data = SendSynchronousNSURLRequest(req, &response, withError); + response_ = (NSHTTPURLResponse*)[response retain]; + } + [req release]; + + return data; +} + +//============================================================================= ++ (NSData*)formDataForFileContents:(NSData*)contents withName:(NSString*)name { + NSMutableData* data = [NSMutableData data]; + NSString* escaped = PercentEncodeNSString(name); + NSString* fmt = @"Content-Disposition: form-data; name=\"%@\"; " + "filename=\"minidump.dmp\"\r\nContent-Type: " + "application/octet-stream\r\n\r\n"; + NSString* pre = [NSString stringWithFormat:fmt, escaped]; + + [data appendData:[pre dataUsingEncoding:NSUTF8StringEncoding]]; + [data appendData:contents]; + + return data; +} + +//============================================================================= ++ (NSData*)formDataForFile:(NSString*)file withName:(NSString*)name { + NSData* contents = [NSData dataWithContentsOfFile:file]; + + return [HTTPRequest formDataForFileContents:contents withName:name]; +} + +//============================================================================= ++ (NSData*)formDataForKey:(NSString*)key value:(NSString*)value { + NSString* escaped = PercentEncodeNSString(key); + NSString* fmt = @"Content-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n"; + NSString* form = [NSString stringWithFormat:fmt, escaped, value]; + + return [form dataUsingEncoding:NSUTF8StringEncoding]; +} + +//============================================================================= ++ (void)appendFileToBodyData:(NSMutableData*)data + withName:(NSString*)name + withFileOrData:(id)fileOrData { + NSData* fileData; + + // The object can be either the path to a file (NSString) or the contents + // of the file (NSData). + if ([fileOrData isKindOfClass:[NSData class]]) + fileData = [self formDataForFileContents:fileOrData withName:name]; + else + fileData = [HTTPRequest formDataForFile:fileOrData withName:name]; + + [data appendData:fileData]; +} + +@end diff --git a/src/common/mac/HTTPSimplePostRequest.h b/src/common/mac/HTTPSimplePostRequest.h new file mode 100644 index 0000000..01a1e86 --- /dev/null +++ b/src/common/mac/HTTPSimplePostRequest.h @@ -0,0 +1,56 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +#import "HTTPRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Represents a simple (non-multipart) HTTP POST request. + */ +@interface HTTPSimplePostRequest : HTTPRequest { + @protected + NSString* contentType_; + NSString* body_; +} + +/** + Sets the content type of the POST request. + */ +- (void)setContentType:(NSString*)contentType; + +/** + Sets the contents of the POST request's body. + */ +- (void)setBody:(NSString*)body; + +@end + +NS_ASSUME_NONNULL_END diff --git a/src/common/mac/HTTPSimplePostRequest.m b/src/common/mac/HTTPSimplePostRequest.m new file mode 100644 index 0000000..7aba94f --- /dev/null +++ b/src/common/mac/HTTPSimplePostRequest.m @@ -0,0 +1,68 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "HTTPSimplePostRequest.h" + +@implementation HTTPSimplePostRequest + +//============================================================================= +- (void)dealloc { + [contentType_ release]; + [body_ release]; + + [super dealloc]; +} + +//============================================================================= +- (void)setContentType:(NSString*)contentType { + contentType_ = [contentType copy]; +} + +//============================================================================= +- (void)setBody:(NSString*)body { + body_ = [body copy]; +} + +//============================================================================= +- (NSString*)HTTPMethod { + return @"POST"; +} + +//============================================================================= +- (NSString*)contentType { + return contentType_; +} + +//============================================================================= +- (NSData*)bodyData { + NSMutableData* data = [NSMutableData data]; + [data appendData:[body_ dataUsingEncoding:NSUTF8StringEncoding]]; + return data; +} + +@end diff --git a/src/common/mac/MachIPC.h b/src/common/mac/MachIPC.h new file mode 100644 index 0000000..78b97ad --- /dev/null +++ b/src/common/mac/MachIPC.h @@ -0,0 +1,300 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// MachIPC.h +// +// Some helpful wrappers for using Mach IPC calls + +#ifndef MACH_IPC_H__ +#define MACH_IPC_H__ + +#import +#import +#import +#import + +#import + +//============================================================================== +// DISCUSSION: +// +// The three main classes of interest are +// +// MachMessage: a wrapper for a mach message of the following form +// mach_msg_header_t +// mach_msg_body_t +// optional descriptors +// optional extra message data +// +// MachReceiveMessage and MachSendMessage subclass MachMessage +// and are used instead of MachMessage which is an abstract base class +// +// ReceivePort: +// Represents a mach port for which we have receive rights +// +// MachPortSender: +// Represents a mach port for which we have send rights +// +// Here's an example to receive a message on a server port: +// +// // This creates our named server port +// ReceivePort receivePort("com.Google.MyService"); +// +// MachReceiveMessage message; +// kern_return_t result = receivePort.WaitForMessage(&message, 0); +// +// if (result == KERN_SUCCESS && message.GetMessageID() == 57) { +// mach_port_t task = message.GetTranslatedPort(0); +// mach_port_t thread = message.GetTranslatedPort(1); +// +// char* messageString = message.GetData(); +// +// printf("message string = %s\n", messageString); +// } +// +// Here is an example of using these classes to send a message to this port: +// +// // send to already named port +// MachPortSender sender("com.Google.MyService"); +// MachSendMessage message(57); // our message ID is 57 +// +// // add some ports to be translated for us +// message.AddDescriptor(mach_task_self()); // our task +// message.AddDescriptor(mach_thread_self()); // this thread +// +// char messageString[] = "Hello server!\n"; +// message.SetData(messageString, strlen(messageString)+1); +// +// kern_return_t result = sender.SendMessage(message, 1000); // timeout 1000ms +// + +namespace google_breakpad { +#define PRINT_MACH_RESULT(result_, message_) \ + printf(message_" %s (%d)\n", mach_error_string(result_), result_ ); + +//============================================================================== +// A wrapper class for mach_msg_port_descriptor_t (with same memory layout) +// with convenient constructors and accessors +class MachMsgPortDescriptor : public mach_msg_port_descriptor_t { + public: + // General-purpose constructor + MachMsgPortDescriptor(mach_port_t in_name, + mach_msg_type_name_t in_disposition) { + name = in_name; + pad1 = 0; + pad2 = 0; + disposition = in_disposition; + type = MACH_MSG_PORT_DESCRIPTOR; + } + + // For passing send rights to a port + MachMsgPortDescriptor(mach_port_t in_name) { + name = in_name; + pad1 = 0; + pad2 = 0; + disposition = MACH_MSG_TYPE_COPY_SEND; + type = MACH_MSG_PORT_DESCRIPTOR; + } + + // Copy constructor + MachMsgPortDescriptor(const MachMsgPortDescriptor& desc) { + name = desc.name; + pad1 = desc.pad1; + pad2 = desc.pad2; + disposition = desc.disposition; + type = desc.type; + } + + mach_port_t GetMachPort() const { + return name; + } + + mach_msg_type_name_t GetDisposition() const { + return disposition; + } + + // For convenience + operator mach_port_t() const { + return GetMachPort(); + } +}; + +//============================================================================== +// MachMessage: a wrapper for a mach message +// (mach_msg_header_t, mach_msg_body_t, extra data) +// +// This considerably simplifies the construction of a message for sending +// and the getting at relevant data and descriptors for the receiver. +// +// Currently the combined size of the descriptors plus data must be +// less than 1024. But as a benefit no memory allocation is necessary. +// +// TODO: could consider adding malloc() support for very large messages +// +// A MachMessage object is used by ReceivePort::WaitForMessage +// and MachPortSender::SendMessage +// +class MachMessage { + public: + + // The receiver of the message can retrieve the raw data this way + uint8_t* GetData() { + return GetDataLength() > 0 ? GetDataPacket()->data : NULL; + } + + uint32_t GetDataLength() { + return EndianU32_LtoN(GetDataPacket()->data_length); + } + + // The message ID may be used as a code identifying the type of message + void SetMessageID(int32_t message_id) { + GetDataPacket()->id = EndianU32_NtoL(message_id); + } + + int32_t GetMessageID() { return EndianU32_LtoN(GetDataPacket()->id); } + + // Adds a descriptor (typically a mach port) to be translated + // returns true if successful, otherwise not enough space + bool AddDescriptor(const MachMsgPortDescriptor& desc); + + int GetDescriptorCount() const { return body.msgh_descriptor_count; } + MachMsgPortDescriptor* GetDescriptor(int n); + + // Convenience method which gets the mach port described by the descriptor + mach_port_t GetTranslatedPort(int n); + + // A simple message is one with no descriptors + bool IsSimpleMessage() const { return GetDescriptorCount() == 0; } + + // Sets raw data for the message (returns false if not enough space) + bool SetData(void* data, int32_t data_length); + + protected: + // Consider this an abstract base class - must create an actual instance + // of MachReceiveMessage or MachSendMessage + + MachMessage() { + memset(this, 0, sizeof(MachMessage)); + } + + friend class ReceivePort; + friend class MachPortSender; + + // Represents raw data in our message + struct MessageDataPacket { + int32_t id; // little-endian + int32_t data_length; // little-endian + uint8_t data[1]; // actual size limited by sizeof(MachMessage) + }; + + MessageDataPacket* GetDataPacket(); + + void SetDescriptorCount(int n); + void SetDescriptor(int n, const MachMsgPortDescriptor& desc); + + // Returns total message size setting msgh_size in the header to this value + mach_msg_size_t CalculateSize(); + + mach_msg_header_t head; + mach_msg_body_t body; + uint8_t padding[1024]; // descriptors and data may be embedded here +}; + +//============================================================================== +// MachReceiveMessage and MachSendMessage are useful to separate the idea +// of a mach message being sent and being received, and adds increased type +// safety: +// ReceivePort::WaitForMessage() only accepts a MachReceiveMessage +// MachPortSender::SendMessage() only accepts a MachSendMessage + +//============================================================================== +class MachReceiveMessage : public MachMessage { + public: + MachReceiveMessage() : MachMessage() {} +}; + +//============================================================================== +class MachSendMessage : public MachMessage { + public: + MachSendMessage(int32_t message_id); +}; + +//============================================================================== +// Represents a mach port for which we have receive rights +class ReceivePort { + public: + // Creates a new mach port for receiving messages and registers a name for it + explicit ReceivePort(const char* receive_port_name); + + // Given an already existing mach port, use it. We take ownership of the + // port and deallocate it in our destructor. + explicit ReceivePort(mach_port_t receive_port); + + // Create a new mach port for receiving messages + ReceivePort(); + + ~ReceivePort(); + + // Waits on the mach port until message received or timeout + kern_return_t WaitForMessage(MachReceiveMessage* out_message, + mach_msg_timeout_t timeout); + + // The underlying mach port that we wrap + mach_port_t GetPort() const { return port_; } + + private: + ReceivePort(const ReceivePort&); // disable copy c-tor + + mach_port_t port_; + kern_return_t init_result_; +}; + +//============================================================================== +// Represents a mach port for which we have send rights +class MachPortSender { + public: + // get a port with send rights corresponding to a named registered service + explicit MachPortSender(const char* receive_port_name); + + + // Given an already existing mach port, use it. + explicit MachPortSender(mach_port_t send_port); + + kern_return_t SendMessage(MachSendMessage& message, + mach_msg_timeout_t timeout); + + private: + MachPortSender(const MachPortSender&); // disable copy c-tor + + mach_port_t send_port_; + kern_return_t init_result_; +}; + +} // namespace google_breakpad + +#endif // MACH_IPC_H__ diff --git a/src/common/mac/MachIPC.mm b/src/common/mac/MachIPC.mm new file mode 100644 index 0000000..62e0f6b --- /dev/null +++ b/src/common/mac/MachIPC.mm @@ -0,0 +1,305 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// MachIPC.mm +// Wrapper for mach IPC calls + +#import +#import "MachIPC.h" +#include "common/mac/bootstrap_compat.h" + +namespace google_breakpad { +//============================================================================== +MachSendMessage::MachSendMessage(int32_t message_id) : MachMessage() { + head.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0); + + // head.msgh_remote_port = ...; // filled out in MachPortSender::SendMessage() + head.msgh_local_port = MACH_PORT_NULL; + head.msgh_reserved = 0; + head.msgh_id = 0; + + SetDescriptorCount(0); // start out with no descriptors + + SetMessageID(message_id); + SetData(NULL, 0); // client may add data later +} + +//============================================================================== +// returns true if successful +bool MachMessage::SetData(void* data, + int32_t data_length) { + // first check to make sure we have enough space + size_t size = CalculateSize(); + size_t new_size = size + data_length; + + if (new_size > sizeof(MachMessage)) { + return false; // not enough space + } + + GetDataPacket()->data_length = EndianU32_NtoL(data_length); + if (data) memcpy(GetDataPacket()->data, data, data_length); + + CalculateSize(); + + return true; +} + +//============================================================================== +// calculates and returns the total size of the message +// Currently, the entire message MUST fit inside of the MachMessage +// messsage size <= sizeof(MachMessage) +mach_msg_size_t MachMessage::CalculateSize() { + size_t size = sizeof(mach_msg_header_t) + sizeof(mach_msg_body_t); + + // add space for MessageDataPacket + int32_t alignedDataLength = (GetDataLength() + 3) & ~0x3; + size += 2*sizeof(int32_t) + alignedDataLength; + + // add space for descriptors + size += GetDescriptorCount() * sizeof(MachMsgPortDescriptor); + + head.msgh_size = static_cast(size); + + return head.msgh_size; +} + +//============================================================================== +MachMessage::MessageDataPacket* MachMessage::GetDataPacket() { + size_t desc_size = sizeof(MachMsgPortDescriptor)*GetDescriptorCount(); + MessageDataPacket* packet = + reinterpret_cast(padding + desc_size); + + return packet; +} + +//============================================================================== +void MachMessage::SetDescriptor(int n, + const MachMsgPortDescriptor& desc) { + MachMsgPortDescriptor* desc_array = + reinterpret_cast(padding); + desc_array[n] = desc; +} + +//============================================================================== +// returns true if successful otherwise there was not enough space +bool MachMessage::AddDescriptor(const MachMsgPortDescriptor& desc) { + // first check to make sure we have enough space + int size = CalculateSize(); + size_t new_size = size + sizeof(MachMsgPortDescriptor); + + if (new_size > sizeof(MachMessage)) { + return false; // not enough space + } + + // unfortunately, we need to move the data to allow space for the + // new descriptor + u_int8_t* p = reinterpret_cast(GetDataPacket()); + bcopy(p, p+sizeof(MachMsgPortDescriptor), GetDataLength()+2*sizeof(int32_t)); + + SetDescriptor(GetDescriptorCount(), desc); + SetDescriptorCount(GetDescriptorCount() + 1); + + CalculateSize(); + + return true; +} + +//============================================================================== +void MachMessage::SetDescriptorCount(int n) { + body.msgh_descriptor_count = n; + + if (n > 0) { + head.msgh_bits |= MACH_MSGH_BITS_COMPLEX; + } else { + head.msgh_bits &= ~MACH_MSGH_BITS_COMPLEX; + } +} + +//============================================================================== +MachMsgPortDescriptor* MachMessage::GetDescriptor(int n) { + if (n < GetDescriptorCount()) { + MachMsgPortDescriptor* desc = + reinterpret_cast(padding); + return desc + n; + } + + return nil; +} + +//============================================================================== +mach_port_t MachMessage::GetTranslatedPort(int n) { + if (n < GetDescriptorCount()) { + return GetDescriptor(n)->GetMachPort(); + } + return MACH_PORT_NULL; +} + +#pragma mark - + +//============================================================================== +// create a new mach port for receiving messages and register a name for it +ReceivePort::ReceivePort(const char* receive_port_name) { + mach_port_t current_task = mach_task_self(); + + init_result_ = mach_port_allocate(current_task, + MACH_PORT_RIGHT_RECEIVE, + &port_); + + if (init_result_ != KERN_SUCCESS) + return; + + init_result_ = mach_port_insert_right(current_task, + port_, + port_, + MACH_MSG_TYPE_MAKE_SEND); + + if (init_result_ != KERN_SUCCESS) + return; + + mach_port_t task_bootstrap_port = 0; + init_result_ = task_get_bootstrap_port(current_task, &task_bootstrap_port); + + if (init_result_ != KERN_SUCCESS) + return; + + init_result_ = breakpad::BootstrapRegister( + bootstrap_port, + const_cast(receive_port_name), + port_); +} + +//============================================================================== +// create a new mach port for receiving messages +ReceivePort::ReceivePort() { + mach_port_t current_task = mach_task_self(); + + init_result_ = mach_port_allocate(current_task, + MACH_PORT_RIGHT_RECEIVE, + &port_); + + if (init_result_ != KERN_SUCCESS) + return; + + init_result_ = mach_port_insert_right(current_task, + port_, + port_, + MACH_MSG_TYPE_MAKE_SEND); +} + +//============================================================================== +// Given an already existing mach port, use it. We take ownership of the +// port and deallocate it in our destructor. +ReceivePort::ReceivePort(mach_port_t receive_port) + : port_(receive_port), + init_result_(KERN_SUCCESS) { +} + +//============================================================================== +ReceivePort::~ReceivePort() { + if (init_result_ == KERN_SUCCESS) + mach_port_deallocate(mach_task_self(), port_); +} + +//============================================================================== +kern_return_t ReceivePort::WaitForMessage(MachReceiveMessage* out_message, + mach_msg_timeout_t timeout) { + if (!out_message) { + return KERN_INVALID_ARGUMENT; + } + + // return any error condition encountered in constructor + if (init_result_ != KERN_SUCCESS) + return init_result_; + + out_message->head.msgh_bits = 0; + out_message->head.msgh_local_port = port_; + out_message->head.msgh_remote_port = MACH_PORT_NULL; + out_message->head.msgh_reserved = 0; + out_message->head.msgh_id = 0; + + mach_msg_option_t options = MACH_RCV_MSG; + if (timeout != MACH_MSG_TIMEOUT_NONE) + options |= MACH_RCV_TIMEOUT; + kern_return_t result = mach_msg(&out_message->head, + options, + 0, + sizeof(MachMessage), + port_, + timeout, // timeout in ms + MACH_PORT_NULL); + + return result; +} + +#pragma mark - + +//============================================================================== +// get a port with send rights corresponding to a named registered service +MachPortSender::MachPortSender(const char* receive_port_name) { + mach_port_t task_bootstrap_port = 0; + init_result_ = task_get_bootstrap_port(mach_task_self(), + &task_bootstrap_port); + + if (init_result_ != KERN_SUCCESS) + return; + + init_result_ = bootstrap_look_up(task_bootstrap_port, + const_cast(receive_port_name), + &send_port_); +} + +//============================================================================== +MachPortSender::MachPortSender(mach_port_t send_port) + : send_port_(send_port), + init_result_(KERN_SUCCESS) { +} + +//============================================================================== +kern_return_t MachPortSender::SendMessage(MachSendMessage& message, + mach_msg_timeout_t timeout) { + if (message.head.msgh_size == 0) { + return KERN_INVALID_VALUE; // just for safety -- never should occur + }; + + if (init_result_ != KERN_SUCCESS) + return init_result_; + + message.head.msgh_remote_port = send_port_; + + kern_return_t result = mach_msg(&message.head, + MACH_SEND_MSG | MACH_SEND_TIMEOUT, + message.head.msgh_size, + 0, + MACH_PORT_NULL, + timeout, // timeout in ms + MACH_PORT_NULL); + + return result; +} + +} // namespace google_breakpad diff --git a/src/common/mac/SymbolCollectorClient.h b/src/common/mac/SymbolCollectorClient.h new file mode 100644 index 0000000..367753a --- /dev/null +++ b/src/common/mac/SymbolCollectorClient.h @@ -0,0 +1,103 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Represents a response from a sym-upload-v2 server to a createUploadURLOnServer + call. + */ +@interface UploadURLResponse : NSObject { + @protected + NSString* uploadURL_; + NSString* uploadKey_; +} + +- (id)initWithUploadURL:(NSString*)uploadURL withUploadKey:(NSString*)uploadKey; + +- (NSString*)uploadURL; +- (NSString*)uploadKey; +@end + +/** + Possible return statuses from a sym-upload-v2 server to a + completeUploadOnServer call. + */ +typedef NS_ENUM(NSInteger, CompleteUploadResult) { + CompleteUploadResultOk, + CompleteUploadResultDuplicateData, + CompleteUploadResultError +}; + +/** + Possible return statuses from a sym-upload-v2 server to a + checkSymbolStatusOnServer call. + */ +typedef NS_ENUM(NSInteger, SymbolStatus) { + SymbolStatusFound, + SymbolStatusMissing, + SymbolStatusUnknown +}; + +/** + Interface to help a client interact with a sym-upload-v2 server, over HTTP. + For details of the API and protocol, see :/docs/sym_upload_v2_protocol.md. + */ +@interface SymbolCollectorClient : NSObject +; + +/** + Calls the /v1/symbols/{debug_file}/{debug_id}:checkStatus API on the server. + */ ++ (SymbolStatus)checkSymbolStatusOnServer:(NSString*)APIURL + withAPIKey:(NSString*)APIKey + withDebugFile:(NSString*)debugFile + withDebugID:(NSString*)debugID; + +/** + Calls the /v1/uploads:create API on the server. + */ ++ (UploadURLResponse*)createUploadURLOnServer:(NSString*)APIURL + withAPIKey:(NSString*)APIKey; + +/** + Calls the /v1/uploads/{key}:complete API on the server. + */ ++ (CompleteUploadResult)completeUploadOnServer:(NSString*)APIURL + withAPIKey:(NSString*)APIKey + withUploadKey:(NSString*)uploadKey + withDebugFile:(NSString*)debugFile + withDebugID:(NSString*)debugID + withType:(NSString*)type + withProductName:(NSString*)productName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/src/common/mac/SymbolCollectorClient.m b/src/common/mac/SymbolCollectorClient.m new file mode 100644 index 0000000..fd33432 --- /dev/null +++ b/src/common/mac/SymbolCollectorClient.m @@ -0,0 +1,271 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#import "SymbolCollectorClient.h" + +#import "HTTPGetRequest.h" +#import "HTTPSimplePostRequest.h" + +@implementation UploadURLResponse + +//============================================================================= +- (id)initWithUploadURL:(NSString*)uploadURL + withUploadKey:(NSString*)uploadKey { + if (self = [super init]) { + uploadURL_ = [uploadURL copy]; + uploadKey_ = [uploadKey copy]; + } + return self; +} + +//============================================================================= +- (void)dealloc { + [uploadURL_ release]; + [uploadKey_ release]; + + [super dealloc]; +} + +//============================================================================= +- (NSString*)uploadURL { + return uploadURL_; +} + +//============================================================================= +- (NSString*)uploadKey { + return uploadKey_; +} +@end + +@implementation SymbolCollectorClient + +//============================================================================= ++ (SymbolStatus)checkSymbolStatusOnServer:(NSString*)APIURL + withAPIKey:(NSString*)APIKey + withDebugFile:(NSString*)debugFile + withDebugID:(NSString*)debugID { + // Note that forward-slash is listed as a character to escape here, for + // completeness, however it is illegal in a debugFile input. + NSMutableCharacterSet* allowedDebugFileCharacters = [NSMutableCharacterSet + characterSetWithCharactersInString:@" \"\\/#%:?@|^`{}<>[]&=;"]; + [allowedDebugFileCharacters + formUnionWithCharacterSet:[NSCharacterSet controlCharacterSet]]; + [allowedDebugFileCharacters invert]; + NSString* escapedDebugFile = + [debugFile stringByAddingPercentEncodingWithAllowedCharacters: + allowedDebugFileCharacters]; + + NSURL* URL = [NSURL + URLWithString:[NSString + stringWithFormat:@"%@/v1/symbols/%@/%@:checkStatus" + @"?key=%@", + APIURL, escapedDebugFile, debugID, + APIKey]]; + + HTTPGetRequest* getRequest = [[HTTPGetRequest alloc] initWithURL:URL]; + NSError* error = nil; + NSData* data = [getRequest send:&error]; + NSString* result = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + int responseCode = [[getRequest response] statusCode]; + [getRequest release]; + + if (error || responseCode != 200) { + fprintf(stdout, "Failed to check symbol status.\n"); + fprintf(stdout, "Response code: %d\n", responseCode); + fprintf(stdout, "Response:\n"); + fprintf(stdout, "%s\n", [result UTF8String]); + return SymbolStatusUnknown; + } + + error = nil; + NSRegularExpression* statusRegex = [NSRegularExpression + regularExpressionWithPattern:@"\"status\": \"([^\"]+)\"" + options:0 + error:&error]; + NSArray* matches = + [statusRegex matchesInString:result + options:0 + range:NSMakeRange(0, [result length])]; + if ([matches count] != 1) { + fprintf(stdout, "Failed to parse check symbol status response."); + fprintf(stdout, "Response:\n"); + fprintf(stdout, "%s\n", [result UTF8String]); + return SymbolStatusUnknown; + } + + NSString* status = [result substringWithRange:[matches[0] rangeAtIndex:1]]; + [result release]; + + return [status isEqualToString:@"FOUND"] ? SymbolStatusFound + : SymbolStatusMissing; +} + +//============================================================================= ++ (UploadURLResponse*)createUploadURLOnServer:(NSString*)APIURL + withAPIKey:(NSString*)APIKey { + NSURL* URL = [NSURL + URLWithString:[NSString stringWithFormat:@"%@/v1/uploads:create?key=%@", + APIURL, APIKey]]; + + HTTPSimplePostRequest* postRequest = + [[HTTPSimplePostRequest alloc] initWithURL:URL]; + NSError* error = nil; + NSData* data = [postRequest send:&error]; + NSString* result = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + int responseCode = [[postRequest response] statusCode]; + [postRequest release]; + + if (error || responseCode != 200) { + fprintf(stdout, "Failed to create upload URL.\n"); + fprintf(stdout, "Response code: %d\n", responseCode); + fprintf(stdout, "Response:\n"); + fprintf(stdout, "%s\n", [result UTF8String]); + return nil; + } + + // Note camel-case rather than underscores. + NSRegularExpression* uploadURLRegex = [NSRegularExpression + regularExpressionWithPattern:@"\"uploadUrl\": \"([^\"]+)\"" + options:0 + error:&error]; + NSRegularExpression* uploadKeyRegex = [NSRegularExpression + regularExpressionWithPattern:@"\"uploadKey\": \"([^\"]+)\"" + options:0 + error:&error]; + + NSArray* uploadURLMatches = + [uploadURLRegex matchesInString:result + options:0 + range:NSMakeRange(0, [result length])]; + NSArray* uploadKeyMatches = + [uploadKeyRegex matchesInString:result + options:0 + range:NSMakeRange(0, [result length])]; + if ([uploadURLMatches count] != 1 || [uploadKeyMatches count] != 1) { + fprintf(stdout, "Failed to parse create url response."); + fprintf(stdout, "Response:\n"); + fprintf(stdout, "%s\n", [result UTF8String]); + return nil; + } + NSString* uploadURL = + [result substringWithRange:[uploadURLMatches[0] rangeAtIndex:1]]; + NSString* uploadKey = + [result substringWithRange:[uploadKeyMatches[0] rangeAtIndex:1]]; + + return [[UploadURLResponse alloc] initWithUploadURL:uploadURL + withUploadKey:uploadKey]; +} + +//============================================================================= ++ (CompleteUploadResult)completeUploadOnServer:(NSString*)APIURL + withAPIKey:(NSString*)APIKey + withUploadKey:(NSString*)uploadKey + withDebugFile:(NSString*)debugFile + withDebugID:(NSString*)debugID + withType:(NSString*)type + withProductName:(NSString*)productName { + NSURL* URL = [NSURL + URLWithString:[NSString + stringWithFormat:@"%@/v1/uploads/%@:complete?key=%@", + APIURL, uploadKey, APIKey]]; + + NSMutableDictionary* jsonDictionary = [@{ + @"symbol_id" : @{@"debug_file" : debugFile, @"debug_id" : debugID}, + @"symbol_upload_type" : type, @"use_async_processing" : @"true" + } mutableCopy]; + + if (productName != nil) { + jsonDictionary[@"metadata"] = @{@"product_name": productName}; + } + + NSError* error = nil; + NSData* jsonData = + [NSJSONSerialization dataWithJSONObject:jsonDictionary + options:NSJSONWritingPrettyPrinted + error:&error]; + if (jsonData == nil) { + fprintf(stdout, "Error: %s\n", [[error localizedDescription] UTF8String]); + fprintf(stdout, + "Failed to complete upload. Could not write JSON payload.\n"); + return CompleteUploadResultError; + } + + NSString* body = [[NSString alloc] initWithData:jsonData + encoding:NSUTF8StringEncoding]; + HTTPSimplePostRequest* postRequest = + [[HTTPSimplePostRequest alloc] initWithURL:URL]; + [postRequest setBody:body]; + [postRequest setContentType:@"application/json"]; + + NSData* data = [postRequest send:&error]; + if (data == nil) { + fprintf(stdout, "Error: %s\n", [[error localizedDescription] UTF8String]); + fprintf(stdout, "Failed to complete upload URL.\n"); + return CompleteUploadResultError; + } + + NSString* result = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + int responseCode = [[postRequest response] statusCode]; + [postRequest release]; + if (responseCode != 200) { + fprintf(stdout, "Failed to complete upload URL.\n"); + fprintf(stdout, "Response code: %d\n", responseCode); + fprintf(stdout, "Response:\n"); + fprintf(stdout, "%s\n", [result UTF8String]); + return CompleteUploadResultError; + } + + // Note camel-case rather than underscores. + NSRegularExpression* completeResultRegex = [NSRegularExpression + regularExpressionWithPattern:@"\"result\": \"([^\"]+)\"" + options:0 + error:&error]; + + NSArray* completeResultMatches = + [completeResultRegex matchesInString:result + options:0 + range:NSMakeRange(0, [result length])]; + + if ([completeResultMatches count] != 1) { + fprintf(stdout, "Failed to parse complete upload response."); + fprintf(stdout, "Response:\n"); + fprintf(stdout, "%s\n", [result UTF8String]); + return CompleteUploadResultError; + } + NSString* completeResult = + [result substringWithRange:[completeResultMatches[0] rangeAtIndex:1]]; + [result release]; + + return ([completeResult isEqualToString:@"DUPLICATE_DATA"]) + ? CompleteUploadResultDuplicateData + : CompleteUploadResultOk; +} +@end diff --git a/src/common/mac/arch_utilities.cc b/src/common/mac/arch_utilities.cc new file mode 100644 index 0000000..af6c363 --- /dev/null +++ b/src/common/mac/arch_utilities.cc @@ -0,0 +1,160 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/mac/arch_utilities.h" + +#include +#include +#include +#include +#include + +#ifdef __APPLE__ +#include +#endif + +namespace { + +enum Architecture { + kArch_i386 = 0, + kArch_x86_64, + kArch_x86_64h, + kArch_arm, + kArch_arm64, + kArch_arm64e, + kArch_ppc, + // This must be last. + kNumArchitectures +}; + +struct NamedArchInfo { + const char* name; + ArchInfo info; +}; + +// enum Architecture above and kKnownArchitectures below +// must be kept in sync. +constexpr NamedArchInfo kKnownArchitectures[] = { + {"i386", {CPU_TYPE_I386, CPU_SUBTYPE_I386_ALL}}, + {"x86_64", {CPU_TYPE_X86_64, CPU_SUBTYPE_X86_64_ALL}}, + {"x86_64h", {CPU_TYPE_X86_64, CPU_SUBTYPE_X86_64_H}}, + {"arm", {CPU_TYPE_ARM, CPU_SUBTYPE_ARM_ALL}}, + {"arm64", {CPU_TYPE_ARM64, CPU_SUBTYPE_ARM64_ALL}}, + {"arm64e", {CPU_TYPE_ARM64, CPU_SUBTYPE_ARM64E}}, + {"ppc", {CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL}}}; + +} // namespace + +ArchInfo GetLocalArchInfo(void) { + Architecture arch; +#if defined(__i386__) + arch = kArch_i386; +#elif defined(__x86_64__) + arch = kArch_x86_64; +#elif defined(__arm64__) || defined(__aarch64__) + arch = kArch_arm64; +#elif defined(__arm__) + arch = kArch_arm; +#elif defined(__powerpc__) + arch = kArch_ppc; +#else + #error "Unsupported CPU architecture" +#endif + return kKnownArchitectures[arch].info; +} + +#ifdef __APPLE__ + +std::optional GetArchInfoFromName(const char* arch_name) { + if (__builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, *)) { + cpu_type_t type; + cpu_subtype_t subtype; + if (macho_cpu_type_for_arch_name(arch_name, &type, &subtype)) { + return ArchInfo{type, subtype}; + } + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + const NXArchInfo* info = NXGetArchInfoFromName(arch_name); +#pragma clang diagnostic pop + if (info) { + return ArchInfo{info->cputype, info->cpusubtype}; + } + } + return std::nullopt; +} + +const char* GetNameFromCPUType(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) { + if (__builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, *)) { + const char* name = macho_arch_name_for_cpu_type(cpu_type, cpu_subtype); + if (name) { + return name; + } + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + const NXArchInfo* info = NXGetArchInfoFromCpuType(cpu_type, cpu_subtype); +#pragma clang diagnostic pop + if (info) { + return info->name; + } + } + + return kUnknownArchName; +} + +#else + +std::optional GetArchInfoFromName(const char* arch_name) { + for (int arch = 0; arch < kNumArchitectures; ++arch) { + if (!strcmp(arch_name, kKnownArchitectures[arch].name)) { + return kKnownArchitectures[arch].info; + } + } + return std::nullopt; +} + +const char* GetNameFromCPUType(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) { + const char* candidate = kUnknownArchName; + for (int arch = 0; arch < kNumArchitectures; ++arch) { + if (kKnownArchitectures[arch].info.cputype == cpu_type) { + if (kKnownArchitectures[arch].info.cpusubtype == cpu_subtype) { + return kKnownArchitectures[arch].name; + } + if (!strcmp(candidate, kUnknownArchName)) { + candidate = kKnownArchitectures[arch].name; + } + } + } + return candidate; +} +#endif // __APPLE__ diff --git a/src/common/mac/arch_utilities.h b/src/common/mac/arch_utilities.h new file mode 100644 index 0000000..3b03673 --- /dev/null +++ b/src/common/mac/arch_utilities.h @@ -0,0 +1,56 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// arch_utilities.h: Utilities for architecture introspection for Mac platform. + +#ifndef COMMON_MAC_ARCH_UTILITIES_H__ +#define COMMON_MAC_ARCH_UTILITIES_H__ + +#include + +#include + +static constexpr const char* kUnknownArchName = ""; + +struct ArchInfo { + cpu_type_t cputype; + cpu_subtype_t cpusubtype; +}; + +// Returns architecture info if `arch_name` corresponds to a valid, known +// architecture, and std::nullopt otherwise. +std::optional GetArchInfoFromName(const char* arch_name); + +// Returns the name of the architecture specified by `cpu_type` and +// `cpu_subtype`, or `kUnknownArchName` if it's unknown or invalid. +const char* GetNameFromCPUType(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype); + +// Returns the architecture of the machine this code is running on. +ArchInfo GetLocalArchInfo(); + +#endif // COMMON_MAC_ARCH_UTILITIES_H__ diff --git a/src/common/mac/bootstrap_compat.cc b/src/common/mac/bootstrap_compat.cc new file mode 100644 index 0000000..408589b --- /dev/null +++ b/src/common/mac/bootstrap_compat.cc @@ -0,0 +1,45 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/mac/bootstrap_compat.h" + +namespace breakpad { + +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +kern_return_t BootstrapRegister(mach_port_t bp, + name_t service_name, + mach_port_t sp) { + return bootstrap_register(bp, service_name, sp); +} +#pragma GCC diagnostic warning "-Wdeprecated-declarations" + +} // namesapce breakpad diff --git a/src/common/mac/bootstrap_compat.h b/src/common/mac/bootstrap_compat.h new file mode 100644 index 0000000..b57d907 --- /dev/null +++ b/src/common/mac/bootstrap_compat.h @@ -0,0 +1,53 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_MAC_BOOTSTRAP_COMPAT_H_ +#define COMMON_MAC_BOOTSTRAP_COMPAT_H_ + +#include + +namespace breakpad { + +// Wrapper for bootstrap_register to avoid deprecation warnings. +// +// In 10.6, it's possible to call bootstrap_check_in as the one-stop-shop for +// handling what bootstrap_register is used for. In 10.5, bootstrap_check_in +// can't check in a service whose name has not yet been registered, despite +// bootstrap_register being marked as deprecated in that OS release. Breakpad +// needs to register new service names, and in 10.5, calling +// bootstrap_register is the only way to achieve that. Attempts to call +// bootstrap_check_in for a new service name on 10.5 will result in +// BOOTSTRAP_UNKNOWN_SERVICE being returned rather than registration of the +// new service name. +kern_return_t BootstrapRegister(mach_port_t bp, + name_t service_name, + mach_port_t sp); + +} // namespace breakpad + +#endif // COMMON_MAC_BOOTSTRAP_COMPAT_H_ diff --git a/src/common/mac/byteswap.h b/src/common/mac/byteswap.h new file mode 100644 index 0000000..c4c7e61 --- /dev/null +++ b/src/common/mac/byteswap.h @@ -0,0 +1,72 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// byteswap.h: Overloaded functions for conveniently byteswapping values. + +#ifndef COMMON_MAC_BYTESWAP_H_ +#define COMMON_MAC_BYTESWAP_H_ + +#ifdef __APPLE__ +#include + +static inline uint16_t ByteSwap(uint16_t v) { return OSSwapInt16(v); } +static inline uint32_t ByteSwap(uint32_t v) { return OSSwapInt32(v); } +static inline uint64_t ByteSwap(uint64_t v) { return OSSwapInt64(v); } +static inline int16_t ByteSwap(int16_t v) { return OSSwapInt16(v); } +static inline int32_t ByteSwap(int32_t v) { return OSSwapInt32(v); } +static inline int64_t ByteSwap(int64_t v) { return OSSwapInt64(v); } + +#elif defined(__linux__) +// For NXByteOrder +#include +#include +#include +#include_next + +static inline uint16_t ByteSwap(uint16_t v) { return bswap_16(v); } +static inline uint32_t ByteSwap(uint32_t v) { return bswap_32(v); } +static inline uint64_t ByteSwap(uint64_t v) { return bswap_64(v); } +static inline int16_t ByteSwap(int16_t v) { return bswap_16(v); } +static inline int32_t ByteSwap(int32_t v) { return bswap_32(v); } +static inline int64_t ByteSwap(int64_t v) { return bswap_64(v); } + +static inline NXByteOrder NXHostByteOrder() { +#ifdef __LITTLE_ENDIAN + return NX_LittleEndian; +#else + return NX_BigEndian; +#endif +} + +#endif // __APPLE__ + +#endif // COMMON_MAC_BYTESWAP_H_ diff --git a/src/common/mac/dump_syms.cc b/src/common/mac/dump_syms.cc new file mode 100644 index 0000000..c06945e --- /dev/null +++ b/src/common/mac/dump_syms.cc @@ -0,0 +1,726 @@ +// -*- mode: c++ -*- + +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Jim Blandy + +// dump_syms.cc: Create a symbol file for use with minidumps + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/mac/dump_syms.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "common/dwarf/bytereader-inl.h" +#include "common/dwarf/dwarf2reader.h" +#include "common/dwarf_cfi_to_module.h" +#include "common/dwarf_cu_to_module.h" +#include "common/dwarf_line_to_module.h" +#include "common/dwarf_range_list_handler.h" +#include "common/mac/file_id.h" +#include "common/mac/arch_utilities.h" +#include "common/mac/macho_reader.h" +#include "common/module.h" +#include "common/path_helper.h" +#include "common/scoped_ptr.h" +#include "common/stabs_reader.h" +#include "common/stabs_to_module.h" +#include "common/symbol_data.h" + +#ifndef CPU_TYPE_ARM +#define CPU_TYPE_ARM (static_cast(12)) +#endif // CPU_TYPE_ARM + +#ifndef CPU_TYPE_ARM64 +#define CPU_TYPE_ARM64 (static_cast(16777228)) +#endif // CPU_TYPE_ARM64 + +using google_breakpad::ByteReader; +using google_breakpad::DwarfCUToModule; +using google_breakpad::DwarfLineToModule; +using google_breakpad::DwarfRangeListHandler; +using google_breakpad::mach_o::FatReader; +using google_breakpad::mach_o::FileID; +using google_breakpad::mach_o::Section; +using google_breakpad::mach_o::Segment; +using google_breakpad::Module; +using google_breakpad::StabsReader; +using google_breakpad::StabsToModule; +using google_breakpad::scoped_ptr; +using std::make_pair; +using std::pair; +using std::string; +using std::vector; + +namespace { +// Return a vector with absolute paths to all the entries +// in directory (excluding . and ..). +vector list_directory(const string& directory) { + vector entries; + DIR* dir = opendir(directory.c_str()); + if (!dir) { + return entries; + } + + string path = directory; + if (path[path.length() - 1] != '/') { + path += '/'; + } + + struct dirent* entry = NULL; + while ((entry = readdir(dir))) { + if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { + entries.push_back(path + entry->d_name); + } + } + + closedir(dir); + return entries; +} +} + +namespace google_breakpad { + +bool DumpSymbols::Read(const string& filename) { + selected_object_file_ = nullptr; + struct stat st; + if (stat(filename.c_str(), &st) == -1) { + fprintf(stderr, "Could not access object file %s: %s\n", + filename.c_str(), strerror(errno)); + return false; + } + + from_disk_ = true; + + // Does this filename refer to a dSYM bundle? + string contents_path = filename + "/Contents/Resources/DWARF"; + string object_filename; + if (S_ISDIR(st.st_mode) && + access(contents_path.c_str(), F_OK) == 0) { + // If there's one file under Contents/Resources/DWARF then use that, + // otherwise bail out. + const vector entries = list_directory(contents_path); + if (entries.size() == 0) { + fprintf(stderr, "Unable to find DWARF-bearing file in bundle: %s\n", + filename.c_str()); + return false; + } + if (entries.size() > 1) { + fprintf(stderr, "Too many DWARF files in bundle: %s\n", + filename.c_str()); + return false; + } + + object_filename = entries[0]; + } else { + object_filename = filename; + } + + // Read the file's contents into memory. + bool read_ok = true; + string error; + scoped_array contents; + off_t total = 0; + if (stat(object_filename.c_str(), &st) != -1) { + FILE* f = fopen(object_filename.c_str(), "rb"); + if (f) { + contents.reset(new uint8_t[st.st_size]); + while (total < st.st_size && !feof(f)) { + size_t read = fread(&contents[0] + total, 1, st.st_size - total, f); + if (read == 0) { + if (ferror(f)) { + read_ok = false; + error = strerror(errno); + } + break; + } + total += read; + } + fclose(f); + } else { + error = strerror(errno); + } + } + + if (!read_ok) { + fprintf(stderr, "Error reading object file: %s: %s\n", + object_filename.c_str(), error.c_str()); + return false; + } + return ReadData(contents.release(), total, object_filename); +} + +bool DumpSymbols::ReadData(uint8_t* contents, size_t size, + const std::string& filename) { + contents_.reset(contents); + size_ = size; + object_filename_ = filename; + + // Get the list of object files present in the file. + FatReader::Reporter fat_reporter(object_filename_); + FatReader fat_reader(&fat_reporter); + if (!fat_reader.Read(contents_.get(), size)) { + return false; + } + + // Get our own copy of fat_reader's object file list. + size_t object_files_count; + const SuperFatArch* object_files = + fat_reader.object_files(&object_files_count); + if (object_files_count == 0) { + fprintf(stderr, "Fat binary file contains *no* architectures: %s\n", + object_filename_.c_str()); + return false; + } + object_files_.resize(object_files_count); + memcpy(&object_files_[0], object_files, + sizeof(SuperFatArch) * object_files_count); + + return true; +} + +bool DumpSymbols::SetArchitecture(const ArchInfo& info) { + // Find the best match for the architecture the user requested. + const SuperFatArch* best_match = + FindBestMatchForArchitecture(info.cputype, info.cpusubtype); + if (!best_match) return false; + + // Record the selected object file. + selected_object_file_ = best_match; + return true; +} + + +SuperFatArch* DumpSymbols::FindBestMatchForArchitecture( + cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype) { + SuperFatArch* closest_match = nullptr; + for (auto& object_file : object_files_) { + if (static_cast(object_file.cputype) == cpu_type) { + // If there's an exact match, return it directly. + if ((static_cast(object_file.cpusubtype) & + ~CPU_SUBTYPE_MASK) == (cpu_subtype & ~CPU_SUBTYPE_MASK)) { + return &object_file; + } + // Otherwise, hold on to this as the closest match since at least the CPU + // type matches. + if (!closest_match) { + closest_match = &object_file; + } + } + } + // No exact match found. + fprintf(stderr, + "Failed to find an exact match for an object file with cpu " + "type: %d and cpu subtype: %d.\n", + cpu_type, cpu_subtype); + if (closest_match) { + fprintf(stderr, "Using %s as the closest match.\n", + GetNameFromCPUType(closest_match->cputype, + closest_match->cpusubtype)); + return closest_match; + } + return nullptr; +} + +string DumpSymbols::Identifier() { + scoped_ptr file_id; + + if (from_disk_) { + file_id.reset(new FileID(object_filename_.c_str())); + } else { + file_id.reset(new FileID(contents_.get(), size_)); + } + unsigned char identifier_bytes[16]; + scoped_ptr module; + if (!selected_object_file_) { + if (!CreateEmptyModule(module)) + return string(); + } + cpu_type_t cpu_type = selected_object_file_->cputype; + cpu_subtype_t cpu_subtype = selected_object_file_->cpusubtype; + if (!file_id->MachoIdentifier(cpu_type, cpu_subtype, identifier_bytes)) { + fprintf(stderr, "Unable to calculate UUID of mach-o binary %s!\n", + object_filename_.c_str()); + return ""; + } + + char identifier_string[40]; + FileID::ConvertIdentifierToString(identifier_bytes, identifier_string, + sizeof(identifier_string)); + + string compacted(identifier_string); + for(size_t i = compacted.find('-'); i != string::npos; + i = compacted.find('-', i)) + compacted.erase(i, 1); + + // The pdb for these IDs has an extra byte, so to make everything uniform put + // a 0 on the end of mac IDs. + compacted += "0"; + + return compacted; +} + +// A range handler that accepts rangelist data parsed by +// RangeListReader and populates a range vector (typically +// owned by a function) with the results. +class DumpSymbols::DumperRangesHandler: + public DwarfCUToModule::RangesHandler { + public: + DumperRangesHandler(ByteReader* reader) : + reader_(reader) { } + + bool ReadRanges( + enum DwarfForm form, uint64_t data, + RangeListReader::CURangesInfo* cu_info, + vector* ranges) { + DwarfRangeListHandler handler(ranges); + RangeListReader range_list_reader(reader_, cu_info, + &handler); + return range_list_reader.ReadRanges(form, data); + } + + private: + ByteReader* reader_; +}; + +// A line-to-module loader that accepts line number info parsed by +// LineInfo and populates a Module and a line vector +// with the results. +class DumpSymbols::DumperLineToModule: + public DwarfCUToModule::LineToModuleHandler { + public: + // Create a line-to-module converter using BYTE_READER. + DumperLineToModule(ByteReader* byte_reader) + : byte_reader_(byte_reader) { } + + void StartCompilationUnit(const string& compilation_dir) { + compilation_dir_ = compilation_dir; + } + + void ReadProgram(const uint8_t* program, + uint64_t length, + const uint8_t* string_section, + uint64_t string_section_length, + const uint8_t* line_string_section, + uint64_t line_string_section_length, + Module* module, + vector* lines, + std::map* files) { + DwarfLineToModule handler(module, compilation_dir_, lines, files); + LineInfo parser(program, length, byte_reader_, nullptr, 0, + nullptr, 0, &handler); + parser.Start(); + } + private: + string compilation_dir_; + ByteReader* byte_reader_; // WEAK +}; + +bool DumpSymbols::CreateEmptyModule(scoped_ptr& module) { + // Select an object file, if SetArchitecture hasn't been called to set one + // explicitly. + if (!selected_object_file_) { + // If there's only one architecture, that's the one. + if (object_files_.size() == 1) + selected_object_file_ = &object_files_[0]; + else { + // Look for an object file whose architecture matches our own. + ArchInfo local_arch = GetLocalArchInfo(); + if (!SetArchitecture(local_arch)) { + fprintf(stderr, "%s: object file contains more than one" + " architecture, none of which match the current" + " architecture; specify an architecture explicitly" + " with '-a ARCH' to resolve the ambiguity\n", + object_filename_.c_str()); + return false; + } + } + } + + assert(selected_object_file_); + + // Find the name of the selected file's architecture, to appear in + // the MODULE record and in error messages. + const char* selected_arch_name = GetNameFromCPUType( + selected_object_file_->cputype, selected_object_file_->cpusubtype); + + // In certain cases, it is possible that architecture info can't be reliably + // determined, e.g. new architectures that breakpad is unware of. In that + // case, avoid crashing and return false instead. + if (selected_arch_name == kUnknownArchName) { + return false; + } + + if (strcmp(selected_arch_name, "i386") == 0) + selected_arch_name = "x86"; + + // Produce a name to use in error messages that includes the + // filename, and the architecture, if there is more than one. + selected_object_name_ = object_filename_; + if (object_files_.size() > 1) { + selected_object_name_ += ", architecture "; + selected_object_name_ + selected_arch_name; + } + + // Compute a module name, to appear in the MODULE record. + string module_name; + if (!module_name_.empty()) { + module_name = module_name_; + } else { + module_name = google_breakpad::BaseName(object_filename_); + } + + // Choose an identifier string, to appear in the MODULE record. + string identifier = Identifier(); + if (identifier.empty()) + return false; + + // Create a module to hold the debugging information. + module.reset(new Module(module_name, "mac", selected_arch_name, identifier, + "", enable_multiple_, prefer_extern_name_)); + return true; +} + +void DumpSymbols::StartProcessSplitDwarf( + google_breakpad::CompilationUnit* reader, + Module* module, + google_breakpad::Endianness endianness, + bool handle_inter_cu_refs, + bool handle_inline) const { + std::string split_file; + google_breakpad::SectionMap split_sections; + google_breakpad::ByteReader split_byte_reader(endianness); + uint64_t cu_offset = 0; + if (reader->ProcessSplitDwarf(split_file, split_sections, split_byte_reader, + cu_offset)) + return; + DwarfCUToModule::FileContext file_context(split_file, module, + handle_inter_cu_refs); + for (auto section : split_sections) + file_context.AddSectionToSectionMap(section.first, section.second.first, + section.second.second); + // Because DWP/DWO file doesn't have .debug_addr/.debug_line/.debug_line_str, + // its debug info will refer to .debug_addr/.debug_line in the main binary. + if (file_context.section_map().find(".debug_addr") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_addr", reader->GetAddrBuffer(), + reader->GetAddrBufferLen()); + if (file_context.section_map().find(".debug_line") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_line", reader->GetLineBuffer(), + reader->GetLineBufferLen()); + if (file_context.section_map().find(".debug_line_str") == + file_context.section_map().end()) + file_context.AddSectionToSectionMap(".debug_line_str", + reader->GetLineStrBuffer(), + reader->GetLineStrBufferLen()); + DumperRangesHandler ranges_handler(&split_byte_reader); + DumperLineToModule line_to_module(&split_byte_reader); + DwarfCUToModule::WarningReporter reporter(split_file, cu_offset); + DwarfCUToModule root_handler( + &file_context, &line_to_module, &ranges_handler, &reporter, handle_inline, + reader->GetLowPC(), reader->GetAddrBase(), reader->HasSourceLineInfo(), + reader->GetSourceLineOffset()); + google_breakpad::DIEDispatcher die_dispatcher(&root_handler); + google_breakpad::CompilationUnit split_reader( + split_file, file_context.section_map(), cu_offset, &split_byte_reader, + &die_dispatcher); + split_reader.SetSplitDwarf(reader->GetAddrBase(), reader->GetDWOID()); + split_reader.Start(); + // Normally, it won't happen unless we have transitive reference. + if (split_reader.ShouldProcessSplitDwarf()) { + StartProcessSplitDwarf(&split_reader, module, endianness, + handle_inter_cu_refs, handle_inline); + } +} + +void DumpSymbols::ReadDwarf(google_breakpad::Module* module, + const mach_o::Reader& macho_reader, + const mach_o::SectionMap& dwarf_sections, + bool handle_inter_cu_refs) const { + // Build a byte reader of the appropriate endianness. + google_breakpad::Endianness endianness = + macho_reader.big_endian() ? ENDIANNESS_BIG : ENDIANNESS_LITTLE; + ByteReader byte_reader(endianness); + + // Construct a context for this file. + DwarfCUToModule::FileContext file_context(selected_object_name_, + module, + handle_inter_cu_refs); + + // Build a SectionMap from our mach_o::SectionMap. + for (mach_o::SectionMap::const_iterator it = dwarf_sections.begin(); + it != dwarf_sections.end(); ++it) { + file_context.AddSectionToSectionMap( + it->first, + it->second.contents.start, + it->second.contents.Size()); + } + + // Find the __debug_info section. + SectionMap::const_iterator debug_info_entry = + file_context.section_map().find("__debug_info"); + // There had better be a __debug_info section! + if (debug_info_entry == file_context.section_map().end()) { + fprintf(stderr, "%s: __DWARF segment of file has no __debug_info section\n", + selected_object_name_.c_str()); + return; + } + const std::pair& debug_info_section = + debug_info_entry->second; + + // Build a line-to-module loader for the root handler to use. + DumperLineToModule line_to_module(&byte_reader); + + // .debug_ranges and .debug_rngslists reader + DumperRangesHandler ranges_handler(&byte_reader); + + // Walk the __debug_info section, one compilation unit at a time. + uint64_t debug_info_length = debug_info_section.second; + bool handle_inline = symbol_data_ & INLINES; + for (uint64_t offset = 0; offset < debug_info_length;) { + // Make a handler for the root DIE that populates MODULE with the + // debug info. + DwarfCUToModule::WarningReporter reporter(selected_object_name_, + offset); + DwarfCUToModule root_handler(&file_context, &line_to_module, + &ranges_handler, &reporter, handle_inline); + // Make a Dwarf2Handler that drives our DIEHandler. + DIEDispatcher die_dispatcher(&root_handler); + // Make a DWARF parser for the compilation unit at OFFSET. + CompilationUnit dwarf_reader(selected_object_name_, + file_context.section_map(), + offset, + &byte_reader, + &die_dispatcher); + // Process the entire compilation unit; get the offset of the next. + offset += dwarf_reader.Start(); + // Start to process split dwarf file. + if (dwarf_reader.ShouldProcessSplitDwarf()) { + StartProcessSplitDwarf(&dwarf_reader, module, endianness, + handle_inter_cu_refs, handle_inline); + } + } +} + +bool DumpSymbols::ReadCFI(google_breakpad::Module* module, + const mach_o::Reader& macho_reader, + const mach_o::Section& section, + bool eh_frame) const { + // Find the appropriate set of register names for this file's + // architecture. + vector register_names; + switch (macho_reader.cpu_type()) { + case CPU_TYPE_X86: + register_names = DwarfCFIToModule::RegisterNames::I386(); + break; + case CPU_TYPE_X86_64: + register_names = DwarfCFIToModule::RegisterNames::X86_64(); + break; + case CPU_TYPE_ARM: + register_names = DwarfCFIToModule::RegisterNames::ARM(); + break; + case CPU_TYPE_ARM64: + register_names = DwarfCFIToModule::RegisterNames::ARM64(); + break; + default: { + const char* arch_name = GetNameFromCPUType(macho_reader.cpu_type(), + macho_reader.cpu_subtype()); + fprintf( + stderr, + "%s: cannot convert DWARF call frame information for architecture " + "'%s' (%d, %d) to Breakpad symbol file: no register name table\n", + selected_object_name_.c_str(), arch_name, macho_reader.cpu_type(), + macho_reader.cpu_subtype()); + return false; + } + } + + // Find the call frame information and its size. + const uint8_t* cfi = section.contents.start; + size_t cfi_size = section.contents.Size(); + + // Plug together the parser, handler, and their entourages. + DwarfCFIToModule::Reporter module_reporter(selected_object_name_, + section.section_name); + DwarfCFIToModule handler(module, register_names, &module_reporter); + ByteReader byte_reader(macho_reader.big_endian() ? + ENDIANNESS_BIG : + ENDIANNESS_LITTLE); + byte_reader.SetAddressSize(macho_reader.bits_64() ? 8 : 4); + // At the moment, according to folks at Apple and some cursory + // investigation, Mac OS X only uses DW_EH_PE_pcrel-based pointers, so + // this is the only base address the CFI parser will need. + byte_reader.SetCFIDataBase(section.address, cfi); + + CallFrameInfo::Reporter dwarf_reporter(selected_object_name_, + section.section_name); + CallFrameInfo parser(cfi, cfi_size, + &byte_reader, &handler, &dwarf_reporter, + eh_frame); + parser.Start(); + return true; +} + +// A LoadCommandHandler that loads whatever debugging data it finds into a +// Module. +class DumpSymbols::LoadCommandDumper: + public mach_o::Reader::LoadCommandHandler { + public: + // Create a load command dumper handling load commands from READER's + // file, and adding data to MODULE. + LoadCommandDumper(const DumpSymbols& dumper, + google_breakpad::Module* module, + const mach_o::Reader& reader, + SymbolData symbol_data, + bool handle_inter_cu_refs) + : dumper_(dumper), + module_(module), + reader_(reader), + symbol_data_(symbol_data), + handle_inter_cu_refs_(handle_inter_cu_refs) { } + + bool SegmentCommand(const mach_o::Segment& segment); + bool SymtabCommand(const ByteBuffer& entries, const ByteBuffer& strings); + + private: + const DumpSymbols& dumper_; + google_breakpad::Module* module_; // WEAK + const mach_o::Reader& reader_; + const SymbolData symbol_data_; + const bool handle_inter_cu_refs_; +}; + +bool DumpSymbols::LoadCommandDumper::SegmentCommand(const Segment& segment) { + mach_o::SectionMap section_map; + if (!reader_.MapSegmentSections(segment, §ion_map)) + return false; + + if (segment.name == "__TEXT") { + module_->SetLoadAddress(segment.vmaddr); + if (symbol_data_ & CFI) { + mach_o::SectionMap::const_iterator eh_frame = + section_map.find("__eh_frame"); + if (eh_frame != section_map.end()) { + // If there is a problem reading this, don't treat it as a fatal error. + dumper_.ReadCFI(module_, reader_, eh_frame->second, true); + } + } + return true; + } + + if (segment.name == "__DWARF") { + if ((symbol_data_ & SYMBOLS_AND_FILES) || (symbol_data_ & INLINES)) { + dumper_.ReadDwarf(module_, reader_, section_map, handle_inter_cu_refs_); + } + if (symbol_data_ & CFI) { + mach_o::SectionMap::const_iterator debug_frame + = section_map.find("__debug_frame"); + if (debug_frame != section_map.end()) { + // If there is a problem reading this, don't treat it as a fatal error. + dumper_.ReadCFI(module_, reader_, debug_frame->second, false); + } + } + } + + return true; +} + +bool DumpSymbols::LoadCommandDumper::SymtabCommand(const ByteBuffer& entries, + const ByteBuffer& strings) { + StabsToModule stabs_to_module(module_); + // Mac OS X STABS are never "unitized", and the size of the 'value' field + // matches the address size of the executable. + StabsReader stabs_reader(entries.start, entries.Size(), + strings.start, strings.Size(), + reader_.big_endian(), + reader_.bits_64() ? 8 : 4, + true, + &stabs_to_module); + if (!stabs_reader.Process()) + return false; + stabs_to_module.Finalize(); + return true; +} + +bool DumpSymbols::ReadSymbolData(Module** out_module) { + scoped_ptr module; + if (!CreateEmptyModule(module)) + return false; + + // Parse the selected object file. + mach_o::Reader::Reporter reporter(selected_object_name_); + mach_o::Reader reader(&reporter); + if (!reader.Read(&contents_[0] + + selected_object_file_->offset, + selected_object_file_->size, + selected_object_file_->cputype, + selected_object_file_->cpusubtype)) + return false; + + // Walk its load commands, and deal with whatever is there. + LoadCommandDumper load_command_dumper(*this, module.get(), reader, + symbol_data_, handle_inter_cu_refs_); + if (!reader.WalkLoadCommands(&load_command_dumper)) + return false; + + *out_module = module.release(); + + return true; +} + +// Read the selected object file's debugging information, and write out the +// header only to |stream|. Return true on success; if an error occurs, report +// it and return false. +bool DumpSymbols::WriteSymbolFileHeader(std::ostream& stream) { + scoped_ptr module; + if (!CreateEmptyModule(module)) + return false; + + return module->Write(stream, symbol_data_); +} + +} // namespace google_breakpad diff --git a/src/common/mac/dump_syms.h b/src/common/mac/dump_syms.h new file mode 100644 index 0000000..5ccf49e --- /dev/null +++ b/src/common/mac/dump_syms.h @@ -0,0 +1,229 @@ +// -*- mode: c++ -*- + +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Jim Blandy + +// dump_syms.h: Declaration of google_breakpad::DumpSymbols, a class for +// reading debugging information from Mach-O files and writing it out as a +// Breakpad symbol file. + +#include +#include +#include + +#include +#include +#include + +#include "common/byte_cursor.h" +#include "common/dwarf/dwarf2reader.h" +#include "common/mac/arch_utilities.h" +#include "common/mac/macho_reader.h" +#include "common/mac/super_fat_arch.h" +#include "common/module.h" +#include "common/scoped_ptr.h" +#include "common/symbol_data.h" + +namespace google_breakpad { + +class DumpSymbols { + public: + DumpSymbols(SymbolData symbol_data, + bool handle_inter_cu_refs, + bool enable_multiple = false, + const std::string& module_name = "", + bool prefer_extern_name = false) + : symbol_data_(symbol_data), + handle_inter_cu_refs_(handle_inter_cu_refs), + object_filename_(), + contents_(), + size_(0), + from_disk_(false), + object_files_(), + selected_object_file_(), + selected_object_name_(), + enable_multiple_(enable_multiple), + module_name_(module_name), + prefer_extern_name_(prefer_extern_name) {} + ~DumpSymbols() = default; + + // Prepare to read debugging information from |filename|. |filename| may be + // the name of a fat file, a Mach-O file, or a dSYM bundle containing either + // of the above. + // + // If |module_name_| is empty, uses the basename of |filename| as the module + // name. Otherwise, uses |module_name_| as the module name. + // + // On success, return true; if there is a problem reading + // |filename|, report it and return false. + bool Read(const std::string& filename); + + // Prepare to read debugging information from |contents|. |contents| is + // expected to be the data obtained from reading a fat file, or a Mach-O file. + // |filename| is used to determine the object filename in the generated + // output; there will not be an attempt to open this file as the data + // is already expected to be in memory. On success, return true; if there is a + // problem reading |contents|, report it and return false. + bool ReadData(uint8_t* contents, size_t size, const std::string& filename); + + // If this dumper's file includes an object file for `info`, then select that + // object file for dumping, and return true. Otherwise, return false, and + // leave this dumper's selected architecture unchanged. + // + // By default, if this dumper's file contains only one object file, then + // the dumper will dump those symbols; and if it contains more than one + // object file, then the dumper will dump the object file whose + // architecture matches that of this dumper program. + bool SetArchitecture(const ArchInfo& info); + + // Return a pointer to an array of SuperFatArch structures describing the + // object files contained in this dumper's file. Set *|count| to the number + // of elements in the array. The returned array is owned by this DumpSymbols + // instance. + // + // If there are no available architectures, this function + // may return NULL. + const SuperFatArch* AvailableArchitectures(size_t* count) { + *count = object_files_.size(); + if (object_files_.size() > 0) + return &object_files_[0]; + return NULL; + } + + // Read the selected object file's debugging information, and write out the + // header only to |stream|. Return true on success; if an error occurs, report + // it and return false. + bool WriteSymbolFileHeader(std::ostream& stream); + + // Read the selected object file's debugging information and store it in + // `module`. The caller owns the resulting module object and must delete + // it when finished. + bool ReadSymbolData(Module** module); + + // Return an identifier string for the file this DumpSymbols is dumping. + std::string Identifier(); + + private: + // Used internally. + class DumperLineToModule; + class DumperRangesHandler; + class LoadCommandDumper; + + // This method behaves similarly to NXFindBestFatArch, but it supports + // SuperFatArch. + SuperFatArch* FindBestMatchForArchitecture( + cpu_type_t cpu_type, cpu_subtype_t cpu_subtype); + + // Creates an empty module object. + bool CreateEmptyModule(scoped_ptr& module); + + // Process the split dwarf file referenced by reader. + void StartProcessSplitDwarf(google_breakpad::CompilationUnit* reader, + Module* module, + google_breakpad::Endianness endianness, + bool handle_inter_cu_refs, + bool handle_inline) const; + + // Read debugging information from |dwarf_sections|, which was taken from + // |macho_reader|, and add it to |module|. + void ReadDwarf(google_breakpad::Module* module, + const mach_o::Reader& macho_reader, + const mach_o::SectionMap& dwarf_sections, + bool handle_inter_cu_refs) const; + + // Read DWARF CFI or .eh_frame data from |section|, belonging to + // |macho_reader|, and record it in |module|. If |eh_frame| is true, + // then the data is .eh_frame-format data; otherwise, it is standard DWARF + // .debug_frame data. On success, return true; on failure, report + // the problem and return false. + bool ReadCFI(google_breakpad::Module* module, + const mach_o::Reader& macho_reader, + const mach_o::Section& section, + bool eh_frame) const; + + // The selection of what type of symbol data to read/write. + const SymbolData symbol_data_; + + // Whether to handle references between compilation units. + const bool handle_inter_cu_refs_; + + // The name of the file this DumpSymbols will actually read debugging + // information from. If the filename passed to Read refers to a dSYM bundle, + // then this is the resource file within that bundle. + std::string object_filename_; + + // The complete contents of object_filename_, mapped into memory. + scoped_array contents_; + + // The size of contents_. + size_t size_; + + // Indicates which entry point to DumpSymbols was used, i.e. Read vs ReadData. + // This is used to indicate that downstream code paths can/should also read + // from disk or not. + bool from_disk_; + + // A vector of SuperFatArch structures describing the object files + // object_filename_ contains. If object_filename_ refers to a fat binary, + // this may have more than one element; if it refers to a Mach-O file, this + // has exactly one element. + vector object_files_; + + // The object file in object_files_ selected to dump, or NULL if + // SetArchitecture hasn't been called yet. + const SuperFatArch* selected_object_file_; + + // A string that identifies the selected object file, for use in error + // messages. This is usually object_filename_, but if that refers to a + // fat binary, it includes an indication of the particular architecture + // within that binary. + string selected_object_name_; + + // Whether symbols sharing an address should be collapsed into a single entry + // and marked with an `m` in the output. + // See: https://crbug.com/google-breakpad/751 and docs at + // docs/symbol_files.md#records-3 + bool enable_multiple_; + + // If non-empty, used as the module name. Otherwise, the basename of + // |object_filename_| is used as the module name. + const std::string module_name_; + + // If a Function and an Extern share the same address but have a different + // name, prefer the name of the Extern. + // + // Use this when dumping Mach-O .dSYMs built with -gmlt (Minimum Line Tables), + // as the Function's fully-qualified name will only be present in the STABS + // (which are placed in the Extern), not in the DWARF symbols (which are + // placed in the Function). + bool prefer_extern_name_; +}; + +} // namespace google_breakpad diff --git a/src/common/mac/encoding_util.h b/src/common/mac/encoding_util.h new file mode 100644 index 0000000..3028f2e --- /dev/null +++ b/src/common/mac/encoding_util.h @@ -0,0 +1,40 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_COMMON_MAC_ENCODING_UTIL_H +#define GOOGLE_BREAKPAD_COMMON_MAC_ENCODING_UTIL_H + +#import + +// As -[NSString stringByAddingPercentEscapesUsingEncoding:] has been +// deprecated with iOS 9.0 / OS X 10.11 SDKs, this function re-implements it +// using -[NSString stringByAddingPercentEncodingWithAllowedCharacters:] when +// using those SDKs. +NSString* PercentEncodeNSString(NSString* key); + +#endif // GOOGLE_BREAKPAD_COMMON_MAC_ENCODING_UTIL_H diff --git a/src/common/mac/encoding_util.m b/src/common/mac/encoding_util.m new file mode 100644 index 0000000..5cf84fc --- /dev/null +++ b/src/common/mac/encoding_util.m @@ -0,0 +1,46 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "encoding_util.h" + +#include +#include +#import + +NSString* PercentEncodeNSString(NSString* key) { +#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && defined(__IPHONE_9_0) && \ + __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0) || \ + (defined(MAC_OS_X_VERSION_MIN_REQUIRED) && \ + defined(MAC_OS_X_VERSION_10_11) && \ + MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11) + return [key stringByAddingPercentEncodingWithAllowedCharacters: + [NSCharacterSet URLQueryAllowedCharacterSet]]; +#else + return [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; +#endif +} diff --git a/src/common/mac/file_id.cc b/src/common/mac/file_id.cc new file mode 100644 index 0000000..ee4a66b --- /dev/null +++ b/src/common/mac/file_id.cc @@ -0,0 +1,98 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// file_id.cc: Return a unique identifier for a file +// +// See file_id.h for documentation +// +// Author: Dan Waylonis + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/mac/file_id.h" + +#include +#include +#include + +#include "common/mac/macho_id.h" +#include "common/scoped_ptr.h" + +using MacFileUtilities::MachoID; + +namespace google_breakpad { +namespace mach_o { +// Constructs a FileID given a path to a file +FileID::FileID(const char* path) : memory_(nullptr), size_(0) { + snprintf(path_, sizeof(path_), "%s", path); +} + +// Constructs a FileID given the contents of a file and its size +FileID::FileID(void* memory, size_t size) + : path_(), memory_(memory), size_(size) {} + +bool FileID::MachoIdentifier(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + unsigned char identifier[16]) { + scoped_ptr macho; + if (memory_) { + macho.reset(new MachoID(memory_, size_)); + } else { + macho.reset(new MachoID(path_)); + } + if (macho->UUIDCommand(cpu_type, cpu_subtype, identifier)) + return true; + + return macho->MD5(cpu_type, cpu_subtype, identifier); +} + +// static +void FileID::ConvertIdentifierToString(const unsigned char identifier[16], + char *buffer, int buffer_length) { + int buffer_idx = 0; + for (int idx = 0; (buffer_idx < buffer_length) && (idx < 16); ++idx) { + int hi = (identifier[idx] >> 4) & 0x0F; + int lo = (identifier[idx]) & 0x0F; + + if (idx == 4 || idx == 6 || idx == 8 || idx == 10) + buffer[buffer_idx++] = '-'; + + buffer[buffer_idx++] = + static_cast((hi >= 10) ? ('A' + hi - 10) : ('0' + hi)); + buffer[buffer_idx++] = + static_cast((lo >= 10) ? ('A' + lo - 10) : ('0' + lo)); + } + + // NULL terminate + buffer[(buffer_idx < buffer_length) ? buffer_idx : buffer_idx - 1] = 0; +} + +} // namespace mach_o +} // namespace google_breakpad diff --git a/src/common/mac/file_id.h b/src/common/mac/file_id.h new file mode 100644 index 0000000..a14cd13 --- /dev/null +++ b/src/common/mac/file_id.h @@ -0,0 +1,91 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// file_id.h: Return a unique identifier for a file +// +// Author: Dan Waylonis + +#ifndef COMMON_MAC_FILE_ID_H__ +#define COMMON_MAC_FILE_ID_H__ + +#include +#include +#include + +namespace google_breakpad { +namespace mach_o { + +class FileID { + public: + // Constructs a FileID given a path to a file + FileID(const char* path); + + // Constructs a FileID given the contents of a file and its size. + FileID(void* memory, size_t size); + ~FileID() {} + + // Treat the file as a mach-o file that will contain one or more archicture. + // Accepted values for |cpu_type| and |cpu_subtype| (e.g., CPU_TYPE_X86 or + // CPU_TYPE_POWERPC) are listed in /usr/include/mach/machine.h. + // If |cpu_type| is 0, then the native cpu type is used. If |cpu_subtype| is + // CPU_SUBTYPE_MULTIPLE, the match is only done on |cpu_type|. + // Returns false if opening the file failed or if the |cpu_type|/|cpu_subtype| + // is not present in the file. + // Return the unique identifier in |identifier|. + // The current implementation will look for the (in order of priority): + // LC_UUID, LC_ID_DYLIB, or MD5 hash of the given |cpu_type|. + bool MachoIdentifier(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + unsigned char identifier[16]); + + // Convert the |identifier| data to a NULL terminated string. The string will + // be formatted as a UUID (e.g., 22F065BB-FC9C-49F7-80FE-26A7CEBD7BCE). + // The |buffer| should be at least 37 bytes long to receive all of the data + // and termination. Shorter buffers will contain truncated data. + static void ConvertIdentifierToString(const unsigned char identifier[16], + char *buffer, int buffer_length); + + private: + // Storage for the path specified + char path_[PATH_MAX]; + + // Storage for contents of a file if this instance is used to operate on in + // memory file data rather than directly from a filesystem. If memory_ is + // null, the file represented by path_ will be opened/read. If memory_ is + // non-null, it is assumed to contain valid data, and no file operations will + // occur. + void* memory_; + + // Size of memory_ + size_t size_; +}; + +} // namespace mach_o +} // namespace google_breakpad + +#endif // COMMON_MAC_FILE_ID_H__ diff --git a/src/common/mac/launch_reporter.cc b/src/common/mac/launch_reporter.cc new file mode 100644 index 0000000..f6b8aed --- /dev/null +++ b/src/common/mac/launch_reporter.cc @@ -0,0 +1,87 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +namespace google_breakpad { + +void LaunchReporter(const char *reporter_executable_path, + const char *config_file_path) { + const char* argv[] = { reporter_executable_path, config_file_path, NULL }; + + // Launch the reporter + pid_t pid = fork(); + + if (pid == -1) { + perror("fork"); + fprintf(stderr, "Failed to fork reporter process\n"); + return; + } + + // If we're in the child, load in our new executable and run. + // The parent will not wait for the child to complete. + if (pid == 0) { + execv(argv[0], (char* const*)argv); + perror("exec"); + fprintf(stderr, + "Failed to launch reporter process from path %s\n", + reporter_executable_path); + unlink(config_file_path); // launch failed - get rid of config file + _exit(1); + } + + // Wait until the Reporter child process exits. + // + + // We'll use a timeout of one minute. + int timeout_count = 60; // 60 seconds + + while (timeout_count-- > 0) { + int status; + pid_t result = waitpid(pid, &status, WNOHANG); + + if (result == 0) { + // The child has not yet finished. + sleep(1); + } else if (result == -1) { + // error occurred. + break; + } else { + // child has finished + break; + } + } +} + +} // namespace google_breakpad diff --git a/src/common/mac/launch_reporter.h b/src/common/mac/launch_reporter.h new file mode 100644 index 0000000..0cf7354 --- /dev/null +++ b/src/common/mac/launch_reporter.h @@ -0,0 +1,42 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_MAC_LAUNCH_REPORTER_H__ +#define COMMON_MAC_LAUNCH_REPORTER_H__ + +namespace google_breakpad { + +// Launch the crash dump sender app. +// |reporter_executable_path| is the path to the sender executable. +// |config_file_path| is the path to the config file. +void LaunchReporter(const char *reporter_executable_path, + const char *config_file_path); + +} // namespace google_breakpad + +#endif // COMMON_MAC_LAUNCH_REPORTER_H__ diff --git a/src/common/mac/macho_id.cc b/src/common/mac/macho_id.cc new file mode 100644 index 0000000..bb0058c --- /dev/null +++ b/src/common/mac/macho_id.cc @@ -0,0 +1,240 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_id.cc: Functions to gather identifying information from a macho file +// +// See macho_id.h for documentation +// +// Author: Dan Waylonis + + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include + +#include "common/mac/macho_id.h" +#include "common/mac/macho_walker.h" +#include "common/mac/macho_utilities.h" + +namespace MacFileUtilities { + +using google_breakpad::MD5Init; +using google_breakpad::MD5Update; +using google_breakpad::MD5Final; + +MachoID::MachoID(const char* path) + : memory_(0), memory_size_(0), md5_context_(), update_function_(NULL) { + snprintf(path_, sizeof(path_), "%s", path); +} + +MachoID::MachoID(void* memory, size_t size) + : path_(), + memory_(memory), + memory_size_(size), + md5_context_(), + update_function_(NULL) {} + +MachoID::~MachoID() {} + +void MachoID::UpdateMD5(unsigned char* bytes, size_t size) { + MD5Update(&md5_context_, bytes, static_cast(size)); +} + +void MachoID::Update(MachoWalker* walker, off_t offset, size_t size) { + if (!update_function_ || !size) + return; + + // Read up to 4k bytes at a time + unsigned char buffer[4096]; + size_t buffer_size; + off_t file_offset = offset; + while (size > 0) { + if (size > sizeof(buffer)) { + buffer_size = sizeof(buffer); + size -= buffer_size; + } else { + buffer_size = size; + size = 0; + } + + if (!walker->ReadBytes(buffer, buffer_size, file_offset)) + return; + + (this->*update_function_)(buffer, buffer_size); + file_offset += buffer_size; + } +} + +bool MachoID::UUIDCommand(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + unsigned char bytes[16]) { + struct breakpad_uuid_command uuid_cmd; + uuid_cmd.cmd = 0; + if (!WalkHeader(cpu_type, cpu_subtype, UUIDWalkerCB, &uuid_cmd)) + return false; + + // If we found the command, we'll have initialized the uuid_command + // structure + if (uuid_cmd.cmd == LC_UUID) { + memcpy(bytes, uuid_cmd.uuid, sizeof(uuid_cmd.uuid)); + return true; + } + + return false; +} + +bool MachoID::MD5(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype, unsigned char identifier[16]) { + update_function_ = &MachoID::UpdateMD5; + + MD5Init(&md5_context_); + + if (!WalkHeader(cpu_type, cpu_subtype, WalkerCB, this)) + return false; + + MD5Final(identifier, &md5_context_); + return true; +} + +bool MachoID::WalkHeader(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + MachoWalker::LoadCommandCallback callback, + void* context) { + if (memory_) { + MachoWalker walker(memory_, memory_size_, callback, context); + return walker.WalkHeader(cpu_type, cpu_subtype); + } else { + MachoWalker walker(path_, callback, context); + return walker.WalkHeader(cpu_type, cpu_subtype); + } +} + +// static +bool MachoID::WalkerCB(MachoWalker* walker, load_command* cmd, off_t offset, + bool swap, void* context) { + MachoID* macho_id = (MachoID*)context; + + if (cmd->cmd == LC_SEGMENT) { + struct segment_command seg; + + if (!walker->ReadBytes(&seg, sizeof(seg), offset)) + return false; + + if (swap) + breakpad_swap_segment_command(&seg); + + struct mach_header_64 header; + off_t header_offset; + + if (!walker->CurrentHeader(&header, &header_offset)) + return false; + + // Process segments that have sections: + // (e.g., __TEXT, __DATA, __IMPORT, __OBJC) + offset += sizeof(struct segment_command); + struct section sec; + for (unsigned long i = 0; i < seg.nsects; ++i) { + if (!walker->ReadBytes(&sec, sizeof(sec), offset)) + return false; + + if (swap) + breakpad_swap_section(&sec, 1); + + // sections of type S_ZEROFILL are "virtual" and contain no data + // in the file itself + if ((sec.flags & SECTION_TYPE) != S_ZEROFILL && sec.offset != 0) + macho_id->Update(walker, header_offset + sec.offset, sec.size); + + offset += sizeof(struct section); + } + } else if (cmd->cmd == LC_SEGMENT_64) { + struct segment_command_64 seg64; + + if (!walker->ReadBytes(&seg64, sizeof(seg64), offset)) + return false; + + if (swap) + breakpad_swap_segment_command_64(&seg64); + + struct mach_header_64 header; + off_t header_offset; + + if (!walker->CurrentHeader(&header, &header_offset)) + return false; + + // Process segments that have sections: + // (e.g., __TEXT, __DATA, __IMPORT, __OBJC) + offset += sizeof(struct segment_command_64); + struct section_64 sec64; + for (unsigned long i = 0; i < seg64.nsects; ++i) { + if (!walker->ReadBytes(&sec64, sizeof(sec64), offset)) + return false; + + if (swap) + breakpad_swap_section_64(&sec64, 1); + + // sections of type S_ZEROFILL are "virtual" and contain no data + // in the file itself + if ((sec64.flags & SECTION_TYPE) != S_ZEROFILL && sec64.offset != 0) + macho_id->Update(walker, + header_offset + sec64.offset, + (size_t)sec64.size); + + offset += sizeof(struct section_64); + } + } + + // Continue processing + return true; +} + +// static +bool MachoID::UUIDWalkerCB(MachoWalker* walker, load_command* cmd, off_t offset, + bool swap, void* context) { + if (cmd->cmd == LC_UUID) { + struct breakpad_uuid_command* uuid_cmd = + (struct breakpad_uuid_command*)context; + + if (!walker->ReadBytes(uuid_cmd, sizeof(struct breakpad_uuid_command), + offset)) + return false; + + if (swap) + breakpad_swap_uuid_command(uuid_cmd); + + return false; + } + + // Continue processing + return true; +} +} // namespace MacFileUtilities diff --git a/src/common/mac/macho_id.h b/src/common/mac/macho_id.h new file mode 100644 index 0000000..b9cbdb0 --- /dev/null +++ b/src/common/mac/macho_id.h @@ -0,0 +1,106 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_id.h: Functions to gather identifying information from a macho file +// +// Author: Dan Waylonis + +#ifndef COMMON_MAC_MACHO_ID_H__ +#define COMMON_MAC_MACHO_ID_H__ + +#include +#include +#include + +#include "common/mac/macho_walker.h" +#include "common/md5.h" + +namespace MacFileUtilities { + +class MachoID { + public: + MachoID(const char* path); + MachoID(void* memory, size_t size); + ~MachoID(); + + // For the given |cpu_type| and |cpu_subtype|, return a UUID from the LC_UUID + // command. + // Return false if there isn't a LC_UUID command. + bool UUIDCommand(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + unsigned char identifier[16]); + + // For the given |cpu_type|, and |cpu_subtype| return the MD5 for the mach-o + // data segment(s). + // Return true on success, false otherwise + bool MD5(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + unsigned char identifier[16]); + + private: + // Signature of class member function to be called with data read from file + typedef void (MachoID::*UpdateFunction)(unsigned char* bytes, size_t size); + + // Update the MD5 value by examining |size| |bytes| and applying the algorithm + // to each byte. + void UpdateMD5(unsigned char* bytes, size_t size); + + // Bottleneck for update routines + void Update(MachoWalker* walker, off_t offset, size_t size); + + // Factory for the MachoWalker + bool WalkHeader(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype, + MachoWalker::LoadCommandCallback callback, void* context); + + // The callback from the MachoWalker for CRC and MD5 + static bool WalkerCB(MachoWalker* walker, load_command* cmd, off_t offset, + bool swap, void* context); + + // The callback from the MachoWalker for LC_UUID + static bool UUIDWalkerCB(MachoWalker* walker, load_command* cmd, off_t offset, + bool swap, void* context); + + // File path + char path_[PATH_MAX]; + + // Memory region to read from + void* memory_; + + // Size of the memory region + size_t memory_size_; + + // The MD5 context + google_breakpad::MD5Context md5_context_; + + // The current update to call from the Update callback + UpdateFunction update_function_; +}; + +} // namespace MacFileUtilities + +#endif // COMMON_MAC_MACHO_ID_H__ diff --git a/src/common/mac/macho_reader.cc b/src/common/mac/macho_reader.cc new file mode 100644 index 0000000..0324be1 --- /dev/null +++ b/src/common/mac/macho_reader.cc @@ -0,0 +1,570 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// macho_reader.cc: Implementation of google_breakpad::Mach_O::FatReader and +// google_breakpad::Mach_O::Reader. See macho_reader.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/mac/macho_reader.h" + +#include +#include +#include + +#include + +// Unfortunately, CPU_TYPE_ARM is not define for 10.4. +#if !defined(CPU_TYPE_ARM) +#define CPU_TYPE_ARM 12 +#endif + +#if !defined(CPU_TYPE_ARM_64) +#define CPU_TYPE_ARM_64 16777228 +#endif + +namespace google_breakpad { +namespace mach_o { + +// If NDEBUG is #defined, then the 'assert' macro doesn't evaluate its +// arguments, so you can't place expressions that do necessary work in +// the argument of an assert. Nor can you assign the result of the +// expression to a variable and assert that the variable's value is +// true: you'll get unused variable warnings when NDEBUG is #defined. +// +// ASSERT_ALWAYS_EVAL always evaluates its argument, and asserts that +// the result is true if NDEBUG is not #defined. +#if defined(NDEBUG) +#define ASSERT_ALWAYS_EVAL(x) (x) +#else +#define ASSERT_ALWAYS_EVAL(x) assert(x) +#endif + +void FatReader::Reporter::BadHeader() { + fprintf(stderr, "%s: file is neither a fat binary file" + " nor a Mach-O object file\n", filename_.c_str()); +} + +void FatReader::Reporter::TooShort() { + fprintf(stderr, "%s: file too short for the data it claims to contain\n", + filename_.c_str()); +} + +void FatReader::Reporter::MisplacedObjectFile() { + fprintf(stderr, "%s: file too short for the object files it claims" + " to contain\n", filename_.c_str()); +} + +bool FatReader::Read(const uint8_t* buffer, size_t size) { + buffer_.start = buffer; + buffer_.end = buffer + size; + ByteCursor cursor(&buffer_); + + // Fat binaries always use big-endian, so read the magic number in + // that endianness. To recognize Mach-O magic numbers, which can use + // either endianness, check for both the proper and reversed forms + // of the magic numbers. + cursor.set_big_endian(true); + if (cursor >> magic_) { + if (magic_ == FAT_MAGIC) { + // How many object files does this fat binary contain? + uint32_t object_files_count; + if (!(cursor >> object_files_count)) { // nfat_arch + reporter_->TooShort(); + return false; + } + + // Read the list of object files. + object_files_.resize(object_files_count); + for (size_t i = 0; i < object_files_count; i++) { + struct fat_arch objfile; + + // Read this object file entry, byte-swapping as appropriate. + cursor >> objfile.cputype + >> objfile.cpusubtype + >> objfile.offset + >> objfile.size + >> objfile.align; + + SuperFatArch super_fat_arch(objfile); + object_files_[i] = super_fat_arch; + + if (!cursor) { + reporter_->TooShort(); + return false; + } + // Does the file actually have the bytes this entry refers to? + size_t fat_size = buffer_.Size(); + if (objfile.offset > fat_size || + objfile.size > fat_size - objfile.offset) { + reporter_->MisplacedObjectFile(); + return false; + } + } + + return true; + } else if (magic_ == MH_MAGIC || magic_ == MH_MAGIC_64 || + magic_ == MH_CIGAM || magic_ == MH_CIGAM_64) { + // If this is a little-endian Mach-O file, fix the cursor's endianness. + if (magic_ == MH_CIGAM || magic_ == MH_CIGAM_64) + cursor.set_big_endian(false); + // Record the entire file as a single entry in the object file list. + object_files_.resize(1); + + // Get the cpu type and subtype from the Mach-O header. + if (!(cursor >> object_files_[0].cputype + >> object_files_[0].cpusubtype)) { + reporter_->TooShort(); + return false; + } + + object_files_[0].offset = 0; + object_files_[0].size = static_cast(buffer_.Size()); + // This alignment is correct for 32 and 64-bit x86 and ppc. + // See get_align in the lipo source for other architectures: + // http://www.opensource.apple.com/source/cctools/cctools-773/misc/lipo.c + object_files_[0].align = 12; // 2^12 == 4096 + return true; + } + } + reporter_->BadHeader(); + return false; +} + +void Reader::Reporter::BadHeader() { + fprintf(stderr, "%s: file is not a Mach-O object file\n", filename_.c_str()); +} + +void Reader::Reporter::CPUTypeMismatch(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + cpu_type_t expected_cpu_type, + cpu_subtype_t expected_cpu_subtype) { + fprintf(stderr, "%s: CPU type %d, subtype %d does not match expected" + " type %d, subtype %d\n", + filename_.c_str(), cpu_type, cpu_subtype, + expected_cpu_type, expected_cpu_subtype); +} + +void Reader::Reporter::HeaderTruncated() { + fprintf(stderr, "%s: file does not contain a complete Mach-O header\n", + filename_.c_str()); +} + +void Reader::Reporter::LoadCommandRegionTruncated() { + fprintf(stderr, "%s: file too short to hold load command region" + " given in Mach-O header\n", filename_.c_str()); +} + +void Reader::Reporter::LoadCommandsOverrun(size_t claimed, size_t i, + LoadCommandType type) { + fprintf(stderr, "%s: file's header claims there are %zu" + " load commands, but load command #%zu", + filename_.c_str(), claimed, i); + if (type) fprintf(stderr, ", of type %d,", type); + fprintf(stderr, " extends beyond the end of the load command region\n"); +} + +void Reader::Reporter::LoadCommandTooShort(size_t i, LoadCommandType type) { + fprintf(stderr, "%s: the contents of load command #%zu, of type %d," + " extend beyond the size given in the load command's header\n", + filename_.c_str(), i, type); +} + +void Reader::Reporter::SectionsMissing(const string& name) { + fprintf(stderr, "%s: the load command for segment '%s'" + " is too short to hold the section headers it claims to have\n", + filename_.c_str(), name.c_str()); +} + +void Reader::Reporter::MisplacedSegmentData(const string& name) { + fprintf(stderr, "%s: the segment '%s' claims its contents lie beyond" + " the end of the file\n", filename_.c_str(), name.c_str()); +} + +void Reader::Reporter::MisplacedSectionData(const string& section, + const string& segment) { + fprintf(stderr, "%s: the section '%s' in segment '%s'" + " claims its contents lie outside the segment's contents\n", + filename_.c_str(), section.c_str(), segment.c_str()); +} + +void Reader::Reporter::MisplacedSymbolTable() { + fprintf(stderr, "%s: the LC_SYMTAB load command claims that the symbol" + " table's contents are located beyond the end of the file\n", + filename_.c_str()); +} + +void Reader::Reporter::UnsupportedCPUType(cpu_type_t cpu_type) { + fprintf(stderr, "%s: CPU type %d is not supported\n", + filename_.c_str(), cpu_type); +} + +bool Reader::Read(const uint8_t* buffer, + size_t size, + cpu_type_t expected_cpu_type, + cpu_subtype_t expected_cpu_subtype) { + assert(!buffer_.start); + buffer_.start = buffer; + buffer_.end = buffer + size; + ByteCursor cursor(&buffer_, true); + uint32_t magic; + if (!(cursor >> magic)) { + reporter_->HeaderTruncated(); + return false; + } + + if (expected_cpu_type != CPU_TYPE_ANY) { + uint32_t expected_magic; + // validate that magic matches the expected cpu type + switch (expected_cpu_type) { + case CPU_TYPE_ARM: + case CPU_TYPE_I386: + expected_magic = MH_CIGAM; + break; + case CPU_TYPE_POWERPC: + expected_magic = MH_MAGIC; + break; + case CPU_TYPE_ARM_64: + case CPU_TYPE_X86_64: + expected_magic = MH_CIGAM_64; + break; + case CPU_TYPE_POWERPC64: + expected_magic = MH_MAGIC_64; + break; + default: + reporter_->UnsupportedCPUType(expected_cpu_type); + return false; + } + + if (expected_magic != magic) { + reporter_->BadHeader(); + return false; + } + } + + // Since the byte cursor is in big-endian mode, a reversed magic number + // always indicates a little-endian file, regardless of our own endianness. + switch (magic) { + case MH_MAGIC: big_endian_ = true; bits_64_ = false; break; + case MH_CIGAM: big_endian_ = false; bits_64_ = false; break; + case MH_MAGIC_64: big_endian_ = true; bits_64_ = true; break; + case MH_CIGAM_64: big_endian_ = false; bits_64_ = true; break; + default: + reporter_->BadHeader(); + return false; + } + cursor.set_big_endian(big_endian_); + uint32_t commands_size, reserved; + cursor >> cpu_type_ >> cpu_subtype_ >> file_type_ >> load_command_count_ + >> commands_size >> flags_; + if (bits_64_) + cursor >> reserved; + if (!cursor) { + reporter_->HeaderTruncated(); + return false; + } + + if (expected_cpu_type != CPU_TYPE_ANY && + (expected_cpu_type != cpu_type_ || + expected_cpu_subtype != cpu_subtype_)) { + reporter_->CPUTypeMismatch(cpu_type_, cpu_subtype_, + expected_cpu_type, expected_cpu_subtype); + return false; + } + + cursor + .PointTo(&load_commands_.start, commands_size) + .PointTo(&load_commands_.end, 0); + if (!cursor) { + reporter_->LoadCommandRegionTruncated(); + return false; + } + + return true; +} + +bool Reader::WalkLoadCommands(Reader::LoadCommandHandler* handler) const { + ByteCursor list_cursor(&load_commands_, big_endian_); + + for (size_t index = 0; index < load_command_count_; ++index) { + // command refers to this load command alone, so that cursor will + // refuse to read past the load command's end. But since we haven't + // read the size yet, let command initially refer to the entire + // remainder of the load command series. + ByteBuffer command(list_cursor.here(), list_cursor.Available()); + ByteCursor cursor(&command, big_endian_); + + // Read the command type and size --- fields common to all commands. + uint32_t type, size; + if (!(cursor >> type)) { + reporter_->LoadCommandsOverrun(load_command_count_, index, 0); + return false; + } + if (!(cursor >> size) || size > command.Size()) { + reporter_->LoadCommandsOverrun(load_command_count_, index, type); + return false; + } + + // Now that we've read the length, restrict command's range to this + // load command only. + command.end = command.start + size; + + switch (type) { + case LC_SEGMENT: + case LC_SEGMENT_64: { + Segment segment; + segment.bits_64 = (type == LC_SEGMENT_64); + size_t word_size = segment.bits_64 ? 8 : 4; + cursor.CString(&segment.name, 16); + cursor + .Read(word_size, false, &segment.vmaddr) + .Read(word_size, false, &segment.vmsize) + .Read(word_size, false, &segment.fileoff) + .Read(word_size, false, &segment.filesize); + cursor >> segment.maxprot + >> segment.initprot + >> segment.nsects + >> segment.flags; + if (!cursor) { + reporter_->LoadCommandTooShort(index, type); + return false; + } + if (segment.fileoff > buffer_.Size() || + segment.filesize > buffer_.Size() - segment.fileoff) { + reporter_->MisplacedSegmentData(segment.name); + return false; + } + // Mach-O files in .dSYM bundles have the contents of the loaded + // segments removed, and their file offsets and file sizes zeroed + // out. To help us handle this special case properly, give such + // segments' contents NULL starting and ending pointers. + if (segment.fileoff == 0 && segment.filesize == 0) { + segment.contents.start = segment.contents.end = NULL; + } else { + segment.contents.start = buffer_.start + segment.fileoff; + segment.contents.end = segment.contents.start + segment.filesize; + } + // The section list occupies the remainder of this load command's space. + segment.section_list.start = cursor.here(); + segment.section_list.end = command.end; + + if (!handler->SegmentCommand(segment)) + return false; + break; + } + + case LC_SYMTAB: { + uint32_t symoff, nsyms, stroff, strsize; + cursor >> symoff >> nsyms >> stroff >> strsize; + if (!cursor) { + reporter_->LoadCommandTooShort(index, type); + return false; + } + // How big are the entries in the symbol table? + // sizeof(struct nlist_64) : sizeof(struct nlist), + // but be paranoid about alignment vs. target architecture. + size_t symbol_size = bits_64_ ? 16 : 12; + // How big is the entire symbol array? + size_t symbols_size = nsyms * symbol_size; + if (symoff > buffer_.Size() || symbols_size > buffer_.Size() - symoff || + stroff > buffer_.Size() || strsize > buffer_.Size() - stroff) { + reporter_->MisplacedSymbolTable(); + return false; + } + ByteBuffer entries(buffer_.start + symoff, symbols_size); + ByteBuffer names(buffer_.start + stroff, strsize); + if (!handler->SymtabCommand(entries, names)) + return false; + break; + } + + default: { + if (!handler->UnknownCommand(type, command)) + return false; + break; + } + } + + list_cursor.set_here(command.end); + } + + return true; +} + +// A load command handler that looks for a segment of a given name. +class Reader::SegmentFinder : public LoadCommandHandler { + public: + // Create a load command handler that looks for a segment named NAME, + // and sets SEGMENT to describe it if found. + SegmentFinder(const string& name, Segment* segment) + : name_(name), segment_(segment), found_() { } + + // Return true if the traversal found the segment, false otherwise. + bool found() const { return found_; } + + bool SegmentCommand(const Segment& segment) { + if (segment.name == name_) { + *segment_ = segment; + found_ = true; + return false; + } + return true; + } + + private: + // The name of the segment our creator is looking for. + const string& name_; + + // Where we should store the segment if found. (WEAK) + Segment* segment_; + + // True if we found the segment. + bool found_; +}; + +bool Reader::FindSegment(const string& name, Segment* segment) const { + SegmentFinder finder(name, segment); + WalkLoadCommands(&finder); + return finder.found(); +} + +bool Reader::WalkSegmentSections(const Segment& segment, + SectionHandler* handler) const { + size_t word_size = segment.bits_64 ? 8 : 4; + ByteCursor cursor(&segment.section_list, big_endian_); + + for (size_t i = 0; i < segment.nsects; i++) { + Section section; + section.bits_64 = segment.bits_64; + uint64_t size, offset; + uint32_t dummy32; + cursor + .CString(§ion.section_name, 16) + .CString(§ion.segment_name, 16) + .Read(word_size, false, §ion.address) + .Read(word_size, false, &size) + .Read(sizeof(uint32_t), false, &offset) // clears high bits of |offset| + >> section.align + >> dummy32 + >> dummy32 + >> section.flags + >> dummy32 + >> dummy32; + if (section.bits_64) + cursor >> dummy32; + if (!cursor) { + reporter_->SectionsMissing(segment.name); + return false; + } + + // Even 64-bit Mach-O isn’t a true 64-bit format in that it doesn’t handle + // 64-bit file offsets gracefully. Segment load commands do contain 64-bit + // file offsets, but sections within do not. Because segments load + // contiguously, recompute each section’s file offset on the basis of its + // containing segment’s file offset and the difference between the section’s + // and segment’s load addresses. If truncation is detected, honor the + // recomputed offset. + if (segment.bits_64 && + segment.fileoff + segment.filesize > + std::numeric_limits::max()) { + const uint64_t section_offset_recomputed = + segment.fileoff + section.address - segment.vmaddr; + if (offset == static_cast(section_offset_recomputed)) { + offset = section_offset_recomputed; + } + } + + const uint32_t section_type = section.flags & SECTION_TYPE; + if (section_type == S_ZEROFILL || section_type == S_THREAD_LOCAL_ZEROFILL || + section_type == S_GB_ZEROFILL) { + // Zero-fill sections have a size, but no contents. + section.contents.start = section.contents.end = NULL; + } else if (segment.contents.start == NULL && + segment.contents.end == NULL) { + // Mach-O files in .dSYM bundles have the contents of the loaded + // segments removed, and their file offsets and file sizes zeroed + // out. However, the sections within those segments still have + // non-zero sizes. There's no reason to call MisplacedSectionData in + // this case; the caller may just need the section's load + // address. But do set the contents' limits to NULL, for safety. + section.contents.start = section.contents.end = NULL; + } else { + if (offset < size_t(segment.contents.start - buffer_.start) || + offset > size_t(segment.contents.end - buffer_.start) || + size > size_t(segment.contents.end - buffer_.start - offset)) { + if (offset > 0) { + reporter_->MisplacedSectionData(section.section_name, + section.segment_name); + return false; + } else { + // Mach-O files in .dSYM bundles have the contents of the loaded + // segments partially removed. The removed sections will have zero as + // their offset. MisplacedSectionData should not be called in this + // case. + section.contents.start = section.contents.end = NULL; + } + } else { + section.contents.start = buffer_.start + offset; + section.contents.end = section.contents.start + size; + } + } + if (!handler->HandleSection(section)) + return false; + } + return true; +} + +// A SectionHandler that builds a SectionMap for the sections within a +// given segment. +class Reader::SectionMapper: public SectionHandler { + public: + // Create a SectionHandler that populates MAP with an entry for + // each section it is given. + SectionMapper(SectionMap* map) : map_(map) { } + bool HandleSection(const Section& section) { + (*map_)[section.section_name] = section; + return true; + } + private: + // The map under construction. (WEAK) + SectionMap* map_; +}; + +bool Reader::MapSegmentSections(const Segment& segment, + SectionMap* section_map) const { + section_map->clear(); + SectionMapper mapper(section_map); + return WalkSegmentSections(segment, &mapper); +} + +} // namespace mach_o +} // namespace google_breakpad diff --git a/src/common/mac/macho_reader.h b/src/common/mac/macho_reader.h new file mode 100644 index 0000000..d3c61a0 --- /dev/null +++ b/src/common/mac/macho_reader.h @@ -0,0 +1,463 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// macho_reader.h: A class for parsing Mach-O files. + +#ifndef BREAKPAD_COMMON_MAC_MACHO_READER_H_ +#define BREAKPAD_COMMON_MAC_MACHO_READER_H_ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "common/byte_cursor.h" +#include "common/mac/super_fat_arch.h" + +namespace google_breakpad { +namespace mach_o { + +using std::map; +using std::string; +using std::vector; + +// The Mac headers don't specify particular types for these groups of +// constants, but defining them here provides some documentation +// value. We also give them the same width as the fields in which +// they appear, which makes them a bit easier to use with ByteCursors. +typedef uint32_t Magic; +typedef uint32_t FileType; +typedef uint32_t FileFlags; +typedef uint32_t LoadCommandType; +typedef uint32_t SegmentFlags; +typedef uint32_t SectionFlags; + +// A parser for fat binary files, used to store universal binaries. +// When applied to a (non-fat) Mach-O file, this behaves as if the +// file were a fat file containing a single object file. +class FatReader { + public: + + // A class for reporting errors found while parsing fat binary files. The + // default definitions of these methods print messages to stderr. + class Reporter { + public: + // Create a reporter that attributes problems to |filename|. + explicit Reporter(const string& filename) : filename_(filename) { } + + virtual ~Reporter() { } + + // The data does not begin with a fat binary or Mach-O magic number. + // This is a fatal error. + virtual void BadHeader(); + + // The Mach-O fat binary file ends abruptly, without enough space + // to contain an object file it claims is present. + virtual void MisplacedObjectFile(); + + // The file ends abruptly: either it is not large enough to hold a + // complete header, or the header implies that contents are present + // beyond the actual end of the file. + virtual void TooShort(); + + private: + // The filename to which the reader should attribute problems. + string filename_; + }; + + // Create a fat binary file reader that uses |reporter| to report problems. + explicit FatReader(Reporter* reporter) : reporter_(reporter) { } + + // Read the |size| bytes at |buffer| as a fat binary file. On success, + // return true; on failure, report the problem to reporter_ and return + // false. + // + // If the data is a plain Mach-O file, rather than a fat binary file, + // then the reader behaves as if it had found a fat binary file whose + // single object file is the Mach-O file. + bool Read(const uint8_t* buffer, size_t size); + + // Return an array of 'SuperFatArch' structures describing the + // object files present in this fat binary file. Set |size| to the + // number of elements in the array. + // + // Assuming Read returned true, the entries are validated: it is safe to + // assume that the offsets and sizes in each SuperFatArch refer to subranges + // of the bytes passed to Read. + // + // If there are no object files in this fat binary, then this + // function can return NULL. + // + // The array is owned by this FatReader instance; it will be freed when + // this FatReader is destroyed. + // + // This function returns a C-style array instead of a vector to make it + // possible to use the result with OS X functions like NXFindBestFatArch, + // so that the symbol dumper will behave consistently with other OS X + // utilities that work with fat binaries. + const SuperFatArch* object_files(size_t* count) const { + *count = object_files_.size(); + if (object_files_.size() > 0) + return &object_files_[0]; + return NULL; + } + + private: + // We use this to report problems parsing the file's contents. (WEAK) + Reporter* reporter_; + + // The contents of the fat binary or Mach-O file we're parsing. We do not + // own the storage it refers to. + ByteBuffer buffer_; + + // The magic number of this binary, in host byte order. + Magic magic_; + + // The list of object files in this binary. + // object_files_.size() == fat_header.nfat_arch + vector object_files_; +}; + +// A segment in a Mach-O file. All these fields have been byte-swapped as +// appropriate for use by the executing architecture. +struct Segment { + // The ByteBuffers below point into the bytes passed to the Reader that + // created this Segment. + + ByteBuffer section_list; // This segment's section list. + ByteBuffer contents; // This segment's contents. + + // This segment's name. + string name; + + // The address at which this segment should be loaded in memory. If + // bits_64 is false, only the bottom 32 bits of this value are valid. + uint64_t vmaddr; + + // The size of this segment when loaded into memory. This may be larger + // than contents.Size(), in which case the extra area will be + // initialized with zeros. If bits_64 is false, only the bottom 32 bits + // of this value are valid. + uint64_t vmsize; + + // The file offset and size of the segment in the Mach-O image. + uint64_t fileoff; + uint64_t filesize; + + // The maximum and initial VM protection of this segment's contents. + uint32_t maxprot; + uint32_t initprot; + + // The number of sections in section_list. + uint32_t nsects; + + // Flags describing this segment, from SegmentFlags. + uint32_t flags; + + // True if this is a 64-bit section; false if it is a 32-bit section. + bool bits_64; +}; + +// A section in a Mach-O file. All these fields have been byte-swapped as +// appropriate for use by the executing architecture. +struct Section { + // This section's contents. This points into the bytes passed to the + // Reader that created this Section. + ByteBuffer contents; + + // This section's name. + string section_name; // section[_64].sectname + // The name of the segment this section belongs to. + string segment_name; // section[_64].segname + + // The address at which this section's contents should be loaded in + // memory. If bits_64 is false, only the bottom 32 bits of this value + // are valid. + uint64_t address; + + // The contents of this section should be loaded into memory at an + // address which is a multiple of (two raised to this power). + uint32_t align; + + // Flags from SectionFlags describing the section's contents. + uint32_t flags; + + // We don't support reading relocations yet. + + // True if this is a 64-bit section; false if it is a 32-bit section. + bool bits_64; +}; + +// A map from section names to Sections. +typedef map SectionMap; + +// A reader for a Mach-O file. +// +// This does not handle fat binaries; see FatReader above. FatReader +// provides a friendly interface for parsing data that could be either a +// fat binary or a Mach-O file. +class Reader { + public: + + // A class for reporting errors found while parsing Mach-O files. The + // default definitions of these member functions print messages to + // stderr. + class Reporter { + public: + // Create a reporter that attributes problems to |filename|. + explicit Reporter(const string& filename) : filename_(filename) { } + virtual ~Reporter() { } + + // Reporter functions for fatal errors return void; the reader will + // definitely return an error to its caller after calling them + + // The data does not begin with a Mach-O magic number, or the magic + // number does not match the expected value for the cpu architecture. + // This is a fatal error. + virtual void BadHeader(); + + // The data contained in a Mach-O fat binary (|cpu_type|, |cpu_subtype|) + // does not match the expected CPU architecture + // (|expected_cpu_type|, |expected_cpu_subtype|). + virtual void CPUTypeMismatch(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + cpu_type_t expected_cpu_type, + cpu_subtype_t expected_cpu_subtype); + + // The file ends abruptly: either it is not large enough to hold a + // complete header, or the header implies that contents are present + // beyond the actual end of the file. + virtual void HeaderTruncated(); + + // The file's load command region, as given in the Mach-O header, is + // too large for the file. + virtual void LoadCommandRegionTruncated(); + + // The file's Mach-O header claims the file contains |claimed| load + // commands, but the I'th load command, of type |type|, extends beyond + // the end of the load command region, as given by the Mach-O header. + // If |type| is zero, the command's type was unreadable. + virtual void LoadCommandsOverrun(size_t claimed, size_t i, + LoadCommandType type); + + // The contents of the |i|'th load command, of type |type|, extend beyond + // the size given in the load command's header. + virtual void LoadCommandTooShort(size_t i, LoadCommandType type); + + // The LC_SEGMENT or LC_SEGMENT_64 load command for the segment named + // |name| is too short to hold the sections that its header says it does. + // (This more specific than LoadCommandTooShort.) + virtual void SectionsMissing(const string& name); + + // The segment named |name| claims that its contents lie beyond the end + // of the file. + virtual void MisplacedSegmentData(const string& name); + + // The section named |section| in the segment named |segment| claims that + // its contents do not lie entirely within the segment. + virtual void MisplacedSectionData(const string& section, + const string& segment); + + // The LC_SYMTAB command claims that symbol table contents are located + // beyond the end of the file. + virtual void MisplacedSymbolTable(); + + // An attempt was made to read a Mach-O file of the unsupported + // CPU architecture |cpu_type|. + virtual void UnsupportedCPUType(cpu_type_t cpu_type); + + private: + string filename_; + }; + + // A handler for sections parsed from a segment. The WalkSegmentSections + // member function accepts an instance of this class, and applies it to + // each section defined in a given segment. + class SectionHandler { + public: + virtual ~SectionHandler() { } + + // Called to report that the segment's section list contains |section|. + // This should return true if the iteration should continue, or false + // if it should stop. + virtual bool HandleSection(const Section& section) = 0; + }; + + // A handler for the load commands in a Mach-O file. + class LoadCommandHandler { + public: + LoadCommandHandler() { } + virtual ~LoadCommandHandler() { } + + // When called from WalkLoadCommands, the following handler functions + // should return true if they wish to continue iterating over the load + // command list, or false if they wish to stop iterating. + // + // When called from LoadCommandIterator::Handle or Reader::Handle, + // these functions' return values are simply passed through to Handle's + // caller. + // + // The definitions provided by this base class simply return true; the + // default is to silently ignore sections whose member functions the + // subclass doesn't override. + + // COMMAND is load command we don't recognize. We provide only the + // command type and a ByteBuffer enclosing the command's data (If we + // cannot parse the command type or its size, we call + // reporter_->IncompleteLoadCommand instead.) + virtual bool UnknownCommand(LoadCommandType type, + const ByteBuffer& contents) { + return true; + } + + // The load command is LC_SEGMENT or LC_SEGMENT_64, defining a segment + // with the properties given in |segment|. + virtual bool SegmentCommand(const Segment& segment) { + return true; + } + + // The load command is LC_SYMTAB. |entries| holds the array of nlist + // entries, and |names| holds the strings the entries refer to. + virtual bool SymtabCommand(const ByteBuffer& entries, + const ByteBuffer& names) { + return true; + } + + // Add handler functions for more load commands here as needed. + }; + + // Create a Mach-O file reader that reports problems to |reporter|. + explicit Reader(Reporter* reporter) + : reporter_(reporter) { } + + // Read the given data as a Mach-O file. The reader retains pointers + // into the data passed, so the data should live as long as the reader + // does. On success, return true; on failure, return false. + // + // At most one of these functions should be invoked once on each Reader + // instance. + bool Read(const uint8_t* buffer, + size_t size, + cpu_type_t expected_cpu_type, + cpu_subtype_t expected_cpu_subtype); + bool Read(const ByteBuffer& buffer, + cpu_type_t expected_cpu_type, + cpu_subtype_t expected_cpu_subtype) { + return Read(buffer.start, + buffer.Size(), + expected_cpu_type, + expected_cpu_subtype); + } + + // Return this file's characteristics, as found in the Mach-O header. + cpu_type_t cpu_type() const { return cpu_type_; } + cpu_subtype_t cpu_subtype() const { return cpu_subtype_; } + FileType file_type() const { return file_type_; } + FileFlags flags() const { return flags_; } + + // Return true if this is a 64-bit Mach-O file, false if it is a 32-bit + // Mach-O file. + bool bits_64() const { return bits_64_; } + + // Return true if this is a big-endian Mach-O file, false if it is + // little-endian. + bool big_endian() const { return big_endian_; } + + // Apply |handler| to each load command in this Mach-O file, stopping when + // a handler function returns false. If we encounter a malformed load + // command, report it via reporter_ and return false. Return true if all + // load commands were parseable and all handlers returned true. + bool WalkLoadCommands(LoadCommandHandler* handler) const; + + // Set |segment| to describe the segment named |name|, if present. If + // found, |segment|'s byte buffers refer to a subregion of the bytes + // passed to Read. If we find the section, return true; otherwise, + // return false. + bool FindSegment(const string& name, Segment* segment) const; + + // Apply |handler| to each section defined in |segment|. If |handler| returns + // false, stop iterating and return false. If all calls to |handler| return + // true and we reach the end of the section list, return true. + bool WalkSegmentSections(const Segment& segment, SectionHandler* handler) + const; + + // Clear |section_map| and then populate it with a map of the sections + // in |segment|, from section names to Section structures. + // Each Section's contents refer to bytes in |segment|'s contents. + // On success, return true; if a problem occurs, report it and return false. + bool MapSegmentSections(const Segment& segment, SectionMap* section_map) + const; + + private: + // Used internally. + class SegmentFinder; + class SectionMapper; + + // We use this to report problems parsing the file's contents. (WEAK) + Reporter* reporter_; + + // The contents of the Mach-O file we're parsing. We do not own the + // storage it refers to. + ByteBuffer buffer_; + + // True if this file is big-endian. + bool big_endian_; + + // True if this file is a 64-bit Mach-O file. + bool bits_64_; + + // This file's cpu type and subtype. + cpu_type_t cpu_type_; // mach_header[_64].cputype + cpu_subtype_t cpu_subtype_; // mach_header[_64].cpusubtype + + // This file's type. + FileType file_type_; // mach_header[_64].filetype + + // The region of buffer_ occupied by load commands. + ByteBuffer load_commands_; + + // The number of load commands in load_commands_. + uint32_t load_command_count_; // mach_header[_64].ncmds + + // This file's header flags. + FileFlags flags_; +}; + +} // namespace mach_o +} // namespace google_breakpad + +#endif // BREAKPAD_COMMON_MAC_MACHO_READER_H_ diff --git a/src/common/mac/macho_reader_unittest.cc b/src/common/mac/macho_reader_unittest.cc new file mode 100644 index 0000000..4b5ac6c --- /dev/null +++ b/src/common/mac/macho_reader_unittest.cc @@ -0,0 +1,1950 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// macho_reader_unittest.cc: Unit tests for google_breakpad::Mach_O::FatReader +// and google_breakpad::Mach_O::Reader. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/mac/macho_reader.h" +#include "common/test_assembler.h" + +namespace mach_o = google_breakpad::mach_o; +namespace test_assembler = google_breakpad::test_assembler; + +using mach_o::FatReader; +using mach_o::FileFlags; +using mach_o::FileType; +using mach_o::LoadCommandType; +using mach_o::Reader; +using mach_o::Section; +using mach_o::SectionMap; +using mach_o::Segment; +using test_assembler::Endianness; +using test_assembler::Label; +using test_assembler::kBigEndian; +using test_assembler::kLittleEndian; +using test_assembler::kUnsetEndian; +using google_breakpad::ByteBuffer; +using std::map; +using std::string; +using std::vector; +using testing::AllOf; +using testing::DoAll; +using testing::Field; +using testing::InSequence; +using testing::Matcher; +using testing::Return; +using testing::SaveArg; +using testing::Test; +using testing::_; + + +// Mock classes for the reader's various reporters and handlers. + +class MockFatReaderReporter: public FatReader::Reporter { + public: + MockFatReaderReporter(const string& filename) + : FatReader::Reporter(filename) { } + MOCK_METHOD0(BadHeader, void()); + MOCK_METHOD0(MisplacedObjectFile, void()); + MOCK_METHOD0(TooShort, void()); +}; + +class MockReaderReporter: public Reader::Reporter { + public: + MockReaderReporter(const string& filename) : Reader::Reporter(filename) { } + MOCK_METHOD0(BadHeader, void()); + MOCK_METHOD4(CPUTypeMismatch, void(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + cpu_type_t expected_cpu_type, + cpu_subtype_t expected_cpu_subtype)); + MOCK_METHOD0(HeaderTruncated, void()); + MOCK_METHOD0(LoadCommandRegionTruncated, void()); + MOCK_METHOD3(LoadCommandsOverrun, void(size_t claimed, size_t i, + LoadCommandType type)); + MOCK_METHOD2(LoadCommandTooShort, void(size_t i, LoadCommandType type)); + MOCK_METHOD1(SectionsMissing, void(const string& name)); + MOCK_METHOD1(MisplacedSegmentData, void(const string& name)); + MOCK_METHOD2(MisplacedSectionData, void(const string& section, + const string& segment)); + MOCK_METHOD0(MisplacedSymbolTable, void()); + MOCK_METHOD1(UnsupportedCPUType, void(cpu_type_t cpu_type)); +}; + +class MockLoadCommandHandler: public Reader::LoadCommandHandler { + public: + MOCK_METHOD2(UnknownCommand, bool(LoadCommandType, const ByteBuffer&)); + MOCK_METHOD1(SegmentCommand, bool(const Segment&)); + MOCK_METHOD2(SymtabCommand, bool(const ByteBuffer&, const ByteBuffer&)); +}; + +class MockSectionHandler: public Reader::SectionHandler { + public: + MOCK_METHOD1(HandleSection, bool(const Section& section)); +}; + + +// Tests for mach_o::FatReader. + +// Since the effect of these functions is to write to stderr, the +// results of these tests must be inspected by hand. +TEST(FatReaderReporter, BadHeader) { + FatReader::Reporter reporter("filename"); + reporter.BadHeader(); +} + +TEST(FatReaderReporter, MisplacedObjectFile) { + FatReader::Reporter reporter("filename"); + reporter.MisplacedObjectFile(); +} + +TEST(FatReaderReporter, TooShort) { + FatReader::Reporter reporter("filename"); + reporter.TooShort(); +} + +TEST(MachOReaderReporter, BadHeader) { + Reader::Reporter reporter("filename"); + reporter.BadHeader(); +} + +TEST(MachOReaderReporter, CPUTypeMismatch) { + Reader::Reporter reporter("filename"); + reporter.CPUTypeMismatch(CPU_TYPE_I386, CPU_SUBTYPE_X86_ALL, + CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL); +} + +TEST(MachOReaderReporter, HeaderTruncated) { + Reader::Reporter reporter("filename"); + reporter.HeaderTruncated(); +} + +TEST(MachOReaderReporter, LoadCommandRegionTruncated) { + Reader::Reporter reporter("filename"); + reporter.LoadCommandRegionTruncated(); +} + +TEST(MachOReaderReporter, LoadCommandsOverrun) { + Reader::Reporter reporter("filename"); + reporter.LoadCommandsOverrun(10, 9, LC_DYSYMTAB); + reporter.LoadCommandsOverrun(10, 9, 0); +} + +TEST(MachOReaderReporter, LoadCommandTooShort) { + Reader::Reporter reporter("filename"); + reporter.LoadCommandTooShort(11, LC_SYMTAB); +} + +TEST(MachOReaderReporter, SectionsMissing) { + Reader::Reporter reporter("filename"); + reporter.SectionsMissing("segment name"); +} + +TEST(MachOReaderReporter, MisplacedSegmentData) { + Reader::Reporter reporter("filename"); + reporter.MisplacedSegmentData("segment name"); +} + +TEST(MachOReaderReporter, MisplacedSectionData) { + Reader::Reporter reporter("filename"); + reporter.MisplacedSectionData("section name", "segment name"); +} + +TEST(MachOReaderReporter, MisplacedSymbolTable) { + Reader::Reporter reporter("filename"); + reporter.MisplacedSymbolTable(); +} + +TEST(MachOReaderReporter, UnsupportedCPUType) { + Reader::Reporter reporter("filename"); + reporter.UnsupportedCPUType(CPU_TYPE_HPPA); +} + +struct FatReaderFixture { + FatReaderFixture() + : fat(kBigEndian), + reporter("reporter filename"), + reader(&reporter), object_files() { + EXPECT_CALL(reporter, BadHeader()).Times(0); + EXPECT_CALL(reporter, TooShort()).Times(0); + + // here, start, and Mark are file offsets in 'fat'. + fat.start() = 0; + } + // Append a 'fat_arch' entry to 'fat', with the given field values. + void AppendFatArch(cpu_type_t type, cpu_subtype_t subtype, + Label offset, Label size, uint32_t align) { + fat + .B32(type) + .B32(subtype) + .B32(offset) + .B32(size) + .B32(align); + } + // Append |n| dummy 'fat_arch' entries to 'fat'. The cpu type and + // subtype have unrealistic values. + void AppendDummyArchEntries(int n) { + for (int i = 0; i < n; i++) + AppendFatArch(0xb68ad617, 0x715a0840, 0, 0, 1); + } + void ReadFat(bool expect_parse_success = true) { + ASSERT_TRUE(fat.GetContents(&contents)); + fat_bytes = reinterpret_cast(contents.data()); + if (expect_parse_success) { + EXPECT_TRUE(reader.Read(fat_bytes, contents.size())); + size_t fat_files_count; + const SuperFatArch* fat_files = reader.object_files(&fat_files_count); + object_files.resize(fat_files_count); + for (size_t i = 0; i < fat_files_count; ++i) { + EXPECT_TRUE(fat_files[i].ConvertToFatArch(&object_files[i])); + } + } + else + EXPECT_FALSE(reader.Read(fat_bytes, contents.size())); + } + test_assembler::Section fat; + MockFatReaderReporter reporter; + FatReader reader; + string contents; + const uint8_t* fat_bytes; + vector object_files; +}; + +class FatReaderTest: public FatReaderFixture, public Test { }; + +TEST_F(FatReaderTest, BadMagic) { + EXPECT_CALL(reporter, BadHeader()).Times(1); + fat + .B32(0xcafed00d) // magic number (incorrect) + .B32(10); // number of architectures + AppendDummyArchEntries(10); + ReadFat(false); +} + +TEST_F(FatReaderTest, HeaderTooShort) { + EXPECT_CALL(reporter, TooShort()).Times(1); + fat + .B32(0xcafebabe); // magic number + ReadFat(false); +} + +TEST_F(FatReaderTest, ObjectListTooShort) { + EXPECT_CALL(reporter, TooShort()).Times(1); + fat + .B32(0xcafebabe) // magic number + .B32(10); // number of architectures + AppendDummyArchEntries(9); // nine dummy architecture entries... + fat // and a tenth, missing a byte at the end + .B32(0x3d46c8fc) // cpu type + .B32(0x8a7bfb01) // cpu subtype + .B32(0) // offset + .B32(0) // size + .Append(3, '*'); // one byte short of a four-byte alignment + ReadFat(false); +} + +TEST_F(FatReaderTest, DataTooShort) { + EXPECT_CALL(reporter, MisplacedObjectFile()).Times(1); + Label arch_data; + fat + .B32(0xcafebabe) // magic number + .B32(1); // number of architectures + AppendFatArch(0xb4d4a366, 0x4ba4f525, arch_data, 40, 0); + fat + .Mark(&arch_data) // file data begins here + .Append(30, '*'); // only 30 bytes, not 40 as header claims + ReadFat(false); +} + +TEST_F(FatReaderTest, NoObjectFiles) { + fat + .B32(0xcafebabe) // magic number + .B32(0); // number of architectures + ReadFat(); + EXPECT_EQ(0U, object_files.size()); +} + +TEST_F(FatReaderTest, OneObjectFile) { + Label obj1_offset; + fat + .B32(0xcafebabe) // magic number + .B32(1); // number of architectures + // First object file list entry + AppendFatArch(0x5e3a6e91, 0x52ccd852, obj1_offset, 0x42, 0x355b15b2); + // First object file data + fat + .Mark(&obj1_offset) + .Append(0x42, '*'); // dummy contents + ReadFat(); + ASSERT_EQ(1U, object_files.size()); + EXPECT_EQ(0x5e3a6e91, object_files[0].cputype); + EXPECT_EQ(0x52ccd852, object_files[0].cpusubtype); + EXPECT_EQ(obj1_offset.Value(), object_files[0].offset); + EXPECT_EQ(0x42U, object_files[0].size); + EXPECT_EQ(0x355b15b2U, object_files[0].align); +} + +TEST_F(FatReaderTest, ThreeObjectFiles) { + Label obj1, obj2, obj3; + fat + .B32(0xcafebabe) // magic number + .B32(3); // number of architectures + // Three object file list entries. + AppendFatArch(0x0cb92c30, 0x6a159a71, obj1, 0xfb4, 0x2615dbe8); + AppendFatArch(0x0f3f1cbb, 0x6c55e90f, obj2, 0xc31, 0x83af6ffd); + AppendFatArch(0x3717276d, 0x10ecdc84, obj3, 0x4b3, 0x035267d7); + fat + // First object file data + .Mark(&obj1) + .Append(0xfb4, '*') // dummy contents + // Second object file data + .Mark(&obj2) + .Append(0xc31, '%') // dummy contents + // Third object file data + .Mark(&obj3) + .Append(0x4b3, '^'); // dummy contents + + ReadFat(); + + ASSERT_EQ(3U, object_files.size()); + + // First object file. + EXPECT_EQ(0x0cb92c30, object_files[0].cputype); + EXPECT_EQ(0x6a159a71, object_files[0].cpusubtype); + EXPECT_EQ(obj1.Value(), object_files[0].offset); + EXPECT_EQ(0xfb4U, object_files[0].size); + EXPECT_EQ(0x2615dbe8U, object_files[0].align); + + // Second object file. + EXPECT_EQ(0x0f3f1cbb, object_files[1].cputype); + EXPECT_EQ(0x6c55e90f, object_files[1].cpusubtype); + EXPECT_EQ(obj2.Value(), object_files[1].offset); + EXPECT_EQ(0xc31U, object_files[1].size); + EXPECT_EQ(0x83af6ffdU, object_files[1].align); + + // Third object file. + EXPECT_EQ(0x3717276d, object_files[2].cputype); + EXPECT_EQ(0x10ecdc84, object_files[2].cpusubtype); + EXPECT_EQ(obj3.Value(), object_files[2].offset); + EXPECT_EQ(0x4b3U, object_files[2].size); + EXPECT_EQ(0x035267d7U, object_files[2].align); +} + +TEST_F(FatReaderTest, BigEndianMachO32) { + fat.set_endianness(kBigEndian); + fat + .D32(0xfeedface) // Mach-O file magic number + .D32(0x1a9d0518) // cpu type + .D32(0x1b779357) // cpu subtype + .D32(0x009df67e) // file type + .D32(0) // no load commands + .D32(0) // the load commands occupy no bytes + .D32(0x21987a99); // flags + + ReadFat(); + + // FatReader should treat a Mach-O file as if it were a fat binary file + // containing one object file --- the whole thing. + ASSERT_EQ(1U, object_files.size()); + EXPECT_EQ(0x1a9d0518, object_files[0].cputype); + EXPECT_EQ(0x1b779357, object_files[0].cpusubtype); + EXPECT_EQ(0U, object_files[0].offset); + EXPECT_EQ(contents.size(), object_files[0].size); +} + +TEST_F(FatReaderTest, BigEndianMachO64) { + fat.set_endianness(kBigEndian); + fat + .D32(0xfeedfacf) // Mach-O 64-bit file magic number + .D32(0x5aff8487) // cpu type + .D32(0x4c6a57f7) // cpu subtype + .D32(0x4392d2c8) // file type + .D32(0) // no load commands + .D32(0) // the load commands occupy no bytes + .D32(0x1b033eea); // flags + + ReadFat(); + + // FatReader should treat a Mach-O file as if it were a fat binary file + // containing one object file --- the whole thing. + ASSERT_EQ(1U, object_files.size()); + EXPECT_EQ(0x5aff8487, object_files[0].cputype); + EXPECT_EQ(0x4c6a57f7, object_files[0].cpusubtype); + EXPECT_EQ(0U, object_files[0].offset); + EXPECT_EQ(contents.size(), object_files[0].size); +} + +TEST_F(FatReaderTest, LittleEndianMachO32) { + fat.set_endianness(kLittleEndian); + fat + .D32(0xfeedface) // Mach-O file magic number + .D32(0x1a9d0518) // cpu type + .D32(0x1b779357) // cpu subtype + .D32(0x009df67e) // file type + .D32(0) // no load commands + .D32(0) // the load commands occupy no bytes + .D32(0x21987a99); // flags + + ReadFat(); + + // FatReader should treat a Mach-O file as if it were a fat binary file + // containing one object file --- the whole thing. + ASSERT_EQ(1U, object_files.size()); + EXPECT_EQ(0x1a9d0518, object_files[0].cputype); + EXPECT_EQ(0x1b779357, object_files[0].cpusubtype); + EXPECT_EQ(0U, object_files[0].offset); + EXPECT_EQ(contents.size(), object_files[0].size); +} + +TEST_F(FatReaderTest, LittleEndianMachO64) { + fat.set_endianness(kLittleEndian); + fat + .D32(0xfeedfacf) // Mach-O 64-bit file magic number + .D32(0x5aff8487) // cpu type + .D32(0x4c6a57f7) // cpu subtype + .D32(0x4392d2c8) // file type + .D32(0) // no load commands + .D32(0) // the load commands occupy no bytes + .D32(0x1b033eea); // flags + + ReadFat(); + + // FatReader should treat a Mach-O file as if it were a fat binary file + // containing one object file --- the whole thing. + ASSERT_EQ(1U, object_files.size()); + EXPECT_EQ(0x5aff8487, object_files[0].cputype); + EXPECT_EQ(0x4c6a57f7, object_files[0].cpusubtype); + EXPECT_EQ(0U, object_files[0].offset); + EXPECT_EQ(contents.size(), object_files[0].size); +} + +TEST_F(FatReaderTest, IncompleteMach) { + fat.set_endianness(kLittleEndian); + fat + .D32(0xfeedfacf) // Mach-O 64-bit file magic number + .D32(0x5aff8487); // cpu type + // Truncated! + + EXPECT_CALL(reporter, TooShort()).WillOnce(Return()); + + ReadFat(false); +} + + +// General mach_o::Reader tests. + +// Dynamically scoped configuration data. +class WithConfiguration { + public: + // Establish the given parameters as the default for SizedSections + // created within the dynamic scope of this instance. + WithConfiguration(Endianness endianness, size_t word_size) + : endianness_(endianness), word_size_(word_size), saved_(current_) { + current_ = this; + } + ~WithConfiguration() { current_ = saved_; } + static Endianness endianness() { + assert(current_); + return current_->endianness_; + } + static size_t word_size() { + assert(current_); + return current_->word_size_; + } + + private: + // The innermost WithConfiguration in whose dynamic scope we are + // currently executing. + static WithConfiguration* current_; + + // The innermost WithConfiguration whose dynamic scope encloses this + // WithConfiguration. + Endianness endianness_; + size_t word_size_; + WithConfiguration* saved_; +}; + +WithConfiguration* WithConfiguration::current_ = NULL; + +// A test_assembler::Section with a size that we can cite. The start(), +// Here() and Mark() member functions of a SizedSection always represent +// offsets within the overall file. +class SizedSection: public test_assembler::Section { + public: + // Construct a section of the given endianness and word size. + explicit SizedSection(Endianness endianness, size_t word_size) + : test_assembler::Section(endianness), word_size_(word_size) { + assert(word_size_ == 32 || word_size_ == 64); + } + SizedSection() + : test_assembler::Section(WithConfiguration::endianness()), + word_size_(WithConfiguration::word_size()) { + assert(word_size_ == 32 || word_size_ == 64); + } + + // Access/set this section's word size. + size_t word_size() const { return word_size_; } + void set_word_size(size_t word_size) { + assert(word_size_ == 32 || word_size_ == 64); + word_size_ = word_size; + } + + // Return a label representing the size this section will have when it + // is Placed in some containing section. + Label final_size() const { return final_size_; } + + // Append SECTION to the end of this section, and call its Finish member. + // Return a reference to this section. + SizedSection& Place(SizedSection* section) { + assert(section->endianness() == endianness()); + section->Finish(); + section->start() = Here(); + test_assembler::Section::Append(*section); + return *this; + } + + protected: + // Mark this section's contents as complete. For plain SizedSections, we + // set SECTION's start to its position in this section, and its final_size + // label to its current size. Derived classes can extend this as needed + // for their additional semantics. + virtual void Finish() { + final_size_ = Size(); + } + + // The word size for this data: either 32 or 64. + size_t word_size_; + + private: + // This section's final size, set when we are placed in some other + // SizedSection. + Label final_size_; +}; + +// A SizedSection that is loaded into memory at a particular address. +class LoadedSection: public SizedSection { + public: + explicit LoadedSection(Label address = Label()) : address_(address) { } + + // Return a label representing this section's address. + Label address() const { return address_; } + + // Placing a loaded section within a loaded section sets the relationship + // between their addresses. + LoadedSection& Place(LoadedSection* section) { + section->address() = address() + Size(); + SizedSection::Place(section); + return *this; + } + + protected: + // The address at which this section's contents will be loaded. + Label address_; +}; + +// A SizedSection representing a segment load command. +class SegmentLoadCommand: public SizedSection { + public: + SegmentLoadCommand() : section_count_(0) { } + + // Append a segment load command header with the given characteristics. + // The load command will refer to CONTENTS, which must be Placed in the + // file separately, at the desired position. Return a reference to this + // section. + SegmentLoadCommand& Header(const string& name, const LoadedSection& contents, + uint32_t maxprot, uint32_t initprot, + uint32_t flags) { + assert(contents.word_size() == word_size()); + D32(word_size() == 32 ? LC_SEGMENT : LC_SEGMENT_64); + D32(final_size()); + AppendCString(name, 16); + Append(endianness(), word_size() / 8, contents.address()); + Append(endianness(), word_size() / 8, vmsize_); + Append(endianness(), word_size() / 8, contents.start()); + Append(endianness(), word_size() / 8, contents.final_size()); + D32(maxprot); + D32(initprot); + D32(final_section_count_); + D32(flags); + + content_final_size_ = contents.final_size(); + + return *this; + } + + // Return a label representing the size of this segment when loaded into + // memory. If this label is still undefined by the time we place this + // segment, it defaults to the final size of the segment's in-file + // contents. Return a reference to this load command. + Label& vmsize() { return vmsize_; } + + // Add a section entry with the given characteristics to this segment + // load command. Return a reference to this. The section entry will refer + // to CONTENTS, which must be Placed in the segment's contents + // separately, at the desired position. + SegmentLoadCommand& AppendSectionEntry(const string& section_name, + const string& segment_name, + uint32_t alignment, uint32_t flags, + const LoadedSection& contents) { + AppendCString(section_name, 16); + AppendCString(segment_name, 16); + Append(endianness(), word_size() / 8, contents.address()); + Append(endianness(), word_size() / 8, contents.final_size()); + D32(contents.start()); + D32(alignment); + D32(0); // relocations start + D32(0); // relocations size + D32(flags); + D32(0x93656b95); // reserved1 + D32(0xc35a2473); // reserved2 + if (word_size() == 64) + D32(0x70284b95); // reserved3 + + section_count_++; + + return *this; + } + + protected: + void Finish() { + final_section_count_ = section_count_; + if (!vmsize_.IsKnownConstant()) + vmsize_ = content_final_size_; + SizedSection::Finish(); + } + + private: + // The number of sections that have been added to this segment so far. + size_t section_count_; + + // A label representing the final number of sections this segment will hold. + Label final_section_count_; + + // The size of the contents for this segment present in the file. + Label content_final_size_; + + // A label representing the size of this segment when loaded; this can be + // larger than the size of its file contents, the difference being + // zero-filled. If not set explicitly by calling set_vmsize, this is set + // equal to the size of the contents. + Label vmsize_; +}; + +// A SizedSection holding a list of Mach-O load commands. +class LoadCommands: public SizedSection { + public: + LoadCommands() : command_count_(0) { } + + // Return a label representing the final load command count. + Label final_command_count() const { return final_command_count_; } + + // Increment the command count; return a reference to this section. + LoadCommands& CountCommand() { + command_count_++; + return *this; + } + + // Place COMMAND, containing a load command, at the end of this section. + // Return a reference to this section. + LoadCommands& Place(SizedSection* section) { + SizedSection::Place(section); + CountCommand(); + return *this; + } + + protected: + // Mark this load command list as complete. + void Finish() { + SizedSection::Finish(); + final_command_count_ = command_count_; + } + + private: + // The number of load commands we have added to this file so far. + size_t command_count_; + + // A label representing the final command count. + Label final_command_count_; +}; + +// A SizedSection holding the contents of a Mach-O file. Within a +// MachOFile, the start, Here, and Mark members refer to file offsets. +class MachOFile: public SizedSection { + public: + MachOFile() { + start() = 0; + } + + // Create a Mach-O file header using the given characteristics and load + // command list. This Places COMMANDS immediately after the header. + // Return a reference to this section. + MachOFile& Header(LoadCommands* commands, + cpu_type_t cpu_type = CPU_TYPE_X86, + cpu_subtype_t cpu_subtype = CPU_SUBTYPE_I386_ALL, + FileType file_type = MH_EXECUTE, + uint32_t file_flags = (MH_TWOLEVEL | + MH_DYLDLINK | + MH_NOUNDEFS)) { + D32(word_size() == 32 ? 0xfeedface : 0xfeedfacf); // magic number + D32(cpu_type); // cpu type + D32(cpu_subtype); // cpu subtype + D32(file_type); // file type + D32(commands->final_command_count()); // number of load commands + D32(commands->final_size()); // their size in bytes + D32(file_flags); // flags + if (word_size() == 64) + D32(0x55638b90); // reserved + Place(commands); + return *this; + } +}; + + +struct ReaderFixture { + ReaderFixture() + : reporter("reporter filename"), + reader(&reporter) { + EXPECT_CALL(reporter, BadHeader()).Times(0); + EXPECT_CALL(reporter, CPUTypeMismatch(_, _, _, _)).Times(0); + EXPECT_CALL(reporter, HeaderTruncated()).Times(0); + EXPECT_CALL(reporter, LoadCommandRegionTruncated()).Times(0); + EXPECT_CALL(reporter, LoadCommandsOverrun(_, _, _)).Times(0); + EXPECT_CALL(reporter, LoadCommandTooShort(_, _)).Times(0); + EXPECT_CALL(reporter, SectionsMissing(_)).Times(0); + EXPECT_CALL(reporter, MisplacedSegmentData(_)).Times(0); + EXPECT_CALL(reporter, MisplacedSectionData(_, _)).Times(0); + EXPECT_CALL(reporter, MisplacedSymbolTable()).Times(0); + EXPECT_CALL(reporter, UnsupportedCPUType(_)).Times(0); + + EXPECT_CALL(load_command_handler, UnknownCommand(_, _)).Times(0); + EXPECT_CALL(load_command_handler, SegmentCommand(_)).Times(0); + } + + void ReadFile(MachOFile* file, + bool expect_parse_success, + cpu_type_t expected_cpu_type, + cpu_subtype_t expected_cpu_subtype) { + ASSERT_TRUE(file->GetContents(&file_contents)); + file_bytes = reinterpret_cast(file_contents.data()); + if (expect_parse_success) { + EXPECT_TRUE(reader.Read(file_bytes, + file_contents.size(), + expected_cpu_type, + expected_cpu_subtype)); + } else { + EXPECT_FALSE(reader.Read(file_bytes, + file_contents.size(), + expected_cpu_type, + expected_cpu_subtype)); + } + } + + string file_contents; + const uint8_t* file_bytes; + MockReaderReporter reporter; + Reader reader; + MockLoadCommandHandler load_command_handler; + MockSectionHandler section_handler; +}; + +class ReaderTest: public ReaderFixture, public Test { }; + +TEST_F(ReaderTest, BadMagic) { + WithConfiguration config(kLittleEndian, 32); + const cpu_type_t kCPUType = 0x46b760df; + const cpu_subtype_t kCPUSubType = 0x76a0e7f7; + MachOFile file; + file + .D32(0x67bdebe1) // Not a proper magic number. + .D32(kCPUType) // cpu type + .D32(kCPUSubType) // cpu subtype + .D32(0x149fc717) // file type + .D32(0) // no load commands + .D32(0) // they occupy no bytes + .D32(0x80e71d64) // flags + .D32(0); // reserved + EXPECT_CALL(reporter, BadHeader()).WillOnce(Return()); + ReadFile(&file, false, CPU_TYPE_ANY, kCPUSubType); +} + +TEST_F(ReaderTest, MismatchedMagic) { + WithConfiguration config(kLittleEndian, 32); + const cpu_type_t kCPUType = CPU_TYPE_I386; + const cpu_subtype_t kCPUSubType = CPU_SUBTYPE_X86_ALL; + MachOFile file; + file + .D32(MH_CIGAM) // Right magic, but winds up wrong + // due to bitswapping + .D32(kCPUType) // cpu type + .D32(kCPUSubType) // cpu subtype + .D32(0x149fc717) // file type + .D32(0) // no load commands + .D32(0) // they occupy no bytes + .D32(0x80e71d64) // flags + .D32(0); // reserved + EXPECT_CALL(reporter, BadHeader()).WillOnce(Return()); + ReadFile(&file, false, kCPUType, kCPUSubType); +} + +TEST_F(ReaderTest, ShortMagic) { + WithConfiguration config(kBigEndian, 32); + MachOFile file; + file + .D16(0xfeed); // magic number + // truncated! + EXPECT_CALL(reporter, HeaderTruncated()).WillOnce(Return()); + ReadFile(&file, false, CPU_TYPE_ANY, 0); +} + +TEST_F(ReaderTest, ShortHeader) { + WithConfiguration config(kBigEndian, 32); + const cpu_type_t kCPUType = CPU_TYPE_ANY; + const cpu_subtype_t kCPUSubType = 0x76a0e7f7; + MachOFile file; + file + .D32(0xfeedface) // magic number + .D32(kCPUType) // cpu type + .D32(kCPUSubType) // cpu subtype + .D32(0x149fc717) // file type + .D32(0) // no load commands + .D32(0); // they occupy no bytes + EXPECT_CALL(reporter, HeaderTruncated()).WillOnce(Return()); + ReadFile(&file, false, CPU_TYPE_ANY, kCPUSubType); +} + +TEST_F(ReaderTest, MismatchedCPU) { + WithConfiguration config(kBigEndian, 32); + const cpu_type_t kCPUType = CPU_TYPE_I386; + const cpu_subtype_t kCPUSubType = CPU_SUBTYPE_X86_ALL; + MachOFile file; + file + .D32(MH_MAGIC) // Right magic for PPC (once bitswapped) + .D32(kCPUType) // cpu type + .D32(kCPUSubType) // cpu subtype + .D32(0x149fc717) // file type + .D32(0) // no load commands + .D32(0) // they occupy no bytes + .D32(0x80e71d64) // flags + .D32(0); // reserved + EXPECT_CALL(reporter, + CPUTypeMismatch(CPU_TYPE_I386, CPU_SUBTYPE_X86_ALL, + CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL)) + .WillOnce(Return()); + ReadFile(&file, false, CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL); +} + +TEST_F(ReaderTest, LittleEndian32Bit) { + WithConfiguration config(kLittleEndian, 32); + const cpu_type_t kCPUType = 0x46b760df; + const cpu_subtype_t kCPUSubType = 0x76a0e7f7; + MachOFile file; + file + .D32(0xfeedface) // magic number + .D32(kCPUType) // cpu type + .D32(kCPUSubType) // cpu subtype + .D32(0x149fc717) // file type + .D32(0) // no load commands + .D32(0) // they occupy no bytes + .D32(0x80e71d64) // flags + .D32(0); // reserved + ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType); + EXPECT_FALSE(reader.bits_64()); + EXPECT_FALSE(reader.big_endian()); + EXPECT_EQ(kCPUType, reader.cpu_type()); + EXPECT_EQ(kCPUSubType, reader.cpu_subtype()); + EXPECT_EQ(FileType(0x149fc717), reader.file_type()); + EXPECT_EQ(FileFlags(0x80e71d64), reader.flags()); +} + +TEST_F(ReaderTest, LittleEndian64Bit) { + WithConfiguration config(kLittleEndian, 64); + const cpu_type_t kCPUType = 0x46b760df; + const cpu_subtype_t kCPUSubType = 0x76a0e7f7; + MachOFile file; + file + .D32(0xfeedfacf) // magic number + .D32(kCPUType) // cpu type + .D32(kCPUSubType) // cpu subtype + .D32(0x149fc717) // file type + .D32(0) // no load commands + .D32(0) // they occupy no bytes + .D32(0x80e71d64) // flags + .D32(0); // reserved + ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType); + EXPECT_TRUE(reader.bits_64()); + EXPECT_FALSE(reader.big_endian()); + EXPECT_EQ(kCPUType, reader.cpu_type()); + EXPECT_EQ(kCPUSubType, reader.cpu_subtype()); + EXPECT_EQ(FileType(0x149fc717), reader.file_type()); + EXPECT_EQ(FileFlags(0x80e71d64), reader.flags()); +} + +TEST_F(ReaderTest, BigEndian32Bit) { + WithConfiguration config(kBigEndian, 32); + const cpu_type_t kCPUType = 0x46b760df; + const cpu_subtype_t kCPUSubType = 0x76a0e7f7; + MachOFile file; + file + .D32(0xfeedface) // magic number + .D32(kCPUType) // cpu type + .D32(kCPUSubType) // cpu subtype + .D32(0x149fc717) // file type + .D32(0) // no load commands + .D32(0) // they occupy no bytes + .D32(0x80e71d64) // flags + .D32(0); // reserved + ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType); + EXPECT_FALSE(reader.bits_64()); + EXPECT_TRUE(reader.big_endian()); + EXPECT_EQ(kCPUType, reader.cpu_type()); + EXPECT_EQ(kCPUSubType, reader.cpu_subtype()); + EXPECT_EQ(FileType(0x149fc717), reader.file_type()); + EXPECT_EQ(FileFlags(0x80e71d64), reader.flags()); +} + +TEST_F(ReaderTest, BigEndian64Bit) { + WithConfiguration config(kBigEndian, 64); + const cpu_type_t kCPUType = 0x46b760df; + const cpu_subtype_t kCPUSubType = 0x76a0e7f7; + MachOFile file; + file + .D32(0xfeedfacf) // magic number + .D32(kCPUType) // cpu type + .D32(kCPUSubType) // cpu subtype + .D32(0x149fc717) // file type + .D32(0) // no load commands + .D32(0) // they occupy no bytes + .D32(0x80e71d64) // flags + .D32(0); // reserved + ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType); + EXPECT_TRUE(reader.bits_64()); + EXPECT_TRUE(reader.big_endian()); + EXPECT_EQ(kCPUType, reader.cpu_type()); + EXPECT_EQ(kCPUSubType, reader.cpu_subtype()); + EXPECT_EQ(FileType(0x149fc717), reader.file_type()); + EXPECT_EQ(FileFlags(0x80e71d64), reader.flags()); +} + + +// Load command tests. + +class LoadCommand: public ReaderFixture, public Test { }; + +TEST_F(LoadCommand, RegionTruncated) { + WithConfiguration config(kBigEndian, 64); + const cpu_type_t kCPUType = 0x46b760df; + const cpu_subtype_t kCPUSubType = 0x76a0e7f7; + MachOFile file; + file + .D32(0xfeedfacf) // magic number + .D32(kCPUType) // cpu type + .D32(kCPUSubType) // cpu subtype + .D32(0x149fc717) // file type + .D32(1) // one load command + .D32(40) // occupying 40 bytes + .D32(0x80e71d64) // flags + .D32(0) // reserved + .Append(20, 0); // load command region, not as long as + // Mach-O header promised + + EXPECT_CALL(reporter, LoadCommandRegionTruncated()).WillOnce(Return()); + + ReadFile(&file, false, CPU_TYPE_ANY, kCPUSubType); +} + +TEST_F(LoadCommand, None) { + WithConfiguration config(kLittleEndian, 32); + LoadCommands load_commands; + MachOFile file; + file.Header(&load_commands); + + ReadFile(&file, true, CPU_TYPE_X86, CPU_SUBTYPE_I386_ALL); + + EXPECT_FALSE(reader.bits_64()); + EXPECT_FALSE(reader.big_endian()); + EXPECT_EQ(CPU_TYPE_X86, reader.cpu_type()); + EXPECT_EQ(CPU_SUBTYPE_I386_ALL, reader.cpu_subtype()); + EXPECT_EQ(static_cast(MH_EXECUTE), reader.file_type()); + EXPECT_EQ(FileFlags(MH_TWOLEVEL | + MH_DYLDLINK | + MH_NOUNDEFS), + FileFlags(reader.flags())); + + EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler)); +} + +TEST_F(LoadCommand, Unknown) { + WithConfiguration config(kBigEndian, 32); + LoadCommands load_commands; + load_commands + .CountCommand() + .D32(0x33293d4a) // unknown load command + .D32(40) // total size in bytes + .Append(32, '*'); // dummy data + MachOFile file; + file.Header(&load_commands); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + EXPECT_FALSE(reader.bits_64()); + EXPECT_TRUE(reader.big_endian()); + EXPECT_EQ(CPU_TYPE_X86, reader.cpu_type()); + EXPECT_EQ(CPU_SUBTYPE_I386_ALL, reader.cpu_subtype()); + EXPECT_EQ(static_cast(MH_EXECUTE), reader.file_type()); + EXPECT_EQ(FileFlags(MH_TWOLEVEL | + MH_DYLDLINK | + MH_NOUNDEFS), + reader.flags()); + + ByteBuffer expected; + expected.start = file_bytes + load_commands.start().Value(); + expected.end = expected.start + load_commands.final_size().Value(); + EXPECT_CALL(load_command_handler, UnknownCommand(0x33293d4a, + expected)) + .WillOnce(Return(true)); + + EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler)); +} + +TEST_F(LoadCommand, TypeIncomplete) { + WithConfiguration config(kLittleEndian, 32); + LoadCommands load_commands; + load_commands + .CountCommand() + .Append(3, 0); // load command type, incomplete + + MachOFile file; + file.Header(&load_commands); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + EXPECT_CALL(reporter, LoadCommandsOverrun(1, 0, 0)) + .WillOnce(Return()); + EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler)); +} + +TEST_F(LoadCommand, LengthIncomplete) { + WithConfiguration config(kBigEndian, 64); + LoadCommands load_commands; + load_commands + .CountCommand() + .D32(LC_SEGMENT); // load command + // no length + MachOFile file; + file.Header(&load_commands); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + EXPECT_CALL(reporter, LoadCommandsOverrun(1, 0, LC_SEGMENT)) + .WillOnce(Return()); + EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler)); +} + +TEST_F(LoadCommand, ContentIncomplete) { + WithConfiguration config(kLittleEndian, 64); + LoadCommands load_commands; + load_commands + .CountCommand() + .D32(LC_SEGMENT) // load command + .D32(40) // total size in bytes + .Append(28, '*'); // not enough dummy data + MachOFile file; + file.Header(&load_commands); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + EXPECT_CALL(reporter, LoadCommandsOverrun(1, 0, LC_SEGMENT)) + .WillOnce(Return()); + EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler)); +} + +TEST_F(LoadCommand, SegmentBE32) { + WithConfiguration config(kBigEndian, 32); + LoadedSection segment; + segment.address() = 0x1891139c; + segment.Append(42, '*'); // segment contents + SegmentLoadCommand segment_command; + segment_command + .Header("froon", segment, 0x94d6dd22, 0x8bdbc319, 0x990a16dd); + segment_command.vmsize() = 0xcb76584fU; + LoadCommands load_commands; + load_commands.Place(&segment_command); + MachOFile file; + file + .Header(&load_commands) + .Place(&segment); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + EXPECT_CALL(load_command_handler, SegmentCommand(_)) + .WillOnce(DoAll(SaveArg<0>(&actual_segment), + Return(true))); + EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler)); + + EXPECT_FALSE(actual_segment.bits_64); + EXPECT_EQ("froon", actual_segment.name); + EXPECT_EQ(0x1891139cU, actual_segment.vmaddr); + EXPECT_EQ(0xcb76584fU, actual_segment.vmsize); + EXPECT_EQ(0x94d6dd22U, actual_segment.maxprot); + EXPECT_EQ(0x8bdbc319U, actual_segment.initprot); + EXPECT_EQ(0x990a16ddU, actual_segment.flags); + EXPECT_EQ(0U, actual_segment.nsects); + EXPECT_EQ(0U, actual_segment.section_list.Size()); + EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size()); +} + +TEST_F(LoadCommand, SegmentLE32) { + WithConfiguration config(kLittleEndian, 32); + LoadedSection segment; + segment.address() = 0x4b877866; + segment.Append(42, '*'); // segment contents + SegmentLoadCommand segment_command; + segment_command + .Header("sixteenprecisely", segment, + 0x350759ed, 0x6cf5a62e, 0x990a16dd); + segment_command.vmsize() = 0xcb76584fU; + LoadCommands load_commands; + load_commands.Place(&segment_command); + MachOFile file; + file + .Header(&load_commands) + .Place(&segment); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + EXPECT_CALL(load_command_handler, SegmentCommand(_)) + .WillOnce(DoAll(SaveArg<0>(&actual_segment), + Return(true))); + EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler)); + + EXPECT_FALSE(actual_segment.bits_64); + EXPECT_EQ("sixteenprecisely", actual_segment.name); + EXPECT_EQ(0x4b877866U, actual_segment.vmaddr); + EXPECT_EQ(0xcb76584fU, actual_segment.vmsize); + EXPECT_EQ(0x350759edU, actual_segment.maxprot); + EXPECT_EQ(0x6cf5a62eU, actual_segment.initprot); + EXPECT_EQ(0x990a16ddU, actual_segment.flags); + EXPECT_EQ(0U, actual_segment.nsects); + EXPECT_EQ(0U, actual_segment.section_list.Size()); + EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size()); +} + +TEST_F(LoadCommand, SegmentBE64) { + WithConfiguration config(kBigEndian, 64); + LoadedSection segment; + segment.address() = 0x79f484f77009e511ULL; + segment.Append(42, '*'); // segment contents + SegmentLoadCommand segment_command; + segment_command + .Header("froon", segment, 0x42b45da5, 0x8bdbc319, 0xb2335220); + segment_command.vmsize() = 0x8d92397ce6248abaULL; + LoadCommands load_commands; + load_commands.Place(&segment_command); + MachOFile file; + file + .Header(&load_commands) + .Place(&segment); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + EXPECT_CALL(load_command_handler, SegmentCommand(_)) + .WillOnce(DoAll(SaveArg<0>(&actual_segment), + Return(true))); + EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler)); + + EXPECT_EQ(true, actual_segment.bits_64); + EXPECT_EQ("froon", actual_segment.name); + EXPECT_EQ(0x79f484f77009e511ULL, actual_segment.vmaddr); + EXPECT_EQ(0x8d92397ce6248abaULL, actual_segment.vmsize); + EXPECT_EQ(0x42b45da5U, actual_segment.maxprot); + EXPECT_EQ(0x8bdbc319U, actual_segment.initprot); + EXPECT_EQ(0xb2335220U, actual_segment.flags); + EXPECT_EQ(0U, actual_segment.nsects); + EXPECT_EQ(0U, actual_segment.section_list.Size()); + EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size()); +} + +TEST_F(LoadCommand, SegmentLE64) { + WithConfiguration config(kLittleEndian, 64); + LoadedSection segment; + segment.address() = 0x50c0501dc5922d35ULL; + segment.Append(42, '*'); // segment contents + SegmentLoadCommand segment_command; + segment_command + .Header("sixteenprecisely", segment, + 0x917c339d, 0xdbc446fa, 0xb650b563); + segment_command.vmsize() = 0x84ae73e7c75469bfULL; + LoadCommands load_commands; + load_commands.Place(&segment_command); + MachOFile file; + file + .Header(&load_commands) + .Place(&segment); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + EXPECT_CALL(load_command_handler, SegmentCommand(_)) + .WillOnce(DoAll(SaveArg<0>(&actual_segment), + Return(true))); + EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler)); + + EXPECT_EQ(true, actual_segment.bits_64); + EXPECT_EQ("sixteenprecisely", actual_segment.name); + EXPECT_EQ(0x50c0501dc5922d35ULL, actual_segment.vmaddr); + EXPECT_EQ(0x84ae73e7c75469bfULL, actual_segment.vmsize); + EXPECT_EQ(0x917c339dU, actual_segment.maxprot); + EXPECT_EQ(0xdbc446faU, actual_segment.initprot); + EXPECT_EQ(0xb650b563U, actual_segment.flags); + EXPECT_EQ(0U, actual_segment.nsects); + EXPECT_EQ(0U, actual_segment.section_list.Size()); + EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size()); +} + +TEST_F(LoadCommand, SegmentCommandTruncated) { + WithConfiguration config(kBigEndian, 32); + LoadedSection segment_contents; + segment_contents.Append(20, '*'); // lah di dah + SizedSection command; + command + .D32(LC_SEGMENT) // command type + .D32(command.final_size()) // command size + .AppendCString("too-short", 16) // segment name + .D32(0x9c759211) // vmaddr + .D32(segment_contents.final_size()) // vmsize + .D32(segment_contents.start()) // file offset + .D32(segment_contents.final_size()) // file size + .D32(0x56f28446) // max protection + .D32(0xe7910dcb) // initial protection + .D32(0) // no sections + .Append(3, 0); // flags (one byte short!) + LoadCommands load_commands; + load_commands.Place(&command); + MachOFile file; + file + .Header(&load_commands) + .Place(&segment_contents); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + EXPECT_CALL(reporter, LoadCommandTooShort(0, LC_SEGMENT)) + .WillOnce(Return()); + + EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler)); +} + +TEST_F(LoadCommand, SegmentBadContentOffset) { + WithConfiguration config(kLittleEndian, 32); + // Instead of letting a Place call set the segment's file offset and size, + // set them ourselves, to check that the parser catches invalid offsets + // instead of handing us bogus pointers. + LoadedSection segment; + segment.address() = 0x4db5489c; + segment.start() = 0x7e189e76; // beyond end of file + segment.final_size() = 0x98b9c3ab; + SegmentLoadCommand segment_command; + segment_command + .Header("notmerelyfifteen", segment, 0xcbab25ee, 0x359a20db, 0x68a3933f); + LoadCommands load_commands; + load_commands.Place(&segment_command); + MachOFile file; + file.Header(&load_commands); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + EXPECT_CALL(reporter, MisplacedSegmentData("notmerelyfifteen")) + .WillOnce(Return()); + + EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler)); +} + +TEST_F(LoadCommand, ThreeLoadCommands) { + WithConfiguration config(kBigEndian, 32); + LoadedSection seg1, seg2, seg3; + SegmentLoadCommand cmd1, cmd2, cmd3; + + seg1.Append(128, '@'); + seg1.address() = 0xa7f61ef6; + cmd1.Header("head", seg1, 0x88bf1cc7, 0x889a26a4, 0xe9b80d87); + // Include some dummy data at the end of the load command. Since we + // didn't claim to have any sections, the reader should ignore this. But + // making sure the commands have different lengths ensures that we're + // using the right command's length to advance the LoadCommandIterator. + cmd1.Append(128, '!'); + + seg2.Append(42, '*'); + seg2.address() = 0xc70fc909; + cmd2.Header("thorax", seg2, 0xde7327f4, 0xfdaf771d, 0x65e74b30); + // More dummy data at the end of the load command. + cmd2.Append(32, '^'); + + seg3.Append(42, '%'); + seg3.address() = 0x46b3ab05; + cmd3.Header("abdomen", seg3, 0x7098b70d, 0x8d8d7728, 0x5131419b); + // More dummy data at the end of the load command. + cmd3.Append(64, '&'); + + LoadCommands load_commands; + load_commands.Place(&cmd1).Place(&cmd2).Place(&cmd3); + + MachOFile file; + file.Header(&load_commands).Place(&seg1).Place(&seg2).Place(&seg3); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + { + InSequence s; + EXPECT_CALL(load_command_handler, + SegmentCommand(Field(&Segment::name, "head"))) + .WillOnce(Return(true)); + EXPECT_CALL(load_command_handler, + SegmentCommand(Field(&Segment::name, "thorax"))) + .WillOnce(Return(true)); + EXPECT_CALL(load_command_handler, + SegmentCommand(Field(&Segment::name, "abdomen"))) + .WillOnce(Return(true)); + } + + EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler)); +} + +static inline Matcher MatchSection( + Matcher bits_64, + Matcher section_name, + Matcher segment_name, + Matcher address, + Matcher alignment, + Matcher flags, + Matcher contents) { + return AllOf(AllOf(Field(&Section::bits_64, bits_64), + Field(&Section::section_name, section_name), + Field(&Section::segment_name, segment_name), + Field(&Section::address, address)), + AllOf(Field(&Section::align, alignment), + Field(&Section::flags, flags), + Field(&Section::contents, contents))); +} + +static inline Matcher MatchSection( + Matcher bits_64, + Matcher section_name, + Matcher segment_name, + Matcher address) { + return AllOf(Field(&Section::bits_64, bits_64), + Field(&Section::section_name, section_name), + Field(&Section::segment_name, segment_name), + Field(&Section::address, address)); +} + +TEST_F(LoadCommand, OneSegmentTwoSections) { + WithConfiguration config(kBigEndian, 64); + + // Create some sections with some data. + LoadedSection section1, section2; + section1.Append("buddha's hand"); + section2.Append("kumquat"); + + // Create a segment to hold them. + LoadedSection segment; + segment.address() = 0xe1d0eeec; + segment.Place(§ion2).Place(§ion1); + + SegmentLoadCommand segment_command; + segment_command + .Header("head", segment, 0x92c9568c, 0xa89f2627, 0x4dc7a1e2) + .AppendSectionEntry("mandarin", "kishu", 12, 0x8cd4604bU, section1) + .AppendSectionEntry("bergamot", "cara cara", 12, 0x98746efaU, section2); + + LoadCommands commands; + commands.Place(&segment_command); + + MachOFile file; + file.Header(&commands).Place(&segment); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + EXPECT_CALL(load_command_handler, SegmentCommand(_)) + .WillOnce(DoAll(SaveArg<0>(&actual_segment), + Return(true))); + EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler)); + + { + InSequence s; + ByteBuffer contents1; + contents1.start = file_bytes + section1.start().Value(); + contents1.end = contents1.start + section1.final_size().Value(); + EXPECT_EQ("buddha's hand", + string(reinterpret_cast(contents1.start), + contents1.Size())); + EXPECT_CALL(section_handler, + HandleSection(MatchSection(true, "mandarin", "kishu", + section1.address().Value(), 12, + 0x8cd4604bU, contents1))) + .WillOnce(Return(true)); + + ByteBuffer contents2; + contents2.start = file_bytes + section2.start().Value(); + contents2.end = contents2.start + section2.final_size().Value(); + EXPECT_EQ("kumquat", + string(reinterpret_cast(contents2.start), + contents2.Size())); + EXPECT_CALL(section_handler, + HandleSection(MatchSection(true, "bergamot", "cara cara", + section2.address().Value(), 12, + 0x98746efaU, contents2))) + .WillOnce(Return(true)); + } + + EXPECT_TRUE(reader.WalkSegmentSections(actual_segment, §ion_handler)); +} + +TEST_F(LoadCommand, MisplacedSectionBefore) { + WithConfiguration config(kLittleEndian, 64); + + // The segment. + LoadedSection segment; + segment.address() = 0x696d83cc; + segment.Append(10, '0'); + + // The contents of the following sections don't matter, because + // we're not really going to Place them in segment; we're just going + // to set all their labels by hand to get the (impossible) + // configurations we want. + + // A section whose starting offset is before that of its section. + LoadedSection before; + before.Append(10, '1'); + before.start() = segment.start() - 1; + before.address() = segment.address() - 1; + before.final_size() = before.Size(); + + SegmentLoadCommand command; + command + .Header("segment", segment, 0x173baa29, 0x8407275d, 0xed8f7057) + .AppendSectionEntry("before", "segment", 0, 0x686c6921, before); + + LoadCommands commands; + commands.Place(&command); + + MachOFile file; + file.Header(&commands).Place(&segment); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + EXPECT_TRUE(reader.FindSegment("segment", &actual_segment)); + + EXPECT_CALL(reporter, MisplacedSectionData("before", "segment")) + .WillOnce(Return()); + EXPECT_FALSE(reader.WalkSegmentSections(actual_segment, §ion_handler)); +} + +TEST_F(LoadCommand, MisplacedSectionAfter) { + WithConfiguration config(kLittleEndian, 64); + + // The segment. + LoadedSection segment; + segment.address() = 0x696d83cc; + segment.Append(10, '0'); + + // The contents of the following sections don't matter, because + // we're not really going to Place them in segment; we're just going + // to set all their labels by hand to get the (impossible) + // configurations we want. + + // A section whose starting offset is after the end of its section. + LoadedSection after; + after.Append(10, '2'); + after.start() = segment.start() + 11; + after.address() = segment.address() + 11; + after.final_size() = after.Size(); + + SegmentLoadCommand command; + command + .Header("segment", segment, 0x173baa29, 0x8407275d, 0xed8f7057) + .AppendSectionEntry("after", "segment", 0, 0x2ee50124, after); + + LoadCommands commands; + commands.Place(&command); + + MachOFile file; + file.Header(&commands).Place(&segment); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + EXPECT_TRUE(reader.FindSegment("segment", &actual_segment)); + + EXPECT_CALL(reporter, MisplacedSectionData("after", "segment")) + .WillOnce(Return()); + EXPECT_FALSE(reader.WalkSegmentSections(actual_segment, §ion_handler)); +} + +TEST_F(LoadCommand, MisplacedSectionTooBig) { + WithConfiguration config(kLittleEndian, 64); + + // The segment. + LoadedSection segment; + segment.address() = 0x696d83cc; + segment.Append(10, '0'); + + // The contents of the following sections don't matter, because + // we're not really going to Place them in segment; we're just going + // to set all their labels by hand to get the (impossible) + // configurations we want. + + // A section with 0 as is start address. + LoadedSection empty; + empty.Append(10, '4'); + empty.start() = 0; + empty.address() = segment.address() + 1; + empty.final_size() = empty.Size(); + + SegmentLoadCommand command; + command.Header("segment", segment, 0x173baa29, 0x8407275d, 0xed8f7057) + .AppendSectionEntry("empty", "segment", 0, 0x8b53ae5c, empty); + + LoadCommands commands; + commands.Place(&command); + + MachOFile file; + file.Header(&commands).Place(&segment); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + EXPECT_TRUE(reader.FindSegment("segment", &actual_segment)); + + EXPECT_CALL(reporter, MisplacedSectionData("empty", "segment")).Times(0); + + EXPECT_CALL(section_handler, + HandleSection(MatchSection(true, "empty", "segment", + empty.address().Value()))) + .WillOnce(Return(true)); + + EXPECT_TRUE(reader.WalkSegmentSections(actual_segment, §ion_handler)); +} + +TEST_F(LoadCommand, MisplacedSectionButSectionIsEmpty) { + WithConfiguration config(kLittleEndian, 64); + + // The segment. + LoadedSection segment; + segment.address() = 0x696d83cc; + segment.Append(10, '0'); + + // The contents of the following sections don't matter, because + // we're not really going to Place them in segment; we're just going + // to set all their labels by hand to get the (impossible) + // configurations we want. + + // A section that extends beyond the end of its section. + LoadedSection too_big; + too_big.Append(10, '3'); + too_big.start() = segment.start() + 1; + too_big.address() = segment.address() + 1; + too_big.final_size() = too_big.Size(); + + SegmentLoadCommand command; + command + .Header("segment", segment, 0x173baa29, 0x8407275d, 0xed8f7057) + .AppendSectionEntry("too big", "segment", 0, 0x8b53ae5c, too_big); + + LoadCommands commands; + commands.Place(&command); + + MachOFile file; + file.Header(&commands).Place(&segment); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + EXPECT_TRUE(reader.FindSegment("segment", &actual_segment)); + + EXPECT_CALL(reporter, MisplacedSectionData("too big", "segment")) + .WillOnce(Return()); + EXPECT_FALSE(reader.WalkSegmentSections(actual_segment, §ion_handler)); +} + + +// The segments in a .dSYM bundle's Mach-O file have their file offset +// and size set to zero, but the sections don't. The reader shouldn't +// report an error in this case. +TEST_F(LoadCommand, ZappedSegment) { + WithConfiguration config(kBigEndian, 32); + + // The segment. + LoadedSection segment; + segment.address() = 0x696d83cc; + segment.start() = 0; + segment.final_size() = 0; + + // The section. + LoadedSection section; + section.address() = segment.address(); + section.start() = 0; + section.final_size() = 1000; // extends beyond its segment + + SegmentLoadCommand command; + command + .Header("zapped", segment, 0x0861a5cb, 0x68ccff67, 0x0b66255c) + .AppendSectionEntry("twitching", "zapped", 0, 0x93b3bd42, section); + + LoadCommands commands; + commands.Place(&command); + + MachOFile file; + file.Header(&commands); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + EXPECT_TRUE(reader.FindSegment("zapped", &actual_segment)); + + ByteBuffer zapped_extent(NULL, 0); + EXPECT_CALL(section_handler, + HandleSection(MatchSection(false, "twitching", "zapped", + 0x696d83cc, 0, 0x93b3bd42, + zapped_extent))) + .WillOnce(Return(true)); + + EXPECT_TRUE(reader.WalkSegmentSections(actual_segment, §ion_handler)); +} + +TEST_F(LoadCommand, MapSegmentSections) { + WithConfiguration config(kLittleEndian, 32); + + // Create some sections with some data. + LoadedSection section1, section2, section3, section4; + section1.Append("buddha's hand"); + section2.start() = 0; // Section 2 is an S_ZEROFILL section. + section2.final_size() = 0; + section3.Append("shasta gold"); + section4.Append("satsuma"); + + // Create two segments to hold them. + LoadedSection segment1, segment2; + segment1.address() = 0x13e6c8a9; + segment1.Place(§ion3).Place(§ion1); + segment2.set_word_size(64); + segment2.address() = 0x04d462e2; + segment2.Place(§ion4); + section2.address() = segment2.address() + segment2.Size(); + + SegmentLoadCommand segment_command1, segment_command2; + segment_command1 + .Header("head", segment1, 0x67d955a6, 0x7a61c13e, 0xe3e50c64) + .AppendSectionEntry("mandarin", "head", 12, 0x5bb565d7, section1) + .AppendSectionEntry("bergamot", "head", 12, 0x8620de73, section3); + segment_command2.set_word_size(64); + segment_command2 + .Header("thorax", segment2, 0x7aab2419, 0xe908007f, 0x17961d33) + .AppendSectionEntry("sixteenprecisely", "thorax", + 12, S_ZEROFILL, section2) + .AppendSectionEntry("cara cara", "thorax", 12, 0xb6c5dd8a, section4); + + LoadCommands commands; + commands.Place(&segment_command1).Place(&segment_command2); + + MachOFile file; + file.Header(&commands).Place(&segment1).Place(&segment2); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment segment; + SectionMap section_map; + + EXPECT_FALSE(reader.FindSegment("smoot", &segment)); + + ASSERT_TRUE(reader.FindSegment("thorax", &segment)); + ASSERT_TRUE(reader.MapSegmentSections(segment, §ion_map)); + + EXPECT_FALSE(section_map.find("sixteenpreciselyandthensome") + != section_map.end()); + EXPECT_FALSE(section_map.find("mandarin") != section_map.end()); + ASSERT_TRUE(section_map.find("cara cara") != section_map.end()); + EXPECT_THAT(section_map["cara cara"], + MatchSection(true, "cara cara", "thorax", 0x04d462e2)); + ASSERT_TRUE(section_map.find("sixteenprecisely") + != section_map.end()); + ByteBuffer sixteenprecisely_contents(NULL, 0); + EXPECT_THAT(section_map["sixteenprecisely"], + MatchSection(true, "sixteenprecisely", "thorax", + 0x04d462e2 + 7, 12, S_ZEROFILL, + sixteenprecisely_contents)); + + ASSERT_TRUE(reader.FindSegment("head", &segment)); + ASSERT_TRUE(reader.MapSegmentSections(segment, §ion_map)); + + ASSERT_TRUE(section_map.find("mandarin") != section_map.end()); + EXPECT_THAT(section_map["mandarin"], + MatchSection(false, "mandarin", "head", 0x13e6c8a9 + 11)); + ASSERT_TRUE(section_map.find("bergamot") != section_map.end()); + EXPECT_THAT(section_map["bergamot"], + MatchSection(false, "bergamot", "head", 0x13e6c8a9)); +} + +TEST_F(LoadCommand, FindSegment) { + WithConfiguration config(kBigEndian, 32); + + LoadedSection segment1, segment2, segment3; + segment1.address() = 0xb8ae5752; + segment1.Append("Some contents!"); + segment2.address() = 0xd6b0ce83; + segment2.Append("Different stuff."); + segment3.address() = 0x7374fd2a; + segment3.Append("Further materials."); + + SegmentLoadCommand cmd1, cmd2, cmd3; + cmd1.Header("first", segment1, 0xfadb6932, 0x175bf529, 0x0de790ad); + cmd2.Header("second", segment2, 0xeef716e0, 0xe103a9d7, 0x7d38a8ef); + cmd3.Header("third", segment3, 0xe172b39e, 0x86012f07, 0x080ac94d); + + LoadCommands commands; + commands.Place(&cmd1).Place(&cmd2).Place(&cmd3); + + MachOFile file; + file.Header(&commands).Place(&segment1).Place(&segment2).Place(&segment3); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + Segment actual_segment; + + EXPECT_FALSE(reader.FindSegment("murphy", &actual_segment)); + + EXPECT_TRUE(reader.FindSegment("second", &actual_segment)); + EXPECT_EQ(0xd6b0ce83, actual_segment.vmaddr); +} + + +// Symtab tests. + +// A StringAssembler is a class for generating .stabstr sections to present +// as input to the STABS parser. +class StringAssembler: public SizedSection { + public: + // Add the string S to this StringAssembler, and return the string's + // offset within this compilation unit's strings. + size_t Add(const string& s) { + size_t offset = Size(); + AppendCString(s); + return offset; + } +}; + +// A SymbolAssembler is a class for generating .stab sections to present as +// test input for the STABS parser. +class SymbolAssembler: public SizedSection { + public: + // Create a SymbolAssembler that uses StringAssembler for its strings. + explicit SymbolAssembler(StringAssembler* string_assembler) + : string_assembler_(string_assembler), + entry_count_(0) { } + + // Append a STAB entry to the end of this section with the given + // characteristics. NAME is the offset of this entry's name string within + // its compilation unit's portion of the .stabstr section; this can be a + // value generated by a StringAssembler. Return a reference to this + // SymbolAssembler. + SymbolAssembler& Symbol(uint8_t type, uint8_t other, Label descriptor, + Label value, Label name) { + D32(name); + D8(type); + D8(other); + D16(descriptor); + Append(endianness(), word_size_ / 8, value); + entry_count_++; + return *this; + } + + // As above, but automatically add NAME to our StringAssembler. + SymbolAssembler& Symbol(uint8_t type, uint8_t other, Label descriptor, + Label value, const string& name) { + return Symbol(type, other, descriptor, value, string_assembler_->Add(name)); + } + + private: + // The strings for our STABS entries. + StringAssembler* string_assembler_; + + // The number of entries in this compilation unit so far. + size_t entry_count_; +}; + +class Symtab: public ReaderFixture, public Test { }; + +TEST_F(Symtab, Symtab32) { + WithConfiguration config(kLittleEndian, 32); + + StringAssembler strings; + SymbolAssembler symbols(&strings); + symbols + .Symbol(0x52, 0x7c, 0x3470, 0x9bb02e7c, "hrududu") + .Symbol(0x50, 0x90, 0x7520, 0x1122525d, "Frith"); + + SizedSection symtab_command; + symtab_command + .D32(LC_SYMTAB) // command + .D32(symtab_command.final_size()) // size + .D32(symbols.start()) // file offset of symbols + .D32(2) // symbol count + .D32(strings.start()) // file offset of strings + .D32(strings.final_size()); // strings size + + LoadCommands load_commands; + load_commands.Place(&symtab_command); + + MachOFile file; + file.Header(&load_commands).Place(&symbols).Place(&strings); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + ByteBuffer symbols_found, strings_found; + EXPECT_CALL(load_command_handler, SymtabCommand(_, _)) + .WillOnce(DoAll(SaveArg<0>(&symbols_found), + SaveArg<1>(&strings_found), + Return(true))); + EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler)); + + EXPECT_EQ(24U, symbols_found.Size()); + EXPECT_EQ(14U, strings_found.Size()); +} + +TEST_F(Symtab, Symtab64) { + WithConfiguration config(kBigEndian, 64); + + StringAssembler strings; + SymbolAssembler symbols(&strings); + symbols + .Symbol(0xa7, 0xaf, 0x03af, 0x42f3072c74335181ULL, "foo") + .Symbol(0xb0, 0x9a, 0x2aa7, 0x2e2d349b3d5744a0ULL, "bar"); + + SizedSection symtab_command; + symtab_command + .D32(LC_SYMTAB) // command + .D32(symtab_command.final_size()) // size + .D32(symbols.start()) // file offset of symbols + .D32(2) // symbol count + .D32(strings.start()) // file offset of strings + .D32(strings.final_size()); // strings size + + LoadCommands load_commands; + load_commands.Place(&symtab_command); + + MachOFile file; + file.Header(&load_commands).Place(&symbols).Place(&strings); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + ByteBuffer symbols_found, strings_found; + EXPECT_CALL(load_command_handler, SymtabCommand(_, _)) + .WillOnce(DoAll(SaveArg<0>(&symbols_found), + SaveArg<1>(&strings_found), + Return(true))); + EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler)); + + EXPECT_EQ(32U, symbols_found.Size()); + EXPECT_EQ(8U, strings_found.Size()); +} + +TEST_F(Symtab, SymtabMisplacedSymbols) { + WithConfiguration config(kBigEndian, 32); + + StringAssembler strings; + SymbolAssembler symbols(&strings); + symbols + .Symbol(0xa7, 0xaf, 0x03af, 0x42f3072c74335181ULL, "foo") + .Symbol(0xb0, 0x9a, 0x2aa7, 0x2e2d349b3d5744a0ULL, "bar"); + + SizedSection symtab_command; + symtab_command + .D32(LC_SYMTAB) // command + .D32(symtab_command.final_size()) // size + .D32(symbols.start()) // file offset of symbols + .D32(3) // symbol count (too many) + .D32(strings.start()) // file offset of strings + .D32(strings.final_size()); // strings size + + LoadCommands load_commands; + load_commands.Place(&symtab_command); + + MachOFile file; + // Put symbols at end, so the excessive length will be noticed. + file.Header(&load_commands).Place(&strings).Place(&symbols); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + EXPECT_CALL(reporter, MisplacedSymbolTable()).Times(1); + EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler)); +} + +TEST_F(Symtab, SymtabMisplacedStrings) { + WithConfiguration config(kLittleEndian, 32); + + StringAssembler strings; + SymbolAssembler symbols(&strings); + symbols + .Symbol(0xa7, 0xaf, 0x03af, 0x42f3072c74335181ULL, "foo") + .Symbol(0xb0, 0x9a, 0x2aa7, 0x2e2d349b3d5744a0ULL, "bar"); + + SizedSection symtab_command; + symtab_command + .D32(LC_SYMTAB) // command + .D32(symtab_command.final_size()) // size + .D32(symbols.start()) // file offset of symbols + .D32(2) // symbol count + .D32(strings.start()) // file offset of strings + .D32(strings.final_size() + 1); // strings size (too long) + + LoadCommands load_commands; + load_commands.Place(&symtab_command); + + MachOFile file; + // Put strings at end, so the excessive length will be noticed. + file.Header(&load_commands).Place(&symbols).Place(&strings); + + ReadFile(&file, true, CPU_TYPE_ANY, 0); + + EXPECT_CALL(reporter, MisplacedSymbolTable()).Times(1); + EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler)); +} + diff --git a/src/common/mac/macho_utilities.cc b/src/common/mac/macho_utilities.cc new file mode 100644 index 0000000..113e8d3 --- /dev/null +++ b/src/common/mac/macho_utilities.cc @@ -0,0 +1,158 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_utilties.cc: Utilities for dealing with mach-o files +// +// Author: Dave Camp + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/mac/byteswap.h" +#include "common/mac/macho_utilities.h" + +#include +#include + +void breakpad_swap_uuid_command(struct breakpad_uuid_command *uc) { + uc->cmd = ByteSwap(uc->cmd); + uc->cmdsize = ByteSwap(uc->cmdsize); +} + +void breakpad_swap_load_command(struct load_command *lc) { + lc->cmd = ByteSwap(lc->cmd); + lc->cmdsize = ByteSwap(lc->cmdsize); +} + +void breakpad_swap_dylib_command(struct dylib_command *dc) { + dc->cmd = ByteSwap(dc->cmd); + dc->cmdsize = ByteSwap(dc->cmdsize); + + dc->dylib.name.offset = ByteSwap(dc->dylib.name.offset); + dc->dylib.timestamp = ByteSwap(dc->dylib.timestamp); + dc->dylib.current_version = ByteSwap(dc->dylib.current_version); + dc->dylib.compatibility_version = ByteSwap(dc->dylib.compatibility_version); +} + +void breakpad_swap_segment_command(struct segment_command *sc) { + sc->cmd = ByteSwap(sc->cmd); + sc->cmdsize = ByteSwap(sc->cmdsize); + + sc->vmaddr = ByteSwap(sc->vmaddr); + sc->vmsize = ByteSwap(sc->vmsize); + sc->fileoff = ByteSwap(sc->fileoff); + sc->filesize = ByteSwap(sc->filesize); + sc->maxprot = ByteSwap(sc->maxprot); + sc->initprot = ByteSwap(sc->initprot); + sc->nsects = ByteSwap(sc->nsects); + sc->flags = ByteSwap(sc->flags); +} + +void breakpad_swap_segment_command_64(struct segment_command_64 *sg) { + sg->cmd = ByteSwap(sg->cmd); + sg->cmdsize = ByteSwap(sg->cmdsize); + + sg->vmaddr = ByteSwap(sg->vmaddr); + sg->vmsize = ByteSwap(sg->vmsize); + sg->fileoff = ByteSwap(sg->fileoff); + sg->filesize = ByteSwap(sg->filesize); + + sg->maxprot = ByteSwap(sg->maxprot); + sg->initprot = ByteSwap(sg->initprot); + sg->nsects = ByteSwap(sg->nsects); + sg->flags = ByteSwap(sg->flags); +} + +void breakpad_swap_fat_header(struct fat_header *fh) { + fh->magic = ByteSwap(fh->magic); + fh->nfat_arch = ByteSwap(fh->nfat_arch); +} + +void breakpad_swap_fat_arch(struct fat_arch *fa, uint32_t narchs) { + for (uint32_t i = 0; i < narchs; ++i) { + fa[i].cputype = ByteSwap(fa[i].cputype); + fa[i].cpusubtype = ByteSwap(fa[i].cpusubtype); + fa[i].offset = ByteSwap(fa[i].offset); + fa[i].size = ByteSwap(fa[i].size); + fa[i].align = ByteSwap(fa[i].align); + } +} + +void breakpad_swap_mach_header(struct mach_header *mh) { + mh->magic = ByteSwap(mh->magic); + mh->cputype = ByteSwap(mh->cputype); + mh->cpusubtype = ByteSwap(mh->cpusubtype); + mh->filetype = ByteSwap(mh->filetype); + mh->ncmds = ByteSwap(mh->ncmds); + mh->sizeofcmds = ByteSwap(mh->sizeofcmds); + mh->flags = ByteSwap(mh->flags); +} + +void breakpad_swap_mach_header_64(struct mach_header_64 *mh) { + mh->magic = ByteSwap(mh->magic); + mh->cputype = ByteSwap(mh->cputype); + mh->cpusubtype = ByteSwap(mh->cpusubtype); + mh->filetype = ByteSwap(mh->filetype); + mh->ncmds = ByteSwap(mh->ncmds); + mh->sizeofcmds = ByteSwap(mh->sizeofcmds); + mh->flags = ByteSwap(mh->flags); + mh->reserved = ByteSwap(mh->reserved); +} + +void breakpad_swap_section(struct section *s, + uint32_t nsects) { + for (uint32_t i = 0; i < nsects; i++) { + s[i].addr = ByteSwap(s[i].addr); + s[i].size = ByteSwap(s[i].size); + + s[i].offset = ByteSwap(s[i].offset); + s[i].align = ByteSwap(s[i].align); + s[i].reloff = ByteSwap(s[i].reloff); + s[i].nreloc = ByteSwap(s[i].nreloc); + s[i].flags = ByteSwap(s[i].flags); + s[i].reserved1 = ByteSwap(s[i].reserved1); + s[i].reserved2 = ByteSwap(s[i].reserved2); + } +} + +void breakpad_swap_section_64(struct section_64 *s, + uint32_t nsects) { + for (uint32_t i = 0; i < nsects; i++) { + s[i].addr = ByteSwap(s[i].addr); + s[i].size = ByteSwap(s[i].size); + + s[i].offset = ByteSwap(s[i].offset); + s[i].align = ByteSwap(s[i].align); + s[i].reloff = ByteSwap(s[i].reloff); + s[i].nreloc = ByteSwap(s[i].nreloc); + s[i].flags = ByteSwap(s[i].flags); + s[i].reserved1 = ByteSwap(s[i].reserved1); + s[i].reserved2 = ByteSwap(s[i].reserved2); + } +} diff --git a/src/common/mac/macho_utilities.h b/src/common/mac/macho_utilities.h new file mode 100644 index 0000000..470cb5d --- /dev/null +++ b/src/common/mac/macho_utilities.h @@ -0,0 +1,94 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_utilities.h: Utilities for dealing with mach-o files +// +// Author: Dave Camp + +#ifndef COMMON_MAC_MACHO_UTILITIES_H__ +#define COMMON_MAC_MACHO_UTILITIES_H__ + +#include +#include + +/* Some #defines and structs that aren't defined in older SDKs */ +#ifndef CPU_ARCH_ABI64 +# define CPU_ARCH_ABI64 0x01000000 +#endif + +#ifndef CPU_TYPE_X86 +# define CPU_TYPE_X86 CPU_TYPE_I386 +#endif + +#ifndef CPU_TYPE_POWERPC64 +# define CPU_TYPE_POWERPC64 (CPU_TYPE_POWERPC | CPU_ARCH_ABI64) +#endif + +#ifndef LC_UUID +# define LC_UUID 0x1b /* the uuid */ +#endif + +// The uuid_command struct/swap routines were added during the 10.4 series. +// Their presence isn't guaranteed. +struct breakpad_uuid_command { + uint32_t cmd; /* LC_UUID */ + uint32_t cmdsize; /* sizeof(struct uuid_command) */ + uint8_t uuid[16]; /* the 128-bit uuid */ +}; + +void breakpad_swap_uuid_command(struct breakpad_uuid_command *uc); + +void breakpad_swap_load_command(struct load_command *lc); + +void breakpad_swap_dylib_command(struct dylib_command *dc); + +// Older SDKs defines thread_state_data_t as an int[] instead +// of the natural_t[] it should be. +typedef natural_t breakpad_thread_state_data_t[THREAD_STATE_MAX]; + +void breakpad_swap_segment_command(struct segment_command *sc); + +// The 64-bit swap routines were added during the 10.4 series, their +// presence isn't guaranteed. +void breakpad_swap_segment_command_64(struct segment_command_64 *sg); + +void breakpad_swap_fat_header(struct fat_header *fh); + +void breakpad_swap_fat_arch(struct fat_arch *fa, uint32_t narchs); + +void breakpad_swap_mach_header(struct mach_header *mh); + +void breakpad_swap_mach_header_64(struct mach_header_64 *mh); + +void breakpad_swap_section(struct section *s, + uint32_t nsects); + +void breakpad_swap_section_64(struct section_64 *s, + uint32_t nsects); + +#endif diff --git a/src/common/mac/macho_walker.cc b/src/common/mac/macho_walker.cc new file mode 100644 index 0000000..4b9f56c --- /dev/null +++ b/src/common/mac/macho_walker.cc @@ -0,0 +1,270 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_walker.cc: Iterate over the load commands in a mach-o file +// +// See macho_walker.h for documentation +// +// Author: Dan Waylonis + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include + +#include "common/mac/arch_utilities.h" +#include "common/mac/byteswap.h" +#include "common/mac/macho_utilities.h" +#include "common/mac/macho_walker.h" + +namespace MacFileUtilities { + +MachoWalker::MachoWalker(const char* path, LoadCommandCallback callback, + void* context) + : file_(-1), + memory_(NULL), + memory_size_(0), + callback_(callback), + callback_context_(context), + current_header_(NULL), + current_header_size_(0), + current_header_offset_(0) { + file_ = open(path, O_RDONLY); +} + +MachoWalker::MachoWalker(void* memory, size_t size, + LoadCommandCallback callback, void* context) + : file_(-1), + memory_(memory), + memory_size_(size), + callback_(callback), + callback_context_(context), + current_header_(NULL), + current_header_size_(0), + current_header_offset_(0) { +} + +MachoWalker::~MachoWalker() { + if (file_ != -1) + close(file_); +} + +bool MachoWalker::WalkHeader(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) { + cpu_type_t valid_cpu_type = cpu_type; + cpu_subtype_t valid_cpu_subtype = cpu_subtype; + // if |cpu_type| is 0, use the native cpu type. + if (cpu_type == 0) { + ArchInfo arch = GetLocalArchInfo(); + valid_cpu_type = arch.cputype; + valid_cpu_subtype = CPU_SUBTYPE_MULTIPLE; + } + off_t offset; + if (FindHeader(valid_cpu_type, valid_cpu_subtype, offset)) { + if (cpu_type & CPU_ARCH_ABI64) + return WalkHeader64AtOffset(offset); + + return WalkHeaderAtOffset(offset); + } + + return false; +} + +bool MachoWalker::ReadBytes(void* buffer, size_t size, off_t offset) { + if (memory_) { + if (offset < 0) + return false; + bool result = true; + if (offset + size > memory_size_) { + if (static_cast(offset) >= memory_size_) + return false; + size = memory_size_ - static_cast(offset); + result = false; + } + memcpy(buffer, static_cast(memory_) + offset, size); + return result; + } else { + return pread(file_, buffer, size, offset) == (ssize_t)size; + } +} + +bool MachoWalker::CurrentHeader(struct mach_header_64* header, off_t* offset) { + if (current_header_) { + memcpy(header, current_header_, sizeof(mach_header_64)); + *offset = current_header_offset_; + return true; + } + + return false; +} + +bool MachoWalker::FindHeader(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + off_t& offset) { + // Read the magic bytes that's common amongst all mach-o files + uint32_t magic; + if (!ReadBytes(&magic, sizeof(magic), 0)) + return false; + + offset = sizeof(magic); + + // Figure out what type of file we've got + bool is_fat = false; + if (magic == FAT_MAGIC || magic == FAT_CIGAM) { + is_fat = true; + } + else if (magic != MH_MAGIC && magic != MH_CIGAM && magic != MH_MAGIC_64 && + magic != MH_CIGAM_64) { + return false; + } + + if (!is_fat) { + // If we don't have a fat header, check if the cpu type matches the single + // header + struct mach_header header; + if (!ReadBytes(&header, sizeof(header), 0)) + return false; + + if (magic == MH_CIGAM || magic == MH_CIGAM_64) + breakpad_swap_mach_header(&header); + + if (cpu_type != header.cputype || + (cpu_subtype != CPU_SUBTYPE_MULTIPLE && + cpu_subtype != header.cpusubtype)) { + return false; + } + + offset = 0; + return true; + } else { + // Read the fat header and find an appropriate architecture + offset = 0; + struct fat_header fat; + if (!ReadBytes(&fat, sizeof(fat), offset)) + return false; + + if (NXHostByteOrder() != NX_BigEndian) + breakpad_swap_fat_header(&fat); + + offset += sizeof(fat); + + // Search each architecture for the desired one + struct fat_arch arch; + for (uint32_t i = 0; i < fat.nfat_arch; ++i) { + if (!ReadBytes(&arch, sizeof(arch), offset)) + return false; + + if (NXHostByteOrder() != NX_BigEndian) + breakpad_swap_fat_arch(&arch, 1); + + if (arch.cputype == cpu_type && + (cpu_subtype == CPU_SUBTYPE_MULTIPLE || + arch.cpusubtype == cpu_subtype)) { + offset = arch.offset; + return true; + } + + offset += sizeof(arch); + } + } + + return false; +} + +bool MachoWalker::WalkHeaderAtOffset(off_t offset) { + struct mach_header header; + if (!ReadBytes(&header, sizeof(header), offset)) + return false; + + bool swap = (header.magic == MH_CIGAM); + if (swap) + breakpad_swap_mach_header(&header); + + // Copy the data into the mach_header_64 structure. Since the 32-bit and + // 64-bit only differ in the last field (reserved), this is safe to do. + struct mach_header_64 header64; + memcpy((void*)&header64, (const void*)&header, sizeof(header)); + header64.reserved = 0; + + current_header_ = &header64; + current_header_size_ = sizeof(header); // 32-bit, not 64-bit + current_header_offset_ = offset; + offset += current_header_size_; + bool result = WalkHeaderCore(offset, header.ncmds, swap); + current_header_ = NULL; + current_header_size_ = 0; + current_header_offset_ = 0; + return result; +} + +bool MachoWalker::WalkHeader64AtOffset(off_t offset) { + struct mach_header_64 header; + if (!ReadBytes(&header, sizeof(header), offset)) + return false; + + bool swap = (header.magic == MH_CIGAM_64); + if (swap) + breakpad_swap_mach_header_64(&header); + + current_header_ = &header; + current_header_size_ = sizeof(header); + current_header_offset_ = offset; + offset += current_header_size_; + bool result = WalkHeaderCore(offset, header.ncmds, swap); + current_header_ = NULL; + current_header_size_ = 0; + current_header_offset_ = 0; + return result; +} + +bool MachoWalker::WalkHeaderCore(off_t offset, uint32_t number_of_commands, + bool swap) { + for (uint32_t i = 0; i < number_of_commands; ++i) { + struct load_command cmd; + if (!ReadBytes(&cmd, sizeof(cmd), offset)) + return false; + + if (swap) + breakpad_swap_load_command(&cmd); + + // Call the user callback + if (callback_ && !callback_(this, &cmd, offset, swap, callback_context_)) + break; + + offset += cmd.cmdsize; + } + + return true; +} + +} // namespace MacFileUtilities diff --git a/src/common/mac/macho_walker.h b/src/common/mac/macho_walker.h new file mode 100644 index 0000000..13e8232 --- /dev/null +++ b/src/common/mac/macho_walker.h @@ -0,0 +1,118 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// macho_walker.h: Iterate over the load commands in a mach-o file +// +// Author: Dan Waylonis + +#ifndef COMMON_MAC_MACHO_WALKER_H__ +#define COMMON_MAC_MACHO_WALKER_H__ + +#include +#include +#include + +namespace MacFileUtilities { + +class MachoWalker { + public: + // A callback function executed when a new load command is read. If no + // further processing of load commands is desired, return false. Otherwise, + // return true. + // |cmd| is the current command, and |offset| is the location relative to the + // beginning of the file (not header) where the command was read. If |swap| + // is set, then any command data (other than the returned load_command) should + // be swapped when read + typedef bool (*LoadCommandCallback)(MachoWalker* walker, load_command* cmd, + off_t offset, bool swap, void* context); + + MachoWalker(const char* path, LoadCommandCallback callback, void* context); + MachoWalker(void* memory, size_t size, LoadCommandCallback callback, + void* context); + ~MachoWalker(); + + // Begin walking the header for |cpu_type| and |cpu_subtype|. If |cpu_type| + // is 0, then the native cpu type is used. Otherwise, accepted values are + // listed in /usr/include/mach/machine.h (e.g., CPU_TYPE_X86 or + // CPU_TYPE_POWERPC). If |cpu_subtype| is CPU_SUBTYPE_MULTIPLE, the match is + // only done on |cpu_type|. + // Returns false if opening the file failed or if the |cpu_type|/|cpu_subtype| + // is not present in the file. + bool WalkHeader(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype); + + // Read |size| bytes from the opened file at |offset| into |buffer| + bool ReadBytes(void* buffer, size_t size, off_t offset); + + // Return the current header and header offset + bool CurrentHeader(struct mach_header_64* header, off_t* offset); + + private: + // Locate (if any) the header offset for |cpu_type| and return in |offset|. + // Return true if found, false otherwise. + bool FindHeader(cpu_type_t cpu_type, + cpu_subtype_t cpu_subtype, + off_t& offset); + + // Process an individual header starting at |offset| from the start of the + // file. Return true if successful, false otherwise. + bool WalkHeaderAtOffset(off_t offset); + bool WalkHeader64AtOffset(off_t offset); + + // Bottleneck for walking the load commands + bool WalkHeaderCore(off_t offset, uint32_t number_of_commands, bool swap); + + // File descriptor to the opened file + int file_; + + // Memory location to read from. + void* memory_; + + // Size of the memory segment we can read from. + size_t memory_size_; + + // User specified callback & context + LoadCommandCallback callback_; + void* callback_context_; + + // Current header, size, and offset. The mach_header_64 is used for both + // 32-bit and 64-bit headers because they only differ in their last field + // (reserved). By adding the |current_header_size_| and the + // |current_header_offset_|, you can determine the offset in the file just + // after the header. + struct mach_header_64* current_header_; + unsigned long current_header_size_; + off_t current_header_offset_; + + private: + MachoWalker(const MachoWalker&); + MachoWalker& operator=(const MachoWalker&); +}; + +} // namespace MacFileUtilities + +#endif // COMMON_MAC_MACHO_WALKER_H__ diff --git a/src/common/mac/minidump_upload.m b/src/common/mac/minidump_upload.m new file mode 100644 index 0000000..d8e2b24 --- /dev/null +++ b/src/common/mac/minidump_upload.m @@ -0,0 +1,134 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_upload.m: Upload a minidump to a HTTP server. The upload is sent as +// a multipart/form-data POST request with the following parameters: +// prod: the product name +// ver: the product version +// symbol_file: the breakpad format symbol file + +#import + +#import + +#import "common/mac/HTTPMultipartUpload.h" + +typedef struct { + NSString* minidumpPath; + NSString* uploadURLStr; + NSString* product; + NSString* version; + BOOL success; +} Options; + +//============================================================================= +static void Start(Options* options) { + NSURL* url = [NSURL URLWithString:options->uploadURLStr]; + HTTPMultipartUpload* ul = [[HTTPMultipartUpload alloc] initWithURL:url]; + NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; + + // Add parameters + [parameters setObject:options->product forKey:@"prod"]; + [parameters setObject:options->version forKey:@"ver"]; + [ul setParameters:parameters]; + + // Add file + [ul addFileAtPath:options->minidumpPath name:@"upload_file_minidump"]; + + // Send it + NSError* error = nil; + NSData* data = [ul send:&error]; + NSString* result = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + + NSLog(@"Send: %@", error ? [error description] : @"No Error"); + NSLog(@"Response: %ld", (long)[[ul response] statusCode]); + NSLog(@"Result: %lu bytes\n%@", (unsigned long)[data length], result); + + [result release]; + [ul release]; + options->success = !error; +} + +//============================================================================= +static void Usage(int argc, const char* argv[]) { + fprintf(stderr, "Submit minidump information.\n"); + fprintf(stderr, + "Usage: %s -p -v " + "\n", + argv[0]); + fprintf(stderr, " should be a minidump.\n"); + fprintf(stderr, " is the destination for the upload\n"); + + fprintf(stderr, "\t-h: Usage\n"); + fprintf(stderr, "\t-?: Usage\n"); +} + +//============================================================================= +static void SetupOptions(int argc, const char* argv[], Options* options) { + extern int optind; + char ch; + + while ((ch = getopt(argc, (char* const*)argv, "p:v:h?")) != -1) { + switch (ch) { + case 'p': + options->product = [NSString stringWithUTF8String:optarg]; + break; + case 'v': + options->version = [NSString stringWithUTF8String:optarg]; + break; + + default: + Usage(argc, argv); + exit(0); + break; + } + } + + if ((argc - optind) != 2) { + fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]); + Usage(argc, argv); + exit(1); + } + + options->minidumpPath = [NSString stringWithUTF8String:argv[optind]]; + options->uploadURLStr = [NSString stringWithUTF8String:argv[optind + 1]]; +} + +//============================================================================= +int main(int argc, const char* argv[]) { + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + Options options; + + bzero(&options, sizeof(Options)); + SetupOptions(argc, argv, &options); + Start(&options); + + [pool release]; + return options.success ? 0 : 1; +} diff --git a/src/common/mac/scoped_task_suspend-inl.h b/src/common/mac/scoped_task_suspend-inl.h new file mode 100644 index 0000000..a4957d7 --- /dev/null +++ b/src/common/mac/scoped_task_suspend-inl.h @@ -0,0 +1,55 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Inline implementation of ScopedTaskSuspend, which suspends a Mach +// task for the duration of its scope. + +#ifndef GOOGLE_BREAKPAD_COMMON_MAC_SCOPED_TASK_SUSPEND_H_ +#define GOOGLE_BREAKPAD_COMMON_MAC_SCOPED_TASK_SUSPEND_H_ + +#include + +namespace google_breakpad { + +class ScopedTaskSuspend { + public: + explicit ScopedTaskSuspend(mach_port_t target) : target_(target) { + task_suspend(target_); + } + + ~ScopedTaskSuspend() { + task_resume(target_); + } + + private: + mach_port_t target_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_COMMON_MAC_SCOPED_TASK_SUSPEND_H_ diff --git a/src/common/mac/string_utilities.cc b/src/common/mac/string_utilities.cc new file mode 100644 index 0000000..3b83351 --- /dev/null +++ b/src/common/mac/string_utilities.cc @@ -0,0 +1,87 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/scoped_ptr.h" +#include "common/mac/string_utilities.h" + +namespace MacStringUtils { + +using google_breakpad::scoped_array; + +std::string ConvertToString(CFStringRef str) { + CFIndex length = CFStringGetLength(str); + std::string result; + + if (!length) + return result; + + CFIndex maxUTF8Length = + CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8); + scoped_array buffer(new UInt8[maxUTF8Length + 1]); + CFIndex actualUTF8Length; + CFStringGetBytes(str, CFRangeMake(0, length), kCFStringEncodingUTF8, 0, + false, buffer.get(), maxUTF8Length, &actualUTF8Length); + buffer[actualUTF8Length] = 0; + result.assign((const char*)buffer.get()); + + return result; +} + +unsigned int IntegerValueAtIndex(string& str, unsigned int idx) { + string digits("0123456789"), temp; + size_t start = 0; + size_t end; + size_t found = 0; + unsigned int result = 0; + + for (; found <= idx; ++found) { + end = str.find_first_not_of(digits, start); + + if (end == string::npos) + end = str.size(); + + temp = str.substr(start, end - start); + + if (found == idx) { + result = atoi(temp.c_str()); + } + + start = str.find_first_of(digits, end + 1); + + if (start == string::npos) + break; + } + + return result; +} + +} // namespace MacStringUtils diff --git a/src/common/mac/string_utilities.h b/src/common/mac/string_utilities.h new file mode 100644 index 0000000..de282a9 --- /dev/null +++ b/src/common/mac/string_utilities.h @@ -0,0 +1,51 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// string_utilities.h: Utilities for strings for Mac platform + +#ifndef COMMON_MAC_STRING_UTILITIES_H__ +#define COMMON_MAC_STRING_UTILITIES_H__ + +#include + +#include + +namespace MacStringUtils { + +using std::string; + +// Convert a CoreFoundation string into a std::string +string ConvertToString(CFStringRef str); + +// Return the idx'th decimal integer in str, separated by non-decimal-digits +// E.g., str = 10.4.8, idx = 1 -> 4 +unsigned int IntegerValueAtIndex(string& str, unsigned int idx); + +} // namespace MacStringUtils + +#endif // COMMON_MAC_STRING_UTILITIES_H__ diff --git a/src/common/mac/super_fat_arch.h b/src/common/mac/super_fat_arch.h new file mode 100644 index 0000000..046fe16 --- /dev/null +++ b/src/common/mac/super_fat_arch.h @@ -0,0 +1,87 @@ +// Copyright 2015 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Erik Chen + +// super_fat_arch.h: A class to handle 64-bit object files. Has conversions to +// and from struct fat_arch. + +#ifndef BREAKPAD_COMMON_MAC_SUPER_FAT_ARCH_H_ +#define BREAKPAD_COMMON_MAC_SUPER_FAT_ARCH_H_ + +#include +#include +#include + +// Similar to struct fat_arch, except size-related parameters support +// 64-bits. +class SuperFatArch { + public: + uint32_t cputype; + uint32_t cpusubtype; + uint64_t offset; + uint64_t size; + uint64_t align; + + SuperFatArch() : + cputype(0), + cpusubtype(0), + offset(0), + size(0), + align(0) { + } + + explicit SuperFatArch(const struct fat_arch& arch) : + cputype(arch.cputype), + cpusubtype(arch.cpusubtype), + offset(arch.offset), + size(arch.size), + align(arch.align) { + } + + // Returns false if the conversion cannot be made. + // If the conversion succeeds, the result is placed in |output_arch|. + bool ConvertToFatArch(struct fat_arch* output_arch) const { + if (offset > std::numeric_limits::max()) + return false; + if (size > std::numeric_limits::max()) + return false; + if (align > std::numeric_limits::max()) + return false; + struct fat_arch arch; + arch.cputype = cputype; + arch.cpusubtype = cpusubtype; + arch.offset = offset; + arch.size = size; + arch.align = align; + *output_arch = arch; + return true; + } +}; + +#endif // BREAKPAD_COMMON_MAC_SUPER_FAT_ARCH_H_ diff --git a/src/common/mac/testing/GTMSenTestCase.h b/src/common/mac/testing/GTMSenTestCase.h new file mode 100644 index 0000000..cfef3ef --- /dev/null +++ b/src/common/mac/testing/GTMSenTestCase.h @@ -0,0 +1,1110 @@ +// +// GTMSenTestCase.h +// +// Copyright 2007-2008 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +// Portions of this file fall under the following license, marked with +// SENTE_BEGIN - SENTE_END +// +// Copyright (c) 1997-2005, Sen:te (Sente SA). All rights reserved. +// +// Use of this source code is governed by the following license: +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL Sente SA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +// OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Note: this license is equivalent to the FreeBSD license. +// +// This notice may not be removed from this file. + +// Some extra test case macros that would have been convenient for SenTestingKit +// to provide. I didn't stick GTM in front of the Macro names, so that they would +// be easy to remember. + +#import "GTMDefines.h" + +#if (!GTM_IPHONE_SDK) || (GTM_IPHONE_USE_SENTEST) +#import +#else +#import +#ifdef __cplusplus +extern "C" { +#endif + +#if defined __clang__ +// gcc and gcc-llvm do not allow you to use STAssert(blah, nil) with nil +// as a description if you have the NS_FORMAT_FUNCTION on. +// clang however will not compile without warnings if you don't have it. +NSString *STComposeString(NSString *, ...) NS_FORMAT_FUNCTION(1, 2); +#else +NSString *STComposeString(NSString *, ...); +#endif // __clang__ + +#ifdef __cplusplus +} +#endif + +#endif // !GTM_IPHONE_SDK || GTM_IPHONE_USE_SENTEST + +// Generates a failure when a1 != noErr +// Args: +// a1: should be either an OSErr or an OSStatus +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNoErr(a1, description, ...) \ +do { \ + @try { \ + OSStatus a1value = (a1); \ + if (a1value != noErr) { \ + NSString *_expression = [NSString stringWithFormat:@"Expected noErr, got %ld for (%s)", (long)a1value, #a1]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == noErr fails", #a1] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +// Generates a failure when a1 != a2 +// Args: +// a1: received value. Should be either an OSErr or an OSStatus +// a2: expected value. Should be either an OSErr or an OSStatus +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertErr(a1, a2, description, ...) \ +do { \ + @try { \ + OSStatus a1value = (a1); \ + OSStatus a2value = (a2); \ + if (a1value != a2value) { \ + NSString *_expression = [NSString stringWithFormat:@"Expected %s(%ld) but got %ld for (%s)", #a2, (long)a2value, (long)a1value, #a1]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s) fails", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + + +// Generates a failure when a1 is NULL +// Args: +// a1: should be a pointer (use STAssertNotNil for an object) +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNotNULL(a1, description, ...) \ +do { \ + @try { \ + __typeof__(a1) a1value = (a1); \ + if (a1value == (__typeof__(a1))NULL) { \ + NSString *_expression = [NSString stringWithFormat:@"((%s) != NULL)", #a1]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != NULL fails", #a1] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +// Generates a failure when a1 is not NULL +// Args: +// a1: should be a pointer (use STAssertNil for an object) +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNULL(a1, description, ...) \ +do { \ + @try { \ + __typeof__(a1) a1value = (a1); \ + if (a1value != (__typeof__(a1))NULL) { \ + NSString *_expression = [NSString stringWithFormat:@"((%s) == NULL)", #a1]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == NULL fails", #a1] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +// Generates a failure when a1 is equal to a2. This test is for C scalars, +// structs and unions. +// Args: +// a1: argument 1 +// a2: argument 2 +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNotEquals(a1, a2, description, ...) \ +do { \ + @try { \ + if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \ + } else { \ + __typeof__(a1) a1value = (a1); \ + __typeof__(a2) a2value = (a2); \ + NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \ + NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \ + if ([a1encoded isEqualToValue:a2encoded]) { \ + NSString *_expression = [NSString stringWithFormat:@"((%s) != (%s))", #a1, #a2]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ + }\ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +// Generates a failure when a1 is equal to a2. This test is for objects. +// Args: +// a1: argument 1. object. +// a2: argument 2. object. +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNotEqualObjects(a1, a2, description, ...) \ +do { \ + @try {\ + id a1value = (a1); \ + id a2value = (a2); \ + if ( (strcmp(@encode(__typeof__(a1value)), @encode(id)) == 0) && \ + (strcmp(@encode(__typeof__(a2value)), @encode(id)) == 0) && \ + (![(id)a1value isEqual:(id)a2value]) ) continue; \ + [self failWithException:([NSException failureInEqualityBetweenObject:a1value \ + andObject:a2value \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ + }\ + @catch (id anException) {\ + [self failWithException:([NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ + }\ +} while(0) + +// Generates a failure when a1 is not 'op' to a2. This test is for C scalars. +// Args: +// a1: argument 1 +// a2: argument 2 +// op: operation +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertOperation(a1, a2, op, description, ...) \ +do { \ + @try { \ + if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \ + } else { \ + __typeof__(a1) a1value = (a1); \ + __typeof__(a2) a2value = (a2); \ + if (!(a1value op a2value)) { \ + double a1DoubleValue = a1value; \ + double a2DoubleValue = a2value; \ + NSString *_expression = [NSString stringWithFormat:@"(%s (%lg) %s %s (%lg))", #a1, a1DoubleValue, #op, #a2, a2DoubleValue]; \ + [self failWithException:([NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)])]; \ + } \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException \ + failureInRaise:[NSString stringWithFormat:@"(%s) %s (%s)", #a1, #op, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +// Generates a failure when a1 is not > a2. This test is for C scalars. +// Args: +// a1: argument 1 +// a2: argument 2 +// op: operation +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertGreaterThan(a1, a2, description, ...) \ + STAssertOperation(a1, a2, >, description, ##__VA_ARGS__) + +// Generates a failure when a1 is not >= a2. This test is for C scalars. +// Args: +// a1: argument 1 +// a2: argument 2 +// op: operation +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertGreaterThanOrEqual(a1, a2, description, ...) \ + STAssertOperation(a1, a2, >=, description, ##__VA_ARGS__) + +// Generates a failure when a1 is not < a2. This test is for C scalars. +// Args: +// a1: argument 1 +// a2: argument 2 +// op: operation +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertLessThan(a1, a2, description, ...) \ + STAssertOperation(a1, a2, <, description, ##__VA_ARGS__) + +// Generates a failure when a1 is not <= a2. This test is for C scalars. +// Args: +// a1: argument 1 +// a2: argument 2 +// op: operation +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertLessThanOrEqual(a1, a2, description, ...) \ + STAssertOperation(a1, a2, <=, description, ##__VA_ARGS__) + +// Generates a failure when string a1 is not equal to string a2. This call +// differs from STAssertEqualObjects in that strings that are different in +// composition (precomposed vs decomposed) will compare equal if their final +// representation is equal. +// ex O + umlaut decomposed is the same as O + umlaut composed. +// Args: +// a1: string 1 +// a2: string 2 +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertEqualStrings(a1, a2, description, ...) \ +do { \ + @try { \ + id a1value = (a1); \ + id a2value = (a2); \ + if (a1value == a2value) continue; \ + if ([a1value isKindOfClass:[NSString class]] && \ + [a2value isKindOfClass:[NSString class]] && \ + [a1value compare:a2value options:0] == NSOrderedSame) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject:a1value \ + andObject:a2value \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +// Generates a failure when string a1 is equal to string a2. This call +// differs from STAssertEqualObjects in that strings that are different in +// composition (precomposed vs decomposed) will compare equal if their final +// representation is equal. +// ex O + umlaut decomposed is the same as O + umlaut composed. +// Args: +// a1: string 1 +// a2: string 2 +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNotEqualStrings(a1, a2, description, ...) \ +do { \ + @try { \ + id a1value = (a1); \ + id a2value = (a2); \ + if ([a1value isKindOfClass:[NSString class]] && \ + [a2value isKindOfClass:[NSString class]] && \ + [a1value compare:a2value options:0] != NSOrderedSame) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject:a1value \ + andObject:a2value \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +// Generates a failure when c-string a1 is not equal to c-string a2. +// Args: +// a1: string 1 +// a2: string 2 +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertEqualCStrings(a1, a2, description, ...) \ +do { \ + @try { \ + const char* a1value = (a1); \ + const char* a2value = (a2); \ + if (a1value == a2value) continue; \ + if (strcmp(a1value, a2value) == 0) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject:[NSString stringWithUTF8String:a1value] \ + andObject:[NSString stringWithUTF8String:a2value] \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +// Generates a failure when c-string a1 is equal to c-string a2. +// Args: +// a1: string 1 +// a2: string 2 +// description: A format string as in the printf() function. Can be nil or +// an empty string but must be present. +// ...: A variable number of arguments to the format string. Can be absent. +#define STAssertNotEqualCStrings(a1, a2, description, ...) \ +do { \ + @try { \ + const char* a1value = (a1); \ + const char* a2value = (a2); \ + if (strcmp(a1value, a2value) != 0) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject:[NSString stringWithUTF8String:a1value] \ + andObject:[NSString stringWithUTF8String:a2value] \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +/*" Generates a failure when a1 is not equal to a2 within + or - accuracy is false. + This test is for GLKit types (GLKVector, GLKMatrix) where small differences + could make these items not exactly equal. Do not use this version directly. + Use the explicit STAssertEqualGLKVectors and STAssertEqualGLKMatrices defined + below. + _{a1 The GLKType on the left.} + _{a2 The GLKType on the right.} + _{accuracy The maximum difference between a1 and a2 for these values to be + considered equal.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ + +#define STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ...) \ +do { \ + @try { \ + if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \ + } else { \ + __typeof__(a1) a1GLKValue = (a1); \ + __typeof__(a2) a2GLKValue = (a2); \ + __typeof__(accuracy) accuracyvalue = (accuracy); \ + float *a1FloatValue = ((float*)&a1GLKValue); \ + float *a2FloatValue = ((float*)&a2GLKValue); \ + for (size_t i = 0; i < sizeof(__typeof__(a1)) / sizeof(float); ++i) { \ + float a1value = a1FloatValue[i]; \ + float a2value = a2FloatValue[i]; \ + if (STAbsoluteDifference(a1value, a2value) > accuracyvalue) { \ + NSMutableArray *strings = [NSMutableArray arrayWithCapacity:sizeof(a1) / sizeof(float)]; \ + NSString *string; \ + for (size_t j = 0; j < sizeof(__typeof__(a1)) / sizeof(float); ++j) { \ + string = [NSString stringWithFormat:@"(%0.3f == %0.3f)", a1FloatValue[j], a2FloatValue[j]]; \ + [strings addObject:string]; \ + } \ + string = [strings componentsJoinedByString:@", "]; \ + NSString *desc = STComposeString(description, ##__VA_ARGS__); \ + desc = [NSString stringWithFormat:@"%@ With Accuracy %0.3f: %@", string, (float)accuracyvalue, desc]; \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", desc]]; \ + break; \ + } \ + } \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +#define STAssertEqualGLKVectors(a1, a2, accuracy, description, ...) \ + STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__) + +#define STAssertEqualGLKMatrices(a1, a2, accuracy, description, ...) \ + STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__) + +#define STAssertEqualGLKQuaternions(a1, a2, accuracy, description, ...) \ + STInternalAssertEqualGLKVectorsOrMatrices(a1, a2, accuracy, description, ##__VA_ARGS__) + +#if GTM_IPHONE_SDK && !GTM_IPHONE_USE_SENTEST +// When not using the Xcode provided version, define everything ourselves. + +// SENTE_BEGIN +/*" Generates a failure when !{ [a1 isEqualTo:a2] } is false + (or one is nil and the other is not). + _{a1 The object on the left.} + _{a2 The object on the right.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertEqualObjects(a1, a2, description, ...) \ +do { \ + @try { \ + id a1value = (a1); \ + id a2value = (a2); \ + if (a1value == a2value) continue; \ + if ((strcmp(@encode(__typeof__(a1value)), @encode(id)) == 0) && \ + (strcmp(@encode(__typeof__(a2value)), @encode(id)) == 0) && \ + [(id)a1value isEqual:(id)a2value]) continue; \ + [self failWithException:[NSException failureInEqualityBetweenObject:a1value \ + andObject:a2value \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + + +/*" Generates a failure when a1 is not equal to a2. This test is for + C scalars, structs and unions. + _{a1 The argument on the left.} + _{a2 The argument on the right.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertEquals(a1, a2, description, ...) \ +do { \ + @try { \ + if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \ + } else { \ + __typeof__(a1) a1value = (a1); \ + __typeof__(a2) a2value = (a2); \ + NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \ + NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \ + if (![a1encoded isEqualToValue:a2encoded]) { \ + [self failWithException:[NSException failureInEqualityBetweenValue:a1encoded \ + andValue:a2encoded \ + withAccuracy:nil \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + +#define STAbsoluteDifference(left,right) (MAX(left,right)-MIN(left,right)) + + +/*" Generates a failure when a1 is not equal to a2 within + or - accuracy is false. + This test is for scalars such as floats and doubles where small differences + could make these items not exactly equal, but also works for all scalars. + _{a1 The scalar on the left.} + _{a2 The scalar on the right.} + _{accuracy The maximum difference between a1 and a2 for these values to be + considered equal.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ + +#define STAssertEqualsWithAccuracy(a1, a2, accuracy, description, ...) \ +do { \ + @try { \ + if (strcmp(@encode(__typeof__(a1)), @encode(__typeof__(a2)))) { \ + [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"Type mismatch -- %@", STComposeString(description, ##__VA_ARGS__)]]; \ + } else { \ + __typeof__(a1) a1value = (a1); \ + __typeof__(a2) a2value = (a2); \ + __typeof__(accuracy) accuracyvalue = (accuracy); \ + if (STAbsoluteDifference(a1value, a2value) > accuracyvalue) { \ + NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \ + NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \ + NSValue *accuracyencoded = [NSValue value:&accuracyvalue withObjCType:@encode(__typeof__(accuracy))]; \ + [self failWithException:[NSException failureInEqualityBetweenValue:a1encoded \ + andValue:a2encoded \ + withAccuracy:accuracyencoded \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s)", #a1, #a2] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + + + +/*" Generates a failure unconditionally. + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STFail(description, ...) \ +[self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]] + + + +/*" Generates a failure when a1 is not nil. + _{a1 An object.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertNil(a1, description, ...) \ +do { \ + @try { \ + id a1value = (a1); \ + if (a1value != nil) { \ + NSString *_a1 = [NSString stringWithUTF8String:#a1]; \ + NSString *_expression = [NSString stringWithFormat:@"((%@) == nil)", _a1]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == nil fails", #a1] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + + +/*" Generates a failure when a1 is nil. + _{a1 An object.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertNotNil(a1, description, ...) \ +do { \ + @try { \ + id a1value = (a1); \ + if (a1value == nil) { \ + NSString *_a1 = [NSString stringWithUTF8String:#a1]; \ + NSString *_expression = [NSString stringWithFormat:@"((%@) != nil)", _a1]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != nil fails", #a1] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while(0) + + +/*" Generates a failure when expression evaluates to false. + _{expr The expression that is tested.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertTrue(expr, description, ...) \ +do { \ + BOOL _evaluatedExpression = (expr); \ + if (!_evaluatedExpression) { \ + NSString *_expression = [NSString stringWithUTF8String:#expr]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while (0) + + +/*" Generates a failure when expression evaluates to false and in addition will + generate error messages if an exception is encountered. + _{expr The expression that is tested.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertTrueNoThrow(expr, description, ...) \ +do { \ + @try { \ + BOOL _evaluatedExpression = (expr); \ + if (!_evaluatedExpression) { \ + NSString *_expression = [NSString stringWithUTF8String:#expr]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:NO \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) ", #expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while (0) + + +/*" Generates a failure when the expression evaluates to true. + _{expr The expression that is tested.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertFalse(expr, description, ...) \ +do { \ + BOOL _evaluatedExpression = (expr); \ + if (_evaluatedExpression) { \ + NSString *_expression = [NSString stringWithUTF8String:#expr]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:YES \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while (0) + + +/*" Generates a failure when the expression evaluates to true and in addition + will generate error messages if an exception is encountered. + _{expr The expression that is tested.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertFalseNoThrow(expr, description, ...) \ +do { \ + @try { \ + BOOL _evaluatedExpression = (expr); \ + if (_evaluatedExpression) { \ + NSString *_expression = [NSString stringWithUTF8String:#expr]; \ + [self failWithException:[NSException failureInCondition:_expression \ + isTrue:YES \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"!(%s) ", #expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while (0) + + +/*" Generates a failure when expression does not throw an exception. + _{expression The expression that is evaluated.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent. +"*/ +#define STAssertThrows(expr, description, ...) \ +do { \ + @try { \ + (expr); \ + } \ + @catch (id anException) { \ + continue; \ + } \ + [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:nil \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ +} while (0) + + +/*" Generates a failure when expression does not throw an exception of a + specific class. + _{expression The expression that is evaluated.} + _{specificException The specified class of the exception.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertThrowsSpecific(expr, specificException, description, ...) \ +do { \ + @try { \ + (expr); \ + } \ + @catch (specificException *anException) { \ + continue; \ + } \ + @catch (id anException) { \ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \ + [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ + continue; \ + } \ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \ + [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:nil \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ +} while (0) + + +/*" Generates a failure when expression does not throw an exception of a + specific class with a specific name. Useful for those frameworks like + AppKit or Foundation that throw generic NSException w/specific names + (NSInvalidArgumentException, etc). + _{expression The expression that is evaluated.} + _{specificException The specified class of the exception.} + _{aName The name of the specified exception.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} + +"*/ +#define STAssertThrowsSpecificNamed(expr, specificException, aName, description, ...) \ +do { \ + @try { \ + (expr); \ + } \ + @catch (specificException *anException) { \ + if ([aName isEqualToString:[anException name]]) continue; \ + NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description); \ + [self failWithException: \ + [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ + continue; \ + } \ + @catch (id anException) { \ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \ + [self failWithException: \ + [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ + continue; \ + } \ + NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description); \ + [self failWithException: \ + [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:nil \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ +} while (0) + + +/*" Generates a failure when expression does throw an exception. + _{expression The expression that is evaluated.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertNoThrow(expr, description, ...) \ +do { \ + @try { \ + (expr); \ + } \ + @catch (id anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ +} while (0) + + +/*" Generates a failure when expression does throw an exception of the specitied + class. Any other exception is okay (i.e. does not generate a failure). + _{expression The expression that is evaluated.} + _{specificException The specified class of the exception.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} +"*/ +#define STAssertNoThrowSpecific(expr, specificException, description, ...) \ +do { \ + @try { \ + (expr); \ + } \ + @catch (specificException *anException) { \ + [self failWithException:[NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(description, ##__VA_ARGS__)]]; \ + } \ + @catch (id anythingElse) { \ + ; \ + } \ +} while (0) + + +/*" Generates a failure when expression does throw an exception of a + specific class with a specific name. Useful for those frameworks like + AppKit or Foundation that throw generic NSException w/specific names + (NSInvalidArgumentException, etc). + _{expression The expression that is evaluated.} + _{specificException The specified class of the exception.} + _{aName The name of the specified exception.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} + +"*/ +#define STAssertNoThrowSpecificNamed(expr, specificException, aName, description, ...) \ +do { \ + @try { \ + (expr); \ + } \ + @catch (specificException *anException) { \ + if ([aName isEqualToString:[anException name]]) { \ + NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description); \ + [self failWithException: \ + [NSException failureInRaise:[NSString stringWithUTF8String:#expr] \ + exception:anException \ + inFile:[NSString stringWithUTF8String:__FILE__] \ + atLine:__LINE__ \ + withDescription:@"%@", STComposeString(_descrip, ##__VA_ARGS__)]]; \ + } \ + continue; \ + } \ + @catch (id anythingElse) { \ + ; \ + } \ +} while (0) + + + +@interface NSException (GTMSenTestAdditions) ++ (NSException *)failureInFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(3, 4); ++ (NSException *)failureInCondition:(NSString *)condition + isTrue:(BOOL)isTrue + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(5, 6); ++ (NSException *)failureInEqualityBetweenObject:(id)left + andObject:(id)right + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(5, 6); ++ (NSException *)failureInEqualityBetweenValue:(NSValue *)left + andValue:(NSValue *)right + withAccuracy:(NSValue *)accuracy + inFile:(NSString *)filename + atLine:(int) ineNumber + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(6, 7); ++ (NSException *)failureInRaise:(NSString *)expression + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(4, 5); ++ (NSException *)failureInRaise:(NSString *)expression + exception:(NSException *)exception + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... NS_FORMAT_FUNCTION(5, 6); +@end + +// SENTE_END + +@protocol SenTestCase ++ (id)testCaseWithInvocation:(NSInvocation *)anInvocation; +- (id)initWithInvocation:(NSInvocation *)anInvocation; +- (void)setUp; +- (void)invokeTest; +- (void)tearDown; +- (void)performTest; +- (void)failWithException:(NSException*)exception; +- (NSInvocation *)invocation; +- (SEL)selector; ++ (NSArray *)testInvocations; +@end + +@interface SenTestCase : NSObject { + @private + NSInvocation *invocation_; +} +@end + +GTM_EXTERN NSString *const SenTestFailureException; + +GTM_EXTERN NSString *const SenTestFilenameKey; +GTM_EXTERN NSString *const SenTestLineNumberKey; + +#endif // GTM_IPHONE_SDK && !GTM_IPHONE_USE_SENTEST + +// All unittest cases in GTM should inherit from GTMTestCase. It makes sure +// to set up our logging system correctly to verify logging calls. +// See GTMUnitTestDevLog.h for details +@interface GTMTestCase : SenTestCase + +// Returns YES if this is an abstract testCase class as opposed to a concrete +// testCase class that you want tests run against. SenTestCase is not designed +// out of the box to handle an abstract class hierarchy descending from it with +// some concrete subclasses. In some cases we want all the "concrete" +// subclasses of an abstract subclass of SenTestCase to run a test, but we don't +// want that test to be run against an instance of an abstract subclass itself. +// By returning "YES" here, the tests defined by this class won't be run against +// an instance of this class. As an example class hierarchy: +// +// FooExtensionTestCase +// GTMTestCase <- ExtensionAbstractTestCase < +// BarExtensionTestCase +// +// So FooExtensionTestCase and BarExtensionTestCase inherit from +// ExtensionAbstractTestCase (and probably FooExtension and BarExtension inherit +// from a class named Extension). We want the tests in ExtensionAbstractTestCase +// to be run as part of FooExtensionTestCase and BarExtensionTestCase, but we +// don't want them run against ExtensionAbstractTestCase. The default +// implementation checks to see if the name of the class contains the word +// "AbstractTest" (case sensitive). ++ (BOOL)isAbstractTestCase; + +@end diff --git a/src/common/mac/testing/GTMSenTestCase.m b/src/common/mac/testing/GTMSenTestCase.m new file mode 100644 index 0000000..eb9351b --- /dev/null +++ b/src/common/mac/testing/GTMSenTestCase.m @@ -0,0 +1,428 @@ +// +// GTMSenTestCase.m +// +// Copyright 2007-2008 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMSenTestCase.h" + +#import +#if GTM_IPHONE_SIMULATOR +#import +#endif + +#import "GTMObjC2Runtime.h" +#import "GTMUnitTestDevLog.h" + +#if GTM_IPHONE_SDK && !GTM_IPHONE_USE_SENTEST +#import + +@interface NSException (GTMSenTestPrivateAdditions) ++ (NSException *)failureInFile:(NSString *)filename + atLine:(int)lineNumber + reason:(NSString *)reason; +@end + +@implementation NSException (GTMSenTestPrivateAdditions) ++ (NSException *)failureInFile:(NSString *)filename + atLine:(int)lineNumber + reason:(NSString *)reason { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInteger:lineNumber], SenTestLineNumberKey, + filename, SenTestFilenameKey, + nil]; + + return [self exceptionWithName:SenTestFailureException + reason:reason + userInfo:userInfo]; +} +@end + +@implementation NSException (GTMSenTestAdditions) + ++ (NSException *)failureInFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason = testDescription; + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + ++ (NSException *)failureInCondition:(NSString *)condition + isTrue:(BOOL)isTrue + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason = [NSString stringWithFormat:@"'%@' should be %s. %@", + condition, isTrue ? "false" : "true", testDescription]; + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + ++ (NSException *)failureInEqualityBetweenObject:(id)left + andObject:(id)right + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason = + [NSString stringWithFormat:@"'%@' should be equal to '%@'. %@", + [left description], [right description], testDescription]; + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + ++ (NSException *)failureInEqualityBetweenValue:(NSValue *)left + andValue:(NSValue *)right + withAccuracy:(NSValue *)accuracy + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason; + if (accuracy) { + reason = + [NSString stringWithFormat:@"'%@' should be equal to '%@'. %@", + left, right, testDescription]; + } else { + reason = + [NSString stringWithFormat:@"'%@' should be equal to '%@' +/-'%@'. %@", + left, right, accuracy, testDescription]; + } + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + ++ (NSException *)failureInRaise:(NSString *)expression + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason = [NSString stringWithFormat:@"'%@' should raise. %@", + expression, testDescription]; + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + ++ (NSException *)failureInRaise:(NSString *)expression + exception:(NSException *)exception + inFile:(NSString *)filename + atLine:(int)lineNumber + withDescription:(NSString *)formatString, ... { + + NSString *testDescription = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + testDescription = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + + NSString *reason; + if ([[exception name] isEqualToString:SenTestFailureException]) { + // it's our exception, assume it has the right description on it. + reason = [exception reason]; + } else { + // not one of our exception, use the exceptions reason and our description + reason = [NSString stringWithFormat:@"'%@' raised '%@'. %@", + expression, [exception reason], testDescription]; + } + + return [self failureInFile:filename atLine:lineNumber reason:reason]; +} + +@end + +NSString *STComposeString(NSString *formatString, ...) { + NSString *reason = @""; + if (formatString) { + va_list vl; + va_start(vl, formatString); + reason = + [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease]; + va_end(vl); + } + return reason; +} + +NSString *const SenTestFailureException = @"SenTestFailureException"; +NSString *const SenTestFilenameKey = @"SenTestFilenameKey"; +NSString *const SenTestLineNumberKey = @"SenTestLineNumberKey"; + +@interface SenTestCase (SenTestCasePrivate) +// our method of logging errors ++ (void)printException:(NSException *)exception fromTestName:(NSString *)name; +@end + +@implementation SenTestCase ++ (id)testCaseWithInvocation:(NSInvocation *)anInvocation { + return [[[self alloc] initWithInvocation:anInvocation] autorelease]; +} + +- (id)initWithInvocation:(NSInvocation *)anInvocation { + if ((self = [super init])) { + invocation_ = [anInvocation retain]; + } + return self; +} + +- (void)dealloc { + [invocation_ release]; + [super dealloc]; +} + +- (void)failWithException:(NSException*)exception { + [exception raise]; +} + +- (void)setUp { +} + +- (void)performTest { + @try { + [self invokeTest]; + } @catch (NSException *exception) { + [[self class] printException:exception + fromTestName:NSStringFromSelector([self selector])]; + [exception raise]; + } +} + +- (NSInvocation *)invocation { + return invocation_; +} + +- (SEL)selector { + return [invocation_ selector]; +} + ++ (void)printException:(NSException *)exception fromTestName:(NSString *)name { + NSDictionary *userInfo = [exception userInfo]; + NSString *filename = [userInfo objectForKey:SenTestFilenameKey]; + NSNumber *lineNumber = [userInfo objectForKey:SenTestLineNumberKey]; + NSString *className = NSStringFromClass([self class]); + if ([filename length] == 0) { + filename = @"Unknown.m"; + } + fprintf(stderr, "%s:%ld: error: -[%s %s] : %s\n", + [filename UTF8String], + (long)[lineNumber integerValue], + [className UTF8String], + [name UTF8String], + [[exception reason] UTF8String]); + fflush(stderr); +} + +- (void)invokeTest { + NSException *e = nil; + @try { + // Wrap things in autorelease pools because they may + // have an STMacro in their dealloc which may get called + // when the pool is cleaned up + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + // We don't log exceptions here, instead we let the person that called + // this log the exception. This ensures they are only logged once but the + // outer layers get the exceptions to report counts, etc. + @try { + [self setUp]; + @try { + NSInvocation *invocation = [self invocation]; +#if GTM_IPHONE_SIMULATOR + // We don't call [invocation invokeWithTarget:self]; because of + // Radar 8081169: NSInvalidArgumentException can't be caught + // It turns out that on iOS4 (and 3.2) exceptions thrown inside an + // [invocation invoke] on the simulator cannot be caught. + // http://openradar.appspot.com/8081169 + objc_msgSend(self, [invocation selector]); +#else + [invocation invokeWithTarget:self]; +#endif + } @catch (NSException *exception) { + e = [exception retain]; + } + [self tearDown]; + } @catch (NSException *exception) { + e = [exception retain]; + } + [pool release]; + } @catch (NSException *exception) { + e = [exception retain]; + } + if (e) { + [e autorelease]; + [e raise]; + } +} + +- (void)tearDown { +} + +- (NSString *)description { + // This matches the description OCUnit would return to you + return [NSString stringWithFormat:@"-[%@ %@]", [self class], + NSStringFromSelector([self selector])]; +} + +// Used for sorting methods below +static int MethodSort(id a, id b, void *context) { + NSInvocation *invocationA = a; + NSInvocation *invocationB = b; + const char *nameA = sel_getName([invocationA selector]); + const char *nameB = sel_getName([invocationB selector]); + return strcmp(nameA, nameB); +} + + ++ (NSArray *)testInvocations { + NSMutableArray *invocations = nil; + // Need to walk all the way up the parent classes collecting methods (in case + // a test is a subclass of another test). + Class senTestCaseClass = [SenTestCase class]; + for (Class currentClass = self; + currentClass && (currentClass != senTestCaseClass); + currentClass = class_getSuperclass(currentClass)) { + unsigned int methodCount; + Method *methods = class_copyMethodList(currentClass, &methodCount); + if (methods) { + // This handles disposing of methods for us even if an exception should fly. + [NSData dataWithBytesNoCopy:methods + length:sizeof(Method) * methodCount]; + if (!invocations) { + invocations = [NSMutableArray arrayWithCapacity:methodCount]; + } + for (size_t i = 0; i < methodCount; ++i) { + Method currMethod = methods[i]; + SEL sel = method_getName(currMethod); + char *returnType = NULL; + const char *name = sel_getName(sel); + // If it starts with test, takes 2 args (target and sel) and returns + // void run it. + if (strstr(name, "test") == name) { + returnType = method_copyReturnType(currMethod); + if (returnType) { + // This handles disposing of returnType for us even if an + // exception should fly. Length +1 for the terminator, not that + // the length really matters here, as we never reference inside + // the data block. + [NSData dataWithBytesNoCopy:returnType + length:strlen(returnType) + 1]; + } + } + // TODO: If a test class is a subclass of another, and they reuse the + // same selector name (ie-subclass overrides it), this current loop + // and test here will cause cause it to get invoked twice. To fix this + // the selector would have to be checked against all the ones already + // added, so it only gets done once. + if (returnType // True if name starts with "test" + && strcmp(returnType, @encode(void)) == 0 + && method_getNumberOfArguments(currMethod) == 2) { + NSMethodSignature *sig = [self instanceMethodSignatureForSelector:sel]; + NSInvocation *invocation + = [NSInvocation invocationWithMethodSignature:sig]; + [invocation setSelector:sel]; + [invocations addObject:invocation]; + } + } + } + } + // Match SenTestKit and run everything in alphbetical order. + [invocations sortUsingFunction:MethodSort context:nil]; + return invocations; +} + +@end + +#endif // GTM_IPHONE_SDK && !GTM_IPHONE_USE_SENTEST + +@implementation GTMTestCase : SenTestCase +- (void)invokeTest { + NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init]; + Class devLogClass = NSClassFromString(@"GTMUnitTestDevLog"); + if (devLogClass) { + [devLogClass performSelector:@selector(enableTracking)]; + [devLogClass performSelector:@selector(verifyNoMoreLogsExpected)]; + + } + [super invokeTest]; + if (devLogClass) { + [devLogClass performSelector:@selector(verifyNoMoreLogsExpected)]; + [devLogClass performSelector:@selector(disableTracking)]; + } + [localPool drain]; +} + ++ (BOOL)isAbstractTestCase { + NSString *name = NSStringFromClass(self); + return [name rangeOfString:@"AbstractTest"].location != NSNotFound; +} + ++ (NSArray *)testInvocations { + NSArray *invocations = nil; + if (![self isAbstractTestCase]) { + invocations = [super testInvocations]; + } + return invocations; +} + +@end diff --git a/src/common/macros.h b/src/common/macros.h new file mode 100644 index 0000000..828d49d --- /dev/null +++ b/src/common/macros.h @@ -0,0 +1,44 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef BREAKPAD_COMMON_MACROS_H_ +#define BREAKPAD_COMMON_MACROS_H_ + +// Ensure that this macro definition stays in a private header file: clang +// suggests the first macro expanding to [[clang::fallthrough]] in its +// diagnostics, so if BP_FALLTHROUGH is visible in code depending on breakpad, +// clang would suggest BP_FALLTHROUGH for code depending on breakpad, instead of +// the client code's own fallthrough macro. +// TODO(thakis): Once everyone uses C++17, use its [[fallthrough]] instead. +#if defined(__clang__) +#define BP_FALLTHROUGH [[clang::fallthrough]] +#else +#define BP_FALLTHROUGH +#endif + +#endif // BREAKPAD_COMMON_MACROS_H_ diff --git a/src/common/md5.cc b/src/common/md5.cc new file mode 100644 index 0000000..86298f4 --- /dev/null +++ b/src/common/md5.cc @@ -0,0 +1,255 @@ +/* + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "common/md5.h" + +namespace google_breakpad { + +#ifndef WORDS_BIGENDIAN +#define byteReverse(buf, len) /* Nothing */ +#else +/* + * Note: this code is harmless on little-endian machines. + */ +static void byteReverse(unsigned char *buf, unsigned longs) +{ + u32 t; + do { + t = (u32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(u32*) buf = t; + buf += 4; + } while (--longs); +} +#endif + +static void MD5Transform(u32 buf[4], u32 const in[16]); + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +void MD5Init(struct MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +void MD5Update(struct MD5Context *ctx, unsigned char const *buf, size_t len) +{ + u32 t; + + /* Update bitcount */ + + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((u32) len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if (t) { + unsigned char *p = (unsigned char*) ctx->in + t; + + t = 64 - t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (u32*) ctx->in); + buf += t; + len -= t; + } + /* Process data in 64-byte chunks */ + + while (len >= 64) { + memcpy(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (u32*) ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + memcpy(ctx->in, buf, len); +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +void MD5Final(unsigned char digest[16], struct MD5Context *ctx) +{ + unsigned count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (u32*) ctx->in); + + /* Now fill the next block with 56 bytes */ + memset(ctx->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); + } + byteReverse(ctx->in, 14); + + /* Append length in bits and transform */ + memcpy(&ctx->in[14], &ctx->bits[0], sizeof(u32)); + memcpy(&ctx->in[15], &ctx->bits[1], sizeof(u32)); + + MD5Transform(ctx->buf, (u32*) ctx->in); + byteReverse((unsigned char*) ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ +} + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void MD5Transform(u32 buf[4], u32 const in[16]) +{ + u32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +} // namespace google_breakpad + diff --git a/src/common/md5.h b/src/common/md5.h new file mode 100644 index 0000000..9d1f59b --- /dev/null +++ b/src/common/md5.h @@ -0,0 +1,28 @@ +// Copyright 2007 Google LLC +// Author: liuli@google.com (Liu Li) +#ifndef COMMON_MD5_H__ +#define COMMON_MD5_H__ + +#include +#include + +namespace google_breakpad { + +typedef uint32_t u32; +typedef uint8_t u8; + +struct MD5Context { + u32 buf[4]; + u32 bits[2]; + u8 in[64]; +}; + +void MD5Init(struct MD5Context *ctx); + +void MD5Update(struct MD5Context *ctx, unsigned char const *buf, size_t len); + +void MD5Final(unsigned char digest[16], struct MD5Context *ctx); + +} // namespace google_breakpad + +#endif // COMMON_MD5_H__ diff --git a/src/common/memory_allocator.h b/src/common/memory_allocator.h new file mode 100644 index 0000000..1c99913 --- /dev/null +++ b/src/common/memory_allocator.h @@ -0,0 +1,251 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_COMMON_MEMORY_ALLOCATOR_H_ +#define GOOGLE_BREAKPAD_COMMON_MEMORY_ALLOCATOR_H_ + +#include +#include +#include +#include + +#include +#include + +#if defined(MEMORY_SANITIZER) +#include +#endif + +#ifdef __APPLE__ +#define sys_mmap mmap +#define sys_munmap munmap +#define MAP_ANONYMOUS MAP_ANON +#else +#include "third_party/lss/linux_syscall_support.h" +#endif + +namespace google_breakpad { + +// This is very simple allocator which fetches pages from the kernel directly. +// Thus, it can be used even when the heap may be corrupted. +// +// There is no free operation. The pages are only freed when the object is +// destroyed. +class PageAllocator { + public: + PageAllocator() + : page_size_(getpagesize()), + last_(NULL), + current_page_(NULL), + page_offset_(0), + pages_allocated_(0) { + } + + ~PageAllocator() { + FreeAll(); + } + + void* Alloc(size_t bytes) { + if (!bytes) + return NULL; + + if (current_page_ && page_size_ - page_offset_ >= bytes) { + uint8_t* const ret = current_page_ + page_offset_; + page_offset_ += bytes; + if (page_offset_ == page_size_) { + page_offset_ = 0; + current_page_ = NULL; + } + + return ret; + } + + const size_t pages = + (bytes + sizeof(PageHeader) + page_size_ - 1) / page_size_; + uint8_t* const ret = GetNPages(pages); + if (!ret) + return NULL; + + page_offset_ = + (page_size_ - (page_size_ * pages - (bytes + sizeof(PageHeader)))) % + page_size_; + current_page_ = page_offset_ ? ret + page_size_ * (pages - 1) : NULL; + + return ret + sizeof(PageHeader); + } + + // Checks whether the page allocator owns the passed-in pointer. + // This method exists for testing pursposes only. + bool OwnsPointer(const void* p) { + for (PageHeader* header = last_; header; header = header->next) { + const char* current = reinterpret_cast(header); + if ((p >= current) && (p < current + header->num_pages * page_size_)) + return true; + } + + return false; + } + + unsigned long pages_allocated() { return pages_allocated_; } + + private: + uint8_t* GetNPages(size_t num_pages) { + void* a = sys_mmap(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (a == MAP_FAILED) + return NULL; + +#if defined(MEMORY_SANITIZER) + // We need to indicate to MSan that memory allocated through sys_mmap is + // initialized, since linux_syscall_support.h doesn't have MSan hooks. + __msan_unpoison(a, page_size_ * num_pages); +#endif + + struct PageHeader* header = reinterpret_cast(a); + header->next = last_; + header->num_pages = num_pages; + last_ = header; + + pages_allocated_ += num_pages; + + return reinterpret_cast(a); + } + + void FreeAll() { + PageHeader* next; + + for (PageHeader* cur = last_; cur; cur = next) { + next = cur->next; + sys_munmap(cur, cur->num_pages * page_size_); + } + } + + struct PageHeader { + PageHeader* next; // pointer to the start of the next set of pages. + size_t num_pages; // the number of pages in this set. + }; + + const size_t page_size_; + PageHeader* last_; + uint8_t* current_page_; + size_t page_offset_; + unsigned long pages_allocated_; +}; + +// Wrapper to use with STL containers +template +struct PageStdAllocator { + using AllocatorTraits = std::allocator_traits>; + using value_type = typename AllocatorTraits::value_type; + using pointer = typename AllocatorTraits::pointer; + using difference_type = typename AllocatorTraits::difference_type; + using size_type = typename AllocatorTraits::size_type; + + explicit PageStdAllocator(PageAllocator& allocator) : allocator_(allocator), + stackdata_(NULL), + stackdata_size_(0) + {} + + template PageStdAllocator(const PageStdAllocator& other) + : allocator_(other.allocator_), + stackdata_(nullptr), + stackdata_size_(0) + {} + + explicit PageStdAllocator(PageAllocator& allocator, + pointer stackdata, + size_type stackdata_size) : allocator_(allocator), + stackdata_(stackdata), + stackdata_size_(stackdata_size) + {} + + inline pointer allocate(size_type n, const void* = 0) { + const size_type size = sizeof(T) * n; + if (size <= stackdata_size_) { + return stackdata_; + } + return static_cast(allocator_.Alloc(size)); + } + + inline void deallocate(pointer, size_type) { + // The PageAllocator doesn't free. + } + + template struct rebind { + typedef PageStdAllocator other; + }; + + private: + // Silly workaround for the gcc from Android's ndk (gcc 4.6), which will + // otherwise complain that `other.allocator_` is private in the constructor + // code. + template friend struct PageStdAllocator; + + PageAllocator& allocator_; + pointer stackdata_; + size_type stackdata_size_; +}; + +// A wasteful vector is a std::vector, except that it allocates memory from a +// PageAllocator. It's wasteful because, when resizing, it always allocates a +// whole new array since the PageAllocator doesn't support realloc. +template +class wasteful_vector : public std::vector > { + public: + wasteful_vector(PageAllocator* allocator, unsigned size_hint = 16) + : std::vector >(PageStdAllocator(*allocator)) { + std::vector >::reserve(size_hint); + } + protected: + wasteful_vector(PageStdAllocator allocator) + : std::vector >(allocator) {} +}; + +// auto_wasteful_vector allocates space on the stack for N entries to avoid +// using the PageAllocator for small data, while still allowing for larger data. +template +class auto_wasteful_vector : public wasteful_vector { + T stackdata_[N]; + public: + auto_wasteful_vector(PageAllocator* allocator) + : wasteful_vector( + PageStdAllocator(*allocator, + &stackdata_[0], + sizeof(stackdata_))) { + std::vector >::reserve(N); + } +}; + +} // namespace google_breakpad + +inline void* operator new(size_t nbytes, + google_breakpad::PageAllocator& allocator) { + return allocator.Alloc(nbytes); +} + +#endif // GOOGLE_BREAKPAD_COMMON_MEMORY_ALLOCATOR_H_ diff --git a/src/common/memory_allocator_unittest.cc b/src/common/memory_allocator_unittest.cc new file mode 100644 index 0000000..8ef6891 --- /dev/null +++ b/src/common/memory_allocator_unittest.cc @@ -0,0 +1,127 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "breakpad_googletest_includes.h" +#include "common/memory_allocator.h" + +using namespace google_breakpad; + +namespace { +typedef testing::Test PageAllocatorTest; +} + +TEST(PageAllocatorTest, Setup) { + PageAllocator allocator; + EXPECT_EQ(0U, allocator.pages_allocated()); +} + +TEST(PageAllocatorTest, SmallObjects) { + PageAllocator allocator; + + EXPECT_EQ(0U, allocator.pages_allocated()); + for (unsigned i = 1; i < 1024; ++i) { + uint8_t* p = reinterpret_cast(allocator.Alloc(i)); + ASSERT_FALSE(p == NULL); + memset(p, 0, i); + } +} + +TEST(PageAllocatorTest, LargeObject) { + PageAllocator allocator; + + EXPECT_EQ(0U, allocator.pages_allocated()); + uint8_t* p = reinterpret_cast(allocator.Alloc(10000)); + ASSERT_FALSE(p == NULL); + EXPECT_EQ(3U, allocator.pages_allocated()); + for (unsigned i = 1; i < 10; ++i) { + uint8_t* p = reinterpret_cast(allocator.Alloc(i)); + ASSERT_FALSE(p == NULL); + memset(p, 0, i); + } +} + +namespace { +typedef testing::Test WastefulVectorTest; +} + +TEST(WastefulVectorTest, Setup) { + PageAllocator allocator_; + wasteful_vector v(&allocator_); + ASSERT_TRUE(v.empty()); + ASSERT_EQ(v.size(), 0u); +} + +TEST(WastefulVectorTest, Simple) { + PageAllocator allocator_; + EXPECT_EQ(0U, allocator_.pages_allocated()); + wasteful_vector v(&allocator_); + + for (unsigned i = 0; i < 256; ++i) { + v.push_back(i); + ASSERT_EQ(i, v.back()); + ASSERT_EQ(&v.back(), &v[i]); + } + ASSERT_FALSE(v.empty()); + ASSERT_EQ(v.size(), 256u); + EXPECT_EQ(1U, allocator_.pages_allocated()); + for (unsigned i = 0; i < 256; ++i) + ASSERT_EQ(v[i], i); +} + +TEST(WastefulVectorTest, UsesPageAllocator) { + PageAllocator allocator_; + wasteful_vector v(&allocator_); + EXPECT_EQ(1U, allocator_.pages_allocated()); + + v.push_back(1); + ASSERT_TRUE(allocator_.OwnsPointer(&v[0])); +} + +TEST(WastefulVectorTest, AutoWastefulVector) { + PageAllocator allocator_; + EXPECT_EQ(0U, allocator_.pages_allocated()); + + auto_wasteful_vector v(&allocator_); + EXPECT_EQ(0U, allocator_.pages_allocated()); + + v.push_back(1); + EXPECT_EQ(0U, allocator_.pages_allocated()); + EXPECT_FALSE(allocator_.OwnsPointer(&v[0])); + + v.resize(4); + EXPECT_EQ(0U, allocator_.pages_allocated()); + EXPECT_FALSE(allocator_.OwnsPointer(&v[0])); + + v.resize(10); + EXPECT_EQ(1U, allocator_.pages_allocated()); + EXPECT_TRUE(allocator_.OwnsPointer(&v[0])); +} diff --git a/src/common/memory_range.h b/src/common/memory_range.h new file mode 100644 index 0000000..e2ab61d --- /dev/null +++ b/src/common/memory_range.h @@ -0,0 +1,144 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// memory_range.h: Define the google_breakpad::MemoryRange class, which +// is a lightweight wrapper with a pointer and a length to encapsulate +// a contiguous range of memory. + +#ifndef COMMON_MEMORY_RANGE_H_ +#define COMMON_MEMORY_RANGE_H_ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +// A lightweight wrapper with a pointer and a length to encapsulate a +// contiguous range of memory. It provides helper methods for checked +// access of a subrange of the memory. Its implemementation does not +// allocate memory or call into libc functions, and is thus safer to use +// in a crashed environment. +class MemoryRange { + public: + MemoryRange() : data_(NULL), length_(0) {} + + MemoryRange(const void* data, size_t length) { + Set(data, length); + } + + // Returns true if this memory range contains no data. + bool IsEmpty() const { + // Set() guarantees that |length_| is zero if |data_| is NULL. + return length_ == 0; + } + + // Resets to an empty range. + void Reset() { + data_ = NULL; + length_ = 0; + } + + // Sets this memory range to point to |data| and its length to |length|. + void Set(const void* data, size_t length) { + data_ = reinterpret_cast(data); + // Always set |length_| to zero if |data_| is NULL. + length_ = data ? length : 0; + } + + // Returns true if this range covers a subrange of |sub_length| bytes + // at |sub_offset| bytes of this memory range, or false otherwise. + bool Covers(size_t sub_offset, size_t sub_length) const { + // The following checks verify that: + // 1. sub_offset is within [ 0 .. length_ - 1 ] + // 2. sub_offset + sub_length is within + // [ sub_offset .. length_ ] + return sub_offset < length_ && + sub_offset + sub_length >= sub_offset && + sub_offset + sub_length <= length_; + } + + // Returns a raw data pointer to a subrange of |sub_length| bytes at + // |sub_offset| bytes of this memory range, or NULL if the subrange + // is out of bounds. + const void* GetData(size_t sub_offset, size_t sub_length) const { + return Covers(sub_offset, sub_length) ? (data_ + sub_offset) : NULL; + } + + // Same as the two-argument version of GetData() but uses sizeof(DataType) + // as the subrange length and returns an |DataType| pointer for convenience. + template + const DataType* GetData(size_t sub_offset) const { + return reinterpret_cast( + GetData(sub_offset, sizeof(DataType))); + } + + // Returns a raw pointer to the |element_index|-th element of an array + // of elements of length |element_size| starting at |sub_offset| bytes + // of this memory range, or NULL if the element is out of bounds. + const void* GetArrayElement(size_t element_offset, + size_t element_size, + unsigned element_index) const { + size_t sub_offset = element_offset + element_index * element_size; + return GetData(sub_offset, element_size); + } + + // Same as the three-argument version of GetArrayElement() but deduces + // the element size using sizeof(ElementType) and returns an |ElementType| + // pointer for convenience. + template + const ElementType* GetArrayElement(size_t element_offset, + unsigned element_index) const { + return reinterpret_cast( + GetArrayElement(element_offset, sizeof(ElementType), element_index)); + } + + // Returns a subrange of |sub_length| bytes at |sub_offset| bytes of + // this memory range, or an empty range if the subrange is out of bounds. + MemoryRange Subrange(size_t sub_offset, size_t sub_length) const { + return Covers(sub_offset, sub_length) ? + MemoryRange(data_ + sub_offset, sub_length) : MemoryRange(); + } + + // Returns a pointer to the beginning of this memory range. + const uint8_t* data() const { return data_; } + + // Returns the length, in bytes, of this memory range. + size_t length() const { return length_; } + + private: + // Pointer to the beginning of this memory range. + const uint8_t* data_; + + // Length, in bytes, of this memory range. + size_t length_; +}; + +} // namespace google_breakpad + +#endif // COMMON_MEMORY_RANGE_H_ diff --git a/src/common/memory_range_unittest.cc b/src/common/memory_range_unittest.cc new file mode 100644 index 0000000..f081d67 --- /dev/null +++ b/src/common/memory_range_unittest.cc @@ -0,0 +1,196 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// memory_range_unittest.cc: Unit tests for google_breakpad::MemoryRange. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "breakpad_googletest_includes.h" +#include "common/memory_range.h" + +using google_breakpad::MemoryRange; +using testing::Message; + +namespace { + +const uint32_t kBuffer[10] = { 0 }; +const size_t kBufferSize = sizeof(kBuffer); +const uint8_t* kBufferPointer = reinterpret_cast(kBuffer); + +// Test vectors for verifying Covers, GetData, and Subrange. +const struct { + bool valid; + size_t offset; + size_t length; +} kSubranges[] = { + { true, 0, 0 }, + { true, 0, 2 }, + { true, 0, kBufferSize }, + { true, 2, 0 }, + { true, 2, 4 }, + { true, 2, kBufferSize - 2 }, + { true, kBufferSize - 1, 1 }, + { false, kBufferSize, 0 }, + { false, kBufferSize, static_cast(-1) }, + { false, kBufferSize + 1, 0 }, + { false, static_cast(-1), 2 }, + { false, 1, kBufferSize }, + { false, kBufferSize - 1, 2 }, + { false, 0, static_cast(-1) }, + { false, 1, static_cast(-1) }, +}; +const size_t kNumSubranges = sizeof(kSubranges) / sizeof(kSubranges[0]); + +// Test vectors for verifying GetArrayElement. +const struct { + size_t offset; + size_t size; + size_t index; + const void* const pointer; +} kElements[] = { + // Valid array elemenets + { 0, 1, 0, kBufferPointer }, + { 0, 1, 1, kBufferPointer + 1 }, + { 0, 1, kBufferSize - 1, kBufferPointer + kBufferSize - 1 }, + { 0, 2, 1, kBufferPointer + 2 }, + { 0, 4, 2, kBufferPointer + 8 }, + { 0, 4, 9, kBufferPointer + 36 }, + { kBufferSize - 1, 1, 0, kBufferPointer + kBufferSize - 1 }, + // Invalid array elemenets + { 0, 1, kBufferSize, NULL }, + { 0, 4, 10, NULL }, + { kBufferSize - 1, 1, 1, NULL }, + { kBufferSize - 1, 2, 0, NULL }, + { kBufferSize, 1, 0, NULL }, +}; +const size_t kNumElements = sizeof(kElements) / sizeof(kElements[0]); + +} // namespace + +TEST(MemoryRangeTest, DefaultConstructor) { + MemoryRange range; + EXPECT_EQ(NULL, range.data()); + EXPECT_EQ(0U, range.length()); +} + +TEST(MemoryRangeTest, ConstructorWithDataAndLength) { + MemoryRange range(kBuffer, kBufferSize); + EXPECT_EQ(kBufferPointer, range.data()); + EXPECT_EQ(kBufferSize, range.length()); +} + +TEST(MemoryRangeTest, Reset) { + MemoryRange range; + range.Reset(); + EXPECT_EQ(NULL, range.data()); + EXPECT_EQ(0U, range.length()); + + range.Set(kBuffer, kBufferSize); + EXPECT_EQ(kBufferPointer, range.data()); + EXPECT_EQ(kBufferSize, range.length()); + + range.Reset(); + EXPECT_EQ(NULL, range.data()); + EXPECT_EQ(0U, range.length()); +} + +TEST(MemoryRangeTest, Set) { + MemoryRange range; + range.Set(kBuffer, kBufferSize); + EXPECT_EQ(kBufferPointer, range.data()); + EXPECT_EQ(kBufferSize, range.length()); + + range.Set(NULL, 0); + EXPECT_EQ(NULL, range.data()); + EXPECT_EQ(0U, range.length()); +} + +TEST(MemoryRangeTest, SubrangeOfEmptyMemoryRange) { + MemoryRange range; + MemoryRange subrange = range.Subrange(0, 10); + EXPECT_EQ(NULL, subrange.data()); + EXPECT_EQ(0U, subrange.length()); +} + +TEST(MemoryRangeTest, SubrangeAndGetData) { + MemoryRange range(kBuffer, kBufferSize); + for (size_t i = 0; i < kNumSubranges; ++i) { + bool valid = kSubranges[i].valid; + size_t sub_offset = kSubranges[i].offset; + size_t sub_length = kSubranges[i].length; + SCOPED_TRACE(Message() << "offset=" << sub_offset + << ", length=" << sub_length); + + MemoryRange subrange = range.Subrange(sub_offset, sub_length); + if (valid) { + EXPECT_TRUE(range.Covers(sub_offset, sub_length)); + EXPECT_EQ(kBufferPointer + sub_offset, + range.GetData(sub_offset, sub_length)); + EXPECT_EQ(kBufferPointer + sub_offset, subrange.data()); + EXPECT_EQ(sub_length, subrange.length()); + } else { + EXPECT_FALSE(range.Covers(sub_offset, sub_length)); + EXPECT_EQ(NULL, range.GetData(sub_offset, sub_length)); + EXPECT_EQ(NULL, subrange.data()); + EXPECT_EQ(0U, subrange.length()); + } + } +} + +TEST(MemoryRangeTest, GetDataWithTemplateType) { + MemoryRange range(kBuffer, kBufferSize); + const char* char_pointer = range.GetData(0); + EXPECT_EQ(reinterpret_cast(kBufferPointer), char_pointer); + const int* int_pointer = range.GetData(0); + EXPECT_EQ(reinterpret_cast(kBufferPointer), int_pointer); +} + +TEST(MemoryRangeTest, GetArrayElement) { + MemoryRange range(kBuffer, kBufferSize); + for (size_t i = 0; i < kNumElements; ++i) { + size_t element_offset = kElements[i].offset; + size_t element_size = kElements[i].size; + unsigned element_index = kElements[i].index; + const void* const element_pointer = kElements[i].pointer; + SCOPED_TRACE(Message() << "offset=" << element_offset + << ", size=" << element_size + << ", index=" << element_index); + EXPECT_EQ(element_pointer, range.GetArrayElement( + element_offset, element_size, element_index)); + } +} + +TEST(MemoryRangeTest, GetArrayElmentWithTemplateType) { + MemoryRange range(kBuffer, kBufferSize); + const char* char_pointer = range.GetArrayElement(0, 0); + EXPECT_EQ(reinterpret_cast(kBufferPointer), char_pointer); + const int* int_pointer = range.GetArrayElement(0, 0); + EXPECT_EQ(reinterpret_cast(kBufferPointer), int_pointer); +} diff --git a/src/common/minidump_type_helper.h b/src/common/minidump_type_helper.h new file mode 100644 index 0000000..04bafe7 --- /dev/null +++ b/src/common/minidump_type_helper.h @@ -0,0 +1,55 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_TYPE_HELPER_H_ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_TYPE_HELPER_H_ + +#include + +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +template +struct MDTypeHelper; + +template <> +struct MDTypeHelper { + typedef MDRawDebug32 MDRawDebug; + typedef MDRawLinkMap32 MDRawLinkMap; +}; + +template <> +struct MDTypeHelper { + typedef MDRawDebug64 MDRawDebug; + typedef MDRawLinkMap64 MDRawLinkMap; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_TYPE_HELPER_H_ diff --git a/src/common/module.cc b/src/common/module.cc new file mode 100644 index 0000000..0eb5aad --- /dev/null +++ b/src/common/module.cc @@ -0,0 +1,502 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// module.cc: Implement google_breakpad::Module. See module.h. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/module.h" +#include "common/string_view.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace google_breakpad { + +using std::dec; +using std::hex; +using std::unique_ptr; + +Module::InlineOrigin* Module::InlineOriginMap::GetOrCreateInlineOrigin( + uint64_t offset, + StringView name) { + uint64_t specification_offset = references_[offset]; + // Find the root offset. + auto iter = references_.find(specification_offset); + while (iter != references_.end() && + specification_offset != references_[specification_offset]) { + specification_offset = references_[specification_offset]; + iter = references_.find(specification_offset); + } + if (inline_origins_.find(specification_offset) != inline_origins_.end()) { + if (inline_origins_[specification_offset]->name == "") { + inline_origins_[specification_offset]->name = name; + } + return inline_origins_[specification_offset]; + } + inline_origins_[specification_offset] = new Module::InlineOrigin(name); + return inline_origins_[specification_offset]; +} + +void Module::InlineOriginMap::SetReference(uint64_t offset, + uint64_t specification_offset) { + // If we haven't seen this doesn't exist in reference map, always add it. + if (references_.find(offset) == references_.end()) { + references_[offset] = specification_offset; + return; + } + // If offset equals specification_offset and offset exists in + // references_, there is no need to update the references_ map. + // This early return is necessary because the call to erase in following if + // will remove the entry of specification_offset in inline_origins_. If + // specification_offset equals to references_[offset], it might be + // duplicate debug info. + if (offset == specification_offset || + specification_offset == references_[offset]) + return; + + // Fix up mapping in inline_origins_. + auto remove = inline_origins_.find(references_[offset]); + if (remove != inline_origins_.end()) { + inline_origins_[specification_offset] = std::move(remove->second); + inline_origins_.erase(remove); + } + references_[offset] = specification_offset; +} + +Module::Module(const string& name, + const string& os, + const string& architecture, + const string& id, + const string& code_id /* = "" */, + bool enable_multiple_field /* = false*/, + bool prefer_extern_name /* = false*/) + : name_(name), + os_(os), + architecture_(architecture), + id_(id), + code_id_(code_id), + load_address_(0), + enable_multiple_field_(enable_multiple_field), + prefer_extern_name_(prefer_extern_name) {} + +Module::~Module() { + for (FileByNameMap::iterator it = files_.begin(); it != files_.end(); ++it) + delete it->second; + for (FunctionSet::iterator it = functions_.begin(); + it != functions_.end(); ++it) { + delete *it; + } +} + +void Module::SetLoadAddress(Address address) { + load_address_ = address; +} + +void Module::SetAddressRanges(const vector& ranges) { + address_ranges_ = ranges; +} + +bool Module::AddFunction(Function* function) { + // FUNC lines must not hold an empty name, so catch the problem early if + // callers try to add one. + assert(!function->name.empty()); + + if (!AddressIsInModule(function->address)) { + return false; + } + + // FUNCs are better than PUBLICs as they come with sizes, so remove an extern + // with the same address if present. + Extern ext(function->address); + ExternSet::iterator it_ext = externs_.find(&ext); + if (it_ext == externs_.end() && + architecture_ == "arm" && + (function->address & 0x1) == 0) { + // ARM THUMB functions have bit 0 set. ARM64 does not have THUMB. + Extern arm_thumb_ext(function->address | 0x1); + it_ext = externs_.find(&arm_thumb_ext); + } + if (it_ext != externs_.end()) { + Extern* found_ext = it_ext->get(); + bool name_mismatch = found_ext->name != function->name; + if (enable_multiple_field_) { + bool is_multiple_based_on_name; + // In the case of a .dSYM built with -gmlt, the external name will be the + // fully-qualified symbol name, but the function name will be the partial + // name (or omitted). + // + // Don't mark multiple in this case. + if (name_mismatch && + (function->name == "" || + found_ext->name.find(function->name.str()) != string::npos)) { + is_multiple_based_on_name = false; + } else { + is_multiple_based_on_name = name_mismatch; + } + // If the PUBLIC is for the same symbol as the FUNC, don't mark multiple. + function->is_multiple |= + is_multiple_based_on_name || found_ext->is_multiple; + } + if (name_mismatch && prefer_extern_name_) { + function->name = AddStringToPool(it_ext->get()->name); + } + externs_.erase(it_ext); + } +#if _DEBUG + { + // There should be no other PUBLIC symbols that overlap with the function. + for (const Range& range : function->ranges) { + Extern debug_ext(range.address); + ExternSet::iterator it_debug = externs_.lower_bound(&ext); + assert(it_debug == externs_.end() || + (*it_debug)->address >= range.address + range.size); + } + } +#endif + if (enable_multiple_field_ && function_addresses_.count(function->address)) { + FunctionSet::iterator existing_function = std::find_if( + functions_.begin(), functions_.end(), + [&](Function* other) { return other->address == function->address; }); + assert(existing_function != functions_.end()); + (*existing_function)->is_multiple = true; + // Free the duplicate that was not inserted because this Module + // now owns it. + return false; + } + function_addresses_.emplace(function->address); + std::pair ret = functions_.insert(function); + if (!ret.second && (*ret.first != function)) { + // Free the duplicate that was not inserted because this Module + // now owns it. + return false; + } + return true; +} + +void Module::AddStackFrameEntry(std::unique_ptr stack_frame_entry) { + if (!AddressIsInModule(stack_frame_entry->address)) { + return; + } + + stack_frame_entries_.push_back(std::move(stack_frame_entry)); +} + +void Module::AddExtern(std::unique_ptr ext) { + if (!AddressIsInModule(ext->address)) { + return; + } + + std::pair ret = externs_.emplace(std::move(ext)); + if (!ret.second && enable_multiple_field_) { + (*ret.first)->is_multiple = true; + } +} + +void Module::GetFunctions(vector* vec, + vector::iterator i) { + vec->insert(i, functions_.begin(), functions_.end()); +} + +void Module::GetExterns(vector* vec, + vector::iterator i) { + auto pos = vec->insert(i, externs_.size(), nullptr); + for (const std::unique_ptr& ext : externs_) { + *pos = ext.get(); + ++pos; + } +} + +Module::File* Module::FindFile(const string& name) { + // A tricky bit here. The key of each map entry needs to be a + // pointer to the entry's File's name string. This means that we + // can't do the initial lookup with any operation that would create + // an empty entry for us if the name isn't found (like, say, + // operator[] or insert do), because such a created entry's key will + // be a pointer the string passed as our argument. Since the key of + // a map's value type is const, we can't fix it up once we've + // created our file. lower_bound does the lookup without doing an + // insertion, and returns a good hint iterator to pass to insert. + // Our "destiny" is where we belong, whether we're there or not now. + FileByNameMap::iterator destiny = files_.lower_bound(&name); + if (destiny == files_.end() + || *destiny->first != name) { // Repeated string comparison, boo hoo. + File* file = new File(name); + file->source_id = -1; + destiny = files_.insert(destiny, + FileByNameMap::value_type(&file->name, file)); + } + return destiny->second; +} + +Module::File* Module::FindFile(const char* name) { + string name_string = name; + return FindFile(name_string); +} + +Module::File* Module::FindExistingFile(const string& name) { + FileByNameMap::iterator it = files_.find(&name); + return (it == files_.end()) ? NULL : it->second; +} + +void Module::GetFiles(vector* vec) { + vec->clear(); + for (FileByNameMap::iterator it = files_.begin(); it != files_.end(); ++it) + vec->push_back(it->second); +} + +void Module::GetStackFrameEntries(vector* vec) const { + vec->clear(); + vec->reserve(stack_frame_entries_.size()); + for (const auto& ent : stack_frame_entries_) { + vec->push_back(ent.get()); + } +} + +void Module::AssignSourceIds() { + // First, give every source file an id of -1. + for (FileByNameMap::iterator file_it = files_.begin(); + file_it != files_.end(); ++file_it) { + file_it->second->source_id = -1; + } + + // Next, mark all files actually cited by our functions' line number + // info, by setting each one's source id to zero. + for (FunctionSet::const_iterator func_it = functions_.begin(); + func_it != functions_.end(); ++func_it) { + Function* func = *func_it; + for (vector::iterator line_it = func->lines.begin(); + line_it != func->lines.end(); ++line_it) + line_it->file->source_id = 0; + } + + // Also mark all files cited by inline callsite by setting each one's source + // id to zero. + auto markInlineFiles = [](unique_ptr& in) { + // There are some artificial inline functions which don't belong to + // any file. Those will have file id -1. + if (in->call_site_file) { + in->call_site_file->source_id = 0; + } + }; + for (auto func : functions_) { + Inline::InlineDFS(func->inlines, markInlineFiles); + } + + // Finally, assign source ids to those files that have been marked. + // We could have just assigned source id numbers while traversing + // the line numbers, but doing it this way numbers the files in + // lexicographical order by name, which is neat. + int next_source_id = 0; + for (FileByNameMap::iterator file_it = files_.begin(); + file_it != files_.end(); ++file_it) { + if (!file_it->second->source_id) + file_it->second->source_id = next_source_id++; + } +} + +void Module::CreateInlineOrigins( + set& inline_origins) { + // Only add origins that have file and deduplicate origins with same name and + // file id by doing a DFS. + auto addInlineOrigins = [&](unique_ptr& in) { + auto it = inline_origins.find(in->origin); + if (it == inline_origins.end()) + inline_origins.insert(in->origin); + else + in->origin = *it; + }; + for (Function* func : functions_) + Module::Inline::InlineDFS(func->inlines, addInlineOrigins); + int next_id = 0; + for (InlineOrigin* origin : inline_origins) { + origin->id = next_id++; + } +} + +bool Module::ReportError() { + fprintf(stderr, "error writing symbol file: %s\n", + strerror(errno)); + return false; +} + +bool Module::WriteRuleMap(const RuleMap& rule_map, std::ostream& stream) { + for (RuleMap::const_iterator it = rule_map.begin(); + it != rule_map.end(); ++it) { + if (it != rule_map.begin()) + stream << ' '; + stream << it->first << ": " << it->second; + } + return stream.good(); +} + +bool Module::AddressIsInModule(Address address) const { + if (address_ranges_.empty()) { + return true; + } + for (const auto& segment : address_ranges_) { + if (address >= segment.address && + address < segment.address + segment.size) { + return true; + } + } + return false; +} + +bool Module::Write(std::ostream& stream, SymbolData symbol_data) { + stream << "MODULE " << os_ << " " << architecture_ << " " + << id_ << " " << name_ << "\n"; + if (!stream.good()) + return ReportError(); + + if (!code_id_.empty()) { + stream << "INFO CODE_ID " << code_id_ << "\n"; + } + + if (symbol_data & SYMBOLS_AND_FILES) { + // Get all referenced inline origins. + set inline_origins; + CreateInlineOrigins(inline_origins); + AssignSourceIds(); + + // Write out files. + for (FileByNameMap::iterator file_it = files_.begin(); + file_it != files_.end(); ++file_it) { + File* file = file_it->second; + if (file->source_id >= 0) { + stream << "FILE " << file->source_id << " " << file->name << "\n"; + if (!stream.good()) + return ReportError(); + } + } + // Write out inline origins. + for (InlineOrigin* origin : inline_origins) { + stream << "INLINE_ORIGIN " << origin->id << " " << origin->name << "\n"; + if (!stream.good()) + return ReportError(); + } + + // Write out functions and their inlines and lines. + for (FunctionSet::const_iterator func_it = functions_.begin(); + func_it != functions_.end(); ++func_it) { + Function* func = *func_it; + vector::iterator line_it = func->lines.begin(); + for (auto range_it = func->ranges.cbegin(); + range_it != func->ranges.cend(); ++range_it) { + stream << "FUNC " << (func->is_multiple ? "m " : "") << hex + << (range_it->address - load_address_) << " " << range_it->size + << " " << func->parameter_size << " " << func->name << dec + << "\n"; + + if (!stream.good()) + return ReportError(); + + // Write out inlines. + auto write_inline = [&](unique_ptr& in) { + stream << "INLINE "; + stream << in->inline_nest_level << " " << in->call_site_line << " " + << in->getCallSiteFileID() << " " << in->origin->id << hex; + for (const Range& r : in->ranges) + stream << " " << (r.address - load_address_) << " " << r.size; + stream << dec << "\n"; + }; + Module::Inline::InlineDFS(func->inlines, write_inline); + if (!stream.good()) + return ReportError(); + + while ((line_it != func->lines.end()) && + (line_it->address >= range_it->address) && + (line_it->address < (range_it->address + range_it->size))) { + stream << hex + << (line_it->address - load_address_) << " " + << line_it->size << " " + << dec + << line_it->number << " " + << line_it->file->source_id << "\n"; + + if (!stream.good()) + return ReportError(); + + ++line_it; + } + } + } + + // Write out 'PUBLIC' records. + for (ExternSet::const_iterator extern_it = externs_.begin(); + extern_it != externs_.end(); ++extern_it) { + Extern* ext = extern_it->get(); + stream << "PUBLIC " << (ext->is_multiple ? "m " : "") << hex + << (ext->address - load_address_) << " 0 " << ext->name << dec + << "\n"; + } + } + + if (symbol_data & CFI) { + // Write out 'STACK CFI INIT' and 'STACK CFI' records. + for (auto frame_it = stack_frame_entries_.begin(); + frame_it != stack_frame_entries_.end(); ++frame_it) { + StackFrameEntry* entry = frame_it->get(); + stream << "STACK CFI INIT " << hex + << (entry->address - load_address_) << " " + << entry->size << " " << dec; + if (!stream.good() + || !WriteRuleMap(entry->initial_rules, stream)) + return ReportError(); + + stream << "\n"; + + // Write out this entry's delta rules as 'STACK CFI' records. + for (RuleChangeMap::const_iterator delta_it = entry->rule_changes.begin(); + delta_it != entry->rule_changes.end(); ++delta_it) { + stream << "STACK CFI " << hex + << (delta_it->first - load_address_) << " " << dec; + if (!stream.good() + || !WriteRuleMap(delta_it->second, stream)) + return ReportError(); + + stream << "\n"; + } + } + } + + return true; +} + +} // namespace google_breakpad diff --git a/src/common/module.h b/src/common/module.h new file mode 100644 index 0000000..28e8e9c --- /dev/null +++ b/src/common/module.h @@ -0,0 +1,519 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// module.h: Define google_breakpad::Module. A Module holds debugging +// information, and can write that information out as a Breakpad +// symbol file. + +#ifndef COMMON_LINUX_MODULE_H__ +#define COMMON_LINUX_MODULE_H__ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/string_view.h" +#include "common/symbol_data.h" +#include "common/unordered.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::set; +using std::vector; +using std::map; + +// A Module represents the contents of a module, and supports methods +// for adding information produced by parsing STABS or DWARF data +// --- possibly both from the same file --- and then writing out the +// unified contents as a Breakpad-format symbol file. +class Module { + public: + // The type of addresses and sizes in a symbol table. + typedef uint64_t Address; + static constexpr uint64_t kMaxAddress = std::numeric_limits
    ::max(); + struct File; + struct Function; + struct InlineOrigin; + struct Inline; + struct Line; + struct Extern; + + // Addresses appearing in File, Function, and Line structures are + // absolute, not relative to the the module's load address. That + // is, if the module were loaded at its nominal load address, the + // addresses would be correct. + + // A source file. + struct File { + explicit File(const string& name_input) : name(name_input), source_id(0) {} + + // The name of the source file. + const string name; + + // The file's source id. The Write member function clears this + // field and assigns source ids a fresh, so any value placed here + // before calling Write will be lost. + int source_id; + }; + + // An address range. + struct Range { + Range(const Address address_input, const Address size_input) : + address(address_input), size(size_input) { } + + Address address; + Address size; + }; + + // A function. + struct Function { + Function(StringView name_input, const Address& address_input) : + name(name_input), address(address_input), parameter_size(0) {} + + // For sorting by address. (Not style-guide compliant, but it's + // stupid not to put this in the struct.) + static bool CompareByAddress(const Function* x, const Function* y) { + return x->address < y->address; + } + + // The function's name. + StringView name; + + // The start address and the address ranges covered by the function. + const Address address; + vector ranges; + + // The function's parameter size. + Address parameter_size; + + // Source lines belonging to this function, sorted by increasing + // address. + vector lines; + + // Inlined call sites belonging to this functions. + vector> inlines; + + // If this symbol has been folded with other symbols in the linked binary. + bool is_multiple = false; + + // If the function's name should be filled out from a matching Extern, + // should they not match. + bool prefer_extern_name = false; + }; + + struct InlineOrigin { + explicit InlineOrigin(StringView name) : id(-1), name(name) {} + + // A unique id for each InlineOrigin object. INLINE records use the id to + // refer to its INLINE_ORIGIN record. + int id; + + // The inlined function's name. + StringView name; + }; + + // A inlined call site. + struct Inline { + Inline(InlineOrigin* origin, + const vector& ranges, + int call_site_line, + int call_site_file_id, + int inline_nest_level, + vector> child_inlines) + : origin(origin), + ranges(ranges), + call_site_line(call_site_line), + call_site_file_id(call_site_file_id), + call_site_file(nullptr), + inline_nest_level(inline_nest_level), + child_inlines(std::move(child_inlines)) {} + + InlineOrigin* origin; + + // The list of addresses and sizes. + vector ranges; + + int call_site_line; + + // The id is only meanful inside a CU. It's only used for looking up real + // File* after scanning a CU. + int call_site_file_id; + + File* call_site_file; + + int inline_nest_level; + + // A list of inlines which are children of this inline. + vector> child_inlines; + + int getCallSiteFileID() const { + return call_site_file ? call_site_file->source_id : -1; + } + + static void InlineDFS( + vector>& inlines, + std::function&)> const& forEach) { + for (std::unique_ptr& in : inlines) { + forEach(in); + InlineDFS(in->child_inlines, forEach); + } + } + }; + + typedef map InlineOriginByOffset; + + class InlineOriginMap { + public: + // Add INLINE ORIGIN to the module. Return a pointer to origin . + InlineOrigin* GetOrCreateInlineOrigin(uint64_t offset, StringView name); + + // offset is the offset of a DW_TAG_subprogram. specification_offset is the + // value of its DW_AT_specification or equals to offset if + // DW_AT_specification doesn't exist in that DIE. + void SetReference(uint64_t offset, uint64_t specification_offset); + + ~InlineOriginMap() { + for (const auto& iter : inline_origins_) { + delete iter.second; + } + } + + private: + // A map from a DW_TAG_subprogram's offset to the DW_TAG_subprogram. + InlineOriginByOffset inline_origins_; + + // A map from a DW_TAG_subprogram's offset to the offset of its + // specification or abstract origin subprogram. The set of values in this + // map should always be the same set of keys in inline_origins_. + map references_; + }; + + map inline_origin_maps; + + // A source line. + struct Line { + // For sorting by address. (Not style-guide compliant, but it's + // stupid not to put this in the struct.) + static bool CompareByAddress(const Module::Line& x, const Module::Line& y) { + return x.address < y.address; + } + + Address address, size; // The address and size of the line's code. + File* file; // The source file. + int number; // The source line number. + }; + + // An exported symbol. + struct Extern { + explicit Extern(const Address& address_input) : address(address_input) {} + const Address address; + string name; + // If this symbol has been folded with other symbols in the linked binary. + bool is_multiple = false; + }; + + // A map from register names to postfix expressions that recover + // their their values. This can represent a complete set of rules to + // follow at some address, or a set of changes to be applied to an + // extant set of rules. + typedef map RuleMap; + + // A map from addresses to RuleMaps, representing changes that take + // effect at given addresses. + typedef map RuleChangeMap; + + // A range of 'STACK CFI' stack walking information. An instance of + // this structure corresponds to a 'STACK CFI INIT' record and the + // subsequent 'STACK CFI' records that fall within its range. + struct StackFrameEntry { + // The starting address and number of bytes of machine code this + // entry covers. + Address address, size; + + // The initial register recovery rules, in force at the starting + // address. + RuleMap initial_rules; + + // A map from addresses to rule changes. To find the rules in + // force at a given address, start with initial_rules, and then + // apply the changes given in this map for all addresses up to and + // including the address you're interested in. + RuleChangeMap rule_changes; + }; + + struct FunctionCompare { + bool operator() (const Function* lhs, const Function* rhs) const { + if (lhs->address == rhs->address) + return lhs->name < rhs->name; + return lhs->address < rhs->address; + } + }; + + struct InlineOriginCompare { + bool operator()(const InlineOrigin* lhs, const InlineOrigin* rhs) const { + return lhs->name < rhs->name; + } + }; + + struct ExternCompare { + // Defining is_transparent allows + // std::set, ExternCompare>::find() to be called + // with an Extern* and have set use the overloads below. + using is_transparent = void; + bool operator() (const std::unique_ptr& lhs, + const std::unique_ptr& rhs) const { + return lhs->address < rhs->address; + } + bool operator() (const Extern* lhs, const std::unique_ptr& rhs) const { + return lhs->address < rhs->address; + } + bool operator() (const std::unique_ptr& lhs, const Extern* rhs) const { + return lhs->address < rhs->address; + } + }; + + // Create a new module with the given name, operating system, + // architecture, and ID string. + // NB: `enable_multiple_field` is temporary while transitioning to enabling + // writing the multiple field permanently. + Module(const string& name, + const string& os, + const string& architecture, + const string& id, + const string& code_id = "", + bool enable_multiple_field = false, + bool prefer_extern_name = false); + ~Module(); + + // Set the module's load address to LOAD_ADDRESS; addresses given + // for functions and lines will be written to the Breakpad symbol + // file as offsets from this address. Construction initializes this + // module's load address to zero: addresses written to the symbol + // file will be the same as they appear in the Function, Line, and + // StackFrameEntry structures. + // + // Note that this member function has no effect on addresses stored + // in the data added to this module; the Write member function + // simply subtracts off the load address from addresses before it + // prints them. Only the last load address given before calling + // Write is used. + void SetLoadAddress(Address load_address); + + // Sets address filtering on elements added to the module. This allows + // libraries with extraneous debug symbols to generate symbol files containing + // only relevant symbols. For example, an LLD-generated partition library may + // contain debug information pertaining to all partitions derived from a + // single "combined" library. Filtering applies only to elements added after + // this method is called. + void SetAddressRanges(const vector& ranges); + + // Add FUNCTION to the module. FUNCTION's name must not be empty. + // This module owns all Function objects added with this function: + // destroying the module destroys them as well. + // Return false if the function is duplicate and needs to be freed. + bool AddFunction(Function* function); + + // Add STACK_FRAME_ENTRY to the module. + // This module owns all StackFrameEntry objects added with this + // function: destroying the module destroys them as well. + void AddStackFrameEntry(std::unique_ptr stack_frame_entry); + + // Add PUBLIC to the module. + // This module owns all Extern objects added with this function: + // destroying the module destroys them as well. + void AddExtern(std::unique_ptr ext); + + // If this module has a file named NAME, return a pointer to it. If + // it has none, then create one and return a pointer to the new + // file. This module owns all File objects created using these + // functions; destroying the module destroys them as well. + File* FindFile(const string& name); + File* FindFile(const char* name); + + // If this module has a file named NAME, return a pointer to it. + // Otherwise, return NULL. + File* FindExistingFile(const string& name); + + // Insert pointers to the functions added to this module at I in + // VEC. The pointed-to Functions are still owned by this module. + // (Since this is effectively a copy of the function list, this is + // mostly useful for testing; other uses should probably get a more + // appropriate interface.) + void GetFunctions(vector* vec, vector::iterator i); + + // Insert pointers to the externs added to this module at I in + // VEC. The pointed-to Externs are still owned by this module. + // (Since this is effectively a copy of the extern list, this is + // mostly useful for testing; other uses should probably get a more + // appropriate interface.) + void GetExterns(vector* vec, vector::iterator i); + + // Clear VEC and fill it with pointers to the Files added to this + // module, sorted by name. The pointed-to Files are still owned by + // this module. (Since this is effectively a copy of the file list, + // this is mostly useful for testing; other uses should probably get + // a more appropriate interface.) + void GetFiles(vector* vec); + + // Clear VEC and fill it with pointers to the StackFrameEntry + // objects that have been added to this module. (Since this is + // effectively a copy of the stack frame entry list, this is mostly + // useful for testing; other uses should probably get + // a more appropriate interface.) + void GetStackFrameEntries(vector* vec) const; + + // Find those files in this module that are actually referred to by + // functions' line number data, and assign them source id numbers. + // Set the source id numbers for all other files --- unused by the + // source line data --- to -1. We do this before writing out the + // symbol file, at which point we omit any unused files. + void AssignSourceIds(); + + // This function should be called before AssignSourceIds() to get the set of + // valid InlineOrigins*. + void CreateInlineOrigins( + set& inline_origins); + + // Call AssignSourceIds, and write this module to STREAM in the + // breakpad symbol format. Return true if all goes well, or false if + // an error occurs. This method writes out: + // - a header based on the values given to the constructor, + // If symbol_data is not CFI then: + // - the source files added via FindFile, + // - the functions added via AddFunctions, each with its lines, + // - all public records, + // If symbol_data is CFI then: + // - all CFI records. + // Addresses in the output are all relative to the load address + // established by SetLoadAddress. + bool Write(std::ostream& stream, SymbolData symbol_data); + + // Place the name in the global set of strings. Return a StringView points to + // a string inside the pool. + StringView AddStringToPool(const string& str) { + auto result = common_strings_.insert(str); + return *(result.first); + } + + string name() const { return name_; } + string os() const { return os_; } + string architecture() const { return architecture_; } + string identifier() const { return id_; } + string code_identifier() const { return code_id_; } + + private: + // Report an error that has occurred writing the symbol file, using + // errno to find the appropriate cause. Return false. + static bool ReportError(); + + // Write RULE_MAP to STREAM, in the form appropriate for 'STACK CFI' + // records, without a final newline. Return true if all goes well; + // if an error occurs, return false, and leave errno set. + static bool WriteRuleMap(const RuleMap& rule_map, std::ostream& stream); + + // Returns true of the specified address resides with an specified address + // range, or if no ranges have been specified. + bool AddressIsInModule(Address address) const; + + // Module header entries. + string name_, os_, architecture_, id_, code_id_; + + // The module's nominal load address. Addresses for functions and + // lines are absolute, assuming the module is loaded at this + // address. + Address load_address_; + + // The set of valid address ranges of the module. If specified, attempts to + // add elements residing outside these ranges will be silently filtered. + vector address_ranges_; + + // Relation for maps whose keys are strings shared with some other + // structure. + struct CompareStringPtrs { + bool operator()(const string* x, const string* y) const { return *x < *y; } + }; + + // A map from filenames to File structures. The map's keys are + // pointers to the Files' names. + typedef map FileByNameMap; + + // A set containing Function structures, sorted by address. + typedef set FunctionSet; + + // A set containing Extern structures, sorted by address. + typedef set, ExternCompare> ExternSet; + + // The module owns all the files and functions that have been added + // to it; destroying the module frees the Files and Functions these + // point to. + FileByNameMap files_; // This module's source files. + FunctionSet functions_; // This module's functions. + // Used to quickly look up whether a function exists at a particular address. + unordered_set
    function_addresses_; + + // The module owns all the call frame info entries that have been + // added to it. + vector> stack_frame_entries_; + + // The module owns all the externs that have been added to it; + // destroying the module frees the Externs these point to. + ExternSet externs_; + + unordered_set common_strings_; + + // Whether symbols sharing an address should be collapsed into a single entry + // and marked with an `m` in the output. See + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=751 and docs + // at + // https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/symbol_files.md#records-3 + bool enable_multiple_field_; + + // If a Function and an Extern share the same address but have a different + // name, prefer the name of the Extern. + // + // Use this when dumping Mach-O .dSYMs built with -gmlt (Minimum Line Tables), + // as the Function's fully-qualified name will only be present in the STABS + // (which are placed in the Extern), not in the DWARF symbols (which are + // placed in the Function). + bool prefer_extern_name_; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_MODULE_H__ diff --git a/src/common/module_unittest.cc b/src/common/module_unittest.cc new file mode 100644 index 0000000..c51162e --- /dev/null +++ b/src/common/module_unittest.cc @@ -0,0 +1,740 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// module_unittest.cc: Unit tests for google_breakpad::Module. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/module.h" +#include "common/using_std_string.h" + +using google_breakpad::Module; +using google_breakpad::StringView; +using std::stringstream; +using std::vector; +using testing::ContainerEq; + +static Module::Function* generate_duplicate_function(StringView name) { + const Module::Address DUP_ADDRESS = 0xd35402aac7a7ad5cULL; + const Module::Address DUP_SIZE = 0x200b26e605f99071ULL; + const Module::Address DUP_PARAMETER_SIZE = 0xf14ac4fed48c4a99ULL; + + Module::Function* function = new Module::Function(name, DUP_ADDRESS); + Module::Range range(DUP_ADDRESS, DUP_SIZE); + function->ranges.push_back(range); + function->parameter_size = DUP_PARAMETER_SIZE; + return function; +} + +#define MODULE_NAME "name with spaces" +#define MODULE_OS "os-name" +#define MODULE_ARCH "architecture" +#define MODULE_ID "id-string" +#define MODULE_CODE_ID "code-id-string" + +TEST(Module, WriteHeader) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n", + contents.c_str()); +} + +TEST(Module, WriteHeaderCodeId) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID, MODULE_CODE_ID); + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" + "INFO CODE_ID code-id-string\n", + contents.c_str()); +} + +TEST(Module, WriteOneLineFunc) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + Module::File* file = m.FindFile("file_name.cc"); + Module::Function* function = new Module::Function( + "function_name", 0xe165bf8023b9d9abULL); + Module::Range range(0xe165bf8023b9d9abULL, 0x1e4bb0eb1cbf5b09ULL); + function->ranges.push_back(range); + function->parameter_size = 0x772beee89114358aULL; + Module::Line line = { 0xe165bf8023b9d9abULL, 0x1e4bb0eb1cbf5b09ULL, + file, 67519080 }; + function->lines.push_back(line); + m.AddFunction(function); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" + "FILE 0 file_name.cc\n" + "FUNC e165bf8023b9d9ab 1e4bb0eb1cbf5b09 772beee89114358a" + " function_name\n" + "e165bf8023b9d9ab 1e4bb0eb1cbf5b09 67519080 0\n", + contents.c_str()); +} + +TEST(Module, WriteRelativeLoadAddress) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // Some source files. We will expect to see them in lexicographic order. + Module::File* file1 = m.FindFile("filename-b.cc"); + Module::File* file2 = m.FindFile("filename-a.cc"); + + // A function. + Module::Function* function = new Module::Function( + "A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)", 0xbec774ea5dd935f3ULL); + Module::Range range(0xbec774ea5dd935f3ULL, 0x2922088f98d3f6fcULL); + function->ranges.push_back(range); + function->parameter_size = 0xe5e9aa008bd5f0d0ULL; + + // Some source lines. The module should not sort these. + Module::Line line1 = { 0xbec774ea5dd935f3ULL, 0x1c2be6d6c5af2611ULL, + file1, 41676901 }; + Module::Line line2 = { 0xdaf35bc123885c04ULL, 0xcf621b8d324d0ebULL, + file2, 67519080 }; + function->lines.push_back(line2); + function->lines.push_back(line1); + + m.AddFunction(function); + + // Some stack information. + auto entry = std::make_unique(); + entry->address = 0x30f9e5c83323973dULL; + entry->size = 0x49fc9ca7c7c13dc2ULL; + entry->initial_rules[".cfa"] = "he was a handsome man"; + entry->initial_rules["and"] = "what i want to know is"; + entry->rule_changes[0x30f9e5c83323973eULL]["how"] = + "do you like your blueeyed boy"; + entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = "Death"; + m.AddStackFrameEntry(std::move(entry)); + + // Set the load address. Doing this after adding all the data to + // the module must work fine. + m.SetLoadAddress(0x2ab698b0b6407073ULL); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" + "FILE 0 filename-a.cc\n" + "FILE 1 filename-b.cc\n" + "FUNC 9410dc39a798c580 2922088f98d3f6fc e5e9aa008bd5f0d0" + " A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)\n" + "b03cc3106d47eb91 cf621b8d324d0eb 67519080 0\n" + "9410dc39a798c580 1c2be6d6c5af2611 41676901 1\n" + "STACK CFI INIT 6434d177ce326ca 49fc9ca7c7c13dc2" + " .cfa: he was a handsome man" + " and: what i want to know is\n" + "STACK CFI 6434d177ce326cb" + " Mister: Death" + " how: do you like your blueeyed boy\n", + contents.c_str()); +} + +TEST(Module, WriteOmitUnusedFiles) { + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // Create some source files. + Module::File* file1 = m.FindFile("filename1"); + m.FindFile("filename2"); // not used by any line + Module::File* file3 = m.FindFile("filename3"); + + // Create a function. + Module::Function* function = new Module::Function( + "function_name", 0x9b926d464f0b9384ULL); + Module::Range range(0x9b926d464f0b9384ULL, 0x4f524a4ba795e6a6ULL); + function->ranges.push_back(range); + function->parameter_size = 0xbbe8133a6641c9b7ULL; + + // Source files that refer to some files, but not others. + Module::Line line1 = { 0xab415089485e1a20ULL, 0x126e3124979291f2ULL, + file1, 137850127 }; + Module::Line line2 = { 0xb2675b5c3c2ed33fULL, 0x1df77f5551dbd68cULL, + file3, 28113549 }; + function->lines.push_back(line1); + function->lines.push_back(line2); + m.AddFunction(function); + m.AssignSourceIds(); + + vector vec; + m.GetFiles(&vec); + EXPECT_EQ((size_t) 3, vec.size()); + EXPECT_STREQ("filename1", vec[0]->name.c_str()); + EXPECT_NE(-1, vec[0]->source_id); + // Expect filename2 not to be used. + EXPECT_STREQ("filename2", vec[1]->name.c_str()); + EXPECT_EQ(-1, vec[1]->source_id); + EXPECT_STREQ("filename3", vec[2]->name.c_str()); + EXPECT_NE(-1, vec[2]->source_id); + + stringstream s; + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" + "FILE 0 filename1\n" + "FILE 1 filename3\n" + "FUNC 9b926d464f0b9384 4f524a4ba795e6a6 bbe8133a6641c9b7" + " function_name\n" + "ab415089485e1a20 126e3124979291f2 137850127 0\n" + "b2675b5c3c2ed33f 1df77f5551dbd68c 28113549 1\n", + contents.c_str()); +} + +TEST(Module, WriteNoCFI) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // Some source files. We will expect to see them in lexicographic order. + Module::File* file1 = m.FindFile("filename.cc"); + + // A function. + Module::Function* function = new Module::Function( + "A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)", 0xbec774ea5dd935f3ULL); + Module::Range range(0xbec774ea5dd935f3ULL, 0x2922088f98d3f6fcULL); + function->ranges.push_back(range); + function->parameter_size = 0xe5e9aa008bd5f0d0ULL; + + // Some source lines. The module should not sort these. + Module::Line line1 = { 0xbec774ea5dd935f3ULL, 0x1c2be6d6c5af2611ULL, + file1, 41676901 }; + function->lines.push_back(line1); + + m.AddFunction(function); + + // Some stack information. + auto entry = std::make_unique(); + entry->address = 0x30f9e5c83323973dULL; + entry->size = 0x49fc9ca7c7c13dc2ULL; + entry->initial_rules[".cfa"] = "he was a handsome man"; + entry->initial_rules["and"] = "what i want to know is"; + entry->rule_changes[0x30f9e5c83323973eULL]["how"] = + "do you like your blueeyed boy"; + entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = "Death"; + m.AddStackFrameEntry(std::move(entry)); + + // Set the load address. Doing this after adding all the data to + // the module must work fine. + m.SetLoadAddress(0x2ab698b0b6407073ULL); + + m.Write(s, SYMBOLS_AND_FILES | INLINES); + string contents = s.str(); + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" + "FILE 0 filename.cc\n" + "FUNC 9410dc39a798c580 2922088f98d3f6fc e5e9aa008bd5f0d0" + " A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)\n" + "9410dc39a798c580 1c2be6d6c5af2611 41676901 0\n", + contents.c_str()); +} + +TEST(Module, ConstructAddFunction) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // Two functions. + Module::Function* function1 = new Module::Function( + "_without_form", 0xd35024aa7ca7da5cULL); + Module::Range r1(0xd35024aa7ca7da5cULL, 0x200b26e605f99071ULL); + function1->ranges.push_back(r1); + function1->parameter_size = 0xf14ac4fed48c4a99ULL; + + Module::Function* function2 = new Module::Function( + "_and_void", 0x2987743d0b35b13fULL); + Module::Range r2(0x2987743d0b35b13fULL, 0xb369db048deb3010ULL); + function2->ranges.push_back(r2); + function2->parameter_size = 0x938e556cb5a79988ULL; + + // Put them in a vector. + vector vec; + vec.push_back(function1); + vec.push_back(function2); + + for (Module::Function* func: vec) + m.AddFunction(func); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" + "FUNC 2987743d0b35b13f b369db048deb3010 938e556cb5a79988" + " _and_void\n" + "FUNC d35024aa7ca7da5c 200b26e605f99071 f14ac4fed48c4a99" + " _without_form\n", + contents.c_str()); + + // Check that m.GetFunctions returns the functions we expect. + vec.clear(); + m.GetFunctions(&vec, vec.end()); + EXPECT_TRUE(vec.end() != find(vec.begin(), vec.end(), function1)); + EXPECT_TRUE(vec.end() != find(vec.begin(), vec.end(), function2)); + EXPECT_EQ((size_t) 2, vec.size()); +} + +TEST(Module, WriteOutOfRangeAddresses) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // Specify an allowed address range, representing a PT_LOAD segment in a + // module. + vector address_ranges = { + Module::Range(0x2000ULL, 0x1000ULL), + }; + m.SetAddressRanges(address_ranges); + + // Add three stack frames (one lower, one in, and one higher than the allowed + // address range). Only the middle frame should be captured. + auto entry1 = std::make_unique(); + entry1->address = 0x1000ULL; + entry1->size = 0x100ULL; + m.AddStackFrameEntry(std::move(entry1)); + auto entry2 = std::make_unique(); + entry2->address = 0x2000ULL; + entry2->size = 0x100ULL; + m.AddStackFrameEntry(std::move(entry2)); + auto entry3 = std::make_unique(); + entry3->address = 0x3000ULL; + entry3->size = 0x100ULL; + m.AddStackFrameEntry(std::move(entry3)); + + // Add a function outside the allowed range. + Module::File* file = m.FindFile("file_name.cc"); + Module::Function* function = new Module::Function( + "function_name", 0x4000ULL); + Module::Range range(0x4000ULL, 0x1000ULL); + function->ranges.push_back(range); + function->parameter_size = 0x100ULL; + Module::Line line = { 0x4000ULL, 0x100ULL, file, 67519080 }; + function->lines.push_back(line); + m.AddFunction(function); + + // Add an extern outside the allowed range. + auto extern1 = std::make_unique(0x5000ULL); + extern1->name = "_xyz"; + m.AddExtern(std::move(extern1)); + + m.Write(s, ALL_SYMBOL_DATA); + + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" + "STACK CFI INIT 2000 100 \n", + s.str().c_str()); + + // Cleanup - Prevent Memory Leak errors. + delete (function); +} + +TEST(Module, ConstructAddFrames) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // First STACK CFI entry, with no initial rules or deltas. + auto entry1 = std::make_unique(); + entry1->address = 0xddb5f41285aa7757ULL; + entry1->size = 0x1486493370dc5073ULL; + m.AddStackFrameEntry(std::move(entry1)); + + // Second STACK CFI entry, with initial rules but no deltas. + auto entry2 = std::make_unique(); + entry2->address = 0x8064f3af5e067e38ULL; + entry2->size = 0x0de2a5ee55509407ULL; + entry2->initial_rules[".cfa"] = "I think that I shall never see"; + entry2->initial_rules["stromboli"] = "a poem lovely as a tree"; + entry2->initial_rules["cannoli"] = "a tree whose hungry mouth is prest"; + m.AddStackFrameEntry(std::move(entry2)); + + // Third STACK CFI entry, with initial rules and deltas. + auto entry3 = std::make_unique(); + entry3->address = 0x5e8d0db0a7075c6cULL; + entry3->size = 0x1c7edb12a7aea229ULL; + entry3->initial_rules[".cfa"] = "Whose woods are these"; + entry3->rule_changes[0x47ceb0f63c269d7fULL]["calzone"] = + "the village though"; + entry3->rule_changes[0x47ceb0f63c269d7fULL]["cannoli"] = + "he will not see me stopping here"; + entry3->rule_changes[0x36682fad3763ffffULL]["stromboli"] = + "his house is in"; + entry3->rule_changes[0x36682fad3763ffffULL][".cfa"] = + "I think I know"; + m.AddStackFrameEntry(std::move(entry3)); + + // Check that Write writes STACK CFI records properly. + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" + "STACK CFI INIT ddb5f41285aa7757 1486493370dc5073 \n" + "STACK CFI INIT 8064f3af5e067e38 de2a5ee55509407" + " .cfa: I think that I shall never see" + " cannoli: a tree whose hungry mouth is prest" + " stromboli: a poem lovely as a tree\n" + "STACK CFI INIT 5e8d0db0a7075c6c 1c7edb12a7aea229" + " .cfa: Whose woods are these\n" + "STACK CFI 36682fad3763ffff" + " .cfa: I think I know" + " stromboli: his house is in\n" + "STACK CFI 47ceb0f63c269d7f" + " calzone: the village though" + " cannoli: he will not see me stopping here\n", + contents.c_str()); + + // Check that GetStackFrameEntries works. + vector entries; + m.GetStackFrameEntries(&entries); + ASSERT_EQ(3U, entries.size()); + // Check first entry. + EXPECT_EQ(0xddb5f41285aa7757ULL, entries[0]->address); + EXPECT_EQ(0x1486493370dc5073ULL, entries[0]->size); + ASSERT_EQ(0U, entries[0]->initial_rules.size()); + ASSERT_EQ(0U, entries[0]->rule_changes.size()); + // Check second entry. + EXPECT_EQ(0x8064f3af5e067e38ULL, entries[1]->address); + EXPECT_EQ(0x0de2a5ee55509407ULL, entries[1]->size); + ASSERT_EQ(3U, entries[1]->initial_rules.size()); + Module::RuleMap entry2_initial; + entry2_initial[".cfa"] = "I think that I shall never see"; + entry2_initial["stromboli"] = "a poem lovely as a tree"; + entry2_initial["cannoli"] = "a tree whose hungry mouth is prest"; + EXPECT_THAT(entries[1]->initial_rules, ContainerEq(entry2_initial)); + ASSERT_EQ(0U, entries[1]->rule_changes.size()); + // Check third entry. + EXPECT_EQ(0x5e8d0db0a7075c6cULL, entries[2]->address); + EXPECT_EQ(0x1c7edb12a7aea229ULL, entries[2]->size); + Module::RuleMap entry3_initial; + entry3_initial[".cfa"] = "Whose woods are these"; + EXPECT_THAT(entries[2]->initial_rules, ContainerEq(entry3_initial)); + Module::RuleChangeMap entry3_changes; + entry3_changes[0x36682fad3763ffffULL][".cfa"] = "I think I know"; + entry3_changes[0x36682fad3763ffffULL]["stromboli"] = "his house is in"; + entry3_changes[0x47ceb0f63c269d7fULL]["calzone"] = "the village though"; + entry3_changes[0x47ceb0f63c269d7fULL]["cannoli"] = + "he will not see me stopping here"; + EXPECT_THAT(entries[2]->rule_changes, ContainerEq(entry3_changes)); +} + +TEST(Module, ConstructUniqueFiles) { + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + Module::File* file1 = m.FindFile("foo"); + Module::File* file2 = m.FindFile(string("bar")); + Module::File* file3 = m.FindFile(string("foo")); + Module::File* file4 = m.FindFile("bar"); + EXPECT_NE(file1, file2); + EXPECT_EQ(file1, file3); + EXPECT_EQ(file2, file4); + EXPECT_EQ(file1, m.FindExistingFile("foo")); + EXPECT_TRUE(m.FindExistingFile("baz") == NULL); +} + +TEST(Module, ConstructDuplicateFunctions) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // Two functions. + Module::Function* function1 = generate_duplicate_function("_without_form"); + Module::Function* function2 = generate_duplicate_function("_without_form"); + + m.AddFunction(function1); + // If this succeeds, we'll have a double-free with the `delete` below. Avoid + // that. + ASSERT_FALSE(m.AddFunction(function2)); + delete function2; + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" + "FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99" + " _without_form\n", + contents.c_str()); +} + +TEST(Module, ConstructFunctionsWithSameAddress) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // Two functions. + Module::Function* function1 = generate_duplicate_function("_without_form"); + Module::Function* function2 = generate_duplicate_function("_and_void"); + + m.AddFunction(function1); + m.AddFunction(function2); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n" + "FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99" + " _and_void\n" + "FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99" + " _without_form\n", + contents.c_str()); +} + +// If multiple fields are enabled, only one function is included per address. +// The entry will be tagged with `m` to show that there are multiple symbols +// at that address. +// TODO(lgrey): Remove the non-multiple versions of these tests and remove the +// suffixes from the suffxed ones when removing `enable_multiple_field_`. +TEST(Module, ConstructFunctionsWithSameAddressMultiple) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID, "", true); + + // Two functions. + Module::Function* function1 = generate_duplicate_function("_without_form"); + Module::Function* function2 = generate_duplicate_function("_and_void"); + + m.AddFunction(function1); + // If this succeeds, we'll have a double-free with the `delete` below. Avoid + // that. + ASSERT_FALSE(m.AddFunction(function2)); + delete function2; + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + EXPECT_STREQ( + "MODULE os-name architecture id-string name with spaces\n" + "FUNC m d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99" + " _without_form\n", + contents.c_str()); +} + +// Externs should be written out as PUBLIC records, sorted by +// address. +TEST(Module, ConstructExterns) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // Two externs. + auto extern1 = std::make_unique(0xffff); + extern1->name = "_abc"; + auto extern2 = std::make_unique(0xaaaa); + extern2->name = "_xyz"; + + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + + EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " " + MODULE_ID " " MODULE_NAME "\n" + "PUBLIC aaaa 0 _xyz\n" + "PUBLIC ffff 0 _abc\n", + contents.c_str()); +} + +// Externs with the same address should only keep the first entry +// added. +TEST(Module, ConstructDuplicateExterns) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // Two externs. + auto extern1 = std::make_unique(0xffff); + extern1->name = "_xyz"; + auto extern2 = std::make_unique(0xffff); + extern2->name = "_abc"; + + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + + EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " " + MODULE_ID " " MODULE_NAME "\n" + "PUBLIC ffff 0 _xyz\n", + contents.c_str()); +} +// Externs with the same address have the `m` tag if the multiple field are +// enabled. +TEST(Module, ConstructDuplicateExternsMultiple) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID, "", true); + + // Two externs. + auto extern1 = std::make_unique(0xffff); + extern1->name = "_xyz"; + auto extern2 = std::make_unique(0xffff); + extern2->name = "_abc"; + + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + + EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " " MODULE_ID " " MODULE_NAME + "\n" + "PUBLIC m ffff 0 _xyz\n", + contents.c_str()); +} + +// If there exists an extern and a function at the same address, only write +// out the FUNC entry. +TEST(Module, ConstructFunctionsAndExternsWithSameAddress) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID); + + // Two externs. + auto extern1 = std::make_unique(0xabc0); + extern1->name = "abc"; + auto extern2 = std::make_unique(0xfff0); + extern2->name = "xyz"; + + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); + + Module::Function* function = new Module::Function("_xyz", 0xfff0); + Module::Range range(0xfff0, 0x10); + function->ranges.push_back(range); + function->parameter_size = 0; + m.AddFunction(function); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + + EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " " + MODULE_ID " " MODULE_NAME "\n" + "FUNC fff0 10 0 _xyz\n" + "PUBLIC abc0 0 abc\n", + contents.c_str()); +} + +// If there exists an extern and a function at the same address, only write +// out the FUNC entry. +TEST(Module, ConstructFunctionsAndExternsWithSameAddressPreferExternName) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID, "", false, true); + + // Two externs. + auto extern1 = std::make_unique(0xabc0); + extern1->name = "extern1"; + auto extern2 = std::make_unique(0xfff0); + extern2->name = "extern2"; + + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); + + Module::Function* function = new Module::Function("function2", 0xfff0); + Module::Range range(0xfff0, 0x10); + function->ranges.push_back(range); + function->parameter_size = 0; + m.AddFunction(function); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + + EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " " MODULE_ID " " MODULE_NAME + "\n" + "FUNC fff0 10 0 extern2\n" + "PUBLIC abc0 0 extern1\n", + contents.c_str()); +} + +// If there exists an extern and a function at the same address, only write +// out the FUNC entry, and mark it with `m` if the multiple field is enabled. +TEST(Module, ConstructFunctionsAndExternsWithSameAddressMultiple) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID, "", true); + + // Two externs. + auto extern1 = std::make_unique(0xabc0); + extern1->name = "abc"; + auto extern2 = std::make_unique(0xfff0); + extern2->name = "xyz"; + + m.AddExtern(std::move(extern1)); + m.AddExtern(std::move(extern2)); + + Module::Function* function = new Module::Function("_xyz", 0xfff0); + Module::Range range(0xfff0, 0x10); + function->ranges.push_back(range); + function->parameter_size = 0; + m.AddFunction(function); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + + EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " " MODULE_ID " " MODULE_NAME + "\n" + "FUNC m fff0 10 0 _xyz\n" + "PUBLIC abc0 0 abc\n", + contents.c_str()); +} + +// If there exists an extern and a function at the same address, only write +// out the FUNC entry. For ARM THUMB, the extern that comes from the ELF +// symbol section has bit 0 set. +TEST(Module, ConstructFunctionsAndThumbExternsWithSameAddress) { + stringstream s; + Module m(MODULE_NAME, MODULE_OS, "arm", MODULE_ID); + + // Two THUMB externs. + auto thumb_extern1 = std::make_unique(0xabc1); + thumb_extern1->name = "thumb_abc"; + auto thumb_extern2 = std::make_unique(0xfff1); + thumb_extern2->name = "thumb_xyz"; + + auto arm_extern1 = std::make_unique(0xcc00); + arm_extern1->name = "arm_func"; + + m.AddExtern(std::move(thumb_extern1)); + m.AddExtern(std::move(thumb_extern2)); + m.AddExtern(std::move(arm_extern1)); + + // The corresponding function from the DWARF debug data have the actual + // address. + Module::Function* function = new Module::Function("_thumb_xyz", 0xfff0); + Module::Range range(0xfff0, 0x10); + function->ranges.push_back(range); + function->parameter_size = 0; + m.AddFunction(function); + + m.Write(s, ALL_SYMBOL_DATA); + string contents = s.str(); + + EXPECT_STREQ("MODULE " MODULE_OS " arm " + MODULE_ID " " MODULE_NAME "\n" + "FUNC fff0 10 0 _thumb_xyz\n" + "PUBLIC abc1 0 thumb_abc\n" + "PUBLIC cc00 0 arm_func\n", + contents.c_str()); +} diff --git a/src/common/path_helper.cc b/src/common/path_helper.cc new file mode 100644 index 0000000..fbbcfca --- /dev/null +++ b/src/common/path_helper.cc @@ -0,0 +1,58 @@ +// Copyright 2017 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/path_helper.h" + +#include +#include +#include +#include + +namespace google_breakpad { + +string BaseName(const string& path) { + char* path_tmp = strdup(path.c_str()); + assert(path_tmp); + string result(basename(path_tmp)); + free(path_tmp); + return result; +} + +string DirName(const string& path) { + char* path_tmp = strdup(path.c_str()); + assert(path_tmp); + string result(dirname(path_tmp)); + free(path_tmp); + return result; +} + +} // namespace google_breakpad diff --git a/src/common/path_helper.h b/src/common/path_helper.h new file mode 100644 index 0000000..0c026c2 --- /dev/null +++ b/src/common/path_helper.h @@ -0,0 +1,43 @@ +// Copyright 2017 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_COMMON_PATH_HELPER_H +#define GOOGLE_BREAKPAD_COMMON_PATH_HELPER_H + +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +string BaseName(const string& path); +string DirName(const string& path); + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_COMMON_PATH_HELPER_H diff --git a/src/common/safe_math.h b/src/common/safe_math.h new file mode 100644 index 0000000..3eab0d2 --- /dev/null +++ b/src/common/safe_math.h @@ -0,0 +1,81 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// safe_math.h: Helpful math functions. +#ifndef SAFE_MATH_H__ +#define SAFE_MATH_H__ + +#include + +namespace google_breakpad { + +// Adds `a` and `b`, returning a pair of: +// - The result after any truncation. +// - Whether an overflow/underflow occurred. +template +std::pair AddWithOverflowCheck(T a, T b) { +#ifdef _WIN32 + // Since C++11, unsigned overflow is well-defined; do everything unsigned, + // assuming 2's complement. + if (std::is_unsigned::value) { + T result = a + b; + // Since we're adding two values >= 0, having a smaller value implies + // overflow. + bool overflow = result < a; + return {result, overflow}; + } + + using TUnsigned = typename std::make_unsigned::type; + T result = TUnsigned(a) + TUnsigned(b); + bool overflow; + if ((a >= 0) == (b >= 0)) { + if (a >= 0) { + overflow = result < a; + } else { + overflow = result > a; + } + } else { + // If signs are different, it's impossible for overflow to happen. + overflow = false; + } + return {result, overflow}; +#else + T result; + bool overflow = __builtin_add_overflow(a, b, &result); + return {result, overflow}; +#endif +} + +template +T AddIgnoringOverflow(T a, T b) { + return AddWithOverflowCheck(a, b).first; +} + +} // namespace google_breakpad + +#endif // SAFE_MATH_H__ diff --git a/src/common/safe_math_unittest.cc b/src/common/safe_math_unittest.cc new file mode 100644 index 0000000..453afbe --- /dev/null +++ b/src/common/safe_math_unittest.cc @@ -0,0 +1,76 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// safe_math_unittest.cc: Unit tests for SafeMath + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "safe_math.h" +#include "breakpad_googletest_includes.h" + +namespace { + +using google_breakpad::AddIgnoringOverflow; +using google_breakpad::AddWithOverflowCheck; + +TEST(SafeMath, AddOverflowWorksAsIntended) { + EXPECT_EQ(AddWithOverflowCheck(0, 0), + std::make_pair(0, false)); + EXPECT_EQ(AddWithOverflowCheck(0, 255), + std::make_pair(255, false)); + EXPECT_EQ(AddWithOverflowCheck(1, 255), + std::make_pair(0, true)); + + EXPECT_EQ(AddWithOverflowCheck(-128, 127), + std::make_pair(-1, false)); + EXPECT_EQ(AddWithOverflowCheck(127, -128), + std::make_pair(-1, false)); + EXPECT_EQ(AddWithOverflowCheck(1, -128), + std::make_pair(-127, false)); + EXPECT_EQ(AddWithOverflowCheck(127, -1), + std::make_pair(126, false)); + + EXPECT_EQ(AddWithOverflowCheck(-128, -1), + std::make_pair(127, true)); + EXPECT_EQ(AddWithOverflowCheck(-128, -128), + std::make_pair(0, true)); + EXPECT_EQ(AddWithOverflowCheck(127, 1), + std::make_pair(-128, true)); + EXPECT_EQ(AddWithOverflowCheck(127, 127), + std::make_pair(-2, true)); +} + +TEST(SafeMath, AddIgnoringOverflowWorksAsIntended) { + EXPECT_EQ(AddIgnoringOverflow(0, 0), 0); + EXPECT_EQ(AddIgnoringOverflow(0, 255), 255); + EXPECT_EQ(AddIgnoringOverflow(1, 255), 0); +} + +} // namespace diff --git a/src/common/scoped_ptr.h b/src/common/scoped_ptr.h new file mode 100644 index 0000000..d111017 --- /dev/null +++ b/src/common/scoped_ptr.h @@ -0,0 +1,404 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Scopers help you manage ownership of a pointer, helping you easily manage the +// a pointer within a scope, and automatically destroying the pointer at the +// end of a scope. There are two main classes you will use, which correspond +// to the operators new/delete and new[]/delete[]. +// +// Example usage (scoped_ptr): +// { +// scoped_ptr foo(new Foo("wee")); +// } // foo goes out of scope, releasing the pointer with it. +// +// { +// scoped_ptr foo; // No pointer managed. +// foo.reset(new Foo("wee")); // Now a pointer is managed. +// foo.reset(new Foo("wee2")); // Foo("wee") was destroyed. +// foo.reset(new Foo("wee3")); // Foo("wee2") was destroyed. +// foo->Method(); // Foo::Method() called. +// foo.get()->Method(); // Foo::Method() called. +// SomeFunc(foo.release()); // SomeFunc takes ownership, foo no longer +// // manages a pointer. +// foo.reset(new Foo("wee4")); // foo manages a pointer again. +// foo.reset(); // Foo("wee4") destroyed, foo no longer +// // manages a pointer. +// } // foo wasn't managing a pointer, so nothing was destroyed. +// +// Example usage (scoped_array): +// { +// scoped_array foo(new Foo[100]); +// foo.get()->Method(); // Foo::Method on the 0th element. +// foo[10].Method(); // Foo::Method on the 10th element. +// } + +#ifndef COMMON_SCOPED_PTR_H_ +#define COMMON_SCOPED_PTR_H_ + +// This is an implementation designed to match the anticipated future TR2 +// implementation of the scoped_ptr class, and its closely-related brethren, +// scoped_array, scoped_ptr_malloc. + +#include +#include +#include + +namespace google_breakpad { + +// A scoped_ptr is like a T*, except that the destructor of scoped_ptr +// automatically deletes the pointer it holds (if any). +// That is, scoped_ptr owns the T object that it points to. +// Like a T*, a scoped_ptr may hold either NULL or a pointer to a T object. +// Also like T*, scoped_ptr is thread-compatible, and once you +// dereference it, you get the threadsafety guarantees of T. +// +// The size of a scoped_ptr is small: +// sizeof(scoped_ptr) == sizeof(C*) +template +class scoped_ptr { + public: + + // The element type + typedef C element_type; + + // Constructor. Defaults to initializing with NULL. + // There is no way to create an uninitialized scoped_ptr. + // The input parameter must be allocated with new. + explicit scoped_ptr(C* p = NULL) : ptr_(p) { } + + // Destructor. If there is a C object, delete it. + // We don't need to test ptr_ == NULL because C++ does that for us. + ~scoped_ptr() { + enum { type_must_be_complete = sizeof(C) }; + delete ptr_; + } + + // Reset. Deletes the current owned object, if any. + // Then takes ownership of a new object, if given. + // this->reset(this->get()) works. + void reset(C* p = NULL) { + if (p != ptr_) { + enum { type_must_be_complete = sizeof(C) }; + delete ptr_; + ptr_ = p; + } + } + + // Accessors to get the owned object. + // operator* and operator-> will assert() if there is no current object. + C& operator*() const { + assert(ptr_ != NULL); + return *ptr_; + } + C* operator->() const { + assert(ptr_ != NULL); + return ptr_; + } + C* get() const { return ptr_; } + + // Comparison operators. + // These return whether two scoped_ptr refer to the same object, not just to + // two different but equal objects. + bool operator==(C* p) const { return ptr_ == p; } + bool operator!=(C* p) const { return ptr_ != p; } + + // Swap two scoped pointers. + void swap(scoped_ptr& p2) { + C* tmp = ptr_; + ptr_ = p2.ptr_; + p2.ptr_ = tmp; + } + + // Release a pointer. + // The return value is the current pointer held by this object. + // If this object holds a NULL pointer, the return value is NULL. + // After this operation, this object will hold a NULL pointer, + // and will not own the object any more. + C* release() { + C* retVal = ptr_; + ptr_ = NULL; + return retVal; + } + + private: + C* ptr_; + + // Forbid comparison of scoped_ptr types. If C2 != C, it totally doesn't + // make sense, and if C2 == C, it still doesn't make sense because you should + // never have the same object owned by two different scoped_ptrs. + template bool operator==(scoped_ptr const& p2) const; + template bool operator!=(scoped_ptr const& p2) const; + + // Disallow evil constructors + scoped_ptr(const scoped_ptr&); + void operator=(const scoped_ptr&); +}; + +// Free functions +template +void swap(scoped_ptr& p1, scoped_ptr& p2) { + p1.swap(p2); +} + +template +bool operator==(C* p1, const scoped_ptr& p2) { + return p1 == p2.get(); +} + +template +bool operator!=(C* p1, const scoped_ptr& p2) { + return p1 != p2.get(); +} + +// scoped_array is like scoped_ptr, except that the caller must allocate +// with new [] and the destructor deletes objects with delete []. +// +// As with scoped_ptr, a scoped_array either points to an object +// or is NULL. A scoped_array owns the object that it points to. +// scoped_array is thread-compatible, and once you index into it, +// the returned objects have only the threadsafety guarantees of T. +// +// Size: sizeof(scoped_array) == sizeof(C*) +template +class scoped_array { + public: + + // The element type + typedef C element_type; + + // Constructor. Defaults to intializing with NULL. + // There is no way to create an uninitialized scoped_array. + // The input parameter must be allocated with new []. + explicit scoped_array(C* p = NULL) : array_(p) { } + + // Destructor. If there is a C object, delete it. + // We don't need to test ptr_ == NULL because C++ does that for us. + ~scoped_array() { + enum { type_must_be_complete = sizeof(C) }; + delete[] array_; + } + + // Reset. Deletes the current owned object, if any. + // Then takes ownership of a new object, if given. + // this->reset(this->get()) works. + void reset(C* p = NULL) { + if (p != array_) { + enum { type_must_be_complete = sizeof(C) }; + delete[] array_; + array_ = p; + } + } + + // Get one element of the current object. + // Will assert() if there is no current object, or index i is negative. + C& operator[](ptrdiff_t i) const { + assert(i >= 0); + assert(array_ != NULL); + return array_[i]; + } + + // Get a pointer to the zeroth element of the current object. + // If there is no current object, return NULL. + C* get() const { + return array_; + } + + // Comparison operators. + // These return whether two scoped_array refer to the same object, not just to + // two different but equal objects. + bool operator==(C* p) const { return array_ == p; } + bool operator!=(C* p) const { return array_ != p; } + + // Swap two scoped arrays. + void swap(scoped_array& p2) { + C* tmp = array_; + array_ = p2.array_; + p2.array_ = tmp; + } + + // Release an array. + // The return value is the current pointer held by this object. + // If this object holds a NULL pointer, the return value is NULL. + // After this operation, this object will hold a NULL pointer, + // and will not own the object any more. + C* release() { + C* retVal = array_; + array_ = NULL; + return retVal; + } + + private: + C* array_; + + // Forbid comparison of different scoped_array types. + template bool operator==(scoped_array const& p2) const; + template bool operator!=(scoped_array const& p2) const; + + // Disallow evil constructors + scoped_array(const scoped_array&); + void operator=(const scoped_array&); +}; + +// Free functions +template +void swap(scoped_array& p1, scoped_array& p2) { + p1.swap(p2); +} + +template +bool operator==(C* p1, const scoped_array& p2) { + return p1 == p2.get(); +} + +template +bool operator!=(C* p1, const scoped_array& p2) { + return p1 != p2.get(); +} + +// This class wraps the c library function free() in a class that can be +// passed as a template argument to scoped_ptr_malloc below. +class ScopedPtrMallocFree { + public: + inline void operator()(void* x) const { + free(x); + } +}; + +// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a +// second template argument, the functor used to free the object. + +template +class scoped_ptr_malloc { + public: + + // The element type + typedef C element_type; + + // Constructor. Defaults to initializing with NULL. + // There is no way to create an uninitialized scoped_ptr. + // The input parameter must be allocated with an allocator that matches the + // Free functor. For the default Free functor, this is malloc, calloc, or + // realloc. + explicit scoped_ptr_malloc(C* p = NULL): ptr_(p) {} + + // Destructor. If there is a C object, call the Free functor. + ~scoped_ptr_malloc() { + reset(); + } + + // Reset. Calls the Free functor on the current owned object, if any. + // Then takes ownership of a new object, if given. + // this->reset(this->get()) works. + void reset(C* p = NULL) { + if (ptr_ != p) { + FreeProc free_proc; + free_proc(ptr_); + ptr_ = p; + } + } + + // Get the current object. + // operator* and operator-> will cause an assert() failure if there is + // no current object. + C& operator*() const { + assert(ptr_ != NULL); + return *ptr_; + } + + C* operator->() const { + assert(ptr_ != NULL); + return ptr_; + } + + C* get() const { + return ptr_; + } + + // Comparison operators. + // These return whether a scoped_ptr_malloc and a plain pointer refer + // to the same object, not just to two different but equal objects. + // For compatibility with the boost-derived implementation, these + // take non-const arguments. + bool operator==(C* p) const { + return ptr_ == p; + } + + bool operator!=(C* p) const { + return ptr_ != p; + } + + // Swap two scoped pointers. + void swap(scoped_ptr_malloc & b) { + C* tmp = b.ptr_; + b.ptr_ = ptr_; + ptr_ = tmp; + } + + // Release a pointer. + // The return value is the current pointer held by this object. + // If this object holds a NULL pointer, the return value is NULL. + // After this operation, this object will hold a NULL pointer, + // and will not own the object any more. + C* release() { + C* tmp = ptr_; + ptr_ = NULL; + return tmp; + } + + private: + C* ptr_; + + // no reason to use these: each scoped_ptr_malloc should have its own object + template + bool operator==(scoped_ptr_malloc const& p) const; + template + bool operator!=(scoped_ptr_malloc const& p) const; + + // Disallow evil constructors + scoped_ptr_malloc(const scoped_ptr_malloc&); + void operator=(const scoped_ptr_malloc&); +}; + +template inline +void swap(scoped_ptr_malloc& a, scoped_ptr_malloc& b) { + a.swap(b); +} + +template inline +bool operator==(C* p, const scoped_ptr_malloc& b) { + return p == b.get(); +} + +template inline +bool operator!=(C* p, const scoped_ptr_malloc& b) { + return p != b.get(); +} + +} // namespace google_breakpad + +#endif // COMMON_SCOPED_PTR_H_ diff --git a/src/common/simple_string_dictionary.cc b/src/common/simple_string_dictionary.cc new file mode 100644 index 0000000..d3e09b8 --- /dev/null +++ b/src/common/simple_string_dictionary.cc @@ -0,0 +1,48 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/simple_string_dictionary.h" + +namespace google_breakpad { + +namespace { + +// In C++98 (ISO 14882), section 9.5.1 says that a union cannot have a member +// with a non-trivial ctor, copy ctor, dtor, or assignment operator. Use this +// property to ensure that Entry remains POD. +union Compile_Assert { + NonAllocatingMap<1, 1, 1>::Entry Compile_Assert__entry_must_be_pod; +}; + +} + +} // namespace google_breakpad diff --git a/src/common/simple_string_dictionary.h b/src/common/simple_string_dictionary.h new file mode 100644 index 0000000..166d56c --- /dev/null +++ b/src/common/simple_string_dictionary.h @@ -0,0 +1,276 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_SIMPLE_STRING_DICTIONARY_H_ +#define COMMON_SIMPLE_STRING_DICTIONARY_H_ + +#include +#include + +namespace google_breakpad { + +// Opaque type for the serialized representation of a NonAllocatingMap. One is +// created in NonAllocatingMap::Serialize and can be deserialized using one of +// the constructors. +struct SerializedNonAllocatingMap; + +// NonAllocatingMap is an implementation of a map/dictionary collection that +// uses a fixed amount of storage, so that it does not perform any dynamic +// allocations for its operations. +// +// The actual map storage (the Entry) is guaranteed to be POD, so that it can +// be transmitted over various IPC mechanisms. +// +// The template parameters control the amount of storage used for the key, +// value, and map. The KeySize and ValueSize are measured in bytes, not glyphs, +// and includes space for a \0 byte. This gives space for KeySize-1 and +// ValueSize-1 characters in an entry. NumEntries is the total number of +// entries that will fit in the map. +template +class NonAllocatingMap { + public: + // Constant and publicly accessible versions of the template parameters. + static const size_t key_size = KeySize; + static const size_t value_size = ValueSize; + static const size_t num_entries = NumEntries; + + // An Entry object is a single entry in the map. If the key is a 0-length + // NUL-terminated string, the entry is empty. + struct Entry { + char key[KeySize]; + char value[ValueSize]; + + bool is_active() const { + return key[0] != '\0'; + } + }; + + // An Iterator can be used to iterate over all the active entries in a + // NonAllocatingMap. + class Iterator { + public: + explicit Iterator(const NonAllocatingMap& map) + : map_(map), + current_(0) { + } + Iterator(const Iterator&) = delete; + void operator=(const Iterator&) = delete; + + // Returns the next entry in the map, or NULL if at the end of the + // collection. + const Entry* Next() { + while (current_ < map_.num_entries) { + const Entry* entry = &map_.entries_[current_++]; + if (entry->is_active()) { + return entry; + } + } + return nullptr; + } + + private: + const NonAllocatingMap& map_; + size_t current_; + }; + + NonAllocatingMap() : entries_() { + } + + NonAllocatingMap(const NonAllocatingMap& other) { + *this = other; + } + + NonAllocatingMap& operator=(const NonAllocatingMap& other) { + assert(other.key_size == key_size); + assert(other.value_size == value_size); + assert(other.num_entries == num_entries); + if (other.key_size == key_size && other.value_size == value_size && + other.num_entries == num_entries) { + memcpy(entries_, other.entries_, sizeof(entries_)); + } + return *this; + } + + // Constructs a map from its serialized form. |map| should be the out + // parameter from Serialize() and |size| should be its return value. + NonAllocatingMap(const SerializedNonAllocatingMap* map, size_t size) { + assert(size == sizeof(entries_)); + if (size == sizeof(entries_)) { + memcpy(entries_, map, size); + } + } + + // Returns the number of active key/value pairs. The upper limit for this + // is NumEntries. + size_t GetCount() const { + size_t count = 0; + for (size_t i = 0; i < num_entries; ++i) { + if (entries_[i].is_active()) { + ++count; + } + } + return count; + } + + // Given |key|, returns its corresponding |value|. |key| must not be NULL. If + // the key is not found, NULL is returned. + const char* GetValueForKey(const char* key) const { + assert(key); + if (!key) + return NULL; + + size_t index = GetEntryIndexForKey(key); + if (index == num_entries) + return NULL; + + return entries_[index].value; + } + + // Stores |value| into |key|, replacing the existing value if |key| is + // already present. |key| must not be NULL. If |value| is NULL, the key is + // removed from the map. If there is no more space in the map, then the + // operation silently fails. Returns an index into the map that can be used + // to quickly access the entry, or |num_entries| on failure or when clearing + // a key with a null value. + size_t SetKeyValue(const char* key, const char* value) { + if (!value) { + RemoveKey(key); + return num_entries; + } + + assert(key); + if (!key) + return num_entries; + + // Key must not be an empty string. + assert(key[0] != '\0'); + if (key[0] == '\0') + return num_entries; + + size_t entry_index = GetEntryIndexForKey(key); + + // If it does not yet exist, attempt to insert it. + if (entry_index == num_entries) { + for (size_t i = 0; i < num_entries; ++i) { + if (!entries_[i].is_active()) { + entry_index = i; + Entry* entry = &entries_[i]; + + strncpy(entry->key, key, key_size); + entry->key[key_size - 1] = '\0'; + + break; + } + } + } + + // If the map is out of space, entry will be NULL. + if (entry_index == num_entries) + return num_entries; + +#ifndef NDEBUG + // Sanity check that the key only appears once. + int count = 0; + for (size_t i = 0; i < num_entries; ++i) { + if (strncmp(entries_[i].key, key, key_size) == 0) + ++count; + } + assert(count == 1); +#endif + + strncpy(entries_[entry_index].value, value, value_size); + entries_[entry_index].value[value_size - 1] = '\0'; + + return entry_index; + } + + // Sets a value for a key that has already been set with SetKeyValue(), using + // the index returned from that function. + void SetValueAtIndex(size_t index, const char* value) { + assert(index < num_entries); + if (index >= num_entries) + return; + + Entry* entry = &entries_[index]; + assert(entry->key[0] != '\0'); + + strncpy(entry->value, value, value_size); + entry->value[value_size - 1] = '\0'; + } + + // Given |key|, removes any associated value. |key| must not be NULL. If + // the key is not found, this is a noop. This invalidates the index + // returned by SetKeyValue(). + bool RemoveKey(const char* key) { + assert(key); + if (!key) + return false; + + return RemoveAtIndex(GetEntryIndexForKey(key)); + } + + // Removes a value and key using an index that was returned from + // SetKeyValue(). After a call to this function, the index is invalidated. + bool RemoveAtIndex(size_t index) { + if (index >= num_entries) + return false; + + entries_[index].key[0] = '\0'; + entries_[index].value[0] = '\0'; + return true; + } + + // Places a serialized version of the map into |map| and returns the size. + // Both of these should be passed to the deserializing constructor. Note that + // the serialized |map| is scoped to the lifetime of the non-serialized + // instance of this class. The |map| can be copied across IPC boundaries. + size_t Serialize(const SerializedNonAllocatingMap** map) const { + *map = reinterpret_cast(entries_); + return sizeof(entries_); + } + + private: + size_t GetEntryIndexForKey(const char* key) const { + for (size_t i = 0; i < num_entries; ++i) { + if (strncmp(key, entries_[i].key, key_size) == 0) { + return i; + } + } + return num_entries; + } + + Entry entries_[NumEntries]; +}; + +// For historical reasons this specialized version is available with the same +// size factors as a previous implementation. +typedef NonAllocatingMap<256, 256, 64> SimpleStringDictionary; + +} // namespace google_breakpad + +#endif // COMMON_SIMPLE_STRING_DICTIONARY_H_ diff --git a/src/common/simple_string_dictionary_unittest.cc b/src/common/simple_string_dictionary_unittest.cc new file mode 100644 index 0000000..b4dd7fe --- /dev/null +++ b/src/common/simple_string_dictionary_unittest.cc @@ -0,0 +1,342 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "breakpad_googletest_includes.h" +#include "common/simple_string_dictionary.h" + +namespace google_breakpad { + +TEST(NonAllocatingMapTest, Entry) { + typedef NonAllocatingMap<5, 9, 15> TestMap; + TestMap map; + + const TestMap::Entry* entry = TestMap::Iterator(map).Next(); + EXPECT_FALSE(entry); + + // Try setting a key/value and then verify. + map.SetKeyValue("key1", "value1"); + entry = TestMap::Iterator(map).Next(); + ASSERT_TRUE(entry); + EXPECT_STREQ(entry->key, "key1"); + EXPECT_STREQ(entry->value, "value1"); + + // Try setting a new value. + map.SetKeyValue("key1", "value3"); + EXPECT_STREQ(entry->value, "value3"); + + // Make sure the key didn't change. + EXPECT_STREQ(entry->key, "key1"); + + // Clear the entry and verify the key and value are empty strings. + map.RemoveKey("key1"); + EXPECT_FALSE(entry->is_active()); + EXPECT_EQ(strlen(entry->key), 0u); + EXPECT_EQ(strlen(entry->value), 0u); +} + +TEST(NonAllocatingMapTest, SimpleStringDictionary) { + // Make a new dictionary + SimpleStringDictionary dict; + + // Set three distinct values on three keys + dict.SetKeyValue("key1", "value1"); + dict.SetKeyValue("key2", "value2"); + dict.SetKeyValue("key3", "value3"); + + EXPECT_NE(dict.GetValueForKey("key1"), "value1"); + EXPECT_NE(dict.GetValueForKey("key2"), "value2"); + EXPECT_NE(dict.GetValueForKey("key3"), "value3"); + EXPECT_EQ(dict.GetCount(), 3u); + // try an unknown key + EXPECT_FALSE(dict.GetValueForKey("key4")); + + // Remove a key + dict.RemoveKey("key3"); + + // Now make sure it's not there anymore + EXPECT_FALSE(dict.GetValueForKey("key3")); + + // Remove by setting value to NULL + dict.SetKeyValue("key2", NULL); + + // Now make sure it's not there anymore + EXPECT_FALSE(dict.GetValueForKey("key2")); +} + +TEST(NonAllocatingMapTest, CopyAndAssign) { + NonAllocatingMap<10, 10, 10> map; + map.SetKeyValue("one", "a"); + map.SetKeyValue("two", "b"); + map.SetKeyValue("three", "c"); + map.RemoveKey("two"); + EXPECT_EQ(2u, map.GetCount()); + + // Test copy. + NonAllocatingMap<10, 10, 10> map_copy(map); + EXPECT_EQ(2u, map_copy.GetCount()); + EXPECT_STREQ("a", map_copy.GetValueForKey("one")); + EXPECT_STREQ("c", map_copy.GetValueForKey("three")); + map_copy.SetKeyValue("four", "d"); + EXPECT_STREQ("d", map_copy.GetValueForKey("four")); + EXPECT_FALSE(map.GetValueForKey("four")); + + // Test assign. + NonAllocatingMap<10, 10, 10> map_assign; + map_assign = map; + EXPECT_EQ(2u, map_assign.GetCount()); + EXPECT_STREQ("a", map_assign.GetValueForKey("one")); + EXPECT_STREQ("c", map_assign.GetValueForKey("three")); + map_assign.SetKeyValue("four", "d"); + EXPECT_STREQ("d", map_assign.GetValueForKey("four")); + EXPECT_FALSE(map.GetValueForKey("four")); + + map.RemoveKey("one"); + EXPECT_FALSE(map.GetValueForKey("one")); + EXPECT_STREQ("a", map_copy.GetValueForKey("one")); + EXPECT_STREQ("a", map_assign.GetValueForKey("one")); +} + +// Add a bunch of values to the dictionary, remove some entries in the middle, +// and then add more. +TEST(NonAllocatingMapTest, Iterator) { + SimpleStringDictionary* dict = new SimpleStringDictionary(); + ASSERT_TRUE(dict); + + char key[SimpleStringDictionary::key_size]; + char value[SimpleStringDictionary::value_size]; + + const int kDictionaryCapacity = SimpleStringDictionary::num_entries; + const int kPartitionIndex = kDictionaryCapacity - 5; + + // We assume at least this size in the tests below + ASSERT_GE(kDictionaryCapacity, 64); + + // We'll keep track of the number of key/value pairs we think should + // be in the dictionary + int expectedDictionarySize = 0; + + // Set a bunch of key/value pairs like key0/value0, key1/value1, ... + for (int i = 0; i < kPartitionIndex; ++i) { + sprintf(key, "key%d", i); + sprintf(value, "value%d", i); + dict->SetKeyValue(key, value); + } + expectedDictionarySize = kPartitionIndex; + + // set a couple of the keys twice (with the same value) - should be nop + dict->SetKeyValue("key2", "value2"); + dict->SetKeyValue("key4", "value4"); + dict->SetKeyValue("key15", "value15"); + + // Remove some random elements in the middle + dict->RemoveKey("key7"); + dict->RemoveKey("key18"); + dict->RemoveKey("key23"); + dict->RemoveKey("key31"); + expectedDictionarySize -= 4; // we just removed four key/value pairs + + // Set some more key/value pairs like key59/value59, key60/value60, ... + for (int i = kPartitionIndex; i < kDictionaryCapacity; ++i) { + sprintf(key, "key%d", i); + sprintf(value, "value%d", i); + dict->SetKeyValue(key, value); + } + expectedDictionarySize += kDictionaryCapacity - kPartitionIndex; + + // Now create an iterator on the dictionary + SimpleStringDictionary::Iterator iter(*dict); + + // We then verify that it iterates through exactly the number of + // key/value pairs we expect, and that they match one-for-one with what we + // would expect. The ordering of the iteration does not matter... + + // used to keep track of number of occurrences found for key/value pairs + int count[kDictionaryCapacity]; + memset(count, 0, sizeof(count)); + + int totalCount = 0; + + const SimpleStringDictionary::Entry* entry; + while ((entry = iter.Next())) { + totalCount++; + + // Extract keyNumber from a string of the form key + int keyNumber; + sscanf(entry->key, "key%d", &keyNumber); + + // Extract valueNumber from a string of the form value + int valueNumber; + sscanf(entry->value, "value%d", &valueNumber); + + // The value number should equal the key number since that's how we set them + EXPECT_EQ(keyNumber, valueNumber); + + // Key and value numbers should be in proper range: + // 0 <= keyNumber < kDictionaryCapacity + bool isKeyInGoodRange = + (keyNumber >= 0 && keyNumber < kDictionaryCapacity); + bool isValueInGoodRange = + (valueNumber >= 0 && valueNumber < kDictionaryCapacity); + EXPECT_TRUE(isKeyInGoodRange); + EXPECT_TRUE(isValueInGoodRange); + + if (isKeyInGoodRange && isValueInGoodRange) { + ++count[keyNumber]; + } + } + + // Make sure each of the key/value pairs showed up exactly one time, except + // for the ones which we removed. + for (size_t i = 0; i < kDictionaryCapacity; ++i) { + // Skip over key7, key18, key23, and key31, since we removed them + if (!(i == 7 || i == 18 || i == 23 || i == 31)) { + EXPECT_EQ(count[i], 1); + } + } + + // Make sure the number of iterations matches the expected dictionary size. + EXPECT_EQ(totalCount, expectedDictionarySize); +} + + +TEST(NonAllocatingMapTest, AddRemove) { + NonAllocatingMap<5, 7, 6> map; + map.SetKeyValue("rob", "ert"); + map.SetKeyValue("mike", "pink"); + map.SetKeyValue("mark", "allays"); + + EXPECT_EQ(3u, map.GetCount()); + EXPECT_STREQ("ert", map.GetValueForKey("rob")); + EXPECT_STREQ("pink", map.GetValueForKey("mike")); + EXPECT_STREQ("allays", map.GetValueForKey("mark")); + + map.RemoveKey("mike"); + + EXPECT_EQ(2u, map.GetCount()); + EXPECT_FALSE(map.GetValueForKey("mike")); + + map.SetKeyValue("mark", "mal"); + EXPECT_EQ(2u, map.GetCount()); + EXPECT_STREQ("mal", map.GetValueForKey("mark")); + + map.RemoveKey("mark"); + EXPECT_EQ(1u, map.GetCount()); + EXPECT_FALSE(map.GetValueForKey("mark")); +} + +TEST(NonAllocatingMapTest, Serialize) { + typedef NonAllocatingMap<4, 5, 7> TestMap; + TestMap map; + map.SetKeyValue("one", "abc"); + map.SetKeyValue("two", "def"); + map.SetKeyValue("tre", "hig"); + + EXPECT_STREQ("abc", map.GetValueForKey("one")); + EXPECT_STREQ("def", map.GetValueForKey("two")); + EXPECT_STREQ("hig", map.GetValueForKey("tre")); + + const SerializedNonAllocatingMap* serialized; + size_t size = map.Serialize(&serialized); + + SerializedNonAllocatingMap* serialized_copy = + reinterpret_cast(malloc(size)); + ASSERT_TRUE(serialized_copy); + memcpy(serialized_copy, serialized, size); + + TestMap deserialized(serialized_copy, size); + free(serialized_copy); + + EXPECT_EQ(3u, deserialized.GetCount()); + EXPECT_STREQ("abc", deserialized.GetValueForKey("one")); + EXPECT_STREQ("def", deserialized.GetValueForKey("two")); + EXPECT_STREQ("hig", deserialized.GetValueForKey("tre")); +} + +// Running out of space shouldn't crash. +TEST(NonAllocatingMapTest, OutOfSpace) { + NonAllocatingMap<3, 2, 2> map; + map.SetKeyValue("a", "1"); + map.SetKeyValue("b", "2"); + map.SetKeyValue("c", "3"); + EXPECT_EQ(2u, map.GetCount()); + EXPECT_FALSE(map.GetValueForKey("c")); +} + +TEST(NonAllocatingMapTest, ByIndex) { + NonAllocatingMap<10, 10, 3> map; + + size_t index1 = map.SetKeyValue("test", "one"); + EXPECT_TRUE(index1 >= 0 && index1 <= map.num_entries); + + size_t index2 = map.SetKeyValue("moo", "foo"); + EXPECT_TRUE(index2 >= 0 && index2 <= map.num_entries); + EXPECT_NE(index1, index2); + + size_t index3 = map.SetKeyValue("blob", "kebab"); + EXPECT_TRUE(index3 >= 0 && index3 <= map.num_entries); + EXPECT_NE(index2, index3); + + size_t index4 = map.SetKeyValue("nogo", "full"); + EXPECT_TRUE(index4 == map.num_entries); + + EXPECT_STREQ("one", map.GetValueForKey("test")); + EXPECT_STREQ("foo", map.GetValueForKey("moo")); + EXPECT_STREQ("kebab", map.GetValueForKey("blob")); + + map.SetValueAtIndex(index2, "booo"); + EXPECT_STREQ("booo", map.GetValueForKey("moo")); + + EXPECT_TRUE(map.RemoveAtIndex(index1)); + EXPECT_FALSE(map.GetValueForKey("test")); + + EXPECT_FALSE(map.RemoveAtIndex(map.num_entries)); + EXPECT_FALSE(map.RemoveAtIndex(9999)); +} + +#ifndef NDEBUG + +TEST(NonAllocatingMapTest, NullKey) { + NonAllocatingMap<4, 6, 6> map; + ASSERT_DEATH(map.SetKeyValue(NULL, "hello"), ""); + + map.SetKeyValue("hi", "there"); + ASSERT_DEATH(map.GetValueForKey(NULL), ""); + EXPECT_STREQ("there", map.GetValueForKey("hi")); + + ASSERT_DEATH(map.GetValueForKey(NULL), ""); + map.RemoveKey("hi"); + EXPECT_EQ(0u, map.GetCount()); +} + +#endif // !NDEBUG + +} // namespace google_breakpad diff --git a/src/common/solaris/dump_symbols.cc b/src/common/solaris/dump_symbols.cc new file mode 100644 index 0000000..09e5b37 --- /dev/null +++ b/src/common/solaris/dump_symbols.cc @@ -0,0 +1,683 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "common/scoped_ptr.h" +#include "common/solaris/dump_symbols.h" +#include "common/solaris/file_id.h" +#include "common/solaris/guid_creator.h" + +// This namespace contains helper functions. +namespace { + +using std::make_pair; + +#if defined(_LP64) +typedef Elf64_Sym Elf_Sym; +#else +typedef Elf32_Sym Elf_Sym; +#endif + +// Symbol table entry from stabs. Sun CC specific. +struct slist { + // String table index. + unsigned int n_strx; + // Stab type. + unsigned char n_type; + char n_other; + short n_desc; + unsigned long n_value; +}; + +// Symbol table entry +struct SymbolEntry { + // Offset from the start of the file. + GElf_Addr offset; + // Function size. + GElf_Word size; +}; + +// Infomation of a line. +struct LineInfo { + // Offset from start of the function. + // Load from stab symbol. + GElf_Off rva_to_func; + // Offset from base of the loading binary. + GElf_Off rva_to_base; + // Size of the line. + // The first line: equals to rva_to_func. + // The other lines: the difference of rva_to_func of the line and + // rva_to_func of the previous N_SLINE. + uint32_t size; + // Line number. + uint32_t line_num; +}; + +// Information of a function. +struct FuncInfo { + // Name of the function. + const char* name; + // Offset from the base of the loading address. + GElf_Off rva_to_base; + // Virtual address of the function. + // Load from stab symbol. + GElf_Addr addr; + // Size of the function. + // Equal to rva_to_func of the last function line. + uint32_t size; + // Total size of stack parameters. + uint32_t stack_param_size; + // Line information array. + std::vector line_info; +}; + +// Information of a source file. +struct SourceFileInfo { + // Name of the source file. + const char* name; + // Starting address of the source file. + GElf_Addr addr; + // Id of the source file. + int source_id; + // Functions information. + std::vector func_info; +}; + +struct CompareString { + bool operator()(const char* s1, const char* s2) const { + return strcmp(s1, s2) < 0; + } +}; + +typedef std::map SymbolMap; + +// Information of a symbol table. +// This is the root of all types of symbol. +struct SymbolInfo { + std::vector source_file_info; + // Symbols information. + SymbolMap symbol_entries; +}; + +// Stab section name. +const char* kStabName = ".stab"; + +// Stab str section name. +const char* kStabStrName = ".stabstr"; + +// Symtab section name. +const char* kSymtabName = ".symtab"; + +// Strtab section name. +const char* kStrtabName = ".strtab"; + +// Default buffer lenght for demangle. +const int demangleLen = 20000; + +// Offset to the string table. +uint64_t stringOffset = 0; + +// Update the offset to the start of the string index of the next +// object module for every N_ENDM stabs. +inline void RecalculateOffset(struct slist* cur_list, char* stabstr) { + while ((--cur_list)->n_strx == 0) ; + stringOffset += cur_list->n_strx; + + char* temp = stabstr + stringOffset; + while (*temp != '\0') { + ++stringOffset; + ++temp; + } + // Skip the extra '\0' + ++stringOffset; +} + +// Demangle using demangle library on Solaris. +std::string Demangle(const char* mangled) { + int status = 0; + std::string str(mangled); + char* demangled = (char*)malloc(demangleLen); + + if (!demangled) { + fprintf(stderr, "no enough memory.\n"); + goto out; + } + + if ((status = cplus_demangle(mangled, demangled, demangleLen)) == + DEMANGLE_ESPACE) { + fprintf(stderr, "incorrect demangle.\n"); + goto out; + } + + str = demangled; + free(demangled); + +out: + return str; +} + +bool WriteFormat(int fd, const char* fmt, ...) { + va_list list; + char buffer[4096]; + ssize_t expected, written; + va_start(list, fmt); + vsnprintf(buffer, sizeof(buffer), fmt, list); + expected = strlen(buffer); + written = write(fd, buffer, strlen(buffer)); + va_end(list); + return expected == written; +} + +bool IsValidElf(const GElf_Ehdr* elf_header) { + return memcmp(elf_header, ELFMAG, SELFMAG) == 0; +} + +static bool FindSectionByName(Elf* elf, const char* name, + int shstrndx, + GElf_Shdr* shdr) { + assert(name != NULL); + + if (strlen(name) == 0) + return false; + + Elf_Scn* scn = NULL; + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + if (gelf_getshdr(scn, shdr) == (GElf_Shdr*)0) { + fprintf(stderr, "failed to read section header: %s\n", elf_errmsg(0)); + return false; + } + + const char* section_name = elf_strptr(elf, shstrndx, shdr->sh_name); + if (!section_name) { + fprintf(stderr, "Section name error: %s\n", elf_errmsg(-1)); + continue; + } + + if (strcmp(section_name, name) == 0) + return true; + } + + return false; +} + +// The parameter size is used for FPO-optimized code, and +// this is all tied up with the debugging data for Windows x86. +// Set it to 0 on Solaris. +int LoadStackParamSize(struct slist* list, + struct slist* list_end, + struct FuncInfo* func_info) { + struct slist* cur_list = list; + int step = 1; + while (cur_list < list_end && cur_list->n_type == N_PSYM) { + ++cur_list; + ++step; + } + + func_info->stack_param_size = 0; + return step; +} + +int LoadLineInfo(struct slist* list, + struct slist* list_end, + struct FuncInfo* func_info) { + struct slist* cur_list = list; + do { + // Skip non line information. + while (cur_list < list_end && cur_list->n_type != N_SLINE) { + // Only exit when got another function, or source file, or end stab. + if (cur_list->n_type == N_FUN || cur_list->n_type == N_SO || + cur_list->n_type == N_ENDM) { + return cur_list - list; + } + ++cur_list; + } + struct LineInfo line; + while (cur_list < list_end && cur_list->n_type == N_SLINE) { + line.rva_to_func = cur_list->n_value; + // n_desc is a signed short + line.line_num = (unsigned short)cur_list->n_desc; + func_info->line_info.push_back(line); + ++cur_list; + } + if (cur_list == list_end && cur_list->n_type == N_ENDM) + break; + } while (list < list_end); + + return cur_list - list; +} + +int LoadFuncSymbols(struct slist* list, + struct slist* list_end, + char* stabstr, + GElf_Word base, + struct SourceFileInfo* source_file_info) { + struct slist* cur_list = list; + assert(cur_list->n_type == N_SO); + ++cur_list; + + source_file_info->func_info.clear(); + while (cur_list < list_end) { + // Go until the function symbol. + while (cur_list < list_end && cur_list->n_type != N_FUN) { + if (cur_list->n_type == N_SO) { + return cur_list - list; + } + ++cur_list; + if (cur_list->n_type == N_ENDM) + RecalculateOffset(cur_list, stabstr); + continue; + } + while (cur_list->n_type == N_FUN) { + struct FuncInfo func_info; + memset(&func_info, 0, sizeof(func_info)); + func_info.name = stabstr + cur_list->n_strx + stringOffset; + // The n_value field is always 0 from stab generated by Sun CC. + // TODO(Alfred): Find the correct value. + func_info.addr = cur_list->n_value; + ++cur_list; + if (cur_list->n_type == N_ENDM) + RecalculateOffset(cur_list, stabstr); + if (cur_list->n_type != N_ESYM && cur_list->n_type != N_ISYM && + cur_list->n_type != N_FUN) { + // Stack parameter size. + cur_list += LoadStackParamSize(cur_list, list_end, &func_info); + // Line info. + cur_list += LoadLineInfo(cur_list, list_end, &func_info); + } + if (cur_list < list_end && cur_list->n_type == N_ENDM) + RecalculateOffset(cur_list, stabstr); + // Functions in this module should have address bigger than the module + // starting address. + // + // These two values are always 0 with Sun CC. + // TODO(Alfred): Get the correct value or remove the condition statement. + if (func_info.addr >= source_file_info->addr) { + source_file_info->func_info.push_back(func_info); + } + } + } + return cur_list - list; +} + +// Compute size and rva information based on symbols loaded from stab section. +bool ComputeSizeAndRVA(struct SymbolInfo* symbols) { + std::vector* sorted_files = + &(symbols->source_file_info); + SymbolMap* symbol_entries = &(symbols->symbol_entries); + for (size_t i = 0; i < sorted_files->size(); ++i) { + struct SourceFileInfo& source_file = (*sorted_files)[i]; + std::vector* sorted_functions = &(source_file.func_info); + int func_size = sorted_functions->size(); + + for (size_t j = 0; j < func_size; ++j) { + struct FuncInfo& func_info = (*sorted_functions)[j]; + int line_count = func_info.line_info.size(); + + // Discard the ending part of the name. + std::string func_name(func_info.name); + std::string::size_type last_colon = func_name.find_first_of(':'); + if (last_colon != std::string::npos) + func_name = func_name.substr(0, last_colon); + + // Fine the symbol offset from the loading address and size by name. + SymbolMap::const_iterator it = symbol_entries->find(func_name.c_str()); + if (it->second) { + func_info.rva_to_base = it->second->offset; + func_info.size = (line_count == 0) ? 0 : it->second->size; + } else { + func_info.rva_to_base = 0; + func_info.size = 0; + } + + // Compute function and line size. + for (size_t k = 0; k < line_count; ++k) { + struct LineInfo& line_info = func_info.line_info[k]; + + line_info.rva_to_base = line_info.rva_to_func + func_info.rva_to_base; + if (k == line_count - 1) { + line_info.size = func_info.size - line_info.rva_to_func; + } else { + struct LineInfo& next_line = func_info.line_info[k + 1]; + line_info.size = next_line.rva_to_func - line_info.rva_to_func; + } + } // for each line. + } // for each function. + } // for each source file. + for (SymbolMap::iterator it = symbol_entries->begin(); + it != symbol_entries->end(); ++it) { + free(it->second); + } + return true; +} + +bool LoadAllSymbols(const GElf_Shdr* stab_section, + const GElf_Shdr* stabstr_section, + GElf_Word base, + struct SymbolInfo* symbols) { + if (stab_section == NULL || stabstr_section == NULL) + return false; + + char* stabstr = reinterpret_cast(stabstr_section->sh_offset + base); + struct slist* lists = + reinterpret_cast(stab_section->sh_offset + base); + int nstab = stab_section->sh_size / sizeof(struct slist); + int source_id = 0; + + // First pass, load all symbols from the object file. + for (int i = 0; i < nstab; ) { + int step = 1; + struct slist* cur_list = lists + i; + if (cur_list->n_type == N_SO) { + // FUNC
    + struct SourceFileInfo source_file_info; + source_file_info.name = stabstr + cur_list->n_strx + stringOffset; + // The n_value field is always 0 from stab generated by Sun CC. + // TODO(Alfred): Find the correct value. + source_file_info.addr = cur_list->n_value; + if (strchr(source_file_info.name, '.')) + source_file_info.source_id = source_id++; + else + source_file_info.source_id = -1; + step = LoadFuncSymbols(cur_list, lists + nstab - 1, stabstr, + base, &source_file_info); + symbols->source_file_info.push_back(source_file_info); + } + i += step; + } + // Second pass, compute the size of functions and lines. + return ComputeSizeAndRVA(symbols); +} + +bool LoadSymbols(Elf* elf, GElf_Ehdr* elf_header, struct SymbolInfo* symbols, + void* obj_base) { + GElf_Word base = reinterpret_cast(obj_base); + + const GElf_Shdr* sections = + reinterpret_cast(elf_header->e_shoff + base); + GElf_Shdr stab_section; + if (!FindSectionByName(elf, kStabName, elf_header->e_shstrndx, + &stab_section)) { + fprintf(stderr, "Stab section not found.\n"); + return false; + } + GElf_Shdr stabstr_section; + if (!FindSectionByName(elf, kStabStrName, elf_header->e_shstrndx, + &stabstr_section)) { + fprintf(stderr, "Stabstr section not found.\n"); + return false; + } + GElf_Shdr symtab_section; + if (!FindSectionByName(elf, kSymtabName, elf_header->e_shstrndx, + &symtab_section)) { + fprintf(stderr, "Symtab section not found.\n"); + return false; + } + GElf_Shdr strtab_section; + if (!FindSectionByName(elf, kStrtabName, elf_header->e_shstrndx, + &strtab_section)) { + fprintf(stderr, "Strtab section not found.\n"); + return false; + } + + Elf_Sym* symbol = (Elf_Sym*)((char*)base + symtab_section.sh_offset); + for (int i = 0; i < symtab_section.sh_size/symtab_section.sh_entsize; ++i) { + struct SymbolEntry* symbol_entry = + (struct SymbolEntry*)malloc(sizeof(struct SymbolEntry)); + const char* name = reinterpret_cast( + strtab_section.sh_offset + (GElf_Word)base + symbol->st_name); + symbol_entry->offset = symbol->st_value; + symbol_entry->size = symbol->st_size; + symbols->symbol_entries.insert(make_pair(name, symbol_entry)); + ++symbol; + } + + + // Load symbols. + return LoadAllSymbols(&stab_section, &stabstr_section, base, symbols); +} + +bool WriteModuleInfo(int fd, GElf_Half arch, const std::string& obj_file) { + const char* arch_name = NULL; + if (arch == EM_386) + arch_name = "x86"; + else if (arch == EM_X86_64) + arch_name = "x86_64"; + else if (arch == EM_SPARC32PLUS) + arch_name = "SPARC_32+"; + else { + printf("Please add more ARCH support\n"); + return false; + } + + unsigned char identifier[16]; + google_breakpad::elf::FileID file_id(obj_file.c_str()); + if (file_id.ElfFileIdentifier(identifier)) { + char identifier_str[40]; + file_id.ConvertIdentifierToString(identifier, + identifier_str, sizeof(identifier_str)); + std::string filename = obj_file; + size_t slash_pos = obj_file.find_last_of("/"); + if (slash_pos != std::string::npos) + filename = obj_file.substr(slash_pos + 1); + return WriteFormat(fd, "MODULE solaris %s %s %s\n", arch_name, + identifier_str, filename.c_str()); + } + return false; +} + +bool WriteSourceFileInfo(int fd, const struct SymbolInfo& symbols) { + for (size_t i = 0; i < symbols.source_file_info.size(); ++i) { + if (symbols.source_file_info[i].source_id != -1) { + const char* name = symbols.source_file_info[i].name; + if (!WriteFormat(fd, "FILE %d %s\n", + symbols.source_file_info[i].source_id, name)) + return false; + } + } + return true; +} + +bool WriteOneFunction(int fd, int source_id, + const struct FuncInfo& func_info){ + // Discard the ending part of the name. + std::string func_name(func_info.name); + std::string::size_type last_colon = func_name.find_last_of(':'); + if (last_colon != std::string::npos) + func_name = func_name.substr(0, last_colon); + func_name = Demangle(func_name.c_str()); + + if (func_info.size <= 0) + return true; + + // rva_to_base could be unsigned long(32 bit) or unsigned long long(64 bit). + if (WriteFormat(fd, "FUNC %llx %x %d %s\n", + (long long)func_info.rva_to_base, + func_info.size, + func_info.stack_param_size, + func_name.c_str())) { + for (size_t i = 0; i < func_info.line_info.size(); ++i) { + const struct LineInfo& line_info = func_info.line_info[i]; + if (line_info.line_num == 0) + return true; + if (!WriteFormat(fd, "%llx %x %d %d\n", + (long long)line_info.rva_to_base, + line_info.size, + line_info.line_num, + source_id)) + return false; + } + return true; + } + return false; +} + +bool WriteFunctionInfo(int fd, const struct SymbolInfo& symbols) { + for (size_t i = 0; i < symbols.source_file_info.size(); ++i) { + const struct SourceFileInfo& file_info = symbols.source_file_info[i]; + for (size_t j = 0; j < file_info.func_info.size(); ++j) { + const struct FuncInfo& func_info = file_info.func_info[j]; + if (!WriteOneFunction(fd, file_info.source_id, func_info)) + return false; + } + } + return true; +} + +bool DumpStabSymbols(int fd, const struct SymbolInfo& symbols) { + return WriteSourceFileInfo(fd, symbols) && + WriteFunctionInfo(fd, symbols); +} + +// +// FDWrapper +// +// Wrapper class to make sure opened file is closed. +// +class FDWrapper { + public: + explicit FDWrapper(int fd) : + fd_(fd) { + } + ~FDWrapper() { + if (fd_ != -1) + close(fd_); + } + int get() { + return fd_; + } + int release() { + int fd = fd_; + fd_ = -1; + return fd; + } + private: + int fd_; +}; + +// +// MmapWrapper +// +// Wrapper class to make sure mapped regions are unmapped. +// +class MmapWrapper { + public: + MmapWrapper(void* mapped_address, size_t mapped_size) : + base_(mapped_address), size_(mapped_size) { + } + ~MmapWrapper() { + if (base_ != NULL) { + assert(size_ > 0); + munmap((char*)base_, size_); + } + } + void release() { + base_ = NULL; + size_ = 0; + } + + private: + void* base_; + size_t size_; +}; + +} // namespace + +namespace google_breakpad { + +class AutoElfEnder { + public: + AutoElfEnder(Elf* elf) : elf_(elf) {} + ~AutoElfEnder() { if (elf_) elf_end(elf_); } + private: + Elf* elf_; +}; + + +bool DumpSymbols::WriteSymbolFile(const std::string& obj_file, int sym_fd) { + if (elf_version(EV_CURRENT) == EV_NONE) { + fprintf(stderr, "elf_version() failed: %s\n", elf_errmsg(0)); + return false; + } + + int obj_fd = open(obj_file.c_str(), O_RDONLY); + if (obj_fd < 0) + return false; + FDWrapper obj_fd_wrapper(obj_fd); + struct stat st; + if (fstat(obj_fd, &st) != 0 && st.st_size <= 0) + return false; + void* obj_base = mmap(NULL, st.st_size, + PROT_READ, MAP_PRIVATE, obj_fd, 0); + if (obj_base == MAP_FAILED) + return false; + MmapWrapper map_wrapper(obj_base, st.st_size); + GElf_Ehdr elf_header; + Elf* elf = elf_begin(obj_fd, ELF_C_READ, NULL); + AutoElfEnder elfEnder(elf); + + if (gelf_getehdr(elf, &elf_header) == (GElf_Ehdr*)NULL) { + fprintf(stderr, "failed to read elf header: %s\n", elf_errmsg(-1)); + return false; + } + + if (!IsValidElf(&elf_header)) { + fprintf(stderr, "header magic doesn't match\n"); + return false; + } + struct SymbolInfo symbols; + if (!LoadSymbols(elf, &elf_header, &symbols, obj_base)) + return false; + // Write to symbol file. + if (WriteModuleInfo(sym_fd, elf_header.e_machine, obj_file) && + DumpStabSymbols(sym_fd, symbols)) + return true; + + return false; +} + +} // namespace google_breakpad diff --git a/src/common/solaris/dump_symbols.h b/src/common/solaris/dump_symbols.h new file mode 100644 index 0000000..9c986e4 --- /dev/null +++ b/src/common/solaris/dump_symbols.h @@ -0,0 +1,48 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// dump_symbols.cc: Implements a Solaris stab debugging format dumper. +// +// Author: Alfred Peng + +#ifndef COMMON_SOLARIS_DUMP_SYMBOLS_H__ +#define COMMON_SOLARIS_DUMP_SYMBOLS_H__ + +#include + +namespace google_breakpad { + +class DumpSymbols { + public: + bool WriteSymbolFile(const std::string& obj_file, + int sym_fd); +}; + +} // namespace google_breakpad + +#endif // COMMON_SOLARIS_DUMP_SYMBOLS_H__ diff --git a/src/common/solaris/file_id.cc b/src/common/solaris/file_id.cc new file mode 100644 index 0000000..5a9982b --- /dev/null +++ b/src/common/solaris/file_id.cc @@ -0,0 +1,203 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// file_id.cc: Return a unique identifier for a file +// +// See file_id.h for documentation +// +// Author: Alfred Peng + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "common/md5.h" +#include "common/solaris/file_id.h" +#include "common/solaris/message_output.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +class AutoElfEnder { + public: + AutoElfEnder(Elf* elf) : elf_(elf) {} + ~AutoElfEnder() { if (elf_) elf_end(elf_); } + private: + Elf* elf_; +}; + +// Find the text section in elf object file. +// Return the section start address and the size. +static bool FindElfTextSection(int fd, const void* elf_base, + const void** text_start, + int* text_size) { + assert(text_start); + assert(text_size); + + *text_start = NULL; + *text_size = 0; + + if (elf_version(EV_CURRENT) == EV_NONE) { + print_message2(2, "elf_version() failed: %s\n", elf_errmsg(0)); + return false; + } + + GElf_Ehdr elf_header; + lseek(fd, 0L, 0); + Elf* elf = elf_begin(fd, ELF_C_READ, NULL); + AutoElfEnder elfEnder(elf); + + if (gelf_getehdr(elf, &elf_header) == (GElf_Ehdr*)NULL) { + print_message2(2, "failed to read elf header: %s\n", elf_errmsg(-1)); + return false; + } + + if (elf_header.e_ident[EI_MAG0] != ELFMAG0 || + elf_header.e_ident[EI_MAG1] != ELFMAG1 || + elf_header.e_ident[EI_MAG2] != ELFMAG2 || + elf_header.e_ident[EI_MAG3] != ELFMAG3) { + print_message1(2, "header magic doesn't match\n"); + return false; + } + + static const char kTextSectionName[] = ".text"; + const GElf_Shdr* text_section = NULL; + Elf_Scn* scn = NULL; + GElf_Shdr shdr; + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + if (gelf_getshdr(scn, &shdr) == (GElf_Shdr*)0) { + print_message2(2, "failed to read section header: %s\n", elf_errmsg(0)); + return false; + } + + if (shdr.sh_type == SHT_PROGBITS) { + const char* section_name = elf_strptr(elf, elf_header.e_shstrndx, + shdr.sh_name); + if (!section_name) { + print_message2(2, "Section name error: %s\n", elf_errmsg(-1)); + continue; + } + + if (strcmp(section_name, kTextSectionName) == 0) { + text_section = &shdr; + break; + } + } + } + if (text_section != NULL && text_section->sh_size > 0) { + *text_start = (char*)elf_base + text_section->sh_offset; + *text_size = text_section->sh_size; + return true; + } + + return false; +} + +class AutoCloser { + public: + AutoCloser(int fd) : fd_(fd) {} + ~AutoCloser() { if (fd_) close(fd_); } + private: + int fd_; +}; + +namespace elf { + +FileID::FileID(const char* path) { + strcpy(path_, path); +} + +bool FileID::ElfFileIdentifier(unsigned char identifier[16]) { + int fd = 0; + if ((fd = open(path_, O_RDONLY)) < 0) + return false; + + AutoCloser autocloser(fd); + struct stat st; + if (fstat(fd, &st) != 0 || st.st_size <= 0) + return false; + + void* base = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (base == MAP_FAILED) + return false; + + bool success = false; + const void* text_section = NULL; + int text_size = 0; + + if (FindElfTextSection(fd, base, &text_section, &text_size)) { + MD5Context md5; + MD5Init(&md5); + MD5Update(&md5, (const unsigned char*)text_section, text_size); + MD5Final(identifier, &md5); + success = true; + } + + munmap((char*)base, st.st_size); + return success; +} + +// static +bool FileID::ConvertIdentifierToString(const unsigned char identifier[16], + char* buffer, int buffer_length) { + if (buffer_length < 34) + return false; + + int buffer_idx = 0; + for (int idx = 0; idx < 16; ++idx) { + int hi = (identifier[idx] >> 4) & 0x0F; + int lo = (identifier[idx]) & 0x0F; + + buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi; + buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo; + } + + // Add an extra "0" by the end. + buffer[buffer_idx++] = '0'; + + // NULL terminate + buffer[buffer_idx] = 0; + + return true; +} + +} // elf +} // namespace google_breakpad diff --git a/src/common/solaris/file_id.h b/src/common/solaris/file_id.h new file mode 100644 index 0000000..2e41f0a --- /dev/null +++ b/src/common/solaris/file_id.h @@ -0,0 +1,67 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// file_id.h: Return a unique identifier for a file +// +// Author: Alfred Peng + +#ifndef COMMON_SOLARIS_FILE_ID_H__ +#define COMMON_SOLARIS_FILE_ID_H__ + +#include + +namespace google_breakpad { +namespace elf { + +class FileID { + public: + FileID(const char *path); + ~FileID() {}; + + // Load the identifier for the elf file path specified in the constructor into + // |identifier|. Return false if the identifier could not be created for the + // file. + // The current implementation will return the MD5 hash of the file's bytes. + bool ElfFileIdentifier(unsigned char identifier[16]); + + // Convert the |identifier| data to a NULL terminated string. The string will + // be formatted as a MDCVInfoPDB70 struct. + // The |buffer| should be at least 34 bytes long to receive all of the data + // and termination. Shorter buffers will return false. + static bool ConvertIdentifierToString(const unsigned char identifier[16], + char *buffer, int buffer_length); + + private: + // Storage for the path specified + char path_[PATH_MAX]; +}; + +} // elf +} // namespace google_breakpad + +#endif // COMMON_SOLARIS_FILE_ID_H__ diff --git a/src/common/solaris/guid_creator.cc b/src/common/solaris/guid_creator.cc new file mode 100644 index 0000000..998d249 --- /dev/null +++ b/src/common/solaris/guid_creator.cc @@ -0,0 +1,87 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include +#include + +#include "common/solaris/guid_creator.h" + +// +// GUIDGenerator +// +// This class is used to generate random GUID. +// Currently use random number to generate a GUID. This should be OK since +// we don't expect crash to happen very offen. +// +class GUIDGenerator { + public: + GUIDGenerator() { + srandom(time(NULL)); + } + + bool CreateGUID(GUID *guid) const { + guid->data1 = random(); + guid->data2 = (uint16_t)(random()); + guid->data3 = (uint16_t)(random()); + *reinterpret_cast(&guid->data4[0]) = random(); + *reinterpret_cast(&guid->data4[4]) = random(); + return true; + } +}; + +// Guid generator. +const GUIDGenerator kGuidGenerator; + +bool CreateGUID(GUID *guid) { + return kGuidGenerator.CreateGUID(guid); +} + +// Parse guid to string. +bool GUIDToString(const GUID *guid, char *buf, int buf_len) { + // Should allow more space the the max length of GUID. + assert(buf_len > kGUIDStringLength); + int num = snprintf(buf, buf_len, kGUIDFormatString, + guid->data1, guid->data2, guid->data3, + *reinterpret_cast(&(guid->data4[0])), + *reinterpret_cast(&(guid->data4[4]))); + if (num != kGUIDStringLength) + return false; + + buf[num] = '\0'; + return true; +} diff --git a/src/common/solaris/guid_creator.h b/src/common/solaris/guid_creator.h new file mode 100644 index 0000000..91ed004 --- /dev/null +++ b/src/common/solaris/guid_creator.h @@ -0,0 +1,49 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifndef COMMON_SOLARIS_GUID_CREATOR_H__ +#define COMMON_SOLARIS_GUID_CREATOR_H__ + +#include "google_breakpad/common/minidump_format.h" + +typedef MDGUID GUID; + +// Format string for parsing GUID. +#define kGUIDFormatString "%08x-%04x-%04x-%08x-%08x" +// Length of GUID string. Don't count the ending '\0'. +#define kGUIDStringLength 36 + +// Create a guid. +bool CreateGUID(GUID *guid); + +// Get the string from guid. +bool GUIDToString(const GUID *guid, char *buf, int buf_len); + +#endif // COMMON_SOLARIS_GUID_CREATOR_H__ diff --git a/src/common/solaris/message_output.h b/src/common/solaris/message_output.h new file mode 100644 index 0000000..9810dc5 --- /dev/null +++ b/src/common/solaris/message_output.h @@ -0,0 +1,53 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifndef COMMON_SOLARIS_MESSAGE_OUTPUT_H__ +#define COMMON_SOLARIS_MESSAGE_OUTPUT_H__ + +namespace google_breakpad { + +const int MESSAGE_MAX = 1000; + +// Message output macros. +// snprintf doesn't operate heap on Solaris, while printf and fprintf do. +// Use snprintf here to avoid heap allocation. +#define print_message1(std, message) \ + char buffer[MESSAGE_MAX]; \ + int len = snprintf(buffer, MESSAGE_MAX, message); \ + write(std, buffer, len) + +#define print_message2(std, message, para) \ + char buffer[MESSAGE_MAX]; \ + int len = snprintf(buffer, MESSAGE_MAX, message, para); \ + write(std, buffer, len); + +} // namespace google_breakpad + +#endif // COMMON_SOLARIS_MESSAGE_OUTPUT_H__ diff --git a/src/common/stabs_reader.cc b/src/common/stabs_reader.cc new file mode 100644 index 0000000..e18780c --- /dev/null +++ b/src/common/stabs_reader.cc @@ -0,0 +1,319 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// This file implements the google_breakpad::StabsReader class. +// See stabs_reader.h. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/stabs_reader.h" + +#include +#include +#include + +#include + +#include "common/using_std_string.h" + +using std::vector; + +namespace google_breakpad { + +StabsReader::EntryIterator::EntryIterator(const ByteBuffer* buffer, + bool big_endian, size_t value_size) + : value_size_(value_size), cursor_(buffer, big_endian) { + // Actually, we could handle weird sizes just fine, but they're + // probably mistakes --- expressed in bits, say. + assert(value_size == 4 || value_size == 8); + entry_.index = 0; + Fetch(); +} + +void StabsReader::EntryIterator::Fetch() { + cursor_ + .Read(4, false, &entry_.name_offset) + .Read(1, false, &entry_.type) + .Read(1, false, &entry_.other) + .Read(2, false, &entry_.descriptor) + .Read(value_size_, false, &entry_.value); + entry_.at_end = !cursor_; +} + +StabsReader::StabsReader(const uint8_t* stab, size_t stab_size, + const uint8_t* stabstr, size_t stabstr_size, + bool big_endian, size_t value_size, bool unitized, + StabsHandler* handler) + : entries_(stab, stab_size), + strings_(stabstr, stabstr_size), + iterator_(&entries_, big_endian, value_size), + unitized_(unitized), + handler_(handler), + string_offset_(0), + next_cu_string_offset_(0), + current_source_file_(NULL) { } + +const char* StabsReader::SymbolString() { + ptrdiff_t offset = string_offset_ + iterator_->name_offset; + if (offset < 0 || (size_t) offset >= strings_.Size()) { + handler_->Warning("symbol %d: name offset outside the string section\n", + iterator_->index); + // Return our null string, to keep our promise about all names being + // taken from the string section. + offset = 0; + } + return reinterpret_cast(strings_.start + offset); +} + +bool StabsReader::Process() { + while (!iterator_->at_end) { + if (iterator_->type == N_SO) { + if (! ProcessCompilationUnit()) + return false; + } else if (iterator_->type == N_UNDF && unitized_) { + // In unitized STABS (including Linux STABS, and pretty much anything + // else that puts STABS data in sections), at the head of each + // compilation unit's entries there is an N_UNDF stab giving the + // number of symbols in the compilation unit, and the number of bytes + // that compilation unit's strings take up in the .stabstr section. + // Each CU's strings are separate; the n_strx values are offsets + // within the current CU's portion of the .stabstr section. + // + // As an optimization, the GNU linker combines all the + // compilation units into one, with a single N_UNDF at the + // beginning. However, other linkers, like Gold, do not perform + // this optimization. + string_offset_ = next_cu_string_offset_; + next_cu_string_offset_ = iterator_->value; + ++iterator_; + } +#if defined(HAVE_MACH_O_NLIST_H) + // Export symbols in Mach-O binaries look like this. + // This is necessary in order to be able to dump symbols + // from OS X system libraries. + else if ((iterator_->type & N_STAB) == 0 && + (iterator_->type & N_TYPE) == N_SECT) { + ProcessExtern(); + } +#endif + else { + ++iterator_; + } + } + return true; +} + +bool StabsReader::ProcessCompilationUnit() { + assert(!iterator_->at_end && iterator_->type == N_SO); + + // There may be an N_SO entry whose name ends with a slash, + // indicating the directory in which the compilation occurred. + // The build directory defaults to NULL. + const char* build_directory = NULL; + { + const char* name = SymbolString(); + if (name[0] && name[strlen(name) - 1] == '/') { + build_directory = name; + ++iterator_; + } + } + + // We expect to see an N_SO entry with a filename next, indicating + // the start of the compilation unit. + { + if (iterator_->at_end || iterator_->type != N_SO) + return true; + const char* name = SymbolString(); + if (name[0] == '\0') { + // This seems to be a stray end-of-compilation-unit marker; + // consume it, but don't report the end, since we didn't see a + // beginning. + ++iterator_; + return true; + } + current_source_file_ = name; + } + + if (! handler_->StartCompilationUnit(current_source_file_, + iterator_->value, + build_directory)) + return false; + + ++iterator_; + + // The STABS documentation says that some compilers may emit + // additional N_SO entries with names immediately following the + // first, and that they should be ignored. However, the original + // Breakpad STABS reader doesn't ignore them, so we won't either. + + // Process the body of the compilation unit, up to the next N_SO. + while (!iterator_->at_end && iterator_->type != N_SO) { + if (iterator_->type == N_FUN) { + if (! ProcessFunction()) + return false; + } else if (iterator_->type == N_SLINE) { + // Mac OS X STABS place SLINE records before functions. + Line line; + // The value of an N_SLINE entry that appears outside a function is + // the absolute address of the line. + line.address = iterator_->value; + line.filename = current_source_file_; + // The n_desc of a N_SLINE entry is the line number. It's a + // signed 16-bit field; line numbers from 32768 to 65535 are + // stored as n-65536. + line.number = (uint16_t) iterator_->descriptor; + queued_lines_.push_back(line); + ++iterator_; + } else if (iterator_->type == N_SOL) { + current_source_file_ = SymbolString(); + ++iterator_; + } else { + // Ignore anything else. + ++iterator_; + } + } + + // An N_SO with an empty name indicates the end of the compilation + // unit. Default to zero. + uint64_t ending_address = 0; + if (!iterator_->at_end) { + assert(iterator_->type == N_SO); + const char* name = SymbolString(); + if (name[0] == '\0') { + ending_address = iterator_->value; + ++iterator_; + } + } + + if (! handler_->EndCompilationUnit(ending_address)) + return false; + + queued_lines_.clear(); + + return true; +} + +bool StabsReader::ProcessFunction() { + assert(!iterator_->at_end && iterator_->type == N_FUN); + + uint64_t function_address = iterator_->value; + // The STABS string for an N_FUN entry is the name of the function, + // followed by a colon, followed by type information for the + // function. We want to pass the name alone to StartFunction. + const char* stab_string = SymbolString(); + const char* name_end = strchr(stab_string, ':'); + if (! name_end) + name_end = stab_string + strlen(stab_string); + string name(stab_string, name_end - stab_string); + if (! handler_->StartFunction(name, function_address)) + return false; + ++iterator_; + + // If there were any SLINE records given before the function, report them now. + for (vector::const_iterator it = queued_lines_.begin(); + it != queued_lines_.end(); it++) { + if (!handler_->Line(it->address, it->filename, it->number)) + return false; + } + queued_lines_.clear(); + + while (!iterator_->at_end) { + if (iterator_->type == N_SO || iterator_->type == N_FUN) + break; + else if (iterator_->type == N_SLINE) { + // The value of an N_SLINE entry is the offset of the line from + // the function's start address. + uint64_t line_address = function_address + iterator_->value; + // The n_desc of a N_SLINE entry is the line number. It's a + // signed 16-bit field; line numbers from 32768 to 65535 are + // stored as n-65536. + uint16_t line_number = iterator_->descriptor; + if (! handler_->Line(line_address, current_source_file_, line_number)) + return false; + ++iterator_; + } else if (iterator_->type == N_SOL) { + current_source_file_ = SymbolString(); + ++iterator_; + } else + // Ignore anything else. + ++iterator_; + } + + // We've reached the end of the function. See if we can figure out its + // ending address. + uint64_t ending_address = 0; + if (!iterator_->at_end) { + assert(iterator_->type == N_SO || iterator_->type == N_FUN); + if (iterator_->type == N_FUN) { + const char* symbol_name = SymbolString(); + if (symbol_name[0] == '\0') { + // An N_FUN entry with no name is a terminator for this function; + // its value is the function's size. + ending_address = function_address + iterator_->value; + ++iterator_; + } else { + // An N_FUN entry with a name is the next function, and we can take + // its value as our ending address. Don't advance the iterator, as + // we'll use this symbol to start the next function as well. + ending_address = iterator_->value; + } + } else { + // An N_SO entry could be an end-of-compilation-unit marker, or the + // start of the next compilation unit, but in either case, its value + // is our ending address. We don't advance the iterator; + // ProcessCompilationUnit will decide what to do with this symbol. + ending_address = iterator_->value; + } + } + + if (! handler_->EndFunction(ending_address)) + return false; + + return true; +} + +bool StabsReader::ProcessExtern() { +#if defined(HAVE_MACH_O_NLIST_H) + assert(!iterator_->at_end && + (iterator_->type & N_STAB) == 0 && + (iterator_->type & N_TYPE) == N_SECT); +#endif + + // TODO(mark): only do symbols in the text section? + if (!handler_->Extern(SymbolString(), iterator_->value)) + return false; + + ++iterator_; + return true; +} + +} // namespace google_breakpad diff --git a/src/common/stabs_reader.h b/src/common/stabs_reader.h new file mode 100644 index 0000000..655683f --- /dev/null +++ b/src/common/stabs_reader.h @@ -0,0 +1,321 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// stabs_reader.h: Define StabsReader, a parser for STABS debugging +// information. A description of the STABS debugging format can be +// found at: +// +// http://sourceware.org/gdb/current/onlinedocs/stabs_toc.html +// +// The comments here assume you understand the format. +// +// This parser can handle big-endian and little-endian data, and the symbol +// values may be either 32 or 64 bits long. It handles both STABS in +// sections (as used on Linux) and STABS appearing directly in an +// a.out-like symbol table (as used in Darwin OS X Mach-O files). + +#ifndef COMMON_STABS_READER_H__ +#define COMMON_STABS_READER_H__ + +#include +#include + +#ifdef HAVE_MACH_O_NLIST_H +#include +#elif defined(HAVE_A_OUT_H) +#include +#endif + +#include +#include + +#include "common/byte_cursor.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +class StabsHandler; + +class StabsReader { + public: + // Create a reader for the STABS debug information whose .stab section is + // being traversed by ITERATOR, and whose .stabstr section is referred to + // by STRINGS. The reader will call the member functions of HANDLER to + // report the information it finds, when the reader's 'Process' member + // function is called. + // + // BIG_ENDIAN should be true if the entries in the .stab section are in + // big-endian form, or false if they are in little-endian form. + // + // VALUE_SIZE should be either 4 or 8, indicating the size of the 'value' + // field in each entry in bytes. + // + // UNITIZED should be true if the STABS data is stored in units with + // N_UNDF headers. This is usually the case for STABS stored in sections, + // like .stab/.stabstr, and usually not the case for STABS stored in the + // actual symbol table; UNITIZED should be true when parsing Linux stabs, + // false when parsing Mac OS X STABS. For details, see: + // http://sourceware.org/gdb/current/onlinedocs/stabs/Stab-Section-Basics.html + // + // Note that, in ELF, the .stabstr section should be found using the + // 'sh_link' field of the .stab section header, not by name. + StabsReader(const uint8_t* stab, size_t stab_size, + const uint8_t* stabstr, size_t stabstr_size, + bool big_endian, size_t value_size, bool unitized, + StabsHandler* handler); + + // Process the STABS data, calling the handler's member functions to + // report what we find. While the handler functions return true, + // continue to process until we reach the end of the section. If we + // processed the entire section and all handlers returned true, + // return true. If any handler returned false, return false. + // + // This is only meant to be called once per StabsReader instance; + // resuming a prior processing pass that stopped abruptly isn't supported. + bool Process(); + + private: + + // An class for walking arrays of STABS entries. This isolates the main + // STABS reader from the exact format (size; endianness) of the entries + // themselves. + class EntryIterator { + public: + // The contents of a STABS entry, adjusted for the host's endianness, + // word size, 'struct nlist' layout, and so on. + struct Entry { + // True if this iterator has reached the end of the entry array. When + // this is set, the other members of this structure are not valid. + bool at_end; + + // The number of this entry within the list. + size_t index; + + // The current entry's name offset. This is the offset within the + // current compilation unit's strings, as establish by the N_UNDF entries. + size_t name_offset; + + // The current entry's type, 'other' field, descriptor, and value. + unsigned char type; + unsigned char other; + short descriptor; + uint64_t value; + }; + + // Create a EntryIterator walking the entries in BUFFER. Treat the + // entries as big-endian if BIG_ENDIAN is true, as little-endian + // otherwise. Assume each entry has a 'value' field whose size is + // VALUE_SIZE. + // + // This would not be terribly clean to extend to other format variations, + // but it's enough to handle Linux and Mac, and we'd like STABS to die + // anyway. + // + // For the record: on Linux, STABS entry values are always 32 bits, + // regardless of the architecture address size (don't ask me why); on + // Mac, they are 32 or 64 bits long. Oddly, the section header's entry + // size for a Linux ELF .stab section varies according to the ELF class + // from 12 to 20 even as the actual entries remain unchanged. + EntryIterator(const ByteBuffer* buffer, bool big_endian, size_t value_size); + + // Move to the next entry. This function's behavior is undefined if + // at_end() is true when it is called. + EntryIterator& operator++() { Fetch(); entry_.index++; return *this; } + + // Dereferencing this iterator produces a reference to an Entry structure + // that holds the current entry's values. The entry is owned by this + // EntryIterator, and will be invalidated at the next call to operator++. + const Entry& operator*() const { return entry_; } + const Entry* operator->() const { return &entry_; } + + private: + // Read the STABS entry at cursor_, and set entry_ appropriately. + void Fetch(); + + // The size of entries' value field, in bytes. + size_t value_size_; + + // A byte cursor traversing buffer_. + ByteCursor cursor_; + + // Values for the entry this iterator refers to. + Entry entry_; + }; + + // A source line, saved to be reported later. + struct Line { + uint64_t address; + const char* filename; + int number; + }; + + // Return the name of the current symbol. + const char* SymbolString(); + + // Process a compilation unit starting at symbol_. Return true + // to continue processing, or false to abort. + bool ProcessCompilationUnit(); + + // Process a function in current_source_file_ starting at symbol_. + // Return true to continue processing, or false to abort. + bool ProcessFunction(); + + // Process an exported function symbol. + // Return true to continue processing, or false to abort. + bool ProcessExtern(); + + // The STABS entries being parsed. + ByteBuffer entries_; + + // The string section to which the entries refer. + ByteBuffer strings_; + + // The iterator walking the STABS entries. + EntryIterator iterator_; + + // True if the data is "unitized"; see the explanation in the comment for + // StabsReader::StabsReader. + bool unitized_; + + StabsHandler* handler_; + + // The offset of the current compilation unit's strings within stabstr_. + size_t string_offset_; + + // The value string_offset_ should have for the next compilation unit, + // as established by N_UNDF entries. + size_t next_cu_string_offset_; + + // The current source file name. + const char* current_source_file_; + + // Mac OS X STABS place SLINE records before functions; we accumulate a + // vector of these until we see the FUN record, and then report them + // after the StartFunction call. + std::vector queued_lines_; +}; + +// Consumer-provided callback structure for the STABS reader. Clients +// of the STABS reader provide an instance of this structure. The +// reader then invokes the member functions of that instance to report +// the information it finds. +// +// The default definitions of the member functions do nothing, and return +// true so processing will continue. +class StabsHandler { + public: + StabsHandler() { } + virtual ~StabsHandler() { } + + // Some general notes about the handler callback functions: + + // Processing proceeds until the end of the .stabs section, or until + // one of these functions returns false. + + // The addresses given are as reported in the STABS info, without + // regard for whether the module may be loaded at different + // addresses at different times (a shared library, say). When + // processing STABS from an ELF shared library, the addresses given + // all assume the library is loaded at its nominal load address. + // They are *not* offsets from the nominal load address. If you + // want offsets, you must subtract off the library's nominal load + // address. + + // The arguments to these functions named FILENAME are all + // references to strings stored in the .stabstr section. Because + // both the Linux and Solaris linkers factor out duplicate strings + // from the .stabstr section, the consumer can assume that if two + // FILENAME values are different addresses, they represent different + // file names. + // + // Thus, it's safe to use (say) std::map, which does + // string address comparisons, not string content comparisons. + // Since all the strings are in same array of characters --- the + // .stabstr section --- comparing their addresses produces + // predictable, if not lexicographically meaningful, results. + + // Begin processing a compilation unit whose main source file is + // named FILENAME, and whose base address is ADDRESS. If + // BUILD_DIRECTORY is non-NULL, it is the name of the build + // directory in which the compilation occurred. + virtual bool StartCompilationUnit(const char* filename, uint64_t address, + const char* build_directory) { + return true; + } + + // Finish processing the compilation unit. If ADDRESS is non-zero, + // it is the ending address of the compilation unit. If ADDRESS is + // zero, then the compilation unit's ending address is not + // available, and the consumer must infer it by other means. + virtual bool EndCompilationUnit(uint64_t address) { return true; } + + // Begin processing a function named NAME, whose starting address is + // ADDRESS. This function belongs to the compilation unit that was + // most recently started but not ended. + // + // Note that, unlike filenames, NAME is not a pointer into the + // .stabstr section; this is because the name as it appears in the + // STABS data is followed by type information. The value passed to + // StartFunction is the function name alone. + // + // In languages that use name mangling, like C++, NAME is mangled. + virtual bool StartFunction(const string& name, uint64_t address) { + return true; + } + + // Finish processing the function. If ADDRESS is non-zero, it is + // the ending address for the function. If ADDRESS is zero, then + // the function's ending address is not available, and the consumer + // must infer it by other means. + virtual bool EndFunction(uint64_t address) { return true; } + + // Report that the code at ADDRESS is attributable to line NUMBER of + // the source file named FILENAME. The caller must infer the ending + // address of the line. + virtual bool Line(uint64_t address, const char* filename, int number) { + return true; + } + + // Report that an exported function NAME is present at ADDRESS. + // The size of the function is unknown. + virtual bool Extern(const string& name, uint64_t address) { + return true; + } + + // Report a warning. FORMAT is a printf-like format string, + // specifying how to format the subsequent arguments. + virtual void Warning(const char* format, ...) = 0; +}; + +} // namespace google_breakpad + +#endif // COMMON_STABS_READER_H__ diff --git a/src/common/stabs_reader_unittest.cc b/src/common/stabs_reader_unittest.cc new file mode 100644 index 0000000..294e883 --- /dev/null +++ b/src/common/stabs_reader_unittest.cc @@ -0,0 +1,614 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// stabs_reader_unittest.cc: Unit tests for google_breakpad::StabsReader. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/stabs_reader.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" + +using ::testing::Eq; +using ::testing::InSequence; +using ::testing::Return; +using ::testing::StrEq; +using ::testing::Test; +using ::testing::_; +using google_breakpad::StabsHandler; +using google_breakpad::StabsReader; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using google_breakpad::test_assembler::kBigEndian; +using google_breakpad::test_assembler::kLittleEndian; +using std::map; + +namespace { + +// A StringAssembler is a class for generating .stabstr sections to present +// as input to the STABS parser. +class StringAssembler: public Section { + public: + StringAssembler() : in_cu_(false) { StartCU(); } + + // Add the string S to this StringAssembler, and return the string's + // offset within this compilation unit's strings. If S has been added + // already, this returns the offset of its first instance. + size_t Add(const string& s) { + map::iterator it = added_.find(s); + if (it != added_.end()) + return it->second; + size_t offset = Size() - cu_start_; + AppendCString(s); + added_[s] = offset; + return offset; + } + + // Start a fresh compilation unit string collection. + void StartCU() { + // Ignore duplicate calls to StartCU. Our test data don't always call + // StartCU at all, meaning that our constructor has to take care of it, + // meaning that tests that *do* call StartCU call it twice at the + // beginning. This is not worth smoothing out. + if (in_cu_) return; + + added_.clear(); + cu_start_ = Size(); + + // Each compilation unit's strings start with an empty string. + AppendCString(""); + added_[""] = 0; + + in_cu_ = true; + } + + // Finish off the current CU's strings. + size_t EndCU() { + assert(in_cu_); + in_cu_ = false; + return Size() - cu_start_; + } + + private: + // The offset of the start of this compilation unit's strings. + size_t cu_start_; + + // True if we're in a CU. + bool in_cu_; + + // A map from the strings that have been added to this section to + // their starting indices within their compilation unit. + map added_; +}; + +// A StabsAssembler is a class for generating .stab sections to present as +// test input for the STABS parser. +class StabsAssembler: public Section { + public: + // Create a StabsAssembler that uses StringAssembler for its strings. + StabsAssembler(StringAssembler* string_assembler) + : Section(string_assembler->endianness()), + string_assembler_(string_assembler), + value_size_(0), + entry_count_(0), + cu_header_(NULL) { } + ~StabsAssembler() { assert(!cu_header_); } + + // Accessor and setter for value_size_. + size_t value_size() const { return value_size_; } + StabsAssembler& set_value_size(size_t value_size) { + value_size_ = value_size; + return *this; + } + + // Append a STAB entry to the end of this section with the given + // characteristics. NAME is the offset of this entry's name string within + // its compilation unit's portion of the .stabstr section; this can be a + // value generated by a StringAssembler. Return a reference to this + // StabsAssembler. + StabsAssembler& Stab(uint8_t type, uint8_t other, Label descriptor, + Label value, Label name) { + D32(name); + D8(type); + D8(other); + D16(descriptor); + Append(endianness(), value_size_, value); + entry_count_++; + return *this; + } + + // As above, but automatically add NAME to our StringAssembler. + StabsAssembler& Stab(uint8_t type, uint8_t other, Label descriptor, + Label value, const string& name) { + return Stab(type, other, descriptor, value, string_assembler_->Add(name)); + } + + // Start a compilation unit named NAME, with an N_UNDF symbol to start + // it, and its own portion of the string section. Return a reference to + // this StabsAssembler. + StabsAssembler& StartCU(const string& name) { + assert(!cu_header_); + cu_header_ = new CUHeader; + string_assembler_->StartCU(); + entry_count_ = 0; + return Stab(N_UNDF, 0, + cu_header_->final_entry_count, + cu_header_->final_string_size, + string_assembler_->Add(name)); + } + + // Close off the current compilation unit. Return a reference to this + // StabsAssembler. + StabsAssembler& EndCU() { + assert(cu_header_); + cu_header_->final_entry_count = entry_count_; + cu_header_->final_string_size = string_assembler_->EndCU(); + delete cu_header_; + cu_header_ = NULL; + return *this; + } + + private: + // Data used in a compilation unit header STAB that we won't know until + // we've finished the compilation unit. + struct CUHeader { + // The final number of entries this compilation unit will hold. + Label final_entry_count; + + // The final size of this compilation unit's strings. + Label final_string_size; + }; + + // The strings for our STABS entries. + StringAssembler* string_assembler_; + + // The size of the 'value' field of stabs entries in this section. + size_t value_size_; + + // The number of entries in this compilation unit so far. + size_t entry_count_; + + // Header labels for this compilation unit, if we've started one but not + // finished it. + CUHeader* cu_header_; +}; + +class MockStabsReaderHandler: public StabsHandler { + public: + MOCK_METHOD3(StartCompilationUnit, + bool(const char*, uint64_t, const char*)); + MOCK_METHOD1(EndCompilationUnit, bool(uint64_t)); + MOCK_METHOD2(StartFunction, bool(const string&, uint64_t)); + MOCK_METHOD1(EndFunction, bool(uint64_t)); + MOCK_METHOD3(Line, bool(uint64_t, const char*, int)); + MOCK_METHOD2(Extern, bool(const string&, uint64_t)); + void Warning(const char* format, ...) { MockWarning(format); } + MOCK_METHOD1(MockWarning, void(const char*)); +}; + +struct StabsFixture { + StabsFixture() : stabs(&strings), unitized(true) { } + + // Create a StabsReader to parse the mock stabs data in stabs and + // strings, and pass the parsed information to mock_handler. Use the + // endianness and value size of stabs to parse the data. If all goes + // well, return the result of calling the reader's Process member + // function. Otherwise, return false. + bool ApplyHandlerToMockStabsData() { + string stabs_contents, stabstr_contents; + if (!stabs.GetContents(&stabs_contents) || + !strings.GetContents(&stabstr_contents)) + return false; + + // Run the parser on the test input, passing whatever we find to HANDLER. + StabsReader reader( + reinterpret_cast(stabs_contents.data()), + stabs_contents.size(), + reinterpret_cast(stabstr_contents.data()), + stabstr_contents.size(), + stabs.endianness() == kBigEndian, stabs.value_size(), unitized, + &mock_handler); + return reader.Process(); + } + + StringAssembler strings; + StabsAssembler stabs; + bool unitized; + MockStabsReaderHandler mock_handler; +}; + +class Stabs: public StabsFixture, public Test { }; + +TEST_F(Stabs, MockStabsInput) { + stabs.set_endianness(kLittleEndian); + stabs.set_value_size(4); + stabs + .Stab(N_SO, 149, 40232, 0x18a2a72bU, "builddir/") + .Stab(N_FUN, 83, 50010, 0x91a5353fU, + "not the SO with source file name we expected ") + .Stab(N_SO, 165, 24791, 0xfe69d23cU, "") + .Stab(N_SO, 184, 34178, 0xca4d883aU, "builddir1/") + .Stab(N_SO, 83, 40859, 0xd2fe5df3U, "file1.c") + .Stab(N_LSYM, 147, 39565, 0x60d4bb8aU, "not the FUN we're looking for") + .Stab(N_FUN, 120, 50271, 0xa049f4b1U, "fun1") + .Stab(N_BINCL, 150, 15694, 0xef65c659U, + "something to ignore in a FUN body") + .Stab(N_SLINE, 147, 4967, 0xd904b3f, "") + .Stab(N_SOL, 177, 56135, 0xbd97b1dcU, "header.h") + .Stab(N_SLINE, 130, 24610, 0x90f145b, "") + .Stab(N_FUN, 45, 32441, 0xbf27cf93U, + "fun2:some stabs type info here:to trim from the name") + .Stab(N_SLINE, 138, 39002, 0x8148b87, "") + .Stab(N_SOL, 60, 49318, 0x1d06e025U, "file1.c") + .Stab(N_SLINE, 29, 52163, 0x6eebbb7, "") + .Stab(N_SO, 167, 4647, 0xd04b7448U, "") + .Stab(N_LSYM, 58, 37837, 0xe6b14d37U, "") + .Stab(N_SO, 152, 7810, 0x11759f10U, "file3.c") + .Stab(N_SO, 218, 12447, 0x11cfe4b5U, ""); + + { + InSequence s; + + EXPECT_CALL(mock_handler, + StartCompilationUnit(StrEq("file1.c"), 0xd2fe5df3U, + StrEq("builddir1/"))) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, StartFunction(StrEq("fun1"), 0xa049f4b1U)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + Line(0xa049f4b1U + 0xd904b3f, StrEq("file1.c"), 4967)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + Line(0xa049f4b1U + 0x90f145b, StrEq("header.h"), 24610)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndFunction(0xbf27cf93U)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, StartFunction(StrEq("fun2"), 0xbf27cf93U)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + Line(0xbf27cf93U + 0x8148b87, StrEq("header.h"), 39002)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + Line(0xbf27cf93U + 0x6eebbb7, StrEq("file1.c"), 52163)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndFunction(0xd04b7448U)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0xd04b7448U)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, StartCompilationUnit(StrEq("file3.c"), + 0x11759f10U, NULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0x11cfe4b5U)) + .WillOnce(Return(true)); + } + + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + +TEST_F(Stabs, AbruptCU) { + stabs.set_endianness(kBigEndian); + stabs.set_value_size(4); + stabs.Stab(N_SO, 177, 23446, 0xbf10d5e4, "file2-1.c"); + + { + InSequence s; + + EXPECT_CALL(mock_handler, + StartCompilationUnit(StrEq("file2-1.c"), 0xbf10d5e4, NULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0)) + .WillOnce(Return(true)); + } + + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + +TEST_F(Stabs, AbruptFunction) { + stabs.set_endianness(kLittleEndian); + stabs.set_value_size(8); + stabs + .Stab(N_SO, 218, 26631, 0xb83ddf10U, "file3-1.c") + .Stab(N_FUN, 113, 24765, 0xbbd4a145U, "fun3_1"); + + { + InSequence s; + + EXPECT_CALL(mock_handler, + StartCompilationUnit(StrEq("file3-1.c"), 0xb83ddf10U, NULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, StartFunction(StrEq("fun3_1"), 0xbbd4a145U)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndFunction(0)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0)) + .WillOnce(Return(true)); + } + + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + +TEST_F(Stabs, NoCU) { + stabs.set_endianness(kBigEndian); + stabs.set_value_size(8); + stabs.Stab(N_SO, 161, 25673, 0x8f676e7bU, "build-directory/"); + + EXPECT_CALL(mock_handler, StartCompilationUnit(_, _, _)) + .Times(0); + EXPECT_CALL(mock_handler, StartFunction(_, _)) + .Times(0); + + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + +TEST_F(Stabs, NoCUEnd) { + stabs.set_endianness(kBigEndian); + stabs.set_value_size(8); + stabs + .Stab(N_SO, 116, 58280, 0x2f7493c9U, "file5-1.c") + .Stab(N_SO, 224, 23057, 0xf9f1d50fU, "file5-2.c"); + + { + InSequence s; + + EXPECT_CALL(mock_handler, + StartCompilationUnit(StrEq("file5-1.c"), 0x2f7493c9U, NULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + StartCompilationUnit(StrEq("file5-2.c"), 0xf9f1d50fU, NULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0)) + .WillOnce(Return(true)); + } + + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + +// On systems that store STABS in sections, string offsets are relative to +// the beginning of that compilation unit's strings, marked with N_UNDF +// symbols; see the comments for StabsReader::StabsReader. +TEST_F(Stabs, Unitized) { + stabs.set_endianness(kBigEndian); + stabs.set_value_size(4); + stabs + .StartCU("antimony") + .Stab(N_SO, 49, 26043, 0x7e259f1aU, "antimony") + .Stab(N_FUN, 101, 63253, 0x7fbcccaeU, "arsenic") + .Stab(N_SO, 124, 37175, 0x80b0014cU, "") + .EndCU() + .StartCU("aluminum") + .Stab(N_SO, 72, 23084, 0x86756839U, "aluminum") + .Stab(N_FUN, 59, 3305, 0xa8e120b0U, "selenium") + .Stab(N_SO, 178, 56949, 0xbffff983U, "") + .EndCU(); + + { + InSequence s; + EXPECT_CALL(mock_handler, + StartCompilationUnit(StrEq("antimony"), 0x7e259f1aU, NULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, StartFunction(Eq("arsenic"), 0x7fbcccaeU)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndFunction(0x80b0014cU)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0x80b0014cU)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + StartCompilationUnit(StrEq("aluminum"), 0x86756839U, NULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, StartFunction(Eq("selenium"), 0xa8e120b0U)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndFunction(0xbffff983U)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0xbffff983U)) + .WillOnce(Return(true)); + } + + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + +// On systems that store STABS entries in the real symbol table, the N_UNDF +// entries have no special meaning, and shouldn't mess up the string +// indices. +TEST_F(Stabs, NonUnitized) { + stabs.set_endianness(kLittleEndian); + stabs.set_value_size(4); + unitized = false; + stabs + .Stab(N_UNDF, 21, 11551, 0x9bad2b2e, "") + .Stab(N_UNDF, 21, 11551, 0x9bad2b2e, "") + .Stab(N_SO, 71, 45139, 0x11a97352, "Tanzania") + .Stab(N_SO, 221, 41976, 0x21a97352, ""); + + { + InSequence s; + EXPECT_CALL(mock_handler, + StartCompilationUnit(StrEq("Tanzania"), + 0x11a97352, NULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0x21a97352)) + .WillOnce(Return(true)); + } + + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + +TEST_F(Stabs, FunctionEnd) { + stabs.set_endianness(kLittleEndian); + stabs.set_value_size(8); + stabs + .Stab(N_SO, 102, 62362, 0x52a830d644cd6942ULL, "compilation unit") + // This function is terminated by the start of the next function. + .Stab(N_FUN, 216, 38405, 0xbb5ab70ecdd23bfeULL, "function 1") + // This function is terminated by an explicit end-of-function stab, + // whose value is a size in bytes. + .Stab(N_FUN, 240, 10973, 0xc954de9b8fb3e5e2ULL, "function 2") + .Stab(N_FUN, 14, 36749, 0xc1ab, "") + // This function is terminated by the end of the compilation unit. + .Stab(N_FUN, 143, 64514, 0xdff98c9a35386e1fULL, "function 3") + .Stab(N_SO, 164, 60142, 0xfdacb856e78bbf57ULL, ""); + + { + InSequence s; + EXPECT_CALL(mock_handler, + StartCompilationUnit(StrEq("compilation unit"), + 0x52a830d644cd6942ULL, NULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + StartFunction(Eq("function 1"), 0xbb5ab70ecdd23bfeULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndFunction(0xc954de9b8fb3e5e2ULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + StartFunction(Eq("function 2"), 0xc954de9b8fb3e5e2ULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndFunction(0xc954de9b8fb3e5e2ULL + 0xc1ab)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + StartFunction(Eq("function 3"), 0xdff98c9a35386e1fULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndFunction(0xfdacb856e78bbf57ULL)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0xfdacb856e78bbf57ULL)) + .WillOnce(Return(true)); + } + + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + +// On Mac OS X, SLINE records can appear before the FUN stab to which they +// belong, and their values are absolute addresses, not offsets. +TEST_F(Stabs, LeadingLine) { + stabs.set_endianness(kBigEndian); + stabs.set_value_size(4); + stabs + .Stab(N_SO, 179, 27357, 0x8adabc15, "build directory/") + .Stab(N_SO, 52, 53058, 0x4c7e3bf4, "compilation unit") + .Stab(N_SOL, 165, 12086, 0x6a797ca3, "source file name") + .Stab(N_SLINE, 229, 20015, 0x4cb3d7e0, "") + .Stab(N_SLINE, 89, 43802, 0x4cba8b88, "") + .Stab(N_FUN, 251, 51639, 0xce1b98fa, "rutabaga") + .Stab(N_FUN, 218, 16113, 0x5798, "") + .Stab(N_SO, 52, 53058, 0xd4af4415, ""); + + { + InSequence s; + EXPECT_CALL(mock_handler, + StartCompilationUnit(StrEq("compilation unit"), + 0x4c7e3bf4, StrEq("build directory/"))) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + StartFunction(Eq("rutabaga"), 0xce1b98fa)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + Line(0x4cb3d7e0, StrEq("source file name"), 20015)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + Line(0x4cba8b88, StrEq("source file name"), 43802)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndFunction(0xce1b98fa + 0x5798)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, EndCompilationUnit(0xd4af4415)) + .WillOnce(Return(true)); + } + + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + + +#if defined(HAVE_MACH_O_NLIST_H) +// These tests have no meaning on non-Mach-O-based systems, as +// only Mach-O uses N_SECT to represent public symbols. +TEST_F(Stabs, OnePublicSymbol) { + stabs.set_endianness(kLittleEndian); + stabs.set_value_size(4); + + const uint32_t kExpectedAddress = 0x9000; + const string kExpectedFunctionName("public_function"); + stabs + .Stab(N_SECT, 1, 0, kExpectedAddress, kExpectedFunctionName); + + { + InSequence s; + EXPECT_CALL(mock_handler, + Extern(StrEq(kExpectedFunctionName), + kExpectedAddress)) + .WillOnce(Return(true)); + } + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + +TEST_F(Stabs, TwoPublicSymbols) { + stabs.set_endianness(kLittleEndian); + stabs.set_value_size(4); + + const uint32_t kExpectedAddress1 = 0xB0B0B0B0; + const string kExpectedFunctionName1("public_function"); + const uint32_t kExpectedAddress2 = 0xF0F0F0F0; + const string kExpectedFunctionName2("something else"); + stabs + .Stab(N_SECT, 1, 0, kExpectedAddress1, kExpectedFunctionName1) + .Stab(N_SECT, 1, 0, kExpectedAddress2, kExpectedFunctionName2); + + { + InSequence s; + EXPECT_CALL(mock_handler, + Extern(StrEq(kExpectedFunctionName1), + kExpectedAddress1)) + .WillOnce(Return(true)); + EXPECT_CALL(mock_handler, + Extern(StrEq(kExpectedFunctionName2), + kExpectedAddress2)) + .WillOnce(Return(true)); + } + ASSERT_TRUE(ApplyHandlerToMockStabsData()); +} + +#endif + +} // anonymous namespace diff --git a/src/common/stabs_to_module.cc b/src/common/stabs_to_module.cc new file mode 100644 index 0000000..f04c987 --- /dev/null +++ b/src/common/stabs_to_module.cc @@ -0,0 +1,208 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dump_stabs.cc --- implement the StabsToModule class. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include + +#include +#include +#include + +#include "common/stabs_to_module.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +// Demangle using abi call. +// Older GCC may not support it. +static string Demangle(const string& mangled) { + int status = 0; + char *demangled = abi::__cxa_demangle(mangled.c_str(), NULL, NULL, &status); + if (status == 0 && demangled != NULL) { + string str(demangled); + free(demangled); + return str; + } + return string(mangled); +} + +StabsToModule::~StabsToModule() { + // Free any functions we've accumulated but not added to the module. + for (vector::const_iterator func_it = functions_.begin(); + func_it != functions_.end(); func_it++) + delete *func_it; + // Free any function that we're currently within. + delete current_function_; +} + +bool StabsToModule::StartCompilationUnit(const char *name, uint64_t address, + const char *build_directory) { + assert(!in_compilation_unit_); + in_compilation_unit_ = true; + current_source_file_name_ = name; + current_source_file_ = module_->FindFile(name); + comp_unit_base_address_ = address; + boundaries_.push_back(static_cast(address)); + return true; +} + +bool StabsToModule::EndCompilationUnit(uint64_t address) { + assert(in_compilation_unit_); + in_compilation_unit_ = false; + comp_unit_base_address_ = 0; + current_source_file_ = NULL; + current_source_file_name_ = NULL; + if (address) + boundaries_.push_back(static_cast(address)); + return true; +} + +bool StabsToModule::StartFunction(const string& name, + uint64_t address) { + assert(!current_function_); + Module::Function* f = + new Module::Function(module_->AddStringToPool(Demangle(name)), address); + Module::Range r(address, 0); // We compute this in StabsToModule::Finalize(). + f->ranges.push_back(r); + f->parameter_size = 0; // We don't provide this information. + current_function_ = f; + boundaries_.push_back(static_cast(address)); + return true; +} + +bool StabsToModule::EndFunction(uint64_t address) { + assert(current_function_); + // Functions in this compilation unit should have address bigger + // than the compilation unit's starting address. There may be a lot + // of duplicated entries for functions in the STABS data. We will + // count on the Module to remove the duplicates. + if (current_function_->address >= comp_unit_base_address_) + functions_.push_back(current_function_); + else + delete current_function_; + current_function_ = NULL; + if (address) + boundaries_.push_back(static_cast(address)); + return true; +} + +bool StabsToModule::Line(uint64_t address, const char *name, int number) { + assert(current_function_); + assert(current_source_file_); + if (name != current_source_file_name_) { + current_source_file_ = module_->FindFile(name); + current_source_file_name_ = name; + } + Module::Line line; + line.address = address; + line.size = 0; // We compute this in StabsToModule::Finalize(). + line.file = current_source_file_; + line.number = number; + current_function_->lines.push_back(line); + return true; +} + +bool StabsToModule::Extern(const string& name, uint64_t address) { + auto ext = std::make_unique(address); + // Older libstdc++ demangle implementations can crash on unexpected + // input, so be careful about what gets passed in. + if (name.compare(0, 3, "__Z") == 0) { + ext->name = Demangle(name.substr(1)); + } else if (name[0] == '_') { + ext->name = name.substr(1); + } else { + ext->name = name; + } + module_->AddExtern(std::move(ext)); + return true; +} + +void StabsToModule::Warning(const char *format, ...) { + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); +} + +void StabsToModule::Finalize() { + // Sort our boundary list, so we can search it quickly. + sort(boundaries_.begin(), boundaries_.end()); + // Sort all functions by address, just for neatness. + sort(functions_.begin(), functions_.end(), + Module::Function::CompareByAddress); + + for (vector::const_iterator func_it = functions_.begin(); + func_it != functions_.end(); + func_it++) { + Module::Function *f = *func_it; + // Compute the function f's size. + vector::const_iterator boundary + = std::upper_bound(boundaries_.begin(), boundaries_.end(), f->address); + if (boundary != boundaries_.end()) + f->ranges[0].size = *boundary - f->address; + else + // If this is the last function in the module, and the STABS + // reader was unable to give us its ending address, then assign + // it a bogus, very large value. This will happen at most once + // per module: since we've added all functions' addresses to the + // boundary table, only one can be the last. + f->ranges[0].size = kFallbackSize; + + // Compute sizes for each of the function f's lines --- if it has any. + if (!f->lines.empty()) { + stable_sort(f->lines.begin(), f->lines.end(), + Module::Line::CompareByAddress); + vector::iterator last_line = f->lines.end() - 1; + for (vector::iterator line_it = f->lines.begin(); + line_it != last_line; line_it++) + line_it[0].size = line_it[1].address - line_it[0].address; + // Compute the size of the last line from f's end address. + last_line->size = + (f->ranges[0].address + f->ranges[0].size) - last_line->address; + } + } + // Now that everything has a size, add our functions to the module, and + // dispose of our private list. Delete the functions that we fail to add, so + // they aren't leaked. + for (Module::Function* func: functions_) + if (!module_->AddFunction(func)) + delete func; + functions_.clear(); +} + +} // namespace google_breakpad diff --git a/src/common/stabs_to_module.h b/src/common/stabs_to_module.h new file mode 100644 index 0000000..99c61b0 --- /dev/null +++ b/src/common/stabs_to_module.h @@ -0,0 +1,142 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dump_stabs.h: Define the StabsToModule class, which receives +// STABS debugging information from a parser and adds it to a Breakpad +// symbol file. + +#ifndef BREAKPAD_COMMON_STABS_TO_MODULE_H_ +#define BREAKPAD_COMMON_STABS_TO_MODULE_H_ + +#include + +#include +#include + +#include "common/module.h" +#include "common/stabs_reader.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +using std::vector; + +// A StabsToModule is a handler that receives parsed STABS debugging +// information from a StabsReader, and uses that to populate +// a Module. (All classes are in the google_breakpad namespace.) A +// Module represents the contents of a Breakpad symbol file, and knows +// how to write itself out as such. A StabsToModule thus acts as +// the bridge between STABS and Breakpad data. +// When processing Darwin Mach-O files, this also receives public linker +// symbols, like those found in system libraries. +class StabsToModule: public google_breakpad::StabsHandler { + public: + // Receive parsed debugging information from a StabsReader, and + // store it all in MODULE. + StabsToModule(Module *module) : + module_(module), + in_compilation_unit_(false), + comp_unit_base_address_(0), + current_function_(NULL), + current_source_file_(NULL), + current_source_file_name_(NULL) { } + ~StabsToModule(); + + // The standard StabsHandler virtual member functions. + bool StartCompilationUnit(const char *name, uint64_t address, + const char *build_directory); + bool EndCompilationUnit(uint64_t address); + bool StartFunction(const string& name, uint64_t address); + bool EndFunction(uint64_t address); + bool Line(uint64_t address, const char *name, int number); + bool Extern(const string& name, uint64_t address); + void Warning(const char *format, ...); + + // Do any final processing necessary to make module_ contain all the + // data provided by the STABS reader. + // + // Because STABS does not provide reliable size information for + // functions and lines, we need to make a pass over the data after + // processing all the STABS to compute those sizes. We take care of + // that here. + void Finalize(); + + private: + + // An arbitrary, but very large, size to use for functions whose + // size we can't compute properly. + static const uint64_t kFallbackSize = 0x10000000; + + // The module we're contributing debugging info to. + Module *module_; + + // The functions we've generated so far. We don't add these to + // module_ as we parse them. Instead, we wait until we've computed + // their ending address, and their lines' ending addresses. + // + // We could just stick them in module_ from the outset, but if + // module_ already contains data gathered from other debugging + // formats, that would complicate the size computation. + vector functions_; + + // Boundary addresses. STABS doesn't necessarily supply sizes for + // functions and lines, so we need to compute them ourselves by + // finding the next object. + vector boundaries_; + + // True if we are currently within a compilation unit: we have gotten a + // StartCompilationUnit call, but no matching EndCompilationUnit call + // yet. We use this for sanity checks. + bool in_compilation_unit_; + + // The base address of the current compilation unit. We use this to + // recognize functions we should omit from the symbol file. (If you + // know the details of why we omit these, please patch this + // comment.) + Module::Address comp_unit_base_address_; + + // The function we're currently contributing lines to. + Module::Function *current_function_; + + // The last Module::File we got a line number in. + Module::File *current_source_file_; + + // The pointer in the .stabstr section of the name that + // current_source_file_ is built from. This allows us to quickly + // recognize when the current line is in the same file as the + // previous one (which it usually is). + const char *current_source_file_name_; +}; + +} // namespace google_breakpad + +#endif // BREAKPAD_COMMON_STABS_TO_MODULE_H_ diff --git a/src/common/stabs_to_module_unittest.cc b/src/common/stabs_to_module_unittest.cc new file mode 100644 index 0000000..c6d4028 --- /dev/null +++ b/src/common/stabs_to_module_unittest.cc @@ -0,0 +1,260 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// dump_stabs_unittest.cc: Unit tests for StabsToModule. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "breakpad_googletest_includes.h" +#include "common/stabs_to_module.h" + +using google_breakpad::Module; +using google_breakpad::StabsToModule; +using std::vector; + +TEST(StabsToModule, SimpleCU) { + Module m("name", "os", "arch", "id"); + StabsToModule h(&m); + + // Feed in a simple compilation unit that defines a function with + // one line. + EXPECT_TRUE(h.StartCompilationUnit("compilation-unit", 0x9f4d1271e50db93bLL, + "build-directory")); + EXPECT_TRUE(h.StartFunction("function", 0xfde4abbed390c394LL)); + EXPECT_TRUE(h.Line(0xfde4abbed390c394LL, "source-file-name", 174823314)); + EXPECT_TRUE(h.EndFunction(0xfde4abbed390c3a4LL)); + EXPECT_TRUE(h.EndCompilationUnit(0xfee4abbed390c3a4LL)); + h.Finalize(); + + // Now check to see what has been added to the Module. + Module::File *file = m.FindExistingFile("source-file-name"); + ASSERT_TRUE(file != NULL); + + vector functions; + m.GetFunctions(&functions, functions.end()); + ASSERT_EQ((size_t) 1, functions.size()); + Module::Function *function = functions[0]; + EXPECT_STREQ("function", function->name.str().c_str()); + EXPECT_EQ(0xfde4abbed390c394LL, function->address); + EXPECT_EQ(0x10U, function->ranges[0].size); + EXPECT_EQ(0U, function->parameter_size); + ASSERT_EQ((size_t) 1, function->lines.size()); + Module::Line *line = &function->lines[0]; + EXPECT_EQ(0xfde4abbed390c394LL, line->address); + EXPECT_EQ(0x10U, line->size); // derived from EndFunction + EXPECT_TRUE(line->file == file); + EXPECT_EQ(174823314, line->number); +} + +#ifdef __GNUC__ +// Function name mangling can vary by compiler, so only run mangled-name +// tests on GCC for simplicity's sake. +TEST(StabsToModule, Externs) { + Module m("name", "os", "arch", "id"); + StabsToModule h(&m); + + // Feed in a few Extern symbols. + EXPECT_TRUE(h.Extern("_foo", 0xffff)); + EXPECT_TRUE(h.Extern("__Z21dyldGlobalLockAcquirev", 0xaaaa)); + EXPECT_TRUE(h.Extern("_MorphTableGetNextMorphChain", 0x1111)); + h.Finalize(); + + // Now check to see what has been added to the Module. + vector externs; + m.GetExterns(&externs, externs.end()); + ASSERT_EQ((size_t) 3, externs.size()); + Module::Extern *extern1 = externs[0]; + EXPECT_STREQ("MorphTableGetNextMorphChain", extern1->name.c_str()); + EXPECT_EQ((Module::Address)0x1111, extern1->address); + Module::Extern *extern2 = externs[1]; + EXPECT_STREQ("dyldGlobalLockAcquire()", extern2->name.c_str()); + EXPECT_EQ((Module::Address)0xaaaa, extern2->address); + Module::Extern *extern3 = externs[2]; + EXPECT_STREQ("foo", extern3->name.c_str()); + EXPECT_EQ((Module::Address)0xffff, extern3->address); +} +#endif // __GNUC__ + +TEST(StabsToModule, DuplicateFunctionNames) { + Module m("name", "os", "arch", "id"); + StabsToModule h(&m); + + // Compilation unit with one function, mangled name. + EXPECT_TRUE(h.StartCompilationUnit("compilation-unit", 0xf2cfda36ecf7f46cLL, + "build-directory")); + EXPECT_TRUE(h.StartFunction("funcfoo", + 0xf2cfda36ecf7f46dLL)); + EXPECT_TRUE(h.EndFunction(0)); + EXPECT_TRUE(h.StartFunction("funcfoo", + 0xf2cfda36ecf7f46dLL)); + EXPECT_TRUE(h.EndFunction(0)); + EXPECT_TRUE(h.EndCompilationUnit(0)); + + h.Finalize(); + + // Now check to see what has been added to the Module. + Module::File *file = m.FindExistingFile("compilation-unit"); + ASSERT_TRUE(file != NULL); + + vector functions; + m.GetFunctions(&functions, functions.end()); + ASSERT_EQ(1U, functions.size()); + + Module::Function *function = functions[0]; + EXPECT_EQ(0xf2cfda36ecf7f46dLL, function->address); + EXPECT_LT(0U, function->ranges[0].size); // should have used dummy size + EXPECT_EQ(0U, function->parameter_size); + ASSERT_EQ(0U, function->lines.size()); +} + +TEST(InferSizes, LineSize) { + Module m("name", "os", "arch", "id"); + StabsToModule h(&m); + + // Feed in a simple compilation unit that defines a function with + // one line. + EXPECT_TRUE(h.StartCompilationUnit("compilation-unit", 0xb4513962eff94e92LL, + "build-directory")); + EXPECT_TRUE(h.StartFunction("function", 0xb4513962eff94e92LL)); + EXPECT_TRUE(h.Line(0xb4513962eff94e92LL, "source-file-name-1", 77396614)); + EXPECT_TRUE(h.Line(0xb4513963eff94e92LL, "source-file-name-2", 87660088)); + EXPECT_TRUE(h.EndFunction(0)); // unknown function end address + EXPECT_TRUE(h.EndCompilationUnit(0)); // unknown CU end address + EXPECT_TRUE(h.StartCompilationUnit("compilation-unit-2", 0xb4523963eff94e92LL, + "build-directory-2")); // next boundary + EXPECT_TRUE(h.EndCompilationUnit(0)); + h.Finalize(); + + // Now check to see what has been added to the Module. + Module::File *file1 = m.FindExistingFile("source-file-name-1"); + ASSERT_TRUE(file1 != NULL); + Module::File *file2 = m.FindExistingFile("source-file-name-2"); + ASSERT_TRUE(file2 != NULL); + + vector functions; + m.GetFunctions(&functions, functions.end()); + ASSERT_EQ((size_t) 1, functions.size()); + + Module::Function *function = functions[0]; + EXPECT_STREQ("function", function->name.str().c_str()); + EXPECT_EQ(0xb4513962eff94e92LL, function->address); + EXPECT_EQ(0x1000100000000ULL, function->ranges[0].size); // inferred from CU end + EXPECT_EQ(0U, function->parameter_size); + ASSERT_EQ((size_t) 2, function->lines.size()); + + Module::Line *line1 = &function->lines[0]; + EXPECT_EQ(0xb4513962eff94e92LL, line1->address); + EXPECT_EQ(0x100000000ULL, line1->size); // derived from EndFunction + EXPECT_TRUE(line1->file == file1); + EXPECT_EQ(77396614, line1->number); + + Module::Line *line2 = &function->lines[1]; + EXPECT_EQ(0xb4513963eff94e92LL, line2->address); + EXPECT_EQ(0x1000000000000ULL, line2->size); // derived from EndFunction + EXPECT_TRUE(line2->file == file2); + EXPECT_EQ(87660088, line2->number); +} + +#ifdef __GNUC__ +// Function name mangling can vary by compiler, so only run mangled-name +// tests on GCC for simplicity's sake. +TEST(FunctionNames, Mangled) { + Module m("name", "os", "arch", "id"); + StabsToModule h(&m); + + // Compilation unit with one function, mangled name. + EXPECT_TRUE(h.StartCompilationUnit("compilation-unit", 0xf2cfda63cef7f46cLL, + "build-directory")); + EXPECT_TRUE(h.StartFunction("_ZNSt6vectorIySaIyEE9push_backERKy", + 0xf2cfda63cef7f46dLL)); + EXPECT_TRUE(h.EndFunction(0)); + EXPECT_TRUE(h.EndCompilationUnit(0)); + + h.Finalize(); + + // Now check to see what has been added to the Module. + Module::File *file = m.FindExistingFile("compilation-unit"); + ASSERT_TRUE(file != NULL); + + vector functions; + m.GetFunctions(&functions, functions.end()); + ASSERT_EQ(1U, functions.size()); + + Module::Function *function = functions[0]; + // This is GCC-specific, but we shouldn't be seeing STABS data anywhere + // but Linux. + EXPECT_THAT(function->name.str(), ::testing::ContainsRegex( + "std::vector\\s?>::" + "push_back\\(unsigned long long const&\\)")); + EXPECT_EQ(0xf2cfda63cef7f46dLL, function->address); + EXPECT_LT(0U, function->ranges[0].size); // should have used dummy size + EXPECT_EQ(0U, function->parameter_size); + ASSERT_EQ(0U, function->lines.size()); +} +#endif // __GNUC__ + +// The GNU toolchain can omit functions that are not used; however, +// when it does so, it doesn't clean up the debugging information that +// refers to them. In STABS, this results in compilation units whose +// SO addresses are zero. +TEST(Omitted, Function) { + Module m("name", "os", "arch", "id"); + StabsToModule h(&m); + + // The StartCompilationUnit and EndCompilationUnit calls may both have an + // address of zero if the compilation unit has had sections removed. + EXPECT_TRUE(h.StartCompilationUnit("compilation-unit", 0, "build-directory")); + EXPECT_TRUE(h.StartFunction("function", 0x2a133596)); + EXPECT_TRUE(h.EndFunction(0)); + EXPECT_TRUE(h.EndCompilationUnit(0)); +} + +// TODO --- if we actually cared about STABS. Even without these we've +// got full coverage of non-failure source lines in dump_stabs.cc. + +// Line size from next line +// Line size from function end +// Line size from next function start +// line size from cu end +// line size from next cu start +// fallback size is something plausible + +// function size from function end +// function size from next function start +// function size from cu end +// function size from next cu start +// fallback size is something plausible + +// omitting functions outside the compilation unit's address range +// zero-line, one-line, many-line functions diff --git a/src/common/stdio_wrapper.h b/src/common/stdio_wrapper.h new file mode 100644 index 0000000..32093bd --- /dev/null +++ b/src/common/stdio_wrapper.h @@ -0,0 +1,42 @@ +// Copyright 2016 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_COMMON_STDIO_WRAPPER_H +#define GOOGLE_BREAKPAD_COMMON_STDIO_WRAPPER_H + +#include + +#if defined(_MSC_VER) && MSC_VER < 1900 +#include + +#define snprintf _snprintf +typedef SSIZE_T ssize_t; +#endif + + +#endif // GOOGLE_BREAKPAD_COMMON_STDIO_WRAPPER_H diff --git a/src/common/string_conversion.cc b/src/common/string_conversion.cc new file mode 100644 index 0000000..a4e64ff --- /dev/null +++ b/src/common/string_conversion.cc @@ -0,0 +1,158 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "common/convert_UTF.h" +#include "common/scoped_ptr.h" +#include "common/string_conversion.h" +#include "common/using_std_string.h" + +namespace google_breakpad { + +using std::vector; + +void UTF8ToUTF16(const char* in, vector* out) { + size_t source_length = strlen(in); + const UTF8* source_ptr = reinterpret_cast(in); + const UTF8* source_end_ptr = source_ptr + source_length; + // Erase the contents and zero fill to the expected size + out->clear(); + out->insert(out->begin(), source_length, 0); + uint16_t* target_ptr = &(*out)[0]; + uint16_t* target_end_ptr = target_ptr + out->capacity(); + ConversionResult result = ConvertUTF8toUTF16(&source_ptr, source_end_ptr, + &target_ptr, target_end_ptr, + strictConversion); + + // Resize to be the size of the # of converted characters + NULL + out->resize(result == conversionOK ? target_ptr - &(*out)[0] + 1: 0); +} + +int UTF8ToUTF16Char(const char* in, int in_length, uint16_t out[2]) { + const UTF8* source_ptr = reinterpret_cast(in); + const UTF8* source_end_ptr = source_ptr + 1; + uint16_t* target_ptr = out; + uint16_t* target_end_ptr = target_ptr + 2; + out[0] = out[1] = 0; + + // Process one character at a time + while (1) { + ConversionResult result = ConvertUTF8toUTF16(&source_ptr, source_end_ptr, + &target_ptr, target_end_ptr, + strictConversion); + + if (result == conversionOK) + return static_cast(source_ptr - reinterpret_cast(in)); + + // Add another character to the input stream and try again + source_ptr = reinterpret_cast(in); + ++source_end_ptr; + + if (source_end_ptr > reinterpret_cast(in) + in_length) + break; + } + + return 0; +} + +void UTF32ToUTF16(const wchar_t* in, vector* out) { + size_t source_length = wcslen(in); + const UTF32* source_ptr = reinterpret_cast(in); + const UTF32* source_end_ptr = source_ptr + source_length; + // Erase the contents and zero fill to the expected size + out->clear(); + out->insert(out->begin(), source_length, 0); + uint16_t* target_ptr = &(*out)[0]; + uint16_t* target_end_ptr = target_ptr + out->capacity(); + ConversionResult result = ConvertUTF32toUTF16(&source_ptr, source_end_ptr, + &target_ptr, target_end_ptr, + strictConversion); + + // Resize to be the size of the # of converted characters + NULL + out->resize(result == conversionOK ? target_ptr - &(*out)[0] + 1: 0); +} + +void UTF32ToUTF16Char(wchar_t in, uint16_t out[2]) { + const UTF32* source_ptr = reinterpret_cast(&in); + const UTF32* source_end_ptr = source_ptr + 1; + uint16_t* target_ptr = out; + uint16_t* target_end_ptr = target_ptr + 2; + out[0] = out[1] = 0; + ConversionResult result = ConvertUTF32toUTF16(&source_ptr, source_end_ptr, + &target_ptr, target_end_ptr, + strictConversion); + + if (result != conversionOK) { + out[0] = out[1] = 0; + } +} + +static inline uint16_t Swap(uint16_t value) { + return (value >> 8) | static_cast(value << 8); +} + +string UTF16ToUTF8(const vector& in, bool swap) { + const UTF16* source_ptr = &in[0]; + scoped_array source_buffer; + + // If we're to swap, we need to make a local copy and swap each byte pair + if (swap) { + int idx = 0; + source_buffer.reset(new uint16_t[in.size()]); + UTF16* source_buffer_ptr = source_buffer.get(); + for (vector::const_iterator it = in.begin(); + it != in.end(); ++it, ++idx) + source_buffer_ptr[idx] = Swap(*it); + + source_ptr = source_buffer.get(); + } + + // The maximum expansion would be 4x the size of the input string. + const UTF16* source_end_ptr = source_ptr + in.size(); + size_t target_capacity = in.size() * 4; + scoped_array target_buffer(new UTF8[target_capacity]); + UTF8* target_ptr = target_buffer.get(); + UTF8* target_end_ptr = target_ptr + target_capacity; + ConversionResult result = ConvertUTF16toUTF8(&source_ptr, source_end_ptr, + &target_ptr, target_end_ptr, + strictConversion); + + if (result == conversionOK) { + const char* targetPtr = reinterpret_cast(target_buffer.get()); + return targetPtr; + } + + return ""; +} + +} // namespace google_breakpad diff --git a/src/common/string_conversion.h b/src/common/string_conversion.h new file mode 100644 index 0000000..c5f5a35 --- /dev/null +++ b/src/common/string_conversion.h @@ -0,0 +1,67 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// string_conversion.h: Conversion between different UTF-8/16/32 encodings. + +#ifndef COMMON_STRING_CONVERSION_H__ +#define COMMON_STRING_CONVERSION_H__ + +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::vector; + +// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the +// conversion failed, |out| will be zero length. +void UTF8ToUTF16(const char* in, vector* out); + +// Convert at least one character (up to a maximum of |in_length|) from |in| +// to UTF-16 into |out|. Return the number of characters consumed from |in|. +// Any unused characters in |out| will be initialized to 0. No memory will +// be allocated by this routine. +int UTF8ToUTF16Char(const char* in, int in_length, uint16_t out[2]); + +// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the +// conversion failed, |out| will be zero length. +void UTF32ToUTF16(const wchar_t* in, vector* out); + +// Convert |in| to UTF-16 into |out|. Any unused characters in |out| will be +// initialized to 0. No memory will be allocated by this routine. +void UTF32ToUTF16Char(wchar_t in, uint16_t out[2]); + +// Convert |in| to UTF-8. If |swap| is true, swap bytes before converting. +string UTF16ToUTF8(const vector& in, bool swap); + +} // namespace google_breakpad + +#endif // COMMON_STRING_CONVERSION_H__ diff --git a/src/common/string_conversion_unittest.cc b/src/common/string_conversion_unittest.cc new file mode 100644 index 0000000..0f372c8 --- /dev/null +++ b/src/common/string_conversion_unittest.cc @@ -0,0 +1,67 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// string_conversion_unittest.cc: Unit tests for google_breakpad::UTF* helpers. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/string_conversion.h" + +using google_breakpad::UTF8ToUTF16; +using google_breakpad::UTF8ToUTF16Char; +using google_breakpad::UTF16ToUTF8; +using std::vector; + +TEST(StringConversionTest, UTF8ToUTF16) { + const char in[] = "aßc"; + vector out; + vector exp{'a', 0xdf, 'c', 0}; + UTF8ToUTF16(in, &out); + EXPECT_EQ(4u, out.size()); + EXPECT_EQ(exp, out); +} + +TEST(StringConversionTest, UTF8ToUTF16Char) { + const char in[] = "a"; + uint16_t out[3] = {0xff, 0xff, 0xff}; + EXPECT_EQ(1, UTF8ToUTF16Char(in, 1, out)); + EXPECT_EQ('a', out[0]); + EXPECT_EQ(0, out[1]); + EXPECT_EQ(0xff, out[2]); +} + +TEST(StringConversionTest, UTF16ToUTF8) { + vector in{'a', 0xdf, 'c', 0}; + EXPECT_EQ("aßc", UTF16ToUTF8(in, false)); +} diff --git a/src/common/string_view.h b/src/common/string_view.h new file mode 100644 index 0000000..a8e1592 --- /dev/null +++ b/src/common/string_view.h @@ -0,0 +1,113 @@ +// Copyright 2021 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_STRING_VIEW_H__ +#define COMMON_STRING_VIEW_H__ + +#include +#include +#include +#include "common/using_std_string.h" + +namespace google_breakpad { + +// A StringView is a string reference to a string object, but not own the +// string object. It's a compatibile layer until we can use std::string_view in +// C++17. +class StringView { + private: + // The start of the string, in an external buffer. It doesn't have to be + // null-terminated. + const char* data_ = ""; + + size_t length_ = 0; + + public: + // Construct an empty StringView. + StringView() = default; + + // Disallow construct StringView from nullptr. + StringView(std::nullptr_t) = delete; + + // Construct a StringView from a cstring. + StringView(const char* str) : data_(str) { + assert(str); + length_ = strlen(str); + } + + // Construct a StringView from a cstring with fixed length. + StringView(const char* str, size_t length) : data_(str), length_(length) { + assert(str); + } + + // Construct a StringView from an std::string. + StringView(const string& str) : data_(str.data()), length_(str.length()) {} + + string str() const { return string(data_, length_); } + + const char* data() const { return data_; } + + bool empty() const { return length_ == 0; } + + size_t size() const { return length_; } + + int compare(StringView rhs) const { + size_t min_len = std::min(size(), rhs.size()); + int res = memcmp(data_, rhs.data(), min_len); + if (res != 0) + return res; + if (size() == rhs.size()) + return 0; + return size() < rhs.size() ? -1 : 1; + } +}; + +inline bool operator==(StringView lhs, StringView rhs) { + return lhs.compare(rhs) == 0; +} + +inline bool operator!=(StringView lhs, StringView rhs) { + return lhs.compare(rhs) != 0; +} + +inline bool operator<(StringView lhs, StringView rhs) { + return lhs.compare(rhs) < 0; +} + +inline bool operator>(StringView lhs, StringView rhs) { + return lhs.compare(rhs) > 0; +} + +inline std::ostream& operator<<(std::ostream& os, StringView s) { + os << s.str(); + return os; +} + +} // namespace google_breakpad + +#endif // COMMON_STRING_VIEW_H__ diff --git a/src/common/symbol_data.h b/src/common/symbol_data.h new file mode 100644 index 0000000..19d6f3d --- /dev/null +++ b/src/common/symbol_data.h @@ -0,0 +1,57 @@ +// -*- mode: c++ -*- + +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_SYMBOL_DATA_H_ +#define COMMON_SYMBOL_DATA_H_ + +#include + +// Control what data is used from the symbol file. +enum SymbolData { + NO_DATA = 0, + SYMBOLS_AND_FILES = 1, + CFI = 1 << 1, + INLINES = 1 << 2, + ALL_SYMBOL_DATA = INLINES | CFI | SYMBOLS_AND_FILES +}; + +inline SymbolData operator&(SymbolData data1, SymbolData data2) { + return static_cast( + static_cast::type>(data1) & + static_cast::type>(data2)); +} + +inline SymbolData operator|(SymbolData data1, SymbolData data2) { + return static_cast( + static_cast::type>(data1) | + static_cast::type>(data2)); +} + +#endif // COMMON_SYMBOL_DATA_H_ diff --git a/src/common/test_assembler.cc b/src/common/test_assembler.cc new file mode 100644 index 0000000..6b1c1fd --- /dev/null +++ b/src/common/test_assembler.cc @@ -0,0 +1,362 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// test_assembler.cc: Implementation of google_breakpad::TestAssembler. +// See test_assembler.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/test_assembler.h" + +#include +#include + +#include + +namespace google_breakpad { +namespace test_assembler { + +using std::back_insert_iterator; + +Label::Label() : value_(new Binding()) { } +Label::Label(uint64_t value) : value_(new Binding(value)) { } +Label::Label(const Label& label) { + value_ = label.value_; + value_->Acquire(); +} +Label::~Label() { + if (value_->Release()) delete value_; +} + +Label& Label::operator=(uint64_t value) { + value_->Set(NULL, value); + return *this; +} + +Label& Label::operator=(const Label& label) { + value_->Set(label.value_, 0); + return *this; +} + +Label Label::operator+(uint64_t addend) const { + Label l; + l.value_->Set(this->value_, addend); + return l; +} + +Label Label::operator-(uint64_t subtrahend) const { + Label l; + l.value_->Set(this->value_, -subtrahend); + return l; +} + +// When NDEBUG is #defined, assert doesn't evaluate its argument. This +// means you can't simply use assert to check the return value of a +// function with necessary side effects. +// +// ALWAYS_EVALUATE_AND_ASSERT(x) evaluates x regardless of whether +// NDEBUG is #defined; when NDEBUG is not #defined, it further asserts +// that x is true. +#ifdef NDEBUG +#define ALWAYS_EVALUATE_AND_ASSERT(x) x +#else +#define ALWAYS_EVALUATE_AND_ASSERT(x) assert(x) +#endif + +uint64_t Label::operator-(const Label& label) const { + uint64_t offset; + ALWAYS_EVALUATE_AND_ASSERT(IsKnownOffsetFrom(label, &offset)); + return offset; +} + +uint64_t Label::Value() const { + uint64_t v = 0; + ALWAYS_EVALUATE_AND_ASSERT(IsKnownConstant(&v)); + return v; +}; + +bool Label::IsKnownConstant(uint64_t* value_p) const { + Binding* base; + uint64_t addend; + value_->Get(&base, &addend); + if (base != NULL) return false; + if (value_p) *value_p = addend; + return true; +} + +bool Label::IsKnownOffsetFrom(const Label& label, uint64_t* offset_p) const +{ + Binding* label_base, *this_base; + uint64_t label_addend, this_addend; + label.value_->Get(&label_base, &label_addend); + value_->Get(&this_base, &this_addend); + // If this and label are related, Get will find their final + // common ancestor, regardless of how indirect the relation is. This + // comparison also handles the constant vs. constant case. + if (this_base != label_base) return false; + if (offset_p) *offset_p = this_addend - label_addend; + return true; +} + +Label::Binding::Binding() : base_(this), addend_(), reference_count_(1) { } + +Label::Binding::Binding(uint64_t addend) + : base_(NULL), addend_(addend), reference_count_(1) { } + +Label::Binding::~Binding() { + assert(reference_count_ == 0); + if (base_ && base_ != this && base_->Release()) + delete base_; +} + +void Label::Binding::Set(Binding* binding, uint64_t addend) { + if (!base_ && !binding) { + // We're equating two constants. This could be okay. + assert(addend_ == addend); + } else if (!base_) { + // We are a known constant, but BINDING may not be, so turn the + // tables and try to set BINDING's value instead. + binding->Set(NULL, addend_ - addend); + } else { + if (binding) { + // Find binding's final value. Since the final value is always either + // completely unconstrained or a constant, never a reference to + // another variable (otherwise, it wouldn't be final), this + // guarantees we won't create cycles here, even for code like this: + // l = m, m = n, n = l; + uint64_t binding_addend; + binding->Get(&binding, &binding_addend); + addend += binding_addend; + } + + // It seems likely that setting a binding to itself is a bug + // (although I can imagine this might turn out to be helpful to + // permit). + assert(binding != this); + + if (base_ != this) { + // Set the other bindings on our chain as well. Note that this + // is sufficient even though binding relationships form trees: + // All binding operations traverse their chains to the end, and + // all bindings related to us share some tail of our chain, so + // they will see the changes we make here. + base_->Set(binding, addend - addend_); + // We're not going to use base_ any more. + if (base_->Release()) delete base_; + } + + // Adopt BINDING as our base. Note that it should be correct to + // acquire here, after the release above, even though the usual + // reference-counting rules call for acquiring first, and then + // releasing: the self-reference assertion above should have + // complained if BINDING were 'this' or anywhere along our chain, + // so we didn't release BINDING. + if (binding) binding->Acquire(); + base_ = binding; + addend_ = addend; + } +} + +void Label::Binding::Get(Binding** base, uint64_t* addend) { + if (base_ && base_ != this) { + // Recurse to find the end of our reference chain (the root of our + // tree), and then rewrite every binding along the chain to refer + // to it directly, adjusting addends appropriately. (This is why + // this member function isn't this-const.) + Binding* final_base; + uint64_t final_addend; + base_->Get(&final_base, &final_addend); + if (final_base) final_base->Acquire(); + if (base_->Release()) delete base_; + base_ = final_base; + addend_ += final_addend; + } + *base = base_; + *addend = addend_; +} + +template +static inline void InsertEndian(test_assembler::Endianness endianness, + size_t size, uint64_t number, Inserter dest) { + assert(size > 0); + if (endianness == kLittleEndian) { + for (size_t i = 0; i < size; i++) { + *dest++ = (char) (number & 0xff); + number >>= 8; + } + } else { + assert(endianness == kBigEndian); + // The loop condition is odd, but it's correct for size_t. + for (size_t i = size - 1; i < size; i--) + *dest++ = (char) ((number >> (i * 8)) & 0xff); + } +} + +Section& Section::Append(Endianness endianness, size_t size, uint64_t number) { + InsertEndian(endianness, size, number, + back_insert_iterator(contents_)); + return *this; +} + +Section& Section::Append(Endianness endianness, size_t size, + const Label& label) { + // If this label's value is known, there's no reason to waste an + // entry in references_ on it. + uint64_t value; + if (label.IsKnownConstant(&value)) + return Append(endianness, size, value); + + // This will get caught when the references are resolved, but it's + // nicer to find out earlier. + assert(endianness != kUnsetEndian); + + references_.push_back(Reference(contents_.size(), endianness, size, label)); + contents_.append(size, 0); + return *this; +} + +#define ENDIANNESS_L kLittleEndian +#define ENDIANNESS_B kBigEndian +#define ENDIANNESS(e) ENDIANNESS_ ## e + +#define DEFINE_SHORT_APPEND_NUMBER_ENDIAN(e, bits) \ + Section& Section::e ## bits(uint ## bits ## _t v) { \ + InsertEndian(ENDIANNESS(e), bits / 8, v, \ + back_insert_iterator(contents_)); \ + return *this; \ + } + +#define DEFINE_SHORT_APPEND_LABEL_ENDIAN(e, bits) \ + Section& Section::e ## bits(const Label& v) { \ + return Append(ENDIANNESS(e), bits / 8, v); \ + } + +// Define L16, B32, and friends. +#define DEFINE_SHORT_APPEND_ENDIAN(e, bits) \ + DEFINE_SHORT_APPEND_NUMBER_ENDIAN(e, bits) \ + DEFINE_SHORT_APPEND_LABEL_ENDIAN(e, bits) + +DEFINE_SHORT_APPEND_LABEL_ENDIAN(L, 8); +DEFINE_SHORT_APPEND_LABEL_ENDIAN(B, 8); +DEFINE_SHORT_APPEND_ENDIAN(L, 16); +DEFINE_SHORT_APPEND_ENDIAN(L, 32); +DEFINE_SHORT_APPEND_ENDIAN(L, 64); +DEFINE_SHORT_APPEND_ENDIAN(B, 16); +DEFINE_SHORT_APPEND_ENDIAN(B, 32); +DEFINE_SHORT_APPEND_ENDIAN(B, 64); + +#define DEFINE_SHORT_APPEND_NUMBER_DEFAULT(bits) \ + Section& Section::D ## bits(uint ## bits ## _t v) { \ + InsertEndian(endianness_, bits / 8, v, \ + back_insert_iterator(contents_)); \ + return *this; \ + } +#define DEFINE_SHORT_APPEND_LABEL_DEFAULT(bits) \ + Section& Section::D ## bits(const Label& v) { \ + return Append(endianness_, bits / 8, v); \ + } +#define DEFINE_SHORT_APPEND_DEFAULT(bits) \ + DEFINE_SHORT_APPEND_NUMBER_DEFAULT(bits) \ + DEFINE_SHORT_APPEND_LABEL_DEFAULT(bits) + +DEFINE_SHORT_APPEND_LABEL_DEFAULT(8) +DEFINE_SHORT_APPEND_DEFAULT(16); +DEFINE_SHORT_APPEND_DEFAULT(32); +DEFINE_SHORT_APPEND_DEFAULT(64); + +Section& Section::Append(const Section& section) { + size_t base = contents_.size(); + contents_.append(section.contents_); + for (vector::const_iterator it = section.references_.begin(); + it != section.references_.end(); it++) + references_.push_back(Reference(base + it->offset, it->endianness, + it->size, it->label)); + return *this; +} + +Section& Section::LEB128(long long value) { + while (value < -0x40 || 0x3f < value) { + contents_ += (value & 0x7f) | 0x80; + if (value < 0) + value = (value >> 7) | ~(((unsigned long long) -1) >> 7); + else + value = (value >> 7); + } + contents_ += value & 0x7f; + return *this; +} + +Section& Section::ULEB128(uint64_t value) { + while (value > 0x7f) { + contents_ += (value & 0x7f) | 0x80; + value = (value >> 7); + } + contents_ += value; + return *this; +} + +Section& Section::Align(size_t alignment, uint8_t pad_byte) { + // ALIGNMENT must be a power of two. + assert(((alignment - 1) & alignment) == 0); + size_t new_size = (contents_.size() + alignment - 1) & ~(alignment - 1); + contents_.append(new_size - contents_.size(), pad_byte); + assert((contents_.size() & (alignment - 1)) == 0); + return *this; +} + +void Section::Clear() { + contents_.clear(); + references_.clear(); +} + +bool Section::GetContents(string* contents) { + // For each label reference, find the label's value, and patch it into + // the section's contents. + for (size_t i = 0; i < references_.size(); i++) { + Reference& r = references_[i]; + uint64_t value; + if (!r.label.IsKnownConstant(&value)) { + fprintf(stderr, "Undefined label #%zu at offset 0x%zx\n", i, r.offset); + return false; + } + assert(r.offset < contents_.size()); + assert(contents_.size() - r.offset >= r.size); + InsertEndian(r.endianness, r.size, value, contents_.begin() + r.offset); + } + contents->clear(); + std::swap(contents_, *contents); + references_.clear(); + return true; +} + +} // namespace test_assembler +} // namespace google_breakpad diff --git a/src/common/test_assembler.h b/src/common/test_assembler.h new file mode 100644 index 0000000..809c7b2 --- /dev/null +++ b/src/common/test_assembler.h @@ -0,0 +1,483 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// test-assembler.h: interface to class for building complex binary streams. + +// To test the Breakpad symbol dumper and processor thoroughly, for +// all combinations of host system and minidump processor +// architecture, we need to be able to easily generate complex test +// data like debugging information and minidump files. +// +// For example, if we want our unit tests to provide full code +// coverage for stack walking, it may be difficult to persuade the +// compiler to generate every possible sort of stack walking +// information that we want to support; there are probably DWARF CFI +// opcodes that GCC never emits. Similarly, if we want to test our +// error handling, we will need to generate damaged minidumps or +// debugging information that (we hope) the client or compiler will +// never produce on its own. +// +// google_breakpad::TestAssembler provides a predictable and +// (relatively) simple way to generate complex formatted data streams +// like minidumps and CFI. Furthermore, because TestAssembler is +// portable, developers without access to (say) Visual Studio or a +// SPARC assembler can still work on test data for those targets. + +#ifndef PROCESSOR_TEST_ASSEMBLER_H_ +#define PROCESSOR_TEST_ASSEMBLER_H_ + +#include +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::list; +using std::vector; + +namespace test_assembler { + +// A Label represents a value not yet known that we need to store in a +// section. As long as all the labels a section refers to are defined +// by the time we retrieve its contents as bytes, we can use undefined +// labels freely in that section's construction. +// +// A label can be in one of three states: +// - undefined, +// - defined as the sum of some other label and a constant, or +// - a constant. +// +// A label's value never changes, but it can accumulate constraints. +// Adding labels and integers is permitted, and yields a label. +// Subtracting a constant from a label is permitted, and also yields a +// label. Subtracting two labels that have some relationship to each +// other is permitted, and yields a constant. +// +// For example: +// +// Label a; // a's value is undefined +// Label b; // b's value is undefined +// { +// Label c = a + 4; // okay, even though a's value is unknown +// b = c + 4; // also okay; b is now a+8 +// } +// Label d = b - 2; // okay; d == a+6, even though c is gone +// d.Value(); // error: d's value is not yet known +// d - a; // is 6, even though their values are not known +// a = 12; // now b == 20, and d == 18 +// d.Value(); // 18: no longer an error +// b.Value(); // 20 +// d = 10; // error: d is already defined. +// +// Label objects' lifetimes are unconstrained: notice that, in the +// above example, even though a and b are only related through c, and +// c goes out of scope, the assignment to a sets b's value as well. In +// particular, it's not necessary to ensure that a Label lives beyond +// Sections that refer to it. +class Label { + public: + Label(); // An undefined label. + Label(uint64_t value); // A label with a fixed value + Label(const Label& value); // A label equal to another. + ~Label(); + + // Return this label's value; it must be known. + // + // Providing this as a cast operator is nifty, but the conversions + // happen in unexpected places. In particular, ISO C++ says that + // Label + size_t becomes ambigious, because it can't decide whether + // to convert the Label to a uint64_t and then to a size_t, or use + // the overloaded operator that returns a new label, even though the + // former could fail if the label is not yet defined and the latter won't. + uint64_t Value() const; + + Label& operator=(uint64_t value); + Label& operator=(const Label& value); + Label operator+(uint64_t addend) const; + Label operator-(uint64_t subtrahend) const; + uint64_t operator-(const Label& subtrahend) const; + + // We could also provide == and != that work on undefined, but + // related, labels. + + // Return true if this label's value is known. If VALUE_P is given, + // set *VALUE_P to the known value if returning true. + bool IsKnownConstant(uint64_t* value_p = NULL) const; + + // Return true if the offset from LABEL to this label is known. If + // OFFSET_P is given, set *OFFSET_P to the offset when returning true. + // + // You can think of l.KnownOffsetFrom(m, &d) as being like 'd = l-m', + // except that it also returns a value indicating whether the + // subtraction is possible given what we currently know of l and m. + // It can be possible even if we don't know l and m's values. For + // example: + // + // Label l, m; + // m = l + 10; + // l.IsKnownConstant(); // false + // m.IsKnownConstant(); // false + // uint64_t d; + // l.IsKnownOffsetFrom(m, &d); // true, and sets d to -10. + // l-m // -10 + // m-l // 10 + // m.Value() // error: m's value is not known + bool IsKnownOffsetFrom(const Label& label, uint64_t* offset_p = NULL) const; + + private: + // A label's value, or if that is not yet known, how the value is + // related to other labels' values. A binding may be: + // - a known constant, + // - constrained to be equal to some other binding plus a constant, or + // - unconstrained, and free to take on any value. + // + // Many labels may point to a single binding, and each binding may + // refer to another, so bindings and labels form trees whose leaves + // are labels, whose interior nodes (and roots) are bindings, and + // where links point from children to parents. Bindings are + // reference counted, allowing labels to be lightweight, copyable, + // assignable, placed in containers, and so on. + class Binding { + public: + Binding(); + Binding(uint64_t addend); + ~Binding(); + + // Increment our reference count. + void Acquire() { reference_count_++; }; + // Decrement our reference count, and return true if it is zero. + bool Release() { return --reference_count_ == 0; } + + // Set this binding to be equal to BINDING + ADDEND. If BINDING is + // NULL, then set this binding to the known constant ADDEND. + // Update every binding on this binding's chain to point directly + // to BINDING, or to be a constant, with addends adjusted + // appropriately. + void Set(Binding* binding, uint64_t value); + + // Return what we know about the value of this binding. + // - If this binding's value is a known constant, set BASE to + // NULL, and set ADDEND to its value. + // - If this binding is not a known constant but related to other + // bindings, set BASE to the binding at the end of the relation + // chain (which will always be unconstrained), and set ADDEND to the + // value to add to that binding's value to get this binding's + // value. + // - If this binding is unconstrained, set BASE to this, and leave + // ADDEND unchanged. + void Get(Binding** base, uint64_t* addend); + + private: + // There are three cases: + // + // - A binding representing a known constant value has base_ NULL, + // and addend_ equal to the value. + // + // - A binding representing a completely unconstrained value has + // base_ pointing to this; addend_ is unused. + // + // - A binding whose value is related to some other binding's + // value has base_ pointing to that other binding, and addend_ + // set to the amount to add to that binding's value to get this + // binding's value. We only represent relationships of the form + // x = y+c. + // + // Thus, the bind_ links form a chain terminating in either a + // known constant value or a completely unconstrained value. Most + // operations on bindings do path compression: they change every + // binding on the chain to point directly to the final value, + // adjusting addends as appropriate. + Binding* base_; + uint64_t addend_; + + // The number of Labels and Bindings pointing to this binding. + // (When a binding points to itself, indicating a completely + // unconstrained binding, that doesn't count as a reference.) + int reference_count_; + }; + + // This label's value. + Binding* value_; +}; + +inline Label operator+(uint64_t a, const Label& l) { return l + a; } +// Note that int-Label isn't defined, as negating a Label is not an +// operation we support. + +// Conventions for representing larger numbers as sequences of bytes. +enum Endianness { + kBigEndian, // Big-endian: the most significant byte comes first. + kLittleEndian, // Little-endian: the least significant byte comes first. + kUnsetEndian, // used internally +}; + +// A section is a sequence of bytes, constructed by appending bytes +// to the end. Sections have a convenient and flexible set of member +// functions for appending data in various formats: big-endian and +// little-endian signed and unsigned values of different sizes; +// LEB128 and ULEB128 values (see below), and raw blocks of bytes. +// +// If you need to append a value to a section that is not convenient +// to compute immediately, you can create a label, append the +// label's value to the section, and then set the label's value +// later, when it's convenient to do so. Once a label's value is +// known, the section class takes care of updating all previously +// appended references to it. +// +// Once all the labels to which a section refers have had their +// values determined, you can get a copy of the section's contents +// as a string. +// +// Note that there is no specified "start of section" label. This is +// because there are typically several different meanings for "the +// start of a section": the offset of the section within an object +// file, the address in memory at which the section's content appear, +// and so on. It's up to the code that uses the Section class to +// keep track of these explicitly, as they depend on the application. +class Section { + public: + Section(Endianness endianness = kUnsetEndian) + : endianness_(endianness) { }; + + // A base class destructor should be either public and virtual, + // or protected and nonvirtual. + virtual ~Section() { }; + + // Set the default endianness of this section to ENDIANNESS. This + // sets the behavior of the D appending functions. If the + // assembler's default endianness was set, this is the + void set_endianness(Endianness endianness) { + endianness_ = endianness; + } + + // Return the default endianness of this section. + Endianness endianness() const { return endianness_; } + + // Append the SIZE bytes at DATA or the contents of STRING to the + // end of this section. Return a reference to this section. + Section& Append(const uint8_t* data, size_t size) { + contents_.append(reinterpret_cast(data), size); + return *this; + }; + Section& Append(const string& data) { + contents_.append(data); + return *this; + }; + + // Append SIZE copies of BYTE to the end of this section. Return a + // reference to this section. + Section& Append(size_t size, uint8_t byte) { + contents_.append(size, (char) byte); + return *this; + } + + // Append NUMBER to this section. ENDIANNESS is the endianness to + // use to write the number. SIZE is the length of the number in + // bytes. Return a reference to this section. + Section& Append(Endianness endianness, size_t size, uint64_t number); + Section& Append(Endianness endianness, size_t size, const Label& label); + + // Append SECTION to the end of this section. The labels SECTION + // refers to need not be defined yet. + // + // Note that this has no effect on any Labels' values, or on + // SECTION. If placing SECTION within 'this' provides new + // constraints on existing labels' values, then it's up to the + // caller to fiddle with those labels as needed. + Section& Append(const Section& section); + + // Append the contents of DATA as a series of bytes terminated by + // a NULL character. + Section& AppendCString(const string& data) { + Append(data); + contents_ += '\0'; + return *this; + } + + // Append at most SIZE bytes from DATA; if DATA is less than SIZE bytes + // long, pad with '\0' characters. + Section& AppendCString(const string& data, size_t size) { + contents_.append(data, 0, size); + if (data.size() < size) + Append(size - data.size(), 0); + return *this; + } + + // Append VALUE or LABEL to this section, with the given bit width and + // endianness. Return a reference to this section. + // + // The names of these functions have the form : + // is either 'L' (little-endian, least significant byte first), + // 'B' (big-endian, most significant byte first), or + // 'D' (default, the section's default endianness) + // is 8, 16, 32, or 64. + // + // Since endianness doesn't matter for a single byte, all the + // =8 functions are equivalent. + // + // These can be used to write both signed and unsigned values, as + // the compiler will properly sign-extend a signed value before + // passing it to the function, at which point the function's + // behavior is the same either way. + Section& L8(uint8_t value) { contents_ += value; return *this; } + Section& B8(uint8_t value) { contents_ += value; return *this; } + Section& D8(uint8_t value) { contents_ += value; return *this; } + Section &L16(uint16_t), &L32(uint32_t), &L64(uint64_t), + &B16(uint16_t), &B32(uint32_t), &B64(uint64_t), + &D16(uint16_t), &D32(uint32_t), &D64(uint64_t); + Section &L8(const Label& label), &L16(const Label& label), + &L32(const Label& label), &L64(const Label& label), + &B8(const Label& label), &B16(const Label& label), + &B32(const Label& label), &B64(const Label& label), + &D8(const Label& label), &D16(const Label& label), + &D32(const Label& label), &D64(const Label& label); + + // Append VALUE in a signed LEB128 (Little-Endian Base 128) form. + // + // The signed LEB128 representation of an integer N is a variable + // number of bytes: + // + // - If N is between -0x40 and 0x3f, then its signed LEB128 + // representation is a single byte whose value is N. + // + // - Otherwise, its signed LEB128 representation is (N & 0x7f) | + // 0x80, followed by the signed LEB128 representation of N / 128, + // rounded towards negative infinity. + // + // In other words, we break VALUE into groups of seven bits, put + // them in little-endian order, and then write them as eight-bit + // bytes with the high bit on all but the last. + // + // Note that VALUE cannot be a Label (we would have to implement + // relaxation). + Section& LEB128(long long value); + + // Append VALUE in unsigned LEB128 (Little-Endian Base 128) form. + // + // The unsigned LEB128 representation of an integer N is a variable + // number of bytes: + // + // - If N is between 0 and 0x7f, then its unsigned LEB128 + // representation is a single byte whose value is N. + // + // - Otherwise, its unsigned LEB128 representation is (N & 0x7f) | + // 0x80, followed by the unsigned LEB128 representation of N / + // 128, rounded towards negative infinity. + // + // Note that VALUE cannot be a Label (we would have to implement + // relaxation). + Section& ULEB128(uint64_t value); + + // Jump to the next location aligned on an ALIGNMENT-byte boundary, + // relative to the start of the section. Fill the gap with PAD_BYTE. + // ALIGNMENT must be a power of two. Return a reference to this + // section. + Section& Align(size_t alignment, uint8_t pad_byte = 0); + + // Clear the contents of this section. + void Clear(); + + // Return the current size of the section. + size_t Size() const { return contents_.size(); } + + // Return a label representing the start of the section. + // + // It is up to the user whether this label represents the section's + // position in an object file, the section's address in memory, or + // what have you; some applications may need both, in which case + // this simple-minded interface won't be enough. This class only + // provides a single start label, for use with the Here and Mark + // member functions. + // + // Ideally, we'd provide this in a subclass that actually knows more + // about the application at hand and can provide an appropriate + // collection of start labels. But then the appending member + // functions like Append and D32 would return a reference to the + // base class, not the derived class, and the chaining won't work. + // Since the only value here is in pretty notation, that's a fatal + // flaw. + Label start() const { return start_; } + + // Return a label representing the point at which the next Appended + // item will appear in the section, relative to start(). + Label Here() const { return start_ + Size(); } + + // Set *LABEL to Here, and return a reference to this section. + Section& Mark(Label* label) { *label = Here(); return *this; } + + // If there are no undefined label references left in this + // section, set CONTENTS to the contents of this section, as a + // string, and clear this section. Return true on success, or false + // if there were still undefined labels. + bool GetContents(string* contents); + + private: + // Used internally. A reference to a label's value. + struct Reference { + Reference(size_t set_offset, Endianness set_endianness, size_t set_size, + const Label& set_label) + : offset(set_offset), endianness(set_endianness), size(set_size), + label(set_label) { } + + // The offset of the reference within the section. + size_t offset; + + // The endianness of the reference. + Endianness endianness; + + // The size of the reference. + size_t size; + + // The label to which this is a reference. + Label label; + }; + + // The default endianness of this section. + Endianness endianness_; + + // The contents of the section. + string contents_; + + // References to labels within those contents. + vector references_; + + // A label referring to the beginning of the section. + Label start_; +}; + +} // namespace test_assembler +} // namespace google_breakpad + +#endif // PROCESSOR_TEST_ASSEMBLER_H_ diff --git a/src/common/test_assembler_unittest.cc b/src/common/test_assembler_unittest.cc new file mode 100644 index 0000000..0307fdb --- /dev/null +++ b/src/common/test_assembler_unittest.cc @@ -0,0 +1,1665 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// test_assembler_unittest.cc: Unit tests for google_breakpad::TestAssembler. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" + +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using google_breakpad::test_assembler::kBigEndian; +using google_breakpad::test_assembler::kLittleEndian; +using testing::Test; + +TEST(ConstructLabel, Simple) { + Label l; +} + +TEST(ConstructLabel, Undefined) { + Label l; + EXPECT_FALSE(l.IsKnownConstant()); +} + +TEST(ConstructLabelDeathTest, Undefined) { + Label l; + ASSERT_DEATH(l.Value(), "IsKnownConstant\\(&v\\)"); +} + +TEST(ConstructLabel, Constant) { + Label l(0x060b9f974eaf301eULL); + uint64_t v; + EXPECT_TRUE(l.IsKnownConstant(&v)); + EXPECT_EQ(v, 0x060b9f974eaf301eULL); + EXPECT_EQ(l.Value(), 0x060b9f974eaf301eULL); +} + +TEST(ConstructLabel, Copy) { + Label l; + Label m(l); + uint64_t v; + EXPECT_TRUE(l.IsKnownOffsetFrom(m, &v)); + EXPECT_EQ(0U, v); +} + +// The left-hand-side of a label assignment can be either +// unconstrained, related, or known. The right-hand-side can be any of +// those, or an integer. +TEST(Assignment, UnconstrainedToUnconstrained) { + Label l, m; + l = m; + EXPECT_EQ(0U, l-m); + EXPECT_TRUE(l.IsKnownOffsetFrom(m)); + uint64_t d; + EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d)); + EXPECT_EQ(0U, d); + EXPECT_FALSE(l.IsKnownConstant()); +} + +TEST(Assignment, UnconstrainedToRelated) { + Label l, m, n; + l = n; + l = m; + EXPECT_EQ(0U, l-m); + EXPECT_TRUE(l.IsKnownOffsetFrom(m)); + uint64_t d; + EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d)); + EXPECT_EQ(0U, d); + EXPECT_FALSE(l.IsKnownConstant()); +} + +TEST(Assignment, UnconstrainedToKnown) { + Label l, m; + l = 0x8fd16e55b20a39c1ULL; + l = m; + EXPECT_EQ(0U, l-m); + EXPECT_TRUE(l.IsKnownOffsetFrom(m)); + uint64_t d; + EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d)); + EXPECT_EQ(0U, d); + EXPECT_TRUE(m.IsKnownConstant()); + EXPECT_EQ(0x8fd16e55b20a39c1ULL, m.Value()); +} + +TEST(Assignment, RelatedToUnconstrained) { + Label l, m, n; + m = n; + l = m; + EXPECT_EQ(0U, l-n); + EXPECT_TRUE(l.IsKnownOffsetFrom(n)); + uint64_t d; + EXPECT_TRUE(l.IsKnownOffsetFrom(n, &d)); + EXPECT_EQ(0U, d); + EXPECT_FALSE(l.IsKnownConstant()); +} + +TEST(Assignment, RelatedToRelated) { + Label l, m, n, o; + l = n; + m = o; + l = m; + EXPECT_EQ(0U, n-o); + EXPECT_TRUE(n.IsKnownOffsetFrom(o)); + uint64_t d; + EXPECT_TRUE(n.IsKnownOffsetFrom(o, &d)); + EXPECT_EQ(0U, d); + EXPECT_FALSE(l.IsKnownConstant()); +} + +TEST(Assignment, RelatedToKnown) { + Label l, m, n; + m = n; + l = 0xd2011f8c82ad56f2ULL; + l = m; + EXPECT_TRUE(l.IsKnownConstant()); + EXPECT_EQ(0xd2011f8c82ad56f2ULL, l.Value()); + EXPECT_TRUE(m.IsKnownConstant()); + EXPECT_EQ(0xd2011f8c82ad56f2ULL, m.Value()); + EXPECT_TRUE(n.IsKnownConstant()); + EXPECT_EQ(0xd2011f8c82ad56f2ULL, n.Value()); +} + +TEST(Assignment, KnownToUnconstrained) { + Label l, m; + m = 0x50b024c0d6073887ULL; + l = m; + EXPECT_TRUE(l.IsKnownConstant()); + EXPECT_EQ(0x50b024c0d6073887ULL, l.Value()); + EXPECT_TRUE(m.IsKnownConstant()); + EXPECT_EQ(0x50b024c0d6073887ULL, m.Value()); +} + +TEST(Assignment, KnownToRelated) { + Label l, m, n; + l = n; + m = 0x5348883655c727e5ULL; + l = m; + EXPECT_TRUE(l.IsKnownConstant()); + EXPECT_EQ(0x5348883655c727e5ULL, l.Value()); + EXPECT_TRUE(m.IsKnownConstant()); + EXPECT_EQ(0x5348883655c727e5ULL, m.Value()); + EXPECT_TRUE(n.IsKnownConstant()); + EXPECT_EQ(0x5348883655c727e5ULL, n.Value()); +} + +TEST(Assignment, KnownToKnown) { + Label l, m; + l = 0x36c209c20987564eULL; + m = 0x36c209c20987564eULL; + l = m; + EXPECT_TRUE(l.IsKnownConstant()); + EXPECT_EQ(0x36c209c20987564eULL, l.Value()); + EXPECT_TRUE(m.IsKnownConstant()); + EXPECT_EQ(0x36c209c20987564eULL, m.Value()); +} + +TEST(Assignment, ConstantToUnconstrained) { + Label l; + l = 0xc02495f4d7f5a957ULL; + EXPECT_TRUE(l.IsKnownConstant()); + EXPECT_EQ(0xc02495f4d7f5a957ULL, l.Value()); +} + +TEST(Assignment, ConstantToRelated) { + Label l, m; + l = m; + l = 0x4577901cf275488dULL; + EXPECT_TRUE(l.IsKnownConstant()); + EXPECT_EQ(0x4577901cf275488dULL, l.Value()); + EXPECT_TRUE(m.IsKnownConstant()); + EXPECT_EQ(0x4577901cf275488dULL, m.Value()); +} + +TEST(Assignment, ConstantToKnown) { + Label l; + l = 0xec0b9c369b7e8ea7ULL; + l = 0xec0b9c369b7e8ea7ULL; + EXPECT_TRUE(l.IsKnownConstant()); + EXPECT_EQ(0xec0b9c369b7e8ea7ULL, l.Value()); +} + +TEST(AssignmentDeathTest, Self) { + Label l; + ASSERT_DEATH(l = l, "binding != this"); +} + +TEST(AssignmentDeathTest, IndirectCycle) { + Label l, m, n; + l = m; + m = n; + ASSERT_DEATH(n = l, "binding != this"); +} + +TEST(AssignmentDeathTest, Cycle) { + Label l, m, n, o; + l = m; + m = n; + o = n; + ASSERT_DEATH(o = l, "binding != this"); +} + +TEST(Addition, LabelConstant) { + Label l, m; + m = l + 0x5248d93e8bbe9497ULL; + EXPECT_TRUE(m.IsKnownOffsetFrom(l)); + uint64_t d; + EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); + EXPECT_EQ(0x5248d93e8bbe9497ULL, d); + EXPECT_FALSE(m.IsKnownConstant()); +} + +TEST(Addition, ConstantLabel) { + Label l, m; + m = 0xf51e94e00d6e3c84ULL + l; + EXPECT_TRUE(m.IsKnownOffsetFrom(l)); + uint64_t d; + EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); + EXPECT_EQ(0xf51e94e00d6e3c84ULL, d); + EXPECT_FALSE(m.IsKnownConstant()); +} + +TEST(Addition, KnownLabelConstant) { + Label l, m; + l = 0x16286307042ce0d8ULL; + m = l + 0x3fdddd91306719d7ULL; + EXPECT_TRUE(m.IsKnownOffsetFrom(l)); + uint64_t d; + EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); + EXPECT_EQ(0x3fdddd91306719d7ULL, d); + EXPECT_TRUE(m.IsKnownConstant()); + EXPECT_EQ(0x16286307042ce0d8ULL + 0x3fdddd91306719d7ULL, m.Value()); +} + +TEST(Addition, ConstantKnownLabel) { + Label l, m; + l = 0x50f62d0cdd1031deULL; + m = 0x1b13462d8577c538ULL + l; + EXPECT_TRUE(m.IsKnownOffsetFrom(l)); + uint64_t d; + EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); + EXPECT_EQ(0x1b13462d8577c538ULL, d); + EXPECT_TRUE(m.IsKnownConstant()); + EXPECT_EQ(0x50f62d0cdd1031deULL + 0x1b13462d8577c538ULL, m.Value()); +} + +TEST(Subtraction, LabelConstant) { + Label l, m; + m = l - 0x0620884d21d3138eULL; + EXPECT_TRUE(m.IsKnownOffsetFrom(l)); + uint64_t d; + EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); + EXPECT_EQ(-0x0620884d21d3138eULL, d); + EXPECT_FALSE(m.IsKnownConstant()); +} + +TEST(Subtraction, KnownLabelConstant) { + Label l, m; + l = 0x6237fbaf9ef7929eULL; + m = l - 0x317730995d2ab6eeULL; + EXPECT_TRUE(m.IsKnownOffsetFrom(l)); + uint64_t d; + EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); + EXPECT_EQ(-0x317730995d2ab6eeULL, d); + EXPECT_TRUE(m.IsKnownConstant()); + EXPECT_EQ(0x6237fbaf9ef7929eULL - 0x317730995d2ab6eeULL, m.Value()); +} + +TEST(SubtractionDeathTest, LabelLabel) { + Label l, m; + ASSERT_DEATH(l - m, "IsKnownOffsetFrom\\(label, &offset\\)"); +} + +TEST(Subtraction, LabelLabel) { + Label l, m; + l = m + 0x7fa77ec63e28a17aULL; + EXPECT_EQ(0x7fa77ec63e28a17aULL, l - m); + EXPECT_EQ(-0x7fa77ec63e28a17aULL, m - l); +} + +TEST(IsKnownConstant, Undefined) { + Label l; + EXPECT_FALSE(l.IsKnownConstant()); +} + +TEST(IsKnownConstant, RelatedLabel) { + Label l, m; + l = m; + EXPECT_FALSE(l.IsKnownConstant()); + EXPECT_FALSE(m.IsKnownConstant()); +} + +TEST(IsKnownConstant, Constant) { + Label l; + l = 0xf374b1bdd6a22576ULL; + EXPECT_TRUE(l.IsKnownConstant()); +} + +TEST(IsKnownOffsetFrom, Unrelated) { + Label l, m; + EXPECT_FALSE(l.IsKnownOffsetFrom(m)); +} + +TEST(IsKnownOffsetFrom, Related) { + Label l, m; + l = m; + EXPECT_TRUE(l.IsKnownOffsetFrom(m)); +} + +// Test the construction of chains of related labels, and the +// propagation of values through them. +// +// Although the relations between labels are supposed to behave +// symmetrically --- that is, 'a = b' should put a and b in +// indistinguishable states --- there's a distinction made internally +// between the target (a) and the source (b). +// +// So there are five test axes to cover: +// +// - Do we construct the chain with assignment ("Assign") or with constructors +// ("Construct")? +// +// - Do we set the value of the label at the start of the chain +// ("Start") or the label at the end ("End")? +// +// - Are we testing the propagation of a relationship between variable +// values ("Relation"), or the propagation of a known constant value +// ("Value")? +// +// - Do we set the value before building the chain ("Before") or after +// the chain has been built ("After")? +// +// - Do we add new relationships to the end of the existing chain +// ("Forward") or to the beginning ("Backward")? +// +// Of course, "Construct" and "Backward" can't be combined, which +// eliminates eight combinations, and "Construct", "End", and "Before" +// can't be combined, which eliminates two more, so there are are 22 +// combinations, not 32. + +TEST(LabelChain, AssignStartRelationBeforeForward) { + Label a, b, c, d; + Label x; + a = x; + b = a + 0x1; + c = b + 0x10; + d = c + 0x100; + EXPECT_EQ(0x111U, d-x); + EXPECT_EQ(0x11U, c-x); + EXPECT_EQ(0x1U, b-x); + EXPECT_EQ(0U, a-x); +} + +TEST(LabelChain, AssignStartRelationBeforeBackward) { + Label a, b, c, d; + Label x; + a = x; + d = c + 0x100; + c = b + 0x10; + b = a + 0x1; + EXPECT_EQ(0x111U, d-x); + EXPECT_EQ(0x11U, c-x); + EXPECT_EQ(0x1U, b-x); + EXPECT_EQ(0U, a-x); +} + +TEST(LabelChain, AssignStartRelationAfterForward) { + Label a, b, c, d; + Label x; + b = a + 0x1; + c = b + 0x10; + d = c + 0x100; + a = x; + EXPECT_EQ(0x111U, d-x); + EXPECT_EQ(0x11U, c-x); + EXPECT_EQ(0x1U, b-x); + EXPECT_EQ(0U, a-x); +} + +TEST(LabelChain, AssignStartRelationAfterBackward) { + Label a, b, c, d; + Label x; + d = c + 0x100; + c = b + 0x10; + b = a + 0x1; + a = x; + EXPECT_EQ(0x111U, d-x); + EXPECT_EQ(0x11U, c-x); + EXPECT_EQ(0x1U, b-x); + EXPECT_EQ(0U, a-x); +} + +TEST(LabelChain, AssignStartValueBeforeForward) { + Label a, b, c, d; + a = 0xa131200190546ac2ULL; + b = a + 0x1; + c = b + 0x10; + d = c + 0x100; + EXPECT_EQ(0xa131200190546ac2ULL + 0x111U, d.Value()); + EXPECT_EQ(0xa131200190546ac2ULL + 0x11U, c.Value()); + EXPECT_EQ(0xa131200190546ac2ULL + 0x1U, b.Value()); + EXPECT_EQ(0xa131200190546ac2ULL + 0U, a.Value()); +} + +TEST(LabelChain, AssignStartValueBeforeBackward) { + Label a, b, c, d; + a = 0x8da17e1670ad4fa2ULL; + d = c + 0x100; + c = b + 0x10; + b = a + 0x1; + EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x111U, d.Value()); + EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x11U, c.Value()); + EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x1U, b.Value()); + EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0U, a.Value()); +} + +TEST(LabelChain, AssignStartValueAfterForward) { + Label a, b, c, d; + b = a + 0x1; + c = b + 0x10; + d = c + 0x100; + a = 0x99b8f51bafd41adaULL; + EXPECT_EQ(0x99b8f51bafd41adaULL + 0x111U, d.Value()); + EXPECT_EQ(0x99b8f51bafd41adaULL + 0x11U, c.Value()); + EXPECT_EQ(0x99b8f51bafd41adaULL + 0x1U, b.Value()); + EXPECT_EQ(0x99b8f51bafd41adaULL + 0U, a.Value()); +} + +TEST(LabelChain, AssignStartValueAfterBackward) { + Label a, b, c, d; + d = c + 0x100; + c = b + 0x10; + b = a + 0x1; + a = 0xc86ca1d97ab5df6eULL; + EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x111U, d.Value()); + EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x11U, c.Value()); + EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x1U, b.Value()); + EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0U, a.Value()); +} + +TEST(LabelChain, AssignEndRelationBeforeForward) { + Label a, b, c, d; + Label x; + x = d; + b = a + 0x1; + c = b + 0x10; + d = c + 0x100; + EXPECT_EQ(-(uint64_t)0x111U, a-x); + EXPECT_EQ(-(uint64_t)0x110U, b-x); + EXPECT_EQ(-(uint64_t)0x100U, c-x); + EXPECT_EQ(-(uint64_t)0U, d-x); +} + +TEST(LabelChain, AssignEndRelationBeforeBackward) { + Label a, b, c, d; + Label x; + x = d; + d = c + 0x100; + c = b + 0x10; + b = a + 0x1; + EXPECT_EQ(-(uint64_t)0x111U, a-x); + EXPECT_EQ(-(uint64_t)0x110U, b-x); + EXPECT_EQ(-(uint64_t)0x100U, c-x); + EXPECT_EQ(-(uint64_t)0U, d-x); +} + +TEST(LabelChain, AssignEndRelationAfterForward) { + Label a, b, c, d; + Label x; + b = a + 0x1; + c = b + 0x10; + d = c + 0x100; + x = d; + EXPECT_EQ(-(uint64_t)0x111U, a-x); + EXPECT_EQ(-(uint64_t)0x110U, b-x); + EXPECT_EQ(-(uint64_t)0x100U, c-x); + EXPECT_EQ(-(uint64_t)0x000U, d-x); +} + +TEST(LabelChain, AssignEndRelationAfterBackward) { + Label a, b, c, d; + Label x; + d = c + 0x100; + c = b + 0x10; + b = a + 0x1; + x = d; + EXPECT_EQ(-(uint64_t)0x111U, a-x); + EXPECT_EQ(-(uint64_t)0x110U, b-x); + EXPECT_EQ(-(uint64_t)0x100U, c-x); + EXPECT_EQ(-(uint64_t)0x000U, d-x); +} + +TEST(LabelChain, AssignEndValueBeforeForward) { + Label a, b, c, d; + d = 0xa131200190546ac2ULL; + b = a + 0x1; + c = b + 0x10; + d = c + 0x100; + EXPECT_EQ(0xa131200190546ac2ULL - 0x111, a.Value()); + EXPECT_EQ(0xa131200190546ac2ULL - 0x110, b.Value()); + EXPECT_EQ(0xa131200190546ac2ULL - 0x100, c.Value()); + EXPECT_EQ(0xa131200190546ac2ULL - 0x000, d.Value()); +} + +TEST(LabelChain, AssignEndValueBeforeBackward) { + Label a, b, c, d; + d = 0x8da17e1670ad4fa2ULL; + d = c + 0x100; + c = b + 0x10; + b = a + 0x1; + EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x111, a.Value()); + EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x110, b.Value()); + EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x100, c.Value()); + EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x000, d.Value()); +} + +TEST(LabelChain, AssignEndValueAfterForward) { + Label a, b, c, d; + b = a + 0x1; + c = b + 0x10; + d = c + 0x100; + d = 0x99b8f51bafd41adaULL; + EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value()); + EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value()); + EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value()); + EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value()); +} + +TEST(LabelChain, AssignEndValueAfterBackward) { + Label a, b, c, d; + d = c + 0x100; + c = b + 0x10; + b = a + 0x1; + d = 0xc86ca1d97ab5df6eULL; + EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x111, a.Value()); + EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x110, b.Value()); + EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x100, c.Value()); + EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x000, d.Value()); +} + +TEST(LabelChain, ConstructStartRelationBeforeForward) { + Label x; + Label a(x); + Label b(a + 0x1); + Label c(b + 0x10); + Label d(c + 0x100); + EXPECT_EQ(0x111U, d-x); + EXPECT_EQ(0x11U, c-x); + EXPECT_EQ(0x1U, b-x); + EXPECT_EQ(0U, a-x); +} + +TEST(LabelChain, ConstructStartRelationAfterForward) { + Label x; + Label a; + Label b(a + 0x1); + Label c(b + 0x10); + Label d(c + 0x100); + a = x; + EXPECT_EQ(0x111U, d-x); + EXPECT_EQ(0x11U, c-x); + EXPECT_EQ(0x1U, b-x); + EXPECT_EQ(0U, a-x); +} + +TEST(LabelChain, ConstructStartValueBeforeForward) { + Label a(0x5d234d177d01ccc8ULL); + Label b(a + 0x1); + Label c(b + 0x10); + Label d(c + 0x100); + EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x111U, d.Value()); + EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x011U, c.Value()); + EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x001U, b.Value()); + EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x000U, a.Value()); +} + +TEST(LabelChain, ConstructStartValueAfterForward) { + Label a; + Label b(a + 0x1); + Label c(b + 0x10); + Label d(c + 0x100); + a = 0xded85d54586e84fcULL; + EXPECT_EQ(0xded85d54586e84fcULL + 0x111U, d.Value()); + EXPECT_EQ(0xded85d54586e84fcULL + 0x011U, c.Value()); + EXPECT_EQ(0xded85d54586e84fcULL + 0x001U, b.Value()); + EXPECT_EQ(0xded85d54586e84fcULL + 0x000U, a.Value()); +} + +TEST(LabelChain, ConstructEndRelationAfterForward) { + Label x; + Label a; + Label b(a + 0x1); + Label c(b + 0x10); + Label d(c + 0x100); + x = d; + EXPECT_EQ(-(uint64_t)0x111U, a-x); + EXPECT_EQ(-(uint64_t)0x110U, b-x); + EXPECT_EQ(-(uint64_t)0x100U, c-x); + EXPECT_EQ(-(uint64_t)0x000U, d-x); +} + +TEST(LabelChain, ConstructEndValueAfterForward) { + Label a; + Label b(a + 0x1); + Label c(b + 0x10); + Label d(c + 0x100); + d = 0x99b8f51bafd41adaULL; + EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value()); + EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value()); + EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value()); + EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value()); +} + +TEST(LabelTree, KnownValue) { + Label l, m, n, o, p; + l = m; + m = n; + o = p; + p = n; + l = 0x536b5de3d468a1b5ULL; + EXPECT_EQ(0x536b5de3d468a1b5ULL, o.Value()); +} + +TEST(LabelTree, Related) { + Label l, m, n, o, p; + l = m - 1; + m = n - 10; + o = p + 100; + p = n + 1000; + EXPECT_EQ(1111U, o - l); +} + +TEST(EquationDeathTest, EqualConstants) { + Label m = 0x0d3962f280f07d24ULL; + Label n = 0x0d3962f280f07d24ULL; + m = n; // no death expected +} + +TEST(EquationDeathTest, EqualIndirectConstants) { + Label m = 0xa347f1e5238fe6a1ULL; + Label n; + Label o = n; + n = 0xa347f1e5238fe6a1ULL; + n = m; // no death expected +} + +TEST(EquationDeathTest, ConstantClash) { + Label m = 0xd4cc0f4f630ec741ULL; + Label n = 0x934cd2d8254fc3eaULL; + ASSERT_DEATH(m = n, "addend_ == addend"); +} + +TEST(EquationDeathTest, IndirectConstantClash) { + Label m = 0xd4cc0f4f630ec741ULL; + Label n, o; + n = o; + o = 0xcfbe3b83ac49ce86ULL; + ASSERT_DEATH(m = n, "addend_ == addend"); +} + +// Assigning to a related label may free the next Binding on its +// chain. This test always passes; it is interesting to memory +// checkers and coverage analysis. +TEST(LabelReferenceCount, AssignmentFree) { + Label l; + { + Label m; + l = m; + } + // This should free m's Binding. + l = 0xca8bae92f0376d4fULL; + ASSERT_EQ(0xca8bae92f0376d4fULL, l.Value()); +} + +// Finding the value of a label may free the Binding it refers to. This test +// always passes; it is interesting to memory checkers and coverage analysis. +TEST(LabelReferenceCount, FindValueFree) { + Label l; + { + Label m, n; + l = m; + m = n; + n = 0x7a0b0c576672daafULL; + // At this point, l's Binding refers to m's Binding, which refers + // to n's binding. + } + // Now, l is the only reference keeping the three Bindings alive. + // Resolving its value should free l's and m's original bindings. + ASSERT_EQ(0x7a0b0c576672daafULL, l.Value()); +} + +TEST(ConstructSection, Simple) { + Section s; +} + +TEST(ConstructSection, WithEndian) { + Section s(kBigEndian); +} + +// A fixture class for TestAssembler::Section tests. +class SectionFixture { + public: + Section section; + string contents; + static const uint8_t data[]; + static const size_t data_size; +}; + +const uint8_t SectionFixture::data[] = { + 0x87, 0x4f, 0x43, 0x67, 0x30, 0xd0, 0xd4, 0x0e +}; + +#define I0() +#define I1(a) { a } +#define I2(a,b) { a,b } +#define I3(a,b,c) { a,b,c } +#define I4(a,b,c,d) { a,b,c,d } +#define I5(a,b,c,d,e) { a,b,c,d,e } +#define I6(a,b,c,d,e,f) { a,b,c,d,e,f } +#define I7(a,b,c,d,e,f,g) { a,b,c,d,e,f,g } +#define I8(a,b,c,d,e,f,g,h) { a,b,c,d,e,f,g,h } +#define I9(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f,g,h,i } +#define ASSERT_BYTES(s, b) \ + do \ + { \ + static const uint8_t expected_bytes[] = b; \ + ASSERT_EQ(sizeof(expected_bytes), s.size()); \ + ASSERT_TRUE(memcmp(s.data(), (const char*) expected_bytes, \ + sizeof(expected_bytes)) == 0); \ + } \ + while(0) + +class Append: public SectionFixture, public Test { }; + +TEST_F(Append, Bytes) { + section.Append(data, sizeof(data)); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_EQ(sizeof(data), contents.size()); + EXPECT_TRUE(0 == memcmp(contents.data(), (const char*) data, sizeof(data))); +} + +TEST_F(Append, BytesTwice) { + section.Append(data, sizeof(data)); + section.Append(data, sizeof(data)); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_EQ(2 * sizeof(data), contents.size()); + ASSERT_TRUE(0 == memcmp(contents.data(), (const char*) data, sizeof(data))); + ASSERT_TRUE(0 == memcmp(contents.data() + sizeof(data), + (const char*) data, sizeof(data))); +} + +TEST_F(Append, String) { + string s1 = "howdy "; + string s2 = "there"; + section.Append(s1); + section.Append(s2); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_STREQ(contents.c_str(), "howdy there"); +} + +TEST_F(Append, CString) { + section.AppendCString("howdy"); + section.AppendCString(""); + section.AppendCString("there"); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_EQ(string("howdy\0\0there\0", 13), contents); +} + +TEST_F(Append, CStringSize) { + section.AppendCString("howdy", 3); + section.AppendCString("there", 5); + section.AppendCString("fred", 6); + section.AppendCString("natalie", 0); + section.AppendCString("", 10); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_EQ(string("howtherefred\0\0\0\0\0\0\0\0\0\0\0\0", 24), contents); +} + +TEST_F(Append, RepeatedBytes) { + section.Append((size_t) 10, '*'); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_STREQ(contents.c_str(), "**********"); +} + +TEST_F(Append, GeneralLE1) { + section.Append(kLittleEndian, 1, 42); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I1(42)); +} + +TEST_F(Append, GeneralLE2) { + section.Append(kLittleEndian, 2, 0x15a1); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0xa1, 0x15)); +} + +TEST_F(Append, GeneralLE3) { + section.Append(kLittleEndian, 3, 0x59ae8d); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59)); +} + +TEST_F(Append, GeneralLE4) { + section.Append(kLittleEndian, 4, 0x51603c56); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51)); +} + +TEST_F(Append, GeneralLE5) { + section.Append(kLittleEndian, 5, 0x385e2803b4ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38)); +} + +TEST_F(Append, GeneralLE6) { + section.Append(kLittleEndian, 6, 0xc7db9534dd1fULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7)); +} + +TEST_F(Append, GeneralLE7) { + section.Append(kLittleEndian, 7, 0x1445c9f1b843e6ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14)); +} + +TEST_F(Append, GeneralLE8) { + section.Append(kLittleEndian, 8, 0xaf48019dfe5c01e5ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf)); +} + +TEST_F(Append, GeneralBE1) { + section.Append(kBigEndian, 1, 0xd0ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I1(0xd0)); +} + +TEST_F(Append, GeneralBE2) { + section.Append(kBigEndian, 2, 0x2e7eULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0x2e, 0x7e)); +} + +TEST_F(Append, GeneralBE3) { + section.Append(kBigEndian, 3, 0x37dad6ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6)); +} + +TEST_F(Append, GeneralBE4) { + section.Append(kBigEndian, 4, 0x715935c7ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7)); +} + +TEST_F(Append, GeneralBE5) { + section.Append(kBigEndian, 5, 0x42baeb02b7ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7)); +} + +TEST_F(Append, GeneralBE6) { + section.Append(kBigEndian, 6, 0xf1cdf10e7b18ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18)); +} + +TEST_F(Append, GeneralBE7) { + section.Append(kBigEndian, 7, 0xf50a724f0b0d20ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20)); +} + +TEST_F(Append, GeneralBE8) { + section.Append(kBigEndian, 8, 0xa6b2cb5e98dc9c16ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16)); +} + +TEST_F(Append, GeneralLE1Label) { + Label l; + section.Append(kLittleEndian, 1, l); + l = 42; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I1(42)); +} + +TEST_F(Append, GeneralLE2Label) { + Label l; + section.Append(kLittleEndian, 2, l); + l = 0x15a1; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0xa1, 0x15)); +} + +TEST_F(Append, GeneralLE3Label) { + Label l; + section.Append(kLittleEndian, 3, l); + l = 0x59ae8d; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59)); +} + +TEST_F(Append, GeneralLE4Label) { + Label l; + section.Append(kLittleEndian, 4, l); + l = 0x51603c56; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51)); +} + +TEST_F(Append, GeneralLE5Label) { + Label l; + section.Append(kLittleEndian, 5, l); + l = 0x385e2803b4ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38)); +} + +TEST_F(Append, GeneralLE6Label) { + Label l; + section.Append(kLittleEndian, 6, l); + l = 0xc7db9534dd1fULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7)); +} + +TEST_F(Append, GeneralLE7Label) { + Label l; + section.Append(kLittleEndian, 7, l); + l = 0x1445c9f1b843e6ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14)); +} + +TEST_F(Append, GeneralLE8Label) { + Label l; + section.Append(kLittleEndian, 8, l); + l = 0xaf48019dfe5c01e5ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf)); +} + +TEST_F(Append, GeneralBE1Label) { + Label l; + section.Append(kBigEndian, 1, l); + l = 0xd0ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I1(0xd0)); +} + +TEST_F(Append, GeneralBE2Label) { + Label l; + section.Append(kBigEndian, 2, l); + l = 0x2e7eULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0x2e, 0x7e)); +} + +TEST_F(Append, GeneralBE3Label) { + Label l; + section.Append(kBigEndian, 3, l); + l = 0x37dad6ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6)); +} + +TEST_F(Append, GeneralBE4Label) { + Label l; + section.Append(kBigEndian, 4, l); + l = 0x715935c7ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7)); +} + +TEST_F(Append, GeneralBE5Label) { + Label l; + section.Append(kBigEndian, 5, l); + l = 0x42baeb02b7ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7)); +} + +TEST_F(Append, GeneralBE6Label) { + Label l; + section.Append(kBigEndian, 6, l); + l = 0xf1cdf10e7b18ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18)); +} + +TEST_F(Append, GeneralBE7Label) { + Label l; + section.Append(kBigEndian, 7, l); + l = 0xf50a724f0b0d20ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20)); +} + +TEST_F(Append, GeneralBE8Label) { + Label l; + section.Append(kBigEndian, 8, l); + l = 0xa6b2cb5e98dc9c16ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16)); +} + +TEST_F(Append, B8) { + section.Append(1, 0x2a); + section.B8(0xd3U); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0x2a, 0xd3)); +} + +TEST_F(Append, B8Label) { + Label l; + section.Append(1, 0x2a); + section.B8(l); + l = 0x4bU; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0x2a, 0x4b)); +} + +TEST_F(Append, B16) { + section.Append(1, 0x2a); + section.B16(0x472aU); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x2a, 0x47, 0x2a)); +} + +TEST_F(Append, B16Label) { + Label l; + section.Append(1, 0x2a); + section.B16(l); + l = 0x55e8U; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x2a, 0x55, 0xe8)); +} + +TEST_F(Append, B32) { + section.Append(1, 0x2a); + section.B32(0xbd412cbcU); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0x2a, 0xbd, 0x41, 0x2c, 0xbc)); +} + +TEST_F(Append, B32Label) { + Label l; + section.Append(1, 0x2a); + section.B32(l); + l = 0x208e37d5U; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0x2a, 0x20, 0x8e, 0x37, 0xd5)); +} + +TEST_F(Append, B64) { + section.Append(1, 0x2a); + section.B64(0x3402a013111e68adULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, + I9(0x2a, 0x34, 0x02, 0xa0, 0x13, 0x11, 0x1e, 0x68, 0xad)); +} + +TEST_F(Append, B64Label) { + Label l; + section.Append(1, 0x2a); + section.B64(l); + l = 0x355dbfbb4ac6d57fULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, + I9(0x2a, 0x35, 0x5d, 0xbf, 0xbb, 0x4a, 0xc6, 0xd5, 0x7f)); +} + +TEST_F(Append, L8) { + section.Append(1, 0x2a); + section.L8(0x26U); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0x2a, 0x26)); +} + +TEST_F(Append, L8Label) { + Label l; + section.Append(1, 0x2a); + section.L8(l); + l = 0xa8U; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0x2a, 0xa8)); +} + +TEST_F(Append, L16) { + section.Append(1, 0x2a); + section.L16(0xca6dU); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x2a, 0x6d, 0xca)); +} + +TEST_F(Append, L16Label) { + Label l; + section.Append(1, 0x2a); + section.L16(l); + l = 0xd21fU; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x2a, 0x1f, 0xd2)); +} + +TEST_F(Append, L32) { + section.Append(1, 0x2a); + section.L32(0x558f6181U); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0x2a, 0x81, 0x61, 0x8f, 0x55)); +} + +TEST_F(Append, L32Label) { + Label l; + section.Append(1, 0x2a); + section.L32(l); + l = 0x4b810f82U; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0x2a, 0x82, 0x0f, 0x81, 0x4b)); +} + +TEST_F(Append, L64) { + section.Append(1, 0x2a); + section.L64(0x564384f7579515bfULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, + I9(0x2a, 0xbf, 0x15, 0x95, 0x57, 0xf7, 0x84, 0x43, 0x56)); +} + +TEST_F(Append, L64Label) { + Label l; + section.Append(1, 0x2a); + section.L64(l); + l = 0x424b1d020667c8dbULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, + I9(0x2a, 0xdb, 0xc8, 0x67, 0x06, 0x02, 0x1d, 0x4b, 0x42)); +} + +TEST_F(Append, D8Big) { + section.set_endianness(kBigEndian); + section.Append(1, 0x2a); + section.D8(0xe6U); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0x2a, 0xe6)); +} + +TEST_F(Append, D8BigLabel) { + Label l; + section.set_endianness(kBigEndian); + section.Append(1, 0x2a); + section.D8(l); + l = 0xeeU; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0x2a, 0xee)); +} + +TEST_F(Append, D16Big) { + section.set_endianness(kBigEndian); + section.Append(1, 0x2a); + section.D16(0x83b1U); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x2a, 0x83, 0xb1)); +} + +TEST_F(Append, D16BigLabel) { + Label l; + section.set_endianness(kBigEndian); + section.Append(1, 0x2a); + section.D16(l); + l = 0x5b55U; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x2a, 0x5b, 0x55)); +} + +TEST_F(Append, D32Big) { + section.set_endianness(kBigEndian); + section.Append(1, 0x2a); + section.D32(0xd0b0e431U); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0x2a, 0xd0, 0xb0, 0xe4, 0x31)); +} + +TEST_F(Append, D32BigLabel) { + Label l; + section.set_endianness(kBigEndian); + section.Append(1, 0x2a); + section.D32(l); + l = 0x312fb340U; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0x2a, 0x31, 0x2f, 0xb3, 0x40)); +} + +TEST_F(Append, D64Big) { + section.set_endianness(kBigEndian); + section.Append(1, 0x2a); + section.D64(0xb109843500dbcb16ULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, + I9(0x2a, 0xb1, 0x09, 0x84, 0x35, 0x00, 0xdb, 0xcb, 0x16)); +} + +TEST_F(Append, D64BigLabel) { + Label l; + section.set_endianness(kBigEndian); + section.Append(1, 0x2a); + section.D64(l); + l = 0x9a0d61b70f671fd7ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, + I9(0x2a, 0x9a, 0x0d, 0x61, 0xb7, 0x0f, 0x67, 0x1f, 0xd7)); +} + +TEST_F(Append, D8Little) { + section.set_endianness(kLittleEndian); + section.Append(1, 0x2a); + section.D8(0x42U); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0x2a, 0x42)); +} + +TEST_F(Append, D8LittleLabel) { + Label l; + section.set_endianness(kLittleEndian); + section.Append(1, 0x2a); + section.D8(l); + l = 0x05U; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I2(0x2a, 0x05)); +} + +TEST_F(Append, D16Little) { + section.set_endianness(kLittleEndian); + section.Append(1, 0x2a); + section.D16(0xc5c5U); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x2a, 0xc5, 0xc5)); +} + +TEST_F(Append, D16LittleLabel) { + Label l; + section.set_endianness(kLittleEndian); + section.Append(1, 0x2a); + section.D16(l); + l = 0xb620U; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I3(0x2a, 0x20, 0xb6)); +} + +TEST_F(Append, D32Little) { + section.set_endianness(kLittleEndian); + section.Append(1, 0x2a); + section.D32(0x1a87d0feU); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0x2a, 0xfe, 0xd0, 0x87, 0x1a)); +} + +TEST_F(Append, D32LittleLabel) { + Label l; + section.set_endianness(kLittleEndian); + section.Append(1, 0x2a); + section.D32(l); + l = 0xb8012d6bU; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I5(0x2a, 0x6b, 0x2d, 0x01, 0xb8)); +} + +TEST_F(Append, D64Little) { + section.set_endianness(kLittleEndian); + section.Append(1, 0x2a); + section.D64(0x42de75c61375a1deULL); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, + I9(0x2a, 0xde, 0xa1, 0x75, 0x13, 0xc6, 0x75, 0xde, 0x42)); +} + +TEST_F(Append, D64LittleLabel) { + Label l; + section.set_endianness(kLittleEndian); + section.Append(1, 0x2a); + section.D64(l); + l = 0x8b3bececf3fb5312ULL; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, + I9(0x2a, 0x12, 0x53, 0xfb, 0xf3, 0xec, 0xec, 0x3b, 0x8b)); +} + +TEST_F(Append, Variety) { + Label a, b, c, d, e, f, g, h; + section.Append(kBigEndian, 1, a) + .Append(kLittleEndian, 8, h) + .Append(kBigEndian, 1, 0x8bULL) + .Append(kLittleEndian, 8, 0x0ea56540448f4439ULL) + .Append(kBigEndian, 2, b) + .Append(kLittleEndian, 7, g) + .Append(kBigEndian, 2, 0xcf15ULL) + .Append(kLittleEndian, 7, 0x29694f04c5724aULL) + .Append(kBigEndian, 3, c) + .Append(kLittleEndian, 6, f) + .Append(kBigEndian, 3, 0x8c3ffdULL) + .Append(kLittleEndian, 6, 0x6f11ba80187aULL) + .Append(kBigEndian, 4, d) + .Append(kLittleEndian, 5, e) + .Append(kBigEndian, 4, 0x2fda2472ULL) + .Append(kLittleEndian, 5, 0x0aa02d423fULL) + .Append(kBigEndian, 5, e) + .Append(kLittleEndian, 4, d) + .Append(kBigEndian, 5, 0x53ba432138ULL) + .Append(kLittleEndian, 4, 0xf139ae60ULL) + .Append(kBigEndian, 6, f) + .Append(kLittleEndian, 3, c) + .Append(kBigEndian, 6, 0x168e436af716ULL) + .Append(kLittleEndian, 3, 0x3ef189ULL) + .Append(kBigEndian, 7, g) + .Append(kLittleEndian, 2, b) + .Append(kBigEndian, 7, 0xacd4ef233e47d9ULL) + .Append(kLittleEndian, 2, 0x5311ULL) + .Append(kBigEndian, 8, h) + .Append(kLittleEndian, 1, a) + .Append(kBigEndian, 8, 0x4668d5f1c93637a1ULL) + .Append(kLittleEndian, 1, 0x65ULL); + a = 0x79ac9bd8aa256b35ULL; + b = 0x22d13097ef86c91cULL; + c = 0xf204968b0a05862fULL; + d = 0x163177f15a0eb4ecULL; + e = 0xbd1b0f1d977f2246ULL; + f = 0x2b0842eee83c6461ULL; + g = 0x92f4b928a4bf875eULL; + h = 0x61a199a8f7286ba6ULL; + ASSERT_EQ(8 * 18U, section.Size()); + ASSERT_TRUE(section.GetContents(&contents)); + + static const uint8_t expected[] = { + 0x35, 0xa6, 0x6b, 0x28, 0xf7, 0xa8, 0x99, 0xa1, 0x61, + 0x8b, 0x39, 0x44, 0x8f, 0x44, 0x40, 0x65, 0xa5, 0x0e, + 0xc9, 0x1c, 0x5e, 0x87, 0xbf, 0xa4, 0x28, 0xb9, 0xf4, + 0xcf, 0x15, 0x4a, 0x72, 0xc5, 0x04, 0x4f, 0x69, 0x29, + 0x05, 0x86, 0x2f, 0x61, 0x64, 0x3c, 0xe8, 0xee, 0x42, + 0x8c, 0x3f, 0xfd, 0x7a, 0x18, 0x80, 0xba, 0x11, 0x6f, + 0x5a, 0x0e, 0xb4, 0xec, 0x46, 0x22, 0x7f, 0x97, 0x1d, + 0x2f, 0xda, 0x24, 0x72, 0x3f, 0x42, 0x2d, 0xa0, 0x0a, + 0x1d, 0x97, 0x7f, 0x22, 0x46, 0xec, 0xb4, 0x0e, 0x5a, + 0x53, 0xba, 0x43, 0x21, 0x38, 0x60, 0xae, 0x39, 0xf1, + 0x42, 0xee, 0xe8, 0x3c, 0x64, 0x61, 0x2f, 0x86, 0x05, + 0x16, 0x8e, 0x43, 0x6a, 0xf7, 0x16, 0x89, 0xf1, 0x3e, + 0xf4, 0xb9, 0x28, 0xa4, 0xbf, 0x87, 0x5e, 0x1c, 0xc9, + 0xac, 0xd4, 0xef, 0x23, 0x3e, 0x47, 0xd9, 0x11, 0x53, + 0x61, 0xa1, 0x99, 0xa8, 0xf7, 0x28, 0x6b, 0xa6, 0x35, + 0x46, 0x68, 0xd5, 0xf1, 0xc9, 0x36, 0x37, 0xa1, 0x65, + }; + + ASSERT_TRUE(0 == memcmp(contents.data(), expected, sizeof(expected))); +} + +TEST_F(Append, Section) { + section.Append("murder"); + { + Section middle; + middle.Append(" she"); + section.Append(middle); + } + section.Append(" wrote"); + EXPECT_EQ(16U, section.Size()); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_STREQ(contents.c_str(), "murder she wrote"); +} + +TEST_F(Append, SectionRefs) { + section.Append("sugar "); + Label l; + { + Section middle; + Label m; + middle.B32(m); + section.Append(middle); + m = 0x66726565; + } + section.Append(" jazz"); + EXPECT_EQ(15U, section.Size()); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_STREQ(contents.c_str(), "sugar free jazz"); +} + +TEST_F(Append, LEB128_0) { + section.LEB128(0); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\0", 1), contents); +} + +TEST_F(Append, LEB128_0x3f) { + section.LEB128(0x3f); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x3f", 1), contents); +} + +TEST_F(Append, LEB128_0x40) { + section.LEB128(0x40); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\xc0\x00", 2), contents); +} + +TEST_F(Append, LEB128_0x7f) { + section.LEB128(0x7f); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\xff\x00", 2), contents); +} + +TEST_F(Append, LEB128_0x80) { + section.LEB128(0x80); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x80\x01", 2), contents); +} + +TEST_F(Append, LEB128_0xff) { + section.LEB128(0xff); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\xff\x01", 2), contents); +} + +TEST_F(Append, LEB128_0x1fff) { + section.LEB128(0x1fff); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\xff\x3f", 2), contents); +} + +TEST_F(Append, LEB128_0x2000) { + section.LEB128(0x2000); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x80\xc0\x00", 3), contents); +} + +TEST_F(Append, LEB128_n1) { + section.LEB128(-1); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x7f", 1), contents); +} + +TEST_F(Append, LEB128_n0x40) { + section.LEB128(-0x40); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x40", 1), contents); +} + +TEST_F(Append, LEB128_n0x41) { + section.LEB128(-0x41); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\xbf\x7f", 2), contents); +} + +TEST_F(Append, LEB128_n0x7f) { + section.LEB128(-0x7f); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x81\x7f", 2), contents); +} + +TEST_F(Append, LEB128_n0x80) { + section.LEB128(-0x80); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x80\x7f", 2), contents); +} + +TEST_F(Append, LEB128_n0x2000) { + section.LEB128(-0x2000); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x80\x40", 2), contents); +} + +TEST_F(Append, LEB128_n0x2001) { + section.LEB128(-0x2001); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\xff\xbf\x7f", 3), contents); +} + +TEST_F(Append,ULEB128_0) { + section.ULEB128(0); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\0", 1), contents); +} + +TEST_F(Append,ULEB128_1) { + section.ULEB128(1); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x01", 1), contents); +} + +TEST_F(Append,ULEB128_0x3f) { + section.ULEB128(0x3f); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x3f", 1), contents); +} + +TEST_F(Append,ULEB128_0x40) { + section.ULEB128(0x40); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x40", 1), contents); +} + +TEST_F(Append,ULEB128_0x7f) { + section.ULEB128(0x7f); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x7f", 1), contents); +} + +TEST_F(Append,ULEB128_0x80) { + section.ULEB128(0x80); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x80\x01", 2), contents); +} + +TEST_F(Append,ULEB128_0xff) { + section.ULEB128(0xff); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\xff\x01", 2), contents); +} + +TEST_F(Append,ULEB128_0x100) { + section.ULEB128(0x100); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x80\x02", 2), contents); +} + +TEST_F(Append,ULEB128_0x1fff) { + section.ULEB128(0x1fff); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\xff\x3f", 2), contents); +} + +TEST_F(Append,ULEB128_0x2000) { + section.ULEB128(0x2000); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x80\x40", 2), contents); +} + +TEST_F(Append,ULEB128_0x3fff) { + section.ULEB128(0x3fff); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\xff\x7f", 2), contents); +} + +TEST_F(Append,ULEB128_0x4000) { + section.ULEB128(0x4000); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x80\x80\x01", 3), contents); +} + +TEST_F(Append,ULEB128_12857) { + section.ULEB128(12857); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\xb9\x64", 2), contents); +} + +TEST_F(Append, LEBChain) { + section.LEB128(-0x80).ULEB128(12857).Append("*"); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x80\x7f\xb9\x64*", 5), contents); +} + + +class GetContents: public SectionFixture, public Test { }; + +TEST_F(GetContents, Undefined) { + Label l; + section.Append(kLittleEndian, 8, l); + ASSERT_FALSE(section.GetContents(&contents)); +} + +TEST_F(GetContents, ClearsContents) { + section.Append((size_t) 10, '*'); + EXPECT_EQ(10U, section.Size()); + EXPECT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(0U, section.Size()); +} + +TEST_F(GetContents, ClearsReferences) { + Label l; + section.Append(kBigEndian, 1, l); + l = 42; + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_BYTES(contents, I1(42)); + ASSERT_TRUE(section.GetContents(&contents)); // should not die +} + +class Miscellanea: public SectionFixture, public Test { }; + +TEST_F(Miscellanea, Clear) { + section.Append("howdy"); + Label l; + section.L32(l); + EXPECT_EQ(9U, section.Size()); + section.Clear(); + EXPECT_EQ(0U, section.Size()); + l = 0x8d231bf0U; + ASSERT_TRUE(section.GetContents(&contents)); // should not die +} + +TEST_F(Miscellanea, Align) { + section.Append("*"); + EXPECT_EQ(1U, section.Size()); + section.Align(4).Append("*"); + EXPECT_EQ(5U, section.Size()); + section.Append("*").Align(2); + EXPECT_EQ(6U, section.Size()); +} + +TEST_F(Miscellanea, AlignPad) { + section.Append("*"); + EXPECT_EQ(1U, section.Size()); + section.Align(4, ' ').Append("*"); + EXPECT_EQ(5U, section.Size()); + section.Append("*").Align(2, ' '); + EXPECT_EQ(6U, section.Size()); + ASSERT_TRUE(section.GetContents(&contents)); + ASSERT_EQ(string("* **"), contents); +} + +TEST_F(Miscellanea, StartHereMark) { + Label m; + section.Append(42, ' ').Mark(&m).Append(13, '+'); + EXPECT_EQ(42U, m - section.start()); + EXPECT_EQ(42U + 13U, section.Here() - section.start()); + EXPECT_FALSE(section.start().IsKnownConstant()); + EXPECT_FALSE(m.IsKnownConstant()); + EXPECT_FALSE(section.Here().IsKnownConstant()); +} + +TEST_F(Miscellanea, Endianness) { + section.set_endianness(kBigEndian); + EXPECT_EQ(kBigEndian, section.endianness()); + section.set_endianness(kLittleEndian); + EXPECT_EQ(kLittleEndian, section.endianness()); +} diff --git a/src/common/testdata/func-line-pairing.h b/src/common/testdata/func-line-pairing.h new file mode 100644 index 0000000..05538f9 --- /dev/null +++ b/src/common/testdata/func-line-pairing.h @@ -0,0 +1,676 @@ +// -*- mode: c++ -*- + +// Test data for pairing functions and lines. +// +// For a pair of functions that are adjacent (10,20),(20,25) and a +// pair that are not (10,15),(20,25), we include a test case for every +// possible arrangement of two lines relative to those functions. We +// include cases only for non-empty ranges, since empty functions and +// lines are dropped before we do any pairing. +// +// Each test case is represented by a macro call of the form: +// +// PAIRING(func1_start, func1_end, func2_start, func2_end, +// line1_start, line1_end, line2_start, line2_end, +// func1_num_lines, func2_num_lines, +// func1_line1_start, func1_line1_end, +// func1_line2_start, func1_line2_end, +// func2_line1_start, func2_line1_end, +// func2_line2_start, func2_line2_end, +// uncovered_funcs, uncovered_lines) +// +// where: +// - funcN_{start,end} is the range of the N'th function +// - lineN_{start,end} is the range of the N'th function +// - funcN_num_lines is the number of source lines that should be +// paired with the N'th function +// - funcN_lineM_{start,end} is the range of the M'th line +// paired with the N'th function, where 0,0 indicates that +// there should be no such line paired +// - uncovered_funcs is the number of functions with area that is +// uncovered by any line, and +// - uncovered_lines is the reverse. + +// func1 func2 line1 line2 num pairing1 pairing2 uncovered +PAIRING(10, 20, 20, 25, 6, 7, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #0 +PAIRING(10, 20, 20, 25, 6, 7, 7, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #1 +PAIRING(10, 20, 20, 25, 6, 7, 7, 11, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #2 +PAIRING(10, 20, 20, 25, 6, 7, 7, 20, 1, 0, 10, 20, 0, 0, 0, 0, 0, 0, 1, 2) // #3 +PAIRING(10, 20, 20, 25, 6, 7, 7, 21, 1, 1, 10, 20, 0, 0, 20, 21, 0, 0, 1, 2) // #4 +PAIRING(10, 20, 20, 25, 6, 7, 7, 25, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #5 +PAIRING(10, 20, 20, 25, 6, 7, 7, 26, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #6 +PAIRING(10, 20, 20, 25, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #7 +PAIRING(10, 20, 20, 25, 6, 7, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #8 +PAIRING(10, 20, 20, 25, 6, 7, 8, 11, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #9 +PAIRING(10, 20, 20, 25, 6, 7, 8, 20, 1, 0, 10, 20, 0, 0, 0, 0, 0, 0, 1, 2) // #10 +PAIRING(10, 20, 20, 25, 6, 7, 8, 21, 1, 1, 10, 20, 0, 0, 20, 21, 0, 0, 1, 2) // #11 +PAIRING(10, 20, 20, 25, 6, 7, 8, 25, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #12 +PAIRING(10, 20, 20, 25, 6, 7, 8, 26, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #13 +PAIRING(10, 20, 20, 25, 6, 7, 10, 11, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #14 +PAIRING(10, 20, 20, 25, 6, 7, 10, 20, 1, 0, 10, 20, 0, 0, 0, 0, 0, 0, 1, 1) // #15 +PAIRING(10, 20, 20, 25, 6, 7, 10, 21, 1, 1, 10, 20, 0, 0, 20, 21, 0, 0, 1, 1) // #16 +PAIRING(10, 20, 20, 25, 6, 7, 10, 25, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 1) // #17 +PAIRING(10, 20, 20, 25, 6, 7, 10, 26, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #18 +PAIRING(10, 20, 20, 25, 6, 7, 11, 12, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #19 +PAIRING(10, 20, 20, 25, 6, 7, 11, 20, 1, 0, 11, 20, 0, 0, 0, 0, 0, 0, 2, 1) // #20 +PAIRING(10, 20, 20, 25, 6, 7, 11, 21, 1, 1, 11, 20, 0, 0, 20, 21, 0, 0, 2, 1) // #21 +PAIRING(10, 20, 20, 25, 6, 7, 11, 25, 1, 1, 11, 20, 0, 0, 20, 25, 0, 0, 1, 1) // #22 +PAIRING(10, 20, 20, 25, 6, 7, 11, 26, 1, 1, 11, 20, 0, 0, 20, 25, 0, 0, 1, 2) // #23 +PAIRING(10, 20, 20, 25, 6, 7, 20, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #24 +PAIRING(10, 20, 20, 25, 6, 7, 20, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #25 +PAIRING(10, 20, 20, 25, 6, 7, 20, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #26 +PAIRING(10, 20, 20, 25, 6, 7, 21, 22, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #27 +PAIRING(10, 20, 20, 25, 6, 7, 21, 25, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #28 +PAIRING(10, 20, 20, 25, 6, 7, 21, 26, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #29 +PAIRING(10, 20, 20, 25, 6, 7, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #30 +PAIRING(10, 20, 20, 25, 6, 7, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #31 +PAIRING(10, 20, 20, 25, 6, 10, 10, 11, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #32 +PAIRING(10, 20, 20, 25, 6, 10, 10, 20, 1, 0, 10, 20, 0, 0, 0, 0, 0, 0, 1, 1) // #33 +PAIRING(10, 20, 20, 25, 6, 10, 10, 21, 1, 1, 10, 20, 0, 0, 20, 21, 0, 0, 1, 1) // #34 +PAIRING(10, 20, 20, 25, 6, 10, 10, 25, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 1) // #35 +PAIRING(10, 20, 20, 25, 6, 10, 10, 26, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #36 +PAIRING(10, 20, 20, 25, 6, 10, 11, 12, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #37 +PAIRING(10, 20, 20, 25, 6, 10, 11, 20, 1, 0, 11, 20, 0, 0, 0, 0, 0, 0, 2, 1) // #38 +PAIRING(10, 20, 20, 25, 6, 10, 11, 21, 1, 1, 11, 20, 0, 0, 20, 21, 0, 0, 2, 1) // #39 +PAIRING(10, 20, 20, 25, 6, 10, 11, 25, 1, 1, 11, 20, 0, 0, 20, 25, 0, 0, 1, 1) // #40 +PAIRING(10, 20, 20, 25, 6, 10, 11, 26, 1, 1, 11, 20, 0, 0, 20, 25, 0, 0, 1, 2) // #41 +PAIRING(10, 20, 20, 25, 6, 10, 20, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #42 +PAIRING(10, 20, 20, 25, 6, 10, 20, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #43 +PAIRING(10, 20, 20, 25, 6, 10, 20, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #44 +PAIRING(10, 20, 20, 25, 6, 10, 21, 22, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #45 +PAIRING(10, 20, 20, 25, 6, 10, 21, 25, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #46 +PAIRING(10, 20, 20, 25, 6, 10, 21, 26, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #47 +PAIRING(10, 20, 20, 25, 6, 10, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #48 +PAIRING(10, 20, 20, 25, 6, 10, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #49 +PAIRING(10, 20, 20, 25, 6, 11, 11, 12, 2, 0, 10, 11, 11, 12, 0, 0, 0, 0, 2, 1) // #50 +PAIRING(10, 20, 20, 25, 6, 11, 11, 20, 2, 0, 10, 11, 11, 20, 0, 0, 0, 0, 1, 1) // #51 +PAIRING(10, 20, 20, 25, 6, 11, 11, 21, 2, 1, 10, 11, 11, 20, 20, 21, 0, 0, 1, 1) // #52 +PAIRING(10, 20, 20, 25, 6, 11, 11, 25, 2, 1, 10, 11, 11, 20, 20, 25, 0, 0, 0, 1) // #53 +PAIRING(10, 20, 20, 25, 6, 11, 11, 26, 2, 1, 10, 11, 11, 20, 20, 25, 0, 0, 0, 2) // #54 +PAIRING(10, 20, 20, 25, 6, 11, 12, 13, 2, 0, 10, 11, 12, 13, 0, 0, 0, 0, 2, 1) // #55 +PAIRING(10, 20, 20, 25, 6, 11, 12, 20, 2, 0, 10, 11, 12, 20, 0, 0, 0, 0, 2, 1) // #56 +PAIRING(10, 20, 20, 25, 6, 11, 12, 21, 2, 1, 10, 11, 12, 20, 20, 21, 0, 0, 2, 1) // #57 +PAIRING(10, 20, 20, 25, 6, 11, 12, 25, 2, 1, 10, 11, 12, 20, 20, 25, 0, 0, 1, 1) // #58 +PAIRING(10, 20, 20, 25, 6, 11, 12, 26, 2, 1, 10, 11, 12, 20, 20, 25, 0, 0, 1, 2) // #59 +PAIRING(10, 20, 20, 25, 6, 11, 20, 21, 1, 1, 10, 11, 0, 0, 20, 21, 0, 0, 2, 1) // #60 +PAIRING(10, 20, 20, 25, 6, 11, 20, 25, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 1) // #61 +PAIRING(10, 20, 20, 25, 6, 11, 20, 26, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 2) // #62 +PAIRING(10, 20, 20, 25, 6, 11, 21, 22, 1, 1, 10, 11, 0, 0, 21, 22, 0, 0, 2, 1) // #63 +PAIRING(10, 20, 20, 25, 6, 11, 21, 25, 1, 1, 10, 11, 0, 0, 21, 25, 0, 0, 2, 1) // #64 +PAIRING(10, 20, 20, 25, 6, 11, 21, 26, 1, 1, 10, 11, 0, 0, 21, 25, 0, 0, 2, 2) // #65 +PAIRING(10, 20, 20, 25, 6, 11, 25, 26, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #66 +PAIRING(10, 20, 20, 25, 6, 11, 26, 27, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #67 +PAIRING(10, 20, 20, 25, 6, 20, 20, 21, 1, 1, 10, 20, 0, 0, 20, 21, 0, 0, 1, 1) // #68 +PAIRING(10, 20, 20, 25, 6, 20, 20, 25, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 1) // #69 +PAIRING(10, 20, 20, 25, 6, 20, 20, 26, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #70 +PAIRING(10, 20, 20, 25, 6, 20, 21, 22, 1, 1, 10, 20, 0, 0, 21, 22, 0, 0, 1, 1) // #71 +PAIRING(10, 20, 20, 25, 6, 20, 21, 25, 1, 1, 10, 20, 0, 0, 21, 25, 0, 0, 1, 1) // #72 +PAIRING(10, 20, 20, 25, 6, 20, 21, 26, 1, 1, 10, 20, 0, 0, 21, 25, 0, 0, 1, 2) // #73 +PAIRING(10, 20, 20, 25, 6, 20, 25, 26, 1, 0, 10, 20, 0, 0, 0, 0, 0, 0, 1, 2) // #74 +PAIRING(10, 20, 20, 25, 6, 20, 26, 27, 1, 0, 10, 20, 0, 0, 0, 0, 0, 0, 1, 2) // #75 +PAIRING(10, 20, 20, 25, 6, 21, 21, 22, 1, 2, 10, 20, 0, 0, 20, 21, 21, 22, 1, 1) // #76 +PAIRING(10, 20, 20, 25, 6, 21, 21, 25, 1, 2, 10, 20, 0, 0, 20, 21, 21, 25, 0, 1) // #77 +PAIRING(10, 20, 20, 25, 6, 21, 21, 26, 1, 2, 10, 20, 0, 0, 20, 21, 21, 25, 0, 2) // #78 +PAIRING(10, 20, 20, 25, 6, 21, 22, 23, 1, 2, 10, 20, 0, 0, 20, 21, 22, 23, 1, 1) // #79 +PAIRING(10, 20, 20, 25, 6, 21, 22, 25, 1, 2, 10, 20, 0, 0, 20, 21, 22, 25, 1, 1) // #80 +PAIRING(10, 20, 20, 25, 6, 21, 22, 26, 1, 2, 10, 20, 0, 0, 20, 21, 22, 25, 1, 2) // #81 +PAIRING(10, 20, 20, 25, 6, 21, 25, 26, 1, 1, 10, 20, 0, 0, 20, 21, 0, 0, 1, 2) // #82 +PAIRING(10, 20, 20, 25, 6, 21, 26, 27, 1, 1, 10, 20, 0, 0, 20, 21, 0, 0, 1, 2) // #83 +PAIRING(10, 20, 20, 25, 6, 25, 25, 26, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #84 +PAIRING(10, 20, 20, 25, 6, 25, 26, 27, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #85 +PAIRING(10, 20, 20, 25, 6, 26, 26, 27, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #86 +PAIRING(10, 20, 20, 25, 6, 26, 27, 28, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #87 +PAIRING(10, 20, 20, 25, 10, 11, 11, 12, 2, 0, 10, 11, 11, 12, 0, 0, 0, 0, 2, 0) // #88 +PAIRING(10, 20, 20, 25, 10, 11, 11, 20, 2, 0, 10, 11, 11, 20, 0, 0, 0, 0, 1, 0) // #89 +PAIRING(10, 20, 20, 25, 10, 11, 11, 21, 2, 1, 10, 11, 11, 20, 20, 21, 0, 0, 1, 0) // #90 +PAIRING(10, 20, 20, 25, 10, 11, 11, 25, 2, 1, 10, 11, 11, 20, 20, 25, 0, 0, 0, 0) // #91 +PAIRING(10, 20, 20, 25, 10, 11, 11, 26, 2, 1, 10, 11, 11, 20, 20, 25, 0, 0, 0, 1) // #92 +PAIRING(10, 20, 20, 25, 10, 11, 12, 13, 2, 0, 10, 11, 12, 13, 0, 0, 0, 0, 2, 0) // #93 +PAIRING(10, 20, 20, 25, 10, 11, 12, 20, 2, 0, 10, 11, 12, 20, 0, 0, 0, 0, 2, 0) // #94 +PAIRING(10, 20, 20, 25, 10, 11, 12, 21, 2, 1, 10, 11, 12, 20, 20, 21, 0, 0, 2, 0) // #95 +PAIRING(10, 20, 20, 25, 10, 11, 12, 25, 2, 1, 10, 11, 12, 20, 20, 25, 0, 0, 1, 0) // #96 +PAIRING(10, 20, 20, 25, 10, 11, 12, 26, 2, 1, 10, 11, 12, 20, 20, 25, 0, 0, 1, 1) // #97 +PAIRING(10, 20, 20, 25, 10, 11, 20, 21, 1, 1, 10, 11, 0, 0, 20, 21, 0, 0, 2, 0) // #98 +PAIRING(10, 20, 20, 25, 10, 11, 20, 25, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 0) // #99 +PAIRING(10, 20, 20, 25, 10, 11, 20, 26, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 1) // #100 +PAIRING(10, 20, 20, 25, 10, 11, 21, 22, 1, 1, 10, 11, 0, 0, 21, 22, 0, 0, 2, 0) // #101 +PAIRING(10, 20, 20, 25, 10, 11, 21, 25, 1, 1, 10, 11, 0, 0, 21, 25, 0, 0, 2, 0) // #102 +PAIRING(10, 20, 20, 25, 10, 11, 21, 26, 1, 1, 10, 11, 0, 0, 21, 25, 0, 0, 2, 1) // #103 +PAIRING(10, 20, 20, 25, 10, 11, 25, 26, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #104 +PAIRING(10, 20, 20, 25, 10, 11, 26, 27, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #105 +PAIRING(10, 20, 20, 25, 10, 20, 20, 21, 1, 1, 10, 20, 0, 0, 20, 21, 0, 0, 1, 0) // #106 +PAIRING(10, 20, 20, 25, 10, 20, 20, 25, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 0) // #107 +PAIRING(10, 20, 20, 25, 10, 20, 20, 26, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 1) // #108 +PAIRING(10, 20, 20, 25, 10, 20, 21, 22, 1, 1, 10, 20, 0, 0, 21, 22, 0, 0, 1, 0) // #109 +PAIRING(10, 20, 20, 25, 10, 20, 21, 25, 1, 1, 10, 20, 0, 0, 21, 25, 0, 0, 1, 0) // #110 +PAIRING(10, 20, 20, 25, 10, 20, 21, 26, 1, 1, 10, 20, 0, 0, 21, 25, 0, 0, 1, 1) // #111 +PAIRING(10, 20, 20, 25, 10, 20, 25, 26, 1, 0, 10, 20, 0, 0, 0, 0, 0, 0, 1, 1) // #112 +PAIRING(10, 20, 20, 25, 10, 20, 26, 27, 1, 0, 10, 20, 0, 0, 0, 0, 0, 0, 1, 1) // #113 +PAIRING(10, 20, 20, 25, 10, 21, 21, 22, 1, 2, 10, 20, 0, 0, 20, 21, 21, 22, 1, 0) // #114 +PAIRING(10, 20, 20, 25, 10, 21, 21, 25, 1, 2, 10, 20, 0, 0, 20, 21, 21, 25, 0, 0) // #115 +PAIRING(10, 20, 20, 25, 10, 21, 21, 26, 1, 2, 10, 20, 0, 0, 20, 21, 21, 25, 0, 1) // #116 +PAIRING(10, 20, 20, 25, 10, 21, 22, 23, 1, 2, 10, 20, 0, 0, 20, 21, 22, 23, 1, 0) // #117 +PAIRING(10, 20, 20, 25, 10, 21, 22, 25, 1, 2, 10, 20, 0, 0, 20, 21, 22, 25, 1, 0) // #118 +PAIRING(10, 20, 20, 25, 10, 21, 22, 26, 1, 2, 10, 20, 0, 0, 20, 21, 22, 25, 1, 1) // #119 +PAIRING(10, 20, 20, 25, 10, 21, 25, 26, 1, 1, 10, 20, 0, 0, 20, 21, 0, 0, 1, 1) // #120 +PAIRING(10, 20, 20, 25, 10, 21, 26, 27, 1, 1, 10, 20, 0, 0, 20, 21, 0, 0, 1, 1) // #121 +PAIRING(10, 20, 20, 25, 10, 25, 25, 26, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 1) // #122 +PAIRING(10, 20, 20, 25, 10, 25, 26, 27, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 1) // #123 +PAIRING(10, 20, 20, 25, 10, 26, 26, 27, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #124 +PAIRING(10, 20, 20, 25, 10, 26, 27, 28, 1, 1, 10, 20, 0, 0, 20, 25, 0, 0, 0, 2) // #125 +PAIRING(10, 20, 20, 25, 11, 12, 12, 13, 2, 0, 11, 12, 12, 13, 0, 0, 0, 0, 2, 0) // #126 +PAIRING(10, 20, 20, 25, 11, 12, 12, 20, 2, 0, 11, 12, 12, 20, 0, 0, 0, 0, 2, 0) // #127 +PAIRING(10, 20, 20, 25, 11, 12, 12, 21, 2, 1, 11, 12, 12, 20, 20, 21, 0, 0, 2, 0) // #128 +PAIRING(10, 20, 20, 25, 11, 12, 12, 25, 2, 1, 11, 12, 12, 20, 20, 25, 0, 0, 1, 0) // #129 +PAIRING(10, 20, 20, 25, 11, 12, 12, 26, 2, 1, 11, 12, 12, 20, 20, 25, 0, 0, 1, 1) // #130 +PAIRING(10, 20, 20, 25, 11, 12, 13, 14, 2, 0, 11, 12, 13, 14, 0, 0, 0, 0, 2, 0) // #131 +PAIRING(10, 20, 20, 25, 11, 12, 13, 20, 2, 0, 11, 12, 13, 20, 0, 0, 0, 0, 2, 0) // #132 +PAIRING(10, 20, 20, 25, 11, 12, 13, 21, 2, 1, 11, 12, 13, 20, 20, 21, 0, 0, 2, 0) // #133 +PAIRING(10, 20, 20, 25, 11, 12, 13, 25, 2, 1, 11, 12, 13, 20, 20, 25, 0, 0, 1, 0) // #134 +PAIRING(10, 20, 20, 25, 11, 12, 13, 26, 2, 1, 11, 12, 13, 20, 20, 25, 0, 0, 1, 1) // #135 +PAIRING(10, 20, 20, 25, 11, 12, 20, 21, 1, 1, 11, 12, 0, 0, 20, 21, 0, 0, 2, 0) // #136 +PAIRING(10, 20, 20, 25, 11, 12, 20, 25, 1, 1, 11, 12, 0, 0, 20, 25, 0, 0, 1, 0) // #137 +PAIRING(10, 20, 20, 25, 11, 12, 20, 26, 1, 1, 11, 12, 0, 0, 20, 25, 0, 0, 1, 1) // #138 +PAIRING(10, 20, 20, 25, 11, 12, 21, 22, 1, 1, 11, 12, 0, 0, 21, 22, 0, 0, 2, 0) // #139 +PAIRING(10, 20, 20, 25, 11, 12, 21, 25, 1, 1, 11, 12, 0, 0, 21, 25, 0, 0, 2, 0) // #140 +PAIRING(10, 20, 20, 25, 11, 12, 21, 26, 1, 1, 11, 12, 0, 0, 21, 25, 0, 0, 2, 1) // #141 +PAIRING(10, 20, 20, 25, 11, 12, 25, 26, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #142 +PAIRING(10, 20, 20, 25, 11, 12, 26, 27, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #143 +PAIRING(10, 20, 20, 25, 11, 20, 20, 21, 1, 1, 11, 20, 0, 0, 20, 21, 0, 0, 2, 0) // #144 +PAIRING(10, 20, 20, 25, 11, 20, 20, 25, 1, 1, 11, 20, 0, 0, 20, 25, 0, 0, 1, 0) // #145 +PAIRING(10, 20, 20, 25, 11, 20, 20, 26, 1, 1, 11, 20, 0, 0, 20, 25, 0, 0, 1, 1) // #146 +PAIRING(10, 20, 20, 25, 11, 20, 21, 22, 1, 1, 11, 20, 0, 0, 21, 22, 0, 0, 2, 0) // #147 +PAIRING(10, 20, 20, 25, 11, 20, 21, 25, 1, 1, 11, 20, 0, 0, 21, 25, 0, 0, 2, 0) // #148 +PAIRING(10, 20, 20, 25, 11, 20, 21, 26, 1, 1, 11, 20, 0, 0, 21, 25, 0, 0, 2, 1) // #149 +PAIRING(10, 20, 20, 25, 11, 20, 25, 26, 1, 0, 11, 20, 0, 0, 0, 0, 0, 0, 2, 1) // #150 +PAIRING(10, 20, 20, 25, 11, 20, 26, 27, 1, 0, 11, 20, 0, 0, 0, 0, 0, 0, 2, 1) // #151 +PAIRING(10, 20, 20, 25, 11, 21, 21, 22, 1, 2, 11, 20, 0, 0, 20, 21, 21, 22, 2, 0) // #152 +PAIRING(10, 20, 20, 25, 11, 21, 21, 25, 1, 2, 11, 20, 0, 0, 20, 21, 21, 25, 1, 0) // #153 +PAIRING(10, 20, 20, 25, 11, 21, 21, 26, 1, 2, 11, 20, 0, 0, 20, 21, 21, 25, 1, 1) // #154 +PAIRING(10, 20, 20, 25, 11, 21, 22, 23, 1, 2, 11, 20, 0, 0, 20, 21, 22, 23, 2, 0) // #155 +PAIRING(10, 20, 20, 25, 11, 21, 22, 25, 1, 2, 11, 20, 0, 0, 20, 21, 22, 25, 2, 0) // #156 +PAIRING(10, 20, 20, 25, 11, 21, 22, 26, 1, 2, 11, 20, 0, 0, 20, 21, 22, 25, 2, 1) // #157 +PAIRING(10, 20, 20, 25, 11, 21, 25, 26, 1, 1, 11, 20, 0, 0, 20, 21, 0, 0, 2, 1) // #158 +PAIRING(10, 20, 20, 25, 11, 21, 26, 27, 1, 1, 11, 20, 0, 0, 20, 21, 0, 0, 2, 1) // #159 +PAIRING(10, 20, 20, 25, 11, 25, 25, 26, 1, 1, 11, 20, 0, 0, 20, 25, 0, 0, 1, 1) // #160 +PAIRING(10, 20, 20, 25, 11, 25, 26, 27, 1, 1, 11, 20, 0, 0, 20, 25, 0, 0, 1, 1) // #161 +PAIRING(10, 20, 20, 25, 11, 26, 26, 27, 1, 1, 11, 20, 0, 0, 20, 25, 0, 0, 1, 2) // #162 +PAIRING(10, 20, 20, 25, 11, 26, 27, 28, 1, 1, 11, 20, 0, 0, 20, 25, 0, 0, 1, 2) // #163 +PAIRING(10, 20, 20, 25, 20, 21, 21, 22, 0, 2, 0, 0, 0, 0, 20, 21, 21, 22, 2, 0) // #164 +PAIRING(10, 20, 20, 25, 20, 21, 21, 25, 0, 2, 0, 0, 0, 0, 20, 21, 21, 25, 1, 0) // #165 +PAIRING(10, 20, 20, 25, 20, 21, 21, 26, 0, 2, 0, 0, 0, 0, 20, 21, 21, 25, 1, 1) // #166 +PAIRING(10, 20, 20, 25, 20, 21, 22, 23, 0, 2, 0, 0, 0, 0, 20, 21, 22, 23, 2, 0) // #167 +PAIRING(10, 20, 20, 25, 20, 21, 22, 25, 0, 2, 0, 0, 0, 0, 20, 21, 22, 25, 2, 0) // #168 +PAIRING(10, 20, 20, 25, 20, 21, 22, 26, 0, 2, 0, 0, 0, 0, 20, 21, 22, 25, 2, 1) // #169 +PAIRING(10, 20, 20, 25, 20, 21, 25, 26, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #170 +PAIRING(10, 20, 20, 25, 20, 21, 26, 27, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #171 +PAIRING(10, 20, 20, 25, 20, 25, 25, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #172 +PAIRING(10, 20, 20, 25, 20, 25, 26, 27, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #173 +PAIRING(10, 20, 20, 25, 20, 26, 26, 27, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #174 +PAIRING(10, 20, 20, 25, 20, 26, 27, 28, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #175 +PAIRING(10, 20, 20, 25, 21, 22, 22, 23, 0, 2, 0, 0, 0, 0, 21, 22, 22, 23, 2, 0) // #176 +PAIRING(10, 20, 20, 25, 21, 22, 22, 25, 0, 2, 0, 0, 0, 0, 21, 22, 22, 25, 2, 0) // #177 +PAIRING(10, 20, 20, 25, 21, 22, 22, 26, 0, 2, 0, 0, 0, 0, 21, 22, 22, 25, 2, 1) // #178 +PAIRING(10, 20, 20, 25, 21, 22, 23, 24, 0, 2, 0, 0, 0, 0, 21, 22, 23, 24, 2, 0) // #179 +PAIRING(10, 20, 20, 25, 21, 22, 23, 25, 0, 2, 0, 0, 0, 0, 21, 22, 23, 25, 2, 0) // #180 +PAIRING(10, 20, 20, 25, 21, 22, 23, 26, 0, 2, 0, 0, 0, 0, 21, 22, 23, 25, 2, 1) // #181 +PAIRING(10, 20, 20, 25, 21, 22, 25, 26, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #182 +PAIRING(10, 20, 20, 25, 21, 22, 26, 27, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #183 +PAIRING(10, 20, 20, 25, 21, 25, 25, 26, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #184 +PAIRING(10, 20, 20, 25, 21, 25, 26, 27, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #185 +PAIRING(10, 20, 20, 25, 21, 26, 26, 27, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #186 +PAIRING(10, 20, 20, 25, 21, 26, 27, 28, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #187 +PAIRING(10, 20, 20, 25, 25, 26, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #188 +PAIRING(10, 20, 20, 25, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #189 +PAIRING(10, 20, 20, 25, 26, 27, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #190 +PAIRING(10, 20, 20, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #191 +PAIRING(10, 15, 20, 25, 6, 7, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #192 +PAIRING(10, 15, 20, 25, 6, 7, 7, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #193 +PAIRING(10, 15, 20, 25, 6, 7, 7, 11, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #194 +PAIRING(10, 15, 20, 25, 6, 7, 7, 15, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #195 +PAIRING(10, 15, 20, 25, 6, 7, 7, 16, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #196 +PAIRING(10, 15, 20, 25, 6, 7, 7, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #197 +PAIRING(10, 15, 20, 25, 6, 7, 7, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #198 +PAIRING(10, 15, 20, 25, 6, 7, 7, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #199 +PAIRING(10, 15, 20, 25, 6, 7, 7, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #200 +PAIRING(10, 15, 20, 25, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #201 +PAIRING(10, 15, 20, 25, 6, 7, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #202 +PAIRING(10, 15, 20, 25, 6, 7, 8, 11, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #203 +PAIRING(10, 15, 20, 25, 6, 7, 8, 15, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #204 +PAIRING(10, 15, 20, 25, 6, 7, 8, 16, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #205 +PAIRING(10, 15, 20, 25, 6, 7, 8, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #206 +PAIRING(10, 15, 20, 25, 6, 7, 8, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #207 +PAIRING(10, 15, 20, 25, 6, 7, 8, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #208 +PAIRING(10, 15, 20, 25, 6, 7, 8, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #209 +PAIRING(10, 15, 20, 25, 6, 7, 10, 11, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #210 +PAIRING(10, 15, 20, 25, 6, 7, 10, 15, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #211 +PAIRING(10, 15, 20, 25, 6, 7, 10, 16, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #212 +PAIRING(10, 15, 20, 25, 6, 7, 10, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #213 +PAIRING(10, 15, 20, 25, 6, 7, 10, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #214 +PAIRING(10, 15, 20, 25, 6, 7, 10, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #215 +PAIRING(10, 15, 20, 25, 6, 7, 10, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #216 +PAIRING(10, 15, 20, 25, 6, 7, 11, 12, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #217 +PAIRING(10, 15, 20, 25, 6, 7, 11, 15, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #218 +PAIRING(10, 15, 20, 25, 6, 7, 11, 16, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 2) // #219 +PAIRING(10, 15, 20, 25, 6, 7, 11, 20, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #220 +PAIRING(10, 15, 20, 25, 6, 7, 11, 21, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 2) // #221 +PAIRING(10, 15, 20, 25, 6, 7, 11, 25, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #222 +PAIRING(10, 15, 20, 25, 6, 7, 11, 26, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #223 +PAIRING(10, 15, 20, 25, 6, 7, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #224 +PAIRING(10, 15, 20, 25, 6, 7, 15, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #225 +PAIRING(10, 15, 20, 25, 6, 7, 15, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #226 +PAIRING(10, 15, 20, 25, 6, 7, 15, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #227 +PAIRING(10, 15, 20, 25, 6, 7, 15, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #228 +PAIRING(10, 15, 20, 25, 6, 7, 16, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #229 +PAIRING(10, 15, 20, 25, 6, 7, 16, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #230 +PAIRING(10, 15, 20, 25, 6, 7, 16, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #231 +PAIRING(10, 15, 20, 25, 6, 7, 16, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #232 +PAIRING(10, 15, 20, 25, 6, 7, 16, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #233 +PAIRING(10, 15, 20, 25, 6, 7, 20, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #234 +PAIRING(10, 15, 20, 25, 6, 7, 20, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #235 +PAIRING(10, 15, 20, 25, 6, 7, 20, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #236 +PAIRING(10, 15, 20, 25, 6, 7, 21, 22, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #237 +PAIRING(10, 15, 20, 25, 6, 7, 21, 25, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #238 +PAIRING(10, 15, 20, 25, 6, 7, 21, 26, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #239 +PAIRING(10, 15, 20, 25, 6, 7, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #240 +PAIRING(10, 15, 20, 25, 6, 7, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #241 +PAIRING(10, 15, 20, 25, 6, 10, 10, 11, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #242 +PAIRING(10, 15, 20, 25, 6, 10, 10, 15, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #243 +PAIRING(10, 15, 20, 25, 6, 10, 10, 16, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #244 +PAIRING(10, 15, 20, 25, 6, 10, 10, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #245 +PAIRING(10, 15, 20, 25, 6, 10, 10, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #246 +PAIRING(10, 15, 20, 25, 6, 10, 10, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #247 +PAIRING(10, 15, 20, 25, 6, 10, 10, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #248 +PAIRING(10, 15, 20, 25, 6, 10, 11, 12, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #249 +PAIRING(10, 15, 20, 25, 6, 10, 11, 15, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #250 +PAIRING(10, 15, 20, 25, 6, 10, 11, 16, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 2) // #251 +PAIRING(10, 15, 20, 25, 6, 10, 11, 20, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #252 +PAIRING(10, 15, 20, 25, 6, 10, 11, 21, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 2) // #253 +PAIRING(10, 15, 20, 25, 6, 10, 11, 25, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #254 +PAIRING(10, 15, 20, 25, 6, 10, 11, 26, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #255 +PAIRING(10, 15, 20, 25, 6, 10, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #256 +PAIRING(10, 15, 20, 25, 6, 10, 15, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #257 +PAIRING(10, 15, 20, 25, 6, 10, 15, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #258 +PAIRING(10, 15, 20, 25, 6, 10, 15, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #259 +PAIRING(10, 15, 20, 25, 6, 10, 15, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #260 +PAIRING(10, 15, 20, 25, 6, 10, 16, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #261 +PAIRING(10, 15, 20, 25, 6, 10, 16, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #262 +PAIRING(10, 15, 20, 25, 6, 10, 16, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #263 +PAIRING(10, 15, 20, 25, 6, 10, 16, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #264 +PAIRING(10, 15, 20, 25, 6, 10, 16, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #265 +PAIRING(10, 15, 20, 25, 6, 10, 20, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #266 +PAIRING(10, 15, 20, 25, 6, 10, 20, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #267 +PAIRING(10, 15, 20, 25, 6, 10, 20, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #268 +PAIRING(10, 15, 20, 25, 6, 10, 21, 22, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #269 +PAIRING(10, 15, 20, 25, 6, 10, 21, 25, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #270 +PAIRING(10, 15, 20, 25, 6, 10, 21, 26, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #271 +PAIRING(10, 15, 20, 25, 6, 10, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #272 +PAIRING(10, 15, 20, 25, 6, 10, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #273 +PAIRING(10, 15, 20, 25, 6, 11, 11, 12, 2, 0, 10, 11, 11, 12, 0, 0, 0, 0, 2, 1) // #274 +PAIRING(10, 15, 20, 25, 6, 11, 11, 15, 2, 0, 10, 11, 11, 15, 0, 0, 0, 0, 1, 1) // #275 +PAIRING(10, 15, 20, 25, 6, 11, 11, 16, 2, 0, 10, 11, 11, 15, 0, 0, 0, 0, 1, 2) // #276 +PAIRING(10, 15, 20, 25, 6, 11, 11, 20, 2, 0, 10, 11, 11, 15, 0, 0, 0, 0, 1, 1) // #277 +PAIRING(10, 15, 20, 25, 6, 11, 11, 21, 2, 1, 10, 11, 11, 15, 20, 21, 0, 0, 1, 2) // #278 +PAIRING(10, 15, 20, 25, 6, 11, 11, 25, 2, 1, 10, 11, 11, 15, 20, 25, 0, 0, 0, 2) // #279 +PAIRING(10, 15, 20, 25, 6, 11, 11, 26, 2, 1, 10, 11, 11, 15, 20, 25, 0, 0, 0, 2) // #280 +PAIRING(10, 15, 20, 25, 6, 11, 12, 13, 2, 0, 10, 11, 12, 13, 0, 0, 0, 0, 2, 1) // #281 +PAIRING(10, 15, 20, 25, 6, 11, 12, 15, 2, 0, 10, 11, 12, 15, 0, 0, 0, 0, 2, 1) // #282 +PAIRING(10, 15, 20, 25, 6, 11, 12, 16, 2, 0, 10, 11, 12, 15, 0, 0, 0, 0, 2, 2) // #283 +PAIRING(10, 15, 20, 25, 6, 11, 12, 20, 2, 0, 10, 11, 12, 15, 0, 0, 0, 0, 2, 1) // #284 +PAIRING(10, 15, 20, 25, 6, 11, 12, 21, 2, 1, 10, 11, 12, 15, 20, 21, 0, 0, 2, 2) // #285 +PAIRING(10, 15, 20, 25, 6, 11, 12, 25, 2, 1, 10, 11, 12, 15, 20, 25, 0, 0, 1, 2) // #286 +PAIRING(10, 15, 20, 25, 6, 11, 12, 26, 2, 1, 10, 11, 12, 15, 20, 25, 0, 0, 1, 2) // #287 +PAIRING(10, 15, 20, 25, 6, 11, 15, 16, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #288 +PAIRING(10, 15, 20, 25, 6, 11, 15, 20, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #289 +PAIRING(10, 15, 20, 25, 6, 11, 15, 21, 1, 1, 10, 11, 0, 0, 20, 21, 0, 0, 2, 2) // #290 +PAIRING(10, 15, 20, 25, 6, 11, 15, 25, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 2) // #291 +PAIRING(10, 15, 20, 25, 6, 11, 15, 26, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 2) // #292 +PAIRING(10, 15, 20, 25, 6, 11, 16, 17, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #293 +PAIRING(10, 15, 20, 25, 6, 11, 16, 20, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #294 +PAIRING(10, 15, 20, 25, 6, 11, 16, 21, 1, 1, 10, 11, 0, 0, 20, 21, 0, 0, 2, 2) // #295 +PAIRING(10, 15, 20, 25, 6, 11, 16, 25, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 2) // #296 +PAIRING(10, 15, 20, 25, 6, 11, 16, 26, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 2) // #297 +PAIRING(10, 15, 20, 25, 6, 11, 20, 21, 1, 1, 10, 11, 0, 0, 20, 21, 0, 0, 2, 1) // #298 +PAIRING(10, 15, 20, 25, 6, 11, 20, 25, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 1) // #299 +PAIRING(10, 15, 20, 25, 6, 11, 20, 26, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 2) // #300 +PAIRING(10, 15, 20, 25, 6, 11, 21, 22, 1, 1, 10, 11, 0, 0, 21, 22, 0, 0, 2, 1) // #301 +PAIRING(10, 15, 20, 25, 6, 11, 21, 25, 1, 1, 10, 11, 0, 0, 21, 25, 0, 0, 2, 1) // #302 +PAIRING(10, 15, 20, 25, 6, 11, 21, 26, 1, 1, 10, 11, 0, 0, 21, 25, 0, 0, 2, 2) // #303 +PAIRING(10, 15, 20, 25, 6, 11, 25, 26, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #304 +PAIRING(10, 15, 20, 25, 6, 11, 26, 27, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 2) // #305 +PAIRING(10, 15, 20, 25, 6, 15, 15, 16, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #306 +PAIRING(10, 15, 20, 25, 6, 15, 15, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #307 +PAIRING(10, 15, 20, 25, 6, 15, 15, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #308 +PAIRING(10, 15, 20, 25, 6, 15, 15, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #309 +PAIRING(10, 15, 20, 25, 6, 15, 15, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #310 +PAIRING(10, 15, 20, 25, 6, 15, 16, 17, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #311 +PAIRING(10, 15, 20, 25, 6, 15, 16, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #312 +PAIRING(10, 15, 20, 25, 6, 15, 16, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #313 +PAIRING(10, 15, 20, 25, 6, 15, 16, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #314 +PAIRING(10, 15, 20, 25, 6, 15, 16, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #315 +PAIRING(10, 15, 20, 25, 6, 15, 20, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 1) // #316 +PAIRING(10, 15, 20, 25, 6, 15, 20, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 1) // #317 +PAIRING(10, 15, 20, 25, 6, 15, 20, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #318 +PAIRING(10, 15, 20, 25, 6, 15, 21, 22, 1, 1, 10, 15, 0, 0, 21, 22, 0, 0, 1, 1) // #319 +PAIRING(10, 15, 20, 25, 6, 15, 21, 25, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 1) // #320 +PAIRING(10, 15, 20, 25, 6, 15, 21, 26, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 2) // #321 +PAIRING(10, 15, 20, 25, 6, 15, 25, 26, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #322 +PAIRING(10, 15, 20, 25, 6, 15, 26, 27, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #323 +PAIRING(10, 15, 20, 25, 6, 16, 16, 17, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #324 +PAIRING(10, 15, 20, 25, 6, 16, 16, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #325 +PAIRING(10, 15, 20, 25, 6, 16, 16, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #326 +PAIRING(10, 15, 20, 25, 6, 16, 16, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #327 +PAIRING(10, 15, 20, 25, 6, 16, 16, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #328 +PAIRING(10, 15, 20, 25, 6, 16, 17, 18, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #329 +PAIRING(10, 15, 20, 25, 6, 16, 17, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #330 +PAIRING(10, 15, 20, 25, 6, 16, 17, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #331 +PAIRING(10, 15, 20, 25, 6, 16, 17, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #332 +PAIRING(10, 15, 20, 25, 6, 16, 17, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #333 +PAIRING(10, 15, 20, 25, 6, 16, 20, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 1) // #334 +PAIRING(10, 15, 20, 25, 6, 16, 20, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 1) // #335 +PAIRING(10, 15, 20, 25, 6, 16, 20, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #336 +PAIRING(10, 15, 20, 25, 6, 16, 21, 22, 1, 1, 10, 15, 0, 0, 21, 22, 0, 0, 1, 1) // #337 +PAIRING(10, 15, 20, 25, 6, 16, 21, 25, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 1) // #338 +PAIRING(10, 15, 20, 25, 6, 16, 21, 26, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 2) // #339 +PAIRING(10, 15, 20, 25, 6, 16, 25, 26, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #340 +PAIRING(10, 15, 20, 25, 6, 16, 26, 27, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #341 +PAIRING(10, 15, 20, 25, 6, 20, 20, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 1) // #342 +PAIRING(10, 15, 20, 25, 6, 20, 20, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 1) // #343 +PAIRING(10, 15, 20, 25, 6, 20, 20, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #344 +PAIRING(10, 15, 20, 25, 6, 20, 21, 22, 1, 1, 10, 15, 0, 0, 21, 22, 0, 0, 1, 1) // #345 +PAIRING(10, 15, 20, 25, 6, 20, 21, 25, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 1) // #346 +PAIRING(10, 15, 20, 25, 6, 20, 21, 26, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 2) // #347 +PAIRING(10, 15, 20, 25, 6, 20, 25, 26, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #348 +PAIRING(10, 15, 20, 25, 6, 20, 26, 27, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #349 +PAIRING(10, 15, 20, 25, 6, 21, 21, 22, 1, 2, 10, 15, 0, 0, 20, 21, 21, 22, 1, 1) // #350 +PAIRING(10, 15, 20, 25, 6, 21, 21, 25, 1, 2, 10, 15, 0, 0, 20, 21, 21, 25, 0, 1) // #351 +PAIRING(10, 15, 20, 25, 6, 21, 21, 26, 1, 2, 10, 15, 0, 0, 20, 21, 21, 25, 0, 2) // #352 +PAIRING(10, 15, 20, 25, 6, 21, 22, 23, 1, 2, 10, 15, 0, 0, 20, 21, 22, 23, 1, 1) // #353 +PAIRING(10, 15, 20, 25, 6, 21, 22, 25, 1, 2, 10, 15, 0, 0, 20, 21, 22, 25, 1, 1) // #354 +PAIRING(10, 15, 20, 25, 6, 21, 22, 26, 1, 2, 10, 15, 0, 0, 20, 21, 22, 25, 1, 2) // #355 +PAIRING(10, 15, 20, 25, 6, 21, 25, 26, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #356 +PAIRING(10, 15, 20, 25, 6, 21, 26, 27, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #357 +PAIRING(10, 15, 20, 25, 6, 25, 25, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #358 +PAIRING(10, 15, 20, 25, 6, 25, 26, 27, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #359 +PAIRING(10, 15, 20, 25, 6, 26, 26, 27, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #360 +PAIRING(10, 15, 20, 25, 6, 26, 27, 28, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #361 +PAIRING(10, 15, 20, 25, 10, 11, 11, 12, 2, 0, 10, 11, 11, 12, 0, 0, 0, 0, 2, 0) // #362 +PAIRING(10, 15, 20, 25, 10, 11, 11, 15, 2, 0, 10, 11, 11, 15, 0, 0, 0, 0, 1, 0) // #363 +PAIRING(10, 15, 20, 25, 10, 11, 11, 16, 2, 0, 10, 11, 11, 15, 0, 0, 0, 0, 1, 1) // #364 +PAIRING(10, 15, 20, 25, 10, 11, 11, 20, 2, 0, 10, 11, 11, 15, 0, 0, 0, 0, 1, 0) // #365 +PAIRING(10, 15, 20, 25, 10, 11, 11, 21, 2, 1, 10, 11, 11, 15, 20, 21, 0, 0, 1, 1) // #366 +PAIRING(10, 15, 20, 25, 10, 11, 11, 25, 2, 1, 10, 11, 11, 15, 20, 25, 0, 0, 0, 1) // #367 +PAIRING(10, 15, 20, 25, 10, 11, 11, 26, 2, 1, 10, 11, 11, 15, 20, 25, 0, 0, 0, 1) // #368 +PAIRING(10, 15, 20, 25, 10, 11, 12, 13, 2, 0, 10, 11, 12, 13, 0, 0, 0, 0, 2, 0) // #369 +PAIRING(10, 15, 20, 25, 10, 11, 12, 15, 2, 0, 10, 11, 12, 15, 0, 0, 0, 0, 2, 0) // #370 +PAIRING(10, 15, 20, 25, 10, 11, 12, 16, 2, 0, 10, 11, 12, 15, 0, 0, 0, 0, 2, 1) // #371 +PAIRING(10, 15, 20, 25, 10, 11, 12, 20, 2, 0, 10, 11, 12, 15, 0, 0, 0, 0, 2, 0) // #372 +PAIRING(10, 15, 20, 25, 10, 11, 12, 21, 2, 1, 10, 11, 12, 15, 20, 21, 0, 0, 2, 1) // #373 +PAIRING(10, 15, 20, 25, 10, 11, 12, 25, 2, 1, 10, 11, 12, 15, 20, 25, 0, 0, 1, 1) // #374 +PAIRING(10, 15, 20, 25, 10, 11, 12, 26, 2, 1, 10, 11, 12, 15, 20, 25, 0, 0, 1, 1) // #375 +PAIRING(10, 15, 20, 25, 10, 11, 15, 16, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #376 +PAIRING(10, 15, 20, 25, 10, 11, 15, 20, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #377 +PAIRING(10, 15, 20, 25, 10, 11, 15, 21, 1, 1, 10, 11, 0, 0, 20, 21, 0, 0, 2, 1) // #378 +PAIRING(10, 15, 20, 25, 10, 11, 15, 25, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 1) // #379 +PAIRING(10, 15, 20, 25, 10, 11, 15, 26, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 1) // #380 +PAIRING(10, 15, 20, 25, 10, 11, 16, 17, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #381 +PAIRING(10, 15, 20, 25, 10, 11, 16, 20, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #382 +PAIRING(10, 15, 20, 25, 10, 11, 16, 21, 1, 1, 10, 11, 0, 0, 20, 21, 0, 0, 2, 1) // #383 +PAIRING(10, 15, 20, 25, 10, 11, 16, 25, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 1) // #384 +PAIRING(10, 15, 20, 25, 10, 11, 16, 26, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 1) // #385 +PAIRING(10, 15, 20, 25, 10, 11, 20, 21, 1, 1, 10, 11, 0, 0, 20, 21, 0, 0, 2, 0) // #386 +PAIRING(10, 15, 20, 25, 10, 11, 20, 25, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 0) // #387 +PAIRING(10, 15, 20, 25, 10, 11, 20, 26, 1, 1, 10, 11, 0, 0, 20, 25, 0, 0, 1, 1) // #388 +PAIRING(10, 15, 20, 25, 10, 11, 21, 22, 1, 1, 10, 11, 0, 0, 21, 22, 0, 0, 2, 0) // #389 +PAIRING(10, 15, 20, 25, 10, 11, 21, 25, 1, 1, 10, 11, 0, 0, 21, 25, 0, 0, 2, 0) // #390 +PAIRING(10, 15, 20, 25, 10, 11, 21, 26, 1, 1, 10, 11, 0, 0, 21, 25, 0, 0, 2, 1) // #391 +PAIRING(10, 15, 20, 25, 10, 11, 25, 26, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #392 +PAIRING(10, 15, 20, 25, 10, 11, 26, 27, 1, 0, 10, 11, 0, 0, 0, 0, 0, 0, 2, 1) // #393 +PAIRING(10, 15, 20, 25, 10, 15, 15, 16, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #394 +PAIRING(10, 15, 20, 25, 10, 15, 15, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #395 +PAIRING(10, 15, 20, 25, 10, 15, 15, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 1) // #396 +PAIRING(10, 15, 20, 25, 10, 15, 15, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 1) // #397 +PAIRING(10, 15, 20, 25, 10, 15, 15, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 1) // #398 +PAIRING(10, 15, 20, 25, 10, 15, 16, 17, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #399 +PAIRING(10, 15, 20, 25, 10, 15, 16, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #400 +PAIRING(10, 15, 20, 25, 10, 15, 16, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 1) // #401 +PAIRING(10, 15, 20, 25, 10, 15, 16, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 1) // #402 +PAIRING(10, 15, 20, 25, 10, 15, 16, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 1) // #403 +PAIRING(10, 15, 20, 25, 10, 15, 20, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 0) // #404 +PAIRING(10, 15, 20, 25, 10, 15, 20, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 0) // #405 +PAIRING(10, 15, 20, 25, 10, 15, 20, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 1) // #406 +PAIRING(10, 15, 20, 25, 10, 15, 21, 22, 1, 1, 10, 15, 0, 0, 21, 22, 0, 0, 1, 0) // #407 +PAIRING(10, 15, 20, 25, 10, 15, 21, 25, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 0) // #408 +PAIRING(10, 15, 20, 25, 10, 15, 21, 26, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 1) // #409 +PAIRING(10, 15, 20, 25, 10, 15, 25, 26, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #410 +PAIRING(10, 15, 20, 25, 10, 15, 26, 27, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #411 +PAIRING(10, 15, 20, 25, 10, 16, 16, 17, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #412 +PAIRING(10, 15, 20, 25, 10, 16, 16, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #413 +PAIRING(10, 15, 20, 25, 10, 16, 16, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #414 +PAIRING(10, 15, 20, 25, 10, 16, 16, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #415 +PAIRING(10, 15, 20, 25, 10, 16, 16, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #416 +PAIRING(10, 15, 20, 25, 10, 16, 17, 18, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #417 +PAIRING(10, 15, 20, 25, 10, 16, 17, 20, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #418 +PAIRING(10, 15, 20, 25, 10, 16, 17, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #419 +PAIRING(10, 15, 20, 25, 10, 16, 17, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #420 +PAIRING(10, 15, 20, 25, 10, 16, 17, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #421 +PAIRING(10, 15, 20, 25, 10, 16, 20, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 1) // #422 +PAIRING(10, 15, 20, 25, 10, 16, 20, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 1) // #423 +PAIRING(10, 15, 20, 25, 10, 16, 20, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #424 +PAIRING(10, 15, 20, 25, 10, 16, 21, 22, 1, 1, 10, 15, 0, 0, 21, 22, 0, 0, 1, 1) // #425 +PAIRING(10, 15, 20, 25, 10, 16, 21, 25, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 1) // #426 +PAIRING(10, 15, 20, 25, 10, 16, 21, 26, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 2) // #427 +PAIRING(10, 15, 20, 25, 10, 16, 25, 26, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #428 +PAIRING(10, 15, 20, 25, 10, 16, 26, 27, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 2) // #429 +PAIRING(10, 15, 20, 25, 10, 20, 20, 21, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 0) // #430 +PAIRING(10, 15, 20, 25, 10, 20, 20, 25, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 0) // #431 +PAIRING(10, 15, 20, 25, 10, 20, 20, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 1) // #432 +PAIRING(10, 15, 20, 25, 10, 20, 21, 22, 1, 1, 10, 15, 0, 0, 21, 22, 0, 0, 1, 0) // #433 +PAIRING(10, 15, 20, 25, 10, 20, 21, 25, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 0) // #434 +PAIRING(10, 15, 20, 25, 10, 20, 21, 26, 1, 1, 10, 15, 0, 0, 21, 25, 0, 0, 1, 1) // #435 +PAIRING(10, 15, 20, 25, 10, 20, 25, 26, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #436 +PAIRING(10, 15, 20, 25, 10, 20, 26, 27, 1, 0, 10, 15, 0, 0, 0, 0, 0, 0, 1, 1) // #437 +PAIRING(10, 15, 20, 25, 10, 21, 21, 22, 1, 2, 10, 15, 0, 0, 20, 21, 21, 22, 1, 1) // #438 +PAIRING(10, 15, 20, 25, 10, 21, 21, 25, 1, 2, 10, 15, 0, 0, 20, 21, 21, 25, 0, 1) // #439 +PAIRING(10, 15, 20, 25, 10, 21, 21, 26, 1, 2, 10, 15, 0, 0, 20, 21, 21, 25, 0, 2) // #440 +PAIRING(10, 15, 20, 25, 10, 21, 22, 23, 1, 2, 10, 15, 0, 0, 20, 21, 22, 23, 1, 1) // #441 +PAIRING(10, 15, 20, 25, 10, 21, 22, 25, 1, 2, 10, 15, 0, 0, 20, 21, 22, 25, 1, 1) // #442 +PAIRING(10, 15, 20, 25, 10, 21, 22, 26, 1, 2, 10, 15, 0, 0, 20, 21, 22, 25, 1, 2) // #443 +PAIRING(10, 15, 20, 25, 10, 21, 25, 26, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #444 +PAIRING(10, 15, 20, 25, 10, 21, 26, 27, 1, 1, 10, 15, 0, 0, 20, 21, 0, 0, 1, 2) // #445 +PAIRING(10, 15, 20, 25, 10, 25, 25, 26, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #446 +PAIRING(10, 15, 20, 25, 10, 25, 26, 27, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #447 +PAIRING(10, 15, 20, 25, 10, 26, 26, 27, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #448 +PAIRING(10, 15, 20, 25, 10, 26, 27, 28, 1, 1, 10, 15, 0, 0, 20, 25, 0, 0, 0, 2) // #449 +PAIRING(10, 15, 20, 25, 11, 12, 12, 13, 2, 0, 11, 12, 12, 13, 0, 0, 0, 0, 2, 0) // #450 +PAIRING(10, 15, 20, 25, 11, 12, 12, 15, 2, 0, 11, 12, 12, 15, 0, 0, 0, 0, 2, 0) // #451 +PAIRING(10, 15, 20, 25, 11, 12, 12, 16, 2, 0, 11, 12, 12, 15, 0, 0, 0, 0, 2, 1) // #452 +PAIRING(10, 15, 20, 25, 11, 12, 12, 20, 2, 0, 11, 12, 12, 15, 0, 0, 0, 0, 2, 0) // #453 +PAIRING(10, 15, 20, 25, 11, 12, 12, 21, 2, 1, 11, 12, 12, 15, 20, 21, 0, 0, 2, 1) // #454 +PAIRING(10, 15, 20, 25, 11, 12, 12, 25, 2, 1, 11, 12, 12, 15, 20, 25, 0, 0, 1, 1) // #455 +PAIRING(10, 15, 20, 25, 11, 12, 12, 26, 2, 1, 11, 12, 12, 15, 20, 25, 0, 0, 1, 1) // #456 +PAIRING(10, 15, 20, 25, 11, 12, 13, 14, 2, 0, 11, 12, 13, 14, 0, 0, 0, 0, 2, 0) // #457 +PAIRING(10, 15, 20, 25, 11, 12, 13, 15, 2, 0, 11, 12, 13, 15, 0, 0, 0, 0, 2, 0) // #458 +PAIRING(10, 15, 20, 25, 11, 12, 13, 16, 2, 0, 11, 12, 13, 15, 0, 0, 0, 0, 2, 1) // #459 +PAIRING(10, 15, 20, 25, 11, 12, 13, 20, 2, 0, 11, 12, 13, 15, 0, 0, 0, 0, 2, 0) // #460 +PAIRING(10, 15, 20, 25, 11, 12, 13, 21, 2, 1, 11, 12, 13, 15, 20, 21, 0, 0, 2, 1) // #461 +PAIRING(10, 15, 20, 25, 11, 12, 13, 25, 2, 1, 11, 12, 13, 15, 20, 25, 0, 0, 1, 1) // #462 +PAIRING(10, 15, 20, 25, 11, 12, 13, 26, 2, 1, 11, 12, 13, 15, 20, 25, 0, 0, 1, 1) // #463 +PAIRING(10, 15, 20, 25, 11, 12, 15, 16, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #464 +PAIRING(10, 15, 20, 25, 11, 12, 15, 20, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #465 +PAIRING(10, 15, 20, 25, 11, 12, 15, 21, 1, 1, 11, 12, 0, 0, 20, 21, 0, 0, 2, 1) // #466 +PAIRING(10, 15, 20, 25, 11, 12, 15, 25, 1, 1, 11, 12, 0, 0, 20, 25, 0, 0, 1, 1) // #467 +PAIRING(10, 15, 20, 25, 11, 12, 15, 26, 1, 1, 11, 12, 0, 0, 20, 25, 0, 0, 1, 1) // #468 +PAIRING(10, 15, 20, 25, 11, 12, 16, 17, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #469 +PAIRING(10, 15, 20, 25, 11, 12, 16, 20, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #470 +PAIRING(10, 15, 20, 25, 11, 12, 16, 21, 1, 1, 11, 12, 0, 0, 20, 21, 0, 0, 2, 1) // #471 +PAIRING(10, 15, 20, 25, 11, 12, 16, 25, 1, 1, 11, 12, 0, 0, 20, 25, 0, 0, 1, 1) // #472 +PAIRING(10, 15, 20, 25, 11, 12, 16, 26, 1, 1, 11, 12, 0, 0, 20, 25, 0, 0, 1, 1) // #473 +PAIRING(10, 15, 20, 25, 11, 12, 20, 21, 1, 1, 11, 12, 0, 0, 20, 21, 0, 0, 2, 0) // #474 +PAIRING(10, 15, 20, 25, 11, 12, 20, 25, 1, 1, 11, 12, 0, 0, 20, 25, 0, 0, 1, 0) // #475 +PAIRING(10, 15, 20, 25, 11, 12, 20, 26, 1, 1, 11, 12, 0, 0, 20, 25, 0, 0, 1, 1) // #476 +PAIRING(10, 15, 20, 25, 11, 12, 21, 22, 1, 1, 11, 12, 0, 0, 21, 22, 0, 0, 2, 0) // #477 +PAIRING(10, 15, 20, 25, 11, 12, 21, 25, 1, 1, 11, 12, 0, 0, 21, 25, 0, 0, 2, 0) // #478 +PAIRING(10, 15, 20, 25, 11, 12, 21, 26, 1, 1, 11, 12, 0, 0, 21, 25, 0, 0, 2, 1) // #479 +PAIRING(10, 15, 20, 25, 11, 12, 25, 26, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #480 +PAIRING(10, 15, 20, 25, 11, 12, 26, 27, 1, 0, 11, 12, 0, 0, 0, 0, 0, 0, 2, 1) // #481 +PAIRING(10, 15, 20, 25, 11, 15, 15, 16, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #482 +PAIRING(10, 15, 20, 25, 11, 15, 15, 20, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #483 +PAIRING(10, 15, 20, 25, 11, 15, 15, 21, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 1) // #484 +PAIRING(10, 15, 20, 25, 11, 15, 15, 25, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 1) // #485 +PAIRING(10, 15, 20, 25, 11, 15, 15, 26, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 1) // #486 +PAIRING(10, 15, 20, 25, 11, 15, 16, 17, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #487 +PAIRING(10, 15, 20, 25, 11, 15, 16, 20, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #488 +PAIRING(10, 15, 20, 25, 11, 15, 16, 21, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 1) // #489 +PAIRING(10, 15, 20, 25, 11, 15, 16, 25, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 1) // #490 +PAIRING(10, 15, 20, 25, 11, 15, 16, 26, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 1) // #491 +PAIRING(10, 15, 20, 25, 11, 15, 20, 21, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 0) // #492 +PAIRING(10, 15, 20, 25, 11, 15, 20, 25, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 0) // #493 +PAIRING(10, 15, 20, 25, 11, 15, 20, 26, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 1) // #494 +PAIRING(10, 15, 20, 25, 11, 15, 21, 22, 1, 1, 11, 15, 0, 0, 21, 22, 0, 0, 2, 0) // #495 +PAIRING(10, 15, 20, 25, 11, 15, 21, 25, 1, 1, 11, 15, 0, 0, 21, 25, 0, 0, 2, 0) // #496 +PAIRING(10, 15, 20, 25, 11, 15, 21, 26, 1, 1, 11, 15, 0, 0, 21, 25, 0, 0, 2, 1) // #497 +PAIRING(10, 15, 20, 25, 11, 15, 25, 26, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #498 +PAIRING(10, 15, 20, 25, 11, 15, 26, 27, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #499 +PAIRING(10, 15, 20, 25, 11, 16, 16, 17, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 2) // #500 +PAIRING(10, 15, 20, 25, 11, 16, 16, 20, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 2) // #501 +PAIRING(10, 15, 20, 25, 11, 16, 16, 21, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 2) // #502 +PAIRING(10, 15, 20, 25, 11, 16, 16, 25, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #503 +PAIRING(10, 15, 20, 25, 11, 16, 16, 26, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #504 +PAIRING(10, 15, 20, 25, 11, 16, 17, 18, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 2) // #505 +PAIRING(10, 15, 20, 25, 11, 16, 17, 20, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 2) // #506 +PAIRING(10, 15, 20, 25, 11, 16, 17, 21, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 2) // #507 +PAIRING(10, 15, 20, 25, 11, 16, 17, 25, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #508 +PAIRING(10, 15, 20, 25, 11, 16, 17, 26, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #509 +PAIRING(10, 15, 20, 25, 11, 16, 20, 21, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 1) // #510 +PAIRING(10, 15, 20, 25, 11, 16, 20, 25, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 1) // #511 +PAIRING(10, 15, 20, 25, 11, 16, 20, 26, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #512 +PAIRING(10, 15, 20, 25, 11, 16, 21, 22, 1, 1, 11, 15, 0, 0, 21, 22, 0, 0, 2, 1) // #513 +PAIRING(10, 15, 20, 25, 11, 16, 21, 25, 1, 1, 11, 15, 0, 0, 21, 25, 0, 0, 2, 1) // #514 +PAIRING(10, 15, 20, 25, 11, 16, 21, 26, 1, 1, 11, 15, 0, 0, 21, 25, 0, 0, 2, 2) // #515 +PAIRING(10, 15, 20, 25, 11, 16, 25, 26, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 2) // #516 +PAIRING(10, 15, 20, 25, 11, 16, 26, 27, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 2) // #517 +PAIRING(10, 15, 20, 25, 11, 20, 20, 21, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 0) // #518 +PAIRING(10, 15, 20, 25, 11, 20, 20, 25, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 0) // #519 +PAIRING(10, 15, 20, 25, 11, 20, 20, 26, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 1) // #520 +PAIRING(10, 15, 20, 25, 11, 20, 21, 22, 1, 1, 11, 15, 0, 0, 21, 22, 0, 0, 2, 0) // #521 +PAIRING(10, 15, 20, 25, 11, 20, 21, 25, 1, 1, 11, 15, 0, 0, 21, 25, 0, 0, 2, 0) // #522 +PAIRING(10, 15, 20, 25, 11, 20, 21, 26, 1, 1, 11, 15, 0, 0, 21, 25, 0, 0, 2, 1) // #523 +PAIRING(10, 15, 20, 25, 11, 20, 25, 26, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #524 +PAIRING(10, 15, 20, 25, 11, 20, 26, 27, 1, 0, 11, 15, 0, 0, 0, 0, 0, 0, 2, 1) // #525 +PAIRING(10, 15, 20, 25, 11, 21, 21, 22, 1, 2, 11, 15, 0, 0, 20, 21, 21, 22, 2, 1) // #526 +PAIRING(10, 15, 20, 25, 11, 21, 21, 25, 1, 2, 11, 15, 0, 0, 20, 21, 21, 25, 1, 1) // #527 +PAIRING(10, 15, 20, 25, 11, 21, 21, 26, 1, 2, 11, 15, 0, 0, 20, 21, 21, 25, 1, 2) // #528 +PAIRING(10, 15, 20, 25, 11, 21, 22, 23, 1, 2, 11, 15, 0, 0, 20, 21, 22, 23, 2, 1) // #529 +PAIRING(10, 15, 20, 25, 11, 21, 22, 25, 1, 2, 11, 15, 0, 0, 20, 21, 22, 25, 2, 1) // #530 +PAIRING(10, 15, 20, 25, 11, 21, 22, 26, 1, 2, 11, 15, 0, 0, 20, 21, 22, 25, 2, 2) // #531 +PAIRING(10, 15, 20, 25, 11, 21, 25, 26, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 2) // #532 +PAIRING(10, 15, 20, 25, 11, 21, 26, 27, 1, 1, 11, 15, 0, 0, 20, 21, 0, 0, 2, 2) // #533 +PAIRING(10, 15, 20, 25, 11, 25, 25, 26, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #534 +PAIRING(10, 15, 20, 25, 11, 25, 26, 27, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #535 +PAIRING(10, 15, 20, 25, 11, 26, 26, 27, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #536 +PAIRING(10, 15, 20, 25, 11, 26, 27, 28, 1, 1, 11, 15, 0, 0, 20, 25, 0, 0, 1, 2) // #537 +PAIRING(10, 15, 20, 25, 15, 16, 16, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #538 +PAIRING(10, 15, 20, 25, 15, 16, 16, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #539 +PAIRING(10, 15, 20, 25, 15, 16, 16, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #540 +PAIRING(10, 15, 20, 25, 15, 16, 16, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #541 +PAIRING(10, 15, 20, 25, 15, 16, 16, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #542 +PAIRING(10, 15, 20, 25, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #543 +PAIRING(10, 15, 20, 25, 15, 16, 17, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #544 +PAIRING(10, 15, 20, 25, 15, 16, 17, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #545 +PAIRING(10, 15, 20, 25, 15, 16, 17, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #546 +PAIRING(10, 15, 20, 25, 15, 16, 17, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #547 +PAIRING(10, 15, 20, 25, 15, 16, 20, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #548 +PAIRING(10, 15, 20, 25, 15, 16, 20, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #549 +PAIRING(10, 15, 20, 25, 15, 16, 20, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #550 +PAIRING(10, 15, 20, 25, 15, 16, 21, 22, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #551 +PAIRING(10, 15, 20, 25, 15, 16, 21, 25, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #552 +PAIRING(10, 15, 20, 25, 15, 16, 21, 26, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #553 +PAIRING(10, 15, 20, 25, 15, 16, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #554 +PAIRING(10, 15, 20, 25, 15, 16, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #555 +PAIRING(10, 15, 20, 25, 15, 20, 20, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #556 +PAIRING(10, 15, 20, 25, 15, 20, 20, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #557 +PAIRING(10, 15, 20, 25, 15, 20, 20, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #558 +PAIRING(10, 15, 20, 25, 15, 20, 21, 22, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #559 +PAIRING(10, 15, 20, 25, 15, 20, 21, 25, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #560 +PAIRING(10, 15, 20, 25, 15, 20, 21, 26, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #561 +PAIRING(10, 15, 20, 25, 15, 20, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #562 +PAIRING(10, 15, 20, 25, 15, 20, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #563 +PAIRING(10, 15, 20, 25, 15, 21, 21, 22, 0, 2, 0, 0, 0, 0, 20, 21, 21, 22, 2, 1) // #564 +PAIRING(10, 15, 20, 25, 15, 21, 21, 25, 0, 2, 0, 0, 0, 0, 20, 21, 21, 25, 1, 1) // #565 +PAIRING(10, 15, 20, 25, 15, 21, 21, 26, 0, 2, 0, 0, 0, 0, 20, 21, 21, 25, 1, 2) // #566 +PAIRING(10, 15, 20, 25, 15, 21, 22, 23, 0, 2, 0, 0, 0, 0, 20, 21, 22, 23, 2, 1) // #567 +PAIRING(10, 15, 20, 25, 15, 21, 22, 25, 0, 2, 0, 0, 0, 0, 20, 21, 22, 25, 2, 1) // #568 +PAIRING(10, 15, 20, 25, 15, 21, 22, 26, 0, 2, 0, 0, 0, 0, 20, 21, 22, 25, 2, 2) // #569 +PAIRING(10, 15, 20, 25, 15, 21, 25, 26, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #570 +PAIRING(10, 15, 20, 25, 15, 21, 26, 27, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #571 +PAIRING(10, 15, 20, 25, 15, 25, 25, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #572 +PAIRING(10, 15, 20, 25, 15, 25, 26, 27, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #573 +PAIRING(10, 15, 20, 25, 15, 26, 26, 27, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #574 +PAIRING(10, 15, 20, 25, 15, 26, 27, 28, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #575 +PAIRING(10, 15, 20, 25, 16, 17, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #576 +PAIRING(10, 15, 20, 25, 16, 17, 17, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #577 +PAIRING(10, 15, 20, 25, 16, 17, 17, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #578 +PAIRING(10, 15, 20, 25, 16, 17, 17, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #579 +PAIRING(10, 15, 20, 25, 16, 17, 17, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #580 +PAIRING(10, 15, 20, 25, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #581 +PAIRING(10, 15, 20, 25, 16, 17, 18, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #582 +PAIRING(10, 15, 20, 25, 16, 17, 18, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #583 +PAIRING(10, 15, 20, 25, 16, 17, 18, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #584 +PAIRING(10, 15, 20, 25, 16, 17, 18, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #585 +PAIRING(10, 15, 20, 25, 16, 17, 20, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #586 +PAIRING(10, 15, 20, 25, 16, 17, 20, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #587 +PAIRING(10, 15, 20, 25, 16, 17, 20, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #588 +PAIRING(10, 15, 20, 25, 16, 17, 21, 22, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #589 +PAIRING(10, 15, 20, 25, 16, 17, 21, 25, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #590 +PAIRING(10, 15, 20, 25, 16, 17, 21, 26, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #591 +PAIRING(10, 15, 20, 25, 16, 17, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #592 +PAIRING(10, 15, 20, 25, 16, 17, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #593 +PAIRING(10, 15, 20, 25, 16, 20, 20, 21, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #594 +PAIRING(10, 15, 20, 25, 16, 20, 20, 25, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #595 +PAIRING(10, 15, 20, 25, 16, 20, 20, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #596 +PAIRING(10, 15, 20, 25, 16, 20, 21, 22, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #597 +PAIRING(10, 15, 20, 25, 16, 20, 21, 25, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #598 +PAIRING(10, 15, 20, 25, 16, 20, 21, 26, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #599 +PAIRING(10, 15, 20, 25, 16, 20, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #600 +PAIRING(10, 15, 20, 25, 16, 20, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #601 +PAIRING(10, 15, 20, 25, 16, 21, 21, 22, 0, 2, 0, 0, 0, 0, 20, 21, 21, 22, 2, 1) // #602 +PAIRING(10, 15, 20, 25, 16, 21, 21, 25, 0, 2, 0, 0, 0, 0, 20, 21, 21, 25, 1, 1) // #603 +PAIRING(10, 15, 20, 25, 16, 21, 21, 26, 0, 2, 0, 0, 0, 0, 20, 21, 21, 25, 1, 2) // #604 +PAIRING(10, 15, 20, 25, 16, 21, 22, 23, 0, 2, 0, 0, 0, 0, 20, 21, 22, 23, 2, 1) // #605 +PAIRING(10, 15, 20, 25, 16, 21, 22, 25, 0, 2, 0, 0, 0, 0, 20, 21, 22, 25, 2, 1) // #606 +PAIRING(10, 15, 20, 25, 16, 21, 22, 26, 0, 2, 0, 0, 0, 0, 20, 21, 22, 25, 2, 2) // #607 +PAIRING(10, 15, 20, 25, 16, 21, 25, 26, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #608 +PAIRING(10, 15, 20, 25, 16, 21, 26, 27, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 2) // #609 +PAIRING(10, 15, 20, 25, 16, 25, 25, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #610 +PAIRING(10, 15, 20, 25, 16, 25, 26, 27, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #611 +PAIRING(10, 15, 20, 25, 16, 26, 26, 27, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #612 +PAIRING(10, 15, 20, 25, 16, 26, 27, 28, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #613 +PAIRING(10, 15, 20, 25, 20, 21, 21, 22, 0, 2, 0, 0, 0, 0, 20, 21, 21, 22, 2, 0) // #614 +PAIRING(10, 15, 20, 25, 20, 21, 21, 25, 0, 2, 0, 0, 0, 0, 20, 21, 21, 25, 1, 0) // #615 +PAIRING(10, 15, 20, 25, 20, 21, 21, 26, 0, 2, 0, 0, 0, 0, 20, 21, 21, 25, 1, 1) // #616 +PAIRING(10, 15, 20, 25, 20, 21, 22, 23, 0, 2, 0, 0, 0, 0, 20, 21, 22, 23, 2, 0) // #617 +PAIRING(10, 15, 20, 25, 20, 21, 22, 25, 0, 2, 0, 0, 0, 0, 20, 21, 22, 25, 2, 0) // #618 +PAIRING(10, 15, 20, 25, 20, 21, 22, 26, 0, 2, 0, 0, 0, 0, 20, 21, 22, 25, 2, 1) // #619 +PAIRING(10, 15, 20, 25, 20, 21, 25, 26, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #620 +PAIRING(10, 15, 20, 25, 20, 21, 26, 27, 0, 1, 0, 0, 0, 0, 20, 21, 0, 0, 2, 1) // #621 +PAIRING(10, 15, 20, 25, 20, 25, 25, 26, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #622 +PAIRING(10, 15, 20, 25, 20, 25, 26, 27, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 1) // #623 +PAIRING(10, 15, 20, 25, 20, 26, 26, 27, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #624 +PAIRING(10, 15, 20, 25, 20, 26, 27, 28, 0, 1, 0, 0, 0, 0, 20, 25, 0, 0, 1, 2) // #625 +PAIRING(10, 15, 20, 25, 21, 22, 22, 23, 0, 2, 0, 0, 0, 0, 21, 22, 22, 23, 2, 0) // #626 +PAIRING(10, 15, 20, 25, 21, 22, 22, 25, 0, 2, 0, 0, 0, 0, 21, 22, 22, 25, 2, 0) // #627 +PAIRING(10, 15, 20, 25, 21, 22, 22, 26, 0, 2, 0, 0, 0, 0, 21, 22, 22, 25, 2, 1) // #628 +PAIRING(10, 15, 20, 25, 21, 22, 23, 24, 0, 2, 0, 0, 0, 0, 21, 22, 23, 24, 2, 0) // #629 +PAIRING(10, 15, 20, 25, 21, 22, 23, 25, 0, 2, 0, 0, 0, 0, 21, 22, 23, 25, 2, 0) // #630 +PAIRING(10, 15, 20, 25, 21, 22, 23, 26, 0, 2, 0, 0, 0, 0, 21, 22, 23, 25, 2, 1) // #631 +PAIRING(10, 15, 20, 25, 21, 22, 25, 26, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #632 +PAIRING(10, 15, 20, 25, 21, 22, 26, 27, 0, 1, 0, 0, 0, 0, 21, 22, 0, 0, 2, 1) // #633 +PAIRING(10, 15, 20, 25, 21, 25, 25, 26, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #634 +PAIRING(10, 15, 20, 25, 21, 25, 26, 27, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 1) // #635 +PAIRING(10, 15, 20, 25, 21, 26, 26, 27, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #636 +PAIRING(10, 15, 20, 25, 21, 26, 27, 28, 0, 1, 0, 0, 0, 0, 21, 25, 0, 0, 2, 2) // #637 +PAIRING(10, 15, 20, 25, 25, 26, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #638 +PAIRING(10, 15, 20, 25, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #639 +PAIRING(10, 15, 20, 25, 26, 27, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #640 +PAIRING(10, 15, 20, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2) // #641 diff --git a/src/common/tests/auto_tempdir.h b/src/common/tests/auto_tempdir.h new file mode 100644 index 0000000..963c2dc --- /dev/null +++ b/src/common/tests/auto_tempdir.h @@ -0,0 +1,99 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Utility class for creating a temporary directory for unit tests +// that is deleted in the destructor. +#ifndef GOOGLE_BREAKPAD_COMMON_TESTS_AUTO_TEMPDIR +#define GOOGLE_BREAKPAD_COMMON_TESTS_AUTO_TEMPDIR + +#include +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "common/using_std_string.h" + +#if !defined(__ANDROID__) +#define TEMPDIR "/tmp" +#else +#define TEMPDIR "/data/local/tmp" +#include "common/android/testing/mkdtemp.h" +#endif + +namespace google_breakpad { + +class AutoTempDir { + public: + AutoTempDir() { + char temp_dir[] = TEMPDIR "/breakpad.XXXXXX"; + EXPECT_TRUE(mkdtemp(temp_dir) != NULL); + path_.assign(temp_dir); + } + + ~AutoTempDir() { + DeleteRecursively(path_); + } + + const string& path() const { + return path_; + } + + private: + void DeleteRecursively(const string& path) { + // First remove any files in the dir + DIR* dir = opendir(path.c_str()); + if (!dir) + return; + + dirent* entry; + while ((entry = readdir(dir)) != NULL) { + if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) + continue; + string entry_path = path + "/" + entry->d_name; + struct stat stats; + EXPECT_TRUE(lstat(entry_path.c_str(), &stats) == 0); + if (S_ISDIR(stats.st_mode)) + DeleteRecursively(entry_path); + else + EXPECT_TRUE(unlink(entry_path.c_str()) == 0); + } + EXPECT_TRUE(closedir(dir) == 0); + EXPECT_TRUE(rmdir(path.c_str()) == 0); + } + + // prevent copy construction and assignment + AutoTempDir(const AutoTempDir&); + AutoTempDir& operator=(const AutoTempDir&); + + string path_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_COMMON_TESTS_AUTO_TEMPDIR diff --git a/src/common/tests/file_utils.cc b/src/common/tests/file_utils.cc new file mode 100644 index 0000000..84a2280 --- /dev/null +++ b/src/common/tests/file_utils.cc @@ -0,0 +1,160 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// file_utils.cc: Implement utility functions for file manipulation. +// See file_utils.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include + +#include "common/linux/eintr_wrapper.h" +#include "common/tests/file_utils.h" + +namespace google_breakpad { + +bool CopyFile(const char* from_path, const char* to_path) { + int infile = HANDLE_EINTR(open(from_path, O_RDONLY)); + if (infile < 0) { + perror("open"); + return false; + } + + int outfile = HANDLE_EINTR(creat(to_path, 0666)); + if (outfile < 0) { + perror("creat"); + if (IGNORE_EINTR(close(infile)) < 0) { + perror("close"); + } + return false; + } + + char buffer[1024]; + bool result = true; + + while (result) { + ssize_t bytes_read = HANDLE_EINTR(read(infile, buffer, sizeof(buffer))); + if (bytes_read < 0) { + perror("read"); + result = false; + break; + } + if (bytes_read == 0) + break; + ssize_t bytes_written_per_read = 0; + do { + ssize_t bytes_written_partial = HANDLE_EINTR(write( + outfile, + &buffer[bytes_written_per_read], + bytes_read - bytes_written_per_read)); + if (bytes_written_partial < 0) { + perror("write"); + result = false; + break; + } + bytes_written_per_read += bytes_written_partial; + } while (bytes_written_per_read < bytes_read); + } + + if (IGNORE_EINTR(close(infile)) == -1) { + perror("close"); + result = false; + } + if (IGNORE_EINTR(close(outfile)) == -1) { + perror("close"); + result = false; + } + + return result; +} + +bool CopyFile(const std::string& from_path, const std::string& to_path) { + return CopyFile(from_path.c_str(), to_path.c_str()); +} + +bool ReadFile(const char* path, void* buffer, ssize_t* buffer_size) { + int fd = HANDLE_EINTR(open(path, O_RDONLY)); + if (fd == -1) { + perror("open"); + return false; + } + + bool ok = true; + if (buffer && buffer_size && *buffer_size > 0) { + memset(buffer, 0, sizeof(*buffer_size)); + *buffer_size = HANDLE_EINTR(read(fd, buffer, *buffer_size)); + if (*buffer_size == -1) { + perror("read"); + ok = false; + } + } + if (IGNORE_EINTR(close(fd)) == -1) { + perror("close"); + ok = false; + } + return ok; +} + +bool WriteFile(const char* path, const void* buffer, size_t buffer_size) { + int fd = HANDLE_EINTR(open(path, O_CREAT | O_TRUNC | O_WRONLY, S_IRWXU)); + if (fd == -1) { + perror("open"); + return false; + } + + bool ok = true; + if (buffer) { + size_t bytes_written_total = 0; + ssize_t bytes_written_partial = 0; + const char* data = reinterpret_cast(buffer); + while (bytes_written_total < buffer_size) { + bytes_written_partial = + HANDLE_EINTR(write(fd, data + bytes_written_total, + buffer_size - bytes_written_total)); + if (bytes_written_partial < 0) { + perror("write"); + ok = false; + break; + } + bytes_written_total += bytes_written_partial; + } + } + if (IGNORE_EINTR(close(fd)) == -1) { + perror("close"); + ok = false; + } + return ok; +} + +} // namespace google_breakpad diff --git a/src/common/tests/file_utils.h b/src/common/tests/file_utils.h new file mode 100644 index 0000000..b96029d --- /dev/null +++ b/src/common/tests/file_utils.h @@ -0,0 +1,54 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// file_utils.h: Define utility functions for file manipulation, which +// are used for testing. + +#ifndef COMMON_TESTS_FILE_UTILS_H_ +#define COMMON_TESTS_FILE_UTILS_H_ + +#include + +namespace google_breakpad { + +// Copies a file from |from_path| to |to_path|. Returns true on success. +bool CopyFile(const std::string& from_path, const std::string& to_path); +bool CopyFile(const char* from_path, const char* to_path); + +// Reads the content of a file at |path| into |buffer|. |buffer_size| specifies +// the size of |buffer| in bytes and returns the number of bytes read from the +// file on success. Returns true on success. +bool ReadFile(const char* path, void* buffer, ssize_t* buffer_size); + +// Writes |buffer_size| bytes of the content in |buffer| to a file at |path|. +// Returns true on success. +bool WriteFile(const char* path, const void* buffer, size_t buffer_size); + +} // namespace google_breakpad + +#endif // COMMON_TESTS_FILE_UTILS_H_ diff --git a/src/common/unordered.h b/src/common/unordered.h new file mode 100644 index 0000000..7606f17 --- /dev/null +++ b/src/common/unordered.h @@ -0,0 +1,55 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Include this file to use unordered_map and unordered_set. If tr1 +// or C++11 is not available, you can switch to using hash_set and +// hash_map by defining BP_USE_HASH_SET. + +#ifndef COMMON_UNORDERED_H_ +#define COMMON_UNORDERED_H_ + +#if defined(BP_USE_HASH_SET) +#include +#include + +// For hash. +#include "util/hash/hash.h" + +template > +struct unordered_map : public __gnu_cxx::hash_map {}; +template > +struct unordered_set : public __gnu_cxx::hash_set {}; + +#else +#include +#include +using std::unordered_map; +using std::unordered_set; +#endif + +#endif // COMMON_UNORDERED_H_ diff --git a/src/common/using_std_string.h b/src/common/using_std_string.h new file mode 100644 index 0000000..0f11db7 --- /dev/null +++ b/src/common/using_std_string.h @@ -0,0 +1,65 @@ +// -*- mode: C++ -*- + +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Ivan Penkov + +// using_std_string.h: Allows building this code in environments where +// global string (::string) exists. +// +// The problem: +// ------------- +// Let's say you want to build this code in an environment where a global +// string type is defined (i.e. ::string). Now, let's suppose that ::string +// is different that std::string and you'd like to have the option to easily +// choose between the two string types. Ideally you'd like to control which +// string type is chosen by simply #defining an identifier. +// +// The solution: +// ------------- +// #define HAS_GLOBAL_STRING somewhere in a global header file and then +// globally replace std::string with string. Then include this header +// file everywhere where string is used. If you want to revert back to +// using std::string, simply remove the #define (HAS_GLOBAL_STRING). + +#ifndef THIRD_PARTY_BREAKPAD_SRC_COMMON_USING_STD_STRING_H_ +#define THIRD_PARTY_BREAKPAD_SRC_COMMON_USING_STD_STRING_H_ + +#ifdef HAS_GLOBAL_STRING + typedef ::string google_breakpad_string; +#else +#include + using std::string; + typedef std::string google_breakpad_string; +#endif + +// Inicates that type google_breakpad_string is defined +#define HAS_GOOGLE_BREAKPAD_STRING + +#endif // THIRD_PARTY_BREAKPAD_SRC_COMMON_USING_STD_STRING_H_ diff --git a/src/common/windows/dia_util.cc b/src/common/windows/dia_util.cc new file mode 100644 index 0000000..a5d984d --- /dev/null +++ b/src/common/windows/dia_util.cc @@ -0,0 +1,96 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/windows/dia_util.h" + +#include + +namespace google_breakpad { + +bool FindDebugStream(const wchar_t* name, + IDiaSession* session, + IDiaEnumDebugStreamData** debug_stream) { + CComPtr enum_debug_streams; + if (FAILED(session->getEnumDebugStreams(&enum_debug_streams))) { + fprintf(stderr, "IDiaSession::getEnumDebugStreams failed\n"); + return false; + } + + CComPtr temp_debug_stream; + ULONG fetched = 0; + while (SUCCEEDED(enum_debug_streams->Next(1, &temp_debug_stream, &fetched)) && + fetched == 1) { + CComBSTR stream_name; + if (FAILED(temp_debug_stream->get_name(&stream_name))) { + fprintf(stderr, "IDiaEnumDebugStreamData::get_name failed\n"); + return false; + } + + // Found the stream? + if (wcsncmp((LPWSTR)stream_name, name, stream_name.Length()) == 0) { + *debug_stream = temp_debug_stream.Detach(); + return true; + } + + temp_debug_stream.Release(); + } + + // No table was found. + return false; +} + +bool FindTable(REFIID iid, IDiaSession* session, void** table) { + // Get the table enumerator. + CComPtr enum_tables; + if (FAILED(session->getEnumTables(&enum_tables))) { + fprintf(stderr, "IDiaSession::getEnumTables failed\n"); + return false; + } + + // Iterate through the tables. + CComPtr temp_table; + ULONG fetched = 0; + while (SUCCEEDED(enum_tables->Next(1, &temp_table, &fetched)) && + fetched == 1) { + void* temp = NULL; + if (SUCCEEDED(temp_table->QueryInterface(iid, &temp))) { + *table = temp; + return true; + } + temp_table.Release(); + } + + // The table was not found. + return false; +} + +} // namespace google_breakpad \ No newline at end of file diff --git a/src/common/windows/dia_util.h b/src/common/windows/dia_util.h new file mode 100644 index 0000000..16ed838 --- /dev/null +++ b/src/common/windows/dia_util.h @@ -0,0 +1,64 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Utilities for loading debug streams and tables from a PDB file. + +#ifndef COMMON_WINDOWS_DIA_UTIL_H_ +#define COMMON_WINDOWS_DIA_UTIL_H_ + +#include +#include + +namespace google_breakpad { + +// Find the debug stream of the given |name| in the given |session|. Returns +// true on success, false on error of if the stream does not exist. On success +// the stream will be returned via |debug_stream|. +bool FindDebugStream(const wchar_t* name, + IDiaSession* session, + IDiaEnumDebugStreamData** debug_stream); + +// Finds the first table implementing the COM interface with ID |iid| in the +// given |session|. Returns true on success, false on error or if no such +// table is found. On success the table will be returned via |table|. +bool FindTable(REFIID iid, IDiaSession* session, void** table); + +// A templated version of FindTable. Finds the first table implementing type +// |InterfaceType| in the given |session|. Returns true on success, false on +// error or if no such table is found. On success the table will be returned via +// |table|. +template +bool FindTable(IDiaSession* session, InterfaceType** table) { + return FindTable(__uuidof(InterfaceType), + session, + reinterpret_cast(table)); +} + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_DIA_UTIL_H_ diff --git a/src/common/windows/guid_string.cc b/src/common/windows/guid_string.cc new file mode 100644 index 0000000..2c298c3 --- /dev/null +++ b/src/common/windows/guid_string.cc @@ -0,0 +1,79 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// guid_string.cc: Convert GUIDs to strings. +// +// See guid_string.h for documentation. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "common/windows/string_utils-inl.h" + +#include "common/windows/guid_string.h" + +namespace google_breakpad { + +// static +wstring GUIDString::GUIDToWString(GUID *guid) { + wchar_t guid_string[37]; + swprintf( + guid_string, sizeof(guid_string) / sizeof(guid_string[0]), + L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", + guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], + guid->Data4[3], guid->Data4[4], guid->Data4[5], + guid->Data4[6], guid->Data4[7]); + + // remove when VC++7.1 is no longer supported + guid_string[sizeof(guid_string) / sizeof(guid_string[0]) - 1] = L'\0'; + + return wstring(guid_string); +} + +// static +wstring GUIDString::GUIDToSymbolServerWString(GUID *guid) { + wchar_t guid_string[33]; + swprintf( + guid_string, sizeof(guid_string) / sizeof(guid_string[0]), + L"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X", + guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], + guid->Data4[3], guid->Data4[4], guid->Data4[5], + guid->Data4[6], guid->Data4[7]); + + // remove when VC++7.1 is no longer supported + guid_string[sizeof(guid_string) / sizeof(guid_string[0]) - 1] = L'\0'; + + return wstring(guid_string); +} + +} // namespace google_breakpad diff --git a/src/common/windows/guid_string.h b/src/common/windows/guid_string.h new file mode 100644 index 0000000..ee3d100 --- /dev/null +++ b/src/common/windows/guid_string.h @@ -0,0 +1,57 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// guid_string.cc: Convert GUIDs to strings. + +#ifndef COMMON_WINDOWS_GUID_STRING_H_ +#define COMMON_WINDOWS_GUID_STRING_H_ + +#include + +#include + +namespace google_breakpad { + +using std::wstring; + +class GUIDString { + public: + // Converts guid to a string in the format recommended by RFC 4122 and + // returns the string. + static wstring GUIDToWString(GUID *guid); + + // Converts guid to a string formatted as uppercase hexadecimal, with + // no separators, and returns the string. This is the format used for + // symbol server identifiers, although identifiers have an age tacked + // on to the string. + static wstring GUIDToSymbolServerWString(GUID *guid); +}; + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_GUID_STRING_H_ diff --git a/src/common/windows/http_upload.cc b/src/common/windows/http_upload.cc new file mode 100644 index 0000000..bd48a23 --- /dev/null +++ b/src/common/windows/http_upload.cc @@ -0,0 +1,522 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +// Disable exception handler warnings. +#pragma warning(disable:4530) + +#include +#include + +#include "common/windows/string_utils-inl.h" + +#include "common/windows/http_upload.h" + +namespace { + using std::string; + using std::wstring; + using std::map; + using std::vector; + using std::ifstream; + using std::ios; + + const wchar_t kUserAgent[] = L"Breakpad/1.0 (Windows)"; + + // Helper class which closes an internet handle when it goes away + class AutoInternetHandle { + public: + explicit AutoInternetHandle(HINTERNET handle) : handle_(handle) {} + ~AutoInternetHandle() { + if (handle_) { + InternetCloseHandle(handle_); + } + } + + HINTERNET get() { return handle_; } + + private: + HINTERNET handle_; + }; + + wstring UTF8ToWide(const string& utf8) { + if (utf8.length() == 0) { + return wstring(); + } + + // compute the length of the buffer we'll need + int charcount = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0); + + if (charcount == 0) { + return wstring(); + } + + // convert + wchar_t* buf = new wchar_t[charcount]; + MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, buf, charcount); + wstring result(buf); + delete[] buf; + return result; + } + + string WideToMBCP(const wstring& wide, unsigned int cp) { + if (wide.length() == 0) { + return string(); + } + + // compute the length of the buffer we'll need + int charcount = WideCharToMultiByte(cp, 0, wide.c_str(), -1, + NULL, 0, NULL, NULL); + if (charcount == 0) { + return string(); + } + + // convert + char *buf = new char[charcount]; + WideCharToMultiByte(cp, 0, wide.c_str(), -1, buf, charcount, + NULL, NULL); + + string result(buf); + delete[] buf; + return result; + } + + bool GetFileContents(const wstring& filename, vector* contents) { + bool rv = false; + // The "open" method on pre-MSVC8 ifstream implementations doesn't accept a + // wchar_t* filename, so use _wfopen directly in that case. For VC8 and + // later, _wfopen has been deprecated in favor of _wfopen_s, which does + // not exist in earlier versions, so let the ifstream open the file itself. + // GCC doesn't support wide file name and opening on FILE* requires ugly + // hacks, so fallback to multi byte file. +#ifdef _MSC_VER + ifstream file; + file.open(filename.c_str(), ios::binary); +#else // GCC + ifstream file(WideToMBCP(filename, CP_ACP).c_str(), ios::binary); +#endif // _MSC_VER >= 1400 + if (file.is_open()) { + file.seekg(0, ios::end); + std::streamoff length = file.tellg(); + // Check for loss of data when converting lenght from std::streamoff into + // std::vector::size_type + std::vector::size_type vector_size = + static_cast::size_type>(length); + if (static_cast(vector_size) == length) { + contents->resize(vector_size); + if (length != 0) { + file.seekg(0, ios::beg); + file.read(&((*contents)[0]), length); + } + rv = true; + } + file.close(); + } + return rv; + } + + bool CheckParameters(const map& parameters) { + for (map::const_iterator pos = parameters.begin(); + pos != parameters.end(); ++pos) { + const wstring& str = pos->first; + if (str.size() == 0) { + return false; // disallow empty parameter names + } + for (unsigned int i = 0; i < str.size(); ++i) { + wchar_t c = str[i]; + if (c < 32 || c == '"' || c > 127) { + return false; + } + } + } + return true; + } + + // Converts a UTF16 string to UTF8. + string WideToUTF8(const wstring& wide) { + return WideToMBCP(wide, CP_UTF8); + } + + bool ReadResponse(HINTERNET request, wstring *response) { + bool has_content_length_header = false; + wchar_t content_length[32]; + DWORD content_length_size = sizeof(content_length); + DWORD claimed_size = 0; + string response_body; + + if (HttpQueryInfo(request, HTTP_QUERY_CONTENT_LENGTH, + static_cast(&content_length), + &content_length_size, 0)) { + has_content_length_header = true; + claimed_size = wcstol(content_length, NULL, 10); + response_body.reserve(claimed_size); + } + + DWORD bytes_available; + DWORD total_read = 0; + BOOL return_code; + + while (((return_code = InternetQueryDataAvailable(request, &bytes_available, + 0, 0)) != 0) && bytes_available > 0) { + vector response_buffer(bytes_available); + DWORD size_read; + + return_code = InternetReadFile(request, + &response_buffer[0], + bytes_available, &size_read); + + if (return_code && size_read > 0) { + total_read += size_read; + response_body.append(&response_buffer[0], size_read); + } + else { + break; + } + } + + bool succeeded = return_code && (!has_content_length_header || + (total_read == claimed_size)); + if (succeeded && response) { + *response = UTF8ToWide(response_body); + } + + return succeeded; + } + + bool SendRequestInner( + const wstring& url, + const wstring& http_method, + const wstring& content_type_header, + const string& request_body, + int* timeout_ms, + wstring* response_body, + int* response_code) { + if (response_code) { + *response_code = 0; + } + + // Break up the URL and make sure we can handle it + wchar_t scheme[16], host[256], path[1024]; + URL_COMPONENTS components; + memset(&components, 0, sizeof(components)); + components.dwStructSize = sizeof(components); + components.lpszScheme = scheme; + components.dwSchemeLength = sizeof(scheme) / sizeof(scheme[0]); + components.lpszHostName = host; + components.dwHostNameLength = sizeof(host) / sizeof(host[0]); + components.lpszUrlPath = path; + components.dwUrlPathLength = sizeof(path) / sizeof(path[0]); + if (!InternetCrackUrl(url.c_str(), static_cast(url.size()), + 0, &components)) { + DWORD err = GetLastError(); + wprintf(L"%d\n", err); + return false; + } + bool secure = false; + if (wcscmp(scheme, L"https") == 0) { + secure = true; + } + else if (wcscmp(scheme, L"http") != 0) { + return false; + } + + AutoInternetHandle internet(InternetOpen(kUserAgent, + INTERNET_OPEN_TYPE_PRECONFIG, + NULL, // proxy name + NULL, // proxy bypass + 0)); // flags + if (!internet.get()) { + return false; + } + + AutoInternetHandle connection(InternetConnect(internet.get(), + host, + components.nPort, + NULL, // user name + NULL, // password + INTERNET_SERVICE_HTTP, + 0, // flags + 0)); // context + if (!connection.get()) { + return false; + } + + DWORD http_open_flags = secure ? INTERNET_FLAG_SECURE : 0; + http_open_flags |= INTERNET_FLAG_NO_COOKIES; + AutoInternetHandle request(HttpOpenRequest(connection.get(), + http_method.c_str(), + path, + NULL, // version + NULL, // referer + NULL, // agent type + http_open_flags, + 0)); // context + if (!request.get()) { + return false; + } + + if (!content_type_header.empty()) { + HttpAddRequestHeaders(request.get(), + content_type_header.c_str(), + static_cast(-1), + HTTP_ADDREQ_FLAG_ADD); + } + + if (timeout_ms) { + if (!InternetSetOption(request.get(), + INTERNET_OPTION_SEND_TIMEOUT, + timeout_ms, + sizeof(*timeout_ms))) { + fwprintf(stderr, L"Could not unset send timeout, continuing...\n"); + } + + if (!InternetSetOption(request.get(), + INTERNET_OPTION_RECEIVE_TIMEOUT, + timeout_ms, + sizeof(*timeout_ms))) { + fwprintf(stderr, L"Could not unset receive timeout, continuing...\n"); + } + } + + if (!HttpSendRequest(request.get(), NULL, 0, + const_cast(request_body.data()), + static_cast(request_body.size()))) { + return false; + } + + // The server indicates a successful upload with HTTP status 200. + wchar_t http_status[4]; + DWORD http_status_size = sizeof(http_status); + if (!HttpQueryInfo(request.get(), HTTP_QUERY_STATUS_CODE, + static_cast(&http_status), &http_status_size, + 0)) { + return false; + } + + int http_response = wcstol(http_status, NULL, 10); + if (response_code) { + *response_code = http_response; + } + + bool result = (http_response == 200); + + if (result) { + result = ReadResponse(request.get(), response_body); + } + + return result; + } + + wstring GenerateMultipartBoundary() { + // The boundary has 27 '-' characters followed by 16 hex digits + static const wchar_t kBoundaryPrefix[] = L"---------------------------"; + static const int kBoundaryLength = 27 + 16 + 1; + + // Generate some random numbers to fill out the boundary + int r0 = rand(); + int r1 = rand(); + + wchar_t temp[kBoundaryLength]; + swprintf(temp, kBoundaryLength, L"%s%08X%08X", kBoundaryPrefix, r0, r1); + + // remove when VC++7.1 is no longer supported + temp[kBoundaryLength - 1] = L'\0'; + + return wstring(temp); + } + + wstring GenerateMultipartPostRequestHeader(const wstring& boundary) { + wstring header = L"Content-Type: multipart/form-data; boundary="; + header += boundary; + return header; + } + + bool AppendFileToRequestBody(const wstring& file_part_name, + const wstring& filename, + string* request_body, + bool set_content_type = true) { + string file_part_name_utf8 = WideToUTF8(file_part_name); + if (file_part_name_utf8.empty()) { + return false; + } + + string filename_utf8 = WideToUTF8(filename); + if (filename_utf8.empty()) { + return false; + } + + if (set_content_type) { + request_body->append( + "Content-Disposition: form-data; " + "name=\"" + + file_part_name_utf8 + + "\"; " + "filename=\"" + + filename_utf8 + "\"\r\n"); + request_body->append("Content-Type: application/octet-stream\r\n"); + request_body->append("\r\n"); + } + + vector contents; + if (!GetFileContents(filename, &contents)) { + return false; + } + + if (!contents.empty()) { + request_body->append(&(contents[0]), contents.size()); + } + + return true; + } + + bool GenerateRequestBody(const map& parameters, + const map& files, + const wstring& boundary, + string *request_body) { + string boundary_str = WideToUTF8(boundary); + if (boundary_str.empty()) { + return false; + } + + request_body->clear(); + + // Append each of the parameter pairs as a form-data part + for (map::const_iterator pos = parameters.begin(); + pos != parameters.end(); ++pos) { + request_body->append("--" + boundary_str + "\r\n"); + request_body->append("Content-Disposition: form-data; name=\"" + + WideToUTF8(pos->first) + "\"\r\n\r\n" + + WideToUTF8(pos->second) + "\r\n"); + } + + // Now append each upload file as a binary (octet-stream) part + for (map::const_iterator pos = files.begin(); + pos != files.end(); ++pos) { + request_body->append("--" + boundary_str + "\r\n"); + + if (!AppendFileToRequestBody(pos->first, pos->second, request_body)) { + return false; + } + } + request_body->append("--" + boundary_str + "--\r\n"); + return true; + } +} + +namespace google_breakpad { + bool HTTPUpload::SendPutRequest( + const wstring& url, + const wstring& path, + int* timeout_ms, + wstring* response_body, + int* response_code) { + string request_body; + // Turn off content-type in the body. If content-type is set then binary + // files uploaded to GCS end up with the it prepended to the file + // contents. + if (!AppendFileToRequestBody(L"symbol_file", path, &request_body, + /*set_content_type=*/false)) { + return false; + } + + return SendRequestInner( + url, + L"PUT", + L"", + request_body, + timeout_ms, + response_body, + response_code); + } + + bool HTTPUpload::SendGetRequest( + const wstring& url, + int* timeout_ms, + wstring* response_body, + int* response_code) { + return SendRequestInner( + url, + L"GET", + L"", + "", + timeout_ms, + response_body, + response_code); + } + + bool HTTPUpload::SendMultipartPostRequest( + const wstring& url, + const map& parameters, + const map& files, + int* timeout_ms, + wstring* response_body, + int* response_code) { + // TODO(bryner): support non-ASCII parameter names + if (!CheckParameters(parameters)) { + return false; + } + + wstring boundary = GenerateMultipartBoundary(); + wstring content_type_header = GenerateMultipartPostRequestHeader(boundary); + + string request_body; + if (!GenerateRequestBody(parameters, files, boundary, &request_body)) { + return false; + } + + return SendRequestInner( + url, + L"POST", + content_type_header, + request_body, + timeout_ms, + response_body, + response_code); + } + + bool HTTPUpload::SendSimplePostRequest( + const wstring& url, + const wstring& body, + const wstring& content_type, + int *timeout_ms, + wstring *response_body, + int *response_code) { + return SendRequestInner( + url, + L"POST", + content_type, + WideToUTF8(body), + timeout_ms, + response_body, + response_code); + } +} // namespace google_breakpad diff --git a/src/common/windows/http_upload.h b/src/common/windows/http_upload.h new file mode 100644 index 0000000..e117840 --- /dev/null +++ b/src/common/windows/http_upload.h @@ -0,0 +1,125 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// HTTPUpload provides a "nice" API to send a multipart HTTP(S) POST +// request using wininet. It currently supports requests that contain +// a set of string parameters (key/value pairs), and a file to upload. + +#ifndef COMMON_WINDOWS_HTTP_UPLOAD_H_ +#define COMMON_WINDOWS_HTTP_UPLOAD_H_ + +#pragma warning(push) +// Disable exception handler warnings. +#pragma warning(disable : 4530) + +#include +#include + +#include + +namespace google_breakpad { + +using std::string; +using std::wstring; +using std::map; + +class HTTPUpload { + public: + // Sends a PUT request containing the data in |path| to the given + // URL. + // Only HTTP(S) URLs are currently supported. Returns true on success. + // If the request is successful and response_body is non-NULL, + // the response body will be returned in response_body. + // If response_code is non-NULL, it will be set to the HTTP response code + // received (or 0 if the request failed before getting an HTTP response). + static bool SendPutRequest( + const wstring& url, + const wstring& path, + int* timeout_ms, + wstring* response_body, + int* response_code); + + // Sends a GET request to the given URL. + // Only HTTP(S) URLs are currently supported. Returns true on success. + // If the request is successful and response_body is non-NULL, + // the response body will be returned in response_body. + // If response_code is non-NULL, it will be set to the HTTP response code + // received (or 0 if the request failed before getting an HTTP response). + static bool SendGetRequest( + const wstring& url, + int* timeout_ms, + wstring* response_body, + int* response_code); + + // Sends the given sets of parameters and files as a multipart POST + // request to the given URL. + // Each key in |files| is the name of the file part of the request + // (i.e. it corresponds to the name= attribute on an . + // Parameter names must contain only printable ASCII characters, + // and may not contain a quote (") character. + // Only HTTP(S) URLs are currently supported. Returns true on success. + // If the request is successful and response_body is non-NULL, + // the response body will be returned in response_body. + // If response_code is non-NULL, it will be set to the HTTP response code + // received (or 0 if the request failed before getting an HTTP response). + static bool SendMultipartPostRequest( + const wstring& url, + const map& parameters, + const map& files, + int *timeout_ms, + wstring *response_body, + int *response_code); + + // Sends a POST request, with the body set to |body|, to the given URL. + // Only HTTP(S) URLs are currently supported. Returns true on success. + // If the request is successful and response_body is non-NULL, + // the response body will be returned in response_body. + // If response_code is non-NULL, it will be set to the HTTP response code + // received (or 0 if the request failed before getting an HTTP response). + static bool SendSimplePostRequest( + const wstring& url, + const wstring& body, + const wstring& content_type, + int *timeout_ms, + wstring *response_body, + int *response_code); + + private: + // No instances of this class should be created. + // Disallow all constructors, destructors, and operator=. + HTTPUpload(); + explicit HTTPUpload(const HTTPUpload&); + void operator=(const HTTPUpload&); + ~HTTPUpload(); +}; + +} // namespace google_breakpad + +#pragma warning(pop) + +#endif // COMMON_WINDOWS_HTTP_UPLOAD_H_ diff --git a/src/common/windows/module_info.h b/src/common/windows/module_info.h new file mode 100644 index 0000000..ade32c1 --- /dev/null +++ b/src/common/windows/module_info.h @@ -0,0 +1,74 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_WINDOWS_MODULE_INFO_H_ +#define COMMON_WINDOWS_MODULE_INFO_H_ + +#include + +namespace google_breakpad { + +using std::wstring; +// A structure that carries information that identifies a module. +struct PDBModuleInfo { +public: + // The basename of the pe/pdb file from which information was loaded. + wstring debug_file; + + // The module's identifier. For recent pe/pdb files, the identifier consists + // of the pe/pdb's guid, in uppercase hexadecimal form without any dashes + // or separators, followed immediately by the pe/pdb's age, also in + // uppercase hexadecimal form. For older pe/pdb files which have no guid, + // the identifier is the pe/pdb's 32-bit signature value, in zero-padded + // hexadecimal form, followed immediately by the pe/pdb's age, in lowercase + // hexadecimal form. + wstring debug_identifier; + + // A string identifying the cpu that the pe/pdb is associated with. + // Currently, this may be "x86" or "unknown". + wstring cpu; +}; + +// A structure that carries information that identifies a PE file, +// either an EXE or a DLL. +struct PEModuleInfo { + // The basename of the PE file. + wstring code_file; + + // The PE file's code identifier, which consists of its timestamp + // and file size concatenated together into a single hex string. + // (The fields IMAGE_OPTIONAL_HEADER::SizeOfImage and + // IMAGE_FILE_HEADER::TimeDateStamp, as defined in the ImageHlp + // documentation.) This is not well documented, if it's documented + // at all, but it's what symstore does and what DbgHelp supports. + wstring code_identifier; +}; + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_MODULE_INFO_H_ diff --git a/src/common/windows/omap.cc b/src/common/windows/omap.cc new file mode 100644 index 0000000..1ffcec7 --- /dev/null +++ b/src/common/windows/omap.cc @@ -0,0 +1,720 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This contains a suite of tools for transforming symbol information when +// when that information has been extracted from a PDB containing OMAP +// information. + +// OMAP information is a lightweight description of a mapping between two +// address spaces. It consists of two streams, each of them a vector 2-tuples. +// The OMAPTO stream contains tuples of the form +// +// (RVA in transformed image, RVA in original image) +// +// while the OMAPFROM stream contains tuples of the form +// +// (RVA in original image, RVA in transformed image) +// +// The entries in each vector are sorted by the first value of the tuple, and +// the lengths associated with a mapping are implicit as the distance between +// two successive addresses in the vector. + +// Consider a trivial 10-byte function described by the following symbol: +// +// Function: RVA 0x00001000, length 10, "foo" +// +// Now consider the same function, but with 5-bytes of instrumentation injected +// at offset 5. The OMAP streams describing this would look like: +// +// OMAPTO : [ [0x00001000, 0x00001000], +// [0x00001005, 0xFFFFFFFF], +// [0x0000100a, 0x00001005] ] +// OMAPFROM: [ [0x00001000, 0x00001000], +// [0x00001005, 0x0000100a] ] +// +// In this case the injected code has been marked as not originating in the +// source image, and thus it will have no symbol information at all. However, +// the injected code may also be associated with an original address range; +// for example, when prepending instrumentation to a basic block the +// instrumentation can be labelled as originating from the same source BB such +// that symbol resolution will still find the appropriate source code line +// number. In this case the OMAP stream would look like: +// +// OMAPTO : [ [0x00001000, 0x00001000], +// [0x00001005, 0x00001005], +// [0x0000100a, 0x00001005] ] +// OMAPFROM: [ [0x00001000, 0x00001000], +// [0x00001005, 0x0000100a] ] +// +// Suppose we asked DIA to lookup the symbol at location 0x0000100a of the +// instrumented image. It would first run this through the OMAPTO table and +// translate that address to 0x00001005. It would then lookup the symbol +// at that address and return the symbol for the function "foo". This is the +// correct result. +// +// However, if we query DIA for the length and address of the symbol it will +// tell us that it has length 10 and is at RVA 0x00001000. The location is +// correct, but the length doesn't take into account the 5-bytes of injected +// code. Symbol resolution works (starting from an instrumented address, +// mapping to an original address, and looking up a symbol), but the symbol +// metadata is incorrect. +// +// If we dump the symbols using DIA they will have their addresses +// appropriately transformed and reflect positions in the instrumented image. +// However, if we try to do a lookup using those symbols resolution can fail. +// For example, the address 0x0000100a will not map to the symbol for "foo", +// because DIA tells us it is at location 0x00001000 (correct) with length +// 10 (incorrect). The problem is one of order of operations: in this case +// we're attempting symbol resolution by looking up an instrumented address +// in the table of translated symbols. +// +// One way to handle this is to dump the OMAP information as part of the +// breakpad symbols. This requires the rest of the toolchain to be aware of +// OMAP information and to use it when present prior to performing lookup. The +// other option is to properly transform the symbols (updating length as well as +// position) so that resolution will work as expected for translated addresses. +// This is transparent to the rest of the toolchain. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/windows/omap.h" + +#include + +#include +#include +#include + +#include "common/windows/dia_util.h" + +namespace google_breakpad { + +namespace { + +static const wchar_t kOmapToDebugStreamName[] = L"OMAPTO"; +static const wchar_t kOmapFromDebugStreamName[] = L"OMAPFROM"; + +// Dependending on where this is used in breakpad we sometimes get min/max from +// windef, and other times from algorithm. To get around this we simply +// define our own min/max functions. +template +const T& Min(const T& t1, const T& t2) { return t1 < t2 ? t1 : t2; } +template +const T& Max(const T& t1, const T& t2) { return t1 > t2 ? t1 : t2; } + +// It makes things more readable to have two different OMAP types. We cast +// normal OMAPs into these. They must be the same size as the OMAP structure +// for this to work, hence the static asserts. +struct OmapOrigToTran { + DWORD rva_original; + DWORD rva_transformed; +}; +struct OmapTranToOrig { + DWORD rva_transformed; + DWORD rva_original; +}; +static_assert(sizeof(OmapOrigToTran) == sizeof(OMAP), + "OmapOrigToTran must have same size as OMAP."); +static_assert(sizeof(OmapTranToOrig) == sizeof(OMAP), + "OmapTranToOrig must have same size as OMAP."); +typedef std::vector OmapFromTable; +typedef std::vector OmapToTable; + +// Used for sorting and searching through a Mapping. +bool MappedRangeOriginalLess(const MappedRange& lhs, const MappedRange& rhs) { + if (lhs.rva_original < rhs.rva_original) + return true; + if (lhs.rva_original > rhs.rva_original) + return false; + return lhs.length < rhs.length; +} +bool MappedRangeMappedLess(const MappedRange& lhs, const MappedRange& rhs) { + if (lhs.rva_transformed < rhs.rva_transformed) + return true; + if (lhs.rva_transformed > rhs.rva_transformed) + return false; + return lhs.length < rhs.length; +} + +// Used for searching through the EndpointIndexMap. +bool EndpointIndexLess(const EndpointIndex& ei1, const EndpointIndex& ei2) { + return ei1.endpoint < ei2.endpoint; +} + +// Finds the debug stream with the given |name| in the given |session|, and +// populates |table| with its contents. Casts the data directly into OMAP +// structs. +bool FindAndLoadOmapTable(const wchar_t* name, + IDiaSession* session, + OmapTable* table) { + assert(name != NULL); + assert(session != NULL); + assert(table != NULL); + + CComPtr stream; + if (!FindDebugStream(name, session, &stream)) + return false; + assert(stream.p != NULL); + + LONG count = 0; + if (FAILED(stream->get_Count(&count))) { + fprintf(stderr, "IDiaEnumDebugStreamData::get_Count failed for stream " + "\"%ws\"\n", name); + return false; + } + + // Get the length of the stream in bytes. + DWORD bytes_read = 0; + ULONG count_read = 0; + if (FAILED(stream->Next(count, 0, &bytes_read, NULL, &count_read))) { + fprintf(stderr, "IDiaEnumDebugStreamData::Next failed while reading " + "length of stream \"%ws\"\n", name); + return false; + } + + // Ensure it's consistent with the OMAP data type. + DWORD bytes_expected = count * sizeof(OmapTable::value_type); + if (count * sizeof(OmapTable::value_type) != bytes_read) { + fprintf(stderr, "DIA debug stream \"%ws\" has an unexpected length", name); + return false; + } + + // Read the table. + table->resize(count); + bytes_read = 0; + count_read = 0; + if (FAILED(stream->Next(count, bytes_expected, &bytes_read, + reinterpret_cast(&table->at(0)), + &count_read))) { + fprintf(stderr, "IDiaEnumDebugStreamData::Next failed while reading " + "data from stream \"%ws\"\n", name); + return false; + } + + return true; +} + +// This determines the original image length by looking through the segment +// table. +bool GetOriginalImageLength(IDiaSession* session, DWORD* image_length) { + assert(session != NULL); + assert(image_length != NULL); + + CComPtr enum_segments; + if (!FindTable(session, &enum_segments)) + return false; + assert(enum_segments.p != NULL); + + DWORD temp_image_length = 0; + CComPtr segment; + ULONG fetched = 0; + while (SUCCEEDED(enum_segments->Next(1, &segment, &fetched)) && + fetched == 1) { + assert(segment.p != NULL); + + DWORD rva = 0; + DWORD length = 0; + DWORD frame = 0; + if (FAILED(segment->get_relativeVirtualAddress(&rva)) || + FAILED(segment->get_length(&length)) || + FAILED(segment->get_frame(&frame))) { + fprintf(stderr, "Failed to get basic properties for IDiaSegment\n"); + return false; + } + + if (frame > 0) { + DWORD segment_end = rva + length; + if (segment_end > temp_image_length) + temp_image_length = segment_end; + } + segment.Release(); + } + + *image_length = temp_image_length; + return true; +} + +// Detects regions of the original image that have been removed in the +// transformed image, and sets the 'removed' property on all mapped ranges +// immediately preceding a gap. The mapped ranges must be sorted by +// 'rva_original'. +void FillInRemovedLengths(Mapping* mapping) { + assert(mapping != NULL); + + // Find and fill gaps. We do this with two sweeps. We first sweep forward + // looking for gaps. When we identify a gap we then sweep forward with a + // second scan and set the 'removed' property for any intervals that + // immediately precede the gap. + // + // Gaps are typically between two successive intervals, but not always: + // + // Range 1: --------------- + // Range 2: ------- + // Range 3: ------------- + // Gap : ****** + // + // In the above example the gap is between range 1 and range 3. A forward + // sweep finds the gap, and a second forward sweep identifies that range 1 + // immediately precedes the gap and sets its 'removed' property. + + size_t fill = 0; + DWORD rva_front = 0; + for (size_t find = 0; find < mapping->size(); ++find) { +#ifndef NDEBUG + // We expect the mapped ranges to be sorted by 'rva_original'. + if (find > 0) { + assert(mapping->at(find - 1).rva_original <= + mapping->at(find).rva_original); + } +#endif + + if (rva_front < mapping->at(find).rva_original) { + // We've found a gap. Fill it in by setting the 'removed' property for + // any affected intervals. + DWORD removed = mapping->at(find).rva_original - rva_front; + for (; fill < find; ++fill) { + if (mapping->at(fill).rva_original + mapping->at(fill).length != + rva_front) { + continue; + } + + // This interval ends right where the gap starts. It needs to have its + // 'removed' information filled in. + mapping->at(fill).removed = removed; + } + } + + // Advance the front that indicates the covered portion of the image. + rva_front = mapping->at(find).rva_original + mapping->at(find).length; + } +} + +// Builds a unified view of the mapping between the original and transformed +// image space by merging OMAPTO and OMAPFROM data. +void BuildMapping(const OmapData& omap_data, Mapping* mapping) { + assert(mapping != NULL); + + mapping->clear(); + + if (omap_data.omap_from.empty() || omap_data.omap_to.empty()) + return; + + // The names 'omap_to' and 'omap_from' are awfully confusing, so we make + // ourselves more explicit here. This cast is only safe because the underlying + // types have the exact same size. + const OmapToTable& tran2orig = + reinterpret_cast(omap_data.omap_to); + const OmapFromTable& orig2tran = reinterpret_cast( + omap_data.omap_from); + + // Handle the range of data at the beginning of the image. This is not usually + // specified by the OMAP data. + if (tran2orig[0].rva_transformed > 0 && orig2tran[0].rva_original > 0) { + DWORD header_transformed = tran2orig[0].rva_transformed; + DWORD header_original = orig2tran[0].rva_original; + DWORD header = Min(header_transformed, header_original); + + MappedRange mr = {}; + mr.length = header; + mr.injected = header_transformed - header; + mr.removed = header_original - header; + mapping->push_back(mr); + } + + // Convert the implied lengths to explicit lengths, and infer which content + // has been injected into the transformed image. Injected content is inferred + // as regions of the transformed address space that does not map back to + // known valid content in the original image. + for (size_t i = 0; i < tran2orig.size(); ++i) { + const OmapTranToOrig& o1 = tran2orig[i]; + + // This maps to content that is outside the original image, thus it + // describes injected content. We can skip this entry. + if (o1.rva_original >= omap_data.length_original) + continue; + + // Calculate the length of the current OMAP entry. This is implicit as the + // distance between successive |rva| values, capped at the end of the + // original image. + DWORD length = 0; + if (i + 1 < tran2orig.size()) { + const OmapTranToOrig& o2 = tran2orig[i + 1]; + + // We expect the table to be sorted by rva_transformed. + assert(o1.rva_transformed <= o2.rva_transformed); + + length = o2.rva_transformed - o1.rva_transformed; + if (o1.rva_original + length > omap_data.length_original) { + length = omap_data.length_original - o1.rva_original; + } + } else { + length = omap_data.length_original - o1.rva_original; + } + + // Zero-length entries don't describe anything and can be ignored. + if (length == 0) + continue; + + // Any gaps in the transformed address-space are due to injected content. + if (!mapping->empty()) { + MappedRange& prev_mr = mapping->back(); + prev_mr.injected += o1.rva_transformed - + (prev_mr.rva_transformed + prev_mr.length); + } + + MappedRange mr = {}; + mr.rva_original = o1.rva_original; + mr.rva_transformed = o1.rva_transformed; + mr.length = length; + mapping->push_back(mr); + } + + // Sort based on the original image addresses. + std::sort(mapping->begin(), mapping->end(), MappedRangeOriginalLess); + + // Fill in the 'removed' lengths by looking for gaps in the coverage of the + // original address space. + FillInRemovedLengths(mapping); + + return; +} + +void BuildEndpointIndexMap(ImageMap* image_map) { + assert(image_map != NULL); + + if (image_map->mapping.size() == 0) + return; + + const Mapping& mapping = image_map->mapping; + EndpointIndexMap& eim = image_map->endpoint_index_map; + + // Get the unique set of interval endpoints. + std::set endpoints; + for (size_t i = 0; i < mapping.size(); ++i) { + endpoints.insert(mapping[i].rva_original); + endpoints.insert(mapping[i].rva_original + + mapping[i].length + + mapping[i].removed); + } + + // Use the endpoints to initialize the secondary search structure for the + // mapping. + eim.resize(endpoints.size()); + std::set::const_iterator it = endpoints.begin(); + for (size_t i = 0; it != endpoints.end(); ++it, ++i) { + eim[i].endpoint = *it; + eim[i].index = mapping.size(); + } + + // For each endpoint we want the smallest index of any interval containing + // it. We iterate over the intervals and update the indices associated with + // each interval endpoint contained in the current interval. In the general + // case of an arbitrary set of intervals this is O(n^2), but the structure of + // OMAP data makes this O(n). + for (size_t i = 0; i < mapping.size(); ++i) { + EndpointIndex ei1 = { mapping[i].rva_original, 0 }; + EndpointIndexMap::iterator it1 = std::lower_bound( + eim.begin(), eim.end(), ei1, EndpointIndexLess); + + EndpointIndex ei2 = { mapping[i].rva_original + mapping[i].length + + mapping[i].removed, 0 }; + EndpointIndexMap::iterator it2 = std::lower_bound( + eim.begin(), eim.end(), ei2, EndpointIndexLess); + + for (; it1 != it2; ++it1) + it1->index = Min(i, it1->index); + } +} + +void BuildSubsequentRVAMap(const OmapData& omap_data, + std::map* subsequent) { + assert(subsequent->empty()); + const OmapFromTable& orig2tran = + reinterpret_cast(omap_data.omap_from); + + if (orig2tran.empty()) + return; + + for (size_t i = 0; i < orig2tran.size() - 1; ++i) { + // Expect that orig2tran is sorted. + if (orig2tran[i].rva_original >= orig2tran[i + 1].rva_original) { + fprintf(stderr, "OMAP 'from' table unexpectedly unsorted\n"); + subsequent->clear(); + return; + } + subsequent->insert(std::make_pair(orig2tran[i].rva_original, + orig2tran[i + 1].rva_original)); + } +} + +// Clips the given mapped range. +void ClipMappedRangeOriginal(const AddressRange& clip_range, + MappedRange* mapped_range) { + assert(mapped_range != NULL); + + // The clipping range is entirely outside of the mapped range. + if (clip_range.end() <= mapped_range->rva_original || + mapped_range->rva_original + mapped_range->length + + mapped_range->removed <= clip_range.rva) { + mapped_range->length = 0; + mapped_range->injected = 0; + mapped_range->removed = 0; + return; + } + + // Clip the left side. + if (mapped_range->rva_original < clip_range.rva) { + DWORD clip_left = clip_range.rva - mapped_range->rva_original; + mapped_range->rva_original += clip_left; + mapped_range->rva_transformed += clip_left; + + if (clip_left > mapped_range->length) { + // The left clipping boundary entirely erases the content section of the + // range. + DWORD trim = clip_left - mapped_range->length; + mapped_range->length = 0; + mapped_range->injected -= Min(trim, mapped_range->injected); + // We know that trim <= mapped_range->remove. + mapped_range->removed -= trim; + } else { + // The left clipping boundary removes some, but not all, of the content. + // As such it leaves the removed/injected component intact. + mapped_range->length -= clip_left; + } + } + + // Clip the right side. + DWORD end_original = mapped_range->rva_original + mapped_range->length; + if (clip_range.end() < end_original) { + // The right clipping boundary lands in the 'content' section of the range, + // entirely clearing the injected/removed portion. + DWORD clip_right = end_original - clip_range.end(); + mapped_range->length -= clip_right; + mapped_range->injected = 0; + mapped_range->removed = 0; + return; + } else { + // The right clipping boundary is outside of the content, but may affect + // the removed/injected portion of the range. + DWORD end_removed = end_original + mapped_range->removed; + if (clip_range.end() < end_removed) + mapped_range->removed = clip_range.end() - end_original; + + DWORD end_injected = end_original + mapped_range->injected; + if (clip_range.end() < end_injected) + mapped_range->injected = clip_range.end() - end_original; + } + + return; +} + +} // namespace + +int AddressRange::Compare(const AddressRange& rhs) const { + if (end() <= rhs.rva) + return -1; + if (rhs.end() <= rva) + return 1; + return 0; +} + +bool GetOmapDataAndDisableTranslation(IDiaSession* session, + OmapData* omap_data) { + assert(session != NULL); + assert(omap_data != NULL); + + CComPtr address_map; + if (FAILED(session->QueryInterface(&address_map))) { + fprintf(stderr, "IDiaSession::QueryInterface(IDiaAddressMap) failed\n"); + return false; + } + assert(address_map.p != NULL); + + BOOL omap_enabled = FALSE; + if (FAILED(address_map->get_addressMapEnabled(&omap_enabled))) { + fprintf(stderr, "IDiaAddressMap::get_addressMapEnabled failed\n"); + return false; + } + + if (!omap_enabled) { + // We indicate the non-presence of OMAP data by returning empty tables. + omap_data->omap_from.clear(); + omap_data->omap_to.clear(); + omap_data->length_original = 0; + return true; + } + + // OMAP data is present. Disable translation. + if (FAILED(address_map->put_addressMapEnabled(FALSE))) { + fprintf(stderr, "IDiaAddressMap::put_addressMapEnabled failed\n"); + return false; + } + + // Read the OMAP streams. + if (!FindAndLoadOmapTable(kOmapFromDebugStreamName, + session, + &omap_data->omap_from)) { + return false; + } + if (!FindAndLoadOmapTable(kOmapToDebugStreamName, + session, + &omap_data->omap_to)) { + return false; + } + + // Get the lengths of the address spaces. + if (!GetOriginalImageLength(session, &omap_data->length_original)) + return false; + + return true; +} + +void BuildImageMap(const OmapData& omap_data, ImageMap* image_map) { + assert(image_map != NULL); + + BuildMapping(omap_data, &image_map->mapping); + BuildEndpointIndexMap(image_map); + BuildSubsequentRVAMap(omap_data, &image_map->subsequent_rva_block); +} + +void MapAddressRange(const ImageMap& image_map, + const AddressRange& original_range, + AddressRangeVector* mapped_ranges) { + assert(mapped_ranges != NULL); + + const Mapping& map = image_map.mapping; + + // Handle the trivial case of an empty image_map. This means that there is + // no transformation to be applied, and we can simply return the original + // range. + if (map.empty()) { + mapped_ranges->push_back(original_range); + return; + } + + // If we get a query of length 0 we need to handle it by using a non-zero + // query length. + AddressRange query_range(original_range); + if (query_range.length == 0) + query_range.length = 1; + + // Find the range of intervals that can potentially intersect our query range. + size_t imin = 0; + size_t imax = 0; + { + // The index of the earliest possible range that can affect is us done by + // searching through the secondary indexing structure. + const EndpointIndexMap& eim = image_map.endpoint_index_map; + EndpointIndex q1 = { query_range.rva, 0 }; + EndpointIndexMap::const_iterator it1 = std::lower_bound( + eim.begin(), eim.end(), q1, EndpointIndexLess); + if (it1 == eim.end()) { + imin = map.size(); + } else { + // Backup to find the interval that contains our query point. + if (it1 != eim.begin() && query_range.rva < it1->endpoint) + --it1; + imin = it1->index; + } + + // The first range that can't possibly intersect us is found by searching + // through the image map directly as it is already sorted by interval start + // point. + MappedRange q2 = { query_range.end(), 0 }; + Mapping::const_iterator it2 = std::lower_bound( + map.begin(), map.end(), q2, MappedRangeOriginalLess); + imax = it2 - map.begin(); + } + + // Find all intervals that intersect the query range. + Mapping temp_map; + for (size_t i = imin; i < imax; ++i) { + MappedRange mr = map[i]; + ClipMappedRangeOriginal(query_range, &mr); + if (mr.length + mr.injected > 0) + temp_map.push_back(mr); + } + + // If there are no intersecting ranges then the query range has been removed + // from the image in question. + if (temp_map.empty()) + return; + + // Sort based on transformed addresses. + std::sort(temp_map.begin(), temp_map.end(), MappedRangeMappedLess); + + // Zero-length queries can't actually be merged. We simply output the set of + // unique RVAs that correspond to the query RVA. + if (original_range.length == 0) { + mapped_ranges->push_back(AddressRange(temp_map[0].rva_transformed, 0)); + for (size_t i = 1; i < temp_map.size(); ++i) { + if (temp_map[i].rva_transformed > mapped_ranges->back().rva) + mapped_ranges->push_back(AddressRange(temp_map[i].rva_transformed, 0)); + } + return; + } + + // Merge any ranges that are consecutive in the mapped image. We merge over + // injected content if it makes ranges contiguous, but we ignore any injected + // content at the tail end of a range. This allows us to detect symbols that + // have been lengthened by injecting content in the middle. However, it + // misses the case where content has been injected at the head or the tail. + // The problem is that it doesn't know whether to attribute it to the + // preceding or following symbol. It is up to the author of the transform to + // output explicit OMAP info in these cases to ensure full coverage of the + // transformed address space. + DWORD rva_begin = temp_map[0].rva_transformed; + DWORD rva_cur_content = rva_begin + temp_map[0].length; + DWORD rva_cur_injected = rva_cur_content + temp_map[0].injected; + for (size_t i = 1; i < temp_map.size(); ++i) { + if (rva_cur_injected < temp_map[i].rva_transformed) { + // This marks the end of a continuous range in the image. Output the + // current range and start a new one. + if (rva_begin < rva_cur_content) { + mapped_ranges->push_back( + AddressRange(rva_begin, rva_cur_content - rva_begin)); + } + rva_begin = temp_map[i].rva_transformed; + } + + rva_cur_content = temp_map[i].rva_transformed + temp_map[i].length; + rva_cur_injected = rva_cur_content + temp_map[i].injected; + } + + // Output the range in progress. + if (rva_begin < rva_cur_content) { + mapped_ranges->push_back( + AddressRange(rva_begin, rva_cur_content - rva_begin)); + } + + return; +} + +} // namespace google_breakpad diff --git a/src/common/windows/omap.h b/src/common/windows/omap.h new file mode 100644 index 0000000..51601fa --- /dev/null +++ b/src/common/windows/omap.h @@ -0,0 +1,72 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Provides an API for mapping symbols through OMAP information, if a PDB file +// is augmented with it. This allows breakpad to work with addresses in +// transformed images by transforming the symbols themselves, rather than +// transforming addresses prior to querying symbols (the way it is typically +// done by Windows-native tools, including the DIA). + +#ifndef COMMON_WINDOWS_OMAP_H_ +#define COMMON_WINDOWS_OMAP_H_ + +#include "common/windows/omap_internal.h" + +namespace google_breakpad { + +// If the given session contains OMAP data this extracts it, populating +// |omap_data|, and then disabling automatic translation for the session. +// OMAP data is present in the PDB if |omap_data| is not empty. This returns +// true on success, false otherwise. +bool GetOmapDataAndDisableTranslation(IDiaSession* dia_session, + OmapData* omap_data); + +// Given raw OMAP data builds an ImageMap. This can be used to query individual +// image ranges using MapAddressRange. +// |omap_data|| is the OMAP data extracted from the PDB. +// |image_map| will be populated with a description of the image mapping. If +// |omap_data| is empty then this will also be empty. +void BuildImageMap(const OmapData& omap_data, ImageMap* image_map); + +// Given an address range in the original image space determines how exactly it +// has been tranformed. +// |omap_data| is the OMAP data extracted from the PDB, which must not be +// empty. +// |original_range| is the address range in the original image being queried. +// |mapped_ranges| will be populated with a full description of the mapping. +// They may be disjoint in the transformed image so a vector is needed to +// fully represent the mapping. This will be appended to if it is not +// empty. If |omap_data| is empty then |mapped_ranges| will simply be +// populated with a copy of |original_range| (the identity transform). +void MapAddressRange(const ImageMap& image_map, + const AddressRange& original_range, + AddressRangeVector* mapped_ranges); + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_OMAP_H_ diff --git a/src/common/windows/omap_internal.h b/src/common/windows/omap_internal.h new file mode 100644 index 0000000..cd20d9f --- /dev/null +++ b/src/common/windows/omap_internal.h @@ -0,0 +1,140 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Declares internal implementation details for functionality in omap.h and +// omap.cc. + +#ifndef COMMON_WINDOWS_OMAP_INTERNAL_H_ +#define COMMON_WINDOWS_OMAP_INTERNAL_H_ + +#include +#include + +#include +#include + +namespace google_breakpad { + +// The OMAP struct is defined by debughlp.h, which doesn't play nicely with +// imagehlp.h. We simply redefine it. +struct OMAP { + DWORD rva; + DWORD rvaTo; +}; +static_assert(sizeof(OMAP) == 8, "Wrong size for OMAP structure."); +typedef std::vector OmapTable; + +// This contains the OMAP data extracted from an image. +struct OmapData { + // The table of OMAP entries describing the transformation from the + // original image to the transformed image. + OmapTable omap_from; + // The table of OMAP entries describing the transformation from the + // instrumented image to the original image. + OmapTable omap_to; + // The length of the original untransformed image. + DWORD length_original; + + OmapData() : length_original(0) { } +}; + +// This represents a range of addresses in an image. +struct AddressRange { + DWORD rva; + DWORD length; + + AddressRange() : rva(0), length(0) { } + AddressRange(DWORD rva, DWORD length) : rva(rva), length(length) { } + + // Returns the end address of this range. + DWORD end() const { return rva + length; } + + // Addreses only compare as less-than or greater-than if they are not + // overlapping. Otherwise, they compare equal. + int Compare(const AddressRange& rhs) const; + bool operator<(const AddressRange& rhs) const { return Compare(rhs) == -1; } + bool operator>(const AddressRange& rhs) const { return Compare(rhs) == 1; } + + // Equality operators compare exact values. + bool operator==(const AddressRange& rhs) const { + return rva == rhs.rva && length == rhs.length; + } + bool operator!=(const AddressRange& rhs) const { return !((*this) == rhs); } +}; + +typedef std::vector AddressRangeVector; + +// This represents an address range in an original image, and its corresponding +// range in the transformed image. +struct MappedRange { + // An address in the original image. + DWORD rva_original; + // The corresponding addresses in the transformed image. + DWORD rva_transformed; + // The length of the address range. + DWORD length; + // It is possible for code to be injected into a transformed image, for which + // there is no corresponding code in the original image. If this range of + // transformed image is immediately followed by such injected code we maintain + // a record of its length here. + DWORD injected; + // It is possible for code to be removed from the original image. This happens + // for things like padding between blocks. There is no actual content lost, + // but the spacing between items may be lost. This keeps track of any removed + // content immediately following the |original| range. + DWORD removed; +}; +// A vector of mapped ranges is used as a more useful representation of +// OMAP data. +typedef std::vector Mapping; + +// Used as a secondary search structure accompanying a Mapping. +struct EndpointIndex { + DWORD endpoint; + size_t index; +}; +typedef std::vector EndpointIndexMap; + +// An ImageMap is vector of mapped ranges, plus a secondary index into it for +// doing interval searches. (An interval tree would also work, but is overkill +// because we don't need insertion and deletion.) +struct ImageMap { + // This is a description of the mapping between original and transformed + // image, sorted by addresses in the original image. + Mapping mapping; + // For all interval endpoints in |mapping| this stores the minimum index of + // an interval in |mapping| that contains the endpoint. Useful for doing + // interval intersection queries. + EndpointIndexMap endpoint_index_map; + + std::map subsequent_rva_block; +}; + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_OMAP_INTERNAL_H_ diff --git a/src/common/windows/omap_unittest.cc b/src/common/windows/omap_unittest.cc new file mode 100644 index 0000000..ebe0d47 --- /dev/null +++ b/src/common/windows/omap_unittest.cc @@ -0,0 +1,333 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Unittests for OMAP related functions. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/windows/omap.h" + +#include "breakpad_googletest_includes.h" + +namespace google_breakpad { + +// Equality operators for ContainerEq. These must be outside of the anonymous +// namespace in order for them to be found. +bool operator==(const MappedRange& mr1, const MappedRange& mr2) { + return mr1.rva_original == mr2.rva_original && + mr1.rva_transformed == mr2.rva_transformed && + mr1.length == mr2.length && + mr1.injected == mr2.injected && + mr1.removed == mr2.removed; +} +bool operator==(const EndpointIndex& ei1, const EndpointIndex& ei2) { + return ei1.endpoint == ei2.endpoint && ei1.index == ei2.index; +} + +// Pretty printers for more meaningful error messages. Also need to be outside +// the anonymous namespace. +std::ostream& operator<<(std::ostream& os, const MappedRange& mr) { + os << "MappedRange(rva_original=" << mr.rva_original + << ", rva_transformed=" << mr.rva_transformed + << ", length=" << mr.length + << ", injected=" << mr.injected + << ", removed=" << mr.removed << ")"; + return os; +} +std::ostream& operator<<(std::ostream& os, const EndpointIndex& ei) { + os << "EndpointIndex(endpoint=" << ei.endpoint + << ", index=" << ei.index << ")"; + return os; +} +std::ostream& operator<<(std::ostream& os, const AddressRange& ar) { + os << "AddressRange(rva=" << ar.rva << ", length=" << ar.length << ")"; + return os; +} + +namespace { + +OMAP CreateOmap(DWORD rva, DWORD rvaTo) { + OMAP o = { rva, rvaTo }; + return o; +} + +MappedRange CreateMappedRange(DWORD rva_original, + DWORD rva_transformed, + DWORD length, + DWORD injected, + DWORD removed) { + MappedRange mr = { rva_original, rva_transformed, length, injected, removed }; + return mr; +} + +EndpointIndex CreateEndpointIndex(DWORD endpoint, size_t index) { + EndpointIndex ei = { endpoint, index }; + return ei; +} + +// (C is removed) +// Original : A B C D E F G H +// Transformed: A B D F E * H1 G1 G2 H2 +// (* is injected, G is copied, H is split) +// A is implied. + +// Layout of the original image. +const AddressRange B(100, 15); +const AddressRange C(B.end(), 10); +const AddressRange D(C.end(), 25); +const AddressRange E(D.end(), 10); +const AddressRange F(E.end(), 40); +const AddressRange G(F.end(), 3); +const AddressRange H(G.end(), 7); + +// Layout of the transformed image. +const AddressRange Bt(100, 15); +const AddressRange Dt(Bt.end(), 20); // D is shortened. +const AddressRange Ft(Dt.end(), F.length); +const AddressRange Et(Ft.end(), E.length); +const AddressRange injected(Et.end(), 5); +const AddressRange H1t(injected.end(), 4); // H is split. +const AddressRange G1t(H1t.end(), G.length); // G is copied. +const AddressRange G2t(G1t.end(), G.length); // G is copied. +const AddressRange H2t(G2t.end(), 3); // H is split. + +class BuildImageMapTest : public testing::Test { + public: + static const DWORD kInvalidAddress = 0xFFFFFFFF; + + void InitOmapData() { + omap_data.length_original = H.end(); + + // Build the OMAPTO vector (from transformed to original). + omap_data.omap_to.push_back(CreateOmap(Bt.rva, B.rva)); + omap_data.omap_to.push_back(CreateOmap(Dt.rva, D.rva)); + omap_data.omap_to.push_back(CreateOmap(Ft.rva, F.rva)); + omap_data.omap_to.push_back(CreateOmap(Et.rva, E.rva)); + omap_data.omap_to.push_back(CreateOmap(injected.rva, kInvalidAddress)); + omap_data.omap_to.push_back(CreateOmap(H1t.rva, H.rva)); + omap_data.omap_to.push_back(CreateOmap(G1t.rva, G.rva)); + omap_data.omap_to.push_back(CreateOmap(G2t.rva, G.rva)); + omap_data.omap_to.push_back(CreateOmap(H2t.rva, H.rva + H1t.length)); + omap_data.omap_to.push_back(CreateOmap(H2t.end(), kInvalidAddress)); + + // Build the OMAPFROM vector (from original to transformed). + omap_data.omap_from.push_back(CreateOmap(B.rva, Bt.rva)); + omap_data.omap_from.push_back(CreateOmap(C.rva, kInvalidAddress)); + omap_data.omap_from.push_back(CreateOmap(D.rva, Dt.rva)); + omap_data.omap_from.push_back(CreateOmap(E.rva, Et.rva)); + omap_data.omap_from.push_back(CreateOmap(F.rva, Ft.rva)); + omap_data.omap_from.push_back(CreateOmap(G.rva, G1t.rva)); + omap_data.omap_from.push_back(CreateOmap(H.rva, H1t.rva)); + omap_data.omap_from.push_back(CreateOmap(H.rva + H1t.length, H2t.rva)); + omap_data.omap_from.push_back(CreateOmap(H.end(), kInvalidAddress)); + } + + OmapData omap_data; +}; + +} // namespace + +TEST_F(BuildImageMapTest, EmptyImageMapOnEmptyOmapData) { + ASSERT_EQ(0u, omap_data.omap_from.size()); + ASSERT_EQ(0u, omap_data.omap_to.size()); + ASSERT_EQ(0u, omap_data.length_original); + + ImageMap image_map; + BuildImageMap(omap_data, &image_map); + EXPECT_EQ(0u, image_map.mapping.size()); + EXPECT_EQ(0u, image_map.endpoint_index_map.size()); +} + +TEST_F(BuildImageMapTest, ImageMapIsCorrect) { + InitOmapData(); + ASSERT_LE(0u, omap_data.omap_from.size()); + ASSERT_LE(0u, omap_data.omap_to.size()); + ASSERT_LE(0u, omap_data.length_original); + + ImageMap image_map; + BuildImageMap(omap_data, &image_map); + EXPECT_LE(9u, image_map.mapping.size()); + EXPECT_LE(9u, image_map.endpoint_index_map.size()); + + Mapping mapping; + mapping.push_back(CreateMappedRange(0, 0, B.rva, 0, 0)); + // C is removed, and it originally comes immediately after B. + mapping.push_back(CreateMappedRange(B.rva, Bt.rva, B.length, 0, C.length)); + // D is shortened by a length of 5. + mapping.push_back(CreateMappedRange(D.rva, Dt.rva, Dt.length, 0, 5)); + // The injected content comes immediately after E in the transformed image. + mapping.push_back(CreateMappedRange(E.rva, Et.rva, E.length, injected.length, + 0)); + mapping.push_back(CreateMappedRange(F.rva, Ft.rva, F.length, 0, 0)); + // G is copied so creates two entries. + mapping.push_back(CreateMappedRange(G.rva, G1t.rva, G.length, 0, 0)); + mapping.push_back(CreateMappedRange(G.rva, G2t.rva, G.length, 0, 0)); + // H is split, so create two entries. + mapping.push_back(CreateMappedRange(H.rva, H1t.rva, H1t.length, 0, 0)); + mapping.push_back(CreateMappedRange(H.rva + H1t.length, H2t.rva, H2t.length, + 0, 0)); + EXPECT_THAT(mapping, + testing::ContainerEq(image_map.mapping)); + + EndpointIndexMap endpoint_index_map; + endpoint_index_map.push_back(CreateEndpointIndex(0, 0)); + endpoint_index_map.push_back(CreateEndpointIndex(B.rva, 1)); + endpoint_index_map.push_back(CreateEndpointIndex(D.rva, 2)); + endpoint_index_map.push_back(CreateEndpointIndex(E.rva, 3)); + endpoint_index_map.push_back(CreateEndpointIndex(F.rva, 4)); + // G is duplicated so 2 ranges map back to it, hence the skip from 5 to 7. + endpoint_index_map.push_back(CreateEndpointIndex(G.rva, 5)); + // H is split so we expect 2 endpoints to show up attributed to it. + endpoint_index_map.push_back(CreateEndpointIndex(H.rva, 7)); + endpoint_index_map.push_back(CreateEndpointIndex(H.rva + H1t.length, 8)); + endpoint_index_map.push_back(CreateEndpointIndex(H.end(), 9)); + EXPECT_THAT(endpoint_index_map, + testing::ContainerEq(image_map.endpoint_index_map)); +} + +namespace { + +class MapAddressRangeTest : public BuildImageMapTest { + public: + typedef BuildImageMapTest Super; + virtual void SetUp() { + Super::SetUp(); + InitOmapData(); + BuildImageMap(omap_data, &image_map); + } + + ImageMap image_map; + + private: + using BuildImageMapTest::InitOmapData; + using BuildImageMapTest::omap_data; +}; + +} // namespace + +TEST_F(MapAddressRangeTest, EmptyImageMapReturnsIdentity) { + ImageMap im; + AddressRangeVector mapped_ranges; + AddressRange ar(0, 1024); + MapAddressRange(im, ar, &mapped_ranges); + EXPECT_EQ(1u, mapped_ranges.size()); + EXPECT_EQ(ar, mapped_ranges[0]); +} + +TEST_F(MapAddressRangeTest, MapOutOfImage) { + AddressRangeVector mapped_ranges; + MapAddressRange(image_map, AddressRange(H.end() + 10, 10), &mapped_ranges); + EXPECT_EQ(0u, mapped_ranges.size()); +} + +TEST_F(MapAddressRangeTest, MapIdentity) { + AddressRangeVector mapped_ranges; + MapAddressRange(image_map, B, &mapped_ranges); + EXPECT_EQ(1u, mapped_ranges.size()); + EXPECT_THAT(mapped_ranges, testing::ElementsAre(B)); +} + +TEST_F(MapAddressRangeTest, MapReorderedContiguous) { + AddressRangeVector mapped_ranges; + + AddressRange DEF(D.rva, F.end() - D.rva); + MapAddressRange(image_map, DEF, &mapped_ranges); + EXPECT_EQ(1u, mapped_ranges.size()); + + AddressRange DFEt(Dt.rva, Et.end() - Dt.rva); + EXPECT_THAT(mapped_ranges, testing::ElementsAre(DFEt)); +} + +TEST_F(MapAddressRangeTest, MapEmptySingle) { + AddressRangeVector mapped_ranges; + MapAddressRange(image_map, AddressRange(D.rva, 0), &mapped_ranges); + EXPECT_EQ(1u, mapped_ranges.size()); + EXPECT_THAT(mapped_ranges, testing::ElementsAre(AddressRange(Dt.rva, 0))); +} + +TEST_F(MapAddressRangeTest, MapEmptyCopied) { + AddressRangeVector mapped_ranges; + MapAddressRange(image_map, AddressRange(G.rva, 0), &mapped_ranges); + EXPECT_EQ(2u, mapped_ranges.size()); + EXPECT_THAT(mapped_ranges, testing::ElementsAre(AddressRange(G1t.rva, 0), + AddressRange(G2t.rva, 0))); +} + +TEST_F(MapAddressRangeTest, MapCopiedContiguous) { + AddressRangeVector mapped_ranges; + MapAddressRange(image_map, G, &mapped_ranges); + EXPECT_EQ(1u, mapped_ranges.size()); + EXPECT_THAT(mapped_ranges, testing::ElementsAre( + AddressRange(G1t.rva, G2t.end() - G1t.rva))); +} + +TEST_F(MapAddressRangeTest, MapSplitDiscontiguous) { + AddressRangeVector mapped_ranges; + MapAddressRange(image_map, H, &mapped_ranges); + EXPECT_EQ(2u, mapped_ranges.size()); + EXPECT_THAT(mapped_ranges, testing::ElementsAre(H1t, H2t)); +} + +TEST_F(MapAddressRangeTest, MapInjected) { + AddressRangeVector mapped_ranges; + + AddressRange EFGH(E.rva, H.end() - E.rva); + MapAddressRange(image_map, EFGH, &mapped_ranges); + EXPECT_EQ(1u, mapped_ranges.size()); + + AddressRange FEHGGHt(Ft.rva, H2t.end() - Ft.rva); + EXPECT_THAT(mapped_ranges, testing::ElementsAre(FEHGGHt)); +} + +TEST_F(MapAddressRangeTest, MapRemovedEntirely) { + AddressRangeVector mapped_ranges; + MapAddressRange(image_map, C, &mapped_ranges); + EXPECT_EQ(0u, mapped_ranges.size()); +} + +TEST_F(MapAddressRangeTest, MapRemovedPartly) { + AddressRangeVector mapped_ranges; + MapAddressRange(image_map, D, &mapped_ranges); + EXPECT_EQ(1u, mapped_ranges.size()); + EXPECT_THAT(mapped_ranges, testing::ElementsAre(Dt)); +} + +TEST_F(MapAddressRangeTest, MapFull) { + AddressRangeVector mapped_ranges; + + AddressRange AH(0, H.end()); + MapAddressRange(image_map, AH, &mapped_ranges); + EXPECT_EQ(1u, mapped_ranges.size()); + + AddressRange AHt(0, H2t.end()); + EXPECT_THAT(mapped_ranges, testing::ElementsAre(AHt)); +} + +} // namespace google_breakpad diff --git a/src/common/windows/pdb_source_line_writer.cc b/src/common/windows/pdb_source_line_writer.cc new file mode 100644 index 0000000..dd80a6d --- /dev/null +++ b/src/common/windows/pdb_source_line_writer.cc @@ -0,0 +1,1552 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/windows/pdb_source_line_writer.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "common/windows/dia_util.h" +#include "common/windows/guid_string.h" +#include "common/windows/pe_util.h" +#include "common/windows/string_utils-inl.h" + +// This constant may be missing from DbgHelp.h. See the documentation for +// IDiaSymbol::get_undecoratedNameEx. +#ifndef UNDNAME_NO_ECSU +#define UNDNAME_NO_ECSU 0x8000 // Suppresses enum/class/struct/union. +#endif // UNDNAME_NO_ECSU + +namespace google_breakpad { + +namespace { + +using std::set; +using std::unique_ptr; +using std::vector; + +// The symbol (among possibly many) selected to represent an rva. +struct SelectedSymbol { + SelectedSymbol(const CComPtr& symbol, bool is_public) + : symbol(symbol), is_public(is_public), is_multiple(false) {} + + // The symbol to use for an rva. + CComPtr symbol; + // Whether this is a public or function symbol. + bool is_public; + // Whether the rva has multiple associated symbols. An rva will correspond to + // multiple symbols in the case of linker identical symbol folding. + bool is_multiple; +}; + +// Maps rva to the symbol to use for that address. +typedef std::map SymbolMap; + +// Record this in the map as the selected symbol for the rva if it satisfies the +// necessary conditions. +void MaybeRecordSymbol(DWORD rva, + const CComPtr symbol, + bool is_public, + SymbolMap* map) { + SymbolMap::iterator loc = map->find(rva); + if (loc == map->end()) { + map->insert(std::make_pair(rva, SelectedSymbol(symbol, is_public))); + return; + } + + // Prefer function symbols to public symbols. + if (is_public && !loc->second.is_public) { + return; + } + + loc->second.is_multiple = true; + + // Take the 'least' symbol by lexicographical order of the decorated name. We + // use the decorated rather than undecorated name because computing the latter + // is expensive. + BSTR current_name, new_name; + loc->second.symbol->get_name(¤t_name); + symbol->get_name(&new_name); + if (wcscmp(new_name, current_name) < 0) { + loc->second.symbol = symbol; + loc->second.is_public = is_public; + } +} + + + +bool SymbolsMatch(IDiaSymbol* a, IDiaSymbol* b) { + DWORD a_section, a_offset, b_section, b_offset; + if (FAILED(a->get_addressSection(&a_section)) || + FAILED(a->get_addressOffset(&a_offset)) || + FAILED(b->get_addressSection(&b_section)) || + FAILED(b->get_addressOffset(&b_offset))) + return false; + return a_section == b_section && a_offset == b_offset; +} + +bool CreateDiaDataSourceInstance(CComPtr& data_source) { + if (SUCCEEDED(data_source.CoCreateInstance(CLSID_DiaSource))) { + return true; + } + + class DECLSPEC_UUID("B86AE24D-BF2F-4ac9-B5A2-34B14E4CE11D") DiaSource100; + class DECLSPEC_UUID("761D3BCD-1304-41D5-94E8-EAC54E4AC172") DiaSource110; + class DECLSPEC_UUID("3BFCEA48-620F-4B6B-81F7-B9AF75454C7D") DiaSource120; + class DECLSPEC_UUID("E6756135-1E65-4D17-8576-610761398C3C") DiaSource140; + + // If the CoCreateInstance call above failed, msdia*.dll is not registered. + // We can try loading the DLL corresponding to the #included DIA SDK, but + // the DIA headers don't provide a version. Lets try to figure out which DIA + // version we're compiling against by comparing CLSIDs. + const wchar_t* msdia_dll = nullptr; + if (CLSID_DiaSource == _uuidof(DiaSource100)) { + msdia_dll = L"msdia100.dll"; + } else if (CLSID_DiaSource == _uuidof(DiaSource110)) { + msdia_dll = L"msdia110.dll"; + } else if (CLSID_DiaSource == _uuidof(DiaSource120)) { + msdia_dll = L"msdia120.dll"; + } else if (CLSID_DiaSource == _uuidof(DiaSource140)) { + msdia_dll = L"msdia140.dll"; + } + + if (msdia_dll && + SUCCEEDED(NoRegCoCreate(msdia_dll, CLSID_DiaSource, IID_IDiaDataSource, + reinterpret_cast(&data_source)))) { + return true; + } + + return false; +} + +const DWORD kUndecorateOptions = UNDNAME_NO_MS_KEYWORDS | + UNDNAME_NO_FUNCTION_RETURNS | + UNDNAME_NO_ALLOCATION_MODEL | + UNDNAME_NO_ALLOCATION_LANGUAGE | + UNDNAME_NO_THISTYPE | + UNDNAME_NO_ACCESS_SPECIFIERS | + UNDNAME_NO_THROW_SIGNATURES | + UNDNAME_NO_MEMBER_TYPE | + UNDNAME_NO_RETURN_UDT_MODEL | + UNDNAME_NO_ECSU; + +#define arraysize(f) (sizeof(f) / sizeof(*f)) + +void StripLlvmSuffixAndUndecorate(BSTR* name) { + // LLVM sometimes puts a suffix on symbols to give them a globally unique + // name. The suffix is either some string preceded by a period (like in the + // Itanium ABI; also on Windows this is safe since periods are otherwise + // never part of mangled names), or a dollar sign followed by a 32-char hex + // string (this should go away in future LLVM versions). Strip such suffixes + // and try demangling again. + // + // + // Example symbol names with such suffixes: + // + // ?foo@@YAXXZ$5520c83448162c04f2b239db4b5a2c61 + // ?foo@@YAXXZ.llvm.13040715209719948753 + + if (**name != L'?') + return; // The name is already demangled. + + for (size_t i = 0, len = wcslen(*name); i < len; i++) { + wchar_t c = (*name)[i]; + + if (c == L'.' || (c == L'$' && len - i == 32 + 1)) { + (*name)[i] = L'\0'; + wchar_t undecorated[1024]; + DWORD res = UnDecorateSymbolNameW(*name, undecorated, + arraysize(undecorated), + kUndecorateOptions); + if (res == 0 || undecorated[0] == L'?') { + // Demangling failed; restore the symbol name and return. + (*name)[i] = c; + return; + } + + SysFreeString(*name); + *name = SysAllocString(undecorated); + return; + } + } +} + +// Prints the error message related to the error code as seen in +// Microsoft's MSVS documentation for loadDataFromPdb and loadDataForExe. +void PrintOpenError(HRESULT hr, const char* fn_name, const wchar_t* file) { + switch (hr) { + case E_PDB_NOT_FOUND: + fprintf(stderr, "%s: Failed to open %ws, or the file has an " + "invalid format.\n", fn_name, file); + break; + case E_PDB_FORMAT: + fprintf(stderr, "%s: Attempted to access %ws with an obsolete " + "format.\n", fn_name, file); + break; + case E_PDB_INVALID_SIG: + fprintf(stderr, "%s: Signature does not match for %ws.\n", fn_name, + file); + break; + case E_PDB_INVALID_AGE: + fprintf(stderr, "%s: Age does not match for %ws.\n", fn_name, file); + break; + case E_INVALIDARG: + fprintf(stderr, "%s: Invalid parameter for %ws.\n", fn_name, file); + break; + case E_UNEXPECTED: + fprintf(stderr, "%s: Data source has already been prepared for %ws.\n", + fn_name, file); + break; + default: + fprintf(stderr, "%s: Unexpected error 0x%lx, file: %ws.\n", + fn_name, hr, file); + break; + } +} + +} // namespace + +PDBSourceLineWriter::Inline::Inline(int inline_nest_level) + : inline_nest_level_(inline_nest_level) {} + +void PDBSourceLineWriter::Inline::SetOriginId(int origin_id) { + origin_id_ = origin_id; +} + +void PDBSourceLineWriter::Inline::ExtendRanges(const Line& line) { + if (ranges_.empty()) { + ranges_[line.rva] = line.length; + return; + } + auto iter = ranges_.lower_bound(line.rva); + // There is no overlap if this function is called with inlinee lines from + // the same callsite. + if (iter == ranges_.begin()) { + return; + } + if (line.rva + line.length == iter->first) { + // If they are connected, merge their ranges into one. + DWORD length = line.length + iter->second; + ranges_.erase(iter); + ranges_[line.rva] = length; + } else { + --iter; + if (iter->first + iter->second == line.rva) { + ranges_[iter->first] = iter->second + line.length; + } else { + ranges_[line.rva] = line.length; + } + } +} + +void PDBSourceLineWriter::Inline::SetCallSiteLine(DWORD call_site_line) { + call_site_line_ = call_site_line; +} + +void PDBSourceLineWriter::Inline::SetCallSiteFileId(DWORD call_site_file_id) { + call_site_file_id_ = call_site_file_id; +} + +void PDBSourceLineWriter::Inline::SetChildInlines( + vector> child_inlines) { + child_inlines_ = std::move(child_inlines); +} + +void PDBSourceLineWriter::Inline::Print(FILE* output) const { + // Ignore INLINE record that doesn't have any range. + if (ranges_.empty()) + return; + fprintf(output, "INLINE %d %lu %lu %d", inline_nest_level_, call_site_line_, + call_site_file_id_, origin_id_); + for (const auto& r : ranges_) { + fprintf(output, " %lx %lx", r.first, r.second); + } + fprintf(output, "\n"); + for (const unique_ptr& in : child_inlines_) { + in->Print(output); + } +} + +const PDBSourceLineWriter::Line* PDBSourceLineWriter::Lines::GetLine( + DWORD rva) const { + auto iter = line_map_.find(rva); + if (iter == line_map_.end()) { + // If not found exact rva, check if it's within any range. + iter = line_map_.lower_bound(rva); + if (iter == line_map_.begin()) + return nullptr; + --iter; + auto l = iter->second; + // This happens when there is no top level lines cover this rva (e.g. empty + // lines found for the function). Then we don't know the call site line + // number for this inlined function. + if (rva >= l.rva + l.length) + return nullptr; + } + return &iter->second; +} + +DWORD PDBSourceLineWriter::Lines::GetLineNum(DWORD rva) const { + const Line* line = GetLine(rva); + return line ? line->line_num : 0; +} + +DWORD PDBSourceLineWriter::Lines::GetFileId(DWORD rva) const { + const Line* line = GetLine(rva); + return line ? line->file_id : 0; +} + +void PDBSourceLineWriter::Lines::AddLine(const Line& line) { + if (line_map_.empty()) { + line_map_[line.rva] = line; + return; + } + + // Given an existing line in line_map_, remove it from line_map_ if it + // overlaps with the line and add a new line for the non-overlap range. Return + // true if there is an overlap. + auto intercept = [&](Line old_line) { + DWORD end = old_line.rva + old_line.length; + // No overlap. + if (old_line.rva >= line.rva + line.length || line.rva >= end) + return false; + // old_line is within the line. + if (old_line.rva >= line.rva && end <= line.rva + line.length) { + line_map_.erase(old_line.rva); + return true; + } + // Then there is a overlap. + if (old_line.rva < line.rva) { + old_line.length -= end - line.rva; + if (end > line.rva + line.length) { + Line new_line = old_line; + new_line.rva = line.rva + line.length; + new_line.length = end - new_line.rva; + line_map_[new_line.rva] = new_line; + } + } else { + line_map_.erase(old_line.rva); + old_line.length -= line.rva + line.length - old_line.rva; + old_line.rva = line.rva + line.length; + } + line_map_[old_line.rva] = old_line; + return true; + }; + + bool is_intercept; + // Use a loop in cases that there are multiple lines within the given line. + do { + auto iter = line_map_.lower_bound(line.rva); + if (iter == line_map_.end()) { + if (!line_map_.empty()) { + --iter; + intercept(iter->second); + } + break; + } + is_intercept = false; + if (iter != line_map_.begin()) { + // Check if the given line overlaps a line with smaller in the map. + auto prev = line_map_.lower_bound(line.rva); + --prev; + is_intercept = intercept(prev->second); + } + // Check if the given line overlaps a line with greater or equal rva in the + // map. Using operator |= here since it's possible that there are multiple + // lines with greater rva in the map overlap with the given line. + is_intercept |= intercept(iter->second); + } while (is_intercept); + line_map_[line.rva] = line; +} + +PDBSourceLineWriter::PDBSourceLineWriter(bool handle_inline) + : output_(NULL), handle_inline_(handle_inline) {} + +PDBSourceLineWriter::~PDBSourceLineWriter() { + Close(); +} + +bool PDBSourceLineWriter::SetCodeFile(const wstring& exe_file) { + if (code_file_.empty()) { + code_file_ = exe_file; + return true; + } + // Setting a different code file path is an error. It is success only if the + // file paths are the same. + return exe_file == code_file_; +} + +bool PDBSourceLineWriter::Open(const wstring& file, FileFormat format) { + Close(); + code_file_.clear(); + + if (FAILED(CoInitialize(NULL))) { + fprintf(stderr, "CoInitialize failed\n"); + return false; + } + + CComPtr data_source; + if (!CreateDiaDataSourceInstance(data_source)) { + const int kGuidSize = 64; + wchar_t classid[kGuidSize] = {0}; + StringFromGUID2(CLSID_DiaSource, classid, kGuidSize); + fprintf(stderr, "CoCreateInstance CLSID_DiaSource %S failed " + "(msdia*.dll unregistered?)\n", classid); + return false; + } + + HRESULT from_pdb_result; + HRESULT for_exe_result; + const wchar_t* file_name = file.c_str(); + switch (format) { + case PDB_FILE: + from_pdb_result = data_source->loadDataFromPdb(file_name); + if (FAILED(from_pdb_result)) { + PrintOpenError(from_pdb_result, "loadDataFromPdb", file_name); + return false; + } + break; + case EXE_FILE: + for_exe_result = data_source->loadDataForExe(file_name, NULL, NULL); + if (FAILED(for_exe_result)) { + PrintOpenError(for_exe_result, "loadDataForExe", file_name); + return false; + } + code_file_ = file; + break; + case ANY_FILE: + from_pdb_result = data_source->loadDataFromPdb(file_name); + if (FAILED(from_pdb_result)) { + for_exe_result = data_source->loadDataForExe(file_name, NULL, NULL); + if (FAILED(for_exe_result)) { + PrintOpenError(from_pdb_result, "loadDataFromPdb", file_name); + PrintOpenError(for_exe_result, "loadDataForExe", file_name); + return false; + } + code_file_ = file; + } + break; + default: + fprintf(stderr, "Unknown file format\n"); + return false; + } + + if (FAILED(data_source->openSession(&session_))) { + fprintf(stderr, "openSession failed\n"); + } + + return true; +} + +bool PDBSourceLineWriter::GetLine(IDiaLineNumber* dia_line, Line* line) const { + if (FAILED(dia_line->get_relativeVirtualAddress(&line->rva))) { + fprintf(stderr, "failed to get line rva\n"); + return false; + } + + if (FAILED(dia_line->get_length(&line->length))) { + fprintf(stderr, "failed to get line code length\n"); + return false; + } + + DWORD dia_source_id; + if (FAILED(dia_line->get_sourceFileId(&dia_source_id))) { + fprintf(stderr, "failed to get line source file id\n"); + return false; + } + // duplicate file names are coalesced to share one ID + line->file_id = GetRealFileID(dia_source_id); + + if (FAILED(dia_line->get_lineNumber(&line->line_num))) { + fprintf(stderr, "failed to get line number\n"); + return false; + } + return true; +} + +bool PDBSourceLineWriter::GetLines(IDiaEnumLineNumbers* lines, + Lines* line_list) const { + CComPtr line; + ULONG count; + + while (SUCCEEDED(lines->Next(1, &line, &count)) && count == 1) { + Line l; + if (!GetLine(line, &l)) + return false; + // Silently ignore zero-length lines. + if (l.length != 0) + line_list->AddLine(l); + line.Release(); + } + return true; +} + +void PDBSourceLineWriter::PrintLines(const Lines& lines) const { + // The line number format is: + // + for (const auto& kv : lines.GetLineMap()) { + const Line& l = kv.second; + AddressRangeVector ranges; + MapAddressRange(image_map_, AddressRange(l.rva, l.length), &ranges); + for (auto& range : ranges) { + fprintf(output_, "%lx %lx %lu %lu\n", range.rva, range.length, l.line_num, + l.file_id); + } + } +} + +bool PDBSourceLineWriter::PrintFunction(IDiaSymbol* function, + IDiaSymbol* block, + bool has_multiple_symbols) { + // The function format is: + // FUNC
    + DWORD rva; + if (FAILED(block->get_relativeVirtualAddress(&rva))) { + fprintf(stderr, "couldn't get rva\n"); + return false; + } + + ULONGLONG length; + if (FAILED(block->get_length(&length))) { + fprintf(stderr, "failed to get function length\n"); + return false; + } + + if (length == 0) { + // Silently ignore zero-length functions, which can infrequently pop up. + return true; + } + + CComBSTR name; + int stack_param_size; + if (!GetSymbolFunctionName(function, &name, &stack_param_size)) { + return false; + } + + // If the decorated name didn't give the parameter size, try to + // calculate it. + if (stack_param_size < 0) { + stack_param_size = GetFunctionStackParamSize(function); + } + + AddressRangeVector ranges; + MapAddressRange(image_map_, AddressRange(rva, static_cast(length)), + &ranges); + for (size_t i = 0; i < ranges.size(); ++i) { + const char* optional_multiple_field = has_multiple_symbols ? "m " : ""; + fprintf(output_, "FUNC %s%lx %lx %x %ws\n", optional_multiple_field, + ranges[i].rva, ranges[i].length, stack_param_size, name.m_str); + } + + CComPtr lines; + if (FAILED(session_->findLinesByRVA(rva, DWORD(length), &lines))) { + return false; + } + + // Get top level lines first, which later may be split into multiple smaller + // lines if any inline exists in their ranges if we want to handle inline. + Lines line_list; + if (!GetLines(lines, &line_list)) { + return false; + } + if (handle_inline_) { + vector> inlines; + if (!GetInlines(block, &line_list, 0, &inlines)) { + return false; + } + PrintInlines(inlines); + } + PrintLines(line_list); + return true; +} + +bool PDBSourceLineWriter::PrintSourceFiles() { + CComPtr global; + if (FAILED(session_->get_globalScope(&global))) { + fprintf(stderr, "get_globalScope failed\n"); + return false; + } + + CComPtr compilands; + if (FAILED(global->findChildren(SymTagCompiland, NULL, + nsNone, &compilands))) { + fprintf(stderr, "findChildren failed\n"); + return false; + } + + // Print a dummy file with id equals 0 to represent unknown file, because + // inline records might have unknown call site. + fwprintf(output_, L"FILE %d unknown file\n", 0); + + CComPtr compiland; + ULONG count; + while (SUCCEEDED(compilands->Next(1, &compiland, &count)) && count == 1) { + CComPtr source_files; + if (FAILED(session_->findFile(compiland, NULL, nsNone, &source_files))) { + return false; + } + CComPtr file; + while (SUCCEEDED(source_files->Next(1, &file, &count)) && count == 1) { + DWORD file_id; + if (FAILED(file->get_uniqueId(&file_id))) { + return false; + } + + CComBSTR file_name; + if (FAILED(file->get_fileName(&file_name))) { + return false; + } + + wstring file_name_string(file_name); + if (!FileIDIsCached(file_name_string)) { + // this is a new file name, cache it and output a FILE line. + CacheFileID(file_name_string, file_id); + fwprintf(output_, L"FILE %d %ws\n", file_id, file_name_string.c_str()); + } else { + // this file name has already been seen, just save this + // ID for later lookup. + StoreDuplicateFileID(file_name_string, file_id); + } + file.Release(); + } + compiland.Release(); + } + return true; +} + +bool PDBSourceLineWriter::PrintFunctions() { + ULONG count = 0; + DWORD rva = 0; + CComPtr global; + HRESULT hr; + + if (FAILED(session_->get_globalScope(&global))) { + fprintf(stderr, "get_globalScope failed\n"); + return false; + } + + CComPtr symbols = NULL; + + // Find all function symbols first. + SymbolMap rva_symbol; + hr = global->findChildren(SymTagFunction, NULL, nsNone, &symbols); + + if (SUCCEEDED(hr)) { + CComPtr symbol = NULL; + + while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1) { + if (SUCCEEDED(symbol->get_relativeVirtualAddress(&rva))) { + // Potentially record this as the canonical symbol for this rva. + MaybeRecordSymbol(rva, symbol, false, &rva_symbol); + } else { + fprintf(stderr, "get_relativeVirtualAddress failed on the symbol\n"); + return false; + } + + symbol.Release(); + } + + symbols.Release(); + } + + // Find all public symbols and record public symbols that are not also private + // symbols. + hr = global->findChildren(SymTagPublicSymbol, NULL, nsNone, &symbols); + + if (SUCCEEDED(hr)) { + CComPtr symbol = NULL; + + while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1) { + if (SUCCEEDED(symbol->get_relativeVirtualAddress(&rva))) { + // Potentially record this as the canonical symbol for this rva. + MaybeRecordSymbol(rva, symbol, true, &rva_symbol); + } else { + fprintf(stderr, "get_relativeVirtualAddress failed on the symbol\n"); + return false; + } + + symbol.Release(); + } + + symbols.Release(); + } + + // For each rva, dump the selected symbol at the address. + SymbolMap::iterator it; + for (it = rva_symbol.begin(); it != rva_symbol.end(); ++it) { + CComPtr symbol = it->second.symbol; + // Only print public symbols if there is no function symbol for the address. + if (!it->second.is_public) { + if (!PrintFunction(symbol, symbol, it->second.is_multiple)) + return false; + } else { + if (!PrintCodePublicSymbol(symbol, it->second.is_multiple)) + return false; + } + } + + // When building with PGO, the compiler can split functions into + // "hot" and "cold" blocks, and move the "cold" blocks out to separate + // pages, so the function can be noncontiguous. To find these blocks, + // we have to iterate over all the compilands, and then find blocks + // that are children of them. We can then find the lexical parents + // of those blocks and print out an extra FUNC line for blocks + // that are not contained in their parent functions. + CComPtr compilands; + if (FAILED(global->findChildren(SymTagCompiland, NULL, + nsNone, &compilands))) { + fprintf(stderr, "findChildren failed on the global\n"); + return false; + } + + CComPtr compiland; + while (SUCCEEDED(compilands->Next(1, &compiland, &count)) && count == 1) { + CComPtr blocks; + if (FAILED(compiland->findChildren(SymTagBlock, NULL, + nsNone, &blocks))) { + fprintf(stderr, "findChildren failed on a compiland\n"); + return false; + } + + CComPtr block; + while (SUCCEEDED(blocks->Next(1, &block, &count)) && count == 1) { + // find this block's lexical parent function + CComPtr parent; + DWORD tag; + if (SUCCEEDED(block->get_lexicalParent(&parent)) && + SUCCEEDED(parent->get_symTag(&tag)) && + tag == SymTagFunction) { + // now get the block's offset and the function's offset and size, + // and determine if the block is outside of the function + DWORD func_rva, block_rva; + ULONGLONG func_length; + if (SUCCEEDED(block->get_relativeVirtualAddress(&block_rva)) && + SUCCEEDED(parent->get_relativeVirtualAddress(&func_rva)) && + SUCCEEDED(parent->get_length(&func_length))) { + if (block_rva < func_rva || block_rva > (func_rva + func_length)) { + if (!PrintFunction(parent, block, false)) { + return false; + } + } + } + } + parent.Release(); + block.Release(); + } + blocks.Release(); + compiland.Release(); + } + + global.Release(); + return true; +} + +void PDBSourceLineWriter::PrintInlineOrigins() const { + struct OriginCompare { + bool operator()(const InlineOrigin lhs, const InlineOrigin rhs) const { + return lhs.id < rhs.id; + } + }; + set origins; + // Sort by origin id. + for (auto const& origin : inline_origins_) + origins.insert(origin.second); + for (auto o : origins) { + fprintf(output_, "INLINE_ORIGIN %d %ls\n", o.id, o.name.c_str()); + } +} + +bool PDBSourceLineWriter::GetInlines(IDiaSymbol* block, + Lines* line_list, + int inline_nest_level, + vector>* inlines) { + CComPtr inline_callsites; + if (FAILED(block->findChildrenEx(SymTagInlineSite, nullptr, nsNone, + &inline_callsites))) { + return false; + } + ULONG count; + CComPtr callsite; + while (SUCCEEDED(inline_callsites->Next(1, &callsite, &count)) && + count == 1) { + unique_ptr new_inline(new Inline(inline_nest_level)); + CComPtr lines; + // All inlinee lines have the same file id. + DWORD file_id = 0; + DWORD call_site_line = 0; + if (FAILED(session_->findInlineeLines(callsite, &lines))) { + return false; + } + CComPtr dia_line; + while (SUCCEEDED(lines->Next(1, &dia_line, &count)) && count == 1) { + Line line; + if (!GetLine(dia_line, &line)) { + return false; + } + // Silently ignore zero-length lines. + if (line.length != 0) { + // Use the first line num and file id at rva as this inline's call site + // line number, because after adding lines it may be changed to inner + // line number and inner file id. + if (call_site_line == 0) + call_site_line = line_list->GetLineNum(line.rva); + if (file_id == 0) + file_id = line_list->GetFileId(line.rva); + line_list->AddLine(line); + new_inline->ExtendRanges(line); + } + dia_line.Release(); + } + BSTR name; + callsite->get_name(&name); + if (SysStringLen(name) == 0) { + name = SysAllocString(L""); + } + auto iter = inline_origins_.find(name); + if (iter == inline_origins_.end()) { + InlineOrigin origin; + origin.id = inline_origins_.size(); + origin.name = name; + inline_origins_[name] = origin; + } + new_inline->SetOriginId(inline_origins_[name].id); + new_inline->SetCallSiteLine(call_site_line); + new_inline->SetCallSiteFileId(file_id); + // Go to next level. + vector> child_inlines; + if (!GetInlines(callsite, line_list, inline_nest_level + 1, + &child_inlines)) { + return false; + } + new_inline->SetChildInlines(std::move(child_inlines)); + inlines->push_back(std::move(new_inline)); + callsite.Release(); + } + return true; +} + +void PDBSourceLineWriter::PrintInlines( + const vector>& inlines) const { + for (const unique_ptr& in : inlines) { + in->Print(output_); + } +} + +#undef max + +bool PDBSourceLineWriter::PrintFrameDataUsingPDB() { + // It would be nice if it were possible to output frame data alongside the + // associated function, as is done with line numbers, but the DIA API + // doesn't make it possible to get the frame data in that way. + + CComPtr frame_data_enum; + if (!FindTable(session_, &frame_data_enum)) + return false; + + DWORD last_type = std::numeric_limits::max(); + DWORD last_rva = std::numeric_limits::max(); + DWORD last_code_size = 0; + DWORD last_prolog_size = std::numeric_limits::max(); + + CComPtr frame_data; + ULONG count = 0; + while (SUCCEEDED(frame_data_enum->Next(1, &frame_data, &count)) && + count == 1) { + DWORD type; + if (FAILED(frame_data->get_type(&type))) + return false; + + DWORD rva; + if (FAILED(frame_data->get_relativeVirtualAddress(&rva))) + return false; + + DWORD code_size; + if (FAILED(frame_data->get_lengthBlock(&code_size))) + return false; + + DWORD prolog_size; + if (FAILED(frame_data->get_lengthProlog(&prolog_size))) + return false; + + // parameter_size is the size of parameters passed on the stack. If any + // parameters are not passed on the stack (such as in registers), their + // sizes will not be included in parameter_size. + DWORD parameter_size; + if (FAILED(frame_data->get_lengthParams(¶meter_size))) + return false; + + DWORD saved_register_size; + if (FAILED(frame_data->get_lengthSavedRegisters(&saved_register_size))) + return false; + + DWORD local_size; + if (FAILED(frame_data->get_lengthLocals(&local_size))) + return false; + + // get_maxStack can return S_FALSE, just use 0 in that case. + DWORD max_stack_size = 0; + if (FAILED(frame_data->get_maxStack(&max_stack_size))) + return false; + + // get_programString can return S_FALSE, indicating that there is no + // program string. In that case, check whether %ebp is used. + HRESULT program_string_result; + CComBSTR program_string; + if (FAILED(program_string_result = frame_data->get_program( + &program_string))) { + return false; + } + + // get_allocatesBasePointer can return S_FALSE, treat that as though + // %ebp is not used. + BOOL allocates_base_pointer = FALSE; + if (program_string_result != S_OK) { + if (FAILED(frame_data->get_allocatesBasePointer( + &allocates_base_pointer))) { + return false; + } + } + + // Only print out a line if type, rva, code_size, or prolog_size have + // changed from the last line. It is surprisingly common (especially in + // system library PDBs) for DIA to return a series of identical + // IDiaFrameData objects. For kernel32.pdb from Windows XP SP2 on x86, + // this check reduces the size of the dumped symbol file by a third. + if (type != last_type || rva != last_rva || code_size != last_code_size || + prolog_size != last_prolog_size) { + // The prolog and the code portions of the frame have to be treated + // independently as they may have independently changed in size, or may + // even have been split. + // NOTE: If epilog size is ever non-zero, we have to do something + // similar with it. + + // Figure out where the prolog bytes have landed. + AddressRangeVector prolog_ranges; + if (prolog_size > 0) { + MapAddressRange(image_map_, AddressRange(rva, prolog_size), + &prolog_ranges); + } + + // And figure out where the code bytes have landed. + AddressRangeVector code_ranges; + MapAddressRange(image_map_, + AddressRange(rva + prolog_size, + code_size - prolog_size), + &code_ranges); + + struct FrameInfo { + DWORD rva; + DWORD code_size; + DWORD prolog_size; + }; + std::vector frame_infos; + + // Special case: The prolog and the code bytes remain contiguous. This is + // only done for compactness of the symbol file, and we could actually + // be outputting independent frame info for the prolog and code portions. + if (prolog_ranges.size() == 1 && code_ranges.size() == 1 && + prolog_ranges[0].end() == code_ranges[0].rva) { + FrameInfo fi = { prolog_ranges[0].rva, + prolog_ranges[0].length + code_ranges[0].length, + prolog_ranges[0].length }; + frame_infos.push_back(fi); + } else { + // Otherwise we output the prolog and code frame info independently. + for (size_t i = 0; i < prolog_ranges.size(); ++i) { + FrameInfo fi = { prolog_ranges[i].rva, + prolog_ranges[i].length, + prolog_ranges[i].length }; + frame_infos.push_back(fi); + } + for (size_t i = 0; i < code_ranges.size(); ++i) { + FrameInfo fi = { code_ranges[i].rva, code_ranges[i].length, 0 }; + frame_infos.push_back(fi); + } + } + + for (size_t i = 0; i < frame_infos.size(); ++i) { + const FrameInfo& fi(frame_infos[i]); + fprintf(output_, "STACK WIN %lx %lx %lx %lx %x %lx %lx %lx %lx %d ", + type, fi.rva, fi.code_size, fi.prolog_size, + 0 /* epilog_size */, parameter_size, saved_register_size, + local_size, max_stack_size, program_string_result == S_OK); + if (program_string_result == S_OK) { + fprintf(output_, "%ws\n", program_string.m_str); + } else { + fprintf(output_, "%d\n", allocates_base_pointer); + } + } + + last_type = type; + last_rva = rva; + last_code_size = code_size; + last_prolog_size = prolog_size; + } + + frame_data.Release(); + } + + return true; +} + +bool PDBSourceLineWriter::PrintFrameDataUsingEXE() { + if (code_file_.empty() && !FindPEFile()) { + fprintf(stderr, "Couldn't locate EXE or DLL file.\n"); + return false; + } + + return PrintPEFrameData(code_file_, output_); +} + +bool PDBSourceLineWriter::PrintFrameData() { + PDBModuleInfo info; + if (GetModuleInfo(&info) && info.cpu == L"x86_64") { + return PrintFrameDataUsingEXE(); + } + return PrintFrameDataUsingPDB(); +} + +bool PDBSourceLineWriter::PrintCodePublicSymbol(IDiaSymbol* symbol, + bool has_multiple_symbols) { + BOOL is_code; + if (FAILED(symbol->get_code(&is_code))) { + return false; + } + if (!is_code) { + return true; + } + + DWORD rva; + if (FAILED(symbol->get_relativeVirtualAddress(&rva))) { + return false; + } + + CComBSTR name; + int stack_param_size; + if (!GetSymbolFunctionName(symbol, &name, &stack_param_size)) { + return false; + } + + AddressRangeVector ranges; + MapAddressRange(image_map_, AddressRange(rva, 1), &ranges); + for (size_t i = 0; i < ranges.size(); ++i) { + const char* optional_multiple_field = has_multiple_symbols ? "m " : ""; + fprintf(output_, "PUBLIC %s%lx %x %ws\n", optional_multiple_field, + ranges[i].rva, stack_param_size > 0 ? stack_param_size : 0, + name.m_str); + } + + // Now walk the function in the original untranslated space, asking DIA + // what function is at that location, stepping through OMAP blocks. If + // we're still in the same function, emit another entry, because the + // symbol could have been split into multiple pieces. If we've gotten to + // another symbol in the original address space, then we're done for + // this symbol. See https://crbug.com/678874. + for (;;) { + // This steps to the next block in the original image. Simply doing + // rva++ would also be correct, but would emit tons of unnecessary + // entries. + rva = image_map_.subsequent_rva_block[rva]; + if (rva == 0) + break; + + CComPtr next_sym = NULL; + LONG displacement; + if (FAILED(session_->findSymbolByRVAEx(rva, SymTagPublicSymbol, &next_sym, + &displacement))) { + break; + } + + if (!SymbolsMatch(symbol, next_sym)) + break; + + AddressRangeVector next_ranges; + MapAddressRange(image_map_, AddressRange(rva, 1), &next_ranges); + for (size_t i = 0; i < next_ranges.size(); ++i) { + fprintf(output_, "PUBLIC %lx %x %ws\n", next_ranges[i].rva, + stack_param_size > 0 ? stack_param_size : 0, name.m_str); + } + } + + return true; +} + +bool PDBSourceLineWriter::PrintPDBInfo() { + PDBModuleInfo info; + if (!GetModuleInfo(&info)) { + return false; + } + + // Hard-code "windows" for the OS because that's the only thing that makes + // sense for PDB files. (This might not be strictly correct for Windows CE + // support, but we don't care about that at the moment.) + fprintf(output_, "MODULE windows %ws %ws %ws\n", + info.cpu.c_str(), info.debug_identifier.c_str(), + info.debug_file.c_str()); + + return true; +} + +bool PDBSourceLineWriter::PrintPEInfo() { + PEModuleInfo info; + if (!GetPEInfo(&info)) { + return false; + } + + fprintf(output_, "INFO CODE_ID %ws %ws\n", + info.code_identifier.c_str(), + info.code_file.c_str()); + return true; +} + +// wcstol_positive_strict is sort of like wcstol, but much stricter. string +// should be a buffer pointing to a null-terminated string containing only +// decimal digits. If the entire string can be converted to an integer +// without overflowing, and there are no non-digit characters before the +// result is set to the value and this function returns true. Otherwise, +// this function returns false. This is an alternative to the strtol, atoi, +// and scanf families, which are not as strict about input and in some cases +// don't provide a good way for the caller to determine if a conversion was +// successful. +static bool wcstol_positive_strict(wchar_t* string, int* result) { + int value = 0; + for (wchar_t* c = string; *c != '\0'; ++c) { + int last_value = value; + value *= 10; + // Detect overflow. + if (value / 10 != last_value || value < 0) { + return false; + } + if (*c < '0' || *c > '9') { + return false; + } + unsigned int c_value = *c - '0'; + last_value = value; + value += c_value; + // Detect overflow. + if (value < last_value) { + return false; + } + // Forbid leading zeroes unless the string is just "0". + if (value == 0 && *(c+1) != '\0') { + return false; + } + } + *result = value; + return true; +} + +bool PDBSourceLineWriter::FindPEFile() { + CComPtr global; + if (FAILED(session_->get_globalScope(&global))) { + fprintf(stderr, "get_globalScope failed\n"); + return false; + } + + CComBSTR symbols_file; + if (SUCCEEDED(global->get_symbolsFileName(&symbols_file))) { + wstring file(symbols_file); + + // Look for an EXE or DLL file. + const wchar_t* extensions[] = { L"exe", L"dll" }; + for (size_t i = 0; i < sizeof(extensions) / sizeof(extensions[0]); i++) { + size_t dot_pos = file.find_last_of(L"."); + if (dot_pos != wstring::npos) { + file.replace(dot_pos + 1, wstring::npos, extensions[i]); + // Check if this file exists. + if (GetFileAttributesW(file.c_str()) != INVALID_FILE_ATTRIBUTES) { + code_file_ = file; + return true; + } + } + } + } + + return false; +} + +// static +bool PDBSourceLineWriter::GetSymbolFunctionName(IDiaSymbol* function, + BSTR* name, + int* stack_param_size) { + *stack_param_size = -1; + + // Use get_undecoratedNameEx to get readable C++ names with arguments. + if (function->get_undecoratedNameEx(kUndecorateOptions, name) != S_OK) { + if (function->get_name(name) != S_OK) { + fprintf(stderr, "failed to get function name\n"); + return false; + } + + // It's possible for get_name to return an empty string, so + // special-case that. + if (wcscmp(*name, L"") == 0) { + SysFreeString(*name); + // dwarf_cu_to_module.cc uses "", so match that. + *name = SysAllocString(L""); + return true; + } + + // If a name comes from get_name because no undecorated form existed, + // it's already formatted properly to be used as output. Don't do any + // additional processing. + // + // MSVC7's DIA seems to not undecorate names in as many cases as MSVC8's. + // This will result in calling get_name for some C++ symbols, so + // all of the parameter and return type information may not be included in + // the name string. + } else { + StripLlvmSuffixAndUndecorate(name); + + // C++ uses a bogus "void" argument for functions and methods that don't + // take any parameters. Take it out of the undecorated name because it's + // ugly and unnecessary. + const wchar_t* replace_string = L"(void)"; + const size_t replace_length = wcslen(replace_string); + const wchar_t* replacement_string = L"()"; + size_t length = wcslen(*name); + if (length >= replace_length) { + wchar_t* name_end = *name + length - replace_length; + if (wcscmp(name_end, replace_string) == 0) { + WindowsStringUtils::safe_wcscpy(name_end, replace_length, + replacement_string); + length = wcslen(*name); + } + } + + // Undecorate names used for stdcall and fastcall. These names prefix + // the identifier with '_' (stdcall) or '@' (fastcall) and suffix it + // with '@' followed by the number of bytes of parameters, in decimal. + // If such a name is found, take note of the size and undecorate it. + // Only do this for names that aren't C++, which is determined based on + // whether the undecorated name contains any ':' or '(' characters. + if (!wcschr(*name, ':') && !wcschr(*name, '(') && + (*name[0] == '_' || *name[0] == '@')) { + wchar_t* last_at = wcsrchr(*name + 1, '@'); + if (last_at && wcstol_positive_strict(last_at + 1, stack_param_size)) { + // If this function adheres to the fastcall convention, it accepts up + // to the first 8 bytes of parameters in registers (%ecx and %edx). + // We're only interested in the stack space used for parameters, so + // so subtract 8 and don't let the size go below 0. + if (*name[0] == '@') { + if (*stack_param_size > 8) { + *stack_param_size -= 8; + } else { + *stack_param_size = 0; + } + } + + // Undecorate the name by moving it one character to the left in its + // buffer, and terminating it where the last '@' had been. + WindowsStringUtils::safe_wcsncpy(*name, length, + *name + 1, last_at - *name - 1); + } else if (*name[0] == '_') { + // This symbol's name is encoded according to the cdecl rules. The + // name doesn't end in a '@' character followed by a decimal positive + // integer, so it's not a stdcall name. Strip off the leading + // underscore. + WindowsStringUtils::safe_wcsncpy(*name, length, *name + 1, length); + } + } + } + + return true; +} + +// static +int PDBSourceLineWriter::GetFunctionStackParamSize(IDiaSymbol* function) { + // This implementation is highly x86-specific. + + // Gather the symbols corresponding to data. + CComPtr data_children; + if (FAILED(function->findChildren(SymTagData, NULL, nsNone, + &data_children))) { + return 0; + } + + // lowest_base is the lowest %ebp-relative byte offset used for a parameter. + // highest_end is one greater than the highest offset (i.e. base + length). + // Stack parameters are assumed to be contiguous, because in reality, they + // are. + int lowest_base = INT_MAX; + int highest_end = INT_MIN; + + CComPtr child; + DWORD count; + while (SUCCEEDED(data_children->Next(1, &child, &count)) && count == 1) { + // If any operation fails at this point, just proceed to the next child. + // Use the next_child label instead of continue because child needs to + // be released before it's reused. Declare constructable/destructable + // types early to avoid gotos that cross initializations. + CComPtr child_type; + + // DataIsObjectPtr is only used for |this|. Because |this| can be passed + // as a stack parameter, look for it in addition to traditional + // parameters. + DWORD child_kind; + if (FAILED(child->get_dataKind(&child_kind)) || + (child_kind != DataIsParam && child_kind != DataIsObjectPtr)) { + goto next_child; + } + + // Only concentrate on register-relative parameters. Parameters may also + // be enregistered (passed directly in a register), but those don't + // consume any stack space, so they're not of interest. + DWORD child_location_type; + if (FAILED(child->get_locationType(&child_location_type)) || + child_location_type != LocIsRegRel) { + goto next_child; + } + + // Of register-relative parameters, the only ones that make any sense are + // %ebp- or %esp-relative. Note that MSVC's debugging information always + // gives parameters as %ebp-relative even when a function doesn't use a + // traditional frame pointer and stack parameters are accessed relative to + // %esp, so just look for %ebp-relative parameters. If you wanted to + // access parameters, you'd probably want to treat these %ebp-relative + // offsets as if they were relative to %esp before a function's prolog + // executed. + DWORD child_register; + if (FAILED(child->get_registerId(&child_register)) || + child_register != CV_REG_EBP) { + goto next_child; + } + + LONG child_register_offset; + if (FAILED(child->get_offset(&child_register_offset))) { + goto next_child; + } + + // IDiaSymbol::get_type can succeed but still pass back a NULL value. + if (FAILED(child->get_type(&child_type)) || !child_type) { + goto next_child; + } + + ULONGLONG child_length; + if (FAILED(child_type->get_length(&child_length))) { + goto next_child; + } + + // Extra scope to avoid goto jumping over variable initialization + { + int child_end = child_register_offset + static_cast(child_length); + if (child_register_offset < lowest_base) { + lowest_base = child_register_offset; + } + if (child_end > highest_end) { + highest_end = child_end; + } + } + +next_child: + child.Release(); + } + + int param_size = 0; + // Make sure lowest_base isn't less than 4, because [%esp+4] is the lowest + // possible address to find a stack parameter before executing a function's + // prolog (see above). Some optimizations cause parameter offsets to be + // lower than 4, but we're not concerned with those because we're only + // looking for parameters contained in addresses higher than where the + // return address is stored. + if (lowest_base < 4) { + lowest_base = 4; + } + if (highest_end > lowest_base) { + // All stack parameters are pushed as at least 4-byte quantities. If the + // last type was narrower than 4 bytes, promote it. This assumes that all + // parameters' offsets are 4-byte-aligned, which is always the case. Only + // worry about the last type, because we're not summing the type sizes, + // just looking at the lowest and highest offsets. + int remainder = highest_end % 4; + if (remainder) { + highest_end += 4 - remainder; + } + + param_size = highest_end - lowest_base; + } + + return param_size; +} + +bool PDBSourceLineWriter::WriteSymbols(FILE* symbol_file) { + output_ = symbol_file; + + // Load the OMAP information, and disable auto-translation of addresses in + // preference of doing it ourselves. + OmapData omap_data; + if (!GetOmapDataAndDisableTranslation(session_, &omap_data)) + return false; + BuildImageMap(omap_data, &image_map_); + + bool ret = PrintPDBInfo(); + // This is not a critical piece of the symbol file. + PrintPEInfo(); + ret = ret && PrintSourceFiles() && PrintFunctions() && PrintFrameData(); + PrintInlineOrigins(); + + output_ = NULL; + return ret; +} + +void PDBSourceLineWriter::Close() { + if (session_ != nullptr) { + session_.Release(); + } +} + +bool PDBSourceLineWriter::GetModuleInfo(PDBModuleInfo* info) { + if (!info) { + return false; + } + + info->debug_file.clear(); + info->debug_identifier.clear(); + info->cpu.clear(); + + CComPtr global; + if (FAILED(session_->get_globalScope(&global))) { + return false; + } + + DWORD machine_type; + // get_machineType can return S_FALSE. + if (global->get_machineType(&machine_type) == S_OK) { + // The documentation claims that get_machineType returns a value from + // the CV_CPU_TYPE_e enumeration, but that's not the case. + // Instead, it returns one of the IMAGE_FILE_MACHINE values as + // defined here: + // http://msdn.microsoft.com/en-us/library/ms680313%28VS.85%29.aspx + info->cpu = FileHeaderMachineToCpuString(static_cast(machine_type)); + } else { + // Unexpected, but handle gracefully. + info->cpu = L"unknown"; + } + + // DWORD* and int* are not compatible. This is clean and avoids a cast. + DWORD age; + if (FAILED(global->get_age(&age))) { + return false; + } + + bool uses_guid; + if (!UsesGUID(&uses_guid)) { + return false; + } + + if (uses_guid) { + GUID guid; + if (FAILED(global->get_guid(&guid))) { + return false; + } + + info->debug_identifier = GenerateDebugIdentifier(age, guid); + } else { + DWORD signature; + if (FAILED(global->get_signature(&signature))) { + return false; + } + + info->debug_identifier = GenerateDebugIdentifier(age, signature); + } + + CComBSTR debug_file_string; + if (FAILED(global->get_symbolsFileName(&debug_file_string))) { + return false; + } + info->debug_file = + WindowsStringUtils::GetBaseName(wstring(debug_file_string)); + + return true; +} + +bool PDBSourceLineWriter::GetPEInfo(PEModuleInfo* info) { + if (!info) { + return false; + } + + if (code_file_.empty() && !FindPEFile()) { + fprintf(stderr, "Couldn't locate EXE or DLL file.\n"); + return false; + } + + return ReadPEInfo(code_file_, info); +} + +bool PDBSourceLineWriter::UsesGUID(bool* uses_guid) { + if (!uses_guid) + return false; + + CComPtr global; + if (FAILED(session_->get_globalScope(&global))) + return false; + + GUID guid; + if (FAILED(global->get_guid(&guid))) + return false; + + DWORD signature; + if (FAILED(global->get_signature(&signature))) + return false; + + // There are two possibilities for guid: either it's a real 128-bit GUID + // as identified in a code module by a new-style CodeView record, or it's + // a 32-bit signature (timestamp) as identified by an old-style record. + // See MDCVInfoPDB70 and MDCVInfoPDB20 in minidump_format.h. + // + // Because DIA doesn't provide a way to directly determine whether a module + // uses a GUID or a 32-bit signature, this code checks whether the first 32 + // bits of guid are the same as the signature, and if the rest of guid is + // zero. If so, then with a pretty high degree of certainty, there's an + // old-style CodeView record in use. This method will only falsely find an + // an old-style CodeView record if a real 128-bit GUID has its first 32 + // bits set the same as the module's signature (timestamp) and the rest of + // the GUID is set to 0. This is highly unlikely. + + GUID signature_guid = {signature}; // 0-initializes other members + *uses_guid = !IsEqualGUID(guid, signature_guid); + return true; +} + +} // namespace google_breakpad diff --git a/src/common/windows/pdb_source_line_writer.h b/src/common/windows/pdb_source_line_writer.h new file mode 100644 index 0000000..8c74e2c --- /dev/null +++ b/src/common/windows/pdb_source_line_writer.h @@ -0,0 +1,356 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// PDBSourceLineWriter uses a pdb file produced by Visual C++ to output +// a line/address map for use with BasicSourceLineResolver. + +#ifndef COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_ +#define COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_ + +#include + +#include +#include +#include +#include +#include + +#include "common/windows/module_info.h" +#include "common/windows/omap.h" + +struct IDiaEnumLineNumbers; +struct IDiaSession; +struct IDiaSymbol; + +namespace google_breakpad { + +using std::map; +using std::vector; +using std::wstring; +using std::unordered_map; + +class PDBSourceLineWriter { + public: + enum FileFormat { + PDB_FILE, // a .pdb file containing debug symbols + EXE_FILE, // a .exe or .dll file + ANY_FILE // try PDB_FILE and then EXE_FILE + }; + + explicit PDBSourceLineWriter(bool handle_inline = false); + ~PDBSourceLineWriter(); + + // Opens the given file. For executable files, the corresponding pdb + // file must be available; Open will be if it is not. + // If there is already a pdb file open, it is automatically closed. + // Returns true on success. + bool Open(const wstring& file, FileFormat format); + + // Closes the current pdb file and its associated resources. + void Close(); + + // Sets the code file full path. This is optional for 32-bit modules. It is + // also optional for 64-bit modules when there is an executable file stored + // in the same directory as the PDB file. It is only required for 64-bit + // modules when the executable file is not in the same location as the PDB + // file and it must be called after Open() and before WriteMap(). + // If Open() was called for an executable file, then it is an error to call + // SetCodeFile() with a different file path and it will return false. + bool SetCodeFile(const wstring& exe_file); + + // Writes a Breakpad symbol file from the current pdb file to |symbol_file|. + // Returns true on success. + bool WriteSymbols(FILE *symbol_file); + + // Retrieves information about the module's debugging file. Returns + // true on success and false on failure. + bool GetModuleInfo(PDBModuleInfo *info); + + // Retrieves information about the module's PE file. Returns + // true on success and false on failure. + bool GetPEInfo(PEModuleInfo *info); + + // Sets uses_guid to true if the opened file uses a new-style CodeView + // record with a 128-bit GUID, or false if the opened file uses an old-style + // CodeView record. When no GUID is available, a 32-bit signature should be + // used to identify the module instead. If the information cannot be + // determined, this method returns false. + bool UsesGUID(bool *uses_guid); + + private: + // InlineOrigin represents INLINE_ORIGIN record in a symbol file. It's an + // inlined function. + struct InlineOrigin { + // The unique id for an InlineOrigin. + int id; + // The name of the inlined function. + wstring name; + }; + + // Line represents LINE record in a symbol file. It represents a source code + // line. + struct Line { + // The relative address of a line. + DWORD rva; + // The number bytes this line has. + DWORD length; + // The source line number. + DWORD line_num; + // The source file id where the source line is located at. + DWORD file_id; + }; + + // Inline represents INLINE record in a symbol file. + class Inline { + public: + explicit Inline(int inline_nest_level); + + void SetOriginId(int origin_id); + + // Adding inlinee line's range into ranges. If line is adjacent with any + // existing lines, extend the range. Otherwise, add line as a new range. + void ExtendRanges(const Line& line); + + void SetCallSiteLine(DWORD call_site_line); + + void SetCallSiteFileId(DWORD call_site_file_id); + + void SetChildInlines(std::vector> child_inlines); + + void Print(FILE* output) const; + + private: + // The nest level of this inline record. + int inline_nest_level_; + // The source line number at where this inlined function is called. + DWORD call_site_line_ = 0; + // The call site file id at where this inlined function is called. + DWORD call_site_file_id_ = 0; + // The id used for referring to an InlineOrigin. + int origin_id_ = 0; + // A map from rva to length. This is the address ranges covered by this + // Inline. + map ranges_; + // The list of direct Inlines inlined inside this Inline. + vector> child_inlines_; + }; + + // Lines represents a map of lines inside a function with rva as the key. + // AddLine function adds a line into the map and ensures that there is no + // overlap between any two lines in the map. + class Lines { + public: + const map& GetLineMap() const { return line_map_; } + + // Finds the line from line_map_ that contains the given rva returns its + // line_num. If not found, return 0. + DWORD GetLineNum(DWORD rva) const; + + // Finds the line from line_map_ that contains the given rva returns its + // file_id. If not found, return 0. + DWORD GetFileId(DWORD rva) const; + + // Add the `line` into line_map_. If the `line` overlaps with existing + // lines, truncate the existing lines and add the given line. It ensures + // that all lines in line_map_ do not overlap with each other. For example, + // suppose there is a line A in the map and we call AddLine with Line B. + // Line A: rva: 100, length: 20, line_num: 10, file_id: 1 + // Line B: rva: 105, length: 10, line_num: 4, file_id: 2 + // After calling AddLine with Line B, we will have the following lines: + // Line 1: rva: 100, length: 5, line_num: 10, file_id: 1 + // Line 2: rva: 105, length: 10, line_num: 4, file_id: 2 + // Line 3: rva: 115, length: 5, line_num: 10, file_id: 1 + void AddLine(const Line& line); + + private: + // Finds the line from line_map_ that contains the given rva. If not found, + // return nullptr. + const Line* GetLine(DWORD rva) const; + // The key is rva. AddLine function ensures that any two lines in the map do + // not overlap. + map line_map_; + }; + + // Construct Line from IDiaLineNumber. The output Line is stored at line. + // Return true on success. + bool GetLine(IDiaLineNumber* dia_line, Line* line) const; + + // Construct Lines from IDiaEnumLineNumbers. The list of Lines are stored at + // line_list. + // Returns true on success. + bool GetLines(IDiaEnumLineNumbers* lines, Lines* line_list) const; + + // Outputs the line/address pairs for each line in the enumerator. + void PrintLines(const Lines& lines) const; + + // Outputs a function address and name, followed by its source line list. + // block can be the same object as function, or it can be a reference to a + // code block that is lexically part of this function, but resides at a + // separate address. If has_multiple_symbols is true, this function's + // instructions correspond to multiple symbols. Returns true on success. + bool PrintFunction(IDiaSymbol *function, IDiaSymbol *block, + bool has_multiple_symbols); + + // Outputs all functions as described above. Returns true on success. + bool PrintFunctions(); + + // Outputs all of the source files in the session's pdb file. + // Returns true on success. + bool PrintSourceFiles(); + + // Output all inline origins. + void PrintInlineOrigins() const; + + // Retrieve inlines inside the given block. It also adds inlinee lines to + // `line_list` since inner lines are more precise source location. If the + // block has children wih SymTagInlineSite Tag, it will recursively (DFS) call + // itself with each child as first argument. Returns true on success. + // `block`: the IDiaSymbol that may have inline sites. + // `line_list`: the list of lines inside current function. + // `inline_nest_level`: the nest level of block's Inlines. + // `inlines`: the vector to store the list of inlines for the block. + bool GetInlines(IDiaSymbol* block, + Lines* line_list, + int inline_nest_level, + vector>* inlines); + + // Outputs all inlines. + void PrintInlines(const vector>& inlines) const; + + // Outputs all of the frame information necessary to construct stack + // backtraces in the absence of frame pointers. For x86 data stored in + // .pdb files. Returns true on success. + bool PrintFrameDataUsingPDB(); + + // Outputs all of the frame information necessary to construct stack + // backtraces in the absence of frame pointers. For x64 data stored in + // .exe, .dll files. Returns true on success. + bool PrintFrameDataUsingEXE(); + + // Outputs all of the frame information necessary to construct stack + // backtraces in the absence of frame pointers. Returns true on success. + bool PrintFrameData(); + + // Outputs a single public symbol address and name, if the symbol corresponds + // to a code address. Returns true on success. If symbol is does not + // correspond to code, returns true without outputting anything. If + // has_multiple_symbols is true, the symbol corresponds to a code address and + // the instructions correspond to multiple symbols. + bool PrintCodePublicSymbol(IDiaSymbol *symbol, bool has_multiple_symbols); + + // Outputs a line identifying the PDB file that is being dumped, along with + // its uuid and age. + bool PrintPDBInfo(); + + // Outputs a line identifying the PE file corresponding to the PDB + // file that is being dumped, along with its code identifier, + // which consists of its timestamp and file size. + bool PrintPEInfo(); + + // Returns true if this filename has already been seen, + // and an ID is stored for it, or false if it has not. + bool FileIDIsCached(const wstring& file) { + return unique_files_.find(file) != unique_files_.end(); + } + + // Cache this filename and ID for later reuse. + void CacheFileID(const wstring& file, DWORD id) { + unique_files_[file] = id; + } + + // Store this ID in the cache as a duplicate for this filename. + void StoreDuplicateFileID(const wstring& file, DWORD id) { + unordered_map::iterator iter = unique_files_.find(file); + if (iter != unique_files_.end()) { + // map this id to the previously seen one + file_ids_[id] = iter->second; + } + } + + // Given a file's unique ID, return the ID that should be used to + // reference it. There may be multiple files with identical filenames + // but different unique IDs. The cache attempts to coalesce these into + // one ID per unique filename. + DWORD GetRealFileID(DWORD id) const { + unordered_map::const_iterator iter = file_ids_.find(id); + if (iter == file_ids_.end()) + return id; + return iter->second; + } + + // Find the PE file corresponding to the loaded PDB file, and + // set the code_file_ member. Returns false on failure. + bool FindPEFile(); + + // Returns the function name for a symbol. If possible, the name is + // undecorated. If the symbol's decorated form indicates the size of + // parameters on the stack, this information is returned in stack_param_size. + // Returns true on success. If the symbol doesn't encode parameter size + // information, stack_param_size is set to -1. + static bool GetSymbolFunctionName(IDiaSymbol *function, BSTR *name, + int *stack_param_size); + + // Returns the number of bytes of stack space used for a function's + // parameters. function must have the tag SymTagFunction. In the event of + // a failure, returns 0, which is also a valid number of bytes. + static int GetFunctionStackParamSize(IDiaSymbol *function); + + // The filename of the PE file corresponding to the currently-open + // pdb file. + wstring code_file_; + + // The session for the currently-open pdb file. + CComPtr session_; + + // The current output file for this WriteMap invocation. + FILE *output_; + + // There may be many duplicate filenames with different IDs. + // This maps from the DIA "unique ID" to a single ID per unique + // filename. + unordered_map file_ids_; + // This maps unique filenames to file IDs. + unordered_map unique_files_; + + // The INLINE_ORIGINS records. The key is the function name. + std::map inline_origins_; + + // This is used for calculating post-transform symbol addresses and lengths. + ImageMap image_map_; + + // If we should output INLINE/INLINE_ORIGIN records + bool handle_inline_; + + // Disallow copy ctor and operator= + PDBSourceLineWriter(const PDBSourceLineWriter&); + void operator=(const PDBSourceLineWriter&); +}; + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_ diff --git a/src/common/windows/pe_source_line_writer.cc b/src/common/windows/pe_source_line_writer.cc new file mode 100644 index 0000000..d1d25cf --- /dev/null +++ b/src/common/windows/pe_source_line_writer.cc @@ -0,0 +1,80 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/windows/pe_source_line_writer.h" + +#include "common/windows/pe_util.h" + +namespace google_breakpad { +PESourceLineWriter::PESourceLineWriter(const wstring& pe_file) : + pe_file_(pe_file) { +} + +PESourceLineWriter::~PESourceLineWriter() { +} + +bool PESourceLineWriter::WriteSymbols(FILE* symbol_file) { + PDBModuleInfo module_info; + if (!GetModuleInfo(&module_info)) { + return false; + } + // Hard-code "windows" for the OS because that's the only thing that makes + // sense for PDB files. (This might not be strictly correct for Windows CE + // support, but we don't care about that at the moment.) + fprintf(symbol_file, "MODULE windows %ws %ws %ws\n", + module_info.cpu.c_str(), module_info.debug_identifier.c_str(), + module_info.debug_file.c_str()); + + PEModuleInfo pe_info; + if (!GetPEInfo(&pe_info)) { + return false; + } + fprintf(symbol_file, "INFO CODE_ID %ws %ws\n", + pe_info.code_identifier.c_str(), + pe_info.code_file.c_str()); + + if (!PrintPEFrameData(pe_file_, symbol_file)) { + return false; + } + + return true; +} + +bool PESourceLineWriter::GetModuleInfo(PDBModuleInfo* info) { + return ReadModuleInfo(pe_file_, info); +} + +bool PESourceLineWriter::GetPEInfo(PEModuleInfo* info) { + return ReadPEInfo(pe_file_, info); +} + +} // namespace google_breakpad diff --git a/src/common/windows/pe_source_line_writer.h b/src/common/windows/pe_source_line_writer.h new file mode 100644 index 0000000..324663b --- /dev/null +++ b/src/common/windows/pe_source_line_writer.h @@ -0,0 +1,67 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_WINDOWS_PE_SOURCE_LINE_WRITER_H_ +#define COMMON_WINDOWS_PE_SOURCE_LINE_WRITER_H_ + +#include + +#include "common/windows/module_info.h" + +namespace google_breakpad { + +using std::wstring; + +// PESourceLineWriter uses a pe file produced by Visual C++ to output +// a line/address map for use with BasicSourceLineResolver. +// NOTE: Only supports PE32+ format, ie. a 64bit PE file. +class PESourceLineWriter { +public: + explicit PESourceLineWriter(const wstring& pe_file); + PESourceLineWriter(const PESourceLineWriter&) = delete; + void operator=(const PESourceLineWriter&) = delete; + ~PESourceLineWriter(); + + // Writes Breakpad symbols from the pe file to |symbol_file|. + // Returns true on success. + bool WriteSymbols(FILE* symbol_file); + + // Retrieves information about the module. Returns true on success. + bool GetModuleInfo(PDBModuleInfo* info); + + // Retrieves information about the module's PE file. Returns + // true on success. + bool GetPEInfo(PEModuleInfo* info); + +private: + const wstring pe_file_; +}; + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_PE_SOURCE_LINE_WRITER_H_ diff --git a/src/common/windows/pe_util.cc b/src/common/windows/pe_util.cc new file mode 100644 index 0000000..2d4aebe --- /dev/null +++ b/src/common/windows/pe_util.cc @@ -0,0 +1,415 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "pe_util.h" + +#include +#include +#include +#include + +#include +#include + +#include "common/windows/string_utils-inl.h" +#include "common/windows/guid_string.h" + +namespace { + +/* + * Not defined in WinNT.h prior to SDK 10.0.20348.0 for some reason. + * Definitions taken from: http://uninformed.org/index.cgi?v=4&a=1&p=13 + * + */ +typedef unsigned char UBYTE; + +#if !defined(UNW_FLAG_EHANDLER) +#define UNW_FLAG_EHANDLER 0x01 +#endif +#if !defined(UNW_FLAG_UHANDLER) +#define UNW_FLAG_UHANDLER 0x02 +#endif +#if !defined(UNW_FLAG_CHAININFO) +#define UNW_FLAG_CHAININFO 0x04 +#endif + +union UnwindCode { + struct { + UBYTE offset_in_prolog; + UBYTE unwind_operation_code : 4; + UBYTE operation_info : 4; + }; + USHORT frame_offset; +}; + +enum UnwindOperationCodes { + UWOP_PUSH_NONVOL = 0, /* info == register number */ + UWOP_ALLOC_LARGE, /* no info, alloc size in next 2 slots */ + UWOP_ALLOC_SMALL, /* info == size of allocation / 8 - 1 */ + UWOP_SET_FPREG, /* no info, FP = RSP + UNWIND_INFO.FPRegOffset*16 */ + UWOP_SAVE_NONVOL, /* info == register number, offset in next slot */ + UWOP_SAVE_NONVOL_FAR, /* info == register number, offset in next 2 slots */ + // XXX: these are missing from MSDN! + // See: http://www.osronline.com/ddkx/kmarch/64bitamd_4rs7.htm + UWOP_SAVE_XMM, + UWOP_SAVE_XMM_FAR, + UWOP_SAVE_XMM128, /* info == XMM reg number, offset in next slot */ + UWOP_SAVE_XMM128_FAR, /* info == XMM reg number, offset in next 2 slots */ + UWOP_PUSH_MACHFRAME /* info == 0: no error-code, 1: error-code */ +}; + +// See: http://msdn.microsoft.com/en-us/library/ddssxxy8.aspx +// Note: some fields removed as we don't use them. +struct UnwindInfo { + UBYTE version : 3; + UBYTE flags : 5; + UBYTE size_of_prolog; + UBYTE count_of_codes; + UBYTE frame_register : 4; + UBYTE frame_offset : 4; + UnwindCode unwind_code[1]; +}; + +struct CV_INFO_PDB70 { + ULONG cv_signature; + GUID signature; + ULONG age; + CHAR pdb_filename[ANYSIZE_ARRAY]; +}; + +#define CV_SIGNATURE_RSDS 'SDSR' + +// A helper class to scope a PLOADED_IMAGE. +class AutoImage { +public: + explicit AutoImage(PLOADED_IMAGE img) : img_(img) {} + ~AutoImage() { + if (img_) + ImageUnload(img_); + } + + operator PLOADED_IMAGE() { return img_; } + PLOADED_IMAGE operator->() { return img_; } + +private: + PLOADED_IMAGE img_; +}; +} // namespace + +namespace google_breakpad { + +using std::unique_ptr; +using google_breakpad::GUIDString; + +bool ReadModuleInfo(const wstring & pe_file, PDBModuleInfo * info) { + // Convert wchar to native charset because ImageLoad only takes + // a PSTR as input. + string img_file; + if (!WindowsStringUtils::safe_wcstombs(pe_file, &img_file)) { + fprintf(stderr, "Image path '%S' contains unrecognized characters.\n", + pe_file.c_str()); + return false; + } + + AutoImage img(ImageLoad((PSTR)img_file.c_str(), NULL)); + if (!img) { + fprintf(stderr, "Failed to load %s\n", img_file.c_str()); + return false; + } + + info->cpu = FileHeaderMachineToCpuString( + img->FileHeader->FileHeader.Machine); + + PIMAGE_OPTIONAL_HEADER64 optional_header = + &(reinterpret_cast(img->FileHeader))->OptionalHeader; + + // Search debug directories for a guid signature & age + DWORD debug_rva = optional_header-> + DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress; + DWORD debug_size = optional_header-> + DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size; + PIMAGE_DEBUG_DIRECTORY debug_directories = + static_cast( + ImageRvaToVa(img->FileHeader, + img->MappedAddress, + debug_rva, + &img->LastRvaSection)); + + for (DWORD i = 0; i < debug_size / sizeof(*debug_directories); i++) { + if (debug_directories[i].Type != IMAGE_DEBUG_TYPE_CODEVIEW || + debug_directories[i].SizeOfData < sizeof(CV_INFO_PDB70)) { + continue; + } + + struct CV_INFO_PDB70* cv_info = static_cast(ImageRvaToVa( + img->FileHeader, + img->MappedAddress, + debug_directories[i].AddressOfRawData, + &img->LastRvaSection)); + if (cv_info->cv_signature != CV_SIGNATURE_RSDS) { + continue; + } + + info->debug_identifier = GenerateDebugIdentifier(cv_info->age, + cv_info->signature); + + // This code assumes that the pdb_filename is stored as ASCII without + // multibyte characters, but it's not clear if that's true. + size_t debug_file_length = strnlen_s(cv_info->pdb_filename, MAX_PATH); + if (debug_file_length < 0 || debug_file_length >= MAX_PATH) { + fprintf(stderr, "PE debug directory is corrupt.\n"); + return false; + } + std::string debug_file(cv_info->pdb_filename, debug_file_length); + if (!WindowsStringUtils::safe_mbstowcs(debug_file, &info->debug_file)) { + fprintf(stderr, "PDB filename '%s' contains unrecognized characters.\n", + debug_file.c_str()); + return false; + } + info->debug_file = WindowsStringUtils::GetBaseName(info->debug_file); + + return true; + } + + fprintf(stderr, "Image is missing debug information.\n"); + return false; +} + +bool ReadPEInfo(const wstring & pe_file, PEModuleInfo * info) { + // Convert wchar to native charset because ImageLoad only takes + // a PSTR as input. + string img_file; + if (!WindowsStringUtils::safe_wcstombs(pe_file, &img_file)) { + fprintf(stderr, "Image path '%S' contains unrecognized characters.\n", + pe_file.c_str()); + return false; + } + + AutoImage img(ImageLoad((PSTR)img_file.c_str(), NULL)); + if (!img) { + fprintf(stderr, "Failed to open PE file: %S\n", pe_file.c_str()); + return false; + } + + info->code_file = WindowsStringUtils::GetBaseName(pe_file); + + // The date and time that the file was created by the linker. + DWORD TimeDateStamp = img->FileHeader->FileHeader.TimeDateStamp; + // The size of the file in bytes, including all headers. + DWORD SizeOfImage = 0; + PIMAGE_OPTIONAL_HEADER64 opt = + &((PIMAGE_NT_HEADERS64)img->FileHeader)->OptionalHeader; + if (opt->Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) { + // 64-bit PE file. + SizeOfImage = opt->SizeOfImage; + } + else { + // 32-bit PE file. + SizeOfImage = img->FileHeader->OptionalHeader.SizeOfImage; + } + wchar_t code_identifier[32]; + swprintf(code_identifier, + sizeof(code_identifier) / sizeof(code_identifier[0]), + L"%08X%X", TimeDateStamp, SizeOfImage); + info->code_identifier = code_identifier; + + return true; +} + +bool PrintPEFrameData(const wstring & pe_file, FILE * out_file) +{ + // Convert wchar to native charset because ImageLoad only takes + // a PSTR as input. + string img_file; + if (!WindowsStringUtils::safe_wcstombs(pe_file, &img_file)) { + fprintf(stderr, "Image path '%S' contains unrecognized characters.\n", + pe_file.c_str()); + return false; + } + + AutoImage img(ImageLoad((PSTR)img_file.c_str(), NULL)); + if (!img) { + fprintf(stderr, "Failed to load %s\n", img_file.c_str()); + return false; + } + PIMAGE_OPTIONAL_HEADER64 optional_header = + &(reinterpret_cast(img->FileHeader))->OptionalHeader; + if (optional_header->Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) { + fprintf(stderr, "Not a PE32+ image\n"); + return false; + } + + // Read Exception Directory + DWORD exception_rva = optional_header-> + DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress; + DWORD exception_size = optional_header-> + DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size; + PIMAGE_RUNTIME_FUNCTION_ENTRY funcs = + static_cast( + ImageRvaToVa(img->FileHeader, + img->MappedAddress, + exception_rva, + &img->LastRvaSection)); + for (DWORD i = 0; i < exception_size / sizeof(*funcs); i++) { + DWORD unwind_rva = funcs[i].UnwindInfoAddress; + // handle chaining + while (unwind_rva & 0x1) { + unwind_rva ^= 0x1; + PIMAGE_RUNTIME_FUNCTION_ENTRY chained_func = + static_cast( + ImageRvaToVa(img->FileHeader, + img->MappedAddress, + unwind_rva, + &img->LastRvaSection)); + unwind_rva = chained_func->UnwindInfoAddress; + } + + UnwindInfo *unwind_info = static_cast( + ImageRvaToVa(img->FileHeader, + img->MappedAddress, + unwind_rva, + &img->LastRvaSection)); + + DWORD stack_size = 8; // minimal stack size is 8 for RIP + DWORD rip_offset = 8; + do { + for (UBYTE c = 0; c < unwind_info->count_of_codes; c++) { + UnwindCode *unwind_code = &unwind_info->unwind_code[c]; + switch (unwind_code->unwind_operation_code) { + case UWOP_PUSH_NONVOL: { + stack_size += 8; + break; + } + case UWOP_ALLOC_LARGE: { + if (unwind_code->operation_info == 0) { + c++; + if (c < unwind_info->count_of_codes) + stack_size += (unwind_code + 1)->frame_offset * 8; + } + else { + c += 2; + if (c < unwind_info->count_of_codes) + stack_size += (unwind_code + 1)->frame_offset | + ((unwind_code + 2)->frame_offset << 16); + } + break; + } + case UWOP_ALLOC_SMALL: { + stack_size += unwind_code->operation_info * 8 + 8; + break; + } + case UWOP_SET_FPREG: + case UWOP_SAVE_XMM: + case UWOP_SAVE_XMM_FAR: + break; + case UWOP_SAVE_NONVOL: + case UWOP_SAVE_XMM128: { + c++; // skip slot with offset + break; + } + case UWOP_SAVE_NONVOL_FAR: + case UWOP_SAVE_XMM128_FAR: { + c += 2; // skip 2 slots with offset + break; + } + case UWOP_PUSH_MACHFRAME: { + if (unwind_code->operation_info) { + stack_size += 88; + } + else { + stack_size += 80; + } + rip_offset += 80; + break; + } + } + } + if (unwind_info->flags & UNW_FLAG_CHAININFO) { + PIMAGE_RUNTIME_FUNCTION_ENTRY chained_func = + reinterpret_cast( + (unwind_info->unwind_code + + ((unwind_info->count_of_codes + 1) & ~1))); + + unwind_info = static_cast( + ImageRvaToVa(img->FileHeader, + img->MappedAddress, + chained_func->UnwindInfoAddress, + &img->LastRvaSection)); + } + else { + unwind_info = NULL; + } + } while (unwind_info); + fprintf(out_file, "STACK CFI INIT %lx %lx .cfa: $rsp .ra: .cfa %lu - ^\n", + funcs[i].BeginAddress, + funcs[i].EndAddress - funcs[i].BeginAddress, rip_offset); + fprintf(out_file, "STACK CFI %lx .cfa: $rsp %lu +\n", + funcs[i].BeginAddress, stack_size); + } + + return true; +} + +wstring GenerateDebugIdentifier(DWORD age, GUID signature) +{ + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + wchar_t age_string[9]; + swprintf(age_string, sizeof(age_string) / sizeof(age_string[0]), + L"%x", age); + + // remove when VC++7.1 is no longer supported + age_string[sizeof(age_string) / sizeof(age_string[0]) - 1] = L'\0'; + + wstring debug_identifier = GUIDString::GUIDToSymbolServerWString(&signature); + debug_identifier.append(age_string); + + return debug_identifier; +} + +wstring GenerateDebugIdentifier(DWORD age, DWORD signature) +{ + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + wchar_t identifier_string[17]; + swprintf(identifier_string, + sizeof(identifier_string) / sizeof(identifier_string[0]), + L"%08X%x", signature, age); + + // remove when VC++7.1 is no longer supported + identifier_string[sizeof(identifier_string) / + sizeof(identifier_string[0]) - 1] = L'\0'; + + return wstring(identifier_string); +} + +} // namespace google_breakpad diff --git a/src/common/windows/pe_util.h b/src/common/windows/pe_util.h new file mode 100644 index 0000000..6c6b364 --- /dev/null +++ b/src/common/windows/pe_util.h @@ -0,0 +1,77 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_WINDOWS_PE_UTIL_H_ +#define COMMON_WINDOWS_PE_UTIL_H_ + +#include + +#include "common/windows/module_info.h" + +namespace google_breakpad { + +using std::wstring; + +// Reads |pe_file| and populates |info|. Returns true on success. +// Only supports PE32+ format, ie. a 64bit PE file. +// Will fail if |pe_file| does not contain a valid CodeView record. +bool ReadModuleInfo(const wstring& pe_file, PDBModuleInfo* info); + +// Reads |pe_file| and populates |info|. Returns true on success. +bool ReadPEInfo(const wstring& pe_file, PEModuleInfo* info); + +// Reads |pe_file| and prints frame data (aka. unwind info) to |out_file|. +// Only supports PE32+ format, ie. a 64bit PE file. +bool PrintPEFrameData(const wstring& pe_file, FILE* out_file); + +// Combines a GUID |signature| and DWORD |age| to create a Breakpad debug +// identifier. +wstring GenerateDebugIdentifier(DWORD age, GUID signature); + +// Combines a DWORD |signature| and DWORD |age| to create a Breakpad debug +// identifier. +wstring GenerateDebugIdentifier(DWORD age, DWORD signature); + +// Converts |machine| enum value to the corresponding string used by Breakpad. +// The enum is IMAGE_FILE_MACHINE_*, contained in winnt.h. +constexpr const wchar_t* FileHeaderMachineToCpuString(WORD machine) { + switch (machine) { + case IMAGE_FILE_MACHINE_I386: { + return L"x86"; + } + case IMAGE_FILE_MACHINE_IA64: + case IMAGE_FILE_MACHINE_AMD64: { + return L"x86_64"; + } + default: { return L"unknown"; } + } +} + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_PE_UTIL_H_ diff --git a/src/common/windows/string_utils-inl.h b/src/common/windows/string_utils-inl.h new file mode 100644 index 0000000..c6f5e0a --- /dev/null +++ b/src/common/windows/string_utils-inl.h @@ -0,0 +1,141 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// string_utils-inl.h: Safer string manipulation on Windows, supporting +// pre-MSVC8 environments. + +#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H_ +#define COMMON_WINDOWS_STRING_UTILS_INL_H_ + +#include +#include + +#include + +// The "ll" printf format size specifier corresponding to |long long| was +// intrudced in MSVC8. Earlier versions did not provide this size specifier, +// but "I64" can be used to print 64-bit types. Don't use "I64" where "ll" +// is available, in the event of oddball systems where |long long| is not +// 64 bits wide. +#if _MSC_VER >= 1400 // MSVC 2005/8 +#define WIN_STRING_FORMAT_LL "ll" +#else // MSC_VER >= 1400 +#define WIN_STRING_FORMAT_LL "I64" +#endif // MSC_VER >= 1400 + +// A nonconforming version of swprintf, without the length argument, was +// included with the CRT prior to MSVC8. Although a conforming version was +// also available via an overload, it is not reliably chosen. _snwprintf +// behaves as a standards-confirming swprintf should, so force the use of +// _snwprintf when using older CRTs. +#if _MSC_VER < 1400 // MSVC 2005/8 +#define swprintf _snwprintf +#else +// For MSVC8 and newer, swprintf_s is the recommended method. Conveniently, +// it takes the same argument list as swprintf. +#define swprintf swprintf_s +#endif // MSC_VER < 1400 + +namespace google_breakpad { + +using std::string; +using std::wstring; + +class WindowsStringUtils { + public: + // Roughly equivalent to MSVC8's wcscpy_s, except pre-MSVC8, this does + // not fail if source is longer than destination_size. The destination + // buffer is always 0-terminated. + static void safe_wcscpy(wchar_t* destination, size_t destination_size, + const wchar_t* source); + + // Roughly equivalent to MSVC8's wcsncpy_s, except that _TRUNCATE cannot + // be passed directly, and pre-MSVC8, this will not fail if source or count + // are longer than destination_size. The destination buffer is always + // 0-terminated. + static void safe_wcsncpy(wchar_t* destination, size_t destination_size, + const wchar_t* source, size_t count); + + // Performs multi-byte to wide character conversion on C++ strings, using + // mbstowcs_s (MSVC8) or mbstowcs (pre-MSVC8). Returns false on failure, + // without setting wcs. + static bool safe_mbstowcs(const string& mbs, wstring* wcs); + + // The inverse of safe_mbstowcs. + static bool safe_wcstombs(const wstring& wcs, string* mbs); + + // Returns the base name of a file, e.g. strips off the path. + static wstring GetBaseName(const wstring& filename); + + private: + // Disallow instantiation and other object-based operations. + WindowsStringUtils(); + WindowsStringUtils(const WindowsStringUtils&); + ~WindowsStringUtils(); + void operator=(const WindowsStringUtils&); +}; + +// static +inline void WindowsStringUtils::safe_wcscpy(wchar_t* destination, + size_t destination_size, + const wchar_t* source) { +#if _MSC_VER >= 1400 // MSVC 2005/8 + wcscpy_s(destination, destination_size, source); +#else // _MSC_VER >= 1400 + // Pre-MSVC 2005/8 doesn't have wcscpy_s. Simulate it with wcsncpy. + // wcsncpy doesn't 0-terminate the destination buffer if the source string + // is longer than size. Ensure that the destination is 0-terminated. + wcsncpy(destination, source, destination_size); + if (destination && destination_size) + destination[destination_size - 1] = 0; +#endif // _MSC_VER >= 1400 +} + +// static +inline void WindowsStringUtils::safe_wcsncpy(wchar_t* destination, + size_t destination_size, + const wchar_t* source, + size_t count) { +#if _MSC_VER >= 1400 // MSVC 2005/8 + wcsncpy_s(destination, destination_size, source, count); +#else // _MSC_VER >= 1400 + // Pre-MSVC 2005/8 doesn't have wcsncpy_s. Simulate it with wcsncpy. + // wcsncpy doesn't 0-terminate the destination buffer if the source string + // is longer than size. Ensure that the destination is 0-terminated. + if (destination_size < count) + count = destination_size; + + wcsncpy(destination, source, count); + if (destination && count) + destination[count - 1] = 0; +#endif // _MSC_VER >= 1400 +} + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_STRING_UTILS_INL_H_ diff --git a/src/common/windows/string_utils.cc b/src/common/windows/string_utils.cc new file mode 100644 index 0000000..1e570b5 --- /dev/null +++ b/src/common/windows/string_utils.cc @@ -0,0 +1,136 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "common/windows/string_utils-inl.h" + +namespace google_breakpad { + +// static +wstring WindowsStringUtils::GetBaseName(const wstring& filename) { + wstring base_name(filename); + size_t slash_pos = base_name.find_last_of(L"/\\"); + if (slash_pos != wstring::npos) { + base_name.erase(0, slash_pos + 1); + } + return base_name; +} + +// static +bool WindowsStringUtils::safe_mbstowcs(const string& mbs, wstring* wcs) { + assert(wcs); + + // First, determine the length of the destination buffer. + size_t wcs_length; + +#if _MSC_VER >= 1400 // MSVC 2005/8 + errno_t err; + if ((err = mbstowcs_s(&wcs_length, NULL, 0, mbs.c_str(), _TRUNCATE)) != 0) { + return false; + } + assert(wcs_length > 0); +#else // _MSC_VER >= 1400 + if ((wcs_length = mbstowcs(NULL, mbs.c_str(), mbs.length())) == (size_t)-1) { + return false; + } + + // Leave space for the 0-terminator. + ++wcs_length; +#endif // _MSC_VER >= 1400 + + std::vector wcs_v(wcs_length); + + // Now, convert. +#if _MSC_VER >= 1400 // MSVC 2005/8 + if ((err = mbstowcs_s(NULL, &wcs_v[0], wcs_length, mbs.c_str(), + _TRUNCATE)) != 0) { + return false; + } +#else // _MSC_VER >= 1400 + if (mbstowcs(&wcs_v[0], mbs.c_str(), mbs.length()) == (size_t)-1) { + return false; + } + + // Ensure presence of 0-terminator. + wcs_v[wcs_length - 1] = '\0'; +#endif // _MSC_VER >= 1400 + + *wcs = &wcs_v[0]; + return true; +} + +// static +bool WindowsStringUtils::safe_wcstombs(const wstring& wcs, string* mbs) { + assert(mbs); + + // First, determine the length of the destination buffer. + size_t mbs_length; + +#if _MSC_VER >= 1400 // MSVC 2005/8 + errno_t err; + if ((err = wcstombs_s(&mbs_length, NULL, 0, wcs.c_str(), _TRUNCATE)) != 0) { + return false; + } + assert(mbs_length > 0); +#else // _MSC_VER >= 1400 + if ((mbs_length = wcstombs(NULL, wcs.c_str(), wcs.length())) == (size_t)-1) { + return false; + } + + // Leave space for the 0-terminator. + ++mbs_length; +#endif // _MSC_VER >= 1400 + + std::vector mbs_v(mbs_length); + + // Now, convert. +#if _MSC_VER >= 1400 // MSVC 2005/8 + if ((err = wcstombs_s(NULL, &mbs_v[0], mbs_length, wcs.c_str(), + _TRUNCATE)) != 0) { + return false; + } +#else // _MSC_VER >= 1400 + if (wcstombs(&mbs_v[0], wcs.c_str(), wcs.length()) == (size_t)-1) { + return false; + } + + // Ensure presence of 0-terminator. + mbs_v[mbs_length - 1] = '\0'; +#endif // _MSC_VER >= 1400 + + *mbs = &mbs_v[0]; + return true; +} + +} // namespace google_breakpad diff --git a/src/common/windows/sym_upload_v2_protocol.cc b/src/common/windows/sym_upload_v2_protocol.cc new file mode 100644 index 0000000..450f362 --- /dev/null +++ b/src/common/windows/sym_upload_v2_protocol.cc @@ -0,0 +1,122 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/windows/sym_upload_v2_protocol.h" + +#include + +#include "common/windows/http_upload.h" +#include "common/windows/symbol_collector_client.h" + +using google_breakpad::CompleteUploadResult; +using google_breakpad::HTTPUpload; +using google_breakpad::SymbolCollectorClient; +using google_breakpad::SymbolStatus; +using google_breakpad::UploadUrlResponse; +using std::wstring; + +namespace google_breakpad { + +static bool SymUploadV2ProtocolSend(const wchar_t* api_url, + const wchar_t* api_key, + int* timeout_ms, + const wstring& debug_file, + const wstring& debug_id, + const wstring& symbol_filename, + const wstring& symbol_type, + const wstring& product_name, + bool force) { + wstring url(api_url); + wstring key(api_key); + + if (!force) { + SymbolStatus symbolStatus = SymbolCollectorClient::CheckSymbolStatus( + url, key, timeout_ms, debug_file, debug_id); + if (symbolStatus == SymbolStatus::Found) { + wprintf( + L"Symbol file already exists, upload aborted." + L" Use \"-f\" to overwrite.\n"); + return true; + } else if (symbolStatus == SymbolStatus::Unknown) { + wprintf(L"Failed to get check for existing symbol.\n"); + return false; + } + } + + UploadUrlResponse uploadUrlResponse; + if (!SymbolCollectorClient::CreateUploadUrl(url, key, timeout_ms, + &uploadUrlResponse)) { + wprintf(L"Failed to create upload URL.\n"); + return false; + } + + wstring signed_url = uploadUrlResponse.upload_url; + wstring upload_key = uploadUrlResponse.upload_key; + wstring response; + int response_code; + bool success = HTTPUpload::SendPutRequest( + signed_url, symbol_filename, timeout_ms, &response, &response_code); + if (!success) { + wprintf(L"Failed to send symbol file.\n"); + wprintf(L"Response code: %ld\n", response_code); + wprintf(L"Response:\n"); + wprintf(L"%s\n", response.c_str()); + return false; + } else if (response_code == 0) { + wprintf(L"Failed to send symbol file: No response code\n"); + return false; + } else if (response_code != 200) { + wprintf(L"Failed to send symbol file: Response code %ld\n", response_code); + wprintf(L"Response:\n"); + wprintf(L"%s\n", response.c_str()); + return false; + } + + CompleteUploadResult completeUploadResult = + SymbolCollectorClient::CompleteUpload(url, key, timeout_ms, upload_key, + debug_file, debug_id, symbol_type, + product_name); + if (completeUploadResult == CompleteUploadResult::Error) { + wprintf(L"Failed to complete upload.\n"); + return false; + } else if (completeUploadResult == CompleteUploadResult::DuplicateData) { + wprintf( + L"Uploaded file checksum matched existing file checksum," + L" no change necessary.\n"); + } else { + wprintf(L"Successfully sent the symbol file.\n"); + } + + return true; +} + +} // namespace google_breakpad diff --git a/src/common/windows/sym_upload_v2_protocol.h b/src/common/windows/sym_upload_v2_protocol.h new file mode 100644 index 0000000..19e6f87 --- /dev/null +++ b/src/common/windows/sym_upload_v2_protocol.h @@ -0,0 +1,66 @@ +// Copyright 2022 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_WINDOWS_SYM_UPLOAD_V2_PROTOCOL_H_ +#define COMMON_WINDOWS_SYM_UPLOAD_V2_PROTOCOL_H_ + +#include + +namespace google_breakpad { + +// Sends file at |symbol_filename| using the sym-upload-v2 protocol to +// |api_url| using key |api_key|, and using identifiers |debug_file| and +// |debug_id|. |timeout_ms| is the number of milliseconds to wait before +// terminating the upload attempt. |symbol_type| is the type of the symbol +// file, which is one of: +// "BREAKPAD" +// "ELF" +// "PE" +// "MACHO" +// "DEBUG_ONLY" +// "DWP" +// "DSYM" +// "PDB" +// "SOURCE_MAP" +// If |product_name| is non-empty then it will be sent as part of the symbol +// metadata. +// If |force| is set then it will overwrite an existing file with the +// same |debug_file| and |debug_id| in the store. +bool SymUploadV2ProtocolSend(const wchar_t* api_url, + const wchar_t* api_key, + int* timeout_ms, + const std::wstring& debug_file, + const std::wstring& debug_id, + const std::wstring& symbol_filename, + const std::wstring& symbol_type, + const std::wstring& product_name, + bool force); + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_SYM_UPLOAD_V2_PROTOCOL_H_ \ No newline at end of file diff --git a/src/common/windows/symbol_collector_client.cc b/src/common/windows/symbol_collector_client.cc new file mode 100644 index 0000000..d91b702 --- /dev/null +++ b/src/common/windows/symbol_collector_client.cc @@ -0,0 +1,179 @@ +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/windows/symbol_collector_client.h" + +#include + +#include + +#include "common/windows/http_upload.h" + +namespace google_breakpad { + + // static + bool SymbolCollectorClient::CreateUploadUrl( + wstring& api_url, + wstring& api_key, + int* timeout_ms, + UploadUrlResponse *uploadUrlResponse) { + wstring url = api_url + + L"/v1/uploads:create" + L"?key=" + api_key; + wstring response; + int response_code; + + if (!HTTPUpload::SendSimplePostRequest( + url, + L"", + L"", + timeout_ms, + &response, + &response_code)) { + wprintf(L"Failed to create upload url.\n"); + wprintf(L"Response code: %ld\n", response_code); + wprintf(L"Response:\n"); + wprintf(L"%s\n", response.c_str()); + return false; + } + + // Note camel-case rather than underscores. + std::wregex upload_url_regex(L"\"uploadUrl\": \"([^\"]+)\""); + std::wregex upload_key_regex(L"\"uploadKey\": \"([^\"]+)\""); + + std::wsmatch upload_url_match; + if (!std::regex_search(response, upload_url_match, upload_url_regex) || + upload_url_match.size() != 2) { + wprintf(L"Failed to parse create url response."); + wprintf(L"Response:\n"); + wprintf(L"%s\n", response.c_str()); + return false; + } + wstring upload_url = upload_url_match[1].str(); + + std::wsmatch upload_key_match; + if (!std::regex_search(response, upload_key_match, upload_key_regex) || + upload_key_match.size() != 2) { + wprintf(L"Failed to parse create url response."); + wprintf(L"Response:\n"); + wprintf(L"%s\n", response.c_str()); + return false; + } + wstring upload_key = upload_key_match[1].str(); + + uploadUrlResponse->upload_url = upload_url; + uploadUrlResponse->upload_key = upload_key; + return true; + } + + // static + CompleteUploadResult SymbolCollectorClient::CompleteUpload( + wstring& api_url, + wstring& api_key, + int* timeout_ms, + const wstring& upload_key, + const wstring& debug_file, + const wstring& debug_id, + const wstring& type, + const wstring& product_name) { + wstring url = api_url + + L"/v1/uploads/" + upload_key + L":complete" + L"?key=" + api_key; + wstring body = + L"{ symbol_id: {" + L"debug_file: \"" + + debug_file + + L"\", " + L"debug_id: \"" + + debug_id + + L"\" " + L"}, "; + if (!product_name.empty()) { + body += + L"metadata: {" + L"product_name: \"" + + product_name + + L"\"" + L"},"; + } + body += L"symbol_upload_type: \"" + type + + L"\", " + L"use_async_processing: true }"; + wstring response; + int response_code; + + if (!HTTPUpload::SendSimplePostRequest( + url, + body, + L"application/json", + timeout_ms, + &response, + &response_code)) { + wprintf(L"Failed to complete upload.\n"); + wprintf(L"Response code: %ld\n", response_code); + wprintf(L"Response:\n"); + wprintf(L"%s\n", response.c_str()); + return CompleteUploadResult::Error; + } + + std::wregex result_regex(L"\"result\": \"([^\"]+)\""); + std::wsmatch result_match; + if (!std::regex_search(response, result_match, result_regex) || + result_match.size() != 2) { + wprintf(L"Failed to parse complete upload response."); + wprintf(L"Response:\n"); + wprintf(L"%s\n", response.c_str()); + return CompleteUploadResult::Error; + } + wstring result = result_match[1].str(); + + if (result.compare(L"DUPLICATE_DATA") == 0) { + return CompleteUploadResult::DuplicateData; + } + + return CompleteUploadResult::Ok; + } + + // static + SymbolStatus SymbolCollectorClient::CheckSymbolStatus( + wstring& api_url, + wstring& api_key, + int* timeout_ms, + const wstring& debug_file, + const wstring& debug_id) { + wstring response; + int response_code; + wstring url = api_url + + L"/v1/symbols/" + debug_file + L"/" + debug_id + L":checkStatus" + L"?key=" + api_key; + + if (!HTTPUpload::SendGetRequest( + url, + timeout_ms, + &response, + &response_code)) { + wprintf(L"Failed to check symbol status.\n"); + wprintf(L"Response code: %ld\n", response_code); + wprintf(L"Response:\n"); + wprintf(L"%s\n", response.c_str()); + return SymbolStatus::Unknown; + } + + std::wregex status_regex(L"\"status\": \"([^\"]+)\""); + std::wsmatch status_match; + if (!std::regex_search(response, status_match, status_regex) || + status_match.size() != 2) { + wprintf(L"Failed to parse check symbol status response."); + wprintf(L"Response:\n"); + wprintf(L"%s\n", response.c_str()); + return SymbolStatus::Unknown; + } + wstring status = status_match[1].str(); + + return (status.compare(L"FOUND") == 0) ? + SymbolStatus::Found : + SymbolStatus::Missing; + } + +} // namespace google_breakpad \ No newline at end of file diff --git a/src/common/windows/symbol_collector_client.h b/src/common/windows/symbol_collector_client.h new file mode 100644 index 0000000..4e9bf3b --- /dev/null +++ b/src/common/windows/symbol_collector_client.h @@ -0,0 +1,92 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef COMMON_WINDOWS_SYMBOL_COLLECTOR_CLIENT_H_ +#define COMMON_WINDOWS_SYMBOL_COLLECTOR_CLIENT_H_ + +#include + +namespace google_breakpad { + + using std::wstring; + + struct UploadUrlResponse { + // URL at which to HTTP PUT symbol file. + wstring upload_url; + // Unique key used to complete upload of symbol file. + wstring upload_key; + }; + + enum SymbolStatus { + Found, + Missing, + Unknown + }; + + enum CompleteUploadResult { + Ok, + DuplicateData, + Error + }; + + // Client to interact with sym-upload-v2 API server via HTTP/REST. + class SymbolCollectorClient { + public: + // Returns a URL at which a symbol file can be HTTP PUT without + // authentication, along with an upload key that can be used to + // complete the upload process with CompleteUpload. + static bool CreateUploadUrl( + wstring& api_url, + wstring& api_key, + int* timeout_ms, + UploadUrlResponse *uploadUrlResponse); + + // Notify the API that symbol file upload is finished and its contents + // are ready to be read and/or used for further processing. + static CompleteUploadResult CompleteUpload(wstring& api_url, + wstring& api_key, + int* timeout_ms, + const wstring& upload_key, + const wstring& debug_file, + const wstring& debug_id, + const wstring& type, + const wstring& product_name); + + // Returns whether or not a symbol file corresponding to the debug_file/ + // debug_id pair is already present in symbol storage. + static SymbolStatus CheckSymbolStatus( + wstring& api_url, + wstring& api_key, + int* timeout_ms, + const wstring& debug_file, + const wstring& debug_id); + }; + +} // namespace google_breakpad + +#endif // COMMON_WINDOWS_SYMBOL_COLLECTOR_CLIENT_H_ diff --git a/src/config.h.in b/src/config.h.in new file mode 100644 index 0000000..9a4eb0d --- /dev/null +++ b/src/config.h.in @@ -0,0 +1,106 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the `arc4random' function. */ +#undef HAVE_ARC4RANDOM + +/* Define to 1 if you have the header file. */ +#undef HAVE_A_OUT_H + +/* define if the compiler supports basic C++17 syntax */ +#undef HAVE_CXX17 + +/* Define to 1 if you have the `getcontext' function. */ +#undef HAVE_GETCONTEXT + +/* Define to 1 if you have the `getrandom' function. */ +#undef HAVE_GETRANDOM + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `rustc_demangle' library (-lrustc_demangle). */ +#undef HAVE_LIBRUSTC_DEMANGLE + +/* Define to 1 if you have the `zstd' library (-lzstd). */ +#undef HAVE_LIBZSTD + +/* Define to 1 if you have the `memfd_create' function. */ +#undef HAVE_MEMFD_CREATE + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Define to 1 if you have the header file. */ +#undef HAVE_RUSTC_DEMANGLE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MMAN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RANDOM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Fallback definition for old systems */ +#undef O_CLOEXEC + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES diff --git a/src/google_breakpad/common/breakpad_types.h b/src/google_breakpad/common/breakpad_types.h new file mode 100644 index 0000000..efd94e9 --- /dev/null +++ b/src/google_breakpad/common/breakpad_types.h @@ -0,0 +1,67 @@ +/* Copyright 2006 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* breakpad_types.h: Precise-width types + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file ensures that types uintN_t are defined for N = 8, 16, 32, and + * 64. Types of precise widths are crucial to the task of writing data + * structures on one platform and reading them on another. + * + * Author: Mark Mentovai */ + +#ifndef GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ +#define GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ + +#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && \ + !defined(__STDC_FORMAT_MACROS) +#error "inttypes.h has already been included before this header file, but " +#error "without __STDC_FORMAT_MACROS defined." +#endif + +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif /* __STDC_FORMAT_MACROS */ +#include + +typedef struct { + uint64_t high; + uint64_t low; +} uint128_struct; + +typedef uint64_t breakpad_time_t; + +/* Try to get PRIx64 from inttypes.h, but if it's not defined, fall back to + * llx, which is the format string for "long long" - this is a 64-bit + * integral type on many systems. */ +#ifndef PRIx64 +#define PRIx64 "llx" +#endif /* !PRIx64 */ + +#endif /* GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ */ diff --git a/src/google_breakpad/common/minidump_cpu_amd64.h b/src/google_breakpad/common/minidump_cpu_amd64.h new file mode 100644 index 0000000..be20980 --- /dev/null +++ b/src/google_breakpad/common/minidump_cpu_amd64.h @@ -0,0 +1,234 @@ +/* Copyright 2006 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on amd64. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai + * Change to split into its own file: Neal Sidhwaney */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ + + +/* + * AMD64 support, see WINNT.H + */ + +typedef struct { + uint16_t control_word; + uint16_t status_word; + uint8_t tag_word; + uint8_t reserved1; + uint16_t error_opcode; + uint32_t error_offset; + uint16_t error_selector; + uint16_t reserved2; + uint32_t data_offset; + uint16_t data_selector; + uint16_t reserved3; + uint32_t mx_csr; + uint32_t mx_csr_mask; + uint128_struct float_registers[8]; + uint128_struct xmm_registers[16]; + uint8_t reserved4[96]; +} MDXmmSaveArea32AMD64; /* XMM_SAVE_AREA32 */ + +#define MD_CONTEXT_AMD64_VR_COUNT 26 + +typedef struct { + /* + * Register parameter home addresses. + */ + uint64_t p1_home; + uint64_t p2_home; + uint64_t p3_home; + uint64_t p4_home; + uint64_t p5_home; + uint64_t p6_home; + + /* The next field determines the layout of the structure, and which parts + * of it are populated */ + uint32_t context_flags; + uint32_t mx_csr; + + /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ + uint16_t cs; + + /* The next 4 registers are included with MD_CONTEXT_AMD64_SEGMENTS */ + uint16_t ds; + uint16_t es; + uint16_t fs; + uint16_t gs; + + /* The next 2 registers are included with MD_CONTEXT_AMD64_CONTROL */ + uint16_t ss; + uint32_t eflags; + + /* The next 6 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */ + uint64_t dr0; + uint64_t dr1; + uint64_t dr2; + uint64_t dr3; + uint64_t dr6; + uint64_t dr7; + + /* The next 4 registers are included with MD_CONTEXT_AMD64_INTEGER */ + uint64_t rax; + uint64_t rcx; + uint64_t rdx; + uint64_t rbx; + + /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ + uint64_t rsp; + + /* The next 11 registers are included with MD_CONTEXT_AMD64_INTEGER */ + uint64_t rbp; + uint64_t rsi; + uint64_t rdi; + uint64_t r8; + uint64_t r9; + uint64_t r10; + uint64_t r11; + uint64_t r12; + uint64_t r13; + uint64_t r14; + uint64_t r15; + + /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ + uint64_t rip; + + /* The next set of registers are included with + * MD_CONTEXT_AMD64_FLOATING_POINT + */ + union { + MDXmmSaveArea32AMD64 flt_save; + struct { + uint128_struct header[2]; + uint128_struct legacy[8]; + uint128_struct xmm0; + uint128_struct xmm1; + uint128_struct xmm2; + uint128_struct xmm3; + uint128_struct xmm4; + uint128_struct xmm5; + uint128_struct xmm6; + uint128_struct xmm7; + uint128_struct xmm8; + uint128_struct xmm9; + uint128_struct xmm10; + uint128_struct xmm11; + uint128_struct xmm12; + uint128_struct xmm13; + uint128_struct xmm14; + uint128_struct xmm15; + } sse_registers; + }; + + uint128_struct vector_register[MD_CONTEXT_AMD64_VR_COUNT]; + uint64_t vector_control; + + /* The next 5 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */ + uint64_t debug_control; + uint64_t last_branch_to_rip; + uint64_t last_branch_from_rip; + uint64_t last_exception_to_rip; + uint64_t last_exception_from_rip; + +} MDRawContextAMD64; /* CONTEXT */ + +/* For (MDRawContextAMD64).context_flags. These values indicate the type of + * context stored in the structure. The high 24 bits identify the CPU, the + * low 8 bits identify the type of context saved. */ +#define MD_CONTEXT_AMD64 0x00100000 /* CONTEXT_AMD64 */ +#define MD_CONTEXT_AMD64_CONTROL (MD_CONTEXT_AMD64 | 0x00000001) + /* CONTEXT_CONTROL */ +#define MD_CONTEXT_AMD64_INTEGER (MD_CONTEXT_AMD64 | 0x00000002) + /* CONTEXT_INTEGER */ +#define MD_CONTEXT_AMD64_SEGMENTS (MD_CONTEXT_AMD64 | 0x00000004) + /* CONTEXT_SEGMENTS */ +#define MD_CONTEXT_AMD64_FLOATING_POINT (MD_CONTEXT_AMD64 | 0x00000008) + /* CONTEXT_FLOATING_POINT */ +#define MD_CONTEXT_AMD64_DEBUG_REGISTERS (MD_CONTEXT_AMD64 | 0x00000010) + /* CONTEXT_DEBUG_REGISTERS */ +#define MD_CONTEXT_AMD64_XSTATE (MD_CONTEXT_AMD64 | 0x00000040) + /* CONTEXT_XSTATE */ + +/* WinNT.h refers to CONTEXT_MMX_REGISTERS but doesn't appear to define it + * I think it really means CONTEXT_FLOATING_POINT. + */ + +#define MD_CONTEXT_AMD64_FULL (MD_CONTEXT_AMD64_CONTROL | \ + MD_CONTEXT_AMD64_INTEGER | \ + MD_CONTEXT_AMD64_FLOATING_POINT) + /* CONTEXT_FULL */ + +#define MD_CONTEXT_AMD64_ALL (MD_CONTEXT_AMD64_FULL | \ + MD_CONTEXT_AMD64_SEGMENTS | \ + MD_CONTEXT_AMD64_DEBUG_REGISTERS) + /* CONTEXT_ALL */ + + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ */ diff --git a/src/google_breakpad/common/minidump_cpu_arm.h b/src/google_breakpad/common/minidump_cpu_arm.h new file mode 100644 index 0000000..2ac0623 --- /dev/null +++ b/src/google_breakpad/common/minidump_cpu_arm.h @@ -0,0 +1,150 @@ +/* Copyright 2009 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on ARM. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by + * ensuring that all members are aligned on their natural boundaries. + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. + * + * Author: Julian Seward + */ + +/* + * ARM support + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__ + +#define MD_FLOATINGSAVEAREA_ARM_FPR_COUNT 32 +#define MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT 8 + +/* + * Note that these structures *do not* map directly to the CONTEXT + * structure defined in WinNT.h in the Windows Mobile SDK. That structure + * does not accomodate VFPv3, and I'm unsure if it was ever used in the + * wild anyway, as Windows CE only seems to produce "cedumps" which + * are not exactly minidumps. + */ +typedef struct { + uint64_t fpscr; /* FPU status register */ + + /* 32 64-bit floating point registers, d0 .. d31. */ + uint64_t regs[MD_FLOATINGSAVEAREA_ARM_FPR_COUNT]; + + /* Miscellaneous control words */ + uint32_t extra[MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT]; +} MDFloatingSaveAreaARM; + +#define MD_CONTEXT_ARM_GPR_COUNT 16 + +typedef struct { + /* The next field determines the layout of the structure, and which parts + * of it are populated + */ + uint32_t context_flags; + + /* 16 32-bit integer registers, r0 .. r15 + * Note the following fixed uses: + * r13 is the stack pointer + * r14 is the link register + * r15 is the program counter + */ + uint32_t iregs[MD_CONTEXT_ARM_GPR_COUNT]; + + /* CPSR (flags, basically): 32 bits: + bit 31 - N (negative) + bit 30 - Z (zero) + bit 29 - C (carry) + bit 28 - V (overflow) + bit 27 - Q (saturation flag, sticky) + All other fields -- ignore */ + uint32_t cpsr; + + /* The next field is included with MD_CONTEXT_ARM_FLOATING_POINT */ + MDFloatingSaveAreaARM float_save; + +} MDRawContextARM; + +/* Indices into iregs for registers with a dedicated or conventional + * purpose. + */ +enum MDARMRegisterNumbers { + MD_CONTEXT_ARM_REG_IOS_FP = 7, + MD_CONTEXT_ARM_REG_FP = 11, + MD_CONTEXT_ARM_REG_SP = 13, + MD_CONTEXT_ARM_REG_LR = 14, + MD_CONTEXT_ARM_REG_PC = 15 +}; + +/* For (MDRawContextARM).context_flags. These values indicate the type of + * context stored in the structure. */ +/* CONTEXT_ARM from the Windows CE 5.0 SDK. This value isn't correct + * because this bit can be used for flags. Presumably this value was + * never actually used in minidumps, but only in "CEDumps" which + * are a whole parallel minidump file format for Windows CE. + * Therefore, Breakpad defines its own value for ARM CPUs. + */ +#define MD_CONTEXT_ARM_OLD 0x00000040 +/* This value was chosen to avoid likely conflicts with MD_CONTEXT_* + * for other CPUs. */ +#define MD_CONTEXT_ARM 0x40000000 +#define MD_CONTEXT_ARM_INTEGER (MD_CONTEXT_ARM | 0x00000002) +#define MD_CONTEXT_ARM_FLOATING_POINT (MD_CONTEXT_ARM | 0x00000004) + +#define MD_CONTEXT_ARM_FULL (MD_CONTEXT_ARM_INTEGER | \ + MD_CONTEXT_ARM_FLOATING_POINT) + +#define MD_CONTEXT_ARM_ALL (MD_CONTEXT_ARM_INTEGER | \ + MD_CONTEXT_ARM_FLOATING_POINT) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__ */ diff --git a/src/google_breakpad/common/minidump_cpu_arm64.h b/src/google_breakpad/common/minidump_cpu_arm64.h new file mode 100644 index 0000000..96f2633 --- /dev/null +++ b/src/google_breakpad/common/minidump_cpu_arm64.h @@ -0,0 +1,191 @@ +/* Copyright 2013 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on ARM. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by + * ensuring that all members are aligned on their natural boundaries. + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. + * + * Author: Colin Blundell + */ + +/* + * ARM64 support + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__ + +#include "google_breakpad/common/breakpad_types.h" + +#define MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT 32 +#define MD_CONTEXT_ARM64_GPR_COUNT 33 + +typedef struct { + /* 32 128-bit floating point registers, d0 .. d31. */ + uint128_struct regs[MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT]; + + uint32_t fpcr; /* FPU control register */ + uint32_t fpsr; /* FPU status register */ +} MDFloatingSaveAreaARM64; + +/* For (MDRawContextARM64).context_flags. These values indicate the type of + * context stored in the structure. */ +#define MD_CONTEXT_ARM64 0x00400000 +#define MD_CONTEXT_ARM64_CONTROL (MD_CONTEXT_ARM64 | 0x00000001) +#define MD_CONTEXT_ARM64_INTEGER (MD_CONTEXT_ARM64 | 0x00000002) +#define MD_CONTEXT_ARM64_FLOATING_POINT (MD_CONTEXT_ARM64 | 0x00000004) +#define MD_CONTEXT_ARM64_DEBUG (MD_CONTEXT_ARM64 | 0x00000008) +#define MD_CONTEXT_ARM64_FULL (MD_CONTEXT_ARM64_CONTROL | \ + MD_CONTEXT_ARM64_INTEGER | \ + MD_CONTEXT_ARM64_FLOATING_POINT) +#define MD_CONTEXT_ARM64_ALL (MD_CONTEXT_ARM64_FULL | MD_CONTEXT_ARM64_DEBUG) + +typedef struct { + /* Determines which fields of this struct are populated */ + uint32_t context_flags; + + /* CPSR (flags, basically): 32 bits: + bit 31 - N (negative) + bit 30 - Z (zero) + bit 29 - C (carry) + bit 28 - V (overflow) + bit 27 - Q (saturation flag, sticky) + All other fields -- ignore */ + uint32_t cpsr; + + /* 33 64-bit integer registers, x0 .. x31 + the PC + * Note the following fixed uses: + * x29 is the frame pointer + * x30 is the link register + * x31 is the stack pointer + * The PC is effectively x32. + */ + uint64_t iregs[MD_CONTEXT_ARM64_GPR_COUNT]; + + /* The next field is included with MD_CONTEXT64_ARM_FLOATING_POINT */ + MDFloatingSaveAreaARM64 float_save; + + uint32_t bcr[8]; + uint64_t bvr[8]; + uint32_t wcr[2]; + uint64_t wvr[2]; +} MDRawContextARM64; + +typedef struct { + uint32_t fpsr; /* FPU status register */ + uint32_t fpcr; /* FPU control register */ + + /* 32 128-bit floating point registers, d0 .. d31. */ + uint128_struct regs[MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT]; +} MDFloatingSaveAreaARM64_Old; + +/* Use the same 32-bit alignment when accessing this structure from 64-bit code + * as is used natively in 32-bit code. */ +#pragma pack(push, 4) + +typedef struct { + /* The next field determines the layout of the structure, and which parts + * of it are populated + */ + uint64_t context_flags; + + /* 33 64-bit integer registers, x0 .. x31 + the PC + * Note the following fixed uses: + * x29 is the frame pointer + * x30 is the link register + * x31 is the stack pointer + * The PC is effectively x32. + */ + uint64_t iregs[MD_CONTEXT_ARM64_GPR_COUNT]; + + /* CPSR (flags, basically): 32 bits: + bit 31 - N (negative) + bit 30 - Z (zero) + bit 29 - C (carry) + bit 28 - V (overflow) + bit 27 - Q (saturation flag, sticky) + All other fields -- ignore */ + uint32_t cpsr; + + /* The next field is included with MD_CONTEXT64_ARM_FLOATING_POINT */ + MDFloatingSaveAreaARM64_Old float_save; + +} MDRawContextARM64_Old; + +#pragma pack(pop) + +/* Indices into iregs for registers with a dedicated or conventional + * purpose. + */ +enum MDARM64RegisterNumbers { + MD_CONTEXT_ARM64_REG_FP = 29, + MD_CONTEXT_ARM64_REG_LR = 30, + MD_CONTEXT_ARM64_REG_SP = 31, + MD_CONTEXT_ARM64_REG_PC = 32 +}; + +/* For (MDRawContextARM64_Old).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_ARM64_OLD is Breakpad-defined. + * This value was chosen to avoid likely conflicts with MD_CONTEXT_* + * for other CPUs. */ +#define MD_CONTEXT_ARM64_OLD 0x80000000 +#define MD_CONTEXT_ARM64_INTEGER_OLD (MD_CONTEXT_ARM64_OLD | 0x00000002) +#define MD_CONTEXT_ARM64_FLOATING_POINT_OLD (MD_CONTEXT_ARM64_OLD | 0x00000004) + +#define MD_CONTEXT_ARM64_FULL_OLD (MD_CONTEXT_ARM64_INTEGER_OLD | \ + MD_CONTEXT_ARM64_FLOATING_POINT_OLD) + +#define MD_CONTEXT_ARM64_ALL_OLD (MD_CONTEXT_ARM64_INTEGER_OLD | \ + MD_CONTEXT_ARM64_FLOATING_POINT_OLD) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__ */ diff --git a/src/google_breakpad/common/minidump_cpu_mips.h b/src/google_breakpad/common/minidump_cpu_mips.h new file mode 100644 index 0000000..91b700a --- /dev/null +++ b/src/google_breakpad/common/minidump_cpu_mips.h @@ -0,0 +1,175 @@ +/* Copyright 2013 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on MIPS. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by + * ensuring that all members are aligned on their natural boundaries. + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. + * + * Author: Chris Dearman + */ + +/* + * MIPS support + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__ + +#define MD_CONTEXT_MIPS_GPR_COUNT 32 +#define MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT 32 +#define MD_CONTEXT_MIPS_DSP_COUNT 3 + +/* + * Note that these structures *do not* map directly to the CONTEXT + * structure defined in WinNT.h in the Windows Mobile SDK. That structure + * does not accomodate VFPv3, and I'm unsure if it was ever used in the + * wild anyway, as Windows CE only seems to produce "cedumps" which + * are not exactly minidumps. + */ +typedef struct { + /* 32 64-bit floating point registers, f0..f31 */ + uint64_t regs[MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT]; + + uint32_t fpcsr; /* FPU status register. */ + uint32_t fir; /* FPU implementation register. */ +} MDFloatingSaveAreaMIPS; + +typedef struct { + /* The next field determines the layout of the structure, and which parts + * of it are populated. + */ + uint32_t context_flags; + uint32_t _pad0; + + /* 32 64-bit integer registers, r0..r31. + * Note the following fixed uses: + * r29 is the stack pointer. + * r31 is the return address. + */ + uint64_t iregs[MD_CONTEXT_MIPS_GPR_COUNT]; + + /* multiply/divide result. */ + uint64_t mdhi, mdlo; + + /* DSP accumulators. */ + uint32_t hi[MD_CONTEXT_MIPS_DSP_COUNT]; + uint32_t lo[MD_CONTEXT_MIPS_DSP_COUNT]; + uint32_t dsp_control; + uint32_t _pad1; + + uint64_t epc; + uint64_t badvaddr; + uint32_t status; + uint32_t cause; + + /* The next field is included with MD_CONTEXT_MIPS_FLOATING_POINT. */ + MDFloatingSaveAreaMIPS float_save; + +} MDRawContextMIPS; + +/* Indices into iregs for registers with a dedicated or conventional + * purpose. + */ +enum MDMIPSRegisterNumbers { + MD_CONTEXT_MIPS_REG_S0 = 16, + MD_CONTEXT_MIPS_REG_S1 = 17, + MD_CONTEXT_MIPS_REG_S2 = 18, + MD_CONTEXT_MIPS_REG_S3 = 19, + MD_CONTEXT_MIPS_REG_S4 = 20, + MD_CONTEXT_MIPS_REG_S5 = 21, + MD_CONTEXT_MIPS_REG_S6 = 22, + MD_CONTEXT_MIPS_REG_S7 = 23, + MD_CONTEXT_MIPS_REG_GP = 28, + MD_CONTEXT_MIPS_REG_SP = 29, + MD_CONTEXT_MIPS_REG_FP = 30, + MD_CONTEXT_MIPS_REG_RA = 31, +}; + +/* For (MDRawContextMIPS).context_flags. These values indicate the type of + * context stored in the structure. */ +/* CONTEXT_MIPS from the Windows CE 5.0 SDK. This value isn't correct + * because this bit can be used for flags. Presumably this value was + * never actually used in minidumps, but only in "CEDumps" which + * are a whole parallel minidump file format for Windows CE. + * Therefore, Breakpad defines its own value for MIPS CPUs. + */ +#define MD_CONTEXT_MIPS 0x00040000 +#define MD_CONTEXT_MIPS_INTEGER (MD_CONTEXT_MIPS | 0x00000002) +#define MD_CONTEXT_MIPS_FLOATING_POINT (MD_CONTEXT_MIPS | 0x00000004) +#define MD_CONTEXT_MIPS_DSP (MD_CONTEXT_MIPS | 0x00000008) + +#define MD_CONTEXT_MIPS_FULL (MD_CONTEXT_MIPS_INTEGER | \ + MD_CONTEXT_MIPS_FLOATING_POINT | \ + MD_CONTEXT_MIPS_DSP) + +#define MD_CONTEXT_MIPS_ALL (MD_CONTEXT_MIPS_INTEGER | \ + MD_CONTEXT_MIPS_FLOATING_POINT \ + MD_CONTEXT_MIPS_DSP) + +/** + * Breakpad defines for MIPS64 + */ +#define MD_CONTEXT_MIPS64 0x00080000 +#define MD_CONTEXT_MIPS64_INTEGER (MD_CONTEXT_MIPS64 | 0x00000002) +#define MD_CONTEXT_MIPS64_FLOATING_POINT (MD_CONTEXT_MIPS64 | 0x00000004) +#define MD_CONTEXT_MIPS64_DSP (MD_CONTEXT_MIPS64 | 0x00000008) + +#define MD_CONTEXT_MIPS64_FULL (MD_CONTEXT_MIPS64_INTEGER | \ + MD_CONTEXT_MIPS64_FLOATING_POINT | \ + MD_CONTEXT_MIPS64_DSP) + +#define MD_CONTEXT_MIPS64_ALL (MD_CONTEXT_MIPS64_INTEGER | \ + MD_CONTEXT_MIPS64_FLOATING_POINT \ + MD_CONTEXT_MIPS64_DSP) + +#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__ diff --git a/src/google_breakpad/common/minidump_cpu_ppc.h b/src/google_breakpad/common/minidump_cpu_ppc.h new file mode 100644 index 0000000..17a71af --- /dev/null +++ b/src/google_breakpad/common/minidump_cpu_ppc.h @@ -0,0 +1,167 @@ +/* Copyright 2006 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on ppc. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai + * Change to split into its own file: Neal Sidhwaney */ + +/* + * Breakpad minidump extension for PowerPC support. Based on Darwin/Mac OS X' + * mach/ppc/_types.h + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ + +#define MD_FLOATINGSAVEAREA_PPC_FPR_COUNT 32 + +typedef struct { + /* fpregs is a double[32] in mach/ppc/_types.h, but a uint64_t is used + * here for precise sizing. */ + uint64_t fpregs[MD_FLOATINGSAVEAREA_PPC_FPR_COUNT]; + uint32_t fpscr_pad; + uint32_t fpscr; /* Status/control */ +} MDFloatingSaveAreaPPC; /* Based on ppc_float_state */ + + +#define MD_VECTORSAVEAREA_PPC_VR_COUNT 32 + +typedef struct { + /* Vector registers (including vscr) are 128 bits, but mach/ppc/_types.h + * exposes them as four 32-bit quantities. */ + uint128_struct save_vr[MD_VECTORSAVEAREA_PPC_VR_COUNT]; + uint128_struct save_vscr; /* Status/control */ + uint32_t save_pad5[4]; + uint32_t save_vrvalid; /* Indicates which vector registers are saved */ + uint32_t save_pad6[7]; +} MDVectorSaveAreaPPC; /* ppc_vector_state */ + + +#define MD_CONTEXT_PPC_GPR_COUNT 32 + +/* Use the same 32-bit alignment when accessing this structure from 64-bit code + * as is used natively in 32-bit code. #pragma pack is a MSVC extension + * supported by gcc. */ +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#pragma pack(4) +#else +#pragma pack(push, 4) +#endif + +typedef struct { + /* context_flags is not present in ppc_thread_state, but it aids + * identification of MDRawContextPPC among other raw context types, + * and it guarantees alignment when we get to float_save. */ + uint32_t context_flags; + + uint32_t srr0; /* Machine status save/restore: stores pc + * (instruction) */ + uint32_t srr1; /* Machine status save/restore: stores msr + * (ps, program/machine state) */ + /* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is + * used for brevity. */ + uint32_t gpr[MD_CONTEXT_PPC_GPR_COUNT]; + uint32_t cr; /* Condition */ + uint32_t xer; /* Integer (fiXed-point) exception */ + uint32_t lr; /* Link */ + uint32_t ctr; /* Count */ + uint32_t mq; /* Multiply/Quotient (PPC 601, POWER only) */ + uint32_t vrsave; /* Vector save */ + + /* float_save and vector_save aren't present in ppc_thread_state, but + * are represented in separate structures that still define a thread's + * context. */ + MDFloatingSaveAreaPPC float_save; + MDVectorSaveAreaPPC vector_save; +} MDRawContextPPC; /* Based on ppc_thread_state */ + +/* Indices into gpr for registers with a dedicated or conventional purpose. */ +enum MDPPCRegisterNumbers { + MD_CONTEXT_PPC_REG_SP = 1 +}; + +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#pragma pack(0) +#else +#pragma pack(pop) +#endif + +/* For (MDRawContextPPC).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its + * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other + * CPUs. */ +#define MD_CONTEXT_PPC 0x20000000 +#define MD_CONTEXT_PPC_BASE (MD_CONTEXT_PPC | 0x00000001) +#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008) +#define MD_CONTEXT_PPC_VECTOR (MD_CONTEXT_PPC | 0x00000020) + +#define MD_CONTEXT_PPC_FULL MD_CONTEXT_PPC_BASE +#define MD_CONTEXT_PPC_ALL (MD_CONTEXT_PPC_FULL | \ + MD_CONTEXT_PPC_FLOATING_POINT | \ + MD_CONTEXT_PPC_VECTOR) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ */ diff --git a/src/google_breakpad/common/minidump_cpu_ppc64.h b/src/google_breakpad/common/minidump_cpu_ppc64.h new file mode 100644 index 0000000..75638b5 --- /dev/null +++ b/src/google_breakpad/common/minidump_cpu_ppc64.h @@ -0,0 +1,133 @@ +/* Copyright 2008 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on ppc64. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Neal Sidhwaney */ + + +/* + * Breakpad minidump extension for PPC64 support. Based on Darwin/Mac OS X' + * mach/ppc/_types.h + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ + +#include "minidump_cpu_ppc.h" + +// these types are the same in ppc64 & ppc +typedef MDFloatingSaveAreaPPC MDFloatingSaveAreaPPC64; +typedef MDVectorSaveAreaPPC MDVectorSaveAreaPPC64; + +#define MD_CONTEXT_PPC64_GPR_COUNT MD_CONTEXT_PPC_GPR_COUNT + +typedef struct { + /* context_flags is not present in ppc_thread_state, but it aids + * identification of MDRawContextPPC among other raw context types, + * and it guarantees alignment when we get to float_save. */ + uint64_t context_flags; + + uint64_t srr0; /* Machine status save/restore: stores pc + * (instruction) */ + uint64_t srr1; /* Machine status save/restore: stores msr + * (ps, program/machine state) */ + /* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is + * used for brevity. */ + uint64_t gpr[MD_CONTEXT_PPC64_GPR_COUNT]; + uint64_t cr; /* Condition */ + uint64_t xer; /* Integer (fiXed-point) exception */ + uint64_t lr; /* Link */ + uint64_t ctr; /* Count */ + uint64_t vrsave; /* Vector save */ + + /* float_save and vector_save aren't present in ppc_thread_state, but + * are represented in separate structures that still define a thread's + * context. */ + MDFloatingSaveAreaPPC float_save; + MDVectorSaveAreaPPC vector_save; +} MDRawContextPPC64; /* Based on ppc_thread_state */ + +/* Indices into gpr for registers with a dedicated or conventional purpose. */ +enum MDPPC64RegisterNumbers { + MD_CONTEXT_PPC64_REG_SP = 1 +}; + +/* For (MDRawContextPPC).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its + * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other + * CPUs. */ +#define MD_CONTEXT_PPC64 0x01000000 +#define MD_CONTEXT_PPC64_BASE (MD_CONTEXT_PPC64 | 0x00000001) +#define MD_CONTEXT_PPC64_FLOATING_POINT (MD_CONTEXT_PPC64 | 0x00000008) +#define MD_CONTEXT_PPC64_VECTOR (MD_CONTEXT_PPC64 | 0x00000020) + +#define MD_CONTEXT_PPC64_FULL MD_CONTEXT_PPC64_BASE +#define MD_CONTEXT_PPC64_ALL (MD_CONTEXT_PPC64_FULL | \ + MD_CONTEXT_PPC64_FLOATING_POINT | \ + MD_CONTEXT_PPC64_VECTOR) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ */ diff --git a/src/google_breakpad/common/minidump_cpu_riscv.h b/src/google_breakpad/common/minidump_cpu_riscv.h new file mode 100644 index 0000000..812cf5f --- /dev/null +++ b/src/google_breakpad/common/minidump_cpu_riscv.h @@ -0,0 +1,156 @@ +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on RISCV and RISCV64. These files may be read on any platform + * provided that the alignments of these structures on the processing system + * are identical to the alignments of these structures on the producing + * system. For this reason, precise-sized types are used. The structures + * defined by this file have been laid out to minimize alignment problems by + * ensuring that all members are aligned on their natural boundaries. + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. + * + * Author: Iacopo Colonnelli + */ + +/* + * RISCV and RISCV64 support + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_RISCV_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_RISCV_H__ + +#include "google_breakpad/common/breakpad_types.h" + +#define MD_CONTEXT_RISCV_GPR_COUNT 32 +#define MD_CONTEXT_RISCV_FPR_COUNT 32 + +enum MDRISCVRegisterNumbers { + MD_CONTEXT_RISCV_REG_PC = 0, + MD_CONTEXT_RISCV_REG_RA = 1, + MD_CONTEXT_RISCV_REG_SP = 2, +}; + +/* For (MDRawContextRISCV).context_flags. These values indicate the type of + * context stored in the structure. */ +#define MD_CONTEXT_RISCV 0x00800000 +#define MD_CONTEXT_RISCV_INTEGER (MD_CONTEXT_RISCV | 0x00000001) +#define MD_CONTEXT_RISCV_FLOATING_POINT (MD_CONTEXT_RISCV | 0x00000002) +#define MD_CONTEXT_RISCV_FULL (MD_CONTEXT_RISCV_INTEGER | \ + MD_CONTEXT_RISCV_FLOATING_POINT) + +typedef struct { + /* Determines which fields of this struct are populated */ + uint32_t context_flags; + uint32_t version; + + uint32_t pc; + uint32_t ra; + uint32_t sp; + uint32_t gp; + uint32_t tp; + uint32_t t0; + uint32_t t1; + uint32_t t2; + uint32_t s0; + uint32_t s1; + uint32_t a0; + uint32_t a1; + uint32_t a2; + uint32_t a3; + uint32_t a4; + uint32_t a5; + uint32_t a6; + uint32_t a7; + uint32_t s2; + uint32_t s3; + uint32_t s4; + uint32_t s5; + uint32_t s6; + uint32_t s7; + uint32_t s8; + uint32_t s9; + uint32_t s10; + uint32_t s11; + uint32_t t3; + uint32_t t4; + uint32_t t5; + uint32_t t6; + + /* 32 floating point registers, f0 .. f31. Breakpad only supports RISCV32 + * with 32 bit floating point. */ + uint32_t fpregs[MD_CONTEXT_RISCV_FPR_COUNT]; + uint32_t fcsr; +} MDRawContextRISCV; + +/* For (MDRawContextRISCV64).context_flags. These values indicate the type of + * context stored in the structure. */ +#define MD_CONTEXT_RISCV64 0x08000000 +#define MD_CONTEXT_RISCV64_INTEGER (MD_CONTEXT_RISCV64 | 0x00000001) +#define MD_CONTEXT_RISCV64_FLOATING_POINT (MD_CONTEXT_RISCV64 | 0x00000002) +#define MD_CONTEXT_RISCV64_FULL (MD_CONTEXT_RISCV64_INTEGER | \ + MD_CONTEXT_RISCV64_FLOATING_POINT) + +typedef struct { + /* Determines which fields of this struct are populated */ + uint32_t context_flags; + uint32_t version; + + uint64_t pc; + uint64_t ra; + uint64_t sp; + uint64_t gp; + uint64_t tp; + uint64_t t0; + uint64_t t1; + uint64_t t2; + uint64_t s0; + uint64_t s1; + uint64_t a0; + uint64_t a1; + uint64_t a2; + uint64_t a3; + uint64_t a4; + uint64_t a5; + uint64_t a6; + uint64_t a7; + uint64_t s2; + uint64_t s3; + uint64_t s4; + uint64_t s5; + uint64_t s6; + uint64_t s7; + uint64_t s8; + uint64_t s9; + uint64_t s10; + uint64_t s11; + uint64_t t3; + uint64_t t4; + uint64_t t5; + uint64_t t6; + + /* 32 floating point registers, f0 .. f31. Breakpad only supports RISCV64 with + * 64 bit floating point. */ + uint64_t fpregs[MD_CONTEXT_RISCV_FPR_COUNT]; + uint32_t fcsr; +} MDRawContextRISCV64; + + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_RISCV_H__ */ diff --git a/src/google_breakpad/common/minidump_cpu_sparc.h b/src/google_breakpad/common/minidump_cpu_sparc.h new file mode 100644 index 0000000..6452588 --- /dev/null +++ b/src/google_breakpad/common/minidump_cpu_sparc.h @@ -0,0 +1,162 @@ +/* Copyright 2006 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on sparc. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai + * Change to split into its own file: Neal Sidhwaney */ + +/* + * SPARC support, see (solaris)sys/procfs_isa.h also + */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ + +#define MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT 32 + +typedef struct { + + /* FPU floating point regs */ + uint64_t regs[MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT]; + + uint64_t filler; + uint64_t fsr; /* FPU status register */ +} MDFloatingSaveAreaSPARC; /* FLOATING_SAVE_AREA */ + +#define MD_CONTEXT_SPARC_GPR_COUNT 32 + +typedef struct { + /* The next field determines the layout of the structure, and which parts + * of it are populated + */ + uint32_t context_flags; + uint32_t flag_pad; + /* + * General register access (SPARC). + * Don't confuse definitions here with definitions in . + * Registers are 32 bits for ILP32, 64 bits for LP64. + * SPARC V7/V8 is for 32bit, SPARC V9 is for 64bit + */ + + /* 32 Integer working registers */ + + /* g_r[0-7] global registers(g0-g7) + * g_r[8-15] out registers(o0-o7) + * g_r[16-23] local registers(l0-l7) + * g_r[24-31] in registers(i0-i7) + */ + uint64_t g_r[MD_CONTEXT_SPARC_GPR_COUNT]; + + /* several control registers */ + + /* Processor State register(PSR) for SPARC V7/V8 + * Condition Code register (CCR) for SPARC V9 + */ + uint64_t ccr; + + uint64_t pc; /* Program Counter register (PC) */ + uint64_t npc; /* Next Program Counter register (nPC) */ + uint64_t y; /* Y register (Y) */ + + /* Address Space Identifier register (ASI) for SPARC V9 + * WIM for SPARC V7/V8 + */ + uint64_t asi; + + /* Floating-Point Registers State register (FPRS) for SPARC V9 + * TBR for for SPARC V7/V8 + */ + uint64_t fprs; + + /* The next field is included with MD_CONTEXT_SPARC_FLOATING_POINT */ + MDFloatingSaveAreaSPARC float_save; + +} MDRawContextSPARC; /* CONTEXT_SPARC */ + +/* Indices into g_r for registers with a dedicated or conventional purpose. */ +enum MDSPARCRegisterNumbers { + MD_CONTEXT_SPARC_REG_SP = 14 +}; + +/* For (MDRawContextSPARC).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_SPARC is Breakpad-defined. Its + * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other + * CPUs. */ +#define MD_CONTEXT_SPARC 0x10000000 +#define MD_CONTEXT_SPARC_CONTROL (MD_CONTEXT_SPARC | 0x00000001) +#define MD_CONTEXT_SPARC_INTEGER (MD_CONTEXT_SPARC | 0x00000002) +#define MD_CONTEXT_SAPARC_FLOATING_POINT (MD_CONTEXT_SPARC | 0x00000004) +#define MD_CONTEXT_SAPARC_EXTRA (MD_CONTEXT_SPARC | 0x00000008) + +#define MD_CONTEXT_SPARC_FULL (MD_CONTEXT_SPARC_CONTROL | \ + MD_CONTEXT_SPARC_INTEGER) + +#define MD_CONTEXT_SPARC_ALL (MD_CONTEXT_SPARC_FULL | \ + MD_CONTEXT_SAPARC_FLOATING_POINT | \ + MD_CONTEXT_SAPARC_EXTRA) + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ */ diff --git a/src/google_breakpad/common/minidump_cpu_x86.h b/src/google_breakpad/common/minidump_cpu_x86.h new file mode 100644 index 0000000..add1e22 --- /dev/null +++ b/src/google_breakpad/common/minidump_cpu_x86.h @@ -0,0 +1,173 @@ +/* Copyright 2006 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * This file contains the necessary definitions to read minidump files + * produced on x86. These files may be read on any platform provided + * that the alignments of these structures on the processing system are + * identical to the alignments of these structures on the producing system. + * For this reason, precise-sized types are used. The structures defined + * by this file have been laid out to minimize alignment problems by ensuring + * ensuring that all members are aligned on their natural boundaries. In + * In some cases, tail-padding may be significant when different ABIs specify + * different tail-padding behaviors. To avoid problems when reading or + * writing affected structures, MD_*_SIZE macros are provided where needed, + * containing the useful size of the structures without padding. + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ + +#define MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE 80 + /* SIZE_OF_80387_REGISTERS */ + +typedef struct { + uint32_t control_word; + uint32_t status_word; + uint32_t tag_word; + uint32_t error_offset; + uint32_t error_selector; + uint32_t data_offset; + uint32_t data_selector; + + /* register_area contains eight 80-bit (x87 "long double") quantities for + * floating-point registers %st0 (%mm0) through %st7 (%mm7). */ + uint8_t register_area[MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE]; + uint32_t cr0_npx_state; +} MDFloatingSaveAreaX86; /* FLOATING_SAVE_AREA */ + + +#define MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE 512 + /* MAXIMUM_SUPPORTED_EXTENSION */ + +typedef struct { + /* The next field determines the layout of the structure, and which parts + * of it are populated */ + uint32_t context_flags; + + /* The next 6 registers are included with MD_CONTEXT_X86_DEBUG_REGISTERS */ + uint32_t dr0; + uint32_t dr1; + uint32_t dr2; + uint32_t dr3; + uint32_t dr6; + uint32_t dr7; + + /* The next field is included with MD_CONTEXT_X86_FLOATING_POINT */ + MDFloatingSaveAreaX86 float_save; + + /* The next 4 registers are included with MD_CONTEXT_X86_SEGMENTS */ + uint32_t gs; + uint32_t fs; + uint32_t es; + uint32_t ds; + /* The next 6 registers are included with MD_CONTEXT_X86_INTEGER */ + uint32_t edi; + uint32_t esi; + uint32_t ebx; + uint32_t edx; + uint32_t ecx; + uint32_t eax; + + /* The next 6 registers are included with MD_CONTEXT_X86_CONTROL */ + uint32_t ebp; + uint32_t eip; + uint32_t cs; /* WinNT.h says "must be sanitized" */ + uint32_t eflags; /* WinNT.h says "must be sanitized" */ + uint32_t esp; + uint32_t ss; + + /* The next field is included with MD_CONTEXT_X86_EXTENDED_REGISTERS. + * It contains vector (MMX/SSE) registers. It it laid out in the + * format used by the fxsave and fsrstor instructions, so it includes + * a copy of the x87 floating-point registers as well. See FXSAVE in + * "Intel Architecture Software Developer's Manual, Volume 2." */ + uint8_t extended_registers[ + MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE]; +} MDRawContextX86; /* CONTEXT */ + +/* For (MDRawContextX86).context_flags. These values indicate the type of + * context stored in the structure. The high 24 bits identify the CPU, the + * low 8 bits identify the type of context saved. */ +#define MD_CONTEXT_X86 0x00010000 + /* CONTEXT_i386, CONTEXT_i486: identifies CPU */ +#define MD_CONTEXT_X86_CONTROL (MD_CONTEXT_X86 | 0x00000001) + /* CONTEXT_CONTROL */ +#define MD_CONTEXT_X86_INTEGER (MD_CONTEXT_X86 | 0x00000002) + /* CONTEXT_INTEGER */ +#define MD_CONTEXT_X86_SEGMENTS (MD_CONTEXT_X86 | 0x00000004) + /* CONTEXT_SEGMENTS */ +#define MD_CONTEXT_X86_FLOATING_POINT (MD_CONTEXT_X86 | 0x00000008) + /* CONTEXT_FLOATING_POINT */ +#define MD_CONTEXT_X86_DEBUG_REGISTERS (MD_CONTEXT_X86 | 0x00000010) + /* CONTEXT_DEBUG_REGISTERS */ +#define MD_CONTEXT_X86_EXTENDED_REGISTERS (MD_CONTEXT_X86 | 0x00000020) + /* CONTEXT_EXTENDED_REGISTERS */ +#define MD_CONTEXT_X86_XSTATE (MD_CONTEXT_X86 | 0x00000040) + /* CONTEXT_XSTATE */ + +#define MD_CONTEXT_X86_FULL (MD_CONTEXT_X86_CONTROL | \ + MD_CONTEXT_X86_INTEGER | \ + MD_CONTEXT_X86_SEGMENTS) + /* CONTEXT_FULL */ + +#define MD_CONTEXT_X86_ALL (MD_CONTEXT_X86_FULL | \ + MD_CONTEXT_X86_FLOATING_POINT | \ + MD_CONTEXT_X86_DEBUG_REGISTERS | \ + MD_CONTEXT_X86_EXTENDED_REGISTERS) + /* CONTEXT_ALL */ + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ */ diff --git a/src/google_breakpad/common/minidump_exception_fuchsia.h b/src/google_breakpad/common/minidump_exception_fuchsia.h new file mode 100644 index 0000000..169094b --- /dev/null +++ b/src/google_breakpad/common/minidump_exception_fuchsia.h @@ -0,0 +1,57 @@ +/* Copyright 2019 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_fuchsia.h: A definition of exception codes for Fuchsia. + * + * Author: Ivan Penkov */ + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_FUCHSIA_H_ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_FUCHSIA_H_ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +// Based on zircon/system/public/zircon/syscalls/exception.h +typedef enum { + // Architectural exceptions + MD_EXCEPTION_CODE_FUCHSIA_GENERAL = 0x8, + MD_EXCEPTION_CODE_FUCHSIA_FATAL_PAGE_FAULT = 0x108, + MD_EXCEPTION_CODE_FUCHSIA_UNDEFINED_INSTRUCTION = 0x208, + MD_EXCEPTION_CODE_FUCHSIA_SW_BREAKPOINT = 0x308, + MD_EXCEPTION_CODE_FUCHSIA_HW_BREAKPOINT = 0x408, + MD_EXCEPTION_CODE_FUCHSIA_UNALIGNED_ACCESS = 0x508, + // + // Synthetic exceptions + MD_EXCEPTION_CODE_FUCHSIA_THREAD_STARTING = 0x8008, + MD_EXCEPTION_CODE_FUCHSIA_THREAD_EXITING = 0x8108, + MD_EXCEPTION_CODE_FUCHSIA_POLICY_ERROR = 0x8208, + MD_EXCEPTION_CODE_FUCHSIA_PROCESS_STARTING = 0x8308, +} MDExceptionCodeFuchsia; + +#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_FUCHSIA_H_ diff --git a/src/google_breakpad/common/minidump_exception_linux.h b/src/google_breakpad/common/minidump_exception_linux.h new file mode 100644 index 0000000..2135244 --- /dev/null +++ b/src/google_breakpad/common/minidump_exception_linux.h @@ -0,0 +1,129 @@ +/* Copyright 2006 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_linux.h: A definition of exception codes for + * Linux + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + + +/* For (MDException).exception_code. These values come from bits/signum.h. + */ +typedef enum { + MD_EXCEPTION_CODE_LIN_SIGHUP = 1, /* Hangup (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGINT = 2, /* Interrupt (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGQUIT = 3, /* Quit (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGILL = 4, /* Illegal instruction (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGTRAP = 5, /* Trace trap (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGABRT = 6, /* Abort (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGBUS = 7, /* BUS error (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGFPE = 8, /* Floating-point exception (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGKILL = 9, /* Kill, unblockable (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGUSR1 = 10, /* User-defined signal 1 (POSIX). */ + MD_EXCEPTION_CODE_LIN_SIGSEGV = 11, /* Segmentation violation (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGUSR2 = 12, /* User-defined signal 2 (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGPIPE = 13, /* Broken pipe (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGALRM = 14, /* Alarm clock (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTERM = 15, /* Termination (ANSI) */ + MD_EXCEPTION_CODE_LIN_SIGSTKFLT = 16, /* Stack faultd */ + MD_EXCEPTION_CODE_LIN_SIGCHLD = 17, /* Child status has changed (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGCONT = 18, /* Continue (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGSTOP = 19, /* Stop, unblockable (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTSTP = 20, /* Keyboard stop (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTTIN = 21, /* Background read from tty (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGTTOU = 22, /* Background write to tty (POSIX) */ + MD_EXCEPTION_CODE_LIN_SIGURG = 23, + /* Urgent condition on socket (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGXCPU = 24, /* CPU limit exceeded (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGXFSZ = 25, + /* File size limit exceeded (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGVTALRM = 26, /* Virtual alarm clock (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGPROF = 27, /* Profiling alarm clock (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGWINCH = 28, /* Window size change (4.3 BSD, Sun) */ + MD_EXCEPTION_CODE_LIN_SIGIO = 29, /* I/O now possible (4.2 BSD) */ + MD_EXCEPTION_CODE_LIN_SIGPWR = 30, /* Power failure restart (System V) */ + MD_EXCEPTION_CODE_LIN_SIGSYS = 31, /* Bad system call */ + MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED = 0xFFFFFFFF /* No exception, + dump requested. */ +} MDExceptionCodeLinux; + +/* For (MDException).exception_flags. These values come from + * asm-generic/siginfo.h. + */ +typedef enum { + /* SIGILL */ + MD_EXCEPTION_FLAG_LIN_ILL_ILLOPC = 1, + MD_EXCEPTION_FLAG_LIN_ILL_ILLOPN = 2, + MD_EXCEPTION_FLAG_LIN_ILL_ILLADR = 3, + MD_EXCEPTION_FLAG_LIN_ILL_ILLTRP = 4, + MD_EXCEPTION_FLAG_LIN_ILL_PRVOPC = 5, + MD_EXCEPTION_FLAG_LIN_ILL_PRVREG = 6, + MD_EXCEPTION_FLAG_LIN_ILL_COPROC = 7, + MD_EXCEPTION_FLAG_LIN_ILL_BADSTK = 8, + + /* SIGFPE */ + MD_EXCEPTION_FLAG_LIN_FPE_INTDIV = 1, + MD_EXCEPTION_FLAG_LIN_FPE_INTOVF = 2, + MD_EXCEPTION_FLAG_LIN_FPE_FLTDIV = 3, + MD_EXCEPTION_FLAG_LIN_FPE_FLTOVF = 4, + MD_EXCEPTION_FLAG_LIN_FPE_FLTUND = 5, + MD_EXCEPTION_FLAG_LIN_FPE_FLTRES = 6, + MD_EXCEPTION_FLAG_LIN_FPE_FLTINV = 7, + MD_EXCEPTION_FLAG_LIN_FPE_FLTSUB = 8, + + /* SIGSEGV */ + MD_EXCEPTION_FLAG_LIN_SEGV_MAPERR = 1, + MD_EXCEPTION_FLAG_LIN_SEGV_ACCERR = 2, + MD_EXCEPTION_FLAG_LIN_SEGV_BNDERR = 3, + MD_EXCEPTION_FLAG_LIN_SEGV_PKUERR = 4, + MD_EXCEPTION_FLAG_LIN_SEGV_ACCADI = 5, + MD_EXCEPTION_FLAG_LIN_SEGV_ADIDERR = 6, + MD_EXCEPTION_FLAG_LIN_SEGV_ADIPERR = 7, + MD_EXCEPTION_FLAG_LIN_SEGV_MTEAERR = 8, + MD_EXCEPTION_FLAG_LIN_SEGV_MTESERR = 9, + + /* SIGBUS */ + MD_EXCEPTION_FLAG_LIN_BUS_ADRALN = 1, + MD_EXCEPTION_FLAG_LIN_BUS_ADRERR = 2, + MD_EXCEPTION_FLAG_LIN_BUS_OBJERR = 3, + MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AR = 4, + MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AO = 5, +} MDExceptionFlagLinux; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ */ diff --git a/src/google_breakpad/common/minidump_exception_mac.h b/src/google_breakpad/common/minidump_exception_mac.h new file mode 100644 index 0000000..acfafaa --- /dev/null +++ b/src/google_breakpad/common/minidump_exception_mac.h @@ -0,0 +1,214 @@ +/* Copyright 2006 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_mac.h: A definition of exception codes for Mac + * OS X + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +/* For (MDException).exception_code. Breakpad minidump extension for Mac OS X + * support. Based on Darwin/Mac OS X' mach/exception_types.h. This is + * what Mac OS X calls an "exception", not a "code". */ +typedef enum { + /* Exception code. The high 16 bits of exception_code contains one of + * these values. */ + MD_EXCEPTION_MAC_BAD_ACCESS = 1, /* code can be a kern_return_t */ + /* EXC_BAD_ACCESS */ + MD_EXCEPTION_MAC_BAD_INSTRUCTION = 2, /* code is CPU-specific */ + /* EXC_BAD_INSTRUCTION */ + MD_EXCEPTION_MAC_ARITHMETIC = 3, /* code is CPU-specific */ + /* EXC_ARITHMETIC */ + MD_EXCEPTION_MAC_EMULATION = 4, /* code is CPU-specific */ + /* EXC_EMULATION */ + MD_EXCEPTION_MAC_SOFTWARE = 5, + /* EXC_SOFTWARE */ + MD_EXCEPTION_MAC_BREAKPOINT = 6, /* code is CPU-specific */ + /* EXC_BREAKPOINT */ + MD_EXCEPTION_MAC_SYSCALL = 7, + /* EXC_SYSCALL */ + MD_EXCEPTION_MAC_MACH_SYSCALL = 8, + /* EXC_MACH_SYSCALL */ + MD_EXCEPTION_MAC_RPC_ALERT = 9, + /* EXC_RESOURCE */ + MD_EXCEPTION_MAC_RESOURCE = 11, + /* EXC_GUARD */ + MD_EXCEPTION_MAC_GUARD = 12, + /* EXC_RPC_ALERT */ + MD_EXCEPTION_MAC_SIMULATED = 0x43507378, + /* Fake exception code used by Crashpad's SimulateCrash ('CPsx'). */ + MD_NS_EXCEPTION_SIMULATED = 0x43506E78 + /* Fake exception code used by Crashpad's uncaught exceptions ('CPnx'). */ +} MDExceptionMac; + +/* For (MDException).exception_flags. Breakpad minidump extension for Mac OS X + * support. Based on Darwin/Mac OS X' mach/ppc/exception.h and + * mach/i386/exception.h. This is what Mac OS X calls a "code". */ +typedef enum { + /* With MD_EXCEPTION_BAD_ACCESS. These are relevant kern_return_t values + * from mach/kern_return.h. */ + MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS = 1, + /* KERN_INVALID_ADDRESS */ + MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE = 2, + /* KERN_PROTECTION_FAILURE */ + MD_EXCEPTION_CODE_MAC_NO_ACCESS = 8, + /* KERN_NO_ACCESS */ + MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE = 9, + /* KERN_MEMORY_FAILURE */ + MD_EXCEPTION_CODE_MAC_MEMORY_ERROR = 10, + /* KERN_MEMORY_ERROR */ + MD_EXCEPTION_CODE_MAC_CODESIGN_ERROR = 50, + /* KERN_CODESIGN_ERROR */ + + /* With MD_EXCEPTION_SOFTWARE */ + MD_EXCEPTION_CODE_MAC_BAD_SYSCALL = 0x00010000, /* Mach SIGSYS */ + MD_EXCEPTION_CODE_MAC_BAD_PIPE = 0x00010001, /* Mach SIGPIPE */ + MD_EXCEPTION_CODE_MAC_ABORT = 0x00010002, /* Mach SIGABRT */ + /* Custom values */ + MD_EXCEPTION_CODE_MAC_NS_EXCEPTION = 0xDEADC0DE, /* uncaught NSException */ + + /* With MD_EXCEPTION_MAC_BAD_ACCESS on arm */ + MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN = 0x0101, /* EXC_ARM_DA_ALIGN */ + MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG = 0x0102, /* EXC_ARM_DA_DEBUG */ + + /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on arm */ + MD_EXCEPTION_CODE_MAC_ARM_UNDEFINED = 1, /* EXC_ARM_UNDEFINED */ + + /* With MD_EXCEPTION_MAC_BREAKPOINT on arm */ + MD_EXCEPTION_CODE_MAC_ARM_BREAKPOINT = 1, /* EXC_ARM_BREAKPOINT */ + + /* With MD_EXCEPTION_MAC_BAD_ACCESS on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ = 0x0101, + /* EXC_PPC_VM_PROT_READ */ + MD_EXCEPTION_CODE_MAC_PPC_BADSPACE = 0x0102, + /* EXC_PPC_BADSPACE */ + MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED = 0x0103, + /* EXC_PPC_UNALIGNED */ + + /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL = 1, + /* EXC_PPC_INVALID_SYSCALL */ + MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION = 2, + /* EXC_PPC_UNIPL_INST */ + MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION = 3, + /* EXC_PPC_PRIVINST */ + MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER = 4, + /* EXC_PPC_PRIVREG */ + MD_EXCEPTION_CODE_MAC_PPC_TRACE = 5, + /* EXC_PPC_TRACE */ + MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR = 6, + /* EXC_PPC_PERFMON */ + + /* With MD_EXCEPTION_MAC_ARITHMETIC on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW = 1, + /* EXC_PPC_OVERFLOW */ + MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE = 2, + /* EXC_PPC_ZERO_DIVIDE */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT = 3, + /* EXC_FLT_INEXACT */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE = 4, + /* EXC_PPC_FLT_ZERO_DIVIDE */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW = 5, + /* EXC_PPC_FLT_UNDERFLOW */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW = 6, + /* EXC_PPC_FLT_OVERFLOW */ + MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER = 7, + /* EXC_PPC_FLT_NOT_A_NUMBER */ + + /* With MD_EXCEPTION_MAC_EMULATION on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION = 8, + /* EXC_PPC_NOEMULATION */ + MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST = 9, + /* EXC_PPC_ALTIVECASSIST */ + + /* With MD_EXCEPTION_MAC_SOFTWARE on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_TRAP = 0x00000001, /* EXC_PPC_TRAP */ + MD_EXCEPTION_CODE_MAC_PPC_MIGRATE = 0x00010100, /* EXC_PPC_MIGRATE */ + + /* With MD_EXCEPTION_MAC_BREAKPOINT on ppc */ + MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT = 1, /* EXC_PPC_BREAKPOINT */ + + /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86, see also x86 interrupt + * values below. */ + MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION = 1, /* EXC_I386_INVOP */ + + /* With MD_EXCEPTION_MAC_ARITHMETIC on x86 */ + MD_EXCEPTION_CODE_MAC_X86_DIV = 1, /* EXC_I386_DIV */ + MD_EXCEPTION_CODE_MAC_X86_INTO = 2, /* EXC_I386_INTO */ + MD_EXCEPTION_CODE_MAC_X86_NOEXT = 3, /* EXC_I386_NOEXT */ + MD_EXCEPTION_CODE_MAC_X86_EXTOVR = 4, /* EXC_I386_EXTOVR */ + MD_EXCEPTION_CODE_MAC_X86_EXTERR = 5, /* EXC_I386_EXTERR */ + MD_EXCEPTION_CODE_MAC_X86_EMERR = 6, /* EXC_I386_EMERR */ + MD_EXCEPTION_CODE_MAC_X86_BOUND = 7, /* EXC_I386_BOUND */ + MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR = 8, /* EXC_I386_SSEEXTERR */ + + /* With MD_EXCEPTION_MAC_BREAKPOINT on x86 */ + MD_EXCEPTION_CODE_MAC_X86_SGL = 1, /* EXC_I386_SGL */ + MD_EXCEPTION_CODE_MAC_X86_BPT = 2, /* EXC_I386_BPT */ + + /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86. These are the raw + * x86 interrupt codes. Most of these are mapped to other Mach + * exceptions and codes, are handled, or should not occur in user space. + * A few of these will do occur with MD_EXCEPTION_MAC_BAD_INSTRUCTION. */ + /* EXC_I386_DIVERR = 0: mapped to EXC_ARITHMETIC/EXC_I386_DIV */ + /* EXC_I386_SGLSTP = 1: mapped to EXC_BREAKPOINT/EXC_I386_SGL */ + /* EXC_I386_NMIFLT = 2: should not occur in user space */ + /* EXC_I386_BPTFLT = 3: mapped to EXC_BREAKPOINT/EXC_I386_BPT */ + /* EXC_I386_INTOFLT = 4: mapped to EXC_ARITHMETIC/EXC_I386_INTO */ + /* EXC_I386_BOUNDFLT = 5: mapped to EXC_ARITHMETIC/EXC_I386_BOUND */ + /* EXC_I386_INVOPFLT = 6: mapped to EXC_BAD_INSTRUCTION/EXC_I386_INVOP */ + /* EXC_I386_NOEXTFLT = 7: should be handled by the kernel */ + /* EXC_I386_DBLFLT = 8: should be handled (if possible) by the kernel */ + /* EXC_I386_EXTOVRFLT = 9: mapped to EXC_BAD_ACCESS/(PROT_READ|PROT_EXEC) */ + MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT = 10, + /* EXC_INVTSSFLT */ + MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT = 11, + /* EXC_SEGNPFLT */ + MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT = 12, + /* EXC_STKFLT */ + MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT = 13, + /* EXC_GPFLT */ + /* EXC_I386_PGFLT = 14: should not occur in user space */ + /* EXC_I386_EXTERRFLT = 16: mapped to EXC_ARITHMETIC/EXC_I386_EXTERR */ + MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT = 17 + /* EXC_ALIGNFLT (for vector operations) */ + /* EXC_I386_ENOEXTFLT = 32: should be handled by the kernel */ + /* EXC_I386_ENDPERR = 33: should not occur */ +} MDExceptionCodeMac; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_OSX_H__ */ diff --git a/src/google_breakpad/common/minidump_exception_ps3.h b/src/google_breakpad/common/minidump_exception_ps3.h new file mode 100644 index 0000000..dd87d7a --- /dev/null +++ b/src/google_breakpad/common/minidump_exception_ps3.h @@ -0,0 +1,66 @@ +/* Copyright 2013 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_ps3.h: A definition of exception codes for + * PS3 */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +typedef enum { + MD_EXCEPTION_CODE_PS3_UNKNOWN = 0, + MD_EXCEPTION_CODE_PS3_TRAP_EXCEP = 1, + MD_EXCEPTION_CODE_PS3_PRIV_INSTR = 2, + MD_EXCEPTION_CODE_PS3_ILLEGAL_INSTR = 3, + MD_EXCEPTION_CODE_PS3_INSTR_STORAGE = 4, + MD_EXCEPTION_CODE_PS3_INSTR_SEGMENT = 5, + MD_EXCEPTION_CODE_PS3_DATA_STORAGE = 6, + MD_EXCEPTION_CODE_PS3_DATA_SEGMENT = 7, + MD_EXCEPTION_CODE_PS3_FLOAT_POINT = 8, + MD_EXCEPTION_CODE_PS3_DABR_MATCH = 9, + MD_EXCEPTION_CODE_PS3_ALIGN_EXCEP = 10, + MD_EXCEPTION_CODE_PS3_MEMORY_ACCESS = 11, + MD_EXCEPTION_CODE_PS3_COPRO_ALIGN = 12, + MD_EXCEPTION_CODE_PS3_COPRO_INVALID_COM = 13, + MD_EXCEPTION_CODE_PS3_COPRO_ERR = 14, + MD_EXCEPTION_CODE_PS3_COPRO_FIR = 15, + MD_EXCEPTION_CODE_PS3_COPRO_DATA_SEGMENT = 16, + MD_EXCEPTION_CODE_PS3_COPRO_DATA_STORAGE = 17, + MD_EXCEPTION_CODE_PS3_COPRO_STOP_INSTR = 18, + MD_EXCEPTION_CODE_PS3_COPRO_HALT_INSTR = 19, + MD_EXCEPTION_CODE_PS3_COPRO_HALTINST_UNKNOWN = 20, + MD_EXCEPTION_CODE_PS3_COPRO_MEMORY_ACCESS = 21, + MD_EXCEPTION_CODE_PS3_GRAPHIC = 22 +} MDExceptionCodePS3; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__ */ diff --git a/src/google_breakpad/common/minidump_exception_solaris.h b/src/google_breakpad/common/minidump_exception_solaris.h new file mode 100644 index 0000000..1664191 --- /dev/null +++ b/src/google_breakpad/common/minidump_exception_solaris.h @@ -0,0 +1,93 @@ +/* Copyright 2006 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_solaris.h: A definition of exception codes for + * Solaris + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +/* For (MDException).exception_code. These values come from sys/iso/signal_iso.h + */ +typedef enum { + MD_EXCEPTION_CODE_SOL_SIGHUP = 1, /* Hangup */ + MD_EXCEPTION_CODE_SOL_SIGINT = 2, /* interrupt (rubout) */ + MD_EXCEPTION_CODE_SOL_SIGQUIT = 3, /* quit (ASCII FS) */ + MD_EXCEPTION_CODE_SOL_SIGILL = 4, /* illegal instruction (not reset when caught) */ + MD_EXCEPTION_CODE_SOL_SIGTRAP = 5, /* trace trap (not reset when caught) */ + MD_EXCEPTION_CODE_SOL_SIGIOT = 6, /* IOT instruction */ + MD_EXCEPTION_CODE_SOL_SIGABRT = 6, /* used by abort, replace SIGIOT in the future */ + MD_EXCEPTION_CODE_SOL_SIGEMT = 7, /* EMT instruction */ + MD_EXCEPTION_CODE_SOL_SIGFPE = 8, /* floating point exception */ + MD_EXCEPTION_CODE_SOL_SIGKILL = 9, /* kill (cannot be caught or ignored) */ + MD_EXCEPTION_CODE_SOL_SIGBUS = 10, /* bus error */ + MD_EXCEPTION_CODE_SOL_SIGSEGV = 11, /* segmentation violation */ + MD_EXCEPTION_CODE_SOL_SIGSYS = 12, /* bad argument to system call */ + MD_EXCEPTION_CODE_SOL_SIGPIPE = 13, /* write on a pipe with no one to read it */ + MD_EXCEPTION_CODE_SOL_SIGALRM = 14, /* alarm clock */ + MD_EXCEPTION_CODE_SOL_SIGTERM = 15, /* software termination signal from kill */ + MD_EXCEPTION_CODE_SOL_SIGUSR1 = 16, /* user defined signal 1 */ + MD_EXCEPTION_CODE_SOL_SIGUSR2 = 17, /* user defined signal 2 */ + MD_EXCEPTION_CODE_SOL_SIGCLD = 18, /* child status change */ + MD_EXCEPTION_CODE_SOL_SIGCHLD = 18, /* child status change alias (POSIX) */ + MD_EXCEPTION_CODE_SOL_SIGPWR = 19, /* power-fail restart */ + MD_EXCEPTION_CODE_SOL_SIGWINCH = 20, /* window size change */ + MD_EXCEPTION_CODE_SOL_SIGURG = 21, /* urgent socket condition */ + MD_EXCEPTION_CODE_SOL_SIGPOLL = 22, /* pollable event occurred */ + MD_EXCEPTION_CODE_SOL_SIGIO = 22, /* socket I/O possible (SIGPOLL alias) */ + MD_EXCEPTION_CODE_SOL_SIGSTOP = 23, /* stop (cannot be caught or ignored) */ + MD_EXCEPTION_CODE_SOL_SIGTSTP = 24, /* user stop requested from tty */ + MD_EXCEPTION_CODE_SOL_SIGCONT = 25, /* stopped process has been continued */ + MD_EXCEPTION_CODE_SOL_SIGTTIN = 26, /* background tty read attempted */ + MD_EXCEPTION_CODE_SOL_SIGTTOU = 27, /* background tty write attempted */ + MD_EXCEPTION_CODE_SOL_SIGVTALRM = 28, /* virtual timer expired */ + MD_EXCEPTION_CODE_SOL_SIGPROF = 29, /* profiling timer expired */ + MD_EXCEPTION_CODE_SOL_SIGXCPU = 30, /* exceeded cpu limit */ + MD_EXCEPTION_CODE_SOL_SIGXFSZ = 31, /* exceeded file size limit */ + MD_EXCEPTION_CODE_SOL_SIGWAITING = 32, /* reserved signal no longer used by threading code */ + MD_EXCEPTION_CODE_SOL_SIGLWP = 33, /* reserved signal no longer used by threading code */ + MD_EXCEPTION_CODE_SOL_SIGFREEZE = 34, /* special signal used by CPR */ + MD_EXCEPTION_CODE_SOL_SIGTHAW = 35, /* special signal used by CPR */ + MD_EXCEPTION_CODE_SOL_SIGCANCEL = 36, /* reserved signal for thread cancellation */ + MD_EXCEPTION_CODE_SOL_SIGLOST = 37, /* resource lost (eg, record-lock lost) */ + MD_EXCEPTION_CODE_SOL_SIGXRES = 38, /* resource control exceeded */ + MD_EXCEPTION_CODE_SOL_SIGJVM1 = 39, /* reserved signal for Java Virtual Machine */ + MD_EXCEPTION_CODE_SOL_SIGJVM2 = 40 /* reserved signal for Java Virtual Machine */ +} MDExceptionCodeSolaris; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ */ diff --git a/src/google_breakpad/common/minidump_exception_win32.h b/src/google_breakpad/common/minidump_exception_win32.h new file mode 100644 index 0000000..0431a3f --- /dev/null +++ b/src/google_breakpad/common/minidump_exception_win32.h @@ -0,0 +1,2341 @@ +/* Copyright 2006 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_exception_win32.h: Definitions of exception codes for + * Win32 platform + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Author: Mark Mentovai + * Split into its own file: Neal Sidhwaney */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + + +/* For (MDException).exception_code. These values come from WinBase.h + * and WinNT.h (names beginning with EXCEPTION_ are in WinBase.h, + * they are STATUS_ in WinNT.h). */ +typedef enum { + MD_EXCEPTION_CODE_WIN_CONTROL_C = 0x40010005, + /* DBG_CONTROL_C */ + MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION = 0x80000001, + /* EXCEPTION_GUARD_PAGE */ + MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT = 0x80000002, + /* EXCEPTION_DATATYPE_MISALIGNMENT */ + MD_EXCEPTION_CODE_WIN_BREAKPOINT = 0x80000003, + /* EXCEPTION_BREAKPOINT */ + MD_EXCEPTION_CODE_WIN_SINGLE_STEP = 0x80000004, + /* EXCEPTION_SINGLE_STEP */ + MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION = 0xc0000005, + /* EXCEPTION_ACCESS_VIOLATION */ + MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR = 0xc0000006, + /* EXCEPTION_IN_PAGE_ERROR */ + MD_EXCEPTION_CODE_WIN_INVALID_HANDLE = 0xc0000008, + /* EXCEPTION_INVALID_HANDLE */ + MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION = 0xc000001d, + /* EXCEPTION_ILLEGAL_INSTRUCTION */ + MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION = 0xc0000025, + /* EXCEPTION_NONCONTINUABLE_EXCEPTION */ + MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION = 0xc0000026, + /* EXCEPTION_INVALID_DISPOSITION */ + MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED = 0xc000008c, + /* EXCEPTION_BOUNDS_EXCEEDED */ + MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND = 0xc000008d, + /* EXCEPTION_FLT_DENORMAL_OPERAND */ + MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO = 0xc000008e, + /* EXCEPTION_FLT_DIVIDE_BY_ZERO */ + MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT = 0xc000008f, + /* EXCEPTION_FLT_INEXACT_RESULT */ + MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION = 0xc0000090, + /* EXCEPTION_FLT_INVALID_OPERATION */ + MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW = 0xc0000091, + /* EXCEPTION_FLT_OVERFLOW */ + MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK = 0xc0000092, + /* EXCEPTION_FLT_STACK_CHECK */ + MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW = 0xc0000093, + /* EXCEPTION_FLT_UNDERFLOW */ + MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO = 0xc0000094, + /* EXCEPTION_INT_DIVIDE_BY_ZERO */ + MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW = 0xc0000095, + /* EXCEPTION_INT_OVERFLOW */ + MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION = 0xc0000096, + /* EXCEPTION_PRIV_INSTRUCTION */ + MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW = 0xc00000fd, + /* EXCEPTION_STACK_OVERFLOW */ + MD_EXCEPTION_CODE_WIN_BAD_FUNCTION_TABLE = 0xc00000ff, + /* EXCEPTION_BAD_FUNCTION_TABLE */ + MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK = 0xc0000194, + /* EXCEPTION_POSSIBLE_DEADLOCK */ + MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN = 0xc0000409, + /* STATUS_STACK_BUFFER_OVERRUN */ + MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION = 0xc0000374, + /* STATUS_HEAP_CORRUPTION */ + MD_EXCEPTION_OUT_OF_MEMORY = 0xe0000008, + /* Exception thrown by Chromium allocators to indicate OOM. + See base/process/memory.h in Chromium for rationale. */ + MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION = 0xe06d7363, + /* Per http://support.microsoft.com/kb/185294, + generated by Visual C++ compiler */ + MD_EXCEPTION_CODE_WIN_SIMULATED = 0x0517a7ed + /* Fake exception code used by Crashpad's + CrashpadClient::DumpWithoutCrash. */ +} MDExceptionCodeWin; + + +/* For (MDException).exception_information[2], when (MDException).exception_code + * is MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR. This describes the underlying reason + * for the error. These values come from ntstatus.h. + * + * The content of this enum was created from ntstatus.h in the 8.1 SDK with + * + * egrep '#define [A-Z_0-9]+\s+\(\(NTSTATUS\)0xC[0-9A-F]+L\)' ntstatus.h + * | tr -d '\r' + * | sed -r 's@#define ([A-Z_0-9]+)\s+\(\(NTSTATUS\)(0xC[0-9A-F]+)L\).*@\2 \1@' + * | sort + * | sed -r 's@(0xC[0-9A-F]+) ([A-Z_0-9]+)@ MD_NTSTATUS_WIN_\2 = \1,@' + * + * With easy copy to clipboard with + * | xclip -selection c # on linux + * | clip # on windows + * | pbcopy # on mac + * + * and then the last comma manually removed. */ +typedef enum { + MD_NTSTATUS_WIN_STATUS_UNSUCCESSFUL = 0xC0000001, + MD_NTSTATUS_WIN_STATUS_NOT_IMPLEMENTED = 0xC0000002, + MD_NTSTATUS_WIN_STATUS_INVALID_INFO_CLASS = 0xC0000003, + MD_NTSTATUS_WIN_STATUS_INFO_LENGTH_MISMATCH = 0xC0000004, + MD_NTSTATUS_WIN_STATUS_ACCESS_VIOLATION = 0xC0000005, + MD_NTSTATUS_WIN_STATUS_IN_PAGE_ERROR = 0xC0000006, + MD_NTSTATUS_WIN_STATUS_PAGEFILE_QUOTA = 0xC0000007, + MD_NTSTATUS_WIN_STATUS_INVALID_HANDLE = 0xC0000008, + MD_NTSTATUS_WIN_STATUS_BAD_INITIAL_STACK = 0xC0000009, + MD_NTSTATUS_WIN_STATUS_BAD_INITIAL_PC = 0xC000000A, + MD_NTSTATUS_WIN_STATUS_INVALID_CID = 0xC000000B, + MD_NTSTATUS_WIN_STATUS_TIMER_NOT_CANCELED = 0xC000000C, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER = 0xC000000D, + MD_NTSTATUS_WIN_STATUS_NO_SUCH_DEVICE = 0xC000000E, + MD_NTSTATUS_WIN_STATUS_NO_SUCH_FILE = 0xC000000F, + MD_NTSTATUS_WIN_STATUS_INVALID_DEVICE_REQUEST = 0xC0000010, + MD_NTSTATUS_WIN_STATUS_END_OF_FILE = 0xC0000011, + MD_NTSTATUS_WIN_STATUS_WRONG_VOLUME = 0xC0000012, + MD_NTSTATUS_WIN_STATUS_NO_MEDIA_IN_DEVICE = 0xC0000013, + MD_NTSTATUS_WIN_STATUS_UNRECOGNIZED_MEDIA = 0xC0000014, + MD_NTSTATUS_WIN_STATUS_NONEXISTENT_SECTOR = 0xC0000015, + MD_NTSTATUS_WIN_STATUS_MORE_PROCESSING_REQUIRED = 0xC0000016, + MD_NTSTATUS_WIN_STATUS_NO_MEMORY = 0xC0000017, + MD_NTSTATUS_WIN_STATUS_CONFLICTING_ADDRESSES = 0xC0000018, + MD_NTSTATUS_WIN_STATUS_NOT_MAPPED_VIEW = 0xC0000019, + MD_NTSTATUS_WIN_STATUS_UNABLE_TO_FREE_VM = 0xC000001A, + MD_NTSTATUS_WIN_STATUS_UNABLE_TO_DELETE_SECTION = 0xC000001B, + MD_NTSTATUS_WIN_STATUS_INVALID_SYSTEM_SERVICE = 0xC000001C, + MD_NTSTATUS_WIN_STATUS_ILLEGAL_INSTRUCTION = 0xC000001D, + MD_NTSTATUS_WIN_STATUS_INVALID_LOCK_SEQUENCE = 0xC000001E, + MD_NTSTATUS_WIN_STATUS_INVALID_VIEW_SIZE = 0xC000001F, + MD_NTSTATUS_WIN_STATUS_INVALID_FILE_FOR_SECTION = 0xC0000020, + MD_NTSTATUS_WIN_STATUS_ALREADY_COMMITTED = 0xC0000021, + MD_NTSTATUS_WIN_STATUS_ACCESS_DENIED = 0xC0000022, + MD_NTSTATUS_WIN_STATUS_BUFFER_TOO_SMALL = 0xC0000023, + MD_NTSTATUS_WIN_STATUS_OBJECT_TYPE_MISMATCH = 0xC0000024, + MD_NTSTATUS_WIN_STATUS_NONCONTINUABLE_EXCEPTION = 0xC0000025, + MD_NTSTATUS_WIN_STATUS_INVALID_DISPOSITION = 0xC0000026, + MD_NTSTATUS_WIN_STATUS_UNWIND = 0xC0000027, + MD_NTSTATUS_WIN_STATUS_BAD_STACK = 0xC0000028, + MD_NTSTATUS_WIN_STATUS_INVALID_UNWIND_TARGET = 0xC0000029, + MD_NTSTATUS_WIN_STATUS_NOT_LOCKED = 0xC000002A, + MD_NTSTATUS_WIN_STATUS_PARITY_ERROR = 0xC000002B, + MD_NTSTATUS_WIN_STATUS_UNABLE_TO_DECOMMIT_VM = 0xC000002C, + MD_NTSTATUS_WIN_STATUS_NOT_COMMITTED = 0xC000002D, + MD_NTSTATUS_WIN_STATUS_INVALID_PORT_ATTRIBUTES = 0xC000002E, + MD_NTSTATUS_WIN_STATUS_PORT_MESSAGE_TOO_LONG = 0xC000002F, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_MIX = 0xC0000030, + MD_NTSTATUS_WIN_STATUS_INVALID_QUOTA_LOWER = 0xC0000031, + MD_NTSTATUS_WIN_STATUS_DISK_CORRUPT_ERROR = 0xC0000032, + MD_NTSTATUS_WIN_STATUS_OBJECT_NAME_INVALID = 0xC0000033, + MD_NTSTATUS_WIN_STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034, + MD_NTSTATUS_WIN_STATUS_OBJECT_NAME_COLLISION = 0xC0000035, + MD_NTSTATUS_WIN_STATUS_PORT_DISCONNECTED = 0xC0000037, + MD_NTSTATUS_WIN_STATUS_DEVICE_ALREADY_ATTACHED = 0xC0000038, + MD_NTSTATUS_WIN_STATUS_OBJECT_PATH_INVALID = 0xC0000039, + MD_NTSTATUS_WIN_STATUS_OBJECT_PATH_NOT_FOUND = 0xC000003A, + MD_NTSTATUS_WIN_STATUS_OBJECT_PATH_SYNTAX_BAD = 0xC000003B, + MD_NTSTATUS_WIN_STATUS_DATA_OVERRUN = 0xC000003C, + MD_NTSTATUS_WIN_STATUS_DATA_LATE_ERROR = 0xC000003D, + MD_NTSTATUS_WIN_STATUS_DATA_ERROR = 0xC000003E, + MD_NTSTATUS_WIN_STATUS_CRC_ERROR = 0xC000003F, + MD_NTSTATUS_WIN_STATUS_SECTION_TOO_BIG = 0xC0000040, + MD_NTSTATUS_WIN_STATUS_PORT_CONNECTION_REFUSED = 0xC0000041, + MD_NTSTATUS_WIN_STATUS_INVALID_PORT_HANDLE = 0xC0000042, + MD_NTSTATUS_WIN_STATUS_SHARING_VIOLATION = 0xC0000043, + MD_NTSTATUS_WIN_STATUS_QUOTA_EXCEEDED = 0xC0000044, + MD_NTSTATUS_WIN_STATUS_INVALID_PAGE_PROTECTION = 0xC0000045, + MD_NTSTATUS_WIN_STATUS_MUTANT_NOT_OWNED = 0xC0000046, + MD_NTSTATUS_WIN_STATUS_SEMAPHORE_LIMIT_EXCEEDED = 0xC0000047, + MD_NTSTATUS_WIN_STATUS_PORT_ALREADY_SET = 0xC0000048, + MD_NTSTATUS_WIN_STATUS_SECTION_NOT_IMAGE = 0xC0000049, + MD_NTSTATUS_WIN_STATUS_SUSPEND_COUNT_EXCEEDED = 0xC000004A, + MD_NTSTATUS_WIN_STATUS_THREAD_IS_TERMINATING = 0xC000004B, + MD_NTSTATUS_WIN_STATUS_BAD_WORKING_SET_LIMIT = 0xC000004C, + MD_NTSTATUS_WIN_STATUS_INCOMPATIBLE_FILE_MAP = 0xC000004D, + MD_NTSTATUS_WIN_STATUS_SECTION_PROTECTION = 0xC000004E, + MD_NTSTATUS_WIN_STATUS_EAS_NOT_SUPPORTED = 0xC000004F, + MD_NTSTATUS_WIN_STATUS_EA_TOO_LARGE = 0xC0000050, + MD_NTSTATUS_WIN_STATUS_NONEXISTENT_EA_ENTRY = 0xC0000051, + MD_NTSTATUS_WIN_STATUS_NO_EAS_ON_FILE = 0xC0000052, + MD_NTSTATUS_WIN_STATUS_EA_CORRUPT_ERROR = 0xC0000053, + MD_NTSTATUS_WIN_STATUS_FILE_LOCK_CONFLICT = 0xC0000054, + MD_NTSTATUS_WIN_STATUS_LOCK_NOT_GRANTED = 0xC0000055, + MD_NTSTATUS_WIN_STATUS_DELETE_PENDING = 0xC0000056, + MD_NTSTATUS_WIN_STATUS_CTL_FILE_NOT_SUPPORTED = 0xC0000057, + MD_NTSTATUS_WIN_STATUS_UNKNOWN_REVISION = 0xC0000058, + MD_NTSTATUS_WIN_STATUS_REVISION_MISMATCH = 0xC0000059, + MD_NTSTATUS_WIN_STATUS_INVALID_OWNER = 0xC000005A, + MD_NTSTATUS_WIN_STATUS_INVALID_PRIMARY_GROUP = 0xC000005B, + MD_NTSTATUS_WIN_STATUS_NO_IMPERSONATION_TOKEN = 0xC000005C, + MD_NTSTATUS_WIN_STATUS_CANT_DISABLE_MANDATORY = 0xC000005D, + MD_NTSTATUS_WIN_STATUS_NO_LOGON_SERVERS = 0xC000005E, + MD_NTSTATUS_WIN_STATUS_NO_SUCH_LOGON_SESSION = 0xC000005F, + MD_NTSTATUS_WIN_STATUS_NO_SUCH_PRIVILEGE = 0xC0000060, + MD_NTSTATUS_WIN_STATUS_PRIVILEGE_NOT_HELD = 0xC0000061, + MD_NTSTATUS_WIN_STATUS_INVALID_ACCOUNT_NAME = 0xC0000062, + MD_NTSTATUS_WIN_STATUS_USER_EXISTS = 0xC0000063, + MD_NTSTATUS_WIN_STATUS_NO_SUCH_USER = 0xC0000064, + MD_NTSTATUS_WIN_STATUS_GROUP_EXISTS = 0xC0000065, + MD_NTSTATUS_WIN_STATUS_NO_SUCH_GROUP = 0xC0000066, + MD_NTSTATUS_WIN_STATUS_MEMBER_IN_GROUP = 0xC0000067, + MD_NTSTATUS_WIN_STATUS_MEMBER_NOT_IN_GROUP = 0xC0000068, + MD_NTSTATUS_WIN_STATUS_LAST_ADMIN = 0xC0000069, + MD_NTSTATUS_WIN_STATUS_WRONG_PASSWORD = 0xC000006A, + MD_NTSTATUS_WIN_STATUS_ILL_FORMED_PASSWORD = 0xC000006B, + MD_NTSTATUS_WIN_STATUS_PASSWORD_RESTRICTION = 0xC000006C, + MD_NTSTATUS_WIN_STATUS_LOGON_FAILURE = 0xC000006D, + MD_NTSTATUS_WIN_STATUS_ACCOUNT_RESTRICTION = 0xC000006E, + MD_NTSTATUS_WIN_STATUS_INVALID_LOGON_HOURS = 0xC000006F, + MD_NTSTATUS_WIN_STATUS_INVALID_WORKSTATION = 0xC0000070, + MD_NTSTATUS_WIN_STATUS_PASSWORD_EXPIRED = 0xC0000071, + MD_NTSTATUS_WIN_STATUS_ACCOUNT_DISABLED = 0xC0000072, + MD_NTSTATUS_WIN_STATUS_NONE_MAPPED = 0xC0000073, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_LUIDS_REQUESTED = 0xC0000074, + MD_NTSTATUS_WIN_STATUS_LUIDS_EXHAUSTED = 0xC0000075, + MD_NTSTATUS_WIN_STATUS_INVALID_SUB_AUTHORITY = 0xC0000076, + MD_NTSTATUS_WIN_STATUS_INVALID_ACL = 0xC0000077, + MD_NTSTATUS_WIN_STATUS_INVALID_SID = 0xC0000078, + MD_NTSTATUS_WIN_STATUS_INVALID_SECURITY_DESCR = 0xC0000079, + MD_NTSTATUS_WIN_STATUS_PROCEDURE_NOT_FOUND = 0xC000007A, + MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_FORMAT = 0xC000007B, + MD_NTSTATUS_WIN_STATUS_NO_TOKEN = 0xC000007C, + MD_NTSTATUS_WIN_STATUS_BAD_INHERITANCE_ACL = 0xC000007D, + MD_NTSTATUS_WIN_STATUS_RANGE_NOT_LOCKED = 0xC000007E, + MD_NTSTATUS_WIN_STATUS_DISK_FULL = 0xC000007F, + MD_NTSTATUS_WIN_STATUS_SERVER_DISABLED = 0xC0000080, + MD_NTSTATUS_WIN_STATUS_SERVER_NOT_DISABLED = 0xC0000081, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_GUIDS_REQUESTED = 0xC0000082, + MD_NTSTATUS_WIN_STATUS_GUIDS_EXHAUSTED = 0xC0000083, + MD_NTSTATUS_WIN_STATUS_INVALID_ID_AUTHORITY = 0xC0000084, + MD_NTSTATUS_WIN_STATUS_AGENTS_EXHAUSTED = 0xC0000085, + MD_NTSTATUS_WIN_STATUS_INVALID_VOLUME_LABEL = 0xC0000086, + MD_NTSTATUS_WIN_STATUS_SECTION_NOT_EXTENDED = 0xC0000087, + MD_NTSTATUS_WIN_STATUS_NOT_MAPPED_DATA = 0xC0000088, + MD_NTSTATUS_WIN_STATUS_RESOURCE_DATA_NOT_FOUND = 0xC0000089, + MD_NTSTATUS_WIN_STATUS_RESOURCE_TYPE_NOT_FOUND = 0xC000008A, + MD_NTSTATUS_WIN_STATUS_RESOURCE_NAME_NOT_FOUND = 0xC000008B, + MD_NTSTATUS_WIN_STATUS_ARRAY_BOUNDS_EXCEEDED = 0xC000008C, + MD_NTSTATUS_WIN_STATUS_FLOAT_DENORMAL_OPERAND = 0xC000008D, + MD_NTSTATUS_WIN_STATUS_FLOAT_DIVIDE_BY_ZERO = 0xC000008E, + MD_NTSTATUS_WIN_STATUS_FLOAT_INEXACT_RESULT = 0xC000008F, + MD_NTSTATUS_WIN_STATUS_FLOAT_INVALID_OPERATION = 0xC0000090, + MD_NTSTATUS_WIN_STATUS_FLOAT_OVERFLOW = 0xC0000091, + MD_NTSTATUS_WIN_STATUS_FLOAT_STACK_CHECK = 0xC0000092, + MD_NTSTATUS_WIN_STATUS_FLOAT_UNDERFLOW = 0xC0000093, + MD_NTSTATUS_WIN_STATUS_INTEGER_DIVIDE_BY_ZERO = 0xC0000094, + MD_NTSTATUS_WIN_STATUS_INTEGER_OVERFLOW = 0xC0000095, + MD_NTSTATUS_WIN_STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_PAGING_FILES = 0xC0000097, + MD_NTSTATUS_WIN_STATUS_FILE_INVALID = 0xC0000098, + MD_NTSTATUS_WIN_STATUS_ALLOTTED_SPACE_EXCEEDED = 0xC0000099, + MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_RESOURCES = 0xC000009A, + MD_NTSTATUS_WIN_STATUS_DFS_EXIT_PATH_FOUND = 0xC000009B, + MD_NTSTATUS_WIN_STATUS_DEVICE_DATA_ERROR = 0xC000009C, + MD_NTSTATUS_WIN_STATUS_DEVICE_NOT_CONNECTED = 0xC000009D, + MD_NTSTATUS_WIN_STATUS_DEVICE_POWER_FAILURE = 0xC000009E, + MD_NTSTATUS_WIN_STATUS_FREE_VM_NOT_AT_BASE = 0xC000009F, + MD_NTSTATUS_WIN_STATUS_MEMORY_NOT_ALLOCATED = 0xC00000A0, + MD_NTSTATUS_WIN_STATUS_WORKING_SET_QUOTA = 0xC00000A1, + MD_NTSTATUS_WIN_STATUS_MEDIA_WRITE_PROTECTED = 0xC00000A2, + MD_NTSTATUS_WIN_STATUS_DEVICE_NOT_READY = 0xC00000A3, + MD_NTSTATUS_WIN_STATUS_INVALID_GROUP_ATTRIBUTES = 0xC00000A4, + MD_NTSTATUS_WIN_STATUS_BAD_IMPERSONATION_LEVEL = 0xC00000A5, + MD_NTSTATUS_WIN_STATUS_CANT_OPEN_ANONYMOUS = 0xC00000A6, + MD_NTSTATUS_WIN_STATUS_BAD_VALIDATION_CLASS = 0xC00000A7, + MD_NTSTATUS_WIN_STATUS_BAD_TOKEN_TYPE = 0xC00000A8, + MD_NTSTATUS_WIN_STATUS_BAD_MASTER_BOOT_RECORD = 0xC00000A9, + MD_NTSTATUS_WIN_STATUS_INSTRUCTION_MISALIGNMENT = 0xC00000AA, + MD_NTSTATUS_WIN_STATUS_INSTANCE_NOT_AVAILABLE = 0xC00000AB, + MD_NTSTATUS_WIN_STATUS_PIPE_NOT_AVAILABLE = 0xC00000AC, + MD_NTSTATUS_WIN_STATUS_INVALID_PIPE_STATE = 0xC00000AD, + MD_NTSTATUS_WIN_STATUS_PIPE_BUSY = 0xC00000AE, + MD_NTSTATUS_WIN_STATUS_ILLEGAL_FUNCTION = 0xC00000AF, + MD_NTSTATUS_WIN_STATUS_PIPE_DISCONNECTED = 0xC00000B0, + MD_NTSTATUS_WIN_STATUS_PIPE_CLOSING = 0xC00000B1, + MD_NTSTATUS_WIN_STATUS_PIPE_CONNECTED = 0xC00000B2, + MD_NTSTATUS_WIN_STATUS_PIPE_LISTENING = 0xC00000B3, + MD_NTSTATUS_WIN_STATUS_INVALID_READ_MODE = 0xC00000B4, + MD_NTSTATUS_WIN_STATUS_IO_TIMEOUT = 0xC00000B5, + MD_NTSTATUS_WIN_STATUS_FILE_FORCED_CLOSED = 0xC00000B6, + MD_NTSTATUS_WIN_STATUS_PROFILING_NOT_STARTED = 0xC00000B7, + MD_NTSTATUS_WIN_STATUS_PROFILING_NOT_STOPPED = 0xC00000B8, + MD_NTSTATUS_WIN_STATUS_COULD_NOT_INTERPRET = 0xC00000B9, + MD_NTSTATUS_WIN_STATUS_FILE_IS_A_DIRECTORY = 0xC00000BA, + MD_NTSTATUS_WIN_STATUS_NOT_SUPPORTED = 0xC00000BB, + MD_NTSTATUS_WIN_STATUS_REMOTE_NOT_LISTENING = 0xC00000BC, + MD_NTSTATUS_WIN_STATUS_DUPLICATE_NAME = 0xC00000BD, + MD_NTSTATUS_WIN_STATUS_BAD_NETWORK_PATH = 0xC00000BE, + MD_NTSTATUS_WIN_STATUS_NETWORK_BUSY = 0xC00000BF, + MD_NTSTATUS_WIN_STATUS_DEVICE_DOES_NOT_EXIST = 0xC00000C0, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_COMMANDS = 0xC00000C1, + MD_NTSTATUS_WIN_STATUS_ADAPTER_HARDWARE_ERROR = 0xC00000C2, + MD_NTSTATUS_WIN_STATUS_INVALID_NETWORK_RESPONSE = 0xC00000C3, + MD_NTSTATUS_WIN_STATUS_UNEXPECTED_NETWORK_ERROR = 0xC00000C4, + MD_NTSTATUS_WIN_STATUS_BAD_REMOTE_ADAPTER = 0xC00000C5, + MD_NTSTATUS_WIN_STATUS_PRINT_QUEUE_FULL = 0xC00000C6, + MD_NTSTATUS_WIN_STATUS_NO_SPOOL_SPACE = 0xC00000C7, + MD_NTSTATUS_WIN_STATUS_PRINT_CANCELLED = 0xC00000C8, + MD_NTSTATUS_WIN_STATUS_NETWORK_NAME_DELETED = 0xC00000C9, + MD_NTSTATUS_WIN_STATUS_NETWORK_ACCESS_DENIED = 0xC00000CA, + MD_NTSTATUS_WIN_STATUS_BAD_DEVICE_TYPE = 0xC00000CB, + MD_NTSTATUS_WIN_STATUS_BAD_NETWORK_NAME = 0xC00000CC, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_NAMES = 0xC00000CD, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_SESSIONS = 0xC00000CE, + MD_NTSTATUS_WIN_STATUS_SHARING_PAUSED = 0xC00000CF, + MD_NTSTATUS_WIN_STATUS_REQUEST_NOT_ACCEPTED = 0xC00000D0, + MD_NTSTATUS_WIN_STATUS_REDIRECTOR_PAUSED = 0xC00000D1, + MD_NTSTATUS_WIN_STATUS_NET_WRITE_FAULT = 0xC00000D2, + MD_NTSTATUS_WIN_STATUS_PROFILING_AT_LIMIT = 0xC00000D3, + MD_NTSTATUS_WIN_STATUS_NOT_SAME_DEVICE = 0xC00000D4, + MD_NTSTATUS_WIN_STATUS_FILE_RENAMED = 0xC00000D5, + MD_NTSTATUS_WIN_STATUS_VIRTUAL_CIRCUIT_CLOSED = 0xC00000D6, + MD_NTSTATUS_WIN_STATUS_NO_SECURITY_ON_OBJECT = 0xC00000D7, + MD_NTSTATUS_WIN_STATUS_CANT_WAIT = 0xC00000D8, + MD_NTSTATUS_WIN_STATUS_PIPE_EMPTY = 0xC00000D9, + MD_NTSTATUS_WIN_STATUS_CANT_ACCESS_DOMAIN_INFO = 0xC00000DA, + MD_NTSTATUS_WIN_STATUS_CANT_TERMINATE_SELF = 0xC00000DB, + MD_NTSTATUS_WIN_STATUS_INVALID_SERVER_STATE = 0xC00000DC, + MD_NTSTATUS_WIN_STATUS_INVALID_DOMAIN_STATE = 0xC00000DD, + MD_NTSTATUS_WIN_STATUS_INVALID_DOMAIN_ROLE = 0xC00000DE, + MD_NTSTATUS_WIN_STATUS_NO_SUCH_DOMAIN = 0xC00000DF, + MD_NTSTATUS_WIN_STATUS_DOMAIN_EXISTS = 0xC00000E0, + MD_NTSTATUS_WIN_STATUS_DOMAIN_LIMIT_EXCEEDED = 0xC00000E1, + MD_NTSTATUS_WIN_STATUS_OPLOCK_NOT_GRANTED = 0xC00000E2, + MD_NTSTATUS_WIN_STATUS_INVALID_OPLOCK_PROTOCOL = 0xC00000E3, + MD_NTSTATUS_WIN_STATUS_INTERNAL_DB_CORRUPTION = 0xC00000E4, + MD_NTSTATUS_WIN_STATUS_INTERNAL_ERROR = 0xC00000E5, + MD_NTSTATUS_WIN_STATUS_GENERIC_NOT_MAPPED = 0xC00000E6, + MD_NTSTATUS_WIN_STATUS_BAD_DESCRIPTOR_FORMAT = 0xC00000E7, + MD_NTSTATUS_WIN_STATUS_INVALID_USER_BUFFER = 0xC00000E8, + MD_NTSTATUS_WIN_STATUS_UNEXPECTED_IO_ERROR = 0xC00000E9, + MD_NTSTATUS_WIN_STATUS_UNEXPECTED_MM_CREATE_ERR = 0xC00000EA, + MD_NTSTATUS_WIN_STATUS_UNEXPECTED_MM_MAP_ERROR = 0xC00000EB, + MD_NTSTATUS_WIN_STATUS_UNEXPECTED_MM_EXTEND_ERR = 0xC00000EC, + MD_NTSTATUS_WIN_STATUS_NOT_LOGON_PROCESS = 0xC00000ED, + MD_NTSTATUS_WIN_STATUS_LOGON_SESSION_EXISTS = 0xC00000EE, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_1 = 0xC00000EF, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_2 = 0xC00000F0, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_3 = 0xC00000F1, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_4 = 0xC00000F2, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_5 = 0xC00000F3, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_6 = 0xC00000F4, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_7 = 0xC00000F5, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_8 = 0xC00000F6, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_9 = 0xC00000F7, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_10 = 0xC00000F8, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_11 = 0xC00000F9, + MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_12 = 0xC00000FA, + MD_NTSTATUS_WIN_STATUS_REDIRECTOR_NOT_STARTED = 0xC00000FB, + MD_NTSTATUS_WIN_STATUS_REDIRECTOR_STARTED = 0xC00000FC, + MD_NTSTATUS_WIN_STATUS_STACK_OVERFLOW = 0xC00000FD, + MD_NTSTATUS_WIN_STATUS_NO_SUCH_PACKAGE = 0xC00000FE, + MD_NTSTATUS_WIN_STATUS_BAD_FUNCTION_TABLE = 0xC00000FF, + MD_NTSTATUS_WIN_STATUS_VARIABLE_NOT_FOUND = 0xC0000100, + MD_NTSTATUS_WIN_STATUS_DIRECTORY_NOT_EMPTY = 0xC0000101, + MD_NTSTATUS_WIN_STATUS_FILE_CORRUPT_ERROR = 0xC0000102, + MD_NTSTATUS_WIN_STATUS_NOT_A_DIRECTORY = 0xC0000103, + MD_NTSTATUS_WIN_STATUS_BAD_LOGON_SESSION_STATE = 0xC0000104, + MD_NTSTATUS_WIN_STATUS_LOGON_SESSION_COLLISION = 0xC0000105, + MD_NTSTATUS_WIN_STATUS_NAME_TOO_LONG = 0xC0000106, + MD_NTSTATUS_WIN_STATUS_FILES_OPEN = 0xC0000107, + MD_NTSTATUS_WIN_STATUS_CONNECTION_IN_USE = 0xC0000108, + MD_NTSTATUS_WIN_STATUS_MESSAGE_NOT_FOUND = 0xC0000109, + MD_NTSTATUS_WIN_STATUS_PROCESS_IS_TERMINATING = 0xC000010A, + MD_NTSTATUS_WIN_STATUS_INVALID_LOGON_TYPE = 0xC000010B, + MD_NTSTATUS_WIN_STATUS_NO_GUID_TRANSLATION = 0xC000010C, + MD_NTSTATUS_WIN_STATUS_CANNOT_IMPERSONATE = 0xC000010D, + MD_NTSTATUS_WIN_STATUS_IMAGE_ALREADY_LOADED = 0xC000010E, + MD_NTSTATUS_WIN_STATUS_ABIOS_NOT_PRESENT = 0xC000010F, + MD_NTSTATUS_WIN_STATUS_ABIOS_LID_NOT_EXIST = 0xC0000110, + MD_NTSTATUS_WIN_STATUS_ABIOS_LID_ALREADY_OWNED = 0xC0000111, + MD_NTSTATUS_WIN_STATUS_ABIOS_NOT_LID_OWNER = 0xC0000112, + MD_NTSTATUS_WIN_STATUS_ABIOS_INVALID_COMMAND = 0xC0000113, + MD_NTSTATUS_WIN_STATUS_ABIOS_INVALID_LID = 0xC0000114, + MD_NTSTATUS_WIN_STATUS_ABIOS_SELECTOR_NOT_AVAILABLE = 0xC0000115, + MD_NTSTATUS_WIN_STATUS_ABIOS_INVALID_SELECTOR = 0xC0000116, + MD_NTSTATUS_WIN_STATUS_NO_LDT = 0xC0000117, + MD_NTSTATUS_WIN_STATUS_INVALID_LDT_SIZE = 0xC0000118, + MD_NTSTATUS_WIN_STATUS_INVALID_LDT_OFFSET = 0xC0000119, + MD_NTSTATUS_WIN_STATUS_INVALID_LDT_DESCRIPTOR = 0xC000011A, + MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_NE_FORMAT = 0xC000011B, + MD_NTSTATUS_WIN_STATUS_RXACT_INVALID_STATE = 0xC000011C, + MD_NTSTATUS_WIN_STATUS_RXACT_COMMIT_FAILURE = 0xC000011D, + MD_NTSTATUS_WIN_STATUS_MAPPED_FILE_SIZE_ZERO = 0xC000011E, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_OPENED_FILES = 0xC000011F, + MD_NTSTATUS_WIN_STATUS_CANCELLED = 0xC0000120, + MD_NTSTATUS_WIN_STATUS_CANNOT_DELETE = 0xC0000121, + MD_NTSTATUS_WIN_STATUS_INVALID_COMPUTER_NAME = 0xC0000122, + MD_NTSTATUS_WIN_STATUS_FILE_DELETED = 0xC0000123, + MD_NTSTATUS_WIN_STATUS_SPECIAL_ACCOUNT = 0xC0000124, + MD_NTSTATUS_WIN_STATUS_SPECIAL_GROUP = 0xC0000125, + MD_NTSTATUS_WIN_STATUS_SPECIAL_USER = 0xC0000126, + MD_NTSTATUS_WIN_STATUS_MEMBERS_PRIMARY_GROUP = 0xC0000127, + MD_NTSTATUS_WIN_STATUS_FILE_CLOSED = 0xC0000128, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_THREADS = 0xC0000129, + MD_NTSTATUS_WIN_STATUS_THREAD_NOT_IN_PROCESS = 0xC000012A, + MD_NTSTATUS_WIN_STATUS_TOKEN_ALREADY_IN_USE = 0xC000012B, + MD_NTSTATUS_WIN_STATUS_PAGEFILE_QUOTA_EXCEEDED = 0xC000012C, + MD_NTSTATUS_WIN_STATUS_COMMITMENT_LIMIT = 0xC000012D, + MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_LE_FORMAT = 0xC000012E, + MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_NOT_MZ = 0xC000012F, + MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_PROTECT = 0xC0000130, + MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_WIN_16 = 0xC0000131, + MD_NTSTATUS_WIN_STATUS_LOGON_SERVER_CONFLICT = 0xC0000132, + MD_NTSTATUS_WIN_STATUS_TIME_DIFFERENCE_AT_DC = 0xC0000133, + MD_NTSTATUS_WIN_STATUS_SYNCHRONIZATION_REQUIRED = 0xC0000134, + MD_NTSTATUS_WIN_STATUS_DLL_NOT_FOUND = 0xC0000135, + MD_NTSTATUS_WIN_STATUS_OPEN_FAILED = 0xC0000136, + MD_NTSTATUS_WIN_STATUS_IO_PRIVILEGE_FAILED = 0xC0000137, + MD_NTSTATUS_WIN_STATUS_ORDINAL_NOT_FOUND = 0xC0000138, + MD_NTSTATUS_WIN_STATUS_ENTRYPOINT_NOT_FOUND = 0xC0000139, + MD_NTSTATUS_WIN_STATUS_CONTROL_C_EXIT = 0xC000013A, + MD_NTSTATUS_WIN_STATUS_LOCAL_DISCONNECT = 0xC000013B, + MD_NTSTATUS_WIN_STATUS_REMOTE_DISCONNECT = 0xC000013C, + MD_NTSTATUS_WIN_STATUS_REMOTE_RESOURCES = 0xC000013D, + MD_NTSTATUS_WIN_STATUS_LINK_FAILED = 0xC000013E, + MD_NTSTATUS_WIN_STATUS_LINK_TIMEOUT = 0xC000013F, + MD_NTSTATUS_WIN_STATUS_INVALID_CONNECTION = 0xC0000140, + MD_NTSTATUS_WIN_STATUS_INVALID_ADDRESS = 0xC0000141, + MD_NTSTATUS_WIN_STATUS_DLL_INIT_FAILED = 0xC0000142, + MD_NTSTATUS_WIN_STATUS_MISSING_SYSTEMFILE = 0xC0000143, + MD_NTSTATUS_WIN_STATUS_UNHANDLED_EXCEPTION = 0xC0000144, + MD_NTSTATUS_WIN_STATUS_APP_INIT_FAILURE = 0xC0000145, + MD_NTSTATUS_WIN_STATUS_PAGEFILE_CREATE_FAILED = 0xC0000146, + MD_NTSTATUS_WIN_STATUS_NO_PAGEFILE = 0xC0000147, + MD_NTSTATUS_WIN_STATUS_INVALID_LEVEL = 0xC0000148, + MD_NTSTATUS_WIN_STATUS_WRONG_PASSWORD_CORE = 0xC0000149, + MD_NTSTATUS_WIN_STATUS_ILLEGAL_FLOAT_CONTEXT = 0xC000014A, + MD_NTSTATUS_WIN_STATUS_PIPE_BROKEN = 0xC000014B, + MD_NTSTATUS_WIN_STATUS_REGISTRY_CORRUPT = 0xC000014C, + MD_NTSTATUS_WIN_STATUS_REGISTRY_IO_FAILED = 0xC000014D, + MD_NTSTATUS_WIN_STATUS_NO_EVENT_PAIR = 0xC000014E, + MD_NTSTATUS_WIN_STATUS_UNRECOGNIZED_VOLUME = 0xC000014F, + MD_NTSTATUS_WIN_STATUS_SERIAL_NO_DEVICE_INITED = 0xC0000150, + MD_NTSTATUS_WIN_STATUS_NO_SUCH_ALIAS = 0xC0000151, + MD_NTSTATUS_WIN_STATUS_MEMBER_NOT_IN_ALIAS = 0xC0000152, + MD_NTSTATUS_WIN_STATUS_MEMBER_IN_ALIAS = 0xC0000153, + MD_NTSTATUS_WIN_STATUS_ALIAS_EXISTS = 0xC0000154, + MD_NTSTATUS_WIN_STATUS_LOGON_NOT_GRANTED = 0xC0000155, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_SECRETS = 0xC0000156, + MD_NTSTATUS_WIN_STATUS_SECRET_TOO_LONG = 0xC0000157, + MD_NTSTATUS_WIN_STATUS_INTERNAL_DB_ERROR = 0xC0000158, + MD_NTSTATUS_WIN_STATUS_FULLSCREEN_MODE = 0xC0000159, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_CONTEXT_IDS = 0xC000015A, + MD_NTSTATUS_WIN_STATUS_LOGON_TYPE_NOT_GRANTED = 0xC000015B, + MD_NTSTATUS_WIN_STATUS_NOT_REGISTRY_FILE = 0xC000015C, + MD_NTSTATUS_WIN_STATUS_NT_CROSS_ENCRYPTION_REQUIRED = 0xC000015D, + MD_NTSTATUS_WIN_STATUS_DOMAIN_CTRLR_CONFIG_ERROR = 0xC000015E, + MD_NTSTATUS_WIN_STATUS_FT_MISSING_MEMBER = 0xC000015F, + MD_NTSTATUS_WIN_STATUS_ILL_FORMED_SERVICE_ENTRY = 0xC0000160, + MD_NTSTATUS_WIN_STATUS_ILLEGAL_CHARACTER = 0xC0000161, + MD_NTSTATUS_WIN_STATUS_UNMAPPABLE_CHARACTER = 0xC0000162, + MD_NTSTATUS_WIN_STATUS_UNDEFINED_CHARACTER = 0xC0000163, + MD_NTSTATUS_WIN_STATUS_FLOPPY_VOLUME = 0xC0000164, + MD_NTSTATUS_WIN_STATUS_FLOPPY_ID_MARK_NOT_FOUND = 0xC0000165, + MD_NTSTATUS_WIN_STATUS_FLOPPY_WRONG_CYLINDER = 0xC0000166, + MD_NTSTATUS_WIN_STATUS_FLOPPY_UNKNOWN_ERROR = 0xC0000167, + MD_NTSTATUS_WIN_STATUS_FLOPPY_BAD_REGISTERS = 0xC0000168, + MD_NTSTATUS_WIN_STATUS_DISK_RECALIBRATE_FAILED = 0xC0000169, + MD_NTSTATUS_WIN_STATUS_DISK_OPERATION_FAILED = 0xC000016A, + MD_NTSTATUS_WIN_STATUS_DISK_RESET_FAILED = 0xC000016B, + MD_NTSTATUS_WIN_STATUS_SHARED_IRQ_BUSY = 0xC000016C, + MD_NTSTATUS_WIN_STATUS_FT_ORPHANING = 0xC000016D, + MD_NTSTATUS_WIN_STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT = 0xC000016E, + MD_NTSTATUS_WIN_STATUS_PARTITION_FAILURE = 0xC0000172, + MD_NTSTATUS_WIN_STATUS_INVALID_BLOCK_LENGTH = 0xC0000173, + MD_NTSTATUS_WIN_STATUS_DEVICE_NOT_PARTITIONED = 0xC0000174, + MD_NTSTATUS_WIN_STATUS_UNABLE_TO_LOCK_MEDIA = 0xC0000175, + MD_NTSTATUS_WIN_STATUS_UNABLE_TO_UNLOAD_MEDIA = 0xC0000176, + MD_NTSTATUS_WIN_STATUS_EOM_OVERFLOW = 0xC0000177, + MD_NTSTATUS_WIN_STATUS_NO_MEDIA = 0xC0000178, + MD_NTSTATUS_WIN_STATUS_NO_SUCH_MEMBER = 0xC000017A, + MD_NTSTATUS_WIN_STATUS_INVALID_MEMBER = 0xC000017B, + MD_NTSTATUS_WIN_STATUS_KEY_DELETED = 0xC000017C, + MD_NTSTATUS_WIN_STATUS_NO_LOG_SPACE = 0xC000017D, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_SIDS = 0xC000017E, + MD_NTSTATUS_WIN_STATUS_LM_CROSS_ENCRYPTION_REQUIRED = 0xC000017F, + MD_NTSTATUS_WIN_STATUS_KEY_HAS_CHILDREN = 0xC0000180, + MD_NTSTATUS_WIN_STATUS_CHILD_MUST_BE_VOLATILE = 0xC0000181, + MD_NTSTATUS_WIN_STATUS_DEVICE_CONFIGURATION_ERROR = 0xC0000182, + MD_NTSTATUS_WIN_STATUS_DRIVER_INTERNAL_ERROR = 0xC0000183, + MD_NTSTATUS_WIN_STATUS_INVALID_DEVICE_STATE = 0xC0000184, + MD_NTSTATUS_WIN_STATUS_IO_DEVICE_ERROR = 0xC0000185, + MD_NTSTATUS_WIN_STATUS_DEVICE_PROTOCOL_ERROR = 0xC0000186, + MD_NTSTATUS_WIN_STATUS_BACKUP_CONTROLLER = 0xC0000187, + MD_NTSTATUS_WIN_STATUS_LOG_FILE_FULL = 0xC0000188, + MD_NTSTATUS_WIN_STATUS_TOO_LATE = 0xC0000189, + MD_NTSTATUS_WIN_STATUS_NO_TRUST_LSA_SECRET = 0xC000018A, + MD_NTSTATUS_WIN_STATUS_NO_TRUST_SAM_ACCOUNT = 0xC000018B, + MD_NTSTATUS_WIN_STATUS_TRUSTED_DOMAIN_FAILURE = 0xC000018C, + MD_NTSTATUS_WIN_STATUS_TRUSTED_RELATIONSHIP_FAILURE = 0xC000018D, + MD_NTSTATUS_WIN_STATUS_EVENTLOG_FILE_CORRUPT = 0xC000018E, + MD_NTSTATUS_WIN_STATUS_EVENTLOG_CANT_START = 0xC000018F, + MD_NTSTATUS_WIN_STATUS_TRUST_FAILURE = 0xC0000190, + MD_NTSTATUS_WIN_STATUS_MUTANT_LIMIT_EXCEEDED = 0xC0000191, + MD_NTSTATUS_WIN_STATUS_NETLOGON_NOT_STARTED = 0xC0000192, + MD_NTSTATUS_WIN_STATUS_ACCOUNT_EXPIRED = 0xC0000193, + MD_NTSTATUS_WIN_STATUS_POSSIBLE_DEADLOCK = 0xC0000194, + MD_NTSTATUS_WIN_STATUS_NETWORK_CREDENTIAL_CONFLICT = 0xC0000195, + MD_NTSTATUS_WIN_STATUS_REMOTE_SESSION_LIMIT = 0xC0000196, + MD_NTSTATUS_WIN_STATUS_EVENTLOG_FILE_CHANGED = 0xC0000197, + MD_NTSTATUS_WIN_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = 0xC0000198, + MD_NTSTATUS_WIN_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT = 0xC0000199, + MD_NTSTATUS_WIN_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT = 0xC000019A, + MD_NTSTATUS_WIN_STATUS_DOMAIN_TRUST_INCONSISTENT = 0xC000019B, + MD_NTSTATUS_WIN_STATUS_FS_DRIVER_REQUIRED = 0xC000019C, + MD_NTSTATUS_WIN_STATUS_IMAGE_ALREADY_LOADED_AS_DLL = 0xC000019D, + MD_NTSTATUS_WIN_STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING = 0xC000019E, + MD_NTSTATUS_WIN_STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME = 0xC000019F, + MD_NTSTATUS_WIN_STATUS_SECURITY_STREAM_IS_INCONSISTENT = 0xC00001A0, + MD_NTSTATUS_WIN_STATUS_INVALID_LOCK_RANGE = 0xC00001A1, + MD_NTSTATUS_WIN_STATUS_INVALID_ACE_CONDITION = 0xC00001A2, + MD_NTSTATUS_WIN_STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT = 0xC00001A3, + MD_NTSTATUS_WIN_STATUS_NOTIFICATION_GUID_ALREADY_DEFINED = 0xC00001A4, + MD_NTSTATUS_WIN_STATUS_INVALID_EXCEPTION_HANDLER = 0xC00001A5, + MD_NTSTATUS_WIN_STATUS_DUPLICATE_PRIVILEGES = 0xC00001A6, + MD_NTSTATUS_WIN_STATUS_NOT_ALLOWED_ON_SYSTEM_FILE = 0xC00001A7, + MD_NTSTATUS_WIN_STATUS_REPAIR_NEEDED = 0xC00001A8, + MD_NTSTATUS_WIN_STATUS_QUOTA_NOT_ENABLED = 0xC00001A9, + MD_NTSTATUS_WIN_STATUS_NO_APPLICATION_PACKAGE = 0xC00001AA, + MD_NTSTATUS_WIN_STATUS_NETWORK_OPEN_RESTRICTION = 0xC0000201, + MD_NTSTATUS_WIN_STATUS_NO_USER_SESSION_KEY = 0xC0000202, + MD_NTSTATUS_WIN_STATUS_USER_SESSION_DELETED = 0xC0000203, + MD_NTSTATUS_WIN_STATUS_RESOURCE_LANG_NOT_FOUND = 0xC0000204, + MD_NTSTATUS_WIN_STATUS_INSUFF_SERVER_RESOURCES = 0xC0000205, + MD_NTSTATUS_WIN_STATUS_INVALID_BUFFER_SIZE = 0xC0000206, + MD_NTSTATUS_WIN_STATUS_INVALID_ADDRESS_COMPONENT = 0xC0000207, + MD_NTSTATUS_WIN_STATUS_INVALID_ADDRESS_WILDCARD = 0xC0000208, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_ADDRESSES = 0xC0000209, + MD_NTSTATUS_WIN_STATUS_ADDRESS_ALREADY_EXISTS = 0xC000020A, + MD_NTSTATUS_WIN_STATUS_ADDRESS_CLOSED = 0xC000020B, + MD_NTSTATUS_WIN_STATUS_CONNECTION_DISCONNECTED = 0xC000020C, + MD_NTSTATUS_WIN_STATUS_CONNECTION_RESET = 0xC000020D, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_NODES = 0xC000020E, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_ABORTED = 0xC000020F, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_TIMED_OUT = 0xC0000210, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_NO_RELEASE = 0xC0000211, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_NO_MATCH = 0xC0000212, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_RESPONDED = 0xC0000213, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_INVALID_ID = 0xC0000214, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_INVALID_TYPE = 0xC0000215, + MD_NTSTATUS_WIN_STATUS_NOT_SERVER_SESSION = 0xC0000216, + MD_NTSTATUS_WIN_STATUS_NOT_CLIENT_SESSION = 0xC0000217, + MD_NTSTATUS_WIN_STATUS_CANNOT_LOAD_REGISTRY_FILE = 0xC0000218, + MD_NTSTATUS_WIN_STATUS_DEBUG_ATTACH_FAILED = 0xC0000219, + MD_NTSTATUS_WIN_STATUS_SYSTEM_PROCESS_TERMINATED = 0xC000021A, + MD_NTSTATUS_WIN_STATUS_DATA_NOT_ACCEPTED = 0xC000021B, + MD_NTSTATUS_WIN_STATUS_NO_BROWSER_SERVERS_FOUND = 0xC000021C, + MD_NTSTATUS_WIN_STATUS_VDM_HARD_ERROR = 0xC000021D, + MD_NTSTATUS_WIN_STATUS_DRIVER_CANCEL_TIMEOUT = 0xC000021E, + MD_NTSTATUS_WIN_STATUS_REPLY_MESSAGE_MISMATCH = 0xC000021F, + MD_NTSTATUS_WIN_STATUS_MAPPED_ALIGNMENT = 0xC0000220, + MD_NTSTATUS_WIN_STATUS_IMAGE_CHECKSUM_MISMATCH = 0xC0000221, + MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA = 0xC0000222, + MD_NTSTATUS_WIN_STATUS_CLIENT_SERVER_PARAMETERS_INVALID = 0xC0000223, + MD_NTSTATUS_WIN_STATUS_PASSWORD_MUST_CHANGE = 0xC0000224, + MD_NTSTATUS_WIN_STATUS_NOT_FOUND = 0xC0000225, + MD_NTSTATUS_WIN_STATUS_NOT_TINY_STREAM = 0xC0000226, + MD_NTSTATUS_WIN_STATUS_RECOVERY_FAILURE = 0xC0000227, + MD_NTSTATUS_WIN_STATUS_STACK_OVERFLOW_READ = 0xC0000228, + MD_NTSTATUS_WIN_STATUS_FAIL_CHECK = 0xC0000229, + MD_NTSTATUS_WIN_STATUS_DUPLICATE_OBJECTID = 0xC000022A, + MD_NTSTATUS_WIN_STATUS_OBJECTID_EXISTS = 0xC000022B, + MD_NTSTATUS_WIN_STATUS_CONVERT_TO_LARGE = 0xC000022C, + MD_NTSTATUS_WIN_STATUS_RETRY = 0xC000022D, + MD_NTSTATUS_WIN_STATUS_FOUND_OUT_OF_SCOPE = 0xC000022E, + MD_NTSTATUS_WIN_STATUS_ALLOCATE_BUCKET = 0xC000022F, + MD_NTSTATUS_WIN_STATUS_PROPSET_NOT_FOUND = 0xC0000230, + MD_NTSTATUS_WIN_STATUS_MARSHALL_OVERFLOW = 0xC0000231, + MD_NTSTATUS_WIN_STATUS_INVALID_VARIANT = 0xC0000232, + MD_NTSTATUS_WIN_STATUS_DOMAIN_CONTROLLER_NOT_FOUND = 0xC0000233, + MD_NTSTATUS_WIN_STATUS_ACCOUNT_LOCKED_OUT = 0xC0000234, + MD_NTSTATUS_WIN_STATUS_HANDLE_NOT_CLOSABLE = 0xC0000235, + MD_NTSTATUS_WIN_STATUS_CONNECTION_REFUSED = 0xC0000236, + MD_NTSTATUS_WIN_STATUS_GRACEFUL_DISCONNECT = 0xC0000237, + MD_NTSTATUS_WIN_STATUS_ADDRESS_ALREADY_ASSOCIATED = 0xC0000238, + MD_NTSTATUS_WIN_STATUS_ADDRESS_NOT_ASSOCIATED = 0xC0000239, + MD_NTSTATUS_WIN_STATUS_CONNECTION_INVALID = 0xC000023A, + MD_NTSTATUS_WIN_STATUS_CONNECTION_ACTIVE = 0xC000023B, + MD_NTSTATUS_WIN_STATUS_NETWORK_UNREACHABLE = 0xC000023C, + MD_NTSTATUS_WIN_STATUS_HOST_UNREACHABLE = 0xC000023D, + MD_NTSTATUS_WIN_STATUS_PROTOCOL_UNREACHABLE = 0xC000023E, + MD_NTSTATUS_WIN_STATUS_PORT_UNREACHABLE = 0xC000023F, + MD_NTSTATUS_WIN_STATUS_REQUEST_ABORTED = 0xC0000240, + MD_NTSTATUS_WIN_STATUS_CONNECTION_ABORTED = 0xC0000241, + MD_NTSTATUS_WIN_STATUS_BAD_COMPRESSION_BUFFER = 0xC0000242, + MD_NTSTATUS_WIN_STATUS_USER_MAPPED_FILE = 0xC0000243, + MD_NTSTATUS_WIN_STATUS_AUDIT_FAILED = 0xC0000244, + MD_NTSTATUS_WIN_STATUS_TIMER_RESOLUTION_NOT_SET = 0xC0000245, + MD_NTSTATUS_WIN_STATUS_CONNECTION_COUNT_LIMIT = 0xC0000246, + MD_NTSTATUS_WIN_STATUS_LOGIN_TIME_RESTRICTION = 0xC0000247, + MD_NTSTATUS_WIN_STATUS_LOGIN_WKSTA_RESTRICTION = 0xC0000248, + MD_NTSTATUS_WIN_STATUS_IMAGE_MP_UP_MISMATCH = 0xC0000249, + MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_LOGON_INFO = 0xC0000250, + MD_NTSTATUS_WIN_STATUS_BAD_DLL_ENTRYPOINT = 0xC0000251, + MD_NTSTATUS_WIN_STATUS_BAD_SERVICE_ENTRYPOINT = 0xC0000252, + MD_NTSTATUS_WIN_STATUS_LPC_REPLY_LOST = 0xC0000253, + MD_NTSTATUS_WIN_STATUS_IP_ADDRESS_CONFLICT1 = 0xC0000254, + MD_NTSTATUS_WIN_STATUS_IP_ADDRESS_CONFLICT2 = 0xC0000255, + MD_NTSTATUS_WIN_STATUS_REGISTRY_QUOTA_LIMIT = 0xC0000256, + MD_NTSTATUS_WIN_STATUS_PATH_NOT_COVERED = 0xC0000257, + MD_NTSTATUS_WIN_STATUS_NO_CALLBACK_ACTIVE = 0xC0000258, + MD_NTSTATUS_WIN_STATUS_LICENSE_QUOTA_EXCEEDED = 0xC0000259, + MD_NTSTATUS_WIN_STATUS_PWD_TOO_SHORT = 0xC000025A, + MD_NTSTATUS_WIN_STATUS_PWD_TOO_RECENT = 0xC000025B, + MD_NTSTATUS_WIN_STATUS_PWD_HISTORY_CONFLICT = 0xC000025C, + MD_NTSTATUS_WIN_STATUS_PLUGPLAY_NO_DEVICE = 0xC000025E, + MD_NTSTATUS_WIN_STATUS_UNSUPPORTED_COMPRESSION = 0xC000025F, + MD_NTSTATUS_WIN_STATUS_INVALID_HW_PROFILE = 0xC0000260, + MD_NTSTATUS_WIN_STATUS_INVALID_PLUGPLAY_DEVICE_PATH = 0xC0000261, + MD_NTSTATUS_WIN_STATUS_DRIVER_ORDINAL_NOT_FOUND = 0xC0000262, + MD_NTSTATUS_WIN_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND = 0xC0000263, + MD_NTSTATUS_WIN_STATUS_RESOURCE_NOT_OWNED = 0xC0000264, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_LINKS = 0xC0000265, + MD_NTSTATUS_WIN_STATUS_QUOTA_LIST_INCONSISTENT = 0xC0000266, + MD_NTSTATUS_WIN_STATUS_FILE_IS_OFFLINE = 0xC0000267, + MD_NTSTATUS_WIN_STATUS_EVALUATION_EXPIRATION = 0xC0000268, + MD_NTSTATUS_WIN_STATUS_ILLEGAL_DLL_RELOCATION = 0xC0000269, + MD_NTSTATUS_WIN_STATUS_LICENSE_VIOLATION = 0xC000026A, + MD_NTSTATUS_WIN_STATUS_DLL_INIT_FAILED_LOGOFF = 0xC000026B, + MD_NTSTATUS_WIN_STATUS_DRIVER_UNABLE_TO_LOAD = 0xC000026C, + MD_NTSTATUS_WIN_STATUS_DFS_UNAVAILABLE = 0xC000026D, + MD_NTSTATUS_WIN_STATUS_VOLUME_DISMOUNTED = 0xC000026E, + MD_NTSTATUS_WIN_STATUS_WX86_INTERNAL_ERROR = 0xC000026F, + MD_NTSTATUS_WIN_STATUS_WX86_FLOAT_STACK_CHECK = 0xC0000270, + MD_NTSTATUS_WIN_STATUS_VALIDATE_CONTINUE = 0xC0000271, + MD_NTSTATUS_WIN_STATUS_NO_MATCH = 0xC0000272, + MD_NTSTATUS_WIN_STATUS_NO_MORE_MATCHES = 0xC0000273, + MD_NTSTATUS_WIN_STATUS_NOT_A_REPARSE_POINT = 0xC0000275, + MD_NTSTATUS_WIN_STATUS_IO_REPARSE_TAG_INVALID = 0xC0000276, + MD_NTSTATUS_WIN_STATUS_IO_REPARSE_TAG_MISMATCH = 0xC0000277, + MD_NTSTATUS_WIN_STATUS_IO_REPARSE_DATA_INVALID = 0xC0000278, + MD_NTSTATUS_WIN_STATUS_IO_REPARSE_TAG_NOT_HANDLED = 0xC0000279, + MD_NTSTATUS_WIN_STATUS_PWD_TOO_LONG = 0xC000027A, + MD_NTSTATUS_WIN_STATUS_STOWED_EXCEPTION = 0xC000027B, + MD_NTSTATUS_WIN_STATUS_REPARSE_POINT_NOT_RESOLVED = 0xC0000280, + MD_NTSTATUS_WIN_STATUS_DIRECTORY_IS_A_REPARSE_POINT = 0xC0000281, + MD_NTSTATUS_WIN_STATUS_RANGE_LIST_CONFLICT = 0xC0000282, + MD_NTSTATUS_WIN_STATUS_SOURCE_ELEMENT_EMPTY = 0xC0000283, + MD_NTSTATUS_WIN_STATUS_DESTINATION_ELEMENT_FULL = 0xC0000284, + MD_NTSTATUS_WIN_STATUS_ILLEGAL_ELEMENT_ADDRESS = 0xC0000285, + MD_NTSTATUS_WIN_STATUS_MAGAZINE_NOT_PRESENT = 0xC0000286, + MD_NTSTATUS_WIN_STATUS_REINITIALIZATION_NEEDED = 0xC0000287, + MD_NTSTATUS_WIN_STATUS_ENCRYPTION_FAILED = 0xC000028A, + MD_NTSTATUS_WIN_STATUS_DECRYPTION_FAILED = 0xC000028B, + MD_NTSTATUS_WIN_STATUS_RANGE_NOT_FOUND = 0xC000028C, + MD_NTSTATUS_WIN_STATUS_NO_RECOVERY_POLICY = 0xC000028D, + MD_NTSTATUS_WIN_STATUS_NO_EFS = 0xC000028E, + MD_NTSTATUS_WIN_STATUS_WRONG_EFS = 0xC000028F, + MD_NTSTATUS_WIN_STATUS_NO_USER_KEYS = 0xC0000290, + MD_NTSTATUS_WIN_STATUS_FILE_NOT_ENCRYPTED = 0xC0000291, + MD_NTSTATUS_WIN_STATUS_NOT_EXPORT_FORMAT = 0xC0000292, + MD_NTSTATUS_WIN_STATUS_FILE_ENCRYPTED = 0xC0000293, + MD_NTSTATUS_WIN_STATUS_WMI_GUID_NOT_FOUND = 0xC0000295, + MD_NTSTATUS_WIN_STATUS_WMI_INSTANCE_NOT_FOUND = 0xC0000296, + MD_NTSTATUS_WIN_STATUS_WMI_ITEMID_NOT_FOUND = 0xC0000297, + MD_NTSTATUS_WIN_STATUS_WMI_TRY_AGAIN = 0xC0000298, + MD_NTSTATUS_WIN_STATUS_SHARED_POLICY = 0xC0000299, + MD_NTSTATUS_WIN_STATUS_POLICY_OBJECT_NOT_FOUND = 0xC000029A, + MD_NTSTATUS_WIN_STATUS_POLICY_ONLY_IN_DS = 0xC000029B, + MD_NTSTATUS_WIN_STATUS_VOLUME_NOT_UPGRADED = 0xC000029C, + MD_NTSTATUS_WIN_STATUS_REMOTE_STORAGE_NOT_ACTIVE = 0xC000029D, + MD_NTSTATUS_WIN_STATUS_REMOTE_STORAGE_MEDIA_ERROR = 0xC000029E, + MD_NTSTATUS_WIN_STATUS_NO_TRACKING_SERVICE = 0xC000029F, + MD_NTSTATUS_WIN_STATUS_SERVER_SID_MISMATCH = 0xC00002A0, + MD_NTSTATUS_WIN_STATUS_DS_NO_ATTRIBUTE_OR_VALUE = 0xC00002A1, + MD_NTSTATUS_WIN_STATUS_DS_INVALID_ATTRIBUTE_SYNTAX = 0xC00002A2, + MD_NTSTATUS_WIN_STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED = 0xC00002A3, + MD_NTSTATUS_WIN_STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS = 0xC00002A4, + MD_NTSTATUS_WIN_STATUS_DS_BUSY = 0xC00002A5, + MD_NTSTATUS_WIN_STATUS_DS_UNAVAILABLE = 0xC00002A6, + MD_NTSTATUS_WIN_STATUS_DS_NO_RIDS_ALLOCATED = 0xC00002A7, + MD_NTSTATUS_WIN_STATUS_DS_NO_MORE_RIDS = 0xC00002A8, + MD_NTSTATUS_WIN_STATUS_DS_INCORRECT_ROLE_OWNER = 0xC00002A9, + MD_NTSTATUS_WIN_STATUS_DS_RIDMGR_INIT_ERROR = 0xC00002AA, + MD_NTSTATUS_WIN_STATUS_DS_OBJ_CLASS_VIOLATION = 0xC00002AB, + MD_NTSTATUS_WIN_STATUS_DS_CANT_ON_NON_LEAF = 0xC00002AC, + MD_NTSTATUS_WIN_STATUS_DS_CANT_ON_RDN = 0xC00002AD, + MD_NTSTATUS_WIN_STATUS_DS_CANT_MOD_OBJ_CLASS = 0xC00002AE, + MD_NTSTATUS_WIN_STATUS_DS_CROSS_DOM_MOVE_FAILED = 0xC00002AF, + MD_NTSTATUS_WIN_STATUS_DS_GC_NOT_AVAILABLE = 0xC00002B0, + MD_NTSTATUS_WIN_STATUS_DIRECTORY_SERVICE_REQUIRED = 0xC00002B1, + MD_NTSTATUS_WIN_STATUS_REPARSE_ATTRIBUTE_CONFLICT = 0xC00002B2, + MD_NTSTATUS_WIN_STATUS_CANT_ENABLE_DENY_ONLY = 0xC00002B3, + MD_NTSTATUS_WIN_STATUS_FLOAT_MULTIPLE_FAULTS = 0xC00002B4, + MD_NTSTATUS_WIN_STATUS_FLOAT_MULTIPLE_TRAPS = 0xC00002B5, + MD_NTSTATUS_WIN_STATUS_DEVICE_REMOVED = 0xC00002B6, + MD_NTSTATUS_WIN_STATUS_JOURNAL_DELETE_IN_PROGRESS = 0xC00002B7, + MD_NTSTATUS_WIN_STATUS_JOURNAL_NOT_ACTIVE = 0xC00002B8, + MD_NTSTATUS_WIN_STATUS_NOINTERFACE = 0xC00002B9, + MD_NTSTATUS_WIN_STATUS_DS_RIDMGR_DISABLED = 0xC00002BA, + MD_NTSTATUS_WIN_STATUS_DS_ADMIN_LIMIT_EXCEEDED = 0xC00002C1, + MD_NTSTATUS_WIN_STATUS_DRIVER_FAILED_SLEEP = 0xC00002C2, + MD_NTSTATUS_WIN_STATUS_MUTUAL_AUTHENTICATION_FAILED = 0xC00002C3, + MD_NTSTATUS_WIN_STATUS_CORRUPT_SYSTEM_FILE = 0xC00002C4, + MD_NTSTATUS_WIN_STATUS_DATATYPE_MISALIGNMENT_ERROR = 0xC00002C5, + MD_NTSTATUS_WIN_STATUS_WMI_READ_ONLY = 0xC00002C6, + MD_NTSTATUS_WIN_STATUS_WMI_SET_FAILURE = 0xC00002C7, + MD_NTSTATUS_WIN_STATUS_COMMITMENT_MINIMUM = 0xC00002C8, + MD_NTSTATUS_WIN_STATUS_REG_NAT_CONSUMPTION = 0xC00002C9, + MD_NTSTATUS_WIN_STATUS_TRANSPORT_FULL = 0xC00002CA, + MD_NTSTATUS_WIN_STATUS_DS_SAM_INIT_FAILURE = 0xC00002CB, + MD_NTSTATUS_WIN_STATUS_ONLY_IF_CONNECTED = 0xC00002CC, + MD_NTSTATUS_WIN_STATUS_DS_SENSITIVE_GROUP_VIOLATION = 0xC00002CD, + MD_NTSTATUS_WIN_STATUS_PNP_RESTART_ENUMERATION = 0xC00002CE, + MD_NTSTATUS_WIN_STATUS_JOURNAL_ENTRY_DELETED = 0xC00002CF, + MD_NTSTATUS_WIN_STATUS_DS_CANT_MOD_PRIMARYGROUPID = 0xC00002D0, + MD_NTSTATUS_WIN_STATUS_SYSTEM_IMAGE_BAD_SIGNATURE = 0xC00002D1, + MD_NTSTATUS_WIN_STATUS_PNP_REBOOT_REQUIRED = 0xC00002D2, + MD_NTSTATUS_WIN_STATUS_POWER_STATE_INVALID = 0xC00002D3, + MD_NTSTATUS_WIN_STATUS_DS_INVALID_GROUP_TYPE = 0xC00002D4, + MD_NTSTATUS_WIN_STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN = 0xC00002D5, + MD_NTSTATUS_WIN_STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN = 0xC00002D6, + MD_NTSTATUS_WIN_STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER = 0xC00002D7, + MD_NTSTATUS_WIN_STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER = 0xC00002D8, + MD_NTSTATUS_WIN_STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER = 0xC00002D9, + MD_NTSTATUS_WIN_STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER = 0xC00002DA, + MD_NTSTATUS_WIN_STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER = 0xC00002DB, + MD_NTSTATUS_WIN_STATUS_DS_HAVE_PRIMARY_MEMBERS = 0xC00002DC, + MD_NTSTATUS_WIN_STATUS_WMI_NOT_SUPPORTED = 0xC00002DD, + MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_POWER = 0xC00002DE, + MD_NTSTATUS_WIN_STATUS_SAM_NEED_BOOTKEY_PASSWORD = 0xC00002DF, + MD_NTSTATUS_WIN_STATUS_SAM_NEED_BOOTKEY_FLOPPY = 0xC00002E0, + MD_NTSTATUS_WIN_STATUS_DS_CANT_START = 0xC00002E1, + MD_NTSTATUS_WIN_STATUS_DS_INIT_FAILURE = 0xC00002E2, + MD_NTSTATUS_WIN_STATUS_SAM_INIT_FAILURE = 0xC00002E3, + MD_NTSTATUS_WIN_STATUS_DS_GC_REQUIRED = 0xC00002E4, + MD_NTSTATUS_WIN_STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY = 0xC00002E5, + MD_NTSTATUS_WIN_STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS = 0xC00002E6, + MD_NTSTATUS_WIN_STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED = 0xC00002E7, + MD_NTSTATUS_WIN_STATUS_MULTIPLE_FAULT_VIOLATION = 0xC00002E8, + MD_NTSTATUS_WIN_STATUS_CURRENT_DOMAIN_NOT_ALLOWED = 0xC00002E9, + MD_NTSTATUS_WIN_STATUS_CANNOT_MAKE = 0xC00002EA, + MD_NTSTATUS_WIN_STATUS_SYSTEM_SHUTDOWN = 0xC00002EB, + MD_NTSTATUS_WIN_STATUS_DS_INIT_FAILURE_CONSOLE = 0xC00002EC, + MD_NTSTATUS_WIN_STATUS_DS_SAM_INIT_FAILURE_CONSOLE = 0xC00002ED, + MD_NTSTATUS_WIN_STATUS_UNFINISHED_CONTEXT_DELETED = 0xC00002EE, + MD_NTSTATUS_WIN_STATUS_NO_TGT_REPLY = 0xC00002EF, + MD_NTSTATUS_WIN_STATUS_OBJECTID_NOT_FOUND = 0xC00002F0, + MD_NTSTATUS_WIN_STATUS_NO_IP_ADDRESSES = 0xC00002F1, + MD_NTSTATUS_WIN_STATUS_WRONG_CREDENTIAL_HANDLE = 0xC00002F2, + MD_NTSTATUS_WIN_STATUS_CRYPTO_SYSTEM_INVALID = 0xC00002F3, + MD_NTSTATUS_WIN_STATUS_MAX_REFERRALS_EXCEEDED = 0xC00002F4, + MD_NTSTATUS_WIN_STATUS_MUST_BE_KDC = 0xC00002F5, + MD_NTSTATUS_WIN_STATUS_STRONG_CRYPTO_NOT_SUPPORTED = 0xC00002F6, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_PRINCIPALS = 0xC00002F7, + MD_NTSTATUS_WIN_STATUS_NO_PA_DATA = 0xC00002F8, + MD_NTSTATUS_WIN_STATUS_PKINIT_NAME_MISMATCH = 0xC00002F9, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_LOGON_REQUIRED = 0xC00002FA, + MD_NTSTATUS_WIN_STATUS_KDC_INVALID_REQUEST = 0xC00002FB, + MD_NTSTATUS_WIN_STATUS_KDC_UNABLE_TO_REFER = 0xC00002FC, + MD_NTSTATUS_WIN_STATUS_KDC_UNKNOWN_ETYPE = 0xC00002FD, + MD_NTSTATUS_WIN_STATUS_SHUTDOWN_IN_PROGRESS = 0xC00002FE, + MD_NTSTATUS_WIN_STATUS_SERVER_SHUTDOWN_IN_PROGRESS = 0xC00002FF, + MD_NTSTATUS_WIN_STATUS_NOT_SUPPORTED_ON_SBS = 0xC0000300, + MD_NTSTATUS_WIN_STATUS_WMI_GUID_DISCONNECTED = 0xC0000301, + MD_NTSTATUS_WIN_STATUS_WMI_ALREADY_DISABLED = 0xC0000302, + MD_NTSTATUS_WIN_STATUS_WMI_ALREADY_ENABLED = 0xC0000303, + MD_NTSTATUS_WIN_STATUS_MFT_TOO_FRAGMENTED = 0xC0000304, + MD_NTSTATUS_WIN_STATUS_COPY_PROTECTION_FAILURE = 0xC0000305, + MD_NTSTATUS_WIN_STATUS_CSS_AUTHENTICATION_FAILURE = 0xC0000306, + MD_NTSTATUS_WIN_STATUS_CSS_KEY_NOT_PRESENT = 0xC0000307, + MD_NTSTATUS_WIN_STATUS_CSS_KEY_NOT_ESTABLISHED = 0xC0000308, + MD_NTSTATUS_WIN_STATUS_CSS_SCRAMBLED_SECTOR = 0xC0000309, + MD_NTSTATUS_WIN_STATUS_CSS_REGION_MISMATCH = 0xC000030A, + MD_NTSTATUS_WIN_STATUS_CSS_RESETS_EXHAUSTED = 0xC000030B, + MD_NTSTATUS_WIN_STATUS_PASSWORD_CHANGE_REQUIRED = 0xC000030C, + MD_NTSTATUS_WIN_STATUS_PKINIT_FAILURE = 0xC0000320, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_SUBSYSTEM_FAILURE = 0xC0000321, + MD_NTSTATUS_WIN_STATUS_NO_KERB_KEY = 0xC0000322, + MD_NTSTATUS_WIN_STATUS_HOST_DOWN = 0xC0000350, + MD_NTSTATUS_WIN_STATUS_UNSUPPORTED_PREAUTH = 0xC0000351, + MD_NTSTATUS_WIN_STATUS_EFS_ALG_BLOB_TOO_BIG = 0xC0000352, + MD_NTSTATUS_WIN_STATUS_PORT_NOT_SET = 0xC0000353, + MD_NTSTATUS_WIN_STATUS_DEBUGGER_INACTIVE = 0xC0000354, + MD_NTSTATUS_WIN_STATUS_DS_VERSION_CHECK_FAILURE = 0xC0000355, + MD_NTSTATUS_WIN_STATUS_AUDITING_DISABLED = 0xC0000356, + MD_NTSTATUS_WIN_STATUS_PRENT4_MACHINE_ACCOUNT = 0xC0000357, + MD_NTSTATUS_WIN_STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER = 0xC0000358, + MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_WIN_32 = 0xC0000359, + MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_WIN_64 = 0xC000035A, + MD_NTSTATUS_WIN_STATUS_BAD_BINDINGS = 0xC000035B, + MD_NTSTATUS_WIN_STATUS_NETWORK_SESSION_EXPIRED = 0xC000035C, + MD_NTSTATUS_WIN_STATUS_APPHELP_BLOCK = 0xC000035D, + MD_NTSTATUS_WIN_STATUS_ALL_SIDS_FILTERED = 0xC000035E, + MD_NTSTATUS_WIN_STATUS_NOT_SAFE_MODE_DRIVER = 0xC000035F, + MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT = 0xC0000361, + MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_PATH = 0xC0000362, + MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER = 0xC0000363, + MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER = 0xC0000364, + MD_NTSTATUS_WIN_STATUS_FAILED_DRIVER_ENTRY = 0xC0000365, + MD_NTSTATUS_WIN_STATUS_DEVICE_ENUMERATION_ERROR = 0xC0000366, + MD_NTSTATUS_WIN_STATUS_MOUNT_POINT_NOT_RESOLVED = 0xC0000368, + MD_NTSTATUS_WIN_STATUS_INVALID_DEVICE_OBJECT_PARAMETER = 0xC0000369, + MD_NTSTATUS_WIN_STATUS_MCA_OCCURED = 0xC000036A, + MD_NTSTATUS_WIN_STATUS_DRIVER_BLOCKED_CRITICAL = 0xC000036B, + MD_NTSTATUS_WIN_STATUS_DRIVER_BLOCKED = 0xC000036C, + MD_NTSTATUS_WIN_STATUS_DRIVER_DATABASE_ERROR = 0xC000036D, + MD_NTSTATUS_WIN_STATUS_SYSTEM_HIVE_TOO_LARGE = 0xC000036E, + MD_NTSTATUS_WIN_STATUS_INVALID_IMPORT_OF_NON_DLL = 0xC000036F, + MD_NTSTATUS_WIN_STATUS_NO_SECRETS = 0xC0000371, + MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY = 0xC0000372, + MD_NTSTATUS_WIN_STATUS_FAILED_STACK_SWITCH = 0xC0000373, + MD_NTSTATUS_WIN_STATUS_HEAP_CORRUPTION = 0xC0000374, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_WRONG_PIN = 0xC0000380, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_CARD_BLOCKED = 0xC0000381, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED = 0xC0000382, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_CARD = 0xC0000383, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_KEY_CONTAINER = 0xC0000384, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_CERTIFICATE = 0xC0000385, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_KEYSET = 0xC0000386, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_IO_ERROR = 0xC0000387, + MD_NTSTATUS_WIN_STATUS_DOWNGRADE_DETECTED = 0xC0000388, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_CERT_REVOKED = 0xC0000389, + MD_NTSTATUS_WIN_STATUS_ISSUING_CA_UNTRUSTED = 0xC000038A, + MD_NTSTATUS_WIN_STATUS_REVOCATION_OFFLINE_C = 0xC000038B, + MD_NTSTATUS_WIN_STATUS_PKINIT_CLIENT_FAILURE = 0xC000038C, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_CERT_EXPIRED = 0xC000038D, + MD_NTSTATUS_WIN_STATUS_DRIVER_FAILED_PRIOR_UNLOAD = 0xC000038E, + MD_NTSTATUS_WIN_STATUS_SMARTCARD_SILENT_CONTEXT = 0xC000038F, + MD_NTSTATUS_WIN_STATUS_PER_USER_TRUST_QUOTA_EXCEEDED = 0xC0000401, + MD_NTSTATUS_WIN_STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED = 0xC0000402, + MD_NTSTATUS_WIN_STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED = 0xC0000403, + MD_NTSTATUS_WIN_STATUS_DS_NAME_NOT_UNIQUE = 0xC0000404, + MD_NTSTATUS_WIN_STATUS_DS_DUPLICATE_ID_FOUND = 0xC0000405, + MD_NTSTATUS_WIN_STATUS_DS_GROUP_CONVERSION_ERROR = 0xC0000406, + MD_NTSTATUS_WIN_STATUS_VOLSNAP_PREPARE_HIBERNATE = 0xC0000407, + MD_NTSTATUS_WIN_STATUS_USER2USER_REQUIRED = 0xC0000408, + MD_NTSTATUS_WIN_STATUS_STACK_BUFFER_OVERRUN = 0xC0000409, + MD_NTSTATUS_WIN_STATUS_NO_S4U_PROT_SUPPORT = 0xC000040A, + MD_NTSTATUS_WIN_STATUS_CROSSREALM_DELEGATION_FAILURE = 0xC000040B, + MD_NTSTATUS_WIN_STATUS_REVOCATION_OFFLINE_KDC = 0xC000040C, + MD_NTSTATUS_WIN_STATUS_ISSUING_CA_UNTRUSTED_KDC = 0xC000040D, + MD_NTSTATUS_WIN_STATUS_KDC_CERT_EXPIRED = 0xC000040E, + MD_NTSTATUS_WIN_STATUS_KDC_CERT_REVOKED = 0xC000040F, + MD_NTSTATUS_WIN_STATUS_PARAMETER_QUOTA_EXCEEDED = 0xC0000410, + MD_NTSTATUS_WIN_STATUS_HIBERNATION_FAILURE = 0xC0000411, + MD_NTSTATUS_WIN_STATUS_DELAY_LOAD_FAILED = 0xC0000412, + MD_NTSTATUS_WIN_STATUS_AUTHENTICATION_FIREWALL_FAILED = 0xC0000413, + MD_NTSTATUS_WIN_STATUS_VDM_DISALLOWED = 0xC0000414, + MD_NTSTATUS_WIN_STATUS_HUNG_DISPLAY_DRIVER_THREAD = 0xC0000415, + MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE = 0xC0000416, + MD_NTSTATUS_WIN_STATUS_INVALID_CRUNTIME_PARAMETER = 0xC0000417, + MD_NTSTATUS_WIN_STATUS_NTLM_BLOCKED = 0xC0000418, + MD_NTSTATUS_WIN_STATUS_DS_SRC_SID_EXISTS_IN_FOREST = 0xC0000419, + MD_NTSTATUS_WIN_STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST = 0xC000041A, + MD_NTSTATUS_WIN_STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST = 0xC000041B, + MD_NTSTATUS_WIN_STATUS_INVALID_USER_PRINCIPAL_NAME = 0xC000041C, + MD_NTSTATUS_WIN_STATUS_FATAL_USER_CALLBACK_EXCEPTION = 0xC000041D, + MD_NTSTATUS_WIN_STATUS_ASSERTION_FAILURE = 0xC0000420, + MD_NTSTATUS_WIN_STATUS_VERIFIER_STOP = 0xC0000421, + MD_NTSTATUS_WIN_STATUS_CALLBACK_POP_STACK = 0xC0000423, + MD_NTSTATUS_WIN_STATUS_INCOMPATIBLE_DRIVER_BLOCKED = 0xC0000424, + MD_NTSTATUS_WIN_STATUS_HIVE_UNLOADED = 0xC0000425, + MD_NTSTATUS_WIN_STATUS_COMPRESSION_DISABLED = 0xC0000426, + MD_NTSTATUS_WIN_STATUS_FILE_SYSTEM_LIMITATION = 0xC0000427, + MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_HASH = 0xC0000428, + MD_NTSTATUS_WIN_STATUS_NOT_CAPABLE = 0xC0000429, + MD_NTSTATUS_WIN_STATUS_REQUEST_OUT_OF_SEQUENCE = 0xC000042A, + MD_NTSTATUS_WIN_STATUS_IMPLEMENTATION_LIMIT = 0xC000042B, + MD_NTSTATUS_WIN_STATUS_ELEVATION_REQUIRED = 0xC000042C, + MD_NTSTATUS_WIN_STATUS_NO_SECURITY_CONTEXT = 0xC000042D, + MD_NTSTATUS_WIN_STATUS_PKU2U_CERT_FAILURE = 0xC000042F, + MD_NTSTATUS_WIN_STATUS_BEYOND_VDL = 0xC0000432, + MD_NTSTATUS_WIN_STATUS_ENCOUNTERED_WRITE_IN_PROGRESS = 0xC0000433, + MD_NTSTATUS_WIN_STATUS_PTE_CHANGED = 0xC0000434, + MD_NTSTATUS_WIN_STATUS_PURGE_FAILED = 0xC0000435, + MD_NTSTATUS_WIN_STATUS_CRED_REQUIRES_CONFIRMATION = 0xC0000440, + MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE = 0xC0000441, + MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER = 0xC0000442, + MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE = 0xC0000443, + MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE = 0xC0000444, + MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_FILE_NOT_CSE = 0xC0000445, + MD_NTSTATUS_WIN_STATUS_INVALID_LABEL = 0xC0000446, + MD_NTSTATUS_WIN_STATUS_DRIVER_PROCESS_TERMINATED = 0xC0000450, + MD_NTSTATUS_WIN_STATUS_AMBIGUOUS_SYSTEM_DEVICE = 0xC0000451, + MD_NTSTATUS_WIN_STATUS_SYSTEM_DEVICE_NOT_FOUND = 0xC0000452, + MD_NTSTATUS_WIN_STATUS_RESTART_BOOT_APPLICATION = 0xC0000453, + MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_NVRAM_RESOURCES = 0xC0000454, + MD_NTSTATUS_WIN_STATUS_INVALID_SESSION = 0xC0000455, + MD_NTSTATUS_WIN_STATUS_THREAD_ALREADY_IN_SESSION = 0xC0000456, + MD_NTSTATUS_WIN_STATUS_THREAD_NOT_IN_SESSION = 0xC0000457, + MD_NTSTATUS_WIN_STATUS_INVALID_WEIGHT = 0xC0000458, + MD_NTSTATUS_WIN_STATUS_REQUEST_PAUSED = 0xC0000459, + MD_NTSTATUS_WIN_STATUS_NO_RANGES_PROCESSED = 0xC0000460, + MD_NTSTATUS_WIN_STATUS_DISK_RESOURCES_EXHAUSTED = 0xC0000461, + MD_NTSTATUS_WIN_STATUS_NEEDS_REMEDIATION = 0xC0000462, + MD_NTSTATUS_WIN_STATUS_DEVICE_FEATURE_NOT_SUPPORTED = 0xC0000463, + MD_NTSTATUS_WIN_STATUS_DEVICE_UNREACHABLE = 0xC0000464, + MD_NTSTATUS_WIN_STATUS_INVALID_TOKEN = 0xC0000465, + MD_NTSTATUS_WIN_STATUS_SERVER_UNAVAILABLE = 0xC0000466, + MD_NTSTATUS_WIN_STATUS_FILE_NOT_AVAILABLE = 0xC0000467, + MD_NTSTATUS_WIN_STATUS_DEVICE_INSUFFICIENT_RESOURCES = 0xC0000468, + MD_NTSTATUS_WIN_STATUS_PACKAGE_UPDATING = 0xC0000469, + MD_NTSTATUS_WIN_STATUS_NOT_READ_FROM_COPY = 0xC000046A, + MD_NTSTATUS_WIN_STATUS_FT_WRITE_FAILURE = 0xC000046B, + MD_NTSTATUS_WIN_STATUS_FT_DI_SCAN_REQUIRED = 0xC000046C, + MD_NTSTATUS_WIN_STATUS_OBJECT_NOT_EXTERNALLY_BACKED = 0xC000046D, + MD_NTSTATUS_WIN_STATUS_EXTERNAL_BACKING_PROVIDER_UNKNOWN = 0xC000046E, + MD_NTSTATUS_WIN_STATUS_DATA_CHECKSUM_ERROR = 0xC0000470, + MD_NTSTATUS_WIN_STATUS_INTERMIXED_KERNEL_EA_OPERATION = 0xC0000471, + MD_NTSTATUS_WIN_STATUS_TRIM_READ_ZERO_NOT_SUPPORTED = 0xC0000472, + MD_NTSTATUS_WIN_STATUS_TOO_MANY_SEGMENT_DESCRIPTORS = 0xC0000473, + MD_NTSTATUS_WIN_STATUS_INVALID_OFFSET_ALIGNMENT = 0xC0000474, + MD_NTSTATUS_WIN_STATUS_INVALID_FIELD_IN_PARAMETER_LIST = 0xC0000475, + MD_NTSTATUS_WIN_STATUS_OPERATION_IN_PROGRESS = 0xC0000476, + MD_NTSTATUS_WIN_STATUS_INVALID_INITIATOR_TARGET_PATH = 0xC0000477, + MD_NTSTATUS_WIN_STATUS_SCRUB_DATA_DISABLED = 0xC0000478, + MD_NTSTATUS_WIN_STATUS_NOT_REDUNDANT_STORAGE = 0xC0000479, + MD_NTSTATUS_WIN_STATUS_RESIDENT_FILE_NOT_SUPPORTED = 0xC000047A, + MD_NTSTATUS_WIN_STATUS_COMPRESSED_FILE_NOT_SUPPORTED = 0xC000047B, + MD_NTSTATUS_WIN_STATUS_DIRECTORY_NOT_SUPPORTED = 0xC000047C, + MD_NTSTATUS_WIN_STATUS_IO_OPERATION_TIMEOUT = 0xC000047D, + MD_NTSTATUS_WIN_STATUS_SYSTEM_NEEDS_REMEDIATION = 0xC000047E, + MD_NTSTATUS_WIN_STATUS_APPX_INTEGRITY_FAILURE_CLR_NGEN = 0xC000047F, + MD_NTSTATUS_WIN_STATUS_SHARE_UNAVAILABLE = 0xC0000480, + MD_NTSTATUS_WIN_STATUS_APISET_NOT_HOSTED = 0xC0000481, + MD_NTSTATUS_WIN_STATUS_APISET_NOT_PRESENT = 0xC0000482, + MD_NTSTATUS_WIN_STATUS_DEVICE_HARDWARE_ERROR = 0xC0000483, + MD_NTSTATUS_WIN_STATUS_INVALID_TASK_NAME = 0xC0000500, + MD_NTSTATUS_WIN_STATUS_INVALID_TASK_INDEX = 0xC0000501, + MD_NTSTATUS_WIN_STATUS_THREAD_ALREADY_IN_TASK = 0xC0000502, + MD_NTSTATUS_WIN_STATUS_CALLBACK_BYPASS = 0xC0000503, + MD_NTSTATUS_WIN_STATUS_UNDEFINED_SCOPE = 0xC0000504, + MD_NTSTATUS_WIN_STATUS_INVALID_CAP = 0xC0000505, + MD_NTSTATUS_WIN_STATUS_NOT_GUI_PROCESS = 0xC0000506, + MD_NTSTATUS_WIN_STATUS_FAIL_FAST_EXCEPTION = 0xC0000602, + MD_NTSTATUS_WIN_STATUS_IMAGE_CERT_REVOKED = 0xC0000603, + MD_NTSTATUS_WIN_STATUS_DYNAMIC_CODE_BLOCKED = 0xC0000604, + MD_NTSTATUS_WIN_STATUS_PORT_CLOSED = 0xC0000700, + MD_NTSTATUS_WIN_STATUS_MESSAGE_LOST = 0xC0000701, + MD_NTSTATUS_WIN_STATUS_INVALID_MESSAGE = 0xC0000702, + MD_NTSTATUS_WIN_STATUS_REQUEST_CANCELED = 0xC0000703, + MD_NTSTATUS_WIN_STATUS_RECURSIVE_DISPATCH = 0xC0000704, + MD_NTSTATUS_WIN_STATUS_LPC_RECEIVE_BUFFER_EXPECTED = 0xC0000705, + MD_NTSTATUS_WIN_STATUS_LPC_INVALID_CONNECTION_USAGE = 0xC0000706, + MD_NTSTATUS_WIN_STATUS_LPC_REQUESTS_NOT_ALLOWED = 0xC0000707, + MD_NTSTATUS_WIN_STATUS_RESOURCE_IN_USE = 0xC0000708, + MD_NTSTATUS_WIN_STATUS_HARDWARE_MEMORY_ERROR = 0xC0000709, + MD_NTSTATUS_WIN_STATUS_THREADPOOL_HANDLE_EXCEPTION = 0xC000070A, + MD_NTSTATUS_WIN_STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED = 0xC000070B, + MD_NTSTATUS_WIN_STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED = 0xC000070C, + MD_NTSTATUS_WIN_STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED = 0xC000070D, + MD_NTSTATUS_WIN_STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED = 0xC000070E, + MD_NTSTATUS_WIN_STATUS_THREADPOOL_RELEASED_DURING_OPERATION = 0xC000070F, + MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING = 0xC0000710, + MD_NTSTATUS_WIN_STATUS_APC_RETURNED_WHILE_IMPERSONATING = 0xC0000711, + MD_NTSTATUS_WIN_STATUS_PROCESS_IS_PROTECTED = 0xC0000712, + MD_NTSTATUS_WIN_STATUS_MCA_EXCEPTION = 0xC0000713, + MD_NTSTATUS_WIN_STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE = 0xC0000714, + MD_NTSTATUS_WIN_STATUS_SYMLINK_CLASS_DISABLED = 0xC0000715, + MD_NTSTATUS_WIN_STATUS_INVALID_IDN_NORMALIZATION = 0xC0000716, + MD_NTSTATUS_WIN_STATUS_NO_UNICODE_TRANSLATION = 0xC0000717, + MD_NTSTATUS_WIN_STATUS_ALREADY_REGISTERED = 0xC0000718, + MD_NTSTATUS_WIN_STATUS_CONTEXT_MISMATCH = 0xC0000719, + MD_NTSTATUS_WIN_STATUS_PORT_ALREADY_HAS_COMPLETION_LIST = 0xC000071A, + MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_THREAD_PRIORITY = 0xC000071B, + MD_NTSTATUS_WIN_STATUS_INVALID_THREAD = 0xC000071C, + MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_TRANSACTION = 0xC000071D, + MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_LDR_LOCK = 0xC000071E, + MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_LANG = 0xC000071F, + MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_PRI_BACK = 0xC0000720, + MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_THREAD_AFFINITY = 0xC0000721, + MD_NTSTATUS_WIN_STATUS_DISK_REPAIR_DISABLED = 0xC0000800, + MD_NTSTATUS_WIN_STATUS_DS_DOMAIN_RENAME_IN_PROGRESS = 0xC0000801, + MD_NTSTATUS_WIN_STATUS_DISK_QUOTA_EXCEEDED = 0xC0000802, + MD_NTSTATUS_WIN_STATUS_CONTENT_BLOCKED = 0xC0000804, + MD_NTSTATUS_WIN_STATUS_BAD_CLUSTERS = 0xC0000805, + MD_NTSTATUS_WIN_STATUS_VOLUME_DIRTY = 0xC0000806, + MD_NTSTATUS_WIN_STATUS_DISK_REPAIR_UNSUCCESSFUL = 0xC0000808, + MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_OVERFULL = 0xC0000809, + MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_CORRUPTED = 0xC000080A, + MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_UNAVAILABLE = 0xC000080B, + MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_DELETED_FULL = 0xC000080C, + MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_CLEARED = 0xC000080D, + MD_NTSTATUS_WIN_STATUS_ORPHAN_NAME_EXHAUSTED = 0xC000080E, + MD_NTSTATUS_WIN_STATUS_PROACTIVE_SCAN_IN_PROGRESS = 0xC000080F, + MD_NTSTATUS_WIN_STATUS_ENCRYPTED_IO_NOT_POSSIBLE = 0xC0000810, + MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_UPLEVEL_RECORDS = 0xC0000811, + MD_NTSTATUS_WIN_STATUS_FILE_CHECKED_OUT = 0xC0000901, + MD_NTSTATUS_WIN_STATUS_CHECKOUT_REQUIRED = 0xC0000902, + MD_NTSTATUS_WIN_STATUS_BAD_FILE_TYPE = 0xC0000903, + MD_NTSTATUS_WIN_STATUS_FILE_TOO_LARGE = 0xC0000904, + MD_NTSTATUS_WIN_STATUS_FORMS_AUTH_REQUIRED = 0xC0000905, + MD_NTSTATUS_WIN_STATUS_VIRUS_INFECTED = 0xC0000906, + MD_NTSTATUS_WIN_STATUS_VIRUS_DELETED = 0xC0000907, + MD_NTSTATUS_WIN_STATUS_BAD_MCFG_TABLE = 0xC0000908, + MD_NTSTATUS_WIN_STATUS_CANNOT_BREAK_OPLOCK = 0xC0000909, + MD_NTSTATUS_WIN_STATUS_BAD_KEY = 0xC000090A, + MD_NTSTATUS_WIN_STATUS_BAD_DATA = 0xC000090B, + MD_NTSTATUS_WIN_STATUS_NO_KEY = 0xC000090C, + MD_NTSTATUS_WIN_STATUS_FILE_HANDLE_REVOKED = 0xC0000910, + MD_NTSTATUS_WIN_STATUS_WOW_ASSERTION = 0xC0009898, + MD_NTSTATUS_WIN_STATUS_INVALID_SIGNATURE = 0xC000A000, + MD_NTSTATUS_WIN_STATUS_HMAC_NOT_SUPPORTED = 0xC000A001, + MD_NTSTATUS_WIN_STATUS_AUTH_TAG_MISMATCH = 0xC000A002, + MD_NTSTATUS_WIN_STATUS_INVALID_STATE_TRANSITION = 0xC000A003, + MD_NTSTATUS_WIN_STATUS_INVALID_KERNEL_INFO_VERSION = 0xC000A004, + MD_NTSTATUS_WIN_STATUS_INVALID_PEP_INFO_VERSION = 0xC000A005, + MD_NTSTATUS_WIN_STATUS_IPSEC_QUEUE_OVERFLOW = 0xC000A010, + MD_NTSTATUS_WIN_STATUS_ND_QUEUE_OVERFLOW = 0xC000A011, + MD_NTSTATUS_WIN_STATUS_HOPLIMIT_EXCEEDED = 0xC000A012, + MD_NTSTATUS_WIN_STATUS_PROTOCOL_NOT_SUPPORTED = 0xC000A013, + MD_NTSTATUS_WIN_STATUS_FASTPATH_REJECTED = 0xC000A014, + MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED = 0xC000A080, + MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR = 0xC000A081, + MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR = 0xC000A082, + MD_NTSTATUS_WIN_STATUS_XML_PARSE_ERROR = 0xC000A083, + MD_NTSTATUS_WIN_STATUS_XMLDSIG_ERROR = 0xC000A084, + MD_NTSTATUS_WIN_STATUS_WRONG_COMPARTMENT = 0xC000A085, + MD_NTSTATUS_WIN_STATUS_AUTHIP_FAILURE = 0xC000A086, + MD_NTSTATUS_WIN_STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS = 0xC000A087, + MD_NTSTATUS_WIN_STATUS_DS_OID_NOT_FOUND = 0xC000A088, + MD_NTSTATUS_WIN_STATUS_INCORRECT_ACCOUNT_TYPE = 0xC000A089, + MD_NTSTATUS_WIN_STATUS_HASH_NOT_SUPPORTED = 0xC000A100, + MD_NTSTATUS_WIN_STATUS_HASH_NOT_PRESENT = 0xC000A101, + MD_NTSTATUS_WIN_STATUS_SECONDARY_IC_PROVIDER_NOT_REGISTERED = 0xC000A121, + MD_NTSTATUS_WIN_STATUS_GPIO_CLIENT_INFORMATION_INVALID = 0xC000A122, + MD_NTSTATUS_WIN_STATUS_GPIO_VERSION_NOT_SUPPORTED = 0xC000A123, + MD_NTSTATUS_WIN_STATUS_GPIO_INVALID_REGISTRATION_PACKET = 0xC000A124, + MD_NTSTATUS_WIN_STATUS_GPIO_OPERATION_DENIED = 0xC000A125, + MD_NTSTATUS_WIN_STATUS_GPIO_INCOMPATIBLE_CONNECT_MODE = 0xC000A126, + MD_NTSTATUS_WIN_STATUS_CANNOT_SWITCH_RUNLEVEL = 0xC000A141, + MD_NTSTATUS_WIN_STATUS_INVALID_RUNLEVEL_SETTING = 0xC000A142, + MD_NTSTATUS_WIN_STATUS_RUNLEVEL_SWITCH_TIMEOUT = 0xC000A143, + MD_NTSTATUS_WIN_STATUS_RUNLEVEL_SWITCH_AGENT_TIMEOUT = 0xC000A145, + MD_NTSTATUS_WIN_STATUS_RUNLEVEL_SWITCH_IN_PROGRESS = 0xC000A146, + MD_NTSTATUS_WIN_STATUS_NOT_APPCONTAINER = 0xC000A200, + MD_NTSTATUS_WIN_STATUS_NOT_SUPPORTED_IN_APPCONTAINER = 0xC000A201, + MD_NTSTATUS_WIN_STATUS_INVALID_PACKAGE_SID_LENGTH = 0xC000A202, + MD_NTSTATUS_WIN_STATUS_APP_DATA_NOT_FOUND = 0xC000A281, + MD_NTSTATUS_WIN_STATUS_APP_DATA_EXPIRED = 0xC000A282, + MD_NTSTATUS_WIN_STATUS_APP_DATA_CORRUPT = 0xC000A283, + MD_NTSTATUS_WIN_STATUS_APP_DATA_LIMIT_EXCEEDED = 0xC000A284, + MD_NTSTATUS_WIN_STATUS_APP_DATA_REBOOT_REQUIRED = 0xC000A285, + MD_NTSTATUS_WIN_STATUS_OFFLOAD_READ_FLT_NOT_SUPPORTED = 0xC000A2A1, + MD_NTSTATUS_WIN_STATUS_OFFLOAD_WRITE_FLT_NOT_SUPPORTED = 0xC000A2A2, + MD_NTSTATUS_WIN_STATUS_OFFLOAD_READ_FILE_NOT_SUPPORTED = 0xC000A2A3, + MD_NTSTATUS_WIN_STATUS_OFFLOAD_WRITE_FILE_NOT_SUPPORTED = 0xC000A2A4, + MD_NTSTATUS_WIN_DBG_NO_STATE_CHANGE = 0xC0010001, + MD_NTSTATUS_WIN_DBG_APP_NOT_IDLE = 0xC0010002, + MD_NTSTATUS_WIN_RPC_NT_INVALID_STRING_BINDING = 0xC0020001, + MD_NTSTATUS_WIN_RPC_NT_WRONG_KIND_OF_BINDING = 0xC0020002, + MD_NTSTATUS_WIN_RPC_NT_INVALID_BINDING = 0xC0020003, + MD_NTSTATUS_WIN_RPC_NT_PROTSEQ_NOT_SUPPORTED = 0xC0020004, + MD_NTSTATUS_WIN_RPC_NT_INVALID_RPC_PROTSEQ = 0xC0020005, + MD_NTSTATUS_WIN_RPC_NT_INVALID_STRING_UUID = 0xC0020006, + MD_NTSTATUS_WIN_RPC_NT_INVALID_ENDPOINT_FORMAT = 0xC0020007, + MD_NTSTATUS_WIN_RPC_NT_INVALID_NET_ADDR = 0xC0020008, + MD_NTSTATUS_WIN_RPC_NT_NO_ENDPOINT_FOUND = 0xC0020009, + MD_NTSTATUS_WIN_RPC_NT_INVALID_TIMEOUT = 0xC002000A, + MD_NTSTATUS_WIN_RPC_NT_OBJECT_NOT_FOUND = 0xC002000B, + MD_NTSTATUS_WIN_RPC_NT_ALREADY_REGISTERED = 0xC002000C, + MD_NTSTATUS_WIN_RPC_NT_TYPE_ALREADY_REGISTERED = 0xC002000D, + MD_NTSTATUS_WIN_RPC_NT_ALREADY_LISTENING = 0xC002000E, + MD_NTSTATUS_WIN_RPC_NT_NO_PROTSEQS_REGISTERED = 0xC002000F, + MD_NTSTATUS_WIN_RPC_NT_NOT_LISTENING = 0xC0020010, + MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_MGR_TYPE = 0xC0020011, + MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_IF = 0xC0020012, + MD_NTSTATUS_WIN_RPC_NT_NO_BINDINGS = 0xC0020013, + MD_NTSTATUS_WIN_RPC_NT_NO_PROTSEQS = 0xC0020014, + MD_NTSTATUS_WIN_RPC_NT_CANT_CREATE_ENDPOINT = 0xC0020015, + MD_NTSTATUS_WIN_RPC_NT_OUT_OF_RESOURCES = 0xC0020016, + MD_NTSTATUS_WIN_RPC_NT_SERVER_UNAVAILABLE = 0xC0020017, + MD_NTSTATUS_WIN_RPC_NT_SERVER_TOO_BUSY = 0xC0020018, + MD_NTSTATUS_WIN_RPC_NT_INVALID_NETWORK_OPTIONS = 0xC0020019, + MD_NTSTATUS_WIN_RPC_NT_NO_CALL_ACTIVE = 0xC002001A, + MD_NTSTATUS_WIN_RPC_NT_CALL_FAILED = 0xC002001B, + MD_NTSTATUS_WIN_RPC_NT_CALL_FAILED_DNE = 0xC002001C, + MD_NTSTATUS_WIN_RPC_NT_PROTOCOL_ERROR = 0xC002001D, + MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_TRANS_SYN = 0xC002001F, + MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_TYPE = 0xC0020021, + MD_NTSTATUS_WIN_RPC_NT_INVALID_TAG = 0xC0020022, + MD_NTSTATUS_WIN_RPC_NT_INVALID_BOUND = 0xC0020023, + MD_NTSTATUS_WIN_RPC_NT_NO_ENTRY_NAME = 0xC0020024, + MD_NTSTATUS_WIN_RPC_NT_INVALID_NAME_SYNTAX = 0xC0020025, + MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_NAME_SYNTAX = 0xC0020026, + MD_NTSTATUS_WIN_RPC_NT_UUID_NO_ADDRESS = 0xC0020028, + MD_NTSTATUS_WIN_RPC_NT_DUPLICATE_ENDPOINT = 0xC0020029, + MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHN_TYPE = 0xC002002A, + MD_NTSTATUS_WIN_RPC_NT_MAX_CALLS_TOO_SMALL = 0xC002002B, + MD_NTSTATUS_WIN_RPC_NT_STRING_TOO_LONG = 0xC002002C, + MD_NTSTATUS_WIN_RPC_NT_PROTSEQ_NOT_FOUND = 0xC002002D, + MD_NTSTATUS_WIN_RPC_NT_PROCNUM_OUT_OF_RANGE = 0xC002002E, + MD_NTSTATUS_WIN_RPC_NT_BINDING_HAS_NO_AUTH = 0xC002002F, + MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHN_SERVICE = 0xC0020030, + MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHN_LEVEL = 0xC0020031, + MD_NTSTATUS_WIN_RPC_NT_INVALID_AUTH_IDENTITY = 0xC0020032, + MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHZ_SERVICE = 0xC0020033, + MD_NTSTATUS_WIN_EPT_NT_INVALID_ENTRY = 0xC0020034, + MD_NTSTATUS_WIN_EPT_NT_CANT_PERFORM_OP = 0xC0020035, + MD_NTSTATUS_WIN_EPT_NT_NOT_REGISTERED = 0xC0020036, + MD_NTSTATUS_WIN_RPC_NT_NOTHING_TO_EXPORT = 0xC0020037, + MD_NTSTATUS_WIN_RPC_NT_INCOMPLETE_NAME = 0xC0020038, + MD_NTSTATUS_WIN_RPC_NT_INVALID_VERS_OPTION = 0xC0020039, + MD_NTSTATUS_WIN_RPC_NT_NO_MORE_MEMBERS = 0xC002003A, + MD_NTSTATUS_WIN_RPC_NT_NOT_ALL_OBJS_UNEXPORTED = 0xC002003B, + MD_NTSTATUS_WIN_RPC_NT_INTERFACE_NOT_FOUND = 0xC002003C, + MD_NTSTATUS_WIN_RPC_NT_ENTRY_ALREADY_EXISTS = 0xC002003D, + MD_NTSTATUS_WIN_RPC_NT_ENTRY_NOT_FOUND = 0xC002003E, + MD_NTSTATUS_WIN_RPC_NT_NAME_SERVICE_UNAVAILABLE = 0xC002003F, + MD_NTSTATUS_WIN_RPC_NT_INVALID_NAF_ID = 0xC0020040, + MD_NTSTATUS_WIN_RPC_NT_CANNOT_SUPPORT = 0xC0020041, + MD_NTSTATUS_WIN_RPC_NT_NO_CONTEXT_AVAILABLE = 0xC0020042, + MD_NTSTATUS_WIN_RPC_NT_INTERNAL_ERROR = 0xC0020043, + MD_NTSTATUS_WIN_RPC_NT_ZERO_DIVIDE = 0xC0020044, + MD_NTSTATUS_WIN_RPC_NT_ADDRESS_ERROR = 0xC0020045, + MD_NTSTATUS_WIN_RPC_NT_FP_DIV_ZERO = 0xC0020046, + MD_NTSTATUS_WIN_RPC_NT_FP_UNDERFLOW = 0xC0020047, + MD_NTSTATUS_WIN_RPC_NT_FP_OVERFLOW = 0xC0020048, + MD_NTSTATUS_WIN_RPC_NT_CALL_IN_PROGRESS = 0xC0020049, + MD_NTSTATUS_WIN_RPC_NT_NO_MORE_BINDINGS = 0xC002004A, + MD_NTSTATUS_WIN_RPC_NT_GROUP_MEMBER_NOT_FOUND = 0xC002004B, + MD_NTSTATUS_WIN_EPT_NT_CANT_CREATE = 0xC002004C, + MD_NTSTATUS_WIN_RPC_NT_INVALID_OBJECT = 0xC002004D, + MD_NTSTATUS_WIN_RPC_NT_NO_INTERFACES = 0xC002004F, + MD_NTSTATUS_WIN_RPC_NT_CALL_CANCELLED = 0xC0020050, + MD_NTSTATUS_WIN_RPC_NT_BINDING_INCOMPLETE = 0xC0020051, + MD_NTSTATUS_WIN_RPC_NT_COMM_FAILURE = 0xC0020052, + MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_AUTHN_LEVEL = 0xC0020053, + MD_NTSTATUS_WIN_RPC_NT_NO_PRINC_NAME = 0xC0020054, + MD_NTSTATUS_WIN_RPC_NT_NOT_RPC_ERROR = 0xC0020055, + MD_NTSTATUS_WIN_RPC_NT_SEC_PKG_ERROR = 0xC0020057, + MD_NTSTATUS_WIN_RPC_NT_NOT_CANCELLED = 0xC0020058, + MD_NTSTATUS_WIN_RPC_NT_INVALID_ASYNC_HANDLE = 0xC0020062, + MD_NTSTATUS_WIN_RPC_NT_INVALID_ASYNC_CALL = 0xC0020063, + MD_NTSTATUS_WIN_RPC_NT_PROXY_ACCESS_DENIED = 0xC0020064, + MD_NTSTATUS_WIN_RPC_NT_COOKIE_AUTH_FAILED = 0xC0020065, + MD_NTSTATUS_WIN_RPC_NT_NO_MORE_ENTRIES = 0xC0030001, + MD_NTSTATUS_WIN_RPC_NT_SS_CHAR_TRANS_OPEN_FAIL = 0xC0030002, + MD_NTSTATUS_WIN_RPC_NT_SS_CHAR_TRANS_SHORT_FILE = 0xC0030003, + MD_NTSTATUS_WIN_RPC_NT_SS_IN_NULL_CONTEXT = 0xC0030004, + MD_NTSTATUS_WIN_RPC_NT_SS_CONTEXT_MISMATCH = 0xC0030005, + MD_NTSTATUS_WIN_RPC_NT_SS_CONTEXT_DAMAGED = 0xC0030006, + MD_NTSTATUS_WIN_RPC_NT_SS_HANDLES_MISMATCH = 0xC0030007, + MD_NTSTATUS_WIN_RPC_NT_SS_CANNOT_GET_CALL_HANDLE = 0xC0030008, + MD_NTSTATUS_WIN_RPC_NT_NULL_REF_POINTER = 0xC0030009, + MD_NTSTATUS_WIN_RPC_NT_ENUM_VALUE_OUT_OF_RANGE = 0xC003000A, + MD_NTSTATUS_WIN_RPC_NT_BYTE_COUNT_TOO_SMALL = 0xC003000B, + MD_NTSTATUS_WIN_RPC_NT_BAD_STUB_DATA = 0xC003000C, + MD_NTSTATUS_WIN_RPC_NT_INVALID_ES_ACTION = 0xC0030059, + MD_NTSTATUS_WIN_RPC_NT_WRONG_ES_VERSION = 0xC003005A, + MD_NTSTATUS_WIN_RPC_NT_WRONG_STUB_VERSION = 0xC003005B, + MD_NTSTATUS_WIN_RPC_NT_INVALID_PIPE_OBJECT = 0xC003005C, + MD_NTSTATUS_WIN_RPC_NT_INVALID_PIPE_OPERATION = 0xC003005D, + MD_NTSTATUS_WIN_RPC_NT_WRONG_PIPE_VERSION = 0xC003005E, + MD_NTSTATUS_WIN_RPC_NT_PIPE_CLOSED = 0xC003005F, + MD_NTSTATUS_WIN_RPC_NT_PIPE_DISCIPLINE_ERROR = 0xC0030060, + MD_NTSTATUS_WIN_RPC_NT_PIPE_EMPTY = 0xC0030061, + MD_NTSTATUS_WIN_STATUS_PNP_BAD_MPS_TABLE = 0xC0040035, + MD_NTSTATUS_WIN_STATUS_PNP_TRANSLATION_FAILED = 0xC0040036, + MD_NTSTATUS_WIN_STATUS_PNP_IRQ_TRANSLATION_FAILED = 0xC0040037, + MD_NTSTATUS_WIN_STATUS_PNP_INVALID_ID = 0xC0040038, + MD_NTSTATUS_WIN_STATUS_IO_REISSUE_AS_CACHED = 0xC0040039, + MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_NAME_INVALID = 0xC00A0001, + MD_NTSTATUS_WIN_STATUS_CTX_INVALID_PD = 0xC00A0002, + MD_NTSTATUS_WIN_STATUS_CTX_PD_NOT_FOUND = 0xC00A0003, + MD_NTSTATUS_WIN_STATUS_CTX_CLOSE_PENDING = 0xC00A0006, + MD_NTSTATUS_WIN_STATUS_CTX_NO_OUTBUF = 0xC00A0007, + MD_NTSTATUS_WIN_STATUS_CTX_MODEM_INF_NOT_FOUND = 0xC00A0008, + MD_NTSTATUS_WIN_STATUS_CTX_INVALID_MODEMNAME = 0xC00A0009, + MD_NTSTATUS_WIN_STATUS_CTX_RESPONSE_ERROR = 0xC00A000A, + MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_TIMEOUT = 0xC00A000B, + MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_NO_CARRIER = 0xC00A000C, + MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE = 0xC00A000D, + MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_BUSY = 0xC00A000E, + MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_VOICE = 0xC00A000F, + MD_NTSTATUS_WIN_STATUS_CTX_TD_ERROR = 0xC00A0010, + MD_NTSTATUS_WIN_STATUS_CTX_LICENSE_CLIENT_INVALID = 0xC00A0012, + MD_NTSTATUS_WIN_STATUS_CTX_LICENSE_NOT_AVAILABLE = 0xC00A0013, + MD_NTSTATUS_WIN_STATUS_CTX_LICENSE_EXPIRED = 0xC00A0014, + MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_NOT_FOUND = 0xC00A0015, + MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_NAME_COLLISION = 0xC00A0016, + MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_BUSY = 0xC00A0017, + MD_NTSTATUS_WIN_STATUS_CTX_BAD_VIDEO_MODE = 0xC00A0018, + MD_NTSTATUS_WIN_STATUS_CTX_GRAPHICS_INVALID = 0xC00A0022, + MD_NTSTATUS_WIN_STATUS_CTX_NOT_CONSOLE = 0xC00A0024, + MD_NTSTATUS_WIN_STATUS_CTX_CLIENT_QUERY_TIMEOUT = 0xC00A0026, + MD_NTSTATUS_WIN_STATUS_CTX_CONSOLE_DISCONNECT = 0xC00A0027, + MD_NTSTATUS_WIN_STATUS_CTX_CONSOLE_CONNECT = 0xC00A0028, + MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_DENIED = 0xC00A002A, + MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_ACCESS_DENIED = 0xC00A002B, + MD_NTSTATUS_WIN_STATUS_CTX_INVALID_WD = 0xC00A002E, + MD_NTSTATUS_WIN_STATUS_CTX_WD_NOT_FOUND = 0xC00A002F, + MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_INVALID = 0xC00A0030, + MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_DISABLED = 0xC00A0031, + MD_NTSTATUS_WIN_STATUS_RDP_PROTOCOL_ERROR = 0xC00A0032, + MD_NTSTATUS_WIN_STATUS_CTX_CLIENT_LICENSE_NOT_SET = 0xC00A0033, + MD_NTSTATUS_WIN_STATUS_CTX_CLIENT_LICENSE_IN_USE = 0xC00A0034, + MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE = 0xC00A0035, + MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_NOT_RUNNING = 0xC00A0036, + MD_NTSTATUS_WIN_STATUS_CTX_LOGON_DISABLED = 0xC00A0037, + MD_NTSTATUS_WIN_STATUS_CTX_SECURITY_LAYER_ERROR = 0xC00A0038, + MD_NTSTATUS_WIN_STATUS_TS_INCOMPATIBLE_SESSIONS = 0xC00A0039, + MD_NTSTATUS_WIN_STATUS_TS_VIDEO_SUBSYSTEM_ERROR = 0xC00A003A, + MD_NTSTATUS_WIN_STATUS_MUI_FILE_NOT_FOUND = 0xC00B0001, + MD_NTSTATUS_WIN_STATUS_MUI_INVALID_FILE = 0xC00B0002, + MD_NTSTATUS_WIN_STATUS_MUI_INVALID_RC_CONFIG = 0xC00B0003, + MD_NTSTATUS_WIN_STATUS_MUI_INVALID_LOCALE_NAME = 0xC00B0004, + MD_NTSTATUS_WIN_STATUS_MUI_INVALID_ULTIMATEFALLBACK_NAME = 0xC00B0005, + MD_NTSTATUS_WIN_STATUS_MUI_FILE_NOT_LOADED = 0xC00B0006, + MD_NTSTATUS_WIN_STATUS_RESOURCE_ENUM_USER_STOP = 0xC00B0007, + MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_NODE = 0xC0130001, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_EXISTS = 0xC0130002, + MD_NTSTATUS_WIN_STATUS_CLUSTER_JOIN_IN_PROGRESS = 0xC0130003, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_NOT_FOUND = 0xC0130004, + MD_NTSTATUS_WIN_STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND = 0xC0130005, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NETWORK_EXISTS = 0xC0130006, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NETWORK_NOT_FOUND = 0xC0130007, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NETINTERFACE_EXISTS = 0xC0130008, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NETINTERFACE_NOT_FOUND = 0xC0130009, + MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_REQUEST = 0xC013000A, + MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_NETWORK_PROVIDER = 0xC013000B, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_DOWN = 0xC013000C, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_UNREACHABLE = 0xC013000D, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_NOT_MEMBER = 0xC013000E, + MD_NTSTATUS_WIN_STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS = 0xC013000F, + MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_NETWORK = 0xC0130010, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NO_NET_ADAPTERS = 0xC0130011, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_UP = 0xC0130012, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_PAUSED = 0xC0130013, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_NOT_PAUSED = 0xC0130014, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NO_SECURITY_CONTEXT = 0xC0130015, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NETWORK_NOT_INTERNAL = 0xC0130016, + MD_NTSTATUS_WIN_STATUS_CLUSTER_POISONED = 0xC0130017, + MD_NTSTATUS_WIN_STATUS_CLUSTER_NON_CSV_PATH = 0xC0130018, + MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_VOLUME_NOT_LOCAL = 0xC0130019, + MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_READ_OPLOCK_BREAK_IN_PROGRESS = 0xC0130020, + MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_AUTO_PAUSE_ERROR = 0xC0130021, + MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_REDIRECTED = 0xC0130022, + MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_NOT_REDIRECTED = 0xC0130023, + MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_VOLUME_DRAINING = 0xC0130024, + MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_SNAPSHOT_CREATION_IN_PROGRESS = 0xC0130025, + MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_VOLUME_DRAINING_SUCCEEDED_DOWNLEVEL = 0xC0130026, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_OPCODE = 0xC0140001, + MD_NTSTATUS_WIN_STATUS_ACPI_STACK_OVERFLOW = 0xC0140002, + MD_NTSTATUS_WIN_STATUS_ACPI_ASSERT_FAILED = 0xC0140003, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_INDEX = 0xC0140004, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_ARGUMENT = 0xC0140005, + MD_NTSTATUS_WIN_STATUS_ACPI_FATAL = 0xC0140006, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_SUPERNAME = 0xC0140007, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_ARGTYPE = 0xC0140008, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_OBJTYPE = 0xC0140009, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_TARGETTYPE = 0xC014000A, + MD_NTSTATUS_WIN_STATUS_ACPI_INCORRECT_ARGUMENT_COUNT = 0xC014000B, + MD_NTSTATUS_WIN_STATUS_ACPI_ADDRESS_NOT_MAPPED = 0xC014000C, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_EVENTTYPE = 0xC014000D, + MD_NTSTATUS_WIN_STATUS_ACPI_HANDLER_COLLISION = 0xC014000E, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_DATA = 0xC014000F, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_REGION = 0xC0140010, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_ACCESS_SIZE = 0xC0140011, + MD_NTSTATUS_WIN_STATUS_ACPI_ACQUIRE_GLOBAL_LOCK = 0xC0140012, + MD_NTSTATUS_WIN_STATUS_ACPI_ALREADY_INITIALIZED = 0xC0140013, + MD_NTSTATUS_WIN_STATUS_ACPI_NOT_INITIALIZED = 0xC0140014, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_MUTEX_LEVEL = 0xC0140015, + MD_NTSTATUS_WIN_STATUS_ACPI_MUTEX_NOT_OWNED = 0xC0140016, + MD_NTSTATUS_WIN_STATUS_ACPI_MUTEX_NOT_OWNER = 0xC0140017, + MD_NTSTATUS_WIN_STATUS_ACPI_RS_ACCESS = 0xC0140018, + MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_TABLE = 0xC0140019, + MD_NTSTATUS_WIN_STATUS_ACPI_REG_HANDLER_FAILED = 0xC0140020, + MD_NTSTATUS_WIN_STATUS_ACPI_POWER_REQUEST_FAILED = 0xC0140021, + MD_NTSTATUS_WIN_STATUS_SXS_SECTION_NOT_FOUND = 0xC0150001, + MD_NTSTATUS_WIN_STATUS_SXS_CANT_GEN_ACTCTX = 0xC0150002, + MD_NTSTATUS_WIN_STATUS_SXS_INVALID_ACTCTXDATA_FORMAT = 0xC0150003, + MD_NTSTATUS_WIN_STATUS_SXS_ASSEMBLY_NOT_FOUND = 0xC0150004, + MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_FORMAT_ERROR = 0xC0150005, + MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_PARSE_ERROR = 0xC0150006, + MD_NTSTATUS_WIN_STATUS_SXS_ACTIVATION_CONTEXT_DISABLED = 0xC0150007, + MD_NTSTATUS_WIN_STATUS_SXS_KEY_NOT_FOUND = 0xC0150008, + MD_NTSTATUS_WIN_STATUS_SXS_VERSION_CONFLICT = 0xC0150009, + MD_NTSTATUS_WIN_STATUS_SXS_WRONG_SECTION_TYPE = 0xC015000A, + MD_NTSTATUS_WIN_STATUS_SXS_THREAD_QUERIES_DISABLED = 0xC015000B, + MD_NTSTATUS_WIN_STATUS_SXS_ASSEMBLY_MISSING = 0xC015000C, + MD_NTSTATUS_WIN_STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET = 0xC015000E, + MD_NTSTATUS_WIN_STATUS_SXS_EARLY_DEACTIVATION = 0xC015000F, + MD_NTSTATUS_WIN_STATUS_SXS_INVALID_DEACTIVATION = 0xC0150010, + MD_NTSTATUS_WIN_STATUS_SXS_MULTIPLE_DEACTIVATION = 0xC0150011, + MD_NTSTATUS_WIN_STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY = 0xC0150012, + MD_NTSTATUS_WIN_STATUS_SXS_PROCESS_TERMINATION_REQUESTED = 0xC0150013, + MD_NTSTATUS_WIN_STATUS_SXS_CORRUPT_ACTIVATION_STACK = 0xC0150014, + MD_NTSTATUS_WIN_STATUS_SXS_CORRUPTION = 0xC0150015, + MD_NTSTATUS_WIN_STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE = 0xC0150016, + MD_NTSTATUS_WIN_STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME = 0xC0150017, + MD_NTSTATUS_WIN_STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE = 0xC0150018, + MD_NTSTATUS_WIN_STATUS_SXS_IDENTITY_PARSE_ERROR = 0xC0150019, + MD_NTSTATUS_WIN_STATUS_SXS_COMPONENT_STORE_CORRUPT = 0xC015001A, + MD_NTSTATUS_WIN_STATUS_SXS_FILE_HASH_MISMATCH = 0xC015001B, + MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT = 0xC015001C, + MD_NTSTATUS_WIN_STATUS_SXS_IDENTITIES_DIFFERENT = 0xC015001D, + MD_NTSTATUS_WIN_STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT = 0xC015001E, + MD_NTSTATUS_WIN_STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY = 0xC015001F, + MD_NTSTATUS_WIN_STATUS_ADVANCED_INSTALLER_FAILED = 0xC0150020, + MD_NTSTATUS_WIN_STATUS_XML_ENCODING_MISMATCH = 0xC0150021, + MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_TOO_BIG = 0xC0150022, + MD_NTSTATUS_WIN_STATUS_SXS_SETTING_NOT_REGISTERED = 0xC0150023, + MD_NTSTATUS_WIN_STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE = 0xC0150024, + MD_NTSTATUS_WIN_STATUS_SMI_PRIMITIVE_INSTALLER_FAILED = 0xC0150025, + MD_NTSTATUS_WIN_STATUS_GENERIC_COMMAND_FAILED = 0xC0150026, + MD_NTSTATUS_WIN_STATUS_SXS_FILE_HASH_MISSING = 0xC0150027, + MD_NTSTATUS_WIN_STATUS_TRANSACTIONAL_CONFLICT = 0xC0190001, + MD_NTSTATUS_WIN_STATUS_INVALID_TRANSACTION = 0xC0190002, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_ACTIVE = 0xC0190003, + MD_NTSTATUS_WIN_STATUS_TM_INITIALIZATION_FAILED = 0xC0190004, + MD_NTSTATUS_WIN_STATUS_RM_NOT_ACTIVE = 0xC0190005, + MD_NTSTATUS_WIN_STATUS_RM_METADATA_CORRUPT = 0xC0190006, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_JOINED = 0xC0190007, + MD_NTSTATUS_WIN_STATUS_DIRECTORY_NOT_RM = 0xC0190008, + MD_NTSTATUS_WIN_STATUS_TRANSACTIONS_UNSUPPORTED_REMOTE = 0xC019000A, + MD_NTSTATUS_WIN_STATUS_LOG_RESIZE_INVALID_SIZE = 0xC019000B, + MD_NTSTATUS_WIN_STATUS_REMOTE_FILE_VERSION_MISMATCH = 0xC019000C, + MD_NTSTATUS_WIN_STATUS_CRM_PROTOCOL_ALREADY_EXISTS = 0xC019000F, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_PROPAGATION_FAILED = 0xC0190010, + MD_NTSTATUS_WIN_STATUS_CRM_PROTOCOL_NOT_FOUND = 0xC0190011, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_SUPERIOR_EXISTS = 0xC0190012, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_REQUEST_NOT_VALID = 0xC0190013, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_REQUESTED = 0xC0190014, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_ALREADY_ABORTED = 0xC0190015, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_ALREADY_COMMITTED = 0xC0190016, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_INVALID_MARSHALL_BUFFER = 0xC0190017, + MD_NTSTATUS_WIN_STATUS_CURRENT_TRANSACTION_NOT_VALID = 0xC0190018, + MD_NTSTATUS_WIN_STATUS_LOG_GROWTH_FAILED = 0xC0190019, + MD_NTSTATUS_WIN_STATUS_OBJECT_NO_LONGER_EXISTS = 0xC0190021, + MD_NTSTATUS_WIN_STATUS_STREAM_MINIVERSION_NOT_FOUND = 0xC0190022, + MD_NTSTATUS_WIN_STATUS_STREAM_MINIVERSION_NOT_VALID = 0xC0190023, + MD_NTSTATUS_WIN_STATUS_MINIVERSION_INACCESSIBLE_FROM_SPECIFIED_TRANSACTION = 0xC0190024, + MD_NTSTATUS_WIN_STATUS_CANT_OPEN_MINIVERSION_WITH_MODIFY_INTENT = 0xC0190025, + MD_NTSTATUS_WIN_STATUS_CANT_CREATE_MORE_STREAM_MINIVERSIONS = 0xC0190026, + MD_NTSTATUS_WIN_STATUS_HANDLE_NO_LONGER_VALID = 0xC0190028, + MD_NTSTATUS_WIN_STATUS_LOG_CORRUPTION_DETECTED = 0xC0190030, + MD_NTSTATUS_WIN_STATUS_RM_DISCONNECTED = 0xC0190032, + MD_NTSTATUS_WIN_STATUS_ENLISTMENT_NOT_SUPERIOR = 0xC0190033, + MD_NTSTATUS_WIN_STATUS_FILE_IDENTITY_NOT_PERSISTENT = 0xC0190036, + MD_NTSTATUS_WIN_STATUS_CANT_BREAK_TRANSACTIONAL_DEPENDENCY = 0xC0190037, + MD_NTSTATUS_WIN_STATUS_CANT_CROSS_RM_BOUNDARY = 0xC0190038, + MD_NTSTATUS_WIN_STATUS_TXF_DIR_NOT_EMPTY = 0xC0190039, + MD_NTSTATUS_WIN_STATUS_INDOUBT_TRANSACTIONS_EXIST = 0xC019003A, + MD_NTSTATUS_WIN_STATUS_TM_VOLATILE = 0xC019003B, + MD_NTSTATUS_WIN_STATUS_ROLLBACK_TIMER_EXPIRED = 0xC019003C, + MD_NTSTATUS_WIN_STATUS_TXF_ATTRIBUTE_CORRUPT = 0xC019003D, + MD_NTSTATUS_WIN_STATUS_EFS_NOT_ALLOWED_IN_TRANSACTION = 0xC019003E, + MD_NTSTATUS_WIN_STATUS_TRANSACTIONAL_OPEN_NOT_ALLOWED = 0xC019003F, + MD_NTSTATUS_WIN_STATUS_TRANSACTED_MAPPING_UNSUPPORTED_REMOTE = 0xC0190040, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_REQUIRED_PROMOTION = 0xC0190043, + MD_NTSTATUS_WIN_STATUS_CANNOT_EXECUTE_FILE_IN_TRANSACTION = 0xC0190044, + MD_NTSTATUS_WIN_STATUS_TRANSACTIONS_NOT_FROZEN = 0xC0190045, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_FREEZE_IN_PROGRESS = 0xC0190046, + MD_NTSTATUS_WIN_STATUS_NOT_SNAPSHOT_VOLUME = 0xC0190047, + MD_NTSTATUS_WIN_STATUS_NO_SAVEPOINT_WITH_OPEN_FILES = 0xC0190048, + MD_NTSTATUS_WIN_STATUS_SPARSE_NOT_ALLOWED_IN_TRANSACTION = 0xC0190049, + MD_NTSTATUS_WIN_STATUS_TM_IDENTITY_MISMATCH = 0xC019004A, + MD_NTSTATUS_WIN_STATUS_FLOATED_SECTION = 0xC019004B, + MD_NTSTATUS_WIN_STATUS_CANNOT_ACCEPT_TRANSACTED_WORK = 0xC019004C, + MD_NTSTATUS_WIN_STATUS_CANNOT_ABORT_TRANSACTIONS = 0xC019004D, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_FOUND = 0xC019004E, + MD_NTSTATUS_WIN_STATUS_RESOURCEMANAGER_NOT_FOUND = 0xC019004F, + MD_NTSTATUS_WIN_STATUS_ENLISTMENT_NOT_FOUND = 0xC0190050, + MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_NOT_FOUND = 0xC0190051, + MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_NOT_ONLINE = 0xC0190052, + MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_RECOVERY_NAME_COLLISION = 0xC0190053, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_ROOT = 0xC0190054, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_OBJECT_EXPIRED = 0xC0190055, + MD_NTSTATUS_WIN_STATUS_COMPRESSION_NOT_ALLOWED_IN_TRANSACTION = 0xC0190056, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_RESPONSE_NOT_ENLISTED = 0xC0190057, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_RECORD_TOO_LONG = 0xC0190058, + MD_NTSTATUS_WIN_STATUS_NO_LINK_TRACKING_IN_TRANSACTION = 0xC0190059, + MD_NTSTATUS_WIN_STATUS_OPERATION_NOT_SUPPORTED_IN_TRANSACTION = 0xC019005A, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_INTEGRITY_VIOLATED = 0xC019005B, + MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_IDENTITY_MISMATCH = 0xC019005C, + MD_NTSTATUS_WIN_STATUS_RM_CANNOT_BE_FROZEN_FOR_SNAPSHOT = 0xC019005D, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_MUST_WRITETHROUGH = 0xC019005E, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_NO_SUPERIOR = 0xC019005F, + MD_NTSTATUS_WIN_STATUS_EXPIRED_HANDLE = 0xC0190060, + MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_ENLISTED = 0xC0190061, + MD_NTSTATUS_WIN_STATUS_LOG_SECTOR_INVALID = 0xC01A0001, + MD_NTSTATUS_WIN_STATUS_LOG_SECTOR_PARITY_INVALID = 0xC01A0002, + MD_NTSTATUS_WIN_STATUS_LOG_SECTOR_REMAPPED = 0xC01A0003, + MD_NTSTATUS_WIN_STATUS_LOG_BLOCK_INCOMPLETE = 0xC01A0004, + MD_NTSTATUS_WIN_STATUS_LOG_INVALID_RANGE = 0xC01A0005, + MD_NTSTATUS_WIN_STATUS_LOG_BLOCKS_EXHAUSTED = 0xC01A0006, + MD_NTSTATUS_WIN_STATUS_LOG_READ_CONTEXT_INVALID = 0xC01A0007, + MD_NTSTATUS_WIN_STATUS_LOG_RESTART_INVALID = 0xC01A0008, + MD_NTSTATUS_WIN_STATUS_LOG_BLOCK_VERSION = 0xC01A0009, + MD_NTSTATUS_WIN_STATUS_LOG_BLOCK_INVALID = 0xC01A000A, + MD_NTSTATUS_WIN_STATUS_LOG_READ_MODE_INVALID = 0xC01A000B, + MD_NTSTATUS_WIN_STATUS_LOG_METADATA_CORRUPT = 0xC01A000D, + MD_NTSTATUS_WIN_STATUS_LOG_METADATA_INVALID = 0xC01A000E, + MD_NTSTATUS_WIN_STATUS_LOG_METADATA_INCONSISTENT = 0xC01A000F, + MD_NTSTATUS_WIN_STATUS_LOG_RESERVATION_INVALID = 0xC01A0010, + MD_NTSTATUS_WIN_STATUS_LOG_CANT_DELETE = 0xC01A0011, + MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_LIMIT_EXCEEDED = 0xC01A0012, + MD_NTSTATUS_WIN_STATUS_LOG_START_OF_LOG = 0xC01A0013, + MD_NTSTATUS_WIN_STATUS_LOG_POLICY_ALREADY_INSTALLED = 0xC01A0014, + MD_NTSTATUS_WIN_STATUS_LOG_POLICY_NOT_INSTALLED = 0xC01A0015, + MD_NTSTATUS_WIN_STATUS_LOG_POLICY_INVALID = 0xC01A0016, + MD_NTSTATUS_WIN_STATUS_LOG_POLICY_CONFLICT = 0xC01A0017, + MD_NTSTATUS_WIN_STATUS_LOG_PINNED_ARCHIVE_TAIL = 0xC01A0018, + MD_NTSTATUS_WIN_STATUS_LOG_RECORD_NONEXISTENT = 0xC01A0019, + MD_NTSTATUS_WIN_STATUS_LOG_RECORDS_RESERVED_INVALID = 0xC01A001A, + MD_NTSTATUS_WIN_STATUS_LOG_SPACE_RESERVED_INVALID = 0xC01A001B, + MD_NTSTATUS_WIN_STATUS_LOG_TAIL_INVALID = 0xC01A001C, + MD_NTSTATUS_WIN_STATUS_LOG_FULL = 0xC01A001D, + MD_NTSTATUS_WIN_STATUS_LOG_MULTIPLEXED = 0xC01A001E, + MD_NTSTATUS_WIN_STATUS_LOG_DEDICATED = 0xC01A001F, + MD_NTSTATUS_WIN_STATUS_LOG_ARCHIVE_NOT_IN_PROGRESS = 0xC01A0020, + MD_NTSTATUS_WIN_STATUS_LOG_ARCHIVE_IN_PROGRESS = 0xC01A0021, + MD_NTSTATUS_WIN_STATUS_LOG_EPHEMERAL = 0xC01A0022, + MD_NTSTATUS_WIN_STATUS_LOG_NOT_ENOUGH_CONTAINERS = 0xC01A0023, + MD_NTSTATUS_WIN_STATUS_LOG_CLIENT_ALREADY_REGISTERED = 0xC01A0024, + MD_NTSTATUS_WIN_STATUS_LOG_CLIENT_NOT_REGISTERED = 0xC01A0025, + MD_NTSTATUS_WIN_STATUS_LOG_FULL_HANDLER_IN_PROGRESS = 0xC01A0026, + MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_READ_FAILED = 0xC01A0027, + MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_WRITE_FAILED = 0xC01A0028, + MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_OPEN_FAILED = 0xC01A0029, + MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_STATE_INVALID = 0xC01A002A, + MD_NTSTATUS_WIN_STATUS_LOG_STATE_INVALID = 0xC01A002B, + MD_NTSTATUS_WIN_STATUS_LOG_PINNED = 0xC01A002C, + MD_NTSTATUS_WIN_STATUS_LOG_METADATA_FLUSH_FAILED = 0xC01A002D, + MD_NTSTATUS_WIN_STATUS_LOG_INCONSISTENT_SECURITY = 0xC01A002E, + MD_NTSTATUS_WIN_STATUS_LOG_APPENDED_FLUSH_FAILED = 0xC01A002F, + MD_NTSTATUS_WIN_STATUS_LOG_PINNED_RESERVATION = 0xC01A0030, + MD_NTSTATUS_WIN_STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD = 0xC01B00EA, + MD_NTSTATUS_WIN_STATUS_FLT_NO_HANDLER_DEFINED = 0xC01C0001, + MD_NTSTATUS_WIN_STATUS_FLT_CONTEXT_ALREADY_DEFINED = 0xC01C0002, + MD_NTSTATUS_WIN_STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST = 0xC01C0003, + MD_NTSTATUS_WIN_STATUS_FLT_DISALLOW_FAST_IO = 0xC01C0004, + MD_NTSTATUS_WIN_STATUS_FLT_INVALID_NAME_REQUEST = 0xC01C0005, + MD_NTSTATUS_WIN_STATUS_FLT_NOT_SAFE_TO_POST_OPERATION = 0xC01C0006, + MD_NTSTATUS_WIN_STATUS_FLT_NOT_INITIALIZED = 0xC01C0007, + MD_NTSTATUS_WIN_STATUS_FLT_FILTER_NOT_READY = 0xC01C0008, + MD_NTSTATUS_WIN_STATUS_FLT_POST_OPERATION_CLEANUP = 0xC01C0009, + MD_NTSTATUS_WIN_STATUS_FLT_INTERNAL_ERROR = 0xC01C000A, + MD_NTSTATUS_WIN_STATUS_FLT_DELETING_OBJECT = 0xC01C000B, + MD_NTSTATUS_WIN_STATUS_FLT_MUST_BE_NONPAGED_POOL = 0xC01C000C, + MD_NTSTATUS_WIN_STATUS_FLT_DUPLICATE_ENTRY = 0xC01C000D, + MD_NTSTATUS_WIN_STATUS_FLT_CBDQ_DISABLED = 0xC01C000E, + MD_NTSTATUS_WIN_STATUS_FLT_DO_NOT_ATTACH = 0xC01C000F, + MD_NTSTATUS_WIN_STATUS_FLT_DO_NOT_DETACH = 0xC01C0010, + MD_NTSTATUS_WIN_STATUS_FLT_INSTANCE_ALTITUDE_COLLISION = 0xC01C0011, + MD_NTSTATUS_WIN_STATUS_FLT_INSTANCE_NAME_COLLISION = 0xC01C0012, + MD_NTSTATUS_WIN_STATUS_FLT_FILTER_NOT_FOUND = 0xC01C0013, + MD_NTSTATUS_WIN_STATUS_FLT_VOLUME_NOT_FOUND = 0xC01C0014, + MD_NTSTATUS_WIN_STATUS_FLT_INSTANCE_NOT_FOUND = 0xC01C0015, + MD_NTSTATUS_WIN_STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND = 0xC01C0016, + MD_NTSTATUS_WIN_STATUS_FLT_INVALID_CONTEXT_REGISTRATION = 0xC01C0017, + MD_NTSTATUS_WIN_STATUS_FLT_NAME_CACHE_MISS = 0xC01C0018, + MD_NTSTATUS_WIN_STATUS_FLT_NO_DEVICE_OBJECT = 0xC01C0019, + MD_NTSTATUS_WIN_STATUS_FLT_VOLUME_ALREADY_MOUNTED = 0xC01C001A, + MD_NTSTATUS_WIN_STATUS_FLT_ALREADY_ENLISTED = 0xC01C001B, + MD_NTSTATUS_WIN_STATUS_FLT_CONTEXT_ALREADY_LINKED = 0xC01C001C, + MD_NTSTATUS_WIN_STATUS_FLT_NO_WAITER_FOR_REPLY = 0xC01C0020, + MD_NTSTATUS_WIN_STATUS_FLT_REGISTRATION_BUSY = 0xC01C0023, + MD_NTSTATUS_WIN_STATUS_MONITOR_NO_DESCRIPTOR = 0xC01D0001, + MD_NTSTATUS_WIN_STATUS_MONITOR_UNKNOWN_DESCRIPTOR_FORMAT = 0xC01D0002, + MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_DESCRIPTOR_CHECKSUM = 0xC01D0003, + MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_STANDARD_TIMING_BLOCK = 0xC01D0004, + MD_NTSTATUS_WIN_STATUS_MONITOR_WMI_DATABLOCK_REGISTRATION_FAILED = 0xC01D0005, + MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_SERIAL_NUMBER_MONDSC_BLOCK = 0xC01D0006, + MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_USER_FRIENDLY_MONDSC_BLOCK = 0xC01D0007, + MD_NTSTATUS_WIN_STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA = 0xC01D0008, + MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_DETAILED_TIMING_BLOCK = 0xC01D0009, + MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_MANUFACTURE_DATE = 0xC01D000A, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NOT_EXCLUSIVE_MODE_OWNER = 0xC01E0000, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER = 0xC01E0001, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_DISPLAY_ADAPTER = 0xC01E0002, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_WAS_RESET = 0xC01E0003, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_DRIVER_MODEL = 0xC01E0004, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_MODE_CHANGED = 0xC01E0005, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_OCCLUDED = 0xC01E0006, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_DENIED = 0xC01E0007, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANNOTCOLORCONVERT = 0xC01E0008, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_DRIVER_MISMATCH = 0xC01E0009, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_REDIRECTION_DISABLED = 0xC01E000B, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_UNOCCLUDED = 0xC01E000C, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_WINDOWDC_NOT_AVAILABLE = 0xC01E000D, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_WINDOWLESS_PRESENT_DISABLED = 0xC01E000E, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_VIDEO_MEMORY = 0xC01E0100, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_LOCK_MEMORY = 0xC01E0101, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_BUSY = 0xC01E0102, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_TOO_MANY_REFERENCES = 0xC01E0103, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_TRY_AGAIN_LATER = 0xC01E0104, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_TRY_AGAIN_NOW = 0xC01E0105, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_INVALID = 0xC01E0106, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE = 0xC01E0107, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED = 0xC01E0108, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_EVICT_PINNED_ALLOCATION = 0xC01E0109, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ALLOCATION_USAGE = 0xC01E0110, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATION = 0xC01E0111, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_CLOSED = 0xC01E0112, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ALLOCATION_INSTANCE = 0xC01E0113, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ALLOCATION_HANDLE = 0xC01E0114, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_WRONG_ALLOCATION_DEVICE = 0xC01E0115, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_CONTENT_LOST = 0xC01E0116, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE = 0xC01E0200, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY = 0xC01E0300, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_TOPOLOGY_NOT_SUPPORTED = 0xC01E0301, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_TOPOLOGY_CURRENTLY_NOT_SUPPORTED = 0xC01E0302, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN = 0xC01E0303, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE = 0xC01E0304, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET = 0xC01E0305, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_MODALITY_NOT_SUPPORTED = 0xC01E0306, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_SOURCEMODESET = 0xC01E0308, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TARGETMODESET = 0xC01E0309, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_FREQUENCY = 0xC01E030A, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ACTIVE_REGION = 0xC01E030B, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_TOTAL_REGION = 0xC01E030C, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE_MODE = 0xC01E0310, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET_MODE = 0xC01E0311, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PINNED_MODE_MUST_REMAIN_IN_SET = 0xC01E0312, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PATH_ALREADY_IN_TOPOLOGY = 0xC01E0313, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET = 0xC01E0314, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEOPRESENTSOURCESET = 0xC01E0315, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEOPRESENTTARGETSET = 0xC01E0316, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_SOURCE_ALREADY_IN_SET = 0xC01E0317, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_TARGET_ALREADY_IN_SET = 0xC01E0318, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_PRESENT_PATH = 0xC01E0319, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_RECOMMENDED_VIDPN_TOPOLOGY = 0xC01E031A, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGESET = 0xC01E031B, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE = 0xC01E031C, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_FREQUENCYRANGE_NOT_IN_SET = 0xC01E031D, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_FREQUENCYRANGE_ALREADY_IN_SET = 0xC01E031F, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_STALE_MODESET = 0xC01E0320, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_SOURCEMODESET = 0xC01E0321, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_SOURCE_MODE = 0xC01E0322, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN = 0xC01E0323, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MODE_ID_MUST_BE_UNIQUE = 0xC01E0324, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_EMPTY_ADAPTER_MONITOR_MODE_SUPPORT_INTERSECTION = 0xC01E0325, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDEO_PRESENT_TARGETS_LESS_THAN_SOURCES = 0xC01E0326, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PATH_NOT_IN_TOPOLOGY = 0xC01E0327, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_SOURCE = 0xC01E0328, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_TARGET = 0xC01E0329, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITORDESCRIPTORSET = 0xC01E032A, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITORDESCRIPTOR = 0xC01E032B, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITORDESCRIPTOR_NOT_IN_SET = 0xC01E032C, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITORDESCRIPTOR_ALREADY_IN_SET = 0xC01E032D, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITORDESCRIPTOR_ID_MUST_BE_UNIQUE = 0xC01E032E, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TARGET_SUBSET_TYPE = 0xC01E032F, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_RESOURCES_NOT_RELATED = 0xC01E0330, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_SOURCE_ID_MUST_BE_UNIQUE = 0xC01E0331, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_TARGET_ID_MUST_BE_UNIQUE = 0xC01E0332, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_AVAILABLE_VIDPN_TARGET = 0xC01E0333, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITOR_COULD_NOT_BE_ASSOCIATED_WITH_ADAPTER = 0xC01E0334, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_VIDPNMGR = 0xC01E0335, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_ACTIVE_VIDPN = 0xC01E0336, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_STALE_VIDPN_TOPOLOGY = 0xC01E0337, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITOR_NOT_CONNECTED = 0xC01E0338, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY = 0xC01E0339, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE = 0xC01E033A, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VISIBLEREGION_SIZE = 0xC01E033B, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_STRIDE = 0xC01E033C, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PIXELFORMAT = 0xC01E033D, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_COLORBASIS = 0xC01E033E, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PIXELVALUEACCESSMODE = 0xC01E033F, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_TARGET_NOT_IN_TOPOLOGY = 0xC01E0340, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_DISPLAY_MODE_MANAGEMENT_SUPPORT = 0xC01E0341, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE = 0xC01E0342, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_ACCESS_ACTIVE_VIDPN = 0xC01E0343, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PATH_IMPORTANCE_ORDINAL = 0xC01E0344, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PATH_CONTENT_GEOMETRY_TRANSFORMATION = 0xC01E0345, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_SUPPORTED = 0xC01E0346, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_GAMMA_RAMP = 0xC01E0347, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_GAMMA_RAMP_NOT_SUPPORTED = 0xC01E0348, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MULTISAMPLING_NOT_SUPPORTED = 0xC01E0349, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MODE_NOT_IN_MODESET = 0xC01E034A, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY_RECOMMENDATION_REASON = 0xC01E034D, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PATH_CONTENT_TYPE = 0xC01E034E, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_COPYPROTECTION_TYPE = 0xC01E034F, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_UNASSIGNED_MODESET_ALREADY_EXISTS = 0xC01E0350, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_SCANLINE_ORDERING = 0xC01E0352, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_TOPOLOGY_CHANGES_NOT_ALLOWED = 0xC01E0353, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_AVAILABLE_IMPORTANCE_ORDINALS = 0xC01E0354, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INCOMPATIBLE_PRIVATE_FORMAT = 0xC01E0355, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MODE_PRUNING_ALGORITHM = 0xC01E0356, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_CAPABILITY_ORIGIN = 0xC01E0357, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE_CONSTRAINT = 0xC01E0358, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MAX_NUM_PATHS_REACHED = 0xC01E0359, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANCEL_VIDPN_TOPOLOGY_AUGMENTATION = 0xC01E035A, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_CLIENT_TYPE = 0xC01E035B, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CLIENTVIDPN_NOT_SET = 0xC01E035C, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_SPECIFIED_CHILD_ALREADY_CONNECTED = 0xC01E0400, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHILD_DESCRIPTOR_NOT_SUPPORTED = 0xC01E0401, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NOT_A_LINKED_ADAPTER = 0xC01E0430, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_LEADLINK_NOT_ENUMERATED = 0xC01E0431, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHAINLINKS_NOT_ENUMERATED = 0xC01E0432, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_CHAIN_NOT_READY = 0xC01E0433, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHAINLINKS_NOT_STARTED = 0xC01E0434, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHAINLINKS_NOT_POWERED_ON = 0xC01E0435, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INCONSISTENT_DEVICE_LINK_STATE = 0xC01E0436, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NOT_POST_DEVICE_DRIVER = 0xC01E0438, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_ACCESS_NOT_EXCLUDED = 0xC01E043B, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_NOT_SUPPORTED = 0xC01E0500, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_COPP_NOT_SUPPORTED = 0xC01E0501, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_UAB_NOT_SUPPORTED = 0xC01E0502, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_ENCRYPTED_PARAMETERS = 0xC01E0503, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_NO_PROTECTED_OUTPUTS_EXIST = 0xC01E0505, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INTERNAL_ERROR = 0xC01E050B, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_HANDLE = 0xC01E050C, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PVP_INVALID_CERTIFICATE_LENGTH = 0xC01E050E, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_SPANNING_MODE_ENABLED = 0xC01E050F, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_THEATER_MODE_ENABLED = 0xC01E0510, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PVP_HFS_FAILED = 0xC01E0511, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_SRM = 0xC01E0512, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_HDCP = 0xC01E0513, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_ACP = 0xC01E0514, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_CGMSA = 0xC01E0515, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_HDCP_SRM_NEVER_SET = 0xC01E0516, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_RESOLUTION_TOO_HIGH = 0xC01E0517, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_ALL_HDCP_HARDWARE_ALREADY_IN_USE = 0xC01E0518, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_NO_LONGER_EXISTS = 0xC01E051A, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_COPP_SEMANTICS = 0xC01E051C, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_INFORMATION_REQUEST = 0xC01E051D, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_DRIVER_INTERNAL_ERROR = 0xC01E051E, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_OPM_SEMANTICS = 0xC01E051F, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_SIGNALING_NOT_SUPPORTED = 0xC01E0520, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_CONFIGURATION_REQUEST = 0xC01E0521, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_NOT_SUPPORTED = 0xC01E0580, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_DEVICE_DOES_NOT_EXIST = 0xC01E0581, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA = 0xC01E0582, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_ERROR_RECEIVING_DATA = 0xC01E0583, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_VCP_NOT_SUPPORTED = 0xC01E0584, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_DATA = 0xC01E0585, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_MONITOR_RETURNED_INVALID_TIMING_STATUS_BYTE = 0xC01E0586, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_CAPABILITIES_STRING = 0xC01E0587, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MCA_INTERNAL_ERROR = 0xC01E0588, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_COMMAND = 0xC01E0589, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_LENGTH = 0xC01E058A, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_CHECKSUM = 0xC01E058B, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PHYSICAL_MONITOR_HANDLE = 0xC01E058C, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITOR_NO_LONGER_EXISTS = 0xC01E058D, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_ONLY_CONSOLE_SESSION_SUPPORTED = 0xC01E05E0, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME = 0xC01E05E1, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP = 0xC01E05E2, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_MIRRORING_DEVICES_NOT_SUPPORTED = 0xC01E05E3, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_POINTER = 0xC01E05E4, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE = 0xC01E05E5, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_PARAMETER_ARRAY_TOO_SMALL = 0xC01E05E6, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_INTERNAL_ERROR = 0xC01E05E7, + MD_NTSTATUS_WIN_STATUS_GRAPHICS_SESSION_TYPE_CHANGE_IN_PROGRESS = 0xC01E05E8, + MD_NTSTATUS_WIN_STATUS_FVE_LOCKED_VOLUME = 0xC0210000, + MD_NTSTATUS_WIN_STATUS_FVE_NOT_ENCRYPTED = 0xC0210001, + MD_NTSTATUS_WIN_STATUS_FVE_BAD_INFORMATION = 0xC0210002, + MD_NTSTATUS_WIN_STATUS_FVE_TOO_SMALL = 0xC0210003, + MD_NTSTATUS_WIN_STATUS_FVE_FAILED_WRONG_FS = 0xC0210004, + MD_NTSTATUS_WIN_STATUS_FVE_BAD_PARTITION_SIZE = 0xC0210005, + MD_NTSTATUS_WIN_STATUS_FVE_FS_NOT_EXTENDED = 0xC0210006, + MD_NTSTATUS_WIN_STATUS_FVE_FS_MOUNTED = 0xC0210007, + MD_NTSTATUS_WIN_STATUS_FVE_NO_LICENSE = 0xC0210008, + MD_NTSTATUS_WIN_STATUS_FVE_ACTION_NOT_ALLOWED = 0xC0210009, + MD_NTSTATUS_WIN_STATUS_FVE_BAD_DATA = 0xC021000A, + MD_NTSTATUS_WIN_STATUS_FVE_VOLUME_NOT_BOUND = 0xC021000B, + MD_NTSTATUS_WIN_STATUS_FVE_NOT_DATA_VOLUME = 0xC021000C, + MD_NTSTATUS_WIN_STATUS_FVE_CONV_READ_ERROR = 0xC021000D, + MD_NTSTATUS_WIN_STATUS_FVE_CONV_WRITE_ERROR = 0xC021000E, + MD_NTSTATUS_WIN_STATUS_FVE_OVERLAPPED_UPDATE = 0xC021000F, + MD_NTSTATUS_WIN_STATUS_FVE_FAILED_SECTOR_SIZE = 0xC0210010, + MD_NTSTATUS_WIN_STATUS_FVE_FAILED_AUTHENTICATION = 0xC0210011, + MD_NTSTATUS_WIN_STATUS_FVE_NOT_OS_VOLUME = 0xC0210012, + MD_NTSTATUS_WIN_STATUS_FVE_KEYFILE_NOT_FOUND = 0xC0210013, + MD_NTSTATUS_WIN_STATUS_FVE_KEYFILE_INVALID = 0xC0210014, + MD_NTSTATUS_WIN_STATUS_FVE_KEYFILE_NO_VMK = 0xC0210015, + MD_NTSTATUS_WIN_STATUS_FVE_TPM_DISABLED = 0xC0210016, + MD_NTSTATUS_WIN_STATUS_FVE_TPM_SRK_AUTH_NOT_ZERO = 0xC0210017, + MD_NTSTATUS_WIN_STATUS_FVE_TPM_INVALID_PCR = 0xC0210018, + MD_NTSTATUS_WIN_STATUS_FVE_TPM_NO_VMK = 0xC0210019, + MD_NTSTATUS_WIN_STATUS_FVE_PIN_INVALID = 0xC021001A, + MD_NTSTATUS_WIN_STATUS_FVE_AUTH_INVALID_APPLICATION = 0xC021001B, + MD_NTSTATUS_WIN_STATUS_FVE_AUTH_INVALID_CONFIG = 0xC021001C, + MD_NTSTATUS_WIN_STATUS_FVE_DEBUGGER_ENABLED = 0xC021001D, + MD_NTSTATUS_WIN_STATUS_FVE_DRY_RUN_FAILED = 0xC021001E, + MD_NTSTATUS_WIN_STATUS_FVE_BAD_METADATA_POINTER = 0xC021001F, + MD_NTSTATUS_WIN_STATUS_FVE_OLD_METADATA_COPY = 0xC0210020, + MD_NTSTATUS_WIN_STATUS_FVE_REBOOT_REQUIRED = 0xC0210021, + MD_NTSTATUS_WIN_STATUS_FVE_RAW_ACCESS = 0xC0210022, + MD_NTSTATUS_WIN_STATUS_FVE_RAW_BLOCKED = 0xC0210023, + MD_NTSTATUS_WIN_STATUS_FVE_NO_AUTOUNLOCK_MASTER_KEY = 0xC0210024, + MD_NTSTATUS_WIN_STATUS_FVE_MOR_FAILED = 0xC0210025, + MD_NTSTATUS_WIN_STATUS_FVE_NO_FEATURE_LICENSE = 0xC0210026, + MD_NTSTATUS_WIN_STATUS_FVE_POLICY_USER_DISABLE_RDV_NOT_ALLOWED = 0xC0210027, + MD_NTSTATUS_WIN_STATUS_FVE_CONV_RECOVERY_FAILED = 0xC0210028, + MD_NTSTATUS_WIN_STATUS_FVE_VIRTUALIZED_SPACE_TOO_BIG = 0xC0210029, + MD_NTSTATUS_WIN_STATUS_FVE_INVALID_DATUM_TYPE = 0xC021002A, + MD_NTSTATUS_WIN_STATUS_FVE_VOLUME_TOO_SMALL = 0xC0210030, + MD_NTSTATUS_WIN_STATUS_FVE_ENH_PIN_INVALID = 0xC0210031, + MD_NTSTATUS_WIN_STATUS_FVE_FULL_ENCRYPTION_NOT_ALLOWED_ON_TP_STORAGE = 0xC0210032, + MD_NTSTATUS_WIN_STATUS_FVE_WIPE_NOT_ALLOWED_ON_TP_STORAGE = 0xC0210033, + MD_NTSTATUS_WIN_STATUS_FVE_NOT_ALLOWED_ON_CSV_STACK = 0xC0210034, + MD_NTSTATUS_WIN_STATUS_FVE_NOT_ALLOWED_ON_CLUSTER = 0xC0210035, + MD_NTSTATUS_WIN_STATUS_FVE_NOT_ALLOWED_TO_UPGRADE_WHILE_CONVERTING = 0xC0210036, + MD_NTSTATUS_WIN_STATUS_FVE_WIPE_CANCEL_NOT_APPLICABLE = 0xC0210037, + MD_NTSTATUS_WIN_STATUS_FVE_EDRIVE_DRY_RUN_FAILED = 0xC0210038, + MD_NTSTATUS_WIN_STATUS_FVE_SECUREBOOT_DISABLED = 0xC0210039, + MD_NTSTATUS_WIN_STATUS_FVE_SECUREBOOT_CONFIG_CHANGE = 0xC021003A, + MD_NTSTATUS_WIN_STATUS_FVE_DEVICE_LOCKEDOUT = 0xC021003B, + MD_NTSTATUS_WIN_STATUS_FVE_VOLUME_EXTEND_PREVENTS_EOW_DECRYPT = 0xC021003C, + MD_NTSTATUS_WIN_STATUS_FVE_NOT_DE_VOLUME = 0xC021003D, + MD_NTSTATUS_WIN_STATUS_FVE_PROTECTION_DISABLED = 0xC021003E, + MD_NTSTATUS_WIN_STATUS_FVE_PROTECTION_CANNOT_BE_DISABLED = 0xC021003F, + MD_NTSTATUS_WIN_STATUS_FWP_CALLOUT_NOT_FOUND = 0xC0220001, + MD_NTSTATUS_WIN_STATUS_FWP_CONDITION_NOT_FOUND = 0xC0220002, + MD_NTSTATUS_WIN_STATUS_FWP_FILTER_NOT_FOUND = 0xC0220003, + MD_NTSTATUS_WIN_STATUS_FWP_LAYER_NOT_FOUND = 0xC0220004, + MD_NTSTATUS_WIN_STATUS_FWP_PROVIDER_NOT_FOUND = 0xC0220005, + MD_NTSTATUS_WIN_STATUS_FWP_PROVIDER_CONTEXT_NOT_FOUND = 0xC0220006, + MD_NTSTATUS_WIN_STATUS_FWP_SUBLAYER_NOT_FOUND = 0xC0220007, + MD_NTSTATUS_WIN_STATUS_FWP_NOT_FOUND = 0xC0220008, + MD_NTSTATUS_WIN_STATUS_FWP_ALREADY_EXISTS = 0xC0220009, + MD_NTSTATUS_WIN_STATUS_FWP_IN_USE = 0xC022000A, + MD_NTSTATUS_WIN_STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS = 0xC022000B, + MD_NTSTATUS_WIN_STATUS_FWP_WRONG_SESSION = 0xC022000C, + MD_NTSTATUS_WIN_STATUS_FWP_NO_TXN_IN_PROGRESS = 0xC022000D, + MD_NTSTATUS_WIN_STATUS_FWP_TXN_IN_PROGRESS = 0xC022000E, + MD_NTSTATUS_WIN_STATUS_FWP_TXN_ABORTED = 0xC022000F, + MD_NTSTATUS_WIN_STATUS_FWP_SESSION_ABORTED = 0xC0220010, + MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_TXN = 0xC0220011, + MD_NTSTATUS_WIN_STATUS_FWP_TIMEOUT = 0xC0220012, + MD_NTSTATUS_WIN_STATUS_FWP_NET_EVENTS_DISABLED = 0xC0220013, + MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_LAYER = 0xC0220014, + MD_NTSTATUS_WIN_STATUS_FWP_KM_CLIENTS_ONLY = 0xC0220015, + MD_NTSTATUS_WIN_STATUS_FWP_LIFETIME_MISMATCH = 0xC0220016, + MD_NTSTATUS_WIN_STATUS_FWP_BUILTIN_OBJECT = 0xC0220017, + MD_NTSTATUS_WIN_STATUS_FWP_TOO_MANY_CALLOUTS = 0xC0220018, + MD_NTSTATUS_WIN_STATUS_FWP_NOTIFICATION_DROPPED = 0xC0220019, + MD_NTSTATUS_WIN_STATUS_FWP_TRAFFIC_MISMATCH = 0xC022001A, + MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_SA_STATE = 0xC022001B, + MD_NTSTATUS_WIN_STATUS_FWP_NULL_POINTER = 0xC022001C, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_ENUMERATOR = 0xC022001D, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_FLAGS = 0xC022001E, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_NET_MASK = 0xC022001F, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_RANGE = 0xC0220020, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_INTERVAL = 0xC0220021, + MD_NTSTATUS_WIN_STATUS_FWP_ZERO_LENGTH_ARRAY = 0xC0220022, + MD_NTSTATUS_WIN_STATUS_FWP_NULL_DISPLAY_NAME = 0xC0220023, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_ACTION_TYPE = 0xC0220024, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_WEIGHT = 0xC0220025, + MD_NTSTATUS_WIN_STATUS_FWP_MATCH_TYPE_MISMATCH = 0xC0220026, + MD_NTSTATUS_WIN_STATUS_FWP_TYPE_MISMATCH = 0xC0220027, + MD_NTSTATUS_WIN_STATUS_FWP_OUT_OF_BOUNDS = 0xC0220028, + MD_NTSTATUS_WIN_STATUS_FWP_RESERVED = 0xC0220029, + MD_NTSTATUS_WIN_STATUS_FWP_DUPLICATE_CONDITION = 0xC022002A, + MD_NTSTATUS_WIN_STATUS_FWP_DUPLICATE_KEYMOD = 0xC022002B, + MD_NTSTATUS_WIN_STATUS_FWP_ACTION_INCOMPATIBLE_WITH_LAYER = 0xC022002C, + MD_NTSTATUS_WIN_STATUS_FWP_ACTION_INCOMPATIBLE_WITH_SUBLAYER = 0xC022002D, + MD_NTSTATUS_WIN_STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_LAYER = 0xC022002E, + MD_NTSTATUS_WIN_STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_CALLOUT = 0xC022002F, + MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_AUTH_METHOD = 0xC0220030, + MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_DH_GROUP = 0xC0220031, + MD_NTSTATUS_WIN_STATUS_FWP_EM_NOT_SUPPORTED = 0xC0220032, + MD_NTSTATUS_WIN_STATUS_FWP_NEVER_MATCH = 0xC0220033, + MD_NTSTATUS_WIN_STATUS_FWP_PROVIDER_CONTEXT_MISMATCH = 0xC0220034, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_PARAMETER = 0xC0220035, + MD_NTSTATUS_WIN_STATUS_FWP_TOO_MANY_SUBLAYERS = 0xC0220036, + MD_NTSTATUS_WIN_STATUS_FWP_CALLOUT_NOTIFICATION_FAILED = 0xC0220037, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_AUTH_TRANSFORM = 0xC0220038, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_CIPHER_TRANSFORM = 0xC0220039, + MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_CIPHER_TRANSFORM = 0xC022003A, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_TRANSFORM_COMBINATION = 0xC022003B, + MD_NTSTATUS_WIN_STATUS_FWP_DUPLICATE_AUTH_METHOD = 0xC022003C, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_TUNNEL_ENDPOINT = 0xC022003D, + MD_NTSTATUS_WIN_STATUS_FWP_L2_DRIVER_NOT_READY = 0xC022003E, + MD_NTSTATUS_WIN_STATUS_FWP_KEY_DICTATOR_ALREADY_REGISTERED = 0xC022003F, + MD_NTSTATUS_WIN_STATUS_FWP_KEY_DICTATION_INVALID_KEYING_MATERIAL = 0xC0220040, + MD_NTSTATUS_WIN_STATUS_FWP_CONNECTIONS_DISABLED = 0xC0220041, + MD_NTSTATUS_WIN_STATUS_FWP_INVALID_DNS_NAME = 0xC0220042, + MD_NTSTATUS_WIN_STATUS_FWP_STILL_ON = 0xC0220043, + MD_NTSTATUS_WIN_STATUS_FWP_IKEEXT_NOT_RUNNING = 0xC0220044, + MD_NTSTATUS_WIN_STATUS_FWP_TCPIP_NOT_READY = 0xC0220100, + MD_NTSTATUS_WIN_STATUS_FWP_INJECT_HANDLE_CLOSING = 0xC0220101, + MD_NTSTATUS_WIN_STATUS_FWP_INJECT_HANDLE_STALE = 0xC0220102, + MD_NTSTATUS_WIN_STATUS_FWP_CANNOT_PEND = 0xC0220103, + MD_NTSTATUS_WIN_STATUS_FWP_DROP_NOICMP = 0xC0220104, + MD_NTSTATUS_WIN_STATUS_NDIS_CLOSING = 0xC0230002, + MD_NTSTATUS_WIN_STATUS_NDIS_BAD_VERSION = 0xC0230004, + MD_NTSTATUS_WIN_STATUS_NDIS_BAD_CHARACTERISTICS = 0xC0230005, + MD_NTSTATUS_WIN_STATUS_NDIS_ADAPTER_NOT_FOUND = 0xC0230006, + MD_NTSTATUS_WIN_STATUS_NDIS_OPEN_FAILED = 0xC0230007, + MD_NTSTATUS_WIN_STATUS_NDIS_DEVICE_FAILED = 0xC0230008, + MD_NTSTATUS_WIN_STATUS_NDIS_MULTICAST_FULL = 0xC0230009, + MD_NTSTATUS_WIN_STATUS_NDIS_MULTICAST_EXISTS = 0xC023000A, + MD_NTSTATUS_WIN_STATUS_NDIS_MULTICAST_NOT_FOUND = 0xC023000B, + MD_NTSTATUS_WIN_STATUS_NDIS_REQUEST_ABORTED = 0xC023000C, + MD_NTSTATUS_WIN_STATUS_NDIS_RESET_IN_PROGRESS = 0xC023000D, + MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_PACKET = 0xC023000F, + MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_DEVICE_REQUEST = 0xC0230010, + MD_NTSTATUS_WIN_STATUS_NDIS_ADAPTER_NOT_READY = 0xC0230011, + MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_LENGTH = 0xC0230014, + MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_DATA = 0xC0230015, + MD_NTSTATUS_WIN_STATUS_NDIS_BUFFER_TOO_SHORT = 0xC0230016, + MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_OID = 0xC0230017, + MD_NTSTATUS_WIN_STATUS_NDIS_ADAPTER_REMOVED = 0xC0230018, + MD_NTSTATUS_WIN_STATUS_NDIS_UNSUPPORTED_MEDIA = 0xC0230019, + MD_NTSTATUS_WIN_STATUS_NDIS_GROUP_ADDRESS_IN_USE = 0xC023001A, + MD_NTSTATUS_WIN_STATUS_NDIS_FILE_NOT_FOUND = 0xC023001B, + MD_NTSTATUS_WIN_STATUS_NDIS_ERROR_READING_FILE = 0xC023001C, + MD_NTSTATUS_WIN_STATUS_NDIS_ALREADY_MAPPED = 0xC023001D, + MD_NTSTATUS_WIN_STATUS_NDIS_RESOURCE_CONFLICT = 0xC023001E, + MD_NTSTATUS_WIN_STATUS_NDIS_MEDIA_DISCONNECTED = 0xC023001F, + MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_ADDRESS = 0xC0230022, + MD_NTSTATUS_WIN_STATUS_NDIS_PAUSED = 0xC023002A, + MD_NTSTATUS_WIN_STATUS_NDIS_INTERFACE_NOT_FOUND = 0xC023002B, + MD_NTSTATUS_WIN_STATUS_NDIS_UNSUPPORTED_REVISION = 0xC023002C, + MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_PORT = 0xC023002D, + MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_PORT_STATE = 0xC023002E, + MD_NTSTATUS_WIN_STATUS_NDIS_LOW_POWER_STATE = 0xC023002F, + MD_NTSTATUS_WIN_STATUS_NDIS_REINIT_REQUIRED = 0xC0230030, + MD_NTSTATUS_WIN_STATUS_NDIS_NOT_SUPPORTED = 0xC02300BB, + MD_NTSTATUS_WIN_STATUS_NDIS_OFFLOAD_POLICY = 0xC023100F, + MD_NTSTATUS_WIN_STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED = 0xC0231012, + MD_NTSTATUS_WIN_STATUS_NDIS_OFFLOAD_PATH_REJECTED = 0xC0231013, + MD_NTSTATUS_WIN_STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED = 0xC0232000, + MD_NTSTATUS_WIN_STATUS_NDIS_DOT11_MEDIA_IN_USE = 0xC0232001, + MD_NTSTATUS_WIN_STATUS_NDIS_DOT11_POWER_STATE_INVALID = 0xC0232002, + MD_NTSTATUS_WIN_STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL = 0xC0232003, + MD_NTSTATUS_WIN_STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL = 0xC0232004, + MD_NTSTATUS_WIN_STATUS_TPM_ERROR_MASK = 0xC0290000, + MD_NTSTATUS_WIN_STATUS_TPM_AUTHFAIL = 0xC0290001, + MD_NTSTATUS_WIN_STATUS_TPM_BADINDEX = 0xC0290002, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_PARAMETER = 0xC0290003, + MD_NTSTATUS_WIN_STATUS_TPM_AUDITFAILURE = 0xC0290004, + MD_NTSTATUS_WIN_STATUS_TPM_CLEAR_DISABLED = 0xC0290005, + MD_NTSTATUS_WIN_STATUS_TPM_DEACTIVATED = 0xC0290006, + MD_NTSTATUS_WIN_STATUS_TPM_DISABLED = 0xC0290007, + MD_NTSTATUS_WIN_STATUS_TPM_DISABLED_CMD = 0xC0290008, + MD_NTSTATUS_WIN_STATUS_TPM_FAIL = 0xC0290009, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_ORDINAL = 0xC029000A, + MD_NTSTATUS_WIN_STATUS_TPM_INSTALL_DISABLED = 0xC029000B, + MD_NTSTATUS_WIN_STATUS_TPM_INVALID_KEYHANDLE = 0xC029000C, + MD_NTSTATUS_WIN_STATUS_TPM_KEYNOTFOUND = 0xC029000D, + MD_NTSTATUS_WIN_STATUS_TPM_INAPPROPRIATE_ENC = 0xC029000E, + MD_NTSTATUS_WIN_STATUS_TPM_MIGRATEFAIL = 0xC029000F, + MD_NTSTATUS_WIN_STATUS_TPM_INVALID_PCR_INFO = 0xC0290010, + MD_NTSTATUS_WIN_STATUS_TPM_NOSPACE = 0xC0290011, + MD_NTSTATUS_WIN_STATUS_TPM_NOSRK = 0xC0290012, + MD_NTSTATUS_WIN_STATUS_TPM_NOTSEALED_BLOB = 0xC0290013, + MD_NTSTATUS_WIN_STATUS_TPM_OWNER_SET = 0xC0290014, + MD_NTSTATUS_WIN_STATUS_TPM_RESOURCES = 0xC0290015, + MD_NTSTATUS_WIN_STATUS_TPM_SHORTRANDOM = 0xC0290016, + MD_NTSTATUS_WIN_STATUS_TPM_SIZE = 0xC0290017, + MD_NTSTATUS_WIN_STATUS_TPM_WRONGPCRVAL = 0xC0290018, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_PARAM_SIZE = 0xC0290019, + MD_NTSTATUS_WIN_STATUS_TPM_SHA_THREAD = 0xC029001A, + MD_NTSTATUS_WIN_STATUS_TPM_SHA_ERROR = 0xC029001B, + MD_NTSTATUS_WIN_STATUS_TPM_FAILEDSELFTEST = 0xC029001C, + MD_NTSTATUS_WIN_STATUS_TPM_AUTH2FAIL = 0xC029001D, + MD_NTSTATUS_WIN_STATUS_TPM_BADTAG = 0xC029001E, + MD_NTSTATUS_WIN_STATUS_TPM_IOERROR = 0xC029001F, + MD_NTSTATUS_WIN_STATUS_TPM_ENCRYPT_ERROR = 0xC0290020, + MD_NTSTATUS_WIN_STATUS_TPM_DECRYPT_ERROR = 0xC0290021, + MD_NTSTATUS_WIN_STATUS_TPM_INVALID_AUTHHANDLE = 0xC0290022, + MD_NTSTATUS_WIN_STATUS_TPM_NO_ENDORSEMENT = 0xC0290023, + MD_NTSTATUS_WIN_STATUS_TPM_INVALID_KEYUSAGE = 0xC0290024, + MD_NTSTATUS_WIN_STATUS_TPM_WRONG_ENTITYTYPE = 0xC0290025, + MD_NTSTATUS_WIN_STATUS_TPM_INVALID_POSTINIT = 0xC0290026, + MD_NTSTATUS_WIN_STATUS_TPM_INAPPROPRIATE_SIG = 0xC0290027, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_KEY_PROPERTY = 0xC0290028, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_MIGRATION = 0xC0290029, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_SCHEME = 0xC029002A, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_DATASIZE = 0xC029002B, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_MODE = 0xC029002C, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_PRESENCE = 0xC029002D, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_VERSION = 0xC029002E, + MD_NTSTATUS_WIN_STATUS_TPM_NO_WRAP_TRANSPORT = 0xC029002F, + MD_NTSTATUS_WIN_STATUS_TPM_AUDITFAIL_UNSUCCESSFUL = 0xC0290030, + MD_NTSTATUS_WIN_STATUS_TPM_AUDITFAIL_SUCCESSFUL = 0xC0290031, + MD_NTSTATUS_WIN_STATUS_TPM_NOTRESETABLE = 0xC0290032, + MD_NTSTATUS_WIN_STATUS_TPM_NOTLOCAL = 0xC0290033, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_TYPE = 0xC0290034, + MD_NTSTATUS_WIN_STATUS_TPM_INVALID_RESOURCE = 0xC0290035, + MD_NTSTATUS_WIN_STATUS_TPM_NOTFIPS = 0xC0290036, + MD_NTSTATUS_WIN_STATUS_TPM_INVALID_FAMILY = 0xC0290037, + MD_NTSTATUS_WIN_STATUS_TPM_NO_NV_PERMISSION = 0xC0290038, + MD_NTSTATUS_WIN_STATUS_TPM_REQUIRES_SIGN = 0xC0290039, + MD_NTSTATUS_WIN_STATUS_TPM_KEY_NOTSUPPORTED = 0xC029003A, + MD_NTSTATUS_WIN_STATUS_TPM_AUTH_CONFLICT = 0xC029003B, + MD_NTSTATUS_WIN_STATUS_TPM_AREA_LOCKED = 0xC029003C, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_LOCALITY = 0xC029003D, + MD_NTSTATUS_WIN_STATUS_TPM_READ_ONLY = 0xC029003E, + MD_NTSTATUS_WIN_STATUS_TPM_PER_NOWRITE = 0xC029003F, + MD_NTSTATUS_WIN_STATUS_TPM_FAMILYCOUNT = 0xC0290040, + MD_NTSTATUS_WIN_STATUS_TPM_WRITE_LOCKED = 0xC0290041, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_ATTRIBUTES = 0xC0290042, + MD_NTSTATUS_WIN_STATUS_TPM_INVALID_STRUCTURE = 0xC0290043, + MD_NTSTATUS_WIN_STATUS_TPM_KEY_OWNER_CONTROL = 0xC0290044, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_COUNTER = 0xC0290045, + MD_NTSTATUS_WIN_STATUS_TPM_NOT_FULLWRITE = 0xC0290046, + MD_NTSTATUS_WIN_STATUS_TPM_CONTEXT_GAP = 0xC0290047, + MD_NTSTATUS_WIN_STATUS_TPM_MAXNVWRITES = 0xC0290048, + MD_NTSTATUS_WIN_STATUS_TPM_NOOPERATOR = 0xC0290049, + MD_NTSTATUS_WIN_STATUS_TPM_RESOURCEMISSING = 0xC029004A, + MD_NTSTATUS_WIN_STATUS_TPM_DELEGATE_LOCK = 0xC029004B, + MD_NTSTATUS_WIN_STATUS_TPM_DELEGATE_FAMILY = 0xC029004C, + MD_NTSTATUS_WIN_STATUS_TPM_DELEGATE_ADMIN = 0xC029004D, + MD_NTSTATUS_WIN_STATUS_TPM_TRANSPORT_NOTEXCLUSIVE = 0xC029004E, + MD_NTSTATUS_WIN_STATUS_TPM_OWNER_CONTROL = 0xC029004F, + MD_NTSTATUS_WIN_STATUS_TPM_DAA_RESOURCES = 0xC0290050, + MD_NTSTATUS_WIN_STATUS_TPM_DAA_INPUT_DATA0 = 0xC0290051, + MD_NTSTATUS_WIN_STATUS_TPM_DAA_INPUT_DATA1 = 0xC0290052, + MD_NTSTATUS_WIN_STATUS_TPM_DAA_ISSUER_SETTINGS = 0xC0290053, + MD_NTSTATUS_WIN_STATUS_TPM_DAA_TPM_SETTINGS = 0xC0290054, + MD_NTSTATUS_WIN_STATUS_TPM_DAA_STAGE = 0xC0290055, + MD_NTSTATUS_WIN_STATUS_TPM_DAA_ISSUER_VALIDITY = 0xC0290056, + MD_NTSTATUS_WIN_STATUS_TPM_DAA_WRONG_W = 0xC0290057, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_HANDLE = 0xC0290058, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_DELEGATE = 0xC0290059, + MD_NTSTATUS_WIN_STATUS_TPM_BADCONTEXT = 0xC029005A, + MD_NTSTATUS_WIN_STATUS_TPM_TOOMANYCONTEXTS = 0xC029005B, + MD_NTSTATUS_WIN_STATUS_TPM_MA_TICKET_SIGNATURE = 0xC029005C, + MD_NTSTATUS_WIN_STATUS_TPM_MA_DESTINATION = 0xC029005D, + MD_NTSTATUS_WIN_STATUS_TPM_MA_SOURCE = 0xC029005E, + MD_NTSTATUS_WIN_STATUS_TPM_MA_AUTHORITY = 0xC029005F, + MD_NTSTATUS_WIN_STATUS_TPM_PERMANENTEK = 0xC0290061, + MD_NTSTATUS_WIN_STATUS_TPM_BAD_SIGNATURE = 0xC0290062, + MD_NTSTATUS_WIN_STATUS_TPM_NOCONTEXTSPACE = 0xC0290063, + MD_NTSTATUS_WIN_STATUS_TPM_COMMAND_BLOCKED = 0xC0290400, + MD_NTSTATUS_WIN_STATUS_TPM_INVALID_HANDLE = 0xC0290401, + MD_NTSTATUS_WIN_STATUS_TPM_DUPLICATE_VHANDLE = 0xC0290402, + MD_NTSTATUS_WIN_STATUS_TPM_EMBEDDED_COMMAND_BLOCKED = 0xC0290403, + MD_NTSTATUS_WIN_STATUS_TPM_EMBEDDED_COMMAND_UNSUPPORTED = 0xC0290404, + MD_NTSTATUS_WIN_STATUS_TPM_RETRY = 0xC0290800, + MD_NTSTATUS_WIN_STATUS_TPM_NEEDS_SELFTEST = 0xC0290801, + MD_NTSTATUS_WIN_STATUS_TPM_DOING_SELFTEST = 0xC0290802, + MD_NTSTATUS_WIN_STATUS_TPM_DEFEND_LOCK_RUNNING = 0xC0290803, + MD_NTSTATUS_WIN_STATUS_TPM_COMMAND_CANCELED = 0xC0291001, + MD_NTSTATUS_WIN_STATUS_TPM_TOO_MANY_CONTEXTS = 0xC0291002, + MD_NTSTATUS_WIN_STATUS_TPM_NOT_FOUND = 0xC0291003, + MD_NTSTATUS_WIN_STATUS_TPM_ACCESS_DENIED = 0xC0291004, + MD_NTSTATUS_WIN_STATUS_TPM_INSUFFICIENT_BUFFER = 0xC0291005, + MD_NTSTATUS_WIN_STATUS_TPM_PPI_FUNCTION_UNSUPPORTED = 0xC0291006, + MD_NTSTATUS_WIN_STATUS_PCP_ERROR_MASK = 0xC0292000, + MD_NTSTATUS_WIN_STATUS_PCP_DEVICE_NOT_READY = 0xC0292001, + MD_NTSTATUS_WIN_STATUS_PCP_INVALID_HANDLE = 0xC0292002, + MD_NTSTATUS_WIN_STATUS_PCP_INVALID_PARAMETER = 0xC0292003, + MD_NTSTATUS_WIN_STATUS_PCP_FLAG_NOT_SUPPORTED = 0xC0292004, + MD_NTSTATUS_WIN_STATUS_PCP_NOT_SUPPORTED = 0xC0292005, + MD_NTSTATUS_WIN_STATUS_PCP_BUFFER_TOO_SMALL = 0xC0292006, + MD_NTSTATUS_WIN_STATUS_PCP_INTERNAL_ERROR = 0xC0292007, + MD_NTSTATUS_WIN_STATUS_PCP_AUTHENTICATION_FAILED = 0xC0292008, + MD_NTSTATUS_WIN_STATUS_PCP_AUTHENTICATION_IGNORED = 0xC0292009, + MD_NTSTATUS_WIN_STATUS_PCP_POLICY_NOT_FOUND = 0xC029200A, + MD_NTSTATUS_WIN_STATUS_PCP_PROFILE_NOT_FOUND = 0xC029200B, + MD_NTSTATUS_WIN_STATUS_PCP_VALIDATION_FAILED = 0xC029200C, + MD_NTSTATUS_WIN_STATUS_PCP_DEVICE_NOT_FOUND = 0xC029200D, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_HYPERCALL_CODE = 0xC0350002, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_HYPERCALL_INPUT = 0xC0350003, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_ALIGNMENT = 0xC0350004, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_PARAMETER = 0xC0350005, + MD_NTSTATUS_WIN_STATUS_HV_ACCESS_DENIED = 0xC0350006, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_PARTITION_STATE = 0xC0350007, + MD_NTSTATUS_WIN_STATUS_HV_OPERATION_DENIED = 0xC0350008, + MD_NTSTATUS_WIN_STATUS_HV_UNKNOWN_PROPERTY = 0xC0350009, + MD_NTSTATUS_WIN_STATUS_HV_PROPERTY_VALUE_OUT_OF_RANGE = 0xC035000A, + MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_MEMORY = 0xC035000B, + MD_NTSTATUS_WIN_STATUS_HV_PARTITION_TOO_DEEP = 0xC035000C, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_PARTITION_ID = 0xC035000D, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_VP_INDEX = 0xC035000E, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_PORT_ID = 0xC0350011, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_CONNECTION_ID = 0xC0350012, + MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_BUFFERS = 0xC0350013, + MD_NTSTATUS_WIN_STATUS_HV_NOT_ACKNOWLEDGED = 0xC0350014, + MD_NTSTATUS_WIN_STATUS_HV_ACKNOWLEDGED = 0xC0350016, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_SAVE_RESTORE_STATE = 0xC0350017, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_SYNIC_STATE = 0xC0350018, + MD_NTSTATUS_WIN_STATUS_HV_OBJECT_IN_USE = 0xC0350019, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_PROXIMITY_DOMAIN_INFO = 0xC035001A, + MD_NTSTATUS_WIN_STATUS_HV_NO_DATA = 0xC035001B, + MD_NTSTATUS_WIN_STATUS_HV_INACTIVE = 0xC035001C, + MD_NTSTATUS_WIN_STATUS_HV_NO_RESOURCES = 0xC035001D, + MD_NTSTATUS_WIN_STATUS_HV_FEATURE_UNAVAILABLE = 0xC035001E, + MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_BUFFER = 0xC0350033, + MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_DEVICE_DOMAINS = 0xC0350038, + MD_NTSTATUS_WIN_STATUS_HV_INVALID_LP_INDEX = 0xC0350041, + MD_NTSTATUS_WIN_STATUS_HV_NOT_PRESENT = 0xC0351000, + MD_NTSTATUS_WIN_STATUS_IPSEC_BAD_SPI = 0xC0360001, + MD_NTSTATUS_WIN_STATUS_IPSEC_SA_LIFETIME_EXPIRED = 0xC0360002, + MD_NTSTATUS_WIN_STATUS_IPSEC_WRONG_SA = 0xC0360003, + MD_NTSTATUS_WIN_STATUS_IPSEC_REPLAY_CHECK_FAILED = 0xC0360004, + MD_NTSTATUS_WIN_STATUS_IPSEC_INVALID_PACKET = 0xC0360005, + MD_NTSTATUS_WIN_STATUS_IPSEC_INTEGRITY_CHECK_FAILED = 0xC0360006, + MD_NTSTATUS_WIN_STATUS_IPSEC_CLEAR_TEXT_DROP = 0xC0360007, + MD_NTSTATUS_WIN_STATUS_IPSEC_AUTH_FIREWALL_DROP = 0xC0360008, + MD_NTSTATUS_WIN_STATUS_IPSEC_THROTTLE_DROP = 0xC0360009, + MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_BLOCK = 0xC0368000, + MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_RECEIVED_MULTICAST = 0xC0368001, + MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_INVALID_PACKET = 0xC0368002, + MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_STATE_LOOKUP_FAILED = 0xC0368003, + MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_MAX_ENTRIES = 0xC0368004, + MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_KEYMOD_NOT_ALLOWED = 0xC0368005, + MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES = 0xC0368006, + MD_NTSTATUS_WIN_STATUS_VID_DUPLICATE_HANDLER = 0xC0370001, + MD_NTSTATUS_WIN_STATUS_VID_TOO_MANY_HANDLERS = 0xC0370002, + MD_NTSTATUS_WIN_STATUS_VID_QUEUE_FULL = 0xC0370003, + MD_NTSTATUS_WIN_STATUS_VID_HANDLER_NOT_PRESENT = 0xC0370004, + MD_NTSTATUS_WIN_STATUS_VID_INVALID_OBJECT_NAME = 0xC0370005, + MD_NTSTATUS_WIN_STATUS_VID_PARTITION_NAME_TOO_LONG = 0xC0370006, + MD_NTSTATUS_WIN_STATUS_VID_MESSAGE_QUEUE_NAME_TOO_LONG = 0xC0370007, + MD_NTSTATUS_WIN_STATUS_VID_PARTITION_ALREADY_EXISTS = 0xC0370008, + MD_NTSTATUS_WIN_STATUS_VID_PARTITION_DOES_NOT_EXIST = 0xC0370009, + MD_NTSTATUS_WIN_STATUS_VID_PARTITION_NAME_NOT_FOUND = 0xC037000A, + MD_NTSTATUS_WIN_STATUS_VID_MESSAGE_QUEUE_ALREADY_EXISTS = 0xC037000B, + MD_NTSTATUS_WIN_STATUS_VID_EXCEEDED_MBP_ENTRY_MAP_LIMIT = 0xC037000C, + MD_NTSTATUS_WIN_STATUS_VID_MB_STILL_REFERENCED = 0xC037000D, + MD_NTSTATUS_WIN_STATUS_VID_CHILD_GPA_PAGE_SET_CORRUPTED = 0xC037000E, + MD_NTSTATUS_WIN_STATUS_VID_INVALID_NUMA_SETTINGS = 0xC037000F, + MD_NTSTATUS_WIN_STATUS_VID_INVALID_NUMA_NODE_INDEX = 0xC0370010, + MD_NTSTATUS_WIN_STATUS_VID_NOTIFICATION_QUEUE_ALREADY_ASSOCIATED = 0xC0370011, + MD_NTSTATUS_WIN_STATUS_VID_INVALID_MEMORY_BLOCK_HANDLE = 0xC0370012, + MD_NTSTATUS_WIN_STATUS_VID_PAGE_RANGE_OVERFLOW = 0xC0370013, + MD_NTSTATUS_WIN_STATUS_VID_INVALID_MESSAGE_QUEUE_HANDLE = 0xC0370014, + MD_NTSTATUS_WIN_STATUS_VID_INVALID_GPA_RANGE_HANDLE = 0xC0370015, + MD_NTSTATUS_WIN_STATUS_VID_NO_MEMORY_BLOCK_NOTIFICATION_QUEUE = 0xC0370016, + MD_NTSTATUS_WIN_STATUS_VID_MEMORY_BLOCK_LOCK_COUNT_EXCEEDED = 0xC0370017, + MD_NTSTATUS_WIN_STATUS_VID_INVALID_PPM_HANDLE = 0xC0370018, + MD_NTSTATUS_WIN_STATUS_VID_MBPS_ARE_LOCKED = 0xC0370019, + MD_NTSTATUS_WIN_STATUS_VID_MESSAGE_QUEUE_CLOSED = 0xC037001A, + MD_NTSTATUS_WIN_STATUS_VID_VIRTUAL_PROCESSOR_LIMIT_EXCEEDED = 0xC037001B, + MD_NTSTATUS_WIN_STATUS_VID_STOP_PENDING = 0xC037001C, + MD_NTSTATUS_WIN_STATUS_VID_INVALID_PROCESSOR_STATE = 0xC037001D, + MD_NTSTATUS_WIN_STATUS_VID_EXCEEDED_KM_CONTEXT_COUNT_LIMIT = 0xC037001E, + MD_NTSTATUS_WIN_STATUS_VID_KM_INTERFACE_ALREADY_INITIALIZED = 0xC037001F, + MD_NTSTATUS_WIN_STATUS_VID_MB_PROPERTY_ALREADY_SET_RESET = 0xC0370020, + MD_NTSTATUS_WIN_STATUS_VID_MMIO_RANGE_DESTROYED = 0xC0370021, + MD_NTSTATUS_WIN_STATUS_VID_INVALID_CHILD_GPA_PAGE_SET = 0xC0370022, + MD_NTSTATUS_WIN_STATUS_VID_RESERVE_PAGE_SET_IS_BEING_USED = 0xC0370023, + MD_NTSTATUS_WIN_STATUS_VID_RESERVE_PAGE_SET_TOO_SMALL = 0xC0370024, + MD_NTSTATUS_WIN_STATUS_VID_MBP_ALREADY_LOCKED_USING_RESERVED_PAGE = 0xC0370025, + MD_NTSTATUS_WIN_STATUS_VID_MBP_COUNT_EXCEEDED_LIMIT = 0xC0370026, + MD_NTSTATUS_WIN_STATUS_VID_SAVED_STATE_CORRUPT = 0xC0370027, + MD_NTSTATUS_WIN_STATUS_VID_SAVED_STATE_UNRECOGNIZED_ITEM = 0xC0370028, + MD_NTSTATUS_WIN_STATUS_VID_SAVED_STATE_INCOMPATIBLE = 0xC0370029, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DATABASE_FULL = 0xC0380001, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_CONFIGURATION_CORRUPTED = 0xC0380002, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_CONFIGURATION_NOT_IN_SYNC = 0xC0380003, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_CONFIG_UPDATE_FAILED = 0xC0380004, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_CONTAINS_NON_SIMPLE_VOLUME = 0xC0380005, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_DUPLICATE = 0xC0380006, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_DYNAMIC = 0xC0380007, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_ID_INVALID = 0xC0380008, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_INVALID = 0xC0380009, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAST_VOTER = 0xC038000A, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_INVALID = 0xC038000B, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_NON_BASIC_BETWEEN_BASIC_PARTITIONS = 0xC038000C, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_NOT_CYLINDER_ALIGNED = 0xC038000D, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_PARTITIONS_TOO_SMALL = 0xC038000E, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_PRIMARY_BETWEEN_LOGICAL_PARTITIONS = 0xC038000F, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_TOO_MANY_PARTITIONS = 0xC0380010, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_MISSING = 0xC0380011, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_NOT_EMPTY = 0xC0380012, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_NOT_ENOUGH_SPACE = 0xC0380013, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_REVECTORING_FAILED = 0xC0380014, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_SECTOR_SIZE_INVALID = 0xC0380015, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_SET_NOT_CONTAINED = 0xC0380016, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_USED_BY_MULTIPLE_MEMBERS = 0xC0380017, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_USED_BY_MULTIPLE_PLEXES = 0xC0380018, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DYNAMIC_DISK_NOT_SUPPORTED = 0xC0380019, + MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_ALREADY_USED = 0xC038001A, + MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_NOT_CONTIGUOUS = 0xC038001B, + MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_NOT_IN_PUBLIC_REGION = 0xC038001C, + MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_NOT_SECTOR_ALIGNED = 0xC038001D, + MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_OVERLAPS_EBR_PARTITION = 0xC038001E, + MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_VOLUME_LENGTHS_DO_NOT_MATCH = 0xC038001F, + MD_NTSTATUS_WIN_STATUS_VOLMGR_FAULT_TOLERANT_NOT_SUPPORTED = 0xC0380020, + MD_NTSTATUS_WIN_STATUS_VOLMGR_INTERLEAVE_LENGTH_INVALID = 0xC0380021, + MD_NTSTATUS_WIN_STATUS_VOLMGR_MAXIMUM_REGISTERED_USERS = 0xC0380022, + MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_IN_SYNC = 0xC0380023, + MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_INDEX_DUPLICATE = 0xC0380024, + MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_INDEX_INVALID = 0xC0380025, + MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_MISSING = 0xC0380026, + MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_NOT_DETACHED = 0xC0380027, + MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_REGENERATING = 0xC0380028, + MD_NTSTATUS_WIN_STATUS_VOLMGR_ALL_DISKS_FAILED = 0xC0380029, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NO_REGISTERED_USERS = 0xC038002A, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NO_SUCH_USER = 0xC038002B, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NOTIFICATION_RESET = 0xC038002C, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_MEMBERS_INVALID = 0xC038002D, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_PLEXES_INVALID = 0xC038002E, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_DUPLICATE = 0xC038002F, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_ID_INVALID = 0xC0380030, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_INVALID = 0xC0380031, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_NAME_INVALID = 0xC0380032, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_OFFLINE = 0xC0380033, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_HAS_QUORUM = 0xC0380034, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_WITHOUT_QUORUM = 0xC0380035, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PARTITION_STYLE_INVALID = 0xC0380036, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PARTITION_UPDATE_FAILED = 0xC0380037, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_IN_SYNC = 0xC0380038, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_INDEX_DUPLICATE = 0xC0380039, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_INDEX_INVALID = 0xC038003A, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_LAST_ACTIVE = 0xC038003B, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_MISSING = 0xC038003C, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_REGENERATING = 0xC038003D, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_TYPE_INVALID = 0xC038003E, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_NOT_RAID5 = 0xC038003F, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_NOT_SIMPLE = 0xC0380040, + MD_NTSTATUS_WIN_STATUS_VOLMGR_STRUCTURE_SIZE_INVALID = 0xC0380041, + MD_NTSTATUS_WIN_STATUS_VOLMGR_TOO_MANY_NOTIFICATION_REQUESTS = 0xC0380042, + MD_NTSTATUS_WIN_STATUS_VOLMGR_TRANSACTION_IN_PROGRESS = 0xC0380043, + MD_NTSTATUS_WIN_STATUS_VOLMGR_UNEXPECTED_DISK_LAYOUT_CHANGE = 0xC0380044, + MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_CONTAINS_MISSING_DISK = 0xC0380045, + MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_ID_INVALID = 0xC0380046, + MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_LENGTH_INVALID = 0xC0380047, + MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_LENGTH_NOT_SECTOR_SIZE_MULTIPLE = 0xC0380048, + MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_NOT_MIRRORED = 0xC0380049, + MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_NOT_RETAINED = 0xC038004A, + MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_OFFLINE = 0xC038004B, + MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_RETAINED = 0xC038004C, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_EXTENTS_INVALID = 0xC038004D, + MD_NTSTATUS_WIN_STATUS_VOLMGR_DIFFERENT_SECTOR_SIZE = 0xC038004E, + MD_NTSTATUS_WIN_STATUS_VOLMGR_BAD_BOOT_DISK = 0xC038004F, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_CONFIG_OFFLINE = 0xC0380050, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_CONFIG_ONLINE = 0xC0380051, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NOT_PRIMARY_PACK = 0xC0380052, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_LOG_UPDATE_FAILED = 0xC0380053, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_DISKS_IN_PLEX_INVALID = 0xC0380054, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_DISKS_IN_MEMBER_INVALID = 0xC0380055, + MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_MIRRORED = 0xC0380056, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_NOT_SIMPLE_SPANNED = 0xC0380057, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NO_VALID_LOG_COPIES = 0xC0380058, + MD_NTSTATUS_WIN_STATUS_VOLMGR_PRIMARY_PACK_PRESENT = 0xC0380059, + MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_DISKS_INVALID = 0xC038005A, + MD_NTSTATUS_WIN_STATUS_VOLMGR_MIRROR_NOT_SUPPORTED = 0xC038005B, + MD_NTSTATUS_WIN_STATUS_VOLMGR_RAID5_NOT_SUPPORTED = 0xC038005C, + MD_NTSTATUS_WIN_STATUS_BCD_TOO_MANY_ELEMENTS = 0xC0390002, + MD_NTSTATUS_WIN_STATUS_VHD_DRIVE_FOOTER_MISSING = 0xC03A0001, + MD_NTSTATUS_WIN_STATUS_VHD_DRIVE_FOOTER_CHECKSUM_MISMATCH = 0xC03A0002, + MD_NTSTATUS_WIN_STATUS_VHD_DRIVE_FOOTER_CORRUPT = 0xC03A0003, + MD_NTSTATUS_WIN_STATUS_VHD_FORMAT_UNKNOWN = 0xC03A0004, + MD_NTSTATUS_WIN_STATUS_VHD_FORMAT_UNSUPPORTED_VERSION = 0xC03A0005, + MD_NTSTATUS_WIN_STATUS_VHD_SPARSE_HEADER_CHECKSUM_MISMATCH = 0xC03A0006, + MD_NTSTATUS_WIN_STATUS_VHD_SPARSE_HEADER_UNSUPPORTED_VERSION = 0xC03A0007, + MD_NTSTATUS_WIN_STATUS_VHD_SPARSE_HEADER_CORRUPT = 0xC03A0008, + MD_NTSTATUS_WIN_STATUS_VHD_BLOCK_ALLOCATION_FAILURE = 0xC03A0009, + MD_NTSTATUS_WIN_STATUS_VHD_BLOCK_ALLOCATION_TABLE_CORRUPT = 0xC03A000A, + MD_NTSTATUS_WIN_STATUS_VHD_INVALID_BLOCK_SIZE = 0xC03A000B, + MD_NTSTATUS_WIN_STATUS_VHD_BITMAP_MISMATCH = 0xC03A000C, + MD_NTSTATUS_WIN_STATUS_VHD_PARENT_VHD_NOT_FOUND = 0xC03A000D, + MD_NTSTATUS_WIN_STATUS_VHD_CHILD_PARENT_ID_MISMATCH = 0xC03A000E, + MD_NTSTATUS_WIN_STATUS_VHD_CHILD_PARENT_TIMESTAMP_MISMATCH = 0xC03A000F, + MD_NTSTATUS_WIN_STATUS_VHD_METADATA_READ_FAILURE = 0xC03A0010, + MD_NTSTATUS_WIN_STATUS_VHD_METADATA_WRITE_FAILURE = 0xC03A0011, + MD_NTSTATUS_WIN_STATUS_VHD_INVALID_SIZE = 0xC03A0012, + MD_NTSTATUS_WIN_STATUS_VHD_INVALID_FILE_SIZE = 0xC03A0013, + MD_NTSTATUS_WIN_STATUS_VIRTDISK_PROVIDER_NOT_FOUND = 0xC03A0014, + MD_NTSTATUS_WIN_STATUS_VIRTDISK_NOT_VIRTUAL_DISK = 0xC03A0015, + MD_NTSTATUS_WIN_STATUS_VHD_PARENT_VHD_ACCESS_DENIED = 0xC03A0016, + MD_NTSTATUS_WIN_STATUS_VHD_CHILD_PARENT_SIZE_MISMATCH = 0xC03A0017, + MD_NTSTATUS_WIN_STATUS_VHD_DIFFERENCING_CHAIN_CYCLE_DETECTED = 0xC03A0018, + MD_NTSTATUS_WIN_STATUS_VHD_DIFFERENCING_CHAIN_ERROR_IN_PARENT = 0xC03A0019, + MD_NTSTATUS_WIN_STATUS_VIRTUAL_DISK_LIMITATION = 0xC03A001A, + MD_NTSTATUS_WIN_STATUS_VHD_INVALID_TYPE = 0xC03A001B, + MD_NTSTATUS_WIN_STATUS_VHD_INVALID_STATE = 0xC03A001C, + MD_NTSTATUS_WIN_STATUS_VIRTDISK_UNSUPPORTED_DISK_SECTOR_SIZE = 0xC03A001D, + MD_NTSTATUS_WIN_STATUS_VIRTDISK_DISK_ALREADY_OWNED = 0xC03A001E, + MD_NTSTATUS_WIN_STATUS_VIRTDISK_DISK_ONLINE_AND_WRITABLE = 0xC03A001F, + MD_NTSTATUS_WIN_STATUS_CTLOG_TRACKING_NOT_INITIALIZED = 0xC03A0020, + MD_NTSTATUS_WIN_STATUS_CTLOG_LOGFILE_SIZE_EXCEEDED_MAXSIZE = 0xC03A0021, + MD_NTSTATUS_WIN_STATUS_CTLOG_VHD_CHANGED_OFFLINE = 0xC03A0022, + MD_NTSTATUS_WIN_STATUS_CTLOG_INVALID_TRACKING_STATE = 0xC03A0023, + MD_NTSTATUS_WIN_STATUS_CTLOG_INCONSISTENT_TRACKING_FILE = 0xC03A0024, + MD_NTSTATUS_WIN_STATUS_VHD_METADATA_FULL = 0xC03A0028, + MD_NTSTATUS_WIN_STATUS_RKF_KEY_NOT_FOUND = 0xC0400001, + MD_NTSTATUS_WIN_STATUS_RKF_DUPLICATE_KEY = 0xC0400002, + MD_NTSTATUS_WIN_STATUS_RKF_BLOB_FULL = 0xC0400003, + MD_NTSTATUS_WIN_STATUS_RKF_STORE_FULL = 0xC0400004, + MD_NTSTATUS_WIN_STATUS_RKF_FILE_BLOCKED = 0xC0400005, + MD_NTSTATUS_WIN_STATUS_RKF_ACTIVE_KEY = 0xC0400006, + MD_NTSTATUS_WIN_STATUS_RDBSS_RESTART_OPERATION = 0xC0410001, + MD_NTSTATUS_WIN_STATUS_RDBSS_CONTINUE_OPERATION = 0xC0410002, + MD_NTSTATUS_WIN_STATUS_RDBSS_POST_OPERATION = 0xC0410003, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_HANDLE = 0xC0420001, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_READ_NOT_PERMITTED = 0xC0420002, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_WRITE_NOT_PERMITTED = 0xC0420003, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_PDU = 0xC0420004, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_AUTHENTICATION = 0xC0420005, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_REQUEST_NOT_SUPPORTED = 0xC0420006, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_OFFSET = 0xC0420007, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_AUTHORIZATION = 0xC0420008, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_PREPARE_QUEUE_FULL = 0xC0420009, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_ATTRIBUTE_NOT_FOUND = 0xC042000A, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_ATTRIBUTE_NOT_LONG = 0xC042000B, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_ENCRYPTION_KEY_SIZE = 0xC042000C, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_ATTRIBUTE_VALUE_LENGTH = 0xC042000D, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_UNLIKELY = 0xC042000E, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_ENCRYPTION = 0xC042000F, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_UNSUPPORTED_GROUP_TYPE = 0xC0420010, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_RESOURCES = 0xC0420011, + MD_NTSTATUS_WIN_STATUS_BTH_ATT_UNKNOWN_ERROR = 0xC0421000, + MD_NTSTATUS_WIN_STATUS_SECUREBOOT_ROLLBACK_DETECTED = 0xC0430001, + MD_NTSTATUS_WIN_STATUS_SECUREBOOT_POLICY_VIOLATION = 0xC0430002, + MD_NTSTATUS_WIN_STATUS_SECUREBOOT_INVALID_POLICY = 0xC0430003, + MD_NTSTATUS_WIN_STATUS_SECUREBOOT_POLICY_PUBLISHER_NOT_FOUND = 0xC0430004, + MD_NTSTATUS_WIN_STATUS_SECUREBOOT_POLICY_NOT_SIGNED = 0xC0430005, + MD_NTSTATUS_WIN_STATUS_SECUREBOOT_FILE_REPLACED = 0xC0430007, + MD_NTSTATUS_WIN_STATUS_AUDIO_ENGINE_NODE_NOT_FOUND = 0xC0440001, + MD_NTSTATUS_WIN_STATUS_HDAUDIO_EMPTY_CONNECTION_LIST = 0xC0440002, + MD_NTSTATUS_WIN_STATUS_HDAUDIO_CONNECTION_LIST_NOT_SUPPORTED = 0xC0440003, + MD_NTSTATUS_WIN_STATUS_HDAUDIO_NO_LOGICAL_DEVICES_CREATED = 0xC0440004, + MD_NTSTATUS_WIN_STATUS_HDAUDIO_NULL_LINKED_LIST_ENTRY = 0xC0440005, + MD_NTSTATUS_WIN_STATUS_VOLSNAP_BOOTFILE_NOT_VALID = 0xC0500003, + MD_NTSTATUS_WIN_STATUS_IO_PREEMPTED = 0xC0510001, + MD_NTSTATUS_WIN_STATUS_SVHDX_ERROR_STORED = 0xC05C0000, + MD_NTSTATUS_WIN_STATUS_SVHDX_ERROR_NOT_AVAILABLE = 0xC05CFF00, + MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_AVAILABLE = 0xC05CFF01, + MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_CAPACITY_DATA_CHANGED = 0xC05CFF02, + MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_RESERVATIONS_PREEMPTED = 0xC05CFF03, + MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_RESERVATIONS_RELEASED = 0xC05CFF04, + MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_REGISTRATIONS_PREEMPTED = 0xC05CFF05, + MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_OPERATING_DEFINITION_CHANGED = 0xC05CFF06, + MD_NTSTATUS_WIN_STATUS_SVHDX_RESERVATION_CONFLICT = 0xC05CFF07, + MD_NTSTATUS_WIN_STATUS_SVHDX_WRONG_FILE_TYPE = 0xC05CFF08, + MD_NTSTATUS_WIN_STATUS_SVHDX_VERSION_MISMATCH = 0xC05CFF09, + MD_NTSTATUS_WIN_STATUS_VHD_SHARED = 0xC05CFF0A, + MD_NTSTATUS_WIN_STATUS_SPACES_RESILIENCY_TYPE_INVALID = 0xC0E70003, + MD_NTSTATUS_WIN_STATUS_SPACES_DRIVE_SECTOR_SIZE_INVALID = 0xC0E70004, + MD_NTSTATUS_WIN_STATUS_SPACES_INTERLEAVE_LENGTH_INVALID = 0xC0E70009, + MD_NTSTATUS_WIN_STATUS_SPACES_NUMBER_OF_COLUMNS_INVALID = 0xC0E7000A, + MD_NTSTATUS_WIN_STATUS_SPACES_NOT_ENOUGH_DRIVES = 0xC0E7000B +} MDNTStatusCodeWin; + +// These constants are defined in the MSDN documentation of +// the EXCEPTION_RECORD structure. +typedef enum { + MD_ACCESS_VIOLATION_WIN_READ = 0, + MD_ACCESS_VIOLATION_WIN_WRITE = 1, + MD_ACCESS_VIOLATION_WIN_EXEC = 8 +} MDAccessViolationTypeWin; + +// These constants are defined in the MSDN documentation of +// the EXCEPTION_RECORD structure. +typedef enum { + MD_IN_PAGE_ERROR_WIN_READ = 0, + MD_IN_PAGE_ERROR_WIN_WRITE = 1, + MD_IN_PAGE_ERROR_WIN_EXEC = 8 +} MDInPageErrorTypeWin; + +// These constants are defined in winnt.h and are used with the +// STATUS_STACK_BUFFER_OVERRUN exception as exception subcodes. +typedef enum { + MD_FAST_FAIL_LEGACY_GS_VIOLATION = 0, + MD_FAST_FAIL_VTGUARD_CHECK_FAILURE = 1, + MD_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE = 2, + MD_FAST_FAIL_CORRUPT_LIST_ENTRY = 3, + MD_FAST_FAIL_INCORRECT_STACK = 4, + MD_FAST_FAIL_INVALID_ARG = 5, + MD_FAST_FAIL_GS_COOKIE_INIT = 6, + MD_FAST_FAIL_FATAL_APP_EXIT = 7, + MD_FAST_FAIL_RANGE_CHECK_FAILURE = 8, + MD_FAST_FAIL_UNSAFE_REGISTRY_ACCESS = 9, + MD_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE = 10, + MD_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE = 11, + MD_FAST_FAIL_INVALID_FIBER_SWITCH = 12, + MD_FAST_FAIL_INVALID_SET_OF_CONTEXT = 13, + MD_FAST_FAIL_INVALID_REFERENCE_COUNT = 14, + MD_FAST_FAIL_INVALID_JUMP_BUFFER = 18, + MD_FAST_FAIL_MRDATA_MODIFIED = 19, + MD_FAST_FAIL_CERTIFICATION_FAILURE = 20, + MD_FAST_FAIL_INVALID_EXCEPTION_CHAIN = 21, + MD_FAST_FAIL_CRYPTO_LIBRARY = 22, + MD_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT = 23, + MD_FAST_FAIL_INVALID_IMAGE_BASE = 24, + MD_FAST_FAIL_DLOAD_PROTECTION_FAILURE = 25, + MD_FAST_FAIL_UNSAFE_EXTENSION_CALL = 26, + MD_FAST_FAIL_DEPRECATED_SERVICE_INVOKED = 27, + MD_FAST_FAIL_INVALID_BUFFER_ACCESS = 28, + MD_FAST_FAIL_INVALID_BALANCED_TREE = 29, + MD_FAST_FAIL_INVALID_NEXT_THREAD = 30, + MD_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED = 31, + MD_FAST_FAIL_APCS_DISABLED = 32, + MD_FAST_FAIL_INVALID_IDLE_STATE = 33, + MD_FAST_FAIL_MRDATA_PROTECTION_FAILURE = 34, + MD_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION = 35, + MD_FAST_FAIL_INVALID_LOCK_STATE = 36, + MD_FAST_FAIL_GUARD_JUMPTABLE = 37, + MD_FAST_FAIL_INVALID_LONGJUMP_TARGET = 38, + MD_FAST_FAIL_INVALID_DISPATCH_CONTEXT = 39, + MD_FAST_FAIL_INVALID_THREAD = 40, + MD_FAST_FAIL_INVALID_SYSCALL_NUMBER = 41, + MD_FAST_FAIL_INVALID_FILE_OPERATION = 42, + MD_FAST_FAIL_LPAC_ACCESS_DENIED = 43, + MD_FAST_FAIL_GUARD_SS_FAILURE = 44, + MD_FAST_FAIL_LOADER_CONTINUITY_FAILURE = 45, + MD_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE = 46, + MD_FAST_FAIL_INVALID_CONTROL_STACK = 47, + MD_FAST_FAIL_SET_CONTEXT_DENIED = 48, + MD_FAST_FAIL_INVALID_IAT = 49, + MD_FAST_FAIL_HEAP_METADATA_CORRUPTION = 50, + MD_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION = 51, + MD_FAST_FAIL_LOW_LABEL_ACCESS_DENIED = 52, + MD_FAST_FAIL_ENCLAVE_CALL_FAILURE = 53, + MD_FAST_FAIL_UNHANDLED_LSS_EXCEPTON = 54, + MD_FAST_FAIL_ADMINLESS_ACCESS_DENIED = 55, + MD_FAST_FAIL_UNEXPECTED_CALL = 56, + MD_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS = 57, + MD_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR = 58, + MD_FAST_FAIL_FLAGS_CORRUPTION = 59, + MD_FAST_FAIL_VEH_CORRUPTION = 60, + MD_FAST_FAIL_ETW_CORRUPTION = 61, + MD_FAST_FAIL_RIO_ABORT = 62, + MD_FAST_FAIL_INVALID_PFN = 63, + MD_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG = 64, + MD_FAST_FAIL_CAST_GUARD = 65, + MD_FAST_FAIL_HOST_VISIBILITY_CHANGE = 66, + MD_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST = 67, + MD_FAST_FAIL_PATCH_CALLBACK_FAILED = 68, + MD_FAST_FAIL_NTDLL_PATCH_FAILED = 69, + MD_FAST_FAIL_INVALID_FLS_DATA = 70 +} MDFastFailSubcodeTypeWin; + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ */ diff --git a/src/google_breakpad/common/minidump_format.h b/src/google_breakpad/common/minidump_format.h new file mode 100644 index 0000000..959d15b --- /dev/null +++ b/src/google_breakpad/common/minidump_format.h @@ -0,0 +1,1143 @@ +/* Copyright 2006 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* minidump_format.h: A cross-platform reimplementation of minidump-related + * portions of DbgHelp.h from the Windows Platform SDK. + * + * (This is C99 source, please don't corrupt it with C++.) + * + * Structures that are defined by Microsoft to contain a zero-length array + * are instead defined here to contain an array with one element, as + * zero-length arrays are forbidden by standard C and C++. In these cases, + * *_minsize constants are provided to be used in place of sizeof. For a + * cleaner interface to these sizes when using C++, see minidump_size.h. + * + * These structures are also sufficient to populate minidump files. + * + * These definitions may be extended to support handling minidump files + * for other CPUs and other operating systems. + * + * Because precise data type sizes are crucial for this implementation to + * function properly and portably in terms of interoperability with minidumps + * produced by DbgHelp on Windows, a set of primitive types with known sizes + * are used as the basis of each structure defined by this file. DbgHelp + * on Windows is assumed to be the reference implementation; this file + * seeks to provide a cross-platform compatible implementation. To avoid + * collisions with the types and values defined and used by DbgHelp in the + * event that this implementation is used on Windows, each type and value + * defined here is given a new name, beginning with "MD". Names of the + * equivalent types and values in the Windows Platform SDK are given in + * comments. + * + * Author: Mark Mentovai */ + + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + + +#if defined(_MSC_VER) +/* Disable "zero-sized array in struct/union" warnings when compiling in + * MSVC. DbgHelp.h does this too. */ +#pragma warning(push) +#pragma warning(disable:4200) +#endif /* _MSC_VER */ + + +/* + * guiddef.h + */ + +typedef struct { + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; +} MDGUID; /* GUID */ + + +/* + * WinNT.h + */ + +/* Non-x86 CPU identifiers found in the high 24 bits of + * (MDRawContext*).context_flags. These aren't used by Breakpad, but are + * defined here for reference, to avoid assigning values that conflict + * (although some values already conflict). */ +#define MD_CONTEXT_IA64 0x00080000 /* CONTEXT_IA64 */ +/* Additional values from winnt.h in the Windows CE 5.0 SDK: */ +#define MD_CONTEXT_SHX 0x000000c0 /* CONTEXT_SH4 (Super-H, includes SH3) */ +#define MD_CONTEXT_ALPHA 0x00020000 /* CONTEXT_ALPHA */ + +/* As of Windows 7 SP1, the number of flag bits has increased to + * include 0x40 (CONTEXT_XSTATE): + * http://msdn.microsoft.com/en-us/library/hh134238%28v=vs.85%29.aspx */ +#define MD_CONTEXT_CPU_MASK 0xffffff00 + + +/* This is a base type for MDRawContextX86 and MDRawContextPPC. This + * structure should never be allocated directly. The actual structure type + * can be determined by examining the context_flags field. */ +typedef struct { + uint32_t context_flags; +} MDRawContextBase; + +#include "minidump_cpu_amd64.h" +#include "minidump_cpu_arm.h" +#include "minidump_cpu_arm64.h" +#include "minidump_cpu_mips.h" +#include "minidump_cpu_ppc.h" +#include "minidump_cpu_ppc64.h" +#include "minidump_cpu_riscv.h" +#include "minidump_cpu_sparc.h" +#include "minidump_cpu_x86.h" + +/* + * WinVer.h + */ + + +typedef struct { + uint32_t signature; + uint32_t struct_version; + uint32_t file_version_hi; + uint32_t file_version_lo; + uint32_t product_version_hi; + uint32_t product_version_lo; + uint32_t file_flags_mask; /* Identifies valid bits in fileFlags */ + uint32_t file_flags; + uint32_t file_os; + uint32_t file_type; + uint32_t file_subtype; + uint32_t file_date_hi; + uint32_t file_date_lo; +} MDVSFixedFileInfo; /* VS_FIXEDFILEINFO */ + +/* For (MDVSFixedFileInfo).signature */ +#define MD_VSFIXEDFILEINFO_SIGNATURE 0xfeef04bd + /* VS_FFI_SIGNATURE */ + +/* For (MDVSFixedFileInfo).version */ +#define MD_VSFIXEDFILEINFO_VERSION 0x00010000 + /* VS_FFI_STRUCVERSION */ + +/* For (MDVSFixedFileInfo).file_flags_mask and + * (MDVSFixedFileInfo).file_flags */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG 0x00000001 + /* VS_FF_DEBUG */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRERELEASE 0x00000002 + /* VS_FF_PRERELEASE */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PATCHED 0x00000004 + /* VS_FF_PATCHED */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRIVATEBUILD 0x00000008 + /* VS_FF_PRIVATEBUILD */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_INFOINFERRED 0x00000010 + /* VS_FF_INFOINFERRED */ +#define MD_VSFIXEDFILEINFO_FILE_FLAGS_SPECIALBUILD 0x00000020 + /* VS_FF_SPECIALBUILD */ + +/* For (MDVSFixedFileInfo).file_os: high 16 bits */ +#define MD_VSFIXEDFILEINFO_FILE_OS_UNKNOWN 0 /* VOS_UNKNOWN */ +#define MD_VSFIXEDFILEINFO_FILE_OS_DOS (1 << 16) /* VOS_DOS */ +#define MD_VSFIXEDFILEINFO_FILE_OS_OS216 (2 << 16) /* VOS_OS216 */ +#define MD_VSFIXEDFILEINFO_FILE_OS_OS232 (3 << 16) /* VOS_OS232 */ +#define MD_VSFIXEDFILEINFO_FILE_OS_NT (4 << 16) /* VOS_NT */ +#define MD_VSFIXEDFILEINFO_FILE_OS_WINCE (5 << 16) /* VOS_WINCE */ +/* Low 16 bits */ +#define MD_VSFIXEDFILEINFO_FILE_OS__BASE 0 /* VOS__BASE */ +#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS16 1 /* VOS__WINDOWS16 */ +#define MD_VSFIXEDFILEINFO_FILE_OS__PM16 2 /* VOS__PM16 */ +#define MD_VSFIXEDFILEINFO_FILE_OS__PM32 3 /* VOS__PM32 */ +#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32 4 /* VOS__WINDOWS32 */ + +/* For (MDVSFixedFileInfo).file_type */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_UNKNOWN 0 /* VFT_UNKNOWN */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_APP 1 /* VFT_APP */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_DLL 2 /* VFT_DLL */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_DRV 3 /* VFT_DLL */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_FONT 4 /* VFT_FONT */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_VXD 5 /* VFT_VXD */ +#define MD_VSFIXEDFILEINFO_FILE_TYPE_STATIC_LIB 7 /* VFT_STATIC_LIB */ + +/* For (MDVSFixedFileInfo).file_subtype */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN 0 + /* VFT2_UNKNOWN */ +/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_DRV */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_PRINTER 1 + /* VFT2_DRV_PRINTER */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_KEYBOARD 2 + /* VFT2_DRV_KEYBOARD */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_LANGUAGE 3 + /* VFT2_DRV_LANGUAGE */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_DISPLAY 4 + /* VFT2_DRV_DISPLAY */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_MOUSE 5 + /* VFT2_DRV_MOUSE */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_NETWORK 6 + /* VFT2_DRV_NETWORK */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SYSTEM 7 + /* VFT2_DRV_SYSTEM */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INSTALLABLE 8 + /* VFT2_DRV_INSTALLABLE */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SOUND 9 + /* VFT2_DRV_SOUND */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_COMM 10 + /* VFT2_DRV_COMM */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INPUTMETHOD 11 + /* VFT2_DRV_INPUTMETHOD */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_VERSIONED_PRINTER 12 + /* VFT2_DRV_VERSIONED_PRINTER */ +/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_FONT */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_RASTER 1 + /* VFT2_FONT_RASTER */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_VECTOR 2 + /* VFT2_FONT_VECTOR */ +#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_TRUETYPE 3 + /* VFT2_FONT_TRUETYPE */ + + +/* + * DbgHelp.h + */ + + +/* An MDRVA is an offset into the minidump file. The beginning of the + * MDRawHeader is at offset 0. */ +typedef uint32_t MDRVA; /* RVA */ + +typedef struct { + uint32_t data_size; + MDRVA rva; +} MDLocationDescriptor; /* MINIDUMP_LOCATION_DESCRIPTOR */ + +/* An MDRVA64 is an 64-bit offset into the minidump file. The beginning of the + * MDRawHeader is at offset 0. */ +typedef uint64_t MDRVA64; /* RVA64 */ + +typedef struct { + uint64_t data_size; + MDRVA64 rva; +} MDLocationDescriptor64; /* MINIDUMP_LOCATION_DESCRIPTOR64 */ + + +typedef struct { + /* The base address of the memory range on the host that produced the + * minidump. */ + uint64_t start_of_memory_range; + + MDLocationDescriptor memory; +} MDMemoryDescriptor; /* MINIDUMP_MEMORY_DESCRIPTOR */ + + +typedef struct { + uint32_t signature; + uint32_t version; + uint32_t stream_count; + MDRVA stream_directory_rva; /* A |stream_count|-sized array of + * MDRawDirectory structures. */ + uint32_t checksum; /* Can be 0. In fact, that's all that's + * been found in minidump files. */ + uint32_t time_date_stamp; /* time_t */ + uint64_t flags; +} MDRawHeader; /* MINIDUMP_HEADER */ + +/* For (MDRawHeader).signature and (MDRawHeader).version. Note that only the + * low 16 bits of (MDRawHeader).version are MD_HEADER_VERSION. Per the + * documentation, the high 16 bits are implementation-specific. */ +#define MD_HEADER_SIGNATURE 0x504d444d /* 'PMDM' */ + /* MINIDUMP_SIGNATURE */ +#define MD_HEADER_VERSION 0x0000a793 /* 42899 */ + /* MINIDUMP_VERSION */ + +/* For (MDRawHeader).flags: */ +typedef enum { + /* MD_NORMAL is the standard type of minidump. It includes full + * streams for the thread list, module list, exception, system info, + * and miscellaneous info. A memory list stream is also present, + * pointing to the same stack memory contained in the thread list, + * as well as a 256-byte region around the instruction address that + * was executing when the exception occurred. Stack memory is from + * 4 bytes below a thread's stack pointer up to the top of the + * memory region encompassing the stack. */ + MD_NORMAL = 0x00000000, + MD_WITH_DATA_SEGS = 0x00000001, + MD_WITH_FULL_MEMORY = 0x00000002, + MD_WITH_HANDLE_DATA = 0x00000004, + MD_FILTER_MEMORY = 0x00000008, + MD_SCAN_MEMORY = 0x00000010, + MD_WITH_UNLOADED_MODULES = 0x00000020, + MD_WITH_INDIRECTLY_REFERENCED_MEMORY = 0x00000040, + MD_FILTER_MODULE_PATHS = 0x00000080, + MD_WITH_PROCESS_THREAD_DATA = 0x00000100, + MD_WITH_PRIVATE_READ_WRITE_MEMORY = 0x00000200, + MD_WITHOUT_OPTIONAL_DATA = 0x00000400, + MD_WITH_FULL_MEMORY_INFO = 0x00000800, + MD_WITH_THREAD_INFO = 0x00001000, + MD_WITH_CODE_SEGS = 0x00002000, + MD_WITHOUT_AUXILLIARY_SEGS = 0x00004000, + MD_WITH_FULL_AUXILLIARY_STATE = 0x00008000, + MD_WITH_PRIVATE_WRITE_COPY_MEMORY = 0x00010000, + MD_IGNORE_INACCESSIBLE_MEMORY = 0x00020000, + MD_WITH_TOKEN_INFORMATION = 0x00040000 +} MDType; /* MINIDUMP_TYPE */ + + +typedef struct { + uint32_t stream_type; + MDLocationDescriptor location; +} MDRawDirectory; /* MINIDUMP_DIRECTORY */ + +/* For (MDRawDirectory).stream_type */ +typedef enum { + MD_UNUSED_STREAM = 0, + MD_RESERVED_STREAM_0 = 1, + MD_RESERVED_STREAM_1 = 2, + MD_THREAD_LIST_STREAM = 3, /* MDRawThreadList */ + MD_MODULE_LIST_STREAM = 4, /* MDRawModuleList */ + MD_MEMORY_LIST_STREAM = 5, /* MDRawMemoryList */ + MD_EXCEPTION_STREAM = 6, /* MDRawExceptionStream */ + MD_SYSTEM_INFO_STREAM = 7, /* MDRawSystemInfo */ + MD_THREAD_EX_LIST_STREAM = 8, + MD_MEMORY_64_LIST_STREAM = 9, + MD_COMMENT_STREAM_A = 10, + MD_COMMENT_STREAM_W = 11, + MD_HANDLE_DATA_STREAM = 12, + MD_FUNCTION_TABLE_STREAM = 13, + MD_UNLOADED_MODULE_LIST_STREAM = 14, + MD_MISC_INFO_STREAM = 15, /* MDRawMiscInfo */ + MD_MEMORY_INFO_LIST_STREAM = 16, /* MDRawMemoryInfoList */ + MD_THREAD_INFO_LIST_STREAM = 17, + MD_HANDLE_OPERATION_LIST_STREAM = 18, + MD_TOKEN_STREAM = 19, + MD_JAVASCRIPT_DATA_STREAM = 20, + MD_SYSTEM_MEMORY_INFO_STREAM = 21, + MD_PROCESS_VM_COUNTERS_STREAM = 22, + MD_THREAD_NAME_LIST_STREAM = 24, /* MDRawThreadNameList */ + MD_LAST_RESERVED_STREAM = 0x0000ffff, + + /* Breakpad extension types. 0x4767 = "Gg" */ + MD_BREAKPAD_INFO_STREAM = 0x47670001, /* MDRawBreakpadInfo */ + MD_ASSERTION_INFO_STREAM = 0x47670002, /* MDRawAssertionInfo */ + /* These are additional minidump stream values which are specific to + * the linux breakpad implementation. */ + MD_LINUX_CPU_INFO = 0x47670003, /* /proc/cpuinfo */ + MD_LINUX_PROC_STATUS = 0x47670004, /* /proc/$x/status */ + MD_LINUX_LSB_RELEASE = 0x47670005, /* /etc/lsb-release */ + MD_LINUX_CMD_LINE = 0x47670006, /* /proc/$x/cmdline */ + MD_LINUX_ENVIRON = 0x47670007, /* /proc/$x/environ */ + MD_LINUX_AUXV = 0x47670008, /* /proc/$x/auxv */ + MD_LINUX_MAPS = 0x47670009, /* /proc/$x/maps */ + MD_LINUX_DSO_DEBUG = 0x4767000A, /* MDRawDebug{32,64} */ + + /* Crashpad extension types. 0x4350 = "CP" + * See Crashpad's minidump/minidump_extensions.h. */ + MD_CRASHPAD_INFO_STREAM = 0x43500001, /* MDRawCrashpadInfo */ +} MDStreamType; /* MINIDUMP_STREAM_TYPE */ + + +typedef struct { + uint32_t length; /* Length of buffer in bytes (not characters), + * excluding 0-terminator */ + uint16_t buffer[1]; /* UTF-16-encoded, 0-terminated */ +} MDString; /* MINIDUMP_STRING */ + +static const size_t MDString_minsize = offsetof(MDString, buffer[0]); + + +typedef struct { + uint32_t thread_id; + uint32_t suspend_count; + uint32_t priority_class; + uint32_t priority; + uint64_t teb; /* Thread environment block */ + MDMemoryDescriptor stack; + MDLocationDescriptor thread_context; /* MDRawContext[CPU] */ +} MDRawThread; /* MINIDUMP_THREAD */ + + +typedef struct { + uint32_t number_of_threads; + MDRawThread threads[1]; +} MDRawThreadList; /* MINIDUMP_THREAD_LIST */ + +static const size_t MDRawThreadList_minsize = offsetof(MDRawThreadList, + threads[0]); + +#pragma pack(push, 4) +typedef struct { + uint32_t thread_id; + MDRVA64 thread_name_rva; /* MDString */ +} MDRawThreadName; /* MINIDUMP_THREAD_NAME */ + +typedef struct { + uint32_t number_of_thread_names; + MDRawThreadName thread_names[1]; +} MDRawThreadNameList; /* MINIDUMP_THREAD_NAME_LIST */ +#pragma pack(pop) + +static const size_t MDRawThreadNameList_minsize = + offsetof(MDRawThreadNameList, thread_names[0]); + +typedef struct { + uint64_t base_of_image; + uint32_t size_of_image; + uint32_t checksum; /* 0 if unknown */ + uint32_t time_date_stamp; /* time_t */ + MDRVA module_name_rva; /* MDString, pathname or filename */ + MDVSFixedFileInfo version_info; + + /* The next field stores a CodeView record and is populated when a module's + * debug information resides in a PDB file. It identifies the PDB file. */ + MDLocationDescriptor cv_record; + + /* The next field is populated when a module's debug information resides + * in a DBG file. It identifies the DBG file. This field is effectively + * obsolete with modules built by recent toolchains. */ + MDLocationDescriptor misc_record; + + /* Alignment problem: reserved0 and reserved1 are defined by the platform + * SDK as 64-bit quantities. However, that results in a structure whose + * alignment is unpredictable on different CPUs and ABIs. If the ABI + * specifies full alignment of 64-bit quantities in structures (as ppc + * does), there will be padding between miscRecord and reserved0. If + * 64-bit quantities can be aligned on 32-bit boundaries (as on x86), + * this padding will not exist. (Note that the structure up to this point + * contains 1 64-bit member followed by 21 32-bit members.) + * As a workaround, reserved0 and reserved1 are instead defined here as + * four 32-bit quantities. This should be harmless, as there are + * currently no known uses for these fields. */ + uint32_t reserved0[2]; + uint32_t reserved1[2]; +} MDRawModule; /* MINIDUMP_MODULE */ + +/* The inclusion of a 64-bit type in MINIDUMP_MODULE forces the struct to + * be tail-padded out to a multiple of 64 bits under some ABIs (such as PPC). + * This doesn't occur on systems that don't tail-pad in this manner. Define + * this macro to be the usable size of the MDRawModule struct, and use it in + * place of sizeof(MDRawModule). */ +#define MD_MODULE_SIZE 108 + + +/* (MDRawModule).cv_record can reference MDCVInfoPDB20 or MDCVInfoPDB70. + * Ref.: http://www.debuginfo.com/articles/debuginfomatch.html + * MDCVInfoPDB70 is the expected structure type with recent toolchains. */ + +typedef struct { + uint32_t signature; + uint32_t offset; /* Offset to debug data (expect 0 in minidump) */ +} MDCVHeader; + +typedef struct { + MDCVHeader cv_header; + uint32_t signature; /* time_t debug information created */ + uint32_t age; /* revision of PDB file */ + uint8_t pdb_file_name[1]; /* Pathname or filename of PDB file */ +} MDCVInfoPDB20; + +static const size_t MDCVInfoPDB20_minsize = offsetof(MDCVInfoPDB20, + pdb_file_name[0]); + +#define MD_CVINFOPDB20_SIGNATURE 0x3031424e /* cvHeader.signature = '01BN' */ + +typedef struct { + uint32_t cv_signature; + MDGUID signature; /* GUID, identifies PDB file */ + uint32_t age; /* Identifies incremental changes to PDB file */ + uint8_t pdb_file_name[1]; /* Pathname or filename of PDB file, + * 0-terminated 8-bit character data (UTF-8?) */ +} MDCVInfoPDB70; + +static const size_t MDCVInfoPDB70_minsize = offsetof(MDCVInfoPDB70, + pdb_file_name[0]); + +#define MD_CVINFOPDB70_SIGNATURE 0x53445352 /* cvSignature = 'SDSR' */ + +/* + * Modern ELF toolchains insert a "build id" into the ELF headers that + * usually contains a hash of some ELF headers + sections to uniquely + * identify a binary. + * + * https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Developer_Guide/compiling-build-id.html + * https://sourceware.org/binutils/docs-2.26/ld/Options.html#index-g_t_002d_002dbuild_002did-292 + */ +typedef struct { + uint32_t cv_signature; + uint8_t build_id[1]; /* Bytes of build id from GNU_BUILD_ID ELF note. + * This is variable-length, but usually 20 bytes + * as the binutils ld default is a SHA-1 hash. */ +} MDCVInfoELF; + +static const size_t MDCVInfoELF_minsize = offsetof(MDCVInfoELF, + build_id[0]); + +#define MD_CVINFOELF_SIGNATURE 0x4270454c /* cvSignature = 'BpEL' */ + +/* In addition to the two CodeView record formats above, used for linking + * to external pdb files, it is possible for debugging data to be carried + * directly in the CodeView record itself. These signature values will + * be found in the first 4 bytes of the CodeView record. Additional values + * not commonly experienced in the wild are given by "Microsoft Symbol and + * Type Information", http://www.x86.org/ftp/manuals/tools/sym.pdf, section + * 7.2. An in-depth description of the CodeView 4.1 format is given by + * "Undocumented Windows 2000 Secrets", Windows 2000 Debugging Support/ + * Microsoft Symbol File Internals/CodeView Subsections, + * http://www.rawol.com/features/undocumented/sbs-w2k-1-windows-2000-debugging-support.pdf + */ +#define MD_CVINFOCV41_SIGNATURE 0x3930424e /* '90BN', CodeView 4.10. */ +#define MD_CVINFOCV50_SIGNATURE 0x3131424e /* '11BN', CodeView 5.0, + * MS C7-format (/Z7). */ + +#define MD_CVINFOUNKNOWN_SIGNATURE 0xffffffff /* An unlikely value. */ + +/* (MDRawModule).miscRecord can reference MDImageDebugMisc. The Windows + * structure is actually defined in WinNT.h. This structure is effectively + * obsolete with modules built by recent toolchains. */ + +typedef struct { + uint32_t data_type; /* IMAGE_DEBUG_TYPE_*, not defined here because + * this debug record type is mostly obsolete. */ + uint32_t length; /* Length of entire MDImageDebugMisc structure */ + uint8_t unicode; /* True if data is multibyte */ + uint8_t reserved[3]; + uint8_t data[1]; +} MDImageDebugMisc; /* IMAGE_DEBUG_MISC */ + +static const size_t MDImageDebugMisc_minsize = offsetof(MDImageDebugMisc, + data[0]); + + +typedef struct { + uint32_t number_of_modules; + MDRawModule modules[1]; +} MDRawModuleList; /* MINIDUMP_MODULE_LIST */ + +static const size_t MDRawModuleList_minsize = offsetof(MDRawModuleList, + modules[0]); + + +typedef struct { + uint32_t number_of_memory_ranges; + MDMemoryDescriptor memory_ranges[1]; +} MDRawMemoryList; /* MINIDUMP_MEMORY_LIST */ + +static const size_t MDRawMemoryList_minsize = offsetof(MDRawMemoryList, + memory_ranges[0]); + + +#define MD_EXCEPTION_MAXIMUM_PARAMETERS 15u + +typedef struct { + uint32_t exception_code; /* Windows: MDExceptionCodeWin, + * Mac OS X: MDExceptionMac, + * Linux: MDExceptionCodeLinux. */ + uint32_t exception_flags; /* Windows: 1 if noncontinuable, + Mac OS X: MDExceptionCodeMac. */ + uint64_t exception_record; /* Address (in the minidump-producing host's + * memory) of another MDException, for + * nested exceptions. */ + uint64_t exception_address; /* The address that caused the exception. + * Mac OS X: exception subcode (which is + * typically the address). */ + uint32_t number_parameters; /* Number of valid elements in + * exception_information. */ + uint32_t __align; + uint64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS]; +} MDException; /* MINIDUMP_EXCEPTION */ + +#include "minidump_exception_fuchsia.h" +#include "minidump_exception_linux.h" +#include "minidump_exception_mac.h" +#include "minidump_exception_ps3.h" +#include "minidump_exception_solaris.h" +#include "minidump_exception_win32.h" + +typedef struct { + uint32_t thread_id; /* Thread in which the exception + * occurred. Corresponds to + * (MDRawThread).thread_id. */ + uint32_t __align; + MDException exception_record; + MDLocationDescriptor thread_context; /* MDRawContext[CPU] */ +} MDRawExceptionStream; /* MINIDUMP_EXCEPTION_STREAM */ + + +typedef union { + struct { + uint32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */ + uint32_t version_information; /* cpuid 1: eax */ + uint32_t feature_information; /* cpuid 1: edx */ + uint32_t amd_extended_cpu_features; /* cpuid 0x80000001, ebx */ + } x86_cpu_info; + struct { + uint32_t cpuid; + uint32_t elf_hwcaps; /* linux specific, 0 otherwise */ + } arm_cpu_info; + struct { + uint64_t processor_features[2]; + } other_cpu_info; +} MDCPUInformation; /* CPU_INFORMATION */ + +/* For (MDCPUInformation).arm_cpu_info.elf_hwcaps. + * This matches the Linux kernel definitions from */ +typedef enum { + MD_CPU_ARM_ELF_HWCAP_SWP = (1 << 0), + MD_CPU_ARM_ELF_HWCAP_HALF = (1 << 1), + MD_CPU_ARM_ELF_HWCAP_THUMB = (1 << 2), + MD_CPU_ARM_ELF_HWCAP_26BIT = (1 << 3), + MD_CPU_ARM_ELF_HWCAP_FAST_MULT = (1 << 4), + MD_CPU_ARM_ELF_HWCAP_FPA = (1 << 5), + MD_CPU_ARM_ELF_HWCAP_VFP = (1 << 6), + MD_CPU_ARM_ELF_HWCAP_EDSP = (1 << 7), + MD_CPU_ARM_ELF_HWCAP_JAVA = (1 << 8), + MD_CPU_ARM_ELF_HWCAP_IWMMXT = (1 << 9), + MD_CPU_ARM_ELF_HWCAP_CRUNCH = (1 << 10), + MD_CPU_ARM_ELF_HWCAP_THUMBEE = (1 << 11), + MD_CPU_ARM_ELF_HWCAP_NEON = (1 << 12), + MD_CPU_ARM_ELF_HWCAP_VFPv3 = (1 << 13), + MD_CPU_ARM_ELF_HWCAP_VFPv3D16 = (1 << 14), + MD_CPU_ARM_ELF_HWCAP_TLS = (1 << 15), + MD_CPU_ARM_ELF_HWCAP_VFPv4 = (1 << 16), + MD_CPU_ARM_ELF_HWCAP_IDIVA = (1 << 17), + MD_CPU_ARM_ELF_HWCAP_IDIVT = (1 << 18), +} MDCPUInformationARMElfHwCaps; + +typedef struct { + /* The next 3 fields and numberOfProcessors are from the SYSTEM_INFO + * structure as returned by GetSystemInfo */ + uint16_t processor_architecture; + uint16_t processor_level; /* x86: 5 = 586, 6 = 686, ... */ + /* ARM: 6 = ARMv6, 7 = ARMv7 ... */ + uint16_t processor_revision; /* x86: 0xMMSS, where MM=model, + * SS=stepping */ + /* ARM: 0 */ + + uint8_t number_of_processors; + uint8_t product_type; /* Windows: VER_NT_* from WinNT.h */ + + /* The next 5 fields are from the OSVERSIONINFO structure as returned + * by GetVersionEx */ + uint32_t major_version; + uint32_t minor_version; + uint32_t build_number; + uint32_t platform_id; + MDRVA csd_version_rva; /* MDString further identifying the + * host OS. + * Windows: name of the installed OS + * service pack. + * Mac OS X: the Apple OS build number + * (sw_vers -buildVersion). + * Linux: uname -srvmo */ + + uint16_t suite_mask; /* Windows: VER_SUITE_* from WinNT.h */ + uint16_t reserved2; + + MDCPUInformation cpu; +} MDRawSystemInfo; /* MINIDUMP_SYSTEM_INFO */ + +/* For (MDRawSystemInfo).processor_architecture: */ +typedef enum { + MD_CPU_ARCHITECTURE_X86 = 0, /* PROCESSOR_ARCHITECTURE_INTEL */ + MD_CPU_ARCHITECTURE_MIPS = 1, /* PROCESSOR_ARCHITECTURE_MIPS */ + MD_CPU_ARCHITECTURE_ALPHA = 2, /* PROCESSOR_ARCHITECTURE_ALPHA */ + MD_CPU_ARCHITECTURE_PPC = 3, /* PROCESSOR_ARCHITECTURE_PPC */ + MD_CPU_ARCHITECTURE_SHX = 4, /* PROCESSOR_ARCHITECTURE_SHX + * (Super-H) */ + MD_CPU_ARCHITECTURE_ARM = 5, /* PROCESSOR_ARCHITECTURE_ARM */ + MD_CPU_ARCHITECTURE_IA64 = 6, /* PROCESSOR_ARCHITECTURE_IA64 */ + MD_CPU_ARCHITECTURE_ALPHA64 = 7, /* PROCESSOR_ARCHITECTURE_ALPHA64 */ + MD_CPU_ARCHITECTURE_MSIL = 8, /* PROCESSOR_ARCHITECTURE_MSIL + * (Microsoft Intermediate Language) */ + MD_CPU_ARCHITECTURE_AMD64 = 9, /* PROCESSOR_ARCHITECTURE_AMD64 */ + MD_CPU_ARCHITECTURE_X86_WIN64 = 10, + /* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */ + MD_CPU_ARCHITECTURE_ARM64 = 12, /* PROCESSOR_ARCHITECTURE_ARM64 */ + MD_CPU_ARCHITECTURE_SPARC = 0x8001, /* Breakpad-defined value for SPARC */ + MD_CPU_ARCHITECTURE_PPC64 = 0x8002, /* Breakpad-defined value for PPC64 */ + MD_CPU_ARCHITECTURE_ARM64_OLD = 0x8003, /* Breakpad-defined value for ARM64 */ + MD_CPU_ARCHITECTURE_MIPS64 = 0x8004, /* Breakpad-defined value for MIPS64 */ + MD_CPU_ARCHITECTURE_RISCV = 0x8005, /* Breakpad-defined value for RISCV */ + MD_CPU_ARCHITECTURE_RISCV64 = 0x8006, /* Breakpad-defined value for RISCV64 */ + MD_CPU_ARCHITECTURE_UNKNOWN = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */ +} MDCPUArchitecture; + +/* For (MDRawSystemInfo).platform_id: */ +typedef enum { + MD_OS_WIN32S = 0, /* VER_PLATFORM_WIN32s (Windows 3.1) */ + MD_OS_WIN32_WINDOWS = 1, /* VER_PLATFORM_WIN32_WINDOWS (Windows 95-98-Me) */ + MD_OS_WIN32_NT = 2, /* VER_PLATFORM_WIN32_NT (Windows NT, 2000+) */ + MD_OS_WIN32_CE = 3, /* VER_PLATFORM_WIN32_CE, VER_PLATFORM_WIN32_HH + * (Windows CE, Windows Mobile, "Handheld") */ + + /* The following values are Breakpad-defined. */ + MD_OS_UNIX = 0x8000, /* Generic Unix-ish */ + MD_OS_MAC_OS_X = 0x8101, /* Mac OS X/Darwin */ + MD_OS_IOS = 0x8102, /* iOS */ + MD_OS_LINUX = 0x8201, /* Linux */ + MD_OS_SOLARIS = 0x8202, /* Solaris */ + MD_OS_ANDROID = 0x8203, /* Android */ + MD_OS_PS3 = 0x8204, /* PS3 */ + MD_OS_NACL = 0x8205, /* Native Client (NaCl) */ + MD_OS_FUCHSIA = 0x8206 /* Fuchsia */ +} MDOSPlatform; + +typedef struct { + uint64_t base_of_image; + uint32_t size_of_image; + uint32_t checksum; + uint32_t time_date_stamp; + MDRVA module_name_rva; +} MDRawUnloadedModule; + +typedef struct { + uint32_t size_of_header; + uint32_t size_of_entry; + uint32_t number_of_entries; +} MDRawUnloadedModuleList; /* MINIDUMP_UNLOADED_MODULE_LIST */ + +typedef struct { + uint16_t year; + uint16_t month; + uint16_t day_of_week; + uint16_t day; + uint16_t hour; + uint16_t minute; + uint16_t second; + uint16_t milliseconds; +} MDSystemTime; /* SYSTEMTIME */ + +typedef struct { + /* Required field. The bias is the difference, in minutes, between + * Coordinated Universal Time (UTC) and local time. + * Formula: UTC = local time + bias */ + int32_t bias; + /* A description for standard time. For example, "EST" could indicate Eastern + * Standard Time. In practice this contains the full time zone names. This + * string can be empty. */ + uint16_t standard_name[32]; /* UTF-16-encoded, 0-terminated */ + /* A MDSystemTime structure that contains a date and local time when the + * transition from daylight saving time to standard time occurs on this + * operating system. If the time zone does not support daylight saving time, + * the month member in the MDSystemTime structure is zero. */ + MDSystemTime standard_date; + /* The bias value to be used during local time translations that occur during + * standard time. */ + int32_t standard_bias; + /* A description for daylight saving time. For example, "PDT" could indicate + * Pacific Daylight Time. In practice this contains the full time zone names. + * This string can be empty. */ + uint16_t daylight_name[32]; /* UTF-16-encoded, 0-terminated */ + /* A MDSystemTime structure that contains a date and local time when the + * transition from standard time to daylight saving time occurs on this + * operating system. If the time zone does not support daylight saving time, + * the month member in the MDSystemTime structure is zero.*/ + MDSystemTime daylight_date; + /* The bias value to be used during local time translations that occur during + * daylight saving time. */ + int32_t daylight_bias; +} MDTimeZoneInformation; /* TIME_ZONE_INFORMATION */ + +/* MAX_PATH from windef.h */ +#define MD_MAX_PATH 260 + +/* For MDXStateConfigFeatureMscInfo.features */ +typedef struct { + uint32_t offset; + uint32_t size; +} MDXStateFeature; + +/* For MDXStateConfigFeatureMscInfo.enabled_features from winnt.h */ +typedef enum { + MD_XSTATE_LEGACY_FLOATING_POINT = 0, /* XSTATE_LEGACY_FLOATING_POINT */ + MD_XSTATE_LEGACY_SSE = 1, /* XSTATE_LEGACY_SSE */ + MD_XSTATE_GSSE = 2, /* XSTATE_GSSE */ + MD_XSTATE_AVX = MD_XSTATE_GSSE, /* XSTATE_AVX */ + MD_XSTATE_MPX_BNDREGS = 3, /* XSTATE_MPX_BNDREGS */ + MD_XSTATE_MPX_BNDCSR = 4, /* XSTATE_MPX_BNDCSR */ + MD_XSTATE_AVX512_KMASK = 5, /* XSTATE_AVX512_KMASK */ + MD_XSTATE_AVX512_ZMM_H = 6, /* XSTATE_AVX512_ZMM_H */ + MD_XSTATE_AVX512_ZMM = 7, /* XSTATE_AVX512_ZMM */ + MD_XSTATE_IPT = 8, /* XSTATE_IPT */ + MD_XSTATE_LWP = 62 /* XSTATE_LWP */ +} MDXStateFeatureFlag; + +/* MAXIMUM_XSTATE_FEATURES from winnt.h */ +#define MD_MAXIMUM_XSTATE_FEATURES 64 + +/* For MDRawMiscInfo.xstate_data */ +typedef struct { + uint32_t size_of_info; + uint32_t context_size; + /* An entry in the features array is valid only if the corresponding bit in + * the enabled_features flag is set. */ + uint64_t enabled_features; + MDXStateFeature features[MD_MAXIMUM_XSTATE_FEATURES]; +} MDXStateConfigFeatureMscInfo; + + +/* The miscellaneous information stream contains a variety + * of small pieces of information. A member is valid if + * it's within the available size and its corresponding + * bit is set. */ +typedef struct { + uint32_t size_of_info; /* Length of entire MDRawMiscInfo structure. */ + uint32_t flags1; + + /* The next field is only valid if flags1 contains + * MD_MISCINFO_FLAGS1_PROCESS_ID. */ + uint32_t process_id; + + /* The next 3 fields are only valid if flags1 contains + * MD_MISCINFO_FLAGS1_PROCESS_TIMES. */ + uint32_t process_create_time; /* time_t process started */ + uint32_t process_user_time; /* seconds of user CPU time */ + uint32_t process_kernel_time; /* seconds of kernel CPU time */ + + /* The following fields are not present in MINIDUMP_MISC_INFO but are + * in MINIDUMP_MISC_INFO_2. When this struct is populated, these values + * may not be set. Use flags1 and size_of_info to determine whether these + * values are present. These are only valid when flags1 contains + * MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO. */ + uint32_t processor_max_mhz; + uint32_t processor_current_mhz; + uint32_t processor_mhz_limit; + uint32_t processor_max_idle_state; + uint32_t processor_current_idle_state; + + /* The following fields are not present in MINIDUMP_MISC_INFO_2 but are + * in MINIDUMP_MISC_INFO_3. When this struct is populated, these values + * may not be set. Use flags1 and size_of_info to determine whether these + * values are present. */ + + /* The following field is only valid if flags1 contains + * MD_MISCINFO_FLAGS1_PROCESS_INTEGRITY. */ + uint32_t process_integrity_level; + + /* The following field is only valid if flags1 contains + * MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS. */ + uint32_t process_execute_flags; + + /* The following field is only valid if flags1 contains + * MD_MISCINFO_FLAGS1_PROTECTED_PROCESS. */ + uint32_t protected_process; + + /* The following 2 fields are only valid if flags1 contains + * MD_MISCINFO_FLAGS1_TIMEZONE. */ + uint32_t time_zone_id; + MDTimeZoneInformation time_zone; + + /* The following fields are not present in MINIDUMP_MISC_INFO_3 but are + * in MINIDUMP_MISC_INFO_4. When this struct is populated, these values + * may not be set. Use flags1 and size_of_info to determine whether these + * values are present. */ + + /* The following 2 fields are only valid if flags1 contains + * MD_MISCINFO_FLAGS1_BUILDSTRING. */ + uint16_t build_string[MD_MAX_PATH]; /* UTF-16-encoded, 0-terminated */ + uint16_t dbg_bld_str[40]; /* UTF-16-encoded, 0-terminated */ + + /* The following fields are not present in MINIDUMP_MISC_INFO_4 but are + * in MINIDUMP_MISC_INFO_5. When this struct is populated, these values + * may not be set. Use flags1 and size_of_info to determine whether these + * values are present. */ + + /* The following field has its own flags for establishing the validity of + * the structure's contents.*/ + MDXStateConfigFeatureMscInfo xstate_data; + + /* The following field is only valid if flags1 contains + * MD_MISCINFO_FLAGS1_PROCESS_COOKIE. */ + uint32_t process_cookie; +} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2, + * MINIDUMP_MISC_INFO_3, MINIDUMP_MISC_INFO_4, + * MINIDUMP_MISC_INFO_5, MINIDUMP_MISC_INFO_N */ + +static const size_t MD_MISCINFO_SIZE = + offsetof(MDRawMiscInfo, processor_max_mhz); +static const size_t MD_MISCINFO2_SIZE = + offsetof(MDRawMiscInfo, process_integrity_level); +static const size_t MD_MISCINFO3_SIZE = + offsetof(MDRawMiscInfo, build_string[0]); +static const size_t MD_MISCINFO4_SIZE = + offsetof(MDRawMiscInfo, xstate_data); +/* Version 5 of the MDRawMiscInfo structure is not a multiple of 8 in size and + * yet it contains some 8-bytes sized fields. This causes many compilers to + * round the structure size up to a multiple of 8 by adding padding at the end. + * The following hack is thus required for matching the proper on-disk size. */ +static const size_t MD_MISCINFO5_SIZE = + offsetof(MDRawMiscInfo, process_cookie) + sizeof(uint32_t); + +/* For (MDRawMiscInfo).flags1. These values indicate which fields in the + * MDRawMiscInfoStructure are valid. */ +typedef enum { + MD_MISCINFO_FLAGS1_PROCESS_ID = 0x00000001, + /* MINIDUMP_MISC1_PROCESS_ID */ + MD_MISCINFO_FLAGS1_PROCESS_TIMES = 0x00000002, + /* MINIDUMP_MISC1_PROCESS_TIMES */ + MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO = 0x00000004, + /* MINIDUMP_MISC1_PROCESSOR_POWER_INFO */ + MD_MISCINFO_FLAGS1_PROCESS_INTEGRITY = 0x00000010, + /* MINIDUMP_MISC3_PROCESS_INTEGRITY */ + MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS = 0x00000020, + /* MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS */ + MD_MISCINFO_FLAGS1_TIMEZONE = 0x00000040, + /* MINIDUMP_MISC3_TIMEZONE */ + MD_MISCINFO_FLAGS1_PROTECTED_PROCESS = 0x00000080, + /* MINIDUMP_MISC3_PROTECTED_PROCESS */ + MD_MISCINFO_FLAGS1_BUILDSTRING = 0x00000100, + /* MINIDUMP_MISC4_BUILDSTRING */ + MD_MISCINFO_FLAGS1_PROCESS_COOKIE = 0x00000200, + /* MINIDUMP_MISC5_PROCESS_COOKIE */ +} MDMiscInfoFlags1; + +/* + * Around DbgHelp version 6.0, the style of new LIST structures changed + * from including an array of length 1 at the end of the struct to + * represent the variable-length data to including explicit + * "size of header", "size of entry" and "number of entries" fields + * in the header, presumably to allow backwards-compatibly-extending + * the structures in the future. The actual list entries follow the + * header data directly in this case. + */ + +typedef struct { + uint32_t size_of_header; /* sizeof(MDRawMemoryInfoList) */ + uint32_t size_of_entry; /* sizeof(MDRawMemoryInfo) */ + uint64_t number_of_entries; +} MDRawMemoryInfoList; /* MINIDUMP_MEMORY_INFO_LIST */ + +typedef struct { + uint64_t base_address; /* Base address of a region of pages */ + uint64_t allocation_base; /* Base address of a range of pages + * within this region. */ + uint32_t allocation_protection; /* Memory protection when this region + * was originally allocated: + * MDMemoryProtection */ + uint32_t __alignment1; + uint64_t region_size; + uint32_t state; /* MDMemoryState */ + uint32_t protection; /* MDMemoryProtection */ + uint32_t type; /* MDMemoryType */ + uint32_t __alignment2; +} MDRawMemoryInfo; /* MINIDUMP_MEMORY_INFO */ + +/* For (MDRawMemoryInfo).state */ +typedef enum { + MD_MEMORY_STATE_COMMIT = 0x1000, /* physical storage has been allocated */ + MD_MEMORY_STATE_RESERVE = 0x2000, /* reserved, but no physical storage */ + MD_MEMORY_STATE_FREE = 0x10000 /* available to be allocated */ +} MDMemoryState; + +/* For (MDRawMemoryInfo).allocation_protection and .protection */ +typedef enum { + MD_MEMORY_PROTECT_NOACCESS = 0x01, /* PAGE_NOACCESS */ + MD_MEMORY_PROTECT_READONLY = 0x02, /* PAGE_READONLY */ + MD_MEMORY_PROTECT_READWRITE = 0x04, /* PAGE_READWRITE */ + MD_MEMORY_PROTECT_WRITECOPY = 0x08, /* PAGE_WRITECOPY */ + MD_MEMORY_PROTECT_EXECUTE = 0x10, /* PAGE_EXECUTE */ + MD_MEMORY_PROTECT_EXECUTE_READ = 0x20, /* PAGE_EXECUTE_READ */ + MD_MEMORY_PROTECT_EXECUTE_READWRITE = 0x40, /* PAGE_EXECUTE_READWRITE */ + MD_MEMORY_PROTECT_EXECUTE_WRITECOPY = 0x80, /* PAGE_EXECUTE_WRITECOPY */ + /* These options can be combined with the previous flags. */ + MD_MEMORY_PROTECT_GUARD = 0x100, /* PAGE_GUARD */ + MD_MEMORY_PROTECT_NOCACHE = 0x200, /* PAGE_NOCACHE */ + MD_MEMORY_PROTECT_WRITECOMBINE = 0x400, /* PAGE_WRITECOMBINE */ +} MDMemoryProtection; + +/* Used to mask the mutually exclusive options from the combinable flags. */ +const uint32_t MD_MEMORY_PROTECTION_ACCESS_MASK = 0xFF; + +/* For (MDRawMemoryInfo).type */ +typedef enum { + MD_MEMORY_TYPE_PRIVATE = 0x20000, /* not shared by other processes */ + MD_MEMORY_TYPE_MAPPED = 0x40000, /* mapped into the view of a section */ + MD_MEMORY_TYPE_IMAGE = 0x1000000 /* mapped into the view of an image */ +} MDMemoryType; + +/* + * Breakpad extension types + */ + + +typedef struct { + /* validity is a bitmask with values from MDBreakpadInfoValidity, indicating + * which of the other fields in the structure are valid. */ + uint32_t validity; + + /* Thread ID of the handler thread. dump_thread_id should correspond to + * the thread_id of an MDRawThread in the minidump's MDRawThreadList if + * a dedicated thread in that list was used to produce the minidump. If + * the MDRawThreadList does not contain a dedicated thread used to produce + * the minidump, this field should be set to 0 and the validity field + * must not contain MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID. */ + uint32_t dump_thread_id; + + /* Thread ID of the thread that requested the minidump be produced. As + * with dump_thread_id, requesting_thread_id should correspond to the + * thread_id of an MDRawThread in the minidump's MDRawThreadList. For + * minidumps produced as a result of an exception, requesting_thread_id + * will be the same as the MDRawExceptionStream's thread_id field. For + * minidumps produced "manually" at the program's request, + * requesting_thread_id will indicate which thread caused the dump to be + * written. If the minidump was produced at the request of something + * other than a thread in the MDRawThreadList, this field should be set + * to 0 and the validity field must not contain + * MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID. */ + uint32_t requesting_thread_id; +} MDRawBreakpadInfo; + +/* For (MDRawBreakpadInfo).validity: */ +typedef enum { + /* When set, the dump_thread_id field is valid. */ + MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID = 1 << 0, + + /* When set, the requesting_thread_id field is valid. */ + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID = 1 << 1 +} MDBreakpadInfoValidity; + +typedef struct { + /* expression, function, and file are 0-terminated UTF-16 strings. They + * may be truncated if necessary, but should always be 0-terminated when + * written to a file. + * Fixed-length strings are used because MiniDumpWriteDump doesn't offer + * a way for user streams to point to arbitrary RVAs for strings. */ + uint16_t expression[128]; /* Assertion that failed... */ + uint16_t function[128]; /* ...within this function... */ + uint16_t file[128]; /* ...in this file... */ + uint32_t line; /* ...at this line. */ + uint32_t type; +} MDRawAssertionInfo; + +/* For (MDRawAssertionInfo).type: */ +typedef enum { + MD_ASSERTION_INFO_TYPE_UNKNOWN = 0, + + /* Used for assertions that would be raised by the MSVC CRT but are + * directed to an invalid parameter handler instead. */ + MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER, + + /* Used for assertions that would be raised by the MSVC CRT but are + * directed to a pure virtual call handler instead. */ + MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL +} MDAssertionInfoData; + +/* These structs are used to store the DSO debug data in Linux minidumps, + * which is necessary for converting minidumps to usable coredumps. + * Because of a historical accident, several fields are variably encoded + * according to client word size, so tools potentially need to support both. */ + +typedef struct { + uint32_t addr; + MDRVA name; + uint32_t ld; +} MDRawLinkMap32; + +typedef struct { + uint32_t version; + MDRVA map; /* array of MDRawLinkMap32 */ + uint32_t dso_count; + uint32_t brk; + uint32_t ldbase; + uint32_t dynamic; +} MDRawDebug32; + +typedef struct { + uint64_t addr; + MDRVA name; + uint64_t ld; +} MDRawLinkMap64; + +typedef struct { + uint32_t version; + MDRVA map; /* array of MDRawLinkMap64 */ + uint32_t dso_count; + uint64_t brk; + uint64_t ldbase; + uint64_t dynamic; +} MDRawDebug64; + +/* Crashpad extension types. See Crashpad's minidump/minidump_extensions.h. */ + +typedef struct { + MDRVA key; + MDRVA value; +} MDRawSimpleStringDictionaryEntry; + +typedef struct { + uint32_t count; + MDRawSimpleStringDictionaryEntry entries[0]; +} MDRawSimpleStringDictionary; + +typedef struct { + MDRVA name; + uint16_t type; + uint16_t reserved; + MDRVA value; +} MDRawCrashpadAnnotation; + +typedef struct { + uint32_t count; + MDRawCrashpadAnnotation objects[0]; +} MDRawCrashpadAnnotationList; + +typedef struct { + uint32_t version; + MDLocationDescriptor list_annotations; + MDLocationDescriptor simple_annotations; /* MDRawSimpleStringDictionary */ + MDLocationDescriptor annotation_objects; /* MDRawCrashpadAnnotationList */ +} MDRawModuleCrashpadInfo; + +typedef struct { + uint32_t minidump_module_list_index; + MDLocationDescriptor location; /* MDRawModuleCrashpadInfo */ +} MDRawModuleCrashpadInfoLink; + +typedef struct { + uint32_t count; + MDRawModuleCrashpadInfoLink modules[0]; +} MDRawModuleCrashpadInfoList; + +typedef struct { + uint32_t version; + MDGUID report_id; + MDGUID client_id; + MDLocationDescriptor simple_annotations; /* MDRawSimpleStringDictionary */ + MDLocationDescriptor module_list; /* MDRawModuleCrashpadInfoList */ + uint32_t reserved; + uint64_t address_mask; +} MDRawCrashpadInfo; + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif /* _MSC_VER */ + + +#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ */ diff --git a/src/google_breakpad/common/minidump_size.h b/src/google_breakpad/common/minidump_size.h new file mode 100644 index 0000000..f9abdc3 --- /dev/null +++ b/src/google_breakpad/common/minidump_size.h @@ -0,0 +1,112 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +// minidump_size.h: Provides a C++ template for programmatic access to +// the sizes of various types defined in minidump_format.h. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ + +#include + +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +template +class minidump_size { + public: + static size_t size() { return sizeof(T); } +}; + +// Explicit specializations for variable-length types. The size returned +// for these should be the size for an object without its variable-length +// section. + +template<> +class minidump_size { + public: + static size_t size() { return MDString_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDRawThreadList_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDCVInfoPDB20_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDCVInfoPDB70_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDCVInfoELF_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDImageDebugMisc_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDRawModuleList_minsize; } +}; + +template<> +class minidump_size { + public: + static size_t size() { return MDRawMemoryList_minsize; } +}; + +// Explicit specialization for MDRawModule, for which sizeof may include +// tail-padding on some architectures but not others. + +template<> +class minidump_size { + public: + static size_t size() { return MD_MODULE_SIZE; } +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ diff --git a/src/google_breakpad/processor/basic_source_line_resolver.h b/src/google_breakpad/processor/basic_source_line_resolver.h new file mode 100644 index 0000000..e86b28d --- /dev/null +++ b/src/google_breakpad/processor/basic_source_line_resolver.h @@ -0,0 +1,183 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// basic_source_line_resolver.h: BasicSourceLineResolver is derived from +// SourceLineResolverBase, and is a concrete implementation of +// SourceLineResolverInterface, using address map files produced by a +// compatible writer, e.g. PDBSourceLineWriter. +// +// see "processor/source_line_resolver_base.h" +// and "source_line_resolver_interface.h" for more documentation. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ + +#include +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/processor/source_line_resolver_base.h" + +namespace google_breakpad { + +using std::map; + +class BasicSourceLineResolver : public SourceLineResolverBase { + public: + BasicSourceLineResolver(); + virtual ~BasicSourceLineResolver() { } + + using SourceLineResolverBase::LoadModule; + using SourceLineResolverBase::LoadModuleUsingMapBuffer; + using SourceLineResolverBase::LoadModuleUsingMemoryBuffer; + using SourceLineResolverBase::ShouldDeleteMemoryBufferAfterLoadModule; + using SourceLineResolverBase::UnloadModule; + using SourceLineResolverBase::HasModule; + using SourceLineResolverBase::IsModuleCorrupt; + using SourceLineResolverBase::FillSourceLineInfo; + using SourceLineResolverBase::FindWindowsFrameInfo; + using SourceLineResolverBase::FindCFIFrameInfo; + + private: + // friend declarations: + friend class BasicModuleFactory; + friend class ModuleComparer; + friend class ModuleSerializer; + template friend class SimpleSerializer; + + // Function derives from SourceLineResolverBase::Function. + struct Function; + // Module implements SourceLineResolverBase::Module interface. + class Module; + + // Disallow unwanted copy ctor and assignment operator + BasicSourceLineResolver(const BasicSourceLineResolver&); + void operator=(const BasicSourceLineResolver&); +}; + +// Helper class, containing useful methods for parsing of Breakpad symbol files. +class SymbolParseHelper { + public: + using MemAddr = SourceLineResolverInterface::MemAddr; + + // Parses a |file_line| declaration. Returns true on success. + // Format: FILE . + // Notice, that this method modifies the input |file_line| which is why it + // can't be const. On success, , and are stored in |*index|, + // and |*filename|. No allocation is done, |*filename| simply points inside + // |file_line|. + static bool ParseFile(char* file_line, // in + long* index, // out + char** filename); // out + + // Parses a |inline_origin_line| declaration. Returns true on success. + // Old Format: INLINE_ORIGIN . + // New Format: INLINE_ORIGIN . + // Notice, that this method modifies the input |inline_origin_line| which is + // why it can't be const. On success, , , + // and are stored in |*has_file_id*|, |*origin_id|, |*file_id|, and + // |*name|. No allocation is done, |*name| simply points inside + // |inline_origin_line|. + static bool ParseInlineOrigin(char* inline_origin_line, // in + bool* has_file_id, // out + long* origin_id, // out + long* file_id, // out + char** name); // out + + // Parses a |inline| declaration. Returns true on success. + // Old Format: INLINE + // [
    ]+ + // New Format: INLINE + // [
    ]+ + // Notice, that this method modifies the input |inline| + // which is why it can't be const. On success, , + // , and are stored in + // |*has_call_site_file_id*|, |*inline_nest_level|, |*call_site_line|, and + // |*origin_id|, and all pairs of (
    , ) are added into ranges. + static bool ParseInline( + char* inline_line, // in + bool* has_call_site_file_id, // out + long* inline_nest_level, // out + long* call_site_line, // out + long* call_site_file_id, // out + long* origin_id, // out + std::vector>* ranges); // out + + // Parses a |function_line| declaration. Returns true on success. + // Format: FUNC []
    . + // Notice, that this method modifies the input |function_line| which is why it + // can't be const. On success, the presence of ,
    , , + // , and are stored in |*is_multiple|, |*address|, + // |*size|, |*stack_param_size|, and |*name|. No allocation is done, |*name| + // simply points inside |function_line|. + static bool ParseFunction(char* function_line, // in + bool* is_multiple, // out + uint64_t* address, // out + uint64_t* size, // out + long* stack_param_size, // out + char** name); // out + + // Parses a |line| declaration. Returns true on success. + // Format:
    + // Notice, that this method modifies the input |function_line| which is why + // it can't be const. On success,
    , , , and + // are stored in |*address|, |*size|, |*line_number|, and + // |*source_file|. + static bool ParseLine(char* line_line, // in + uint64_t* address, // out + uint64_t* size, // out + long* line_number, // out + long* source_file); // out + + // Parses a |public_line| declaration. Returns true on success. + // Format: PUBLIC []
    + // Notice, that this method modifies the input |function_line| which is why + // it can't be const. On success, the presence of ,
    , + // , are stored in |*is_multiple|, |*address|, + // |*stack_param_size|, and |*name|. No allocation is done, |*name| simply + // points inside |public_line|. + static bool ParsePublicSymbol(char* public_line, // in + bool* is_multiple, // out + uint64_t* address, // out + long* stack_param_size, // out + char** name); // out + + private: + // Used for success checks after strtoull and strtol. + static bool IsValidAfterNumber(char* after_number); + + // Only allow static methods. + SymbolParseHelper(); + SymbolParseHelper(const SymbolParseHelper&); + void operator=(const SymbolParseHelper&); +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__ diff --git a/src/google_breakpad/processor/call_stack.h b/src/google_breakpad/processor/call_stack.h new file mode 100644 index 0000000..9bf062f --- /dev/null +++ b/src/google_breakpad/processor/call_stack.h @@ -0,0 +1,86 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// call_stack.h: A call stack comprised of stack frames. +// +// This class manages a vector of stack frames. It is used instead of +// exposing the vector directly to allow the CallStack to own StackFrame +// pointers without having to publicly export the linked_ptr class. A +// CallStack must be composed of pointers instead of objects to allow for +// CPU-specific StackFrame subclasses. +// +// By convention, the stack frame at index 0 is the innermost callee frame, +// and the frame at the highest index in a call stack is the outermost +// caller. CallStack only allows stacks to be built by pushing frames, +// beginning with the innermost callee frame. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_CALL_STACK_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_CALL_STACK_H__ + +#include +#include + +namespace google_breakpad { + +using std::vector; + +struct StackFrame; +template class linked_ptr; + +class CallStack { + public: + CallStack() { Clear(); } + ~CallStack(); + + // Resets the CallStack to its initial empty state + void Clear(); + + const vector* frames() const { return &frames_; } + + // Set the TID associated with this call stack. + void set_tid(uint32_t tid) { tid_ = tid; } + + uint32_t tid() const { return tid_; } + + private: + // Stackwalker is responsible for building the frames_ vector. + friend class Stackwalker; + + // Storage for pushed frames. + vector frames_; + + // The TID associated with this call stack. Default to 0 if it's not + // available. + uint32_t tid_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCSSOR_CALL_STACK_H__ diff --git a/src/google_breakpad/processor/code_module.h b/src/google_breakpad/processor/code_module.h new file mode 100644 index 0000000..76bbfab --- /dev/null +++ b/src/google_breakpad/processor/code_module.h @@ -0,0 +1,103 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// code_module.h: Carries information about code modules that are loaded +// into a process. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__ + +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +class CodeModule { + public: + virtual ~CodeModule() {} + + // The base address of this code module as it was loaded by the process. + // (uint64_t)-1 on error. + virtual uint64_t base_address() const = 0; + + // The size of the code module. 0 on error. + virtual uint64_t size() const = 0; + + // The path or file name that the code module was loaded from. Empty on + // error. + virtual string code_file() const = 0; + + // An identifying string used to discriminate between multiple versions and + // builds of the same code module. This may contain a uuid, timestamp, + // version number, or any combination of this or other information, in an + // implementation-defined format. Empty on error. + virtual string code_identifier() const = 0; + + // The filename containing debugging information associated with the code + // module. If debugging information is stored in a file separate from the + // code module itself (as is the case when .pdb or .dSYM files are used), + // this will be different from code_file. If debugging information is + // stored in the code module itself (possibly prior to stripping), this + // will be the same as code_file. Empty on error. + virtual string debug_file() const = 0; + + // An identifying string similar to code_identifier, but identifies a + // specific version and build of the associated debug file. This may be + // the same as code_identifier when the debug_file and code_file are + // identical or when the same identifier is used to identify distinct + // debug and code files. + virtual string debug_identifier() const = 0; + + // A human-readable representation of the code module's version. Empty on + // error. + virtual string version() const = 0; + + // Creates a new copy of this CodeModule object, which the caller takes + // ownership of. The new CodeModule may be of a different concrete class + // than the CodeModule being copied, but will behave identically to the + // copied CodeModule as far as the CodeModule interface is concerned. + virtual CodeModule* Copy() const = 0; + + // Getter and setter for shrink_down_delta. This is used when the address + // range for a module is shrunk down due to address range conflicts with + // other modules. The base_address and size fields are not updated and they + // should always reflect the original values (reported in the minidump). + virtual uint64_t shrink_down_delta() const = 0; + virtual void SetShrinkDownDelta(uint64_t shrink_down_delta) = 0; + + // Whether the module was unloaded from memory. + virtual bool is_unloaded() const = 0; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__ diff --git a/src/google_breakpad/processor/code_modules.h b/src/google_breakpad/processor/code_modules.h new file mode 100644 index 0000000..7538328 --- /dev/null +++ b/src/google_breakpad/processor/code_modules.h @@ -0,0 +1,107 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// code_modules.h: Contains all of the CodeModule objects that were loaded +// into a single process. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__ + +#include + +#include + +#include "google_breakpad/common/breakpad_types.h" +#include "processor/linked_ptr.h" + +namespace google_breakpad { + +class CodeModule; + +class CodeModules { + public: + virtual ~CodeModules() {} + + // The number of contained CodeModule objects. + virtual unsigned int module_count() const = 0; + + // Random access to modules. Returns the module whose code is present + // at the address indicated by |address|. If no module is present at this + // address, returns NULL. Ownership of the returned CodeModule is retained + // by the CodeModules object; pointers returned by this method are valid for + // comparison with pointers returned by the other Get methods. + virtual const CodeModule* GetModuleForAddress(uint64_t address) const = 0; + + // Returns the module corresponding to the main executable. If there is + // no main executable, returns NULL. Ownership of the returned CodeModule + // is retained by the CodeModules object; pointers returned by this method + // are valid for comparison with pointers returned by the other Get + // methods. + virtual const CodeModule* GetMainModule() const = 0; + + // Sequential access to modules. A sequence number of 0 corresponds to the + // module residing lowest in memory. If the sequence number is out of + // range, returns NULL. Ownership of the returned CodeModule is retained + // by the CodeModules object; pointers returned by this method are valid for + // comparison with pointers returned by the other Get methods. + virtual const CodeModule* GetModuleAtSequence( + unsigned int sequence) const = 0; + + // Sequential access to modules. This is similar to GetModuleAtSequence, + // except no ordering requirement is enforced. A CodeModules implementation + // may return CodeModule objects from GetModuleAtIndex in any order it + // wishes, provided that the order remain the same throughout the life of + // the CodeModules object. Typically, GetModuleAtIndex would be used by + // a caller to enumerate all CodeModule objects quickly when the enumeration + // does not require any ordering. If the index argument is out of range, + // returns NULL. Ownership of the returned CodeModule is retained by + // the CodeModules object; pointers returned by this method are valid for + // comparison with pointers returned by the other Get methods. + virtual const CodeModule* GetModuleAtIndex(unsigned int index) const = 0; + + // Creates a new copy of this CodeModules object, which the caller takes + // ownership of. The new object will also contain copies of the existing + // object's child CodeModule objects. The new CodeModules object may be of + // a different concrete class than the object being copied, but will behave + // identically to the copied object as far as the CodeModules and CodeModule + // interfaces are concerned, except that the order that GetModuleAtIndex + // returns objects in may differ between a copy and the original CodeModules + // object. + virtual const CodeModules* Copy() const = 0; + + // Returns a vector of all modules which address ranges needed to be shrunk + // down due to address range conflicts with other modules. + virtual std::vector > + GetShrunkRangeModules() const = 0; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__ diff --git a/src/google_breakpad/processor/dump_context.h b/src/google_breakpad/processor/dump_context.h new file mode 100644 index 0000000..7a1c643 --- /dev/null +++ b/src/google_breakpad/processor/dump_context.h @@ -0,0 +1,121 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dump_context.h: A (mini/micro) dump CPU-specific context. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_DUMP_CONTEXT_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_DUMP_CONTEXT_H__ + +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/dump_object.h" + +namespace google_breakpad { + +// DumpContext carries a CPU-specific MDRawContext structure, which contains CPU +// context such as register states. +class DumpContext : public DumpObject { + public: + virtual ~DumpContext(); + + // Returns an MD_CONTEXT_* value such as MD_CONTEXT_X86 or MD_CONTEXT_PPC + // identifying the CPU type that the context was collected from. The + // returned value will identify the CPU only, and will have any other + // MD_CONTEXT_* bits masked out. Returns 0 on failure. + uint32_t GetContextCPU() const; + + // Return the raw value of |context_flags_| + uint32_t GetContextFlags() const; + + // Returns raw CPU-specific context data for the named CPU type. If the + // context data does not match the CPU type or does not exist, returns NULL. + const MDRawContextAMD64* GetContextAMD64() const; + const MDRawContextARM* GetContextARM() const; + const MDRawContextARM64* GetContextARM64() const; + const MDRawContextMIPS* GetContextMIPS() const; + const MDRawContextPPC* GetContextPPC() const; + const MDRawContextPPC64* GetContextPPC64() const; + const MDRawContextSPARC* GetContextSPARC() const; + const MDRawContextX86* GetContextX86() const; + const MDRawContextRISCV* GetContextRISCV() const; + const MDRawContextRISCV64* GetContextRISCV64() const; + + // A convenience method to get the instruction pointer out of the + // MDRawContext, since it varies per-CPU architecture. + bool GetInstructionPointer(uint64_t* ip) const; + + // Similar to the GetInstructionPointer method, this method gets the stack + // pointer for all CPU architectures. + bool GetStackPointer(uint64_t* sp) const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + protected: + DumpContext(); + + // Sets row CPU-specific context data for the names CPU type. + void SetContextFlags(uint32_t context_flags); + void SetContextX86(MDRawContextX86* x86); + void SetContextPPC(MDRawContextPPC* ppc); + void SetContextPPC64(MDRawContextPPC64* ppc64); + void SetContextAMD64(MDRawContextAMD64* amd64); + void SetContextSPARC(MDRawContextSPARC* ctx_sparc); + void SetContextARM(MDRawContextARM* arm); + void SetContextARM64(MDRawContextARM64* arm64); + void SetContextMIPS(MDRawContextMIPS* ctx_mips); + void SetContextRISCV(MDRawContextRISCV* riscv); + void SetContextRISCV64(MDRawContextRISCV64* riscv64); + + // Free the CPU-specific context structure. + void FreeContext(); + + private: + // The CPU-specific context structure. + union { + MDRawContextBase* base; + MDRawContextX86* x86; + MDRawContextPPC* ppc; + MDRawContextPPC64* ppc64; + MDRawContextAMD64* amd64; + // on Solaris SPARC, sparc is defined as a numeric constant, + // so variables can NOT be named as sparc + MDRawContextSPARC* ctx_sparc; + MDRawContextARM* arm; + MDRawContextARM64* arm64; + MDRawContextMIPS* ctx_mips; + MDRawContextRISCV* riscv; + MDRawContextRISCV64* riscv64; + } context_; + + // Store this separately because of the weirdo AMD64 context + uint32_t context_flags_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_DUMP_CONTEXT_H__ diff --git a/src/google_breakpad/processor/dump_object.h b/src/google_breakpad/processor/dump_object.h new file mode 100644 index 0000000..0b1f488 --- /dev/null +++ b/src/google_breakpad/processor/dump_object.h @@ -0,0 +1,52 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dump_object.h: A base class for all mini/micro dump object. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_DUMP_OBJECT_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_DUMP_OBJECT_H__ + +namespace google_breakpad { + +// DumpObject is the base of various mini/micro dump's objects. +class DumpObject { + public: + DumpObject(); + + bool valid() const { return valid_; } + + protected: + // DumpObjects are not valid when created. When a subclass populates its own + // fields, it can set valid_ to true. Accessors and mutators may wish to + // consider or alter the valid_ state as they interact with objects. + bool valid_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_DUMP_OBJECT_H__ diff --git a/src/google_breakpad/processor/exception_record.h b/src/google_breakpad/processor/exception_record.h new file mode 100644 index 0000000..aa2b0de --- /dev/null +++ b/src/google_breakpad/processor/exception_record.h @@ -0,0 +1,123 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// exception_record.h: A snapshot of an exception record. +// +// Author: Ivan Penkov + +#ifndef THIRD_PARTY_BREAKPAD_SRC_GOOGLE_BREAKPAD_PROCESSOR_EXCEPTION_RECORD_H_ +#define THIRD_PARTY_BREAKPAD_SRC_GOOGLE_BREAKPAD_PROCESSOR_EXCEPTION_RECORD_H_ + +#include + +namespace google_breakpad { + +// Additional argument that describes the exception. +class ExceptionParameter { + public: + ExceptionParameter(uint64_t value, const string& description) + : value_(value), description_(description) {} + // Accessors. See the data declarations below. + uint64_t value() const { return value_; } + void set_value(uint64_t value) { value_ = value; } + const string& description() const { return description_; } + void set_description(const string& description) { + description_ = description; + } + + private: + // Parameter value. + uint64_t value_; + // Human readable description/interpretation of the above value. + string description_; +}; + +// A snapshot of an exception record. Contains exception record details: code, +// flags, address, parameters. +class ExceptionRecord { + public: + // Accessors. See the data declarations below. + uint32_t code() const { return code_; } + const string& code_description() const { return code_description_; } + void set_code(uint32_t code, const string& description) { + code_ = code; + code_description_ = description; + } + + uint32_t flags() const { return flags_; } + const string& flags_description() const { return flags_description_; } + void set_flags(uint32_t flags, const string& description) { + flags_ = flags; + flags_description_ = description; + } + + uint64_t nested_exception_record_address() const { + return nested_exception_record_address_; + } + void set_nested_exception_record_address( + uint64_t nested_exception_record_address) { + nested_exception_record_address_ = nested_exception_record_address; + } + + uint64_t address() const { return address_; } + void set_address(uint64_t address) { address_ = address; } + + const std::vector* parameters() const { + return ¶meters_; + } + void add_parameter(uint64_t value, const string& description) { + parameters_.push_back(ExceptionParameter(value, description)); + } + + private: + // Exception code. + uint32_t code_; + string code_description_; + + // Exception flags. + uint32_t flags_; + string flags_description_; + + // The address of an associated MDException structure. Exception records can + // be chained together to provide additional information when nested + // exceptions occur. + uint64_t nested_exception_record_address_; + + // The memory address that caused the exception. For data access errors, + // this will be the data address that caused the fault. For code errors, + // this will be the address of the instruction that caused the fault. + uint64_t address_; + + // An array of additional arguments that describe the exception. + std::vector parameters_; +}; + +} // namespace google_breakpad + + +#endif // THIRD_PARTY_BREAKPAD_SRC_GOOGLE_BREAKPAD_PROCESSOR_EXCEPTION_RECORD_H_ diff --git a/src/google_breakpad/processor/exploitability.h b/src/google_breakpad/processor/exploitability.h new file mode 100644 index 0000000..0b51ba1 --- /dev/null +++ b/src/google_breakpad/processor/exploitability.h @@ -0,0 +1,81 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// exploitability_engine.h: Generic exploitability engine. +// +// The Exploitability class is an abstract base class providing common +// generic methods that apply to exploitability engines for specific platforms. +// Specific implementations will extend this class by providing run +// methods to fill in the exploitability_ enumeration of the ProcessState +// for a crash. +// +// Author: Cris Neckar + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_H_ +#define GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_H_ + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/process_state.h" + +namespace google_breakpad { + +class Exploitability { + public: + virtual ~Exploitability() {} + + static Exploitability *ExploitabilityForPlatform(Minidump *dump, + ProcessState *process_state); + + // The boolean parameter signals whether the exploitability engine is + // enabled to call out to objdump for disassembly. This is disabled by + // default. It is used to check the identity of the instruction that + // caused the program to crash. This should not be enabled if there are + // portability concerns. + static Exploitability *ExploitabilityForPlatform(Minidump *dump, + ProcessState *process_state, + bool enable_objdump); + + ExploitabilityRating CheckExploitability(); + bool AddressIsAscii(uint64_t); + + protected: + Exploitability(Minidump *dump, + ProcessState *process_state); + + Minidump *dump_; + ProcessState *process_state_; + SystemInfo *system_info_; + + private: + virtual ExploitabilityRating CheckPlatformExploitability() = 0; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_H_ diff --git a/src/google_breakpad/processor/fast_source_line_resolver.h b/src/google_breakpad/processor/fast_source_line_resolver.h new file mode 100644 index 0000000..11cec75 --- /dev/null +++ b/src/google_breakpad/processor/fast_source_line_resolver.h @@ -0,0 +1,101 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// fast_source_line_resolver.h: FastSourceLineResolver is derived from +// SourceLineResolverBase, and is a concrete implementation of +// SourceLineResolverInterface. +// +// FastSourceLineResolver is a sibling class of BasicSourceLineResolver. The +// difference is FastSourceLineResolver loads a serialized memory chunk of data +// which can be used directly a Module without parsing or copying of underlying +// data. Therefore loading a symbol in FastSourceLineResolver is much faster +// and more memory-efficient than BasicSourceLineResolver. +// +// See "source_line_resolver_base.h" and +// "google_breakpad/source_line_resolver_interface.h" for more reference. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_FAST_SOURCE_LINE_RESOLVER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_FAST_SOURCE_LINE_RESOLVER_H__ + +#include +#include + +#include "google_breakpad/processor/source_line_resolver_base.h" + +namespace google_breakpad { + +using std::map; + +class FastSourceLineResolver : public SourceLineResolverBase { + public: + FastSourceLineResolver(); + virtual ~FastSourceLineResolver() { } + + using SourceLineResolverBase::FillSourceLineInfo; + using SourceLineResolverBase::FindCFIFrameInfo; + using SourceLineResolverBase::FindWindowsFrameInfo; + using SourceLineResolverBase::HasModule; + using SourceLineResolverBase::IsModuleCorrupt; + using SourceLineResolverBase::LoadModule; + using SourceLineResolverBase::LoadModuleUsingMapBuffer; + using SourceLineResolverBase::LoadModuleUsingMemoryBuffer; + using SourceLineResolverBase::UnloadModule; + + private: + // Friend declarations. + friend class ModuleComparer; + friend class ModuleSerializer; + friend class FastModuleFactory; + + // Nested types that will derive from corresponding nested types defined in + // SourceLineResolverBase. + struct Line; + struct Function; + struct Inline; + struct InlineOrigin; + struct PublicSymbol; + class Module; + + // Deserialize raw memory data to construct a WindowsFrameInfo object. + static WindowsFrameInfo CopyWFI(const char *raw_memory); + + // FastSourceLineResolver requires the memory buffer stays alive during the + // lifetime of a corresponding module, therefore it needs to redefine this + // virtual method. + virtual bool ShouldDeleteMemoryBufferAfterLoadModule(); + + // Disallow unwanted copy ctor and assignment operator + FastSourceLineResolver(const FastSourceLineResolver&); + void operator=(const FastSourceLineResolver&); +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_FAST_SOURCE_LINE_RESOLVER_H__ diff --git a/src/google_breakpad/processor/memory_region.h b/src/google_breakpad/processor/memory_region.h new file mode 100644 index 0000000..378fcc3 --- /dev/null +++ b/src/google_breakpad/processor/memory_region.h @@ -0,0 +1,78 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// memory_region.h: Access to memory regions. +// +// A MemoryRegion provides virtual access to a range of memory. It is an +// abstraction allowing the actual source of memory to be independent of +// methods which need to access a virtual memory space. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__ + + +#include "google_breakpad/common/breakpad_types.h" + + +namespace google_breakpad { + + +class MemoryRegion { + public: + virtual ~MemoryRegion() {} + + // The base address of this memory region. + virtual uint64_t GetBase() const = 0; + + // The size of this memory region. + virtual uint32_t GetSize() const = 0; + + // Access to data of various sizes within the memory region. address + // is a pointer to read, and it must lie within the memory region as + // defined by its base address and size. The location pointed to by + // value is set to the value at address. Byte-swapping is performed + // if necessary so that the value is appropriate for the running + // program. Returns true on success. Fails and returns false if address + // is out of the region's bounds (after considering the width of value), + // or for other types of errors. + virtual bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const = 0; + virtual bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const = 0; + virtual bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const = 0; + virtual bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const = 0; + + // Print a human-readable representation of the object to stdout. + virtual void Print() const = 0; +}; + + +} // namespace google_breakpad + + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__ diff --git a/src/google_breakpad/processor/microdump.h b/src/google_breakpad/processor/microdump.h new file mode 100644 index 0000000..7c2f3e6 --- /dev/null +++ b/src/google_breakpad/processor/microdump.h @@ -0,0 +1,134 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// microdump.h: A microdump reader. Microdump is a minified variant of a +// minidump (see minidump.h for documentation) which contains the minimum +// amount of information required to get a stack trace for the crashing thread. +// The information contained in a microdump is: +// - the crashing thread stack +// - system information (os type / version) +// - cpu context (state of the registers) +// - list of mmaps + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_H__ + +#include +#include + +#include "common/scoped_ptr.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/dump_context.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/basic_code_modules.h" + +namespace google_breakpad { + +// MicrodumpModuleList contains all of the loaded code modules for a process +// in the form of MicrodumpModules. It maintains a vector of these modules +// and provides access to a code module corresponding to a specific address. +class MicrodumpModules : public BasicCodeModules { + public: + // Takes over ownership of |module|. + void Add(const CodeModule* module); + + // Enables/disables module address range shrink. + void SetEnableModuleShrink(bool is_enabled); +}; + +// MicrodumpContext carries a CPU-specific context. +// See dump_context.h for documentation. +class MicrodumpContext : public DumpContext { + public: + virtual void SetContextARM(MDRawContextARM* arm); + virtual void SetContextARM64(MDRawContextARM64* arm64); + virtual void SetContextX86(MDRawContextX86* x86); + virtual void SetContextMIPS(MDRawContextMIPS* mips32); + virtual void SetContextMIPS64(MDRawContextMIPS* mips64); +}; + +// This class provides access to microdump memory regions. +// See memory_region.h for documentation. +class MicrodumpMemoryRegion : public MemoryRegion { + public: + MicrodumpMemoryRegion(); + virtual ~MicrodumpMemoryRegion() {} + + // Set this region's address and contents. If we have placed an + // instance of this class in a test fixture class, individual tests + // can use this to provide the region's contents. + void Init(uint64_t base_address, const std::vector& contents); + + virtual uint64_t GetBase() const; + virtual uint32_t GetSize() const; + + virtual bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const; + virtual bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const; + virtual bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const; + virtual bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const; + + // Print a human-readable representation of the object to stdout. + virtual void Print() const; + + private: + // Fetch a little-endian value from ADDRESS in contents_ whose size + // is BYTES, and store it in *VALUE. Returns true on success. + template + bool GetMemoryLittleEndian(uint64_t address, ValueType* value) const; + + uint64_t base_address_; + std::vector contents_; +}; + +// Microdump is the user's interface to a microdump file. It provides access to +// the microdump's context, memory regions and modules. +class Microdump { + public: + explicit Microdump(const string& contents); + virtual ~Microdump() {} + + DumpContext* GetContext() { return context_.get(); } + MicrodumpMemoryRegion* GetMemory() { return stack_region_.get(); } + MicrodumpModules* GetModules() { return modules_.get(); } + SystemInfo* GetSystemInfo() { return system_info_.get(); } + + string GetCrashReason() { return crash_reason_; } + uint64_t GetCrashAddress() { return crash_address_; } + private: + scoped_ptr context_; + scoped_ptr stack_region_; + scoped_ptr modules_; + scoped_ptr system_info_; + string crash_reason_; + uint64_t crash_address_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_H__ diff --git a/src/google_breakpad/processor/microdump_processor.h b/src/google_breakpad/processor/microdump_processor.h new file mode 100644 index 0000000..abf468f --- /dev/null +++ b/src/google_breakpad/processor/microdump_processor.h @@ -0,0 +1,63 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// The processor for microdump (a reduced dump containing only the state of the +// crashing thread). See crbug.com/410294 for more info and design docs. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_PROCESSOR_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_PROCESSOR_H__ + +#include + +#include "common/using_std_string.h" +#include "google_breakpad/processor/process_result.h" + +namespace google_breakpad { + +class Microdump; +class ProcessState; +class StackFrameSymbolizer; + +class MicrodumpProcessor { + public: + // Initializes the MicrodumpProcessor with a stack frame symbolizer. + // Does not take ownership of frame_symbolizer, which must NOT be NULL. + explicit MicrodumpProcessor(StackFrameSymbolizer* frame_symbolizer); + + virtual ~MicrodumpProcessor(); + + // Processes the microdump contents and fills process_state with the result. + google_breakpad::ProcessResult Process(Microdump* microdump, + ProcessState* process_state); + private: + StackFrameSymbolizer* frame_symbolizer_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MICRODUMP_PROCESSOR_H__ diff --git a/src/google_breakpad/processor/minidump.h b/src/google_breakpad/processor/minidump.h new file mode 100644 index 0000000..e523ab3 --- /dev/null +++ b/src/google_breakpad/processor/minidump.h @@ -0,0 +1,1454 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump.h: A minidump reader. +// +// The basic structure of this module tracks the structure of the minidump +// file itself. At the top level, a minidump file is represented by a +// Minidump object. Like most other classes in this module, Minidump +// provides a Read method that initializes the object with information from +// the file. Most of the classes in this file are wrappers around the +// "raw" structures found in the minidump file itself, and defined in +// minidump_format.h. For example, each thread is represented by a +// MinidumpThread object, whose parameters are specified in an MDRawThread +// structure. A properly byte-swapped MDRawThread can be obtained from a +// MinidumpThread easily by calling its thread() method. +// +// Most of the module lazily reads only the portion of the minidump file +// necessary to fulfill the user's request. Calling Minidump::Read +// only reads the minidump's directory. The thread list is not read until +// it is needed, and even once it's read, the memory regions for each +// thread's stack aren't read until they're needed. This strategy avoids +// unnecessary file input, and allocating memory for data in which the user +// has no interest. Note that although memory allocations for a typical +// minidump file are not particularly large, it is possible for legitimate +// minidumps to be sizable. A full-memory minidump, for example, contains +// a snapshot of the entire mapped memory space. Even a normal minidump, +// with stack memory only, can be large if, for example, the dump was +// generated in response to a crash that occurred due to an infinite- +// recursion bug that caused the stack's limits to be exceeded. Finally, +// some users of this library will unfortunately find themselves in the +// position of having to process potentially-hostile minidumps that might +// attempt to cause problems by forcing the minidump processor to over- +// allocate memory. +// +// Memory management in this module is based on a strict +// you-don't-own-anything policy. The only object owned by the user is +// the top-level Minidump object, the creation and destruction of which +// must be the user's own responsibility. All other objects obtained +// through interaction with this module are ultimately owned by the +// Minidump object, and will be freed upon the Minidump object's destruction. +// Because memory regions can potentially involve large allocations, a +// FreeMemory method is provided by MinidumpMemoryRegion, allowing the user +// to release data when it is no longer needed. Use of this method is +// optional but recommended. If freed data is later required, it will +// be read back in from the minidump file again. +// +// There is one exception to this memory management policy: +// Minidump::ReadString will return a string object to the user, and the user +// is responsible for its deletion. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__ + +#include + +#ifndef _WIN32 +#include +#endif + +#include +#include +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/dump_context.h" +#include "google_breakpad/processor/dump_object.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/proc_maps_linux.h" + + +namespace google_breakpad { + + +using std::map; +using std::vector; + + +class Minidump; +template class RangeMap; + + +// MinidumpObject is the base of all Minidump* objects except for Minidump +// itself. +class MinidumpObject : public DumpObject { + public: + virtual ~MinidumpObject() = default; + + protected: + explicit MinidumpObject(Minidump* minidump); + + // Refers to the Minidump object that is the ultimate parent of this + // Some MinidumpObjects are owned by other MinidumpObjects, but at the + // root of the ownership tree is always a Minidump. The Minidump object + // is kept here for access to its seeking and reading facilities, and + // for access to data about the minidump file itself, such as whether + // it should be byte-swapped. + Minidump* minidump_; +}; + + +// This class exists primarily to provide a virtual destructor in a base +// class common to all objects that might be stored in +// Minidump::mStreamObjects. Some object types will never be stored in +// Minidump::mStreamObjects, but are represented as streams and adhere to the +// same interface, and may be derived from this class. +class MinidumpStream : public MinidumpObject { + public: + MinidumpStream(const MinidumpStream&) = delete; + void operator=(const MinidumpStream&) = delete; + ~MinidumpStream() override = default; + + protected: + explicit MinidumpStream(Minidump* minidump); + + private: + // Populate (and validate) the MinidumpStream. minidump_ is expected + // to be positioned at the beginning of the stream, so that the next + // read from the minidump will be at the beginning of the stream. + // expected_size should be set to the stream's length as contained in + // the MDRawDirectory record or other identifying record. A class + // that implements MinidumpStream can compare expected_size to a + // known size as an integrity check. + virtual bool Read(uint32_t expected_size) = 0; +}; + + +// MinidumpContext carries a CPU-specific MDRawContext structure, which +// contains CPU context such as register states. Each thread has its +// own context, and the exception record, if present, also has its own +// context. Note that if the exception record is present, the context it +// refers to is probably what the user wants to use for the exception +// thread, instead of that thread's own context. The exception thread's +// context (as opposed to the exception record's context) will contain +// context for the exception handler (which performs minidump generation), +// and not the context that caused the exception (which is probably what the +// user wants). +class MinidumpContext : public DumpContext { + public: + MinidumpContext(const MinidumpContext&) = delete; + void operator=(const MinidumpContext&) = delete; + ~MinidumpContext() override; + + protected: + explicit MinidumpContext(Minidump* minidump); + + private: + friend class MinidumpThread; + friend class MinidumpException; + + bool Read(uint32_t expected_size); + + // If the minidump contains a SYSTEM_INFO_STREAM, makes sure that the + // system info stream gives an appropriate CPU type matching the context + // CPU type in context_cpu_type. Returns false if the CPU type does not + // match. Returns true if the CPU type matches or if the minidump does + // not contain a system info stream. + bool CheckAgainstSystemInfo(uint32_t context_cpu_type); + + // Refers to the Minidump object that is the ultimate parent of this + // Some MinidumpObjects are owned by other MinidumpObjects, but at the + // root of the ownership tree is always a Minidump. The Minidump object + // is kept here for access to its seeking and reading facilities, and + // for access to data about the minidump file itself, such as whether + // it should be byte-swapped. + Minidump* minidump_; +}; + + +// MinidumpMemoryRegion does not wrap any MDRaw structure, and only contains +// a reference to an MDMemoryDescriptor. This object is intended to wrap +// portions of a minidump file that contain memory dumps. In normal +// minidumps, each MinidumpThread owns a MinidumpMemoryRegion corresponding +// to the thread's stack memory. MinidumpMemoryList also gives access to +// memory regions in its list as MinidumpMemoryRegions. This class +// adheres to MemoryRegion so that it may be used as a data provider to +// the Stackwalker family of classes. +class MinidumpMemoryRegion : public MinidumpObject, + public MemoryRegion { + public: + ~MinidumpMemoryRegion() override; + + static void set_max_bytes(uint32_t max_bytes) { max_bytes_ = max_bytes; } + static uint32_t max_bytes() { return max_bytes_; } + + // Returns a pointer to the base of the memory region. Returns the + // cached value if available, otherwise, reads the minidump file and + // caches the memory region. + const uint8_t* GetMemory() const; + + // The address of the base of the memory region. + uint64_t GetBase() const override; + + // The size, in bytes, of the memory region. + uint32_t GetSize() const override; + + // Frees the cached memory region, if cached. + void FreeMemory(); + + // Obtains the value of memory at the pointer specified by address. + bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const override; + bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const override; + bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const override; + bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const override; + + // Print a human-readable representation of the object to stdout. + void Print() const override; + void SetPrintMode(bool hexdump, unsigned int width); + + protected: + explicit MinidumpMemoryRegion(Minidump* minidump); + + private: + friend class MinidumpThread; + friend class MinidumpMemoryList; + + // Identify the base address and size of the memory region, and the + // location it may be found in the minidump file. + void SetDescriptor(MDMemoryDescriptor* descriptor); + + // Implementation for GetMemoryAtAddress + template bool GetMemoryAtAddressInternal(uint64_t address, + T* value) const; + + // Knobs for controlling display of memory printing. + bool hexdump_; + unsigned int hexdump_width_; + + // The largest memory region that will be read from a minidump. + static uint32_t max_bytes_; + + // Base address and size of the memory region, and its position in the + // minidump file. + MDMemoryDescriptor* descriptor_; + + // Cached memory. + mutable vector* memory_; +}; + + +// MinidumpThread contains information about a thread of execution, +// including a snapshot of the thread's stack and CPU context. For +// the thread that caused an exception, the context carried by +// MinidumpException is probably desired instead of the CPU context +// provided here. +// Note that a MinidumpThread may be valid() even if it does not +// contain a memory region or context. +class MinidumpThread : public MinidumpObject { + public: + ~MinidumpThread() override; + + const MDRawThread* thread() const { return valid_ ? &thread_ : nullptr; } + // GetMemory may return NULL even if the MinidumpThread is valid, + // if the thread memory cannot be read. + virtual MinidumpMemoryRegion* GetMemory(); + // GetContext may return NULL even if the MinidumpThread is valid. + virtual MinidumpContext* GetContext(); + + // The thread ID is used to determine if a thread is the exception thread, + // so a special getter is provided to retrieve this data from the + // MDRawThread structure. Returns false if the thread ID cannot be + // determined. + virtual bool GetThreadID(uint32_t* thread_id) const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + // Returns the start address of the thread stack memory region. Returns 0 if + // MinidumpThread is invalid. Note that this method can be called even when + // the thread memory cannot be read and GetMemory returns NULL. + virtual uint64_t GetStartOfStackMemoryRange() const; + + protected: + explicit MinidumpThread(Minidump* minidump); + + private: + // These objects are managed by MinidumpThreadList. + friend class MinidumpThreadList; + + // This works like MinidumpStream::Read, but is driven by + // MinidumpThreadList. No size checking is done, because + // MinidumpThreadList handles that directly. + bool Read(); + + MDRawThread thread_; + MinidumpMemoryRegion* memory_; + MinidumpContext* context_; +}; + + +// MinidumpThreadList contains all of the threads (as MinidumpThreads) in +// a process. +class MinidumpThreadList : public MinidumpStream { + public: + MinidumpThreadList(const MinidumpThreadList&) = delete; + void operator=(const MinidumpThreadList&) = delete; + ~MinidumpThreadList() override; + + static void set_max_threads(uint32_t max_threads) { + max_threads_ = max_threads; + } + static uint32_t max_threads() { return max_threads_; } + + virtual unsigned int thread_count() const { + return valid_ ? thread_count_ : 0; + } + + // Sequential access to threads. + virtual MinidumpThread* GetThreadAtIndex(unsigned int index) const; + + // Random access to threads. + MinidumpThread* GetThreadByID(uint32_t thread_id); + + // Print a human-readable representation of the object to stdout. + void Print(); + + protected: + explicit MinidumpThreadList(Minidump* aMinidump); + + private: + friend class Minidump; + + typedef map IDToThreadMap; + typedef vector MinidumpThreads; + + static const uint32_t kStreamType = MD_THREAD_LIST_STREAM; + + bool Read(uint32_t aExpectedSize) override; + + // The largest number of threads that will be read from a minidump. The + // default is 256. + static uint32_t max_threads_; + + // Access to threads using the thread ID as the key. + IDToThreadMap id_to_thread_map_; + + // The list of threads. + MinidumpThreads* threads_; + uint32_t thread_count_; +}; + +// MinidumpThreadName contains the name of a thread. +class MinidumpThreadName : public MinidumpObject { + public: + ~MinidumpThreadName() override; + + const MDRawThreadName* thread_name() const { + return valid_ ? &thread_name_ : nullptr; + } + + // Gets the thread ID. + virtual bool GetThreadID(uint32_t* thread_id) const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + // Returns the name of the thread. + virtual std::string GetThreadName() const; + + protected: + explicit MinidumpThreadName(Minidump* minidump); + + private: + // These objects are managed by MinidumpThreadNameList. + friend class MinidumpThreadNameList; + + // This works like MinidumpStream::Read, but is driven by + // MinidumpThreadNameList. No size checking is done, because + // MinidumpThreadNameList handles that directly. + bool Read(); + + // Reads indirectly-referenced data, including the thread name. + bool ReadAuxiliaryData(); + + // True after a successful Read. This is different from valid_, which is not + // set true until ReadAuxiliaryData also completes successfully. + // thread_name_valid_ is only used by ReadAuxiliaryData and the functions it + // calls to determine whether the object is ready for auxiliary data to be + // read. + bool thread_name_valid_; + + MDRawThreadName thread_name_; + + // Cached thread name. + const string* name_; +}; + +// MinidumpThreadNameList contains all of the names of the threads (as +// MinidumpThreadNames) in a process. +class MinidumpThreadNameList : public MinidumpStream { + public: + MinidumpThreadNameList(const MinidumpThreadNameList&) = delete; + void operator=(const MinidumpThreadNameList&) = delete; + ~MinidumpThreadNameList() override; + + virtual unsigned int thread_name_count() const { + return valid_ ? thread_name_count_ : 0; + } + + // Sequential access to thread names. + virtual MinidumpThreadName* GetThreadNameAtIndex(unsigned int index) const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + protected: + explicit MinidumpThreadNameList(Minidump* aMinidump); + + private: + friend class Minidump; + + typedef vector MinidumpThreadNames; + + static const uint32_t kStreamType = MD_THREAD_NAME_LIST_STREAM; + + bool Read(uint32_t aExpectedSize) override; + + // The list of thread names. + MinidumpThreadNames* thread_names_; + uint32_t thread_name_count_; +}; + +// MinidumpModule wraps MDRawModule, which contains information about loaded +// code modules. Access is provided to various data referenced indirectly +// by MDRawModule, such as the module's name and a specification for where +// to locate debugging information for the module. +class MinidumpModule : public MinidumpObject, + public CodeModule { + public: + ~MinidumpModule() override; + + static void set_max_cv_bytes(uint32_t max_cv_bytes) { + max_cv_bytes_ = max_cv_bytes; + } + static uint32_t max_cv_bytes() { return max_cv_bytes_; } + + static void set_max_misc_bytes(uint32_t max_misc_bytes) { + max_misc_bytes_ = max_misc_bytes; + } + static uint32_t max_misc_bytes() { return max_misc_bytes_; } + + const MDRawModule* module() const { return valid_ ? &module_ : nullptr; } + + // CodeModule implementation + uint64_t base_address() const override { + return valid_ ? module_.base_of_image : static_cast(-1); + } + uint64_t size() const override { return valid_ ? module_.size_of_image : 0; } + string code_file() const override; + string code_identifier() const override; + string debug_file() const override; + string debug_identifier() const override; + string version() const override; + CodeModule* Copy() const override; + bool is_unloaded() const override { return false; } + + // Getter and setter for shrink_down_delta. This is used when the address + // range for a module is shrunk down due to address range conflicts with + // other modules. The base_address and size fields are not updated and they + // should always reflect the original values (reported in the minidump). + uint64_t shrink_down_delta() const override; + void SetShrinkDownDelta(uint64_t shrink_down_delta) override; + + // The CodeView record, which contains information to locate the module's + // debugging information (pdb). This is returned as uint8_t* because + // the data can be of types MDCVInfoPDB20* or MDCVInfoPDB70*, or it may be + // of a type unknown to Breakpad, in which case the raw data will still be + // returned but no byte-swapping will have been performed. Check the + // record's signature in the first four bytes to differentiate between + // the various types. Current toolchains generate modules which carry + // MDCVInfoPDB70 by default. Returns a pointer to the CodeView record on + // success, and NULL on failure. On success, the optional |size| argument + // is set to the size of the CodeView record. + const uint8_t* GetCVRecord(uint32_t* size); + + // The miscellaneous debug record, which is obsolete. Current toolchains + // do not generate this type of debugging information (dbg), and this + // field is not expected to be present. Returns a pointer to the debugging + // record on success, and NULL on failure. On success, the optional |size| + // argument is set to the size of the debugging record. + const MDImageDebugMisc* GetMiscRecord(uint32_t* size); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + // These objects are managed by MinidumpModuleList. + friend class MinidumpModuleList; + + explicit MinidumpModule(Minidump* minidump); + + // This works like MinidumpStream::Read, but is driven by + // MinidumpModuleList. No size checking is done, because + // MinidumpModuleList handles that directly. + bool Read(); + + // Reads indirectly-referenced data, including the module name, CodeView + // record, and miscellaneous debugging record. This is necessary to allow + // MinidumpModuleList to fully construct MinidumpModule objects without + // requiring seeks to read a contiguous set of MinidumpModule objects. + // All auxiliary data should be available when Read is called, in order to + // allow the CodeModule getters to be const methods. + bool ReadAuxiliaryData(); + + // The largest number of bytes that will be read from a minidump for a + // CodeView record or miscellaneous debugging record, respectively. The + // default for each is 1024. + static uint32_t max_cv_bytes_; + static uint32_t max_misc_bytes_; + + // True after a successful Read. This is different from valid_, which is + // not set true until ReadAuxiliaryData also completes successfully. + // module_valid_ is only used by ReadAuxiliaryData and the functions it + // calls to determine whether the object is ready for auxiliary data to + // be read. + bool module_valid_; + + // True if debug info was read from the module. Certain modules + // may contain debug records in formats we don't support, + // so we can just set this to false to ignore them. + bool has_debug_info_; + + MDRawModule module_; + + // Cached module name. + const string* name_; + + // Cached CodeView record - this is MDCVInfoPDB20 or (likely) + // MDCVInfoPDB70, or possibly something else entirely. Stored as a uint8_t + // because the structure contains a variable-sized string and its exact + // size cannot be known until it is processed. + vector* cv_record_; + + // If cv_record_ is present, cv_record_signature_ contains a copy of the + // CodeView record's first four bytes, for ease of determinining the + // type of structure that cv_record_ contains. + uint32_t cv_record_signature_; + + // Cached MDImageDebugMisc (usually not present), stored as uint8_t + // because the structure contains a variable-sized string and its exact + // size cannot be known until it is processed. + vector* misc_record_; +}; + + +// MinidumpModuleList contains all of the loaded code modules for a process +// in the form of MinidumpModules. It maintains a map of these modules +// so that it may easily provide a code module corresponding to a specific +// address. +class MinidumpModuleList : public MinidumpStream, + public CodeModules { + public: + MinidumpModuleList(const MinidumpModuleList&) = delete; + void operator=(const MinidumpModuleList&) = delete; + ~MinidumpModuleList() override; + + static void set_max_modules(uint32_t max_modules) { + max_modules_ = max_modules; + } + static uint32_t max_modules() { return max_modules_; } + + // CodeModules implementation. + unsigned int module_count() const override { + return valid_ ? module_count_ : 0; + } + const MinidumpModule* GetModuleForAddress(uint64_t address) const override; + const MinidumpModule* GetMainModule() const override; + const MinidumpModule* GetModuleAtSequence( + unsigned int sequence) const override; + const MinidumpModule* GetModuleAtIndex(unsigned int index) const override; + const CodeModules* Copy() const override; + + // Returns a vector of all modules which address ranges needed to be shrunk + // down due to address range conflicts with other modules. + vector> GetShrunkRangeModules() const override; + + // Print a human-readable representation of the object to stdout. + void Print(); + + protected: + explicit MinidumpModuleList(Minidump* minidump); + + private: + friend class Minidump; + + typedef vector MinidumpModules; + + static const uint32_t kStreamType = MD_MODULE_LIST_STREAM; + + bool Read(uint32_t expected_size) override; + + bool StoreRange(const MinidumpModule& module, + uint64_t base_address, + uint32_t module_index, + uint32_t module_count, + bool is_android); + + // The largest number of modules that will be read from a minidump. The + // default is 1024. + static uint32_t max_modules_; + + // Access to modules using addresses as the key. + RangeMap* range_map_; + + MinidumpModules* modules_; + uint32_t module_count_; +}; + + +// MinidumpMemoryList corresponds to a minidump's MEMORY_LIST_STREAM stream, +// which references the snapshots of all of the memory regions contained +// within the minidump. For a normal minidump, this includes stack memory +// (also referenced by each MinidumpThread, in fact, the MDMemoryDescriptors +// here and in MDRawThread both point to exactly the same data in a +// minidump file, conserving space), as well as a 256-byte snapshot of memory +// surrounding the instruction pointer in the case of an exception. Other +// types of minidumps may contain significantly more memory regions. Full- +// memory minidumps contain all of a process' mapped memory. +class MinidumpMemoryList : public MinidumpStream { + public: + MinidumpMemoryList(const MinidumpMemoryList&) = delete; + void operator=(const MinidumpMemoryList&) = delete; + ~MinidumpMemoryList() override; + + static void set_max_regions(uint32_t max_regions) { + max_regions_ = max_regions; + } + static uint32_t max_regions() { return max_regions_; } + + unsigned int region_count() const { return valid_ ? region_count_ : 0; } + + // Sequential access to memory regions. + MinidumpMemoryRegion* GetMemoryRegionAtIndex(unsigned int index); + + // Random access to memory regions. Returns the region encompassing + // the address identified by address. + virtual MinidumpMemoryRegion* GetMemoryRegionForAddress(uint64_t address); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + friend class MockMinidumpMemoryList; + + typedef vector MemoryDescriptors; + typedef vector MemoryRegions; + + static const uint32_t kStreamType = MD_MEMORY_LIST_STREAM; + + explicit MinidumpMemoryList(Minidump* minidump); + + bool Read(uint32_t expected_size) override; + + // The largest number of memory regions that will be read from a minidump. + // The default is 256. + static uint32_t max_regions_; + + // Access to memory regions using addresses as the key. + RangeMap* range_map_; + + // The list of descriptors. This is maintained separately from the list + // of regions, because MemoryRegion doesn't own its MemoryDescriptor, it + // maintains a pointer to it. descriptors_ provides the storage for this + // purpose. + MemoryDescriptors* descriptors_; + + // The list of regions. + MemoryRegions* regions_; + uint32_t region_count_; +}; + + +// MinidumpException wraps MDRawExceptionStream, which contains information +// about the exception that caused the minidump to be generated, if the +// minidump was generated in an exception handler called as a result of an +// exception. It also provides access to a MinidumpContext object, which +// contains the CPU context for the exception thread at the time the exception +// occurred. +class MinidumpException : public MinidumpStream { + public: + MinidumpException(const MinidumpException&) = delete; + void operator=(const MinidumpException&) = delete; + ~MinidumpException() override; + + const MDRawExceptionStream* exception() const { + return valid_ ? &exception_ : nullptr; + } + + // The thread ID is used to determine if a thread is the exception thread, + // so a special getter is provided to retrieve this data from the + // MDRawExceptionStream structure. Returns false if the thread ID cannot + // be determined. + bool GetThreadID(uint32_t* thread_id) const; + + MinidumpContext* GetContext(); + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const uint32_t kStreamType = MD_EXCEPTION_STREAM; + + explicit MinidumpException(Minidump* minidump); + + bool Read(uint32_t expected_size) override; + + MDRawExceptionStream exception_; + MinidumpContext* context_; +}; + +// MinidumpAssertion wraps MDRawAssertionInfo, which contains information +// about an assertion that caused the minidump to be generated. +class MinidumpAssertion : public MinidumpStream { + public: + MinidumpAssertion(const MinidumpAssertion&) = delete; + void operator=(const MinidumpAssertion&) = delete; + ~MinidumpAssertion() override; + + const MDRawAssertionInfo* assertion() const { + return valid_ ? &assertion_ : nullptr; + } + + string expression() const { + return valid_ ? expression_ : ""; + } + + string function() const { + return valid_ ? function_ : ""; + } + + string file() const { + return valid_ ? file_ : ""; + } + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const uint32_t kStreamType = MD_ASSERTION_INFO_STREAM; + + explicit MinidumpAssertion(Minidump* minidump); + + bool Read(uint32_t expected_size) override; + + MDRawAssertionInfo assertion_; + string expression_; + string function_; + string file_; +}; + + +// MinidumpSystemInfo wraps MDRawSystemInfo and provides information about +// the system on which the minidump was generated. See also MinidumpMiscInfo. +class MinidumpSystemInfo : public MinidumpStream { + public: + MinidumpSystemInfo(const MinidumpSystemInfo&) = delete; + void operator=(const MinidumpSystemInfo&) = delete; + ~MinidumpSystemInfo() override; + + const MDRawSystemInfo* system_info() const { + return valid_ ? &system_info_ : nullptr; + } + + // GetOS and GetCPU return textual representations of the operating system + // and CPU that produced the minidump. Unlike most other Minidump* methods, + // they return string objects, not weak pointers. Defined values for + // GetOS() are "mac", "windows", and "linux". Defined values for GetCPU + // are "x86" and "ppc". These methods return an empty string when their + // values are unknown. + string GetOS(); + string GetCPU(); + + // I don't know what CSD stands for, but this field is documented as + // returning a textual representation of the OS service pack. On other + // platforms, this provides additional information about an OS version + // level beyond major.minor.micro. Returns NULL if unknown. + const string* GetCSDVersion(); + + // If a CPU vendor string can be determined, returns a pointer to it, + // otherwise, returns NULL. CPU vendor strings can be determined from + // x86 CPUs with CPUID 0. + const string* GetCPUVendor(); + + // Print a human-readable representation of the object to stdout. + void Print(); + + protected: + explicit MinidumpSystemInfo(Minidump* minidump); + MDRawSystemInfo system_info_; + + // Textual representation of the OS service pack, for minidumps produced + // by MiniDumpWriteDump on Windows. + const string* csd_version_; + + private: + friend class Minidump; + + static const uint32_t kStreamType = MD_SYSTEM_INFO_STREAM; + + bool Read(uint32_t expected_size) override; + + // A string identifying the CPU vendor, if known. + const string* cpu_vendor_; +}; + + +// MinidumpUnloadedModule wraps MDRawUnloadedModule +class MinidumpUnloadedModule : public MinidumpObject, + public CodeModule { + public: + ~MinidumpUnloadedModule() override; + + const MDRawUnloadedModule* module() const { + return valid_ ? &unloaded_module_ : nullptr; + } + + // CodeModule implementation + uint64_t base_address() const override { + return valid_ ? unloaded_module_.base_of_image : 0; + } + uint64_t size() const override { + return valid_ ? unloaded_module_.size_of_image : 0; + } + string code_file() const override; + string code_identifier() const override; + string debug_file() const override; + string debug_identifier() const override; + string version() const override; + CodeModule* Copy() const override; + bool is_unloaded() const override { return true; } + uint64_t shrink_down_delta() const override; + void SetShrinkDownDelta(uint64_t shrink_down_delta) override; + + protected: + explicit MinidumpUnloadedModule(Minidump* minidump); + + private: + // These objects are managed by MinidumpUnloadedModuleList + friend class MinidumpUnloadedModuleList; + + // This works like MinidumpStream::Read, but is driven by + // MinidumpUnloadedModuleList. + bool Read(uint32_t expected_size); + + // Reads the module name. This is done separately from Read to + // allow contiguous reading of code modules by MinidumpUnloadedModuleList. + bool ReadAuxiliaryData(); + + // True after a successful Read. This is different from valid_, which + // is not set true until ReadAuxiliaryData also completes successfully. + // module_valid_ is only used by ReadAuxiliaryData and the functions it + // calls to determine whether the object is ready for auxiliary data to + // be read. + bool module_valid_; + + MDRawUnloadedModule unloaded_module_; + + // Cached module name + const string* name_; +}; + + +// MinidumpUnloadedModuleList contains all the unloaded code modules for a +// process in the form of MinidumpUnloadedModules. It maintains a map of +// these modules so that it may easily provide a code module corresponding +// to a specific address. If multiple modules in the list have identical +// ranges, only the first module encountered is recorded in the range map. +class MinidumpUnloadedModuleList : public MinidumpStream, + public CodeModules { + public: + MinidumpUnloadedModuleList(const MinidumpUnloadedModuleList&) = delete; + void operator=(const MinidumpUnloadedModuleList&) = delete; + ~MinidumpUnloadedModuleList() override; + + static void set_max_modules(uint32_t max_modules) { + max_modules_ = max_modules; + } + static uint32_t max_modules() { return max_modules_; } + + // CodeModules implementation. + unsigned int module_count() const override { + return valid_ ? module_count_ : 0; + } + const MinidumpUnloadedModule* + GetModuleForAddress(uint64_t address) const override; + const MinidumpUnloadedModule* GetMainModule() const override; + const MinidumpUnloadedModule* + GetModuleAtSequence(unsigned int sequence) const override; + const MinidumpUnloadedModule* + GetModuleAtIndex(unsigned int index) const override; + const CodeModules* Copy() const override; + vector> GetShrunkRangeModules() const override; + + protected: + explicit MinidumpUnloadedModuleList(Minidump* minidump_); + + private: + friend class Minidump; + + typedef vector MinidumpUnloadedModules; + + static const uint32_t kStreamType = MD_UNLOADED_MODULE_LIST_STREAM; + + bool Read(uint32_t expected_size_) override; + + // The largest number of modules that will be read from a minidump. The + // default is 1024. + static uint32_t max_modules_; + + // Access to module indices using addresses as the key. + RangeMap* range_map_; + + MinidumpUnloadedModules* unloaded_modules_; + uint32_t module_count_; +}; + + +// MinidumpMiscInfo wraps MDRawMiscInfo and provides information about +// the process that generated the minidump, and optionally additional system +// information. See also MinidumpSystemInfo. +class MinidumpMiscInfo : public MinidumpStream { + public: + MinidumpMiscInfo(const MinidumpMiscInfo&) = delete; + void operator=(const MinidumpMiscInfo&) = delete; + + const MDRawMiscInfo* misc_info() const { + return valid_ ? &misc_info_ : nullptr; + } + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + friend class TestMinidumpMiscInfo; + + static const uint32_t kStreamType = MD_MISC_INFO_STREAM; + + explicit MinidumpMiscInfo(Minidump* minidump_); + + bool Read(uint32_t expected_size_) override; + + MDRawMiscInfo misc_info_; + + // Populated by Read. Contains the converted strings from the corresponding + // UTF-16 fields in misc_info_ + string standard_name_; + string daylight_name_; + string build_string_; + string dbg_bld_str_; +}; + + +// MinidumpBreakpadInfo wraps MDRawBreakpadInfo, which is an optional stream in +// a minidump that provides additional information about the process state +// at the time the minidump was generated. +class MinidumpBreakpadInfo : public MinidumpStream { + public: + MinidumpBreakpadInfo(const MinidumpBreakpadInfo&) = delete; + void operator=(const MinidumpBreakpadInfo&) = delete; + + const MDRawBreakpadInfo* breakpad_info() const { + return valid_ ? &breakpad_info_ : nullptr; + } + + // These thread IDs are used to determine if threads deserve special + // treatment, so special getters are provided to retrieve this data from + // the MDRawBreakpadInfo structure. The getters return false if the thread + // IDs cannot be determined. + bool GetDumpThreadID(uint32_t* thread_id) const; + bool GetRequestingThreadID(uint32_t* thread_id) const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const uint32_t kStreamType = MD_BREAKPAD_INFO_STREAM; + + explicit MinidumpBreakpadInfo(Minidump* minidump_); + + bool Read(uint32_t expected_size_) override; + + MDRawBreakpadInfo breakpad_info_; +}; + +// MinidumpMemoryInfo wraps MDRawMemoryInfo, which provides information +// about mapped memory regions in a process, including their ranges +// and protection. +class MinidumpMemoryInfo : public MinidumpObject { + public: + const MDRawMemoryInfo* info() const { + return valid_ ? &memory_info_ : nullptr; + } + + // The address of the base of the memory region. + uint64_t GetBase() const { return valid_ ? memory_info_.base_address : 0; } + + // The size, in bytes, of the memory region. + uint64_t GetSize() const { return valid_ ? memory_info_.region_size : 0; } + + // Return true if the memory protection allows execution. + bool IsExecutable() const; + + // Return true if the memory protection allows writing. + bool IsWritable() const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + // These objects are managed by MinidumpMemoryInfoList. + friend class MinidumpMemoryInfoList; + + explicit MinidumpMemoryInfo(Minidump* minidump_); + + // This works like MinidumpStream::Read, but is driven by + // MinidumpMemoryInfoList. No size checking is done, because + // MinidumpMemoryInfoList handles that directly. + bool Read(); + + MDRawMemoryInfo memory_info_; +}; + +// MinidumpMemoryInfoList contains a list of information about +// mapped memory regions for a process in the form of MDRawMemoryInfo. +// It maintains a map of these structures so that it may easily provide +// info corresponding to a specific address. +class MinidumpMemoryInfoList : public MinidumpStream { + public: + MinidumpMemoryInfoList(const MinidumpMemoryInfoList&) = delete; + void operator=(const MinidumpMemoryInfoList&) = delete; + ~MinidumpMemoryInfoList() override; + + unsigned int info_count() const { return valid_ ? info_count_ : 0; } + + const MinidumpMemoryInfo* GetMemoryInfoForAddress(uint64_t address) const; + const MinidumpMemoryInfo* GetMemoryInfoAtIndex(unsigned int index) const; + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + typedef vector MinidumpMemoryInfos; + + static const uint32_t kStreamType = MD_MEMORY_INFO_LIST_STREAM; + + explicit MinidumpMemoryInfoList(Minidump* minidump_); + + bool Read(uint32_t expected_size) override; + + // Access to memory info using addresses as the key. + RangeMap* range_map_; + + MinidumpMemoryInfos* infos_; + uint32_t info_count_; +}; + +// MinidumpLinuxMaps wraps information about a single mapped memory region +// from /proc/self/maps. +class MinidumpLinuxMaps : public MinidumpObject { + public: + MinidumpLinuxMaps(const MinidumpLinuxMaps&) = delete; + void operator=(const MinidumpLinuxMaps&) = delete; + + // The memory address of the base of the mapped region. + uint64_t GetBase() const { return valid_ ? region_.start : 0; } + // The size of the mapped region. + uint64_t GetSize() const { return valid_ ? region_.end - region_.start : 0; } + + // The permissions of the mapped region. + bool IsReadable() const { + return valid_ ? region_.permissions & MappedMemoryRegion::READ : false; + } + bool IsWriteable() const { + return valid_ ? region_.permissions & MappedMemoryRegion::WRITE : false; + } + bool IsExecutable() const { + return valid_ ? region_.permissions & MappedMemoryRegion::EXECUTE : false; + } + bool IsPrivate() const { + return valid_ ? region_.permissions & MappedMemoryRegion::PRIVATE : false; + } + + // The offset of the mapped region. + uint64_t GetOffset() const { return valid_ ? region_.offset : 0; } + + // The major device number. + uint8_t GetMajorDevice() const { return valid_ ? region_.major_device : 0; } + // The minor device number. + uint8_t GetMinorDevice() const { return valid_ ? region_.minor_device : 0; } + + // The inode of the mapped region. + uint64_t GetInode() const { return valid_ ? region_.inode : 0; } + + // The pathname of the mapped region. + const string GetPathname() const { return valid_ ? region_.path : ""; } + + // Print the contents of this mapping. + void Print() const; + + private: + // These objects are managed by MinidumpLinuxMapsList. + friend class MinidumpLinuxMapsList; + + // This caller owns the pointer. + explicit MinidumpLinuxMaps(Minidump* minidump); + + // The memory region struct that this class wraps. + MappedMemoryRegion region_; +}; + +// MinidumpLinuxMapsList corresponds to the Linux-exclusive MD_LINUX_MAPS +// stream, which contains the contents of /prod/self/maps, which contains +// the mapped memory regions and their access permissions. +class MinidumpLinuxMapsList : public MinidumpStream { + public: + MinidumpLinuxMapsList(const MinidumpLinuxMapsList&) = delete; + void operator=(const MinidumpLinuxMapsList&) = delete; + ~MinidumpLinuxMapsList() override; + + // Get number of mappings. + unsigned int get_maps_count() const { return valid_ ? maps_count_ : 0; } + + // Get mapping at the given memory address. The caller owns the pointer. + const MinidumpLinuxMaps* GetLinuxMapsForAddress(uint64_t address) const; + // Get mapping at the given index. The caller owns the pointer. + const MinidumpLinuxMaps* GetLinuxMapsAtIndex(unsigned int index) const; + + // Print the contents of /proc/self/maps to stdout. + void Print() const; + + private: + friend class Minidump; + + typedef vector MinidumpLinuxMappings; + + static const uint32_t kStreamType = MD_LINUX_MAPS; + + // The caller owns the pointer. + explicit MinidumpLinuxMapsList(Minidump* minidump); + + // Read and load the contents of the process mapping data. + // The stream should have data in the form of /proc/self/maps. + // This method returns whether the stream was read successfully. + bool Read(uint32_t expected_size) override; + + // The list of individual mappings. + MinidumpLinuxMappings* maps_; + // The number of mappings. + uint32_t maps_count_; +}; + +// MinidumpCrashpadInfo wraps MDRawCrashpadInfo, which is an optional stream in +// a minidump that provides additional information about the process state +// at the time the minidump was generated. +class MinidumpCrashpadInfo : public MinidumpStream { + public: + struct AnnotationObject { + uint16_t type; + std::string name; + std::vector value; + }; + + const MDRawCrashpadInfo* crashpad_info() const { + return valid_ ? &crashpad_info_ : nullptr; + } + + const std::vector>* + GetModuleCrashpadInfoAnnotationObjects() const { + return valid_ ? &module_crashpad_info_annotation_objects_ : nullptr; + } + + // Print a human-readable representation of the object to stdout. + void Print(); + + private: + friend class Minidump; + + static const uint32_t kStreamType = MD_CRASHPAD_INFO_STREAM; + + explicit MinidumpCrashpadInfo(Minidump* minidump_); + + bool Read(uint32_t expected_size); + + MDRawCrashpadInfo crashpad_info_; + std::vector module_crashpad_info_links_; + std::vector module_crashpad_info_; + std::vector> module_crashpad_info_list_annotations_; + std::vector> + module_crashpad_info_simple_annotations_; + std::vector> + module_crashpad_info_annotation_objects_; + + std::map simple_annotations_; +}; + + +// Minidump is the user's interface to a minidump file. It wraps MDRawHeader +// and provides access to the minidump's top-level stream directory. +class Minidump { + public: + // path is the pathname of a file containing the minidump. + explicit Minidump(const string& path, + bool hexdump=false, + unsigned int hexdump_width=16); + // input is an istream wrapping minidump data. Minidump holds a + // weak pointer to input, and the caller must ensure that the stream + // is valid as long as the Minidump object is. + explicit Minidump(std::istream& input); + + Minidump(const Minidump&) = delete; + void operator=(const Minidump&) = delete; + + virtual ~Minidump(); + + // path may be empty if the minidump was not opened from a file + virtual string path() const { + return path_; + } + static void set_max_streams(uint32_t max_streams) { + max_streams_ = max_streams; + } + static uint32_t max_streams() { return max_streams_; } + + static void set_max_string_length(uint32_t max_string_length) { + max_string_length_ = max_string_length; + } + static uint32_t max_string_length() { return max_string_length_; } + + virtual const MDRawHeader* header() const { + return valid_ ? &header_ : nullptr; + } + + // Reads the CPU information from the system info stream and generates the + // appropriate CPU flags. The returned context_cpu_flags are the same as + // if the CPU type bits were set in the context_flags of a context record. + // On success, context_cpu_flags will have the flags that identify the CPU. + // If a system info stream is missing, context_cpu_flags will be 0. + // Returns true if the current position in the stream was not changed. + // Returns false when the current location in the stream was changed and the + // attempt to restore the original position failed. + bool GetContextCPUFlagsFromSystemInfo(uint32_t* context_cpu_flags); + + // Reads the minidump file's header and top-level stream directory. + // The minidump is expected to be positioned at the beginning of the + // header. Read() sets up the stream list and map, and validates the + // Minidump object. + virtual bool Read(); + + // The next set of methods are stubs that call GetStream. They exist to + // force code generation of the templatized API within the module, and + // to avoid exposing an ugly API (GetStream needs to accept a garbage + // parameter). + virtual MinidumpThreadList* GetThreadList(); + virtual MinidumpThreadNameList* GetThreadNameList(); + virtual MinidumpModuleList* GetModuleList(); + virtual MinidumpMemoryList* GetMemoryList(); + virtual MinidumpException* GetException(); + virtual MinidumpAssertion* GetAssertion(); + virtual MinidumpSystemInfo* GetSystemInfo(); + virtual MinidumpUnloadedModuleList* GetUnloadedModuleList(); + virtual MinidumpMiscInfo* GetMiscInfo(); + virtual MinidumpBreakpadInfo* GetBreakpadInfo(); + virtual MinidumpMemoryInfoList* GetMemoryInfoList(); + MinidumpCrashpadInfo* GetCrashpadInfo(); + + // The next method also calls GetStream, but is exclusive for Linux dumps. + virtual MinidumpLinuxMapsList* GetLinuxMapsList(); + + // The next set of methods are provided for users who wish to access + // data in minidump files directly, while leveraging the rest of + // this class and related classes to handle the basic minidump + // structure and known stream types. + + unsigned int GetDirectoryEntryCount() const { + return valid_ ? header_.stream_count : 0; + } + const MDRawDirectory* GetDirectoryEntryAtIndex(unsigned int index) const; + + // The next 2 methods are lower-level I/O routines. They use fd_. + + // Reads count bytes from the minidump at the current position into + // the storage area pointed to by bytes. bytes must be of sufficient + // size. After the read, the file position is advanced by count. + bool ReadBytes(void* bytes, size_t count); + + // Sets the position of the minidump file to offset. + bool SeekSet(off_t offset); + + // Returns the current position of the minidump file. + off_t Tell(); + + // Medium-level I/O routines. + + // ReadString returns a string which is owned by the caller! offset + // specifies the offset that a length-encoded string is stored at in the + // minidump file. + string* ReadString(off_t offset); + + bool ReadUTF8String(off_t offset, string* string_utf8); + + bool ReadStringList(off_t offset, std::vector* string_list); + + bool ReadSimpleStringDictionary( + off_t offset, + std::map* simple_string_dictionary); + + bool ReadCrashpadAnnotationsList( + off_t offset, + std::vector* annotations_list); + + // SeekToStreamType positions the file at the beginning of a stream + // identified by stream_type, and informs the caller of the stream's + // length by setting *stream_length. Because stream_map maps each stream + // type to only one stream in the file, this might mislead the user into + // thinking that the stream that this seeks to is the only stream with + // type stream_type. That can't happen for streams that these classes + // deal with directly, because they're only supposed to be present in the + // file singly, and that's verified when stream_map_ is built. Users who + // are looking for other stream types should be aware of this + // possibility, and consider using GetDirectoryEntryAtIndex (possibly + // with GetDirectoryEntryCount) if expecting multiple streams of the same + // type in a single minidump file. + bool SeekToStreamType(uint32_t stream_type, uint32_t* stream_length); + + bool swap() const { return valid_ ? swap_ : false; } + + bool is_big_endian() const { return valid_ ? is_big_endian_ : false; } + + // Print a human-readable representation of the object to stdout. + void Print(); + + // Is the OS Android. + bool IsAndroid(); + + // Determines the platform where the minidump was produced. |platform| is + // valid iff this method returns true. + bool GetPlatform(MDOSPlatform* platform); + + // Get current hexdump display settings. + unsigned int HexdumpMode() const { return hexdump_ ? hexdump_width_ : 0; } + + private: + // MinidumpStreamInfo is used in the MinidumpStreamMap. It lets + // the Minidump object locate interesting streams quickly, and + // provides a convenient place to stash MinidumpStream objects. + struct MinidumpStreamInfo { + MinidumpStreamInfo() : stream_index(0), stream(nullptr) {} + ~MinidumpStreamInfo() { delete stream; } + + // Index into the MinidumpDirectoryEntries vector + unsigned int stream_index; + + // Pointer to the stream if cached, or NULL if not yet populated + MinidumpStream* stream; + }; + + typedef vector MinidumpDirectoryEntries; + typedef map MinidumpStreamMap; + + template T* GetStream(T** stream); + + // Opens the minidump file, or if already open, seeks to the beginning. + bool Open(); + + // The largest number of top-level streams that will be read from a minidump. + // Note that streams are only read (and only consume memory) as needed, + // when directed by the caller. The default is 128. + static uint32_t max_streams_; + + // The maximum length of a UTF-16 string that will be read from a minidump + // in 16-bit words. The default is 1024. UTF-16 strings are converted + // to UTF-8 when stored in memory, and each UTF-16 word will be represented + // by as many as 3 bytes in UTF-8. + static unsigned int max_string_length_; + + MDRawHeader header_; + + // The list of streams. + MinidumpDirectoryEntries* directory_; + + // Access to streams using the stream type as the key. + MinidumpStreamMap* stream_map_; + + // The pathname of the minidump file to process, set in the constructor. + // This may be empty if the minidump was opened directly from a stream. + const string path_; + + // The stream for all file I/O. Used by ReadBytes and SeekSet. + // Set based on the path in Open, or directly in the constructor. + std::istream* stream_; + + // swap_ is true if the minidump file should be byte-swapped. If the + // minidump was produced by a CPU that is other-endian than the CPU + // processing the minidump, this will be true. If the two CPUs are + // same-endian, this will be false. + bool swap_; + + // true if the minidump was produced by a big-endian cpu. + bool is_big_endian_; + + // Validity of the Minidump structure, false immediately after + // construction or after a failed Read(); true following a successful + // Read(). + bool valid_; + + // Knobs for controlling display of memory printing. + bool hexdump_; + unsigned int hexdump_width_; +}; + + +} // namespace google_breakpad + + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__ diff --git a/src/google_breakpad/processor/minidump_processor.h b/src/google_breakpad/processor/minidump_processor.h new file mode 100644 index 0000000..8475407 --- /dev/null +++ b/src/google_breakpad/processor/minidump_processor.h @@ -0,0 +1,164 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__ + +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/process_result.h" + +namespace google_breakpad { + +class Minidump; +class ProcessState; +class StackFrameSymbolizer; +class SourceLineResolverInterface; +class SymbolSupplier; +struct SystemInfo; + +class MinidumpProcessor { + public: + // Initializes this MinidumpProcessor. supplier should be an + // implementation of the SymbolSupplier abstract base class. + MinidumpProcessor(SymbolSupplier* supplier, + SourceLineResolverInterface* resolver); + + // Initializes the MinidumpProcessor with the option of + // enabling the exploitability framework to analyze dumps + // for probable security relevance. + MinidumpProcessor(SymbolSupplier* supplier, + SourceLineResolverInterface* resolver, + bool enable_exploitability); + + // Initializes the MinidumpProcessor with source line resolver helper, and + // the option of enabling the exploitability framework to analyze dumps + // for probable security relevance. + // Does not take ownership of resolver_helper, which must NOT be NULL. + MinidumpProcessor(StackFrameSymbolizer* stack_frame_symbolizer, + bool enable_exploitability); + + ~MinidumpProcessor(); + + // Processes the minidump file and fills process_state with the result. + ProcessResult Process(const string& minidump_file, + ProcessState* process_state); + + // Processes the minidump structure and fills process_state with the + // result. + ProcessResult Process(Minidump* minidump, + ProcessState* process_state); + // Populates the cpu_* fields of the |info| parameter with textual + // representations of the CPU type that the minidump in |dump| was + // produced on. Returns false if this information is not available in + // the minidump. + static bool GetCPUInfo(Minidump* dump, SystemInfo* info); + + // Populates the os_* fields of the |info| parameter with textual + // representations of the operating system that the minidump in |dump| + // was produced on. Returns false if this information is not available in + // the minidump. + static bool GetOSInfo(Minidump* dump, SystemInfo* info); + + // Populates the |process_create_time| parameter with the create time of the + // crashed process. Returns false if this information is not available in + // the minidump |dump|. + static bool GetProcessCreateTime(Minidump* dump, + uint32_t* process_create_time); + + // Returns a textual representation of the reason that a crash occurred, + // if the minidump in dump was produced as a result of a crash. Returns + // an empty string if this information cannot be determined. If address + // is non-NULL, it will be set to contain the address that caused the + // exception, if this information is available. This will be a code + // address when the crash was caused by problems such as illegal + // instructions or divisions by zero, or a data address when the crash + // was caused by a memory access violation. If enable_objdump is set, this + // may use disassembly to compute the faulting address. + static string GetCrashReason(Minidump* dump, uint64_t* address, + bool enable_objdump); + + // This function returns true if the passed-in error code is + // something unrecoverable(i.e. retry should not happen). For + // instance, if the minidump is corrupt, then it makes no sense to + // retry as we won't be able to glean additional information. + // However, as an example of the other case, the symbol supplier can + // return an error code indicating it was 'interrupted', which can + // happen of the symbols are fetched from a remote store, and a + // retry might be successful later on. + // You should not call this method with PROCESS_OK! Test for + // that separately before calling this. + static bool IsErrorUnrecoverable(ProcessResult p) { + assert(p != PROCESS_OK); + return (p != PROCESS_SYMBOL_SUPPLIER_INTERRUPTED); + } + + // Returns a textual representation of an assertion included + // in the minidump. Returns an empty string if this information + // does not exist or cannot be determined. + static string GetAssertion(Minidump* dump); + + // Sets the flag to enable/disable use of objdump during normal crash + // processing. This is independent from the flag for use of objdump during + // exploitability analysis. + void set_enable_objdump(bool enabled) { enable_objdump_ = enabled; } + + // Sets the flag to enable/disable use of objdump during exploitability + // analysis. This is independent from the flag for use of objdump during + // normal crash processing. + void set_enable_objdump_for_exploitability(bool enabled) { + enable_objdump_for_exploitability_ = enabled; + } + + private: + StackFrameSymbolizer* frame_symbolizer_; + // Indicate whether resolver_helper_ is owned by this instance. + bool own_frame_symbolizer_; + + // This flag enables the exploitability scanner which attempts to + // guess how likely it is that the crash represents an exploitable + // memory corruption issue. + bool enable_exploitability_; + + // This flag permits the processor to shell out to objdump for purposes of + // disassembly during normal crash processing, but not during exploitability + // analysis. + bool enable_objdump_; + + // This flag permits the exploitability scanner to shell out to objdump for + // purposes of disassembly. This results in significantly more overhead than + // the enable_objdump_ flag. + bool enable_objdump_for_exploitability_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__ diff --git a/src/google_breakpad/processor/proc_maps_linux.h b/src/google_breakpad/processor/proc_maps_linux.h new file mode 100644 index 0000000..b99414c --- /dev/null +++ b/src/google_breakpad/processor/proc_maps_linux.h @@ -0,0 +1,60 @@ +// Copyright 2013 Google LLC +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_DEBUG_PROC_MAPS_LINUX_H_ +#define BASE_DEBUG_PROC_MAPS_LINUX_H_ + +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +// Describes a region of mapped memory and the path of the file mapped. +struct MappedMemoryRegion { + enum Permission { + READ = 1 << 0, + WRITE = 1 << 1, + EXECUTE = 1 << 2, + PRIVATE = 1 << 3, // If set, region is private, otherwise it is shared. + }; + + // The address range [start,end) of mapped memory. + uint64_t start; + uint64_t end; + + // Byte offset into |path| of the range mapped into memory. + uint64_t offset; + + // Bitmask of read/write/execute/private/shared permissions. + uint8_t permissions; + + // Major and minor devices. + uint8_t major_device; + uint8_t minor_device; + + // Value of the inode. + uint64_t inode; + + // Name of the file mapped into memory. + // + // NOTE: path names aren't guaranteed to point at valid files. For example, + // "[heap]" and "[stack]" are used to represent the location of the process' + // heap and stack, respectively. + string path; + + // The line from /proc//maps that this struct represents. + string line; +}; + +// Parses /proc//maps input data and stores in |regions|. Returns true +// and updates |regions| if and only if all of |input| was successfully parsed. +bool ParseProcMaps(const string& input, + std::vector* regions); + +} // namespace google_breakpad + +#endif // BASE_DEBUG_PROC_MAPS_LINUX_H_ diff --git a/src/google_breakpad/processor/process_result.h b/src/google_breakpad/processor/process_result.h new file mode 100644 index 0000000..780060d --- /dev/null +++ b/src/google_breakpad/processor/process_result.h @@ -0,0 +1,69 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_PROCESS_RESULT_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_PROCESS_RESULT_H__ + +namespace google_breakpad { + +// Return type for MinidumpProcessor or MicrodumpProcessor's Process() +enum ProcessResult { + PROCESS_OK, // The dump was processed + // successfully. + + PROCESS_ERROR_MINIDUMP_NOT_FOUND, // The minidump file was not + // found. + + PROCESS_ERROR_NO_MINIDUMP_HEADER, // The minidump file had no + // header. + + PROCESS_ERROR_NO_THREAD_LIST, // The minidump file has no + // thread list. + + PROCESS_ERROR_GETTING_THREAD, // There was an error getting one + // thread's data from th dump. + + PROCESS_ERROR_GETTING_THREAD_ID, // There was an error getting a + // thread id from the thread's + // data. + + PROCESS_ERROR_DUPLICATE_REQUESTING_THREADS, // There was more than one + // requesting thread. + + PROCESS_SYMBOL_SUPPLIER_INTERRUPTED, // The dump processing was + // interrupted by the + // SymbolSupplier(not fatal). + + PROCESS_ERROR_GETTING_THREAD_NAME, // There was an error getting one + // thread's name from the dump. + +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_PROCESS_RESULT_H__ diff --git a/src/google_breakpad/processor/process_state.h b/src/google_breakpad/processor/process_state.h new file mode 100644 index 0000000..3fe6a5c --- /dev/null +++ b/src/google_breakpad/processor/process_state.h @@ -0,0 +1,214 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// process_state.h: A snapshot of a process, in a fully-digested state. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__ + +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/exception_record.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/linked_ptr.h" + +namespace google_breakpad { + +using std::vector; + +class CallStack; +class CodeModules; + +enum ExploitabilityRating { + EXPLOITABILITY_HIGH, // The crash likely represents + // a exploitable memory corruption + // vulnerability. + + EXPLOITABILITY_MEDIUM, // The crash appears to corrupt + // memory in a way which may be + // exploitable in some situations. + + EXPLOITABLITY_MEDIUM = EXPLOITABILITY_MEDIUM, // an old misspelling + + EXPLOITABILITY_LOW, // The crash either does not corrupt + // memory directly or control over + // the affected data is limited. The + // issue may still be exploitable + // on certain platforms or situations. + + EXPLOITABILITY_INTERESTING, // The crash does not appear to be + // directly exploitable. However it + // represents a condition which should + // be further analyzed. + + EXPLOITABILITY_NONE, // The crash does not appear to represent + // an exploitable condition. + + EXPLOITABILITY_NOT_ANALYZED, // The crash was not analyzed for + // exploitability because the engine + // was disabled. + + EXPLOITABILITY_ERR_NOENGINE, // The supplied minidump's platform does + // not have a exploitability engine + // associated with it. + + EXPLOITABILITY_ERR_PROCESSING // An error occured within the + // exploitability engine and no rating + // was calculated. +}; + +class ProcessState { + public: + ProcessState() : modules_(NULL), unloaded_modules_(NULL) { Clear(); } + ~ProcessState(); + + // Resets the ProcessState to its default values + void Clear(); + + // Accessors. See the data declarations below. + uint32_t time_date_stamp() const { return time_date_stamp_; } + uint32_t process_create_time() const { return process_create_time_; } + bool crashed() const { return crashed_; } + string crash_reason() const { return crash_reason_; } + uint64_t crash_address() const { return crash_address_; } + string assertion() const { return assertion_; } + int requesting_thread() const { return requesting_thread_; } + const ExceptionRecord* exception_record() const { return &exception_record_; } + const vector* threads() const { return &threads_; } + const vector* thread_memory_regions() const { + return &thread_memory_regions_; + } + const vector* thread_names() const { return &thread_names_; } + const SystemInfo* system_info() const { return &system_info_; } + const CodeModules* modules() const { return modules_; } + const CodeModules* unloaded_modules() const { return unloaded_modules_; } + const vector >* shrunk_range_modules() const { + return &shrunk_range_modules_; + } + const vector* modules_without_symbols() const { + return &modules_without_symbols_; + } + const vector* modules_with_corrupt_symbols() const { + return &modules_with_corrupt_symbols_; + } + ExploitabilityRating exploitability() const { return exploitability_; } + + private: + // MinidumpProcessor and MicrodumpProcessor are responsible for building + // ProcessState objects. + friend class MinidumpProcessor; + friend class MicrodumpProcessor; + + // The time-date stamp of the minidump (time_t format) + uint32_t time_date_stamp_; + + // The time-date stamp when the process was created (time_t format) + uint32_t process_create_time_; + + // True if the process crashed, false if the dump was produced outside + // of an exception handler. + bool crashed_; + + // If the process crashed, the type of crash. OS- and possibly CPU- + // specific. For example, "EXCEPTION_ACCESS_VIOLATION" (Windows), + // "EXC_BAD_ACCESS / KERN_INVALID_ADDRESS" (Mac OS X), "SIGSEGV" + // (other Unix). + string crash_reason_; + + // If the process crashed, and if crash_reason implicates memory, + // the memory address that caused the crash. For data access errors, + // this will be the data address that caused the fault. For code errors, + // this will be the address of the instruction that caused the fault. + uint64_t crash_address_; + + // If there was an assertion that was hit, a textual representation + // of that assertion, possibly including the file and line at which + // it occurred. + string assertion_; + + // The index of the thread that requested a dump be written in the + // threads vector. If a dump was produced as a result of a crash, this + // will point to the thread that crashed. If the dump was produced as + // by user code without crashing, and the dump contains extended Breakpad + // information, this will point to the thread that requested the dump. + // If the dump was not produced as a result of an exception and no + // extended Breakpad information is present, this field will be set to -1, + // indicating that the dump thread is not available. + int requesting_thread_; + + // Exception record details: code, flags, address, parameters. + ExceptionRecord exception_record_; + + // Stacks for each thread (except possibly the exception handler + // thread) at the time of the crash. + vector threads_; + vector thread_memory_regions_; + + // Names of each thread at the time of the crash, one for each entry in + // threads_. Note that a thread's name might be empty if there was no + // corresponding ThreadNamesStream in the minidump, or if a particular thread + // ID was not present in the THREAD_NAME_LIST. + vector thread_names_; + + // OS and CPU information. + SystemInfo system_info_; + + // The modules that were loaded into the process represented by the + // ProcessState. + const CodeModules *modules_; + + // The modules that have been unloaded from the process represented by the + // ProcessState. + const CodeModules *unloaded_modules_; + + // The modules which virtual address ranges were shrunk down due to + // virtual address conflicts. + vector > shrunk_range_modules_; + + // The modules that didn't have symbols when the report was processed. + vector modules_without_symbols_; + + // The modules that had corrupt symbols when the report was processed. + vector modules_with_corrupt_symbols_; + + // The exploitability rating as determined by the exploitability + // engine. When the exploitability engine is not enabled this + // defaults to EXPLOITABILITY_NOT_ANALYZED. + ExploitabilityRating exploitability_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__ diff --git a/src/google_breakpad/processor/source_line_resolver_base.h b/src/google_breakpad/processor/source_line_resolver_base.h new file mode 100644 index 0000000..4c64bfc --- /dev/null +++ b/src/google_breakpad/processor/source_line_resolver_base.h @@ -0,0 +1,132 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// source_line_resolver_base.h: SourceLineResolverBase, an (incomplete) +// implementation of SourceLineResolverInterface. It serves as a common base +// class for concrete implementations: FastSourceLineResolver and +// BasicSourceLineResolver. It is designed for refactoring that removes +// code redundancy in the two concrete source line resolver classes. +// +// See "google_breakpad/processor/source_line_resolver_interface.h" for more +// documentation. + +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_BASE_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_BASE_H__ + +#include +#include +#include +#include + +#include "google_breakpad/processor/source_line_resolver_interface.h" + +namespace google_breakpad { + +using std::map; +using std::set; + +// Forward declaration. +// ModuleFactory is a simple factory interface for creating a Module instance +// at run-time. +class ModuleFactory; + +class SourceLineResolverBase : public SourceLineResolverInterface { + public: + // Read the symbol_data from a file with given file_name. + // The part of code was originally in BasicSourceLineResolver::Module's + // LoadMap() method. + // Place dynamically allocated heap buffer in symbol_data. Caller has the + // ownership of the buffer, and should call delete [] to free the buffer. + static bool ReadSymbolFile(const string& file_name, + char** symbol_data, + size_t* symbol_data_size); + + protected: + // Users are not allowed create SourceLineResolverBase instance directly. + SourceLineResolverBase(ModuleFactory* module_factory); + virtual ~SourceLineResolverBase(); + + // Virtual methods inherited from SourceLineResolverInterface. + virtual bool LoadModule(const CodeModule* module, const string& map_file); + virtual bool LoadModuleUsingMapBuffer(const CodeModule* module, + const string& map_buffer); + virtual bool LoadModuleUsingMemoryBuffer(const CodeModule* module, + char* memory_buffer, + size_t memory_buffer_size); + virtual bool ShouldDeleteMemoryBufferAfterLoadModule(); + virtual void UnloadModule(const CodeModule* module); + virtual bool HasModule(const CodeModule* module); + virtual bool IsModuleCorrupt(const CodeModule* module); + virtual void FillSourceLineInfo( + StackFrame* frame, + std::deque>* inlined_frames); + virtual WindowsFrameInfo* FindWindowsFrameInfo(const StackFrame* frame); + virtual CFIFrameInfo* FindCFIFrameInfo(const StackFrame* frame); + + // Nested structs and classes. + struct InlineOrigin; + struct Inline; + struct Line; + struct Function; + struct PublicSymbol; + struct CompareString { + bool operator()(const string& s1, const string& s2) const; + }; + // Module is an interface for an in-memory symbol file. + class Module; + class AutoFileCloser; + + // All of the modules that are loaded. + typedef map ModuleMap; + ModuleMap* modules_; + + // The loaded modules that were detecting to be corrupt during load. + typedef set ModuleSet; + ModuleSet* corrupt_modules_; + + // All of heap-allocated buffers that are owned locally by resolver. + typedef std::map MemoryMap; + MemoryMap* memory_buffers_; + + // Creates a concrete module at run-time. + ModuleFactory* module_factory_; + + private: + // ModuleFactory needs to have access to protected type Module. + friend class ModuleFactory; + + // Disallow unwanted copy ctor and assignment operator + SourceLineResolverBase(const SourceLineResolverBase&); + void operator=(const SourceLineResolverBase&); +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_BASE_H__ diff --git a/src/google_breakpad/processor/source_line_resolver_interface.h b/src/google_breakpad/processor/source_line_resolver_interface.h new file mode 100644 index 0000000..9f1f50c --- /dev/null +++ b/src/google_breakpad/processor/source_line_resolver_interface.h @@ -0,0 +1,123 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Abstract interface to return function/file/line info for a memory address. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ + +#include +#include +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/code_module.h" + +namespace google_breakpad { + +struct StackFrame; +struct WindowsFrameInfo; +class CFIFrameInfo; + +class SourceLineResolverInterface { + public: + typedef uint64_t MemAddr; + + virtual ~SourceLineResolverInterface() {} + + // Adds a module to this resolver, returning true on success. + // + // module should have at least the code_file, debug_file, + // and debug_identifier members populated. + // + // map_file should contain line/address mappings for this module. + virtual bool LoadModule(const CodeModule* module, + const string& map_file) = 0; + // Same as above, but takes the contents of a pre-read map buffer + virtual bool LoadModuleUsingMapBuffer(const CodeModule* module, + const string& map_buffer) = 0; + + // Add an interface to load symbol using C-String data instead of string. + // This is useful in the optimization design for avoiding unnecessary copying + // of symbol data, in order to improve memory efficiency. + // LoadModuleUsingMemoryBuffer() does NOT take ownership of memory_buffer. + // LoadModuleUsingMemoryBuffer() null terminates the passed in buffer, if + // the last character is not a null terminator. + virtual bool LoadModuleUsingMemoryBuffer(const CodeModule* module, + char* memory_buffer, + size_t memory_buffer_size) = 0; + + // Return true if the memory buffer should be deleted immediately after + // LoadModuleUsingMemoryBuffer(). Return false if the memory buffer has to be + // alive during the lifetime of the corresponding Module. + virtual bool ShouldDeleteMemoryBufferAfterLoadModule() = 0; + + // Request that the specified module be unloaded from this resolver. + // A resolver may choose to ignore such a request. + virtual void UnloadModule(const CodeModule* module) = 0; + + // Returns true if the module has been loaded. + virtual bool HasModule(const CodeModule* module) = 0; + + // Returns true if the module has been loaded and it is corrupt. + virtual bool IsModuleCorrupt(const CodeModule* module) = 0; + + // Fills in the function_base, function_name, source_file_name, + // and source_line fields of the StackFrame. The instruction and + // module_name fields must already be filled in. If inlined_frames is not + // nullptr, it will try to construct inlined frames by adding them into + // inlined_frames in an order from outermost frame to inner most frame. + virtual void FillSourceLineInfo( + StackFrame* frame, + std::deque>* inlined_frames) = 0; + + // If Windows stack walking information is available covering + // FRAME's instruction address, return a WindowsFrameInfo structure + // describing it. If the information is not available, returns NULL. + // A NULL return value does not indicate an error. The caller takes + // ownership of any returned WindowsFrameInfo object. + virtual WindowsFrameInfo* FindWindowsFrameInfo(const StackFrame* frame) = 0; + + // If CFI stack walking information is available covering ADDRESS, + // return a CFIFrameInfo structure describing it. If the information + // is not available, return NULL. The caller takes ownership of any + // returned CFIFrameInfo object. + virtual CFIFrameInfo* FindCFIFrameInfo(const StackFrame* frame) = 0; + + protected: + // SourceLineResolverInterface cannot be instantiated except by subclasses + SourceLineResolverInterface() {} +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__ diff --git a/src/google_breakpad/processor/stack_frame.h b/src/google_breakpad/processor/stack_frame.h new file mode 100644 index 0000000..eebe06e --- /dev/null +++ b/src/google_breakpad/processor/stack_frame.h @@ -0,0 +1,158 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__ + +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +class CodeModule; + +struct StackFrame { + // Indicates how well the instruction pointer derived during + // stack walking is trusted. Since the stack walker can resort to + // stack scanning, it can wind up with dubious frames. + // In rough order of "trust metric". + enum FrameTrust { + FRAME_TRUST_NONE, // Unknown + FRAME_TRUST_SCAN, // Scanned the stack, found this + FRAME_TRUST_CFI_SCAN, // Found while scanning stack using call frame info + FRAME_TRUST_FP, // Derived from frame pointer + FRAME_TRUST_CFI, // Derived from call frame info + // Explicitly provided by some external stack walker. + FRAME_TRUST_PREWALKED, + FRAME_TRUST_CONTEXT, // Given as instruction pointer in a context + FRAME_TRUST_INLINE, // Found by inline records in symbol files. + // Derived from leaf function by simulating a return. + FRAME_TRUST_LEAF, + }; + + StackFrame() + : instruction(), + module(NULL), + function_name(), + function_base(), + source_file_name(), + source_line(0), + source_line_base(), + trust(FRAME_TRUST_NONE), + is_multiple(false) {} + virtual ~StackFrame() {} + + // Return a string describing how this stack frame was found + // by the stackwalker. + string trust_description() const { + switch (trust) { + case StackFrame::FRAME_TRUST_CONTEXT: + return "given as instruction pointer in context"; + case StackFrame::FRAME_TRUST_PREWALKED: + return "recovered by external stack walker"; + case StackFrame::FRAME_TRUST_CFI: + return "call frame info"; + case StackFrame::FRAME_TRUST_CFI_SCAN: + return "call frame info with scanning"; + case StackFrame::FRAME_TRUST_FP: + return "previous frame's frame pointer"; + case StackFrame::FRAME_TRUST_SCAN: + return "stack scanning"; + case StackFrame::FRAME_TRUST_INLINE: + return "inline record"; + case StackFrame::FRAME_TRUST_LEAF: + return "simulating a return from leaf function"; + default: + return "unknown"; + } + } + + // Return the actual return address, as saved on the stack or in a + // register. See the comments for 'instruction', below, for details. + virtual uint64_t ReturnAddress() const { return instruction; } + + // The program counter location as an absolute virtual address. + // + // - For the innermost called frame in a stack, this will be an exact + // program counter or instruction pointer value. + // + // - For all other frames, this address is within the instruction that + // caused execution to branch to this frame's callee (although it may + // not point to the exact beginning of that instruction). This ensures + // that, when we look up the source code location for this frame, we + // get the source location of the call, not of the point at which + // control will resume when the call returns, which may be on the next + // line. (If the compiler knows the callee never returns, it may even + // place the call instruction at the very end of the caller's machine + // code, such that the "return address" (which will never be used) + // immediately after the call instruction is in an entirely different + // function, perhaps even from a different source file.) + // + // On some architectures, the return address as saved on the stack or in + // a register is fine for looking up the point of the call. On others, it + // requires adjustment. ReturnAddress returns the address as saved by the + // machine. + uint64_t instruction; + + // The module in which the instruction resides. + const CodeModule *module; + + // The function name, may be omitted if debug symbols are not available. + string function_name; + + // The start address of the function, may be omitted if debug symbols + // are not available. + uint64_t function_base; + + // The source file name, may be omitted if debug symbols are not available. + string source_file_name; + + // The (1-based) source line number, may be omitted if debug symbols are + // not available. + int source_line; + + // The start address of the source line, may be omitted if debug symbols + // are not available. + uint64_t source_line_base; + + // Amount of trust the stack walker has in the instruction pointer + // of this frame. + FrameTrust trust; + + // True if the frame corresponds to multiple functions, for example as the + // result of identical code folding by the linker. In that case the function + // name, filename, etc. information above represents the state of an arbitrary + // one of these functions. + bool is_multiple; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__ diff --git a/src/google_breakpad/processor/stack_frame_cpu.h b/src/google_breakpad/processor/stack_frame_cpu.h new file mode 100644 index 0000000..91f1d0c --- /dev/null +++ b/src/google_breakpad/processor/stack_frame_cpu.h @@ -0,0 +1,519 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stack_frame_cpu.h: CPU-specific StackFrame extensions. +// +// These types extend the StackFrame structure to carry CPU-specific register +// state. They are defined in this header instead of stack_frame.h to +// avoid the need to include minidump_format.h when only the generic +// StackFrame type is needed. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ + +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stack_frame.h" + +namespace google_breakpad { + +struct WindowsFrameInfo; +class CFIFrameInfo; + +struct StackFrameX86 : public StackFrame { + // ContextValidity has one entry for each relevant hardware pointer + // register (%eip and %esp) and one entry for each general-purpose + // register. It's worthwhile having validity flags for caller-saves + // registers: they are valid in the youngest frame, and such a frame + // might save a callee-saves register in a caller-saves register, but + // SimpleCFIWalker won't touch registers unless they're marked as valid. + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_EIP = 1 << 0, + CONTEXT_VALID_ESP = 1 << 1, + CONTEXT_VALID_EBP = 1 << 2, + CONTEXT_VALID_EAX = 1 << 3, + CONTEXT_VALID_EBX = 1 << 4, + CONTEXT_VALID_ECX = 1 << 5, + CONTEXT_VALID_EDX = 1 << 6, + CONTEXT_VALID_ESI = 1 << 7, + CONTEXT_VALID_EDI = 1 << 8, + CONTEXT_VALID_ALL = -1 + }; + + StackFrameX86() + : context(), + context_validity(CONTEXT_VALID_NONE), + windows_frame_info(NULL), + cfi_frame_info(NULL) {} + ~StackFrameX86(); + + // Overriden to return the return address as saved on the stack. + virtual uint64_t ReturnAddress() const; + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextX86 context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; + + // Any stack walking information we found describing this.instruction. + // These may be NULL if there is no such information for that address. + WindowsFrameInfo *windows_frame_info; + CFIFrameInfo *cfi_frame_info; +}; + +struct StackFramePPC : public StackFrame { + // ContextValidity should eventually contain entries for the validity of + // other nonvolatile (callee-save) registers as in + // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently + // locate registers other than the ones listed here. + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_SRR0 = 1 << 0, + CONTEXT_VALID_GPR1 = 1 << 1, + CONTEXT_VALID_ALL = -1 + }; + + StackFramePPC() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextPPC context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +struct StackFramePPC64 : public StackFrame { + // ContextValidity should eventually contain entries for the validity of + // other nonvolatile (callee-save) registers as in + // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently + // locate registers other than the ones listed here. + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_SRR0 = 1 << 0, + CONTEXT_VALID_GPR1 = 1 << 1, + CONTEXT_VALID_ALL = -1 + }; + + StackFramePPC64() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextPPC64 context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +struct StackFrameAMD64 : public StackFrame { + // ContextValidity has one entry for each register that we might be able + // to recover. + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_RAX = 1 << 0, + CONTEXT_VALID_RDX = 1 << 1, + CONTEXT_VALID_RCX = 1 << 2, + CONTEXT_VALID_RBX = 1 << 3, + CONTEXT_VALID_RSI = 1 << 4, + CONTEXT_VALID_RDI = 1 << 5, + CONTEXT_VALID_RBP = 1 << 6, + CONTEXT_VALID_RSP = 1 << 7, + CONTEXT_VALID_R8 = 1 << 8, + CONTEXT_VALID_R9 = 1 << 9, + CONTEXT_VALID_R10 = 1 << 10, + CONTEXT_VALID_R11 = 1 << 11, + CONTEXT_VALID_R12 = 1 << 12, + CONTEXT_VALID_R13 = 1 << 13, + CONTEXT_VALID_R14 = 1 << 14, + CONTEXT_VALID_R15 = 1 << 15, + CONTEXT_VALID_RIP = 1 << 16, + CONTEXT_VALID_ALL = -1 + }; + + StackFrameAMD64() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Overriden to return the return address as saved on the stack. + virtual uint64_t ReturnAddress() const; + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, which registers are present depends on what + // debugging information we had available. Refer to context_validity. + MDRawContextAMD64 context; + + // For each register in context whose value has been recovered, we set + // the corresponding CONTEXT_VALID_ bit in context_validity. + // + // context_validity's type should actually be ContextValidity, but + // we use int instead because the bitwise inclusive or operator + // yields an int when applied to enum values, and C++ doesn't + // silently convert from ints to enums. + int context_validity; +}; + +struct StackFrameSPARC : public StackFrame { + // to be confirmed + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_PC = 1 << 0, + CONTEXT_VALID_SP = 1 << 1, + CONTEXT_VALID_FP = 1 << 2, + CONTEXT_VALID_ALL = -1 + }; + + StackFrameSPARC() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextSPARC context; + + // context_validity is actually ContextValidity, but int is used because + // the OR operator doesn't work well with enumerated types. This indicates + // which fields in context are valid. + int context_validity; +}; + +struct StackFrameARM : public StackFrame { + // A flag for each register we might know. + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_R0 = 1 << 0, + CONTEXT_VALID_R1 = 1 << 1, + CONTEXT_VALID_R2 = 1 << 2, + CONTEXT_VALID_R3 = 1 << 3, + CONTEXT_VALID_R4 = 1 << 4, + CONTEXT_VALID_R5 = 1 << 5, + CONTEXT_VALID_R6 = 1 << 6, + CONTEXT_VALID_R7 = 1 << 7, + CONTEXT_VALID_R8 = 1 << 8, + CONTEXT_VALID_R9 = 1 << 9, + CONTEXT_VALID_R10 = 1 << 10, + CONTEXT_VALID_R11 = 1 << 11, + CONTEXT_VALID_R12 = 1 << 12, + CONTEXT_VALID_R13 = 1 << 13, + CONTEXT_VALID_R14 = 1 << 14, + CONTEXT_VALID_R15 = 1 << 15, + CONTEXT_VALID_ALL = ~CONTEXT_VALID_NONE, + + // Aliases for registers with dedicated or conventional roles. + CONTEXT_VALID_FP = CONTEXT_VALID_R11, + CONTEXT_VALID_SP = CONTEXT_VALID_R13, + CONTEXT_VALID_LR = CONTEXT_VALID_R14, + CONTEXT_VALID_PC = CONTEXT_VALID_R15 + }; + + StackFrameARM() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Return the ContextValidity flag for register rN. + static ContextValidity RegisterValidFlag(int n) { + if (0 <= n && n <= 15) { + return ContextValidity(1 << n); + } + return CONTEXT_VALID_NONE; + } + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextARM context; + + // For each register in context whose value has been recovered, we set + // the corresponding CONTEXT_VALID_ bit in context_validity. + // + // context_validity's type should actually be ContextValidity, but + // we use int instead because the bitwise inclusive or operator + // yields an int when applied to enum values, and C++ doesn't + // silently convert from ints to enums. + int context_validity; +}; + +struct StackFrameARM64 : public StackFrame { + // A flag for each register we might know. Note that we can't use an enum + // here as there are 33 values to represent. + static const uint64_t CONTEXT_VALID_NONE = 0; + static const uint64_t CONTEXT_VALID_X0 = 1ULL << 0; + static const uint64_t CONTEXT_VALID_X1 = 1ULL << 1; + static const uint64_t CONTEXT_VALID_X2 = 1ULL << 2; + static const uint64_t CONTEXT_VALID_X3 = 1ULL << 3; + static const uint64_t CONTEXT_VALID_X4 = 1ULL << 4; + static const uint64_t CONTEXT_VALID_X5 = 1ULL << 5; + static const uint64_t CONTEXT_VALID_X6 = 1ULL << 6; + static const uint64_t CONTEXT_VALID_X7 = 1ULL << 7; + static const uint64_t CONTEXT_VALID_X8 = 1ULL << 8; + static const uint64_t CONTEXT_VALID_X9 = 1ULL << 9; + static const uint64_t CONTEXT_VALID_X10 = 1ULL << 10; + static const uint64_t CONTEXT_VALID_X11 = 1ULL << 11; + static const uint64_t CONTEXT_VALID_X12 = 1ULL << 12; + static const uint64_t CONTEXT_VALID_X13 = 1ULL << 13; + static const uint64_t CONTEXT_VALID_X14 = 1ULL << 14; + static const uint64_t CONTEXT_VALID_X15 = 1ULL << 15; + static const uint64_t CONTEXT_VALID_X16 = 1ULL << 16; + static const uint64_t CONTEXT_VALID_X17 = 1ULL << 17; + static const uint64_t CONTEXT_VALID_X18 = 1ULL << 18; + static const uint64_t CONTEXT_VALID_X19 = 1ULL << 19; + static const uint64_t CONTEXT_VALID_X20 = 1ULL << 20; + static const uint64_t CONTEXT_VALID_X21 = 1ULL << 21; + static const uint64_t CONTEXT_VALID_X22 = 1ULL << 22; + static const uint64_t CONTEXT_VALID_X23 = 1ULL << 23; + static const uint64_t CONTEXT_VALID_X24 = 1ULL << 24; + static const uint64_t CONTEXT_VALID_X25 = 1ULL << 25; + static const uint64_t CONTEXT_VALID_X26 = 1ULL << 26; + static const uint64_t CONTEXT_VALID_X27 = 1ULL << 27; + static const uint64_t CONTEXT_VALID_X28 = 1ULL << 28; + static const uint64_t CONTEXT_VALID_X29 = 1ULL << 29; + static const uint64_t CONTEXT_VALID_X30 = 1ULL << 30; + static const uint64_t CONTEXT_VALID_X31 = 1ULL << 31; + static const uint64_t CONTEXT_VALID_X32 = 1ULL << 32; + static const uint64_t CONTEXT_VALID_ALL = ~CONTEXT_VALID_NONE; + + // Aliases for registers with dedicated or conventional roles. + static const uint64_t CONTEXT_VALID_FP = CONTEXT_VALID_X29; + static const uint64_t CONTEXT_VALID_LR = CONTEXT_VALID_X30; + static const uint64_t CONTEXT_VALID_SP = CONTEXT_VALID_X31; + static const uint64_t CONTEXT_VALID_PC = CONTEXT_VALID_X32; + + StackFrameARM64() : context(), + context_validity(CONTEXT_VALID_NONE) {} + + // Return the validity flag for register xN. + static uint64_t RegisterValidFlag(int n) { + return 1ULL << n; + } + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, the values of nonvolatile registers may be + // present, given sufficient debugging information. Refer to + // context_validity. + MDRawContextARM64 context; + + // For each register in context whose value has been recovered, we set + // the corresponding CONTEXT_VALID_ bit in context_validity. + uint64_t context_validity; +}; + +struct StackFrameMIPS : public StackFrame { + // MIPS callee save registers for o32 ABI (32bit registers) are: + // 1. $s0-$s7, + // 2. $sp, $fp + // 3. $f20-$f31 + // + // The register structure is available at + // http://en.wikipedia.org/wiki/MIPS_architecture#Compiler_register_usage + +#define INDEX_MIPS_REG_S0 MD_CONTEXT_MIPS_REG_S0 // 16 +#define INDEX_MIPS_REG_S7 MD_CONTEXT_MIPS_REG_S7 // 23 +#define INDEX_MIPS_REG_GP MD_CONTEXT_MIPS_REG_GP // 28 +#define INDEX_MIPS_REG_RA MD_CONTEXT_MIPS_REG_RA // 31 +#define INDEX_MIPS_REG_PC 34 +#define SHIFT_MIPS_REG_S0 0 +#define SHIFT_MIPS_REG_GP 8 +#define SHIFT_MIPS_REG_PC 12 + + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_S0 = 1 << 0, // $16 + CONTEXT_VALID_S1 = 1 << 1, // $17 + CONTEXT_VALID_S2 = 1 << 2, // $18 + CONTEXT_VALID_S3 = 1 << 3, // $19 + CONTEXT_VALID_S4 = 1 << 4, // $20 + CONTEXT_VALID_S5 = 1 << 5, // $21 + CONTEXT_VALID_S6 = 1 << 6, // $22 + CONTEXT_VALID_S7 = 1 << 7, // $23 + // GP is not calee-save for o32 abi. + CONTEXT_VALID_GP = 1 << 8, // $28 + CONTEXT_VALID_SP = 1 << 9, // $29 + CONTEXT_VALID_FP = 1 << 10, // $30 + CONTEXT_VALID_RA = 1 << 11, // $31 + CONTEXT_VALID_PC = 1 << 12, // $34 + CONTEXT_VALID_ALL = ~CONTEXT_VALID_NONE + }; + + // Return the ContextValidity flag for register rN. + static ContextValidity RegisterValidFlag(int n) { + if (n >= INDEX_MIPS_REG_S0 && n <= INDEX_MIPS_REG_S7) + return ContextValidity(1 << (n - INDEX_MIPS_REG_S0 + SHIFT_MIPS_REG_S0)); + else if (n >= INDEX_MIPS_REG_GP && n <= INDEX_MIPS_REG_RA) + return ContextValidity(1 << (n - INDEX_MIPS_REG_GP + SHIFT_MIPS_REG_GP)); + else if (n == INDEX_MIPS_REG_PC) + return ContextValidity(1 << SHIFT_MIPS_REG_PC); + + return CONTEXT_VALID_NONE; + } + + StackFrameMIPS() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, which registers are present depends on what + // debugging information were available. Refer to 'context_validity' below. + MDRawContextMIPS context; + + // For each register in context whose value has been recovered, + // the corresponding CONTEXT_VALID_ bit in 'context_validity' is set. + // + // context_validity's type should actually be ContextValidity, but + // type int is used instead because the bitwise inclusive or operator + // yields an int when applied to enum values, and C++ doesn't + // silently convert from ints to enums. + int context_validity; +}; + +struct StackFrameRISCV : public StackFrame { + + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_PC = 1 << 0, + CONTEXT_VALID_RA = 1 << 1, + CONTEXT_VALID_SP = 1 << 2, + CONTEXT_VALID_GP = 1 << 3, + CONTEXT_VALID_TP = 1 << 4, + CONTEXT_VALID_T0 = 1 << 5, + CONTEXT_VALID_T1 = 1 << 6, + CONTEXT_VALID_T2 = 1 << 7, + CONTEXT_VALID_S0 = 1 << 8, + CONTEXT_VALID_S1 = 1 << 9, + CONTEXT_VALID_A0 = 1 << 10, + CONTEXT_VALID_A1 = 1 << 11, + CONTEXT_VALID_A2 = 1 << 12, + CONTEXT_VALID_A3 = 1 << 13, + CONTEXT_VALID_A4 = 1 << 14, + CONTEXT_VALID_A5 = 1 << 15, + CONTEXT_VALID_A6 = 1 << 16, + CONTEXT_VALID_A7 = 1 << 17, + CONTEXT_VALID_S2 = 1 << 18, + CONTEXT_VALID_S3 = 1 << 19, + CONTEXT_VALID_S4 = 1 << 20, + CONTEXT_VALID_S5 = 1 << 21, + CONTEXT_VALID_S6 = 1 << 22, + CONTEXT_VALID_S7 = 1 << 23, + CONTEXT_VALID_S8 = 1 << 24, + CONTEXT_VALID_S9 = 1 << 25, + CONTEXT_VALID_S10 = 1 << 26, + CONTEXT_VALID_S11 = 1 << 27, + CONTEXT_VALID_T3 = 1 << 28, + CONTEXT_VALID_T4 = 1 << 29, + CONTEXT_VALID_T5 = 1 << 30, + CONTEXT_VALID_T6 = 1 << 31, + CONTEXT_VALID_ALL = ~CONTEXT_VALID_NONE + }; + + StackFrameRISCV() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, which registers are present depends on what + // debugging information were available. Refer to 'context_validity' below. + MDRawContextRISCV context; + + // For each register in context whose value has been recovered, + // the corresponding CONTEXT_VALID_ bit in 'context_validity' is set. + // + // context_validity's type should actually be ContextValidity, but + // type int is used instead because the bitwise inclusive or operator + // yields an int when applied to enum values, and C++ doesn't + // silently convert from ints to enums. + int context_validity; +}; + +struct StackFrameRISCV64 : public StackFrame { + + enum ContextValidity { + CONTEXT_VALID_NONE = 0, + CONTEXT_VALID_PC = 1 << 0, + CONTEXT_VALID_RA = 1 << 1, + CONTEXT_VALID_SP = 1 << 2, + CONTEXT_VALID_GP = 1 << 3, + CONTEXT_VALID_TP = 1 << 4, + CONTEXT_VALID_T0 = 1 << 5, + CONTEXT_VALID_T1 = 1 << 6, + CONTEXT_VALID_T2 = 1 << 7, + CONTEXT_VALID_S0 = 1 << 8, + CONTEXT_VALID_S1 = 1 << 9, + CONTEXT_VALID_A0 = 1 << 10, + CONTEXT_VALID_A1 = 1 << 11, + CONTEXT_VALID_A2 = 1 << 12, + CONTEXT_VALID_A3 = 1 << 13, + CONTEXT_VALID_A4 = 1 << 14, + CONTEXT_VALID_A5 = 1 << 15, + CONTEXT_VALID_A6 = 1 << 16, + CONTEXT_VALID_A7 = 1 << 17, + CONTEXT_VALID_S2 = 1 << 18, + CONTEXT_VALID_S3 = 1 << 19, + CONTEXT_VALID_S4 = 1 << 20, + CONTEXT_VALID_S5 = 1 << 21, + CONTEXT_VALID_S6 = 1 << 22, + CONTEXT_VALID_S7 = 1 << 23, + CONTEXT_VALID_S8 = 1 << 24, + CONTEXT_VALID_S9 = 1 << 25, + CONTEXT_VALID_S10 = 1 << 26, + CONTEXT_VALID_S11 = 1 << 27, + CONTEXT_VALID_T3 = 1 << 28, + CONTEXT_VALID_T4 = 1 << 29, + CONTEXT_VALID_T5 = 1 << 30, + CONTEXT_VALID_T6 = 1 << 31, + CONTEXT_VALID_ALL = ~CONTEXT_VALID_NONE + }; + + StackFrameRISCV64() : context(), context_validity(CONTEXT_VALID_NONE) {} + + // Register state. This is only fully valid for the topmost frame in a + // stack. In other frames, which registers are present depends on what + // debugging information were available. Refer to 'context_validity' below. + MDRawContextRISCV64 context; + + // For each register in context whose value has been recovered, + // the corresponding CONTEXT_VALID_ bit in 'context_validity' is set. + // + // context_validity's type should actually be ContextValidity, but + // type int is used instead because the bitwise inclusive or operator + // yields an int when applied to enum values, and C++ doesn't + // silently convert from ints to enums. + int context_validity; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__ diff --git a/src/google_breakpad/processor/stack_frame_symbolizer.h b/src/google_breakpad/processor/stack_frame_symbolizer.h new file mode 100644 index 0000000..ed342ce --- /dev/null +++ b/src/google_breakpad/processor/stack_frame_symbolizer.h @@ -0,0 +1,113 @@ +// -*- mode: C++ -*- + +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Helper class that encapsulates the logic of how symbol supplier interacts +// with source line resolver to fill stack frame information. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_SYMBOLIZER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_SYMBOLIZER_H__ + +#include +#include +#include +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/code_module.h" + +namespace google_breakpad { +class CFIFrameInfo; +class CodeModules; +class SymbolSupplier; +class SourceLineResolverInterface; +struct StackFrame; +struct SystemInfo; +struct WindowsFrameInfo; + +class StackFrameSymbolizer { + public: + enum SymbolizerResult { + // Symbol data was found and successfully loaded in resolver. + // This does NOT guarantee source line info is found within symbol file. + kNoError, + // This indicates non-critical error, such as, no code module found for + // frame's instruction, no symbol file, or resolver failed to load symbol. + kError, + // This indicates error for which stack walk should be interrupted + // and retried in future. + kInterrupt, + // Symbol data was found and loaded in resolver however some corruptions + // were detected. + kWarningCorruptSymbols, + }; + + StackFrameSymbolizer(SymbolSupplier* supplier, + SourceLineResolverInterface* resolver); + + virtual ~StackFrameSymbolizer() { } + + // Encapsulate the step of resolving source line info for a stack frame. + // "frame" must not be NULL. + virtual SymbolizerResult FillSourceLineInfo( + const CodeModules* modules, + const CodeModules* unloaded_modules, + const SystemInfo* system_info, + StackFrame* stack_frame, + std::deque>* inlined_frames); + + virtual WindowsFrameInfo* FindWindowsFrameInfo(const StackFrame* frame); + + virtual CFIFrameInfo* FindCFIFrameInfo(const StackFrame* frame); + + // Reset internal (locally owned) data as if the helper is re-instantiated. + // A typical case is to call Reset() after processing an individual report + // before start to process next one, in order to reset internal information + // about missing symbols found so far. + virtual void Reset() { no_symbol_modules_.clear(); } + + // Returns true if there is valid implementation for stack symbolization. + virtual bool HasImplementation() { return resolver_ && supplier_; } + + SourceLineResolverInterface* resolver() { return resolver_; } + SymbolSupplier* supplier() { return supplier_; } + + protected: + SymbolSupplier* supplier_; + SourceLineResolverInterface* resolver_; + // A list of modules known to have symbols missing. This helps avoid + // repeated lookups for the missing symbols within one minidump. + std::set no_symbol_modules_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_SYMBOLIZER_H__ diff --git a/src/google_breakpad/processor/stackwalker.h b/src/google_breakpad/processor/stackwalker.h new file mode 100644 index 0000000..e5d88c8 --- /dev/null +++ b/src/google_breakpad/processor/stackwalker.h @@ -0,0 +1,260 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker.h: Generic stackwalker. +// +// The Stackwalker class is an abstract base class providing common generic +// methods that apply to stacks from all systems. Specific implementations +// will extend this class by providing GetContextFrame and GetCallerFrame +// methods to fill in system-specific data in a StackFrame structure. +// Stackwalker assembles these StackFrame strucutres into a CallStack. +// +// Author: Mark Mentovai + + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__ + +#include +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame_symbolizer.h" + +namespace google_breakpad { + +class CallStack; +class DumpContext; +class StackFrameSymbolizer; + +using std::set; +using std::vector; + +class Stackwalker { + public: + virtual ~Stackwalker() {} + + // Populates the given CallStack by calling GetContextFrame and + // GetCallerFrame. The frames are further processed to fill all available + // data. Returns true if the stackwalk completed, or false if it was + // interrupted by SymbolSupplier::GetSymbolFile(). + // Upon return, |modules_without_symbols| will be populated with pointers to + // the code modules (CodeModule*) that DON'T have symbols. + // |modules_with_corrupt_symbols| will be populated with pointers to the + // modules which have corrupt symbols. |modules_without_symbols| and + // |modules_with_corrupt_symbols| DO NOT take ownership of the code modules. + // The lifetime of these code modules is the same as the lifetime of the + // CodeModules passed to the StackWalker constructor (which currently + // happens to be the lifetime of the Breakpad's ProcessingState object). + // There is a check for duplicate modules so no duplicates are expected. + bool Walk(CallStack* stack, + vector* modules_without_symbols, + vector* modules_with_corrupt_symbols); + + // Returns a new concrete subclass suitable for the CPU that a stack was + // generated on, according to the CPU type indicated by the context + // argument. If no suitable concrete subclass exists, returns NULL. + static Stackwalker* StackwalkerForCPU( + const SystemInfo* system_info, + DumpContext* context, + MemoryRegion* memory, + const CodeModules* modules, + const CodeModules* unloaded_modules, + StackFrameSymbolizer* resolver_helper); + + + static void set_max_frames(uint32_t max_frames) { + max_frames_ = max_frames; + max_frames_set_ = true; + } + static uint32_t max_frames() { return max_frames_; } + + static void set_max_frames_scanned(uint32_t max_frames_scanned) { + max_frames_scanned_ = max_frames_scanned; + } + + protected: + // system_info identifies the operating system, NULL or empty if unknown. + // memory identifies a MemoryRegion that provides the stack memory + // for the stack to walk. modules, if non-NULL, is a CodeModules + // object that is used to look up which code module each stack frame is + // associated with. frame_symbolizer is a StackFrameSymbolizer object that + // encapsulates the logic of how source line resolver interacts with symbol + // supplier to symbolize stack frame and look up caller frame information + // (see stack_frame_symbolizer.h). + // frame_symbolizer MUST NOT be NULL (asserted). + Stackwalker(const SystemInfo* system_info, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + // This can be used to filter out potential return addresses when + // the stack walker resorts to stack scanning. + // Returns true if any of: + // * This address is within a loaded module, but we don't have symbols + // for that module. + // * This address is within a loaded module for which we have symbols, + // and falls inside a function in that module. + // Returns false otherwise. + bool InstructionAddressSeemsValid(uint64_t address) const; + + // Checks whether we should stop the stack trace. + // (either we reached the end-of-stack or we detected a + // broken callstack invariant) + bool TerminateWalk(uint64_t caller_ip, + uint64_t caller_sp, + uint64_t callee_sp, + bool first_unwind) const; + + // The default number of words to search through on the stack + // for a return address. + static const int kRASearchWords; + + template + bool ScanForReturnAddress(InstructionType location_start, + InstructionType* location_found, + InstructionType* ip_found, + bool is_context_frame) { + // When searching for the caller of the context frame, + // allow the scanner to look farther down the stack. + const int search_words = is_context_frame ? + kRASearchWords * 4 : + kRASearchWords; + + return ScanForReturnAddress(location_start, location_found, ip_found, + search_words); + } + + // Scan the stack starting at location_start, looking for an address + // that looks like a valid instruction pointer. Addresses must + // 1) be contained in the current stack memory + // 2) pass the checks in InstructionAddressSeemsValid + // + // Returns true if a valid-looking instruction pointer was found. + // When returning true, sets location_found to the address at which + // the value was found, and ip_found to the value contained at that + // location in memory. + template + bool ScanForReturnAddress(InstructionType location_start, + InstructionType* location_found, + InstructionType* ip_found, + int searchwords) { + for (InstructionType location = location_start; + location <= location_start + searchwords * sizeof(InstructionType); + location += sizeof(InstructionType)) { + InstructionType ip; + if (!memory_->GetMemoryAtAddress(location, &ip)) + break; + + // The return address points to the instruction after a call. If the + // caller was a no return function, this might point past the end of the + // function. Subtract one from the instruction pointer so it points into + // the call instruction instead. + if (modules_ && modules_->GetModuleForAddress(ip - 1) && + InstructionAddressSeemsValid(ip - 1)) { + *ip_found = ip; + *location_found = location; + return true; + } + } + // nothing found + return false; + } + + // Information about the system that produced the minidump. Subclasses + // and the SymbolSupplier may find this information useful. + const SystemInfo* system_info_; + + // The stack memory to walk. Subclasses will require this region to + // get information from the stack. + MemoryRegion* memory_; + + // A list of modules, for populating each StackFrame's module information. + // This field is optional and may be NULL. + const CodeModules* modules_; + + // A list of unloaded modules, for populating frames which aren't matched + // to any loaded modules. + // This field is optional and may be NULL. + const CodeModules* unloaded_modules_; + + protected: + // The StackFrameSymbolizer implementation. + StackFrameSymbolizer* frame_symbolizer_; + + private: + // Obtains the context frame, the innermost called procedure in a stack + // trace. Returns NULL on failure. GetContextFrame allocates a new + // StackFrame (or StackFrame subclass), ownership of which is taken by + // the caller. + virtual StackFrame* GetContextFrame() = 0; + + // Obtains a caller frame. Each call to GetCallerFrame should return the + // frame that called the last frame returned by GetContextFrame or + // GetCallerFrame. To aid this purpose, stack contains the CallStack + // made of frames that have already been walked. GetCallerFrame should + // return NULL on failure or when there are no more caller frames (when + // the end of the stack has been reached). GetCallerFrame allocates a new + // StackFrame (or StackFrame subclass), ownership of which is taken by + // the caller. |stack_scan_allowed| controls whether stack scanning is + // an allowable frame-recovery method, since it is desirable to be able to + // disable stack scanning in performance-critical use cases. + // + // CONSIDER: a way to differentiate between: + // - full stack traces + // - explicitly truncated traces (max_frames_) + // - stopping after max scanned frames + // - failed stack walk (breaking one of the stack walk invariants) + // + virtual StackFrame* GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) = 0; + + // The maximum number of frames Stackwalker will walk through. + // This defaults to 1024 to prevent infinite loops. + static uint32_t max_frames_; + + // Keep track of whether max_frames_ has been set by the user, since + // it affects whether or not an error message is printed in the case + // where an unwind got stopped by the limit. + static bool max_frames_set_; + + // The maximum number of stack-scanned and otherwise untrustworthy + // frames allowed. Stack-scanning can be expensive, so the option to + // disable or limit it is helpful in cases where unwind performance is + // important. This defaults to 1024, the same as max_frames_. + static uint32_t max_frames_scanned_; +}; + +} // namespace google_breakpad + + +#endif // GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__ diff --git a/src/google_breakpad/processor/symbol_supplier.h b/src/google_breakpad/processor/symbol_supplier.h new file mode 100644 index 0000000..b1c2353 --- /dev/null +++ b/src/google_breakpad/processor/symbol_supplier.h @@ -0,0 +1,98 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// The caller may implement the SymbolSupplier abstract base class +// to provide symbols for a given module. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__ + +#include +#include "common/using_std_string.h" + +namespace google_breakpad { + +class CodeModule; +struct SystemInfo; + +class SymbolSupplier { + public: + // Result type for GetSymbolFile + enum SymbolResult { + // no symbols were found, but continue processing + NOT_FOUND, + + // symbols were found, and the path has been placed in symbol_file + FOUND, + + // stops processing the minidump immediately + INTERRUPT + }; + + virtual ~SymbolSupplier() {} + + // Retrieves the symbol file for the given CodeModule, placing the + // path in symbol_file if successful. system_info contains strings + // identifying the operating system and CPU; SymbolSupplier may use + // to help locate the symbol file. system_info may be NULL or its + // fields may be empty if these values are unknown. symbol_file + // must be a pointer to a valid string + virtual SymbolResult GetSymbolFile(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file) = 0; + // Same as above, except also places symbol data into symbol_data. + // If symbol_data is NULL, the data is not returned. + // TODO(nealsid) Once we have symbol data caching behavior implemented + // investigate making all symbol suppliers implement all methods, + // and make this pure virtual + virtual SymbolResult GetSymbolFile(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + string* symbol_data) = 0; + + // Same as above, except allocates data buffer on heap and then places the + // symbol data into the buffer as C-string. + // SymbolSupplier is responsible for deleting the data buffer. After the call + // to GetCStringSymbolData(), the caller should call FreeSymbolData(const + // Module* module) once the data buffer is no longer needed. + // If symbol_data is not NULL, symbol supplier won't return FOUND unless it + // returns a valid buffer in symbol_data, e.g., returns INTERRUPT on memory + // allocation failure. + virtual SymbolResult GetCStringSymbolData(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + char** symbol_data, + size_t* symbol_data_size) = 0; + + // Frees the data buffer allocated for the module in GetCStringSymbolData. + virtual void FreeSymbolData(const CodeModule* module) = 0; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__ diff --git a/src/google_breakpad/processor/system_info.h b/src/google_breakpad/processor/system_info.h new file mode 100644 index 0000000..01c4818 --- /dev/null +++ b/src/google_breakpad/processor/system_info.h @@ -0,0 +1,105 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// system_info.h: Information about the system that was running a program +// when a crash report was produced. +// +// Author: Mark Mentovai + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__ +#define GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__ + +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +struct SystemInfo { + public: + SystemInfo() : os(), os_short(), os_version(), cpu(), cpu_info(), + cpu_count(0), gl_version(), gl_vendor(), gl_renderer() {} + + // Resets the SystemInfo object to its default values. + void Clear() { + os.clear(); + os_short.clear(); + os_version.clear(); + cpu.clear(); + cpu_info.clear(); + cpu_count = 0; + gl_version.clear(); + gl_vendor.clear(); + gl_renderer.clear(); + } + + // A string identifying the operating system, such as "Windows NT", + // "Mac OS X", or "Linux". If the information is present in the dump but + // its value is unknown, this field will contain a numeric value. If + // the information is not present in the dump, this field will be empty. + string os; + + // A short form of the os string, using lowercase letters and no spaces, + // suitable for use in a filesystem. Possible values include "windows", + // "mac", "linux" and "nacl". Empty if the information is not present + // in the dump or if the OS given by the dump is unknown. The values + // stored in this field should match those used by + // MinidumpSystemInfo::GetOS. + string os_short; + + // A string identifying the version of the operating system, such as + // "5.1.2600 Service Pack 2" or "10.4.8 8L2127". If the dump does not + // contain this information, this field will be empty. + string os_version; + + // A string identifying the basic CPU family, such as "x86" or "ppc". + // If this information is present in the dump but its value is unknown, + // this field will contain a numeric value. If the information is not + // present in the dump, this field will be empty. The values stored in + // this field should match those used by MinidumpSystemInfo::GetCPU. + string cpu; + + // A string further identifying the specific CPU, such as + // "GenuineIntel level 6 model 13 stepping 8". If the information is not + // present in the dump, or additional identifying information is not + // defined for the CPU family, this field will be empty. + string cpu_info; + + // The number of processors in the system. Will be greater than one for + // multi-core systems. + int cpu_count; + + // The GPU information. Currently only populated in microdumps. + string gl_version; + string gl_vendor; + string gl_renderer; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__ diff --git a/src/processor/address_map-inl.h b/src/processor/address_map-inl.h new file mode 100644 index 0000000..e1b944d --- /dev/null +++ b/src/processor/address_map-inl.h @@ -0,0 +1,92 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// address_map-inl.h: Address map implementation. +// +// See address_map.h for documentation. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_ADDRESS_MAP_INL_H__ +#define PROCESSOR_ADDRESS_MAP_INL_H__ + +#include "processor/address_map.h" + +#include + +#include "processor/logging.h" + +namespace google_breakpad { + +template +bool AddressMap::Store(const AddressType& address, + const EntryType& entry) { + // Ensure that the specified address doesn't conflict with something already + // in the map. + if (map_.find(address) != map_.end()) { + BPLOG(INFO) << "Store failed, address " << HexString(address) << + " is already present"; + return false; + } + + map_.insert(MapValue(address, entry)); + return true; +} + +template +bool AddressMap::Retrieve( + const AddressType& address, + EntryType* entry, AddressType* entry_address) const { + BPLOG_IF(ERROR, !entry) << "AddressMap::Retrieve requires |entry|"; + assert(entry); + + // upper_bound gives the first element whose key is greater than address, + // but we want the first element whose key is less than or equal to address. + // Decrement the iterator to get there, but not if the upper_bound already + // points to the beginning of the map - in that case, address is lower than + // the lowest stored key, so return false. + MapConstIterator iterator = map_.upper_bound(address); + if (iterator == map_.begin()) + return false; + --iterator; + + *entry = iterator->second; + if (entry_address) + *entry_address = iterator->first; + + return true; +} + +template +void AddressMap::Clear() { + map_.clear(); +} + +} // namespace google_breakpad + +#endif // PROCESSOR_ADDRESS_MAP_INL_H__ diff --git a/src/processor/address_map.h b/src/processor/address_map.h new file mode 100644 index 0000000..8a4f7ba --- /dev/null +++ b/src/processor/address_map.h @@ -0,0 +1,84 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// address_map.h: Address maps. +// +// An address map contains a set of objects keyed by address. Objects are +// retrieved from the map by returning the object with the highest key less +// than or equal to the lookup key. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_ADDRESS_MAP_H__ +#define PROCESSOR_ADDRESS_MAP_H__ + +#include + +namespace google_breakpad { + +// Forward declarations (for later friend declarations). +template class AddressMapSerializer; + +template +class AddressMap { + public: + AddressMap() : map_() {} + + // Inserts an entry into the map. Returns false without storing the entry + // if an entry is already stored in the map at the same address as specified + // by the address argument. + bool Store(const AddressType& address, const EntryType& entry); + + // Locates the entry stored at the highest address less than or equal to + // the address argument. If there is no such range, returns false. The + // entry is returned in entry, which is a required argument. If + // entry_address is not NULL, it will be set to the address that the entry + // was stored at. + bool Retrieve(const AddressType& address, + EntryType* entry, AddressType* entry_address) const; + + // Empties the address map, restoring it to the same state as when it was + // initially created. + void Clear(); + + private: + friend class AddressMapSerializer; + friend class ModuleComparer; + + // Convenience types. + typedef std::map AddressToEntryMap; + typedef typename AddressToEntryMap::const_iterator MapConstIterator; + typedef typename AddressToEntryMap::value_type MapValue; + + // Maps the address of each entry to an EntryType. + AddressToEntryMap map_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_ADDRESS_MAP_H__ diff --git a/src/processor/address_map_unittest.cc b/src/processor/address_map_unittest.cc new file mode 100644 index 0000000..2d754b6 --- /dev/null +++ b/src/processor/address_map_unittest.cc @@ -0,0 +1,199 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// address_map_unittest.cc: Unit tests for AddressMap. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "processor/address_map-inl.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" + +#define ASSERT_TRUE(condition) \ + if (!(condition)) { \ + fprintf(stderr, "FAIL: %s @ %s:%d\n", #condition, __FILE__, __LINE__); \ + return false; \ + } + +#define ASSERT_FALSE(condition) ASSERT_TRUE(!(condition)) + +#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2)) + +namespace { + +using google_breakpad::AddressMap; +using google_breakpad::linked_ptr; + +// A CountedObject holds an int. A global (not thread safe!) count of +// allocated CountedObjects is maintained to help test memory management. +class CountedObject { + public: + explicit CountedObject(int id) : id_(id) { ++count_; } + ~CountedObject() { --count_; } + + static int count() { return count_; } + int id() const { return id_; } + + private: + static int count_; + int id_; +}; + +int CountedObject::count_; + +typedef int AddressType; +typedef AddressMap< AddressType, linked_ptr > TestMap; + +static bool DoAddressMapTest() { + ASSERT_EQ(CountedObject::count(), 0); + + TestMap test_map; + linked_ptr entry; + AddressType address; + + // Check that a new map is truly empty. + ASSERT_FALSE(test_map.Retrieve(0, &entry, &address)); + ASSERT_FALSE(test_map.Retrieve(INT_MIN, &entry, &address)); + ASSERT_FALSE(test_map.Retrieve(INT_MAX, &entry, &address)); + + // Check that Clear clears the map without leaking. + ASSERT_EQ(CountedObject::count(), 0); + ASSERT_TRUE(test_map.Store(1, + linked_ptr(new CountedObject(0)))); + ASSERT_TRUE(test_map.Retrieve(1, &entry, &address)); + ASSERT_EQ(CountedObject::count(), 1); + test_map.Clear(); + ASSERT_EQ(CountedObject::count(), 1); // still holding entry in this scope + + // Check that a cleared map is truly empty. + ASSERT_FALSE(test_map.Retrieve(0, &entry, &address)); + ASSERT_FALSE(test_map.Retrieve(INT_MIN, &entry, &address)); + ASSERT_FALSE(test_map.Retrieve(INT_MAX, &entry, &address)); + + // Check a single-element map. + ASSERT_TRUE(test_map.Store(10, + linked_ptr(new CountedObject(1)))); + ASSERT_FALSE(test_map.Retrieve(9, &entry, &address)); + ASSERT_TRUE(test_map.Retrieve(10, &entry, &address)); + ASSERT_EQ(CountedObject::count(), 1); + ASSERT_EQ(entry->id(), 1); + ASSERT_EQ(address, 10); + ASSERT_TRUE(test_map.Retrieve(11, &entry, &address)); + ASSERT_TRUE(test_map.Retrieve(11, &entry, NULL)); // NULL ok here + + // Add some more elements. + ASSERT_TRUE(test_map.Store(5, + linked_ptr(new CountedObject(2)))); + ASSERT_EQ(CountedObject::count(), 2); + ASSERT_TRUE(test_map.Store(20, + linked_ptr(new CountedObject(3)))); + ASSERT_TRUE(test_map.Store(15, + linked_ptr(new CountedObject(4)))); + ASSERT_FALSE(test_map.Store(10, + linked_ptr(new CountedObject(5)))); // already in map + ASSERT_TRUE(test_map.Store(16, + linked_ptr(new CountedObject(6)))); + ASSERT_TRUE(test_map.Store(14, + linked_ptr(new CountedObject(7)))); + + // Nothing was stored with a key under 5. Don't use ASSERT inside loops + // because it won't show exactly which key/entry/address failed. + for (AddressType key = 0; key < 5; ++key) { + if (test_map.Retrieve(key, &entry, &address)) { + fprintf(stderr, + "FAIL: retrieve %d expected false observed true @ %s:%d\n", + key, __FILE__, __LINE__); + return false; + } + } + + // Check everything that was stored. + const int id_verify[] = { 0, 0, 0, 0, 0, // unused + 2, 2, 2, 2, 2, // 5 - 9 + 1, 1, 1, 1, 7, // 10 - 14 + 4, 6, 6, 6, 6, // 15 - 19 + 3, 3, 3, 3, 3, // 20 - 24 + 3, 3, 3, 3, 3 }; // 25 - 29 + const AddressType address_verify[] = { 0, 0, 0, 0, 0, // unused + 5, 5, 5, 5, 5, // 5 - 9 + 10, 10, 10, 10, 14, // 10 - 14 + 15, 16, 16, 16, 16, // 15 - 19 + 20, 20, 20, 20, 20, // 20 - 24 + 20, 20, 20, 20, 20 }; // 25 - 29 + + for (AddressType key = 5; key < 30; ++key) { + if (!test_map.Retrieve(key, &entry, &address)) { + fprintf(stderr, + "FAIL: retrieve %d expected true observed false @ %s:%d\n", + key, __FILE__, __LINE__); + return false; + } + if (entry->id() != id_verify[key]) { + fprintf(stderr, + "FAIL: retrieve %d expected entry %d observed %d @ %s:%d\n", + key, id_verify[key], entry->id(), __FILE__, __LINE__); + return false; + } + if (address != address_verify[key]) { + fprintf(stderr, + "FAIL: retrieve %d expected address %d observed %d @ %s:%d\n", + key, address_verify[key], address, __FILE__, __LINE__); + return false; + } + } + + // The stored objects should still be in the map. + ASSERT_EQ(CountedObject::count(), 6); + + return true; +} + +static bool RunTests() { + if (!DoAddressMapTest()) + return false; + + // Leak check. + ASSERT_EQ(CountedObject::count(), 0); + + return true; +} + +} // namespace + +int main(int argc, char** argv) { + BPLOG_INIT(&argc, &argv); + + return RunTests() ? 0 : 1; +} diff --git a/src/processor/basic_code_module.h b/src/processor/basic_code_module.h new file mode 100644 index 0000000..9da62d9 --- /dev/null +++ b/src/processor/basic_code_module.h @@ -0,0 +1,120 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// basic_code_module.h: Carries information about code modules that are loaded +// into a process. +// +// This is a basic concrete implementation of CodeModule. It cannot be +// instantiated directly, only based on other objects that implement +// the CodeModule interface. It exists to provide a CodeModule implementation +// a place to store information when the life of the original object (such as +// a MinidumpModule) cannot be guaranteed. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_BASIC_CODE_MODULE_H__ +#define PROCESSOR_BASIC_CODE_MODULE_H__ + +#include + +#include "common/using_std_string.h" +#include "google_breakpad/processor/code_module.h" + +namespace google_breakpad { + +class BasicCodeModule : public CodeModule { + public: + // Creates a new BasicCodeModule given any existing CodeModule + // implementation. This is useful to make a copy of the data relevant to + // the CodeModule interface without requiring all of the resources that + // other CodeModule implementations may require. + explicit BasicCodeModule(const CodeModule *that) + : base_address_(that->base_address()), + size_(that->size()), + shrink_down_delta_(that->shrink_down_delta()), + code_file_(that->code_file()), + code_identifier_(that->code_identifier()), + debug_file_(that->debug_file()), + debug_identifier_(that->debug_identifier()), + version_(that->version()), + is_unloaded_(that->is_unloaded()) {} + + BasicCodeModule(uint64_t base_address, uint64_t size, + const string& code_file, + const string& code_identifier, + const string& debug_file, + const string& debug_identifier, + const string& version, + const bool is_unloaded = false) + : base_address_(base_address), + size_(size), + shrink_down_delta_(0), + code_file_(code_file), + code_identifier_(code_identifier), + debug_file_(debug_file), + debug_identifier_(debug_identifier), + version_(version), + is_unloaded_(is_unloaded) + {} + virtual ~BasicCodeModule() {} + + // See code_module.h for descriptions of these methods and the associated + // members. + virtual uint64_t base_address() const { return base_address_; } + virtual uint64_t size() const { return size_; } + virtual uint64_t shrink_down_delta() const { return shrink_down_delta_; } + virtual void SetShrinkDownDelta(uint64_t shrink_down_delta) { + shrink_down_delta_ = shrink_down_delta; + } + virtual string code_file() const { return code_file_; } + virtual string code_identifier() const { return code_identifier_; } + virtual string debug_file() const { return debug_file_; } + virtual string debug_identifier() const { return debug_identifier_; } + virtual string version() const { return version_; } + virtual CodeModule* Copy() const { return new BasicCodeModule(this); } + virtual bool is_unloaded() const { return is_unloaded_; } + + private: + uint64_t base_address_; + uint64_t size_; + uint64_t shrink_down_delta_; + string code_file_; + string code_identifier_; + string debug_file_; + string debug_identifier_; + string version_; + bool is_unloaded_; + + // Disallow copy constructor and assignment operator. + BasicCodeModule(const BasicCodeModule& that); + void operator=(const BasicCodeModule& that); +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_BASIC_CODE_MODULE_H__ diff --git a/src/processor/basic_code_modules.cc b/src/processor/basic_code_modules.cc new file mode 100644 index 0000000..bdfc8f3 --- /dev/null +++ b/src/processor/basic_code_modules.cc @@ -0,0 +1,155 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// basic_code_modules.cc: Contains all of the CodeModule objects that +// were loaded into a single process. +// +// See basic_code_modules.h for documentation. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/basic_code_modules.h" + +#include + +#include + +#include "google_breakpad/processor/code_module.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" +#include "processor/range_map-inl.h" + +namespace google_breakpad { + +using std::vector; + +BasicCodeModules::BasicCodeModules(const CodeModules* that, + MergeRangeStrategy strategy) + : main_address_(0), map_() { + BPLOG_IF(ERROR, !that) << "BasicCodeModules::BasicCodeModules requires " + "|that|"; + assert(that); + + map_.SetMergeStrategy(strategy); + + const CodeModule *main_module = that->GetMainModule(); + if (main_module) + main_address_ = main_module->base_address(); + + unsigned int count = that->module_count(); + for (unsigned int i = 0; i < count; ++i) { + // Make a copy of the module and insert it into the map. Use + // GetModuleAtIndex because ordering is unimportant when slurping the + // entire list, and GetModuleAtIndex may be faster than + // GetModuleAtSequence. + linked_ptr module(that->GetModuleAtIndex(i)->Copy()); + if (!map_.StoreRange(module->base_address(), module->size(), module)) { + BPLOG(ERROR) << "Module " << module->code_file() + << " could not be stored"; + } + } + + // Report modules with shrunk ranges. + for (unsigned int i = 0; i < count; ++i) { + linked_ptr module(that->GetModuleAtIndex(i)->Copy()); + uint64_t delta = 0; + if (map_.RetrieveRange(module->base_address() + module->size() - 1, + &module, NULL /* base */, &delta, NULL /* size */) && + delta > 0) { + BPLOG(INFO) << "The range for module " << module->code_file() + << " was shrunk down by " << HexString(delta) << " bytes."; + linked_ptr shrunk_range_module(module->Copy()); + shrunk_range_module->SetShrinkDownDelta(delta); + shrunk_range_modules_.push_back(shrunk_range_module); + } + } + + // TODO(ivanpe): Report modules with conflicting ranges. The list of such + // modules should be copied from |that|. +} + +BasicCodeModules::BasicCodeModules() : main_address_(0), map_() { } + +BasicCodeModules::~BasicCodeModules() { +} + +unsigned int BasicCodeModules::module_count() const { + return map_.GetCount(); +} + +const CodeModule* BasicCodeModules::GetModuleForAddress( + uint64_t address) const { + linked_ptr module; + if (!map_.RetrieveRange(address, &module, NULL /* base */, NULL /* delta */, + NULL /* size */)) { + BPLOG(INFO) << "No module at " << HexString(address); + return NULL; + } + + return module.get(); +} + +const CodeModule* BasicCodeModules::GetMainModule() const { + return GetModuleForAddress(main_address_); +} + +const CodeModule* BasicCodeModules::GetModuleAtSequence( + unsigned int sequence) const { + linked_ptr module; + if (!map_.RetrieveRangeAtIndex(sequence, &module, NULL /* base */, + NULL /* delta */, NULL /* size */)) { + BPLOG(ERROR) << "RetrieveRangeAtIndex failed for sequence " << sequence; + return NULL; + } + + return module.get(); +} + +const CodeModule* BasicCodeModules::GetModuleAtIndex( + unsigned int index) const { + // This class stores everything in a RangeMap, without any more-efficient + // way to walk the list of CodeModule objects. Implement GetModuleAtIndex + // using GetModuleAtSequence, which meets all of the requirements, and + // in addition, guarantees ordering. + return GetModuleAtSequence(index); +} + +const CodeModules* BasicCodeModules::Copy() const { + return new BasicCodeModules(this, map_.GetMergeStrategy()); +} + +vector > +BasicCodeModules::GetShrunkRangeModules() const { + return shrunk_range_modules_; +} + +} // namespace google_breakpad diff --git a/src/processor/basic_code_modules.h b/src/processor/basic_code_modules.h new file mode 100644 index 0000000..e9d58f6 --- /dev/null +++ b/src/processor/basic_code_modules.h @@ -0,0 +1,96 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// basic_code_modules.h: Contains all of the CodeModule objects that +// were loaded into a single process. +// +// This is a basic concrete implementation of CodeModules. It cannot be +// instantiated directly, only based on other objects that implement +// the CodeModules interface. It exists to provide a CodeModules +// implementation a place to store information when the life of the original +// object (such as a MinidumpModuleList) cannot be guaranteed. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_BASIC_CODE_MODULES_H__ +#define PROCESSOR_BASIC_CODE_MODULES_H__ + +#include + +#include + +#include "google_breakpad/processor/code_modules.h" +#include "processor/linked_ptr.h" +#include "processor/range_map.h" + +namespace google_breakpad { + +class BasicCodeModules : public CodeModules { + public: + // Creates a new BasicCodeModules object given any existing CodeModules + // implementation. This is useful to make a copy of the data relevant to + // the CodeModules and CodeModule interfaces without requiring all of the + // resources that other implementations may require. A copy will be + // made of each contained CodeModule using CodeModule::Copy. + BasicCodeModules(const CodeModules *that, MergeRangeStrategy strategy); + + virtual ~BasicCodeModules(); + + // See code_modules.h for descriptions of these methods. + virtual unsigned int module_count() const; + virtual const CodeModule* GetModuleForAddress(uint64_t address) const; + virtual const CodeModule* GetMainModule() const; + virtual const CodeModule* GetModuleAtSequence(unsigned int sequence) const; + virtual const CodeModule* GetModuleAtIndex(unsigned int index) const; + virtual const CodeModules* Copy() const; + virtual std::vector > + GetShrunkRangeModules() const; + + protected: + BasicCodeModules(); + + // The base address of the main module. + uint64_t main_address_; + + // The map used to contain each CodeModule, keyed by each CodeModule's + // address range. + RangeMap > map_; + + // A vector of all CodeModules that were shrunk downs due to + // address range conflicts. + std::vector > shrunk_range_modules_; + + private: + // Disallow copy constructor and assignment operator. + BasicCodeModules(const BasicCodeModules& that); + void operator=(const BasicCodeModules& that); +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_BASIC_CODE_MODULES_H__ diff --git a/src/processor/basic_source_line_resolver.cc b/src/processor/basic_source_line_resolver.cc new file mode 100644 index 0000000..220bd74 --- /dev/null +++ b/src/processor/basic_source_line_resolver.cc @@ -0,0 +1,930 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// basic_source_line_resolver.cc: BasicSourceLineResolver implementation. +// +// See basic_source_line_resolver.h and basic_source_line_resolver_types.h +// for documentation. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "processor/basic_source_line_resolver_types.h" +#include "processor/module_factory.h" + +#include "processor/tokenize.h" + +using std::deque; +using std::make_pair; +using std::map; +using std::unique_ptr; +using std::vector; + +namespace google_breakpad { + +#ifdef _WIN32 +#ifdef _MSC_VER +#define strtok_r strtok_s +#endif +#define strtoull _strtoui64 +#endif + +namespace { + +// Utility function to tokenize given the presence of an optional initial +// field. In this case, optional_field is the expected string for the optional +// field, and max_tokens is the maximum number of tokens including the optional +// field. Refer to the documentation for Tokenize for descriptions of the other +// arguments. +bool TokenizeWithOptionalField(char* line, + const char* optional_field, + const char* separators, + int max_tokens, + vector* tokens) { + // First tokenize assuming the optional field is not present. If we then see + // the optional field, additionally tokenize the last token into two tokens. + if (!Tokenize(line, separators, max_tokens - 1, tokens)) { + return false; + } + + if (strcmp(tokens->front(), optional_field) == 0) { + // The optional field is present. Split the last token in two to recover the + // field prior to the last. + vector last_tokens; + if (!Tokenize(tokens->back(), separators, 2, &last_tokens)) { + return false; + } + // Replace the previous last token with the two new tokens. + tokens->pop_back(); + tokens->push_back(last_tokens[0]); + tokens->push_back(last_tokens[1]); + } + + return true; +} + +} // namespace + +static const char* kWhitespace = " \r\n"; +static const int kMaxErrorsPrinted = 5; +static const int kMaxErrorsBeforeBailing = 100; + +BasicSourceLineResolver::BasicSourceLineResolver() : + SourceLineResolverBase(new BasicModuleFactory) { } + +// static +void BasicSourceLineResolver::Module::LogParseError( + const string& message, + int line_number, + int* num_errors) { + if (++(*num_errors) <= kMaxErrorsPrinted) { + if (line_number > 0) { + BPLOG(ERROR) << "Line " << line_number << ": " << message; + } else { + BPLOG(ERROR) << message; + } + } +} + +bool BasicSourceLineResolver::Module::LoadMapFromMemory( + char* memory_buffer, + size_t memory_buffer_size) { + linked_ptr cur_func; + int line_number = 0; + int num_errors = 0; + int inline_num_errors = 0; + char* save_ptr; + + // If the length is 0, we can still pretend we have a symbol file. This is + // for scenarios that want to test symbol lookup, but don't necessarily care + // if certain modules do not have any information, like system libraries. + if (memory_buffer_size == 0) { + return true; + } + + // Make sure the last character is null terminator. + size_t last_null_terminator = memory_buffer_size - 1; + if (memory_buffer[last_null_terminator] != '\0') { + memory_buffer[last_null_terminator] = '\0'; + } + + // Skip any null terminators at the end of the memory buffer, and make sure + // there are no other null terminators in the middle of the memory buffer. + bool has_null_terminator_in_the_middle = false; + while (last_null_terminator > 0 && + memory_buffer[last_null_terminator - 1] == '\0') { + last_null_terminator--; + } + for (size_t i = 0; i < last_null_terminator; i++) { + if (memory_buffer[i] == '\0') { + memory_buffer[i] = '_'; + has_null_terminator_in_the_middle = true; + } + } + if (has_null_terminator_in_the_middle) { + LogParseError( + "Null terminator is not expected in the middle of the symbol data", + line_number, + &num_errors); + } + + char* buffer; + buffer = strtok_r(memory_buffer, "\r\n", &save_ptr); + + while (buffer != NULL) { + ++line_number; + + if (strncmp(buffer, "FILE ", 5) == 0) { + if (!ParseFile(buffer)) { + LogParseError("ParseFile on buffer failed", line_number, &num_errors); + } + } else if (strncmp(buffer, "STACK ", 6) == 0) { + if (!ParseStackInfo(buffer)) { + LogParseError("ParseStackInfo failed", line_number, &num_errors); + } + } else if (strncmp(buffer, "FUNC ", 5) == 0) { + cur_func.reset(ParseFunction(buffer)); + if (!cur_func.get()) { + LogParseError("ParseFunction failed", line_number, &num_errors); + } else { + // StoreRange will fail if the function has an invalid address or size. + // We'll silently ignore this, the function and any corresponding lines + // will be destroyed when cur_func is released. + functions_.StoreRange(cur_func->address, cur_func->size, cur_func); + } + } else if (strncmp(buffer, "PUBLIC ", 7) == 0) { + // Clear cur_func: public symbols don't contain line number information. + cur_func.reset(); + + if (!ParsePublicSymbol(buffer)) { + LogParseError("ParsePublicSymbol failed", line_number, &num_errors); + } + } else if (strncmp(buffer, "MODULE ", 7) == 0) { + // Ignore these. They're not of any use to BasicSourceLineResolver, + // which is fed modules by a SymbolSupplier. These lines are present to + // aid other tools in properly placing symbol files so that they can + // be accessed by a SymbolSupplier. + // + // MODULE + } else if (strncmp(buffer, "INFO ", 5) == 0) { + // Ignore these as well, they're similarly just for housekeeping. + // + // INFO CODE_ID + } else if (strncmp(buffer, "INLINE ", 7) == 0) { + linked_ptr in = ParseInline(buffer); + if (!in.get()) + LogParseError("ParseInline failed", line_number, &inline_num_errors); + else + cur_func->AppendInline(in); + } else if (strncmp(buffer, "INLINE_ORIGIN ", 14) == 0) { + if (!ParseInlineOrigin(buffer)) { + LogParseError("ParseInlineOrigin failed", line_number, + &inline_num_errors); + } + } else { + if (!cur_func.get()) { + LogParseError("Found source line data without a function", + line_number, &num_errors); + } else { + Line* line = ParseLine(buffer); + if (!line) { + LogParseError("ParseLine failed", line_number, &num_errors); + } else { + cur_func->lines.StoreRange(line->address, line->size, + linked_ptr(line)); + } + } + } + if (num_errors > kMaxErrorsBeforeBailing) { + break; + } + buffer = strtok_r(NULL, "\r\n", &save_ptr); + } + is_corrupt_ = num_errors > 0; + return true; +} + +void BasicSourceLineResolver::Module::ConstructInlineFrames( + StackFrame* frame, + MemAddr address, + const ContainedRangeMap>& inline_map, + deque>* inlined_frames) const { + vector*> inlines; + if (!inline_map.RetrieveRanges(address, inlines)) { + return; + } + + for (const linked_ptr* const in : inlines) { + unique_ptr new_frame = + unique_ptr(new StackFrame(*frame)); + auto origin = inline_origins_.find(in->get()->origin_id); + if (origin != inline_origins_.end()) { + new_frame->function_name = origin->second->name; + } else { + new_frame->function_name = ""; + } + + // Store call site file and line in current frame, which will be updated + // later. + new_frame->source_line = in->get()->call_site_line; + if (in->get()->has_call_site_file_id) { + auto file = files_.find(in->get()->call_site_file_id); + if (file != files_.end()) { + new_frame->source_file_name = file->second; + } + } + + // Use the starting address of the inlined range as inlined function base. + new_frame->function_base = new_frame->module->base_address(); + for (const auto& range : in->get()->inline_ranges) { + if (address >= range.first && address < range.first + range.second) { + new_frame->function_base += range.first; + break; + } + } + new_frame->trust = StackFrame::FRAME_TRUST_INLINE; + + // The inlines vector has an order from innermost entry to outermost entry. + // By push_back, we will have inlined_frames with the same order. + inlined_frames->push_back(std::move(new_frame)); + } + + // Update the source file and source line for each inlined frame. + if (!inlined_frames->empty()) { + string parent_frame_source_file_name = frame->source_file_name; + int parent_frame_source_line = frame->source_line; + frame->source_file_name = inlined_frames->back()->source_file_name; + frame->source_line = inlined_frames->back()->source_line; + for (unique_ptr& inlined_frame : *inlined_frames) { + std::swap(inlined_frame->source_file_name, parent_frame_source_file_name); + std::swap(inlined_frame->source_line, parent_frame_source_line); + } + } +} + +void BasicSourceLineResolver::Module::LookupAddress( + StackFrame* frame, + deque>* inlined_frames) const { + MemAddr address = frame->instruction - frame->module->base_address(); + + // First, look for a FUNC record that covers address. Use + // RetrieveNearestRange instead of RetrieveRange so that, if there + // is no such function, we can use the next function to bound the + // extent of the PUBLIC symbol we find, below. This does mean we + // need to check that address indeed falls within the function we + // find; do the range comparison in an overflow-friendly way. + linked_ptr func; + linked_ptr public_symbol; + MemAddr function_base; + MemAddr function_size; + MemAddr public_address; + if (functions_.RetrieveNearestRange(address, &func, &function_base, + NULL /* delta */, &function_size) && + address >= function_base && address - function_base < function_size) { + frame->function_name = func->name; + frame->function_base = frame->module->base_address() + function_base; + frame->is_multiple = func->is_multiple; + + linked_ptr line; + MemAddr line_base; + if (func->lines.RetrieveRange(address, &line, &line_base, NULL /* delta */, + NULL /* size */)) { + FileMap::const_iterator it = files_.find(line->source_file_id); + if (it != files_.end()) { + frame->source_file_name = files_.find(line->source_file_id)->second; + } + frame->source_line = line->line; + frame->source_line_base = frame->module->base_address() + line_base; + } + + // Check if this is inlined function call. + if (inlined_frames) { + ConstructInlineFrames(frame, address, func->inlines, inlined_frames); + } + } else if (public_symbols_.Retrieve(address, + &public_symbol, &public_address) && + (!func.get() || public_address > function_base)) { + frame->function_name = public_symbol->name; + frame->function_base = frame->module->base_address() + public_address; + frame->is_multiple = public_symbol->is_multiple; + } +} + +WindowsFrameInfo* BasicSourceLineResolver::Module::FindWindowsFrameInfo( + const StackFrame* frame) const { + MemAddr address = frame->instruction - frame->module->base_address(); + scoped_ptr result(new WindowsFrameInfo()); + + // We only know about WindowsFrameInfo::STACK_INFO_FRAME_DATA and + // WindowsFrameInfo::STACK_INFO_FPO. Prefer them in this order. + // WindowsFrameInfo::STACK_INFO_FRAME_DATA is the newer type that + // includes its own program string. + // WindowsFrameInfo::STACK_INFO_FPO is the older type + // corresponding to the FPO_DATA struct. See stackwalker_x86.cc. + linked_ptr frame_info; + if ((windows_frame_info_[WindowsFrameInfo::STACK_INFO_FRAME_DATA] + .RetrieveRange(address, &frame_info)) + || (windows_frame_info_[WindowsFrameInfo::STACK_INFO_FPO] + .RetrieveRange(address, &frame_info))) { + result->CopyFrom(*frame_info.get()); + return result.release(); + } + + // Even without a relevant STACK line, many functions contain + // information about how much space their parameters consume on the + // stack. Use RetrieveNearestRange instead of RetrieveRange, so that + // we can use the function to bound the extent of the PUBLIC symbol, + // below. However, this does mean we need to check that ADDRESS + // falls within the retrieved function's range; do the range + // comparison in an overflow-friendly way. + linked_ptr function; + MemAddr function_base, function_size; + if (functions_.RetrieveNearestRange(address, &function, &function_base, + NULL /* delta */, &function_size) && + address >= function_base && address - function_base < function_size) { + result->parameter_size = function->parameter_size; + result->valid |= WindowsFrameInfo::VALID_PARAMETER_SIZE; + return result.release(); + } + + // PUBLIC symbols might have a parameter size. Use the function we + // found above to limit the range the public symbol covers. + linked_ptr public_symbol; + MemAddr public_address; + if (public_symbols_.Retrieve(address, &public_symbol, &public_address) && + (!function.get() || public_address > function_base)) { + result->parameter_size = public_symbol->parameter_size; + } + + return NULL; +} + +CFIFrameInfo* BasicSourceLineResolver::Module::FindCFIFrameInfo( + const StackFrame* frame) const { + MemAddr address = frame->instruction - frame->module->base_address(); + MemAddr initial_base, initial_size; + string initial_rules; + + // Find the initial rule whose range covers this address. That + // provides an initial set of register recovery rules. Then, walk + // forward from the initial rule's starting address to frame's + // instruction address, applying delta rules. + if (!cfi_initial_rules_.RetrieveRange(address, &initial_rules, &initial_base, + NULL /* delta */, &initial_size)) { + return NULL; + } + + // Create a frame info structure, and populate it with the rules from + // the STACK CFI INIT record. + scoped_ptr rules(new CFIFrameInfo()); + if (!ParseCFIRuleSet(initial_rules, rules.get())) + return NULL; + + // Find the first delta rule that falls within the initial rule's range. + map::const_iterator delta = + cfi_delta_rules_.lower_bound(initial_base); + + // Apply delta rules up to and including the frame's address. + while (delta != cfi_delta_rules_.end() && delta->first <= address) { + ParseCFIRuleSet(delta->second, rules.get()); + delta++; + } + + return rules.release(); +} + +bool BasicSourceLineResolver::Module::ParseFile(char* file_line) { + long index; + char* filename; + if (SymbolParseHelper::ParseFile(file_line, &index, &filename)) { + files_.insert(make_pair(index, string(filename))); + return true; + } + return false; +} + +bool BasicSourceLineResolver::Module::ParseInlineOrigin( + char* inline_origin_line) { + bool has_file_id; + long origin_id; + long source_file_id; + char* origin_name; + if (SymbolParseHelper::ParseInlineOrigin(inline_origin_line, &has_file_id, + &origin_id, &source_file_id, + &origin_name)) { + inline_origins_.insert(make_pair( + origin_id, + new InlineOrigin(has_file_id, source_file_id, origin_name))); + return true; + } + return false; +} + +linked_ptr +BasicSourceLineResolver::Module::ParseInline(char* inline_line) { + bool has_call_site_file_id; + long inline_nest_level; + long call_site_line; + long call_site_file_id; + long origin_id; + vector> ranges; + if (SymbolParseHelper::ParseInline(inline_line, &has_call_site_file_id, + &inline_nest_level, &call_site_line, + &call_site_file_id, &origin_id, &ranges)) { + return linked_ptr(new Inline(has_call_site_file_id, + inline_nest_level, call_site_line, + call_site_file_id, origin_id, ranges)); + } + return linked_ptr(); +} + +BasicSourceLineResolver::Function* +BasicSourceLineResolver::Module::ParseFunction(char* function_line) { + bool is_multiple; + uint64_t address; + uint64_t size; + long stack_param_size; + char* name; + if (SymbolParseHelper::ParseFunction(function_line, &is_multiple, &address, + &size, &stack_param_size, &name)) { + return new Function(name, address, size, stack_param_size, is_multiple); + } + return NULL; +} + +BasicSourceLineResolver::Line* BasicSourceLineResolver::Module::ParseLine( + char* line_line) { + uint64_t address; + uint64_t size; + long line_number; + long source_file; + + if (SymbolParseHelper::ParseLine(line_line, &address, &size, &line_number, + &source_file)) { + return new Line(address, size, source_file, line_number); + } + return NULL; +} + +bool BasicSourceLineResolver::Module::ParsePublicSymbol(char* public_line) { + bool is_multiple; + uint64_t address; + long stack_param_size; + char* name; + + if (SymbolParseHelper::ParsePublicSymbol(public_line, &is_multiple, &address, + &stack_param_size, &name)) { + // A few public symbols show up with an address of 0. This has been seen + // in the dumped output of ntdll.pdb for symbols such as _CIlog, _CIpow, + // RtlDescribeChunkLZNT1, and RtlReserveChunkLZNT1. They would conflict + // with one another if they were allowed into the public_symbols_ map, + // but since the address is obviously invalid, gracefully accept them + // as input without putting them into the map. + if (address == 0) { + return true; + } + + linked_ptr symbol(new PublicSymbol(name, address, + stack_param_size, + is_multiple)); + return public_symbols_.Store(address, symbol); + } + return false; +} + +bool BasicSourceLineResolver::Module::ParseStackInfo(char* stack_info_line) { + // Skip "STACK " prefix. + stack_info_line += 6; + + // Find the token indicating what sort of stack frame walking + // information this is. + while (*stack_info_line == ' ') + stack_info_line++; + const char* platform = stack_info_line; + while (!strchr(kWhitespace, *stack_info_line)) + stack_info_line++; + *stack_info_line++ = '\0'; + + // MSVC stack frame info. + if (strcmp(platform, "WIN") == 0) { + int type = 0; + uint64_t rva, code_size; + linked_ptr + stack_frame_info(WindowsFrameInfo::ParseFromString(stack_info_line, + type, + rva, + code_size)); + if (stack_frame_info == NULL) + return false; + + // TODO(mmentovai): I wanted to use StoreRange's return value as this + // method's return value, but MSVC infrequently outputs stack info that + // violates the containment rules. This happens with a section of code + // in strncpy_s in test_app.cc (testdata/minidump2). There, problem looks + // like this: + // STACK WIN 4 4242 1a a 0 ... (STACK WIN 4 base size prolog 0 ...) + // STACK WIN 4 4243 2e 9 0 ... + // ContainedRangeMap treats these two blocks as conflicting. In reality, + // when the prolog lengths are taken into account, the actual code of + // these blocks doesn't conflict. However, we can't take the prolog lengths + // into account directly here because we'd wind up with a different set + // of range conflicts when MSVC outputs stack info like this: + // STACK WIN 4 1040 73 33 0 ... + // STACK WIN 4 105a 59 19 0 ... + // because in both of these entries, the beginning of the code after the + // prolog is at 0x1073, and the last byte of contained code is at 0x10b2. + // Perhaps we could get away with storing ranges by rva + prolog_size + // if ContainedRangeMap were modified to allow replacement of + // already-stored values. + + windows_frame_info_[type].StoreRange(rva, code_size, stack_frame_info); + return true; + } else if (strcmp(platform, "CFI") == 0) { + // DWARF CFI stack frame info + return ParseCFIFrameInfo(stack_info_line); + } else { + // Something unrecognized. + return false; + } +} + +bool BasicSourceLineResolver::Module::ParseCFIFrameInfo( + char* stack_info_line) { + char* cursor; + + // Is this an INIT record or a delta record? + char* init_or_address = strtok_r(stack_info_line, " \r\n", &cursor); + if (!init_or_address) + return false; + + if (strcmp(init_or_address, "INIT") == 0) { + // This record has the form "STACK INIT
    ". + char* address_field = strtok_r(NULL, " \r\n", &cursor); + if (!address_field) return false; + + char* size_field = strtok_r(NULL, " \r\n", &cursor); + if (!size_field) return false; + + char* initial_rules = strtok_r(NULL, "\r\n", &cursor); + if (!initial_rules) return false; + + MemAddr address = strtoul(address_field, NULL, 16); + MemAddr size = strtoul(size_field, NULL, 16); + cfi_initial_rules_.StoreRange(address, size, initial_rules); + return true; + } + + // This record has the form "STACK
    ". + char* address_field = init_or_address; + char* delta_rules = strtok_r(NULL, "\r\n", &cursor); + if (!delta_rules) return false; + MemAddr address = strtoul(address_field, NULL, 16); + cfi_delta_rules_[address] = delta_rules; + return true; +} + +bool BasicSourceLineResolver::Function::AppendInline(linked_ptr in) { + // This happends if in's parent wasn't added due to a malformed INLINE record. + if (in->inline_nest_level > last_added_inline_nest_level + 1) + return false; + + last_added_inline_nest_level = in->inline_nest_level; + + // Store all ranges into current level of inlines. + for (auto range : in->inline_ranges) + inlines.StoreRange(range.first, range.second, in); + return true; +} + +// static +bool SymbolParseHelper::ParseFile(char* file_line, long* index, + char** filename) { + // FILE + assert(strncmp(file_line, "FILE ", 5) == 0); + file_line += 5; // skip prefix + + vector tokens; + if (!Tokenize(file_line, kWhitespace, 2, &tokens)) { + return false; + } + + char* after_number; + *index = strtol(tokens[0], &after_number, 10); + if (!IsValidAfterNumber(after_number) || *index < 0 || + *index == std::numeric_limits::max()) { + return false; + } + + *filename = tokens[1]; + if (!*filename) { + return false; + } + + return true; +} + +// static +bool SymbolParseHelper::ParseInlineOrigin(char* inline_origin_line, + bool* has_file_id, + long* origin_id, + long* file_id, + char** name) { + // Old INLINE_ORIGIN format: + // INLINE_ORIGIN + // New INLINE_ORIGIN format: + // INLINE_ORIGIN + assert(strncmp(inline_origin_line, "INLINE_ORIGIN ", 14) == 0); + inline_origin_line += 14; // skip prefix + vector tokens; + // Split the line into two parts so that the first token is "", and + // second token is either " "" or """ depending on the + // format version. + if (!Tokenize(inline_origin_line, kWhitespace, 2, &tokens)) { + return false; + } + + char* after_number; + *origin_id = strtol(tokens[0], &after_number, 10); + if (!IsValidAfterNumber(after_number) || *origin_id < 0 || + *origin_id == std::numeric_limits::max()) { + return false; + } + + // If the field after origin_id is a number, then it's old format. + char* remaining_line = tokens[1]; + *has_file_id = true; + for (size_t i = 0; + i < strlen(remaining_line) && remaining_line[i] != ' ' && *has_file_id; + ++i) { + // If the file id is -1, it might be an artificial function that doesn't + // have file id. So, we consider -1 as a valid special case. + if (remaining_line[i] == '-' && i == 0) { + continue; + } + *has_file_id = isdigit(remaining_line[i]); + } + + if (*has_file_id) { + // If it's old format, split " " to {"", ""}. + if (!Tokenize(remaining_line, kWhitespace, 2, &tokens)) { + return false; + } + *file_id = strtol(tokens[0], &after_number, 10); + // If the file id is -1, it might be an artificial function that doesn't + // have file id. So, we consider -1 as a valid special case. + if (!IsValidAfterNumber(after_number) || *file_id < -1 || + *file_id == std::numeric_limits::max()) { + return false; + } + } + + *name = tokens[1]; + if (!*name) { + return false; + } + + return true; +} + +// static +bool SymbolParseHelper::ParseInline( + char* inline_line, + bool* has_call_site_file_id, + long* inline_nest_level, + long* call_site_line, + long* call_site_file_id, + long* origin_id, + vector>* ranges) { + // Old INLINE format: + // INLINE [
    ]+ + // New INLINE format: + // INLINE + // [
    ]+ + assert(strncmp(inline_line, "INLINE ", 7) == 0); + inline_line += 7; // skip prefix + + vector tokens; + // Increase max_tokens if necessary. + Tokenize(inline_line, kWhitespace, 512, &tokens); + + // Determine the version of INLINE record by parity of the vector length. + *has_call_site_file_id = tokens.size() % 2 == 0; + + // The length of the vector should be at least 5. + if (tokens.size() < 5) { + return false; + } + + char* after_number; + size_t next_idx = 0; + + *inline_nest_level = strtol(tokens[next_idx++], &after_number, 10); + if (!IsValidAfterNumber(after_number) || *inline_nest_level < 0 || + *inline_nest_level == std::numeric_limits::max()) { + return false; + } + + *call_site_line = strtol(tokens[next_idx++], &after_number, 10); + if (!IsValidAfterNumber(after_number) || *call_site_line < 0 || + *call_site_line == std::numeric_limits::max()) { + return false; + } + + if (*has_call_site_file_id) { + *call_site_file_id = strtol(tokens[next_idx++], &after_number, 10); + // If the file id is -1, it might be an artificial function that doesn't + // have file id. So, we consider -1 as a valid special case. + if (!IsValidAfterNumber(after_number) || *call_site_file_id < -1 || + *call_site_file_id == std::numeric_limits::max()) { + return false; + } + } + + *origin_id = strtol(tokens[next_idx++], &after_number, 10); + if (!IsValidAfterNumber(after_number) || *origin_id < 0 || + *origin_id == std::numeric_limits::max()) { + return false; + } + + while (next_idx < tokens.size()) { + MemAddr address = strtoull(tokens[next_idx++], &after_number, 16); + if (!IsValidAfterNumber(after_number) || + address == std::numeric_limits::max()) { + return false; + } + MemAddr size = strtoull(tokens[next_idx++], &after_number, 16); + if (!IsValidAfterNumber(after_number) || + size == std::numeric_limits::max()) { + return false; + } + ranges->push_back({address, size}); + } + + return true; +} + +// static +bool SymbolParseHelper::ParseFunction(char* function_line, bool* is_multiple, + uint64_t* address, uint64_t* size, + long* stack_param_size, char** name) { + // FUNC []
    + assert(strncmp(function_line, "FUNC ", 5) == 0); + function_line += 5; // skip prefix + + vector tokens; + if (!TokenizeWithOptionalField(function_line, "m", kWhitespace, 5, &tokens)) { + return false; + } + + *is_multiple = strcmp(tokens[0], "m") == 0; + int next_token = *is_multiple ? 1 : 0; + + char* after_number; + *address = strtoull(tokens[next_token++], &after_number, 16); + if (!IsValidAfterNumber(after_number) || + *address == std::numeric_limits::max()) { + return false; + } + *size = strtoull(tokens[next_token++], &after_number, 16); + if (!IsValidAfterNumber(after_number) || + *size == std::numeric_limits::max()) { + return false; + } + *stack_param_size = strtol(tokens[next_token++], &after_number, 16); + if (!IsValidAfterNumber(after_number) || + *stack_param_size == std::numeric_limits::max() || + *stack_param_size < 0) { + return false; + } + *name = tokens[next_token++]; + + return true; +} + +// static +bool SymbolParseHelper::ParseLine(char* line_line, uint64_t* address, + uint64_t* size, long* line_number, + long* source_file) { + //
    + vector tokens; + if (!Tokenize(line_line, kWhitespace, 4, &tokens)) { + return false; + } + + char* after_number; + *address = strtoull(tokens[0], &after_number, 16); + if (!IsValidAfterNumber(after_number) || + *address == std::numeric_limits::max()) { + return false; + } + *size = strtoull(tokens[1], &after_number, 16); + if (!IsValidAfterNumber(after_number) || + *size == std::numeric_limits::max()) { + return false; + } + *line_number = strtol(tokens[2], &after_number, 10); + if (!IsValidAfterNumber(after_number) || + *line_number == std::numeric_limits::max()) { + return false; + } + *source_file = strtol(tokens[3], &after_number, 10); + if (!IsValidAfterNumber(after_number) || *source_file < 0 || + *source_file == std::numeric_limits::max()) { + return false; + } + + // Valid line numbers normally start from 1, however there are functions that + // are associated with a source file but not associated with any line number + // (block helper function) and for such functions the symbol file contains 0 + // for the line numbers. Hence, 0 should be treated as a valid line number. + // For more information on block helper functions, please, take a look at: + // http://clang.llvm.org/docs/Block-ABI-Apple.html + if (*line_number < 0) { + return false; + } + + return true; +} + +// static +bool SymbolParseHelper::ParsePublicSymbol(char* public_line, bool* is_multiple, + uint64_t* address, + long* stack_param_size, + char** name) { + // PUBLIC []
    + assert(strncmp(public_line, "PUBLIC ", 7) == 0); + public_line += 7; // skip prefix + + vector tokens; + if (!TokenizeWithOptionalField(public_line, "m", kWhitespace, 4, &tokens)) { + return false; + } + + *is_multiple = strcmp(tokens[0], "m") == 0; + int next_token = *is_multiple ? 1 : 0; + + char* after_number; + *address = strtoull(tokens[next_token++], &after_number, 16); + if (!IsValidAfterNumber(after_number) || + *address == std::numeric_limits::max()) { + return false; + } + *stack_param_size = strtol(tokens[next_token++], &after_number, 16); + if (!IsValidAfterNumber(after_number) || + *stack_param_size == std::numeric_limits::max() || + *stack_param_size < 0) { + return false; + } + *name = tokens[next_token++]; + + return true; +} + +// static +bool SymbolParseHelper::IsValidAfterNumber(char* after_number) { + if (after_number != NULL && strchr(kWhitespace, *after_number) != NULL) { + return true; + } + return false; +} + +} // namespace google_breakpad diff --git a/src/processor/basic_source_line_resolver_types.h b/src/processor/basic_source_line_resolver_types.h new file mode 100644 index 0000000..3c8b01c --- /dev/null +++ b/src/processor/basic_source_line_resolver_types.h @@ -0,0 +1,209 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// basic_source_line_types.h: definition of nested classes/structs in +// BasicSourceLineResolver. It moves the definitions out of +// basic_source_line_resolver.cc, so that other classes could have access +// to these private nested types without including basic_source_line_resolver.cc +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_TYPES_H__ +#define PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_TYPES_H__ + +#include +#include + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "processor/source_line_resolver_base_types.h" + +#include "processor/address_map-inl.h" +#include "processor/range_map-inl.h" +#include "processor/contained_range_map-inl.h" + +#include "processor/linked_ptr.h" +#include "google_breakpad/processor/stack_frame.h" +#include "processor/cfi_frame_info.h" +#include "processor/windows_frame_info.h" + +namespace google_breakpad { + +struct +BasicSourceLineResolver::Function : public SourceLineResolverBase::Function { + Function(const string& function_name, + MemAddr function_address, + MemAddr code_size, + int set_parameter_size, + bool is_mutiple) + : Base(function_name, + function_address, + code_size, + set_parameter_size, + is_mutiple), + inlines(true), + last_added_inline_nest_level(0) {} + + // Append inline into corresponding RangeMap. + // This function assumes it's called in the order of reading INLINE records. + bool AppendInline(linked_ptr in); + + ContainedRangeMap> inlines; + RangeMap> lines; + + private: + typedef SourceLineResolverBase::Function Base; + + // The last added inline_nest_level from INLINE record. + int last_added_inline_nest_level; +}; + + +class BasicSourceLineResolver::Module : public SourceLineResolverBase::Module { + public: + explicit Module(const string& name) : name_(name), is_corrupt_(false) { } + virtual ~Module() { } + + // Loads a map from the given buffer in char* type. + // Does NOT have ownership of memory_buffer. + // The passed in |memory buffer| is of size |memory_buffer_size|. If it is + // not null terminated, LoadMapFromMemory() will null terminate it by + // modifying the passed in buffer. + virtual bool LoadMapFromMemory(char* memory_buffer, + size_t memory_buffer_size); + + // Tells whether the loaded symbol data is corrupt. Return value is + // undefined, if the symbol data hasn't been loaded yet. + virtual bool IsCorrupt() const { return is_corrupt_; } + + // Looks up the given relative address, and fills the StackFrame struct + // with the result. + virtual void LookupAddress( + StackFrame* frame, + std::deque>* inlined_frame) const; + + // Construct inlined frames for |frame| and store them in |inline_frames|. + // |frame|'s source line and source file name may be updated if an inlined + // frame is found inside |frame|. As a result, the innermost inlined frame + // will be the first one in |inline_frames|. + virtual void ConstructInlineFrames( + StackFrame* frame, + MemAddr address, + const ContainedRangeMap>& inline_map, + std::deque>* inline_frames) const; + + // If Windows stack walking information is available covering ADDRESS, + // return a WindowsFrameInfo structure describing it. If the information + // is not available, returns NULL. A NULL return value does not indicate + // an error. The caller takes ownership of any returned WindowsFrameInfo + // object. + virtual WindowsFrameInfo* FindWindowsFrameInfo(const StackFrame* frame) const; + + // If CFI stack walking information is available covering ADDRESS, + // return a CFIFrameInfo structure describing it. If the information + // is not available, return NULL. The caller takes ownership of any + // returned CFIFrameInfo object. + virtual CFIFrameInfo* FindCFIFrameInfo(const StackFrame* frame) const; + + private: + // Friend declarations. + friend class BasicSourceLineResolver; + friend class ModuleComparer; + friend class ModuleSerializer; + + typedef std::map FileMap; + + // Logs parse errors. |*num_errors| is increased every time LogParseError is + // called. + static void LogParseError( + const string& message, + int line_number, + int* num_errors); + + // Parses a file declaration + bool ParseFile(char* file_line); + + // Parses an inline origin declaration. + bool ParseInlineOrigin(char* inline_origin_line); + + // Parses an inline declaration. + linked_ptr ParseInline(char* inline_line); + + // Parses a function declaration, returning a new Function object. + Function* ParseFunction(char* function_line); + + // Parses a line declaration, returning a new Line object. + Line* ParseLine(char* line_line); + + // Parses a PUBLIC symbol declaration, storing it in public_symbols_. + // Returns false if an error occurs. + bool ParsePublicSymbol(char* public_line); + + // Parses a STACK WIN or STACK CFI frame info declaration, storing + // it in the appropriate table. + bool ParseStackInfo(char* stack_info_line); + + // Parses a STACK CFI record, storing it in cfi_frame_info_. + bool ParseCFIFrameInfo(char* stack_info_line); + + string name_; + FileMap files_; + std::map> inline_origins_; + RangeMap< MemAddr, linked_ptr > functions_; + AddressMap< MemAddr, linked_ptr > public_symbols_; + bool is_corrupt_; + + // Each element in the array is a ContainedRangeMap for a type + // listed in WindowsFrameInfoTypes. These are split by type because + // there may be overlaps between maps of different types, but some + // information is only available as certain types. + ContainedRangeMap< MemAddr, linked_ptr > + windows_frame_info_[WindowsFrameInfo::STACK_INFO_LAST]; + + // DWARF CFI stack walking data. The Module stores the initial rule sets + // and rule deltas as strings, just as they appear in the symbol file: + // although the file may contain hundreds of thousands of STACK CFI + // records, walking a stack will only ever use a few of them, so it's + // best to delay parsing a record until it's actually needed. + + // STACK CFI INIT records: for each range, an initial set of register + // recovery rules. The RangeMap's itself gives the starting and ending + // addresses. + RangeMap cfi_initial_rules_; + + // STACK CFI records: at a given address, the changes to the register + // recovery rules that take effect at that address. The map key is the + // starting address; the ending address is the key of the next entry in + // this map, or the end of the range as given by the cfi_initial_rules_ + // entry (which FindCFIFrameInfo looks up first). + std::map cfi_delta_rules_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_TYPES_H__ diff --git a/src/processor/basic_source_line_resolver_unittest.cc b/src/processor/basic_source_line_resolver_unittest.cc new file mode 100644 index 0000000..a73ded8 --- /dev/null +++ b/src/processor/basic_source_line_resolver_unittest.cc @@ -0,0 +1,1011 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include + +#include "breakpad_googletest_includes.h" +#include "common/scoped_ptr.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/stack_frame.h" +#include "google_breakpad/processor/memory_region.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" +#include "processor/windows_frame_info.h" +#include "processor/cfi_frame_info.h" + +namespace { + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CFIFrameInfo; +using google_breakpad::CodeModule; +using google_breakpad::MemoryRegion; +using google_breakpad::StackFrame; +using google_breakpad::WindowsFrameInfo; +using google_breakpad::scoped_ptr; +using google_breakpad::SymbolParseHelper; + +class TestCodeModule : public CodeModule { + public: + TestCodeModule(string code_file) : code_file_(code_file) {} + virtual ~TestCodeModule() {} + + virtual uint64_t base_address() const { return 0; } + virtual uint64_t size() const { return 0xb000; } + virtual string code_file() const { return code_file_; } + virtual string code_identifier() const { return ""; } + virtual string debug_file() const { return ""; } + virtual string debug_identifier() const { return ""; } + virtual string version() const { return ""; } + virtual CodeModule* Copy() const { + return new TestCodeModule(code_file_); + } + virtual bool is_unloaded() const { return false; } + virtual uint64_t shrink_down_delta() const { return 0; } + virtual void SetShrinkDownDelta(uint64_t shrink_down_delta) {} + + private: + string code_file_; +}; + +// A mock memory region object, for use by the STACK CFI tests. +class MockMemoryRegion: public MemoryRegion { + uint64_t GetBase() const { return 0x10000; } + uint32_t GetSize() const { return 0x01000; } + bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const { + *value = address & 0xff; + return true; + } + bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const { + *value = address & 0xffff; + return true; + } + bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const { + switch (address) { + case 0x10008: *value = 0x98ecadc3; break; // saved %ebx + case 0x1000c: *value = 0x878f7524; break; // saved %esi + case 0x10010: *value = 0x6312f9a5; break; // saved %edi + case 0x10014: *value = 0x10038; break; // caller's %ebp + case 0x10018: *value = 0xf6438648; break; // return address + default: *value = 0xdeadbeef; break; // junk + } + return true; + } + bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const { + *value = address; + return true; + } + void Print() const { + assert(false); + } +}; + +// Verify that, for every association in ACTUAL, EXPECTED has the same +// association. (That is, ACTUAL's associations should be a subset of +// EXPECTED's.) Also verify that ACTUAL has associations for ".ra" and +// ".cfa". +static bool VerifyRegisters( + const char* file, int line, + const CFIFrameInfo::RegisterValueMap& expected, + const CFIFrameInfo::RegisterValueMap& actual) { + CFIFrameInfo::RegisterValueMap::const_iterator a; + a = actual.find(".cfa"); + if (a == actual.end()) + return false; + a = actual.find(".ra"); + if (a == actual.end()) + return false; + for (a = actual.begin(); a != actual.end(); a++) { + CFIFrameInfo::RegisterValueMap::const_iterator e = + expected.find(a->first); + if (e == expected.end()) { + fprintf(stderr, "%s:%d: unexpected register '%s' recovered, value 0x%x\n", + file, line, a->first.c_str(), a->second); + return false; + } + if (e->second != a->second) { + fprintf(stderr, + "%s:%d: register '%s' recovered value was 0x%x, expected 0x%x\n", + file, line, a->first.c_str(), a->second, e->second); + return false; + } + // Don't complain if this doesn't recover all registers. Although + // the DWARF spec says that unmentioned registers are undefined, + // GCC uses omission to mean that they are unchanged. + } + return true; +} + + +static bool VerifyEmpty(const StackFrame& frame) { + if (frame.function_name.empty() && + frame.source_file_name.empty() && + frame.source_line == 0) + return true; + return false; +} + +static void ClearSourceLineInfo(StackFrame* frame) { + frame->function_name.clear(); + frame->module = NULL; + frame->source_file_name.clear(); + frame->source_line = 0; +} + +class TestBasicSourceLineResolver : public ::testing::Test { + public: + void SetUp() { + testdata_dir = string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/processor/testdata"; + } + + BasicSourceLineResolver resolver; + string testdata_dir; +}; + +TEST_F(TestBasicSourceLineResolver, TestLoadAndResolve) +{ + TestCodeModule module1("module1"); + ASSERT_TRUE(resolver.LoadModule(&module1, testdata_dir + "/module1.out")); + ASSERT_TRUE(resolver.HasModule(&module1)); + TestCodeModule module2("module2"); + ASSERT_TRUE(resolver.LoadModule(&module2, testdata_dir + "/module2.out")); + ASSERT_TRUE(resolver.HasModule(&module2)); + + + StackFrame frame; + scoped_ptr windows_frame_info; + scoped_ptr cfi_frame_info; + frame.instruction = 0x1000; + frame.module = NULL; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_FALSE(frame.module); + ASSERT_TRUE(frame.function_name.empty()); + ASSERT_EQ(frame.function_base, 0U); + ASSERT_TRUE(frame.source_file_name.empty()); + ASSERT_EQ(frame.source_line, 0); + ASSERT_EQ(frame.source_line_base, 0U); + EXPECT_EQ(frame.is_multiple, false); + + frame.module = &module1; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Function1_1"); + ASSERT_TRUE(frame.module); + ASSERT_EQ(frame.module->code_file(), "module1"); + ASSERT_EQ(frame.function_base, 0x1000U); + ASSERT_EQ(frame.source_file_name, "file1_1.cc"); + ASSERT_EQ(frame.source_line, 44); + ASSERT_EQ(frame.source_line_base, 0x1000U); + EXPECT_EQ(frame.is_multiple, true); + windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame)); + ASSERT_TRUE(windows_frame_info.get()); + ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA); + ASSERT_FALSE(windows_frame_info->allocates_base_pointer); + ASSERT_EQ(windows_frame_info->program_string, + "$eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ ="); + + ClearSourceLineInfo(&frame); + frame.instruction = 0x800; + frame.module = &module1; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_TRUE(VerifyEmpty(frame)); + windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame)); + ASSERT_FALSE(windows_frame_info.get()); + + frame.instruction = 0x1280; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Function1_3"); + ASSERT_TRUE(frame.source_file_name.empty()); + ASSERT_EQ(frame.source_line, 0); + windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame)); + ASSERT_TRUE(windows_frame_info.get()); + ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_UNKNOWN); + ASSERT_FALSE(windows_frame_info->allocates_base_pointer); + ASSERT_TRUE(windows_frame_info->program_string.empty()); + + frame.instruction = 0x1380; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Function1_4"); + ASSERT_TRUE(frame.source_file_name.empty()); + ASSERT_EQ(frame.source_line, 0); + windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame)); + ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA); + ASSERT_TRUE(windows_frame_info.get()); + ASSERT_FALSE(windows_frame_info->allocates_base_pointer); + ASSERT_FALSE(windows_frame_info->program_string.empty()); + + frame.instruction = 0x2000; + windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame)); + ASSERT_FALSE(windows_frame_info.get()); + + // module1 has STACK CFI records covering 3d40..3def; + // module2 has STACK CFI records covering 3df0..3e9f; + // check that FindCFIFrameInfo doesn't claim to find any outside those ranges. + frame.instruction = 0x3d3f; + frame.module = &module1; + cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame)); + ASSERT_FALSE(cfi_frame_info.get()); + + frame.instruction = 0x3e9f; + frame.module = &module1; + cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame)); + ASSERT_FALSE(cfi_frame_info.get()); + + CFIFrameInfo::RegisterValueMap current_registers; + CFIFrameInfo::RegisterValueMap caller_registers; + CFIFrameInfo::RegisterValueMap expected_caller_registers; + MockMemoryRegion memory; + + // Regardless of which instruction evaluation takes place at, it + // should produce the same values for the caller's registers. + expected_caller_registers[".cfa"] = 0x1001c; + expected_caller_registers[".ra"] = 0xf6438648; + expected_caller_registers["$ebp"] = 0x10038; + expected_caller_registers["$ebx"] = 0x98ecadc3; + expected_caller_registers["$esi"] = 0x878f7524; + expected_caller_registers["$edi"] = 0x6312f9a5; + + frame.instruction = 0x3d40; + frame.module = &module1; + current_registers.clear(); + current_registers["$esp"] = 0x10018; + current_registers["$ebp"] = 0x10038; + current_registers["$ebx"] = 0x98ecadc3; + current_registers["$esi"] = 0x878f7524; + current_registers["$edi"] = 0x6312f9a5; + cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers)); + + frame.instruction = 0x3d41; + current_registers["$esp"] = 0x10014; + cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers)); + + frame.instruction = 0x3d43; + current_registers["$ebp"] = 0x10014; + cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers); + + frame.instruction = 0x3d54; + current_registers["$ebx"] = 0x6864f054U; + cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers); + + frame.instruction = 0x3d5a; + current_registers["$esi"] = 0x6285f79aU; + cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers); + + frame.instruction = 0x3d84; + current_registers["$edi"] = 0x64061449U; + cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers); + + frame.instruction = 0x2900; + frame.module = &module1; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, string("PublicSymbol")); + EXPECT_EQ(frame.is_multiple, true); + + frame.instruction = 0x4000; + frame.module = &module1; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, string("LargeFunction")); + + frame.instruction = 0x2181; + frame.module = &module2; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Function2_2"); + ASSERT_EQ(frame.function_base, 0x2170U); + ASSERT_TRUE(frame.module); + ASSERT_EQ(frame.module->code_file(), "module2"); + ASSERT_EQ(frame.source_file_name, "file2_2.cc"); + ASSERT_EQ(frame.source_line, 21); + ASSERT_EQ(frame.source_line_base, 0x2180U); + EXPECT_EQ(frame.is_multiple, false); + windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame)); + ASSERT_TRUE(windows_frame_info.get()); + ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA); + ASSERT_EQ(windows_frame_info->prolog_size, 1U); + + frame.instruction = 0x216f; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Public2_1"); + EXPECT_EQ(frame.is_multiple, false); + + ClearSourceLineInfo(&frame); + frame.instruction = 0x219f; + frame.module = &module2; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_TRUE(frame.function_name.empty()); + + frame.instruction = 0x21a0; + frame.module = &module2; + resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Public2_2"); +} + +TEST_F(TestBasicSourceLineResolver, TestInvalidLoads) +{ + TestCodeModule module3("module3"); + ASSERT_TRUE(resolver.LoadModule(&module3, + testdata_dir + "/module3_bad.out")); + ASSERT_TRUE(resolver.HasModule(&module3)); + ASSERT_TRUE(resolver.IsModuleCorrupt(&module3)); + TestCodeModule module4("module4"); + ASSERT_TRUE(resolver.LoadModule(&module4, + testdata_dir + "/module4_bad.out")); + ASSERT_TRUE(resolver.HasModule(&module4)); + ASSERT_TRUE(resolver.IsModuleCorrupt(&module4)); + TestCodeModule module5("module5"); + ASSERT_FALSE(resolver.LoadModule(&module5, + testdata_dir + "/invalid-filename")); + ASSERT_FALSE(resolver.HasModule(&module5)); + TestCodeModule invalidmodule("invalid-module"); + ASSERT_FALSE(resolver.HasModule(&invalidmodule)); +} + +TEST_F(TestBasicSourceLineResolver, TestUnload) +{ + TestCodeModule module1("module1"); + ASSERT_FALSE(resolver.HasModule(&module1)); + ASSERT_TRUE(resolver.LoadModule(&module1, testdata_dir + "/module1.out")); + ASSERT_TRUE(resolver.HasModule(&module1)); + resolver.UnloadModule(&module1); + ASSERT_FALSE(resolver.HasModule(&module1)); + ASSERT_TRUE(resolver.LoadModule(&module1, testdata_dir + "/module1.out")); + ASSERT_TRUE(resolver.HasModule(&module1)); +} + +TEST_F(TestBasicSourceLineResolver, TestLoadAndResolveOldInlines) { + TestCodeModule module("linux_inline"); + ASSERT_TRUE(resolver.LoadModule( + &module, testdata_dir + + "/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/" + "linux_inline.old.sym")); + ASSERT_TRUE(resolver.HasModule(&module)); + StackFrame frame; + std::deque> inlined_frames; + frame.instruction = 0x161b6; + frame.module = &module; + // main frame. + resolver.FillSourceLineInfo(&frame, &inlined_frames); + ASSERT_EQ(frame.function_name, "main"); + ASSERT_EQ(frame.function_base, 0x15b30U); + ASSERT_EQ(frame.source_file_name, "linux_inline.cpp"); + ASSERT_EQ(frame.source_line, 42); + ASSERT_EQ(frame.source_line_base, 0x161b6U); + EXPECT_EQ(frame.is_multiple, false); + + ASSERT_EQ(inlined_frames.size(), 3UL); + + // Inlined frames inside main frame. + ASSERT_EQ(inlined_frames[2]->function_name, "foo()"); + ASSERT_EQ(inlined_frames[2]->function_base, 0x15b45U); + ASSERT_EQ(inlined_frames[2]->source_file_name, "linux_inline.cpp"); + ASSERT_EQ(inlined_frames[2]->source_line, 39); + ASSERT_EQ(inlined_frames[2]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[2]->trust, StackFrame::FRAME_TRUST_INLINE); + + ASSERT_EQ(inlined_frames[1]->function_name, "bar()"); + ASSERT_EQ(inlined_frames[1]->function_base, 0x15b72U); + ASSERT_EQ(inlined_frames[1]->source_file_name, "linux_inline.cpp"); + ASSERT_EQ(inlined_frames[1]->source_line, 32); + ASSERT_EQ(inlined_frames[1]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[1]->trust, StackFrame::FRAME_TRUST_INLINE); + + ASSERT_EQ(inlined_frames[0]->function_name, "func()"); + ASSERT_EQ(inlined_frames[0]->function_base, 0x15b83U); + ASSERT_EQ(inlined_frames[0]->source_file_name, "linux_inline.cpp"); + ASSERT_EQ(inlined_frames[0]->source_line, 27); + ASSERT_EQ(inlined_frames[0]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[0]->trust, StackFrame::FRAME_TRUST_INLINE); +} + +TEST_F(TestBasicSourceLineResolver, TestLoadAndResolveNewInlines) { + TestCodeModule module("linux_inline"); + ASSERT_TRUE(resolver.LoadModule( + &module, testdata_dir + + "/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/" + "linux_inline.new.sym")); + ASSERT_TRUE(resolver.HasModule(&module)); + StackFrame frame; + std::deque> inlined_frames; + frame.instruction = 0x161b6; + frame.module = &module; + // main frame. + resolver.FillSourceLineInfo(&frame, &inlined_frames); + ASSERT_EQ(frame.function_name, "main"); + ASSERT_EQ(frame.function_base, 0x15b30U); + ASSERT_EQ(frame.source_file_name, "a.cpp"); + ASSERT_EQ(frame.source_line, 42); + ASSERT_EQ(frame.source_line_base, 0x161b6U); + EXPECT_EQ(frame.is_multiple, false); + + ASSERT_EQ(inlined_frames.size(), 3UL); + + // Inlined frames inside main frame. + ASSERT_EQ(inlined_frames[2]->function_name, "foo()"); + ASSERT_EQ(inlined_frames[2]->function_base, 0x15b45U); + ASSERT_EQ(inlined_frames[2]->source_file_name, "b.cpp"); + ASSERT_EQ(inlined_frames[2]->source_line, 39); + ASSERT_EQ(inlined_frames[2]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[2]->trust, StackFrame::FRAME_TRUST_INLINE); + + ASSERT_EQ(inlined_frames[1]->function_name, "bar()"); + ASSERT_EQ(inlined_frames[1]->function_base, 0x15b72U); + ASSERT_EQ(inlined_frames[1]->source_file_name, "c.cpp"); + ASSERT_EQ(inlined_frames[1]->source_line, 32); + ASSERT_EQ(inlined_frames[1]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[1]->trust, StackFrame::FRAME_TRUST_INLINE); + + ASSERT_EQ(inlined_frames[0]->function_name, "func()"); + ASSERT_EQ(inlined_frames[0]->function_base, 0x15b83U); + ASSERT_EQ(inlined_frames[0]->source_file_name, "linux_inline.cpp"); + ASSERT_EQ(inlined_frames[0]->source_line, 27); + ASSERT_EQ(inlined_frames[0]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[0]->trust, StackFrame::FRAME_TRUST_INLINE); +} + +// Test parsing of valid FILE lines. The format is: +// FILE +TEST(SymbolParseHelper, ParseFileValid) { + long index; + char* filename; + + char kTestLine[] = "FILE 1 file name"; + ASSERT_TRUE(SymbolParseHelper::ParseFile(kTestLine, &index, &filename)); + EXPECT_EQ(1, index); + EXPECT_EQ("file name", string(filename)); + + // 0 is a valid index. + char kTestLine1[] = "FILE 0 file name"; + ASSERT_TRUE(SymbolParseHelper::ParseFile(kTestLine1, &index, &filename)); + EXPECT_EQ(0, index); + EXPECT_EQ("file name", string(filename)); +} + +// Test parsing of invalid FILE lines. The format is: +// FILE +TEST(SymbolParseHelper, ParseFileInvalid) { + long index; + char* filename; + + // Test missing file name. + char kTestLine[] = "FILE 1 "; + ASSERT_FALSE(SymbolParseHelper::ParseFile(kTestLine, &index, &filename)); + + // Test bad index. + char kTestLine1[] = "FILE x1 file name"; + ASSERT_FALSE(SymbolParseHelper::ParseFile(kTestLine1, &index, &filename)); + + // Test large index. + char kTestLine2[] = "FILE 123123123123123123123123 file name"; + ASSERT_FALSE(SymbolParseHelper::ParseFile(kTestLine2, &index, &filename)); + + // Test negative index. + char kTestLine3[] = "FILE -2 file name"; + ASSERT_FALSE(SymbolParseHelper::ParseFile(kTestLine3, &index, &filename)); +} + +// Test parsing of valid FUNC lines. The format is: +// FUNC []
    +TEST(SymbolParseHelper, ParseFunctionValid) { + bool multiple; + uint64_t address; + uint64_t size; + long stack_param_size; + char* name; + + char kTestLine[] = "FUNC 1 2 3 function name"; + ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine, &multiple, &address, + &size, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); + EXPECT_EQ(1ULL, address); + EXPECT_EQ(2ULL, size); + EXPECT_EQ(3, stack_param_size); + EXPECT_EQ("function name", string(name)); + + // Test hex address, size, and param size. + char kTestLine1[] = "FUNC a1 a2 a3 function name"; + ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine1, &multiple, &address, + &size, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); + EXPECT_EQ(0xa1ULL, address); + EXPECT_EQ(0xa2ULL, size); + EXPECT_EQ(0xa3, stack_param_size); + EXPECT_EQ("function name", string(name)); + + char kTestLine2[] = "FUNC 0 0 0 function name"; + ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine2, &multiple, &address, + &size, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); + EXPECT_EQ(0ULL, address); + EXPECT_EQ(0ULL, size); + EXPECT_EQ(0, stack_param_size); + EXPECT_EQ("function name", string(name)); + + // Test optional multiple field. + char kTestLine3[] = "FUNC m a1 a2 a3 function name"; + ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine3, &multiple, &address, + &size, &stack_param_size, + &name)); + EXPECT_TRUE(multiple); + EXPECT_EQ(0xa1ULL, address); + EXPECT_EQ(0xa2ULL, size); + EXPECT_EQ(0xa3, stack_param_size); + EXPECT_EQ("function name", string(name)); +} + +// Test parsing of invalid FUNC lines. The format is: +// FUNC []
    +TEST(SymbolParseHelper, ParseFunctionInvalid) { + bool multiple; + uint64_t address; + uint64_t size; + long stack_param_size; + char* name; + + // Test missing function name. + char kTestLine[] = "FUNC 1 2 3 "; + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine, &multiple, &address, + &size, &stack_param_size, + &name)); + // Test bad address. + char kTestLine1[] = "FUNC 1z 2 3 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine1, &multiple, &address, + &size, &stack_param_size, + &name)); + // Test large address. + char kTestLine2[] = "FUNC 123123123123123123123123123 2 3 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine2, &multiple, &address, + &size, &stack_param_size, + &name)); + // Test bad size. + char kTestLine3[] = "FUNC 1 z2 3 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine3, &multiple, &address, + &size, &stack_param_size, + &name)); + // Test large size. + char kTestLine4[] = "FUNC 1 231231231231231231231231232 3 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine4, &multiple, &address, + &size, &stack_param_size, + &name)); + // Test bad param size. + char kTestLine5[] = "FUNC 1 2 3z function name"; + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine5, &multiple, &address, + &size, &stack_param_size, + &name)); + // Test large param size. + char kTestLine6[] = "FUNC 1 2 312312312312312312312312323 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine6, &multiple, &address, + &size, &stack_param_size, + &name)); + // Negative param size. + char kTestLine7[] = "FUNC 1 2 -5 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine7, &multiple, &address, + &size, &stack_param_size, + &name)); + // Test invalid optional field. + char kTestLine8[] = "FUNC x 1 2 5 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine8, &multiple, &address, + &size, &stack_param_size, + &name)); +} + +// Test parsing of valid lines. The format is: +//
    +TEST(SymbolParseHelper, ParseLineValid) { + uint64_t address; + uint64_t size; + long line_number; + long source_file; + + char kTestLine[] = "1 2 3 4"; + ASSERT_TRUE(SymbolParseHelper::ParseLine(kTestLine, &address, &size, + &line_number, &source_file)); + EXPECT_EQ(1ULL, address); + EXPECT_EQ(2ULL, size); + EXPECT_EQ(3, line_number); + EXPECT_EQ(4, source_file); + + // Test hex size and address. + char kTestLine1[] = "a1 a2 3 4 // some comment"; + ASSERT_TRUE(SymbolParseHelper::ParseLine(kTestLine1, &address, &size, + &line_number, &source_file)); + EXPECT_EQ(0xa1ULL, address); + EXPECT_EQ(0xa2ULL, size); + EXPECT_EQ(3, line_number); + EXPECT_EQ(4, source_file); + + // 0 is a valid line number. + char kTestLine2[] = "a1 a2 0 4 // some comment"; + ASSERT_TRUE(SymbolParseHelper::ParseLine(kTestLine2, &address, &size, + &line_number, &source_file)); + EXPECT_EQ(0xa1ULL, address); + EXPECT_EQ(0xa2ULL, size); + EXPECT_EQ(0, line_number); + EXPECT_EQ(4, source_file); +} + +// Test parsing of invalid lines. The format is: +//
    +TEST(SymbolParseHelper, ParseLineInvalid) { + uint64_t address; + uint64_t size; + long line_number; + long source_file; + + // Test missing source file id. + char kTestLine[] = "1 2 3"; + ASSERT_FALSE(SymbolParseHelper::ParseLine(kTestLine, &address, &size, + &line_number, &source_file)); + // Test bad address. + char kTestLine1[] = "1z 2 3 4"; + ASSERT_FALSE(SymbolParseHelper::ParseLine(kTestLine1, &address, &size, + &line_number, &source_file)); + // Test large address. + char kTestLine2[] = "123123123123123123123123 2 3 4"; + ASSERT_FALSE(SymbolParseHelper::ParseLine(kTestLine2, &address, &size, + &line_number, &source_file)); + // Test bad size. + char kTestLine3[] = "1 z2 3 4"; + ASSERT_FALSE(SymbolParseHelper::ParseLine(kTestLine3, &address, &size, + &line_number, &source_file)); + // Test large size. + char kTestLine4[] = "1 123123123123123123123123 3 4"; + ASSERT_FALSE(SymbolParseHelper::ParseLine(kTestLine4, &address, &size, + &line_number, &source_file)); + // Test bad line number. + char kTestLine5[] = "1 2 z3 4"; + ASSERT_FALSE(SymbolParseHelper::ParseLine(kTestLine5, &address, &size, + &line_number, &source_file)); + // Test negative line number. + char kTestLine6[] = "1 2 -1 4"; + ASSERT_FALSE(SymbolParseHelper::ParseLine(kTestLine6, &address, &size, + &line_number, &source_file)); + // Test large line number. + char kTestLine7[] = "1 2 123123123123123123123 4"; + ASSERT_FALSE(SymbolParseHelper::ParseLine(kTestLine7, &address, &size, + &line_number, &source_file)); + // Test bad source file id. + char kTestLine8[] = "1 2 3 f"; + ASSERT_FALSE(SymbolParseHelper::ParseLine(kTestLine8, &address, &size, + &line_number, &source_file)); +} + +// Test parsing of valid PUBLIC lines. The format is: +// PUBLIC []
    +TEST(SymbolParseHelper, ParsePublicSymbolValid) { + bool multiple; + uint64_t address; + long stack_param_size; + char* name; + + char kTestLine[] = "PUBLIC 1 2 3"; + ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine, &multiple, + &address, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); + EXPECT_EQ(1ULL, address); + EXPECT_EQ(2, stack_param_size); + EXPECT_EQ("3", string(name)); + + // Test hex size and address. + char kTestLine1[] = "PUBLIC a1 a2 function name"; + ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine1, &multiple, + &address, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); + EXPECT_EQ(0xa1ULL, address); + EXPECT_EQ(0xa2, stack_param_size); + EXPECT_EQ("function name", string(name)); + + // Test 0 is a valid address. + char kTestLine2[] = "PUBLIC 0 a2 function name"; + ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine2, &multiple, + &address, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); + EXPECT_EQ(0ULL, address); + EXPECT_EQ(0xa2, stack_param_size); + EXPECT_EQ("function name", string(name)); + + // Test optional multiple field. + char kTestLine3[] = "PUBLIC m a1 a2 function name"; + ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine3, &multiple, + &address, &stack_param_size, + &name)); + EXPECT_TRUE(multiple); + EXPECT_EQ(0xa1ULL, address); + EXPECT_EQ(0xa2, stack_param_size); + EXPECT_EQ("function name", string(name)); +} + +// Test parsing of invalid PUBLIC lines. The format is: +// PUBLIC []
    +TEST(SymbolParseHelper, ParsePublicSymbolInvalid) { + bool multiple; + uint64_t address; + long stack_param_size; + char* name; + + // Test missing source function name. + char kTestLine[] = "PUBLIC 1 2 "; + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine, &multiple, + &address, &stack_param_size, + &name)); + // Test bad address. + char kTestLine1[] = "PUBLIC 1z 2 3"; + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine1, &multiple, + &address, &stack_param_size, + &name)); + // Test large address. + char kTestLine2[] = "PUBLIC 123123123123123123123123 2 3"; + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine2, &multiple, + &address, &stack_param_size, + &name)); + // Test bad param stack size. + char kTestLine3[] = "PUBLIC 1 z2 3"; + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine3, &multiple, + &address, &stack_param_size, + &name)); + // Test large param stack size. + char kTestLine4[] = "PUBLIC 1 123123123123123123123123123 3"; + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine4, &multiple, + &address, &stack_param_size, + &name)); + // Test negative param stack size. + char kTestLine5[] = "PUBLIC 1 -5 3"; + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine5, &multiple, + &address, &stack_param_size, + &name)); + // Test invalid optional field. + char kTestLine6[] = "PUBLIC x 1 5 3"; + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine6, &multiple, + &address, &stack_param_size, + &name)); +} + +// Test parsing of valid INLINE_ORIGIN lines. +// The old format: +// INLINE_ORIGIN +// The new format: +// INLINE_ORIGIN +TEST(SymbolParseHelper, ParseInlineOriginValid) { + bool has_file_id; + long origin_id; + long file_id; + char* name; + // Test for old format. + char kTestLine[] = "INLINE_ORIGIN 1 1 function name"; + ASSERT_TRUE(SymbolParseHelper::ParseInlineOrigin( + kTestLine, &has_file_id, &origin_id, &file_id, &name)); + EXPECT_EQ(true, has_file_id); + EXPECT_EQ(1, origin_id); + EXPECT_EQ(1, file_id); + EXPECT_EQ("function name", string(name)); + + // -1 is a file id, which is used when the function is artifical. + char kTestLine1[] = "INLINE_ORIGIN 0 -1 function name"; + ASSERT_TRUE(SymbolParseHelper::ParseInlineOrigin( + kTestLine1, &has_file_id, &origin_id, &file_id, &name)); + EXPECT_EQ(true, has_file_id); + EXPECT_EQ(0, origin_id); + EXPECT_EQ(-1, file_id); + EXPECT_EQ("function name", string(name)); + + // Test for new format. + char kTestLine2[] = "INLINE_ORIGIN 0 function name"; + ASSERT_TRUE(SymbolParseHelper::ParseInlineOrigin( + kTestLine2, &has_file_id, &origin_id, &file_id, &name)); + EXPECT_EQ(false, has_file_id); + EXPECT_EQ(0, origin_id); + EXPECT_EQ("function name", string(name)); + + char kTestLine3[] = "INLINE_ORIGIN 0 function"; + ASSERT_TRUE(SymbolParseHelper::ParseInlineOrigin( + kTestLine3, &has_file_id, &origin_id, &file_id, &name)); + EXPECT_EQ(false, has_file_id); + EXPECT_EQ(0, origin_id); + EXPECT_EQ("function", string(name)); +} + +// Test parsing of valid INLINE ORIGIN lines. The format is: +// INLINE_ORIGIN +TEST(SymbolParseHelper, ParseInlineOriginInvalid) { + bool has_file_id; + long origin_id; + long file_id; + char* name; + + // Test missing function name. + char kTestLine[] = "INLINE_ORIGIN 1 1"; + ASSERT_FALSE(SymbolParseHelper::ParseInlineOrigin( + kTestLine, &has_file_id, &origin_id, &file_id, &name)); + + // Test bad origin id. + char kTestLine1[] = "INLINE_ORIGIN x1 1 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseInlineOrigin( + kTestLine1, &has_file_id, &origin_id, &file_id, &name)); + + // Test large origin id. + char kTestLine2[] = "INLINE_ORIGIN 123123123123123123123123 1 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseInlineOrigin( + kTestLine2, &has_file_id, &origin_id, &file_id, &name)); + + // Test negative origin id. + char kTestLine3[] = "INLINE_ORIGIN -1 1 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseInlineOrigin( + kTestLine3, &has_file_id, &origin_id, &file_id, &name)); +} + +// Test parsing of valid INLINE lines. +// The old format: +// INLINE [
    ]+ +// The new format: +// INLINE +// [
    ]+ +TEST(SymbolParseHelper, ParseInlineValid) { + bool has_call_site_file_id; + long inline_nest_level; + long call_site_line; + long call_site_file_id; + long origin_id; + std::vector> ranges; + + // Test for old format. + char kTestLine[] = "INLINE 0 1 2 3 4"; + ASSERT_TRUE(SymbolParseHelper::ParseInline( + kTestLine, &has_call_site_file_id, &inline_nest_level, &call_site_line, + &call_site_file_id, &origin_id, &ranges)); + EXPECT_EQ(false, has_call_site_file_id); + EXPECT_EQ(0, inline_nest_level); + EXPECT_EQ(1, call_site_line); + EXPECT_EQ(2, origin_id); + EXPECT_EQ(0x3ULL, ranges[0].first); + EXPECT_EQ(0x4ULL, ranges[0].second); + ranges.clear(); + + // Test hex and discontinuous ranges. + char kTestLine1[] = "INLINE 0 1 2 a b 1a 1b"; + ASSERT_TRUE(SymbolParseHelper::ParseInline( + kTestLine1, &has_call_site_file_id, &inline_nest_level, &call_site_line, + &call_site_file_id, &origin_id, &ranges)); + EXPECT_EQ(false, has_call_site_file_id); + EXPECT_EQ(0, inline_nest_level); + EXPECT_EQ(1, call_site_line); + EXPECT_EQ(2, origin_id); + EXPECT_EQ(0xaULL, ranges[0].first); + EXPECT_EQ(0xbULL, ranges[0].second); + EXPECT_EQ(0x1aULL, ranges[1].first); + EXPECT_EQ(0x1bULL, ranges[1].second); + + // Test for new format. + char kTestLine2[] = "INLINE 0 1 2 3 a b 1a 1b"; + ASSERT_TRUE(SymbolParseHelper::ParseInline( + kTestLine2, &has_call_site_file_id, &inline_nest_level, &call_site_line, + &call_site_file_id, &origin_id, &ranges)); + EXPECT_EQ(true, has_call_site_file_id); + EXPECT_EQ(0, inline_nest_level); + EXPECT_EQ(1, call_site_line); + EXPECT_EQ(2, call_site_file_id); + EXPECT_EQ(3, origin_id); + EXPECT_EQ(0xaULL, ranges[0].first); + EXPECT_EQ(0xbULL, ranges[0].second); + EXPECT_EQ(0x1aULL, ranges[1].first); + EXPECT_EQ(0x1bULL, ranges[1].second); +} + +// Test parsing of Invalid INLINE lines. +TEST(SymbolParseHelper, ParseInlineInvalid) { + bool has_call_site_file_id; + long inline_nest_level; + long call_site_line; + long call_site_file_id; + long origin_id; + std::vector> ranges; + + // Test negative inline_nest_level. + char kTestLine[] = "INLINE -1 1 2 3 4"; + ASSERT_FALSE(SymbolParseHelper::ParseInline( + kTestLine, &has_call_site_file_id, &inline_nest_level, &call_site_line, + &call_site_file_id, &origin_id, &ranges)); + + // Test negative call_site_line. + char kTestLine1[] = "INLINE 0 -1 2 3 4"; + ASSERT_FALSE(SymbolParseHelper::ParseInline( + kTestLine1, &has_call_site_file_id, &inline_nest_level, &call_site_line, + &call_site_file_id, &origin_id, &ranges)); + + // Test negative origin_id. + char kTestLine2[] = "INLINE 0 1 -2 3 4"; + ASSERT_FALSE(SymbolParseHelper::ParseInline( + kTestLine2, &has_call_site_file_id, &inline_nest_level, &call_site_line, + &call_site_file_id, &origin_id, &ranges)); + + // Test missing ranges. + char kTestLine3[] = "INLINE 0 1 -2"; + ASSERT_FALSE(SymbolParseHelper::ParseInline( + kTestLine3, &has_call_site_file_id, &inline_nest_level, &call_site_line, + &call_site_file_id, &origin_id, &ranges)); + + // Test missing size for range. + char kTestLine4[] = "INLINE 0 1 -2 3"; + ASSERT_FALSE(SymbolParseHelper::ParseInline( + kTestLine4, &has_call_site_file_id, &inline_nest_level, &call_site_line, + &call_site_file_id, &origin_id, &ranges)); +} + +} // namespace + +int main(int argc, char* argv[]) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/src/processor/call_stack.cc b/src/processor/call_stack.cc new file mode 100644 index 0000000..6ecae6d --- /dev/null +++ b/src/processor/call_stack.cc @@ -0,0 +1,57 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// call_stack.cc: A call stack comprised of stack frames. +// +// See call_stack.h for documentation. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/stack_frame.h" + +namespace google_breakpad { + +CallStack::~CallStack() { + Clear(); +} + +void CallStack::Clear() { + for (vector::const_iterator iterator = frames_.begin(); + iterator != frames_.end(); + ++iterator) { + delete *iterator; + } + tid_ = 0; +} + +} // namespace google_breakpad diff --git a/src/processor/cfi_frame_info-inl.h b/src/processor/cfi_frame_info-inl.h new file mode 100644 index 0000000..acfc4f7 --- /dev/null +++ b/src/processor/cfi_frame_info-inl.h @@ -0,0 +1,118 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// cfi_frame_info-inl.h: Definitions for cfi_frame_info.h inlined functions. + +#ifndef PROCESSOR_CFI_FRAME_INFO_INL_H_ +#define PROCESSOR_CFI_FRAME_INFO_INL_H_ + +#include + +namespace google_breakpad { + +template +bool SimpleCFIWalker::FindCallerRegisters( + const MemoryRegion& memory, + const CFIFrameInfo& cfi_frame_info, + const RawContextType& callee_context, + int callee_validity, + RawContextType* caller_context, + int* caller_validity) const { + typedef CFIFrameInfo::RegisterValueMap ValueMap; + ValueMap callee_registers; + ValueMap caller_registers; + // Just for brevity. + typename ValueMap::const_iterator caller_none = caller_registers.end(); + + // Populate callee_registers with register values from callee_context. + for (size_t i = 0; i < map_size_; i++) { + const RegisterSet& r = register_map_[i]; + if (callee_validity & r.validity_flag) + callee_registers[r.name] = callee_context.*r.context_member; + } + + // Apply the rules, and see what register values they yield. + if (!cfi_frame_info.FindCallerRegs(callee_registers, memory, + &caller_registers)) + return false; + + // Populate *caller_context with the values the rules placed in + // caller_registers. + memset(caller_context, 0xda, sizeof(*caller_context)); + *caller_validity = 0; + for (size_t i = 0; i < map_size_; i++) { + const RegisterSet& r = register_map_[i]; + typename ValueMap::const_iterator caller_entry; + + // Did the rules provide a value for this register by its name? + caller_entry = caller_registers.find(r.name); + if (caller_entry != caller_none) { + caller_context->*r.context_member = caller_entry->second; + *caller_validity |= r.validity_flag; + continue; + } + + // Did the rules provide a value for this register under its + // alternate name? + if (r.alternate_name) { + caller_entry = caller_registers.find(r.alternate_name); + if (caller_entry != caller_none) { + caller_context->*r.context_member = caller_entry->second; + *caller_validity |= r.validity_flag; + continue; + } + } + + // Is this a callee-saves register? The walker assumes that these + // still hold the caller's value if the CFI doesn't mention them. + // + // Note that other frame walkers may fail to recover callee-saves + // registers; for example, the x86 "traditional" strategy only + // recovers %eip, %esp, and %ebp, even though %ebx, %esi, and %edi + // are callee-saves, too. It is not correct to blindly set the + // valid bit for all callee-saves registers, without first + // checking its validity bit in the callee. + if (r.callee_saves && (callee_validity & r.validity_flag) != 0) { + caller_context->*r.context_member = callee_context.*r.context_member; + *caller_validity |= r.validity_flag; + continue; + } + + // Otherwise, the register's value is unknown. + } + + return true; +} + +} // namespace google_breakpad + +#endif // PROCESSOR_CFI_FRAME_INFO_INL_H_ diff --git a/src/processor/cfi_frame_info.cc b/src/processor/cfi_frame_info.cc new file mode 100644 index 0000000..2094e09 --- /dev/null +++ b/src/processor/cfi_frame_info.cc @@ -0,0 +1,189 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// cfi_frame_info.cc: Implementation of CFIFrameInfo class. +// See cfi_frame_info.h for details. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/cfi_frame_info.h" + +#include + +#include + +#include "common/scoped_ptr.h" +#include "processor/postfix_evaluator-inl.h" + +namespace google_breakpad { + +#ifdef _MSC_VER +#define strtok_r strtok_s +#endif + +template +bool CFIFrameInfo::FindCallerRegs(const RegisterValueMap& registers, + const MemoryRegion& memory, + RegisterValueMap* caller_registers) const { + // If there are not rules for both .ra and .cfa in effect at this address, + // don't use this CFI data for stack walking. + if (cfa_rule_.empty() || ra_rule_.empty()) + return false; + + RegisterValueMap working; + PostfixEvaluator evaluator(&working, &memory); + + caller_registers->clear(); + + // First, compute the CFA. + V cfa; + working = registers; + if (!evaluator.EvaluateForValue(cfa_rule_, &cfa)) + return false; + + // Then, compute the return address. + V ra; + working = registers; + working[".cfa"] = cfa; + if (!evaluator.EvaluateForValue(ra_rule_, &ra)) + return false; + + // Now, compute values for all the registers register_rules_ mentions. + for (RuleMap::const_iterator it = register_rules_.begin(); + it != register_rules_.end(); it++) { + V value; + working = registers; + working[".cfa"] = cfa; + if (!evaluator.EvaluateForValue(it->second, &value)) + continue; + (*caller_registers)[it->first] = value; + } + + (*caller_registers)[".ra"] = ra; + (*caller_registers)[".cfa"] = cfa; + + return true; +} + +// Explicit instantiations for 32-bit and 64-bit architectures. +template bool CFIFrameInfo::FindCallerRegs( + const RegisterValueMap& registers, + const MemoryRegion& memory, + RegisterValueMap* caller_registers) const; +template bool CFIFrameInfo::FindCallerRegs( + const RegisterValueMap& registers, + const MemoryRegion& memory, + RegisterValueMap* caller_registers) const; + +string CFIFrameInfo::Serialize() const { + std::ostringstream stream; + + if (!cfa_rule_.empty()) { + stream << ".cfa: " << cfa_rule_; + } + if (!ra_rule_.empty()) { + if (static_cast(stream.tellp()) != 0) + stream << " "; + stream << ".ra: " << ra_rule_; + } + for (RuleMap::const_iterator iter = register_rules_.begin(); + iter != register_rules_.end(); + ++iter) { + if (static_cast(stream.tellp()) != 0) + stream << " "; + stream << iter->first << ": " << iter->second; + } + + return stream.str(); +} + +bool CFIRuleParser::Parse(const string& rule_set) { + size_t rule_set_len = rule_set.size(); + scoped_array working_copy(new char[rule_set_len + 1]); + memcpy(working_copy.get(), rule_set.data(), rule_set_len); + working_copy[rule_set_len] = '\0'; + + name_.clear(); + expression_.clear(); + + char* cursor; + static const char token_breaks[] = " \t\r\n"; + char* token = strtok_r(working_copy.get(), token_breaks, &cursor); + + for (;;) { + // End of rule set? + if (!token) return Report(); + + // Register/pseudoregister name? + size_t token_len = strlen(token); + if (token_len >= 1 && token[token_len - 1] == ':') { + // Names can't be empty. + if (token_len < 2) return false; + // If there is any pending content, report it. + if (!name_.empty() || !expression_.empty()) { + if (!Report()) return false; + } + name_.assign(token, token_len - 1); + expression_.clear(); + } else { + // Another expression component. + assert(token_len > 0); // strtok_r guarantees this, I think. + if (!expression_.empty()) + expression_ += ' '; + expression_ += token; + } + token = strtok_r(NULL, token_breaks, &cursor); + } +} + +bool CFIRuleParser::Report() { + if (name_.empty() || expression_.empty()) return false; + if (name_ == ".cfa") handler_->CFARule(expression_); + else if (name_ == ".ra") handler_->RARule(expression_); + else handler_->RegisterRule(name_, expression_); + return true; +} + +void CFIFrameInfoParseHandler::CFARule(const string& expression) { + frame_info_->SetCFARule(expression); +} + +void CFIFrameInfoParseHandler::RARule(const string& expression) { + frame_info_->SetRARule(expression); +} + +void CFIFrameInfoParseHandler::RegisterRule(const string& name, + const string& expression) { + frame_info_->SetRegisterRule(name, expression); +} + +} // namespace google_breakpad diff --git a/src/processor/cfi_frame_info.h b/src/processor/cfi_frame_info.h new file mode 100644 index 0000000..08f1eb7 --- /dev/null +++ b/src/processor/cfi_frame_info.h @@ -0,0 +1,274 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// cfi_frame_info.h: Define the CFIFrameInfo class, which holds the +// set of 'STACK CFI'-derived register recovery rules that apply at a +// given instruction. + +#ifndef PROCESSOR_CFI_FRAME_INFO_H_ +#define PROCESSOR_CFI_FRAME_INFO_H_ + +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +using std::map; + +class MemoryRegion; + +// A set of rules for recovering the calling frame's registers' +// values, when the PC is at a given address in the current frame's +// function. See the description of 'STACK CFI' records at: +// +// https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/symbol_files.md +// +// To prepare an instance of CFIFrameInfo for use at a given +// instruction, first populate it with the rules from the 'STACK CFI +// INIT' record that covers that instruction, and then apply the +// changes given by the 'STACK CFI' records up to our instruction's +// address. Then, use the FindCallerRegs member function to apply the +// rules to the callee frame's register values, yielding the caller +// frame's register values. +class CFIFrameInfo { + public: + // A map from register names onto values. + template class RegisterValueMap: + public map { }; + + // Set the expression for computing a call frame address, return + // address, or register's value. At least the CFA rule and the RA + // rule must be set before calling FindCallerRegs. + void SetCFARule(const string& expression) { cfa_rule_ = expression; } + void SetRARule(const string& expression) { ra_rule_ = expression; } + void SetRegisterRule(const string& register_name, const string& expression) { + register_rules_[register_name] = expression; + } + + // Compute the values of the calling frame's registers, according to + // this rule set. Use ValueType in expression evaluation; this + // should be uint32_t on machines with 32-bit addresses, or + // uint64_t on machines with 64-bit addresses. + // + // Return true on success, false otherwise. + // + // MEMORY provides access to the contents of the stack. REGISTERS is + // a dictionary mapping the names of registers whose values are + // known in the current frame to their values. CALLER_REGISTERS is + // populated with the values of the recoverable registers in the + // frame that called the current frame. + // + // In addition, CALLER_REGISTERS[".ra"] will be the return address, + // and CALLER_REGISTERS[".cfa"] will be the call frame address. + // These may be helpful in computing the caller's PC and stack + // pointer, if their values are not explicitly specified. + template + bool FindCallerRegs(const RegisterValueMap& registers, + const MemoryRegion& memory, + RegisterValueMap* caller_registers) const; + + // Serialize the rules in this object into a string in the format + // of STACK CFI records. + string Serialize() const; + + private: + + // A map from register names onto evaluation rules. + typedef map RuleMap; + + // In this type, a "postfix expression" is an expression of the sort + // interpreted by google_breakpad::PostfixEvaluator. + + // A postfix expression for computing the current frame's CFA (call + // frame address). The CFA is a reference address for the frame that + // remains unchanged throughout the frame's lifetime. You should + // evaluate this expression with a dictionary initially populated + // with the values of the current frame's known registers. + string cfa_rule_; + + // The following expressions should be evaluated with a dictionary + // initially populated with the values of the current frame's known + // registers, and with ".cfa" set to the result of evaluating the + // cfa_rule expression, above. + + // A postfix expression for computing the current frame's return + // address. + string ra_rule_; + + // For a register named REG, rules[REG] is a postfix expression + // which leaves the value of REG in the calling frame on the top of + // the stack. You should evaluate this expression + RuleMap register_rules_; +}; + +// A parser for STACK CFI-style rule sets. +// This may seem bureaucratic: there's no legitimate run-time reason +// to use a parser/handler pattern for this, as it's not a likely +// reuse boundary. But doing so makes finer-grained unit testing +// possible. +class CFIRuleParser { + public: + + class Handler { + public: + Handler() { } + virtual ~Handler() { } + + // The input specifies EXPRESSION as the CFA/RA computation rule. + virtual void CFARule(const string& expression) = 0; + virtual void RARule(const string& expression) = 0; + + // The input specifies EXPRESSION as the recovery rule for register NAME. + virtual void RegisterRule(const string& name, const string& expression) = 0; + }; + + // Construct a parser which feeds its results to HANDLER. + CFIRuleParser(Handler* handler) : handler_(handler) { } + + // Parse RULE_SET as a set of CFA computation and RA/register + // recovery rules, as appearing in STACK CFI records. Report the + // results of parsing by making the appropriate calls to handler_. + // Return true if parsing was successful, false otherwise. + bool Parse(const string& rule_set); + + private: + // Report any accumulated rule to handler_ + bool Report(); + + // The handler to which the parser reports its findings. + Handler* handler_; + + // Working data. + string name_, expression_; +}; + +// A handler for rule set parsing that populates a CFIFrameInfo with +// the results. +class CFIFrameInfoParseHandler: public CFIRuleParser::Handler { + public: + // Populate FRAME_INFO with the results of parsing. + CFIFrameInfoParseHandler(CFIFrameInfo* frame_info) + : frame_info_(frame_info) { } + + void CFARule(const string& expression); + void RARule(const string& expression); + void RegisterRule(const string& name, const string& expression); + + private: + CFIFrameInfo* frame_info_; +}; + +// A utility class template for simple 'STACK CFI'-driven stack walkers. +// Given a CFIFrameInfo instance, a table describing the architecture's +// register set, and a context holding the last frame's registers, an +// instance of this class can populate a new context with the caller's +// registers. +// +// This class template doesn't use any internal knowledge of CFIFrameInfo +// or the other stack walking structures; it just uses the public interface +// of CFIFrameInfo to do the usual things. But the logic it handles should +// be common to many different architectures' stack walkers, so wrapping it +// up in a class should allow the walkers to share code. +// +// RegisterType should be the type of this architecture's registers, either +// uint32_t or uint64_t. RawContextType should be the raw context +// structure type for this architecture. +template +class SimpleCFIWalker { + public: + // A structure describing one architecture register. + struct RegisterSet { + // The register name, as it appears in STACK CFI rules. + const char* name; + + // An alternate name that the register's value might be found + // under in a register value dictionary, or NULL. When generating + // names, prefer NAME to this value. It's common to list ".cfa" as + // an alternative name for the stack pointer, and ".ra" as an + // alternative name for the instruction pointer. + const char* alternate_name; + + // True if the callee is expected to preserve the value of this + // register. If this flag is true for some register R, and the STACK + // CFI records provide no rule to recover R, then SimpleCFIWalker + // assumes that the callee has not changed R's value, and the caller's + // value for R is that currently in the callee's context. + bool callee_saves; + + // The ContextValidity flag representing the register's presence. + int validity_flag; + + // A pointer to the RawContextType member that holds the + // register's value. + RegisterType RawContextType::*context_member; + }; + + // Create a simple CFI-based frame walker, given a description of the + // architecture's register set. REGISTER_MAP is an array of + // RegisterSet structures; MAP_SIZE is the number of elements in the + // array. + SimpleCFIWalker(const RegisterSet* register_map, size_t map_size) + : register_map_(register_map), map_size_(map_size) { } + + // Compute the calling frame's raw context given the callee's raw + // context. + // + // Given: + // + // - MEMORY, holding the stack's contents, + // - CFI_FRAME_INFO, describing the called function, + // - CALLEE_CONTEXT, holding the called frame's registers, and + // - CALLEE_VALIDITY, indicating which registers in CALLEE_CONTEXT are valid, + // + // fill in CALLER_CONTEXT with the caller's register values, and set + // CALLER_VALIDITY to indicate which registers are valid in + // CALLER_CONTEXT. Return true on success, or false on failure. + bool FindCallerRegisters(const MemoryRegion& memory, + const CFIFrameInfo& cfi_frame_info, + const RawContextType& callee_context, + int callee_validity, + RawContextType* caller_context, + int* caller_validity) const; + + private: + const RegisterSet* register_map_; + size_t map_size_; +}; + +} // namespace google_breakpad + +#include "cfi_frame_info-inl.h" + +#endif // PROCESSOR_CFI_FRAME_INFO_H_ diff --git a/src/processor/cfi_frame_info_unittest.cc b/src/processor/cfi_frame_info_unittest.cc new file mode 100644 index 0000000..0cf4562 --- /dev/null +++ b/src/processor/cfi_frame_info_unittest.cc @@ -0,0 +1,552 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// cfi_frame_info_unittest.cc: Unit tests for CFIFrameInfo, +// CFIRuleParser, CFIFrameInfoParseHandler, and SimpleCFIWalker. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "breakpad_googletest_includes.h" +#include "common/using_std_string.h" +#include "processor/cfi_frame_info.h" +#include "google_breakpad/processor/memory_region.h" + +using google_breakpad::CFIFrameInfo; +using google_breakpad::CFIFrameInfoParseHandler; +using google_breakpad::CFIRuleParser; +using google_breakpad::MemoryRegion; +using google_breakpad::SimpleCFIWalker; +using testing::_; +using testing::A; +using testing::AtMost; +using testing::DoAll; +using testing::Return; +using testing::SetArgumentPointee; +using testing::Test; + +class MockMemoryRegion: public MemoryRegion { + public: + MOCK_CONST_METHOD0(GetBase, uint64_t()); + MOCK_CONST_METHOD0(GetSize, uint32_t()); + MOCK_CONST_METHOD2(GetMemoryAtAddress, bool(uint64_t, uint8_t*)); + MOCK_CONST_METHOD2(GetMemoryAtAddress, bool(uint64_t, uint16_t*)); + MOCK_CONST_METHOD2(GetMemoryAtAddress, bool(uint64_t, uint32_t*)); + MOCK_CONST_METHOD2(GetMemoryAtAddress, bool(uint64_t, uint64_t*)); + MOCK_CONST_METHOD0(Print, void()); +}; + +// Handy definitions for all tests. +struct CFIFixture { + + // Set up the mock memory object to expect no references. + void ExpectNoMemoryReferences() { + EXPECT_CALL(memory, GetBase()).Times(0); + EXPECT_CALL(memory, GetSize()).Times(0); + EXPECT_CALL(memory, GetMemoryAtAddress(_, A())).Times(0); + EXPECT_CALL(memory, GetMemoryAtAddress(_, A())).Times(0); + EXPECT_CALL(memory, GetMemoryAtAddress(_, A())).Times(0); + EXPECT_CALL(memory, GetMemoryAtAddress(_, A())).Times(0); + } + + CFIFrameInfo cfi; + MockMemoryRegion memory; + CFIFrameInfo::RegisterValueMap registers, caller_registers; +}; + +class Simple: public CFIFixture, public Test { }; + +// FindCallerRegs should fail if no .cfa rule is provided. +TEST_F(Simple, NoCFA) { + ExpectNoMemoryReferences(); + + cfi.SetRARule("0"); + ASSERT_FALSE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(".ra: 0", cfi.Serialize()); +} + +// FindCallerRegs should fail if no .ra rule is provided. +TEST_F(Simple, NoRA) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule("0"); + ASSERT_FALSE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(".cfa: 0", cfi.Serialize()); +} + +TEST_F(Simple, SetCFAAndRARule) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule("330903416631436410"); + cfi.SetRARule("5870666104170902211"); + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(2U, caller_registers.size()); + ASSERT_EQ(330903416631436410ULL, caller_registers[".cfa"]); + ASSERT_EQ(5870666104170902211ULL, caller_registers[".ra"]); + + ASSERT_EQ(".cfa: 330903416631436410 .ra: 5870666104170902211", + cfi.Serialize()); +} + +TEST_F(Simple, SetManyRules) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule("$temp1 68737028 = $temp2 61072337 = $temp1 $temp2 -"); + cfi.SetRARule(".cfa 99804755 +"); + cfi.SetRegisterRule("register1", ".cfa 54370437 *"); + cfi.SetRegisterRule("vodkathumbscrewingly", "24076308 .cfa +"); + cfi.SetRegisterRule("pubvexingfjordschmaltzy", ".cfa 29801007 -"); + cfi.SetRegisterRule("uncopyrightables", "92642917 .cfa /"); + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(6U, caller_registers.size()); + ASSERT_EQ(7664691U, caller_registers[".cfa"]); + ASSERT_EQ(107469446U, caller_registers[".ra"]); + ASSERT_EQ(416732599139967ULL, caller_registers["register1"]); + ASSERT_EQ(31740999U, caller_registers["vodkathumbscrewingly"]); + ASSERT_EQ(-22136316ULL, caller_registers["pubvexingfjordschmaltzy"]); + ASSERT_EQ(12U, caller_registers["uncopyrightables"]); + ASSERT_EQ(".cfa: $temp1 68737028 = $temp2 61072337 = $temp1 $temp2 - " + ".ra: .cfa 99804755 + " + "pubvexingfjordschmaltzy: .cfa 29801007 - " + "register1: .cfa 54370437 * " + "uncopyrightables: 92642917 .cfa / " + "vodkathumbscrewingly: 24076308 .cfa +", + cfi.Serialize()); +} + +TEST_F(Simple, RulesOverride) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule("330903416631436410"); + cfi.SetRARule("5870666104170902211"); + cfi.SetCFARule("2828089117179001"); + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(2U, caller_registers.size()); + ASSERT_EQ(2828089117179001ULL, caller_registers[".cfa"]); + ASSERT_EQ(5870666104170902211ULL, caller_registers[".ra"]); + ASSERT_EQ(".cfa: 2828089117179001 .ra: 5870666104170902211", + cfi.Serialize()); +} + +class Scope: public CFIFixture, public Test { }; + +// There should be no value for .cfa in scope when evaluating the CFA rule. +TEST_F(Scope, CFALacksCFA) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule(".cfa"); + cfi.SetRARule("0"); + ASSERT_FALSE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); +} + +// There should be no value for .ra in scope when evaluating the CFA rule. +TEST_F(Scope, CFALacksRA) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule(".ra"); + cfi.SetRARule("0"); + ASSERT_FALSE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); +} + +// The current frame's registers should be in scope when evaluating +// the CFA rule. +TEST_F(Scope, CFASeesCurrentRegs) { + ExpectNoMemoryReferences(); + + registers[".baraminology"] = 0x06a7bc63e4f13893ULL; + registers[".ornithorhynchus"] = 0x5e0bf850bafce9d2ULL; + cfi.SetCFARule(".baraminology .ornithorhynchus +"); + cfi.SetRARule("0"); + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(2U, caller_registers.size()); + ASSERT_EQ(0x06a7bc63e4f13893ULL + 0x5e0bf850bafce9d2ULL, + caller_registers[".cfa"]); +} + +// .cfa should be in scope in the return address expression. +TEST_F(Scope, RASeesCFA) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule("48364076"); + cfi.SetRARule(".cfa"); + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(2U, caller_registers.size()); + ASSERT_EQ(48364076U, caller_registers[".ra"]); +} + +// There should be no value for .ra in scope when evaluating the CFA rule. +TEST_F(Scope, RALacksRA) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule("0"); + cfi.SetRARule(".ra"); + ASSERT_FALSE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); +} + +// The current frame's registers should be in scope in the return +// address expression. +TEST_F(Scope, RASeesCurrentRegs) { + ExpectNoMemoryReferences(); + + registers["noachian"] = 0x54dc4a5d8e5eb503ULL; + cfi.SetCFARule("10359370"); + cfi.SetRARule("noachian"); + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(2U, caller_registers.size()); + ASSERT_EQ(0x54dc4a5d8e5eb503ULL, caller_registers[".ra"]); +} + +// .cfa should be in scope for register rules. +TEST_F(Scope, RegistersSeeCFA) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule("6515179"); + cfi.SetRARule(".cfa"); + cfi.SetRegisterRule("rogerian", ".cfa"); + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(3U, caller_registers.size()); + ASSERT_EQ(6515179U, caller_registers["rogerian"]); +} + +// The return address should not be in scope for register rules. +TEST_F(Scope, RegsLackRA) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule("42740329"); + cfi.SetRARule("27045204"); + cfi.SetRegisterRule("$r1", ".ra"); + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(caller_registers.end(), caller_registers.find("$r1")); +} + +// Register rules can see the current frame's register values. +TEST_F(Scope, RegsSeeRegs) { + ExpectNoMemoryReferences(); + + registers["$r1"] = 0x6ed3582c4bedb9adULL; + registers["$r2"] = 0xd27d9e742b8df6d0ULL; + cfi.SetCFARule("88239303"); + cfi.SetRARule("30503835"); + cfi.SetRegisterRule("$r1", "$r1 42175211 = $r2"); + cfi.SetRegisterRule("$r2", "$r2 21357221 = $r1"); + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(4U, caller_registers.size()); + ASSERT_EQ(0xd27d9e742b8df6d0ULL, caller_registers["$r1"]); + ASSERT_EQ(0x6ed3582c4bedb9adULL, caller_registers["$r2"]); +} + +// Each rule's temporaries are separate. +TEST_F(Scope, SeparateTempsRA) { + ExpectNoMemoryReferences(); + + cfi.SetCFARule("$temp1 76569129 = $temp1"); + cfi.SetRARule("0"); + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + + cfi.SetCFARule("$temp1 76569129 = $temp1"); + cfi.SetRARule("$temp1"); + ASSERT_FALSE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); +} + +class MockCFIRuleParserHandler: public CFIRuleParser::Handler { + public: + MOCK_METHOD1(CFARule, void(const string&)); + MOCK_METHOD1(RARule, void(const string&)); + MOCK_METHOD2(RegisterRule, void(const string&, const string&)); +}; + +// A fixture class for testing CFIRuleParser. +class CFIParserFixture { + public: + CFIParserFixture() : parser(&mock_handler) { + // Expect no parsing results to be reported to mock_handler. Individual + // tests can override this. + EXPECT_CALL(mock_handler, CFARule(_)).Times(0); + EXPECT_CALL(mock_handler, RARule(_)).Times(0); + EXPECT_CALL(mock_handler, RegisterRule(_, _)).Times(0); + } + + MockCFIRuleParserHandler mock_handler; + CFIRuleParser parser; +}; + +class Parser: public CFIParserFixture, public Test { }; + +TEST_F(Parser, Empty) { + EXPECT_FALSE(parser.Parse("")); +} + +TEST_F(Parser, LoneColon) { + EXPECT_FALSE(parser.Parse(":")); +} + +TEST_F(Parser, CFANoExpr) { + EXPECT_FALSE(parser.Parse(".cfa:")); +} + +TEST_F(Parser, CFANoColonNoExpr) { + EXPECT_FALSE(parser.Parse(".cfa")); +} + +TEST_F(Parser, RANoExpr) { + EXPECT_FALSE(parser.Parse(".ra:")); +} + +TEST_F(Parser, RANoColonNoExpr) { + EXPECT_FALSE(parser.Parse(".ra")); +} + +TEST_F(Parser, RegNoExpr) { + EXPECT_FALSE(parser.Parse("reg:")); +} + +TEST_F(Parser, NoName) { + EXPECT_FALSE(parser.Parse("expr")); +} + +TEST_F(Parser, NoNameTwo) { + EXPECT_FALSE(parser.Parse("expr1 expr2")); +} + +TEST_F(Parser, StartsWithExpr) { + EXPECT_FALSE(parser.Parse("expr1 reg: expr2")); +} + +TEST_F(Parser, CFA) { + EXPECT_CALL(mock_handler, CFARule("spleen")).WillOnce(Return()); + EXPECT_TRUE(parser.Parse(".cfa: spleen")); +} + +TEST_F(Parser, RA) { + EXPECT_CALL(mock_handler, RARule("notoriety")).WillOnce(Return()); + EXPECT_TRUE(parser.Parse(".ra: notoriety")); +} + +TEST_F(Parser, Reg) { + EXPECT_CALL(mock_handler, RegisterRule("nemo", "mellifluous")) + .WillOnce(Return()); + EXPECT_TRUE(parser.Parse("nemo: mellifluous")); +} + +TEST_F(Parser, CFARARegs) { + EXPECT_CALL(mock_handler, CFARule("cfa expression")).WillOnce(Return()); + EXPECT_CALL(mock_handler, RARule("ra expression")).WillOnce(Return()); + EXPECT_CALL(mock_handler, RegisterRule("galba", "praetorian")) + .WillOnce(Return()); + EXPECT_CALL(mock_handler, RegisterRule("otho", "vitellius")) + .WillOnce(Return()); + EXPECT_TRUE(parser.Parse(".cfa: cfa expression .ra: ra expression " + "galba: praetorian otho: vitellius")); +} + +TEST_F(Parser, Whitespace) { + EXPECT_CALL(mock_handler, RegisterRule("r1", "r1 expression")) + .WillOnce(Return()); + EXPECT_CALL(mock_handler, RegisterRule("r2", "r2 expression")) + .WillOnce(Return()); + EXPECT_TRUE(parser.Parse(" r1:\tr1\nexpression \tr2:\t\rr2\r\n " + "expression \n")); +} + +TEST_F(Parser, WhitespaceLoneColon) { + EXPECT_FALSE(parser.Parse(" \n:\t ")); +} + +TEST_F(Parser, EmptyName) { + EXPECT_CALL(mock_handler, RegisterRule("reg", _)) + .Times(AtMost(1)) + .WillRepeatedly(Return()); + EXPECT_FALSE(parser.Parse("reg: expr1 : expr2")); +} + +TEST_F(Parser, RuleLoneColon) { + EXPECT_CALL(mock_handler, RegisterRule("r1", "expr")) + .Times(AtMost(1)) + .WillRepeatedly(Return()); + EXPECT_FALSE(parser.Parse(" r1: expr :")); +} + +TEST_F(Parser, RegNoExprRule) { + EXPECT_CALL(mock_handler, RegisterRule("r1", "expr")) + .Times(AtMost(1)) + .WillRepeatedly(Return()); + EXPECT_FALSE(parser.Parse("r0: r1: expr")); +} + +class ParseHandlerFixture: public CFIFixture { + public: + ParseHandlerFixture() : CFIFixture(), handler(&cfi) { } + CFIFrameInfoParseHandler handler; +}; + +class ParseHandler: public ParseHandlerFixture, public Test { }; + +TEST_F(ParseHandler, CFARARule) { + handler.CFARule("reg-for-cfa"); + handler.RARule("reg-for-ra"); + registers["reg-for-cfa"] = 0x268a9a4a3821a797ULL; + registers["reg-for-ra"] = 0x6301b475b8b91c02ULL; + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(0x268a9a4a3821a797ULL, caller_registers[".cfa"]); + ASSERT_EQ(0x6301b475b8b91c02ULL, caller_registers[".ra"]); +} + +TEST_F(ParseHandler, RegisterRules) { + handler.CFARule("reg-for-cfa"); + handler.RARule("reg-for-ra"); + handler.RegisterRule("reg1", "reg-for-reg1"); + handler.RegisterRule("reg2", "reg-for-reg2"); + handler.RegisterRule("reg3", "reg3"); + registers["reg-for-cfa"] = 0x268a9a4a3821a797ULL; + registers["reg-for-ra"] = 0x6301b475b8b91c02ULL; + registers["reg-for-reg1"] = 0x06cde8e2ff062481ULL; + registers["reg-for-reg2"] = 0xff0c4f76403173e2ULL; + ASSERT_TRUE(cfi.FindCallerRegs(registers, memory, + &caller_registers)); + ASSERT_EQ(0x268a9a4a3821a797ULL, caller_registers[".cfa"]); + ASSERT_EQ(0x6301b475b8b91c02ULL, caller_registers[".ra"]); + ASSERT_EQ(0x06cde8e2ff062481ULL, caller_registers["reg1"]); + ASSERT_EQ(0xff0c4f76403173e2ULL, caller_registers["reg2"]); + ASSERT_EQ(caller_registers.end(), caller_registers.find("reg3")); +} + +struct SimpleCFIWalkerFixture { + struct RawContext { + uint64_t r0, r1, r2, r3, r4, sp, pc; + }; + enum Validity { + R0_VALID = 0x01, + R1_VALID = 0x02, + R2_VALID = 0x04, + R3_VALID = 0x08, + R4_VALID = 0x10, + SP_VALID = 0x20, + PC_VALID = 0x40 + }; + typedef SimpleCFIWalker CFIWalker; + + SimpleCFIWalkerFixture() + : walker(register_map, + sizeof(register_map) / sizeof(register_map[0])) { } + + static CFIWalker::RegisterSet register_map[7]; + CFIFrameInfo call_frame_info; + CFIWalker walker; + MockMemoryRegion memory; + RawContext callee_context, caller_context; +}; + +SimpleCFIWalkerFixture::CFIWalker::RegisterSet +SimpleCFIWalkerFixture::register_map[7] = { + { "r0", NULL, true, R0_VALID, &RawContext::r0 }, + { "r1", NULL, true, R1_VALID, &RawContext::r1 }, + { "r2", NULL, false, R2_VALID, &RawContext::r2 }, + { "r3", NULL, false, R3_VALID, &RawContext::r3 }, + { "r4", NULL, true, R4_VALID, &RawContext::r4 }, + { "sp", ".cfa", true, SP_VALID, &RawContext::sp }, + { "pc", ".ra", true, PC_VALID, &RawContext::pc }, +}; + +class SimpleWalker: public SimpleCFIWalkerFixture, public Test { }; + +TEST_F(SimpleWalker, Walk) { + // Stack_top is the current stack pointer, pointing to the lowest + // address of a frame that looks like this (all 64-bit words): + // + // sp -> saved r0 + // garbage + // return address + // cfa -> + // + // r0 has been saved on the stack. + // r1 has been saved in r2. + // r2 and r3 are not recoverable. + // r4 is not recoverable, even though it is a callee-saves register. + // Some earlier frame's unwinder must have failed to recover it. + + uint64_t stack_top = 0x83254944b20d5512ULL; + + // Saved r0. + EXPECT_CALL(memory, + GetMemoryAtAddress(stack_top, A())) + .WillRepeatedly(DoAll(SetArgumentPointee<1>(0xdc1975eba8602302ULL), + Return(true))); + // Saved return address. + EXPECT_CALL(memory, + GetMemoryAtAddress(stack_top + 16, A())) + .WillRepeatedly(DoAll(SetArgumentPointee<1>(0xba5ad6d9acce28deULL), + Return(true))); + + call_frame_info.SetCFARule("sp 24 +"); + call_frame_info.SetRARule(".cfa 8 - ^"); + call_frame_info.SetRegisterRule("r0", ".cfa 24 - ^"); + call_frame_info.SetRegisterRule("r1", "r2"); + + callee_context.r0 = 0x94e030ca79edd119ULL; + callee_context.r1 = 0x937b4d7e95ce52d9ULL; + callee_context.r2 = 0x5fe0027416b8b62aULL; // caller's r1 + // callee_context.r3 is not valid in callee. + // callee_context.r4 is not valid in callee. + callee_context.sp = stack_top; + callee_context.pc = 0x25b21b224311d280ULL; + int callee_validity = R0_VALID | R1_VALID | R2_VALID | SP_VALID | PC_VALID; + + memset(&caller_context, 0, sizeof(caller_context)); + + int caller_validity; + EXPECT_TRUE(walker.FindCallerRegisters(memory, call_frame_info, + callee_context, callee_validity, + &caller_context, &caller_validity)); + EXPECT_EQ(R0_VALID | R1_VALID | SP_VALID | PC_VALID, caller_validity); + EXPECT_EQ(0xdc1975eba8602302ULL, caller_context.r0); + EXPECT_EQ(0x5fe0027416b8b62aULL, caller_context.r1); + EXPECT_EQ(stack_top + 24, caller_context.sp); + EXPECT_EQ(0xba5ad6d9acce28deULL, caller_context.pc); +} diff --git a/src/processor/contained_range_map-inl.h b/src/processor/contained_range_map-inl.h new file mode 100644 index 0000000..e085dcb --- /dev/null +++ b/src/processor/contained_range_map-inl.h @@ -0,0 +1,214 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// contained_range_map-inl.h: Hierarchically-organized range map implementation. +// +// See contained_range_map.h for documentation. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_CONTAINED_RANGE_MAP_INL_H__ +#define PROCESSOR_CONTAINED_RANGE_MAP_INL_H__ + +#include "processor/contained_range_map.h" + +#include + +#include "processor/logging.h" + + +namespace google_breakpad { + + +template +ContainedRangeMap::~ContainedRangeMap() { + // Clear frees the children pointed to by the map, and frees the map itself. + Clear(); +} + + +template +bool ContainedRangeMap::StoreRange( + const AddressType& base, const AddressType& size, const EntryType& entry) { + AddressType high = base + size - 1; + + // Check for undersize or overflow. + if (size <= 0 || high < base) { + //TODO(nealsid) We are commenting this out in order to prevent + // excessive logging. We plan to move to better logging as this + // failure happens quite often and is expected(see comment in + // basic_source_line_resolver.cc:671). + // BPLOG(INFO) << "StoreRange failed, " << HexString(base) << "+" + // << HexString(size) << ", " << HexString(high); + return false; + } + + if (!map_) + map_ = new AddressToRangeMap(); + + MapIterator iterator_base = map_->lower_bound(base); + MapIterator iterator_high = map_->lower_bound(high); + MapIterator iterator_end = map_->end(); + + if (iterator_base == iterator_high && iterator_base != iterator_end && + base >= iterator_base->second->base_) { + // The new range is entirely within an existing child range. + + // If the new range's geometry is exactly equal to an existing child + // range's, it violates the containment rules, and an attempt to store + // it must fail. iterator_base->first contains the key, which was the + // containing child's high address. + if (!allow_equal_range_ && iterator_base->second->base_ == base && + iterator_base->first == high) { + // TODO(nealsid): See the TODO above on why this is commented out. + // BPLOG(INFO) << "StoreRange failed, identical range is already " + // "present: " << HexString(base) << "+" << + // HexString(size); + return false; + } + + // Pass the new range on to the child to attempt to store. + return iterator_base->second->StoreRange(base, size, entry); + } + + // iterator_high might refer to an irrelevant range: one whose base address + // is higher than the new range's high address. Set contains_high to true + // only if iterator_high refers to a range that is at least partially + // within the new range. + bool contains_high = iterator_high != iterator_end && + high >= iterator_high->second->base_; + + // If the new range encompasses any existing child ranges, it must do so + // fully. Partial containment isn't allowed. + if ((iterator_base != iterator_end && base > iterator_base->second->base_) || + (contains_high && high < iterator_high->first)) { + // TODO(mmentovai): Some symbol files will trip this check frequently + // on STACK lines. Too many messages will be produced. These are more + // suitable for a DEBUG channel than an INFO channel. + // BPLOG(INFO) << "StoreRange failed, new range partially contains " + // "existing range: " << HexString(base) << "+" << + // HexString(size); + return false; + } + + // When copying and erasing contained ranges, the "end" iterator needs to + // point one past the last item of the range to copy. If contains_high is + // false, the iterator's already in the right place; the increment is safe + // because contains_high can't be true if iterator_high == iterator_end. + if (contains_high) + ++iterator_high; + + // Optimization: if the iterators are equal, no child ranges would be + // moved. Create the new child range with a NULL map to conserve space + // in leaf nodes, of which there will be many. + AddressToRangeMap* child_map = NULL; + + if (iterator_base != iterator_high) { + // The children of this range that are contained by the new range must + // be transferred over to the new range. Create the new child range map + // and copy the pointers to range maps it should contain into it. + child_map = new AddressToRangeMap(iterator_base, iterator_high); + + // Remove the copied child pointers from this range's map of children. + map_->erase(iterator_base, iterator_high); + } + + // Store the new range in the map by its high address. Any children that + // the new child range contains were formerly children of this range but + // are now this range's grandchildren. Ownership of these is transferred + // to the new child range. + ContainedRangeMap* new_child = + new ContainedRangeMap(base, entry, child_map, allow_equal_range_); + + map_->insert(MapValue(high, new_child)); + return true; +} + + +template +bool ContainedRangeMap::RetrieveRange( + const AddressType& address, EntryType* entry) const { + BPLOG_IF(ERROR, !entry) << "ContainedRangeMap::RetrieveRange requires " + "|entry|"; + assert(entry); + + // If nothing was ever stored, then there's nothing to retrieve. + if (!map_) + return false; + + // Get an iterator to the child range whose high address is equal to or + // greater than the supplied address. If the supplied address is higher + // than all of the high addresses in the range, then this range does not + // contain a child at address, so return false. If the supplied address + // is lower than the base address of the child range, then it is not within + // the child range, so return false. + MapConstIterator iterator = map_->lower_bound(address); + if (iterator == map_->end() || address < iterator->second->base_) + return false; + + // The child in iterator->second contains the specified address. Find out + // if it has a more-specific descendant that also contains it. If it does, + // it will set |entry| appropriately. If not, set |entry| to the child. + if (!iterator->second->RetrieveRange(address, entry)) + *entry = iterator->second->entry_; + + return true; +} + +template +bool ContainedRangeMap::RetrieveRanges( + const AddressType& address, + std::vector& entries) const { + // If nothing was ever stored, then there's nothing to retrieve. + if (!map_) + return false; + MapIterator iterator = map_->lower_bound(address); + if (iterator == map_->end() || address < iterator->second->base_) + return false; + iterator->second->RetrieveRanges(address, entries); + entries.push_back(&iterator->second->entry_); + return true; +} + +template +void ContainedRangeMap::Clear() { + if (map_) { + MapConstIterator end = map_->end(); + for (MapConstIterator child = map_->begin(); child != end; ++child) + delete child->second; + + delete map_; + map_ = NULL; + } +} + + +} // namespace google_breakpad + + +#endif // PROCESSOR_CONTAINED_RANGE_MAP_INL_H__ diff --git a/src/processor/contained_range_map.h b/src/processor/contained_range_map.h new file mode 100644 index 0000000..24a3bb4 --- /dev/null +++ b/src/processor/contained_range_map.h @@ -0,0 +1,167 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// contained_range_map.h: Hierarchically-organized range maps. +// +// A contained range map is similar to a standard range map, except it allows +// objects to be organized hierarchically. A contained range map allows +// objects to contain other objects. It is not sensitive to the order that +// objects are added to the map: larger, more general, containing objects +// may be added either before or after smaller, more specific, contained +// ones. +// +// Contained range maps guarantee that each object may only contain smaller +// objects than itself, and that a parent object may only contain child +// objects located entirely within the parent's address space. Attempts +// to introduce objects (via StoreRange) that violate these rules will fail. +// Retrieval (via RetrieveRange) always returns the most specific (smallest) +// object that contains the address being queried. Note that while it is +// not possible to insert two objects into a map that have exactly the same +// geometry (base address and size), it is possible to completely mask a +// larger object by inserting smaller objects that entirely fill the larger +// object's address space. +// +// Internally, contained range maps are implemented as a tree. Each tree +// node except for the root node describes an object in the map. Each node +// maintains its list of children in a map similar to a standard range map, +// keyed by the highest address that each child occupies. Each node's +// children occupy address ranges entirely within the node. The root node +// is the only node directly accessible to the user, and represents the +// entire address space. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_CONTAINED_RANGE_MAP_H__ +#define PROCESSOR_CONTAINED_RANGE_MAP_H__ + + +#include +#include + + +namespace google_breakpad { + +// Forward declarations (for later friend declarations of specialized template). +template class ContainedRangeMapSerializer; + +template +class ContainedRangeMap { + public: + // The default constructor creates a ContainedRangeMap with no geometry + // and no entry, and as such is only suitable for the root node of a + // ContainedRangeMap tree. + explicit ContainedRangeMap(bool allow_equal_range = false) + : base_(), entry_(), map_(NULL), allow_equal_range_(allow_equal_range) {} + + ~ContainedRangeMap(); + + // Inserts a range into the map. If the new range is encompassed by + // an existing child range, the new range is passed into the child range's + // StoreRange method. If the new range encompasses any existing child + // ranges, those child ranges are moved to the new range, becoming + // grandchildren of this ContainedRangeMap. Returns false for a + // parameter error, or if the ContainedRangeMap hierarchy guarantees + // would be violated. + bool StoreRange(const AddressType& base, + const AddressType& size, + const EntryType& entry); + + // Retrieves the most specific (smallest) descendant range encompassing + // the specified address. This method will only return entries held by + // child ranges, and not the entry contained by |this|. This is necessary + // to support a sparsely-populated root range. If no descendant range + // encompasses the address, returns false. + bool RetrieveRange(const AddressType& address, EntryType* entries) const; + + // Retrieves the vector of entries encompassing the specified address from the + // innermost entry to the outermost entry. + bool RetrieveRanges(const AddressType& address, + std::vector& entries) const; + + // Removes all children. Note that Clear only removes descendants, + // leaving the node on which it is called intact. Because the only + // meaningful things contained by a root node are descendants, this + // is sufficient to restore an entire ContainedRangeMap to its initial + // empty state when called on the root node. + void Clear(); + + private: + friend class ContainedRangeMapSerializer; + friend class ModuleComparer; + + // AddressToRangeMap stores pointers. This makes reparenting simpler in + // StoreRange, because it doesn't need to copy entire objects. + typedef std::map AddressToRangeMap; + typedef typename AddressToRangeMap::const_iterator MapConstIterator; + typedef typename AddressToRangeMap::iterator MapIterator; + typedef typename AddressToRangeMap::value_type MapValue; + + // Creates a new ContainedRangeMap with the specified base address, entry, + // and initial child map, which may be NULL. This is only used internally + // by ContainedRangeMap when it creates a new child. + ContainedRangeMap(const AddressType& base, + const EntryType& entry, + AddressToRangeMap* map, + bool allow_equal_range) + : base_(base), + entry_(entry), + map_(map), + allow_equal_range_(allow_equal_range) {} + + // The base address of this range. The high address does not need to + // be stored, because it is used as the key to an object in its parent's + // map, and all ContainedRangeMaps except for the root range are contained + // within maps. The root range does not actually contain an entry, so its + // base_ field is meaningless, and the fact that it has no parent and thus + // no key is unimportant. For this reason, the base_ field should only be + // is accessed on child ContainedRangeMap objects, and never on |this|. + const AddressType base_; + + // The entry corresponding to this range. The root range does not + // actually contain an entry, so its entry_ field is meaningless. For + // this reason, the entry_ field should only be accessed on child + // ContainedRangeMap objects, and never on |this|. + const EntryType entry_; + + // The map containing child ranges, keyed by each child range's high + // address. This is a pointer to avoid allocating map structures for + // leaf nodes, where they are not needed. + AddressToRangeMap* map_; + + // Whether or not we allow storing an entry into a range that equals to + // existing range in the map. Default is false. + // If this is true, the newly added range will become a child of existing + // innermost range which has same base and size. + bool allow_equal_range_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_CONTAINED_RANGE_MAP_H__ diff --git a/src/processor/contained_range_map_unittest.cc b/src/processor/contained_range_map_unittest.cc new file mode 100644 index 0000000..1d681fd --- /dev/null +++ b/src/processor/contained_range_map_unittest.cc @@ -0,0 +1,383 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// contained_range_map_unittest.cc: Unit tests for ContainedRangeMap +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "processor/contained_range_map-inl.h" + +#include "processor/logging.h" + + +#define ASSERT_TRUE(condition) \ + if (!(condition)) { \ + fprintf(stderr, "FAIL: %s @ %s:%d\n", #condition, __FILE__, __LINE__); \ + return false; \ + } + +#define ASSERT_FALSE(condition) ASSERT_TRUE(!(condition)) + + +namespace { + + +using google_breakpad::ContainedRangeMap; +// The first is the querying address, the second is the entries vector result. +using EntriesTestPair = std::pair>; +using EntriesTestPairVec = std::vector; + +static bool RunTestsWithRetrieveRange( + const ContainedRangeMap& crm, + const int* test_data, + unsigned int test_length) { + // Now, do the RetrieveRange tests. This further validates that the + // objects were stored properly and that retrieval returns the correct + // object. + // If GENERATE_TEST_DATA is defined, instead of the retrieval tests, a + // new test_data array will be printed. Exercise caution when doing this. + // Be sure to verify the results manually! +#ifdef GENERATE_TEST_DATA + printf(" const int test_data[] = {\n"); +#endif // GENERATE_TEST_DATA + + for (unsigned int address = 0; address < test_length; ++address) { + int value; + if (!crm.RetrieveRange(address, &value)) + value = 0; + +#ifndef GENERATE_TEST_DATA + // Don't use ASSERT inside the loop because it won't show the failed + // |address|, and the line number will always be the same. That makes + // it difficult to figure out which test failed. + if (value != test_data[address]) { + fprintf(stderr, "FAIL: retrieve %d expected %d observed %d @ %s:%d\n", + address, test_data[address], value, __FILE__, __LINE__); + return false; + } +#else // !GENERATE_TEST_DATA + printf(" %d%c%s // %d\n", value, address == test_high - 1 ? ' ' : ',', + value < 10 ? " " : "", address); +#endif // !GENERATE_TEST_DATA + } + +#ifdef GENERATE_TEST_DATA + printf(" };\n"); +#endif // GENERATE_TEST_DATA + + return true; +} + +static bool RunTestsWithRetrieveRangeVector( + const ContainedRangeMap& crm, + const EntriesTestPairVec& entries_tests) { + for (const EntriesTestPair& entries_test : entries_tests) { + std::vector entries; + crm.RetrieveRanges(entries_test.first, entries); + if (entries.size() != entries_test.second.size()) { + fprintf(stderr, + "FAIL: retrieving entries at address %u has size %zu " + "expected to have size %zu " + "@ %s: %d\n", + entries_test.first, entries.size(), entries_test.second.size(), + __FILE__, __LINE__); + return false; + } + for (size_t i = 0; i < entries.size(); ++i) { + if (*entries[i] != entries_test.second[i]) { + fprintf(stderr, + "FAIL: retrieving entries at address %u entries[%zu] is %d " + "expected %d" + "@ %s: %d\n", + entries_test.first, i, *entries[i], entries_test.second[i], + __FILE__, __LINE__); + return false; + } + } + } + return true; +} + +static bool RunTestsWithNoEqualRange() { + ContainedRangeMap crm; + + // First, do the StoreRange tests. This validates the containment + // rules. + ASSERT_TRUE (crm.StoreRange(10, 10, 1)); + ASSERT_FALSE(crm.StoreRange(10, 10, 2)); // exactly equal to 1 + ASSERT_FALSE(crm.StoreRange(11, 10, 3)); // begins inside 1 and extends up + ASSERT_FALSE(crm.StoreRange( 9, 10, 4)); // begins below 1 and ends inside + ASSERT_TRUE (crm.StoreRange(11, 9, 5)); // contained by existing + ASSERT_TRUE (crm.StoreRange(12, 7, 6)); + ASSERT_TRUE (crm.StoreRange( 9, 12, 7)); // contains existing + ASSERT_TRUE (crm.StoreRange( 9, 13, 8)); + ASSERT_TRUE (crm.StoreRange( 8, 14, 9)); + ASSERT_TRUE (crm.StoreRange(30, 3, 10)); + ASSERT_TRUE (crm.StoreRange(33, 3, 11)); + ASSERT_TRUE (crm.StoreRange(30, 6, 12)); // storable but totally masked + ASSERT_TRUE (crm.StoreRange(40, 8, 13)); // will be totally masked + ASSERT_TRUE (crm.StoreRange(40, 4, 14)); + ASSERT_TRUE (crm.StoreRange(44, 4, 15)); + ASSERT_FALSE(crm.StoreRange(32, 10, 16)); // begins in #10, ends in #14 + ASSERT_FALSE(crm.StoreRange(50, 0, 17)); // zero length + ASSERT_TRUE (crm.StoreRange(50, 10, 18)); + ASSERT_TRUE (crm.StoreRange(50, 1, 19)); + ASSERT_TRUE (crm.StoreRange(59, 1, 20)); + ASSERT_TRUE (crm.StoreRange(60, 1, 21)); + ASSERT_TRUE (crm.StoreRange(69, 1, 22)); + ASSERT_TRUE (crm.StoreRange(60, 10, 23)); + ASSERT_TRUE (crm.StoreRange(68, 1, 24)); + ASSERT_TRUE (crm.StoreRange(61, 1, 25)); + ASSERT_TRUE (crm.StoreRange(61, 8, 26)); + ASSERT_FALSE(crm.StoreRange(59, 9, 27)); + ASSERT_FALSE(crm.StoreRange(59, 10, 28)); + ASSERT_FALSE(crm.StoreRange(59, 11, 29)); + ASSERT_TRUE (crm.StoreRange(70, 10, 30)); + ASSERT_TRUE (crm.StoreRange(74, 2, 31)); + ASSERT_TRUE (crm.StoreRange(77, 2, 32)); + ASSERT_FALSE(crm.StoreRange(72, 6, 33)); + ASSERT_TRUE (crm.StoreRange(80, 3, 34)); + ASSERT_TRUE (crm.StoreRange(81, 1, 35)); + ASSERT_TRUE (crm.StoreRange(82, 1, 36)); + ASSERT_TRUE (crm.StoreRange(83, 3, 37)); + ASSERT_TRUE (crm.StoreRange(84, 1, 38)); + ASSERT_TRUE (crm.StoreRange(83, 1, 39)); + ASSERT_TRUE (crm.StoreRange(86, 5, 40)); + ASSERT_TRUE (crm.StoreRange(88, 1, 41)); + ASSERT_TRUE (crm.StoreRange(90, 1, 42)); + ASSERT_TRUE (crm.StoreRange(86, 1, 43)); + ASSERT_TRUE (crm.StoreRange(87, 1, 44)); + ASSERT_TRUE (crm.StoreRange(89, 1, 45)); + ASSERT_TRUE (crm.StoreRange(87, 4, 46)); + ASSERT_TRUE (crm.StoreRange(87, 3, 47)); + ASSERT_FALSE(crm.StoreRange(86, 2, 48)); + + // Each element in test_data contains the expected result when calling + // RetrieveRange on an address. + const int test_data[] = { + 0, // 0 + 0, // 1 + 0, // 2 + 0, // 3 + 0, // 4 + 0, // 5 + 0, // 6 + 0, // 7 + 9, // 8 + 7, // 9 + 1, // 10 + 5, // 11 + 6, // 12 + 6, // 13 + 6, // 14 + 6, // 15 + 6, // 16 + 6, // 17 + 6, // 18 + 5, // 19 + 7, // 20 + 8, // 21 + 0, // 22 + 0, // 23 + 0, // 24 + 0, // 25 + 0, // 26 + 0, // 27 + 0, // 28 + 0, // 29 + 10, // 30 + 10, // 31 + 10, // 32 + 11, // 33 + 11, // 34 + 11, // 35 + 0, // 36 + 0, // 37 + 0, // 38 + 0, // 39 + 14, // 40 + 14, // 41 + 14, // 42 + 14, // 43 + 15, // 44 + 15, // 45 + 15, // 46 + 15, // 47 + 0, // 48 + 0, // 49 + 19, // 50 + 18, // 51 + 18, // 52 + 18, // 53 + 18, // 54 + 18, // 55 + 18, // 56 + 18, // 57 + 18, // 58 + 20, // 59 + 21, // 60 + 25, // 61 + 26, // 62 + 26, // 63 + 26, // 64 + 26, // 65 + 26, // 66 + 26, // 67 + 24, // 68 + 22, // 69 + 30, // 70 + 30, // 71 + 30, // 72 + 30, // 73 + 31, // 74 + 31, // 75 + 30, // 76 + 32, // 77 + 32, // 78 + 30, // 79 + 34, // 80 + 35, // 81 + 36, // 82 + 39, // 83 + 38, // 84 + 37, // 85 + 43, // 86 + 44, // 87 + 41, // 88 + 45, // 89 + 42, // 90 + 0, // 91 + 0, // 92 + 0, // 93 + 0, // 94 + 0, // 95 + 0, // 96 + 0, // 97 + 0, // 98 + 0 // 99 + }; + unsigned int test_length = sizeof(test_data) / sizeof(int); + return RunTestsWithRetrieveRange(crm, test_data, test_length); +} + +static bool RunTestsWithEqualRange() { + ContainedRangeMap crm(true); + + // First, do the StoreRange tests. This validates the containment + // rules. + ASSERT_TRUE (crm.StoreRange(1, 3, 1)); + ASSERT_TRUE (crm.StoreRange(1, 3, 2)); // exactly equal to 1 + ASSERT_TRUE (crm.StoreRange(1, 3, 3)); // exactly equal to 1, 2 + ASSERT_TRUE (crm.StoreRange(1, 3, 4)); // exactly equal to 1, 2, 3 + ASSERT_FALSE(crm.StoreRange(0, 3, 5)); // partial overlap. + ASSERT_FALSE(crm.StoreRange(2, 3, 6)); // partial overlap. + + ASSERT_TRUE (crm.StoreRange(5, 3, 7)); + ASSERT_TRUE (crm.StoreRange(5, 3, 8)); // exactly equal to 7 + ASSERT_TRUE (crm.StoreRange(5, 3, 9)); // exactly equal to 7, 8 + ASSERT_TRUE (crm.StoreRange(5, 4, 10)); // encompasses 7, 8, 9 + ASSERT_TRUE (crm.StoreRange(5, 5, 11)); // encompasses 7, 8, 9, 10 + + ASSERT_TRUE (crm.StoreRange(10, 3, 12)); + ASSERT_TRUE (crm.StoreRange(10, 3, 13)); // exactly equal to 12 + ASSERT_TRUE (crm.StoreRange(11, 2, 14)); // encompasses by 12 + ASSERT_TRUE (crm.StoreRange(11, 1, 15)); // encompasses by 12, 13 + + ASSERT_TRUE (crm.StoreRange(14, 3, 16)); + ASSERT_TRUE (crm.StoreRange(14, 3, 17)); // exactly equal to 14 + ASSERT_TRUE (crm.StoreRange(14, 1, 18)); // encompasses by 14, 15 + ASSERT_TRUE (crm.StoreRange(14, 2, 19)); // encompasses by 14, 15 and encompasses 16 + ASSERT_TRUE (crm.StoreRange(14, 1, 20)); // exactly equal to 18 + ASSERT_TRUE (crm.StoreRange(14, 2, 21)); // exactly equal to 19 + + // Each element in test_data contains the expected result when calling + // RetrieveRange on an address. + const int test_data[] = { + 0, // 0 + 4, // 1 + 4, // 2 + 4, // 3 + 0, // 4 + 9, // 5 + 9, // 6 + 9, // 7 + 10, // 8 + 11, // 9 + 13, // 10 + 15, // 11 + 14, // 12 + 0, // 13 + 20, // 14 + 21, // 15 + 17, // 16 + 0, // 17 + }; + unsigned int test_length = sizeof(test_data) / sizeof(int); + EntriesTestPairVec entries_tests = { + {0, {}}, + {1, {4, 3, 2, 1}}, + {2, {4, 3, 2, 1}}, + {3, {4, 3, 2, 1}}, + {4, {}}, + {5, {9, 8, 7, 10, 11}}, + {6, {9, 8, 7, 10, 11}}, + {7, {9, 8, 7, 10, 11}}, + {8, {10, 11}}, + {9, {11}}, + {10, {13, 12}}, + {11, {15, 14, 13, 12}}, + {12, {14, 13, 12}}, + {13, {}}, + {14, {20, 18, 21, 19, 17, 16}}, + {15, {21, 19, 17, 16}}, + {16, {17, 16}}, + {17, {}}, + }; + return RunTestsWithRetrieveRange(crm, test_data, test_length) && + RunTestsWithRetrieveRangeVector(crm, entries_tests); +} + +static bool RunTests() { + return RunTestsWithNoEqualRange() && RunTestsWithEqualRange(); +} + + +} // namespace + + +int main(int argc, char** argv) { + BPLOG_INIT(&argc, &argv); + + return RunTests() ? 0 : 1; +} diff --git a/src/processor/convert_old_arm64_context.cc b/src/processor/convert_old_arm64_context.cc new file mode 100644 index 0000000..768475b --- /dev/null +++ b/src/processor/convert_old_arm64_context.cc @@ -0,0 +1,70 @@ +// Copyright 2018 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/convert_old_arm64_context.h" + +#include + +namespace google_breakpad { + +void ConvertOldARM64Context(const MDRawContextARM64_Old& old, + MDRawContextARM64* context) { + context->context_flags = MD_CONTEXT_ARM64; + if (old.context_flags & MD_CONTEXT_ARM64_INTEGER_OLD) { + context->context_flags |= + MD_CONTEXT_ARM64_INTEGER | MD_CONTEXT_ARM64_CONTROL; + } + if (old.context_flags & MD_CONTEXT_ARM64_FLOATING_POINT_OLD) { + context->context_flags |= MD_CONTEXT_ARM64_FLOATING_POINT; + } + + context->cpsr = old.cpsr; + + static_assert(sizeof(old.iregs) == sizeof(context->iregs), + "iregs size mismatch"); + memcpy(context->iregs, old.iregs, sizeof(context->iregs)); + + static_assert(sizeof(old.float_save.regs) == sizeof(context->float_save.regs), + "float_save.regs size mismatch"); + memcpy(context->float_save.regs, + old.float_save.regs, + sizeof(context->float_save.regs)); + context->float_save.fpcr = old.float_save.fpcr; + context->float_save.fpsr = old.float_save.fpsr; + + memset(context->bcr, 0, sizeof(context->bcr)); + memset(context->bvr, 0, sizeof(context->bvr)); + memset(context->wcr, 0, sizeof(context->wcr)); + memset(context->wvr, 0, sizeof(context->wvr)); +} + +} // namespace google_breakpad diff --git a/src/processor/convert_old_arm64_context.h b/src/processor/convert_old_arm64_context.h new file mode 100644 index 0000000..241b925 --- /dev/null +++ b/src/processor/convert_old_arm64_context.h @@ -0,0 +1,41 @@ +// Copyright 2018 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef PROCESSOR_CONVERT_OLD_ARM64_CONTEXT_H__ +#define PROCESSOR_CONVERT_OLD_ARM64_CONTEXT_H__ + +#include "google_breakpad/common/minidump_cpu_arm64.h" + +namespace google_breakpad { + +void ConvertOldARM64Context(const MDRawContextARM64_Old& old, + MDRawContextARM64* context); + +} // namespace google_breakpad + +#endif // PROCESSOR_CONVERT_OLD_ARM64_CONTEXT_H__ diff --git a/src/processor/disassembler_objdump.cc b/src/processor/disassembler_objdump.cc new file mode 100644 index 0000000..9f9569a --- /dev/null +++ b/src/processor/disassembler_objdump.cc @@ -0,0 +1,487 @@ +// Copyright (c) 2022, Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// disassembler_objdump.: Disassembler that invokes objdump for disassembly. +// +// Author: Mark Brand + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/disassembler_objdump.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "common/linux/eintr_wrapper.h" +#include "common/linux/scoped_pipe.h" +#include "common/linux/scoped_tmpfile.h" +#include "processor/logging.h" + +namespace google_breakpad { +namespace { + +const size_t kMaxX86InstructionLength = 15; + +bool IsInstructionPrefix(const string& token) { + if (token == "lock" || token == "rep" || token == "repz" || + token == "repnz") { + return true; + } + return false; +} + +bool IsOperandSize(const string& token) { + if (token == "BYTE" || token == "WORD" || token == "DWORD" || + token == "QWORD" || token == "PTR") { + return true; + } + return false; +} + +bool GetSegmentAddressX86(const DumpContext& context, string segment_name, + uint64_t& address) { + if (segment_name == "ds") { + address = context.GetContextX86()->ds; + } else if (segment_name == "es") { + address = context.GetContextX86()->es; + } else if (segment_name == "fs") { + address = context.GetContextX86()->fs; + } else if (segment_name == "gs") { + address = context.GetContextX86()->gs; + } else { + BPLOG(ERROR) << "Unsupported segment register: " << segment_name; + return false; + } + + return true; +} + +bool GetSegmentAddressAMD64(const DumpContext& context, string segment_name, + uint64_t& address) { + if (segment_name == "ds") { + address = 0; + } else if (segment_name == "es") { + address = 0; + } else { + BPLOG(ERROR) << "Unsupported segment register: " << segment_name; + return false; + } + + return true; +} + +bool GetSegmentAddress(const DumpContext& context, string segment_name, + uint64_t& address) { + if (context.GetContextCPU() == MD_CONTEXT_X86) { + return GetSegmentAddressX86(context, segment_name, address); + } else if (context.GetContextCPU() == MD_CONTEXT_AMD64) { + return GetSegmentAddressAMD64(context, segment_name, address); + } else { + BPLOG(ERROR) << "Unsupported architecture for GetSegmentAddress\n"; + return false; + } +} + +bool GetRegisterValueX86(const DumpContext& context, string register_name, + uint64_t& value) { + if (register_name == "eax") { + value = context.GetContextX86()->eax; + } else if (register_name == "ebx") { + value = context.GetContextX86()->ebx; + } else if (register_name == "ecx") { + value = context.GetContextX86()->ecx; + } else if (register_name == "edx") { + value = context.GetContextX86()->edx; + } else if (register_name == "edi") { + value = context.GetContextX86()->edi; + } else if (register_name == "esi") { + value = context.GetContextX86()->esi; + } else if (register_name == "ebp") { + value = context.GetContextX86()->ebp; + } else if (register_name == "esp") { + value = context.GetContextX86()->esp; + } else if (register_name == "eip") { + value = context.GetContextX86()->eip; + } else { + BPLOG(ERROR) << "Unsupported register: " << register_name; + return false; + } + + return true; +} + +bool GetRegisterValueAMD64(const DumpContext& context, string register_name, + uint64_t& value) { + if (register_name == "rax") { + value = context.GetContextAMD64()->rax; + } else if (register_name == "rbx") { + value = context.GetContextAMD64()->rbx; + } else if (register_name == "rcx") { + value = context.GetContextAMD64()->rcx; + } else if (register_name == "rdx") { + value = context.GetContextAMD64()->rdx; + } else if (register_name == "rdi") { + value = context.GetContextAMD64()->rdi; + } else if (register_name == "rsi") { + value = context.GetContextAMD64()->rsi; + } else if (register_name == "rbp") { + value = context.GetContextAMD64()->rbp; + } else if (register_name == "rsp") { + value = context.GetContextAMD64()->rsp; + } else if (register_name == "r8") { + value = context.GetContextAMD64()->r8; + } else if (register_name == "r9") { + value = context.GetContextAMD64()->r9; + } else if (register_name == "r10") { + value = context.GetContextAMD64()->r10; + } else if (register_name == "r11") { + value = context.GetContextAMD64()->r11; + } else if (register_name == "r12") { + value = context.GetContextAMD64()->r12; + } else if (register_name == "r13") { + value = context.GetContextAMD64()->r13; + } else if (register_name == "r14") { + value = context.GetContextAMD64()->r14; + } else if (register_name == "r15") { + value = context.GetContextAMD64()->r15; + } else if (register_name == "rip") { + value = context.GetContextAMD64()->rip; + } else { + BPLOG(ERROR) << "Unsupported register: " << register_name; + return false; + } + + return true; +} + +// Lookup the value of `register_name` in `context`, store it into `value` on +// success. +// Support for non-full-size registers not implemented, since we're only using +// this to evaluate address expressions. +bool GetRegisterValue(const DumpContext& context, string register_name, + uint64_t& value) { + if (context.GetContextCPU() == MD_CONTEXT_X86) { + return GetRegisterValueX86(context, register_name, value); + } else if (context.GetContextCPU() == MD_CONTEXT_AMD64) { + return GetRegisterValueAMD64(context, register_name, value); + } else { + BPLOG(ERROR) << "Unsupported architecture for GetRegisterValue\n"; + return false; + } +} +} // namespace + +// static +bool DisassemblerObjdump::DisassembleInstruction(uint32_t cpu, + const uint8_t* raw_bytes, + unsigned int raw_bytes_len, + string& instruction) { + // Always initialize outputs + instruction = ""; + + if (!raw_bytes || raw_bytes_len == 0) { + // There's no need to perform any operation in this case, as there's + // clearly no instruction there. + return false; + } + + string architecture; + if (cpu == MD_CONTEXT_X86) { + architecture = "i386"; + } else if (cpu == MD_CONTEXT_AMD64) { + architecture = "i386:x86-64"; + } else { + BPLOG(ERROR) << "Unsupported architecture."; + return false; + } + + // Create a temporary file for the raw instruction bytes to pass to + // objdump, and write the bytes to the input file. + ScopedTmpFile raw_bytes_file; + if (!raw_bytes_file.InitData(raw_bytes, raw_bytes_len)) { + BPLOG(ERROR) << "Failed creating temporary file."; + return false; + } + + // Create a pipe to use to read the disassembly back from objdump. + ScopedPipe disassembly_pipe; + if (!disassembly_pipe.Init()) { + BPLOG(ERROR) << "Failed creating pipe for output."; + return false; + } + + pid_t child_pid = fork(); + if (child_pid < 0) { + BPLOG(ERROR) << "Fork failed."; + return false; + } + + if (child_pid == 0) { + // In the child process, set up the input and output file descriptors. + if (dup2(raw_bytes_file.GetFd(), STDIN_FILENO) < 0 || + disassembly_pipe.Dup2WriteFd(STDOUT_FILENO) < 0 || + disassembly_pipe.Dup2WriteFd(STDERR_FILENO) < 0) { + BPLOG(ERROR) << "Failed dup'ing file descriptors."; + exit(-1); + } + + // We need to close the read end of the pipe in the child process so that + // when the parent closes it, the pipe is disconnected. + disassembly_pipe.CloseReadFd(); + + // We use "/proc/self/fd/0" here to allow objdump to parse an unnamed file, + // since objdump does not have a mode to read from stdin. This cannot be + // used with a pipe, since objdump requires that the input is a standard + // file. + execlp("objdump", "objdump", "-D", "--no-show-raw-insn", "-b", "binary", + "-M", "intel", "-m", architecture.c_str(), "/proc/self/fd/0", + nullptr); + + BPLOG(ERROR) << "Failed to exec objdump."; + exit(-1); + } else { + // In the parent process, parse the objdump output. + + // Match the instruction line, from: + // 0: lock cmpxchg DWORD PTR [esi+0x10],eax + // extract the string "lock cmpxchg DWORD PTR [esi+0x10],eax" + std::regex instruction_regex( + "^\\s+[0-9a-f]+:\\s+" // " 0:" + "((?:\\s*\\S*)+)$"); // "lock cmpxchg..." + + std::string line; + std::smatch match; + while (disassembly_pipe.ReadLine(line)) { + if (std::regex_match(line, match, instruction_regex)) { + instruction = match[1].str(); + break; + } + } + + // Close the read pipe so that objdump will exit (in case we broke out of + // the loop above before reading all of the output). + disassembly_pipe.CloseReadFd(); + + // Now wait for objdump to exit. + int status = 0; + HANDLE_EINTR(waitpid(child_pid, &status, 0)); + + if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { + BPLOG(ERROR) << "objdump didn't run successfully."; + return false; + } + + if (instruction == "") { + BPLOG(ERROR) << "Failed to find instruction in objdump output."; + return false; + } + } + + return true; +} + +// static +bool DisassemblerObjdump::TokenizeInstruction(const string& instruction, + string& operation, string& dest, + string& src) { + // Always initialize outputs. + operation = ""; + dest = ""; + src = ""; + + // Split the instruction into tokens by either whitespace or comma. + std::regex token_regex("((?:[^\\s,]+)|,)(?:\\s)*"); + std::sregex_iterator tokens_begin(instruction.begin(), instruction.end(), + token_regex); + + bool found_comma = false; + for (auto tokens_iter = tokens_begin; tokens_iter != std::sregex_iterator(); + ++tokens_iter) { + auto token = (*tokens_iter)[1].str(); + if (operation.size() == 0) { + if (IsInstructionPrefix(token)) + continue; + operation = token; + } else if (dest.size() == 0) { + if (IsOperandSize(token)) + continue; + dest = token; + } else if (!found_comma) { + if (token == ",") { + found_comma = true; + } else { + BPLOG(ERROR) << "Failed to parse operands from objdump output, expected" + " comma but found \"" + << token << "\""; + return false; + } + } else if (src.size() == 0) { + if (IsOperandSize(token)) + continue; + src = token; + } else { + if (token == ",") { + BPLOG(ERROR) << "Failed to parse operands from objdump output, found " + "unexpected comma after last operand."; + return false; + } else { + // We just ignore other junk after the last operand unless it's a + // comma, which would indicate we're probably still in the middle + // of the operands and something has gone wrong + } + } + } + + if (found_comma && src.size() == 0) { + BPLOG(ERROR) << "Failed to parse operands from objdump output, found comma " + "but no src operand."; + return false; + } + + return true; +} + +// static +bool DisassemblerObjdump::CalculateAddress(const DumpContext& context, + const string& expression, + uint64_t& address) { + address = 0; + + // Extract the components of the expression. + // fs:[esi+edi*4+0x80] -> ["fs", "esi", "edi", "4", "-", "0x80"] + std::regex expression_regex( + "^(?:(\\ws):)?" // "fs:" + "\\[(\\w+)" // "[esi" + "(?:\\+(\\w+)(?:\\*(\\d+)))?" // "+edi*4" + "(?:([\\+-])(0x[0-9a-f]+))?" // "-0x80" + "\\]$"); // "]" + + std::smatch match; + if (!std::regex_match(expression, match, expression_regex) || + match.size() != 7) { + return false; + } + + string segment_name = match[1].str(); + string register_name = match[2].str(); + string index_name = match[3].str(); + string index_stride = match[4].str(); + string offset_sign = match[5].str(); + string offset = match[6].str(); + + uint64_t segment_address = 0; + uint64_t register_value = 0; + uint64_t index_value = 0; + uint64_t index_stride_value = 1; + uint64_t offset_value = 0; + + if (segment_name.size() && + !GetSegmentAddress(context, segment_name, segment_address)) { + return false; + } + + if (!GetRegisterValue(context, register_name, register_value)) { + return false; + } + + if (index_name.size() && + !GetRegisterValue(context, index_name, index_value)) { + return false; + } + + if (index_stride.size()) { + index_stride_value = strtoull(index_stride.c_str(), nullptr, 0); + } + + if (offset.size()) { + offset_value = strtoull(offset.c_str(), nullptr, 0); + } + + address = + segment_address + register_value + (index_value * index_stride_value); + if (offset_sign == "+") { + address += offset_value; + } else if (offset_sign == "-") { + address -= offset_value; + } + + return true; +} + +DisassemblerObjdump::DisassemblerObjdump(const uint32_t cpu, + const MemoryRegion* memory_region, + uint64_t address) { + if (address < memory_region->GetBase() || + memory_region->GetBase() + memory_region->GetSize() <= address) { + return; + } + + uint8_t ip_bytes[kMaxX86InstructionLength] = {0}; + size_t ip_bytes_length; + for (ip_bytes_length = 0; ip_bytes_length < kMaxX86InstructionLength; + ++ip_bytes_length) { + // We have to read byte-by-byte here, since we still want to try and + // disassemble an instruction even if we don't have enough bytes. + if (!memory_region->GetMemoryAtAddress(address + ip_bytes_length, + &ip_bytes[ip_bytes_length])) { + break; + } + } + + string instruction; + if (!DisassembleInstruction(cpu, ip_bytes, kMaxX86InstructionLength, + instruction)) { + return; + } + + if (!TokenizeInstruction(instruction, operation_, dest_, src_)) { + return; + } +} + +bool DisassemblerObjdump::CalculateSrcAddress(const DumpContext& context, + uint64_t& address) { + return CalculateAddress(context, src_, address); +} + +bool DisassemblerObjdump::CalculateDestAddress(const DumpContext& context, + uint64_t& address) { + return CalculateAddress(context, dest_, address); +} + +} // namespace google_breakpad \ No newline at end of file diff --git a/src/processor/disassembler_objdump.h b/src/processor/disassembler_objdump.h new file mode 100644 index 0000000..7db1e11 --- /dev/null +++ b/src/processor/disassembler_objdump.h @@ -0,0 +1,142 @@ +// Copyright (c) 2022, Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// disassembler_objdump.h: Disassembler that invokes objdump for disassembly. +// +// Author: Mark Brand + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_DISASSEMBLER_OBJDUMP_H_ +#define GOOGLE_BREAKPAD_PROCESSOR_DISASSEMBLER_OBJDUMP_H_ + +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/dump_context.h" +#include "google_breakpad/processor/memory_region.h" + +namespace google_breakpad { + +// Uses objdump to disassemble a single instruction. +// +// Currently supports disassembly for x86 and x86_64 on linux hosts only; on +// unsupported platform or for unsupported architectures disassembly will fail. +// +// If disassembly is successful, then this allows extracting the instruction +// opcode, source and destination operands, and computing the source and +// destination addresses for instructions that operate on memory. +// +// Example: +// DisassemblerObjdump disassembler(context->GetContextCPU(), memory_region, +// instruction_ptr); +// if (disassembler.IsValid()) { +// uint64_t src_address = 0; +// std::cerr << disassembler.operation() << " " << disassembler.src() +// << ", " << disassembler.dest() << std::endl; +// if (disassembler.CalculateSrcAddress(*context, src_address)) { +// std::cerr << "[src_address = " << std::hex << src_address << "]\n"; +// } +// } +class DisassemblerObjdump { + public: + // Construct an ObjdumpDisassembler for the provided `cpu` type, where this is + // one of MD_CONTEXT_X86 or MD_CONTEXT_AMD64. Provided that `address` is + // within `memory_region`, and the memory referenced is a valid instruction, + // this will then be initialized with the disassembly for that instruction. + DisassemblerObjdump(uint32_t cpu, + const MemoryRegion* memory_region, + uint64_t address); + ~DisassemblerObjdump() = default; + + // If the source operand of the instruction is a memory operand, compute the + // address referred to by the operand, and store this in `address`. On success + // returns true, otherwise (if computation fails, or if the source operand is + // not a memory operand) returns false and sets `address` to 0. + bool CalculateSrcAddress(const DumpContext& context, uint64_t& address); + + // If the destination operand of the instruction is a memory operand, compute + // the address referred to by the operand, and store this in `address`. On + // success returns true, otherwise (if computation fails, or if the source + // operand is not a memory operand) returns false and sets `address` to 0. + bool CalculateDestAddress(const DumpContext& context, uint64_t& address); + + // If the instruction was disassembled successfully, this will be true. + bool IsValid() const { return operation_.size() != 0; } + + // Returns the operation part of the disassembly, without any prefixes: + // "pop" eax + // lock "xchg" eax, edx + const string& operation() const { return operation_; } + + // Returns the destination operand of the disassembly, without memory operand + // size prefixes: + // mov DWORD PTR "[rax + 16]", edx + const string& dest() const { return dest_; } + + // Returns the source operand of the disassembly, without memory operand + // size prefixes: + // mov rax, QWORD PTR "[rdx]" + const string& src() const { return src_; } + + private: + friend class DisassemblerObjdumpForTest; + + // Writes out the provided `raw_bytes` to a temporary file, and executes objdump + // to disassemble according to `cpu`, which must be either MD_CONTEXT_X86 or + // MD_CONTEXT_AMD64. Once objdump has completed, parses out the instruction + // string from the first instruction in the output and stores it in + // `instruction`. + static bool DisassembleInstruction(uint32_t cpu, const uint8_t* raw_bytes, + unsigned int raw_bytes_len, + string& instruction); + + // Splits an `instruction` into three parts, the "main" `operation` and + // the `dest` and `src` operands. + // Example: + // instruction = "lock cmpxchg QWORD PTR [rdi], rsi" + // operation = "cmpxchg", dest = "[rdi]", src = "rsi" + static bool TokenizeInstruction(const string& instruction, string& operation, + string& dest, string& src); + + // Compute the address referenced by `expression` in `context`. + // Supports memory operands in the form + // (segment:)[base_reg(+index_reg*index_stride)(+-offset)] + // Returns false if evaluation fails, or if the operand is not a supported + // memory operand. + static bool CalculateAddress(const DumpContext& context, + const string& expression, + uint64_t& address); + + // The parsed components of the disassembly for the instruction. + string operation_ = ""; + string dest_ = ""; + string src_ = ""; +}; +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_DISASSEMBLER_OBJDUMP_H_ \ No newline at end of file diff --git a/src/processor/disassembler_objdump_unittest.cc b/src/processor/disassembler_objdump_unittest.cc new file mode 100644 index 0000000..30a60da --- /dev/null +++ b/src/processor/disassembler_objdump_unittest.cc @@ -0,0 +1,468 @@ +// Copyright (c) 2022, Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "breakpad_googletest_includes.h" + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_cpu_amd64.h" +#include "google_breakpad/common/minidump_cpu_x86.h" +#include "google_breakpad/processor/dump_context.h" +#include "google_breakpad/processor/memory_region.h" +#include "processor/disassembler_objdump.h" + +namespace google_breakpad { +class DisassemblerObjdumpForTest : public DisassemblerObjdump { + public: + using DisassemblerObjdump::CalculateAddress; + using DisassemblerObjdump::DisassembleInstruction; + using DisassemblerObjdump::TokenizeInstruction; +}; + +class TestMemoryRegion : public MemoryRegion { + public: + TestMemoryRegion(uint64_t base, std::vector bytes); + ~TestMemoryRegion() override = default; + + uint64_t GetBase() const override; + uint32_t GetSize() const override; + + bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const override; + bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const override; + bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const override; + bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const override; + + void Print() const override; + + private: + uint64_t base_; + std::vector bytes_; +}; + +TestMemoryRegion::TestMemoryRegion(uint64_t address, std::vector bytes) + : base_(address), bytes_(bytes) {} + +uint64_t TestMemoryRegion::GetBase() const { + return base_; +} + +uint32_t TestMemoryRegion::GetSize() const { + return static_cast(bytes_.size()); +} + +bool TestMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint8_t* value) const { + if (address < GetBase() || + address + sizeof(uint8_t) > GetBase() + GetSize()) { + return false; + } + + memcpy(value, &bytes_[address - GetBase()], sizeof(uint8_t)); + return true; +} + +// We don't use the following functions, so no need to implement. +bool TestMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint16_t* value) const { + return false; +} + +bool TestMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint32_t* value) const { + return false; +} + +bool TestMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint64_t* value) const { + return false; +} + +void TestMemoryRegion::Print() const {} + +const uint32_t kX86TestDs = 0x01000000; +const uint32_t kX86TestEs = 0x02000000; +const uint32_t kX86TestFs = 0x03000000; +const uint32_t kX86TestGs = 0x04000000; +const uint32_t kX86TestEax = 0x00010101; +const uint32_t kX86TestEbx = 0x00020202; +const uint32_t kX86TestEcx = 0x00030303; +const uint32_t kX86TestEdx = 0x00040404; +const uint32_t kX86TestEsi = 0x00050505; +const uint32_t kX86TestEdi = 0x00060606; +const uint32_t kX86TestEsp = 0x00070707; +const uint32_t kX86TestEbp = 0x00080808; +const uint32_t kX86TestEip = 0x23230000; + +const uint64_t kAMD64TestRax = 0x0000010101010101ul; +const uint64_t kAMD64TestRbx = 0x0000020202020202ul; +const uint64_t kAMD64TestRcx = 0x0000030303030303ul; +const uint64_t kAMD64TestRdx = 0x0000040404040404ul; +const uint64_t kAMD64TestRsi = 0x0000050505050505ul; +const uint64_t kAMD64TestRdi = 0x0000060606060606ul; +const uint64_t kAMD64TestRsp = 0x0000070707070707ul; +const uint64_t kAMD64TestRbp = 0x0000080808080808ul; +const uint64_t kAMD64TestR8 = 0x0000090909090909ul; +const uint64_t kAMD64TestR9 = 0x00000a0a0a0a0a0aul; +const uint64_t kAMD64TestR10 = 0x00000b0b0b0b0b0bul; +const uint64_t kAMD64TestR11 = 0x00000c0c0c0c0c0cul; +const uint64_t kAMD64TestR12 = 0x00000d0d0d0d0d0dul; +const uint64_t kAMD64TestR13 = 0x00000e0e0e0e0e0eul; +const uint64_t kAMD64TestR14 = 0x00000f0f0f0f0f0ful; +const uint64_t kAMD64TestR15 = 0x0000001010101010ul; +const uint64_t kAMD64TestRip = 0x0000000023230000ul; + +class TestDumpContext : public DumpContext { + public: + TestDumpContext(bool x86_64 = false); + ~TestDumpContext() override; +}; + +TestDumpContext::TestDumpContext(bool x86_64) { + if (!x86_64) { + MDRawContextX86* raw_context = new MDRawContextX86(); + memset(raw_context, 0, sizeof(*raw_context)); + + raw_context->context_flags = MD_CONTEXT_X86_FULL; + + raw_context->ds = kX86TestDs; + raw_context->es = kX86TestEs; + raw_context->fs = kX86TestFs; + raw_context->gs = kX86TestGs; + raw_context->eax = kX86TestEax; + raw_context->ebx = kX86TestEbx; + raw_context->ecx = kX86TestEcx; + raw_context->edx = kX86TestEdx; + raw_context->esi = kX86TestEsi; + raw_context->edi = kX86TestEdi; + raw_context->esp = kX86TestEsp; + raw_context->ebp = kX86TestEbp; + raw_context->eip = kX86TestEip; + + SetContextFlags(raw_context->context_flags); + SetContextX86(raw_context); + this->valid_ = true; + } else { + MDRawContextAMD64* raw_context = new MDRawContextAMD64(); + memset(raw_context, 0, sizeof(*raw_context)); + + raw_context->context_flags = MD_CONTEXT_AMD64_FULL; + + raw_context->rax = kAMD64TestRax; + raw_context->rbx = kAMD64TestRbx; + raw_context->rcx = kAMD64TestRcx; + raw_context->rdx = kAMD64TestRdx; + raw_context->rsi = kAMD64TestRsi; + raw_context->rdi = kAMD64TestRdi; + raw_context->rsp = kAMD64TestRsp; + raw_context->rbp = kAMD64TestRbp; + raw_context->r8 = kAMD64TestR8; + raw_context->r9 = kAMD64TestR9; + raw_context->r10 = kAMD64TestR10; + raw_context->r11 = kAMD64TestR11; + raw_context->r12 = kAMD64TestR12; + raw_context->r13 = kAMD64TestR13; + raw_context->r14 = kAMD64TestR14; + raw_context->r15 = kAMD64TestR15; + raw_context->rip = kAMD64TestRip; + + SetContextFlags(raw_context->context_flags); + SetContextAMD64(raw_context); + this->valid_ = true; + } +} + +TestDumpContext::~TestDumpContext() { + FreeContext(); +} + +TEST(DisassemblerObjdumpTest, DisassembleInstructionX86) { + string instruction; + ASSERT_FALSE(DisassemblerObjdumpForTest::DisassembleInstruction( + MD_CONTEXT_X86, nullptr, 0, instruction)); + std::vector pop_eax = {0x58}; + ASSERT_TRUE(DisassemblerObjdumpForTest::DisassembleInstruction( + MD_CONTEXT_X86, pop_eax.data(), pop_eax.size(), instruction)); + ASSERT_EQ(instruction, "pop eax"); +} + +TEST(DisassemblerObjdumpTest, DisassembleInstructionAMD64) { + string instruction; + ASSERT_FALSE(DisassemblerObjdumpForTest::DisassembleInstruction( + MD_CONTEXT_AMD64, nullptr, 0, instruction)); + std::vector pop_rax = {0x58}; + ASSERT_TRUE(DisassemblerObjdumpForTest::DisassembleInstruction( + MD_CONTEXT_AMD64, pop_rax.data(), pop_rax.size(), instruction)); + ASSERT_EQ(instruction, "pop rax"); +} + +TEST(DisassemblerObjdumpTest, TokenizeInstruction) { + string operation, dest, src; + ASSERT_TRUE(DisassemblerObjdumpForTest::TokenizeInstruction( + "pop eax", operation, dest, src)); + ASSERT_EQ(operation, "pop"); + ASSERT_EQ(dest, "eax"); + + ASSERT_TRUE(DisassemblerObjdumpForTest::TokenizeInstruction( + "mov eax, ebx", operation, dest, src)); + ASSERT_EQ(operation, "mov"); + ASSERT_EQ(dest, "eax"); + ASSERT_EQ(src, "ebx"); + + ASSERT_TRUE(DisassemblerObjdumpForTest::TokenizeInstruction( + "pop rax", operation, dest, src)); + ASSERT_EQ(operation, "pop"); + ASSERT_EQ(dest, "rax"); + + ASSERT_TRUE(DisassemblerObjdumpForTest::TokenizeInstruction( + "mov rax, rbx", operation, dest, src)); + ASSERT_EQ(operation, "mov"); + ASSERT_EQ(dest, "rax"); + ASSERT_EQ(src, "rbx"); + + // Test the three parsing failure paths + ASSERT_FALSE(DisassemblerObjdumpForTest::TokenizeInstruction( + "mov rax,", operation, dest, src)); + ASSERT_FALSE(DisassemblerObjdumpForTest::TokenizeInstruction( + "mov rax rbx", operation, dest, src)); + ASSERT_FALSE(DisassemblerObjdumpForTest::TokenizeInstruction( + "mov rax, rbx, rcx", operation, dest, src)); + + // This is of course a nonsense instruction, but test that we do remove + // multiple instruction prefixes and can handle multiple memory operands. + ASSERT_TRUE(DisassemblerObjdumpForTest::TokenizeInstruction( + "rep lock mov DWORD PTR rax, QWORD PTR rbx", operation, dest, src)); + ASSERT_EQ(operation, "mov"); + ASSERT_EQ(dest, "rax"); + ASSERT_EQ(src, "rbx"); + + // Test that we ignore junk following a valid instruction + ASSERT_TRUE(DisassemblerObjdumpForTest::TokenizeInstruction( + "mov rax, rbx ; junk here", operation, dest, src)); + ASSERT_EQ(operation, "mov"); + ASSERT_EQ(dest, "rax"); + ASSERT_EQ(src, "rbx"); +} + +namespace x86 { +const TestMemoryRegion load_reg(kX86TestEip, {0x8b, 0x06}); // mov eax, [esi]; + +const TestMemoryRegion load_reg_index(kX86TestEip, + {0x8b, 0x04, + 0xbe}); // mov eax, [esi+edi*4]; + +const TestMemoryRegion load_reg_offset(kX86TestEip, + {0x8b, 0x46, + 0x10}); // mov eax, [esi+0x10]; + +const TestMemoryRegion load_reg_index_offset( + kX86TestEip, + {0x8b, 0x44, 0xbe, 0xf0}); // mov eax, [esi+edi*4-0x10]; + +const TestMemoryRegion rep_stosb(kX86TestEip, {0xf3, 0xaa}); // rep stosb; + +const TestMemoryRegion lock_cmpxchg(kX86TestEip, + {0xf0, 0x0f, 0xb1, 0x46, + 0x10}); // lock cmpxchg [esi + 0x10], eax; + +const TestMemoryRegion call_reg_offset(kX86TestEip, + {0xff, 0x96, 0x99, 0x99, 0x99, + 0x09}); // call [esi+0x9999999]; +} // namespace x86 + +TEST(DisassemblerObjdumpTest, X86LoadReg) { + TestDumpContext context; + DisassemblerObjdump dis(context.GetContextCPU(), &x86::load_reg, kX86TestEip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_FALSE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_TRUE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(src_address, kX86TestEsi); +} + +TEST(DisassemblerObjdumpTest, X86LoadRegIndex) { + TestDumpContext context; + DisassemblerObjdump dis(context.GetContextCPU(), &x86::load_reg_index, + kX86TestEip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_FALSE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_TRUE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(src_address, kX86TestEsi + (kX86TestEdi * 4)); +} + +TEST(DisassemblerObjdumpTest, X86LoadRegOffset) { + TestDumpContext context; + DisassemblerObjdump dis(context.GetContextCPU(), &x86::load_reg_offset, + kX86TestEip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_FALSE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_TRUE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(src_address, kX86TestEsi + 0x10); +} + +TEST(DisassemblerObjdumpTest, X86LoadRegIndexOffset) { + TestDumpContext context; + DisassemblerObjdump dis(context.GetContextCPU(), &x86::load_reg_index_offset, + kX86TestEip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_FALSE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_TRUE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(src_address, kX86TestEsi + (kX86TestEdi * 4) - 0x10); +} + +TEST(DisassemblerObjdumpTest, X86RepStosb) { + TestDumpContext context; + DisassemblerObjdump dis(context.GetContextCPU(), &x86::rep_stosb, + kX86TestEip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_TRUE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_FALSE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(dest_address, kX86TestEs + kX86TestEdi); +} + +TEST(DisassemblerObjdumpTest, X86LockCmpxchg) { + TestDumpContext context; + DisassemblerObjdump dis(context.GetContextCPU(), &x86::lock_cmpxchg, + kX86TestEip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_TRUE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_FALSE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(dest_address, kX86TestEsi + 0x10); +} + +TEST(DisassemblerObjdumpTest, X86CallRegOffset) { + TestDumpContext context; + DisassemblerObjdump dis(context.GetContextCPU(), &x86::call_reg_offset, + kX86TestEip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_TRUE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_FALSE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(dest_address, kX86TestEsi + 0x9999999); +} + +namespace amd64 { +const TestMemoryRegion load_reg(kAMD64TestRip, + {0x48, 0x8b, 0x06}); // mov rax, [rsi]; + +const TestMemoryRegion load_reg_index(kAMD64TestRip, + {0x48, 0x8b, 0x04, + 0xbe}); // mov rax, [rsi+rdi*4]; + +const TestMemoryRegion load_rip_relative(kAMD64TestRip, + {0x48, 0x8b, 0x05, 0x10, 0x00, 0x00, + 0x00}); // mov rax, [rip+0x10]; + +const TestMemoryRegion load_reg_index_offset( + kAMD64TestRip, + {0x48, 0x8b, 0x44, 0xbe, 0xf0}); // mov rax, [rsi+rdi*4-0x10]; + +const TestMemoryRegion rep_stosb(kAMD64TestRip, {0xf3, 0xaa}); // rep stosb; + +const TestMemoryRegion lock_cmpxchg(kAMD64TestRip, + {0xf0, 0x48, 0x0f, 0xb1, 0x46, + 0x10}); // lock cmpxchg [rsi + 0x10], rax; + +const TestMemoryRegion call_reg_offset(kAMD64TestRip, + {0xff, 0x96, 0x99, 0x99, 0x99, + 0x09}); // call [rsi+0x9999999]; +} // namespace amd64 + +TEST(DisassemblerObjdumpTest, AMD64LoadReg) { + TestDumpContext context(true); + DisassemblerObjdump dis(context.GetContextCPU(), &amd64::load_reg, + kAMD64TestRip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_FALSE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_TRUE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(src_address, kAMD64TestRsi); +} + +TEST(DisassemblerObjdumpTest, AMD64LoadRegIndex) { + TestDumpContext context(true); + DisassemblerObjdump dis(context.GetContextCPU(), &amd64::load_reg_index, + kAMD64TestRip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_FALSE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_TRUE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(src_address, kAMD64TestRsi + (kAMD64TestRdi * 4)); +} + +TEST(DisassemblerObjdumpTest, AMD64LoadRipRelative) { + TestDumpContext context(true); + DisassemblerObjdump dis(context.GetContextCPU(), &amd64::load_rip_relative, + kAMD64TestRip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_FALSE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_TRUE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(src_address, kAMD64TestRip + 0x10); +} + +TEST(DisassemblerObjdumpTest, AMD64LoadRegIndexOffset) { + TestDumpContext context(true); + DisassemblerObjdump dis(context.GetContextCPU(), + &amd64::load_reg_index_offset, kAMD64TestRip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_FALSE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_TRUE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(src_address, kAMD64TestRsi + (kAMD64TestRdi * 4) - 0x10); +} + +TEST(DisassemblerObjdumpTest, AMD64RepStosb) { + TestDumpContext context(true); + DisassemblerObjdump dis(context.GetContextCPU(), &amd64::rep_stosb, + kAMD64TestRip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_TRUE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_FALSE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(dest_address, kAMD64TestRdi); +} + +TEST(DisassemblerObjdumpTest, AMD64LockCmpxchg) { + TestDumpContext context(true); + DisassemblerObjdump dis(context.GetContextCPU(), &amd64::lock_cmpxchg, + kAMD64TestRip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_TRUE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_FALSE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(dest_address, kAMD64TestRsi + 0x10); +} + +TEST(DisassemblerObjdumpTest, AMD64CallRegOffset) { + TestDumpContext context(true); + DisassemblerObjdump dis(context.GetContextCPU(), &amd64::call_reg_offset, + kAMD64TestRip); + uint64_t src_address = 0, dest_address = 0; + ASSERT_TRUE(dis.CalculateDestAddress(context, dest_address)); + ASSERT_FALSE(dis.CalculateSrcAddress(context, src_address)); + ASSERT_EQ(dest_address, kAMD64TestRsi + 0x9999999); +} +} // namespace google_breakpad diff --git a/src/processor/disassembler_x86.cc b/src/processor/disassembler_x86.cc new file mode 100644 index 0000000..741cec7 --- /dev/null +++ b/src/processor/disassembler_x86.cc @@ -0,0 +1,253 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// disassembler_x86.cc: simple x86 disassembler. +// +// Provides single step disassembly of x86 bytecode and flags instructions +// that utilize known bad register values. +// +// Author: Cris Neckar + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/disassembler_x86.h" + +#include + +namespace google_breakpad { + +DisassemblerX86::DisassemblerX86(const uint8_t* bytecode, + uint32_t size, + uint32_t virtual_address) : + bytecode_(bytecode), + size_(size), + virtual_address_(virtual_address), + current_byte_offset_(0), + current_inst_offset_(0), + instr_valid_(false), + register_valid_(false), + pushed_bad_value_(false), + end_of_block_(false), + flags_(0) { + libdis::x86_init(libdis::opt_none, NULL, NULL); +} + +DisassemblerX86::~DisassemblerX86() { + if (instr_valid_) + libdis::x86_oplist_free(¤t_instr_); + + libdis::x86_cleanup(); +} + +uint32_t DisassemblerX86::NextInstruction() { + if (instr_valid_) + libdis::x86_oplist_free(¤t_instr_); + + if (current_byte_offset_ >= size_) { + instr_valid_ = false; + return 0; + } + uint32_t instr_size = 0; + instr_size = libdis::x86_disasm((unsigned char*)bytecode_, size_, + virtual_address_, current_byte_offset_, + ¤t_instr_); + if (instr_size == 0) { + instr_valid_ = false; + return 0; + } + + current_byte_offset_ += instr_size; + current_inst_offset_++; + instr_valid_ = libdis::x86_insn_is_valid(¤t_instr_); + if (!instr_valid_) + return 0; + + if (current_instr_.type == libdis::insn_return) + end_of_block_ = true; + libdis::x86_op_t* src = libdis::x86_get_src_operand(¤t_instr_); + libdis::x86_op_t* dest = libdis::x86_get_dest_operand(¤t_instr_); + + if (register_valid_) { + switch (current_instr_.group) { + // Flag branches based off of bad registers and calls that occur + // after pushing bad values. + case libdis::insn_controlflow: + switch (current_instr_.type) { + case libdis::insn_jmp: + case libdis::insn_jcc: + case libdis::insn_call: + case libdis::insn_callcc: + if (dest) { + switch (dest->type) { + case libdis::op_expression: + if (dest->data.expression.base.id == bad_register_.id) + flags_ |= DISX86_BAD_BRANCH_TARGET; + break; + case libdis::op_register: + if (dest->data.reg.id == bad_register_.id) + flags_ |= DISX86_BAD_BRANCH_TARGET; + break; + default: + if (pushed_bad_value_ && + (current_instr_.type == libdis::insn_call || + current_instr_.type == libdis::insn_callcc)) + flags_ |= DISX86_BAD_ARGUMENT_PASSED; + break; + } + } + break; + default: + break; + } + break; + + // Flag block data operations that use bad registers for src or dest. + case libdis::insn_string: + if (dest && dest->type == libdis::op_expression && + dest->data.expression.base.id == bad_register_.id) + flags_ |= DISX86_BAD_BLOCK_WRITE; + if (src && src->type == libdis::op_expression && + src->data.expression.base.id == bad_register_.id) + flags_ |= DISX86_BAD_BLOCK_READ; + break; + + // Flag comparisons based on bad data. + case libdis::insn_comparison: + if ((dest && dest->type == libdis::op_expression && + dest->data.expression.base.id == bad_register_.id) || + (src && src->type == libdis::op_expression && + src->data.expression.base.id == bad_register_.id) || + (dest && dest->type == libdis::op_register && + dest->data.reg.id == bad_register_.id) || + (src && src->type == libdis::op_register && + src->data.reg.id == bad_register_.id)) + flags_ |= DISX86_BAD_COMPARISON; + break; + + // Flag any other instruction which derefs a bad register for + // src or dest. + default: + if (dest && dest->type == libdis::op_expression && + dest->data.expression.base.id == bad_register_.id) + flags_ |= DISX86_BAD_WRITE; + if (src && src->type == libdis::op_expression && + src->data.expression.base.id == bad_register_.id) + flags_ |= DISX86_BAD_READ; + break; + } + } + + // When a register is marked as tainted check if it is pushed. + // TODO(cdn): may also want to check for MOVs into EBP offsets. + if (register_valid_ && dest && current_instr_.type == libdis::insn_push) { + switch (dest->type) { + case libdis::op_expression: + if (dest->data.expression.base.id == bad_register_.id || + dest->data.expression.index.id == bad_register_.id) + pushed_bad_value_ = true; + break; + case libdis::op_register: + if (dest->data.reg.id == bad_register_.id) + pushed_bad_value_ = true; + break; + default: + break; + } + } + + // Check if a tainted register value is clobbered. + // For conditional MOVs and XCHGs assume that + // there is a hit. + if (register_valid_) { + switch (current_instr_.type) { + case libdis::insn_xor: + if (src && src->type == libdis::op_register && + dest && dest->type == libdis::op_register && + src->data.reg.id == bad_register_.id && + src->data.reg.id == dest->data.reg.id) + register_valid_ = false; + break; + case libdis::insn_pop: + case libdis::insn_mov: + case libdis::insn_movcc: + if (dest && dest->type == libdis::op_register && + dest->data.reg.id == bad_register_.id) + register_valid_ = false; + break; + case libdis::insn_popregs: + register_valid_ = false; + break; + case libdis::insn_xchg: + case libdis::insn_xchgcc: + if (dest && dest->type == libdis::op_register && + src && src->type == libdis::op_register) { + if (dest->data.reg.id == bad_register_.id) + memcpy(&bad_register_, &src->data.reg, sizeof(libdis::x86_reg_t)); + else if (src->data.reg.id == bad_register_.id) + memcpy(&bad_register_, &dest->data.reg, sizeof(libdis::x86_reg_t)); + } + break; + default: + break; + } + } + + return instr_size; +} + +bool DisassemblerX86::setBadRead() { + if (!instr_valid_) + return false; + + libdis::x86_op_t* operand = libdis::x86_get_src_operand(¤t_instr_); + if (!operand || operand->type != libdis::op_expression) + return false; + + memcpy(&bad_register_, &operand->data.expression.base, + sizeof(libdis::x86_reg_t)); + register_valid_ = true; + return true; +} + +bool DisassemblerX86::setBadWrite() { + if (!instr_valid_) + return false; + + libdis::x86_op_t* operand = libdis::x86_get_dest_operand(¤t_instr_); + if (!operand || operand->type != libdis::op_expression) + return false; + + memcpy(&bad_register_, &operand->data.expression.base, + sizeof(libdis::x86_reg_t)); + register_valid_ = true; + return true; +} + +} // namespace google_breakpad diff --git a/src/processor/disassembler_x86.h b/src/processor/disassembler_x86.h new file mode 100644 index 0000000..493f7f2 --- /dev/null +++ b/src/processor/disassembler_x86.h @@ -0,0 +1,127 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// disassembler_x86.h: Basic x86 bytecode disassembler +// +// Provides a simple disassembler which wraps libdisasm. This allows simple +// tests to be run against bytecode to test for various properties. +// +// Author: Cris Neckar + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_DISASSEMBLER_X86_H_ +#define GOOGLE_BREAKPAD_PROCESSOR_DISASSEMBLER_X86_H_ + +#include +#include + +#include "google_breakpad/common/breakpad_types.h" + +namespace libdis { +#include "third_party/libdisasm/libdis.h" +} + +namespace google_breakpad { + +enum { + DISX86_NONE = 0x0, + DISX86_BAD_BRANCH_TARGET = 0x1, + DISX86_BAD_ARGUMENT_PASSED = 0x2, + DISX86_BAD_WRITE = 0x4, + DISX86_BAD_BLOCK_WRITE = 0x8, + DISX86_BAD_READ = 0x10, + DISX86_BAD_BLOCK_READ = 0x20, + DISX86_BAD_COMPARISON = 0x40 +}; + +class DisassemblerX86 { + public: + // TODO(cdn): Modify this class to take a MemoryRegion instead of just + // a raw buffer. This will make it easier to use this on arbitrary + // minidumps without first copying out the code segment. + DisassemblerX86(const uint8_t* bytecode, uint32_t, uint32_t); + ~DisassemblerX86(); + + // This walks to the next instruction in the memory region and + // sets flags based on the type of instruction and previous state + // including any registers marked as bad through setBadRead() + // or setBadWrite(). This method can be called in a loop to + // disassemble until the end of a region. + uint32_t NextInstruction(); + + // Indicates whether the current disassembled instruction was valid. + bool currentInstructionValid() { return instr_valid_; } + + // Returns the current instruction as defined in libdis.h, + // or NULL if the current instruction is not valid. + const libdis::x86_insn_t* currentInstruction() { + return instr_valid_ ? ¤t_instr_ : NULL; + } + + // Returns the type of the current instruction as defined in libdis.h. + libdis::x86_insn_group currentInstructionGroup() { + return current_instr_.group; + } + + // Indicates whether a return instruction has been encountered. + bool endOfBlock() { return end_of_block_; } + + // The flags set so far for the disassembly. + uint16_t flags() { return flags_; } + + // This sets an indicator that the register used to determine + // src or dest for the current instruction is tainted. These can + // be used after examining the current instruction to indicate, + // for example that a bad read or write occurred and the pointer + // stored in the register is currently invalid. + bool setBadRead(); + bool setBadWrite(); + + protected: + const uint8_t* bytecode_; + uint32_t size_; + uint32_t virtual_address_; + uint32_t current_byte_offset_; + uint32_t current_inst_offset_; + + bool instr_valid_; + libdis::x86_insn_t current_instr_; + + // TODO(cdn): Maybe also track an expression's index register. + // ex: mov eax, [ebx + ecx]; ebx is base, ecx is index. + bool register_valid_; + libdis::x86_reg_t bad_register_; + + bool pushed_bad_value_; + bool end_of_block_; + + uint16_t flags_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_DISASSEMBLER_X86_H_ diff --git a/src/processor/disassembler_x86_unittest.cc b/src/processor/disassembler_x86_unittest.cc new file mode 100644 index 0000000..18525b8 --- /dev/null +++ b/src/processor/disassembler_x86_unittest.cc @@ -0,0 +1,236 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "breakpad_googletest_includes.h" +#include "processor/disassembler_x86.h" +#include "third_party/libdisasm/libdis.h" + +namespace { + +using google_breakpad::DisassemblerX86; + +unsigned char just_return[] = "\xc3"; // retn + +unsigned char invalid_instruction[] = "\x00"; // invalid + +unsigned char read_eax_jmp_eax[] = + "\x8b\x18" // mov ebx, [eax]; + "\x33\xc9" // xor ebx, ebx; + "\xff\x20" // jmp eax; + "\xc3"; // retn; + +unsigned char write_eax_arg_to_call[] = + "\x89\xa8\x00\x02\x00\x00" // mov [eax+200], ebp; + "\xc1\xeb\x02" // shr ebx, 2; + "\x50" // push eax; + "\xe8\xd1\x24\x77\x88" // call something; + "\xc3"; // retn; + +unsigned char read_edi_stosb[] = + "\x8b\x07" // mov eax, [edi]; + "\x8b\xc8" // mov ecx, eax; + "\xf3\xaa" // rep stosb; + "\xc3"; // retn; + +unsigned char read_clobber_write[] = + "\x03\x18" // add ebx, [eax]; + "\x8b\xc1" // mov eax, ecx; + "\x89\x10" // mov [eax], edx; + "\xc3"; // retn; + +unsigned char read_xchg_write[] = + "\x03\x18" // add ebx, [eax]; + "\x91" // xchg eax, ecx; + "\x89\x18" // mov [eax], ebx; + "\x89\x11" // mov [ecx], edx; + "\xc3"; // retn; + +unsigned char read_cmp[] = + "\x03\x18" // add ebx, [eax]; + "\x83\xf8\x00" // cmp eax, 0; + "\x74\x04" // je +4; + "\xc3"; // retn; + +TEST(DisassemblerX86Test, SimpleReturnInstruction) { + DisassemblerX86 dis(just_return, sizeof(just_return)-1, 0); + EXPECT_EQ(1U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_TRUE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup()); + const libdis::x86_insn_t* instruction = dis.currentInstruction(); + EXPECT_EQ(libdis::insn_controlflow, instruction->group); + EXPECT_EQ(libdis::insn_return, instruction->type); + EXPECT_EQ(0U, dis.NextInstruction()); + EXPECT_FALSE(dis.currentInstructionValid()); + EXPECT_EQ(NULL, dis.currentInstruction()); +} + +TEST(DisassemblerX86Test, SimpleInvalidInstruction) { + DisassemblerX86 dis(invalid_instruction, sizeof(invalid_instruction)-1, 0); + EXPECT_EQ(0U, dis.NextInstruction()); + EXPECT_FALSE(dis.currentInstructionValid()); +} + +TEST(DisassemblerX86Test, BadReadLeadsToBranch) { + DisassemblerX86 dis(read_eax_jmp_eax, sizeof(read_eax_jmp_eax)-1, 0); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup()); + EXPECT_TRUE(dis.setBadRead()); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_logic, dis.currentInstructionGroup()); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(google_breakpad::DISX86_BAD_BRANCH_TARGET, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup()); +} + +TEST(DisassemblerX86Test, BadWriteLeadsToPushedArg) { + DisassemblerX86 dis(write_eax_arg_to_call, + sizeof(write_eax_arg_to_call)-1, 0); + EXPECT_EQ(6U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup()); + EXPECT_TRUE(dis.setBadWrite()); + EXPECT_EQ(3U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup()); + EXPECT_EQ(1U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(5U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(google_breakpad::DISX86_BAD_ARGUMENT_PASSED, dis.flags()); + EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup()); + EXPECT_FALSE(dis.endOfBlock()); +} + + +TEST(DisassemblerX86Test, BadReadLeadsToBlockWrite) { + DisassemblerX86 dis(read_edi_stosb, sizeof(read_edi_stosb)-1, 0); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup()); + EXPECT_TRUE(dis.setBadRead()); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup()); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(google_breakpad::DISX86_BAD_BLOCK_WRITE, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_string, dis.currentInstructionGroup()); +} + +TEST(DisassemblerX86Test, BadReadClobberThenWrite) { + DisassemblerX86 dis(read_clobber_write, sizeof(read_clobber_write)-1, 0); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup()); + EXPECT_TRUE(dis.setBadRead()); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup()); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup()); +} + +TEST(DisassemblerX86Test, BadReadXCHGThenWrite) { + DisassemblerX86 dis(read_xchg_write, sizeof(read_xchg_write)-1, 0); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup()); + EXPECT_TRUE(dis.setBadRead()); + EXPECT_EQ(1U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup()); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup()); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(google_breakpad::DISX86_BAD_WRITE, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup()); +} + +TEST(DisassemblerX86Test, BadReadThenCMP) { + DisassemblerX86 dis(read_cmp, sizeof(read_cmp)-1, 0); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(0U, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup()); + EXPECT_TRUE(dis.setBadRead()); + EXPECT_EQ(3U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(google_breakpad::DISX86_BAD_COMPARISON, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_comparison, dis.currentInstructionGroup()); + EXPECT_EQ(2U, dis.NextInstruction()); + EXPECT_TRUE(dis.currentInstructionValid()); + EXPECT_EQ(google_breakpad::DISX86_BAD_COMPARISON, dis.flags()); + EXPECT_FALSE(dis.endOfBlock()); + EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup()); +} +} diff --git a/src/processor/dump_context.cc b/src/processor/dump_context.cc new file mode 100644 index 0000000..ab97930 --- /dev/null +++ b/src/processor/dump_context.cc @@ -0,0 +1,881 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dump_context.cc: A (mini/micro)dump context. +// +// See dump_context.h for documentation. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/dump_context.h" + +#include + +#ifdef _WIN32 +#include +#else // _WIN32 +#include +#endif // _WIN32 + +#include "common/stdio_wrapper.h" +#include "processor/logging.h" + +namespace google_breakpad { + +DumpContext::DumpContext() : context_(), + context_flags_(0) { } + +DumpContext::~DumpContext() { + FreeContext(); +} + +uint32_t DumpContext::GetContextCPU() const { + if (!valid_) { + // Don't log a message, GetContextCPU can be legitimately called with + // valid_ false by FreeContext, which is called by Read. + return 0; + } + + return context_flags_ & MD_CONTEXT_CPU_MASK; +} + +uint32_t DumpContext::GetContextFlags() const { + return context_flags_; +} + +const MDRawContextX86* DumpContext::GetContextX86() const { + if (GetContextCPU() != MD_CONTEXT_X86) { + BPLOG(ERROR) << "DumpContext cannot get x86 context"; + return NULL; + } + + return context_.x86; +} + +const MDRawContextPPC* DumpContext::GetContextPPC() const { + if (GetContextCPU() != MD_CONTEXT_PPC) { + BPLOG(ERROR) << "DumpContext cannot get ppc context"; + return NULL; + } + + return context_.ppc; +} + +const MDRawContextPPC64* DumpContext::GetContextPPC64() const { + if (GetContextCPU() != MD_CONTEXT_PPC64) { + BPLOG(ERROR) << "DumpContext cannot get ppc64 context"; + return NULL; + } + + return context_.ppc64; +} + +const MDRawContextAMD64* DumpContext::GetContextAMD64() const { + if (GetContextCPU() != MD_CONTEXT_AMD64) { + BPLOG(ERROR) << "DumpContext cannot get amd64 context"; + return NULL; + } + + return context_.amd64; +} + +const MDRawContextSPARC* DumpContext::GetContextSPARC() const { + if (GetContextCPU() != MD_CONTEXT_SPARC) { + BPLOG(ERROR) << "DumpContext cannot get sparc context"; + return NULL; + } + + return context_.ctx_sparc; +} + +const MDRawContextARM* DumpContext::GetContextARM() const { + if (GetContextCPU() != MD_CONTEXT_ARM) { + BPLOG(ERROR) << "DumpContext cannot get arm context"; + return NULL; + } + + return context_.arm; +} + +const MDRawContextARM64* DumpContext::GetContextARM64() const { + if (GetContextCPU() != MD_CONTEXT_ARM64) { + BPLOG(ERROR) << "DumpContext cannot get arm64 context"; + return NULL; + } + + return context_.arm64; +} + +const MDRawContextMIPS* DumpContext::GetContextMIPS() const { + if ((GetContextCPU() != MD_CONTEXT_MIPS) && + (GetContextCPU() != MD_CONTEXT_MIPS64)) { + BPLOG(ERROR) << "DumpContext cannot get MIPS context"; + return NULL; + } + + return context_.ctx_mips; +} + +const MDRawContextRISCV* DumpContext::GetContextRISCV() const { + if (GetContextCPU() != MD_CONTEXT_RISCV) { + BPLOG(ERROR) << "DumpContext cannot get RISCV context"; + return NULL; + } + + return context_.riscv; +} + +const MDRawContextRISCV64* DumpContext::GetContextRISCV64() const { + if (GetContextCPU() != MD_CONTEXT_RISCV64) { + BPLOG(ERROR) << "DumpContext cannot get RISCV64 context"; + return NULL; + } + + return context_.riscv64; +} + +bool DumpContext::GetInstructionPointer(uint64_t* ip) const { + BPLOG_IF(ERROR, !ip) << "DumpContext::GetInstructionPointer requires |ip|"; + assert(ip); + *ip = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid DumpContext for GetInstructionPointer"; + return false; + } + + switch (GetContextCPU()) { + case MD_CONTEXT_AMD64: + *ip = GetContextAMD64()->rip; + break; + case MD_CONTEXT_ARM: + *ip = GetContextARM()->iregs[MD_CONTEXT_ARM_REG_PC]; + break; + case MD_CONTEXT_ARM64: + *ip = GetContextARM64()->iregs[MD_CONTEXT_ARM64_REG_PC]; + break; + case MD_CONTEXT_PPC: + *ip = GetContextPPC()->srr0; + break; + case MD_CONTEXT_PPC64: + *ip = GetContextPPC64()->srr0; + break; + case MD_CONTEXT_SPARC: + *ip = GetContextSPARC()->pc; + break; + case MD_CONTEXT_X86: + *ip = GetContextX86()->eip; + break; + case MD_CONTEXT_MIPS: + case MD_CONTEXT_MIPS64: + *ip = GetContextMIPS()->epc; + break; + case MD_CONTEXT_RISCV: + *ip = GetContextRISCV()->pc; + break; + case MD_CONTEXT_RISCV64: + *ip = GetContextRISCV64()->pc; + break; + default: + // This should never happen. + BPLOG(ERROR) << "Unknown CPU architecture in GetInstructionPointer"; + return false; + } + return true; +} + +bool DumpContext::GetStackPointer(uint64_t* sp) const { + BPLOG_IF(ERROR, !sp) << "DumpContext::GetStackPointer requires |sp|"; + assert(sp); + *sp = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid DumpContext for GetStackPointer"; + return false; + } + + switch (GetContextCPU()) { + case MD_CONTEXT_AMD64: + *sp = GetContextAMD64()->rsp; + break; + case MD_CONTEXT_ARM: + *sp = GetContextARM()->iregs[MD_CONTEXT_ARM_REG_SP]; + break; + case MD_CONTEXT_ARM64: + *sp = GetContextARM64()->iregs[MD_CONTEXT_ARM64_REG_SP]; + break; + case MD_CONTEXT_PPC: + *sp = GetContextPPC()->gpr[MD_CONTEXT_PPC_REG_SP]; + break; + case MD_CONTEXT_PPC64: + *sp = GetContextPPC64()->gpr[MD_CONTEXT_PPC64_REG_SP]; + break; + case MD_CONTEXT_SPARC: + *sp = GetContextSPARC()->g_r[MD_CONTEXT_SPARC_REG_SP]; + break; + case MD_CONTEXT_X86: + *sp = GetContextX86()->esp; + break; + case MD_CONTEXT_MIPS: + case MD_CONTEXT_MIPS64: + *sp = GetContextMIPS()->iregs[MD_CONTEXT_MIPS_REG_SP]; + break; + case MD_CONTEXT_RISCV: + *sp = GetContextRISCV()->sp; + break; + case MD_CONTEXT_RISCV64: + *sp = GetContextRISCV64()->sp; + break; + default: + // This should never happen. + BPLOG(ERROR) << "Unknown CPU architecture in GetStackPointer"; + return false; + } + return true; +} + +void DumpContext::SetContextFlags(uint32_t context_flags) { + context_flags_ = context_flags; +} + +void DumpContext::SetContextX86(MDRawContextX86* x86) { + context_.x86 = x86; +} + +void DumpContext::SetContextPPC(MDRawContextPPC* ppc) { + context_.ppc = ppc; +} + +void DumpContext::SetContextPPC64(MDRawContextPPC64* ppc64) { + context_.ppc64 = ppc64; +} + +void DumpContext::SetContextAMD64(MDRawContextAMD64* amd64) { + context_.amd64 = amd64; +} + +void DumpContext::SetContextSPARC(MDRawContextSPARC* ctx_sparc) { + context_.ctx_sparc = ctx_sparc; +} + +void DumpContext::SetContextARM(MDRawContextARM* arm) { + context_.arm = arm; +} + +void DumpContext::SetContextARM64(MDRawContextARM64* arm64) { + context_.arm64 = arm64; +} + +void DumpContext::SetContextMIPS(MDRawContextMIPS* ctx_mips) { + context_.ctx_mips = ctx_mips; +} + +void DumpContext::SetContextRISCV(MDRawContextRISCV* riscv) { + context_.riscv = riscv; +} + +void DumpContext::SetContextRISCV64(MDRawContextRISCV64* riscv64) { + context_.riscv64 = riscv64; +} + +void DumpContext::FreeContext() { + switch (GetContextCPU()) { + case MD_CONTEXT_X86: + delete context_.x86; + break; + + case MD_CONTEXT_PPC: + delete context_.ppc; + break; + + case MD_CONTEXT_PPC64: + delete context_.ppc64; + break; + + case MD_CONTEXT_AMD64: + delete context_.amd64; + break; + + case MD_CONTEXT_SPARC: + delete context_.ctx_sparc; + break; + + case MD_CONTEXT_ARM: + delete context_.arm; + break; + + case MD_CONTEXT_ARM64: + delete context_.arm64; + break; + + case MD_CONTEXT_MIPS: + case MD_CONTEXT_MIPS64: + delete context_.ctx_mips; + break; + + case MD_CONTEXT_RISCV: + delete context_.riscv; + break; + + case MD_CONTEXT_RISCV64: + delete context_.riscv64; + break; + + default: + // There is no context record (valid_ is false) or there's a + // context record for an unknown CPU (shouldn't happen, only known + // records are stored by Read). + break; + } + + context_flags_ = 0; + context_.base = NULL; +} + +void DumpContext::Print() { + if (!valid_) { + BPLOG(ERROR) << "DumpContext cannot print invalid data"; + return; + } + + switch (GetContextCPU()) { + case MD_CONTEXT_X86: { + const MDRawContextX86* context_x86 = GetContextX86(); + printf("MDRawContextX86\n"); + printf(" context_flags = 0x%x\n", + context_x86->context_flags); + printf(" dr0 = 0x%x\n", context_x86->dr0); + printf(" dr1 = 0x%x\n", context_x86->dr1); + printf(" dr2 = 0x%x\n", context_x86->dr2); + printf(" dr3 = 0x%x\n", context_x86->dr3); + printf(" dr6 = 0x%x\n", context_x86->dr6); + printf(" dr7 = 0x%x\n", context_x86->dr7); + printf(" float_save.control_word = 0x%x\n", + context_x86->float_save.control_word); + printf(" float_save.status_word = 0x%x\n", + context_x86->float_save.status_word); + printf(" float_save.tag_word = 0x%x\n", + context_x86->float_save.tag_word); + printf(" float_save.error_offset = 0x%x\n", + context_x86->float_save.error_offset); + printf(" float_save.error_selector = 0x%x\n", + context_x86->float_save.error_selector); + printf(" float_save.data_offset = 0x%x\n", + context_x86->float_save.data_offset); + printf(" float_save.data_selector = 0x%x\n", + context_x86->float_save.data_selector); + printf(" float_save.register_area[%2d] = 0x", + MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE); + for (unsigned int register_index = 0; + register_index < MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE; + ++register_index) { + printf("%02x", context_x86->float_save.register_area[register_index]); + } + printf("\n"); + printf(" float_save.cr0_npx_state = 0x%x\n", + context_x86->float_save.cr0_npx_state); + printf(" gs = 0x%x\n", context_x86->gs); + printf(" fs = 0x%x\n", context_x86->fs); + printf(" es = 0x%x\n", context_x86->es); + printf(" ds = 0x%x\n", context_x86->ds); + printf(" edi = 0x%x\n", context_x86->edi); + printf(" esi = 0x%x\n", context_x86->esi); + printf(" ebx = 0x%x\n", context_x86->ebx); + printf(" edx = 0x%x\n", context_x86->edx); + printf(" ecx = 0x%x\n", context_x86->ecx); + printf(" eax = 0x%x\n", context_x86->eax); + printf(" ebp = 0x%x\n", context_x86->ebp); + printf(" eip = 0x%x\n", context_x86->eip); + printf(" cs = 0x%x\n", context_x86->cs); + printf(" eflags = 0x%x\n", context_x86->eflags); + printf(" esp = 0x%x\n", context_x86->esp); + printf(" ss = 0x%x\n", context_x86->ss); + printf(" extended_registers[%3d] = 0x", + MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE); + for (unsigned int register_index = 0; + register_index < MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE; + ++register_index) { + printf("%02x", context_x86->extended_registers[register_index]); + } + printf("\n\n"); + + break; + } + + case MD_CONTEXT_PPC: { + const MDRawContextPPC* context_ppc = GetContextPPC(); + printf("MDRawContextPPC\n"); + printf(" context_flags = 0x%x\n", + context_ppc->context_flags); + printf(" srr0 = 0x%x\n", context_ppc->srr0); + printf(" srr1 = 0x%x\n", context_ppc->srr1); + for (unsigned int gpr_index = 0; + gpr_index < MD_CONTEXT_PPC_GPR_COUNT; + ++gpr_index) { + printf(" gpr[%2d] = 0x%x\n", + gpr_index, context_ppc->gpr[gpr_index]); + } + printf(" cr = 0x%x\n", context_ppc->cr); + printf(" xer = 0x%x\n", context_ppc->xer); + printf(" lr = 0x%x\n", context_ppc->lr); + printf(" ctr = 0x%x\n", context_ppc->ctr); + printf(" mq = 0x%x\n", context_ppc->mq); + printf(" vrsave = 0x%x\n", context_ppc->vrsave); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; + ++fpr_index) { + printf(" float_save.fpregs[%2d] = 0x%" PRIx64 "\n", + fpr_index, context_ppc->float_save.fpregs[fpr_index]); + } + printf(" float_save.fpscr = 0x%x\n", + context_ppc->float_save.fpscr); + // TODO(mmentovai): print the 128-bit quantities in + // context_ppc->vector_save. This isn't done yet because printf + // doesn't support 128-bit quantities, and printing them using + // PRIx64 as two 64-bit quantities requires knowledge of the CPU's + // byte ordering. + printf(" vector_save.save_vrvalid = 0x%x\n", + context_ppc->vector_save.save_vrvalid); + printf("\n"); + + break; + } + + case MD_CONTEXT_PPC64: { + const MDRawContextPPC64* context_ppc64 = GetContextPPC64(); + printf("MDRawContextPPC64\n"); + printf(" context_flags = 0x%" PRIx64 "\n", + context_ppc64->context_flags); + printf(" srr0 = 0x%" PRIx64 "\n", + context_ppc64->srr0); + printf(" srr1 = 0x%" PRIx64 "\n", + context_ppc64->srr1); + for (unsigned int gpr_index = 0; + gpr_index < MD_CONTEXT_PPC64_GPR_COUNT; + ++gpr_index) { + printf(" gpr[%2d] = 0x%" PRIx64 "\n", + gpr_index, context_ppc64->gpr[gpr_index]); + } + printf(" cr = 0x%" PRIx64 "\n", context_ppc64->cr); + printf(" xer = 0x%" PRIx64 "\n", + context_ppc64->xer); + printf(" lr = 0x%" PRIx64 "\n", context_ppc64->lr); + printf(" ctr = 0x%" PRIx64 "\n", + context_ppc64->ctr); + printf(" vrsave = 0x%" PRIx64 "\n", + context_ppc64->vrsave); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; + ++fpr_index) { + printf(" float_save.fpregs[%2d] = 0x%" PRIx64 "\n", + fpr_index, context_ppc64->float_save.fpregs[fpr_index]); + } + printf(" float_save.fpscr = 0x%x\n", + context_ppc64->float_save.fpscr); + // TODO(mmentovai): print the 128-bit quantities in + // context_ppc64->vector_save. This isn't done yet because printf + // doesn't support 128-bit quantities, and printing them using + // PRIx64 as two 64-bit quantities requires knowledge of the CPU's + // byte ordering. + printf(" vector_save.save_vrvalid = 0x%x\n", + context_ppc64->vector_save.save_vrvalid); + printf("\n"); + + break; + } + + case MD_CONTEXT_AMD64: { + const MDRawContextAMD64* context_amd64 = GetContextAMD64(); + printf("MDRawContextAMD64\n"); + printf(" p1_home = 0x%" PRIx64 "\n", + context_amd64->p1_home); + printf(" p2_home = 0x%" PRIx64 "\n", + context_amd64->p2_home); + printf(" p3_home = 0x%" PRIx64 "\n", + context_amd64->p3_home); + printf(" p4_home = 0x%" PRIx64 "\n", + context_amd64->p4_home); + printf(" p5_home = 0x%" PRIx64 "\n", + context_amd64->p5_home); + printf(" p6_home = 0x%" PRIx64 "\n", + context_amd64->p6_home); + printf(" context_flags = 0x%x\n", + context_amd64->context_flags); + printf(" mx_csr = 0x%x\n", + context_amd64->mx_csr); + printf(" cs = 0x%x\n", context_amd64->cs); + printf(" ds = 0x%x\n", context_amd64->ds); + printf(" es = 0x%x\n", context_amd64->es); + printf(" fs = 0x%x\n", context_amd64->fs); + printf(" gs = 0x%x\n", context_amd64->gs); + printf(" ss = 0x%x\n", context_amd64->ss); + printf(" eflags = 0x%x\n", context_amd64->eflags); + printf(" dr0 = 0x%" PRIx64 "\n", context_amd64->dr0); + printf(" dr1 = 0x%" PRIx64 "\n", context_amd64->dr1); + printf(" dr2 = 0x%" PRIx64 "\n", context_amd64->dr2); + printf(" dr3 = 0x%" PRIx64 "\n", context_amd64->dr3); + printf(" dr6 = 0x%" PRIx64 "\n", context_amd64->dr6); + printf(" dr7 = 0x%" PRIx64 "\n", context_amd64->dr7); + printf(" rax = 0x%" PRIx64 "\n", context_amd64->rax); + printf(" rcx = 0x%" PRIx64 "\n", context_amd64->rcx); + printf(" rdx = 0x%" PRIx64 "\n", context_amd64->rdx); + printf(" rbx = 0x%" PRIx64 "\n", context_amd64->rbx); + printf(" rsp = 0x%" PRIx64 "\n", context_amd64->rsp); + printf(" rbp = 0x%" PRIx64 "\n", context_amd64->rbp); + printf(" rsi = 0x%" PRIx64 "\n", context_amd64->rsi); + printf(" rdi = 0x%" PRIx64 "\n", context_amd64->rdi); + printf(" r8 = 0x%" PRIx64 "\n", context_amd64->r8); + printf(" r9 = 0x%" PRIx64 "\n", context_amd64->r9); + printf(" r10 = 0x%" PRIx64 "\n", context_amd64->r10); + printf(" r11 = 0x%" PRIx64 "\n", context_amd64->r11); + printf(" r12 = 0x%" PRIx64 "\n", context_amd64->r12); + printf(" r13 = 0x%" PRIx64 "\n", context_amd64->r13); + printf(" r14 = 0x%" PRIx64 "\n", context_amd64->r14); + printf(" r15 = 0x%" PRIx64 "\n", context_amd64->r15); + printf(" rip = 0x%" PRIx64 "\n", context_amd64->rip); + // TODO: print xmm, vector, debug registers + printf("\n"); + break; + } + + case MD_CONTEXT_SPARC: { + const MDRawContextSPARC* context_sparc = GetContextSPARC(); + printf("MDRawContextSPARC\n"); + printf(" context_flags = 0x%x\n", + context_sparc->context_flags); + for (unsigned int g_r_index = 0; + g_r_index < MD_CONTEXT_SPARC_GPR_COUNT; + ++g_r_index) { + printf(" g_r[%2d] = 0x%" PRIx64 "\n", + g_r_index, context_sparc->g_r[g_r_index]); + } + printf(" ccr = 0x%" PRIx64 "\n", context_sparc->ccr); + printf(" pc = 0x%" PRIx64 "\n", context_sparc->pc); + printf(" npc = 0x%" PRIx64 "\n", context_sparc->npc); + printf(" y = 0x%" PRIx64 "\n", context_sparc->y); + printf(" asi = 0x%" PRIx64 "\n", context_sparc->asi); + printf(" fprs = 0x%" PRIx64 "\n", context_sparc->fprs); + + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT; + ++fpr_index) { + printf(" float_save.regs[%2d] = 0x%" PRIx64 "\n", + fpr_index, context_sparc->float_save.regs[fpr_index]); + } + printf(" float_save.filler = 0x%" PRIx64 "\n", + context_sparc->float_save.filler); + printf(" float_save.fsr = 0x%" PRIx64 "\n", + context_sparc->float_save.fsr); + break; + } + + case MD_CONTEXT_ARM: { + const MDRawContextARM* context_arm = GetContextARM(); + const char * const names[] = { + "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", + }; + printf("MDRawContextARM\n"); + printf(" context_flags = 0x%x\n", + context_arm->context_flags); + for (unsigned int ireg_index = 0; + ireg_index < MD_CONTEXT_ARM_GPR_COUNT; + ++ireg_index) { + printf(" %-3s = 0x%x\n", + names[ireg_index], context_arm->iregs[ireg_index]); + } + printf(" cpsr = 0x%x\n", context_arm->cpsr); + printf(" float_save.fpscr = 0x%" PRIx64 "\n", + context_arm->float_save.fpscr); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_ARM_FPR_COUNT; + ++fpr_index) { + printf(" float_save.regs[%2d] = 0x%" PRIx64 "\n", + fpr_index, context_arm->float_save.regs[fpr_index]); + } + for (unsigned int fpe_index = 0; + fpe_index < MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT; + ++fpe_index) { + printf(" float_save.extra[%2d] = 0x%" PRIx32 "\n", + fpe_index, context_arm->float_save.extra[fpe_index]); + } + + break; + } + + case MD_CONTEXT_ARM64: { + const MDRawContextARM64* context_arm64 = GetContextARM64(); + printf("MDRawContextARM64\n"); + printf(" context_flags = 0x%x\n", + context_arm64->context_flags); + for (unsigned int ireg_index = 0; + ireg_index < MD_CONTEXT_ARM64_GPR_COUNT; + ++ireg_index) { + printf(" iregs[%2d] = 0x%" PRIx64 "\n", + ireg_index, context_arm64->iregs[ireg_index]); + } + printf(" cpsr = 0x%x\n", context_arm64->cpsr); + printf(" float_save.fpsr = 0x%x\n", context_arm64->float_save.fpsr); + printf(" float_save.fpcr = 0x%x\n", context_arm64->float_save.fpcr); + + for (unsigned int freg_index = 0; + freg_index < MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT; + ++freg_index) { + uint128_struct fp_value = context_arm64->float_save.regs[freg_index]; + printf(" float_save.regs[%2d] = 0x%" PRIx64 "%" PRIx64 "\n", + freg_index, fp_value.high, fp_value.low); + } + + break; + } + + case MD_CONTEXT_MIPS: + case MD_CONTEXT_MIPS64: { + const MDRawContextMIPS* context_mips = GetContextMIPS(); + printf("MDRawContextMIPS\n"); + printf(" context_flags = 0x%x\n", + context_mips->context_flags); + for (int ireg_index = 0; + ireg_index < MD_CONTEXT_MIPS_GPR_COUNT; + ++ireg_index) { + printf(" iregs[%2d] = 0x%" PRIx64 "\n", + ireg_index, context_mips->iregs[ireg_index]); + } + printf(" mdhi = 0x%" PRIx64 "\n", + context_mips->mdhi); + printf(" mdlo = 0x%" PRIx64 "\n", + context_mips->mdhi); + for (int dsp_index = 0; + dsp_index < MD_CONTEXT_MIPS_DSP_COUNT; + ++dsp_index) { + printf(" hi[%1d] = 0x%" PRIx32 "\n", + dsp_index, context_mips->hi[dsp_index]); + printf(" lo[%1d] = 0x%" PRIx32 "\n", + dsp_index, context_mips->lo[dsp_index]); + } + printf(" dsp_control = 0x%" PRIx32 "\n", + context_mips->dsp_control); + printf(" epc = 0x%" PRIx64 "\n", + context_mips->epc); + printf(" badvaddr = 0x%" PRIx64 "\n", + context_mips->badvaddr); + printf(" status = 0x%" PRIx32 "\n", + context_mips->status); + printf(" cause = 0x%" PRIx32 "\n", + context_mips->cause); + + for (int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; + ++fpr_index) { + printf(" float_save.regs[%2d] = 0x%" PRIx64 "\n", + fpr_index, context_mips->float_save.regs[fpr_index]); + } + printf(" float_save.fpcsr = 0x%" PRIx32 "\n", + context_mips->float_save.fpcsr); + printf(" float_save.fir = 0x%" PRIx32 "\n", + context_mips->float_save.fir); + break; + } + + case MD_CONTEXT_RISCV: { + const MDRawContextRISCV* context_riscv = GetContextRISCV(); + printf("MDRawContextRISCV\n"); + printf(" context_flags = 0x%x\n", + context_riscv->context_flags); + + printf(" pc = 0x%" PRIx32 "\n", + context_riscv->pc); + printf(" ra = 0x%" PRIx32 "\n", + context_riscv->ra); + printf(" sp = 0x%" PRIx32 "\n", + context_riscv->sp); + printf(" gp = 0x%" PRIx32 "\n", + context_riscv->gp); + printf(" tp = 0x%" PRIx32 "\n", + context_riscv->tp); + printf(" t0 = 0x%" PRIx32 "\n", + context_riscv->t0); + printf(" t1 = 0x%" PRIx32 "\n", + context_riscv->t1); + printf(" t2 = 0x%" PRIx32 "\n", + context_riscv->t2); + printf(" s0 = 0x%" PRIx32 "\n", + context_riscv->s0); + printf(" s1 = 0x%" PRIx32 "\n", + context_riscv->s1); + printf(" a0 = 0x%" PRIx32 "\n", + context_riscv->a0); + printf(" a1 = 0x%" PRIx32 "\n", + context_riscv->a1); + printf(" a2 = 0x%" PRIx32 "\n", + context_riscv->a2); + printf(" a3 = 0x%" PRIx32 "\n", + context_riscv->a3); + printf(" a4 = 0x%" PRIx32 "\n", + context_riscv->a4); + printf(" a5 = 0x%" PRIx32 "\n", + context_riscv->a5); + printf(" a6 = 0x%" PRIx32 "\n", + context_riscv->a6); + printf(" a7 = 0x%" PRIx32 "\n", + context_riscv->a7); + printf(" s2 = 0x%" PRIx32 "\n", + context_riscv->s2); + printf(" s3 = 0x%" PRIx32 "\n", + context_riscv->s3); + printf(" s4 = 0x%" PRIx32 "\n", + context_riscv->s4); + printf(" s5 = 0x%" PRIx32 "\n", + context_riscv->s5); + printf(" s6 = 0x%" PRIx32 "\n", + context_riscv->s6); + printf(" s7 = 0x%" PRIx32 "\n", + context_riscv->s7); + printf(" s8 = 0x%" PRIx32 "\n", + context_riscv->s8); + printf(" s9 = 0x%" PRIx32 "\n", + context_riscv->s9); + printf(" s10 = 0x%" PRIx32 "\n", + context_riscv->s10); + printf(" s11 = 0x%" PRIx32 "\n", + context_riscv->s11); + printf(" t3 = 0x%" PRIx32 "\n", + context_riscv->t3); + printf(" t4 = 0x%" PRIx32 "\n", + context_riscv->t4); + printf(" t5 = 0x%" PRIx32 "\n", + context_riscv->t5); + printf(" t6 = 0x%" PRIx32 "\n", + context_riscv->t6); + +#if defined(__riscv) + for (unsigned int freg_index = 0; freg_index < MD_CONTEXT_RISCV_FPR_COUNT; + ++freg_index) { + // Breakpad only supports RISCV32 with 32 bit floating point. + uint32_t fp_value = context_riscv->fpregs[freg_index]; + printf(" fpregs[%2d] = 0x%" PRIx32 "\n", freg_index, + fp_value); + } + printf(" fcsr = 0x%" PRIx32 "\n", context_riscv->fcsr); +#endif + break; + } + + case MD_CONTEXT_RISCV64: { + const MDRawContextRISCV64* context_riscv64 = GetContextRISCV64(); + printf("MDRawContextRISCV64\n"); + printf(" context_flags = 0x%x\n", + context_riscv64->context_flags); + + printf(" pc = 0x%" PRIx64 "\n", + context_riscv64->pc); + printf(" ra = 0x%" PRIx64 "\n", + context_riscv64->ra); + printf(" sp = 0x%" PRIx64 "\n", + context_riscv64->sp); + printf(" gp = 0x%" PRIx64 "\n", + context_riscv64->gp); + printf(" tp = 0x%" PRIx64 "\n", + context_riscv64->tp); + printf(" t0 = 0x%" PRIx64 "\n", + context_riscv64->t0); + printf(" t1 = 0x%" PRIx64 "\n", + context_riscv64->t1); + printf(" t2 = 0x%" PRIx64 "\n", + context_riscv64->t2); + printf(" s0 = 0x%" PRIx64 "\n", + context_riscv64->s0); + printf(" s1 = 0x%" PRIx64 "\n", + context_riscv64->s1); + printf(" a0 = 0x%" PRIx64 "\n", + context_riscv64->a0); + printf(" a1 = 0x%" PRIx64 "\n", + context_riscv64->a1); + printf(" a2 = 0x%" PRIx64 "\n", + context_riscv64->a2); + printf(" a3 = 0x%" PRIx64 "\n", + context_riscv64->a3); + printf(" a4 = 0x%" PRIx64 "\n", + context_riscv64->a4); + printf(" a5 = 0x%" PRIx64 "\n", + context_riscv64->a5); + printf(" a6 = 0x%" PRIx64 "\n", + context_riscv64->a6); + printf(" a7 = 0x%" PRIx64 "\n", + context_riscv64->a7); + printf(" s2 = 0x%" PRIx64 "\n", + context_riscv64->s2); + printf(" s3 = 0x%" PRIx64 "\n", + context_riscv64->s3); + printf(" s4 = 0x%" PRIx64 "\n", + context_riscv64->s4); + printf(" s5 = 0x%" PRIx64 "\n", + context_riscv64->s5); + printf(" s6 = 0x%" PRIx64 "\n", + context_riscv64->s6); + printf(" s7 = 0x%" PRIx64 "\n", + context_riscv64->s7); + printf(" s8 = 0x%" PRIx64 "\n", + context_riscv64->s8); + printf(" s9 = 0x%" PRIx64 "\n", + context_riscv64->s9); + printf(" s10 = 0x%" PRIx64 "\n", + context_riscv64->s10); + printf(" s11 = 0x%" PRIx64 "\n", + context_riscv64->s11); + printf(" t3 = 0x%" PRIx64 "\n", + context_riscv64->t3); + printf(" t4 = 0x%" PRIx64 "\n", + context_riscv64->t4); + printf(" t5 = 0x%" PRIx64 "\n", + context_riscv64->t5); + printf(" t6 = 0x%" PRIx64 "\n", + context_riscv64->t6); + +#if defined(__riscv) + for (unsigned int freg_index = 0; freg_index < MD_CONTEXT_RISCV_FPR_COUNT; + ++freg_index) { + // Breakpad only supports RISCV64 with 64 bit floating point. + uint64_t fp_value = context_riscv64->fpregs[freg_index]; + printf(" fpregs[%2d] = 0x%" PRIx64 "\n", freg_index, + fp_value); + } + printf(" fcsr = 0x%" PRIx32 "\n", context_riscv64->fcsr); +#endif + break; + } + + default: { + break; + } + } +} + +} // namespace google_breakpad diff --git a/src/processor/dump_object.cc b/src/processor/dump_object.cc new file mode 100644 index 0000000..4050b11 --- /dev/null +++ b/src/processor/dump_object.cc @@ -0,0 +1,42 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dump_object.cc: A base class for all mini/micro dump object. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/dump_object.h" + +namespace google_breakpad { + +DumpObject::DumpObject() : valid_(false) { +} + +} // namespace google_breakpad diff --git a/src/processor/exploitability.cc b/src/processor/exploitability.cc new file mode 100644 index 0000000..89064c9 --- /dev/null +++ b/src/processor/exploitability.cc @@ -0,0 +1,123 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// exploitability_engine.cc: Generic exploitability engine. +// +// See exploitable_engine.h for documentation. +// +// Author: Cris Neckar + + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/exploitability.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/process_state.h" +#include "processor/exploitability_linux.h" +#include "processor/exploitability_win.h" +#include "processor/logging.h" + +namespace google_breakpad { + +Exploitability::Exploitability(Minidump *dump, + ProcessState *process_state) + : dump_(dump), + process_state_(process_state) {} + +ExploitabilityRating Exploitability::CheckExploitability() { + return CheckPlatformExploitability(); +} + +Exploitability *Exploitability::ExploitabilityForPlatform( + Minidump *dump, + ProcessState *process_state) { + return ExploitabilityForPlatform(dump, process_state, false); +} + +Exploitability *Exploitability::ExploitabilityForPlatform( + Minidump *dump, + ProcessState *process_state, + bool enable_objdump) { + Exploitability *platform_exploitability = NULL; + MinidumpSystemInfo *minidump_system_info = dump->GetSystemInfo(); + if (!minidump_system_info) + return NULL; + + const MDRawSystemInfo *raw_system_info = + minidump_system_info->system_info(); + if (!raw_system_info) + return NULL; + + switch (raw_system_info->platform_id) { + case MD_OS_WIN32_NT: + case MD_OS_WIN32_WINDOWS: { + platform_exploitability = new ExploitabilityWin(dump, process_state); + break; + } + case MD_OS_LINUX: { + platform_exploitability = new ExploitabilityLinux(dump, + process_state, + enable_objdump); + break; + } + case MD_OS_MAC_OS_X: + case MD_OS_IOS: + case MD_OS_UNIX: + case MD_OS_SOLARIS: + case MD_OS_ANDROID: + case MD_OS_PS3: + case MD_OS_FUCHSIA: + default: { + platform_exploitability = NULL; + break; + } + } + + BPLOG_IF(ERROR, !platform_exploitability) << + "No Exploitability module for platform: " << + process_state->system_info()->os; + return platform_exploitability; +} + +bool Exploitability::AddressIsAscii(uint64_t address) { + for (int i = 0; i < 8; i++) { + uint8_t byte = (address >> (8*i)) & 0xff; + if ((byte >= ' ' && byte <= '~') || byte == 0) + continue; + return false; + } + return true; +} + +} // namespace google_breakpad + diff --git a/src/processor/exploitability_linux.cc b/src/processor/exploitability_linux.cc new file mode 100644 index 0000000..76e78f4 --- /dev/null +++ b/src/processor/exploitability_linux.cc @@ -0,0 +1,320 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// exploitability_linux.cc: Linux specific exploitability engine. +// +// Provides a guess at the exploitability of the crash for the Linux +// platform given a minidump and process_state. +// +// Author: Matthew Riley + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/exploitability_linux.h" + +#include + +#include "google_breakpad/common/minidump_exception_linux.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/stack_frame.h" +#ifdef __linux__ +#include "processor/disassembler_objdump.h" +#endif +#include "processor/logging.h" + +namespace { + +// Prefixes for memory mapping names. +constexpr char kHeapPrefix[] = "[heap"; +constexpr char kStackPrefix[] = "[stack"; + +// This function in libc is called if the program was compiled with +// -fstack-protector and a function's stack canary changes. +constexpr char kStackCheckFailureFunction[] = "__stack_chk_fail"; + +// This function in libc is called if the program was compiled with +// -D_FORTIFY_SOURCE=2, a function like strcpy() is called, and the runtime +// can determine that the call would overflow the target buffer. +constexpr char kBoundsCheckFailureFunction[] = "__chk_fail"; + +} // namespace + +namespace google_breakpad { + +ExploitabilityLinux::ExploitabilityLinux(Minidump* dump, + ProcessState* process_state) + : Exploitability(dump, process_state), + enable_objdump_(false) { } + +ExploitabilityLinux::ExploitabilityLinux(Minidump* dump, + ProcessState* process_state, + bool enable_objdump) + : Exploitability(dump, process_state), + enable_objdump_(enable_objdump) { } + + +ExploitabilityRating ExploitabilityLinux::CheckPlatformExploitability() { + // Check the crashing thread for functions suggesting a buffer overflow or + // stack smash. + if (process_state_->requesting_thread() != -1) { + CallStack* crashing_thread = + process_state_->threads()->at(process_state_->requesting_thread()); + const vector& crashing_thread_frames = + *crashing_thread->frames(); + for (size_t i = 0; i < crashing_thread_frames.size(); ++i) { + if (crashing_thread_frames[i]->function_name == + kStackCheckFailureFunction) { + return EXPLOITABILITY_HIGH; + } + + if (crashing_thread_frames[i]->function_name == + kBoundsCheckFailureFunction) { + return EXPLOITABILITY_HIGH; + } + } + } + + // Getting exception data. (It should exist for all minidumps.) + MinidumpException* exception = dump_->GetException(); + if (exception == NULL) { + BPLOG(INFO) << "No exception record."; + return EXPLOITABILITY_ERR_PROCESSING; + } + const MDRawExceptionStream* raw_exception_stream = exception->exception(); + if (raw_exception_stream == NULL) { + BPLOG(INFO) << "No raw exception stream."; + return EXPLOITABILITY_ERR_PROCESSING; + } + + // Checking for benign exceptions that caused the crash. + if (this->BenignCrashTrigger(raw_exception_stream)) { + return EXPLOITABILITY_NONE; + } + + // Check if the instruction pointer is in a valid instruction region + // by finding if it maps to an executable part of memory. + uint64_t instruction_ptr = 0; + uint64_t stack_ptr = 0; + + const MinidumpContext* context = exception->GetContext(); + if (context == NULL) { + BPLOG(INFO) << "No exception context."; + return EXPLOITABILITY_ERR_PROCESSING; + } + + // Getting the instruction pointer. + if (!context->GetInstructionPointer(&instruction_ptr)) { + BPLOG(INFO) << "Failed to retrieve instruction pointer."; + return EXPLOITABILITY_ERR_PROCESSING; + } + + // Getting the stack pointer. + if (!context->GetStackPointer(&stack_ptr)) { + BPLOG(INFO) << "Failed to retrieve stack pointer."; + return EXPLOITABILITY_ERR_PROCESSING; + } + + // Checking for the instruction pointer in a valid instruction region, + // a misplaced stack pointer, and an executable stack or heap. + if (!this->InstructionPointerInCode(instruction_ptr) || + this->StackPointerOffStack(stack_ptr) || + this->ExecutableStackOrHeap()) { + return EXPLOITABILITY_HIGH; + } + + // Check for write to read only memory or invalid memory, shelling out + // to objdump is enabled. + if (enable_objdump_ && this->EndedOnIllegalWrite(instruction_ptr)) { + return EXPLOITABILITY_HIGH; + } + + // There was no strong evidence suggesting exploitability, but the minidump + // does not appear totally benign either. + return EXPLOITABILITY_INTERESTING; +} + +bool ExploitabilityLinux::EndedOnIllegalWrite(uint64_t instruction_ptr) { +#ifndef __linux__ + BPLOG(INFO) << "MinGW does not support fork and exec. Terminating method."; + return false; +#else + // Get memory region containing instruction pointer. + MinidumpMemoryList* memory_list = dump_->GetMemoryList(); + MinidumpMemoryRegion* memory_region = + memory_list ? + memory_list->GetMemoryRegionForAddress(instruction_ptr) : NULL; + if (!memory_region) { + BPLOG(INFO) << "No memory region around instruction pointer."; + return false; + } + + // Get exception data to find architecture. + string architecture = ""; + MinidumpException* exception = dump_->GetException(); + // This should never evaluate to true, since this should not be reachable + // without checking for exception data earlier. + if (!exception) { + BPLOG(INFO) << "No exception data."; + return false; + } + const MDRawExceptionStream* raw_exception_stream = exception->exception(); + const MinidumpContext* context = exception->GetContext(); + // This should not evaluate to true, for the same reason mentioned above. + if (!raw_exception_stream || !context) { + BPLOG(INFO) << "No exception or architecture data."; + return false; + } + + DisassemblerObjdump disassembler(context->GetContextCPU(), memory_region, + instruction_ptr); + if (!disassembler.IsValid()) { + BPLOG(INFO) << "Disassembling fault instruction failed."; + return false; + } + + // Check if the operation is a write to memory. + // First, the instruction must one that can write to memory. + auto instruction = disassembler.operation(); + if (!instruction.compare("mov") || !instruction.compare("inc") || + !instruction.compare("dec") || !instruction.compare("and") || + !instruction.compare("or") || !instruction.compare("xor") || + !instruction.compare("not") || !instruction.compare("neg") || + !instruction.compare("add") || !instruction.compare("sub") || + !instruction.compare("shl") || !instruction.compare("shr")) { + uint64_t write_address = 0; + + // Check that the destination is a memory address. CalculateDestAddress will + // return false if the destination is not a memory address. + if (!disassembler.CalculateDestAddress(*context, write_address)) { + return false; + } + + // If the program crashed as a result of a write, the destination of + // the write must have been an address that did not permit writing. + // However, if the address is under 4k, due to program protections, + // the crash does not suggest exploitability for writes with such a + // low target address. + return write_address > 4096; + } else { + return false; + } +#endif // __linux__ +} + +bool ExploitabilityLinux::StackPointerOffStack(uint64_t stack_ptr) { + MinidumpLinuxMapsList* linux_maps_list = dump_->GetLinuxMapsList(); + // Inconclusive if there are no mappings available. + if (!linux_maps_list) { + return false; + } + const MinidumpLinuxMaps* linux_maps = + linux_maps_list->GetLinuxMapsForAddress(stack_ptr); + // Checks if the stack pointer maps to a valid mapping and if the mapping + // is not the stack. If the mapping has no name, it is inconclusive whether + // it is off the stack. + return !linux_maps || (linux_maps->GetPathname().compare("") && + linux_maps->GetPathname().compare( + 0, strlen(kStackPrefix), kStackPrefix)); +} + +bool ExploitabilityLinux::ExecutableStackOrHeap() { + MinidumpLinuxMapsList* linux_maps_list = dump_->GetLinuxMapsList(); + if (linux_maps_list) { + for (size_t i = 0; i < linux_maps_list->get_maps_count(); i++) { + const MinidumpLinuxMaps* linux_maps = + linux_maps_list->GetLinuxMapsAtIndex(i); + // Check for executable stack or heap for each mapping. + if (linux_maps && (!linux_maps->GetPathname().compare( + 0, strlen(kStackPrefix), kStackPrefix) || + !linux_maps->GetPathname().compare( + 0, strlen(kHeapPrefix), kHeapPrefix)) && + linux_maps->IsExecutable()) { + return true; + } + } + } + return false; +} + +bool ExploitabilityLinux::InstructionPointerInCode(uint64_t instruction_ptr) { + // Get Linux memory mapping from /proc/self/maps. Checking whether the + // region the instruction pointer is in has executable permission can tell + // whether it is in a valid code region. If there is no mapping for the + // instruction pointer, it is indicative that the instruction pointer is + // not within a module, which implies that it is outside a valid area. + MinidumpLinuxMapsList* linux_maps_list = dump_->GetLinuxMapsList(); + const MinidumpLinuxMaps* linux_maps = + linux_maps_list ? + linux_maps_list->GetLinuxMapsForAddress(instruction_ptr) : NULL; + return linux_maps ? linux_maps->IsExecutable() : false; +} + +bool ExploitabilityLinux::BenignCrashTrigger( + const MDRawExceptionStream* raw_exception_stream) { + // Check the cause of crash. + // If the exception of the crash is a benign exception, + // it is probably not exploitable. + switch (raw_exception_stream->exception_record.exception_code) { + case MD_EXCEPTION_CODE_LIN_SIGHUP: + case MD_EXCEPTION_CODE_LIN_SIGINT: + case MD_EXCEPTION_CODE_LIN_SIGQUIT: + case MD_EXCEPTION_CODE_LIN_SIGTRAP: + case MD_EXCEPTION_CODE_LIN_SIGABRT: + case MD_EXCEPTION_CODE_LIN_SIGFPE: + case MD_EXCEPTION_CODE_LIN_SIGKILL: + case MD_EXCEPTION_CODE_LIN_SIGUSR1: + case MD_EXCEPTION_CODE_LIN_SIGUSR2: + case MD_EXCEPTION_CODE_LIN_SIGPIPE: + case MD_EXCEPTION_CODE_LIN_SIGALRM: + case MD_EXCEPTION_CODE_LIN_SIGTERM: + case MD_EXCEPTION_CODE_LIN_SIGCHLD: + case MD_EXCEPTION_CODE_LIN_SIGCONT: + case MD_EXCEPTION_CODE_LIN_SIGSTOP: + case MD_EXCEPTION_CODE_LIN_SIGTSTP: + case MD_EXCEPTION_CODE_LIN_SIGTTIN: + case MD_EXCEPTION_CODE_LIN_SIGTTOU: + case MD_EXCEPTION_CODE_LIN_SIGURG: + case MD_EXCEPTION_CODE_LIN_SIGXCPU: + case MD_EXCEPTION_CODE_LIN_SIGXFSZ: + case MD_EXCEPTION_CODE_LIN_SIGVTALRM: + case MD_EXCEPTION_CODE_LIN_SIGPROF: + case MD_EXCEPTION_CODE_LIN_SIGWINCH: + case MD_EXCEPTION_CODE_LIN_SIGIO: + case MD_EXCEPTION_CODE_LIN_SIGPWR: + case MD_EXCEPTION_CODE_LIN_SIGSYS: + case MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED: + return true; + default: + return false; + } +} + +} // namespace google_breakpad diff --git a/src/processor/exploitability_linux.h b/src/processor/exploitability_linux.h new file mode 100644 index 0000000..7603e45 --- /dev/null +++ b/src/processor/exploitability_linux.h @@ -0,0 +1,93 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// exploitability_linux.h: Linux specific exploitability engine. +// +// Provides a guess at the exploitability of the crash for the Linux +// platform given a minidump and process_state. +// +// Author: Matthew Riley + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_LINUX_H_ +#define GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_LINUX_H_ + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/exploitability.h" + +namespace google_breakpad { + +class ExploitabilityLinux : public Exploitability { + public: + ExploitabilityLinux(Minidump* dump, + ProcessState* process_state); + + // Parameters are the minidump to analyze, the object representing process + // state, and whether to enable objdump disassembly. + // Enabling objdump will allow exploitability analysis to call out to + // objdump for diassembly. It is used to check the identity of the + // instruction that caused the program to crash. If there are any + // portability concerns, this should not be enabled. + ExploitabilityLinux(Minidump* dump, + ProcessState* process_state, + bool enable_objdump); + + virtual ExploitabilityRating CheckPlatformExploitability(); + + private: + friend class ExploitabilityLinuxTest; + + // Takes the address of the instruction pointer and returns + // whether the instruction pointer lies in a valid instruction region. + bool InstructionPointerInCode(uint64_t instruction_ptr); + + // Checks the exception that triggered the creation of the + // minidump and reports whether the exception suggests no exploitability. + bool BenignCrashTrigger(const MDRawExceptionStream* raw_exception_stream); + + // This method checks if the crash occurred during a write to read-only or + // invalid memory. It does so by checking if the instruction at the + // instruction pointer is a write instruction, and if the target of the + // instruction is at a spot in memory that prohibits writes. + bool EndedOnIllegalWrite(uint64_t instruction_ptr); + + // Checks if the stack pointer points to a memory mapping that is not + // labelled as the stack. + bool StackPointerOffStack(uint64_t stack_ptr); + + // Checks if the stack or heap are marked executable according + // to the memory mappings. + bool ExecutableStackOrHeap(); + + // Whether this exploitability engine is permitted to shell out to objdump + // to disassemble raw bytes. + bool enable_objdump_; +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_LINUX_H_ diff --git a/src/processor/exploitability_unittest.cc b/src/processor/exploitability_unittest.cc new file mode 100644 index 0000000..09e4690 --- /dev/null +++ b/src/processor/exploitability_unittest.cc @@ -0,0 +1,182 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/minidump_processor.h" +#include "google_breakpad/processor/process_state.h" +#ifdef __linux__ +#include "processor/exploitability_linux.h" +#endif // __linux__ +#include "processor/simple_symbol_supplier.h" + +#ifdef __linux__ +namespace google_breakpad { +class ExploitabilityLinuxTestMinidumpContext : public MinidumpContext { + public: + explicit ExploitabilityLinuxTestMinidumpContext( + const MDRawContextAMD64& context) : MinidumpContext(NULL) { + valid_ = true; + SetContextAMD64(new MDRawContextAMD64(context)); + SetContextFlags(MD_CONTEXT_AMD64); + } +}; + +} // namespace google_breakpad +#endif // __linux__ + +namespace { + +using google_breakpad::BasicSourceLineResolver; +#ifdef __linux__ +using google_breakpad::ExploitabilityLinuxTestMinidumpContext; +#endif // __linux__ +using google_breakpad::MinidumpProcessor; +using google_breakpad::ProcessState; +using google_breakpad::SimpleSymbolSupplier; + +string TestDataDir() { + return string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/processor/testdata"; +} + +// Find the given dump file in /src/processor/testdata, process it, +// and get the exploitability rating. Returns EXPLOITABILITY_ERR_PROCESSING +// if the crash dump can't be processed. +google_breakpad::ExploitabilityRating +ExploitabilityFor(const string& filename) { + SimpleSymbolSupplier supplier(TestDataDir() + "/symbols"); + BasicSourceLineResolver resolver; + MinidumpProcessor processor(&supplier, &resolver, true); + processor.set_enable_objdump_for_exploitability(true); + ProcessState state; + + string minidump_file = TestDataDir() + "/" + filename; + + if (processor.Process(minidump_file, &state) != + google_breakpad::PROCESS_OK) { + return google_breakpad::EXPLOITABILITY_ERR_PROCESSING; + } + + return state.exploitability(); +} + +TEST(ExploitabilityTest, TestWindowsEngine) { + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("ascii_read_av.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("ascii_read_av_block_write.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("ascii_read_av_clobber_write.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("ascii_read_av_conditional.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("ascii_read_av_then_jmp.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("ascii_read_av_xchg_write.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("ascii_write_av.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("ascii_write_av_arg_to_call.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE, + ExploitabilityFor("null_read_av.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE, + ExploitabilityFor("null_write_av.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE, + ExploitabilityFor("stack_exhaustion.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("exec_av_on_stack.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_MEDIUM, + ExploitabilityFor("write_av_non_null.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW, + ExploitabilityFor("read_av_non_null.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW, + ExploitabilityFor("read_av_clobber_write.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW, + ExploitabilityFor("read_av_conditional.dmp")); +} + +TEST(ExploitabilityTest, TestLinuxEngine) { + ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING, + ExploitabilityFor("linux_null_read_av.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_overflow.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_stacksmash.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE, + ExploitabilityFor("linux_divide_by_zero.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING, + ExploitabilityFor("linux_null_dereference.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_jmp_to_0.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_outside_module.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE, + ExploitabilityFor("linux_raise_sigabrt.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING, + ExploitabilityFor("linux_inside_module_exe_region1.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING, + ExploitabilityFor("linux_inside_module_exe_region2.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING, + ExploitabilityFor("linux_stack_pointer_in_stack.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING, + ExploitabilityFor("linux_stack_pointer_in_stack_alt_name.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_stack_pointer_in_module.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_executable_stack.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_executable_heap.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_jmp_to_module_not_exe_region.dmp")); +#ifdef __linux__ + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_write_to_nonwritable_module.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_write_to_nonwritable_region_math.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_write_to_outside_module.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH, + ExploitabilityFor("linux_write_to_outside_module_via_math.dmp")); + ASSERT_EQ(google_breakpad::EXPLOITABILITY_INTERESTING, + ExploitabilityFor("linux_write_to_under_4k.dmp")); +#endif // __linux__ +} + +} // namespace diff --git a/src/processor/exploitability_win.cc b/src/processor/exploitability_win.cc new file mode 100644 index 0000000..b94e872 --- /dev/null +++ b/src/processor/exploitability_win.cc @@ -0,0 +1,285 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// exploitability_win.cc: Windows specific exploitability engine. +// +// Provides a guess at the exploitability of the crash for the Windows +// platform given a minidump and process_state. +// +// Author: Cris Neckar + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "processor/exploitability_win.h" + +#include "common/scoped_ptr.h" +#include "google_breakpad/common/minidump_exception_win32.h" +#include "google_breakpad/processor/minidump.h" +#include "processor/disassembler_x86.h" +#include "processor/logging.h" + +#include "third_party/libdisasm/libdis.h" + +namespace google_breakpad { + +// The cutoff that we use to judge if and address is likely an offset +// from various interesting addresses. +static const uint64_t kProbableNullOffset = 4096; +static const uint64_t kProbableStackOffset = 8192; + +// The various cutoffs for the different ratings. +static const size_t kHighCutoff = 100; +static const size_t kMediumCutoff = 80; +static const size_t kLowCutoff = 50; +static const size_t kInterestingCutoff = 25; + +// Predefined incremental values for conditional weighting. +static const size_t kTinyBump = 5; +static const size_t kSmallBump = 20; +static const size_t kMediumBump = 50; +static const size_t kLargeBump = 70; +static const size_t kHugeBump = 90; + +// The maximum number of bytes to disassemble past the program counter. +static const size_t kDisassembleBytesBeyondPC = 2048; + +ExploitabilityWin::ExploitabilityWin(Minidump* dump, + ProcessState* process_state) + : Exploitability(dump, process_state) { } + +ExploitabilityRating ExploitabilityWin::CheckPlatformExploitability() { + MinidumpException* exception = dump_->GetException(); + if (!exception) { + BPLOG(INFO) << "Minidump does not have exception record."; + return EXPLOITABILITY_ERR_PROCESSING; + } + + const MDRawExceptionStream* raw_exception = exception->exception(); + if (!raw_exception) { + BPLOG(INFO) << "Could not obtain raw exception info."; + return EXPLOITABILITY_ERR_PROCESSING; + } + + const MinidumpContext* context = exception->GetContext(); + if (!context) { + BPLOG(INFO) << "Could not obtain exception context."; + return EXPLOITABILITY_ERR_PROCESSING; + } + + MinidumpMemoryList* memory_list = dump_->GetMemoryList(); + bool memory_available = true; + if (!memory_list) { + BPLOG(INFO) << "Minidump memory segments not available."; + memory_available = false; + } + uint64_t address = process_state_->crash_address(); + uint32_t exception_code = raw_exception->exception_record.exception_code; + + uint32_t exploitability_weight = 0; + + uint64_t stack_ptr = 0; + uint64_t instruction_ptr = 0; + + // Getting the instruction pointer. + if (!context->GetInstructionPointer(&instruction_ptr)) { + return EXPLOITABILITY_ERR_PROCESSING; + } + + // Getting the stack pointer. + if (!context->GetStackPointer(&stack_ptr)) { + return EXPLOITABILITY_ERR_PROCESSING; + } + + // Check if we are executing on the stack. + if (instruction_ptr <= (stack_ptr + kProbableStackOffset) && + instruction_ptr >= (stack_ptr - kProbableStackOffset)) + exploitability_weight += kHugeBump; + + switch (exception_code) { + // This is almost certainly recursion. + case MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW: + exploitability_weight += kTinyBump; + break; + + // These exceptions tend to be benign and we can generally ignore them. + case MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO: + case MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW: + case MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO: + case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT: + case MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW: + case MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW: + case MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR: + exploitability_weight += kTinyBump; + break; + + // These exceptions will typically mean that we have jumped where we + // shouldn't. + case MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION: + case MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION: + case MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION: + exploitability_weight += kLargeBump; + break; + + // These represent bugs in exception handlers. + case MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION: + case MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION: + exploitability_weight += kSmallBump; + break; + + case MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION: + case MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN: + exploitability_weight += kHugeBump; + break; + + case MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION: + exploitability_weight += kLargeBump; + break; + + case MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION: + bool near_null = (address <= kProbableNullOffset); + bool bad_read = false; + bool bad_write = false; + if (raw_exception->exception_record.number_parameters >= 1) { + MDAccessViolationTypeWin av_type = + static_cast + (raw_exception->exception_record.exception_information[0]); + switch (av_type) { + case MD_ACCESS_VIOLATION_WIN_READ: + bad_read = true; + if (near_null) + exploitability_weight += kSmallBump; + else + exploitability_weight += kMediumBump; + break; + case MD_ACCESS_VIOLATION_WIN_WRITE: + bad_write = true; + if (near_null) + exploitability_weight += kSmallBump; + else + exploitability_weight += kHugeBump; + break; + case MD_ACCESS_VIOLATION_WIN_EXEC: + if (near_null) + exploitability_weight += kSmallBump; + else + exploitability_weight += kHugeBump; + break; + default: + BPLOG(INFO) << "Unrecognized access violation type."; + return EXPLOITABILITY_ERR_PROCESSING; + } + MinidumpMemoryRegion* instruction_region = 0; + if (memory_available) { + instruction_region = + memory_list->GetMemoryRegionForAddress(instruction_ptr); + } + if (!near_null && instruction_region && + context->GetContextCPU() == MD_CONTEXT_X86 && + (bad_read || bad_write)) { + // Perform checks related to memory around instruction pointer. + uint32_t memory_offset = + instruction_ptr - instruction_region->GetBase(); + uint32_t available_memory = + instruction_region->GetSize() - memory_offset; + available_memory = available_memory > kDisassembleBytesBeyondPC ? + kDisassembleBytesBeyondPC : available_memory; + if (available_memory) { + const uint8_t* raw_memory = + instruction_region->GetMemory() + memory_offset; + DisassemblerX86 disassembler(raw_memory, + available_memory, + instruction_ptr); + disassembler.NextInstruction(); + if (bad_read) + disassembler.setBadRead(); + else + disassembler.setBadWrite(); + if (disassembler.currentInstructionValid()) { + // Check if the faulting instruction falls into one of + // several interesting groups. + switch (disassembler.currentInstructionGroup()) { + case libdis::insn_controlflow: + exploitability_weight += kLargeBump; + break; + case libdis::insn_string: + exploitability_weight += kHugeBump; + break; + default: + break; + } + // Loop the disassembler through the code and check if it + // IDed any interesting conditions in the near future. + // Multiple flags may be set so treat each equally. + while (disassembler.NextInstruction() && + disassembler.currentInstructionValid() && + !disassembler.endOfBlock()) + continue; + if (disassembler.flags() & DISX86_BAD_BRANCH_TARGET) + exploitability_weight += kLargeBump; + if (disassembler.flags() & DISX86_BAD_ARGUMENT_PASSED) + exploitability_weight += kTinyBump; + if (disassembler.flags() & DISX86_BAD_WRITE) + exploitability_weight += kMediumBump; + if (disassembler.flags() & DISX86_BAD_BLOCK_WRITE) + exploitability_weight += kMediumBump; + if (disassembler.flags() & DISX86_BAD_READ) + exploitability_weight += kTinyBump; + if (disassembler.flags() & DISX86_BAD_BLOCK_READ) + exploitability_weight += kTinyBump; + if (disassembler.flags() & DISX86_BAD_COMPARISON) + exploitability_weight += kTinyBump; + } + } + } + if (!near_null && AddressIsAscii(address)) + exploitability_weight += kMediumBump; + } else { + BPLOG(INFO) << "Access violation type parameter missing."; + return EXPLOITABILITY_ERR_PROCESSING; + } + } + + // Based on the calculated weight we return a simplified classification. + BPLOG(INFO) << "Calculated exploitability weight: " << exploitability_weight; + if (exploitability_weight >= kHighCutoff) + return EXPLOITABILITY_HIGH; + if (exploitability_weight >= kMediumCutoff) + return EXPLOITABLITY_MEDIUM; + if (exploitability_weight >= kLowCutoff) + return EXPLOITABILITY_LOW; + if (exploitability_weight >= kInterestingCutoff) + return EXPLOITABILITY_INTERESTING; + + return EXPLOITABILITY_NONE; +} + +} // namespace google_breakpad diff --git a/src/processor/exploitability_win.h b/src/processor/exploitability_win.h new file mode 100644 index 0000000..52cff8b --- /dev/null +++ b/src/processor/exploitability_win.h @@ -0,0 +1,54 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// exploitability_win.h: Windows specific exploitability engine. +// +// Provides a guess at the exploitability of the crash for the Windows +// platform given a minidump and process_state. +// +// Author: Cris Neckar + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_WIN_H_ +#define GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_WIN_H_ + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/exploitability.h" + +namespace google_breakpad { + +class ExploitabilityWin : public Exploitability { + public: + ExploitabilityWin(Minidump *dump, + ProcessState *process_state); + + virtual ExploitabilityRating CheckPlatformExploitability(); +}; + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_WIN_H_ diff --git a/src/processor/fast_source_line_resolver.cc b/src/processor/fast_source_line_resolver.cc new file mode 100644 index 0000000..79803f2 --- /dev/null +++ b/src/processor/fast_source_line_resolver.cc @@ -0,0 +1,364 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// fast_source_line_resolver.cc: FastSourceLineResolver is a concrete class that +// implements SourceLineResolverInterface. Both FastSourceLineResolver and +// BasicSourceLineResolver inherit from SourceLineResolverBase class to reduce +// code redundancy. +// +// See fast_source_line_resolver.h and fast_source_line_resolver_types.h +// for more documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/fast_source_line_resolver.h" +#include "processor/fast_source_line_resolver_types.h" + +#include +#include +#include +#include + +#include "common/scoped_ptr.h" +#include "common/using_std_string.h" +#include "processor/logging.h" +#include "processor/module_factory.h" +#include "processor/simple_serializer-inl.h" + +using std::deque; +using std::unique_ptr; + +namespace google_breakpad { + +FastSourceLineResolver::FastSourceLineResolver() + : SourceLineResolverBase(new FastModuleFactory) { } + +bool FastSourceLineResolver::ShouldDeleteMemoryBufferAfterLoadModule() { + return false; +} + +void FastSourceLineResolver::Module::LookupAddress( + StackFrame* frame, + std::deque>* inlined_frames) const { + MemAddr address = frame->instruction - frame->module->base_address(); + + // First, look for a FUNC record that covers address. Use + // RetrieveNearestRange instead of RetrieveRange so that, if there + // is no such function, we can use the next function to bound the + // extent of the PUBLIC symbol we find, below. This does mean we + // need to check that address indeed falls within the function we + // find; do the range comparison in an overflow-friendly way. + scoped_ptr func(new Function); + const Function* func_ptr = 0; + scoped_ptr public_symbol(new PublicSymbol); + const PublicSymbol* public_symbol_ptr = 0; + MemAddr function_base; + MemAddr function_size; + MemAddr public_address; + + if (functions_.RetrieveNearestRange(address, func_ptr, + &function_base, &function_size) && + address >= function_base && address - function_base < function_size) { + func->CopyFrom(func_ptr); + frame->function_name = func->name; + frame->function_base = frame->module->base_address() + function_base; + frame->is_multiple = func->is_multiple; + + scoped_ptr line(new Line); + const Line* line_ptr = 0; + MemAddr line_base; + if (func->lines.RetrieveRange(address, line_ptr, &line_base, NULL)) { + line->CopyFrom(line_ptr); + FileMap::iterator it = files_.find(line->source_file_id); + if (it != files_.end()) { + frame->source_file_name = + files_.find(line->source_file_id).GetValuePtr(); + } + frame->source_line = line->line; + frame->source_line_base = frame->module->base_address() + line_base; + } + // Check if this is inlined function call. + if (inlined_frames) { + ConstructInlineFrames(frame, address, func->inlines, inlined_frames); + } + } else if (public_symbols_.Retrieve(address, + public_symbol_ptr, &public_address) && + (!func_ptr || public_address > function_base)) { + public_symbol->CopyFrom(public_symbol_ptr); + frame->function_name = public_symbol->name; + frame->function_base = frame->module->base_address() + public_address; + frame->is_multiple = public_symbol->is_multiple; + } +} + +void FastSourceLineResolver::Module::ConstructInlineFrames( + StackFrame* frame, + MemAddr address, + const StaticContainedRangeMap& inline_map, + std::deque>* inlined_frames) const { + std::vector inline_ptrs; + if (!inline_map.RetrieveRanges(address, inline_ptrs)) { + return; + } + + for (const char* inline_ptr : inline_ptrs) { + scoped_ptr in(new Inline); + in->CopyFrom(inline_ptr); + unique_ptr new_frame = + unique_ptr(new StackFrame(*frame)); + auto origin_iter = inline_origins_.find(in->origin_id); + if (origin_iter != inline_origins_.end()) { + scoped_ptr origin(new InlineOrigin); + origin->CopyFrom(origin_iter.GetValuePtr()); + new_frame->function_name = origin->name; + } else { + new_frame->function_name = ""; + } + + // Store call site file and line in current frame, which will be updated + // later. + new_frame->source_line = in->call_site_line; + if (in->has_call_site_file_id) { + auto file_iter = files_.find(in->call_site_file_id); + if (file_iter != files_.end()) { + new_frame->source_file_name = file_iter.GetValuePtr(); + } + } + + // Use the starting adress of the inlined range as inlined function base. + new_frame->function_base = new_frame->module->base_address(); + for (const auto& range : in->inline_ranges) { + if (address >= range.first && address < range.first + range.second) { + new_frame->function_base += range.first; + break; + } + } + new_frame->trust = StackFrame::FRAME_TRUST_INLINE; + + // The inlines vector has an order from innermost entry to outermost entry. + // By push_back, we will have inlined_frames with the same order. + inlined_frames->push_back(std::move(new_frame)); + } + + // Update the source file and source line for each inlined frame. + if (!inlined_frames->empty()) { + string parent_frame_source_file_name = frame->source_file_name; + int parent_frame_source_line = frame->source_line; + frame->source_file_name = inlined_frames->back()->source_file_name; + frame->source_line = inlined_frames->back()->source_line; + for (unique_ptr& inlined_frame : *inlined_frames) { + std::swap(inlined_frame->source_file_name, parent_frame_source_file_name); + std::swap(inlined_frame->source_line, parent_frame_source_line); + } + } +} + +// WFI: WindowsFrameInfo. +// Returns a WFI object reading from a raw memory chunk of data +WindowsFrameInfo FastSourceLineResolver::CopyWFI(const char* raw) { + const WindowsFrameInfo::StackInfoTypes type = + static_cast( + *reinterpret_cast(raw)); + + // The first 8 bytes of int data are unused. + // They correspond to "StackInfoTypes type_;" and "int valid;" + // data member of WFI. + const uint32_t* para_uint32 = reinterpret_cast( + raw + 2 * sizeof(int32_t)); + + uint32_t prolog_size = para_uint32[0];; + uint32_t epilog_size = para_uint32[1]; + uint32_t parameter_size = para_uint32[2]; + uint32_t saved_register_size = para_uint32[3]; + uint32_t local_size = para_uint32[4]; + uint32_t max_stack_size = para_uint32[5]; + const char* boolean = reinterpret_cast(para_uint32 + 6); + bool allocates_base_pointer = (*boolean != 0); + string program_string = boolean + 1; + + return WindowsFrameInfo(type, + prolog_size, + epilog_size, + parameter_size, + saved_register_size, + local_size, + max_stack_size, + allocates_base_pointer, + program_string); +} + +// Loads a map from the given buffer in char* type. +// Does NOT take ownership of mem_buffer. +// In addition, treat mem_buffer as const char*. +bool FastSourceLineResolver::Module::LoadMapFromMemory( + char* memory_buffer, + size_t memory_buffer_size) { + if (!memory_buffer) return false; + + // Read the "is_corrupt" flag. + const char* mem_buffer = memory_buffer; + mem_buffer = SimpleSerializer::Read(mem_buffer, &is_corrupt_); + + const uint32_t* map_sizes = reinterpret_cast(mem_buffer); + + unsigned int header_size = kNumberMaps_ * sizeof(unsigned int); + + // offsets[]: an array of offset addresses (with respect to mem_buffer), + // for each "Static***Map" component of Module. + // "Static***Map": static version of std::map or map wrapper, i.e., StaticMap, + // StaticAddressMap, StaticContainedRangeMap, and StaticRangeMap. + unsigned int offsets[kNumberMaps_]; + offsets[0] = header_size; + for (int i = 1; i < kNumberMaps_; ++i) { + offsets[i] = offsets[i - 1] + map_sizes[i - 1]; + } + unsigned int expected_size = sizeof(bool) + offsets[kNumberMaps_ - 1] + + map_sizes[kNumberMaps_ - 1] + 1; + if (expected_size != memory_buffer_size && + // Allow for having an extra null terminator. + expected_size != memory_buffer_size - 1) { + // This could either be a random corruption or the serialization format was + // changed without updating the version in kSerializedBreakpadFileExtension. + BPLOG(ERROR) << "Memory buffer is either corrupt or an unsupported version" + << ", expected size: " << expected_size + << ", actual size: " << memory_buffer_size; + return false; + } + BPLOG(INFO) << "Memory buffer size looks good, size: " << memory_buffer_size; + + // Use pointers to construct Static*Map data members in Module: + int map_id = 0; + files_ = StaticMap(mem_buffer + offsets[map_id++]); + functions_ = + StaticRangeMap(mem_buffer + offsets[map_id++]); + public_symbols_ = + StaticAddressMap(mem_buffer + offsets[map_id++]); + for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i) { + windows_frame_info_[i] = + StaticContainedRangeMap(mem_buffer + offsets[map_id++]); + } + + cfi_initial_rules_ = + StaticRangeMap(mem_buffer + offsets[map_id++]); + cfi_delta_rules_ = StaticMap(mem_buffer + offsets[map_id++]); + inline_origins_ = StaticMap(mem_buffer + offsets[map_id++]); + return true; +} + +WindowsFrameInfo* FastSourceLineResolver::Module::FindWindowsFrameInfo( + const StackFrame* frame) const { + MemAddr address = frame->instruction - frame->module->base_address(); + scoped_ptr result(new WindowsFrameInfo()); + + // We only know about WindowsFrameInfo::STACK_INFO_FRAME_DATA and + // WindowsFrameInfo::STACK_INFO_FPO. Prefer them in this order. + // WindowsFrameInfo::STACK_INFO_FRAME_DATA is the newer type that + // includes its own program string. + // WindowsFrameInfo::STACK_INFO_FPO is the older type + // corresponding to the FPO_DATA struct. See stackwalker_x86.cc. + const char* frame_info_ptr; + if ((windows_frame_info_[WindowsFrameInfo::STACK_INFO_FRAME_DATA] + .RetrieveRange(address, frame_info_ptr)) + || (windows_frame_info_[WindowsFrameInfo::STACK_INFO_FPO] + .RetrieveRange(address, frame_info_ptr))) { + result->CopyFrom(CopyWFI(frame_info_ptr)); + return result.release(); + } + + // Even without a relevant STACK line, many functions contain + // information about how much space their parameters consume on the + // stack. Use RetrieveNearestRange instead of RetrieveRange, so that + // we can use the function to bound the extent of the PUBLIC symbol, + // below. However, this does mean we need to check that ADDRESS + // falls within the retrieved function's range; do the range + // comparison in an overflow-friendly way. + scoped_ptr function(new Function); + const Function* function_ptr = 0; + MemAddr function_base, function_size; + if (functions_.RetrieveNearestRange(address, function_ptr, + &function_base, &function_size) && + address >= function_base && address - function_base < function_size) { + function->CopyFrom(function_ptr); + result->parameter_size = function->parameter_size; + result->valid |= WindowsFrameInfo::VALID_PARAMETER_SIZE; + return result.release(); + } + + // PUBLIC symbols might have a parameter size. Use the function we + // found above to limit the range the public symbol covers. + scoped_ptr public_symbol(new PublicSymbol); + const PublicSymbol* public_symbol_ptr = 0; + MemAddr public_address; + if (public_symbols_.Retrieve(address, public_symbol_ptr, &public_address) && + (!function_ptr || public_address > function_base)) { + public_symbol->CopyFrom(public_symbol_ptr); + result->parameter_size = public_symbol->parameter_size; + } + + return NULL; +} + +CFIFrameInfo* FastSourceLineResolver::Module::FindCFIFrameInfo( + const StackFrame* frame) const { + MemAddr address = frame->instruction - frame->module->base_address(); + MemAddr initial_base, initial_size; + const char* initial_rules = NULL; + + // Find the initial rule whose range covers this address. That + // provides an initial set of register recovery rules. Then, walk + // forward from the initial rule's starting address to frame's + // instruction address, applying delta rules. + if (!cfi_initial_rules_.RetrieveRange(address, initial_rules, + &initial_base, &initial_size)) { + return NULL; + } + + // Create a frame info structure, and populate it with the rules from + // the STACK CFI INIT record. + scoped_ptr rules(new CFIFrameInfo()); + if (!ParseCFIRuleSet(initial_rules, rules.get())) + return NULL; + + // Find the first delta rule that falls within the initial rule's range. + StaticMap::iterator delta = + cfi_delta_rules_.lower_bound(initial_base); + + // Apply delta rules up to and including the frame's address. + while (delta != cfi_delta_rules_.end() && delta.GetKey() <= address) { + ParseCFIRuleSet(delta.GetValuePtr(), rules.get()); + delta++; + } + + return rules.release(); +} + +} // namespace google_breakpad diff --git a/src/processor/fast_source_line_resolver_types.h b/src/processor/fast_source_line_resolver_types.h new file mode 100644 index 0000000..75b9004 --- /dev/null +++ b/src/processor/fast_source_line_resolver_types.h @@ -0,0 +1,249 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// fast_source_line_resolver_types.h: definition of nested classes/structs in +// FastSourceLineResolver. It moves the definitions out of +// fast_source_line_resolver.cc, so that other classes could have access +// to these private nested types without including fast_source_line_resolver.cc +// +// Author: lambxsy@google.com (Siyang Xie) + +#ifndef PROCESSOR_FAST_SOURCE_LINE_RESOLVER_TYPES_H__ +#define PROCESSOR_FAST_SOURCE_LINE_RESOLVER_TYPES_H__ + +#include +#include +#include + +#include "google_breakpad/processor/fast_source_line_resolver.h" +#include "google_breakpad/processor/stack_frame.h" +#include "processor/cfi_frame_info.h" +#include "processor/contained_range_map.h" +#include "processor/simple_serializer-inl.h" +#include "processor/source_line_resolver_base_types.h" +#include "processor/static_address_map-inl.h" +#include "processor/static_contained_range_map-inl.h" +#include "processor/static_map.h" +#include "processor/static_range_map-inl.h" +#include "processor/windows_frame_info.h" + +namespace google_breakpad { + +#define DESERIALIZE(raw_ptr, field) \ + field = *(reinterpret_cast(raw_ptr)); \ + raw_ptr += sizeof(field); + +struct FastSourceLineResolver::Line : public SourceLineResolverBase::Line { + void CopyFrom(const Line* line_ptr) { + const char* raw = reinterpret_cast(line_ptr); + CopyFrom(raw); + } + + // De-serialize the memory data of a Line. + void CopyFrom(const char* raw) { + DESERIALIZE(raw, address); + DESERIALIZE(raw, size); + DESERIALIZE(raw, source_file_id); + DESERIALIZE(raw, line); + } +}; + +struct FastSourceLineResolver::Function : +public SourceLineResolverBase::Function { + void CopyFrom(const Function* func_ptr) { + const char* raw = reinterpret_cast(func_ptr); + CopyFrom(raw); + } + + // De-serialize the memory data of a Function. + void CopyFrom(const char* raw) { + size_t name_size = strlen(raw) + 1; + name = raw; + raw += name_size; + DESERIALIZE(raw, address); + DESERIALIZE(raw, size); + DESERIALIZE(raw, parameter_size); + raw = SimpleSerializer::Read(raw, &is_multiple); + int32_t inline_size; + DESERIALIZE(raw, inline_size); + inlines = StaticContainedRangeMap(raw); + lines = StaticRangeMap(raw + inline_size); + } + + StaticContainedRangeMap inlines; + StaticRangeMap lines; +}; + +struct FastSourceLineResolver::Inline : public SourceLineResolverBase::Inline { + void CopyFrom(const Inline* inline_ptr) { + const char* raw = reinterpret_cast(inline_ptr); + CopyFrom(raw); + } + + // De-serialize the memory data of a Inline. + void CopyFrom(const char* raw) { + DESERIALIZE(raw, has_call_site_file_id); + DESERIALIZE(raw, inline_nest_level); + DESERIALIZE(raw, call_site_line); + DESERIALIZE(raw, call_site_file_id); + DESERIALIZE(raw, origin_id); + uint32_t inline_range_size; + DESERIALIZE(raw, inline_range_size); + for (size_t i = 0; i < inline_range_size; i += 2) { + std::pair range; + DESERIALIZE(raw, range.first); + DESERIALIZE(raw, range.second); + inline_ranges.push_back(range); + } + } +}; + +struct FastSourceLineResolver::InlineOrigin + : public SourceLineResolverBase::InlineOrigin { + void CopyFrom(const InlineOrigin* origin_ptr) { + const char* raw = reinterpret_cast(origin_ptr); + CopyFrom(raw); + } + + // De-serialize the memory data of a Line. + void CopyFrom(const char* raw) { + DESERIALIZE(raw, has_file_id); + DESERIALIZE(raw, source_file_id); + name = raw; + } +}; + +struct FastSourceLineResolver::PublicSymbol : +public SourceLineResolverBase::PublicSymbol { + void CopyFrom(const PublicSymbol* public_symbol_ptr) { + const char* raw = reinterpret_cast(public_symbol_ptr); + CopyFrom(raw); + } + + // De-serialize the memory data of a PublicSymbol. + void CopyFrom(const char* raw) { + size_t name_size = strlen(raw) + 1; + name = raw; + raw += name_size; + DESERIALIZE(raw, address); + DESERIALIZE(raw, parameter_size); + raw = SimpleSerializer::Read(raw, &is_multiple); + } +}; + +#undef DESERIALIZE + +class FastSourceLineResolver::Module: public SourceLineResolverBase::Module { + public: + explicit Module(const string& name) : name_(name), is_corrupt_(false) { } + virtual ~Module() { } + + // Looks up the given relative address, and fills the StackFrame struct + // with the result. + virtual void LookupAddress( + StackFrame* frame, + std::deque>* inlined_frames) const; + + // Construct inlined frames for |frame| and store them in |inline_frames|. + // |frame|'s source line and source file name may be updated if an inlined + // frame is found inside |frame|. As a result, the innermost inlined frame + // will be the first one in |inline_frames|. + virtual void ConstructInlineFrames( + StackFrame* frame, + MemAddr address, + const StaticContainedRangeMap& inline_map, + std::deque>* inlined_frames) const; + + // Loads a map from the given buffer in char* type. + virtual bool LoadMapFromMemory(char* memory_buffer, + size_t memory_buffer_size); + + // Tells whether the loaded symbol data is corrupt. Return value is + // undefined, if the symbol data hasn't been loaded yet. + virtual bool IsCorrupt() const { return is_corrupt_; } + + // If Windows stack walking information is available covering ADDRESS, + // return a WindowsFrameInfo structure describing it. If the information + // is not available, returns NULL. A NULL return value does not indicate + // an error. The caller takes ownership of any returned WindowsFrameInfo + // object. + virtual WindowsFrameInfo* FindWindowsFrameInfo(const StackFrame* frame) const; + + // If CFI stack walking information is available covering ADDRESS, + // return a CFIFrameInfo structure describing it. If the information + // is not available, return NULL. The caller takes ownership of any + // returned CFIFrameInfo object. + virtual CFIFrameInfo* FindCFIFrameInfo(const StackFrame* frame) const; + + // Number of serialized map components of Module. + static const int kNumberMaps_ = 6 + WindowsFrameInfo::STACK_INFO_LAST; + + private: + friend class FastSourceLineResolver; + friend class ModuleComparer; + typedef StaticMap FileMap; + + string name_; + StaticMap files_; + StaticRangeMap functions_; + StaticAddressMap public_symbols_; + bool is_corrupt_; + + // Each element in the array is a ContainedRangeMap for a type + // listed in WindowsFrameInfoTypes. These are split by type because + // there may be overlaps between maps of different types, but some + // information is only available as certain types. + StaticContainedRangeMap + windows_frame_info_[WindowsFrameInfo::STACK_INFO_LAST]; + + // DWARF CFI stack walking data. The Module stores the initial rule sets + // and rule deltas as strings, just as they appear in the symbol file: + // although the file may contain hundreds of thousands of STACK CFI + // records, walking a stack will only ever use a few of them, so it's + // best to delay parsing a record until it's actually needed. + // + // STACK CFI INIT records: for each range, an initial set of register + // recovery rules. The RangeMap's itself gives the starting and ending + // addresses. + StaticRangeMap cfi_initial_rules_; + + // STACK CFI records: at a given address, the changes to the register + // recovery rules that take effect at that address. The map key is the + // starting address; the ending address is the key of the next entry in + // this map, or the end of the range as given by the cfi_initial_rules_ + // entry (which FindCFIFrameInfo looks up first). + StaticMap cfi_delta_rules_; + + // INLINE_ORIGIN records: used as a function name string pool for INLINE + // records. + StaticMap inline_origins_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_FAST_SOURCE_LINE_RESOLVER_TYPES_H__ diff --git a/src/processor/fast_source_line_resolver_unittest.cc b/src/processor/fast_source_line_resolver_unittest.cc new file mode 100644 index 0000000..08340c1 --- /dev/null +++ b/src/processor/fast_source_line_resolver_unittest.cc @@ -0,0 +1,603 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// fast_source_line_resolver_unittest.cc: Unit tests for FastSourceLineResolver. +// Two different approaches for testing fast source line resolver: +// First, use the same unit test data for basic source line resolver. +// Second, read data from symbol files, load them as basic modules, and then +// serialize them and load the serialized data as fast modules. Then compare +// modules to assure the fast module contains exactly the same data as +// basic module. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/stack_frame.h" +#include "google_breakpad/processor/memory_region.h" +#include "processor/logging.h" +#include "processor/module_serializer.h" +#include "processor/module_comparer.h" + +namespace { + +using google_breakpad::SourceLineResolverBase; +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::FastSourceLineResolver; +using google_breakpad::ModuleSerializer; +using google_breakpad::ModuleComparer; +using google_breakpad::CFIFrameInfo; +using google_breakpad::CodeModule; +using google_breakpad::MemoryRegion; +using google_breakpad::StackFrame; +using google_breakpad::WindowsFrameInfo; +using google_breakpad::scoped_ptr; + +class TestCodeModule : public CodeModule { + public: + explicit TestCodeModule(string code_file) : code_file_(code_file) {} + virtual ~TestCodeModule() {} + + virtual uint64_t base_address() const { return 0; } + virtual uint64_t size() const { return 0xb000; } + virtual string code_file() const { return code_file_; } + virtual string code_identifier() const { return ""; } + virtual string debug_file() const { return ""; } + virtual string debug_identifier() const { return ""; } + virtual string version() const { return ""; } + virtual CodeModule* Copy() const { + return new TestCodeModule(code_file_); + } + virtual bool is_unloaded() const { return false; } + virtual uint64_t shrink_down_delta() const { return 0; } + virtual void SetShrinkDownDelta(uint64_t shrink_down_delta) {} + + private: + string code_file_; +}; + +// A mock memory region object, for use by the STACK CFI tests. +class MockMemoryRegion: public MemoryRegion { + uint64_t GetBase() const { return 0x10000; } + uint32_t GetSize() const { return 0x01000; } + bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const { + *value = address & 0xff; + return true; + } + bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const { + *value = address & 0xffff; + return true; + } + bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const { + switch (address) { + case 0x10008: *value = 0x98ecadc3; break; // saved %ebx + case 0x1000c: *value = 0x878f7524; break; // saved %esi + case 0x10010: *value = 0x6312f9a5; break; // saved %edi + case 0x10014: *value = 0x10038; break; // caller's %ebp + case 0x10018: *value = 0xf6438648; break; // return address + default: *value = 0xdeadbeef; break; // junk + } + return true; + } + bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const { + *value = address; + return true; + } + void Print() const { + assert(false); + } +}; + +// Verify that, for every association in ACTUAL, EXPECTED has the same +// association. (That is, ACTUAL's associations should be a subset of +// EXPECTED's.) Also verify that ACTUAL has associations for ".ra" and +// ".cfa". +static bool VerifyRegisters( + const char* file, int line, + const CFIFrameInfo::RegisterValueMap& expected, + const CFIFrameInfo::RegisterValueMap& actual) { + CFIFrameInfo::RegisterValueMap::const_iterator a; + a = actual.find(".cfa"); + if (a == actual.end()) + return false; + a = actual.find(".ra"); + if (a == actual.end()) + return false; + for (a = actual.begin(); a != actual.end(); a++) { + CFIFrameInfo::RegisterValueMap::const_iterator e = + expected.find(a->first); + if (e == expected.end()) { + fprintf(stderr, "%s:%d: unexpected register '%s' recovered, value 0x%x\n", + file, line, a->first.c_str(), a->second); + return false; + } + if (e->second != a->second) { + fprintf(stderr, + "%s:%d: register '%s' recovered value was 0x%x, expected 0x%x\n", + file, line, a->first.c_str(), a->second, e->second); + return false; + } + // Don't complain if this doesn't recover all registers. Although + // the DWARF spec says that unmentioned registers are undefined, + // GCC uses omission to mean that they are unchanged. + } + return true; +} + +static bool VerifyEmpty(const StackFrame& frame) { + if (frame.function_name.empty() && + frame.source_file_name.empty() && + frame.source_line == 0) + return true; + return false; +} + +static void ClearSourceLineInfo(StackFrame* frame) { + frame->function_name.clear(); + frame->module = NULL; + frame->source_file_name.clear(); + frame->source_line = 0; +} + +class TestFastSourceLineResolver : public ::testing::Test { + public: + void SetUp() { + testdata_dir = string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/processor/testdata"; + } + + string symbol_file(int file_index) { + std::stringstream ss; + ss << testdata_dir << "/module" << file_index << ".out"; + return ss.str(); + } + + ModuleSerializer serializer; + BasicSourceLineResolver basic_resolver; + FastSourceLineResolver fast_resolver; + ModuleComparer module_comparer; + + string testdata_dir; +}; + +// Test adapted from basic_source_line_resolver_unittest. +TEST_F(TestFastSourceLineResolver, TestLoadAndResolve) { + TestCodeModule module1("module1"); + ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1))); + ASSERT_TRUE(basic_resolver.HasModule(&module1)); + // Convert module1 to fast_module: + ASSERT_TRUE(serializer.ConvertOneModule( + module1.code_file(), &basic_resolver, &fast_resolver)); + ASSERT_TRUE(fast_resolver.HasModule(&module1)); + + TestCodeModule module2("module2"); + ASSERT_TRUE(basic_resolver.LoadModule(&module2, symbol_file(2))); + ASSERT_TRUE(basic_resolver.HasModule(&module2)); + // Convert module2 to fast_module: + ASSERT_TRUE(serializer.ConvertOneModule( + module2.code_file(), &basic_resolver, &fast_resolver)); + ASSERT_TRUE(fast_resolver.HasModule(&module2)); + + StackFrame frame; + scoped_ptr windows_frame_info; + scoped_ptr cfi_frame_info; + frame.instruction = 0x1000; + frame.module = NULL; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_FALSE(frame.module); + ASSERT_TRUE(frame.function_name.empty()); + ASSERT_EQ(frame.function_base, 0U); + ASSERT_TRUE(frame.source_file_name.empty()); + ASSERT_EQ(frame.source_line, 0); + ASSERT_EQ(frame.source_line_base, 0U); + ASSERT_EQ(frame.is_multiple, false); + + frame.module = &module1; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Function1_1"); + ASSERT_TRUE(frame.module); + ASSERT_EQ(frame.module->code_file(), "module1"); + ASSERT_EQ(frame.function_base, 0x1000U); + ASSERT_EQ(frame.source_file_name, "file1_1.cc"); + ASSERT_EQ(frame.source_line, 44); + ASSERT_EQ(frame.source_line_base, 0x1000U); + ASSERT_EQ(frame.is_multiple, true); + windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); + ASSERT_TRUE(windows_frame_info.get()); + ASSERT_FALSE(windows_frame_info->allocates_base_pointer); + ASSERT_EQ(windows_frame_info->program_string, + "$eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ ="); + + ClearSourceLineInfo(&frame); + frame.instruction = 0x800; + frame.module = &module1; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_TRUE(VerifyEmpty(frame)); + windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); + ASSERT_FALSE(windows_frame_info.get()); + + frame.instruction = 0x1280; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Function1_3"); + ASSERT_TRUE(frame.source_file_name.empty()); + ASSERT_EQ(frame.source_line, 0); + windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); + ASSERT_TRUE(windows_frame_info.get()); + ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_UNKNOWN); + ASSERT_FALSE(windows_frame_info->allocates_base_pointer); + ASSERT_TRUE(windows_frame_info->program_string.empty()); + + frame.instruction = 0x1380; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Function1_4"); + ASSERT_TRUE(frame.source_file_name.empty()); + ASSERT_EQ(frame.source_line, 0); + windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); + ASSERT_TRUE(windows_frame_info.get()); + ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA); + ASSERT_FALSE(windows_frame_info->allocates_base_pointer); + ASSERT_FALSE(windows_frame_info->program_string.empty()); + + frame.instruction = 0x2000; + windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); + ASSERT_FALSE(windows_frame_info.get()); + + // module1 has STACK CFI records covering 3d40..3def; + // module2 has STACK CFI records covering 3df0..3e9f; + // check that FindCFIFrameInfo doesn't claim to find any outside those ranges. + frame.instruction = 0x3d3f; + frame.module = &module1; + cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); + ASSERT_FALSE(cfi_frame_info.get()); + + frame.instruction = 0x3e9f; + frame.module = &module1; + cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); + ASSERT_FALSE(cfi_frame_info.get()); + + CFIFrameInfo::RegisterValueMap current_registers; + CFIFrameInfo::RegisterValueMap caller_registers; + CFIFrameInfo::RegisterValueMap expected_caller_registers; + MockMemoryRegion memory; + + // Regardless of which instruction evaluation takes place at, it + // should produce the same values for the caller's registers. + expected_caller_registers[".cfa"] = 0x1001c; + expected_caller_registers[".ra"] = 0xf6438648; + expected_caller_registers["$ebp"] = 0x10038; + expected_caller_registers["$ebx"] = 0x98ecadc3; + expected_caller_registers["$esi"] = 0x878f7524; + expected_caller_registers["$edi"] = 0x6312f9a5; + + frame.instruction = 0x3d40; + frame.module = &module1; + current_registers.clear(); + current_registers["$esp"] = 0x10018; + current_registers["$ebp"] = 0x10038; + current_registers["$ebx"] = 0x98ecadc3; + current_registers["$esi"] = 0x878f7524; + current_registers["$edi"] = 0x6312f9a5; + cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers)); + + frame.instruction = 0x3d41; + current_registers["$esp"] = 0x10014; + cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers)); + + frame.instruction = 0x3d43; + current_registers["$ebp"] = 0x10014; + cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers); + + frame.instruction = 0x3d54; + current_registers["$ebx"] = 0x6864f054U; + cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers); + + frame.instruction = 0x3d5a; + current_registers["$esi"] = 0x6285f79aU; + cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers); + + frame.instruction = 0x3d84; + current_registers["$edi"] = 0x64061449U; + cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); + ASSERT_TRUE(cfi_frame_info.get()); + ASSERT_TRUE(cfi_frame_info.get() + ->FindCallerRegs(current_registers, memory, + &caller_registers)); + VerifyRegisters(__FILE__, __LINE__, + expected_caller_registers, caller_registers); + + frame.instruction = 0x2900; + frame.module = &module1; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, string("PublicSymbol")); + EXPECT_EQ(frame.is_multiple, true); + + frame.instruction = 0x4000; + frame.module = &module1; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, string("LargeFunction")); + + frame.instruction = 0x2181; + frame.module = &module2; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Function2_2"); + ASSERT_EQ(frame.function_base, 0x2170U); + ASSERT_TRUE(frame.module); + ASSERT_EQ(frame.module->code_file(), "module2"); + ASSERT_EQ(frame.source_file_name, "file2_2.cc"); + ASSERT_EQ(frame.source_line, 21); + ASSERT_EQ(frame.source_line_base, 0x2180U); + ASSERT_EQ(frame.is_multiple, false); + windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); + ASSERT_TRUE(windows_frame_info.get()); + ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA); + ASSERT_EQ(windows_frame_info->prolog_size, 1U); + + frame.instruction = 0x216f; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Public2_1"); + EXPECT_EQ(frame.is_multiple, false); + + ClearSourceLineInfo(&frame); + frame.instruction = 0x219f; + frame.module = &module2; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_TRUE(frame.function_name.empty()); + + frame.instruction = 0x21a0; + frame.module = &module2; + fast_resolver.FillSourceLineInfo(&frame, nullptr); + ASSERT_EQ(frame.function_name, "Public2_2"); +} + +// Test adapted from basic_source_line_resolver_unittest. +TEST_F(TestFastSourceLineResolver, TestLoadAndResolveOldInlines) { + TestCodeModule module("linux_inline"); + ASSERT_TRUE(basic_resolver.LoadModule( + &module, testdata_dir + + "/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/" + "linux_inline.old.sym")); + ASSERT_TRUE(basic_resolver.HasModule(&module)); + // Convert module1 to fast_module: + ASSERT_TRUE(serializer.ConvertOneModule(module.code_file(), &basic_resolver, + &fast_resolver)); + ASSERT_TRUE(fast_resolver.HasModule(&module)); + + StackFrame frame; + std::deque> inlined_frames; + frame.instruction = 0x161b6; + frame.module = &module; + fast_resolver.FillSourceLineInfo(&frame, &inlined_frames); + + // main frame. + ASSERT_EQ(frame.function_name, "main"); + ASSERT_EQ(frame.function_base, 0x15b30U); + ASSERT_EQ(frame.source_file_name, "linux_inline.cpp"); + ASSERT_EQ(frame.source_line, 42); + ASSERT_EQ(frame.source_line_base, 0x161b6U); + ASSERT_EQ(frame.is_multiple, false); + + ASSERT_EQ(inlined_frames.size(), 3UL); + + // Inlined frames inside main frame. + ASSERT_EQ(inlined_frames[2]->function_name, "foo()"); + ASSERT_EQ(inlined_frames[2]->function_base, 0x15b45U); + ASSERT_EQ(inlined_frames[2]->source_file_name, "linux_inline.cpp"); + ASSERT_EQ(inlined_frames[2]->source_line, 39); + ASSERT_EQ(inlined_frames[2]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[2]->trust, StackFrame::FRAME_TRUST_INLINE); + + ASSERT_EQ(inlined_frames[1]->function_name, "bar()"); + ASSERT_EQ(inlined_frames[1]->function_base, 0x15b72U); + ASSERT_EQ(inlined_frames[1]->source_file_name, "linux_inline.cpp"); + ASSERT_EQ(inlined_frames[1]->source_line, 32); + ASSERT_EQ(inlined_frames[1]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[1]->trust, StackFrame::FRAME_TRUST_INLINE); + + ASSERT_EQ(inlined_frames[0]->function_name, "func()"); + ASSERT_EQ(inlined_frames[0]->function_base, 0x15b83U); + ASSERT_EQ(inlined_frames[0]->source_file_name, "linux_inline.cpp"); + ASSERT_EQ(inlined_frames[0]->source_line, 27); + ASSERT_EQ(inlined_frames[0]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[0]->trust, StackFrame::FRAME_TRUST_INLINE); +} + +// Test adapted from basic_source_line_resolver_unittest. +TEST_F(TestFastSourceLineResolver, TestLoadAndResolveNewInlines) { + TestCodeModule module("linux_inline"); + ASSERT_TRUE(basic_resolver.LoadModule( + &module, testdata_dir + + "/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/" + "linux_inline.new.sym")); + ASSERT_TRUE(basic_resolver.HasModule(&module)); + // Convert module1 to fast_module: + ASSERT_TRUE(serializer.ConvertOneModule(module.code_file(), &basic_resolver, + &fast_resolver)); + ASSERT_TRUE(fast_resolver.HasModule(&module)); + + StackFrame frame; + std::deque> inlined_frames; + frame.instruction = 0x161b6; + frame.module = &module; + fast_resolver.FillSourceLineInfo(&frame, &inlined_frames); + + // main frame. + ASSERT_EQ(frame.function_name, "main"); + ASSERT_EQ(frame.function_base, 0x15b30U); + ASSERT_EQ(frame.source_file_name, "a.cpp"); + ASSERT_EQ(frame.source_line, 42); + ASSERT_EQ(frame.source_line_base, 0x161b6U); + ASSERT_EQ(frame.is_multiple, false); + + ASSERT_EQ(inlined_frames.size(), 3UL); + + // Inlined frames inside main frame. + ASSERT_EQ(inlined_frames[2]->function_name, "foo()"); + ASSERT_EQ(inlined_frames[2]->function_base, 0x15b45U); + ASSERT_EQ(inlined_frames[2]->source_file_name, "b.cpp"); + ASSERT_EQ(inlined_frames[2]->source_line, 39); + ASSERT_EQ(inlined_frames[2]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[2]->trust, StackFrame::FRAME_TRUST_INLINE); + + ASSERT_EQ(inlined_frames[1]->function_name, "bar()"); + ASSERT_EQ(inlined_frames[1]->function_base, 0x15b72U); + ASSERT_EQ(inlined_frames[1]->source_file_name, "c.cpp"); + ASSERT_EQ(inlined_frames[1]->source_line, 32); + ASSERT_EQ(inlined_frames[1]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[1]->trust, StackFrame::FRAME_TRUST_INLINE); + + ASSERT_EQ(inlined_frames[0]->function_name, "func()"); + ASSERT_EQ(inlined_frames[0]->function_base, 0x15b83U); + ASSERT_EQ(inlined_frames[0]->source_file_name, "linux_inline.cpp"); + ASSERT_EQ(inlined_frames[0]->source_line, 27); + ASSERT_EQ(inlined_frames[0]->source_line_base, 0x161b6U); + ASSERT_EQ(inlined_frames[0]->trust, StackFrame::FRAME_TRUST_INLINE); +} + +TEST_F(TestFastSourceLineResolver, TestInvalidLoads) { + TestCodeModule module3("module3"); + ASSERT_TRUE(basic_resolver.LoadModule(&module3, + testdata_dir + "/module3_bad.out")); + ASSERT_TRUE(basic_resolver.HasModule(&module3)); + ASSERT_TRUE(basic_resolver.IsModuleCorrupt(&module3)); + // Convert module3 to fast_module: + ASSERT_TRUE(serializer.ConvertOneModule(module3.code_file(), + &basic_resolver, + &fast_resolver)); + ASSERT_TRUE(fast_resolver.HasModule(&module3)); + ASSERT_TRUE(fast_resolver.IsModuleCorrupt(&module3)); + + TestCodeModule module4("module4"); + ASSERT_TRUE(basic_resolver.LoadModule(&module4, + testdata_dir + "/module4_bad.out")); + ASSERT_TRUE(basic_resolver.HasModule(&module4)); + ASSERT_TRUE(basic_resolver.IsModuleCorrupt(&module4)); + // Convert module4 to fast_module: + ASSERT_TRUE(serializer.ConvertOneModule(module4.code_file(), + &basic_resolver, + &fast_resolver)); + ASSERT_TRUE(fast_resolver.HasModule(&module4)); + ASSERT_TRUE(fast_resolver.IsModuleCorrupt(&module4)); + + TestCodeModule module5("module5"); + ASSERT_FALSE(fast_resolver.LoadModule(&module5, + testdata_dir + "/invalid-filename")); + ASSERT_FALSE(fast_resolver.HasModule(&module5)); + + TestCodeModule invalidmodule("invalid-module"); + ASSERT_FALSE(fast_resolver.HasModule(&invalidmodule)); +} + +TEST_F(TestFastSourceLineResolver, TestUnload) { + TestCodeModule module1("module1"); + ASSERT_FALSE(basic_resolver.HasModule(&module1)); + + ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1))); + ASSERT_TRUE(basic_resolver.HasModule(&module1)); + // Convert module1 to fast_module. + ASSERT_TRUE(serializer.ConvertOneModule(module1.code_file(), + &basic_resolver, + &fast_resolver)); + ASSERT_TRUE(fast_resolver.HasModule(&module1)); + basic_resolver.UnloadModule(&module1); + fast_resolver.UnloadModule(&module1); + ASSERT_FALSE(fast_resolver.HasModule(&module1)); + + ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1))); + ASSERT_TRUE(basic_resolver.HasModule(&module1)); + // Convert module1 to fast_module. + ASSERT_TRUE(serializer.ConvertOneModule(module1.code_file(), + &basic_resolver, + &fast_resolver)); + ASSERT_TRUE(fast_resolver.HasModule(&module1)); +} + +TEST_F(TestFastSourceLineResolver, CompareModule) { + char* symbol_data; + size_t symbol_data_size; + string symbol_data_string; + string filename; + + for (int module_index = 0; module_index < 3; ++module_index) { + std::stringstream ss; + ss << testdata_dir << "/module" << module_index << ".out"; + filename = ss.str(); + ASSERT_TRUE(SourceLineResolverBase::ReadSymbolFile( + symbol_file(module_index), &symbol_data, &symbol_data_size)); + symbol_data_string.assign(symbol_data, symbol_data_size); + delete [] symbol_data; + ASSERT_TRUE(module_comparer.Compare(symbol_data_string)); + } +} + +} // namespace + +int main(int argc, char* argv[]) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/src/processor/linked_ptr.h b/src/processor/linked_ptr.h new file mode 100644 index 0000000..5de49ee --- /dev/null +++ b/src/processor/linked_ptr.h @@ -0,0 +1,192 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A "smart" pointer type with reference tracking. Every pointer to a +// particular object is kept on a circular linked list. When the last pointer +// to an object is destroyed or reassigned, the object is deleted. +// +// Used properly, this deletes the object when the last reference goes away. +// There are several caveats: +// - Like all reference counting schemes, cycles lead to leaks. +// - Each smart pointer is actually two pointers (8 bytes instead of 4). +// - Every time a pointer is assigned, the entire list of pointers to that +// object is traversed. This class is therefore NOT SUITABLE when there +// will often be more than two or three pointers to a particular object. +// - References are only tracked as long as linked_ptr<> objects are copied. +// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS +// will happen (double deletion). +// +// A good use of this class is storing object references in STL containers. +// You can safely put linked_ptr<> in a vector<>. +// Other uses may not be as good. +// +// Note: If you use an incomplete type with linked_ptr<>, the class +// *containing* linked_ptr<> must have a constructor and destructor (even +// if they do nothing!). + +#ifndef PROCESSOR_LINKED_PTR_H__ +#define PROCESSOR_LINKED_PTR_H__ + +namespace google_breakpad { + +// This is used internally by all instances of linked_ptr<>. It needs to be +// a non-template class because different types of linked_ptr<> can refer to +// the same object (linked_ptr(obj) vs linked_ptr(obj)). +// So, it needs to be possible for different types of linked_ptr to participate +// in the same circular linked list, so we need a single class type here. +// +// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr. +class linked_ptr_internal { + public: + // Create a new circle that includes only this instance. + void join_new() { + next_ = this; + } + + // Join an existing circle. + void join(linked_ptr_internal const* ptr) { + linked_ptr_internal const* p = ptr; + while (p->next_ != ptr) p = p->next_; + p->next_ = this; + next_ = ptr; + } + + // Leave whatever circle we're part of. Returns true iff we were the + // last member of the circle. Once this is done, you can join() another. + bool depart() { + if (next_ == this) return true; + linked_ptr_internal const* p = next_; + while (p->next_ != this) p = p->next_; + p->next_ = next_; + return false; + } + + private: + mutable linked_ptr_internal const* next_; +}; + +template +class linked_ptr { + public: + typedef T element_type; + + // Take over ownership of a raw pointer. This should happen as soon as + // possible after the object is created. + explicit linked_ptr(T* ptr = NULL) { capture(ptr); } + ~linked_ptr() { depart(); } + + // Copy an existing linked_ptr<>, adding ourselves to the list of references. + template linked_ptr(linked_ptr const& ptr) { copy(&ptr); } + linked_ptr(linked_ptr const& ptr) { copy(&ptr); } + + // Assignment releases the old value and acquires the new. + template linked_ptr& operator=(linked_ptr const& ptr) { + depart(); + copy(&ptr); + return *this; + } + + linked_ptr& operator=(linked_ptr const& ptr) { + if (&ptr != this) { + depart(); + copy(&ptr); + } + return *this; + } + + // Smart pointer members. + void reset(T* ptr = NULL) { depart(); capture(ptr); } + T* get() const { return value_; } + T* operator->() const { return value_; } + T& operator*() const { return *value_; } + // Release ownership of the pointed object and returns it. + // Sole ownership by this linked_ptr object is required. + T* release() { + link_.depart(); + T* v = value_; + value_ = NULL; + return v; + } + + bool operator==(T* p) const { return value_ == p; } + bool operator!=(T* p) const { return value_ != p; } + template + bool operator==(linked_ptr const& ptr) const { + return value_ == ptr.get(); + } + template + bool operator!=(linked_ptr const& ptr) const { + return value_ != ptr.get(); + } + + private: + template + friend class linked_ptr; + + T* value_; + linked_ptr_internal link_; + + void depart() { + if (link_.depart()) delete value_; + } + + void capture(T* ptr) { + value_ = ptr; + link_.join_new(); + } + + template void copy(linked_ptr const* ptr) { + value_ = ptr->get(); + if (value_) + link_.join(&ptr->link_); + else + link_.join_new(); + } +}; + +template inline +bool operator==(T* ptr, const linked_ptr& x) { + return ptr == x.get(); +} + +template inline +bool operator!=(T* ptr, const linked_ptr& x) { + return ptr != x.get(); +} + +// A function to convert T* into linked_ptr +// Doing e.g. make_linked_ptr(new FooBarBaz(arg)) is a shorter notation +// for linked_ptr >(new FooBarBaz(arg)) +template +linked_ptr make_linked_ptr(T* ptr) { + return linked_ptr(ptr); +} + +} // namespace google_breakpad + +#endif // PROCESSOR_LINKED_PTR_H__ diff --git a/src/processor/logging.cc b/src/processor/logging.cc new file mode 100644 index 0000000..46386eb --- /dev/null +++ b/src/processor/logging.cc @@ -0,0 +1,117 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// logging.cc: Breakpad logging +// +// See logging.h for documentation. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include + +#include + +#include "common/stdio_wrapper.h" +#include "common/using_std_string.h" +#include "processor/logging.h" +#include "processor/pathname_stripper.h" + +namespace google_breakpad { + +LogStream::LogStream(std::ostream& stream, Severity severity, + const char* file, int line) + : stream_(stream) { + time_t clock; + time(&clock); + struct tm tm_struct; +#ifdef _WIN32 + localtime_s(&tm_struct, &clock); +#else + localtime_r(&clock, &tm_struct); +#endif + char time_string[20]; + strftime(time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", &tm_struct); + + const char* severity_string = "UNKNOWN_SEVERITY"; + switch (severity) { + case SEVERITY_INFO: + severity_string = "INFO"; + break; + case SEVERITY_ERROR: + severity_string = "ERROR"; + break; + case SEVERITY_CRITICAL: + severity_string = "CRITICAL"; + break; + } + + stream_ << time_string << ": " << PathnameStripper::File(file) << ":" << + line << ": " << severity_string << ": "; +} + +LogStream::~LogStream() { + stream_ << std::endl; +} + +string HexString(uint32_t number) { + char buffer[11]; + snprintf(buffer, sizeof(buffer), "0x%x", number); + return string(buffer); +} + +string HexString(uint64_t number) { + char buffer[19]; + snprintf(buffer, sizeof(buffer), "0x%" PRIx64, number); + return string(buffer); +} + +string HexString(int number) { + char buffer[19]; + snprintf(buffer, sizeof(buffer), "0x%x", number); + return string(buffer); +} + +int ErrnoString(string* error_string) { + assert(error_string); + + // strerror isn't necessarily thread-safe. strerror_r would be preferrable, + // but GNU libc uses a nonstandard strerror_r by default, which returns a + // char* (rather than an int success indicator) and doesn't necessarily + // use the supplied buffer. + error_string->assign(strerror(errno)); + return errno; +} + +} // namespace google_breakpad diff --git a/src/processor/logging.h b/src/processor/logging.h new file mode 100644 index 0000000..8c04083 --- /dev/null +++ b/src/processor/logging.h @@ -0,0 +1,187 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// logging.h: Breakpad logging +// +// Breakpad itself uses Breakpad logging with statements of the form: +// BPLOG(severity) << "message"; +// severity may be INFO, ERROR, or other values defined in this file. +// +// BPLOG is an overridable macro so that users can customize Breakpad's +// logging. Left at the default, logging messages are sent to stderr along +// with a timestamp and the source code location that produced a message. +// The streams may be changed by redefining BPLOG_*_STREAM, the logging +// behavior may be changed by redefining BPLOG_*, and the entire logging +// system may be overridden by redefining BPLOG(severity). These +// redefinitions may be passed to the preprocessor as a command-line flag +// (-D). +// +// If an additional header is required to override Breakpad logging, it can +// be specified by the BP_LOGGING_INCLUDE macro. If defined, this header +// will #include the header specified by that macro. +// +// If any initialization is needed before logging, it can be performed by +// a function called through the BPLOG_INIT macro. Each main function of +// an executable program in the Breakpad processor library calls +// BPLOG_INIT(&argc, &argv); before any logging can be performed; define +// BPLOG_INIT appropriately if initialization is required. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_LOGGING_H__ +#define PROCESSOR_LOGGING_H__ + +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +#ifdef BP_LOGGING_INCLUDE +#include BP_LOGGING_INCLUDE +#endif // BP_LOGGING_INCLUDE + +namespace google_breakpad { + +// These are defined in Microsoft headers. +#ifdef SEVERITY_ERROR +#undef SEVERITY_ERROR +#endif + +#ifdef ERROR +#undef ERROR +#endif + +class LogStream { + public: + enum Severity { + SEVERITY_INFO, + SEVERITY_ERROR, + SEVERITY_CRITICAL + }; + + // Begin logging a message to the stream identified by |stream|, at the + // indicated severity. The file and line parameters should be set so as to + // identify the line of source code that is producing a message. + LogStream(std::ostream& stream, Severity severity, + const char* file, int line); + + // Finish logging by printing a newline and flushing the output stream. + ~LogStream(); + + template std::ostream& operator<<(const T& t) { + return stream_ << t; + } + + private: + std::ostream& stream_; + + // Disallow copy constructor and assignment operator + explicit LogStream(const LogStream& that); + void operator=(const LogStream& that); +}; + +// This class is used to explicitly ignore values in the conditional logging +// macros. This avoids compiler warnings like "value computed is not used" +// and "statement has no effect". +class LogMessageVoidify { + public: + LogMessageVoidify() {} + + // This has to be an operator with a precedence lower than << but higher + // than ?: + void operator&(std::ostream&) {} +}; + +// Returns number formatted as a hexadecimal string, such as "0x7b". +string HexString(uint32_t number); +string HexString(uint64_t number); +string HexString(int number); + +// Returns the error code as set in the global errno variable, and sets +// error_string, a required argument, to a string describing that error +// code. +int ErrnoString(string* error_string); + +} // namespace google_breakpad + +#ifndef BPLOG_INIT +#define BPLOG_INIT(pargc, pargv) +#endif // BPLOG_INIT + +#ifndef BPLOG_LAZY_STREAM +#define BPLOG_LAZY_STREAM(stream, condition) \ + !(condition) ? (void) 0 : \ + google_breakpad::LogMessageVoidify() & (BPLOG_ ## stream) +#endif + +#ifndef BPLOG_MINIMUM_SEVERITY +#define BPLOG_MINIMUM_SEVERITY SEVERITY_INFO +#endif + +#define BPLOG_LOG_IS_ON(severity) \ + ((google_breakpad::LogStream::SEVERITY_ ## severity) >= \ + (google_breakpad::LogStream::BPLOG_MINIMUM_SEVERITY)) + +#ifndef BPLOG +#define BPLOG(severity) BPLOG_LAZY_STREAM(severity, BPLOG_LOG_IS_ON(severity)) +#endif // BPLOG + +#ifndef BPLOG_INFO +#ifndef BPLOG_INFO_STREAM +#define BPLOG_INFO_STREAM std::clog +#endif // BPLOG_INFO_STREAM +#define BPLOG_INFO google_breakpad::LogStream(BPLOG_INFO_STREAM, \ + google_breakpad::LogStream::SEVERITY_INFO, \ + __FILE__, __LINE__) +#endif // BPLOG_INFO + +#ifndef BPLOG_ERROR +#ifndef BPLOG_ERROR_STREAM +#define BPLOG_ERROR_STREAM std::cerr +#endif // BPLOG_ERROR_STREAM +#define BPLOG_ERROR google_breakpad::LogStream(BPLOG_ERROR_STREAM, \ + google_breakpad::LogStream::SEVERITY_ERROR, \ + __FILE__, __LINE__) +#endif // BPLOG_ERROR + +#ifndef BPLOG_CRITICAL +#ifndef BPLOG_CRITICAL_STREAM +#define BPLOG_CRITICAL_STREAM std::cerr +#endif // BPLOG_CRITICAL_STREAM +#define BPLOG_CRITICAL google_breakpad::LogStream(BPLOG_CRITICAL_STREAM, \ + google_breakpad::LogStream::SEVERITY_CRITICAL, \ + __FILE__, __LINE__) +#endif // BPLOG_CRITICAL + +#ifndef BPLOG_IF +#define BPLOG_IF(severity, condition) \ + BPLOG_LAZY_STREAM(severity, ((condition) && BPLOG_LOG_IS_ON(severity))) +#endif // BPLOG_IF + +#endif // PROCESSOR_LOGGING_H__ diff --git a/src/processor/map_serializers-inl.h b/src/processor/map_serializers-inl.h new file mode 100644 index 0000000..577b95f --- /dev/null +++ b/src/processor/map_serializers-inl.h @@ -0,0 +1,265 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// map_serializers_inl.h: implementation for serializing std::map and its +// wrapper classes. +// +// See map_serializers.h for documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_MAP_SERIALIZERS_INL_H__ +#define PROCESSOR_MAP_SERIALIZERS_INL_H__ + +#include +#include + +#include "processor/map_serializers.h" +#include "processor/simple_serializer.h" + +#include "processor/address_map-inl.h" +#include "processor/range_map-inl.h" +#include "processor/contained_range_map-inl.h" + +#include "processor/logging.h" + +namespace google_breakpad { + +template +size_t StdMapSerializer::SizeOf( + const std::map& m) const { + size_t size = 0; + size_t header_size = (1 + m.size()) * sizeof(uint32_t); + size += header_size; + + typename std::map::const_iterator iter; + for (iter = m.begin(); iter != m.end(); ++iter) { + size += key_serializer_.SizeOf(iter->first); + size += value_serializer_.SizeOf(iter->second); + } + return size; +} + +template +char* StdMapSerializer::Write(const std::map& m, + char* dest) const { + if (!dest) { + BPLOG(ERROR) << "StdMapSerializer failed: write to NULL address."; + return NULL; + } + char* start_address = dest; + + // Write header: + // Number of nodes. + dest = SimpleSerializer::Write(m.size(), dest); + // Nodes offsets. + uint32_t* offsets = reinterpret_cast(dest); + dest += sizeof(uint32_t) * m.size(); + + char* key_address = dest; + dest += sizeof(Key) * m.size(); + + // Traverse map. + typename std::map::const_iterator iter; + int index = 0; + for (iter = m.begin(); iter != m.end(); ++iter, ++index) { + offsets[index] = static_cast(dest - start_address); + key_address = key_serializer_.Write(iter->first, key_address); + dest = value_serializer_.Write(iter->second, dest); + } + return dest; +} + +template +char* StdMapSerializer::Serialize( + const std::map& m, unsigned int* size) const { + // Compute size of memory to be allocated. + unsigned int size_to_alloc = SizeOf(m); + // Allocate memory. + char* serialized_data = new char[size_to_alloc]; + if (!serialized_data) { + BPLOG(INFO) << "StdMapSerializer memory allocation failed."; + if (size) *size = 0; + return NULL; + } + // Write serialized data into memory. + Write(m, serialized_data); + + if (size) *size = size_to_alloc; + return serialized_data; +} + +template +size_t RangeMapSerializer::SizeOf( + const RangeMap& m) const { + size_t size = 0; + size_t header_size = (1 + m.map_.size()) * sizeof(uint32_t); + size += header_size; + + typename std::map::const_iterator iter; + for (iter = m.map_.begin(); iter != m.map_.end(); ++iter) { + // Size of key (high address). + size += address_serializer_.SizeOf(iter->first); + // Size of base (low address). + size += address_serializer_.SizeOf(iter->second.base()); + // Size of entry. + size += entry_serializer_.SizeOf(iter->second.entry()); + } + return size; +} + +template +char* RangeMapSerializer::Write( + const RangeMap& m, char* dest) const { + if (!dest) { + BPLOG(ERROR) << "RangeMapSerializer failed: write to NULL address."; + return NULL; + } + char* start_address = dest; + + // Write header: + // Number of nodes. + dest = SimpleSerializer::Write(m.map_.size(), dest); + // Nodes offsets. + uint32_t* offsets = reinterpret_cast(dest); + dest += sizeof(uint32_t) * m.map_.size(); + + char* key_address = dest; + dest += sizeof(Address) * m.map_.size(); + + // Traverse map. + typename std::map::const_iterator iter; + int index = 0; + for (iter = m.map_.begin(); iter != m.map_.end(); ++iter, ++index) { + offsets[index] = static_cast(dest - start_address); + key_address = address_serializer_.Write(iter->first, key_address); + dest = address_serializer_.Write(iter->second.base(), dest); + dest = entry_serializer_.Write(iter->second.entry(), dest); + } + return dest; +} + +template +char* RangeMapSerializer::Serialize( + const RangeMap& m, unsigned int* size) const { + // Compute size of memory to be allocated. + unsigned int size_to_alloc = SizeOf(m); + // Allocate memory. + char* serialized_data = new char[size_to_alloc]; + if (!serialized_data) { + BPLOG(INFO) << "RangeMapSerializer memory allocation failed."; + if (size) *size = 0; + return NULL; + } + + // Write serialized data into memory. + Write(m, serialized_data); + + if (size) *size = size_to_alloc; + return serialized_data; +} + + +template +size_t ContainedRangeMapSerializer::SizeOf( + const ContainedRangeMap* m) const { + size_t size = 0; + size_t header_size = addr_serializer_.SizeOf(m->base_) + + entry_serializer_.SizeOf(m->entry_) + + sizeof(uint32_t); + size += header_size; + // In case m.map_ == NULL, we treat it as an empty map: + size += sizeof(uint32_t); + if (m->map_) { + size += m->map_->size() * sizeof(uint32_t); + typename Map::const_iterator iter; + for (iter = m->map_->begin(); iter != m->map_->end(); ++iter) { + size += addr_serializer_.SizeOf(iter->first); + // Recursive calculation of size: + size += SizeOf(iter->second); + } + } + return size; +} + +template +char* ContainedRangeMapSerializer::Write( + const ContainedRangeMap* m, char* dest) const { + if (!dest) { + BPLOG(ERROR) << "StdMapSerializer failed: write to NULL address."; + return NULL; + } + dest = addr_serializer_.Write(m->base_, dest); + dest = SimpleSerializer::Write(entry_serializer_.SizeOf(m->entry_), + dest); + dest = entry_serializer_.Write(m->entry_, dest); + + // Write map<: + char* map_address = dest; + if (m->map_ == NULL) { + dest = SimpleSerializer::Write(0, dest); + } else { + dest = SimpleSerializer::Write(m->map_->size(), dest); + uint32_t* offsets = reinterpret_cast(dest); + dest += sizeof(uint32_t) * m->map_->size(); + + char* key_address = dest; + dest += sizeof(AddrType) * m->map_->size(); + + // Traverse map. + typename Map::const_iterator iter; + int index = 0; + for (iter = m->map_->begin(); iter != m->map_->end(); ++iter, ++index) { + offsets[index] = static_cast(dest - map_address); + key_address = addr_serializer_.Write(iter->first, key_address); + // Recursively write. + dest = Write(iter->second, dest); + } + } + return dest; +} + +template +char* ContainedRangeMapSerializer::Serialize( + const ContainedRangeMap* m, unsigned int* size) const { + unsigned int size_to_alloc = SizeOf(m); + // Allocating memory. + char* serialized_data = new char[size_to_alloc]; + if (!serialized_data) { + BPLOG(INFO) << "ContainedRangeMapSerializer memory allocation failed."; + if (size) *size = 0; + return NULL; + } + Write(m, serialized_data); + if (size) *size = size_to_alloc; + return serialized_data; +} + +} // namespace google_breakpad + +#endif // PROCESSOR_MAP_SERIALIZERS_INL_H__ diff --git a/src/processor/map_serializers.h b/src/processor/map_serializers.h new file mode 100644 index 0000000..54153f8 --- /dev/null +++ b/src/processor/map_serializers.h @@ -0,0 +1,167 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// map_serializers.h: defines templates for serializing std::map and its +// wrappers: AddressMap, RangeMap, and ContainedRangeMap. +// +// Author: Siyang Xie (lambxsy@google.com) + + +#ifndef PROCESSOR_MAP_SERIALIZERS_H__ +#define PROCESSOR_MAP_SERIALIZERS_H__ + +#include +#include + +#include "processor/simple_serializer.h" + +#include "processor/address_map-inl.h" +#include "processor/range_map-inl.h" +#include "processor/contained_range_map-inl.h" + +namespace google_breakpad { + +// StdMapSerializer allocates memory and serializes an std::map instance into a +// chunk of memory data. +template +class StdMapSerializer { + public: + // Calculate the memory size of serialized data. + size_t SizeOf(const std::map& m) const; + + // Writes the serialized data to memory with start address = dest, + // and returns the "end" of data, i.e., return the address follow the final + // byte of data. + // NOTE: caller has to allocate enough memory before invoke Write() method. + char* Write(const std::map& m, char* dest) const; + + // Serializes a std::map object into a chunk of memory data with format + // described in "StaticMap.h" comment. + // Returns a pointer to the serialized data. If size != NULL, *size is set + // to the size of serialized data, i.e., SizeOf(m). + // Caller has the ownership of memory allocated as "new char[]". + char* Serialize(const std::map& m, unsigned int* size) const; + + private: + SimpleSerializer key_serializer_; + SimpleSerializer value_serializer_; +}; + +// AddressMapSerializer allocates memory and serializes an AddressMap into a +// chunk of memory data. +template +class AddressMapSerializer { + public: + // Calculate the memory size of serialized data. + size_t SizeOf(const AddressMap& m) const { + return std_map_serializer_.SizeOf(m.map_); + } + + // Write the serialized data to specified memory location. Return the "end" + // of data, i.e., return the address after the final byte of data. + // NOTE: caller has to allocate enough memory before invoke Write() method. + char* Write(const AddressMap& m, char* dest) const { + return std_map_serializer_.Write(m.map_, dest); + } + + // Serializes an AddressMap object into a chunk of memory data. + // Returns a pointer to the serialized data. If size != NULL, *size is set + // to the size of serialized data, i.e., SizeOf(m). + // Caller has the ownership of memory allocated as "new char[]". + char* Serialize(const AddressMap& m, unsigned int* size) const { + return std_map_serializer_.Serialize(m.map_, size); + } + + private: + // AddressMapSerializer is a simple wrapper of StdMapSerializer, just as + // AddressMap is a simple wrapper of std::map. + StdMapSerializer std_map_serializer_; +}; + +// RangeMapSerializer allocates memory and serializes a RangeMap instance into a +// chunk of memory data. +template +class RangeMapSerializer { + public: + // Calculate the memory size of serialized data. + size_t SizeOf(const RangeMap& m) const; + + // Write the serialized data to specified memory location. Return the "end" + // of data, i.e., return the address after the final byte of data. + // NOTE: caller has to allocate enough memory before invoke Write() method. + char* Write(const RangeMap& m, char* dest) const; + + // Serializes a RangeMap object into a chunk of memory data. + // Returns a pointer to the serialized data. If size != NULL, *size is set + // to the size of serialized data, i.e., SizeOf(m). + // Caller has the ownership of memory allocated as "new char[]". + char* Serialize(const RangeMap& m, unsigned int* size) const; + + private: + // Convenient type name for Range. + typedef typename RangeMap::Range Range; + + // Serializer for RangeMap's key and Range::base_. + SimpleSerializer
    address_serializer_; + // Serializer for RangeMap::Range::entry_. + SimpleSerializer entry_serializer_; +}; + +// ContainedRangeMapSerializer allocates memory and serializes a +// ContainedRangeMap instance into a chunk of memory data. +template +class ContainedRangeMapSerializer { + public: + // Calculate the memory size of serialized data. + size_t SizeOf(const ContainedRangeMap* m) const; + + // Write the serialized data to specified memory location. Return the "end" + // of data, i.e., return the address after the final byte of data. + // NOTE: caller has to allocate enough memory before invoke Write() method. + char* Write(const ContainedRangeMap* m, + char* dest) const; + + // Serializes a ContainedRangeMap object into a chunk of memory data. + // Returns a pointer to the serialized data. If size != NULL, *size is set + // to the size of serialized data, i.e., SizeOf(m). + // Caller has the ownership of memory allocated as "new char[]". + char* Serialize(const ContainedRangeMap* m, + unsigned int* size) const; + + private: + // Convenient type name for the underlying map type. + typedef std::map*> Map; + + // Serializer for addresses and entries stored in ContainedRangeMap. + SimpleSerializer addr_serializer_; + SimpleSerializer entry_serializer_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_MAP_SERIALIZERS_H__ diff --git a/src/processor/map_serializers_unittest.cc b/src/processor/map_serializers_unittest.cc new file mode 100644 index 0000000..cd31ddc --- /dev/null +++ b/src/processor/map_serializers_unittest.cc @@ -0,0 +1,389 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// map_serializers_unittest.cc: Unit tests for std::map serializer and +// std::map wrapper serializers. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "map_serializers-inl.h" + +#include "processor/address_map-inl.h" +#include "processor/range_map-inl.h" +#include "processor/contained_range_map-inl.h" + +typedef int32_t AddrType; +typedef int32_t EntryType; + +class TestStdMapSerializer : public ::testing::Test { + protected: + void SetUp() { + serialized_size_ = 0; + serialized_data_ = NULL; + } + + void TearDown() { + delete [] serialized_data_; + } + + std::map std_map_; + google_breakpad::StdMapSerializer serializer_; + uint32_t serialized_size_; + char* serialized_data_; +}; + +TEST_F(TestStdMapSerializer, EmptyMapTestCase) { + const int32_t correct_data[] = { 0 }; + uint32_t correct_size = sizeof(correct_data); + + // std_map_ is empty. + serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + +TEST_F(TestStdMapSerializer, MapWithTwoElementsTestCase) { + const int32_t correct_data[] = { + // # of nodes + 2, + // Offsets + 20, 24, + // Keys + 1, 3, + // Values + 2, 6 + }; + uint32_t correct_size = sizeof(correct_data); + + std_map_.insert(std::make_pair(1, 2)); + std_map_.insert(std::make_pair(3, 6)); + + serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + +TEST_F(TestStdMapSerializer, MapWithFiveElementsTestCase) { + const int32_t correct_data[] = { + // # of nodes + 5, + // Offsets + 44, 48, 52, 56, 60, + // Keys + 1, 2, 3, 4, 5, + // Values + 11, 12, 13, 14, 15 + }; + uint32_t correct_size = sizeof(correct_data); + + for (int i = 1; i < 6; ++i) + std_map_.insert(std::make_pair(i, 10 + i)); + + serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + +class TestAddressMapSerializer : public ::testing::Test { + protected: + void SetUp() { + serialized_size_ = 0; + serialized_data_ = 0; + } + + void TearDown() { + delete [] serialized_data_; + } + + google_breakpad::AddressMap address_map_; + google_breakpad::AddressMapSerializer serializer_; + uint32_t serialized_size_; + char* serialized_data_; +}; + +TEST_F(TestAddressMapSerializer, EmptyMapTestCase) { + const int32_t correct_data[] = { 0 }; + uint32_t correct_size = sizeof(correct_data); + + // std_map_ is empty. + serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + +TEST_F(TestAddressMapSerializer, MapWithTwoElementsTestCase) { + const int32_t correct_data[] = { + // # of nodes + 2, + // Offsets + 20, 24, + // Keys + 1, 3, + // Values + 2, 6 + }; + uint32_t correct_size = sizeof(correct_data); + + address_map_.Store(1, 2); + address_map_.Store(3, 6); + + serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + +TEST_F(TestAddressMapSerializer, MapWithFourElementsTestCase) { + const int32_t correct_data[] = { + // # of nodes + 4, + // Offsets + 36, 40, 44, 48, + // Keys + -6, -4, 8, 123, + // Values + 2, 3, 5, 8 + }; + uint32_t correct_size = sizeof(correct_data); + + address_map_.Store(-6, 2); + address_map_.Store(-4, 3); + address_map_.Store(8, 5); + address_map_.Store(123, 8); + + serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + + +class TestRangeMapSerializer : public ::testing::Test { + protected: + void SetUp() { + serialized_size_ = 0; + serialized_data_ = 0; + } + + void TearDown() { + delete [] serialized_data_; + } + + google_breakpad::RangeMap range_map_; + google_breakpad::RangeMapSerializer serializer_; + uint32_t serialized_size_; + char* serialized_data_; +}; + +TEST_F(TestRangeMapSerializer, EmptyMapTestCase) { + const int32_t correct_data[] = { 0 }; + uint32_t correct_size = sizeof(correct_data); + + // range_map_ is empty. + serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + +TEST_F(TestRangeMapSerializer, MapWithOneRangeTestCase) { + const int32_t correct_data[] = { + // # of nodes + 1, + // Offsets + 12, + // Keys: high address + 10, + // Values: (low address, entry) pairs + 1, 6 + }; + uint32_t correct_size = sizeof(correct_data); + + range_map_.StoreRange(1, 10, 6); + + serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + +TEST_F(TestRangeMapSerializer, MapWithThreeRangesTestCase) { + const int32_t correct_data[] = { + // # of nodes + 3, + // Offsets + 28, 36, 44, + // Keys: high address + 5, 9, 20, + // Values: (low address, entry) pairs + 2, 1, 6, 2, 10, 3 + }; + uint32_t correct_size = sizeof(correct_data); + + ASSERT_TRUE(range_map_.StoreRange(2, 4, 1)); + ASSERT_TRUE(range_map_.StoreRange(6, 4, 2)); + ASSERT_TRUE(range_map_.StoreRange(10, 11, 3)); + + serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + + +class TestContainedRangeMapSerializer : public ::testing::Test { + protected: + void SetUp() { + serialized_size_ = 0; + serialized_data_ = 0; + } + + void TearDown() { + delete [] serialized_data_; + } + + google_breakpad::ContainedRangeMap crm_map_; + google_breakpad::ContainedRangeMapSerializer serializer_; + uint32_t serialized_size_; + char* serialized_data_; +}; + +TEST_F(TestContainedRangeMapSerializer, EmptyMapTestCase) { + const int32_t correct_data[] = { + 0, // base address of root + 4, // size of entry + 0, // entry stored at root + 0 // empty map stored at root + }; + uint32_t correct_size = sizeof(correct_data); + + // crm_map_ is empty. + serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + +TEST_F(TestContainedRangeMapSerializer, MapWithOneRangeTestCase) { + const int32_t correct_data[] = { + 0, // base address of root + 4, // size of entry + 0, // entry stored at root + // Map stored at root node: + 1, // # of nodes + 12, // offset + 9, // key + // value: a child ContainedRangeMap + 3, // base address of child CRM + 4, // size of entry + -1, // entry stored in child CRM + 0 // empty sub-map stored in child CRM + }; + uint32_t correct_size = sizeof(correct_data); + + crm_map_.StoreRange(3, 7, -1); + + serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + +TEST_F(TestContainedRangeMapSerializer, MapWithTwoLevelsTestCase) { + // Tree structure of ranges: + // root level 0 + // | + // map + // / \ level 1: child1, child2 + // 2~8 10~20 + // | | + // map map + // / \ | + // 3~4 6~7 16-20 level 2: grandchild1, grandchild2, grandchild3 + + const int32_t correct_data[] = { + // root: base, entry_size, entry + 0, 4, 0, + // root's map: # of nodes, offset1, offset2, key1, key2 + 2, 20, 84, 8, 20, + // child1: base, entry_size, entry: + 2, 4, -1, + // child1's map: # of nodes, offset1, offset2, key1, key2 + 2, 20, 36, 4, 7, + // grandchild1: base, entry_size, entry, empty_map + 3, 4, -1, 0, + // grandchild2: base, entry_size, entry, empty_map + 6, 4, -1, 0, + // child2: base, entry_size, entry: + 10, 4, -1, + // child2's map: # of nodes, offset1, key1 + 1, 12, 20, + // grandchild3: base, entry_size, entry, empty_map + 16, 4, -1, 0 + }; + uint32_t correct_size = sizeof(correct_data); + + // Store child1. + ASSERT_TRUE(crm_map_.StoreRange(2, 7, -1)); + // Store child2. + ASSERT_TRUE(crm_map_.StoreRange(10, 11, -1)); + // Store grandchild1. + ASSERT_TRUE(crm_map_.StoreRange(3, 2, -1)); + // Store grandchild2. + ASSERT_TRUE(crm_map_.StoreRange(6, 2, -1)); + // Store grandchild3. + ASSERT_TRUE(crm_map_.StoreRange(16, 5, -1)); + + serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_); + + EXPECT_EQ(correct_size, serialized_size_); + EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0); +} + + +int main(int argc, char* argv[]) { + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/src/processor/microdump.cc b/src/processor/microdump.cc new file mode 100644 index 0000000..94d2c20 --- /dev/null +++ b/src/processor/microdump.cc @@ -0,0 +1,408 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// microdump.cc: A microdump reader. +// +// See microdump.h for documentation. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/microdump.h" + +#include +#include + +#include +#include +#include +#include + +#include "google_breakpad/common/minidump_cpu_arm.h" +#include "google_breakpad/processor/code_module.h" +#include "processor/basic_code_module.h" +#include "processor/convert_old_arm64_context.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" +#include "processor/range_map-inl.h" + +namespace { +static const char kGoogleBreakpadKey[] = "google-breakpad"; +static const char kMicrodumpBegin[] = "-----BEGIN BREAKPAD MICRODUMP-----"; +static const char kMicrodumpEnd[] = "-----END BREAKPAD MICRODUMP-----"; +static const char kOsKey[] = ": O "; +static const char kCpuKey[] = ": C "; +static const char kCrashReasonKey[] = ": R "; +static const char kGpuKey[] = ": G "; +static const char kMmapKey[] = ": M "; +static const char kStackKey[] = ": S "; +static const char kStackFirstLineKey[] = ": S 0 "; +static const char kArmArchitecture[] = "arm"; +static const char kArm64Architecture[] = "arm64"; +static const char kX86Architecture[] = "x86"; +static const char kMipsArchitecture[] = "mips"; +static const char kMips64Architecture[] = "mips64"; +static const char kGpuUnknown[] = "UNKNOWN"; + +template +T HexStrToL(const string& str) { + uint64_t res = 0; + std::istringstream ss(str); + ss >> std::hex >> res; + return static_cast(res); +} + +std::vector ParseHexBuf(const string& str) { + std::vector buf; + for (size_t i = 0; i < str.length(); i += 2) { + buf.push_back(HexStrToL(str.substr(i, 2))); + } + return buf; +} + +bool GetLine(std::istringstream* istream, string* str) { + if (std::getline(*istream, *str)) { + // Trim any trailing newline from the end of the line. Allows us + // to seamlessly handle both Windows/DOS and Unix formatted input. The + // adb tool generally writes logcat dumps in Windows/DOS format. + if (!str->empty() && str->at(str->size() - 1) == '\r') { + str->erase(str->size() - 1); + } + return true; + } + return false; +} + +} // namespace + +namespace google_breakpad { + +// +// MicrodumpModules +// + +void MicrodumpModules::Add(const CodeModule* module) { + linked_ptr module_ptr(module); + if (!map_.StoreRange(module->base_address(), module->size(), module_ptr)) { + BPLOG(ERROR) << "Module " << module->code_file() << + " could not be stored"; + } +} + +void MicrodumpModules::SetEnableModuleShrink(bool is_enabled) { + map_.SetMergeStrategy(is_enabled ? MergeRangeStrategy::kTruncateUpper + : MergeRangeStrategy::kExclusiveRanges); +} + +// +// MicrodumpContext +// + +void MicrodumpContext::SetContextARM(MDRawContextARM* arm) { + DumpContext::SetContextFlags(MD_CONTEXT_ARM); + DumpContext::SetContextARM(arm); + valid_ = true; +} + +void MicrodumpContext::SetContextARM64(MDRawContextARM64* arm64) { + DumpContext::SetContextFlags(MD_CONTEXT_ARM64); + DumpContext::SetContextARM64(arm64); + valid_ = true; +} + +void MicrodumpContext::SetContextX86(MDRawContextX86* x86) { + DumpContext::SetContextFlags(MD_CONTEXT_X86); + DumpContext::SetContextX86(x86); + valid_ = true; +} + +void MicrodumpContext::SetContextMIPS(MDRawContextMIPS* mips32) { + DumpContext::SetContextFlags(MD_CONTEXT_MIPS); + DumpContext::SetContextMIPS(mips32); + valid_ = true; +} + +void MicrodumpContext::SetContextMIPS64(MDRawContextMIPS* mips64) { + DumpContext::SetContextFlags(MD_CONTEXT_MIPS64); + DumpContext::SetContextMIPS(mips64); + valid_ = true; +} + + +// +// MicrodumpMemoryRegion +// + +MicrodumpMemoryRegion::MicrodumpMemoryRegion() : base_address_(0) { } + +void MicrodumpMemoryRegion::Init(uint64_t base_address, + const std::vector& contents) { + base_address_ = base_address; + contents_ = contents; +} + +uint64_t MicrodumpMemoryRegion::GetBase() const { return base_address_; } + +uint32_t MicrodumpMemoryRegion::GetSize() const { return contents_.size(); } + +bool MicrodumpMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint8_t* value) const { + return GetMemoryLittleEndian(address, value); +} + +bool MicrodumpMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint16_t* value) const { + return GetMemoryLittleEndian(address, value); +} + +bool MicrodumpMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint32_t* value) const { + return GetMemoryLittleEndian(address, value); +} + +bool MicrodumpMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint64_t* value) const { + return GetMemoryLittleEndian(address, value); +} + +template +bool MicrodumpMemoryRegion::GetMemoryLittleEndian(uint64_t address, + ValueType* value) const { + if (address < base_address_ || + address - base_address_ + sizeof(ValueType) > contents_.size()) + return false; + ValueType v = 0; + uint64_t start = address - base_address_; + // The loop condition is odd, but it's correct for size_t. + for (size_t i = sizeof(ValueType) - 1; i < sizeof(ValueType); i--) + v = (v << 8) | static_cast(contents_[start + i]); + *value = v; + return true; +} + +void MicrodumpMemoryRegion::Print() const { + // Not reached, just needed to honor the base class contract. + assert(false); +} + +// +// Microdump +// +Microdump::Microdump(const string& contents) + : context_(new MicrodumpContext()), + stack_region_(new MicrodumpMemoryRegion()), + modules_(new MicrodumpModules()), + system_info_(new SystemInfo()), + crash_reason_(), + crash_address_(0u) { + assert(!contents.empty()); + + bool in_microdump = false; + string line; + uint64_t stack_start = 0; + std::vector stack_content; + string arch; + + std::istringstream stream(contents); + while (GetLine(&stream, &line)) { + if (line.find(kGoogleBreakpadKey) == string::npos) { + continue; + } + if (line.find(kMicrodumpBegin) != string::npos) { + in_microdump = true; + continue; + } + if (!in_microdump) { + continue; + } + if (line.find(kMicrodumpEnd) != string::npos) { + break; + } + + size_t pos; + if ((pos = line.find(kOsKey)) != string::npos) { + string os_str(line, pos + strlen(kOsKey)); + std::istringstream os_tokens(os_str); + string os_id; + string num_cpus; + string os_version; + // This reflect the actual HW arch and might not match the arch emulated + // for the execution (e.g., running a 32-bit binary on a 64-bit cpu). + string hw_arch; + + os_tokens >> os_id; + os_tokens >> arch; + os_tokens >> num_cpus; + os_tokens >> hw_arch; + GetLine(&os_tokens, &os_version); + os_version.erase(0, 1); // remove leading space. + + system_info_->cpu = arch; + system_info_->cpu_count = HexStrToL(num_cpus); + system_info_->os_version = os_version; + + if (os_id == "L") { + system_info_->os = "Linux"; + system_info_->os_short = "linux"; + } else if (os_id == "A") { + system_info_->os = "Android"; + system_info_->os_short = "android"; + modules_->SetEnableModuleShrink(true); + } + + // OS line also contains release and version for future use. + } else if ((pos = line.find(kStackKey)) != string::npos) { + if (line.find(kStackFirstLineKey) != string::npos) { + // The first line of the stack (S 0 stack header) provides the value of + // the stack pointer, the start address of the stack being dumped and + // the length of the stack. We could use it in future to double check + // that we received all the stack as expected. + continue; + } + string stack_str(line, pos + strlen(kStackKey)); + std::istringstream stack_tokens(stack_str); + string start_addr_str; + string raw_content; + stack_tokens >> start_addr_str; + stack_tokens >> raw_content; + uint64_t start_addr = HexStrToL(start_addr_str); + + if (stack_start != 0) { + // Verify that the stack chunks in the microdump are contiguous. + assert(start_addr == stack_start + stack_content.size()); + } else { + stack_start = start_addr; + } + std::vector chunk = ParseHexBuf(raw_content); + stack_content.insert(stack_content.end(), chunk.begin(), chunk.end()); + + } else if ((pos = line.find(kCpuKey)) != string::npos) { + string cpu_state_str(line, pos + strlen(kCpuKey)); + std::vector cpu_state_raw = ParseHexBuf(cpu_state_str); + if (strcmp(arch.c_str(), kArmArchitecture) == 0) { + if (cpu_state_raw.size() != sizeof(MDRawContextARM)) { + std::cerr << "Malformed CPU context. Got " << cpu_state_raw.size() + << " bytes instead of " << sizeof(MDRawContextARM) + << std::endl; + continue; + } + MDRawContextARM* arm = new MDRawContextARM(); + memcpy(arm, &cpu_state_raw[0], cpu_state_raw.size()); + context_->SetContextARM(arm); + } else if (strcmp(arch.c_str(), kArm64Architecture) == 0) { + if (cpu_state_raw.size() == sizeof(MDRawContextARM64)) { + MDRawContextARM64* arm = new MDRawContextARM64(); + memcpy(arm, &cpu_state_raw[0], cpu_state_raw.size()); + context_->SetContextARM64(arm); + } else if (cpu_state_raw.size() == sizeof(MDRawContextARM64_Old)) { + MDRawContextARM64_Old old_arm; + memcpy(&old_arm, &cpu_state_raw[0], cpu_state_raw.size()); + MDRawContextARM64* new_arm = new MDRawContextARM64(); + ConvertOldARM64Context(old_arm, new_arm); + context_->SetContextARM64(new_arm); + } else { + std::cerr << "Malformed CPU context. Got " << cpu_state_raw.size() + << " bytes instead of " << sizeof(MDRawContextARM64) + << std::endl; + continue; + } + } else if (strcmp(arch.c_str(), kX86Architecture) == 0) { + if (cpu_state_raw.size() != sizeof(MDRawContextX86)) { + std::cerr << "Malformed CPU context. Got " << cpu_state_raw.size() + << " bytes instead of " << sizeof(MDRawContextX86) + << std::endl; + continue; + } + MDRawContextX86* x86 = new MDRawContextX86(); + memcpy(x86, &cpu_state_raw[0], cpu_state_raw.size()); + context_->SetContextX86(x86); + } else if (strcmp(arch.c_str(), kMipsArchitecture) == 0) { + if (cpu_state_raw.size() != sizeof(MDRawContextMIPS)) { + std::cerr << "Malformed CPU context. Got " << cpu_state_raw.size() + << " bytes instead of " << sizeof(MDRawContextMIPS) + << std::endl; + continue; + } + MDRawContextMIPS* mips32 = new MDRawContextMIPS(); + memcpy(mips32, &cpu_state_raw[0], cpu_state_raw.size()); + context_->SetContextMIPS(mips32); + } else if (strcmp(arch.c_str(), kMips64Architecture) == 0) { + if (cpu_state_raw.size() != sizeof(MDRawContextMIPS)) { + std::cerr << "Malformed CPU context. Got " << cpu_state_raw.size() + << " bytes instead of " << sizeof(MDRawContextMIPS) + << std::endl; + continue; + } + MDRawContextMIPS* mips64 = new MDRawContextMIPS(); + memcpy(mips64, &cpu_state_raw[0], cpu_state_raw.size()); + context_->SetContextMIPS64(mips64); + } else { + std::cerr << "Unsupported architecture: " << arch << std::endl; + } + } else if ((pos = line.find(kCrashReasonKey)) != string::npos) { + string crash_reason_str(line, pos + strlen(kCrashReasonKey)); + std::istringstream crash_reason_tokens(crash_reason_str); + string signal; + string address; + crash_reason_tokens >> signal; + crash_reason_tokens >> crash_reason_; + crash_reason_tokens >> address; + crash_address_ = HexStrToL(address); + } else if ((pos = line.find(kGpuKey)) != string::npos) { + string gpu_str(line, pos + strlen(kGpuKey)); + if (strcmp(gpu_str.c_str(), kGpuUnknown) != 0) { + std::istringstream gpu_tokens(gpu_str); + std::getline(gpu_tokens, system_info_->gl_version, '|'); + std::getline(gpu_tokens, system_info_->gl_vendor, '|'); + std::getline(gpu_tokens, system_info_->gl_renderer, '|'); + } + } else if ((pos = line.find(kMmapKey)) != string::npos) { + string mmap_line(line, pos + strlen(kMmapKey)); + std::istringstream mmap_tokens(mmap_line); + string addr, offset, size, identifier, filename; + mmap_tokens >> addr; + mmap_tokens >> offset; + mmap_tokens >> size; + mmap_tokens >> identifier; + mmap_tokens >> filename; + + modules_->Add(new BasicCodeModule( + HexStrToL(addr), // base_address + HexStrToL(size), // size + filename, // code_file + identifier, // code_identifier + filename, // debug_file + identifier, // debug_identifier + "")); // version + } + } + stack_region_->Init(stack_start, stack_content); +} + +} // namespace google_breakpad diff --git a/src/processor/microdump_processor.cc b/src/processor/microdump_processor.cc new file mode 100644 index 0000000..3c25d5c --- /dev/null +++ b/src/processor/microdump_processor.cc @@ -0,0 +1,100 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// microdump_processor.cc: A microdump processor. +// +// See microdump_processor.h for documentation. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/microdump_processor.h" + +#include + +#include + +#include "common/using_std_string.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/microdump.h" +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/stackwalker.h" +#include "google_breakpad/processor/stack_frame_symbolizer.h" +#include "processor/logging.h" + +namespace google_breakpad { + +MicrodumpProcessor::MicrodumpProcessor(StackFrameSymbolizer* frame_symbolizer) + : frame_symbolizer_(frame_symbolizer) { + assert(frame_symbolizer); +} + +MicrodumpProcessor::~MicrodumpProcessor() {} + +ProcessResult MicrodumpProcessor::Process(Microdump *microdump, + ProcessState* process_state) { + assert(process_state); + + process_state->Clear(); + + process_state->modules_ = microdump->GetModules()->Copy(); + scoped_ptr stackwalker( + Stackwalker::StackwalkerForCPU( + &process_state->system_info_, + microdump->GetContext(), + microdump->GetMemory(), + process_state->modules_, + /* unloaded_modules= */ NULL, + frame_symbolizer_)); + + scoped_ptr stack(new CallStack()); + if (stackwalker.get()) { + if (!stackwalker->Walk(stack.get(), + &process_state->modules_without_symbols_, + &process_state->modules_with_corrupt_symbols_)) { + BPLOG(INFO) << "Processing was interrupted."; + return PROCESS_SYMBOL_SUPPLIER_INTERRUPTED; + } + } else { + BPLOG(ERROR) << "No stackwalker found for microdump."; + return PROCESS_ERROR_NO_THREAD_LIST; + } + + process_state->threads_.push_back(stack.release()); + process_state->thread_memory_regions_.push_back(microdump->GetMemory()); + process_state->crashed_ = true; + process_state->requesting_thread_ = 0; + process_state->system_info_ = *microdump->GetSystemInfo(); + process_state->crash_reason_ = microdump->GetCrashReason(); + process_state->crash_address_ = microdump->GetCrashAddress(); + + return PROCESS_OK; +} + +} // namespace google_breakpad diff --git a/src/processor/microdump_processor_unittest.cc b/src/processor/microdump_processor_unittest.cc new file mode 100644 index 0000000..47f5e35 --- /dev/null +++ b/src/processor/microdump_processor_unittest.cc @@ -0,0 +1,288 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Unit test for MicrodumpProcessor. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/microdump.h" +#include "google_breakpad/processor/microdump_processor.h" +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/stack_frame.h" +#include "google_breakpad/processor/stack_frame_symbolizer.h" +#include "processor/simple_symbol_supplier.h" +#include "processor/stackwalker_unittest_utils.h" + +namespace { + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::Microdump; +using google_breakpad::MicrodumpProcessor; +using google_breakpad::ProcessState; +using google_breakpad::SimpleSymbolSupplier; +using google_breakpad::StackFrameSymbolizer; + +class MicrodumpProcessorTest : public ::testing::Test { + public: + MicrodumpProcessorTest() + : files_path_(string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/processor/testdata/") { + } + + void ReadFile(const string& file_name, string* file_contents) { + assert(file_contents); + std::ifstream file_stream(file_name.c_str(), std::ios::in); + ASSERT_TRUE(file_stream.good()); + std::vector bytes; + file_stream.seekg(0, std::ios_base::end); + ASSERT_TRUE(file_stream.good()); + bytes.resize(file_stream.tellg()); + file_stream.seekg(0, std::ios_base::beg); + ASSERT_TRUE(file_stream.good()); + file_stream.read(&bytes[0], bytes.size()); + ASSERT_TRUE(file_stream.good()); + *file_contents = string(&bytes[0], bytes.size()); + } + + google_breakpad::ProcessResult ProcessMicrodump( + const string& symbols_file, + const string& microdump_contents, + ProcessState* state) { + SimpleSymbolSupplier supplier(symbols_file); + BasicSourceLineResolver resolver; + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + MicrodumpProcessor processor(&frame_symbolizer); + + Microdump microdump(microdump_contents); + return processor.Process(µdump, state); + } + + void AnalyzeDump(const string& microdump_file_name, bool omit_symbols, + int expected_cpu_count, ProcessState* state) { + string symbols_file = omit_symbols ? "" : files_path_ + "symbols/microdump"; + string microdump_file_path = files_path_ + microdump_file_name; + string microdump_contents; + ReadFile(microdump_file_path, µdump_contents); + + google_breakpad::ProcessResult result = + ProcessMicrodump(symbols_file, microdump_contents, state); + + ASSERT_EQ(google_breakpad::PROCESS_OK, result); + ASSERT_TRUE(state->crashed()); + ASSERT_EQ(0, state->requesting_thread()); + ASSERT_EQ(1U, state->threads()->size()); + + ASSERT_EQ(expected_cpu_count, state->system_info()->cpu_count); + ASSERT_EQ("android", state->system_info()->os_short); + ASSERT_EQ("Android", state->system_info()->os); + } + + string files_path_; +}; + +TEST_F(MicrodumpProcessorTest, TestProcess_Invalid) { + ProcessState state; + google_breakpad::ProcessResult result = + ProcessMicrodump("", "This is not a valid microdump", &state); + ASSERT_EQ(google_breakpad::PROCESS_ERROR_NO_THREAD_LIST, result); +} + +TEST_F(MicrodumpProcessorTest, TestProcess_WithoutCrashReason) { + ProcessState state; + AnalyzeDump("microdump-arm64.dmp", true /* omit_symbols */, + 2 /* expected_cpu_count */, &state); + ASSERT_EQ(state.crash_reason(), ""); + ASSERT_EQ(state.crash_address(), 0x0u); +} + +TEST_F(MicrodumpProcessorTest, TestProcess_WithCrashReason) { + ProcessState state; + AnalyzeDump("microdump-withcrashreason.dmp", true /* omit_symbols */, + 8 /* expected_cpu_count */, &state); + ASSERT_EQ(state.crash_reason(), "SIGTRAP"); + ASSERT_EQ(state.crash_address(), 0x4A7CB000u); +} + +TEST_F(MicrodumpProcessorTest, TestProcess_MissingSymbols) { + ProcessState state; + AnalyzeDump("microdump-arm64.dmp", true /* omit_symbols */, + 2 /* expected_cpu_count */, &state); + + ASSERT_EQ(8U, state.modules()->module_count()); + ASSERT_EQ("arm64", state.system_info()->cpu); + ASSERT_EQ("OS 64 VERSION INFO", state.system_info()->os_version); + ASSERT_EQ(1U, state.threads()->size()); + ASSERT_EQ(11U, state.threads()->at(0)->frames()->size()); + + ASSERT_EQ("", + state.threads()->at(0)->frames()->at(0)->function_name); + ASSERT_EQ("", + state.threads()->at(0)->frames()->at(3)->function_name); +} + +TEST_F(MicrodumpProcessorTest, TestProcess_UnsupportedArch) { + string microdump_contents = + "W/google-breakpad(26491): -----BEGIN BREAKPAD MICRODUMP-----\n" + "W/google-breakpad(26491): O A \"unsupported-arch\"\n" + "W/google-breakpad(26491): S 0 A48BD840 A48BD000 00002000\n"; + + ProcessState state; + + google_breakpad::ProcessResult result = + ProcessMicrodump("", microdump_contents, &state); + + ASSERT_EQ(google_breakpad::PROCESS_ERROR_NO_THREAD_LIST, result); +} + +TEST_F(MicrodumpProcessorTest, TestProcessArm) { + ProcessState state; + AnalyzeDump("microdump-arm.dmp", false /* omit_symbols */, + 2 /* expected_cpu_count*/, &state); + + ASSERT_EQ(6U, state.modules()->module_count()); + ASSERT_EQ("arm", state.system_info()->cpu); + ASSERT_EQ("OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)", + state.system_info()->gl_version); + ASSERT_EQ("Qualcomm", state.system_info()->gl_vendor); + ASSERT_EQ("Adreno (TM) 330", state.system_info()->gl_renderer); + ASSERT_EQ("OS VERSION INFO", state.system_info()->os_version); + ASSERT_EQ(8U, state.threads()->at(0)->frames()->size()); + ASSERT_EQ("MicrodumpWriterTest_Setup_Test::TestBody", + state.threads()->at(0)->frames()->at(0)->function_name); + ASSERT_EQ("testing::Test::Run", + state.threads()->at(0)->frames()->at(1)->function_name); + ASSERT_EQ("main", + state.threads()->at(0)->frames()->at(6)->function_name); + ASSERT_EQ("breakpad_unittests", + state.threads()->at(0)->frames()->at(6)->module->code_file()); +} + +TEST_F(MicrodumpProcessorTest, TestProcessArm64) { + ProcessState state; + AnalyzeDump("microdump-arm64.dmp", false /* omit_symbols */, + 2 /* expected_cpu_count*/, &state); + + ASSERT_EQ(8U, state.modules()->module_count()); + ASSERT_EQ("arm64", state.system_info()->cpu); + ASSERT_EQ("OS 64 VERSION INFO", state.system_info()->os_version); + ASSERT_EQ(9U, state.threads()->at(0)->frames()->size()); + ASSERT_EQ("MicrodumpWriterTest_Setup_Test::TestBody", + state.threads()->at(0)->frames()->at(0)->function_name); + ASSERT_EQ("testing::Test::Run", + state.threads()->at(0)->frames()->at(2)->function_name); + ASSERT_EQ("main", + state.threads()->at(0)->frames()->at(7)->function_name); + ASSERT_EQ("breakpad_unittests", + state.threads()->at(0)->frames()->at(7)->module->code_file()); +} + +TEST_F(MicrodumpProcessorTest, TestProcessX86) { + ProcessState state; + AnalyzeDump("microdump-x86.dmp", false /* omit_symbols */, + 4 /* expected_cpu_count */, &state); + + ASSERT_EQ(124U, state.modules()->module_count()); + ASSERT_EQ("x86", state.system_info()->cpu); + ASSERT_EQ("asus/WW_Z00A/Z00A:5.0/LRX21V/2.19.40.22_20150627_5104_user:user/" + "release-keys", state.system_info()->os_version); + ASSERT_EQ(17U, state.threads()->at(0)->frames()->size()); + ASSERT_EQ("libc.so", + state.threads()->at(0)->frames()->at(0)->module->debug_file()); + // TODO(mmandlis): Get symbols for the test X86 microdump and test function + // names. +} + +TEST_F(MicrodumpProcessorTest, TestProcessMultiple) { + ProcessState state; + AnalyzeDump("microdump-multiple.dmp", false /* omit_symbols */, + 6 /* expected_cpu_count */, &state); + ASSERT_EQ(156U, state.modules()->module_count()); + ASSERT_EQ("arm", state.system_info()->cpu); + ASSERT_EQ("lge/p1_tmo_us/p1:6.0/MRA58K/1603210524c8d:user/release-keys", + state.system_info()->os_version); + ASSERT_EQ(5U, state.threads()->at(0)->frames()->size()); +} + +TEST_F(MicrodumpProcessorTest, TestProcessMips) { + ProcessState state; + AnalyzeDump("microdump-mips32.dmp", false /* omit_symbols */, + 2 /* expected_cpu_count */, &state); + + ASSERT_EQ(7U, state.modules()->module_count()); + ASSERT_EQ("mips", state.system_info()->cpu); + ASSERT_EQ("3.0.8-g893bf16 #7 SMP PREEMPT Fri Jul 10 15:20:59 PDT 2015", + state.system_info()->os_version); + ASSERT_EQ(4U, state.threads()->at(0)->frames()->size()); + + ASSERT_EQ("blaTest", + state.threads()->at(0)->frames()->at(0)->function_name); + ASSERT_EQ("Crash", + state.threads()->at(0)->frames()->at(1)->function_name); + ASSERT_EQ("main", + state.threads()->at(0)->frames()->at(2)->function_name); + ASSERT_EQ("crash_example", + state.threads()->at(0)->frames()->at(0)->module->debug_file()); +} + +TEST_F(MicrodumpProcessorTest, TestProcessMips64) { + ProcessState state; + AnalyzeDump("microdump-mips64.dmp", false /* omit_symbols */, + 1 /* expected_cpu_count */, &state); + + ASSERT_EQ(8U, state.modules()->module_count()); + ASSERT_EQ("mips64", state.system_info()->cpu); + ASSERT_EQ("3.10.0-gf185e20 #112 PREEMPT Mon Oct 5 11:12:49 PDT 2015", + state.system_info()->os_version); + ASSERT_EQ(4U, state.threads()->at(0)->frames()->size()); + + ASSERT_EQ("blaTest", + state.threads()->at(0)->frames()->at(0)->function_name); + ASSERT_EQ("Crash", + state.threads()->at(0)->frames()->at(1)->function_name); + ASSERT_EQ("main", + state.threads()->at(0)->frames()->at(2)->function_name); + ASSERT_EQ("crash_example", + state.threads()->at(0)->frames()->at(0)->module->debug_file()); +} + +} // namespace + +int main(int argc, char* argv[]) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/src/processor/microdump_stackwalk.cc b/src/processor/microdump_stackwalk.cc new file mode 100644 index 0000000..222310f --- /dev/null +++ b/src/processor/microdump_stackwalk.cc @@ -0,0 +1,187 @@ +// Copyright 2014 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// microdump_stackwalk.cc: Process a microdump with MicrodumpProcessor, printing +// the results, including stack traces. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include +#include +#include + +#include "common/path_helper.h" +#include "common/scoped_ptr.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/microdump.h" +#include "google_breakpad/processor/microdump_processor.h" +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/stack_frame_symbolizer.h" +#include "processor/logging.h" +#include "processor/simple_symbol_supplier.h" +#include "processor/stackwalk_common.h" + + +namespace { + +struct Options { + bool machine_readable; + bool output_stack_contents; + + string microdump_file; + std::vector symbol_paths; +}; + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::Microdump; +using google_breakpad::MicrodumpProcessor; +using google_breakpad::ProcessResult; +using google_breakpad::ProcessState; +using google_breakpad::scoped_ptr; +using google_breakpad::SimpleSymbolSupplier; +using google_breakpad::StackFrameSymbolizer; + +// Processes |options.microdump_file| using +// MicrodumpProcessor. |options.symbol_path|, if non-empty, is the +// base directory of a symbol storage area, laid out in the format +// required by SimpleSymbolSupplier. If such a storage area is +// specified, it is made available for use by the MicrodumpProcessor. +// +// Returns the value of MicrodumpProcessor::Process. If processing succeeds, +// prints identifying OS and CPU information from the microdump, crash +// information and call stacks for the crashing thread. +// All information is printed to stdout. +int PrintMicrodumpProcess(const Options& options) { + std::ifstream file_stream(options.microdump_file); + std::vector bytes; + file_stream.seekg(0, std::ios_base::end); + bytes.resize(file_stream.tellg()); + if (bytes.empty()) { + BPLOG(ERROR) << "Microdump is empty."; + return 1; + } + file_stream.seekg(0, std::ios_base::beg); + file_stream.read(&bytes[0], bytes.size()); + string microdump_content(&bytes[0], bytes.size()); + + scoped_ptr symbol_supplier; + if (!options.symbol_paths.empty()) { + symbol_supplier.reset(new SimpleSymbolSupplier(options.symbol_paths)); + } + + BasicSourceLineResolver resolver; + StackFrameSymbolizer frame_symbolizer(symbol_supplier.get(), &resolver); + ProcessState process_state; + MicrodumpProcessor microdump_processor(&frame_symbolizer); + Microdump microdump(microdump_content); + ProcessResult res = microdump_processor.Process(µdump, + &process_state); + + if (res == google_breakpad::PROCESS_OK) { + if (options.machine_readable) { + PrintProcessStateMachineReadable(process_state); + } else { + // Microdump has only one thread, |output_requesting_thread_only|'s value + // has no effect. + PrintProcessState(process_state, options.output_stack_contents, + /*output_requesting_thread_only=*/false, &resolver); + } + return 0; + } + + BPLOG(ERROR) << "MicrodumpProcessor::Process failed (code = " << res << ")"; + return 1; +} + +} // namespace + +static void Usage(int argc, const char *argv[], bool error) { + fprintf(error ? stderr : stdout, + "Usage: %s [options] [symbol-path ...]\n" + "\n" + "Output a stack trace for the provided microdump\n" + "\n" + "Options:\n" + "\n" + " -m Output in machine-readable format\n" + " -s Output stack contents\n", + google_breakpad::BaseName(argv[0]).c_str()); +} + +static void SetupOptions(int argc, const char *argv[], Options* options) { + int ch; + + options->machine_readable = false; + options->output_stack_contents = false; + + while ((ch = getopt(argc, (char * const*)argv, "hms")) != -1) { + switch (ch) { + case 'h': + Usage(argc, argv, false); + exit(0); + break; + + case 'm': + options->machine_readable = true; + break; + case 's': + options->output_stack_contents = true; + break; + + case '?': + Usage(argc, argv, true); + exit(1); + break; + } + } + + if ((argc - optind) == 0) { + fprintf(stderr, "%s: Missing microdump file\n", argv[0]); + Usage(argc, argv, true); + exit(1); + } + + options->microdump_file = argv[optind]; + + for (int argi = optind + 1; argi < argc; ++argi) + options->symbol_paths.push_back(argv[argi]); +} + +int main(int argc, const char* argv[]) { + Options options; + SetupOptions(argc, argv, &options); + + return PrintMicrodumpProcess(options); +} diff --git a/src/processor/microdump_stackwalk_machine_readable_test b/src/processor/microdump_stackwalk_machine_readable_test new file mode 100644 index 0000000..a089846 --- /dev/null +++ b/src/processor/microdump_stackwalk_machine_readable_test @@ -0,0 +1,42 @@ +#!/bin/sh + +# Copyright 2014 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +. "${0%/*}/microdump_stackwalk_test_vars" || exit 1 # for MICRODUMP_SUPPORTED_ARCHS. +testdata_dir=$srcdir/src/processor/testdata + +set -e # Bail out with an error if any of the commands below fails. +for ARCH in $MICRODUMP_SUPPORTED_ARCHS; do + echo "Testing microdump_stackwalk -m for arch $ARCH" + ./src/processor/microdump_stackwalk -m $testdata_dir/microdump-${ARCH}.dmp \ + $testdata_dir/symbols/microdump | \ + tr -d '\015' | \ + diff -u $testdata_dir/microdump.stackwalk.machine_readable-${ARCH}.out - +done +exit 0 diff --git a/src/processor/microdump_stackwalk_test b/src/processor/microdump_stackwalk_test new file mode 100644 index 0000000..cb89508 --- /dev/null +++ b/src/processor/microdump_stackwalk_test @@ -0,0 +1,42 @@ +#!/bin/sh + +# Copyright 2014 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +. "${0%/*}/microdump_stackwalk_test_vars" || exit 1 # for MICRODUMP_SUPPORTED_ARCHS. +testdata_dir=$srcdir/src/processor/testdata + +set -e # Bail out with an error if any of the commands below fails. +for ARCH in $MICRODUMP_SUPPORTED_ARCHS; do + echo "Testing microdump_stackwalk for arch $ARCH" + ./src/processor/microdump_stackwalk $testdata_dir/microdump-${ARCH}.dmp \ + $testdata_dir/symbols/microdump | \ + tr -d '\015' | \ + diff -u $testdata_dir/microdump.stackwalk-${ARCH}.out - +done +exit 0 diff --git a/src/processor/microdump_stackwalk_test_vars b/src/processor/microdump_stackwalk_test_vars new file mode 100644 index 0000000..a8b0e0d --- /dev/null +++ b/src/processor/microdump_stackwalk_test_vars @@ -0,0 +1 @@ +MICRODUMP_SUPPORTED_ARCHS="arm arm64" diff --git a/src/processor/minidump.cc b/src/processor/minidump.cc new file mode 100644 index 0000000..83f72b9 --- /dev/null +++ b/src/processor/minidump.cc @@ -0,0 +1,6480 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump.cc: A minidump reader. +// +// See minidump.h for documentation. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/minidump.h" + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#else // _WIN32 +#include +#endif // _WIN32 + +#include +#include +#include +#include + +#include "processor/range_map-inl.h" + +#include "common/macros.h" +#include "common/scoped_ptr.h" +#include "common/stdio_wrapper.h" +#include "google_breakpad/processor/dump_context.h" +#include "processor/basic_code_module.h" +#include "processor/basic_code_modules.h" +#include "processor/convert_old_arm64_context.h" +#include "processor/logging.h" + +namespace google_breakpad { + +using std::istream; +using std::ifstream; +using std::numeric_limits; +using std::vector; + +namespace { + +// Limit arrived at by adding up possible states in Intel Ch. 13.5 X-SAVE +// MANAGED STATE +// (~ 3680 bytes) plus some extra for the future. +const uint32_t kMaxXSaveAreaSize = 16384; + +// Returns true iff |context_size| matches exactly one of the sizes of the +// various MDRawContext* types. +// TODO(blundell): This function can be removed once +// https://bugs.chromium.org/p/google-breakpad/issues/detail?id=550 is fixed. +bool IsContextSizeUnique(uint32_t context_size) { + int num_matching_contexts = 0; + if (context_size == sizeof(MDRawContextX86)) + num_matching_contexts++; + if (context_size == sizeof(MDRawContextPPC)) + num_matching_contexts++; + if (context_size == sizeof(MDRawContextPPC64)) + num_matching_contexts++; + if (context_size == sizeof(MDRawContextAMD64)) + num_matching_contexts++; + if (context_size == sizeof(MDRawContextSPARC)) + num_matching_contexts++; + if (context_size == sizeof(MDRawContextARM)) + num_matching_contexts++; + if (context_size == sizeof(MDRawContextARM64)) + num_matching_contexts++; + if (context_size == sizeof(MDRawContextARM64_Old)) + num_matching_contexts++; + if (context_size == sizeof(MDRawContextMIPS)) + num_matching_contexts++; + if (context_size == sizeof(MDRawContextRISCV)) + num_matching_contexts++; + if (context_size == sizeof(MDRawContextRISCV64)) + num_matching_contexts++; + return num_matching_contexts == 1; +} + +// +// Swapping routines +// +// Inlining these doesn't increase code size significantly, and it saves +// a whole lot of unnecessary jumping back and forth. +// + + +// Swapping an 8-bit quantity is a no-op. This function is only provided +// to account for certain templatized operations that require swapping for +// wider types but handle uint8_t too +// (MinidumpMemoryRegion::GetMemoryAtAddressInternal). +inline void Swap(uint8_t* value) {} + +// Optimization: don't need to AND the furthest right shift, because we're +// shifting an unsigned quantity. The standard requires zero-filling in this +// case. If the quantities were signed, a bitmask whould be needed for this +// right shift to avoid an arithmetic shift (which retains the sign bit). +// The furthest left shift never needs to be ANDed bitmask. + +inline void Swap(uint16_t* value) { + *value = (*value >> 8) | (*value << 8); +} + +inline void Swap(uint32_t* value) { + *value = (*value >> 24) | + ((*value >> 8) & 0x0000ff00) | + ((*value << 8) & 0x00ff0000) | + (*value << 24); +} + +inline void Swap(uint64_t* value) { + uint32_t* value32 = reinterpret_cast(value); + Swap(&value32[0]); + Swap(&value32[1]); + uint32_t temp = value32[0]; + value32[0] = value32[1]; + value32[1] = temp; +} + + +// Given a pointer to a 128-bit int in the minidump data, set the "low" +// and "high" fields appropriately. +void Normalize128(uint128_struct* value, bool is_big_endian) { + // The struct format is [high, low], so if the format is big-endian, + // the most significant bytes will already be in the high field. + if (!is_big_endian) { + uint64_t temp = value->low; + value->low = value->high; + value->high = temp; + } +} + +// This just swaps each int64 half of the 128-bit value. +// The value should also be normalized by calling Normalize128(). +void Swap(uint128_struct* value) { + Swap(&value->low); + Swap(&value->high); +} + +// Swapping signed integers +inline void Swap(int32_t* value) { + Swap(reinterpret_cast(value)); +} + +inline void Swap(MDLocationDescriptor* location_descriptor) { + Swap(&location_descriptor->data_size); + Swap(&location_descriptor->rva); +} + +inline void Swap(MDMemoryDescriptor* memory_descriptor) { + Swap(&memory_descriptor->start_of_memory_range); + Swap(&memory_descriptor->memory); +} + +inline void Swap(MDGUID* guid) { + Swap(&guid->data1); + Swap(&guid->data2); + Swap(&guid->data3); + // Don't swap guid->data4[] because it contains 8-bit quantities. +} + +inline void Swap(MDSystemTime* system_time) { + Swap(&system_time->year); + Swap(&system_time->month); + Swap(&system_time->day_of_week); + Swap(&system_time->day); + Swap(&system_time->hour); + Swap(&system_time->minute); + Swap(&system_time->second); + Swap(&system_time->milliseconds); +} + +inline void Swap(MDXStateFeature* xstate_feature) { + Swap(&xstate_feature->offset); + Swap(&xstate_feature->size); +} + +inline void Swap(MDXStateConfigFeatureMscInfo* xstate_feature_info) { + Swap(&xstate_feature_info->size_of_info); + Swap(&xstate_feature_info->context_size); + Swap(&xstate_feature_info->enabled_features); + + for (size_t i = 0; i < MD_MAXIMUM_XSTATE_FEATURES; i++) { + Swap(&xstate_feature_info->features[i]); + } +} + +inline void Swap(MDRawSimpleStringDictionaryEntry* entry) { + Swap(&entry->key); + Swap(&entry->value); +} + +inline void Swap(MDRawCrashpadAnnotation* annotation) { + Swap(&annotation->name); + Swap(&annotation->type); + Swap(&annotation->value); +} + +inline void Swap(uint16_t* data, size_t size_in_bytes) { + size_t data_length = size_in_bytes / sizeof(data[0]); + for (size_t i = 0; i < data_length; i++) { + Swap(&data[i]); + } +} + +// +// Character conversion routines +// + + +// Standard wide-character conversion routines depend on the system's own +// idea of what width a wide character should be: some use 16 bits, and +// some use 32 bits. For the purposes of a minidump, wide strings are +// always represented with 16-bit UTF-16 chracters. iconv isn't available +// everywhere, and its interface varies where it is available. iconv also +// deals purely with char* pointers, so in addition to considering the swap +// parameter, a converter that uses iconv would also need to take the host +// CPU's endianness into consideration. It doesn't seems worth the trouble +// of making it a dependency when we don't care about anything but UTF-16. +string* UTF16ToUTF8(const vector& in, bool swap) { + scoped_ptr out(new string()); + + // Set the string's initial capacity to the number of UTF-16 characters, + // because the UTF-8 representation will always be at least this long. + // If the UTF-8 representation is longer, the string will grow dynamically. + out->reserve(in.size()); + + for (vector::const_iterator iterator = in.begin(); + iterator != in.end(); + ++iterator) { + // Get a 16-bit value from the input + uint16_t in_word = *iterator; + if (swap) + Swap(&in_word); + + // Convert the input value (in_word) into a Unicode code point (unichar). + uint32_t unichar; + if (in_word >= 0xdc00 && in_word <= 0xdcff) { + BPLOG(ERROR) << "UTF16ToUTF8 found low surrogate " << + HexString(in_word) << " without high"; + return NULL; + } else if (in_word >= 0xd800 && in_word <= 0xdbff) { + // High surrogate. + unichar = (in_word - 0xd7c0) << 10; + if (++iterator == in.end()) { + BPLOG(ERROR) << "UTF16ToUTF8 found high surrogate " << + HexString(in_word) << " at end of string"; + return NULL; + } + uint32_t high_word = in_word; + in_word = *iterator; + if (in_word < 0xdc00 || in_word > 0xdcff) { + BPLOG(ERROR) << "UTF16ToUTF8 found high surrogate " << + HexString(high_word) << " without low " << + HexString(in_word); + return NULL; + } + unichar |= in_word & 0x03ff; + } else { + // The ordinary case, a single non-surrogate Unicode character encoded + // as a single 16-bit value. + unichar = in_word; + } + + // Convert the Unicode code point (unichar) into its UTF-8 representation, + // appending it to the out string. + if (unichar < 0x80) { + (*out) += static_cast(unichar); + } else if (unichar < 0x800) { + (*out) += 0xc0 | static_cast(unichar >> 6); + (*out) += 0x80 | static_cast(unichar & 0x3f); + } else if (unichar < 0x10000) { + (*out) += 0xe0 | static_cast(unichar >> 12); + (*out) += 0x80 | static_cast((unichar >> 6) & 0x3f); + (*out) += 0x80 | static_cast(unichar & 0x3f); + } else if (unichar < 0x200000) { + (*out) += 0xf0 | static_cast(unichar >> 18); + (*out) += 0x80 | static_cast((unichar >> 12) & 0x3f); + (*out) += 0x80 | static_cast((unichar >> 6) & 0x3f); + (*out) += 0x80 | static_cast(unichar & 0x3f); + } else { + BPLOG(ERROR) << "UTF16ToUTF8 cannot represent high value " << + HexString(unichar) << " in UTF-8"; + return NULL; + } + } + + return out.release(); +} + +// Return the smaller of the number of code units in the UTF-16 string, +// not including the terminating null word, or maxlen. +size_t UTF16codeunits(const uint16_t* string, size_t maxlen) { + size_t count = 0; + while (count < maxlen && string[count] != 0) + count++; + return count; +} + +inline void Swap(MDTimeZoneInformation* time_zone) { + Swap(&time_zone->bias); + // Skip time_zone->standard_name. No need to swap UTF-16 fields. + // The swap will be done as part of the conversion to UTF-8. + Swap(&time_zone->standard_date); + Swap(&time_zone->standard_bias); + // Skip time_zone->daylight_name. No need to swap UTF-16 fields. + // The swap will be done as part of the conversion to UTF-8. + Swap(&time_zone->daylight_date); + Swap(&time_zone->daylight_bias); +} + +void ConvertUTF16BufferToUTF8String(const uint16_t* utf16_data, + size_t max_length_in_bytes, + string* utf8_result, + bool swap) { + // Since there is no explicit byte length for each string, use + // UTF16codeunits to calculate word length, then derive byte + // length from that. + size_t max_word_length = max_length_in_bytes / sizeof(utf16_data[0]); + size_t word_length = UTF16codeunits(utf16_data, max_word_length); + if (word_length > 0) { + size_t byte_length = word_length * sizeof(utf16_data[0]); + vector utf16_vector(word_length); + memcpy(&utf16_vector[0], &utf16_data[0], byte_length); + scoped_ptr temp(UTF16ToUTF8(utf16_vector, swap)); + if (temp.get()) { + utf8_result->assign(*temp); + } + } else { + utf8_result->clear(); + } +} + + +// For fields that may or may not be valid, PrintValueOrInvalid will print the +// string "(invalid)" if the field is not valid, and will print the value if +// the field is valid. The value is printed as hexadecimal or decimal. + +enum NumberFormat { + kNumberFormatDecimal, + kNumberFormatHexadecimal, +}; + +void PrintValueOrInvalid(bool valid, + NumberFormat number_format, + uint32_t value) { + if (!valid) { + printf("(invalid)\n"); + } else if (number_format == kNumberFormatDecimal) { + printf("%d\n", value); + } else { + printf("0x%x\n", value); + } +} + +// Converts a time_t to a string showing the time in UTC. +string TimeTToUTCString(time_t tt) { + struct tm timestruct; +#ifdef _WIN32 + gmtime_s(×truct, &tt); +#else + gmtime_r(&tt, ×truct); +#endif + + char timestr[20]; + size_t rv = strftime(timestr, 20, "%Y-%m-%d %H:%M:%S", ×truct); + if (rv == 0) { + return string(); + } + + return string(timestr); +} + +string MDGUIDToString(const MDGUID& uuid) { + char buf[37]; + snprintf(buf, sizeof(buf), "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", + uuid.data1, + uuid.data2, + uuid.data3, + uuid.data4[0], + uuid.data4[1], + uuid.data4[2], + uuid.data4[3], + uuid.data4[4], + uuid.data4[5], + uuid.data4[6], + uuid.data4[7]); + return std::string(buf); +} + +bool IsDevAshmem(const string& filename) { + const string kDevAshmem("/dev/ashmem/"); + return filename.compare(0, kDevAshmem.length(), kDevAshmem) == 0; +} + +} // namespace + +// +// MinidumpObject +// + + +MinidumpObject::MinidumpObject(Minidump* minidump) + : DumpObject(), + minidump_(minidump) { +} + + +// +// MinidumpStream +// + + +MinidumpStream::MinidumpStream(Minidump* minidump) + : MinidumpObject(minidump) { +} + + +// +// MinidumpContext +// + + +MinidumpContext::MinidumpContext(Minidump* minidump) + : DumpContext(), + minidump_(minidump) { +} + +MinidumpContext::~MinidumpContext() { +} + +bool MinidumpContext::Read(uint32_t expected_size) { + valid_ = false; + + // Certain raw context types are currently assumed to have unique sizes. + if (!IsContextSizeUnique(sizeof(MDRawContextAMD64))) { + BPLOG(ERROR) << "sizeof(MDRawContextAMD64) cannot match the size of any " + << "other raw context"; + return false; + } + if (!IsContextSizeUnique(sizeof(MDRawContextPPC64))) { + BPLOG(ERROR) << "sizeof(MDRawContextPPC64) cannot match the size of any " + << "other raw context"; + return false; + } + if (!IsContextSizeUnique(sizeof(MDRawContextARM64_Old))) { + BPLOG(ERROR) << "sizeof(MDRawContextARM64_Old) cannot match the size of any " + << "other raw context"; + return false; + } + + FreeContext(); + + // First, figure out what type of CPU this context structure is for. + // For some reason, the AMD64 Context doesn't have context_flags + // at the beginning of the structure, so special case it here. + + uint32_t sysinfo_cpu_type = 0; + if (!minidump_->GetContextCPUFlagsFromSystemInfo(&sysinfo_cpu_type)) { + BPLOG(ERROR) << "Failed to preserve the current stream position"; + return false; + } + + if (expected_size == sizeof(MDRawContextAMD64) || + (sysinfo_cpu_type == MD_CONTEXT_AMD64 && + expected_size >= sizeof(MDRawContextAMD64))) { + BPLOG(INFO) << "MinidumpContext: looks like AMD64 context"; + + scoped_ptr context_amd64(new MDRawContextAMD64()); + if (!minidump_->ReadBytes(context_amd64.get(), + sizeof(MDRawContextAMD64))) { + BPLOG(ERROR) << "MinidumpContext could not read amd64 context"; + return false; + } + + // Context may include xsave registers and so be larger than + // sizeof(MDRawContextAMD64). For now we skip this extended data. + if (expected_size > sizeof(MDRawContextAMD64)) { + size_t bytes_left = expected_size - sizeof(MDRawContextAMD64); + if (bytes_left > kMaxXSaveAreaSize) { + BPLOG(ERROR) << "MinidumpContext oversized xstate area"; + return false; + } + std::vector xstate(bytes_left); + if (!minidump_->ReadBytes(xstate.data(), + bytes_left)) { + BPLOG(ERROR) << "MinidumpContext could not skip amd64 xstate"; + return false; + } + } + + if (minidump_->swap()) + Swap(&context_amd64->context_flags); + + uint32_t cpu_type = context_amd64->context_flags & MD_CONTEXT_CPU_MASK; + if (cpu_type == 0) { + context_amd64->context_flags |= sysinfo_cpu_type; + } + + if (cpu_type != MD_CONTEXT_AMD64) { + // TODO: Fall through to switch below. + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=550 + BPLOG(ERROR) << "MinidumpContext not actually amd64 context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext amd64 does not match system info"; + return false; + } + + // Normalize the 128-bit types in the dump. + // Since this is AMD64, by definition, the values are little-endian. + for (unsigned int vr_index = 0; + vr_index < MD_CONTEXT_AMD64_VR_COUNT; + ++vr_index) + Normalize128(&context_amd64->vector_register[vr_index], false); + + if (minidump_->swap()) { + Swap(&context_amd64->p1_home); + Swap(&context_amd64->p2_home); + Swap(&context_amd64->p3_home); + Swap(&context_amd64->p4_home); + Swap(&context_amd64->p5_home); + Swap(&context_amd64->p6_home); + // context_flags is already swapped + Swap(&context_amd64->mx_csr); + Swap(&context_amd64->cs); + Swap(&context_amd64->ds); + Swap(&context_amd64->es); + Swap(&context_amd64->fs); + Swap(&context_amd64->ss); + Swap(&context_amd64->eflags); + Swap(&context_amd64->dr0); + Swap(&context_amd64->dr1); + Swap(&context_amd64->dr2); + Swap(&context_amd64->dr3); + Swap(&context_amd64->dr6); + Swap(&context_amd64->dr7); + Swap(&context_amd64->rax); + Swap(&context_amd64->rcx); + Swap(&context_amd64->rdx); + Swap(&context_amd64->rbx); + Swap(&context_amd64->rsp); + Swap(&context_amd64->rbp); + Swap(&context_amd64->rsi); + Swap(&context_amd64->rdi); + Swap(&context_amd64->r8); + Swap(&context_amd64->r9); + Swap(&context_amd64->r10); + Swap(&context_amd64->r11); + Swap(&context_amd64->r12); + Swap(&context_amd64->r13); + Swap(&context_amd64->r14); + Swap(&context_amd64->r15); + Swap(&context_amd64->rip); + // FIXME: I'm not sure what actually determines + // which member of the union {flt_save, sse_registers} + // is valid. We're not currently using either, + // but it would be good to have them swapped properly. + + for (unsigned int vr_index = 0; + vr_index < MD_CONTEXT_AMD64_VR_COUNT; + ++vr_index) + Swap(&context_amd64->vector_register[vr_index]); + Swap(&context_amd64->vector_control); + Swap(&context_amd64->debug_control); + Swap(&context_amd64->last_branch_to_rip); + Swap(&context_amd64->last_branch_from_rip); + Swap(&context_amd64->last_exception_to_rip); + Swap(&context_amd64->last_exception_from_rip); + } + + SetContextFlags(context_amd64->context_flags); + + SetContextAMD64(context_amd64.release()); + } else if (expected_size == sizeof(MDRawContextPPC64)) { + // |context_flags| of MDRawContextPPC64 is 64 bits, but other MDRawContext + // in the else case have 32 bits |context_flags|, so special case it here. + uint64_t context_flags; + if (!minidump_->ReadBytes(&context_flags, sizeof(context_flags))) { + BPLOG(ERROR) << "MinidumpContext could not read context flags"; + return false; + } + if (minidump_->swap()) + Swap(&context_flags); + + uint32_t cpu_type = context_flags & MD_CONTEXT_CPU_MASK; + scoped_ptr context_ppc64(new MDRawContextPPC64()); + + if (cpu_type == 0) { + if (minidump_->GetContextCPUFlagsFromSystemInfo(&cpu_type)) { + context_ppc64->context_flags |= cpu_type; + } else { + BPLOG(ERROR) << "Failed to preserve the current stream position"; + return false; + } + } + + if (cpu_type != MD_CONTEXT_PPC64) { + // TODO: Fall through to switch below. + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=550 + BPLOG(ERROR) << "MinidumpContext not actually ppc64 context"; + return false; + } + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_ppc64->context_flags = context_flags; + + size_t flags_size = sizeof(context_ppc64->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_ppc64.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextPPC64) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read ppc64 context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext ppc64 does not match system info"; + return false; + } + if (minidump_->swap()) { + // context_ppc64->context_flags was already swapped. + Swap(&context_ppc64->srr0); + Swap(&context_ppc64->srr1); + for (unsigned int gpr_index = 0; + gpr_index < MD_CONTEXT_PPC64_GPR_COUNT; + ++gpr_index) { + Swap(&context_ppc64->gpr[gpr_index]); + } + Swap(&context_ppc64->cr); + Swap(&context_ppc64->xer); + Swap(&context_ppc64->lr); + Swap(&context_ppc64->ctr); + Swap(&context_ppc64->vrsave); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; + ++fpr_index) { + Swap(&context_ppc64->float_save.fpregs[fpr_index]); + } + // Don't swap context_ppc64->float_save.fpscr_pad because it is only + // used for padding. + Swap(&context_ppc64->float_save.fpscr); + for (unsigned int vr_index = 0; + vr_index < MD_VECTORSAVEAREA_PPC_VR_COUNT; + ++vr_index) { + Normalize128(&context_ppc64->vector_save.save_vr[vr_index], true); + Swap(&context_ppc64->vector_save.save_vr[vr_index]); + } + Swap(&context_ppc64->vector_save.save_vscr); + // Don't swap the padding fields in vector_save. + Swap(&context_ppc64->vector_save.save_vrvalid); + } + + SetContextFlags(static_cast(context_ppc64->context_flags)); + + // Check for data loss when converting context flags from uint64_t into + // uint32_t + if (static_cast(GetContextFlags()) != + context_ppc64->context_flags) { + BPLOG(ERROR) << "Data loss detected when converting PPC64 context_flags"; + return false; + } + + SetContextPPC64(context_ppc64.release()); + } else if (expected_size == sizeof(MDRawContextARM64_Old)) { + // |context_flags| of MDRawContextARM64_Old is 64 bits, but other MDRawContext + // in the else case have 32 bits |context_flags|, so special case it here. + uint64_t context_flags; + + BPLOG(INFO) << "MinidumpContext: looks like ARM64 context"; + + if (!minidump_->ReadBytes(&context_flags, sizeof(context_flags))) { + BPLOG(ERROR) << "MinidumpContext could not read context flags"; + return false; + } + if (minidump_->swap()) + Swap(&context_flags); + + scoped_ptr context_arm64(new MDRawContextARM64_Old()); + + uint32_t cpu_type = context_flags & MD_CONTEXT_CPU_MASK; + if (cpu_type == 0) { + if (minidump_->GetContextCPUFlagsFromSystemInfo(&cpu_type)) { + context_arm64->context_flags |= cpu_type; + } else { + BPLOG(ERROR) << "Failed to preserve the current stream position"; + return false; + } + } + + if (cpu_type != MD_CONTEXT_ARM64_OLD) { + // TODO: Fall through to switch below. + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=550 + BPLOG(ERROR) << "MinidumpContext not actually arm64 context"; + return false; + } + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_arm64->context_flags = context_flags; + + size_t flags_size = sizeof(context_arm64->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_arm64.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextARM64_Old) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read arm64 context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext arm64 does not match system info"; + return false; + } + + if (minidump_->swap()) { + // context_arm64->context_flags was already swapped. + for (unsigned int ireg_index = 0; + ireg_index < MD_CONTEXT_ARM64_GPR_COUNT; + ++ireg_index) { + Swap(&context_arm64->iregs[ireg_index]); + } + Swap(&context_arm64->cpsr); + Swap(&context_arm64->float_save.fpsr); + Swap(&context_arm64->float_save.fpcr); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT; + ++fpr_index) { + Normalize128(&context_arm64->float_save.regs[fpr_index], + minidump_->is_big_endian()); + Swap(&context_arm64->float_save.regs[fpr_index]); + } + } + + scoped_ptr new_context(new MDRawContextARM64()); + ConvertOldARM64Context(*context_arm64.get(), new_context.get()); + SetContextFlags(new_context->context_flags); + SetContextARM64(new_context.release()); + } else { + uint32_t context_flags; + if (!minidump_->ReadBytes(&context_flags, sizeof(context_flags))) { + BPLOG(ERROR) << "MinidumpContext could not read context flags"; + return false; + } + if (minidump_->swap()) + Swap(&context_flags); + + uint32_t cpu_type = context_flags & MD_CONTEXT_CPU_MASK; + if (cpu_type == 0) { + // Unfortunately the flag for MD_CONTEXT_ARM that was taken + // from a Windows CE SDK header conflicts in practice with + // the CONTEXT_XSTATE flag. MD_CONTEXT_ARM has been renumbered, + // but handle dumps with the legacy value gracefully here. + if (context_flags & MD_CONTEXT_ARM_OLD) { + context_flags |= MD_CONTEXT_ARM; + context_flags &= ~MD_CONTEXT_ARM_OLD; + cpu_type = MD_CONTEXT_ARM; + } + } + + // Fixup if we were not provided a cpu type. + if (cpu_type == 0) { + cpu_type = sysinfo_cpu_type; + context_flags |= cpu_type; + } + + // Allocate the context structure for the correct CPU and fill it. The + // casts are slightly unorthodox, but it seems better to do that than to + // maintain a separate pointer for each type of CPU context structure + // when only one of them will be used. + switch (cpu_type) { + case MD_CONTEXT_X86: { + if (expected_size != sizeof(MDRawContextX86)) { + BPLOG(ERROR) << "MinidumpContext x86 size mismatch, " << + expected_size << " != " << sizeof(MDRawContextX86); + return false; + } + + scoped_ptr context_x86(new MDRawContextX86()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_x86->context_flags = context_flags; + + size_t flags_size = sizeof(context_x86->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_x86.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextX86) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read x86 context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext x86 does not match system info"; + return false; + } + + if (minidump_->swap()) { + // context_x86->context_flags was already swapped. + Swap(&context_x86->dr0); + Swap(&context_x86->dr1); + Swap(&context_x86->dr2); + Swap(&context_x86->dr3); + Swap(&context_x86->dr6); + Swap(&context_x86->dr7); + Swap(&context_x86->float_save.control_word); + Swap(&context_x86->float_save.status_word); + Swap(&context_x86->float_save.tag_word); + Swap(&context_x86->float_save.error_offset); + Swap(&context_x86->float_save.error_selector); + Swap(&context_x86->float_save.data_offset); + Swap(&context_x86->float_save.data_selector); + // context_x86->float_save.register_area[] contains 8-bit quantities + // and does not need to be swapped. + Swap(&context_x86->float_save.cr0_npx_state); + Swap(&context_x86->gs); + Swap(&context_x86->fs); + Swap(&context_x86->es); + Swap(&context_x86->ds); + Swap(&context_x86->edi); + Swap(&context_x86->esi); + Swap(&context_x86->ebx); + Swap(&context_x86->edx); + Swap(&context_x86->ecx); + Swap(&context_x86->eax); + Swap(&context_x86->ebp); + Swap(&context_x86->eip); + Swap(&context_x86->cs); + Swap(&context_x86->eflags); + Swap(&context_x86->esp); + Swap(&context_x86->ss); + // context_x86->extended_registers[] contains 8-bit quantities and + // does not need to be swapped. + } + + SetContextX86(context_x86.release()); + + break; + } + + case MD_CONTEXT_PPC: { + if (expected_size != sizeof(MDRawContextPPC)) { + BPLOG(ERROR) << "MinidumpContext ppc size mismatch, " << + expected_size << " != " << sizeof(MDRawContextPPC); + return false; + } + + scoped_ptr context_ppc(new MDRawContextPPC()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_ppc->context_flags = context_flags; + + size_t flags_size = sizeof(context_ppc->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_ppc.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextPPC) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read ppc context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext ppc does not match system info"; + return false; + } + + // Normalize the 128-bit types in the dump. + // Since this is PowerPC, by definition, the values are big-endian. + for (unsigned int vr_index = 0; + vr_index < MD_VECTORSAVEAREA_PPC_VR_COUNT; + ++vr_index) { + Normalize128(&context_ppc->vector_save.save_vr[vr_index], true); + } + + if (minidump_->swap()) { + // context_ppc->context_flags was already swapped. + Swap(&context_ppc->srr0); + Swap(&context_ppc->srr1); + for (unsigned int gpr_index = 0; + gpr_index < MD_CONTEXT_PPC_GPR_COUNT; + ++gpr_index) { + Swap(&context_ppc->gpr[gpr_index]); + } + Swap(&context_ppc->cr); + Swap(&context_ppc->xer); + Swap(&context_ppc->lr); + Swap(&context_ppc->ctr); + Swap(&context_ppc->mq); + Swap(&context_ppc->vrsave); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT; + ++fpr_index) { + Swap(&context_ppc->float_save.fpregs[fpr_index]); + } + // Don't swap context_ppc->float_save.fpscr_pad because it is only + // used for padding. + Swap(&context_ppc->float_save.fpscr); + for (unsigned int vr_index = 0; + vr_index < MD_VECTORSAVEAREA_PPC_VR_COUNT; + ++vr_index) { + Swap(&context_ppc->vector_save.save_vr[vr_index]); + } + Swap(&context_ppc->vector_save.save_vscr); + // Don't swap the padding fields in vector_save. + Swap(&context_ppc->vector_save.save_vrvalid); + } + + SetContextPPC(context_ppc.release()); + + break; + } + + case MD_CONTEXT_SPARC: { + if (expected_size != sizeof(MDRawContextSPARC)) { + BPLOG(ERROR) << "MinidumpContext sparc size mismatch, " << + expected_size << " != " << sizeof(MDRawContextSPARC); + return false; + } + + scoped_ptr context_sparc(new MDRawContextSPARC()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_sparc->context_flags = context_flags; + + size_t flags_size = sizeof(context_sparc->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_sparc.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextSPARC) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read sparc context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext sparc does not match system info"; + return false; + } + + if (minidump_->swap()) { + // context_sparc->context_flags was already swapped. + for (unsigned int gpr_index = 0; + gpr_index < MD_CONTEXT_SPARC_GPR_COUNT; + ++gpr_index) { + Swap(&context_sparc->g_r[gpr_index]); + } + Swap(&context_sparc->ccr); + Swap(&context_sparc->pc); + Swap(&context_sparc->npc); + Swap(&context_sparc->y); + Swap(&context_sparc->asi); + Swap(&context_sparc->fprs); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT; + ++fpr_index) { + Swap(&context_sparc->float_save.regs[fpr_index]); + } + Swap(&context_sparc->float_save.filler); + Swap(&context_sparc->float_save.fsr); + } + SetContextSPARC(context_sparc.release()); + + break; + } + + case MD_CONTEXT_ARM: { + if (expected_size != sizeof(MDRawContextARM)) { + BPLOG(ERROR) << "MinidumpContext arm size mismatch, " << + expected_size << " != " << sizeof(MDRawContextARM); + return false; + } + + scoped_ptr context_arm(new MDRawContextARM()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_arm->context_flags = context_flags; + + size_t flags_size = sizeof(context_arm->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_arm.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextARM) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read arm context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext arm does not match system info"; + return false; + } + + if (minidump_->swap()) { + // context_arm->context_flags was already swapped. + for (unsigned int ireg_index = 0; + ireg_index < MD_CONTEXT_ARM_GPR_COUNT; + ++ireg_index) { + Swap(&context_arm->iregs[ireg_index]); + } + Swap(&context_arm->cpsr); + Swap(&context_arm->float_save.fpscr); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_ARM_FPR_COUNT; + ++fpr_index) { + Swap(&context_arm->float_save.regs[fpr_index]); + } + for (unsigned int fpe_index = 0; + fpe_index < MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT; + ++fpe_index) { + Swap(&context_arm->float_save.extra[fpe_index]); + } + } + SetContextARM(context_arm.release()); + + break; + } + + case MD_CONTEXT_ARM64: { + if (expected_size != sizeof(MDRawContextARM64)) { + BPLOG(ERROR) << "MinidumpContext arm64 size mismatch, " << + expected_size << " != " << sizeof(MDRawContextARM64); + return false; + } + + scoped_ptr context_arm64(new MDRawContextARM64()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_arm64->context_flags = context_flags; + + size_t flags_size = sizeof(context_arm64->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_arm64.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(*context_arm64) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read arm64 context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext arm does not match system info"; + return false; + } + + if (minidump_->swap()) { + // context_arm64->context_flags was already swapped. + for (unsigned int ireg_index = 0; + ireg_index < MD_CONTEXT_ARM64_GPR_COUNT; + ++ireg_index) { + Swap(&context_arm64->iregs[ireg_index]); + } + Swap(&context_arm64->cpsr); + Swap(&context_arm64->float_save.fpsr); + Swap(&context_arm64->float_save.fpcr); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT; + ++fpr_index) { + Normalize128(&context_arm64->float_save.regs[fpr_index], + minidump_->is_big_endian()); + Swap(&context_arm64->float_save.regs[fpr_index]); + } + } + SetContextARM64(context_arm64.release()); + break; + } + + case MD_CONTEXT_MIPS: + case MD_CONTEXT_MIPS64: { + if (expected_size != sizeof(MDRawContextMIPS)) { + BPLOG(ERROR) << "MinidumpContext MIPS size mismatch, " + << expected_size + << " != " + << sizeof(MDRawContextMIPS); + return false; + } + + scoped_ptr context_mips(new MDRawContextMIPS()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_mips->context_flags = context_flags; + + size_t flags_size = sizeof(context_mips->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_mips.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextMIPS) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read MIPS context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext MIPS does not match system info"; + return false; + } + + if (minidump_->swap()) { + // context_mips->context_flags was already swapped. + for (int ireg_index = 0; + ireg_index < MD_CONTEXT_MIPS_GPR_COUNT; + ++ireg_index) { + Swap(&context_mips->iregs[ireg_index]); + } + Swap(&context_mips->mdhi); + Swap(&context_mips->mdlo); + for (int dsp_index = 0; + dsp_index < MD_CONTEXT_MIPS_DSP_COUNT; + ++dsp_index) { + Swap(&context_mips->hi[dsp_index]); + Swap(&context_mips->lo[dsp_index]); + } + Swap(&context_mips->dsp_control); + Swap(&context_mips->epc); + Swap(&context_mips->badvaddr); + Swap(&context_mips->status); + Swap(&context_mips->cause); + for (int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; + ++fpr_index) { + Swap(&context_mips->float_save.regs[fpr_index]); + } + Swap(&context_mips->float_save.fpcsr); + Swap(&context_mips->float_save.fir); + } + SetContextMIPS(context_mips.release()); + + break; + } + + case MD_CONTEXT_RISCV: { + if (expected_size != sizeof(MDRawContextRISCV)) { + BPLOG(ERROR) << "MinidumpContext RISCV size mismatch, " + << expected_size + << " != " + << sizeof(MDRawContextRISCV); + return false; + } + + scoped_ptr context_riscv(new MDRawContextRISCV()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_riscv->context_flags = context_flags; + + size_t flags_size = sizeof(context_riscv->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_riscv.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextRISCV) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read RISCV context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext RISCV does not match system info"; + return false; + } + + if (minidump_->swap()) { + Swap(&context_riscv->pc); + Swap(&context_riscv->ra); + Swap(&context_riscv->sp); + Swap(&context_riscv->gp); + Swap(&context_riscv->tp); + Swap(&context_riscv->t0); + Swap(&context_riscv->t1); + Swap(&context_riscv->t2); + Swap(&context_riscv->s0); + Swap(&context_riscv->s1); + Swap(&context_riscv->a0); + Swap(&context_riscv->a1); + Swap(&context_riscv->a2); + Swap(&context_riscv->a3); + Swap(&context_riscv->a4); + Swap(&context_riscv->a5); + Swap(&context_riscv->a6); + Swap(&context_riscv->a7); + Swap(&context_riscv->s2); + Swap(&context_riscv->s3); + Swap(&context_riscv->s4); + Swap(&context_riscv->s5); + Swap(&context_riscv->s6); + Swap(&context_riscv->s7); + Swap(&context_riscv->s8); + Swap(&context_riscv->s9); + Swap(&context_riscv->s10); + Swap(&context_riscv->s11); + Swap(&context_riscv->t3); + Swap(&context_riscv->t4); + Swap(&context_riscv->t5); + Swap(&context_riscv->t6); + + for (int fpr_index = 0; fpr_index < MD_CONTEXT_RISCV_FPR_COUNT; + ++fpr_index) { + Swap(&context_riscv->fpregs[fpr_index]); + } + Swap(&context_riscv->fcsr); + } + SetContextRISCV(context_riscv.release()); + + break; + } + + case MD_CONTEXT_RISCV64: { + if (expected_size != sizeof(MDRawContextRISCV64)) { + BPLOG(ERROR) << "MinidumpContext RISCV64 size mismatch, " + << expected_size + << " != " + << sizeof(MDRawContextRISCV64); + return false; + } + + scoped_ptr context_riscv64( + new MDRawContextRISCV64()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_riscv64->context_flags = context_flags; + + size_t flags_size = sizeof(context_riscv64->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_riscv64.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(MDRawContextRISCV64) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read RISCV context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext RISCV does not match system info"; + return false; + } + + if (minidump_->swap()) { + Swap(&context_riscv64->pc); + Swap(&context_riscv64->ra); + Swap(&context_riscv64->sp); + Swap(&context_riscv64->gp); + Swap(&context_riscv64->tp); + Swap(&context_riscv64->t0); + Swap(&context_riscv64->t1); + Swap(&context_riscv64->t2); + Swap(&context_riscv64->s0); + Swap(&context_riscv64->s1); + Swap(&context_riscv64->a0); + Swap(&context_riscv64->a1); + Swap(&context_riscv64->a2); + Swap(&context_riscv64->a3); + Swap(&context_riscv64->a4); + Swap(&context_riscv64->a5); + Swap(&context_riscv64->a6); + Swap(&context_riscv64->a7); + Swap(&context_riscv64->s2); + Swap(&context_riscv64->s3); + Swap(&context_riscv64->s4); + Swap(&context_riscv64->s5); + Swap(&context_riscv64->s6); + Swap(&context_riscv64->s7); + Swap(&context_riscv64->s8); + Swap(&context_riscv64->s9); + Swap(&context_riscv64->s10); + Swap(&context_riscv64->s11); + Swap(&context_riscv64->t3); + Swap(&context_riscv64->t4); + Swap(&context_riscv64->t5); + Swap(&context_riscv64->t6); + + for (int fpr_index = 0; fpr_index < MD_CONTEXT_RISCV_FPR_COUNT; + ++fpr_index) { + Swap(&context_riscv64->fpregs[fpr_index]); + } + Swap(&context_riscv64->fcsr); + } + SetContextRISCV64(context_riscv64.release()); + + break; + } + + default: { + // Unknown context type - Don't log as an error yet. Let the + // caller work that out. + BPLOG(INFO) << "MinidumpContext unknown context type " << + HexString(cpu_type); + return false; + } + } + SetContextFlags(context_flags); + } + + valid_ = true; + return true; +} + +bool MinidumpContext::CheckAgainstSystemInfo(uint32_t context_cpu_type) { + // It's OK if the minidump doesn't contain an MD_SYSTEM_INFO_STREAM, + // as this function just implements a sanity check. + MinidumpSystemInfo* system_info = minidump_->GetSystemInfo(); + if (!system_info) { + BPLOG(INFO) << "MinidumpContext could not be compared against " + "MinidumpSystemInfo"; + return true; + } + + // If there is an MD_SYSTEM_INFO_STREAM, it should contain valid system info. + const MDRawSystemInfo* raw_system_info = system_info->system_info(); + if (!raw_system_info) { + BPLOG(INFO) << "MinidumpContext could not be compared against " + "MDRawSystemInfo"; + return false; + } + + MDCPUArchitecture system_info_cpu_type = static_cast( + raw_system_info->processor_architecture); + + // Compare the CPU type of the context record to the CPU type in the + // minidump's system info stream. + bool return_value = false; + switch (context_cpu_type) { + case MD_CONTEXT_X86: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_X86 || + system_info_cpu_type == MD_CPU_ARCHITECTURE_X86_WIN64 || + system_info_cpu_type == MD_CPU_ARCHITECTURE_AMD64) { + return_value = true; + } + break; + + case MD_CONTEXT_PPC: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_PPC) + return_value = true; + break; + + case MD_CONTEXT_PPC64: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_PPC64) + return_value = true; + break; + + case MD_CONTEXT_AMD64: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_AMD64) + return_value = true; + break; + + case MD_CONTEXT_SPARC: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_SPARC) + return_value = true; + break; + + case MD_CONTEXT_ARM: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_ARM) + return_value = true; + break; + + case MD_CONTEXT_ARM64: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_ARM64) + return_value = true; + break; + + case MD_CONTEXT_ARM64_OLD: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_ARM64_OLD) + return_value = true; + break; + + case MD_CONTEXT_MIPS: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_MIPS) + return_value = true; + break; + + case MD_CONTEXT_MIPS64: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_MIPS64) + return_value = true; + break; + + case MD_CONTEXT_RISCV: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_RISCV) + return_value = true; + break; + + case MD_CONTEXT_RISCV64: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_RISCV64) + return_value = true; + break; + } + + BPLOG_IF(ERROR, !return_value) << "MinidumpContext CPU " << + HexString(context_cpu_type) << + " wrong for MinidumpSystemInfo CPU " << + HexString(system_info_cpu_type); + + return return_value; +} + + +// +// MinidumpMemoryRegion +// + + +uint32_t MinidumpMemoryRegion::max_bytes_ = 64 * 1024 * 1024; // 64MB + + +MinidumpMemoryRegion::MinidumpMemoryRegion(Minidump* minidump) + : MinidumpObject(minidump), + descriptor_(NULL), + memory_(NULL) { + hexdump_width_ = minidump_ ? minidump_->HexdumpMode() : 0; + hexdump_ = hexdump_width_ != 0; +} + + +MinidumpMemoryRegion::~MinidumpMemoryRegion() { + delete memory_; +} + + +void MinidumpMemoryRegion::SetDescriptor(MDMemoryDescriptor* descriptor) { + descriptor_ = descriptor; + valid_ = descriptor && + descriptor_->memory.data_size <= + numeric_limits::max() - + descriptor_->start_of_memory_range; +} + + +const uint8_t* MinidumpMemoryRegion::GetMemory() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetMemory"; + return NULL; + } + + if (!memory_) { + if (descriptor_->memory.data_size == 0) { + BPLOG(ERROR) << "MinidumpMemoryRegion is empty"; + return NULL; + } + + if (!minidump_->SeekSet(descriptor_->memory.rva)) { + BPLOG(ERROR) << "MinidumpMemoryRegion could not seek to memory region"; + return NULL; + } + + if (descriptor_->memory.data_size > max_bytes_) { + BPLOG(ERROR) << "MinidumpMemoryRegion size " << + descriptor_->memory.data_size << " exceeds maximum " << + max_bytes_; + return NULL; + } + + scoped_ptr< vector > memory( + new vector(descriptor_->memory.data_size)); + + if (!minidump_->ReadBytes(&(*memory)[0], descriptor_->memory.data_size)) { + BPLOG(ERROR) << "MinidumpMemoryRegion could not read memory region"; + return NULL; + } + + memory_ = memory.release(); + } + + return &(*memory_)[0]; +} + + +uint64_t MinidumpMemoryRegion::GetBase() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetBase"; + return static_cast(-1); + } + + return descriptor_->start_of_memory_range; +} + + +uint32_t MinidumpMemoryRegion::GetSize() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetSize"; + return 0; + } + + return descriptor_->memory.data_size; +} + + +void MinidumpMemoryRegion::FreeMemory() { + delete memory_; + memory_ = NULL; +} + + +template +bool MinidumpMemoryRegion::GetMemoryAtAddressInternal(uint64_t address, + T* value) const { + BPLOG_IF(ERROR, !value) << "MinidumpMemoryRegion::GetMemoryAtAddressInternal " + "requires |value|"; + assert(value); + *value = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for " + "GetMemoryAtAddressInternal"; + return false; + } + + // Common failure case + if (address < descriptor_->start_of_memory_range || + sizeof(T) > numeric_limits::max() - address || + address + sizeof(T) > descriptor_->start_of_memory_range + + descriptor_->memory.data_size) { + BPLOG(INFO) << "MinidumpMemoryRegion request out of range: " << + HexString(address) << "+" << sizeof(T) << "/" << + HexString(descriptor_->start_of_memory_range) << "+" << + HexString(descriptor_->memory.data_size); + return false; + } + + const uint8_t* memory = GetMemory(); + if (!memory) { + // GetMemory already logged a perfectly good message. + return false; + } + + // If the CPU requires memory accesses to be aligned, this can crash. + // x86 and ppc are able to cope, though. + *value = *reinterpret_cast( + &memory[address - descriptor_->start_of_memory_range]); + + if (minidump_->swap()) + Swap(value); + + return true; +} + + +bool MinidumpMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint8_t* value) const { + return GetMemoryAtAddressInternal(address, value); +} + + +bool MinidumpMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint16_t* value) const { + return GetMemoryAtAddressInternal(address, value); +} + + +bool MinidumpMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint32_t* value) const { + return GetMemoryAtAddressInternal(address, value); +} + + +bool MinidumpMemoryRegion::GetMemoryAtAddress(uint64_t address, + uint64_t* value) const { + return GetMemoryAtAddressInternal(address, value); +} + + +void MinidumpMemoryRegion::Print() const { + if (!valid_) { + BPLOG(ERROR) << "MinidumpMemoryRegion cannot print invalid data"; + return; + } + + const uint8_t* memory = GetMemory(); + if (memory) { + if (hexdump_) { + // Pretty hexdump view. + for (unsigned int byte_index = 0; + byte_index < descriptor_->memory.data_size; + byte_index += hexdump_width_) { + // In case the memory won't fill a whole line. + unsigned int num_bytes = std::min( + descriptor_->memory.data_size - byte_index, hexdump_width_); + + // Display the leading address. + printf("%08x ", byte_index); + + // Show the bytes in hex. + for (unsigned int i = 0; i < hexdump_width_; ++i) { + if (i < num_bytes) { + // Show the single byte of memory in hex. + printf("%02x ", memory[byte_index + i]); + } else { + // If this line doesn't fill up, pad it out. + printf(" "); + } + + // Insert a space every 8 bytes to make it more readable. + if (((i + 1) % 8) == 0) { + printf(" "); + } + } + + // Decode the line as ASCII. + printf("|"); + for (unsigned int i = 0; i < hexdump_width_; ++i) { + if (i < num_bytes) { + uint8_t byte = memory[byte_index + i]; + printf("%c", isprint(byte) ? byte : '.'); + } else { + // If this line doesn't fill up, pad it out. + printf(" "); + } + } + printf("|\n"); + } + } else { + // Ugly raw string view. + printf("0x"); + for (unsigned int i = 0; + i < descriptor_->memory.data_size; + i++) { + printf("%02x", memory[i]); + } + printf("\n"); + } + } else { + printf("No memory\n"); + } +} + + +void MinidumpMemoryRegion::SetPrintMode(bool hexdump, + unsigned int hexdump_width) { + // Require the width to be a multiple of 8 bytes. + if (hexdump_width == 0 || (hexdump_width % 8) != 0) { + BPLOG(ERROR) << "MinidumpMemoryRegion print hexdump_width must be " + "multiple of 8, not " << hexdump_width; + return; + } + + hexdump_ = hexdump; + hexdump_width_ = hexdump_width; +} + + +// +// MinidumpThread +// + + +MinidumpThread::MinidumpThread(Minidump* minidump) + : MinidumpObject(minidump), + thread_(), + memory_(NULL), + context_(NULL) { +} + + +MinidumpThread::~MinidumpThread() { + delete memory_; + delete context_; +} + + +bool MinidumpThread::Read() { + // Invalidate cached data. + delete memory_; + memory_ = NULL; + delete context_; + context_ = NULL; + + valid_ = false; + + if (!minidump_->ReadBytes(&thread_, sizeof(thread_))) { + BPLOG(ERROR) << "MinidumpThread cannot read thread"; + return false; + } + + if (minidump_->swap()) { + Swap(&thread_.thread_id); + Swap(&thread_.suspend_count); + Swap(&thread_.priority_class); + Swap(&thread_.priority); + Swap(&thread_.teb); + Swap(&thread_.stack); + Swap(&thread_.thread_context); + } + + // Check for base + size overflow or undersize. + if (thread_.stack.memory.rva == 0 || + thread_.stack.memory.data_size == 0 || + thread_.stack.memory.data_size > numeric_limits::max() - + thread_.stack.start_of_memory_range) { + // This is ok, but log an error anyway. + BPLOG(ERROR) << "MinidumpThread has a memory region problem, " << + HexString(thread_.stack.start_of_memory_range) << "+" << + HexString(thread_.stack.memory.data_size) << + ", RVA 0x" << HexString(thread_.stack.memory.rva); + } else { + memory_ = new MinidumpMemoryRegion(minidump_); + memory_->SetDescriptor(&thread_.stack); + } + + valid_ = true; + return true; +} + +uint64_t MinidumpThread::GetStartOfStackMemoryRange() const { + if (!valid_) { + BPLOG(ERROR) << "GetStartOfStackMemoryRange: Invalid MinidumpThread"; + return 0; + } + + return thread_.stack.start_of_memory_range; +} + +MinidumpMemoryRegion* MinidumpThread::GetMemory() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThread for GetMemory"; + return NULL; + } + + return memory_; +} + + +MinidumpContext* MinidumpThread::GetContext() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThread for GetContext"; + return NULL; + } + + if (!context_) { + if (!minidump_->SeekSet(thread_.thread_context.rva)) { + BPLOG(ERROR) << "MinidumpThread cannot seek to context"; + return NULL; + } + + scoped_ptr context(new MinidumpContext(minidump_)); + + if (!context->Read(thread_.thread_context.data_size)) { + BPLOG(ERROR) << "MinidumpThread cannot read context"; + return NULL; + } + + context_ = context.release(); + } + + return context_; +} + + +bool MinidumpThread::GetThreadID(uint32_t* thread_id) const { + BPLOG_IF(ERROR, !thread_id) << "MinidumpThread::GetThreadID requires " + "|thread_id|"; + assert(thread_id); + *thread_id = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThread for GetThreadID"; + return false; + } + + *thread_id = thread_.thread_id; + return true; +} + + +void MinidumpThread::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpThread cannot print invalid data"; + return; + } + + printf("MDRawThread\n"); + printf(" thread_id = 0x%x\n", thread_.thread_id); + printf(" suspend_count = %d\n", thread_.suspend_count); + printf(" priority_class = 0x%x\n", thread_.priority_class); + printf(" priority = 0x%x\n", thread_.priority); + printf(" teb = 0x%" PRIx64 "\n", thread_.teb); + printf(" stack.start_of_memory_range = 0x%" PRIx64 "\n", + thread_.stack.start_of_memory_range); + printf(" stack.memory.data_size = 0x%x\n", + thread_.stack.memory.data_size); + printf(" stack.memory.rva = 0x%x\n", thread_.stack.memory.rva); + printf(" thread_context.data_size = 0x%x\n", + thread_.thread_context.data_size); + printf(" thread_context.rva = 0x%x\n", + thread_.thread_context.rva); + + MinidumpContext* context = GetContext(); + if (context) { + printf("\n"); + context->Print(); + } else { + printf(" (no context)\n"); + printf("\n"); + } + + MinidumpMemoryRegion* memory = GetMemory(); + if (memory) { + printf("Stack\n"); + memory->Print(); + } else { + printf("No stack\n"); + } + printf("\n"); +} + + +// +// MinidumpThreadList +// + + +uint32_t MinidumpThreadList::max_threads_ = 4096; + + +MinidumpThreadList::MinidumpThreadList(Minidump* minidump) + : MinidumpStream(minidump), + id_to_thread_map_(), + threads_(NULL), + thread_count_(0) { +} + + +MinidumpThreadList::~MinidumpThreadList() { + delete threads_; +} + + +bool MinidumpThreadList::Read(uint32_t expected_size) { + // Invalidate cached data. + id_to_thread_map_.clear(); + delete threads_; + threads_ = NULL; + thread_count_ = 0; + + valid_ = false; + + uint32_t thread_count; + if (expected_size < sizeof(thread_count)) { + BPLOG(ERROR) << "MinidumpThreadList count size mismatch, " << + expected_size << " < " << sizeof(thread_count); + return false; + } + if (!minidump_->ReadBytes(&thread_count, sizeof(thread_count))) { + BPLOG(ERROR) << "MinidumpThreadList cannot read thread count"; + return false; + } + + if (minidump_->swap()) + Swap(&thread_count); + + if (thread_count > numeric_limits::max() / sizeof(MDRawThread)) { + BPLOG(ERROR) << "MinidumpThreadList thread count " << thread_count << + " would cause multiplication overflow"; + return false; + } + + if (expected_size != sizeof(thread_count) + + thread_count * sizeof(MDRawThread)) { + // may be padded with 4 bytes on 64bit ABIs for alignment + if (expected_size == sizeof(thread_count) + 4 + + thread_count * sizeof(MDRawThread)) { + uint32_t useless; + if (!minidump_->ReadBytes(&useless, 4)) { + BPLOG(ERROR) << "MinidumpThreadList cannot read threadlist padded " + "bytes"; + return false; + } + } else { + BPLOG(ERROR) << "MinidumpThreadList size mismatch, " << expected_size << + " != " << sizeof(thread_count) + + thread_count * sizeof(MDRawThread); + return false; + } + } + + + if (thread_count > max_threads_) { + BPLOG(ERROR) << "MinidumpThreadList count " << thread_count << + " exceeds maximum " << max_threads_; + return false; + } + + if (thread_count != 0) { + scoped_ptr threads( + new MinidumpThreads(thread_count, MinidumpThread(minidump_))); + + for (unsigned int thread_index = 0; + thread_index < thread_count; + ++thread_index) { + MinidumpThread* thread = &(*threads)[thread_index]; + + // Assume that the file offset is correct after the last read. + if (!thread->Read()) { + BPLOG(ERROR) << "MinidumpThreadList cannot read thread " << + thread_index << "/" << thread_count; + return false; + } + + uint32_t thread_id; + if (!thread->GetThreadID(&thread_id)) { + BPLOG(ERROR) << "MinidumpThreadList cannot get thread ID for thread " << + thread_index << "/" << thread_count; + return false; + } + + if (GetThreadByID(thread_id)) { + // Another thread with this ID is already in the list. Data error. + BPLOG(ERROR) << "MinidumpThreadList found multiple threads with ID " << + HexString(thread_id) << " at thread " << + thread_index << "/" << thread_count; + return false; + } + id_to_thread_map_[thread_id] = thread; + } + + threads_ = threads.release(); + } + + thread_count_ = thread_count; + + valid_ = true; + return true; +} + + +MinidumpThread* MinidumpThreadList::GetThreadAtIndex(unsigned int index) + const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThreadList for GetThreadAtIndex"; + return NULL; + } + + if (index >= thread_count_) { + BPLOG(ERROR) << "MinidumpThreadList index out of range: " << + index << "/" << thread_count_; + return NULL; + } + + return &(*threads_)[index]; +} + + +MinidumpThread* MinidumpThreadList::GetThreadByID(uint32_t thread_id) { + // Don't check valid_. Read calls this method before everything is + // validated. It is safe to not check valid_ here. + return id_to_thread_map_[thread_id]; +} + + +void MinidumpThreadList::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpThreadList cannot print invalid data"; + return; + } + + printf("MinidumpThreadList\n"); + printf(" thread_count = %d\n", thread_count_); + printf("\n"); + + for (unsigned int thread_index = 0; + thread_index < thread_count_; + ++thread_index) { + printf("thread[%d]\n", thread_index); + + (*threads_)[thread_index].Print(); + } +} + +// +// MinidumpThreadName +// + +MinidumpThreadName::MinidumpThreadName(Minidump* minidump) + : MinidumpObject(minidump), + thread_name_valid_(false), + thread_name_(), + name_(NULL) {} + +MinidumpThreadName::~MinidumpThreadName() { + delete name_; +} + +bool MinidumpThreadName::Read() { + // Invalidate cached data. + delete name_; + name_ = NULL; + + valid_ = false; + + if (!minidump_->ReadBytes(&thread_name_, sizeof(thread_name_))) { + BPLOG(ERROR) << "MinidumpThreadName cannot read thread name"; + return false; + } + + if (minidump_->swap()) { + Swap(&thread_name_.thread_id); + Swap(&thread_name_.thread_name_rva); + } + + thread_name_valid_ = true; + return true; +} + +bool MinidumpThreadName::ReadAuxiliaryData() { + if (!thread_name_valid_) { + BPLOG(ERROR) << "Invalid MinidumpThreadName for ReadAuxiliaryData"; + return false; + } + + // On 32-bit systems, check that the RVA64 is within range (off_t is 32 bits). + if (thread_name_.thread_name_rva > numeric_limits::max()) { + BPLOG(ERROR) << "MinidumpThreadName RVA64 out of range"; + return false; + } + + // Read the thread name. + const off_t thread_name_rva_offset = + static_cast(thread_name_.thread_name_rva); + name_ = minidump_->ReadString(thread_name_rva_offset); + if (!name_) { + BPLOG(ERROR) << "MinidumpThreadName could not read name"; + return false; + } + + // At this point, we have enough info for the thread name to be valid. + valid_ = true; + return true; +} + +bool MinidumpThreadName::GetThreadID(uint32_t* thread_id) const { + BPLOG_IF(ERROR, !thread_id) << "MinidumpThreadName::GetThreadID requires " + "|thread_id|"; + assert(thread_id); + *thread_id = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThreadName for GetThreadID"; + return false; + } + + *thread_id = thread_name_.thread_id; + return true; +} + +string MinidumpThreadName::GetThreadName() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThreadName for GetThreadName"; + return ""; + } + + return *name_; +} + +void MinidumpThreadName::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpThreadName cannot print invalid data"; + return; + } + + printf("MDRawThreadName\n"); + printf(" thread_id = 0x%x\n", thread_name_.thread_id); + printf(" thread_name_rva = 0x%" PRIx64 "\n", + thread_name_.thread_name_rva); + printf(" thread_name = \"%s\"\n", GetThreadName().c_str()); + printf("\n"); +} + +// +// MinidumpThreadNameList +// + +MinidumpThreadNameList::MinidumpThreadNameList(Minidump* minidump) + : MinidumpStream(minidump), thread_names_(NULL), thread_name_count_(0) {} + +MinidumpThreadNameList::~MinidumpThreadNameList() { + delete thread_names_; +} + +bool MinidumpThreadNameList::Read(uint32_t expected_size) { + // Invalidate cached data. + delete thread_names_; + thread_names_ = NULL; + thread_name_count_ = 0; + + valid_ = false; + + uint32_t thread_name_count; + if (expected_size < sizeof(thread_name_count)) { + BPLOG(ERROR) << "MinidumpThreadNameList count size mismatch, " + << expected_size << " < " << sizeof(thread_name_count); + return false; + } + if (!minidump_->ReadBytes(&thread_name_count, sizeof(thread_name_count))) { + BPLOG(ERROR) << "MinidumpThreadNameList cannot read thread name count"; + return false; + } + + if (minidump_->swap()) + Swap(&thread_name_count); + + if (thread_name_count > + numeric_limits::max() / sizeof(MDRawThreadName)) { + BPLOG(ERROR) << "MinidumpThreadNameList thread name count " + << thread_name_count << " would cause multiplication overflow"; + return false; + } + + if (expected_size != + sizeof(thread_name_count) + thread_name_count * sizeof(MDRawThreadName)) { + BPLOG(ERROR) << "MinidumpThreadNameList size mismatch, " << expected_size + << " != " + << sizeof(thread_name_count) + + thread_name_count * sizeof(MDRawThreadName); + return false; + } + + if (thread_name_count > MinidumpThreadList::max_threads()) { + BPLOG(ERROR) << "MinidumpThreadNameList count " << thread_name_count + << " exceeds maximum " << MinidumpThreadList::max_threads(); + return false; + } + + if (thread_name_count != 0) { + scoped_ptr thread_names(new MinidumpThreadNames( + thread_name_count, MinidumpThreadName(minidump_))); + + for (unsigned int thread_name_index = 0; + thread_name_index < thread_name_count; ++thread_name_index) { + MinidumpThreadName* thread_name = &(*thread_names)[thread_name_index]; + + // Assume that the file offset is correct after the last read. + if (!thread_name->Read()) { + BPLOG(ERROR) << "MinidumpThreadNameList cannot read thread name " + << thread_name_index << "/" << thread_name_count; + return false; + } + } + + for (unsigned int thread_name_index = 0; + thread_name_index < thread_name_count; ++thread_name_index) { + MinidumpThreadName* thread_name = &(*thread_names)[thread_name_index]; + + if (!thread_name->ReadAuxiliaryData() && !thread_name->valid()) { + BPLOG(ERROR) << "MinidumpThreadNameList cannot read thread name " + << thread_name_index << "/" << thread_name_count; + return false; + } + } + + thread_names_ = thread_names.release(); + } + + thread_name_count_ = thread_name_count; + + valid_ = true; + return true; +} + +MinidumpThreadName* MinidumpThreadNameList::GetThreadNameAtIndex( + unsigned int index) const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpThreadNameList for GetThreadNameAtIndex"; + return NULL; + } + + if (index >= thread_name_count_) { + BPLOG(ERROR) << "MinidumpThreadNameList index out of range: " << index + << "/" << thread_name_count_; + return NULL; + } + + return &(*thread_names_)[index]; +} + +void MinidumpThreadNameList::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpThreadNameList cannot print invalid data"; + return; + } + + printf("MinidumpThreadNameList\n"); + printf(" thread_name_count = %d\n", thread_name_count_); + printf("\n"); + + for (unsigned int thread_name_index = 0; + thread_name_index < thread_name_count_; ++thread_name_index) { + printf("thread_name[%d]\n", thread_name_index); + + (*thread_names_)[thread_name_index].Print(); + } +} + +// +// MinidumpModule +// + + +uint32_t MinidumpModule::max_cv_bytes_ = 32768; +uint32_t MinidumpModule::max_misc_bytes_ = 32768; + + +MinidumpModule::MinidumpModule(Minidump* minidump) + : MinidumpObject(minidump), + module_valid_(false), + has_debug_info_(false), + module_(), + name_(NULL), + cv_record_(NULL), + cv_record_signature_(MD_CVINFOUNKNOWN_SIGNATURE), + misc_record_(NULL) { +} + + +MinidumpModule::~MinidumpModule() { + delete name_; + delete cv_record_; + delete misc_record_; +} + + +bool MinidumpModule::Read() { + // Invalidate cached data. + delete name_; + name_ = NULL; + delete cv_record_; + cv_record_ = NULL; + cv_record_signature_ = MD_CVINFOUNKNOWN_SIGNATURE; + delete misc_record_; + misc_record_ = NULL; + + module_valid_ = false; + has_debug_info_ = false; + valid_ = false; + + if (!minidump_->ReadBytes(&module_, MD_MODULE_SIZE)) { + BPLOG(ERROR) << "MinidumpModule cannot read module"; + return false; + } + + if (minidump_->swap()) { + Swap(&module_.base_of_image); + Swap(&module_.size_of_image); + Swap(&module_.checksum); + Swap(&module_.time_date_stamp); + Swap(&module_.module_name_rva); + Swap(&module_.version_info.signature); + Swap(&module_.version_info.struct_version); + Swap(&module_.version_info.file_version_hi); + Swap(&module_.version_info.file_version_lo); + Swap(&module_.version_info.product_version_hi); + Swap(&module_.version_info.product_version_lo); + Swap(&module_.version_info.file_flags_mask); + Swap(&module_.version_info.file_flags); + Swap(&module_.version_info.file_os); + Swap(&module_.version_info.file_type); + Swap(&module_.version_info.file_subtype); + Swap(&module_.version_info.file_date_hi); + Swap(&module_.version_info.file_date_lo); + Swap(&module_.cv_record); + Swap(&module_.misc_record); + // Don't swap reserved fields because their contents are unknown (as + // are their proper widths). + } + + // Check for base + size overflow or undersize. + if (module_.size_of_image == 0 || + module_.size_of_image > + numeric_limits::max() - module_.base_of_image) { + BPLOG(ERROR) << "MinidumpModule has a module problem, " << + HexString(module_.base_of_image) << "+" << + HexString(module_.size_of_image); + return false; + } + + module_valid_ = true; + return true; +} + + +bool MinidumpModule::ReadAuxiliaryData() { + if (!module_valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for ReadAuxiliaryData"; + return false; + } + + // Each module must have a name. + name_ = minidump_->ReadString(module_.module_name_rva); + if (!name_) { + BPLOG(ERROR) << "MinidumpModule could not read name"; + return false; + } + + // At this point, we have enough info for the module to be valid. + valid_ = true; + + // CodeView and miscellaneous debug records are only required if the + // module indicates that they exist. + if (module_.cv_record.data_size && !GetCVRecord(NULL)) { + BPLOG(ERROR) << "MinidumpModule has no CodeView record, " + "but one was expected"; + return false; + } + + if (module_.misc_record.data_size && !GetMiscRecord(NULL)) { + BPLOG(ERROR) << "MinidumpModule has no miscellaneous debug record, " + "but one was expected"; + return false; + } + + has_debug_info_ = true; + return true; +} + + +string MinidumpModule::code_file() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for code_file"; + return ""; + } + + return *name_; +} + + +string MinidumpModule::code_identifier() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for code_identifier"; + return ""; + } + + if (!has_debug_info_) + return ""; + + MinidumpSystemInfo* minidump_system_info = minidump_->GetSystemInfo(); + if (!minidump_system_info) { + BPLOG(ERROR) << "MinidumpModule code_identifier requires " + "MinidumpSystemInfo"; + return ""; + } + + const MDRawSystemInfo* raw_system_info = minidump_system_info->system_info(); + if (!raw_system_info) { + BPLOG(ERROR) << "MinidumpModule code_identifier requires MDRawSystemInfo"; + return ""; + } + + string identifier; + + switch (raw_system_info->platform_id) { + case MD_OS_WIN32_NT: + case MD_OS_WIN32_WINDOWS: { + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + char identifier_string[17]; + snprintf(identifier_string, sizeof(identifier_string), "%08X%x", + module_.time_date_stamp, module_.size_of_image); + identifier = identifier_string; + break; + } + + case MD_OS_ANDROID: + case MD_OS_FUCHSIA: + case MD_OS_LINUX: { + // If ELF CodeView data is present, return the debug id. + if (cv_record_ && cv_record_signature_ == MD_CVINFOELF_SIGNATURE) { + const MDCVInfoELF* cv_record_elf = + reinterpret_cast(&(*cv_record_)[0]); + assert(cv_record_elf->cv_signature == MD_CVINFOELF_SIGNATURE); + + for (unsigned int build_id_index = 0; + build_id_index < (cv_record_->size() - MDCVInfoELF_minsize); + ++build_id_index) { + char hexbyte[3]; + snprintf(hexbyte, sizeof(hexbyte), "%02x", + cv_record_elf->build_id[build_id_index]); + identifier += hexbyte; + } + break; + } + // Otherwise fall through to the case below. + BP_FALLTHROUGH; + } + + case MD_OS_MAC_OS_X: + case MD_OS_IOS: + case MD_OS_SOLARIS: + case MD_OS_NACL: + case MD_OS_PS3: { + // TODO(mmentovai): support uuid extension if present, otherwise fall + // back to version (from LC_ID_DYLIB?), otherwise fall back to something + // else. + identifier = "id"; + break; + } + + default: { + // Without knowing what OS generated the dump, we can't generate a good + // identifier. Return an empty string, signalling failure. + BPLOG(ERROR) << "MinidumpModule code_identifier requires known platform, " + "found " << HexString(raw_system_info->platform_id); + break; + } + } + + return identifier; +} + + +string MinidumpModule::debug_file() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for debug_file"; + return ""; + } + + if (!has_debug_info_) + return ""; + + string file; + // Prefer the CodeView record if present. + if (cv_record_) { + if (cv_record_signature_ == MD_CVINFOPDB70_SIGNATURE) { + // It's actually an MDCVInfoPDB70 structure. + const MDCVInfoPDB70* cv_record_70 = + reinterpret_cast(&(*cv_record_)[0]); + assert(cv_record_70->cv_signature == MD_CVINFOPDB70_SIGNATURE); + + // GetCVRecord guarantees pdb_file_name is null-terminated. + file = reinterpret_cast(cv_record_70->pdb_file_name); + } else if (cv_record_signature_ == MD_CVINFOPDB20_SIGNATURE) { + // It's actually an MDCVInfoPDB20 structure. + const MDCVInfoPDB20* cv_record_20 = + reinterpret_cast(&(*cv_record_)[0]); + assert(cv_record_20->cv_header.signature == MD_CVINFOPDB20_SIGNATURE); + + // GetCVRecord guarantees pdb_file_name is null-terminated. + file = reinterpret_cast(cv_record_20->pdb_file_name); + } else if (cv_record_signature_ == MD_CVINFOELF_SIGNATURE) { + // It's actually an MDCVInfoELF structure. + assert(reinterpret_cast(&(*cv_record_)[0])-> + cv_signature == MD_CVINFOELF_SIGNATURE); + + // For MDCVInfoELF, the debug file is the code file. + file = *name_; + } + + // If there's a CodeView record but it doesn't match a known signature, + // try the miscellaneous record. + } + + if (file.empty()) { + // No usable CodeView record. Try the miscellaneous debug record. + if (misc_record_) { + const MDImageDebugMisc* misc_record = + reinterpret_cast(&(*misc_record_)[0]); + if (!misc_record->unicode) { + // If it's not Unicode, just stuff it into the string. It's unclear + // if misc_record->data is 0-terminated, so use an explicit size. + file = string( + reinterpret_cast(misc_record->data), + module_.misc_record.data_size - MDImageDebugMisc_minsize); + } else { + // There's a misc_record but it encodes the debug filename in UTF-16. + // (Actually, because miscellaneous records are so old, it's probably + // UCS-2.) Convert it to UTF-8 for congruity with the other strings + // that this method (and all other methods in the Minidump family) + // return. + + size_t bytes = + module_.misc_record.data_size - MDImageDebugMisc_minsize; + if (bytes % 2 == 0) { + size_t utf16_words = bytes / 2; + + // UTF16ToUTF8 expects a vector, so create a temporary one + // and copy the UTF-16 data into it. + vector string_utf16(utf16_words); + if (utf16_words) + memcpy(&string_utf16[0], &misc_record->data, bytes); + + // GetMiscRecord already byte-swapped the data[] field if it contains + // UTF-16, so pass false as the swap argument. + scoped_ptr new_file(UTF16ToUTF8(string_utf16, false)); + if (new_file.get() != nullptr) { + file = *new_file; + } + } + } + } + } + + // Relatively common case + BPLOG_IF(INFO, file.empty()) << "MinidumpModule could not determine " + "debug_file for " << *name_; + + return file; +} + +static string guid_and_age_to_debug_id(const MDGUID& guid, + uint32_t age) { + char identifier_string[41]; + snprintf(identifier_string, sizeof(identifier_string), + "%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%x", + guid.data1, + guid.data2, + guid.data3, + guid.data4[0], + guid.data4[1], + guid.data4[2], + guid.data4[3], + guid.data4[4], + guid.data4[5], + guid.data4[6], + guid.data4[7], + age); + return identifier_string; +} + +string MinidumpModule::debug_identifier() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for debug_identifier"; + return ""; + } + + if (!has_debug_info_) + return ""; + + string identifier; + + // Use the CodeView record if present. + if (cv_record_) { + if (cv_record_signature_ == MD_CVINFOPDB70_SIGNATURE) { + // It's actually an MDCVInfoPDB70 structure. + const MDCVInfoPDB70* cv_record_70 = + reinterpret_cast(&(*cv_record_)[0]); + assert(cv_record_70->cv_signature == MD_CVINFOPDB70_SIGNATURE); + + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + identifier = guid_and_age_to_debug_id(cv_record_70->signature, + cv_record_70->age); + } else if (cv_record_signature_ == MD_CVINFOPDB20_SIGNATURE) { + // It's actually an MDCVInfoPDB20 structure. + const MDCVInfoPDB20* cv_record_20 = + reinterpret_cast(&(*cv_record_)[0]); + assert(cv_record_20->cv_header.signature == MD_CVINFOPDB20_SIGNATURE); + + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + char identifier_string[17]; + snprintf(identifier_string, sizeof(identifier_string), + "%08X%x", cv_record_20->signature, cv_record_20->age); + identifier = identifier_string; + } else if (cv_record_signature_ == MD_CVINFOELF_SIGNATURE) { + // It's actually an MDCVInfoELF structure. + const MDCVInfoELF* cv_record_elf = + reinterpret_cast(&(*cv_record_)[0]); + assert(cv_record_elf->cv_signature == MD_CVINFOELF_SIGNATURE); + + // For backwards-compatibility, stuff as many bytes as will fit into + // a MDGUID and use the MS symbol server format as MDCVInfoPDB70 does + // with age = 0. Historically Breakpad would do this during dump + // writing to fit the build id data into a MDCVInfoPDB70 struct. + // The full build id is available by calling code_identifier. + MDGUID guid = {0}; + memcpy(&guid, &cv_record_elf->build_id, + std::min(cv_record_->size() - MDCVInfoELF_minsize, + sizeof(MDGUID))); + identifier = guid_and_age_to_debug_id(guid, 0); + } + } + + // TODO(mmentovai): if there's no usable CodeView record, there might be a + // miscellaneous debug record. It only carries a filename, though, and no + // identifier. I'm not sure what the right thing to do for the identifier + // is in that case, but I don't expect to find many modules without a + // CodeView record (or some other Breakpad extension structure in place of + // a CodeView record). Treat it as an error (empty identifier) for now. + + // TODO(mmentovai): on the Mac, provide fallbacks as in code_identifier(). + + // Relatively common case + BPLOG_IF(INFO, identifier.empty()) << "MinidumpModule could not determine " + "debug_identifier for " << *name_; + + return identifier; +} + + +string MinidumpModule::version() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for version"; + return ""; + } + + string version; + + if (module_.version_info.signature == MD_VSFIXEDFILEINFO_SIGNATURE && + module_.version_info.struct_version & MD_VSFIXEDFILEINFO_VERSION) { + char version_string[24]; + snprintf(version_string, sizeof(version_string), "%u.%u.%u.%u", + module_.version_info.file_version_hi >> 16, + module_.version_info.file_version_hi & 0xffff, + module_.version_info.file_version_lo >> 16, + module_.version_info.file_version_lo & 0xffff); + version = version_string; + } + + // TODO(mmentovai): possibly support other struct types in place of + // the one used with MD_VSFIXEDFILEINFO_SIGNATURE. We can possibly use + // a different structure that better represents versioning facilities on + // Mac OS X and Linux, instead of forcing them to adhere to the dotted + // quad of 16-bit ints that Windows uses. + + BPLOG_IF(INFO, version.empty()) << "MinidumpModule could not determine " + "version for " << *name_; + + return version; +} + + +CodeModule* MinidumpModule::Copy() const { + return new BasicCodeModule(this); +} + + +uint64_t MinidumpModule::shrink_down_delta() const { + return 0; +} + +void MinidumpModule::SetShrinkDownDelta(uint64_t shrink_down_delta) { + // Not implemented + assert(false); +} + + +const uint8_t* MinidumpModule::GetCVRecord(uint32_t* size) { + if (!module_valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for GetCVRecord"; + return NULL; + } + + if (!cv_record_) { + // This just guards against 0-sized CodeView records; more specific checks + // are used when the signature is checked against various structure types. + if (module_.cv_record.data_size == 0) { + return NULL; + } + + if (!minidump_->SeekSet(module_.cv_record.rva)) { + BPLOG(ERROR) << "MinidumpModule could not seek to CodeView record"; + return NULL; + } + + if (module_.cv_record.data_size > max_cv_bytes_) { + BPLOG(ERROR) << "MinidumpModule CodeView record size " << + module_.cv_record.data_size << " exceeds maximum " << + max_cv_bytes_; + return NULL; + } + + // Allocating something that will be accessed as MDCVInfoPDB70 or + // MDCVInfoPDB20 but is allocated as uint8_t[] can cause alignment + // problems. x86 and ppc are able to cope, though. This allocation + // style is needed because the MDCVInfoPDB70 or MDCVInfoPDB20 are + // variable-sized due to their pdb_file_name fields; these structures + // are not MDCVInfoPDB70_minsize or MDCVInfoPDB20_minsize and treating + // them as such would result in incomplete structures or overruns. + scoped_ptr< vector > cv_record( + new vector(module_.cv_record.data_size)); + + if (!minidump_->ReadBytes(&(*cv_record)[0], module_.cv_record.data_size)) { + BPLOG(ERROR) << "MinidumpModule could not read CodeView record"; + return NULL; + } + + uint32_t signature = MD_CVINFOUNKNOWN_SIGNATURE; + if (module_.cv_record.data_size > sizeof(signature)) { + MDCVInfoPDB70* cv_record_signature = + reinterpret_cast(&(*cv_record)[0]); + signature = cv_record_signature->cv_signature; + if (minidump_->swap()) + Swap(&signature); + } + + if (signature == MD_CVINFOPDB70_SIGNATURE) { + // Now that the structure type is known, recheck the size, + // ensuring at least one byte for the null terminator. + if (MDCVInfoPDB70_minsize + 1 > module_.cv_record.data_size) { + BPLOG(ERROR) << "MinidumpModule CodeView7 record size mismatch, " << + MDCVInfoPDB70_minsize << " > " << + module_.cv_record.data_size; + return NULL; + } + + if (minidump_->swap()) { + MDCVInfoPDB70* cv_record_70 = + reinterpret_cast(&(*cv_record)[0]); + Swap(&cv_record_70->cv_signature); + Swap(&cv_record_70->signature); + Swap(&cv_record_70->age); + // Don't swap cv_record_70.pdb_file_name because it's an array of 8-bit + // quantities. (It's a path, is it UTF-8?) + } + + // The last field of either structure is null-terminated 8-bit character + // data. Ensure that it's null-terminated. + if ((*cv_record)[module_.cv_record.data_size - 1] != '\0') { + BPLOG(ERROR) << "MinidumpModule CodeView7 record string is not " + "0-terminated"; + return NULL; + } + } else if (signature == MD_CVINFOPDB20_SIGNATURE) { + // Now that the structure type is known, recheck the size, + // ensuring at least one byte for the null terminator. + if (MDCVInfoPDB20_minsize + 1 > module_.cv_record.data_size) { + BPLOG(ERROR) << "MinidumpModule CodeView2 record size mismatch, " << + MDCVInfoPDB20_minsize << " > " << + module_.cv_record.data_size; + return NULL; + } + if (minidump_->swap()) { + MDCVInfoPDB20* cv_record_20 = + reinterpret_cast(&(*cv_record)[0]); + Swap(&cv_record_20->cv_header.signature); + Swap(&cv_record_20->cv_header.offset); + Swap(&cv_record_20->signature); + Swap(&cv_record_20->age); + // Don't swap cv_record_20.pdb_file_name because it's an array of 8-bit + // quantities. (It's a path, is it UTF-8?) + } + + // The last field of either structure is null-terminated 8-bit character + // data. Ensure that it's null-terminated. + if ((*cv_record)[module_.cv_record.data_size - 1] != '\0') { + BPLOG(ERROR) << "MindumpModule CodeView2 record string is not " + "0-terminated"; + return NULL; + } + } else if (signature == MD_CVINFOELF_SIGNATURE) { + // Now that the structure type is known, recheck the size. + if (MDCVInfoELF_minsize > module_.cv_record.data_size) { + BPLOG(ERROR) << "MinidumpModule CodeViewELF record size mismatch, " << + MDCVInfoELF_minsize << " > " << + module_.cv_record.data_size; + return NULL; + } + if (minidump_->swap()) { + MDCVInfoELF* cv_record_elf = + reinterpret_cast(&(*cv_record)[0]); + Swap(&cv_record_elf->cv_signature); + } + } + + // If the signature doesn't match something above, it's not something + // that Breakpad can presently handle directly. Because some modules in + // the wild contain such CodeView records as MD_CVINFOCV50_SIGNATURE, + // don't bail out here - allow the data to be returned to the user, + // although byte-swapping can't be done. + + // Store the vector type because that's how storage was allocated, but + // return it casted to uint8_t*. + cv_record_ = cv_record.release(); + cv_record_signature_ = signature; + } + + if (size) + *size = module_.cv_record.data_size; + + return &(*cv_record_)[0]; +} + + +const MDImageDebugMisc* MinidumpModule::GetMiscRecord(uint32_t* size) { + if (!module_valid_) { + BPLOG(ERROR) << "Invalid MinidumpModule for GetMiscRecord"; + return NULL; + } + + if (!misc_record_) { + if (module_.misc_record.data_size == 0) { + return NULL; + } + + if (MDImageDebugMisc_minsize > module_.misc_record.data_size) { + BPLOG(ERROR) << "MinidumpModule miscellaneous debugging record " + "size mismatch, " << MDImageDebugMisc_minsize << " > " << + module_.misc_record.data_size; + return NULL; + } + + if (!minidump_->SeekSet(module_.misc_record.rva)) { + BPLOG(ERROR) << "MinidumpModule could not seek to miscellaneous " + "debugging record"; + return NULL; + } + + if (module_.misc_record.data_size > max_misc_bytes_) { + BPLOG(ERROR) << "MinidumpModule miscellaneous debugging record size " << + module_.misc_record.data_size << " exceeds maximum " << + max_misc_bytes_; + return NULL; + } + + // Allocating something that will be accessed as MDImageDebugMisc but + // is allocated as uint8_t[] can cause alignment problems. x86 and + // ppc are able to cope, though. This allocation style is needed + // because the MDImageDebugMisc is variable-sized due to its data field; + // this structure is not MDImageDebugMisc_minsize and treating it as such + // would result in an incomplete structure or an overrun. + scoped_ptr< vector > misc_record_mem( + new vector(module_.misc_record.data_size)); + MDImageDebugMisc* misc_record = + reinterpret_cast(&(*misc_record_mem)[0]); + + if (!minidump_->ReadBytes(misc_record, module_.misc_record.data_size)) { + BPLOG(ERROR) << "MinidumpModule could not read miscellaneous debugging " + "record"; + return NULL; + } + + if (minidump_->swap()) { + Swap(&misc_record->data_type); + Swap(&misc_record->length); + // Don't swap misc_record.unicode because it's an 8-bit quantity. + // Don't swap the reserved fields for the same reason, and because + // they don't contain any valid data. + if (misc_record->unicode) { + // There is a potential alignment problem, but shouldn't be a problem + // in practice due to the layout of MDImageDebugMisc. + uint16_t* data16 = reinterpret_cast(&(misc_record->data)); + size_t dataBytes = module_.misc_record.data_size - + MDImageDebugMisc_minsize; + Swap(data16, dataBytes); + } + } + + if (module_.misc_record.data_size != misc_record->length) { + BPLOG(ERROR) << "MinidumpModule miscellaneous debugging record data " + "size mismatch, " << module_.misc_record.data_size << + " != " << misc_record->length; + return NULL; + } + + // Store the vector type because that's how storage was allocated, but + // return it casted to MDImageDebugMisc*. + misc_record_ = misc_record_mem.release(); + } + + if (size) + *size = module_.misc_record.data_size; + + return reinterpret_cast(&(*misc_record_)[0]); +} + + +void MinidumpModule::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpModule cannot print invalid data"; + return; + } + + printf("MDRawModule\n"); + printf(" base_of_image = 0x%" PRIx64 "\n", + module_.base_of_image); + printf(" size_of_image = 0x%x\n", + module_.size_of_image); + printf(" checksum = 0x%x\n", + module_.checksum); + printf(" time_date_stamp = 0x%x %s\n", + module_.time_date_stamp, + TimeTToUTCString(module_.time_date_stamp).c_str()); + printf(" module_name_rva = 0x%x\n", + module_.module_name_rva); + printf(" version_info.signature = 0x%x\n", + module_.version_info.signature); + printf(" version_info.struct_version = 0x%x\n", + module_.version_info.struct_version); + printf(" version_info.file_version = 0x%x:0x%x\n", + module_.version_info.file_version_hi, + module_.version_info.file_version_lo); + printf(" version_info.product_version = 0x%x:0x%x\n", + module_.version_info.product_version_hi, + module_.version_info.product_version_lo); + printf(" version_info.file_flags_mask = 0x%x\n", + module_.version_info.file_flags_mask); + printf(" version_info.file_flags = 0x%x\n", + module_.version_info.file_flags); + printf(" version_info.file_os = 0x%x\n", + module_.version_info.file_os); + printf(" version_info.file_type = 0x%x\n", + module_.version_info.file_type); + printf(" version_info.file_subtype = 0x%x\n", + module_.version_info.file_subtype); + printf(" version_info.file_date = 0x%x:0x%x\n", + module_.version_info.file_date_hi, + module_.version_info.file_date_lo); + printf(" cv_record.data_size = %d\n", + module_.cv_record.data_size); + printf(" cv_record.rva = 0x%x\n", + module_.cv_record.rva); + printf(" misc_record.data_size = %d\n", + module_.misc_record.data_size); + printf(" misc_record.rva = 0x%x\n", + module_.misc_record.rva); + + printf(" (code_file) = \"%s\"\n", code_file().c_str()); + printf(" (code_identifier) = \"%s\"\n", + code_identifier().c_str()); + + uint32_t cv_record_size; + const uint8_t* cv_record = GetCVRecord(&cv_record_size); + if (cv_record) { + if (cv_record_signature_ == MD_CVINFOPDB70_SIGNATURE) { + const MDCVInfoPDB70* cv_record_70 = + reinterpret_cast(cv_record); + assert(cv_record_70->cv_signature == MD_CVINFOPDB70_SIGNATURE); + + printf(" (cv_record).cv_signature = 0x%x\n", + cv_record_70->cv_signature); + printf(" (cv_record).signature = %s\n", + MDGUIDToString(cv_record_70->signature).c_str()); + printf(" (cv_record).age = %d\n", + cv_record_70->age); + printf(" (cv_record).pdb_file_name = \"%s\"\n", + cv_record_70->pdb_file_name); + } else if (cv_record_signature_ == MD_CVINFOPDB20_SIGNATURE) { + const MDCVInfoPDB20* cv_record_20 = + reinterpret_cast(cv_record); + assert(cv_record_20->cv_header.signature == MD_CVINFOPDB20_SIGNATURE); + + printf(" (cv_record).cv_header.signature = 0x%x\n", + cv_record_20->cv_header.signature); + printf(" (cv_record).cv_header.offset = 0x%x\n", + cv_record_20->cv_header.offset); + printf(" (cv_record).signature = 0x%x %s\n", + cv_record_20->signature, + TimeTToUTCString(cv_record_20->signature).c_str()); + printf(" (cv_record).age = %d\n", + cv_record_20->age); + printf(" (cv_record).pdb_file_name = \"%s\"\n", + cv_record_20->pdb_file_name); + } else if (cv_record_signature_ == MD_CVINFOELF_SIGNATURE) { + const MDCVInfoELF* cv_record_elf = + reinterpret_cast(cv_record); + assert(cv_record_elf->cv_signature == MD_CVINFOELF_SIGNATURE); + + printf(" (cv_record).cv_signature = 0x%x\n", + cv_record_elf->cv_signature); + printf(" (cv_record).build_id = "); + for (unsigned int build_id_index = 0; + build_id_index < (cv_record_size - MDCVInfoELF_minsize); + ++build_id_index) { + printf("%02x", cv_record_elf->build_id[build_id_index]); + } + printf("\n"); + } else { + printf(" (cv_record) = "); + for (unsigned int cv_byte_index = 0; + cv_byte_index < cv_record_size; + ++cv_byte_index) { + printf("%02x", cv_record[cv_byte_index]); + } + printf("\n"); + } + } else { + printf(" (cv_record) = (null)\n"); + } + + const MDImageDebugMisc* misc_record = GetMiscRecord(NULL); + if (misc_record) { + printf(" (misc_record).data_type = 0x%x\n", + misc_record->data_type); + printf(" (misc_record).length = 0x%x\n", + misc_record->length); + printf(" (misc_record).unicode = %d\n", + misc_record->unicode); + if (misc_record->unicode) { + string misc_record_data_utf8; + ConvertUTF16BufferToUTF8String( + reinterpret_cast(misc_record->data), + misc_record->length - offsetof(MDImageDebugMisc, data), + &misc_record_data_utf8, + false); // already swapped + printf(" (misc_record).data = \"%s\"\n", + misc_record_data_utf8.c_str()); + } else { + printf(" (misc_record).data = \"%s\"\n", + misc_record->data); + } + } else { + printf(" (misc_record) = (null)\n"); + } + + printf(" (debug_file) = \"%s\"\n", debug_file().c_str()); + printf(" (debug_identifier) = \"%s\"\n", + debug_identifier().c_str()); + printf(" (version) = \"%s\"\n", version().c_str()); + printf("\n"); +} + + +// +// MinidumpModuleList +// + + +uint32_t MinidumpModuleList::max_modules_ = 2048; + + +MinidumpModuleList::MinidumpModuleList(Minidump* minidump) + : MinidumpStream(minidump), + range_map_(new RangeMap()), + modules_(NULL), + module_count_(0) { + MDOSPlatform platform; + if (minidump_->GetPlatform(&platform) && + (platform == MD_OS_ANDROID || platform == MD_OS_LINUX)) { + range_map_->SetMergeStrategy(MergeRangeStrategy::kTruncateLower); + } +} + + +MinidumpModuleList::~MinidumpModuleList() { + delete range_map_; + delete modules_; +} + + +bool MinidumpModuleList::Read(uint32_t expected_size) { + // Invalidate cached data. + range_map_->Clear(); + delete modules_; + modules_ = NULL; + module_count_ = 0; + + valid_ = false; + + uint32_t module_count; + if (expected_size < sizeof(module_count)) { + BPLOG(ERROR) << "MinidumpModuleList count size mismatch, " << + expected_size << " < " << sizeof(module_count); + return false; + } + if (!minidump_->ReadBytes(&module_count, sizeof(module_count))) { + BPLOG(ERROR) << "MinidumpModuleList could not read module count"; + return false; + } + + if (minidump_->swap()) + Swap(&module_count); + + if (module_count > numeric_limits::max() / MD_MODULE_SIZE) { + BPLOG(ERROR) << "MinidumpModuleList module count " << module_count << + " would cause multiplication overflow"; + return false; + } + + if (expected_size != sizeof(module_count) + + module_count * MD_MODULE_SIZE) { + // may be padded with 4 bytes on 64bit ABIs for alignment + if (expected_size == sizeof(module_count) + 4 + + module_count * MD_MODULE_SIZE) { + uint32_t useless; + if (!minidump_->ReadBytes(&useless, 4)) { + BPLOG(ERROR) << "MinidumpModuleList cannot read modulelist padded " + "bytes"; + return false; + } + } else { + BPLOG(ERROR) << "MinidumpModuleList size mismatch, " << expected_size << + " != " << sizeof(module_count) + + module_count * MD_MODULE_SIZE; + return false; + } + } + + if (module_count > max_modules_) { + BPLOG(ERROR) << "MinidumpModuleList count " << module_count << + " exceeds maximum " << max_modules_; + return false; + } + + if (module_count != 0) { + scoped_ptr modules( + new MinidumpModules(module_count, MinidumpModule(minidump_))); + + for (uint32_t module_index = 0; module_index < module_count; + ++module_index) { + MinidumpModule* module = &(*modules)[module_index]; + + // Assume that the file offset is correct after the last read. + if (!module->Read()) { + BPLOG(ERROR) << "MinidumpModuleList could not read module " << + module_index << "/" << module_count; + return false; + } + } + + // Loop through the module list once more to read additional data and + // build the range map. This is done in a second pass because + // MinidumpModule::ReadAuxiliaryData seeks around, and if it were + // included in the loop above, additional seeks would be needed where + // none are now to read contiguous data. + uint64_t last_end_address = 0; + for (uint32_t module_index = 0; module_index < module_count; + ++module_index) { + MinidumpModule& module = (*modules)[module_index]; + + // ReadAuxiliaryData fails if any data that the module indicates should + // exist is missing, but we treat some such cases as valid anyway. See + // issue #222: if a debugging record is of a format that's too large to + // handle, it shouldn't render the entire dump invalid. Check module + // validity before giving up. + if (!module.ReadAuxiliaryData() && !module.valid()) { + BPLOG(ERROR) << "MinidumpModuleList could not read required module " + "auxiliary data for module " << + module_index << "/" << module_count; + return false; + } + + // It is safe to use module->code_file() after successfully calling + // module->ReadAuxiliaryData or noting that the module is valid. + + uint64_t base_address = module.base_address(); + uint64_t module_size = module.size(); + if (base_address == static_cast(-1)) { + BPLOG(ERROR) << "MinidumpModuleList found bad base address for module " + << module_index << "/" << module_count << ", " + << module.code_file(); + return false; + } + + // Some minidumps have additional modules in the list that are duplicates. + // Ignore them. See https://crbug.com/838322 + uint32_t existing_module_index; + if (range_map_->RetrieveRange(base_address, &existing_module_index, + nullptr, nullptr, nullptr) && + existing_module_index < module_count) { + const MinidumpModule& existing_module = + (*modules)[existing_module_index]; + if (existing_module.base_address() == module.base_address() && + existing_module.size() == module.size() && + existing_module.code_file() == module.code_file() && + existing_module.code_identifier() == module.code_identifier()) { + continue; + } + } + + const bool is_android = minidump_->IsAndroid(); + if (!StoreRange(module, base_address, module_index, module_count, + is_android)) { + if (!is_android || base_address >= last_end_address) { + BPLOG(ERROR) << "MinidumpModuleList could not store module " + << module_index << "/" << module_count << ", " + << module.code_file() << ", " << HexString(base_address) + << "+" << HexString(module_size); + return false; + } + + // If failed due to apparent range overlap the cause may be the client + // correction applied for Android packed relocations. If this is the + // case, back out the client correction and retry. + assert(is_android); + module_size -= last_end_address - base_address; + base_address = last_end_address; + if (!range_map_->StoreRange(base_address, module_size, module_index)) { + BPLOG(ERROR) << "MinidumpModuleList could not store module " + << module_index << "/" << module_count << ", " + << module.code_file() << ", " << HexString(base_address) + << "+" << HexString(module_size) << ", after adjusting"; + return false; + } + } + last_end_address = base_address + module_size; + } + + modules_ = modules.release(); + } + + module_count_ = module_count; + + valid_ = true; + return true; +} + +bool MinidumpModuleList::StoreRange(const MinidumpModule& module, + uint64_t base_address, + uint32_t module_index, + uint32_t module_count, + bool is_android) { + if (range_map_->StoreRange(base_address, module.size(), module_index)) + return true; + + // Android's shared memory implementation /dev/ashmem can contain duplicate + // entries for JITted code, so ignore these. + // TODO(wfh): Remove this code when Android is fixed. + // See https://crbug.com/439531 + if (is_android && IsDevAshmem(module.code_file())) { + BPLOG(INFO) << "MinidumpModuleList ignoring overlapping module " + << module_index << "/" << module_count << ", " + << module.code_file() << ", " << HexString(base_address) << "+" + << HexString(module.size()); + return true; + } + + return false; +} + +const MinidumpModule* MinidumpModuleList::GetModuleForAddress( + uint64_t address) const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModuleList for GetModuleForAddress"; + return NULL; + } + + unsigned int module_index; + if (!range_map_->RetrieveRange(address, &module_index, NULL /* base */, + NULL /* delta */, NULL /* size */)) { + BPLOG(INFO) << "MinidumpModuleList has no module at " << + HexString(address); + return NULL; + } + + return GetModuleAtIndex(module_index); +} + + +const MinidumpModule* MinidumpModuleList::GetMainModule() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModuleList for GetMainModule"; + return NULL; + } + + // The main code module is the first one present in a minidump file's + // MDRawModuleList. + return GetModuleAtIndex(0); +} + + +const MinidumpModule* MinidumpModuleList::GetModuleAtSequence( + unsigned int sequence) const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModuleList for GetModuleAtSequence"; + return NULL; + } + + if (sequence >= module_count_) { + BPLOG(ERROR) << "MinidumpModuleList sequence out of range: " << + sequence << "/" << module_count_; + return NULL; + } + + unsigned int module_index; + if (!range_map_->RetrieveRangeAtIndex(sequence, &module_index, + NULL /* base */, NULL /* delta */, + NULL /* size */)) { + BPLOG(ERROR) << "MinidumpModuleList has no module at sequence " << sequence; + return NULL; + } + + return GetModuleAtIndex(module_index); +} + + +const MinidumpModule* MinidumpModuleList::GetModuleAtIndex( + unsigned int index) const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpModuleList for GetModuleAtIndex"; + return NULL; + } + + if (index >= module_count_) { + BPLOG(ERROR) << "MinidumpModuleList index out of range: " << + index << "/" << module_count_; + return NULL; + } + + return &(*modules_)[index]; +} + + +const CodeModules* MinidumpModuleList::Copy() const { + return new BasicCodeModules(this, range_map_->GetMergeStrategy()); +} + +vector > +MinidumpModuleList::GetShrunkRangeModules() const { + return vector >(); +} + +void MinidumpModuleList::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpModuleList cannot print invalid data"; + return; + } + + printf("MinidumpModuleList\n"); + printf(" module_count = %d\n", module_count_); + printf("\n"); + + for (unsigned int module_index = 0; + module_index < module_count_; + ++module_index) { + printf("module[%d]\n", module_index); + + (*modules_)[module_index].Print(); + } +} + + +// +// MinidumpMemoryList +// + + +uint32_t MinidumpMemoryList::max_regions_ = 4096; + + +MinidumpMemoryList::MinidumpMemoryList(Minidump* minidump) + : MinidumpStream(minidump), + range_map_(new RangeMap()), + descriptors_(NULL), + regions_(NULL), + region_count_(0) { +} + + +MinidumpMemoryList::~MinidumpMemoryList() { + delete range_map_; + delete descriptors_; + delete regions_; +} + + +bool MinidumpMemoryList::Read(uint32_t expected_size) { + // Invalidate cached data. + delete descriptors_; + descriptors_ = NULL; + delete regions_; + regions_ = NULL; + range_map_->Clear(); + region_count_ = 0; + + valid_ = false; + + uint32_t region_count; + if (expected_size < sizeof(region_count)) { + BPLOG(ERROR) << "MinidumpMemoryList count size mismatch, " << + expected_size << " < " << sizeof(region_count); + return false; + } + if (!minidump_->ReadBytes(®ion_count, sizeof(region_count))) { + BPLOG(ERROR) << "MinidumpMemoryList could not read memory region count"; + return false; + } + + if (minidump_->swap()) + Swap(®ion_count); + + if (region_count > + numeric_limits::max() / sizeof(MDMemoryDescriptor)) { + BPLOG(ERROR) << "MinidumpMemoryList region count " << region_count << + " would cause multiplication overflow"; + return false; + } + + if (expected_size != sizeof(region_count) + + region_count * sizeof(MDMemoryDescriptor)) { + // may be padded with 4 bytes on 64bit ABIs for alignment + if (expected_size == sizeof(region_count) + 4 + + region_count * sizeof(MDMemoryDescriptor)) { + uint32_t useless; + if (!minidump_->ReadBytes(&useless, 4)) { + BPLOG(ERROR) << "MinidumpMemoryList cannot read memorylist padded " + "bytes"; + return false; + } + } else { + BPLOG(ERROR) << "MinidumpMemoryList size mismatch, " << expected_size << + " != " << sizeof(region_count) + + region_count * sizeof(MDMemoryDescriptor); + return false; + } + } + + if (region_count > max_regions_) { + BPLOG(ERROR) << "MinidumpMemoryList count " << region_count << + " exceeds maximum " << max_regions_; + return false; + } + + if (region_count != 0) { + scoped_ptr descriptors( + new MemoryDescriptors(region_count)); + + // Read the entire array in one fell swoop, instead of reading one entry + // at a time in the loop. + if (!minidump_->ReadBytes(&(*descriptors)[0], + sizeof(MDMemoryDescriptor) * region_count)) { + BPLOG(ERROR) << "MinidumpMemoryList could not read memory region list"; + return false; + } + + scoped_ptr regions( + new MemoryRegions(region_count, MinidumpMemoryRegion(minidump_))); + + for (unsigned int region_index = 0; + region_index < region_count; + ++region_index) { + MDMemoryDescriptor* descriptor = &(*descriptors)[region_index]; + + if (minidump_->swap()) + Swap(descriptor); + + uint64_t base_address = descriptor->start_of_memory_range; + uint32_t region_size = descriptor->memory.data_size; + + // Check for base + size overflow or undersize. + if (region_size == 0 || + region_size > numeric_limits::max() - base_address) { + BPLOG(ERROR) << "MinidumpMemoryList has a memory region problem, " << + " region " << region_index << "/" << region_count << + ", " << HexString(base_address) << "+" << + HexString(region_size); + return false; + } + + if (!range_map_->StoreRange(base_address, region_size, region_index)) { + BPLOG(ERROR) << "MinidumpMemoryList could not store memory region " << + region_index << "/" << region_count << ", " << + HexString(base_address) << "+" << + HexString(region_size); + return false; + } + + (*regions)[region_index].SetDescriptor(descriptor); + } + + descriptors_ = descriptors.release(); + regions_ = regions.release(); + } + + region_count_ = region_count; + + valid_ = true; + return true; +} + + +MinidumpMemoryRegion* MinidumpMemoryList::GetMemoryRegionAtIndex( + unsigned int index) { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryList for GetMemoryRegionAtIndex"; + return NULL; + } + + if (index >= region_count_) { + BPLOG(ERROR) << "MinidumpMemoryList index out of range: " << + index << "/" << region_count_; + return NULL; + } + + return &(*regions_)[index]; +} + + +MinidumpMemoryRegion* MinidumpMemoryList::GetMemoryRegionForAddress( + uint64_t address) { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryList for GetMemoryRegionForAddress"; + return NULL; + } + + unsigned int region_index; + if (!range_map_->RetrieveRange(address, ®ion_index, NULL /* base */, + NULL /* delta */, NULL /* size */)) { + BPLOG(INFO) << "MinidumpMemoryList has no memory region at " << + HexString(address); + return NULL; + } + + return GetMemoryRegionAtIndex(region_index); +} + + +void MinidumpMemoryList::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpMemoryList cannot print invalid data"; + return; + } + + printf("MinidumpMemoryList\n"); + printf(" region_count = %d\n", region_count_); + printf("\n"); + + for (unsigned int region_index = 0; + region_index < region_count_; + ++region_index) { + MDMemoryDescriptor* descriptor = &(*descriptors_)[region_index]; + printf("region[%d]\n", region_index); + printf("MDMemoryDescriptor\n"); + printf(" start_of_memory_range = 0x%" PRIx64 "\n", + descriptor->start_of_memory_range); + printf(" memory.data_size = 0x%x\n", descriptor->memory.data_size); + printf(" memory.rva = 0x%x\n", descriptor->memory.rva); + MinidumpMemoryRegion* region = GetMemoryRegionAtIndex(region_index); + if (region) { + printf("Memory\n"); + region->Print(); + } else { + printf("No memory\n"); + } + printf("\n"); + } +} + + +// +// MinidumpException +// + + +MinidumpException::MinidumpException(Minidump* minidump) + : MinidumpStream(minidump), + exception_(), + context_(NULL) { +} + + +MinidumpException::~MinidumpException() { + delete context_; +} + + +bool MinidumpException::Read(uint32_t expected_size) { + // Invalidate cached data. + delete context_; + context_ = NULL; + + valid_ = false; + + if (expected_size != sizeof(exception_)) { + BPLOG(ERROR) << "MinidumpException size mismatch, " << expected_size << + " != " << sizeof(exception_); + return false; + } + + if (!minidump_->ReadBytes(&exception_, sizeof(exception_))) { + BPLOG(ERROR) << "MinidumpException cannot read exception"; + return false; + } + + if (minidump_->swap()) { + Swap(&exception_.thread_id); + // exception_.__align is for alignment only and does not need to be + // swapped. + Swap(&exception_.exception_record.exception_code); + Swap(&exception_.exception_record.exception_flags); + Swap(&exception_.exception_record.exception_record); + Swap(&exception_.exception_record.exception_address); + Swap(&exception_.exception_record.number_parameters); + // exception_.exception_record.__align is for alignment only and does not + // need to be swapped. + for (unsigned int parameter_index = 0; + parameter_index < MD_EXCEPTION_MAXIMUM_PARAMETERS; + ++parameter_index) { + Swap(&exception_.exception_record.exception_information[parameter_index]); + } + Swap(&exception_.thread_context); + } + + valid_ = true; + return true; +} + + +bool MinidumpException::GetThreadID(uint32_t* thread_id) const { + BPLOG_IF(ERROR, !thread_id) << "MinidumpException::GetThreadID requires " + "|thread_id|"; + assert(thread_id); + *thread_id = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpException for GetThreadID"; + return false; + } + + *thread_id = exception_.thread_id; + return true; +} + + +MinidumpContext* MinidumpException::GetContext() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpException for GetContext"; + return NULL; + } + + if (!context_) { + if (!minidump_->SeekSet(exception_.thread_context.rva)) { + BPLOG(ERROR) << "MinidumpException cannot seek to context"; + return NULL; + } + + scoped_ptr context(new MinidumpContext(minidump_)); + + // Don't log as an error if we can still fall back on the thread's context + // (which must be possible if we got this far.) + if (!context->Read(exception_.thread_context.data_size)) { + BPLOG(INFO) << "MinidumpException cannot read context"; + return NULL; + } + + context_ = context.release(); + } + + return context_; +} + + +void MinidumpException::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpException cannot print invalid data"; + return; + } + + printf("MDException\n"); + printf(" thread_id = 0x%x\n", + exception_.thread_id); + printf(" exception_record.exception_code = 0x%x\n", + exception_.exception_record.exception_code); + printf(" exception_record.exception_flags = 0x%x\n", + exception_.exception_record.exception_flags); + printf(" exception_record.exception_record = 0x%" PRIx64 "\n", + exception_.exception_record.exception_record); + printf(" exception_record.exception_address = 0x%" PRIx64 "\n", + exception_.exception_record.exception_address); + printf(" exception_record.number_parameters = %d\n", + exception_.exception_record.number_parameters); + for (unsigned int parameterIndex = 0; + parameterIndex < exception_.exception_record.number_parameters; + ++parameterIndex) { + printf(" exception_record.exception_information[%2d] = 0x%" PRIx64 "\n", + parameterIndex, + exception_.exception_record.exception_information[parameterIndex]); + } + printf(" thread_context.data_size = %d\n", + exception_.thread_context.data_size); + printf(" thread_context.rva = 0x%x\n", + exception_.thread_context.rva); + MinidumpContext* context = GetContext(); + if (context) { + printf("\n"); + context->Print(); + } else { + printf(" (no context)\n"); + printf("\n"); + } +} + +// +// MinidumpAssertion +// + + +MinidumpAssertion::MinidumpAssertion(Minidump* minidump) + : MinidumpStream(minidump), + assertion_(), + expression_(), + function_(), + file_() { +} + + +MinidumpAssertion::~MinidumpAssertion() { +} + + +bool MinidumpAssertion::Read(uint32_t expected_size) { + // Invalidate cached data. + valid_ = false; + + if (expected_size != sizeof(assertion_)) { + BPLOG(ERROR) << "MinidumpAssertion size mismatch, " << expected_size << + " != " << sizeof(assertion_); + return false; + } + + if (!minidump_->ReadBytes(&assertion_, sizeof(assertion_))) { + BPLOG(ERROR) << "MinidumpAssertion cannot read assertion"; + return false; + } + + // Each of {expression, function, file} is a UTF-16 string, + // we'll convert them to UTF-8 for ease of use. + ConvertUTF16BufferToUTF8String(assertion_.expression, + sizeof(assertion_.expression), &expression_, + minidump_->swap()); + ConvertUTF16BufferToUTF8String(assertion_.function, + sizeof(assertion_.function), &function_, + minidump_->swap()); + ConvertUTF16BufferToUTF8String(assertion_.file, sizeof(assertion_.file), + &file_, minidump_->swap()); + + if (minidump_->swap()) { + Swap(&assertion_.line); + Swap(&assertion_.type); + } + + valid_ = true; + return true; +} + +void MinidumpAssertion::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpAssertion cannot print invalid data"; + return; + } + + printf("MDAssertion\n"); + printf(" expression = %s\n", + expression_.c_str()); + printf(" function = %s\n", + function_.c_str()); + printf(" file = %s\n", + file_.c_str()); + printf(" line = %u\n", + assertion_.line); + printf(" type = %u\n", + assertion_.type); + printf("\n"); +} + +// +// MinidumpSystemInfo +// + + +MinidumpSystemInfo::MinidumpSystemInfo(Minidump* minidump) + : MinidumpStream(minidump), + system_info_(), + csd_version_(NULL), + cpu_vendor_(NULL) { +} + + +MinidumpSystemInfo::~MinidumpSystemInfo() { + delete csd_version_; + delete cpu_vendor_; +} + + +bool MinidumpSystemInfo::Read(uint32_t expected_size) { + // Invalidate cached data. + delete csd_version_; + csd_version_ = NULL; + delete cpu_vendor_; + cpu_vendor_ = NULL; + + valid_ = false; + + if (expected_size != sizeof(system_info_)) { + BPLOG(ERROR) << "MinidumpSystemInfo size mismatch, " << expected_size << + " != " << sizeof(system_info_); + return false; + } + + if (!minidump_->ReadBytes(&system_info_, sizeof(system_info_))) { + BPLOG(ERROR) << "MinidumpSystemInfo cannot read system info"; + return false; + } + + if (minidump_->swap()) { + Swap(&system_info_.processor_architecture); + Swap(&system_info_.processor_level); + Swap(&system_info_.processor_revision); + // number_of_processors and product_type are 8-bit quantities and need no + // swapping. + Swap(&system_info_.major_version); + Swap(&system_info_.minor_version); + Swap(&system_info_.build_number); + Swap(&system_info_.platform_id); + Swap(&system_info_.csd_version_rva); + Swap(&system_info_.suite_mask); + // Don't swap the reserved2 field because its contents are unknown. + + if (system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86 || + system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86_WIN64) { + for (unsigned int i = 0; i < 3; ++i) + Swap(&system_info_.cpu.x86_cpu_info.vendor_id[i]); + Swap(&system_info_.cpu.x86_cpu_info.version_information); + Swap(&system_info_.cpu.x86_cpu_info.feature_information); + Swap(&system_info_.cpu.x86_cpu_info.amd_extended_cpu_features); + } else { + for (unsigned int i = 0; i < 2; ++i) + Swap(&system_info_.cpu.other_cpu_info.processor_features[i]); + } + } + + valid_ = true; + return true; +} + + +string MinidumpSystemInfo::GetOS() { + string os; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpSystemInfo for GetOS"; + return os; + } + + switch (system_info_.platform_id) { + case MD_OS_WIN32_NT: + case MD_OS_WIN32_WINDOWS: + os = "windows"; + break; + + case MD_OS_MAC_OS_X: + os = "mac"; + break; + + case MD_OS_IOS: + os = "ios"; + break; + + case MD_OS_LINUX: + os = "linux"; + break; + + case MD_OS_SOLARIS: + os = "solaris"; + break; + + case MD_OS_ANDROID: + os = "android"; + break; + + case MD_OS_PS3: + os = "ps3"; + break; + + case MD_OS_NACL: + os = "nacl"; + break; + + case MD_OS_FUCHSIA: + os = "fuchsia"; + break; + + default: + BPLOG(ERROR) << "MinidumpSystemInfo unknown OS for platform " << + HexString(system_info_.platform_id); + break; + } + + return os; +} + + +string MinidumpSystemInfo::GetCPU() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpSystemInfo for GetCPU"; + return ""; + } + + string cpu; + + switch (system_info_.processor_architecture) { + case MD_CPU_ARCHITECTURE_X86: + case MD_CPU_ARCHITECTURE_X86_WIN64: + cpu = "x86"; + break; + + case MD_CPU_ARCHITECTURE_AMD64: + cpu = "x86-64"; + break; + + case MD_CPU_ARCHITECTURE_PPC: + cpu = "ppc"; + break; + + case MD_CPU_ARCHITECTURE_PPC64: + cpu = "ppc64"; + break; + + case MD_CPU_ARCHITECTURE_SPARC: + cpu = "sparc"; + break; + + case MD_CPU_ARCHITECTURE_ARM: + cpu = "arm"; + break; + + case MD_CPU_ARCHITECTURE_ARM64: + case MD_CPU_ARCHITECTURE_ARM64_OLD: + cpu = "arm64"; + break; + + case MD_CPU_ARCHITECTURE_RISCV: + cpu = "riscv"; + break; + + case MD_CPU_ARCHITECTURE_RISCV64: + cpu = "riscv64"; + break; + + default: + BPLOG(ERROR) << "MinidumpSystemInfo unknown CPU for architecture " << + HexString(system_info_.processor_architecture); + break; + } + + return cpu; +} + + +const string* MinidumpSystemInfo::GetCSDVersion() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpSystemInfo for GetCSDVersion"; + return NULL; + } + + if (!csd_version_) + csd_version_ = minidump_->ReadString(system_info_.csd_version_rva); + + BPLOG_IF(ERROR, !csd_version_) << "MinidumpSystemInfo could not read " + "CSD version"; + + return csd_version_; +} + + +const string* MinidumpSystemInfo::GetCPUVendor() { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpSystemInfo for GetCPUVendor"; + return NULL; + } + + // CPU vendor information can only be determined from x86 minidumps. + if (!cpu_vendor_ && + (system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86 || + system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86_WIN64)) { + char cpu_vendor_string[13]; + snprintf(cpu_vendor_string, sizeof(cpu_vendor_string), + "%c%c%c%c%c%c%c%c%c%c%c%c", + system_info_.cpu.x86_cpu_info.vendor_id[0] & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[0] >> 8) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[0] >> 16) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[0] >> 24) & 0xff, + system_info_.cpu.x86_cpu_info.vendor_id[1] & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[1] >> 8) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[1] >> 16) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[1] >> 24) & 0xff, + system_info_.cpu.x86_cpu_info.vendor_id[2] & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[2] >> 8) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[2] >> 16) & 0xff, + (system_info_.cpu.x86_cpu_info.vendor_id[2] >> 24) & 0xff); + cpu_vendor_ = new string(cpu_vendor_string); + } + + return cpu_vendor_; +} + + +void MinidumpSystemInfo::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpSystemInfo cannot print invalid data"; + return; + } + + printf("MDRawSystemInfo\n"); + printf(" processor_architecture = 0x%x (%s)\n", + system_info_.processor_architecture, GetCPU().c_str()); + printf(" processor_level = %d\n", + system_info_.processor_level); + printf(" processor_revision = 0x%x\n", + system_info_.processor_revision); + printf(" number_of_processors = %d\n", + system_info_.number_of_processors); + printf(" product_type = %d\n", + system_info_.product_type); + printf(" major_version = %d\n", + system_info_.major_version); + printf(" minor_version = %d\n", + system_info_.minor_version); + printf(" build_number = %d\n", + system_info_.build_number); + printf(" platform_id = 0x%x (%s)\n", + system_info_.platform_id, GetOS().c_str()); + printf(" csd_version_rva = 0x%x\n", + system_info_.csd_version_rva); + printf(" suite_mask = 0x%x\n", + system_info_.suite_mask); + if (system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86 || + system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86_WIN64) { + printf(" cpu.x86_cpu_info (valid):\n"); + } else { + printf(" cpu.x86_cpu_info (invalid):\n"); + } + for (unsigned int i = 0; i < 3; ++i) { + printf(" cpu.x86_cpu_info.vendor_id[%d] = 0x%x\n", + i, system_info_.cpu.x86_cpu_info.vendor_id[i]); + } + printf(" cpu.x86_cpu_info.version_information = 0x%x\n", + system_info_.cpu.x86_cpu_info.version_information); + printf(" cpu.x86_cpu_info.feature_information = 0x%x\n", + system_info_.cpu.x86_cpu_info.feature_information); + printf(" cpu.x86_cpu_info.amd_extended_cpu_features = 0x%x\n", + system_info_.cpu.x86_cpu_info.amd_extended_cpu_features); + if (system_info_.processor_architecture != MD_CPU_ARCHITECTURE_X86 && + system_info_.processor_architecture != MD_CPU_ARCHITECTURE_X86_WIN64) { + printf(" cpu.other_cpu_info (valid):\n"); + for (unsigned int i = 0; i < 2; ++i) { + printf(" cpu.other_cpu_info.processor_features[%d] = 0x%" PRIx64 "\n", + i, system_info_.cpu.other_cpu_info.processor_features[i]); + } + } + const string* csd_version = GetCSDVersion(); + if (csd_version) { + printf(" (csd_version) = \"%s\"\n", + csd_version->c_str()); + } else { + printf(" (csd_version) = (null)\n"); + } + const string* cpu_vendor = GetCPUVendor(); + if (cpu_vendor) { + printf(" (cpu_vendor) = \"%s\"\n", + cpu_vendor->c_str()); + } else { + printf(" (cpu_vendor) = (null)\n"); + } + printf("\n"); +} + + +// +// MinidumpUnloadedModule +// + + +MinidumpUnloadedModule::MinidumpUnloadedModule(Minidump* minidump) + : MinidumpObject(minidump), + module_valid_(false), + unloaded_module_(), + name_(NULL) { + +} + +MinidumpUnloadedModule::~MinidumpUnloadedModule() { + delete name_; +} + +string MinidumpUnloadedModule::code_file() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpUnloadedModule for code_file"; + return ""; + } + + return *name_; +} + +string MinidumpUnloadedModule::code_identifier() const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpUnloadedModule for code_identifier"; + return ""; + } + + MinidumpSystemInfo* minidump_system_info = minidump_->GetSystemInfo(); + if (!minidump_system_info) { + BPLOG(ERROR) << "MinidumpUnloadedModule code_identifier requires " + "MinidumpSystemInfo"; + return ""; + } + + const MDRawSystemInfo* raw_system_info = minidump_system_info->system_info(); + if (!raw_system_info) { + BPLOG(ERROR) << "MinidumpUnloadedModule code_identifier requires " + << "MDRawSystemInfo"; + return ""; + } + + string identifier; + + switch (raw_system_info->platform_id) { + case MD_OS_WIN32_NT: + case MD_OS_WIN32_WINDOWS: { + // Use the same format that the MS symbol server uses in filesystem + // hierarchies. + char identifier_string[17]; + snprintf(identifier_string, sizeof(identifier_string), "%08X%x", + unloaded_module_.time_date_stamp, + unloaded_module_.size_of_image); + identifier = identifier_string; + break; + } + + case MD_OS_ANDROID: + case MD_OS_LINUX: + case MD_OS_MAC_OS_X: + case MD_OS_IOS: + case MD_OS_SOLARIS: + case MD_OS_NACL: + case MD_OS_PS3: { + // TODO(mmentovai): support uuid extension if present, otherwise fall + // back to version (from LC_ID_DYLIB?), otherwise fall back to something + // else. + identifier = "id"; + break; + } + + default: { + // Without knowing what OS generated the dump, we can't generate a good + // identifier. Return an empty string, signalling failure. + BPLOG(ERROR) << "MinidumpUnloadedModule code_identifier requires known " + << "platform, found " + << HexString(raw_system_info->platform_id); + break; + } + } + + return identifier; +} + +string MinidumpUnloadedModule::debug_file() const { + return ""; // No debug info provided with unloaded modules +} + +string MinidumpUnloadedModule::debug_identifier() const { + return ""; // No debug info provided with unloaded modules +} + +string MinidumpUnloadedModule::version() const { + return ""; // No version info provided with unloaded modules +} + +CodeModule* MinidumpUnloadedModule::Copy() const { + return new BasicCodeModule(this); +} + +uint64_t MinidumpUnloadedModule::shrink_down_delta() const { + return 0; +} + +void MinidumpUnloadedModule::SetShrinkDownDelta(uint64_t shrink_down_delta) { + // Not implemented + assert(false); +} + +bool MinidumpUnloadedModule::Read(uint32_t expected_size) { + + delete name_; + valid_ = false; + + if (expected_size < sizeof(unloaded_module_)) { + BPLOG(ERROR) << "MinidumpUnloadedModule expected size is less than size " + << "of struct " << expected_size << " < " + << sizeof(unloaded_module_); + return false; + } + + if (!minidump_->ReadBytes(&unloaded_module_, sizeof(unloaded_module_))) { + BPLOG(ERROR) << "MinidumpUnloadedModule cannot read module"; + return false; + } + + if (expected_size > sizeof(unloaded_module_)) { + uint32_t module_bytes_remaining = expected_size - sizeof(unloaded_module_); + off_t pos = minidump_->Tell(); + if (!minidump_->SeekSet(pos + module_bytes_remaining)) { + BPLOG(ERROR) << "MinidumpUnloadedModule unable to seek to end of module"; + return false; + } + } + + if (minidump_->swap()) { + Swap(&unloaded_module_.base_of_image); + Swap(&unloaded_module_.size_of_image); + Swap(&unloaded_module_.checksum); + Swap(&unloaded_module_.time_date_stamp); + Swap(&unloaded_module_.module_name_rva); + } + + // Check for base + size overflow or undersize. + if (unloaded_module_.size_of_image == 0 || + unloaded_module_.size_of_image > + numeric_limits::max() - unloaded_module_.base_of_image) { + BPLOG(ERROR) << "MinidumpUnloadedModule has a module problem, " << + HexString(unloaded_module_.base_of_image) << "+" << + HexString(unloaded_module_.size_of_image); + return false; + } + + + module_valid_ = true; + return true; +} + +bool MinidumpUnloadedModule::ReadAuxiliaryData() { + if (!module_valid_) { + BPLOG(ERROR) << "Invalid MinidumpUnloadedModule for ReadAuxiliaryData"; + return false; + } + + // Each module must have a name. + name_ = minidump_->ReadString(unloaded_module_.module_name_rva); + if (!name_) { + BPLOG(ERROR) << "MinidumpUnloadedModule could not read name"; + return false; + } + + // At this point, we have enough info for the module to be valid. + valid_ = true; + return true; +} + +// +// MinidumpUnloadedModuleList +// + + +uint32_t MinidumpUnloadedModuleList::max_modules_ = 2048; + + +MinidumpUnloadedModuleList::MinidumpUnloadedModuleList(Minidump* minidump) + : MinidumpStream(minidump), + range_map_(new RangeMap()), + unloaded_modules_(NULL), + module_count_(0) { + range_map_->SetMergeStrategy(MergeRangeStrategy::kTruncateLower); +} + +MinidumpUnloadedModuleList::~MinidumpUnloadedModuleList() { + delete range_map_; + delete unloaded_modules_; +} + + +bool MinidumpUnloadedModuleList::Read(uint32_t expected_size) { + range_map_->Clear(); + delete unloaded_modules_; + unloaded_modules_ = NULL; + module_count_ = 0; + + valid_ = false; + + uint32_t size_of_header; + if (!minidump_->ReadBytes(&size_of_header, sizeof(size_of_header))) { + BPLOG(ERROR) << "MinidumpUnloadedModuleList could not read header size"; + return false; + } + + uint32_t size_of_entry; + if (!minidump_->ReadBytes(&size_of_entry, sizeof(size_of_entry))) { + BPLOG(ERROR) << "MinidumpUnloadedModuleList could not read entry size"; + return false; + } + + uint32_t number_of_entries; + if (!minidump_->ReadBytes(&number_of_entries, sizeof(number_of_entries))) { + BPLOG(ERROR) << + "MinidumpUnloadedModuleList could not read number of entries"; + return false; + } + + if (minidump_->swap()) { + Swap(&size_of_header); + Swap(&size_of_entry); + Swap(&number_of_entries); + } + + uint32_t header_bytes_remaining = size_of_header - sizeof(size_of_header) - + sizeof(size_of_entry) - sizeof(number_of_entries); + if (header_bytes_remaining) { + off_t pos = minidump_->Tell(); + if (!minidump_->SeekSet(pos + header_bytes_remaining)) { + BPLOG(ERROR) << "MinidumpUnloadedModuleList could not read header sized " + << size_of_header; + return false; + } + } + + if (expected_size != size_of_header + (size_of_entry * number_of_entries)) { + BPLOG(ERROR) << "MinidumpUnloadedModuleList expected_size mismatch " << + expected_size << " != " << size_of_header << " + (" << + size_of_entry << " * " << number_of_entries << ")"; + return false; + } + + if (number_of_entries > max_modules_) { + BPLOG(ERROR) << "MinidumpUnloadedModuleList count " << + number_of_entries << " exceeds maximum " << max_modules_; + return false; + } + + if (number_of_entries != 0) { + scoped_ptr modules( + new MinidumpUnloadedModules(number_of_entries, + MinidumpUnloadedModule(minidump_))); + + for (unsigned int module_index = 0; + module_index < number_of_entries; + ++module_index) { + MinidumpUnloadedModule* module = &(*modules)[module_index]; + + if (!module->Read(size_of_entry)) { + BPLOG(ERROR) << "MinidumpUnloadedModuleList could not read module " << + module_index << "/" << number_of_entries; + return false; + } + } + + for (unsigned int module_index = 0; + module_index < number_of_entries; + ++module_index) { + MinidumpUnloadedModule* module = &(*modules)[module_index]; + + if (!module->ReadAuxiliaryData()) { + BPLOG(ERROR) << "MinidumpUnloadedModuleList could not read required " + "module auxiliary data for module " << + module_index << "/" << number_of_entries; + return false; + } + + uint64_t base_address = module->base_address(); + uint64_t module_size = module->size(); + + // Ignore any failures for conflicting address ranges + range_map_->StoreRange(base_address, module_size, module_index); + + } + unloaded_modules_ = modules.release(); + } + + module_count_ = number_of_entries; + valid_ = true; + return true; +} + +const MinidumpUnloadedModule* MinidumpUnloadedModuleList::GetModuleForAddress( + uint64_t address) const { + if (!valid_) { + BPLOG(ERROR) + << "Invalid MinidumpUnloadedModuleList for GetModuleForAddress"; + return NULL; + } + + unsigned int module_index; + if (!range_map_->RetrieveRange(address, &module_index, NULL /* base */, + NULL /* delta */, NULL /* size */)) { + BPLOG(INFO) << "MinidumpUnloadedModuleList has no module at " + << HexString(address); + return NULL; + } + + return GetModuleAtIndex(module_index); +} + +const MinidumpUnloadedModule* +MinidumpUnloadedModuleList::GetMainModule() const { + return NULL; +} + +const MinidumpUnloadedModule* +MinidumpUnloadedModuleList::GetModuleAtSequence(unsigned int sequence) const { + if (!valid_) { + BPLOG(ERROR) + << "Invalid MinidumpUnloadedModuleList for GetModuleAtSequence"; + return NULL; + } + + if (sequence >= module_count_) { + BPLOG(ERROR) << "MinidumpUnloadedModuleList sequence out of range: " + << sequence << "/" << module_count_; + return NULL; + } + + unsigned int module_index; + if (!range_map_->RetrieveRangeAtIndex(sequence, &module_index, + NULL /* base */, NULL /* delta */, + NULL /* size */)) { + BPLOG(ERROR) << "MinidumpUnloadedModuleList has no module at sequence " + << sequence; + return NULL; + } + + return GetModuleAtIndex(module_index); +} + +const MinidumpUnloadedModule* +MinidumpUnloadedModuleList::GetModuleAtIndex( + unsigned int index) const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpUnloadedModuleList for GetModuleAtIndex"; + return NULL; + } + + if (index >= module_count_) { + BPLOG(ERROR) << "MinidumpUnloadedModuleList index out of range: " + << index << "/" << module_count_; + return NULL; + } + + return &(*unloaded_modules_)[index]; +} + +const CodeModules* MinidumpUnloadedModuleList::Copy() const { + return new BasicCodeModules(this, range_map_->GetMergeStrategy()); +} + +vector> +MinidumpUnloadedModuleList::GetShrunkRangeModules() const { + return vector >(); +} + + +// +// MinidumpMiscInfo +// + + +MinidumpMiscInfo::MinidumpMiscInfo(Minidump* minidump) + : MinidumpStream(minidump), + misc_info_() { +} + + +bool MinidumpMiscInfo::Read(uint32_t expected_size) { + valid_ = false; + + size_t padding = 0; + if (expected_size != MD_MISCINFO_SIZE && + expected_size != MD_MISCINFO2_SIZE && + expected_size != MD_MISCINFO3_SIZE && + expected_size != MD_MISCINFO4_SIZE && + expected_size != MD_MISCINFO5_SIZE) { + if (expected_size > MD_MISCINFO5_SIZE) { + // Only read the part of the misc info structure we know how to handle + BPLOG(INFO) << "MinidumpMiscInfo size larger than expected " + << expected_size << ", skipping over the unknown part"; + padding = expected_size - MD_MISCINFO5_SIZE; + expected_size = MD_MISCINFO5_SIZE; + } else { + BPLOG(ERROR) << "MinidumpMiscInfo size mismatch, " << expected_size + << " != " << MD_MISCINFO_SIZE << ", " << MD_MISCINFO2_SIZE + << ", " << MD_MISCINFO3_SIZE << ", " << MD_MISCINFO4_SIZE + << ", " << MD_MISCINFO5_SIZE << ")"; + return false; + } + } + + if (!minidump_->ReadBytes(&misc_info_, expected_size)) { + BPLOG(ERROR) << "MinidumpMiscInfo cannot read miscellaneous info"; + return false; + } + + if (padding != 0) { + off_t saved_position = minidump_->Tell(); + if (saved_position == -1) { + BPLOG(ERROR) << "MinidumpMiscInfo could not tell the current position"; + return false; + } + + if (!minidump_->SeekSet(saved_position + static_cast(padding))) { + BPLOG(ERROR) << "MinidumpMiscInfo could not seek past the miscellaneous " + << "info structure"; + return false; + } + } + + if (minidump_->swap()) { + // Swap version 1 fields + Swap(&misc_info_.size_of_info); + Swap(&misc_info_.flags1); + Swap(&misc_info_.process_id); + Swap(&misc_info_.process_create_time); + Swap(&misc_info_.process_user_time); + Swap(&misc_info_.process_kernel_time); + if (misc_info_.size_of_info > MD_MISCINFO_SIZE) { + // Swap version 2 fields + Swap(&misc_info_.processor_max_mhz); + Swap(&misc_info_.processor_current_mhz); + Swap(&misc_info_.processor_mhz_limit); + Swap(&misc_info_.processor_max_idle_state); + Swap(&misc_info_.processor_current_idle_state); + } + if (misc_info_.size_of_info > MD_MISCINFO2_SIZE) { + // Swap version 3 fields + Swap(&misc_info_.process_integrity_level); + Swap(&misc_info_.process_execute_flags); + Swap(&misc_info_.protected_process); + Swap(&misc_info_.time_zone_id); + Swap(&misc_info_.time_zone); + } + if (misc_info_.size_of_info > MD_MISCINFO3_SIZE) { + // Swap version 4 fields. + // Do not swap UTF-16 strings. The swap is done as part of the + // conversion to UTF-8 (code follows below). + } + if (misc_info_.size_of_info > MD_MISCINFO4_SIZE) { + // Swap version 5 fields + Swap(&misc_info_.xstate_data); + Swap(&misc_info_.process_cookie); + } + } + + if (expected_size + padding != misc_info_.size_of_info) { + BPLOG(ERROR) << "MinidumpMiscInfo size mismatch, " << + expected_size << " != " << misc_info_.size_of_info; + return false; + } + + // Convert UTF-16 strings + if (misc_info_.size_of_info > MD_MISCINFO2_SIZE) { + // Convert UTF-16 strings in version 3 fields + ConvertUTF16BufferToUTF8String(misc_info_.time_zone.standard_name, + sizeof(misc_info_.time_zone.standard_name), + &standard_name_, minidump_->swap()); + ConvertUTF16BufferToUTF8String(misc_info_.time_zone.daylight_name, + sizeof(misc_info_.time_zone.daylight_name), + &daylight_name_, minidump_->swap()); + } + if (misc_info_.size_of_info > MD_MISCINFO3_SIZE) { + // Convert UTF-16 strings in version 4 fields + ConvertUTF16BufferToUTF8String(misc_info_.build_string, + sizeof(misc_info_.build_string), + &build_string_, minidump_->swap()); + ConvertUTF16BufferToUTF8String(misc_info_.dbg_bld_str, + sizeof(misc_info_.dbg_bld_str), + &dbg_bld_str_, minidump_->swap()); + } + + valid_ = true; + return true; +} + + +void MinidumpMiscInfo::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpMiscInfo cannot print invalid data"; + return; + } + + printf("MDRawMiscInfo\n"); + // Print version 1 fields + printf(" size_of_info = %d\n", misc_info_.size_of_info); + printf(" flags1 = 0x%x\n", misc_info_.flags1); + printf(" process_id = "); + PrintValueOrInvalid(misc_info_.flags1 & MD_MISCINFO_FLAGS1_PROCESS_ID, + kNumberFormatDecimal, misc_info_.process_id); + if (misc_info_.flags1 & MD_MISCINFO_FLAGS1_PROCESS_TIMES) { + printf(" process_create_time = 0x%x %s\n", + misc_info_.process_create_time, + TimeTToUTCString(misc_info_.process_create_time).c_str()); + } else { + printf(" process_create_time = (invalid)\n"); + } + printf(" process_user_time = "); + PrintValueOrInvalid(misc_info_.flags1 & MD_MISCINFO_FLAGS1_PROCESS_TIMES, + kNumberFormatDecimal, misc_info_.process_user_time); + printf(" process_kernel_time = "); + PrintValueOrInvalid(misc_info_.flags1 & MD_MISCINFO_FLAGS1_PROCESS_TIMES, + kNumberFormatDecimal, misc_info_.process_kernel_time); + if (misc_info_.size_of_info > MD_MISCINFO_SIZE) { + // Print version 2 fields + printf(" processor_max_mhz = "); + PrintValueOrInvalid(misc_info_.flags1 & + MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO, + kNumberFormatDecimal, misc_info_.processor_max_mhz); + printf(" processor_current_mhz = "); + PrintValueOrInvalid(misc_info_.flags1 & + MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO, + kNumberFormatDecimal, misc_info_.processor_current_mhz); + printf(" processor_mhz_limit = "); + PrintValueOrInvalid(misc_info_.flags1 & + MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO, + kNumberFormatDecimal, misc_info_.processor_mhz_limit); + printf(" processor_max_idle_state = "); + PrintValueOrInvalid(misc_info_.flags1 & + MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO, + kNumberFormatDecimal, + misc_info_.processor_max_idle_state); + printf(" processor_current_idle_state = "); + PrintValueOrInvalid(misc_info_.flags1 & + MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO, + kNumberFormatDecimal, + misc_info_.processor_current_idle_state); + } + if (misc_info_.size_of_info > MD_MISCINFO2_SIZE) { + // Print version 3 fields + printf(" process_integrity_level = "); + PrintValueOrInvalid(misc_info_.flags1 & + MD_MISCINFO_FLAGS1_PROCESS_INTEGRITY, + kNumberFormatHexadecimal, + misc_info_.process_integrity_level); + printf(" process_execute_flags = "); + PrintValueOrInvalid(misc_info_.flags1 & + MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS, + kNumberFormatHexadecimal, + misc_info_.process_execute_flags); + printf(" protected_process = "); + PrintValueOrInvalid(misc_info_.flags1 & + MD_MISCINFO_FLAGS1_PROTECTED_PROCESS, + kNumberFormatDecimal, misc_info_.protected_process); + printf(" time_zone_id = "); + PrintValueOrInvalid(misc_info_.flags1 & MD_MISCINFO_FLAGS1_TIMEZONE, + kNumberFormatDecimal, misc_info_.time_zone_id); + if (misc_info_.flags1 & MD_MISCINFO_FLAGS1_TIMEZONE) { + printf(" time_zone.bias = %d\n", + misc_info_.time_zone.bias); + printf(" time_zone.standard_name = %s\n", standard_name_.c_str()); + printf(" time_zone.standard_date = " + "%04d-%02d-%02d (%d) %02d:%02d:%02d.%03d\n", + misc_info_.time_zone.standard_date.year, + misc_info_.time_zone.standard_date.month, + misc_info_.time_zone.standard_date.day, + misc_info_.time_zone.standard_date.day_of_week, + misc_info_.time_zone.standard_date.hour, + misc_info_.time_zone.standard_date.minute, + misc_info_.time_zone.standard_date.second, + misc_info_.time_zone.standard_date.milliseconds); + printf(" time_zone.standard_bias = %d\n", + misc_info_.time_zone.standard_bias); + printf(" time_zone.daylight_name = %s\n", daylight_name_.c_str()); + printf(" time_zone.daylight_date = " + "%04d-%02d-%02d (%d) %02d:%02d:%02d.%03d\n", + misc_info_.time_zone.daylight_date.year, + misc_info_.time_zone.daylight_date.month, + misc_info_.time_zone.daylight_date.day, + misc_info_.time_zone.daylight_date.day_of_week, + misc_info_.time_zone.daylight_date.hour, + misc_info_.time_zone.daylight_date.minute, + misc_info_.time_zone.daylight_date.second, + misc_info_.time_zone.daylight_date.milliseconds); + printf(" time_zone.daylight_bias = %d\n", + misc_info_.time_zone.daylight_bias); + } else { + printf(" time_zone.bias = (invalid)\n"); + printf(" time_zone.standard_name = (invalid)\n"); + printf(" time_zone.standard_date = (invalid)\n"); + printf(" time_zone.standard_bias = (invalid)\n"); + printf(" time_zone.daylight_name = (invalid)\n"); + printf(" time_zone.daylight_date = (invalid)\n"); + printf(" time_zone.daylight_bias = (invalid)\n"); + } + } + if (misc_info_.size_of_info > MD_MISCINFO3_SIZE) { + // Print version 4 fields + if (misc_info_.flags1 & MD_MISCINFO_FLAGS1_BUILDSTRING) { + printf(" build_string = %s\n", build_string_.c_str()); + printf(" dbg_bld_str = %s\n", dbg_bld_str_.c_str()); + } else { + printf(" build_string = (invalid)\n"); + printf(" dbg_bld_str = (invalid)\n"); + } + } + if (misc_info_.size_of_info > MD_MISCINFO4_SIZE) { + // Print version 5 fields + if (misc_info_.flags1 & MD_MISCINFO_FLAGS1_PROCESS_COOKIE) { + printf(" xstate_data.size_of_info = %d\n", + misc_info_.xstate_data.size_of_info); + printf(" xstate_data.context_size = %d\n", + misc_info_.xstate_data.context_size); + printf(" xstate_data.enabled_features = 0x%" PRIx64 "\n", + misc_info_.xstate_data.enabled_features); + for (size_t i = 0; i < MD_MAXIMUM_XSTATE_FEATURES; i++) { + if ((misc_info_.xstate_data.enabled_features >> i) & 1) { + printf(" xstate_data.features[%02zu] = { %d, %d }\n", i, + misc_info_.xstate_data.features[i].offset, + misc_info_.xstate_data.features[i].size); + } + } + if (misc_info_.xstate_data.enabled_features == 0) { + printf(" xstate_data.features[] = (empty)\n"); + } + printf(" process_cookie = %d\n", + misc_info_.process_cookie); + } else { + printf(" xstate_data.size_of_info = (invalid)\n"); + printf(" xstate_data.context_size = (invalid)\n"); + printf(" xstate_data.enabled_features = (invalid)\n"); + printf(" xstate_data.features[] = (invalid)\n"); + printf(" process_cookie = (invalid)\n"); + } + } + printf("\n"); +} + + +// +// MinidumpBreakpadInfo +// + + +MinidumpBreakpadInfo::MinidumpBreakpadInfo(Minidump* minidump) + : MinidumpStream(minidump), + breakpad_info_() { +} + + +bool MinidumpBreakpadInfo::Read(uint32_t expected_size) { + valid_ = false; + + if (expected_size != sizeof(breakpad_info_)) { + BPLOG(ERROR) << "MinidumpBreakpadInfo size mismatch, " << expected_size << + " != " << sizeof(breakpad_info_); + return false; + } + + if (!minidump_->ReadBytes(&breakpad_info_, sizeof(breakpad_info_))) { + BPLOG(ERROR) << "MinidumpBreakpadInfo cannot read Breakpad info"; + return false; + } + + if (minidump_->swap()) { + Swap(&breakpad_info_.validity); + Swap(&breakpad_info_.dump_thread_id); + Swap(&breakpad_info_.requesting_thread_id); + } + + valid_ = true; + return true; +} + + +bool MinidumpBreakpadInfo::GetDumpThreadID(uint32_t* thread_id) const { + BPLOG_IF(ERROR, !thread_id) << "MinidumpBreakpadInfo::GetDumpThreadID " + "requires |thread_id|"; + assert(thread_id); + *thread_id = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpBreakpadInfo for GetDumpThreadID"; + return false; + } + + if (!(breakpad_info_.validity & MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID)) { + BPLOG(INFO) << "MinidumpBreakpadInfo has no dump thread"; + return false; + } + + *thread_id = breakpad_info_.dump_thread_id; + return true; +} + + +bool MinidumpBreakpadInfo::GetRequestingThreadID(uint32_t* thread_id) + const { + BPLOG_IF(ERROR, !thread_id) << "MinidumpBreakpadInfo::GetRequestingThreadID " + "requires |thread_id|"; + assert(thread_id); + *thread_id = 0; + + if (!thread_id || !valid_) { + BPLOG(ERROR) << "Invalid MinidumpBreakpadInfo for GetRequestingThreadID"; + return false; + } + + if (!(breakpad_info_.validity & + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID)) { + BPLOG(INFO) << "MinidumpBreakpadInfo has no requesting thread"; + return false; + } + + *thread_id = breakpad_info_.requesting_thread_id; + return true; +} + + +void MinidumpBreakpadInfo::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpBreakpadInfo cannot print invalid data"; + return; + } + + printf("MDRawBreakpadInfo\n"); + printf(" validity = 0x%x\n", breakpad_info_.validity); + printf(" dump_thread_id = "); + PrintValueOrInvalid(breakpad_info_.validity & + MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID, + kNumberFormatHexadecimal, breakpad_info_.dump_thread_id); + printf(" requesting_thread_id = "); + PrintValueOrInvalid(breakpad_info_.validity & + MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID, + kNumberFormatHexadecimal, + breakpad_info_.requesting_thread_id); + + printf("\n"); +} + + +// +// MinidumpMemoryInfo +// + + +MinidumpMemoryInfo::MinidumpMemoryInfo(Minidump* minidump) + : MinidumpObject(minidump), + memory_info_() { +} + + +bool MinidumpMemoryInfo::IsExecutable() const { + uint32_t protection = + memory_info_.protection & MD_MEMORY_PROTECTION_ACCESS_MASK; + return protection == MD_MEMORY_PROTECT_EXECUTE || + protection == MD_MEMORY_PROTECT_EXECUTE_READ || + protection == MD_MEMORY_PROTECT_EXECUTE_READWRITE; +} + + +bool MinidumpMemoryInfo::IsWritable() const { + uint32_t protection = + memory_info_.protection & MD_MEMORY_PROTECTION_ACCESS_MASK; + return protection == MD_MEMORY_PROTECT_READWRITE || + protection == MD_MEMORY_PROTECT_WRITECOPY || + protection == MD_MEMORY_PROTECT_EXECUTE_READWRITE || + protection == MD_MEMORY_PROTECT_EXECUTE_WRITECOPY; +} + + +bool MinidumpMemoryInfo::Read() { + valid_ = false; + + if (!minidump_->ReadBytes(&memory_info_, sizeof(memory_info_))) { + BPLOG(ERROR) << "MinidumpMemoryInfo cannot read memory info"; + return false; + } + + if (minidump_->swap()) { + Swap(&memory_info_.base_address); + Swap(&memory_info_.allocation_base); + Swap(&memory_info_.allocation_protection); + Swap(&memory_info_.region_size); + Swap(&memory_info_.state); + Swap(&memory_info_.protection); + Swap(&memory_info_.type); + } + + // Check for base + size overflow or undersize. + if (memory_info_.region_size == 0 || + memory_info_.region_size > numeric_limits::max() - + memory_info_.base_address) { + BPLOG(ERROR) << "MinidumpMemoryInfo has a memory region problem, " << + HexString(memory_info_.base_address) << "+" << + HexString(memory_info_.region_size); + return false; + } + + valid_ = true; + return true; +} + + +void MinidumpMemoryInfo::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpMemoryInfo cannot print invalid data"; + return; + } + + printf("MDRawMemoryInfo\n"); + printf(" base_address = 0x%" PRIx64 "\n", + memory_info_.base_address); + printf(" allocation_base = 0x%" PRIx64 "\n", + memory_info_.allocation_base); + printf(" allocation_protection = 0x%x\n", + memory_info_.allocation_protection); + printf(" region_size = 0x%" PRIx64 "\n", memory_info_.region_size); + printf(" state = 0x%x\n", memory_info_.state); + printf(" protection = 0x%x\n", memory_info_.protection); + printf(" type = 0x%x\n", memory_info_.type); +} + + +// +// MinidumpMemoryInfoList +// + + +MinidumpMemoryInfoList::MinidumpMemoryInfoList(Minidump* minidump) + : MinidumpStream(minidump), + range_map_(new RangeMap()), + infos_(NULL), + info_count_(0) { +} + + +MinidumpMemoryInfoList::~MinidumpMemoryInfoList() { + delete range_map_; + delete infos_; +} + + +bool MinidumpMemoryInfoList::Read(uint32_t expected_size) { + // Invalidate cached data. + delete infos_; + infos_ = NULL; + range_map_->Clear(); + info_count_ = 0; + + valid_ = false; + + MDRawMemoryInfoList header; + if (expected_size < sizeof(MDRawMemoryInfoList)) { + BPLOG(ERROR) << "MinidumpMemoryInfoList header size mismatch, " << + expected_size << " < " << sizeof(MDRawMemoryInfoList); + return false; + } + if (!minidump_->ReadBytes(&header, sizeof(header))) { + BPLOG(ERROR) << "MinidumpMemoryInfoList could not read header"; + return false; + } + + if (minidump_->swap()) { + Swap(&header.size_of_header); + Swap(&header.size_of_entry); + Swap(&header.number_of_entries); + } + + // Sanity check that the header is the expected size. + // TODO(ted): could possibly handle this more gracefully, assuming + // that future versions of the structs would be backwards-compatible. + if (header.size_of_header != sizeof(MDRawMemoryInfoList)) { + BPLOG(ERROR) << "MinidumpMemoryInfoList header size mismatch, " << + header.size_of_header << " != " << + sizeof(MDRawMemoryInfoList); + return false; + } + + // Sanity check that the entries are the expected size. + if (header.size_of_entry != sizeof(MDRawMemoryInfo)) { + BPLOG(ERROR) << "MinidumpMemoryInfoList entry size mismatch, " << + header.size_of_entry << " != " << + sizeof(MDRawMemoryInfo); + return false; + } + + if (header.number_of_entries > + numeric_limits::max() / sizeof(MDRawMemoryInfo)) { + BPLOG(ERROR) << "MinidumpMemoryInfoList info count " << + header.number_of_entries << + " would cause multiplication overflow"; + return false; + } + + if (expected_size != sizeof(MDRawMemoryInfoList) + + header.number_of_entries * sizeof(MDRawMemoryInfo)) { + BPLOG(ERROR) << "MinidumpMemoryInfoList size mismatch, " << expected_size << + " != " << sizeof(MDRawMemoryInfoList) + + header.number_of_entries * sizeof(MDRawMemoryInfo); + return false; + } + + // Check for data loss when converting header.number_of_entries from + // uint64_t into MinidumpMemoryInfos::size_type (uint32_t) + MinidumpMemoryInfos::size_type header_number_of_entries = + static_cast(header.number_of_entries); + if (static_cast(header_number_of_entries) != + header.number_of_entries) { + BPLOG(ERROR) << "Data loss detected when converting " + "the header's number_of_entries"; + return false; + } + + if (header.number_of_entries != 0) { + scoped_ptr infos( + new MinidumpMemoryInfos(header_number_of_entries, + MinidumpMemoryInfo(minidump_))); + + for (unsigned int index = 0; + index < header.number_of_entries; + ++index) { + MinidumpMemoryInfo* info = &(*infos)[index]; + + // Assume that the file offset is correct after the last read. + if (!info->Read()) { + BPLOG(ERROR) << "MinidumpMemoryInfoList cannot read info " << + index << "/" << header.number_of_entries; + return false; + } + + uint64_t base_address = info->GetBase(); + uint64_t region_size = info->GetSize(); + + if (!range_map_->StoreRange(base_address, region_size, index)) { + BPLOG(ERROR) << "MinidumpMemoryInfoList could not store" + " memory region " << + index << "/" << header.number_of_entries << ", " << + HexString(base_address) << "+" << + HexString(region_size); + return false; + } + } + + infos_ = infos.release(); + } + + info_count_ = static_cast(header_number_of_entries); + + valid_ = true; + return true; +} + + +const MinidumpMemoryInfo* MinidumpMemoryInfoList::GetMemoryInfoAtIndex( + unsigned int index) const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryInfoList for GetMemoryInfoAtIndex"; + return NULL; + } + + if (index >= info_count_) { + BPLOG(ERROR) << "MinidumpMemoryInfoList index out of range: " << + index << "/" << info_count_; + return NULL; + } + + return &(*infos_)[index]; +} + + +const MinidumpMemoryInfo* MinidumpMemoryInfoList::GetMemoryInfoForAddress( + uint64_t address) const { + if (!valid_) { + BPLOG(ERROR) << "Invalid MinidumpMemoryInfoList for" + " GetMemoryInfoForAddress"; + return NULL; + } + + unsigned int info_index; + if (!range_map_->RetrieveRange(address, &info_index, NULL /* base */, + NULL /* delta */, NULL /* size */)) { + BPLOG(INFO) << "MinidumpMemoryInfoList has no memory info at " << + HexString(address); + return NULL; + } + + return GetMemoryInfoAtIndex(info_index); +} + + +void MinidumpMemoryInfoList::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpMemoryInfoList cannot print invalid data"; + return; + } + + printf("MinidumpMemoryInfoList\n"); + printf(" info_count = %d\n", info_count_); + printf("\n"); + + for (unsigned int info_index = 0; + info_index < info_count_; + ++info_index) { + printf("info[%d]\n", info_index); + (*infos_)[info_index].Print(); + printf("\n"); + } +} + +// +// MinidumpLinuxMaps +// + +MinidumpLinuxMaps::MinidumpLinuxMaps(Minidump* minidump) + : MinidumpObject(minidump) { +} + +void MinidumpLinuxMaps::Print() const { + if (!valid_) { + BPLOG(ERROR) << "MinidumpLinuxMaps cannot print invalid data"; + return; + } + std::cout << region_.line << std::endl; +} + +// +// MinidumpLinuxMapsList +// + +MinidumpLinuxMapsList::MinidumpLinuxMapsList(Minidump* minidump) + : MinidumpStream(minidump), + maps_(NULL), + maps_count_(0) { +} + +MinidumpLinuxMapsList::~MinidumpLinuxMapsList() { + if (maps_) { + for (unsigned int i = 0; i < maps_->size(); i++) { + delete (*maps_)[i]; + } + delete maps_; + } +} + +const MinidumpLinuxMaps* MinidumpLinuxMapsList::GetLinuxMapsForAddress( + uint64_t address) const { + if (!valid_ || (maps_ == NULL)) { + BPLOG(ERROR) << "Invalid MinidumpLinuxMapsList for GetLinuxMapsForAddress"; + return NULL; + } + + // Search every memory mapping. + for (unsigned int index = 0; index < maps_count_; index++) { + // Check if address is within bounds of the current memory region. + if ((*maps_)[index]->GetBase() <= address && + (*maps_)[index]->GetBase() + (*maps_)[index]->GetSize() > address) { + return (*maps_)[index]; + } + } + + // No mapping encloses the memory address. + BPLOG(ERROR) << "MinidumpLinuxMapsList has no mapping at " + << HexString(address); + return NULL; +} + +const MinidumpLinuxMaps* MinidumpLinuxMapsList::GetLinuxMapsAtIndex( + unsigned int index) const { + if (!valid_ || (maps_ == NULL)) { + BPLOG(ERROR) << "Invalid MinidumpLinuxMapsList for GetLinuxMapsAtIndex"; + return NULL; + } + + // Index out of bounds. + if (index >= maps_count_ || (maps_ == NULL)) { + BPLOG(ERROR) << "MinidumpLinuxMapsList index of out range: " + << index + << "/" + << maps_count_; + return NULL; + } + return (*maps_)[index]; +} + +bool MinidumpLinuxMapsList::Read(uint32_t expected_size) { + // Invalidate cached data. + if (maps_) { + for (unsigned int i = 0; i < maps_->size(); i++) { + delete (*maps_)[i]; + } + delete maps_; + } + maps_ = NULL; + maps_count_ = 0; + + valid_ = false; + + // Load and check expected stream length. + uint32_t length = 0; + if (!minidump_->SeekToStreamType(MD_LINUX_MAPS, &length)) { + BPLOG(ERROR) << "MinidumpLinuxMapsList stream type not found"; + return false; + } + if (expected_size != length) { + BPLOG(ERROR) << "MinidumpLinuxMapsList size mismatch: " + << expected_size + << " != " + << length; + return false; + } + + // Create a vector to read stream data. The vector needs to have + // at least enough capacity to read all the data. + vector mapping_bytes(length); + if (!minidump_->ReadBytes(&mapping_bytes[0], length)) { + BPLOG(ERROR) << "MinidumpLinuxMapsList failed to read bytes"; + return false; + } + string map_string(mapping_bytes.begin(), mapping_bytes.end()); + vector all_regions; + + // Parse string into mapping data. + if (!ParseProcMaps(map_string, &all_regions)) { + return false; + } + + scoped_ptr maps(new MinidumpLinuxMappings()); + + // Push mapping data into wrapper classes. + for (size_t i = 0; i < all_regions.size(); i++) { + scoped_ptr ele(new MinidumpLinuxMaps(minidump_)); + ele->region_ = all_regions[i]; + ele->valid_ = true; + maps->push_back(ele.release()); + } + + // Set instance variables. + maps_ = maps.release(); + maps_count_ = static_cast(maps_->size()); + valid_ = true; + return true; +} + +void MinidumpLinuxMapsList::Print() const { + if (!valid_ || (maps_ == NULL)) { + BPLOG(ERROR) << "MinidumpLinuxMapsList cannot print valid data"; + return; + } + for (size_t i = 0; i < maps_->size(); i++) { + (*maps_)[i]->Print(); + } +} + +// +// MinidumpCrashpadInfo +// + + +MinidumpCrashpadInfo::MinidumpCrashpadInfo(Minidump* minidump) + : MinidumpStream(minidump), + crashpad_info_(), + module_crashpad_info_links_(), + module_crashpad_info_(), + module_crashpad_info_list_annotations_(), + module_crashpad_info_simple_annotations_(), + module_crashpad_info_annotation_objects_(), + simple_annotations_() { +} + + +bool MinidumpCrashpadInfo::Read(uint32_t expected_size) { + valid_ = false; + + // Support old minidumps that do not implement newer crashpad_info_ + // fields, currently limited to the address mask. + static_assert(sizeof(crashpad_info_) == 64, + "Updated ::Read for new crashpad_info field."); + + constexpr size_t crashpad_info_min_size = + offsetof(decltype(crashpad_info_), reserved); + if (expected_size < crashpad_info_min_size) { + BPLOG(ERROR) << "MinidumpCrashpadInfo size mismatch, " << expected_size + << " < " << crashpad_info_min_size; + return false; + } + + if (!minidump_->ReadBytes(&crashpad_info_, crashpad_info_min_size)) { + BPLOG(ERROR) << "MinidumpCrashpadInfo cannot read Crashpad info"; + return false; + } + expected_size -= crashpad_info_min_size; + + // Read `reserved` if available. + size_t crashpad_reserved_size = sizeof(crashpad_info_.reserved); + if (expected_size >= crashpad_reserved_size) { + if (!minidump_->ReadBytes( + &crashpad_info_.reserved, + crashpad_reserved_size)) { + BPLOG(ERROR) << "MinidumpCrashpadInfo cannot read reserved"; + return false; + } + expected_size -= crashpad_reserved_size; + } else { + crashpad_info_.reserved = 0; + } + + // Read `address_mask` if available. + size_t crashpad_address_mask_size = sizeof(crashpad_info_.address_mask); + if (expected_size >= crashpad_address_mask_size) { + if (!minidump_->ReadBytes( + &crashpad_info_.address_mask, + crashpad_address_mask_size)) { + BPLOG(ERROR) << "MinidumpCrashpadInfo cannot read address mask"; + return false; + } + expected_size -= crashpad_address_mask_size; + } else { + crashpad_info_.address_mask = 0; + } + + if (minidump_->swap()) { + Swap(&crashpad_info_.version); + Swap(&crashpad_info_.report_id); + Swap(&crashpad_info_.client_id); + Swap(&crashpad_info_.simple_annotations); + Swap(&crashpad_info_.module_list); + Swap(&crashpad_info_.reserved); + Swap(&crashpad_info_.address_mask); + } + + if (crashpad_info_.simple_annotations.data_size) { + if (!minidump_->ReadSimpleStringDictionary( + crashpad_info_.simple_annotations.rva, + &simple_annotations_)) { + BPLOG(ERROR) << "MinidumpCrashpadInfo cannot read simple_annotations"; + return false; + } + } + + if (crashpad_info_.module_list.data_size) { + if (!minidump_->SeekSet(crashpad_info_.module_list.rva)) { + BPLOG(ERROR) << "MinidumpCrashpadInfo cannot seek to module_list"; + return false; + } + + uint32_t count; + if (!minidump_->ReadBytes(&count, sizeof(count))) { + BPLOG(ERROR) << "MinidumpCrashpadInfo cannot read module_list count"; + return false; + } + + if (minidump_->swap()) { + Swap(&count); + } + + scoped_array module_crashpad_info_links( + new MDRawModuleCrashpadInfoLink[count]); + + // Read the entire array in one fell swoop, instead of reading one entry + // at a time in the loop. + if (!minidump_->ReadBytes( + &module_crashpad_info_links[0], + sizeof(MDRawModuleCrashpadInfoLink) * count)) { + BPLOG(ERROR) + << "MinidumpCrashpadInfo could not read Crashpad module links"; + return false; + } + + for (uint32_t index = 0; index < count; ++index) { + if (minidump_->swap()) { + Swap(&module_crashpad_info_links[index].minidump_module_list_index); + Swap(&module_crashpad_info_links[index].location); + } + + if (!minidump_->SeekSet(module_crashpad_info_links[index].location.rva)) { + BPLOG(ERROR) + << "MinidumpCrashpadInfo cannot seek to Crashpad module info"; + return false; + } + + MDRawModuleCrashpadInfo module_crashpad_info; + if (!minidump_->ReadBytes(&module_crashpad_info, + sizeof(module_crashpad_info))) { + BPLOG(ERROR) << "MinidumpCrashpadInfo cannot read Crashpad module info"; + return false; + } + + if (minidump_->swap()) { + Swap(&module_crashpad_info.version); + Swap(&module_crashpad_info.list_annotations); + Swap(&module_crashpad_info.simple_annotations); + Swap(&module_crashpad_info.annotation_objects); + } + + std::vector list_annotations; + if (module_crashpad_info.list_annotations.data_size) { + if (!minidump_->ReadStringList( + module_crashpad_info.list_annotations.rva, + &list_annotations)) { + BPLOG(ERROR) << "MinidumpCrashpadInfo cannot read Crashpad module " + "info list annotations"; + return false; + } + } + + std::map simple_annotations; + if (module_crashpad_info.simple_annotations.data_size) { + if (!minidump_->ReadSimpleStringDictionary( + module_crashpad_info.simple_annotations.rva, + &simple_annotations)) { + BPLOG(ERROR) << "MinidumpCrashpadInfo cannot read Crashpad module " + "info simple annotations"; + return false; + } + } + + std::vector annotation_objects; + if (module_crashpad_info.annotation_objects.data_size) { + if (!minidump_->ReadCrashpadAnnotationsList( + module_crashpad_info.annotation_objects.rva, + &annotation_objects)) { + BPLOG(ERROR) + << "MinidumpCrashpadInfo cannot read Crashpad annotations list"; + return false; + } + } + + module_crashpad_info_links_.push_back( + module_crashpad_info_links[index].minidump_module_list_index); + module_crashpad_info_.push_back(module_crashpad_info); + module_crashpad_info_list_annotations_.push_back(list_annotations); + module_crashpad_info_simple_annotations_.push_back(simple_annotations); + module_crashpad_info_annotation_objects_.push_back(annotation_objects); + } + } + + valid_ = true; + return true; +} + + +void MinidumpCrashpadInfo::Print() { + if (!valid_) { + BPLOG(ERROR) << "MinidumpCrashpadInfo cannot print invalid data"; + return; + } + + printf("MDRawCrashpadInfo\n"); + printf(" version = %d\n", crashpad_info_.version); + printf(" report_id = %s\n", + MDGUIDToString(crashpad_info_.report_id).c_str()); + printf(" client_id = %s\n", + MDGUIDToString(crashpad_info_.client_id).c_str()); + for (const auto& annot : simple_annotations_) { + printf(" simple_annotations[\"%s\"] = %s\n", annot.first.c_str(), + annot.second.c_str()); + } + for (uint32_t module_index = 0; + module_index < module_crashpad_info_links_.size(); + ++module_index) { + printf(" module_list[%d].minidump_module_list_index = %d\n", + module_index, module_crashpad_info_links_[module_index]); + printf(" module_list[%d].version = %d\n", + module_index, module_crashpad_info_[module_index].version); + const auto& list_annots = + module_crashpad_info_list_annotations_[module_index]; + for (uint32_t annotation_index = 0; annotation_index < list_annots.size(); + ++annotation_index) { + printf(" module_list[%d].list_annotations[%d] = %s\n", module_index, + annotation_index, list_annots[annotation_index].c_str()); + } + const auto& simple_annots = + module_crashpad_info_simple_annotations_[module_index]; + for (const auto& annot : simple_annots) { + printf(" module_list[%d].simple_annotations[\"%s\"] = %s\n", + module_index, annot.first.c_str(), annot.second.c_str()); + } + const auto& crashpad_annots = + module_crashpad_info_annotation_objects_[module_index]; + for (const AnnotationObject& annot : crashpad_annots) { + std::string str_value; + if (annot.type == 1) { + // Value represents a C-style string. + for (const uint8_t& v : annot.value) { + str_value.append(1, static_cast(v)); + } + } else { + // Value represents something else. + char buffer[3]; + for (const uint8_t& v : annot.value) { + snprintf(buffer, sizeof(buffer), "%02X", v); + str_value.append(buffer); + } + } + printf( + " module_list[%d].crashpad_annotations[\"%s\"] (type = %u) = %s\n", + module_index, annot.name.c_str(), annot.type, str_value.c_str()); + } + printf(" address_mask = %" PRIu64 "\n", crashpad_info_.address_mask); + } + + printf("\n"); +} + + +// +// Minidump +// + + +uint32_t Minidump::max_streams_ = 128; +unsigned int Minidump::max_string_length_ = 1024; + + +Minidump::Minidump(const string& path, bool hexdump, unsigned int hexdump_width) + : header_(), + directory_(NULL), + stream_map_(new MinidumpStreamMap()), + path_(path), + stream_(NULL), + swap_(false), + is_big_endian_(false), + valid_(false), + hexdump_(hexdump), + hexdump_width_(hexdump_width) { +} + +Minidump::Minidump(istream& stream) + : header_(), + directory_(NULL), + stream_map_(new MinidumpStreamMap()), + path_(), + stream_(&stream), + swap_(false), + is_big_endian_(false), + valid_(false), + hexdump_(false), + hexdump_width_(0) { +} + +Minidump::~Minidump() { + if (stream_) { + BPLOG(INFO) << "Minidump closing minidump"; + } + if (!path_.empty()) { + delete stream_; + } + delete directory_; + delete stream_map_; +} + + +bool Minidump::Open() { + if (stream_ != NULL) { + BPLOG(INFO) << "Minidump reopening minidump " << path_; + + // The file is already open. Seek to the beginning, which is the position + // the file would be at if it were opened anew. + return SeekSet(0); + } + + stream_ = new ifstream(path_.c_str(), std::ios::in | std::ios::binary); + if (!stream_ || !stream_->good()) { + string error_string; + int error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "Minidump could not open minidump " << path_ << + ", error " << error_code << ": " << error_string; + return false; + } + + BPLOG(INFO) << "Minidump opened minidump " << path_; + return true; +} + +bool Minidump::GetContextCPUFlagsFromSystemInfo(uint32_t* context_cpu_flags) { + // Initialize output parameters + *context_cpu_flags = 0; + + // Save the current stream position + off_t saved_position = Tell(); + if (saved_position == -1) { + // Failed to save the current stream position. + // Returns true because the current position of the stream is preserved. + return true; + } + + const MDRawSystemInfo* system_info = + GetSystemInfo() ? GetSystemInfo()->system_info() : NULL; + + if (system_info != NULL) { + switch (system_info->processor_architecture) { + case MD_CPU_ARCHITECTURE_X86: + *context_cpu_flags = MD_CONTEXT_X86; + break; + case MD_CPU_ARCHITECTURE_MIPS: + *context_cpu_flags = MD_CONTEXT_MIPS; + break; + case MD_CPU_ARCHITECTURE_MIPS64: + *context_cpu_flags = MD_CONTEXT_MIPS64; + break; + case MD_CPU_ARCHITECTURE_ALPHA: + *context_cpu_flags = MD_CONTEXT_ALPHA; + break; + case MD_CPU_ARCHITECTURE_PPC: + *context_cpu_flags = MD_CONTEXT_PPC; + break; + case MD_CPU_ARCHITECTURE_PPC64: + *context_cpu_flags = MD_CONTEXT_PPC64; + break; + case MD_CPU_ARCHITECTURE_SHX: + *context_cpu_flags = MD_CONTEXT_SHX; + break; + case MD_CPU_ARCHITECTURE_ARM: + *context_cpu_flags = MD_CONTEXT_ARM; + break; + case MD_CPU_ARCHITECTURE_ARM64: + *context_cpu_flags = MD_CONTEXT_ARM64; + break; + case MD_CPU_ARCHITECTURE_ARM64_OLD: + *context_cpu_flags = MD_CONTEXT_ARM64_OLD; + break; + case MD_CPU_ARCHITECTURE_IA64: + *context_cpu_flags = MD_CONTEXT_IA64; + break; + case MD_CPU_ARCHITECTURE_ALPHA64: + *context_cpu_flags = 0; + break; + case MD_CPU_ARCHITECTURE_MSIL: + *context_cpu_flags = 0; + break; + case MD_CPU_ARCHITECTURE_AMD64: + *context_cpu_flags = MD_CONTEXT_AMD64; + break; + case MD_CPU_ARCHITECTURE_X86_WIN64: + *context_cpu_flags = 0; + break; + case MD_CPU_ARCHITECTURE_SPARC: + *context_cpu_flags = MD_CONTEXT_SPARC; + break; + case MD_CPU_ARCHITECTURE_RISCV: + *context_cpu_flags = MD_CONTEXT_RISCV; + break; + case MD_CPU_ARCHITECTURE_RISCV64: + *context_cpu_flags = MD_CONTEXT_RISCV64; + break; + case MD_CPU_ARCHITECTURE_UNKNOWN: + *context_cpu_flags = 0; + break; + default: + *context_cpu_flags = 0; + break; + } + } + + // Restore position and return + return SeekSet(saved_position); +} + + +bool Minidump::Read() { + // Invalidate cached data. + delete directory_; + directory_ = NULL; + stream_map_->clear(); + + valid_ = false; + + if (!Open()) { + BPLOG(ERROR) << "Minidump cannot open minidump"; + return false; + } + + if (!ReadBytes(&header_, sizeof(MDRawHeader))) { + BPLOG(ERROR) << "Minidump cannot read header"; + return false; + } + + if (header_.signature != MD_HEADER_SIGNATURE) { + // The file may be byte-swapped. Under the present architecture, these + // classes don't know or need to know what CPU (or endianness) the + // minidump was produced on in order to parse it. Use the signature as + // a byte order marker. + uint32_t signature_swapped = header_.signature; + Swap(&signature_swapped); + if (signature_swapped != MD_HEADER_SIGNATURE) { + // This isn't a minidump or a byte-swapped minidump. + BPLOG(ERROR) << "Minidump header signature mismatch: (" << + HexString(header_.signature) << ", " << + HexString(signature_swapped) << ") != " << + HexString(MD_HEADER_SIGNATURE); + return false; + } + swap_ = true; + } else { + // The file is not byte-swapped. Set swap_ false (it may have been true + // if the object is being reused?) + swap_ = false; + } + +#if defined(__BIG_ENDIAN__) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + is_big_endian_ = !swap_; +#else + is_big_endian_ = swap_; +#endif + + BPLOG(INFO) << "Minidump " << (swap_ ? "" : "not ") << + "byte-swapping minidump"; + + if (swap_) { + Swap(&header_.signature); + Swap(&header_.version); + Swap(&header_.stream_count); + Swap(&header_.stream_directory_rva); + Swap(&header_.checksum); + Swap(&header_.time_date_stamp); + Swap(&header_.flags); + } + + // Version check. The high 16 bits of header_.version contain something + // else "implementation specific." + if ((header_.version & 0x0000ffff) != MD_HEADER_VERSION) { + BPLOG(ERROR) << "Minidump version mismatch: " << + HexString(header_.version & 0x0000ffff) << " != " << + HexString(MD_HEADER_VERSION); + return false; + } + + if (!SeekSet(header_.stream_directory_rva)) { + BPLOG(ERROR) << "Minidump cannot seek to stream directory"; + return false; + } + + if (header_.stream_count > max_streams_) { + BPLOG(ERROR) << "Minidump stream count " << header_.stream_count << + " exceeds maximum " << max_streams_; + return false; + } + + if (header_.stream_count != 0) { + scoped_ptr directory( + new MinidumpDirectoryEntries(header_.stream_count)); + + // Read the entire array in one fell swoop, instead of reading one entry + // at a time in the loop. + if (!ReadBytes(&(*directory)[0], + sizeof(MDRawDirectory) * header_.stream_count)) { + BPLOG(ERROR) << "Minidump cannot read stream directory"; + return false; + } + + for (unsigned int stream_index = 0; + stream_index < header_.stream_count; + ++stream_index) { + MDRawDirectory* directory_entry = &(*directory)[stream_index]; + + if (swap_) { + Swap(&directory_entry->stream_type); + Swap(&directory_entry->location); + } + + // Initialize the stream_map_ map, which speeds locating a stream by + // type. + unsigned int stream_type = directory_entry->stream_type; + switch (stream_type) { + case MD_THREAD_LIST_STREAM: + case MD_THREAD_NAME_LIST_STREAM: + case MD_MODULE_LIST_STREAM: + case MD_MEMORY_LIST_STREAM: + case MD_EXCEPTION_STREAM: + case MD_SYSTEM_INFO_STREAM: + case MD_MISC_INFO_STREAM: + case MD_BREAKPAD_INFO_STREAM: + case MD_CRASHPAD_INFO_STREAM: { + if (stream_map_->find(stream_type) != stream_map_->end()) { + // Another stream with this type was already found. A minidump + // file should contain at most one of each of these stream types. + BPLOG(ERROR) << "Minidump found multiple streams of type " << + stream_type << ", but can only deal with one"; + return false; + } + BP_FALLTHROUGH; + } + + default: { + // Overwrites for stream types other than those above, but it's + // expected to be the user's burden in that case. + (*stream_map_)[stream_type].stream_index = stream_index; + } + } + } + + directory_ = directory.release(); + } + + valid_ = true; + return true; +} + + +MinidumpThreadList* Minidump::GetThreadList() { + MinidumpThreadList* thread_list; + return GetStream(&thread_list); +} + +MinidumpThreadNameList* Minidump::GetThreadNameList() { + MinidumpThreadNameList* thread_name_list; + return GetStream(&thread_name_list); +} + +MinidumpModuleList* Minidump::GetModuleList() { + MinidumpModuleList* module_list; + return GetStream(&module_list); +} + + +MinidumpMemoryList* Minidump::GetMemoryList() { + MinidumpMemoryList* memory_list; + return GetStream(&memory_list); +} + + +MinidumpException* Minidump::GetException() { + MinidumpException* exception; + return GetStream(&exception); +} + +MinidumpAssertion* Minidump::GetAssertion() { + MinidumpAssertion* assertion; + return GetStream(&assertion); +} + + +MinidumpSystemInfo* Minidump::GetSystemInfo() { + MinidumpSystemInfo* system_info; + return GetStream(&system_info); +} + + +MinidumpUnloadedModuleList* Minidump::GetUnloadedModuleList() { + MinidumpUnloadedModuleList* unloaded_module_list; + return GetStream(&unloaded_module_list); +} + + +MinidumpMiscInfo* Minidump::GetMiscInfo() { + MinidumpMiscInfo* misc_info; + return GetStream(&misc_info); +} + + +MinidumpBreakpadInfo* Minidump::GetBreakpadInfo() { + MinidumpBreakpadInfo* breakpad_info; + return GetStream(&breakpad_info); +} + +MinidumpMemoryInfoList* Minidump::GetMemoryInfoList() { + MinidumpMemoryInfoList* memory_info_list; + return GetStream(&memory_info_list); +} + +MinidumpLinuxMapsList* Minidump::GetLinuxMapsList() { + MinidumpLinuxMapsList* linux_maps_list; + return GetStream(&linux_maps_list); +} + +bool Minidump::IsAndroid() { + MDOSPlatform platform; + return GetPlatform(&platform) && platform == MD_OS_ANDROID; +} + +bool Minidump::GetPlatform(MDOSPlatform* platform) { + // Save the current stream position + off_t saved_position = Tell(); + if (saved_position == -1) { + return false; + } + const MDRawSystemInfo* system_info = + GetSystemInfo() ? GetSystemInfo()->system_info() : NULL; + + // Restore position and return + if (!SeekSet(saved_position)) { + BPLOG(ERROR) << "Couldn't seek back to saved position"; + return false; + } + + if (!system_info) { + return false; + } + *platform = static_cast(system_info->platform_id); + return true; +} + +MinidumpCrashpadInfo* Minidump::GetCrashpadInfo() { + MinidumpCrashpadInfo* crashpad_info; + return GetStream(&crashpad_info); +} + +static const char* get_stream_name(uint32_t stream_type) { + switch (stream_type) { + case MD_UNUSED_STREAM: + return "MD_UNUSED_STREAM"; + case MD_RESERVED_STREAM_0: + return "MD_RESERVED_STREAM_0"; + case MD_RESERVED_STREAM_1: + return "MD_RESERVED_STREAM_1"; + case MD_THREAD_LIST_STREAM: + return "MD_THREAD_LIST_STREAM"; + case MD_THREAD_NAME_LIST_STREAM: + return "MD_THREAD_NAME_LIST_STREAM"; + case MD_MODULE_LIST_STREAM: + return "MD_MODULE_LIST_STREAM"; + case MD_MEMORY_LIST_STREAM: + return "MD_MEMORY_LIST_STREAM"; + case MD_EXCEPTION_STREAM: + return "MD_EXCEPTION_STREAM"; + case MD_SYSTEM_INFO_STREAM: + return "MD_SYSTEM_INFO_STREAM"; + case MD_THREAD_EX_LIST_STREAM: + return "MD_THREAD_EX_LIST_STREAM"; + case MD_MEMORY_64_LIST_STREAM: + return "MD_MEMORY_64_LIST_STREAM"; + case MD_COMMENT_STREAM_A: + return "MD_COMMENT_STREAM_A"; + case MD_COMMENT_STREAM_W: + return "MD_COMMENT_STREAM_W"; + case MD_HANDLE_DATA_STREAM: + return "MD_HANDLE_DATA_STREAM"; + case MD_FUNCTION_TABLE_STREAM: + return "MD_FUNCTION_TABLE_STREAM"; + case MD_UNLOADED_MODULE_LIST_STREAM: + return "MD_UNLOADED_MODULE_LIST_STREAM"; + case MD_MISC_INFO_STREAM: + return "MD_MISC_INFO_STREAM"; + case MD_MEMORY_INFO_LIST_STREAM: + return "MD_MEMORY_INFO_LIST_STREAM"; + case MD_THREAD_INFO_LIST_STREAM: + return "MD_THREAD_INFO_LIST_STREAM"; + case MD_HANDLE_OPERATION_LIST_STREAM: + return "MD_HANDLE_OPERATION_LIST_STREAM"; + case MD_TOKEN_STREAM: + return "MD_TOKEN_STREAM"; + case MD_JAVASCRIPT_DATA_STREAM: + return "MD_JAVASCRIPT_DATA_STREAM"; + case MD_SYSTEM_MEMORY_INFO_STREAM: + return "MD_SYSTEM_MEMORY_INFO_STREAM"; + case MD_PROCESS_VM_COUNTERS_STREAM: + return "MD_PROCESS_VM_COUNTERS_STREAM"; + case MD_LAST_RESERVED_STREAM: + return "MD_LAST_RESERVED_STREAM"; + case MD_BREAKPAD_INFO_STREAM: + return "MD_BREAKPAD_INFO_STREAM"; + case MD_ASSERTION_INFO_STREAM: + return "MD_ASSERTION_INFO_STREAM"; + case MD_LINUX_CPU_INFO: + return "MD_LINUX_CPU_INFO"; + case MD_LINUX_PROC_STATUS: + return "MD_LINUX_PROC_STATUS"; + case MD_LINUX_LSB_RELEASE: + return "MD_LINUX_LSB_RELEASE"; + case MD_LINUX_CMD_LINE: + return "MD_LINUX_CMD_LINE"; + case MD_LINUX_ENVIRON: + return "MD_LINUX_ENVIRON"; + case MD_LINUX_AUXV: + return "MD_LINUX_AUXV"; + case MD_LINUX_MAPS: + return "MD_LINUX_MAPS"; + case MD_LINUX_DSO_DEBUG: + return "MD_LINUX_DSO_DEBUG"; + case MD_CRASHPAD_INFO_STREAM: + return "MD_CRASHPAD_INFO_STREAM"; + default: + return "unknown"; + } +} + +void Minidump::Print() { + if (!valid_) { + BPLOG(ERROR) << "Minidump cannot print invalid data"; + return; + } + + printf("MDRawHeader\n"); + printf(" signature = 0x%x\n", header_.signature); + printf(" version = 0x%x\n", header_.version); + printf(" stream_count = %d\n", header_.stream_count); + printf(" stream_directory_rva = 0x%x\n", header_.stream_directory_rva); + printf(" checksum = 0x%x\n", header_.checksum); + printf(" time_date_stamp = 0x%x %s\n", + header_.time_date_stamp, + TimeTToUTCString(header_.time_date_stamp).c_str()); + printf(" flags = 0x%" PRIx64 "\n", header_.flags); + printf("\n"); + + for (unsigned int stream_index = 0; + stream_index < header_.stream_count; + ++stream_index) { + MDRawDirectory* directory_entry = &(*directory_)[stream_index]; + + printf("mDirectory[%d]\n", stream_index); + printf("MDRawDirectory\n"); + printf(" stream_type = 0x%x (%s)\n", directory_entry->stream_type, + get_stream_name(directory_entry->stream_type)); + printf(" location.data_size = %d\n", + directory_entry->location.data_size); + printf(" location.rva = 0x%x\n", directory_entry->location.rva); + printf("\n"); + } + + printf("Streams:\n"); + for (MinidumpStreamMap::const_iterator iterator = stream_map_->begin(); + iterator != stream_map_->end(); + ++iterator) { + uint32_t stream_type = iterator->first; + const MinidumpStreamInfo& info = iterator->second; + printf(" stream type 0x%x (%s) at index %d\n", stream_type, + get_stream_name(stream_type), + info.stream_index); + } + printf("\n"); +} + + +const MDRawDirectory* Minidump::GetDirectoryEntryAtIndex(unsigned int index) + const { + if (!valid_) { + BPLOG(ERROR) << "Invalid Minidump for GetDirectoryEntryAtIndex"; + return NULL; + } + + if (index >= header_.stream_count) { + BPLOG(ERROR) << "Minidump stream directory index out of range: " << + index << "/" << header_.stream_count; + return NULL; + } + + return &(*directory_)[index]; +} + + +bool Minidump::ReadBytes(void* bytes, size_t count) { + // Can't check valid_ because Read needs to call this method before + // validity can be determined. + if (!stream_) { + return false; + } + stream_->read(static_cast(bytes), count); + std::streamsize bytes_read = stream_->gcount(); + if (bytes_read == -1) { + string error_string; + int error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "ReadBytes: error " << error_code << ": " << error_string; + return false; + } + + // Convert to size_t and check for data loss + size_t bytes_read_converted = static_cast(bytes_read); + if (static_cast(bytes_read_converted) != bytes_read) { + BPLOG(ERROR) << "ReadBytes: conversion data loss detected when converting " + << bytes_read << " to " << bytes_read_converted; + return false; + } + + if (bytes_read_converted != count) { + BPLOG(ERROR) << "ReadBytes: read " << bytes_read_converted << "/" << count; + return false; + } + + return true; +} + + +bool Minidump::SeekSet(off_t offset) { + // Can't check valid_ because Read needs to call this method before + // validity can be determined. + if (!stream_) { + return false; + } + stream_->seekg(offset, std::ios_base::beg); + if (!stream_->good()) { + string error_string; + int error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "SeekSet: error " << error_code << ": " << error_string; + return false; + } + return true; +} + +off_t Minidump::Tell() { + if (!valid_ || !stream_) { + return (off_t)-1; + } + + // Check for conversion data loss + std::streamoff std_streamoff = stream_->tellg(); + off_t rv = static_cast(std_streamoff); + if (static_cast(rv) == std_streamoff) { + return rv; + } else { + BPLOG(ERROR) << "Data loss detected"; + return (off_t)-1; + } +} + + +string* Minidump::ReadString(off_t offset) { + if (!valid_) { + BPLOG(ERROR) << "Invalid Minidump for ReadString"; + return NULL; + } + if (!SeekSet(offset)) { + BPLOG(ERROR) << "ReadString could not seek to string at offset " << offset; + return NULL; + } + + uint32_t bytes; + if (!ReadBytes(&bytes, sizeof(bytes))) { + BPLOG(ERROR) << "ReadString could not read string size at offset " << + offset; + return NULL; + } + if (swap_) + Swap(&bytes); + + if (bytes % 2 != 0) { + BPLOG(ERROR) << "ReadString found odd-sized " << bytes << + "-byte string at offset " << offset; + return NULL; + } + unsigned int utf16_words = bytes / 2; + + if (utf16_words > max_string_length_) { + BPLOG(ERROR) << "ReadString string length " << utf16_words << + " exceeds maximum " << max_string_length_ << + " at offset " << offset; + return NULL; + } + + vector string_utf16(utf16_words); + + if (utf16_words) { + if (!ReadBytes(&string_utf16[0], bytes)) { + BPLOG(ERROR) << "ReadString could not read " << bytes << + "-byte string at offset " << offset; + return NULL; + } + } + + return UTF16ToUTF8(string_utf16, swap_); +} + + +bool Minidump::ReadUTF8String(off_t offset, string* string_utf8) { + if (!valid_) { + BPLOG(ERROR) << "Invalid Minidump for ReadString"; + return false; + } + if (!SeekSet(offset)) { + BPLOG(ERROR) << "ReadUTF8String could not seek to string at offset " + << offset; + return false; + } + + uint32_t bytes; + if (!ReadBytes(&bytes, sizeof(bytes))) { + BPLOG(ERROR) << "ReadUTF8String could not read string size at offset " << + offset; + return false; + } + + if (swap_) { + Swap(&bytes); + } + + if (bytes > max_string_length_) { + BPLOG(ERROR) << "ReadUTF8String string length " << bytes << + " exceeds maximum " << max_string_length_ << + " at offset " << offset; + return false; + } + + string_utf8->resize(bytes); + + if (!ReadBytes(&(*string_utf8)[0], bytes)) { + BPLOG(ERROR) << "ReadUTF8String could not read " << bytes << + "-byte string at offset " << offset; + return false; + } + + return true; +} + + +bool Minidump::ReadStringList( + off_t offset, + std::vector* string_list) { + string_list->clear(); + + if (!SeekSet(offset)) { + BPLOG(ERROR) << "Minidump cannot seek to string_list"; + return false; + } + + uint32_t count; + if (!ReadBytes(&count, sizeof(count))) { + BPLOG(ERROR) << "Minidump cannot read string_list count"; + return false; + } + + if (swap_) { + Swap(&count); + } + + scoped_array rvas(new MDRVA[count]); + + // Read the entire array in one fell swoop, instead of reading one entry + // at a time in the loop. + if (!ReadBytes(&rvas[0], sizeof(MDRVA) * count)) { + BPLOG(ERROR) << "Minidump could not read string_list"; + return false; + } + + for (uint32_t index = 0; index < count; ++index) { + if (swap()) { + Swap(&rvas[index]); + } + + string entry; + if (!ReadUTF8String(rvas[index], &entry)) { + BPLOG(ERROR) << "Minidump could not read string_list entry"; + return false; + } + + string_list->push_back(entry); + } + + return true; +} + + +bool Minidump::ReadSimpleStringDictionary( + off_t offset, + std::map* simple_string_dictionary) { + simple_string_dictionary->clear(); + + if (!SeekSet(offset)) { + BPLOG(ERROR) << "Minidump cannot seek to simple_string_dictionary"; + return false; + } + + uint32_t count; + if (!ReadBytes(&count, sizeof(count))) { + BPLOG(ERROR) + << "Minidump cannot read simple_string_dictionary count"; + return false; + } + + if (swap()) { + Swap(&count); + } + + scoped_array entries( + new MDRawSimpleStringDictionaryEntry[count]); + + // Read the entire array in one fell swoop, instead of reading one entry + // at a time in the loop. + if (!ReadBytes( + &entries[0], + sizeof(MDRawSimpleStringDictionaryEntry) * count)) { + BPLOG(ERROR) << "Minidump could not read simple_string_dictionary"; + return false; + } + + for (uint32_t index = 0; index < count; ++index) { + if (swap()) { + Swap(&entries[index]); + } + + string key; + if (!ReadUTF8String(entries[index].key, &key)) { + BPLOG(ERROR) << "Minidump could not read simple_string_dictionary key"; + return false; + } + + string value; + if (!ReadUTF8String(entries[index].value, &value)) { + BPLOG(ERROR) << "Minidump could not read simple_string_dictionary value"; + return false; + } + + if (simple_string_dictionary->find(key) != + simple_string_dictionary->end()) { + BPLOG(ERROR) + << "Minidump: discarding duplicate simple_string_dictionary value " + << value << " for key " << key; + } else { + simple_string_dictionary->insert(std::make_pair(key, value)); + } + } + + return true; +} + +bool Minidump::ReadCrashpadAnnotationsList( + off_t offset, + std::vector* annotations_list) { + annotations_list->clear(); + + if (!SeekSet(offset)) { + BPLOG(ERROR) << "Minidump cannot seek to annotations_list"; + return false; + } + + uint32_t count; + if (!ReadBytes(&count, sizeof(count))) { + BPLOG(ERROR) << "Minidump cannot read annotations_list count"; + return false; + } + + if (swap_) { + Swap(&count); + } + + scoped_array objects( + new MDRawCrashpadAnnotation[count]); + + // Read the entire array in one fell swoop, instead of reading one entry + // at a time in the loop. + if (!ReadBytes(&objects[0], sizeof(MDRawCrashpadAnnotation) * count)) { + BPLOG(ERROR) << "Minidump could not read annotations_list"; + return false; + } + + for (uint32_t index = 0; index < count; ++index) { + MDRawCrashpadAnnotation annotation = objects[index]; + + if (swap_) { + Swap(&annotation); + } + + string name; + if (!ReadUTF8String(annotation.name, &name)) { + BPLOG(ERROR) << "Minidump could not read annotation name"; + return false; + } + + if (!SeekSet(annotation.value)) { + BPLOG(ERROR) << "Minidump cannot seek to annotations value"; + return false; + } + + uint32_t value_length; + if (!ReadBytes(&value_length, sizeof(value_length))) { + BPLOG(ERROR) << "Minidump could not read annotation value length"; + return false; + } + + std::vector value_data(value_length); + if (!ReadBytes(value_data.data(), value_length)) { + BPLOG(ERROR) << "Minidump could not read annotation value"; + return false; + } + + MinidumpCrashpadInfo::AnnotationObject object = {annotation.type, name, + value_data}; + annotations_list->push_back(object); + } + + return true; +} + +bool Minidump::SeekToStreamType(uint32_t stream_type, + uint32_t* stream_length) { + BPLOG_IF(ERROR, !stream_length) << "Minidump::SeekToStreamType requires " + "|stream_length|"; + assert(stream_length); + *stream_length = 0; + + if (!valid_) { + BPLOG(ERROR) << "Invalid Mindump for SeekToStreamType"; + return false; + } + + MinidumpStreamMap::const_iterator iterator = stream_map_->find(stream_type); + if (iterator == stream_map_->end()) { + // This stream type didn't exist in the directory. + BPLOG(INFO) << "SeekToStreamType: type " << stream_type << " not present"; + return false; + } + + const MinidumpStreamInfo& info = iterator->second; + if (info.stream_index >= header_.stream_count) { + BPLOG(ERROR) << "SeekToStreamType: type " << stream_type << + " out of range: " << + info.stream_index << "/" << header_.stream_count; + return false; + } + + MDRawDirectory* directory_entry = &(*directory_)[info.stream_index]; + if (!SeekSet(directory_entry->location.rva)) { + BPLOG(ERROR) << "SeekToStreamType could not seek to stream type " << + stream_type; + return false; + } + + *stream_length = directory_entry->location.data_size; + + return true; +} + + +template +T* Minidump::GetStream(T** stream) { + // stream is a garbage parameter that's present only to account for C++'s + // inability to overload a method based solely on its return type. + + const uint32_t stream_type = T::kStreamType; + + BPLOG_IF(ERROR, !stream) << "Minidump::GetStream type " << stream_type << + " requires |stream|"; + assert(stream); + *stream = NULL; + + if (!valid_) { + BPLOG(ERROR) << "Invalid Minidump for GetStream type " << stream_type; + return NULL; + } + + MinidumpStreamMap::iterator iterator = stream_map_->find(stream_type); + if (iterator == stream_map_->end()) { + // This stream type didn't exist in the directory. + BPLOG(INFO) << "GetStream: type " << stream_type << " not present"; + return NULL; + } + + // Get a pointer so that the stored stream field can be altered. + MinidumpStreamInfo* info = &iterator->second; + + if (info->stream) { + // This cast is safe because info.stream is only populated by this + // method, and there is a direct correlation between T and stream_type. + *stream = static_cast(info->stream); + return *stream; + } + + uint32_t stream_length; + if (!SeekToStreamType(stream_type, &stream_length)) { + BPLOG(ERROR) << "GetStream could not seek to stream type " << stream_type; + return NULL; + } + + scoped_ptr new_stream(new T(this)); + + if (!new_stream->Read(stream_length)) { + BPLOG(ERROR) << "GetStream could not read stream type " << stream_type; + return NULL; + } + + *stream = new_stream.release(); + info->stream = *stream; + return *stream; +} + +} // namespace google_breakpad diff --git a/src/processor/minidump_dump.cc b/src/processor/minidump_dump.cc new file mode 100644 index 0000000..d3c33ad --- /dev/null +++ b/src/processor/minidump_dump.cc @@ -0,0 +1,285 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_dump.cc: Print the contents of a minidump file in somewhat +// readable text. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "common/path_helper.h" +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/minidump.h" +#include "processor/logging.h" + +namespace { + +using google_breakpad::Minidump; +using google_breakpad::MinidumpThreadList; +using google_breakpad::MinidumpThreadNameList; +using google_breakpad::MinidumpModuleList; +using google_breakpad::MinidumpMemoryInfoList; +using google_breakpad::MinidumpMemoryList; +using google_breakpad::MinidumpException; +using google_breakpad::MinidumpAssertion; +using google_breakpad::MinidumpSystemInfo; +using google_breakpad::MinidumpMiscInfo; +using google_breakpad::MinidumpBreakpadInfo; +using google_breakpad::MinidumpCrashpadInfo; + +struct Options { + Options() + : minidumpPath(), hexdump(false), hexdump_width(16) {} + + string minidumpPath; + bool hexdump; + unsigned int hexdump_width; +}; + +static void DumpRawStream(Minidump *minidump, + uint32_t stream_type, + const char *stream_name, + int *errors) { + uint32_t length = 0; + if (!minidump->SeekToStreamType(stream_type, &length)) { + return; + } + + printf("Stream %s:\n", stream_name); + + if (length == 0) { + printf("\n"); + return; + } + std::vector contents(length); + if (!minidump->ReadBytes(&contents[0], length)) { + ++*errors; + BPLOG(ERROR) << "minidump.ReadBytes failed"; + return; + } + size_t current_offset = 0; + while (current_offset < length) { + size_t remaining = length - current_offset; + // Printf requires an int and direct casting from size_t results + // in compatibility warnings. + uint32_t int_remaining = remaining; + printf("%.*s", int_remaining, &contents[current_offset]); + char *next_null = reinterpret_cast( + memchr(&contents[current_offset], 0, remaining)); + if (next_null == NULL) + break; + printf("\\0\n"); + size_t null_offset = next_null - &contents[0]; + current_offset = null_offset + 1; + } + printf("\n\n"); +} + +static bool PrintMinidumpDump(const Options& options) { + Minidump minidump(options.minidumpPath, + options.hexdump); + if (!minidump.Read()) { + BPLOG(ERROR) << "minidump.Read() failed"; + return false; + } + minidump.Print(); + + int errors = 0; + + MinidumpThreadList *thread_list = minidump.GetThreadList(); + if (!thread_list) { + ++errors; + BPLOG(ERROR) << "minidump.GetThreadList() failed"; + } else { + thread_list->Print(); + } + + MinidumpThreadNameList *thread_name_list = minidump.GetThreadNameList(); + if (thread_name_list) { + thread_name_list->Print(); + } + + // It's useful to be able to see the full list of modules here even if it + // would cause minidump_stackwalk to fail. + MinidumpModuleList::set_max_modules(UINT32_MAX); + MinidumpModuleList *module_list = minidump.GetModuleList(); + if (!module_list) { + ++errors; + BPLOG(ERROR) << "minidump.GetModuleList() failed"; + } else { + module_list->Print(); + } + + MinidumpMemoryList *memory_list = minidump.GetMemoryList(); + if (!memory_list) { + ++errors; + BPLOG(ERROR) << "minidump.GetMemoryList() failed"; + } else { + memory_list->Print(); + } + + MinidumpException *exception = minidump.GetException(); + if (!exception) { + BPLOG(INFO) << "minidump.GetException() failed"; + } else { + exception->Print(); + } + + MinidumpAssertion *assertion = minidump.GetAssertion(); + if (!assertion) { + BPLOG(INFO) << "minidump.GetAssertion() failed"; + } else { + assertion->Print(); + } + + MinidumpSystemInfo *system_info = minidump.GetSystemInfo(); + if (!system_info) { + ++errors; + BPLOG(ERROR) << "minidump.GetSystemInfo() failed"; + } else { + system_info->Print(); + } + + MinidumpMiscInfo *misc_info = minidump.GetMiscInfo(); + if (!misc_info) { + ++errors; + BPLOG(ERROR) << "minidump.GetMiscInfo() failed"; + } else { + misc_info->Print(); + } + + MinidumpBreakpadInfo *breakpad_info = minidump.GetBreakpadInfo(); + if (!breakpad_info) { + // Breakpad info is optional, so don't treat this as an error. + BPLOG(INFO) << "minidump.GetBreakpadInfo() failed"; + } else { + breakpad_info->Print(); + } + + MinidumpMemoryInfoList *memory_info_list = minidump.GetMemoryInfoList(); + if (!memory_info_list) { + ++errors; + BPLOG(ERROR) << "minidump.GetMemoryInfoList() failed"; + } else { + memory_info_list->Print(); + } + + MinidumpCrashpadInfo *crashpad_info = minidump.GetCrashpadInfo(); + if (crashpad_info) { + // Crashpad info is optional, so don't treat absence as an error. + crashpad_info->Print(); + } + + DumpRawStream(&minidump, + MD_LINUX_CMD_LINE, + "MD_LINUX_CMD_LINE", + &errors); + DumpRawStream(&minidump, + MD_LINUX_ENVIRON, + "MD_LINUX_ENVIRON", + &errors); + DumpRawStream(&minidump, + MD_LINUX_LSB_RELEASE, + "MD_LINUX_LSB_RELEASE", + &errors); + DumpRawStream(&minidump, + MD_LINUX_PROC_STATUS, + "MD_LINUX_PROC_STATUS", + &errors); + DumpRawStream(&minidump, + MD_LINUX_CPU_INFO, + "MD_LINUX_CPU_INFO", + &errors); + DumpRawStream(&minidump, + MD_LINUX_MAPS, + "MD_LINUX_MAPS", + &errors); + + return errors == 0; +} + +//============================================================================= +static void +Usage(int argc, char *argv[], bool error) { + FILE *fp = error ? stderr : stdout; + + fprintf(fp, + "Usage: %s [options...] \n" + "Dump data in a minidump.\n" + "\n" + "Options:\n" + " should be a minidump.\n" + " -x:\t Display memory in a hexdump like format\n" + " -h:\t Usage\n", + google_breakpad::BaseName(argv[0]).c_str()); +} + +//============================================================================= +static void +SetupOptions(int argc, char *argv[], Options *options) { + int ch; + + while ((ch = getopt(argc, (char * const*)argv, "xh")) != -1) { + switch (ch) { + case 'x': + options->hexdump = true; + break; + case 'h': + Usage(argc, argv, false); + exit(0); + + default: + Usage(argc, argv, true); + exit(1); + break; + } + } + + if ((argc - optind) != 1) { + fprintf(stderr, "%s: Missing minidump file\n", argv[0]); + exit(1); + } + + options->minidumpPath = argv[optind]; +} + +} // namespace + +int main(int argc, char *argv[]) { + Options options; + BPLOG_INIT(&argc, &argv); + SetupOptions(argc, argv, &options); + return PrintMinidumpDump(options) ? 0 : 1; +} diff --git a/src/processor/minidump_dump_test b/src/processor/minidump_dump_test new file mode 100644 index 0000000..32ae38c --- /dev/null +++ b/src/processor/minidump_dump_test @@ -0,0 +1,35 @@ +#!/bin/sh + +# Copyright 2006 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +testdata_dir=$srcdir/src/processor/testdata +./src/processor/minidump_dump $testdata_dir/minidump2.dmp | \ + tr -d '\015' | \ + diff -u $testdata_dir/minidump2.dump.out - +exit $? diff --git a/src/processor/minidump_processor.cc b/src/processor/minidump_processor.cc new file mode 100644 index 0000000..5d2dea6 --- /dev/null +++ b/src/processor/minidump_processor.cc @@ -0,0 +1,2178 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/minidump_processor.h" + +#include + +#include +#include +#include +#include +#include + +#include "common/scoped_ptr.h" +#include "common/stdio_wrapper.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/exploitability.h" +#include "google_breakpad/processor/stack_frame_symbolizer.h" +#include "processor/logging.h" +#include "processor/stackwalker_x86.h" +#include "processor/symbolic_constants_win.h" + +#ifdef __linux__ +#include "processor/disassembler_objdump.h" +#endif + +namespace google_breakpad { + +MinidumpProcessor::MinidumpProcessor(SymbolSupplier* supplier, + SourceLineResolverInterface* resolver) + : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)), + own_frame_symbolizer_(true), + enable_exploitability_(false), + enable_objdump_(false), + enable_objdump_for_exploitability_(false) { +} + +MinidumpProcessor::MinidumpProcessor(SymbolSupplier* supplier, + SourceLineResolverInterface* resolver, + bool enable_exploitability) + : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)), + own_frame_symbolizer_(true), + enable_exploitability_(enable_exploitability), + enable_objdump_(false), + enable_objdump_for_exploitability_(false) { +} + +MinidumpProcessor::MinidumpProcessor(StackFrameSymbolizer* frame_symbolizer, + bool enable_exploitability) + : frame_symbolizer_(frame_symbolizer), + own_frame_symbolizer_(false), + enable_exploitability_(enable_exploitability), + enable_objdump_(false), + enable_objdump_for_exploitability_(false) { + assert(frame_symbolizer_); +} + +MinidumpProcessor::~MinidumpProcessor() { + if (own_frame_symbolizer_) delete frame_symbolizer_; +} + +ProcessResult MinidumpProcessor::Process( + Minidump* dump, ProcessState* process_state) { + assert(dump); + assert(process_state); + + process_state->Clear(); + + const MDRawHeader* header = dump->header(); + if (!header) { + BPLOG(ERROR) << "Minidump " << dump->path() << " has no header"; + return PROCESS_ERROR_NO_MINIDUMP_HEADER; + } + process_state->time_date_stamp_ = header->time_date_stamp; + + bool has_process_create_time = + GetProcessCreateTime(dump, &process_state->process_create_time_); + + bool has_cpu_info = GetCPUInfo(dump, &process_state->system_info_); + bool has_os_info = GetOSInfo(dump, &process_state->system_info_); + + uint32_t dump_thread_id = 0; + bool has_dump_thread = false; + uint32_t requesting_thread_id = 0; + bool has_requesting_thread = false; + + MinidumpBreakpadInfo* breakpad_info = dump->GetBreakpadInfo(); + if (breakpad_info) { + has_dump_thread = breakpad_info->GetDumpThreadID(&dump_thread_id); + has_requesting_thread = + breakpad_info->GetRequestingThreadID(&requesting_thread_id); + } + + MinidumpException* exception = dump->GetException(); + if (exception) { + process_state->crashed_ = true; + has_requesting_thread = exception->GetThreadID(&requesting_thread_id); + + process_state->crash_reason_ = GetCrashReason( + dump, &process_state->crash_address_, enable_objdump_); + + process_state->exception_record_.set_code( + exception->exception()->exception_record.exception_code, + // TODO(ivanpe): Populate description. + /* description = */ ""); + process_state->exception_record_.set_flags( + exception->exception()->exception_record.exception_flags, + // TODO(ivanpe): Populate description. + /* description = */ ""); + process_state->exception_record_.set_nested_exception_record_address( + exception->exception()->exception_record.exception_record); + process_state->exception_record_.set_address(process_state->crash_address_); + const uint32_t num_parameters = + std::min(exception->exception()->exception_record.number_parameters, + MD_EXCEPTION_MAXIMUM_PARAMETERS); + for (uint32_t i = 0; i < num_parameters; ++i) { + process_state->exception_record_.add_parameter( + exception->exception()->exception_record.exception_information[i], + // TODO(ivanpe): Populate description. + /* description = */ ""); + } + } + + // This will just return an empty string if it doesn't exist. + process_state->assertion_ = GetAssertion(dump); + + MinidumpModuleList* module_list = dump->GetModuleList(); + + // Put a copy of the module list into ProcessState object. This is not + // necessarily a MinidumpModuleList, but it adheres to the CodeModules + // interface, which is all that ProcessState needs to expose. + if (module_list) { + process_state->modules_ = module_list->Copy(); + process_state->shrunk_range_modules_ = + process_state->modules_->GetShrunkRangeModules(); + for (unsigned int i = 0; + i < process_state->shrunk_range_modules_.size(); + i++) { + linked_ptr module = + process_state->shrunk_range_modules_[i]; + BPLOG(INFO) << "The range for module " << module->code_file() + << " was shrunk down by " << HexString( + module->shrink_down_delta()) << " bytes. "; + } + } + + MinidumpUnloadedModuleList* unloaded_module_list = + dump->GetUnloadedModuleList(); + if (unloaded_module_list) { + process_state->unloaded_modules_ = unloaded_module_list->Copy(); + } + + MinidumpMemoryList* memory_list = dump->GetMemoryList(); + if (memory_list) { + BPLOG(INFO) << "Found " << memory_list->region_count() + << " memory regions."; + } + + MinidumpThreadList* threads = dump->GetThreadList(); + if (!threads) { + BPLOG(ERROR) << "Minidump " << dump->path() << " has no thread list"; + return PROCESS_ERROR_NO_THREAD_LIST; + } + + BPLOG(INFO) << "Minidump " << dump->path() << " has " << + (has_cpu_info ? "" : "no ") << "CPU info, " << + (has_os_info ? "" : "no ") << "OS info, " << + (breakpad_info != NULL ? "" : "no ") << "Breakpad info, " << + (exception != NULL ? "" : "no ") << "exception, " << + (module_list != NULL ? "" : "no ") << "module list, " << + (threads != NULL ? "" : "no ") << "thread list, " << + (has_dump_thread ? "" : "no ") << "dump thread, " << + (has_requesting_thread ? "" : "no ") << "requesting thread, and " << + (has_process_create_time ? "" : "no ") << "process create time"; + + bool interrupted = false; + bool found_requesting_thread = false; + unsigned int thread_count = threads->thread_count(); + + // Reset frame_symbolizer_ at the beginning of stackwalk for each minidump. + frame_symbolizer_->Reset(); + + + MinidumpThreadNameList* thread_names = dump->GetThreadNameList(); + std::map thread_id_to_name; + if (thread_names) { + const unsigned int thread_name_count = thread_names->thread_name_count(); + for (unsigned int thread_name_index = 0; + thread_name_index < thread_name_count; + ++thread_name_index) { + MinidumpThreadName* thread_name = thread_names->GetThreadNameAtIndex(thread_name_index); + if (!thread_name) { + BPLOG(ERROR) << "Could not get thread name for thread at index " << thread_name_index; + return PROCESS_ERROR_GETTING_THREAD_NAME; + } + uint32_t thread_id; + if (!thread_name->GetThreadID(&thread_id)) { + BPLOG(ERROR) << "Could not get thread ID for thread at index " << thread_name_index; + return PROCESS_ERROR_GETTING_THREAD_NAME; + } + thread_id_to_name.insert(std::make_pair(thread_id, thread_name->GetThreadName())); + } + } + + for (unsigned int thread_index = 0; + thread_index < thread_count; + ++thread_index) { + char thread_string_buffer[64]; + snprintf(thread_string_buffer, sizeof(thread_string_buffer), "%d/%d", + thread_index, thread_count); + string thread_string = dump->path() + ":" + thread_string_buffer; + + MinidumpThread* thread = threads->GetThreadAtIndex(thread_index); + if (!thread) { + BPLOG(ERROR) << "Could not get thread for " << thread_string; + return PROCESS_ERROR_GETTING_THREAD; + } + + uint32_t thread_id; + if (!thread->GetThreadID(&thread_id)) { + BPLOG(ERROR) << "Could not get thread ID for " << thread_string; + return PROCESS_ERROR_GETTING_THREAD_ID; + } + + thread_string += " id " + HexString(thread_id); + auto thread_name_iter = thread_id_to_name.find(thread_id); + string thread_name; + if (thread_name_iter != thread_id_to_name.end()) { + thread_name = thread_name_iter->second; + } + if (!thread_name.empty()) { + thread_string += " name [" + thread_name + "]"; + } + BPLOG(INFO) << "Looking at thread " << thread_string; + + // If this thread is the thread that produced the minidump, don't process + // it. Because of the problems associated with a thread producing a + // dump of itself (when both its context and its stack are in flux), + // processing that stack wouldn't provide much useful data. + if (has_dump_thread && thread_id == dump_thread_id) { + continue; + } + + MinidumpContext* context = thread->GetContext(); + + if (has_requesting_thread && thread_id == requesting_thread_id) { + if (found_requesting_thread) { + // There can't be more than one requesting thread. + BPLOG(ERROR) << "Duplicate requesting thread: " << thread_string; + return PROCESS_ERROR_DUPLICATE_REQUESTING_THREADS; + } + + // Use processed_state->threads_.size() instead of thread_index. + // thread_index points to the thread index in the minidump, which + // might be greater than the thread index in the threads vector if + // any of the minidump's threads are skipped and not placed into the + // processed threads vector. The thread vector's current size will + // be the index of the current thread when it's pushed into the + // vector. + process_state->requesting_thread_ = process_state->threads_.size(); + + found_requesting_thread = true; + + if (process_state->crashed_) { + // Use the exception record's context for the crashed thread, instead + // of the thread's own context. For the crashed thread, the thread's + // own context is the state inside the exception handler. Using it + // would not result in the expected stack trace from the time of the + // crash. If the exception context is invalid, however, we fall back + // on the thread context. + MinidumpContext* ctx = exception->GetContext(); + context = ctx ? ctx : thread->GetContext(); + } + } + + // If the memory region for the stack cannot be read using the RVA stored + // in the memory descriptor inside MINIDUMP_THREAD, try to locate and use + // a memory region (containing the stack) from the minidump memory list. + MinidumpMemoryRegion* thread_memory = thread->GetMemory(); + if (!thread_memory && memory_list) { + uint64_t start_stack_memory_range = thread->GetStartOfStackMemoryRange(); + if (start_stack_memory_range) { + thread_memory = memory_list->GetMemoryRegionForAddress( + start_stack_memory_range); + } + } + if (!thread_memory) { + BPLOG(ERROR) << "No memory region for " << thread_string; + } + + // Use process_state->modules_ instead of module_list, because the + // |modules| argument will be used to populate the |module| fields in + // the returned StackFrame objects, which will be placed into the + // returned ProcessState object. module_list's lifetime is only as + // long as the Minidump object: it will be deleted when this function + // returns. process_state->modules_ is owned by the ProcessState object + // (just like the StackFrame objects), and is much more suitable for this + // task. + scoped_ptr stackwalker( + Stackwalker::StackwalkerForCPU(process_state->system_info(), + context, + thread_memory, + process_state->modules_, + process_state->unloaded_modules_, + frame_symbolizer_)); + + scoped_ptr stack(new CallStack()); + if (stackwalker.get()) { + if (!stackwalker->Walk(stack.get(), + &process_state->modules_without_symbols_, + &process_state->modules_with_corrupt_symbols_)) { + BPLOG(INFO) << "Stackwalker interrupt (missing symbols?) at " + << thread_string; + interrupted = true; + } + } else { + // Threads with missing CPU contexts will hit this, but + // don't abort processing the rest of the dump just for + // one bad thread. + BPLOG(ERROR) << "No stackwalker for " << thread_string; + } + stack->set_tid(thread_id); + process_state->threads_.push_back(stack.release()); + process_state->thread_memory_regions_.push_back(thread_memory); + process_state->thread_names_.push_back(thread_name); + } + + if (interrupted) { + BPLOG(INFO) << "Processing interrupted for " << dump->path(); + return PROCESS_SYMBOL_SUPPLIER_INTERRUPTED; + } + + // If a requesting thread was indicated, it must be present. + if (has_requesting_thread && !found_requesting_thread) { + // Don't mark as an error, but invalidate the requesting thread + BPLOG(ERROR) << "Minidump indicated requesting thread " << + HexString(requesting_thread_id) << ", not found in " << + dump->path(); + process_state->requesting_thread_ = -1; + } + + // Exploitability defaults to EXPLOITABILITY_NOT_ANALYZED + process_state->exploitability_ = EXPLOITABILITY_NOT_ANALYZED; + + // If an exploitability run was requested we perform the platform specific + // rating. + if (enable_exploitability_) { + scoped_ptr exploitability( + Exploitability::ExploitabilityForPlatform( + dump, process_state, enable_objdump_for_exploitability_)); + // The engine will be null if the platform is not supported + if (exploitability != NULL) { + process_state->exploitability_ = exploitability->CheckExploitability(); + } else { + process_state->exploitability_ = EXPLOITABILITY_ERR_NOENGINE; + } + } + + BPLOG(INFO) << "Processed " << dump->path(); + return PROCESS_OK; +} + +ProcessResult MinidumpProcessor::Process( + const string& minidump_file, ProcessState* process_state) { + BPLOG(INFO) << "Processing minidump in file " << minidump_file; + + Minidump dump(minidump_file); + if (!dump.Read()) { + BPLOG(ERROR) << "Minidump " << dump.path() << " could not be read"; + return PROCESS_ERROR_MINIDUMP_NOT_FOUND; + } + + return Process(&dump, process_state); +} + +// Returns the MDRawSystemInfo from a minidump, or NULL if system info is +// not available from the minidump. If system_info is non-NULL, it is used +// to pass back the MinidumpSystemInfo object. +static const MDRawSystemInfo* GetSystemInfo(Minidump* dump, + MinidumpSystemInfo** system_info) { + MinidumpSystemInfo* minidump_system_info = dump->GetSystemInfo(); + if (!minidump_system_info) + return NULL; + + if (system_info) + *system_info = minidump_system_info; + + return minidump_system_info->system_info(); +} + +static uint64_t GetAddressForArchitecture(const MDCPUArchitecture architecture, + size_t raw_address) +{ + switch (architecture) { + case MD_CPU_ARCHITECTURE_X86: + case MD_CPU_ARCHITECTURE_MIPS: + case MD_CPU_ARCHITECTURE_PPC: + case MD_CPU_ARCHITECTURE_SHX: + case MD_CPU_ARCHITECTURE_ARM: + case MD_CPU_ARCHITECTURE_X86_WIN64: + // 32-bit architectures, mask the upper bits. + return raw_address & 0xffffffffULL; + + default: + // All other architectures either have 64-bit pointers or it's impossible + // to tell from the minidump (e.g. MSIL or SPARC) so use 64-bits anyway. + return raw_address; + } +} + +// Extract CPU info string from ARM-specific MDRawSystemInfo structure. +// raw_info: pointer to source MDRawSystemInfo. +// cpu_info: address of target string, cpu info text will be appended to it. +static void GetARMCpuInfo(const MDRawSystemInfo* raw_info, + string* cpu_info) { + assert(raw_info != NULL && cpu_info != NULL); + + // Write ARM architecture version. + char cpu_string[32]; + snprintf(cpu_string, sizeof(cpu_string), "ARMv%d", + raw_info->processor_level); + cpu_info->append(cpu_string); + + // There is no good list of implementer id values, but the following + // pages provide some help: + // http://comments.gmane.org/gmane.linux.linaro.devel/6903 + // http://forum.xda-developers.com/archive/index.php/t-480226.html + const struct { + uint32_t id; + const char* name; + } vendors[] = { + { 0x41, "ARM" }, + { 0x51, "Qualcomm" }, + { 0x56, "Marvell" }, + { 0x69, "Intel/Marvell" }, + }; + const struct { + uint32_t id; + const char* name; + } parts[] = { + { 0x4100c050, "Cortex-A5" }, + { 0x4100c080, "Cortex-A8" }, + { 0x4100c090, "Cortex-A9" }, + { 0x4100c0f0, "Cortex-A15" }, + { 0x4100c140, "Cortex-R4" }, + { 0x4100c150, "Cortex-R5" }, + { 0x4100b360, "ARM1136" }, + { 0x4100b560, "ARM1156" }, + { 0x4100b760, "ARM1176" }, + { 0x4100b020, "ARM11-MPCore" }, + { 0x41009260, "ARM926" }, + { 0x41009460, "ARM946" }, + { 0x41009660, "ARM966" }, + { 0x510006f0, "Krait" }, + { 0x510000f0, "Scorpion" }, + }; + + const struct { + uint32_t hwcap; + const char* name; + } features[] = { + { MD_CPU_ARM_ELF_HWCAP_SWP, "swp" }, + { MD_CPU_ARM_ELF_HWCAP_HALF, "half" }, + { MD_CPU_ARM_ELF_HWCAP_THUMB, "thumb" }, + { MD_CPU_ARM_ELF_HWCAP_26BIT, "26bit" }, + { MD_CPU_ARM_ELF_HWCAP_FAST_MULT, "fastmult" }, + { MD_CPU_ARM_ELF_HWCAP_FPA, "fpa" }, + { MD_CPU_ARM_ELF_HWCAP_VFP, "vfpv2" }, + { MD_CPU_ARM_ELF_HWCAP_EDSP, "edsp" }, + { MD_CPU_ARM_ELF_HWCAP_JAVA, "java" }, + { MD_CPU_ARM_ELF_HWCAP_IWMMXT, "iwmmxt" }, + { MD_CPU_ARM_ELF_HWCAP_CRUNCH, "crunch" }, + { MD_CPU_ARM_ELF_HWCAP_THUMBEE, "thumbee" }, + { MD_CPU_ARM_ELF_HWCAP_NEON, "neon" }, + { MD_CPU_ARM_ELF_HWCAP_VFPv3, "vfpv3" }, + { MD_CPU_ARM_ELF_HWCAP_VFPv3D16, "vfpv3d16" }, + { MD_CPU_ARM_ELF_HWCAP_TLS, "tls" }, + { MD_CPU_ARM_ELF_HWCAP_VFPv4, "vfpv4" }, + { MD_CPU_ARM_ELF_HWCAP_IDIVA, "idiva" }, + { MD_CPU_ARM_ELF_HWCAP_IDIVT, "idivt" }, + }; + + uint32_t cpuid = raw_info->cpu.arm_cpu_info.cpuid; + if (cpuid != 0) { + // Extract vendor name from CPUID + const char* vendor = NULL; + uint32_t vendor_id = (cpuid >> 24) & 0xff; + for (size_t i = 0; i < sizeof(vendors)/sizeof(vendors[0]); ++i) { + if (vendors[i].id == vendor_id) { + vendor = vendors[i].name; + break; + } + } + cpu_info->append(" "); + if (vendor) { + cpu_info->append(vendor); + } else { + snprintf(cpu_string, sizeof(cpu_string), "vendor(0x%x)", vendor_id); + cpu_info->append(cpu_string); + } + + // Extract part name from CPUID + uint32_t part_id = (cpuid & 0xff00fff0); + const char* part = NULL; + for (size_t i = 0; i < sizeof(parts)/sizeof(parts[0]); ++i) { + if (parts[i].id == part_id) { + part = parts[i].name; + break; + } + } + cpu_info->append(" "); + if (part != NULL) { + cpu_info->append(part); + } else { + snprintf(cpu_string, sizeof(cpu_string), "part(0x%x)", part_id); + cpu_info->append(cpu_string); + } + } + uint32_t elf_hwcaps = raw_info->cpu.arm_cpu_info.elf_hwcaps; + if (elf_hwcaps != 0) { + cpu_info->append(" features: "); + const char* comma = ""; + for (size_t i = 0; i < sizeof(features)/sizeof(features[0]); ++i) { + if (elf_hwcaps & features[i].hwcap) { + cpu_info->append(comma); + cpu_info->append(features[i].name); + comma = ","; + } + } + } +} + +// static +bool MinidumpProcessor::GetCPUInfo(Minidump* dump, SystemInfo* info) { + assert(dump); + assert(info); + + info->cpu.clear(); + info->cpu_info.clear(); + + MinidumpSystemInfo* system_info; + const MDRawSystemInfo* raw_system_info = GetSystemInfo(dump, &system_info); + if (!raw_system_info) + return false; + + switch (raw_system_info->processor_architecture) { + case MD_CPU_ARCHITECTURE_X86: + case MD_CPU_ARCHITECTURE_AMD64: { + if (raw_system_info->processor_architecture == + MD_CPU_ARCHITECTURE_X86) + info->cpu = "x86"; + else + info->cpu = "amd64"; + + const string* cpu_vendor = system_info->GetCPUVendor(); + if (cpu_vendor) { + info->cpu_info = *cpu_vendor; + info->cpu_info.append(" "); + } + + char x86_info[36]; + snprintf(x86_info, sizeof(x86_info), "family %u model %u stepping %u", + raw_system_info->processor_level, + raw_system_info->processor_revision >> 8, + raw_system_info->processor_revision & 0xff); + info->cpu_info.append(x86_info); + break; + } + + case MD_CPU_ARCHITECTURE_PPC: { + info->cpu = "ppc"; + break; + } + + case MD_CPU_ARCHITECTURE_PPC64: { + info->cpu = "ppc64"; + break; + } + + case MD_CPU_ARCHITECTURE_SPARC: { + info->cpu = "sparc"; + break; + } + + case MD_CPU_ARCHITECTURE_ARM: { + info->cpu = "arm"; + GetARMCpuInfo(raw_system_info, &info->cpu_info); + break; + } + + case MD_CPU_ARCHITECTURE_ARM64: + case MD_CPU_ARCHITECTURE_ARM64_OLD: { + info->cpu = "arm64"; + break; + } + + case MD_CPU_ARCHITECTURE_MIPS: { + info->cpu = "mips"; + break; + } + case MD_CPU_ARCHITECTURE_MIPS64: { + info->cpu = "mips64"; + break; + } + + case MD_CPU_ARCHITECTURE_RISCV: { + info->cpu = "riscv"; + break; + } + + case MD_CPU_ARCHITECTURE_RISCV64: { + info->cpu = "riscv64"; + break; + } + + default: { + // Assign the numeric architecture ID into the CPU string. + char cpu_string[7]; + snprintf(cpu_string, sizeof(cpu_string), "0x%04x", + raw_system_info->processor_architecture); + info->cpu = cpu_string; + break; + } + } + + info->cpu_count = raw_system_info->number_of_processors; + + return true; +} + +// static +bool MinidumpProcessor::GetOSInfo(Minidump* dump, SystemInfo* info) { + assert(dump); + assert(info); + + info->os.clear(); + info->os_short.clear(); + info->os_version.clear(); + + MinidumpSystemInfo* system_info; + const MDRawSystemInfo* raw_system_info = GetSystemInfo(dump, &system_info); + if (!raw_system_info) + return false; + + info->os_short = system_info->GetOS(); + + switch (raw_system_info->platform_id) { + case MD_OS_WIN32_NT: { + info->os = "Windows NT"; + break; + } + + case MD_OS_WIN32_WINDOWS: { + info->os = "Windows"; + break; + } + + case MD_OS_MAC_OS_X: { + info->os = "Mac OS X"; + break; + } + + case MD_OS_IOS: { + info->os = "iOS"; + break; + } + + case MD_OS_LINUX: { + info->os = "Linux"; + break; + } + + case MD_OS_SOLARIS: { + info->os = "Solaris"; + break; + } + + case MD_OS_ANDROID: { + info->os = "Android"; + break; + } + + case MD_OS_PS3: { + info->os = "PS3"; + break; + } + + case MD_OS_NACL: { + info->os = "NaCl"; + break; + } + + case MD_OS_FUCHSIA: { + info->os = "Fuchsia"; + break; + } + + default: { + // Assign the numeric platform ID into the OS string. + char os_string[11]; + snprintf(os_string, sizeof(os_string), "0x%08x", + raw_system_info->platform_id); + info->os = os_string; + break; + } + } + + char os_version_string[33]; + snprintf(os_version_string, sizeof(os_version_string), "%u.%u.%u", + raw_system_info->major_version, + raw_system_info->minor_version, + raw_system_info->build_number); + info->os_version = os_version_string; + + const string* csd_version = system_info->GetCSDVersion(); + if (csd_version) { + info->os_version.append(" "); + info->os_version.append(*csd_version); + } + + return true; +} + +// static +bool MinidumpProcessor::GetProcessCreateTime(Minidump* dump, + uint32_t* process_create_time) { + assert(dump); + assert(process_create_time); + + *process_create_time = 0; + + MinidumpMiscInfo* minidump_misc_info = dump->GetMiscInfo(); + if (!minidump_misc_info) { + return false; + } + + const MDRawMiscInfo* md_raw_misc_info = minidump_misc_info->misc_info(); + if (!md_raw_misc_info) { + return false; + } + + if (!(md_raw_misc_info->flags1 & MD_MISCINFO_FLAGS1_PROCESS_TIMES)) { + return false; + } + + *process_create_time = md_raw_misc_info->process_create_time; + return true; +} + +#ifdef __linux__ + +static bool IsCanonicalAddress(uint64_t address) { + uint64_t sign_bit = (address >> 63) & 1; + for (int shift = 48; shift < 63; ++shift) { + if (sign_bit != ((address >> shift) & 1)) { + return false; + } + } + return true; +} + +static void CalculateFaultAddressFromInstruction(Minidump* dump, + uint64_t* address) { + MinidumpException* exception = dump->GetException(); + if (exception == NULL) { + BPLOG(INFO) << "Failed to get exception."; + return; + } + + MinidumpContext* context = exception->GetContext(); + if (context == NULL) { + BPLOG(INFO) << "Failed to get exception context."; + return; + } + + uint64_t instruction_ptr = 0; + if (!context->GetInstructionPointer(&instruction_ptr)) { + BPLOG(INFO) << "Failed to get instruction pointer."; + return; + } + + // Get memory region containing instruction pointer. + MinidumpMemoryList* memory_list = dump->GetMemoryList(); + MinidumpMemoryRegion* memory_region = + memory_list ? + memory_list->GetMemoryRegionForAddress(instruction_ptr) : NULL; + if (!memory_region) { + BPLOG(INFO) << "No memory region around instruction pointer."; + return; + } + + DisassemblerObjdump disassembler(context->GetContextCPU(), memory_region, + instruction_ptr); + fprintf(stderr, "%s %s %s\n", disassembler.operation().c_str(), + disassembler.src().c_str(), disassembler.dest().c_str()); + if (!disassembler.IsValid()) { + BPLOG(INFO) << "Disassembling fault instruction failed."; + return; + } + + // It's possible that we reach here when the faulting address is already + // correct, so we only update it if we find that at least one of the src/dest + // addresses is non-canonical. If both are non-canonical, we arbitrarily set + // it to the larger of the two, as this is more likely to be a known poison + // value. + + bool valid_read, valid_write; + uint64_t read_address, write_address; + + valid_read = disassembler.CalculateSrcAddress(*context, read_address); + valid_read &= !IsCanonicalAddress(read_address); + + valid_write = disassembler.CalculateDestAddress(*context, write_address); + valid_write &= !IsCanonicalAddress(write_address); + + if (valid_read && valid_write) { + *address = read_address > write_address ? read_address : write_address; + } else if (valid_read) { + *address = read_address; + } else if (valid_write) { + *address = write_address; + } +} +#endif // __linux__ + +// static +string MinidumpProcessor::GetCrashReason(Minidump* dump, uint64_t* address, + bool enable_objdump) { + MinidumpException* exception = dump->GetException(); + if (!exception) + return ""; + + const MDRawExceptionStream* raw_exception = exception->exception(); + if (!raw_exception) + return ""; + + if (address) + *address = raw_exception->exception_record.exception_address; + + // The reason value is OS-specific and possibly CPU-specific. Set up + // sensible numeric defaults for the reason string in case we can't + // map the codes to a string (because there's no system info, or because + // it's an unrecognized platform, or because it's an unrecognized code.) + char reason_string[24]; + char flags_string[11]; + uint32_t exception_code = raw_exception->exception_record.exception_code; + uint32_t exception_flags = raw_exception->exception_record.exception_flags; + snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags); + snprintf(reason_string, sizeof(reason_string), "0x%08x / %s", exception_code, + flags_string); + string reason = reason_string; + + const MDRawSystemInfo* raw_system_info = GetSystemInfo(dump, NULL); + if (!raw_system_info) + return reason; + + switch (raw_system_info->platform_id) { + case MD_OS_FUCHSIA: { + switch (exception_code) { + case MD_EXCEPTION_CODE_FUCHSIA_GENERAL: + reason = "GENERAL / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_FATAL_PAGE_FAULT: + reason = "FATAL_PAGE_FAULT / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_UNDEFINED_INSTRUCTION: + reason = "UNDEFINED_INSTRUCTION / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_SW_BREAKPOINT: + reason = "SW_BREAKPOINT / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_HW_BREAKPOINT: + reason = "HW_BREAKPOINT / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_UNALIGNED_ACCESS: + reason = "UNALIGNED_ACCESS / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_THREAD_STARTING: + reason = "THREAD_STARTING / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_THREAD_EXITING: + reason = "THREAD_EXITING / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_POLICY_ERROR: + reason = "POLICY_ERROR / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_CODE_FUCHSIA_PROCESS_STARTING: + reason = "PROCESS_STARTING / "; + reason.append(flags_string); + break; + default: + BPLOG(INFO) << "Unknown exception reason " << reason; + } + break; + } + + case MD_OS_MAC_OS_X: + case MD_OS_IOS: { + switch (exception_code) { + case MD_EXCEPTION_MAC_BAD_ACCESS: + reason = "EXC_BAD_ACCESS / "; + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS: + reason.append("KERN_INVALID_ADDRESS"); + break; + case MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE: + reason.append("KERN_PROTECTION_FAILURE"); + break; + case MD_EXCEPTION_CODE_MAC_NO_ACCESS: + reason.append("KERN_NO_ACCESS"); + break; + case MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE: + reason.append("KERN_MEMORY_FAILURE"); + break; + case MD_EXCEPTION_CODE_MAC_MEMORY_ERROR: + reason.append("KERN_MEMORY_ERROR"); + break; + case MD_EXCEPTION_CODE_MAC_CODESIGN_ERROR: + reason.append("KERN_CODESIGN_ERROR"); + break; + default: + // arm and ppc overlap + if (raw_system_info->processor_architecture == + MD_CPU_ARCHITECTURE_ARM || + raw_system_info->processor_architecture == + MD_CPU_ARCHITECTURE_ARM64_OLD) { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN: + reason.append("EXC_ARM_DA_ALIGN"); + break; + case MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG: + reason.append("EXC_ARM_DA_DEBUG"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + } else if (raw_system_info->processor_architecture == + MD_CPU_ARCHITECTURE_PPC) { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ: + reason.append("EXC_PPC_VM_PROT_READ"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_BADSPACE: + reason.append("EXC_PPC_BADSPACE"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED: + reason.append("EXC_PPC_UNALIGNED"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + } else if (raw_system_info->processor_architecture == + MD_CPU_ARCHITECTURE_X86 || + raw_system_info->processor_architecture == + MD_CPU_ARCHITECTURE_AMD64) { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT: + reason.append("EXC_I386_GPFLT"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + } else { + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + } + break; + } + break; + case MD_EXCEPTION_MAC_BAD_INSTRUCTION: + reason = "EXC_BAD_INSTRUCTION / "; + switch (raw_system_info->processor_architecture) { + case MD_CPU_ARCHITECTURE_ARM: + case MD_CPU_ARCHITECTURE_ARM64_OLD: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_ARM_UNDEFINED: + reason.append("EXC_ARM_UNDEFINED"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + case MD_CPU_ARCHITECTURE_PPC: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL: + reason.append("EXC_PPC_INVALID_SYSCALL"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION: + reason.append("EXC_PPC_UNIPL_INST"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION: + reason.append("EXC_PPC_PRIVINST"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER: + reason.append("EXC_PPC_PRIVREG"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_TRACE: + reason.append("EXC_PPC_TRACE"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR: + reason.append("EXC_PPC_PERFMON"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + case MD_CPU_ARCHITECTURE_AMD64: + case MD_CPU_ARCHITECTURE_X86: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION: + reason.append("EXC_I386_INVOP"); + break; + case MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT: + reason.append("EXC_I386_INVTSSFLT"); + break; + case MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT: + reason.append("EXC_I386_SEGNPFLT"); + break; + case MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT: + reason.append("EXC_I386_STKFLT"); + break; + case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT: + reason.append("EXC_I386_GPFLT"); + break; + case MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT: + reason.append("EXC_I386_ALIGNFLT"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_MAC_ARITHMETIC: + reason = "EXC_ARITHMETIC / "; + switch (raw_system_info->processor_architecture) { + case MD_CPU_ARCHITECTURE_PPC: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW: + reason.append("EXC_PPC_OVERFLOW"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE: + reason.append("EXC_PPC_ZERO_DIVIDE"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT: + reason.append("EXC_FLT_INEXACT"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE: + reason.append("EXC_PPC_FLT_ZERO_DIVIDE"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW: + reason.append("EXC_PPC_FLT_UNDERFLOW"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW: + reason.append("EXC_PPC_FLT_OVERFLOW"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER: + reason.append("EXC_PPC_FLT_NOT_A_NUMBER"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION: + reason.append("EXC_PPC_NOEMULATION"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST: + reason.append("EXC_PPC_ALTIVECASSIST"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + case MD_CPU_ARCHITECTURE_AMD64: + case MD_CPU_ARCHITECTURE_X86: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_X86_DIV: + reason.append("EXC_I386_DIV"); + break; + case MD_EXCEPTION_CODE_MAC_X86_INTO: + reason.append("EXC_I386_INTO"); + break; + case MD_EXCEPTION_CODE_MAC_X86_NOEXT: + reason.append("EXC_I386_NOEXT"); + break; + case MD_EXCEPTION_CODE_MAC_X86_EXTOVR: + reason.append("EXC_I386_EXTOVR"); + break; + case MD_EXCEPTION_CODE_MAC_X86_EXTERR: + reason.append("EXC_I386_EXTERR"); + break; + case MD_EXCEPTION_CODE_MAC_X86_EMERR: + reason.append("EXC_I386_EMERR"); + break; + case MD_EXCEPTION_CODE_MAC_X86_BOUND: + reason.append("EXC_I386_BOUND"); + break; + case MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR: + reason.append("EXC_I386_SSEEXTERR"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_MAC_EMULATION: + reason = "EXC_EMULATION / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_MAC_SOFTWARE: + reason = "EXC_SOFTWARE / "; + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_ABORT: + reason.append("SIGABRT"); + break; + case MD_EXCEPTION_CODE_MAC_NS_EXCEPTION: + reason.append("UNCAUGHT_NS_EXCEPTION"); + break; + // These are ppc only but shouldn't be a problem as they're + // unused on x86 + case MD_EXCEPTION_CODE_MAC_PPC_TRAP: + reason.append("EXC_PPC_TRAP"); + break; + case MD_EXCEPTION_CODE_MAC_PPC_MIGRATE: + reason.append("EXC_PPC_MIGRATE"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_MAC_BREAKPOINT: + reason = "EXC_BREAKPOINT / "; + switch (raw_system_info->processor_architecture) { + case MD_CPU_ARCHITECTURE_ARM: + case MD_CPU_ARCHITECTURE_ARM64_OLD: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN: + reason.append("EXC_ARM_DA_ALIGN"); + break; + case MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG: + reason.append("EXC_ARM_DA_DEBUG"); + break; + case MD_EXCEPTION_CODE_MAC_ARM_BREAKPOINT: + reason.append("EXC_ARM_BREAKPOINT"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + case MD_CPU_ARCHITECTURE_PPC: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT: + reason.append("EXC_PPC_BREAKPOINT"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + case MD_CPU_ARCHITECTURE_AMD64: + case MD_CPU_ARCHITECTURE_X86: { + switch (exception_flags) { + case MD_EXCEPTION_CODE_MAC_X86_SGL: + reason.append("EXC_I386_SGL"); + break; + case MD_EXCEPTION_CODE_MAC_X86_BPT: + reason.append("EXC_I386_BPT"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_MAC_SYSCALL: + reason = "EXC_SYSCALL / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_MAC_MACH_SYSCALL: + reason = "EXC_MACH_SYSCALL / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_MAC_RPC_ALERT: + reason = "EXC_RPC_ALERT / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_MAC_RESOURCE: + reason = "EXC_RESOURCE / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_MAC_GUARD: + reason = "EXC_GUARD / "; + reason.append(flags_string); + break; + case MD_EXCEPTION_MAC_SIMULATED: + reason = "Simulated Exception"; + break; + case MD_NS_EXCEPTION_SIMULATED: + reason = "Uncaught NSException"; + break; + } + break; + } + + case MD_OS_WIN32_NT: + case MD_OS_WIN32_WINDOWS: { + switch (exception_code) { + case MD_EXCEPTION_CODE_WIN_CONTROL_C: + reason = "DBG_CONTROL_C"; + break; + case MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION: + reason = "EXCEPTION_GUARD_PAGE"; + break; + case MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT: + reason = "EXCEPTION_DATATYPE_MISALIGNMENT"; + break; + case MD_EXCEPTION_CODE_WIN_BREAKPOINT: + reason = "EXCEPTION_BREAKPOINT"; + break; + case MD_EXCEPTION_CODE_WIN_SINGLE_STEP: + reason = "EXCEPTION_SINGLE_STEP"; + break; + case MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION: + // For EXCEPTION_ACCESS_VIOLATION, Windows puts the address that + // caused the fault in exception_information[1]. + // exception_information[0] is 0 if the violation was caused by + // an attempt to read data, 1 if it was an attempt to write data, + // and 8 if this was a data execution violation. + // This information is useful in addition to the code address, which + // will be present in the crash thread's instruction field anyway. + if (raw_exception->exception_record.number_parameters >= 1) { + MDAccessViolationTypeWin av_type = + static_cast + (raw_exception->exception_record.exception_information[0]); + switch (av_type) { + case MD_ACCESS_VIOLATION_WIN_READ: + reason = "EXCEPTION_ACCESS_VIOLATION_READ"; + break; + case MD_ACCESS_VIOLATION_WIN_WRITE: + reason = "EXCEPTION_ACCESS_VIOLATION_WRITE"; + break; + case MD_ACCESS_VIOLATION_WIN_EXEC: + reason = "EXCEPTION_ACCESS_VIOLATION_EXEC"; + break; + default: + reason = "EXCEPTION_ACCESS_VIOLATION"; + break; + } + } else { + reason = "EXCEPTION_ACCESS_VIOLATION"; + } + if (address && + raw_exception->exception_record.number_parameters >= 2) { + *address = + raw_exception->exception_record.exception_information[1]; + } + break; + case MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR: + // For EXCEPTION_IN_PAGE_ERROR, Windows puts the address that + // caused the fault in exception_information[1]. + // exception_information[0] is 0 if the violation was caused by + // an attempt to read data, 1 if it was an attempt to write data, + // and 8 if this was a data execution violation. + // exception_information[2] contains the underlying NTSTATUS code, + // which is the explanation for why this error occured. + // This information is useful in addition to the code address, which + // will be present in the crash thread's instruction field anyway. + if (raw_exception->exception_record.number_parameters >= 1) { + MDInPageErrorTypeWin av_type = + static_cast + (raw_exception->exception_record.exception_information[0]); + switch (av_type) { + case MD_IN_PAGE_ERROR_WIN_READ: + reason = "EXCEPTION_IN_PAGE_ERROR_READ"; + break; + case MD_IN_PAGE_ERROR_WIN_WRITE: + reason = "EXCEPTION_IN_PAGE_ERROR_WRITE"; + break; + case MD_IN_PAGE_ERROR_WIN_EXEC: + reason = "EXCEPTION_IN_PAGE_ERROR_EXEC"; + break; + default: + reason = "EXCEPTION_IN_PAGE_ERROR"; + break; + } + } else { + reason = "EXCEPTION_IN_PAGE_ERROR"; + } + if (address && + raw_exception->exception_record.number_parameters >= 2) { + *address = + raw_exception->exception_record.exception_information[1]; + } + if (raw_exception->exception_record.number_parameters >= 3) { + uint32_t ntstatus = + static_cast + (raw_exception->exception_record.exception_information[2]); + reason.append(" / "); + reason.append(NTStatusToString(ntstatus)); + } + break; + case MD_EXCEPTION_CODE_WIN_INVALID_HANDLE: + reason = "EXCEPTION_INVALID_HANDLE"; + break; + case MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION: + reason = "EXCEPTION_ILLEGAL_INSTRUCTION"; + break; + case MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION: + reason = "EXCEPTION_NONCONTINUABLE_EXCEPTION"; + break; + case MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION: + reason = "EXCEPTION_INVALID_DISPOSITION"; + break; + case MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED: + reason = "EXCEPTION_BOUNDS_EXCEEDED"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND: + reason = "EXCEPTION_FLT_DENORMAL_OPERAND"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO: + reason = "EXCEPTION_FLT_DIVIDE_BY_ZERO"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT: + reason = "EXCEPTION_FLT_INEXACT_RESULT"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION: + reason = "EXCEPTION_FLT_INVALID_OPERATION"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW: + reason = "EXCEPTION_FLT_OVERFLOW"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK: + reason = "EXCEPTION_FLT_STACK_CHECK"; + break; + case MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW: + reason = "EXCEPTION_FLT_UNDERFLOW"; + break; + case MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO: + reason = "EXCEPTION_INT_DIVIDE_BY_ZERO"; + break; + case MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW: + reason = "EXCEPTION_INT_OVERFLOW"; + break; + case MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION: + reason = "EXCEPTION_PRIV_INSTRUCTION"; + break; + case MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW: + reason = "EXCEPTION_STACK_OVERFLOW"; + break; + case MD_EXCEPTION_CODE_WIN_BAD_FUNCTION_TABLE: + reason = "EXCEPTION_BAD_FUNCTION_TABLE"; + break; + case MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK: + reason = "EXCEPTION_POSSIBLE_DEADLOCK"; + break; + case MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN: + if (raw_exception->exception_record.number_parameters >= 1) { + MDFastFailSubcodeTypeWin subcode = + static_cast( + raw_exception->exception_record.exception_information[0]); + switch (subcode) { + // Note - we skip the '0'/GS case as it exists for legacy reasons. + case MD_FAST_FAIL_VTGUARD_CHECK_FAILURE: + reason = "FAST_FAIL_VTGUARD_CHECK_FAILURE"; + break; + case MD_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE: + reason = "FAST_FAIL_STACK_COOKIE_CHECK_FAILURE"; + break; + case MD_FAST_FAIL_CORRUPT_LIST_ENTRY: + reason = "FAST_FAIL_CORRUPT_LIST_ENTRY"; + break; + case MD_FAST_FAIL_INCORRECT_STACK: + reason = "FAST_FAIL_INCORRECT_STACK"; + break; + case MD_FAST_FAIL_INVALID_ARG: + reason = "FAST_FAIL_INVALID_ARG"; + break; + case MD_FAST_FAIL_GS_COOKIE_INIT: + reason = "FAST_FAIL_GS_COOKIE_INIT"; + break; + case MD_FAST_FAIL_FATAL_APP_EXIT: + reason = "FAST_FAIL_FATAL_APP_EXIT"; + break; + case MD_FAST_FAIL_RANGE_CHECK_FAILURE: + reason = "FAST_FAIL_RANGE_CHECK_FAILURE"; + break; + case MD_FAST_FAIL_UNSAFE_REGISTRY_ACCESS: + reason = "FAST_FAIL_UNSAFE_REGISTRY_ACCESS"; + break; + case MD_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE: + reason = "FAST_FAIL_GUARD_ICALL_CHECK_FAILURE"; + break; + case MD_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE: + reason = "FAST_FAIL_GUARD_WRITE_CHECK_FAILURE"; + break; + case MD_FAST_FAIL_INVALID_FIBER_SWITCH: + reason = "FAST_FAIL_INVALID_FIBER_SWITCH"; + break; + case MD_FAST_FAIL_INVALID_SET_OF_CONTEXT: + reason = "FAST_FAIL_INVALID_SET_OF_CONTEXT"; + break; + case MD_FAST_FAIL_INVALID_REFERENCE_COUNT: + reason = "FAST_FAIL_INVALID_REFERENCE_COUNT"; + break; + case MD_FAST_FAIL_INVALID_JUMP_BUFFER: + reason = "FAST_FAIL_INVALID_JUMP_BUFFER"; + break; + case MD_FAST_FAIL_MRDATA_MODIFIED: + reason = "FAST_FAIL_MRDATA_MODIFIED"; + break; + case MD_FAST_FAIL_CERTIFICATION_FAILURE: + reason = "FAST_FAIL_CERTIFICATION_FAILURE"; + break; + case MD_FAST_FAIL_INVALID_EXCEPTION_CHAIN: + reason = "FAST_FAIL_INVALID_EXCEPTION_CHAIN"; + break; + case MD_FAST_FAIL_CRYPTO_LIBRARY: + reason = "FAST_FAIL_CRYPTO_LIBRARY"; + break; + case MD_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT: + reason = "FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT"; + break; + case MD_FAST_FAIL_INVALID_IMAGE_BASE: + reason = "FAST_FAIL_INVALID_IMAGE_BASE"; + break; + case MD_FAST_FAIL_DLOAD_PROTECTION_FAILURE: + reason = "FAST_FAIL_DLOAD_PROTECTION_FAILURE"; + break; + case MD_FAST_FAIL_UNSAFE_EXTENSION_CALL: + reason = "FAST_FAIL_UNSAFE_EXTENSION_CALL"; + break; + case MD_FAST_FAIL_DEPRECATED_SERVICE_INVOKED: + reason = "FAST_FAIL_DEPRECATED_SERVICE_INVOKED"; + break; + case MD_FAST_FAIL_INVALID_BUFFER_ACCESS: + reason = "FAST_FAIL_INVALID_BUFFER_ACCESS"; + break; + case MD_FAST_FAIL_INVALID_BALANCED_TREE: + reason = "FAST_FAIL_INVALID_BALANCED_TREE"; + break; + case MD_FAST_FAIL_INVALID_NEXT_THREAD: + reason = "FAST_FAIL_INVALID_NEXT_THREAD"; + break; + case MD_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED: + reason = "FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED"; + break; + case MD_FAST_FAIL_APCS_DISABLED: + reason = "FAST_FAIL_APCS_DISABLED"; + break; + case MD_FAST_FAIL_INVALID_IDLE_STATE: + reason = "FAST_FAIL_INVALID_IDLE_STATE"; + break; + case MD_FAST_FAIL_MRDATA_PROTECTION_FAILURE: + reason = "FAST_FAIL_MRDATA_PROTECTION_FAILURE"; + break; + case MD_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION: + reason = "FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION"; + break; + case MD_FAST_FAIL_INVALID_LOCK_STATE: + reason = "FAST_FAIL_INVALID_LOCK_STATE"; + break; + case MD_FAST_FAIL_GUARD_JUMPTABLE: + reason = "FAST_FAIL_GUARD_JUMPTABLE"; + break; + case MD_FAST_FAIL_INVALID_LONGJUMP_TARGET: + reason = "FAST_FAIL_INVALID_LONGJUMP_TARGET"; + break; + case MD_FAST_FAIL_INVALID_DISPATCH_CONTEXT: + reason = "FAST_FAIL_INVALID_DISPATCH_CONTEXT"; + break; + case MD_FAST_FAIL_INVALID_THREAD: + reason = "FAST_FAIL_INVALID_THREAD"; + break; + case MD_FAST_FAIL_INVALID_SYSCALL_NUMBER: + reason = "FAST_FAIL_INVALID_SYSCALL_NUMBER"; + break; + case MD_FAST_FAIL_INVALID_FILE_OPERATION: + reason = "FAST_FAIL_INVALID_FILE_OPERATION"; + break; + case MD_FAST_FAIL_LPAC_ACCESS_DENIED: + reason = "FAST_FAIL_LPAC_ACCESS_DENIED"; + break; + case MD_FAST_FAIL_GUARD_SS_FAILURE: + reason = "FAST_FAIL_GUARD_SS_FAILURE"; + break; + case MD_FAST_FAIL_LOADER_CONTINUITY_FAILURE: + reason = "FAST_FAIL_LOADER_CONTINUITY_FAILURE"; + break; + case MD_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE: + reason = "FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE"; + break; + case MD_FAST_FAIL_INVALID_CONTROL_STACK: + reason = "FAST_FAIL_INVALID_CONTROL_STACK"; + break; + case MD_FAST_FAIL_SET_CONTEXT_DENIED: + reason = "FAST_FAIL_SET_CONTEXT_DENIED"; + break; + case MD_FAST_FAIL_INVALID_IAT: + reason = "FAST_FAIL_INVALID_IAT"; + break; + case MD_FAST_FAIL_HEAP_METADATA_CORRUPTION: + reason = "FAST_FAIL_HEAP_METADATA_CORRUPTION"; + break; + case MD_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION: + reason = "FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION"; + break; + case MD_FAST_FAIL_LOW_LABEL_ACCESS_DENIED: + reason = "FAST_FAIL_LOW_LABEL_ACCESS_DENIED"; + break; + case MD_FAST_FAIL_ENCLAVE_CALL_FAILURE: + reason = "FAST_FAIL_ENCLAVE_CALL_FAILURE"; + break; + case MD_FAST_FAIL_UNHANDLED_LSS_EXCEPTON: + reason = "FAST_FAIL_UNHANDLED_LSS_EXCEPTON"; + break; + case MD_FAST_FAIL_ADMINLESS_ACCESS_DENIED: + reason = "FAST_FAIL_ADMINLESS_ACCESS_DENIED"; + break; + case MD_FAST_FAIL_UNEXPECTED_CALL: + reason = "FAST_FAIL_UNEXPECTED_CALL"; + break; + case MD_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS: + reason = "FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS"; + break; + case MD_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR: + reason = "FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR"; + break; + case MD_FAST_FAIL_FLAGS_CORRUPTION: + reason = "FAST_FAIL_FLAGS_CORRUPTION"; + break; + case MD_FAST_FAIL_VEH_CORRUPTION: + reason = "FAST_FAIL_VEH_CORRUPTION"; + break; + case MD_FAST_FAIL_ETW_CORRUPTION: + reason = "FAST_FAIL_ETW_CORRUPTION"; + break; + case MD_FAST_FAIL_RIO_ABORT: + reason = "FAST_FAIL_RIO_ABORT"; + break; + case MD_FAST_FAIL_INVALID_PFN: + reason = "FAST_FAIL_INVALID_PFN"; + break; + case MD_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG: + reason = "FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG"; + break; + case MD_FAST_FAIL_CAST_GUARD: + reason = "FAST_FAIL_CAST_GUARD"; + break; + case MD_FAST_FAIL_HOST_VISIBILITY_CHANGE: + reason = "FAST_FAIL_HOST_VISIBILITY_CHANGE"; + break; + case MD_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST: + reason = "FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST"; + break; + case MD_FAST_FAIL_PATCH_CALLBACK_FAILED: + reason = "FAST_FAIL_PATCH_CALLBACK_FAILED"; + break; + case MD_FAST_FAIL_NTDLL_PATCH_FAILED: + reason = "FAST_FAIL_NTDLL_PATCH_FAILED"; + break; + case MD_FAST_FAIL_INVALID_FLS_DATA: + reason = "FAST_FAIL_INVALID_FLS_DATA"; + break; + default: + reason = "EXCEPTION_STACK_BUFFER_OVERRUN"; + break; + } + } else { + reason = "EXCEPTION_STACK_BUFFER_OVERRUN"; + } + break; + case MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION: + reason = "EXCEPTION_HEAP_CORRUPTION"; + break; + case MD_EXCEPTION_OUT_OF_MEMORY: + reason = "Out of Memory"; + break; + case MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION: + reason = "Unhandled C++ Exception"; + break; + case MD_EXCEPTION_CODE_WIN_SIMULATED: + reason = "Simulated Exception"; + break; + default: + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + + case MD_OS_ANDROID: + case MD_OS_LINUX: { + switch (exception_code) { + case MD_EXCEPTION_CODE_LIN_SIGHUP: + reason = "SIGHUP"; + break; + case MD_EXCEPTION_CODE_LIN_SIGINT: + reason = "SIGINT"; + break; + case MD_EXCEPTION_CODE_LIN_SIGQUIT: + reason = "SIGQUIT"; + break; + case MD_EXCEPTION_CODE_LIN_SIGILL: + reason = "SIGILL / "; + switch (exception_flags) { + case MD_EXCEPTION_FLAG_LIN_ILL_ILLOPC: + reason.append("ILL_ILLOPC"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_ILLOPN: + reason.append("ILL_ILLOPN"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_ILLADR: + reason.append("ILL_ILLADR"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_ILLTRP: + reason.append("ILL_ILLTRP"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_PRVOPC: + reason.append("ILL_PRVOPC"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_PRVREG: + reason.append("ILL_PRVREG"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_COPROC: + reason.append("ILL_COPROC"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_BADSTK: + reason.append("ILL_BADSTK"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_CODE_LIN_SIGTRAP: + reason = "SIGTRAP"; + break; + case MD_EXCEPTION_CODE_LIN_SIGABRT: + reason = "SIGABRT"; + break; + case MD_EXCEPTION_CODE_LIN_SIGBUS: + reason = "SIGBUS / "; + switch (exception_flags) { + case MD_EXCEPTION_FLAG_LIN_BUS_ADRALN: + reason.append("BUS_ADRALN"); + break; + case MD_EXCEPTION_FLAG_LIN_BUS_ADRERR: + reason.append("BUS_ADRERR"); + break; + case MD_EXCEPTION_FLAG_LIN_BUS_OBJERR: + reason.append("BUS_OBJERR"); + break; + case MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AR: + reason.append("BUS_MCEERR_AR"); + break; + case MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AO: + reason.append("BUS_MCEERR_AO"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_CODE_LIN_SIGFPE: + reason = "SIGFPE / "; + switch (exception_flags) { + case MD_EXCEPTION_FLAG_LIN_FPE_INTDIV: + reason.append("FPE_INTDIV"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_INTOVF: + reason.append("FPE_INTOVF"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTDIV: + reason.append("FPE_FLTDIV"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTOVF: + reason.append("FPE_FLTOVF"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTUND: + reason.append("FPE_FLTUND"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTRES: + reason.append("FPE_FLTRES"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTINV: + reason.append("FPE_FLTINV"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTSUB: + reason.append("FPE_FLTSUB"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_CODE_LIN_SIGKILL: + reason = "SIGKILL"; + break; + case MD_EXCEPTION_CODE_LIN_SIGUSR1: + reason = "SIGUSR1"; + break; + case MD_EXCEPTION_CODE_LIN_SIGSEGV: + reason = "SIGSEGV /"; + switch (exception_flags) { + case MD_EXCEPTION_FLAG_LIN_SEGV_MAPERR: + reason.append("SEGV_MAPERR"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_ACCERR: + reason.append("SEGV_ACCERR"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_BNDERR: + reason.append("SEGV_BNDERR"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_PKUERR: + reason.append("SEGV_PKUERR"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_ACCADI: + reason.append("SEGV_ACCADI"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_ADIDERR: + reason.append("SEGV_ADIDERR"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_ADIPERR: + reason.append("SEGV_ADIPERR"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_MTEAERR: + reason.append("SEGV_MTEAERR"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_MTESERR: + reason.append("SEGV_MTESERR"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + case MD_EXCEPTION_CODE_LIN_SIGUSR2: + reason = "SIGUSR2"; + break; + case MD_EXCEPTION_CODE_LIN_SIGPIPE: + reason = "SIGPIPE"; + break; + case MD_EXCEPTION_CODE_LIN_SIGALRM: + reason = "SIGALRM"; + break; + case MD_EXCEPTION_CODE_LIN_SIGTERM: + reason = "SIGTERM"; + break; + case MD_EXCEPTION_CODE_LIN_SIGSTKFLT: + reason = "SIGSTKFLT"; + break; + case MD_EXCEPTION_CODE_LIN_SIGCHLD: + reason = "SIGCHLD"; + break; + case MD_EXCEPTION_CODE_LIN_SIGCONT: + reason = "SIGCONT"; + break; + case MD_EXCEPTION_CODE_LIN_SIGSTOP: + reason = "SIGSTOP"; + break; + case MD_EXCEPTION_CODE_LIN_SIGTSTP: + reason = "SIGTSTP"; + break; + case MD_EXCEPTION_CODE_LIN_SIGTTIN: + reason = "SIGTTIN"; + break; + case MD_EXCEPTION_CODE_LIN_SIGTTOU: + reason = "SIGTTOU"; + break; + case MD_EXCEPTION_CODE_LIN_SIGURG: + reason = "SIGURG"; + break; + case MD_EXCEPTION_CODE_LIN_SIGXCPU: + reason = "SIGXCPU"; + break; + case MD_EXCEPTION_CODE_LIN_SIGXFSZ: + reason = "SIGXFSZ"; + break; + case MD_EXCEPTION_CODE_LIN_SIGVTALRM: + reason = "SIGVTALRM"; + break; + case MD_EXCEPTION_CODE_LIN_SIGPROF: + reason = "SIGPROF"; + break; + case MD_EXCEPTION_CODE_LIN_SIGWINCH: + reason = "SIGWINCH"; + break; + case MD_EXCEPTION_CODE_LIN_SIGIO: + reason = "SIGIO"; + break; + case MD_EXCEPTION_CODE_LIN_SIGPWR: + reason = "SIGPWR"; + break; + case MD_EXCEPTION_CODE_LIN_SIGSYS: + reason = "SIGSYS"; + break; + case MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED: + reason = "DUMP_REQUESTED"; + break; + default: + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + + case MD_OS_SOLARIS: { + switch (exception_code) { + case MD_EXCEPTION_CODE_SOL_SIGHUP: + reason = "SIGHUP"; + break; + case MD_EXCEPTION_CODE_SOL_SIGINT: + reason = "SIGINT"; + break; + case MD_EXCEPTION_CODE_SOL_SIGQUIT: + reason = "SIGQUIT"; + break; + case MD_EXCEPTION_CODE_SOL_SIGILL: + reason = "SIGILL"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTRAP: + reason = "SIGTRAP"; + break; + case MD_EXCEPTION_CODE_SOL_SIGIOT: + reason = "SIGIOT | SIGABRT"; + break; + case MD_EXCEPTION_CODE_SOL_SIGEMT: + reason = "SIGEMT"; + break; + case MD_EXCEPTION_CODE_SOL_SIGFPE: + reason = "SIGFPE"; + break; + case MD_EXCEPTION_CODE_SOL_SIGKILL: + reason = "SIGKILL"; + break; + case MD_EXCEPTION_CODE_SOL_SIGBUS: + reason = "SIGBUS"; + break; + case MD_EXCEPTION_CODE_SOL_SIGSEGV: + reason = "SIGSEGV"; + break; + case MD_EXCEPTION_CODE_SOL_SIGSYS: + reason = "SIGSYS"; + break; + case MD_EXCEPTION_CODE_SOL_SIGPIPE: + reason = "SIGPIPE"; + break; + case MD_EXCEPTION_CODE_SOL_SIGALRM: + reason = "SIGALRM"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTERM: + reason = "SIGTERM"; + break; + case MD_EXCEPTION_CODE_SOL_SIGUSR1: + reason = "SIGUSR1"; + break; + case MD_EXCEPTION_CODE_SOL_SIGUSR2: + reason = "SIGUSR2"; + break; + case MD_EXCEPTION_CODE_SOL_SIGCLD: + reason = "SIGCLD | SIGCHLD"; + break; + case MD_EXCEPTION_CODE_SOL_SIGPWR: + reason = "SIGPWR"; + break; + case MD_EXCEPTION_CODE_SOL_SIGWINCH: + reason = "SIGWINCH"; + break; + case MD_EXCEPTION_CODE_SOL_SIGURG: + reason = "SIGURG"; + break; + case MD_EXCEPTION_CODE_SOL_SIGPOLL: + reason = "SIGPOLL | SIGIO"; + break; + case MD_EXCEPTION_CODE_SOL_SIGSTOP: + reason = "SIGSTOP"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTSTP: + reason = "SIGTSTP"; + break; + case MD_EXCEPTION_CODE_SOL_SIGCONT: + reason = "SIGCONT"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTTIN: + reason = "SIGTTIN"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTTOU: + reason = "SIGTTOU"; + break; + case MD_EXCEPTION_CODE_SOL_SIGVTALRM: + reason = "SIGVTALRM"; + break; + case MD_EXCEPTION_CODE_SOL_SIGPROF: + reason = "SIGPROF"; + break; + case MD_EXCEPTION_CODE_SOL_SIGXCPU: + reason = "SIGXCPU"; + break; + case MD_EXCEPTION_CODE_SOL_SIGXFSZ: + reason = "SIGXFSZ"; + break; + case MD_EXCEPTION_CODE_SOL_SIGWAITING: + reason = "SIGWAITING"; + break; + case MD_EXCEPTION_CODE_SOL_SIGLWP: + reason = "SIGLWP"; + break; + case MD_EXCEPTION_CODE_SOL_SIGFREEZE: + reason = "SIGFREEZE"; + break; + case MD_EXCEPTION_CODE_SOL_SIGTHAW: + reason = "SIGTHAW"; + break; + case MD_EXCEPTION_CODE_SOL_SIGCANCEL: + reason = "SIGCANCEL"; + break; + case MD_EXCEPTION_CODE_SOL_SIGLOST: + reason = "SIGLOST"; + break; + case MD_EXCEPTION_CODE_SOL_SIGXRES: + reason = "SIGXRES"; + break; + case MD_EXCEPTION_CODE_SOL_SIGJVM1: + reason = "SIGJVM1"; + break; + case MD_EXCEPTION_CODE_SOL_SIGJVM2: + reason = "SIGJVM2"; + break; + default: + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + break; + } + + case MD_OS_PS3: { + switch (exception_code) { + case MD_EXCEPTION_CODE_PS3_UNKNOWN: + reason = "UNKNOWN"; + break; + case MD_EXCEPTION_CODE_PS3_TRAP_EXCEP: + reason = "TRAP_EXCEP"; + break; + case MD_EXCEPTION_CODE_PS3_PRIV_INSTR: + reason = "PRIV_INSTR"; + break; + case MD_EXCEPTION_CODE_PS3_ILLEGAL_INSTR: + reason = "ILLEGAL_INSTR"; + break; + case MD_EXCEPTION_CODE_PS3_INSTR_STORAGE: + reason = "INSTR_STORAGE"; + break; + case MD_EXCEPTION_CODE_PS3_INSTR_SEGMENT: + reason = "INSTR_SEGMENT"; + break; + case MD_EXCEPTION_CODE_PS3_DATA_STORAGE: + reason = "DATA_STORAGE"; + break; + case MD_EXCEPTION_CODE_PS3_DATA_SEGMENT: + reason = "DATA_SEGMENT"; + break; + case MD_EXCEPTION_CODE_PS3_FLOAT_POINT: + reason = "FLOAT_POINT"; + break; + case MD_EXCEPTION_CODE_PS3_DABR_MATCH: + reason = "DABR_MATCH"; + break; + case MD_EXCEPTION_CODE_PS3_ALIGN_EXCEP: + reason = "ALIGN_EXCEP"; + break; + case MD_EXCEPTION_CODE_PS3_MEMORY_ACCESS: + reason = "MEMORY_ACCESS"; + break; + case MD_EXCEPTION_CODE_PS3_COPRO_ALIGN: + reason = "COPRO_ALIGN"; + break; + case MD_EXCEPTION_CODE_PS3_COPRO_INVALID_COM: + reason = "COPRO_INVALID_COM"; + break; + case MD_EXCEPTION_CODE_PS3_COPRO_ERR: + reason = "COPRO_ERR"; + break; + case MD_EXCEPTION_CODE_PS3_COPRO_FIR: + reason = "COPRO_FIR"; + break; + case MD_EXCEPTION_CODE_PS3_COPRO_DATA_SEGMENT: + reason = "COPRO_DATA_SEGMENT"; + break; + case MD_EXCEPTION_CODE_PS3_COPRO_DATA_STORAGE: + reason = "COPRO_DATA_STORAGE"; + break; + case MD_EXCEPTION_CODE_PS3_COPRO_STOP_INSTR: + reason = "COPRO_STOP_INSTR"; + break; + case MD_EXCEPTION_CODE_PS3_COPRO_HALT_INSTR: + reason = "COPRO_HALT_INSTR"; + break; + case MD_EXCEPTION_CODE_PS3_COPRO_HALTINST_UNKNOWN: + reason = "COPRO_HALTINSTR_UNKNOWN"; + break; + case MD_EXCEPTION_CODE_PS3_COPRO_MEMORY_ACCESS: + reason = "COPRO_MEMORY_ACCESS"; + break; + case MD_EXCEPTION_CODE_PS3_GRAPHIC: + reason = "GRAPHIC"; + break; + default: + BPLOG(INFO) << "Unknown exception reason "<< reason; + break; + } + break; + } + + default: { + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } + } + + if (address) { + *address = GetAddressForArchitecture( + static_cast(raw_system_info->processor_architecture), + *address); + +#ifdef __linux__ + // For invalid accesses to non-canonical addresses, amd64 cpus don't provide + // the fault address, so recover it from the disassembly and register state + // if possible. + if (enable_objdump + && raw_system_info->processor_architecture == MD_CPU_ARCHITECTURE_AMD64 + && std::numeric_limits::max() == *address) { + CalculateFaultAddressFromInstruction(dump, address); + } +#endif // __linux__ + } + + return reason; +} + +// static +string MinidumpProcessor::GetAssertion(Minidump* dump) { + MinidumpAssertion* assertion = dump->GetAssertion(); + if (!assertion) + return ""; + + const MDRawAssertionInfo* raw_assertion = assertion->assertion(); + if (!raw_assertion) + return ""; + + string assertion_string; + switch (raw_assertion->type) { + case MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER: + assertion_string = "Invalid parameter passed to library function"; + break; + case MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL: + assertion_string = "Pure virtual function called"; + break; + default: { + char assertion_type[32]; + snprintf(assertion_type, sizeof(assertion_type), + "0x%08x", raw_assertion->type); + assertion_string = "Unknown assertion type "; + assertion_string += assertion_type; + break; + } + } + + string expression = assertion->expression(); + if (!expression.empty()) { + assertion_string.append(" " + expression); + } + + string function = assertion->function(); + if (!function.empty()) { + assertion_string.append(" in function " + function); + } + + string file = assertion->file(); + if (!file.empty()) { + assertion_string.append(", in file " + file); + } + + if (raw_assertion->line != 0) { + char assertion_line[32]; + snprintf(assertion_line, sizeof(assertion_line), "%u", raw_assertion->line); + assertion_string.append(" at line "); + assertion_string.append(assertion_line); + } + + return assertion_string; +} + +} // namespace google_breakpad diff --git a/src/processor/minidump_processor_unittest.cc b/src/processor/minidump_processor_unittest.cc new file mode 100644 index 0000000..de3cfdd --- /dev/null +++ b/src/processor/minidump_processor_unittest.cc @@ -0,0 +1,830 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Unit test for MinidumpProcessor. Uses a pre-generated minidump and +// corresponding symbol file, and checks the stack frames for correctness. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include +#include +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/scoped_ptr.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/minidump_processor.h" +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/stack_frame.h" +#include "google_breakpad/processor/symbol_supplier.h" +#include "processor/logging.h" +#include "processor/stackwalker_unittest_utils.h" + +using std::map; + +namespace google_breakpad { +class MockMinidump : public Minidump { + public: + MockMinidump() : Minidump("") { + } + + MOCK_METHOD0(Read, bool()); + MOCK_CONST_METHOD0(path, string()); + MOCK_CONST_METHOD0(header, const MDRawHeader*()); + MOCK_METHOD0(GetThreadList, MinidumpThreadList*()); + MOCK_METHOD0(GetSystemInfo, MinidumpSystemInfo*()); + MOCK_METHOD0(GetMiscInfo, MinidumpMiscInfo*()); + MOCK_METHOD0(GetBreakpadInfo, MinidumpBreakpadInfo*()); + MOCK_METHOD0(GetException, MinidumpException*()); + MOCK_METHOD0(GetAssertion, MinidumpAssertion*()); + MOCK_METHOD0(GetModuleList, MinidumpModuleList*()); + MOCK_METHOD0(GetUnloadedModuleList, MinidumpUnloadedModuleList*()); + MOCK_METHOD0(GetMemoryList, MinidumpMemoryList*()); +}; + +class MockMinidumpUnloadedModule : public MinidumpUnloadedModule { + public: + MockMinidumpUnloadedModule() : MinidumpUnloadedModule(NULL) {} +}; + +class MockMinidumpUnloadedModuleList : public MinidumpUnloadedModuleList { + public: + MockMinidumpUnloadedModuleList() : MinidumpUnloadedModuleList(NULL) {} + + ~MockMinidumpUnloadedModuleList() {} + MOCK_CONST_METHOD0(Copy, CodeModules*()); + MOCK_CONST_METHOD1(GetModuleForAddress, + const MinidumpUnloadedModule*(uint64_t)); +}; + +class MockMinidumpThreadList : public MinidumpThreadList { + public: + MockMinidumpThreadList() : MinidumpThreadList(NULL) {} + + MOCK_CONST_METHOD0(thread_count, unsigned int()); + MOCK_CONST_METHOD1(GetThreadAtIndex, MinidumpThread*(unsigned int)); +}; + +class MockMinidumpMemoryList : public MinidumpMemoryList { + public: + MockMinidumpMemoryList() : MinidumpMemoryList(NULL) {} + + MOCK_METHOD1(GetMemoryRegionForAddress, MinidumpMemoryRegion*(uint64_t)); +}; + +class MockMinidumpThread : public MinidumpThread { + public: + MockMinidumpThread() : MinidumpThread(NULL) {} + + MOCK_CONST_METHOD1(GetThreadID, bool(uint32_t*)); + MOCK_METHOD0(GetContext, MinidumpContext*()); + MOCK_METHOD0(GetMemory, MinidumpMemoryRegion*()); + MOCK_CONST_METHOD0(GetStartOfStackMemoryRange, uint64_t()); +}; + +// This is crappy, but MinidumpProcessor really does want a +// MinidumpMemoryRegion. +class MockMinidumpMemoryRegion : public MinidumpMemoryRegion { + public: + MockMinidumpMemoryRegion(uint64_t base, const string& contents) : + MinidumpMemoryRegion(NULL) { + region_.Init(base, contents); + } + + uint64_t GetBase() const { return region_.GetBase(); } + uint32_t GetSize() const { return region_.GetSize(); } + + bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const { + return region_.GetMemoryAtAddress(address, value); + } + bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const { + return region_.GetMemoryAtAddress(address, value); + } + bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const { + return region_.GetMemoryAtAddress(address, value); + } + bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const { + return region_.GetMemoryAtAddress(address, value); + } + + MockMemoryRegion region_; +}; + +// A test miscelaneous info stream, just returns values from the +// MDRawMiscInfo fed to it. +class TestMinidumpMiscInfo : public MinidumpMiscInfo { + public: + explicit TestMinidumpMiscInfo(const MDRawMiscInfo& misc_info) : + MinidumpMiscInfo(NULL) { + valid_ = true; + misc_info_ = misc_info; + } +}; + +} // namespace google_breakpad + +namespace { + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::MinidumpContext; +using google_breakpad::MinidumpMemoryRegion; +using google_breakpad::MinidumpMiscInfo; +using google_breakpad::MinidumpProcessor; +using google_breakpad::MinidumpSystemInfo; +using google_breakpad::MinidumpThreadList; +using google_breakpad::MinidumpThread; +using google_breakpad::MockMinidump; +using google_breakpad::MockMinidumpMemoryList; +using google_breakpad::MockMinidumpMemoryRegion; +using google_breakpad::MockMinidumpThread; +using google_breakpad::MockMinidumpThreadList; +using google_breakpad::MockMinidumpUnloadedModule; +using google_breakpad::MockMinidumpUnloadedModuleList; +using google_breakpad::ProcessState; +using google_breakpad::scoped_ptr; +using google_breakpad::SymbolSupplier; +using google_breakpad::SystemInfo; +using ::testing::_; +using ::testing::AnyNumber; +using ::testing::DoAll; +using ::testing::Mock; +using ::testing::Ne; +using ::testing::Property; +using ::testing::Return; +using ::testing::SetArgumentPointee; + +static const char* kSystemInfoOS = "Windows NT"; +static const char* kSystemInfoOSShort = "windows"; +static const char* kSystemInfoOSVersion = "5.1.2600 Service Pack 2"; +static const char* kSystemInfoCPU = "x86"; +static const char* kSystemInfoCPUInfo = + "GenuineIntel family 6 model 13 stepping 8"; + +#define ASSERT_TRUE_ABORT(cond) \ + if (!(cond)) { \ + fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \ + abort(); \ + } + +#define ASSERT_EQ_ABORT(e1, e2) ASSERT_TRUE_ABORT((e1) == (e2)) + +static string GetTestDataPath() { + char* srcdir = getenv("srcdir"); + + return string(srcdir ? srcdir : ".") + "/src/processor/testdata/"; +} + +class TestSymbolSupplier : public SymbolSupplier { + public: + TestSymbolSupplier() : interrupt_(false) {} + + virtual SymbolResult GetSymbolFile(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file); + + virtual SymbolResult GetSymbolFile(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + string* symbol_data); + + virtual SymbolResult GetCStringSymbolData(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + char** symbol_data, + size_t* symbol_data_size); + + virtual void FreeSymbolData(const CodeModule* module); + + // When set to true, causes the SymbolSupplier to return INTERRUPT + void set_interrupt(bool interrupt) { interrupt_ = interrupt; } + + private: + bool interrupt_; + map memory_buffers_; +}; + +SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile( + const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file) { + ASSERT_TRUE_ABORT(module); + ASSERT_TRUE_ABORT(system_info); + ASSERT_EQ_ABORT(system_info->cpu, kSystemInfoCPU); + ASSERT_EQ_ABORT(system_info->cpu_info, kSystemInfoCPUInfo); + ASSERT_EQ_ABORT(system_info->os, kSystemInfoOS); + ASSERT_EQ_ABORT(system_info->os_short, kSystemInfoOSShort); + ASSERT_EQ_ABORT(system_info->os_version, kSystemInfoOSVersion); + + if (interrupt_) { + return INTERRUPT; + } + + if (module && module->code_file() == "c:\\test_app.exe") { + *symbol_file = GetTestDataPath() + "symbols/test_app.pdb/" + + module->debug_identifier() + "/test_app.sym"; + return FOUND; + } + + return NOT_FOUND; +} + +SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile( + const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + string* symbol_data) { + SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info, + symbol_file); + if (s == FOUND) { + std::ifstream in(symbol_file->c_str()); + std::getline(in, *symbol_data, string::traits_type::to_char_type( + string::traits_type::eof())); + in.close(); + } + + return s; +} + +SymbolSupplier::SymbolResult TestSymbolSupplier::GetCStringSymbolData( + const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + char** symbol_data, + size_t* symbol_data_size) { + string symbol_data_string; + SymbolSupplier::SymbolResult s = GetSymbolFile(module, + system_info, + symbol_file, + &symbol_data_string); + if (s == FOUND) { + *symbol_data_size = symbol_data_string.size() + 1; + *symbol_data = new char[*symbol_data_size]; + if (*symbol_data == NULL) { + BPLOG(ERROR) << "Memory allocation failed for module: " + << module->code_file() << " size: " << *symbol_data_size; + return INTERRUPT; + } + memcpy(*symbol_data, symbol_data_string.c_str(), symbol_data_string.size()); + (*symbol_data)[symbol_data_string.size()] = '\0'; + memory_buffers_.insert(make_pair(module->code_file(), *symbol_data)); + } + + return s; +} + +void TestSymbolSupplier::FreeSymbolData(const CodeModule* module) { + map::iterator it = memory_buffers_.find(module->code_file()); + if (it != memory_buffers_.end()) { + delete [] it->second; + memory_buffers_.erase(it); + } +} + +// A test system info stream, just returns values from the +// MDRawSystemInfo fed to it. +class TestMinidumpSystemInfo : public MinidumpSystemInfo { + public: + explicit TestMinidumpSystemInfo(MDRawSystemInfo info) : + MinidumpSystemInfo(NULL) { + valid_ = true; + system_info_ = info; + csd_version_ = new string(""); + } +}; + +// A test minidump context, just returns the MDRawContextX86 +// fed to it. +class TestMinidumpContext : public MinidumpContext { + public: + explicit TestMinidumpContext(const MDRawContextX86& context) : + MinidumpContext(NULL) { + valid_ = true; + SetContextX86(new MDRawContextX86(context)); + SetContextFlags(MD_CONTEXT_X86); + } +}; + +class MinidumpProcessorTest : public ::testing::Test { +}; + +TEST_F(MinidumpProcessorTest, TestUnloadedModules) { + MockMinidump dump; + + EXPECT_CALL(dump, path()).WillRepeatedly(Return("mock minidump")); + EXPECT_CALL(dump, Read()).WillRepeatedly(Return(true)); + + MDRawHeader fake_header; + fake_header.time_date_stamp = 0; + EXPECT_CALL(dump, header()).WillRepeatedly(Return(&fake_header)); + + MDRawSystemInfo raw_system_info; + memset(&raw_system_info, 0, sizeof(raw_system_info)); + raw_system_info.processor_architecture = MD_CPU_ARCHITECTURE_X86; + raw_system_info.platform_id = MD_OS_WIN32_NT; + TestMinidumpSystemInfo dump_system_info(raw_system_info); + + EXPECT_CALL(dump, GetSystemInfo()). + WillRepeatedly(Return(&dump_system_info)); + + // No loaded modules + + MockMinidumpUnloadedModuleList unloaded_module_list; + EXPECT_CALL(dump, GetUnloadedModuleList()). + WillOnce(Return(&unloaded_module_list)); + + MockMinidumpMemoryList memory_list; + EXPECT_CALL(dump, GetMemoryList()). + WillOnce(Return(&memory_list)); + + MockMinidumpThreadList thread_list; + EXPECT_CALL(dump, GetThreadList()). + WillOnce(Return(&thread_list)); + + EXPECT_CALL(thread_list, thread_count()). + WillRepeatedly(Return(1)); + + MockMinidumpThread thread; + EXPECT_CALL(thread_list, GetThreadAtIndex(0)). + WillOnce(Return(&thread)); + + EXPECT_CALL(thread, GetThreadID(_)). + WillRepeatedly(DoAll(SetArgumentPointee<0>(1), + Return(true))); + + MDRawContextX86 thread_raw_context; + memset(&thread_raw_context, 0, + sizeof(thread_raw_context)); + thread_raw_context.context_flags = MD_CONTEXT_X86_FULL; + const uint32_t kExpectedEIP = 0xabcd1234; + thread_raw_context.eip = kExpectedEIP; + TestMinidumpContext thread_context(thread_raw_context); + EXPECT_CALL(thread, GetContext()). + WillRepeatedly(Return(&thread_context)); + + // The memory contents don't really matter here, since it won't be used. + MockMinidumpMemoryRegion thread_memory(0x1234, "xxx"); + EXPECT_CALL(thread, GetMemory()). + WillRepeatedly(Return(&thread_memory)); + EXPECT_CALL(thread, GetStartOfStackMemoryRange()). + Times(0); + EXPECT_CALL(memory_list, GetMemoryRegionForAddress(_)). + Times(0); + + MockMinidumpUnloadedModuleList* unloaded_module_list_copy = + new MockMinidumpUnloadedModuleList(); + EXPECT_CALL(unloaded_module_list, Copy()). + WillOnce(Return(unloaded_module_list_copy)); + + MockMinidumpUnloadedModule unloaded_module; + EXPECT_CALL(*unloaded_module_list_copy, GetModuleForAddress(kExpectedEIP)). + WillOnce(Return(&unloaded_module)); + + MinidumpProcessor processor(reinterpret_cast(NULL), NULL); + ProcessState state; + EXPECT_EQ(processor.Process(&dump, &state), + google_breakpad::PROCESS_OK); + + // The single frame should be populated with the unloaded module. + ASSERT_EQ(1U, state.threads()->size()); + ASSERT_EQ(1U, state.threads()->at(0)->frames()->size()); + ASSERT_EQ(kExpectedEIP, state.threads()->at(0)->frames()->at(0)->instruction); + ASSERT_EQ(&unloaded_module, state.threads()->at(0)->frames()->at(0)->module); +} + +TEST_F(MinidumpProcessorTest, TestCorruptMinidumps) { + MockMinidump dump; + TestSymbolSupplier supplier; + BasicSourceLineResolver resolver; + MinidumpProcessor processor(&supplier, &resolver); + ProcessState state; + + EXPECT_EQ(processor.Process("nonexistent minidump", &state), + google_breakpad::PROCESS_ERROR_MINIDUMP_NOT_FOUND); + + EXPECT_CALL(dump, path()).WillRepeatedly(Return("mock minidump")); + EXPECT_CALL(dump, Read()).WillRepeatedly(Return(true)); + + MDRawHeader fakeHeader; + fakeHeader.time_date_stamp = 0; + EXPECT_CALL(dump, header()). + WillOnce(Return(reinterpret_cast(NULL))). + WillRepeatedly(Return(&fakeHeader)); + + EXPECT_EQ(processor.Process(&dump, &state), + google_breakpad::PROCESS_ERROR_NO_MINIDUMP_HEADER); + + EXPECT_CALL(dump, GetThreadList()). + WillOnce(Return(reinterpret_cast(NULL))); + EXPECT_CALL(dump, GetSystemInfo()). + WillRepeatedly(Return(reinterpret_cast(NULL))); + + EXPECT_EQ(processor.Process(&dump, &state), + google_breakpad::PROCESS_ERROR_NO_THREAD_LIST); +} + +// This test case verifies that the symbol supplier is only consulted +// once per minidump per module. +TEST_F(MinidumpProcessorTest, TestSymbolSupplierLookupCounts) { + MockSymbolSupplier supplier; + BasicSourceLineResolver resolver; + MinidumpProcessor processor(&supplier, &resolver); + + string minidump_file = GetTestDataPath() + "minidump2.dmp"; + ProcessState state; + EXPECT_CALL(supplier, GetCStringSymbolData( + Property(&google_breakpad::CodeModule::code_file, + "c:\\test_app.exe"), + _, _, _, _)).WillOnce(Return(SymbolSupplier::NOT_FOUND)); + EXPECT_CALL(supplier, GetCStringSymbolData( + Property(&google_breakpad::CodeModule::code_file, + Ne("c:\\test_app.exe")), + _, _, _, _)).WillRepeatedly(Return(SymbolSupplier::NOT_FOUND)); + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + ASSERT_EQ(processor.Process(minidump_file, &state), + google_breakpad::PROCESS_OK); + + ASSERT_TRUE(Mock::VerifyAndClearExpectations(&supplier)); + + // We need to verify that across minidumps, the processor will refetch + // symbol files, even with the same symbol supplier. + EXPECT_CALL(supplier, GetCStringSymbolData( + Property(&google_breakpad::CodeModule::code_file, + "c:\\test_app.exe"), + _, _, _, _)).WillOnce(Return(SymbolSupplier::NOT_FOUND)); + EXPECT_CALL(supplier, GetCStringSymbolData( + Property(&google_breakpad::CodeModule::code_file, + Ne("c:\\test_app.exe")), + _, _, _, _)).WillRepeatedly(Return(SymbolSupplier::NOT_FOUND)); + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + ASSERT_EQ(processor.Process(minidump_file, &state), + google_breakpad::PROCESS_OK); +} + +TEST_F(MinidumpProcessorTest, TestBasicProcessing) { + TestSymbolSupplier supplier; + BasicSourceLineResolver resolver; + MinidumpProcessor processor(&supplier, &resolver); + + string minidump_file = GetTestDataPath() + "minidump2.dmp"; + + ProcessState state; + ASSERT_EQ(processor.Process(minidump_file, &state), + google_breakpad::PROCESS_OK); + ASSERT_EQ(state.system_info()->os, kSystemInfoOS); + ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort); + ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion); + ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU); + ASSERT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo); + ASSERT_TRUE(state.crashed()); + ASSERT_EQ(state.crash_reason(), "EXCEPTION_ACCESS_VIOLATION_WRITE"); + ASSERT_EQ(state.crash_address(), 0x45U); + ASSERT_EQ(state.threads()->size(), size_t(1)); + EXPECT_EQ((*state.threads())[0]->tid(), 3060U); + ASSERT_EQ(state.requesting_thread(), 0); + EXPECT_EQ(1171480435U, state.time_date_stamp()); + EXPECT_EQ(1171480435U, state.process_create_time()); + + CallStack* stack = state.threads()->at(0); + ASSERT_TRUE(stack); + ASSERT_EQ(stack->frames()->size(), 4U); + + ASSERT_TRUE(stack->frames()->at(0)->module); + ASSERT_EQ(stack->frames()->at(0)->module->base_address(), 0x400000U); + ASSERT_EQ(stack->frames()->at(0)->module->code_file(), "c:\\test_app.exe"); + ASSERT_EQ(stack->frames()->at(0)->function_name, + "`anonymous namespace'::CrashFunction"); + ASSERT_EQ(stack->frames()->at(0)->source_file_name, "c:\\test_app.cc"); + ASSERT_EQ(stack->frames()->at(0)->source_line, 58); + + ASSERT_TRUE(stack->frames()->at(1)->module); + ASSERT_EQ(stack->frames()->at(1)->module->base_address(), 0x400000U); + ASSERT_EQ(stack->frames()->at(1)->module->code_file(), "c:\\test_app.exe"); + ASSERT_EQ(stack->frames()->at(1)->function_name, "main"); + ASSERT_EQ(stack->frames()->at(1)->source_file_name, "c:\\test_app.cc"); + ASSERT_EQ(stack->frames()->at(1)->source_line, 65); + + // This comes from the CRT + ASSERT_TRUE(stack->frames()->at(2)->module); + ASSERT_EQ(stack->frames()->at(2)->module->base_address(), 0x400000U); + ASSERT_EQ(stack->frames()->at(2)->module->code_file(), "c:\\test_app.exe"); + ASSERT_EQ(stack->frames()->at(2)->function_name, "__tmainCRTStartup"); + ASSERT_EQ(stack->frames()->at(2)->source_file_name, + "f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0.c"); + ASSERT_EQ(stack->frames()->at(2)->source_line, 327); + + // No debug info available for kernel32.dll + ASSERT_TRUE(stack->frames()->at(3)->module); + ASSERT_EQ(stack->frames()->at(3)->module->base_address(), 0x7c800000U); + ASSERT_EQ(stack->frames()->at(3)->module->code_file(), + "C:\\WINDOWS\\system32\\kernel32.dll"); + ASSERT_TRUE(stack->frames()->at(3)->function_name.empty()); + ASSERT_TRUE(stack->frames()->at(3)->source_file_name.empty()); + ASSERT_EQ(stack->frames()->at(3)->source_line, 0); + + ASSERT_EQ(state.modules()->module_count(), 13U); + ASSERT_TRUE(state.modules()->GetMainModule()); + ASSERT_EQ(state.modules()->GetMainModule()->code_file(), "c:\\test_app.exe"); + ASSERT_FALSE(state.modules()->GetModuleForAddress(0)); + ASSERT_EQ(state.modules()->GetMainModule(), + state.modules()->GetModuleForAddress(0x400000)); + ASSERT_EQ(state.modules()->GetModuleForAddress(0x7c801234)->debug_file(), + "kernel32.pdb"); + ASSERT_EQ(state.modules()->GetModuleForAddress(0x77d43210)->version(), + "5.1.2600.2622"); + + // Test that disabled exploitability engine defaults to + // EXPLOITABILITY_NOT_ANALYZED. + ASSERT_EQ(google_breakpad::EXPLOITABILITY_NOT_ANALYZED, + state.exploitability()); + + // Test that the symbol supplier can interrupt processing + state.Clear(); + supplier.set_interrupt(true); + ASSERT_EQ(processor.Process(minidump_file, &state), + google_breakpad::PROCESS_SYMBOL_SUPPLIER_INTERRUPTED); +} + +TEST_F(MinidumpProcessorTest, TestThreadMissingMemory) { + MockMinidump dump; + EXPECT_CALL(dump, path()).WillRepeatedly(Return("mock minidump")); + EXPECT_CALL(dump, Read()).WillRepeatedly(Return(true)); + + MDRawHeader fake_header; + fake_header.time_date_stamp = 0; + EXPECT_CALL(dump, header()).WillRepeatedly(Return(&fake_header)); + + MDRawSystemInfo raw_system_info; + memset(&raw_system_info, 0, sizeof(raw_system_info)); + raw_system_info.processor_architecture = MD_CPU_ARCHITECTURE_X86; + raw_system_info.platform_id = MD_OS_WIN32_NT; + TestMinidumpSystemInfo dump_system_info(raw_system_info); + + EXPECT_CALL(dump, GetSystemInfo()). + WillRepeatedly(Return(&dump_system_info)); + + MockMinidumpThreadList thread_list; + EXPECT_CALL(dump, GetThreadList()). + WillOnce(Return(&thread_list)); + + MockMinidumpMemoryList memory_list; + EXPECT_CALL(dump, GetMemoryList()). + WillOnce(Return(&memory_list)); + + // Return a thread missing stack memory. + MockMinidumpThread no_memory_thread; + EXPECT_CALL(no_memory_thread, GetThreadID(_)). + WillRepeatedly(DoAll(SetArgumentPointee<0>(1), + Return(true))); + EXPECT_CALL(no_memory_thread, GetMemory()). + WillRepeatedly(Return(reinterpret_cast(NULL))); + + const uint64_t kTestStartOfMemoryRange = 0x1234; + EXPECT_CALL(no_memory_thread, GetStartOfStackMemoryRange()). + WillRepeatedly(Return(kTestStartOfMemoryRange)); + EXPECT_CALL(memory_list, GetMemoryRegionForAddress(kTestStartOfMemoryRange)). + WillRepeatedly(Return(reinterpret_cast(NULL))); + + MDRawContextX86 no_memory_thread_raw_context; + memset(&no_memory_thread_raw_context, 0, + sizeof(no_memory_thread_raw_context)); + no_memory_thread_raw_context.context_flags = MD_CONTEXT_X86_FULL; + const uint32_t kExpectedEIP = 0xabcd1234; + no_memory_thread_raw_context.eip = kExpectedEIP; + TestMinidumpContext no_memory_thread_context(no_memory_thread_raw_context); + EXPECT_CALL(no_memory_thread, GetContext()). + WillRepeatedly(Return(&no_memory_thread_context)); + + EXPECT_CALL(thread_list, thread_count()). + WillRepeatedly(Return(1)); + EXPECT_CALL(thread_list, GetThreadAtIndex(0)). + WillOnce(Return(&no_memory_thread)); + + MinidumpProcessor processor(reinterpret_cast(NULL), NULL); + ProcessState state; + EXPECT_EQ(processor.Process(&dump, &state), + google_breakpad::PROCESS_OK); + + // Should have a single thread with a single frame in it. + ASSERT_EQ(1U, state.threads()->size()); + ASSERT_EQ(1U, state.threads()->at(0)->frames()->size()); + ASSERT_EQ(kExpectedEIP, state.threads()->at(0)->frames()->at(0)->instruction); +} + +TEST_F(MinidumpProcessorTest, GetProcessCreateTime) { + const uint32_t kProcessCreateTime = 2000; + const uint32_t kTimeDateStamp = 5000; + MockMinidump dump; + EXPECT_CALL(dump, path()).WillRepeatedly(Return("mock minidump")); + EXPECT_CALL(dump, Read()).WillRepeatedly(Return(true)); + + // Set time of crash. + MDRawHeader fake_header; + fake_header.time_date_stamp = kTimeDateStamp; + EXPECT_CALL(dump, header()).WillRepeatedly(Return(&fake_header)); + + // Set process create time. + MDRawMiscInfo raw_misc_info; + memset(&raw_misc_info, 0, sizeof(raw_misc_info)); + raw_misc_info.process_create_time = kProcessCreateTime; + raw_misc_info.flags1 |= MD_MISCINFO_FLAGS1_PROCESS_TIMES; + google_breakpad::TestMinidumpMiscInfo dump_misc_info(raw_misc_info); + EXPECT_CALL(dump, GetMiscInfo()).WillRepeatedly(Return(&dump_misc_info)); + + // No threads + MockMinidumpThreadList thread_list; + EXPECT_CALL(dump, GetThreadList()).WillOnce(Return(&thread_list)); + EXPECT_CALL(thread_list, thread_count()).WillRepeatedly(Return(0)); + + MinidumpProcessor processor(reinterpret_cast(NULL), NULL); + ProcessState state; + EXPECT_EQ(google_breakpad::PROCESS_OK, processor.Process(&dump, &state)); + + // Verify the time stamps. + ASSERT_EQ(kTimeDateStamp, state.time_date_stamp()); + ASSERT_EQ(kProcessCreateTime, state.process_create_time()); +} + +TEST_F(MinidumpProcessorTest, TestThreadMissingContext) { + MockMinidump dump; + EXPECT_CALL(dump, path()).WillRepeatedly(Return("mock minidump")); + EXPECT_CALL(dump, Read()).WillRepeatedly(Return(true)); + + MDRawHeader fake_header; + fake_header.time_date_stamp = 0; + EXPECT_CALL(dump, header()).WillRepeatedly(Return(&fake_header)); + + MDRawSystemInfo raw_system_info; + memset(&raw_system_info, 0, sizeof(raw_system_info)); + raw_system_info.processor_architecture = MD_CPU_ARCHITECTURE_X86; + raw_system_info.platform_id = MD_OS_WIN32_NT; + TestMinidumpSystemInfo dump_system_info(raw_system_info); + + EXPECT_CALL(dump, GetSystemInfo()). + WillRepeatedly(Return(&dump_system_info)); + + MockMinidumpThreadList thread_list; + EXPECT_CALL(dump, GetThreadList()). + WillOnce(Return(&thread_list)); + + MockMinidumpMemoryList memory_list; + EXPECT_CALL(dump, GetMemoryList()). + WillOnce(Return(&memory_list)); + + // Return a thread missing a thread context. + MockMinidumpThread no_context_thread; + EXPECT_CALL(no_context_thread, GetThreadID(_)). + WillRepeatedly(DoAll(SetArgumentPointee<0>(1), + Return(true))); + EXPECT_CALL(no_context_thread, GetContext()). + WillRepeatedly(Return(reinterpret_cast(NULL))); + + // The memory contents don't really matter here, since it won't be used. + MockMinidumpMemoryRegion no_context_thread_memory(0x1234, "xxx"); + EXPECT_CALL(no_context_thread, GetMemory()). + WillRepeatedly(Return(&no_context_thread_memory)); + EXPECT_CALL(no_context_thread, GetStartOfStackMemoryRange()). + Times(0); + EXPECT_CALL(memory_list, GetMemoryRegionForAddress(_)). + Times(0); + + EXPECT_CALL(thread_list, thread_count()). + WillRepeatedly(Return(1)); + EXPECT_CALL(thread_list, GetThreadAtIndex(0)). + WillOnce(Return(&no_context_thread)); + + MinidumpProcessor processor(reinterpret_cast(NULL), NULL); + ProcessState state; + EXPECT_EQ(processor.Process(&dump, &state), + google_breakpad::PROCESS_OK); + + // Should have a single thread with zero frames. + ASSERT_EQ(1U, state.threads()->size()); + ASSERT_EQ(0U, state.threads()->at(0)->frames()->size()); +} + +TEST_F(MinidumpProcessorTest, Test32BitCrashingAddress) { + TestSymbolSupplier supplier; + BasicSourceLineResolver resolver; + MinidumpProcessor processor(&supplier, &resolver); + + string minidump_file = GetTestDataPath() + "minidump_32bit_crash_addr.dmp"; + + ProcessState state; + ASSERT_EQ(processor.Process(minidump_file, &state), + google_breakpad::PROCESS_OK); + ASSERT_EQ(state.system_info()->os, kSystemInfoOS); + ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort); + ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion); + ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU); + ASSERT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo); + ASSERT_TRUE(state.crashed()); + ASSERT_EQ(state.crash_reason(), "EXCEPTION_ACCESS_VIOLATION_WRITE"); + ASSERT_EQ(state.crash_address(), 0x45U); +} + +TEST_F(MinidumpProcessorTest, TestXStateAmd64ContextMinidump) { + // This tests if we can passively process a minidump with cet registers in its + // context. Dump is captured from a toy executable and is readable by windbg. + MinidumpProcessor processor(nullptr, nullptr /*&supplier, &resolver*/); + + string minidump_file = GetTestDataPath() + + "tiny-exe-with-cet-xsave.dmp"; + + ProcessState state; + ASSERT_EQ(processor.Process(minidump_file, &state), + google_breakpad::PROCESS_OK); + ASSERT_EQ(state.system_info()->os, "Windows NT"); + ASSERT_EQ(state.system_info()->os_version, "10.0.22000 282"); + ASSERT_EQ(state.system_info()->cpu, "amd64"); + ASSERT_EQ(state.system_info()->cpu_info, + "family 6 model 140 stepping 1"); + ASSERT_FALSE(state.crashed()); + ASSERT_EQ(state.threads()->size(), size_t(1)); + + // TODO: verify cetumsr and cetussp once these are supported by + // breakpad. +} + +TEST_F(MinidumpProcessorTest, TestFastFailException) { + // This tests if we can understand fastfail exception subcodes. + // Dump is captured from a toy executable and is readable by windbg. + MinidumpProcessor processor(nullptr, nullptr /*&supplier, &resolver*/); + + string minidump_file = GetTestDataPath() + + "tiny-exe-fastfail.dmp"; + + ProcessState state; + ASSERT_EQ(processor.Process(minidump_file, &state), + google_breakpad::PROCESS_OK); + ASSERT_TRUE(state.crashed()); + ASSERT_EQ(state.threads()->size(), size_t(4)); + ASSERT_EQ(state.crash_reason(), "FAST_FAIL_FATAL_APP_EXIT"); +} + +#ifdef __linux__ +TEST_F(MinidumpProcessorTest, TestNonCanonicalAddress) { + // This tests if we can correctly fixup non-canonical address GPF fault + // addresses. + // Dump is captured from a toy executable and is readable by windbg. + MinidumpProcessor processor(nullptr, nullptr /*&supplier, &resolver*/); + processor.set_enable_objdump(true); + + string minidump_file = GetTestDataPath() + + "write_av_non_canonical.dmp"; + + ProcessState state; + ASSERT_EQ(processor.Process(minidump_file, &state), + google_breakpad::PROCESS_OK); + ASSERT_TRUE(state.crashed()); + ASSERT_EQ(state.crash_address(), 0xfefefefefefefefeU); +} +#endif // __linux__ + +} // namespace + +int main(int argc, char* argv[]) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/src/processor/minidump_stackwalk.cc b/src/processor/minidump_stackwalk.cc new file mode 100644 index 0000000..74b41ac --- /dev/null +++ b/src/processor/minidump_stackwalk.cc @@ -0,0 +1,197 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_stackwalk.cc: Process a minidump with MinidumpProcessor, printing +// the results, including stack traces. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include +#include +#include + +#include "common/path_helper.h" +#include "common/scoped_ptr.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/minidump.h" +#include "google_breakpad/processor/minidump_processor.h" +#include "google_breakpad/processor/process_state.h" +#include "processor/logging.h" +#include "processor/simple_symbol_supplier.h" +#include "processor/stackwalk_common.h" + + +namespace { + +struct Options { + bool machine_readable; + bool output_stack_contents; + bool output_requesting_thread_only; + bool brief; + + string minidump_file; + std::vector symbol_paths; +}; + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::Minidump; +using google_breakpad::MinidumpMemoryList; +using google_breakpad::MinidumpThreadList; +using google_breakpad::MinidumpProcessor; +using google_breakpad::ProcessState; +using google_breakpad::SimpleSymbolSupplier; +using google_breakpad::scoped_ptr; + +// Processes |options.minidump_file| using MinidumpProcessor. +// |options.symbol_path|, if non-empty, is the base directory of a +// symbol storage area, laid out in the format required by +// SimpleSymbolSupplier. If such a storage area is specified, it is +// made available for use by the MinidumpProcessor. +// +// Returns the value of MinidumpProcessor::Process. If processing succeeds, +// prints identifying OS and CPU information from the minidump, crash +// information if the minidump was produced as a result of a crash, and +// call stacks for each thread contained in the minidump. All information +// is printed to stdout. +bool PrintMinidumpProcess(const Options& options) { + scoped_ptr symbol_supplier; + if (!options.symbol_paths.empty()) { + // TODO(mmentovai): check existence of symbol_path if specified? + symbol_supplier.reset(new SimpleSymbolSupplier(options.symbol_paths)); + } + + BasicSourceLineResolver resolver; + MinidumpProcessor minidump_processor(symbol_supplier.get(), &resolver); + + // Increase the maximum number of threads and regions. + MinidumpThreadList::set_max_threads(std::numeric_limits::max()); + MinidumpMemoryList::set_max_regions(std::numeric_limits::max()); + // Process the minidump. + Minidump dump(options.minidump_file); + if (!dump.Read()) { + BPLOG(ERROR) << "Minidump " << dump.path() << " could not be read"; + return false; + } + ProcessState process_state; + if (minidump_processor.Process(&dump, &process_state) != + google_breakpad::PROCESS_OK) { + BPLOG(ERROR) << "MinidumpProcessor::Process failed"; + return false; + } + + if (options.machine_readable) { + PrintProcessStateMachineReadable(process_state); + } else if (options.brief) { + PrintRequestingThreadBrief(process_state); + } else { + PrintProcessState(process_state, options.output_stack_contents, + options.output_requesting_thread_only, &resolver); + } + + return true; +} + +} // namespace + +static void Usage(int argc, const char *argv[], bool error) { + fprintf(error ? stderr : stdout, + "Usage: %s [options] [symbol-path ...]\n" + "\n" + "Output a stack trace for the provided minidump\n" + "\n" + "Options:\n" + "\n" + " -m Output in machine-readable format\n" + " -s Output stack contents\n" + " -c Output thread that causes crash or dump only\n" + " -b Brief of the thread that causes crash or dump\n", + google_breakpad::BaseName(argv[0]).c_str()); +} + +static void SetupOptions(int argc, const char *argv[], Options* options) { + int ch; + + options->machine_readable = false; + options->output_stack_contents = false; + options->output_requesting_thread_only = false; + options->brief = false; + + while ((ch = getopt(argc, (char* const*)argv, "bchms")) != -1) { + switch (ch) { + case 'h': + Usage(argc, argv, false); + exit(0); + break; + + case 'b': + options->brief = true; + break; + case 'c': + options->output_requesting_thread_only = true; + break; + case 'm': + options->machine_readable = true; + break; + case 's': + options->output_stack_contents = true; + break; + + case '?': + Usage(argc, argv, true); + exit(1); + break; + } + } + + if ((argc - optind) == 0) { + fprintf(stderr, "%s: Missing minidump file\n", argv[0]); + Usage(argc, argv, true); + exit(1); + } + + options->minidump_file = argv[optind]; + + for (int argi = optind + 1; argi < argc; ++argi) + options->symbol_paths.push_back(argv[argi]); +} + +int main(int argc, const char* argv[]) { + Options options; + SetupOptions(argc, argv, &options); + + return PrintMinidumpProcess(options) ? 0 : 1; +} diff --git a/src/processor/minidump_stackwalk_machine_readable_test b/src/processor/minidump_stackwalk_machine_readable_test new file mode 100644 index 0000000..8467218 --- /dev/null +++ b/src/processor/minidump_stackwalk_machine_readable_test @@ -0,0 +1,36 @@ +#!/bin/sh + +# Copyright 2007 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +testdata_dir=$srcdir/src/processor/testdata +./src/processor/minidump_stackwalk -m $testdata_dir/minidump2.dmp \ + $testdata_dir/symbols | \ + tr -d '\015' | \ + diff -u $testdata_dir/minidump2.stackwalk.machine_readable.out - +exit $? diff --git a/src/processor/minidump_stackwalk_test b/src/processor/minidump_stackwalk_test new file mode 100644 index 0000000..c7da9c4 --- /dev/null +++ b/src/processor/minidump_stackwalk_test @@ -0,0 +1,36 @@ +#!/bin/sh + +# Copyright 2006 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +testdata_dir=$srcdir/src/processor/testdata +./src/processor/minidump_stackwalk $testdata_dir/minidump2.dmp \ + $testdata_dir/symbols | \ + tr -d '\015' | \ + diff -u $testdata_dir/minidump2.stackwalk.out - +exit $? diff --git a/src/processor/minidump_unittest.cc b/src/processor/minidump_unittest.cc new file mode 100644 index 0000000..719adf7 --- /dev/null +++ b/src/processor/minidump_unittest.cc @@ -0,0 +1,1668 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Unit test for Minidump. Uses a pre-generated minidump and +// verifies that certain streams are correct. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/minidump.h" +#include "processor/logging.h" +#include "processor/synth_minidump.h" + +namespace { + +using google_breakpad::Minidump; +using google_breakpad::MinidumpContext; +using google_breakpad::MinidumpCrashpadInfo; +using google_breakpad::MinidumpException; +using google_breakpad::MinidumpMemoryInfo; +using google_breakpad::MinidumpMemoryInfoList; +using google_breakpad::MinidumpMemoryList; +using google_breakpad::MinidumpMemoryRegion; +using google_breakpad::MinidumpModule; +using google_breakpad::MinidumpModuleList; +using google_breakpad::MinidumpSystemInfo; +using google_breakpad::MinidumpUnloadedModule; +using google_breakpad::MinidumpUnloadedModuleList; +using google_breakpad::MinidumpThread; +using google_breakpad::MinidumpThreadList; +using google_breakpad::SynthMinidump::Context; +using google_breakpad::SynthMinidump::Dump; +using google_breakpad::SynthMinidump::Exception; +using google_breakpad::SynthMinidump::Memory; +using google_breakpad::SynthMinidump::Module; +using google_breakpad::SynthMinidump::UnloadedModule; +using google_breakpad::SynthMinidump::Section; +using google_breakpad::SynthMinidump::Stream; +using google_breakpad::SynthMinidump::String; +using google_breakpad::SynthMinidump::SystemInfo; +using google_breakpad::SynthMinidump::Thread; +using google_breakpad::test_assembler::kBigEndian; +using google_breakpad::test_assembler::kLittleEndian; +using std::ifstream; +using std::istringstream; +using std::vector; +using ::testing::Return; + +class MinidumpTest : public ::testing::Test { +public: + void SetUp() { + minidump_file_ = string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/processor/testdata/minidump2.dmp"; + } + string minidump_file_; +}; + +TEST_F(MinidumpTest, TestMinidumpFromFile) { + Minidump minidump(minidump_file_); + ASSERT_EQ(minidump.path(), minidump_file_); + ASSERT_TRUE(minidump.Read()); + const MDRawHeader* header = minidump.header(); + ASSERT_NE(header, (MDRawHeader*)NULL); + ASSERT_EQ(header->signature, uint32_t(MD_HEADER_SIGNATURE)); + + MinidumpModuleList* md_module_list = minidump.GetModuleList(); + ASSERT_TRUE(md_module_list != NULL); + const MinidumpModule* md_module = md_module_list->GetModuleAtIndex(0); + ASSERT_TRUE(md_module != NULL); + ASSERT_EQ("c:\\test_app.exe", md_module->code_file()); + ASSERT_EQ("c:\\test_app.pdb", md_module->debug_file()); + ASSERT_EQ("45D35F6C2d000", md_module->code_identifier()); + ASSERT_EQ("5A9832E5287241C1838ED98914E9B7FF1", md_module->debug_identifier()); +} + +TEST_F(MinidumpTest, TestMinidumpFromStream) { + // read minidump contents into memory, construct a stringstream around them + ifstream file_stream(minidump_file_.c_str(), std::ios::in); + ASSERT_TRUE(file_stream.good()); + vector bytes; + file_stream.seekg(0, std::ios_base::end); + ASSERT_TRUE(file_stream.good()); + bytes.resize(file_stream.tellg()); + file_stream.seekg(0, std::ios_base::beg); + ASSERT_TRUE(file_stream.good()); + file_stream.read(&bytes[0], bytes.size()); + ASSERT_TRUE(file_stream.good()); + string str(&bytes[0], bytes.size()); + istringstream stream(str); + ASSERT_TRUE(stream.good()); + + // now read minidump from stringstream + Minidump minidump(stream); + ASSERT_EQ(minidump.path(), ""); + ASSERT_TRUE(minidump.Read()); + const MDRawHeader* header = minidump.header(); + ASSERT_NE(header, (MDRawHeader*)NULL); + ASSERT_EQ(header->signature, uint32_t(MD_HEADER_SIGNATURE)); + //TODO: add more checks here +} + +TEST_F(MinidumpTest, TestMinidumpWithCrashpadAnnotations) { + string crashpad_minidump_file = + string(getenv("srcdir") ? getenv("srcdir") : ".") + + "/src/processor/testdata/minidump_crashpad_annotation.dmp"; + + Minidump minidump(crashpad_minidump_file); + ASSERT_EQ(minidump.path(), crashpad_minidump_file); + ASSERT_TRUE(minidump.Read()); + + MinidumpCrashpadInfo* crashpad_info = minidump.GetCrashpadInfo(); + ASSERT_TRUE(crashpad_info != NULL); + + const std::vector>* + annotation_objects_list = + crashpad_info->GetModuleCrashpadInfoAnnotationObjects(); + ASSERT_EQ(2U, annotation_objects_list->size()); + + std::vector annotation_objects = + annotation_objects_list->at(0); + ASSERT_EQ(5U, annotation_objects.size()); + + std::vector annotation_names; + for (size_t i = 0; i < annotation_objects.size(); i++) { + MinidumpCrashpadInfo::AnnotationObject annotation_object = + annotation_objects.at(i); + annotation_names.push_back(annotation_object.name); + ASSERT_TRUE(annotation_object.type > 0); + ASSERT_TRUE(annotation_object.value.size() > 0); + } + + std::vector expected_strings{ + "exceptionReason", "exceptionName", "firstexception_bt", "firstexception", + "CounterAnnotation"}; + ASSERT_EQ(annotation_names, expected_strings); +} + +TEST(Dump, ReadBackEmpty) { + Dump dump(0); + dump.Finish(); + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream stream(contents); + Minidump minidump(stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(0U, minidump.GetDirectoryEntryCount()); +} + +TEST(Dump, ReadBackEmptyBigEndian) { + Dump big_minidump(0, kBigEndian); + big_minidump.Finish(); + string contents; + ASSERT_TRUE(big_minidump.GetContents(&contents)); + istringstream stream(contents); + Minidump minidump(stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(0U, minidump.GetDirectoryEntryCount()); +} + +TEST(Dump, OneStream) { + Dump dump(0, kBigEndian); + Stream stream(dump, 0xfbb7fa2bU); + stream.Append("stream contents"); + dump.Add(&stream); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); + + const MDRawDirectory* dir = minidump.GetDirectoryEntryAtIndex(0); + ASSERT_TRUE(dir != NULL); + EXPECT_EQ(0xfbb7fa2bU, dir->stream_type); + + uint32_t stream_length; + ASSERT_TRUE(minidump.SeekToStreamType(0xfbb7fa2bU, &stream_length)); + ASSERT_EQ(15U, stream_length); + char stream_contents[15]; + ASSERT_TRUE(minidump.ReadBytes(stream_contents, sizeof(stream_contents))); + EXPECT_EQ(string("stream contents"), + string(stream_contents, sizeof(stream_contents))); + + EXPECT_FALSE(minidump.GetThreadList()); + EXPECT_FALSE(minidump.GetModuleList()); + EXPECT_FALSE(minidump.GetMemoryList()); + EXPECT_FALSE(minidump.GetException()); + EXPECT_FALSE(minidump.GetAssertion()); + EXPECT_FALSE(minidump.GetSystemInfo()); + EXPECT_FALSE(minidump.GetMiscInfo()); + EXPECT_FALSE(minidump.GetBreakpadInfo()); +} + +TEST(Dump, OneMemory) { + Dump dump(0, kBigEndian); + Memory memory(dump, 0x309d68010bd21b2cULL); + memory.Append("memory contents"); + dump.Add(&memory); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); + + const MDRawDirectory* dir = minidump.GetDirectoryEntryAtIndex(0); + ASSERT_TRUE(dir != NULL); + EXPECT_EQ((uint32_t) MD_MEMORY_LIST_STREAM, dir->stream_type); + + MinidumpMemoryList* memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(memory_list != NULL); + ASSERT_EQ(1U, memory_list->region_count()); + + MinidumpMemoryRegion* region1 = memory_list->GetMemoryRegionAtIndex(0); + ASSERT_EQ(0x309d68010bd21b2cULL, region1->GetBase()); + ASSERT_EQ(15U, region1->GetSize()); + const uint8_t* region1_bytes = region1->GetMemory(); + ASSERT_TRUE(memcmp("memory contents", region1_bytes, 15) == 0); +} + +// One thread --- and its requisite entourage. +TEST(Dump, OneThread) { + Dump dump(0, kLittleEndian); + Memory stack(dump, 0x2326a0fa); + stack.Append("stack for thread"); + + MDRawContextX86 raw_context; + const uint32_t kExpectedEIP = 0x6913f540; + raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL; + raw_context.edi = 0x3ecba80d; + raw_context.esi = 0x382583b9; + raw_context.ebx = 0x7fccc03f; + raw_context.edx = 0xf62f8ec2; + raw_context.ecx = 0x46a6a6a8; + raw_context.eax = 0x6a5025e2; + raw_context.ebp = 0xd9fabb4a; + raw_context.eip = kExpectedEIP; + raw_context.cs = 0xbffe6eda; + raw_context.eflags = 0xb2ce1e2d; + raw_context.esp = 0x659caaa4; + raw_context.ss = 0x2e951ef7; + Context context(dump, raw_context); + + Thread thread(dump, 0xa898f11b, stack, context, + 0x9e39439f, 0x4abfc15f, 0xe499898a, 0x0d43e939dcfd0372ULL); + + dump.Add(&stack); + dump.Add(&context); + dump.Add(&thread); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); + + MinidumpMemoryList* md_memory_list = minidump.GetMemoryList(); + ASSERT_TRUE(md_memory_list != NULL); + ASSERT_EQ(1U, md_memory_list->region_count()); + + MinidumpMemoryRegion* md_region = md_memory_list->GetMemoryRegionAtIndex(0); + ASSERT_EQ(0x2326a0faU, md_region->GetBase()); + ASSERT_EQ(16U, md_region->GetSize()); + const uint8_t* region_bytes = md_region->GetMemory(); + ASSERT_TRUE(memcmp("stack for thread", region_bytes, 16) == 0); + + MinidumpThreadList* thread_list = minidump.GetThreadList(); + ASSERT_TRUE(thread_list != NULL); + ASSERT_EQ(1U, thread_list->thread_count()); + + MinidumpThread* md_thread = thread_list->GetThreadAtIndex(0); + ASSERT_TRUE(md_thread != NULL); + uint32_t thread_id; + ASSERT_TRUE(md_thread->GetThreadID(&thread_id)); + ASSERT_EQ(0xa898f11bU, thread_id); + MinidumpMemoryRegion* md_stack = md_thread->GetMemory(); + ASSERT_TRUE(md_stack != NULL); + ASSERT_EQ(0x2326a0faU, md_stack->GetBase()); + ASSERT_EQ(16U, md_stack->GetSize()); + const uint8_t* md_stack_bytes = md_stack->GetMemory(); + ASSERT_TRUE(memcmp("stack for thread", md_stack_bytes, 16) == 0); + + MinidumpContext* md_context = md_thread->GetContext(); + ASSERT_TRUE(md_context != NULL); + ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU()); + + uint64_t eip; + ASSERT_TRUE(md_context->GetInstructionPointer(&eip)); + EXPECT_EQ(kExpectedEIP, eip); + + const MDRawContextX86* md_raw_context = md_context->GetContextX86(); + ASSERT_TRUE(md_raw_context != NULL); + ASSERT_EQ((uint32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL), + (md_raw_context->context_flags + & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL))); + EXPECT_EQ(0x3ecba80dU, raw_context.edi); + EXPECT_EQ(0x382583b9U, raw_context.esi); + EXPECT_EQ(0x7fccc03fU, raw_context.ebx); + EXPECT_EQ(0xf62f8ec2U, raw_context.edx); + EXPECT_EQ(0x46a6a6a8U, raw_context.ecx); + EXPECT_EQ(0x6a5025e2U, raw_context.eax); + EXPECT_EQ(0xd9fabb4aU, raw_context.ebp); + EXPECT_EQ(kExpectedEIP, raw_context.eip); + EXPECT_EQ(0xbffe6edaU, raw_context.cs); + EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags); + EXPECT_EQ(0x659caaa4U, raw_context.esp); + EXPECT_EQ(0x2e951ef7U, raw_context.ss); +} + +TEST(Dump, ThreadMissingMemory) { + Dump dump(0, kLittleEndian); + Memory stack(dump, 0x2326a0fa); + // Stack has no contents. + + MDRawContextX86 raw_context; + memset(&raw_context, 0, sizeof(raw_context)); + raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL; + Context context(dump, raw_context); + + Thread thread(dump, 0xa898f11b, stack, context, + 0x9e39439f, 0x4abfc15f, 0xe499898a, 0x0d43e939dcfd0372ULL); + + dump.Add(&stack); + dump.Add(&context); + dump.Add(&thread); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); + + // This should succeed even though the thread has no stack memory. + MinidumpThreadList* thread_list = minidump.GetThreadList(); + ASSERT_TRUE(thread_list != NULL); + ASSERT_EQ(1U, thread_list->thread_count()); + + MinidumpThread* md_thread = thread_list->GetThreadAtIndex(0); + ASSERT_TRUE(md_thread != NULL); + + uint32_t thread_id; + ASSERT_TRUE(md_thread->GetThreadID(&thread_id)); + ASSERT_EQ(0xa898f11bU, thread_id); + + MinidumpContext* md_context = md_thread->GetContext(); + ASSERT_NE(reinterpret_cast(NULL), md_context); + + MinidumpMemoryRegion* md_stack = md_thread->GetMemory(); + ASSERT_EQ(reinterpret_cast(NULL), md_stack); +} + +TEST(Dump, ThreadMissingContext) { + Dump dump(0, kLittleEndian); + Memory stack(dump, 0x2326a0fa); + stack.Append("stack for thread"); + + // Context is empty. + Context context(dump); + + Thread thread(dump, 0xa898f11b, stack, context, + 0x9e39439f, 0x4abfc15f, 0xe499898a, 0x0d43e939dcfd0372ULL); + + dump.Add(&stack); + dump.Add(&context); + dump.Add(&thread); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); + + // This should succeed even though the thread has no stack memory. + MinidumpThreadList* thread_list = minidump.GetThreadList(); + ASSERT_TRUE(thread_list != NULL); + ASSERT_EQ(1U, thread_list->thread_count()); + + MinidumpThread* md_thread = thread_list->GetThreadAtIndex(0); + ASSERT_TRUE(md_thread != NULL); + + uint32_t thread_id; + ASSERT_TRUE(md_thread->GetThreadID(&thread_id)); + ASSERT_EQ(0xa898f11bU, thread_id); + MinidumpMemoryRegion* md_stack = md_thread->GetMemory(); + ASSERT_NE(reinterpret_cast(NULL), md_stack); + + MinidumpContext* md_context = md_thread->GetContext(); + ASSERT_EQ(reinterpret_cast(NULL), md_context); +} + +TEST(Dump, OneUnloadedModule) { + Dump dump(0, kBigEndian); + String module_name(dump, "unloaded module"); + + String csd_version(dump, "Windows 9000"); + SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version); + + UnloadedModule unloaded_module( + dump, + 0xa90206ca83eb2852ULL, + 0xada542bd, + module_name, + 0x34571371, + 0xb1054d2a); + + dump.Add(&unloaded_module); + dump.Add(&module_name); + dump.Add(&system_info); + dump.Add(&csd_version); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); + + const MDRawDirectory* dir = minidump.GetDirectoryEntryAtIndex(1); + ASSERT_TRUE(dir != NULL); + EXPECT_EQ((uint32_t) MD_UNLOADED_MODULE_LIST_STREAM, dir->stream_type); + + MinidumpUnloadedModuleList* md_unloaded_module_list = + minidump.GetUnloadedModuleList(); + ASSERT_TRUE(md_unloaded_module_list != NULL); + ASSERT_EQ(1U, md_unloaded_module_list->module_count()); + + const MinidumpUnloadedModule* md_unloaded_module = + md_unloaded_module_list->GetModuleAtIndex(0); + ASSERT_TRUE(md_unloaded_module != NULL); + ASSERT_EQ(0xa90206ca83eb2852ULL, md_unloaded_module->base_address()); + ASSERT_EQ(0xada542bd, md_unloaded_module->size()); + ASSERT_EQ("unloaded module", md_unloaded_module->code_file()); + ASSERT_EQ("", md_unloaded_module->debug_file()); + // time_date_stamp and size_of_image concatenated + ASSERT_EQ("B1054D2Aada542bd", md_unloaded_module->code_identifier()); + ASSERT_EQ("", md_unloaded_module->debug_identifier()); + + const MDRawUnloadedModule* md_raw_unloaded_module = + md_unloaded_module->module(); + ASSERT_TRUE(md_raw_unloaded_module != NULL); + ASSERT_EQ(0xb1054d2aU, md_raw_unloaded_module->time_date_stamp); + ASSERT_EQ(0x34571371U, md_raw_unloaded_module->checksum); +} + +static const MDVSFixedFileInfo fixed_file_info = { + 0xb2fba33a, // signature + 0x33d7a728, // struct_version + 0x31afcb20, // file_version_hi + 0xe51cdab1, // file_version_lo + 0xd1ea6907, // product_version_hi + 0x03032857, // product_version_lo + 0x11bf71d7, // file_flags_mask + 0x5fb8cdbf, // file_flags + 0xe45d0d5d, // file_os + 0x107d9562, // file_type + 0x5a8844d4, // file_subtype + 0xa8d30b20, // file_date_hi + 0x651c3e4e // file_date_lo +}; + +TEST(Dump, OneModule) { + Dump dump(0, kBigEndian); + String module_name(dump, "single module"); + Section cv_info(dump); + cv_info + .D32(MD_CVINFOPDB70_SIGNATURE) // signature + // signature, a MDGUID + .D32(0xabcd1234) + .D16(0xf00d) + .D16(0xbeef) + .Append("\x01\x02\x03\x04\x05\x06\x07\x08") + .D32(1) // age + .AppendCString("c:\\foo\\file.pdb"); // pdb_file_name + + String csd_version(dump, "Windows 9000"); + SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version); + + Module module(dump, 0xa90206ca83eb2852ULL, 0xada542bd, + module_name, + 0xb1054d2a, + 0x34571371, + fixed_file_info, // from synth_minidump_unittest_data.h + &cv_info, nullptr); + + dump.Add(&module); + dump.Add(&module_name); + dump.Add(&cv_info); + dump.Add(&system_info); + dump.Add(&csd_version); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); + + const MDRawDirectory* dir = minidump.GetDirectoryEntryAtIndex(1); + ASSERT_TRUE(dir != NULL); + EXPECT_EQ((uint32_t) MD_MODULE_LIST_STREAM, dir->stream_type); + + MinidumpModuleList* md_module_list = minidump.GetModuleList(); + ASSERT_TRUE(md_module_list != NULL); + ASSERT_EQ(1U, md_module_list->module_count()); + + const MinidumpModule* md_module = md_module_list->GetModuleAtIndex(0); + ASSERT_TRUE(md_module != NULL); + ASSERT_EQ(0xa90206ca83eb2852ULL, md_module->base_address()); + ASSERT_EQ(0xada542bd, md_module->size()); + ASSERT_EQ("single module", md_module->code_file()); + ASSERT_EQ("c:\\foo\\file.pdb", md_module->debug_file()); + // time_date_stamp and size_of_image concatenated + ASSERT_EQ("B1054D2Aada542bd", md_module->code_identifier()); + ASSERT_EQ("ABCD1234F00DBEEF01020304050607081", md_module->debug_identifier()); + + const MDRawModule* md_raw_module = md_module->module(); + ASSERT_TRUE(md_raw_module != NULL); + ASSERT_EQ(0xb1054d2aU, md_raw_module->time_date_stamp); + ASSERT_EQ(0x34571371U, md_raw_module->checksum); + ASSERT_TRUE(memcmp(&md_raw_module->version_info, &fixed_file_info, + sizeof(fixed_file_info)) == 0); +} + +// Test that a module with a MDCVInfoELF CV record is handled properly. +TEST(Dump, OneModuleCVELF) { + Dump dump(0, kLittleEndian); + String module_name(dump, "elf module"); + Section cv_info(dump); + cv_info + .D32(MD_CVINFOELF_SIGNATURE) // signature + // build_id + .Append("\x5f\xa9\xcd\xb4\x10\x53\xdf\x1b\x86\xfa\xb7\x33\xb4\xdf" + "\x37\x38\xce\xa3\x4a\x87"); + + const MDRawSystemInfo linux_x86 = { + MD_CPU_ARCHITECTURE_X86, // processor_architecture + 6, // processor_level + 0xd08, // processor_revision + 1, // number_of_processors + 0, // product_type + 0, // major_version + 0, // minor_version + 0, // build_number + MD_OS_LINUX, // platform_id + 0xdeadbeef, // csd_version_rva + 0x100, // suite_mask + 0, // reserved2 + { // cpu + { // x86_cpu_info + { 0x756e6547, 0x49656e69, 0x6c65746e }, // vendor_id + 0x6d8, // version_information + 0xafe9fbff, // feature_information + 0xffffffff // amd_extended_cpu_features + } + } + }; + String csd_version(dump, "Literally Linux"); + SystemInfo system_info(dump, linux_x86, csd_version); + + Module module(dump, 0xa90206ca83eb2852ULL, 0xada542bd, + module_name, + 0xb1054d2a, + 0x34571371, + fixed_file_info, // from synth_minidump_unittest_data.h + &cv_info, nullptr); + + dump.Add(&module); + dump.Add(&module_name); + dump.Add(&cv_info); + dump.Add(&system_info); + dump.Add(&csd_version); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + + MinidumpModuleList* md_module_list = minidump.GetModuleList(); + ASSERT_TRUE(md_module_list != NULL); + ASSERT_EQ(1U, md_module_list->module_count()); + + const MinidumpModule* md_module = md_module_list->GetModuleAtIndex(0); + ASSERT_TRUE(md_module != NULL); + ASSERT_EQ(0xa90206ca83eb2852ULL, md_module->base_address()); + ASSERT_EQ(0xada542bd, md_module->size()); + ASSERT_EQ("elf module", md_module->code_file()); + // debug_file == code_file + ASSERT_EQ("elf module", md_module->debug_file()); + // just the build_id, directly + ASSERT_EQ("5fa9cdb41053df1b86fab733b4df3738cea34a87", + md_module->code_identifier()); + // build_id truncted to GUID length and treated as such, with zero + // age appended + ASSERT_EQ("B4CDA95F53101BDF86FAB733B4DF37380", md_module->debug_identifier()); + + const MDRawModule* md_raw_module = md_module->module(); + ASSERT_TRUE(md_raw_module != NULL); + ASSERT_EQ(0xb1054d2aU, md_raw_module->time_date_stamp); + ASSERT_EQ(0x34571371U, md_raw_module->checksum); + ASSERT_TRUE(memcmp(&md_raw_module->version_info, &fixed_file_info, + sizeof(fixed_file_info)) == 0); +} + +// Test that a build_id that's shorter than a GUID is handled properly. +TEST(Dump, CVELFShort) { + Dump dump(0, kLittleEndian); + String module_name(dump, "elf module"); + Section cv_info(dump); + cv_info + .D32(MD_CVINFOELF_SIGNATURE) // signature + // build_id, shorter than a GUID + .Append("\x5f\xa9\xcd\xb4"); + + const MDRawSystemInfo linux_x86 = { + MD_CPU_ARCHITECTURE_X86, // processor_architecture + 6, // processor_level + 0xd08, // processor_revision + 1, // number_of_processors + 0, // product_type + 0, // major_version + 0, // minor_version + 0, // build_number + MD_OS_LINUX, // platform_id + 0xdeadbeef, // csd_version_rva + 0x100, // suite_mask + 0, // reserved2 + { // cpu + { // x86_cpu_info + { 0x756e6547, 0x49656e69, 0x6c65746e }, // vendor_id + 0x6d8, // version_information + 0xafe9fbff, // feature_information + 0xffffffff // amd_extended_cpu_features + } + } + }; + String csd_version(dump, "Literally Linux"); + SystemInfo system_info(dump, linux_x86, csd_version); + + Module module(dump, 0xa90206ca83eb2852ULL, 0xada542bd, + module_name, + 0xb1054d2a, + 0x34571371, + fixed_file_info, // from synth_minidump_unittest_data.h + &cv_info, nullptr); + + dump.Add(&module); + dump.Add(&module_name); + dump.Add(&cv_info); + dump.Add(&system_info); + dump.Add(&csd_version); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); + + MinidumpModuleList* md_module_list = minidump.GetModuleList(); + ASSERT_TRUE(md_module_list != NULL); + ASSERT_EQ(1U, md_module_list->module_count()); + + const MinidumpModule* md_module = md_module_list->GetModuleAtIndex(0); + ASSERT_TRUE(md_module != NULL); + // just the build_id, directly + ASSERT_EQ("5fa9cdb4", md_module->code_identifier()); + // build_id expanded to GUID length and treated as such, with zero + // age appended + ASSERT_EQ("B4CDA95F0000000000000000000000000", md_module->debug_identifier()); +} + +// Test that a build_id that's very long is handled properly. +TEST(Dump, CVELFLong) { + Dump dump(0, kLittleEndian); + String module_name(dump, "elf module"); + Section cv_info(dump); + cv_info + .D32(MD_CVINFOELF_SIGNATURE) // signature + // build_id, lots of bytes + .Append("\x5f\xa9\xcd\xb4\x10\x53\xdf\x1b\x86\xfa\xb7\x33\xb4\xdf" + "\x37\x38\xce\xa3\x4a\x87\x01\x02\x03\x04\x05\x06\x07\x08" + "\x09\x0a\x0b\x0c\x0d\x0e\x0f"); + + + const MDRawSystemInfo linux_x86 = { + MD_CPU_ARCHITECTURE_X86, // processor_architecture + 6, // processor_level + 0xd08, // processor_revision + 1, // number_of_processors + 0, // product_type + 0, // major_version + 0, // minor_version + 0, // build_number + MD_OS_LINUX, // platform_id + 0xdeadbeef, // csd_version_rva + 0x100, // suite_mask + 0, // reserved2 + { // cpu + { // x86_cpu_info + { 0x756e6547, 0x49656e69, 0x6c65746e }, // vendor_id + 0x6d8, // version_information + 0xafe9fbff, // feature_information + 0xffffffff // amd_extended_cpu_features + } + } + }; + String csd_version(dump, "Literally Linux"); + SystemInfo system_info(dump, linux_x86, csd_version); + + Module module(dump, 0xa90206ca83eb2852ULL, 0xada542bd, + module_name, + 0xb1054d2a, + 0x34571371, + fixed_file_info, // from synth_minidump_unittest_data.h + &cv_info, nullptr); + + dump.Add(&module); + dump.Add(&module_name); + dump.Add(&cv_info); + dump.Add(&system_info); + dump.Add(&csd_version); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); + + MinidumpModuleList* md_module_list = minidump.GetModuleList(); + ASSERT_TRUE(md_module_list != NULL); + ASSERT_EQ(1U, md_module_list->module_count()); + + const MinidumpModule* md_module = md_module_list->GetModuleAtIndex(0); + ASSERT_TRUE(md_module != NULL); + // just the build_id, directly + ASSERT_EQ( + "5fa9cdb41053df1b86fab733b4df3738cea34a870102030405060708090a0b0c0d0e0f", + md_module->code_identifier()); + // build_id truncated to GUID length and treated as such, with zero + // age appended. + ASSERT_EQ("B4CDA95F53101BDF86FAB733B4DF37380", md_module->debug_identifier()); +} + +TEST(Dump, OneSystemInfo) { + Dump dump(0, kLittleEndian); + String csd_version(dump, "Petulant Pierogi"); + SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version); + + dump.Add(&system_info); + dump.Add(&csd_version); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); + + const MDRawDirectory* dir = minidump.GetDirectoryEntryAtIndex(0); + ASSERT_TRUE(dir != NULL); + EXPECT_EQ((uint32_t) MD_SYSTEM_INFO_STREAM, dir->stream_type); + + MinidumpSystemInfo* md_system_info = minidump.GetSystemInfo(); + ASSERT_TRUE(md_system_info != NULL); + ASSERT_EQ("windows", md_system_info->GetOS()); + ASSERT_EQ("x86", md_system_info->GetCPU()); + ASSERT_EQ("Petulant Pierogi", *md_system_info->GetCSDVersion()); + ASSERT_EQ("GenuineIntel", *md_system_info->GetCPUVendor()); +} + +TEST(Dump, BigDump) { + Dump dump(0, kLittleEndian); + + // A SystemInfo stream. + String csd_version(dump, "Munificent Macaque"); + SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version); + dump.Add(&csd_version); + dump.Add(&system_info); + + // Five threads! + Memory stack0(dump, 0x70b9ebfc); + stack0.Append("stack for thread zero"); + MDRawContextX86 raw_context0; + raw_context0.context_flags = MD_CONTEXT_X86_INTEGER; + raw_context0.eip = 0xaf0709e4; + Context context0(dump, raw_context0); + Thread thread0(dump, 0xbbef4432, stack0, context0, + 0xd0377e7b, 0xdb8eb0cf, 0xd73bc314, 0x09d357bac7f9a163ULL); + dump.Add(&stack0); + dump.Add(&context0); + dump.Add(&thread0); + + Memory stack1(dump, 0xf988cc45); + stack1.Append("stack for thread one"); + MDRawContextX86 raw_context1; + raw_context1.context_flags = MD_CONTEXT_X86_INTEGER; + raw_context1.eip = 0xe4f56f81; + Context context1(dump, raw_context1); + Thread thread1(dump, 0x657c3f58, stack1, context1, + 0xa68fa182, 0x6f3cf8dd, 0xe3a78ccf, 0x78cc84775e4534bbULL); + dump.Add(&stack1); + dump.Add(&context1); + dump.Add(&thread1); + + Memory stack2(dump, 0xc8a92e7c); + stack2.Append("stack for thread two"); + MDRawContextX86 raw_context2; + raw_context2.context_flags = MD_CONTEXT_X86_INTEGER; + raw_context2.eip = 0xb336a438; + Context context2(dump, raw_context2); + Thread thread2(dump, 0xdf4b8a71, stack2, context2, + 0x674c26b6, 0x445d7120, 0x7e700c56, 0xd89bf778e7793e17ULL); + dump.Add(&stack2); + dump.Add(&context2); + dump.Add(&thread2); + + Memory stack3(dump, 0x36d08e08); + stack3.Append("stack for thread three"); + MDRawContextX86 raw_context3; + raw_context3.context_flags = MD_CONTEXT_X86_INTEGER; + raw_context3.eip = 0xdf99a60c; + Context context3(dump, raw_context3); + Thread thread3(dump, 0x86e6c341, stack3, context3, + 0x32dc5c55, 0x17a2aba8, 0xe0cc75e7, 0xa46393994dae83aeULL); + dump.Add(&stack3); + dump.Add(&context3); + dump.Add(&thread3); + + Memory stack4(dump, 0x1e0ab4fa); + stack4.Append("stack for thread four"); + MDRawContextX86 raw_context4; + raw_context4.context_flags = MD_CONTEXT_X86_INTEGER; + raw_context4.eip = 0xaa646267; + Context context4(dump, raw_context4); + Thread thread4(dump, 0x261a28d4, stack4, context4, + 0x6ebd389e, 0xa0cd4759, 0x30168846, 0x164f650a0cf39d35ULL); + dump.Add(&stack4); + dump.Add(&context4); + dump.Add(&thread4); + + // Three modules! + String module1_name(dump, "module one"); + Module module1(dump, 0xeb77da57b5d4cbdaULL, 0x83cd5a37, module1_name); + dump.Add(&module1_name); + dump.Add(&module1); + + String module2_name(dump, "module two"); + Module module2(dump, 0x8675884adfe5ac90ULL, 0xb11e4ea3, module2_name); + dump.Add(&module2_name); + dump.Add(&module2); + + String module3_name(dump, "module three"); + Module module3(dump, 0x95fc1544da321b6cULL, 0x7c2bf081, module3_name); + dump.Add(&module3_name); + dump.Add(&module3); + + // Unloaded modules! + uint64_t umodule1_base = 0xeb77da57b5d4cbdaULL; + uint32_t umodule1_size = 0x83cd5a37; + String umodule1_name(dump, "unloaded module one"); + UnloadedModule unloaded_module1(dump, umodule1_base, umodule1_size, + umodule1_name); + dump.Add(&umodule1_name); + dump.Add(&unloaded_module1); + + uint64_t umodule2_base = 0xeb77da57b5d4cbdaULL; + uint32_t umodule2_size = 0x83cd5a37; + String umodule2_name(dump, "unloaded module two"); + UnloadedModule unloaded_module2(dump, umodule2_base, umodule2_size, + umodule2_name); + dump.Add(&umodule2_name); + dump.Add(&unloaded_module2); + + uint64_t umodule3_base = 0xeb77da5839a20000ULL; + uint32_t umodule3_size = 0x83cd5a37; + String umodule3_name(dump, "unloaded module three"); + UnloadedModule unloaded_module3(dump, umodule3_base, umodule3_size, + umodule3_name); + dump.Add(&umodule3_name); + dump.Add(&unloaded_module3); + + + // Add one more memory region, on top of the five stacks. + Memory memory5(dump, 0x61979e828040e564ULL); + memory5.Append("contents of memory 5"); + dump.Add(&memory5); + + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(5U, minidump.GetDirectoryEntryCount()); + + // Check the threads. + MinidumpThreadList* thread_list = minidump.GetThreadList(); + ASSERT_TRUE(thread_list != NULL); + ASSERT_EQ(5U, thread_list->thread_count()); + uint32_t thread_id; + ASSERT_TRUE(thread_list->GetThreadAtIndex(0)->GetThreadID(&thread_id)); + ASSERT_EQ(0xbbef4432U, thread_id); + ASSERT_EQ(0x70b9ebfcU, + thread_list->GetThreadAtIndex(0)->GetMemory()->GetBase()); + ASSERT_EQ(0xaf0709e4U, + thread_list->GetThreadAtIndex(0)->GetContext()->GetContextX86() + ->eip); + + ASSERT_TRUE(thread_list->GetThreadAtIndex(1)->GetThreadID(&thread_id)); + ASSERT_EQ(0x657c3f58U, thread_id); + ASSERT_EQ(0xf988cc45U, + thread_list->GetThreadAtIndex(1)->GetMemory()->GetBase()); + ASSERT_EQ(0xe4f56f81U, + thread_list->GetThreadAtIndex(1)->GetContext()->GetContextX86() + ->eip); + + ASSERT_TRUE(thread_list->GetThreadAtIndex(2)->GetThreadID(&thread_id)); + ASSERT_EQ(0xdf4b8a71U, thread_id); + ASSERT_EQ(0xc8a92e7cU, + thread_list->GetThreadAtIndex(2)->GetMemory()->GetBase()); + ASSERT_EQ(0xb336a438U, + thread_list->GetThreadAtIndex(2)->GetContext()->GetContextX86() + ->eip); + + ASSERT_TRUE(thread_list->GetThreadAtIndex(3)->GetThreadID(&thread_id)); + ASSERT_EQ(0x86e6c341U, thread_id); + ASSERT_EQ(0x36d08e08U, + thread_list->GetThreadAtIndex(3)->GetMemory()->GetBase()); + ASSERT_EQ(0xdf99a60cU, + thread_list->GetThreadAtIndex(3)->GetContext()->GetContextX86() + ->eip); + + ASSERT_TRUE(thread_list->GetThreadAtIndex(4)->GetThreadID(&thread_id)); + ASSERT_EQ(0x261a28d4U, thread_id); + ASSERT_EQ(0x1e0ab4faU, + thread_list->GetThreadAtIndex(4)->GetMemory()->GetBase()); + ASSERT_EQ(0xaa646267U, + thread_list->GetThreadAtIndex(4)->GetContext()->GetContextX86() + ->eip); + + // Check the modules. + MinidumpModuleList* md_module_list = minidump.GetModuleList(); + ASSERT_TRUE(md_module_list != NULL); + ASSERT_EQ(3U, md_module_list->module_count()); + EXPECT_EQ(0xeb77da57b5d4cbdaULL, + md_module_list->GetModuleAtIndex(0)->base_address()); + EXPECT_EQ(0x8675884adfe5ac90ULL, + md_module_list->GetModuleAtIndex(1)->base_address()); + EXPECT_EQ(0x95fc1544da321b6cULL, + md_module_list->GetModuleAtIndex(2)->base_address()); + + // Check unloaded modules + MinidumpUnloadedModuleList* md_unloaded_module_list = + minidump.GetUnloadedModuleList(); + ASSERT_TRUE(md_unloaded_module_list != NULL); + ASSERT_EQ(3U, md_unloaded_module_list->module_count()); + EXPECT_EQ(umodule1_base, + md_unloaded_module_list->GetModuleAtIndex(0)->base_address()); + EXPECT_EQ(umodule2_base, + md_unloaded_module_list->GetModuleAtIndex(1)->base_address()); + EXPECT_EQ(umodule3_base, + md_unloaded_module_list->GetModuleAtIndex(2)->base_address()); + + const MinidumpUnloadedModule* umodule = + md_unloaded_module_list->GetModuleForAddress( + umodule1_base + umodule1_size / 2); + EXPECT_EQ(umodule1_base, umodule->base_address()); + + umodule = md_unloaded_module_list->GetModuleAtSequence(0); + EXPECT_EQ(umodule1_base, umodule->base_address()); + + EXPECT_EQ(NULL, md_unloaded_module_list->GetMainModule()); + +} + +TEST(Dump, OneMemoryInfo) { + Dump dump(0, kBigEndian); + Stream stream(dump, MD_MEMORY_INFO_LIST_STREAM); + + // Add the MDRawMemoryInfoList header. + const uint64_t kNumberOfEntries = 1; + stream.D32(sizeof(MDRawMemoryInfoList)) // size_of_header + .D32(sizeof(MDRawMemoryInfo)) // size_of_entry + .D64(kNumberOfEntries); // number_of_entries + + + // Now add a MDRawMemoryInfo entry. + const uint64_t kBaseAddress = 0x1000; + const uint64_t kRegionSize = 0x2000; + stream.D64(kBaseAddress) // base_address + .D64(kBaseAddress) // allocation_base + .D32(MD_MEMORY_PROTECT_EXECUTE_READWRITE) // allocation_protection + .D32(0) // __alignment1 + .D64(kRegionSize) // region_size + .D32(MD_MEMORY_STATE_COMMIT) // state + .D32(MD_MEMORY_PROTECT_EXECUTE_READWRITE) // protection + .D32(MD_MEMORY_TYPE_PRIVATE) // type + .D32(0); // __alignment2 + + dump.Add(&stream); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); + + const MDRawDirectory* dir = minidump.GetDirectoryEntryAtIndex(0); + ASSERT_TRUE(dir != NULL); + EXPECT_EQ((uint32_t) MD_MEMORY_INFO_LIST_STREAM, dir->stream_type); + + MinidumpMemoryInfoList* info_list = minidump.GetMemoryInfoList(); + ASSERT_TRUE(info_list != NULL); + ASSERT_EQ(1U, info_list->info_count()); + + const MinidumpMemoryInfo* info1 = info_list->GetMemoryInfoAtIndex(0); + ASSERT_EQ(kBaseAddress, info1->GetBase()); + ASSERT_EQ(kRegionSize, info1->GetSize()); + ASSERT_TRUE(info1->IsExecutable()); + ASSERT_TRUE(info1->IsWritable()); + + // Should get back the same memory region here. + const MinidumpMemoryInfo* info2 = + info_list->GetMemoryInfoForAddress(kBaseAddress + kRegionSize / 2); + ASSERT_EQ(kBaseAddress, info2->GetBase()); + ASSERT_EQ(kRegionSize, info2->GetSize()); +} + +TEST(Dump, OneExceptionX86) { + Dump dump(0, kLittleEndian); + + MDRawContextX86 raw_context; + raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL; + raw_context.edi = 0x3ecba80d; + raw_context.esi = 0x382583b9; + raw_context.ebx = 0x7fccc03f; + raw_context.edx = 0xf62f8ec2; + raw_context.ecx = 0x46a6a6a8; + raw_context.eax = 0x6a5025e2; + raw_context.ebp = 0xd9fabb4a; + raw_context.eip = 0x6913f540; + raw_context.cs = 0xbffe6eda; + raw_context.eflags = 0xb2ce1e2d; + raw_context.esp = 0x659caaa4; + raw_context.ss = 0x2e951ef7; + Context context(dump, raw_context); + + Exception exception(dump, context, + 0x1234abcd, // thread id + 0xdcba4321, // exception code + 0xf0e0d0c0, // exception flags + 0x0919a9b9c9d9e9f9ULL); // exception address + + dump.Add(&context); + dump.Add(&exception); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); + + MinidumpException* md_exception = minidump.GetException(); + ASSERT_TRUE(md_exception != NULL); + + uint32_t thread_id; + ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); + ASSERT_EQ(0x1234abcdU, thread_id); + + const MDRawExceptionStream* raw_exception = md_exception->exception(); + ASSERT_TRUE(raw_exception != NULL); + EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); + EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); + EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, + raw_exception->exception_record.exception_address); + + MinidumpContext* md_context = md_exception->GetContext(); + ASSERT_TRUE(md_context != NULL); + ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU()); + const MDRawContextX86* md_raw_context = md_context->GetContextX86(); + ASSERT_TRUE(md_raw_context != NULL); + ASSERT_EQ((uint32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL), + (md_raw_context->context_flags + & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL))); + EXPECT_EQ(0x3ecba80dU, raw_context.edi); + EXPECT_EQ(0x382583b9U, raw_context.esi); + EXPECT_EQ(0x7fccc03fU, raw_context.ebx); + EXPECT_EQ(0xf62f8ec2U, raw_context.edx); + EXPECT_EQ(0x46a6a6a8U, raw_context.ecx); + EXPECT_EQ(0x6a5025e2U, raw_context.eax); + EXPECT_EQ(0xd9fabb4aU, raw_context.ebp); + EXPECT_EQ(0x6913f540U, raw_context.eip); + EXPECT_EQ(0xbffe6edaU, raw_context.cs); + EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags); + EXPECT_EQ(0x659caaa4U, raw_context.esp); + EXPECT_EQ(0x2e951ef7U, raw_context.ss); +} + +TEST(Dump, OneExceptionX86XState) { + Dump dump(0, kLittleEndian); + + MDRawContextX86 raw_context; + raw_context.context_flags = MD_CONTEXT_X86_INTEGER | + MD_CONTEXT_X86_CONTROL | MD_CONTEXT_X86_XSTATE; + raw_context.edi = 0x3ecba80d; + raw_context.esi = 0x382583b9; + raw_context.ebx = 0x7fccc03f; + raw_context.edx = 0xf62f8ec2; + raw_context.ecx = 0x46a6a6a8; + raw_context.eax = 0x6a5025e2; + raw_context.ebp = 0xd9fabb4a; + raw_context.eip = 0x6913f540; + raw_context.cs = 0xbffe6eda; + raw_context.eflags = 0xb2ce1e2d; + raw_context.esp = 0x659caaa4; + raw_context.ss = 0x2e951ef7; + Context context(dump, raw_context); + + Exception exception(dump, context, + 0x1234abcd, // thread id + 0xdcba4321, // exception code + 0xf0e0d0c0, // exception flags + 0x0919a9b9c9d9e9f9ULL); // exception address + + dump.Add(&context); + dump.Add(&exception); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); + + MinidumpException* md_exception = minidump.GetException(); + ASSERT_TRUE(md_exception != NULL); + + uint32_t thread_id; + ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); + ASSERT_EQ(0x1234abcdU, thread_id); + + const MDRawExceptionStream* raw_exception = md_exception->exception(); + ASSERT_TRUE(raw_exception != NULL); + EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); + EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); + EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, + raw_exception->exception_record.exception_address); + + MinidumpContext* md_context = md_exception->GetContext(); + ASSERT_TRUE(md_context != NULL); + ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU()); + const MDRawContextX86* md_raw_context = md_context->GetContextX86(); + ASSERT_TRUE(md_raw_context != NULL); + ASSERT_EQ((uint32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL), + (md_raw_context->context_flags + & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL))); + EXPECT_EQ(0x3ecba80dU, raw_context.edi); + EXPECT_EQ(0x382583b9U, raw_context.esi); + EXPECT_EQ(0x7fccc03fU, raw_context.ebx); + EXPECT_EQ(0xf62f8ec2U, raw_context.edx); + EXPECT_EQ(0x46a6a6a8U, raw_context.ecx); + EXPECT_EQ(0x6a5025e2U, raw_context.eax); + EXPECT_EQ(0xd9fabb4aU, raw_context.ebp); + EXPECT_EQ(0x6913f540U, raw_context.eip); + EXPECT_EQ(0xbffe6edaU, raw_context.cs); + EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags); + EXPECT_EQ(0x659caaa4U, raw_context.esp); + EXPECT_EQ(0x2e951ef7U, raw_context.ss); +} + +// Testing that the CPU type can be loaded from a system info stream when +// the CPU flags are missing from the context_flags of an exception record +TEST(Dump, OneExceptionX86NoCPUFlags) { + Dump dump(0, kLittleEndian); + + MDRawContextX86 raw_context; + // Intentionally not setting CPU type in the context_flags + raw_context.context_flags = 0; + raw_context.edi = 0x3ecba80d; + raw_context.esi = 0x382583b9; + raw_context.ebx = 0x7fccc03f; + raw_context.edx = 0xf62f8ec2; + raw_context.ecx = 0x46a6a6a8; + raw_context.eax = 0x6a5025e2; + raw_context.ebp = 0xd9fabb4a; + raw_context.eip = 0x6913f540; + raw_context.cs = 0xbffe6eda; + raw_context.eflags = 0xb2ce1e2d; + raw_context.esp = 0x659caaa4; + raw_context.ss = 0x2e951ef7; + Context context(dump, raw_context); + + Exception exception(dump, context, + 0x1234abcd, // thread id + 0xdcba4321, // exception code + 0xf0e0d0c0, // exception flags + 0x0919a9b9c9d9e9f9ULL); // exception address + + dump.Add(&context); + dump.Add(&exception); + + // Add system info. This is needed as an alternative source for CPU type + // information. Note, that the CPU flags were intentionally skipped from + // the context_flags and this alternative source is required. + String csd_version(dump, "Service Pack 2"); + SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version); + dump.Add(&system_info); + dump.Add(&csd_version); + + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(2U, minidump.GetDirectoryEntryCount()); + + MinidumpException* md_exception = minidump.GetException(); + ASSERT_TRUE(md_exception != NULL); + + uint32_t thread_id; + ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); + ASSERT_EQ(0x1234abcdU, thread_id); + + const MDRawExceptionStream* raw_exception = md_exception->exception(); + ASSERT_TRUE(raw_exception != NULL); + EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); + EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); + EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, + raw_exception->exception_record.exception_address); + + MinidumpContext* md_context = md_exception->GetContext(); + ASSERT_TRUE(md_context != NULL); + + ASSERT_EQ((uint32_t) MD_CONTEXT_X86, md_context->GetContextCPU()); + const MDRawContextX86* md_raw_context = md_context->GetContextX86(); + ASSERT_TRUE(md_raw_context != NULL); + + // Even though the CPU flags were missing from the context_flags, the + // GetContext call above is expected to load the missing CPU flags from the + // system info stream and set the CPU type bits in context_flags. + ASSERT_EQ((uint32_t) (MD_CONTEXT_X86), md_raw_context->context_flags); + + EXPECT_EQ(0x3ecba80dU, raw_context.edi); + EXPECT_EQ(0x382583b9U, raw_context.esi); + EXPECT_EQ(0x7fccc03fU, raw_context.ebx); + EXPECT_EQ(0xf62f8ec2U, raw_context.edx); + EXPECT_EQ(0x46a6a6a8U, raw_context.ecx); + EXPECT_EQ(0x6a5025e2U, raw_context.eax); + EXPECT_EQ(0xd9fabb4aU, raw_context.ebp); + EXPECT_EQ(0x6913f540U, raw_context.eip); + EXPECT_EQ(0xbffe6edaU, raw_context.cs); + EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags); + EXPECT_EQ(0x659caaa4U, raw_context.esp); + EXPECT_EQ(0x2e951ef7U, raw_context.ss); +} + +// This test covers a scenario where a dump contains an exception but the +// context record of the exception is missing the CPU type information in its +// context_flags. The dump has no system info stream so it is imposible to +// deduce the CPU type, hence the context record is unusable. +TEST(Dump, OneExceptionX86NoCPUFlagsNoSystemInfo) { + Dump dump(0, kLittleEndian); + + MDRawContextX86 raw_context; + // Intentionally not setting CPU type in the context_flags + raw_context.context_flags = 0; + raw_context.edi = 0x3ecba80d; + raw_context.esi = 0x382583b9; + raw_context.ebx = 0x7fccc03f; + raw_context.edx = 0xf62f8ec2; + raw_context.ecx = 0x46a6a6a8; + raw_context.eax = 0x6a5025e2; + raw_context.ebp = 0xd9fabb4a; + raw_context.eip = 0x6913f540; + raw_context.cs = 0xbffe6eda; + raw_context.eflags = 0xb2ce1e2d; + raw_context.esp = 0x659caaa4; + raw_context.ss = 0x2e951ef7; + Context context(dump, raw_context); + + Exception exception(dump, context, + 0x1234abcd, // thread id + 0xdcba4321, // exception code + 0xf0e0d0c0, // exception flags + 0x0919a9b9c9d9e9f9ULL); // exception address + + dump.Add(&context); + dump.Add(&exception); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); + + MinidumpException* md_exception = minidump.GetException(); + ASSERT_TRUE(md_exception != NULL); + + uint32_t thread_id; + ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); + ASSERT_EQ(0x1234abcdU, thread_id); + + const MDRawExceptionStream* raw_exception = md_exception->exception(); + ASSERT_TRUE(raw_exception != NULL); + EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); + EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); + EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, + raw_exception->exception_record.exception_address); + + // The context record of the exception is unusable because the context_flags + // don't have CPU type information and at the same time the minidump lacks + // system info stream so it is impossible to deduce the CPU type. + MinidumpContext* md_context = md_exception->GetContext(); + ASSERT_EQ(NULL, md_context); +} + +TEST(Dump, OneExceptionARM) { + Dump dump(0, kLittleEndian); + + MDRawContextARM raw_context; + raw_context.context_flags = MD_CONTEXT_ARM_INTEGER; + raw_context.iregs[0] = 0x3ecba80d; + raw_context.iregs[1] = 0x382583b9; + raw_context.iregs[2] = 0x7fccc03f; + raw_context.iregs[3] = 0xf62f8ec2; + raw_context.iregs[4] = 0x46a6a6a8; + raw_context.iregs[5] = 0x6a5025e2; + raw_context.iregs[6] = 0xd9fabb4a; + raw_context.iregs[7] = 0x6913f540; + raw_context.iregs[8] = 0xbffe6eda; + raw_context.iregs[9] = 0xb2ce1e2d; + raw_context.iregs[10] = 0x659caaa4; + raw_context.iregs[11] = 0xf0e0d0c0; + raw_context.iregs[12] = 0xa9b8c7d6; + raw_context.iregs[13] = 0x12345678; + raw_context.iregs[14] = 0xabcd1234; + raw_context.iregs[15] = 0x10203040; + raw_context.cpsr = 0x2e951ef7; + Context context(dump, raw_context); + + Exception exception(dump, context, + 0x1234abcd, // thread id + 0xdcba4321, // exception code + 0xf0e0d0c0, // exception flags + 0x0919a9b9c9d9e9f9ULL); // exception address + + dump.Add(&context); + dump.Add(&exception); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); + + MinidumpException* md_exception = minidump.GetException(); + ASSERT_TRUE(md_exception != NULL); + + uint32_t thread_id; + ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); + ASSERT_EQ(0x1234abcdU, thread_id); + + const MDRawExceptionStream* raw_exception = md_exception->exception(); + ASSERT_TRUE(raw_exception != NULL); + EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); + EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); + EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, + raw_exception->exception_record.exception_address); + + MinidumpContext* md_context = md_exception->GetContext(); + ASSERT_TRUE(md_context != NULL); + ASSERT_EQ((uint32_t) MD_CONTEXT_ARM, md_context->GetContextCPU()); + const MDRawContextARM* md_raw_context = md_context->GetContextARM(); + ASSERT_TRUE(md_raw_context != NULL); + ASSERT_EQ((uint32_t) MD_CONTEXT_ARM_INTEGER, + (md_raw_context->context_flags + & MD_CONTEXT_ARM_INTEGER)); + EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]); + EXPECT_EQ(0x382583b9U, raw_context.iregs[1]); + EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]); + EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]); + EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]); + EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]); + EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]); + EXPECT_EQ(0x6913f540U, raw_context.iregs[7]); + EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]); + EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]); + EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]); + EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]); + EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]); + EXPECT_EQ(0x12345678U, raw_context.iregs[13]); + EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]); + EXPECT_EQ(0x10203040U, raw_context.iregs[15]); + EXPECT_EQ(0x2e951ef7U, raw_context.cpsr); +} + +TEST(Dump, OneExceptionARMOldFlags) { + Dump dump(0, kLittleEndian); + + MDRawContextARM raw_context; + // MD_CONTEXT_ARM_INTEGER, but with _OLD + raw_context.context_flags = MD_CONTEXT_ARM_OLD | 0x00000002; + raw_context.iregs[0] = 0x3ecba80d; + raw_context.iregs[1] = 0x382583b9; + raw_context.iregs[2] = 0x7fccc03f; + raw_context.iregs[3] = 0xf62f8ec2; + raw_context.iregs[4] = 0x46a6a6a8; + raw_context.iregs[5] = 0x6a5025e2; + raw_context.iregs[6] = 0xd9fabb4a; + raw_context.iregs[7] = 0x6913f540; + raw_context.iregs[8] = 0xbffe6eda; + raw_context.iregs[9] = 0xb2ce1e2d; + raw_context.iregs[10] = 0x659caaa4; + raw_context.iregs[11] = 0xf0e0d0c0; + raw_context.iregs[12] = 0xa9b8c7d6; + raw_context.iregs[13] = 0x12345678; + raw_context.iregs[14] = 0xabcd1234; + raw_context.iregs[15] = 0x10203040; + raw_context.cpsr = 0x2e951ef7; + Context context(dump, raw_context); + + Exception exception(dump, context, + 0x1234abcd, // thread id + 0xdcba4321, // exception code + 0xf0e0d0c0, // exception flags + 0x0919a9b9c9d9e9f9ULL); // exception address + + dump.Add(&context); + dump.Add(&exception); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); + + MinidumpException* md_exception = minidump.GetException(); + ASSERT_TRUE(md_exception != NULL); + + uint32_t thread_id; + ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); + ASSERT_EQ(0x1234abcdU, thread_id); + + const MDRawExceptionStream* raw_exception = md_exception->exception(); + ASSERT_TRUE(raw_exception != NULL); + EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); + EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); + EXPECT_EQ(0x0919a9b9c9d9e9f9ULL, + raw_exception->exception_record.exception_address); + + MinidumpContext* md_context = md_exception->GetContext(); + ASSERT_TRUE(md_context != NULL); + ASSERT_EQ((uint32_t) MD_CONTEXT_ARM, md_context->GetContextCPU()); + const MDRawContextARM* md_raw_context = md_context->GetContextARM(); + ASSERT_TRUE(md_raw_context != NULL); + ASSERT_EQ((uint32_t) MD_CONTEXT_ARM_INTEGER, + (md_raw_context->context_flags + & MD_CONTEXT_ARM_INTEGER)); + EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]); + EXPECT_EQ(0x382583b9U, raw_context.iregs[1]); + EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]); + EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]); + EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]); + EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]); + EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]); + EXPECT_EQ(0x6913f540U, raw_context.iregs[7]); + EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]); + EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]); + EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]); + EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]); + EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]); + EXPECT_EQ(0x12345678U, raw_context.iregs[13]); + EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]); + EXPECT_EQ(0x10203040U, raw_context.iregs[15]); + EXPECT_EQ(0x2e951ef7U, raw_context.cpsr); +} + +TEST(Dump, OneExceptionMIPS) { + Dump dump(0, kLittleEndian); + + MDRawContextMIPS raw_context; + raw_context.context_flags = MD_CONTEXT_MIPS_INTEGER; + raw_context.iregs[0] = 0x3ecba80d; + raw_context.iregs[1] = 0x382583b9; + raw_context.iregs[2] = 0x7fccc03f; + raw_context.iregs[3] = 0xf62f8ec2; + raw_context.iregs[4] = 0x46a6a6a8; + raw_context.iregs[5] = 0x6a5025e2; + raw_context.iregs[6] = 0xd9fabb4a; + raw_context.iregs[7] = 0x6913f540; + raw_context.iregs[8] = 0xbffe6eda; + raw_context.iregs[9] = 0xb2ce1e2d; + raw_context.iregs[10] = 0x659caaa4; + raw_context.iregs[11] = 0xf0e0d0c0; + raw_context.iregs[12] = 0xa9b8c7d6; + raw_context.iregs[13] = 0x12345678; + raw_context.iregs[14] = 0xabcd1234; + raw_context.iregs[15] = 0x10203040; + raw_context.iregs[16] = 0xa80d3ecb; + raw_context.iregs[17] = 0x83b93825; + raw_context.iregs[18] = 0xc03f7fcc; + raw_context.iregs[19] = 0x8ec2f62f; + raw_context.iregs[20] = 0xa6a846a6; + raw_context.iregs[21] = 0x25e26a50; + raw_context.iregs[22] = 0xbb4ad9fa; + raw_context.iregs[23] = 0xf5406913; + raw_context.iregs[24] = 0x6edabffe; + raw_context.iregs[25] = 0x1e2db2ce; + raw_context.iregs[26] = 0xaaa4659c; + raw_context.iregs[27] = 0xd0c0f0e0; + raw_context.iregs[28] = 0xc7d6a9b8; + raw_context.iregs[29] = 0x56781234; + raw_context.iregs[30] = 0x1234abcd; + raw_context.iregs[31] = 0x30401020; + + Context context(dump, raw_context); + + Exception exception(dump, context, + 0x1234abcd, // Thread id. + 0xdcba4321, // Exception code. + 0xf0e0d0c0, // Exception flags. + 0x0919a9b9); // Exception address. + + dump.Add(&context); + dump.Add(&exception); + dump.Finish(); + + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + + istringstream minidump_stream(contents); + Minidump minidump(minidump_stream); + ASSERT_TRUE(minidump.Read()); + ASSERT_EQ(1U, minidump.GetDirectoryEntryCount()); + + MinidumpException* md_exception = minidump.GetException(); + ASSERT_TRUE(md_exception != NULL); + + uint32_t thread_id; + ASSERT_TRUE(md_exception->GetThreadID(&thread_id)); + ASSERT_EQ(0x1234abcdU, thread_id); + + const MDRawExceptionStream* raw_exception = md_exception->exception(); + ASSERT_TRUE(raw_exception != NULL); + EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code); + EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags); + EXPECT_EQ(0x0919a9b9U, + raw_exception->exception_record.exception_address); + + MinidumpContext* md_context = md_exception->GetContext(); + ASSERT_TRUE(md_context != NULL); + ASSERT_EQ((uint32_t) MD_CONTEXT_MIPS, md_context->GetContextCPU()); + const MDRawContextMIPS* md_raw_context = md_context->GetContextMIPS(); + ASSERT_TRUE(md_raw_context != NULL); + ASSERT_EQ((uint32_t) MD_CONTEXT_MIPS_INTEGER, + (md_raw_context->context_flags & MD_CONTEXT_MIPS_INTEGER)); + EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]); + EXPECT_EQ(0x382583b9U, raw_context.iregs[1]); + EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]); + EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]); + EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]); + EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]); + EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]); + EXPECT_EQ(0x6913f540U, raw_context.iregs[7]); + EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]); + EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]); + EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]); + EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]); + EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]); + EXPECT_EQ(0x12345678U, raw_context.iregs[13]); + EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]); + EXPECT_EQ(0x10203040U, raw_context.iregs[15]); + EXPECT_EQ(0xa80d3ecbU, raw_context.iregs[16]); + EXPECT_EQ(0x83b93825U, raw_context.iregs[17]); + EXPECT_EQ(0xc03f7fccU, raw_context.iregs[18]); + EXPECT_EQ(0x8ec2f62fU, raw_context.iregs[19]); + EXPECT_EQ(0xa6a846a6U, raw_context.iregs[20]); + EXPECT_EQ(0x25e26a50U, raw_context.iregs[21]); + EXPECT_EQ(0xbb4ad9faU, raw_context.iregs[22]); + EXPECT_EQ(0xf5406913U, raw_context.iregs[23]); + EXPECT_EQ(0x6edabffeU, raw_context.iregs[24]); + EXPECT_EQ(0x1e2db2ceU, raw_context.iregs[25]); + EXPECT_EQ(0xaaa4659cU, raw_context.iregs[26]); + EXPECT_EQ(0xd0c0f0e0U, raw_context.iregs[27]); + EXPECT_EQ(0xc7d6a9b8U, raw_context.iregs[28]); + EXPECT_EQ(0x56781234U, raw_context.iregs[29]); + EXPECT_EQ(0x1234abcdU, raw_context.iregs[30]); + EXPECT_EQ(0x30401020U, raw_context.iregs[31]); +} + +} // namespace diff --git a/src/processor/module_comparer.cc b/src/processor/module_comparer.cc new file mode 100644 index 0000000..a641303 --- /dev/null +++ b/src/processor/module_comparer.cc @@ -0,0 +1,305 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// module_comparer.cc: ModuleComparer implementation. +// See module_comparer.h for documentation. +// +// Author: lambxsy@google.com (Siyang Xie) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/module_comparer.h" + +#include +#include + +#include "common/scoped_ptr.h" +#include "processor/basic_code_module.h" +#include "processor/logging.h" + +#define ASSERT_TRUE(condition) \ + if (!(condition)) { \ + BPLOG(ERROR) << "FAIL: " << #condition << " @ " \ + << __FILE__ << ":" << __LINE__; \ + return false; \ + } + +#define ASSERT_FALSE(condition) ASSERT_TRUE(!(condition)) + +namespace google_breakpad { + +bool ModuleComparer::Compare(const string& symbol_data) { + scoped_ptr basic_module(new BasicModule("test_module")); + scoped_ptr fast_module(new FastModule("test_module")); + + // Load symbol data into basic_module + scoped_array buffer(new char[symbol_data.size() + 1]); + memcpy(buffer.get(), symbol_data.c_str(), symbol_data.size()); + buffer.get()[symbol_data.size()] = '\0'; + ASSERT_TRUE(basic_module->LoadMapFromMemory(buffer.get(), + symbol_data.size() + 1)); + buffer.reset(); + + // Serialize BasicSourceLineResolver::Module. + size_t serialized_size = 0; + scoped_array serialized_data( + serializer_.Serialize(*(basic_module.get()), &serialized_size)); + ASSERT_TRUE(serialized_data.get()); + BPLOG(INFO) << "Serialized size = " << serialized_size << " Bytes"; + + // Load FastSourceLineResolver::Module using serialized data. + ASSERT_TRUE(fast_module->LoadMapFromMemory(serialized_data.get(), + serialized_size)); + ASSERT_TRUE(fast_module->IsCorrupt() == basic_module->IsCorrupt()); + + // Compare FastSourceLineResolver::Module with + // BasicSourceLineResolver::Module. + ASSERT_TRUE(CompareModule(basic_module.get(), fast_module.get())); + + return true; +} + +// Traversal the content of module and do comparison +bool ModuleComparer::CompareModule(const BasicModule *basic_module, + const FastModule *fast_module) const { + // Compare name_. + ASSERT_TRUE(basic_module->name_ == fast_module->name_); + + // Compare files_: + { + BasicModule::FileMap::const_iterator iter1 = basic_module->files_.begin(); + FastModule::FileMap::iterator iter2 = fast_module->files_.begin(); + while (iter1 != basic_module->files_.end() + && iter2 != fast_module->files_.end()) { + ASSERT_TRUE(iter1->first == iter2.GetKey()); + string tmp(iter2.GetValuePtr()); + ASSERT_TRUE(iter1->second == tmp); + ++iter1; + ++iter2; + } + ASSERT_TRUE(iter1 == basic_module->files_.end()); + ASSERT_TRUE(iter2 == fast_module->files_.end()); + } + + // Compare functions_: + { + RangeMap >::MapConstIterator iter1; + StaticRangeMap::MapConstIterator iter2; + iter1 = basic_module->functions_.map_.begin(); + iter2 = fast_module->functions_.map_.begin(); + while (iter1 != basic_module->functions_.map_.end() + && iter2 != fast_module->functions_.map_.end()) { + ASSERT_TRUE(iter1->first == iter2.GetKey()); + ASSERT_TRUE(iter1->second.base() == iter2.GetValuePtr()->base()); + ASSERT_TRUE(CompareFunction( + iter1->second.entry().get(), iter2.GetValuePtr()->entryptr())); + ++iter1; + ++iter2; + } + ASSERT_TRUE(iter1 == basic_module->functions_.map_.end()); + ASSERT_TRUE(iter2 == fast_module->functions_.map_.end()); + } + + // Compare public_symbols_: + { + AddressMap >::MapConstIterator iter1; + StaticAddressMap::MapConstIterator iter2; + iter1 = basic_module->public_symbols_.map_.begin(); + iter2 = fast_module->public_symbols_.map_.begin(); + while (iter1 != basic_module->public_symbols_.map_.end() + && iter2 != fast_module->public_symbols_.map_.end()) { + ASSERT_TRUE(iter1->first == iter2.GetKey()); + ASSERT_TRUE(ComparePubSymbol( + iter1->second.get(), iter2.GetValuePtr())); + ++iter1; + ++iter2; + } + ASSERT_TRUE(iter1 == basic_module->public_symbols_.map_.end()); + ASSERT_TRUE(iter2 == fast_module->public_symbols_.map_.end()); + } + + // Compare windows_frame_info_[]: + for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i) { + ASSERT_TRUE(CompareCRM(&(basic_module->windows_frame_info_[i]), + &(fast_module->windows_frame_info_[i]))); + } + + // Compare cfi_initial_rules_: + { + RangeMap::MapConstIterator iter1; + StaticRangeMap::MapConstIterator iter2; + iter1 = basic_module->cfi_initial_rules_.map_.begin(); + iter2 = fast_module->cfi_initial_rules_.map_.begin(); + while (iter1 != basic_module->cfi_initial_rules_.map_.end() + && iter2 != fast_module->cfi_initial_rules_.map_.end()) { + ASSERT_TRUE(iter1->first == iter2.GetKey()); + ASSERT_TRUE(iter1->second.base() == iter2.GetValuePtr()->base()); + string tmp(iter2.GetValuePtr()->entryptr()); + ASSERT_TRUE(iter1->second.entry() == tmp); + ++iter1; + ++iter2; + } + ASSERT_TRUE(iter1 == basic_module->cfi_initial_rules_.map_.end()); + ASSERT_TRUE(iter2 == fast_module->cfi_initial_rules_.map_.end()); + } + + // Compare cfi_delta_rules_: + { + map::const_iterator iter1; + StaticMap::iterator iter2; + iter1 = basic_module->cfi_delta_rules_.begin(); + iter2 = fast_module->cfi_delta_rules_.begin(); + while (iter1 != basic_module->cfi_delta_rules_.end() + && iter2 != fast_module->cfi_delta_rules_.end()) { + ASSERT_TRUE(iter1->first == iter2.GetKey()); + string tmp(iter2.GetValuePtr()); + ASSERT_TRUE(iter1->second == tmp); + ++iter1; + ++iter2; + } + ASSERT_TRUE(iter1 == basic_module->cfi_delta_rules_.end()); + ASSERT_TRUE(iter2 == fast_module->cfi_delta_rules_.end()); + } + + return true; +} + +bool ModuleComparer::CompareFunction(const BasicFunc *basic_func, + const FastFunc *fast_func_raw) const { + FastFunc* fast_func = new FastFunc(); + fast_func->CopyFrom(fast_func_raw); + ASSERT_TRUE(basic_func->name == fast_func->name); + ASSERT_TRUE(basic_func->address == fast_func->address); + ASSERT_TRUE(basic_func->size == fast_func->size); + + // compare range map of lines: + RangeMap >::MapConstIterator iter1; + StaticRangeMap::MapConstIterator iter2; + iter1 = basic_func->lines.map_.begin(); + iter2 = fast_func->lines.map_.begin(); + while (iter1 != basic_func->lines.map_.end() + && iter2 != fast_func->lines.map_.end()) { + ASSERT_TRUE(iter1->first == iter2.GetKey()); + ASSERT_TRUE(iter1->second.base() == iter2.GetValuePtr()->base()); + ASSERT_TRUE(CompareLine(iter1->second.entry().get(), + iter2.GetValuePtr()->entryptr())); + ++iter1; + ++iter2; + } + ASSERT_TRUE(iter1 == basic_func->lines.map_.end()); + ASSERT_TRUE(iter2 == fast_func->lines.map_.end()); + + delete fast_func; + return true; +} + +bool ModuleComparer::CompareLine(const BasicLine *basic_line, + const FastLine *fast_line_raw) const { + FastLine *fast_line = new FastLine; + fast_line->CopyFrom(fast_line_raw); + + ASSERT_TRUE(basic_line->address == fast_line->address); + ASSERT_TRUE(basic_line->size == fast_line->size); + ASSERT_TRUE(basic_line->source_file_id == fast_line->source_file_id); + ASSERT_TRUE(basic_line->line == fast_line->line); + + delete fast_line; + return true; +} + +bool ModuleComparer::ComparePubSymbol(const BasicPubSymbol* basic_ps, + const FastPubSymbol* fastps_raw) const { + FastPubSymbol *fast_ps = new FastPubSymbol; + fast_ps->CopyFrom(fastps_raw); + ASSERT_TRUE(basic_ps->name == fast_ps->name); + ASSERT_TRUE(basic_ps->address == fast_ps->address); + ASSERT_TRUE(basic_ps->parameter_size == fast_ps->parameter_size); + delete fast_ps; + return true; +} + +bool ModuleComparer::CompareWFI(const WindowsFrameInfo& wfi1, + const WindowsFrameInfo& wfi2) const { + ASSERT_TRUE(wfi1.type_ == wfi2.type_); + ASSERT_TRUE(wfi1.valid == wfi2.valid); + ASSERT_TRUE(wfi1.prolog_size == wfi2.prolog_size); + ASSERT_TRUE(wfi1.epilog_size == wfi2.epilog_size); + ASSERT_TRUE(wfi1.parameter_size == wfi2.parameter_size); + ASSERT_TRUE(wfi1.saved_register_size == wfi2.saved_register_size); + ASSERT_TRUE(wfi1.local_size == wfi2.local_size); + ASSERT_TRUE(wfi1.max_stack_size == wfi2.max_stack_size); + ASSERT_TRUE(wfi1.allocates_base_pointer == wfi2.allocates_base_pointer); + ASSERT_TRUE(wfi1.program_string == wfi2.program_string); + return true; +} + +// Compare ContainedRangeMap +bool ModuleComparer::CompareCRM( + const ContainedRangeMap >* basic_crm, + const StaticContainedRangeMap* fast_crm) const { + ASSERT_TRUE(basic_crm->base_ == fast_crm->base_); + + if (!basic_crm->entry_.get() || !fast_crm->entry_ptr_) { + // empty entry: + ASSERT_TRUE(!basic_crm->entry_.get() && !fast_crm->entry_ptr_); + } else { + WFI newwfi; + newwfi.CopyFrom(fast_resolver_->CopyWFI(fast_crm->entry_ptr_)); + ASSERT_TRUE(CompareWFI(*(basic_crm->entry_.get()), newwfi)); + } + + if ((!basic_crm->map_ || basic_crm->map_->empty()) + || fast_crm->map_.empty()) { + ASSERT_TRUE((!basic_crm->map_ || basic_crm->map_->empty()) + && fast_crm->map_.empty()); + } else { + ContainedRangeMap >::MapConstIterator iter1; + StaticContainedRangeMap::MapConstIterator iter2; + iter1 = basic_crm->map_->begin(); + iter2 = fast_crm->map_.begin(); + while (iter1 != basic_crm->map_->end() + && iter2 != fast_crm->map_.end()) { + ASSERT_TRUE(iter1->first == iter2.GetKey()); + StaticContainedRangeMap* child = + new StaticContainedRangeMap( + reinterpret_cast(iter2.GetValuePtr())); + ASSERT_TRUE(CompareCRM(iter1->second, child)); + delete child; + ++iter1; + ++iter2; + } + ASSERT_TRUE(iter1 == basic_crm->map_->end()); + ASSERT_TRUE(iter2 == fast_crm->map_.end()); + } + + return true; +} + +} // namespace google_breakpad diff --git a/src/processor/module_comparer.h b/src/processor/module_comparer.h new file mode 100644 index 0000000..6bd3e7b --- /dev/null +++ b/src/processor/module_comparer.h @@ -0,0 +1,97 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// module_comparer.h: ModuleComparer reads a string format of symbol file, and +// loads the symbol into both BasicSourceLineResolver::Module and +// FastSourceLineResolve::Module. It then traverses both Modules and compare +// the content of data to verify the correctness of new fast module. +// ModuleCompare class is a tool to verify correctness of a loaded +// FastSourceLineResolver::Module instance, i.e., in-memory representation of +// parsed symbol. ModuleComparer class should be used for testing purpose only, +// e.g., in fast_source_line_resolver_unittest. +// +// Author: lambxsy@google.com (Siyang Xie) + +#ifndef PROCESSOR_MODULE_COMPARER_H__ +#define PROCESSOR_MODULE_COMPARER_H__ + +#include + +#include "processor/basic_source_line_resolver_types.h" +#include "processor/fast_source_line_resolver_types.h" +#include "processor/module_serializer.h" +#include "processor/windows_frame_info.h" + +namespace google_breakpad { + +class ModuleComparer { + public: + ModuleComparer(): fast_resolver_(new FastSourceLineResolver), + basic_resolver_(new BasicSourceLineResolver) { } + ~ModuleComparer() { + delete fast_resolver_; + delete basic_resolver_; + } + + // BasicSourceLineResolver loads its module using the symbol data, + // ModuleSerializer serialize the loaded module into a memory chunk, + // FastSourceLineResolver loads its module using the serialized memory chunk, + // Then, traverse both modules together and compare underlying data + // return true if both modules contain exactly same data. + bool Compare(const string& symbol_data); + + private: + typedef BasicSourceLineResolver::Module BasicModule; + typedef FastSourceLineResolver::Module FastModule; + typedef BasicSourceLineResolver::Function BasicFunc; + typedef FastSourceLineResolver::Function FastFunc; + typedef BasicSourceLineResolver::Line BasicLine; + typedef FastSourceLineResolver::Line FastLine; + typedef BasicSourceLineResolver::PublicSymbol BasicPubSymbol; + typedef FastSourceLineResolver::PublicSymbol FastPubSymbol; + typedef WindowsFrameInfo WFI; + + bool CompareModule(const BasicModule *oldmodule, + const FastModule *newmodule) const; + bool CompareFunction(const BasicFunc *oldfunc, const FastFunc *newfunc) const; + bool CompareLine(const BasicLine *oldline, const FastLine *newline) const; + bool ComparePubSymbol(const BasicPubSymbol*, const FastPubSymbol*) const; + bool CompareWFI(const WindowsFrameInfo&, const WindowsFrameInfo&) const; + + // Compare ContainedRangeMap + bool CompareCRM(const ContainedRangeMap >*, + const StaticContainedRangeMap*) const; + + FastSourceLineResolver *fast_resolver_; + BasicSourceLineResolver *basic_resolver_; + ModuleSerializer serializer_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_MODULE_COMPARER_H__ diff --git a/src/processor/module_factory.h b/src/processor/module_factory.h new file mode 100644 index 0000000..3df85a6 --- /dev/null +++ b/src/processor/module_factory.h @@ -0,0 +1,71 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// module_factory.h: ModuleFactory a factory that provides +// an interface for creating a Module and deferring instantiation to subclasses +// BasicModuleFactory and FastModuleFactory. + +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_MODULE_FACTORY_H__ +#define PROCESSOR_MODULE_FACTORY_H__ + +#include "processor/basic_source_line_resolver_types.h" +#include "processor/fast_source_line_resolver_types.h" +#include "processor/source_line_resolver_base_types.h" + +namespace google_breakpad { + +class ModuleFactory { + public: + virtual ~ModuleFactory() { }; + virtual SourceLineResolverBase::Module* CreateModule( + const string& name) const = 0; +}; + +class BasicModuleFactory : public ModuleFactory { + public: + virtual ~BasicModuleFactory() { } + virtual BasicSourceLineResolver::Module* CreateModule( + const string& name) const { + return new BasicSourceLineResolver::Module(name); + } +}; + +class FastModuleFactory : public ModuleFactory { + public: + virtual ~FastModuleFactory() { } + virtual FastSourceLineResolver::Module* CreateModule( + const string& name) const { + return new FastSourceLineResolver::Module(name); + } +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_MODULE_FACTORY_H__ diff --git a/src/processor/module_serializer.cc b/src/processor/module_serializer.cc new file mode 100644 index 0000000..0551995 --- /dev/null +++ b/src/processor/module_serializer.cc @@ -0,0 +1,219 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// module_serializer.cc: ModuleSerializer implementation. +// +// See module_serializer.h for documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/module_serializer.h" + +#include +#include + +#include "processor/basic_code_module.h" +#include "processor/logging.h" + +namespace google_breakpad { + +// Definition of static member variables in SimplerSerializer and +// SimplerSerializer, which are declared in file +// "simple_serializer-inl.h" +RangeMapSerializer> + SimpleSerializer::range_map_serializer_; +ContainedRangeMapSerializer> + SimpleSerializer< + BasicSourceLineResolver::Function>::inline_range_map_serializer_; + +size_t ModuleSerializer::SizeOf(const BasicSourceLineResolver::Module& module) { + size_t total_size_alloc_ = 0; + + // Size of the "is_corrupt" flag. + total_size_alloc_ += SimpleSerializer::SizeOf(module.is_corrupt_); + + // Compute memory size for each map component in Module class. + int map_index = 0; + map_sizes_[map_index++] = files_serializer_.SizeOf(module.files_); + map_sizes_[map_index++] = functions_serializer_.SizeOf(module.functions_); + map_sizes_[map_index++] = pubsym_serializer_.SizeOf(module.public_symbols_); + for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i) + map_sizes_[map_index++] = + wfi_serializer_.SizeOf(&(module.windows_frame_info_[i])); + map_sizes_[map_index++] = cfi_init_rules_serializer_.SizeOf( + module.cfi_initial_rules_); + map_sizes_[map_index++] = cfi_delta_rules_serializer_.SizeOf( + module.cfi_delta_rules_); + map_sizes_[map_index++] = + inline_origin_serializer_.SizeOf(module.inline_origins_); + + // Header size. + total_size_alloc_ += kNumberMaps_ * sizeof(uint32_t); + + for (int i = 0; i < kNumberMaps_; ++i) { + total_size_alloc_ += map_sizes_[i]; + } + + // Extra one byte for null terminator for C-string copy safety. + total_size_alloc_ += SimpleSerializer::SizeOf(0); + + return total_size_alloc_; +} + +char* ModuleSerializer::Write(const BasicSourceLineResolver::Module& module, + char* dest) { + // Write the is_corrupt flag. + dest = SimpleSerializer::Write(module.is_corrupt_, dest); + // Write header. + memcpy(dest, map_sizes_, kNumberMaps_ * sizeof(uint32_t)); + dest += kNumberMaps_ * sizeof(uint32_t); + // Write each map. + dest = files_serializer_.Write(module.files_, dest); + dest = functions_serializer_.Write(module.functions_, dest); + dest = pubsym_serializer_.Write(module.public_symbols_, dest); + for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i) + dest = wfi_serializer_.Write(&(module.windows_frame_info_[i]), dest); + dest = cfi_init_rules_serializer_.Write(module.cfi_initial_rules_, dest); + dest = cfi_delta_rules_serializer_.Write(module.cfi_delta_rules_, dest); + dest = inline_origin_serializer_.Write(module.inline_origins_, dest); + // Write a null terminator. + dest = SimpleSerializer::Write(0, dest); + return dest; +} + +char* ModuleSerializer::Serialize(const BasicSourceLineResolver::Module& module, + size_t* size) { + // Compute size of memory to allocate. + const size_t size_to_alloc = SizeOf(module); + + // Allocate memory for serialized data. + char* serialized_data = new char[size_to_alloc]; + if (!serialized_data) { + BPLOG(ERROR) << "ModuleSerializer: memory allocation failed, " + << "size to alloc: " << size_to_alloc; + if (size) *size = 0; + return NULL; + } + + // Write serialized data to allocated memory chunk. + char* end_address = Write(module, serialized_data); + // Verify the allocated memory size is equal to the size of data been written. + const size_t size_written = + static_cast(end_address - serialized_data); + if (size_to_alloc != size_written) { + BPLOG(ERROR) << "size_to_alloc differs from size_written: " + << size_to_alloc << " vs " << size_written; + } + + // Set size and return the start address of memory chunk. + if (size) + *size = size_to_alloc; + + return serialized_data; +} + +bool ModuleSerializer::SerializeModuleAndLoadIntoFastResolver( + const BasicSourceLineResolver::ModuleMap::const_iterator& iter, + FastSourceLineResolver* fast_resolver) { + BPLOG(INFO) << "Converting symbol " << iter->first.c_str(); + + // Cast SourceLineResolverBase::Module* to BasicSourceLineResolver::Module*. + BasicSourceLineResolver::Module* basic_module = + dynamic_cast(iter->second); + + size_t size = 0; + scoped_array symbol_data(Serialize(*basic_module, &size)); + if (!symbol_data.get()) { + BPLOG(ERROR) << "Serialization failed for module: " << basic_module->name_; + return false; + } + BPLOG(INFO) << "Serialized Symbol Size " << size; + + // Copy the data into string. + // Must pass string to LoadModuleUsingMapBuffer(), instead of passing char* to + // LoadModuleUsingMemoryBuffer(), becaused of data ownership/lifetime issue. + string symbol_data_string(symbol_data.get(), size); + symbol_data.reset(); + + scoped_ptr code_module( + new BasicCodeModule(0, 0, iter->first, "", "", "", "")); + + return fast_resolver->LoadModuleUsingMapBuffer(code_module.get(), + symbol_data_string); +} + +void ModuleSerializer::ConvertAllModules( + const BasicSourceLineResolver* basic_resolver, + FastSourceLineResolver* fast_resolver) { + // Check for NULL pointer. + if (!basic_resolver || !fast_resolver) + return; + + // Traverse module list in basic resolver. + BasicSourceLineResolver::ModuleMap::const_iterator iter; + iter = basic_resolver->modules_->begin(); + for (; iter != basic_resolver->modules_->end(); ++iter) + SerializeModuleAndLoadIntoFastResolver(iter, fast_resolver); +} + +bool ModuleSerializer::ConvertOneModule( + const string& moduleid, + const BasicSourceLineResolver* basic_resolver, + FastSourceLineResolver* fast_resolver) { + // Check for NULL pointer. + if (!basic_resolver || !fast_resolver) + return false; + + BasicSourceLineResolver::ModuleMap::const_iterator iter; + iter = basic_resolver->modules_->find(moduleid); + if (iter == basic_resolver->modules_->end()) + return false; + + return SerializeModuleAndLoadIntoFastResolver(iter, fast_resolver); +} + +char* ModuleSerializer::SerializeSymbolFileData(const string& symbol_data, + size_t* size) { + scoped_ptr module( + new BasicSourceLineResolver::Module("no name")); + scoped_array buffer(new char[symbol_data.size() + 1]); + memcpy(buffer.get(), symbol_data.c_str(), symbol_data.size()); + buffer.get()[symbol_data.size()] = '\0'; + if (!module->LoadMapFromMemory(buffer.get(), symbol_data.size() + 1)) { + return NULL; + } + buffer.reset(NULL); + return Serialize(*(module.get()), size); +} + +} // namespace google_breakpad diff --git a/src/processor/module_serializer.h b/src/processor/module_serializer.h new file mode 100644 index 0000000..fd387cb --- /dev/null +++ b/src/processor/module_serializer.h @@ -0,0 +1,128 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// module_serializer.h: ModuleSerializer serializes a loaded symbol, +// i.e., a loaded BasicSouceLineResolver::Module instance, into a memory +// chunk of data. The serialized data can be read and loaded by +// FastSourceLineResolver without CPU & memory-intensive parsing. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_MODULE_SERIALIZER_H__ +#define PROCESSOR_MODULE_SERIALIZER_H__ + +#include +#include + +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/fast_source_line_resolver.h" +#include "processor/basic_source_line_resolver_types.h" +#include "processor/fast_source_line_resolver_types.h" +#include "processor/linked_ptr.h" +#include "processor/map_serializers-inl.h" +#include "processor/simple_serializer-inl.h" +#include "processor/windows_frame_info.h" + +namespace google_breakpad { + +// ModuleSerializer serializes a loaded BasicSourceLineResolver::Module into a +// chunk of memory data. ModuleSerializer also provides interface to compute +// memory size of the serialized data, write serialized data directly into +// memory, convert ASCII format symbol data into serialized binary data, and +// convert loaded BasicSourceLineResolver::Module into +// FastSourceLineResolver::Module. +class ModuleSerializer { + public: + // Compute the size of memory required to serialize a module. Return the + // total size needed for serialization. + size_t SizeOf(const BasicSourceLineResolver::Module& module); + + // Write a module into an allocated memory chunk with required size. + // Return the "end" of data, i.e., the address after the final byte of data. + char* Write(const BasicSourceLineResolver::Module& module, char* dest); + + // Serializes a loaded Module object into a chunk of memory data and returns + // the address of memory chunk. If size != NULL, *size is set to the memory + // size allocated for the serialized data. + // Caller takes the ownership of the memory chunk (allocated on heap), and + // owner should call delete [] to free the memory after use. + char* Serialize(const BasicSourceLineResolver::Module& module, + size_t* size = nullptr); + + // Given the string format symbol_data, produces a chunk of serialized data. + // Caller takes ownership of the serialized data (on heap), and owner should + // call delete [] to free the memory after use. + char* SerializeSymbolFileData(const string& symbol_data, + size_t* size = nullptr); + + // Serializes one loaded module with given moduleid in the basic source line + // resolver, and loads the serialized data into the fast source line resolver. + // Return false if the basic source line doesn't have a module with the given + // moduleid. + bool ConvertOneModule(const string& moduleid, + const BasicSourceLineResolver* basic_resolver, + FastSourceLineResolver* fast_resolver); + + // Serializes all the loaded modules in a basic source line resolver, and + // loads the serialized data into a fast source line resolver. + void ConvertAllModules(const BasicSourceLineResolver* basic_resolver, + FastSourceLineResolver* fast_resolver); + + private: + // Convenient type names. + typedef BasicSourceLineResolver::Line Line; + typedef BasicSourceLineResolver::Function Function; + typedef BasicSourceLineResolver::PublicSymbol PublicSymbol; + typedef BasicSourceLineResolver::InlineOrigin InlineOrigin; + + // Internal implementation for ConvertOneModule and ConvertAllModules methods. + bool SerializeModuleAndLoadIntoFastResolver( + const BasicSourceLineResolver::ModuleMap::const_iterator& iter, + FastSourceLineResolver* fast_resolver); + + // Number of Maps that Module class contains. + static const int32_t kNumberMaps_ = + FastSourceLineResolver::Module::kNumberMaps_; + + // Memory sizes required to serialize map components in Module. + uint32_t map_sizes_[kNumberMaps_]; + + // Serializers for each individual map component in Module class. + StdMapSerializer files_serializer_; + RangeMapSerializer > functions_serializer_; + AddressMapSerializer > pubsym_serializer_; + ContainedRangeMapSerializer > wfi_serializer_; + RangeMapSerializer cfi_init_rules_serializer_; + StdMapSerializer cfi_delta_rules_serializer_; + StdMapSerializer> inline_origin_serializer_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_MODULE_SERIALIZER_H__ diff --git a/src/processor/pathname_stripper.cc b/src/processor/pathname_stripper.cc new file mode 100644 index 0000000..11dc697 --- /dev/null +++ b/src/processor/pathname_stripper.cc @@ -0,0 +1,59 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// pathname_stripper.cc: Manipulates pathnames into their component parts. +// +// See pathname_stripper.h for documentation. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/pathname_stripper.h" + +namespace google_breakpad { + +// static +string PathnameStripper::File(const string& path) { + string::size_type slash = path.rfind('/'); + string::size_type backslash = path.rfind('\\'); + + string::size_type file_start = 0; + if (slash != string::npos && + (backslash == string::npos || slash > backslash)) { + file_start = slash + 1; + } else if (backslash != string::npos) { + file_start = backslash + 1; + } + + return path.substr(file_start); +} + +} // namespace google_breakpad diff --git a/src/processor/pathname_stripper.h b/src/processor/pathname_stripper.h new file mode 100644 index 0000000..62c9bdd --- /dev/null +++ b/src/processor/pathname_stripper.h @@ -0,0 +1,52 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// pathname_stripper.h: Manipulates pathnames into their component parts. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_PATHNAME_STRIPPER_H__ +#define PROCESSOR_PATHNAME_STRIPPER_H__ + +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +class PathnameStripper { + public: + // Given path, a pathname with components separated by slashes (/) or + // backslashes (\), returns the trailing component, without any separator. + // If path ends in a separator character, returns an empty string. + static string File(const string& path); +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_PATHNAME_STRIPPER_H__ diff --git a/src/processor/pathname_stripper_unittest.cc b/src/processor/pathname_stripper_unittest.cc new file mode 100644 index 0000000..c5c39cc --- /dev/null +++ b/src/processor/pathname_stripper_unittest.cc @@ -0,0 +1,90 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "processor/pathname_stripper.h" +#include "processor/logging.h" + +#define ASSERT_TRUE(condition) \ + if (!(condition)) { \ + fprintf(stderr, "FAIL: %s @ %s:%d\n", #condition, __FILE__, __LINE__); \ + return false; \ + } + +#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2)) + +namespace { + +using google_breakpad::PathnameStripper; + +static bool RunTests() { + ASSERT_EQ(PathnameStripper::File("/dir/file"), "file"); + ASSERT_EQ(PathnameStripper::File("\\dir\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("/dir\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("\\dir/file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir/file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir/\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir\\/file"), "file"); + ASSERT_EQ(PathnameStripper::File("file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir/"), ""); + ASSERT_EQ(PathnameStripper::File("dir\\"), ""); + ASSERT_EQ(PathnameStripper::File("dir/dir/"), ""); + ASSERT_EQ(PathnameStripper::File("dir\\dir\\"), ""); + ASSERT_EQ(PathnameStripper::File("dir1/dir2/file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir1\\dir2\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir1/dir2\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir1\\dir2/file"), "file"); + ASSERT_EQ(PathnameStripper::File(""), ""); + ASSERT_EQ(PathnameStripper::File("1"), "1"); + ASSERT_EQ(PathnameStripper::File("1/2"), "2"); + ASSERT_EQ(PathnameStripper::File("1\\2"), "2"); + ASSERT_EQ(PathnameStripper::File("/1/2"), "2"); + ASSERT_EQ(PathnameStripper::File("\\1\\2"), "2"); + ASSERT_EQ(PathnameStripper::File("dir//file"), "file"); + ASSERT_EQ(PathnameStripper::File("dir\\\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("/dir//file"), "file"); + ASSERT_EQ(PathnameStripper::File("\\dir\\\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("c:\\dir\\file"), "file"); + ASSERT_EQ(PathnameStripper::File("c:\\dir\\file.ext"), "file.ext"); + + return true; +} + +} // namespace + +int main(int argc, char** argv) { + BPLOG_INIT(&argc, &argv); + + return RunTests() ? 0 : 1; +} diff --git a/src/processor/postfix_evaluator-inl.h b/src/processor/postfix_evaluator-inl.h new file mode 100644 index 0000000..abdf259 --- /dev/null +++ b/src/processor/postfix_evaluator-inl.h @@ -0,0 +1,362 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// postfix_evaluator-inl.h: Postfix (reverse Polish) notation expression +// evaluator. +// +// Documentation in postfix_evaluator.h. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_POSTFIX_EVALUATOR_INL_H__ +#define PROCESSOR_POSTFIX_EVALUATOR_INL_H__ + +#include "processor/postfix_evaluator.h" + +#include + +#include + +#include "google_breakpad/processor/memory_region.h" +#include "processor/logging.h" + +namespace google_breakpad { + +using std::istringstream; +using std::ostringstream; + + +// A small class used in Evaluate to make sure to clean up the stack +// before returning failure. +class AutoStackClearer { + public: + explicit AutoStackClearer(vector* stack) : stack_(stack) {} + ~AutoStackClearer() { stack_->clear(); } + + private: + vector* stack_; +}; + + +template +bool PostfixEvaluator::EvaluateToken( + const string& token, + const string& expression, + DictionaryValidityType* assigned) { + // There are enough binary operations that do exactly the same thing + // (other than the specific operation, of course) that it makes sense + // to share as much code as possible. + enum BinaryOperation { + BINARY_OP_NONE = 0, + BINARY_OP_ADD, + BINARY_OP_SUBTRACT, + BINARY_OP_MULTIPLY, + BINARY_OP_DIVIDE_QUOTIENT, + BINARY_OP_DIVIDE_MODULUS, + BINARY_OP_ALIGN + }; + + BinaryOperation operation = BINARY_OP_NONE; + if (token == "+") + operation = BINARY_OP_ADD; + else if (token == "-") + operation = BINARY_OP_SUBTRACT; + else if (token == "*") + operation = BINARY_OP_MULTIPLY; + else if (token == "/") + operation = BINARY_OP_DIVIDE_QUOTIENT; + else if (token == "%") + operation = BINARY_OP_DIVIDE_MODULUS; + else if (token == "@") + operation = BINARY_OP_ALIGN; + + if (operation != BINARY_OP_NONE) { + // Get the operands. + ValueType operand1 = ValueType(); + ValueType operand2 = ValueType(); + if (!PopValues(&operand1, &operand2)) { + BPLOG(ERROR) << "Could not PopValues to get two values for binary " + "operation " << token << ": " << expression; + return false; + } + + // Perform the operation. + ValueType result; + switch (operation) { + case BINARY_OP_ADD: + result = operand1 + operand2; + break; + case BINARY_OP_SUBTRACT: + result = operand1 - operand2; + break; + case BINARY_OP_MULTIPLY: + result = operand1 * operand2; + break; + case BINARY_OP_DIVIDE_QUOTIENT: + result = operand1 / operand2; + break; + case BINARY_OP_DIVIDE_MODULUS: + result = operand1 % operand2; + break; + case BINARY_OP_ALIGN: + result = + operand1 & (static_cast(-1) ^ (operand2 - 1)); + break; + case BINARY_OP_NONE: + // This will not happen, but compilers will want a default or + // BINARY_OP_NONE case. + BPLOG(ERROR) << "Not reached!"; + return false; + break; + } + + // Save the result. + PushValue(result); + } else if (token == "^") { + // ^ for unary dereference. Can't dereference without memory. + if (!memory_) { + BPLOG(ERROR) << "Attempt to dereference without memory: " << + expression; + return false; + } + + ValueType address; + if (!PopValue(&address)) { + BPLOG(ERROR) << "Could not PopValue to get value to derefence: " << + expression; + return false; + } + + ValueType value; + if (!memory_->GetMemoryAtAddress(address, &value)) { + BPLOG(ERROR) << "Could not dereference memory at address " << + HexString(address) << ": " << expression; + return false; + } + + PushValue(value); + } else if (token == "=") { + // = for assignment. + ValueType value; + if (!PopValue(&value)) { + BPLOG(INFO) << "Could not PopValue to get value to assign: " << + expression; + return false; + } + + // Assignment is only meaningful when assigning into an identifier. + // The identifier must name a variable, not a constant. Variables + // begin with '$'. + string identifier; + if (PopValueOrIdentifier(NULL, &identifier) != POP_RESULT_IDENTIFIER) { + BPLOG(ERROR) << "PopValueOrIdentifier returned a value, but an " + "identifier is needed to assign " << + HexString(value) << ": " << expression; + return false; + } + if (identifier.empty() || identifier[0] != '$') { + BPLOG(ERROR) << "Can't assign " << HexString(value) << " to " << + identifier << ": " << expression; + return false; + } + + (*dictionary_)[identifier] = value; + if (assigned) + (*assigned)[identifier] = true; + } else { + // The token is not an operator, it's a literal value or an identifier. + // Push it onto the stack as-is. Use push_back instead of PushValue + // because PushValue pushes ValueType as a string, but token is already + // a string. + stack_.push_back(token); + } + return true; +} + +template +bool PostfixEvaluator::EvaluateInternal( + const string& expression, + DictionaryValidityType* assigned) { + // Tokenize, splitting on whitespace. + istringstream stream(expression); + string token; + while (stream >> token) { + // Normally, tokens are whitespace-separated, but occasionally, the + // assignment operator is smashed up against the next token, i.e. + // $T0 $ebp 128 + =$eip $T0 4 + ^ =$ebp $T0 ^ = + // This has been observed in program strings produced by MSVS 2010 in LTO + // mode. + if (token.size() > 1 && token[0] == '=') { + if (!EvaluateToken("=", expression, assigned)) { + return false; + } + + if (!EvaluateToken(token.substr(1), expression, assigned)) { + return false; + } + } else if (!EvaluateToken(token, expression, assigned)) { + return false; + } + } + + return true; +} + +template +bool PostfixEvaluator::Evaluate(const string& expression, + DictionaryValidityType* assigned) { + // Ensure that the stack is cleared before returning. + AutoStackClearer clearer(&stack_); + + if (!EvaluateInternal(expression, assigned)) + return false; + + // If there's anything left on the stack, it indicates incomplete execution. + // This is a failure case. If the stack is empty, evalution was complete + // and successful. + if (stack_.empty()) + return true; + + BPLOG(ERROR) << "Incomplete execution: " << expression; + return false; +} + +template +bool PostfixEvaluator::EvaluateForValue(const string& expression, + ValueType* result) { + // Ensure that the stack is cleared before returning. + AutoStackClearer clearer(&stack_); + + if (!EvaluateInternal(expression, NULL)) + return false; + + // A successful execution should leave exactly one value on the stack. + if (stack_.size() != 1) { + BPLOG(ERROR) << "Expression yielded bad number of results: " + << "'" << expression << "'"; + return false; + } + + return PopValue(result); +} + +template +typename PostfixEvaluator::PopResult +PostfixEvaluator::PopValueOrIdentifier( + ValueType* value, string* identifier) { + // There needs to be at least one element on the stack to pop. + if (!stack_.size()) + return POP_RESULT_FAIL; + + string token = stack_.back(); + stack_.pop_back(); + + // First, try to treat the value as a literal. Literals may have leading + // '-' sign, and the entire remaining string must be parseable as + // ValueType. If this isn't possible, it can't be a literal, so treat it + // as an identifier instead. + // + // Some versions of the libstdc++, the GNU standard C++ library, have + // stream extractors for unsigned integer values that permit a leading + // '-' sign (6.0.13); others do not (6.0.9). Since we require it, we + // handle it explicitly here. + istringstream token_stream(token); + ValueType literal = ValueType(); + bool negative; + if (token_stream.peek() == '-') { + negative = true; + token_stream.get(); + } else { + negative = false; + } + if (token_stream >> literal && token_stream.peek() == EOF) { + if (value) { + *value = literal; + } + if (negative) + *value = -*value; + return POP_RESULT_VALUE; + } else { + if (identifier) { + *identifier = token; + } + return POP_RESULT_IDENTIFIER; + } +} + + +template +bool PostfixEvaluator::PopValue(ValueType* value) { + ValueType literal = ValueType(); + string token; + PopResult result; + if ((result = PopValueOrIdentifier(&literal, &token)) == POP_RESULT_FAIL) { + return false; + } else if (result == POP_RESULT_VALUE) { + // This is the easy case. + *value = literal; + } else { // result == POP_RESULT_IDENTIFIER + // There was an identifier at the top of the stack. Resolve it to a + // value by looking it up in the dictionary. + typename DictionaryType::const_iterator iterator = + dictionary_->find(token); + if (iterator == dictionary_->end()) { + // The identifier wasn't found in the dictionary. Don't imply any + // default value, just fail. + BPLOG(INFO) << "Identifier " << token << " not in dictionary"; + return false; + } + + *value = iterator->second; + } + + return true; +} + + +template +bool PostfixEvaluator::PopValues(ValueType* value1, + ValueType* value2) { + return PopValue(value2) && PopValue(value1); +} + + +template +void PostfixEvaluator::PushValue(const ValueType& value) { + ostringstream token_stream; + token_stream << value; + stack_.push_back(token_stream.str()); +} + + +} // namespace google_breakpad + + +#endif // PROCESSOR_POSTFIX_EVALUATOR_INL_H__ diff --git a/src/processor/postfix_evaluator.h b/src/processor/postfix_evaluator.h new file mode 100644 index 0000000..b6f718a --- /dev/null +++ b/src/processor/postfix_evaluator.h @@ -0,0 +1,178 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// postfix_evaluator.h: Postfix (reverse Polish) notation expression evaluator. +// +// PostfixEvaluator evaluates an expression, using the expression itself +// in postfix (reverse Polish) notation and a dictionary mapping constants +// and variables to their values. The evaluator supports standard +// arithmetic operations, assignment into variables, and when an optional +// MemoryRange is provided, dereferencing. (Any unary key-to-value operation +// may be used with a MemoryRange implementation that returns the appropriate +// values, but PostfixEvaluator was written with dereferencing in mind.) +// +// The expression language is simple. Expressions are supplied as strings, +// with operands and operators delimited by whitespace. Operands may be +// either literal values suitable for ValueType, or constants or variables, +// which reference the dictionary. The supported binary operators are + +// (addition), - (subtraction), * (multiplication), / (quotient of division), +// % (modulus of division), and @ (data alignment). The alignment operator (@) +// accepts a value and an alignment size, and produces a result that is a +// multiple of the alignment size by truncating the input value. +// The unary ^ (dereference) operator is also provided. These operators +// allow any operand to be either a literal value, constant, or variable. +// Assignment (=) of any type of operand into a variable is also supported. +// +// The dictionary is provided as a map with string keys. Keys beginning +// with the '$' character are treated as variables. All other keys are +// treated as constants. Any results must be assigned into variables in the +// dictionary. These variables do not need to exist prior to calling +// Evaluate, unless used in an expression prior to being assigned to. The +// internal stack state is not made available after evaluation, and any +// values remaining on the stack are treated as evidence of incomplete +// execution and cause the evaluator to indicate failure. +// +// PostfixEvaluator is intended to support evaluation of "program strings" +// obtained from MSVC frame data debugging information in pdb files as +// returned by the DIA APIs. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_POSTFIX_EVALUATOR_H__ +#define PROCESSOR_POSTFIX_EVALUATOR_H__ + + +#include +#include +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +using std::map; +using std::vector; + +class MemoryRegion; + +template +class PostfixEvaluator { + public: + typedef map DictionaryType; + typedef map DictionaryValidityType; + + // Create a PostfixEvaluator object that may be used (with Evaluate) on + // one or more expressions. PostfixEvaluator does not take ownership of + // either argument. |memory| may be NULL, in which case dereferencing + // (^) will not be supported. |dictionary| may be NULL, but evaluation + // will fail in that case unless set_dictionary is used before calling + // Evaluate. + PostfixEvaluator(DictionaryType* dictionary, const MemoryRegion* memory) + : dictionary_(dictionary), memory_(memory), stack_() {} + + // Evaluate the expression, starting with an empty stack. The results of + // execution will be stored in one (or more) variables in the dictionary. + // Returns false if any failures occur during execution, leaving + // variables in the dictionary in an indeterminate state. If assigned is + // non-NULL, any keys set in the dictionary as a result of evaluation + // will also be set to true in assigned, providing a way to determine if + // an expression modifies any of its input variables. + bool Evaluate(const string& expression, DictionaryValidityType* assigned); + + // Like Evaluate, but provides the value left on the stack to the + // caller. If evaluation succeeds and leaves exactly one value on + // the stack, pop that value, store it in *result, and return true. + // Otherwise, return false. + bool EvaluateForValue(const string& expression, ValueType* result); + + DictionaryType* dictionary() const { return dictionary_; } + + // Reset the dictionary. PostfixEvaluator does not take ownership. + void set_dictionary(DictionaryType* dictionary) {dictionary_ = dictionary; } + + private: + // Return values for PopValueOrIdentifier + enum PopResult { + POP_RESULT_FAIL = 0, + POP_RESULT_VALUE, + POP_RESULT_IDENTIFIER + }; + + // Retrieves the topmost literal value, constant, or variable from the + // stack. Returns POP_RESULT_VALUE if the topmost entry is a literal + // value, and sets |value| accordingly. Returns POP_RESULT_IDENTIFIER + // if the topmost entry is a constant or variable identifier, and sets + // |identifier| accordingly. Returns POP_RESULT_FAIL on failure, such + // as when the stack is empty. + PopResult PopValueOrIdentifier(ValueType* value, string* identifier); + + // Retrieves the topmost value on the stack. If the topmost entry is + // an identifier, the dictionary is queried for the identifier's value. + // Returns false on failure, such as when the stack is empty or when + // a nonexistent identifier is named. + bool PopValue(ValueType* value); + + // Retrieves the top two values on the stack, in the style of PopValue. + // value2 is popped before value1, so that value1 corresponds to the + // entry that was pushed prior to value2. Returns false on failure. + bool PopValues(ValueType* value1, ValueType* value2); + + // Pushes a new value onto the stack. + void PushValue(const ValueType& value); + + // Evaluate expression, updating *assigned if it is non-zero. Return + // true if evaluation completes successfully. Do not clear the stack + // upon successful evaluation. + bool EvaluateInternal(const string& expression, + DictionaryValidityType* assigned); + + bool EvaluateToken(const string& token, + const string& expression, + DictionaryValidityType* assigned); + + // The dictionary mapping constant and variable identifiers (strings) to + // values. Keys beginning with '$' are treated as variable names, and + // PostfixEvaluator is free to create and modify these keys. Weak pointer. + DictionaryType* dictionary_; + + // If non-NULL, the MemoryRegion used for dereference (^) operations. + // If NULL, dereferencing is unsupported and will fail. Weak pointer. + const MemoryRegion* memory_; + + // The stack contains state information as execution progresses. Values + // are pushed on to it as the expression string is read and as operations + // yield values; values are popped when used as operands to operators. + vector stack_; +}; + +} // namespace google_breakpad + + +#endif // PROCESSOR_POSTFIX_EVALUATOR_H__ diff --git a/src/processor/postfix_evaluator_unittest.cc b/src/processor/postfix_evaluator_unittest.cc new file mode 100644 index 0000000..d3c5240 --- /dev/null +++ b/src/processor/postfix_evaluator_unittest.cc @@ -0,0 +1,406 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// postfix_evaluator_unittest.cc: Unit tests for PostfixEvaluator. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include + +#include "processor/postfix_evaluator-inl.h" + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/memory_region.h" +#include "processor/logging.h" + + +namespace { + + +using std::map; +using google_breakpad::MemoryRegion; +using google_breakpad::PostfixEvaluator; + + +// FakeMemoryRegion is used to test PostfixEvaluator's dereference (^) +// operator. The result of dereferencing a value is one greater than +// the value. +class FakeMemoryRegion : public MemoryRegion { + public: + virtual uint64_t GetBase() const { return 0; } + virtual uint32_t GetSize() const { return 0; } + virtual bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const { + *value = address + 1; + return true; + } + virtual bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const { + *value = address + 1; + return true; + } + virtual bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const { + *value = address + 1; + return true; + } + virtual bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const { + *value = address + 1; + return true; + } + virtual void Print() const { + assert(false); + } +}; + + +struct EvaluateTest { + // Expression passed to PostfixEvaluator::Evaluate. + const string expression; + + // True if the expression is expected to be evaluable, false if evaluation + // is expected to fail. + bool evaluable; +}; + + +struct EvaluateTestSet { + // The dictionary used for all tests in the set. + PostfixEvaluator::DictionaryType* dictionary; + + // The list of tests. + const EvaluateTest* evaluate_tests; + + // The number of tests. + unsigned int evaluate_test_count; + + // Identifiers and their expected values upon completion of the Evaluate + // tests in the set. + map* validate_data; +}; + + +struct EvaluateForValueTest { + // Expression passed to PostfixEvaluator::Evaluate. + const string expression; + + // True if the expression is expected to be evaluable, false if evaluation + // is expected to fail. + bool evaluable; + + // If evaluable, the value we expect it to yield. + unsigned int value; +}; + +static bool RunTests() { + // The first test set checks the basic operations and failure modes. + PostfixEvaluator::DictionaryType dictionary_0; + const EvaluateTest evaluate_tests_0[] = { + { "$rAdd 2 2 + =", true }, // $rAdd = 2 + 2 = 4 + { "$rAdd $rAdd 2 + =", true }, // $rAdd = $rAdd + 2 = 6 + { "$rAdd 2 $rAdd + =", true }, // $rAdd = 2 + $rAdd = 8 + { "99", false }, // put some junk on the stack... + { "$rAdd2 2 2 + =", true }, // ...and make sure things still work + { "$rAdd2\t2\n2 + =", true }, // same but with different whitespace + { "$rAdd2 2 2 + = ", true }, // trailing whitespace + { " $rAdd2 2 2 + =", true }, // leading whitespace + { "$rAdd2 2 2 + =", true }, // extra whitespace + { "$T0 2 = +", false }, // too few operands for add + { "2 + =", false }, // too few operands for add + { "2 +", false }, // too few operands for add + { "+", false }, // too few operands for add + { "^", false }, // too few operands for dereference + { "=", false }, // too few operands for assignment + { "2 =", false }, // too few operands for assignment + { "2 2 + =", false }, // too few operands for assignment + { "2 2 =", false }, // can't assign into a literal + { "k 2 =", false }, // can't assign into a constant + { "2", false }, // leftover data on stack + { "2 2 +", false }, // leftover data on stack + { "$rAdd", false }, // leftover data on stack + { "0 $T1 0 0 + =", false }, // leftover data on stack + { "$T2 $T2 2 + =", false }, // can't operate on an undefined value + { "$rMul 9 6 * =", true }, // $rMul = 9 * 6 = 54 + { "$rSub 9 6 - =", true }, // $rSub = 9 - 6 = 3 + { "$rDivQ 9 6 / =", true }, // $rDivQ = 9 / 6 = 1 + { "$rDivM 9 6 % =", true }, // $rDivM = 9 % 6 = 3 + { "$rDeref 9 ^ =", true }, // $rDeref = ^9 = 10 (FakeMemoryRegion) + { "$rAlign 36 8 @ =", true }, // $rAlign = 36 @ 8 + { "$rAdd3 2 2 + =$rMul2 9 6 * =", true } // smashed-equals tokenization + }; + map validate_data_0; + validate_data_0["$rAdd"] = 8; + validate_data_0["$rAdd2"] = 4; + validate_data_0["$rSub"] = 3; + validate_data_0["$rMul"] = 54; + validate_data_0["$rDivQ"] = 1; + validate_data_0["$rDivM"] = 3; + validate_data_0["$rDeref"] = 10; + validate_data_0["$rAlign"] = 32; + validate_data_0["$rAdd3"] = 4; + validate_data_0["$rMul2"] = 54; + + // The second test set simulates a couple of MSVC program strings. + // The data is fudged a little bit because the tests use FakeMemoryRegion + // instead of a real stack snapshot, but the program strings are real and + // the implementation doesn't know or care that the data is not real. + PostfixEvaluator::DictionaryType dictionary_1; + dictionary_1["$ebp"] = 0xbfff0010; + dictionary_1["$eip"] = 0x10000000; + dictionary_1["$esp"] = 0xbfff0000; + dictionary_1[".cbSavedRegs"] = 4; + dictionary_1[".cbParams"] = 4; + dictionary_1[".raSearchStart"] = 0xbfff0020; + const EvaluateTest evaluate_tests_1[] = { + { "$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = " + "$L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =", true }, + // Intermediate state: $T0 = 0xbfff0010, $eip = 0xbfff0015, + // $ebp = 0xbfff0011, $esp = 0xbfff0018, + // $L = 0xbfff000c, $P = 0xbfff001c + { "$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = " + "$L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =", + true }, + // Intermediate state: $T0 = 0xbfff0011, $eip = 0xbfff0016, + // $ebp = 0xbfff0012, $esp = 0xbfff0019, + // $L = 0xbfff000d, $P = 0xbfff001d, + // $ebx = 0xbffefff6 + { "$T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = " + "$esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = " + "$ebx $T0 28 - ^ =", + true } + }; + map validate_data_1; + validate_data_1["$T0"] = 0xbfff0012; + validate_data_1["$T1"] = 0xbfff0020; + validate_data_1["$T2"] = 0xbfff0019; + validate_data_1["$eip"] = 0xbfff0021; + validate_data_1["$ebp"] = 0xbfff0012; + validate_data_1["$esp"] = 0xbfff0024; + validate_data_1["$L"] = 0xbfff000e; + validate_data_1["$P"] = 0xbfff0028; + validate_data_1["$ebx"] = 0xbffefff7; + validate_data_1[".cbSavedRegs"] = 4; + validate_data_1[".cbParams"] = 4; + + EvaluateTestSet evaluate_test_sets[] = { + { &dictionary_0, evaluate_tests_0, + sizeof(evaluate_tests_0) / sizeof(EvaluateTest), &validate_data_0 }, + { &dictionary_1, evaluate_tests_1, + sizeof(evaluate_tests_1) / sizeof(EvaluateTest), &validate_data_1 }, + }; + + unsigned int evaluate_test_set_count = sizeof(evaluate_test_sets) / + sizeof(EvaluateTestSet); + + FakeMemoryRegion fake_memory; + PostfixEvaluator postfix_evaluator = + PostfixEvaluator(NULL, &fake_memory); + + for (unsigned int evaluate_test_set_index = 0; + evaluate_test_set_index < evaluate_test_set_count; + ++evaluate_test_set_index) { + EvaluateTestSet* evaluate_test_set = + &evaluate_test_sets[evaluate_test_set_index]; + const EvaluateTest* evaluate_tests = evaluate_test_set->evaluate_tests; + unsigned int evaluate_test_count = evaluate_test_set->evaluate_test_count; + + // The same dictionary will be used for each test in the set. Earlier + // tests can affect the state of the dictionary for later tests. + postfix_evaluator.set_dictionary(evaluate_test_set->dictionary); + + // Use a new validity dictionary for each test set. + PostfixEvaluator::DictionaryValidityType assigned; + + for (unsigned int evaluate_test_index = 0; + evaluate_test_index < evaluate_test_count; + ++evaluate_test_index) { + const EvaluateTest* evaluate_test = &evaluate_tests[evaluate_test_index]; + + // Do the test. + bool result = postfix_evaluator.Evaluate(evaluate_test->expression, + &assigned); + if (result != evaluate_test->evaluable) { + fprintf(stderr, "FAIL: evaluate set %d/%d, test %d/%d, " + "expression \"%s\", expected %s, observed %s\n", + evaluate_test_set_index, evaluate_test_set_count, + evaluate_test_index, evaluate_test_count, + evaluate_test->expression.c_str(), + evaluate_test->evaluable ? "evaluable" : "not evaluable", + result ? "evaluted" : "not evaluated"); + return false; + } + } + + // Validate the results. + for (map::const_iterator validate_iterator = + evaluate_test_set->validate_data->begin(); + validate_iterator != evaluate_test_set->validate_data->end(); + ++validate_iterator) { + const string identifier = validate_iterator->first; + unsigned int expected_value = validate_iterator->second; + + map::const_iterator dictionary_iterator = + evaluate_test_set->dictionary->find(identifier); + + // The identifier must exist in the dictionary. + if (dictionary_iterator == evaluate_test_set->dictionary->end()) { + fprintf(stderr, "FAIL: evaluate test set %d/%d, " + "validate identifier \"%s\", " + "expected %d, observed not found\n", + evaluate_test_set_index, evaluate_test_set_count, + identifier.c_str(), expected_value); + return false; + } + + // The value in the dictionary must be the same as the expected value. + unsigned int observed_value = dictionary_iterator->second; + if (expected_value != observed_value) { + fprintf(stderr, "FAIL: evaluate test set %d/%d, " + "validate identifier \"%s\", " + "expected %d, observed %d\n", + evaluate_test_set_index, evaluate_test_set_count, + identifier.c_str(), expected_value, observed_value); + return false; + } + + // The value must be set in the "assigned" dictionary if it was a + // variable. It must not have been assigned if it was a constant. + bool expected_assigned = identifier[0] == '$'; + bool observed_assigned = false; + PostfixEvaluator::DictionaryValidityType::const_iterator + iterator_assigned = assigned.find(identifier); + if (iterator_assigned != assigned.end()) { + observed_assigned = iterator_assigned->second; + } + if (expected_assigned != observed_assigned) { + fprintf(stderr, "FAIL: evaluate test set %d/%d, " + "validate assignment of \"%s\", " + "expected %d, observed %d\n", + evaluate_test_set_index, evaluate_test_set_count, + identifier.c_str(), expected_assigned, observed_assigned); + return false; + } + } + } + + // EvaluateForValue tests. + PostfixEvaluator::DictionaryType dictionary_2; + dictionary_2["$ebp"] = 0xbfff0010; + dictionary_2["$eip"] = 0x10000000; + dictionary_2["$esp"] = 0xbfff0000; + dictionary_2[".cbSavedRegs"] = 4; + dictionary_2[".cbParams"] = 4; + dictionary_2[".raSearchStart"] = 0xbfff0020; + const EvaluateForValueTest evaluate_for_value_tests_2[] = { + { "28907223", true, 28907223 }, // simple constant + { "89854293 40010015 +", true, 89854293 + 40010015 }, // arithmetic + { "-870245 8769343 +", true, 7899098 }, // negative constants + { "$ebp $esp - $eip +", true, 0x10000010 }, // variable references + { "18929794 34015074", false, 0 }, // too many values + { "$ebp $ebp 4 - =", false, 0 }, // too few values + { "$new $eip = $new", true, 0x10000000 }, // make new variable + { "$new 4 +", true, 0x10000004 }, // see prior assignments + { ".cfa 42 = 10", false, 0 } // can't set constants + }; + const int evaluate_for_value_tests_2_size + = (sizeof (evaluate_for_value_tests_2) + / sizeof (evaluate_for_value_tests_2[0])); + map validate_data_2; + validate_data_2["$eip"] = 0x10000000; + validate_data_2["$ebp"] = 0xbfff000c; + validate_data_2["$esp"] = 0xbfff0000; + validate_data_2["$new"] = 0x10000000; + validate_data_2[".cbSavedRegs"] = 4; + validate_data_2[".cbParams"] = 4; + validate_data_2[".raSearchStart"] = 0xbfff0020; + + postfix_evaluator.set_dictionary(&dictionary_2); + for (int i = 0; i < evaluate_for_value_tests_2_size; i++) { + const EvaluateForValueTest* test = &evaluate_for_value_tests_2[i]; + unsigned int result; + if (postfix_evaluator.EvaluateForValue(test->expression, &result) + != test->evaluable) { + fprintf(stderr, "FAIL: evaluate for value test %d, " + "expected evaluation to %s, but it %s\n", + i, test->evaluable ? "succeed" : "fail", + test->evaluable ? "failed" : "succeeded"); + return false; + } + if (test->evaluable && result != test->value) { + fprintf(stderr, "FAIL: evaluate for value test %d, " + "expected value to be 0x%x, but it was 0x%x\n", + i, test->value, result); + return false; + } + } + + for (map::iterator v = validate_data_2.begin(); + v != validate_data_2.end(); v++) { + map::iterator a = dictionary_2.find(v->first); + if (a == dictionary_2.end()) { + fprintf(stderr, "FAIL: evaluate for value dictionary check: " + "expected dict[\"%s\"] to be 0x%x, but it was unset\n", + v->first.c_str(), v->second); + return false; + } else if (a->second != v->second) { + fprintf(stderr, "FAIL: evaluate for value dictionary check: " + "expected dict[\"%s\"] to be 0x%x, but it was 0x%x\n", + v->first.c_str(), v->second, a->second); + return false; + } + dictionary_2.erase(a); + } + + map::iterator remaining = dictionary_2.begin(); + if (remaining != dictionary_2.end()) { + fprintf(stderr, "FAIL: evaluation of test expressions put unexpected " + "values in dictionary:\n"); + for (; remaining != dictionary_2.end(); remaining++) + fprintf(stderr, " dict[\"%s\"] == 0x%x\n", + remaining->first.c_str(), remaining->second); + return false; + } + + return true; +} + + +} // namespace + + +int main(int argc, char** argv) { + BPLOG_INIT(&argc, &argv); + + return RunTests() ? 0 : 1; +} diff --git a/src/processor/proc_maps_linux.cc b/src/processor/proc_maps_linux.cc new file mode 100644 index 0000000..6fcb909 --- /dev/null +++ b/src/processor/proc_maps_linux.cc @@ -0,0 +1,110 @@ +// Copyright 2013 Google LLC +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS +#endif + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/proc_maps_linux.h" + +#include +#include +#include + +#include "common/using_std_string.h" +#include "processor/logging.h" + +#if defined(OS_ANDROID) && !defined(__LP64__) +// In 32-bit mode, Bionic's inttypes.h defines PRI/SCNxPTR as an +// unsigned long int, which is incompatible with Bionic's stdint.h +// defining uintptr_t as an unsigned int: +// https://code.google.com/p/android/issues/detail?id=57218 +#undef SCNxPTR +#define SCNxPTR "x" +#endif + +namespace google_breakpad { + +bool ParseProcMaps(const string& input, + std::vector* regions_out) { + std::vector regions; + + // This isn't async safe nor terribly efficient, but it doesn't need to be at + // this point in time. + + // Split the string by newlines. + std::vector lines; + string l = ""; + for (size_t i = 0; i < input.size(); i++) { + if (input[i] != '\n' && input[i] != '\r') { + l.push_back(input[i]); + } else if (l.size() > 0) { + lines.push_back(l); + l.clear(); + } + } + if (l.size() > 0) { + BPLOG(ERROR) << "Input doesn't end in newline"; + return false; + } + + for (size_t i = 0; i < lines.size(); ++i) { + MappedMemoryRegion region; + const char* line = lines[i].c_str(); + char permissions[5] = {'\0'}; // Ensure NUL-terminated string. + int path_index = 0; + + // Sample format from man 5 proc: + // + // address perms offset dev inode pathname + // 08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm + // + // The final %n term captures the offset in the input string, which is used + // to determine the path name. It *does not* increment the return value. + // Refer to man 3 sscanf for details. + if (sscanf(line, "%" SCNx64 "-%" SCNx64 " %4c %" SCNx64" %hhx:%hhx %" + SCNd64 " %n", ®ion.start, ®ion.end, permissions, + ®ion.offset, ®ion.major_device, ®ion.minor_device, + ®ion.inode, &path_index) < 7) { + BPLOG(ERROR) << "sscanf failed for line: " << line; + return false; + } + + region.permissions = 0; + + if (permissions[0] == 'r') + region.permissions |= MappedMemoryRegion::READ; + else if (permissions[0] != '-') + return false; + + if (permissions[1] == 'w') + region.permissions |= MappedMemoryRegion::WRITE; + else if (permissions[1] != '-') + return false; + + if (permissions[2] == 'x') + region.permissions |= MappedMemoryRegion::EXECUTE; + else if (permissions[2] != '-') + return false; + + if (permissions[3] == 'p') + region.permissions |= MappedMemoryRegion::PRIVATE; + else if (permissions[3] != 's' && permissions[3] != 'S') // Shared memory. + return false; + + // Pushing then assigning saves us a string copy. + regions.push_back(region); + regions.back().path.assign(line + path_index); + regions.back().line.assign(line); + } + + regions_out->swap(regions); + return true; +} + +} // namespace google_breakpad diff --git a/src/processor/proc_maps_linux_unittest.cc b/src/processor/proc_maps_linux_unittest.cc new file mode 100644 index 0000000..3d683ca --- /dev/null +++ b/src/processor/proc_maps_linux_unittest.cc @@ -0,0 +1,255 @@ +// Copyright 2013 Google LLC +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "breakpad_googletest_includes.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/proc_maps_linux.h" + +namespace { + +TEST(ProcMapsTest, Empty) { + std::vector regions; + EXPECT_TRUE(ParseProcMaps("", ®ions)); + EXPECT_EQ(0u, regions.size()); +} + +TEST(ProcMapsTest, NoSpaces) { + static const char kNoSpaces[] = + "00400000-0040b000 r-xp 00002200 fc:00 794418 /bin/cat\n"; + + std::vector regions; + ASSERT_TRUE(ParseProcMaps(kNoSpaces, ®ions)); + ASSERT_EQ(1u, regions.size()); + + EXPECT_EQ(0x00400000u, regions[0].start); + EXPECT_EQ(0x0040b000u, regions[0].end); + EXPECT_EQ(0x00002200u, regions[0].offset); + EXPECT_EQ("/bin/cat", regions[0].path); +} + +TEST(ProcMapsTest, Spaces) { + static const char kSpaces[] = + "00400000-0040b000 r-xp 00002200 fc:00 794418 /bin/space cat\n"; + + std::vector regions; + ASSERT_TRUE(ParseProcMaps(kSpaces, ®ions)); + ASSERT_EQ(1u, regions.size()); + + EXPECT_EQ(0x00400000u, regions[0].start); + EXPECT_EQ(0x0040b000u, regions[0].end); + EXPECT_EQ(0x00002200u, regions[0].offset); + EXPECT_EQ("/bin/space cat", regions[0].path); +} + +TEST(ProcMapsTest, NoNewline) { + static const char kNoSpaces[] = + "00400000-0040b000 r-xp 00002200 fc:00 794418 /bin/cat"; + + std::vector regions; + ASSERT_FALSE(ParseProcMaps(kNoSpaces, ®ions)); +} + +TEST(ProcMapsTest, NoPath) { + static const char kNoPath[] = + "00400000-0040b000 rw-p 00000000 00:00 0 \n"; + + std::vector regions; + ASSERT_TRUE(ParseProcMaps(kNoPath, ®ions)); + ASSERT_EQ(1u, regions.size()); + + EXPECT_EQ(0x00400000u, regions[0].start); + EXPECT_EQ(0x0040b000u, regions[0].end); + EXPECT_EQ(0x00000000u, regions[0].offset); + EXPECT_EQ("", regions[0].path); +} + +TEST(ProcMapsTest, Heap) { + static const char kHeap[] = + "022ac000-022cd000 rw-p 00000000 00:00 0 [heap]\n"; + + std::vector regions; + ASSERT_TRUE(ParseProcMaps(kHeap, ®ions)); + ASSERT_EQ(1u, regions.size()); + + EXPECT_EQ(0x022ac000u, regions[0].start); + EXPECT_EQ(0x022cd000u, regions[0].end); + EXPECT_EQ(0x00000000u, regions[0].offset); + EXPECT_EQ("[heap]", regions[0].path); +} + +#if defined(ARCH_CPU_32_BITS) +TEST(ProcMapsTest, Stack32) { + static const char kStack[] = + "beb04000-beb25000 rw-p 00000000 00:00 0 [stack]\n"; + + std::vector regions; + ASSERT_TRUE(ParseProcMaps(kStack, ®ions)); + ASSERT_EQ(1u, regions.size()); + + EXPECT_EQ(0xbeb04000u, regions[0].start); + EXPECT_EQ(0xbeb25000u, regions[0].end); + EXPECT_EQ(0x00000000u, regions[0].offset); + EXPECT_EQ("[stack]", regions[0].path); +} +#elif defined(ARCH_CPU_64_BITS) +TEST(ProcMapsTest, Stack64) { + static const char kStack[] = + "7fff69c5b000-7fff69c7d000 rw-p 00000000 00:00 0 [stack]\n"; + + std::vector regions; + ASSERT_TRUE(ParseProcMaps(kStack, ®ions)); + ASSERT_EQ(1u, regions.size()); + + EXPECT_EQ(0x7fff69c5b000u, regions[0].start); + EXPECT_EQ(0x7fff69c7d000u, regions[0].end); + EXPECT_EQ(0x00000000u, regions[0].offset); + EXPECT_EQ("[stack]", regions[0].path); +} +#endif + +TEST(ProcMapsTest, Multiple) { + static const char kMultiple[] = + "00400000-0040b000 r-xp 00000000 fc:00 794418 /bin/cat\n" + "0060a000-0060b000 r--p 0000a000 fc:00 794418 /bin/cat\n" + "0060b000-0060c000 rw-p 0000b000 fc:00 794418 /bin/cat\n"; + + std::vector regions; + ASSERT_TRUE(ParseProcMaps(kMultiple, ®ions)); + ASSERT_EQ(3u, regions.size()); + + EXPECT_EQ(0x00400000u, regions[0].start); + EXPECT_EQ(0x0040b000u, regions[0].end); + EXPECT_EQ(0x00000000u, regions[0].offset); + EXPECT_EQ("/bin/cat", regions[0].path); + + EXPECT_EQ(0x0060a000u, regions[1].start); + EXPECT_EQ(0x0060b000u, regions[1].end); + EXPECT_EQ(0x0000a000u, regions[1].offset); + EXPECT_EQ("/bin/cat", regions[1].path); + + EXPECT_EQ(0x0060b000u, regions[2].start); + EXPECT_EQ(0x0060c000u, regions[2].end); + EXPECT_EQ(0x0000b000u, regions[2].offset); + EXPECT_EQ("/bin/cat", regions[2].path); +} + +TEST(ProcMapsTest, Permissions) { + static struct { + const char* input; + uint8_t permissions; + } kTestCases[] = { + {"00400000-0040b000 ---s 00000000 fc:00 794418 /bin/cat\n", 0}, + {"00400000-0040b000 ---S 00000000 fc:00 794418 /bin/cat\n", 0}, + {"00400000-0040b000 r--s 00000000 fc:00 794418 /bin/cat\n", + google_breakpad::MappedMemoryRegion::READ}, + {"00400000-0040b000 -w-s 00000000 fc:00 794418 /bin/cat\n", + google_breakpad::MappedMemoryRegion::WRITE}, + {"00400000-0040b000 --xs 00000000 fc:00 794418 /bin/cat\n", + google_breakpad::MappedMemoryRegion::EXECUTE}, + {"00400000-0040b000 rwxs 00000000 fc:00 794418 /bin/cat\n", + google_breakpad::MappedMemoryRegion::READ + | google_breakpad::MappedMemoryRegion::WRITE + | google_breakpad::MappedMemoryRegion::EXECUTE}, + {"00400000-0040b000 ---p 00000000 fc:00 794418 /bin/cat\n", + google_breakpad::MappedMemoryRegion::PRIVATE}, + {"00400000-0040b000 r--p 00000000 fc:00 794418 /bin/cat\n", + google_breakpad::MappedMemoryRegion::READ + | google_breakpad::MappedMemoryRegion::PRIVATE}, + {"00400000-0040b000 -w-p 00000000 fc:00 794418 /bin/cat\n", + google_breakpad::MappedMemoryRegion::WRITE + | google_breakpad::MappedMemoryRegion::PRIVATE}, + {"00400000-0040b000 --xp 00000000 fc:00 794418 /bin/cat\n", + google_breakpad::MappedMemoryRegion::EXECUTE + | google_breakpad::MappedMemoryRegion::PRIVATE}, + {"00400000-0040b000 rwxp 00000000 fc:00 794418 /bin/cat\n", + google_breakpad::MappedMemoryRegion::READ + | google_breakpad::MappedMemoryRegion::WRITE + | google_breakpad::MappedMemoryRegion::EXECUTE + | google_breakpad::MappedMemoryRegion::PRIVATE}, + }; + + for (size_t i = 0; i < sizeof(kTestCases) / sizeof(kTestCases[0]); ++i) { + std::vector regions; + EXPECT_TRUE(ParseProcMaps(kTestCases[i].input, ®ions)); + EXPECT_EQ(1u, regions.size()); + if (regions.empty()) + continue; + EXPECT_EQ(kTestCases[i].permissions, regions[0].permissions); + } +} + +TEST(ProcMapsTest, MissingFields) { + static const char* kTestCases[] = { + "00400000\n", // Missing end + beyond. + "00400000-0040b000\n", // Missing perms + beyond. + "00400000-0040b000 r-xp\n", // Missing offset + beyond. + "00400000-0040b000 r-xp 00000000\n", // Missing device + beyond. + "00400000-0040b000 r-xp 00000000 fc:00\n", // Missing inode + beyond. + "00400000-0040b000 00000000 fc:00 794418 /bin/cat\n", // Missing perms. + "00400000-0040b000 r-xp fc:00 794418 /bin/cat\n", // Missing offset. + "00400000-0040b000 r-xp 00000000 fc:00 /bin/cat\n", // Missing inode. + "00400000 r-xp 00000000 fc:00 794418 /bin/cat\n", // Missing end. + "-0040b000 r-xp 00000000 fc:00 794418 /bin/cat\n", // Missing start. + "00400000-0040b000 r-xp 00000000 794418 /bin/cat\n", // Missing device. + }; + + for (size_t i = 0; i < sizeof(kTestCases) / sizeof(kTestCases[0]); ++i) { + std::vector regions; + EXPECT_FALSE(ParseProcMaps(kTestCases[i], ®ions)); + } +} + +TEST(ProcMapsTest, InvalidInput) { + static const char* kTestCases[] = { + "thisisal-0040b000 rwxp 00000000 fc:00 794418 /bin/cat\n", + "0040000d-linvalid rwxp 00000000 fc:00 794418 /bin/cat\n", + "00400000-0040b000 inpu 00000000 fc:00 794418 /bin/cat\n", + "00400000-0040b000 rwxp tforproc fc:00 794418 /bin/cat\n", + "00400000-0040b000 rwxp 00000000 ma:ps 794418 /bin/cat\n", + "00400000-0040b000 rwxp 00000000 fc:00 parse! /bin/cat\n", + }; + + for (size_t i = 0; i < sizeof(kTestCases) / sizeof(kTestCases[0]); ++i) { + std::vector regions; + EXPECT_FALSE(ParseProcMaps(kTestCases[i], ®ions)); + } +} + +TEST(ProcMapsTest, ParseProcMapsEmptyString) { + std::vector regions; + EXPECT_TRUE(ParseProcMaps("", ®ions)); + EXPECT_EQ(0ULL, regions.size()); +} + +// Testing a couple of remotely possible weird things in the input: +// - Line ending with \r\n or \n\r. +// - File name contains quotes. +// - File name has whitespaces. +TEST(ProcMapsTest, ParseProcMapsWeirdCorrectInput) { + std::vector regions; + const string kContents = + "00400000-0040b000 r-xp 00000000 fc:00 2106562 " + " /bin/cat\r\n" + "7f53b7dad000-7f53b7f62000 r-xp 00000000 fc:00 263011 " + " /lib/x86_64-linux-gnu/libc-2.15.so\n\r" + "7f53b816d000-7f53b818f000 r-xp 00000000 fc:00 264284 " + " /lib/x86_64-linux-gnu/ld-2.15.so\n" + "7fff9c7ff000-7fff9c800000 r-xp 00000000 00:00 0 " + " \"vd so\"\n" + "ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 " + " [vsys call]\n"; + EXPECT_TRUE(ParseProcMaps(kContents, ®ions)); + EXPECT_EQ(5ULL, regions.size()); + EXPECT_EQ("/bin/cat", regions[0].path); + EXPECT_EQ("/lib/x86_64-linux-gnu/libc-2.15.so", regions[1].path); + EXPECT_EQ("/lib/x86_64-linux-gnu/ld-2.15.so", regions[2].path); + EXPECT_EQ("\"vd so\"", regions[3].path); + EXPECT_EQ("[vsys call]", regions[4].path); +} + +} // namespace diff --git a/src/processor/process_state.cc b/src/processor/process_state.cc new file mode 100644 index 0000000..c5c38b6 --- /dev/null +++ b/src/processor/process_state.cc @@ -0,0 +1,75 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// process_state.cc: A snapshot of a process, in a fully-digested state. +// +// See process_state.h for documentation. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_modules.h" + +namespace google_breakpad { + +ProcessState::~ProcessState() { + Clear(); +} + +void ProcessState::Clear() { + time_date_stamp_ = 0; + process_create_time_ = 0; + crashed_ = false; + crash_reason_.clear(); + crash_address_ = 0; + assertion_.clear(); + requesting_thread_ = -1; + for (vector::const_iterator iterator = threads_.begin(); + iterator != threads_.end(); + ++iterator) { + delete *iterator; + } + threads_.clear(); + system_info_.Clear(); + thread_names_.clear(); + // modules_without_symbols_ and modules_with_corrupt_symbols_ DO NOT own + // the underlying CodeModule pointers. Just clear the vectors. + modules_without_symbols_.clear(); + modules_with_corrupt_symbols_.clear(); + delete modules_; + modules_ = NULL; + delete unloaded_modules_; + unloaded_modules_ = NULL; +} + +} // namespace google_breakpad diff --git a/src/processor/proto/README b/src/processor/proto/README new file mode 100644 index 0000000..f9e5a4d --- /dev/null +++ b/src/processor/proto/README @@ -0,0 +1,20 @@ +If you wish to use these protobufs, you must generate their source files +using protoc from the protobuf project (https://github.com/google/protobuf). + +----- +Troubleshooting for Protobuf: + +Install: +If you are getting permission errors install, make sure you are not trying to +install from an NFS. + + +Running protoc: +protoc: error while loading shared libraries: libprotobuf.so.0: cannot open +shared object file: No such file or directory + +The issue is that Ubuntu 8.04 doesn't include /usr/local/lib in +library paths. + +To fix it for your current terminal session, just type in +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib diff --git a/src/processor/proto/process_state.proto b/src/processor/proto/process_state.proto new file mode 100644 index 0000000..f6b5fb4 --- /dev/null +++ b/src/processor/proto/process_state.proto @@ -0,0 +1,209 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// process_state_proto.proto: A client proto representation of a process, +// in a fully-digested state. +// +// Derived from earlier struct and class based models of a client-side +// processed minidump found under src/google_breakpad/processor. The +// file process_state.h holds the top level representation of this model, +// supported by additional classes. We've added a proto representation +// to ease serialization and parsing for server-side storage of crash +// reports processed on the client. +// +// Author: Jess Gray + +syntax = "proto2"; + +package google_breakpad; + +// A proto representation of a process, in a fully-digested state. +// See src/google_breakpad/processor/process_state.h +message ProcessStateProto { + // Next value: 14 + + // The time-date stamp of the original minidump (time_t format) + optional int64 time_date_stamp = 1; + + // The time-date stamp when the process was created (time_t format) + optional int64 process_create_time = 13; + + message Crash { + // The type of crash. OS- and possibly CPU- specific. For example, + // "EXCEPTION_ACCESS_VIOLATION" (Windows), "EXC_BAD_ACCESS / + // KERN_INVALID_ADDRESS" (Mac OS X), "SIGSEGV" (other Unix). + required string reason = 1; + + // If crash_reason implicates memory, the memory address that caused the + // crash. For data access errors, this will be the data address that + // caused the fault. For code errors, this will be the address of the + // instruction that caused the fault. + required int64 address = 2; + } + optional Crash crash = 2; + + + // If there was an assertion that was hit, a textual representation + // of that assertion, possibly including the file and line at which + // it occurred. + optional string assertion = 3; + + // The index of the thread that requested a dump be written in the + // threads vector. If a dump was produced as a result of a crash, this + // will point to the thread that crashed. If the dump was produced as + // by user code without crashing, and the dump contains extended Breakpad + // information, this will point to the thread that requested the dump. + optional int32 requesting_thread = 4; + + message Thread { + // Stack for the given thread + repeated StackFrame frames = 1; + } + + // Stacks for each thread (except possibly the exception handler + // thread) at the time of the crash. + repeated Thread threads = 5; + + // The modules that were loaded into the process represented by the + // ProcessState. + repeated CodeModule modules = 6; + + // System Info: OS and CPU + + // A string identifying the operating system, such as "Windows NT", + // "Mac OS X", or "Linux". If the information is present in the dump but + // its value is unknown, this field will contain a numeric value. If + // the information is not present in the dump, this field will be empty. + optional string os = 7; + + // A short form of the os string, using lowercase letters and no spaces, + // suitable for use in a filesystem. Possible values are "windows", + // "mac", and "linux". Empty if the information is not present in the dump + // or if the OS given by the dump is unknown. The values stored in this + // field should match those used by MinidumpSystemInfo::GetOS. + optional string os_short = 8; + + // A string identifying the version of the operating system, such as + // "5.1.2600 Service Pack 2" or "10.4.8 8L2127". If the dump does not + // contain this information, this field will be empty. + optional string os_version = 9; + + // A string identifying the basic CPU family, such as "x86" or "ppc". + // If this information is present in the dump but its value is unknown, + // this field will contain a numeric value. If the information is not + // present in the dump, this field will be empty. The values stored in + // this field should match those used by MinidumpSystemInfo::GetCPU. + optional string cpu = 10; + + // A string further identifying the specific CPU, such as + // "GenuineIntel level 6 model 13 stepping 8". If the information is not + // present in the dump, or additional identifying information is not + // defined for the CPU family, this field will be empty. + optional string cpu_info = 11; + + // The number of processors in the system. Will be greater than one for + // multi-core systems. + optional int32 cpu_count = 12; + + // Leave the ability to add the raw minidump to this representation +} + + +// Represents a single frame in a stack +// See src/google_breakpad/processor/code_module.h +message StackFrame { + // Next value: 8 + + // The program counter location as an absolute virtual address. For the + // innermost called frame in a stack, this will be an exact program counter + // or instruction pointer value. For all other frames, this will be within + // the instruction that caused execution to branch to a called function, + // but may not necessarily point to the exact beginning of that instruction. + required int64 instruction = 1; + + // The module in which the instruction resides. + optional CodeModule module = 2; + + // The function name, may be omitted if debug symbols are not available. + optional string function_name = 3; + + // The start address of the function, may be omitted if debug symbols + // are not available. + optional int64 function_base = 4; + + // The source file name, may be omitted if debug symbols are not available. + optional string source_file_name = 5; + + // The (1-based) source line number, may be omitted if debug symbols are + // not available. + optional int32 source_line = 6; + + // The start address of the source line, may be omitted if debug symbols + // are not available. + optional int64 source_line_base = 7; +} + + +// Carries information about code modules that are loaded into a process. +// See src/google_breakpad/processor/code_module.h +message CodeModule { + // Next value: 8 + + // The base address of this code module as it was loaded by the process. + optional int64 base_address = 1; + + // The size of the code module. + optional int64 size = 2; + + // The path or file name that the code module was loaded from. + optional string code_file = 3; + + // An identifying string used to discriminate between multiple versions and + // builds of the same code module. This may contain a uuid, timestamp, + // version number, or any combination of this or other information, in an + // implementation-defined format. + optional string code_identifier = 4; + + // The filename containing debugging information associated with the code + // module. If debugging information is stored in a file separate from the + // code module itself (as is the case when .pdb or .dSYM files are used), + // this will be different from code_file. If debugging information is + // stored in the code module itself (possibly prior to stripping), this + // will be the same as code_file. + optional string debug_file = 5; + + // An identifying string similar to code_identifier, but identifies a + // specific version and build of the associated debug file. This may be + // the same as code_identifier when the debug_file and code_file are + // identical or when the same identifier is used to identify distinct + // debug and code files. + optional string debug_identifier = 6; + + // A human-readable representation of the code module's version. + optional string version = 7; +} diff --git a/src/processor/range_map-inl.h b/src/processor/range_map-inl.h new file mode 100644 index 0000000..860314f --- /dev/null +++ b/src/processor/range_map-inl.h @@ -0,0 +1,296 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// range_map-inl.h: Range map implementation. +// +// See range_map.h for documentation. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_RANGE_MAP_INL_H__ +#define PROCESSOR_RANGE_MAP_INL_H__ + + +#include + +#include "common/safe_math.h" +#include "processor/range_map.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" + + +namespace google_breakpad { + +template +bool RangeMap::StoreRange(const AddressType& base, + const AddressType& size, + const EntryType& entry) { + return StoreRangeInternal(base, 0 /* delta */, size, entry); +} + +template +bool RangeMap::StoreRangeInternal( + const AddressType& base, const AddressType& delta, + const AddressType& size, const EntryType& entry) { + AddressType high; + bool high_ok = false; + if (size > 0) { + std::pair result = AddWithOverflowCheck(base, size - 1); + high = result.first; + high_ok = !result.second; + } + // Check for undersize or overflow. + if (!high_ok) { + // The processor will hit this case too frequently with common symbol + // files in the size == 0 case, which is more suited to a DEBUG channel. + // Filter those out since there's no DEBUG channel at the moment. + BPLOG_IF(INFO, size != 0) << "StoreRangeInternal failed, " + << HexString(base) << "+" << HexString(size) + << ", " << HexString(high) + << ", delta: " << HexString(delta); + return false; + } + + // Ensure that this range does not overlap with another one already in the + // map. + MapConstIterator iterator_base = map_.lower_bound(base); + MapConstIterator iterator_high = map_.lower_bound(high); + + if (iterator_base != iterator_high) { + // Some other range ends in the space used by this range. It may be + // contained within the space used by this range, or it may extend lower. + if (merge_strategy_ == MergeRangeStrategy::kTruncateLower) { + // kTruncate the range with the lower base address. + AddressType other_base = iterator_base->second.base(); + if (base < other_base) { + return StoreRangeInternal(base, delta, other_base - base, entry); + } else if (other_base < base) { + EntryType other_entry; + AddressType other_high, other_size, other_delta; + other_high = iterator_base->first; + RetrieveRange(other_high, &other_entry, &other_base, &other_delta, + &other_size); + map_.erase(iterator_base); + map_.insert( + MapValue(base - 1, Range(other_base, other_delta, other_entry))); + return StoreRangeInternal(base, delta, size, entry); + } else { + return false; + } + } else if (merge_strategy_ == MergeRangeStrategy::kTruncateUpper) { + // Truncate the lower portion of this range. + AddressType additional_delta = iterator_base->first - base + 1; + return StoreRangeInternal(base + additional_delta, + delta + additional_delta, + size - additional_delta, entry); + } else { + // The processor hits this case too frequently with common symbol files. + // This is most appropriate for a DEBUG channel, but since none exists + // now simply comment out this logging. + // AddressType other_base = iterator_base->second.base(); + // AddressType other_size = iterator_base->first - other_base + 1; + // BPLOG(INFO) << "StoreRangeInternal failed, an existing range is " + // << "overlapping with the new range: new " + // << HexString(base) << "+" << HexString(size) + // << ", existing " << HexString(other_base) << "+" + // << HexString(other_size); + return false; + } + } + + if (iterator_high != map_.end() && iterator_high->second.base() <= high) { + // The range above this one overlaps with this one. It may fully + // contain this range, or it may begin within this range and extend + // higher. + if (merge_strategy_ == MergeRangeStrategy::kTruncateLower) { + AddressType other_base = iterator_high->second.base(); + if (base < other_base) { + return StoreRangeInternal(base, delta, other_base - base, entry); + } else if (other_base < base) { + EntryType other_entry; + AddressType other_high, other_size, other_delta; + other_high = iterator_high->first; + RetrieveRange(other_high, &other_entry, &other_base, &other_delta, + &other_size); + map_.erase(iterator_high); + map_.insert( + MapValue(base - 1, Range(other_base, other_delta, other_entry))); + return StoreRangeInternal(base, delta, size, entry); + } else { + return false; + } + } else if (merge_strategy_ == MergeRangeStrategy::kTruncateUpper && + iterator_high->first > high) { + // Shrink the other range down. + AddressType other_high = iterator_high->first; + AddressType additional_delta = high - iterator_high->second.base() + 1; + EntryType other_entry; + AddressType other_base = AddressType(); + AddressType other_size = AddressType(); + AddressType other_delta = AddressType(); + RetrieveRange(other_high, &other_entry, &other_base, &other_delta, + &other_size); + map_.erase(iterator_high); + map_.insert(MapValue(other_high, + Range(other_base + additional_delta, + other_delta + additional_delta, other_entry))); + // Retry to store this range. + return StoreRangeInternal(base, delta, size, entry); + } else { + // The processor hits this case too frequently with common symbol files. + // This is most appropriate for a DEBUG channel, but since none exists + // now simply comment out this logging. + // + // AddressType other_base = iterator_high->second.base(); + // AddressType other_size = iterator_high->first - other_base + 1; + // BPLOG(INFO) << "StoreRangeInternal failed, an existing range " + // << "contains or extends higher than the new range: new " + // << HexString(base) << "+" << HexString(size) + // << ", existing " << HexString(other_base) << "+" + // << HexString(other_size); + return false; + } + } + + // Store the range in the map by its high address, so that lower_bound can + // be used to quickly locate a range by address. + map_.insert(MapValue(high, Range(base, delta, entry))); + return true; +} + + +template +bool RangeMap::RetrieveRange( + const AddressType& address, EntryType* entry, AddressType* entry_base, + AddressType* entry_delta, AddressType* entry_size) const { + BPLOG_IF(ERROR, !entry) << "RangeMap::RetrieveRange requires |entry|"; + assert(entry); + + MapConstIterator iterator = map_.lower_bound(address); + if (iterator == map_.end()) + return false; + + // The map is keyed by the high address of each range, so |address| is + // guaranteed to be lower than the range's high address. If |range| is + // not directly preceded by another range, it's possible for address to + // be below the range's low address, though. When that happens, address + // references something not within any range, so return false. + if (address < iterator->second.base()) + return false; + + *entry = iterator->second.entry(); + if (entry_base) + *entry_base = iterator->second.base(); + if (entry_delta) + *entry_delta = iterator->second.delta(); + if (entry_size) + *entry_size = iterator->first - iterator->second.base() + 1; + + return true; +} + + +template +bool RangeMap::RetrieveNearestRange( + const AddressType& address, EntryType* entry, AddressType* entry_base, + AddressType* entry_delta, AddressType* entry_size) const { + BPLOG_IF(ERROR, !entry) << "RangeMap::RetrieveNearestRange requires |entry|"; + assert(entry); + + // If address is within a range, RetrieveRange can handle it. + if (RetrieveRange(address, entry, entry_base, entry_delta, entry_size)) + return true; + + // upper_bound gives the first element whose key is greater than address, + // but we want the first element whose key is less than or equal to address. + // Decrement the iterator to get there, but not if the upper_bound already + // points to the beginning of the map - in that case, address is lower than + // the lowest stored key, so return false. + MapConstIterator iterator = map_.upper_bound(address); + if (iterator == map_.begin()) + return false; + --iterator; + + *entry = iterator->second.entry(); + if (entry_base) + *entry_base = iterator->second.base(); + if (entry_delta) + *entry_delta = iterator->second.delta(); + if (entry_size) + *entry_size = iterator->first - iterator->second.base() + 1; + + return true; +} + + +template +bool RangeMap::RetrieveRangeAtIndex( + int index, EntryType* entry, AddressType* entry_base, + AddressType* entry_delta, AddressType* entry_size) const { + BPLOG_IF(ERROR, !entry) << "RangeMap::RetrieveRangeAtIndex requires |entry|"; + assert(entry); + + if (index >= GetCount()) { + BPLOG(ERROR) << "Index out of range: " << index << "/" << GetCount(); + return false; + } + + // Walk through the map. Although it's ordered, it's not a vector, so it + // can't be addressed directly by index. + MapConstIterator iterator = map_.begin(); + for (int this_index = 0; this_index < index; ++this_index) + ++iterator; + + *entry = iterator->second.entry(); + if (entry_base) + *entry_base = iterator->second.base(); + if (entry_delta) + *entry_delta = iterator->second.delta(); + if (entry_size) + *entry_size = iterator->first - iterator->second.base() + 1; + + return true; +} + + +template +int RangeMap::GetCount() const { + return static_cast(map_.size()); +} + + +template +void RangeMap::Clear() { + map_.clear(); +} + + +} // namespace google_breakpad + + +#endif // PROCESSOR_RANGE_MAP_INL_H__ diff --git a/src/processor/range_map.h b/src/processor/range_map.h new file mode 100644 index 0000000..578bd14 --- /dev/null +++ b/src/processor/range_map.h @@ -0,0 +1,170 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// range_map.h: Range maps. +// +// A range map associates a range of addresses with a specific object. This +// is useful when certain objects of variable size are located within an +// address space. The range map makes it simple to determine which object is +// associated with a specific address, which may be any address within the +// range associated with an object. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_RANGE_MAP_H__ +#define PROCESSOR_RANGE_MAP_H__ + + +#include + + +namespace google_breakpad { + +// Forward declarations (for later friend declarations of specialized template). +template class RangeMapSerializer; + +// Determines what happens when two ranges overlap. +enum class MergeRangeStrategy { + // When two ranges overlap, the new range fails to be inserted. The default + // strategy. + kExclusiveRanges, + + // The range with the lower base address will be truncated such that it's + // high address is one less than the range above it. + kTruncateLower, + + // The range with the greater high address has its range truncated such that + // its base address is one higher than the range below it. + kTruncateUpper +}; + +template +class RangeMap { + public: + RangeMap() : merge_strategy_(MergeRangeStrategy::kExclusiveRanges), map_() {} + + void SetMergeStrategy(MergeRangeStrategy strat) { merge_strategy_ = strat; } + + MergeRangeStrategy GetMergeStrategy() const { return merge_strategy_; } + + // Inserts a range into the map. Returns false for a parameter error, + // or if the location of the range would conflict with a range already + // stored in the map. If enable_shrink_down is true and there is an overlap + // between the current range and some other range (already in the map), + // shrink down the range which ends at a higher address. + bool StoreRange(const AddressType& base, const AddressType& size, + const EntryType& entry); + + // Locates the range encompassing the supplied address. If there is no such + // range, returns false. entry_base, entry_delta, and entry_size, if + // non-NULL, are set to the base, delta, and size of the entry's range. + // A positive entry delta (> 0) indicates that there was an overlap and the + // entry was shrunk down (original start address was increased by delta). + bool RetrieveRange(const AddressType& address, EntryType* entry, + AddressType* entry_base, AddressType* entry_delta, + AddressType* entry_size) const; + + // Locates the range encompassing the supplied address, if one exists. + // If no range encompasses the supplied address, locates the nearest range + // to the supplied address that is lower than the address. Returns false + // if no range meets these criteria. entry_base, entry_delta, and entry_size, + // if non-NULL, are set to the base, delta, and size of the entry's range. + // A positive entry delta (> 0) indicates that there was an overlap and the + // entry was shrunk down (original start address was increased by delta). + bool RetrieveNearestRange(const AddressType& address, EntryType* entry, + AddressType* entry_base, AddressType* entry_delta, + AddressType* entry_size) const; + + // Treating all ranges as a list ordered by the address spaces that they + // occupy, locates the range at the index specified by index. Returns + // false if index is larger than the number of ranges stored. entry_base, + // entry_delta, and entry_size, if non-NULL, are set to the base, delta, and + // size of the entry's range. + // A positive entry delta (> 0) indicates that there was an overlap and the + // entry was shrunk down (original start address was increased by delta). + // + // RetrieveRangeAtIndex is not optimized for speedy operation. + bool RetrieveRangeAtIndex(int index, EntryType* entry, + AddressType* entry_base, AddressType* entry_delta, + AddressType* entry_size) const; + + // Returns the number of ranges stored in the RangeMap. + int GetCount() const; + + // Empties the range map, restoring it to the state it was when it was + // initially created. + void Clear(); + + private: + // Friend declarations. + friend class ModuleComparer; + friend class RangeMapSerializer; + + // Same a StoreRange() with the only exception that the |delta| can be + // passed in. + bool StoreRangeInternal(const AddressType& base, const AddressType& delta, + const AddressType& size, const EntryType& entry); + + class Range { + public: + Range(const AddressType& base, const AddressType& delta, + const EntryType& entry) + : base_(base), delta_(delta), entry_(entry) {} + + AddressType base() const { return base_; } + AddressType delta() const { return delta_; } + EntryType entry() const { return entry_; } + + private: + // The base address of the range. The high address does not need to + // be stored, because RangeMap uses it as the key to the map. + const AddressType base_; + + // The delta when the range is shrunk down. + const AddressType delta_; + + // The entry corresponding to a range. + const EntryType entry_; + }; + + // Convenience types. + typedef std::map AddressToRangeMap; + typedef typename AddressToRangeMap::const_iterator MapConstIterator; + typedef typename AddressToRangeMap::value_type MapValue; + + MergeRangeStrategy merge_strategy_; + + // Maps the high address of each range to a EntryType. + AddressToRangeMap map_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_RANGE_MAP_H__ diff --git a/src/processor/range_map_truncate_lower_unittest.cc b/src/processor/range_map_truncate_lower_unittest.cc new file mode 100644 index 0000000..b3599fc --- /dev/null +++ b/src/processor/range_map_truncate_lower_unittest.cc @@ -0,0 +1,349 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "processor/range_map-inl.h" + +#include "breakpad_googletest_includes.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" + +namespace { + +using google_breakpad::linked_ptr; +using google_breakpad::MergeRangeStrategy; +using google_breakpad::RangeMap; + +// A CountedObject holds an int. A global (not thread safe!) count of +// allocated CountedObjects is maintained to help test memory management. +class CountedObject { + public: + explicit CountedObject(int id) : id_(id) { ++count_; } + ~CountedObject() { --count_; } + + static int count() { return count_; } + int id() const { return id_; } + + private: + static int count_; + int id_; +}; + +int CountedObject::count_; + +typedef int AddressType; +typedef RangeMap> TestMap; + +// Same range cannot be stored wice. +TEST(RangeMapTruncateLower, SameRange) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateLower); + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE( + range_map.StoreRange(0 /* base address */, 100 /* size */, object_1)); + + // Same range cannot be stored wice. + linked_ptr object_2(new CountedObject(2)); + EXPECT_FALSE( + range_map.StoreRange(0 /* base address */, 100 /* size */, object_2)); +} + +// If a range is completely contained by another range, then the larger range +// should be truncated. +TEST(RangeMapTruncateLower, CompletelyContained) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateLower); + // Larger range is added first. + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE( + range_map.StoreRange(0 /* base address */, 100 /* size */, object_1)); + // Smaller (contained) range is added second. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE( + range_map.StoreRange(10 /* base address */, 80 /* size */, object_2)); + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The first range contains the second, so the first range should have been + // shrunk to [0, 10]. Range [90, 99] should be free. + EXPECT_FALSE(range_map.RetrieveRange(90, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_FALSE(range_map.RetrieveRange(99, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_TRUE(range_map.RetrieveRange(9, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(0, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(10, retrieved_size); + // Validate the properties of the smaller range (should be untouched). + EXPECT_TRUE(range_map.RetrieveRange(10, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(10, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(80, retrieved_size); +} + +// Same as the previous test, however the larger range is added second. +TEST(RangeMapTruncateLower, CompletelyContained_LargerAddedSecond) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateLower); + // Smaller (contained) range is added first. + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE( + range_map.StoreRange(10 /* base address */, 80 /* size */, object_1)); + // Larger range is added second. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE( + range_map.StoreRange(0 /* base address */, 100 /* size */, object_2)); + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The second range contains the first, so the second range should have been + // truncated to [0, 9]. Range [90, 99] should be free. + EXPECT_FALSE(range_map.RetrieveRange(90, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_FALSE(range_map.RetrieveRange(99, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_TRUE(range_map.RetrieveRange(9, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(0, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(10, retrieved_size); + // Validate the properties of the smaller range (should be untouched). + EXPECT_TRUE(range_map.RetrieveRange(10, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(10, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(80, retrieved_size); +} + +TEST(RangeMapTruncateLower, PartialOverlap_AtBeginning) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateLower); + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE( + range_map.StoreRange(0 /* base address */, 100 /* size */, object_1)); + + // Partial overlap at the beginning of the new range. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE( + range_map.StoreRange(90 /* base address */, 110 /* size */, object_2)); + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The first range should be truncated, so 99 should address the second range. + EXPECT_TRUE(range_map.RetrieveRange(99, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(90, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(110, retrieved_size); + // Validate the properties of the truncated range. + EXPECT_TRUE(range_map.RetrieveRange(89, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(0, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(90, retrieved_size); +} + +TEST(RangeMapTruncateLower, PartialOverlap_AtEnd) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateLower); + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE( + range_map.StoreRange(50 /* base address */, 50 /* size */, object_1)); + + // Partial overlap at the end of the new range. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE( + range_map.StoreRange(0 /* base address */, 70 /* size */, object_2)); + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The second range should be truncated so 69 addresses the first range. + EXPECT_TRUE(range_map.RetrieveRange(69, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(50, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(50, retrieved_size); + // Validate the properties of the truncated range. + EXPECT_TRUE(range_map.RetrieveRange(49, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(0, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(50, retrieved_size); +} + +// A new range is overlapped at both ends. The new range and the range +// that overlaps at the beginning should be truncated. The range that overlaps +// at the end should be left untouched. +TEST(RangeMapTruncateLower, OverlapAtBothEnds) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateLower); + // This should overlap object_3 at the beginning. + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE( + range_map.StoreRange(0 /* base address */, 100 /* size */, object_1)); + + // This should overlap object_3 at the end. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE( + range_map.StoreRange(100 /* base address */, 100 /* size */, object_2)); + + // This should be overlapped on both ends by object_1 and object_2. + linked_ptr object_3(new CountedObject(3)); + EXPECT_TRUE( + range_map.StoreRange(50 /* base address */, 100 /* size */, object_3)); + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The first range should be truncated. + EXPECT_TRUE(range_map.RetrieveRange(0, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(0, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(50, retrieved_size); + // The second range should be intact. + EXPECT_TRUE(range_map.RetrieveRange(150, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(100, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(100, retrieved_size); + // The third range (in the middle) should be truncated. + EXPECT_TRUE(range_map.RetrieveRange(99, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(3, object->id()); + EXPECT_EQ(50, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(50, retrieved_size); +} + +TEST(RangeMapTruncateLower, MultipleConflicts) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateLower); + // This should overlap with object_3. + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE( + range_map.StoreRange(10 /* base address */, 90 /* size */, object_1)); + + // This should also overlap with object_3 but after object_1. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE( + range_map.StoreRange(100 /* base address */, 100 /* size */, object_2)); + + // This should be overlapped on both object_1 and object_2. + linked_ptr object_3(new CountedObject(3)); + EXPECT_TRUE( + range_map.StoreRange(0 /* base address */, 300 /* size */, object_3)); + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The first range should be intact. + EXPECT_TRUE(range_map.RetrieveRange(99, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(10, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(90, retrieved_size); + // The second range should be intact. + EXPECT_TRUE(range_map.RetrieveRange(199, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(100, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(100, retrieved_size); + // The third range should be truncated. + EXPECT_TRUE(range_map.RetrieveRange(9, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(3, object->id()); + EXPECT_EQ(0, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(10, retrieved_size); +} + +// Adding two ranges without overlap should succeed and the ranges should +// be left intact. +TEST(RangeMapTruncateLower, NoConflicts) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateLower); + // Adding range 1. + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE( + range_map.StoreRange(10 /* base address */, 90 /* size */, object_1)); + + // Adding range 2 - no overlap with range 1. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE( + range_map.StoreRange(110 /* base address */, 90 /* size */, object_2)); + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The first range should be intact. + EXPECT_TRUE(range_map.RetrieveRange(99, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(10, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(90, retrieved_size); + // The second range should be intact. + EXPECT_TRUE(range_map.RetrieveRange(199, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(110, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(90, retrieved_size); +} + +} // namespace diff --git a/src/processor/range_map_truncate_upper_unittest.cc b/src/processor/range_map_truncate_upper_unittest.cc new file mode 100644 index 0000000..aa058ad --- /dev/null +++ b/src/processor/range_map_truncate_upper_unittest.cc @@ -0,0 +1,357 @@ +// Copyright 2016 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// range_map_shrink_down_unittest.cc: Unit tests for RangeMap that specifically +// test shrink down when ranges overlap. +// +// Author: Ivan Penkov + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "processor/range_map-inl.h" + +#include "breakpad_googletest_includes.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" + +namespace { + +using google_breakpad::linked_ptr; +using google_breakpad::MergeRangeStrategy; +using google_breakpad::RangeMap; + +// A CountedObject holds an int. A global (not thread safe!) count of +// allocated CountedObjects is maintained to help test memory management. +class CountedObject { + public: + explicit CountedObject(int id) : id_(id) { ++count_; } + ~CountedObject() { --count_; } + + static int count() { return count_; } + int id() const { return id_; } + + private: + static int count_; + int id_; +}; + +int CountedObject::count_; + +typedef int AddressType; +typedef RangeMap> TestMap; + +// Same range cannot be stored wice. +TEST(RangeMapTruncateUpper, SameRange) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateUpper); + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE(range_map.StoreRange(0 /* base address */, 100 /* size */, + object_1)); + + // Same range cannot be stored wice. + linked_ptr object_2(new CountedObject(2)); + EXPECT_FALSE(range_map.StoreRange(0 /* base address */, 100 /* size */, + object_2)); +} + +// If a range is completely contained by another range, then the larger range +// should be shrinked down. +TEST(RangeMapTruncateUpper, CompletelyContained) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateUpper); + // Larger range is added first. + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE(range_map.StoreRange(0 /* base address */, 100 /* size */, + object_1)); + // Smaller (contained) range is added second. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE(range_map.StoreRange(10 /* base address */, 80 /* size */, + object_2)); + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The first range contains the second, so the first range should have been + // shrunk to [90, 99]. Range [0, 9] should be free. + EXPECT_FALSE(range_map.RetrieveRange(0, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_FALSE(range_map.RetrieveRange(9, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_TRUE(range_map.RetrieveRange(90, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(90, retrieved_base); + EXPECT_EQ(90, retrieved_delta); + EXPECT_EQ(10, retrieved_size); + // Validate the properties of the smaller range (should be untouched). + EXPECT_TRUE(range_map.RetrieveRange(10, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(10, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(80, retrieved_size); +} + +// Same as the previous test, however the larger range is added second. +TEST(RangeMapTruncateUpper, CompletelyContained_LargerAddedSecond) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateUpper); + // Smaller (contained) range is added first. + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE(range_map.StoreRange(10 /* base address */, 80 /* size */, + object_1)); + // Larger range is added second. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE(range_map.StoreRange(0 /* base address */, 100 /* size */, + object_2)); + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The second range contains the first, so the second range should have been + // shrunk to [90, 99]. Range [0, 9] should be free. + EXPECT_FALSE(range_map.RetrieveRange(0, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_FALSE(range_map.RetrieveRange(9, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_TRUE(range_map.RetrieveRange(90, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(90, retrieved_base); + EXPECT_EQ(90, retrieved_delta); + EXPECT_EQ(10, retrieved_size); + // Validate the properties of the smaller range (should be untouched). + EXPECT_TRUE(range_map.RetrieveRange(10, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(10, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(80, retrieved_size); +} + +TEST(RangeMapTruncateUpper, PartialOverlap_AtBeginning) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateUpper); + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE(range_map.StoreRange(0 /* base address */, 100 /* size */, + object_1)); + + // Partial overlap at the beginning of the new range. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE(range_map.StoreRange(90 /* base address */, 110 /* size */, + object_2)); + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The second range is supposed to be shrunk down so the following address + // should resize in the first range. + EXPECT_TRUE(range_map.RetrieveRange(99, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(0, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(100, retrieved_size); + // Validate the properties of the shrunk down range. + EXPECT_TRUE(range_map.RetrieveRange(100, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(100, retrieved_base); + EXPECT_EQ(10, retrieved_delta); + EXPECT_EQ(100, retrieved_size); +} + +TEST(RangeMapTruncateUpper, PartialOverlap_AtEnd) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateUpper); + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE(range_map.StoreRange(50 /* base address */, 50 /* size */, + object_1)); + + // Partial overlap at the end of the new range. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE(range_map.StoreRange(0 /* base address */, 70 /* size */, + object_2)); + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The first range is supposed to be shrunk down so the following address + // should resize in the first range. + EXPECT_TRUE(range_map.RetrieveRange(69, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(0, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(70, retrieved_size); + // Validate the properties of the shrunk down range. + EXPECT_TRUE(range_map.RetrieveRange(70, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(70, retrieved_base); + EXPECT_EQ(20, retrieved_delta); + EXPECT_EQ(30, retrieved_size); +} + +// A new range is overlapped at both ends. The new range and the range +// that overlaps at the end should be shrink. The range that overlaps at the +// beginning should be left untouched. +TEST(RangeMapTruncateUpper, OverlapAtBothEnds) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateUpper); + // This should overlap object_3 at the beginning. + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE(range_map.StoreRange(0 /* base address */, 100 /* size */, + object_1)); + + // This should overlap object_3 at the end. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE(range_map.StoreRange(100 /* base address */, 100 /* size */, + object_2)); + + // This should be overlapped on both ends by object_1 and object_2. + linked_ptr object_3(new CountedObject(3)); + EXPECT_TRUE(range_map.StoreRange(50 /* base address */, 100 /* size */, + object_3)); + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The first range should be intact. + EXPECT_TRUE(range_map.RetrieveRange(0, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(0, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(100, retrieved_size); + // The second range should be shrunk down by 50. + EXPECT_TRUE(range_map.RetrieveRange(150, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(150, retrieved_base); + EXPECT_EQ(50, retrieved_delta); + EXPECT_EQ(50, retrieved_size); + // The third range (in the middle) should be shrunk down by 50. + EXPECT_TRUE(range_map.RetrieveRange(100, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(3, object->id()); + EXPECT_EQ(100, retrieved_base); + EXPECT_EQ(50, retrieved_delta); + EXPECT_EQ(50, retrieved_size); +} + +TEST(RangeMapTruncateUpper, MultipleConflicts) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateUpper); + // This should overlap with object_3. + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE(range_map.StoreRange(10 /* base address */, 90 /* size */, + object_1)); + + // This should also overlap with object_3 but after object_1. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE(range_map.StoreRange(100 /* base address */, 100 /* size */, + object_2)); + + // This should be overlapped on both object_1 and object_2. Since + // object_3 ends with the higher address it must be shrunk. + linked_ptr object_3(new CountedObject(3)); + EXPECT_TRUE(range_map.StoreRange(0 /* base address */, 300 /* size */, + object_3)); + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The first range should be intact. + EXPECT_TRUE(range_map.RetrieveRange(99, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(10, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(90, retrieved_size); + // The second range should be intact. + EXPECT_TRUE(range_map.RetrieveRange(199, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(100, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(100, retrieved_size); + // The third range should be shrunk down by 200. + EXPECT_TRUE(range_map.RetrieveRange(299, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(3, object->id()); + EXPECT_EQ(200, retrieved_base); + EXPECT_EQ(200, retrieved_delta); + EXPECT_EQ(100, retrieved_size); +} + +// Adding two ranges without overlap should succeed and the ranges should +// be left intact. +TEST(RangeMapTruncateUpper, NoConflicts) { + TestMap range_map; + range_map.SetMergeStrategy(MergeRangeStrategy::kTruncateUpper); + // Adding range 1. + linked_ptr object_1(new CountedObject(1)); + EXPECT_TRUE(range_map.StoreRange(10 /* base address */, 90 /* size */, + object_1)); + + // Adding range 2 - no overlap with range 1. + linked_ptr object_2(new CountedObject(2)); + EXPECT_TRUE(range_map.StoreRange(110 /* base address */, 90 /* size */, + object_2)); + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_delta = AddressType(); + AddressType retrieved_size = AddressType(); + // The first range should be intact. + EXPECT_TRUE(range_map.RetrieveRange(99, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(1, object->id()); + EXPECT_EQ(10, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(90, retrieved_size); + // The second range should be intact. + EXPECT_TRUE(range_map.RetrieveRange(199, &object, &retrieved_base, + &retrieved_delta, &retrieved_size)); + EXPECT_EQ(2, object->id()); + EXPECT_EQ(110, retrieved_base); + EXPECT_EQ(0, retrieved_delta); + EXPECT_EQ(90, retrieved_size); +} + +} // namespace diff --git a/src/processor/range_map_unittest.cc b/src/processor/range_map_unittest.cc new file mode 100644 index 0000000..8735bb0 --- /dev/null +++ b/src/processor/range_map_unittest.cc @@ -0,0 +1,561 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// range_map_unittest.cc: Unit tests for RangeMap +// +// Author: Mark Mentovai + + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "processor/range_map-inl.h" + +#include "common/scoped_ptr.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" + +namespace { + +using google_breakpad::AddIgnoringOverflow; +using google_breakpad::linked_ptr; +using google_breakpad::RangeMap; +using google_breakpad::scoped_ptr; + +// A CountedObject holds an int. A global (not thread safe!) count of +// allocated CountedObjects is maintained to help test memory management. +class CountedObject { + public: + explicit CountedObject(int id) : id_(id) { ++count_; } + ~CountedObject() { --count_; } + + static int count() { return count_; } + int id() const { return id_; } + + private: + static int count_; + int id_; +}; + +int CountedObject::count_; + + +typedef int AddressType; +typedef RangeMap< AddressType, linked_ptr > TestMap; + + +// RangeTest contains data to use for store and retrieve tests. See +// RunTests for descriptions of the tests. +struct RangeTest { + // Base address to use for test + AddressType address; + + // Size of range to use for test + AddressType size; + + // Unique ID of range - unstorable ranges must have unique IDs too + int id; + + // Whether this range is expected to be stored successfully or not + bool expect_storable; +}; + + +// A RangeTestSet encompasses multiple RangeTests, which are run in +// sequence on the same RangeMap. +struct RangeTestSet { + // An array of RangeTests + const RangeTest* range_tests; + + // The number of tests in the set + unsigned int range_test_count; +}; + + +// StoreTest uses the data in a RangeTest and calls StoreRange on the +// test RangeMap. It returns true if the expected result occurred, and +// false if something else happened. +static bool StoreTest(TestMap* range_map, const RangeTest* range_test) { + linked_ptr object(new CountedObject(range_test->id)); + bool stored = range_map->StoreRange(range_test->address, + range_test->size, + object); + + if (stored != range_test->expect_storable) { + fprintf(stderr, "FAILED: " + "StoreRange id %d, expected %s, observed %s\n", + range_test->id, + range_test->expect_storable ? "storable" : "not storable", + stored ? "stored" : "not stored"); + return false; + } + + return true; +} + + +// RetrieveTest uses the data in RangeTest and calls RetrieveRange on the +// test RangeMap. If it retrieves the expected value (which can be no +// map entry at the specified range,) it returns true, otherwise, it returns +// false. RetrieveTest will check the values around the base address and +// the high address of a range to guard against off-by-one errors. +static bool RetrieveTest(TestMap* range_map, const RangeTest* range_test) { + for (unsigned int side = 0; side <= 1; ++side) { + // When side == 0, check the low side (base address) of each range. + // When side == 1, check the high side (base + size) of each range. + + // Check one-less and one-greater than the target address in addition + // to the target address itself. + + // If the size of the range is only 1, don't check one greater than + // the base or one less than the high - for a successfully stored + // range, these tests would erroneously fail because the range is too + // small. + AddressType low_offset = -1; + AddressType high_offset = 1; + if (range_test->size == 1) { + if (!side) // When checking the low side, + high_offset = 0; // don't check one over the target. + else // When checking the high side, + low_offset = 0; // don't check one under the target. + } + + for (AddressType offset = low_offset; offset <= high_offset; ++offset) { + AddressType address = AddIgnoringOverflow( + offset, (!side ? range_test->address + : AddIgnoringOverflow(range_test->address, + range_test->size - 1))); + + bool expected_result = false; // This is correct for tests not stored. + if (range_test->expect_storable) { + if (offset == 0) // When checking the target address, + expected_result = true; // test should always succeed. + else if (offset == -1) // When checking one below the target, + expected_result = side; // should fail low and succeed high. + else // When checking one above the target, + expected_result = !side; // should succeed low and fail high. + } + + linked_ptr object; + AddressType retrieved_base = AddressType(); + AddressType retrieved_size = AddressType(); + AddressType retrieved_delta = AddressType(); + bool retrieved = range_map->RetrieveRange(address, &object, + &retrieved_base, + &retrieved_delta, + &retrieved_size); + + bool observed_result = retrieved && object->id() == range_test->id; + + if (observed_result != expected_result) { + fprintf(stderr, "FAILED: " + "RetrieveRange id %d, side %d, offset %d, " + "expected %s, observed %s\n", + range_test->id, + side, + offset, + expected_result ? "true" : "false", + observed_result ? "true" : "false"); + return false; + } + + // If a range was successfully retrieved, check that the returned + // bounds match the range as stored. + if (observed_result == true && + (retrieved_base != range_test->address || + retrieved_size != range_test->size)) { + fprintf(stderr, "FAILED: " + "RetrieveRange id %d, side %d, offset %d, " + "expected base/size %d/%d, observed %d/%d\n", + range_test->id, + side, + offset, + range_test->address, range_test->size, + retrieved_base, retrieved_size); + return false; + } + + // Now, check RetrieveNearestRange. The nearest range is always + // expected to be different from the test range when checking one + // less than the low side. + bool expected_nearest = range_test->expect_storable; + if (!side && offset < 0) + expected_nearest = false; + + linked_ptr nearest_object; + AddressType nearest_base = AddressType(); + AddressType nearest_delta = AddressType(); + AddressType nearest_size = AddressType(); + bool retrieved_nearest = range_map->RetrieveNearestRange(address, + &nearest_object, + &nearest_base, + &nearest_delta, + &nearest_size); + + // When checking one greater than the high side, RetrieveNearestRange + // should usually return the test range. When a different range begins + // at that address, though, then RetrieveNearestRange should return the + // range at the address instead of the test range. + if (side && offset > 0 && nearest_base == address) { + expected_nearest = false; + } + + bool observed_nearest = retrieved_nearest && + nearest_object->id() == range_test->id; + + if (observed_nearest != expected_nearest) { + fprintf(stderr, "FAILED: " + "RetrieveNearestRange id %d, side %d, offset %d, " + "expected %s, observed %s\n", + range_test->id, + side, + offset, + expected_nearest ? "true" : "false", + observed_nearest ? "true" : "false"); + return false; + } + + // If a range was successfully retrieved, check that the returned + // bounds match the range as stored. + if (expected_nearest && + (nearest_base != range_test->address || + nearest_size != range_test->size)) { + fprintf(stderr, "FAILED: " + "RetrieveNearestRange id %d, side %d, offset %d, " + "expected base/size %d/%d, observed %d/%d\n", + range_test->id, + side, + offset, + range_test->address, range_test->size, + nearest_base, nearest_size); + return false; + } + } + } + + return true; +} + + +// Test RetrieveRangeAtIndex, which is supposed to return objects in order +// according to their addresses. This test is performed by looping through +// the map, calling RetrieveRangeAtIndex for all possible indices in sequence, +// and verifying that each call returns a different object than the previous +// call, and that ranges are returned with increasing base addresses. Returns +// false if the test fails. +static bool RetrieveIndexTest(TestMap* range_map, int set) { + linked_ptr object; + CountedObject* last_object = NULL; + AddressType last_base = 0; + + int object_count = range_map->GetCount(); + for (int object_index = 0; object_index < object_count; ++object_index) { + AddressType base; + if (!range_map->RetrieveRangeAtIndex(object_index, &object, &base, + NULL /* delta */, NULL /* size */)) { + fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " + "expected success, observed failure\n", + set, object_index); + return false; + } + + if (!object.get()) { + fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " + "expected object, observed NULL\n", + set, object_index); + return false; + } + + // It's impossible to do these comparisons unless there's a previous + // object to compare against. + if (last_object) { + // The object must be different from the last one. + if (object->id() == last_object->id()) { + fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " + "expected different objects, observed same objects (%d)\n", + set, object_index, object->id()); + return false; + } + + // Each object must have a base greater than the previous object's base. + if (base <= last_base) { + fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d, " + "expected different bases, observed same bases (%d)\n", + set, object_index, base); + return false; + } + } + + last_object = object.get(); + last_base = base; + } + + // Make sure that RetrieveRangeAtIndex doesn't allow lookups at indices that + // are too high. + if (range_map->RetrieveRangeAtIndex(object_count, &object, NULL /* base */, + NULL /* delta */, NULL /* size */)) { + fprintf(stderr, "FAILED: RetrieveRangeAtIndex set %d index %d (too large), " + "expected failure, observed success\n", + set, object_count); + return false; + } + + return true; +} + +// Additional RetriveAtIndex test to expose the bug in RetrieveRangeAtIndex(). +// Bug info: RetrieveRangeAtIndex() previously retrieves the high address of +// entry, however, it is supposed to retrieve the base address of entry as +// stated in the comment in range_map.h. +static bool RetriveAtIndexTest2() { + scoped_ptr range_map(new TestMap()); + + // Store ranges with base address = 2 * object_id: + const int range_size = 2; + for (int object_id = 0; object_id < 100; ++object_id) { + linked_ptr object(new CountedObject(object_id)); + int base_address = 2 * object_id; + range_map->StoreRange(base_address, range_size, object); + } + + linked_ptr object; + int object_count = range_map->GetCount(); + for (int object_index = 0; object_index < object_count; ++object_index) { + AddressType base; + if (!range_map->RetrieveRangeAtIndex(object_index, &object, &base, + NULL /* delta */, NULL /* size */)) { + fprintf(stderr, "FAILED: RetrieveAtIndexTest2 index %d, " + "expected success, observed failure\n", object_index); + return false; + } + + int expected_base = 2 * object->id(); + if (base != expected_base) { + fprintf(stderr, "FAILED: RetriveAtIndexTest2 index %d, " + "expected base %d, observed base %d", + object_index, expected_base, base); + return false; + } + } + + return true; +} + + +// RunTests runs a series of test sets. +static bool RunTests() { + // These tests will be run sequentially. The first set of tests exercises + // most functions of RangeTest, and verifies all of the bounds-checking. + const RangeTest range_tests_0[] = { + { INT_MIN, 16, 1, true }, // lowest possible range + { -2, 5, 2, true }, // a range through zero + { INT_MAX - 9, 11, 3, false }, // tests anti-overflow + { INT_MAX - 9, 10, 4, true }, // highest possible range + { 5, 0, 5, false }, // tests anti-zero-size + { 5, 1, 6, true }, // smallest possible range + { -20, 15, 7, true }, // entirely negative + + { 10, 10, 10, true }, // causes the following tests to fail + { 9, 10, 11, false }, // one-less base, one-less high + { 9, 11, 12, false }, // one-less base, identical high + { 9, 12, 13, false }, // completely contains existing + { 10, 9, 14, false }, // identical base, one-less high + { 10, 10, 15, false }, // exactly identical to existing range + { 10, 11, 16, false }, // identical base, one-greater high + { 11, 8, 17, false }, // contained completely within + { 11, 9, 18, false }, // one-greater base, identical high + { 11, 10, 19, false }, // one-greater base, one-greater high + { 9, 2, 20, false }, // overlaps bottom by one + { 10, 1, 21, false }, // overlaps bottom by one, contained + { 19, 1, 22, false }, // overlaps top by one, contained + { 19, 2, 23, false }, // overlaps top by one + + { 9, 1, 24, true }, // directly below without overlap + { 20, 1, 25, true }, // directly above without overlap + + { 6, 3, 26, true }, // exactly between two ranges, gapless + { 7, 3, 27, false }, // tries to span two ranges + { 7, 5, 28, false }, // tries to span three ranges + { 4, 20, 29, false }, // tries to contain several ranges + + { 30, 50, 30, true }, + { 90, 25, 31, true }, + { 35, 65, 32, false }, // tries to span two noncontiguous + { 120, 10000, 33, true }, // > 8-bit + { 20000, 20000, 34, true }, // > 8-bit + { 0x10001, 0x10001, 35, true }, // > 16-bit + + { 27, -1, 36, false } // tests high < base + }; + + // Attempt to fill the entire space. The entire space must be filled with + // three stores because AddressType is signed for these tests, so RangeMap + // treats the size as signed and rejects sizes that appear to be negative. + // Even if these tests were run as unsigned, two stores would be needed + // to fill the space because the entire size of the space could only be + // described by using one more bit than would be present in AddressType. + const RangeTest range_tests_1[] = { + { INT_MIN, INT_MAX, 50, true }, // From INT_MIN to -2, inclusive + { -1, 2, 51, true }, // From -1 to 0, inclusive + { 1, INT_MAX, 52, true }, // From 1 to INT_MAX, inclusive + { INT_MIN, INT_MAX, 53, false }, // Can't fill the space twice + { -1, 2, 54, false }, + { 1, INT_MAX, 55, false }, + { -3, 6, 56, false }, // -3 to 2, inclusive - spans 3 ranges + }; + + // A light round of testing to verify that RetrieveRange does the right + // the right thing at the extremities of the range when nothing is stored + // there. Checks are forced without storing anything at the extremities + // by setting size = 0. + const RangeTest range_tests_2[] = { + { INT_MIN, 0, 100, false }, // makes RetrieveRange check low end + { -1, 3, 101, true }, + { INT_MAX, 0, 102, false }, // makes RetrieveRange check high end + }; + + // Similar to the previous test set, but with a couple of ranges closer + // to the extremities. + const RangeTest range_tests_3[] = { + { INT_MIN + 1, 1, 110, true }, + { INT_MAX - 1, 1, 111, true }, + { INT_MIN, 0, 112, false }, // makes RetrieveRange check low end + { INT_MAX, 0, 113, false } // makes RetrieveRange check high end + }; + + // The range map is cleared between sets of tests listed here. + const RangeTestSet range_test_sets[] = { + { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) }, + { range_tests_1, sizeof(range_tests_1) / sizeof(RangeTest) }, + { range_tests_2, sizeof(range_tests_2) / sizeof(RangeTest) }, + { range_tests_3, sizeof(range_tests_3) / sizeof(RangeTest) }, + { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) } // Run again + }; + + // Maintain the range map in a pointer so that deletion can be meaningfully + // tested. + scoped_ptr range_map(new TestMap()); + + // Run all of the test sets in sequence. + unsigned int range_test_set_count = sizeof(range_test_sets) / + sizeof(RangeTestSet); + for (unsigned int range_test_set_index = 0; + range_test_set_index < range_test_set_count; + ++range_test_set_index) { + const RangeTest* range_tests = + range_test_sets[range_test_set_index].range_tests; + unsigned int range_test_count = + range_test_sets[range_test_set_index].range_test_count; + + // Run the StoreRange test, which validates StoreRange and initializes + // the RangeMap with data for the RetrieveRange test. + int stored_count = 0; // The number of ranges successfully stored + for (unsigned int range_test_index = 0; + range_test_index < range_test_count; + ++range_test_index) { + const RangeTest* range_test = &range_tests[range_test_index]; + if (!StoreTest(range_map.get(), range_test)) + return false; + + if (range_test->expect_storable) + ++stored_count; + } + + // There should be exactly one CountedObject for everything successfully + // stored in the RangeMap. + if (CountedObject::count() != stored_count) { + fprintf(stderr, "FAILED: " + "stored object counts don't match, expected %d, observed %d\n", + stored_count, + CountedObject::count()); + + return false; + } + + // The RangeMap's own count of objects should also match. + if (range_map->GetCount() != stored_count) { + fprintf(stderr, "FAILED: stored object count doesn't match GetCount, " + "expected %d, observed %d\n", + stored_count, range_map->GetCount()); + + return false; + } + + // Run the RetrieveRange test + for (unsigned int range_test_index = 0; + range_test_index < range_test_count; + ++range_test_index) { + const RangeTest* range_test = &range_tests[range_test_index]; + if (!RetrieveTest(range_map.get(), range_test)) + return false; + } + + if (!RetrieveIndexTest(range_map.get(), range_test_set_index)) + return false; + + // Clear the map between test sets. If this is the final test set, + // delete the map instead to test destruction. + if (range_test_set_index < range_test_set_count - 1) + range_map->Clear(); + else + range_map.reset(); + + // Test that all stored objects are freed when the RangeMap is cleared + // or deleted. + if (CountedObject::count() != 0) { + fprintf(stderr, "FAILED: " + "did not free all objects after %s, %d still allocated\n", + range_test_set_index < range_test_set_count - 1 ? "clear" + : "delete", + CountedObject::count()); + + return false; + } + } + + if (!RetriveAtIndexTest2()) { + fprintf(stderr, "FAILED: did not pass RetrieveAtIndexTest2()\n"); + return false; + } + + return true; +} + + +} // namespace + + +int main(int argc, char** argv) { + BPLOG_INIT(&argc, &argv); + + return RunTests() ? 0 : 1; +} diff --git a/src/processor/simple_serializer-inl.h b/src/processor/simple_serializer-inl.h new file mode 100644 index 0000000..bc2c8de --- /dev/null +++ b/src/processor/simple_serializer-inl.h @@ -0,0 +1,371 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// simple_serializer-inl.h: template specializations for following types: +// bool, const char *(C-string), string, +// Line, Function, PublicSymbol, WindowsFrameInfo and their linked pointers. +// +// See simple_serializer.h for moredocumentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_SIMPLE_SERIALIZER_INL_H__ +#define PROCESSOR_SIMPLE_SERIALIZER_INL_H__ + +#include "processor/simple_serializer.h" + +#include +#include + +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "processor/basic_source_line_resolver_types.h" +#include "processor/linked_ptr.h" +#include "processor/map_serializers-inl.h" +#include "processor/windows_frame_info.h" + +namespace google_breakpad { + +// Specializations of SimpleSerializer: bool +template<> +class SimpleSerializer { + public: + static size_t SizeOf(bool boolean) { return 1; } + + static char* Write(bool boolean, char* dest) { + *dest = static_cast(boolean? 255 : 0); + return ++dest; + } + + static const char* Read(const char* source, bool* value) { + *value = ((*source) == 0 ? false : true); + return ++source; + } +}; + +// Specializations of SimpleSerializer: string +template<> +class SimpleSerializer { + public: + static size_t SizeOf(const string& str) { return str.size() + 1; } + + static char* Write(const string& str, char* dest) { + strcpy(dest, str.c_str()); + return dest + SizeOf(str); + } +}; + +// Specializations of SimpleSerializer: C-string +template<> +class SimpleSerializer { + public: + static size_t SizeOf(const char* cstring) { + return strlen(cstring) + 1; + } + + static char* Write(const char* cstring, char* dest) { + strcpy(dest, cstring); + return dest + SizeOf(cstring); + } +}; + +// Specializations of SimpleSerializer: Line +template<> +class SimpleSerializer { + typedef BasicSourceLineResolver::Line Line; + public: + static size_t SizeOf(const Line& line) { + return SimpleSerializer::SizeOf(line.address) + + SimpleSerializer::SizeOf(line.size) + + SimpleSerializer::SizeOf(line.source_file_id) + + SimpleSerializer::SizeOf(line.line); + } + static char* Write(const Line& line, char* dest) { + dest = SimpleSerializer::Write(line.address, dest); + dest = SimpleSerializer::Write(line.size, dest); + dest = SimpleSerializer::Write(line.source_file_id, dest); + dest = SimpleSerializer::Write(line.line, dest); + return dest; + } +}; + +// Specializations of SimpleSerializer: InlineOrigin +template <> +class SimpleSerializer { + typedef BasicSourceLineResolver::InlineOrigin InlineOrigin; + + public: + static size_t SizeOf(const InlineOrigin& origin) { + return SimpleSerializer::SizeOf(origin.has_file_id) + + SimpleSerializer::SizeOf(origin.source_file_id) + + SimpleSerializer::SizeOf(origin.name); + } + static char* Write(const InlineOrigin& origin, char* dest) { + dest = SimpleSerializer::Write(origin.has_file_id, dest); + dest = SimpleSerializer::Write(origin.source_file_id, dest); + dest = SimpleSerializer::Write(origin.name, dest); + return dest; + } +}; + +// Specializations of SimpleSerializer: PublicSymbol +template<> +class SimpleSerializer { + typedef BasicSourceLineResolver::PublicSymbol PublicSymbol; + public: + static size_t SizeOf(const PublicSymbol& pubsymbol) { + return SimpleSerializer::SizeOf(pubsymbol.name) + + SimpleSerializer::SizeOf(pubsymbol.address) + + SimpleSerializer::SizeOf(pubsymbol.parameter_size) + + SimpleSerializer::SizeOf(pubsymbol.is_multiple); + } + static char* Write(const PublicSymbol& pubsymbol, char* dest) { + dest = SimpleSerializer::Write(pubsymbol.name, dest); + dest = SimpleSerializer::Write(pubsymbol.address, dest); + dest = SimpleSerializer::Write(pubsymbol.parameter_size, dest); + dest = SimpleSerializer::Write(pubsymbol.is_multiple, dest); + return dest; + } +}; + +// Specializations of SimpleSerializer: WindowsFrameInfo +template<> +class SimpleSerializer { + public: + static size_t SizeOf(const WindowsFrameInfo& wfi) { + unsigned int size = 0; + size += sizeof(int32_t); // wfi.type_ + size += SimpleSerializer::SizeOf(wfi.valid); + size += SimpleSerializer::SizeOf(wfi.prolog_size); + size += SimpleSerializer::SizeOf(wfi.epilog_size); + size += SimpleSerializer::SizeOf(wfi.parameter_size); + size += SimpleSerializer::SizeOf(wfi.saved_register_size); + size += SimpleSerializer::SizeOf(wfi.local_size); + size += SimpleSerializer::SizeOf(wfi.max_stack_size); + size += SimpleSerializer::SizeOf(wfi.allocates_base_pointer); + size += SimpleSerializer::SizeOf(wfi.program_string); + return size; + } + static char* Write(const WindowsFrameInfo& wfi, char* dest) { + dest = SimpleSerializer::Write( + static_cast(wfi.type_), dest); + dest = SimpleSerializer::Write(wfi.valid, dest); + dest = SimpleSerializer::Write(wfi.prolog_size, dest); + dest = SimpleSerializer::Write(wfi.epilog_size, dest); + dest = SimpleSerializer::Write(wfi.parameter_size, dest); + dest = SimpleSerializer::Write(wfi.saved_register_size, dest); + dest = SimpleSerializer::Write(wfi.local_size, dest); + dest = SimpleSerializer::Write(wfi.max_stack_size, dest); + dest = SimpleSerializer::Write(wfi.allocates_base_pointer, dest); + return SimpleSerializer::Write(wfi.program_string, dest); + } +}; + +// Specializations of SimpleSerializer: Linked_ptr version of +// Line, InlineOrigin, Inline, Function, PublicSymbol, WindowsFrameInfo. +template<> +class SimpleSerializer< linked_ptr > { + typedef BasicSourceLineResolver::Line Line; + public: + static size_t SizeOf(const linked_ptr& lineptr) { + if (lineptr.get() == NULL) return 0; + return SimpleSerializer::SizeOf(*(lineptr.get())); + } + static char* Write(const linked_ptr& lineptr, char* dest) { + if (lineptr.get()) + dest = SimpleSerializer::Write(*(lineptr.get()), dest); + return dest; + } +}; + +template <> +class SimpleSerializer> { + typedef BasicSourceLineResolver::InlineOrigin InlineOrigin; + + public: + static size_t SizeOf(const linked_ptr& origin_ptr) { + if (origin_ptr.get() == NULL) + return 0; + return SimpleSerializer::SizeOf(*(origin_ptr.get())); + } + static char* Write(const linked_ptr& origin_ptr, char* dest) { + if (origin_ptr.get()) + dest = SimpleSerializer::Write(*(origin_ptr.get()), dest); + return dest; + } +}; + +// Specializations of SimpleSerializer: Inline +template <> +class SimpleSerializer>; +template <> +class SimpleSerializer { + typedef BasicSourceLineResolver::Inline Inline; + + public: + inline static size_t SizeOf(const Inline& in); + inline static char* Write(const Inline& in, char* dest); +}; + +template <> +class SimpleSerializer> { + typedef BasicSourceLineResolver::Inline Inline; + + public: + static size_t SizeOf(const linked_ptr& inline_ptr) { + if (inline_ptr.get() == NULL) + return 0; + return SimpleSerializer::SizeOf(*(inline_ptr.get())); + } + static char* Write(const linked_ptr& inline_ptr, char* dest) { + if (inline_ptr.get()) + dest = SimpleSerializer::Write(*(inline_ptr.get()), dest); + return dest; + } +}; + +size_t SimpleSerializer::SizeOf( + const Inline& in) { + return SimpleSerializer::SizeOf(in.has_call_site_file_id) + + SimpleSerializer::SizeOf(in.inline_nest_level) + + SimpleSerializer::SizeOf(in.call_site_line) + + SimpleSerializer::SizeOf(in.call_site_file_id) + + SimpleSerializer::SizeOf(in.origin_id) + + sizeof(uint32_t) + // This is to store the size of inline_ranges. + (in.inline_ranges.size() * sizeof(MemAddr) * 2); +} + +char* SimpleSerializer::Write(const Inline& in, + char* dest) { + dest = SimpleSerializer::Write(in.has_call_site_file_id, dest); + dest = SimpleSerializer::Write(in.inline_nest_level, dest); + dest = SimpleSerializer::Write(in.call_site_line, dest); + dest = SimpleSerializer::Write(in.call_site_file_id, dest); + dest = SimpleSerializer::Write(in.origin_id, dest); + // Write the size of inline_ranges. + dest = SimpleSerializer::Write(in.inline_ranges.size(), dest); + for (const std::pair& range : in.inline_ranges) { + dest = SimpleSerializer::Write(range.first, dest); + dest = SimpleSerializer::Write(range.second, dest); + } + return dest; +} + +template<> +class SimpleSerializer { + // Convenient type names. + typedef BasicSourceLineResolver::Function Function; + typedef BasicSourceLineResolver::Line Line; + typedef BasicSourceLineResolver::Inline Inline; + + public: + static size_t SizeOf(const Function& func) { + unsigned int size = 0; + size += SimpleSerializer::SizeOf(func.name); + size += SimpleSerializer::SizeOf(func.address); + size += SimpleSerializer::SizeOf(func.size); + size += SimpleSerializer::SizeOf(func.parameter_size); + size += SimpleSerializer::SizeOf(func.is_multiple); + // This extra size is used to store the size of serialized func.inlines, so + // we know where to start de-serialize func.lines. + size += sizeof(int32_t); + size += inline_range_map_serializer_.SizeOf(&func.inlines); + size += range_map_serializer_.SizeOf(func.lines); + return size; + } + + static char* Write(const Function& func, char* dest) { + dest = SimpleSerializer::Write(func.name, dest); + dest = SimpleSerializer::Write(func.address, dest); + dest = SimpleSerializer::Write(func.size, dest); + dest = SimpleSerializer::Write(func.parameter_size, dest); + dest = SimpleSerializer::Write(func.is_multiple, dest); + char* old_dest = dest; + dest += sizeof(int32_t); + dest = inline_range_map_serializer_.Write(&func.inlines, dest); + // Write the size of serialized func.inlines. The size doesn't include size + // field itself. + SimpleSerializer::Write(dest - old_dest - sizeof(int32_t), + old_dest); + dest = range_map_serializer_.Write(func.lines, dest); + return dest; + } + private: + // This static member is defined in module_serializer.cc. + static RangeMapSerializer> range_map_serializer_; + static ContainedRangeMapSerializer> + inline_range_map_serializer_; +}; + +template<> +class SimpleSerializer< linked_ptr > { + typedef BasicSourceLineResolver::Function Function; + public: + static size_t SizeOf(const linked_ptr& func) { + if (!func.get()) return 0; + return SimpleSerializer::SizeOf(*(func.get())); + } + + static char* Write(const linked_ptr& func, char* dest) { + if (func.get()) + dest = SimpleSerializer::Write(*(func.get()), dest); + return dest; + } +}; + +template<> +class SimpleSerializer< linked_ptr > { + typedef BasicSourceLineResolver::PublicSymbol PublicSymbol; + public: + static size_t SizeOf(const linked_ptr& pubsymbol) { + if (pubsymbol.get() == NULL) return 0; + return SimpleSerializer::SizeOf(*(pubsymbol.get())); + } + static char* Write(const linked_ptr& pubsymbol, char* dest) { + if (pubsymbol.get()) + dest = SimpleSerializer::Write(*(pubsymbol.get()), dest); + return dest; + } +}; + +template<> +class SimpleSerializer< linked_ptr > { + public: + static size_t SizeOf(const linked_ptr& wfi) { + if (wfi.get() == NULL) return 0; + return SimpleSerializer::SizeOf(*(wfi.get())); + } + static char* Write(const linked_ptr& wfi, char* dest) { + if (wfi.get()) + dest = SimpleSerializer::Write(*(wfi.get()), dest); + return dest; + } +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_SIMPLE_SERIALIZER_INL_H__ diff --git a/src/processor/simple_serializer.h b/src/processor/simple_serializer.h new file mode 100644 index 0000000..bd6cc84 --- /dev/null +++ b/src/processor/simple_serializer.h @@ -0,0 +1,64 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// simple_serializer.h: SimpleSerializer is a template for calculating size and +// writing to specific memory location for objects of primitive types, C-style +// string, string, breakpad types/structs etc. +// All specializations of SimpleSerializer template are defined in the +// "simple_serializer-inl.h" file. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_SIMPLE_SERIALIZER_H__ +#define PROCESSOR_SIMPLE_SERIALIZER_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +typedef uint64_t MemAddr; + +// Default implementation of SimpleSerializer template. +// Specializations are defined in "simple_serializer-inl.h". +template class SimpleSerializer { + public: + // Calculate and return the size of the 'item'. + static size_t SizeOf(const Type& item) { return sizeof(item); } + // Write 'item' to memory location 'dest', and return to the "end" address of + // data written, i.e., the address after the final byte written. + static char* Write(const Type& item, char* dest) { + new (dest) Type(item); + return dest + SizeOf(item); + } +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_SIMPLE_SERIALIZER_H__ diff --git a/src/processor/simple_symbol_supplier.cc b/src/processor/simple_symbol_supplier.cc new file mode 100644 index 0000000..0de34c9 --- /dev/null +++ b/src/processor/simple_symbol_supplier.cc @@ -0,0 +1,207 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// simple_symbol_supplier.cc: A simple SymbolSupplier implementation +// +// See simple_symbol_supplier.h for documentation. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/simple_symbol_supplier.h" + +#include +#include +#include +#include + +#include +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/logging.h" +#include "processor/pathname_stripper.h" + +namespace google_breakpad { + +static bool file_exists(const string& file_name) { + struct stat sb; + return stat(file_name.c_str(), &sb) == 0; +} + +SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFile( + const CodeModule* module, const SystemInfo* system_info, + string* symbol_file) { + BPLOG_IF(ERROR, !symbol_file) << "SimpleSymbolSupplier::GetSymbolFile " + "requires |symbol_file|"; + assert(symbol_file); + symbol_file->clear(); + + for (unsigned int path_index = 0; path_index < paths_.size(); ++path_index) { + SymbolResult result; + if ((result = GetSymbolFileAtPathFromRoot(module, system_info, + paths_[path_index], + symbol_file)) != NOT_FOUND) { + return result; + } + } + return NOT_FOUND; +} + +SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFile( + const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + string* symbol_data) { + assert(symbol_data); + symbol_data->clear(); + + SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info, + symbol_file); + if (s == FOUND) { + std::ifstream in(symbol_file->c_str()); + std::getline(in, *symbol_data, string::traits_type::to_char_type( + string::traits_type::eof())); + in.close(); + } + return s; +} + +SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetCStringSymbolData( + const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + char** symbol_data, + size_t* symbol_data_size) { + assert(symbol_data); + assert(symbol_data_size); + + string symbol_data_string; + SymbolSupplier::SymbolResult s = + GetSymbolFile(module, system_info, symbol_file, &symbol_data_string); + + if (s == FOUND) { + *symbol_data_size = symbol_data_string.size() + 1; + *symbol_data = new char[*symbol_data_size]; + if (*symbol_data == NULL) { + BPLOG(ERROR) << "Memory allocation for size " << *symbol_data_size + << " failed"; + return INTERRUPT; + } + memcpy(*symbol_data, symbol_data_string.c_str(), symbol_data_string.size()); + (*symbol_data)[symbol_data_string.size()] = '\0'; + memory_buffers_.insert(make_pair(module->code_file(), *symbol_data)); + } + return s; +} + +void SimpleSymbolSupplier::FreeSymbolData(const CodeModule* module) { + if (!module) { + BPLOG(INFO) << "Cannot free symbol data buffer for NULL module"; + return; + } + + map::iterator it = memory_buffers_.find(module->code_file()); + if (it == memory_buffers_.end()) { + BPLOG(INFO) << "Cannot find symbol data buffer for module " + << module->code_file(); + return; + } + delete [] it->second; + memory_buffers_.erase(it); +} + +SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFileAtPathFromRoot( + const CodeModule* module, const SystemInfo* system_info, + const string& root_path, string* symbol_file) { + BPLOG_IF(ERROR, !symbol_file) << "SimpleSymbolSupplier::GetSymbolFileAtPath " + "requires |symbol_file|"; + assert(symbol_file); + symbol_file->clear(); + + if (!module) + return NOT_FOUND; + + // Start with the base path. + string path = root_path; + + // Append the debug (pdb) file name as a directory name. + path.append("/"); + string debug_file_name = PathnameStripper::File(module->debug_file()); + if (debug_file_name.empty()) { + BPLOG(ERROR) << "Can't construct symbol file path without debug_file " + "(code_file = " << + PathnameStripper::File(module->code_file()) << ")"; + return NOT_FOUND; + } + path.append(debug_file_name); + + // Append the identifier as a directory name. + path.append("/"); + string identifier = module->debug_identifier(); + if (identifier.empty()) { + BPLOG(ERROR) << "Can't construct symbol file path without debug_identifier " + "(code_file = " << + PathnameStripper::File(module->code_file()) << + ", debug_file = " << debug_file_name << ")"; + return NOT_FOUND; + } + path.append(identifier); + + // Transform the debug file name into one ending in .sym. If the existing + // name ends in .pdb, strip the .pdb. Otherwise, add .sym to the non-.pdb + // name. + path.append("/"); + string debug_file_extension; + if (debug_file_name.size() > 4) + debug_file_extension = debug_file_name.substr(debug_file_name.size() - 4); + std::transform(debug_file_extension.begin(), debug_file_extension.end(), + debug_file_extension.begin(), tolower); + if (debug_file_extension == ".pdb") { + path.append(debug_file_name.substr(0, debug_file_name.size() - 4)); + } else { + path.append(debug_file_name); + } + path.append(".sym"); + + if (!file_exists(path)) { + BPLOG(INFO) << "No symbol file at " << path; + return NOT_FOUND; + } + + *symbol_file = path; + return FOUND; +} + +} // namespace google_breakpad diff --git a/src/processor/simple_symbol_supplier.h b/src/processor/simple_symbol_supplier.h new file mode 100644 index 0000000..3302bab --- /dev/null +++ b/src/processor/simple_symbol_supplier.h @@ -0,0 +1,139 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// simple_symbol_supplier.h: A simple SymbolSupplier implementation +// +// SimpleSymbolSupplier is a straightforward implementation of SymbolSupplier +// that stores symbol files in a filesystem tree. A SimpleSymbolSupplier is +// created with one or more base directories, which are the root paths for all +// symbol files. Each symbol file contained therein has a directory entry in +// the base directory with a name identical to the corresponding debugging +// file (pdb). Within each of these directories, there are subdirectories +// named for the debugging file's identifier. For recent pdb files, this is +// a concatenation of the pdb's uuid and age, presented in hexadecimal form, +// without any dashes or separators. The uuid is in uppercase hexadecimal +// and the age is in lowercase hexadecimal. Within that subdirectory, +// SimpleSymbolSupplier expects to find the symbol file, which is named +// identically to the debug file, but with a .sym extension. If the original +// debug file had a name ending in .pdb, the .pdb extension will be replaced +// with .sym. This sample hierarchy is rooted at the "symbols" base +// directory: +// +// symbols +// symbols/test_app.pdb +// symbols/test_app.pdb/63FE4780728D49379B9D7BB6460CB42A1 +// symbols/test_app.pdb/63FE4780728D49379B9D7BB6460CB42A1/test_app.sym +// symbols/kernel32.pdb +// symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542 +// symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym +// +// In this case, the uuid of test_app.pdb is +// 63fe4780-728d-4937-9b9d-7bb6460cb42a and its age is 1. +// +// This scheme was chosen to be roughly analogous to the way that +// symbol files may be accessed from Microsoft Symbol Server. A hierarchy +// used for Microsoft Symbol Server storage is usable as a hierarchy for +// SimpleSymbolServer, provided that the pdb files are transformed to dumped +// format using a tool such as dump_syms, and given a .sym extension. +// +// SimpleSymbolSupplier will iterate over all root paths searching for +// a symbol file existing in that path. +// +// SimpleSymbolSupplier supports any debugging file which can be identified +// by a CodeModule object's debug_file and debug_identifier accessors. The +// expected ultimate source of these CodeModule objects are MinidumpModule +// objects; it is this class that is responsible for assigning appropriate +// values for debug_file and debug_identifier. +// +// Author: Mark Mentovai + +#ifndef PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__ +#define PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__ + +#include +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/processor/symbol_supplier.h" + +namespace google_breakpad { + +using std::map; +using std::vector; + +class CodeModule; + +class SimpleSymbolSupplier : public SymbolSupplier { + public: + // Creates a new SimpleSymbolSupplier, using path as the root path where + // symbols are stored. + explicit SimpleSymbolSupplier(const string& path) : paths_(1, path) {} + + // Creates a new SimpleSymbolSupplier, using paths as a list of root + // paths where symbols may be stored. + explicit SimpleSymbolSupplier(const vector& paths) : paths_(paths) {} + + virtual ~SimpleSymbolSupplier() {} + + // Returns the path to the symbol file for the given module. See the + // description above. + virtual SymbolResult GetSymbolFile(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file); + + virtual SymbolResult GetSymbolFile(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + string* symbol_data); + + // Allocates data buffer on heap and writes symbol data into buffer. + // Symbol supplier ALWAYS takes ownership of the data buffer. + virtual SymbolResult GetCStringSymbolData(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + char** symbol_data, + size_t* symbol_data_size); + + // Free the data buffer allocated in the above GetCStringSymbolData(); + virtual void FreeSymbolData(const CodeModule* module); + + protected: + SymbolResult GetSymbolFileAtPathFromRoot(const CodeModule* module, + const SystemInfo* system_info, + const string& root_path, + string* symbol_file); + + private: + map memory_buffers_; + vector paths_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__ diff --git a/src/processor/source_line_resolver_base.cc b/src/processor/source_line_resolver_base.cc new file mode 100644 index 0000000..da9ff76 --- /dev/null +++ b/src/processor/source_line_resolver_base.cc @@ -0,0 +1,351 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// source_line_resolver_base.cc: Implementation of SourceLineResolverBase. +// +// See source_line_resolver_base.h and source_line_resolver_base_types.h for +// more documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include +#include + +#include "google_breakpad/processor/source_line_resolver_base.h" +#include "processor/logging.h" +#include "processor/module_factory.h" +#include "processor/source_line_resolver_base_types.h" + +using std::make_pair; + +namespace google_breakpad { + +SourceLineResolverBase::SourceLineResolverBase( + ModuleFactory* module_factory) + : modules_(new ModuleMap), + corrupt_modules_(new ModuleSet), + memory_buffers_(new MemoryMap), + module_factory_(module_factory) { +} + +SourceLineResolverBase::~SourceLineResolverBase() { + ModuleMap::iterator it; + // Iterate through ModuleMap and delete all loaded modules. + for (it = modules_->begin(); it != modules_->end(); ++it) { + // Delete individual module. + delete it->second; + } + // Delete the map of modules. + delete modules_; + modules_ = NULL; + + // Delete the set of corrupt modules. + delete corrupt_modules_; + corrupt_modules_ = NULL; + + MemoryMap::iterator iter = memory_buffers_->begin(); + for (; iter != memory_buffers_->end(); ++iter) { + delete [] iter->second; + } + // Delete the map of memory buffers. + delete memory_buffers_; + memory_buffers_ = NULL; + + delete module_factory_; + module_factory_ = NULL; +} + +bool SourceLineResolverBase::ReadSymbolFile(const string& map_file, + char** symbol_data, + size_t* symbol_data_size) { + if (symbol_data == NULL || symbol_data_size == NULL) { + BPLOG(ERROR) << "Could not Read file into Null memory pointer"; + return false; + } + + struct stat buf; + int error_code = stat(map_file.c_str(), &buf); + if (error_code == -1) { + string error_string; + error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "Could not open " << map_file << + ", error " << error_code << ": " << error_string; + return false; + } + + off_t file_size = buf.st_size; + + // Allocate memory for file contents, plus a null terminator + // since we may use strtok() on the contents. + *symbol_data_size = file_size + 1; + *symbol_data = new char[file_size + 1]; + + if (*symbol_data == NULL) { + BPLOG(ERROR) << "Could not allocate memory for " << map_file; + return false; + } + + BPLOG(INFO) << "Opening " << map_file; + + FILE* f = fopen(map_file.c_str(), "rt"); + if (!f) { + string error_string; + error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "Could not open " << map_file << + ", error " << error_code << ": " << error_string; + delete [] (*symbol_data); + *symbol_data = NULL; + return false; + } + + AutoFileCloser closer(f); + + int items_read = 0; + + items_read = fread(*symbol_data, 1, file_size, f); + + if (items_read != file_size) { + string error_string; + error_code = ErrnoString(&error_string); + BPLOG(ERROR) << "Could not slurp " << map_file << + ", error " << error_code << ": " << error_string; + delete [] (*symbol_data); + *symbol_data = NULL; + return false; + } + + (*symbol_data)[file_size] = '\0'; + return true; +} + +bool SourceLineResolverBase::LoadModule(const CodeModule* module, + const string& map_file) { + if (module == NULL) + return false; + + // Make sure we don't already have a module with the given name. + if (modules_->find(module->code_file()) != modules_->end()) { + BPLOG(INFO) << "Symbols for module " << module->code_file() + << " already loaded"; + return false; + } + + BPLOG(INFO) << "Loading symbols for module " << module->code_file() + << " from " << map_file; + + char* memory_buffer; + size_t memory_buffer_size; + if (!ReadSymbolFile(map_file, &memory_buffer, &memory_buffer_size)) + return false; + + BPLOG(INFO) << "Read symbol file " << map_file << " succeeded. " + << "module = " << module->code_file() + << ", memory_buffer_size = " << memory_buffer_size; + + bool load_result = LoadModuleUsingMemoryBuffer(module, memory_buffer, + memory_buffer_size); + + if (load_result && !ShouldDeleteMemoryBufferAfterLoadModule()) { + // memory_buffer has to stay alive as long as the module. + memory_buffers_->insert(make_pair(module->code_file(), memory_buffer)); + } else { + delete [] memory_buffer; + } + + return load_result; +} + +bool SourceLineResolverBase::LoadModuleUsingMapBuffer( + const CodeModule* module, const string& map_buffer) { + BPLOG(INFO) << "SourceLineResolverBase::LoadModuleUsingMapBuffer(module = " + << module->code_file() + << ", map_buffer.size() = " << map_buffer.size() << ")"; + if (module == NULL) + return false; + + // Make sure we don't already have a module with the given name. + if (modules_->find(module->code_file()) != modules_->end()) { + BPLOG(INFO) << "Symbols for module " << module->code_file() + << " already loaded"; + return false; + } + + size_t memory_buffer_size = map_buffer.size() + 1; + char* memory_buffer = new char[memory_buffer_size]; + if (memory_buffer == NULL) { + BPLOG(ERROR) << "Could not allocate memory for " << module->code_file(); + return false; + } + + // Can't use strcpy, as the data may contain '\0's before the end. + memcpy(memory_buffer, map_buffer.c_str(), map_buffer.size()); + memory_buffer[map_buffer.size()] = '\0'; + + bool load_result = LoadModuleUsingMemoryBuffer(module, memory_buffer, + memory_buffer_size); + + if (load_result && !ShouldDeleteMemoryBufferAfterLoadModule()) { + // memory_buffer has to stay alive as long as the module. + memory_buffers_->insert(make_pair(module->code_file(), memory_buffer)); + } else { + delete [] memory_buffer; + } + + return load_result; +} + +bool SourceLineResolverBase::LoadModuleUsingMemoryBuffer( + const CodeModule* module, + char* memory_buffer, + size_t memory_buffer_size) { + if (!module) + return false; + + // Make sure we don't already have a module with the given name. + if (modules_->find(module->code_file()) != modules_->end()) { + BPLOG(INFO) << "Symbols for module " << module->code_file() + << " already loaded"; + return false; + } + + BPLOG(INFO) << "Loading symbols for module " << module->code_file() + << " from memory buffer, size: " << memory_buffer_size; + + Module* basic_module = module_factory_->CreateModule(module->code_file()); + + // Ownership of memory is NOT transfered to Module::LoadMapFromMemory(). + if (!basic_module->LoadMapFromMemory(memory_buffer, memory_buffer_size)) { + BPLOG(ERROR) << "Too many error while parsing symbol data for module " + << module->code_file(); + // Returning false from here would be an indication that the symbols for + // this module are missing which would be wrong. Intentionally fall through + // and add the module to both the modules_ and the corrupt_modules_ lists. + assert(basic_module->IsCorrupt()); + } + + modules_->insert(make_pair(module->code_file(), basic_module)); + if (basic_module->IsCorrupt()) { + corrupt_modules_->insert(module->code_file()); + } + return true; +} + +bool SourceLineResolverBase::ShouldDeleteMemoryBufferAfterLoadModule() { + return true; +} + +void SourceLineResolverBase::UnloadModule(const CodeModule* code_module) { + if (!code_module) + return; + + ModuleMap::iterator mod_iter = modules_->find(code_module->code_file()); + if (mod_iter != modules_->end()) { + Module* symbol_module = mod_iter->second; + delete symbol_module; + corrupt_modules_->erase(mod_iter->first); + modules_->erase(mod_iter); + } + + if (ShouldDeleteMemoryBufferAfterLoadModule()) { + // No-op. Because we never store any memory buffers. + } else { + // There may be a buffer stored locally, we need to find and delete it. + MemoryMap::iterator iter = memory_buffers_->find(code_module->code_file()); + if (iter != memory_buffers_->end()) { + delete [] iter->second; + memory_buffers_->erase(iter); + } + } +} + +bool SourceLineResolverBase::HasModule(const CodeModule* module) { + if (!module) + return false; + return modules_->find(module->code_file()) != modules_->end(); +} + +bool SourceLineResolverBase::IsModuleCorrupt(const CodeModule* module) { + if (!module) + return false; + return corrupt_modules_->find(module->code_file()) != corrupt_modules_->end(); +} + +void SourceLineResolverBase::FillSourceLineInfo( + StackFrame* frame, + std::deque>* inlined_frames) { + if (frame->module) { + ModuleMap::const_iterator it = modules_->find(frame->module->code_file()); + if (it != modules_->end()) { + it->second->LookupAddress(frame, inlined_frames); + } + } +} + +WindowsFrameInfo* SourceLineResolverBase::FindWindowsFrameInfo( + const StackFrame* frame) { + if (frame->module) { + ModuleMap::const_iterator it = modules_->find(frame->module->code_file()); + if (it != modules_->end()) { + return it->second->FindWindowsFrameInfo(frame); + } + } + return NULL; +} + +CFIFrameInfo* SourceLineResolverBase::FindCFIFrameInfo( + const StackFrame* frame) { + if (frame->module) { + ModuleMap::const_iterator it = modules_->find(frame->module->code_file()); + if (it != modules_->end()) { + return it->second->FindCFIFrameInfo(frame); + } + } + return NULL; +} + +bool SourceLineResolverBase::CompareString::operator()( + const string& s1, const string& s2) const { + return strcmp(s1.c_str(), s2.c_str()) < 0; +} + +bool SourceLineResolverBase::Module::ParseCFIRuleSet( + const string& rule_set, CFIFrameInfo* frame_info) const { + CFIFrameInfoParseHandler handler(frame_info); + CFIRuleParser parser(&handler); + return parser.Parse(rule_set); +} + +} // namespace google_breakpad diff --git a/src/processor/source_line_resolver_base_types.h b/src/processor/source_line_resolver_base_types.h new file mode 100644 index 0000000..4b3b366 --- /dev/null +++ b/src/processor/source_line_resolver_base_types.h @@ -0,0 +1,209 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// source_line_resolver_base_types.h: definition of nested classes/structs in +// SourceLineResolverBase. It moves the definitions out of +// source_line_resolver_base.cc, so that other classes may have access +// to these private nested types without including source_line_resolver_base.cc +// In addition, Module is defined as a pure abstract class to be implemented by +// each concrete source line resolver class. +// +// See source_line_resolver_base.h for more documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#include + +#include +#include +#include +#include + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/source_line_resolver_base.h" +#include "google_breakpad/processor/stack_frame.h" +#include "processor/cfi_frame_info.h" +#include "processor/linked_ptr.h" +#include "processor/range_map.h" +#include "processor/windows_frame_info.h" + +#ifndef PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__ +#define PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__ + +namespace google_breakpad { + +class SourceLineResolverBase::AutoFileCloser { + public: + explicit AutoFileCloser(FILE* file) : file_(file) {} + ~AutoFileCloser() { + if (file_) + fclose(file_); + } + + private: + FILE* file_; +}; + +struct SourceLineResolverBase::InlineOrigin { + InlineOrigin() {} + InlineOrigin(bool has_file_id, int32_t source_file_id, const string& name) + : has_file_id(has_file_id), + source_file_id(source_file_id), + name(name) {} + // If it's old format, source file id is set, otherwise not useful. + bool has_file_id; + int32_t source_file_id; + string name; +}; + +struct SourceLineResolverBase::Inline { + // A vector of (address, size) pair for a INLINE record. + using InlineRanges = std::vector>; + Inline() {} + Inline(bool has_call_site_file_id, + int32_t inline_nest_level, + int32_t call_site_line, + int32_t call_site_file_id, + int32_t origin_id, + InlineRanges inline_ranges) + : has_call_site_file_id(has_call_site_file_id), + inline_nest_level(inline_nest_level), + call_site_line(call_site_line), + call_site_file_id(call_site_file_id), + origin_id(origin_id), + inline_ranges(inline_ranges) {} + // If it's new format, call site file id is set, otherwise not useful. + bool has_call_site_file_id; + int32_t inline_nest_level; + int32_t call_site_line; + int32_t call_site_file_id; + int32_t origin_id; + InlineRanges inline_ranges; +}; + +struct SourceLineResolverBase::Line { + Line() { } + Line(MemAddr addr, MemAddr code_size, int file_id, int source_line) + : address(addr) + , size(code_size) + , source_file_id(file_id) + , line(source_line) { } + + MemAddr address; + MemAddr size; + int32_t source_file_id; + int32_t line; +}; + +struct SourceLineResolverBase::Function { + Function() { } + Function(const string& function_name, + MemAddr function_address, + MemAddr code_size, + int set_parameter_size, + bool is_multiple) + : name(function_name), address(function_address), size(code_size), + parameter_size(set_parameter_size), is_multiple(is_multiple) { } + + string name; + MemAddr address; + MemAddr size; + + // The size of parameters passed to this function on the stack. + int32_t parameter_size; + + // If the function's instructions correspond to multiple symbols. + bool is_multiple; +}; + +struct SourceLineResolverBase::PublicSymbol { + PublicSymbol() { } + PublicSymbol(const string& set_name, + MemAddr set_address, + int set_parameter_size, + bool is_multiple) + : name(set_name), + address(set_address), + parameter_size(set_parameter_size), + is_multiple(is_multiple) {} + + string name; + MemAddr address; + + // If the public symbol is used as a function entry point, parameter_size + // is set to the size of the parameters passed to the funciton on the + // stack, if known. + int32_t parameter_size; + + // If the function's instructions correspond to multiple symbols. + bool is_multiple; +}; + +class SourceLineResolverBase::Module { + public: + virtual ~Module() { }; + // Loads a map from the given buffer in char* type. + // Does NOT take ownership of memory_buffer (the caller, source line resolver, + // is the owner of memory_buffer). + // The passed in |memory buffer| is of size |memory_buffer_size|. If it is + // not null terminated, LoadMapFromMemory will null terminate it by modifying + // the passed in buffer. + virtual bool LoadMapFromMemory(char* memory_buffer, + size_t memory_buffer_size) = 0; + + // Tells whether the loaded symbol data is corrupt. Return value is + // undefined, if the symbol data hasn't been loaded yet. + virtual bool IsCorrupt() const = 0; + + // Looks up the given relative address, and fills the StackFrame struct + // with the result. + virtual void LookupAddress( + StackFrame* frame, + std::deque>* inlined_frames) const = 0; + + // If Windows stack walking information is available covering ADDRESS, + // return a WindowsFrameInfo structure describing it. If the information + // is not available, returns NULL. A NULL return value does not indicate + // an error. The caller takes ownership of any returned WindowsFrameInfo + // object. + virtual WindowsFrameInfo* + FindWindowsFrameInfo(const StackFrame* frame) const = 0; + + // If CFI stack walking information is available covering ADDRESS, + // return a CFIFrameInfo structure describing it. If the information + // is not available, return NULL. The caller takes ownership of any + // returned CFIFrameInfo object. + virtual CFIFrameInfo* FindCFIFrameInfo(const StackFrame* frame) const = 0; + protected: + virtual bool ParseCFIRuleSet(const string& rule_set, + CFIFrameInfo* frame_info) const; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__ diff --git a/src/processor/stack_frame_cpu.cc b/src/processor/stack_frame_cpu.cc new file mode 100644 index 0000000..4a4a052 --- /dev/null +++ b/src/processor/stack_frame_cpu.cc @@ -0,0 +1,82 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stack_frame_cpu.h: CPU-specific StackFrame extensions. +// +// See google_breakpad/processor/stack_frame_cpu.h for documentation. +// +// Author: Colin Blundell + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/stack_frame_cpu.h" + +namespace google_breakpad { + +const uint64_t StackFrameARM64::CONTEXT_VALID_X0; +const uint64_t StackFrameARM64::CONTEXT_VALID_X1; +const uint64_t StackFrameARM64::CONTEXT_VALID_X2; +const uint64_t StackFrameARM64::CONTEXT_VALID_X3; +const uint64_t StackFrameARM64::CONTEXT_VALID_X4; +const uint64_t StackFrameARM64::CONTEXT_VALID_X5; +const uint64_t StackFrameARM64::CONTEXT_VALID_X6; +const uint64_t StackFrameARM64::CONTEXT_VALID_X7; +const uint64_t StackFrameARM64::CONTEXT_VALID_X8; +const uint64_t StackFrameARM64::CONTEXT_VALID_X9; +const uint64_t StackFrameARM64::CONTEXT_VALID_X10; +const uint64_t StackFrameARM64::CONTEXT_VALID_X11; +const uint64_t StackFrameARM64::CONTEXT_VALID_X12; +const uint64_t StackFrameARM64::CONTEXT_VALID_X13; +const uint64_t StackFrameARM64::CONTEXT_VALID_X14; +const uint64_t StackFrameARM64::CONTEXT_VALID_X15; +const uint64_t StackFrameARM64::CONTEXT_VALID_X16; +const uint64_t StackFrameARM64::CONTEXT_VALID_X17; +const uint64_t StackFrameARM64::CONTEXT_VALID_X18; +const uint64_t StackFrameARM64::CONTEXT_VALID_X19; +const uint64_t StackFrameARM64::CONTEXT_VALID_X20; +const uint64_t StackFrameARM64::CONTEXT_VALID_X21; +const uint64_t StackFrameARM64::CONTEXT_VALID_X22; +const uint64_t StackFrameARM64::CONTEXT_VALID_X23; +const uint64_t StackFrameARM64::CONTEXT_VALID_X24; +const uint64_t StackFrameARM64::CONTEXT_VALID_X25; +const uint64_t StackFrameARM64::CONTEXT_VALID_X26; +const uint64_t StackFrameARM64::CONTEXT_VALID_X27; +const uint64_t StackFrameARM64::CONTEXT_VALID_X28; +const uint64_t StackFrameARM64::CONTEXT_VALID_X29; +const uint64_t StackFrameARM64::CONTEXT_VALID_X30; +const uint64_t StackFrameARM64::CONTEXT_VALID_X31; +const uint64_t StackFrameARM64::CONTEXT_VALID_X32; +const uint64_t StackFrameARM64::CONTEXT_VALID_FP; +const uint64_t StackFrameARM64::CONTEXT_VALID_LR; +const uint64_t StackFrameARM64::CONTEXT_VALID_SP; +const uint64_t StackFrameARM64::CONTEXT_VALID_PC; +const uint64_t StackFrameARM64::CONTEXT_VALID_ALL; + +} // namespace google_breakpad diff --git a/src/processor/stack_frame_symbolizer.cc b/src/processor/stack_frame_symbolizer.cc new file mode 100644 index 0000000..3afd471 --- /dev/null +++ b/src/processor/stack_frame_symbolizer.cc @@ -0,0 +1,149 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Implementation of StackFrameSymbolizer, which encapsulates the logic of how +// SourceLineResolverInterface interacts with SymbolSupplier to fill source +// line information in a stack frame, and also looks up WindowsFrameInfo or +// CFIFrameInfo for a stack frame. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/stack_frame_symbolizer.h" + +#include + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame.h" +#include "google_breakpad/processor/symbol_supplier.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" + +namespace google_breakpad { + +StackFrameSymbolizer::StackFrameSymbolizer( + SymbolSupplier* supplier, + SourceLineResolverInterface* resolver) : supplier_(supplier), + resolver_(resolver) { } + +StackFrameSymbolizer::SymbolizerResult StackFrameSymbolizer::FillSourceLineInfo( + const CodeModules* modules, + const CodeModules* unloaded_modules, + const SystemInfo* system_info, + StackFrame* frame, + std::deque>* inlined_frames) { + assert(frame); + + const CodeModule* module = NULL; + if (modules) { + module = modules->GetModuleForAddress(frame->instruction); + } + if (!module && unloaded_modules) { + module = unloaded_modules->GetModuleForAddress(frame->instruction); + } + + if (!module) return kError; + frame->module = module; + + if (!resolver_) return kError; // no resolver. + // If module is known to have missing symbol file, return. + if (no_symbol_modules_.find(module->code_file()) != + no_symbol_modules_.end()) { + return kError; + } + + // If module is already loaded, go ahead to fill source line info and return. + if (resolver_->HasModule(frame->module)) { + resolver_->FillSourceLineInfo(frame, inlined_frames); + return resolver_->IsModuleCorrupt(frame->module) ? + kWarningCorruptSymbols : kNoError; + } + + // Module needs to fetch symbol file. First check to see if supplier exists. + if (!supplier_) { + return kError; + } + + // Start fetching symbol from supplier. + string symbol_file; + char* symbol_data = NULL; + size_t symbol_data_size; + SymbolSupplier::SymbolResult symbol_result = supplier_->GetCStringSymbolData( + module, system_info, &symbol_file, &symbol_data, &symbol_data_size); + + switch (symbol_result) { + case SymbolSupplier::FOUND: { + bool load_success = resolver_->LoadModuleUsingMemoryBuffer( + frame->module, + symbol_data, + symbol_data_size); + if (resolver_->ShouldDeleteMemoryBufferAfterLoadModule()) { + supplier_->FreeSymbolData(module); + } + + if (load_success) { + resolver_->FillSourceLineInfo(frame, inlined_frames); + return resolver_->IsModuleCorrupt(frame->module) ? + kWarningCorruptSymbols : kNoError; + } else { + BPLOG(ERROR) << "Failed to load symbol file in resolver."; + no_symbol_modules_.insert(module->code_file()); + return kError; + } + } + + case SymbolSupplier::NOT_FOUND: + no_symbol_modules_.insert(module->code_file()); + return kError; + + case SymbolSupplier::INTERRUPT: + return kInterrupt; + + default: + BPLOG(ERROR) << "Unknown SymbolResult enum: " << symbol_result; + return kError; + } + return kError; +} + +WindowsFrameInfo* StackFrameSymbolizer::FindWindowsFrameInfo( + const StackFrame* frame) { + return resolver_ ? resolver_->FindWindowsFrameInfo(frame) : NULL; +} + +CFIFrameInfo* StackFrameSymbolizer::FindCFIFrameInfo( + const StackFrame* frame) { + return resolver_ ? resolver_->FindCFIFrameInfo(frame) : NULL; +} + +} // namespace google_breakpad diff --git a/src/processor/stackwalk_common.cc b/src/processor/stackwalk_common.cc new file mode 100644 index 0000000..688b278 --- /dev/null +++ b/src/processor/stackwalk_common.cc @@ -0,0 +1,1304 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalk_common.cc: Module shared by the {micro,mini}dump_stackwalck +// executables to print the content of dumps (w/ stack traces) on the console. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/stackwalk_common.h" + +#include +#include +#include + +#include +#include + +#include "common/stdio_wrapper.h" +#include "common/using_std_string.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/process_state.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/logging.h" +#include "processor/pathname_stripper.h" + +namespace google_breakpad { + +namespace { + +using std::vector; +using std::unique_ptr; + +// Separator character for machine readable output. +static const char kOutputSeparator = '|'; + +// PrintRegister prints a register's name and value to stdout. It will +// print four registers on a line. For the first register in a set, +// pass 0 for |start_col|. For registers in a set, pass the most recent +// return value of PrintRegister. +// The caller is responsible for printing the final newline after a set +// of registers is completely printed, regardless of the number of calls +// to PrintRegister. +static const int kMaxWidth = 80; // optimize for an 80-column terminal +static int PrintRegister(const char* name, uint32_t value, int start_col) { + char buffer[64]; + snprintf(buffer, sizeof(buffer), " %5s = 0x%08x", name, value); + + if (start_col + static_cast(strlen(buffer)) > kMaxWidth) { + start_col = 0; + printf("\n "); + } + fputs(buffer, stdout); + + return start_col + strlen(buffer); +} + +// PrintRegister64 does the same thing, but for 64-bit registers. +static int PrintRegister64(const char* name, uint64_t value, int start_col) { + char buffer[64]; + snprintf(buffer, sizeof(buffer), " %5s = 0x%016" PRIx64 , name, value); + + if (start_col + static_cast(strlen(buffer)) > kMaxWidth) { + start_col = 0; + printf("\n "); + } + fputs(buffer, stdout); + + return start_col + strlen(buffer); +} + +// StripSeparator takes a string |original| and returns a copy +// of the string with all occurences of |kOutputSeparator| removed. +static string StripSeparator(const string& original) { + string result = original; + string::size_type position = 0; + while ((position = result.find(kOutputSeparator, position)) != string::npos) { + result.erase(position, 1); + } + position = 0; + while ((position = result.find('\n', position)) != string::npos) { + result.erase(position, 1); + } + return result; +} + +// PrintStackContents prints the stack contents of the current frame to stdout. +static void PrintStackContents(const string& indent, + const StackFrame* frame, + const StackFrame* prev_frame, + const string& cpu, + const MemoryRegion* memory, + const CodeModules* modules, + SourceLineResolverInterface* resolver) { + // Find stack range. + int word_length = 0; + uint64_t stack_begin = 0, stack_end = 0; + if (cpu == "x86") { + word_length = 4; + const StackFrameX86* frame_x86 = static_cast(frame); + const StackFrameX86* prev_frame_x86 = + static_cast(prev_frame); + if ((frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_ESP) && + (prev_frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_ESP)) { + stack_begin = frame_x86->context.esp; + stack_end = prev_frame_x86->context.esp; + } + } else if (cpu == "amd64") { + word_length = 8; + const StackFrameAMD64* frame_amd64 = + static_cast(frame); + const StackFrameAMD64* prev_frame_amd64 = + static_cast(prev_frame); + if ((frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RSP) && + (prev_frame_amd64->context_validity & + StackFrameAMD64::CONTEXT_VALID_RSP)) { + stack_begin = frame_amd64->context.rsp; + stack_end = prev_frame_amd64->context.rsp; + } + } else if (cpu == "arm") { + word_length = 4; + const StackFrameARM* frame_arm = static_cast(frame); + const StackFrameARM* prev_frame_arm = + static_cast(prev_frame); + if ((frame_arm->context_validity & + StackFrameARM::CONTEXT_VALID_SP) && + (prev_frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_SP)) { + stack_begin = frame_arm->context.iregs[13]; + stack_end = prev_frame_arm->context.iregs[13]; + } + } else if (cpu == "arm64") { + word_length = 8; + const StackFrameARM64* frame_arm64 = + static_cast(frame); + const StackFrameARM64* prev_frame_arm64 = + static_cast(prev_frame); + if ((frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_SP) && + (prev_frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_SP)) { + stack_begin = frame_arm64->context.iregs[31]; + stack_end = prev_frame_arm64->context.iregs[31]; + } + } else if (cpu == "riscv") { + word_length = 4; + const StackFrameRISCV* frame_riscv = + static_cast(frame); + const StackFrameRISCV* prev_frame_riscv = + static_cast(prev_frame); + if ((frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_SP) && + (prev_frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_SP)) { + stack_begin = frame_riscv->context.sp; + stack_end = prev_frame_riscv->context.sp; + } + } else if (cpu == "riscv64") { + word_length = 8; + const StackFrameRISCV64* frame_riscv64 = + static_cast(frame); + const StackFrameRISCV64* prev_frame_riscv64 = + static_cast(prev_frame); + if ((frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_SP) && + (prev_frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_SP)) { + stack_begin = frame_riscv64->context.sp; + stack_end = prev_frame_riscv64->context.sp; + } + } + if (!word_length || !stack_begin || !stack_end) + return; + + // Print stack contents. + printf("\n%sStack contents:", indent.c_str()); + for(uint64_t address = stack_begin; address < stack_end; ) { + // Print the start address of this row. + if (word_length == 4) + printf("\n%s %08x", indent.c_str(), static_cast(address)); + else + printf("\n%s %016" PRIx64, indent.c_str(), address); + + // Print data in hex. + const int kBytesPerRow = 16; + string data_as_string; + for (int i = 0; i < kBytesPerRow; ++i, ++address) { + uint8_t value = 0; + if (address < stack_end && + memory->GetMemoryAtAddress(address, &value)) { + printf(" %02x", value); + data_as_string.push_back(isprint(value) ? value : '.'); + } else { + printf(" "); + data_as_string.push_back(' '); + } + } + // Print data as string. + printf(" %s", data_as_string.c_str()); + } + + // Try to find instruction pointers from stack. + printf("\n%sPossible instruction pointers:\n", indent.c_str()); + for (uint64_t address = stack_begin; address < stack_end; + address += word_length) { + StackFrame pointee_frame; + + // Read a word (possible instruction pointer) from stack. + if (word_length == 4) { + uint32_t data32 = 0; + memory->GetMemoryAtAddress(address, &data32); + pointee_frame.instruction = data32; + } else { + uint64_t data64 = 0; + memory->GetMemoryAtAddress(address, &data64); + pointee_frame.instruction = data64; + } + pointee_frame.module = + modules->GetModuleForAddress(pointee_frame.instruction); + + // Try to look up the function name. + std::deque> inlined_frames; + if (pointee_frame.module) + resolver->FillSourceLineInfo(&pointee_frame, &inlined_frames); + + // Print function name. + auto print_function_name = [&](StackFrame* frame) { + if (!frame->function_name.empty()) { + if (word_length == 4) { + printf("%s *(0x%08x) = 0x%08x", indent.c_str(), + static_cast(address), + static_cast(frame->instruction)); + } else { + printf("%s *(0x%016" PRIx64 ") = 0x%016" PRIx64, indent.c_str(), + address, frame->instruction); + } + printf( + " <%s> [%s : %d + 0x%" PRIx64 "]\n", frame->function_name.c_str(), + PathnameStripper::File(frame->source_file_name).c_str(), + frame->source_line, frame->instruction - frame->source_line_base); + } + }; + print_function_name(&pointee_frame); + for (unique_ptr &frame : inlined_frames) + print_function_name(frame.get()); + } + printf("\n"); +} + +static void PrintFrameHeader(const StackFrame* frame, int frame_index) { + printf("%2d ", frame_index); + + uint64_t instruction_address = frame->ReturnAddress(); + + if (frame->module) { + printf("%s", PathnameStripper::File(frame->module->code_file()).c_str()); + if (!frame->function_name.empty()) { + printf("!%s", frame->function_name.c_str()); + if (!frame->source_file_name.empty()) { + string source_file = PathnameStripper::File(frame->source_file_name); + printf(" [%s : %d + 0x%" PRIx64 "]", source_file.c_str(), + frame->source_line, + instruction_address - frame->source_line_base); + } else { + printf(" + 0x%" PRIx64, instruction_address - frame->function_base); + } + } else { + printf(" + 0x%" PRIx64, + instruction_address - frame->module->base_address()); + } + } else { + printf("0x%" PRIx64, instruction_address); + } +} + +// PrintStack prints the call stack in |stack| to stdout, in a reasonably +// useful form. Module, function, and source file names are displayed if +// they are available. The code offset to the base code address of the +// source line, function, or module is printed, preferring them in that +// order. If no source line, function, or module information is available, +// an absolute code offset is printed. +// +// If |cpu| is a recognized CPU name, relevant register state for each stack +// frame printed is also output, if available. +static void PrintStack(const CallStack* stack, + const string& cpu, + bool output_stack_contents, + const MemoryRegion* memory, + const CodeModules* modules, + SourceLineResolverInterface* resolver) { + int frame_count = stack->frames()->size(); + if (frame_count == 0) { + printf(" \n"); + } + for (int frame_index = 0; frame_index < frame_count; ++frame_index) { + const StackFrame* frame = stack->frames()->at(frame_index); + PrintFrameHeader(frame, frame_index); + printf("\n "); + + // Inlined frames don't have registers info. + if (frame->trust != StackFrameAMD64::FRAME_TRUST_INLINE) { + int sequence = 0; + if (cpu == "x86") { + const StackFrameX86* frame_x86 = + reinterpret_cast(frame); + + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EIP) + sequence = PrintRegister("eip", frame_x86->context.eip, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_ESP) + sequence = PrintRegister("esp", frame_x86->context.esp, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EBP) + sequence = PrintRegister("ebp", frame_x86->context.ebp, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EBX) + sequence = PrintRegister("ebx", frame_x86->context.ebx, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_ESI) + sequence = PrintRegister("esi", frame_x86->context.esi, sequence); + if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EDI) + sequence = PrintRegister("edi", frame_x86->context.edi, sequence); + if (frame_x86->context_validity == StackFrameX86::CONTEXT_VALID_ALL) { + sequence = PrintRegister("eax", frame_x86->context.eax, sequence); + sequence = PrintRegister("ecx", frame_x86->context.ecx, sequence); + sequence = PrintRegister("edx", frame_x86->context.edx, sequence); + sequence = PrintRegister("efl", frame_x86->context.eflags, sequence); + } + } else if (cpu == "ppc") { + const StackFramePPC* frame_ppc = + reinterpret_cast(frame); + + if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_SRR0) + sequence = PrintRegister("srr0", frame_ppc->context.srr0, sequence); + if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_GPR1) + sequence = PrintRegister("r1", frame_ppc->context.gpr[1], sequence); + } else if (cpu == "amd64") { + const StackFrameAMD64* frame_amd64 = + reinterpret_cast(frame); + + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RAX) + sequence = PrintRegister64("rax", frame_amd64->context.rax, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RDX) + sequence = PrintRegister64("rdx", frame_amd64->context.rdx, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RCX) + sequence = PrintRegister64("rcx", frame_amd64->context.rcx, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBX) + sequence = PrintRegister64("rbx", frame_amd64->context.rbx, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RSI) + sequence = PrintRegister64("rsi", frame_amd64->context.rsi, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RDI) + sequence = PrintRegister64("rdi", frame_amd64->context.rdi, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBP) + sequence = PrintRegister64("rbp", frame_amd64->context.rbp, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RSP) + sequence = PrintRegister64("rsp", frame_amd64->context.rsp, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R8) + sequence = PrintRegister64("r8", frame_amd64->context.r8, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R9) + sequence = PrintRegister64("r9", frame_amd64->context.r9, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R10) + sequence = PrintRegister64("r10", frame_amd64->context.r10, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R11) + sequence = PrintRegister64("r11", frame_amd64->context.r11, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R12) + sequence = PrintRegister64("r12", frame_amd64->context.r12, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R13) + sequence = PrintRegister64("r13", frame_amd64->context.r13, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R14) + sequence = PrintRegister64("r14", frame_amd64->context.r14, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R15) + sequence = PrintRegister64("r15", frame_amd64->context.r15, sequence); + if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RIP) + sequence = PrintRegister64("rip", frame_amd64->context.rip, sequence); + } else if (cpu == "sparc") { + const StackFrameSPARC* frame_sparc = + reinterpret_cast(frame); + + if (frame_sparc->context_validity & StackFrameSPARC::CONTEXT_VALID_SP) + sequence = + PrintRegister("sp", frame_sparc->context.g_r[14], sequence); + if (frame_sparc->context_validity & StackFrameSPARC::CONTEXT_VALID_FP) + sequence = + PrintRegister("fp", frame_sparc->context.g_r[30], sequence); + if (frame_sparc->context_validity & StackFrameSPARC::CONTEXT_VALID_PC) + sequence = PrintRegister("pc", frame_sparc->context.pc, sequence); + } else if (cpu == "arm") { + const StackFrameARM* frame_arm = + reinterpret_cast(frame); + + // Argument registers (caller-saves), which will likely only be valid + // for the youngest frame. + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R0) + sequence = PrintRegister("r0", frame_arm->context.iregs[0], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R1) + sequence = PrintRegister("r1", frame_arm->context.iregs[1], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R2) + sequence = PrintRegister("r2", frame_arm->context.iregs[2], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R3) + sequence = PrintRegister("r3", frame_arm->context.iregs[3], sequence); + + // General-purpose callee-saves registers. + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R4) + sequence = PrintRegister("r4", frame_arm->context.iregs[4], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R5) + sequence = PrintRegister("r5", frame_arm->context.iregs[5], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R6) + sequence = PrintRegister("r6", frame_arm->context.iregs[6], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R7) + sequence = PrintRegister("r7", frame_arm->context.iregs[7], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R8) + sequence = PrintRegister("r8", frame_arm->context.iregs[8], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R9) + sequence = PrintRegister("r9", frame_arm->context.iregs[9], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R10) + sequence = + PrintRegister("r10", frame_arm->context.iregs[10], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R12) + sequence = + PrintRegister("r12", frame_arm->context.iregs[12], sequence); + + // Registers with a dedicated or conventional purpose. + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_FP) + sequence = + PrintRegister("fp", frame_arm->context.iregs[11], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_SP) + sequence = + PrintRegister("sp", frame_arm->context.iregs[13], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_LR) + sequence = + PrintRegister("lr", frame_arm->context.iregs[14], sequence); + if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_PC) + sequence = + PrintRegister("pc", frame_arm->context.iregs[15], sequence); + } else if (cpu == "arm64") { + const StackFrameARM64* frame_arm64 = + reinterpret_cast(frame); + + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_X0) { + sequence = + PrintRegister64("x0", frame_arm64->context.iregs[0], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_X1) { + sequence = + PrintRegister64("x1", frame_arm64->context.iregs[1], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_X2) { + sequence = + PrintRegister64("x2", frame_arm64->context.iregs[2], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_X3) { + sequence = + PrintRegister64("x3", frame_arm64->context.iregs[3], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_X4) { + sequence = + PrintRegister64("x4", frame_arm64->context.iregs[4], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_X5) { + sequence = + PrintRegister64("x5", frame_arm64->context.iregs[5], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_X6) { + sequence = + PrintRegister64("x6", frame_arm64->context.iregs[6], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_X7) { + sequence = + PrintRegister64("x7", frame_arm64->context.iregs[7], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_X8) { + sequence = + PrintRegister64("x8", frame_arm64->context.iregs[8], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_X9) { + sequence = + PrintRegister64("x9", frame_arm64->context.iregs[9], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X10) { + sequence = + PrintRegister64("x10", frame_arm64->context.iregs[10], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X11) { + sequence = + PrintRegister64("x11", frame_arm64->context.iregs[11], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X12) { + sequence = + PrintRegister64("x12", frame_arm64->context.iregs[12], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X13) { + sequence = + PrintRegister64("x13", frame_arm64->context.iregs[13], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X14) { + sequence = + PrintRegister64("x14", frame_arm64->context.iregs[14], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X15) { + sequence = + PrintRegister64("x15", frame_arm64->context.iregs[15], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X16) { + sequence = + PrintRegister64("x16", frame_arm64->context.iregs[16], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X17) { + sequence = + PrintRegister64("x17", frame_arm64->context.iregs[17], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X18) { + sequence = + PrintRegister64("x18", frame_arm64->context.iregs[18], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X19) { + sequence = + PrintRegister64("x19", frame_arm64->context.iregs[19], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X20) { + sequence = + PrintRegister64("x20", frame_arm64->context.iregs[20], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X21) { + sequence = + PrintRegister64("x21", frame_arm64->context.iregs[21], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X22) { + sequence = + PrintRegister64("x22", frame_arm64->context.iregs[22], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X23) { + sequence = + PrintRegister64("x23", frame_arm64->context.iregs[23], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X24) { + sequence = + PrintRegister64("x24", frame_arm64->context.iregs[24], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X25) { + sequence = + PrintRegister64("x25", frame_arm64->context.iregs[25], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X26) { + sequence = + PrintRegister64("x26", frame_arm64->context.iregs[26], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X27) { + sequence = + PrintRegister64("x27", frame_arm64->context.iregs[27], sequence); + } + if (frame_arm64->context_validity & + StackFrameARM64::CONTEXT_VALID_X28) { + sequence = + PrintRegister64("x28", frame_arm64->context.iregs[28], sequence); + } + + // Registers with a dedicated or conventional purpose. + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_FP) { + sequence = + PrintRegister64("fp", frame_arm64->context.iregs[29], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_LR) { + sequence = + PrintRegister64("lr", frame_arm64->context.iregs[30], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_SP) { + sequence = + PrintRegister64("sp", frame_arm64->context.iregs[31], sequence); + } + if (frame_arm64->context_validity & StackFrameARM64::CONTEXT_VALID_PC) { + sequence = + PrintRegister64("pc", frame_arm64->context.iregs[32], sequence); + } + } else if ((cpu == "mips") || (cpu == "mips64")) { + const StackFrameMIPS* frame_mips = + reinterpret_cast(frame); + + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_GP) + sequence = PrintRegister64( + "gp", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_GP], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_SP) + sequence = PrintRegister64( + "sp", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_SP], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_FP) + sequence = PrintRegister64( + "fp", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_FP], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_RA) + sequence = PrintRegister64( + "ra", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_RA], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_PC) + sequence = PrintRegister64("pc", frame_mips->context.epc, sequence); + + // Save registers s0-s7 + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_S0) + sequence = PrintRegister64( + "s0", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_S0], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_S1) + sequence = PrintRegister64( + "s1", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_S1], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_S2) + sequence = PrintRegister64( + "s2", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_S2], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_S3) + sequence = PrintRegister64( + "s3", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_S3], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_S4) + sequence = PrintRegister64( + "s4", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_S4], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_S5) + sequence = PrintRegister64( + "s5", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_S5], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_S6) + sequence = PrintRegister64( + "s6", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_S6], + sequence); + if (frame_mips->context_validity & StackFrameMIPS::CONTEXT_VALID_S7) + sequence = PrintRegister64( + "s7", frame_mips->context.iregs[MD_CONTEXT_MIPS_REG_S7], + sequence); + } else if (cpu == "riscv") { + const StackFrameRISCV* frame_riscv = + reinterpret_cast(frame); + + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_PC) + sequence = PrintRegister( + "pc", frame_riscv->context.pc, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_RA) + sequence = PrintRegister( + "ra", frame_riscv->context.ra, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_SP) + sequence = PrintRegister( + "sp", frame_riscv->context.sp, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_GP) + sequence = PrintRegister( + "gp", frame_riscv->context.gp, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_TP) + sequence = PrintRegister( + "tp", frame_riscv->context.tp, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_T0) + sequence = PrintRegister( + "t0", frame_riscv->context.t0, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_T1) + sequence = PrintRegister( + "t1", frame_riscv->context.t1, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_T2) + sequence = PrintRegister( + "t2", frame_riscv->context.t2, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S0) + sequence = PrintRegister( + "s0", frame_riscv->context.s0, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S1) + sequence = PrintRegister( + "s1", frame_riscv->context.s1, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_A0) + sequence = PrintRegister( + "a0", frame_riscv->context.a0, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_A1) + sequence = PrintRegister( + "a1", frame_riscv->context.a1, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_A2) + sequence = PrintRegister( + "a2", frame_riscv->context.a2, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_A3) + sequence = PrintRegister( + "a3", frame_riscv->context.a3, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_A4) + sequence = PrintRegister( + "a4", frame_riscv->context.a4, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_A5) + sequence = PrintRegister( + "a5", frame_riscv->context.a5, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_A6) + sequence = PrintRegister( + "a6", frame_riscv->context.a6, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_A7) + sequence = PrintRegister( + "a7", frame_riscv->context.a7, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S2) + sequence = PrintRegister( + "s2", frame_riscv->context.s2, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S3) + sequence = PrintRegister( + "s3", frame_riscv->context.s3, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S4) + sequence = PrintRegister( + "s4", frame_riscv->context.s4, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S5) + sequence = PrintRegister( + "s5", frame_riscv->context.s5, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S6) + sequence = PrintRegister( + "s6", frame_riscv->context.s6, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S7) + sequence = PrintRegister( + "s7", frame_riscv->context.s7, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S8) + sequence = PrintRegister( + "s8", frame_riscv->context.s8, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S9) + sequence = PrintRegister( + "s9", frame_riscv->context.s9, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S10) + sequence = PrintRegister( + "s10", frame_riscv->context.s10, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_S11) + sequence = PrintRegister( + "s11", frame_riscv->context.s11, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_T3) + sequence = PrintRegister( + "t3", frame_riscv->context.t3, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_T4) + sequence = PrintRegister( + "t4", frame_riscv->context.t4, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_T5) + sequence = PrintRegister( + "t5", frame_riscv->context.t5, sequence); + if (frame_riscv->context_validity & + StackFrameRISCV::CONTEXT_VALID_T6) + sequence = PrintRegister( + "t6", frame_riscv->context.t6, sequence); + } else if (cpu == "riscv64") { + const StackFrameRISCV64* frame_riscv64 = + reinterpret_cast(frame); + + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_PC) + sequence = PrintRegister64( + "pc", frame_riscv64->context.pc, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_RA) + sequence = PrintRegister64( + "ra", frame_riscv64->context.ra, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_SP) + sequence = PrintRegister64( + "sp", frame_riscv64->context.sp, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_GP) + sequence = PrintRegister64( + "gp", frame_riscv64->context.gp, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_TP) + sequence = PrintRegister64( + "tp", frame_riscv64->context.tp, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_T0) + sequence = PrintRegister64( + "t0", frame_riscv64->context.t0, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_T1) + sequence = PrintRegister64( + "t1", frame_riscv64->context.t1, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_T2) + sequence = PrintRegister64( + "t2", frame_riscv64->context.t2, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S0) + sequence = PrintRegister64( + "s0", frame_riscv64->context.s0, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S1) + sequence = PrintRegister64( + "s1", frame_riscv64->context.s1, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_A0) + sequence = PrintRegister64( + "a0", frame_riscv64->context.a0, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_A1) + sequence = PrintRegister64( + "a1", frame_riscv64->context.a1, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_A2) + sequence = PrintRegister64( + "a2", frame_riscv64->context.a2, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_A3) + sequence = PrintRegister64( + "a3", frame_riscv64->context.a3, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_A4) + sequence = PrintRegister64( + "a4", frame_riscv64->context.a4, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_A5) + sequence = PrintRegister64( + "a5", frame_riscv64->context.a5, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_A6) + sequence = PrintRegister64( + "a6", frame_riscv64->context.a6, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_A7) + sequence = PrintRegister64( + "a7", frame_riscv64->context.a7, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S2) + sequence = PrintRegister64( + "s2", frame_riscv64->context.s2, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S3) + sequence = PrintRegister64( + "s3", frame_riscv64->context.s3, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S4) + sequence = PrintRegister64( + "s4", frame_riscv64->context.s4, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S5) + sequence = PrintRegister64( + "s5", frame_riscv64->context.s5, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S6) + sequence = PrintRegister64( + "s6", frame_riscv64->context.s6, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S7) + sequence = PrintRegister64( + "s7", frame_riscv64->context.s7, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S8) + sequence = PrintRegister64( + "s8", frame_riscv64->context.s8, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S9) + sequence = PrintRegister64( + "s9", frame_riscv64->context.s9, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S10) + sequence = PrintRegister64( + "s10", frame_riscv64->context.s10, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S11) + sequence = PrintRegister64( + "s11", frame_riscv64->context.s11, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_T3) + sequence = PrintRegister64( + "t3", frame_riscv64->context.t3, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_T4) + sequence = PrintRegister64( + "t4", frame_riscv64->context.t4, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_T5) + sequence = PrintRegister64( + "t5", frame_riscv64->context.t5, sequence); + if (frame_riscv64->context_validity & + StackFrameRISCV64::CONTEXT_VALID_T6) + sequence = PrintRegister64( + "t6", frame_riscv64->context.t6, sequence); + } + } + printf("\n Found by: %s\n", frame->trust_description().c_str()); + + // Print stack contents. + if (output_stack_contents && frame_index + 1 < frame_count) { + const string indent(" "); + PrintStackContents(indent, frame, stack->frames()->at(frame_index + 1), + cpu, memory, modules, resolver); + } + } +} + +// PrintStackMachineReadable prints the call stack in |stack| to stdout, +// in the following machine readable pipe-delimited text format: +// thread number|frame number|module|function|source file|line|offset +// +// Module, function, source file, and source line may all be empty +// depending on availability. The code offset follows the same rules as +// PrintStack above. +static void PrintStackMachineReadable(int thread_num, const CallStack* stack) { + int frame_count = stack->frames()->size(); + for (int frame_index = 0; frame_index < frame_count; ++frame_index) { + const StackFrame* frame = stack->frames()->at(frame_index); + printf("%d%c%d%c", thread_num, kOutputSeparator, frame_index, + kOutputSeparator); + + uint64_t instruction_address = frame->ReturnAddress(); + + if (frame->module) { + assert(!frame->module->code_file().empty()); + printf("%s", StripSeparator(PathnameStripper::File( + frame->module->code_file())).c_str()); + if (!frame->function_name.empty()) { + printf("%c%s", kOutputSeparator, + StripSeparator(frame->function_name).c_str()); + if (!frame->source_file_name.empty()) { + printf("%c%s%c%d%c0x%" PRIx64, + kOutputSeparator, + StripSeparator(frame->source_file_name).c_str(), + kOutputSeparator, + frame->source_line, + kOutputSeparator, + instruction_address - frame->source_line_base); + } else { + printf("%c%c%c0x%" PRIx64, + kOutputSeparator, // empty source file + kOutputSeparator, // empty source line + kOutputSeparator, + instruction_address - frame->function_base); + } + } else { + printf("%c%c%c%c0x%" PRIx64, + kOutputSeparator, // empty function name + kOutputSeparator, // empty source file + kOutputSeparator, // empty source line + kOutputSeparator, + instruction_address - frame->module->base_address()); + } + } else { + // the printf before this prints a trailing separator for module name + printf("%c%c%c%c0x%" PRIx64, + kOutputSeparator, // empty function name + kOutputSeparator, // empty source file + kOutputSeparator, // empty source line + kOutputSeparator, + instruction_address); + } + printf("\n"); + } +} + +// ContainsModule checks whether a given |module| is in the vector +// |modules_without_symbols|. +static bool ContainsModule( + const vector* modules, + const CodeModule* module) { + assert(modules); + assert(module); + vector::const_iterator iter; + for (iter = modules->begin(); iter != modules->end(); ++iter) { + if (module->debug_file().compare((*iter)->debug_file()) == 0 && + module->debug_identifier().compare((*iter)->debug_identifier()) == 0) { + return true; + } + } + return false; +} + +// PrintModule prints a single |module| to stdout. +// |modules_without_symbols| should contain the list of modules that were +// confirmed to be missing their symbols during the stack walk. +static void PrintModule( + const CodeModule* module, + const vector* modules_without_symbols, + const vector* modules_with_corrupt_symbols, + uint64_t main_address) { + string symbol_issues; + if (ContainsModule(modules_without_symbols, module)) { + symbol_issues = " (WARNING: No symbols, " + + PathnameStripper::File(module->debug_file()) + ", " + + module->debug_identifier() + ")"; + } else if (ContainsModule(modules_with_corrupt_symbols, module)) { + symbol_issues = " (WARNING: Corrupt symbols, " + + PathnameStripper::File(module->debug_file()) + ", " + + module->debug_identifier() + ")"; + } + uint64_t base_address = module->base_address(); + printf("0x%08" PRIx64 " - 0x%08" PRIx64 " %s %s%s%s\n", + base_address, base_address + module->size() - 1, + PathnameStripper::File(module->code_file()).c_str(), + module->version().empty() ? "???" : module->version().c_str(), + main_address != 0 && base_address == main_address ? " (main)" : "", + symbol_issues.c_str()); +} + +// PrintModules prints the list of all loaded |modules| to stdout. +// |modules_without_symbols| should contain the list of modules that were +// confirmed to be missing their symbols during the stack walk. +static void PrintModules( + const CodeModules* modules, + const vector* modules_without_symbols, + const vector* modules_with_corrupt_symbols) { + if (!modules) + return; + + printf("\n"); + printf("Loaded modules:\n"); + + uint64_t main_address = 0; + const CodeModule* main_module = modules->GetMainModule(); + if (main_module) { + main_address = main_module->base_address(); + } + + unsigned int module_count = modules->module_count(); + for (unsigned int module_sequence = 0; + module_sequence < module_count; + ++module_sequence) { + const CodeModule* module = modules->GetModuleAtSequence(module_sequence); + PrintModule(module, modules_without_symbols, modules_with_corrupt_symbols, + main_address); + } +} + +// PrintModulesMachineReadable outputs a list of loaded modules, +// one per line, in the following machine-readable pipe-delimited +// text format: +// Module|{Module Filename}|{Version}|{Debug Filename}|{Debug Identifier}| +// {Base Address}|{Max Address}|{Main} +static void PrintModulesMachineReadable(const CodeModules* modules) { + if (!modules) + return; + + uint64_t main_address = 0; + const CodeModule* main_module = modules->GetMainModule(); + if (main_module) { + main_address = main_module->base_address(); + } + + unsigned int module_count = modules->module_count(); + for (unsigned int module_sequence = 0; + module_sequence < module_count; + ++module_sequence) { + const CodeModule* module = modules->GetModuleAtSequence(module_sequence); + uint64_t base_address = module->base_address(); + printf("Module%c%s%c%s%c%s%c%s%c0x%08" PRIx64 "%c0x%08" PRIx64 "%c%d\n", + kOutputSeparator, + StripSeparator(PathnameStripper::File(module->code_file())).c_str(), + kOutputSeparator, StripSeparator(module->version()).c_str(), + kOutputSeparator, + StripSeparator(PathnameStripper::File(module->debug_file())).c_str(), + kOutputSeparator, + StripSeparator(module->debug_identifier()).c_str(), + kOutputSeparator, base_address, + kOutputSeparator, base_address + module->size() - 1, + kOutputSeparator, + main_module != NULL && base_address == main_address ? 1 : 0); + } +} + +} // namespace + +void PrintProcessState(const ProcessState& process_state, + bool output_stack_contents, + bool output_requesting_thread_only, + SourceLineResolverInterface* resolver) { + // Print OS and CPU information. + string cpu = process_state.system_info()->cpu; + string cpu_info = process_state.system_info()->cpu_info; + printf("Operating system: %s\n", process_state.system_info()->os.c_str()); + printf(" %s\n", + process_state.system_info()->os_version.c_str()); + printf("CPU: %s\n", cpu.c_str()); + if (!cpu_info.empty()) { + // This field is optional. + printf(" %s\n", cpu_info.c_str()); + } + printf(" %d CPU%s\n", + process_state.system_info()->cpu_count, + process_state.system_info()->cpu_count != 1 ? "s" : ""); + printf("\n"); + + // Print GPU information + string gl_version = process_state.system_info()->gl_version; + string gl_vendor = process_state.system_info()->gl_vendor; + string gl_renderer = process_state.system_info()->gl_renderer; + printf("GPU:"); + if (!gl_version.empty() || !gl_vendor.empty() || !gl_renderer.empty()) { + printf(" %s\n", gl_version.c_str()); + printf(" %s\n", gl_vendor.c_str()); + printf(" %s\n", gl_renderer.c_str()); + } else { + printf(" UNKNOWN\n"); + } + printf("\n"); + + // Print crash information. + if (process_state.crashed()) { + printf("Crash reason: %s\n", process_state.crash_reason().c_str()); + printf("Crash address: 0x%" PRIx64 "\n", process_state.crash_address()); + } else { + printf("No crash\n"); + } + + string assertion = process_state.assertion(); + if (!assertion.empty()) { + printf("Assertion: %s\n", assertion.c_str()); + } + + // Compute process uptime if the process creation and crash times are + // available in the dump. + if (process_state.time_date_stamp() != 0 && + process_state.process_create_time() != 0 && + process_state.time_date_stamp() >= process_state.process_create_time()) { + printf("Process uptime: %d seconds\n", + process_state.time_date_stamp() - + process_state.process_create_time()); + } else { + printf("Process uptime: not available\n"); + } + + // If the thread that requested the dump is known, print it first. + int requesting_thread = process_state.requesting_thread(); + if (requesting_thread != -1) { + printf("\n"); + printf("Thread %d (%s)\n", + requesting_thread, + process_state.crashed() ? "crashed" : + "requested dump, did not crash"); + PrintStack(process_state.threads()->at(requesting_thread), cpu, + output_stack_contents, + process_state.thread_memory_regions()->at(requesting_thread), + process_state.modules(), resolver); + } + + if (!output_requesting_thread_only) { + // Print all of the threads in the dump. + int thread_count = process_state.threads()->size(); + for (int thread_index = 0; thread_index < thread_count; ++thread_index) { + if (thread_index != requesting_thread) { + // Don't print the crash thread again, it was already printed. + printf("\n"); + printf("Thread %d\n", thread_index); + PrintStack(process_state.threads()->at(thread_index), cpu, + output_stack_contents, + process_state.thread_memory_regions()->at(thread_index), + process_state.modules(), resolver); + } + } + } + + PrintModules(process_state.modules(), + process_state.modules_without_symbols(), + process_state.modules_with_corrupt_symbols()); +} + +void PrintProcessStateMachineReadable(const ProcessState& process_state) { + // Print OS and CPU information. + // OS|{OS Name}|{OS Version} + // CPU|{CPU Name}|{CPU Info}|{Number of CPUs} + // GPU|{GPU version}|{GPU vendor}|{GPU renderer} + printf("OS%c%s%c%s\n", kOutputSeparator, + StripSeparator(process_state.system_info()->os).c_str(), + kOutputSeparator, + StripSeparator(process_state.system_info()->os_version).c_str()); + printf("CPU%c%s%c%s%c%d\n", kOutputSeparator, + StripSeparator(process_state.system_info()->cpu).c_str(), + kOutputSeparator, + // this may be empty + StripSeparator(process_state.system_info()->cpu_info).c_str(), + kOutputSeparator, + process_state.system_info()->cpu_count); + printf("GPU%c%s%c%s%c%s\n", kOutputSeparator, + StripSeparator(process_state.system_info()->gl_version).c_str(), + kOutputSeparator, + StripSeparator(process_state.system_info()->gl_vendor).c_str(), + kOutputSeparator, + StripSeparator(process_state.system_info()->gl_renderer).c_str()); + + int requesting_thread = process_state.requesting_thread(); + + // Print crash information. + // Crash|{Crash Reason}|{Crash Address}|{Crashed Thread} + printf("Crash%c", kOutputSeparator); + if (process_state.crashed()) { + printf("%s%c0x%" PRIx64 "%c", + StripSeparator(process_state.crash_reason()).c_str(), + kOutputSeparator, process_state.crash_address(), kOutputSeparator); + } else { + // print assertion info, if available, in place of crash reason, + // instead of the unhelpful "No crash" + string assertion = process_state.assertion(); + if (!assertion.empty()) { + printf("%s%c%c", StripSeparator(assertion).c_str(), + kOutputSeparator, kOutputSeparator); + } else { + printf("No crash%c%c", kOutputSeparator, kOutputSeparator); + } + } + + if (requesting_thread != -1) { + printf("%d\n", requesting_thread); + } else { + printf("\n"); + } + + PrintModulesMachineReadable(process_state.modules()); + + // blank line to indicate start of threads + printf("\n"); + + // If the thread that requested the dump is known, print it first. + if (requesting_thread != -1) { + PrintStackMachineReadable(requesting_thread, + process_state.threads()->at(requesting_thread)); + } + + // Print all of the threads in the dump. + int thread_count = process_state.threads()->size(); + for (int thread_index = 0; thread_index < thread_count; ++thread_index) { + if (thread_index != requesting_thread) { + // Don't print the crash thread again, it was already printed. + PrintStackMachineReadable(thread_index, + process_state.threads()->at(thread_index)); + } + } +} + +void PrintRequestingThreadBrief(const ProcessState& process_state) { + int requesting_thread = process_state.requesting_thread(); + if (requesting_thread == -1) { + printf(" \n"); + return; + } + + printf("Thread %d (%s)\n", requesting_thread, + process_state.crashed() ? "crashed" : "requested dump, did not crash"); + const CallStack* stack = process_state.threads()->at(requesting_thread); + int frame_count = stack->frames()->size(); + for (int frame_index = 0; frame_index < frame_count; ++frame_index) { + PrintFrameHeader(stack->frames()->at(frame_index), frame_index); + printf("\n"); + } +} + +} // namespace google_breakpad diff --git a/src/processor/stackwalk_common.h b/src/processor/stackwalk_common.h new file mode 100644 index 0000000..3782f98 --- /dev/null +++ b/src/processor/stackwalk_common.h @@ -0,0 +1,50 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalk_common.cc: Module shared by the {micro,mini}dump_stackwalck +// executables to print the content of dumps (w/ stack traces) on the console. + + +#ifndef PROCESSOR_STACKWALK_COMMON_H__ +#define PROCESSOR_STACKWALK_COMMON_H__ + +namespace google_breakpad { + +class ProcessState; +class SourceLineResolverInterface; + +void PrintProcessStateMachineReadable(const ProcessState& process_state); +void PrintProcessState(const ProcessState& process_state, + bool output_stack_contents, + bool output_requesting_thread_only, + SourceLineResolverInterface* resolver); +void PrintRequestingThreadBrief(const ProcessState& process_state); + +} // namespace google_breakpad + +#endif // PROCESSOR_STACKWALK_COMMON_H__ diff --git a/src/processor/stackwalker.cc b/src/processor/stackwalker.cc new file mode 100644 index 0000000..1ff6cf7 --- /dev/null +++ b/src/processor/stackwalker.cc @@ -0,0 +1,358 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker.cc: Generic stackwalker. +// +// See stackwalker.h for documentation. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/stackwalker.h" + +#include + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/dump_context.h" +#include "google_breakpad/processor/stack_frame.h" +#include "google_breakpad/processor/stack_frame_symbolizer.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/linked_ptr.h" +#include "processor/logging.h" +#include "processor/stackwalker_ppc.h" +#include "processor/stackwalker_ppc64.h" +#include "processor/stackwalker_sparc.h" +#include "processor/stackwalker_x86.h" +#include "processor/stackwalker_amd64.h" +#include "processor/stackwalker_arm.h" +#include "processor/stackwalker_arm64.h" +#include "processor/stackwalker_mips.h" +#include "processor/stackwalker_riscv.h" +#include "processor/stackwalker_riscv64.h" + +namespace google_breakpad { + +const int Stackwalker::kRASearchWords = 40; + +// This default is just a sanity check: a large enough value +// that allow capturing unbounded recursion traces, yet provide a +// guardrail against stack walking bugs. The stack walking invariants +// guarantee that the unwinding process is strictly monotonic and +// practically bounded by the size of the stack memory range. +uint32_t Stackwalker::max_frames_ = 1 << 20; // 1M +bool Stackwalker::max_frames_set_ = false; + +uint32_t Stackwalker::max_frames_scanned_ = 1 << 14; // 16k + +Stackwalker::Stackwalker(const SystemInfo* system_info, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer) + : system_info_(system_info), + memory_(memory), + modules_(modules), + unloaded_modules_(NULL), + frame_symbolizer_(frame_symbolizer) { + assert(frame_symbolizer_); +} + +void InsertSpecialAttentionModule( + StackFrameSymbolizer::SymbolizerResult symbolizer_result, + const CodeModule* module, + vector* modules) { + if (!module) { + return; + } + assert(symbolizer_result == StackFrameSymbolizer::kError || + symbolizer_result == StackFrameSymbolizer::kWarningCorruptSymbols); + bool found = false; + vector::iterator iter; + for (iter = modules->begin(); iter != modules->end(); ++iter) { + if (*iter == module) { + found = true; + break; + } + } + if (!found) { + BPLOG(INFO) << ((symbolizer_result == StackFrameSymbolizer::kError) ? + "Couldn't load symbols for: " : + "Detected corrupt symbols for: ") + << module->debug_file() << "|" << module->debug_identifier(); + modules->push_back(module); + } +} + +bool Stackwalker::Walk( + CallStack* stack, + vector* modules_without_symbols, + vector* modules_with_corrupt_symbols) { + BPLOG_IF(ERROR, !stack) << "Stackwalker::Walk requires |stack|"; + assert(stack); + stack->Clear(); + + BPLOG_IF(ERROR, !modules_without_symbols) << "Stackwalker::Walk requires " + << "|modules_without_symbols|"; + BPLOG_IF(ERROR, !modules_without_symbols) << "Stackwalker::Walk requires " + << "|modules_with_corrupt_symbols|"; + assert(modules_without_symbols); + assert(modules_with_corrupt_symbols); + + // Begin with the context frame, and keep getting callers until there are + // no more. + + // Keep track of the number of scanned or otherwise dubious frames seen + // so far, as the caller may have set a limit. + uint32_t scanned_frames = 0; + + // Take ownership of the pointer returned by GetContextFrame. + scoped_ptr frame(GetContextFrame()); + + while (frame.get()) { + // frame already contains a good frame with properly set instruction and + // frame_pointer fields. The frame structure comes from either the + // context frame (above) or a caller frame (below). + + std::deque> inlined_frames; + // Resolve the module information, if a module map was provided. + StackFrameSymbolizer::SymbolizerResult symbolizer_result = + frame_symbolizer_->FillSourceLineInfo(modules_, unloaded_modules_, + system_info_, + frame.get(), &inlined_frames); + switch (symbolizer_result) { + case StackFrameSymbolizer::kInterrupt: + BPLOG(INFO) << "Stack walk is interrupted."; + return false; + break; + case StackFrameSymbolizer::kError: + InsertSpecialAttentionModule(symbolizer_result, frame->module, + modules_without_symbols); + break; + case StackFrameSymbolizer::kWarningCorruptSymbols: + InsertSpecialAttentionModule(symbolizer_result, frame->module, + modules_with_corrupt_symbols); + break; + case StackFrameSymbolizer::kNoError: + break; + default: + assert(false); + break; + } + + // Keep track of the number of dubious frames so far. + switch (frame.get()->trust) { + case StackFrame::FRAME_TRUST_NONE: + case StackFrame::FRAME_TRUST_SCAN: + case StackFrame::FRAME_TRUST_CFI_SCAN: + scanned_frames++; + break; + default: + break; + } + // Add all nested inlined frames belonging to this frame from the innermost + // frame to the outermost frame. + while (!inlined_frames.empty()) { + stack->frames_.push_back(inlined_frames.front().release()); + inlined_frames.pop_front(); + } + // Add the frame to the call stack. Relinquish the ownership claim + // over the frame, because the stack now owns it. + stack->frames_.push_back(frame.release()); + if (stack->frames_.size() > max_frames_) { + // Only emit an error message in the case where the limit + // reached is the default limit, not set by the user. + if (!max_frames_set_) + BPLOG(ERROR) << "The stack is over " << max_frames_ << " frames."; + break; + } + + // Get the next frame and take ownership. + bool stack_scan_allowed = scanned_frames < max_frames_scanned_; + frame.reset(GetCallerFrame(stack, stack_scan_allowed)); + } + + return true; +} + +// static +Stackwalker* Stackwalker::StackwalkerForCPU( + const SystemInfo* system_info, + DumpContext* context, + MemoryRegion* memory, + const CodeModules* modules, + const CodeModules* unloaded_modules, + StackFrameSymbolizer* frame_symbolizer) { + if (!context) { + BPLOG(ERROR) << "Can't choose a stackwalker implementation without context"; + return NULL; + } + + Stackwalker* cpu_stackwalker = NULL; + + uint32_t cpu = context->GetContextCPU(); + switch (cpu) { + case MD_CONTEXT_X86: + cpu_stackwalker = new StackwalkerX86(system_info, + context->GetContextX86(), + memory, modules, frame_symbolizer); + break; + + case MD_CONTEXT_PPC: + cpu_stackwalker = new StackwalkerPPC(system_info, + context->GetContextPPC(), + memory, modules, frame_symbolizer); + break; + + case MD_CONTEXT_PPC64: + cpu_stackwalker = new StackwalkerPPC64(system_info, + context->GetContextPPC64(), + memory, modules, frame_symbolizer); + break; + + case MD_CONTEXT_AMD64: + cpu_stackwalker = new StackwalkerAMD64(system_info, + context->GetContextAMD64(), + memory, modules, frame_symbolizer); + break; + + case MD_CONTEXT_SPARC: + cpu_stackwalker = new StackwalkerSPARC(system_info, + context->GetContextSPARC(), + memory, modules, frame_symbolizer); + break; + + case MD_CONTEXT_MIPS: + case MD_CONTEXT_MIPS64: + cpu_stackwalker = new StackwalkerMIPS(system_info, + context->GetContextMIPS(), + memory, modules, frame_symbolizer); + break; + + case MD_CONTEXT_ARM: + { + int fp_register = -1; + if (system_info->os_short == "ios") + fp_register = MD_CONTEXT_ARM_REG_IOS_FP; + cpu_stackwalker = new StackwalkerARM(system_info, + context->GetContextARM(), + fp_register, memory, modules, + frame_symbolizer); + break; + } + + case MD_CONTEXT_ARM64: + cpu_stackwalker = new StackwalkerARM64(system_info, + context->GetContextARM64(), + memory, modules, + frame_symbolizer); + break; + + case MD_CONTEXT_RISCV: + cpu_stackwalker = new StackwalkerRISCV(system_info, + context->GetContextRISCV(), + memory, modules, + frame_symbolizer); + break; + + case MD_CONTEXT_RISCV64: + cpu_stackwalker = new StackwalkerRISCV64(system_info, + context->GetContextRISCV64(), + memory, modules, + frame_symbolizer); + break; + } + + BPLOG_IF(ERROR, !cpu_stackwalker) << "Unknown CPU type " << HexString(cpu) << + ", can't choose a stackwalker " + "implementation"; + if (cpu_stackwalker) { + cpu_stackwalker->unloaded_modules_ = unloaded_modules; + } + return cpu_stackwalker; +} + +// CONSIDER: check stack alignment? +bool Stackwalker::TerminateWalk(uint64_t caller_ip, + uint64_t caller_sp, + uint64_t callee_sp, + bool first_unwind) const { + // Treat an instruction address less than 4k as end-of-stack. + // (using InstructionAddressSeemsValid() here is very tempting, + // but we need to handle JITted code) + if (caller_ip < (1 << 12)) { + return true; + } + + // NOTE: The stack address range is implicitly checked + // when the stack memory is accessed. + + // The stack pointer should monotonically increase. For first unwind + // we allow caller_sp == callee_sp to account for architectures where + // the return address is stored in a register (so it's possible to have + // leaf functions which don't move the stack pointer) + if (first_unwind ? (caller_sp < callee_sp) : (caller_sp <= callee_sp)) { + return true; + } + + return false; +} + +bool Stackwalker::InstructionAddressSeemsValid(uint64_t address) const { + StackFrame frame; + frame.instruction = address; + StackFrameSymbolizer::SymbolizerResult symbolizer_result = + frame_symbolizer_->FillSourceLineInfo(modules_, unloaded_modules_, + system_info_, &frame, nullptr); + + if (!frame.module) { + // not inside any loaded module + return false; + } + + if (!frame_symbolizer_->HasImplementation()) { + // No valid implementation to symbolize stack frame, but the address is + // within a known module. + return true; + } + + if (symbolizer_result != StackFrameSymbolizer::kNoError && + symbolizer_result != StackFrameSymbolizer::kWarningCorruptSymbols) { + // Some error occurred during symbolization, but the address is within a + // known module + return true; + } + + return !frame.function_name.empty(); +} + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_address_list.cc b/src/processor/stackwalker_address_list.cc new file mode 100644 index 0000000..7c346c6 --- /dev/null +++ b/src/processor/stackwalker_address_list.cc @@ -0,0 +1,95 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_address_list.cc: a pseudo stack walker. +// +// See stackwalker_address_list.h for documentation. +// +// Author: Chris Hamilton + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include + +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame.h" +#include "processor/logging.h" +#include "processor/stackwalker_address_list.h" + +namespace google_breakpad { + +StackwalkerAddressList::StackwalkerAddressList( + const uint64_t* frames, + size_t frame_count, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer) + : Stackwalker(NULL, NULL, modules, frame_symbolizer), + frames_(frames), + frame_count_(frame_count) { + assert(frames); + assert(frame_symbolizer); +} + +StackFrame* StackwalkerAddressList::GetContextFrame() { + if (frame_count_ == 0) + return NULL; + + StackFrame* frame = new StackFrame(); + frame->instruction = frames_[0]; + frame->trust = StackFrame::FRAME_TRUST_PREWALKED; + return frame; +} + +StackFrame* StackwalkerAddressList::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!stack) { + BPLOG(ERROR) << "Can't get caller frame without stack"; + return NULL; + } + + size_t frame_index = stack->frames()->size(); + + // There are no more frames to fetch. + if (frame_index >= frame_count_) + return NULL; + + // All frames have the highest level of trust because they were + // explicitly provided. + StackFrame* frame = new StackFrame(); + frame->instruction = frames_[frame_index]; + frame->trust = StackFrame::FRAME_TRUST_PREWALKED; + return frame; +} + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_address_list.h b/src/processor/stackwalker_address_list.h new file mode 100644 index 0000000..d27f3fb --- /dev/null +++ b/src/processor/stackwalker_address_list.h @@ -0,0 +1,70 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_address_list.h: a pseudo stackwalker. +// +// Doesn't actually walk a stack, rather initializes a CallStack given an +// explicit list of already walked return addresses. +// +// Author: Chris Hamilton + +#ifndef PROCESSOR_STACKWALKER_ADDRESS_LIST_H_ +#define PROCESSOR_STACKWALKER_ADDRESS_LIST_H_ + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerAddressList : public Stackwalker { + public: + // Initializes this stack walker with an explicit set of frame addresses. + // |modules| and |frame_symbolizer| are passed directly through to the base + // Stackwalker constructor. + StackwalkerAddressList(const uint64_t* frames, + size_t frame_count, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + StackwalkerAddressList(const StackwalkerAddressList&) = delete; + void operator=(const StackwalkerAddressList&) = delete; + + private: + // Implementation of Stackwalker. + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed); + + const uint64_t* frames_; + size_t frame_count_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_STACKWALKER_ADDRESS_LIST_H_ diff --git a/src/processor/stackwalker_address_list_unittest.cc b/src/processor/stackwalker_address_list_unittest.cc new file mode 100644 index 0000000..1b5a4fc --- /dev/null +++ b/src/processor/stackwalker_address_list_unittest.cc @@ -0,0 +1,201 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_address_list_unittest.cc: Unit tests for the +// StackwalkerAddressList class. +// +// Author: Chris Hamilton + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame.h" +#include "processor/stackwalker_unittest_utils.h" +#include "processor/stackwalker_address_list.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::StackFrameSymbolizer; +using google_breakpad::StackFrame; +using google_breakpad::Stackwalker; +using google_breakpad::StackwalkerAddressList; +using std::vector; +using testing::_; +using testing::AnyNumber; +using testing::DoAll; +using testing::Return; +using testing::SetArgumentPointee; + +#define arraysize(f) (sizeof(f) / sizeof(*f)) + +// Addresses and sizes of a couple dummy modules. +uint64_t kModule1Base = 0x40000000; +uint64_t kModule1Size = 0x10000; +uint64_t kModule2Base = 0x50000000; +uint64_t kModule2Size = 0x10000; + +// A handful of addresses that lie within the modules above. +const uint64_t kDummyFrames[] = { + 0x50003000, 0x50002000, 0x50001000, 0x40002000, 0x40001000 }; + +class StackwalkerAddressListTest : public testing::Test { + public: + StackwalkerAddressListTest() + : // Give the two modules reasonable standard locations and names + // for tests to play with. + module1(kModule1Base, kModule1Size, "module1", "version1"), + module2(kModule2Base, kModule2Size, "module2", "version2") { + // Create some modules with some stock debugging information. + modules.Add(&module1); + modules.Add(&module2); + + // By default, none of the modules have symbol info; call + // SetModuleSymbols to override this. + EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _, _)) + .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND)); + + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + } + + // Set the Breakpad symbol information that supplier should return for + // MODULE to INFO. + void SetModuleSymbols(MockCodeModule* module, const string& info) { + size_t buffer_size; + char* buffer = supplier.CopySymbolDataAndOwnTheCopy(info, &buffer_size); + EXPECT_CALL(supplier, GetCStringSymbolData(module, NULL, _, _, _)) + .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer), + SetArgumentPointee<4>(buffer_size), + Return(MockSymbolSupplier::FOUND))); + } + + void CheckCallStack(const CallStack& call_stack) { + const std::vector* frames = call_stack.frames(); + ASSERT_EQ(arraysize(kDummyFrames), frames->size()); + for (size_t i = 0; i < arraysize(kDummyFrames); ++i) { + ASSERT_EQ(kDummyFrames[i], frames->at(i)->instruction); + ASSERT_EQ(StackFrame::FRAME_TRUST_PREWALKED, frames->at(i)->trust); + } + ASSERT_EQ(static_cast(&module2), frames->at(0)->module); + ASSERT_EQ(static_cast(&module2), frames->at(1)->module); + ASSERT_EQ(static_cast(&module2), frames->at(2)->module); + ASSERT_EQ(static_cast(&module1), frames->at(3)->module); + ASSERT_EQ(static_cast(&module1), frames->at(4)->module); + } + + MockCodeModule module1; + MockCodeModule module2; + MockCodeModules modules; + MockSymbolSupplier supplier; + BasicSourceLineResolver resolver; +}; + +TEST_F(StackwalkerAddressListTest, ScanWithoutSymbols) { + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAddressList walker(kDummyFrames, arraysize(kDummyFrames), + &modules, &frame_symbolizer); + + CallStack call_stack; + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + + // The stack starts in module2, so we expect that to be the first module + // found without symbols. + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module2", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module1", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0u, modules_with_corrupt_symbols.size()); + + ASSERT_NO_FATAL_FAILURE(CheckCallStack(call_stack)); +} + +TEST_F(StackwalkerAddressListTest, ScanWithSymbols) { + // File : FILE number(dex) name + // Function: FUNC address(hex) size(hex) parameter_size(hex) name + // Line : address(hex) size(hex) line(dec) filenum(dec) + SetModuleSymbols(&module2, + "FILE 1 module2.cc\n" + "FUNC 3000 100 10 mod2func3\n" + "3000 10 1 1\n" + "FUNC 2000 200 10 mod2func2\n" + "FUNC 1000 300 10 mod2func1\n"); + SetModuleSymbols(&module1, + "FUNC 2000 200 10 mod1func2\n" + "FUNC 1000 300 10 mod1func1\n"); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAddressList walker(kDummyFrames, arraysize(kDummyFrames), + &modules, &frame_symbolizer); + + CallStack call_stack; + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + + ASSERT_EQ(0u, modules_without_symbols.size()); + ASSERT_EQ(0u, modules_with_corrupt_symbols.size()); + + ASSERT_NO_FATAL_FAILURE(CheckCallStack(call_stack)); + + const std::vector* frames = call_stack.frames(); + + // We have full file/line information for the first function call. + ASSERT_EQ("mod2func3", frames->at(0)->function_name); + ASSERT_EQ(0x50003000u, frames->at(0)->function_base); + ASSERT_EQ("module2.cc", frames->at(0)->source_file_name); + ASSERT_EQ(1, frames->at(0)->source_line); + ASSERT_EQ(0x50003000u, frames->at(0)->source_line_base); + + ASSERT_EQ("mod2func2", frames->at(1)->function_name); + ASSERT_EQ(0x50002000u, frames->at(1)->function_base); + + ASSERT_EQ("mod2func1", frames->at(2)->function_name); + ASSERT_EQ(0x50001000u, frames->at(2)->function_base); + + ASSERT_EQ("mod1func2", frames->at(3)->function_name); + ASSERT_EQ(0x40002000u, frames->at(3)->function_base); + + ASSERT_EQ("mod1func1", frames->at(4)->function_name); + ASSERT_EQ(0x40001000u, frames->at(4)->function_base); +} diff --git a/src/processor/stackwalker_amd64.cc b/src/processor/stackwalker_amd64.cc new file mode 100644 index 0000000..b934e73 --- /dev/null +++ b/src/processor/stackwalker_amd64.cc @@ -0,0 +1,380 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_amd64.cc: amd64-specific stackwalker. +// +// See stackwalker_amd64.h for documentation. +// +// Author: Mark Mentovai, Ted Mielczarek + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/cfi_frame_info.h" +#include "processor/logging.h" +#include "processor/stackwalker_amd64.h" + +namespace google_breakpad { + + +const StackwalkerAMD64::CFIWalker::RegisterSet +StackwalkerAMD64::cfi_register_map_[] = { + // It may seem like $rip and $rsp are callee-saves, because the callee is + // responsible for having them restored upon return. But the callee_saves + // flags here really means that the walker should assume they're + // unchanged if the CFI doesn't mention them --- clearly wrong for $rip + // and $rsp. + { "$rax", NULL, false, + StackFrameAMD64::CONTEXT_VALID_RAX, &MDRawContextAMD64::rax }, + { "$rdx", NULL, false, + StackFrameAMD64::CONTEXT_VALID_RDX, &MDRawContextAMD64::rdx }, + { "$rcx", NULL, false, + StackFrameAMD64::CONTEXT_VALID_RCX, &MDRawContextAMD64::rcx }, + { "$rbx", NULL, true, + StackFrameAMD64::CONTEXT_VALID_RBX, &MDRawContextAMD64::rbx }, + { "$rsi", NULL, false, + StackFrameAMD64::CONTEXT_VALID_RSI, &MDRawContextAMD64::rsi }, + { "$rdi", NULL, false, + StackFrameAMD64::CONTEXT_VALID_RDI, &MDRawContextAMD64::rdi }, + { "$rbp", NULL, true, + StackFrameAMD64::CONTEXT_VALID_RBP, &MDRawContextAMD64::rbp }, + { "$rsp", ".cfa", false, + StackFrameAMD64::CONTEXT_VALID_RSP, &MDRawContextAMD64::rsp }, + { "$r8", NULL, false, + StackFrameAMD64::CONTEXT_VALID_R8, &MDRawContextAMD64::r8 }, + { "$r9", NULL, false, + StackFrameAMD64::CONTEXT_VALID_R9, &MDRawContextAMD64::r9 }, + { "$r10", NULL, false, + StackFrameAMD64::CONTEXT_VALID_R10, &MDRawContextAMD64::r10 }, + { "$r11", NULL, false, + StackFrameAMD64::CONTEXT_VALID_R11, &MDRawContextAMD64::r11 }, + { "$r12", NULL, true, + StackFrameAMD64::CONTEXT_VALID_R12, &MDRawContextAMD64::r12 }, + { "$r13", NULL, true, + StackFrameAMD64::CONTEXT_VALID_R13, &MDRawContextAMD64::r13 }, + { "$r14", NULL, true, + StackFrameAMD64::CONTEXT_VALID_R14, &MDRawContextAMD64::r14 }, + { "$r15", NULL, true, + StackFrameAMD64::CONTEXT_VALID_R15, &MDRawContextAMD64::r15 }, + { "$rip", ".ra", false, + StackFrameAMD64::CONTEXT_VALID_RIP, &MDRawContextAMD64::rip }, +}; + +StackwalkerAMD64::StackwalkerAMD64(const SystemInfo* system_info, + const MDRawContextAMD64* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* resolver_helper) + : Stackwalker(system_info, memory, modules, resolver_helper), + context_(context), + cfi_walker_(cfi_register_map_, + (sizeof(cfi_register_map_) / sizeof(cfi_register_map_[0]))) { +} + +uint64_t StackFrameAMD64::ReturnAddress() const { + assert(context_validity & StackFrameAMD64::CONTEXT_VALID_RIP); + return context.rip; +} + +StackFrame* StackwalkerAMD64::GetContextFrame() { + if (!context_) { + BPLOG(ERROR) << "Can't get context frame without context"; + return NULL; + } + + StackFrameAMD64* frame = new StackFrameAMD64(); + + // The instruction pointer is stored directly in a register, so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = StackFrameAMD64::CONTEXT_VALID_ALL; + frame->trust = StackFrame::FRAME_TRUST_CONTEXT; + frame->instruction = frame->context.rip; + + return frame; +} + +StackFrameAMD64* StackwalkerAMD64::GetCallerByCFIFrameInfo( + const vector& frames, + CFIFrameInfo* cfi_frame_info) { + StackFrameAMD64* last_frame = static_cast(frames.back()); + + scoped_ptr frame(new StackFrameAMD64()); + if (!cfi_walker_ + .FindCallerRegisters(*memory_, *cfi_frame_info, + last_frame->context, last_frame->context_validity, + &frame->context, &frame->context_validity)) + return NULL; + + // Make sure we recovered all the essentials. + static const int essentials = (StackFrameAMD64::CONTEXT_VALID_RIP + | StackFrameAMD64::CONTEXT_VALID_RSP); + if ((frame->context_validity & essentials) != essentials) + return NULL; + + if (!frame->context.rip || !frame->context.rsp) { + BPLOG(ERROR) << "invalid rip/rsp"; + return NULL; + } + + frame->trust = StackFrame::FRAME_TRUST_CFI; + return frame.release(); +} + +// Returns true if `ptr` is not in x86-64 canonical form. +// https://en.wikipedia.org/wiki/X86-64#Virtual_address_space_details +static bool is_non_canonical(uint64_t ptr) { + return ptr > 0x7FFFFFFFFFFF && ptr < 0xFFFF800000000000; +} + +StackFrameAMD64* StackwalkerAMD64::GetCallerByFramePointerRecovery( + const vector& frames) { + StackFrameAMD64* last_frame = static_cast(frames.back()); + uint64_t last_rbp = last_frame->context.rbp; + + // Assume the presence of a frame pointer. This is not mandated by the + // AMD64 ABI, c.f. section 3.2.2 footnote 7, though it is typical for + // compilers to still preserve the frame pointer and not treat %rbp as a + // general purpose register. + // + // With this assumption, the CALL instruction pushes the return address + // onto the stack and sets %rip to the procedure to enter. The procedure + // then establishes the stack frame with a prologue that PUSHes the current + // %rbp onto the stack, MOVes the current %rsp to %rbp, and then allocates + // space for any local variables. Using this procedure linking information, + // it is possible to locate frame information for the callee: + // + // %caller_rsp = *(%callee_rbp + 16) + // %caller_rip = *(%callee_rbp + 8) + // %caller_rbp = *(%callee_rbp) + + // If rbp is not 8-byte aligned it can't be a frame pointer. + if (last_rbp % 8 != 0) { + return NULL; + } + + uint64_t caller_rip, caller_rbp; + if (memory_->GetMemoryAtAddress(last_rbp + 8, &caller_rip) && + memory_->GetMemoryAtAddress(last_rbp, &caller_rbp)) { + uint64_t caller_rsp = last_rbp + 16; + + // If the recovered rip is not a canonical address it can't be + // the return address, so rbp must not have been a frame pointer. + if (is_non_canonical(caller_rip)) { + return NULL; + } + + // Check that rbp is within the right frame + if (caller_rsp <= last_rbp || caller_rbp < caller_rsp) { + return NULL; + } + + // Sanity check that resulting rbp is still inside stack memory. + uint64_t unused; + if (!memory_->GetMemoryAtAddress(caller_rbp, &unused)) { + return NULL; + } + + StackFrameAMD64* frame = new StackFrameAMD64(); + frame->trust = StackFrame::FRAME_TRUST_FP; + frame->context = last_frame->context; + frame->context.rip = caller_rip; + frame->context.rsp = caller_rsp; + frame->context.rbp = caller_rbp; + frame->context_validity = StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP | + StackFrameAMD64::CONTEXT_VALID_RBP; + return frame; + } + + return NULL; +} + +StackFrameAMD64* StackwalkerAMD64::GetCallerBySimulatingReturn( + const vector& frames) { + assert(frames.back()->trust == StackFrame::FRAME_TRUST_CONTEXT); + StackFrameAMD64* last_frame = static_cast(frames.back()); + uint64_t last_rsp = last_frame->context.rsp; + uint64_t caller_rip_address, caller_rip; + int searchwords = 1; + if (!ScanForReturnAddress(last_rsp, &caller_rip_address, &caller_rip, + searchwords)) { + // No plausible return address at the top of the stack. Unable to simulate + // a return. + return NULL; + } + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameAMD64* frame = new StackFrameAMD64(); + + frame->trust = StackFrame::FRAME_TRUST_LEAF; + frame->context = last_frame->context; + frame->context.rip = caller_rip; + // The caller's %rsp is directly underneath the return address pushed by + // the call. + frame->context.rsp = caller_rip_address + 8; + frame->context_validity = last_frame->context_validity; + + return frame; +} + +StackFrameAMD64* StackwalkerAMD64::GetCallerByStackScan( + const vector& frames) { + StackFrameAMD64* last_frame = static_cast(frames.back()); + uint64_t last_rsp = last_frame->context.rsp; + uint64_t caller_rip_address, caller_rip; + + if (!ScanForReturnAddress(last_rsp, &caller_rip_address, &caller_rip, + /*is_context_frame=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + // No plausible return address was found. + return NULL; + } + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameAMD64* frame = new StackFrameAMD64(); + + frame->trust = StackFrame::FRAME_TRUST_SCAN; + frame->context = last_frame->context; + frame->context.rip = caller_rip; + // The caller's %rsp is directly underneath the return address pushed by + // the call. + frame->context.rsp = caller_rip_address + 8; + frame->context_validity = StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP; + + // Other unwinders give up if they don't have an %rbp value, so see if we + // can pass some plausible value on. + if (last_frame->context_validity & StackFrameAMD64::CONTEXT_VALID_RBP) { + // Functions typically push their caller's %rbp immediately upon entry, + // and then set %rbp to point to that. So if the callee's %rbp is + // pointing to the first word below the alleged return address, presume + // that the caller's %rbp is saved there. + if (caller_rip_address - 8 == last_frame->context.rbp) { + uint64_t caller_rbp = 0; + if (memory_->GetMemoryAtAddress(last_frame->context.rbp, &caller_rbp) && + caller_rbp > caller_rip_address) { + frame->context.rbp = caller_rbp; + frame->context_validity |= StackFrameAMD64::CONTEXT_VALID_RBP; + } + } else if (last_frame->context.rbp >= caller_rip_address + 8) { + // If the callee's %rbp is plausible as a value for the caller's + // %rbp, presume that the callee left it unchanged. + frame->context.rbp = last_frame->context.rbp; + frame->context_validity |= StackFrameAMD64::CONTEXT_VALID_RBP; + } + } + + return frame; +} + +StackFrame* StackwalkerAMD64::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + const vector& frames = *stack->frames(); + StackFrameAMD64* last_frame = static_cast(frames.back()); + scoped_ptr new_frame; + + // If we have CFI information, use it. + scoped_ptr cfi_frame_info( + frame_symbolizer_->FindCFIFrameInfo(last_frame)); + if (cfi_frame_info.get()) + new_frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get())); + + // If CFI was not available and this is a Windows x64 stack, check whether + // this is a leaf function which doesn't touch any callee-saved registers. + // According to https://reviews.llvm.org/D24748, LLVM doesn't generate unwind + // info for such functions. According to MSDN, leaf functions can be unwound + // simply by simulating a return. + if (!new_frame.get() && + last_frame->trust == StackFrame::FRAME_TRUST_CONTEXT && + system_info_->os_short == "windows") { + new_frame.reset(GetCallerBySimulatingReturn(frames)); + } + + // If CFI was not available or failed, try using frame pointer recovery. + // Never try to use frame pointer unwinding on Windows x64 stack. MSVC never + // generates code that works with frame pointer chasing, and LLVM does the + // same. Stack scanning would be better. + if (!new_frame.get() && system_info_->os_short != "windows") { + new_frame.reset(GetCallerByFramePointerRecovery(frames)); + } + + // If all else fails, fall back to stack scanning. + if (stack_scan_allowed && !new_frame.get()) { + new_frame.reset(GetCallerByStackScan(frames)); + } + + // If nothing worked, tell the caller. + if (!new_frame.get()) + return NULL; + + if (system_info_->os_short == "nacl") { + // Apply constraints from Native Client's x86-64 sandbox. These + // registers have the 4GB-aligned sandbox base address (from r15) + // added to them, and only the bottom 32 bits are relevant for + // stack walking. + new_frame->context.rip = static_cast(new_frame->context.rip); + new_frame->context.rsp = static_cast(new_frame->context.rsp); + new_frame->context.rbp = static_cast(new_frame->context.rbp); + } + + // Should we terminate the stack walk? (end-of-stack or broken invariant) + if (TerminateWalk(new_frame->context.rip, new_frame->context.rsp, + last_frame->context.rsp, + /*first_unwind=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + return NULL; + } + + // new_frame->context.rip is the return address, which is the instruction + // after the CALL that caused us to arrive at the callee. Set + // new_frame->instruction to one less than that, so it points within the + // CALL instruction. See StackFrame::instruction for details, and + // StackFrameAMD64::ReturnAddress. + new_frame->instruction = new_frame->context.rip - 1; + + return new_frame.release(); +} + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_amd64.h b/src/processor/stackwalker_amd64.h new file mode 100644 index 0000000..307f244 --- /dev/null +++ b/src/processor/stackwalker_amd64.h @@ -0,0 +1,112 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_amd64.h: amd64-specific stackwalker. +// +// Provides stack frames given amd64 register context and a memory region +// corresponding to a amd64 stack. +// +// Author: Mark Mentovai, Ted Mielczarek + + +#ifndef PROCESSOR_STACKWALKER_AMD64_H__ +#define PROCESSOR_STACKWALKER_AMD64_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/cfi_frame_info.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerAMD64 : public Stackwalker { + public: + // context is a amd64 context object that gives access to amd64-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerAMD64(const SystemInfo* system_info, + const MDRawContextAMD64* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + private: + // A STACK CFI-driven frame walker for the AMD64 + typedef SimpleCFIWalker CFIWalker; + + // Implementation of Stackwalker, using amd64 context (stack pointer in %rsp, + // stack base in %rbp) and stack conventions (saved stack pointer at 0(%rbp)) + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed); + + // Use cfi_frame_info (derived from STACK CFI records) to construct + // the frame that called frames.back(). The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameAMD64* GetCallerByCFIFrameInfo(const vector& frames, + CFIFrameInfo* cfi_frame_info); + + // Assumes a traditional frame layout where the frame pointer has not been + // omitted. The expectation is that caller's %rbp is pushed to the stack + // after the return address of the callee, and that the callee's %rsp can + // be used to find the pushed %rbp. + // Caller owns the returned frame object. Returns NULL on failure. + StackFrameAMD64* GetCallerByFramePointerRecovery( + const vector& frames); + + // Scan the stack for plausible return addresses. The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameAMD64* GetCallerByStackScan(const vector& frames); + + // Trying to simulate a return. The caller takes ownership of the returned + // frame. Return NULL on failure. + StackFrameAMD64* GetCallerBySimulatingReturn( + const vector& frames); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextAMD64* context_; + + // Our register map, for cfi_walker_. + static const CFIWalker::RegisterSet cfi_register_map_[]; + + // Our CFI frame walker. + const CFIWalker cfi_walker_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_AMD64_H__ diff --git a/src/processor/stackwalker_amd64_unittest.cc b/src/processor/stackwalker_amd64_unittest.cc new file mode 100644 index 0000000..88f6ef7 --- /dev/null +++ b/src/processor/stackwalker_amd64_unittest.cc @@ -0,0 +1,937 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// stackwalker_amd64_unittest.cc: Unit tests for StackwalkerAMD64 class. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/stackwalker_unittest_utils.h" +#include "processor/stackwalker_amd64.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::StackFrameSymbolizer; +using google_breakpad::StackFrame; +using google_breakpad::StackFrameAMD64; +using google_breakpad::Stackwalker; +using google_breakpad::StackwalkerAMD64; +using google_breakpad::SystemInfo; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using std::vector; +using testing::_; +using testing::AnyNumber; +using testing::DoAll; +using testing::Return; +using testing::SetArgumentPointee; +using testing::Test; + +class StackwalkerAMD64Fixture { + public: + StackwalkerAMD64Fixture() + : stack_section(kLittleEndian), + // Give the two modules reasonable standard locations and names + // for tests to play with. + module1(0x00007400c0000000ULL, 0x10000, "module1", "version1"), + module2(0x00007500b0000000ULL, 0x10000, "module2", "version2") { + // Identify the system as a Linux system. + system_info.os = "Linux"; + system_info.os_short = "linux"; + system_info.os_version = "Horrendous Hippo"; + system_info.cpu = "x86"; + system_info.cpu_info = ""; + + // Put distinctive values in the raw CPU context. + BrandContext(&raw_context); + + // Create some modules with some stock debugging information. + modules.Add(&module1); + modules.Add(&module2); + + // By default, none of the modules have symbol info; call + // SetModuleSymbols to override this. + EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _, _)) + .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND)); + + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + + // Reset max_frames_scanned since it's static. + Stackwalker::set_max_frames_scanned(1024); + } + + // Set the Breakpad symbol information that supplier should return for + // MODULE to INFO. + void SetModuleSymbols(MockCodeModule* module, const string& info) { + size_t buffer_size; + char *buffer = supplier.CopySymbolDataAndOwnTheCopy(info, &buffer_size); + EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _, _)) + .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer), + SetArgumentPointee<4>(buffer_size), + Return(MockSymbolSupplier::FOUND))); + } + + // Populate stack_region with the contents of stack_section. Use + // stack_section.start() as the region's starting address. + void RegionFromSection() { + string contents; + ASSERT_TRUE(stack_section.GetContents(&contents)); + stack_region.Init(stack_section.start().Value(), contents); + } + + // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking. + void BrandContext(MDRawContextAMD64 *raw_context) { + uint8_t x = 173; + for (size_t i = 0; i < sizeof(*raw_context); i++) + reinterpret_cast(raw_context)[i] = (x += 17); + } + + SystemInfo system_info; + MDRawContextAMD64 raw_context; + Section stack_section; + MockMemoryRegion stack_region; + MockCodeModule module1; + MockCodeModule module2; + MockCodeModules modules; + MockSymbolSupplier supplier; + BasicSourceLineResolver resolver; + CallStack call_stack; + const vector* frames; +}; + +class GetContextFrame: public StackwalkerAMD64Fixture, public Test { }; + +class SanityCheck: public StackwalkerAMD64Fixture, public Test { }; + +TEST_F(SanityCheck, NoResolver) { + // There should be no references to the stack in this walk: we don't + // provide any call frame information, so trying to reconstruct the + // context frame's caller should fail. So there's no need for us to + // provide stack contents. + raw_context.rip = 0x00007400c0000200ULL; + raw_context.rbp = 0x8000000080000000ULL; + + StackFrameSymbolizer frame_symbolizer(NULL, NULL); + StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + // This should succeed even without a resolver or supplier. + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_GE(1U, frames->size()); + StackFrameAMD64 *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +TEST_F(GetContextFrame, Simple) { + // There should be no references to the stack in this walk: we don't + // provide any call frame information, so trying to reconstruct the + // context frame's caller should fail. So there's no need for us to + // provide stack contents. + raw_context.rip = 0x00007400c0000200ULL; + raw_context.rbp = 0x8000000080000000ULL; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_GE(1U, frames->size()); + StackFrameAMD64 *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +// The stackwalker should be able to produce the context frame even +// without stack memory present. +TEST_F(GetContextFrame, NoStackMemory) { + raw_context.rip = 0x00007400c0000200ULL; + raw_context.rbp = 0x8000000080000000ULL; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAMD64 walker(&system_info, &raw_context, NULL, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_GE(1U, frames->size()); + StackFrameAMD64 *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetCallerFrame: public StackwalkerAMD64Fixture, public Test { }; + +TEST_F(GetCallerFrame, ScanWithoutSymbols) { + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + // Force scanning through three frames to ensure that the + // stack pointer is set properly in scan-recovered frames. + stack_section.start() = 0x8000000080000000ULL; + uint64_t return_address1 = 0x00007500b0000100ULL; + uint64_t return_address2 = 0x00007500b0000900ULL; + Label frame1_sp, frame2_sp, frame1_rbp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x00007400b0000000ULL) // junk that's not + .D64(0x00007500d0000000ULL) // a return address + + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) // space + + .D64(0x00007400b0000000ULL) // more junk + .D64(0x00007500d0000000ULL) + + .Mark(&frame1_rbp) + .D64(stack_section.start()) // This is in the right place to be + // a saved rbp, but it's bogus, so + // we shouldn't report it. + + .D64(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + + RegionFromSection(); + + raw_context.rip = 0x00007400c0000200ULL; + raw_context.rbp = frame1_rbp.Value(); + raw_context.rsp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameAMD64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameAMD64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP | + StackFrameAMD64::CONTEXT_VALID_RBP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.rip); + EXPECT_EQ(frame1_sp.Value(), frame1->context.rsp); + EXPECT_EQ(frame1_rbp.Value(), frame1->context.rbp); + + StackFrameAMD64 *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame2->trust); + ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP), + frame2->context_validity); + EXPECT_EQ(return_address2, frame2->context.rip); + EXPECT_EQ(frame2_sp.Value(), frame2->context.rsp); +} + +TEST_F(GetCallerFrame, ScanWithFunctionSymbols) { + // During stack scanning, if a potential return address + // is located within a loaded module that has symbols, + // it is only considered a valid return address if it + // lies within a function's bounds. + stack_section.start() = 0x8000000080000000ULL; + uint64_t return_address = 0x00007500b0000110ULL; + Label frame1_sp, frame1_rbp; + + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x00007400b0000000ULL) // junk that's not + .D64(0x00007500b0000000ULL) // a return address + + .D64(0x00007400c0001000ULL) // a couple of plausible addresses + .D64(0x00007500b000aaaaULL) // that are not within functions + + .D64(return_address) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(32, 0) // end of stack + .Mark(&frame1_rbp); + RegionFromSection(); + + raw_context.rip = 0x00007400c0000200ULL; + raw_context.rbp = frame1_rbp.Value(); + raw_context.rsp = stack_section.start().Value(); + + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 100 400 10 platypus\n"); + SetModuleSymbols(&module2, + // The calling frame's function. + "FUNC 100 400 10 echidna\n"); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameAMD64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ("platypus", frame0->function_name); + EXPECT_EQ(0x00007400c0000100ULL, frame0->function_base); + + StackFrameAMD64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP | + StackFrameAMD64::CONTEXT_VALID_RBP), + frame1->context_validity); + EXPECT_EQ(return_address, frame1->context.rip); + EXPECT_EQ(frame1_sp.Value(), frame1->context.rsp); + EXPECT_EQ(frame1_rbp.Value(), frame1->context.rbp); + EXPECT_EQ("echidna", frame1->function_name); + EXPECT_EQ(0x00007500b0000100ULL, frame1->function_base); +} + +// StackwalkerAMD64::GetCallerByFramePointerRecovery should never return an +// instruction pointer of 0 because IP of 0 is an end of stack marker and the +// stack walk may be terminated prematurely. Instead it should return NULL +// so that the stack walking code can proceed to stack scanning. +TEST_F(GetCallerFrame, GetCallerByFramePointerRecovery) { + MockCodeModule user32_dll(0x00007ff9cb8a0000ULL, 0x14E000, "user32.dll", + "version1"); + SetModuleSymbols(&user32_dll, // user32.dll + "PUBLIC fa60 0 DispatchMessageWorker\n" + "PUBLIC fee0 0 UserCallWinProcCheckWow\n" + "PUBLIC 1cdb0 0 _fnHkINLPMSG\n" + "STACK CFI INIT fa60 340 .cfa: $rsp .ra: .cfa 8 - ^\n" + "STACK CFI fa60 .cfa: $rsp 128 +\n" + "STACK CFI INIT fee0 49f .cfa: $rsp .ra: .cfa 8 - ^\n" + "STACK CFI fee0 .cfa: $rsp 240 +\n" + "STACK CFI INIT 1cdb0 9f .cfa: $rsp .ra: .cfa 8 - ^\n" + "STACK CFI 1cdb0 .cfa: $rsp 80 +\n"); + + // Create some modules with some stock debugging information. + MockCodeModules local_modules; + local_modules.Add(&user32_dll); + + Label frame0_rsp; + Label frame0_rbp; + Label frame1_rsp; + Label frame2_rsp; + + stack_section.start() = 0x00000099abf0f238ULL; + stack_section + .Mark(&frame0_rsp) + .D64(0x00007ff9cb8b00dcULL) + .Mark(&frame1_rsp) + .D64(0x0000000000000000ULL) + .D64(0x0000000000000001ULL) + .D64(0x00000099abf0f308ULL) + .D64(0x00007ff9cb8bce3aULL) // Stack residue from execution of + // user32!_fnHkINLPMSG+0x8a + .D64(0x000000000000c2e0ULL) + .D64(0x00000099abf0f328ULL) + .D64(0x0000000100000001ULL) + .D64(0x0000000000000000ULL) + .D64(0x0000000000000000ULL) + .D64(0x0000000000000000ULL) + .D64(0x0000000000000000ULL) + .D64(0x0000000000000000ULL) + .D64(0x0000000000000000ULL) + .D64(0x00007ff9ccad53e4ULL) + .D64(0x0000000000000048ULL) + .D64(0x0000000000000001ULL) + .D64(0x00000099abf0f5e0ULL) + .D64(0x00000099b61f7388ULL) + .D64(0x0000000000000030ULL) + .D64(0xffffff66540f0a1fULL) + .D64(0xffffff6649e08c77ULL) + .D64(0x00007ff9cb8affb4ULL) // Return address in + // user32!UserCallWinProcCheckWow+0xd4 + .D64(0x0000000000000000ULL) + .D64(0x00000099abf0f368ULL) + .D64(0x0000000000000000ULL) + .D64(0x0000000000000000ULL) + .D64(0x0000000000000000ULL) + .D64(0x00000099a8150fd8ULL) + .D64(0x00000099abf0f3e8ULL) + .D64(0x00007ff9cb8afc07ULL) // Return address in + // user32!DispatchMessageWorker+0x1a7 + .Mark(&frame2_rsp) + .Append(256, 0) + .Mark(&frame0_rbp) // The following are expected by + // GetCallerByFramePointerRecovery. + .D64(0xfffffffffffffffeULL) // %caller_rbp = *(%callee_rbp) + .D64(0x0000000000000000ULL) // %caller_rip = *(%callee_rbp + 8) + .D64(0x00000099a3e31040ULL) // %caller_rsp = *(%callee_rbp + 16) + .Append(256, 0); + + RegionFromSection(); + raw_context.rip = 0x00000099a8150fd8ULL; // IP in context frame is guarbage + raw_context.rsp = frame0_rsp.Value(); + raw_context.rbp = frame0_rbp.Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, + &local_modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + + ASSERT_EQ(3U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameAMD64 *frame = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame->trust); + ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame->context_validity); + EXPECT_EQ("", frame->function_name); + EXPECT_EQ(0x00000099a8150fd8ULL, frame->instruction); + EXPECT_EQ(0x00000099a8150fd8ULL, frame->context.rip); + EXPECT_EQ(frame0_rsp.Value(), frame->context.rsp); + EXPECT_EQ(frame0_rbp.Value(), frame->context.rbp); + } + + { // To avoid reusing locals by mistake + StackFrameAMD64 *frame = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame->trust); + ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP | + StackFrameAMD64::CONTEXT_VALID_RBP), + frame->context_validity); + EXPECT_EQ("UserCallWinProcCheckWow", frame->function_name); + EXPECT_EQ(140710838468828ULL, frame->instruction + 1); + EXPECT_EQ(140710838468828ULL, frame->context.rip); + EXPECT_EQ(frame1_rsp.Value(), frame->context.rsp); + EXPECT_EQ(&user32_dll, frame->module); + } + + { // To avoid reusing locals by mistake + StackFrameAMD64 *frame = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame->trust); + ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP | + StackFrameAMD64::CONTEXT_VALID_RBP), + frame->context_validity); + EXPECT_EQ("DispatchMessageWorker", frame->function_name); + EXPECT_EQ(140710838467591ULL, frame->instruction + 1); + EXPECT_EQ(140710838467591ULL, frame->context.rip); + EXPECT_EQ(frame2_rsp.Value(), frame->context.rsp); + EXPECT_EQ(&user32_dll, frame->module); + } +} + +// Don't use frame pointer recovery if %rbp is not 8-byte aligned, which +// indicates that it's not being used as a frame pointer. +TEST_F(GetCallerFrame, FramePointerNotAligned) { + stack_section.start() = 0x8000000080000000ULL; + uint64_t return_address1 = 0x00007500b0000100ULL; + Label frame0_rbp, not_frame1_rbp, frame1_sp; + stack_section + // frame 0 + .Align(8, 0) + .Append(2, 0) // mis-align the frame pointer + .Mark(&frame0_rbp) + .D64(not_frame1_rbp) // not the previous frame pointer + .D64(0x00007500b0000a00ULL) // plausible but wrong return address + .Align(8, 0) + .D64(return_address1) // return address + // frame 1 + .Mark(&frame1_sp) + .Mark(¬_frame1_rbp) + .Append(32, 0); // end of stack + + + RegionFromSection(); + + raw_context.rip = 0x00007400c0000200ULL; + raw_context.rbp = frame0_rbp.Value(); + raw_context.rsp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameAMD64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameAMD64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.rip); + EXPECT_EQ(frame1_sp.Value(), frame1->context.rsp); +} + +// Don't use frame pointer recovery if the recovered %rip is not +// a canonical x86-64 address. +TEST_F(GetCallerFrame, NonCanonicalInstructionPointerFromFramePointer) { + stack_section.start() = 0x8000000080000000ULL; + uint64_t return_address1 = 0x00007500b0000100ULL; + Label frame0_rbp, frame1_sp, not_frame1_bp; + stack_section + // frame 0 + .Align(8, 0) + .Mark(&frame0_rbp) + .D64(not_frame1_bp) // some junk on the stack + .D64(0xDADADADADADADADA) // not the return address + .D64(return_address1) // return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) + .Mark(¬_frame1_bp) + .Append(32, 0); // end of stack + + + RegionFromSection(); + + raw_context.rip = 0x00007400c0000200ULL; + raw_context.rbp = frame0_rbp.Value(); + raw_context.rsp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameAMD64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameAMD64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.rip); + EXPECT_EQ(frame1_sp.Value(), frame1->context.rsp); +} + +// Test that set_max_frames_scanned prevents using stack scanning +// to find caller frames. +TEST_F(GetCallerFrame, ScanningNotAllowed) { + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + stack_section.start() = 0x8000000080000000ULL; + uint64_t return_address1 = 0x00007500b0000100ULL; + uint64_t return_address2 = 0x00007500b0000900ULL; + Label frame1_sp, frame2_sp, frame1_rbp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x00007400b0000000ULL) // junk that's not + .D64(0x00007500d0000000ULL) // a return address + + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) // space + + .D64(0x00007400b0000000ULL) // more junk + .D64(0x00007500d0000000ULL) + + .Mark(&frame1_rbp) + .D64(stack_section.start()) // This is in the right place to be + // a saved rbp, but it's bogus, so + // we shouldn't report it. + + .D64(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + + RegionFromSection(); + + raw_context.rip = 0x00007400c0000200ULL; + raw_context.rbp = frame1_rbp.Value(); + raw_context.rsp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + Stackwalker::set_max_frames_scanned(0); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + + StackFrameAMD64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); +} + +TEST_F(GetCallerFrame, CallerPushedRBP) { + // Functions typically push their %rbp upon entry and set %rbp pointing + // there. If stackwalking finds a plausible address for the next frame's + // %rbp directly below the return address, assume that it is indeed the + // next frame's %rbp. + stack_section.start() = 0x8000000080000000ULL; + uint64_t return_address = 0x00007500b0000110ULL; + Label frame0_rbp, frame1_sp, frame1_rbp; + + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x00007400b0000000ULL) // junk that's not + .D64(0x00007500b0000000ULL) // a return address + + .D64(0x00007400c0001000ULL) // a couple of plausible addresses + .D64(0x00007500b000aaaaULL) // that are not within functions + + .Mark(&frame0_rbp) + .D64(frame1_rbp) // caller-pushed %rbp + .D64(return_address) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(32, 0) // body of frame1 + .Mark(&frame1_rbp) // end of stack + .D64(0); + RegionFromSection(); + + raw_context.rip = 0x00007400c0000200ULL; + raw_context.rbp = frame0_rbp.Value(); + raw_context.rsp = stack_section.start().Value(); + + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 100 400 10 sasquatch\n"); + SetModuleSymbols(&module2, + // The calling frame's function. + "FUNC 100 400 10 yeti\n"); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameAMD64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(frame0_rbp.Value(), frame0->context.rbp); + EXPECT_EQ("sasquatch", frame0->function_name); + EXPECT_EQ(0x00007400c0000100ULL, frame0->function_base); + + StackFrameAMD64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust); + ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP | + StackFrameAMD64::CONTEXT_VALID_RBP), + frame1->context_validity); + EXPECT_EQ(return_address, frame1->context.rip); + EXPECT_EQ(frame1_sp.Value(), frame1->context.rsp); + EXPECT_EQ(frame1_rbp.Value(), frame1->context.rbp); + EXPECT_EQ("yeti", frame1->function_name); + EXPECT_EQ(0x00007500b0000100ULL, frame1->function_base); +} + +struct CFIFixture: public StackwalkerAMD64Fixture { + CFIFixture() { + // Provide a bunch of STACK CFI records; we'll walk to the caller + // from every point in this series, expecting to find the same set + // of register values. + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 4000 1000 10 enchiridion\n" + // Initially, just a return address. + "STACK CFI INIT 4000 100 .cfa: $rsp 8 + .ra: .cfa 8 - ^\n" + // Push %rbx. + "STACK CFI 4001 .cfa: $rsp 16 + $rbx: .cfa 16 - ^\n" + // Save %r12 in %rbx. Weird, but permitted. + "STACK CFI 4002 $r12: $rbx\n" + // Allocate frame space, and save %r13. + "STACK CFI 4003 .cfa: $rsp 40 + $r13: .cfa 32 - ^\n" + // Put the return address in %r13. + "STACK CFI 4005 .ra: $r13\n" + // Save %rbp, and use it as a frame pointer. + "STACK CFI 4006 .cfa: $rbp 16 + $rbp: .cfa 24 - ^\n" + + // The calling function. + "FUNC 5000 1000 10 epictetus\n" + // Mark it as end of stack. + "STACK CFI INIT 5000 1000 .cfa: $rsp .ra 0\n"); + + // Provide some distinctive values for the caller's registers. + expected.rsp = 0x8000000080000000ULL; + expected.rip = 0x00007400c0005510ULL; + expected.rbp = 0x68995b1de4700266ULL; + expected.rbx = 0x5a5beeb38de23be8ULL; + expected.r12 = 0xed1b02e8cc0fc79cULL; + expected.r13 = 0x1d20ad8acacbe930ULL; + expected.r14 = 0xe94cffc2f7adaa28ULL; + expected.r15 = 0xb638d17d8da413b5ULL; + + // By default, registers are unchanged. + raw_context = expected; + } + + // Walk the stack, using stack_section as the contents of the stack + // and raw_context as the current register values. (Set + // raw_context.rsp to the stack's starting address.) Expect two + // stack frames; in the older frame, expect the callee-saves + // registers to have values matching those in 'expected'. + void CheckWalk() { + RegionFromSection(); + raw_context.rsp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameAMD64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ("enchiridion", frame0->function_name); + EXPECT_EQ(0x00007400c0004000ULL, frame0->function_base); + + StackFrameAMD64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP | + StackFrameAMD64::CONTEXT_VALID_RSP | + StackFrameAMD64::CONTEXT_VALID_RBP | + StackFrameAMD64::CONTEXT_VALID_RBX | + StackFrameAMD64::CONTEXT_VALID_R12 | + StackFrameAMD64::CONTEXT_VALID_R13 | + StackFrameAMD64::CONTEXT_VALID_R14 | + StackFrameAMD64::CONTEXT_VALID_R15), + frame1->context_validity); + EXPECT_EQ(expected.rip, frame1->context.rip); + EXPECT_EQ(expected.rsp, frame1->context.rsp); + EXPECT_EQ(expected.rbp, frame1->context.rbp); + EXPECT_EQ(expected.rbx, frame1->context.rbx); + EXPECT_EQ(expected.r12, frame1->context.r12); + EXPECT_EQ(expected.r13, frame1->context.r13); + EXPECT_EQ(expected.r14, frame1->context.r14); + EXPECT_EQ(expected.r15, frame1->context.r15); + EXPECT_EQ("epictetus", frame1->function_name); + } + + // The values we expect to find for the caller's registers. + MDRawContextAMD64 expected; +}; + +class CFI: public CFIFixture, public Test { }; + +TEST_F(CFI, At4000) { + Label frame1_rsp = expected.rsp; + stack_section + .D64(0x00007400c0005510ULL) // return address + .Mark(&frame1_rsp); // This effectively sets stack_section.start(). + raw_context.rip = 0x00007400c0004000ULL; + CheckWalk(); +} + +TEST_F(CFI, At4001) { + Label frame1_rsp = expected.rsp; + stack_section + .D64(0x5a5beeb38de23be8ULL) // saved %rbx + .D64(0x00007400c0005510ULL) // return address + .Mark(&frame1_rsp); // This effectively sets stack_section.start(). + raw_context.rip = 0x00007400c0004001ULL; + raw_context.rbx = 0xbe0487d2f9eafe29ULL; // callee's (distinct) %rbx value + CheckWalk(); +} + +TEST_F(CFI, At4002) { + Label frame1_rsp = expected.rsp; + stack_section + .D64(0x5a5beeb38de23be8ULL) // saved %rbx + .D64(0x00007400c0005510ULL) // return address + .Mark(&frame1_rsp); // This effectively sets stack_section.start(). + raw_context.rip = 0x00007400c0004002ULL; + raw_context.rbx = 0xed1b02e8cc0fc79cULL; // saved %r12 + raw_context.r12 = 0xb0118de918a4bceaULL; // callee's (distinct) %r12 value + CheckWalk(); +} + +TEST_F(CFI, At4003) { + Label frame1_rsp = expected.rsp; + stack_section + .D64(0x0e023828dffd4d81ULL) // garbage + .D64(0x1d20ad8acacbe930ULL) // saved %r13 + .D64(0x319e68b49e3ace0fULL) // garbage + .D64(0x5a5beeb38de23be8ULL) // saved %rbx + .D64(0x00007400c0005510ULL) // return address + .Mark(&frame1_rsp); // This effectively sets stack_section.start(). + raw_context.rip = 0x00007400c0004003ULL; + raw_context.rbx = 0xed1b02e8cc0fc79cULL; // saved %r12 + raw_context.r12 = 0x89d04fa804c87a43ULL; // callee's (distinct) %r12 + raw_context.r13 = 0x5118e02cbdb24b03ULL; // callee's (distinct) %r13 + CheckWalk(); +} + +// The results here should be the same as those at module offset 0x4003. +TEST_F(CFI, At4004) { + Label frame1_rsp = expected.rsp; + stack_section + .D64(0x0e023828dffd4d81ULL) // garbage + .D64(0x1d20ad8acacbe930ULL) // saved %r13 + .D64(0x319e68b49e3ace0fULL) // garbage + .D64(0x5a5beeb38de23be8ULL) // saved %rbx + .D64(0x00007400c0005510ULL) // return address + .Mark(&frame1_rsp); // This effectively sets stack_section.start(). + raw_context.rip = 0x00007400c0004004ULL; + raw_context.rbx = 0xed1b02e8cc0fc79cULL; // saved %r12 + raw_context.r12 = 0x89d04fa804c87a43ULL; // callee's (distinct) %r12 + raw_context.r13 = 0x5118e02cbdb24b03ULL; // callee's (distinct) %r13 + CheckWalk(); +} + +TEST_F(CFI, At4005) { + Label frame1_rsp = expected.rsp; + stack_section + .D64(0x4b516dd035745953ULL) // garbage + .D64(0x1d20ad8acacbe930ULL) // saved %r13 + .D64(0xa6d445e16ae3d872ULL) // garbage + .D64(0x5a5beeb38de23be8ULL) // saved %rbx + .D64(0xaa95fa054aedfbaeULL) // garbage + .Mark(&frame1_rsp); // This effectively sets stack_section.start(). + raw_context.rip = 0x00007400c0004005ULL; + raw_context.rbx = 0xed1b02e8cc0fc79cULL; // saved %r12 + raw_context.r12 = 0x46b1b8868891b34aULL; // callee's %r12 + raw_context.r13 = 0x00007400c0005510ULL; // return address + CheckWalk(); +} + +TEST_F(CFI, At4006) { + Label frame0_rbp; + Label frame1_rsp = expected.rsp; + stack_section + .D64(0x043c6dfceb91aa34ULL) // garbage + .D64(0x1d20ad8acacbe930ULL) // saved %r13 + .D64(0x68995b1de4700266ULL) // saved %rbp + .Mark(&frame0_rbp) // frame pointer points here + .D64(0x5a5beeb38de23be8ULL) // saved %rbx + .D64(0xf015ee516ad89eabULL) // garbage + .Mark(&frame1_rsp); // This effectively sets stack_section.start(). + raw_context.rip = 0x00007400c0004006ULL; + raw_context.rbp = frame0_rbp.Value(); + raw_context.rbx = 0xed1b02e8cc0fc79cULL; // saved %r12 + raw_context.r12 = 0x26e007b341acfebdULL; // callee's %r12 + raw_context.r13 = 0x00007400c0005510ULL; // return address + CheckWalk(); +} diff --git a/src/processor/stackwalker_arm.cc b/src/processor/stackwalker_arm.cc new file mode 100644 index 0000000..5f6f3e8 --- /dev/null +++ b/src/processor/stackwalker_arm.cc @@ -0,0 +1,302 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_arm.cc: arm-specific stackwalker. +// +// See stackwalker_arm.h for documentation. +// +// Author: Mark Mentovai, Ted Mielczarek, Jim Blandy + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/cfi_frame_info.h" +#include "processor/logging.h" +#include "processor/stackwalker_arm.h" + +namespace google_breakpad { + + +StackwalkerARM::StackwalkerARM(const SystemInfo* system_info, + const MDRawContextARM* context, + int fp_register, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* resolver_helper) + : Stackwalker(system_info, memory, modules, resolver_helper), + context_(context), fp_register_(fp_register), + context_frame_validity_(StackFrameARM::CONTEXT_VALID_ALL) { } + + +StackFrame* StackwalkerARM::GetContextFrame() { + if (!context_) { + BPLOG(ERROR) << "Can't get context frame without context"; + return NULL; + } + + StackFrameARM* frame = new StackFrameARM(); + + // The instruction pointer is stored directly in a register (r15), so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = context_frame_validity_; + frame->trust = StackFrame::FRAME_TRUST_CONTEXT; + frame->instruction = frame->context.iregs[MD_CONTEXT_ARM_REG_PC]; + + return frame; +} + +StackFrameARM* StackwalkerARM::GetCallerByCFIFrameInfo( + const vector& frames, + CFIFrameInfo* cfi_frame_info) { + StackFrameARM* last_frame = static_cast(frames.back()); + + static const char* register_names[] = { + "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", + "fps", "cpsr", + NULL + }; + + // Populate a dictionary with the valid register values in last_frame. + CFIFrameInfo::RegisterValueMap callee_registers; + for (int i = 0; register_names[i]; i++) + if (last_frame->context_validity & StackFrameARM::RegisterValidFlag(i)) + callee_registers[register_names[i]] = last_frame->context.iregs[i]; + + // Use the STACK CFI data to recover the caller's register values. + CFIFrameInfo::RegisterValueMap caller_registers; + if (!cfi_frame_info->FindCallerRegs(callee_registers, *memory_, + &caller_registers)) + return NULL; + + // Construct a new stack frame given the values the CFI recovered. + scoped_ptr frame(new StackFrameARM()); + for (int i = 0; register_names[i]; i++) { + CFIFrameInfo::RegisterValueMap::iterator entry = + caller_registers.find(register_names[i]); + if (entry != caller_registers.end()) { + // We recovered the value of this register; fill the context with the + // value from caller_registers. + frame->context_validity |= StackFrameARM::RegisterValidFlag(i); + frame->context.iregs[i] = entry->second; + } else if (4 <= i && i <= 11 && (last_frame->context_validity & + StackFrameARM::RegisterValidFlag(i))) { + // If the STACK CFI data doesn't mention some callee-saves register, and + // it is valid in the callee, assume the callee has not yet changed it. + // Registers r4 through r11 are callee-saves, according to the Procedure + // Call Standard for the ARM Architecture, which the Linux ABI follows. + frame->context_validity |= StackFrameARM::RegisterValidFlag(i); + frame->context.iregs[i] = last_frame->context.iregs[i]; + } + } + // If the CFI doesn't recover the PC explicitly, then use .ra. + if (!(frame->context_validity & StackFrameARM::CONTEXT_VALID_PC)) { + CFIFrameInfo::RegisterValueMap::iterator entry = + caller_registers.find(".ra"); + if (entry != caller_registers.end()) { + if (fp_register_ == -1) { + frame->context_validity |= StackFrameARM::CONTEXT_VALID_PC; + frame->context.iregs[MD_CONTEXT_ARM_REG_PC] = entry->second; + } else { + // The CFI updated the link register and not the program counter. + // Handle getting the program counter from the link register. + frame->context_validity |= StackFrameARM::CONTEXT_VALID_PC; + frame->context_validity |= StackFrameARM::CONTEXT_VALID_LR; + frame->context.iregs[MD_CONTEXT_ARM_REG_LR] = entry->second; + frame->context.iregs[MD_CONTEXT_ARM_REG_PC] = + last_frame->context.iregs[MD_CONTEXT_ARM_REG_LR]; + } + } + } + // If the CFI doesn't recover the SP explicitly, then use .cfa. + if (!(frame->context_validity & StackFrameARM::CONTEXT_VALID_SP)) { + CFIFrameInfo::RegisterValueMap::iterator entry = + caller_registers.find(".cfa"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameARM::CONTEXT_VALID_SP; + frame->context.iregs[MD_CONTEXT_ARM_REG_SP] = entry->second; + } + } + + // If we didn't recover the PC and the SP, then the frame isn't very useful. + static const int essentials = (StackFrameARM::CONTEXT_VALID_SP + | StackFrameARM::CONTEXT_VALID_PC); + if ((frame->context_validity & essentials) != essentials) + return NULL; + + frame->trust = StackFrame::FRAME_TRUST_CFI; + return frame.release(); +} + +StackFrameARM* StackwalkerARM::GetCallerByStackScan( + const vector& frames) { + StackFrameARM* last_frame = static_cast(frames.back()); + uint32_t last_sp = last_frame->context.iregs[MD_CONTEXT_ARM_REG_SP]; + uint32_t caller_sp, caller_pc; + + if (!ScanForReturnAddress(last_sp, &caller_sp, &caller_pc, + /*is_context_frame=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + // No plausible return address was found. + return NULL; + } + + // ScanForReturnAddress found a reasonable return address. Advance + // %sp to the location above the one where the return address was + // found. + caller_sp += 4; + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameARM* frame = new StackFrameARM(); + + frame->trust = StackFrame::FRAME_TRUST_SCAN; + frame->context = last_frame->context; + frame->context.iregs[MD_CONTEXT_ARM_REG_PC] = caller_pc; + frame->context.iregs[MD_CONTEXT_ARM_REG_SP] = caller_sp; + frame->context_validity = StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_SP; + + return frame; +} + +StackFrameARM* StackwalkerARM::GetCallerByFramePointer( + const vector& frames) { + StackFrameARM* last_frame = static_cast(frames.back()); + + if (!(last_frame->context_validity & + StackFrameARM::RegisterValidFlag(fp_register_))) { + return NULL; + } + + uint32_t last_fp = last_frame->context.iregs[fp_register_]; + + uint32_t caller_fp = 0; + if (last_fp && !memory_->GetMemoryAtAddress(last_fp, &caller_fp)) { + BPLOG(ERROR) << "Unable to read caller_fp from last_fp: 0x" + << std::hex << last_fp; + return NULL; + } + + uint32_t caller_lr = 0; + if (last_fp && !memory_->GetMemoryAtAddress(last_fp + 4, &caller_lr)) { + BPLOG(ERROR) << "Unable to read caller_lr from last_fp + 4: 0x" + << std::hex << (last_fp + 4); + return NULL; + } + + uint32_t caller_sp = last_fp ? last_fp + 8 : + last_frame->context.iregs[MD_CONTEXT_ARM_REG_SP]; + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameARM* frame = new StackFrameARM(); + + frame->trust = StackFrame::FRAME_TRUST_FP; + frame->context = last_frame->context; + frame->context.iregs[fp_register_] = caller_fp; + frame->context.iregs[MD_CONTEXT_ARM_REG_SP] = caller_sp; + frame->context.iregs[MD_CONTEXT_ARM_REG_PC] = + last_frame->context.iregs[MD_CONTEXT_ARM_REG_LR]; + frame->context.iregs[MD_CONTEXT_ARM_REG_LR] = caller_lr; + frame->context_validity = StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_LR | + StackFrameARM::RegisterValidFlag(fp_register_) | + StackFrameARM::CONTEXT_VALID_SP; + return frame; +} + +StackFrame* StackwalkerARM::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + const vector& frames = *stack->frames(); + StackFrameARM* last_frame = static_cast(frames.back()); + scoped_ptr frame; + + // See if there is DWARF call frame information covering this address. + // TODO(jperaza): Ignore iOS CFI info until it is properly collected. + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=764 + if (!system_info_ || system_info_->os != "iOS") { + scoped_ptr cfi_frame_info( + frame_symbolizer_->FindCFIFrameInfo(last_frame)); + if (cfi_frame_info.get()) + frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get())); + } + + // If CFI failed, or there wasn't CFI available, fall back + // to frame pointer, if this is configured. + if (fp_register_ >= 0 && !frame.get()) + frame.reset(GetCallerByFramePointer(frames)); + + // If everuthing failed, fall back to stack scanning. + if (stack_scan_allowed && !frame.get()) + frame.reset(GetCallerByStackScan(frames)); + + // If nothing worked, tell the caller. + if (!frame.get()) + return NULL; + + // Should we terminate the stack walk? (end-of-stack or broken invariant) + if (TerminateWalk(frame->context.iregs[MD_CONTEXT_ARM_REG_PC], + frame->context.iregs[MD_CONTEXT_ARM_REG_SP], + last_frame->context.iregs[MD_CONTEXT_ARM_REG_SP], + /*first_unwind=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + return NULL; + } + + // The new frame's context's PC is the return address, which is one + // instruction past the instruction that caused us to arrive at the + // callee. Set new_frame->instruction to one less than the PC. This won't + // reference the beginning of the call instruction, but it's at least + // within it, which is sufficient to get the source line information to + // match up with the line that contains the function call. Callers that + // require the exact return address value may access + // frame->context.iregs[MD_CONTEXT_ARM_REG_PC]. + frame->instruction = frame->context.iregs[MD_CONTEXT_ARM_REG_PC] - 2; + + return frame.release(); +} + + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_arm.h b/src/processor/stackwalker_arm.h new file mode 100644 index 0000000..d95b4e3 --- /dev/null +++ b/src/processor/stackwalker_arm.h @@ -0,0 +1,106 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_arm.h: arm-specific stackwalker. +// +// Provides stack frames given arm register context and a memory region +// corresponding to an arm stack. +// +// Author: Mark Mentovai, Ted Mielczarek + + +#ifndef PROCESSOR_STACKWALKER_ARM_H__ +#define PROCESSOR_STACKWALKER_ARM_H__ + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerARM : public Stackwalker { + public: + // context is an arm context object that gives access to arm-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerARM(const SystemInfo* system_info, + const MDRawContextARM* context, + int fp_register, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + // Change the context validity mask of the frame returned by + // GetContextFrame to VALID. This is only for use by unit tests; the + // default behavior is correct for all application code. + void SetContextFrameValidity(int valid) { context_frame_validity_ = valid; } + + private: + // Implementation of Stackwalker, using arm context and stack conventions. + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed); + + // Use cfi_frame_info (derived from STACK CFI records) to construct + // the frame that called frames.back(). The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameARM* GetCallerByCFIFrameInfo(const vector& frames, + CFIFrameInfo* cfi_frame_info); + + // Use the frame pointer. The caller takes ownership of the returned frame. + // Return NULL on failure. + StackFrameARM* GetCallerByFramePointer(const vector& frames); + + // Scan the stack for plausible return addresses. The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameARM* GetCallerByStackScan(const vector& frames); + + // Stores the CPU context corresponding to the youngest stack frame, to + // be returned by GetContextFrame. + const MDRawContextARM* context_; + + // The register to use a as frame pointer. The value is -1 if frame pointer + // cannot be used. + int fp_register_; + + // Validity mask for youngest stack frame. This is always + // CONTEXT_VALID_ALL in real use; it is only changeable for the sake of + // unit tests. + int context_frame_validity_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_ARM_H__ diff --git a/src/processor/stackwalker_arm64.cc b/src/processor/stackwalker_arm64.cc new file mode 100644 index 0000000..0fa02e0 --- /dev/null +++ b/src/processor/stackwalker_arm64.cc @@ -0,0 +1,357 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_arm64.cc: arm64-specific stackwalker. +// +// See stackwalker_arm64.h for documentation. +// +// Author: Mark Mentovai, Ted Mielczarek, Jim Blandy, Colin Blundell + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/cfi_frame_info.h" +#include "processor/logging.h" +#include "processor/stackwalker_arm64.h" + +namespace google_breakpad { + + +StackwalkerARM64::StackwalkerARM64(const SystemInfo* system_info, + const MDRawContextARM64* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* resolver_helper) + : Stackwalker(system_info, memory, modules, resolver_helper), + context_(context), + context_frame_validity_(StackFrameARM64::CONTEXT_VALID_ALL), + address_range_mask_(0xffffffffffffffff) { + if (modules && modules->module_count() > 0) { + // ARM64 supports storing pointer authentication codes in the upper bits of + // a pointer. Make a best guess at the range of valid addresses based on the + // range of loaded modules. + const CodeModule *high_module = + modules->GetModuleAtSequence(modules->module_count() - 1); + uint64_t mask = high_module->base_address() + high_module->size(); + mask |= mask >> 1; + mask |= mask >> 2; + mask |= mask >> 4; + mask |= mask >> 8; + mask |= mask >> 16; + mask |= mask >> 32; + address_range_mask_ = mask; + } +} + +uint64_t StackwalkerARM64::PtrauthStrip(uint64_t ptr) { + uint64_t stripped = ptr & address_range_mask_; + return modules_ && modules_->GetModuleForAddress(stripped) ? stripped : ptr; +} + +StackFrame* StackwalkerARM64::GetContextFrame() { + if (!context_) { + BPLOG(ERROR) << "Can't get context frame without context"; + return NULL; + } + + StackFrameARM64* frame = new StackFrameARM64(); + + // The instruction pointer is stored directly in a register (x32), so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = context_frame_validity_; + frame->trust = StackFrame::FRAME_TRUST_CONTEXT; + frame->instruction = frame->context.iregs[MD_CONTEXT_ARM64_REG_PC]; + frame->context.iregs[MD_CONTEXT_ARM64_REG_LR] = + PtrauthStrip(frame->context.iregs[MD_CONTEXT_ARM64_REG_LR]); + + return frame; +} + +StackFrameARM64* StackwalkerARM64::GetCallerByCFIFrameInfo( + const vector& frames, + CFIFrameInfo* cfi_frame_info) { + StackFrameARM64* last_frame = static_cast(frames.back()); + + static const char* register_names[] = { + "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", + "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", + "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", + "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", + "pc", NULL + }; + + // Populate a dictionary with the valid register values in last_frame. + CFIFrameInfo::RegisterValueMap callee_registers; + for (int i = 0; register_names[i]; i++) { + if (last_frame->context_validity & StackFrameARM64::RegisterValidFlag(i)) + callee_registers[register_names[i]] = last_frame->context.iregs[i]; + } + + // Use the STACK CFI data to recover the caller's register values. + CFIFrameInfo::RegisterValueMap caller_registers; + if (!cfi_frame_info->FindCallerRegs(callee_registers, *memory_, + &caller_registers)) { + return NULL; + } + // Construct a new stack frame given the values the CFI recovered. + scoped_ptr frame(new StackFrameARM64()); + for (int i = 0; register_names[i]; i++) { + CFIFrameInfo::RegisterValueMap::iterator entry = + caller_registers.find(register_names[i]); + if (entry != caller_registers.end()) { + // We recovered the value of this register; fill the context with the + // value from caller_registers. + frame->context_validity |= StackFrameARM64::RegisterValidFlag(i); + frame->context.iregs[i] = entry->second; + } else if (19 <= i && i <= 29 && (last_frame->context_validity & + StackFrameARM64::RegisterValidFlag(i))) { + // If the STACK CFI data doesn't mention some callee-saves register, and + // it is valid in the callee, assume the callee has not yet changed it. + // Registers r19 through r29 are callee-saves, according to the Procedure + // Call Standard for the ARM AARCH64 Architecture, which the Linux ABI + // follows. + frame->context_validity |= StackFrameARM64::RegisterValidFlag(i); + frame->context.iregs[i] = last_frame->context.iregs[i]; + } + } + // If the CFI doesn't recover the PC explicitly, then use .ra. + if (!(frame->context_validity & StackFrameARM64::CONTEXT_VALID_PC)) { + CFIFrameInfo::RegisterValueMap::iterator entry = + caller_registers.find(".ra"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameARM64::CONTEXT_VALID_PC; + frame->context.iregs[MD_CONTEXT_ARM64_REG_PC] = entry->second; + } + } + // If the CFI doesn't recover the SP explicitly, then use .cfa. + if (!(frame->context_validity & StackFrameARM64::CONTEXT_VALID_SP)) { + CFIFrameInfo::RegisterValueMap::iterator entry = + caller_registers.find(".cfa"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameARM64::CONTEXT_VALID_SP; + frame->context.iregs[MD_CONTEXT_ARM64_REG_SP] = entry->second; + } + } + + // If we didn't recover the PC and the SP, then the frame isn't very useful. + static const uint64_t essentials = (StackFrameARM64::CONTEXT_VALID_SP + | StackFrameARM64::CONTEXT_VALID_PC); + if ((frame->context_validity & essentials) != essentials) + return NULL; + + frame->context.iregs[MD_CONTEXT_ARM64_REG_PC] = + PtrauthStrip(frame->context.iregs[MD_CONTEXT_ARM64_REG_PC]); + frame->trust = StackFrame::FRAME_TRUST_CFI; + return frame.release(); +} + +StackFrameARM64* StackwalkerARM64::GetCallerByStackScan( + const vector& frames) { + StackFrameARM64* last_frame = static_cast(frames.back()); + uint64_t last_sp = last_frame->context.iregs[MD_CONTEXT_ARM64_REG_SP]; + uint64_t caller_sp, caller_pc; + + if (!ScanForReturnAddress(last_sp, &caller_sp, &caller_pc, + /*is_context_frame=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + // No plausible return address was found. + return NULL; + } + + // ScanForReturnAddress found a reasonable return address. Advance + // %sp to the location above the one where the return address was + // found. + caller_sp += 8; + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameARM64* frame = new StackFrameARM64(); + + frame->trust = StackFrame::FRAME_TRUST_SCAN; + frame->context = last_frame->context; + frame->context.iregs[MD_CONTEXT_ARM64_REG_PC] = caller_pc; + frame->context.iregs[MD_CONTEXT_ARM64_REG_SP] = caller_sp; + frame->context_validity = StackFrameARM64::CONTEXT_VALID_PC | + StackFrameARM64::CONTEXT_VALID_SP; + + return frame; +} + +StackFrameARM64* StackwalkerARM64::GetCallerByFramePointer( + const vector& frames) { + StackFrameARM64* last_frame = static_cast(frames.back()); + if (!(last_frame->context_validity & StackFrameARM64::CONTEXT_VALID_LR)) { + CorrectRegLRByFramePointer(frames, last_frame); + } + + uint64_t last_fp = last_frame->context.iregs[MD_CONTEXT_ARM64_REG_FP]; + + uint64_t caller_fp = 0; + if (last_fp && !memory_->GetMemoryAtAddress(last_fp, &caller_fp)) { + BPLOG(ERROR) << "Unable to read caller_fp from last_fp: 0x" + << std::hex << last_fp; + return NULL; + } + + uint64_t caller_lr = 0; + if (last_fp && !memory_->GetMemoryAtAddress(last_fp + 8, &caller_lr)) { + BPLOG(ERROR) << "Unable to read caller_lr from last_fp + 8: 0x" + << std::hex << (last_fp + 8); + return NULL; + } + + caller_lr = PtrauthStrip(caller_lr); + + uint64_t caller_sp = last_fp ? last_fp + 16 : + last_frame->context.iregs[MD_CONTEXT_ARM64_REG_SP]; + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameARM64* frame = new StackFrameARM64(); + + frame->trust = StackFrame::FRAME_TRUST_FP; + frame->context = last_frame->context; + frame->context.iregs[MD_CONTEXT_ARM64_REG_FP] = caller_fp; + frame->context.iregs[MD_CONTEXT_ARM64_REG_SP] = caller_sp; + frame->context.iregs[MD_CONTEXT_ARM64_REG_PC] = + last_frame->context.iregs[MD_CONTEXT_ARM64_REG_LR]; + frame->context.iregs[MD_CONTEXT_ARM64_REG_LR] = caller_lr; + frame->context_validity = StackFrameARM64::CONTEXT_VALID_PC | + StackFrameARM64::CONTEXT_VALID_LR | + StackFrameARM64::CONTEXT_VALID_FP | + StackFrameARM64::CONTEXT_VALID_SP; + return frame; +} + +void StackwalkerARM64::CorrectRegLRByFramePointer( + const vector& frames, + StackFrameARM64* last_frame) { + // Need at least two frames to correct and + // register $FP should always be greater than register $SP. + if (frames.size() < 2 || !last_frame || + last_frame->context.iregs[MD_CONTEXT_ARM64_REG_FP] <= + last_frame->context.iregs[MD_CONTEXT_ARM64_REG_SP]) + return; + + // Searching for a real callee frame. Skipping inline frames since they + // don't contain context (and cannot be downcasted to StackFrameARM64). + size_t last_frame_callee_id = frames.size() - 2; + while (last_frame_callee_id >= 0 && frames[last_frame_callee_id]->trust == + StackFrame::FRAME_TRUST_INLINE) { + last_frame_callee_id--; + } + if (last_frame_callee_id < 0) return; + StackFrameARM64* last_frame_callee = + static_cast(frames[last_frame_callee_id]); + + uint64_t last_frame_callee_fp = + last_frame_callee->context.iregs[MD_CONTEXT_ARM64_REG_FP]; + + uint64_t last_fp = 0; + if (last_frame_callee_fp && + !memory_->GetMemoryAtAddress(last_frame_callee_fp, &last_fp)) { + BPLOG(ERROR) << "Unable to read last_fp from last_last_fp: 0x" << std::hex + << last_frame_callee_fp; + return; + } + // Give up if STACK CFI doesn't agree with frame pointer. + if (last_frame->context.iregs[MD_CONTEXT_ARM64_REG_FP] != last_fp) + return; + + uint64_t last_lr = 0; + if (last_frame_callee_fp && + !memory_->GetMemoryAtAddress(last_frame_callee_fp + 8, &last_lr)) { + BPLOG(ERROR) << "Unable to read last_lr from (last_last_fp + 8): 0x" + << std::hex << (last_frame_callee_fp + 8); + return; + } + last_lr = PtrauthStrip(last_lr); + + last_frame->context.iregs[MD_CONTEXT_ARM64_REG_LR] = last_lr; +} + +StackFrame* StackwalkerARM64::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + const vector& frames = *stack->frames(); + StackFrameARM64* last_frame = static_cast(frames.back()); + scoped_ptr frame; + + // See if there is DWARF call frame information covering this address. + scoped_ptr cfi_frame_info( + frame_symbolizer_->FindCFIFrameInfo(last_frame)); + if (cfi_frame_info.get()) + frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get())); + + // If CFI failed, or there wasn't CFI available, fall back to frame pointer. + if (!frame.get()) + frame.reset(GetCallerByFramePointer(frames)); + + // If everything failed, fall back to stack scanning. + if (stack_scan_allowed && !frame.get()) + frame.reset(GetCallerByStackScan(frames)); + + // If nothing worked, tell the caller. + if (!frame.get()) + return NULL; + + // Should we terminate the stack walk? (end-of-stack or broken invariant) + if (TerminateWalk(frame->context.iregs[MD_CONTEXT_ARM64_REG_PC], + frame->context.iregs[MD_CONTEXT_ARM64_REG_SP], + last_frame->context.iregs[MD_CONTEXT_ARM64_REG_SP], + /*first_unwind=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + return NULL; + } + + // The new frame's context's PC is the return address, which is one + // instruction past the instruction that caused us to arrive at the callee. + // ARM64 instructions have a uniform 4-byte encoding, so subtracting 4 off + // the return address gets back to the beginning of the call instruction. + // Callers that require the exact return address value may access + // frame->context.iregs[MD_CONTEXT_ARM64_REG_PC]. + frame->instruction = frame->context.iregs[MD_CONTEXT_ARM64_REG_PC] - 4; + + return frame.release(); +} + + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_arm64.h b/src/processor/stackwalker_arm64.h new file mode 100644 index 0000000..193ab30 --- /dev/null +++ b/src/processor/stackwalker_arm64.h @@ -0,0 +1,117 @@ +// -*- mode: C++ -*- + +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_arm64.h: arm64-specific stackwalker. +// +// Provides stack frames given arm64 register context and a memory region +// corresponding to an arm64 stack. +// +// Author: Mark Mentovai, Ted Mielczarek, Colin Blundell + + +#ifndef PROCESSOR_STACKWALKER_ARM64_H__ +#define PROCESSOR_STACKWALKER_ARM64_H__ + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerARM64 : public Stackwalker { + public: + // context is an arm64 context object that gives access to arm64-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerARM64(const SystemInfo* system_info, + const MDRawContextARM64* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + // Change the context validity mask of the frame returned by + // GetContextFrame to VALID. This is only for use by unit tests; the + // default behavior is correct for all application code. + void SetContextFrameValidity(uint64_t valid) { + context_frame_validity_ = valid; + } + + private: + // Strip pointer authentication codes from an address. + uint64_t PtrauthStrip(uint64_t ptr); + + // Implementation of Stackwalker, using arm64 context and stack conventions. + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed); + + // Use cfi_frame_info (derived from STACK CFI records) to construct + // the frame that called frames.back(). The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameARM64* GetCallerByCFIFrameInfo(const vector& frames, + CFIFrameInfo* cfi_frame_info); + + // Use the frame pointer. The caller takes ownership of the returned frame. + // Return NULL on failure. + StackFrameARM64* GetCallerByFramePointer(const vector& frames); + + // Scan the stack for plausible return addresses. The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameARM64* GetCallerByStackScan(const vector& frames); + + // GetCallerByFramePointer() depends on the previous frame having recovered + // x30($LR) which may not have been done when using CFI. + // This function recovers $LR in the previous frame by using the frame-pointer + // two frames back to read it from the stack. + void CorrectRegLRByFramePointer(const vector& frames, + StackFrameARM64* last_frame); + + // Stores the CPU context corresponding to the youngest stack frame, to + // be returned by GetContextFrame. + const MDRawContextARM64* context_; + + // Validity mask for youngest stack frame. This is always + // CONTEXT_VALID_ALL in real use; it is only changeable for the sake of + // unit tests. + uint64_t context_frame_validity_; + + // A mask of the valid address bits, determined from the address range of + // modules_. + uint64_t address_range_mask_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_ARM64_H__ diff --git a/src/processor/stackwalker_arm64_unittest.cc b/src/processor/stackwalker_arm64_unittest.cc new file mode 100644 index 0000000..f302d7d --- /dev/null +++ b/src/processor/stackwalker_arm64_unittest.cc @@ -0,0 +1,884 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// stackwalker_arm64_unittest.cc: Unit tests for StackwalkerARM64 class. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/stackwalker_unittest_utils.h" +#include "processor/stackwalker_arm64.h" +#include "processor/windows_frame_info.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::StackFrameSymbolizer; +using google_breakpad::StackFrame; +using google_breakpad::StackFrameARM64; +using google_breakpad::Stackwalker; +using google_breakpad::StackwalkerARM64; +using google_breakpad::SystemInfo; +using google_breakpad::WindowsFrameInfo; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using std::vector; +using testing::_; +using testing::AnyNumber; +using testing::DoAll; +using testing::Return; +using testing::SetArgumentPointee; +using testing::Test; + +class StackwalkerARM64Fixture { + public: + StackwalkerARM64Fixture() + : stack_section(kLittleEndian), + // Give the two modules reasonable standard locations and names + // for tests to play with. + module1(0x40000000, 0x10000, "module1", "version1"), + module2(0x50000000, 0x10000, "module2", "version2") { + // Identify the system as an iOS system. + system_info.os = "iOS"; + system_info.os_short = "ios"; + system_info.cpu = "arm64"; + system_info.cpu_info = ""; + + // Put distinctive values in the raw CPU context. + BrandContext(&raw_context); + + // Create some modules with some stock debugging information. + modules.Add(&module1); + modules.Add(&module2); + + // By default, none of the modules have symbol info; call + // SetModuleSymbols to override this. + EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _, _)) + .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND)); + + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + + // Reset max_frames_scanned since it's static. + Stackwalker::set_max_frames_scanned(1024); + } + + // Set the Breakpad symbol information that supplier should return for + // MODULE to INFO. + void SetModuleSymbols(MockCodeModule* module, const string& info) { + size_t buffer_size; + char *buffer = supplier.CopySymbolDataAndOwnTheCopy(info, &buffer_size); + EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _, _)) + .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer), + SetArgumentPointee<4>(buffer_size), + Return(MockSymbolSupplier::FOUND))); + } + + // Populate stack_region with the contents of stack_section. Use + // stack_section.start() as the region's starting address. + void RegionFromSection() { + string contents; + ASSERT_TRUE(stack_section.GetContents(&contents)); + stack_region.Init(stack_section.start().Value(), contents); + } + + // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking. + void BrandContext(MDRawContextARM64 *raw_context) { + uint8_t x = 173; + for (size_t i = 0; i < sizeof(*raw_context); i++) + reinterpret_cast(raw_context)[i] = (x += 17); + } + + SystemInfo system_info; + MDRawContextARM64 raw_context; + Section stack_section; + MockMemoryRegion stack_region; + MockCodeModule module1; + MockCodeModule module2; + MockCodeModules modules; + MockSymbolSupplier supplier; + BasicSourceLineResolver resolver; + CallStack call_stack; + const vector* frames; +}; + +class SanityCheck: public StackwalkerARM64Fixture, public Test { }; + +TEST_F(SanityCheck, NoResolver) { + // Since the context's frame pointer is garbage, the stack walk will end after + // the first frame. + StackFrameSymbolizer frame_symbolizer(NULL, NULL); + StackwalkerARM64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + // This should succeed even without a resolver or supplier. + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameARM64 *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetContextFrame: public StackwalkerARM64Fixture, public Test { }; + +// The stackwalker should be able to produce the context frame even +// without stack memory present. +TEST_F(GetContextFrame, NoStackMemory) { + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM64 walker(&system_info, &raw_context, NULL, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameARM64 *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetCallerFrame: public StackwalkerARM64Fixture, public Test { }; + +TEST_F(GetCallerFrame, ScanWithoutSymbols) { + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + // Force scanning through three frames to ensure that the + // stack pointer is set properly in scan-recovered frames. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x40090000) // junk that's not + .D64(0x60000000) // a return address + + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) // space + + .D64(0xF0000000) // more junk + .D64(0x0000000D) + + .D64(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x40005510; + raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameARM64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM64::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameARM64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameARM64::CONTEXT_VALID_PC | + StackFrameARM64::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.iregs[MD_CONTEXT_ARM64_REG_PC]); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM64_REG_SP]); + + StackFrameARM64 *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame2->trust); + ASSERT_EQ((StackFrameARM64::CONTEXT_VALID_PC | + StackFrameARM64::CONTEXT_VALID_SP), + frame2->context_validity); + EXPECT_EQ(return_address2, frame2->context.iregs[MD_CONTEXT_ARM64_REG_PC]); + EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_ARM64_REG_SP]); +} + +TEST_F(GetCallerFrame, ScanWithFunctionSymbols) { + // During stack scanning, if a potential return address + // is located within a loaded module that has symbols, + // it is only considered a valid return address if it + // lies within a function's bounds. + stack_section.start() = 0x80000000; + uint64_t return_address = 0x50000200; + Label frame1_sp; + + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x40090000) // junk that's not + .D64(0x60000000) // a return address + + .D64(0x40001000) // a couple of plausible addresses + .D64(0x5000F000) // that are not within functions + + .D64(return_address) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x40000200; + raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = stack_section.start().Value(); + + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 100 400 10 monotreme\n"); + SetModuleSymbols(&module2, + // The calling frame's function. + "FUNC 100 400 10 marsupial\n"); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameARM64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM64::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + EXPECT_EQ("monotreme", frame0->function_name); + EXPECT_EQ(0x40000100ULL, frame0->function_base); + + StackFrameARM64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameARM64::CONTEXT_VALID_PC | + StackFrameARM64::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address, frame1->context.iregs[MD_CONTEXT_ARM64_REG_PC]); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM64_REG_SP]); + EXPECT_EQ("marsupial", frame1->function_name); + EXPECT_EQ(0x50000100ULL, frame1->function_base); +} + +TEST_F(GetCallerFrame, ScanFirstFrame) { + // If the stackwalker resorts to stack scanning, it will scan much + // farther to find the caller of the context frame. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(32, 0) // space + + .D64(0x40090000) // junk that's not + .D64(0x60000000) // a return address + + .Append(96, 0) // more space + + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(32, 0) // space + + .D64(0xF0000000) // more junk + .D64(0x0000000D) + + .Append(336, 0) // more space + + .D64(return_address2) // actual return address + // (won't be found) + // frame 2 + .Mark(&frame2_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x40005510; + raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameARM64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM64::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameARM64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameARM64::CONTEXT_VALID_PC | + StackFrameARM64::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.iregs[MD_CONTEXT_ARM64_REG_PC]); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM64_REG_SP]); +} + +// Test that set_max_frames_scanned prevents using stack scanning +// to find caller frames. +TEST_F(GetCallerFrame, ScanningNotAllowed) { + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x40090000) // junk that's not + .D64(0x60000000) // a return address + + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) // space + + .D64(0xF0000000) // more junk + .D64(0x0000000D) + + .D64(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x40005510; + raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + Stackwalker::set_max_frames_scanned(0); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + + StackFrameARM64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM64::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); +} + +class GetFramesByFramePointer: public StackwalkerARM64Fixture, public Test { }; + +TEST_F(GetFramesByFramePointer, OnlyFramePointer) { + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + Label frame1_fp, frame2_fp; + stack_section + // frame 0 + .Append(64, 0) // Whatever values on the stack. + .D64(0x0000000D) // junk that's not + .D64(0xF0000000) // a return address. + + .Mark(&frame1_fp) // Next fp will point to the next value. + .D64(frame2_fp) // Save current frame pointer. + .D64(return_address2) // Save current link register. + .Mark(&frame1_sp) + + // frame 1 + .Append(64, 0) // Whatever values on the stack. + .D64(0x0000000D) // junk that's not + .D64(0xF0000000) // a return address. + + .Mark(&frame2_fp) + .D64(0) + .D64(0) + .Mark(&frame2_sp) + + // frame 2 + .Append(64, 0) // Whatever values on the stack. + .D64(0x0000000D) // junk that's not + .D64(0xF0000000); // a return address. + RegionFromSection(); + + + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x40005510; + raw_context.iregs[MD_CONTEXT_ARM64_REG_LR] = return_address1; + raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = frame1_fp.Value(); + raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM64 walker(&system_info, &raw_context, + &stack_region, &modules, &frame_symbolizer); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameARM64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM64::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameARM64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust); + ASSERT_EQ((StackFrameARM64::CONTEXT_VALID_PC | + StackFrameARM64::CONTEXT_VALID_LR | + StackFrameARM64::CONTEXT_VALID_FP | + StackFrameARM64::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.iregs[MD_CONTEXT_ARM64_REG_PC]); + EXPECT_EQ(return_address2, frame1->context.iregs[MD_CONTEXT_ARM64_REG_LR]); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM64_REG_SP]); + EXPECT_EQ(frame2_fp.Value(), + frame1->context.iregs[MD_CONTEXT_ARM64_REG_FP]); + + StackFrameARM64 *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame2->trust); + ASSERT_EQ((StackFrameARM64::CONTEXT_VALID_PC | + StackFrameARM64::CONTEXT_VALID_LR | + StackFrameARM64::CONTEXT_VALID_FP | + StackFrameARM64::CONTEXT_VALID_SP), + frame2->context_validity); + EXPECT_EQ(return_address2, frame2->context.iregs[MD_CONTEXT_ARM64_REG_PC]); + EXPECT_EQ(0U, frame2->context.iregs[MD_CONTEXT_ARM64_REG_LR]); + EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_ARM64_REG_SP]); + EXPECT_EQ(0U, frame2->context.iregs[MD_CONTEXT_ARM64_REG_FP]); +} + +struct CFIFixture: public StackwalkerARM64Fixture { + CFIFixture() { + // Provide a bunch of STACK CFI records; we'll walk to the caller + // from every point in this series, expecting to find the same set + // of register values. + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 4000 1000 10 enchiridion\n" + // Initially, nothing has been pushed on the stack, + // and the return address is still in the link + // register (x30). + "STACK CFI INIT 4000 100 .cfa: sp 0 + .ra: x30\n" + // Push x19, x20, the frame pointer and the link register. + "STACK CFI 4001 .cfa: sp 32 + .ra: .cfa -8 + ^" + " x19: .cfa -32 + ^ x20: .cfa -24 + ^ " + " x29: .cfa -16 + ^\n" + // Save x19..x22 in x0..x3: verify that we populate + // the youngest frame with all the values we have. + "STACK CFI 4002 x19: x0 x20: x1 x21: x2 x22: x3\n" + // Restore x19..x22. Save the non-callee-saves register x1. + "STACK CFI 4003 .cfa: sp 40 + x1: .cfa 40 - ^" + " x19: x19 x20: x20 x21: x21 x22: x22\n" + // Move the .cfa back eight bytes, to point at the return + // address, and restore the sp explicitly. + "STACK CFI 4005 .cfa: sp 32 + x1: .cfa 32 - ^" + " x29: .cfa 8 - ^ .ra: .cfa ^ sp: .cfa 8 +\n" + // Recover the PC explicitly from a new stack slot; + // provide garbage for the .ra. + "STACK CFI 4006 .cfa: sp 40 + pc: .cfa 40 - ^\n" + + // The calling function. + "FUNC 5000 1000 10 epictetus\n" + // Mark it as end of stack. + "STACK CFI INIT 5000 1000 .cfa: 0 .ra: 0\n" + + // A function whose CFI makes the stack pointer + // go backwards. + "FUNC 6000 1000 20 palinal\n" + "STACK CFI INIT 6000 1000 .cfa: sp 8 - .ra: x30\n" + + // A function with CFI expressions that can't be + // evaluated. + "FUNC 7000 1000 20 rhetorical\n" + "STACK CFI INIT 7000 1000 .cfa: moot .ra: ambiguous\n"); + + // Provide some distinctive values for the caller's registers. + expected.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040005510L; + expected.iregs[MD_CONTEXT_ARM64_REG_SP] = 0x0000000080000000L; + expected.iregs[19] = 0x5e68b5d5b5d55e68L; + expected.iregs[20] = 0x34f3ebd1ebd134f3L; + expected.iregs[21] = 0x74bca31ea31e74bcL; + expected.iregs[22] = 0x16b32dcb2dcb16b3L; + expected.iregs[23] = 0x21372ada2ada2137L; + expected.iregs[24] = 0x557dbbbbbbbb557dL; + expected.iregs[25] = 0x8ca748bf48bf8ca7L; + expected.iregs[26] = 0x21f0ab46ab4621f0L; + expected.iregs[27] = 0x146732b732b71467L; + expected.iregs[28] = 0xa673645fa673645fL; + expected.iregs[MD_CONTEXT_ARM64_REG_FP] = 0xe11081128112e110L; + + // Expect CFI to recover all callee-saves registers. Since CFI is the + // only stack frame construction technique we have, aside from the + // context frame itself, there's no way for us to have a set of valid + // registers smaller than this. + expected_validity = (StackFrameARM64::CONTEXT_VALID_PC | + StackFrameARM64::CONTEXT_VALID_SP | + StackFrameARM64::CONTEXT_VALID_X19 | + StackFrameARM64::CONTEXT_VALID_X20 | + StackFrameARM64::CONTEXT_VALID_X21 | + StackFrameARM64::CONTEXT_VALID_X22 | + StackFrameARM64::CONTEXT_VALID_X23 | + StackFrameARM64::CONTEXT_VALID_X24 | + StackFrameARM64::CONTEXT_VALID_X25 | + StackFrameARM64::CONTEXT_VALID_X26 | + StackFrameARM64::CONTEXT_VALID_X27 | + StackFrameARM64::CONTEXT_VALID_X28 | + StackFrameARM64::CONTEXT_VALID_FP); + + // By default, context frames provide all registers, as normal. + context_frame_validity = StackFrameARM64::CONTEXT_VALID_ALL; + + // By default, registers are unchanged. + raw_context = expected; + } + + // Walk the stack, using stack_section as the contents of the stack + // and raw_context as the current register values. (Set the stack + // pointer to the stack's starting address.) Expect two stack + // frames; in the older frame, expect the callee-saves registers to + // have values matching those in 'expected'. + void CheckWalk() { + RegionFromSection(); + raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM64 walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + walker.SetContextFrameValidity(context_frame_validity); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameARM64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(context_frame_validity, frame0->context_validity); + EXPECT_EQ("enchiridion", frame0->function_name); + EXPECT_EQ(0x0000000040004000UL, frame0->function_base); + + StackFrameARM64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ(expected_validity, frame1->context_validity); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X1) + EXPECT_EQ(expected.iregs[1], frame1->context.iregs[1]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X19) + EXPECT_EQ(expected.iregs[19], frame1->context.iregs[19]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X20) + EXPECT_EQ(expected.iregs[20], frame1->context.iregs[20]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X21) + EXPECT_EQ(expected.iregs[21], frame1->context.iregs[21]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X22) + EXPECT_EQ(expected.iregs[22], frame1->context.iregs[22]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X23) + EXPECT_EQ(expected.iregs[23], frame1->context.iregs[23]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X24) + EXPECT_EQ(expected.iregs[24], frame1->context.iregs[24]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X25) + EXPECT_EQ(expected.iregs[25], frame1->context.iregs[25]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X26) + EXPECT_EQ(expected.iregs[26], frame1->context.iregs[26]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X27) + EXPECT_EQ(expected.iregs[27], frame1->context.iregs[27]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_X28) + EXPECT_EQ(expected.iregs[28], frame1->context.iregs[28]); + if (expected_validity & StackFrameARM64::CONTEXT_VALID_FP) + EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM64_REG_FP], + frame1->context.iregs[MD_CONTEXT_ARM64_REG_FP]); + + // We would never have gotten a frame in the first place if the SP + // and PC weren't valid or ->instruction weren't set. + EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM64_REG_SP], + frame1->context.iregs[MD_CONTEXT_ARM64_REG_SP]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM64_REG_PC], + frame1->context.iregs[MD_CONTEXT_ARM64_REG_PC]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM64_REG_PC], + frame1->instruction + 4); + EXPECT_EQ("epictetus", frame1->function_name); + } + + // The values we expect to find for the caller's registers. + MDRawContextARM64 expected; + + // The validity mask for expected. + uint64_t expected_validity; + + // The validity mask to impose on the context frame. + uint64_t context_frame_validity; +}; + +class CFI: public CFIFixture, public Test { }; + +TEST_F(CFI, At4000) { + stack_section.start() = expected.iregs[MD_CONTEXT_ARM64_REG_SP]; + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004000L; + raw_context.iregs[MD_CONTEXT_ARM64_REG_LR] = 0x0000000040005510L; + CheckWalk(); +} + +TEST_F(CFI, At4001) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP]; + stack_section + .D64(0x5e68b5d5b5d55e68L) // saved x19 + .D64(0x34f3ebd1ebd134f3L) // saved x20 + .D64(0xe11081128112e110L) // saved fp + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004001L; + // distinct callee x19, x20 and fp + raw_context.iregs[19] = 0xadc9f635a635adc9L; + raw_context.iregs[20] = 0x623135ac35ac6231L; + raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = 0x5fc4be14be145fc4L; + CheckWalk(); +} + +// As above, but unwind from a context that has only the PC and SP. +TEST_F(CFI, At4001LimitedValidity) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP]; + stack_section + .D64(0x5e68b5d5b5d55e68L) // saved x19 + .D64(0x34f3ebd1ebd134f3L) // saved x20 + .D64(0xe11081128112e110L) // saved fp + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + context_frame_validity = + StackFrameARM64::CONTEXT_VALID_PC | StackFrameARM64::CONTEXT_VALID_SP; + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004001L; + raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = 0x5fc4be14be145fc4L; + + expected_validity = (StackFrameARM64::CONTEXT_VALID_PC + | StackFrameARM64::CONTEXT_VALID_SP + | StackFrameARM64::CONTEXT_VALID_FP + | StackFrameARM64::CONTEXT_VALID_X19 + | StackFrameARM64::CONTEXT_VALID_X20); + CheckWalk(); +} + +TEST_F(CFI, At4002) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP]; + stack_section + .D64(0xff3dfb81fb81ff3dL) // no longer saved x19 + .D64(0x34f3ebd1ebd134f3L) // no longer saved x20 + .D64(0xe11081128112e110L) // saved fp + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004002L; + raw_context.iregs[0] = 0x5e68b5d5b5d55e68L; // saved x19 + raw_context.iregs[1] = 0x34f3ebd1ebd134f3L; // saved x20 + raw_context.iregs[2] = 0x74bca31ea31e74bcL; // saved x21 + raw_context.iregs[3] = 0x16b32dcb2dcb16b3L; // saved x22 + raw_context.iregs[19] = 0xadc9f635a635adc9L; // distinct callee x19 + raw_context.iregs[20] = 0x623135ac35ac6231L; // distinct callee x20 + raw_context.iregs[21] = 0xac4543564356ac45L; // distinct callee x21 + raw_context.iregs[22] = 0x2561562f562f2561L; // distinct callee x22 + // distinct callee fp + raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = 0x5fc4be14be145fc4L; + CheckWalk(); +} + +TEST_F(CFI, At4003) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP]; + stack_section + .D64(0xdd5a48c848c8dd5aL) // saved x1 (even though it's not callee-saves) + .D64(0xff3dfb81fb81ff3dL) // no longer saved x19 + .D64(0x34f3ebd1ebd134f3L) // no longer saved x20 + .D64(0xe11081128112e110L) // saved fp + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004003L; + // distinct callee x1 and fp + raw_context.iregs[1] = 0xfb756319fb756319L; + raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = 0x5fc4be14be145fc4L; + // caller's x1 + expected.iregs[1] = 0xdd5a48c848c8dd5aL; + expected_validity |= StackFrameARM64::CONTEXT_VALID_X1; + CheckWalk(); +} + +// We have no new rule at module offset 0x4004, so the results here should +// be the same as those at module offset 0x4003. +TEST_F(CFI, At4004) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP]; + stack_section + .D64(0xdd5a48c848c8dd5aL) // saved x1 (even though it's not callee-saves) + .D64(0xff3dfb81fb81ff3dL) // no longer saved x19 + .D64(0x34f3ebd1ebd134f3L) // no longer saved x20 + .D64(0xe11081128112e110L) // saved fp + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004004L; + // distinct callee x1 and fp + raw_context.iregs[1] = 0xfb756319fb756319L; + raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = 0x5fc4be14be145fc4L; + // caller's x1 + expected.iregs[1] = 0xdd5a48c848c8dd5aL; + expected_validity |= StackFrameARM64::CONTEXT_VALID_X1; + CheckWalk(); +} + +// Here we move the .cfa, but provide an explicit rule to recover the SP, +// so again there should be no change in the registers recovered. +TEST_F(CFI, At4005) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP]; + stack_section + .D64(0xdd5a48c848c8dd5aL) // saved x1 (even though it's not callee-saves) + .D64(0xff3dfb81fb81ff3dL) // no longer saved x19 + .D64(0x34f3ebd1ebd134f3L) // no longer saved x20 + .D64(0xe11081128112e110L) // saved fp + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004005L; + raw_context.iregs[1] = 0xfb756319fb756319L; // distinct callee x1 + expected.iregs[1] = 0xdd5a48c848c8dd5aL; // caller's x1 + expected_validity |= StackFrameARM64::CONTEXT_VALID_X1; + CheckWalk(); +} + +// Here we provide an explicit rule for the PC, and have the saved .ra be +// bogus. +TEST_F(CFI, At4006) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP]; + stack_section + .D64(0x0000000040005510L) // saved pc + .D64(0xdd5a48c848c8dd5aL) // saved x1 (even though it's not callee-saves) + .D64(0xff3dfb81fb81ff3dL) // no longer saved x19 + .D64(0x34f3ebd1ebd134f3L) // no longer saved x20 + .D64(0xe11081128112e110L) // saved fp + .D64(0xf8d157835783f8d1L) // .ra rule recovers this, which is garbage + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004006L; + raw_context.iregs[1] = 0xfb756319fb756319L; // distinct callee x1 + expected.iregs[1] = 0xdd5a48c848c8dd5aL; // caller's x1 + expected_validity |= StackFrameARM64::CONTEXT_VALID_X1; + CheckWalk(); +} + +// Check that we reject rules that would cause the stack pointer to +// move in the wrong direction. +TEST_F(CFI, RejectBackwards) { + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040006000L; + raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = 0x0000000080000000L; + raw_context.iregs[MD_CONTEXT_ARM64_REG_LR] = 0x0000000040005510L; + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} + +// Check that we reject rules whose expressions' evaluation fails. +TEST_F(CFI, RejectBadExpressions) { + raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040007000L; + raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = 0x0000000080000000L; + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} diff --git a/src/processor/stackwalker_arm_unittest.cc b/src/processor/stackwalker_arm_unittest.cc new file mode 100644 index 0000000..6103e20 --- /dev/null +++ b/src/processor/stackwalker_arm_unittest.cc @@ -0,0 +1,982 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// stackwalker_arm_unittest.cc: Unit tests for StackwalkerARM class. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/stackwalker_unittest_utils.h" +#include "processor/stackwalker_arm.h" +#include "processor/windows_frame_info.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::StackFrameSymbolizer; +using google_breakpad::StackFrame; +using google_breakpad::StackFrameARM; +using google_breakpad::Stackwalker; +using google_breakpad::StackwalkerARM; +using google_breakpad::SystemInfo; +using google_breakpad::WindowsFrameInfo; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using std::vector; +using testing::_; +using testing::AnyNumber; +using testing::DoAll; +using testing::Return; +using testing::SetArgumentPointee; +using testing::Test; + +class StackwalkerARMFixture { + public: + StackwalkerARMFixture() + : stack_section(kLittleEndian), + // Give the two modules reasonable standard locations and names + // for tests to play with. + module1(0x40000000, 0x10000, "module1", "version1"), + module2(0x50000000, 0x10000, "module2", "version2") { + // Identify the system as a Linux system. + system_info.os = "Linux"; + system_info.os_short = "linux"; + system_info.os_version = "Lugubrious Labrador"; + system_info.cpu = "arm"; + system_info.cpu_info = ""; + + // Put distinctive values in the raw CPU context. + BrandContext(&raw_context); + + // Create some modules with some stock debugging information. + modules.Add(&module1); + modules.Add(&module2); + + // By default, none of the modules have symbol info; call + // SetModuleSymbols to override this. + EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _, _)) + .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND)); + + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + + // Reset max_frames_scanned since it's static. + Stackwalker::set_max_frames_scanned(1024); + } + + // Set the Breakpad symbol information that supplier should return for + // MODULE to INFO. + void SetModuleSymbols(MockCodeModule* module, const string& info) { + size_t buffer_size; + char *buffer = supplier.CopySymbolDataAndOwnTheCopy(info, &buffer_size); + EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _, _)) + .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer), + SetArgumentPointee<4>(buffer_size), + Return(MockSymbolSupplier::FOUND))); + } + + // Populate stack_region with the contents of stack_section. Use + // stack_section.start() as the region's starting address. + void RegionFromSection() { + string contents; + ASSERT_TRUE(stack_section.GetContents(&contents)); + stack_region.Init(stack_section.start().Value(), contents); + } + + // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking. + void BrandContext(MDRawContextARM *raw_context) { + uint8_t x = 173; + for (size_t i = 0; i < sizeof(*raw_context); i++) + reinterpret_cast(raw_context)[i] = (x += 17); + } + + SystemInfo system_info; + MDRawContextARM raw_context; + Section stack_section; + MockMemoryRegion stack_region; + MockCodeModule module1; + MockCodeModule module2; + MockCodeModules modules; + MockSymbolSupplier supplier; + BasicSourceLineResolver resolver; + CallStack call_stack; + const vector* frames; +}; + +class SanityCheck: public StackwalkerARMFixture, public Test { }; + +TEST_F(SanityCheck, NoResolver) { + // Since we have no call frame information, and all unwinding + // requires call frame information, the stack walk will end after + // the first frame. + StackFrameSymbolizer frame_symbolizer(NULL, NULL); + StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, + &frame_symbolizer); + // This should succeed even without a resolver or supplier. + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameARM *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetContextFrame: public StackwalkerARMFixture, public Test { }; + +TEST_F(GetContextFrame, Simple) { + // Since we have no call frame information, and all unwinding + // requires call frame information, the stack walk will end after + // the first frame. + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameARM *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +// The stackwalker should be able to produce the context frame even +// without stack memory present. +TEST_F(GetContextFrame, NoStackMemory) { + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, -1, NULL, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameARM *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetCallerFrame: public StackwalkerARMFixture, public Test { }; + +TEST_F(GetCallerFrame, ScanWithoutSymbols) { + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + // Force scanning through three frames to ensure that the + // stack pointer is set properly in scan-recovered frames. + stack_section.start() = 0x80000000; + uint32_t return_address1 = 0x50000100; + uint32_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D32(0x40090000) // junk that's not + .D32(0x60000000) // a return address + + .D32(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) // space + + .D32(0xF0000000) // more junk + .D32(0x0000000D) + + .D32(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40005510; + raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameARM *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameARM *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]); + + StackFrameARM *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame2->trust); + ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_SP), + frame2->context_validity); + EXPECT_EQ(return_address2, frame2->context.iregs[MD_CONTEXT_ARM_REG_PC]); + EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_ARM_REG_SP]); +} + +TEST_F(GetCallerFrame, ScanWithFunctionSymbols) { + // During stack scanning, if a potential return address + // is located within a loaded module that has symbols, + // it is only considered a valid return address if it + // lies within a function's bounds. + stack_section.start() = 0x80000000; + uint32_t return_address = 0x50000200; + Label frame1_sp; + + stack_section + // frame 0 + .Append(16, 0) // space + + .D32(0x40090000) // junk that's not + .D32(0x60000000) // a return address + + .D32(0x40001000) // a couple of plausible addresses + .D32(0x5000F000) // that are not within functions + + .D32(return_address) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40000200; + raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); + + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 100 400 10 monotreme\n"); + SetModuleSymbols(&module2, + // The calling frame's function. + "FUNC 100 400 10 marsupial\n"); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameARM *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + EXPECT_EQ("monotreme", frame0->function_name); + EXPECT_EQ(0x40000100U, frame0->function_base); + + StackFrameARM *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address, frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]); + EXPECT_EQ("marsupial", frame1->function_name); + EXPECT_EQ(0x50000100U, frame1->function_base); +} + +TEST_F(GetCallerFrame, ScanFirstFrame) { + // If the stackwalker resorts to stack scanning, it will scan much + // farther to find the caller of the context frame. + stack_section.start() = 0x80000000; + uint32_t return_address1 = 0x50000100; + uint32_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(32, 0) // space + + .D32(0x40090000) // junk that's not + .D32(0x60000000) // a return address + + .Append(96, 0) // more space + + .D32(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(32, 0) // space + + .D32(0xF0000000) // more junk + .D32(0x0000000D) + + .Append(136, 0) // more space + + .D32(return_address2) // actual return address + // (won't be found) + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40005510; + raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameARM *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameARM *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]); +} + +// Test that set_max_frames_scanned prevents using stack scanning +// to find caller frames. +TEST_F(GetCallerFrame, ScanningNotAllowed) { + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + stack_section.start() = 0x80000000; + uint32_t return_address1 = 0x50000100; + uint32_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D32(0x40090000) // junk that's not + .D32(0x60000000) // a return address + + .D32(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) // space + + .D32(0xF0000000) // more junk + .D32(0x0000000D) + + .D32(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40005510; + raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, + &frame_symbolizer); + Stackwalker::set_max_frames_scanned(0); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + + StackFrameARM *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); +} + +struct CFIFixture: public StackwalkerARMFixture { + CFIFixture() { + // Provide a bunch of STACK CFI records; we'll walk to the caller + // from every point in this series, expecting to find the same set + // of register values. + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 4000 1000 10 enchiridion\n" + // Initially, nothing has been pushed on the stack, + // and the return address is still in the link register. + "STACK CFI INIT 4000 100 .cfa: sp .ra: lr\n" + // Push r4, the frame pointer, and the link register. + "STACK CFI 4001 .cfa: sp 12 + r4: .cfa 12 - ^" + " r11: .cfa 8 - ^ .ra: .cfa 4 - ^\n" + // Save r4..r7 in r0..r3: verify that we populate + // the youngest frame with all the values we have. + "STACK CFI 4002 r4: r0 r5: r1 r6: r2 r7: r3\n" + // Restore r4..r7. Save the non-callee-saves register r1. + "STACK CFI 4003 .cfa: sp 16 + r1: .cfa 16 - ^" + " r4: r4 r5: r5 r6: r6 r7: r7\n" + // Move the .cfa back four bytes, to point at the return + // address, and restore the sp explicitly. + "STACK CFI 4005 .cfa: sp 12 + r1: .cfa 12 - ^" + " r11: .cfa 4 - ^ .ra: .cfa ^ sp: .cfa 4 +\n" + // Recover the PC explicitly from a new stack slot; + // provide garbage for the .ra. + "STACK CFI 4006 .cfa: sp 16 + pc: .cfa 16 - ^\n" + + // The calling function. + "FUNC 5000 1000 10 epictetus\n" + // Mark it as end of stack. + "STACK CFI INIT 5000 1000 .cfa: 0 .ra: 0\n" + + // A function whose CFI makes the stack pointer + // go backwards. + "FUNC 6000 1000 20 palinal\n" + "STACK CFI INIT 6000 1000 .cfa: sp 4 - .ra: lr\n" + + // A function with CFI expressions that can't be + // evaluated. + "FUNC 7000 1000 20 rhetorical\n" + "STACK CFI INIT 7000 1000 .cfa: moot .ra: ambiguous\n"); + + // Provide some distinctive values for the caller's registers. + expected.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40005510; + expected.iregs[MD_CONTEXT_ARM_REG_SP] = 0x80000000; + expected.iregs[4] = 0xb5d55e68; + expected.iregs[5] = 0xebd134f3; + expected.iregs[6] = 0xa31e74bc; + expected.iregs[7] = 0x2dcb16b3; + expected.iregs[8] = 0x2ada2137; + expected.iregs[9] = 0xbbbb557d; + expected.iregs[10] = 0x48bf8ca7; + expected.iregs[MD_CONTEXT_ARM_REG_FP] = 0x8112e110; + + // Expect CFI to recover all callee-saves registers. Since CFI is the + // only stack frame construction technique we have, aside from the + // context frame itself, there's no way for us to have a set of valid + // registers smaller than this. + expected_validity = (StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_SP | + StackFrameARM::CONTEXT_VALID_R4 | + StackFrameARM::CONTEXT_VALID_R5 | + StackFrameARM::CONTEXT_VALID_R6 | + StackFrameARM::CONTEXT_VALID_R7 | + StackFrameARM::CONTEXT_VALID_R8 | + StackFrameARM::CONTEXT_VALID_R9 | + StackFrameARM::CONTEXT_VALID_R10 | + StackFrameARM::CONTEXT_VALID_FP); + + // By default, context frames provide all registers, as normal. + context_frame_validity = StackFrameARM::CONTEXT_VALID_ALL; + + // By default, registers are unchanged. + raw_context = expected; + } + + // Walk the stack, using stack_section as the contents of the stack + // and raw_context as the current register values. (Set the stack + // pointer to the stack's starting address.) Expect two stack + // frames; in the older frame, expect the callee-saves registers to + // have values matching those in 'expected'. + void CheckWalk() { + RegionFromSection(); + raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, + &modules, &frame_symbolizer); + walker.SetContextFrameValidity(context_frame_validity); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameARM *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(context_frame_validity, frame0->context_validity); + EXPECT_EQ("enchiridion", frame0->function_name); + EXPECT_EQ(0x40004000U, frame0->function_base); + + StackFrameARM *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ(expected_validity, frame1->context_validity); + if (expected_validity & StackFrameARM::CONTEXT_VALID_R1) + EXPECT_EQ(expected.iregs[1], frame1->context.iregs[1]); + if (expected_validity & StackFrameARM::CONTEXT_VALID_R4) + EXPECT_EQ(expected.iregs[4], frame1->context.iregs[4]); + if (expected_validity & StackFrameARM::CONTEXT_VALID_R5) + EXPECT_EQ(expected.iregs[5], frame1->context.iregs[5]); + if (expected_validity & StackFrameARM::CONTEXT_VALID_R6) + EXPECT_EQ(expected.iregs[6], frame1->context.iregs[6]); + if (expected_validity & StackFrameARM::CONTEXT_VALID_R7) + EXPECT_EQ(expected.iregs[7], frame1->context.iregs[7]); + if (expected_validity & StackFrameARM::CONTEXT_VALID_R8) + EXPECT_EQ(expected.iregs[8], frame1->context.iregs[8]); + if (expected_validity & StackFrameARM::CONTEXT_VALID_R9) + EXPECT_EQ(expected.iregs[9], frame1->context.iregs[9]); + if (expected_validity & StackFrameARM::CONTEXT_VALID_R10) + EXPECT_EQ(expected.iregs[10], frame1->context.iregs[10]); + if (expected_validity & StackFrameARM::CONTEXT_VALID_FP) + EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM_REG_FP], + frame1->context.iregs[MD_CONTEXT_ARM_REG_FP]); + + // We would never have gotten a frame in the first place if the SP + // and PC weren't valid or ->instruction weren't set. + EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM_REG_SP], + frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM_REG_PC], + frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM_REG_PC], + frame1->instruction + 2); + EXPECT_EQ("epictetus", frame1->function_name); + } + + // The values we expect to find for the caller's registers. + MDRawContextARM expected; + + // The validity mask for expected. + int expected_validity; + + // The validity mask to impose on the context frame. + int context_frame_validity; +}; + +class CFI: public CFIFixture, public Test { }; + +TEST_F(CFI, At4000) { + stack_section.start() = expected.iregs[MD_CONTEXT_ARM_REG_SP]; + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004000; + raw_context.iregs[MD_CONTEXT_ARM_REG_LR] = 0x40005510; + CheckWalk(); +} + +TEST_F(CFI, At4001) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP]; + stack_section + .D32(0xb5d55e68) // saved r4 + .D32(0x8112e110) // saved fp + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004001; + raw_context.iregs[4] = 0x635adc9f; // distinct callee r4 + raw_context.iregs[MD_CONTEXT_ARM_REG_FP] = 0xbe145fc4; // distinct callee fp + CheckWalk(); +} + +// As above, but unwind from a context that has only the PC and SP. +TEST_F(CFI, At4001LimitedValidity) { + context_frame_validity = + StackFrameARM::CONTEXT_VALID_PC | StackFrameARM::CONTEXT_VALID_SP; + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004001; + raw_context.iregs[MD_CONTEXT_ARM_REG_FP] = 0xbe145fc4; // distinct callee fp + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP]; + stack_section + .D32(0xb5d55e68) // saved r4 + .D32(0x8112e110) // saved fp + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + expected_validity = (StackFrameARM::CONTEXT_VALID_PC + | StackFrameARM::CONTEXT_VALID_SP + | StackFrameARM::CONTEXT_VALID_FP + | StackFrameARM::CONTEXT_VALID_R4); + CheckWalk(); +} + +TEST_F(CFI, At4002) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP]; + stack_section + .D32(0xfb81ff3d) // no longer saved r4 + .D32(0x8112e110) // saved fp + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004002; + raw_context.iregs[0] = 0xb5d55e68; // saved r4 + raw_context.iregs[1] = 0xebd134f3; // saved r5 + raw_context.iregs[2] = 0xa31e74bc; // saved r6 + raw_context.iregs[3] = 0x2dcb16b3; // saved r7 + raw_context.iregs[4] = 0xfdd35466; // distinct callee r4 + raw_context.iregs[5] = 0xf18c946c; // distinct callee r5 + raw_context.iregs[6] = 0xac2079e8; // distinct callee r6 + raw_context.iregs[7] = 0xa449829f; // distinct callee r7 + raw_context.iregs[MD_CONTEXT_ARM_REG_FP] = 0xbe145fc4; // distinct callee fp + CheckWalk(); +} + +TEST_F(CFI, At4003) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP]; + stack_section + .D32(0x48c8dd5a) // saved r1 (even though it's not callee-saves) + .D32(0xcb78040e) // no longer saved r4 + .D32(0x8112e110) // saved fp + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004003; + raw_context.iregs[1] = 0xfb756319; // distinct callee r1 + raw_context.iregs[MD_CONTEXT_ARM_REG_FP] = 0x0a2857ea; // distinct callee fp + expected.iregs[1] = 0x48c8dd5a; // caller's r1 + expected_validity |= StackFrameARM::CONTEXT_VALID_R1; + CheckWalk(); +} + +// We have no new rule at module offset 0x4004, so the results here should +// be the same as those at module offset 0x4003. +TEST_F(CFI, At4004) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP]; + stack_section + .D32(0x48c8dd5a) // saved r1 (even though it's not callee-saves) + .D32(0xcb78040e) // no longer saved r4 + .D32(0x8112e110) // saved fp + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004004; + raw_context.iregs[1] = 0xfb756319; // distinct callee r1 + expected.iregs[1] = 0x48c8dd5a; // caller's r1 + expected_validity |= StackFrameARM::CONTEXT_VALID_R1; + CheckWalk(); +} + +// Here we move the .cfa, but provide an explicit rule to recover the SP, +// so again there should be no change in the registers recovered. +TEST_F(CFI, At4005) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP]; + stack_section + .D32(0x48c8dd5a) // saved r1 (even though it's not callee-saves) + .D32(0xf013f841) // no longer saved r4 + .D32(0x8112e110) // saved fp + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004005; + raw_context.iregs[1] = 0xfb756319; // distinct callee r1 + expected.iregs[1] = 0x48c8dd5a; // caller's r1 + expected_validity |= StackFrameARM::CONTEXT_VALID_R1; + CheckWalk(); +} + +// Here we provide an explicit rule for the PC, and have the saved .ra be +// bogus. +TEST_F(CFI, At4006) { + Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP]; + stack_section + .D32(0x40005510) // saved pc + .D32(0x48c8dd5a) // saved r1 (even though it's not callee-saves) + .D32(0xf013f841) // no longer saved r4 + .D32(0x8112e110) // saved fp + .D32(0xf8d15783) // .ra rule recovers this, which is garbage + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004006; + raw_context.iregs[1] = 0xfb756319; // callee's r1, different from caller's + expected.iregs[1] = 0x48c8dd5a; // caller's r1 + expected_validity |= StackFrameARM::CONTEXT_VALID_R1; + CheckWalk(); +} + +// Check that we reject rules that would cause the stack pointer to +// move in the wrong direction. +TEST_F(CFI, RejectBackwards) { + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40006000; + raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = 0x80000000; + raw_context.iregs[MD_CONTEXT_ARM_REG_LR] = 0x40005510; + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} + +// Check that we reject rules whose expressions' evaluation fails. +TEST_F(CFI, RejectBadExpressions) { + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40007000; + raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = 0x80000000; + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} + +class StackwalkerARMFixtureIOS : public StackwalkerARMFixture { + public: + StackwalkerARMFixtureIOS() { + // iOS_test is used instead of iOS because the stackwalker has a check to + // avoid using CFI for iOS dumps. This is a workaround for bad CFI being + // produced by dump_syms for iOS. + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=764 + system_info.os = "iOS_test"; + system_info.os_short = "ios_test"; + } +}; + +class GetFramesByFramePointer: public StackwalkerARMFixtureIOS, public Test { }; + +TEST_F(GetFramesByFramePointer, OnlyFramePointer) { + stack_section.start() = 0x80000000; + uint32_t return_address1 = 0x50000100; + uint32_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + Label frame1_fp, frame2_fp; + stack_section + // frame 0 + .Append(32, 0) // Whatever values on the stack. + .D32(0x0000000D) // junk that's not + .D32(0xF0000000) // a return address. + + .Mark(&frame1_fp) // Next fp will point to the next value. + .D32(frame2_fp) // Save current frame pointer. + .D32(return_address2) // Save current link register. + .Mark(&frame1_sp) + + // frame 1 + .Append(32, 0) // Whatever values on the stack. + .D32(0x0000000D) // junk that's not + .D32(0xF0000000) // a return address. + + .Mark(&frame2_fp) + .D32(0) + .D32(0) + .Mark(&frame2_sp) + + // frame 2 + .Append(32, 0) // Whatever values on the stack. + .D32(0x0000000D) // junk that's not + .D32(0xF0000000); // a return address. + RegionFromSection(); + + + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40005510; + raw_context.iregs[MD_CONTEXT_ARM_REG_LR] = return_address1; + raw_context.iregs[MD_CONTEXT_ARM_REG_IOS_FP] = frame1_fp.Value(); + raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, MD_CONTEXT_ARM_REG_IOS_FP, + &stack_region, &modules, &frame_symbolizer); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameARM *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameARM *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust); + ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_LR | + StackFrameARM::RegisterValidFlag(MD_CONTEXT_ARM_REG_IOS_FP) | + StackFrameARM::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]); + EXPECT_EQ(return_address2, frame1->context.iregs[MD_CONTEXT_ARM_REG_LR]); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]); + EXPECT_EQ(frame2_fp.Value(), + frame1->context.iregs[MD_CONTEXT_ARM_REG_IOS_FP]); + + StackFrameARM *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame2->trust); + ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_LR | + StackFrameARM::RegisterValidFlag(MD_CONTEXT_ARM_REG_IOS_FP) | + StackFrameARM::CONTEXT_VALID_SP), + frame2->context_validity); + EXPECT_EQ(return_address2, frame2->context.iregs[MD_CONTEXT_ARM_REG_PC]); + EXPECT_EQ(0U, frame2->context.iregs[MD_CONTEXT_ARM_REG_LR]); + EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_ARM_REG_SP]); + EXPECT_EQ(0U, frame2->context.iregs[MD_CONTEXT_ARM_REG_IOS_FP]); +} + +TEST_F(GetFramesByFramePointer, FramePointerAndCFI) { + // Provide the standatd STACK CFI records that is obtained when exmining an + // executable produced by XCode. + SetModuleSymbols(&module1, + // Adding a function in CFI. + "FUNC 4000 1000 10 enchiridion\n" + + "STACK CFI INIT 4000 100 .cfa: sp 0 + .ra: lr\n" + "STACK CFI 4001 .cfa: sp 8 + .ra: .cfa -4 + ^" + " r7: .cfa -8 + ^\n" + "STACK CFI 4002 .cfa: r7 8 +\n" + ); + + stack_section.start() = 0x80000000; + uint32_t return_address1 = 0x40004010; + uint32_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + Label frame1_fp, frame2_fp; + stack_section + // frame 0 + .Append(32, 0) // Whatever values on the stack. + .D32(0x0000000D) // junk that's not + .D32(0xF0000000) // a return address. + + .Mark(&frame1_fp) // Next fp will point to the next value. + .D32(frame2_fp) // Save current frame pointer. + .D32(return_address2) // Save current link register. + .Mark(&frame1_sp) + + // frame 1 + .Append(32, 0) // Whatever values on the stack. + .D32(0x0000000D) // junk that's not + .D32(0xF0000000) // a return address. + + .Mark(&frame2_fp) + .D32(0) + .D32(0) + .Mark(&frame2_sp) + + // frame 2 + .Append(32, 0) // Whatever values on the stack. + .D32(0x0000000D) // junk that's not + .D32(0xF0000000); // a return address. + RegionFromSection(); + + + raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x50000400; + raw_context.iregs[MD_CONTEXT_ARM_REG_LR] = return_address1; + raw_context.iregs[MD_CONTEXT_ARM_REG_IOS_FP] = frame1_fp.Value(); + raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerARM walker(&system_info, &raw_context, MD_CONTEXT_ARM_REG_IOS_FP, + &stack_region, &modules, &frame_symbolizer); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module2", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameARM *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameARM::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameARM *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust); + ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_LR | + StackFrameARM::RegisterValidFlag(MD_CONTEXT_ARM_REG_IOS_FP) | + StackFrameARM::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]); + EXPECT_EQ(return_address2, frame1->context.iregs[MD_CONTEXT_ARM_REG_LR]); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]); + EXPECT_EQ(frame2_fp.Value(), + frame1->context.iregs[MD_CONTEXT_ARM_REG_IOS_FP]); + EXPECT_EQ("enchiridion", frame1->function_name); + EXPECT_EQ(0x40004000U, frame1->function_base); + + + StackFrameARM *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame2->trust); + ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC | + StackFrameARM::CONTEXT_VALID_LR | + StackFrameARM::RegisterValidFlag(MD_CONTEXT_ARM_REG_IOS_FP) | + StackFrameARM::CONTEXT_VALID_SP), + frame2->context_validity); + EXPECT_EQ(return_address2, frame2->context.iregs[MD_CONTEXT_ARM_REG_PC]); + EXPECT_EQ(0U, frame2->context.iregs[MD_CONTEXT_ARM_REG_LR]); + EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_ARM_REG_SP]); + EXPECT_EQ(0U, frame2->context.iregs[MD_CONTEXT_ARM_REG_IOS_FP]); +} diff --git a/src/processor/stackwalker_mips.cc b/src/processor/stackwalker_mips.cc new file mode 100644 index 0000000..7195c16 --- /dev/null +++ b/src/processor/stackwalker_mips.cc @@ -0,0 +1,446 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_mips.cc: MIPS-specific stackwalker. +// +// See stackwalker_mips.h for documentation. +// +// Author: Tata Elxsi + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/cfi_frame_info.h" +#include "processor/logging.h" +#include "processor/postfix_evaluator-inl.h" +#include "processor/stackwalker_mips.h" +#include "processor/windows_frame_info.h" +#include "google_breakpad/common/minidump_cpu_mips.h" + +namespace google_breakpad { + +StackwalkerMIPS::StackwalkerMIPS(const SystemInfo* system_info, + const MDRawContextMIPS* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* resolver_helper) +: Stackwalker(system_info, memory, modules, resolver_helper), + context_(context) { + if (memory_) { + if (context_->context_flags & MD_CONTEXT_MIPS64 ) { + if (0xffffffffffffffff - memory_->GetBase() < memory_->GetSize() - 1) { + BPLOG(ERROR) << "Memory out of range for stackwalking mips64: " + << HexString(memory_->GetBase()) + << "+" + << HexString(memory_->GetSize()); + memory_ = NULL; + } + } else { + if (0xffffffff - memory_->GetBase() < memory_->GetSize() - 1) { + BPLOG(ERROR) << "Memory out of range for stackwalking mips32: " + << HexString(memory_->GetBase()) + << "+" + << HexString(memory_->GetSize()); + memory_ = NULL; + } + } + } +} + +StackFrame* StackwalkerMIPS::GetContextFrame() { + if (!context_) { + BPLOG(ERROR) << "Can't get context frame without context."; + return NULL; + } + + StackFrameMIPS* frame = new StackFrameMIPS(); + + // The instruction pointer is stored directly in a register, so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = StackFrameMIPS::CONTEXT_VALID_ALL; + frame->trust = StackFrame::FRAME_TRUST_CONTEXT; + frame->instruction = frame->context.epc; + + return frame; +} + +// Register names for mips. +static const char* const kRegisterNames[] = { + "$zero", "$at", "$v0", "$v1", "$a0", "$a1", "$a2", "$a3", "$to", "$t1", + "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$s0", "$s1", "$s2", "$s3", + "$s4", "$s5", "$s6", "$s7", "$t8", "$t9", "$k0", "$k1", "$gp", "$sp", + "$fp", "$ra", NULL + // TODO(gordanac): add float point save registers +}; + +StackFrameMIPS* StackwalkerMIPS::GetCallerByCFIFrameInfo( + const vector& frames, + CFIFrameInfo* cfi_frame_info) { + StackFrameMIPS* last_frame = static_cast(frames.back()); + + if (context_->context_flags & MD_CONTEXT_MIPS) { + uint32_t pc = 0; + + // Populate a dictionary with the valid register values in last_frame. + CFIFrameInfo::RegisterValueMap callee_registers; + // Use the STACK CFI data to recover the caller's register values. + CFIFrameInfo::RegisterValueMap caller_registers; + + for (int i = 0; kRegisterNames[i]; ++i) { + caller_registers[kRegisterNames[i]] = last_frame->context.iregs[i]; + callee_registers[kRegisterNames[i]] = last_frame->context.iregs[i]; + } + + if (!cfi_frame_info->FindCallerRegs(callee_registers, *memory_, + &caller_registers)) { + return NULL; + } + + CFIFrameInfo::RegisterValueMap::const_iterator entry = + caller_registers.find(".cfa"); + + if (entry != caller_registers.end()) { + caller_registers["$sp"] = entry->second; + } + + entry = caller_registers.find(".ra"); + if (entry != caller_registers.end()) { + caller_registers["$ra"] = entry->second; + pc = entry->second - 2 * sizeof(pc); + } + caller_registers["$pc"] = pc; + // Construct a new stack frame given the values the CFI recovered. + scoped_ptr frame(new StackFrameMIPS()); + + for (int i = 0; kRegisterNames[i]; ++i) { + CFIFrameInfo::RegisterValueMap::const_iterator caller_entry = + caller_registers.find(kRegisterNames[i]); + + if (caller_entry != caller_registers.end()) { + // The value of this register is recovered; fill the context with the + // value from caller_registers. + frame->context.iregs[i] = caller_entry->second; + frame->context_validity |= StackFrameMIPS::RegisterValidFlag(i); + } else if (((i >= INDEX_MIPS_REG_S0 && i <= INDEX_MIPS_REG_S7) || + (i > INDEX_MIPS_REG_GP && i < INDEX_MIPS_REG_RA)) && + (last_frame->context_validity & + StackFrameMIPS::RegisterValidFlag(i))) { + // If the STACK CFI data doesn't mention some callee-save register, and + // it is valid in the callee, assume the callee has not yet changed it. + // Calee-save registers according to the MIPS o32 ABI specification are: + // $s0 to $s7 + // $sp, $s8 + frame->context.iregs[i] = last_frame->context.iregs[i]; + frame->context_validity |= StackFrameMIPS::RegisterValidFlag(i); + } + } + + frame->context.epc = caller_registers["$pc"]; + frame->instruction = caller_registers["$pc"]; + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_PC; + + frame->context.iregs[MD_CONTEXT_MIPS_REG_RA] = caller_registers["$ra"]; + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_RA; + + frame->trust = StackFrame::FRAME_TRUST_CFI; + + return frame.release(); + } else { + uint64_t pc = 0; + + // Populate a dictionary with the valid register values in last_frame. + CFIFrameInfo::RegisterValueMap callee_registers; + // Use the STACK CFI data to recover the caller's register values. + CFIFrameInfo::RegisterValueMap caller_registers; + + for (int i = 0; kRegisterNames[i]; ++i) { + caller_registers[kRegisterNames[i]] = last_frame->context.iregs[i]; + callee_registers[kRegisterNames[i]] = last_frame->context.iregs[i]; + } + + if (!cfi_frame_info->FindCallerRegs(callee_registers, *memory_, + &caller_registers)) { + return NULL; + } + + CFIFrameInfo::RegisterValueMap::const_iterator entry = + caller_registers.find(".cfa"); + + if (entry != caller_registers.end()) { + caller_registers["$sp"] = entry->second; + } + + entry = caller_registers.find(".ra"); + if (entry != caller_registers.end()) { + caller_registers["$ra"] = entry->second; + pc = entry->second - 2 * sizeof(pc); + } + caller_registers["$pc"] = pc; + // Construct a new stack frame given the values the CFI recovered. + scoped_ptr frame(new StackFrameMIPS()); + + for (int i = 0; kRegisterNames[i]; ++i) { + CFIFrameInfo::RegisterValueMap::const_iterator caller_entry = + caller_registers.find(kRegisterNames[i]); + + if (caller_entry != caller_registers.end()) { + // The value of this register is recovered; fill the context with the + // value from caller_registers. + frame->context.iregs[i] = caller_entry->second; + frame->context_validity |= StackFrameMIPS::RegisterValidFlag(i); + } else if (((i >= INDEX_MIPS_REG_S0 && i <= INDEX_MIPS_REG_S7) || + (i >= INDEX_MIPS_REG_GP && i < INDEX_MIPS_REG_RA)) && + (last_frame->context_validity & + StackFrameMIPS::RegisterValidFlag(i))) { + // If the STACK CFI data doesn't mention some callee-save register, and + // it is valid in the callee, assume the callee has not yet changed it. + // Calee-save registers according to the MIPS o32 ABI specification are: + // $s0 to $s7 + // $sp, $s8 + frame->context.iregs[i] = last_frame->context.iregs[i]; + frame->context_validity |= StackFrameMIPS::RegisterValidFlag(i); + } + } + + frame->context.epc = caller_registers["$pc"]; + frame->instruction = caller_registers["$pc"]; + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_PC; + + frame->context.iregs[MD_CONTEXT_MIPS_REG_RA] = caller_registers["$ra"]; + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_RA; + + frame->trust = StackFrame::FRAME_TRUST_CFI; + + return frame.release(); + } +} + +StackFrame* StackwalkerMIPS::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + const vector& frames = *stack->frames(); + StackFrameMIPS* last_frame = static_cast(frames.back()); + scoped_ptr new_frame; + + // See if there is DWARF call frame information covering this address. + scoped_ptr cfi_frame_info( + frame_symbolizer_->FindCFIFrameInfo(last_frame)); + if (cfi_frame_info.get()) + new_frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get())); + + // If caller frame is not found in CFI try analyzing the stack. + if (stack_scan_allowed && !new_frame.get()) { + new_frame.reset(GetCallerByStackScan(frames)); + } + + // If nothing worked, tell the caller. + if (!new_frame.get()) { + return NULL; + } + + // Should we terminate the stack walk? (end-of-stack or broken invariant) + if (TerminateWalk(new_frame->context.epc, + new_frame->context.iregs[MD_CONTEXT_MIPS_REG_SP], + last_frame->context.iregs[MD_CONTEXT_MIPS_REG_SP], + /*first_unwind=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + return NULL; + } + + return new_frame.release(); +} + +StackFrameMIPS* StackwalkerMIPS::GetCallerByStackScan( + const vector& frames) { + const uint32_t kMaxFrameStackSize = 1024; + const uint32_t kMinArgsOnStack = 4; + + StackFrameMIPS* last_frame = static_cast(frames.back()); + + if (context_->context_flags & MD_CONTEXT_MIPS) { + uint32_t last_sp = last_frame->context.iregs[MD_CONTEXT_MIPS_REG_SP]; + uint32_t caller_pc, caller_sp, caller_fp; + + // Return address cannot be obtained directly. + // Force stackwalking. + + // We cannot use frame pointer to get the return address. + // We'll scan the stack for a + // return address. This can happen if last_frame is executing code + // for a module for which we don't have symbols. + int count = kMaxFrameStackSize / sizeof(caller_pc); + + if (frames.size() > 1) { + // In case of mips32 ABI stack frame of a nonleaf function + // must have minimum stack frame assigned for 4 arguments (4 words). + // Move stack pointer for 4 words to avoid reporting non-existing frames + // for all frames except the topmost one. + // There is no way of knowing if topmost frame belongs to a leaf or + // a nonleaf function. + last_sp += kMinArgsOnStack * sizeof(caller_pc); + // Adjust 'count' so that return address is scanned only in limits + // of one stack frame. + count -= kMinArgsOnStack; + } + + do { + // Scanning for return address from stack pointer of the last frame. + if (!ScanForReturnAddress(last_sp, &caller_sp, &caller_pc, count)) { + // If we can't find an instruction pointer even with stack scanning, + // give up. + BPLOG(ERROR) << " ScanForReturnAddress failed "; + return NULL; + } + // Get $fp stored in the stack frame. + if (!memory_->GetMemoryAtAddress(caller_sp - sizeof(caller_pc), + &caller_fp)) { + BPLOG(INFO) << " GetMemoryAtAddress for fp failed " ; + return NULL; + } + + count = count - (caller_sp - last_sp) / sizeof(caller_pc); + // Now scan the next address in the stack. + last_sp = caller_sp + sizeof(caller_pc); + } while ((caller_fp - caller_sp >= kMaxFrameStackSize) && count > 0); + + if (!count) { + BPLOG(INFO) << " No frame found " ; + return NULL; + } + + // ScanForReturnAddress found a reasonable return address. Advance + // $sp to the location above the one where the return address was + // found. + caller_sp += sizeof(caller_pc); + // caller_pc is actually containing $ra value; + // $pc is two instructions before $ra, + // so the caller_pc needs to be decremented accordingly. + caller_pc -= 2 * sizeof(caller_pc); + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameMIPS* frame = new StackFrameMIPS(); + frame->trust = StackFrame::FRAME_TRUST_SCAN; + frame->context = last_frame->context; + frame->context.epc = caller_pc; + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_PC; + frame->instruction = caller_pc; + + frame->context.iregs[MD_CONTEXT_MIPS_REG_SP] = caller_sp; + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_SP; + frame->context.iregs[MD_CONTEXT_MIPS_REG_FP] = caller_fp; + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_FP; + + frame->context.iregs[MD_CONTEXT_MIPS_REG_RA] = + caller_pc + 2 * sizeof(caller_pc); + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_RA; + + return frame; + } else { + uint64_t last_sp = last_frame->context.iregs[MD_CONTEXT_MIPS_REG_SP]; + uint64_t caller_pc, caller_sp, caller_fp; + + // Return address cannot be obtained directly. + // Force stackwalking. + + // We cannot use frame pointer to get the return address. + // We'll scan the stack for a + // return address. This can happen if last_frame is executing code + // for a module for which we don't have symbols. + int count = kMaxFrameStackSize / sizeof(caller_pc); + + do { + // Scanning for return address from stack pointer of the last frame. + if (!ScanForReturnAddress(last_sp, &caller_sp, &caller_pc, count)) { + // If we can't find an instruction pointer even with stack scanning, + // give up. + BPLOG(ERROR) << " ScanForReturnAddress failed "; + return NULL; + } + // Get $fp stored in the stack frame. + if (!memory_->GetMemoryAtAddress(caller_sp - sizeof(caller_pc), + &caller_fp)) { + BPLOG(INFO) << " GetMemoryAtAddress for fp failed " ; + return NULL; + } + + count = count - (caller_sp - last_sp) / sizeof(caller_pc); + // Now scan the next address in the stack. + last_sp = caller_sp + sizeof(caller_pc); + } while ((caller_fp - caller_sp >= kMaxFrameStackSize) && count > 0); + + if (!count) { + BPLOG(INFO) << " No frame found " ; + return NULL; + } + + // ScanForReturnAddress found a reasonable return address. Advance + // $sp to the location above the one where the return address was + // found. + caller_sp += sizeof(caller_pc); + // caller_pc is actually containing $ra value; + // $pc is two instructions before $ra, + // so the caller_pc needs to be decremented accordingly. + caller_pc -= 2 * sizeof(caller_pc); + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameMIPS* frame = new StackFrameMIPS(); + frame->trust = StackFrame::FRAME_TRUST_SCAN; + frame->context = last_frame->context; + frame->context.epc = caller_pc; + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_PC; + frame->instruction = caller_pc; + + frame->context.iregs[MD_CONTEXT_MIPS_REG_SP] = caller_sp; + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_SP; + frame->context.iregs[MD_CONTEXT_MIPS_REG_FP] = caller_fp; + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_FP; + + frame->context.iregs[MD_CONTEXT_MIPS_REG_RA] = + caller_pc + 2 * sizeof(caller_pc); + frame->context_validity |= StackFrameMIPS::CONTEXT_VALID_RA; + + return frame; + } +} + +} // namespace google_breakpad + diff --git a/src/processor/stackwalker_mips.h b/src/processor/stackwalker_mips.h new file mode 100644 index 0000000..e977607 --- /dev/null +++ b/src/processor/stackwalker_mips.h @@ -0,0 +1,84 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_mips.h: MIPS-specific stackwalker. +// +// Provides stack frames given MIPS register context and a memory region +// corresponding to a MIPSstack. +// +// Author: Tata Elxsi + +#ifndef PROCESSOR_STACKWALKER_MIPS_H__ +#define PROCESSOR_STACKWALKER_MIPS_H__ + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/cfi_frame_info.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerMIPS : public Stackwalker { + public: + // Context is a MIPS context object that gives access to mips-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly + // through to the base Stackwalker constructor. + StackwalkerMIPS(const SystemInfo* system_info, + const MDRawContextMIPS* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + private: + // Implementation of Stackwalker, using mips context and stack conventions. + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed); + + // Use cfi_frame_info (derived from STACK CFI records) to construct + // the frame that called frames.back(). The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameMIPS* GetCallerByCFIFrameInfo(const vector& frames, + CFIFrameInfo* cfi_frame_info); + + // Scan the stack for plausible return address and frame pointer pair. + // The caller takes ownership of the returned frame. Return NULL on failure. + StackFrameMIPS* GetCallerByStackScan(const vector& frames); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextMIPS* context_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_STACKWALKER_MIPS_H__ diff --git a/src/processor/stackwalker_mips64_unittest.cc b/src/processor/stackwalker_mips64_unittest.cc new file mode 100644 index 0000000..55b7503 --- /dev/null +++ b/src/processor/stackwalker_mips64_unittest.cc @@ -0,0 +1,722 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Veljko Mihailovic + +// stackwalker_mips64_unittest.cc: Unit tests for StackwalkerMIPS class for +// mips64 platforms. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/stackwalker_unittest_utils.h" +#include "processor/stackwalker_mips.h" +#include "processor/windows_frame_info.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::StackFrameSymbolizer; +using google_breakpad::StackFrame; +using google_breakpad::StackFrameMIPS; +using google_breakpad::Stackwalker; +using google_breakpad::StackwalkerMIPS; +using google_breakpad::SystemInfo; +using google_breakpad::WindowsFrameInfo; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using std::vector; +using testing::_; +using testing::AnyNumber; +using testing::DoAll; +using testing::Return; +using testing::SetArgumentPointee; +using testing::Test; + +class StackwalkerMIPSFixture { + public: + StackwalkerMIPSFixture() + : stack_section(kLittleEndian), + // Give the two modules reasonable standard locations and names + // for tests to play with. + module1(0x00400000, 0x10000, "module1", "version1"), + module2(0x00500000, 0x10000, "module2", "version2") { + // Identify the system as a Linux system. + system_info.os = "Linux"; + system_info.os_short = "linux"; + system_info.os_version = "Observant Opossum"; // Jealous Jellyfish + system_info.cpu = "mips64"; + system_info.cpu_info = ""; + + // Put distinctive values in the raw CPU context. + BrandContext(&raw_context); + + // Create some modules with some stock debugging information. + modules.Add(&module1); + modules.Add(&module2); + + // By default, none of the modules have symbol info; call + // SetModuleSymbols to override this. + EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _, _)) + .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND)); + + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + + // Reset max_frames_scanned since it's static. + Stackwalker::set_max_frames_scanned(1024); + } + + // Set the Breakpad symbol information that supplier should return for + // MODULE to INFO. + void SetModuleSymbols(MockCodeModule* module, const string& info) { + size_t buffer_size; + char* buffer = supplier.CopySymbolDataAndOwnTheCopy(info, &buffer_size); + EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _, _)) + .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer), + SetArgumentPointee<4>(buffer_size), + Return(MockSymbolSupplier::FOUND))); + } + + // Populate stack_region with the contents of stack_section. Use + // stack_section.start() as the region's starting address. + void RegionFromSection() { + string contents; + ASSERT_TRUE(stack_section.GetContents(&contents)); + stack_region.Init(stack_section.start().Value(), contents); + } + + // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking. + void BrandContext(MDRawContextMIPS* raw_context) { + uint8_t x = 173; + for (size_t i = 0; i < sizeof(*raw_context); ++i) + reinterpret_cast(raw_context)[i] = (x += 17); + } + + SystemInfo system_info; + MDRawContextMIPS raw_context; + Section stack_section; + MockMemoryRegion stack_region; + MockCodeModule module1; + MockCodeModule module2; + MockCodeModules modules; + MockSymbolSupplier supplier; + BasicSourceLineResolver resolver; + CallStack call_stack; + const vector* frames; +}; + +class SanityCheck: public StackwalkerMIPSFixture, public Test { }; + +TEST_F(SanityCheck, NoResolver) { + raw_context.context_flags = + raw_context.context_flags | MD_CONTEXT_MIPS64_FULL; + stack_section.start() = 0x80000000; + stack_section.D64(0).D64(0x0); + RegionFromSection(); + raw_context.epc = 0x00400020; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + + StackFrameSymbolizer frame_symbolizer(NULL, NULL); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + // This should succeed, even without a resolver or supplier. + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameMIPS* frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetContextFrame: public StackwalkerMIPSFixture, public Test { }; + +TEST_F(GetContextFrame, Simple) { + raw_context.context_flags = + raw_context.context_flags | MD_CONTEXT_MIPS64_FULL; + stack_section.start() = 0x80000000; + stack_section.D64(0).D64(0x0); + RegionFromSection(); + raw_context.epc = 0x00400020; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + StackFrameMIPS* frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +// The stackwalker should be able to produce the context frame even +// without stack memory present. +TEST_F(GetContextFrame, NoStackMemory) { + raw_context.context_flags = + raw_context.context_flags | MD_CONTEXT_MIPS64_FULL; + raw_context.epc = 0x00400020; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, NULL, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + StackFrameMIPS* frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetCallerFrame: public StackwalkerMIPSFixture, public Test { }; + +TEST_F(GetCallerFrame, ScanWithoutSymbols) { + raw_context.context_flags = + raw_context.context_flags | MD_CONTEXT_MIPS64_FULL; + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + // Force scanning through three frames to ensure that the + // stack pointer is set properly in scan-recovered frames. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x00400100; + uint64_t return_address2 = 0x00400900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(32, 0) // space + + .D64(0x00490000) // junk that's not + .D64(0x00600000) // a return address + + .D64(frame1_sp) // stack pointer + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(32, 0) // space + + .D64(0xF0000000) // more junk + .D64(0x0000000D) + + .D64(frame2_sp) // stack pointer + .D64(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.epc = 0x00405510; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = stack_section.start().Value(); + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = return_address1; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameMIPS* frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameMIPS::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameMIPS* frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | + StackFrameMIPS::CONTEXT_VALID_SP | + StackFrameMIPS::CONTEXT_VALID_FP | + StackFrameMIPS::CONTEXT_VALID_RA), + frame1->context_validity); + EXPECT_EQ(return_address1 - 2 * sizeof(return_address1), frame1->context.epc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); + + StackFrameMIPS* frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame2->trust); + ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | + StackFrameMIPS::CONTEXT_VALID_SP | + StackFrameMIPS::CONTEXT_VALID_FP | + StackFrameMIPS::CONTEXT_VALID_RA), + frame2->context_validity); + EXPECT_EQ(return_address2 - 2 * sizeof(return_address2), frame2->context.epc); + EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_MIPS_REG_SP]); +} + +TEST_F(GetCallerFrame, ScanWithFunctionSymbols) { + raw_context.context_flags = + raw_context.context_flags | MD_CONTEXT_MIPS64_FULL; + // During stack scanning, if a potential return address + // is located within a loaded module that has symbols, + // it is only considered a valid return address if it + // lies within a function's bounds. + stack_section.start() = 0x80000000; + uint64_t return_address = 0x00500200; + Label frame1_sp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x00490000) // junk that's not + .D64(0x00600000) // a return address + + .D64(0x00401000) // a couple of plausible addresses + .D64(0x0050F000) // that are not within functions + + .D64(frame1_sp) // stack pointer + .D64(return_address) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.epc = 0x00400200; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = stack_section.start().Value(); + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = return_address; + + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 100 400 10 monotreme\n"); + SetModuleSymbols(&module2, + // The calling frame's function. + "FUNC 100 400 10 marsupial\n"); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameMIPS* frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameMIPS::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + EXPECT_EQ("monotreme", frame0->function_name); + EXPECT_EQ(0x00400100U, frame0->function_base); + + StackFrameMIPS* frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | + StackFrameMIPS::CONTEXT_VALID_SP | + StackFrameMIPS::CONTEXT_VALID_FP | + StackFrameMIPS::CONTEXT_VALID_RA), + frame1->context_validity); + EXPECT_EQ(return_address - 2 * sizeof(return_address), frame1->context.epc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); + EXPECT_EQ("marsupial", frame1->function_name); + EXPECT_EQ(0x00500100U, frame1->function_base); +} + +TEST_F(GetCallerFrame, CheckStackFrameSizeLimit) { + raw_context.context_flags = + raw_context.context_flags | MD_CONTEXT_MIPS64_FULL; + // If the stackwalker resorts to stack scanning, it will scan only + // 1024 bytes of stack which correspondes to maximum size of stack frame. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x00500100; + uint64_t return_address2 = 0x00500900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(32, 0) // space + + .D64(0x00490000) // junk that's not + .D64(0x00600000) // a return address + + .Append(96, 0) // more space + + .D64(frame1_sp) // stack pointer + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(128 * 4, 0) // space + + .D64(0x00F00000) // more junk + .D64(0x0000000D) + + .Append(128 * 4, 0) // more space + + .D64(frame2_sp) // stack pointer + .D64(return_address2) // actual return address + // (won't be found) + // frame 2 + .Mark(&frame2_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.epc = 0x00405510; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = stack_section.start().Value(); + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = return_address1; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameMIPS* frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameMIPS::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameMIPS* frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | + StackFrameMIPS::CONTEXT_VALID_SP | + StackFrameMIPS::CONTEXT_VALID_FP | + StackFrameMIPS::CONTEXT_VALID_RA), + frame1->context_validity); + EXPECT_EQ(return_address1 - 2 * sizeof(return_address1), frame1->context.epc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); +} + +// Test that set_max_frames_scanned prevents using stack scanning +// to find caller frames. +TEST_F(GetCallerFrame, ScanningNotAllowed) { + raw_context.context_flags = + raw_context.context_flags | MD_CONTEXT_MIPS64_FULL; + // When the stack walker resorts to scanning the stack, + // only fixed number of frames are allowed to be scanned out from stack + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x00500100; + uint64_t return_address2 = 0x00500900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(32, 0) // space + + .D64(0x00490000) // junk that's not + .D64(0x00600000) // a return address + + .Append(96, 0) // more space + + .D64(frame1_sp) // stack pointer + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(128 * 4, 0) // space + + .D64(0x00F00000) // more junk + .D64(0x0000000D) + + .Append(128 * 4, 0) // more space + + .D64(frame2_sp) // stack pointer + .D64(return_address2) // actual return address + // (won't be found) + // frame 2 + .Mark(&frame2_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.epc = 0x00405510; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = stack_section.start().Value(); + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = return_address1; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + Stackwalker::set_max_frames_scanned(0); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + + StackFrameMIPS* frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameMIPS::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); +} + +struct CFIFixture: public StackwalkerMIPSFixture { + CFIFixture() { + // Provide some STACK CFI records; + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 4000 1000 0 enchiridion\n" + // Initially, nothing has been pushed on the stack, + // and the return address is still in the $ra register. + "STACK CFI INIT 4000 1000 .cfa: $sp 0 + .ra: $ra\n" + // Move stack pointer. + "STACK CFI 4004 .cfa: $sp 32 +\n" + // store $fp and ra + "STACK CFI 4008 $fp: .cfa -8 + ^ .ra: .cfa -4 + ^\n" + // restore $fp + "STACK CFI 400c .cfa: $fp 32 +\n" + // restore $sp + "STACK CFI 4018 .cfa: $sp 32 +\n" + + "STACK CFI 4020 $fp: $fp .cfa: $sp 0 + .ra: .ra\n" + + // The calling function. + "FUNC 5000 1000 0 epictetus\n" + // Mark it as end of stack. + "STACK CFI INIT 5000 8 .cfa: $sp 0 + .ra: $ra\n" + + // A function whose CFI makes the stack pointer + // go backwards. + "FUNC 6000 1000 20 palinal\n" + "STACK CFI INIT 6000 1000 .cfa: $sp 4 - .ra: $ra\n" + + // A function with CFI expressions that can't be + // evaluated. + "FUNC 7000 1000 20 rhetorical\n" + "STACK CFI INIT 7000 1000 .cfa: moot .ra: ambiguous\n" + ); + + // Provide some distinctive values for the caller's registers. + expected.epc = 0x00405500; + expected.iregs[MD_CONTEXT_MIPS_REG_S0] = 0x0; + expected.iregs[MD_CONTEXT_MIPS_REG_S1] = 0x1; + expected.iregs[MD_CONTEXT_MIPS_REG_S2] = 0x2; + expected.iregs[MD_CONTEXT_MIPS_REG_S3] = 0x3; + expected.iregs[MD_CONTEXT_MIPS_REG_S4] = 0x4; + expected.iregs[MD_CONTEXT_MIPS_REG_S5] = 0x5; + expected.iregs[MD_CONTEXT_MIPS_REG_S6] = 0x6; + expected.iregs[MD_CONTEXT_MIPS_REG_S7] = 0x7; + expected.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + expected.iregs[MD_CONTEXT_MIPS_REG_FP] = 0x80000000; + expected.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; + + // Expect CFI to recover all callee-save registers. Since CFI is the + // only stack frame construction technique we have, aside from the + // context frame itself, there's no way for us to have a set of valid + // registers smaller than this. + expected_validity = (StackFrameMIPS::CONTEXT_VALID_PC | + StackFrameMIPS::CONTEXT_VALID_S0 | + StackFrameMIPS::CONTEXT_VALID_S1 | + StackFrameMIPS::CONTEXT_VALID_S2 | + StackFrameMIPS::CONTEXT_VALID_S3 | + StackFrameMIPS::CONTEXT_VALID_S4 | + StackFrameMIPS::CONTEXT_VALID_S5 | + StackFrameMIPS::CONTEXT_VALID_S6 | + StackFrameMIPS::CONTEXT_VALID_S7 | + StackFrameMIPS::CONTEXT_VALID_SP | + StackFrameMIPS::CONTEXT_VALID_FP | + StackFrameMIPS::CONTEXT_VALID_GP | + StackFrameMIPS::CONTEXT_VALID_RA); + + // By default, context frames provide all registers, as normal. + context_frame_validity = StackFrameMIPS::CONTEXT_VALID_ALL; + + // By default, registers are unchanged. + raw_context = expected; + } + + // Walk the stack, using stack_section as the contents of the stack + // and raw_context as the current register values. (Set the stack + // pointer to the stack's starting address.) Expect two stack + // frames; in the older frame, expect the callee-saves registers to + // have values matching those in 'expected'. + void CheckWalk() { + RegionFromSection(); + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameMIPS* frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameMIPS::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ("enchiridion", frame0->function_name); + EXPECT_EQ(0x00404000U, frame0->function_base); + + StackFrameMIPS* frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ(expected_validity, frame1->context_validity); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S0], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S0]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S1], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S1]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S2], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S2]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S3], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S3]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S4], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S4]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S5], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S5]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S6], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S6]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S7], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S7]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_FP], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_FP]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_RA], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_RA]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_SP], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); + EXPECT_EQ(expected.epc, frame1->context.epc); + EXPECT_EQ(expected.epc, frame1->instruction); + EXPECT_EQ("epictetus", frame1->function_name); + EXPECT_EQ(0x00405000U, frame1->function_base); + } + + // The values we expect to find for the caller's registers. Forcibly + // default-init it, since it's POD and not all bits are always overwritten by + // the constructor. + MDRawContextMIPS expected{}; + + // The validity mask for expected. + int expected_validity; + + // The validity mask to impose on the context frame. + int context_frame_validity; +}; + +class CFI: public CFIFixture, public Test { }; + +// TODO(gordanac): add CFI tests + +TEST_F(CFI, At4004) { + raw_context.context_flags = + raw_context.context_flags | MD_CONTEXT_MIPS64_FULL; + Label frame1_sp = expected.iregs[MD_CONTEXT_MIPS_REG_SP]; + stack_section + // frame0 + .Append(16, 0) // space + .D64(frame1_sp) // stack pointer + .D64(0x00405510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.epc = 0x00404004; + CheckWalk(); +} + +// Check that we reject rules that would cause the stack pointer to +// move in the wrong direction. +TEST_F(CFI, RejectBackwards) { + raw_context.context_flags = + raw_context.context_flags | MD_CONTEXT_MIPS64_FULL; + raw_context.epc = 0x40005000; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} + +// Check that we reject rules whose expressions' evaluation fails. +TEST_F(CFI, RejectBadExpressions) { + raw_context.context_flags = + raw_context.context_flags | MD_CONTEXT_MIPS64_FULL; + raw_context.epc = 0x00407000; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} diff --git a/src/processor/stackwalker_mips_unittest.cc b/src/processor/stackwalker_mips_unittest.cc new file mode 100644 index 0000000..305f4db --- /dev/null +++ b/src/processor/stackwalker_mips_unittest.cc @@ -0,0 +1,708 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Gordana Cmiljanovic + +// stackwalker_mips_unittest.cc: Unit tests for StackwalkerMIPS class. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/stackwalker_unittest_utils.h" +#include "processor/stackwalker_mips.h" +#include "processor/windows_frame_info.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::StackFrameSymbolizer; +using google_breakpad::StackFrame; +using google_breakpad::StackFrameMIPS; +using google_breakpad::Stackwalker; +using google_breakpad::StackwalkerMIPS; +using google_breakpad::SystemInfo; +using google_breakpad::WindowsFrameInfo; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using std::vector; +using testing::_; +using testing::AnyNumber; +using testing::DoAll; +using testing::Return; +using testing::SetArgumentPointee; +using testing::Test; + +class StackwalkerMIPSFixture { + public: + StackwalkerMIPSFixture() + : stack_section(kLittleEndian), + // Give the two modules reasonable standard locations and names + // for tests to play with. + module1(0x00400000, 0x10000, "module1", "version1"), + module2(0x00500000, 0x10000, "module2", "version2") { + // Identify the system as a Linux system. + system_info.os = "Linux"; + system_info.os_short = "linux"; + system_info.os_version = "Observant Opossum"; // Jealous Jellyfish + system_info.cpu = "mips"; + system_info.cpu_info = ""; + + // Put distinctive values in the raw CPU context. + BrandContext(&raw_context); + + // Create some modules with some stock debugging information. + modules.Add(&module1); + modules.Add(&module2); + + // By default, none of the modules have symbol info; call + // SetModuleSymbols to override this. + EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _, _)) + .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND)); + + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + + // Reset max_frames_scanned since it's static. + Stackwalker::set_max_frames_scanned(1024); + } + + // Set the Breakpad symbol information that supplier should return for + // MODULE to INFO. + void SetModuleSymbols(MockCodeModule* module, const string& info) { + size_t buffer_size; + char* buffer = supplier.CopySymbolDataAndOwnTheCopy(info, &buffer_size); + EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _, _)) + .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer), + SetArgumentPointee<4>(buffer_size), + Return(MockSymbolSupplier::FOUND))); + } + + // Populate stack_region with the contents of stack_section. Use + // stack_section.start() as the region's starting address. + void RegionFromSection() { + string contents; + ASSERT_TRUE(stack_section.GetContents(&contents)); + stack_region.Init(stack_section.start().Value(), contents); + } + + // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking. + void BrandContext(MDRawContextMIPS* raw_context) { + uint8_t x = 173; + for (size_t i = 0; i < sizeof(*raw_context); ++i) + reinterpret_cast(raw_context)[i] = (x += 17); + } + + SystemInfo system_info; + MDRawContextMIPS raw_context; + Section stack_section; + MockMemoryRegion stack_region; + MockCodeModule module1; + MockCodeModule module2; + MockCodeModules modules; + MockSymbolSupplier supplier; + BasicSourceLineResolver resolver; + CallStack call_stack; + const vector* frames; +}; + +class SanityCheck: public StackwalkerMIPSFixture, public Test { }; + +TEST_F(SanityCheck, NoResolver) { + raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; + stack_section.start() = 0x80000000; + stack_section.D32(0).D32(0x0); + RegionFromSection(); + raw_context.epc = 0x00400020; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + + StackFrameSymbolizer frame_symbolizer(NULL, NULL); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + // This should succeed, even without a resolver or supplier. + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameMIPS* frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetContextFrame: public StackwalkerMIPSFixture, public Test { }; + +TEST_F(GetContextFrame, Simple) { + raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; + stack_section.start() = 0x80000000; + stack_section.D32(0).D32(0x0); + RegionFromSection(); + raw_context.epc = 0x00400020; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + StackFrameMIPS* frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +// The stackwalker should be able to produce the context frame even +// without stack memory present. +TEST_F(GetContextFrame, NoStackMemory) { + raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; + raw_context.epc = 0x00400020; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, NULL, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + StackFrameMIPS* frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetCallerFrame: public StackwalkerMIPSFixture, public Test { }; + +TEST_F(GetCallerFrame, ScanWithoutSymbols) { + raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + // Force scanning through three frames to ensure that the + // stack pointer is set properly in scan-recovered frames. + stack_section.start() = 0x80000000; + uint32_t return_address1 = 0x00400100; + uint32_t return_address2 = 0x00400900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D32(0x00490000) // junk that's not + .D32(0x00600000) // a return address + + .D32(frame1_sp) // stack pointer + .D32(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) // space + + .D32(0xF0000000) // more junk + .D32(0x0000000D) + + .D32(frame2_sp) // stack pointer + .D32(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.epc = 0x00405510; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = stack_section.start().Value(); + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = return_address1; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameMIPS* frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameMIPS::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameMIPS* frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | + StackFrameMIPS::CONTEXT_VALID_SP | + StackFrameMIPS::CONTEXT_VALID_FP | + StackFrameMIPS::CONTEXT_VALID_RA), + frame1->context_validity); + EXPECT_EQ(return_address1 - 2 * sizeof(return_address1), frame1->context.epc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); + + StackFrameMIPS* frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame2->trust); + ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | + StackFrameMIPS::CONTEXT_VALID_SP | + StackFrameMIPS::CONTEXT_VALID_FP | + StackFrameMIPS::CONTEXT_VALID_RA), + frame2->context_validity); + EXPECT_EQ(return_address2 - 2 * sizeof(return_address2), frame2->context.epc); + EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_MIPS_REG_SP]); +} + +TEST_F(GetCallerFrame, ScanWithFunctionSymbols) { + raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; + // During stack scanning, if a potential return address + // is located within a loaded module that has symbols, + // it is only considered a valid return address if it + // lies within a function's bounds. + stack_section.start() = 0x80000000; + uint32_t return_address = 0x00500200; + Label frame1_sp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D32(0x00490000) // junk that's not + .D32(0x00600000) // a return address + + .D32(0x00401000) // a couple of plausible addresses + .D32(0x0050F000) // that are not within functions + + .D32(frame1_sp) // stack pointer + .D32(return_address) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.epc = 0x00400200; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = stack_section.start().Value(); + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = return_address; + + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 100 400 10 monotreme\n"); + SetModuleSymbols(&module2, + // The calling frame's function. + "FUNC 100 400 10 marsupial\n"); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameMIPS* frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameMIPS::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + EXPECT_EQ("monotreme", frame0->function_name); + EXPECT_EQ(0x00400100U, frame0->function_base); + + StackFrameMIPS* frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | + StackFrameMIPS::CONTEXT_VALID_SP | + StackFrameMIPS::CONTEXT_VALID_FP | + StackFrameMIPS::CONTEXT_VALID_RA), + frame1->context_validity); + EXPECT_EQ(return_address - 2 * sizeof(return_address), frame1->context.epc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); + EXPECT_EQ("marsupial", frame1->function_name); + EXPECT_EQ(0x00500100U, frame1->function_base); +} + +TEST_F(GetCallerFrame, CheckStackFrameSizeLimit) { + raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; + // If the stackwalker resorts to stack scanning, it will scan only + // 1024 bytes of stack which correspondes to maximum size of stack frame. + stack_section.start() = 0x80000000; + uint32_t return_address1 = 0x00500100; + uint32_t return_address2 = 0x00500900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(32, 0) // space + + .D32(0x00490000) // junk that's not + .D32(0x00600000) // a return address + + .Append(96, 0) // more space + + .D32(frame1_sp) // stack pointer + .D32(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(128 * 4, 0) // space + + .D32(0x00F00000) // more junk + .D32(0x0000000D) + + .Append(128 * 4, 0) // more space + + .D32(frame2_sp) // stack pointer + .D32(return_address2) // actual return address + // (won't be found) + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.epc = 0x00405510; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = stack_section.start().Value(); + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = return_address1; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameMIPS* frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameMIPS::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameMIPS* frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | + StackFrameMIPS::CONTEXT_VALID_SP | + StackFrameMIPS::CONTEXT_VALID_FP | + StackFrameMIPS::CONTEXT_VALID_RA), + frame1->context_validity); + EXPECT_EQ(return_address1 - 2 * sizeof(return_address1), frame1->context.epc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); +} + +// Test that set_max_frames_scanned prevents using stack scanning +// to find caller frames. +TEST_F(GetCallerFrame, ScanningNotAllowed) { + raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; + // When the stack walker resorts to scanning the stack, + // only fixed number of frames are allowed to be scanned out from stack + stack_section.start() = 0x80000000; + uint32_t return_address1 = 0x00500100; + uint32_t return_address2 = 0x00500900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(32, 0) // space + + .D32(0x00490000) // junk that's not + .D32(0x00600000) // a return address + + .Append(96, 0) // more space + + .D32(frame1_sp) // stack pointer + .D32(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(128 * 4, 0) // space + + .D32(0x00F00000) // more junk + .D32(0x0000000D) + + .Append(128 * 4, 0) // more space + + .D32(frame2_sp) // stack pointer + .D32(return_address2) // actual return address + // (won't be found) + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.epc = 0x00405510; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = stack_section.start().Value(); + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = return_address1; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + Stackwalker::set_max_frames_scanned(0); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + + StackFrameMIPS* frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameMIPS::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); +} + +struct CFIFixture: public StackwalkerMIPSFixture { + CFIFixture() { + // Provide some STACK CFI records; + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 4000 1000 0 enchiridion\n" + // Initially, nothing has been pushed on the stack, + // and the return address is still in the $ra register. + "STACK CFI INIT 4000 1000 .cfa: $sp 0 + .ra: $ra\n" + // Move stack pointer. + "STACK CFI 4004 .cfa: $sp 32 +\n" + // store $fp and ra + "STACK CFI 4008 $fp: .cfa -8 + ^ .ra: .cfa -4 + ^\n" + // restore $fp + "STACK CFI 400c .cfa: $fp 32 +\n" + // restore $sp + "STACK CFI 4018 .cfa: $sp 32 +\n" + + "STACK CFI 4020 $fp: $fp .cfa: $sp 0 + .ra: .ra\n" + + // The calling function. + "FUNC 5000 1000 0 epictetus\n" + // Mark it as end of stack. + "STACK CFI INIT 5000 8 .cfa: $sp 0 + .ra: $ra\n" + + // A function whose CFI makes the stack pointer + // go backwards. + "FUNC 6000 1000 20 palinal\n" + "STACK CFI INIT 6000 1000 .cfa: $sp 4 - .ra: $ra\n" + + // A function with CFI expressions that can't be + // evaluated. + "FUNC 7000 1000 20 rhetorical\n" + "STACK CFI INIT 7000 1000 .cfa: moot .ra: ambiguous\n" + ); + + // Provide some distinctive values for the caller's registers. + expected.epc = 0x00405508; + expected.iregs[MD_CONTEXT_MIPS_REG_S0] = 0x0; + expected.iregs[MD_CONTEXT_MIPS_REG_S1] = 0x1; + expected.iregs[MD_CONTEXT_MIPS_REG_S2] = 0x2; + expected.iregs[MD_CONTEXT_MIPS_REG_S3] = 0x3; + expected.iregs[MD_CONTEXT_MIPS_REG_S4] = 0x4; + expected.iregs[MD_CONTEXT_MIPS_REG_S5] = 0x5; + expected.iregs[MD_CONTEXT_MIPS_REG_S6] = 0x6; + expected.iregs[MD_CONTEXT_MIPS_REG_S7] = 0x7; + expected.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + expected.iregs[MD_CONTEXT_MIPS_REG_FP] = 0x80000000; + expected.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; + + // Expect CFI to recover all callee-save registers. Since CFI is the + // only stack frame construction technique we have, aside from the + // context frame itself, there's no way for us to have a set of valid + // registers smaller than this. + expected_validity = (StackFrameMIPS::CONTEXT_VALID_PC | + StackFrameMIPS::CONTEXT_VALID_S0 | + StackFrameMIPS::CONTEXT_VALID_S1 | + StackFrameMIPS::CONTEXT_VALID_S2 | + StackFrameMIPS::CONTEXT_VALID_S3 | + StackFrameMIPS::CONTEXT_VALID_S4 | + StackFrameMIPS::CONTEXT_VALID_S5 | + StackFrameMIPS::CONTEXT_VALID_S6 | + StackFrameMIPS::CONTEXT_VALID_S7 | + StackFrameMIPS::CONTEXT_VALID_SP | + StackFrameMIPS::CONTEXT_VALID_FP | + StackFrameMIPS::CONTEXT_VALID_RA); + + // By default, context frames provide all registers, as normal. + context_frame_validity = StackFrameMIPS::CONTEXT_VALID_ALL; + + // By default, registers are unchanged. + raw_context = expected; + } + + // Walk the stack, using stack_section as the contents of the stack + // and raw_context as the current register values. (Set the stack + // pointer to the stack's starting address.) Expect two stack + // frames; in the older frame, expect the callee-saves registers to + // have values matching those in 'expected'. + void CheckWalk() { + RegionFromSection(); + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameMIPS* frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameMIPS::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ("enchiridion", frame0->function_name); + EXPECT_EQ(0x00404000U, frame0->function_base); + + StackFrameMIPS* frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ(expected_validity, frame1->context_validity); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S0], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S0]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S1], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S1]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S2], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S2]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S3], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S3]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S4], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S4]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S5], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S5]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S6], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S6]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_S7], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_S7]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_FP], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_FP]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_RA], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_RA]); + EXPECT_EQ(expected.iregs[MD_CONTEXT_MIPS_REG_SP], + frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); + EXPECT_EQ(expected.epc, frame1->context.epc); + EXPECT_EQ(expected.epc, frame1->instruction); + EXPECT_EQ("epictetus", frame1->function_name); + EXPECT_EQ(0x00405000U, frame1->function_base); + } + + // The values we expect to find for the caller's registers. + MDRawContextMIPS expected; + + // The validity mask for expected. + int expected_validity; + + // The validity mask to impose on the context frame. + int context_frame_validity; +}; + +class CFI: public CFIFixture, public Test { }; + +// TODO(gordanac): add CFI tests + +TEST_F(CFI, At4004) { + raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; + Label frame1_sp = expected.iregs[MD_CONTEXT_MIPS_REG_SP]; + stack_section + // frame0 + .Append(24, 0) // space + .D32(frame1_sp) // stack pointer + .D32(0x00405510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.epc = 0x00404004; + CheckWalk(); +} + +// Check that we reject rules that would cause the stack pointer to +// move in the wrong direction. +TEST_F(CFI, RejectBackwards) { + raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; + raw_context.epc = 0x40005000; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} + +// Check that we reject rules whose expressions' evaluation fails. +TEST_F(CFI, RejectBadExpressions) { + raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; + raw_context.epc = 0x00407000; + raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; + raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} diff --git a/src/processor/stackwalker_ppc.cc b/src/processor/stackwalker_ppc.cc new file mode 100644 index 0000000..0083392 --- /dev/null +++ b/src/processor/stackwalker_ppc.cc @@ -0,0 +1,157 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_ppc.cc: ppc-specific stackwalker. +// +// See stackwalker_ppc.h for documentation. +// +// Author: Mark Mentovai + + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/scoped_ptr.h" +#include "processor/stackwalker_ppc.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/logging.h" + +namespace google_breakpad { + + +StackwalkerPPC::StackwalkerPPC(const SystemInfo* system_info, + const MDRawContextPPC* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* resolver_helper) + : Stackwalker(system_info, memory, modules, resolver_helper), + context_(context) { + if (memory_ && memory_->GetBase() + memory_->GetSize() - 1 > 0xffffffff) { + // This implementation only covers 32-bit ppc CPUs. The limits of the + // supplied stack are invalid. Mark memory_ = NULL, which will cause + // stackwalking to fail. + BPLOG(ERROR) << "Memory out of range for stackwalking: " << + HexString(memory_->GetBase()) << "+" << + HexString(memory_->GetSize()); + memory_ = NULL; + } +} + + +StackFrame* StackwalkerPPC::GetContextFrame() { + if (!context_) { + BPLOG(ERROR) << "Can't get context frame without context"; + return NULL; + } + + StackFramePPC* frame = new StackFramePPC(); + + // The instruction pointer is stored directly in a register, so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = StackFramePPC::CONTEXT_VALID_ALL; + frame->trust = StackFrame::FRAME_TRUST_CONTEXT; + frame->instruction = frame->context.srr0; + + return frame; +} + + +StackFrame* StackwalkerPPC::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + // The instruction pointers for previous frames are saved on the stack. + // The typical ppc calling convention is for the called procedure to store + // its return address in the calling procedure's stack frame at 8(%r1), + // and to allocate its own stack frame by decrementing %r1 (the stack + // pointer) and saving the old value of %r1 at 0(%r1). Because the ppc has + // no hardware stack, there is no distinction between the stack pointer and + // frame pointer, and what is typically thought of as the frame pointer on + // an x86 is usually referred to as the stack pointer on a ppc. + + StackFramePPC* last_frame = static_cast( + stack->frames()->back()); + + // A caller frame must reside higher in memory than its callee frames. + // Anything else is an error, or an indication that we've reached the + // end of the stack. + uint32_t stack_pointer; + if (!memory_->GetMemoryAtAddress(last_frame->context.gpr[1], + &stack_pointer) || + stack_pointer <= last_frame->context.gpr[1]) { + return NULL; + } + + // Mac OS X/Darwin gives 1 as the return address from the bottom-most + // frame in a stack (a thread's entry point). I haven't found any + // documentation on this, but 0 or 1 would be bogus return addresses, + // so check for them here and return false (end of stack) when they're + // hit to avoid having a phantom frame. + uint32_t instruction; + if (!memory_->GetMemoryAtAddress(stack_pointer + 8, &instruction) || + instruction <= 1) { + return NULL; + } + + scoped_ptr frame(new StackFramePPC()); + + frame->context = last_frame->context; + frame->context.srr0 = instruction; + frame->context.gpr[1] = stack_pointer; + frame->context_validity = StackFramePPC::CONTEXT_VALID_SRR0 | + StackFramePPC::CONTEXT_VALID_GPR1; + frame->trust = StackFrame::FRAME_TRUST_FP; + + // Should we terminate the stack walk? (end-of-stack or broken invariant) + if (TerminateWalk(instruction, stack_pointer, last_frame->context.gpr[1], + /*first_unwind=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + return NULL; + } + + // frame->context.srr0 is the return address, which is one instruction + // past the branch that caused us to arrive at the callee. Set + // frame_ppc->instruction to four less than that. Since all ppc + // instructions are 4 bytes wide, this is the address of the branch + // instruction. This allows source line information to match up with the + // line that contains a function call. Callers that require the exact + // return address value may access the context.srr0 field of StackFramePPC. + frame->instruction = frame->context.srr0 - 4; + + return frame.release(); +} + + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_ppc.h b/src/processor/stackwalker_ppc.h new file mode 100644 index 0000000..182e46d --- /dev/null +++ b/src/processor/stackwalker_ppc.h @@ -0,0 +1,78 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_ppc.h: ppc-specific stackwalker. +// +// Provides stack frames given ppc register context and a memory region +// corresponding to a ppc stack. +// +// Author: Mark Mentovai + + +#ifndef PROCESSOR_STACKWALKER_PPC_H__ +#define PROCESSOR_STACKWALKER_PPC_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerPPC : public Stackwalker { + public: + // context is a ppc context object that gives access to ppc-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerPPC(const SystemInfo* system_info, + const MDRawContextPPC* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + private: + // Implementation of Stackwalker, using ppc context (stack pointer in %r1, + // saved program counter in %srr0) and stack conventions (saved stack + // pointer at 0(%r1), return address at 8(0(%r1)). + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextPPC* context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_PPC_H__ diff --git a/src/processor/stackwalker_ppc64.cc b/src/processor/stackwalker_ppc64.cc new file mode 100644 index 0000000..c36d16b --- /dev/null +++ b/src/processor/stackwalker_ppc64.cc @@ -0,0 +1,148 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_ppc64.cc: ppc64-specific stackwalker. +// +// See stackwalker_ppc64.h for documentation. + + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/scoped_ptr.h" +#include "processor/stackwalker_ppc64.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/logging.h" + +#include + +namespace google_breakpad { + + +StackwalkerPPC64::StackwalkerPPC64(const SystemInfo* system_info, + const MDRawContextPPC64* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* resolver_helper) + : Stackwalker(system_info, memory, modules, resolver_helper), + context_(context) { +} + + +StackFrame* StackwalkerPPC64::GetContextFrame() { + if (!context_) { + BPLOG(ERROR) << "Can't get context frame without context"; + return NULL; + } + + StackFramePPC64* frame = new StackFramePPC64(); + + // The instruction pointer is stored directly in a register, so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = StackFramePPC64::CONTEXT_VALID_ALL; + frame->trust = StackFrame::FRAME_TRUST_CONTEXT; + frame->instruction = frame->context.srr0; + + return frame; +} + + +StackFrame* StackwalkerPPC64::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + // The instruction pointers for previous frames are saved on the stack. + // The typical ppc64 calling convention is for the called procedure to store + // its return address in the calling procedure's stack frame at 8(%r1), + // and to allocate its own stack frame by decrementing %r1 (the stack + // pointer) and saving the old value of %r1 at 0(%r1). Because the ppc64 has + // no hardware stack, there is no distinction between the stack pointer and + // frame pointer, and what is typically thought of as the frame pointer on + // an x86 is usually referred to as the stack pointer on a ppc64. + + StackFramePPC64* last_frame = static_cast( + stack->frames()->back()); + + // A caller frame must reside higher in memory than its callee frames. + // Anything else is an error, or an indication that we've reached the + // end of the stack. + uint64_t stack_pointer; + if (!memory_->GetMemoryAtAddress(last_frame->context.gpr[1], + &stack_pointer) || + stack_pointer <= last_frame->context.gpr[1]) { + return NULL; + } + + // Mac OS X/Darwin gives 1 as the return address from the bottom-most + // frame in a stack (a thread's entry point). I haven't found any + // documentation on this, but 0 or 1 would be bogus return addresses, + // so check for them here and return false (end of stack) when they're + // hit to avoid having a phantom frame. + uint64_t instruction; + if (!memory_->GetMemoryAtAddress(stack_pointer + 16, &instruction) || + instruction <= 1) { + return NULL; + } + + scoped_ptr frame(new StackFramePPC64()); + + frame->context = last_frame->context; + frame->context.srr0 = instruction; + frame->context.gpr[1] = stack_pointer; + frame->context_validity = StackFramePPC64::CONTEXT_VALID_SRR0 | + StackFramePPC64::CONTEXT_VALID_GPR1; + frame->trust = StackFrame::FRAME_TRUST_FP; + + // Should we terminate the stack walk? (end-of-stack or broken invariant) + if (TerminateWalk(instruction, stack_pointer, last_frame->context.gpr[1], + /*is_context_frame=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + return NULL; + } + + // frame->context.srr0 is the return address, which is one instruction + // past the branch that caused us to arrive at the callee. Set + // frame_ppc64->instruction to eight less than that. Since all ppc64 + // instructions are 8 bytes wide, this is the address of the branch + // instruction. This allows source line information to match up with the + // line that contains a function call. Callers that require the exact + // return address value may access the context.srr0 field of StackFramePPC64. + frame->instruction = frame->context.srr0 - 8; + + return frame.release(); +} + + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_ppc64.h b/src/processor/stackwalker_ppc64.h new file mode 100644 index 0000000..ede0b51 --- /dev/null +++ b/src/processor/stackwalker_ppc64.h @@ -0,0 +1,76 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_ppc64.h: ppc-specific stackwalker. +// +// Provides stack frames given ppc64 register context and a memory region +// corresponding to a ppc64 stack. + + +#ifndef PROCESSOR_STACKWALKER_PPC64_H__ +#define PROCESSOR_STACKWALKER_PPC64_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerPPC64 : public Stackwalker { + public: + // context is a ppc64 context object that gives access to ppc64-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerPPC64(const SystemInfo* system_info, + const MDRawContextPPC64* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + private: + // Implementation of Stackwalker, using ppc64 context (stack pointer in %r1, + // saved program counter in %srr0) and stack conventions (saved stack + // pointer at 0(%r1), return address at 8(0(%r1)). + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextPPC64* context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_PPC64_H__ diff --git a/src/processor/stackwalker_riscv.cc b/src/processor/stackwalker_riscv.cc new file mode 100644 index 0000000..c3681a6 --- /dev/null +++ b/src/processor/stackwalker_riscv.cc @@ -0,0 +1,539 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* stackwalker_riscv.cc: riscv-specific stackwalker. + * + * See stackwalker_riscv.h for documentation. + * + * Author: Iacopo Colonnelli + */ + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/cfi_frame_info.h" +#include "processor/logging.h" +#include "processor/stackwalker_riscv.h" + +namespace google_breakpad { + +StackwalkerRISCV::StackwalkerRISCV(const SystemInfo* system_info, + const MDRawContextRISCV* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* resolver_helper) + : Stackwalker(system_info, memory, modules, resolver_helper), + context_(context), + context_frame_validity_(StackFrameRISCV::CONTEXT_VALID_ALL) { +} + + +StackFrame* StackwalkerRISCV::GetContextFrame() { + if (!context_) { + BPLOG(ERROR) << "Can't get context frame without context"; + return NULL; + } + + StackFrameRISCV* frame = new StackFrameRISCV(); + + frame->context = *context_; + frame->context_validity = context_frame_validity_; + frame->trust = StackFrame::FRAME_TRUST_CONTEXT; + frame->instruction = frame->context.pc; + + return frame; +} + +StackFrameRISCV* StackwalkerRISCV::GetCallerByCFIFrameInfo( + const vector& frames, + CFIFrameInfo* cfi_frame_info) { + StackFrameRISCV* last_frame = + static_cast(frames.back()); + + // Populate a dictionary with the valid register values in last_frame. + CFIFrameInfo::RegisterValueMap callee_registers; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_PC) + callee_registers["pc"] = last_frame->context.pc; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_RA) + callee_registers["ra"] = last_frame->context.ra; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_SP) + callee_registers["sp"] = last_frame->context.sp; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_GP) + callee_registers["gp"] = last_frame->context.gp; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_TP) + callee_registers["tp"] = last_frame->context.tp; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_T0) + callee_registers["t0"] = last_frame->context.t0; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_T1) + callee_registers["t1"] = last_frame->context.t1; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_T2) + callee_registers["t2"] = last_frame->context.t2; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S0) + callee_registers["s0"] = last_frame->context.s0; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S1) + callee_registers["s1"] = last_frame->context.s1; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_A0) + callee_registers["a0"] = last_frame->context.a0; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_A1) + callee_registers["a1"] = last_frame->context.a1; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_A2) + callee_registers["a2"] = last_frame->context.a2; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_A3) + callee_registers["a3"] = last_frame->context.a3; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_A4) + callee_registers["a4"] = last_frame->context.a4; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_A5) + callee_registers["a5"] = last_frame->context.a5; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_A6) + callee_registers["a6"] = last_frame->context.a6; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_A7) + callee_registers["a7"] = last_frame->context.a7; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S2) + callee_registers["s2"] = last_frame->context.s2; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S3) + callee_registers["s3"] = last_frame->context.s3; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S4) + callee_registers["s4"] = last_frame->context.s4; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S5) + callee_registers["s5"] = last_frame->context.s5; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S6) + callee_registers["s6"] = last_frame->context.s6; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S7) + callee_registers["s7"] = last_frame->context.s7; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S8) + callee_registers["s8"] = last_frame->context.s8; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S9) + callee_registers["s9"] = last_frame->context.s9; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S10) + callee_registers["s10"] = last_frame->context.s10; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_S11) + callee_registers["s11"] = last_frame->context.s11; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_T3) + callee_registers["t3"] = last_frame->context.t3; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_T4) + callee_registers["t4"] = last_frame->context.t4; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_T5) + callee_registers["t5"] = last_frame->context.t5; + if (last_frame->context_validity & StackFrameRISCV::CONTEXT_VALID_T6) + callee_registers["t6"] = last_frame->context.t6; + + // Use the STACK CFI data to recover the caller's register values. + CFIFrameInfo::RegisterValueMap caller_registers; + if (!cfi_frame_info->FindCallerRegs(callee_registers, *memory_, + &caller_registers)) { + return NULL; + } + + // Construct a new stack frame given the values the CFI recovered. + CFIFrameInfo::RegisterValueMap::iterator entry; + scoped_ptr frame(new StackFrameRISCV()); + entry = caller_registers.find("pc"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_PC; + frame->context.pc = entry->second; + } else{ + // If the CFI doesn't recover the PC explicitly, then use .ra. + entry = caller_registers.find(".ra"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_PC; + frame->context.pc = entry->second; + } + } + entry = caller_registers.find("ra"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_RA; + frame->context.ra = entry->second; + } + entry = caller_registers.find("sp"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_SP; + frame->context.sp = entry->second; + } else { + // If the CFI doesn't recover the SP explicitly, then use .cfa. + entry = caller_registers.find(".cfa"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_SP; + frame->context.sp = entry->second; + } + } + entry = caller_registers.find("gp"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_GP; + frame->context.gp = entry->second; + } + entry = caller_registers.find("tp"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_TP; + frame->context.tp = entry->second; + } + entry = caller_registers.find("t0"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_T0; + frame->context.t0 = entry->second; + } + entry = caller_registers.find("t1"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_T1; + frame->context.t1 = entry->second; + } + entry = caller_registers.find("t2"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_T2; + frame->context.t2 = entry->second; + } + entry = caller_registers.find("s0"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S0; + frame->context.s0 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S0) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S0; + frame->context.s0 = last_frame->context.s0; + } + entry = caller_registers.find("s1"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S1; + frame->context.s1 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S1) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S1; + frame->context.s1 = last_frame->context.s1; + } + entry = caller_registers.find("a0"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_A0; + frame->context.a0 = entry->second; + } + entry = caller_registers.find("a1"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_A1; + frame->context.a1 = entry->second; + } + entry = caller_registers.find("a2"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_A2; + frame->context.a2 = entry->second; + } + entry = caller_registers.find("a3"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_A3; + frame->context.a3 = entry->second; + } + entry = caller_registers.find("a4"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_A4; + frame->context.a4 = entry->second; + } + entry = caller_registers.find("a5"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_A5; + frame->context.a5 = entry->second; + } + entry = caller_registers.find("a6"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_A6; + frame->context.a6 = entry->second; + } + entry = caller_registers.find("a7"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_A7; + frame->context.a7 = entry->second; + } + entry = caller_registers.find("s2"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S2; + frame->context.s2 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S2) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S2; + frame->context.s2 = last_frame->context.s2; + } + entry = caller_registers.find("s3"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S3; + frame->context.s3 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S3) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S3; + frame->context.s3 = last_frame->context.s3; + } + entry = caller_registers.find("s4"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S4; + frame->context.s4 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S4) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S4; + frame->context.s4 = last_frame->context.s4; + } + entry = caller_registers.find("s5"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S5; + frame->context.s5 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S5) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S5; + frame->context.s5 = last_frame->context.s5; + } + entry = caller_registers.find("s6"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S6; + frame->context.s6 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S6) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S6; + frame->context.s6 = last_frame->context.s6; + } + entry = caller_registers.find("s7"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S7; + frame->context.s7 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S7) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S7; + frame->context.s7 = last_frame->context.s7; + } + entry = caller_registers.find("s8"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S8; + frame->context.s8 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S8) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S8; + frame->context.s8 = last_frame->context.s8; + } + entry = caller_registers.find("s9"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S9; + frame->context.s9 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S9) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S9; + frame->context.s9 = last_frame->context.s9; + } + entry = caller_registers.find("s10"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S10; + frame->context.s10 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S10) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S10; + frame->context.s10 = last_frame->context.s10; + } + entry = caller_registers.find("s11"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S11; + frame->context.s11 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV::CONTEXT_VALID_S11) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_S11; + frame->context.s11 = last_frame->context.s11; + } + entry = caller_registers.find("t3"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_T3; + frame->context.t3 = entry->second; + } + entry = caller_registers.find("t4"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_T4; + frame->context.t4 = entry->second; + } + entry = caller_registers.find("t5"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_T5; + frame->context.t5 = entry->second; + } + entry = caller_registers.find("t6"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV::CONTEXT_VALID_T6; + frame->context.t6 = entry->second; + } + + // If we didn't recover the PC and the SP, then the frame isn't very useful. + static const uint64_t essentials = (StackFrameRISCV::CONTEXT_VALID_SP + | StackFrameRISCV::CONTEXT_VALID_PC); + if ((frame->context_validity & essentials) != essentials) + return NULL; + + frame->trust = StackFrame::FRAME_TRUST_CFI; + return frame.release(); +} + +StackFrameRISCV* StackwalkerRISCV::GetCallerByStackScan( + const vector& frames) { + StackFrameRISCV* last_frame = + static_cast(frames.back()); + uint32_t last_sp = last_frame->context.sp; + uint32_t caller_sp, caller_pc; + + if (!ScanForReturnAddress(last_sp, &caller_sp, &caller_pc, + last_frame->trust == StackFrame::FRAME_TRUST_CONTEXT)) { + // No plausible return address was found. + return NULL; + } + + // ScanForReturnAddress found a reasonable return address. Advance + // sp to the location above the one where the return address was + // found. + caller_sp += 4; + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameRISCV* frame = new StackFrameRISCV(); + + frame->trust = StackFrame::FRAME_TRUST_SCAN; + frame->context = last_frame->context; + frame->context.pc = caller_pc; + frame->context.sp = caller_sp; + frame->context_validity = StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_SP; + + return frame; +} + + StackFrameRISCV* StackwalkerRISCV::GetCallerByFramePointer( + const vector& frames) { + StackFrameRISCV* last_frame = + static_cast(frames.back()); + + uint32_t last_fp = last_frame->context.s0; + + uint32_t caller_fp = 0; + if (last_fp && !memory_->GetMemoryAtAddress(last_fp, &caller_fp)) { + BPLOG(ERROR) << "Unable to read caller_fp from last_fp: 0x" + << std::hex << last_fp; + return NULL; + } + + uint32_t caller_ra = 0; + if (last_fp && !memory_->GetMemoryAtAddress(last_fp + 4, &caller_ra)) { + BPLOG(ERROR) << "Unable to read caller_ra from last_fp + 4: 0x" + << std::hex << (last_fp + 4); + return NULL; + } + + uint32_t caller_sp = last_fp ? last_fp + 8 : last_frame->context.s0; + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameRISCV* frame = new StackFrameRISCV(); + + frame->trust = StackFrame::FRAME_TRUST_FP; + frame->context = last_frame->context; + frame->context.s0 = caller_fp; + frame->context.sp = caller_sp; + frame->context.pc = last_frame->context.ra; + frame->context.ra = caller_ra; + frame->context_validity = StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_RA | + StackFrameRISCV::CONTEXT_VALID_S0 | + StackFrameRISCV::CONTEXT_VALID_SP; + return frame; +} + +StackFrame* StackwalkerRISCV::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + const vector& frames = *stack->frames(); + StackFrameRISCV* last_frame = + static_cast(frames.back()); + scoped_ptr frame; + + // Try to recover caller information from CFI. + scoped_ptr cfi_frame_info( + frame_symbolizer_->FindCFIFrameInfo(last_frame)); + if (cfi_frame_info.get()) + frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get())); + + // If CFI failed, or there wasn't CFI available, fall back to frame pointer. + if (!frame.get()) + frame.reset(GetCallerByFramePointer(frames)); + + // If everything failed, fall back to stack scanning. + if (stack_scan_allowed && !frame.get()) + frame.reset(GetCallerByStackScan(frames)); + + // If nothing worked, tell the caller. + if (!frame.get()) + return NULL; + + // Should we terminate the stack walk? (end-of-stack or broken invariant) + if (TerminateWalk(frame->context.pc, frame->context.sp, + last_frame->context.sp, + last_frame->trust == StackFrame::FRAME_TRUST_CONTEXT)) { + return NULL; + } + + // The new frame's context's PC is the return address, which is one + // instruction past the instruction that caused us to arrive at the callee. + // RISCV instructions have a uniform 4-byte encoding, so subtracting 4 off + // the return address gets back to the beginning of the call instruction. + // Callers that require the exact return address value may access + // frame->context.pc. + frame->instruction = frame->context.pc - 4; + + return frame.release(); +} + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_riscv.h b/src/processor/stackwalker_riscv.h new file mode 100644 index 0000000..863914d --- /dev/null +++ b/src/processor/stackwalker_riscv.h @@ -0,0 +1,100 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* stackwalker_riscv.h: riscv-specific stackwalker. + * + * Provides stack frames given riscv register context and a memory region + * corresponding to a riscv stack. + * + * Author: Iacopo Colonnelli + */ + +#ifndef PROCESSOR_STACKWALKER_RISCV_H__ +#define PROCESSOR_STACKWALKER_RISCV_H__ + +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerRISCV : public Stackwalker { +public: + // Context is a riscv context object that gives access to riscv-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly + // through to the base Stackwalker constructor. + StackwalkerRISCV(const SystemInfo* system_info, + const MDRawContextRISCV* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + // Change the context validity mask of the frame returned by + // GetContextFrame to VALID. This is only for use by unit tests; the + // default behavior is correct for all application code. + void SetContextFrameValidity(int valid) { + context_frame_validity_ = valid; + } + +private: + // Implementation of Stackwalker, using riscv context and stack conventions. + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame( + const CallStack* stack, bool stack_scan_allowed); + + // Use cfi_frame_info (derived from STACK CFI records) to construct + // the frame that called frames.back(). The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameRISCV* GetCallerByCFIFrameInfo( + const vector& frames, CFIFrameInfo* cfi_frame_info); + + // Use the frame pointer. The caller takes ownership of the returned frame. + // Return NULL on failure. + StackFrameRISCV* GetCallerByFramePointer( + const vector& frames); + + // Scan the stack for plausible return addresses. The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameRISCV* GetCallerByStackScan( + const vector& frames); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextRISCV* context_; + + // Validity mask for youngest stack frame. This is always + // CONTEXT_VALID_ALL in real use; it is only changeable for the sake of + // unit tests. + int context_frame_validity_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_STACKWALKER_RISCV_H__ diff --git a/src/processor/stackwalker_riscv64.cc b/src/processor/stackwalker_riscv64.cc new file mode 100644 index 0000000..0ed7b5e --- /dev/null +++ b/src/processor/stackwalker_riscv64.cc @@ -0,0 +1,539 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* stackwalker_riscv64.cc: riscv64-specific stackwalker. + * + * See stackwalker_riscv64.h for documentation. + * + * Author: Iacopo Colonnelli + */ + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/cfi_frame_info.h" +#include "processor/logging.h" +#include "processor/stackwalker_riscv64.h" + +namespace google_breakpad { + +StackwalkerRISCV64::StackwalkerRISCV64(const SystemInfo* system_info, + const MDRawContextRISCV64* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* resolver_helper) + : Stackwalker(system_info, memory, modules, resolver_helper), + context_(context), + context_frame_validity_(StackFrameRISCV::CONTEXT_VALID_ALL) { +} + + +StackFrame* StackwalkerRISCV64::GetContextFrame() { + if (!context_) { + BPLOG(ERROR) << "Can't get context frame without context"; + return NULL; + } + + StackFrameRISCV64* frame = new StackFrameRISCV64(); + + frame->context = *context_; + frame->context_validity = context_frame_validity_; + frame->trust = StackFrame::FRAME_TRUST_CONTEXT; + frame->instruction = frame->context.pc; + + return frame; +} + +StackFrameRISCV64* StackwalkerRISCV64::GetCallerByCFIFrameInfo( + const vector& frames, + CFIFrameInfo* cfi_frame_info) { + StackFrameRISCV64* last_frame = + static_cast(frames.back()); + + // Populate a dictionary with the valid register values in last_frame. + CFIFrameInfo::RegisterValueMap callee_registers; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_PC) + callee_registers["pc"] = last_frame->context.pc; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_RA) + callee_registers["ra"] = last_frame->context.ra; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_SP) + callee_registers["sp"] = last_frame->context.sp; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_GP) + callee_registers["gp"] = last_frame->context.gp; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_TP) + callee_registers["tp"] = last_frame->context.tp; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_T0) + callee_registers["t0"] = last_frame->context.t0; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_T1) + callee_registers["t1"] = last_frame->context.t1; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_T2) + callee_registers["t2"] = last_frame->context.t2; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S0) + callee_registers["s0"] = last_frame->context.s0; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S1) + callee_registers["s1"] = last_frame->context.s1; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_A0) + callee_registers["a0"] = last_frame->context.a0; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_A1) + callee_registers["a1"] = last_frame->context.a1; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_A2) + callee_registers["a2"] = last_frame->context.a2; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_A3) + callee_registers["a3"] = last_frame->context.a3; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_A4) + callee_registers["a4"] = last_frame->context.a4; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_A5) + callee_registers["a5"] = last_frame->context.a5; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_A6) + callee_registers["a6"] = last_frame->context.a6; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_A7) + callee_registers["a7"] = last_frame->context.a7; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S2) + callee_registers["s2"] = last_frame->context.s2; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S3) + callee_registers["s3"] = last_frame->context.s3; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S4) + callee_registers["s4"] = last_frame->context.s4; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S5) + callee_registers["s5"] = last_frame->context.s5; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S6) + callee_registers["s6"] = last_frame->context.s6; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S7) + callee_registers["s7"] = last_frame->context.s7; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S8) + callee_registers["s8"] = last_frame->context.s8; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S9) + callee_registers["s9"] = last_frame->context.s9; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S10) + callee_registers["s10"] = last_frame->context.s10; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_S11) + callee_registers["s11"] = last_frame->context.s11; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_T3) + callee_registers["t3"] = last_frame->context.t3; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_T4) + callee_registers["t4"] = last_frame->context.t4; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_T5) + callee_registers["t5"] = last_frame->context.t5; + if (last_frame->context_validity & StackFrameRISCV64::CONTEXT_VALID_T6) + callee_registers["t6"] = last_frame->context.t6; + + // Use the STACK CFI data to recover the caller's register values. + CFIFrameInfo::RegisterValueMap caller_registers; + if (!cfi_frame_info->FindCallerRegs(callee_registers, *memory_, + &caller_registers)) { + return NULL; + } + + // Construct a new stack frame given the values the CFI recovered. + CFIFrameInfo::RegisterValueMap::iterator entry; + scoped_ptr frame(new StackFrameRISCV64()); + entry = caller_registers.find("pc"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_PC; + frame->context.pc = entry->second; + } else{ + // If the CFI doesn't recover the PC explicitly, then use .ra. + entry = caller_registers.find(".ra"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_PC; + frame->context.pc = entry->second; + } + } + entry = caller_registers.find("ra"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_RA; + frame->context.ra = entry->second; + } + entry = caller_registers.find("sp"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_SP; + frame->context.sp = entry->second; + } else { + // If the CFI doesn't recover the SP explicitly, then use .cfa. + entry = caller_registers.find(".cfa"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_SP; + frame->context.sp = entry->second; + } + } + entry = caller_registers.find("gp"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_GP; + frame->context.gp = entry->second; + } + entry = caller_registers.find("tp"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_TP; + frame->context.tp = entry->second; + } + entry = caller_registers.find("t0"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_T0; + frame->context.t0 = entry->second; + } + entry = caller_registers.find("t1"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_T1; + frame->context.t1 = entry->second; + } + entry = caller_registers.find("t2"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_T2; + frame->context.t2 = entry->second; + } + entry = caller_registers.find("s0"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S0; + frame->context.s0 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S0) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S0; + frame->context.s0 = last_frame->context.s0; + } + entry = caller_registers.find("s1"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S1; + frame->context.s1 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S1) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S1; + frame->context.s1 = last_frame->context.s1; + } + entry = caller_registers.find("a0"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_A0; + frame->context.a0 = entry->second; + } + entry = caller_registers.find("a1"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_A1; + frame->context.a1 = entry->second; + } + entry = caller_registers.find("a2"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_A2; + frame->context.a2 = entry->second; + } + entry = caller_registers.find("a3"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_A3; + frame->context.a3 = entry->second; + } + entry = caller_registers.find("a4"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_A4; + frame->context.a4 = entry->second; + } + entry = caller_registers.find("a5"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_A5; + frame->context.a5 = entry->second; + } + entry = caller_registers.find("a6"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_A6; + frame->context.a6 = entry->second; + } + entry = caller_registers.find("a7"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_A7; + frame->context.a7 = entry->second; + } + entry = caller_registers.find("s2"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S2; + frame->context.s2 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S2) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S2; + frame->context.s2 = last_frame->context.s2; + } + entry = caller_registers.find("s3"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S3; + frame->context.s3 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S3) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S3; + frame->context.s3 = last_frame->context.s3; + } + entry = caller_registers.find("s4"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S4; + frame->context.s4 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S4) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S4; + frame->context.s4 = last_frame->context.s4; + } + entry = caller_registers.find("s5"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S5; + frame->context.s5 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S5) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S5; + frame->context.s5 = last_frame->context.s5; + } + entry = caller_registers.find("s6"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S6; + frame->context.s6 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S6) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S6; + frame->context.s6 = last_frame->context.s6; + } + entry = caller_registers.find("s7"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S7; + frame->context.s7 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S7) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S7; + frame->context.s7 = last_frame->context.s7; + } + entry = caller_registers.find("s8"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S8; + frame->context.s8 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S8) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S8; + frame->context.s8 = last_frame->context.s8; + } + entry = caller_registers.find("s9"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S9; + frame->context.s9 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S9) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S9; + frame->context.s9 = last_frame->context.s9; + } + entry = caller_registers.find("s10"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S10; + frame->context.s10 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S10) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S10; + frame->context.s10 = last_frame->context.s10; + } + entry = caller_registers.find("s11"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S11; + frame->context.s11 = entry->second; + } else if (last_frame->context_validity & + StackFrameRISCV64::CONTEXT_VALID_S11) { + // Since the register is callee-saves, assume the callee + // has not yet changed it. + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_S11; + frame->context.s11 = last_frame->context.s11; + } + entry = caller_registers.find("t3"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_T3; + frame->context.t3 = entry->second; + } + entry = caller_registers.find("t4"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_T4; + frame->context.t4 = entry->second; + } + entry = caller_registers.find("t5"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_T5; + frame->context.t5 = entry->second; + } + entry = caller_registers.find("t6"); + if (entry != caller_registers.end()) { + frame->context_validity |= StackFrameRISCV64::CONTEXT_VALID_T6; + frame->context.t6 = entry->second; + } + + // If we didn't recover the PC and the SP, then the frame isn't very useful. + static const uint64_t essentials = (StackFrameRISCV64::CONTEXT_VALID_SP + | StackFrameRISCV64::CONTEXT_VALID_PC); + if ((frame->context_validity & essentials) != essentials) + return NULL; + + frame->trust = StackFrame::FRAME_TRUST_CFI; + return frame.release(); +} + +StackFrameRISCV64* StackwalkerRISCV64::GetCallerByStackScan( + const vector& frames) { + StackFrameRISCV64* last_frame = + static_cast(frames.back()); + uint64_t last_sp = last_frame->context.sp; + uint64_t caller_sp, caller_pc; + + if (!ScanForReturnAddress(last_sp, &caller_sp, &caller_pc, + last_frame->trust == StackFrame::FRAME_TRUST_CONTEXT)) { + // No plausible return address was found. + return NULL; + } + + // ScanForReturnAddress found a reasonable return address. Advance + // sp to the location above the one where the return address was + // found. + caller_sp += 8; + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameRISCV64* frame = new StackFrameRISCV64(); + + frame->trust = StackFrame::FRAME_TRUST_SCAN; + frame->context = last_frame->context; + frame->context.pc = caller_pc; + frame->context.sp = caller_sp; + frame->context_validity = StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_SP; + + return frame; +} + +StackFrameRISCV64* StackwalkerRISCV64::GetCallerByFramePointer( + const vector& frames) { + StackFrameRISCV64* last_frame = + static_cast(frames.back()); + + uint64_t last_fp = last_frame->context.s0; + + uint64_t caller_fp = 0; + if (last_fp && !memory_->GetMemoryAtAddress(last_fp, &caller_fp)) { + BPLOG(ERROR) << "Unable to read caller_fp from last_fp: 0x" + << std::hex << last_fp; + return NULL; + } + + uint64_t caller_ra = 0; + if (last_fp && !memory_->GetMemoryAtAddress(last_fp + 8, &caller_ra)) { + BPLOG(ERROR) << "Unable to read caller_ra from last_fp + 8: 0x" + << std::hex << (last_fp + 8); + return NULL; + } + + uint64_t caller_sp = last_fp ? last_fp + 16 : last_frame->context.s0; + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameRISCV64* frame = new StackFrameRISCV64(); + + frame->trust = StackFrame::FRAME_TRUST_FP; + frame->context = last_frame->context; + frame->context.s0 = caller_fp; + frame->context.sp = caller_sp; + frame->context.pc = last_frame->context.ra; + frame->context.ra = caller_ra; + frame->context_validity = StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_RA | + StackFrameRISCV64::CONTEXT_VALID_S0 | + StackFrameRISCV64::CONTEXT_VALID_SP; + return frame; +} + +StackFrame* StackwalkerRISCV64::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + const vector& frames = *stack->frames(); + StackFrameRISCV64* last_frame = + static_cast(frames.back()); + scoped_ptr frame; + + // Try to recover caller information from CFI. + scoped_ptr cfi_frame_info( + frame_symbolizer_->FindCFIFrameInfo(last_frame)); + if (cfi_frame_info.get()) + frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get())); + + // If CFI failed, or there wasn't CFI available, fall back to frame pointer. + if (!frame.get()) + frame.reset(GetCallerByFramePointer(frames)); + + // If everything failed, fall back to stack scanning. + if (stack_scan_allowed && !frame.get()) + frame.reset(GetCallerByStackScan(frames)); + + // If nothing worked, tell the caller. + if (!frame.get()) + return NULL; + + // Should we terminate the stack walk? (end-of-stack or broken invariant) + if (TerminateWalk(frame->context.pc, frame->context.sp, + last_frame->context.sp, + last_frame->trust == StackFrame::FRAME_TRUST_CONTEXT)) { + return NULL; + } + + // The new frame's context's PC is the return address, which is one + // instruction past the instruction that caused us to arrive at the callee. + // RISCV instructions have a uniform 4-byte encoding, so subtracting 4 off + // the return address gets back to the beginning of the call instruction. + // Callers that require the exact return address value may access + // frame->context.pc. + frame->instruction = frame->context.pc - 4; + + return frame.release(); +} + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_riscv64.h b/src/processor/stackwalker_riscv64.h new file mode 100644 index 0000000..89ab12f --- /dev/null +++ b/src/processor/stackwalker_riscv64.h @@ -0,0 +1,100 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* stackwalker_riscv64.h: riscv64-specific stackwalker. + * + * Provides stack frames given riscv64 register context and a memory region + * corresponding to a riscv64 stack. + * + * Author: Iacopo Colonnelli + */ + +#ifndef PROCESSOR_STACKWALKER_RISCV64_H__ +#define PROCESSOR_STACKWALKER_RISCV64_H__ + +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerRISCV64 : public Stackwalker { +public: + // Context is a riscv context object that gives access to riscv-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly + // through to the base Stackwalker constructor. + StackwalkerRISCV64(const SystemInfo* system_info, + const MDRawContextRISCV64* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + // Change the context validity mask of the frame returned by + // GetContextFrame to VALID. This is only for use by unit tests; the + // default behavior is correct for all application code. + void SetContextFrameValidity(int valid) { + context_frame_validity_ = valid; + } + +private: + // Implementation of Stackwalker, using riscv context and stack conventions. + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame( + const CallStack* stack, bool stack_scan_allowed); + + // Use cfi_frame_info (derived from STACK CFI records) to construct + // the frame that called frames.back(). The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameRISCV64* GetCallerByCFIFrameInfo( + const vector& frames, CFIFrameInfo* cfi_frame_info); + + // Use the frame pointer. The caller takes ownership of the returned frame. + // Return NULL on failure. + StackFrameRISCV64* GetCallerByFramePointer( + const vector& frames); + + // Scan the stack for plausible return addresses. The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameRISCV64* GetCallerByStackScan( + const vector& frames); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextRISCV64* context_; + + // Validity mask for youngest stack frame. This is always + // CONTEXT_VALID_ALL in real use; it is only changeable for the sake of + // unit tests. + int context_frame_validity_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_STACKWALKER_RISCV64_H__ diff --git a/src/processor/stackwalker_riscv64_unittest.cc b/src/processor/stackwalker_riscv64_unittest.cc new file mode 100644 index 0000000..c8579b9 --- /dev/null +++ b/src/processor/stackwalker_riscv64_unittest.cc @@ -0,0 +1,887 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* stackwalker_riscv64_unittest.cc: Unit tests for StackwalkerRISCV64 class. + * + * Author: Iacopo Colonnelli + */ + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/stackwalker_unittest_utils.h" +#include "processor/stackwalker_riscv64.h" +#include "processor/windows_frame_info.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::StackFrameSymbolizer; +using google_breakpad::StackFrame; +using google_breakpad::StackFrameRISCV64; +using google_breakpad::Stackwalker; +using google_breakpad::StackwalkerRISCV64; +using google_breakpad::SystemInfo; +using google_breakpad::WindowsFrameInfo; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using std::vector; +using testing::_; +using testing::AnyNumber; +using testing::DoAll; +using testing::Return; +using testing::SetArgumentPointee; +using testing::Test; + +class StackwalkerRISCV64Fixture { +public: + StackwalkerRISCV64Fixture() + : stack_section(kLittleEndian), + // Give the two modules reasonable standard locations and names + // for tests to play with. + module1(0x40000000, 0x10000, "module1", "version1"), + module2(0x50000000, 0x10000, "module2", "version2") { + // Identify the system as an iOS system. + system_info.os = "iOS"; + system_info.os_short = "ios"; + system_info.cpu = "riscv64"; + system_info.cpu_info = ""; + + // Put distinctive values in the raw CPU context. + BrandContext(&raw_context); + + // Create some modules with some stock debugging information. + modules.Add(&module1); + modules.Add(&module2); + + // By default, none of the modules have symbol info; call + // SetModuleSymbols to override this. + EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _, _)) + .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND)); + + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + + // Reset max_frames_scanned since it's static. + Stackwalker::set_max_frames_scanned(1024); + } + + // Set the Breakpad symbol information that supplier should return for + // MODULE to INFO. + void SetModuleSymbols(MockCodeModule* module, const string& info) { + size_t buffer_size; + char *buffer = supplier.CopySymbolDataAndOwnTheCopy(info, &buffer_size); + EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _, _)) + .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer), + SetArgumentPointee<4>(buffer_size), + Return(MockSymbolSupplier::FOUND))); + } + + // Populate stack_region with the contents of stack_section. Use + // stack_section.start() as the region's starting address. + void RegionFromSection() { + string contents; + ASSERT_TRUE(stack_section.GetContents(&contents)); + stack_region.Init(stack_section.start().Value(), contents); + } + + // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking. + void BrandContext(MDRawContextRISCV64 *raw_context) { + uint8_t x = 173; + for (size_t i = 0; i < sizeof(*raw_context); i++) + reinterpret_cast(raw_context)[i] = (x += 17); + } + + SystemInfo system_info; + MDRawContextRISCV64 raw_context; + Section stack_section; + MockMemoryRegion stack_region; + MockCodeModule module1; + MockCodeModule module2; + MockCodeModules modules; + MockSymbolSupplier supplier; + BasicSourceLineResolver resolver; + CallStack call_stack; + const vector* frames; +}; + +class SanityCheck: public StackwalkerRISCV64Fixture, public Test { }; + +TEST_F(SanityCheck, NoResolver) { + // Since the context's frame pointer is garbage, the stack walk will end after + // the first frame. + StackFrameSymbolizer frame_symbolizer(NULL, NULL); + StackwalkerRISCV64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + // This should succeed even without a resolver or supplier. + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameRISCV64 *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetContextFrame: public StackwalkerRISCV64Fixture, public Test { }; + +// The stackwalker should be able to produce the context frame even +// without stack memory present. +TEST_F(GetContextFrame, NoStackMemory) { + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV64 walker(&system_info, &raw_context, NULL, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameRISCV64 *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetCallerFrame: public StackwalkerRISCV64Fixture, public Test { }; + +TEST_F(GetCallerFrame, ScanWithoutSymbols) { + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + // Force scanning through three frames to ensure that the + // stack pointer is set properly in scan-recovered frames. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x40090000) // junk that's not + .D64(0x60000000) // a return address + + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) // space + + .D64(0xF0000000) // more junk + .D64(0x0000000D) + + .D64(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.pc = 0x40005510; + raw_context.sp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV64 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameRISCV64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameRISCV64::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameRISCV64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.pc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.sp); + + StackFrameRISCV64 *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame2->trust); + ASSERT_EQ((StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_SP), + frame2->context_validity); + EXPECT_EQ(return_address2, frame2->context.pc); + EXPECT_EQ(frame2_sp.Value(), frame2->context.sp); +} + +TEST_F(GetCallerFrame, ScanWithFunctionSymbols) { + // During stack scanning, if a potential return address + // is located within a loaded module that has symbols, + // it is only considered a valid return address if it + // lies within a function's bounds. + stack_section.start() = 0x80000000; + uint64_t return_address = 0x50000200; + Label frame1_sp; + + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x40090000) // junk that's not + .D64(0x60000000) // a return address + + .D64(0x40001000) // a couple of plausible addresses + .D64(0x5000F000) // that are not within functions + + .D64(return_address) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.pc = 0x40000200; + raw_context.sp = stack_section.start().Value(); + + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 100 400 10 monotreme\n"); + SetModuleSymbols(&module2, + // The calling frame's function. + "FUNC 100 400 10 marsupial\n"); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV64 walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameRISCV64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameRISCV64::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + EXPECT_EQ("monotreme", frame0->function_name); + EXPECT_EQ(0x40000100ULL, frame0->function_base); + + StackFrameRISCV64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address, frame1->context.pc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.sp); + EXPECT_EQ("marsupial", frame1->function_name); + EXPECT_EQ(0x50000100ULL, frame1->function_base); +} + +TEST_F(GetCallerFrame, ScanFirstFrame) { + // If the stackwalker resorts to stack scanning, it will scan much + // farther to find the caller of the context frame. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(32, 0) // space + + .D64(0x40090000) // junk that's not + .D64(0x60000000) // a return address + + .Append(96, 0) // more space + + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(32, 0) // space + + .D64(0xF0000000) // more junk + .D64(0x0000000D) + + .Append(336, 0) // more space + + .D64(return_address2) // actual return address + // (won't be found) + // frame 2 + .Mark(&frame2_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.pc = 0x40005510; + raw_context.sp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV64 walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameRISCV64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameRISCV64::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameRISCV64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.pc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.sp); +} + +// Test that set_max_frames_scanned prevents using stack scanning +// to find caller frames. +TEST_F(GetCallerFrame, ScanningNotAllowed) { + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D64(0x40090000) // junk that's not + .D64(0x60000000) // a return address + + .D64(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) // space + + .D64(0xF0000000) // more junk + .D64(0x0000000D) + + .D64(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(64, 0); // end of stack + RegionFromSection(); + + raw_context.pc = 0x40005510; + raw_context.sp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV64 walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + Stackwalker::set_max_frames_scanned(0); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + + StackFrameRISCV64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameRISCV64::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); +} + +class GetFramesByFramePointer: + public StackwalkerRISCV64Fixture, + public Test { }; + +TEST_F(GetFramesByFramePointer, OnlyFramePointer) { + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + Label frame1_fp, frame2_fp; + stack_section + // frame 0 + .Append(64, 0) // Whatever values on the stack. + .D64(0x0000000D) // junk that's not + .D64(0xF0000000) // a return address. + + .Mark(&frame1_fp) // Next fp will point to the next value. + .D64(frame2_fp) // Save current frame pointer. + .D64(return_address2) // Save current link register. + .Mark(&frame1_sp) + + // frame 1 + .Append(64, 0) // Whatever values on the stack. + .D64(0x0000000D) // junk that's not + .D64(0xF0000000) // a return address. + + .Mark(&frame2_fp) + .D64(0) + .D64(0) + .Mark(&frame2_sp) + + // frame 2 + .Append(64, 0) // Whatever values on the stack. + .D64(0x0000000D) // junk that's not + .D64(0xF0000000); // a return address. + RegionFromSection(); + + + raw_context.pc = 0x40005510; + raw_context.ra = return_address1; + raw_context.s0 = frame1_fp.Value(); + raw_context.sp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV64 walker(&system_info, &raw_context, + &stack_region, &modules, &frame_symbolizer); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameRISCV64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameRISCV64::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameRISCV64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust); + ASSERT_EQ((StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_RA | + StackFrameRISCV64::CONTEXT_VALID_S0 | + StackFrameRISCV64::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.pc); + EXPECT_EQ(return_address2, frame1->context.ra); + EXPECT_EQ(frame1_sp.Value(), frame1->context.sp); + EXPECT_EQ(frame2_fp.Value(), frame1->context.s0); + + StackFrameRISCV64 *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame2->trust); + ASSERT_EQ((StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_RA | + StackFrameRISCV64::CONTEXT_VALID_S0 | + StackFrameRISCV64::CONTEXT_VALID_SP), + frame2->context_validity); + EXPECT_EQ(return_address2, frame2->context.pc); + EXPECT_EQ(0U, frame2->context.ra); + EXPECT_EQ(frame2_sp.Value(), frame2->context.sp); + EXPECT_EQ(0U, frame2->context.s0); +} + +struct CFIFixture: public StackwalkerRISCV64Fixture { + CFIFixture() { + // Provide a bunch of STACK CFI records; we'll walk to the caller + // from every point in this series, expecting to find the same set + // of register values. + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 4000 1000 10 enchiridion\n" + // Initially, nothing has been pushed on the stack, + // and the return address is still in the return + // address register (ra). + "STACK CFI INIT 4000 100 .cfa: sp 0 + .ra: ra\n" + // Push s1, s2, the frame pointer (s0) and the + // return address register. + "STACK CFI 4001 .cfa: sp 32 + .ra: .cfa -8 + ^" + " s1: .cfa -32 + ^ s2: .cfa -24 + ^ " + " s0: .cfa -16 + ^\n" + // Save s1..s4 in a1..a4: verify that we populate + // the youngest frame with all the values we have. + "STACK CFI 4002 s1: a1 s2: a2 s3: a3 s4: a4\n" + // Restore s1..s4. Save the non-callee-saves register a2. + "STACK CFI 4003 .cfa: sp 40 + a2: .cfa 40 - ^" + " s1: s1 s2: s2 s3: s3 s4: s4\n" + // Move the .cfa back eight bytes, to point at the return + // address, and restore the sp explicitly. + "STACK CFI 4005 .cfa: sp 32 + a2: .cfa 32 - ^" + " s0: .cfa 8 - ^ .ra: .cfa ^ sp: .cfa 8 +\n" + // Recover the PC explicitly from a new stack slot; + // provide garbage for the .ra. + "STACK CFI 4006 .cfa: sp 40 + pc: .cfa 40 - ^\n" + + // The calling function. + "FUNC 5000 1000 10 epictetus\n" + // Mark it as end of stack. + "STACK CFI INIT 5000 1000 .cfa: 0 .ra: 0\n" + + // A function whose CFI makes the stack pointer + // go backwards. + "FUNC 6000 1000 20 palinal\n" + "STACK CFI INIT 6000 1000 .cfa: sp 8 - .ra: ra\n" + + // A function with CFI expressions that can't be + // evaluated. + "FUNC 7000 1000 20 rhetorical\n" + "STACK CFI INIT 7000 1000 .cfa: moot .ra: ambiguous\n"); + + // Provide some distinctive values for the caller's registers. + expected.pc = 0x0000000040005510L; + expected.sp = 0x0000000080000000L; + expected.s1 = 0x5e68b5d5b5d55e68L; + expected.s2 = 0x34f3ebd1ebd134f3L; + expected.s3 = 0x74bca31ea31e74bcL; + expected.s4 = 0x16b32dcb2dcb16b3L; + expected.s5 = 0x21372ada2ada2137L; + expected.s6 = 0x557dbbbbbbbb557dL; + expected.s7 = 0x8ca748bf48bf8ca7L; + expected.s8 = 0x21f0ab46ab4621f0L; + expected.s9 = 0x146732b732b71467L; + expected.s10 = 0xa673645fa673645fL; + expected.s11 = 0xa673645fa673645fL; + expected.s0 = 0xe11081128112e110L; + + // Expect CFI to recover all callee-saves registers. Since CFI is the + // only stack frame construction technique we have, aside from the + // context frame itself, there's no way for us to have a set of valid + // registers smaller than this. + expected_validity = (StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_SP | + StackFrameRISCV64::CONTEXT_VALID_S1 | + StackFrameRISCV64::CONTEXT_VALID_S2 | + StackFrameRISCV64::CONTEXT_VALID_S3 | + StackFrameRISCV64::CONTEXT_VALID_S4 | + StackFrameRISCV64::CONTEXT_VALID_S5 | + StackFrameRISCV64::CONTEXT_VALID_S6 | + StackFrameRISCV64::CONTEXT_VALID_S7 | + StackFrameRISCV64::CONTEXT_VALID_S8 | + StackFrameRISCV64::CONTEXT_VALID_S9 | + StackFrameRISCV64::CONTEXT_VALID_S10 | + StackFrameRISCV64::CONTEXT_VALID_S11 | + StackFrameRISCV64::CONTEXT_VALID_S0); + + // By default, context frames provide all registers, as normal. + context_frame_validity = StackFrameRISCV64::CONTEXT_VALID_ALL; + + // By default, registers are unchanged. + raw_context = expected; + } + + // Walk the stack, using stack_section as the contents of the stack + // and raw_context as the current register values. (Set the stack + // pointer to the stack's starting address.) Expect two stack + // frames; in the older frame, expect the callee-saves registers to + // have values matching those in 'expected'. + void CheckWalk() { + RegionFromSection(); + raw_context.sp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV64 walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + walker.SetContextFrameValidity(context_frame_validity); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameRISCV64 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(context_frame_validity, frame0->context_validity); + EXPECT_EQ("enchiridion", frame0->function_name); + EXPECT_EQ(0x0000000040004000UL, frame0->function_base); + + StackFrameRISCV64 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ(expected_validity, frame1->context_validity); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_A2) + EXPECT_EQ(expected.a2, frame1->context.a2); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S1) + EXPECT_EQ(expected.s1, frame1->context.s1); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S2) + EXPECT_EQ(expected.s2, frame1->context.s2); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S3) + EXPECT_EQ(expected.s3, frame1->context.s3); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S4) + EXPECT_EQ(expected.s4, frame1->context.s4); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S5) + EXPECT_EQ(expected.s5, frame1->context.s5); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S6) + EXPECT_EQ(expected.s6, frame1->context.s6); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S7) + EXPECT_EQ(expected.s7, frame1->context.s7); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S8) + EXPECT_EQ(expected.s8, frame1->context.s8); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S9) + EXPECT_EQ(expected.s9, frame1->context.s9); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S10) + EXPECT_EQ(expected.s10, frame1->context.s10); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S11) + EXPECT_EQ(expected.s11, frame1->context.s11); + if (expected_validity & StackFrameRISCV64::CONTEXT_VALID_S0) + EXPECT_EQ(expected.s0, frame1->context.s0); + + // We would never have gotten a frame in the first place if the SP + // and PC weren't valid or ->instruction weren't set. + EXPECT_EQ(expected.sp, frame1->context.sp); + EXPECT_EQ(expected.pc, frame1->context.pc); + EXPECT_EQ(expected.pc, frame1->instruction + 4); + EXPECT_EQ("epictetus", frame1->function_name); + } + + // The values we expect to find for the caller's registers. + MDRawContextRISCV64 expected; + + // The validity mask for expected. + int expected_validity; + + // The validity mask to impose on the context frame. + int context_frame_validity; +}; + +class CFI: public CFIFixture, public Test { }; + +TEST_F(CFI, At4000) { + stack_section.start() = expected.sp; + raw_context.pc = 0x0000000040004000L; + raw_context.ra = 0x0000000040005510L; + CheckWalk(); +} + +TEST_F(CFI, At4001) { + Label frame1_sp = expected.sp; + stack_section + .D64(0x5e68b5d5b5d55e68L) // saved s1 + .D64(0x34f3ebd1ebd134f3L) // saved s2 + .D64(0xe11081128112e110L) // saved s0 + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x0000000040004001L; + // distinct callee s1, s2 and s0 + raw_context.s1 = 0xadc9f635a635adc9L; + raw_context.s2 = 0x623135ac35ac6231L; + raw_context.s0 = 0x5fc4be14be145fc4L; + CheckWalk(); +} + +// As above, but unwind from a context that has only the PC and SP. +TEST_F(CFI, At4001LimitedValidity) { + Label frame1_sp = expected.sp; + stack_section + .D64(0x5e68b5d5b5d55e68L) // saved s1 + .D64(0x34f3ebd1ebd134f3L) // saved s2 + .D64(0xe11081128112e110L) // saved s0 + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + context_frame_validity = StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_SP; + raw_context.pc = 0x0000000040004001L; + raw_context.s0 = 0x5fc4be14be145fc4L; + + expected_validity = (StackFrameRISCV64::CONTEXT_VALID_PC | + StackFrameRISCV64::CONTEXT_VALID_SP | + StackFrameRISCV64::CONTEXT_VALID_S0 | + StackFrameRISCV64::CONTEXT_VALID_S1 | + StackFrameRISCV64::CONTEXT_VALID_S2); + CheckWalk(); +} + +TEST_F(CFI, At4002) { + Label frame1_sp = expected.sp; + stack_section + .D64(0xff3dfb81fb81ff3dL) // no longer saved s1 + .D64(0x34f3ebd1ebd134f3L) // no longer saved s2 + .D64(0xe11081128112e110L) // saved s0 + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x0000000040004002L; + raw_context.a1 = 0x5e68b5d5b5d55e68L; // saved s1 + raw_context.a2 = 0x34f3ebd1ebd134f3L; // saved s2 + raw_context.a3 = 0x74bca31ea31e74bcL; // saved s3 + raw_context.a4 = 0x16b32dcb2dcb16b3L; // saved s4 + raw_context.s1 = 0xadc9f635a635adc9L; // distinct callee s1 + raw_context.s2 = 0x623135ac35ac6231L; // distinct callee s2 + raw_context.s3 = 0xac4543564356ac45L; // distinct callee s3 + raw_context.s4 = 0x2561562f562f2561L; // distinct callee s4 + // distinct callee s0 + raw_context.s0 = 0x5fc4be14be145fc4L; + CheckWalk(); +} + +TEST_F(CFI, At4003) { + Label frame1_sp = expected.sp; + stack_section + .D64(0xdd5a48c848c8dd5aL) // saved a2 (even though it's not callee-saves) + .D64(0xff3dfb81fb81ff3dL) // no longer saved s1 + .D64(0x34f3ebd1ebd134f3L) // no longer saved s2 + .D64(0xe11081128112e110L) // saved s0 + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x0000000040004003L; + // distinct callee a2 and fp + raw_context.a2 = 0xfb756319fb756319L; + raw_context.s0 = 0x5fc4be14be145fc4L; + // caller's a2 + expected.a2 = 0xdd5a48c848c8dd5aL; + expected_validity |= StackFrameRISCV64::CONTEXT_VALID_A2; + CheckWalk(); +} + +// We have no new rule at module offset 0x4004, so the results here should +// be the same as those at module offset 0x4003. +TEST_F(CFI, At4004) { + Label frame1_sp = expected.sp; + stack_section + .D64(0xdd5a48c848c8dd5aL) // saved a2 (even though it's not callee-saves) + .D64(0xff3dfb81fb81ff3dL) // no longer saved s1 + .D64(0x34f3ebd1ebd134f3L) // no longer saved s2 + .D64(0xe11081128112e110L) // saved s0 + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x0000000040004004L; + // distinct callee a2 and s0 + raw_context.a2 = 0xfb756319fb756319L; + raw_context.s0 = 0x5fc4be14be145fc4L; + // caller's a2 + expected.a2 = 0xdd5a48c848c8dd5aL; + expected_validity |= StackFrameRISCV64::CONTEXT_VALID_A2; + CheckWalk(); +} + +// Here we move the .cfa, but provide an explicit rule to recover the SP, +// so again there should be no change in the registers recovered. +TEST_F(CFI, At4005) { + Label frame1_sp = expected.sp; + stack_section + .D64(0xdd5a48c848c8dd5aL) // saved a2 (even though it's not callee-saves) + .D64(0xff3dfb81fb81ff3dL) // no longer saved s1 + .D64(0x34f3ebd1ebd134f3L) // no longer saved s2 + .D64(0xe11081128112e110L) // saved s0 + .D64(0x0000000040005510L) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x0000000040004005L; + raw_context.a2 = 0xfb756319fb756319L; // distinct callee a2 + expected.a2 = 0xdd5a48c848c8dd5aL; // caller's a2 + expected_validity |= StackFrameRISCV64::CONTEXT_VALID_A2; + CheckWalk(); +} + +// Here we provide an explicit rule for the PC, and have the saved .ra be +// bogus. +TEST_F(CFI, At4006) { + Label frame1_sp = expected.sp; + stack_section + .D64(0x0000000040005510L) // saved pc + .D64(0xdd5a48c848c8dd5aL) // saved a2 (even though it's not callee-saves) + .D64(0xff3dfb81fb81ff3dL) // no longer saved s1 + .D64(0x34f3ebd1ebd134f3L) // no longer saved s2 + .D64(0xe11081128112e110L) // saved s0 + .D64(0xf8d157835783f8d1L) // .ra rule recovers this, which is garbage + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x0000000040004006L; + raw_context.a2 = 0xfb756319fb756319L; // distinct callee a2 + expected.a2 = 0xdd5a48c848c8dd5aL; // caller's a2 + expected_validity |= StackFrameRISCV64::CONTEXT_VALID_A2; + CheckWalk(); +} + +// Check that we reject rules that would cause the stack pointer to +// move in the wrong direction. +TEST_F(CFI, RejectBackwards) { + raw_context.pc = 0x0000000040006000L; + raw_context.sp = 0x0000000080000000L; + raw_context.ra = 0x0000000040005510L; + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV64 walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} + +// Check that we reject rules whose expressions' evaluation fails. +TEST_F(CFI, RejectBadExpressions) { + raw_context.pc = 0x0000000040007000L; + raw_context.sp = 0x0000000080000000L; + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV64 walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} diff --git a/src/processor/stackwalker_riscv_unittest.cc b/src/processor/stackwalker_riscv_unittest.cc new file mode 100644 index 0000000..37f0e23 --- /dev/null +++ b/src/processor/stackwalker_riscv_unittest.cc @@ -0,0 +1,887 @@ +// Copyright 2013 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* stackwalker_riscv_unittest.cc: Unit tests for StackwalkerRISCV class. + * + * Author: Iacopo Colonnelli + */ + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/stackwalker_unittest_utils.h" +#include "processor/stackwalker_riscv.h" +#include "processor/windows_frame_info.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::StackFrameSymbolizer; +using google_breakpad::StackFrame; +using google_breakpad::StackFrameRISCV; +using google_breakpad::Stackwalker; +using google_breakpad::StackwalkerRISCV; +using google_breakpad::SystemInfo; +using google_breakpad::WindowsFrameInfo; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using std::vector; +using testing::_; +using testing::AnyNumber; +using testing::DoAll; +using testing::Return; +using testing::SetArgumentPointee; +using testing::Test; + +class StackwalkerRISCVFixture { +public: + StackwalkerRISCVFixture() + : stack_section(kLittleEndian), + // Give the two modules reasonable standard locations and names + // for tests to play with. + module1(0x40000000, 0x10000, "module1", "version1"), + module2(0x50000000, 0x10000, "module2", "version2") { + // Identify the system as an iOS system. + system_info.os = "iOS"; + system_info.os_short = "ios"; + system_info.cpu = "riscv"; + system_info.cpu_info = ""; + + // Put distinctive values in the raw CPU context. + BrandContext(&raw_context); + + // Create some modules with some stock debugging information. + modules.Add(&module1); + modules.Add(&module2); + + // By default, none of the modules have symbol info; call + // SetModuleSymbols to override this. + EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _, _)) + .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND)); + + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + + // Reset max_frames_scanned since it's static. + Stackwalker::set_max_frames_scanned(1024); + } + + // Set the Breakpad symbol information that supplier should return for + // MODULE to INFO. + void SetModuleSymbols(MockCodeModule* module, const string& info) { + size_t buffer_size; + char *buffer = supplier.CopySymbolDataAndOwnTheCopy(info, &buffer_size); + EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _, _)) + .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer), + SetArgumentPointee<4>(buffer_size), + Return(MockSymbolSupplier::FOUND))); + } + + // Populate stack_region with the contents of stack_section. Use + // stack_section.start() as the region's starting address. + void RegionFromSection() { + string contents; + ASSERT_TRUE(stack_section.GetContents(&contents)); + stack_region.Init(stack_section.start().Value(), contents); + } + + // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking. + void BrandContext(MDRawContextRISCV *raw_context) { + uint8_t x = 173; + for (size_t i = 0; i < sizeof(*raw_context); i++) + reinterpret_cast(raw_context)[i] = (x += 17); + } + + SystemInfo system_info; + MDRawContextRISCV raw_context; + Section stack_section; + MockMemoryRegion stack_region; + MockCodeModule module1; + MockCodeModule module2; + MockCodeModules modules; + MockSymbolSupplier supplier; + BasicSourceLineResolver resolver; + CallStack call_stack; + const vector* frames; +}; + +class SanityCheck: public StackwalkerRISCVFixture, public Test { }; + +TEST_F(SanityCheck, NoResolver) { + // Since the context's frame pointer is garbage, the stack walk will end after + // the first frame. + StackFrameSymbolizer frame_symbolizer(NULL, NULL); + StackwalkerRISCV walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + // This should succeed even without a resolver or supplier. + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameRISCV *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetContextFrame: public StackwalkerRISCVFixture, public Test { }; + +// The stackwalker should be able to produce the context frame even +// without stack memory present. +TEST_F(GetContextFrame, NoStackMemory) { + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV walker(&system_info, &raw_context, NULL, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + StackFrameRISCV *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetCallerFrame: public StackwalkerRISCVFixture, public Test { }; + +TEST_F(GetCallerFrame, ScanWithoutSymbols) { + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + // Force scanning through three frames to ensure that the + // stack pointer is set properly in scan-recovered frames. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(8, 0) // space + + .D32(0x40090000) // junk that's not + .D32(0x60000000) // a return address + + .D32(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(8, 0) // space + + .D32(0xF0000000) // more junk + .D32(0x0000000D) + + .D32(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.pc = 0x40005510; + raw_context.sp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameRISCV *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameRISCV::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameRISCV *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.pc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.sp); + + StackFrameRISCV *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame2->trust); + ASSERT_EQ((StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_SP), + frame2->context_validity); + EXPECT_EQ(return_address2, frame2->context.pc); + EXPECT_EQ(frame2_sp.Value(), frame2->context.sp); +} + +TEST_F(GetCallerFrame, ScanWithFunctionSymbols) { + // During stack scanning, if a potential return address + // is located within a loaded module that has symbols, + // it is only considered a valid return address if it + // lies within a function's bounds. + stack_section.start() = 0x80000000; + uint64_t return_address = 0x50000200; + Label frame1_sp; + + stack_section + // frame 0 + .Append(8, 0) // space + + .D32(0x40090000) // junk that's not + .D32(0x60000000) // a return address + + .D32(0x40001000) // a couple of plausible addresses + .D32(0x5000F000) // that are not within functions + + .D32(return_address) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.pc = 0x40000200; + raw_context.sp = stack_section.start().Value(); + + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 100 400 10 monotreme\n"); + SetModuleSymbols(&module2, + // The calling frame's function. + "FUNC 100 400 10 marsupial\n"); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameRISCV *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameRISCV::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + EXPECT_EQ("monotreme", frame0->function_name); + EXPECT_EQ(0x40000100UL, frame0->function_base); + + StackFrameRISCV *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address, frame1->context.pc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.sp); + EXPECT_EQ("marsupial", frame1->function_name); + EXPECT_EQ(0x50000100UL, frame1->function_base); +} + +TEST_F(GetCallerFrame, ScanFirstFrame) { + // If the stackwalker resorts to stack scanning, it will scan much + // farther to find the caller of the context frame. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(16, 0) // space + + .D32(0x40090000) // junk that's not + .D32(0x60000000) // a return address + + .Append(48, 0) // more space + + .D32(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(16, 0) // space + + .D32(0xF0000000) // more junk + .D32(0x0000000D) + + .Append(168, 0) // more space + + .D32(return_address2) // actual return address + // (won't be found) + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.pc = 0x40005510; + raw_context.sp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameRISCV *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameRISCV::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameRISCV *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.pc); + EXPECT_EQ(frame1_sp.Value(), frame1->context.sp); +} + +// Test that set_max_frames_scanned prevents using stack scanning +// to find caller frames. +TEST_F(GetCallerFrame, ScanningNotAllowed) { + // When the stack walker resorts to scanning the stack, + // only addresses located within loaded modules are + // considered valid return addresses. + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + stack_section + // frame 0 + .Append(8, 0) // space + + .D32(0x40090000) // junk that's not + .D32(0x60000000) // a return address + + .D32(return_address1) // actual return address + // frame 1 + .Mark(&frame1_sp) + .Append(8, 0) // space + + .D32(0xF0000000) // more junk + .D32(0x0000000D) + + .D32(return_address2) // actual return address + // frame 2 + .Mark(&frame2_sp) + .Append(32, 0); // end of stack + RegionFromSection(); + + raw_context.pc = 0x40005510; + raw_context.sp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + Stackwalker::set_max_frames_scanned(0); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + + StackFrameRISCV *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameRISCV::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); +} + +class GetFramesByFramePointer: + public StackwalkerRISCVFixture, + public Test { }; + +TEST_F(GetFramesByFramePointer, OnlyFramePointer) { + stack_section.start() = 0x80000000; + uint64_t return_address1 = 0x50000100; + uint64_t return_address2 = 0x50000900; + Label frame1_sp, frame2_sp; + Label frame1_fp, frame2_fp; + stack_section + // frame 0 + .Append(32, 0) // Whatever values on the stack. + .D32(0x0000000D) // junk that's not + .D32(0xF0000000) // a return address. + + .Mark(&frame1_fp) // Next fp will point to the next value. + .D32(frame2_fp) // Save current frame pointer. + .D32(return_address2) // Save current link register. + .Mark(&frame1_sp) + + // frame 1 + .Append(32, 0) // Whatever values on the stack. + .D32(0x0000000D) // junk that's not + .D32(0xF0000000) // a return address. + + .Mark(&frame2_fp) + .D32(0) + .D32(0) + .Mark(&frame2_sp) + + // frame 2 + .Append(32, 0) // Whatever values on the stack. + .D32(0x0000000D) // junk that's not + .D32(0xF0000000); // a return address. + RegionFromSection(); + + + raw_context.pc = 0x40005510; + raw_context.ra = return_address1; + raw_context.s0 = frame1_fp.Value(); + raw_context.sp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV walker(&system_info, &raw_context, + &stack_region, &modules, &frame_symbolizer); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(2U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ("module2", modules_without_symbols[1]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + StackFrameRISCV *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameRISCV::CONTEXT_VALID_ALL, + frame0->context_validity); + EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context))); + + StackFrameRISCV *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust); + ASSERT_EQ((StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_RA | + StackFrameRISCV::CONTEXT_VALID_S0 | + StackFrameRISCV::CONTEXT_VALID_SP), + frame1->context_validity); + EXPECT_EQ(return_address1, frame1->context.pc); + EXPECT_EQ(return_address2, frame1->context.ra); + EXPECT_EQ(frame1_sp.Value(), frame1->context.sp); + EXPECT_EQ(frame2_fp.Value(), frame1->context.s0); + + StackFrameRISCV *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame2->trust); + ASSERT_EQ((StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_RA | + StackFrameRISCV::CONTEXT_VALID_S0 | + StackFrameRISCV::CONTEXT_VALID_SP), + frame2->context_validity); + EXPECT_EQ(return_address2, frame2->context.pc); + EXPECT_EQ(0U, frame2->context.ra); + EXPECT_EQ(frame2_sp.Value(), frame2->context.sp); + EXPECT_EQ(0U, frame2->context.s0); +} + +struct CFIFixture: public StackwalkerRISCVFixture { + CFIFixture() { + // Provide a bunch of STACK CFI records; we'll walk to the caller + // from every point in this series, expecting to find the same set + // of register values. + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 4000 1000 10 enchiridion\n" + // Initially, nothing has been pushed on the stack, + // and the return address is still in the return + // address register (ra). + "STACK CFI INIT 4000 100 .cfa: sp 0 + .ra: ra\n" + // Push s1, s2, the frame pointer (s0) and the + // return address register. + "STACK CFI 4001 .cfa: sp 16 + .ra: .cfa -4 + ^" + " s1: .cfa -16 + ^ s2: .cfa -12 + ^ " + " s0: .cfa -8 + ^\n" + // Save s1..s4 in a1..a4: verify that we populate + // the youngest frame with all the values we have. + "STACK CFI 4002 s1: a1 s2: a2 s3: a3 s4: a4\n" + // Restore s1..s4. Save the non-callee-saves register a2. + "STACK CFI 4003 .cfa: sp 20 + a2: .cfa 20 - ^" + " s1: s1 s2: s2 s3: s3 s4: s4\n" + // Move the .cfa back eight bytes, to point at the return + // address, and restore the sp explicitly. + "STACK CFI 4005 .cfa: sp 16 + a2: .cfa 16 - ^" + " s0: .cfa 4 - ^ .ra: .cfa ^ sp: .cfa 4 +\n" + // Recover the PC explicitly from a new stack slot; + // provide garbage for the .ra. + "STACK CFI 4006 .cfa: sp 20 + pc: .cfa 20 - ^\n" + + // The calling function. + "FUNC 5000 1000 10 epictetus\n" + // Mark it as end of stack. + "STACK CFI INIT 5000 1000 .cfa: 0 .ra: 0\n" + + // A function whose CFI makes the stack pointer + // go backwards. + "FUNC 6000 1000 20 palinal\n" + "STACK CFI INIT 6000 1000 .cfa: sp 4 - .ra: ra\n" + + // A function with CFI expressions that can't be + // evaluated. + "FUNC 7000 1000 20 rhetorical\n" + "STACK CFI INIT 7000 1000 .cfa: moot .ra: ambiguous\n"); + + // Provide some distinctive values for the caller's registers. + expected.pc = 0x40005510; + expected.sp = 0x80000000; + expected.s1 = 0xb5d55e68; + expected.s2 = 0xebd134f3; + expected.s3 = 0xa31e74bc; + expected.s4 = 0x2dcb16b3; + expected.s5 = 0x2ada2137; + expected.s6 = 0xbbbb557d; + expected.s7 = 0x48bf8ca7; + expected.s8 = 0xab4621f0; + expected.s9 = 0x32b71467; + expected.s10 = 0xa673645f; + expected.s11 = 0xa673645f; + expected.s0 = 0x8112e110; + + // Expect CFI to recover all callee-saves registers. Since CFI is the + // only stack frame construction technique we have, aside from the + // context frame itself, there's no way for us to have a set of valid + // registers smaller than this. + expected_validity = (StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_SP | + StackFrameRISCV::CONTEXT_VALID_S1 | + StackFrameRISCV::CONTEXT_VALID_S2 | + StackFrameRISCV::CONTEXT_VALID_S3 | + StackFrameRISCV::CONTEXT_VALID_S4 | + StackFrameRISCV::CONTEXT_VALID_S5 | + StackFrameRISCV::CONTEXT_VALID_S6 | + StackFrameRISCV::CONTEXT_VALID_S7 | + StackFrameRISCV::CONTEXT_VALID_S8 | + StackFrameRISCV::CONTEXT_VALID_S9 | + StackFrameRISCV::CONTEXT_VALID_S10 | + StackFrameRISCV::CONTEXT_VALID_S11 | + StackFrameRISCV::CONTEXT_VALID_S0); + + // By default, context frames provide all registers, as normal. + context_frame_validity = StackFrameRISCV::CONTEXT_VALID_ALL; + + // By default, registers are unchanged. + raw_context = expected; + } + + // Walk the stack, using stack_section as the contents of the stack + // and raw_context as the current register values. (Set the stack + // pointer to the stack's starting address.) Expect two stack + // frames; in the older frame, expect the callee-saves registers to + // have values matching those in 'expected'. + void CheckWalk() { + RegionFromSection(); + raw_context.sp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + walker.SetContextFrameValidity(context_frame_validity); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + StackFrameRISCV *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(context_frame_validity, frame0->context_validity); + EXPECT_EQ("enchiridion", frame0->function_name); + EXPECT_EQ(0x40004000U, frame0->function_base); + + StackFrameRISCV *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ(expected_validity, frame1->context_validity); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_A2) + EXPECT_EQ(expected.a2, frame1->context.a2); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S1) + EXPECT_EQ(expected.s1, frame1->context.s1); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S2) + EXPECT_EQ(expected.s2, frame1->context.s2); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S3) + EXPECT_EQ(expected.s3, frame1->context.s3); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S4) + EXPECT_EQ(expected.s4, frame1->context.s4); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S5) + EXPECT_EQ(expected.s5, frame1->context.s5); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S6) + EXPECT_EQ(expected.s6, frame1->context.s6); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S7) + EXPECT_EQ(expected.s7, frame1->context.s7); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S8) + EXPECT_EQ(expected.s8, frame1->context.s8); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S9) + EXPECT_EQ(expected.s9, frame1->context.s9); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S10) + EXPECT_EQ(expected.s10, frame1->context.s10); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S11) + EXPECT_EQ(expected.s11, frame1->context.s11); + if (expected_validity & StackFrameRISCV::CONTEXT_VALID_S0) + EXPECT_EQ(expected.s0, frame1->context.s0); + + // We would never have gotten a frame in the first place if the SP + // and PC weren't valid or ->instruction weren't set. + EXPECT_EQ(expected.sp, frame1->context.sp); + EXPECT_EQ(expected.pc, frame1->context.pc); + EXPECT_EQ(expected.pc, frame1->instruction + 4); + EXPECT_EQ("epictetus", frame1->function_name); + } + + // The values we expect to find for the caller's registers. + MDRawContextRISCV expected; + + // The validity mask for expected. + int expected_validity; + + // The validity mask to impose on the context frame. + int context_frame_validity; +}; + +class CFI: public CFIFixture, public Test { }; + +TEST_F(CFI, At4000) { + stack_section.start() = expected.sp; + raw_context.pc = 0x40004000; + raw_context.ra = 0x40005510; + CheckWalk(); +} + +TEST_F(CFI, At4001) { + Label frame1_sp = expected.sp; + stack_section + .D32(0xb5d55e68) // saved s1 + .D32(0xebd134f3) // saved s2 + .D32(0x8112e110) // saved s0 + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x40004001; + // distinct callee s1, s2 and s0 + raw_context.s1 = 0xa635adc9; + raw_context.s2 = 0x35ac6231; + raw_context.s0 = 0xbe145fc4; + CheckWalk(); +} + +// As above, but unwind from a context that has only the PC and SP. +TEST_F(CFI, At4001LimitedValidity) { + Label frame1_sp = expected.sp; + stack_section + .D32(0xb5d55e68) // saved s1 + .D32(0xebd134f3) // saved s2 + .D32(0x8112e110) // saved s0 + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + context_frame_validity = StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_SP; + raw_context.pc = 0x40004001; + raw_context.s0 = 0xbe145fc4; + + expected_validity = (StackFrameRISCV::CONTEXT_VALID_PC | + StackFrameRISCV::CONTEXT_VALID_SP | + StackFrameRISCV::CONTEXT_VALID_S0 | + StackFrameRISCV::CONTEXT_VALID_S1 | + StackFrameRISCV::CONTEXT_VALID_S2); + CheckWalk(); +} + +TEST_F(CFI, At4002) { + Label frame1_sp = expected.sp; + stack_section + .D32(0xfb81ff3d) // no longer saved s1 + .D32(0xebd134f3) // no longer saved s2 + .D32(0x8112e110) // saved s0 + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x40004002; + raw_context.a1 = 0xb5d55e68; // saved a1 + raw_context.a2 = 0xebd134f3; // saved a2 + raw_context.a3 = 0xa31e74bc; // saved a3 + raw_context.a4 = 0x2dcb16b3; // saved a4 + raw_context.s1 = 0xa635adc9; // distinct callee s1 + raw_context.s2 = 0x35ac6231; // distinct callee s2 + raw_context.s3 = 0x4356ac45; // distinct callee s3 + raw_context.s4 = 0x562f2561; // distinct callee s4 + // distinct callee s0 + raw_context.s0 = 0xbe145fc4; + CheckWalk(); +} + +TEST_F(CFI, At4003) { + Label frame1_sp = expected.sp; + stack_section + .D32(0x48c8dd5a) // saved a2 (even though it's not callee-saves) + .D32(0xfb81ff3d) // no longer saved s1 + .D32(0xebd134f3) // no longer saved s2 + .D32(0x8112e110) // saved s0 + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x40004003; + // distinct callee a2 and fp + raw_context.a2 = 0xfb756319; + raw_context.s0 = 0xbe145fc4; + // caller's a2 + expected.a2 = 0x48c8dd5a; + expected_validity |= StackFrameRISCV::CONTEXT_VALID_A2; + CheckWalk(); +} + +// We have no new rule at module offset 0x4004, so the results here should +// be the same as those at module offset 0x4003. +TEST_F(CFI, At4004) { + Label frame1_sp = expected.sp; + stack_section + .D32(0x48c8dd5a) // saved a2 (even though it's not callee-saves) + .D32(0xfb81ff3d) // no longer saved s1 + .D32(0xebd134f3) // no longer saved s2 + .D32(0x8112e110) // saved s0 + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x40004004; + // distinct callee a2 and s0 + raw_context.a2 = 0xfb756319; + raw_context.s0 = 0xbe145fc4; + // caller's a2 + expected.a2 = 0x48c8dd5a; + expected_validity |= StackFrameRISCV::CONTEXT_VALID_A2; + CheckWalk(); +} + +// Here we move the .cfa, but provide an explicit rule to recover the SP, +// so again there should be no change in the registers recovered. +TEST_F(CFI, At4005) { + Label frame1_sp = expected.sp; + stack_section + .D32(0x48c8dd5a) // saved a2 (even though it's not callee-saves) + .D32(0xfb81ff3d) // no longer saved s1 + .D32(0xebd134f3) // no longer saved s2 + .D32(0x8112e110) // saved s0 + .D32(0x40005510) // return address + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x40004005; + raw_context.a2 = 0xfb756319; // distinct callee a2 + expected.a2 = 0x48c8dd5a; // caller's a2 + expected_validity |= StackFrameRISCV::CONTEXT_VALID_A2; + CheckWalk(); +} + +// Here we provide an explicit rule for the PC, and have the saved .ra be +// bogus. +TEST_F(CFI, At4006) { + Label frame1_sp = expected.sp; + stack_section + .D32(0x40005510) // saved pc + .D32(0x48c8dd5a) // saved a2 (even though it's not callee-saves) + .D32(0xfb81ff3d) // no longer saved s1 + .D32(0xebd134f3) // no longer saved s2 + .D32(0x8112e110) // saved s0 + .D32(0x5783f8d1) // .ra rule recovers this, which is garbage + .Mark(&frame1_sp); // This effectively sets stack_section.start(). + raw_context.pc = 0x40004006; + raw_context.a2 = 0xfb756319; // distinct callee a2 + expected.a2 = 0x48c8dd5a; // caller's a2 + expected_validity |= StackFrameRISCV::CONTEXT_VALID_A2; + CheckWalk(); +} + +// Check that we reject rules that would cause the stack pointer to +// move in the wrong direction. +TEST_F(CFI, RejectBackwards) { + raw_context.pc = 0x40006000; + raw_context.sp = 0x80000000; + raw_context.ra = 0x40005510; + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} + +// Check that we reject rules whose expressions' evaluation fails. +TEST_F(CFI, RejectBadExpressions) { + raw_context.pc = 0x40007000; + raw_context.sp = 0x80000000; + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerRISCV walker(&system_info, &raw_context, &stack_region, + &modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); +} diff --git a/src/processor/stackwalker_selftest.cc b/src/processor/stackwalker_selftest.cc new file mode 100644 index 0000000..4f3483b --- /dev/null +++ b/src/processor/stackwalker_selftest.cc @@ -0,0 +1,436 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_selftest.cc: Tests StackwalkerX86 or StackwalkerPPC using the +// running process' stack as test data, if running on an x86 or ppc and +// compiled with gcc. This test is not enabled in the "make check" suite +// by default, because certain optimizations interfere with its proper +// operation. To turn it on, configure with --enable-selftest. +// +// Optimizations that cause problems: +// - stack frame reuse. The Recursor function here calls itself with +// |return Recursor|. When the caller's frame is reused, it will cause +// CountCallerFrames to correctly return the same number of frames +// in both the caller and callee. This is considered an unexpected +// condition in the test, which expects a callee to have one more +// caller frame in the stack than its caller. +// - frame pointer omission. Even with a stackwalker that understands +// this optimization, the code to harness debug information currently +// only exists to retrieve it from minidumps, not the current process. +// +// This test can also serve as a developmental and debugging aid if +// PRINT_STACKS is defined. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "processor/logging.h" + +#if defined(__i386) && !defined(__i386__) +#define __i386__ +#endif +#if defined(__sparc) && !defined(__sparc__) +#define __sparc__ +#endif + +#if (defined(__SUNPRO_CC) || defined(__GNUC__)) && \ + (defined(__i386__) || defined(__ppc__) || defined(__sparc__)) + + +#include + +#include "common/scoped_ptr.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame.h" +#include "google_breakpad/processor/stack_frame_cpu.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::MemoryRegion; +using google_breakpad::scoped_ptr; +using google_breakpad::StackFrame; +using google_breakpad::StackFramePPC; +using google_breakpad::StackFrameX86; +using google_breakpad::StackFrameSPARC; + +#if defined(__i386__) +#include "processor/stackwalker_x86.h" +using google_breakpad::StackwalkerX86; +#elif defined(__ppc__) +#include "processor/stackwalker_ppc.h" +using google_breakpad::StackwalkerPPC; +#elif defined(__sparc__) +#include "processor/stackwalker_sparc.h" +using google_breakpad::StackwalkerSPARC; +#endif // __i386__ || __ppc__ || __sparc__ + +#define RECURSION_DEPTH 100 + + +// A simple MemoryRegion subclass that provides direct access to this +// process' memory space by pointer. +class SelfMemoryRegion : public MemoryRegion { + public: + virtual uint64_t GetBase() const { return 0; } + virtual uint32_t GetSize() const { return 0xffffffff; } + + bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const { + return GetMemoryAtAddressInternal(address, value); } + bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const { + return GetMemoryAtAddressInternal(address, value); } + bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const { + return GetMemoryAtAddressInternal(address, value); } + bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const { + return GetMemoryAtAddressInternal(address, value); } + void Print() const { + assert(false); + } + + private: + template bool GetMemoryAtAddressInternal(uint64_t address, + T* value) { + // Without knowing what addresses are actually mapped, just assume that + // everything low is not mapped. This helps the stackwalker catch the + // end of a stack when it tries to dereference a null or low pointer + // in an attempt to find the caller frame. Other unmapped accesses will + // cause the program to crash, but that would properly be a test failure. + if (address < 0x100) + return false; + + uint8_t* memory = 0; + *value = *reinterpret_cast(&memory[address]); + return true; + } +}; + + +#if defined(__GNUC__) + + +#if defined(__i386__) + +// GetEBP returns the current value of the %ebp register. Because it's +// implemented as a function, %ebp itself contains GetEBP's frame pointer +// and not the caller's frame pointer. Dereference %ebp to obtain the +// caller's frame pointer, which the compiler-generated preamble stored +// on the stack (provided frame pointers are not being omitted.) Because +// this function depends on the compiler-generated preamble, inlining is +// disabled. +static uint32_t GetEBP() __attribute__((noinline)); +static uint32_t GetEBP() { + uint32_t ebp; + __asm__ __volatile__( + "movl (%%ebp), %0" + : "=a" (ebp) + ); + return ebp; +} + + +// The caller's %esp is 8 higher than the value of %ebp in this function, +// assuming that it's not inlined and that the standard prolog is used. +// The CALL instruction places a 4-byte return address on the stack above +// the caller's %esp, and this function's prolog will save the caller's %ebp +// on the stack as well, for another 4 bytes, before storing %esp in %ebp. +static uint32_t GetESP() __attribute__((noinline)); +static uint32_t GetESP() { + uint32_t ebp; + __asm__ __volatile__( + "movl %%ebp, %0" + : "=a" (ebp) + ); + return ebp + 8; +} + + +// GetEIP returns the instruction pointer identifying the next instruction +// to execute after GetEIP returns. It obtains this information from the +// stack, where it was placed by the call instruction that called GetEIP. +// This function depends on frame pointers not being omitted. It is possible +// to write a pure asm version of this routine that has no compiler-generated +// preamble and uses %esp instead of %ebp; that would function in the +// absence of frame pointers. However, the simpler approach is used here +// because GetEBP and stackwalking necessarily depends on access to frame +// pointers. Because this function depends on a call instruction and the +// compiler-generated preamble, inlining is disabled. +static uint32_t GetEIP() __attribute__((noinline)); +static uint32_t GetEIP() { + uint32_t eip; + __asm__ __volatile__( + "movl 4(%%ebp), %0" + : "=a" (eip) + ); + return eip; +} + + +#elif defined(__ppc__) + + +// GetSP returns the current value of the %r1 register, which by convention, +// is the stack pointer on ppc. Because it's implemented as a function, +// %r1 itself contains GetSP's own stack pointer and not the caller's stack +// pointer. Dereference %r1 to obtain the caller's stack pointer, which the +// compiler-generated prolog stored on the stack. Because this function +// depends on the compiler-generated prolog, inlining is disabled. +static uint32_t GetSP() __attribute__((noinline)); +static uint32_t GetSP() { + uint32_t sp; + __asm__ __volatile__( + "lwz %0, 0(r1)" + : "=r" (sp) + ); + return sp; +} + + +// GetPC returns the program counter identifying the next instruction to +// execute after GetPC returns. It obtains this information from the +// link register, where it was placed by the branch instruction that called +// GetPC. Because this function depends on the caller's use of a branch +// instruction, inlining is disabled. +static uint32_t GetPC() __attribute__((noinline)); +static uint32_t GetPC() { + uint32_t lr; + __asm__ __volatile__( + "mflr %0" + : "=r" (lr) + ); + return lr; +} + + +#elif defined(__sparc__) + + +// GetSP returns the current value of the %sp/%o6/%g_r[14] register, which +// by convention, is the stack pointer on sparc. Because it's implemented +// as a function, %sp itself contains GetSP's own stack pointer and not +// the caller's stack pointer. Dereference to obtain the caller's stack +// pointer, which the compiler-generated prolog stored on the stack. +// Because this function depends on the compiler-generated prolog, inlining +// is disabled. +static uint32_t GetSP() __attribute__((noinline)); +static uint32_t GetSP() { + uint32_t sp; + __asm__ __volatile__( + "mov %%fp, %0" + : "=r" (sp) + ); + return sp; +} + +// GetFP returns the current value of the %fp register. Because it's +// implemented as a function, %fp itself contains GetFP's frame pointer +// and not the caller's frame pointer. Dereference %fp to obtain the +// caller's frame pointer, which the compiler-generated preamble stored +// on the stack (provided frame pointers are not being omitted.) Because +// this function depends on the compiler-generated preamble, inlining is +// disabled. +static uint32_t GetFP() __attribute__((noinline)); +static uint32_t GetFP() { + uint32_t fp; + __asm__ __volatile__( + "ld [%%fp+56], %0" + : "=r" (fp) + ); + return fp; +} + +// GetPC returns the program counter identifying the next instruction to +// execute after GetPC returns. It obtains this information from the +// link register, where it was placed by the branch instruction that called +// GetPC. Because this function depends on the caller's use of a branch +// instruction, inlining is disabled. +static uint32_t GetPC() __attribute__((noinline)); +static uint32_t GetPC() { + uint32_t pc; + __asm__ __volatile__( + "mov %%i7, %0" + : "=r" (pc) + ); + return pc + 8; +} + +#endif // __i386__ || __ppc__ || __sparc__ + +#elif defined(__SUNPRO_CC) + +#if defined(__i386__) +extern "C" { +extern uint32_t GetEIP(); +extern uint32_t GetEBP(); +extern uint32_t GetESP(); +} +#elif defined(__sparc__) +extern "C" { +extern uint32_t GetPC(); +extern uint32_t GetFP(); +extern uint32_t GetSP(); +} +#endif // __i386__ || __sparc__ + +#endif // __GNUC__ || __SUNPRO_CC + +// CountCallerFrames returns the number of stack frames beneath the function +// that called CountCallerFrames. Because this function's return value +// is dependent on the size of the stack beneath it, inlining is disabled, +// and any function that calls this should not be inlined either. +#if defined(__GNUC__) +static unsigned int CountCallerFrames() __attribute__((noinline)); +#elif defined(__SUNPRO_CC) +static unsigned int CountCallerFrames(); +#endif +static unsigned int CountCallerFrames() { + SelfMemoryRegion memory; + BasicSourceLineResolver resolver; + +#if defined(__i386__) + MDRawContextX86 context = MDRawContextX86(); + context.eip = GetEIP(); + context.ebp = GetEBP(); + context.esp = GetESP(); + + StackwalkerX86 stackwalker = StackwalkerX86(NULL, &context, &memory, NULL, + NULL, &resolver); +#elif defined(__ppc__) + MDRawContextPPC context = MDRawContextPPC(); + context.srr0 = GetPC(); + context.gpr[1] = GetSP(); + + StackwalkerPPC stackwalker = StackwalkerPPC(NULL, &context, &memory, NULL, + NULL, &resolver); +#elif defined(__sparc__) + MDRawContextSPARC context = MDRawContextSPARC(); + context.pc = GetPC(); + context.g_r[14] = GetSP(); + context.g_r[30] = GetFP(); + + StackwalkerSPARC stackwalker = StackwalkerSPARC(NULL, &context, &memory, + NULL, NULL, &resolver); +#endif // __i386__ || __ppc__ || __sparc__ + + CallStack stack; + vector modules_without_symbols; + stackwalker.Walk(&stack, &modules_without_symbols); + +#ifdef PRINT_STACKS + printf("\n"); + for (unsigned int frame_index = 0; + frame_index < stack.frames()->size(); + ++frame_index) { + StackFrame *frame = stack.frames()->at(frame_index); + printf("frame %-3d instruction = 0x%08" PRIx64, + frame_index, frame->instruction); +#if defined(__i386__) + StackFrameX86 *frame_x86 = reinterpret_cast(frame); + printf(" esp = 0x%08x ebp = 0x%08x\n", + frame_x86->context.esp, frame_x86->context.ebp); +#elif defined(__ppc__) + StackFramePPC *frame_ppc = reinterpret_cast(frame); + printf(" gpr[1] = 0x%08x\n", frame_ppc->context.gpr[1]); +#elif defined(__sparc__) + StackFrameSPARC *frame_sparc = reinterpret_cast(frame); + printf(" sp = 0x%08x fp = 0x%08x\n", + frame_sparc->context.g_r[14], frame_sparc->context.g_r[30]); +#endif // __i386__ || __ppc__ || __sparc__ + } +#endif // PRINT_STACKS + + // Subtract 1 because the caller wants the number of frames beneath + // itself. Because the caller called us, subract two for our frame and its + // frame, which are included in stack.size(). + return stack.frames()->size() - 2; +} + + +// Recursor verifies that the number stack frames beneath itself is one more +// than the number of stack frames beneath its parent. When depth frames +// have been reached, Recursor stops checking and returns success. If the +// frame count check fails at any depth, Recursor will stop and return false. +// Because this calls CountCallerFrames, inlining is disabled. +#if defined(__GNUC__) +static bool Recursor(unsigned int depth, unsigned int parent_callers) + __attribute__((noinline)); +#elif defined(__SUNPRO_CC) +static bool Recursor(unsigned int depth, unsigned int parent_callers); +#endif +static bool Recursor(unsigned int depth, unsigned int parent_callers) { + unsigned int callers = CountCallerFrames(); + if (callers != parent_callers + 1) + return false; + + if (depth) + return Recursor(depth - 1, callers); + + // depth == 0 + return true; +} + + +// Because this calls CountCallerFrames, inlining is disabled - but because +// it's main (and nobody calls it other than the entry point), it wouldn't +// be inlined anyway. +#if defined(__GNUC__) +int main(int argc, char** argv) __attribute__((noinline)); +#elif defined(__SUNPRO_CC) +int main(int argc, char** argv); +#endif +int main(int argc, char** argv) { + BPLOG_INIT(&argc, &argv); + + return Recursor(RECURSION_DEPTH, CountCallerFrames()) ? 0 : 1; +} + + +#else +// Not i386 or ppc or sparc? We can only test stacks we know how to walk. + + +int main(int argc, char** argv) { + BPLOG_INIT(&argc, &argv); + + // "make check" interprets an exit status of 77 to mean that the test is + // not supported. + BPLOG(ERROR) << "Selftest not supported here"; + return 77; +} + + +#endif // (__GNUC__ || __SUNPRO_CC) && (__i386__ || __ppc__ || __sparc__) diff --git a/src/processor/stackwalker_selftest_sol.s b/src/processor/stackwalker_selftest_sol.s new file mode 100644 index 0000000..11d1698 --- /dev/null +++ b/src/processor/stackwalker_selftest_sol.s @@ -0,0 +1,110 @@ +/* Copyright 2007 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* stackwalker_selftest_sol.s + * On Solaris, the recommeded compiler is CC, so we can not use gcc inline + * asm, use this method instead. + * + * How to compile: as -P -L -D_ASM -D_STDC -K PIC -o \ + * src/processor/stackwalker_selftest_sol.o \ + * src/processor/stackwalker_selftest_sol.s + * + * Author: Michael Shang + */ + +#include + +#if defined(__i386) + + +ENTRY(GetEBP) + pushl %ebp + movl %esp,%ebp + subl $0x00000004,%esp + movl 0x00000000(%ebp),%eax + movl %eax,0xfffffffc(%ebp) + movl 0xfffffffc(%ebp),%eax + leave + ret +SET_SIZE(GetEBP) + +ENTRY(GetEIP) + pushl %ebp + movl %esp,%ebp + subl $0x00000004,%esp + movl 0x00000004(%ebp),%eax + movl %eax,0xfffffffc(%ebp) + movl 0xfffffffc(%ebp),%eax + leave + ret +SET_SIZE(GetEIP) + +ENTRY(GetESP) + pushl %ebp + movl %esp,%ebp + subl $0x00000004,%esp + movl %ebp,%eax + movl %eax,0xfffffffc(%ebp) + movl 0xfffffffc(%ebp),%eax + addl $0x00000008,%eax + leave + ret +SET_SIZE(GetESP) + + +#elif defined(__sparc) + + +ENTRY(GetPC) + save %sp, -120, %sp + mov %i7, %i4 + inccc 8, %i4 + mov %i4, %i0 + ret + restore +SET_SIZE(GetPC) + +ENTRY(GetSP) + save %sp, -120, %sp + mov %fp, %i4 + mov %i4, %i0 + ret + restore +SET_SIZE(GetSP) + +ENTRY(GetFP) + save %sp, -120, %sp + ld [%fp + 56], %g1 + mov %g1, %i0 + ret + restore +SET_SIZE(GetFP) + + +#endif // __i386 || __sparc diff --git a/src/processor/stackwalker_sparc.cc b/src/processor/stackwalker_sparc.cc new file mode 100644 index 0000000..ed7f7dc --- /dev/null +++ b/src/processor/stackwalker_sparc.cc @@ -0,0 +1,149 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_sparc.cc: sparc-specific stackwalker. +// +// See stackwalker_sparc.h for documentation. +// +// Author: Michael Shang + + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/logging.h" +#include "processor/stackwalker_sparc.h" + +namespace google_breakpad { + + +StackwalkerSPARC::StackwalkerSPARC(const SystemInfo* system_info, + const MDRawContextSPARC* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* resolver_helper) + : Stackwalker(system_info, memory, modules, resolver_helper), + context_(context) { +} + + +StackFrame* StackwalkerSPARC::GetContextFrame() { + if (!context_) { + BPLOG(ERROR) << "Can't get context frame without context"; + return NULL; + } + + StackFrameSPARC* frame = new StackFrameSPARC(); + + // The instruction pointer is stored directly in a register, so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = StackFrameSPARC::CONTEXT_VALID_ALL; + frame->trust = StackFrame::FRAME_TRUST_CONTEXT; + frame->instruction = frame->context.pc; + + return frame; +} + + +StackFrame* StackwalkerSPARC::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + StackFrameSPARC* last_frame = static_cast( + stack->frames()->back()); + + // new: caller + // old: callee + // %fp, %i6 and g_r[30] is the same, see minidump_format.h + // %sp, %o6 and g_r[14] is the same, see minidump_format.h + // %sp_new = %fp_old + // %fp_new = *(%fp_old + 32 + 32 - 8), where the callee's %i6 + // %pc_new = *(%fp_old + 32 + 32 - 4) + 8 + // which is callee's %i7 plus 8 + + // A caller frame must reside higher in memory than its callee frames. + // Anything else is an error, or an indication that we've reached the + // end of the stack. + uint64_t stack_pointer = last_frame->context.g_r[30]; + if (stack_pointer <= last_frame->context.g_r[14]) { + return NULL; + } + + uint32_t instruction; + if (!memory_->GetMemoryAtAddress(stack_pointer + 60, + &instruction) || instruction <= 1) { + return NULL; + } + + uint32_t stack_base; + if (!memory_->GetMemoryAtAddress(stack_pointer + 56, + &stack_base) || stack_base <= 1) { + return NULL; + } + + // Should we terminate the stack walk? (end-of-stack or broken invariant) + if (TerminateWalk(instruction, stack_pointer, last_frame->context.g_r[14], + /*is_context_frame=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + return NULL; + } + + StackFrameSPARC* frame = new StackFrameSPARC(); + + frame->context = last_frame->context; + frame->context.g_r[14] = stack_pointer; + frame->context.g_r[30] = stack_base; + + // frame->context.pc is the return address, which is 2 instruction + // past the branch that caused us to arrive at the callee, which are + // a CALL instruction then a NOP instruction. + // frame_ppc->instruction to 8 less than that. Since all sparc + // instructions are 4 bytes wide, this is the address of the branch + // instruction. This allows source line information to match up with the + // line that contains a function call. Callers that require the exact + // return address value may access the %i7/g_r[31] field of StackFrameSPARC. + frame->context.pc = instruction + 8; + frame->instruction = instruction; + frame->context_validity = StackFrameSPARC::CONTEXT_VALID_PC | + StackFrameSPARC::CONTEXT_VALID_SP | + StackFrameSPARC::CONTEXT_VALID_FP; + frame->trust = StackFrame::FRAME_TRUST_FP; + + return frame; +} + + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_sparc.h b/src/processor/stackwalker_sparc.h new file mode 100644 index 0000000..b7ba507 --- /dev/null +++ b/src/processor/stackwalker_sparc.h @@ -0,0 +1,77 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_sparc.h: sparc-specific stackwalker. +// +// Provides stack frames given sparc register context and a memory region +// corresponding to an sparc stack. +// +// Author: Michael Shang + + +#ifndef PROCESSOR_STACKWALKER_SPARC_H__ +#define PROCESSOR_STACKWALKER_SPARC_H__ + + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" + +namespace google_breakpad { + +class CodeModules; + +class StackwalkerSPARC : public Stackwalker { + public: + // context is a sparc context object that gives access to sparc-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerSPARC(const SystemInfo* system_info, + const MDRawContextSPARC* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + private: + // Implementation of Stackwalker, using sparc context (%fp, %sp, %pc) and + // stack conventions + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextSPARC* context_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_SPARC_H__ diff --git a/src/processor/stackwalker_unittest_utils.h b/src/processor/stackwalker_unittest_utils.h new file mode 100644 index 0000000..3d651b2 --- /dev/null +++ b/src/processor/stackwalker_unittest_utils.h @@ -0,0 +1,219 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// Mock classes for writing stackwalker tests, shared amongst architectures. + +#ifndef PROCESSOR_STACKWALKER_UNITTEST_UTILS_H_ +#define PROCESSOR_STACKWALKER_UNITTEST_UTILS_H_ + +#include +#include +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/symbol_supplier.h" +#include "google_breakpad/processor/system_info.h" +#include "processor/linked_ptr.h" + +class MockMemoryRegion: public google_breakpad::MemoryRegion { + public: + MockMemoryRegion(): base_address_(0) { } + + // Set this region's address and contents. If we have placed an + // instance of this class in a test fixture class, individual tests + // can use this to provide the region's contents. + void Init(uint64_t base_address, const string& contents) { + base_address_ = base_address; + contents_ = contents; + } + + uint64_t GetBase() const { return base_address_; } + uint32_t GetSize() const { return contents_.size(); } + + bool GetMemoryAtAddress(uint64_t address, uint8_t* value) const { + return GetMemoryLittleEndian(address, value); + } + bool GetMemoryAtAddress(uint64_t address, uint16_t* value) const { + return GetMemoryLittleEndian(address, value); + } + bool GetMemoryAtAddress(uint64_t address, uint32_t* value) const { + return GetMemoryLittleEndian(address, value); + } + bool GetMemoryAtAddress(uint64_t address, uint64_t* value) const { + return GetMemoryLittleEndian(address, value); + } + void Print() const { + assert(false); + } + + private: + // Fetch a little-endian value from ADDRESS in contents_ whose size + // is BYTES, and store it in *VALUE. Return true on success. + template + bool GetMemoryLittleEndian(uint64_t address, ValueType* value) const { + if (address < base_address_ || + address - base_address_ + sizeof(ValueType) > contents_.size()) + return false; + ValueType v = 0; + int start = address - base_address_; + // The loop condition is odd, but it's correct for size_t. + for (size_t i = sizeof(ValueType) - 1; i < sizeof(ValueType); i--) + v = (v << 8) | static_cast(contents_[start + i]); + *value = v; + return true; + } + + uint64_t base_address_; + string contents_; +}; + +class MockCodeModule: public google_breakpad::CodeModule { + public: + MockCodeModule(uint64_t base_address, uint64_t size, + const string& code_file, const string& version) + : base_address_(base_address), size_(size), code_file_(code_file) { } + + uint64_t base_address() const { return base_address_; } + uint64_t size() const { return size_; } + string code_file() const { return code_file_; } + string code_identifier() const { return code_file_; } + string debug_file() const { return code_file_; } + string debug_identifier() const { return code_file_; } + string version() const { return version_; } + google_breakpad::CodeModule* Copy() const { + abort(); // Tests won't use this. + } + virtual bool is_unloaded() const { return false; } + virtual uint64_t shrink_down_delta() const { return 0; } + virtual void SetShrinkDownDelta(uint64_t shrink_down_delta) {} + + private: + uint64_t base_address_; + uint64_t size_; + string code_file_; + string version_; +}; + +class MockCodeModules: public google_breakpad::CodeModules { + public: + typedef google_breakpad::CodeModule CodeModule; + typedef google_breakpad::CodeModules CodeModules; + + void Add(const MockCodeModule* module) { + modules_.push_back(module); + } + + unsigned int module_count() const { return modules_.size(); } + + const CodeModule* GetModuleForAddress(uint64_t address) const { + for (ModuleVector::const_iterator i = modules_.begin(); + i != modules_.end(); i++) { + const MockCodeModule* module = *i; + if (module->base_address() <= address && + address - module->base_address() < module->size()) + return module; + } + return NULL; + }; + + const CodeModule* GetMainModule() const { return modules_[0]; } + + const CodeModule* GetModuleAtSequence(unsigned int sequence) const { + return modules_.at(sequence); + } + + const CodeModule* GetModuleAtIndex(unsigned int index) const { + return modules_.at(index); + } + + CodeModules* Copy() const { abort(); } // Tests won't use this + + virtual std::vector > + GetShrunkRangeModules() const { + return std::vector >(); + } + + private: + typedef std::vector ModuleVector; + ModuleVector modules_; +}; + +class MockSymbolSupplier: public google_breakpad::SymbolSupplier { + public: + typedef google_breakpad::CodeModule CodeModule; + typedef google_breakpad::SystemInfo SystemInfo; + MOCK_METHOD3(GetSymbolFile, SymbolResult(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file)); + MOCK_METHOD4(GetSymbolFile, SymbolResult(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + string* symbol_data)); + MOCK_METHOD5(GetCStringSymbolData, SymbolResult(const CodeModule* module, + const SystemInfo* system_info, + string* symbol_file, + char** symbol_data, + size_t* symbol_data_size)); + MOCK_METHOD1(FreeSymbolData, void(const CodeModule* module)); + + // Copies the passed string contents into a newly allocated buffer. + // The newly allocated buffer will be freed during destruction. + char* CopySymbolDataAndOwnTheCopy(const string& info, + size_t* symbol_data_size) { + *symbol_data_size = info.size() + 1; + char* symbol_data = new char[*symbol_data_size]; + memcpy(symbol_data, info.c_str(), info.size()); + symbol_data[info.size()] = '\0'; + symbol_data_to_free_.push_back(symbol_data); + return symbol_data; + } + + virtual ~MockSymbolSupplier() { + for (SymbolDataVector::const_iterator i = symbol_data_to_free_.begin(); + i != symbol_data_to_free_.end(); i++) { + char* symbol_data = *i; + delete [] symbol_data; + } + } + + private: + // List of symbol data to be freed upon destruction + typedef std::vector SymbolDataVector; + SymbolDataVector symbol_data_to_free_; +}; + +#endif // PROCESSOR_STACKWALKER_UNITTEST_UTILS_H_ diff --git a/src/processor/stackwalker_x86.cc b/src/processor/stackwalker_x86.cc new file mode 100644 index 0000000..9bda5f8 --- /dev/null +++ b/src/processor/stackwalker_x86.cc @@ -0,0 +1,704 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_x86.cc: x86-specific stackwalker. +// +// See stackwalker_x86.h for documentation. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "common/scoped_ptr.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_modules.h" +#include "google_breakpad/processor/memory_region.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/logging.h" +#include "processor/postfix_evaluator-inl.h" +#include "processor/stackwalker_x86.h" +#include "processor/windows_frame_info.h" +#include "processor/cfi_frame_info.h" + +namespace google_breakpad { + +// Max reasonable size for a single x86 frame is 128 KB. This value is used in +// a heuristic for recovering of the EBP chain after a scan for return address. +// This value is based on a stack frame size histogram built for a set of +// popular third party libraries which suggests that 99.5% of all frames are +// smaller than 128 KB. +static const uint32_t kMaxReasonableGapBetweenFrames = 128 * 1024; + +const StackwalkerX86::CFIWalker::RegisterSet +StackwalkerX86::cfi_register_map_[] = { + // It may seem like $eip and $esp are callee-saves, because (with Unix or + // cdecl calling conventions) the callee is responsible for having them + // restored upon return. But the callee_saves flags here really means + // that the walker should assume they're unchanged if the CFI doesn't + // mention them, which is clearly wrong for $eip and $esp. + { "$eip", ".ra", false, + StackFrameX86::CONTEXT_VALID_EIP, &MDRawContextX86::eip }, + { "$esp", ".cfa", false, + StackFrameX86::CONTEXT_VALID_ESP, &MDRawContextX86::esp }, + { "$ebp", NULL, true, + StackFrameX86::CONTEXT_VALID_EBP, &MDRawContextX86::ebp }, + { "$eax", NULL, false, + StackFrameX86::CONTEXT_VALID_EAX, &MDRawContextX86::eax }, + { "$ebx", NULL, true, + StackFrameX86::CONTEXT_VALID_EBX, &MDRawContextX86::ebx }, + { "$ecx", NULL, false, + StackFrameX86::CONTEXT_VALID_ECX, &MDRawContextX86::ecx }, + { "$edx", NULL, false, + StackFrameX86::CONTEXT_VALID_EDX, &MDRawContextX86::edx }, + { "$esi", NULL, true, + StackFrameX86::CONTEXT_VALID_ESI, &MDRawContextX86::esi }, + { "$edi", NULL, true, + StackFrameX86::CONTEXT_VALID_EDI, &MDRawContextX86::edi }, +}; + +StackwalkerX86::StackwalkerX86(const SystemInfo* system_info, + const MDRawContextX86* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* resolver_helper) + : Stackwalker(system_info, memory, modules, resolver_helper), + context_(context), + cfi_walker_(cfi_register_map_, + (sizeof(cfi_register_map_) / sizeof(cfi_register_map_[0]))) { + if (memory_ && memory_->GetBase() + memory_->GetSize() - 1 > 0xffffffff) { + // The x86 is a 32-bit CPU, the limits of the supplied stack are invalid. + // Mark memory_ = NULL, which will cause stackwalking to fail. + BPLOG(ERROR) << "Memory out of range for stackwalking: " << + HexString(memory_->GetBase()) << "+" << + HexString(memory_->GetSize()); + memory_ = NULL; + } +} + +StackFrameX86::~StackFrameX86() { + if (windows_frame_info) + delete windows_frame_info; + windows_frame_info = NULL; + if (cfi_frame_info) + delete cfi_frame_info; + cfi_frame_info = NULL; +} + +uint64_t StackFrameX86::ReturnAddress() const { + assert(context_validity & StackFrameX86::CONTEXT_VALID_EIP); + return context.eip; +} + +StackFrame* StackwalkerX86::GetContextFrame() { + if (!context_) { + BPLOG(ERROR) << "Can't get context frame without context"; + return NULL; + } + + StackFrameX86* frame = new StackFrameX86(); + + // The instruction pointer is stored directly in a register, so pull it + // straight out of the CPU context structure. + frame->context = *context_; + frame->context_validity = StackFrameX86::CONTEXT_VALID_ALL; + frame->trust = StackFrame::FRAME_TRUST_CONTEXT; + frame->instruction = frame->context.eip; + + return frame; +} + +StackFrameX86* StackwalkerX86::GetCallerByWindowsFrameInfo( + const vector& frames, + WindowsFrameInfo* last_frame_info, + bool stack_scan_allowed) { + StackFrame::FrameTrust trust = StackFrame::FRAME_TRUST_NONE; + + // The last frame can never be inline. A sequence of inline frames always + // finishes with a conventional frame. + assert(frames.back()->trust != StackFrame::FRAME_TRUST_INLINE); + StackFrameX86* last_frame = static_cast(frames.back()); + + // Save the stack walking info we found, in case we need it later to + // find the callee of the frame we're constructing now. + last_frame->windows_frame_info = last_frame_info; + + // This function only covers the full STACK WIN case. If + // last_frame_info is VALID_PARAMETER_SIZE-only, then we should + // assume the traditional frame format or use some other strategy. + if (last_frame_info->valid != WindowsFrameInfo::VALID_ALL) + return NULL; + + // This stackwalker sets each frame's %esp to its value immediately prior + // to the CALL into the callee. This means that %esp points to the last + // callee argument pushed onto the stack, which may not be where %esp points + // after the callee returns. Specifically, the value is correct for the + // cdecl calling convention, but not other conventions. The cdecl + // convention requires a caller to pop its callee's arguments from the + // stack after the callee returns. This is usually accomplished by adding + // the known size of the arguments to %esp. Other calling conventions, + // including stdcall, thiscall, and fastcall, require the callee to pop any + // parameters stored on the stack before returning. This is usually + // accomplished by using the RET n instruction, which pops n bytes off + // the stack after popping the return address. + // + // Because each frame's %esp will point to a location on the stack after + // callee arguments have been PUSHed, when locating things in a stack frame + // relative to %esp, the size of the arguments to the callee need to be + // taken into account. This seems a little bit unclean, but it's better + // than the alternative, which would need to take these same things into + // account, but only for cdecl functions. With this implementation, we get + // to be agnostic about each function's calling convention. Furthermore, + // this is how Windows debugging tools work, so it means that the %esp + // values produced by this stackwalker directly correspond to the %esp + // values you'll see there. + // + // If the last frame has no callee (because it's the context frame), just + // set the callee parameter size to 0: the stack pointer can't point to + // callee arguments because there's no callee. This is correct as long + // as the context wasn't captured while arguments were being pushed for + // a function call. Note that there may be functions whose parameter sizes + // are unknown, 0 is also used in that case. When that happens, it should + // be possible to walk to the next frame without reference to %esp. + + uint32_t last_frame_callee_parameter_size = 0; + int frames_already_walked = frames.size(); + for (int last_frame_callee_id = frames_already_walked - 2; + last_frame_callee_id >= 0; last_frame_callee_id--) { + // Searching for a real callee frame. Skipping inline frames since they + // cannot be downcasted to StackFrameX86. + if (frames[last_frame_callee_id]->trust == StackFrame::FRAME_TRUST_INLINE) { + continue; + } + const StackFrameX86* last_frame_callee + = static_cast(frames[last_frame_callee_id]); + WindowsFrameInfo* last_frame_callee_info + = last_frame_callee->windows_frame_info; + if (last_frame_callee_info && + (last_frame_callee_info->valid + & WindowsFrameInfo::VALID_PARAMETER_SIZE)) { + last_frame_callee_parameter_size = + last_frame_callee_info->parameter_size; + } + } + + // Set up the dictionary for the PostfixEvaluator. %ebp, %esp, and sometimes + // %ebx are used in program strings, and their previous values are known, so + // set them here. + PostfixEvaluator::DictionaryType dictionary; + // Provide the current register values. + dictionary["$ebp"] = last_frame->context.ebp; + dictionary["$esp"] = last_frame->context.esp; + if (last_frame->context_validity & StackFrameX86::CONTEXT_VALID_EBX) + dictionary["$ebx"] = last_frame->context.ebx; + // Provide constants from the debug info for last_frame and its callee. + // .cbCalleeParams is a Breakpad extension that allows us to use the + // PostfixEvaluator engine when certain types of debugging information + // are present without having to write the constants into the program + // string as literals. + dictionary[".cbCalleeParams"] = last_frame_callee_parameter_size; + dictionary[".cbSavedRegs"] = last_frame_info->saved_register_size; + dictionary[".cbLocals"] = last_frame_info->local_size; + + uint32_t raSearchStart = last_frame->context.esp + + last_frame_callee_parameter_size + + last_frame_info->local_size + + last_frame_info->saved_register_size; + + uint32_t raSearchStartOld = raSearchStart; + uint32_t found = 0; // dummy value + // Scan up to three words above the calculated search value, in case + // the stack was aligned to a quadword boundary. + // + // TODO(ivan.penkov): Consider cleaning up the scan for return address that + // follows. The purpose of this scan is to adjust the .raSearchStart + // calculation (which is based on register %esp) in the cases where register + // %esp may have been aligned (up to a quadword). There are two problems + // with this approach: + // 1) In practice, 64 byte boundary alignment is seen which clearly can not + // be handled by a three word scan. + // 2) A search for a return address is "guesswork" by definition because + // the results will be different depending on what is left on the stack + // from previous executions. + // So, basically, the results from this scan should be ignored if other means + // for calculation of the value of .raSearchStart are available. + if (ScanForReturnAddress(raSearchStart, &raSearchStart, &found, 3) && + last_frame->trust == StackFrame::FRAME_TRUST_CONTEXT && + last_frame->windows_frame_info != NULL && + last_frame_info->type_ == WindowsFrameInfo::STACK_INFO_FPO && + raSearchStartOld == raSearchStart && + found == last_frame->context.eip) { + // The context frame represents an FPO-optimized Windows system call. + // On the top of the stack we have a pointer to the current instruction. + // This means that the callee has returned but the return address is still + // on the top of the stack which is very atypical situaltion. + // Skip one slot from the stack and do another scan in order to get the + // actual return address. + raSearchStart += 4; + ScanForReturnAddress(raSearchStart, &raSearchStart, &found, 3); + } + + dictionary[".cbParams"] = last_frame_info->parameter_size; + + // Decide what type of program string to use. The program string is in + // postfix notation and will be passed to PostfixEvaluator::Evaluate. + // Given the dictionary and the program string, it is possible to compute + // the return address and the values of other registers in the calling + // function. Because of bugs described below, the stack may need to be + // scanned for these values. The results of program string evaluation + // will be used to determine whether to scan for better values. + string program_string; + bool recover_ebp = true; + + trust = StackFrame::FRAME_TRUST_CFI; + if (!last_frame_info->program_string.empty()) { + // The FPO data has its own program string, which will tell us how to + // get to the caller frame, and may even fill in the values of + // nonvolatile registers and provide pointers to local variables and + // parameters. In some cases, particularly with program strings that use + // .raSearchStart, the stack may need to be scanned afterward. + program_string = last_frame_info->program_string; + } else if (last_frame_info->allocates_base_pointer) { + // The function corresponding to the last frame doesn't use the frame + // pointer for conventional purposes, but it does allocate a new + // frame pointer and use it for its own purposes. Its callee's + // information is still accessed relative to %esp, and the previous + // value of %ebp can be recovered from a location in its stack frame, + // within the saved-register area. + // + // Functions that fall into this category use the %ebp register for + // a purpose other than the frame pointer. They restore the caller's + // %ebp before returning. These functions create their stack frame + // after a CALL by decrementing the stack pointer in an amount + // sufficient to store local variables, and then PUSHing saved + // registers onto the stack. Arguments to a callee function, if any, + // are PUSHed after that. Walking up to the caller, therefore, + // can be done solely with calculations relative to the stack pointer + // (%esp). The return address is recovered from the memory location + // above the known sizes of the callee's parameters, saved registers, + // and locals. The caller's stack pointer (the value of %esp when + // the caller executed CALL) is the location immediately above the + // saved return address. The saved value of %ebp to be restored for + // the caller is at a known location in the saved-register area of + // the stack frame. + // + // For this type of frame, MSVC 14 (from Visual Studio 8/2005) in + // link-time code generation mode (/LTCG and /GL) can generate erroneous + // debugging data. The reported size of saved registers can be 0, + // which is clearly an error because these frames must, at the very + // least, save %ebp. For this reason, in addition to those given above + // about the use of .raSearchStart, the stack may need to be scanned + // for a better return address and a better frame pointer after the + // program string is evaluated. + // + // %eip_new = *(%esp_old + callee_params + saved_regs + locals) + // %ebp_new = *(%esp_old + callee_params + saved_regs - 8) + // %esp_new = %esp_old + callee_params + saved_regs + locals + 4 + program_string = "$eip .raSearchStart ^ = " + "$ebp $esp .cbCalleeParams + .cbSavedRegs + 8 - ^ = " + "$esp .raSearchStart 4 + ="; + } else { + // The function corresponding to the last frame doesn't use %ebp at + // all. The callee frame is located relative to %esp. + // + // The called procedure's instruction pointer and stack pointer are + // recovered in the same way as the case above, except that no + // frame pointer (%ebp) is used at all, so it is not saved anywhere + // in the callee's stack frame and does not need to be recovered. + // Because %ebp wasn't used in the callee, whatever value it has + // is the value that it had in the caller, so it can be carried + // straight through without bringing its validity into question. + // + // Because of the use of .raSearchStart, the stack will possibly be + // examined to locate a better return address after program string + // evaluation. The stack will not be examined to locate a saved + // %ebp value, because these frames do not save (or use) %ebp. + // + // We also propagate %ebx through, as it is commonly unmodifed after + // calling simple forwarding functions in ntdll (that are this non-EBP + // using type). It's not clear that this is always correct, but it is + // important for some functions to get a correct walk. + // + // %eip_new = *(%esp_old + callee_params + saved_regs + locals) + // %esp_new = %esp_old + callee_params + saved_regs + locals + 4 + // %ebp_new = %ebp_old + // %ebx_new = %ebx_old // If available. + program_string = "$eip .raSearchStart ^ = " + "$esp .raSearchStart 4 + ="; + if (last_frame->context_validity & StackFrameX86::CONTEXT_VALID_EBX) + program_string += " $ebx $ebx ="; + recover_ebp = false; + } + + // Check for alignment operators in the program string. If alignment + // operators are found, then current %ebp must be valid and it is the only + // reliable data point that can be used for getting to the previous frame. + // E.g. the .raSearchStart calculation (above) is based on %esp and since + // %esp was aligned in the current frame (which is a lossy operation) the + // calculated value of .raSearchStart cannot be correct and should not be + // used. Instead .raSearchStart must be calculated based on %ebp. + // The code that follows assumes that .raSearchStart is supposed to point + // at the saved return address (ebp + 4). + // For some more details on this topic, take a look at the following thread: + // https://groups.google.com/forum/#!topic/google-breakpad-dev/ZP1FA9B1JjM + if ((StackFrameX86::CONTEXT_VALID_EBP & last_frame->context_validity) != 0 && + program_string.find('@') != string::npos) { + raSearchStart = last_frame->context.ebp + 4; + } + + // The difference between raSearch and raSearchStart is unknown, + // but making them the same seems to work well in practice. + dictionary[".raSearchStart"] = raSearchStart; + dictionary[".raSearch"] = raSearchStart; + + // Now crank it out, making sure that the program string set at least the + // two required variables. + PostfixEvaluator evaluator = + PostfixEvaluator(&dictionary, memory_); + PostfixEvaluator::DictionaryValidityType dictionary_validity; + if (!evaluator.Evaluate(program_string, &dictionary_validity) || + dictionary_validity.find("$eip") == dictionary_validity.end() || + dictionary_validity.find("$esp") == dictionary_validity.end()) { + // Program string evaluation failed. It may be that %eip is not somewhere + // with stack frame info, and %ebp is pointing to non-stack memory, so + // our evaluation couldn't succeed. We'll scan the stack for a return + // address. This can happen if the stack is in a module for which + // we don't have symbols, and that module is compiled without a + // frame pointer. + uint32_t location_start = last_frame->context.esp; + uint32_t location, eip; + if (!stack_scan_allowed || + !ScanForReturnAddress(location_start, &location, &eip, + /*is_context_frame=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + // if we can't find an instruction pointer even with stack scanning, + // give up. + return NULL; + } + + // This seems like a reasonable return address. Since program string + // evaluation failed, use it and set %esp to the location above the + // one where the return address was found. + dictionary["$eip"] = eip; + dictionary["$esp"] = location + 4; + trust = StackFrame::FRAME_TRUST_SCAN; + } + + // Since this stack frame did not use %ebp in a traditional way, + // locating the return address isn't entirely deterministic. In that + // case, the stack can be scanned to locate the return address. + // + // However, if program string evaluation resulted in both %eip and + // %ebp values of 0, trust that the end of the stack has been + // reached and don't scan for anything else. + if (dictionary["$eip"] != 0 || dictionary["$ebp"] != 0) { + int offset = 0; + + // This scan can only be done if a CodeModules object is available, to + // check that candidate return addresses are in fact inside a module. + // + // TODO(mmentovai): This ignores dynamically-generated code. One possible + // solution is to check the minidump's memory map to see if the candidate + // %eip value comes from a mapped executable page, although this would + // require dumps that contain MINIDUMP_MEMORY_INFO, which the Breakpad + // client doesn't currently write (it would need to call MiniDumpWriteDump + // with the MiniDumpWithFullMemoryInfo type bit set). Even given this + // ability, older OSes (pre-XP SP2) and CPUs (pre-P4) don't enforce + // an independent execute privilege on memory pages. + + uint32_t eip = dictionary["$eip"]; + if (modules_ && !modules_->GetModuleForAddress(eip)) { + // The instruction pointer at .raSearchStart was invalid, so start + // looking one 32-bit word above that location. + uint32_t location_start = dictionary[".raSearchStart"] + 4; + uint32_t location; + if (stack_scan_allowed && + ScanForReturnAddress(location_start, &location, &eip, + /*is_context_frame=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + // This is a better return address that what program string + // evaluation found. Use it, and set %esp to the location above the + // one where the return address was found. + dictionary["$eip"] = eip; + dictionary["$esp"] = location + 4; + offset = location - location_start; + trust = StackFrame::FRAME_TRUST_CFI_SCAN; + } + } + + if (recover_ebp) { + // When trying to recover the previous value of the frame pointer (%ebp), + // start looking at the lowest possible address in the saved-register + // area, and look at the entire saved register area, increased by the + // size of |offset| to account for additional data that may be on the + // stack. The scan is performed from the highest possible address to + // the lowest, because the expectation is that the function's prolog + // would have saved %ebp early. + uint32_t ebp = dictionary["$ebp"]; + + // When a scan for return address is used, it is possible to skip one or + // more frames (when return address is not in a known module). One + // indication for skipped frames is when the value of %ebp is lower than + // the location of the return address on the stack + bool has_skipped_frames = + (trust != StackFrame::FRAME_TRUST_CFI && ebp <= raSearchStart + offset); + + uint32_t value; // throwaway variable to check pointer validity + if (has_skipped_frames || !memory_->GetMemoryAtAddress(ebp, &value)) { + int fp_search_bytes = last_frame_info->saved_register_size + offset; + uint32_t location_end = last_frame->context.esp + + last_frame_callee_parameter_size; + + for (uint32_t location = location_end + fp_search_bytes; + location >= location_end; + location -= 4) { + if (!memory_->GetMemoryAtAddress(location, &ebp)) + break; + + if (memory_->GetMemoryAtAddress(ebp, &value)) { + // The candidate value is a pointer to the same memory region + // (the stack). Prefer it as a recovered %ebp result. + dictionary["$ebp"] = ebp; + break; + } + } + } + } + } + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameX86* frame = new StackFrameX86(); + + frame->trust = trust; + frame->context = last_frame->context; + frame->context.eip = dictionary["$eip"]; + frame->context.esp = dictionary["$esp"]; + frame->context.ebp = dictionary["$ebp"]; + frame->context_validity = StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP; + + // These are nonvolatile (callee-save) registers, and the program string + // may have filled them in. + if (dictionary_validity.find("$ebx") != dictionary_validity.end()) { + frame->context.ebx = dictionary["$ebx"]; + frame->context_validity |= StackFrameX86::CONTEXT_VALID_EBX; + } + if (dictionary_validity.find("$esi") != dictionary_validity.end()) { + frame->context.esi = dictionary["$esi"]; + frame->context_validity |= StackFrameX86::CONTEXT_VALID_ESI; + } + if (dictionary_validity.find("$edi") != dictionary_validity.end()) { + frame->context.edi = dictionary["$edi"]; + frame->context_validity |= StackFrameX86::CONTEXT_VALID_EDI; + } + + return frame; +} + +StackFrameX86* StackwalkerX86::GetCallerByCFIFrameInfo( + const vector& frames, + CFIFrameInfo* cfi_frame_info) { + // The last frame can never be inline. A sequence of inline frames always + // finishes with a conventional frame. + assert(frames.back()->trust != StackFrame::FRAME_TRUST_INLINE); + StackFrameX86* last_frame = static_cast(frames.back()); + last_frame->cfi_frame_info = cfi_frame_info; + + scoped_ptr frame(new StackFrameX86()); + if (!cfi_walker_ + .FindCallerRegisters(*memory_, *cfi_frame_info, + last_frame->context, last_frame->context_validity, + &frame->context, &frame->context_validity)) + return NULL; + + // Make sure we recovered all the essentials. + static const int essentials = (StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP); + if ((frame->context_validity & essentials) != essentials) + return NULL; + + frame->trust = StackFrame::FRAME_TRUST_CFI; + + return frame.release(); +} + +StackFrameX86* StackwalkerX86::GetCallerByEBPAtBase( + const vector& frames, + bool stack_scan_allowed) { + StackFrame::FrameTrust trust; + // The last frame can never be inline. A sequence of inline frames always + // finishes with a conventional frame. + assert(frames.back()->trust != StackFrame::FRAME_TRUST_INLINE); + StackFrameX86* last_frame = static_cast(frames.back()); + uint32_t last_esp = last_frame->context.esp; + uint32_t last_ebp = last_frame->context.ebp; + + // Assume that the standard %ebp-using x86 calling convention is in + // use. + // + // The typical x86 calling convention, when frame pointers are present, + // is for the calling procedure to use CALL, which pushes the return + // address onto the stack and sets the instruction pointer (%eip) to + // the entry point of the called routine. The called routine then + // PUSHes the calling routine's frame pointer (%ebp) onto the stack + // before copying the stack pointer (%esp) to the frame pointer (%ebp). + // Therefore, the calling procedure's frame pointer is always available + // by dereferencing the called procedure's frame pointer, and the return + // address is always available at the memory location immediately above + // the address pointed to by the called procedure's frame pointer. The + // calling procedure's stack pointer (%esp) is 8 higher than the value + // of the called procedure's frame pointer at the time the calling + // procedure made the CALL: 4 bytes for the return address pushed by the + // CALL itself, and 4 bytes for the callee's PUSH of the caller's frame + // pointer. + // + // %eip_new = *(%ebp_old + 4) + // %esp_new = %ebp_old + 8 + // %ebp_new = *(%ebp_old) + + uint32_t caller_eip, caller_esp, caller_ebp; + + if (memory_->GetMemoryAtAddress(last_ebp + 4, &caller_eip) && + memory_->GetMemoryAtAddress(last_ebp, &caller_ebp)) { + caller_esp = last_ebp + 8; + trust = StackFrame::FRAME_TRUST_FP; + } else { + // We couldn't read the memory %ebp refers to. It may be that %ebp + // is pointing to non-stack memory. We'll scan the stack for a + // return address. This can happen if last_frame is executing code + // for a module for which we don't have symbols, and that module + // is compiled without a frame pointer. + if (!stack_scan_allowed || + !ScanForReturnAddress(last_esp, &caller_esp, &caller_eip, + /*is_context_frame=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + // if we can't find an instruction pointer even with stack scanning, + // give up. + return NULL; + } + + // ScanForReturnAddress found a reasonable return address. Advance %esp to + // the location immediately above the one where the return address was + // found. + caller_esp += 4; + // Try to restore the %ebp chain. The caller %ebp should be stored at a + // location immediately below the one where the return address was found. + // A valid caller %ebp must be greater than the address where it is stored + // and the gap between the two adjacent frames should be reasonable. + uint32_t restored_ebp_chain = caller_esp - 8; + if (!memory_->GetMemoryAtAddress(restored_ebp_chain, &caller_ebp) || + caller_ebp <= restored_ebp_chain || + caller_ebp - restored_ebp_chain > kMaxReasonableGapBetweenFrames) { + // The restored %ebp chain doesn't appear to be valid. + // Assume that %ebp is unchanged. + caller_ebp = last_ebp; + } + + trust = StackFrame::FRAME_TRUST_SCAN; + } + + // Create a new stack frame (ownership will be transferred to the caller) + // and fill it in. + StackFrameX86* frame = new StackFrameX86(); + + frame->trust = trust; + frame->context = last_frame->context; + frame->context.eip = caller_eip; + frame->context.esp = caller_esp; + frame->context.ebp = caller_ebp; + frame->context_validity = StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP; + + return frame; +} + +StackFrame* StackwalkerX86::GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed) { + if (!memory_ || !stack) { + BPLOG(ERROR) << "Can't get caller frame without memory or stack"; + return NULL; + } + + const vector& frames = *stack->frames(); + StackFrameX86* last_frame = static_cast(frames.back()); + // The last frame can never be inline. A sequence of inline frames always + // finishes with a conventional frame. + assert(last_frame->trust != StackFrame::FRAME_TRUST_INLINE); + scoped_ptr new_frame; + + // If the resolver has Windows stack walking information, use that. + WindowsFrameInfo* windows_frame_info + = frame_symbolizer_->FindWindowsFrameInfo(last_frame); + if (windows_frame_info) + new_frame.reset(GetCallerByWindowsFrameInfo(frames, windows_frame_info, + stack_scan_allowed)); + + // If the resolver has DWARF CFI information, use that. + if (!new_frame.get()) { + CFIFrameInfo* cfi_frame_info = + frame_symbolizer_->FindCFIFrameInfo(last_frame); + if (cfi_frame_info) + new_frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info)); + } + + // Otherwise, hope that the program was using a traditional frame structure. + if (!new_frame.get()) + new_frame.reset(GetCallerByEBPAtBase(frames, stack_scan_allowed)); + + // If nothing worked, tell the caller. + if (!new_frame.get()) + return NULL; + + // Should we terminate the stack walk? (end-of-stack or broken invariant) + if (TerminateWalk(new_frame->context.eip, new_frame->context.esp, + last_frame->context.esp, + /*first_unwind=*/last_frame->trust == + StackFrame::FRAME_TRUST_CONTEXT)) { + return NULL; + } + + // new_frame->context.eip is the return address, which is the instruction + // after the CALL that caused us to arrive at the callee. Set + // new_frame->instruction to one less than that, so it points within the + // CALL instruction. See StackFrame::instruction for details, and + // StackFrameAMD64::ReturnAddress. + new_frame->instruction = new_frame->context.eip - 1; + + return new_frame.release(); +} + +} // namespace google_breakpad diff --git a/src/processor/stackwalker_x86.h b/src/processor/stackwalker_x86.h new file mode 100644 index 0000000..1867a68 --- /dev/null +++ b/src/processor/stackwalker_x86.h @@ -0,0 +1,116 @@ +// -*- mode: c++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// stackwalker_x86.h: x86-specific stackwalker. +// +// Provides stack frames given x86 register context and a memory region +// corresponding to an x86 stack. +// +// Author: Mark Mentovai + + +#ifndef PROCESSOR_STACKWALKER_X86_H__ +#define PROCESSOR_STACKWALKER_X86_H__ + +#include + +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/stackwalker.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/cfi_frame_info.h" + +namespace google_breakpad { + +class CodeModules; + + +class StackwalkerX86 : public Stackwalker { + public: + // context is an x86 context object that gives access to x86-specific + // register state corresponding to the innermost called frame to be + // included in the stack. The other arguments are passed directly through + // to the base Stackwalker constructor. + StackwalkerX86(const SystemInfo* system_info, + const MDRawContextX86* context, + MemoryRegion* memory, + const CodeModules* modules, + StackFrameSymbolizer* frame_symbolizer); + + private: + // A STACK CFI-driven frame walker for the X86. + typedef SimpleCFIWalker CFIWalker; + + // Implementation of Stackwalker, using x86 context (%ebp, %esp, %eip) and + // stack conventions (saved %ebp at [%ebp], saved %eip at 4[%ebp], or + // alternate conventions as guided by any WindowsFrameInfo available for the + // code in question.). + virtual StackFrame* GetContextFrame(); + virtual StackFrame* GetCallerFrame(const CallStack* stack, + bool stack_scan_allowed); + + // Use windows_frame_info (derived from STACK WIN and FUNC records) + // to construct the frame that called frames.back(). The caller + // takes ownership of the returned frame. Return NULL on failure. + StackFrameX86* GetCallerByWindowsFrameInfo( + const vector& frames, + WindowsFrameInfo* windows_frame_info, + bool stack_scan_allowed); + + // Use cfi_frame_info (derived from STACK CFI records) to construct + // the frame that called frames.back(). The caller takes ownership + // of the returned frame. Return NULL on failure. + StackFrameX86* GetCallerByCFIFrameInfo(const vector& frames, + CFIFrameInfo* cfi_frame_info); + + // Assuming a traditional frame layout --- where the caller's %ebp + // has been pushed just after the return address and the callee's + // %ebp points to the saved %ebp --- construct the frame that called + // frames.back(). The caller takes ownership of the returned frame. + // Return NULL on failure. + StackFrameX86* GetCallerByEBPAtBase(const vector& frames, + bool stack_scan_allowed); + + // Stores the CPU context corresponding to the innermost stack frame to + // be returned by GetContextFrame. + const MDRawContextX86* context_; + + // Our register map, for cfi_walker_. + static const CFIWalker::RegisterSet cfi_register_map_[]; + + // Our CFI frame walker. + const CFIWalker cfi_walker_; +}; + + +} // namespace google_breakpad + + +#endif // PROCESSOR_STACKWALKER_X86_H__ diff --git a/src/processor/stackwalker_x86_unittest.cc b/src/processor/stackwalker_x86_unittest.cc new file mode 100644 index 0000000..b614b0e --- /dev/null +++ b/src/processor/stackwalker_x86_unittest.cc @@ -0,0 +1,2269 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// stackwalker_x86_unittest.cc: Unit tests for StackwalkerX86 class. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/test_assembler.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "google_breakpad/processor/basic_source_line_resolver.h" +#include "google_breakpad/processor/call_stack.h" +#include "google_breakpad/processor/code_module.h" +#include "google_breakpad/processor/source_line_resolver_interface.h" +#include "google_breakpad/processor/stack_frame_cpu.h" +#include "processor/stackwalker_unittest_utils.h" +#include "processor/stackwalker_x86.h" +#include "processor/windows_frame_info.h" + +using google_breakpad::BasicSourceLineResolver; +using google_breakpad::CallStack; +using google_breakpad::CodeModule; +using google_breakpad::StackFrameSymbolizer; +using google_breakpad::StackFrame; +using google_breakpad::StackFrameX86; +using google_breakpad::Stackwalker; +using google_breakpad::StackwalkerX86; +using google_breakpad::SystemInfo; +using google_breakpad::WindowsFrameInfo; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; +using google_breakpad::test_assembler::Section; +using std::vector; +using testing::_; +using testing::AnyNumber; +using testing::DoAll; +using testing::Return; +using testing::SetArgumentPointee; +using testing::Test; + +class StackwalkerX86Fixture { + public: + StackwalkerX86Fixture() + : stack_section(kLittleEndian), + // Give the two modules reasonable standard locations and names + // for tests to play with. + module1(0x40000000, 0x10000, "module1", "version1"), + module2(0x50000000, 0x10000, "module2", "version2"), + module3(0x771d0000, 0x180000, "module3", "version3"), + module4(0x75f90000, 0x46000, "module4", "version4"), + module5(0x75730000, 0x110000, "module5", "version5"), + module6(0x647f0000, 0x1ba8000, "module6", "version6") { + // Identify the system as a Linux system. + system_info.os = "Linux"; + system_info.os_short = "linux"; + system_info.os_version = "Salacious Skink"; + system_info.cpu = "x86"; + system_info.cpu_info = ""; + + // Put distinctive values in the raw CPU context. + BrandContext(&raw_context); + + // Create some modules with some stock debugging information. + modules.Add(&module1); + modules.Add(&module2); + modules.Add(&module3); + modules.Add(&module4); + modules.Add(&module5); + modules.Add(&module6); + + // By default, none of the modules have symbol info; call + // SetModuleSymbols to override this. + EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _, _)) + .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND)); + + // Avoid GMOCK WARNING "Uninteresting mock function call - returning + // directly" for FreeSymbolData(). + EXPECT_CALL(supplier, FreeSymbolData(_)).Times(AnyNumber()); + + // Reset max_frames_scanned since it's static. + Stackwalker::set_max_frames_scanned(1024); + } + + // Set the Breakpad symbol information that supplier should return for + // MODULE to INFO. + void SetModuleSymbols(MockCodeModule* module, const string& info) { + size_t buffer_size; + char *buffer = supplier.CopySymbolDataAndOwnTheCopy(info, &buffer_size); + EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _, _)) + .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer), + SetArgumentPointee<4>(buffer_size), + Return(MockSymbolSupplier::FOUND))); + } + + // Populate stack_region with the contents of stack_section. Use + // stack_section.start() as the region's starting address. + void RegionFromSection() { + string contents; + ASSERT_TRUE(stack_section.GetContents(&contents)); + stack_region.Init(stack_section.start().Value(), contents); + } + + // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking. + void BrandContext(MDRawContextX86 *raw_context) { + uint8_t x = 173; + for (size_t i = 0; i < sizeof(*raw_context); i++) + reinterpret_cast(raw_context)[i] = (x += 17); + } + + SystemInfo system_info; + MDRawContextX86 raw_context; + Section stack_section; + MockMemoryRegion stack_region; + MockCodeModule module1; + MockCodeModule module2; + MockCodeModule module3; + MockCodeModule module4; + MockCodeModule module5; + MockCodeModule module6; + MockCodeModules modules; + MockSymbolSupplier supplier; + BasicSourceLineResolver resolver; + CallStack call_stack; + const vector* frames; +}; + +class SanityCheck: public StackwalkerX86Fixture, public Test { }; + +TEST_F(SanityCheck, NoResolver) { + stack_section.start() = 0x80000000; + stack_section.D32(0).D32(0); // end-of-stack marker + RegionFromSection(); + raw_context.eip = 0x40000200; + raw_context.ebp = 0x80000000; + + StackFrameSymbolizer frame_symbolizer(NULL, NULL); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + // This should succeed, even without a resolver or supplier. + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + StackFrameX86 *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetContextFrame: public StackwalkerX86Fixture, public Test { }; + +TEST_F(GetContextFrame, Simple) { + stack_section.start() = 0x80000000; + stack_section.D32(0).D32(0); // end-of-stack marker + RegionFromSection(); + raw_context.eip = 0x40000200; + raw_context.ebp = 0x80000000; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + StackFrameX86 *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +// The stackwalker should be able to produce the context frame even +// without stack memory present. +TEST_F(GetContextFrame, NoStackMemory) { + raw_context.eip = 0x40000200; + raw_context.ebp = 0x80000000; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, NULL, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + StackFrameX86 *frame = static_cast(frames->at(0)); + // Check that the values from the original raw context made it + // through to the context in the stack frame. + EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); +} + +class GetCallerFrame: public StackwalkerX86Fixture, public Test { + protected: + void IPAddressIsNotInKnownModuleTestImpl(bool has_corrupt_symbols); +}; + +// Walk a traditional frame. A traditional frame saves the caller's +// %ebp just below the return address, and has its own %ebp pointing +// at the saved %ebp. +TEST_F(GetCallerFrame, Traditional) { + stack_section.start() = 0x80000000; + Label frame0_ebp, frame1_ebp; + stack_section + .Append(12, 0) // frame 0: space + .Mark(&frame0_ebp) // frame 0 %ebp points here + .D32(frame1_ebp) // frame 0: saved %ebp + .D32(0x40008679) // frame 0: return address + .Append(8, 0) // frame 1: space + .Mark(&frame1_ebp) // frame 1 %ebp points here + .D32(0) // frame 1: saved %ebp (stack end) + .D32(0); // frame 1: return address (stack end) + RegionFromSection(); + raw_context.eip = 0x4000c7a5; + raw_context.esp = stack_section.start().Value(); + raw_context.ebp = frame0_ebp.Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + EXPECT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x4000c7a5U, frame0->instruction); + EXPECT_EQ(0x4000c7a5U, frame0->context.eip); + EXPECT_EQ(frame0_ebp.Value(), frame0->context.ebp); + EXPECT_EQ(NULL, frame0->windows_frame_info); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP), + frame1->context_validity); + EXPECT_EQ(0x40008679U, frame1->instruction + 1); + EXPECT_EQ(0x40008679U, frame1->context.eip); + EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp); + EXPECT_EQ(NULL, frame1->windows_frame_info); + } +} + +// Walk a traditional frame, but use a bogus %ebp value, forcing a scan +// of the stack for something that looks like a return address. +TEST_F(GetCallerFrame, TraditionalScan) { + stack_section.start() = 0x80000000; + Label frame1_ebp; + Label frame1_esp; + stack_section + // frame 0 + .D32(0xf065dc76) // locals area: + .D32(0x46ee2167) // garbage that doesn't look like + .D32(0xbab023ec) // a return address + .D32(frame1_ebp) // saved %ebp (%ebp fails to point here, forcing scan) + .D32(0x4000129d) // return address + // frame 1 + .Mark(&frame1_esp) + .Append(8, 0) // space + .Mark(&frame1_ebp) // %ebp points here + .D32(0) // saved %ebp (stack end) + .D32(0); // return address (stack end) + + RegionFromSection(); + raw_context.eip = 0x4000f49d; + raw_context.esp = stack_section.start().Value(); + // Make the frame pointer bogus, to make the stackwalker scan the stack + // for something that looks like a return address. + raw_context.ebp = 0xd43eed6e; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x4000f49dU, frame0->instruction); + EXPECT_EQ(0x4000f49dU, frame0->context.eip); + EXPECT_EQ(stack_section.start().Value(), frame0->context.esp); + EXPECT_EQ(0xd43eed6eU, frame0->context.ebp); + EXPECT_EQ(NULL, frame0->windows_frame_info); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP), + frame1->context_validity); + EXPECT_EQ(0x4000129dU, frame1->instruction + 1); + EXPECT_EQ(0x4000129dU, frame1->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp); + EXPECT_EQ(NULL, frame1->windows_frame_info); + } +} + +// Force scanning for a return address a long way down the stack +TEST_F(GetCallerFrame, TraditionalScanLongWay) { + stack_section.start() = 0x80000000; + Label frame1_ebp; + Label frame1_esp; + stack_section + // frame 0 + .D32(0xf065dc76) // locals area: + .D32(0x46ee2167) // garbage that doesn't look like + .D32(0xbab023ec) // a return address + .Append(20 * 4, 0) // a bunch of space + .D32(frame1_ebp) // saved %ebp (%ebp fails to point here, forcing scan) + .D32(0x4000129d) // return address + // frame 1 + .Mark(&frame1_esp) + .Append(8, 0) // space + .Mark(&frame1_ebp) // %ebp points here + .D32(0) // saved %ebp (stack end) + .D32(0); // return address (stack end) + + RegionFromSection(); + raw_context.eip = 0x4000f49d; + raw_context.esp = stack_section.start().Value(); + // Make the frame pointer bogus, to make the stackwalker scan the stack + // for something that looks like a return address. + raw_context.ebp = 0xd43eed6e; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x4000f49dU, frame0->instruction); + EXPECT_EQ(0x4000f49dU, frame0->context.eip); + EXPECT_EQ(stack_section.start().Value(), frame0->context.esp); + EXPECT_EQ(0xd43eed6eU, frame0->context.ebp); + EXPECT_EQ(NULL, frame0->windows_frame_info); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP), + frame1->context_validity); + EXPECT_EQ(0x4000129dU, frame1->instruction + 1); + EXPECT_EQ(0x4000129dU, frame1->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp); + EXPECT_EQ(NULL, frame1->windows_frame_info); + } +} + +// Test that set_max_frames_scanned prevents using stack scanning +// to find caller frames. +TEST_F(GetCallerFrame, ScanningNotAllowed) { + stack_section.start() = 0x80000000; + Label frame1_ebp; + stack_section + // frame 0 + .D32(0xf065dc76) // locals area: + .D32(0x46ee2167) // garbage that doesn't look like + .D32(0xbab023ec) // a return address + .D32(frame1_ebp) // saved %ebp (%ebp fails to point here, forcing scan) + .D32(0x4000129d) // return address + // frame 1 + .Append(8, 0) // space + .Mark(&frame1_ebp) // %ebp points here + .D32(0) // saved %ebp (stack end) + .D32(0); // return address (stack end) + + RegionFromSection(); + raw_context.eip = 0x4000f49d; + raw_context.esp = stack_section.start().Value(); + // Make the frame pointer bogus, to make the stackwalker scan the stack + // for something that looks like a return address. + raw_context.ebp = 0xd43eed6e; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + Stackwalker::set_max_frames_scanned(0); + + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(1U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x4000f49dU, frame0->instruction); + EXPECT_EQ(0x4000f49dU, frame0->context.eip); + EXPECT_EQ(stack_section.start().Value(), frame0->context.esp); + EXPECT_EQ(0xd43eed6eU, frame0->context.ebp); + EXPECT_EQ(NULL, frame0->windows_frame_info); + } +} + +// Use Windows frame data (a "STACK WIN 4" record, from a +// FrameTypeFrameData DIA record) to walk a stack frame. +TEST_F(GetCallerFrame, WindowsFrameData) { + SetModuleSymbols(&module1, + "STACK WIN 4 aa85 176 0 0 4 10 4 0 1" + " $T2 $esp .cbSavedRegs + =" + " $T0 .raSearchStart =" + " $eip $T0 ^ =" + " $esp $T0 4 + =" + " $ebx $T2 4 - ^ =" + " $edi $T2 8 - ^ =" + " $esi $T2 12 - ^ =" + " $ebp $T2 16 - ^ =\n"); + Label frame1_esp, frame1_ebp; + stack_section.start() = 0x80000000; + stack_section + // frame 0 + .D32(frame1_ebp) // saved regs: %ebp + .D32(0xa7120d1a) // %esi + .D32(0x630891be) // %edi + .D32(0x9068a878) // %ebx + .D32(0xa08ea45f) // locals: unused + .D32(0x40001350) // return address + // frame 1 + .Mark(&frame1_esp) + .Append(12, 0) // empty space + .Mark(&frame1_ebp) + .D32(0) // saved %ebp (stack end) + .D32(0); // saved %eip (stack end) + + RegionFromSection(); + raw_context.eip = 0x4000aa85; + raw_context.esp = stack_section.start().Value(); + raw_context.ebp = 0xf052c1de; // should not be needed to walk frame + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x4000aa85U, frame0->instruction); + EXPECT_EQ(0x4000aa85U, frame0->context.eip); + EXPECT_EQ(stack_section.start().Value(), frame0->context.esp); + EXPECT_EQ(0xf052c1deU, frame0->context.ebp); + EXPECT_TRUE(frame0->windows_frame_info != NULL); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP + | StackFrameX86::CONTEXT_VALID_EBX + | StackFrameX86::CONTEXT_VALID_ESI + | StackFrameX86::CONTEXT_VALID_EDI), + frame1->context_validity); + EXPECT_EQ(0x40001350U, frame1->instruction + 1); + EXPECT_EQ(0x40001350U, frame1->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp); + EXPECT_EQ(0x9068a878U, frame1->context.ebx); + EXPECT_EQ(0xa7120d1aU, frame1->context.esi); + EXPECT_EQ(0x630891beU, frame1->context.edi); + EXPECT_EQ(NULL, frame1->windows_frame_info); + } +} + +// Use Windows frame data (a "STACK WIN 4" record, from a +// FrameTypeFrameData DIA record) to walk a stack frame where the stack +// is aligned and we must search +TEST_F(GetCallerFrame, WindowsFrameDataAligned) { + SetModuleSymbols(&module1, + "STACK WIN 4 aa85 176 0 0 4 4 8 0 1" + " $T1 .raSearch =" + " $T0 $T1 4 - 8 @ =" + " $ebp $T1 4 - ^ =" + " $eip $T1 ^ =" + " $esp $T1 4 + ="); + Label frame0_esp, frame0_ebp; + Label frame1_esp, frame1_ebp; + stack_section.start() = 0x80000000; + stack_section + // frame 0 + .Mark(&frame0_esp) + .D32(0x0ffa0ffa) // unused saved register + .D32(0xdeaddead) // locals + .D32(0xbeefbeef) + .D32(0) // 8-byte alignment + .Mark(&frame0_ebp) + .D32(frame1_ebp) // saved %ebp + .D32(0x5000129d) // return address + // frame 1 + .Mark(&frame1_esp) + .D32(0x1) // parameter + .Mark(&frame1_ebp) + .D32(0) // saved %ebp (stack end) + .D32(0); // saved %eip (stack end) + + RegionFromSection(); + raw_context.eip = 0x4000aa85; + raw_context.esp = frame0_esp.Value(); + raw_context.ebp = frame0_ebp.Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(1U, modules_without_symbols.size()); + ASSERT_EQ("module2", modules_without_symbols[0]->debug_file()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x4000aa85U, frame0->instruction); + EXPECT_EQ(0x4000aa85U, frame0->context.eip); + EXPECT_EQ(frame0_esp.Value(), frame0->context.esp); + EXPECT_EQ(frame0_ebp.Value(), frame0->context.ebp); + EXPECT_TRUE(frame0->windows_frame_info != NULL); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP), + frame1->context_validity); + EXPECT_EQ(0x5000129dU, frame1->instruction + 1); + EXPECT_EQ(0x5000129dU, frame1->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp); + EXPECT_EQ(NULL, frame1->windows_frame_info); + } +} + +// Use Windows frame data (a "STACK WIN 4" record, from a +// FrameTypeFrameData DIA record) to walk a frame, and depend on the +// parameter size from the callee as well. +TEST_F(GetCallerFrame, WindowsFrameDataParameterSize) { + SetModuleSymbols(&module1, "FUNC 1000 100 c module1::wheedle\n"); + SetModuleSymbols(&module2, + // Note bogus parameter size in FUNC record; the stack walker + // should prefer the STACK WIN record, and see '4' below. + "FUNC aa85 176 beef module2::whine\n" + "STACK WIN 4 aa85 176 0 0 4 10 4 0 1" + " $T2 $esp .cbLocals + .cbSavedRegs + =" + " $T0 .raSearchStart =" + " $eip $T0 ^ =" + " $esp $T0 4 + =" + " $ebp $T0 20 - ^ =" + " $ebx $T0 8 - ^ =\n"); + Label frame0_esp, frame0_ebp; + Label frame1_esp; + Label frame2_esp, frame2_ebp; + stack_section.start() = 0x80000000; + stack_section + // frame 0, in module1::wheedle. Traditional frame. + .Mark(&frame0_esp) + .Append(16, 0) // frame space + .Mark(&frame0_ebp) + .D32(0x6fa902e0) // saved %ebp. Not a frame pointer. + .D32(0x5000aa95) // return address, in module2::whine + // frame 1, in module2::whine. FrameData frame. + .Mark(&frame1_esp) + .D32(0xbaa0cb7a) // argument 3 passed to module1::wheedle + .D32(0xbdc92f9f) // argument 2 + .D32(0x0b1d8442) // argument 1 + .D32(frame2_ebp) // saved %ebp + .D32(0xb1b90a15) // unused + .D32(0xf18e072d) // unused + .D32(0x2558c7f3) // saved %ebx + .D32(0x0365e25e) // unused + .D32(0x2a179e38) // return address; $T0 points here + // frame 2, in no module + .Mark(&frame2_esp) + .Append(12, 0) // empty space + .Mark(&frame2_ebp) + .D32(0) // saved %ebp (stack end) + .D32(0); // saved %eip (stack end) + + RegionFromSection(); + raw_context.eip = 0x40001004; // in module1::wheedle + raw_context.esp = stack_section.start().Value(); + raw_context.ebp = frame0_ebp.Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(3U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x40001004U, frame0->instruction); + EXPECT_EQ(0x40001004U, frame0->context.eip); + EXPECT_EQ(frame0_esp.Value(), frame0->context.esp); + EXPECT_EQ(frame0_ebp.Value(), frame0->context.ebp); + EXPECT_EQ(&module1, frame0->module); + EXPECT_EQ("module1::wheedle", frame0->function_name); + EXPECT_EQ(0x40001000U, frame0->function_base); + // The FUNC record for module1::wheedle should have produced a + // WindowsFrameInfo structure with only the parameter size valid. + ASSERT_TRUE(frame0->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_PARAMETER_SIZE, + frame0->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_UNKNOWN, + frame0->windows_frame_info->type_); + EXPECT_EQ(12U, frame0->windows_frame_info->parameter_size); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP), + frame1->context_validity); + EXPECT_EQ(0x5000aa95U, frame1->instruction + 1); + EXPECT_EQ(0x5000aa95U, frame1->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_EQ(0x6fa902e0U, frame1->context.ebp); + EXPECT_EQ(&module2, frame1->module); + EXPECT_EQ("module2::whine", frame1->function_name); + EXPECT_EQ(0x5000aa85U, frame1->function_base); + ASSERT_TRUE(frame1->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame1->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame1->windows_frame_info->type_); + // This should not see the 0xbeef parameter size from the FUNC + // record, but should instead see the STACK WIN record. + EXPECT_EQ(4U, frame1->windows_frame_info->parameter_size); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame2->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP + | StackFrameX86::CONTEXT_VALID_EBX), + frame2->context_validity); + EXPECT_EQ(0x2a179e38U, frame2->instruction + 1); + EXPECT_EQ(0x2a179e38U, frame2->context.eip); + EXPECT_EQ(frame2_esp.Value(), frame2->context.esp); + EXPECT_EQ(frame2_ebp.Value(), frame2->context.ebp); + EXPECT_EQ(0x2558c7f3U, frame2->context.ebx); + EXPECT_EQ(NULL, frame2->module); + EXPECT_EQ(NULL, frame2->windows_frame_info); + } +} + +// Use Windows frame data (a "STACK WIN 4" record, from a +// FrameTypeFrameData DIA record) to walk a stack frame, where the +// expression fails to yield both an $eip and an $ebp value, and the stack +// walker must scan. +TEST_F(GetCallerFrame, WindowsFrameDataScan) { + SetModuleSymbols(&module1, + "STACK WIN 4 c8c 111 0 0 4 10 4 0 1 bad program string\n"); + // Mark frame 1's PC as the end of the stack. + SetModuleSymbols(&module2, + "FUNC 7c38 accf 0 module2::function\n" + "STACK WIN 4 7c38 accf 0 0 4 10 4 0 1 $eip 0 = $ebp 0 =\n"); + Label frame1_esp; + stack_section.start() = 0x80000000; + stack_section + // frame 0 + .Append(16, 0x2a) // unused, garbage + .D32(0x50007ce9) // return address + // frame 1 + .Mark(&frame1_esp) + .Append(8, 0); // empty space + + RegionFromSection(); + raw_context.eip = 0x40000c9c; + raw_context.esp = stack_section.start().Value(); + raw_context.ebp = 0x2ae314cd; // should not be needed to walk frame + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x40000c9cU, frame0->instruction); + EXPECT_EQ(0x40000c9cU, frame0->context.eip); + EXPECT_EQ(stack_section.start().Value(), frame0->context.esp); + EXPECT_EQ(0x2ae314cdU, frame0->context.ebp); + EXPECT_TRUE(frame0->windows_frame_info != NULL); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + // I'd argue that CONTEXT_VALID_EBP shouldn't be here, since the walker + // does not actually fetch the EBP after a scan (forcing the next frame + // to be scanned as well). But let's grandfather the existing behavior in + // for now. + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP), + frame1->context_validity); + EXPECT_EQ(0x50007ce9U, frame1->instruction + 1); + EXPECT_EQ(0x50007ce9U, frame1->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_TRUE(frame1->windows_frame_info != NULL); + } +} + +// Use Windows frame data (a "STACK WIN 4" record, from a +// FrameTypeFrameData DIA record) to walk a stack frame, where the +// expression yields an $eip that falls outside of any module, and the +// stack walker must scan. +TEST_F(GetCallerFrame, WindowsFrameDataBadEIPScan) { + SetModuleSymbols(&module1, + "STACK WIN 4 6e6 e7 0 0 0 8 4 0 1" + // A traditional frame, actually. + " $eip $ebp 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ =\n"); + // Mark frame 1's PC as the end of the stack. + SetModuleSymbols(&module2, + "FUNC cfdb 8406 0 module2::function\n" + "STACK WIN 4 cfdb 8406 0 0 0 0 0 0 1 $eip 0 = $ebp 0 =\n"); + stack_section.start() = 0x80000000; + + // In this stack, the context's %ebp is pointing at the wrong place, so + // the stack walker needs to scan to find the return address, and then + // scan again to find the caller's saved %ebp. + Label frame0_ebp, frame1_ebp, frame1_esp; + stack_section + // frame 0 + .Append(8, 0x2a) // garbage + .Mark(&frame0_ebp) // frame 0 %ebp points here, but should point + // at *** below + // The STACK WIN record says that the following two values are + // frame 1's saved %ebp and return address, but the %ebp is wrong; + // they're garbage. The stack walker will scan for the right values. + .D32(0x3d937b2b) // alleged to be frame 1's saved %ebp + .D32(0x17847f5b) // alleged to be frame 1's return address + .D32(frame1_ebp) // frame 1's real saved %ebp; scan will find + .D32(0x2b2b2b2b) // first word of realigned register save area + // *** frame 0 %ebp ought to be pointing here + .D32(0x2c2c2c2c) // realigned locals area + .D32(0x5000d000) // frame 1's real saved %eip; scan will find + // Frame 1, in module2::function. The STACK WIN record describes + // this as the oldest frame, without referring to its contents, so + // we needn't to provide any actual data here. + .Mark(&frame1_esp) + .Mark(&frame1_ebp) // frame 1 %ebp points here + // A dummy value for frame 1's %ebp to point at. The scan recognizes the + // saved %ebp because it points to a valid word in the stack memory region. + .D32(0x2d2d2d2d); + + RegionFromSection(); + raw_context.eip = 0x40000700; + raw_context.esp = stack_section.start().Value(); + raw_context.ebp = frame0_ebp.Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x40000700U, frame0->instruction); + EXPECT_EQ(0x40000700U, frame0->context.eip); + EXPECT_EQ(stack_section.start().Value(), frame0->context.esp); + EXPECT_EQ(frame0_ebp.Value(), frame0->context.ebp); + EXPECT_TRUE(frame0->windows_frame_info != NULL); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI_SCAN, frame1->trust); + // I'd argue that CONTEXT_VALID_EBP shouldn't be here, since the + // walker does not actually fetch the EBP after a scan (forcing the + // next frame to be scanned as well). But let's grandfather the existing + // behavior in for now. + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP), + frame1->context_validity); + EXPECT_EQ(0x5000d000U, frame1->instruction + 1); + EXPECT_EQ(0x5000d000U, frame1->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp); + EXPECT_TRUE(frame1->windows_frame_info != NULL); + } +} + +// Use Windows FrameTypeFPO data to walk a stack frame for a function that +// does not modify %ebp from the value it had in the caller. +TEST_F(GetCallerFrame, WindowsFPOUnchangedEBP) { + SetModuleSymbols(&module1, + // Note bogus parameter size in FUNC record; the walker + // should prefer the STACK WIN record, and see the '8' below. + "FUNC e8a8 100 feeb module1::discombobulated\n" + "STACK WIN 0 e8a8 100 0 0 8 4 10 0 0 0\n"); + Label frame0_esp; + Label frame1_esp, frame1_ebp; + stack_section.start() = 0x80000000; + stack_section + // frame 0, in module1::wheedle. FrameTypeFPO (STACK WIN 0) frame. + .Mark(&frame0_esp) + // no outgoing parameters; this is the youngest frame. + .D32(0x7c521352) // four bytes of saved registers + .Append(0x10, 0x42) // local area + .D32(0x40009b5b) // return address, in module1, no function + // frame 1, in module1, no function. + .Mark(&frame1_esp) + .D32(0xf60ea7fc) // junk + .Mark(&frame1_ebp) + .D32(0) // saved %ebp (stack end) + .D32(0); // saved %eip (stack end) + + RegionFromSection(); + raw_context.eip = 0x4000e8b8; // in module1::whine + raw_context.esp = stack_section.start().Value(); + // Frame pointer unchanged from caller. + raw_context.ebp = frame1_ebp.Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x4000e8b8U, frame0->instruction); + EXPECT_EQ(0x4000e8b8U, frame0->context.eip); + EXPECT_EQ(frame0_esp.Value(), frame0->context.esp); + // unchanged from caller + EXPECT_EQ(frame1_ebp.Value(), frame0->context.ebp); + EXPECT_EQ(&module1, frame0->module); + EXPECT_EQ("module1::discombobulated", frame0->function_name); + EXPECT_EQ(0x4000e8a8U, frame0->function_base); + // The STACK WIN record for module1::discombobulated should have + // produced a fully populated WindowsFrameInfo structure. + ASSERT_TRUE(frame0->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame0->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FPO, + frame0->windows_frame_info->type_); + EXPECT_EQ(0x10U, frame0->windows_frame_info->local_size); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP + | StackFrameX86::CONTEXT_VALID_EBX), + frame1->context_validity); + EXPECT_EQ(0x40009b5bU, frame1->instruction + 1); + EXPECT_EQ(0x40009b5bU, frame1->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp); + EXPECT_EQ(&module1, frame1->module); + EXPECT_EQ("", frame1->function_name); + EXPECT_EQ(NULL, frame1->windows_frame_info); + } +} + +// Use Windows FrameTypeFPO data to walk a stack frame for a function +// that uses %ebp for its own purposes, saving the value it had in the +// caller in the standard place in the saved register area. +TEST_F(GetCallerFrame, WindowsFPOUsedEBP) { + SetModuleSymbols(&module1, + // Note bogus parameter size in FUNC record; the walker + // should prefer the STACK WIN record, and see the '8' below. + "FUNC 9aa8 e6 abbe module1::RaisedByTheAliens\n" + "STACK WIN 0 9aa8 e6 a 0 10 8 4 0 0 1\n"); + Label frame0_esp; + Label frame1_esp, frame1_ebp; + stack_section.start() = 0x80000000; + stack_section + // frame 0, in module1::wheedle. FrameTypeFPO (STACK WIN 0) frame. + .Mark(&frame0_esp) + // no outgoing parameters; this is the youngest frame. + .D32(frame1_ebp) // saved register area: saved %ebp + .D32(0xb68bd5f9) // saved register area: something else + .D32(0xd25d05fc) // local area + .D32(0x4000debe) // return address, in module1, no function + // frame 1, in module1, no function. + .Mark(&frame1_esp) + .D32(0xf0c9a974) // junk + .Mark(&frame1_ebp) + .D32(0) // saved %ebp (stack end) + .D32(0); // saved %eip (stack end) + + RegionFromSection(); + raw_context.eip = 0x40009ab8; // in module1::RaisedByTheAliens + raw_context.esp = stack_section.start().Value(); + // RaisedByTheAliens uses %ebp for its own mysterious purposes. + raw_context.ebp = 0xecbdd1a5; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x40009ab8U, frame0->instruction); + EXPECT_EQ(0x40009ab8U, frame0->context.eip); + EXPECT_EQ(frame0_esp.Value(), frame0->context.esp); + EXPECT_EQ(0xecbdd1a5, frame0->context.ebp); + EXPECT_EQ(&module1, frame0->module); + EXPECT_EQ("module1::RaisedByTheAliens", frame0->function_name); + EXPECT_EQ(0x40009aa8U, frame0->function_base); + // The STACK WIN record for module1::RaisedByTheAliens should have + // produced a fully populated WindowsFrameInfo structure. + ASSERT_TRUE(frame0->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame0->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FPO, + frame0->windows_frame_info->type_); + EXPECT_EQ("", frame0->windows_frame_info->program_string); + EXPECT_TRUE(frame0->windows_frame_info->allocates_base_pointer); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP), + frame1->context_validity); + EXPECT_EQ(0x4000debeU, frame1->instruction + 1); + EXPECT_EQ(0x4000debeU, frame1->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp); + EXPECT_EQ(&module1, frame1->module); + EXPECT_EQ("", frame1->function_name); + EXPECT_EQ(NULL, frame1->windows_frame_info); + } +} + +// This is a regression test for FPO code that references the initial value of +// EBX. +TEST_F(GetCallerFrame, WindowsFPOReferencesEBX) { + MockCodeModule ntdll(0x776e0000, 0x142000, "ntdll", "ntdllver"); + MockCodeModule kernel32(0x77250000, 0xd5000, "kernel32", "kernel32ver"); + MockCodeModule chrome_child(0x5a710000, 0x2b7c000, "chrome_child", + "chrome_childver"); + MockCodeModules modules; + modules.Add(&ntdll); + modules.Add(&kernel32); + modules.Add(&chrome_child); + SetModuleSymbols(&ntdll, + "PUBLIC 46bf4 0 KiFastSystemCallRet\n" + "STACK WIN 0 46bf4 1 0 0 0 0 0 0 0 0\n" + + "PUBLIC 46550 10 NtWaitForKeyedEvent\n" + "STACK WIN 0 46550 f 0 0 10 0 0 0 0 0\n" + + "PUBLIC 4965 10 RtlSleepConditionVariableSRW\n" + + "STACK WIN 4 4965 23 23 0 10 8 38 0 1 $T0 $ebx = " + "$eip $T0 4 + ^ = $ebx $T0 ^ = $esp $T0 8 + = " + "$ebp $ebp ^ = $L $ebp = $P $T0 8 + .cbParams + =\n" + + "STACK WIN 4 4988 e3 0 0 10 8 38 0 1 $T0 $ebx = " + "$eip $T0 4 + ^ = $ebx $T0 ^ = $esp $T0 8 + = " + "$ebp $ebp ^ = $L $ebp = $P $T0 8 + .cbParams + =\n" + + "STACK WIN 4 4b2e b 0 0 10 8 38 0 1 $T0 $ebx = " + "$eip $T0 4 + ^ = $ebx $T0 ^ = $esp $T0 8 + = " + "$ebp $ebp ^ = $L $ebp = $P $T0 8 + .cbParams + =\n"); + + SetModuleSymbols(&kernel32, + "PUBLIC 3217a 10 SleepConditionVariableSRW\n" + "STACK WIN 4 3217a 40 8 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 " + "+ ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = " + "$P $T0 8 + .cbParams + =\n"); + + SetModuleSymbols(&chrome_child, + "FUNC 4f4851 20 0 base::ConditionVariable::TimedWait\n"); + + stack_section.start() = 0x0026c048; + stack_section + .D32(0x7772655c) + .D32(0x776e4a3f) + .D32(0x00000000) + .D32(0x0026c070) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000001) + .D32(0x0026c168) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x0026c070) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x0026c164) + .D32(0x00be0000) + .D32(0x0026fc60) + .D32(0x0026c164) + .D32(0x00000000) + .D32(0xfffffffe) + .D32(0x00000000) + .D32(0x0026c0d0) + .D32(0x7728219e) + .D32(0x000003e8) + .D32(0x00000000) + .D32(0x7728219e) + .D32(0x0026c168) + .D32(0x0026c164) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x0026c168) + .D32(0x000003e8) + .D32(0x000003e8) + .D32(0x0026c0ec) + .D32(0x5ac0486c) + .D32(0x0026c168) + .D32(0x0026c108) + .D32(0x5ac0484c) + .D32(0x0026c100) + .D32(0x0026c160); + + RegionFromSection(); + raw_context.eip = 0x77726bf4; // in ntdll!KiFastSystemCallRet + raw_context.esp = stack_section.start().Value(); + raw_context.ebp = 0x26c0a0; + raw_context.ebx = 0x26c0ac; + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + + ASSERT_EQ(5U, frames->size()); + { + const StackFrameX86& frame = *static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame.trust); + EXPECT_EQ(0x77726bf4U, frame.context.eip); + EXPECT_EQ("KiFastSystemCallRet", frame.function_name); + } + { + const StackFrameX86& frame = *static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame.trust); + EXPECT_EQ(0x7772655cU, frame.context.eip); + EXPECT_EQ("NtWaitForKeyedEvent", frame.function_name); + } + { + const StackFrameX86& frame = *static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame.trust); + EXPECT_EQ(0x776e4a3fU, frame.context.eip); + EXPECT_EQ("RtlSleepConditionVariableSRW", frame.function_name); + } + { + const StackFrameX86& frame = *static_cast(frames->at(3)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame.trust); + EXPECT_EQ(0x7728219eU, frame.context.eip); + EXPECT_EQ("SleepConditionVariableSRW", frame.function_name); + } + { + const StackFrameX86& frame = *static_cast(frames->at(4)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame.trust); + EXPECT_EQ(0x5ac0486cU, frame.context.eip); + EXPECT_EQ("base::ConditionVariable::TimedWait", frame.function_name); + } +} + +// This is a regression unit test which covers a bug which has to do with +// FPO-optimized Windows system call stubs in the context frame. There is +// a more recent Windows system call dispatch mechanism which differs from +// the one which is being tested here. The newer system call dispatch +// mechanism creates an extra context frame (KiFastSystemCallRet). +TEST_F(GetCallerFrame, WindowsFPOSystemCall) { + SetModuleSymbols(&module3, // ntdll.dll + "PUBLIC 1f8ac c ZwWaitForSingleObject\n" + "STACK WIN 0 1f8ac 1b 0 0 c 0 0 0 0 0\n"); + SetModuleSymbols(&module4, // kernelbase.dll + "PUBLIC 109f9 c WaitForSingleObjectEx\n" + "PUBLIC 36590 0 _except_handler4\n" + "STACK WIN 4 109f9 df c 0 c c 48 0 1 $T0 $ebp = $eip " + "$T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L " + "$T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\n" + "STACK WIN 4 36590 154 17 0 10 0 14 0 1 $T0 $ebp = $eip " + "$T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 " + ".cbSavedRegs - = $P $T0 8 + .cbParams + =\n"); + SetModuleSymbols(&module5, // kernel32.dll + "PUBLIC 11136 8 WaitForSingleObject\n" + "PUBLIC 11151 c WaitForSingleObjectExImplementation\n" + "STACK WIN 4 11136 16 5 0 8 0 0 0 1 $T0 $ebp = $eip " + "$T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L " + "$T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\n" + "STACK WIN 4 11151 7a 5 0 c 0 0 0 1 $T0 $ebp = $eip " + "$T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L " + "$T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\n"); + SetModuleSymbols(&module6, // chrome.dll + "FILE 7038 some_file_name.h\n" + "FILE 839776 some_file_name.cc\n" + "FUNC 217fda 17 4 function_217fda\n" + "217fda 4 102 839776\n" + "FUNC 217ff1 a 4 function_217ff1\n" + "217ff1 0 594 7038\n" + "217ff1 a 596 7038\n" + "STACK WIN 0 217ff1 a 0 0 4 0 0 0 0 0\n"); + + Label frame0_esp, frame1_esp; + Label frame1_ebp, frame2_ebp, frame3_ebp; + stack_section.start() = 0x002ff290; + stack_section + .Mark(&frame0_esp) + .D32(0x771ef8c1) // EIP in frame 0 (system call) + .D32(0x75fa0a91) // return address of frame 0 + .Mark(&frame1_esp) + .D32(0x000017b0) // args to child + .D32(0x00000000) + .D32(0x002ff2d8) + .D32(0x88014a2e) + .D32(0x002ff364) + .D32(0x000017b0) + .D32(0x00000000) + .D32(0x00000024) + .D32(0x00000001) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x9e3b9800) + .D32(0xfffffff7) + .D32(0x00000000) + .D32(0x002ff2a4) + .D32(0x64a07ff1) // random value to be confused with a return address + .D32(0x002ff8dc) + .D32(0x75fc6590) // random value to be confused with a return address + .D32(0xfdd2c6ea) + .D32(0x00000000) + .Mark(&frame1_ebp) + .D32(frame2_ebp) // Child EBP + .D32(0x75741194) // return address of frame 1 + .D32(0x000017b0) // args to child + .D32(0x0036ee80) + .D32(0x00000000) + .D32(0x65bc7d14) + .Mark(&frame2_ebp) + .D32(frame3_ebp) // Child EBP + .D32(0x75741148) // return address of frame 2 + .D32(0x000017b0) // args to child + .D32(0x0036ee80) + .D32(0x00000000) + .Mark(&frame3_ebp) + .D32(0) // saved %ebp (stack end) + .D32(0); // saved %eip (stack end) + + RegionFromSection(); + raw_context.eip = 0x771ef8c1; // in ntdll::ZwWaitForSingleObject + raw_context.esp = stack_section.start().Value(); + ASSERT_TRUE(raw_context.esp == frame0_esp.Value()); + raw_context.ebp = frame1_ebp.Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + + ASSERT_EQ(4U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x771ef8c1U, frame0->instruction); + EXPECT_EQ(0x771ef8c1U, frame0->context.eip); + EXPECT_EQ(frame0_esp.Value(), frame0->context.esp); + EXPECT_EQ(frame1_ebp.Value(), frame0->context.ebp); + EXPECT_EQ(&module3, frame0->module); + EXPECT_EQ("ZwWaitForSingleObject", frame0->function_name); + // The STACK WIN record for module3!ZwWaitForSingleObject should have + // produced a fully populated WindowsFrameInfo structure. + ASSERT_TRUE(frame0->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame0->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FPO, + frame0->windows_frame_info->type_); + EXPECT_EQ("", frame0->windows_frame_info->program_string); + EXPECT_FALSE(frame0->windows_frame_info->allocates_base_pointer); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP + | StackFrameX86::CONTEXT_VALID_ESP + | StackFrameX86::CONTEXT_VALID_EBP + | StackFrameX86::CONTEXT_VALID_EBX), + frame1->context_validity); + EXPECT_EQ(0x75fa0a91U, frame1->instruction + 1); + EXPECT_EQ(0x75fa0a91U, frame1->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp); + EXPECT_EQ(&module4, frame1->module); + EXPECT_EQ("WaitForSingleObjectEx", frame1->function_name); + // The STACK WIN record for module4!WaitForSingleObjectEx should have + // produced a fully populated WindowsFrameInfo structure. + ASSERT_TRUE(frame1->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame1->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame1->windows_frame_info->type_); + EXPECT_EQ("$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L " + "$T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =", + frame1->windows_frame_info->program_string); + EXPECT_FALSE(frame1->windows_frame_info->allocates_base_pointer); + } +} + +// Scan the stack for a better return address and potentially skip frames +// when the calculated return address is not in a known module. Note, that +// the span of this scan is somewhat arbitrarily limited to 160 search words +// for the context frame and 40 search words (pointers) for the other frames: +// const int kRASearchWords = 40; +// This means that frames can be skipped only when their size is relatively +// small: smaller than 4 * kRASearchWords * sizeof(InstructionType) +TEST_F(GetCallerFrame, ReturnAddressIsNotInKnownModule) { + MockCodeModule msvcrt_dll(0x77be0000, 0x58000, "msvcrt.dll", "version1"); + SetModuleSymbols(&msvcrt_dll, // msvcrt.dll + "PUBLIC 38180 0 wcsstr\n" + "STACK WIN 4 38180 61 10 0 8 0 0 0 1 $T0 $ebp = $eip $T0 " + "4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs " + "- = $P $T0 4 + .cbParams + =\n"); + + MockCodeModule kernel32_dll(0x7c800000, 0x103000, "kernel32.dll", "version1"); + SetModuleSymbols(&kernel32_dll, // kernel32.dll + "PUBLIC efda 8 FindNextFileW\n" + "STACK WIN 4 efda 1bb c 0 8 8 3c 0 1 $T0 $ebp = $eip $T0 " + "4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs " + "- = $P $T0 4 + .cbParams + =\n"); + + MockCodeModule chrome_dll(0x1c30000, 0x28C8000, "chrome.dll", "version1"); + SetModuleSymbols(&chrome_dll, // chrome.dll + "FUNC e3cff 4af 0 file_util::FileEnumerator::Next()\n" + "e3cff 1a 711 2505\n" + "STACK WIN 4 e3cff 4af 20 0 4 c 94 0 1 $T1 .raSearch = " + "$T0 $T1 4 - 8 @ = $ebp $T1 4 - ^ = $eip $T1 ^ = $esp " + "$T1 4 + = $20 $T0 152 - ^ = $23 $T0 156 - ^ = $24 " + "$T0 160 - ^ =\n"); + + // Create some modules with some stock debugging information. + MockCodeModules local_modules; + local_modules.Add(&msvcrt_dll); + local_modules.Add(&kernel32_dll); + local_modules.Add(&chrome_dll); + + Label frame0_esp; + Label frame0_ebp; + Label frame1_ebp; + Label frame2_ebp; + Label frame3_ebp; + + stack_section.start() = 0x0932f2d0; + stack_section + .Mark(&frame0_esp) + .D32(0x0764e000) + .D32(0x0764e068) + .Mark(&frame0_ebp) + .D32(frame1_ebp) // Child EBP + .D32(0x001767a0) // return address of frame 0 + // Not in known module + .D32(0x0764e0c6) + .D32(0x001bb1b8) + .D32(0x0764e068) + .D32(0x00000003) + .D32(0x0764e068) + .D32(0x00000003) + .D32(0x07578828) + .D32(0x0764e000) + .D32(0x00000000) + .D32(0x001c0010) + .D32(0x0764e0c6) + .Mark(&frame1_ebp) + .D32(frame2_ebp) // Child EBP + .D32(0x7c80f10f) // return address of frame 1 + // inside kernel32!FindNextFileW + .D32(0x000008f8) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x0932f34c) + .D32(0x0764e000) + .D32(0x00001000) + .D32(0x00000000) + .D32(0x00000001) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x0932f6a8) + .D32(0x00000000) + .D32(0x0932f6d8) + .D32(0x00000000) + .D32(0x000000d6) + .D32(0x0764e000) + .D32(0x7ff9a000) + .D32(0x0932f3fc) + .D32(0x00000001) + .D32(0x00000001) + .D32(0x07578828) + .D32(0x0000002e) + .D32(0x0932f340) + .D32(0x0932eef4) + .D32(0x0932ffdc) + .D32(0x7c839ad8) + .D32(0x7c80f0d8) + .D32(0x00000000) + .Mark(&frame2_ebp) + .D32(frame3_ebp) // Child EBP + .D32(0x01d13f91) // return address of frame 2 + // inside chrome_dll!file_util::FileEnumerator::Next + .D32(0x07578828) + .D32(0x0932f6ac) + .D32(0x0932f9c4) + .D32(0x0932f9b4) + .D32(0x00000000) + .D32(0x00000003) + .D32(0x0932f978) + .D32(0x01094330) + .D32(0x00000000) + .D32(0x00000001) + .D32(0x01094330) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x07f30000) + .D32(0x01c3ba17) + .D32(0x08bab840) + .D32(0x07f31580) + .D32(0x00000000) + .D32(0x00000007) + .D32(0x0932f940) + .D32(0x0000002e) + .D32(0x0932f40c) + .D32(0x01d13b53) + .D32(0x0932f958) + .D32(0x00000001) + .D32(0x00000007) + .D32(0x0932f940) + .D32(0x0000002e) + .D32(0x00000000) + .D32(0x0932f6ac) + .D32(0x01e13ef0) + .D32(0x00000001) + .D32(0x00000007) + .D32(0x0932f958) + .D32(0x08bab840) + .D32(0x0932f9b4) + .D32(0x00000000) + .D32(0x0932f9b4) + .D32(0x000000a7) + .D32(0x000000a7) + .D32(0x0932f998) + .D32(0x579627a2) + .Mark(&frame3_ebp) + .D32(0) // saved %ebp (stack end) + .D32(0); // saved %eip (stack end) + + RegionFromSection(); + raw_context.eip = 0x77c181cd; // inside msvcrt!wcsstr + raw_context.esp = frame0_esp.Value(); + raw_context.ebp = frame0_ebp.Value(); + // sanity + ASSERT_TRUE(raw_context.esp == stack_section.start().Value()); + ASSERT_TRUE(raw_context.ebp == stack_section.start().Value() + 8); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, + &local_modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + + ASSERT_EQ(3U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(0x77c181cdU, frame0->instruction); + EXPECT_EQ(0x77c181cdU, frame0->context.eip); + EXPECT_EQ(frame0_esp.Value(), frame0->context.esp); + EXPECT_EQ(frame0_ebp.Value(), frame0->context.ebp); + EXPECT_EQ(&msvcrt_dll, frame0->module); + EXPECT_EQ("wcsstr", frame0->function_name); + ASSERT_TRUE(frame0->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame0->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame0->windows_frame_info->type_); + EXPECT_EQ("$T0 $ebp = $eip $T0 " + "4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs " + "- = $P $T0 4 + .cbParams + =", + frame0->windows_frame_info->program_string); + // It has program string, so allocates_base_pointer is not expected + EXPECT_FALSE(frame0->windows_frame_info->allocates_base_pointer); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI_SCAN, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP), + frame1->context_validity); + EXPECT_EQ(0x7c80f10fU, frame1->instruction + 1); + EXPECT_EQ(0x7c80f10fU, frame1->context.eip); + // frame 1 was skipped, so intead of frame1_ebp compare with frame2_ebp. + EXPECT_EQ(frame2_ebp.Value(), frame1->context.ebp); + EXPECT_EQ(&kernel32_dll, frame1->module); + EXPECT_EQ("FindNextFileW", frame1->function_name); + ASSERT_TRUE(frame1->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame1->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame1->windows_frame_info->type_); + EXPECT_EQ("$T0 $ebp = $eip $T0 " + "4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs " + "- = $P $T0 4 + .cbParams + =", + frame1->windows_frame_info->program_string); + EXPECT_FALSE(frame1->windows_frame_info->allocates_base_pointer); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame2->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP), + frame2->context_validity); + EXPECT_EQ(0x01d13f91U, frame2->instruction + 1); + EXPECT_EQ(0x01d13f91U, frame2->context.eip); + // frame 1 was skipped, so intead of frame2_ebp compare with frame3_ebp. + EXPECT_EQ(frame3_ebp.Value(), frame2->context.ebp); + EXPECT_EQ(&chrome_dll, frame2->module); + EXPECT_EQ("file_util::FileEnumerator::Next()", frame2->function_name); + ASSERT_TRUE(frame2->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame2->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame2->windows_frame_info->type_); + EXPECT_EQ("$T1 .raSearch = " + "$T0 $T1 4 - 8 @ = $ebp $T1 4 - ^ = $eip $T1 ^ = $esp " + "$T1 4 + = $20 $T0 152 - ^ = $23 $T0 156 - ^ = $24 " + "$T0 160 - ^ =", + frame2->windows_frame_info->program_string); + EXPECT_FALSE(frame2->windows_frame_info->allocates_base_pointer); + } +} + +// Test the .raSearchStart/.raSearch calculation when alignment operators are +// used in the program string. The current %ebp must be valid and it is the +// only reliable data point that can be used for that calculation. +TEST_F(GetCallerFrame, HandleAlignmentInProgramString) { + MockCodeModule chrome_dll(0x59630000, 0x19e3000, "chrome.dll", "version1"); + SetModuleSymbols(&chrome_dll, // chrome.dll + "FUNC 56422 50c 8 base::MessageLoop::RunTask" + "(base::PendingTask const&)\n" + "56422 e 458 4589\n" + "STACK WIN 4 56422 50c 11 0 8 c ac 0 1 $T1 .raSearch = $T0 " + "$T1 4 - 8 @ = $ebp $T1 4 - ^ = $eip $T1 ^ = $esp $T1 4 + = " + "$20 $T0 176 - ^ = $23 $T0 180 - ^ = $24 $T0 184 - ^ =\n" + "FUNC 55d34 34a 0 base::MessageLoop::DoWork()\n" + "55d34 11 596 4589\n" + "STACK WIN 4 55d34 34a 19 0 0 c 134 0 1 $T1 .raSearch = " + "$T0 $T1 4 - 8 @ = $ebp $T1 4 - ^ = $eip $T1 ^ = $esp " + "$T1 4 + = $20 $T0 312 - ^ = $23 $T0 316 - ^ = $24 $T0 " + "320 - ^ =\n" + "FUNC 55c39 fb 0 base::MessagePumpForIO::DoRunLoop()\n" + "55c39 d 518 19962\n" + "STACK WIN 4 55c39 fb d 0 0 c 34 0 1 $T1 .raSearch = $T0 " + "$T1 4 - 64 @ = $ebp $T1 4 - ^ = $eip $T1 ^ = $esp $T1 4 + " + "= $20 $T0 56 - ^ = $23 $T0 60 - ^ = $24 $T0 64 - ^ =\n" + "FUNC 55bf0 49 4 base::MessagePumpWin::Run(base::" + "MessagePump::Delegate*)\n" + "55bf0 49 48 4724\n" + "STACK WIN 4 55bf0 49 c 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 " + "+ ^ = $ebp $T0 ^ = $esp $T0 8 + =\n" + "FUNC 165d de 4 malloc\n" + "165d 6 119 54\n" + "STACK WIN 4 165d de d 0 4 8 0 0 1 $T1 .raSearch = $T0 " + "$T1 4 - 8 @ = $ebp $T1 4 - ^ = $eip $T1 ^ = $esp $T1 4 " + "+ = $23 $T0 4 - ^ = $24 $T0 8 - ^ =\n" + "FUNC 55ac9 79 0 base::MessageLoop::RunInternal()\n" + "55ac9 d 427 4589\n" + "STACK WIN 4 55ac9 79 d 0 0 8 10 0 1 $T1 .raSearch = $T0 " + "$T1 4 - 8 @ = $ebp $T1 4 - ^ = $eip $T1 ^ = $esp $T1 4 + = " + "$23 $T0 20 - ^ = $24 $T0 24 - ^ =\n"); + + // Create some modules with some stock debugging information. + MockCodeModules local_modules; + local_modules.Add(&chrome_dll); + + Label frame0_esp; + Label frame0_ebp; + Label frame1_esp; + Label frame1_ebp; + Label frame2_esp; + Label frame2_ebp; + Label frame3_esp; + Label frame3_ebp; + + stack_section.start() = 0x046bfc80; + stack_section + .D32(0) + .Mark(&frame0_esp) + .D32(0x01e235a0) + .D32(0x00000000) + .D32(0x01e9f580) + .D32(0x01e9f580) + .D32(0x00000020) + .D32(0x00000000) + .D32(0x00463674) + .D32(0x00000020) + .D32(0x00000000) + .D32(0x046bfcd8) + .D32(0x046bfcd8) + .D32(0x0001204b) + .D32(0x00000000) + .D32(0xfdddb523) + .D32(0x00000000) + .D32(0x00000007) + .D32(0x00000040) + .D32(0x00000000) + .D32(0x59631693) // chrome_59630000!malloc+0x36 + .D32(0x01e9f580) + .D32(0x01e9f580) + .D32(0x046bfcf8) + .D32(0x77da6704) // ntdll!NtSetIoCompletion+0xc + .D32(0x046bfd4c) + .D32(0x59685bec) // chrome_59630000!base::MessageLoop::StartHistogrammer.. + .D32(0x01e235a0) + + .Mark(&frame0_ebp) + .D32(frame1_ebp) // Child EBP .D32(0x046bfd0c) + .D32(0x59685c2e) // Return address in + // chrome_59630000!base::MessagePumpWin::Run+0x3e + .Mark(&frame1_esp) + .D32(0x01e75a90) + .D32(0x046bfd4c) + .D32(0x01e75a90) + .D32(0x00000000) + .D32(0x00000300) + .D32(0x00000001) + + .Mark(&frame1_ebp) + .D32(frame2_ebp) // Child EBP .D32(0x046bfd30) + .D32(0x59685b3c) // Return address in + // chrome_59630000!base::MessageLoop::RunInternal+0x73 + .Mark(&frame2_esp) + .D32(0x01e75a90) + .D32(0x00000000) + .D32(0x046bfd4c) + .D32(0x59658123) // chrome_59630000!std::deque.. + .D32(0x046bfda0) + .D32(0x01e79d70) + .D32(0x046bfda0) + + .Mark(&frame2_ebp) // .D32(0x046bfd40) + .D32(0) // saved %ebp (stack end) + .D32(0); // saved %eip (stack end) + + RegionFromSection(); + raw_context.eip = 0x59685c46; // Context frame in + // base::MessagePumpForIO::DoRunLoop + raw_context.esp = frame0_esp.Value(); + raw_context.ebp = frame0_ebp.Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, + &local_modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + + ASSERT_EQ(3U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame->context_validity); + EXPECT_EQ("base::MessagePumpForIO::DoRunLoop()", frame->function_name); + EXPECT_EQ(0x59685c46U, frame->instruction); + EXPECT_EQ(0x59685c46U, frame->context.eip); + EXPECT_EQ(frame0_esp.Value(), frame->context.esp); + EXPECT_EQ(frame0_ebp.Value(), frame->context.ebp); + EXPECT_EQ(&chrome_dll, frame->module); + ASSERT_TRUE(frame->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame->windows_frame_info->type_); + EXPECT_EQ("$T1 .raSearch = $T0 " + "$T1 4 - 64 @ = $ebp $T1 4 - ^ = $eip $T1 ^ = $esp $T1 4 + " + "= $20 $T0 56 - ^ = $23 $T0 60 - ^ = $24 $T0 64 - ^ =", + frame->windows_frame_info->program_string); + EXPECT_FALSE(frame->windows_frame_info->allocates_base_pointer); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP), + frame->context_validity); + EXPECT_EQ("base::MessagePumpWin::Run(base::MessagePump::Delegate*)", + frame->function_name); + EXPECT_EQ(1500011566U, frame->instruction + 1); + EXPECT_EQ(1500011566U, frame->context.eip); + EXPECT_EQ(frame1_esp.Value(), frame->context.esp); + EXPECT_EQ(frame1_ebp.Value(), frame->context.ebp); + EXPECT_EQ(&chrome_dll, frame->module); + ASSERT_TRUE(frame->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame->windows_frame_info->type_); + EXPECT_EQ("$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =", + frame->windows_frame_info->program_string); + EXPECT_FALSE(frame->windows_frame_info->allocates_base_pointer); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP), + frame->context_validity); + EXPECT_EQ("base::MessageLoop::RunInternal()", frame->function_name); + EXPECT_EQ(1500011324U, frame->instruction + 1); + EXPECT_EQ(1500011324U, frame->context.eip); + EXPECT_EQ(frame2_esp.Value(), frame->context.esp); + EXPECT_EQ(frame2_ebp.Value(), frame->context.ebp); + EXPECT_EQ(&chrome_dll, frame->module); + ASSERT_TRUE(frame->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame->windows_frame_info->type_); + EXPECT_EQ("$T1 .raSearch = $T0 " + "$T1 4 - 8 @ = $ebp $T1 4 - ^ = $eip $T1 ^ = $esp $T1 4 + = " + "$23 $T0 20 - ^ = $24 $T0 24 - ^ =", + frame->windows_frame_info->program_string); + EXPECT_FALSE(frame->windows_frame_info->allocates_base_pointer); + } +} + +// Scan the stack for a return address and potentially skip frames when the +// current IP address is not in a known module. Note, that that the span of +// this scan is limited to 120 search words for the context frame and 30 +// search words (pointers) for the other frames: +// const int kRASearchWords = 30; +void GetCallerFrame::IPAddressIsNotInKnownModuleTestImpl( + bool has_corrupt_symbols) { + MockCodeModule remoting_core_dll(0x54080000, 0x501000, "remoting_core.dll", + "version1"); + string symbols_func_section = + "FUNC 137214 17d 10 PK11_Verify\n" + "FUNC 15c834 37 14 nsc_ECDSAVerifyStub\n" + "FUNC 1611d3 91 14 NSC_Verify\n" + "FUNC 162ff7 60 4 sftk_SessionFromHandle\n"; + string symbols_stack_section = + "STACK WIN 4 137214 17d 9 0 10 0 10 0 1 $T0 $ebp = " + "$eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =\n" + "STACK WIN 4 15c834 37 6 0 14 0 18 0 1 $T0 $ebp = " + "$eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =\n" + "STACK WIN 4 1611d3 91 7 0 14 0 8 0 1 $T0 $ebp = " + "$eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =\n" + "STACK WIN 4 162ff7 60 5 0 4 0 0 0 1 $T0 $ebp = " + "$eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =\n"; + + string symbols = symbols_func_section; + if (has_corrupt_symbols) { + symbols.append(string(1, '\0')); // null terminator in the middle + symbols.append("\n"); + symbols.append("FUNC 1234\n" // invalid FUNC records + "FUNNC 1234\n" + "STACK WIN 4 1234 234 23 " // invalid STACK record + "23423423 234 23 234 234 " + "234 23 234 23 234 234 " + "234 234 234\n"); + } + symbols.append(symbols_stack_section); + SetModuleSymbols(&remoting_core_dll, symbols); + + // Create some modules with some stock debugging information. + MockCodeModules local_modules; + local_modules.Add(&remoting_core_dll); + + Label frame0_esp; + Label frame0_ebp; + Label frame1_ebp; + Label frame1_esp; + Label frame2_ebp; + Label frame2_esp; + Label frame3_ebp; + Label frame3_esp; + Label bogus_stack_location_1; + Label bogus_stack_location_2; + Label bogus_stack_location_3; + + stack_section.start() = 0x01a3ea28; + stack_section + .Mark(&frame0_esp) + .D32(bogus_stack_location_2) + .D32(bogus_stack_location_1) + .D32(0x042478e4) + .D32(bogus_stack_location_2) + .D32(0x00000000) + .D32(0x041f0420) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000040) + .D32(0x00000001) + .D32(0x00b7e0d0) + .D32(0x00000000) + .D32(0x00000040) + .D32(0x00000001) + .D32(0x00b7f570) + .Mark(&bogus_stack_location_1) + .D32(0x00000000) + .D32(0x00000040) + .D32(0x00000008) + .D32(0x04289530) + .D32(0x00000000) + .D32(0x00000040) + .D32(0x00000008) + .D32(0x00b7e910) + .D32(0x00000000) + .D32(0x00000040) + .D32(0x00000008) + .D32(0x00b7d998) + .D32(0x00000000) + .D32(0x00000040) + .D32(0x00000008) + .D32(0x00b7dec0) + .Mark(&bogus_stack_location_2) + .D32(0x00000000) + .D32(0x00000040) + .D32(0x00000008) + .D32(0x04289428) + .D32(0x00000000) + .D32(0x00000040) + .D32(0x00000008) + .D32(0x00b7f258) + .Mark(&bogus_stack_location_3) + .D32(0x00000000) + .D32(0x041f3560) + .D32(0x00000041) + .D32(0x00000020) + .D32(0xffffffff) + .Mark(&frame0_ebp) + .D32(frame1_ebp) // Child %ebp + .D32(0x541dc866) // return address of frame 0 + // inside remoting_core!nsc_ECDSAVerifyStub+0x32 + .Mark(&frame1_esp) + .D32(0x04247860) + .D32(0x01a3eaec) + .D32(0x01a3eaf8) + .D32(0x541e304f) // remoting_core!sftk_SessionFromHandle+0x58 + .D32(0x0404c620) + .D32(0x00000040) + .D32(0x01a3eb2c) + .D32(0x01a3ec08) + .D32(0x00000014) + .Mark(&frame1_ebp) + .D32(frame2_ebp) // Child %ebp + .D32(0x541e1234) // return address of frame 1 + // inside remoting_core!NSC_Verify+0x61 + .Mark(&frame2_esp) + .D32(0x04247858) + .D32(0x0404c620) + .D32(0x00000040) + .D32(0x01a3ec08) + .D32(0x00000014) + .D32(0x01000005) + .D32(0x00b2f7a0) + .D32(0x041f0420) + .D32(0x041f3650) + .Mark(&frame2_ebp) + .D32(frame3_ebp) // Child %ebp + .D32(0x541b734d) // return address of frame 1 + // inside remoting_core!PK11_Verify+0x139 + .Mark(&frame3_esp) + .D32(0x01000005) + .D32(0x01a3ec08) + .D32(0x00000014) + .D32(0x0404c620) + .D32(0x00000040) + .D32(0x04073e00) + .D32(0x04073e00) + .D32(0x04247050) + .D32(0x00001041) + .D32(0x00000000) + .D32(0x00000000) + .D32(0x00000000) + .Mark(&frame3_ebp) + .D32(0) // saved %ebp (stack end) + .D32(0); // saved %eip (stack end) + + RegionFromSection(); + raw_context.eip = 0x4247860; // IP address not in known module + raw_context.ebp = 0x5420362d; // bogus + raw_context.esp = frame0_esp.Value(); + + // sanity + ASSERT_TRUE(raw_context.esp == stack_section.start().Value()); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, + &local_modules, &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + if (has_corrupt_symbols) { + ASSERT_EQ(1U, modules_with_corrupt_symbols.size()); + ASSERT_EQ("remoting_core.dll", + modules_with_corrupt_symbols[0]->debug_file()); + } else { + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + } + frames = call_stack.frames(); + + ASSERT_EQ(4U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ(raw_context.eip, frame0->context.eip); + EXPECT_EQ(raw_context.ebp, frame0->context.ebp); + EXPECT_EQ(raw_context.esp, frame0->context.esp); + EXPECT_EQ(NULL, frame0->module); // IP not in known module + EXPECT_EQ("", frame0->function_name); + ASSERT_EQ(NULL, frame0->windows_frame_info); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP), + frame1->context_validity); + EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp); + EXPECT_EQ(frame1_esp.Value(), frame1->context.esp); + EXPECT_EQ(&remoting_core_dll, frame1->module); + EXPECT_EQ("nsc_ECDSAVerifyStub", frame1->function_name); + ASSERT_TRUE(frame1->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame1->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame1->windows_frame_info->type_); + EXPECT_EQ("$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =", + frame1->windows_frame_info->program_string); + EXPECT_FALSE(frame1->windows_frame_info->allocates_base_pointer); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame2 = static_cast(frames->at(2)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame2->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP), + frame2->context_validity); + EXPECT_EQ(frame2_ebp.Value(), frame2->context.ebp); + EXPECT_EQ(frame2_esp.Value(), frame2->context.esp); + EXPECT_EQ(&remoting_core_dll, frame2->module); + EXPECT_EQ("NSC_Verify", frame2->function_name); + ASSERT_TRUE(frame2->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame2->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame2->windows_frame_info->type_); + EXPECT_EQ("$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =", + frame2->windows_frame_info->program_string); + EXPECT_FALSE(frame2->windows_frame_info->allocates_base_pointer); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame3 = static_cast(frames->at(3)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame3->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP), + frame3->context_validity); + EXPECT_EQ(frame3_ebp.Value(), frame3->context.ebp); + EXPECT_EQ(frame3_esp.Value(), frame3->context.esp); + EXPECT_EQ(&remoting_core_dll, frame3->module); + EXPECT_EQ("PK11_Verify", frame3->function_name); + ASSERT_TRUE(frame3->windows_frame_info != NULL); + EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame3->windows_frame_info->valid); + EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA, + frame3->windows_frame_info->type_); + EXPECT_EQ("$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =", + frame3->windows_frame_info->program_string); + EXPECT_FALSE(frame3->windows_frame_info->allocates_base_pointer); + } +} + +// Runs IPAddressIsNotInKnownModule test with good symbols +TEST_F(GetCallerFrame, IPAddressIsNotInKnownModule) { + IPAddressIsNotInKnownModuleTestImpl(false /* has_corrupt_modules */); +} + +// Runs IPAddressIsNotInKnownModule test with corrupt symbols +TEST_F(GetCallerFrame, IPAddressIsNotInKnownModule_CorruptSymbols) { + IPAddressIsNotInKnownModuleTestImpl(true /* has_corrupt_modules */); +} + +struct CFIFixture: public StackwalkerX86Fixture { + CFIFixture() { + // Provide a bunch of STACK CFI records; individual tests walk to the + // caller from every point in this series, expecting to find the same + // set of register values. + SetModuleSymbols(&module1, + // The youngest frame's function. + "FUNC 4000 1000 10 enchiridion\n" + // Initially, just a return address. + "STACK CFI INIT 4000 100 .cfa: $esp 4 + .ra: .cfa 4 - ^\n" + // Push %ebx. + "STACK CFI 4001 .cfa: $esp 8 + $ebx: .cfa 8 - ^\n" + // Move %esi into %ebx. Weird, but permitted. + "STACK CFI 4002 $esi: $ebx\n" + // Allocate frame space, and save %edi. + "STACK CFI 4003 .cfa: $esp 20 + $edi: .cfa 16 - ^\n" + // Put the return address in %edi. + "STACK CFI 4005 .ra: $edi\n" + // Save %ebp, and use it as a frame pointer. + "STACK CFI 4006 .cfa: $ebp 8 + $ebp: .cfa 12 - ^\n" + + // The calling function. + "FUNC 5000 1000 10 epictetus\n" + // Mark it as end of stack. + "STACK CFI INIT 5000 1000 .cfa: $esp .ra 0\n"); + + // Provide some distinctive values for the caller's registers. + expected.esp = 0x80000000; + expected.eip = 0x40005510; + expected.ebp = 0xc0d4aab9; + expected.ebx = 0x60f20ce6; + expected.esi = 0x53d1379d; + expected.edi = 0xafbae234; + + // By default, registers are unchanged. + raw_context = expected; + } + + // Walk the stack, using stack_section as the contents of the stack + // and raw_context as the current register values. (Set + // raw_context.esp to the stack's starting address.) Expect two + // stack frames; in the older frame, expect the callee-saves + // registers to have values matching those in 'expected'. + void CheckWalk() { + RegionFromSection(); + raw_context.esp = stack_section.start().Value(); + + StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); + StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, + &frame_symbolizer); + vector modules_without_symbols; + vector modules_with_corrupt_symbols; + ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, + &modules_with_corrupt_symbols)); + ASSERT_EQ(0U, modules_without_symbols.size()); + ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); + frames = call_stack.frames(); + ASSERT_EQ(2U, frames->size()); + + { // To avoid reusing locals by mistake + StackFrameX86 *frame0 = static_cast(frames->at(0)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust); + ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity); + EXPECT_EQ("enchiridion", frame0->function_name); + EXPECT_EQ(0x40004000U, frame0->function_base); + ASSERT_TRUE(frame0->windows_frame_info != NULL); + ASSERT_EQ(WindowsFrameInfo::VALID_PARAMETER_SIZE, + frame0->windows_frame_info->valid); + ASSERT_TRUE(frame0->cfi_frame_info != NULL); + } + + { // To avoid reusing locals by mistake + StackFrameX86 *frame1 = static_cast(frames->at(1)); + EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust); + ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP | + StackFrameX86::CONTEXT_VALID_ESP | + StackFrameX86::CONTEXT_VALID_EBP | + StackFrameX86::CONTEXT_VALID_EBX | + StackFrameX86::CONTEXT_VALID_ESI | + StackFrameX86::CONTEXT_VALID_EDI), + frame1->context_validity); + EXPECT_EQ(expected.eip, frame1->context.eip); + EXPECT_EQ(expected.esp, frame1->context.esp); + EXPECT_EQ(expected.ebp, frame1->context.ebp); + EXPECT_EQ(expected.ebx, frame1->context.ebx); + EXPECT_EQ(expected.esi, frame1->context.esi); + EXPECT_EQ(expected.edi, frame1->context.edi); + EXPECT_EQ("epictetus", frame1->function_name); + } + } + + // The values the stack walker should find for the caller's registers. + MDRawContextX86 expected; +}; + +class CFI: public CFIFixture, public Test { }; + +TEST_F(CFI, At4000) { + Label frame1_esp = expected.esp; + stack_section + .D32(0x40005510) // return address + .Mark(&frame1_esp); // This effectively sets stack_section.start(). + raw_context.eip = 0x40004000; + CheckWalk(); +} + +TEST_F(CFI, At4001) { + Label frame1_esp = expected.esp; + stack_section + .D32(0x60f20ce6) // saved %ebx + .D32(0x40005510) // return address + .Mark(&frame1_esp); // This effectively sets stack_section.start(). + raw_context.eip = 0x40004001; + raw_context.ebx = 0x91aa9a8b; // callee's %ebx value + CheckWalk(); +} + +TEST_F(CFI, At4002) { + Label frame1_esp = expected.esp; + stack_section + .D32(0x60f20ce6) // saved %ebx + .D32(0x40005510) // return address + .Mark(&frame1_esp); // This effectively sets stack_section.start(). + raw_context.eip = 0x40004002; + raw_context.ebx = 0x53d1379d; // saved %esi + raw_context.esi = 0xa5c790ed; // callee's %esi value + CheckWalk(); +} + +TEST_F(CFI, At4003) { + Label frame1_esp = expected.esp; + stack_section + .D32(0x56ec3db7) // garbage + .D32(0xafbae234) // saved %edi + .D32(0x53d67131) // garbage + .D32(0x60f20ce6) // saved %ebx + .D32(0x40005510) // return address + .Mark(&frame1_esp); // This effectively sets stack_section.start(). + raw_context.eip = 0x40004003; + raw_context.ebx = 0x53d1379d; // saved %esi + raw_context.esi = 0xa97f229d; // callee's %esi + raw_context.edi = 0xb05cc997; // callee's %edi + CheckWalk(); +} + +// The results here should be the same as those at module offset +// 0x4003. +TEST_F(CFI, At4004) { + Label frame1_esp = expected.esp; + stack_section + .D32(0xe29782c2) // garbage + .D32(0xafbae234) // saved %edi + .D32(0x5ba29ce9) // garbage + .D32(0x60f20ce6) // saved %ebx + .D32(0x40005510) // return address + .Mark(&frame1_esp); // This effectively sets stack_section.start(). + raw_context.eip = 0x40004004; + raw_context.ebx = 0x53d1379d; // saved %esi + raw_context.esi = 0x0fb7dc4e; // callee's %esi + raw_context.edi = 0x993b4280; // callee's %edi + CheckWalk(); +} + +TEST_F(CFI, At4005) { + Label frame1_esp = expected.esp; + stack_section + .D32(0xe29782c2) // garbage + .D32(0xafbae234) // saved %edi + .D32(0x5ba29ce9) // garbage + .D32(0x60f20ce6) // saved %ebx + .D32(0x8036cc02) // garbage + .Mark(&frame1_esp); // This effectively sets stack_section.start(). + raw_context.eip = 0x40004005; + raw_context.ebx = 0x53d1379d; // saved %esi + raw_context.esi = 0x0fb7dc4e; // callee's %esi + raw_context.edi = 0x40005510; // return address + CheckWalk(); +} + +TEST_F(CFI, At4006) { + Label frame0_ebp; + Label frame1_esp = expected.esp; + stack_section + .D32(0xdcdd25cd) // garbage + .D32(0xafbae234) // saved %edi + .D32(0xc0d4aab9) // saved %ebp + .Mark(&frame0_ebp) // frame pointer points here + .D32(0x60f20ce6) // saved %ebx + .D32(0x8036cc02) // garbage + .Mark(&frame1_esp); // This effectively sets stack_section.start(). + raw_context.eip = 0x40004006; + raw_context.ebp = frame0_ebp.Value(); + raw_context.ebx = 0x53d1379d; // saved %esi + raw_context.esi = 0x743833c9; // callee's %esi + raw_context.edi = 0x40005510; // return address + CheckWalk(); +} + diff --git a/src/processor/static_address_map-inl.h b/src/processor/static_address_map-inl.h new file mode 100644 index 0000000..0dd13f8 --- /dev/null +++ b/src/processor/static_address_map-inl.h @@ -0,0 +1,70 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_address_map-inl.h: StaticAddressMap implementation. +// +// See static_address_map.h for documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_STATIC_ADDRESS_MAP_INL_H__ +#define PROCESSOR_STATIC_ADDRESS_MAP_INL_H__ + +#include "processor/static_address_map.h" + +#include "processor/logging.h" + +namespace google_breakpad { + +template +bool StaticAddressMap::Retrieve( + const AddressType& address, + const EntryType*& entry, AddressType* entry_address) const { + + // upper_bound gives the first element whose key is greater than address, + // but we want the first element whose key is less than or equal to address. + // Decrement the iterator to get there, but not if the upper_bound already + // points to the beginning of the map - in that case, address is lower than + // the lowest stored key, so return false. + + MapConstIterator iterator = map_.upper_bound(address); + if (iterator == map_.begin()) + return false; + --iterator; + + entry = iterator.GetValuePtr(); + // Make sure AddressType is a copyable basic type + if (entry_address) + *entry_address = iterator.GetKey(); + + return true; +} + +} // namespace google_breakpad + +#endif // PROCESSOR_STATIC_ADDRESS_MAP_INL_H__ diff --git a/src/processor/static_address_map.h b/src/processor/static_address_map.h new file mode 100644 index 0000000..156ecd6 --- /dev/null +++ b/src/processor/static_address_map.h @@ -0,0 +1,77 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_address_map.h: StaticAddressMap. +// +// StaticAddressMap is a wrapper class of StaticMap, just as AddressMap wraps +// std::map. StaticAddressMap provides read-only Retrieve() operation, similar +// as AddressMap. However, the difference between StaticAddressMap and +// AddressMap is that StaticAddressMap does not support dynamic operation +// Store() due to the static nature of the underlying StaticMap. +// +// See address_map.h for reference. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_STATIC_ADDRESS_MAP_H__ +#define PROCESSOR_STATIC_ADDRESS_MAP_H__ + +#include "processor/static_map-inl.h" + +namespace google_breakpad { + +// AddressType MUST be a basic type, e.g.: integer types etc +// EntryType could be a complex type, so we retrieve its pointer instead. +template +class StaticAddressMap { + public: + StaticAddressMap(): map_() { } + explicit StaticAddressMap(const char* map_data): map_(map_data) { } + + // Locates the entry stored at the highest address less than or equal to + // the address argument. If there is no such range, returns false. The + // entry is returned in entry, which is a required argument. If + // entry_address is not NULL, it will be set to the address that the entry + // was stored at. + bool Retrieve(const AddressType& address, + const EntryType*& entry, AddressType* entry_address) const; + + private: + friend class ModuleComparer; + // Convenience types. + typedef StaticAddressMap* SelfPtr; + typedef StaticMap AddressToEntryMap; + typedef typename AddressToEntryMap::const_iterator MapConstIterator; + + AddressToEntryMap map_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_STATIC_ADDRESS_MAP_H__ + diff --git a/src/processor/static_address_map_unittest.cc b/src/processor/static_address_map_unittest.cc new file mode 100644 index 0000000..aebab97 --- /dev/null +++ b/src/processor/static_address_map_unittest.cc @@ -0,0 +1,239 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_address_map_unittest.cc: Unit tests for StaticAddressMap. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/using_std_string.h" +#include "processor/address_map-inl.h" +#include "processor/static_address_map-inl.h" +#include "processor/simple_serializer-inl.h" +#include "map_serializers-inl.h" + +typedef google_breakpad::StaticAddressMap TestMap; +typedef google_breakpad::AddressMap AddrMap; + +class TestStaticAddressMap : public ::testing::Test { + protected: + void SetUp() { + for (int testcase = 0; testcase < kNumberTestCases; ++testcase) { + testdata[testcase] = new int[testsize[testcase]]; + } + + // Test data set0: NULL (empty map) + + // Test data set1: single element. + testdata[1][0] = 10; + + // Test data set2: six elements. + const int tempdata[] = {5, 10, 14, 15, 16, 20}; + for (int i = 0; i < testsize[2]; ++i) + testdata[2][i] = tempdata[i]; + + // Test data set3: + srand(time(NULL)); + for (int i = 0; i < testsize[3]; ++i) + testdata[3][i] = rand(); + + // Setup maps. + std::stringstream sstream; + for (int testcase = 0; testcase < kNumberTestCases; ++testcase) { + for (int data_item = 0; data_item < testsize[testcase]; ++data_item) { + sstream.clear(); + sstream << "test " << testdata[testcase][data_item]; + addr_map[testcase].Store(testdata[testcase][data_item], sstream.str()); + } + map_data[testcase] = serializer.Serialize(addr_map[testcase], NULL); + test_map[testcase] = TestMap(map_data[testcase]); + } + } + + void TearDown() { + for (int i = 0; i < kNumberTestCases; ++i) { + delete [] map_data[i]; + delete [] testdata[i]; + } + } + + void CompareRetrieveResult(int testcase, int target) { + int address; + int address_test; + string entry; + string entry_test; + const char* entry_cstring = NULL; + bool found; + bool found_test; + + found = addr_map[testcase].Retrieve(target, &entry, &address); + found_test = + test_map[testcase].Retrieve(target, entry_cstring, &address_test); + + ASSERT_EQ(found, found_test); + + if (found && found_test) { + ASSERT_EQ(address, address_test); + entry_test = entry_cstring; + ASSERT_EQ(entry, entry_test); + } + } + + void RetrieveTester(int testcase) { + int target; + target = INT_MIN; + CompareRetrieveResult(testcase, target); + target = INT_MAX; + CompareRetrieveResult(testcase, target); + + srand(time(0)); + for (int data_item = 0; data_item < testsize[testcase]; ++data_item) { + // Retrive (aka, search) for target address and compare results from + // AddressMap and StaticAddressMap. + + // First, assign the search target to be one of original testdata that is + // known to exist in the map. + target = testdata[testcase][data_item]; + CompareRetrieveResult(testcase, target); + // Then, add +2 / -1 bias to target value, in order to test searching for + // a target address not stored in the map. + target -= 1; + CompareRetrieveResult(testcase, target); + target += 3; + CompareRetrieveResult(testcase, target); + // Repeatedly test searching for random target addresses. + target = rand(); + CompareRetrieveResult(testcase, target); + } + } + + // Test data sets: + static const int kNumberTestCases = 4; + static const int testsize[]; + int* testdata[kNumberTestCases]; + + AddrMap addr_map[kNumberTestCases]; + TestMap test_map[kNumberTestCases]; + char* map_data[kNumberTestCases]; + google_breakpad::AddressMapSerializer serializer; +}; + +const int TestStaticAddressMap::testsize[] = {0, 1, 6, 1000}; + +TEST_F(TestStaticAddressMap, TestEmptyMap) { + int testcase = 0; + int target; + target = INT_MIN; + CompareRetrieveResult(testcase, target); + target = INT_MAX; + CompareRetrieveResult(testcase, target); + for (int data_item = 0; data_item < testsize[testcase]; ++data_item) { + target = testdata[testcase][data_item]; + CompareRetrieveResult(testcase, target); + target -= 1; + CompareRetrieveResult(testcase, target); + target += 3; + CompareRetrieveResult(testcase, target); + target = rand(); + CompareRetrieveResult(testcase, target); + } +} + +TEST_F(TestStaticAddressMap, TestOneElementMap) { + int testcase = 1; + int target; + target = INT_MIN; + CompareRetrieveResult(testcase, target); + target = INT_MAX; + CompareRetrieveResult(testcase, target); + for (int data_item = 0; data_item < testsize[testcase]; ++data_item) { + target = testdata[testcase][data_item]; + CompareRetrieveResult(testcase, target); + target -= 1; + CompareRetrieveResult(testcase, target); + target += 3; + CompareRetrieveResult(testcase, target); + target = rand(); + CompareRetrieveResult(testcase, target); + } +} + +TEST_F(TestStaticAddressMap, TestSixElementsMap) { + int testcase = 2; + int target; + target = INT_MIN; + CompareRetrieveResult(testcase, target); + target = INT_MAX; + CompareRetrieveResult(testcase, target); + for (int data_item = 0; data_item < testsize[testcase]; ++data_item) { + target = testdata[testcase][data_item]; + CompareRetrieveResult(testcase, target); + target -= 1; + CompareRetrieveResult(testcase, target); + target += 3; + CompareRetrieveResult(testcase, target); + target = rand(); + CompareRetrieveResult(testcase, target); + } +} + +TEST_F(TestStaticAddressMap, Test1000RandomElementsMap) { + int testcase = 3; + int target; + target = INT_MIN; + CompareRetrieveResult(testcase, target); + target = INT_MAX; + CompareRetrieveResult(testcase, target); + for (int data_item = 0; data_item < testsize[testcase]; ++data_item) { + target = testdata[testcase][data_item]; + CompareRetrieveResult(testcase, target); + target -= 1; + CompareRetrieveResult(testcase, target); + target += 3; + CompareRetrieveResult(testcase, target); + target = rand(); + CompareRetrieveResult(testcase, target); + } +} + +int main(int argc, char* argv[]) { + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/src/processor/static_contained_range_map-inl.h b/src/processor/static_contained_range_map-inl.h new file mode 100644 index 0000000..60606dd --- /dev/null +++ b/src/processor/static_contained_range_map-inl.h @@ -0,0 +1,108 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_contained_range_map-inl.h: Hierarchically-organized range map, +// i.e., StaticContainedRangeMap implementation. +// +// See static_contained_range_map.h for documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_STATIC_CONTAINED_RANGE_MAP_INL_H__ +#define PROCESSOR_STATIC_CONTAINED_RANGE_MAP_INL_H__ + +#include "processor/static_contained_range_map.h" +#include "processor/logging.h" + +namespace google_breakpad { + +template +StaticContainedRangeMap::StaticContainedRangeMap( + const char *base) + : base_(*(reinterpret_cast(base))), + entry_size_(*(reinterpret_cast(base + sizeof(base_)))), + entry_ptr_(reinterpret_cast( + base + sizeof(base_) + sizeof(entry_size_))), + map_(base + sizeof(base_) + sizeof(entry_size_) + entry_size_) { + if (entry_size_ == 0) + entry_ptr_ = NULL; +} + + +template +bool StaticContainedRangeMap::RetrieveRange( + const AddressType& address, const EntryType*& entry) const { + + // Get an iterator to the child range whose high address is equal to or + // greater than the supplied address. If the supplied address is higher + // than all of the high addresses in the range, then this range does not + // contain a child at address, so return false. If the supplied address + // is lower than the base address of the child range, then it is not within + // the child range, so return false. + MapConstIterator iterator = map_.lower_bound(address); + + if (iterator == map_.end()) + return false; + + const char *memory_child = + reinterpret_cast(iterator.GetValuePtr()); + + StaticContainedRangeMap child_map(memory_child); + + if (address < child_map.base_) + return false; + + // The child in iterator->second contains the specified address. Find out + // if it has a more-specific descendant that also contains it. If it does, + // it will set |entry| appropriately. If not, set |entry| to the child. + if (!child_map.RetrieveRange(address, entry)) + entry = child_map.entry_ptr_; + + return true; +} + +template +bool StaticContainedRangeMap::RetrieveRanges( + const AddressType& address, + std::vector& entries) const { + MapConstIterator iterator = map_.lower_bound(address); + if (iterator == map_.end()) + return false; + const char* memory_child = + reinterpret_cast(iterator.GetValuePtr()); + StaticContainedRangeMap child_map(memory_child); + if (address < child_map.base_) + return false; + child_map.RetrieveRanges(address, entries); + entries.push_back(child_map.entry_ptr_); + return true; +} + +} // namespace google_breakpad + +#endif // PROCESSOR_STATIC_CONTAINED_RANGE_MAP_INL_H__ diff --git a/src/processor/static_contained_range_map.h b/src/processor/static_contained_range_map.h new file mode 100644 index 0000000..86e5466 --- /dev/null +++ b/src/processor/static_contained_range_map.h @@ -0,0 +1,101 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_contained_range_map.h: StaticContainedRangeMap. +// +// StaticContainedRangeMap is similar to ContainedRangeMap. However, +// StaticContainedRangeMap wraps a StaticMap instead of std::map, and does not +// support dynamic operations like StoreRange(...). +// StaticContainedRangeMap provides same RetrieveRange(...) interfaces as +// ContainedRangeMap. +// +// Please see contained_range_map.h for more documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_STATIC_CONTAINED_RANGE_MAP_H__ +#define PROCESSOR_STATIC_CONTAINED_RANGE_MAP_H__ + +#include +#include "processor/static_map-inl.h" + +namespace google_breakpad { + +template +class StaticContainedRangeMap { + public: + StaticContainedRangeMap(): base_(), entry_size_(), entry_ptr_(), map_() { } + explicit StaticContainedRangeMap(const char *base); + + // Retrieves the most specific (smallest) descendant range encompassing + // the specified address. This method will only return entries held by + // child ranges, and not the entry contained by |this|. This is necessary + // to support a sparsely-populated root range. If no descendant range + // encompasses the address, returns false. + bool RetrieveRange(const AddressType& address, const EntryType*& entry) const; + + // Retrieves the vector of entries encompassing the specified address from the + // innermost entry to the outermost entry. + bool RetrieveRanges(const AddressType& address, + std::vector& entry) const; + + private: + friend class ModuleComparer; + // AddressToRangeMap stores pointers. This makes reparenting simpler in + // StoreRange, because it doesn't need to copy entire objects. + typedef StaticContainedRangeMap* SelfPtr; + typedef + StaticMap AddressToRangeMap; + typedef typename AddressToRangeMap::const_iterator MapConstIterator; + + // The base address of this range. The high address does not need to + // be stored, because it is used as the key to an object in its parent's + // map, and all ContainedRangeMaps except for the root range are contained + // within maps. The root range does not actually contain an entry, so its + // base_ field is meaningless, and the fact that it has no parent and thus + // no key is unimportant. For this reason, the base_ field should only be + // is accessed on child ContainedRangeMap objects, and never on |this|. + AddressType base_; + + // The entry corresponding to this range. The root range does not + // actually contain an entry, so its entry_ field is meaningless. For + // this reason, the entry_ field should only be accessed on child + // ContainedRangeMap objects, and never on |this|. + uint32_t entry_size_; + const EntryType *entry_ptr_; + + // The map containing child ranges, keyed by each child range's high + // address. This is a pointer to avoid allocating map structures for + // leaf nodes, where they are not needed. + AddressToRangeMap map_; +}; + +} // namespace google_breakpad + + +#endif // PROCESSOR_STATIC_CONTAINED_RANGE_MAP_H__ diff --git a/src/processor/static_contained_range_map_unittest.cc b/src/processor/static_contained_range_map_unittest.cc new file mode 100644 index 0000000..d0507a4 --- /dev/null +++ b/src/processor/static_contained_range_map_unittest.cc @@ -0,0 +1,342 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_contained_range_map_unittest.cc: Unit tests for +// StaticContainedRangeMap. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "breakpad_googletest_includes.h" +#include "common/scoped_ptr.h" +#include "processor/contained_range_map-inl.h" +#include "processor/static_contained_range_map-inl.h" +#include "processor/simple_serializer-inl.h" +#include "processor/map_serializers-inl.h" +#include "processor/logging.h" + +namespace { + +typedef google_breakpad::ContainedRangeMap CRMMap; +typedef google_breakpad::StaticContainedRangeMap TestMap; + +// Each element in test_data contains the expected result when calling +// RetrieveRange on an address. +const int test_data[] = { + 0, // 0 + 0, // 1 + 0, // 2 + 0, // 3 + 0, // 4 + 0, // 5 + 0, // 6 + 0, // 7 + 9, // 8 + 7, // 9 + 1, // 10 + 5, // 11 + 6, // 12 + 6, // 13 + 6, // 14 + 6, // 15 + 6, // 16 + 6, // 17 + 6, // 18 + 5, // 19 + 7, // 20 + 8, // 21 + 0, // 22 + 0, // 23 + 0, // 24 + 0, // 25 + 0, // 26 + 0, // 27 + 0, // 28 + 0, // 29 + 10, // 30 + 10, // 31 + 10, // 32 + 11, // 33 + 11, // 34 + 11, // 35 + 0, // 36 + 0, // 37 + 0, // 38 + 0, // 39 + 14, // 40 + 14, // 41 + 14, // 42 + 14, // 43 + 15, // 44 + 15, // 45 + 15, // 46 + 15, // 47 + 0, // 48 + 0, // 49 + 19, // 50 + 18, // 51 + 18, // 52 + 18, // 53 + 18, // 54 + 18, // 55 + 18, // 56 + 18, // 57 + 18, // 58 + 20, // 59 + 21, // 60 + 25, // 61 + 26, // 62 + 26, // 63 + 26, // 64 + 26, // 65 + 26, // 66 + 26, // 67 + 24, // 68 + 22, // 69 + 30, // 70 + 30, // 71 + 30, // 72 + 30, // 73 + 31, // 74 + 31, // 75 + 30, // 76 + 32, // 77 + 32, // 78 + 30, // 79 + 34, // 80 + 35, // 81 + 36, // 82 + 39, // 83 + 38, // 84 + 37, // 85 + 43, // 86 + 44, // 87 + 41, // 88 + 45, // 89 + 42, // 90 + 0, // 91 + 0, // 92 + 0, // 93 + 0, // 94 + 0, // 95 + 0, // 96 + 0, // 97 + 0, // 98 + 0 // 99 +}; + +} // namespace + +namespace google_breakpad { + +class TestStaticCRMMap : public ::testing::Test { + protected: + void SetUp(); + + // A referrence map for testing StaticCRMMap. + google_breakpad::ContainedRangeMap crm_map_; + + // Static version of crm_map using serialized data of crm_map. + // The goal of testing is to make sure TestMap provides same results for + // lookup operation(s) as CRMMap does. + google_breakpad::StaticContainedRangeMap test_map_; + + google_breakpad::ContainedRangeMapSerializer serializer_; + + scoped_array serialized_data_; +}; + +void TestStaticCRMMap::SetUp() { + // First, do the StoreRange tests. This validates the containment + // rules. + // We confirm the referrence map correctly stores data during setup. + ASSERT_TRUE (crm_map_.StoreRange(10, 10, 1)); + ASSERT_FALSE(crm_map_.StoreRange(10, 10, 2)); // exactly equal to 1 + ASSERT_FALSE(crm_map_.StoreRange(11, 10, 3)); // begins inside 1 and extends up + ASSERT_FALSE(crm_map_.StoreRange( 9, 10, 4)); // begins below 1 and ends inside + ASSERT_TRUE (crm_map_.StoreRange(11, 9, 5)); // contained by existing + ASSERT_TRUE (crm_map_.StoreRange(12, 7, 6)); + ASSERT_TRUE (crm_map_.StoreRange( 9, 12, 7)); // contains existing + ASSERT_TRUE (crm_map_.StoreRange( 9, 13, 8)); + ASSERT_TRUE (crm_map_.StoreRange( 8, 14, 9)); + ASSERT_TRUE (crm_map_.StoreRange(30, 3, 10)); + ASSERT_TRUE (crm_map_.StoreRange(33, 3, 11)); + ASSERT_TRUE (crm_map_.StoreRange(30, 6, 12)); // storable but totally masked + ASSERT_TRUE (crm_map_.StoreRange(40, 8, 13)); // will be totally masked + ASSERT_TRUE (crm_map_.StoreRange(40, 4, 14)); + ASSERT_TRUE (crm_map_.StoreRange(44, 4, 15)); + ASSERT_FALSE(crm_map_.StoreRange(32, 10, 16)); // begins in #10, ends in #14 + ASSERT_FALSE(crm_map_.StoreRange(50, 0, 17)); // zero length + ASSERT_TRUE (crm_map_.StoreRange(50, 10, 18)); + ASSERT_TRUE (crm_map_.StoreRange(50, 1, 19)); + ASSERT_TRUE (crm_map_.StoreRange(59, 1, 20)); + ASSERT_TRUE (crm_map_.StoreRange(60, 1, 21)); + ASSERT_TRUE (crm_map_.StoreRange(69, 1, 22)); + ASSERT_TRUE (crm_map_.StoreRange(60, 10, 23)); + ASSERT_TRUE (crm_map_.StoreRange(68, 1, 24)); + ASSERT_TRUE (crm_map_.StoreRange(61, 1, 25)); + ASSERT_TRUE (crm_map_.StoreRange(61, 8, 26)); + ASSERT_FALSE(crm_map_.StoreRange(59, 9, 27)); + ASSERT_FALSE(crm_map_.StoreRange(59, 10, 28)); + ASSERT_FALSE(crm_map_.StoreRange(59, 11, 29)); + ASSERT_TRUE (crm_map_.StoreRange(70, 10, 30)); + ASSERT_TRUE (crm_map_.StoreRange(74, 2, 31)); + ASSERT_TRUE (crm_map_.StoreRange(77, 2, 32)); + ASSERT_FALSE(crm_map_.StoreRange(72, 6, 33)); + ASSERT_TRUE (crm_map_.StoreRange(80, 3, 34)); + ASSERT_TRUE (crm_map_.StoreRange(81, 1, 35)); + ASSERT_TRUE (crm_map_.StoreRange(82, 1, 36)); + ASSERT_TRUE (crm_map_.StoreRange(83, 3, 37)); + ASSERT_TRUE (crm_map_.StoreRange(84, 1, 38)); + ASSERT_TRUE (crm_map_.StoreRange(83, 1, 39)); + ASSERT_TRUE (crm_map_.StoreRange(86, 5, 40)); + ASSERT_TRUE (crm_map_.StoreRange(88, 1, 41)); + ASSERT_TRUE (crm_map_.StoreRange(90, 1, 42)); + ASSERT_TRUE (crm_map_.StoreRange(86, 1, 43)); + ASSERT_TRUE (crm_map_.StoreRange(87, 1, 44)); + ASSERT_TRUE (crm_map_.StoreRange(89, 1, 45)); + ASSERT_TRUE (crm_map_.StoreRange(87, 4, 46)); + ASSERT_TRUE (crm_map_.StoreRange(87, 3, 47)); + ASSERT_FALSE(crm_map_.StoreRange(86, 2, 48)); + + // Serialize crm_map to generate serialized data. + unsigned int size; + serialized_data_.reset(serializer_.Serialize(&crm_map_, &size)); + BPLOG(INFO) << "Serialized data size: " << size << " Bytes."; + + // Construct test_map_ from serialized data. + test_map_ = TestMap(serialized_data_.get()); +} + +TEST_F(TestStaticCRMMap, TestEmptyMap) { + CRMMap empty_crm_map; + + unsigned int size; + scoped_array serialized_data; + serialized_data.reset(serializer_.Serialize(&empty_crm_map, &size)); + scoped_ptr test_map(new TestMap(serialized_data.get())); + + const unsigned int kCorrectSizeForEmptyMap = 16; + ASSERT_EQ(kCorrectSizeForEmptyMap, size); + + const int *entry_test; + ASSERT_FALSE(test_map->RetrieveRange(-1, entry_test)); + ASSERT_FALSE(test_map->RetrieveRange(0, entry_test)); + ASSERT_FALSE(test_map->RetrieveRange(10, entry_test)); +} + +TEST_F(TestStaticCRMMap, TestSingleElementMap) { + CRMMap crm_map; + // Test on one element: + int entry = 1; + crm_map.StoreRange(10, 10, entry); + + unsigned int size; + scoped_array serialized_data; + serialized_data.reset(serializer_.Serialize(&crm_map, &size)); + scoped_ptr test_map(new TestMap(serialized_data.get())); + + const unsigned int kCorrectSizeForSingleElementMap = 40; + ASSERT_EQ(kCorrectSizeForSingleElementMap, size); + + const int *entry_test; + ASSERT_FALSE(test_map->RetrieveRange(-1, entry_test)); + ASSERT_FALSE(test_map->RetrieveRange(0, entry_test)); + ASSERT_TRUE(test_map->RetrieveRange(10, entry_test)); + ASSERT_EQ(*entry_test, entry); + ASSERT_TRUE(test_map->RetrieveRange(13, entry_test)); + ASSERT_EQ(*entry_test, entry); +} + +TEST_F(TestStaticCRMMap, TestRetrieveRangeEntries) { + CRMMap crm_map; + + crm_map.StoreRange(2, 5, 0); + crm_map.StoreRange(2, 6, 1); + crm_map.StoreRange(2, 7, 2); + + unsigned int size; + scoped_array serialized_data; + serialized_data.reset(serializer_.Serialize(&crm_map, &size)); + scoped_ptr test_map(new TestMap(serialized_data.get())); + + std::vector entry_tests; + ASSERT_TRUE(test_map->RetrieveRanges(3, entry_tests)); + ASSERT_EQ(*entry_tests[0], 0); + ASSERT_EQ(*entry_tests[1], 1); + ASSERT_EQ(*entry_tests[2], 2); +} + +TEST_F(TestStaticCRMMap, RunTestData) { + unsigned int test_high = sizeof(test_data) / sizeof(test_data[0]); + + // Now, do the RetrieveRange tests. This further validates that the + // objects were stored properly and that retrieval returns the correct + // object. + // If GENERATE_TEST_DATA is defined, instead of the retrieval tests, a + // new test_data array will be printed. Exercise caution when doing this. + // Be sure to verify the results manually! +#ifdef GENERATE_TEST_DATA + printf(" const int test_data[] = {\n"); +#endif // GENERATE_TEST_DATA + + for (unsigned int address = 0; address < test_high; ++address) { + const int *entryptr; + int value = 0; + if (test_map_.RetrieveRange(address, entryptr)) + value = *entryptr; + +#ifndef GENERATE_TEST_DATA + // Don't use ASSERT inside the loop because it won't show the failed + // |address|, and the line number will always be the same. That makes + // it difficult to figure out which test failed. + EXPECT_EQ(value, test_data[address]) << "FAIL: retrieve address " + << address; +#else // !GENERATE_TEST_DATA + printf(" %d%c%s // %d\n", value, + address == test_high - 1 ? ' ' : ',', + value < 10 ? " " : "", + address); +#endif // !GENERATE_TEST_DATA + } + +#ifdef GENERATE_TEST_DATA + printf(" };\n"); +#endif // GENERATE_TEST_DATA +} + +} // namespace google_breakpad + +int main(int argc, char *argv[]) { + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/src/processor/static_map-inl.h b/src/processor/static_map-inl.h new file mode 100644 index 0000000..f9929ef --- /dev/null +++ b/src/processor/static_map-inl.h @@ -0,0 +1,176 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_map-inl.h: StaticMap implementation. +// +// See static_map.h for documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + + +#ifndef PROCESSOR_STATIC_MAP_INL_H__ +#define PROCESSOR_STATIC_MAP_INL_H__ + +#include "processor/static_map.h" +#include "processor/static_map_iterator-inl.h" +#include "processor/logging.h" + +namespace google_breakpad { + +template +StaticMap::StaticMap(const char* raw_data) + : raw_data_(raw_data), + compare_() { + // First 4 Bytes store the number of nodes. + num_nodes_ = *(reinterpret_cast(raw_data_)); + + offsets_ = reinterpret_cast( + raw_data_ + sizeof(num_nodes_)); + + keys_ = reinterpret_cast( + raw_data_ + (1 + num_nodes_) * sizeof(uint32_t)); +} + +// find(), lower_bound() and upper_bound() implement binary search algorithm. +template +StaticMapIterator +StaticMap::find(const Key& key) const { + int begin = 0; + int end = num_nodes_; + int middle; + int compare_result; + while (begin < end) { + middle = begin + (end - begin) / 2; + compare_result = compare_(key, GetKeyAtIndex(middle)); + if (compare_result == 0) + return IteratorAtIndex(middle); + if (compare_result < 0) { + end = middle; + } else { + begin = middle + 1; + } + } + return this->end(); +} + +template +StaticMapIterator +StaticMap::lower_bound(const Key& key) const { + int begin = 0; + int end = num_nodes_; + int middle; + int comp_result; + while (begin < end) { + middle = begin + (end - begin) / 2; + comp_result = compare_(key, GetKeyAtIndex(middle)); + if (comp_result == 0) + return IteratorAtIndex(middle); + if (comp_result < 0) { + end = middle; + } else { + begin = middle + 1; + } + } + return IteratorAtIndex(begin); +} + +template +StaticMapIterator +StaticMap::upper_bound(const Key& key) const { + int begin = 0; + int end = num_nodes_; + int middle; + int compare_result; + while (begin < end) { + middle = begin + (end - begin) / 2; + compare_result = compare_(key, GetKeyAtIndex(middle)); + if (compare_result == 0) + return IteratorAtIndex(middle + 1); + if (compare_result < 0) { + end = middle; + } else { + begin = middle + 1; + } + } + return IteratorAtIndex(begin); +} + +template +bool StaticMap::ValidateInMemoryStructure() const { + // check the number of nodes is non-negative: + if (!raw_data_) return false; + int32_t num_nodes = *(reinterpret_cast(raw_data_)); + if (num_nodes < 0) { + BPLOG(INFO) << "StaticMap check failed: negative number of nodes"; + return false; + } + + int node_index = 0; + if (num_nodes_) { + uint64_t first_offset = sizeof(int32_t) * (num_nodes_ + 1) + + sizeof(Key) * num_nodes_; + // Num_nodes_ is too large. + if (first_offset > 0xffffffffUL) { + BPLOG(INFO) << "StaticMap check failed: size exceeds limit"; + return false; + } + if (offsets_[node_index] != static_cast(first_offset)) { + BPLOG(INFO) << "StaticMap check failed: first node offset is incorrect"; + return false; + } + } + + for (node_index = 1; node_index < num_nodes_; ++node_index) { + // Check offsets[i] is strictly increasing: + if (offsets_[node_index] <= offsets_[node_index - 1]) { + BPLOG(INFO) << "StaticMap check failed: node offsets non-increasing"; + return false; + } + // Check Key[i] is strictly increasing as no duplicate keys are allowed. + if (compare_(GetKeyAtIndex(node_index), + GetKeyAtIndex(node_index - 1)) <= 0) { + BPLOG(INFO) << "StaticMap check failed: node keys non-increasing"; + return false; + } + } + return true; +} + +template +const Key StaticMap::GetKeyAtIndex(int index) const { + if (index < 0 || index >= num_nodes_) { + BPLOG(ERROR) << "Key index out of range error"; + // Key type is required to be primitive type. Return 0 if index is invalid. + return 0; + } + return keys_[index]; +} + +} // namespace google_breakpad + +#endif // PROCESSOR_STATIC_MAP_INL_H__ diff --git a/src/processor/static_map.h b/src/processor/static_map.h new file mode 100644 index 0000000..a8f4958 --- /dev/null +++ b/src/processor/static_map.h @@ -0,0 +1,144 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_map.h: StaticMap. +// +// StaticMap provides lookup interfaces and iterators similar as stl::map's. +// These lookup operations are purely Read-Only, thus memory +// allocation & deallocation is mostly avoided (intentionally). +// +// The chunk of memory should contain data with pre-defined pattern: +// **************** header *************** +// uint32 (4 bytes): number of nodes +// uint32 (4 bytes): address offset of node1's mapped_value +// uint32 (4 bytes): address offset of node2's mapped_value +// ... +// uint32 (4 bytes): address offset of nodeN's mapped_value +// +// ************* Key array ************ +// (X bytes): node1's key +// (X bytes): node2's key +// ... +// (X bytes): nodeN's key +// +// ************* Value array ********** +// (? bytes): node1's mapped_value +// (? bytes): node2's mapped_value +// ... +// (? bytes): nodeN's mapped_value +// +// REQUIREMENT: Key type MUST be primitive type or pointers so that: +// X = sizeof(typename Key); +// +// Note: since address offset is stored as uint32, user should keep in mind that +// StaticMap only supports up to 4GB size of memory data. + +// Author: Siyang Xie (lambxsy@google.com) + + +#ifndef PROCESSOR_STATIC_MAP_H__ +#define PROCESSOR_STATIC_MAP_H__ + +#include "processor/static_map_iterator-inl.h" + +namespace google_breakpad { + +// Default functor to compare keys. +template +class DefaultCompare { + public: + int operator()(const Key& k1, const Key& k2) const { + if (k1 < k2) return -1; + if (k1 == k2) return 0; + return 1; + } +}; + +template > +class StaticMap { + public: + typedef StaticMapIterator iterator; + typedef StaticMapIterator const_iterator; + + StaticMap() : raw_data_(0), + num_nodes_(0), + offsets_(0), + compare_() { } + + explicit StaticMap(const char* raw_data); + + inline bool empty() const { return num_nodes_ == 0; } + inline unsigned int size() const { return num_nodes_; } + + // Return iterators. + inline iterator begin() const { return IteratorAtIndex(0); } + inline iterator last() const { return IteratorAtIndex(num_nodes_ - 1); } + inline iterator end() const { return IteratorAtIndex(num_nodes_); } + inline iterator IteratorAtIndex(int index) const { + return iterator(raw_data_, index); + } + + // Lookup operations. + iterator find(const Key& k) const; + + // lower_bound(k) searches in a sorted range for the first element that has a + // key not less than the argument k. + iterator lower_bound(const Key& k) const; + + // upper_bound(k) searches in a sorted range for the first element that has a + // key greater than the argument k. + iterator upper_bound(const Key& k) const; + + // Checks if the underlying memory data conforms to the predefined pattern: + // first check the number of nodes is non-negative, + // then check both offsets and keys are strictly increasing (sorted). + bool ValidateInMemoryStructure() const; + + private: + const Key GetKeyAtIndex(int i) const; + + // Start address of a raw memory chunk with serialized data. + const char* raw_data_; + + // Number of nodes in the static map. + int32_t num_nodes_; + + // Array of offset addresses for stored values. + // For example: + // address_of_i-th_node_value = raw_data_ + offsets_[i] + const uint32_t* offsets_; + + // keys_[i] = key of i_th node + const Key* keys_; + + Compare compare_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_STATIC_MAP_H__ diff --git a/src/processor/static_map_iterator-inl.h b/src/processor/static_map_iterator-inl.h new file mode 100644 index 0000000..01a1b7f --- /dev/null +++ b/src/processor/static_map_iterator-inl.h @@ -0,0 +1,147 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_map_iterator-inl.h: StaticMapIterator implementation. +// +// See static_map_iterator.h for documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_STATIC_MAP_ITERATOR_INL_H__ +#define PROCESSOR_STATIC_MAP_ITERATOR_INL_H__ + +#include "processor/static_map_iterator.h" + +#include "processor/logging.h" + +namespace google_breakpad { + +template +StaticMapIterator::StaticMapIterator(const char* base, + const int& index): + index_(index), base_(base) { + // See static_map.h for documentation on + // bytes format of serialized StaticMap data. + num_nodes_ = *(reinterpret_cast(base_)); + offsets_ = reinterpret_cast(base_ + sizeof(num_nodes_)); + keys_ = reinterpret_cast( + base_ + (1 + num_nodes_) * sizeof(num_nodes_)); +} + +// Increment & Decrement operators: +template +StaticMapIterator& +StaticMapIterator::operator++() { + if (!IsValid()) { + BPLOG(ERROR) << "operator++ on invalid iterator"; + return *this; + } + if (++index_ > num_nodes_) index_ = num_nodes_; + return *this; +} + +template +StaticMapIterator +StaticMapIterator::operator++(int postfix_operator) { + if (!IsValid()) { + BPLOG(ERROR) << "operator++ on invalid iterator"; + return *this; + } + StaticMapIterator tmp = *this; + if (++index_ > num_nodes_) index_ = num_nodes_; + return tmp; +} + +template +StaticMapIterator& +StaticMapIterator::operator--() { + if (!IsValid()) { + BPLOG(ERROR) << "operator++ on invalid iterator"; + return *this; + } + + if (--index_ < 0) index_ = 0; + return *this; +} + +template +StaticMapIterator +StaticMapIterator::operator--(int postfix_operator) { + if (!IsValid()) { + BPLOG(ERROR) << "operator++ on invalid iterator"; + return *this; + } + StaticMapIterator tmp = *this; + + if (--index_ < 0) index_ = 0; + return tmp; +} + +template +const Key* StaticMapIterator::GetKeyPtr() const { + if (!IsValid()) { + BPLOG(ERROR) << "call GetKeyPtr() on invalid iterator"; + return NULL; + } + return &(keys_[index_]); +} + +template +const char* StaticMapIterator::GetValueRawPtr() const { + if (!IsValid()) { + BPLOG(ERROR) << "call GetValuePtr() on invalid iterator"; + return NULL; + } + return base_ + offsets_[index_]; +} + +template +bool StaticMapIterator::operator==( + const StaticMapIterator& x) const { + return base_ == x.base_ && index_ == x.index_; +} + +template +bool StaticMapIterator::operator!=( + const StaticMapIterator& x) const { + // Only need to compare base_ and index_. + // Other data members are auxiliary. + return base_ != x.base_ || index_ != x.index_; +} + +template +bool StaticMapIterator::IsValid() const { + if (!base_ || index_ < 0 || index_ > num_nodes_) + return false; + + return true; +} + +} // namespace google_breakpad + +#endif // PROCESSOR_STATIC_MAP_ITERATOR_INL_H__ diff --git a/src/processor/static_map_iterator.h b/src/processor/static_map_iterator.h new file mode 100644 index 0000000..6c190e9 --- /dev/null +++ b/src/processor/static_map_iterator.h @@ -0,0 +1,112 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_map_iterator.h: StaticMapIterator template class declaration. +// +// StaticMapIterator provides increment and decrement operators to iterate +// through a StaticMap map. It does not provide *, -> operators, user should +// use GetKeyPtr(), GetKey(), GetValuePtr() interfaces to retrieve data or +// pointer to data. StaticMapIterator is essentially a const_iterator. +// +// Author: Siyang Xie (lambxsy@google.com) + + +#ifndef PROCESSOR_STATIC_MAP_ITERATOR_H__ +#define PROCESSOR_STATIC_MAP_ITERATOR_H__ + +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +// Forward declaration. +template class StaticMap; + +// StaticMapIterator does not support operator*() or operator->(), +// User should use GetKey(), GetKeyPtr(), GetValuePtr() instead; +template +class StaticMapIterator { + public: + // Constructors. + StaticMapIterator(): index_(-1), base_(NULL) { } + + // Increment & Decrement operators: + StaticMapIterator& operator++(); + StaticMapIterator operator++(int post_fix_operator); + + StaticMapIterator& operator--(); + StaticMapIterator operator--(int post_fix_operator); + + // Interface for retrieving data / pointer to data. + const Key* GetKeyPtr() const; + + // Run time error will occur if GetKey() is called on an invalid iterator. + inline const Key GetKey() const { return *GetKeyPtr(); } + + // return a raw memory pointer that points to the start address of value. + const char* GetValueRawPtr() const; + + // return a reinterpret-casted pointer to the value. + inline const Value* GetValuePtr() const { + return reinterpret_cast(GetValueRawPtr()); + } + + bool operator==(const StaticMapIterator& x) const; + bool operator!=(const StaticMapIterator& x) const; + + // Check if this iterator is valid. + // If iterator is invalid, user is forbidden to use ++/-- operator + // or interfaces for retrieving data / pointer to data. + bool IsValid() const; + + private: + friend class StaticMap; + + // Only StaticMap can call this constructor. + explicit StaticMapIterator(const char* base, const int32_t& index); + + // Index of node that the iterator is pointing to. + int32_t index_; + + // Beginning address of the serialized map data. + const char* base_; + + // Number of nodes in the map. Use it to identify end() iterator. + int32_t num_nodes_; + + // offsets_ is an array of offset addresses of mapped values. + // For example: + // address_of_i-th_node_value = base_ + offsets_[i] + const uint32_t* offsets_; + + // keys_[i] = key of i_th node. + const Key* keys_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_STATIC_MAP_ITERATOR_H__ diff --git a/src/processor/static_map_unittest.cc b/src/processor/static_map_unittest.cc new file mode 100644 index 0000000..67b201b --- /dev/null +++ b/src/processor/static_map_unittest.cc @@ -0,0 +1,389 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_map_unittest.cc: Unit tests for StaticMap. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "processor/static_map-inl.h" + + +typedef int ValueType; +typedef int KeyType; +typedef google_breakpad::StaticMap< KeyType, ValueType > TestMap; +typedef std::map< KeyType, ValueType > StdMap; + +template +class SimpleMapSerializer { + public: + static char* Serialize(const std::map& stdmap, + unsigned int* size = NULL) { + unsigned int size_per_node = + sizeof(uint32_t) + sizeof(Key) + sizeof(Value); + unsigned int memsize = sizeof(int32_t) + size_per_node * stdmap.size(); + if (size) *size = memsize; + + // Allocate memory for serialized data: + char* mem = reinterpret_cast(operator new(memsize)); + char* address = mem; + + // Writer the number of nodes: + new (address) uint32_t(static_cast(stdmap.size())); + address += sizeof(uint32_t); + + // Nodes' offset: + uint32_t* offsets = reinterpret_cast(address); + address += sizeof(uint32_t) * stdmap.size(); + + // Keys: + Key* keys = reinterpret_cast(address); + address += sizeof(Key) * stdmap.size(); + + // Traversing map: + typename std::map::const_iterator iter = stdmap.begin(); + for (int index = 0; iter != stdmap.end(); ++iter, ++index) { + offsets[index] = static_cast(address - mem); + keys[index] = iter->first; + new (address) Value(iter->second); + address += sizeof(Value); + } + return mem; + } +}; + + +class TestInvalidMap : public ::testing::Test { + protected: + void SetUp() { + memset(data, 0, kMemorySize); + } + + // 40 Bytes memory can hold a StaticMap with up to 3 nodes. + static const int kMemorySize = 40; + char data[kMemorySize]; + TestMap test_map; +}; + +TEST_F(TestInvalidMap, TestNegativeNumberNodes) { + memset(data, 0xff, sizeof(uint32_t)); // Set the number of nodes = -1 + test_map = TestMap(data); + ASSERT_FALSE(test_map.ValidateInMemoryStructure()); +} + +TEST_F(TestInvalidMap, TestWrongOffsets) { + uint32_t* header = reinterpret_cast(data); + const uint32_t kNumNodes = 2; + const uint32_t kHeaderOffset = + sizeof(uint32_t) + kNumNodes * (sizeof(uint32_t) + sizeof(KeyType)); + + header[0] = kNumNodes; + header[1] = kHeaderOffset + 3; // Wrong offset for first node + test_map = TestMap(data); + ASSERT_FALSE(test_map.ValidateInMemoryStructure()); + + header[1] = kHeaderOffset; // Correct offset for first node + header[2] = kHeaderOffset - 1; // Wrong offset for second node + test_map = TestMap(data); + ASSERT_FALSE(test_map.ValidateInMemoryStructure()); +} + +TEST_F(TestInvalidMap, TestUnSortedKeys) { + uint32_t* header = reinterpret_cast(data); + const uint32_t kNumNodes = 2; + const uint32_t kHeaderOffset = + sizeof(uint32_t) + kNumNodes * (sizeof(uint32_t) + sizeof(KeyType)); + header[0] = kNumNodes; + header[1] = kHeaderOffset; + header[2] = kHeaderOffset + sizeof(ValueType); + + KeyType* keys = reinterpret_cast( + data + (kNumNodes + 1) * sizeof(uint32_t)); + // Set keys in non-increasing order. + keys[0] = 10; + keys[1] = 7; + test_map = TestMap(data); + ASSERT_FALSE(test_map.ValidateInMemoryStructure()); +} + + +class TestValidMap : public ::testing::Test { + protected: + void SetUp() { + int testcase = 0; + + // Empty map. + map_data[testcase] = + serializer.Serialize(std_map[testcase], &size[testcase]); + test_map[testcase] = TestMap(map_data[testcase]); + ++testcase; + + // Single element. + std_map[testcase].insert(std::make_pair(2, 8)); + map_data[testcase] = + serializer.Serialize(std_map[testcase], &size[testcase]); + test_map[testcase] = TestMap(map_data[testcase]); + ++testcase; + + // 100 elements. + for (int i = 0; i < 100; ++i) + std_map[testcase].insert(std::make_pair(i, 2 * i)); + map_data[testcase] = + serializer.Serialize(std_map[testcase], &size[testcase]); + test_map[testcase] = TestMap(map_data[testcase]); + ++testcase; + + // 1000 random elements. + for (int i = 0; i < 1000; ++i) + std_map[testcase].insert(std::make_pair(rand(), rand())); + map_data[testcase] = + serializer.Serialize(std_map[testcase], &size[testcase]); + test_map[testcase] = TestMap(map_data[testcase]); + + // Set correct size of memory allocation for each test case. + unsigned int size_per_node = + sizeof(uint32_t) + sizeof(KeyType) + sizeof(ValueType); + for (testcase = 0; testcase < kNumberTestCases; ++testcase) { + correct_size[testcase] = + sizeof(uint32_t) + std_map[testcase].size() * size_per_node; + } + } + + void TearDown() { + for (int i = 0;i < kNumberTestCases; ++i) + ::operator delete(map_data[i]); + } + + + void IteratorTester(int test_case) { + // scan through: + iter_test = test_map[test_case].begin(); + iter_std = std_map[test_case].begin(); + + for (; iter_test != test_map[test_case].end() && + iter_std != std_map[test_case].end(); + ++iter_test, ++iter_std) { + ASSERT_EQ(iter_test.GetKey(), iter_std->first); + ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second); + } + ASSERT_TRUE(iter_test == test_map[test_case].end() + && iter_std == std_map[test_case].end()); + + // Boundary testcase. + if (!std_map[test_case].empty()) { + // rear boundary case: + iter_test = test_map[test_case].end(); + iter_std = std_map[test_case].end(); + --iter_std; + --iter_test; + ASSERT_EQ(iter_test.GetKey(), iter_std->first); + ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second); + + ++iter_test; + ++iter_std; + ASSERT_TRUE(iter_test == test_map[test_case].end()); + + --iter_test; + --iter_std; + ASSERT_TRUE(iter_test != test_map[test_case].end()); + ASSERT_TRUE(iter_test == test_map[test_case].last()); + ASSERT_EQ(iter_test.GetKey(), iter_std->first); + ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second); + + // front boundary case: + iter_test = test_map[test_case].begin(); + --iter_test; + ASSERT_TRUE(iter_test == test_map[test_case].begin()); + } + } + + void CompareLookupResult(int test_case) { + bool found1 = (iter_test != test_map[test_case].end()); + bool found2 = (iter_std != std_map[test_case].end()); + ASSERT_EQ(found1, found2); + + if (found1 && found2) { + ASSERT_EQ(iter_test.GetKey(), iter_std->first); + ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second); + } + } + + void FindTester(int test_case, const KeyType& key) { + iter_test = test_map[test_case].find(key); + iter_std = std_map[test_case].find(key); + CompareLookupResult(test_case); + } + + void LowerBoundTester(int test_case, const KeyType& key) { + iter_test = test_map[test_case].lower_bound(key); + iter_std = std_map[test_case].lower_bound(key); + CompareLookupResult(test_case); + } + + void UpperBoundTester(int test_case, const KeyType& key) { + iter_test = test_map[test_case].upper_bound(key); + iter_std = std_map[test_case].upper_bound(key); + CompareLookupResult(test_case); + } + + void LookupTester(int test_case) { + StdMap::const_iterator iter; + // Test find(): + for (iter = std_map[test_case].begin(); + iter != std_map[test_case].end(); + ++iter) { + FindTester(test_case, iter->first); + FindTester(test_case, iter->first + 1); + FindTester(test_case, iter->first - 1); + } + FindTester(test_case, INT_MIN); + FindTester(test_case, INT_MAX); + // random test: + for (int i = 0; i < rand()%5000 + 5000; ++i) + FindTester(test_case, rand()); + + // Test lower_bound(): + for (iter = std_map[test_case].begin(); + iter != std_map[test_case].end(); + ++iter) { + LowerBoundTester(test_case, iter->first); + LowerBoundTester(test_case, iter->first + 1); + LowerBoundTester(test_case, iter->first - 1); + } + LowerBoundTester(test_case, INT_MIN); + LowerBoundTester(test_case, INT_MAX); + // random test: + for (int i = 0; i < rand()%5000 + 5000; ++i) + LowerBoundTester(test_case, rand()); + + // Test upper_bound(): + for (iter = std_map[test_case].begin(); + iter != std_map[test_case].end(); + ++iter) { + UpperBoundTester(test_case, iter->first); + UpperBoundTester(test_case, iter->first + 1); + UpperBoundTester(test_case, iter->first - 1); + } + UpperBoundTester(test_case, INT_MIN); + UpperBoundTester(test_case, INT_MAX); + // random test: + for (int i = 0; i < rand()%5000 + 5000; ++i) + UpperBoundTester(test_case, rand()); + } + + static const int kNumberTestCases = 4; + StdMap std_map[kNumberTestCases]; + TestMap test_map[kNumberTestCases]; + TestMap::const_iterator iter_test; + StdMap::const_iterator iter_std; + char* map_data[kNumberTestCases]; + unsigned int size[kNumberTestCases]; + unsigned int correct_size[kNumberTestCases]; + SimpleMapSerializer serializer; +}; + +TEST_F(TestValidMap, TestEmptyMap) { + int test_case = 0; + // Assert memory size allocated during serialization is correct. + ASSERT_EQ(correct_size[test_case], size[test_case]); + + // Sanity check of serialized data: + ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure()); + ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty()); + ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size()); + + // Test Iterator. + IteratorTester(test_case); + + // Test lookup operations. + LookupTester(test_case); +} + +TEST_F(TestValidMap, TestSingleElement) { + int test_case = 1; + // Assert memory size allocated during serialization is correct. + ASSERT_EQ(correct_size[test_case], size[test_case]); + + // Sanity check of serialized data: + ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure()); + ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty()); + ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size()); + + // Test Iterator. + IteratorTester(test_case); + + // Test lookup operations. + LookupTester(test_case); +} + +TEST_F(TestValidMap, Test100Elements) { + int test_case = 2; + // Assert memory size allocated during serialization is correct. + ASSERT_EQ(correct_size[test_case], size[test_case]); + + // Sanity check of serialized data: + ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure()); + ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty()); + ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size()); + + // Test Iterator. + IteratorTester(test_case); + + // Test lookup operations. + LookupTester(test_case); +} + +TEST_F(TestValidMap, Test1000RandomElements) { + int test_case = 3; + // Assert memory size allocated during serialization is correct. + ASSERT_EQ(correct_size[test_case], size[test_case]); + + // Sanity check of serialized data: + ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure()); + ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty()); + ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size()); + + // Test Iterator. + IteratorTester(test_case); + + // Test lookup operations. + LookupTester(test_case); +} + +int main(int argc, char *argv[]) { + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/src/processor/static_range_map-inl.h b/src/processor/static_range_map-inl.h new file mode 100644 index 0000000..b0a3274 --- /dev/null +++ b/src/processor/static_range_map-inl.h @@ -0,0 +1,129 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_range_map-inl.h: StaticRangeMap implementation. +// +// See static_range_map.h for documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_STATIC_RANGE_MAP_INL_H__ +#define PROCESSOR_STATIC_RANGE_MAP_INL_H__ + +#include "processor/static_range_map.h" +#include "processor/logging.h" + +namespace google_breakpad { + +template +bool StaticRangeMap::RetrieveRange( + const AddressType& address, const EntryType*& entry, + AddressType* entry_base, AddressType* entry_size) const { + MapConstIterator iterator = map_.lower_bound(address); + if (iterator == map_.end()) + return false; + + // The map is keyed by the high address of each range, so |address| is + // guaranteed to be lower than the range's high address. If |range| is + // not directly preceded by another range, it's possible for address to + // be below the range's low address, though. When that happens, address + // references something not within any range, so return false. + + const Range* range = iterator.GetValuePtr(); + + // Make sure AddressType and EntryType are copyable basic types + // e.g.: integer types, pointers etc + if (address < range->base()) + return false; + + entry = range->entryptr(); + if (entry_base) + *entry_base = range->base(); + if (entry_size) + *entry_size = iterator.GetKey() - range->base() + 1; + + return true; +} + + +template +bool StaticRangeMap::RetrieveNearestRange( + const AddressType& address, const EntryType*& entry, + AddressType* entry_base, AddressType* entry_size) const { + // If address is within a range, RetrieveRange can handle it. + if (RetrieveRange(address, entry, entry_base, entry_size)) + return true; + + // upper_bound gives the first element whose key is greater than address, + // but we want the first element whose key is less than or equal to address. + // Decrement the iterator to get there, but not if the upper_bound already + // points to the beginning of the map - in that case, address is lower than + // the lowest stored key, so return false. + + MapConstIterator iterator = map_.upper_bound(address); + if (iterator == map_.begin()) + return false; + --iterator; + + const Range* range = iterator.GetValuePtr(); + entry = range->entryptr(); + if (entry_base) + *entry_base = range->base(); + if (entry_size) + *entry_size = iterator.GetKey() - range->base() + 1; + + return true; +} + +template +bool StaticRangeMap::RetrieveRangeAtIndex( + int index, const EntryType*& entry, + AddressType* entry_base, AddressType* entry_size) const { + + if (index >= GetCount()) { + BPLOG(ERROR) << "Index out of range: " << index << "/" << GetCount(); + return false; + } + + MapConstIterator iterator = map_.IteratorAtIndex(index); + + const Range* range = iterator.GetValuePtr(); + + entry = range->entryptr(); + if (entry_base) + *entry_base = range->base(); + if (entry_size) + *entry_size = iterator.GetKey() - range->base() + 1; + + return true; +} + +} // namespace google_breakpad + + +#endif // PROCESSOR_STATIC_RANGE_MAP_INL_H__ diff --git a/src/processor/static_range_map.h b/src/processor/static_range_map.h new file mode 100644 index 0000000..319085d --- /dev/null +++ b/src/processor/static_range_map.h @@ -0,0 +1,105 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// static_range_map.h: StaticRangeMap. +// +// StaticRangeMap is similar as RangeMap. However, StaticRangeMap wraps a +// StaticMap instead of std::map, and does not support dynamic operations like +// StoreRange(...). StaticRangeMap provides same Retrieve*() interfaces as +// RangeMap. Please see range_map.h for more documentation. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifndef PROCESSOR_STATIC_RANGE_MAP_H__ +#define PROCESSOR_STATIC_RANGE_MAP_H__ + + +#include "processor/static_map-inl.h" + +namespace google_breakpad { + +// AddressType is basic type, e.g.: integer types, pointers etc +// EntryType could be a complex type, so we retrieve its pointer instead. +template +class StaticRangeMap { + public: + StaticRangeMap(): map_() { } + explicit StaticRangeMap(const char* memory): map_(memory) { } + + // Locates the range encompassing the supplied address. If there is + // no such range, returns false. entry_base and entry_size, if non-NULL, + // are set to the base and size of the entry's range. + bool RetrieveRange(const AddressType& address, const EntryType*& entry, + AddressType* entry_base, AddressType* entry_size) const; + + // Locates the range encompassing the supplied address, if one exists. + // If no range encompasses the supplied address, locates the nearest range + // to the supplied address that is lower than the address. Returns false + // if no range meets these criteria. entry_base and entry_size, if + // non-NULL, are set to the base and size of the entry's range. + bool RetrieveNearestRange(const AddressType& address, const EntryType*& entry, + AddressType* entry_base, AddressType* entry_size) + const; + + // Treating all ranges as a list ordered by the address spaces that they + // occupy, locates the range at the index specified by index. Returns + // false if index is larger than the number of ranges stored. entry_base + // and entry_size, if non-NULL, are set to the base and size of the entry's + // range. + // + // RetrieveRangeAtIndex is not optimized for speedy operation. + bool RetrieveRangeAtIndex(int index, const EntryType*& entry, + AddressType* entry_base, AddressType* entry_size) + const; + + // Returns the number of ranges stored in the RangeMap. + inline int GetCount() const { return map_.size(); } + + private: + friend class ModuleComparer; + class Range { + public: + AddressType base() const { + return *(reinterpret_cast(this)); + } + const EntryType* entryptr() const { + return reinterpret_cast(this + sizeof(AddressType)); + } + }; + + // Convenience types. + typedef StaticRangeMap* SelfPtr; + typedef StaticMap AddressToRangeMap; + typedef typename AddressToRangeMap::const_iterator MapConstIterator; + + AddressToRangeMap map_; +}; + +} // namespace google_breakpad + +#endif // PROCESSOR_STATIC_RANGE_MAP_H__ diff --git a/src/processor/static_range_map_unittest.cc b/src/processor/static_range_map_unittest.cc new file mode 100644 index 0000000..d4ddec0 --- /dev/null +++ b/src/processor/static_range_map_unittest.cc @@ -0,0 +1,424 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// static_range_map_unittest.cc: Unit tests for StaticRangeMap. +// +// Author: Siyang Xie (lambxsy@google.com) + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "breakpad_googletest_includes.h" +#include "common/scoped_ptr.h" +#include "processor/range_map-inl.h" +#include "processor/static_range_map-inl.h" +#include "processor/simple_serializer-inl.h" +#include "processor/map_serializers-inl.h" +#include "processor/logging.h" + + +namespace { +// Types used for testing. +typedef int AddressType; +typedef int EntryType; +typedef google_breakpad::StaticRangeMap< AddressType, EntryType > TestMap; +typedef google_breakpad::RangeMap< AddressType, EntryType > RMap; + +// RangeTest contains data to use for store and retrieve tests. See +// RunTests for descriptions of the tests. +struct RangeTest { + // Base address to use for test + AddressType address; + + // Size of range to use for test + AddressType size; + + // Unique ID of range - unstorable ranges must have unique IDs too + EntryType id; + + // Whether this range is expected to be stored successfully or not + bool expect_storable; +}; + +// A RangeTestSet encompasses multiple RangeTests, which are run in +// sequence on the same RangeMap. +struct RangeTestSet { + // An array of RangeTests + const RangeTest* range_tests; + + // The number of tests in the set + unsigned int range_test_count; +}; + +// These tests will be run sequentially. The first set of tests exercises +// most functions of RangeTest, and verifies all of the bounds-checking. +const RangeTest range_tests_0[] = { + { INT_MIN, 16, 1, true }, // lowest possible range + { -2, 5, 2, true }, // a range through zero + { INT_MAX - 9, 11, 3, false }, // tests anti-overflow + { INT_MAX - 9, 10, 4, true }, // highest possible range + { 5, 0, 5, false }, // tests anti-zero-size + { 5, 1, 6, true }, // smallest possible range + { -20, 15, 7, true }, // entirely negative + + { 10, 10, 10, true }, // causes the following tests to fail + { 9, 10, 11, false }, // one-less base, one-less high + { 9, 11, 12, false }, // one-less base, identical high + { 9, 12, 13, false }, // completely contains existing + { 10, 9, 14, false }, // identical base, one-less high + { 10, 10, 15, false }, // exactly identical to existing range + { 10, 11, 16, false }, // identical base, one-greater high + { 11, 8, 17, false }, // contained completely within + { 11, 9, 18, false }, // one-greater base, identical high + { 11, 10, 19, false }, // one-greater base, one-greater high + { 9, 2, 20, false }, // overlaps bottom by one + { 10, 1, 21, false }, // overlaps bottom by one, contained + { 19, 1, 22, false }, // overlaps top by one, contained + { 19, 2, 23, false }, // overlaps top by one + + { 9, 1, 24, true }, // directly below without overlap + { 20, 1, 25, true }, // directly above without overlap + + { 6, 3, 26, true }, // exactly between two ranges, gapless + { 7, 3, 27, false }, // tries to span two ranges + { 7, 5, 28, false }, // tries to span three ranges + { 4, 20, 29, false }, // tries to contain several ranges + + { 30, 50, 30, true }, + { 90, 25, 31, true }, + { 35, 65, 32, false }, // tries to span two noncontiguous + { 120, 10000, 33, true }, // > 8-bit + { 20000, 20000, 34, true }, // > 8-bit + { 0x10001, 0x10001, 35, true }, // > 16-bit + + { 27, -1, 36, false } // tests high < base +}; + +// Attempt to fill the entire space. The entire space must be filled with +// three stores because AddressType is signed for these tests, so RangeMap +// treats the size as signed and rejects sizes that appear to be negative. +// Even if these tests were run as unsigned, two stores would be needed +// to fill the space because the entire size of the space could only be +// described by using one more bit than would be present in AddressType. +const RangeTest range_tests_1[] = { + { INT_MIN, INT_MAX, 50, true }, // From INT_MIN to -2, inclusive + { -1, 2, 51, true }, // From -1 to 0, inclusive + { 1, INT_MAX, 52, true }, // From 1 to INT_MAX, inclusive + { INT_MIN, INT_MAX, 53, false }, // Can't fill the space twice + { -1, 2, 54, false }, + { 1, INT_MAX, 55, false }, + { -3, 6, 56, false }, // -3 to 2, inclusive - spans 3 ranges +}; + +// A light round of testing to verify that RetrieveRange does the right +// the right thing at the extremities of the range when nothing is stored +// there. Checks are forced without storing anything at the extremities +// by setting size = 0. +const RangeTest range_tests_2[] = { + { INT_MIN, 0, 100, false }, // makes RetrieveRange check low end + { -1, 3, 101, true }, + { INT_MAX, 0, 102, false }, // makes RetrieveRange check high end +}; + +// Similar to the previous test set, but with a couple of ranges closer +// to the extremities. +const RangeTest range_tests_3[] = { + { INT_MIN + 1, 1, 110, true }, + { INT_MAX - 1, 1, 111, true }, + { INT_MIN, 0, 112, false }, // makes RetrieveRange check low end + { INT_MAX, 0, 113, false } // makes RetrieveRange check high end +}; + +// The range map is cleared between sets of tests listed here. +const RangeTestSet range_test_sets[] = { + { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) }, + { range_tests_1, sizeof(range_tests_1) / sizeof(RangeTest) }, + { range_tests_2, sizeof(range_tests_2) / sizeof(RangeTest) }, + { range_tests_3, sizeof(range_tests_3) / sizeof(RangeTest) }, + { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) } // Run again +}; + +} // namespace + +namespace google_breakpad { +class TestStaticRangeMap : public ::testing::Test { + protected: + void SetUp() { + kTestCasesCount_ = sizeof(range_test_sets) / sizeof(RangeTestSet); + } + + // StoreTest uses the data in a RangeTest and calls StoreRange on the + // test RangeMap. It returns true if the expected result occurred, and + // false if something else happened. + void StoreTest(RMap* range_map, const RangeTest* range_test); + + // RetrieveTest uses the data in RangeTest and calls RetrieveRange on the + // test RangeMap. If it retrieves the expected value (which can be no + // map entry at the specified range,) it returns true, otherwise, it returns + // false. RetrieveTest will check the values around the base address and + // the high address of a range to guard against off-by-one errors. + void RetrieveTest(TestMap* range_map, const RangeTest* range_test); + + // Test RetrieveRangeAtIndex, which is supposed to return objects in order + // according to their addresses. This test is performed by looping through + // the map, calling RetrieveRangeAtIndex for all possible indices in sequence, + // and verifying that each call returns a different object than the previous + // call, and that ranges are returned with increasing base addresses. Returns + // false if the test fails. + void RetrieveIndexTest(const TestMap* range_map, int set); + + void RunTestCase(int test_case); + + unsigned int kTestCasesCount_; + RangeMapSerializer serializer_; +}; + +void TestStaticRangeMap::StoreTest(RMap* range_map, + const RangeTest* range_test) { + bool stored = range_map->StoreRange(range_test->address, + range_test->size, + range_test->id); + EXPECT_EQ(stored, range_test->expect_storable) + << "StoreRange id " << range_test->id << "FAILED"; +} + +void TestStaticRangeMap::RetrieveTest(TestMap* range_map, + const RangeTest* range_test) { + for (unsigned int side = 0; side <= 1; ++side) { + // When side == 0, check the low side (base address) of each range. + // When side == 1, check the high side (base + size) of each range. + + // Check one-less and one-greater than the target address in addition + // to the target address itself. + + // If the size of the range is only 1, don't check one greater than + // the base or one less than the high - for a successfully stored + // range, these tests would erroneously fail because the range is too + // small. + AddressType low_offset = -1; + AddressType high_offset = 1; + if (range_test->size == 1) { + if (!side) // When checking the low side, + high_offset = 0; // don't check one over the target. + else // When checking the high side, + low_offset = 0; // don't check one under the target. + } + + for (AddressType offset = low_offset; offset <= high_offset; ++offset) { + AddressType address = AddIgnoringOverflow( + offset, (!side ? range_test->address + : AddIgnoringOverflow(range_test->address, + range_test->size - 1))); + + bool expected_result = false; // This is correct for tests not stored. + if (range_test->expect_storable) { + if (offset == 0) // When checking the target address, + expected_result = true; // test should always succeed. + else if (offset == -1) // When checking one below the target, + expected_result = side; // should fail low and succeed high. + else // When checking one above the target, + expected_result = !side; // should succeed low and fail high. + } + + const EntryType* id; + AddressType retrieved_base; + AddressType retrieved_size; + bool retrieved = range_map->RetrieveRange(address, id, + &retrieved_base, + &retrieved_size); + + bool observed_result = retrieved && *id == range_test->id; + EXPECT_EQ(observed_result, expected_result) + << "RetrieveRange id " << range_test->id + << ", side " << side << ", offset " << offset << " FAILED."; + + // If a range was successfully retrieved, check that the returned + // bounds match the range as stored. + if (observed_result == true) { + EXPECT_EQ(retrieved_base, range_test->address) + << "RetrieveRange id " << range_test->id + << ", side " << side << ", offset " << offset << " FAILED."; + EXPECT_EQ(retrieved_size, range_test->size) + << "RetrieveRange id " << range_test->id + << ", side " << side << ", offset " << offset << " FAILED."; + } + + // Now, check RetrieveNearestRange. The nearest range is always + // expected to be different from the test range when checking one + // less than the low side. + bool expected_nearest = range_test->expect_storable; + if (!side && offset < 0) + expected_nearest = false; + + AddressType nearest_base; + AddressType nearest_size; + bool retrieved_nearest = range_map->RetrieveNearestRange(address, + id, + &nearest_base, + &nearest_size); + + // When checking one greater than the high side, RetrieveNearestRange + // should usually return the test range. When a different range begins + // at that address, though, then RetrieveNearestRange should return the + // range at the address instead of the test range. + if (side && offset > 0 && nearest_base == address) { + expected_nearest = false; + } + + bool observed_nearest = retrieved_nearest && + *id == range_test->id; + + EXPECT_EQ(observed_nearest, expected_nearest) + << "RetrieveRange id " << range_test->id + << ", side " << side << ", offset " << offset << " FAILED."; + + // If a range was successfully retrieved, check that the returned + // bounds match the range as stored. + if (expected_nearest ==true) { + EXPECT_EQ(nearest_base, range_test->address) + << "RetrieveRange id " << range_test->id + << ", side " << side << ", offset " << offset << " FAILED."; + EXPECT_EQ(nearest_size, range_test->size) + << "RetrieveRange id " << range_test->id + << ", side " << side << ", offset " << offset << " FAILED."; + } + } + } +} + +void TestStaticRangeMap::RetrieveIndexTest(const TestMap* range_map, int set) { + AddressType last_base = 0; + const EntryType* last_entry = 0; + const EntryType* entry; + int object_count = range_map->GetCount(); + for (int object_index = 0; object_index < object_count; ++object_index) { + AddressType base; + ASSERT_TRUE(range_map->RetrieveRangeAtIndex(object_index, + entry, + &base, + NULL)) + << "FAILED: RetrieveRangeAtIndex set " << set + << " index " << object_index; + + ASSERT_TRUE(entry) << "FAILED: RetrieveRangeAtIndex set " << set + << " index " << object_index; + + // It's impossible to do these comparisons unless there's a previous + // object to compare against. + if (last_entry) { + // The object must be different from the last_entry one. + EXPECT_NE(*entry, *last_entry) << "FAILED: RetrieveRangeAtIndex set " + << set << " index " << object_index; + // Each object must have a base greater than the previous object's base. + EXPECT_GT(base, last_base) << "FAILED: RetrieveRangeAtIndex set " << set + << " index " << object_index; + } + last_entry = entry; + last_base = base; + } + + // Make sure that RetrieveRangeAtIndex doesn't allow lookups at indices that + // are too high. + ASSERT_FALSE(range_map->RetrieveRangeAtIndex( + object_count, entry, NULL, NULL)) << "FAILED: RetrieveRangeAtIndex set " + << set << " index " << object_count + << " (too large)"; +} + +// RunTests runs a series of test sets. +void TestStaticRangeMap::RunTestCase(int test_case) { + // Maintain the range map in a pointer so that deletion can be meaningfully + // tested. + scoped_ptr rmap(new RMap()); + + const RangeTest* range_tests = range_test_sets[test_case].range_tests; + unsigned int range_test_count = range_test_sets[test_case].range_test_count; + + // Run the StoreRange test, which validates StoreRange and initializes + // the RangeMap with data for the RetrieveRange test. + int stored_count = 0; // The number of ranges successfully stored + for (unsigned int range_test_index = 0; + range_test_index < range_test_count; + ++range_test_index) { + const RangeTest* range_test = &range_tests[range_test_index]; + StoreTest(rmap.get(), range_test); + + if (range_test->expect_storable) + ++stored_count; + } + + scoped_array memaddr(serializer_.Serialize(*rmap, NULL)); + scoped_ptr static_range_map(new TestMap(memaddr.get())); + + // The RangeMap's own count of objects should also match. + EXPECT_EQ(static_range_map->GetCount(), stored_count); + + // Run the RetrieveRange test + for (unsigned int range_test_index = 0; + range_test_index < range_test_count; + ++range_test_index) { + const RangeTest* range_test = &range_tests[range_test_index]; + RetrieveTest(static_range_map.get(), range_test); + } + + RetrieveIndexTest(static_range_map.get(), test_case); +} + +TEST_F(TestStaticRangeMap, TestCase0) { + int test_case = 0; + RunTestCase(test_case); +} + +TEST_F(TestStaticRangeMap, TestCase1) { + int test_case = 1; + RunTestCase(test_case); +} + +TEST_F(TestStaticRangeMap, TestCase2) { + int test_case = 2; + RunTestCase(test_case); +} + +TEST_F(TestStaticRangeMap, TestCase3) { + int test_case = 3; + RunTestCase(test_case); +} + +TEST_F(TestStaticRangeMap, RunTestCase0Again) { + int test_case = 0; + RunTestCase(test_case); +} + +} // namespace google_breakpad + +int main(int argc, char* argv[]) { + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/src/processor/symbolic_constants_win.cc b/src/processor/symbolic_constants_win.cc new file mode 100644 index 0000000..98c2b4d --- /dev/null +++ b/src/processor/symbolic_constants_win.cc @@ -0,0 +1,6420 @@ +// Copyright 2015 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ntstatus_reason_win.h: Windows NTSTATUS code to string. +// +// Provides a means to convert NTSTATUS codes to strings. +// +// Author: Ben Wagner + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "common/stdio_wrapper.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_exception_win32.h" +#include "processor/symbolic_constants_win.h" + +namespace google_breakpad { + +string NTStatusToString(uint32_t ntstatus) { + string reason; + // The content of this switch was created from ntstatus.h in the 8.1 SDK with + // + // egrep '#define [A-Z_0-9]+\s+\(\(NTSTATUS\)0xC[0-9A-F]+L\)' ntstatus.h + // | tr -d '\r' + // | sed -r 's@#define ([A-Z_0-9]+)\s+\(\(NTSTATUS\)(0xC[0-9A-F]+)L\).*@\2 \1@' + // | sort + // | sed -r 's@(0xC[0-9A-F]+) ([A-Z_0-9]+)@ case MD_NTSTATUS_WIN_\2:\n reason = "\2";\n break;@' + // + // With easy copy to clipboard with + // | xclip -selection c # on linux + // | clip # on windows + // | pbcopy # on mac + // + // and then the default case added. + switch (ntstatus) { + case MD_NTSTATUS_WIN_STATUS_UNSUCCESSFUL: + reason = "STATUS_UNSUCCESSFUL"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_IMPLEMENTED: + reason = "STATUS_NOT_IMPLEMENTED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_INFO_CLASS: + reason = "STATUS_INVALID_INFO_CLASS"; + break; + case MD_NTSTATUS_WIN_STATUS_INFO_LENGTH_MISMATCH: + reason = "STATUS_INFO_LENGTH_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCESS_VIOLATION: + reason = "STATUS_ACCESS_VIOLATION"; + break; + case MD_NTSTATUS_WIN_STATUS_IN_PAGE_ERROR: + reason = "STATUS_IN_PAGE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_PAGEFILE_QUOTA: + reason = "STATUS_PAGEFILE_QUOTA"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_HANDLE: + reason = "STATUS_INVALID_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_INITIAL_STACK: + reason = "STATUS_BAD_INITIAL_STACK"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_INITIAL_PC: + reason = "STATUS_BAD_INITIAL_PC"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_CID: + reason = "STATUS_INVALID_CID"; + break; + case MD_NTSTATUS_WIN_STATUS_TIMER_NOT_CANCELED: + reason = "STATUS_TIMER_NOT_CANCELED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER: + reason = "STATUS_INVALID_PARAMETER"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SUCH_DEVICE: + reason = "STATUS_NO_SUCH_DEVICE"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SUCH_FILE: + reason = "STATUS_NO_SUCH_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_DEVICE_REQUEST: + reason = "STATUS_INVALID_DEVICE_REQUEST"; + break; + case MD_NTSTATUS_WIN_STATUS_END_OF_FILE: + reason = "STATUS_END_OF_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_WRONG_VOLUME: + reason = "STATUS_WRONG_VOLUME"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_MEDIA_IN_DEVICE: + reason = "STATUS_NO_MEDIA_IN_DEVICE"; + break; + case MD_NTSTATUS_WIN_STATUS_UNRECOGNIZED_MEDIA: + reason = "STATUS_UNRECOGNIZED_MEDIA"; + break; + case MD_NTSTATUS_WIN_STATUS_NONEXISTENT_SECTOR: + reason = "STATUS_NONEXISTENT_SECTOR"; + break; + case MD_NTSTATUS_WIN_STATUS_MORE_PROCESSING_REQUIRED: + reason = "STATUS_MORE_PROCESSING_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_MEMORY: + reason = "STATUS_NO_MEMORY"; + break; + case MD_NTSTATUS_WIN_STATUS_CONFLICTING_ADDRESSES: + reason = "STATUS_CONFLICTING_ADDRESSES"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_MAPPED_VIEW: + reason = "STATUS_NOT_MAPPED_VIEW"; + break; + case MD_NTSTATUS_WIN_STATUS_UNABLE_TO_FREE_VM: + reason = "STATUS_UNABLE_TO_FREE_VM"; + break; + case MD_NTSTATUS_WIN_STATUS_UNABLE_TO_DELETE_SECTION: + reason = "STATUS_UNABLE_TO_DELETE_SECTION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_SYSTEM_SERVICE: + reason = "STATUS_INVALID_SYSTEM_SERVICE"; + break; + case MD_NTSTATUS_WIN_STATUS_ILLEGAL_INSTRUCTION: + reason = "STATUS_ILLEGAL_INSTRUCTION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_LOCK_SEQUENCE: + reason = "STATUS_INVALID_LOCK_SEQUENCE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_VIEW_SIZE: + reason = "STATUS_INVALID_VIEW_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_FILE_FOR_SECTION: + reason = "STATUS_INVALID_FILE_FOR_SECTION"; + break; + case MD_NTSTATUS_WIN_STATUS_ALREADY_COMMITTED: + reason = "STATUS_ALREADY_COMMITTED"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCESS_DENIED: + reason = "STATUS_ACCESS_DENIED"; + break; + case MD_NTSTATUS_WIN_STATUS_BUFFER_TOO_SMALL: + reason = "STATUS_BUFFER_TOO_SMALL"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECT_TYPE_MISMATCH: + reason = "STATUS_OBJECT_TYPE_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_NONCONTINUABLE_EXCEPTION: + reason = "STATUS_NONCONTINUABLE_EXCEPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_DISPOSITION: + reason = "STATUS_INVALID_DISPOSITION"; + break; + case MD_NTSTATUS_WIN_STATUS_UNWIND: + reason = "STATUS_UNWIND"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_STACK: + reason = "STATUS_BAD_STACK"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_UNWIND_TARGET: + reason = "STATUS_INVALID_UNWIND_TARGET"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_LOCKED: + reason = "STATUS_NOT_LOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_PARITY_ERROR: + reason = "STATUS_PARITY_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_UNABLE_TO_DECOMMIT_VM: + reason = "STATUS_UNABLE_TO_DECOMMIT_VM"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_COMMITTED: + reason = "STATUS_NOT_COMMITTED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PORT_ATTRIBUTES: + reason = "STATUS_INVALID_PORT_ATTRIBUTES"; + break; + case MD_NTSTATUS_WIN_STATUS_PORT_MESSAGE_TOO_LONG: + reason = "STATUS_PORT_MESSAGE_TOO_LONG"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_MIX: + reason = "STATUS_INVALID_PARAMETER_MIX"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_QUOTA_LOWER: + reason = "STATUS_INVALID_QUOTA_LOWER"; + break; + case MD_NTSTATUS_WIN_STATUS_DISK_CORRUPT_ERROR: + reason = "STATUS_DISK_CORRUPT_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECT_NAME_INVALID: + reason = "STATUS_OBJECT_NAME_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECT_NAME_NOT_FOUND: + reason = "STATUS_OBJECT_NAME_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECT_NAME_COLLISION: + reason = "STATUS_OBJECT_NAME_COLLISION"; + break; + case MD_NTSTATUS_WIN_STATUS_PORT_DISCONNECTED: + reason = "STATUS_PORT_DISCONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_ALREADY_ATTACHED: + reason = "STATUS_DEVICE_ALREADY_ATTACHED"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECT_PATH_INVALID: + reason = "STATUS_OBJECT_PATH_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECT_PATH_NOT_FOUND: + reason = "STATUS_OBJECT_PATH_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECT_PATH_SYNTAX_BAD: + reason = "STATUS_OBJECT_PATH_SYNTAX_BAD"; + break; + case MD_NTSTATUS_WIN_STATUS_DATA_OVERRUN: + reason = "STATUS_DATA_OVERRUN"; + break; + case MD_NTSTATUS_WIN_STATUS_DATA_LATE_ERROR: + reason = "STATUS_DATA_LATE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_DATA_ERROR: + reason = "STATUS_DATA_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_CRC_ERROR: + reason = "STATUS_CRC_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_SECTION_TOO_BIG: + reason = "STATUS_SECTION_TOO_BIG"; + break; + case MD_NTSTATUS_WIN_STATUS_PORT_CONNECTION_REFUSED: + reason = "STATUS_PORT_CONNECTION_REFUSED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PORT_HANDLE: + reason = "STATUS_INVALID_PORT_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_SHARING_VIOLATION: + reason = "STATUS_SHARING_VIOLATION"; + break; + case MD_NTSTATUS_WIN_STATUS_QUOTA_EXCEEDED: + reason = "STATUS_QUOTA_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PAGE_PROTECTION: + reason = "STATUS_INVALID_PAGE_PROTECTION"; + break; + case MD_NTSTATUS_WIN_STATUS_MUTANT_NOT_OWNED: + reason = "STATUS_MUTANT_NOT_OWNED"; + break; + case MD_NTSTATUS_WIN_STATUS_SEMAPHORE_LIMIT_EXCEEDED: + reason = "STATUS_SEMAPHORE_LIMIT_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_PORT_ALREADY_SET: + reason = "STATUS_PORT_ALREADY_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_SECTION_NOT_IMAGE: + reason = "STATUS_SECTION_NOT_IMAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_SUSPEND_COUNT_EXCEEDED: + reason = "STATUS_SUSPEND_COUNT_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_THREAD_IS_TERMINATING: + reason = "STATUS_THREAD_IS_TERMINATING"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_WORKING_SET_LIMIT: + reason = "STATUS_BAD_WORKING_SET_LIMIT"; + break; + case MD_NTSTATUS_WIN_STATUS_INCOMPATIBLE_FILE_MAP: + reason = "STATUS_INCOMPATIBLE_FILE_MAP"; + break; + case MD_NTSTATUS_WIN_STATUS_SECTION_PROTECTION: + reason = "STATUS_SECTION_PROTECTION"; + break; + case MD_NTSTATUS_WIN_STATUS_EAS_NOT_SUPPORTED: + reason = "STATUS_EAS_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_EA_TOO_LARGE: + reason = "STATUS_EA_TOO_LARGE"; + break; + case MD_NTSTATUS_WIN_STATUS_NONEXISTENT_EA_ENTRY: + reason = "STATUS_NONEXISTENT_EA_ENTRY"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_EAS_ON_FILE: + reason = "STATUS_NO_EAS_ON_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_EA_CORRUPT_ERROR: + reason = "STATUS_EA_CORRUPT_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_LOCK_CONFLICT: + reason = "STATUS_FILE_LOCK_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_LOCK_NOT_GRANTED: + reason = "STATUS_LOCK_NOT_GRANTED"; + break; + case MD_NTSTATUS_WIN_STATUS_DELETE_PENDING: + reason = "STATUS_DELETE_PENDING"; + break; + case MD_NTSTATUS_WIN_STATUS_CTL_FILE_NOT_SUPPORTED: + reason = "STATUS_CTL_FILE_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_UNKNOWN_REVISION: + reason = "STATUS_UNKNOWN_REVISION"; + break; + case MD_NTSTATUS_WIN_STATUS_REVISION_MISMATCH: + reason = "STATUS_REVISION_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_OWNER: + reason = "STATUS_INVALID_OWNER"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PRIMARY_GROUP: + reason = "STATUS_INVALID_PRIMARY_GROUP"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_IMPERSONATION_TOKEN: + reason = "STATUS_NO_IMPERSONATION_TOKEN"; + break; + case MD_NTSTATUS_WIN_STATUS_CANT_DISABLE_MANDATORY: + reason = "STATUS_CANT_DISABLE_MANDATORY"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_LOGON_SERVERS: + reason = "STATUS_NO_LOGON_SERVERS"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SUCH_LOGON_SESSION: + reason = "STATUS_NO_SUCH_LOGON_SESSION"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SUCH_PRIVILEGE: + reason = "STATUS_NO_SUCH_PRIVILEGE"; + break; + case MD_NTSTATUS_WIN_STATUS_PRIVILEGE_NOT_HELD: + reason = "STATUS_PRIVILEGE_NOT_HELD"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_ACCOUNT_NAME: + reason = "STATUS_INVALID_ACCOUNT_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_USER_EXISTS: + reason = "STATUS_USER_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SUCH_USER: + reason = "STATUS_NO_SUCH_USER"; + break; + case MD_NTSTATUS_WIN_STATUS_GROUP_EXISTS: + reason = "STATUS_GROUP_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SUCH_GROUP: + reason = "STATUS_NO_SUCH_GROUP"; + break; + case MD_NTSTATUS_WIN_STATUS_MEMBER_IN_GROUP: + reason = "STATUS_MEMBER_IN_GROUP"; + break; + case MD_NTSTATUS_WIN_STATUS_MEMBER_NOT_IN_GROUP: + reason = "STATUS_MEMBER_NOT_IN_GROUP"; + break; + case MD_NTSTATUS_WIN_STATUS_LAST_ADMIN: + reason = "STATUS_LAST_ADMIN"; + break; + case MD_NTSTATUS_WIN_STATUS_WRONG_PASSWORD: + reason = "STATUS_WRONG_PASSWORD"; + break; + case MD_NTSTATUS_WIN_STATUS_ILL_FORMED_PASSWORD: + reason = "STATUS_ILL_FORMED_PASSWORD"; + break; + case MD_NTSTATUS_WIN_STATUS_PASSWORD_RESTRICTION: + reason = "STATUS_PASSWORD_RESTRICTION"; + break; + case MD_NTSTATUS_WIN_STATUS_LOGON_FAILURE: + reason = "STATUS_LOGON_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCOUNT_RESTRICTION: + reason = "STATUS_ACCOUNT_RESTRICTION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_LOGON_HOURS: + reason = "STATUS_INVALID_LOGON_HOURS"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_WORKSTATION: + reason = "STATUS_INVALID_WORKSTATION"; + break; + case MD_NTSTATUS_WIN_STATUS_PASSWORD_EXPIRED: + reason = "STATUS_PASSWORD_EXPIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCOUNT_DISABLED: + reason = "STATUS_ACCOUNT_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_NONE_MAPPED: + reason = "STATUS_NONE_MAPPED"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_LUIDS_REQUESTED: + reason = "STATUS_TOO_MANY_LUIDS_REQUESTED"; + break; + case MD_NTSTATUS_WIN_STATUS_LUIDS_EXHAUSTED: + reason = "STATUS_LUIDS_EXHAUSTED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_SUB_AUTHORITY: + reason = "STATUS_INVALID_SUB_AUTHORITY"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_ACL: + reason = "STATUS_INVALID_ACL"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_SID: + reason = "STATUS_INVALID_SID"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_SECURITY_DESCR: + reason = "STATUS_INVALID_SECURITY_DESCR"; + break; + case MD_NTSTATUS_WIN_STATUS_PROCEDURE_NOT_FOUND: + reason = "STATUS_PROCEDURE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_FORMAT: + reason = "STATUS_INVALID_IMAGE_FORMAT"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_TOKEN: + reason = "STATUS_NO_TOKEN"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_INHERITANCE_ACL: + reason = "STATUS_BAD_INHERITANCE_ACL"; + break; + case MD_NTSTATUS_WIN_STATUS_RANGE_NOT_LOCKED: + reason = "STATUS_RANGE_NOT_LOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_DISK_FULL: + reason = "STATUS_DISK_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_SERVER_DISABLED: + reason = "STATUS_SERVER_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_SERVER_NOT_DISABLED: + reason = "STATUS_SERVER_NOT_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_GUIDS_REQUESTED: + reason = "STATUS_TOO_MANY_GUIDS_REQUESTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GUIDS_EXHAUSTED: + reason = "STATUS_GUIDS_EXHAUSTED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_ID_AUTHORITY: + reason = "STATUS_INVALID_ID_AUTHORITY"; + break; + case MD_NTSTATUS_WIN_STATUS_AGENTS_EXHAUSTED: + reason = "STATUS_AGENTS_EXHAUSTED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_VOLUME_LABEL: + reason = "STATUS_INVALID_VOLUME_LABEL"; + break; + case MD_NTSTATUS_WIN_STATUS_SECTION_NOT_EXTENDED: + reason = "STATUS_SECTION_NOT_EXTENDED"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_MAPPED_DATA: + reason = "STATUS_NOT_MAPPED_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_RESOURCE_DATA_NOT_FOUND: + reason = "STATUS_RESOURCE_DATA_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_RESOURCE_TYPE_NOT_FOUND: + reason = "STATUS_RESOURCE_TYPE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_RESOURCE_NAME_NOT_FOUND: + reason = "STATUS_RESOURCE_NAME_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_ARRAY_BOUNDS_EXCEEDED: + reason = "STATUS_ARRAY_BOUNDS_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOAT_DENORMAL_OPERAND: + reason = "STATUS_FLOAT_DENORMAL_OPERAND"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOAT_DIVIDE_BY_ZERO: + reason = "STATUS_FLOAT_DIVIDE_BY_ZERO"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOAT_INEXACT_RESULT: + reason = "STATUS_FLOAT_INEXACT_RESULT"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOAT_INVALID_OPERATION: + reason = "STATUS_FLOAT_INVALID_OPERATION"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOAT_OVERFLOW: + reason = "STATUS_FLOAT_OVERFLOW"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOAT_STACK_CHECK: + reason = "STATUS_FLOAT_STACK_CHECK"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOAT_UNDERFLOW: + reason = "STATUS_FLOAT_UNDERFLOW"; + break; + case MD_NTSTATUS_WIN_STATUS_INTEGER_DIVIDE_BY_ZERO: + reason = "STATUS_INTEGER_DIVIDE_BY_ZERO"; + break; + case MD_NTSTATUS_WIN_STATUS_INTEGER_OVERFLOW: + reason = "STATUS_INTEGER_OVERFLOW"; + break; + case MD_NTSTATUS_WIN_STATUS_PRIVILEGED_INSTRUCTION: + reason = "STATUS_PRIVILEGED_INSTRUCTION"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_PAGING_FILES: + reason = "STATUS_TOO_MANY_PAGING_FILES"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_INVALID: + reason = "STATUS_FILE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_ALLOTTED_SPACE_EXCEEDED: + reason = "STATUS_ALLOTTED_SPACE_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_RESOURCES: + reason = "STATUS_INSUFFICIENT_RESOURCES"; + break; + case MD_NTSTATUS_WIN_STATUS_DFS_EXIT_PATH_FOUND: + reason = "STATUS_DFS_EXIT_PATH_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_DATA_ERROR: + reason = "STATUS_DEVICE_DATA_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_NOT_CONNECTED: + reason = "STATUS_DEVICE_NOT_CONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_POWER_FAILURE: + reason = "STATUS_DEVICE_POWER_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_FREE_VM_NOT_AT_BASE: + reason = "STATUS_FREE_VM_NOT_AT_BASE"; + break; + case MD_NTSTATUS_WIN_STATUS_MEMORY_NOT_ALLOCATED: + reason = "STATUS_MEMORY_NOT_ALLOCATED"; + break; + case MD_NTSTATUS_WIN_STATUS_WORKING_SET_QUOTA: + reason = "STATUS_WORKING_SET_QUOTA"; + break; + case MD_NTSTATUS_WIN_STATUS_MEDIA_WRITE_PROTECTED: + reason = "STATUS_MEDIA_WRITE_PROTECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_NOT_READY: + reason = "STATUS_DEVICE_NOT_READY"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_GROUP_ATTRIBUTES: + reason = "STATUS_INVALID_GROUP_ATTRIBUTES"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_IMPERSONATION_LEVEL: + reason = "STATUS_BAD_IMPERSONATION_LEVEL"; + break; + case MD_NTSTATUS_WIN_STATUS_CANT_OPEN_ANONYMOUS: + reason = "STATUS_CANT_OPEN_ANONYMOUS"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_VALIDATION_CLASS: + reason = "STATUS_BAD_VALIDATION_CLASS"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_TOKEN_TYPE: + reason = "STATUS_BAD_TOKEN_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_MASTER_BOOT_RECORD: + reason = "STATUS_BAD_MASTER_BOOT_RECORD"; + break; + case MD_NTSTATUS_WIN_STATUS_INSTRUCTION_MISALIGNMENT: + reason = "STATUS_INSTRUCTION_MISALIGNMENT"; + break; + case MD_NTSTATUS_WIN_STATUS_INSTANCE_NOT_AVAILABLE: + reason = "STATUS_INSTANCE_NOT_AVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_PIPE_NOT_AVAILABLE: + reason = "STATUS_PIPE_NOT_AVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PIPE_STATE: + reason = "STATUS_INVALID_PIPE_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_PIPE_BUSY: + reason = "STATUS_PIPE_BUSY"; + break; + case MD_NTSTATUS_WIN_STATUS_ILLEGAL_FUNCTION: + reason = "STATUS_ILLEGAL_FUNCTION"; + break; + case MD_NTSTATUS_WIN_STATUS_PIPE_DISCONNECTED: + reason = "STATUS_PIPE_DISCONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_PIPE_CLOSING: + reason = "STATUS_PIPE_CLOSING"; + break; + case MD_NTSTATUS_WIN_STATUS_PIPE_CONNECTED: + reason = "STATUS_PIPE_CONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_PIPE_LISTENING: + reason = "STATUS_PIPE_LISTENING"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_READ_MODE: + reason = "STATUS_INVALID_READ_MODE"; + break; + case MD_NTSTATUS_WIN_STATUS_IO_TIMEOUT: + reason = "STATUS_IO_TIMEOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_FORCED_CLOSED: + reason = "STATUS_FILE_FORCED_CLOSED"; + break; + case MD_NTSTATUS_WIN_STATUS_PROFILING_NOT_STARTED: + reason = "STATUS_PROFILING_NOT_STARTED"; + break; + case MD_NTSTATUS_WIN_STATUS_PROFILING_NOT_STOPPED: + reason = "STATUS_PROFILING_NOT_STOPPED"; + break; + case MD_NTSTATUS_WIN_STATUS_COULD_NOT_INTERPRET: + reason = "STATUS_COULD_NOT_INTERPRET"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_IS_A_DIRECTORY: + reason = "STATUS_FILE_IS_A_DIRECTORY"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_SUPPORTED: + reason = "STATUS_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_REMOTE_NOT_LISTENING: + reason = "STATUS_REMOTE_NOT_LISTENING"; + break; + case MD_NTSTATUS_WIN_STATUS_DUPLICATE_NAME: + reason = "STATUS_DUPLICATE_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_NETWORK_PATH: + reason = "STATUS_BAD_NETWORK_PATH"; + break; + case MD_NTSTATUS_WIN_STATUS_NETWORK_BUSY: + reason = "STATUS_NETWORK_BUSY"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_DOES_NOT_EXIST: + reason = "STATUS_DEVICE_DOES_NOT_EXIST"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_COMMANDS: + reason = "STATUS_TOO_MANY_COMMANDS"; + break; + case MD_NTSTATUS_WIN_STATUS_ADAPTER_HARDWARE_ERROR: + reason = "STATUS_ADAPTER_HARDWARE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_NETWORK_RESPONSE: + reason = "STATUS_INVALID_NETWORK_RESPONSE"; + break; + case MD_NTSTATUS_WIN_STATUS_UNEXPECTED_NETWORK_ERROR: + reason = "STATUS_UNEXPECTED_NETWORK_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_REMOTE_ADAPTER: + reason = "STATUS_BAD_REMOTE_ADAPTER"; + break; + case MD_NTSTATUS_WIN_STATUS_PRINT_QUEUE_FULL: + reason = "STATUS_PRINT_QUEUE_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SPOOL_SPACE: + reason = "STATUS_NO_SPOOL_SPACE"; + break; + case MD_NTSTATUS_WIN_STATUS_PRINT_CANCELLED: + reason = "STATUS_PRINT_CANCELLED"; + break; + case MD_NTSTATUS_WIN_STATUS_NETWORK_NAME_DELETED: + reason = "STATUS_NETWORK_NAME_DELETED"; + break; + case MD_NTSTATUS_WIN_STATUS_NETWORK_ACCESS_DENIED: + reason = "STATUS_NETWORK_ACCESS_DENIED"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_DEVICE_TYPE: + reason = "STATUS_BAD_DEVICE_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_NETWORK_NAME: + reason = "STATUS_BAD_NETWORK_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_NAMES: + reason = "STATUS_TOO_MANY_NAMES"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_SESSIONS: + reason = "STATUS_TOO_MANY_SESSIONS"; + break; + case MD_NTSTATUS_WIN_STATUS_SHARING_PAUSED: + reason = "STATUS_SHARING_PAUSED"; + break; + case MD_NTSTATUS_WIN_STATUS_REQUEST_NOT_ACCEPTED: + reason = "STATUS_REQUEST_NOT_ACCEPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_REDIRECTOR_PAUSED: + reason = "STATUS_REDIRECTOR_PAUSED"; + break; + case MD_NTSTATUS_WIN_STATUS_NET_WRITE_FAULT: + reason = "STATUS_NET_WRITE_FAULT"; + break; + case MD_NTSTATUS_WIN_STATUS_PROFILING_AT_LIMIT: + reason = "STATUS_PROFILING_AT_LIMIT"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_SAME_DEVICE: + reason = "STATUS_NOT_SAME_DEVICE"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_RENAMED: + reason = "STATUS_FILE_RENAMED"; + break; + case MD_NTSTATUS_WIN_STATUS_VIRTUAL_CIRCUIT_CLOSED: + reason = "STATUS_VIRTUAL_CIRCUIT_CLOSED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SECURITY_ON_OBJECT: + reason = "STATUS_NO_SECURITY_ON_OBJECT"; + break; + case MD_NTSTATUS_WIN_STATUS_CANT_WAIT: + reason = "STATUS_CANT_WAIT"; + break; + case MD_NTSTATUS_WIN_STATUS_PIPE_EMPTY: + reason = "STATUS_PIPE_EMPTY"; + break; + case MD_NTSTATUS_WIN_STATUS_CANT_ACCESS_DOMAIN_INFO: + reason = "STATUS_CANT_ACCESS_DOMAIN_INFO"; + break; + case MD_NTSTATUS_WIN_STATUS_CANT_TERMINATE_SELF: + reason = "STATUS_CANT_TERMINATE_SELF"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_SERVER_STATE: + reason = "STATUS_INVALID_SERVER_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_DOMAIN_STATE: + reason = "STATUS_INVALID_DOMAIN_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_DOMAIN_ROLE: + reason = "STATUS_INVALID_DOMAIN_ROLE"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SUCH_DOMAIN: + reason = "STATUS_NO_SUCH_DOMAIN"; + break; + case MD_NTSTATUS_WIN_STATUS_DOMAIN_EXISTS: + reason = "STATUS_DOMAIN_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_DOMAIN_LIMIT_EXCEEDED: + reason = "STATUS_DOMAIN_LIMIT_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_OPLOCK_NOT_GRANTED: + reason = "STATUS_OPLOCK_NOT_GRANTED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_OPLOCK_PROTOCOL: + reason = "STATUS_INVALID_OPLOCK_PROTOCOL"; + break; + case MD_NTSTATUS_WIN_STATUS_INTERNAL_DB_CORRUPTION: + reason = "STATUS_INTERNAL_DB_CORRUPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_INTERNAL_ERROR: + reason = "STATUS_INTERNAL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_GENERIC_NOT_MAPPED: + reason = "STATUS_GENERIC_NOT_MAPPED"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_DESCRIPTOR_FORMAT: + reason = "STATUS_BAD_DESCRIPTOR_FORMAT"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_USER_BUFFER: + reason = "STATUS_INVALID_USER_BUFFER"; + break; + case MD_NTSTATUS_WIN_STATUS_UNEXPECTED_IO_ERROR: + reason = "STATUS_UNEXPECTED_IO_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_UNEXPECTED_MM_CREATE_ERR: + reason = "STATUS_UNEXPECTED_MM_CREATE_ERR"; + break; + case MD_NTSTATUS_WIN_STATUS_UNEXPECTED_MM_MAP_ERROR: + reason = "STATUS_UNEXPECTED_MM_MAP_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_UNEXPECTED_MM_EXTEND_ERR: + reason = "STATUS_UNEXPECTED_MM_EXTEND_ERR"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_LOGON_PROCESS: + reason = "STATUS_NOT_LOGON_PROCESS"; + break; + case MD_NTSTATUS_WIN_STATUS_LOGON_SESSION_EXISTS: + reason = "STATUS_LOGON_SESSION_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_1: + reason = "STATUS_INVALID_PARAMETER_1"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_2: + reason = "STATUS_INVALID_PARAMETER_2"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_3: + reason = "STATUS_INVALID_PARAMETER_3"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_4: + reason = "STATUS_INVALID_PARAMETER_4"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_5: + reason = "STATUS_INVALID_PARAMETER_5"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_6: + reason = "STATUS_INVALID_PARAMETER_6"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_7: + reason = "STATUS_INVALID_PARAMETER_7"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_8: + reason = "STATUS_INVALID_PARAMETER_8"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_9: + reason = "STATUS_INVALID_PARAMETER_9"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_10: + reason = "STATUS_INVALID_PARAMETER_10"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_11: + reason = "STATUS_INVALID_PARAMETER_11"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_12: + reason = "STATUS_INVALID_PARAMETER_12"; + break; + case MD_NTSTATUS_WIN_STATUS_REDIRECTOR_NOT_STARTED: + reason = "STATUS_REDIRECTOR_NOT_STARTED"; + break; + case MD_NTSTATUS_WIN_STATUS_REDIRECTOR_STARTED: + reason = "STATUS_REDIRECTOR_STARTED"; + break; + case MD_NTSTATUS_WIN_STATUS_STACK_OVERFLOW: + reason = "STATUS_STACK_OVERFLOW"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SUCH_PACKAGE: + reason = "STATUS_NO_SUCH_PACKAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_FUNCTION_TABLE: + reason = "STATUS_BAD_FUNCTION_TABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_VARIABLE_NOT_FOUND: + reason = "STATUS_VARIABLE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_DIRECTORY_NOT_EMPTY: + reason = "STATUS_DIRECTORY_NOT_EMPTY"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_CORRUPT_ERROR: + reason = "STATUS_FILE_CORRUPT_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_A_DIRECTORY: + reason = "STATUS_NOT_A_DIRECTORY"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_LOGON_SESSION_STATE: + reason = "STATUS_BAD_LOGON_SESSION_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_LOGON_SESSION_COLLISION: + reason = "STATUS_LOGON_SESSION_COLLISION"; + break; + case MD_NTSTATUS_WIN_STATUS_NAME_TOO_LONG: + reason = "STATUS_NAME_TOO_LONG"; + break; + case MD_NTSTATUS_WIN_STATUS_FILES_OPEN: + reason = "STATUS_FILES_OPEN"; + break; + case MD_NTSTATUS_WIN_STATUS_CONNECTION_IN_USE: + reason = "STATUS_CONNECTION_IN_USE"; + break; + case MD_NTSTATUS_WIN_STATUS_MESSAGE_NOT_FOUND: + reason = "STATUS_MESSAGE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_PROCESS_IS_TERMINATING: + reason = "STATUS_PROCESS_IS_TERMINATING"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_LOGON_TYPE: + reason = "STATUS_INVALID_LOGON_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_GUID_TRANSLATION: + reason = "STATUS_NO_GUID_TRANSLATION"; + break; + case MD_NTSTATUS_WIN_STATUS_CANNOT_IMPERSONATE: + reason = "STATUS_CANNOT_IMPERSONATE"; + break; + case MD_NTSTATUS_WIN_STATUS_IMAGE_ALREADY_LOADED: + reason = "STATUS_IMAGE_ALREADY_LOADED"; + break; + case MD_NTSTATUS_WIN_STATUS_ABIOS_NOT_PRESENT: + reason = "STATUS_ABIOS_NOT_PRESENT"; + break; + case MD_NTSTATUS_WIN_STATUS_ABIOS_LID_NOT_EXIST: + reason = "STATUS_ABIOS_LID_NOT_EXIST"; + break; + case MD_NTSTATUS_WIN_STATUS_ABIOS_LID_ALREADY_OWNED: + reason = "STATUS_ABIOS_LID_ALREADY_OWNED"; + break; + case MD_NTSTATUS_WIN_STATUS_ABIOS_NOT_LID_OWNER: + reason = "STATUS_ABIOS_NOT_LID_OWNER"; + break; + case MD_NTSTATUS_WIN_STATUS_ABIOS_INVALID_COMMAND: + reason = "STATUS_ABIOS_INVALID_COMMAND"; + break; + case MD_NTSTATUS_WIN_STATUS_ABIOS_INVALID_LID: + reason = "STATUS_ABIOS_INVALID_LID"; + break; + case MD_NTSTATUS_WIN_STATUS_ABIOS_SELECTOR_NOT_AVAILABLE: + reason = "STATUS_ABIOS_SELECTOR_NOT_AVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_ABIOS_INVALID_SELECTOR: + reason = "STATUS_ABIOS_INVALID_SELECTOR"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_LDT: + reason = "STATUS_NO_LDT"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_LDT_SIZE: + reason = "STATUS_INVALID_LDT_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_LDT_OFFSET: + reason = "STATUS_INVALID_LDT_OFFSET"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_LDT_DESCRIPTOR: + reason = "STATUS_INVALID_LDT_DESCRIPTOR"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_NE_FORMAT: + reason = "STATUS_INVALID_IMAGE_NE_FORMAT"; + break; + case MD_NTSTATUS_WIN_STATUS_RXACT_INVALID_STATE: + reason = "STATUS_RXACT_INVALID_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_RXACT_COMMIT_FAILURE: + reason = "STATUS_RXACT_COMMIT_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_MAPPED_FILE_SIZE_ZERO: + reason = "STATUS_MAPPED_FILE_SIZE_ZERO"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_OPENED_FILES: + reason = "STATUS_TOO_MANY_OPENED_FILES"; + break; + case MD_NTSTATUS_WIN_STATUS_CANCELLED: + reason = "STATUS_CANCELLED"; + break; + case MD_NTSTATUS_WIN_STATUS_CANNOT_DELETE: + reason = "STATUS_CANNOT_DELETE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_COMPUTER_NAME: + reason = "STATUS_INVALID_COMPUTER_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_DELETED: + reason = "STATUS_FILE_DELETED"; + break; + case MD_NTSTATUS_WIN_STATUS_SPECIAL_ACCOUNT: + reason = "STATUS_SPECIAL_ACCOUNT"; + break; + case MD_NTSTATUS_WIN_STATUS_SPECIAL_GROUP: + reason = "STATUS_SPECIAL_GROUP"; + break; + case MD_NTSTATUS_WIN_STATUS_SPECIAL_USER: + reason = "STATUS_SPECIAL_USER"; + break; + case MD_NTSTATUS_WIN_STATUS_MEMBERS_PRIMARY_GROUP: + reason = "STATUS_MEMBERS_PRIMARY_GROUP"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_CLOSED: + reason = "STATUS_FILE_CLOSED"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_THREADS: + reason = "STATUS_TOO_MANY_THREADS"; + break; + case MD_NTSTATUS_WIN_STATUS_THREAD_NOT_IN_PROCESS: + reason = "STATUS_THREAD_NOT_IN_PROCESS"; + break; + case MD_NTSTATUS_WIN_STATUS_TOKEN_ALREADY_IN_USE: + reason = "STATUS_TOKEN_ALREADY_IN_USE"; + break; + case MD_NTSTATUS_WIN_STATUS_PAGEFILE_QUOTA_EXCEEDED: + reason = "STATUS_PAGEFILE_QUOTA_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_COMMITMENT_LIMIT: + reason = "STATUS_COMMITMENT_LIMIT"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_LE_FORMAT: + reason = "STATUS_INVALID_IMAGE_LE_FORMAT"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_NOT_MZ: + reason = "STATUS_INVALID_IMAGE_NOT_MZ"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_PROTECT: + reason = "STATUS_INVALID_IMAGE_PROTECT"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_WIN_16: + reason = "STATUS_INVALID_IMAGE_WIN_16"; + break; + case MD_NTSTATUS_WIN_STATUS_LOGON_SERVER_CONFLICT: + reason = "STATUS_LOGON_SERVER_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_TIME_DIFFERENCE_AT_DC: + reason = "STATUS_TIME_DIFFERENCE_AT_DC"; + break; + case MD_NTSTATUS_WIN_STATUS_SYNCHRONIZATION_REQUIRED: + reason = "STATUS_SYNCHRONIZATION_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_DLL_NOT_FOUND: + reason = "STATUS_DLL_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_OPEN_FAILED: + reason = "STATUS_OPEN_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_IO_PRIVILEGE_FAILED: + reason = "STATUS_IO_PRIVILEGE_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_ORDINAL_NOT_FOUND: + reason = "STATUS_ORDINAL_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_ENTRYPOINT_NOT_FOUND: + reason = "STATUS_ENTRYPOINT_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_CONTROL_C_EXIT: + reason = "STATUS_CONTROL_C_EXIT"; + break; + case MD_NTSTATUS_WIN_STATUS_LOCAL_DISCONNECT: + reason = "STATUS_LOCAL_DISCONNECT"; + break; + case MD_NTSTATUS_WIN_STATUS_REMOTE_DISCONNECT: + reason = "STATUS_REMOTE_DISCONNECT"; + break; + case MD_NTSTATUS_WIN_STATUS_REMOTE_RESOURCES: + reason = "STATUS_REMOTE_RESOURCES"; + break; + case MD_NTSTATUS_WIN_STATUS_LINK_FAILED: + reason = "STATUS_LINK_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_LINK_TIMEOUT: + reason = "STATUS_LINK_TIMEOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_CONNECTION: + reason = "STATUS_INVALID_CONNECTION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_ADDRESS: + reason = "STATUS_INVALID_ADDRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_DLL_INIT_FAILED: + reason = "STATUS_DLL_INIT_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_MISSING_SYSTEMFILE: + reason = "STATUS_MISSING_SYSTEMFILE"; + break; + case MD_NTSTATUS_WIN_STATUS_UNHANDLED_EXCEPTION: + reason = "STATUS_UNHANDLED_EXCEPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_APP_INIT_FAILURE: + reason = "STATUS_APP_INIT_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_PAGEFILE_CREATE_FAILED: + reason = "STATUS_PAGEFILE_CREATE_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_PAGEFILE: + reason = "STATUS_NO_PAGEFILE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_LEVEL: + reason = "STATUS_INVALID_LEVEL"; + break; + case MD_NTSTATUS_WIN_STATUS_WRONG_PASSWORD_CORE: + reason = "STATUS_WRONG_PASSWORD_CORE"; + break; + case MD_NTSTATUS_WIN_STATUS_ILLEGAL_FLOAT_CONTEXT: + reason = "STATUS_ILLEGAL_FLOAT_CONTEXT"; + break; + case MD_NTSTATUS_WIN_STATUS_PIPE_BROKEN: + reason = "STATUS_PIPE_BROKEN"; + break; + case MD_NTSTATUS_WIN_STATUS_REGISTRY_CORRUPT: + reason = "STATUS_REGISTRY_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_REGISTRY_IO_FAILED: + reason = "STATUS_REGISTRY_IO_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_EVENT_PAIR: + reason = "STATUS_NO_EVENT_PAIR"; + break; + case MD_NTSTATUS_WIN_STATUS_UNRECOGNIZED_VOLUME: + reason = "STATUS_UNRECOGNIZED_VOLUME"; + break; + case MD_NTSTATUS_WIN_STATUS_SERIAL_NO_DEVICE_INITED: + reason = "STATUS_SERIAL_NO_DEVICE_INITED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SUCH_ALIAS: + reason = "STATUS_NO_SUCH_ALIAS"; + break; + case MD_NTSTATUS_WIN_STATUS_MEMBER_NOT_IN_ALIAS: + reason = "STATUS_MEMBER_NOT_IN_ALIAS"; + break; + case MD_NTSTATUS_WIN_STATUS_MEMBER_IN_ALIAS: + reason = "STATUS_MEMBER_IN_ALIAS"; + break; + case MD_NTSTATUS_WIN_STATUS_ALIAS_EXISTS: + reason = "STATUS_ALIAS_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_LOGON_NOT_GRANTED: + reason = "STATUS_LOGON_NOT_GRANTED"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_SECRETS: + reason = "STATUS_TOO_MANY_SECRETS"; + break; + case MD_NTSTATUS_WIN_STATUS_SECRET_TOO_LONG: + reason = "STATUS_SECRET_TOO_LONG"; + break; + case MD_NTSTATUS_WIN_STATUS_INTERNAL_DB_ERROR: + reason = "STATUS_INTERNAL_DB_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_FULLSCREEN_MODE: + reason = "STATUS_FULLSCREEN_MODE"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_CONTEXT_IDS: + reason = "STATUS_TOO_MANY_CONTEXT_IDS"; + break; + case MD_NTSTATUS_WIN_STATUS_LOGON_TYPE_NOT_GRANTED: + reason = "STATUS_LOGON_TYPE_NOT_GRANTED"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_REGISTRY_FILE: + reason = "STATUS_NOT_REGISTRY_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_NT_CROSS_ENCRYPTION_REQUIRED: + reason = "STATUS_NT_CROSS_ENCRYPTION_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_DOMAIN_CTRLR_CONFIG_ERROR: + reason = "STATUS_DOMAIN_CTRLR_CONFIG_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_FT_MISSING_MEMBER: + reason = "STATUS_FT_MISSING_MEMBER"; + break; + case MD_NTSTATUS_WIN_STATUS_ILL_FORMED_SERVICE_ENTRY: + reason = "STATUS_ILL_FORMED_SERVICE_ENTRY"; + break; + case MD_NTSTATUS_WIN_STATUS_ILLEGAL_CHARACTER: + reason = "STATUS_ILLEGAL_CHARACTER"; + break; + case MD_NTSTATUS_WIN_STATUS_UNMAPPABLE_CHARACTER: + reason = "STATUS_UNMAPPABLE_CHARACTER"; + break; + case MD_NTSTATUS_WIN_STATUS_UNDEFINED_CHARACTER: + reason = "STATUS_UNDEFINED_CHARACTER"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOPPY_VOLUME: + reason = "STATUS_FLOPPY_VOLUME"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOPPY_ID_MARK_NOT_FOUND: + reason = "STATUS_FLOPPY_ID_MARK_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOPPY_WRONG_CYLINDER: + reason = "STATUS_FLOPPY_WRONG_CYLINDER"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOPPY_UNKNOWN_ERROR: + reason = "STATUS_FLOPPY_UNKNOWN_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOPPY_BAD_REGISTERS: + reason = "STATUS_FLOPPY_BAD_REGISTERS"; + break; + case MD_NTSTATUS_WIN_STATUS_DISK_RECALIBRATE_FAILED: + reason = "STATUS_DISK_RECALIBRATE_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_DISK_OPERATION_FAILED: + reason = "STATUS_DISK_OPERATION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_DISK_RESET_FAILED: + reason = "STATUS_DISK_RESET_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_SHARED_IRQ_BUSY: + reason = "STATUS_SHARED_IRQ_BUSY"; + break; + case MD_NTSTATUS_WIN_STATUS_FT_ORPHANING: + reason = "STATUS_FT_ORPHANING"; + break; + case MD_NTSTATUS_WIN_STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT: + reason = "STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_PARTITION_FAILURE: + reason = "STATUS_PARTITION_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_BLOCK_LENGTH: + reason = "STATUS_INVALID_BLOCK_LENGTH"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_NOT_PARTITIONED: + reason = "STATUS_DEVICE_NOT_PARTITIONED"; + break; + case MD_NTSTATUS_WIN_STATUS_UNABLE_TO_LOCK_MEDIA: + reason = "STATUS_UNABLE_TO_LOCK_MEDIA"; + break; + case MD_NTSTATUS_WIN_STATUS_UNABLE_TO_UNLOAD_MEDIA: + reason = "STATUS_UNABLE_TO_UNLOAD_MEDIA"; + break; + case MD_NTSTATUS_WIN_STATUS_EOM_OVERFLOW: + reason = "STATUS_EOM_OVERFLOW"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_MEDIA: + reason = "STATUS_NO_MEDIA"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SUCH_MEMBER: + reason = "STATUS_NO_SUCH_MEMBER"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_MEMBER: + reason = "STATUS_INVALID_MEMBER"; + break; + case MD_NTSTATUS_WIN_STATUS_KEY_DELETED: + reason = "STATUS_KEY_DELETED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_LOG_SPACE: + reason = "STATUS_NO_LOG_SPACE"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_SIDS: + reason = "STATUS_TOO_MANY_SIDS"; + break; + case MD_NTSTATUS_WIN_STATUS_LM_CROSS_ENCRYPTION_REQUIRED: + reason = "STATUS_LM_CROSS_ENCRYPTION_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_KEY_HAS_CHILDREN: + reason = "STATUS_KEY_HAS_CHILDREN"; + break; + case MD_NTSTATUS_WIN_STATUS_CHILD_MUST_BE_VOLATILE: + reason = "STATUS_CHILD_MUST_BE_VOLATILE"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_CONFIGURATION_ERROR: + reason = "STATUS_DEVICE_CONFIGURATION_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_INTERNAL_ERROR: + reason = "STATUS_DRIVER_INTERNAL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_DEVICE_STATE: + reason = "STATUS_INVALID_DEVICE_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_IO_DEVICE_ERROR: + reason = "STATUS_IO_DEVICE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_PROTOCOL_ERROR: + reason = "STATUS_DEVICE_PROTOCOL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_BACKUP_CONTROLLER: + reason = "STATUS_BACKUP_CONTROLLER"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_FILE_FULL: + reason = "STATUS_LOG_FILE_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_LATE: + reason = "STATUS_TOO_LATE"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_TRUST_LSA_SECRET: + reason = "STATUS_NO_TRUST_LSA_SECRET"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_TRUST_SAM_ACCOUNT: + reason = "STATUS_NO_TRUST_SAM_ACCOUNT"; + break; + case MD_NTSTATUS_WIN_STATUS_TRUSTED_DOMAIN_FAILURE: + reason = "STATUS_TRUSTED_DOMAIN_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_TRUSTED_RELATIONSHIP_FAILURE: + reason = "STATUS_TRUSTED_RELATIONSHIP_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_EVENTLOG_FILE_CORRUPT: + reason = "STATUS_EVENTLOG_FILE_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_EVENTLOG_CANT_START: + reason = "STATUS_EVENTLOG_CANT_START"; + break; + case MD_NTSTATUS_WIN_STATUS_TRUST_FAILURE: + reason = "STATUS_TRUST_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_MUTANT_LIMIT_EXCEEDED: + reason = "STATUS_MUTANT_LIMIT_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_NETLOGON_NOT_STARTED: + reason = "STATUS_NETLOGON_NOT_STARTED"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCOUNT_EXPIRED: + reason = "STATUS_ACCOUNT_EXPIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_POSSIBLE_DEADLOCK: + reason = "STATUS_POSSIBLE_DEADLOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_NETWORK_CREDENTIAL_CONFLICT: + reason = "STATUS_NETWORK_CREDENTIAL_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_REMOTE_SESSION_LIMIT: + reason = "STATUS_REMOTE_SESSION_LIMIT"; + break; + case MD_NTSTATUS_WIN_STATUS_EVENTLOG_FILE_CHANGED: + reason = "STATUS_EVENTLOG_FILE_CHANGED"; + break; + case MD_NTSTATUS_WIN_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT: + reason = "STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT"; + break; + case MD_NTSTATUS_WIN_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT: + reason = "STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT"; + break; + case MD_NTSTATUS_WIN_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT: + reason = "STATUS_NOLOGON_SERVER_TRUST_ACCOUNT"; + break; + case MD_NTSTATUS_WIN_STATUS_DOMAIN_TRUST_INCONSISTENT: + reason = "STATUS_DOMAIN_TRUST_INCONSISTENT"; + break; + case MD_NTSTATUS_WIN_STATUS_FS_DRIVER_REQUIRED: + reason = "STATUS_FS_DRIVER_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_IMAGE_ALREADY_LOADED_AS_DLL: + reason = "STATUS_IMAGE_ALREADY_LOADED_AS_DLL"; + break; + case MD_NTSTATUS_WIN_STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING: + reason = "STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING"; + break; + case MD_NTSTATUS_WIN_STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME: + reason = "STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME"; + break; + case MD_NTSTATUS_WIN_STATUS_SECURITY_STREAM_IS_INCONSISTENT: + reason = "STATUS_SECURITY_STREAM_IS_INCONSISTENT"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_LOCK_RANGE: + reason = "STATUS_INVALID_LOCK_RANGE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_ACE_CONDITION: + reason = "STATUS_INVALID_ACE_CONDITION"; + break; + case MD_NTSTATUS_WIN_STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT: + reason = "STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT"; + break; + case MD_NTSTATUS_WIN_STATUS_NOTIFICATION_GUID_ALREADY_DEFINED: + reason = "STATUS_NOTIFICATION_GUID_ALREADY_DEFINED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_EXCEPTION_HANDLER: + reason = "STATUS_INVALID_EXCEPTION_HANDLER"; + break; + case MD_NTSTATUS_WIN_STATUS_DUPLICATE_PRIVILEGES: + reason = "STATUS_DUPLICATE_PRIVILEGES"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_ALLOWED_ON_SYSTEM_FILE: + reason = "STATUS_NOT_ALLOWED_ON_SYSTEM_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_REPAIR_NEEDED: + reason = "STATUS_REPAIR_NEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_QUOTA_NOT_ENABLED: + reason = "STATUS_QUOTA_NOT_ENABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_APPLICATION_PACKAGE: + reason = "STATUS_NO_APPLICATION_PACKAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_NETWORK_OPEN_RESTRICTION: + reason = "STATUS_NETWORK_OPEN_RESTRICTION"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_USER_SESSION_KEY: + reason = "STATUS_NO_USER_SESSION_KEY"; + break; + case MD_NTSTATUS_WIN_STATUS_USER_SESSION_DELETED: + reason = "STATUS_USER_SESSION_DELETED"; + break; + case MD_NTSTATUS_WIN_STATUS_RESOURCE_LANG_NOT_FOUND: + reason = "STATUS_RESOURCE_LANG_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_INSUFF_SERVER_RESOURCES: + reason = "STATUS_INSUFF_SERVER_RESOURCES"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_BUFFER_SIZE: + reason = "STATUS_INVALID_BUFFER_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_ADDRESS_COMPONENT: + reason = "STATUS_INVALID_ADDRESS_COMPONENT"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_ADDRESS_WILDCARD: + reason = "STATUS_INVALID_ADDRESS_WILDCARD"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_ADDRESSES: + reason = "STATUS_TOO_MANY_ADDRESSES"; + break; + case MD_NTSTATUS_WIN_STATUS_ADDRESS_ALREADY_EXISTS: + reason = "STATUS_ADDRESS_ALREADY_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_ADDRESS_CLOSED: + reason = "STATUS_ADDRESS_CLOSED"; + break; + case MD_NTSTATUS_WIN_STATUS_CONNECTION_DISCONNECTED: + reason = "STATUS_CONNECTION_DISCONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_CONNECTION_RESET: + reason = "STATUS_CONNECTION_RESET"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_NODES: + reason = "STATUS_TOO_MANY_NODES"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_ABORTED: + reason = "STATUS_TRANSACTION_ABORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_TIMED_OUT: + reason = "STATUS_TRANSACTION_TIMED_OUT"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_NO_RELEASE: + reason = "STATUS_TRANSACTION_NO_RELEASE"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_NO_MATCH: + reason = "STATUS_TRANSACTION_NO_MATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_RESPONDED: + reason = "STATUS_TRANSACTION_RESPONDED"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_INVALID_ID: + reason = "STATUS_TRANSACTION_INVALID_ID"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_INVALID_TYPE: + reason = "STATUS_TRANSACTION_INVALID_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_SERVER_SESSION: + reason = "STATUS_NOT_SERVER_SESSION"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_CLIENT_SESSION: + reason = "STATUS_NOT_CLIENT_SESSION"; + break; + case MD_NTSTATUS_WIN_STATUS_CANNOT_LOAD_REGISTRY_FILE: + reason = "STATUS_CANNOT_LOAD_REGISTRY_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_DEBUG_ATTACH_FAILED: + reason = "STATUS_DEBUG_ATTACH_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_SYSTEM_PROCESS_TERMINATED: + reason = "STATUS_SYSTEM_PROCESS_TERMINATED"; + break; + case MD_NTSTATUS_WIN_STATUS_DATA_NOT_ACCEPTED: + reason = "STATUS_DATA_NOT_ACCEPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_BROWSER_SERVERS_FOUND: + reason = "STATUS_NO_BROWSER_SERVERS_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_VDM_HARD_ERROR: + reason = "STATUS_VDM_HARD_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_CANCEL_TIMEOUT: + reason = "STATUS_DRIVER_CANCEL_TIMEOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_REPLY_MESSAGE_MISMATCH: + reason = "STATUS_REPLY_MESSAGE_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_MAPPED_ALIGNMENT: + reason = "STATUS_MAPPED_ALIGNMENT"; + break; + case MD_NTSTATUS_WIN_STATUS_IMAGE_CHECKSUM_MISMATCH: + reason = "STATUS_IMAGE_CHECKSUM_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA: + reason = "STATUS_LOST_WRITEBEHIND_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_CLIENT_SERVER_PARAMETERS_INVALID: + reason = "STATUS_CLIENT_SERVER_PARAMETERS_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_PASSWORD_MUST_CHANGE: + reason = "STATUS_PASSWORD_MUST_CHANGE"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_FOUND: + reason = "STATUS_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_TINY_STREAM: + reason = "STATUS_NOT_TINY_STREAM"; + break; + case MD_NTSTATUS_WIN_STATUS_RECOVERY_FAILURE: + reason = "STATUS_RECOVERY_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_STACK_OVERFLOW_READ: + reason = "STATUS_STACK_OVERFLOW_READ"; + break; + case MD_NTSTATUS_WIN_STATUS_FAIL_CHECK: + reason = "STATUS_FAIL_CHECK"; + break; + case MD_NTSTATUS_WIN_STATUS_DUPLICATE_OBJECTID: + reason = "STATUS_DUPLICATE_OBJECTID"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECTID_EXISTS: + reason = "STATUS_OBJECTID_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_CONVERT_TO_LARGE: + reason = "STATUS_CONVERT_TO_LARGE"; + break; + case MD_NTSTATUS_WIN_STATUS_RETRY: + reason = "STATUS_RETRY"; + break; + case MD_NTSTATUS_WIN_STATUS_FOUND_OUT_OF_SCOPE: + reason = "STATUS_FOUND_OUT_OF_SCOPE"; + break; + case MD_NTSTATUS_WIN_STATUS_ALLOCATE_BUCKET: + reason = "STATUS_ALLOCATE_BUCKET"; + break; + case MD_NTSTATUS_WIN_STATUS_PROPSET_NOT_FOUND: + reason = "STATUS_PROPSET_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_MARSHALL_OVERFLOW: + reason = "STATUS_MARSHALL_OVERFLOW"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_VARIANT: + reason = "STATUS_INVALID_VARIANT"; + break; + case MD_NTSTATUS_WIN_STATUS_DOMAIN_CONTROLLER_NOT_FOUND: + reason = "STATUS_DOMAIN_CONTROLLER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCOUNT_LOCKED_OUT: + reason = "STATUS_ACCOUNT_LOCKED_OUT"; + break; + case MD_NTSTATUS_WIN_STATUS_HANDLE_NOT_CLOSABLE: + reason = "STATUS_HANDLE_NOT_CLOSABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_CONNECTION_REFUSED: + reason = "STATUS_CONNECTION_REFUSED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRACEFUL_DISCONNECT: + reason = "STATUS_GRACEFUL_DISCONNECT"; + break; + case MD_NTSTATUS_WIN_STATUS_ADDRESS_ALREADY_ASSOCIATED: + reason = "STATUS_ADDRESS_ALREADY_ASSOCIATED"; + break; + case MD_NTSTATUS_WIN_STATUS_ADDRESS_NOT_ASSOCIATED: + reason = "STATUS_ADDRESS_NOT_ASSOCIATED"; + break; + case MD_NTSTATUS_WIN_STATUS_CONNECTION_INVALID: + reason = "STATUS_CONNECTION_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_CONNECTION_ACTIVE: + reason = "STATUS_CONNECTION_ACTIVE"; + break; + case MD_NTSTATUS_WIN_STATUS_NETWORK_UNREACHABLE: + reason = "STATUS_NETWORK_UNREACHABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_HOST_UNREACHABLE: + reason = "STATUS_HOST_UNREACHABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_PROTOCOL_UNREACHABLE: + reason = "STATUS_PROTOCOL_UNREACHABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_PORT_UNREACHABLE: + reason = "STATUS_PORT_UNREACHABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_REQUEST_ABORTED: + reason = "STATUS_REQUEST_ABORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_CONNECTION_ABORTED: + reason = "STATUS_CONNECTION_ABORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_COMPRESSION_BUFFER: + reason = "STATUS_BAD_COMPRESSION_BUFFER"; + break; + case MD_NTSTATUS_WIN_STATUS_USER_MAPPED_FILE: + reason = "STATUS_USER_MAPPED_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_AUDIT_FAILED: + reason = "STATUS_AUDIT_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_TIMER_RESOLUTION_NOT_SET: + reason = "STATUS_TIMER_RESOLUTION_NOT_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_CONNECTION_COUNT_LIMIT: + reason = "STATUS_CONNECTION_COUNT_LIMIT"; + break; + case MD_NTSTATUS_WIN_STATUS_LOGIN_TIME_RESTRICTION: + reason = "STATUS_LOGIN_TIME_RESTRICTION"; + break; + case MD_NTSTATUS_WIN_STATUS_LOGIN_WKSTA_RESTRICTION: + reason = "STATUS_LOGIN_WKSTA_RESTRICTION"; + break; + case MD_NTSTATUS_WIN_STATUS_IMAGE_MP_UP_MISMATCH: + reason = "STATUS_IMAGE_MP_UP_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_LOGON_INFO: + reason = "STATUS_INSUFFICIENT_LOGON_INFO"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_DLL_ENTRYPOINT: + reason = "STATUS_BAD_DLL_ENTRYPOINT"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_SERVICE_ENTRYPOINT: + reason = "STATUS_BAD_SERVICE_ENTRYPOINT"; + break; + case MD_NTSTATUS_WIN_STATUS_LPC_REPLY_LOST: + reason = "STATUS_LPC_REPLY_LOST"; + break; + case MD_NTSTATUS_WIN_STATUS_IP_ADDRESS_CONFLICT1: + reason = "STATUS_IP_ADDRESS_CONFLICT1"; + break; + case MD_NTSTATUS_WIN_STATUS_IP_ADDRESS_CONFLICT2: + reason = "STATUS_IP_ADDRESS_CONFLICT2"; + break; + case MD_NTSTATUS_WIN_STATUS_REGISTRY_QUOTA_LIMIT: + reason = "STATUS_REGISTRY_QUOTA_LIMIT"; + break; + case MD_NTSTATUS_WIN_STATUS_PATH_NOT_COVERED: + reason = "STATUS_PATH_NOT_COVERED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_CALLBACK_ACTIVE: + reason = "STATUS_NO_CALLBACK_ACTIVE"; + break; + case MD_NTSTATUS_WIN_STATUS_LICENSE_QUOTA_EXCEEDED: + reason = "STATUS_LICENSE_QUOTA_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_PWD_TOO_SHORT: + reason = "STATUS_PWD_TOO_SHORT"; + break; + case MD_NTSTATUS_WIN_STATUS_PWD_TOO_RECENT: + reason = "STATUS_PWD_TOO_RECENT"; + break; + case MD_NTSTATUS_WIN_STATUS_PWD_HISTORY_CONFLICT: + reason = "STATUS_PWD_HISTORY_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_PLUGPLAY_NO_DEVICE: + reason = "STATUS_PLUGPLAY_NO_DEVICE"; + break; + case MD_NTSTATUS_WIN_STATUS_UNSUPPORTED_COMPRESSION: + reason = "STATUS_UNSUPPORTED_COMPRESSION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_HW_PROFILE: + reason = "STATUS_INVALID_HW_PROFILE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PLUGPLAY_DEVICE_PATH: + reason = "STATUS_INVALID_PLUGPLAY_DEVICE_PATH"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_ORDINAL_NOT_FOUND: + reason = "STATUS_DRIVER_ORDINAL_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND: + reason = "STATUS_DRIVER_ENTRYPOINT_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_RESOURCE_NOT_OWNED: + reason = "STATUS_RESOURCE_NOT_OWNED"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_LINKS: + reason = "STATUS_TOO_MANY_LINKS"; + break; + case MD_NTSTATUS_WIN_STATUS_QUOTA_LIST_INCONSISTENT: + reason = "STATUS_QUOTA_LIST_INCONSISTENT"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_IS_OFFLINE: + reason = "STATUS_FILE_IS_OFFLINE"; + break; + case MD_NTSTATUS_WIN_STATUS_EVALUATION_EXPIRATION: + reason = "STATUS_EVALUATION_EXPIRATION"; + break; + case MD_NTSTATUS_WIN_STATUS_ILLEGAL_DLL_RELOCATION: + reason = "STATUS_ILLEGAL_DLL_RELOCATION"; + break; + case MD_NTSTATUS_WIN_STATUS_LICENSE_VIOLATION: + reason = "STATUS_LICENSE_VIOLATION"; + break; + case MD_NTSTATUS_WIN_STATUS_DLL_INIT_FAILED_LOGOFF: + reason = "STATUS_DLL_INIT_FAILED_LOGOFF"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_UNABLE_TO_LOAD: + reason = "STATUS_DRIVER_UNABLE_TO_LOAD"; + break; + case MD_NTSTATUS_WIN_STATUS_DFS_UNAVAILABLE: + reason = "STATUS_DFS_UNAVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLUME_DISMOUNTED: + reason = "STATUS_VOLUME_DISMOUNTED"; + break; + case MD_NTSTATUS_WIN_STATUS_WX86_INTERNAL_ERROR: + reason = "STATUS_WX86_INTERNAL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_WX86_FLOAT_STACK_CHECK: + reason = "STATUS_WX86_FLOAT_STACK_CHECK"; + break; + case MD_NTSTATUS_WIN_STATUS_VALIDATE_CONTINUE: + reason = "STATUS_VALIDATE_CONTINUE"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_MATCH: + reason = "STATUS_NO_MATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_MORE_MATCHES: + reason = "STATUS_NO_MORE_MATCHES"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_A_REPARSE_POINT: + reason = "STATUS_NOT_A_REPARSE_POINT"; + break; + case MD_NTSTATUS_WIN_STATUS_IO_REPARSE_TAG_INVALID: + reason = "STATUS_IO_REPARSE_TAG_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_IO_REPARSE_TAG_MISMATCH: + reason = "STATUS_IO_REPARSE_TAG_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_IO_REPARSE_DATA_INVALID: + reason = "STATUS_IO_REPARSE_DATA_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_IO_REPARSE_TAG_NOT_HANDLED: + reason = "STATUS_IO_REPARSE_TAG_NOT_HANDLED"; + break; + case MD_NTSTATUS_WIN_STATUS_PWD_TOO_LONG: + reason = "STATUS_PWD_TOO_LONG"; + break; + case MD_NTSTATUS_WIN_STATUS_STOWED_EXCEPTION: + reason = "STATUS_STOWED_EXCEPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_REPARSE_POINT_NOT_RESOLVED: + reason = "STATUS_REPARSE_POINT_NOT_RESOLVED"; + break; + case MD_NTSTATUS_WIN_STATUS_DIRECTORY_IS_A_REPARSE_POINT: + reason = "STATUS_DIRECTORY_IS_A_REPARSE_POINT"; + break; + case MD_NTSTATUS_WIN_STATUS_RANGE_LIST_CONFLICT: + reason = "STATUS_RANGE_LIST_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_SOURCE_ELEMENT_EMPTY: + reason = "STATUS_SOURCE_ELEMENT_EMPTY"; + break; + case MD_NTSTATUS_WIN_STATUS_DESTINATION_ELEMENT_FULL: + reason = "STATUS_DESTINATION_ELEMENT_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_ILLEGAL_ELEMENT_ADDRESS: + reason = "STATUS_ILLEGAL_ELEMENT_ADDRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_MAGAZINE_NOT_PRESENT: + reason = "STATUS_MAGAZINE_NOT_PRESENT"; + break; + case MD_NTSTATUS_WIN_STATUS_REINITIALIZATION_NEEDED: + reason = "STATUS_REINITIALIZATION_NEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_ENCRYPTION_FAILED: + reason = "STATUS_ENCRYPTION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_DECRYPTION_FAILED: + reason = "STATUS_DECRYPTION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_RANGE_NOT_FOUND: + reason = "STATUS_RANGE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_RECOVERY_POLICY: + reason = "STATUS_NO_RECOVERY_POLICY"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_EFS: + reason = "STATUS_NO_EFS"; + break; + case MD_NTSTATUS_WIN_STATUS_WRONG_EFS: + reason = "STATUS_WRONG_EFS"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_USER_KEYS: + reason = "STATUS_NO_USER_KEYS"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_NOT_ENCRYPTED: + reason = "STATUS_FILE_NOT_ENCRYPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_EXPORT_FORMAT: + reason = "STATUS_NOT_EXPORT_FORMAT"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_ENCRYPTED: + reason = "STATUS_FILE_ENCRYPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_WMI_GUID_NOT_FOUND: + reason = "STATUS_WMI_GUID_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_WMI_INSTANCE_NOT_FOUND: + reason = "STATUS_WMI_INSTANCE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_WMI_ITEMID_NOT_FOUND: + reason = "STATUS_WMI_ITEMID_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_WMI_TRY_AGAIN: + reason = "STATUS_WMI_TRY_AGAIN"; + break; + case MD_NTSTATUS_WIN_STATUS_SHARED_POLICY: + reason = "STATUS_SHARED_POLICY"; + break; + case MD_NTSTATUS_WIN_STATUS_POLICY_OBJECT_NOT_FOUND: + reason = "STATUS_POLICY_OBJECT_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_POLICY_ONLY_IN_DS: + reason = "STATUS_POLICY_ONLY_IN_DS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLUME_NOT_UPGRADED: + reason = "STATUS_VOLUME_NOT_UPGRADED"; + break; + case MD_NTSTATUS_WIN_STATUS_REMOTE_STORAGE_NOT_ACTIVE: + reason = "STATUS_REMOTE_STORAGE_NOT_ACTIVE"; + break; + case MD_NTSTATUS_WIN_STATUS_REMOTE_STORAGE_MEDIA_ERROR: + reason = "STATUS_REMOTE_STORAGE_MEDIA_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_TRACKING_SERVICE: + reason = "STATUS_NO_TRACKING_SERVICE"; + break; + case MD_NTSTATUS_WIN_STATUS_SERVER_SID_MISMATCH: + reason = "STATUS_SERVER_SID_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_NO_ATTRIBUTE_OR_VALUE: + reason = "STATUS_DS_NO_ATTRIBUTE_OR_VALUE"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_INVALID_ATTRIBUTE_SYNTAX: + reason = "STATUS_DS_INVALID_ATTRIBUTE_SYNTAX"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED: + reason = "STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS: + reason = "STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_BUSY: + reason = "STATUS_DS_BUSY"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_UNAVAILABLE: + reason = "STATUS_DS_UNAVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_NO_RIDS_ALLOCATED: + reason = "STATUS_DS_NO_RIDS_ALLOCATED"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_NO_MORE_RIDS: + reason = "STATUS_DS_NO_MORE_RIDS"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_INCORRECT_ROLE_OWNER: + reason = "STATUS_DS_INCORRECT_ROLE_OWNER"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_RIDMGR_INIT_ERROR: + reason = "STATUS_DS_RIDMGR_INIT_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_OBJ_CLASS_VIOLATION: + reason = "STATUS_DS_OBJ_CLASS_VIOLATION"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_CANT_ON_NON_LEAF: + reason = "STATUS_DS_CANT_ON_NON_LEAF"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_CANT_ON_RDN: + reason = "STATUS_DS_CANT_ON_RDN"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_CANT_MOD_OBJ_CLASS: + reason = "STATUS_DS_CANT_MOD_OBJ_CLASS"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_CROSS_DOM_MOVE_FAILED: + reason = "STATUS_DS_CROSS_DOM_MOVE_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_GC_NOT_AVAILABLE: + reason = "STATUS_DS_GC_NOT_AVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_DIRECTORY_SERVICE_REQUIRED: + reason = "STATUS_DIRECTORY_SERVICE_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_REPARSE_ATTRIBUTE_CONFLICT: + reason = "STATUS_REPARSE_ATTRIBUTE_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_CANT_ENABLE_DENY_ONLY: + reason = "STATUS_CANT_ENABLE_DENY_ONLY"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOAT_MULTIPLE_FAULTS: + reason = "STATUS_FLOAT_MULTIPLE_FAULTS"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOAT_MULTIPLE_TRAPS: + reason = "STATUS_FLOAT_MULTIPLE_TRAPS"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_REMOVED: + reason = "STATUS_DEVICE_REMOVED"; + break; + case MD_NTSTATUS_WIN_STATUS_JOURNAL_DELETE_IN_PROGRESS: + reason = "STATUS_JOURNAL_DELETE_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_JOURNAL_NOT_ACTIVE: + reason = "STATUS_JOURNAL_NOT_ACTIVE"; + break; + case MD_NTSTATUS_WIN_STATUS_NOINTERFACE: + reason = "STATUS_NOINTERFACE"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_RIDMGR_DISABLED: + reason = "STATUS_DS_RIDMGR_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_ADMIN_LIMIT_EXCEEDED: + reason = "STATUS_DS_ADMIN_LIMIT_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_FAILED_SLEEP: + reason = "STATUS_DRIVER_FAILED_SLEEP"; + break; + case MD_NTSTATUS_WIN_STATUS_MUTUAL_AUTHENTICATION_FAILED: + reason = "STATUS_MUTUAL_AUTHENTICATION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_CORRUPT_SYSTEM_FILE: + reason = "STATUS_CORRUPT_SYSTEM_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_DATATYPE_MISALIGNMENT_ERROR: + reason = "STATUS_DATATYPE_MISALIGNMENT_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_WMI_READ_ONLY: + reason = "STATUS_WMI_READ_ONLY"; + break; + case MD_NTSTATUS_WIN_STATUS_WMI_SET_FAILURE: + reason = "STATUS_WMI_SET_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_COMMITMENT_MINIMUM: + reason = "STATUS_COMMITMENT_MINIMUM"; + break; + case MD_NTSTATUS_WIN_STATUS_REG_NAT_CONSUMPTION: + reason = "STATUS_REG_NAT_CONSUMPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSPORT_FULL: + reason = "STATUS_TRANSPORT_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_SAM_INIT_FAILURE: + reason = "STATUS_DS_SAM_INIT_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_ONLY_IF_CONNECTED: + reason = "STATUS_ONLY_IF_CONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_SENSITIVE_GROUP_VIOLATION: + reason = "STATUS_DS_SENSITIVE_GROUP_VIOLATION"; + break; + case MD_NTSTATUS_WIN_STATUS_PNP_RESTART_ENUMERATION: + reason = "STATUS_PNP_RESTART_ENUMERATION"; + break; + case MD_NTSTATUS_WIN_STATUS_JOURNAL_ENTRY_DELETED: + reason = "STATUS_JOURNAL_ENTRY_DELETED"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_CANT_MOD_PRIMARYGROUPID: + reason = "STATUS_DS_CANT_MOD_PRIMARYGROUPID"; + break; + case MD_NTSTATUS_WIN_STATUS_SYSTEM_IMAGE_BAD_SIGNATURE: + reason = "STATUS_SYSTEM_IMAGE_BAD_SIGNATURE"; + break; + case MD_NTSTATUS_WIN_STATUS_PNP_REBOOT_REQUIRED: + reason = "STATUS_PNP_REBOOT_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_POWER_STATE_INVALID: + reason = "STATUS_POWER_STATE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_INVALID_GROUP_TYPE: + reason = "STATUS_DS_INVALID_GROUP_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN: + reason = "STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN: + reason = "STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER: + reason = "STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER: + reason = "STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER: + reason = "STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER: + reason = "STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER: + reason = "STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_HAVE_PRIMARY_MEMBERS: + reason = "STATUS_DS_HAVE_PRIMARY_MEMBERS"; + break; + case MD_NTSTATUS_WIN_STATUS_WMI_NOT_SUPPORTED: + reason = "STATUS_WMI_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_POWER: + reason = "STATUS_INSUFFICIENT_POWER"; + break; + case MD_NTSTATUS_WIN_STATUS_SAM_NEED_BOOTKEY_PASSWORD: + reason = "STATUS_SAM_NEED_BOOTKEY_PASSWORD"; + break; + case MD_NTSTATUS_WIN_STATUS_SAM_NEED_BOOTKEY_FLOPPY: + reason = "STATUS_SAM_NEED_BOOTKEY_FLOPPY"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_CANT_START: + reason = "STATUS_DS_CANT_START"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_INIT_FAILURE: + reason = "STATUS_DS_INIT_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_SAM_INIT_FAILURE: + reason = "STATUS_SAM_INIT_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_GC_REQUIRED: + reason = "STATUS_DS_GC_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY: + reason = "STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS: + reason = "STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED: + reason = "STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_MULTIPLE_FAULT_VIOLATION: + reason = "STATUS_MULTIPLE_FAULT_VIOLATION"; + break; + case MD_NTSTATUS_WIN_STATUS_CURRENT_DOMAIN_NOT_ALLOWED: + reason = "STATUS_CURRENT_DOMAIN_NOT_ALLOWED"; + break; + case MD_NTSTATUS_WIN_STATUS_CANNOT_MAKE: + reason = "STATUS_CANNOT_MAKE"; + break; + case MD_NTSTATUS_WIN_STATUS_SYSTEM_SHUTDOWN: + reason = "STATUS_SYSTEM_SHUTDOWN"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_INIT_FAILURE_CONSOLE: + reason = "STATUS_DS_INIT_FAILURE_CONSOLE"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_SAM_INIT_FAILURE_CONSOLE: + reason = "STATUS_DS_SAM_INIT_FAILURE_CONSOLE"; + break; + case MD_NTSTATUS_WIN_STATUS_UNFINISHED_CONTEXT_DELETED: + reason = "STATUS_UNFINISHED_CONTEXT_DELETED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_TGT_REPLY: + reason = "STATUS_NO_TGT_REPLY"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECTID_NOT_FOUND: + reason = "STATUS_OBJECTID_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_IP_ADDRESSES: + reason = "STATUS_NO_IP_ADDRESSES"; + break; + case MD_NTSTATUS_WIN_STATUS_WRONG_CREDENTIAL_HANDLE: + reason = "STATUS_WRONG_CREDENTIAL_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_CRYPTO_SYSTEM_INVALID: + reason = "STATUS_CRYPTO_SYSTEM_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_MAX_REFERRALS_EXCEEDED: + reason = "STATUS_MAX_REFERRALS_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_MUST_BE_KDC: + reason = "STATUS_MUST_BE_KDC"; + break; + case MD_NTSTATUS_WIN_STATUS_STRONG_CRYPTO_NOT_SUPPORTED: + reason = "STATUS_STRONG_CRYPTO_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_PRINCIPALS: + reason = "STATUS_TOO_MANY_PRINCIPALS"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_PA_DATA: + reason = "STATUS_NO_PA_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_PKINIT_NAME_MISMATCH: + reason = "STATUS_PKINIT_NAME_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_LOGON_REQUIRED: + reason = "STATUS_SMARTCARD_LOGON_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_KDC_INVALID_REQUEST: + reason = "STATUS_KDC_INVALID_REQUEST"; + break; + case MD_NTSTATUS_WIN_STATUS_KDC_UNABLE_TO_REFER: + reason = "STATUS_KDC_UNABLE_TO_REFER"; + break; + case MD_NTSTATUS_WIN_STATUS_KDC_UNKNOWN_ETYPE: + reason = "STATUS_KDC_UNKNOWN_ETYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_SHUTDOWN_IN_PROGRESS: + reason = "STATUS_SHUTDOWN_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_SERVER_SHUTDOWN_IN_PROGRESS: + reason = "STATUS_SERVER_SHUTDOWN_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_SUPPORTED_ON_SBS: + reason = "STATUS_NOT_SUPPORTED_ON_SBS"; + break; + case MD_NTSTATUS_WIN_STATUS_WMI_GUID_DISCONNECTED: + reason = "STATUS_WMI_GUID_DISCONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_WMI_ALREADY_DISABLED: + reason = "STATUS_WMI_ALREADY_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_WMI_ALREADY_ENABLED: + reason = "STATUS_WMI_ALREADY_ENABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_MFT_TOO_FRAGMENTED: + reason = "STATUS_MFT_TOO_FRAGMENTED"; + break; + case MD_NTSTATUS_WIN_STATUS_COPY_PROTECTION_FAILURE: + reason = "STATUS_COPY_PROTECTION_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_CSS_AUTHENTICATION_FAILURE: + reason = "STATUS_CSS_AUTHENTICATION_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_CSS_KEY_NOT_PRESENT: + reason = "STATUS_CSS_KEY_NOT_PRESENT"; + break; + case MD_NTSTATUS_WIN_STATUS_CSS_KEY_NOT_ESTABLISHED: + reason = "STATUS_CSS_KEY_NOT_ESTABLISHED"; + break; + case MD_NTSTATUS_WIN_STATUS_CSS_SCRAMBLED_SECTOR: + reason = "STATUS_CSS_SCRAMBLED_SECTOR"; + break; + case MD_NTSTATUS_WIN_STATUS_CSS_REGION_MISMATCH: + reason = "STATUS_CSS_REGION_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_CSS_RESETS_EXHAUSTED: + reason = "STATUS_CSS_RESETS_EXHAUSTED"; + break; + case MD_NTSTATUS_WIN_STATUS_PASSWORD_CHANGE_REQUIRED: + reason = "STATUS_PASSWORD_CHANGE_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_PKINIT_FAILURE: + reason = "STATUS_PKINIT_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_SUBSYSTEM_FAILURE: + reason = "STATUS_SMARTCARD_SUBSYSTEM_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_KERB_KEY: + reason = "STATUS_NO_KERB_KEY"; + break; + case MD_NTSTATUS_WIN_STATUS_HOST_DOWN: + reason = "STATUS_HOST_DOWN"; + break; + case MD_NTSTATUS_WIN_STATUS_UNSUPPORTED_PREAUTH: + reason = "STATUS_UNSUPPORTED_PREAUTH"; + break; + case MD_NTSTATUS_WIN_STATUS_EFS_ALG_BLOB_TOO_BIG: + reason = "STATUS_EFS_ALG_BLOB_TOO_BIG"; + break; + case MD_NTSTATUS_WIN_STATUS_PORT_NOT_SET: + reason = "STATUS_PORT_NOT_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_DEBUGGER_INACTIVE: + reason = "STATUS_DEBUGGER_INACTIVE"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_VERSION_CHECK_FAILURE: + reason = "STATUS_DS_VERSION_CHECK_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_AUDITING_DISABLED: + reason = "STATUS_AUDITING_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_PRENT4_MACHINE_ACCOUNT: + reason = "STATUS_PRENT4_MACHINE_ACCOUNT"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER: + reason = "STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_WIN_32: + reason = "STATUS_INVALID_IMAGE_WIN_32"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_WIN_64: + reason = "STATUS_INVALID_IMAGE_WIN_64"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_BINDINGS: + reason = "STATUS_BAD_BINDINGS"; + break; + case MD_NTSTATUS_WIN_STATUS_NETWORK_SESSION_EXPIRED: + reason = "STATUS_NETWORK_SESSION_EXPIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_APPHELP_BLOCK: + reason = "STATUS_APPHELP_BLOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_ALL_SIDS_FILTERED: + reason = "STATUS_ALL_SIDS_FILTERED"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_SAFE_MODE_DRIVER: + reason = "STATUS_NOT_SAFE_MODE_DRIVER"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT: + reason = "STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_PATH: + reason = "STATUS_ACCESS_DISABLED_BY_POLICY_PATH"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER: + reason = "STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER: + reason = "STATUS_ACCESS_DISABLED_BY_POLICY_OTHER"; + break; + case MD_NTSTATUS_WIN_STATUS_FAILED_DRIVER_ENTRY: + reason = "STATUS_FAILED_DRIVER_ENTRY"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_ENUMERATION_ERROR: + reason = "STATUS_DEVICE_ENUMERATION_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_MOUNT_POINT_NOT_RESOLVED: + reason = "STATUS_MOUNT_POINT_NOT_RESOLVED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_DEVICE_OBJECT_PARAMETER: + reason = "STATUS_INVALID_DEVICE_OBJECT_PARAMETER"; + break; + case MD_NTSTATUS_WIN_STATUS_MCA_OCCURED: + reason = "STATUS_MCA_OCCURED"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_BLOCKED_CRITICAL: + reason = "STATUS_DRIVER_BLOCKED_CRITICAL"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_BLOCKED: + reason = "STATUS_DRIVER_BLOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_DATABASE_ERROR: + reason = "STATUS_DRIVER_DATABASE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_SYSTEM_HIVE_TOO_LARGE: + reason = "STATUS_SYSTEM_HIVE_TOO_LARGE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IMPORT_OF_NON_DLL: + reason = "STATUS_INVALID_IMPORT_OF_NON_DLL"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SECRETS: + reason = "STATUS_NO_SECRETS"; + break; + case MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY: + reason = "STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY"; + break; + case MD_NTSTATUS_WIN_STATUS_FAILED_STACK_SWITCH: + reason = "STATUS_FAILED_STACK_SWITCH"; + break; + case MD_NTSTATUS_WIN_STATUS_HEAP_CORRUPTION: + reason = "STATUS_HEAP_CORRUPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_WRONG_PIN: + reason = "STATUS_SMARTCARD_WRONG_PIN"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_CARD_BLOCKED: + reason = "STATUS_SMARTCARD_CARD_BLOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED: + reason = "STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_CARD: + reason = "STATUS_SMARTCARD_NO_CARD"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_KEY_CONTAINER: + reason = "STATUS_SMARTCARD_NO_KEY_CONTAINER"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_CERTIFICATE: + reason = "STATUS_SMARTCARD_NO_CERTIFICATE"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_KEYSET: + reason = "STATUS_SMARTCARD_NO_KEYSET"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_IO_ERROR: + reason = "STATUS_SMARTCARD_IO_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_DOWNGRADE_DETECTED: + reason = "STATUS_DOWNGRADE_DETECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_CERT_REVOKED: + reason = "STATUS_SMARTCARD_CERT_REVOKED"; + break; + case MD_NTSTATUS_WIN_STATUS_ISSUING_CA_UNTRUSTED: + reason = "STATUS_ISSUING_CA_UNTRUSTED"; + break; + case MD_NTSTATUS_WIN_STATUS_REVOCATION_OFFLINE_C: + reason = "STATUS_REVOCATION_OFFLINE_C"; + break; + case MD_NTSTATUS_WIN_STATUS_PKINIT_CLIENT_FAILURE: + reason = "STATUS_PKINIT_CLIENT_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_CERT_EXPIRED: + reason = "STATUS_SMARTCARD_CERT_EXPIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_FAILED_PRIOR_UNLOAD: + reason = "STATUS_DRIVER_FAILED_PRIOR_UNLOAD"; + break; + case MD_NTSTATUS_WIN_STATUS_SMARTCARD_SILENT_CONTEXT: + reason = "STATUS_SMARTCARD_SILENT_CONTEXT"; + break; + case MD_NTSTATUS_WIN_STATUS_PER_USER_TRUST_QUOTA_EXCEEDED: + reason = "STATUS_PER_USER_TRUST_QUOTA_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED: + reason = "STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED: + reason = "STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_NAME_NOT_UNIQUE: + reason = "STATUS_DS_NAME_NOT_UNIQUE"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_DUPLICATE_ID_FOUND: + reason = "STATUS_DS_DUPLICATE_ID_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_GROUP_CONVERSION_ERROR: + reason = "STATUS_DS_GROUP_CONVERSION_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLSNAP_PREPARE_HIBERNATE: + reason = "STATUS_VOLSNAP_PREPARE_HIBERNATE"; + break; + case MD_NTSTATUS_WIN_STATUS_USER2USER_REQUIRED: + reason = "STATUS_USER2USER_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_STACK_BUFFER_OVERRUN: + reason = "STATUS_STACK_BUFFER_OVERRUN"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_S4U_PROT_SUPPORT: + reason = "STATUS_NO_S4U_PROT_SUPPORT"; + break; + case MD_NTSTATUS_WIN_STATUS_CROSSREALM_DELEGATION_FAILURE: + reason = "STATUS_CROSSREALM_DELEGATION_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_REVOCATION_OFFLINE_KDC: + reason = "STATUS_REVOCATION_OFFLINE_KDC"; + break; + case MD_NTSTATUS_WIN_STATUS_ISSUING_CA_UNTRUSTED_KDC: + reason = "STATUS_ISSUING_CA_UNTRUSTED_KDC"; + break; + case MD_NTSTATUS_WIN_STATUS_KDC_CERT_EXPIRED: + reason = "STATUS_KDC_CERT_EXPIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_KDC_CERT_REVOKED: + reason = "STATUS_KDC_CERT_REVOKED"; + break; + case MD_NTSTATUS_WIN_STATUS_PARAMETER_QUOTA_EXCEEDED: + reason = "STATUS_PARAMETER_QUOTA_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_HIBERNATION_FAILURE: + reason = "STATUS_HIBERNATION_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_DELAY_LOAD_FAILED: + reason = "STATUS_DELAY_LOAD_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_AUTHENTICATION_FIREWALL_FAILED: + reason = "STATUS_AUTHENTICATION_FIREWALL_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_VDM_DISALLOWED: + reason = "STATUS_VDM_DISALLOWED"; + break; + case MD_NTSTATUS_WIN_STATUS_HUNG_DISPLAY_DRIVER_THREAD: + reason = "STATUS_HUNG_DISPLAY_DRIVER_THREAD"; + break; + case MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE: + reason = "STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_CRUNTIME_PARAMETER: + reason = "STATUS_INVALID_CRUNTIME_PARAMETER"; + break; + case MD_NTSTATUS_WIN_STATUS_NTLM_BLOCKED: + reason = "STATUS_NTLM_BLOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_SRC_SID_EXISTS_IN_FOREST: + reason = "STATUS_DS_SRC_SID_EXISTS_IN_FOREST"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST: + reason = "STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST: + reason = "STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_USER_PRINCIPAL_NAME: + reason = "STATUS_INVALID_USER_PRINCIPAL_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_FATAL_USER_CALLBACK_EXCEPTION: + reason = "STATUS_FATAL_USER_CALLBACK_EXCEPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_ASSERTION_FAILURE: + reason = "STATUS_ASSERTION_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_VERIFIER_STOP: + reason = "STATUS_VERIFIER_STOP"; + break; + case MD_NTSTATUS_WIN_STATUS_CALLBACK_POP_STACK: + reason = "STATUS_CALLBACK_POP_STACK"; + break; + case MD_NTSTATUS_WIN_STATUS_INCOMPATIBLE_DRIVER_BLOCKED: + reason = "STATUS_INCOMPATIBLE_DRIVER_BLOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_HIVE_UNLOADED: + reason = "STATUS_HIVE_UNLOADED"; + break; + case MD_NTSTATUS_WIN_STATUS_COMPRESSION_DISABLED: + reason = "STATUS_COMPRESSION_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_SYSTEM_LIMITATION: + reason = "STATUS_FILE_SYSTEM_LIMITATION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_HASH: + reason = "STATUS_INVALID_IMAGE_HASH"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_CAPABLE: + reason = "STATUS_NOT_CAPABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_REQUEST_OUT_OF_SEQUENCE: + reason = "STATUS_REQUEST_OUT_OF_SEQUENCE"; + break; + case MD_NTSTATUS_WIN_STATUS_IMPLEMENTATION_LIMIT: + reason = "STATUS_IMPLEMENTATION_LIMIT"; + break; + case MD_NTSTATUS_WIN_STATUS_ELEVATION_REQUIRED: + reason = "STATUS_ELEVATION_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SECURITY_CONTEXT: + reason = "STATUS_NO_SECURITY_CONTEXT"; + break; + case MD_NTSTATUS_WIN_STATUS_PKU2U_CERT_FAILURE: + reason = "STATUS_PKU2U_CERT_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_BEYOND_VDL: + reason = "STATUS_BEYOND_VDL"; + break; + case MD_NTSTATUS_WIN_STATUS_ENCOUNTERED_WRITE_IN_PROGRESS: + reason = "STATUS_ENCOUNTERED_WRITE_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_PTE_CHANGED: + reason = "STATUS_PTE_CHANGED"; + break; + case MD_NTSTATUS_WIN_STATUS_PURGE_FAILED: + reason = "STATUS_PURGE_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_CRED_REQUIRES_CONFIRMATION: + reason = "STATUS_CRED_REQUIRES_CONFIRMATION"; + break; + case MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE: + reason = "STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE"; + break; + case MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER: + reason = "STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER"; + break; + case MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE: + reason = "STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE: + reason = "STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_FILE_NOT_CSE: + reason = "STATUS_CS_ENCRYPTION_FILE_NOT_CSE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_LABEL: + reason = "STATUS_INVALID_LABEL"; + break; + case MD_NTSTATUS_WIN_STATUS_DRIVER_PROCESS_TERMINATED: + reason = "STATUS_DRIVER_PROCESS_TERMINATED"; + break; + case MD_NTSTATUS_WIN_STATUS_AMBIGUOUS_SYSTEM_DEVICE: + reason = "STATUS_AMBIGUOUS_SYSTEM_DEVICE"; + break; + case MD_NTSTATUS_WIN_STATUS_SYSTEM_DEVICE_NOT_FOUND: + reason = "STATUS_SYSTEM_DEVICE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_RESTART_BOOT_APPLICATION: + reason = "STATUS_RESTART_BOOT_APPLICATION"; + break; + case MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_NVRAM_RESOURCES: + reason = "STATUS_INSUFFICIENT_NVRAM_RESOURCES"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_SESSION: + reason = "STATUS_INVALID_SESSION"; + break; + case MD_NTSTATUS_WIN_STATUS_THREAD_ALREADY_IN_SESSION: + reason = "STATUS_THREAD_ALREADY_IN_SESSION"; + break; + case MD_NTSTATUS_WIN_STATUS_THREAD_NOT_IN_SESSION: + reason = "STATUS_THREAD_NOT_IN_SESSION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_WEIGHT: + reason = "STATUS_INVALID_WEIGHT"; + break; + case MD_NTSTATUS_WIN_STATUS_REQUEST_PAUSED: + reason = "STATUS_REQUEST_PAUSED"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_RANGES_PROCESSED: + reason = "STATUS_NO_RANGES_PROCESSED"; + break; + case MD_NTSTATUS_WIN_STATUS_DISK_RESOURCES_EXHAUSTED: + reason = "STATUS_DISK_RESOURCES_EXHAUSTED"; + break; + case MD_NTSTATUS_WIN_STATUS_NEEDS_REMEDIATION: + reason = "STATUS_NEEDS_REMEDIATION"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_FEATURE_NOT_SUPPORTED: + reason = "STATUS_DEVICE_FEATURE_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_UNREACHABLE: + reason = "STATUS_DEVICE_UNREACHABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_TOKEN: + reason = "STATUS_INVALID_TOKEN"; + break; + case MD_NTSTATUS_WIN_STATUS_SERVER_UNAVAILABLE: + reason = "STATUS_SERVER_UNAVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_NOT_AVAILABLE: + reason = "STATUS_FILE_NOT_AVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_INSUFFICIENT_RESOURCES: + reason = "STATUS_DEVICE_INSUFFICIENT_RESOURCES"; + break; + case MD_NTSTATUS_WIN_STATUS_PACKAGE_UPDATING: + reason = "STATUS_PACKAGE_UPDATING"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_READ_FROM_COPY: + reason = "STATUS_NOT_READ_FROM_COPY"; + break; + case MD_NTSTATUS_WIN_STATUS_FT_WRITE_FAILURE: + reason = "STATUS_FT_WRITE_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_FT_DI_SCAN_REQUIRED: + reason = "STATUS_FT_DI_SCAN_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECT_NOT_EXTERNALLY_BACKED: + reason = "STATUS_OBJECT_NOT_EXTERNALLY_BACKED"; + break; + case MD_NTSTATUS_WIN_STATUS_EXTERNAL_BACKING_PROVIDER_UNKNOWN: + reason = "STATUS_EXTERNAL_BACKING_PROVIDER_UNKNOWN"; + break; + case MD_NTSTATUS_WIN_STATUS_DATA_CHECKSUM_ERROR: + reason = "STATUS_DATA_CHECKSUM_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_INTERMIXED_KERNEL_EA_OPERATION: + reason = "STATUS_INTERMIXED_KERNEL_EA_OPERATION"; + break; + case MD_NTSTATUS_WIN_STATUS_TRIM_READ_ZERO_NOT_SUPPORTED: + reason = "STATUS_TRIM_READ_ZERO_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_TOO_MANY_SEGMENT_DESCRIPTORS: + reason = "STATUS_TOO_MANY_SEGMENT_DESCRIPTORS"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_OFFSET_ALIGNMENT: + reason = "STATUS_INVALID_OFFSET_ALIGNMENT"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_FIELD_IN_PARAMETER_LIST: + reason = "STATUS_INVALID_FIELD_IN_PARAMETER_LIST"; + break; + case MD_NTSTATUS_WIN_STATUS_OPERATION_IN_PROGRESS: + reason = "STATUS_OPERATION_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_INITIATOR_TARGET_PATH: + reason = "STATUS_INVALID_INITIATOR_TARGET_PATH"; + break; + case MD_NTSTATUS_WIN_STATUS_SCRUB_DATA_DISABLED: + reason = "STATUS_SCRUB_DATA_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_REDUNDANT_STORAGE: + reason = "STATUS_NOT_REDUNDANT_STORAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_RESIDENT_FILE_NOT_SUPPORTED: + reason = "STATUS_RESIDENT_FILE_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_COMPRESSED_FILE_NOT_SUPPORTED: + reason = "STATUS_COMPRESSED_FILE_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_DIRECTORY_NOT_SUPPORTED: + reason = "STATUS_DIRECTORY_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_IO_OPERATION_TIMEOUT: + reason = "STATUS_IO_OPERATION_TIMEOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_SYSTEM_NEEDS_REMEDIATION: + reason = "STATUS_SYSTEM_NEEDS_REMEDIATION"; + break; + case MD_NTSTATUS_WIN_STATUS_APPX_INTEGRITY_FAILURE_CLR_NGEN: + reason = "STATUS_APPX_INTEGRITY_FAILURE_CLR_NGEN"; + break; + case MD_NTSTATUS_WIN_STATUS_SHARE_UNAVAILABLE: + reason = "STATUS_SHARE_UNAVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_APISET_NOT_HOSTED: + reason = "STATUS_APISET_NOT_HOSTED"; + break; + case MD_NTSTATUS_WIN_STATUS_APISET_NOT_PRESENT: + reason = "STATUS_APISET_NOT_PRESENT"; + break; + case MD_NTSTATUS_WIN_STATUS_DEVICE_HARDWARE_ERROR: + reason = "STATUS_DEVICE_HARDWARE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_TASK_NAME: + reason = "STATUS_INVALID_TASK_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_TASK_INDEX: + reason = "STATUS_INVALID_TASK_INDEX"; + break; + case MD_NTSTATUS_WIN_STATUS_THREAD_ALREADY_IN_TASK: + reason = "STATUS_THREAD_ALREADY_IN_TASK"; + break; + case MD_NTSTATUS_WIN_STATUS_CALLBACK_BYPASS: + reason = "STATUS_CALLBACK_BYPASS"; + break; + case MD_NTSTATUS_WIN_STATUS_UNDEFINED_SCOPE: + reason = "STATUS_UNDEFINED_SCOPE"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_CAP: + reason = "STATUS_INVALID_CAP"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_GUI_PROCESS: + reason = "STATUS_NOT_GUI_PROCESS"; + break; + case MD_NTSTATUS_WIN_STATUS_FAIL_FAST_EXCEPTION: + reason = "STATUS_FAIL_FAST_EXCEPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_IMAGE_CERT_REVOKED: + reason = "STATUS_IMAGE_CERT_REVOKED"; + break; + case MD_NTSTATUS_WIN_STATUS_DYNAMIC_CODE_BLOCKED: + reason = "STATUS_DYNAMIC_CODE_BLOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_PORT_CLOSED: + reason = "STATUS_PORT_CLOSED"; + break; + case MD_NTSTATUS_WIN_STATUS_MESSAGE_LOST: + reason = "STATUS_MESSAGE_LOST"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_MESSAGE: + reason = "STATUS_INVALID_MESSAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_REQUEST_CANCELED: + reason = "STATUS_REQUEST_CANCELED"; + break; + case MD_NTSTATUS_WIN_STATUS_RECURSIVE_DISPATCH: + reason = "STATUS_RECURSIVE_DISPATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_LPC_RECEIVE_BUFFER_EXPECTED: + reason = "STATUS_LPC_RECEIVE_BUFFER_EXPECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_LPC_INVALID_CONNECTION_USAGE: + reason = "STATUS_LPC_INVALID_CONNECTION_USAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_LPC_REQUESTS_NOT_ALLOWED: + reason = "STATUS_LPC_REQUESTS_NOT_ALLOWED"; + break; + case MD_NTSTATUS_WIN_STATUS_RESOURCE_IN_USE: + reason = "STATUS_RESOURCE_IN_USE"; + break; + case MD_NTSTATUS_WIN_STATUS_HARDWARE_MEMORY_ERROR: + reason = "STATUS_HARDWARE_MEMORY_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_THREADPOOL_HANDLE_EXCEPTION: + reason = "STATUS_THREADPOOL_HANDLE_EXCEPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED: + reason = "STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED: + reason = "STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED: + reason = "STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED: + reason = "STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_THREADPOOL_RELEASED_DURING_OPERATION: + reason = "STATUS_THREADPOOL_RELEASED_DURING_OPERATION"; + break; + case MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING: + reason = "STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING"; + break; + case MD_NTSTATUS_WIN_STATUS_APC_RETURNED_WHILE_IMPERSONATING: + reason = "STATUS_APC_RETURNED_WHILE_IMPERSONATING"; + break; + case MD_NTSTATUS_WIN_STATUS_PROCESS_IS_PROTECTED: + reason = "STATUS_PROCESS_IS_PROTECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_MCA_EXCEPTION: + reason = "STATUS_MCA_EXCEPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE: + reason = "STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE"; + break; + case MD_NTSTATUS_WIN_STATUS_SYMLINK_CLASS_DISABLED: + reason = "STATUS_SYMLINK_CLASS_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_IDN_NORMALIZATION: + reason = "STATUS_INVALID_IDN_NORMALIZATION"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_UNICODE_TRANSLATION: + reason = "STATUS_NO_UNICODE_TRANSLATION"; + break; + case MD_NTSTATUS_WIN_STATUS_ALREADY_REGISTERED: + reason = "STATUS_ALREADY_REGISTERED"; + break; + case MD_NTSTATUS_WIN_STATUS_CONTEXT_MISMATCH: + reason = "STATUS_CONTEXT_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_PORT_ALREADY_HAS_COMPLETION_LIST: + reason = "STATUS_PORT_ALREADY_HAS_COMPLETION_LIST"; + break; + case MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_THREAD_PRIORITY: + reason = "STATUS_CALLBACK_RETURNED_THREAD_PRIORITY"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_THREAD: + reason = "STATUS_INVALID_THREAD"; + break; + case MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_TRANSACTION: + reason = "STATUS_CALLBACK_RETURNED_TRANSACTION"; + break; + case MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_LDR_LOCK: + reason = "STATUS_CALLBACK_RETURNED_LDR_LOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_LANG: + reason = "STATUS_CALLBACK_RETURNED_LANG"; + break; + case MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_PRI_BACK: + reason = "STATUS_CALLBACK_RETURNED_PRI_BACK"; + break; + case MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_THREAD_AFFINITY: + reason = "STATUS_CALLBACK_RETURNED_THREAD_AFFINITY"; + break; + case MD_NTSTATUS_WIN_STATUS_DISK_REPAIR_DISABLED: + reason = "STATUS_DISK_REPAIR_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_DOMAIN_RENAME_IN_PROGRESS: + reason = "STATUS_DS_DOMAIN_RENAME_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_DISK_QUOTA_EXCEEDED: + reason = "STATUS_DISK_QUOTA_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_CONTENT_BLOCKED: + reason = "STATUS_CONTENT_BLOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_CLUSTERS: + reason = "STATUS_BAD_CLUSTERS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLUME_DIRTY: + reason = "STATUS_VOLUME_DIRTY"; + break; + case MD_NTSTATUS_WIN_STATUS_DISK_REPAIR_UNSUCCESSFUL: + reason = "STATUS_DISK_REPAIR_UNSUCCESSFUL"; + break; + case MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_OVERFULL: + reason = "STATUS_CORRUPT_LOG_OVERFULL"; + break; + case MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_CORRUPTED: + reason = "STATUS_CORRUPT_LOG_CORRUPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_UNAVAILABLE: + reason = "STATUS_CORRUPT_LOG_UNAVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_DELETED_FULL: + reason = "STATUS_CORRUPT_LOG_DELETED_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_CLEARED: + reason = "STATUS_CORRUPT_LOG_CLEARED"; + break; + case MD_NTSTATUS_WIN_STATUS_ORPHAN_NAME_EXHAUSTED: + reason = "STATUS_ORPHAN_NAME_EXHAUSTED"; + break; + case MD_NTSTATUS_WIN_STATUS_PROACTIVE_SCAN_IN_PROGRESS: + reason = "STATUS_PROACTIVE_SCAN_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_ENCRYPTED_IO_NOT_POSSIBLE: + reason = "STATUS_ENCRYPTED_IO_NOT_POSSIBLE"; + break; + case MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_UPLEVEL_RECORDS: + reason = "STATUS_CORRUPT_LOG_UPLEVEL_RECORDS"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_CHECKED_OUT: + reason = "STATUS_FILE_CHECKED_OUT"; + break; + case MD_NTSTATUS_WIN_STATUS_CHECKOUT_REQUIRED: + reason = "STATUS_CHECKOUT_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_FILE_TYPE: + reason = "STATUS_BAD_FILE_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_TOO_LARGE: + reason = "STATUS_FILE_TOO_LARGE"; + break; + case MD_NTSTATUS_WIN_STATUS_FORMS_AUTH_REQUIRED: + reason = "STATUS_FORMS_AUTH_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_VIRUS_INFECTED: + reason = "STATUS_VIRUS_INFECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_VIRUS_DELETED: + reason = "STATUS_VIRUS_DELETED"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_MCFG_TABLE: + reason = "STATUS_BAD_MCFG_TABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_CANNOT_BREAK_OPLOCK: + reason = "STATUS_CANNOT_BREAK_OPLOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_KEY: + reason = "STATUS_BAD_KEY"; + break; + case MD_NTSTATUS_WIN_STATUS_BAD_DATA: + reason = "STATUS_BAD_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_KEY: + reason = "STATUS_NO_KEY"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_HANDLE_REVOKED: + reason = "STATUS_FILE_HANDLE_REVOKED"; + break; + case MD_NTSTATUS_WIN_STATUS_WOW_ASSERTION: + reason = "STATUS_WOW_ASSERTION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_SIGNATURE: + reason = "STATUS_INVALID_SIGNATURE"; + break; + case MD_NTSTATUS_WIN_STATUS_HMAC_NOT_SUPPORTED: + reason = "STATUS_HMAC_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_AUTH_TAG_MISMATCH: + reason = "STATUS_AUTH_TAG_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_STATE_TRANSITION: + reason = "STATUS_INVALID_STATE_TRANSITION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_KERNEL_INFO_VERSION: + reason = "STATUS_INVALID_KERNEL_INFO_VERSION"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PEP_INFO_VERSION: + reason = "STATUS_INVALID_PEP_INFO_VERSION"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_QUEUE_OVERFLOW: + reason = "STATUS_IPSEC_QUEUE_OVERFLOW"; + break; + case MD_NTSTATUS_WIN_STATUS_ND_QUEUE_OVERFLOW: + reason = "STATUS_ND_QUEUE_OVERFLOW"; + break; + case MD_NTSTATUS_WIN_STATUS_HOPLIMIT_EXCEEDED: + reason = "STATUS_HOPLIMIT_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_PROTOCOL_NOT_SUPPORTED: + reason = "STATUS_PROTOCOL_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_FASTPATH_REJECTED: + reason = "STATUS_FASTPATH_REJECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED: + reason = "STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR: + reason = "STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR: + reason = "STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_XML_PARSE_ERROR: + reason = "STATUS_XML_PARSE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_XMLDSIG_ERROR: + reason = "STATUS_XMLDSIG_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_WRONG_COMPARTMENT: + reason = "STATUS_WRONG_COMPARTMENT"; + break; + case MD_NTSTATUS_WIN_STATUS_AUTHIP_FAILURE: + reason = "STATUS_AUTHIP_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS: + reason = "STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS"; + break; + case MD_NTSTATUS_WIN_STATUS_DS_OID_NOT_FOUND: + reason = "STATUS_DS_OID_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_INCORRECT_ACCOUNT_TYPE: + reason = "STATUS_INCORRECT_ACCOUNT_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_HASH_NOT_SUPPORTED: + reason = "STATUS_HASH_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_HASH_NOT_PRESENT: + reason = "STATUS_HASH_NOT_PRESENT"; + break; + case MD_NTSTATUS_WIN_STATUS_SECONDARY_IC_PROVIDER_NOT_REGISTERED: + reason = "STATUS_SECONDARY_IC_PROVIDER_NOT_REGISTERED"; + break; + case MD_NTSTATUS_WIN_STATUS_GPIO_CLIENT_INFORMATION_INVALID: + reason = "STATUS_GPIO_CLIENT_INFORMATION_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_GPIO_VERSION_NOT_SUPPORTED: + reason = "STATUS_GPIO_VERSION_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GPIO_INVALID_REGISTRATION_PACKET: + reason = "STATUS_GPIO_INVALID_REGISTRATION_PACKET"; + break; + case MD_NTSTATUS_WIN_STATUS_GPIO_OPERATION_DENIED: + reason = "STATUS_GPIO_OPERATION_DENIED"; + break; + case MD_NTSTATUS_WIN_STATUS_GPIO_INCOMPATIBLE_CONNECT_MODE: + reason = "STATUS_GPIO_INCOMPATIBLE_CONNECT_MODE"; + break; + case MD_NTSTATUS_WIN_STATUS_CANNOT_SWITCH_RUNLEVEL: + reason = "STATUS_CANNOT_SWITCH_RUNLEVEL"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_RUNLEVEL_SETTING: + reason = "STATUS_INVALID_RUNLEVEL_SETTING"; + break; + case MD_NTSTATUS_WIN_STATUS_RUNLEVEL_SWITCH_TIMEOUT: + reason = "STATUS_RUNLEVEL_SWITCH_TIMEOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_RUNLEVEL_SWITCH_AGENT_TIMEOUT: + reason = "STATUS_RUNLEVEL_SWITCH_AGENT_TIMEOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_RUNLEVEL_SWITCH_IN_PROGRESS: + reason = "STATUS_RUNLEVEL_SWITCH_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_APPCONTAINER: + reason = "STATUS_NOT_APPCONTAINER"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_SUPPORTED_IN_APPCONTAINER: + reason = "STATUS_NOT_SUPPORTED_IN_APPCONTAINER"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_PACKAGE_SID_LENGTH: + reason = "STATUS_INVALID_PACKAGE_SID_LENGTH"; + break; + case MD_NTSTATUS_WIN_STATUS_APP_DATA_NOT_FOUND: + reason = "STATUS_APP_DATA_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_APP_DATA_EXPIRED: + reason = "STATUS_APP_DATA_EXPIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_APP_DATA_CORRUPT: + reason = "STATUS_APP_DATA_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_APP_DATA_LIMIT_EXCEEDED: + reason = "STATUS_APP_DATA_LIMIT_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_APP_DATA_REBOOT_REQUIRED: + reason = "STATUS_APP_DATA_REBOOT_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_OFFLOAD_READ_FLT_NOT_SUPPORTED: + reason = "STATUS_OFFLOAD_READ_FLT_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_OFFLOAD_WRITE_FLT_NOT_SUPPORTED: + reason = "STATUS_OFFLOAD_WRITE_FLT_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_OFFLOAD_READ_FILE_NOT_SUPPORTED: + reason = "STATUS_OFFLOAD_READ_FILE_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_OFFLOAD_WRITE_FILE_NOT_SUPPORTED: + reason = "STATUS_OFFLOAD_WRITE_FILE_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_DBG_NO_STATE_CHANGE: + reason = "DBG_NO_STATE_CHANGE"; + break; + case MD_NTSTATUS_WIN_DBG_APP_NOT_IDLE: + reason = "DBG_APP_NOT_IDLE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_STRING_BINDING: + reason = "RPC_NT_INVALID_STRING_BINDING"; + break; + case MD_NTSTATUS_WIN_RPC_NT_WRONG_KIND_OF_BINDING: + reason = "RPC_NT_WRONG_KIND_OF_BINDING"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_BINDING: + reason = "RPC_NT_INVALID_BINDING"; + break; + case MD_NTSTATUS_WIN_RPC_NT_PROTSEQ_NOT_SUPPORTED: + reason = "RPC_NT_PROTSEQ_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_RPC_PROTSEQ: + reason = "RPC_NT_INVALID_RPC_PROTSEQ"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_STRING_UUID: + reason = "RPC_NT_INVALID_STRING_UUID"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_ENDPOINT_FORMAT: + reason = "RPC_NT_INVALID_ENDPOINT_FORMAT"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_NET_ADDR: + reason = "RPC_NT_INVALID_NET_ADDR"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_ENDPOINT_FOUND: + reason = "RPC_NT_NO_ENDPOINT_FOUND"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_TIMEOUT: + reason = "RPC_NT_INVALID_TIMEOUT"; + break; + case MD_NTSTATUS_WIN_RPC_NT_OBJECT_NOT_FOUND: + reason = "RPC_NT_OBJECT_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_RPC_NT_ALREADY_REGISTERED: + reason = "RPC_NT_ALREADY_REGISTERED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_TYPE_ALREADY_REGISTERED: + reason = "RPC_NT_TYPE_ALREADY_REGISTERED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_ALREADY_LISTENING: + reason = "RPC_NT_ALREADY_LISTENING"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_PROTSEQS_REGISTERED: + reason = "RPC_NT_NO_PROTSEQS_REGISTERED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NOT_LISTENING: + reason = "RPC_NT_NOT_LISTENING"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_MGR_TYPE: + reason = "RPC_NT_UNKNOWN_MGR_TYPE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_IF: + reason = "RPC_NT_UNKNOWN_IF"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_BINDINGS: + reason = "RPC_NT_NO_BINDINGS"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_PROTSEQS: + reason = "RPC_NT_NO_PROTSEQS"; + break; + case MD_NTSTATUS_WIN_RPC_NT_CANT_CREATE_ENDPOINT: + reason = "RPC_NT_CANT_CREATE_ENDPOINT"; + break; + case MD_NTSTATUS_WIN_RPC_NT_OUT_OF_RESOURCES: + reason = "RPC_NT_OUT_OF_RESOURCES"; + break; + case MD_NTSTATUS_WIN_RPC_NT_SERVER_UNAVAILABLE: + reason = "RPC_NT_SERVER_UNAVAILABLE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_SERVER_TOO_BUSY: + reason = "RPC_NT_SERVER_TOO_BUSY"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_NETWORK_OPTIONS: + reason = "RPC_NT_INVALID_NETWORK_OPTIONS"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_CALL_ACTIVE: + reason = "RPC_NT_NO_CALL_ACTIVE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_CALL_FAILED: + reason = "RPC_NT_CALL_FAILED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_CALL_FAILED_DNE: + reason = "RPC_NT_CALL_FAILED_DNE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_PROTOCOL_ERROR: + reason = "RPC_NT_PROTOCOL_ERROR"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_TRANS_SYN: + reason = "RPC_NT_UNSUPPORTED_TRANS_SYN"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_TYPE: + reason = "RPC_NT_UNSUPPORTED_TYPE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_TAG: + reason = "RPC_NT_INVALID_TAG"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_BOUND: + reason = "RPC_NT_INVALID_BOUND"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_ENTRY_NAME: + reason = "RPC_NT_NO_ENTRY_NAME"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_NAME_SYNTAX: + reason = "RPC_NT_INVALID_NAME_SYNTAX"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_NAME_SYNTAX: + reason = "RPC_NT_UNSUPPORTED_NAME_SYNTAX"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UUID_NO_ADDRESS: + reason = "RPC_NT_UUID_NO_ADDRESS"; + break; + case MD_NTSTATUS_WIN_RPC_NT_DUPLICATE_ENDPOINT: + reason = "RPC_NT_DUPLICATE_ENDPOINT"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHN_TYPE: + reason = "RPC_NT_UNKNOWN_AUTHN_TYPE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_MAX_CALLS_TOO_SMALL: + reason = "RPC_NT_MAX_CALLS_TOO_SMALL"; + break; + case MD_NTSTATUS_WIN_RPC_NT_STRING_TOO_LONG: + reason = "RPC_NT_STRING_TOO_LONG"; + break; + case MD_NTSTATUS_WIN_RPC_NT_PROTSEQ_NOT_FOUND: + reason = "RPC_NT_PROTSEQ_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_RPC_NT_PROCNUM_OUT_OF_RANGE: + reason = "RPC_NT_PROCNUM_OUT_OF_RANGE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_BINDING_HAS_NO_AUTH: + reason = "RPC_NT_BINDING_HAS_NO_AUTH"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHN_SERVICE: + reason = "RPC_NT_UNKNOWN_AUTHN_SERVICE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHN_LEVEL: + reason = "RPC_NT_UNKNOWN_AUTHN_LEVEL"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_AUTH_IDENTITY: + reason = "RPC_NT_INVALID_AUTH_IDENTITY"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHZ_SERVICE: + reason = "RPC_NT_UNKNOWN_AUTHZ_SERVICE"; + break; + case MD_NTSTATUS_WIN_EPT_NT_INVALID_ENTRY: + reason = "EPT_NT_INVALID_ENTRY"; + break; + case MD_NTSTATUS_WIN_EPT_NT_CANT_PERFORM_OP: + reason = "EPT_NT_CANT_PERFORM_OP"; + break; + case MD_NTSTATUS_WIN_EPT_NT_NOT_REGISTERED: + reason = "EPT_NT_NOT_REGISTERED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NOTHING_TO_EXPORT: + reason = "RPC_NT_NOTHING_TO_EXPORT"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INCOMPLETE_NAME: + reason = "RPC_NT_INCOMPLETE_NAME"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_VERS_OPTION: + reason = "RPC_NT_INVALID_VERS_OPTION"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_MORE_MEMBERS: + reason = "RPC_NT_NO_MORE_MEMBERS"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NOT_ALL_OBJS_UNEXPORTED: + reason = "RPC_NT_NOT_ALL_OBJS_UNEXPORTED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INTERFACE_NOT_FOUND: + reason = "RPC_NT_INTERFACE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_RPC_NT_ENTRY_ALREADY_EXISTS: + reason = "RPC_NT_ENTRY_ALREADY_EXISTS"; + break; + case MD_NTSTATUS_WIN_RPC_NT_ENTRY_NOT_FOUND: + reason = "RPC_NT_ENTRY_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NAME_SERVICE_UNAVAILABLE: + reason = "RPC_NT_NAME_SERVICE_UNAVAILABLE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_NAF_ID: + reason = "RPC_NT_INVALID_NAF_ID"; + break; + case MD_NTSTATUS_WIN_RPC_NT_CANNOT_SUPPORT: + reason = "RPC_NT_CANNOT_SUPPORT"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_CONTEXT_AVAILABLE: + reason = "RPC_NT_NO_CONTEXT_AVAILABLE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INTERNAL_ERROR: + reason = "RPC_NT_INTERNAL_ERROR"; + break; + case MD_NTSTATUS_WIN_RPC_NT_ZERO_DIVIDE: + reason = "RPC_NT_ZERO_DIVIDE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_ADDRESS_ERROR: + reason = "RPC_NT_ADDRESS_ERROR"; + break; + case MD_NTSTATUS_WIN_RPC_NT_FP_DIV_ZERO: + reason = "RPC_NT_FP_DIV_ZERO"; + break; + case MD_NTSTATUS_WIN_RPC_NT_FP_UNDERFLOW: + reason = "RPC_NT_FP_UNDERFLOW"; + break; + case MD_NTSTATUS_WIN_RPC_NT_FP_OVERFLOW: + reason = "RPC_NT_FP_OVERFLOW"; + break; + case MD_NTSTATUS_WIN_RPC_NT_CALL_IN_PROGRESS: + reason = "RPC_NT_CALL_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_MORE_BINDINGS: + reason = "RPC_NT_NO_MORE_BINDINGS"; + break; + case MD_NTSTATUS_WIN_RPC_NT_GROUP_MEMBER_NOT_FOUND: + reason = "RPC_NT_GROUP_MEMBER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_EPT_NT_CANT_CREATE: + reason = "EPT_NT_CANT_CREATE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_OBJECT: + reason = "RPC_NT_INVALID_OBJECT"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_INTERFACES: + reason = "RPC_NT_NO_INTERFACES"; + break; + case MD_NTSTATUS_WIN_RPC_NT_CALL_CANCELLED: + reason = "RPC_NT_CALL_CANCELLED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_BINDING_INCOMPLETE: + reason = "RPC_NT_BINDING_INCOMPLETE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_COMM_FAILURE: + reason = "RPC_NT_COMM_FAILURE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_AUTHN_LEVEL: + reason = "RPC_NT_UNSUPPORTED_AUTHN_LEVEL"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_PRINC_NAME: + reason = "RPC_NT_NO_PRINC_NAME"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NOT_RPC_ERROR: + reason = "RPC_NT_NOT_RPC_ERROR"; + break; + case MD_NTSTATUS_WIN_RPC_NT_SEC_PKG_ERROR: + reason = "RPC_NT_SEC_PKG_ERROR"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NOT_CANCELLED: + reason = "RPC_NT_NOT_CANCELLED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_ASYNC_HANDLE: + reason = "RPC_NT_INVALID_ASYNC_HANDLE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_ASYNC_CALL: + reason = "RPC_NT_INVALID_ASYNC_CALL"; + break; + case MD_NTSTATUS_WIN_RPC_NT_PROXY_ACCESS_DENIED: + reason = "RPC_NT_PROXY_ACCESS_DENIED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_COOKIE_AUTH_FAILED: + reason = "RPC_NT_COOKIE_AUTH_FAILED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NO_MORE_ENTRIES: + reason = "RPC_NT_NO_MORE_ENTRIES"; + break; + case MD_NTSTATUS_WIN_RPC_NT_SS_CHAR_TRANS_OPEN_FAIL: + reason = "RPC_NT_SS_CHAR_TRANS_OPEN_FAIL"; + break; + case MD_NTSTATUS_WIN_RPC_NT_SS_CHAR_TRANS_SHORT_FILE: + reason = "RPC_NT_SS_CHAR_TRANS_SHORT_FILE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_SS_IN_NULL_CONTEXT: + reason = "RPC_NT_SS_IN_NULL_CONTEXT"; + break; + case MD_NTSTATUS_WIN_RPC_NT_SS_CONTEXT_MISMATCH: + reason = "RPC_NT_SS_CONTEXT_MISMATCH"; + break; + case MD_NTSTATUS_WIN_RPC_NT_SS_CONTEXT_DAMAGED: + reason = "RPC_NT_SS_CONTEXT_DAMAGED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_SS_HANDLES_MISMATCH: + reason = "RPC_NT_SS_HANDLES_MISMATCH"; + break; + case MD_NTSTATUS_WIN_RPC_NT_SS_CANNOT_GET_CALL_HANDLE: + reason = "RPC_NT_SS_CANNOT_GET_CALL_HANDLE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_NULL_REF_POINTER: + reason = "RPC_NT_NULL_REF_POINTER"; + break; + case MD_NTSTATUS_WIN_RPC_NT_ENUM_VALUE_OUT_OF_RANGE: + reason = "RPC_NT_ENUM_VALUE_OUT_OF_RANGE"; + break; + case MD_NTSTATUS_WIN_RPC_NT_BYTE_COUNT_TOO_SMALL: + reason = "RPC_NT_BYTE_COUNT_TOO_SMALL"; + break; + case MD_NTSTATUS_WIN_RPC_NT_BAD_STUB_DATA: + reason = "RPC_NT_BAD_STUB_DATA"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_ES_ACTION: + reason = "RPC_NT_INVALID_ES_ACTION"; + break; + case MD_NTSTATUS_WIN_RPC_NT_WRONG_ES_VERSION: + reason = "RPC_NT_WRONG_ES_VERSION"; + break; + case MD_NTSTATUS_WIN_RPC_NT_WRONG_STUB_VERSION: + reason = "RPC_NT_WRONG_STUB_VERSION"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_PIPE_OBJECT: + reason = "RPC_NT_INVALID_PIPE_OBJECT"; + break; + case MD_NTSTATUS_WIN_RPC_NT_INVALID_PIPE_OPERATION: + reason = "RPC_NT_INVALID_PIPE_OPERATION"; + break; + case MD_NTSTATUS_WIN_RPC_NT_WRONG_PIPE_VERSION: + reason = "RPC_NT_WRONG_PIPE_VERSION"; + break; + case MD_NTSTATUS_WIN_RPC_NT_PIPE_CLOSED: + reason = "RPC_NT_PIPE_CLOSED"; + break; + case MD_NTSTATUS_WIN_RPC_NT_PIPE_DISCIPLINE_ERROR: + reason = "RPC_NT_PIPE_DISCIPLINE_ERROR"; + break; + case MD_NTSTATUS_WIN_RPC_NT_PIPE_EMPTY: + reason = "RPC_NT_PIPE_EMPTY"; + break; + case MD_NTSTATUS_WIN_STATUS_PNP_BAD_MPS_TABLE: + reason = "STATUS_PNP_BAD_MPS_TABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_PNP_TRANSLATION_FAILED: + reason = "STATUS_PNP_TRANSLATION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_PNP_IRQ_TRANSLATION_FAILED: + reason = "STATUS_PNP_IRQ_TRANSLATION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_PNP_INVALID_ID: + reason = "STATUS_PNP_INVALID_ID"; + break; + case MD_NTSTATUS_WIN_STATUS_IO_REISSUE_AS_CACHED: + reason = "STATUS_IO_REISSUE_AS_CACHED"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_NAME_INVALID: + reason = "STATUS_CTX_WINSTATION_NAME_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_INVALID_PD: + reason = "STATUS_CTX_INVALID_PD"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_PD_NOT_FOUND: + reason = "STATUS_CTX_PD_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_CLOSE_PENDING: + reason = "STATUS_CTX_CLOSE_PENDING"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_NO_OUTBUF: + reason = "STATUS_CTX_NO_OUTBUF"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_MODEM_INF_NOT_FOUND: + reason = "STATUS_CTX_MODEM_INF_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_INVALID_MODEMNAME: + reason = "STATUS_CTX_INVALID_MODEMNAME"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_RESPONSE_ERROR: + reason = "STATUS_CTX_RESPONSE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_TIMEOUT: + reason = "STATUS_CTX_MODEM_RESPONSE_TIMEOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_NO_CARRIER: + reason = "STATUS_CTX_MODEM_RESPONSE_NO_CARRIER"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE: + reason = "STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_BUSY: + reason = "STATUS_CTX_MODEM_RESPONSE_BUSY"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_VOICE: + reason = "STATUS_CTX_MODEM_RESPONSE_VOICE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_TD_ERROR: + reason = "STATUS_CTX_TD_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_LICENSE_CLIENT_INVALID: + reason = "STATUS_CTX_LICENSE_CLIENT_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_LICENSE_NOT_AVAILABLE: + reason = "STATUS_CTX_LICENSE_NOT_AVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_LICENSE_EXPIRED: + reason = "STATUS_CTX_LICENSE_EXPIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_NOT_FOUND: + reason = "STATUS_CTX_WINSTATION_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_NAME_COLLISION: + reason = "STATUS_CTX_WINSTATION_NAME_COLLISION"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_BUSY: + reason = "STATUS_CTX_WINSTATION_BUSY"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_BAD_VIDEO_MODE: + reason = "STATUS_CTX_BAD_VIDEO_MODE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_GRAPHICS_INVALID: + reason = "STATUS_CTX_GRAPHICS_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_NOT_CONSOLE: + reason = "STATUS_CTX_NOT_CONSOLE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_CLIENT_QUERY_TIMEOUT: + reason = "STATUS_CTX_CLIENT_QUERY_TIMEOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_CONSOLE_DISCONNECT: + reason = "STATUS_CTX_CONSOLE_DISCONNECT"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_CONSOLE_CONNECT: + reason = "STATUS_CTX_CONSOLE_CONNECT"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_DENIED: + reason = "STATUS_CTX_SHADOW_DENIED"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_ACCESS_DENIED: + reason = "STATUS_CTX_WINSTATION_ACCESS_DENIED"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_INVALID_WD: + reason = "STATUS_CTX_INVALID_WD"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_WD_NOT_FOUND: + reason = "STATUS_CTX_WD_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_INVALID: + reason = "STATUS_CTX_SHADOW_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_DISABLED: + reason = "STATUS_CTX_SHADOW_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_RDP_PROTOCOL_ERROR: + reason = "STATUS_RDP_PROTOCOL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_CLIENT_LICENSE_NOT_SET: + reason = "STATUS_CTX_CLIENT_LICENSE_NOT_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_CLIENT_LICENSE_IN_USE: + reason = "STATUS_CTX_CLIENT_LICENSE_IN_USE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE: + reason = "STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_NOT_RUNNING: + reason = "STATUS_CTX_SHADOW_NOT_RUNNING"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_LOGON_DISABLED: + reason = "STATUS_CTX_LOGON_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_CTX_SECURITY_LAYER_ERROR: + reason = "STATUS_CTX_SECURITY_LAYER_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_TS_INCOMPATIBLE_SESSIONS: + reason = "STATUS_TS_INCOMPATIBLE_SESSIONS"; + break; + case MD_NTSTATUS_WIN_STATUS_TS_VIDEO_SUBSYSTEM_ERROR: + reason = "STATUS_TS_VIDEO_SUBSYSTEM_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_MUI_FILE_NOT_FOUND: + reason = "STATUS_MUI_FILE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_MUI_INVALID_FILE: + reason = "STATUS_MUI_INVALID_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_MUI_INVALID_RC_CONFIG: + reason = "STATUS_MUI_INVALID_RC_CONFIG"; + break; + case MD_NTSTATUS_WIN_STATUS_MUI_INVALID_LOCALE_NAME: + reason = "STATUS_MUI_INVALID_LOCALE_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_MUI_INVALID_ULTIMATEFALLBACK_NAME: + reason = "STATUS_MUI_INVALID_ULTIMATEFALLBACK_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_MUI_FILE_NOT_LOADED: + reason = "STATUS_MUI_FILE_NOT_LOADED"; + break; + case MD_NTSTATUS_WIN_STATUS_RESOURCE_ENUM_USER_STOP: + reason = "STATUS_RESOURCE_ENUM_USER_STOP"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_NODE: + reason = "STATUS_CLUSTER_INVALID_NODE"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_EXISTS: + reason = "STATUS_CLUSTER_NODE_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_JOIN_IN_PROGRESS: + reason = "STATUS_CLUSTER_JOIN_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_NOT_FOUND: + reason = "STATUS_CLUSTER_NODE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND: + reason = "STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NETWORK_EXISTS: + reason = "STATUS_CLUSTER_NETWORK_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NETWORK_NOT_FOUND: + reason = "STATUS_CLUSTER_NETWORK_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NETINTERFACE_EXISTS: + reason = "STATUS_CLUSTER_NETINTERFACE_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NETINTERFACE_NOT_FOUND: + reason = "STATUS_CLUSTER_NETINTERFACE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_REQUEST: + reason = "STATUS_CLUSTER_INVALID_REQUEST"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_NETWORK_PROVIDER: + reason = "STATUS_CLUSTER_INVALID_NETWORK_PROVIDER"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_DOWN: + reason = "STATUS_CLUSTER_NODE_DOWN"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_UNREACHABLE: + reason = "STATUS_CLUSTER_NODE_UNREACHABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_NOT_MEMBER: + reason = "STATUS_CLUSTER_NODE_NOT_MEMBER"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS: + reason = "STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_NETWORK: + reason = "STATUS_CLUSTER_INVALID_NETWORK"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NO_NET_ADAPTERS: + reason = "STATUS_CLUSTER_NO_NET_ADAPTERS"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_UP: + reason = "STATUS_CLUSTER_NODE_UP"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_PAUSED: + reason = "STATUS_CLUSTER_NODE_PAUSED"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_NOT_PAUSED: + reason = "STATUS_CLUSTER_NODE_NOT_PAUSED"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NO_SECURITY_CONTEXT: + reason = "STATUS_CLUSTER_NO_SECURITY_CONTEXT"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NETWORK_NOT_INTERNAL: + reason = "STATUS_CLUSTER_NETWORK_NOT_INTERNAL"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_POISONED: + reason = "STATUS_CLUSTER_POISONED"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_NON_CSV_PATH: + reason = "STATUS_CLUSTER_NON_CSV_PATH"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_VOLUME_NOT_LOCAL: + reason = "STATUS_CLUSTER_CSV_VOLUME_NOT_LOCAL"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_READ_OPLOCK_BREAK_IN_PROGRESS: + reason = "STATUS_CLUSTER_CSV_READ_OPLOCK_BREAK_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_AUTO_PAUSE_ERROR: + reason = "STATUS_CLUSTER_CSV_AUTO_PAUSE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_REDIRECTED: + reason = "STATUS_CLUSTER_CSV_REDIRECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_NOT_REDIRECTED: + reason = "STATUS_CLUSTER_CSV_NOT_REDIRECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_VOLUME_DRAINING: + reason = "STATUS_CLUSTER_CSV_VOLUME_DRAINING"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_SNAPSHOT_CREATION_IN_PROGRESS: + reason = "STATUS_CLUSTER_CSV_SNAPSHOT_CREATION_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_VOLUME_DRAINING_SUCCEEDED_DOWNLEVEL: + reason = "STATUS_CLUSTER_CSV_VOLUME_DRAINING_SUCCEEDED_DOWNLEVEL"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_OPCODE: + reason = "STATUS_ACPI_INVALID_OPCODE"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_STACK_OVERFLOW: + reason = "STATUS_ACPI_STACK_OVERFLOW"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_ASSERT_FAILED: + reason = "STATUS_ACPI_ASSERT_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_INDEX: + reason = "STATUS_ACPI_INVALID_INDEX"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_ARGUMENT: + reason = "STATUS_ACPI_INVALID_ARGUMENT"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_FATAL: + reason = "STATUS_ACPI_FATAL"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_SUPERNAME: + reason = "STATUS_ACPI_INVALID_SUPERNAME"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_ARGTYPE: + reason = "STATUS_ACPI_INVALID_ARGTYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_OBJTYPE: + reason = "STATUS_ACPI_INVALID_OBJTYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_TARGETTYPE: + reason = "STATUS_ACPI_INVALID_TARGETTYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INCORRECT_ARGUMENT_COUNT: + reason = "STATUS_ACPI_INCORRECT_ARGUMENT_COUNT"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_ADDRESS_NOT_MAPPED: + reason = "STATUS_ACPI_ADDRESS_NOT_MAPPED"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_EVENTTYPE: + reason = "STATUS_ACPI_INVALID_EVENTTYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_HANDLER_COLLISION: + reason = "STATUS_ACPI_HANDLER_COLLISION"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_DATA: + reason = "STATUS_ACPI_INVALID_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_REGION: + reason = "STATUS_ACPI_INVALID_REGION"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_ACCESS_SIZE: + reason = "STATUS_ACPI_INVALID_ACCESS_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_ACQUIRE_GLOBAL_LOCK: + reason = "STATUS_ACPI_ACQUIRE_GLOBAL_LOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_ALREADY_INITIALIZED: + reason = "STATUS_ACPI_ALREADY_INITIALIZED"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_NOT_INITIALIZED: + reason = "STATUS_ACPI_NOT_INITIALIZED"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_MUTEX_LEVEL: + reason = "STATUS_ACPI_INVALID_MUTEX_LEVEL"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_MUTEX_NOT_OWNED: + reason = "STATUS_ACPI_MUTEX_NOT_OWNED"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_MUTEX_NOT_OWNER: + reason = "STATUS_ACPI_MUTEX_NOT_OWNER"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_RS_ACCESS: + reason = "STATUS_ACPI_RS_ACCESS"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_TABLE: + reason = "STATUS_ACPI_INVALID_TABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_REG_HANDLER_FAILED: + reason = "STATUS_ACPI_REG_HANDLER_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_ACPI_POWER_REQUEST_FAILED: + reason = "STATUS_ACPI_POWER_REQUEST_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_SECTION_NOT_FOUND: + reason = "STATUS_SXS_SECTION_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_CANT_GEN_ACTCTX: + reason = "STATUS_SXS_CANT_GEN_ACTCTX"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_INVALID_ACTCTXDATA_FORMAT: + reason = "STATUS_SXS_INVALID_ACTCTXDATA_FORMAT"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_ASSEMBLY_NOT_FOUND: + reason = "STATUS_SXS_ASSEMBLY_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_FORMAT_ERROR: + reason = "STATUS_SXS_MANIFEST_FORMAT_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_PARSE_ERROR: + reason = "STATUS_SXS_MANIFEST_PARSE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_ACTIVATION_CONTEXT_DISABLED: + reason = "STATUS_SXS_ACTIVATION_CONTEXT_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_KEY_NOT_FOUND: + reason = "STATUS_SXS_KEY_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_VERSION_CONFLICT: + reason = "STATUS_SXS_VERSION_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_WRONG_SECTION_TYPE: + reason = "STATUS_SXS_WRONG_SECTION_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_THREAD_QUERIES_DISABLED: + reason = "STATUS_SXS_THREAD_QUERIES_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_ASSEMBLY_MISSING: + reason = "STATUS_SXS_ASSEMBLY_MISSING"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET: + reason = "STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_EARLY_DEACTIVATION: + reason = "STATUS_SXS_EARLY_DEACTIVATION"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_INVALID_DEACTIVATION: + reason = "STATUS_SXS_INVALID_DEACTIVATION"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_MULTIPLE_DEACTIVATION: + reason = "STATUS_SXS_MULTIPLE_DEACTIVATION"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY: + reason = "STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_PROCESS_TERMINATION_REQUESTED: + reason = "STATUS_SXS_PROCESS_TERMINATION_REQUESTED"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_CORRUPT_ACTIVATION_STACK: + reason = "STATUS_SXS_CORRUPT_ACTIVATION_STACK"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_CORRUPTION: + reason = "STATUS_SXS_CORRUPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE: + reason = "STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME: + reason = "STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE: + reason = "STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_IDENTITY_PARSE_ERROR: + reason = "STATUS_SXS_IDENTITY_PARSE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_COMPONENT_STORE_CORRUPT: + reason = "STATUS_SXS_COMPONENT_STORE_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_FILE_HASH_MISMATCH: + reason = "STATUS_SXS_FILE_HASH_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT: + reason = "STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_IDENTITIES_DIFFERENT: + reason = "STATUS_SXS_IDENTITIES_DIFFERENT"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT: + reason = "STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY: + reason = "STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY"; + break; + case MD_NTSTATUS_WIN_STATUS_ADVANCED_INSTALLER_FAILED: + reason = "STATUS_ADVANCED_INSTALLER_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_XML_ENCODING_MISMATCH: + reason = "STATUS_XML_ENCODING_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_TOO_BIG: + reason = "STATUS_SXS_MANIFEST_TOO_BIG"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_SETTING_NOT_REGISTERED: + reason = "STATUS_SXS_SETTING_NOT_REGISTERED"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE: + reason = "STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE"; + break; + case MD_NTSTATUS_WIN_STATUS_SMI_PRIMITIVE_INSTALLER_FAILED: + reason = "STATUS_SMI_PRIMITIVE_INSTALLER_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_GENERIC_COMMAND_FAILED: + reason = "STATUS_GENERIC_COMMAND_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_SXS_FILE_HASH_MISSING: + reason = "STATUS_SXS_FILE_HASH_MISSING"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTIONAL_CONFLICT: + reason = "STATUS_TRANSACTIONAL_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_INVALID_TRANSACTION: + reason = "STATUS_INVALID_TRANSACTION"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_ACTIVE: + reason = "STATUS_TRANSACTION_NOT_ACTIVE"; + break; + case MD_NTSTATUS_WIN_STATUS_TM_INITIALIZATION_FAILED: + reason = "STATUS_TM_INITIALIZATION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_RM_NOT_ACTIVE: + reason = "STATUS_RM_NOT_ACTIVE"; + break; + case MD_NTSTATUS_WIN_STATUS_RM_METADATA_CORRUPT: + reason = "STATUS_RM_METADATA_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_JOINED: + reason = "STATUS_TRANSACTION_NOT_JOINED"; + break; + case MD_NTSTATUS_WIN_STATUS_DIRECTORY_NOT_RM: + reason = "STATUS_DIRECTORY_NOT_RM"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTIONS_UNSUPPORTED_REMOTE: + reason = "STATUS_TRANSACTIONS_UNSUPPORTED_REMOTE"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_RESIZE_INVALID_SIZE: + reason = "STATUS_LOG_RESIZE_INVALID_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_REMOTE_FILE_VERSION_MISMATCH: + reason = "STATUS_REMOTE_FILE_VERSION_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_CRM_PROTOCOL_ALREADY_EXISTS: + reason = "STATUS_CRM_PROTOCOL_ALREADY_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_PROPAGATION_FAILED: + reason = "STATUS_TRANSACTION_PROPAGATION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_CRM_PROTOCOL_NOT_FOUND: + reason = "STATUS_CRM_PROTOCOL_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_SUPERIOR_EXISTS: + reason = "STATUS_TRANSACTION_SUPERIOR_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_REQUEST_NOT_VALID: + reason = "STATUS_TRANSACTION_REQUEST_NOT_VALID"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_REQUESTED: + reason = "STATUS_TRANSACTION_NOT_REQUESTED"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_ALREADY_ABORTED: + reason = "STATUS_TRANSACTION_ALREADY_ABORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_ALREADY_COMMITTED: + reason = "STATUS_TRANSACTION_ALREADY_COMMITTED"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_INVALID_MARSHALL_BUFFER: + reason = "STATUS_TRANSACTION_INVALID_MARSHALL_BUFFER"; + break; + case MD_NTSTATUS_WIN_STATUS_CURRENT_TRANSACTION_NOT_VALID: + reason = "STATUS_CURRENT_TRANSACTION_NOT_VALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_GROWTH_FAILED: + reason = "STATUS_LOG_GROWTH_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_OBJECT_NO_LONGER_EXISTS: + reason = "STATUS_OBJECT_NO_LONGER_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_STREAM_MINIVERSION_NOT_FOUND: + reason = "STATUS_STREAM_MINIVERSION_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_STREAM_MINIVERSION_NOT_VALID: + reason = "STATUS_STREAM_MINIVERSION_NOT_VALID"; + break; + case MD_NTSTATUS_WIN_STATUS_MINIVERSION_INACCESSIBLE_FROM_SPECIFIED_TRANSACTION: + reason = "STATUS_MINIVERSION_INACCESSIBLE_FROM_SPECIFIED_TRANSACTION"; + break; + case MD_NTSTATUS_WIN_STATUS_CANT_OPEN_MINIVERSION_WITH_MODIFY_INTENT: + reason = "STATUS_CANT_OPEN_MINIVERSION_WITH_MODIFY_INTENT"; + break; + case MD_NTSTATUS_WIN_STATUS_CANT_CREATE_MORE_STREAM_MINIVERSIONS: + reason = "STATUS_CANT_CREATE_MORE_STREAM_MINIVERSIONS"; + break; + case MD_NTSTATUS_WIN_STATUS_HANDLE_NO_LONGER_VALID: + reason = "STATUS_HANDLE_NO_LONGER_VALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_CORRUPTION_DETECTED: + reason = "STATUS_LOG_CORRUPTION_DETECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_RM_DISCONNECTED: + reason = "STATUS_RM_DISCONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_ENLISTMENT_NOT_SUPERIOR: + reason = "STATUS_ENLISTMENT_NOT_SUPERIOR"; + break; + case MD_NTSTATUS_WIN_STATUS_FILE_IDENTITY_NOT_PERSISTENT: + reason = "STATUS_FILE_IDENTITY_NOT_PERSISTENT"; + break; + case MD_NTSTATUS_WIN_STATUS_CANT_BREAK_TRANSACTIONAL_DEPENDENCY: + reason = "STATUS_CANT_BREAK_TRANSACTIONAL_DEPENDENCY"; + break; + case MD_NTSTATUS_WIN_STATUS_CANT_CROSS_RM_BOUNDARY: + reason = "STATUS_CANT_CROSS_RM_BOUNDARY"; + break; + case MD_NTSTATUS_WIN_STATUS_TXF_DIR_NOT_EMPTY: + reason = "STATUS_TXF_DIR_NOT_EMPTY"; + break; + case MD_NTSTATUS_WIN_STATUS_INDOUBT_TRANSACTIONS_EXIST: + reason = "STATUS_INDOUBT_TRANSACTIONS_EXIST"; + break; + case MD_NTSTATUS_WIN_STATUS_TM_VOLATILE: + reason = "STATUS_TM_VOLATILE"; + break; + case MD_NTSTATUS_WIN_STATUS_ROLLBACK_TIMER_EXPIRED: + reason = "STATUS_ROLLBACK_TIMER_EXPIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_TXF_ATTRIBUTE_CORRUPT: + reason = "STATUS_TXF_ATTRIBUTE_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_EFS_NOT_ALLOWED_IN_TRANSACTION: + reason = "STATUS_EFS_NOT_ALLOWED_IN_TRANSACTION"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTIONAL_OPEN_NOT_ALLOWED: + reason = "STATUS_TRANSACTIONAL_OPEN_NOT_ALLOWED"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTED_MAPPING_UNSUPPORTED_REMOTE: + reason = "STATUS_TRANSACTED_MAPPING_UNSUPPORTED_REMOTE"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_REQUIRED_PROMOTION: + reason = "STATUS_TRANSACTION_REQUIRED_PROMOTION"; + break; + case MD_NTSTATUS_WIN_STATUS_CANNOT_EXECUTE_FILE_IN_TRANSACTION: + reason = "STATUS_CANNOT_EXECUTE_FILE_IN_TRANSACTION"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTIONS_NOT_FROZEN: + reason = "STATUS_TRANSACTIONS_NOT_FROZEN"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_FREEZE_IN_PROGRESS: + reason = "STATUS_TRANSACTION_FREEZE_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_NOT_SNAPSHOT_VOLUME: + reason = "STATUS_NOT_SNAPSHOT_VOLUME"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_SAVEPOINT_WITH_OPEN_FILES: + reason = "STATUS_NO_SAVEPOINT_WITH_OPEN_FILES"; + break; + case MD_NTSTATUS_WIN_STATUS_SPARSE_NOT_ALLOWED_IN_TRANSACTION: + reason = "STATUS_SPARSE_NOT_ALLOWED_IN_TRANSACTION"; + break; + case MD_NTSTATUS_WIN_STATUS_TM_IDENTITY_MISMATCH: + reason = "STATUS_TM_IDENTITY_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_FLOATED_SECTION: + reason = "STATUS_FLOATED_SECTION"; + break; + case MD_NTSTATUS_WIN_STATUS_CANNOT_ACCEPT_TRANSACTED_WORK: + reason = "STATUS_CANNOT_ACCEPT_TRANSACTED_WORK"; + break; + case MD_NTSTATUS_WIN_STATUS_CANNOT_ABORT_TRANSACTIONS: + reason = "STATUS_CANNOT_ABORT_TRANSACTIONS"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_FOUND: + reason = "STATUS_TRANSACTION_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_RESOURCEMANAGER_NOT_FOUND: + reason = "STATUS_RESOURCEMANAGER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_ENLISTMENT_NOT_FOUND: + reason = "STATUS_ENLISTMENT_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_NOT_FOUND: + reason = "STATUS_TRANSACTIONMANAGER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_NOT_ONLINE: + reason = "STATUS_TRANSACTIONMANAGER_NOT_ONLINE"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_RECOVERY_NAME_COLLISION: + reason = "STATUS_TRANSACTIONMANAGER_RECOVERY_NAME_COLLISION"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_ROOT: + reason = "STATUS_TRANSACTION_NOT_ROOT"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_OBJECT_EXPIRED: + reason = "STATUS_TRANSACTION_OBJECT_EXPIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_COMPRESSION_NOT_ALLOWED_IN_TRANSACTION: + reason = "STATUS_COMPRESSION_NOT_ALLOWED_IN_TRANSACTION"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_RESPONSE_NOT_ENLISTED: + reason = "STATUS_TRANSACTION_RESPONSE_NOT_ENLISTED"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_RECORD_TOO_LONG: + reason = "STATUS_TRANSACTION_RECORD_TOO_LONG"; + break; + case MD_NTSTATUS_WIN_STATUS_NO_LINK_TRACKING_IN_TRANSACTION: + reason = "STATUS_NO_LINK_TRACKING_IN_TRANSACTION"; + break; + case MD_NTSTATUS_WIN_STATUS_OPERATION_NOT_SUPPORTED_IN_TRANSACTION: + reason = "STATUS_OPERATION_NOT_SUPPORTED_IN_TRANSACTION"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_INTEGRITY_VIOLATED: + reason = "STATUS_TRANSACTION_INTEGRITY_VIOLATED"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_IDENTITY_MISMATCH: + reason = "STATUS_TRANSACTIONMANAGER_IDENTITY_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_RM_CANNOT_BE_FROZEN_FOR_SNAPSHOT: + reason = "STATUS_RM_CANNOT_BE_FROZEN_FOR_SNAPSHOT"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_MUST_WRITETHROUGH: + reason = "STATUS_TRANSACTION_MUST_WRITETHROUGH"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_NO_SUPERIOR: + reason = "STATUS_TRANSACTION_NO_SUPERIOR"; + break; + case MD_NTSTATUS_WIN_STATUS_EXPIRED_HANDLE: + reason = "STATUS_EXPIRED_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_ENLISTED: + reason = "STATUS_TRANSACTION_NOT_ENLISTED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_SECTOR_INVALID: + reason = "STATUS_LOG_SECTOR_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_SECTOR_PARITY_INVALID: + reason = "STATUS_LOG_SECTOR_PARITY_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_SECTOR_REMAPPED: + reason = "STATUS_LOG_SECTOR_REMAPPED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_BLOCK_INCOMPLETE: + reason = "STATUS_LOG_BLOCK_INCOMPLETE"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_INVALID_RANGE: + reason = "STATUS_LOG_INVALID_RANGE"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_BLOCKS_EXHAUSTED: + reason = "STATUS_LOG_BLOCKS_EXHAUSTED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_READ_CONTEXT_INVALID: + reason = "STATUS_LOG_READ_CONTEXT_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_RESTART_INVALID: + reason = "STATUS_LOG_RESTART_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_BLOCK_VERSION: + reason = "STATUS_LOG_BLOCK_VERSION"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_BLOCK_INVALID: + reason = "STATUS_LOG_BLOCK_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_READ_MODE_INVALID: + reason = "STATUS_LOG_READ_MODE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_METADATA_CORRUPT: + reason = "STATUS_LOG_METADATA_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_METADATA_INVALID: + reason = "STATUS_LOG_METADATA_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_METADATA_INCONSISTENT: + reason = "STATUS_LOG_METADATA_INCONSISTENT"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_RESERVATION_INVALID: + reason = "STATUS_LOG_RESERVATION_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_CANT_DELETE: + reason = "STATUS_LOG_CANT_DELETE"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_LIMIT_EXCEEDED: + reason = "STATUS_LOG_CONTAINER_LIMIT_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_START_OF_LOG: + reason = "STATUS_LOG_START_OF_LOG"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_POLICY_ALREADY_INSTALLED: + reason = "STATUS_LOG_POLICY_ALREADY_INSTALLED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_POLICY_NOT_INSTALLED: + reason = "STATUS_LOG_POLICY_NOT_INSTALLED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_POLICY_INVALID: + reason = "STATUS_LOG_POLICY_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_POLICY_CONFLICT: + reason = "STATUS_LOG_POLICY_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_PINNED_ARCHIVE_TAIL: + reason = "STATUS_LOG_PINNED_ARCHIVE_TAIL"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_RECORD_NONEXISTENT: + reason = "STATUS_LOG_RECORD_NONEXISTENT"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_RECORDS_RESERVED_INVALID: + reason = "STATUS_LOG_RECORDS_RESERVED_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_SPACE_RESERVED_INVALID: + reason = "STATUS_LOG_SPACE_RESERVED_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_TAIL_INVALID: + reason = "STATUS_LOG_TAIL_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_FULL: + reason = "STATUS_LOG_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_MULTIPLEXED: + reason = "STATUS_LOG_MULTIPLEXED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_DEDICATED: + reason = "STATUS_LOG_DEDICATED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_ARCHIVE_NOT_IN_PROGRESS: + reason = "STATUS_LOG_ARCHIVE_NOT_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_ARCHIVE_IN_PROGRESS: + reason = "STATUS_LOG_ARCHIVE_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_EPHEMERAL: + reason = "STATUS_LOG_EPHEMERAL"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_NOT_ENOUGH_CONTAINERS: + reason = "STATUS_LOG_NOT_ENOUGH_CONTAINERS"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_CLIENT_ALREADY_REGISTERED: + reason = "STATUS_LOG_CLIENT_ALREADY_REGISTERED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_CLIENT_NOT_REGISTERED: + reason = "STATUS_LOG_CLIENT_NOT_REGISTERED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_FULL_HANDLER_IN_PROGRESS: + reason = "STATUS_LOG_FULL_HANDLER_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_READ_FAILED: + reason = "STATUS_LOG_CONTAINER_READ_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_WRITE_FAILED: + reason = "STATUS_LOG_CONTAINER_WRITE_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_OPEN_FAILED: + reason = "STATUS_LOG_CONTAINER_OPEN_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_STATE_INVALID: + reason = "STATUS_LOG_CONTAINER_STATE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_STATE_INVALID: + reason = "STATUS_LOG_STATE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_PINNED: + reason = "STATUS_LOG_PINNED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_METADATA_FLUSH_FAILED: + reason = "STATUS_LOG_METADATA_FLUSH_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_INCONSISTENT_SECURITY: + reason = "STATUS_LOG_INCONSISTENT_SECURITY"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_APPENDED_FLUSH_FAILED: + reason = "STATUS_LOG_APPENDED_FLUSH_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_LOG_PINNED_RESERVATION: + reason = "STATUS_LOG_PINNED_RESERVATION"; + break; + case MD_NTSTATUS_WIN_STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD: + reason = "STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_NO_HANDLER_DEFINED: + reason = "STATUS_FLT_NO_HANDLER_DEFINED"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_CONTEXT_ALREADY_DEFINED: + reason = "STATUS_FLT_CONTEXT_ALREADY_DEFINED"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST: + reason = "STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_DISALLOW_FAST_IO: + reason = "STATUS_FLT_DISALLOW_FAST_IO"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_INVALID_NAME_REQUEST: + reason = "STATUS_FLT_INVALID_NAME_REQUEST"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_NOT_SAFE_TO_POST_OPERATION: + reason = "STATUS_FLT_NOT_SAFE_TO_POST_OPERATION"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_NOT_INITIALIZED: + reason = "STATUS_FLT_NOT_INITIALIZED"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_FILTER_NOT_READY: + reason = "STATUS_FLT_FILTER_NOT_READY"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_POST_OPERATION_CLEANUP: + reason = "STATUS_FLT_POST_OPERATION_CLEANUP"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_INTERNAL_ERROR: + reason = "STATUS_FLT_INTERNAL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_DELETING_OBJECT: + reason = "STATUS_FLT_DELETING_OBJECT"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_MUST_BE_NONPAGED_POOL: + reason = "STATUS_FLT_MUST_BE_NONPAGED_POOL"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_DUPLICATE_ENTRY: + reason = "STATUS_FLT_DUPLICATE_ENTRY"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_CBDQ_DISABLED: + reason = "STATUS_FLT_CBDQ_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_DO_NOT_ATTACH: + reason = "STATUS_FLT_DO_NOT_ATTACH"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_DO_NOT_DETACH: + reason = "STATUS_FLT_DO_NOT_DETACH"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_INSTANCE_ALTITUDE_COLLISION: + reason = "STATUS_FLT_INSTANCE_ALTITUDE_COLLISION"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_INSTANCE_NAME_COLLISION: + reason = "STATUS_FLT_INSTANCE_NAME_COLLISION"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_FILTER_NOT_FOUND: + reason = "STATUS_FLT_FILTER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_VOLUME_NOT_FOUND: + reason = "STATUS_FLT_VOLUME_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_INSTANCE_NOT_FOUND: + reason = "STATUS_FLT_INSTANCE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND: + reason = "STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_INVALID_CONTEXT_REGISTRATION: + reason = "STATUS_FLT_INVALID_CONTEXT_REGISTRATION"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_NAME_CACHE_MISS: + reason = "STATUS_FLT_NAME_CACHE_MISS"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_NO_DEVICE_OBJECT: + reason = "STATUS_FLT_NO_DEVICE_OBJECT"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_VOLUME_ALREADY_MOUNTED: + reason = "STATUS_FLT_VOLUME_ALREADY_MOUNTED"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_ALREADY_ENLISTED: + reason = "STATUS_FLT_ALREADY_ENLISTED"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_CONTEXT_ALREADY_LINKED: + reason = "STATUS_FLT_CONTEXT_ALREADY_LINKED"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_NO_WAITER_FOR_REPLY: + reason = "STATUS_FLT_NO_WAITER_FOR_REPLY"; + break; + case MD_NTSTATUS_WIN_STATUS_FLT_REGISTRATION_BUSY: + reason = "STATUS_FLT_REGISTRATION_BUSY"; + break; + case MD_NTSTATUS_WIN_STATUS_MONITOR_NO_DESCRIPTOR: + reason = "STATUS_MONITOR_NO_DESCRIPTOR"; + break; + case MD_NTSTATUS_WIN_STATUS_MONITOR_UNKNOWN_DESCRIPTOR_FORMAT: + reason = "STATUS_MONITOR_UNKNOWN_DESCRIPTOR_FORMAT"; + break; + case MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_DESCRIPTOR_CHECKSUM: + reason = "STATUS_MONITOR_INVALID_DESCRIPTOR_CHECKSUM"; + break; + case MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_STANDARD_TIMING_BLOCK: + reason = "STATUS_MONITOR_INVALID_STANDARD_TIMING_BLOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_MONITOR_WMI_DATABLOCK_REGISTRATION_FAILED: + reason = "STATUS_MONITOR_WMI_DATABLOCK_REGISTRATION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_SERIAL_NUMBER_MONDSC_BLOCK: + reason = "STATUS_MONITOR_INVALID_SERIAL_NUMBER_MONDSC_BLOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_USER_FRIENDLY_MONDSC_BLOCK: + reason = "STATUS_MONITOR_INVALID_USER_FRIENDLY_MONDSC_BLOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA: + reason = "STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_DETAILED_TIMING_BLOCK: + reason = "STATUS_MONITOR_INVALID_DETAILED_TIMING_BLOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_MANUFACTURE_DATE: + reason = "STATUS_MONITOR_INVALID_MANUFACTURE_DATE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NOT_EXCLUSIVE_MODE_OWNER: + reason = "STATUS_GRAPHICS_NOT_EXCLUSIVE_MODE_OWNER"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER: + reason = "STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_DISPLAY_ADAPTER: + reason = "STATUS_GRAPHICS_INVALID_DISPLAY_ADAPTER"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_WAS_RESET: + reason = "STATUS_GRAPHICS_ADAPTER_WAS_RESET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_DRIVER_MODEL: + reason = "STATUS_GRAPHICS_INVALID_DRIVER_MODEL"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_MODE_CHANGED: + reason = "STATUS_GRAPHICS_PRESENT_MODE_CHANGED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_OCCLUDED: + reason = "STATUS_GRAPHICS_PRESENT_OCCLUDED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_DENIED: + reason = "STATUS_GRAPHICS_PRESENT_DENIED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANNOTCOLORCONVERT: + reason = "STATUS_GRAPHICS_CANNOTCOLORCONVERT"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_DRIVER_MISMATCH: + reason = "STATUS_GRAPHICS_DRIVER_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_REDIRECTION_DISABLED: + reason = "STATUS_GRAPHICS_PRESENT_REDIRECTION_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_UNOCCLUDED: + reason = "STATUS_GRAPHICS_PRESENT_UNOCCLUDED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_WINDOWDC_NOT_AVAILABLE: + reason = "STATUS_GRAPHICS_WINDOWDC_NOT_AVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_WINDOWLESS_PRESENT_DISABLED: + reason = "STATUS_GRAPHICS_WINDOWLESS_PRESENT_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_VIDEO_MEMORY: + reason = "STATUS_GRAPHICS_NO_VIDEO_MEMORY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_LOCK_MEMORY: + reason = "STATUS_GRAPHICS_CANT_LOCK_MEMORY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_BUSY: + reason = "STATUS_GRAPHICS_ALLOCATION_BUSY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_TOO_MANY_REFERENCES: + reason = "STATUS_GRAPHICS_TOO_MANY_REFERENCES"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_TRY_AGAIN_LATER: + reason = "STATUS_GRAPHICS_TRY_AGAIN_LATER"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_TRY_AGAIN_NOW: + reason = "STATUS_GRAPHICS_TRY_AGAIN_NOW"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_INVALID: + reason = "STATUS_GRAPHICS_ALLOCATION_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE: + reason = "STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED: + reason = "STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_EVICT_PINNED_ALLOCATION: + reason = "STATUS_GRAPHICS_CANT_EVICT_PINNED_ALLOCATION"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ALLOCATION_USAGE: + reason = "STATUS_GRAPHICS_INVALID_ALLOCATION_USAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATION: + reason = "STATUS_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATION"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_CLOSED: + reason = "STATUS_GRAPHICS_ALLOCATION_CLOSED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ALLOCATION_INSTANCE: + reason = "STATUS_GRAPHICS_INVALID_ALLOCATION_INSTANCE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ALLOCATION_HANDLE: + reason = "STATUS_GRAPHICS_INVALID_ALLOCATION_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_WRONG_ALLOCATION_DEVICE: + reason = "STATUS_GRAPHICS_WRONG_ALLOCATION_DEVICE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_CONTENT_LOST: + reason = "STATUS_GRAPHICS_ALLOCATION_CONTENT_LOST"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE: + reason = "STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY: + reason = "STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_TOPOLOGY_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_VIDPN_TOPOLOGY_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_TOPOLOGY_CURRENTLY_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_VIDPN_TOPOLOGY_CURRENTLY_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN: + reason = "STATUS_GRAPHICS_INVALID_VIDPN"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE: + reason = "STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET: + reason = "STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_MODALITY_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_VIDPN_MODALITY_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_SOURCEMODESET: + reason = "STATUS_GRAPHICS_INVALID_VIDPN_SOURCEMODESET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TARGETMODESET: + reason = "STATUS_GRAPHICS_INVALID_VIDPN_TARGETMODESET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_FREQUENCY: + reason = "STATUS_GRAPHICS_INVALID_FREQUENCY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ACTIVE_REGION: + reason = "STATUS_GRAPHICS_INVALID_ACTIVE_REGION"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_TOTAL_REGION: + reason = "STATUS_GRAPHICS_INVALID_TOTAL_REGION"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE_MODE: + reason = "STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE_MODE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET_MODE: + reason = "STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET_MODE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PINNED_MODE_MUST_REMAIN_IN_SET: + reason = "STATUS_GRAPHICS_PINNED_MODE_MUST_REMAIN_IN_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PATH_ALREADY_IN_TOPOLOGY: + reason = "STATUS_GRAPHICS_PATH_ALREADY_IN_TOPOLOGY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET: + reason = "STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEOPRESENTSOURCESET: + reason = "STATUS_GRAPHICS_INVALID_VIDEOPRESENTSOURCESET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEOPRESENTTARGETSET: + reason = "STATUS_GRAPHICS_INVALID_VIDEOPRESENTTARGETSET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_SOURCE_ALREADY_IN_SET: + reason = "STATUS_GRAPHICS_SOURCE_ALREADY_IN_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_TARGET_ALREADY_IN_SET: + reason = "STATUS_GRAPHICS_TARGET_ALREADY_IN_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_PRESENT_PATH: + reason = "STATUS_GRAPHICS_INVALID_VIDPN_PRESENT_PATH"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_RECOMMENDED_VIDPN_TOPOLOGY: + reason = "STATUS_GRAPHICS_NO_RECOMMENDED_VIDPN_TOPOLOGY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGESET: + reason = "STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGESET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE: + reason = "STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_FREQUENCYRANGE_NOT_IN_SET: + reason = "STATUS_GRAPHICS_FREQUENCYRANGE_NOT_IN_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_FREQUENCYRANGE_ALREADY_IN_SET: + reason = "STATUS_GRAPHICS_FREQUENCYRANGE_ALREADY_IN_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_STALE_MODESET: + reason = "STATUS_GRAPHICS_STALE_MODESET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_SOURCEMODESET: + reason = "STATUS_GRAPHICS_INVALID_MONITOR_SOURCEMODESET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_SOURCE_MODE: + reason = "STATUS_GRAPHICS_INVALID_MONITOR_SOURCE_MODE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN: + reason = "STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MODE_ID_MUST_BE_UNIQUE: + reason = "STATUS_GRAPHICS_MODE_ID_MUST_BE_UNIQUE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_EMPTY_ADAPTER_MONITOR_MODE_SUPPORT_INTERSECTION: + reason = "STATUS_GRAPHICS_EMPTY_ADAPTER_MONITOR_MODE_SUPPORT_INTERSECTION"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDEO_PRESENT_TARGETS_LESS_THAN_SOURCES: + reason = "STATUS_GRAPHICS_VIDEO_PRESENT_TARGETS_LESS_THAN_SOURCES"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PATH_NOT_IN_TOPOLOGY: + reason = "STATUS_GRAPHICS_PATH_NOT_IN_TOPOLOGY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_SOURCE: + reason = "STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_SOURCE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_TARGET: + reason = "STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_TARGET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITORDESCRIPTORSET: + reason = "STATUS_GRAPHICS_INVALID_MONITORDESCRIPTORSET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITORDESCRIPTOR: + reason = "STATUS_GRAPHICS_INVALID_MONITORDESCRIPTOR"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITORDESCRIPTOR_NOT_IN_SET: + reason = "STATUS_GRAPHICS_MONITORDESCRIPTOR_NOT_IN_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITORDESCRIPTOR_ALREADY_IN_SET: + reason = "STATUS_GRAPHICS_MONITORDESCRIPTOR_ALREADY_IN_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITORDESCRIPTOR_ID_MUST_BE_UNIQUE: + reason = "STATUS_GRAPHICS_MONITORDESCRIPTOR_ID_MUST_BE_UNIQUE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TARGET_SUBSET_TYPE: + reason = "STATUS_GRAPHICS_INVALID_VIDPN_TARGET_SUBSET_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_RESOURCES_NOT_RELATED: + reason = "STATUS_GRAPHICS_RESOURCES_NOT_RELATED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_SOURCE_ID_MUST_BE_UNIQUE: + reason = "STATUS_GRAPHICS_SOURCE_ID_MUST_BE_UNIQUE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_TARGET_ID_MUST_BE_UNIQUE: + reason = "STATUS_GRAPHICS_TARGET_ID_MUST_BE_UNIQUE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_AVAILABLE_VIDPN_TARGET: + reason = "STATUS_GRAPHICS_NO_AVAILABLE_VIDPN_TARGET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITOR_COULD_NOT_BE_ASSOCIATED_WITH_ADAPTER: + reason = "STATUS_GRAPHICS_MONITOR_COULD_NOT_BE_ASSOCIATED_WITH_ADAPTER"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_VIDPNMGR: + reason = "STATUS_GRAPHICS_NO_VIDPNMGR"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_ACTIVE_VIDPN: + reason = "STATUS_GRAPHICS_NO_ACTIVE_VIDPN"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_STALE_VIDPN_TOPOLOGY: + reason = "STATUS_GRAPHICS_STALE_VIDPN_TOPOLOGY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITOR_NOT_CONNECTED: + reason = "STATUS_GRAPHICS_MONITOR_NOT_CONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY: + reason = "STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE: + reason = "STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VISIBLEREGION_SIZE: + reason = "STATUS_GRAPHICS_INVALID_VISIBLEREGION_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_STRIDE: + reason = "STATUS_GRAPHICS_INVALID_STRIDE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PIXELFORMAT: + reason = "STATUS_GRAPHICS_INVALID_PIXELFORMAT"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_COLORBASIS: + reason = "STATUS_GRAPHICS_INVALID_COLORBASIS"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PIXELVALUEACCESSMODE: + reason = "STATUS_GRAPHICS_INVALID_PIXELVALUEACCESSMODE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_TARGET_NOT_IN_TOPOLOGY: + reason = "STATUS_GRAPHICS_TARGET_NOT_IN_TOPOLOGY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_DISPLAY_MODE_MANAGEMENT_SUPPORT: + reason = "STATUS_GRAPHICS_NO_DISPLAY_MODE_MANAGEMENT_SUPPORT"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE: + reason = "STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_ACCESS_ACTIVE_VIDPN: + reason = "STATUS_GRAPHICS_CANT_ACCESS_ACTIVE_VIDPN"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PATH_IMPORTANCE_ORDINAL: + reason = "STATUS_GRAPHICS_INVALID_PATH_IMPORTANCE_ORDINAL"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PATH_CONTENT_GEOMETRY_TRANSFORMATION: + reason = "STATUS_GRAPHICS_INVALID_PATH_CONTENT_GEOMETRY_TRANSFORMATION"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_GAMMA_RAMP: + reason = "STATUS_GRAPHICS_INVALID_GAMMA_RAMP"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_GAMMA_RAMP_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_GAMMA_RAMP_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MULTISAMPLING_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_MULTISAMPLING_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MODE_NOT_IN_MODESET: + reason = "STATUS_GRAPHICS_MODE_NOT_IN_MODESET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY_RECOMMENDATION_REASON: + reason = "STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY_RECOMMENDATION_REASON"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PATH_CONTENT_TYPE: + reason = "STATUS_GRAPHICS_INVALID_PATH_CONTENT_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_COPYPROTECTION_TYPE: + reason = "STATUS_GRAPHICS_INVALID_COPYPROTECTION_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_UNASSIGNED_MODESET_ALREADY_EXISTS: + reason = "STATUS_GRAPHICS_UNASSIGNED_MODESET_ALREADY_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_SCANLINE_ORDERING: + reason = "STATUS_GRAPHICS_INVALID_SCANLINE_ORDERING"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_TOPOLOGY_CHANGES_NOT_ALLOWED: + reason = "STATUS_GRAPHICS_TOPOLOGY_CHANGES_NOT_ALLOWED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_AVAILABLE_IMPORTANCE_ORDINALS: + reason = "STATUS_GRAPHICS_NO_AVAILABLE_IMPORTANCE_ORDINALS"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INCOMPATIBLE_PRIVATE_FORMAT: + reason = "STATUS_GRAPHICS_INCOMPATIBLE_PRIVATE_FORMAT"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MODE_PRUNING_ALGORITHM: + reason = "STATUS_GRAPHICS_INVALID_MODE_PRUNING_ALGORITHM"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_CAPABILITY_ORIGIN: + reason = "STATUS_GRAPHICS_INVALID_MONITOR_CAPABILITY_ORIGIN"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE_CONSTRAINT: + reason = "STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE_CONSTRAINT"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MAX_NUM_PATHS_REACHED: + reason = "STATUS_GRAPHICS_MAX_NUM_PATHS_REACHED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANCEL_VIDPN_TOPOLOGY_AUGMENTATION: + reason = "STATUS_GRAPHICS_CANCEL_VIDPN_TOPOLOGY_AUGMENTATION"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_CLIENT_TYPE: + reason = "STATUS_GRAPHICS_INVALID_CLIENT_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CLIENTVIDPN_NOT_SET: + reason = "STATUS_GRAPHICS_CLIENTVIDPN_NOT_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_SPECIFIED_CHILD_ALREADY_CONNECTED: + reason = "STATUS_GRAPHICS_SPECIFIED_CHILD_ALREADY_CONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHILD_DESCRIPTOR_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_CHILD_DESCRIPTOR_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NOT_A_LINKED_ADAPTER: + reason = "STATUS_GRAPHICS_NOT_A_LINKED_ADAPTER"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_LEADLINK_NOT_ENUMERATED: + reason = "STATUS_GRAPHICS_LEADLINK_NOT_ENUMERATED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHAINLINKS_NOT_ENUMERATED: + reason = "STATUS_GRAPHICS_CHAINLINKS_NOT_ENUMERATED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_CHAIN_NOT_READY: + reason = "STATUS_GRAPHICS_ADAPTER_CHAIN_NOT_READY"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHAINLINKS_NOT_STARTED: + reason = "STATUS_GRAPHICS_CHAINLINKS_NOT_STARTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHAINLINKS_NOT_POWERED_ON: + reason = "STATUS_GRAPHICS_CHAINLINKS_NOT_POWERED_ON"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INCONSISTENT_DEVICE_LINK_STATE: + reason = "STATUS_GRAPHICS_INCONSISTENT_DEVICE_LINK_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NOT_POST_DEVICE_DRIVER: + reason = "STATUS_GRAPHICS_NOT_POST_DEVICE_DRIVER"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_ACCESS_NOT_EXCLUDED: + reason = "STATUS_GRAPHICS_ADAPTER_ACCESS_NOT_EXCLUDED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_OPM_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_COPP_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_COPP_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_UAB_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_UAB_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_ENCRYPTED_PARAMETERS: + reason = "STATUS_GRAPHICS_OPM_INVALID_ENCRYPTED_PARAMETERS"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_NO_PROTECTED_OUTPUTS_EXIST: + reason = "STATUS_GRAPHICS_OPM_NO_PROTECTED_OUTPUTS_EXIST"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INTERNAL_ERROR: + reason = "STATUS_GRAPHICS_OPM_INTERNAL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_HANDLE: + reason = "STATUS_GRAPHICS_OPM_INVALID_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PVP_INVALID_CERTIFICATE_LENGTH: + reason = "STATUS_GRAPHICS_PVP_INVALID_CERTIFICATE_LENGTH"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_SPANNING_MODE_ENABLED: + reason = "STATUS_GRAPHICS_OPM_SPANNING_MODE_ENABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_THEATER_MODE_ENABLED: + reason = "STATUS_GRAPHICS_OPM_THEATER_MODE_ENABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PVP_HFS_FAILED: + reason = "STATUS_GRAPHICS_PVP_HFS_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_SRM: + reason = "STATUS_GRAPHICS_OPM_INVALID_SRM"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_HDCP: + reason = "STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_HDCP"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_ACP: + reason = "STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_ACP"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_CGMSA: + reason = "STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_CGMSA"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_HDCP_SRM_NEVER_SET: + reason = "STATUS_GRAPHICS_OPM_HDCP_SRM_NEVER_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_RESOLUTION_TOO_HIGH: + reason = "STATUS_GRAPHICS_OPM_RESOLUTION_TOO_HIGH"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_ALL_HDCP_HARDWARE_ALREADY_IN_USE: + reason = "STATUS_GRAPHICS_OPM_ALL_HDCP_HARDWARE_ALREADY_IN_USE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_NO_LONGER_EXISTS: + reason = "STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_NO_LONGER_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_COPP_SEMANTICS: + reason = "STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_COPP_SEMANTICS"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_INFORMATION_REQUEST: + reason = "STATUS_GRAPHICS_OPM_INVALID_INFORMATION_REQUEST"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_DRIVER_INTERNAL_ERROR: + reason = "STATUS_GRAPHICS_OPM_DRIVER_INTERNAL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_OPM_SEMANTICS: + reason = "STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_OPM_SEMANTICS"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_SIGNALING_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_OPM_SIGNALING_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_CONFIGURATION_REQUEST: + reason = "STATUS_GRAPHICS_OPM_INVALID_CONFIGURATION_REQUEST"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_I2C_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_DEVICE_DOES_NOT_EXIST: + reason = "STATUS_GRAPHICS_I2C_DEVICE_DOES_NOT_EXIST"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA: + reason = "STATUS_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_ERROR_RECEIVING_DATA: + reason = "STATUS_GRAPHICS_I2C_ERROR_RECEIVING_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_VCP_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_DDCCI_VCP_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_DATA: + reason = "STATUS_GRAPHICS_DDCCI_INVALID_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_MONITOR_RETURNED_INVALID_TIMING_STATUS_BYTE: + reason = "STATUS_GRAPHICS_DDCCI_MONITOR_RETURNED_INVALID_TIMING_STATUS_BYTE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_CAPABILITIES_STRING: + reason = "STATUS_GRAPHICS_DDCCI_INVALID_CAPABILITIES_STRING"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MCA_INTERNAL_ERROR: + reason = "STATUS_GRAPHICS_MCA_INTERNAL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_COMMAND: + reason = "STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_COMMAND"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_LENGTH: + reason = "STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_LENGTH"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_CHECKSUM: + reason = "STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_CHECKSUM"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PHYSICAL_MONITOR_HANDLE: + reason = "STATUS_GRAPHICS_INVALID_PHYSICAL_MONITOR_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITOR_NO_LONGER_EXISTS: + reason = "STATUS_GRAPHICS_MONITOR_NO_LONGER_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_ONLY_CONSOLE_SESSION_SUPPORTED: + reason = "STATUS_GRAPHICS_ONLY_CONSOLE_SESSION_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME: + reason = "STATUS_GRAPHICS_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP: + reason = "STATUS_GRAPHICS_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_MIRRORING_DEVICES_NOT_SUPPORTED: + reason = "STATUS_GRAPHICS_MIRRORING_DEVICES_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_POINTER: + reason = "STATUS_GRAPHICS_INVALID_POINTER"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE: + reason = "STATUS_GRAPHICS_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_PARAMETER_ARRAY_TOO_SMALL: + reason = "STATUS_GRAPHICS_PARAMETER_ARRAY_TOO_SMALL"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_INTERNAL_ERROR: + reason = "STATUS_GRAPHICS_INTERNAL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_GRAPHICS_SESSION_TYPE_CHANGE_IN_PROGRESS: + reason = "STATUS_GRAPHICS_SESSION_TYPE_CHANGE_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_LOCKED_VOLUME: + reason = "STATUS_FVE_LOCKED_VOLUME"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_NOT_ENCRYPTED: + reason = "STATUS_FVE_NOT_ENCRYPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_BAD_INFORMATION: + reason = "STATUS_FVE_BAD_INFORMATION"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_TOO_SMALL: + reason = "STATUS_FVE_TOO_SMALL"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_FAILED_WRONG_FS: + reason = "STATUS_FVE_FAILED_WRONG_FS"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_BAD_PARTITION_SIZE: + reason = "STATUS_FVE_BAD_PARTITION_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_FS_NOT_EXTENDED: + reason = "STATUS_FVE_FS_NOT_EXTENDED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_FS_MOUNTED: + reason = "STATUS_FVE_FS_MOUNTED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_NO_LICENSE: + reason = "STATUS_FVE_NO_LICENSE"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_ACTION_NOT_ALLOWED: + reason = "STATUS_FVE_ACTION_NOT_ALLOWED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_BAD_DATA: + reason = "STATUS_FVE_BAD_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_VOLUME_NOT_BOUND: + reason = "STATUS_FVE_VOLUME_NOT_BOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_NOT_DATA_VOLUME: + reason = "STATUS_FVE_NOT_DATA_VOLUME"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_CONV_READ_ERROR: + reason = "STATUS_FVE_CONV_READ_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_CONV_WRITE_ERROR: + reason = "STATUS_FVE_CONV_WRITE_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_OVERLAPPED_UPDATE: + reason = "STATUS_FVE_OVERLAPPED_UPDATE"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_FAILED_SECTOR_SIZE: + reason = "STATUS_FVE_FAILED_SECTOR_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_FAILED_AUTHENTICATION: + reason = "STATUS_FVE_FAILED_AUTHENTICATION"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_NOT_OS_VOLUME: + reason = "STATUS_FVE_NOT_OS_VOLUME"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_KEYFILE_NOT_FOUND: + reason = "STATUS_FVE_KEYFILE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_KEYFILE_INVALID: + reason = "STATUS_FVE_KEYFILE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_KEYFILE_NO_VMK: + reason = "STATUS_FVE_KEYFILE_NO_VMK"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_TPM_DISABLED: + reason = "STATUS_FVE_TPM_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_TPM_SRK_AUTH_NOT_ZERO: + reason = "STATUS_FVE_TPM_SRK_AUTH_NOT_ZERO"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_TPM_INVALID_PCR: + reason = "STATUS_FVE_TPM_INVALID_PCR"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_TPM_NO_VMK: + reason = "STATUS_FVE_TPM_NO_VMK"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_PIN_INVALID: + reason = "STATUS_FVE_PIN_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_AUTH_INVALID_APPLICATION: + reason = "STATUS_FVE_AUTH_INVALID_APPLICATION"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_AUTH_INVALID_CONFIG: + reason = "STATUS_FVE_AUTH_INVALID_CONFIG"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_DEBUGGER_ENABLED: + reason = "STATUS_FVE_DEBUGGER_ENABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_DRY_RUN_FAILED: + reason = "STATUS_FVE_DRY_RUN_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_BAD_METADATA_POINTER: + reason = "STATUS_FVE_BAD_METADATA_POINTER"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_OLD_METADATA_COPY: + reason = "STATUS_FVE_OLD_METADATA_COPY"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_REBOOT_REQUIRED: + reason = "STATUS_FVE_REBOOT_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_RAW_ACCESS: + reason = "STATUS_FVE_RAW_ACCESS"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_RAW_BLOCKED: + reason = "STATUS_FVE_RAW_BLOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_NO_AUTOUNLOCK_MASTER_KEY: + reason = "STATUS_FVE_NO_AUTOUNLOCK_MASTER_KEY"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_MOR_FAILED: + reason = "STATUS_FVE_MOR_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_NO_FEATURE_LICENSE: + reason = "STATUS_FVE_NO_FEATURE_LICENSE"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_POLICY_USER_DISABLE_RDV_NOT_ALLOWED: + reason = "STATUS_FVE_POLICY_USER_DISABLE_RDV_NOT_ALLOWED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_CONV_RECOVERY_FAILED: + reason = "STATUS_FVE_CONV_RECOVERY_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_VIRTUALIZED_SPACE_TOO_BIG: + reason = "STATUS_FVE_VIRTUALIZED_SPACE_TOO_BIG"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_INVALID_DATUM_TYPE: + reason = "STATUS_FVE_INVALID_DATUM_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_VOLUME_TOO_SMALL: + reason = "STATUS_FVE_VOLUME_TOO_SMALL"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_ENH_PIN_INVALID: + reason = "STATUS_FVE_ENH_PIN_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_FULL_ENCRYPTION_NOT_ALLOWED_ON_TP_STORAGE: + reason = "STATUS_FVE_FULL_ENCRYPTION_NOT_ALLOWED_ON_TP_STORAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_WIPE_NOT_ALLOWED_ON_TP_STORAGE: + reason = "STATUS_FVE_WIPE_NOT_ALLOWED_ON_TP_STORAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_NOT_ALLOWED_ON_CSV_STACK: + reason = "STATUS_FVE_NOT_ALLOWED_ON_CSV_STACK"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_NOT_ALLOWED_ON_CLUSTER: + reason = "STATUS_FVE_NOT_ALLOWED_ON_CLUSTER"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_NOT_ALLOWED_TO_UPGRADE_WHILE_CONVERTING: + reason = "STATUS_FVE_NOT_ALLOWED_TO_UPGRADE_WHILE_CONVERTING"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_WIPE_CANCEL_NOT_APPLICABLE: + reason = "STATUS_FVE_WIPE_CANCEL_NOT_APPLICABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_EDRIVE_DRY_RUN_FAILED: + reason = "STATUS_FVE_EDRIVE_DRY_RUN_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_SECUREBOOT_DISABLED: + reason = "STATUS_FVE_SECUREBOOT_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_SECUREBOOT_CONFIG_CHANGE: + reason = "STATUS_FVE_SECUREBOOT_CONFIG_CHANGE"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_DEVICE_LOCKEDOUT: + reason = "STATUS_FVE_DEVICE_LOCKEDOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_VOLUME_EXTEND_PREVENTS_EOW_DECRYPT: + reason = "STATUS_FVE_VOLUME_EXTEND_PREVENTS_EOW_DECRYPT"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_NOT_DE_VOLUME: + reason = "STATUS_FVE_NOT_DE_VOLUME"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_PROTECTION_DISABLED: + reason = "STATUS_FVE_PROTECTION_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_FVE_PROTECTION_CANNOT_BE_DISABLED: + reason = "STATUS_FVE_PROTECTION_CANNOT_BE_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_CALLOUT_NOT_FOUND: + reason = "STATUS_FWP_CALLOUT_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_CONDITION_NOT_FOUND: + reason = "STATUS_FWP_CONDITION_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_FILTER_NOT_FOUND: + reason = "STATUS_FWP_FILTER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_LAYER_NOT_FOUND: + reason = "STATUS_FWP_LAYER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_PROVIDER_NOT_FOUND: + reason = "STATUS_FWP_PROVIDER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_PROVIDER_CONTEXT_NOT_FOUND: + reason = "STATUS_FWP_PROVIDER_CONTEXT_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_SUBLAYER_NOT_FOUND: + reason = "STATUS_FWP_SUBLAYER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_NOT_FOUND: + reason = "STATUS_FWP_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_ALREADY_EXISTS: + reason = "STATUS_FWP_ALREADY_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_IN_USE: + reason = "STATUS_FWP_IN_USE"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS: + reason = "STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_WRONG_SESSION: + reason = "STATUS_FWP_WRONG_SESSION"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_NO_TXN_IN_PROGRESS: + reason = "STATUS_FWP_NO_TXN_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_TXN_IN_PROGRESS: + reason = "STATUS_FWP_TXN_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_TXN_ABORTED: + reason = "STATUS_FWP_TXN_ABORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_SESSION_ABORTED: + reason = "STATUS_FWP_SESSION_ABORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_TXN: + reason = "STATUS_FWP_INCOMPATIBLE_TXN"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_TIMEOUT: + reason = "STATUS_FWP_TIMEOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_NET_EVENTS_DISABLED: + reason = "STATUS_FWP_NET_EVENTS_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_LAYER: + reason = "STATUS_FWP_INCOMPATIBLE_LAYER"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_KM_CLIENTS_ONLY: + reason = "STATUS_FWP_KM_CLIENTS_ONLY"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_LIFETIME_MISMATCH: + reason = "STATUS_FWP_LIFETIME_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_BUILTIN_OBJECT: + reason = "STATUS_FWP_BUILTIN_OBJECT"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_TOO_MANY_CALLOUTS: + reason = "STATUS_FWP_TOO_MANY_CALLOUTS"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_NOTIFICATION_DROPPED: + reason = "STATUS_FWP_NOTIFICATION_DROPPED"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_TRAFFIC_MISMATCH: + reason = "STATUS_FWP_TRAFFIC_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_SA_STATE: + reason = "STATUS_FWP_INCOMPATIBLE_SA_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_NULL_POINTER: + reason = "STATUS_FWP_NULL_POINTER"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_ENUMERATOR: + reason = "STATUS_FWP_INVALID_ENUMERATOR"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_FLAGS: + reason = "STATUS_FWP_INVALID_FLAGS"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_NET_MASK: + reason = "STATUS_FWP_INVALID_NET_MASK"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_RANGE: + reason = "STATUS_FWP_INVALID_RANGE"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_INTERVAL: + reason = "STATUS_FWP_INVALID_INTERVAL"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_ZERO_LENGTH_ARRAY: + reason = "STATUS_FWP_ZERO_LENGTH_ARRAY"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_NULL_DISPLAY_NAME: + reason = "STATUS_FWP_NULL_DISPLAY_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_ACTION_TYPE: + reason = "STATUS_FWP_INVALID_ACTION_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_WEIGHT: + reason = "STATUS_FWP_INVALID_WEIGHT"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_MATCH_TYPE_MISMATCH: + reason = "STATUS_FWP_MATCH_TYPE_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_TYPE_MISMATCH: + reason = "STATUS_FWP_TYPE_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_OUT_OF_BOUNDS: + reason = "STATUS_FWP_OUT_OF_BOUNDS"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_RESERVED: + reason = "STATUS_FWP_RESERVED"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_DUPLICATE_CONDITION: + reason = "STATUS_FWP_DUPLICATE_CONDITION"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_DUPLICATE_KEYMOD: + reason = "STATUS_FWP_DUPLICATE_KEYMOD"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_ACTION_INCOMPATIBLE_WITH_LAYER: + reason = "STATUS_FWP_ACTION_INCOMPATIBLE_WITH_LAYER"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_ACTION_INCOMPATIBLE_WITH_SUBLAYER: + reason = "STATUS_FWP_ACTION_INCOMPATIBLE_WITH_SUBLAYER"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_LAYER: + reason = "STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_LAYER"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_CALLOUT: + reason = "STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_CALLOUT"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_AUTH_METHOD: + reason = "STATUS_FWP_INCOMPATIBLE_AUTH_METHOD"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_DH_GROUP: + reason = "STATUS_FWP_INCOMPATIBLE_DH_GROUP"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_EM_NOT_SUPPORTED: + reason = "STATUS_FWP_EM_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_NEVER_MATCH: + reason = "STATUS_FWP_NEVER_MATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_PROVIDER_CONTEXT_MISMATCH: + reason = "STATUS_FWP_PROVIDER_CONTEXT_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_PARAMETER: + reason = "STATUS_FWP_INVALID_PARAMETER"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_TOO_MANY_SUBLAYERS: + reason = "STATUS_FWP_TOO_MANY_SUBLAYERS"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_CALLOUT_NOTIFICATION_FAILED: + reason = "STATUS_FWP_CALLOUT_NOTIFICATION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_AUTH_TRANSFORM: + reason = "STATUS_FWP_INVALID_AUTH_TRANSFORM"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_CIPHER_TRANSFORM: + reason = "STATUS_FWP_INVALID_CIPHER_TRANSFORM"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_CIPHER_TRANSFORM: + reason = "STATUS_FWP_INCOMPATIBLE_CIPHER_TRANSFORM"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_TRANSFORM_COMBINATION: + reason = "STATUS_FWP_INVALID_TRANSFORM_COMBINATION"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_DUPLICATE_AUTH_METHOD: + reason = "STATUS_FWP_DUPLICATE_AUTH_METHOD"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_TUNNEL_ENDPOINT: + reason = "STATUS_FWP_INVALID_TUNNEL_ENDPOINT"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_L2_DRIVER_NOT_READY: + reason = "STATUS_FWP_L2_DRIVER_NOT_READY"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_KEY_DICTATOR_ALREADY_REGISTERED: + reason = "STATUS_FWP_KEY_DICTATOR_ALREADY_REGISTERED"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_KEY_DICTATION_INVALID_KEYING_MATERIAL: + reason = "STATUS_FWP_KEY_DICTATION_INVALID_KEYING_MATERIAL"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_CONNECTIONS_DISABLED: + reason = "STATUS_FWP_CONNECTIONS_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INVALID_DNS_NAME: + reason = "STATUS_FWP_INVALID_DNS_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_STILL_ON: + reason = "STATUS_FWP_STILL_ON"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_IKEEXT_NOT_RUNNING: + reason = "STATUS_FWP_IKEEXT_NOT_RUNNING"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_TCPIP_NOT_READY: + reason = "STATUS_FWP_TCPIP_NOT_READY"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INJECT_HANDLE_CLOSING: + reason = "STATUS_FWP_INJECT_HANDLE_CLOSING"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_INJECT_HANDLE_STALE: + reason = "STATUS_FWP_INJECT_HANDLE_STALE"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_CANNOT_PEND: + reason = "STATUS_FWP_CANNOT_PEND"; + break; + case MD_NTSTATUS_WIN_STATUS_FWP_DROP_NOICMP: + reason = "STATUS_FWP_DROP_NOICMP"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_CLOSING: + reason = "STATUS_NDIS_CLOSING"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_BAD_VERSION: + reason = "STATUS_NDIS_BAD_VERSION"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_BAD_CHARACTERISTICS: + reason = "STATUS_NDIS_BAD_CHARACTERISTICS"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_ADAPTER_NOT_FOUND: + reason = "STATUS_NDIS_ADAPTER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_OPEN_FAILED: + reason = "STATUS_NDIS_OPEN_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_DEVICE_FAILED: + reason = "STATUS_NDIS_DEVICE_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_MULTICAST_FULL: + reason = "STATUS_NDIS_MULTICAST_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_MULTICAST_EXISTS: + reason = "STATUS_NDIS_MULTICAST_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_MULTICAST_NOT_FOUND: + reason = "STATUS_NDIS_MULTICAST_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_REQUEST_ABORTED: + reason = "STATUS_NDIS_REQUEST_ABORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_RESET_IN_PROGRESS: + reason = "STATUS_NDIS_RESET_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_PACKET: + reason = "STATUS_NDIS_INVALID_PACKET"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_DEVICE_REQUEST: + reason = "STATUS_NDIS_INVALID_DEVICE_REQUEST"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_ADAPTER_NOT_READY: + reason = "STATUS_NDIS_ADAPTER_NOT_READY"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_LENGTH: + reason = "STATUS_NDIS_INVALID_LENGTH"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_DATA: + reason = "STATUS_NDIS_INVALID_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_BUFFER_TOO_SHORT: + reason = "STATUS_NDIS_BUFFER_TOO_SHORT"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_OID: + reason = "STATUS_NDIS_INVALID_OID"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_ADAPTER_REMOVED: + reason = "STATUS_NDIS_ADAPTER_REMOVED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_UNSUPPORTED_MEDIA: + reason = "STATUS_NDIS_UNSUPPORTED_MEDIA"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_GROUP_ADDRESS_IN_USE: + reason = "STATUS_NDIS_GROUP_ADDRESS_IN_USE"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_FILE_NOT_FOUND: + reason = "STATUS_NDIS_FILE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_ERROR_READING_FILE: + reason = "STATUS_NDIS_ERROR_READING_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_ALREADY_MAPPED: + reason = "STATUS_NDIS_ALREADY_MAPPED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_RESOURCE_CONFLICT: + reason = "STATUS_NDIS_RESOURCE_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_MEDIA_DISCONNECTED: + reason = "STATUS_NDIS_MEDIA_DISCONNECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_ADDRESS: + reason = "STATUS_NDIS_INVALID_ADDRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_PAUSED: + reason = "STATUS_NDIS_PAUSED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_INTERFACE_NOT_FOUND: + reason = "STATUS_NDIS_INTERFACE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_UNSUPPORTED_REVISION: + reason = "STATUS_NDIS_UNSUPPORTED_REVISION"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_PORT: + reason = "STATUS_NDIS_INVALID_PORT"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_PORT_STATE: + reason = "STATUS_NDIS_INVALID_PORT_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_LOW_POWER_STATE: + reason = "STATUS_NDIS_LOW_POWER_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_REINIT_REQUIRED: + reason = "STATUS_NDIS_REINIT_REQUIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_NOT_SUPPORTED: + reason = "STATUS_NDIS_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_OFFLOAD_POLICY: + reason = "STATUS_NDIS_OFFLOAD_POLICY"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED: + reason = "STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_OFFLOAD_PATH_REJECTED: + reason = "STATUS_NDIS_OFFLOAD_PATH_REJECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED: + reason = "STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_DOT11_MEDIA_IN_USE: + reason = "STATUS_NDIS_DOT11_MEDIA_IN_USE"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_DOT11_POWER_STATE_INVALID: + reason = "STATUS_NDIS_DOT11_POWER_STATE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL: + reason = "STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL: + reason = "STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_ERROR_MASK: + reason = "STATUS_TPM_ERROR_MASK"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_AUTHFAIL: + reason = "STATUS_TPM_AUTHFAIL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BADINDEX: + reason = "STATUS_TPM_BADINDEX"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_PARAMETER: + reason = "STATUS_TPM_BAD_PARAMETER"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_AUDITFAILURE: + reason = "STATUS_TPM_AUDITFAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_CLEAR_DISABLED: + reason = "STATUS_TPM_CLEAR_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DEACTIVATED: + reason = "STATUS_TPM_DEACTIVATED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DISABLED: + reason = "STATUS_TPM_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DISABLED_CMD: + reason = "STATUS_TPM_DISABLED_CMD"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_FAIL: + reason = "STATUS_TPM_FAIL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_ORDINAL: + reason = "STATUS_TPM_BAD_ORDINAL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INSTALL_DISABLED: + reason = "STATUS_TPM_INSTALL_DISABLED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INVALID_KEYHANDLE: + reason = "STATUS_TPM_INVALID_KEYHANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_KEYNOTFOUND: + reason = "STATUS_TPM_KEYNOTFOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INAPPROPRIATE_ENC: + reason = "STATUS_TPM_INAPPROPRIATE_ENC"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_MIGRATEFAIL: + reason = "STATUS_TPM_MIGRATEFAIL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INVALID_PCR_INFO: + reason = "STATUS_TPM_INVALID_PCR_INFO"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NOSPACE: + reason = "STATUS_TPM_NOSPACE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NOSRK: + reason = "STATUS_TPM_NOSRK"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NOTSEALED_BLOB: + reason = "STATUS_TPM_NOTSEALED_BLOB"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_OWNER_SET: + reason = "STATUS_TPM_OWNER_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_RESOURCES: + reason = "STATUS_TPM_RESOURCES"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_SHORTRANDOM: + reason = "STATUS_TPM_SHORTRANDOM"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_SIZE: + reason = "STATUS_TPM_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_WRONGPCRVAL: + reason = "STATUS_TPM_WRONGPCRVAL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_PARAM_SIZE: + reason = "STATUS_TPM_BAD_PARAM_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_SHA_THREAD: + reason = "STATUS_TPM_SHA_THREAD"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_SHA_ERROR: + reason = "STATUS_TPM_SHA_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_FAILEDSELFTEST: + reason = "STATUS_TPM_FAILEDSELFTEST"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_AUTH2FAIL: + reason = "STATUS_TPM_AUTH2FAIL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BADTAG: + reason = "STATUS_TPM_BADTAG"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_IOERROR: + reason = "STATUS_TPM_IOERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_ENCRYPT_ERROR: + reason = "STATUS_TPM_ENCRYPT_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DECRYPT_ERROR: + reason = "STATUS_TPM_DECRYPT_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INVALID_AUTHHANDLE: + reason = "STATUS_TPM_INVALID_AUTHHANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NO_ENDORSEMENT: + reason = "STATUS_TPM_NO_ENDORSEMENT"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INVALID_KEYUSAGE: + reason = "STATUS_TPM_INVALID_KEYUSAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_WRONG_ENTITYTYPE: + reason = "STATUS_TPM_WRONG_ENTITYTYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INVALID_POSTINIT: + reason = "STATUS_TPM_INVALID_POSTINIT"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INAPPROPRIATE_SIG: + reason = "STATUS_TPM_INAPPROPRIATE_SIG"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_KEY_PROPERTY: + reason = "STATUS_TPM_BAD_KEY_PROPERTY"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_MIGRATION: + reason = "STATUS_TPM_BAD_MIGRATION"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_SCHEME: + reason = "STATUS_TPM_BAD_SCHEME"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_DATASIZE: + reason = "STATUS_TPM_BAD_DATASIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_MODE: + reason = "STATUS_TPM_BAD_MODE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_PRESENCE: + reason = "STATUS_TPM_BAD_PRESENCE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_VERSION: + reason = "STATUS_TPM_BAD_VERSION"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NO_WRAP_TRANSPORT: + reason = "STATUS_TPM_NO_WRAP_TRANSPORT"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_AUDITFAIL_UNSUCCESSFUL: + reason = "STATUS_TPM_AUDITFAIL_UNSUCCESSFUL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_AUDITFAIL_SUCCESSFUL: + reason = "STATUS_TPM_AUDITFAIL_SUCCESSFUL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NOTRESETABLE: + reason = "STATUS_TPM_NOTRESETABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NOTLOCAL: + reason = "STATUS_TPM_NOTLOCAL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_TYPE: + reason = "STATUS_TPM_BAD_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INVALID_RESOURCE: + reason = "STATUS_TPM_INVALID_RESOURCE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NOTFIPS: + reason = "STATUS_TPM_NOTFIPS"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INVALID_FAMILY: + reason = "STATUS_TPM_INVALID_FAMILY"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NO_NV_PERMISSION: + reason = "STATUS_TPM_NO_NV_PERMISSION"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_REQUIRES_SIGN: + reason = "STATUS_TPM_REQUIRES_SIGN"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_KEY_NOTSUPPORTED: + reason = "STATUS_TPM_KEY_NOTSUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_AUTH_CONFLICT: + reason = "STATUS_TPM_AUTH_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_AREA_LOCKED: + reason = "STATUS_TPM_AREA_LOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_LOCALITY: + reason = "STATUS_TPM_BAD_LOCALITY"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_READ_ONLY: + reason = "STATUS_TPM_READ_ONLY"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_PER_NOWRITE: + reason = "STATUS_TPM_PER_NOWRITE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_FAMILYCOUNT: + reason = "STATUS_TPM_FAMILYCOUNT"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_WRITE_LOCKED: + reason = "STATUS_TPM_WRITE_LOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_ATTRIBUTES: + reason = "STATUS_TPM_BAD_ATTRIBUTES"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INVALID_STRUCTURE: + reason = "STATUS_TPM_INVALID_STRUCTURE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_KEY_OWNER_CONTROL: + reason = "STATUS_TPM_KEY_OWNER_CONTROL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_COUNTER: + reason = "STATUS_TPM_BAD_COUNTER"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NOT_FULLWRITE: + reason = "STATUS_TPM_NOT_FULLWRITE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_CONTEXT_GAP: + reason = "STATUS_TPM_CONTEXT_GAP"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_MAXNVWRITES: + reason = "STATUS_TPM_MAXNVWRITES"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NOOPERATOR: + reason = "STATUS_TPM_NOOPERATOR"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_RESOURCEMISSING: + reason = "STATUS_TPM_RESOURCEMISSING"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DELEGATE_LOCK: + reason = "STATUS_TPM_DELEGATE_LOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DELEGATE_FAMILY: + reason = "STATUS_TPM_DELEGATE_FAMILY"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DELEGATE_ADMIN: + reason = "STATUS_TPM_DELEGATE_ADMIN"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_TRANSPORT_NOTEXCLUSIVE: + reason = "STATUS_TPM_TRANSPORT_NOTEXCLUSIVE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_OWNER_CONTROL: + reason = "STATUS_TPM_OWNER_CONTROL"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DAA_RESOURCES: + reason = "STATUS_TPM_DAA_RESOURCES"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DAA_INPUT_DATA0: + reason = "STATUS_TPM_DAA_INPUT_DATA0"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DAA_INPUT_DATA1: + reason = "STATUS_TPM_DAA_INPUT_DATA1"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DAA_ISSUER_SETTINGS: + reason = "STATUS_TPM_DAA_ISSUER_SETTINGS"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DAA_TPM_SETTINGS: + reason = "STATUS_TPM_DAA_TPM_SETTINGS"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DAA_STAGE: + reason = "STATUS_TPM_DAA_STAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DAA_ISSUER_VALIDITY: + reason = "STATUS_TPM_DAA_ISSUER_VALIDITY"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DAA_WRONG_W: + reason = "STATUS_TPM_DAA_WRONG_W"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_HANDLE: + reason = "STATUS_TPM_BAD_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_DELEGATE: + reason = "STATUS_TPM_BAD_DELEGATE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BADCONTEXT: + reason = "STATUS_TPM_BADCONTEXT"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_TOOMANYCONTEXTS: + reason = "STATUS_TPM_TOOMANYCONTEXTS"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_MA_TICKET_SIGNATURE: + reason = "STATUS_TPM_MA_TICKET_SIGNATURE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_MA_DESTINATION: + reason = "STATUS_TPM_MA_DESTINATION"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_MA_SOURCE: + reason = "STATUS_TPM_MA_SOURCE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_MA_AUTHORITY: + reason = "STATUS_TPM_MA_AUTHORITY"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_PERMANENTEK: + reason = "STATUS_TPM_PERMANENTEK"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_BAD_SIGNATURE: + reason = "STATUS_TPM_BAD_SIGNATURE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NOCONTEXTSPACE: + reason = "STATUS_TPM_NOCONTEXTSPACE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_COMMAND_BLOCKED: + reason = "STATUS_TPM_COMMAND_BLOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INVALID_HANDLE: + reason = "STATUS_TPM_INVALID_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DUPLICATE_VHANDLE: + reason = "STATUS_TPM_DUPLICATE_VHANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_EMBEDDED_COMMAND_BLOCKED: + reason = "STATUS_TPM_EMBEDDED_COMMAND_BLOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_EMBEDDED_COMMAND_UNSUPPORTED: + reason = "STATUS_TPM_EMBEDDED_COMMAND_UNSUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_RETRY: + reason = "STATUS_TPM_RETRY"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NEEDS_SELFTEST: + reason = "STATUS_TPM_NEEDS_SELFTEST"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DOING_SELFTEST: + reason = "STATUS_TPM_DOING_SELFTEST"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_DEFEND_LOCK_RUNNING: + reason = "STATUS_TPM_DEFEND_LOCK_RUNNING"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_COMMAND_CANCELED: + reason = "STATUS_TPM_COMMAND_CANCELED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_TOO_MANY_CONTEXTS: + reason = "STATUS_TPM_TOO_MANY_CONTEXTS"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_NOT_FOUND: + reason = "STATUS_TPM_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_ACCESS_DENIED: + reason = "STATUS_TPM_ACCESS_DENIED"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_INSUFFICIENT_BUFFER: + reason = "STATUS_TPM_INSUFFICIENT_BUFFER"; + break; + case MD_NTSTATUS_WIN_STATUS_TPM_PPI_FUNCTION_UNSUPPORTED: + reason = "STATUS_TPM_PPI_FUNCTION_UNSUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_ERROR_MASK: + reason = "STATUS_PCP_ERROR_MASK"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_DEVICE_NOT_READY: + reason = "STATUS_PCP_DEVICE_NOT_READY"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_INVALID_HANDLE: + reason = "STATUS_PCP_INVALID_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_INVALID_PARAMETER: + reason = "STATUS_PCP_INVALID_PARAMETER"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_FLAG_NOT_SUPPORTED: + reason = "STATUS_PCP_FLAG_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_NOT_SUPPORTED: + reason = "STATUS_PCP_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_BUFFER_TOO_SMALL: + reason = "STATUS_PCP_BUFFER_TOO_SMALL"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_INTERNAL_ERROR: + reason = "STATUS_PCP_INTERNAL_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_AUTHENTICATION_FAILED: + reason = "STATUS_PCP_AUTHENTICATION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_AUTHENTICATION_IGNORED: + reason = "STATUS_PCP_AUTHENTICATION_IGNORED"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_POLICY_NOT_FOUND: + reason = "STATUS_PCP_POLICY_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_PROFILE_NOT_FOUND: + reason = "STATUS_PCP_PROFILE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_VALIDATION_FAILED: + reason = "STATUS_PCP_VALIDATION_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_PCP_DEVICE_NOT_FOUND: + reason = "STATUS_PCP_DEVICE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_HYPERCALL_CODE: + reason = "STATUS_HV_INVALID_HYPERCALL_CODE"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_HYPERCALL_INPUT: + reason = "STATUS_HV_INVALID_HYPERCALL_INPUT"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_ALIGNMENT: + reason = "STATUS_HV_INVALID_ALIGNMENT"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_PARAMETER: + reason = "STATUS_HV_INVALID_PARAMETER"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_ACCESS_DENIED: + reason = "STATUS_HV_ACCESS_DENIED"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_PARTITION_STATE: + reason = "STATUS_HV_INVALID_PARTITION_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_OPERATION_DENIED: + reason = "STATUS_HV_OPERATION_DENIED"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_UNKNOWN_PROPERTY: + reason = "STATUS_HV_UNKNOWN_PROPERTY"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_PROPERTY_VALUE_OUT_OF_RANGE: + reason = "STATUS_HV_PROPERTY_VALUE_OUT_OF_RANGE"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_MEMORY: + reason = "STATUS_HV_INSUFFICIENT_MEMORY"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_PARTITION_TOO_DEEP: + reason = "STATUS_HV_PARTITION_TOO_DEEP"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_PARTITION_ID: + reason = "STATUS_HV_INVALID_PARTITION_ID"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_VP_INDEX: + reason = "STATUS_HV_INVALID_VP_INDEX"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_PORT_ID: + reason = "STATUS_HV_INVALID_PORT_ID"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_CONNECTION_ID: + reason = "STATUS_HV_INVALID_CONNECTION_ID"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_BUFFERS: + reason = "STATUS_HV_INSUFFICIENT_BUFFERS"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_NOT_ACKNOWLEDGED: + reason = "STATUS_HV_NOT_ACKNOWLEDGED"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_ACKNOWLEDGED: + reason = "STATUS_HV_ACKNOWLEDGED"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_SAVE_RESTORE_STATE: + reason = "STATUS_HV_INVALID_SAVE_RESTORE_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_SYNIC_STATE: + reason = "STATUS_HV_INVALID_SYNIC_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_OBJECT_IN_USE: + reason = "STATUS_HV_OBJECT_IN_USE"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_PROXIMITY_DOMAIN_INFO: + reason = "STATUS_HV_INVALID_PROXIMITY_DOMAIN_INFO"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_NO_DATA: + reason = "STATUS_HV_NO_DATA"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INACTIVE: + reason = "STATUS_HV_INACTIVE"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_NO_RESOURCES: + reason = "STATUS_HV_NO_RESOURCES"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_FEATURE_UNAVAILABLE: + reason = "STATUS_HV_FEATURE_UNAVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_BUFFER: + reason = "STATUS_HV_INSUFFICIENT_BUFFER"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_DEVICE_DOMAINS: + reason = "STATUS_HV_INSUFFICIENT_DEVICE_DOMAINS"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_INVALID_LP_INDEX: + reason = "STATUS_HV_INVALID_LP_INDEX"; + break; + case MD_NTSTATUS_WIN_STATUS_HV_NOT_PRESENT: + reason = "STATUS_HV_NOT_PRESENT"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_BAD_SPI: + reason = "STATUS_IPSEC_BAD_SPI"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_SA_LIFETIME_EXPIRED: + reason = "STATUS_IPSEC_SA_LIFETIME_EXPIRED"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_WRONG_SA: + reason = "STATUS_IPSEC_WRONG_SA"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_REPLAY_CHECK_FAILED: + reason = "STATUS_IPSEC_REPLAY_CHECK_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_INVALID_PACKET: + reason = "STATUS_IPSEC_INVALID_PACKET"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_INTEGRITY_CHECK_FAILED: + reason = "STATUS_IPSEC_INTEGRITY_CHECK_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_CLEAR_TEXT_DROP: + reason = "STATUS_IPSEC_CLEAR_TEXT_DROP"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_AUTH_FIREWALL_DROP: + reason = "STATUS_IPSEC_AUTH_FIREWALL_DROP"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_THROTTLE_DROP: + reason = "STATUS_IPSEC_THROTTLE_DROP"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_BLOCK: + reason = "STATUS_IPSEC_DOSP_BLOCK"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_RECEIVED_MULTICAST: + reason = "STATUS_IPSEC_DOSP_RECEIVED_MULTICAST"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_INVALID_PACKET: + reason = "STATUS_IPSEC_DOSP_INVALID_PACKET"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_STATE_LOOKUP_FAILED: + reason = "STATUS_IPSEC_DOSP_STATE_LOOKUP_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_MAX_ENTRIES: + reason = "STATUS_IPSEC_DOSP_MAX_ENTRIES"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_KEYMOD_NOT_ALLOWED: + reason = "STATUS_IPSEC_DOSP_KEYMOD_NOT_ALLOWED"; + break; + case MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES: + reason = "STATUS_IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_DUPLICATE_HANDLER: + reason = "STATUS_VID_DUPLICATE_HANDLER"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_TOO_MANY_HANDLERS: + reason = "STATUS_VID_TOO_MANY_HANDLERS"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_QUEUE_FULL: + reason = "STATUS_VID_QUEUE_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_HANDLER_NOT_PRESENT: + reason = "STATUS_VID_HANDLER_NOT_PRESENT"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_INVALID_OBJECT_NAME: + reason = "STATUS_VID_INVALID_OBJECT_NAME"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_PARTITION_NAME_TOO_LONG: + reason = "STATUS_VID_PARTITION_NAME_TOO_LONG"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_MESSAGE_QUEUE_NAME_TOO_LONG: + reason = "STATUS_VID_MESSAGE_QUEUE_NAME_TOO_LONG"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_PARTITION_ALREADY_EXISTS: + reason = "STATUS_VID_PARTITION_ALREADY_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_PARTITION_DOES_NOT_EXIST: + reason = "STATUS_VID_PARTITION_DOES_NOT_EXIST"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_PARTITION_NAME_NOT_FOUND: + reason = "STATUS_VID_PARTITION_NAME_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_MESSAGE_QUEUE_ALREADY_EXISTS: + reason = "STATUS_VID_MESSAGE_QUEUE_ALREADY_EXISTS"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_EXCEEDED_MBP_ENTRY_MAP_LIMIT: + reason = "STATUS_VID_EXCEEDED_MBP_ENTRY_MAP_LIMIT"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_MB_STILL_REFERENCED: + reason = "STATUS_VID_MB_STILL_REFERENCED"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_CHILD_GPA_PAGE_SET_CORRUPTED: + reason = "STATUS_VID_CHILD_GPA_PAGE_SET_CORRUPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_INVALID_NUMA_SETTINGS: + reason = "STATUS_VID_INVALID_NUMA_SETTINGS"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_INVALID_NUMA_NODE_INDEX: + reason = "STATUS_VID_INVALID_NUMA_NODE_INDEX"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_NOTIFICATION_QUEUE_ALREADY_ASSOCIATED: + reason = "STATUS_VID_NOTIFICATION_QUEUE_ALREADY_ASSOCIATED"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_INVALID_MEMORY_BLOCK_HANDLE: + reason = "STATUS_VID_INVALID_MEMORY_BLOCK_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_PAGE_RANGE_OVERFLOW: + reason = "STATUS_VID_PAGE_RANGE_OVERFLOW"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_INVALID_MESSAGE_QUEUE_HANDLE: + reason = "STATUS_VID_INVALID_MESSAGE_QUEUE_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_INVALID_GPA_RANGE_HANDLE: + reason = "STATUS_VID_INVALID_GPA_RANGE_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_NO_MEMORY_BLOCK_NOTIFICATION_QUEUE: + reason = "STATUS_VID_NO_MEMORY_BLOCK_NOTIFICATION_QUEUE"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_MEMORY_BLOCK_LOCK_COUNT_EXCEEDED: + reason = "STATUS_VID_MEMORY_BLOCK_LOCK_COUNT_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_INVALID_PPM_HANDLE: + reason = "STATUS_VID_INVALID_PPM_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_MBPS_ARE_LOCKED: + reason = "STATUS_VID_MBPS_ARE_LOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_MESSAGE_QUEUE_CLOSED: + reason = "STATUS_VID_MESSAGE_QUEUE_CLOSED"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_VIRTUAL_PROCESSOR_LIMIT_EXCEEDED: + reason = "STATUS_VID_VIRTUAL_PROCESSOR_LIMIT_EXCEEDED"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_STOP_PENDING: + reason = "STATUS_VID_STOP_PENDING"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_INVALID_PROCESSOR_STATE: + reason = "STATUS_VID_INVALID_PROCESSOR_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_EXCEEDED_KM_CONTEXT_COUNT_LIMIT: + reason = "STATUS_VID_EXCEEDED_KM_CONTEXT_COUNT_LIMIT"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_KM_INTERFACE_ALREADY_INITIALIZED: + reason = "STATUS_VID_KM_INTERFACE_ALREADY_INITIALIZED"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_MB_PROPERTY_ALREADY_SET_RESET: + reason = "STATUS_VID_MB_PROPERTY_ALREADY_SET_RESET"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_MMIO_RANGE_DESTROYED: + reason = "STATUS_VID_MMIO_RANGE_DESTROYED"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_INVALID_CHILD_GPA_PAGE_SET: + reason = "STATUS_VID_INVALID_CHILD_GPA_PAGE_SET"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_RESERVE_PAGE_SET_IS_BEING_USED: + reason = "STATUS_VID_RESERVE_PAGE_SET_IS_BEING_USED"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_RESERVE_PAGE_SET_TOO_SMALL: + reason = "STATUS_VID_RESERVE_PAGE_SET_TOO_SMALL"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_MBP_ALREADY_LOCKED_USING_RESERVED_PAGE: + reason = "STATUS_VID_MBP_ALREADY_LOCKED_USING_RESERVED_PAGE"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_MBP_COUNT_EXCEEDED_LIMIT: + reason = "STATUS_VID_MBP_COUNT_EXCEEDED_LIMIT"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_SAVED_STATE_CORRUPT: + reason = "STATUS_VID_SAVED_STATE_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_SAVED_STATE_UNRECOGNIZED_ITEM: + reason = "STATUS_VID_SAVED_STATE_UNRECOGNIZED_ITEM"; + break; + case MD_NTSTATUS_WIN_STATUS_VID_SAVED_STATE_INCOMPATIBLE: + reason = "STATUS_VID_SAVED_STATE_INCOMPATIBLE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DATABASE_FULL: + reason = "STATUS_VOLMGR_DATABASE_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_CONFIGURATION_CORRUPTED: + reason = "STATUS_VOLMGR_DISK_CONFIGURATION_CORRUPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_CONFIGURATION_NOT_IN_SYNC: + reason = "STATUS_VOLMGR_DISK_CONFIGURATION_NOT_IN_SYNC"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_CONFIG_UPDATE_FAILED: + reason = "STATUS_VOLMGR_PACK_CONFIG_UPDATE_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_CONTAINS_NON_SIMPLE_VOLUME: + reason = "STATUS_VOLMGR_DISK_CONTAINS_NON_SIMPLE_VOLUME"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_DUPLICATE: + reason = "STATUS_VOLMGR_DISK_DUPLICATE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_DYNAMIC: + reason = "STATUS_VOLMGR_DISK_DYNAMIC"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_ID_INVALID: + reason = "STATUS_VOLMGR_DISK_ID_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_INVALID: + reason = "STATUS_VOLMGR_DISK_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAST_VOTER: + reason = "STATUS_VOLMGR_DISK_LAST_VOTER"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_INVALID: + reason = "STATUS_VOLMGR_DISK_LAYOUT_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_NON_BASIC_BETWEEN_BASIC_PARTITIONS: + reason = "STATUS_VOLMGR_DISK_LAYOUT_NON_BASIC_BETWEEN_BASIC_PARTITIONS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_NOT_CYLINDER_ALIGNED: + reason = "STATUS_VOLMGR_DISK_LAYOUT_NOT_CYLINDER_ALIGNED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_PARTITIONS_TOO_SMALL: + reason = "STATUS_VOLMGR_DISK_LAYOUT_PARTITIONS_TOO_SMALL"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_PRIMARY_BETWEEN_LOGICAL_PARTITIONS: + reason = "STATUS_VOLMGR_DISK_LAYOUT_PRIMARY_BETWEEN_LOGICAL_PARTITIONS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_TOO_MANY_PARTITIONS: + reason = "STATUS_VOLMGR_DISK_LAYOUT_TOO_MANY_PARTITIONS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_MISSING: + reason = "STATUS_VOLMGR_DISK_MISSING"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_NOT_EMPTY: + reason = "STATUS_VOLMGR_DISK_NOT_EMPTY"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_NOT_ENOUGH_SPACE: + reason = "STATUS_VOLMGR_DISK_NOT_ENOUGH_SPACE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_REVECTORING_FAILED: + reason = "STATUS_VOLMGR_DISK_REVECTORING_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_SECTOR_SIZE_INVALID: + reason = "STATUS_VOLMGR_DISK_SECTOR_SIZE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_SET_NOT_CONTAINED: + reason = "STATUS_VOLMGR_DISK_SET_NOT_CONTAINED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_USED_BY_MULTIPLE_MEMBERS: + reason = "STATUS_VOLMGR_DISK_USED_BY_MULTIPLE_MEMBERS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_USED_BY_MULTIPLE_PLEXES: + reason = "STATUS_VOLMGR_DISK_USED_BY_MULTIPLE_PLEXES"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DYNAMIC_DISK_NOT_SUPPORTED: + reason = "STATUS_VOLMGR_DYNAMIC_DISK_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_ALREADY_USED: + reason = "STATUS_VOLMGR_EXTENT_ALREADY_USED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_NOT_CONTIGUOUS: + reason = "STATUS_VOLMGR_EXTENT_NOT_CONTIGUOUS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_NOT_IN_PUBLIC_REGION: + reason = "STATUS_VOLMGR_EXTENT_NOT_IN_PUBLIC_REGION"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_NOT_SECTOR_ALIGNED: + reason = "STATUS_VOLMGR_EXTENT_NOT_SECTOR_ALIGNED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_OVERLAPS_EBR_PARTITION: + reason = "STATUS_VOLMGR_EXTENT_OVERLAPS_EBR_PARTITION"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_VOLUME_LENGTHS_DO_NOT_MATCH: + reason = "STATUS_VOLMGR_EXTENT_VOLUME_LENGTHS_DO_NOT_MATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_FAULT_TOLERANT_NOT_SUPPORTED: + reason = "STATUS_VOLMGR_FAULT_TOLERANT_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_INTERLEAVE_LENGTH_INVALID: + reason = "STATUS_VOLMGR_INTERLEAVE_LENGTH_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_MAXIMUM_REGISTERED_USERS: + reason = "STATUS_VOLMGR_MAXIMUM_REGISTERED_USERS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_IN_SYNC: + reason = "STATUS_VOLMGR_MEMBER_IN_SYNC"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_INDEX_DUPLICATE: + reason = "STATUS_VOLMGR_MEMBER_INDEX_DUPLICATE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_INDEX_INVALID: + reason = "STATUS_VOLMGR_MEMBER_INDEX_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_MISSING: + reason = "STATUS_VOLMGR_MEMBER_MISSING"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_NOT_DETACHED: + reason = "STATUS_VOLMGR_MEMBER_NOT_DETACHED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_REGENERATING: + reason = "STATUS_VOLMGR_MEMBER_REGENERATING"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_ALL_DISKS_FAILED: + reason = "STATUS_VOLMGR_ALL_DISKS_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NO_REGISTERED_USERS: + reason = "STATUS_VOLMGR_NO_REGISTERED_USERS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NO_SUCH_USER: + reason = "STATUS_VOLMGR_NO_SUCH_USER"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NOTIFICATION_RESET: + reason = "STATUS_VOLMGR_NOTIFICATION_RESET"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_MEMBERS_INVALID: + reason = "STATUS_VOLMGR_NUMBER_OF_MEMBERS_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_PLEXES_INVALID: + reason = "STATUS_VOLMGR_NUMBER_OF_PLEXES_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_DUPLICATE: + reason = "STATUS_VOLMGR_PACK_DUPLICATE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_ID_INVALID: + reason = "STATUS_VOLMGR_PACK_ID_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_INVALID: + reason = "STATUS_VOLMGR_PACK_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_NAME_INVALID: + reason = "STATUS_VOLMGR_PACK_NAME_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_OFFLINE: + reason = "STATUS_VOLMGR_PACK_OFFLINE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_HAS_QUORUM: + reason = "STATUS_VOLMGR_PACK_HAS_QUORUM"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_WITHOUT_QUORUM: + reason = "STATUS_VOLMGR_PACK_WITHOUT_QUORUM"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PARTITION_STYLE_INVALID: + reason = "STATUS_VOLMGR_PARTITION_STYLE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PARTITION_UPDATE_FAILED: + reason = "STATUS_VOLMGR_PARTITION_UPDATE_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_IN_SYNC: + reason = "STATUS_VOLMGR_PLEX_IN_SYNC"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_INDEX_DUPLICATE: + reason = "STATUS_VOLMGR_PLEX_INDEX_DUPLICATE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_INDEX_INVALID: + reason = "STATUS_VOLMGR_PLEX_INDEX_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_LAST_ACTIVE: + reason = "STATUS_VOLMGR_PLEX_LAST_ACTIVE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_MISSING: + reason = "STATUS_VOLMGR_PLEX_MISSING"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_REGENERATING: + reason = "STATUS_VOLMGR_PLEX_REGENERATING"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_TYPE_INVALID: + reason = "STATUS_VOLMGR_PLEX_TYPE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_NOT_RAID5: + reason = "STATUS_VOLMGR_PLEX_NOT_RAID5"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_NOT_SIMPLE: + reason = "STATUS_VOLMGR_PLEX_NOT_SIMPLE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_STRUCTURE_SIZE_INVALID: + reason = "STATUS_VOLMGR_STRUCTURE_SIZE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_TOO_MANY_NOTIFICATION_REQUESTS: + reason = "STATUS_VOLMGR_TOO_MANY_NOTIFICATION_REQUESTS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_TRANSACTION_IN_PROGRESS: + reason = "STATUS_VOLMGR_TRANSACTION_IN_PROGRESS"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_UNEXPECTED_DISK_LAYOUT_CHANGE: + reason = "STATUS_VOLMGR_UNEXPECTED_DISK_LAYOUT_CHANGE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_CONTAINS_MISSING_DISK: + reason = "STATUS_VOLMGR_VOLUME_CONTAINS_MISSING_DISK"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_ID_INVALID: + reason = "STATUS_VOLMGR_VOLUME_ID_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_LENGTH_INVALID: + reason = "STATUS_VOLMGR_VOLUME_LENGTH_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_LENGTH_NOT_SECTOR_SIZE_MULTIPLE: + reason = "STATUS_VOLMGR_VOLUME_LENGTH_NOT_SECTOR_SIZE_MULTIPLE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_NOT_MIRRORED: + reason = "STATUS_VOLMGR_VOLUME_NOT_MIRRORED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_NOT_RETAINED: + reason = "STATUS_VOLMGR_VOLUME_NOT_RETAINED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_OFFLINE: + reason = "STATUS_VOLMGR_VOLUME_OFFLINE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_RETAINED: + reason = "STATUS_VOLMGR_VOLUME_RETAINED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_EXTENTS_INVALID: + reason = "STATUS_VOLMGR_NUMBER_OF_EXTENTS_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_DIFFERENT_SECTOR_SIZE: + reason = "STATUS_VOLMGR_DIFFERENT_SECTOR_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_BAD_BOOT_DISK: + reason = "STATUS_VOLMGR_BAD_BOOT_DISK"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_CONFIG_OFFLINE: + reason = "STATUS_VOLMGR_PACK_CONFIG_OFFLINE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_CONFIG_ONLINE: + reason = "STATUS_VOLMGR_PACK_CONFIG_ONLINE"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NOT_PRIMARY_PACK: + reason = "STATUS_VOLMGR_NOT_PRIMARY_PACK"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_LOG_UPDATE_FAILED: + reason = "STATUS_VOLMGR_PACK_LOG_UPDATE_FAILED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_DISKS_IN_PLEX_INVALID: + reason = "STATUS_VOLMGR_NUMBER_OF_DISKS_IN_PLEX_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_DISKS_IN_MEMBER_INVALID: + reason = "STATUS_VOLMGR_NUMBER_OF_DISKS_IN_MEMBER_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_MIRRORED: + reason = "STATUS_VOLMGR_VOLUME_MIRRORED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_NOT_SIMPLE_SPANNED: + reason = "STATUS_VOLMGR_PLEX_NOT_SIMPLE_SPANNED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NO_VALID_LOG_COPIES: + reason = "STATUS_VOLMGR_NO_VALID_LOG_COPIES"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_PRIMARY_PACK_PRESENT: + reason = "STATUS_VOLMGR_PRIMARY_PACK_PRESENT"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_DISKS_INVALID: + reason = "STATUS_VOLMGR_NUMBER_OF_DISKS_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_MIRROR_NOT_SUPPORTED: + reason = "STATUS_VOLMGR_MIRROR_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLMGR_RAID5_NOT_SUPPORTED: + reason = "STATUS_VOLMGR_RAID5_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_BCD_TOO_MANY_ELEMENTS: + reason = "STATUS_BCD_TOO_MANY_ELEMENTS"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_DRIVE_FOOTER_MISSING: + reason = "STATUS_VHD_DRIVE_FOOTER_MISSING"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_DRIVE_FOOTER_CHECKSUM_MISMATCH: + reason = "STATUS_VHD_DRIVE_FOOTER_CHECKSUM_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_DRIVE_FOOTER_CORRUPT: + reason = "STATUS_VHD_DRIVE_FOOTER_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_FORMAT_UNKNOWN: + reason = "STATUS_VHD_FORMAT_UNKNOWN"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_FORMAT_UNSUPPORTED_VERSION: + reason = "STATUS_VHD_FORMAT_UNSUPPORTED_VERSION"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_SPARSE_HEADER_CHECKSUM_MISMATCH: + reason = "STATUS_VHD_SPARSE_HEADER_CHECKSUM_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_SPARSE_HEADER_UNSUPPORTED_VERSION: + reason = "STATUS_VHD_SPARSE_HEADER_UNSUPPORTED_VERSION"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_SPARSE_HEADER_CORRUPT: + reason = "STATUS_VHD_SPARSE_HEADER_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_BLOCK_ALLOCATION_FAILURE: + reason = "STATUS_VHD_BLOCK_ALLOCATION_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_BLOCK_ALLOCATION_TABLE_CORRUPT: + reason = "STATUS_VHD_BLOCK_ALLOCATION_TABLE_CORRUPT"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_INVALID_BLOCK_SIZE: + reason = "STATUS_VHD_INVALID_BLOCK_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_BITMAP_MISMATCH: + reason = "STATUS_VHD_BITMAP_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_PARENT_VHD_NOT_FOUND: + reason = "STATUS_VHD_PARENT_VHD_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_CHILD_PARENT_ID_MISMATCH: + reason = "STATUS_VHD_CHILD_PARENT_ID_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_CHILD_PARENT_TIMESTAMP_MISMATCH: + reason = "STATUS_VHD_CHILD_PARENT_TIMESTAMP_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_METADATA_READ_FAILURE: + reason = "STATUS_VHD_METADATA_READ_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_METADATA_WRITE_FAILURE: + reason = "STATUS_VHD_METADATA_WRITE_FAILURE"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_INVALID_SIZE: + reason = "STATUS_VHD_INVALID_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_INVALID_FILE_SIZE: + reason = "STATUS_VHD_INVALID_FILE_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_VIRTDISK_PROVIDER_NOT_FOUND: + reason = "STATUS_VIRTDISK_PROVIDER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_VIRTDISK_NOT_VIRTUAL_DISK: + reason = "STATUS_VIRTDISK_NOT_VIRTUAL_DISK"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_PARENT_VHD_ACCESS_DENIED: + reason = "STATUS_VHD_PARENT_VHD_ACCESS_DENIED"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_CHILD_PARENT_SIZE_MISMATCH: + reason = "STATUS_VHD_CHILD_PARENT_SIZE_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_DIFFERENCING_CHAIN_CYCLE_DETECTED: + reason = "STATUS_VHD_DIFFERENCING_CHAIN_CYCLE_DETECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_DIFFERENCING_CHAIN_ERROR_IN_PARENT: + reason = "STATUS_VHD_DIFFERENCING_CHAIN_ERROR_IN_PARENT"; + break; + case MD_NTSTATUS_WIN_STATUS_VIRTUAL_DISK_LIMITATION: + reason = "STATUS_VIRTUAL_DISK_LIMITATION"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_INVALID_TYPE: + reason = "STATUS_VHD_INVALID_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_INVALID_STATE: + reason = "STATUS_VHD_INVALID_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_VIRTDISK_UNSUPPORTED_DISK_SECTOR_SIZE: + reason = "STATUS_VIRTDISK_UNSUPPORTED_DISK_SECTOR_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_VIRTDISK_DISK_ALREADY_OWNED: + reason = "STATUS_VIRTDISK_DISK_ALREADY_OWNED"; + break; + case MD_NTSTATUS_WIN_STATUS_VIRTDISK_DISK_ONLINE_AND_WRITABLE: + reason = "STATUS_VIRTDISK_DISK_ONLINE_AND_WRITABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTLOG_TRACKING_NOT_INITIALIZED: + reason = "STATUS_CTLOG_TRACKING_NOT_INITIALIZED"; + break; + case MD_NTSTATUS_WIN_STATUS_CTLOG_LOGFILE_SIZE_EXCEEDED_MAXSIZE: + reason = "STATUS_CTLOG_LOGFILE_SIZE_EXCEEDED_MAXSIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTLOG_VHD_CHANGED_OFFLINE: + reason = "STATUS_CTLOG_VHD_CHANGED_OFFLINE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTLOG_INVALID_TRACKING_STATE: + reason = "STATUS_CTLOG_INVALID_TRACKING_STATE"; + break; + case MD_NTSTATUS_WIN_STATUS_CTLOG_INCONSISTENT_TRACKING_FILE: + reason = "STATUS_CTLOG_INCONSISTENT_TRACKING_FILE"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_METADATA_FULL: + reason = "STATUS_VHD_METADATA_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_RKF_KEY_NOT_FOUND: + reason = "STATUS_RKF_KEY_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_RKF_DUPLICATE_KEY: + reason = "STATUS_RKF_DUPLICATE_KEY"; + break; + case MD_NTSTATUS_WIN_STATUS_RKF_BLOB_FULL: + reason = "STATUS_RKF_BLOB_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_RKF_STORE_FULL: + reason = "STATUS_RKF_STORE_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_RKF_FILE_BLOCKED: + reason = "STATUS_RKF_FILE_BLOCKED"; + break; + case MD_NTSTATUS_WIN_STATUS_RKF_ACTIVE_KEY: + reason = "STATUS_RKF_ACTIVE_KEY"; + break; + case MD_NTSTATUS_WIN_STATUS_RDBSS_RESTART_OPERATION: + reason = "STATUS_RDBSS_RESTART_OPERATION"; + break; + case MD_NTSTATUS_WIN_STATUS_RDBSS_CONTINUE_OPERATION: + reason = "STATUS_RDBSS_CONTINUE_OPERATION"; + break; + case MD_NTSTATUS_WIN_STATUS_RDBSS_POST_OPERATION: + reason = "STATUS_RDBSS_POST_OPERATION"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_HANDLE: + reason = "STATUS_BTH_ATT_INVALID_HANDLE"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_READ_NOT_PERMITTED: + reason = "STATUS_BTH_ATT_READ_NOT_PERMITTED"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_WRITE_NOT_PERMITTED: + reason = "STATUS_BTH_ATT_WRITE_NOT_PERMITTED"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_PDU: + reason = "STATUS_BTH_ATT_INVALID_PDU"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_AUTHENTICATION: + reason = "STATUS_BTH_ATT_INSUFFICIENT_AUTHENTICATION"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_REQUEST_NOT_SUPPORTED: + reason = "STATUS_BTH_ATT_REQUEST_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_OFFSET: + reason = "STATUS_BTH_ATT_INVALID_OFFSET"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_AUTHORIZATION: + reason = "STATUS_BTH_ATT_INSUFFICIENT_AUTHORIZATION"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_PREPARE_QUEUE_FULL: + reason = "STATUS_BTH_ATT_PREPARE_QUEUE_FULL"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_ATTRIBUTE_NOT_FOUND: + reason = "STATUS_BTH_ATT_ATTRIBUTE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_ATTRIBUTE_NOT_LONG: + reason = "STATUS_BTH_ATT_ATTRIBUTE_NOT_LONG"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_ENCRYPTION_KEY_SIZE: + reason = "STATUS_BTH_ATT_INSUFFICIENT_ENCRYPTION_KEY_SIZE"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_ATTRIBUTE_VALUE_LENGTH: + reason = "STATUS_BTH_ATT_INVALID_ATTRIBUTE_VALUE_LENGTH"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_UNLIKELY: + reason = "STATUS_BTH_ATT_UNLIKELY"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_ENCRYPTION: + reason = "STATUS_BTH_ATT_INSUFFICIENT_ENCRYPTION"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_UNSUPPORTED_GROUP_TYPE: + reason = "STATUS_BTH_ATT_UNSUPPORTED_GROUP_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_RESOURCES: + reason = "STATUS_BTH_ATT_INSUFFICIENT_RESOURCES"; + break; + case MD_NTSTATUS_WIN_STATUS_BTH_ATT_UNKNOWN_ERROR: + reason = "STATUS_BTH_ATT_UNKNOWN_ERROR"; + break; + case MD_NTSTATUS_WIN_STATUS_SECUREBOOT_ROLLBACK_DETECTED: + reason = "STATUS_SECUREBOOT_ROLLBACK_DETECTED"; + break; + case MD_NTSTATUS_WIN_STATUS_SECUREBOOT_POLICY_VIOLATION: + reason = "STATUS_SECUREBOOT_POLICY_VIOLATION"; + break; + case MD_NTSTATUS_WIN_STATUS_SECUREBOOT_INVALID_POLICY: + reason = "STATUS_SECUREBOOT_INVALID_POLICY"; + break; + case MD_NTSTATUS_WIN_STATUS_SECUREBOOT_POLICY_PUBLISHER_NOT_FOUND: + reason = "STATUS_SECUREBOOT_POLICY_PUBLISHER_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_SECUREBOOT_POLICY_NOT_SIGNED: + reason = "STATUS_SECUREBOOT_POLICY_NOT_SIGNED"; + break; + case MD_NTSTATUS_WIN_STATUS_SECUREBOOT_FILE_REPLACED: + reason = "STATUS_SECUREBOOT_FILE_REPLACED"; + break; + case MD_NTSTATUS_WIN_STATUS_AUDIO_ENGINE_NODE_NOT_FOUND: + reason = "STATUS_AUDIO_ENGINE_NODE_NOT_FOUND"; + break; + case MD_NTSTATUS_WIN_STATUS_HDAUDIO_EMPTY_CONNECTION_LIST: + reason = "STATUS_HDAUDIO_EMPTY_CONNECTION_LIST"; + break; + case MD_NTSTATUS_WIN_STATUS_HDAUDIO_CONNECTION_LIST_NOT_SUPPORTED: + reason = "STATUS_HDAUDIO_CONNECTION_LIST_NOT_SUPPORTED"; + break; + case MD_NTSTATUS_WIN_STATUS_HDAUDIO_NO_LOGICAL_DEVICES_CREATED: + reason = "STATUS_HDAUDIO_NO_LOGICAL_DEVICES_CREATED"; + break; + case MD_NTSTATUS_WIN_STATUS_HDAUDIO_NULL_LINKED_LIST_ENTRY: + reason = "STATUS_HDAUDIO_NULL_LINKED_LIST_ENTRY"; + break; + case MD_NTSTATUS_WIN_STATUS_VOLSNAP_BOOTFILE_NOT_VALID: + reason = "STATUS_VOLSNAP_BOOTFILE_NOT_VALID"; + break; + case MD_NTSTATUS_WIN_STATUS_IO_PREEMPTED: + reason = "STATUS_IO_PREEMPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_ERROR_STORED: + reason = "STATUS_SVHDX_ERROR_STORED"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_ERROR_NOT_AVAILABLE: + reason = "STATUS_SVHDX_ERROR_NOT_AVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_AVAILABLE: + reason = "STATUS_SVHDX_UNIT_ATTENTION_AVAILABLE"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_CAPACITY_DATA_CHANGED: + reason = "STATUS_SVHDX_UNIT_ATTENTION_CAPACITY_DATA_CHANGED"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_RESERVATIONS_PREEMPTED: + reason = "STATUS_SVHDX_UNIT_ATTENTION_RESERVATIONS_PREEMPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_RESERVATIONS_RELEASED: + reason = "STATUS_SVHDX_UNIT_ATTENTION_RESERVATIONS_RELEASED"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_REGISTRATIONS_PREEMPTED: + reason = "STATUS_SVHDX_UNIT_ATTENTION_REGISTRATIONS_PREEMPTED"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_OPERATING_DEFINITION_CHANGED: + reason = "STATUS_SVHDX_UNIT_ATTENTION_OPERATING_DEFINITION_CHANGED"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_RESERVATION_CONFLICT: + reason = "STATUS_SVHDX_RESERVATION_CONFLICT"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_WRONG_FILE_TYPE: + reason = "STATUS_SVHDX_WRONG_FILE_TYPE"; + break; + case MD_NTSTATUS_WIN_STATUS_SVHDX_VERSION_MISMATCH: + reason = "STATUS_SVHDX_VERSION_MISMATCH"; + break; + case MD_NTSTATUS_WIN_STATUS_VHD_SHARED: + reason = "STATUS_VHD_SHARED"; + break; + case MD_NTSTATUS_WIN_STATUS_SPACES_RESILIENCY_TYPE_INVALID: + reason = "STATUS_SPACES_RESILIENCY_TYPE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_SPACES_DRIVE_SECTOR_SIZE_INVALID: + reason = "STATUS_SPACES_DRIVE_SECTOR_SIZE_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_SPACES_INTERLEAVE_LENGTH_INVALID: + reason = "STATUS_SPACES_INTERLEAVE_LENGTH_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_SPACES_NUMBER_OF_COLUMNS_INVALID: + reason = "STATUS_SPACES_NUMBER_OF_COLUMNS_INVALID"; + break; + case MD_NTSTATUS_WIN_STATUS_SPACES_NOT_ENOUGH_DRIVES: + reason = "STATUS_SPACES_NOT_ENOUGH_DRIVES"; + break; + default: { + char reason_string[11]; + snprintf(reason_string, sizeof(reason_string), "0x%08x", ntstatus); + reason = reason_string; + break; + } + } + return reason; +} + +} // namespace google_breakpad diff --git a/src/processor/symbolic_constants_win.h b/src/processor/symbolic_constants_win.h new file mode 100644 index 0000000..bc9ff35 --- /dev/null +++ b/src/processor/symbolic_constants_win.h @@ -0,0 +1,50 @@ +// Copyright 2015 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ntstatus_reason_win.h: Windows NTSTATUS code to string. +// +// Provides a means to convert NTSTATUS codes to strings. +// +// Author: Ben Wagner + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_SYMBOLIC_CONSTANTS_WIN_H_ +#define GOOGLE_BREAKPAD_PROCESSOR_SYMBOLIC_CONSTANTS_WIN_H_ + +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" + +namespace google_breakpad { + +/* Converts a NTSTATUS code to a reason string. */ +string NTStatusToString(uint32_t ntstatus); + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_SYMBOLIC_CONSTANTS_WIN_H_ diff --git a/src/processor/synth_minidump.cc b/src/processor/synth_minidump.cc new file mode 100644 index 0000000..e51d106 --- /dev/null +++ b/src/processor/synth_minidump.cc @@ -0,0 +1,424 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// synth_minidump.cc: Implementation of SynthMinidump. See synth_minidump.h + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "processor/synth_minidump.h" + +namespace google_breakpad { + +namespace SynthMinidump { + +Section::Section(const Dump& dump) + : test_assembler::Section(dump.endianness()) { } + +void Section::CiteLocationIn(test_assembler::Section *section) const { + (*section).D32(size_).D32(file_offset_); +} + +void Stream::CiteStreamIn(test_assembler::Section *section) const { + section->D32(type_); + CiteLocationIn(section); +} + +SystemInfo::SystemInfo(const Dump& dump, + const MDRawSystemInfo& system_info, + const String& csd_version) + : Stream(dump, MD_SYSTEM_INFO_STREAM) { + D16(system_info.processor_architecture); + D16(system_info.processor_level); + D16(system_info.processor_revision); + D8(system_info.number_of_processors); + D8(system_info.product_type); + D32(system_info.major_version); + D32(system_info.minor_version); + D32(system_info.build_number); + D32(system_info.platform_id); + csd_version.CiteStringIn(this); + D16(system_info.suite_mask); + D16(system_info.reserved2); // Well, why not? + + // MDCPUInformation cpu; + if (system_info.processor_architecture == MD_CPU_ARCHITECTURE_X86) { + D32(system_info.cpu.x86_cpu_info.vendor_id[0]); + D32(system_info.cpu.x86_cpu_info.vendor_id[1]); + D32(system_info.cpu.x86_cpu_info.vendor_id[2]); + D32(system_info.cpu.x86_cpu_info.version_information); + D32(system_info.cpu.x86_cpu_info.feature_information); + D32(system_info.cpu.x86_cpu_info.amd_extended_cpu_features); + } else if (system_info.processor_architecture == MD_CPU_ARCHITECTURE_ARM) { + D32(system_info.cpu.arm_cpu_info.cpuid); + D32(system_info.cpu.arm_cpu_info.elf_hwcaps); + } else { + D64(system_info.cpu.other_cpu_info.processor_features[0]); + D64(system_info.cpu.other_cpu_info.processor_features[1]); + } +} + +const MDRawSystemInfo SystemInfo::windows_x86 = { + MD_CPU_ARCHITECTURE_X86, // processor_architecture + 6, // processor_level + 0xd08, // processor_revision + 1, // number_of_processors + 1, // product_type + 5, // major_version + 1, // minor_version + 2600, // build_number + 2, // platform_id + 0xdeadbeef, // csd_version_rva + 0x100, // suite_mask + 0, // reserved2 + { // cpu + { // x86_cpu_info + { 0x756e6547, 0x49656e69, 0x6c65746e }, // vendor_id + 0x6d8, // version_information + 0xafe9fbff, // feature_information + 0xffffffff // amd_extended_cpu_features + } + } +}; + +const string SystemInfo::windows_x86_csd_version = "Service Pack 2"; + +String::String(const Dump& dump, const string& contents) : Section(dump) { + D32(contents.size() * 2); + for (string::const_iterator i = contents.begin(); i != contents.end(); i++) + D16(*i); +} + +void String::CiteStringIn(test_assembler::Section *section) const { + section->D32(file_offset_); +} + +void Memory::CiteMemoryIn(test_assembler::Section *section) const { + section->D64(address_); + CiteLocationIn(section); +} + +Context::Context(const Dump& dump, const MDRawContextX86& context) + : Section(dump) { + // The caller should have properly set the CPU type flag. + // The high 24 bits identify the CPU. Note that context records with no CPU + // type information can be valid (e.g. produced by ::RtlCaptureContext). + assert(((context.context_flags & MD_CONTEXT_CPU_MASK) == 0) || + (context.context_flags & MD_CONTEXT_X86)); + // It doesn't make sense to store x86 registers in big-endian form. + assert(dump.endianness() == kLittleEndian); + D32(context.context_flags); + D32(context.dr0); + D32(context.dr1); + D32(context.dr2); + D32(context.dr3); + D32(context.dr6); + D32(context.dr7); + D32(context.float_save.control_word); + D32(context.float_save.status_word); + D32(context.float_save.tag_word); + D32(context.float_save.error_offset); + D32(context.float_save.error_selector); + D32(context.float_save.data_offset); + D32(context.float_save.data_selector); + // context.float_save.register_area[] contains 8-bit quantities and + // does not need to be swapped. + Append(context.float_save.register_area, + sizeof(context.float_save.register_area)); + D32(context.float_save.cr0_npx_state); + D32(context.gs); + D32(context.fs); + D32(context.es); + D32(context.ds); + D32(context.edi); + D32(context.esi); + D32(context.ebx); + D32(context.edx); + D32(context.ecx); + D32(context.eax); + D32(context.ebp); + D32(context.eip); + D32(context.cs); + D32(context.eflags); + D32(context.esp); + D32(context.ss); + // context.extended_registers[] contains 8-bit quantities and does + // not need to be swapped. + Append(context.extended_registers, sizeof(context.extended_registers)); + assert(Size() == sizeof(MDRawContextX86)); +} + +Context::Context(const Dump& dump, const MDRawContextARM& context) + : Section(dump) { + // The caller should have properly set the CPU type flag. + assert((context.context_flags & MD_CONTEXT_ARM) || + (context.context_flags & MD_CONTEXT_ARM_OLD)); + // It doesn't make sense to store ARM registers in big-endian form. + assert(dump.endianness() == kLittleEndian); + D32(context.context_flags); + for (int i = 0; i < MD_CONTEXT_ARM_GPR_COUNT; ++i) + D32(context.iregs[i]); + D32(context.cpsr); + D64(context.float_save.fpscr); + for (int i = 0; i < MD_FLOATINGSAVEAREA_ARM_FPR_COUNT; ++i) + D64(context.float_save.regs[i]); + for (int i = 0; i < MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT; ++i) + D32(context.float_save.extra[i]); + assert(Size() == sizeof(MDRawContextARM)); +} + +Context::Context(const Dump& dump, const MDRawContextMIPS& context) + : Section(dump) { + // The caller should have properly set the CPU type flag. + assert(context.context_flags & MD_CONTEXT_MIPS); + D32(context.context_flags); + D32(context._pad0); + + for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i) + D64(context.iregs[i]); + + D64(context.mdhi); + D64(context.mdlo); + + for (int i = 0; i < MD_CONTEXT_MIPS_DSP_COUNT; ++i) + D32(context.hi[i]); + + for (int i = 0; i < MD_CONTEXT_MIPS_DSP_COUNT; ++i) + D32(context.lo[i]); + + D32(context.dsp_control); + D32(context._pad1); + + D64(context.epc); + D64(context.badvaddr); + D32(context.status); + D32(context.cause); + + for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i) + D64(context.float_save.regs[i]); + + D32(context.float_save.fpcsr); + D32(context.float_save.fir); + + assert(Size() == sizeof(MDRawContextMIPS)); +} + +Thread::Thread(const Dump& dump, + uint32_t thread_id, const Memory& stack, const Context& context, + uint32_t suspend_count, uint32_t priority_class, + uint32_t priority, uint64_t teb) : Section(dump) { + D32(thread_id); + D32(suspend_count); + D32(priority_class); + D32(priority); + D64(teb); + stack.CiteMemoryIn(this); + context.CiteLocationIn(this); + assert(Size() == sizeof(MDRawThread)); +} + +Module::Module(const Dump& dump, + uint64_t base_of_image, + uint32_t size_of_image, + const String& name, + uint32_t time_date_stamp, + uint32_t checksum, + const MDVSFixedFileInfo& version_info, + const Section *cv_record, + const Section *misc_record) : Section(dump) { + D64(base_of_image); + D32(size_of_image); + D32(checksum); + D32(time_date_stamp); + name.CiteStringIn(this); + D32(version_info.signature); + D32(version_info.struct_version); + D32(version_info.file_version_hi); + D32(version_info.file_version_lo); + D32(version_info.product_version_hi); + D32(version_info.product_version_lo); + D32(version_info.file_flags_mask); + D32(version_info.file_flags); + D32(version_info.file_os); + D32(version_info.file_type); + D32(version_info.file_subtype); + D32(version_info.file_date_hi); + D32(version_info.file_date_lo); + if (cv_record) + cv_record->CiteLocationIn(this); + else + D32(0).D32(0); + if (misc_record) + misc_record->CiteLocationIn(this); + else + D32(0).D32(0); + D64(0).D64(0); +} + +const MDVSFixedFileInfo Module::stock_version_info = { + MD_VSFIXEDFILEINFO_SIGNATURE, // signature + MD_VSFIXEDFILEINFO_VERSION, // struct_version + 0x11111111, // file_version_hi + 0x22222222, // file_version_lo + 0x33333333, // product_version_hi + 0x44444444, // product_version_lo + MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG, // file_flags_mask + MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG, // file_flags + MD_VSFIXEDFILEINFO_FILE_OS_NT | MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32, + // file_os + MD_VSFIXEDFILEINFO_FILE_TYPE_APP, // file_type + MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN, // file_subtype + 0, // file_date_hi + 0 // file_date_lo +}; + +UnloadedModule::UnloadedModule(const Dump& dump, + uint64_t base_of_image, + uint32_t size_of_image, + const String& name, + uint32_t checksum, + uint32_t time_date_stamp) : Section(dump) { + D64(base_of_image); + D32(size_of_image); + D32(checksum); + D32(time_date_stamp); + name.CiteStringIn(this); +} + +UnloadedModuleList::UnloadedModuleList(const Dump& dump, uint32_t type) + : List(dump, type, false) { + D32(sizeof(MDRawUnloadedModuleList)); + D32(sizeof(MDRawUnloadedModule)); + D32(count_label_); +} + +Exception::Exception(const Dump& dump, + const Context& context, + uint32_t thread_id, + uint32_t exception_code, + uint32_t exception_flags, + uint64_t exception_address) + : Stream(dump, MD_EXCEPTION_STREAM) { + D32(thread_id); + D32(0); // __align + D32(exception_code); + D32(exception_flags); + D64(0); // exception_record + D64(exception_address); + D32(0); // number_parameters + D32(0); // __align + for (size_t i = 0; i < MD_EXCEPTION_MAXIMUM_PARAMETERS; ++i) + D64(0); // exception_information + context.CiteLocationIn(this); + assert(Size() == sizeof(MDRawExceptionStream)); +} + +Dump::Dump(uint64_t flags, + Endianness endianness, + uint32_t version, + uint32_t date_time_stamp) + : test_assembler::Section(endianness), + file_start_(0), + stream_directory_(*this), + stream_count_(0), + thread_list_(*this, MD_THREAD_LIST_STREAM), + module_list_(*this, MD_MODULE_LIST_STREAM), + unloaded_module_list_(*this, MD_UNLOADED_MODULE_LIST_STREAM), + memory_list_(*this, MD_MEMORY_LIST_STREAM) + { + D32(MD_HEADER_SIGNATURE); + D32(version); + D32(stream_count_label_); + D32(stream_directory_rva_); + D32(0); + D32(date_time_stamp); + D64(flags); + assert(Size() == sizeof(MDRawHeader)); +} + +Dump& Dump::Add(SynthMinidump::Section *section) { + section->Finish(file_start_ + Size()); + Append(*section); + return *this; +} + +Dump& Dump::Add(Stream *stream) { + Add(static_cast(stream)); + stream->CiteStreamIn(&stream_directory_); + stream_count_++; + return *this; +} + +Dump& Dump::Add(Memory *memory) { + // Add the memory contents themselves to the file. + Add(static_cast(memory)); + + // The memory list is a list of MDMemoryDescriptors, not of actual + // memory elements. Produce a descriptor, and add that to the list. + SynthMinidump::Section descriptor(*this); + memory->CiteMemoryIn(&descriptor); + memory_list_.Add(&descriptor); + return *this; +} + +Dump& Dump::Add(Thread *thread) { + thread_list_.Add(thread); + return *this; +} + +Dump& Dump::Add(Module *module) { + module_list_.Add(module); + return *this; +} + +Dump& Dump::Add(UnloadedModule *unloaded_module) { + unloaded_module_list_.Add(unloaded_module); + return *this; +} + +void Dump::Finish() { + if (!thread_list_.Empty()) Add(&thread_list_); + if (!module_list_.Empty()) Add(&module_list_); + if (!unloaded_module_list_.Empty()) Add(&unloaded_module_list_); + if (!memory_list_.Empty()) Add(&memory_list_); + + // Create the stream directory. We don't use + // stream_directory_.Finish here, because the stream directory isn't + // cited using a location descriptor; rather, the Minidump header + // has the stream count and MDRVA. + stream_count_label_ = stream_count_; + stream_directory_rva_ = file_start_ + Size(); + Append(static_cast(stream_directory_)); +} + +} // namespace SynthMinidump + +} // namespace google_breakpad diff --git a/src/processor/synth_minidump.h b/src/processor/synth_minidump.h new file mode 100644 index 0000000..a52be03 --- /dev/null +++ b/src/processor/synth_minidump.h @@ -0,0 +1,397 @@ +// -*- mode: C++ -*- + +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// synth_minidump.h: Interface to SynthMinidump: fake minidump generator. +// +// We treat a minidump file as the concatenation of a bunch of +// test_assembler::Sections. The file header, stream directory, +// streams, memory regions, strings, and so on --- each is a Section +// that eventually gets appended to the minidump. Dump, Memory, +// Context, Thread, and so on all inherit from test_assembler::Section. +// For example: +// +// using google_breakpad::test_assembler::kLittleEndian; +// using google_breakpad::SynthMinidump::Context; +// using google_breakpad::SynthMinidump::Dump; +// using google_breakpad::SynthMinidump::Memory; +// using google_breakpad::SynthMinidump::Thread; +// +// Dump minidump(MD_NORMAL, kLittleEndian); +// +// Memory stack1(minidump, 0x569eb0a9); +// ... build contents of stack1 with test_assembler::Section functions ... +// +// MDRawContextX86 x86_context1; +// x86_context1.context_flags = MD_CONTEXT_X86; +// x86_context1.eip = 0x7c90eb94; +// x86_context1.esp = 0x569eb0a9; +// x86_context1.ebp = x86_context1.esp + something appropriate; +// Context context1(minidump, x86_context1); +// +// Thread thread1(minidump, 0xe4a4821d, stack1, context1); +// +// minidump.Add(&stack1); +// minidump.Add(&context1); +// minidump.Add(&thread1); +// minidump.Finish(); +// +// string contents; +// EXPECT_TRUE(minidump.GetContents(&contents)); +// // contents now holds the bytes of a minidump file +// +// Because the test_assembler classes let us write Label references to +// sections before the Labels' values are known, this gives us +// flexibility in how we put the dump together: minidump pieces can +// hold the file offsets of other minidump pieces before the +// referents' positions have been decided. As long as everything has +// been placed by the time we call dump.GetContents to obtain the +// bytes, all the Labels' values will be known, and everything will +// get patched up appropriately. +// +// The dump.Add(thing) functions append THINGS's contents to the +// minidump, but they also do two other things: +// +// - dump.Add(thing) invokes thing->Finish, which tells *thing the +// offset within the file at which it was placed, and allows *thing +// to do any final content generation. +// +// - If THING is something which should receive an entry in some sort +// of list or directory, then dump.Add(THING) automatically creates +// the appropriate directory or list entry. Streams must appear in +// the stream directory; memory ranges should be listed in the +// memory list; threads should be placed in the thread list; and so +// on. +// +// By convention, Section subclass constructors that take references +// to other Sections do not take care of 'Add'ing their arguments to +// the dump. For example, although the Thread constructor takes +// references to a Memory and a Context, it does not add them to the +// dump on the caller's behalf. Rather, the caller is responsible for +// 'Add'ing every section they create. This allows Sections to be +// cited from more than one place; for example, Memory ranges are +// cited both from Thread objects (as their stack contents) and by the +// memory list stream. +// +// If you forget to Add some Section, the Dump::GetContents call will +// fail, as the test_assembler::Labels used to cite the Section's +// contents from elsewhere will still be undefined. +#ifndef PROCESSOR_SYNTH_MINIDUMP_H_ +#define PROCESSOR_SYNTH_MINIDUMP_H_ + +#include + +#include +#include + +#include "common/test_assembler.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +namespace SynthMinidump { + +using test_assembler::Endianness; +using test_assembler::kBigEndian; +using test_assembler::kLittleEndian; +using test_assembler::kUnsetEndian; +using test_assembler::Label; + +class Dump; +class Memory; +class String; + +// A test_assembler::Section which will be appended to a minidump. +class Section: public test_assembler::Section { + public: + explicit Section(const Dump& dump); + + // Append an MDLocationDescriptor referring to this section to SECTION. + // If 'this' is NULL, append a descriptor with a zero length and MDRVA. + // + // (I couldn't find the language in the C++ standard that says that + // invoking member functions of a NULL pointer to a class type is + // bad, if such language exists. Having this function handle NULL + // 'this' is convenient, but if it causes trouble, it's not hard to + // do differently.) + void CiteLocationIn(test_assembler::Section* section) const; + + // Note that this section's contents are complete, and that it has + // been placed in the minidump file at OFFSET. The 'Add' member + // functions call the Finish member function of the object being + // added for you; if you are 'Add'ing this section, you needn't Finish it. + virtual void Finish(const Label& offset) { + file_offset_ = offset; size_ = Size(); + } + + protected: + // This section's size and offset within the minidump file. + Label file_offset_, size_; +}; + +// A stream within a minidump file. 'Add'ing a stream to a minidump +// creates an entry for it in the minidump's stream directory. +class Stream: public Section { + public: + // Create a stream of type TYPE. You can append whatever contents + // you like to this stream using the test_assembler::Section methods. + Stream(const Dump& dump, uint32_t type) : Section(dump), type_(type) { } + + // Append an MDRawDirectory referring to this stream to SECTION. + void CiteStreamIn(test_assembler::Section* section) const; + + private: + // The type of this stream. + uint32_t type_; +}; + +class SystemInfo: public Stream { + public: + // Create an MD_SYSTEM_INFO_STREAM stream belonging to DUMP holding + // an MDRawSystem info structure initialized with the values from + // SYSTEM_INFO, except that the csd_version field is replaced with + // the file offset of the string CSD_VERSION, which can be 'Add'ed + // to the dump at the desired location. + // + // Remember that you are still responsible for 'Add'ing CSD_VERSION + // to the dump yourself. + SystemInfo(const Dump& dump, + const MDRawSystemInfo& system_info, + const String& csd_version); + + // Stock MDRawSystemInfo information and associated strings, for + // writing tests. + static const MDRawSystemInfo windows_x86; + static const string windows_x86_csd_version; +}; + +// An MDString: a string preceded by a 32-bit length. +class String: public Section { + public: + String(const Dump& dump, const string& value); + + // Append an MDRVA referring to this string to SECTION. + void CiteStringIn(test_assembler::Section* section) const; +}; + +// A range of memory contents. 'Add'ing a memory range to a minidump +// creates n entry for it in the minidump's memory list. By +// convention, the 'start', 'Here', and 'Mark' member functions refer +// to memory addresses. +class Memory: public Section { + public: + Memory(const Dump& dump, uint64_t address) + : Section(dump), address_(address) { start() = address; } + + // Append an MDMemoryDescriptor referring to this memory range to SECTION. + void CiteMemoryIn(test_assembler::Section* section) const; + + private: + // The process address from which these memory contents were taken. + // Shouldn't this be a Label? + uint64_t address_; +}; + +class Context: public Section { + public: + // Create a context belonging to DUMP whose contents are a copy of CONTEXT. + Context(const Dump& dump, const MDRawContextX86& context); + Context(const Dump& dump, const MDRawContextARM& context); + Context(const Dump& dump, const MDRawContextMIPS& context); + // Add an empty context to the dump. + Context(const Dump& dump) : Section(dump) {} + // Add constructors for other architectures here. Remember to byteswap. +}; + +class Thread: public Section { + public: + // Create a thread belonging to DUMP with the given values, citing + // STACK and CONTEXT (which you must Add to the dump separately). + Thread(const Dump& dump, + uint32_t thread_id, + const Memory& stack, + const Context& context, + uint32_t suspend_count = 0, + uint32_t priority_class = 0, + uint32_t priority = 0, + uint64_t teb = 0); +}; + +class Module: public Section { + public: + // Create a module with the given values. Note that CV_RECORD and + // MISC_RECORD can be NULL, in which case the corresponding location + // descriptior in the minidump will have a length of zero. + Module(const Dump& dump, + uint64_t base_of_image, + uint32_t size_of_image, + const String& name, + uint32_t time_date_stamp = 1262805309, + uint32_t checksum = 0, + const MDVSFixedFileInfo& version_info = Module::stock_version_info, + const Section* cv_record = NULL, + const Section* misc_record = NULL); + + private: + // A standard MDVSFixedFileInfo structure to use as a default for + // minidumps. There's no reason to make users write out all this crap + // over and over. + static const MDVSFixedFileInfo stock_version_info; +}; + +class UnloadedModule: public Section { + public: + UnloadedModule(const Dump& dump, + uint64_t base_of_image, + uint32_t size_of_image, + const String& name, + uint32_t checksum = 0, + uint32_t time_date_stamp = 1262805309); +}; + +class Exception : public Stream { +public: + Exception(const Dump& dump, + const Context& context, + uint32_t thread_id = 0, + uint32_t exception_code = 0, + uint32_t exception_flags = 0, + uint64_t exception_address = 0); +}; + +// A list of entries starting with a 32-bit count, like a memory list +// or a thread list. +template +class List: public Stream { + public: + List(const Dump& dump, uint32_t type) : Stream(dump, type), count_(0) { + D32(count_label_); + } + + // Add ELEMENT to this list. + void Add(Element* element) { + element->Finish(file_offset_ + Size()); + Append(*element); + count_++; + } + + // Return true if this List is empty, false otherwise. + bool Empty() { return count_ == 0; } + + // Finish up the contents of this section, mark it as having been + // placed at OFFSET. + virtual void Finish(const Label& offset) { + Stream::Finish(offset); + count_label_ = count_; + } + + private: + size_t count_; + + protected: + // This constructor allows derived lists to specify their own layout + // rather than starting with count as specified in the public constructor. + List(const Dump& dump, uint32_t type, bool) : Stream(dump, type), count_(0) {} + + Label count_label_; +}; + +class UnloadedModuleList : public List { + public: + UnloadedModuleList(const Dump& dump, uint32_t type); +}; + +class Dump: public test_assembler::Section { + public: + + // Create a test_assembler::Section containing a minidump file whose + // header uses the given values. ENDIANNESS determines the + // endianness of the signature; we set this section's default + // endianness by this. + Dump(uint64_t flags, + Endianness endianness = kLittleEndian, + uint32_t version = MD_HEADER_VERSION, + uint32_t date_time_stamp = 1262805309); + + // The following functions call OBJECT->Finish(), and append the + // contents of OBJECT to this minidump. They also record OBJECT in + // whatever directory or list is appropriate for its type. The + // stream directory, memory list, thread list, and module list are + // accumulated this way. + Dump& Add(SynthMinidump::Section* object); // simply append data + Dump& Add(Stream* object); // append, record in stream directory + Dump& Add(Memory* object); // append, record in memory list + Dump& Add(Thread* object); // append, record in thread list + Dump& Add(Module* object); // append, record in module list + Dump& Add(UnloadedModule* object); // append, record in unloaded module list + + // Complete the construction of the minidump, given the Add calls + // we've seen up to this point. After this call, this Dump's + // contents are complete, all labels should be defined if everything + // Cited has been Added, and you may call GetContents on it. + void Finish(); + + private: + // A label representing the start of the minidump file. + Label file_start_; + + // The stream directory. We construct this incrementally from + // Add(Stream*) calls. + SynthMinidump::Section stream_directory_; // The directory's contents. + size_t stream_count_; // The number of streams so far. + Label stream_count_label_; // Cited in file header. + Label stream_directory_rva_; // The directory's file offset. + + // This minidump's thread list. We construct this incrementally from + // Add(Thread*) calls. + List thread_list_; + + // This minidump's module list. We construct this incrementally from + // Add(Module*) calls. + List module_list_; + + // This minidump's unloaded module list. We construct this incrementally from + // Add(UnloadedModule*) calls. + UnloadedModuleList unloaded_module_list_; + + // This minidump's memory list. We construct this incrementally from + // Add(Memory*) calls. This is actually a list of MDMemoryDescriptors, + // not memory ranges --- thus the odd type. + List memory_list_; +}; + +} // namespace SynthMinidump + +} // namespace google_breakpad + +#endif // PROCESSOR_SYNTH_MINIDUMP_H_ diff --git a/src/processor/synth_minidump_unittest.cc b/src/processor/synth_minidump_unittest.cc new file mode 100644 index 0000000..3b803af --- /dev/null +++ b/src/processor/synth_minidump_unittest.cc @@ -0,0 +1,339 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Jim Blandy + +// synth_minidump_unittest.cc: Unit tests for google_breakpad::SynthMinidump +// classes. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "breakpad_googletest_includes.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/minidump_format.h" +#include "processor/synth_minidump.h" +#include "processor/synth_minidump_unittest_data.h" + +using google_breakpad::SynthMinidump::Context; +using google_breakpad::SynthMinidump::Dump; +using google_breakpad::SynthMinidump::Exception; +using google_breakpad::SynthMinidump::List; +using google_breakpad::SynthMinidump::Memory; +using google_breakpad::SynthMinidump::Module; +using google_breakpad::SynthMinidump::Section; +using google_breakpad::SynthMinidump::Stream; +using google_breakpad::SynthMinidump::String; +using google_breakpad::SynthMinidump::SystemInfo; +using google_breakpad::test_assembler::kBigEndian; +using google_breakpad::test_assembler::kLittleEndian; +using google_breakpad::test_assembler::Label; + +TEST(Section, Simple) { + Dump dump(0); + Section section(dump); + section.L32(0x12345678); + section.Finish(0); + string contents; + ASSERT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("\x78\x56\x34\x12", 4), contents); +} + +TEST(Section, CiteLocationIn) { + Dump dump(0, kBigEndian); + Section section1(dump), section2(dump); + section1.Append("order"); + section2.Append("mayhem"); + section2.Finish(0x32287ec2); + section2.CiteLocationIn(§ion1); + string contents; + ASSERT_TRUE(section1.GetContents(&contents)); + string expected("order\0\0\0\x06\x32\x28\x7e\xc2", 13); + EXPECT_EQ(expected, contents); +} + +TEST(Stream, CiteStreamIn) { + Dump dump(0, kLittleEndian); + Stream stream(dump, 0x40cae2b3); + Section section(dump); + stream.Append("stream contents"); + section.Append("section contents"); + stream.Finish(0x41424344); + stream.CiteStreamIn(§ion); + string contents; + ASSERT_TRUE(section.GetContents(&contents)); + string expected("section contents" + "\xb3\xe2\xca\x40" + "\x0f\0\0\0" + "\x44\x43\x42\x41", + 16 + 4 + 4 + 4); + EXPECT_EQ(expected, contents); +} + +TEST(Memory, CiteMemoryIn) { + Dump dump(0, kBigEndian); + Memory memory(dump, 0x76d010874ab019f9ULL); + Section section(dump); + memory.Append("memory contents"); + section.Append("section contents"); + memory.Finish(0x51525354); + memory.CiteMemoryIn(§ion); + string contents; + ASSERT_TRUE(section.GetContents(&contents)); + string expected("section contents" + "\x76\xd0\x10\x87\x4a\xb0\x19\xf9" + "\0\0\0\x0f" + "\x51\x52\x53\x54", + 16 + 8 + 4 + 4); + EXPECT_EQ(contents, expected); +} + +TEST(Memory, Here) { + Dump dump(0, kBigEndian); + Memory memory(dump, 0x89979731eb060ed4ULL); + memory.Append(1729, 42); + Label l = memory.Here(); + ASSERT_EQ(0x89979731eb060ed4ULL + 1729, l.Value()); +} + +TEST(Context, X86) { + Dump dump(0, kLittleEndian); + assert(x86_raw_context.context_flags & MD_CONTEXT_X86); + Context context(dump, x86_raw_context); + string contents; + ASSERT_TRUE(context.GetContents(&contents)); + EXPECT_EQ(sizeof(x86_expected_contents), contents.size()); + EXPECT_TRUE(memcmp(contents.data(), x86_expected_contents, contents.size()) + == 0); +} + +TEST(Context, ARM) { + Dump dump(0, kLittleEndian); + assert(arm_raw_context.context_flags & MD_CONTEXT_ARM); + Context context(dump, arm_raw_context); + string contents; + ASSERT_TRUE(context.GetContents(&contents)); + EXPECT_EQ(sizeof(arm_expected_contents), contents.size()); + EXPECT_TRUE(memcmp(contents.data(), arm_expected_contents, contents.size()) + == 0); +} + +TEST(ContextDeathTest, X86BadFlags) { + Dump dump(0, kLittleEndian); + MDRawContextX86 raw; + raw.context_flags = MD_CONTEXT_AMD64; + ASSERT_DEATH(Context context(dump, raw);, + "context\\.context_flags & (0x[0-9a-f]+|MD_CONTEXT_X86)"); +} + +TEST(ContextDeathTest, X86BadEndianness) { + Dump dump(0, kBigEndian); + MDRawContextX86 raw; + raw.context_flags = MD_CONTEXT_X86; + ASSERT_DEATH(Context context(dump, raw);, + "dump\\.endianness\\(\\) == kLittleEndian"); +} + +TEST(Thread, Simple) { + Dump dump(0, kLittleEndian); + Context context(dump, x86_raw_context); + context.Finish(0x8665da0c); + Memory stack(dump, 0xaad55a93cc3c0efcULL); + stack.Append("stack contents"); + stack.Finish(0xe08cdbd1); + google_breakpad::SynthMinidump::Thread thread( + dump, 0x3d7ec360, stack, context, + 0x3593f44d, // suspend count + 0xab352b82, // priority class + 0x2753d838, // priority + 0xeb2de4be3f29e3e9ULL); // thread environment block + string contents; + ASSERT_TRUE(thread.GetContents(&contents)); + static const uint8_t expected_bytes[] = { + 0x60, 0xc3, 0x7e, 0x3d, // thread id + 0x4d, 0xf4, 0x93, 0x35, // suspend count + 0x82, 0x2b, 0x35, 0xab, // priority class + 0x38, 0xd8, 0x53, 0x27, // priority + 0xe9, 0xe3, 0x29, 0x3f, 0xbe, 0xe4, 0x2d, 0xeb, // thread environment block + 0xfc, 0x0e, 0x3c, 0xcc, 0x93, 0x5a, 0xd5, 0xaa, // stack address + 0x0e, 0x00, 0x00, 0x00, // stack size + 0xd1, 0xdb, 0x8c, 0xe0, // stack MDRVA + 0xcc, 0x02, 0x00, 0x00, // context size + 0x0c, 0xda, 0x65, 0x86 // context MDRVA + }; + EXPECT_EQ(sizeof(expected_bytes), contents.size()); + EXPECT_TRUE(memcmp(contents.data(), expected_bytes, contents.size()) == 0); +} + +TEST(Exception, Simple) { + Dump dump(0, kLittleEndian); + Context context(dump, x86_raw_context); + context.Finish(0x8665da0c); + + Exception exception(dump, context, + 0x1234abcd, // thread id + 0xdcba4321, // exception code + 0xf0e0d0c0, // exception flags + 0x0919a9b9c9d9e9f9ULL); // exception address + string contents; + ASSERT_TRUE(exception.GetContents(&contents)); + static const uint8_t expected_bytes[] = { + 0xcd, 0xab, 0x34, 0x12, // thread id + 0x00, 0x00, 0x00, 0x00, // __align + 0x21, 0x43, 0xba, 0xdc, // exception code + 0xc0, 0xd0, 0xe0, 0xf0, // exception flags + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception record + 0xf9, 0xe9, 0xd9, 0xc9, 0xb9, 0xa9, 0x19, 0x09, // exception address + 0x00, 0x00, 0x00, 0x00, // number parameters + 0x00, 0x00, 0x00, 0x00, // __align + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information + 0xcc, 0x02, 0x00, 0x00, // context size + 0x0c, 0xda, 0x65, 0x86 // context MDRVA + }; + EXPECT_EQ(sizeof(expected_bytes), contents.size()); + EXPECT_TRUE(memcmp(contents.data(), expected_bytes, contents.size()) == 0); +} + +TEST(String, Simple) { + Dump dump(0, kBigEndian); + String s(dump, "All mimsy were the borogoves"); + string contents; + ASSERT_TRUE(s.GetContents(&contents)); + static const char expected[] = + "\x00\x00\x00\x38\0A\0l\0l\0 \0m\0i\0m\0s\0y\0 \0w\0e\0r\0e" + "\0 \0t\0h\0e\0 \0b\0o\0r\0o\0g\0o\0v\0e\0s"; + string expected_string(expected, sizeof(expected) - 1); + EXPECT_EQ(expected_string, contents); +} + +TEST(String, CiteStringIn) { + Dump dump(0, kLittleEndian); + String s(dump, "and the mome wraths outgrabe"); + Section section(dump); + section.Append("initial"); + s.CiteStringIn(§ion); + s.Finish(0xdc2bb469); + string contents; + ASSERT_TRUE(section.GetContents(&contents)); + EXPECT_EQ(string("initial\x69\xb4\x2b\xdc", 7 + 4), contents); +} + +TEST(List, Empty) { + Dump dump(0, kBigEndian); + List
    list(dump, 0x2442779c); + EXPECT_TRUE(list.Empty()); + list.Finish(0x84e09808); + string contents; + ASSERT_TRUE(list.GetContents(&contents)); + EXPECT_EQ(string("\0\0\0\0", 4), contents); +} + +TEST(List, Two) { + Dump dump(0, kBigEndian); + List
    list(dump, 0x26c9f498); + Section section1(dump); + section1.Append("section one contents"); + EXPECT_TRUE(list.Empty()); + list.Add(§ion1); + EXPECT_FALSE(list.Empty()); + Section section2(dump); + section2.Append("section two contents"); + list.Add(§ion2); + list.Finish(0x1e5bb60e); + string contents; + ASSERT_TRUE(list.GetContents(&contents)); + EXPECT_EQ(string("\0\0\0\x02section one contentssection two contents", 44), + contents); +} + +TEST(Dump, Header) { + Dump dump(0x9f738b33685cc84cULL, kLittleEndian, 0xb3817faf, 0x2c741c0a); + dump.Finish(); + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + ASSERT_EQ(string("\x4d\x44\x4d\x50" // signature + "\xaf\x7f\x81\xb3" // version + "\0\0\0\0" // stream count + "\x20\0\0\0" // directory RVA (could be anything) + "\0\0\0\0" // checksum + "\x0a\x1c\x74\x2c" // time_date_stamp + "\x4c\xc8\x5c\x68\x33\x8b\x73\x9f", // flags + 32), + contents); +} + +TEST(Dump, HeaderBigEndian) { + Dump dump(0x206ce3cc6fb8e0f0ULL, kBigEndian, 0x161693e2, 0x35667744); + dump.Finish(); + string contents; + ASSERT_TRUE(dump.GetContents(&contents)); + ASSERT_EQ(string("\x50\x4d\x44\x4d" // signature + "\x16\x16\x93\xe2" // version + "\0\0\0\0" // stream count + "\0\0\0\x20" // directory RVA (could be anything) + "\0\0\0\0" // checksum + "\x35\x66\x77\x44" // time_date_stamp + "\x20\x6c\xe3\xcc\x6f\xb8\xe0\xf0", // flags + 32), + contents); +} + +TEST(Dump, OneSection) { + Dump dump(0, kLittleEndian); + Section section(dump); + section.Append("section contents"); + dump.Add(§ion); + dump.Finish(); + string dump_contents; + // Just check for undefined labels; don't worry about the contents. + ASSERT_TRUE(dump.GetContents(&dump_contents)); + + Section referencing_section(dump); + section.CiteLocationIn(&referencing_section); + string contents; + ASSERT_TRUE(referencing_section.GetContents(&contents)); + ASSERT_EQ(string("\x10\0\0\0\x20\0\0\0", 8), contents); +} diff --git a/src/processor/synth_minidump_unittest_data.h b/src/processor/synth_minidump_unittest_data.h new file mode 100644 index 0000000..3403372 --- /dev/null +++ b/src/processor/synth_minidump_unittest_data.h @@ -0,0 +1,418 @@ +// -*- mode: C++ -*- + +// Not copyrightable: random test data. +// synth_minidump_unittest_data.h: verbose test data for SynthMinidump tests. + +#ifndef PROCESSOR_SYNTH_MINIDUMP_UNITTEST_DATA_H_ +#define PROCESSOR_SYNTH_MINIDUMP_UNITTEST_DATA_H_ + +#include "google_breakpad/common/minidump_format.h" + +static const MDRawContextX86 x86_raw_context = { + 0xded5d71b, // context_flags + 0x9fdb432e, // dr0 + 0x26b7a81a, // dr1 + 0xcac7e348, // dr2 + 0xcf99ec09, // dr3 + 0x7dc8c2cd, // dr6 + 0x21deb880, // dr7 + + // float_save + { + 0x8a5d2bb0, // control_word + 0x0286c4c9, // status_word + 0xf1feea21, // tag_word + 0xb2d40576, // error_offset + 0x48146cde, // error_selector + 0x983f9b21, // data_offset + 0x475be12c, // data_selector + + // register_area + { + 0xd9, 0x04, 0x20, 0x6b, 0x88, 0x3a, 0x3f, 0xd5, + 0x59, 0x7a, 0xa9, 0xeb, 0xd0, 0x5c, 0xdf, 0xfe, + 0xad, 0xdd, 0x4a, 0x8b, 0x10, 0xcc, 0x9a, 0x33, + 0xcb, 0xb6, 0xf7, 0x86, 0xcd, 0x69, 0x25, 0xae, + 0x25, 0xe5, 0x7a, 0xa1, 0x8f, 0xb2, 0x84, 0xd9, + 0xf7, 0x2d, 0x8a, 0xa1, 0x80, 0x81, 0x7f, 0x67, + 0x07, 0xa8, 0x23, 0xf1, 0x8c, 0xdc, 0xd8, 0x04, + 0x8b, 0x9d, 0xb1, 0xcd, 0x61, 0x0c, 0x9c, 0x69, + 0xc7, 0x8d, 0x17, 0xb6, 0xe5, 0x0b, 0x94, 0xf7, + 0x78, 0x9b, 0x63, 0x49, 0xba, 0xfc, 0x08, 0x4d + }, + + 0x84c53a90, // cr0_npx_state + }, + + 0x79f71e76, // gs + 0x8107bd25, // fs + 0x452d2921, // es + 0x87ec2875, // ds + 0xf8bb73f5, // edi + 0xa63ebb88, // esi + 0x95d35ebe, // ebx + 0x17aa2456, // edx + 0x135fa208, // ecx + 0x500615e6, // eax + 0x66d14205, // ebp + 0x000719a5, // eip + 0x477b481b, // cs + 0x8684dfba, // eflags + 0xe33ccddf, // esp + 0xc0e65d33, // ss + + // extended_registers + { + 0x68, 0x63, 0xdf, 0x50, 0xf7, 0x3b, 0xe8, 0xe5, + 0xcb, 0xd6, 0x66, 0x60, 0xe5, 0xa3, 0x58, 0xb3, + 0x6f, 0x34, 0xca, 0x02, 0x9b, 0x5f, 0xd0, 0x41, + 0xbd, 0xc5, 0x2d, 0xf8, 0xff, 0x15, 0xa2, 0xd0, + 0xe3, 0x2b, 0x3b, 0x8a, 0x9f, 0xc3, 0x9e, 0x28, + 0x0a, 0xc2, 0xac, 0x3b, 0x67, 0x37, 0x01, 0xfd, + 0xc3, 0xaf, 0x60, 0xf6, 0x2c, 0x4f, 0xa9, 0x52, + 0x92, 0xe5, 0x28, 0xde, 0x34, 0xb6, 0x2e, 0x44, + 0x15, 0xa4, 0xb6, 0xe4, 0xc9, 0x1a, 0x14, 0xb9, + 0x51, 0x33, 0x3c, 0xe0, 0xc7, 0x94, 0xf0, 0xf7, + 0x78, 0xdd, 0xe5, 0xca, 0xb7, 0xa6, 0xe0, 0x14, + 0xa6, 0x03, 0xab, 0x77, 0xad, 0xbd, 0xd2, 0x53, + 0x3d, 0x07, 0xe7, 0xaf, 0x90, 0x44, 0x71, 0xbe, + 0x0c, 0xdf, 0x2b, 0x97, 0x40, 0x48, 0xd5, 0xf9, + 0x62, 0x03, 0x91, 0x84, 0xd6, 0xdd, 0x29, 0x97, + 0x35, 0x02, 0xfb, 0x59, 0x97, 0xb0, 0xec, 0xa9, + 0x39, 0x6f, 0x81, 0x71, 0x2a, 0xf0, 0xe7, 0x2c, + 0x4e, 0x93, 0x90, 0xcb, 0x67, 0x69, 0xde, 0xd7, + 0x68, 0x3b, 0x0f, 0x69, 0xa8, 0xf4, 0xa8, 0x83, + 0x42, 0x80, 0x47, 0x65, 0x7a, 0xc9, 0x19, 0x5d, + 0xcb, 0x43, 0xa5, 0xff, 0xf8, 0x9e, 0x62, 0xf4, + 0xe2, 0x6c, 0xcc, 0x17, 0x55, 0x7c, 0x0d, 0x5c, + 0x8d, 0x16, 0x01, 0xd7, 0x3a, 0x0c, 0xf4, 0x7f, + 0x71, 0xdc, 0x48, 0xe9, 0x4b, 0xfe, 0x1a, 0xd0, + 0x04, 0x15, 0x33, 0xec, 0x78, 0xc6, 0x7e, 0xde, + 0x7c, 0x23, 0x18, 0x8d, 0x8f, 0xc2, 0x74, 0xc1, + 0x48, 0xcd, 0x5d, 0xee, 0xee, 0x81, 0x9e, 0x49, + 0x47, 0x8a, 0xf8, 0x61, 0xa3, 0x9c, 0x81, 0x96, + 0xbe, 0x2b, 0x5e, 0xbc, 0xcd, 0x34, 0x0a, 0x2a, + 0x3b, 0x8b, 0x7d, 0xa1, 0xf2, 0x8d, 0xb4, 0x51, + 0x9e, 0x14, 0x78, 0xa3, 0x58, 0x65, 0x2d, 0xd6, + 0x50, 0x40, 0x36, 0x32, 0x31, 0xd4, 0x3e, 0xc2, + 0xe0, 0x87, 0x1c, 0x05, 0x95, 0x80, 0x84, 0x24, + 0x08, 0x6f, 0x5b, 0xc7, 0xe1, 0x1d, 0xd5, 0xa3, + 0x94, 0x44, 0xa1, 0x7c, 0xd8, 0x4b, 0x86, 0xd2, + 0xc6, 0xa9, 0xf3, 0xe2, 0x4d, 0x6e, 0x1f, 0x0e, + 0xf2, 0xf5, 0x71, 0xf9, 0x71, 0x05, 0x24, 0xc9, + 0xc1, 0xe8, 0x91, 0x42, 0x61, 0x86, 0x57, 0x68, + 0xd9, 0xc9, 0x1d, 0xd5, 0x5a, 0xe9, 0xba, 0xe6, + 0x15, 0x8f, 0x87, 0xbd, 0x62, 0x56, 0xed, 0xda, + 0xc2, 0xa5, 0xd5, 0x39, 0xac, 0x05, 0x10, 0x14, + 0x4a, 0xe7, 0xe7, 0x3c, 0x3f, 0xb7, 0xbb, 0xed, + 0x01, 0x6e, 0xcd, 0xee, 0x81, 0xb4, 0x62, 0xf4, + 0x62, 0x16, 0xff, 0x20, 0xb4, 0xf0, 0xbc, 0xff, + 0x7d, 0xd9, 0xcf, 0x95, 0x30, 0x27, 0xe0, 0x2f, + 0x98, 0x53, 0x80, 0x15, 0x13, 0xef, 0x44, 0x58, + 0x12, 0x16, 0xdb, 0x11, 0xef, 0x73, 0x51, 0xcd, + 0x42, 0x3f, 0x98, 0x6c, 0xc9, 0x68, 0xc3, 0xf4, + 0x5b, 0x0f, 0x5d, 0x77, 0xed, 0xdf, 0x0f, 0xff, + 0xb8, 0x69, 0x98, 0x50, 0x77, 0x7a, 0xe8, 0x90, + 0x27, 0x46, 0x10, 0xd2, 0xb5, 0x00, 0x3b, 0x36, + 0x43, 0x6d, 0x67, 0x41, 0x20, 0x3a, 0x32, 0xe0, + 0x2e, 0x5a, 0xfb, 0x4e, 0x4f, 0xa4, 0xf7, 0xc2, + 0xe6, 0x81, 0x1a, 0x51, 0xa8, 0x7c, 0xd4, 0x60, + 0x7c, 0x45, 0xe2, 0xba, 0x5b, 0x42, 0xf3, 0xbf, + 0x28, 0xaa, 0xf2, 0x90, 0xe4, 0x94, 0xdd, 0xaa, + 0x22, 0xd3, 0x71, 0x33, 0xa1, 0x01, 0x43, 0x0e, + 0xfa, 0x46, 0xd2, 0x6e, 0x55, 0x5e, 0x49, 0xeb, + 0x94, 0xf0, 0xb0, 0xb1, 0x2e, 0xf2, 0x3d, 0x6c, + 0x00, 0x5e, 0x01, 0x56, 0x3b, 0xfd, 0x5b, 0xa1, + 0x2f, 0x63, 0x1d, 0xbf, 0xf9, 0xd8, 0x13, 0xf7, + 0x4d, 0xb7, 0x1e, 0x3d, 0x98, 0xd2, 0xee, 0xb8, + 0x48, 0xc8, 0x5b, 0x91, 0x0f, 0x54, 0x9e, 0x26, + 0xb2, 0xc7, 0x3a, 0x6c, 0x8a, 0x35, 0xe1, 0xba + } +}; + +static const uint8_t x86_expected_contents[] = { + 0x1b, 0xd7, 0xd5, 0xde, + 0x2e, 0x43, 0xdb, 0x9f, + 0x1a, 0xa8, 0xb7, 0x26, + 0x48, 0xe3, 0xc7, 0xca, + 0x09, 0xec, 0x99, 0xcf, + 0xcd, 0xc2, 0xc8, 0x7d, + 0x80, 0xb8, 0xde, 0x21, + 0xb0, 0x2b, 0x5d, 0x8a, + 0xc9, 0xc4, 0x86, 0x02, + 0x21, 0xea, 0xfe, 0xf1, + 0x76, 0x05, 0xd4, 0xb2, + 0xde, 0x6c, 0x14, 0x48, + 0x21, 0x9b, 0x3f, 0x98, + 0x2c, 0xe1, 0x5b, 0x47, + + // float_save.register_area --- unswapped + 0xd9, 0x04, 0x20, 0x6b, 0x88, 0x3a, 0x3f, 0xd5, + 0x59, 0x7a, 0xa9, 0xeb, 0xd0, 0x5c, 0xdf, 0xfe, + 0xad, 0xdd, 0x4a, 0x8b, 0x10, 0xcc, 0x9a, 0x33, + 0xcb, 0xb6, 0xf7, 0x86, 0xcd, 0x69, 0x25, 0xae, + 0x25, 0xe5, 0x7a, 0xa1, 0x8f, 0xb2, 0x84, 0xd9, + 0xf7, 0x2d, 0x8a, 0xa1, 0x80, 0x81, 0x7f, 0x67, + 0x07, 0xa8, 0x23, 0xf1, 0x8c, 0xdc, 0xd8, 0x04, + 0x8b, 0x9d, 0xb1, 0xcd, 0x61, 0x0c, 0x9c, 0x69, + 0xc7, 0x8d, 0x17, 0xb6, 0xe5, 0x0b, 0x94, 0xf7, + 0x78, 0x9b, 0x63, 0x49, 0xba, 0xfc, 0x08, 0x4d, + + 0x90, 0x3a, 0xc5, 0x84, + 0x76, 0x1e, 0xf7, 0x79, + 0x25, 0xbd, 0x07, 0x81, + 0x21, 0x29, 0x2d, 0x45, + 0x75, 0x28, 0xec, 0x87, + 0xf5, 0x73, 0xbb, 0xf8, + 0x88, 0xbb, 0x3e, 0xa6, + 0xbe, 0x5e, 0xd3, 0x95, + 0x56, 0x24, 0xaa, 0x17, + 0x08, 0xa2, 0x5f, 0x13, + 0xe6, 0x15, 0x06, 0x50, + 0x05, 0x42, 0xd1, 0x66, + 0xa5, 0x19, 0x07, 0x00, + 0x1b, 0x48, 0x7b, 0x47, + 0xba, 0xdf, 0x84, 0x86, + 0xdf, 0xcd, 0x3c, 0xe3, + 0x33, 0x5d, 0xe6, 0xc0, + + // extended_registers --- unswapped + 0x68, 0x63, 0xdf, 0x50, 0xf7, 0x3b, 0xe8, 0xe5, + 0xcb, 0xd6, 0x66, 0x60, 0xe5, 0xa3, 0x58, 0xb3, + 0x6f, 0x34, 0xca, 0x02, 0x9b, 0x5f, 0xd0, 0x41, + 0xbd, 0xc5, 0x2d, 0xf8, 0xff, 0x15, 0xa2, 0xd0, + 0xe3, 0x2b, 0x3b, 0x8a, 0x9f, 0xc3, 0x9e, 0x28, + 0x0a, 0xc2, 0xac, 0x3b, 0x67, 0x37, 0x01, 0xfd, + 0xc3, 0xaf, 0x60, 0xf6, 0x2c, 0x4f, 0xa9, 0x52, + 0x92, 0xe5, 0x28, 0xde, 0x34, 0xb6, 0x2e, 0x44, + 0x15, 0xa4, 0xb6, 0xe4, 0xc9, 0x1a, 0x14, 0xb9, + 0x51, 0x33, 0x3c, 0xe0, 0xc7, 0x94, 0xf0, 0xf7, + 0x78, 0xdd, 0xe5, 0xca, 0xb7, 0xa6, 0xe0, 0x14, + 0xa6, 0x03, 0xab, 0x77, 0xad, 0xbd, 0xd2, 0x53, + 0x3d, 0x07, 0xe7, 0xaf, 0x90, 0x44, 0x71, 0xbe, + 0x0c, 0xdf, 0x2b, 0x97, 0x40, 0x48, 0xd5, 0xf9, + 0x62, 0x03, 0x91, 0x84, 0xd6, 0xdd, 0x29, 0x97, + 0x35, 0x02, 0xfb, 0x59, 0x97, 0xb0, 0xec, 0xa9, + 0x39, 0x6f, 0x81, 0x71, 0x2a, 0xf0, 0xe7, 0x2c, + 0x4e, 0x93, 0x90, 0xcb, 0x67, 0x69, 0xde, 0xd7, + 0x68, 0x3b, 0x0f, 0x69, 0xa8, 0xf4, 0xa8, 0x83, + 0x42, 0x80, 0x47, 0x65, 0x7a, 0xc9, 0x19, 0x5d, + 0xcb, 0x43, 0xa5, 0xff, 0xf8, 0x9e, 0x62, 0xf4, + 0xe2, 0x6c, 0xcc, 0x17, 0x55, 0x7c, 0x0d, 0x5c, + 0x8d, 0x16, 0x01, 0xd7, 0x3a, 0x0c, 0xf4, 0x7f, + 0x71, 0xdc, 0x48, 0xe9, 0x4b, 0xfe, 0x1a, 0xd0, + 0x04, 0x15, 0x33, 0xec, 0x78, 0xc6, 0x7e, 0xde, + 0x7c, 0x23, 0x18, 0x8d, 0x8f, 0xc2, 0x74, 0xc1, + 0x48, 0xcd, 0x5d, 0xee, 0xee, 0x81, 0x9e, 0x49, + 0x47, 0x8a, 0xf8, 0x61, 0xa3, 0x9c, 0x81, 0x96, + 0xbe, 0x2b, 0x5e, 0xbc, 0xcd, 0x34, 0x0a, 0x2a, + 0x3b, 0x8b, 0x7d, 0xa1, 0xf2, 0x8d, 0xb4, 0x51, + 0x9e, 0x14, 0x78, 0xa3, 0x58, 0x65, 0x2d, 0xd6, + 0x50, 0x40, 0x36, 0x32, 0x31, 0xd4, 0x3e, 0xc2, + 0xe0, 0x87, 0x1c, 0x05, 0x95, 0x80, 0x84, 0x24, + 0x08, 0x6f, 0x5b, 0xc7, 0xe1, 0x1d, 0xd5, 0xa3, + 0x94, 0x44, 0xa1, 0x7c, 0xd8, 0x4b, 0x86, 0xd2, + 0xc6, 0xa9, 0xf3, 0xe2, 0x4d, 0x6e, 0x1f, 0x0e, + 0xf2, 0xf5, 0x71, 0xf9, 0x71, 0x05, 0x24, 0xc9, + 0xc1, 0xe8, 0x91, 0x42, 0x61, 0x86, 0x57, 0x68, + 0xd9, 0xc9, 0x1d, 0xd5, 0x5a, 0xe9, 0xba, 0xe6, + 0x15, 0x8f, 0x87, 0xbd, 0x62, 0x56, 0xed, 0xda, + 0xc2, 0xa5, 0xd5, 0x39, 0xac, 0x05, 0x10, 0x14, + 0x4a, 0xe7, 0xe7, 0x3c, 0x3f, 0xb7, 0xbb, 0xed, + 0x01, 0x6e, 0xcd, 0xee, 0x81, 0xb4, 0x62, 0xf4, + 0x62, 0x16, 0xff, 0x20, 0xb4, 0xf0, 0xbc, 0xff, + 0x7d, 0xd9, 0xcf, 0x95, 0x30, 0x27, 0xe0, 0x2f, + 0x98, 0x53, 0x80, 0x15, 0x13, 0xef, 0x44, 0x58, + 0x12, 0x16, 0xdb, 0x11, 0xef, 0x73, 0x51, 0xcd, + 0x42, 0x3f, 0x98, 0x6c, 0xc9, 0x68, 0xc3, 0xf4, + 0x5b, 0x0f, 0x5d, 0x77, 0xed, 0xdf, 0x0f, 0xff, + 0xb8, 0x69, 0x98, 0x50, 0x77, 0x7a, 0xe8, 0x90, + 0x27, 0x46, 0x10, 0xd2, 0xb5, 0x00, 0x3b, 0x36, + 0x43, 0x6d, 0x67, 0x41, 0x20, 0x3a, 0x32, 0xe0, + 0x2e, 0x5a, 0xfb, 0x4e, 0x4f, 0xa4, 0xf7, 0xc2, + 0xe6, 0x81, 0x1a, 0x51, 0xa8, 0x7c, 0xd4, 0x60, + 0x7c, 0x45, 0xe2, 0xba, 0x5b, 0x42, 0xf3, 0xbf, + 0x28, 0xaa, 0xf2, 0x90, 0xe4, 0x94, 0xdd, 0xaa, + 0x22, 0xd3, 0x71, 0x33, 0xa1, 0x01, 0x43, 0x0e, + 0xfa, 0x46, 0xd2, 0x6e, 0x55, 0x5e, 0x49, 0xeb, + 0x94, 0xf0, 0xb0, 0xb1, 0x2e, 0xf2, 0x3d, 0x6c, + 0x00, 0x5e, 0x01, 0x56, 0x3b, 0xfd, 0x5b, 0xa1, + 0x2f, 0x63, 0x1d, 0xbf, 0xf9, 0xd8, 0x13, 0xf7, + 0x4d, 0xb7, 0x1e, 0x3d, 0x98, 0xd2, 0xee, 0xb8, + 0x48, 0xc8, 0x5b, 0x91, 0x0f, 0x54, 0x9e, 0x26, + 0xb2, 0xc7, 0x3a, 0x6c, 0x8a, 0x35, 0xe1, 0xba +}; + +static const MDRawContextARM arm_raw_context = { + // context_flags + 0x591b9e6a, + // iregs + { + 0xa21594de, + 0x820d8a25, + 0xc4e133b2, + 0x173a1c02, + 0x105fb175, + 0xe871793f, + 0x5def70b3, + 0xcee3a623, + 0x7b3aa9b8, + 0x52518537, + 0x627012c5, + 0x22723dcc, + 0x16fcc971, + 0x20988bcb, + 0xf1ab806b, + 0x99d5fc03, + }, + // cpsr + 0xb70df511, + // float_save + { + // fpscr + 0xa1e1f7ce1077e6b5ULL, + // regs + { + 0xbcb8d002eed7fbdeULL, + 0x4dd26a43b96ae97fULL, + 0x8eec22db8b31741cULL, + 0xfd634bd7c5ad66a0ULL, + 0x1681da0daeb3debeULL, + 0x474a32bdf72d0b71ULL, + 0xcaf464f8b1044834ULL, + 0xcaa6592ae5c7582aULL, + 0x4ee46889d877c3dbULL, + 0xf8930cf301645cf5ULL, + 0x4da7e9ebba27f7c7ULL, + 0x69a7b02761944da3ULL, + 0x2cda2b2e78195c06ULL, + 0x66b227ab9b460a42ULL, + 0x7e77e49e52ee0849ULL, + 0xd62cd9663e76f255ULL, + 0xe9370f082451514bULL, + 0x50a1c674dd1b6029ULL, + 0x405db4575829eac4ULL, + 0x67b948764649eee7ULL, + 0x93731885419229d4ULL, + 0xdb0338bad72a4ce7ULL, + 0xa0a451f996fca4c8ULL, + 0xb4508ea668400a45ULL, + 0xbff28c5c7a142423ULL, + 0x4f31b42b96f3a431ULL, + 0x2ce6789d4ea1ff37ULL, + 0xfa150b52e4f82a3cULL, + 0xe9ec40449e6ed4f3ULL, + 0x5ceca87836fe2251ULL, + 0x66f50de463ee238cULL, + 0x42823efcd59ab511ULL, + }, + // extra + { + 0xe9e14cd2, + 0x865bb640, + 0x9f3f0b3e, + 0x94a71c52, + 0x3c012f19, + 0x6436637c, + 0x46ccedcb, + 0x7b341be7, + } + } +}; + +static const uint8_t arm_expected_contents[] = { + 0x6a, 0x9e, 0x1b, 0x59, + 0xde, 0x94, 0x15, 0xa2, + 0x25, 0x8a, 0x0d, 0x82, + 0xb2, 0x33, 0xe1, 0xc4, + 0x02, 0x1c, 0x3a, 0x17, + 0x75, 0xb1, 0x5f, 0x10, + 0x3f, 0x79, 0x71, 0xe8, + 0xb3, 0x70, 0xef, 0x5d, + 0x23, 0xa6, 0xe3, 0xce, + 0xb8, 0xa9, 0x3a, 0x7b, + 0x37, 0x85, 0x51, 0x52, + 0xc5, 0x12, 0x70, 0x62, + 0xcc, 0x3d, 0x72, 0x22, + 0x71, 0xc9, 0xfc, 0x16, + 0xcb, 0x8b, 0x98, 0x20, + 0x6b, 0x80, 0xab, 0xf1, + 0x03, 0xfc, 0xd5, 0x99, + 0x11, 0xf5, 0x0d, 0xb7, + 0xb5, 0xe6, 0x77, 0x10, + 0xce, 0xf7, 0xe1, 0xa1, + 0xde, 0xfb, 0xd7, 0xee, + 0x02, 0xd0, 0xb8, 0xbc, + 0x7f, 0xe9, 0x6a, 0xb9, + 0x43, 0x6a, 0xd2, 0x4d, + 0x1c, 0x74, 0x31, 0x8b, + 0xdb, 0x22, 0xec, 0x8e, + 0xa0, 0x66, 0xad, 0xc5, + 0xd7, 0x4b, 0x63, 0xfd, + 0xbe, 0xde, 0xb3, 0xae, + 0x0d, 0xda, 0x81, 0x16, + 0x71, 0x0b, 0x2d, 0xf7, + 0xbd, 0x32, 0x4a, 0x47, + 0x34, 0x48, 0x04, 0xb1, + 0xf8, 0x64, 0xf4, 0xca, + 0x2a, 0x58, 0xc7, 0xe5, + 0x2a, 0x59, 0xa6, 0xca, + 0xdb, 0xc3, 0x77, 0xd8, + 0x89, 0x68, 0xe4, 0x4e, + 0xf5, 0x5c, 0x64, 0x01, + 0xf3, 0x0c, 0x93, 0xf8, + 0xc7, 0xf7, 0x27, 0xba, + 0xeb, 0xe9, 0xa7, 0x4d, + 0xa3, 0x4d, 0x94, 0x61, + 0x27, 0xb0, 0xa7, 0x69, + 0x06, 0x5c, 0x19, 0x78, + 0x2e, 0x2b, 0xda, 0x2c, + 0x42, 0x0a, 0x46, 0x9b, + 0xab, 0x27, 0xb2, 0x66, + 0x49, 0x08, 0xee, 0x52, + 0x9e, 0xe4, 0x77, 0x7e, + 0x55, 0xf2, 0x76, 0x3e, + 0x66, 0xd9, 0x2c, 0xd6, + 0x4b, 0x51, 0x51, 0x24, + 0x08, 0x0f, 0x37, 0xe9, + 0x29, 0x60, 0x1b, 0xdd, + 0x74, 0xc6, 0xa1, 0x50, + 0xc4, 0xea, 0x29, 0x58, + 0x57, 0xb4, 0x5d, 0x40, + 0xe7, 0xee, 0x49, 0x46, + 0x76, 0x48, 0xb9, 0x67, + 0xd4, 0x29, 0x92, 0x41, + 0x85, 0x18, 0x73, 0x93, + 0xe7, 0x4c, 0x2a, 0xd7, + 0xba, 0x38, 0x03, 0xdb, + 0xc8, 0xa4, 0xfc, 0x96, + 0xf9, 0x51, 0xa4, 0xa0, + 0x45, 0x0a, 0x40, 0x68, + 0xa6, 0x8e, 0x50, 0xb4, + 0x23, 0x24, 0x14, 0x7a, + 0x5c, 0x8c, 0xf2, 0xbf, + 0x31, 0xa4, 0xf3, 0x96, + 0x2b, 0xb4, 0x31, 0x4f, + 0x37, 0xff, 0xa1, 0x4e, + 0x9d, 0x78, 0xe6, 0x2c, + 0x3c, 0x2a, 0xf8, 0xe4, + 0x52, 0x0b, 0x15, 0xfa, + 0xf3, 0xd4, 0x6e, 0x9e, + 0x44, 0x40, 0xec, 0xe9, + 0x51, 0x22, 0xfe, 0x36, + 0x78, 0xa8, 0xec, 0x5c, + 0x8c, 0x23, 0xee, 0x63, + 0xe4, 0x0d, 0xf5, 0x66, + 0x11, 0xb5, 0x9a, 0xd5, + 0xfc, 0x3e, 0x82, 0x42, + 0xd2, 0x4c, 0xe1, 0xe9, + 0x40, 0xb6, 0x5b, 0x86, + 0x3e, 0x0b, 0x3f, 0x9f, + 0x52, 0x1c, 0xa7, 0x94, + 0x19, 0x2f, 0x01, 0x3c, + 0x7c, 0x63, 0x36, 0x64, + 0xcb, 0xed, 0xcc, 0x46, + 0xe7, 0x1b, 0x34, 0x7b +}; + +#endif // PROCESSOR_SYNTH_MINIDUMP_UNITTEST_DATA_H_ diff --git a/src/processor/testdata/ascii_read_av.dmp b/src/processor/testdata/ascii_read_av.dmp new file mode 100644 index 0000000000000000000000000000000000000000..3d2429a622b06b26a4d784fabef3055cccf60215 GIT binary patch literal 16566 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 iWhUU~I^1#pOf&T-i5>E60 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/ascii_read_av_block_write.dmp b/src/processor/testdata/ascii_read_av_block_write.dmp new file mode 100644 index 0000000000000000000000000000000000000000..265e2b7daeb14f1d7d81e8c476bdcc492febffd4 GIT binary patch literal 15194 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/ascii_read_av_clobber_write.dmp b/src/processor/testdata/ascii_read_av_clobber_write.dmp new file mode 100644 index 0000000000000000000000000000000000000000..f536c72e5896fdf4b8d92f81283c5a3dcf630f8e GIT binary patch literal 17402 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 KP7nNYJn&C-*l33U literal 0 HcmV?d00001 diff --git a/src/processor/testdata/ascii_read_av_conditional.dmp b/src/processor/testdata/ascii_read_av_conditional.dmp new file mode 100644 index 0000000000000000000000000000000000000000..eba8f9e7fb7dbd681c325a37244faf57fc2ebb07 GIT binary patch literal 16982 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/ascii_read_av_xchg_write.dmp b/src/processor/testdata/ascii_read_av_xchg_write.dmp new file mode 100644 index 0000000000000000000000000000000000000000..066ebf122d99fdfaa56e2293e73ff0bfb0e6c912 GIT binary patch literal 16390 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/ascii_write_av.dmp b/src/processor/testdata/ascii_write_av.dmp new file mode 100644 index 0000000000000000000000000000000000000000..6f3e3bca0b49f2f0236f8930a1fcec9cd80d462c GIT binary patch literal 17702 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 DR4+hk literal 0 HcmV?d00001 diff --git a/src/processor/testdata/ascii_write_av_arg_to_call.dmp b/src/processor/testdata/ascii_write_av_arg_to_call.dmp new file mode 100644 index 0000000000000000000000000000000000000000..9c0a21cd7a19d26e44e2e180f6ea6f5ace10ab95 GIT binary patch literal 15942 zcmeHO3tUxIy8jN60X`s=d|@7q30RtA^dCu*Z#?_#7-VY%+V$%i;FKqSQjq{Qqm84F?8J!OX8;zdJ5id#&}Y z@4ddY_E~H1Ju78a=Dm+s<_3$15t%8tYIBBG6X}798F@~CNFd7Q5Rn?xFCYy0$Ow_1 zD7PYSGl*P>auV_#$f3v$$Ti3Y$-lZc%DuqvJoS_dhJ+c&53Hnem~L%!}mg6lyM5#+PAIlZv=_Nff-BM!7N6RSuByryB>lvC09&R zD2tFyK$tB~K#E~^uGn!k!qP%15{shh=+X;7gW{+6w&$4wUdzM^KKW7r{y)r<+6J`n ztnqj}b^SE%@O`x|hvlIy(W*&%m|&7h(~!K?pQNaT0?WfSzv{Xgb;*a%-pp#{*GUSJ ziC`FYnFwjp28mSl*AR_bAyT2?$A7&}K@J1IbgYIyV5p9yl|xja`9LZ(>%V_?bH-lA zO*hhb(9|RLI#1DVt#6R*`Mke8_|y~E1|s%e4E*vOy>Gybcrv+im|jlxG77{D(#J^W zeJLv8m*}mI$}e3SG)(%I_mOvx&reTjC(GcK#nPXwQD8L5udGl_*1|xEc{5PngRI-T zDJu%H7WkD_vq0IE+)sw2^poFY%uBEHk%gHoiDAJ@^^$gRWIOWV6@ahxD{Gun$*Sxt zk-PiIQ^)3~KZnK1cf5YA4|7JmXi^e(!h% z%h=ZfWfFY2xSO&#moG7@5$WWz)hjDZ*4)rXk|67k-IT>RoM!Aqi~>h#_pb_(+eaDH zy75^zWsLwoi%~J{e`dA5vC721utV!0W@_Vyx;d zh47)Ro3iM`@qT4hlqfaod&s-SK#3dm$Mi}cS^S-mLxoW?`HMsDA8zz3>nbe{Geusn z6?p}AC53m-hqUWazp|(;cU&nlMY6Gfv16y!XagyM} zC8Y~ou9Z~DlIw8Ikm)iFdZzkts_&GOTiNG;-L!5g{5C;y;3@9=?6BH_ya*P?N+}?d zC0=pWJxClU@W%qj1ll}UkO!<>KrG0Ua3v%MuvkSq4%dmWlI=ubBmyS~)|V&`ZE2~UC{L(X0 zc6glk1>Oa8iX22D=S2zn?5O#!z+JJ$2CnVr)l_w&0fRb7zYWlU9#03I|71}4nsDN%iQwi%=pJSREQYmAEJ0Ngtg(LNu`ZCvy(*~prmGCOES=FovTn`f=b8dm4* zGcbN2JdrXb+hosm6ckyqQ!II|e7zNGGv^73P7L~RThkvdy?#sW4N)gU{^M=_9&r~t z%~op*N^tq|$OlgR*Nlw~?`)nqG9g5vEV0;&E!J@fEm$AyJ?eZ>E}XVv``uf{^w@vU zKt>u?UarH^f|s%MlTRb>yX5-2%Es4Ej#yVlydp=b$v!#W99uYU(u5Yw<7Zw;X*^bW z?fRnEti$fCxR!FwdHDqvtE~km|DJuty=ME#V{Qs2l4u`GKWG!q#`uLN$ z6JN|bma#E+dU)lKm&3@&WM5`;wy`f@*2!OAQujv2hRajW^)=adl9j_^DkyQZsx;}t z@Kq<~+cLIa+RNCOuq&CIa?Pc=wn86=TE9KLbNinQ)1G_pNblj1+ioF}t;B7&*-I9+ z=u|fIFQ<+)AH4dB<#((d&U@tx6Yk0w9x=#%GyM>sQ-;*0W& z^6ft2dLL>|KM+)yzHwonH)h|n=`JF<^Ub~*6+F9s#*7dCZQ65zC+>OBAXy5<<*@j& zd2G?$yI)CaoU#3M>8`yKANfRi(rR1MqD+FRe`wa{BWG?qdeKv*qc6Cf2rh?hYpoh$Yg-1p4n=@0k1H*|3AmoF-V3X6(-xSZZ` z)xgV^98cTQ|GH;0X2o4flp=@8**XM6cic5~{M?Y#KkZs3&&BNcJq_~WR4msl7%}1!0Hj|DE!=+<$Ys-8<0_WT+sfheEX;F zCP%T!woKewnd4A3tEHHwEziD$rQK9uXX&shu*0cZ&Jrtu&XS@$MFrcfQbkpE;Y|`L zn-dvm_JmiXdP_~<%e|$%if-D)C-)un(duyr{;s2n_U{_<_cW2<7sx)oG0=`I3Vrld zXLLQ;7opKrqo96aQni<0>e!au?y_s7Y9GKIskgr)c%W1r=m;JpRR=qP{~7RIgK_CV zHqM!47vH{V+xK!1%sd2eM|!=|5qyADz1kj*_WGuRI(Mt0>_~s9)LCu;opU zXJ2YF`epHji*Zu0SjyHABeSe*0Pq@qxy0kyo7x<(zDcK?q)}Qyx!B;vnpf!YKtRyo z81aN}a>mfv;GPDYD(*Vh4a)SqzI)%AG;pRYhy-(wm-;mus8wIq`a_vz;qi}0OG6T9 z=l*K_tS0k1^%}^$oCWjO&uScZsNsXZcswg>KEfDY`B}rqXsrMErrmh_i(_;UQtLNS zPeHvPx7cj8*rm3>yHmJ0D9okrB&f%Tl;h82j)+#fi@Dz<38s>tJv}M#1`E=Y!};4x zWIuKsnWzr}ZRLV~uF3np*-iK)$Xk6;qmo5K3Cjj719?(AICcB_3QY&%_U_T_qKr-7 zB}oPP29Ast>c+%Amh7)Z#PEtaP)%Ic^)d?hH$L>0i*ymG$DbjM&f}_njjlTIt@!J{ z1*hllS%3$KolA#!-TI3Ul~ zH5KbG(k9TQ;GV+!MB@g~@7SYa=WW1;ufi`6l7@Tug8pPsQ;`Rg)P zjJVRh0rc?`;@qqgHw(CWzfMC1c$l!_GEFx#XxJC%wfo=>&2HTm>dk(I-&bS+@Mc6n z2IvWY1oad5X>wjCb0mFibeRelV?tg`wcc^r;FbCEBbrR|+B_@{HpdIcY&H6sbiS&A zC&~-|WR*wJ=RCU(_pVVg5FH$=+YU6k#vOqancf}at~$L=4sW(97S$;C z13qL`yn7*h6@+pMY#-t+onywn}C?8!{ zor!VZ^lYfB5(vz<;b};kY{a`!xG#S~8!b}*rB%wm*L)wQtV@_TYyi>tPqpI<-$P$X$qI^*|3wg-uZww4<9vXJTg&6qQCr6 zE9@o=+f1}66FTGdLk-S2soyhS#Q{%LjL6jGy^W!+MW0$#o3X)!{ysI(Z<;}pjcD&b zqrq38PQHYb7j5Nw!G)za@>bZzyjj_YFUJ&J8o$yqY=cj@D(be5d`z2Xw5c*S);$39 zM&v($R`U<$H`;44Ur-?Rg1i7ZgeSfUM?zg08nETs2%B$%yaqss(;40%;A}$<^HMGa zugTXGtKWc(AN@-uJ@ynH@F|nJ^PK0{-fz_T25Gn9JcYXGJeLBO$%ZoYm5I)Tb1`my z<;Ho)bJ>E>jY`HH=&wM2=Ga7M`@Sl`sfVsZHQJZI)rv>{I-ff9H6TB}u;YI6Sb-;w z)fihR@}j(nPJW5SHs_x2Suy!?EGe7)q$Q628{J3*rXTnkOhanDk{1(s>tBCu0Ibof z=~4+9l*1H{xycmS3>xewsDrNST=dlf&bZ5FKN8Qpf>lk6A0z5kukei^BMA*sGv1e~Q_=hu>R0OOfFvk^<&OuTf+{ui(g@QXEm zL6;7O`~r<%OOiKn{3V^gj>CB1*N_bt?o|Fbj55vZ7afOX25c(N*7jUbU3eY`kn#z? zzEmv$xL2T6DPYev>fDM4|jR337sQM(m4&Zq=89KJFD6gR4>JUXk_EhqX0Y$789d kOyDtbjD7ct4+74;V!Sb0@z(M6vNO2ef4)5Lf$n`TrX?aM5RO{x&QyX=RF))IEL-+?RR6&Z_dm- z^UU)#&&<3t^S-wy+@8GhrIPd@5iub$q#s(Fq~%1~AY(?HZWIYXS{p1`f%HI1N_vZcm6UbR0JmE5 zTse7`+wzkDlSQuqDW?|gMM#6=z#5aWUGEBi-*B6_4AjA9bGohbro9|NOgNtaB? zk-3POKu8rQAbHR`UF`TbLDL+`6^m-s)L%OQ4T_##+n8noXe|^g=wwMY=wF#8r8RnK zmen__*cb3(g|2Qoe^1T&s<}&@jfD!Sh_>$gwI^IJl03%56 zBb{~xGM)P9rKZv|E)5zg9g8~17oW~dOl-u<;Niv8AFuu(6z7*$h{kJ9fJ7b%kfY#L zbd|gYfY&{Kc|DY?^oj|V%l2S-cT%^+PkeZZ1j#L(gBIwiKfMNm(EWaS4RtDBB^{;T zwhprS|hy#{u&*6^?IH2%j>viL-_VPFBoL$cj40(HR5IV_#snYy&C&G zhP_;WLjzSC6~5GXm5HpJY>)}>%uFn6#H-$h4S6-TA$@*~UtWDQ8x|QPHq|Hruwh`Q zA7{hHyyzS0etF&E>91g^8yGB$;fF~-l2=nUe8?}arFqJz$woPwYn1lT>&c(MYlB~2 zk7;@x2$S6(hRJ34{E?r)YrkJ!7c}3n86|h3QC@@%`&{?q`l~4$R{Q0()6-u;GUQ-@ zjD!u%SILWGIn1Pbq?y0<9$umH(48G*EO@QEN?!ECv3_|C(AKYFk%#*m)Vy)>DtU#2 z*BrmRx@c?4fgm~AH&|k!SKrR{{be^|y~KQ>r{h77p{cd9FW^f}_-i(F)ofT5D8ZH> z*$qF;@ZrVvxVd?wDc@LYYL*cy>NLH|x{5LNdU+qb)?Xzr>b27^uS=TGn+&r2v_ZDR z=PR$07ya;*UtVXu^ZcU!G|DLS*Ueq(`>Q23B(Dy1kYSoaTqgA|LJ%*$2IbcfC3r zQm^0p`Jb}8Kb z_h2rvy|LQKL_-tb_=jy9WJwBFYf;A(At4G7aB%M0U)C!207L^fi(m* znP`y#xie6g4u}PDB>oAR4OoWaw@<5w<&z51RXDc(XXoC#UWsCuA z80e-!B8QT|j@Fbxw={d(Ur#wfAy?5%Lz@h>wggmx{=gaXC&C_w+7Qr!zHQc2lQ| z3u?y65x{w($cLmUcxq1ojQF~|$TkQ|u(SGS=+J=a|3M)Q>q$O-R^>s0`B-~;qF0T> zI{p7W{9Jt51VcCWW!gTDe+arSt2|Dj(`zE#x-YLlxz(2iGhnMPD`#oqPoL-h8FQKm z{2TjnWwlKzJFJlb9oICFt`s*UhuRHRzHG$Wu^#1CUv6NcUt}RAH6gX9aZmo<8ONr) zw5n|MnG;8s@&?vCIxW+l?#Rxyq@`G_mUM?jFGtzT8Ny~KyMMK@dQHR~FYdW>z}et` z|BO#0?mVa2YW1Q76)o!byOS?ZT2=Y^+9`cwgB8kri#^X`9UAM!I=-XA`IcNeVacW^ zUL4$J=WagrxHYT{F!tg-W*OJ^&wrhp^xU#jZ$#a5U8Q87_DLq`txB7S;t zUqaQ#CDR_sJ!tLySn)KnHD_dHTdX!OPS%s}=e1AmKKb#Rm(Htr?#+wDQN)~Hl$z70 z@-7?yE&i$d_E+Bc$=Ml7db=&t?u_%|tWJN`R#JU9@!8$)F0cJ&(O;G94u>r#)0*Q& z`pc>4li%F^anh>viCs&2ycbGBnf8S?X9M+&x1aq@pTi#|J$2LM%N;ZAuacC*l9`?F zs26GES6%NvIn$Q3DWaXJDt1deDW#hW(rr0D_OyOi^XjG#a;9!QdZ_&k{Wd;8BwN1Q zZnNjl^~&_fSLsCM_Qe_XWUkwZ^>c^i=&7N^SwT3)35-{w6wXjw)4@7De4a!|N4 zNeMnTD>uvT!>;|_+QeOfIf<+0boeOs$!8uXk~_=nD^d0vk4&0${9h()4LJGaYJ;RG z6qm!|OXh{SPi)&awrbL*nu0AmM*QKFvZU2E-z!XPX6KNU(|xCGtmw44VBj?m6T#)M z4TcGswuWRednHOKUbX(l^F60NKe#w}U}eQova>n# z&TNAcFVA`5ju!)@9FOHHfM<2ZW^LAqEa%+5rx`6LCyh3fjLL<{;&ZsoG z<6`JM%Amrr9~Q%oWz4Tfn@mSurfs3PwRE;a<*b%GrnU_Ge5UryY&%njO@SRwRdVKA z33TS?W~f%^d#jX^?iRd6Bacq+7htaIT88Wc^fOULXqEWK}sH3km*RCz=dTH&-kWju*DcwOZWo$@p+oQKh>H7dTCEm`a z-~m#)t0{P(l$?;@r98^hx=GUjrt zaD8B?OW#TWN8WoUbY2(u2VwMA3?)CCdbSWLIv(PJ>#L1@F}582&SR^MSTgH6mvQuX zY?wttQGT#fmExu2a{Eo(k&WP=0k)-6g_41|l!KA@?+mK&jw2iMZE9VF-}T%%7jX{1 zt@%9j49Wers`0D8G{nc<*Fb;!@a4I<%T=NMx1Mq7DeDQx3;jY5^dE*fXivM01dlhz zUvd>y9KC^Kzu%>C^51P^-Q-<v@r+E^p>& zcI6REh#^wROMP^`_4$a{>>thre924iE5ch6elA<~*5jv^^jg!nzw|A8+z)kiComwG z@?}D<5qfwfv_h&=E7UmIhG&53W^LWSPa*KSRAie$-qXt3%d2`@-&DI=6&VKl@pxw7 zn#=WO9VR0_1C5Rp!+{BDQiBT4cQ+vxCq$@cqhIo~Qzhnq&bxmZQz0+iS)-n@PGJ6W z53h0wp0haTPkb)Q&HR*e(>*W1z<8c#FxPL-xfrWB4`VLp8b^Dc`yfFrH)GMhE85Q< zf#*!LLCXfAId}u4){YLK!lLMY|uq6sFd|__kp}+Khzl^w1@JoyU^!G44RLiy0p6W}dhO--i|G^?Do1 z!$XH9H)^sS0Z-N~KwIj4&vs33T^GvDdWDY{@(Y1CsTX*lJ>h>q{*;H$ha`@m_l?d| z;i6ASiy9gFro?vHWLq1}+qstqe34*P_W zIC?HxKL+?<}o<2-;dPOxhdFnfx99zi`Dl{KB zjPhxe+hXUI0KU|*>6f@1>UBHc*C~8`U4Q*blU1X=+G97$djG{p_q}g~xJrP)SPLDd z;!=7P@!nzeY^}WF#KrxCv42XB0j@u856t&%GR0KplwR3s+Fd zhF(&W5+O(aHA1pS_mbgnM!AcSvd>9Ng4QVb&B$tWddUXD5tbl!pAjLZ&)3MYkJrc| z&}G1@mqE5Y5pq59MdYQRc#QxL+r2;-?KhM|e)2f-txbaQx(D~cq|dn0BQM((cPYew zp#*jUB}n5l%lj zwmn7p0gv%ah?M2%su0(#uc0sU^bH2ocPNK^6ATh>LV2tQz65#dLO5wrSI!rlSa^N2 z9(pmZRr=v$=%%?|;&Kj8Uwc8FW?5XjI4@%4{K zI2+eR0!}$}8RAgB>63aq(%0!sB`)GibDFLvjU~96jk^fj0B>%_2q!;QW0_;m_e`C1 z*_Y(adbTBweim*b0>c$PnA4Ez|4EC1wDk|<0s*VCYO<7o2l+6>U~Dox1Kxsjd&;28 zIsiNCl+J~j#eYN|G!+k`)jo0d5$2`D~`uLIIG!W!RdhY_Cw29*{==60Q z`U5{0t-N-Pvd00WQ$2RkahN7Sr=m3NZUdqV&o%*4HsJ@Vssz9uRIWy;9bz&f$Gvv| zFwaJwKpf6#I*9hB-396HUu!<5%SIesHufL;Bo25CNr*htRd*&hFJ$1kp>JS&>cu{% zuB64i^n+b0)P9Gw^(cQyJ4zGH#IKBs+= zNcXN4ns0-rZy;Ts128>+HarJle)D;4?jekrO2|)APGKlN;F0&SYoF{!C_OlMO#N+tb}M+sXVi z-95Xr5zh#6M^wB3r>AvSNAA=E^{%u;C03oXhyosUMNmQNPARSw4^HYx)#;g2G55Xq zzSlGRGaG(_TFG=W^S$@I@9%x@eci9$bbmXV9L?N)FCps)ArgG(@vQIG30@-PG$@4O zGY_9N@X-MASd@^{q5MwxtiPI&GXUNPpFSv`Ng;fmgYs#lJoL1mkVDr{-ty2t0`Gx3 z6N9K7)qvemxgF(x{%DD_p z1QdMRfsgv*)gJ4SFpK&QjB?C@Q7{?~0Zp`5K-zD5P`&5DhmO5c=U0F$rtk0KVD?@SH9QJ z0zk~~PVz*%=;xKMoW}SMuHk+;bln^Xq=d4voJU-M|^3*YDV*4Fj2rsltL z{`n{S@Xcg`$1(bgoZEDEcG(`nk{j;C+IZ!cP66^mIN=p?&Kgyp!2)qTKYq z^ZMuh6D1pXQ9ho}oWQ5X7zA4I=}Uq%0p!6A4k6#f!^ z5N$Om%!&%Y2T{MUW2&LB)|=s*j)$=KJ;-xtLq97W@Nq~iPS23=WuCb(E=7M1A%5p= z++PAO_yiPoXOLd-J%;u3f3eWtf=|$k`aZNPZPF`ID?UYkcvKK_Pj5eKe;MTqIZNzY z%lq~7OE~>=SZB=i3+qo@#@p$5&}*TP^8&Wh{!<+NP?{^zzN4Sw^AphQpl$RJbpaRm z|3{bhi>3u|vHWLHkAPhIQu#s%ggLv`3I7Wy#z8Z zNB@cTr|$Z*ADr>@gX!bRed?}%c(iml`M^_m-MnYrzdZC+!M_-;KYxIsgkGw1xucW5 zOVHoX;CQ|RnS~s$v~d1Mv0g{`_XrOmd=lY*Bm5P@=;d6Ffp8zf4yJKG2Yz7NX%LWL-qp16>bv zJ<#<)*8^P-bUo1ZK-U9Z4|F}y^+4AHT@Q3U(Dgvq16>ciN)Pz_nq|!B78#hxj~6o8 z@yT6@X~!|`xZiJD_2!&fua%6lPpw;~uUxN}D>{^`yv=7SD%p}v4Q$H{BoqFIZTTy8 zRjK$np?|tw)%_Ktq0}@>pY<0lUD;zQ8W|j!$mdhp!tiKebUZmRl1emxa&@h@AzOFDhKDKpuh}yVy7+4y`M$KuE!5z6mHkVG=_B2UunaCA# zsa$S&e5^pr1Ic6-s)Ya*^lQb2?H%17(0cbM>ST;0Q(FfnM)J8r zW+0#DeX*w%OZS(l2mD-{Pt!|EqvAlv9Z;9bZOe~mghpXeayXY68Q7JG%OsT?&W~pk zGtj%C(r1;BbIWEToWGKI_Z2%2$CqwZ8%_ZtEsVd5x*H*21rBYO^I1GX_=Pf&X zyw$qasOTgO9X{@?AuvhA$fpN#sYHMbkLB_MV}q&01eHjx9p8d8#@21ysMpB0?3T#j z;Mf2aKciU8FRH4j)4G3;Rg9==fjg*BQ*&E$Nzxhx-$Z_^w~rwvz$biY;$&p7Fqq$! z!MY%#Gs~MLBLD|S#=$fe0Y#(cuYe(@Vd~NqHvDH4kJ=>Yobupc++M%5LesEb&KHx6mK^Yq2A45D3lW+d2=`vR~1$W#GP4I z2*&GB2yYGtC&{Y*SR>Yg=|ybCag_Xac|J&E4KKYh2<8F)1uMzqRVQTRkysmt^c!a zWxcIzx0S87vZCs)oV|5EY}7BRX|yW6EgP&>akp7!tPvpJZR)K`*(kXU#VU6lB{GZL zW>zk@m9Z}r@09s)&~melzS&OGCf_kiEoEk{WrRJmpv=vtQmbu5rpjj#!`EkAtE+8Y ztG0Ko8f+ul(<;yEZMN3i`c^f=Evexa1K?YgnK~a>YQ{~DOJ8fWNM@_8vSPQoY_;5I zRcBgaN)^?Wqs;KYrQ%DK_Hs*Rx#E&*tzuJcX==`DF3DV*Wolb*^=gY=X||**wU(dj z z2hmEig|E|@hv5S7GU*ICX1|U-8FBl9`>b(t!m8$%Of3Dd982e31mG(Nq?$8e;upTdKcgz{S8n ztt%Q>W7ZwNUMu@e-73{BRrgnQtE`)0pQBbt1}-?+1if@X5iab*`Gl1(mT$^RTN1u& z3Ihd2+MX!bSKl0mcCkiTX}#sEPkXC#-o5s;Uv1b9UA0vjWus>Mts*QVY(HG8;%%$8 zMb+gOaj##fQAEFZ%k_!^URb2B*f1)ZQ?FNS|88YQ@$c65EGDrRvxp9~8W;tyLXoiH zI^M!GSyvlXz2<;NaEV#~_c$c8E1w=8TkPyMJJp6|0iWMC9G$z^*sGK6`Ec9Hh%Rln z!`jMS>$0U1V76xl3b0VjZynE$=F=%ytSF`lW;DDvIT4c0?HU_&SGKv-$ne<2B&^V2 zR_sdU2(BgBqJ%G(#o{NIPL06Sr+o$o_+j)(EECJzcMP zgOR9OuhcC-PUe&25R799qw2*lX(5xt+4iM2o6NeOolg48nITmAFDC6B$?(X7h#A4p_x0J^_zq3K3X=_}Nav2lZEWIDVn-N@RQ|WNd96;H0f}tFCC)O^R&B*ps3ny$R zVTy*bsT92t6k_>uy#i;7icy|+v?`2*qqJ@z8B=y*EI&+dmFVPIbj!mCa;brQ!qyc> zcB^=nuUln*31+CK+k2e4=}#KA2{$RDN)0Bm<o^u&_(FQmHxb&?rN$LIXJDT3#II{on z?Wvd2A5KB#(H9QDGuP?;k36{Pf&s#0y>RfC!1~qHOW%2zGCrF64b^anzB=*AU%u}* z`%_16WDU9W2VPnW5A5y#`q`i(z5grpNzC*esh6qLfBqFMPrMBE=f1HSL{sFu{*NJ_ zOW$$ZddBiJ#ri=8C8Oorj#(n6jSBDAN_AepSm*tFg?JZ=j`XknXU6u zCjR>DrO#)|EAdY8_l?LDe@}~P+5Gx+T>)&*tfXt6ze_{NAG->gZ$MXOCEoS@{CW7P z%UxYZR-$*QmKOd9P>-#|Yw~xF$Pu5*Y__`S;$BT*6A<;U#QQ~jpW$GuUnKErBrm18 z3Q&hv(uL0$6IooP2-){Kb!`M)lPmG!^V39X*?D9o`WD%e5*x4M@Md$#++oG6I@G42TxF#SF@Rnn zHKGBJ4sQeb;cZOH*I*Pi;(#>(ylYoq{p9abyt^6&$x(Rc)yuFou%Zd>7H}DXV}95+4bW7<}7c ztvIM&`8%VJ?7r;9?fV{n`i`siKR-j;K(G47^{OlCy~A_wd2gM3%TMQT?=fzOeNgBv z!&bfx-SyE|U$?^NwfDCSqoIOdZ0s%VIX`HBFM9b$pMUH958iOoPSX7LJ$F7qTcE$T zqp4S2MHNSVGI*RZTnFFn^W(MoosPB!mRtq@xZiy+Rz7&amyZR39f4%-?h9Y|!dbum zNz#7%7q_0f`sJNykLgUq#)Z~C3WQ{sJ+F2AO|WAc=cBglm{2?JA(I#1|LE26|B8I_ zy0bIi9c6Yb(%=7@^>^0ypQT%lXj5N*|EjMWZ~I%%4|g$rMh!Lx%CM8gC;Y{Lq`hs; zYlX#;n8o~z#otj7?@ix(DYX&~xU3$<%bj@VdhvS{VtvgSet+NMUGE-vlVtTZV0hcH z>K1tK`5KNGf~_Q@rVrN~z0yWP{t_x9uAd~h@1Zk{e#$HW+WkM-}wnaUPX{e&bfZsL^kbyW#TrwM!YfiUmv7k3q-E`phPQ-yj3{9%& zGvEhmjc3+$$twz|2Q2VOGgV#Ebjh@J$+1#^#mNIQo zB(++f0WycOg`$#LDODQww4^zVa}mvVd1LrAk$TZ9&+kt2qT~j$*0P1-d^D8*q}T7j3BsIxO8Rz<#tQ)#_$N zYQo+PY%iAQpbD&YlXEgI`X%XfJBRkwtQnH2R;rE4P1;Rht!_ud5=b^+PhZmPf(p`R zz;qivu;UBnQp2H(QmG1^ZU&;D%mg=RDs%(}N7BF!w-* zIksBR;EW98t`{5ww)rJRx22}7%;=Ib1HKAGRd9g?zc0Xs%yg*$eo%^4m>3GU0Q{_* zMNVEf!RZz71-LADrfC^$6A&03X~qOgOLo~VDtwd+ zinbem0+5PTBS7^-FRL)bPz_2T(Uy$b4DFt$STEPBhRNn*tS{^fggs)cahgW~Lw`yy zD6mIYqub^%uK=lN@Q?=#Iwhm*;iyzJz-AE*o1}0b$IKX((@-iNvpx%cfuC4lw5Xi8 z$I~ABfs;D+107>O=vfl`!EWq#WB*i&{oqL*`@xQ}A6^>!;co1AWB*i&{m@Ar`=O4p zA6**z(QfQ_WB*i&{qRX0`*7z3_oU0+@AoZ@{l0GOcVquliv7q*9s7}vu^*6^20!4s zyM5i=zEfzoFM3i(f9IY4z%s$#js5PG|5Up2_ny?T-+8A$v^4fZ-PrHO{;3rEeJ6G7 zci!obERFq0H}<=+e=5a(?4*wU&O80ROJl#c8~feZKb2x1cDVi!AMFc;PRyfyowxd9 zOM^ew4gPNMpHjhpazER*!e0M!+kJs<_;z zvcc2wkg1_=zT1;88(O>vp05vwJY%dZdonFlhLu?ch+a<~ICaZy4SOaiAhr|f+p0E^@r67Dqq;Qx%%^Z;76O2l+SWJq@azLVj zq)1E-Nla8UB>sAeGlUA#w6TZ~FV0tMs@1%jy45%L4@EI%_N z)r8)2@iC+tF^U`&hI|`nMLs2{;9+iV|EyvP9Jegb-bDfr20S^Vygl9{`yn4lurEZb znHr1$ygISq@Z_eo4h=?mO9hNwKpxinsHovGxMV>CRA|Fs*>M{Jkn9I06L1VF=5TG= zZEzWBL&mBu-;gSmmT%b7>PMg?4o^;3At?y>L-q`s4I3VjufQ|z&|^xmNsz5jSin}O z7&h&RHvqvfs#n|O3F|juA+VrbFnVU{6-bh(SaSu{X*vaa)^Om-eHfac2i~0M*c$NA zcX2jK?;O_Rk{|OH@pM2T%;CfGa?qrZezRekx%;8SRoOmIu$V;9Z3|7Y}Jj2D8JNJk6N0 zVS;Ia2=d8c3Gy{=aLFK72XAyS+0;mir3|FRo}uyap^?-QEr`!{S)8Dwn`yI~X|tPYQzX%Z1gPCio83&C zEJJ8F(`JZfg6wA6>}J~RX4>p#+I-#VJG+@Sc~<#urcF2fW;fGjH`8V})8>kQp5nNf zHtD7a9G7zdiL$zX-C28i7hOtq{itMYN#&~g$ycu z4|3V>wp7)8Givc480j>ExaTa((LfZ`f+101h?g0{(7#(ls3Vvmbc0f|X3-GlpWmTJ zN_}WZNm*bB8yy&;sgR^sEN2mr*j%K zuH!kFJ3Sa)HrzV~WGe-qP{vNJsEnU*#R$u-^Xv&yh9`7(s?o(sU7Sl7h5sAw8J915 zR??W?mpiXT`eMD2$g*+5{uDunbKByqg6PmF(}ZgKN^EN3DNfc|0O8a+v1+*{R2yU0 zaJX>u%aq>k+7qjmYjV}H{)x%0Gnc<9y^TTUeK&q%0e)`Bi9|zcNlbAXVJ9T=r$M;f zWMCJ$zGWvvr;FU8bdER=VoV8YEYb(n+*796cd79gqJxwM)C3*xe`|+_7PVq zY`JjaHBu$6MmEjF=)YNgq)J?k%#T7NG%OwXVu;cRh6q2?cNq9Utaq7FkU9*5n?Dl= zTnkYjqb4oHt|BX%rbXKNqD78Bi8+nXAo{`wI0z46v`?uw*cT?;)x^)87+?FRs7K4L-wNKcm_88$IHQfD&5> zff4NpeqCQMvpUMXeg-ov-pGG*rnjhv?&deDFH{v?IQ-D9^nPs~@zdYu_pb!=M?Z%6 zOyYi?CmVBEUq};%!tqS_0LNncR8s@sjT;B7DKlsJmFvfxM%45hC*HnxFjgg83ol zDW#*wV)zJ0yZ9LXoeM#?1M6oaUFL#*R$7Pk51v23N*7^$E&L%Adb}O$>k-mC!t}Th z+uy;fuHC=*?J<@V`xC4CS&R6)AI%$2|1!y0*nT0x^AR3=lE;Pn z=Q~VppPOkN1)qoXXCizX!p!=9RucI8&f#_8@B5Ih2cgja+he>x&%A}x!(X*v{S$vk NSdm2G3dt3cRLd<@|;7)Y65Nu%$swY~wJu`2IW5dZuKTF8@gb)dS^!So{_ZUwRauy`~ z@SB0(3iuTO@j{T0vmt#Q{JL)<$fv;Xb$j2bP64ElzjNea47o=;T;GPEvaX|Vd!0&qu zD!~CsvL?xr^H2KuPanGn&@v%M0UUw`9QDj6>tH$-=vaVT;J2UH>(;2xoa~Y8W*pYW zW<$Z2&L8ZEf^*Vi8;4hH;&1{XiSqh%9{T@qNT?)Cd+hl5FK65H<*Cmx`$|~;llVH8 zr*kWv%N&Rofa2&OH~3t3!!Ks@+y9@(?xD63v^8+ ze>cMm`%Y~7fs6M4%NCa>^gW33g}(cDK8fSxEOw0${dEP_r`H5}jGLU#vj5@vvzK4O z68rDu_SMvIQyX-!8ZTiv&WACAu@BQJI8D7HA|8T6p z%DX2y{}t;WoHd?jupOe#8-K^`H8c1m>$0QA_(99*$lLw%3$GNkb0NL9BvF4+M%5I3 zCUEU=^{1X-`k8w=9nlJL{r>aaWQ6(*T(IE~@CueAL_i^(va`n| z(zJv5^Mu5TX+1iY_6>7R`-Z6&G|%BfIB;JQ1DHsxd^w!ix&-STKzaeYDFGY;;_zZ? z9NHJXSUwlVSS>;Xq_p%%zG4+<`XRK(Tv)!4kr4q!y-iS0_zI_3`Yi03LV1hXMMwPw z#O`G6y9h*3a}A7)kt-WtxoY3-2TNbL>+rP~d`miVxu^MSsvDI<>rfhc2z#z#IYO=k z2Go%0p^ zbI1y+Sd{Eq-u*qYY~_ltee7;NK93+2!e@k^PV@QqqZ>cR=9}f`%$^^9<>q;tUKjHm z=d=&`?m@T<;i0p6Jt1GnU5vgk&Gi&?FysFI^1F{66L}&3li%j^lhF744_|ekprKG0 zV$USkv-u*Y7xT1)?cR3pDz+9D{F3+aycPcOvy=}tBR%N)ogUF`+)kIg#QAMQ{yOqI zx}%59V}f7zj$W4k{Xa(8gdoQEV*Et8Xy=+w@$1f^ySQBrzQOaOXGNGkGl)NekRjnT zgL=Mdaeb@jM_Ey`@-M7^SDwrB6iIFMGZ?oNit;@;k8MLJ+9T}x#1sGg0a2I2#o9yZ z>2-4->ernuF?;MszKJ_|{)zYhhOypl|DiWvP8G4vE3( z84^zW@0snFqCKx7e#`aT&jnu86Hw^A3+Y9@qnN+=vDx#Ds3+*{JnEI$mSnCe{8O}t zdj%nn_e5Eht9Nm|1)sV4$yolYD>;4ly|ddX%D;UzFK6o$u%F_YQYXBXN}l<%Hd{+R&z>Z`}&yL;xo&$#a1aOv)uqwn8+#}2+o7EIb; z_r-lIC*)F@3muEeyAtia68lrE(*z&qzS-jqzKpPha2ny~5Pk>Yzacz=aQUOWz87IX!ZgAOggU~HAp8Qt zuOs{^!m~fl`CWwYdW5$jEFqjmco5;U2!Dd`{7-N`w;;S1;iCxu0^xHAzmM=0gvStG z_({&^a)bed351gfA42$N2%kat8p8iZc*&G@EL?}AiU|*y#6@C z&m#OG!rvo2?{Q8SMVLbP5W+u2_#{FxwyzP1U3}dl*1^Yq_wP^BB6|&u1@A)o0zx_; z&?5@}=poi0y)4(dHxbKKah)eJzdnll10=VXwZhNdfd#Sea?W&3Ob?N#`>XW04?X*x zJZtAK#k>HQVdAy>xxKE&{9&{Uzw098w^%Of&4XiyADVtXHuc!D?_R#^_FwgFYxV}S zLH|6m4x(d$js-dv=vbg*fsO?_7U)=@V}XtZ&;l-Z!O$A2LHforquFF?bbM=M!m@NT z>~`x$tvQviRf}55m9H7Pt5mC%$||HQyv(I5d9pqg@7tK{i$&aZ({Pt-d8O>;gzkx2 zMRk|8x>79|>ZChosLBpqDUkl5u}mhO$_@@^heu;$L-9yctC0TDq0tneha;sbRCHRZ zQPHYO848AzgSTe;M@Kdc4p1F83__K9u3ok3q&MdBbUd9N939Eh zbYCo%f^4K-)tX@?XIh4mw<2z8ym``v&p_pg15z- zPz=>wq84y-X|94=RO)358g7BOczR=IG$|wsjbel8AU=}G4vuUX zJsuZ#NiT)vu!js}Hnw%32Igca-l6G84F*+NnR1$WqgF2G6eA3sU`;to)(&T-R;ZU% zl7I#uchnFVB%~G17_Ll2WI3#B5x>07 z=L?%Ph7W`bB9SZbqII$-oNr6l42JhmyjhR1j>3X6nXd6}qjt&bS}W7j(!ppYx9cTVH2~z>b+wf#X+^srSK+3kM0$?v%+jT{ zG`5A}trG7Jnr^nyH`{62_*+`BB}}ijlrS5!(p+uIwbDkU=lLjN_*%o(y3*FPN_*2P z-Zr8gt@NbYrfaROZ57?$;_7cz0DLRcsPT@aYV5RZ`f9yJGFfS*6|>c3qh&^;(rB?M zmh(0rrNJGSvM-j~(=DE*vQ1uSC7bz{q~>J7CYfr}EZ^2zwbG(jnl0{1wPoj8sfDkV zT6jePjbR!If|g3%P8Q2;_=*NPAPuCUDI&82hK)$;zP5CWX{`h!0%?pE`J@8+AX;g* z@HILT5pU|CC#IXG4vl0PGTb)^7sP_va98W)GRyWS;{6*VLD}Cc%YYb(^})4y>(bZz z3M^d|t7c5`EB@$EEV%_%IBwW}BGZ7<`EA324>m#n4vwc}b z+7!u}H{BJ6av#*( zSS??#s8tIrf=kpan8zZ?t(nB=$XsK$>6xz^2Gnz#nx%3RYtt&(l<~K%jOfyK6RfT5 zwJuvK0cKOOFAEFB%!bj_a3&Fl#fqZqphn%f(+ZGOdh1BPy|PWmhXzN+#$km9qhf13 zO>iyA7A1VSEEYfMM0^N_K5a7?zzw}m(utwXLlG}YrxUo+8|oVy0e?tE>beORX{)V> ztqVf|KSzya64~@9_zhb$!y?-mRHsw%$)5E1PJhX*l%V;pK*--i*vcJNd#YM>dIQ0H ztz0tzIi87)f-{apw2Bkmq=k$PrrMXQ{fVkd|NIIOSzWGqeHTHFPZ&6#+1b38@wQDEgHhsc(}k=W=K zSd9lmUO6axd&xN5j3q`>gPEt&cJ%35i{Dpa5+ETwe|$ttDBMlyr+R*4RtIk!BFARX_^L`+q&WIKzq ze9b7ii!ee9s=33e>F$_j>Tr`XtW;qj8}4*l9exuDy^{AL7mnex!EqU}8xbylb7mwJ z=^^8AXEeBB5PCim)hZD-3uKSqzl+RGZu`dFPKZ5?^fhGJe?5BvJgracj!X>0<3;PL zgS0U5z>Ia#*wa#3A&I@O96NN!Yj?uC1{YjSUNZrX0WPuobt$p;14k2k>qqt;+7o|0 z@u4_mo_}>8yrhxX``puOFX6;aahvSDS)2H5`>9NC*fBEm%0cVO_^IL{|Iq~oV-K@%s6idIC zpky@tL3oi>uy}$|f0aJTD%93UeG6zJt9HNQkeE@|@)$@Fb62bKbw{zK1{W z6i~3AODEok5${{goIAnZqY}?!=f2+}_`C<-&tNZ23uGJI1rJ*1zqQgv@HQo(lV%;) z&pD2##;nSaIUfC6QGSfQAw-4$-^hO}+SK9s$7uonenyllr?=*%WcbbLOW(JUm#oX* z9~R%OFe&0wixU)iJVE!W{yyrqYwT7WS&H7KnxA+N zpk7$2Za062m>hB0mG$@8$rDPf1?uQhb(8ph;{H~*u*zN>d;cM@SPzdi>nkN zyWXU%YeCldQg!itC?eVFkt0jdx5(zDSbrU-ZYmv1-*xBcvJW4uH=cPgc;i1E_$Yfd z2_KMD>u$4V8lgXlnAAX&hxP+~zDt*Ma)StHOS?UEzmQvkt$Y)j>!P2&Zh+s3 zx3>hnkq5h&*jn0he$e(_cKAn6zUzxm-@bDTX@2AJN4`T#puMJ5$lrJ)6&!TQU~yLA zRyenhj}x;y?d<|+awGiXc6UKvx!}tr-WLRR1Y+q&SH1ez@A%zMW9GX*zv05=hqs_U zx-|hC7lrm-fbVvgJ}27$I_NQhC*zlY@%fv=zX*K%*7K6z8)kaUksm!_ z`HRc@dGWp@g>6sWv+ODD(oZ{nxRuG%s<1gwf}Jcr;4cRxZEb5@E6k6?C}uO3&e!1d zgD-l+@|RadDJ%AZ^HIRjLws{B-h1TOKc2Jr*1HSd3|)S6Ydt_UTy`HJt8V7H4!~BD zR#gY9mRfGt{!bt?WZOxC`yM*N=vjvT4nT^|2`bo;&N&*4Nr_wwvquQ|oCnB@;INC^p~=%F@R54t-+E)Zj6=#FUmDrj{$yZ6#LI0Z-CZT0;3UrW8TT zf(}L3@}fk8XPX-EKpZ75>UCOcN;PRRt2XnhZo%_T#DPJyf>c%;UAWVZMNg7Sw{vJ)^{OW6`EsRR-dWfQ+Nx&IF9Bx__VlHKnau;Y2B>br4|aS(U8*=V zQ7TrT(M?Yfgy~?0LLM3dog)>%7(n39dN}Y(O)u>u;M#zO>NP!I1wLjzTYwoE`d!Uh z8f^1RifT$tQ)#G@(g0g|f_X530nZm;KW3ts1v@CY3JeSdOaOLP^&BU!>0tCS*aFN@ zuqNQ82njUG!j4*@HYqi#6-_FZ)uwJ}Y!eVFT2ey?O^as9%qhH=vr1t*JOYq%70pBC zLn|xL#gO$%z|oYnYJ)bi(dV(?Dn84QnNTFUK@A!>TJ~hhCcmyTBtB=q<`8>~OUEzUQ>|eb1u4 z?{&=ceQ(G2JHCG=`M&qG_I>Z7zVDy!`~HsacYOa$@_pZF?fbq(eLpzg_k$hZ@A&?i z+JS*cKgnt-M-*y z?fr}I^m`U?{*Lc=uKZ`xmA~h-_Wi|o`hD|#-`DZ|j_;pIzTbOV`~KoP{ek(uAL#gg z$M?@9-w&PEzQ6cRf6sj1@9Fq{$M?@9--jKp)A`lD#kcxH^PNA`asH0;pHa^L$N6rb z_Y}R?yTo4qLfd_wj{A4q|8#eMLPp?y{BRfln#z&3;Jb}*mnE&CG1=hlc!<vLo3-C0Uw9faq~#pr&frr5?u^CFIc}76gs~N)YG?dgq)R8)9jA zZ8_Wp?=cS;H3*Cl?($1sS@Oa;Ao>0DZDx-QKW|V9g+fw5mOT<>Bn3jUSMoyG2EWuJ zhk`xy+#^dpJ#ru@^?E%apVaG<{a(qjxsrtVci}Ecl05zp(C=6eI4*ZKZYa;m04vFy zED4cLXia(`DzRmlqdXqDms6$E>A9#F1W>@5K93h=T7tg^-sNX%#GBB1&OU@xLt2ib z{19&gwaCN;RY35XRCIyknq}CxNMJ#aBdwJ-g}Y=o!~^m6`e-&;g&u%UCuSXv^h9Bi z0)nExsGOGYGw4lFa*##a5_9M%*M!%vDRwwKNyCN+}8kL0$;>F^^ z1?yYw@D#=2NUM1W3Ig_!9sPRUgjeLt@QypQm{P12WJ@GwRm+w&leWa^@%tRZYNd^z z(0(l@JhRG0MMtAnh9HTGF_q0*O)G0oY8Je?4_)JRz?Tz?mipMAYP(jtZmvdgMEsADgK-^#e_`t%=WBfrx9ryylZK)NAvq3`+mCc;fP|GS{ zU8<40)+1f#fPjga)ZluEXcvpKICz!;-zrSmcnCw%pBhYNXvCD&V@wKokW2PU5U+8y zO$M<#c%h9+#fRc7WFRGW42+Hr48`Y3K{V7Jz$OSvQGGQR=9N7GIhcugSK9=m5Qh?D zi3nUK)d$gX;Cq%_S!HG_pn^MB3~`+FbI_Qye$aCI%?EMg%J9{JlQ* zcbAX%_xfP_jqOr7A>rwPq+~dox+J!+q+&iyw@`h(fgnUs;d_t^p4&oI^UbKae_&*> z9>hIoSq^%FAQlt}3Pqeu5r%$y6`_V;iqH*8$(Te%n0?+pi+Ev2iz(s_czM@Mws#Hu z2?P+!VHA`&AIvC zb96!s6&mNMTBk@m!Wqiq>`_)BL`RzBbTVUlWG0y!^VG=V>}^@tE|kS2pGsMjy)BD& zk{Bd!LA%%(;Qdt$c$VrfPmlM6`pb?ChyBIb^L7A_DT9^;dP6;dz=D3l z{uIF?bKBggf@n}K3B?8jY-pj&$STXB%bZ%VT#_x8jbZd2S#3A%sTNBm39+tY{#*nXFBBa5pb0*VXMk6ZZ zm;=sV(DM1s6Y5!@-=#%5-j1J%9j?INgRoUoLbDc%3#z6lZEaC<#~;L;2HT>Dw(zAW zeHp5KNS$O`7;{?^t~F5-GkVKiPF50SZcAF)YQ`4ApwJc0NF!y*!gq)T2BWvTNq zfB(gOEOi;?SHj;xp~t&1-;I#Q5vIo~EWd(hZM}c}hhr=#_Q#e-S;^U0-t6M}b1;8s zInN7^{1*OY5)oH;71CXdaQ{y37uXCi5ZBL+w2q7~Li%$NUWzc;9c3wjKX3uh3ws|x kx-Nu5{vVF<_Pq2?P7i<8g0)ZlA(bPTk6}4hw}In-0TgMFv;Y7A literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_executable_stack.dmp b/src/processor/testdata/linux_executable_stack.dmp new file mode 100644 index 0000000000000000000000000000000000000000..c424cb20e43101b0673708f59ee89e169f150a7e GIT binary patch literal 38794 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_null_read_av.dmp b/src/processor/testdata/linux_null_read_av.dmp new file mode 100644 index 0000000000000000000000000000000000000000..3bcb73538498bfaf2fc66264dccfaaa1b54bffad GIT binary patch literal 20160 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_overflow.dmp b/src/processor/testdata/linux_overflow.dmp new file mode 100644 index 0000000000000000000000000000000000000000..c604f8f929e0924a2c51ec27445a16931fff0daa GIT binary patch literal 20136 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_raise_sigabrt.dmp b/src/processor/testdata/linux_raise_sigabrt.dmp new file mode 100644 index 0000000000000000000000000000000000000000..7b6dde50c9b17f0b30da2ce80b7d69f268f951f4 GIT binary patch literal 52424 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_stack_pointer_in_module.dmp b/src/processor/testdata/linux_stack_pointer_in_module.dmp new file mode 100644 index 0000000000000000000000000000000000000000..92b6c21a539f0847b71d351837c838b826f8db7f GIT binary patch literal 38761 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_stack_pointer_in_stack.dmp b/src/processor/testdata/linux_stack_pointer_in_stack.dmp new file mode 100644 index 0000000000000000000000000000000000000000..f70b881f21f582c35160bc989c0e624ee98c3531 GIT binary patch literal 38761 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_stack_pointer_in_stack_alt_name.dmp b/src/processor/testdata/linux_stack_pointer_in_stack_alt_name.dmp new file mode 100644 index 0000000000000000000000000000000000000000..55b34e8a7890f31355dbc0f229b51f9094826a0a GIT binary patch literal 38761 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_stacksmash.dmp b/src/processor/testdata/linux_stacksmash.dmp new file mode 100644 index 0000000000000000000000000000000000000000..b19a28dab9a357c985c34fb7c15caffb7564a768 GIT binary patch literal 20136 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 // Must come first +#endif + +#include +#include +#include + +#include + +#include "client/linux/handler/exception_handler.h" +#include "third_party/lss/linux_syscall_support.h" + +namespace { + +// google_breakpad::MinidumpCallback to invoke after minidump generation. +static bool callback(const char* dump_path, const char* id, + void* context, + bool succeeded) { + if (succeeded) { + printf("dump guid is %s\n", id); + } else { + printf("dump failed\n"); + } + fflush(stdout); + + return succeeded; +} + +static void CrashFunction() { + int* i = reinterpret_cast(0x45); + *i = 5; // crash! +} + +} // namespace + +int main(int argc, char** argv) { + google_breakpad::ExceptionHandler eh(".", NULL, callback, NULL, true); + if (!eh.WriteMinidump()) { + printf("Failed to generate on-demand minidump\n"); + } + CrashFunction(); + printf("did not crash?\n"); + return 0; +} diff --git a/src/processor/testdata/linux_write_to_nonwritable_module.dmp b/src/processor/testdata/linux_write_to_nonwritable_module.dmp new file mode 100644 index 0000000000000000000000000000000000000000..46456acf56cc650277a0e8ea970d11892001043e GIT binary patch literal 44944 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 F@NZF^fz1E_ literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_write_to_nonwritable_region_math.dmp b/src/processor/testdata/linux_write_to_nonwritable_region_math.dmp new file mode 100644 index 0000000000000000000000000000000000000000..6cf98610f4e128f8d97d54fda51f4ad412ea4cce GIT binary patch literal 40848 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_write_to_outside_module.dmp b/src/processor/testdata/linux_write_to_outside_module.dmp new file mode 100644 index 0000000000000000000000000000000000000000..2ceeefb698cd3441359b333bd078098f64114f2f GIT binary patch literal 44944 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 ZpUe5-{a37iVqfbh)*sx!+fhsh{4ca7(-Qyy literal 0 HcmV?d00001 diff --git a/src/processor/testdata/linux_write_to_under_4k.dmp b/src/processor/testdata/linux_write_to_under_4k.dmp new file mode 100644 index 0000000000000000000000000000000000000000..a3ddd621cbbfc89ae4f23a61bd939620d311b53b GIT binary patch literal 44944 zcmeG_3zQqzRnMuLc$J?Mk`O}UPJYEDku>^$TBTaAq8qI2DOPcY_ zNGqE_O-ng(XnImgLrco3&w*1ypb$O{Nkbc#K+{m@2`#52l#hF$#c9(d94IveF!#QX zMjGv|>(l{`J!4Dvz5DL(-S_Sr&D)tf^SSxrhklKaiwPkTeDHYSfhQMPiICSpAqt

    gB7jyt9omViPKnmM4T8?5-y`$hfD*M2{vv^&Zlg%&Lnea*Q z$RWkS72BVDH&m`Jgu^ftqK!+f^qkVT-<1DledV9V_9q=t_@ElSB8KAig$?g;`MKZA zGx?}+9Fa^T1?$QHfqMzZn}ek|Em>=GOd_+cn?!9GABeEL1*4 z90Tr~7qr((s^y?|K}iX}pbDJ-B#FE6Woc{J^n~3W&EFWA7$5GQ&-*^YZQ5wB)8bb{?hDgXa=MbFsgTs$Z&A-H-;IJ={F6E_m z`@gW;oAkLoPJCpdlfF=%50&fwlKHegmv?19c?Cb-eC`KdQ4qZHDO~ii3(Q%1L0qua z-VUn2-W+m~S*Pd;XBo;bgkIY_m8bBnb@CFluJ_NuNT{b$nE-~zI4s)T|@eM2=k>cGyP>>FE{nGvq8_Uq_pA+-nv3 zvg(P(KMAemJc`h%{Z)=~^NZfgzG8hOSJ!}umDY7cgaP9#nU2OCR9AIhOWV7&Kz-u; zAI`Shq4h&$O7+($K#rYWo7rlSLys#xU;5Z;zLib|sUE-3E5D}u#Lg1&8?VbvhFMqe zJ{_+&;-{I8@;NH=mM=2v$8bE6oIl-9dtKzHU6oSrD@0*CUItV3&_mJ#2)P-4g!MV` z*+M_zU@)Eh;F0oBdd+7sBIu(AJtW;~2jT6lFb=haE>#6Npj#ZQP~~Ypl0@IKom@YX z#a?~>NgU}-pd0*H5CsyMf|vEvLG-by;0K0|??Y3hr{W#0M_f*-kDv*XAB`$Z8^wHS z@;oS+U)JZ#19Fvv<=?JRClmord0Nk(zR0mJEc9EXey;h#-oIh}YGKv`rn7`s1}Q(&Yr4Xu{rvoTrC*@)V%G5t^?MX=qX!pREXHH| zbDx+INj%lqz;GMPdeU;)4%L$||3_n|>hm06y*En*4u53t_}V@xjxhL>c|gY%;g9Tb z!6j|v^K^P{G3h&Q9~vrFnJ&RU+!-tA+@j9=E*ivg=v=%lI6BH=hkQ!bF(mONbl`Ko ziYs$3x1Ia7$vy!iy633>w5@;I&U!kQNOEy zV>fI6!%lLGuM|GN)Sgaf6sPS^Q9Gu#XZgyfQ0;#88-5j# z=&7IEzKi+k<9`&K_Ou$w@|4~WoNuPC`(DP8sE1mw%K*^N4h8zZIOcQmtDLoB*XJ^D zAGC+I@~Qbw(|j{q zqkhTWb7H|m`60ckgFiYMjO(11ga_6Ju%&QUqVUm;F3}(eRK!ZAT>v z9=XwZw$?KME?4#Q*ynUU!gv~MQcymQ;d)ghr$>o?!qboyFUQDLIqHXQZI~oEkbjBm zdb-*-(FK!u-oX03%@|gQ9mOg@;@66^wOlI>Nq*)Yu7{h`d3{jp;i6c$l}yp~dWw_WK{C$~GtE1AbbrG)_VxP|Ee|2o zd?}yS<0}QB>-WvEC9sBo-C~&9r}bO?T(^FUoFIc$EPS<(>&Y^-ll-}-51(&OddWV1 zQYNjh<+WTd{eks%ju!^n6OJpN+L^D7gG=}W^h~K{`UD>+ZxNLACC`UbgkR+=okHcm z{b{CGyw(%tBS_^*&mYxqeGXNAz+NK6p!o6#wqNBcr}Fda6o95{+o5npR!Sr3c{!8>^gSKn4W8pgbFukz{^GD;4LX1&;S%#OXf7nJX z!h712F^g&hG0<~btL=@!;CM#LTgNfAdykrrJn9z@JV-~^gLtjSYY<*!5AB1}2l`79 z(#QNW1tuVzh&o6&!8E+|BmeZVehLKjo<8_L5pnc^WV+lJ0z5vQKe|5x^F|*wrm@yK zg!J)b`mjIACYn$|3L9v z#y-oLNc~3;Nn%G2fe8Zj`3pREZncY{U+fLMhm7^l!#Fa<^i|gWsC}PjW6mZ5iw#8A zU=TX>pZa&8d@@V%4e_i0jWHIYKl0qFMQxqihTbcyLl{PcJrMRl*aKk?ggp@Uz#ry; F{|E1dC6oXF literal 0 HcmV?d00001 diff --git a/src/processor/testdata/write_av_non_null.dmp b/src/processor/testdata/write_av_non_null.dmp new file mode 100644 index 0000000000000000000000000000000000000000..1ec80ea23c9bd86ff0de29bceeb9f19adf064810 GIT binary patch literal 16139 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 V9l_bxow_~H?SXC&{D1Jk{{s5qEq?$2 literal 0 HcmV?d00001 diff --git a/src/processor/tokenize.cc b/src/processor/tokenize.cc new file mode 100644 index 0000000..a46c964 --- /dev/null +++ b/src/processor/tokenize.cc @@ -0,0 +1,81 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +#ifdef _MSC_VER +#define strtok_r strtok_s +#endif + +using std::vector; + +bool Tokenize(char* line, + const char* separators, + int max_tokens, + vector* tokens) { + tokens->clear(); + tokens->reserve(max_tokens); + + int remaining = max_tokens; + + // Split tokens on the separator character. + // strip them out before exhausting max_tokens. + char* save_ptr; + char* token = strtok_r(line, separators, &save_ptr); + while (token && --remaining > 0) { + tokens->push_back(token); + if (remaining > 1) + token = strtok_r(NULL, separators, &save_ptr); + } + + // If there's anything left, just add it as a single token. + if (remaining == 0 && (token = strtok_r(NULL, "\r\n", &save_ptr))) { + tokens->push_back(token); + } + + return tokens->size() == static_cast(max_tokens); +} + +void StringToVector(const string& str, vector& vec) { + vec.resize(str.length() + 1); + std::copy(str.begin(), str.end(), vec.begin()); + vec[str.length()] = '\0'; +} + +} // namespace google_breakpad diff --git a/src/processor/tokenize.h b/src/processor/tokenize.h new file mode 100644 index 0000000..b30c741 --- /dev/null +++ b/src/processor/tokenize.h @@ -0,0 +1,62 @@ +// Copyright 2010 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Implements a Tokenize function for splitting up strings. + +#ifndef GOOGLE_BREAKPAD_PROCESSOR_TOKENIZE_H_ +#define GOOGLE_BREAKPAD_PROCESSOR_TOKENIZE_H_ + +#include +#include + +#include "common/using_std_string.h" + +namespace google_breakpad { + +// Splits line into at most max_tokens tokens, separated by any of the +// characters in separators and placing them in the tokens vector. +// line is a 0-terminated string that optionally ends with a newline +// character or combination, which will be removed. +// If more tokens than max_tokens are present, the final token is placed +// into the vector without splitting it up at all. This modifies line as +// a side effect. Returns true if exactly max_tokens tokens are returned, +// and false if fewer are returned. This is not considered a failure of +// Tokenize, but may be treated as a failure if the caller expects an +// exact, as opposed to maximum, number of tokens. + +bool Tokenize(char* line, + const char* separators, + int max_tokens, + std::vector* tokens); +// For convenience, since you need a char* to pass to Tokenize. +// You can call StringToVector on a string, and use &vec[0]. +void StringToVector(const string& str, std::vector& vec); + +} // namespace google_breakpad + +#endif // GOOGLE_BREAKPAD_PROCESSOR_TOKENIZE_H_ diff --git a/src/processor/windows_frame_info.h b/src/processor/windows_frame_info.h new file mode 100644 index 0000000..4014a1a --- /dev/null +++ b/src/processor/windows_frame_info.h @@ -0,0 +1,208 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// windows_frame_info.h: Holds debugging information about a stack frame. +// +// This structure is specific to Windows debugging information obtained +// from pdb files using the DIA API. +// +// Author: Mark Mentovai + + +#ifndef PROCESSOR_WINDOWS_FRAME_INFO_H__ +#define PROCESSOR_WINDOWS_FRAME_INFO_H__ + +#include +#include + +#include +#include + +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "processor/logging.h" +#include "processor/tokenize.h" + +namespace google_breakpad { + +#ifdef _WIN32 +#define strtoull _strtoui64 +#endif + +struct WindowsFrameInfo { + public: + enum Validity { + VALID_NONE = 0, + VALID_PARAMETER_SIZE = 1, + VALID_ALL = -1 + }; + + // The types for stack_info_. This is equivalent to MS DIA's + // StackFrameTypeEnum. Each identifies a different type of frame + // information, although all are represented in the symbol file in the + // same format. These are used as indices to the stack_info_ array. + enum StackInfoTypes { + STACK_INFO_FPO = 0, + STACK_INFO_TRAP, // not used here + STACK_INFO_TSS, // not used here + STACK_INFO_STANDARD, + STACK_INFO_FRAME_DATA, + STACK_INFO_LAST, // must be the last sequentially-numbered item + STACK_INFO_UNKNOWN = -1 + }; + + WindowsFrameInfo() : type_(STACK_INFO_UNKNOWN), + valid(VALID_NONE), + prolog_size(0), + epilog_size(0), + parameter_size(0), + saved_register_size(0), + local_size(0), + max_stack_size(0), + allocates_base_pointer(0), + program_string() {} + + WindowsFrameInfo(StackInfoTypes type, + uint32_t set_prolog_size, + uint32_t set_epilog_size, + uint32_t set_parameter_size, + uint32_t set_saved_register_size, + uint32_t set_local_size, + uint32_t set_max_stack_size, + int set_allocates_base_pointer, + const string set_program_string) + : type_(type), + valid(VALID_ALL), + prolog_size(set_prolog_size), + epilog_size(set_epilog_size), + parameter_size(set_parameter_size), + saved_register_size(set_saved_register_size), + local_size(set_local_size), + max_stack_size(set_max_stack_size), + allocates_base_pointer(set_allocates_base_pointer), + program_string(set_program_string) {} + + // Parse a textual serialization of a WindowsFrameInfo object from + // a string. Returns NULL if parsing fails, or a new object + // otherwise. type, rva and code_size are present in the STACK line, + // but not the StackFrameInfo structure, so return them as outparams. + static WindowsFrameInfo *ParseFromString(const string string, + int& type, + uint64_t& rva, + uint64_t& code_size) { + // The format of a STACK WIN record is documented at: + // + // https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/symbol_files.md + + std::vector buffer; + StringToVector(string, buffer); + std::vector tokens; + if (!Tokenize(&buffer[0], " \r\n", 11, &tokens)) + return NULL; + + type = strtol(tokens[0], NULL, 16); + if (type < 0 || type > STACK_INFO_LAST - 1) + return NULL; + + rva = strtoull(tokens[1], NULL, 16); + code_size = strtoull(tokens[2], NULL, 16); + uint32_t prolog_size = strtoul(tokens[3], NULL, 16); + uint32_t epilog_size = strtoul(tokens[4], NULL, 16); + uint32_t parameter_size = strtoul(tokens[5], NULL, 16); + uint32_t saved_register_size = strtoul(tokens[6], NULL, 16); + uint32_t local_size = strtoul(tokens[7], NULL, 16); + uint32_t max_stack_size = strtoul(tokens[8], NULL, 16); + int has_program_string = strtoul(tokens[9], NULL, 16); + + const char *program_string = ""; + int allocates_base_pointer = 0; + if (has_program_string) { + program_string = tokens[10]; + } else { + allocates_base_pointer = strtoul(tokens[10], NULL, 16); + } + + return new WindowsFrameInfo(static_cast(type), + prolog_size, + epilog_size, + parameter_size, + saved_register_size, + local_size, + max_stack_size, + allocates_base_pointer, + program_string); + } + + // CopyFrom makes "this" WindowsFrameInfo object identical to "that". + void CopyFrom(const WindowsFrameInfo& that) { + type_ = that.type_; + valid = that.valid; + prolog_size = that.prolog_size; + epilog_size = that.epilog_size; + parameter_size = that.parameter_size; + saved_register_size = that.saved_register_size; + local_size = that.local_size; + max_stack_size = that.max_stack_size; + allocates_base_pointer = that.allocates_base_pointer; + program_string = that.program_string; + } + + // Clears the WindowsFrameInfo object so that users will see it as though + // it contains no information. + void Clear() { + type_ = STACK_INFO_UNKNOWN; + valid = VALID_NONE; + program_string.erase(); + } + + StackInfoTypes type_; + + // Identifies which fields in the structure are valid. This is of + // type Validity, but it is defined as an int because it's not + // possible to OR values into an enumerated type. Users must check + // this field before using any other. + int valid; + + // These values come from IDiaFrameData. + uint32_t prolog_size; + uint32_t epilog_size; + uint32_t parameter_size; + uint32_t saved_register_size; + uint32_t local_size; + uint32_t max_stack_size; + + // Only one of allocates_base_pointer or program_string will be valid. + // If program_string is empty, use allocates_base_pointer. + bool allocates_base_pointer; + string program_string; +}; + +} // namespace google_breakpad + + +#endif // PROCESSOR_WINDOWS_FRAME_INFO_H__ diff --git a/src/third_party/curl/COPYING b/src/third_party/curl/COPYING new file mode 100644 index 0000000..610fbdb --- /dev/null +++ b/src/third_party/curl/COPYING @@ -0,0 +1,22 @@ +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1996 - 2011, Daniel Stenberg, . + +All rights reserved. + +Permission to use, copy, modify, and distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright +notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization of the copyright holder. + diff --git a/src/third_party/curl/curl.h b/src/third_party/curl/curl.h new file mode 100644 index 0000000..0d80936 --- /dev/null +++ b/src/third_party/curl/curl.h @@ -0,0 +1,1936 @@ +#ifndef __CURL_CURL_H +#define __CURL_CURL_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * $Id: curl.h,v 1.396 2009-10-16 13:30:31 yangtse Exp $ + ***************************************************************************/ + +/* + * If you have libcurl problems, all docs and details are found here: + * http://curl.haxx.se/libcurl/ + * + * curl-library mailing list subscription and unsubscription web interface: + * http://cool.haxx.se/mailman/listinfo/curl-library/ + */ + +/* + * Leading 'curl' path on the 'curlbuild.h' include statement is + * required to properly allow building outside of the source tree, + * due to the fact that in this case 'curlbuild.h' is generated in + * a subdirectory of the build tree while 'curl.h actually remains + * in a subdirectory of the source tree. + */ + +#include "third_party/curl/curlver.h" /* libcurl version defines */ +#include "third_party/curl/curlbuild.h" /* libcurl build definitions */ +#include "third_party/curl/curlrules.h" /* libcurl rules enforcement */ + +/* + * Define WIN32 when build target is Win32 API + */ + +#if (defined(_WIN32) || defined(__WIN32__)) && \ + !defined(WIN32) && !defined(__SYMBIAN32__) +#define WIN32 +#endif + +#include +#include + +/* The include stuff here below is mainly for time_t! */ +#include +#include + +#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__GNUC__) && \ + !defined(__CYGWIN__) || defined(__MINGW32__) +#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H)) +/* The check above prevents the winsock2 inclusion if winsock.h already was + included, since they can't co-exist without problems */ +#include +#include +#endif +#else + +/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish + libc5-based Linux systems. Only include it on system that are known to + require it! */ +#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ + defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ + defined(__ANDROID__) +#include +#endif + +#ifndef _WIN32_WCE +#include +#endif +#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__) +#include +#endif +#include +#endif + +#ifdef __BEOS__ +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void CURL; + +/* + * Decorate exportable functions for Win32 and Symbian OS DLL linking. + * This avoids using a .def file for building libcurl.dll. + */ +#if (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)) && \ + !defined(CURL_STATICLIB) +#if defined(BUILDING_LIBCURL) +#define CURL_EXTERN __declspec(dllexport) +#else +#define CURL_EXTERN __declspec(dllimport) +#endif +#else + +#ifdef CURL_HIDDEN_SYMBOLS +/* + * This definition is used to make external definitions visible in the + * shared library when symbols are hidden by default. It makes no + * difference when compiling applications whether this is set or not, + * only when compiling the library. + */ +#define CURL_EXTERN CURL_EXTERN_SYMBOL +#else +#define CURL_EXTERN +#endif +#endif + +#ifndef curl_socket_typedef +/* socket typedef */ +#ifdef WIN32 +typedef SOCKET curl_socket_t; +#define CURL_SOCKET_BAD INVALID_SOCKET +#else +typedef int curl_socket_t; +#define CURL_SOCKET_BAD -1 +#endif +#define curl_socket_typedef +#endif /* curl_socket_typedef */ + +struct curl_httppost { + struct curl_httppost *next; /* next entry in the list */ + char *name; /* pointer to allocated name */ + long namelength; /* length of name length */ + char *contents; /* pointer to allocated data contents */ + long contentslength; /* length of contents field */ + char *buffer; /* pointer to allocated buffer contents */ + long bufferlength; /* length of buffer field */ + char *contenttype; /* Content-Type */ + struct curl_slist* contentheader; /* list of extra headers for this form */ + struct curl_httppost *more; /* if one field name has more than one + file, this link should link to following + files */ + long flags; /* as defined below */ +#define HTTPPOST_FILENAME (1<<0) /* specified content is a file name */ +#define HTTPPOST_READFILE (1<<1) /* specified content is a file name */ +#define HTTPPOST_PTRNAME (1<<2) /* name is only stored pointer + do not free in formfree */ +#define HTTPPOST_PTRCONTENTS (1<<3) /* contents is only stored pointer + do not free in formfree */ +#define HTTPPOST_BUFFER (1<<4) /* upload file from buffer */ +#define HTTPPOST_PTRBUFFER (1<<5) /* upload file from pointer contents */ +#define HTTPPOST_CALLBACK (1<<6) /* upload file contents by using the + regular read callback to get the data + and pass the given pointer as custom + pointer */ + + char *showfilename; /* The file name to show. If not set, the + actual file name will be used (if this + is a file part) */ + void *userp; /* custom pointer used for + HTTPPOST_CALLBACK posts */ +}; + +typedef int (*curl_progress_callback)(void *clientp, + double dltotal, + double dlnow, + double ultotal, + double ulnow); + +#ifndef CURL_MAX_WRITE_SIZE + /* Tests have proven that 20K is a very bad buffer size for uploads on + Windows, while 16K for some odd reason performed a lot better. + We do the ifndef check to allow this value to easier be changed at build + time for those who feel adventurous. */ +#define CURL_MAX_WRITE_SIZE 16384 +#endif + +#ifndef CURL_MAX_HTTP_HEADER +/* The only reason to have a max limit for this is to avoid the risk of a bad + server feeding libcurl with a never-ending header that will cause reallocs + infinitely */ +#define CURL_MAX_HTTP_HEADER (100*1024) +#endif + + +/* This is a magic return code for the write callback that, when returned, + will signal libcurl to pause receiving on the current transfer. */ +#define CURL_WRITEFUNC_PAUSE 0x10000001 +typedef size_t (*curl_write_callback)(char *buffer, + size_t size, + size_t nitems, + void *outstream); + +/* These are the return codes for the seek callbacks */ +#define CURL_SEEKFUNC_OK 0 +#define CURL_SEEKFUNC_FAIL 1 /* fail the entire transfer */ +#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so + libcurl might try other means instead */ +typedef int (*curl_seek_callback)(void *instream, + curl_off_t offset, + int origin); /* 'whence' */ + +/* This is a return code for the read callback that, when returned, will + signal libcurl to immediately abort the current transfer. */ +#define CURL_READFUNC_ABORT 0x10000000 +/* This is a return code for the read callback that, when returned, will + signal libcurl to pause sending data on the current transfer. */ +#define CURL_READFUNC_PAUSE 0x10000001 + +typedef size_t (*curl_read_callback)(char *buffer, + size_t size, + size_t nitems, + void *instream); + +typedef enum { + CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */ + CURLSOCKTYPE_LAST /* never use */ +} curlsocktype; + +typedef int (*curl_sockopt_callback)(void *clientp, + curl_socket_t curlfd, + curlsocktype purpose); + +struct curl_sockaddr { + int family; + int socktype; + int protocol; + unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it + turned really ugly and painful on the systems that + lack this type */ + struct sockaddr addr; +}; + +typedef curl_socket_t +(*curl_opensocket_callback)(void *clientp, + curlsocktype purpose, + struct curl_sockaddr *address); + +#ifndef CURL_NO_OLDIES + /* not used since 7.10.8, will be removed in a future release */ +typedef int (*curl_passwd_callback)(void *clientp, + const char *prompt, + char *buffer, + int buflen); +#endif + +typedef enum { + CURLIOE_OK, /* I/O operation successful */ + CURLIOE_UNKNOWNCMD, /* command was unknown to callback */ + CURLIOE_FAILRESTART, /* failed to restart the read */ + CURLIOE_LAST /* never use */ +} curlioerr; + +typedef enum { + CURLIOCMD_NOP, /* no operation */ + CURLIOCMD_RESTARTREAD, /* restart the read stream from start */ + CURLIOCMD_LAST /* never use */ +} curliocmd; + +typedef curlioerr (*curl_ioctl_callback)(CURL *handle, + int cmd, + void *clientp); + +/* + * The following typedef's are signatures of malloc, free, realloc, strdup and + * calloc respectively. Function pointers of these types can be passed to the + * curl_global_init_mem() function to set user defined memory management + * callback routines. + */ +typedef void *(*curl_malloc_callback)(size_t size); +typedef void (*curl_free_callback)(void *ptr); +typedef void *(*curl_realloc_callback)(void *ptr, size_t size); +typedef char *(*curl_strdup_callback)(const char *str); +typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size); + +/* the kind of data that is passed to information_callback*/ +typedef enum { + CURLINFO_TEXT = 0, + CURLINFO_HEADER_IN, /* 1 */ + CURLINFO_HEADER_OUT, /* 2 */ + CURLINFO_DATA_IN, /* 3 */ + CURLINFO_DATA_OUT, /* 4 */ + CURLINFO_SSL_DATA_IN, /* 5 */ + CURLINFO_SSL_DATA_OUT, /* 6 */ + CURLINFO_END +} curl_infotype; + +typedef int (*curl_debug_callback) + (CURL *handle, /* the handle/transfer this concerns */ + curl_infotype type, /* what kind of data */ + char *data, /* points to the data */ + size_t size, /* size of the data pointed to */ + void *userptr); /* whatever the user please */ + +/* All possible error codes from all sorts of curl functions. Future versions + may return other values, stay prepared. + + Always add new return codes last. Never *EVER* remove any. The return + codes must remain the same! + */ + +typedef enum { + CURLE_OK = 0, + CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ + CURLE_FAILED_INIT, /* 2 */ + CURLE_URL_MALFORMAT, /* 3 */ + CURLE_OBSOLETE4, /* 4 - NOT USED */ + CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ + CURLE_COULDNT_RESOLVE_HOST, /* 6 */ + CURLE_COULDNT_CONNECT, /* 7 */ + CURLE_FTP_WEIRD_SERVER_REPLY, /* 8 */ + CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server + due to lack of access - when login fails + this is not returned. */ + CURLE_OBSOLETE10, /* 10 - NOT USED */ + CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ + CURLE_OBSOLETE12, /* 12 - NOT USED */ + CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ + CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ + CURLE_FTP_CANT_GET_HOST, /* 15 */ + CURLE_OBSOLETE16, /* 16 - NOT USED */ + CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ + CURLE_PARTIAL_FILE, /* 18 */ + CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ + CURLE_OBSOLETE20, /* 20 - NOT USED */ + CURLE_QUOTE_ERROR, /* 21 - quote command failure */ + CURLE_HTTP_RETURNED_ERROR, /* 22 */ + CURLE_WRITE_ERROR, /* 23 */ + CURLE_OBSOLETE24, /* 24 - NOT USED */ + CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ + CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ + CURLE_OUT_OF_MEMORY, /* 27 */ + /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error + instead of a memory allocation error if CURL_DOES_CONVERSIONS + is defined + */ + CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ + CURLE_OBSOLETE29, /* 29 - NOT USED */ + CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ + CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ + CURLE_OBSOLETE32, /* 32 - NOT USED */ + CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ + CURLE_HTTP_POST_ERROR, /* 34 */ + CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ + CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ + CURLE_FILE_COULDNT_READ_FILE, /* 37 */ + CURLE_LDAP_CANNOT_BIND, /* 38 */ + CURLE_LDAP_SEARCH_FAILED, /* 39 */ + CURLE_OBSOLETE40, /* 40 - NOT USED */ + CURLE_FUNCTION_NOT_FOUND, /* 41 */ + CURLE_ABORTED_BY_CALLBACK, /* 42 */ + CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ + CURLE_OBSOLETE44, /* 44 - NOT USED */ + CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ + CURLE_OBSOLETE46, /* 46 - NOT USED */ + CURLE_TOO_MANY_REDIRECTS , /* 47 - catch endless re-direct loops */ + CURLE_UNKNOWN_TELNET_OPTION, /* 48 - User specified an unknown option */ + CURLE_TELNET_OPTION_SYNTAX , /* 49 - Malformed telnet option */ + CURLE_OBSOLETE50, /* 50 - NOT USED */ + CURLE_PEER_FAILED_VERIFICATION, /* 51 - peer's certificate or fingerprint + wasn't verified fine */ + CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ + CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ + CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as + default */ + CURLE_SEND_ERROR, /* 55 - failed sending network data */ + CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ + CURLE_OBSOLETE57, /* 57 - NOT IN USE */ + CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ + CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ + CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */ + CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized transfer encoding */ + CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ + CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ + CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ + CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind + that failed */ + CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ + CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not + accepted and we failed to login */ + CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ + CURLE_TFTP_PERM, /* 69 - permission problem on server */ + CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ + CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ + CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ + CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ + CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ + CURLE_CONV_FAILED, /* 75 - conversion failed */ + CURLE_CONV_REQD, /* 76 - caller must register conversion + callbacks using curl_easy_setopt options + CURLOPT_CONV_FROM_NETWORK_FUNCTION, + CURLOPT_CONV_TO_NETWORK_FUNCTION, and + CURLOPT_CONV_FROM_UTF8_FUNCTION */ + CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing + or wrong format */ + CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ + CURLE_SSH, /* 79 - error from the SSH layer, somewhat + generic so the error message will be of + interest when this has happened */ + + CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL + connection */ + CURLE_AGAIN, /* 81 - socket is not ready for send/recv, + wait till it's ready and try again (Added + in 7.18.2) */ + CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or + wrong format (Added in 7.19.0) */ + CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in + 7.19.0) */ + CURL_LAST /* never use! */ +} CURLcode; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ + +/* The following were added in 7.17.1 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION + +/* The following were added in 7.17.0 */ +/* These are scheduled to disappear by 2009 */ +#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* noone should be using this! */ +#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46 +#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44 +#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10 +#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16 +#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32 +#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29 +#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12 +#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20 +#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40 +#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24 +#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57 +#define CURLE_URL_MALFORMAT_USER CURLE_OBSOLETE4 + +#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED +#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE +#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR +#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL +#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS +#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR +#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED + +/* The following were added earlier */ + +#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT + +#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR +#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED +#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED + +#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE +#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME + +/* This was the error code 50 in 7.7.3 and a few earlier versions, this + is no longer used by libcurl but is instead #defined here only to not + make programs break */ +#define CURLE_ALREADY_COMPLETE 99999 + +#endif /*!CURL_NO_OLDIES*/ + +/* This prototype applies to all conversion callbacks */ +typedef CURLcode (*curl_conv_callback)(char *buffer, size_t length); + +typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ + void *ssl_ctx, /* actually an + OpenSSL SSL_CTX */ + void *userptr); + +typedef enum { + CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use + CONNECT HTTP/1.1 */ + CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT + HTTP/1.0 */ + CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already + in 7.10 */ + CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ + CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ + CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the + host name rather than the IP address. added + in 7.18.0 */ +} curl_proxytype; /* this enum was added in 7.10 */ + +#define CURLAUTH_NONE 0 /* nothing */ +#define CURLAUTH_BASIC (1<<0) /* Basic (default) */ +#define CURLAUTH_DIGEST (1<<1) /* Digest */ +#define CURLAUTH_GSSNEGOTIATE (1<<2) /* GSS-Negotiate */ +#define CURLAUTH_NTLM (1<<3) /* NTLM */ +#define CURLAUTH_DIGEST_IE (1<<4) /* Digest with IE flavour */ +#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) /* all fine types set */ +#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) + +#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */ +#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */ +#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */ +#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */ +#define CURLSSH_AUTH_HOST (1<<2) /* host key files */ +#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */ +#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY + +#define CURL_ERROR_SIZE 256 + +struct curl_khkey { + const char *key; /* points to a zero-terminated string encoded with base64 + if len is zero, otherwise to the "raw" data */ + size_t len; + enum type { + CURLKHTYPE_UNKNOWN, + CURLKHTYPE_RSA1, + CURLKHTYPE_RSA, + CURLKHTYPE_DSS + } keytype; +}; + +/* this is the set of return values expected from the curl_sshkeycallback + callback */ +enum curl_khstat { + CURLKHSTAT_FINE_ADD_TO_FILE, + CURLKHSTAT_FINE, + CURLKHSTAT_REJECT, /* reject the connection, return an error */ + CURLKHSTAT_DEFER, /* do not accept it, but we can't answer right now so + this causes a CURLE_DEFER error but otherwise the + connection will be left intact etc */ + CURLKHSTAT_LAST /* not for use, only a marker for last-in-list */ +}; + +/* this is the set of status codes pass in to the callback */ +enum curl_khmatch { + CURLKHMATCH_OK, /* match */ + CURLKHMATCH_MISMATCH, /* host found, key mismatch! */ + CURLKHMATCH_MISSING, /* no matching host/key found */ + CURLKHMATCH_LAST /* not for use, only a marker for last-in-list */ +}; + +typedef int + (*curl_sshkeycallback) (CURL *easy, /* easy handle */ + const struct curl_khkey *knownkey, /* known */ + const struct curl_khkey *foundkey, /* found */ + enum curl_khmatch, /* libcurl's view on the keys */ + void *clientp); /* custom pointer passed from app */ + +/* parameter for the CURLOPT_USE_SSL option */ +typedef enum { + CURLUSESSL_NONE, /* do not attempt to use SSL */ + CURLUSESSL_TRY, /* try using SSL, proceed anyway otherwise */ + CURLUSESSL_CONTROL, /* SSL for the control connection or fail */ + CURLUSESSL_ALL, /* SSL for all communication or fail */ + CURLUSESSL_LAST /* not an option, never use */ +} curl_usessl; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2009 */ + +#define CURLFTPSSL_NONE CURLUSESSL_NONE +#define CURLFTPSSL_TRY CURLUSESSL_TRY +#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL +#define CURLFTPSSL_ALL CURLUSESSL_ALL +#define CURLFTPSSL_LAST CURLUSESSL_LAST +#define curl_ftpssl curl_usessl +#endif /*!CURL_NO_OLDIES*/ + +/* parameter for the CURLOPT_FTP_SSL_CCC option */ +typedef enum { + CURLFTPSSL_CCC_NONE, /* do not send CCC */ + CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */ + CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */ + CURLFTPSSL_CCC_LAST /* not an option, never use */ +} curl_ftpccc; + +/* parameter for the CURLOPT_FTPSSLAUTH option */ +typedef enum { + CURLFTPAUTH_DEFAULT, /* let libcurl decide */ + CURLFTPAUTH_SSL, /* use "AUTH SSL" */ + CURLFTPAUTH_TLS, /* use "AUTH TLS" */ + CURLFTPAUTH_LAST /* not an option, never use */ +} curl_ftpauth; + +/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */ +typedef enum { + CURLFTP_CREATE_DIR_NONE, /* do NOT create missing dirs! */ + CURLFTP_CREATE_DIR, /* (FTP/SFTP) if CWD fails, try MKD and then CWD + again if MKD succeeded, for SFTP this does + similar magic */ + CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD + again even if MKD failed! */ + CURLFTP_CREATE_DIR_LAST /* not an option, never use */ +} curl_ftpcreatedir; + +/* parameter for the CURLOPT_FTP_FILEMETHOD option */ +typedef enum { + CURLFTPMETHOD_DEFAULT, /* let libcurl pick */ + CURLFTPMETHOD_MULTICWD, /* single CWD operation for each path part */ + CURLFTPMETHOD_NOCWD, /* no CWD at all */ + CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */ + CURLFTPMETHOD_LAST /* not an option, never use */ +} curl_ftpmethod; + +/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */ +#define CURLPROTO_HTTP (1<<0) +#define CURLPROTO_HTTPS (1<<1) +#define CURLPROTO_FTP (1<<2) +#define CURLPROTO_FTPS (1<<3) +#define CURLPROTO_SCP (1<<4) +#define CURLPROTO_SFTP (1<<5) +#define CURLPROTO_TELNET (1<<6) +#define CURLPROTO_LDAP (1<<7) +#define CURLPROTO_LDAPS (1<<8) +#define CURLPROTO_DICT (1<<9) +#define CURLPROTO_FILE (1<<10) +#define CURLPROTO_TFTP (1<<11) +#define CURLPROTO_ALL (~0) /* enable everything */ + +/* long may be 32 or 64 bits, but we should never depend on anything else + but 32 */ +#define CURLOPTTYPE_LONG 0 +#define CURLOPTTYPE_OBJECTPOINT 10000 +#define CURLOPTTYPE_FUNCTIONPOINT 20000 +#define CURLOPTTYPE_OFF_T 30000 + +/* name is uppercase CURLOPT_, + type is one of the defined CURLOPTTYPE_ + number is unique identifier */ +#ifdef CINIT +#undef CINIT +#endif + +#ifdef CURL_ISOCPP +#define CINIT(name,type,number) CURLOPT_ ## name = CURLOPTTYPE_ ## type + number +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLOPT_/**/name = type + number +#endif + +/* + * This macro-mania below setups the CURLOPT_[what] enum, to be used with + * curl_easy_setopt(). The first argument in the CINIT() macro is the [what] + * word. + */ + +typedef enum { + /* This is the FILE * or void * the regular output should be written to. */ + CINIT(FILE, OBJECTPOINT, 1), + + /* The full URL to get/put */ + CINIT(URL, OBJECTPOINT, 2), + + /* Port number to connect to, if other than default. */ + CINIT(PORT, LONG, 3), + + /* Name of proxy to use. */ + CINIT(PROXY, OBJECTPOINT, 4), + + /* "name:password" to use when fetching. */ + CINIT(USERPWD, OBJECTPOINT, 5), + + /* "name:password" to use with proxy. */ + CINIT(PROXYUSERPWD, OBJECTPOINT, 6), + + /* Range to get, specified as an ASCII string. */ + CINIT(RANGE, OBJECTPOINT, 7), + + /* not used */ + + /* Specified file stream to upload from (use as input): */ + CINIT(INFILE, OBJECTPOINT, 9), + + /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE + * bytes big. If this is not used, error messages go to stderr instead: */ + CINIT(ERRORBUFFER, OBJECTPOINT, 10), + + /* Function that will be called to store the output (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11), + + /* Function that will be called to read the input (instead of fread). The + * parameters will use fread() syntax, make sure to follow them. */ + CINIT(READFUNCTION, FUNCTIONPOINT, 12), + + /* Time-out the read operation after this amount of seconds */ + CINIT(TIMEOUT, LONG, 13), + + /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about + * how large the file being sent really is. That allows better error + * checking and better verifies that the upload was successful. -1 means + * unknown size. + * + * For large file support, there is also a _LARGE version of the key + * which takes an off_t type, allowing platforms with larger off_t + * sizes to handle larger files. See below for INFILESIZE_LARGE. + */ + CINIT(INFILESIZE, LONG, 14), + + /* POST static input fields. */ + CINIT(POSTFIELDS, OBJECTPOINT, 15), + + /* Set the referrer page (needed by some CGIs) */ + CINIT(REFERER, OBJECTPOINT, 16), + + /* Set the FTP PORT string (interface name, named or numerical IP address) + Use i.e '-' to use default address. */ + CINIT(FTPPORT, OBJECTPOINT, 17), + + /* Set the User-Agent string (examined by some CGIs) */ + CINIT(USERAGENT, OBJECTPOINT, 18), + + /* If the download receives less than "low speed limit" bytes/second + * during "low speed time" seconds, the operations is aborted. + * You could i.e if you have a pretty high speed connection, abort if + * it is less than 2000 bytes/sec during 20 seconds. + */ + + /* Set the "low speed limit" */ + CINIT(LOW_SPEED_LIMIT, LONG, 19), + + /* Set the "low speed time" */ + CINIT(LOW_SPEED_TIME, LONG, 20), + + /* Set the continuation offset. + * + * Note there is also a _LARGE version of this key which uses + * off_t types, allowing for large file offsets on platforms which + * use larger-than-32-bit off_t's. Look below for RESUME_FROM_LARGE. + */ + CINIT(RESUME_FROM, LONG, 21), + + /* Set cookie in request: */ + CINIT(COOKIE, OBJECTPOINT, 22), + + /* This points to a linked list of headers, struct curl_slist kind */ + CINIT(HTTPHEADER, OBJECTPOINT, 23), + + /* This points to a linked list of post entries, struct curl_httppost */ + CINIT(HTTPPOST, OBJECTPOINT, 24), + + /* name of the file keeping your private SSL-certificate */ + CINIT(SSLCERT, OBJECTPOINT, 25), + + /* password for the SSL or SSH private key */ + CINIT(KEYPASSWD, OBJECTPOINT, 26), + + /* send TYPE parameter? */ + CINIT(CRLF, LONG, 27), + + /* send linked-list of QUOTE commands */ + CINIT(QUOTE, OBJECTPOINT, 28), + + /* send FILE * or void * to store headers to, if you use a callback it + is simply passed to the callback unmodified */ + CINIT(WRITEHEADER, OBJECTPOINT, 29), + + /* point to a file to read the initial cookies from, also enables + "cookie awareness" */ + CINIT(COOKIEFILE, OBJECTPOINT, 31), + + /* What version to specifically try to use. + See CURL_SSLVERSION defines below. */ + CINIT(SSLVERSION, LONG, 32), + + /* What kind of HTTP time condition to use, see defines */ + CINIT(TIMECONDITION, LONG, 33), + + /* Time to use with the above condition. Specified in number of seconds + since 1 Jan 1970 */ + CINIT(TIMEVALUE, LONG, 34), + + /* 35 = OBSOLETE */ + + /* Custom request, for customizing the get command like + HTTP: DELETE, TRACE and others + FTP: to use a different list command + */ + CINIT(CUSTOMREQUEST, OBJECTPOINT, 36), + + /* HTTP request, for odd commands like DELETE, TRACE and others */ + CINIT(STDERR, OBJECTPOINT, 37), + + /* 38 is not used */ + + /* send linked-list of post-transfer QUOTE commands */ + CINIT(POSTQUOTE, OBJECTPOINT, 39), + + /* Pass a pointer to string of the output using full variable-replacement + as described elsewhere. */ + CINIT(WRITEINFO, OBJECTPOINT, 40), + + CINIT(VERBOSE, LONG, 41), /* talk a lot */ + CINIT(HEADER, LONG, 42), /* throw the header out too */ + CINIT(NOPROGRESS, LONG, 43), /* shut off the progress meter */ + CINIT(NOBODY, LONG, 44), /* use HEAD to get http document */ + CINIT(FAILONERROR, LONG, 45), /* no output on http error codes >= 300 */ + CINIT(UPLOAD, LONG, 46), /* this is an upload */ + CINIT(POST, LONG, 47), /* HTTP POST method */ + CINIT(DIRLISTONLY, LONG, 48), /* return bare names when listing directories */ + + CINIT(APPEND, LONG, 50), /* Append instead of overwrite on upload! */ + + /* Specify whether to read the user+password from the .netrc or the URL. + * This must be one of the CURL_NETRC_* enums below. */ + CINIT(NETRC, LONG, 51), + + CINIT(FOLLOWLOCATION, LONG, 52), /* use Location: Luke! */ + + CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */ + CINIT(PUT, LONG, 54), /* HTTP PUT */ + + /* 55 = OBSOLETE */ + + /* Function that will be called instead of the internal progress display + * function. This function should be defined as the curl_progress_callback + * prototype defines. */ + CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56), + + /* Data passed to the progress callback */ + CINIT(PROGRESSDATA, OBJECTPOINT, 57), + + /* We want the referrer field set automatically when following locations */ + CINIT(AUTOREFERER, LONG, 58), + + /* Port of the proxy, can be set in the proxy string as well with: + "[host]:[port]" */ + CINIT(PROXYPORT, LONG, 59), + + /* size of the POST input data, if strlen() is not good to use */ + CINIT(POSTFIELDSIZE, LONG, 60), + + /* tunnel non-http operations through a HTTP proxy */ + CINIT(HTTPPROXYTUNNEL, LONG, 61), + + /* Set the interface string to use as outgoing network interface */ + CINIT(INTERFACE, OBJECTPOINT, 62), + + /* Set the krb4/5 security level, this also enables krb4/5 awareness. This + * is a string, 'clear', 'safe', 'confidential' or 'private'. If the string + * is set but doesn't match one of these, 'private' will be used. */ + CINIT(KRBLEVEL, OBJECTPOINT, 63), + + /* Set if we should verify the peer in ssl handshake, set 1 to verify. */ + CINIT(SSL_VERIFYPEER, LONG, 64), + + /* The CApath or CAfile used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAINFO, OBJECTPOINT, 65), + + /* 66 = OBSOLETE */ + /* 67 = OBSOLETE */ + + /* Maximum number of http redirects to follow */ + CINIT(MAXREDIRS, LONG, 68), + + /* Pass a long set to 1 to get the date of the requested document (if + possible)! Pass a zero to shut it off. */ + CINIT(FILETIME, LONG, 69), + + /* This points to a linked list of telnet options */ + CINIT(TELNETOPTIONS, OBJECTPOINT, 70), + + /* Max amount of cached alive connections */ + CINIT(MAXCONNECTS, LONG, 71), + + /* What policy to use when closing connections when the cache is filled + up */ + CINIT(CLOSEPOLICY, LONG, 72), + + /* 73 = OBSOLETE */ + + /* Set to explicitly use a new connection for the upcoming transfer. + Do not use this unless you're absolutely sure of this, as it makes the + operation slower and is less friendly for the network. */ + CINIT(FRESH_CONNECT, LONG, 74), + + /* Set to explicitly forbid the upcoming transfer's connection to be re-used + when done. Do not use this unless you're absolutely sure of this, as it + makes the operation slower and is less friendly for the network. */ + CINIT(FORBID_REUSE, LONG, 75), + + /* Set to a file name that contains random data for libcurl to use to + seed the random engine when doing SSL connects. */ + CINIT(RANDOM_FILE, OBJECTPOINT, 76), + + /* Set to the Entropy Gathering Daemon socket pathname */ + CINIT(EGDSOCKET, OBJECTPOINT, 77), + + /* Time-out connect operations after this amount of seconds, if connects + are OK within this time, then fine... This only aborts the connect + phase. [Only works on unix-style/SIGALRM operating systems] */ + CINIT(CONNECTTIMEOUT, LONG, 78), + + /* Function that will be called to store headers (instead of fwrite). The + * parameters will use fwrite() syntax, make sure to follow them. */ + CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79), + + /* Set this to force the HTTP request to get back to GET. Only really usable + if POST, PUT or a custom request have been used first. + */ + CINIT(HTTPGET, LONG, 80), + + /* Set if we should verify the Common name from the peer certificate in ssl + * handshake, set 1 to check existence, 2 to ensure that it matches the + * provided hostname. */ + CINIT(SSL_VERIFYHOST, LONG, 81), + + /* Specify which file name to write all known cookies in after completed + operation. Set file name to "-" (dash) to make it go to stdout. */ + CINIT(COOKIEJAR, OBJECTPOINT, 82), + + /* Specify which SSL ciphers to use */ + CINIT(SSL_CIPHER_LIST, OBJECTPOINT, 83), + + /* Specify which HTTP version to use! This must be set to one of the + CURL_HTTP_VERSION* enums set below. */ + CINIT(HTTP_VERSION, LONG, 84), + + /* Specifically switch on or off the FTP engine's use of the EPSV command. By + default, that one will always be attempted before the more traditional + PASV command. */ + CINIT(FTP_USE_EPSV, LONG, 85), + + /* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */ + CINIT(SSLCERTTYPE, OBJECTPOINT, 86), + + /* name of the file keeping your private SSL-key */ + CINIT(SSLKEY, OBJECTPOINT, 87), + + /* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */ + CINIT(SSLKEYTYPE, OBJECTPOINT, 88), + + /* crypto engine for the SSL-sub system */ + CINIT(SSLENGINE, OBJECTPOINT, 89), + + /* set the crypto engine for the SSL-sub system as default + the param has no meaning... + */ + CINIT(SSLENGINE_DEFAULT, LONG, 90), + + /* Non-zero value means to use the global dns cache */ + CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* To become OBSOLETE soon */ + + /* DNS cache timeout */ + CINIT(DNS_CACHE_TIMEOUT, LONG, 92), + + /* send linked-list of pre-transfer QUOTE commands */ + CINIT(PREQUOTE, OBJECTPOINT, 93), + + /* set the debug function */ + CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94), + + /* set the data for the debug function */ + CINIT(DEBUGDATA, OBJECTPOINT, 95), + + /* mark this as start of a cookie session */ + CINIT(COOKIESESSION, LONG, 96), + + /* The CApath directory used to validate the peer certificate + this option is used only if SSL_VERIFYPEER is true */ + CINIT(CAPATH, OBJECTPOINT, 97), + + /* Instruct libcurl to use a smaller receive buffer */ + CINIT(BUFFERSIZE, LONG, 98), + + /* Instruct libcurl to not use any signal/alarm handlers, even when using + timeouts. This option is useful for multi-threaded applications. + See libcurl-the-guide for more background information. */ + CINIT(NOSIGNAL, LONG, 99), + + /* Provide a CURLShare for mutexing non-ts data */ + CINIT(SHARE, OBJECTPOINT, 100), + + /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default), + CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and CURLPROXY_SOCKS5. */ + CINIT(PROXYTYPE, LONG, 101), + + /* Set the Accept-Encoding string. Use this to tell a server you would like + the response to be compressed. */ + CINIT(ENCODING, OBJECTPOINT, 102), + + /* Set pointer to private data */ + CINIT(PRIVATE, OBJECTPOINT, 103), + + /* Set aliases for HTTP 200 in the HTTP Response header */ + CINIT(HTTP200ALIASES, OBJECTPOINT, 104), + + /* Continue to send authentication (user+password) when following locations, + even when hostname changed. This can potentially send off the name + and password to whatever host the server decides. */ + CINIT(UNRESTRICTED_AUTH, LONG, 105), + + /* Specifically switch on or off the FTP engine's use of the EPRT command ( it + also disables the LPRT attempt). By default, those ones will always be + attempted before the good old traditional PORT command. */ + CINIT(FTP_USE_EPRT, LONG, 106), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_USERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(HTTPAUTH, LONG, 107), + + /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx + in second argument. The function must be matching the + curl_ssl_ctx_callback proto. */ + CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108), + + /* Set the userdata for the ssl context callback function's third + argument */ + CINIT(SSL_CTX_DATA, OBJECTPOINT, 109), + + /* FTP Option that causes missing dirs to be created on the remote server. + In 7.19.4 we introduced the convenience enums for this option using the + CURLFTP_CREATE_DIR prefix. + */ + CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110), + + /* Set this to a bitmask value to enable the particular authentications + methods you like. Use this in combination with CURLOPT_PROXYUSERPWD. + Note that setting multiple bits may cause extra network round-trips. */ + CINIT(PROXYAUTH, LONG, 111), + + /* FTP option that changes the timeout, in seconds, associated with + getting a response. This is different from transfer timeout time and + essentially places a demand on the FTP server to acknowledge commands + in a timely manner. */ + CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112), + + /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to + tell libcurl to resolve names to those IP versions only. This only has + affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */ + CINIT(IPRESOLVE, LONG, 113), + + /* Set this option to limit the size of a file that will be downloaded from + an HTTP or FTP server. + + Note there is also _LARGE version which adds large file support for + platforms which have larger off_t sizes. See MAXFILESIZE_LARGE below. */ + CINIT(MAXFILESIZE, LONG, 114), + + /* See the comment for INFILESIZE above, but in short, specifies + * the size of the file being uploaded. -1 means unknown. + */ + CINIT(INFILESIZE_LARGE, OFF_T, 115), + + /* Sets the continuation offset. There is also a LONG version of this; + * look above for RESUME_FROM. + */ + CINIT(RESUME_FROM_LARGE, OFF_T, 116), + + /* Sets the maximum size of data that will be downloaded from + * an HTTP or FTP server. See MAXFILESIZE above for the LONG version. + */ + CINIT(MAXFILESIZE_LARGE, OFF_T, 117), + + /* Set this option to the file name of your .netrc file you want libcurl + to parse (using the CURLOPT_NETRC option). If not set, libcurl will do + a poor attempt to find the user's home directory and check for a .netrc + file in there. */ + CINIT(NETRC_FILE, OBJECTPOINT, 118), + + /* Enable SSL/TLS for FTP, pick one of: + CURLFTPSSL_TRY - try using SSL, proceed anyway otherwise + CURLFTPSSL_CONTROL - SSL for the control connection or fail + CURLFTPSSL_ALL - SSL for all communication or fail + */ + CINIT(USE_SSL, LONG, 119), + + /* The _LARGE version of the standard POSTFIELDSIZE option */ + CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120), + + /* Enable/disable the TCP Nagle algorithm */ + CINIT(TCP_NODELAY, LONG, 121), + + /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 123 OBSOLETE. Gone in 7.16.0 */ + /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */ + /* 127 OBSOLETE. Gone in 7.16.0 */ + /* 128 OBSOLETE. Gone in 7.16.0 */ + + /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option + can be used to change libcurl's default action which is to first try + "AUTH SSL" and then "AUTH TLS" in this order, and proceed when a OK + response has been received. + + Available parameters are: + CURLFTPAUTH_DEFAULT - let libcurl decide + CURLFTPAUTH_SSL - try "AUTH SSL" first, then TLS + CURLFTPAUTH_TLS - try "AUTH TLS" first, then SSL + */ + CINIT(FTPSSLAUTH, LONG, 129), + + CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130), + CINIT(IOCTLDATA, OBJECTPOINT, 131), + + /* 132 OBSOLETE. Gone in 7.16.0 */ + /* 133 OBSOLETE. Gone in 7.16.0 */ + + /* zero terminated string for pass on to the FTP server when asked for + "account" info */ + CINIT(FTP_ACCOUNT, OBJECTPOINT, 134), + + /* feed cookies into cookie engine */ + CINIT(COOKIELIST, OBJECTPOINT, 135), + + /* ignore Content-Length */ + CINIT(IGNORE_CONTENT_LENGTH, LONG, 136), + + /* Set to non-zero to skip the IP address received in a 227 PASV FTP server + response. Typically used for FTP-SSL purposes but is not restricted to + that. libcurl will then instead use the same IP address it used for the + control connection. */ + CINIT(FTP_SKIP_PASV_IP, LONG, 137), + + /* Select "file method" to use when doing FTP, see the curl_ftpmethod + above. */ + CINIT(FTP_FILEMETHOD, LONG, 138), + + /* Local port number to bind the socket to */ + CINIT(LOCALPORT, LONG, 139), + + /* Number of ports to try, including the first one set with LOCALPORT. + Thus, setting it to 1 will make no additional attempts but the first. + */ + CINIT(LOCALPORTRANGE, LONG, 140), + + /* no transfer, set up connection and let application use the socket by + extracting it with CURLINFO_LASTSOCKET */ + CINIT(CONNECT_ONLY, LONG, 141), + + /* Function that will be called to convert from the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142), + + /* Function that will be called to convert to the + network encoding (instead of using the iconv calls in libcurl) */ + CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143), + + /* Function that will be called to convert from UTF8 + (instead of using the iconv calls in libcurl) + Note that this is used only for SSL certificate processing */ + CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144), + + /* if the connection proceeds too quickly then need to slow it down */ + /* limit-rate: maximum number of bytes per second to send or receive */ + CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145), + CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146), + + /* Pointer to command string to send if USER/PASS fails. */ + CINIT(FTP_ALTERNATIVE_TO_USER, OBJECTPOINT, 147), + + /* callback function for setting socket options */ + CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148), + CINIT(SOCKOPTDATA, OBJECTPOINT, 149), + + /* set to 0 to disable session ID re-use for this transfer, default is + enabled (== 1) */ + CINIT(SSL_SESSIONID_CACHE, LONG, 150), + + /* allowed SSH authentication methods */ + CINIT(SSH_AUTH_TYPES, LONG, 151), + + /* Used by scp/sftp to do public/private key authentication */ + CINIT(SSH_PUBLIC_KEYFILE, OBJECTPOINT, 152), + CINIT(SSH_PRIVATE_KEYFILE, OBJECTPOINT, 153), + + /* Send CCC (Clear Command Channel) after authentication */ + CINIT(FTP_SSL_CCC, LONG, 154), + + /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */ + CINIT(TIMEOUT_MS, LONG, 155), + CINIT(CONNECTTIMEOUT_MS, LONG, 156), + + /* set to zero to disable the libcurl's decoding and thus pass the raw body + data to the application even when it is encoded/compressed */ + CINIT(HTTP_TRANSFER_DECODING, LONG, 157), + CINIT(HTTP_CONTENT_DECODING, LONG, 158), + + /* Permission used when creating new files and directories on the remote + server for protocols that support it, SFTP/SCP/FILE */ + CINIT(NEW_FILE_PERMS, LONG, 159), + CINIT(NEW_DIRECTORY_PERMS, LONG, 160), + + /* Set the behaviour of POST when redirecting. Values must be set to one + of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */ + CINIT(POSTREDIR, LONG, 161), + + /* used by scp/sftp to verify the host's public key */ + CINIT(SSH_HOST_PUBLIC_KEY_MD5, OBJECTPOINT, 162), + + /* Callback function for opening socket (instead of socket(2)). Optionally, + callback is able change the address or refuse to connect returning + CURL_SOCKET_BAD. The callback should have type + curl_opensocket_callback */ + CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163), + CINIT(OPENSOCKETDATA, OBJECTPOINT, 164), + + /* POST volatile input fields. */ + CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165), + + /* set transfer mode (;type=) when doing FTP via an HTTP proxy */ + CINIT(PROXY_TRANSFER_MODE, LONG, 166), + + /* Callback function for seeking in the input stream */ + CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167), + CINIT(SEEKDATA, OBJECTPOINT, 168), + + /* CRL file */ + CINIT(CRLFILE, OBJECTPOINT, 169), + + /* Issuer certificate */ + CINIT(ISSUERCERT, OBJECTPOINT, 170), + + /* (IPv6) Address scope */ + CINIT(ADDRESS_SCOPE, LONG, 171), + + /* Collect certificate chain info and allow it to get retrievable with + CURLINFO_CERTINFO after the transfer is complete. (Unfortunately) only + working with OpenSSL-powered builds. */ + CINIT(CERTINFO, LONG, 172), + + /* "name" and "pwd" to use when fetching. */ + CINIT(USERNAME, OBJECTPOINT, 173), + CINIT(PASSWORD, OBJECTPOINT, 174), + + /* "name" and "pwd" to use with Proxy when fetching. */ + CINIT(PROXYUSERNAME, OBJECTPOINT, 175), + CINIT(PROXYPASSWORD, OBJECTPOINT, 176), + + /* Comma separated list of hostnames defining no-proxy zones. These should + match both hostnames directly, and hostnames within a domain. For + example, local.com will match local.com and www.local.com, but NOT + notlocal.com or www.notlocal.com. For compatibility with other + implementations of this, .local.com will be considered to be the same as + local.com. A single * is the only valid wildcard, and effectively + disables the use of proxy. */ + CINIT(NOPROXY, OBJECTPOINT, 177), + + /* block size for TFTP transfers */ + CINIT(TFTP_BLKSIZE, LONG, 178), + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_SERVICE, OBJECTPOINT, 179), + + /* Socks Service */ + CINIT(SOCKS5_GSSAPI_NEC, LONG, 180), + + /* set the bitmask for the protocols that are allowed to be used for the + transfer, which thus helps the app which takes URLs from users or other + external inputs and want to restrict what protocol(s) to deal + with. Defaults to CURLPROTO_ALL. */ + CINIT(PROTOCOLS, LONG, 181), + + /* set the bitmask for the protocols that libcurl is allowed to follow to, + as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs + to be set in both bitmasks to be allowed to get redirected to. Defaults + to all protocols except FILE and SCP. */ + CINIT(REDIR_PROTOCOLS, LONG, 182), + + /* set the SSH knownhost file name to use */ + CINIT(SSH_KNOWNHOSTS, OBJECTPOINT, 183), + + /* set the SSH host key callback, must point to a curl_sshkeycallback + function */ + CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184), + + /* set the SSH host key callback custom pointer */ + CINIT(SSH_KEYDATA, OBJECTPOINT, 185), + + CURLOPT_LASTENTRY /* the last unused */ +} CURLoption; + +#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all + the obsolete stuff removed! */ + +/* Backwards compatibility with older names */ +/* These are scheduled to disappear by 2011 */ + +/* This was added in version 7.19.1 */ +#define CURLOPT_POST301 CURLOPT_POSTREDIR + +/* These are scheduled to disappear by 2009 */ + +/* The following were added in 7.17.0 */ +#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_FTPAPPEND CURLOPT_APPEND +#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY +#define CURLOPT_FTP_SSL CURLOPT_USE_SSL + +/* The following were added earlier */ + +#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD +#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL + +#else +/* This is set if CURL_NO_OLDIES is defined at compile-time */ +#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ +#endif + + + /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host + name resolves addresses using more than one IP protocol version, this + option might be handy to force libcurl to use a specific IP version. */ +#define CURL_IPRESOLVE_WHATEVER 0 /* default, resolves addresses to all IP + versions that your system allows */ +#define CURL_IPRESOLVE_V4 1 /* resolve to ipv4 addresses */ +#define CURL_IPRESOLVE_V6 2 /* resolve to ipv6 addresses */ + + /* three convenient "aliases" that follow the name scheme better */ +#define CURLOPT_WRITEDATA CURLOPT_FILE +#define CURLOPT_READDATA CURLOPT_INFILE +#define CURLOPT_HEADERDATA CURLOPT_WRITEHEADER + + /* These enums are for use with the CURLOPT_HTTP_VERSION option. */ +enum { + CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd + like the library to choose the best possible + for us! */ + CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ + CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ + + CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ +}; + + /* These enums are for use with the CURLOPT_NETRC option. */ +enum CURL_NETRC_OPTION { + CURL_NETRC_IGNORED, /* The .netrc will never be read. + * This is the default. */ + CURL_NETRC_OPTIONAL, /* A user:password in the URL will be preferred + * to one in the .netrc. */ + CURL_NETRC_REQUIRED, /* A user:password in the URL will be ignored. + * Unless one is set programmatically, the .netrc + * will be queried. */ + CURL_NETRC_LAST +}; + +enum { + CURL_SSLVERSION_DEFAULT, + CURL_SSLVERSION_TLSv1, + CURL_SSLVERSION_SSLv2, + CURL_SSLVERSION_SSLv3, + + CURL_SSLVERSION_LAST /* never use, keep last */ +}; + +/* symbols to use with CURLOPT_POSTREDIR. + CURL_REDIR_POST_301 and CURL_REDIR_POST_302 can be bitwise ORed so that + CURL_REDIR_POST_301 | CURL_REDIR_POST_302 == CURL_REDIR_POST_ALL */ + +#define CURL_REDIR_GET_ALL 0 +#define CURL_REDIR_POST_301 1 +#define CURL_REDIR_POST_302 2 +#define CURL_REDIR_POST_ALL (CURL_REDIR_POST_301|CURL_REDIR_POST_302) + +typedef enum { + CURL_TIMECOND_NONE, + + CURL_TIMECOND_IFMODSINCE, + CURL_TIMECOND_IFUNMODSINCE, + CURL_TIMECOND_LASTMOD, + + CURL_TIMECOND_LAST +} curl_TimeCond; + + +/* curl_strequal() and curl_strnequal() are subject for removal in a future + libcurl, see lib/README.curlx for details */ +CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2); +CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n); + +/* name is uppercase CURLFORM_ */ +#ifdef CFINIT +#undef CFINIT +#endif + +#ifdef CURL_ISOCPP +#define CFINIT(name) CURLFORM_ ## name +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define CFINIT(name) CURLFORM_/**/name +#endif + +typedef enum { + CFINIT(NOTHING), /********* the first one is unused ************/ + + /* */ + CFINIT(COPYNAME), + CFINIT(PTRNAME), + CFINIT(NAMELENGTH), + CFINIT(COPYCONTENTS), + CFINIT(PTRCONTENTS), + CFINIT(CONTENTSLENGTH), + CFINIT(FILECONTENT), + CFINIT(ARRAY), + CFINIT(OBSOLETE), + CFINIT(FILE), + + CFINIT(BUFFER), + CFINIT(BUFFERPTR), + CFINIT(BUFFERLENGTH), + + CFINIT(CONTENTTYPE), + CFINIT(CONTENTHEADER), + CFINIT(FILENAME), + CFINIT(END), + CFINIT(OBSOLETE2), + + CFINIT(STREAM), + + CURLFORM_LASTENTRY /* the last unused */ +} CURLformoption; + +#undef CFINIT /* done */ + +/* structure to be used as parameter for CURLFORM_ARRAY */ +struct curl_forms { + CURLformoption option; + const char *value; +}; + +/* use this for multipart formpost building */ +/* Returns code for curl_formadd() + * + * Returns: + * CURL_FORMADD_OK on success + * CURL_FORMADD_MEMORY if the FormInfo allocation fails + * CURL_FORMADD_OPTION_TWICE if one option is given twice for one Form + * CURL_FORMADD_NULL if a null pointer was given for a char + * CURL_FORMADD_MEMORY if the allocation of a FormInfo struct failed + * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used + * CURL_FORMADD_INCOMPLETE if the some FormInfo is not complete (or error) + * CURL_FORMADD_MEMORY if a curl_httppost struct cannot be allocated + * CURL_FORMADD_MEMORY if some allocation for string copying failed. + * CURL_FORMADD_ILLEGAL_ARRAY if an illegal option is used in an array + * + ***************************************************************************/ +typedef enum { + CURL_FORMADD_OK, /* first, no error */ + + CURL_FORMADD_MEMORY, + CURL_FORMADD_OPTION_TWICE, + CURL_FORMADD_NULL, + CURL_FORMADD_UNKNOWN_OPTION, + CURL_FORMADD_INCOMPLETE, + CURL_FORMADD_ILLEGAL_ARRAY, + CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */ + + CURL_FORMADD_LAST /* last */ +} CURLFORMcode; + +/* + * NAME curl_formadd() + * + * DESCRIPTION + * + * Pretty advanced function for building multi-part formposts. Each invoke + * adds one part that together construct a full post. Then use + * CURLOPT_HTTPPOST to send it off to libcurl. + */ +CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost, + struct curl_httppost **last_post, + ...); + +/* + * callback function for curl_formget() + * The void *arg pointer will be the one passed as second argument to + * curl_formget(). + * The character buffer passed to it must not be freed. + * Should return the buffer length passed to it as the argument "len" on + * success. + */ +typedef size_t (*curl_formget_callback)(void *arg, const char *buf, size_t len); + +/* + * NAME curl_formget() + * + * DESCRIPTION + * + * Serialize a curl_httppost struct built with curl_formadd(). + * Accepts a void pointer as second argument which will be passed to + * the curl_formget_callback function. + * Returns 0 on success. + */ +CURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg, + curl_formget_callback append); +/* + * NAME curl_formfree() + * + * DESCRIPTION + * + * Free a multipart formpost previously built with curl_formadd(). + */ +CURL_EXTERN void curl_formfree(struct curl_httppost *form); + +/* + * NAME curl_getenv() + * + * DESCRIPTION + * + * Returns a malloc()'ed string that MUST be curl_free()ed after usage is + * complete. DEPRECATED - see lib/README.curlx + */ +CURL_EXTERN char *curl_getenv(const char *variable); + +/* + * NAME curl_version() + * + * DESCRIPTION + * + * Returns a static ascii string of the libcurl version. + */ +CURL_EXTERN char *curl_version(void); + +/* + * NAME curl_easy_escape() + * + * DESCRIPTION + * + * Escapes URL strings (converts all letters consider illegal in URLs to their + * %XX versions). This function returns a new allocated string or NULL if an + * error occurred. + */ +CURL_EXTERN char *curl_easy_escape(CURL *handle, + const char *string, + int length); + +/* the previous version: */ +CURL_EXTERN char *curl_escape(const char *string, + int length); + + +/* + * NAME curl_easy_unescape() + * + * DESCRIPTION + * + * Unescapes URL encoding in strings (converts all %XX codes to their 8bit + * versions). This function returns a new allocated string or NULL if an error + * occurred. + * Conversion Note: On non-ASCII platforms the ASCII %XX codes are + * converted into the host encoding. + */ +CURL_EXTERN char *curl_easy_unescape(CURL *handle, + const char *string, + int length, + int *outlength); + +/* the previous version */ +CURL_EXTERN char *curl_unescape(const char *string, + int length); + +/* + * NAME curl_free() + * + * DESCRIPTION + * + * Provided for de-allocation in the same translation unit that did the + * allocation. Added in libcurl 7.10 + */ +CURL_EXTERN void curl_free(void *p); + +/* + * NAME curl_global_init() + * + * DESCRIPTION + * + * curl_global_init() should be invoked exactly once for each application that + * uses libcurl and before any call of other libcurl functions. + * + * This function is not thread-safe! + */ +CURL_EXTERN CURLcode curl_global_init(long flags); + +/* + * NAME curl_global_init_mem() + * + * DESCRIPTION + * + * curl_global_init() or curl_global_init_mem() should be invoked exactly once + * for each application that uses libcurl. This function can be used to + * initialize libcurl and set user defined memory management callback + * functions. Users can implement memory management routines to check for + * memory leaks, check for mis-use of the curl library etc. User registered + * callback routines with be invoked by this library instead of the system + * memory management routines like malloc, free etc. + */ +CURL_EXTERN CURLcode curl_global_init_mem(long flags, + curl_malloc_callback m, + curl_free_callback f, + curl_realloc_callback r, + curl_strdup_callback s, + curl_calloc_callback c); + +/* + * NAME curl_global_cleanup() + * + * DESCRIPTION + * + * curl_global_cleanup() should be invoked exactly once for each application + * that uses libcurl + */ +CURL_EXTERN void curl_global_cleanup(void); + +/* linked-list structure for the CURLOPT_QUOTE option (and other) */ +struct curl_slist { + char *data; + struct curl_slist *next; +}; + +/* + * NAME curl_slist_append() + * + * DESCRIPTION + * + * Appends a string to a linked list. If no list exists, it will be created + * first. Returns the new list, after appending. + */ +CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *, + const char *); + +/* + * NAME curl_slist_free_all() + * + * DESCRIPTION + * + * free a previously built curl_slist. + */ +CURL_EXTERN void curl_slist_free_all(struct curl_slist *); + +/* + * NAME curl_getdate() + * + * DESCRIPTION + * + * Returns the time, in seconds since 1 Jan 1970 of the time string given in + * the first argument. The time argument in the second parameter is unused + * and should be set to NULL. + */ +CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused); + +/* info about the certificate chain, only for OpenSSL builds. Asked + for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */ +struct curl_certinfo { + int num_of_certs; /* number of certificates with information */ + struct curl_slist **certinfo; /* for each index in this array, there's a + linked list with textual information in the + format "name: value" */ +}; + +#define CURLINFO_STRING 0x100000 +#define CURLINFO_LONG 0x200000 +#define CURLINFO_DOUBLE 0x300000 +#define CURLINFO_SLIST 0x400000 +#define CURLINFO_MASK 0x0fffff +#define CURLINFO_TYPEMASK 0xf00000 + +typedef enum { + CURLINFO_NONE, /* first, never use this */ + CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, + CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, + CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE + 3, + CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE + 4, + CURLINFO_CONNECT_TIME = CURLINFO_DOUBLE + 5, + CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6, + CURLINFO_SIZE_UPLOAD = CURLINFO_DOUBLE + 7, + CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, + CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, + CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, + CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, + CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, + CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, + CURLINFO_FILETIME = CURLINFO_LONG + 14, + CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, + CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, + CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, + CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, + CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, + CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, + CURLINFO_PRIVATE = CURLINFO_STRING + 21, + CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG + 22, + CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, + CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, + CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, + CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, + CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, + CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, + CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, + CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, + CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, + CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, + CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, + CURLINFO_CERTINFO = CURLINFO_SLIST + 34, + CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, + /* Fill in new entries below here! */ + + CURLINFO_LASTONE = 35 +} CURLINFO; + +/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as + CURLINFO_HTTP_CODE */ +#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE + +typedef enum { + CURLCLOSEPOLICY_NONE, /* first, never use this */ + + CURLCLOSEPOLICY_OLDEST, + CURLCLOSEPOLICY_LEAST_RECENTLY_USED, + CURLCLOSEPOLICY_LEAST_TRAFFIC, + CURLCLOSEPOLICY_SLOWEST, + CURLCLOSEPOLICY_CALLBACK, + + CURLCLOSEPOLICY_LAST /* last, never use this */ +} curl_closepolicy; + +#define CURL_GLOBAL_SSL (1<<0) +#define CURL_GLOBAL_WIN32 (1<<1) +#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) +#define CURL_GLOBAL_NOTHING 0 +#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL + + +/***************************************************************************** + * Setup defines, protos etc for the sharing stuff. + */ + +/* Different data locks for a single share */ +typedef enum { + CURL_LOCK_DATA_NONE = 0, + /* CURL_LOCK_DATA_SHARE is used internally to say that + * the locking is just made to change the internal state of the share + * itself. + */ + CURL_LOCK_DATA_SHARE, + CURL_LOCK_DATA_COOKIE, + CURL_LOCK_DATA_DNS, + CURL_LOCK_DATA_SSL_SESSION, + CURL_LOCK_DATA_CONNECT, + CURL_LOCK_DATA_LAST +} curl_lock_data; + +/* Different lock access types */ +typedef enum { + CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */ + CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */ + CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */ + CURL_LOCK_ACCESS_LAST /* never use */ +} curl_lock_access; + +typedef void (*curl_lock_function)(CURL *handle, + curl_lock_data data, + curl_lock_access locktype, + void *userptr); +typedef void (*curl_unlock_function)(CURL *handle, + curl_lock_data data, + void *userptr); + +typedef void CURLSH; + +typedef enum { + CURLSHE_OK, /* all is fine */ + CURLSHE_BAD_OPTION, /* 1 */ + CURLSHE_IN_USE, /* 2 */ + CURLSHE_INVALID, /* 3 */ + CURLSHE_NOMEM, /* out of memory */ + CURLSHE_LAST /* never use */ +} CURLSHcode; + +typedef enum { + CURLSHOPT_NONE, /* don't use */ + CURLSHOPT_SHARE, /* specify a data type to share */ + CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */ + CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */ + CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */ + CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock + callback functions */ + CURLSHOPT_LAST /* never use */ +} CURLSHoption; + +CURL_EXTERN CURLSH *curl_share_init(void); +CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); +CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *); + +/**************************************************************************** + * Structures for querying information about the curl library at runtime. + */ + +typedef enum { + CURLVERSION_FIRST, + CURLVERSION_SECOND, + CURLVERSION_THIRD, + CURLVERSION_FOURTH, + CURLVERSION_LAST /* never actually use this */ +} CURLversion; + +/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by + basically all programs ever that want to get version information. It is + meant to be a built-in version number for what kind of struct the caller + expects. If the struct ever changes, we redefine the NOW to another enum + from above. */ +#define CURLVERSION_NOW CURLVERSION_FOURTH + +typedef struct { + CURLversion age; /* age of the returned struct */ + const char *version; /* LIBCURL_VERSION */ + unsigned int version_num; /* LIBCURL_VERSION_NUM */ + const char *host; /* OS/host/cpu/machine when configured */ + int features; /* bitmask, see defines below */ + const char *ssl_version; /* human readable string */ + long ssl_version_num; /* not used anymore, always 0 */ + const char *libz_version; /* human readable string */ + /* protocols is terminated by an entry with a NULL protoname */ + const char * const *protocols; + + /* The fields below this were added in CURLVERSION_SECOND */ + const char *ares; + int ares_num; + + /* This field was added in CURLVERSION_THIRD */ + const char *libidn; + + /* These field were added in CURLVERSION_FOURTH */ + + /* Same as '_libiconv_version' if built with HAVE_ICONV */ + int iconv_ver_num; + + const char *libssh_version; /* human readable string */ + +} curl_version_info_data; + +#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */ +#define CURL_VERSION_KERBEROS4 (1<<1) /* kerberos auth is supported */ +#define CURL_VERSION_SSL (1<<2) /* SSL options are present */ +#define CURL_VERSION_LIBZ (1<<3) /* libz features are present */ +#define CURL_VERSION_NTLM (1<<4) /* NTLM auth is supported */ +#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth support */ +#define CURL_VERSION_DEBUG (1<<6) /* built with debug capabilities */ +#define CURL_VERSION_ASYNCHDNS (1<<7) /* asynchronous dns resolves */ +#define CURL_VERSION_SPNEGO (1<<8) /* SPNEGO auth */ +#define CURL_VERSION_LARGEFILE (1<<9) /* supports files bigger than 2GB */ +#define CURL_VERSION_IDN (1<<10) /* International Domain Names support */ +#define CURL_VERSION_SSPI (1<<11) /* SSPI is supported */ +#define CURL_VERSION_CONV (1<<12) /* character conversions supported */ +#define CURL_VERSION_CURLDEBUG (1<<13) /* debug memory tracking supported */ + +/* + * NAME curl_version_info() + * + * DESCRIPTION + * + * This function returns a pointer to a static copy of the version info + * struct. See above. + */ +CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion); + +/* + * NAME curl_easy_strerror() + * + * DESCRIPTION + * + * The curl_easy_strerror function may be used to turn a CURLcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_easy_strerror(CURLcode); + +/* + * NAME curl_share_strerror() + * + * DESCRIPTION + * + * The curl_share_strerror function may be used to turn a CURLSHcode value + * into the equivalent human readable error string. This is useful + * for printing meaningful error messages. + */ +CURL_EXTERN const char *curl_share_strerror(CURLSHcode); + +/* + * NAME curl_easy_pause() + * + * DESCRIPTION + * + * The curl_easy_pause function pauses or unpauses transfers. Select the new + * state by setting the bitmask, use the convenience defines below. + * + */ +CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask); + +#define CURLPAUSE_RECV (1<<0) +#define CURLPAUSE_RECV_CONT (0) + +#define CURLPAUSE_SEND (1<<2) +#define CURLPAUSE_SEND_CONT (0) + +#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND) +#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT) + +#ifdef __cplusplus +} +#endif + +/* unfortunately, the easy.h and multi.h include files need options and info + stuff before they can be included! */ +#include "easy.h" /* nothing in curl is fun without the easy stuff */ +#include "multi.h" + +/* the typechecker doesn't work in C++ (yet) */ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \ + ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \ + !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK) +#include "typecheck-gcc.h" +#else +#if defined(__STDC__) && (__STDC__ >= 1) +/* This preprocessor magic that replaces a call with the exact same call is + only done to make sure application authors pass exactly three arguments + to these functions. */ +#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param) +#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg) +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) +#endif /* __STDC__ >= 1 */ +#endif /* gcc >= 4.3 && !__cplusplus */ + +#endif /* __CURL_CURL_H */ diff --git a/src/third_party/curl/curlbuild.h b/src/third_party/curl/curlbuild.h new file mode 100644 index 0000000..2fb1d02 --- /dev/null +++ b/src/third_party/curl/curlbuild.h @@ -0,0 +1,204 @@ +/* include/curl/curlbuild.h. Generated from curlbuild.h.in by configure. */ +#ifndef __CURL_CURLBUILD_H +#define __CURL_CURLBUILD_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * $Id: curlbuild.h.in,v 1.8 2009-04-29 15:15:38 yangtse Exp $ + ***************************************************************************/ + +/* ================================================================ */ +/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * If you think that something actually needs to be changed, adjusted + * or fixed in this file, then, report it on the libcurl development + * mailing list: http://cool.haxx.se/mailman/listinfo/curl-library/ + * + * This header file shall only export symbols which are 'curl' or 'CURL' + * prefixed, otherwise public name space would be polluted. + * + * NOTE 2: + * ------- + * + * Right now you might be staring at file include/curl/curlbuild.h.in or + * at file include/curl/curlbuild.h, this is due to the following reason: + * + * On systems capable of running the configure script, the configure process + * will overwrite the distributed include/curl/curlbuild.h file with one that + * is suitable and specific to the library being configured and built, which + * is generated from the include/curl/curlbuild.h.in template file. + * + */ + +/* ================================================================ */ +/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ +/* ================================================================ */ + +#ifdef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined +#endif + +#ifdef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined +#endif + +#ifdef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined +#endif + +#ifdef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined +#endif + +#ifdef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined +#endif + +/* ================================================================ */ +/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ +/* ================================================================ */ + +/* Configure process defines this to 1 when it finds out that system */ +/* header file ws2tcpip.h must be included by the external interface. */ +/* #undef CURL_PULL_WS2TCPIP_H */ +#ifdef CURL_PULL_WS2TCPIP_H +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include +# include +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/types.h must be included by the external interface. */ +#define CURL_PULL_SYS_TYPES_H 1 +#ifdef CURL_PULL_SYS_TYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file stdint.h must be included by the external interface. */ +/* #undef CURL_PULL_STDINT_H */ +#ifdef CURL_PULL_STDINT_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file inttypes.h must be included by the external interface. */ +/* #undef CURL_PULL_INTTYPES_H */ +#ifdef CURL_PULL_INTTYPES_H +# include +#endif + +/* Configure process defines this to 1 when it finds out that system */ +/* header file sys/socket.h must be included by the external interface. */ +#define CURL_PULL_SYS_SOCKET_H 1 +#ifdef CURL_PULL_SYS_SOCKET_H +# include +#endif + +/* The size of `long', as computed by sizeof. */ +#if defined(_M_X64) || (defined(__x86_64__) && !defined(__ILP32__)) || \ + defined(__aarch64__) || (defined(__mips__) && _MIPS_SIM == _ABI64) || \ + defined(__powerpc64__) || defined(__s390x__) || defined(__LP64__) || \ + (defined(__riscv) && __riscv_xlen == 64) +#define CURL_SIZEOF_LONG 8 +#else +#define CURL_SIZEOF_LONG 4 +#endif + +/* Integral data type used for curl_socklen_t. */ +#define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t + +/* The size of `curl_socklen_t', as computed by sizeof. */ +#define CURL_SIZEOF_CURL_SOCKLEN_T 4 + +/* Data type definition of curl_socklen_t. */ +typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t; + +/* Signed integral data type used for curl_off_t. */ +#if defined(_M_X64) || (defined(__x86_64__) && !defined(__ILP32__)) || \ + defined(__aarch64__) +#define CURL_TYPEOF_CURL_OFF_T long +#else +#define CURL_TYPEOF_CURL_OFF_T int64_t +#endif + +/* Data type definition of curl_off_t. */ +typedef CURL_TYPEOF_CURL_OFF_T curl_off_t; + +/* curl_off_t formatting string directive without "%" conversion specifier. */ +#define CURL_FORMAT_CURL_OFF_T "ld" + +/* unsigned curl_off_t formatting string without "%" conversion specifier. */ +#define CURL_FORMAT_CURL_OFF_TU "lu" + +/* curl_off_t formatting string directive with "%" conversion specifier. */ +#define CURL_FORMAT_OFF_T "%ld" + +/* The size of `curl_off_t', as computed by sizeof. */ +#define CURL_SIZEOF_CURL_OFF_T 8 + +/* curl_off_t constant suffix. */ +#define CURL_SUFFIX_CURL_OFF_T L + +/* unsigned curl_off_t constant suffix. */ +#define CURL_SUFFIX_CURL_OFF_TU UL + +#endif /* __CURL_CURLBUILD_H */ diff --git a/src/third_party/curl/curlrules.h b/src/third_party/curl/curlrules.h new file mode 100644 index 0000000..abac439 --- /dev/null +++ b/src/third_party/curl/curlrules.h @@ -0,0 +1,249 @@ +#ifndef __CURL_CURLRULES_H +#define __CURL_CURLRULES_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * $Id: curlrules.h,v 1.7 2009-10-27 16:56:20 yangtse Exp $ + ***************************************************************************/ + +/* ================================================================ */ +/* COMPILE TIME SANITY CHECKS */ +/* ================================================================ */ + +/* + * NOTE 1: + * ------- + * + * All checks done in this file are intentionally placed in a public + * header file which is pulled by curl/curl.h when an application is + * being built using an already built libcurl library. Additionally + * this file is also included and used when building the library. + * + * If compilation fails on this file it is certainly sure that the + * problem is elsewhere. It could be a problem in the curlbuild.h + * header file, or simply that you are using different compilation + * settings than those used to build the library. + * + * Nothing in this file is intended to be modified or adjusted by the + * curl library user nor by the curl library builder. + * + * Do not deactivate any check, these are done to make sure that the + * library is properly built and used. + * + * You can find further help on the libcurl development mailing list: + * http://cool.haxx.se/mailman/listinfo/curl-library/ + * + * NOTE 2 + * ------ + * + * Some of the following compile time checks are based on the fact + * that the dimension of a constant array can not be a negative one. + * In this way if the compile time verification fails, the compilation + * will fail issuing an error. The error description wording is compiler + * dependent but it will be quite similar to one of the following: + * + * "negative subscript or subscript is too large" + * "array must have at least one element" + * "-1 is an illegal array size" + * "size of array is negative" + * + * If you are building an application which tries to use an already + * built libcurl library and you are getting this kind of errors on + * this file, it is a clear indication that there is a mismatch between + * how the library was built and how you are trying to use it for your + * application. Your already compiled or binary library provider is the + * only one who can give you the details you need to properly use it. + */ + +/* + * Verify that some macros are actually defined. + */ + +#ifndef CURL_SIZEOF_LONG +# error "CURL_SIZEOF_LONG definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_LONG_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_SOCKLEN_T +# error "CURL_TYPEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_SOCKLEN_T +# error "CURL_SIZEOF_CURL_SOCKLEN_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_is_missing +#endif + +#ifndef CURL_TYPEOF_CURL_OFF_T +# error "CURL_TYPEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_T +# error "CURL_FORMAT_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_FORMAT_CURL_OFF_TU +# error "CURL_FORMAT_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_is_missing +#endif + +#ifndef CURL_FORMAT_OFF_T +# error "CURL_FORMAT_OFF_T definition is missing!" + Error Compilation_aborted_CURL_FORMAT_OFF_T_is_missing +#endif + +#ifndef CURL_SIZEOF_CURL_OFF_T +# error "CURL_SIZEOF_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_T +# error "CURL_SUFFIX_CURL_OFF_T definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_is_missing +#endif + +#ifndef CURL_SUFFIX_CURL_OFF_TU +# error "CURL_SUFFIX_CURL_OFF_TU definition is missing!" + Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_is_missing +#endif + +/* + * Macros private to this header file. + */ + +#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1 + +#define CurlchkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 + +/* + * Verify that the size previously defined and expected for long + * is the same as the one reported by sizeof() at compile time. + */ + +typedef char + __curl_rule_01__ + [CurlchkszEQ(long, CURL_SIZEOF_LONG)]; + +/* + * Verify that the size previously defined and expected for + * curl_off_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_02__ + [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)]; + +/* + * Verify at compile time that the size of curl_off_t as reported + * by sizeof() is greater or equal than the one reported for long + * for the current compilation. + */ + +typedef char + __curl_rule_03__ + [CurlchkszGE(curl_off_t, long)]; + +/* + * Verify that the size previously defined and expected for + * curl_socklen_t is actually the the same as the one reported + * by sizeof() at compile time. + */ + +typedef char + __curl_rule_04__ + [CurlchkszEQ(curl_socklen_t, CURL_SIZEOF_CURL_SOCKLEN_T)]; + +/* + * Verify at compile time that the size of curl_socklen_t as reported + * by sizeof() is greater or equal than the one reported for int for + * the current compilation. + */ + +typedef char + __curl_rule_05__ + [CurlchkszGE(curl_socklen_t, int)]; + +/* ================================================================ */ +/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ +/* ================================================================ */ + +/* + * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow + * these to be visible and exported by the external libcurl interface API, + * while also making them visible to the library internals, simply including + * setup.h, without actually needing to include curl.h internally. + * If some day this section would grow big enough, all this should be moved + * to its own header file. + */ + +/* + * Figure out if we can use the ## preprocessor operator, which is supported + * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__ + * or __cplusplus so we need to carefully check for them too. + */ + +#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \ + defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \ + defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \ + defined(__ILEC400__) + /* This compiler is believed to have an ISO compatible preprocessor */ +#define CURL_ISOCPP +#else + /* This compiler is believed NOT to have an ISO compatible preprocessor */ +#undef CURL_ISOCPP +#endif + +/* + * Macros for minimum-width signed and unsigned curl_off_t integer constants. + */ + +#ifdef CURL_ISOCPP +# define __CURL_OFF_T_C_HELPER2(Val,Suffix) Val ## Suffix +#else +# define __CURL_OFF_T_C_HELPER2(Val,Suffix) Val/**/Suffix +#endif +#define __CURL_OFF_T_C_HELPER1(Val,Suffix) __CURL_OFF_T_C_HELPER2(Val,Suffix) +#define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HELPER1(Val,CURL_SUFFIX_CURL_OFF_T) +#define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HELPER1(Val,CURL_SUFFIX_CURL_OFF_TU) + +/* + * Get rid of macros private to this header file. + */ + +#undef CurlchkszEQ +#undef CurlchkszGE + +/* + * Get rid of macros not intended to exist beyond this point. + */ + +#undef CURL_PULL_WS2TCPIP_H +#undef CURL_PULL_SYS_TYPES_H +#undef CURL_PULL_SYS_SOCKET_H +#undef CURL_PULL_STDINT_H +#undef CURL_PULL_INTTYPES_H + +#undef CURL_TYPEOF_CURL_SOCKLEN_T +#undef CURL_TYPEOF_CURL_OFF_T + +#endif /* __CURL_CURLRULES_H */ diff --git a/src/third_party/curl/curlver.h b/src/third_party/curl/curlver.h new file mode 100644 index 0000000..afa85c1 --- /dev/null +++ b/src/third_party/curl/curlver.h @@ -0,0 +1,70 @@ +#ifndef __CURL_CURLVER_H +#define __CURL_CURLVER_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * $Id: curlver.h,v 1.48 2009-08-12 11:24:52 bagder Exp $ + ***************************************************************************/ + +/* This header file contains nothing but libcurl version info, generated by + a script at release-time. This was made its own header file in 7.11.2 */ + +/* This is the global package copyright */ +#define LIBCURL_COPYRIGHT "1996 - 2009 Daniel Stenberg, ." + +/* This is the version number of the libcurl package from which this header + file origins: */ +#define LIBCURL_VERSION "7.19.7" + +/* The numeric version number is also available "in parts" by using these + defines: */ +#define LIBCURL_VERSION_MAJOR 7 +#define LIBCURL_VERSION_MINOR 19 +#define LIBCURL_VERSION_PATCH 7 + +/* This is the numeric version of the libcurl version number, meant for easier + parsing and comparions by programs. The LIBCURL_VERSION_NUM define will + always follow this syntax: + + 0xXXYYZZ + + Where XX, YY and ZZ are the main version, release and patch numbers in + hexadecimal (using 8 bits each). All three numbers are always represented + using two digits. 1.2 would appear as "0x010200" while version 9.11.7 + appears as "0x090b07". + + This 6-digit (24 bits) hexadecimal number does not show pre-release number, + and it is always a greater number in a more recent release. It makes + comparisons with greater than and less than work. +*/ +#define LIBCURL_VERSION_NUM 0x071307 + +/* + * This is the date and time when the full source package was created. The + * timestamp is not stored in CVS, as the timestamp is properly set in the + * tarballs by the maketgz script. + * + * The format of the date should follow this template: + * + * "Mon Feb 12 11:35:33 UTC 2007" + */ +#define LIBCURL_TIMESTAMP "Wed Nov 4 12:34:59 UTC 2009" + +#endif /* __CURL_CURLVER_H */ diff --git a/src/third_party/curl/easy.h b/src/third_party/curl/easy.h new file mode 100644 index 0000000..40449c3 --- /dev/null +++ b/src/third_party/curl/easy.h @@ -0,0 +1,103 @@ +#ifndef __CURL_EASY_H +#define __CURL_EASY_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * $Id: easy.h,v 1.14 2008-05-12 21:43:28 bagder Exp $ + ***************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN CURL *curl_easy_init(void); +CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); +CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); +CURL_EXTERN void curl_easy_cleanup(CURL *curl); + +/* + * NAME curl_easy_getinfo() + * + * DESCRIPTION + * + * Request internal information from the curl session with this function. The + * third argument MUST be a pointer to a long, a pointer to a char * or a + * pointer to a double (as the documentation describes elsewhere). The data + * pointed to will be filled in accordingly and can be relied upon only if the + * function returns CURLE_OK. This function is intended to get used *AFTER* a + * performed transfer, all results from this function are undefined until the + * transfer is completed. + */ +CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); + + +/* + * NAME curl_easy_duphandle() + * + * DESCRIPTION + * + * Creates a new curl session handle with the same options set for the handle + * passed in. Duplicating a handle could only be a matter of cloning data and + * options, internal state info and things like persistant connections cannot + * be transfered. It is useful in multithreaded applications when you can run + * curl_easy_duphandle() for each new thread to avoid a series of identical + * curl_easy_setopt() invokes in every thread. + */ +CURL_EXTERN CURL* curl_easy_duphandle(CURL *curl); + +/* + * NAME curl_easy_reset() + * + * DESCRIPTION + * + * Re-initializes a CURL handle to the default values. This puts back the + * handle to the same state as it was in when it was just created. + * + * It does keep: live connections, the Session ID cache, the DNS cache and the + * cookies. + */ +CURL_EXTERN void curl_easy_reset(CURL *curl); + +/* + * NAME curl_easy_recv() + * + * DESCRIPTION + * + * Receives data from the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, + size_t *n); + +/* + * NAME curl_easy_send() + * + * DESCRIPTION + * + * Sends data over the connected socket. Use after successful + * curl_easy_perform() with CURLOPT_CONNECT_ONLY option. + */ +CURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer, + size_t buflen, size_t *n); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/third_party/curl/mprintf.h b/src/third_party/curl/mprintf.h new file mode 100644 index 0000000..d7202de --- /dev/null +++ b/src/third_party/curl/mprintf.h @@ -0,0 +1,82 @@ +#ifndef __CURL_MPRINTF_H +#define __CURL_MPRINTF_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * $Id: mprintf.h,v 1.16 2008-05-20 10:21:50 patrickm Exp $ + ***************************************************************************/ + +#include +#include /* needed for FILE */ + +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +CURL_EXTERN int curl_mprintf(const char *format, ...); +CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...); +CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...); +CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, + const char *format, ...); +CURL_EXTERN int curl_mvprintf(const char *format, va_list args); +CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args); +CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args); +CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, + const char *format, va_list args); +CURL_EXTERN char *curl_maprintf(const char *format, ...); +CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args); + +#ifdef _MPRINTF_REPLACE +# undef printf +# undef fprintf +# undef sprintf +# undef vsprintf +# undef snprintf +# undef vprintf +# undef vfprintf +# undef vsnprintf +# undef aprintf +# undef vaprintf +# define printf curl_mprintf +# define fprintf curl_mfprintf +#ifdef CURLDEBUG +/* When built with CURLDEBUG we define away the sprintf() functions since we + don't want internal code to be using them */ +# define sprintf sprintf_was_used +# define vsprintf vsprintf_was_used +#else +# define sprintf curl_msprintf +# define vsprintf curl_mvsprintf +#endif +# define snprintf curl_msnprintf +# define vprintf curl_mvprintf +# define vfprintf curl_mvfprintf +# define vsnprintf curl_mvsnprintf +# define aprintf curl_maprintf +# define vaprintf curl_mvaprintf +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __CURL_MPRINTF_H */ diff --git a/src/third_party/curl/multi.h b/src/third_party/curl/multi.h new file mode 100644 index 0000000..153f772 --- /dev/null +++ b/src/third_party/curl/multi.h @@ -0,0 +1,346 @@ +#ifndef __CURL_MULTI_H +#define __CURL_MULTI_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2007, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * $Id: multi.h,v 1.45 2008-05-20 10:21:50 patrickm Exp $ + ***************************************************************************/ +/* + This is an "external" header file. Don't give away any internals here! + + GOALS + + o Enable a "pull" interface. The application that uses libcurl decides where + and when to ask libcurl to get/send data. + + o Enable multiple simultaneous transfers in the same thread without making it + complicated for the application. + + o Enable the application to select() on its own file descriptors and curl's + file descriptors simultaneous easily. + +*/ + +/* + * This header file should not really need to include "curl.h" since curl.h + * itself includes this file and we expect user applications to do #include + * without the need for especially including multi.h. + * + * For some reason we added this include here at one point, and rather than to + * break existing (wrongly written) libcurl applications, we leave it as-is + * but with this warning attached. + */ +#include "curl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void CURLM; + +typedef enum { + CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or + curl_multi_socket*() soon */ + CURLM_OK, + CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */ + CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */ + CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */ + CURLM_INTERNAL_ERROR, /* this is a libcurl bug */ + CURLM_BAD_SOCKET, /* the passed in socket argument did not match */ + CURLM_UNKNOWN_OPTION, /* curl_multi_setopt() with unsupported option */ + CURLM_LAST +} CURLMcode; + +/* just to make code nicer when using curl_multi_socket() you can now check + for CURLM_CALL_MULTI_SOCKET too in the same style it works for + curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */ +#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM + +typedef enum { + CURLMSG_NONE, /* first, not used */ + CURLMSG_DONE, /* This easy handle has completed. 'result' contains + the CURLcode of the transfer */ + CURLMSG_LAST /* last, not used */ +} CURLMSG; + +struct CURLMsg { + CURLMSG msg; /* what this message means */ + CURL *easy_handle; /* the handle it concerns */ + union { + void *whatever; /* message-specific data */ + CURLcode result; /* return code for transfer */ + } data; +}; +typedef struct CURLMsg CURLMsg; + +/* + * Name: curl_multi_init() + * + * Desc: inititalize multi-style curl usage + * + * Returns: a new CURLM handle to use in all 'curl_multi' functions. + */ +CURL_EXTERN CURLM *curl_multi_init(void); + +/* + * Name: curl_multi_add_handle() + * + * Desc: add a standard curl handle to the multi stack + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_remove_handle() + * + * Desc: removes a curl handle from the multi stack again + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, + CURL *curl_handle); + + /* + * Name: curl_multi_fdset() + * + * Desc: Ask curl for its fd_set sets. The app can use these to select() or + * poll() on. We want curl_multi_perform() called as soon as one of + * them are ready. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle, + fd_set *read_fd_set, + fd_set *write_fd_set, + fd_set *exc_fd_set, + int *max_fd); + + /* + * Name: curl_multi_perform() + * + * Desc: When the app thinks there's data available for curl it calls this + * function to read/write whatever there is right now. This returns + * as soon as the reads and writes are done. This function does not + * require that there actually is data available for reading or that + * data can be written, it can be called just in case. It returns + * the number of handles that still transfer data in the second + * argument's integer-pointer. + * + * Returns: CURLMcode type, general multi error code. *NOTE* that this only + * returns errors etc regarding the whole multi stack. There might + * still have occurred problems on invidual transfers even when this + * returns OK. + */ +CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle, + int *running_handles); + + /* + * Name: curl_multi_cleanup() + * + * Desc: Cleans up and removes a whole multi stack. It does not free or + * touch any individual easy handles in any way. We need to define + * in what state those handles will be if this function is called + * in the middle of a transfer. + * + * Returns: CURLMcode type, general multi error code. + */ +CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle); + +/* + * Name: curl_multi_info_read() + * + * Desc: Ask the multi handle if there's any messages/informationals from + * the individual transfers. Messages include informationals such as + * error code from the transfer or just the fact that a transfer is + * completed. More details on these should be written down as well. + * + * Repeated calls to this function will return a new struct each + * time, until a special "end of msgs" struct is returned as a signal + * that there is no more to get at this point. + * + * The data the returned pointer points to will not survive calling + * curl_multi_cleanup(). + * + * The 'CURLMsg' struct is meant to be very simple and only contain + * very basic informations. If more involved information is wanted, + * we will provide the particular "transfer handle" in that struct + * and that should/could/would be used in subsequent + * curl_easy_getinfo() calls (or similar). The point being that we + * must never expose complex structs to applications, as then we'll + * undoubtably get backwards compatibility problems in the future. + * + * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out + * of structs. It also writes the number of messages left in the + * queue (after this read) in the integer the second argument points + * to. + */ +CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle, + int *msgs_in_queue); + +/* + * Name: curl_multi_strerror() + * + * Desc: The curl_multi_strerror function may be used to turn a CURLMcode + * value into the equivalent human readable error string. This is + * useful for printing meaningful error messages. + * + * Returns: A pointer to a zero-terminated error message. + */ +CURL_EXTERN const char *curl_multi_strerror(CURLMcode); + +/* + * Name: curl_multi_socket() and + * curl_multi_socket_all() + * + * Desc: An alternative version of curl_multi_perform() that allows the + * application to pass in one of the file descriptors that have been + * detected to have "action" on them and let libcurl perform. + * See man page for details. + */ +#define CURL_POLL_NONE 0 +#define CURL_POLL_IN 1 +#define CURL_POLL_OUT 2 +#define CURL_POLL_INOUT 3 +#define CURL_POLL_REMOVE 4 + +#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD + +#define CURL_CSELECT_IN 0x01 +#define CURL_CSELECT_OUT 0x02 +#define CURL_CSELECT_ERR 0x04 + +typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* see above */ + void *userp, /* private callback + pointer */ + void *socketp); /* private socket + pointer */ +/* + * Name: curl_multi_timer_callback + * + * Desc: Called by libcurl whenever the library detects a change in the + * maximum number of milliseconds the app is allowed to wait before + * curl_multi_socket() or curl_multi_perform() must be called + * (to allow libcurl's timed events to take place). + * + * Returns: The callback should return zero. + */ +typedef int (*curl_multi_timer_callback)(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp); /* private callback + pointer */ + +CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, + curl_socket_t s, + int ev_bitmask, + int *running_handles); + +CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle, + int *running_handles); + +#ifndef CURL_ALLOW_OLD_MULTI_SOCKET +/* This macro below was added in 7.16.3 to push users who recompile to use + the new curl_multi_socket_action() instead of the old curl_multi_socket() +*/ +#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z) +#endif + +/* + * Name: curl_multi_timeout() + * + * Desc: Returns the maximum number of milliseconds the app is allowed to + * wait before curl_multi_socket() or curl_multi_perform() must be + * called (to allow libcurl's timed events to take place). + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle, + long *milliseconds); + +#undef CINIT /* re-using the same name as in curl.h */ + +#ifdef CURL_ISOCPP +#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num +#else +/* The macro "##" is ISO C, we assume pre-ISO C doesn't support it. */ +#define LONG CURLOPTTYPE_LONG +#define OBJECTPOINT CURLOPTTYPE_OBJECTPOINT +#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT +#define OFF_T CURLOPTTYPE_OFF_T +#define CINIT(name,type,number) CURLMOPT_/**/name = type + number +#endif + +typedef enum { + /* This is the socket callback function pointer */ + CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1), + + /* This is the argument passed to the socket callback */ + CINIT(SOCKETDATA, OBJECTPOINT, 2), + + /* set to 1 to enable pipelining for this multi handle */ + CINIT(PIPELINING, LONG, 3), + + /* This is the timer callback function pointer */ + CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4), + + /* This is the argument passed to the timer callback */ + CINIT(TIMERDATA, OBJECTPOINT, 5), + + /* maximum number of entries in the connection cache */ + CINIT(MAXCONNECTS, LONG, 6), + + CURLMOPT_LASTENTRY /* the last unused */ +} CURLMoption; + + +/* + * Name: curl_multi_setopt() + * + * Desc: Sets options for the multi handle. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle, + CURLMoption option, ...); + + +/* + * Name: curl_multi_assign() + * + * Desc: This function sets an association in the multi handle between the + * given socket and a private pointer of the application. This is + * (only) useful for curl_multi_socket uses. + * + * Returns: CURLM error code. + */ +CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, + curl_socket_t sockfd, void *sockp); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif diff --git a/src/third_party/curl/stdcheaders.h b/src/third_party/curl/stdcheaders.h new file mode 100644 index 0000000..f739d7f --- /dev/null +++ b/src/third_party/curl/stdcheaders.h @@ -0,0 +1,34 @@ +#ifndef __STDC_HEADERS_H +#define __STDC_HEADERS_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * $Id: stdcheaders.h,v 1.9 2009-05-18 12:25:45 yangtse Exp $ + ***************************************************************************/ + +#include + +size_t fread (void *, size_t, size_t, FILE *); +size_t fwrite (const void *, size_t, size_t, FILE *); + +int strcasecmp(const char *, const char *); +int strncasecmp(const char *, const char *, size_t); + +#endif diff --git a/src/third_party/curl/typecheck-gcc.h b/src/third_party/curl/typecheck-gcc.h new file mode 100644 index 0000000..9788305 --- /dev/null +++ b/src/third_party/curl/typecheck-gcc.h @@ -0,0 +1,551 @@ +#ifndef __CURL_TYPECHECK_GCC_H +#define __CURL_TYPECHECK_GCC_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * $Id: typecheck-gcc.h,v 1.9 2009-01-25 23:26:31 bagder Exp $ + ***************************************************************************/ + +/* wraps curl_easy_setopt() with typechecking */ + +/* To add a new kind of warning, add an + * if(_curl_is_sometype_option(_curl_opt) && ! _curl_is_sometype(value)) + * _curl_easy_setopt_err_sometype(); + * block and define _curl_is_sometype_option, _curl_is_sometype and + * _curl_easy_setopt_err_sometype below + * + * To add an option that uses the same type as an existing option, you'll just + * need to extend the appropriate _curl_*_option macro + */ +#define curl_easy_setopt(handle, option, value) \ +__extension__ ({ \ + __typeof__ (option) _curl_opt = option; \ + if (__builtin_constant_p(_curl_opt)) { \ + if (_curl_is_long_option(_curl_opt) && !_curl_is_long(value)) \ + _curl_easy_setopt_err_long(); \ + if (_curl_is_off_t_option(_curl_opt) && !_curl_is_off_t(value)) \ + _curl_easy_setopt_err_curl_off_t(); \ + if (_curl_is_string_option(_curl_opt) && !_curl_is_string(value)) \ + _curl_easy_setopt_err_string(); \ + if (_curl_is_write_cb_option(_curl_opt) && !_curl_is_write_cb(value)) \ + _curl_easy_setopt_err_write_callback(); \ + if ((_curl_opt) == CURLOPT_READFUNCTION && !_curl_is_read_cb(value)) \ + _curl_easy_setopt_err_read_cb(); \ + if ((_curl_opt) == CURLOPT_IOCTLFUNCTION && !_curl_is_ioctl_cb(value)) \ + _curl_easy_setopt_err_ioctl_cb(); \ + if ((_curl_opt) == CURLOPT_SOCKOPTFUNCTION && !_curl_is_sockopt_cb(value))\ + _curl_easy_setopt_err_sockopt_cb(); \ + if ((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION && \ + !_curl_is_opensocket_cb(value)) \ + _curl_easy_setopt_err_opensocket_cb(); \ + if ((_curl_opt) == CURLOPT_PROGRESSFUNCTION && \ + !_curl_is_progress_cb(value)) \ + _curl_easy_setopt_err_progress_cb(); \ + if ((_curl_opt) == CURLOPT_DEBUGFUNCTION && !_curl_is_debug_cb(value)) \ + _curl_easy_setopt_err_debug_cb(); \ + if ((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION && \ + !_curl_is_ssl_ctx_cb(value)) \ + _curl_easy_setopt_err_ssl_ctx_cb(); \ + if (_curl_is_conv_cb_option(_curl_opt) && !_curl_is_conv_cb(value)) \ + _curl_easy_setopt_err_conv_cb(); \ + if ((_curl_opt) == CURLOPT_SEEKFUNCTION && !_curl_is_seek_cb(value)) \ + _curl_easy_setopt_err_seek_cb(); \ + if (_curl_is_cb_data_option(_curl_opt) && !_curl_is_cb_data(value)) \ + _curl_easy_setopt_err_cb_data(); \ + if ((_curl_opt) == CURLOPT_ERRORBUFFER && !_curl_is_error_buffer(value)) \ + _curl_easy_setopt_err_error_buffer(); \ + if ((_curl_opt) == CURLOPT_STDERR && !_curl_is_FILE(value)) \ + _curl_easy_setopt_err_FILE(); \ + if (_curl_is_postfields_option(_curl_opt) && !_curl_is_postfields(value)) \ + _curl_easy_setopt_err_postfields(); \ + if ((_curl_opt) == CURLOPT_HTTPPOST && \ + !_curl_is_arr((value), struct curl_httppost)) \ + _curl_easy_setopt_err_curl_httpost(); \ + if (_curl_is_slist_option(_curl_opt) && \ + !_curl_is_arr((value), struct curl_slist)) \ + _curl_easy_setopt_err_curl_slist(); \ + if ((_curl_opt) == CURLOPT_SHARE && !_curl_is_ptr((value), CURLSH)) \ + _curl_easy_setopt_err_CURLSH(); \ + } \ + curl_easy_setopt(handle, _curl_opt, value); \ +}) + +/* wraps curl_easy_getinfo() with typechecking */ +/* FIXME: don't allow const pointers */ +#define curl_easy_getinfo(handle, info, arg) \ +__extension__ ({ \ + __typeof__ (info) _curl_info = info; \ + if (__builtin_constant_p(_curl_info)) { \ + if (_curl_is_string_info(_curl_info) && !_curl_is_arr((arg), char *)) \ + _curl_easy_getinfo_err_string(); \ + if (_curl_is_long_info(_curl_info) && !_curl_is_arr((arg), long)) \ + _curl_easy_getinfo_err_long(); \ + if (_curl_is_double_info(_curl_info) && !_curl_is_arr((arg), double)) \ + _curl_easy_getinfo_err_double(); \ + if (_curl_is_slist_info(_curl_info) && \ + !_curl_is_arr((arg), struct curl_slist *)) \ + _curl_easy_getinfo_err_curl_slist(); \ + } \ + curl_easy_getinfo(handle, _curl_info, arg); \ +}) + +/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(), + * for now just make sure that the functions are called with three + * arguments + */ +#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param) +#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param) + + +/* the actual warnings, triggered by calling the _curl_easy_setopt_err* + * functions */ + +/* To define a new warning, use _CURL_WARNING(identifier, "message") */ +#define _CURL_WARNING(id, message) \ + static void __attribute__((warning(message))) __attribute__((unused)) \ + __attribute__((noinline)) id(void) { __asm__(""); } + +_CURL_WARNING(_curl_easy_setopt_err_long, + "curl_easy_setopt expects a long argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_off_t, + "curl_easy_setopt expects a curl_off_t argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_string, + "curl_easy_setopt expects a string (char* or char[]) argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_write_callback, + "curl_easy_setopt expects a curl_write_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_read_cb, + "curl_easy_setopt expects a curl_read_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb, + "curl_easy_setopt expects a curl_ioctl_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb, + "curl_easy_setopt expects a curl_sockopt_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb, + "curl_easy_setopt expects a curl_opensocket_callback argument for this option" + ) +_CURL_WARNING(_curl_easy_setopt_err_progress_cb, + "curl_easy_setopt expects a curl_progress_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_debug_cb, + "curl_easy_setopt expects a curl_debug_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb, + "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_conv_cb, + "curl_easy_setopt expects a curl_conv_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_seek_cb, + "curl_easy_setopt expects a curl_seek_callback argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_cb_data, + "curl_easy_setopt expects a private data pointer as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_error_buffer, + "curl_easy_setopt expects a char buffer of CURL_ERROR_SIZE as argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_FILE, + "curl_easy_setopt expects a FILE* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_postfields, + "curl_easy_setopt expects a void* or char* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_httpost, + "curl_easy_setopt expects a struct curl_httppost* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_curl_slist, + "curl_easy_setopt expects a struct curl_slist* argument for this option") +_CURL_WARNING(_curl_easy_setopt_err_CURLSH, + "curl_easy_setopt expects a CURLSH* argument for this option") + +_CURL_WARNING(_curl_easy_getinfo_err_string, + "curl_easy_getinfo expects a pointer to char * for this info") +_CURL_WARNING(_curl_easy_getinfo_err_long, + "curl_easy_getinfo expects a pointer to long for this info") +_CURL_WARNING(_curl_easy_getinfo_err_double, + "curl_easy_getinfo expects a pointer to double for this info") +_CURL_WARNING(_curl_easy_getinfo_err_curl_slist, + "curl_easy_getinfo expects a pointer to struct curl_slist * for this info") + +/* groups of curl_easy_setops options that take the same type of argument */ + +/* To add a new option to one of the groups, just add + * (option) == CURLOPT_SOMETHING + * to the or-expression. If the option takes a long or curl_off_t, you don't + * have to do anything + */ + +/* evaluates to true if option takes a long argument */ +#define _curl_is_long_option(option) \ + (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT) + +#define _curl_is_off_t_option(option) \ + ((option) > CURLOPTTYPE_OFF_T) + +/* evaluates to true if option takes a char* argument */ +#define _curl_is_string_option(option) \ + ((option) == CURLOPT_URL || \ + (option) == CURLOPT_PROXY || \ + (option) == CURLOPT_INTERFACE || \ + (option) == CURLOPT_NETRC_FILE || \ + (option) == CURLOPT_USERPWD || \ + (option) == CURLOPT_USERNAME || \ + (option) == CURLOPT_PASSWORD || \ + (option) == CURLOPT_PROXYUSERPWD || \ + (option) == CURLOPT_PROXYUSERNAME || \ + (option) == CURLOPT_PROXYPASSWORD || \ + (option) == CURLOPT_NOPROXY || \ + (option) == CURLOPT_ENCODING || \ + (option) == CURLOPT_REFERER || \ + (option) == CURLOPT_USERAGENT || \ + (option) == CURLOPT_COOKIE || \ + (option) == CURLOPT_COOKIEFILE || \ + (option) == CURLOPT_COOKIEJAR || \ + (option) == CURLOPT_COOKIELIST || \ + (option) == CURLOPT_FTPPORT || \ + (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER || \ + (option) == CURLOPT_FTP_ACCOUNT || \ + (option) == CURLOPT_RANGE || \ + (option) == CURLOPT_CUSTOMREQUEST || \ + (option) == CURLOPT_SSLCERT || \ + (option) == CURLOPT_SSLCERTTYPE || \ + (option) == CURLOPT_SSLKEY || \ + (option) == CURLOPT_SSLKEYTYPE || \ + (option) == CURLOPT_KEYPASSWD || \ + (option) == CURLOPT_SSLENGINE || \ + (option) == CURLOPT_CAINFO || \ + (option) == CURLOPT_CAPATH || \ + (option) == CURLOPT_RANDOM_FILE || \ + (option) == CURLOPT_EGDSOCKET || \ + (option) == CURLOPT_SSL_CIPHER_LIST || \ + (option) == CURLOPT_KRBLEVEL || \ + (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 || \ + (option) == CURLOPT_SSH_PUBLIC_KEYFILE || \ + (option) == CURLOPT_SSH_PRIVATE_KEYFILE || \ + (option) == CURLOPT_CRLFILE || \ + (option) == CURLOPT_ISSUERCERT || \ + 0) + +/* evaluates to true if option takes a curl_write_callback argument */ +#define _curl_is_write_cb_option(option) \ + ((option) == CURLOPT_HEADERFUNCTION || \ + (option) == CURLOPT_WRITEFUNCTION) + +/* evaluates to true if option takes a curl_conv_callback argument */ +#define _curl_is_conv_cb_option(option) \ + ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION || \ + (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION) + +/* evaluates to true if option takes a data argument to pass to a callback */ +#define _curl_is_cb_data_option(option) \ + ((option) == CURLOPT_WRITEDATA || \ + (option) == CURLOPT_READDATA || \ + (option) == CURLOPT_IOCTLDATA || \ + (option) == CURLOPT_SOCKOPTDATA || \ + (option) == CURLOPT_OPENSOCKETDATA || \ + (option) == CURLOPT_PROGRESSDATA || \ + (option) == CURLOPT_WRITEHEADER || \ + (option) == CURLOPT_DEBUGDATA || \ + (option) == CURLOPT_SSL_CTX_DATA || \ + (option) == CURLOPT_SEEKDATA || \ + (option) == CURLOPT_PRIVATE || \ + 0) + +/* evaluates to true if option takes a POST data argument (void* or char*) */ +#define _curl_is_postfields_option(option) \ + ((option) == CURLOPT_POSTFIELDS || \ + (option) == CURLOPT_COPYPOSTFIELDS || \ + 0) + +/* evaluates to true if option takes a struct curl_slist * argument */ +#define _curl_is_slist_option(option) \ + ((option) == CURLOPT_HTTPHEADER || \ + (option) == CURLOPT_HTTP200ALIASES || \ + (option) == CURLOPT_QUOTE || \ + (option) == CURLOPT_POSTQUOTE || \ + (option) == CURLOPT_PREQUOTE || \ + (option) == CURLOPT_TELNETOPTIONS || \ + 0) + +/* groups of curl_easy_getinfo infos that take the same type of argument */ + +/* evaluates to true if info expects a pointer to char * argument */ +#define _curl_is_string_info(info) \ + (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG) + +/* evaluates to true if info expects a pointer to long argument */ +#define _curl_is_long_info(info) \ + (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE) + +/* evaluates to true if info expects a pointer to double argument */ +#define _curl_is_double_info(info) \ + (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST) + +/* true if info expects a pointer to struct curl_slist * argument */ +#define _curl_is_slist_info(info) \ + (CURLINFO_SLIST < (info)) + + +/* typecheck helpers -- check whether given expression has requested type*/ + +/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros, + * otherwise define a new macro. Search for __builtin_types_compatible_p + * in the GCC manual. + * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is + * the actual expression passed to the curl_easy_setopt macro. This + * means that you can only apply the sizeof and __typeof__ operators, no + * == or whatsoever. + */ + +/* XXX: should evaluate to true iff expr is a pointer */ +#define _curl_is_any_ptr(expr) \ + (sizeof(expr) == sizeof(void*)) + +/* evaluates to true if expr is NULL */ +/* XXX: must not evaluate expr, so this check is not accurate */ +#define _curl_is_NULL(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL))) + +/* evaluates to true if expr is type*, const type* or NULL */ +#define _curl_is_ptr(expr, type) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), type *) || \ + __builtin_types_compatible_p(__typeof__(expr), const type *)) + +/* evaluates to true if expr is one of type[], type*, NULL or const type* */ +#define _curl_is_arr(expr, type) \ + (_curl_is_ptr((expr), type) || \ + __builtin_types_compatible_p(__typeof__(expr), type [])) + +/* evaluates to true if expr is a string */ +#define _curl_is_string(expr) \ + (_curl_is_arr((expr), char) || \ + _curl_is_arr((expr), signed char) || \ + _curl_is_arr((expr), unsigned char)) + +/* evaluates to true if expr is a long (no matter the signedness) + * XXX: for now, int is also accepted (and therefore short and char, which + * are promoted to int when passed to a variadic function) */ +#define _curl_is_long(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), long) || \ + __builtin_types_compatible_p(__typeof__(expr), signed long) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned long) || \ + __builtin_types_compatible_p(__typeof__(expr), int) || \ + __builtin_types_compatible_p(__typeof__(expr), signed int) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned int) || \ + __builtin_types_compatible_p(__typeof__(expr), short) || \ + __builtin_types_compatible_p(__typeof__(expr), signed short) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned short) || \ + __builtin_types_compatible_p(__typeof__(expr), char) || \ + __builtin_types_compatible_p(__typeof__(expr), signed char) || \ + __builtin_types_compatible_p(__typeof__(expr), unsigned char)) + +/* evaluates to true if expr is of type curl_off_t */ +#define _curl_is_off_t(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), curl_off_t)) + +/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */ +/* XXX: also check size of an char[] array? */ +#define _curl_is_error_buffer(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), char *) || \ + __builtin_types_compatible_p(__typeof__(expr), char[])) + +/* evaluates to true if expr is of type (const) void* or (const) FILE* */ +#if 0 +#define _curl_is_cb_data(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_ptr((expr), FILE)) +#else /* be less strict */ +#define _curl_is_cb_data(expr) \ + _curl_is_any_ptr(expr) +#endif + +/* evaluates to true if expr is of type FILE* */ +#define _curl_is_FILE(expr) \ + (__builtin_types_compatible_p(__typeof__(expr), FILE *)) + +/* evaluates to true if expr can be passed as POST data (void* or char*) */ +#define _curl_is_postfields(expr) \ + (_curl_is_ptr((expr), void) || \ + _curl_is_arr((expr), char)) + +/* FIXME: the whole callback checking is messy... + * The idea is to tolerate char vs. void and const vs. not const + * pointers in arguments at least + */ +/* helper: __builtin_types_compatible_p distinguishes between functions and + * function pointers, hide it */ +#define _curl_callback_compatible(func, type) \ + (__builtin_types_compatible_p(__typeof__(func), type) || \ + __builtin_types_compatible_p(__typeof__(func), type*)) + +/* evaluates to true if expr is of type curl_read_callback or "similar" */ +#define _curl_is_read_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fread)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_read_callback) || \ + _curl_callback_compatible((expr), _curl_read_callback1) || \ + _curl_callback_compatible((expr), _curl_read_callback2) || \ + _curl_callback_compatible((expr), _curl_read_callback3) || \ + _curl_callback_compatible((expr), _curl_read_callback4) || \ + _curl_callback_compatible((expr), _curl_read_callback5) || \ + _curl_callback_compatible((expr), _curl_read_callback6)) +typedef size_t (_curl_read_callback1)(char *, size_t, size_t, void*); +typedef size_t (_curl_read_callback2)(char *, size_t, size_t, const void*); +typedef size_t (_curl_read_callback3)(char *, size_t, size_t, FILE*); +typedef size_t (_curl_read_callback4)(void *, size_t, size_t, void*); +typedef size_t (_curl_read_callback5)(void *, size_t, size_t, const void*); +typedef size_t (_curl_read_callback6)(void *, size_t, size_t, FILE*); + +/* evaluates to true if expr is of type curl_write_callback or "similar" */ +#define _curl_is_write_cb(expr) \ + (_curl_is_read_cb(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), __typeof__(fwrite)) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_write_callback) || \ + _curl_callback_compatible((expr), _curl_write_callback1) || \ + _curl_callback_compatible((expr), _curl_write_callback2) || \ + _curl_callback_compatible((expr), _curl_write_callback3) || \ + _curl_callback_compatible((expr), _curl_write_callback4) || \ + _curl_callback_compatible((expr), _curl_write_callback5) || \ + _curl_callback_compatible((expr), _curl_write_callback6)) +typedef size_t (_curl_write_callback1)(const char *, size_t, size_t, void*); +typedef size_t (_curl_write_callback2)(const char *, size_t, size_t, + const void*); +typedef size_t (_curl_write_callback3)(const char *, size_t, size_t, FILE*); +typedef size_t (_curl_write_callback4)(const void *, size_t, size_t, void*); +typedef size_t (_curl_write_callback5)(const void *, size_t, size_t, + const void*); +typedef size_t (_curl_write_callback6)(const void *, size_t, size_t, FILE*); + +/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */ +#define _curl_is_ioctl_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ioctl_callback) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback1) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback2) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback3) || \ + _curl_callback_compatible((expr), _curl_ioctl_callback4)) +typedef curlioerr (_curl_ioctl_callback1)(CURL *, int, void*); +typedef curlioerr (_curl_ioctl_callback2)(CURL *, int, const void*); +typedef curlioerr (_curl_ioctl_callback3)(CURL *, curliocmd, void*); +typedef curlioerr (_curl_ioctl_callback4)(CURL *, curliocmd, const void*); + +/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */ +#define _curl_is_sockopt_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_sockopt_callback) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback1) || \ + _curl_callback_compatible((expr), _curl_sockopt_callback2)) +typedef int (_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype); +typedef int (_curl_sockopt_callback2)(const void *, curl_socket_t, + curlsocktype); + +/* evaluates to true if expr is of type curl_opensocket_callback or "similar" */ +#define _curl_is_opensocket_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_opensocket_callback) ||\ + _curl_callback_compatible((expr), _curl_opensocket_callback1) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback2) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback3) || \ + _curl_callback_compatible((expr), _curl_opensocket_callback4)) +typedef curl_socket_t (_curl_opensocket_callback1) + (void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback2) + (void *, curlsocktype, const struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback3) + (const void *, curlsocktype, struct curl_sockaddr *); +typedef curl_socket_t (_curl_opensocket_callback4) + (const void *, curlsocktype, const struct curl_sockaddr *); + +/* evaluates to true if expr is of type curl_progress_callback or "similar" */ +#define _curl_is_progress_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_progress_callback) || \ + _curl_callback_compatible((expr), _curl_progress_callback1) || \ + _curl_callback_compatible((expr), _curl_progress_callback2)) +typedef int (_curl_progress_callback1)(void *, + double, double, double, double); +typedef int (_curl_progress_callback2)(const void *, + double, double, double, double); + +/* evaluates to true if expr is of type curl_debug_callback or "similar" */ +#define _curl_is_debug_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_debug_callback) || \ + _curl_callback_compatible((expr), _curl_debug_callback1) || \ + _curl_callback_compatible((expr), _curl_debug_callback2) || \ + _curl_callback_compatible((expr), _curl_debug_callback3) || \ + _curl_callback_compatible((expr), _curl_debug_callback4)) +typedef int (_curl_debug_callback1) (CURL *, + curl_infotype, char *, size_t, void *); +typedef int (_curl_debug_callback2) (CURL *, + curl_infotype, char *, size_t, const void *); +typedef int (_curl_debug_callback3) (CURL *, + curl_infotype, const char *, size_t, void *); +typedef int (_curl_debug_callback4) (CURL *, + curl_infotype, const char *, size_t, const void *); + +/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */ +/* this is getting even messier... */ +#define _curl_is_ssl_ctx_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_ssl_ctx_callback) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) || \ + _curl_callback_compatible((expr), _curl_ssl_ctx_callback8)) +typedef CURLcode (_curl_ssl_ctx_callback1)(CURL *, void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback2)(CURL *, void *, const void *); +typedef CURLcode (_curl_ssl_ctx_callback3)(CURL *, const void *, void *); +typedef CURLcode (_curl_ssl_ctx_callback4)(CURL *, const void *, const void *); +#ifdef HEADER_SSL_H +/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX + * this will of course break if we're included before OpenSSL headers... + */ +typedef CURLcode (_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *); +typedef CURLcode (_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *); +typedef CURLcode (_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX, const void *); +#else +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7; +typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8; +#endif + +/* evaluates to true if expr is of type curl_conv_callback or "similar" */ +#define _curl_is_conv_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_conv_callback) || \ + _curl_callback_compatible((expr), _curl_conv_callback1) || \ + _curl_callback_compatible((expr), _curl_conv_callback2) || \ + _curl_callback_compatible((expr), _curl_conv_callback3) || \ + _curl_callback_compatible((expr), _curl_conv_callback4)) +typedef CURLcode (*_curl_conv_callback1)(char *, size_t length); +typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length); +typedef CURLcode (*_curl_conv_callback3)(void *, size_t length); +typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length); + +/* evaluates to true if expr is of type curl_seek_callback or "similar" */ +#define _curl_is_seek_cb(expr) \ + (_curl_is_NULL(expr) || \ + __builtin_types_compatible_p(__typeof__(expr), curl_seek_callback) || \ + _curl_callback_compatible((expr), _curl_seek_callback1) || \ + _curl_callback_compatible((expr), _curl_seek_callback2)) +typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int); +typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int); + + +#endif /* __CURL_TYPECHECK_GCC_H */ diff --git a/src/third_party/curl/types.h b/src/third_party/curl/types.h new file mode 100644 index 0000000..d37d6ae --- /dev/null +++ b/src/third_party/curl/types.h @@ -0,0 +1 @@ +/* not used */ diff --git a/src/third_party/libdisasm/LICENSE b/src/third_party/libdisasm/LICENSE new file mode 100644 index 0000000..c563828 --- /dev/null +++ b/src/third_party/libdisasm/LICENSE @@ -0,0 +1,137 @@ + + + + + The "Clarified Artistic License" + + Preamble + +The intent of this document is to state the conditions under which a +Package may be copied, such that the Copyright Holder maintains some +semblance of artistic control over the development of the package, +while giving the users of the package the right to use and distribute +the Package in a more-or-less customary fashion, plus the right to make +reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the + Copyright Holder, and derivatives of that collection of files + created through textual modification. + + "Standard Version" refers to such a Package if it has not been + modified, or has been modified in accordance with the wishes + of the Copyright Holder as specified below. + + "Copyright Holder" is whoever is named in the copyright or + copyrights for the package. + + "You" is you, if you're thinking about copying or distributing + this Package. + + "Distribution fee" is a fee you charge for providing a copy of this + Package to another party. + + "Freely Available" means that no fee is charged for the right to use + the item, though there may be fees involved in handling the item. + +1. You may make and give away verbatim copies of the source form of the +Standard Version of this Package without restriction, provided that you +duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications +derived from the Public Domain, or those made Freely Available, or from +the Copyright Holder. A Package modified in such a way shall still be +considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided +that you insert a prominent notice in each changed file stating how and +when you changed that file, and provided that you do at least ONE of the +following: + + a) place your modifications in the Public Domain or otherwise make them + Freely Available, such as by posting said modifications to Usenet or + an equivalent medium, or placing the modifications on a major archive + site allowing unrestricted access to them, or by allowing the Copyright + Holder to include your modifications in the Standard Version of the + Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict + with standard executables, which must also be provided, and provide + a separate manual page for each non-standard executable that clearly + documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + + e) permit and encourge anyone who receives a copy of the modified Package + permission to make your modifications Freely Available in some specific + way. + +4. You may distribute the programs of this Package in object code or +executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, + together with instructions (in the manual page or equivalent) on where + to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) give non-standard executables non-standard names, and clearly + document the differences in manual pages (or equivalent), together + with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + + e) offer the machine-readable source of the Package, with your + modifications, by mail order. + +5. You may charge a distribution fee for any distribution of this Package. +If you offer support for this Package, you may charge any fee you choose +for that support. You may not charge a license fee for the right to use +this Package itself. You may distribute this Package in aggregate with +other (possibly commercial and possibly nonfree) programs as part of a +larger (possibly commercial and possibly nonfree) software distribution, +and charge license fees for other parts of that software distribution, +provided that you do not advertise this Package as a product of your own. +If the Package includes an interpreter, You may embed this Package's +interpreter within an executable of yours (by linking); this shall be +construed as a mere form of aggregation, provided that the complete +Standard Version of the interpreter is so embedded. + +6. The scripts and library files supplied as input to or produced as +output from the programs of this Package do not automatically fall +under the copyright of this Package, but belong to whoever generated +them, and may be sold commercially, and may be aggregated with this +Package. If such scripts or library files are aggregated with this +Package via the so-called "undump" or "unexec" methods of producing a +binary executable image, then distribution of such an image shall +neither be construed as a distribution of this Package nor shall it +fall under the restrictions of Paragraphs 3 and 4, provided that you do +not represent such an executable image as a Standard Version of this +Package. + +7. C subroutines (or comparably compiled subroutines in other +languages) supplied by you and linked into this Package in order to +emulate subroutines and variables of the language defined by this +Package shall not be considered part of this Package, but are the +equivalent of input as in Paragraph 6, provided these subroutines do +not change the language in any way that would cause it to fail the +regression tests for the language. + +8. Aggregation of the Standard Version of the Package with a commercial +distribution is always permitted provided that the use of this Package is +embedded; that is, when no overt attempt is made to make this Package's +interfaces visible to the end user of the commercial distribution. +Such use shall not be construed as a distribution of this Package. + +9. The name of the Copyright Holder may not be used to endorse or promote +products derived from this software without specific prior written permission. + +10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + The End diff --git a/src/third_party/libdisasm/Makefile.am b/src/third_party/libdisasm/Makefile.am new file mode 100644 index 0000000..bd3129e --- /dev/null +++ b/src/third_party/libdisasm/Makefile.am @@ -0,0 +1,43 @@ +include_HEADERS = libdis.h +lib_LTLIBRARIES = libdisasm.la +libdisasm_la_SOURCES = \ + ia32_implicit.c \ + ia32_implicit.h \ + ia32_insn.c \ + ia32_insn.h \ + ia32_invariant.c \ + ia32_invariant.h \ + ia32_modrm.c \ + ia32_modrm.h \ + ia32_opcode_tables.c \ + ia32_opcode_tables.h \ + ia32_operand.c \ + ia32_operand.h \ + ia32_reg.c \ + ia32_reg.h \ + ia32_settings.c \ + ia32_settings.h \ + libdis.h \ + qword.h \ + x86_disasm.c \ + x86_format.c \ + x86_imm.c \ + x86_imm.h \ + x86_insn.c \ + x86_misc.c \ + x86_operand_list.c \ + x86_operand_list.h + +# Cheat to get non-autoconf swig into tarball, +# even if it doesn't build by default. +EXTRA_DIST = \ +swig/Makefile \ +swig/libdisasm.i \ +swig/libdisasm_oop.i \ +swig/python/Makefile-swig \ +swig/perl/Makefile-swig \ +swig/perl/Makefile.PL \ +swig/ruby/Makefile-swig \ +swig/ruby/extconf.rb \ +swig/tcl/Makefile-swig \ +swig/README diff --git a/src/third_party/libdisasm/README.breakpad b/src/third_party/libdisasm/README.breakpad new file mode 100644 index 0000000..a345411 --- /dev/null +++ b/src/third_party/libdisasm/README.breakpad @@ -0,0 +1,9 @@ +Name: libdisasm +URL: https://sourceforge.net/projects/bastard/files/libdisasm/0.23/libdisasm-0.23.tar.gz/download +Version: 0.23 +License: Clarified-Artistic +License File: LICENSE + +Description: +This contains a copy of libdisasm. It is no longer under development upstream, +so we keep a copy here to maintain fixes ourselves. diff --git a/src/third_party/libdisasm/TODO b/src/third_party/libdisasm/TODO new file mode 100644 index 0000000..148addf --- /dev/null +++ b/src/third_party/libdisasm/TODO @@ -0,0 +1,43 @@ +x86_format.c +------------ +intel: jmpf -> jmp, callf -> call +att: jmpf -> ljmp, callf -> lcall + +opcode table +------------ +finish typing instructions +fix flag clear/set/toggle types + +ix64 stuff +---------- +document output file formats in web page +features doc: register aliases, implicit operands, stack mods, +ring0 flags, eflags, cpu model/isa + +ia32_handle_* implementation + +fix operand 0F C2 +CMPPS + +* sysenter, sysexit as CALL types -- preceded by MSR writes +* SYSENTER/SYSEXIT stack : overwrites SS, ESP +* stos, cmps, scas, movs, ins, outs, lods -> OP_PTR +* OP_SIZE in implicit operands +* use OP_SIZE to choose reg sizes! + +DONE?? : +implicit operands: provide action ? +e.g. add/inc for stach, write, etc +replace table numbers in opcodes.dat with +#defines for table names + +replace 0 with INSN_INVALID [or maybe FF for imnvalid and 00 for Not Applicable */ +no wait that is only for prefix tables -- n/p + +if ( prefx) only use if insn != invalid + +these should cover all the wacky disasm exceptions + +for the rep one we can chet, match only a 0x90 + +todo: privilege | ring diff --git a/src/third_party/libdisasm/ia32_implicit.c b/src/third_party/libdisasm/ia32_implicit.c new file mode 100644 index 0000000..8b075d2 --- /dev/null +++ b/src/third_party/libdisasm/ia32_implicit.c @@ -0,0 +1,422 @@ +#include + +#include "ia32_implicit.h" +#include "ia32_insn.h" +#include "ia32_reg.h" +#include "x86_operand_list.h" + +/* Conventions: Register operands which are aliases of another register + * operand (e.g. AX in one operand and AL in another) assume that the + * operands are different registers and that alias tracking will resolve + * data flow. This means that something like + * mov ax, al + * would have 'write only' access for AX and 'read only' access for AL, + * even though both AL and AX are read and written */ +typedef struct { + uint32_t type; + uint32_t operand; +} op_implicit_list_t; + +static op_implicit_list_t list_aaa[] = + /* 37 : AAA : rw AL */ + /* 3F : AAS : rw AL */ + {{ OP_R | OP_W, REG_BYTE_OFFSET }, {0}}; /* aaa */ + +static op_implicit_list_t list_aad[] = + /* D5 0A, D5 (ib) : AAD : rw AX */ + /* D4 0A, D4 (ib) : AAM : rw AX */ + {{ OP_R | OP_W, REG_WORD_OFFSET }, {0}}; /* aad */ + +static op_implicit_list_t list_call[] = + /* E8, FF, 9A, FF : CALL : rw ESP, rw EIP */ + /* C2, C3, CA, CB : RET : rw ESP, rw EIP */ + {{ OP_R | OP_W, REG_EIP_INDEX }, + { OP_R | OP_W, REG_ESP_INDEX }, {0}}; /* call, ret */ + +static op_implicit_list_t list_cbw[] = + /* 98 : CBW : r AL, rw AX */ + {{ OP_R | OP_W, REG_WORD_OFFSET }, + { OP_R, REG_BYTE_OFFSET}, {0}}; /* cbw */ + +static op_implicit_list_t list_cwde[] = + /* 98 : CWDE : r AX, rw EAX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, + { OP_R, REG_WORD_OFFSET }, {0}}; /* cwde */ + +static op_implicit_list_t list_clts[] = + /* 0F 06 : CLTS : rw CR0 */ + {{ OP_R | OP_W, REG_CTRL_OFFSET}, {0}}; /* clts */ + +static op_implicit_list_t list_cmpxchg[] = + /* 0F B0 : CMPXCHG : rw AL */ + {{ OP_R | OP_W, REG_BYTE_OFFSET }, {0}}; /* cmpxchg */ + +static op_implicit_list_t list_cmpxchgb[] = + /* 0F B1 : CMPXCHG : rw EAX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, {0}}; /* cmpxchg */ + +static op_implicit_list_t list_cmpxchg8b[] = + /* 0F C7 : CMPXCHG8B : rw EDX, rw EAX, r ECX, r EBX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, + { OP_R | OP_W, REG_DWORD_OFFSET + 2 }, + { OP_R, REG_DWORD_OFFSET + 1 }, + { OP_R, REG_DWORD_OFFSET + 3 }, {0}}; /* cmpxchg8b */ + +static op_implicit_list_t list_cpuid[] = + /* 0F A2 : CPUID : rw EAX, w EBX, w ECX, w EDX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, + { OP_W, REG_DWORD_OFFSET + 1 }, + { OP_W, REG_DWORD_OFFSET + 2 }, + { OP_W, REG_DWORD_OFFSET + 3 }, {0}}; /* cpuid */ + +static op_implicit_list_t list_cwd[] = + /* 99 : CWD/CWQ : rw EAX, w EDX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, + { OP_W, REG_DWORD_OFFSET + 2 }, {0}}; /* cwd */ + +static op_implicit_list_t list_daa[] = + /* 27 : DAA : rw AL */ + /* 2F : DAS : rw AL */ + {{ OP_R | OP_W, REG_BYTE_OFFSET }, {0}}; /* daa */ + +static op_implicit_list_t list_idiv[] = + /* F6 : DIV, IDIV : r AX, w AL, w AH */ + /* FIXED: first op was EAX, not Aw. TODO: verify! */ + {{ OP_R, REG_WORD_OFFSET }, + { OP_W, REG_BYTE_OFFSET }, + { OP_W, REG_BYTE_OFFSET + 4 }, {0}}; /* div */ + +static op_implicit_list_t list_div[] = + /* F7 : DIV, IDIV : rw EDX, rw EAX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET + 2 }, + { OP_R | OP_W, REG_DWORD_OFFSET }, {0}}; /* div */ + +static op_implicit_list_t list_enter[] = + /* C8 : ENTER : rw ESP w EBP */ + {{ OP_R | OP_W, REG_DWORD_OFFSET + 4 }, + { OP_R, REG_DWORD_OFFSET + 5 }, {0}}; /* enter */ + +static op_implicit_list_t list_f2xm1[] = + /* D9 F0 : F2XM1 : rw ST(0) */ + /* D9 E1 : FABS : rw ST(0) */ + /* D9 E0 : FCHS : rw ST(0) */ + /* D9 FF : FCOS : rw ST(0)*/ + /* D8, DA : FDIV : rw ST(0) */ + /* D8, DA : FDIVR : rw ST(0) */ + /* D9 F2 : FPTAN : rw ST(0) */ + /* D9 FC : FRNDINT : rw ST(0) */ + /* D9 FB : FSINCOS : rw ST(0) */ + /* D9 FE : FSIN : rw ST(0) */ + /* D9 FA : FSQRT : rw ST(0) */ + /* D9 F4 : FXTRACT : rw ST(0) */ + {{ OP_R | OP_W, REG_FPU_OFFSET }, {0}}; /* f2xm1 */ + +static op_implicit_list_t list_fcom[] = + /* D8, DC, DE D9 : FCOM : r ST(0) */ + /* DE, DA : FICOM : r ST(0) */ + /* DF, D8 : FIST : r ST(0) */ + /* D9 E4 : FTST : r ST(0) */ + /* D9 E5 : FXAM : r ST(0) */ + {{ OP_R, REG_FPU_OFFSET }, {0}}; /* fcom */ + +static op_implicit_list_t list_fpatan[] = + /* D9 F3 : FPATAN : r ST(0), rw ST(1) */ + {{ OP_R, REG_FPU_OFFSET }, {0}}; /* fpatan */ + +static op_implicit_list_t list_fprem[] = + /* D9 F8, D9 F5 : FPREM : rw ST(0) r ST(1) */ + /* D9 FD : FSCALE : rw ST(0), r ST(1) */ + {{ OP_R | OP_W, REG_FPU_OFFSET }, + { OP_R, REG_FPU_OFFSET + 1 }, {0}}; /* fprem */ + +static op_implicit_list_t list_faddp[] = + /* DE C1 : FADDP : r ST(0), rw ST(1) */ + /* DE E9 : FSUBP : r ST(0), rw ST(1) */ + /* D9 F1 : FYL2X : r ST(0), rw ST(1) */ + /* D9 F9 : FYL2XP1 : r ST(0), rw ST(1) */ + {{ OP_R, REG_FPU_OFFSET }, + { OP_R | OP_W, REG_FPU_OFFSET + 1 }, {0}}; /* faddp */ + +static op_implicit_list_t list_fucompp[] = + /* DA E9 : FUCOMPP : r ST(0), r ST(1) */ + {{ OP_R, REG_FPU_OFFSET }, + { OP_R, REG_FPU_OFFSET + 1 }, {0}}; /* fucompp */ + +static op_implicit_list_t list_imul[] = + /* F6 : IMUL : r AL, w AX */ + /* F6 : MUL : r AL, w AX */ + {{ OP_R, REG_BYTE_OFFSET }, + { OP_W, REG_WORD_OFFSET }, {0}}; /* imul */ + +static op_implicit_list_t list_mul[] = + /* F7 : IMUL : rw EAX, w EDX */ + /* F7 : MUL : rw EAX, w EDX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, + { OP_W, REG_DWORD_OFFSET + 2 }, {0}}; /* imul */ + +static op_implicit_list_t list_lahf[] = + /* 9F : LAHF : r EFLAGS, w AH */ + {{ OP_R, REG_FLAGS_INDEX }, + { OP_W, REG_BYTE_OFFSET + 4 }, {0}}; /* lahf */ + +static op_implicit_list_t list_ldmxcsr[] = + /* 0F AE : LDMXCSR : w MXCSR SSE Control Status Reg */ + {{ OP_W, REG_MXCSG_INDEX }, {0}}; /* ldmxcsr */ + +static op_implicit_list_t list_leave[] = + /* C9 : LEAVE : rw ESP, w EBP */ + {{ OP_R | OP_W, REG_ESP_INDEX }, + { OP_W, REG_DWORD_OFFSET + 5 }, {0}}; /* leave */ + +static op_implicit_list_t list_lgdt[] = + /* 0F 01 : LGDT : w GDTR */ + {{ OP_W, REG_GDTR_INDEX }, {0}}; /* lgdt */ + +static op_implicit_list_t list_lidt[] = + /* 0F 01 : LIDT : w IDTR */ + {{ OP_W, REG_IDTR_INDEX }, {0}}; /* lidt */ + +static op_implicit_list_t list_lldt[] = + /* 0F 00 : LLDT : w LDTR */ + {{ OP_W, REG_LDTR_INDEX }, {0}}; /* lldt */ + +static op_implicit_list_t list_lmsw[] = + /* 0F 01 : LMSW : w CR0 */ + {{ OP_W, REG_CTRL_OFFSET }, {0}}; /* lmsw */ + +static op_implicit_list_t list_loop[] = + /* E0, E1, E2 : LOOP : rw ECX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET + 1 }, {0}};/* loop */ + +static op_implicit_list_t list_ltr[] = + /* 0F 00 : LTR : w Task Register */ + {{ OP_W, REG_TR_INDEX }, {0}}; /* ltr */ + +static op_implicit_list_t list_pop[] = + /* 8F, 58, 1F, 07, 17, 0F A1, 0F A9 : POP : rw ESP */ + /* FF, 50, 6A, 68, 0E, 16, 1E, 06, 0F A0, 0F A8 : PUSH : rw ESP */ + {{ OP_R | OP_W, REG_ESP_INDEX }, {0}}; /* pop, push */ + +static op_implicit_list_t list_popad[] = + /* 61 : POPAD : rw esp, w edi esi ebp ebx edx ecx eax */ + {{ OP_R | OP_W, REG_ESP_INDEX }, + { OP_W, REG_DWORD_OFFSET + 7 }, + { OP_W, REG_DWORD_OFFSET + 6 }, + { OP_W, REG_DWORD_OFFSET + 5 }, + { OP_W, REG_DWORD_OFFSET + 3 }, + { OP_W, REG_DWORD_OFFSET + 2 }, + { OP_W, REG_DWORD_OFFSET + 1 }, + { OP_W, REG_DWORD_OFFSET }, {0}}; /* popad */ + +static op_implicit_list_t list_popfd[] = + /* 9D : POPFD : rw esp, w eflags */ + {{ OP_R | OP_W, REG_ESP_INDEX }, + { OP_W, REG_FLAGS_INDEX }, {0}}; /* popfd */ + +static op_implicit_list_t list_pushad[] = + /* FF, 50, 6A, 68, 0E, 16, 1E, 06, 0F A0, 0F A8 : PUSH : rw ESP */ + /* 60 : PUSHAD : rw esp, r eax ecx edx ebx esp ebp esi edi */ + {{ OP_R | OP_W, REG_ESP_INDEX }, + { OP_R, REG_DWORD_OFFSET }, + { OP_R, REG_DWORD_OFFSET + 1 }, + { OP_R, REG_DWORD_OFFSET + 2 }, + { OP_R, REG_DWORD_OFFSET + 3 }, + { OP_R, REG_DWORD_OFFSET + 5 }, + { OP_R, REG_DWORD_OFFSET + 6 }, + { OP_R, REG_DWORD_OFFSET + 7 }, {0}}; /* pushad */ + +static op_implicit_list_t list_pushfd[] = + /* 9C : PUSHFD : rw esp, r eflags */ + {{ OP_R | OP_W, REG_ESP_INDEX }, + { OP_R, REG_FLAGS_INDEX }, {0}}; /* pushfd */ + +static op_implicit_list_t list_rdmsr[] = + /* 0F 32 : RDMSR : r ECX, w EDX, w EAX */ + {{ OP_R, REG_DWORD_OFFSET + 1 }, + { OP_W, REG_DWORD_OFFSET + 2 }, + { OP_W, REG_DWORD_OFFSET }, {0}}; /* rdmsr */ + +static op_implicit_list_t list_rdpmc[] = + /* 0F 33 : RDPMC : r ECX, w EDX, w EAX */ + {{ OP_R, REG_DWORD_OFFSET + 1 }, + { OP_W, REG_DWORD_OFFSET + 2 }, + { OP_W, REG_DWORD_OFFSET }, {0}}; /* rdpmc */ + +static op_implicit_list_t list_rdtsc[] = + /* 0F 31 : RDTSC : rw EDX, rw EAX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET + 2 }, + { OP_R | OP_W, REG_DWORD_OFFSET }, {0}}; /* rdtsc */ + +static op_implicit_list_t list_rep[] = + /* F3, F2 ... : REP : rw ECX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET + 1 }, {0}};/* rep */ + +static op_implicit_list_t list_rsm[] = + /* 0F AA : RSM : r CR4, r CR0 */ + {{ OP_R, REG_CTRL_OFFSET + 4 }, + { OP_R, REG_CTRL_OFFSET }, {0}}; /* rsm */ + +static op_implicit_list_t list_sahf[] = + /* 9E : SAHF : r ah, rw eflags (set SF ZF AF PF CF) */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sahf */ + +static op_implicit_list_t list_sgdt[] = + /* 0F : SGDT : r gdtr */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sgdt */ + +static op_implicit_list_t list_sidt[] = + /* 0F : SIDT : r idtr */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sidt */ + +static op_implicit_list_t list_sldt[] = + /* 0F : SLDT : r ldtr */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sldt */ + +static op_implicit_list_t list_smsw[] = + /* 0F : SMSW : r CR0 */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* smsw */ + +static op_implicit_list_t list_stmxcsr[] = + /* 0F AE : STMXCSR : r MXCSR */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* stmxcsr */ + +static op_implicit_list_t list_str[] = + /* 0F 00 : STR : r TR (task register) */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* str */ + +static op_implicit_list_t list_sysenter[] = + /* 0F 34 : SYSENTER : w cs, w eip, w ss, w esp, r CR0, w eflags + * r sysenter_cs_msr, sysenter_esp_msr, sysenter_eip_msr */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sysenter */ + +static op_implicit_list_t list_sysexit[] = + /* 0F 35 : SYSEXIT : r edx, r ecx, w cs, w eip, w ss, w esp + * r sysenter_cs_msr */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sysexit */ + +static op_implicit_list_t list_wrmsr[] = + /* 0F 30 : WRMST : r edx, r eax, r ecx */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* wrmsr */ + +static op_implicit_list_t list_xlat[] = + /* D7 : XLAT : rw al r ebx (ptr) */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* xlat */ +/* TODO: + * monitor 0f 01 c8 eax OP_R ecx OP_R edx OP_R + * mwait 0f 01 c9 eax OP_R ecx OP_R + */ +static op_implicit_list_t list_monitor[] = + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* monitor */ +static op_implicit_list_t list_mwait[] = + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* mwait */ + +op_implicit_list_t *op_implicit_list[] = { + /* This is a list of implicit operands which are read/written by + * various x86 instructions. Note that modifications to the stack + * register are mentioned here, but that additional information on + * the effect an instruction has on the stack is contained in the + * x86_insn_t 'stack_mod' and 'stack_mod_val' fields. Use of the + * eflags register, i.e. setting, clearing, and testing flags, is + * not recorded here but rather in the flags_set and flags_tested + * fields of the x86_insn_t.*/ + NULL, + list_aaa, list_aad, list_call, list_cbw, /* 1 - 4 */ + list_cwde, list_clts, list_cmpxchg, list_cmpxchgb, /* 5 - 8 */ + list_cmpxchg8b, list_cpuid, list_cwd, list_daa, /* 9 - 12 */ + list_idiv, list_div, list_enter, list_f2xm1, /* 13 - 16 */ + list_fcom, list_fpatan, list_fprem, list_faddp, /* 17 - 20 */ + list_fucompp, list_imul, list_mul, list_lahf, /* 21 - 24 */ + list_ldmxcsr, list_leave, list_lgdt, list_lidt, /* 25 - 28 */ + list_lldt, list_lmsw, list_loop, list_ltr, /* 29 - 32 */ + list_pop, list_popad, list_popfd, list_pushad, /* 33 - 36 */ + list_pushfd, list_rdmsr, list_rdpmc, list_rdtsc, /* 37 - 40 */ + /* NOTE: 'REP' is a hack since it is a prefix: if its position + * in the table changes, then change IDX_IMPLICIT_REP in the .h */ + list_rep, list_rsm, list_sahf, list_sgdt, /* 41 - 44 */ + list_sidt, list_sldt, list_smsw, list_stmxcsr, /* 45 - 48 */ + list_str, list_sysenter, list_sysexit, list_wrmsr, /* 49 - 52 */ + list_xlat, list_monitor, list_mwait, /* 53 - 55*/ + NULL /* end of list */ + }; + +#define LAST_IMPL_IDX 55 + +static void handle_impl_reg( x86_op_t *op, uint32_t val ) { + x86_reg_t *reg = &op->data.reg; + op->type = op_register; + ia32_handle_register( reg, (unsigned int) val ); + switch (reg->size) { + case 1: + op->datatype = op_byte; break; + case 2: + op->datatype = op_word; break; + case 4: + op->datatype = op_dword; break; + case 8: + op->datatype = op_qword; break; + case 10: + op->datatype = op_extreal; break; + case 16: + op->datatype = op_dqword; break; + } + return; +} + +/* 'impl_idx' is the value from the opcode table: between 1 and LAST_IMPL_IDX */ +/* returns number of operands added */ +unsigned int ia32_insn_implicit_ops( x86_insn_t *insn, unsigned int impl_idx ) { + op_implicit_list_t *list; + x86_op_t *op; + unsigned int num = 0; + + if (! impl_idx || impl_idx > LAST_IMPL_IDX ) { + return 0; + } + + for ( list = op_implicit_list[impl_idx]; list->type; list++, num++ ) { + enum x86_op_access access = (enum x86_op_access) OP_PERM(list->type); + enum x86_op_flags flags = (enum x86_op_flags) (OP_FLAGS(list->type) >> 12); + + op = NULL; + /* In some cases (MUL), EAX is an implicit operand hardcoded in + * the instruction without being explicitly listed in assembly. + * For this situation, find the hardcoded operand and add the + * implied flag rather than adding a new implicit operand. */ + x86_oplist_t * existing; + if (ia32_true_register_id(list->operand) == REG_DWORD_OFFSET) { + for ( existing = insn->operands; existing; existing = existing->next ) { + if (existing->op.type == op_register && + existing->op.data.reg.id == list->operand) { + op = &existing->op; + break; + } + } + } + if (!op) { + op = x86_operand_new( insn ); + /* all implicit operands are registers */ + handle_impl_reg( op, list->operand ); + /* decrement the 'explicit count' incremented by default in + * x86_operand_new */ + insn->explicit_count = insn->explicit_count -1; + } + if (!op) { + return num; /* gah! return early */ + } + op->access |= access; + op->flags |= flags; + op->flags |= op_implied; + } + + return num; +} diff --git a/src/third_party/libdisasm/ia32_implicit.h b/src/third_party/libdisasm/ia32_implicit.h new file mode 100644 index 0000000..0002b28 --- /dev/null +++ b/src/third_party/libdisasm/ia32_implicit.h @@ -0,0 +1,13 @@ +#ifndef IA32_IMPLICIT_H +#define IA32_IMPLICIT_H + +#include "libdis.h" + +/* OK, this is a hack to deal with prefixes having implicit operands... + * thought I had removed all the old hackishness ;( */ + +#define IDX_IMPLICIT_REP 41 /* change this if the table changes! */ + +unsigned int ia32_insn_implicit_ops( x86_insn_t *insn, unsigned int impl_idx ); + +#endif diff --git a/src/third_party/libdisasm/ia32_insn.c b/src/third_party/libdisasm/ia32_insn.c new file mode 100644 index 0000000..cc27760 --- /dev/null +++ b/src/third_party/libdisasm/ia32_insn.c @@ -0,0 +1,623 @@ +#include +#include +#include +#include "qword.h" + +#include "ia32_insn.h" +#include "ia32_opcode_tables.h" + +#include "ia32_reg.h" +#include "ia32_operand.h" +#include "ia32_implicit.h" +#include "ia32_settings.h" + +#include "libdis.h" + +extern ia32_table_desc_t ia32_tables[]; +extern ia32_settings_t ia32_settings; + +#define IS_SP( op ) (op->type == op_register && \ + (op->data.reg.id == REG_ESP_INDEX || \ + op->data.reg.alias == REG_ESP_INDEX) ) +#define IS_IMM( op ) (op->type == op_immediate ) + +#ifdef WIN32 +# define INLINE +#else +# define INLINE inline +#endif + +/* for calculating stack modification based on an operand */ +static INLINE int32_t long_from_operand( x86_op_t *op ) { + + if (! IS_IMM(op) ) { + return 0L; + } + + switch ( op->datatype ) { + case op_byte: + return (int32_t) op->data.sbyte; + case op_word: + return (int32_t) op->data.sword; + case op_qword: + return (int32_t) op->data.sqword; + case op_dword: + return op->data.sdword; + default: + /* these are not used in stack insn */ + break; + } + + return 0L; +} + + +/* determine what this insn does to the stack */ +static void ia32_stack_mod(x86_insn_t *insn) { + x86_op_t *dest, *src = NULL; + + if (! insn || ! insn->operands ) { + return; + } + + dest = &insn->operands->op; + if ( dest ) { + src = &insn->operands->next->op; + } + + insn->stack_mod = 0; + insn->stack_mod_val = 0; + + switch ( insn->type ) { + case insn_call: + case insn_callcc: + insn->stack_mod = 1; + insn->stack_mod_val = insn->addr_size * -1; + break; + case insn_push: + insn->stack_mod = 1; + insn->stack_mod_val = insn->addr_size * -1; + break; + case insn_return: + insn->stack_mod = 1; + insn->stack_mod_val = insn->addr_size; + case insn_int: case insn_intcc: + case insn_iret: + break; + case insn_pop: + insn->stack_mod = 1; + if (! IS_SP( dest ) ) { + insn->stack_mod_val = insn->op_size; + } /* else we don't know the stack change in a pop esp */ + break; + case insn_enter: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_leave: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_pushregs: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_popregs: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_pushflags: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_popflags: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_add: + if ( IS_SP( dest ) ) { + insn->stack_mod = 1; + insn->stack_mod_val = long_from_operand( src ); + } + break; + case insn_sub: + if ( IS_SP( dest ) ) { + insn->stack_mod = 1; + insn->stack_mod_val = long_from_operand( src ); + insn->stack_mod_val *= -1; + } + break; + case insn_inc: + if ( IS_SP( dest ) ) { + insn->stack_mod = 1; + insn->stack_mod_val = 1; + } + break; + case insn_dec: + if ( IS_SP( dest ) ) { + insn->stack_mod = 1; + insn->stack_mod_val = 1; + } + break; + case insn_mov: case insn_movcc: + case insn_xchg: case insn_xchgcc: + case insn_mul: case insn_div: + case insn_shl: case insn_shr: + case insn_rol: case insn_ror: + case insn_and: case insn_or: + case insn_not: case insn_neg: + case insn_xor: + if ( IS_SP( dest ) ) { + insn->stack_mod = 1; + } + break; + default: + break; + } + if (! strcmp("enter", insn->mnemonic) ) { + insn->stack_mod = 1; + } else if (! strcmp("leave", insn->mnemonic) ) { + insn->stack_mod = 1; + } + + /* for mov, etc we return 0 -- unknown stack mod */ + + return; +} + +/* get the cpu details for this insn from cpu flags int */ +static void ia32_handle_cpu( x86_insn_t *insn, unsigned int cpu ) { + insn->cpu = (enum x86_insn_cpu) CPU_MODEL(cpu); + insn->isa = (enum x86_insn_isa) (ISA_SUBSET(cpu)) >> 16; + return; +} + +/* handle mnemonic type and group */ +static void ia32_handle_mnemtype(x86_insn_t *insn, unsigned int mnemtype) { + unsigned int type = mnemtype & ~INS_FLAG_MASK; + insn->group = (enum x86_insn_group) (INS_GROUP(type)) >> 12; + insn->type = (enum x86_insn_type) INS_TYPE(type); + + return; +} + +static void ia32_handle_notes(x86_insn_t *insn, unsigned int notes) { + insn->note = (enum x86_insn_note) notes; + return; +} + +static void ia32_handle_eflags( x86_insn_t *insn, unsigned int eflags) { + unsigned int flags; + + /* handle flags effected */ + flags = INS_FLAGS_TEST(eflags); + /* handle weird OR cases */ + /* these are either JLE (ZF | SF<>OF) or JBE (CF | ZF) */ + if (flags & INS_TEST_OR) { + flags &= ~INS_TEST_OR; + if ( flags & INS_TEST_ZERO ) { + flags &= ~INS_TEST_ZERO; + if ( flags & INS_TEST_CARRY ) { + flags &= ~INS_TEST_CARRY ; + flags |= (int)insn_carry_or_zero_set; + } else if ( flags & INS_TEST_SFNEOF ) { + flags &= ~INS_TEST_SFNEOF; + flags |= (int)insn_zero_set_or_sign_ne_oflow; + } + } + } + insn->flags_tested = (enum x86_flag_status) flags; + + insn->flags_set = (enum x86_flag_status) INS_FLAGS_SET(eflags) >> 16; + + return; +} + +static void ia32_handle_prefix( x86_insn_t *insn, unsigned int prefixes ) { + + insn->prefix = (enum x86_insn_prefix) prefixes & PREFIX_MASK; // >> 20; + if (! (insn->prefix & PREFIX_PRINT_MASK) ) { + /* no printable prefixes */ + insn->prefix = insn_no_prefix; + } + + /* concat all prefix strings */ + if ( (unsigned int)insn->prefix & PREFIX_LOCK ) { + strncat(insn->prefix_string, "lock ", 32 - + strlen(insn->prefix_string)); + } + + if ( (unsigned int)insn->prefix & PREFIX_REPNZ ) { + strncat(insn->prefix_string, "repnz ", 32 - + strlen(insn->prefix_string)); + } else if ( (unsigned int)insn->prefix & PREFIX_REPZ ) { + strncat(insn->prefix_string, "repz ", 32 - + strlen(insn->prefix_string)); + } + + return; +} + + +static void reg_32_to_16( x86_op_t *op, x86_insn_t *insn, void *arg ) { + + /* if this is a 32-bit register and it is a general register ... */ + if ( op->type == op_register && op->data.reg.size == 4 && + (op->data.reg.type & reg_gen) ) { + /* WORD registers are 8 indices off from DWORD registers */ + ia32_handle_register( &(op->data.reg), + op->data.reg.id + 8 ); + } +} + +static void handle_insn_metadata( x86_insn_t *insn, ia32_insn_t *raw_insn ) { + ia32_handle_mnemtype( insn, raw_insn->mnem_flag ); + ia32_handle_notes( insn, raw_insn->notes ); + ia32_handle_eflags( insn, raw_insn->flags_effected ); + ia32_handle_cpu( insn, raw_insn->cpu ); + ia32_stack_mod( insn ); +} + +static size_t ia32_decode_insn( unsigned char *buf, size_t buf_len, + ia32_insn_t *raw_insn, x86_insn_t *insn, + unsigned int prefixes ) { + size_t size, op_size; + unsigned char modrm; + + /* this should never happen, but just in case... */ + if ( raw_insn->mnem_flag == INS_INVALID ) { + return 0; + } + + if (ia32_settings.options & opt_16_bit) { + insn->op_size = ( prefixes & PREFIX_OP_SIZE ) ? 4 : 2; + insn->addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 4 : 2; + } else { + insn->op_size = ( prefixes & PREFIX_OP_SIZE ) ? 2 : 4; + insn->addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 2 : 4; + } + + + /* ++++ 1. Copy mnemonic and mnemonic-flags to CODE struct */ + if ((ia32_settings.options & opt_att_mnemonics) && raw_insn->mnemonic_att[0]) { + strncpy( insn->mnemonic, raw_insn->mnemonic_att, 16 ); + } + else { + strncpy( insn->mnemonic, raw_insn->mnemonic, 16 ); + } + ia32_handle_prefix( insn, prefixes ); + + handle_insn_metadata( insn, raw_insn ); + + /* prefetch the next byte in case it is a modr/m byte -- saves + * worrying about whether the 'mod/rm' operand or the 'reg' operand + * occurs first */ + modrm = GET_BYTE( buf, buf_len ); + + /* ++++ 2. Decode Explicit Operands */ + /* Intel uses up to 3 explicit operands in its instructions; + * the first is 'dest', the second is 'src', and the third + * is an additional source value (usually an immediate value, + * e.g. in the MUL instructions). These three explicit operands + * are encoded in the opcode tables, even if they are not used + * by the instruction. Additional implicit operands are stored + * in a supplemental table and are handled later. */ + + op_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->dest, + raw_insn->dest_flag, prefixes, modrm ); + /* advance buffer, increase size if necessary */ + buf += op_size; + buf_len -= op_size; + size = op_size; + + op_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->src, + raw_insn->src_flag, prefixes, modrm ); + buf += op_size; + buf_len -= op_size; + size += op_size; + + op_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->aux, + raw_insn->aux_flag, prefixes, modrm ); + size += op_size; + + + /* ++++ 3. Decode Implicit Operands */ + /* apply implicit operands */ + ia32_insn_implicit_ops( insn, raw_insn->implicit_ops ); + /* we have one small inelegant hack here, to deal with + * the two prefixes that have implicit operands. If Intel + * adds more, we'll change the algorithm to suit :) */ + if ( (prefixes & PREFIX_REPZ) || (prefixes & PREFIX_REPNZ) ) { + ia32_insn_implicit_ops( insn, IDX_IMPLICIT_REP ); + } + + + /* 16-bit hack: foreach operand, if 32-bit reg, make 16-bit reg */ + if ( insn->op_size == 2 ) { + x86_operand_foreach( insn, reg_32_to_16, NULL, op_any ); + } + + return size; +} + + +/* convenience routine */ +#define USES_MOD_RM(flag) \ + (flag == ADDRMETH_E || flag == ADDRMETH_M || flag == ADDRMETH_Q || \ + flag == ADDRMETH_W || flag == ADDRMETH_R) + +static int uses_modrm_flag( unsigned int flag ) { + unsigned int meth; + if ( flag == ARG_NONE ) { + return 0; + } + meth = (flag & ADDRMETH_MASK); + if ( USES_MOD_RM(meth) ) { + return 1; + } + + return 0; +} + +/* This routine performs the actual byte-by-byte opcode table lookup. + * Originally it was pretty simple: get a byte, adjust it to a proper + * index into the table, then check the table row at that index to + * determine what to do next. But is anything that simple with Intel? + * This is now a huge, convoluted mess, mostly of bitter comments. */ +/* buf: pointer to next byte to read from stream + * buf_len: length of buf + * table: index of table to use for lookups + * raw_insn: output pointer that receives opcode definition + * prefixes: output integer that is encoded with prefixes in insn + * returns : number of bytes consumed from stream during lookup */ +size_t ia32_table_lookup( unsigned char *buf, size_t buf_len, + unsigned int table, ia32_insn_t **raw_insn, + unsigned int *prefixes ) { + unsigned char *next, op = buf[0]; /* byte value -- 'opcode' */ + size_t size = 1, sub_size = 0, next_len; + ia32_table_desc_t *table_desc; + unsigned int subtable, prefix = 0, recurse_table = 0; + + table_desc = &ia32_tables[table]; + + op = GET_BYTE( buf, buf_len ); + + if ( table_desc->type == tbl_fpu && op > table_desc->maxlim) { + /* one of the fucking FPU tables out of the 00-BH range */ + /* OK,. this is a bit of a hack -- the proper way would + * have been to use subtables in the 00-BF FPU opcode tables, + * but that is rather wasteful of space... */ + table_desc = &ia32_tables[table +1]; + } + + /* PERFORM TABLE LOOKUP */ + + /* ModR/M trick: shift extension bits into lowest bits of byte */ + /* Note: non-ModR/M tables have a shift value of 0 */ + op >>= table_desc->shift; + + /* ModR/M trick: mask out high bits to turn extension into an index */ + /* Note: non-ModR/M tables have a mask value of 0xFF */ + op &= table_desc->mask; + + + /* Sparse table trick: check that byte is <= max value */ + /* Note: full (256-entry) tables have a maxlim of 155 */ + if ( op > table_desc->maxlim ) { + /* this is a partial table, truncated at the tail, + and op is out of range! */ + return INVALID_INSN; + } + + /* Sparse table trick: check that byte is >= min value */ + /* Note: full (256-entry) tables have a minlim of 0 */ + if ( table_desc->minlim > op ) { + /* this is a partial table, truncated at the head, + and op is out of range! */ + return INVALID_INSN; + } + /* adjust op to be an offset from table index 0 */ + op -= table_desc->minlim; + + /* Yay! 'op' is now fully adjusted to be an index into 'table' */ + *raw_insn = &(table_desc->table[op]); + //printf("BYTE %X TABLE %d OP %X\n", buf[0], table, op ); + + if ( (*raw_insn)->mnem_flag & INS_FLAG_PREFIX ) { + prefix = (*raw_insn)->mnem_flag & PREFIX_MASK; + } + + + /* handle escape to a multibyte/coproc/extension/etc table */ + /* NOTE: if insn is a prefix and has a subtable, then we + * only recurse if this is the first prefix byte -- + * that is, if *prefixes is 0. + * NOTE also that suffix tables are handled later */ + subtable = (*raw_insn)->table; + + if ( subtable && ia32_tables[subtable].type != tbl_suffix && + (! prefix || ! *prefixes) ) { + + if ( ia32_tables[subtable].type == tbl_ext_ext || + ia32_tables[subtable].type == tbl_fpu_ext ) { + /* opcode extension: reuse current byte in buffer */ + next = buf; + next_len = buf_len; + } else { + /* "normal" opcode: advance to next byte in buffer */ + if ( buf_len > 1 ) { + next = &buf[1]; + next_len = buf_len - 1; + } + else { + // buffer is truncated + return INVALID_INSN; + } + } + /* we encountered a multibyte opcode: recurse using the + * table specified in the opcode definition */ + sub_size = ia32_table_lookup( next, next_len, subtable, + raw_insn, prefixes ); + + /* SSE/prefix hack: if the original opcode def was a + * prefix that specified a subtable, and the subtable + * lookup returned a valid insn, then we have encountered + * an SSE opcode definition; otherwise, we pretend we + * never did the subtable lookup, and deal with the + * prefix normally later */ + if ( prefix && ( sub_size == INVALID_INSN || + INS_TYPE((*raw_insn)->mnem_flag) == INS_INVALID ) ) { + /* this is a prefix, not an SSE insn : + * lookup next byte in main table, + * subsize will be reset during the + * main table lookup */ + recurse_table = 1; + } else { + /* this is either a subtable (two-byte) insn + * or an invalid insn: either way, set prefix + * to NULL and end the opcode lookup */ + prefix = 0; + // short-circuit lookup on invalid insn + if (sub_size == INVALID_INSN) return INVALID_INSN; + } + } else if ( prefix ) { + recurse_table = 1; + } + + /* by default, we assume that we have the opcode definition, + * and there is no need to recurse on the same table, but + * if we do then a prefix was encountered... */ + if ( recurse_table ) { + /* this must have been a prefix: use the same table for + * lookup of the next byte */ + sub_size = ia32_table_lookup( &buf[1], buf_len - 1, table, + raw_insn, prefixes ); + + // short-circuit lookup on invalid insn + if (sub_size == INVALID_INSN) return INVALID_INSN; + + /* a bit of a hack for branch hints */ + if ( prefix & BRANCH_HINT_MASK ) { + if ( INS_GROUP((*raw_insn)->mnem_flag) == INS_EXEC ) { + /* segment override prefixes are invalid for + * all branch instructions, so delete them */ + prefix &= ~PREFIX_REG_MASK; + } else { + prefix &= ~BRANCH_HINT_MASK; + } + } + + /* apply prefix to instruction */ + + /* TODO: implement something enforcing prefix groups */ + (*prefixes) |= prefix; + } + + /* if this lookup was in a ModR/M table, then an opcode byte is + * NOT consumed: subtract accordingly. NOTE that if none of the + * operands used the ModR/M, then we need to consume the byte + * here, but ONLY in the 'top-level' opcode extension table */ + + if ( table_desc->type == tbl_ext_ext ) { + /* extensions-to-extensions never consume a byte */ + --size; + } else if ( (table_desc->type == tbl_extension || + table_desc->type == tbl_fpu || + table_desc->type == tbl_fpu_ext ) && + /* extensions that have an operand encoded in ModR/M + * never consume a byte */ + (uses_modrm_flag((*raw_insn)->dest_flag) || + uses_modrm_flag((*raw_insn)->src_flag) ) ) { + --size; + } + + size += sub_size; + + return size; +} + +static size_t handle_insn_suffix( unsigned char *buf, size_t buf_len, + ia32_insn_t *raw_insn, x86_insn_t * insn ) { + ia32_insn_t *sfx_insn; + size_t size; + unsigned int prefixes = 0; + + size = ia32_table_lookup( buf, buf_len, raw_insn->table, &sfx_insn, + &prefixes ); + if (size == INVALID_INSN || sfx_insn->mnem_flag == INS_INVALID ) { + return 0; + } + + strncpy( insn->mnemonic, sfx_insn->mnemonic, 16 ); + handle_insn_metadata( insn, sfx_insn ); + + return 1; +} + +/* invalid instructions are handled by returning 0 [error] from the + * function, setting the size of the insn to 1 byte, and copying + * the byte at the start of the invalid insn into the x86_insn_t. + * if the caller is saving the x86_insn_t for invalid instructions, + * instead of discarding them, this will maintain a consistent + * address space in the x86_insn_ts */ + +/* this function is called by the controlling disassembler, so its name and + * calling convention cannot be changed */ +/* buf points to the loc of the current opcode (start of the + * instruction) in the instruction stream. The instruction + * stream is assumed to be a buffer of bytes read directly + * from the file for the purpose of disassembly; a mem-mapped + * file is ideal for * this. + * insn points to a code structure to be filled by instr_decode + * returns the size of the decoded instruction in bytes */ +size_t ia32_disasm_addr( unsigned char * buf, size_t buf_len, + x86_insn_t *insn ) { + ia32_insn_t *raw_insn = NULL; + unsigned int prefixes = 0; + size_t size, sfx_size; + + if ( (ia32_settings.options & opt_ignore_nulls) && buf_len > 3 && + !buf[0] && !buf[1] && !buf[2] && !buf[3]) { + /* IF IGNORE_NULLS is set AND + * first 4 bytes in the intruction stream are NULL + * THEN return 0 (END_OF_DISASSEMBLY) */ + /* TODO: set errno */ + MAKE_INVALID( insn, buf ); + return 0; /* 4 00 bytes in a row? This isn't code! */ + } + + /* Perform recursive table lookup starting with main table (0) */ + size = ia32_table_lookup(buf, buf_len, idx_Main, &raw_insn, &prefixes); + if ( size == INVALID_INSN || size > buf_len || raw_insn->mnem_flag == INS_INVALID ) { + MAKE_INVALID( insn, buf ); + /* TODO: set errno */ + return 0; + } + + /* We now have the opcode itself figured out: we can decode + * the rest of the instruction. */ + size += ia32_decode_insn( &buf[size], buf_len - size, raw_insn, insn, + prefixes ); + if ( raw_insn->mnem_flag & INS_FLAG_SUFFIX ) { + /* AMD 3DNow! suffix -- get proper operand type here */ + sfx_size = handle_insn_suffix( &buf[size], buf_len - size, + raw_insn, insn ); + if (! sfx_size ) { + /* TODO: set errno */ + MAKE_INVALID( insn, buf ); + return 0; + } + + size += sfx_size; + } + + if (! size ) { + /* invalid insn */ + MAKE_INVALID( insn, buf ); + return 0; + } + + + insn->size = size; + return size; /* return size of instruction in bytes */ +} diff --git a/src/third_party/libdisasm/ia32_insn.h b/src/third_party/libdisasm/ia32_insn.h new file mode 100644 index 0000000..d3f36c3 --- /dev/null +++ b/src/third_party/libdisasm/ia32_insn.h @@ -0,0 +1,506 @@ +#ifndef IA32_INSN_H +#define IA32_INSN_H +/* this file contains the structure of opcode definitions and the + * constants they use */ + +#include +#include "libdis.h" + + +#define GET_BYTE( buf, buf_len ) buf_len ? *buf : 0 + +#define OP_SIZE_16 1 +#define OP_SIZE_32 2 +#define ADDR_SIZE_16 4 +#define ADDR_SIZE_32 8 + +#define MAX_INSTRUCTION_SIZE 20 + +/* invalid instructions are handled by returning 0 [error] from the + * function, setting the size of the insn to 1 byte, and copying + * the byte at the start of the invalid insn into the x86_insn_t. + * if the caller is saving the x86_insn_t for invalid instructions, + * instead of discarding them, this will maintain a consistent + * address space in the x86_insn_ts */ + +#define INVALID_INSN ((size_t) -1) /* return value for invalid insn */ +#define MAKE_INVALID( i, buf ) \ + strcpy( i->mnemonic, "invalid" ); \ + x86_oplist_free( i ); \ + i->size = 1; \ + i->group = insn_none; \ + i->type = insn_invalid; \ + memcpy( i->bytes, buf, 1 ); + + +size_t ia32_disasm_addr( unsigned char * buf, size_t buf_len, + x86_insn_t *insn); + + +/* --------------------------------------------------------- Table Lookup */ +/* IA32 Instruction defintion for ia32_opcodes.c */ +typedef struct { + unsigned int table; /* escape to this sub-table */ + unsigned int mnem_flag; /* Flags referring to mnemonic */ + unsigned int notes; /* Notes for this instruction */ + unsigned int dest_flag, src_flag, aux_flag; /* and for specific operands */ + unsigned int cpu; /* minimumCPU [AND with clocks?? */ + char mnemonic[16]; /* buffers for building instruction */ + char mnemonic_att[16]; /* at&t style mnemonic name */ + int32_t dest; + int32_t src; + int32_t aux; + unsigned int flags_effected; + unsigned int implicit_ops; /* implicit operands */ +} ia32_insn_t; + + + +/* --------------------------------------------------------- Prefixes */ +/* Prefix Flags */ +/* Prefixes, same order as in the manual */ +/* had to reverse the values of the first three as they were entered into + * libdis.h incorrectly. */ +#define PREFIX_LOCK 0x0004 +#define PREFIX_REPNZ 0x0002 +#define PREFIX_REPZ 0x0001 +#define PREFIX_OP_SIZE 0x0010 +#define PREFIX_ADDR_SIZE 0x0020 +#define PREFIX_CS 0x0100 +#define PREFIX_SS 0x0200 +#define PREFIX_DS 0x0300 +#define PREFIX_ES 0x0400 +#define PREFIX_FS 0x0500 +#define PREFIX_GS 0x0600 +#define PREFIX_TAKEN 0x1000 /* branch taken */ +#define PREFIX_NOTTAKEN 0x2000 /* branch not taken */ +#define PREFIX_REG_MASK 0x0F00 +#define BRANCH_HINT_MASK 0x3000 +#define PREFIX_PRINT_MASK 0x000F /* printable prefixes */ +#define PREFIX_MASK 0xFFFF + +/* ---------------------------------------------------------- CPU Type */ + +#define cpu_8086 0x0001 +#define cpu_80286 0x0002 +#define cpu_80386 0x0003 +#define cpu_80387 0x0004 /* originally these were a co-proc */ +#define cpu_80486 0x0005 +#define cpu_PENTIUM 0x0006 +#define cpu_PENTPRO 0x0007 +#define cpu_PENTIUM2 0x0008 +#define cpu_PENTIUM3 0x0009 +#define cpu_PENTIUM4 0x000A +#define cpu_K6 0x0010 +#define cpu_K7 0x0020 +#define cpu_ATHLON 0x0030 +#define CPU_MODEL_MASK 0xFFFF +#define CPU_MODEL(cpu) (cpu & CPU_MODEL_MASK) +/* intel instruction subsets */ +#define isa_GP 0x10000 /* General Purpose Instructions */ +#define isa_FPU 0x20000 /* FPU instructions */ +#define isa_FPUMGT 0x30000 /* FPU/SIMD Management */ +#define isa_MMX 0x40000 /* MMX */ +#define isa_SSE1 0x50000 /* SSE */ +#define isa_SSE2 0x60000 /* SSE 2 */ +#define isa_SSE3 0x70000 /* SSE 3 */ +#define isa_3DNOW 0x80000 /* AMD 3d Now */ +#define isa_SYS 0x90000 /* System Instructions */ +#define ISA_SUBSET_MASK 0xFFFF0000 +#define ISA_SUBSET(isa) (isa & ISA_SUBSET_MASK) + + +/* ------------------------------------------------------ Operand Decoding */ +#define ARG_NONE 0 + +/* Using a mask allows us to store info such as OP_SIGNED in the + * operand flags field */ +#define OPFLAGS_MASK 0x0000FFFF + +/* Operand Addressing Methods, per intel manual */ +#define ADDRMETH_MASK 0x00FF0000 + +/* note: for instructions with implied operands, use no ADDRMETH */ +#define ADDRMETH_A 0x00010000 +#define ADDRMETH_C 0x00020000 +#define ADDRMETH_D 0x00030000 +#define ADDRMETH_E 0x00040000 +#define ADDRMETH_F 0x00050000 +#define ADDRMETH_G 0x00060000 +#define ADDRMETH_I 0x00070000 +#define ADDRMETH_J 0x00080000 +#define ADDRMETH_M 0x00090000 +#define ADDRMETH_O 0x000A0000 +#define ADDRMETH_P 0x000B0000 +#define ADDRMETH_Q 0x000C0000 +#define ADDRMETH_R 0x000D0000 +#define ADDRMETH_S 0x000E0000 +#define ADDRMETH_T 0x000F0000 +#define ADDRMETH_V 0x00100000 +#define ADDRMETH_W 0x00110000 +#define ADDRMETH_X 0x00120000 +#define ADDRMETH_Y 0x00130000 +#define ADDRMETH_RR 0x00140000 /* gen reg hard-coded in opcode */ +#define ADDRMETH_RS 0x00150000 /* seg reg hard-coded in opcode */ +#define ADDRMETH_RT 0x00160000 /* test reg hard-coded in opcode */ +#define ADDRMETH_RF 0x00170000 /* fpu reg hard-coded in opcode */ +#define ADDRMETH_II 0x00180000 /* immediate hard-coded in opcode */ +#define ADDRMETH_PP 0x00190000 /* mm reg ONLY in modr/m field */ +#define ADDRMETH_VV 0x001A0000 /* xmm reg ONLY in mod/rm field */ + +/* Operand Types, per intel manual */ +#define OPTYPE_MASK 0xFF000000 + +#define OPTYPE_a 0x01000000 /* BOUND: h:h or w:w */ +#define OPTYPE_b 0x02000000 /* byte */ +#define OPTYPE_c 0x03000000 /* byte or word */ +#define OPTYPE_d 0x04000000 /* word */ +#define OPTYPE_dq 0x05000000 /* qword */ +#define OPTYPE_p 0x06000000 /* 16:16 or 16:32 pointer */ +#define OPTYPE_pi 0x07000000 /* dword MMX reg */ +#define OPTYPE_ps 0x08000000 /* 128-bit single fp */ +#define OPTYPE_q 0x09000000 /* dword */ +#define OPTYPE_s 0x0A000000 /* 6-byte descriptor */ +#define OPTYPE_ss 0x0B000000 /* scalar of 128-bit single fp */ +#define OPTYPE_si 0x0C000000 /* word general register */ +#define OPTYPE_v 0x0D000000 /* hword or word */ +#define OPTYPE_w 0x0E000000 /* hword */ +#define OPTYPE_m 0x0F000000 /* to handle LEA */ +#define OPTYPE_none 0xFF000000 /* no valid operand size, INVLPG */ + +/* custom ones for FPU instructions */ +#define OPTYPE_fs 0x10000000 /* pointer to single-real*/ +#define OPTYPE_fd 0x20000000 /* pointer to double real */ +#define OPTYPE_fe 0x30000000 /* pointer to extended real */ +#define OPTYPE_fb 0x40000000 /* pointer to packed BCD */ +#define OPTYPE_fv 0x50000000 /* pointer to FPU env: 14|28-bytes */ +#define OPTYPE_ft 0x60000000 /* pointer to FPU state: 94|108-bytes */ +#define OPTYPE_fx 0x70000000 /* pointer to FPU regs: 512 bites */ +#define OPTYPE_fp 0x80000000 /* general fpu register: dbl ext */ + +/* SSE2 operand types */ +#define OPTYPE_sd 0x90000000 /* scalar of 128-bit double fp */ +#define OPTYPE_pd 0xA0000000 /* 128-bit double fp */ + + + +/* ---------------------------------------------- Opcode Table Descriptions */ +/* the table type describes how to handle byte/size increments before + * and after lookup. Some tables re-use the current byte, others + * consume a byte only if the ModR/M encodes no operands, etc */ +enum ia32_tbl_type_id { + tbl_opcode = 0, /* standard opcode table: no surprises */ + tbl_prefix, /* Prefix Override, e.g. 66/F2/F3 */ + tbl_suffix, /* 3D Now style */ + tbl_extension, /* ModR/M extension: 00-FF -> 00-07 */ + tbl_ext_ext, /* extension of modr/m using R/M field */ + tbl_fpu, /* fpu table: 00-BF -> 00-0F */ + tbl_fpu_ext /* fpu extension : C0-FF -> 00-1F */ + }; + +/* How it works: + * Bytes are 'consumed' if the next table lookup requires that the byte + * pointer be advanced in the instruction stream. 'Does not consume' means + * that, when the lookup function recurses, the same byte it re-used in the + * new table. It also means that size is not decremented, for example when + * a ModR/M byte is used. Note that tbl_extension (ModR/M) instructions that + * do not increase the size of an insn with their operands have a forced + 3 size increase in the lookup algo. Weird, yes, confusing, yes, welcome + * to the Intel ISA. Another note: tbl_prefix is used as an override, so an + * empty insn in a prefix table causes the instruction in the original table + * to be used, rather than an invalid insn being generated. + * tbl_opcode uses current byte and consumes it + * tbl_prefix uses current byte but does not consume it + * tbl_suffix uses and consumes last byte in insn + * tbl_extension uses current byte but does not consume it + * tbl_ext_ext uses current byte but does not consume it + * tbl_fpu uses current byte and consumes it + * tbl_fpu_ext uses current byte but does not consume it + */ + +/* Convenience struct for opcode tables : these will be stored in a + * 'table of tables' so we can use a table index instead of a pointer */ +typedef struct { /* Assembly instruction tables */ + ia32_insn_t *table; /* Pointer to table of instruction encodings */ + enum ia32_tbl_type_id type; + unsigned char shift; /* amount to shift modrm byte */ + unsigned char mask; /* bit mask for look up */ + unsigned char minlim,maxlim; /* limits on min/max entries. */ +} ia32_table_desc_t; + + +/* ---------------------------------------------- 'Cooked' Operand Type Info */ +/* Permissions: */ +#define OP_R 0x001 /* operand is READ */ +#define OP_W 0x002 /* operand is WRITTEN */ +#define OP_RW 0x003 /* (OP_R|OP_W): convenience macro */ +#define OP_X 0x004 /* operand is EXECUTED */ + +#define OP_PERM_MASK 0x0000007 /* perms are NOT mutually exclusive */ +#define OP_PERM( type ) (type & OP_PERM_MASK) + +/* Flags */ +#define OP_SIGNED 0x010 /* operand is signed */ + +#define OP_FLAG_MASK 0x0F0 /* mods are NOT mutually exclusive */ +#define OP_FLAGS( type ) (type & OP_FLAG_MASK) + +#define OP_REG_MASK 0x0000FFFF /* lower WORD is register ID */ +#define OP_REGTBL_MASK 0xFFFF0000 /* higher word is register type [gen/dbg] */ +#define OP_REGID( type ) (type & OP_REG_MASK) +#define OP_REGTYPE( type ) (type & OP_REGTBL_MASK) + +/* ------------------------------------------'Cooked' Instruction Type Info */ +/* high-bit opcode types/insn meta-types */ +#define INS_FLAG_PREFIX 0x10000000 /* insn is a prefix */ +#define INS_FLAG_SUFFIX 0x20000000 /* followed by a suffix byte */ +#define INS_FLAG_MASK 0xFF000000 + +/* insn notes */ +#define INS_NOTE_RING0 0x00000001 /* insn is privileged */ +#define INS_NOTE_SMM 0x00000002 /* Sys Mgt Mode only */ +#define INS_NOTE_SERIAL 0x00000004 /* serializes */ +#define INS_NOTE_NONSWAP 0x00000008 /* insn is not swapped in att format */ // could be separate field? +#define INS_NOTE_NOSUFFIX 0x00000010 /* insn has no size suffix in att format */ // could be separate field? +//#define INS_NOTE_NMI + +#define INS_INVALID 0 + +/* instruction groups */ +#define INS_EXEC 0x1000 +#define INS_ARITH 0x2000 +#define INS_LOGIC 0x3000 +#define INS_STACK 0x4000 +#define INS_COND 0x5000 +#define INS_LOAD 0x6000 +#define INS_ARRAY 0x7000 +#define INS_BIT 0x8000 +#define INS_FLAG 0x9000 +#define INS_FPU 0xA000 +#define INS_TRAPS 0xD000 +#define INS_SYSTEM 0xE000 +#define INS_OTHER 0xF000 + +#define INS_GROUP_MASK 0xF000 +#define INS_GROUP( type ) ( type & INS_GROUP_MASK ) + +/* INS_EXEC group */ +#define INS_BRANCH (INS_EXEC | 0x01) /* Unconditional branch */ +#define INS_BRANCHCC (INS_EXEC | 0x02) /* Conditional branch */ +#define INS_CALL (INS_EXEC | 0x03) /* Jump to subroutine */ +#define INS_CALLCC (INS_EXEC | 0x04) /* Jump to subroutine */ +#define INS_RET (INS_EXEC | 0x05) /* Return from subroutine */ + +/* INS_ARITH group */ +#define INS_ADD (INS_ARITH | 0x01) +#define INS_SUB (INS_ARITH | 0x02) +#define INS_MUL (INS_ARITH | 0x03) +#define INS_DIV (INS_ARITH | 0x04) +#define INS_INC (INS_ARITH | 0x05) /* increment */ +#define INS_DEC (INS_ARITH | 0x06) /* decrement */ +#define INS_SHL (INS_ARITH | 0x07) /* shift right */ +#define INS_SHR (INS_ARITH | 0x08) /* shift left */ +#define INS_ROL (INS_ARITH | 0x09) /* rotate left */ +#define INS_ROR (INS_ARITH | 0x0A) /* rotate right */ +#define INS_MIN (INS_ARITH | 0x0B) /* min func */ +#define INS_MAX (INS_ARITH | 0x0C) /* max func */ +#define INS_AVG (INS_ARITH | 0x0D) /* avg func */ +#define INS_FLR (INS_ARITH | 0x0E) /* floor func */ +#define INS_CEIL (INS_ARITH | 0x0F) /* ceiling func */ + +/* INS_LOGIC group */ +#define INS_AND (INS_LOGIC | 0x01) +#define INS_OR (INS_LOGIC | 0x02) +#define INS_XOR (INS_LOGIC | 0x03) +#define INS_NOT (INS_LOGIC | 0x04) +#define INS_NEG (INS_LOGIC | 0x05) +#define INS_NAND (INS_LOGIC | 0x06) + +/* INS_STACK group */ +#define INS_PUSH (INS_STACK | 0x01) +#define INS_POP (INS_STACK | 0x02) +#define INS_PUSHREGS (INS_STACK | 0x03) /* push register context */ +#define INS_POPREGS (INS_STACK | 0x04) /* pop register context */ +#define INS_PUSHFLAGS (INS_STACK | 0x05) /* push all flags */ +#define INS_POPFLAGS (INS_STACK | 0x06) /* pop all flags */ +#define INS_ENTER (INS_STACK | 0x07) /* enter stack frame */ +#define INS_LEAVE (INS_STACK | 0x08) /* leave stack frame */ + +/* INS_COND group */ +#define INS_TEST (INS_COND | 0x01) +#define INS_CMP (INS_COND | 0x02) + +/* INS_LOAD group */ +#define INS_MOV (INS_LOAD | 0x01) +#define INS_MOVCC (INS_LOAD | 0x02) +#define INS_XCHG (INS_LOAD | 0x03) +#define INS_XCHGCC (INS_LOAD | 0x04) +#define INS_CONV (INS_LOAD | 0x05) /* move and convert type */ + +/* INS_ARRAY group */ +#define INS_STRCMP (INS_ARRAY | 0x01) +#define INS_STRLOAD (INS_ARRAY | 0x02) +#define INS_STRMOV (INS_ARRAY | 0x03) +#define INS_STRSTOR (INS_ARRAY | 0x04) +#define INS_XLAT (INS_ARRAY | 0x05) + +/* INS_BIT group */ +#define INS_BITTEST (INS_BIT | 0x01) +#define INS_BITSET (INS_BIT | 0x02) +#define INS_BITCLR (INS_BIT | 0x03) + +/* INS_FLAG group */ +#define INS_CLEARCF (INS_FLAG | 0x01) /* clear Carry flag */ +#define INS_CLEARZF (INS_FLAG | 0x02) /* clear Zero flag */ +#define INS_CLEAROF (INS_FLAG | 0x03) /* clear Overflow flag */ +#define INS_CLEARDF (INS_FLAG | 0x04) /* clear Direction flag */ +#define INS_CLEARSF (INS_FLAG | 0x05) /* clear Sign flag */ +#define INS_CLEARPF (INS_FLAG | 0x06) /* clear Parity flag */ +#define INS_SETCF (INS_FLAG | 0x07) +#define INS_SETZF (INS_FLAG | 0x08) +#define INS_SETOF (INS_FLAG | 0x09) +#define INS_SETDF (INS_FLAG | 0x0A) +#define INS_SETSF (INS_FLAG | 0x0B) +#define INS_SETPF (INS_FLAG | 0x0C) +#define INS_TOGCF (INS_FLAG | 0x10) /* toggle */ +#define INS_TOGZF (INS_FLAG | 0x20) +#define INS_TOGOF (INS_FLAG | 0x30) +#define INS_TOGDF (INS_FLAG | 0x40) +#define INS_TOGSF (INS_FLAG | 0x50) +#define INS_TOGPF (INS_FLAG | 0x60) + +/* INS_FPU */ +#define INS_FMOV (INS_FPU | 0x1) +#define INS_FMOVCC (INS_FPU | 0x2) +#define INS_FNEG (INS_FPU | 0x3) +#define INS_FABS (INS_FPU | 0x4) +#define INS_FADD (INS_FPU | 0x5) +#define INS_FSUB (INS_FPU | 0x6) +#define INS_FMUL (INS_FPU | 0x7) +#define INS_FDIV (INS_FPU | 0x8) +#define INS_FSQRT (INS_FPU | 0x9) +#define INS_FCMP (INS_FPU | 0xA) +#define INS_FCOS (INS_FPU | 0xC) /* cosine */ +#define INS_FLDPI (INS_FPU | 0xD) /* load pi */ +#define INS_FLDZ (INS_FPU | 0xE) /* load 0 */ +#define INS_FTAN (INS_FPU | 0xF) /* tanget */ +#define INS_FSINE (INS_FPU | 0x10) /* sine */ +#define INS_FSYS (INS_FPU | 0x20) /* misc */ + +/* INS_TRAP */ +#define INS_TRAP (INS_TRAPS | 0x01) /* generate trap */ +#define INS_TRAPCC (INS_TRAPS | 0x02) /* conditional trap gen */ +#define INS_TRET (INS_TRAPS | 0x03) /* return from trap */ +#define INS_BOUNDS (INS_TRAPS | 0x04) /* gen bounds trap */ +#define INS_DEBUG (INS_TRAPS | 0x05) /* gen breakpoint trap */ +#define INS_TRACE (INS_TRAPS | 0x06) /* gen single step trap */ +#define INS_INVALIDOP (INS_TRAPS | 0x07) /* gen invalid insn */ +#define INS_OFLOW (INS_TRAPS | 0x08) /* gen overflow trap */ +#define INS_ICEBP (INS_TRAPS | 0x09) /* ICE breakpoint */ + +/* INS_SYSTEM */ +#define INS_HALT (INS_SYSTEM | 0x01) /* halt machine */ +#define INS_IN (INS_SYSTEM | 0x02) /* input form port */ +#define INS_OUT (INS_SYSTEM | 0x03) /* output to port */ +#define INS_CPUID (INS_SYSTEM | 0x04) /* identify cpu */ + +/* INS_OTHER */ +#define INS_NOP (INS_OTHER | 0x01) +#define INS_BCDCONV (INS_OTHER | 0x02) /* convert to/from BCD */ +#define INS_SZCONV (INS_OTHER | 0x03) /* convert size of operand */ +#define INS_SALC (INS_OTHER | 0x04) /* set %al on carry */ +#define INS_UNKNOWN (INS_OTHER | 0x05) + + +#define INS_TYPE_MASK 0xFFFF +#define INS_TYPE( type ) ( type & INS_TYPE_MASK ) + + /* flags effected by instruction */ +#define INS_TEST_CARRY 0x01 /* carry */ +#define INS_TEST_ZERO 0x02 /* zero/equal */ +#define INS_TEST_OFLOW 0x04 /* overflow */ +#define INS_TEST_DIR 0x08 /* direction */ +#define INS_TEST_SIGN 0x10 /* negative */ +#define INS_TEST_PARITY 0x20 /* parity */ +#define INS_TEST_OR 0x40 /* used in jle */ +#define INS_TEST_NCARRY 0x100 /* ! carry */ +#define INS_TEST_NZERO 0x200 /* ! zero */ +#define INS_TEST_NOFLOW 0x400 /* ! oflow */ +#define INS_TEST_NDIR 0x800 /* ! dir */ +#define INS_TEST_NSIGN 0x100 /* ! sign */ +#define INS_TEST_NPARITY 0x2000 /* ! parity */ +/* SF == OF */ +#define INS_TEST_SFEQOF 0x4000 +/* SF != OF */ +#define INS_TEST_SFNEOF 0x8000 + +#define INS_TEST_ALL INS_TEST_CARRY | INS_TEST_ZERO | \ + INS_TEST_OFLOW | INS_TEST_SIGN | \ + INS_TEST_PARITY + +#define INS_SET_CARRY 0x010000 /* carry */ +#define INS_SET_ZERO 0x020000 /* zero/equal */ +#define INS_SET_OFLOW 0x040000 /* overflow */ +#define INS_SET_DIR 0x080000 /* direction */ +#define INS_SET_SIGN 0x100000 /* negative */ +#define INS_SET_PARITY 0x200000 /* parity */ +#define INS_SET_NCARRY 0x1000000 +#define INS_SET_NZERO 0x2000000 +#define INS_SET_NOFLOW 0x4000000 +#define INS_SET_NDIR 0x8000000 +#define INS_SET_NSIGN 0x10000000 +#define INS_SET_NPARITY 0x20000000 +#define INS_SET_SFEQOF 0x40000000 +#define INS_SET_SFNEOF 0x80000000 + +#define INS_SET_ALL INS_SET_CARRY | INS_SET_ZERO | \ + INS_SET_OFLOW | INS_SET_SIGN | \ + INS_SET_PARITY + +#define INS_TEST_MASK 0x0000FFFF +#define INS_FLAGS_TEST(x) (x & INS_TEST_MASK) +#define INS_SET_MASK 0xFFFF0000 +#define INS_FLAGS_SET(x) (x & INS_SET_MASK) + +#if 0 +/* TODO: actually start using these */ +#define X86_PAIR_NP 1 /* not pairable; execs in U */ +#define X86_PAIR_PU 2 /* pairable in U pipe */ +#define X86_PAIR_PV 3 /* pairable in V pipe */ +#define X86_PAIR_UV 4 /* pairable in UV pipe */ +#define X86_PAIR_FX 5 /* pairable with FXCH */ + +#define X86_EXEC_PORT_0 1 +#define X86_EXEC_PORT_1 2 +#define X86_EXEC_PORT_2 4 +#define X86_EXEC_PORT_3 8 +#define X86_EXEC_PORT_4 16 + +#define X86_EXEC_UNITS + +typedef struct { /* representation of an insn during decoding */ + uint32_t flags; /* runtime settings */ + /* instruction prefixes and other foolishness */ + uint32_t prefix; /* encoding of prefix */ + char prefix_str[16]; /* mnemonics for prefix */ + uint32_t branch_hint; /* gah! */ + unsigned int cpu_ver; /* TODO: cpu version */ + unsigned int clocks; /* TODO: clock cycles: min/max */ + unsigned char last_prefix; + /* runtime intruction decoding helpers */ + unsigned char mode; /* 16, 32, 64 */ + unsigned char gen_regs; /* offset of default general reg set */ + unsigned char sz_operand; /* operand size for insn */ + unsigned char sz_address; /* address size for insn */ + unsigned char uops; /* uops per insn */ + unsigned char pairing; /* np,pu,pv.lv */ + unsigned char exec_unit; + unsigned char exec_port; + unsigned char latency; +} ia32_info_t; +#define MODE_32 0 /* default */ +#define MODE_16 1 +#define MODE_64 2 +#endif + +#endif diff --git a/src/third_party/libdisasm/ia32_invariant.c b/src/third_party/libdisasm/ia32_invariant.c new file mode 100644 index 0000000..68ec153 --- /dev/null +++ b/src/third_party/libdisasm/ia32_invariant.c @@ -0,0 +1,313 @@ +#include +#include + +#include "ia32_invariant.h" +#include "ia32_insn.h" +#include "ia32_settings.h" + +extern ia32_table_desc_t *ia32_tables; +extern ia32_settings_t ia32_settings; + +extern size_t ia32_table_lookup( unsigned char *buf, size_t buf_len, + unsigned int table, ia32_insn_t **raw_insn, + unsigned int *prefixes ); + + +/* -------------------------------- ModR/M, SIB */ +/* Convenience flags */ +#define MODRM_EA 1 /* ModR/M is an effective addr */ +#define MODRM_reg 2 /* ModR/M is a register */ + +/* ModR/M flags */ +#define MODRM_RM_SIB 0x04 /* R/M == 100 */ +#define MODRM_RM_NOREG 0x05 /* R/B == 101 */ +/* if (MODRM.MOD_NODISP && MODRM.RM_NOREG) then just disp32 */ +#define MODRM_MOD_NODISP 0x00 /* mod == 00 */ +#define MODRM_MOD_DISP8 0x01 /* mod == 01 */ +#define MODRM_MOD_DISP32 0x02 /* mod == 10 */ +#define MODRM_MOD_NOEA 0x03 /* mod == 11 */ +/* 16-bit modrm flags */ +#define MOD16_MOD_NODISP 0 +#define MOD16_MOD_DISP8 1 +#define MOD16_MOD_DISP16 2 +#define MOD16_MOD_REG 3 + +#define MOD16_RM_BXSI 0 +#define MOD16_RM_BXDI 1 +#define MOD16_RM_BPSI 2 +#define MOD16_RM_BPDI 3 +#define MOD16_RM_SI 4 +#define MOD16_RM_DI 5 +#define MOD16_RM_BP 6 +#define MOD16_RM_BX 7 + +/* SIB flags */ +#define SIB_INDEX_NONE 0x04 +#define SIB_BASE_EBP 0x05 +#define SIB_SCALE_NOBASE 0x00 + +/* Convenience struct for modR/M bitfield */ +struct modRM_byte { + unsigned int mod : 2; + unsigned int reg : 3; + unsigned int rm : 3; +}; + +/* Convenience struct for SIB bitfield */ +struct SIB_byte { + unsigned int scale : 2; + unsigned int index : 3; + unsigned int base : 3; +}; + +#ifdef WIN32 +static void byte_decode(unsigned char b, struct modRM_byte *modrm) { +#else +static inline void byte_decode(unsigned char b, struct modRM_byte *modrm) { +#endif + /* generic bitfield-packing routine */ + + modrm->mod = b >> 6; /* top 2 bits */ + modrm->reg = (b & 56) >> 3; /* middle 3 bits */ + modrm->rm = b & 7; /* bottom 3 bits */ +} +static int ia32_invariant_modrm( unsigned char *in, unsigned char *out, + unsigned int mode_16, x86_invariant_op_t *op) { + struct modRM_byte modrm; + struct SIB_byte sib; + unsigned char *c, *cin; + unsigned short *s; + unsigned int *i; + int size = 0; /* modrm byte is already counted */ + + + byte_decode(*in, &modrm); /* get bitfields */ + + out[0] = in[0]; /* save modrm byte */ + cin = &in[1]; + c = &out[1]; + s = (unsigned short *)&out[1]; + i = (unsigned int *)&out[1]; + + op->type = op_expression; + op->flags |= op_pointer; + if ( ! mode_16 && modrm.rm == MODRM_RM_SIB && + modrm.mod != MODRM_MOD_NOEA ) { + size ++; + byte_decode(*cin, (struct modRM_byte *)(void*)&sib); + + out[1] = in[1]; /* save sib byte */ + cin = &in[2]; + c = &out[2]; + s = (unsigned short *)&out[2]; + i = (unsigned int *)&out[2]; + + if ( sib.base == SIB_BASE_EBP && ! modrm.mod ) { + /* disp 32 is variant! */ + memset( i, X86_WILDCARD_BYTE, 4 ); + size += 4; + } + } + + if (! modrm.mod && modrm.rm == 101) { + if ( mode_16 ) { /* straight RVA in disp */ + memset( s, X86_WILDCARD_BYTE, 2 ); + size += 2; + } else { + memset( i, X86_WILDCARD_BYTE, 2 ); + size += 4; + } + } else if (modrm.mod && modrm.mod < 3) { + if (modrm.mod == MODRM_MOD_DISP8) { /* offset in disp */ + *c = *cin; + size += 1; + } else if ( mode_16 ) { + *s = (* ((unsigned short *) cin)); + size += 2; + } else { + *i = (*((unsigned int *) cin)); + size += 4; + } + } else if ( modrm.mod == 3 ) { + op->type = op_register; + op->flags &= ~op_pointer; + } + + return (size); +} + + +static int ia32_decode_invariant( unsigned char *buf, size_t buf_len, + ia32_insn_t *t, unsigned char *out, + unsigned int prefixes, x86_invariant_t *inv) { + + unsigned int addr_size, op_size, mode_16; + unsigned int op_flags[3] = { t->dest_flag, t->src_flag, t->aux_flag }; + int x, type, bytes = 0, size = 0, modrm = 0; + + /* set addressing mode */ + if (ia32_settings.options & opt_16_bit) { + op_size = ( prefixes & PREFIX_OP_SIZE ) ? 4 : 2; + addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 4 : 2; + mode_16 = ( prefixes & PREFIX_ADDR_SIZE ) ? 0 : 1; + } else { + op_size = ( prefixes & PREFIX_OP_SIZE ) ? 2 : 4; + addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 2 : 4; + mode_16 = ( prefixes & PREFIX_ADDR_SIZE ) ? 1 : 0; + } + + for (x = 0; x < 3; x++) { + inv->operands[x].access = (enum x86_op_access) + OP_PERM(op_flags[x]); + inv->operands[x].flags = (enum x86_op_flags) + (OP_FLAGS(op_flags[x]) >> 12); + + switch (op_flags[x] & OPTYPE_MASK) { + case OPTYPE_c: + size = (op_size == 4) ? 2 : 1; + break; + case OPTYPE_a: case OPTYPE_v: + size = (op_size == 4) ? 4 : 2; + break; + case OPTYPE_p: + size = (op_size == 4) ? 6 : 4; + break; + case OPTYPE_b: + size = 1; + break; + case OPTYPE_w: + size = 2; + break; + case OPTYPE_d: case OPTYPE_fs: case OPTYPE_fd: + case OPTYPE_fe: case OPTYPE_fb: case OPTYPE_fv: + case OPTYPE_si: case OPTYPE_fx: + size = 4; + break; + case OPTYPE_s: + size = 6; + break; + case OPTYPE_q: case OPTYPE_pi: + size = 8; + break; + case OPTYPE_dq: case OPTYPE_ps: case OPTYPE_ss: + case OPTYPE_pd: case OPTYPE_sd: + size = 16; + break; + case OPTYPE_m: + size = (addr_size == 4) ? 4 : 2; + break; + default: + break; + } + + type = op_flags[x] & ADDRMETH_MASK; + switch (type) { + case ADDRMETH_E: case ADDRMETH_M: case ADDRMETH_Q: + case ADDRMETH_R: case ADDRMETH_W: + modrm = 1; + bytes += ia32_invariant_modrm( buf, out, + mode_16, &inv->operands[x]); + break; + case ADDRMETH_C: case ADDRMETH_D: case ADDRMETH_G: + case ADDRMETH_P: case ADDRMETH_S: case ADDRMETH_T: + case ADDRMETH_V: + inv->operands[x].type = op_register; + modrm = 1; + break; + case ADDRMETH_A: case ADDRMETH_O: + /* pad with xF4's */ + memset( &out[bytes + modrm], X86_WILDCARD_BYTE, + size ); + bytes += size; + inv->operands[x].type = op_offset; + if ( type == ADDRMETH_O ) { + inv->operands[x].flags |= op_signed | + op_pointer; + } + break; + case ADDRMETH_I: case ADDRMETH_J: + /* grab imm value */ + if ((op_flags[x] & OPTYPE_MASK) == OPTYPE_v) { + /* assume this is an address */ + memset( &out[bytes + modrm], + X86_WILDCARD_BYTE, size ); + } else { + memcpy( &out[bytes + modrm], + &buf[bytes + modrm], size ); + } + + bytes += size; + if ( type == ADDRMETH_J ) { + if ( size == 1 ) { + inv->operands[x].type = + op_relative_near; + } else { + inv->operands[x].type = + op_relative_far; + } + inv->operands[x].flags |= op_signed; + } else { + inv->operands[x].type = op_immediate; + } + break; + case ADDRMETH_F: + inv->operands[x].type = op_register; + break; + case ADDRMETH_X: + inv->operands[x].flags |= op_signed | + op_pointer | op_ds_seg | op_string; + break; + case ADDRMETH_Y: + inv->operands[x].flags |= op_signed | + op_pointer | op_es_seg | op_string; + break; + case ADDRMETH_RR: + inv->operands[x].type = op_register; + break; + case ADDRMETH_II: + inv->operands[x].type = op_immediate; + break; + default: + inv->operands[x].type = op_unused; + break; + } + } + + return (bytes + modrm); +} + +size_t ia32_disasm_invariant( unsigned char * buf, size_t buf_len, + x86_invariant_t *inv ) { + ia32_insn_t *raw_insn = NULL; + unsigned int prefixes; + unsigned int type; + size_t size; + + /* Perform recursive table lookup starting with main table (0) */ + size = ia32_table_lookup( buf, buf_len, 0, &raw_insn, &prefixes ); + if ( size == INVALID_INSN || size > buf_len ) { + /* TODO: set errno */ + return 0; + } + + /* copy opcode bytes to buffer */ + memcpy( inv->bytes, buf, size ); + + /* set mnemonic type and group */ + type = raw_insn->mnem_flag & ~INS_FLAG_MASK; + inv->group = (enum x86_insn_group) (INS_GROUP(type)) >> 12; + inv->type = (enum x86_insn_type) INS_TYPE(type); + + /* handle operands */ + size += ia32_decode_invariant( buf + size, buf_len - size, raw_insn, + &buf[size - 1], prefixes, inv ); + + inv->size = size; + + return size; /* return size of instruction in bytes */ +} + +size_t ia32_disasm_size( unsigned char *buf, size_t buf_len ) { + x86_invariant_t inv = { {0} }; + return( ia32_disasm_invariant( buf, buf_len, &inv ) ); +} diff --git a/src/third_party/libdisasm/ia32_invariant.h b/src/third_party/libdisasm/ia32_invariant.h new file mode 100644 index 0000000..e1cea60 --- /dev/null +++ b/src/third_party/libdisasm/ia32_invariant.h @@ -0,0 +1,11 @@ +#ifndef IA32_INVARIANT_H +#define IA32_INVARIANT_H + +#include "libdis.h" + +size_t ia32_disasm_invariant( unsigned char *buf, size_t buf_len, + x86_invariant_t *inv); + +size_t ia32_disasm_size( unsigned char *buf, size_t buf_len ); + +#endif diff --git a/src/third_party/libdisasm/ia32_modrm.c b/src/third_party/libdisasm/ia32_modrm.c new file mode 100644 index 0000000..b0fe2ed --- /dev/null +++ b/src/third_party/libdisasm/ia32_modrm.c @@ -0,0 +1,310 @@ +#include "ia32_modrm.h" +#include "ia32_reg.h" +#include "x86_imm.h" + +/* NOTE: when decoding ModR/M and SIB, we have to add 1 to all register + * values obtained from decoding the ModR/M or SIB byte, since they + * are encoded with eAX = 0 and the tables in ia32_reg.c use eAX = 1. + * ADDENDUM: this is only the case when the register value is used + * directly as an index into the register table, not when it is added to + * a genregs offset. */ + +/* -------------------------------- ModR/M, SIB */ +/* ModR/M flags */ +#define MODRM_RM_SIB 0x04 /* R/M == 100 */ +#define MODRM_RM_NOREG 0x05 /* R/B == 101 */ + +/* if (MODRM.MOD_NODISP && MODRM.RM_NOREG) then just disp32 */ +#define MODRM_MOD_NODISP 0x00 /* mod == 00 */ +#define MODRM_MOD_DISP8 0x01 /* mod == 01 */ +#define MODRM_MOD_DISP32 0x02 /* mod == 10 */ +#define MODRM_MOD_NOEA 0x03 /* mod == 11 */ + +/* 16-bit modrm flags */ +#define MOD16_MOD_NODISP 0 +#define MOD16_MOD_DISP8 1 +#define MOD16_MOD_DISP16 2 +#define MOD16_MOD_REG 3 + +#define MOD16_RM_BXSI 0 +#define MOD16_RM_BXDI 1 +#define MOD16_RM_BPSI 2 +#define MOD16_RM_BPDI 3 +#define MOD16_RM_SI 4 +#define MOD16_RM_DI 5 +#define MOD16_RM_BP 6 +#define MOD16_RM_BX 7 + +/* SIB flags */ +#define SIB_INDEX_NONE 0x04 +#define SIB_BASE_EBP 0x05 +#define SIB_SCALE_NOBASE 0x00 + +/* Convenience struct for modR/M bitfield */ +struct modRM_byte { + unsigned int mod : 2; + unsigned int reg : 3; + unsigned int rm : 3; +}; + +/* Convenience struct for SIB bitfield */ +struct SIB_byte { + unsigned int scale : 2; + unsigned int index : 3; + unsigned int base : 3; +}; + + +#if 0 +int modrm_rm[] = {0,1,2,3,MODRM_RM_SIB,MODRM_MOD_DISP32,6,7}; +int modrm_reg[] = {0, 1, 2, 3, 4, 5, 6, 7}; +int modrm_mod[] = {0, MODRM_MOD_DISP8, MODRM_MOD_DISP32, MODRM_MOD_NOEA}; +int sib_scl[] = {0, 2, 4, 8}; +int sib_idx[] = {0, 1, 2, 3, SIB_INDEX_NONE, 5, 6, 7 }; +int sib_bas[] = {0, 1, 2, 3, 4, SIB_SCALE_NOBASE, 6, 7 }; +#endif + +/* this is needed to replace x86_imm_signsized() which does not sign-extend + * to dest */ +static unsigned int imm32_signsized( unsigned char *buf, size_t buf_len, + int32_t *dest, unsigned int size ) { + if ( size > buf_len ) { + return 0; + } + + switch (size) { + case 1: + *dest = *((signed char *) buf); + break; + case 2: + *dest = *((signed short *) buf); + break; + case 4: + default: + *dest = *((signed int *) buf); + break; + } + + return size; +} + + + +static void byte_decode(unsigned char b, struct modRM_byte *modrm) { + /* generic bitfield-packing routine */ + + modrm->mod = b >> 6; /* top 2 bits */ + modrm->reg = (b & 56) >> 3; /* middle 3 bits */ + modrm->rm = b & 7; /* bottom 3 bits */ +} + + +static size_t sib_decode( unsigned char *buf, size_t buf_len, x86_ea_t *ea, + unsigned int mod ) { + /* set Address Expression fields (scale, index, base, disp) + * according to the contents of the SIB byte. + * b points to the SIB byte in the instruction-stream buffer; the + * byte after b[0] is therefore the byte after the SIB + * returns number of bytes 'used', including the SIB byte */ + size_t size = 1; /* start at 1 for SIB byte */ + struct SIB_byte sib; + + if ( buf_len < 1 ) { + return 0; + } + + byte_decode( *buf, (struct modRM_byte *)(void*)&sib ); /* get bit-fields */ + + if ( sib.base == SIB_BASE_EBP && ! mod ) { /* if base == 101 (ebp) */ + /* IF BASE == EBP, deal with exception */ + /* IF (ModR/M did not create a Disp */ + /* ... create a 32-bit Displacement */ + imm32_signsized( &buf[1], buf_len, &ea->disp, sizeof(int32_t)); + ea->disp_size = sizeof(int32_t); + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + size += 4; /* add sizeof disp to count */ + + } else { + /* ELSE BASE refers to a General Register */ + ia32_handle_register( &ea->base, sib.base + 1 ); + } + + /* set scale to 1, 2, 4, 8 */ + ea->scale = 1 << sib.scale; + + if (sib.index != SIB_INDEX_NONE) { + /* IF INDEX is not 'ESP' (100) */ + ia32_handle_register( &ea->index, sib.index + 1 ); + } + + return (size); /* return number of bytes processed */ +} + +static size_t modrm_decode16( unsigned char *buf, unsigned int buf_len, + x86_op_t *op, struct modRM_byte *modrm ) { + /* 16-bit mode: hackish, but not as hackish as 32-bit mode ;) */ + size_t size = 1; /* # of bytes decoded [1 for modR/M byte] */ + x86_ea_t * ea = &op->data.expression; + + switch( modrm->rm ) { + case MOD16_RM_BXSI: + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 3); + ia32_handle_register(&ea->index, REG_WORD_OFFSET + 6); + break; + case MOD16_RM_BXDI: + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 3); + ia32_handle_register(&ea->index, REG_WORD_OFFSET + 7); + case MOD16_RM_BPSI: + op->flags |= op_ss_seg; + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 5); + ia32_handle_register(&ea->index, REG_WORD_OFFSET + 6); + break; + case MOD16_RM_BPDI: + op->flags |= op_ss_seg; + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 5); + ia32_handle_register(&ea->index, REG_WORD_OFFSET + 7); + break; + case MOD16_RM_SI: + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 6); + break; + case MOD16_RM_DI: + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 7); + break; + case MOD16_RM_BP: + if ( modrm->mod != MOD16_MOD_NODISP ) { + op->flags |= op_ss_seg; + ia32_handle_register(&ea->base, + REG_WORD_OFFSET + 5); + } + break; + case MOD16_RM_BX: + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 3); + break; + } + + /* move to byte after ModR/M */ + ++buf; + --buf_len; + + if ( modrm->mod == MOD16_MOD_DISP8 ) { + imm32_signsized( buf, buf_len, &ea->disp, sizeof(char) ); + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + ea->disp_size = sizeof(char); + size += sizeof(char); + } else if ( modrm->mod == MOD16_MOD_DISP16 ) { + imm32_signsized( buf, buf_len, &ea->disp, sizeof(short) ); + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + ea->disp_size = sizeof(short); + size += sizeof(short); + } + + return size; +} + +/* TODO : Mark index modes + Use addressing mode flags to imply arrays (index), structure (disp), + two-dimensional arrays [disp + index], classes [ea reg], and so on. +*/ +size_t ia32_modrm_decode( unsigned char *buf, unsigned int buf_len, + x86_op_t *op, x86_insn_t *insn, size_t gen_regs ) { + /* create address expression and/or fill operand based on value of + * ModR/M byte. Calls sib_decode as appropriate. + * flags specifies whether Reg or mod+R/M fields are being decoded + * returns the number of bytes in the instruction, including modR/M */ + struct modRM_byte modrm; + size_t size = 1; /* # of bytes decoded [1 for modR/M byte] */ + x86_ea_t * ea; + + + byte_decode(*buf, &modrm); /* get bitfields */ + + /* first, handle the case where the mod field is a register only */ + if ( modrm.mod == MODRM_MOD_NOEA ) { + op->type = op_register; + ia32_handle_register(&op->data.reg, modrm.rm + gen_regs); + /* increase insn size by 1 for modrm byte */ + return 1; + } + + /* then deal with cases where there is an effective address */ + ea = &op->data.expression; + op->type = op_expression; + op->flags |= op_pointer; + + if ( insn->addr_size == 2 ) { + /* gah! 16 bit mode! */ + return modrm_decode16( buf, buf_len, op, &modrm); + } + + /* move to byte after ModR/M */ + ++buf; + --buf_len; + + if (modrm.mod == MODRM_MOD_NODISP) { /* if mod == 00 */ + + /* IF MOD == No displacement, just Indirect Register */ + if (modrm.rm == MODRM_RM_NOREG) { /* if r/m == 101 */ + /* IF RM == No Register, just Displacement */ + /* This is an Intel Moronic Exception TM */ + imm32_signsized( buf, buf_len, &ea->disp, + sizeof(int32_t) ); + ea->disp_size = sizeof(int32_t); + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + size += 4; /* add sizeof disp to count */ + + } else if (modrm.rm == MODRM_RM_SIB) { /* if r/m == 100 */ + /* ELSE IF an SIB byte is present */ + /* TODO: check for 0 retval */ + size += sib_decode( buf, buf_len, ea, modrm.mod); + /* move to byte after SIB for displacement */ + ++buf; + --buf_len; + } else { /* modR/M specifies base register */ + /* ELSE RM encodes a general register */ + ia32_handle_register( &ea->base, modrm.rm + 1 ); + } + } else { /* mod is 01 or 10 */ + if (modrm.rm == MODRM_RM_SIB) { /* rm == 100 */ + /* IF base is an AddrExpr specified by an SIB byte */ + /* TODO: check for 0 retval */ + size += sib_decode( buf, buf_len, ea, modrm.mod); + /* move to byte after SIB for displacement */ + ++buf; + --buf_len; + } else { + /* ELSE base is a general register */ + ia32_handle_register( &ea->base, modrm.rm + 1 ); + } + + /* ELSE mod + r/m specify a disp##[base] or disp##(SIB) */ + if (modrm.mod == MODRM_MOD_DISP8) { /* mod == 01 */ + /* If this is an 8-bit displacement */ + imm32_signsized( buf, buf_len, &ea->disp, + sizeof(char)); + ea->disp_size = sizeof(char); + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + size += 1; /* add sizeof disp to count */ + + } else { + /* Displacement is dependent on address size */ + imm32_signsized( buf, buf_len, &ea->disp, + insn->addr_size); + ea->disp_size = insn->addr_size; + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + size += 4; + } + } + + return size; /* number of bytes found in instruction */ +} + +void ia32_reg_decode( unsigned char byte, x86_op_t *op, size_t gen_regs ) { + struct modRM_byte modrm; + byte_decode( byte, &modrm ); /* get bitfields */ + + /* set operand to register ID */ + op->type = op_register; + ia32_handle_register(&op->data.reg, modrm.reg + gen_regs); + + return; +} diff --git a/src/third_party/libdisasm/ia32_modrm.h b/src/third_party/libdisasm/ia32_modrm.h new file mode 100644 index 0000000..765cb08 --- /dev/null +++ b/src/third_party/libdisasm/ia32_modrm.h @@ -0,0 +1,13 @@ +#ifndef IA32_MODRM_H +#define IA32_MODRM_H + +#include "libdis.h" +#include "ia32_insn.h" + +size_t ia32_modrm_decode( unsigned char *buf, unsigned int buf_len, + x86_op_t *op, x86_insn_t *insn, + size_t gen_regs ); + +void ia32_reg_decode( unsigned char byte, x86_op_t *op, size_t gen_regs ); + +#endif diff --git a/src/third_party/libdisasm/ia32_opcode_tables.c b/src/third_party/libdisasm/ia32_opcode_tables.c new file mode 100644 index 0000000..ef97c7a --- /dev/null +++ b/src/third_party/libdisasm/ia32_opcode_tables.c @@ -0,0 +1,2939 @@ +#include "ia32_insn.h" + +#include "ia32_reg.h" + +#include "ia32_opcode_tables.h" + +static ia32_insn_t tbl_Main[] = { /* One-byte Opcodes */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 0, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RS | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 0, 0, 0, 0 , 33 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 1, 0, 0, 0 , 33 }, + { idx_0F, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, +/* 0x10 */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_ADD, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_ADD, 0, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_ADD, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_ADD, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 2, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RS | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 2, 0, 0, 0 , 33 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_SIGNED | OP_R, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_RR | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_RR | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 3, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RS | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 3, 0, 0, 0 , 33 }, +/* 0x20 */ + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_AND, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_AND, 0, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_AND, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_AND, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_ES, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BCDCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "daa", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_CARRY|INS_SET_PARITY|INS_TEST_CARRY, 12 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_G | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_RR | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_RR | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_CS | PREFIX_NOTTAKEN, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BCDCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "das", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_CARRY|INS_SET_PARITY|INS_TEST_CARRY, 0 }, +/* 0x30 */ + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_SS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BCDCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "aaa", "", 0, 0, 0, INS_SET_CARRY, 1 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_G | OPTYPE_b | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_RR | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_DS | PREFIX_TAKEN, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BCDCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "aas", "", 0, 0, 0, INS_SET_CARRY, 0 }, +/* 0x40 */ + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 1, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 2, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 3, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 4, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 5, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 6, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 7, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 1, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 2, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 3, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 4, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 5, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 6, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 7, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, +/* 0x50 */ + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 0, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 1, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 2, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 3, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 4, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 5, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 6, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 7, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 0, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 1, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 2, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 3, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 4, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 5, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 6, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 7, 0, 0, 0 , 33 }, +/* 0x60 */ + { 0, INS_PUSHREGS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pusha", "", 0, 0, 0, 0 , 36 }, + { 0, INS_POPREGS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "popa", "", 0, 0, 0, 0 , 34 }, + { 0, INS_BOUNDS, INS_NOTE_NONSWAP, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_M | OPTYPE_a | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bound", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_R | OP_W, ADDRMETH_G | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "arpl", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_FS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_GS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_66, INS_FLAG_PREFIX | PREFIX_OP_SIZE, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_ADDR_SIZE, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_PUSH, 0, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 0, 0, 0, 0 , 33 }, + { 0, INS_MUL, 0, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R | OP_W, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, cpu_80386 | isa_GP, "imul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 0, 0, 0, 0 , 33 }, + { 0, INS_MUL, 0, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R | OP_W, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, cpu_80386 | isa_GP, "imul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 0 }, + { 0, INS_IN, 0, ADDRMETH_Y | OPTYPE_b | OP_W, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ins", "", 0, 2, 0, 0 , 0 }, + { 0, INS_IN, 0, ADDRMETH_Y | OPTYPE_v | OP_W, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ins", "", 0, 2, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_RR | OPTYPE_b | OP_R, ADDRMETH_X | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "outs", "", 2, 0, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ADDRMETH_X | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "outs", "", 2, 0, 0, 0 , 0 }, +/* 0x70 */ + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jo", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jno", "", 0, 0, 0, INS_TEST_NOFLOW, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jc", "", 0, 0, 0, INS_TEST_CARRY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jnc", "", 0, 0, 0, INS_TEST_NCARRY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jz", "", 0, 0, 0, INS_TEST_ZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jnz", "", 0, 0, 0, INS_TEST_NZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jbe", "", 0, 0, 0, INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ja", "", 0, 0, 0, INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "js", "", 0, 0, 0, INS_TEST_SIGN, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jns", "", 0, 0, 0, INS_TEST_NSIGN, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jpe", "", 0, 0, 0, INS_TEST_PARITY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jpo", "", 0, 0, 0, INS_TEST_NPARITY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jl", "", 0, 0, 0, INS_TEST_SFNEOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jge", "", 0, 0, 0, INS_TEST_SFEQOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jle", "", 0, 0, 0, INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jg", "", 0, 0, 0, INS_TEST_NZERO|INS_TEST_SFEQOF, 0 }, +/* 0x80 */ + { idx_80, 0, 0, ADDRMETH_E | OPTYPE_b, ADDRMETH_I | OPTYPE_b, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_81, 0, 0, ADDRMETH_E | OPTYPE_v, ADDRMETH_I | OPTYPE_v, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_82, 0, 0, ADDRMETH_E | OPTYPE_b, ADDRMETH_I | OPTYPE_b, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_83, 0, 0, ADDRMETH_E | OPTYPE_v, ADDRMETH_I | OPTYPE_b, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XCHG, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_b | OP_W, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_v | OP_W, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_b | OP_W, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_w | OP_W, ADDRMETH_S | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_m | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lea", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_S | OPTYPE_w | OP_W, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_POP, 0, ADDRMETH_E | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 0, 0, 0, 0 , 33 }, +/* 0x90 */ + { 0, INS_NOP, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "nop", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 1, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 2, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 3, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 4, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 5, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 6, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 7, 0, 0 , 0 }, + { 0, INS_SZCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "cwde", "", 0, 0, 0, 0 , 5 }, + { 0, INS_SZCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "cdq", "", 0, 0, 0, 0 , 11 }, + { 0, INS_CALL, 0, ADDRMETH_A | OPTYPE_p | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "callf", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "wait", "", 0, 0, 0, 0 , 0 }, + { 0, INS_PUSHFLAGS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pushf", "", 0, 0, 0, 0 , 37 }, + { 0, INS_POPFLAGS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "popf", "", 0, 0, 0, 0 , 35 }, + { 0, INS_MOV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sahf", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 43 }, + { 0, INS_MOV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lahf", "", 0, 0, 0, 0 , 24 }, +/* 0xa0 */ + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_O | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_O | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_O | OPTYPE_b | OP_W, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_O | OPTYPE_v | OP_W, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRMOV, 0, ADDRMETH_Y | OPTYPE_b | OP_W, ADDRMETH_X | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movs", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRMOV, 0, ADDRMETH_Y | OPTYPE_v | OP_W, ADDRMETH_X | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movs", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRCMP, 0, ADDRMETH_Y | OPTYPE_b | OP_R, ADDRMETH_X | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRCMP, 0, ADDRMETH_X | OPTYPE_v | OP_R, ADDRMETH_Y | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_TEST, 0, ADDRMETH_RR | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_TEST, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_STRSTOR, 0, ADDRMETH_Y | OPTYPE_b | OP_W, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "stos", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRSTOR, 0, ADDRMETH_Y | OPTYPE_v | OP_W, ADDRMETH_RR | OPTYPE_v |OP_R, ARG_NONE, cpu_80386 | isa_GP, "stos", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRLOAD, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_X| OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lods", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRLOAD, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_X| OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lods", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRCMP, 0, ADDRMETH_RR | OPTYPE_b | OP_R, ADDRMETH_Y | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "scas", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRCMP, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ADDRMETH_Y | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "scas", "", 0, 0, 0, 0 , 0 }, +/* 0xb0 */ + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 1, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 2, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 3, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 4, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 5, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 6, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 7, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 1, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 2, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 3, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 4, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 5, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 6, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 7, 0, 0, 0 , 0 }, +/* 0xc0 */ + { idx_C0, 0, 0, ADDRMETH_E | OPTYPE_b, ADDRMETH_I | OPTYPE_b, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_C1, 0, 0, ADDRMETH_E | OPTYPE_v, ADDRMETH_I | OPTYPE_b, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_RET, 0, ADDRMETH_I | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ret", "", 0, 0, 0, 0 , 3 }, + { 0, INS_RET, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ret", "", 0, 0, 0, 0 , 3 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_R, ARG_NONE, cpu_80386 | isa_GP, "les", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lds", "", 0, 0, 0, 0 , 0 }, + { idx_C6, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_C7, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ENTER, INS_NOTE_NONSWAP, ADDRMETH_I | OPTYPE_w | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "enter", "", 0, 0, 0, 0 , 15 }, + { 0, INS_LEAVE, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "leave", "", 0, 0, 0, 0 , 26 }, + { 0, INS_RET, 0, ADDRMETH_I | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "retf", "lret", 0, 0, 0, 0 , 3 }, + { 0, INS_RET, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "retf", "lret", 0, 0, 0, 0 , 3 }, + { 0, INS_DEBUG, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "int3", "", 0, 0, 0, 0 , 0 }, + { 0, INS_TRAP, 0, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "int", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OFLOW, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "into", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_TRET, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "iret", "", 0, 0, 0, INS_SET_ALL|INS_SET_DIR, 0 }, +/* 0xd0 */ + { idx_D0, 0, 0, ADDRMETH_E | OPTYPE_b, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 1, 0, 0 , 0 }, + { idx_D1, 0, 0, ADDRMETH_E | OPTYPE_v, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 1, 0, 0 , 0 }, + { idx_D2, 0, 0, ADDRMETH_E | OPTYPE_b, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 1, 0, 0 , 0 }, + { idx_D3, 0, 0, ADDRMETH_E | OPTYPE_v, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 1, 0, 0 , 0 }, + { 0, INS_BCDCONV, 0, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "aam", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_BCDCONV, 0, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "aad", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 2 }, + { 0, INS_SALC, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "salc", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XLAT, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "xlat", "", 0, 0, 0, 0 , 53 }, + { idx_D8, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_D9, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DA, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DB, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DC, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DD, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DE, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DF, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, +/* 0xe0 */ + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "loopnz", "", 0, 0, 0, INS_TEST_NZERO, 31 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "loopz", "", 0, 0, 0, INS_TEST_ZERO, 31 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "loop", "", 0, 0, 0, 0 , 31 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jcxz", "", 0, 0, 0, 0 , 31 }, + { 0, INS_IN, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "in", "", 0, 0, 0, 0 , 0 }, + { 0, INS_IN, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "in", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_I | OPTYPE_b | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "out", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_I | OPTYPE_b | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "out", "", 0, 0, 0, 0 , 0 }, + { 0, INS_CALL, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "call", "", 0, 0, 0, 0 , 3 }, + { 0, INS_BRANCH, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jmp", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BRANCH, 0, ADDRMETH_A | OPTYPE_p | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jmp", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BRANCH, 0, ADDRMETH_J | OPTYPE_b | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jmp", "", 0, 0, 0, 0 , 0 }, + { 0, INS_IN, 0, ADDRMETH_RR | OPTYPE_b| OP_W, ADDRMETH_RR | OPTYPE_w| OP_R, ARG_NONE, cpu_80386 | isa_GP, "in", "", 0, 2, 0, 0 , 0 }, + { 0, INS_IN, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_RR | OPTYPE_w| OP_R, ARG_NONE, cpu_80386 | isa_GP, "in", "", 0, 2, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_RR | OPTYPE_w| OP_R, ADDRMETH_RR | OPTYPE_b| OP_R, ARG_NONE, cpu_80386 | isa_GP, "out", "", 2, 0, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_RR | OPTYPE_w| OP_R, ADDRMETH_RR | OPTYPE_v| OP_R, ARG_NONE, cpu_80386 | isa_GP, "out", "", 2, 0, 0, 0 , 0 }, +/* 0xf0 */ + { 0, INS_FLAG_PREFIX | PREFIX_LOCK, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ICEBP, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "icebp", "", 0, 0, 0, 0 , 0 }, + { idx_F2, INS_FLAG_PREFIX | PREFIX_REPNZ, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_F3, INS_FLAG_PREFIX | PREFIX_REPZ, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_HALT, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "hlt", "", 0, 0, 0, 0 , 0 }, + { 0, INS_TOGCF, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "cmc", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { idx_F6, 0, 0, ADDRMETH_E | OPTYPE_b, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_F7, 0, 0, ADDRMETH_E | OPTYPE_v, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_CLEARCF, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "clc", "", 0, 0, 0, INS_SET_NCARRY, 0 }, + { 0, INS_SETCF, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "stc", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "cli", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sti", "", 0, 0, 0, 0 , 0 }, + { 0, INS_CLEARDF, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "cld", "", 0, 0, 0, INS_SET_NDIR, 0 }, + { 0, INS_SETDF, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "std", "", 0, 0, 0, INS_SET_DIR, 0 }, + { idx_FE, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_FF, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_66[] = { /* SIMD 66 one-byte Opcodes */ + { idx_660F, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_F2[] = { /* SIMD F2 one-byte Opcodes */ + { idx_F20F, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_F3[] = { /* SIMD F3 one-byte Opcodes */ + { idx_F30F, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pause", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_0F[] = { /* Two-byte Opcodes */ + { idx_0F00, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_0F01, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lar", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lsl", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "clts", "", 0, 0, 0, 0 , 6 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "invd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "wbinvd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_UNKNOWN, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTPRO | isa_GP, "ud2", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "prefetch", "", 0, 0, 0, 0, 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "femms", "", 0, 0, 0, 0, 0 }, + { idx_0F0F, INS_FLAG_SUFFIX, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movups", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_W | OPTYPE_ps | OP_W, ADDRMETH_V | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movups", "", 0, 0, 0, 0 , 0 }, + { idx_0F12, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movlps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "unpcklps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "unpckhps", "", 0, 0, 0, 0 , 0 }, + { idx_0F16, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_q | OP_W, ADDRMETH_V | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movhps", "", 0, 0, 0, 0 , 0 }, + { idx_0F18, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_R | OPTYPE_d | OP_W, ADDRMETH_C | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_R | OPTYPE_d | OP_W, ADDRMETH_D | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_C | OPTYPE_d | OP_W, ADDRMETH_R | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_D | OPTYPE_d | OP_W, ADDRMETH_R | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_R | OPTYPE_d | OP_W, ADDRMETH_T | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_T | OPTYPE_d | OP_W, ADDRMETH_R | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movaps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_W | OPTYPE_ps | OP_W, ADDRMETH_V | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movaps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "cvtpi2ps", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_W | OPTYPE_ps | OP_W, ADDRMETH_V | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movntps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "cvttps2pi", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_q | OP_W , ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "cvtps2pi", "", 0, 0, 0, 0, 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ss | OP_W, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "ucomiss", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ss | OP_W, ARG_NONE, cpu_PENTIUM2 | isa_GP, "comiss", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "wrmsr", "", 0, 0, 0, 0 , 52 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "rdtsc", "", 0, 0, 0, 0 , 40 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "rdmsr", "", 0, 0, 0, 0 , 38 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTPRO | isa_GP, "rdpmc", "", 0, 0, 0, 0 , 39 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "sysenter", "", 0, 0, 0, 0 , 50 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "sysexit", "", 0, 0, 0, 0 , 51 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovo", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovno", "", 0, 0, 0, INS_TEST_NOFLOW, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovc", "", 0, 0, 0, INS_TEST_CARRY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovnc", "", 0, 0, 0, INS_TEST_NCARRY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovz", "", 0, 0, 0, INS_TEST_ZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovnz", "", 0, 0, 0, INS_TEST_NZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovbe", "", 0, 0, 0, INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmova", "", 0, 0, 0, INS_TEST_NZERO|INS_TEST_NCARRY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovs", "", 0, 0, 0, INS_TEST_SIGN, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovns", "", 0, 0, 0, INS_TEST_NSIGN, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovp", "", 0, 0, 0, INS_TEST_PARITY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovnp", "", 0, 0, 0, INS_TEST_NPARITY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovl", "", 0, 0, 0, INS_TEST_SFNEOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovge", "", 0, 0, 0, INS_TEST_SFEQOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovle", "", 0, 0, 0, INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovg", "", 0, 0, 0, INS_TEST_NZERO|INS_TEST_SFEQOF, 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_d | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movmskps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "sqrtps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "rsqrtps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "rcpps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_AND, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "andps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_AND, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "andnps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OR, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "orps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XOR, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "xorps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "addps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MUL, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "mulps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_pd, ADDRMETH_W | OPTYPE_q, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtps2pd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtdq2ps", "", 0, 0, 0, 0, 0 }, + { 0, INS_SUB, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "subps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "minps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_DIV, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "divps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "maxps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpcklbw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpcklwd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpckldq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "packsswb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpgtb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpgtw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpgtd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "packuswb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpckhbw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpckhwd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpckhdq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "packssdw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_d | OP_W, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "movd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "movq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM2 | isa_GP, "pshufw", "", 0, 0, 0, 0, 0 }, + { idx_0F71, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "", "", 0, 0, 0, 0 , 0 }, + { idx_0F72, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "", "", 0, 0, 0, 0 , 0 }, + { idx_0F73, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpeqb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_CMP, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpeqw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_CMP, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpeqd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "emms", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_d | OP_W, ADDRMETH_P | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "movd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_Q | OPTYPE_q | OP_W, ADDRMETH_P | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "movq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jo", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jno", "", 0, 0, 0, INS_TEST_NOFLOW, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jc", "", 0, 0, 0, INS_TEST_CARRY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jnc", "", 0, 0, 0, INS_TEST_NCARRY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jz", "", 0, 0, 0, INS_TEST_ZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jnz", "", 0, 0, 0, INS_TEST_NZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jbe", "", 0, 0, 0, INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ja", "", 0, 0, 0, INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "js", "", 0, 0, 0, INS_TEST_SIGN, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jns", "", 0, 0, 0, INS_TEST_NSIGN, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jpe", "", 0, 0, 0, INS_TEST_PARITY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jpo", "", 0, 0, 0, INS_TEST_NPARITY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jl", "", 0, 0, 0, INS_TEST_SFNEOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jge", "", 0, 0, 0, INS_TEST_SFEQOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jle", "", 0, 0, 0, INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jg", "", 0, 0, 0, INS_TEST_NZERO|INS_TEST_SFEQOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "seto", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setno", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setc", "", 0, 0, 0, INS_TEST_CARRY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setnc", "", 0, 0, 0, INS_TEST_NCARRY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setz", "", 0, 0, 0, INS_TEST_ZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setnz", "", 0, 0, 0, INS_TEST_NZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setbe", "", 0, 0, 0, INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "seta", "", 0, 0, 0, INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sets", "", 0, 0, 0, INS_TEST_SIGN, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setns", "", 0, 0, 0, INS_TEST_NSIGN, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setpe", "", 0, 0, 0, INS_TEST_PARITY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setpo", "", 0, 0, 0, INS_TEST_NPARITY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setl", "", 0, 0, 0, INS_TEST_SFNEOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setge", "", 0, 0, 0, INS_TEST_SFEQOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setle", "", 0, 0, 0, INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setg", "", 0, 0, 0, INS_TEST_NZERO|INS_TEST_SFEQOF, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 4, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RS | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 4, 0, 0, 0 , 33 }, + { 0, INS_CPUID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "cpuid", "", 0, 0, 0, 0 , 10 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bt", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_80386 | isa_GP, "shld", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + //{ 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_I | OP_R | OPTYPE_b | ADDRMETH_RR, cpu_80386 | isa_GP, "shld", "", 0, 0, 1, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_RR | OP_R | OPTYPE_b, cpu_80386 | isa_GP, "shld", "", 0, 0, 1, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 5, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RS | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 5, 0, 0, 0 , 33 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "rsm", "", 0, 0, 0, INS_SET_ALL|INS_SET_DIR, 42 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bts", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_80386 | isa_GP, "shrd", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_RR | OP_R | OPTYPE_b , cpu_80386 | isa_GP, "shrd", "", 0, 0, 1, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { idx_0FAE, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MUL, 0, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R | OP_W, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "imul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, }, + { 0, INS_XCHGCC, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_W, ARG_NONE, cpu_80486 | isa_GP, "cmpxchg", "", 0, 0, 0, INS_SET_ALL, 8 }, + { 0, INS_XCHGCC, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_W, ARG_NONE, cpu_80486 | isa_GP, "cmpxchg", "", 0, 0, 0, INS_SET_ALL, 7 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_W, ARG_NONE, cpu_80386 | isa_GP, "lss", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "btr", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_W, ARG_NONE, cpu_80386 | isa_GP, "lfs", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_W, ARG_NONE, cpu_80386 | isa_GP, "lgs", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movzx", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movzx", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_UNKNOWN, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ud1", "", 0, 0, 0, 0 , 0 }, + { idx_0FBA, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "btc", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_G | OPTYPE_v | OP_R | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bsf", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_G | OPTYPE_v | OP_R | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bsr", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movsx", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movsx", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_W, ARG_NONE, cpu_80486 | isa_GP, "xadd", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_W, ARG_NONE, cpu_80486 | isa_GP, "xadd", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "cmpps", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_M | OPTYPE_d | OP_W, ADDRMETH_G | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movnti", "", 0, 0, 0, 0, 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_E | OPTYPE_d | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM2 | isa_GP, "pinsrw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_G | OPTYPE_d | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM2 | isa_GP, "pextrw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM2 | isa_GP, "shufps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHGCC, 0, ADDRMETH_M | OPTYPE_q | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "cmpxchg8b", "", 0, 0, 0, 0, 9 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 1, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 2, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 3, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 4, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 5, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 6, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 7, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddq", "", 0, 0, 0, 0, 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pmullw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_G | OPTYPE_d | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pmovmskb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubusb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubusw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pminub", "", 0, 0, 0, 0 , 0 }, + { 0, INS_AND, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pand", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddusb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddusw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pmaxub", "", 0, 0, 0, 0 , 0 }, + { 0, INS_AND, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pandn", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pavgb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psraw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrad", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pavgw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MUL, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pmulhuw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MUL, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pmulhw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_W | OPTYPE_q | OP_W, ADDRMETH_V | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movntq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubsb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubsw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pminsw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OR, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "por", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddsb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddsw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pmaxsw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XOR, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pxor", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pslld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MUL, 0, ADDRMETH_P | OPTYPE_q | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmuludq", "", 0, 0, 0, 0, 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pmaddwd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "psadbw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_pi | OP_W, ADDRMETH_Q | OPTYPE_pi | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "maskmovq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubq", "", 0, 0, 0, 0, 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_660F[] = { /* SIMD 66 Two-byte Opcodes */ + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movupd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movupd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movlpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_M | OPTYPE_q | OP_R, ADDRMETH_V | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movlpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "unpcklpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "unpckhpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movhpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_M | OPTYPE_q | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movhpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movapd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movapd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtpi2pd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_M | OPTYPE_pd | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movntpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_P | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvttpd2pi", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_P | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtpd2pi", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "ucomisd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "comisd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movmskpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_FSQRT, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "sqrtpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_AND, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "andpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_AND, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "andnpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_OR, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "orpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_XOR, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "xorpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_ADD, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "addpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MUL, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "mulpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtpd2ps", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtps2dq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "subpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "minpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "divpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "maxpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpcklbw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpcklwd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpckldq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "packsswb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpgtb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpgtw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpgtd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "packuswb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpckhbw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpckhwd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpckhdq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "packssdw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpcklqdq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpckhqdq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_d | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movdqa", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "pshufd", "", 0, 0, 0, 0, 0 }, + { idx_660F71, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { idx_660F72, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { idx_660F73, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpeqb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpeqw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpeqd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "haddpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "hsubpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_E | OPTYPE_d | OP_R, ADDRMETH_V | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_V | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movdqa", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "cmppd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_w | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "pinsrw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_w | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "pextrw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "shufpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "addsubpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psrlw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psrld", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psrlq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmullw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_W | OPTYPE_q | OP_R, ADDRMETH_V | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmovmskb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubusb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubusw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pminub", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pand", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddusb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddusw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmaxub", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pandn", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pavgb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psraw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psrad", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pavgw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmulhuw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmulhw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvttpd2dq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_M | OPTYPE_dq | OP_R, ADDRMETH_V | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movntdq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubsb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubsw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pminsw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "por", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddsb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddsw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmaxsw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pxor", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psllw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pslld", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psllq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmuludq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmaddwd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psadbw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "maskmovdqu", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_F20F[] = { /* SIMD F2 Two-byte Opcodes */ + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_W | OPTYPE_sd | OP_R, ADDRMETH_V | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movddup", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtsi2sd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvttsd2si", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtsd2si", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "sqrtsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "addsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "mulsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtsd2ss", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "subsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "minsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "divsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "maxsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "pshuflw", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "haddps", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "hsubps", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "cmpsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "addsubps", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_P | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movdq2q", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtpd2dq", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_M | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "lddqu", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_F30F[] = { /* SIMD F3 Two-byte Opcodes */ + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_W | OPTYPE_ss | OP_R, ADDRMETH_V | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movsldup", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movshdup", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtsi2ss", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvttss2si", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtss2si", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "sqrtss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "rsqrtss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "rcpss", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "addss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "mulss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtss2sd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvttps2dq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "subss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "minss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "divss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "maxss", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movdqu", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "pshufhw", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_V | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movdqu", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "cmpss", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movq2dq", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtdq2pd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_0F00[] = { /* Group 6 */ + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sldt", "", 0, 0, 0, 0 , 46 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "str", "", 0, 0, 0, 0 , 49 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lldt", "", 0, 0, 0, 0 , 29 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ltr", "", 0, 0, 0, 0 , 32 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "verr", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "verw", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0F01[] = { /* Group 7 */ + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sgdt", "", 0, 0, 0, 0 , 44 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sidt", "", 0, 0, 0, 0 , 45 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lgdt", "", 0, 0, 0, 0 , 27 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lidt", "", 0, 0, 0, 0 , 28 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "smsw", "", 0, 0, 0, 0 , 47 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lmsw", "", 0, 0, 0, 0 , 30 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_none | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "invlpg", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sgdt", "", 0, 0, 0, 0 , 44 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sidt", "", 0, 0, 0, 0 , 45 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lgdt", "", 0, 0, 0, 0 , 27 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lidt", "", 0, 0, 0, 0 , 28 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "smsw", "", 0, 0, 0, 0 , 47 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lmsw", "", 0, 0, 0, 0 , 30 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_none | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "invlpg", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sgdt", "", 0, 0, 0, 0 , 44 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sidt", "", 0, 0, 0, 0 , 45 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lgdt", "", 0, 0, 0, 0 , 27 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lidt", "", 0, 0, 0, 0 , 28 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "smsw", "", 0, 0, 0, 0 , 47 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lmsw", "", 0, 0, 0, 0 , 30 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_none | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "invlpg", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { idx_0F0111, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "smsw", "", 0, 0, 0, 0 , 47 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lmsw", "", 0, 0, 0, 0 , 30 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0F0111[] = { /* Monitor/MWait opcode */ + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "monitor", "", 0, 0, 0, 0, 54 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "mwait", "", 0, 0, 0, 0, 55 } +}; + + +static ia32_insn_t tbl_0F12[] = { /* Movlps Opcode */ + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movlps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movlps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movlps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_R | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R , ARG_NONE, cpu_PENTIUM4 | isa_GP, "movhlps", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_0F16[] = { /* Movhps Opcode */ + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movhps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movhps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movhps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_R | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R , ARG_NONE, cpu_PENTIUM4 | isa_GP, "movlhps", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_0F18[] = { /* Group 16 */ + { 0, INS_SYSTEM, 0, OP_W | OPTYPE_b | ADDRMETH_M, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetchnta", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht0", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht1", "", 1, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht2", "", 2, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, OP_W | OPTYPE_b | ADDRMETH_M, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetchnta", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht0", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht1", "", 1, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht2", "", 2, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, OP_W | OPTYPE_b | ADDRMETH_M, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetchnta", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht0", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht1", "", 1, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht2", "", 2, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0F71[] = { /* Group 12 */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psraw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_660F71[] = { /* Group 12 SSE */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psraw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0F72[] = { /* Group 13 */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrad", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pslld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_660F72[] = { /* Group 13 SSE */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrad", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pslld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0F73[] = { /* Group 14 */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_660F73[] = { /* Group 14 SSE */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrldq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pslldq", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0FAE[] = { /* Group 15 */ + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxsave", "", 0, 0, 0, 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxrstor", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "ldmxcsr", "", 0, 0, 0, 0 , 25 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "stmxcsr", "", 0, 0, 0 , 0, 48 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "clflush", "", 0, 0, 0, 0, 0 }, + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxsave", "", 0, 0, 0, 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxrstor", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "ldmxcsr", "", 0, 0, 0, 0 , 25 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "stmxcsr", "", 0, 0, 0 , 0, 48 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "clflush", "", 0, 0, 0, 0, 0 }, + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxsave", "", 0, 0, 0, 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxrstor", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "ldmxcsr", "", 0, 0, 0, 0 , 25 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "stmxcsr", "", 0, 0, 0 , 0, 48 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "clflush", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "lfence", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "mfence", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "sfence", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0FBA[] = { /* Group 8 */ + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bt", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bts", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "btr", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "btc", "", 0, 0, 0 , INS_SET_CARRY, 0 } +}; + + +static ia32_insn_t tbl_0FC7[] = { /* Group 9 */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHGCC, 0, ADDRMETH_M | OPTYPE_q | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "cmpxch8b", "", 0, 0, 0 , 0 , 9 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHGCC, 0, ADDRMETH_M | OPTYPE_q | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "cmpxch8b", "", 0, 0, 0 , 0 , 9 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHGCC, 0, ADDRMETH_M | OPTYPE_q | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "cmpxch8b", "", 0, 0, 0 , 0 , 9 } +}; + + +static ia32_insn_t tbl_0FB9[] = { /* Group 10 */ + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "fxsave", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_C6[] = { /* Group 11a */ + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_C7[] = { /* Group 11b */ + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_80[] = { /* Group 1a */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_81[] = { /* Group 1b */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_82[] = { /* Group 1c */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_83[] = { /* Group 1d */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_C0[] = { /* Group 2a */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_C1[] = { /* Group 2b */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_D0[] = { /* Group 2c */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 1, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_D1[] = { /* Group 2d */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 1, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_D2[] = { /* Group 2e */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 1, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_D3[] = { /* Group 2f */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 1, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_F6[] = { /* Group 3a */ + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_NOT, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "not", "", 0, 0, 0, 0 , 0 }, + { 0, INS_NEG, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "neg", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_MUL, 0, OPTYPE_b | ADDRMETH_RR | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 22 }, + { 0, INS_MUL, 0, OPTYPE_b | ADDRMETH_RR | OP_W | OP_SIGNED | OP_R, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "imul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 22 }, + { 0, INS_DIV, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "div", "", 0, 0, 0, 0 , 13 }, + { 0, INS_DIV, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "idiv", "", 0, 0, 0 , 0 , 13 } +}; + + +static ia32_insn_t tbl_F7[] = { /* Group 3b */ + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_NOT, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "not", "", 0, 0, 0, 0 , 0 }, + { 0, INS_NEG, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "neg", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_MUL, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 23 }, + { 0, INS_MUL, 0, ADDRMETH_RR | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "imul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 23 }, + { 0, INS_DIV, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "div", "", 0, 0, 0, 0 , 14 }, + { 0, INS_DIV, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "idiv", "", 0, 0, 0, 0 , 14 } +}; + + +static ia32_insn_t tbl_FE[] = { /* Group 4 */ + { 0, INS_INC, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 0, 0, 0 , INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 } +}; + + +static ia32_insn_t tbl_FF[] = { /* Group 5 */ + { 0, INS_INC, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_CALL, 0, ADDRMETH_E | OPTYPE_v | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "call", "", 0, 0, 0, 0 , 3 }, + { 0, INS_CALL, 0, ADDRMETH_M | OPTYPE_p | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "call", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BRANCH, 0, ADDRMETH_E | OPTYPE_v | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jmp", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BRANCH, 0, ADDRMETH_M | OPTYPE_p | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jmp", "", 0, 0, 0, 0 , 0 }, + { 0, INS_PUSH, 0, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 0, 0, 0, 0 , 33 } +}; + + +static ia32_insn_t tbl_D8[] = { /* FPU D8 */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_D8C0[] = { /* FPU D8 C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 1, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 2, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 3, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 4, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 5, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 6, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 7, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 1, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 2, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 3, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 4, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 5, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 6, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 7, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 7, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_D9[] = { /* FPU D9 */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fv|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldenv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldcw", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fv|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnstenv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnstcw", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_D9C0[] = { /* FPU D9 C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnop", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fchs", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fabs", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ftst", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fxam", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fld1", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldl2t", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldl2e", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldpi", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldlg2", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldln2", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldz", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "f2xm1", "", 0, 0, 0 , 0 , 16 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fyl2x", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fptan", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fpatan", "", 0, 0, 0 , 0 , 18 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fxtract", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fprem1", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fdecstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fincstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fprem", "", 0, 0, 0 , 0 , 19 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fyl2xp1", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsqrt", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsincos", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "frndint", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fscale", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsin", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcos", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DA[] = { /* FPU DA */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fiadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fimul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ficom", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ficomp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fisub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fisubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fidiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fidivr", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DAC0[] = { /* FPU DA C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 0, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 1, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 2, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 3, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 4, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 5, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 6, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 7, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 0, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 1, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 2, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 3, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 4, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 5, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 6, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 7, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 0, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 1, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 2, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 3, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 4, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 5, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 6, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 7, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 0, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 1, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 2, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 3, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 4, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 5, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 6, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 7, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fucompp", "", 0, 0, 0 , 0 , 21 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DB[] = { /* FPU DB */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fild", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "fisttp", "", 0, 0, 0, 0, 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fist", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fistp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fe|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fe|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DBC0[] = { /* FPU DB C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 0, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 1, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 2, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 3, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 4, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 5, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 6, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 7, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 0, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 1, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 2, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 3, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 4, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 5, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 6, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 7, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 0, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 1, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 2, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 3, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 4, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 5, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 6, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 7, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 0, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 1, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 2, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 3, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 4, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 5, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 6, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 7, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnclex", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fninit", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0, }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 1, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 2, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 3, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 4, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 5, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 6, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 7, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DC[] = { /* FPU DC */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_DCC0[] = { /* FPU DC C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 7, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DD[] = { /* FPU DD */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_q|OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "fisttp", "", 0, 0, 0, 0, 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_ft|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "frstor", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_ft|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnsave", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnstsw", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DDC0[] = { /* FPU DD C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DE[] = { /* FPU DE */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fiadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fimul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ficom", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ficomp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fisub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fisubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fidiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fidivr", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_DEC0[] = { /* FPU DE C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 0, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 1, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 2, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 3, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 4, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 5, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 6, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 7, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcompp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 7, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DF[] = { /* FPU DF */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fild", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "fisttp", "", 0, 0, 0, 0, 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fist", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fistp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fb|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fbld", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_q|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fild", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fb|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fbstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_q|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fistp", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DFC0[] = { /* FPU DF C0 */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RR | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnstsw", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 1, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 2, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 3, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 4, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 5, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 6, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 7, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_0F0F[] = { /* 3D Now! 0F Suffix */ + /* 00 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_CONV, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pi2fd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 10 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_CONV, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pf2id", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 20 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 30 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 40 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 50 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 60 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 70 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 80 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_CMP, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfcmpge", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_MIN, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfmin", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfrcp", "", 0, 0, 0, 0, 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfrsqrt", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfsub", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfadd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_CMP, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfcmpgt", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_MAX, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfmax", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfrcpit1", "", 0, 0, 0, 0, 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfrsqit1", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfsubr", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfacc", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_CMP, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfcmpeq", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_MUL, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfmul", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfrcpit2", "", 0, 0, 0, 0, 0 }, + { 0, INS_MUL, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pmulhrw", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_AVG, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pavgusb", "", 0, 0, 0, 0, 0 } +}; + + + +/* ================== Table of Opcode Tables ================== */ +ia32_table_desc_t ia32_tables[] = { + /* table, prefix table, type, shift, mask, min, max */ + { tbl_Main, tbl_opcode, 0x00, 0xFF, 0x00, 0xFF }, + { tbl_66, tbl_prefix, 0x00, 0xFF, 0x0F, 0x0F }, + { tbl_F2, tbl_prefix, 0x00, 0xFF, 0x0F, 0x0F }, + { tbl_F3, tbl_prefix, 0x00, 0xFF, 0x0F, 0x90 }, + { tbl_0F, tbl_opcode, 0x00, 0xFF, 0x00, 0xFF }, + /* 5 */ + { tbl_660F, tbl_prefix, 0x00, 0xFF, 0x10, 0xFF }, + { tbl_F20F, tbl_prefix, 0x00, 0xFF, 0x10, 0xFF }, + { tbl_F30F, tbl_prefix, 0x00, 0xFF, 0x10, 0xFF }, + { tbl_0F00, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_0F01, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + /* 10 */ + { tbl_0F0111, tbl_ext_ext, 0x00, 0x01, 0x00, 0x01 }, + { tbl_0F12, tbl_extension, 0x06, 0x03, 0x00, 0x03 }, + { tbl_0F16, tbl_extension, 0x06, 0x03, 0x00, 0x03 }, + { tbl_0F18, tbl_extension, 0x03, 0x1F, 0x00, 0x13 }, + { tbl_0F71, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + /* 15 */ + { tbl_660F71, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + { tbl_0F72, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + { tbl_660F72, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + { tbl_0F73, tbl_extension, 0x00, 0x00, 0x00, 0x00 }, + { tbl_660F73, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + /* 20 */ + { tbl_0FAE, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + { tbl_0FBA, tbl_extension, 0x03, 0x07, 0x04, 0x07 }, + { tbl_0FC7, tbl_extension, 0x03, 0x1F, 0x00, 0x11 }, + { tbl_0FB9, tbl_extension, 0x03, 0x07, 0x00, 0x00 }, + { tbl_C6, tbl_extension, 0x03, 0x07, 0x00, 0x00 }, + /* 25 */ + { tbl_C7, tbl_extension, 0x03, 0x07, 0x00, 0x00 }, + { tbl_80, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_81, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_82, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_83, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + /* 30 */ + { tbl_C0, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_C1, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_D0, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_D1, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_D2, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + /* 35 */ + { tbl_D3, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_F6, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_F7, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_FE, tbl_extension, 0x03, 0x07, 0x00, 0x01 }, + { tbl_FF, tbl_extension, 0x03, 0x07, 0x00, 0x06 }, + /* 40 */ + { tbl_D8, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_D8C0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_D9, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_D9C0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_DA, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + /* 45 */ + { tbl_DAC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_DB, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_DBC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_DC, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_DCC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + /* 50 */ + { tbl_DD, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_DDC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_DE, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_DEC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_DF, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + /* 55 */ + { tbl_DFC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_0F0F, tbl_suffix, 0x00, 0xFF, 0x00, 0xBF } +}; +/* ia32_opcode_tables.h */ +/* Table index constants: +#define idx_Main 0 +#define idx_66 1 +#define idx_F2 2 +#define idx_F3 3 +#define idx_0F 4 +#define idx_660F 5 +#define idx_F20F 6 +#define idx_F30F 7 +#define idx_0F00 8 +#define idx_0F01 9 +#define idx_0F0111 10 +#define idx_0F12 11 +#define idx_0F16 12 +#define idx_0F18 13 +#define idx_0F71 14 +#define idx_660F71 15 +#define idx_0F72 16 +#define idx_660F72 17 +#define idx_0F73 18 +#define idx_660F73 19 +#define idx_0FAE 20 +#define idx_0FBA 21 +#define idx_0FC7 22 +#define idx_0FB9 23 +#define idx_C6 24 +#define idx_C7 25 +#define idx_80 26 +#define idx_81 27 +#define idx_82 28 +#define idx_83 29 +#define idx_C0 30 +#define idx_C1 31 +#define idx_D0 32 +#define idx_D1 33 +#define idx_D2 34 +#define idx_D3 35 +#define idx_F6 36 +#define idx_F7 37 +#define idx_FE 38 +#define idx_FF 39 +#define idx_D8 40 +#define idx_D8C0 41 +#define idx_D9 42 +#define idx_D9C0 43 +#define idx_DA 44 +#define idx_DAC0 45 +#define idx_DB 46 +#define idx_DBC0 47 +#define idx_DC 48 +#define idx_DCC0 49 +#define idx_DD 50 +#define idx_DDC0 51 +#define idx_DE 52 +#define idx_DEC0 53 +#define idx_DF 54 +#define idx_DFC0 55 +#define idx_0F0F 56 +*/ diff --git a/src/third_party/libdisasm/ia32_opcode_tables.h b/src/third_party/libdisasm/ia32_opcode_tables.h new file mode 100644 index 0000000..bbd4fae --- /dev/null +++ b/src/third_party/libdisasm/ia32_opcode_tables.h @@ -0,0 +1,57 @@ +#define idx_Main 0 +#define idx_66 1 +#define idx_F2 2 +#define idx_F3 3 +#define idx_0F 4 +#define idx_660F 5 +#define idx_F20F 6 +#define idx_F30F 7 +#define idx_0F00 8 +#define idx_0F01 9 +#define idx_0F0111 10 +#define idx_0F12 11 +#define idx_0F16 12 +#define idx_0F18 13 +#define idx_0F71 14 +#define idx_660F71 15 +#define idx_0F72 16 +#define idx_660F72 17 +#define idx_0F73 18 +#define idx_660F73 19 +#define idx_0FAE 20 +#define idx_0FBA 21 +#define idx_0FC7 22 +#define idx_0FB9 23 +#define idx_C6 24 +#define idx_C7 25 +#define idx_80 26 +#define idx_81 27 +#define idx_82 28 +#define idx_83 29 +#define idx_C0 30 +#define idx_C1 31 +#define idx_D0 32 +#define idx_D1 33 +#define idx_D2 34 +#define idx_D3 35 +#define idx_F6 36 +#define idx_F7 37 +#define idx_FE 38 +#define idx_FF 39 +#define idx_D8 40 +#define idx_D8C0 41 +#define idx_D9 42 +#define idx_D9C0 43 +#define idx_DA 44 +#define idx_DAC0 45 +#define idx_DB 46 +#define idx_DBC0 47 +#define idx_DC 48 +#define idx_DCC0 49 +#define idx_DD 50 +#define idx_DDC0 51 +#define idx_DE 52 +#define idx_DEC0 53 +#define idx_DF 54 +#define idx_DFC0 55 +#define idx_0F0F 56 diff --git a/src/third_party/libdisasm/ia32_operand.c b/src/third_party/libdisasm/ia32_operand.c new file mode 100644 index 0000000..8e7f16a --- /dev/null +++ b/src/third_party/libdisasm/ia32_operand.c @@ -0,0 +1,425 @@ +#include +#include +#include + +#include "libdis.h" +#include "ia32_insn.h" +#include "ia32_operand.h" +#include "ia32_modrm.h" +#include "ia32_reg.h" +#include "x86_imm.h" +#include "x86_operand_list.h" + + + +/* apply segment override to memory operand in insn */ +static void apply_seg( x86_op_t *op, unsigned int prefixes ) { + if (! prefixes ) return; + + /* apply overrides from prefix */ + switch ( prefixes & PREFIX_REG_MASK ) { + case PREFIX_CS: + op->flags |= op_cs_seg; break; + case PREFIX_SS: + op->flags |= op_ss_seg; break; + case PREFIX_DS: + op->flags |= op_ds_seg; break; + case PREFIX_ES: + op->flags |= op_es_seg; break; + case PREFIX_FS: + op->flags |= op_fs_seg; break; + case PREFIX_GS: + op->flags |= op_gs_seg; break; + } + + return; +} + +static size_t decode_operand_value( unsigned char *buf, size_t buf_len, + x86_op_t *op, x86_insn_t *insn, + unsigned int addr_meth, size_t op_size, + unsigned int op_value, unsigned char modrm, + size_t gen_regs ) { + size_t size = 0; + + /* ++ Do Operand Addressing Method / Decode operand ++ */ + switch (addr_meth) { + /* This sets the operand Size based on the Intel Opcode Map + * (Vol 2, Appendix A). Letter encodings are from section + * A.1.1, 'Codes for Addressing Method' */ + + /* ---------------------- Addressing Method -------------- */ + /* Note that decoding mod ModR/M operand adjusts the size of + * the instruction, but decoding the reg operand does not. + * This should not cause any problems, as every 'reg' operand + * has an associated 'mod' operand. + * Goddamn-Intel-Note: + * Some Intel addressing methods [M, R] specify that modR/M + * byte may only refer to a memory address/may only refer to + * a register -- however Intel provides no clues on what to do + * if, say, the modR/M for an M opcode decodes to a register + * rather than a memory address ... returning 0 is out of the + * question, as this would be an Immediate or a RelOffset, so + * instead these modR/Ms are decoded with total disregard to + * the M, R constraints. */ + + /* MODRM -- mod operand. sets size to at least 1! */ + case ADDRMETH_E: /* ModR/M present, Gen reg or memory */ + size = ia32_modrm_decode( buf, buf_len, op, insn, + gen_regs ); + break; + case ADDRMETH_M: /* ModR/M only refers to memory */ + size = ia32_modrm_decode( buf, buf_len, op, insn, + gen_regs ); + break; + case ADDRMETH_Q: /* ModR/M present, MMX or Memory */ + size = ia32_modrm_decode( buf, buf_len, op, insn, + REG_MMX_OFFSET ); + break; + case ADDRMETH_R: /* ModR/M mod == gen reg */ + size = ia32_modrm_decode( buf, buf_len, op, insn, + gen_regs ); + break; + case ADDRMETH_W: /* ModR/M present, mem or SIMD reg */ + size = ia32_modrm_decode( buf, buf_len, op, insn, + REG_SIMD_OFFSET ); + break; + + /* MODRM -- reg operand. does not effect size! */ + case ADDRMETH_C: /* ModR/M reg == control reg */ + ia32_reg_decode( modrm, op, REG_CTRL_OFFSET ); + break; + case ADDRMETH_D: /* ModR/M reg == debug reg */ + ia32_reg_decode( modrm, op, REG_DEBUG_OFFSET ); + break; + case ADDRMETH_G: /* ModR/M reg == gen-purpose reg */ + ia32_reg_decode( modrm, op, gen_regs ); + break; + case ADDRMETH_P: /* ModR/M reg == qword MMX reg */ + ia32_reg_decode( modrm, op, REG_MMX_OFFSET ); + break; + case ADDRMETH_S: /* ModR/M reg == segment reg */ + ia32_reg_decode( modrm, op, REG_SEG_OFFSET ); + break; + case ADDRMETH_T: /* ModR/M reg == test reg */ + ia32_reg_decode( modrm, op, REG_TEST_OFFSET ); + break; + case ADDRMETH_V: /* ModR/M reg == SIMD reg */ + ia32_reg_decode( modrm, op, REG_SIMD_OFFSET ); + break; + + /* No MODRM : note these set operand type explicitly */ + case ADDRMETH_A: /* No modR/M -- direct addr */ + op->type = op_absolute; + + /* segment:offset address used in far calls */ + x86_imm_sized( buf, buf_len, + &op->data.absolute.segment, 2 ); + if ( insn->addr_size == 4 ) { + x86_imm_sized( buf, buf_len, + &op->data.absolute.offset.off32, 4 ); + size = 6; + } else { + x86_imm_sized( buf, buf_len, + &op->data.absolute.offset.off16, 2 ); + size = 4; + } + + break; + case ADDRMETH_I: /* Immediate val */ + op->type = op_immediate; + /* if it ever becomes legal to have imm as dest and + * there is a src ModR/M operand, we are screwed! */ + if ( op->flags & op_signed ) { + x86_imm_signsized(buf, buf_len, &op->data.byte, + op_size); + } else { + x86_imm_sized(buf, buf_len, &op->data.byte, + op_size); + } + size = op_size; + break; + case ADDRMETH_J: /* Rel offset to add to IP [jmp] */ + /* this fills op->data.near_offset or + op->data.far_offset depending on the size of + the operand */ + op->flags |= op_signed; + if ( op_size == 1 ) { + /* one-byte near offset */ + op->type = op_relative_near; + x86_imm_signsized(buf, buf_len, + &op->data.relative_near, 1); + } else { + /* far offset...is this truly signed? */ + op->type = op_relative_far; + x86_imm_signsized(buf, buf_len, + &op->data.relative_far, op_size ); + } + size = op_size; + break; + case ADDRMETH_O: /* No ModR/M; op is word/dword offset */ + /* NOTE: these are actually RVAs not offsets to seg!! */ + /* note bene: 'O' ADDR_METH uses addr_size to + determine operand size */ + op->type = op_offset; + op->flags |= op_pointer; + x86_imm_sized( buf, buf_len, &op->data.offset, + insn->addr_size ); + + size = insn->addr_size; + break; + + /* Hard-coded: these are specified in the insn definition */ + case ADDRMETH_F: /* EFLAGS register */ + op->type = op_register; + op->flags |= op_hardcode; + ia32_handle_register( &op->data.reg, REG_FLAGS_INDEX ); + break; + case ADDRMETH_X: /* Memory addressed by DS:SI [string] */ + op->type = op_expression; + op->flags |= op_hardcode; + op->flags |= op_ds_seg | op_pointer | op_string; + ia32_handle_register( &op->data.expression.base, + REG_DWORD_OFFSET + 6 ); + break; + case ADDRMETH_Y: /* Memory addressed by ES:DI [string] */ + op->type = op_expression; + op->flags |= op_hardcode; + op->flags |= op_es_seg | op_pointer | op_string; + ia32_handle_register( &op->data.expression.base, + REG_DWORD_OFFSET + 7 ); + break; + case ADDRMETH_RR: /* Gen Register hard-coded in opcode */ + op->type = op_register; + op->flags |= op_hardcode; + ia32_handle_register( &op->data.reg, + op_value + gen_regs ); + break; + case ADDRMETH_RS: /* Seg Register hard-coded in opcode */ + op->type = op_register; + op->flags |= op_hardcode; + ia32_handle_register( &op->data.reg, + op_value + REG_SEG_OFFSET ); + break; + case ADDRMETH_RF: /* FPU Register hard-coded in opcode */ + op->type = op_register; + op->flags |= op_hardcode; + ia32_handle_register( &op->data.reg, + op_value + REG_FPU_OFFSET ); + break; + case ADDRMETH_RT: /* TST Register hard-coded in opcode */ + op->type = op_register; + op->flags |= op_hardcode; + ia32_handle_register( &op->data.reg, + op_value + REG_TEST_OFFSET ); + break; + case ADDRMETH_II: /* Immediate hard-coded in opcode */ + op->type = op_immediate; + op->data.dword = op_value; + op->flags |= op_hardcode; + break; + + case 0: /* Operand is not used */ + default: + /* ignore -- operand not used in this insn */ + op->type = op_unused; /* this shouldn't happen! */ + break; + } + + return size; +} + +static size_t decode_operand_size( unsigned int op_type, x86_insn_t *insn, + x86_op_t *op ){ + size_t size; + + /* ++ Do Operand Type ++ */ + switch (op_type) { + /* This sets the operand Size based on the Intel Opcode Map + * (Vol 2, Appendix A). Letter encodings are from section + * A.1.2, 'Codes for Operand Type' */ + /* NOTE: in this routines, 'size' refers to the size + * of the operand in the raw (encoded) instruction; + * 'datatype' stores the actual size and datatype + * of the operand */ + + /* ------------------------ Operand Type ----------------- */ + case OPTYPE_c: /* byte or word [op size attr] */ + size = (insn->op_size == 4) ? 2 : 1; + op->datatype = (size == 4) ? op_word : op_byte; + break; + case OPTYPE_a: /* 2 word or 2 dword [op size attr] */ + /* pointer to a 16:16 or 32:32 BOUNDS operand */ + size = (insn->op_size == 4) ? 8 : 4; + op->datatype = (size == 4) ? op_bounds32 : op_bounds16; + break; + case OPTYPE_v: /* word or dword [op size attr] */ + size = (insn->op_size == 4) ? 4 : 2; + op->datatype = (size == 4) ? op_dword : op_word; + break; + case OPTYPE_p: /* 32/48-bit ptr [op size attr] */ + /* technically these flags are not accurate: the + * value s a 16:16 pointer or a 16:32 pointer, where + * the first '16' is a segment */ + size = (insn->addr_size == 4) ? 6 : 4; + op->datatype = (size == 4) ? op_descr32 : op_descr16; + break; + case OPTYPE_b: /* byte, ignore op-size */ + size = 1; + op->datatype = op_byte; + break; + case OPTYPE_w: /* word, ignore op-size */ + size = 2; + op->datatype = op_word; + break; + case OPTYPE_d: /* dword , ignore op-size */ + size = 4; + op->datatype = op_dword; + break; + case OPTYPE_s: /* 6-byte psuedo-descriptor */ + /* ptr to 6-byte value which is 32:16 in 32-bit + * mode, or 8:24:16 in 16-bit mode. The high byte + * is ignored in 16-bit mode. */ + size = 6; + op->datatype = (insn->addr_size == 4) ? + op_pdescr32 : op_pdescr16; + break; + case OPTYPE_q: /* qword, ignore op-size */ + size = 8; + op->datatype = op_qword; + break; + case OPTYPE_dq: /* d-qword, ignore op-size */ + size = 16; + op->datatype = op_dqword; + break; + case OPTYPE_ps: /* 128-bit FP data */ + size = 16; + /* really this is 4 packed SP FP values */ + op->datatype = op_ssimd; + break; + case OPTYPE_pd: /* 128-bit FP data */ + size = 16; + /* really this is 2 packed DP FP values */ + op->datatype = op_dsimd; + break; + case OPTYPE_ss: /* Scalar elem of 128-bit FP data */ + size = 16; + /* this only looks at the low dword (4 bytes) + * of the xmmm register passed as a param. + * This is a 16-byte register where only 4 bytes + * are used in the insn. Painful, ain't it? */ + op->datatype = op_sssimd; + break; + case OPTYPE_sd: /* Scalar elem of 128-bit FP data */ + size = 16; + /* this only looks at the low qword (8 bytes) + * of the xmmm register passed as a param. + * This is a 16-byte register where only 8 bytes + * are used in the insn. Painful, again... */ + op->datatype = op_sdsimd; + break; + case OPTYPE_pi: /* qword mmx register */ + size = 8; + op->datatype = op_qword; + break; + case OPTYPE_si: /* dword integer register */ + size = 4; + op->datatype = op_dword; + break; + case OPTYPE_fs: /* single-real */ + size = 4; + op->datatype = op_sreal; + break; + case OPTYPE_fd: /* double real */ + size = 8; + op->datatype = op_dreal; + break; + case OPTYPE_fe: /* extended real */ + size = 10; + op->datatype = op_extreal; + break; + case OPTYPE_fb: /* packed BCD */ + size = 10; + op->datatype = op_bcd; + break; + case OPTYPE_fv: /* pointer to FPU env: 14 or 28-bytes */ + size = (insn->addr_size == 4)? 28 : 14; + op->datatype = (size == 28)? op_fpuenv32: op_fpuenv16; + break; + case OPTYPE_ft: /* pointer to FPU env: 94 or 108 bytes */ + size = (insn->addr_size == 4)? 108 : 94; + op->datatype = (size == 108)? + op_fpustate32: op_fpustate16; + break; + case OPTYPE_fx: /* 512-byte register stack */ + size = 512; + op->datatype = op_fpregset; + break; + case OPTYPE_fp: /* floating point register */ + size = 10; /* double extended precision */ + op->datatype = op_fpreg; + break; + case OPTYPE_m: /* fake operand type used for "lea Gv, M" */ + size = insn->addr_size; + op->datatype = (size == 4) ? op_dword : op_word; + break; + case OPTYPE_none: /* handle weird instructions that have no encoding but use a dword datatype, like invlpg */ + size = 0; + op->datatype = op_none; + break; + case 0: + default: + size = insn->op_size; + op->datatype = (size == 4) ? op_dword : op_word; + break; + } + return size; +} + +size_t ia32_decode_operand( unsigned char *buf, size_t buf_len, + x86_insn_t *insn, unsigned int raw_op, + unsigned int raw_flags, unsigned int prefixes, + unsigned char modrm ) { + unsigned int addr_meth, op_type, op_size, gen_regs; + x86_op_t *op; + size_t size; + + /* ++ Yank optype and addr mode out of operand flags */ + addr_meth = raw_flags & ADDRMETH_MASK; + op_type = raw_flags & OPTYPE_MASK; + + if ( raw_flags == ARG_NONE ) { + /* operand is not used in this instruction */ + return 0; + } + + /* allocate a new operand */ + op = x86_operand_new( insn ); + + /* ++ Copy flags from opcode table to x86_insn_t */ + op->access = (enum x86_op_access) OP_PERM(raw_flags); + op->flags = (enum x86_op_flags) (OP_FLAGS(raw_flags) >> 12); + + /* Get size (for decoding) and datatype of operand */ + op_size = decode_operand_size(op_type, insn, op); + + /* override default register set based on Operand Type */ + /* this allows mixing of 8, 16, and 32 bit regs in insn */ + if (op_size == 1) { + gen_regs = REG_BYTE_OFFSET; + } else if (op_size == 2) { + gen_regs = REG_WORD_OFFSET; + } else { + gen_regs = REG_DWORD_OFFSET; + } + + size = decode_operand_value( buf, buf_len, op, insn, addr_meth, + op_size, raw_op, modrm, gen_regs ); + + /* if operand is an address, apply any segment override prefixes */ + if ( op->type == op_expression || op->type == op_offset ) { + apply_seg(op, prefixes); + } + + return size; /* return number of bytes in instruction */ +} diff --git a/src/third_party/libdisasm/ia32_operand.h b/src/third_party/libdisasm/ia32_operand.h new file mode 100644 index 0000000..08c3074 --- /dev/null +++ b/src/third_party/libdisasm/ia32_operand.h @@ -0,0 +1,11 @@ +#ifndef IA32_OPERAND_H +#define IA32_OPERAND_H + +#include "libdis.h" +#include "ia32_insn.h" + +size_t ia32_decode_operand( unsigned char *buf, size_t buf_len, + x86_insn_t *insn, unsigned int raw_op, + unsigned int raw_flags, unsigned int prefixes, + unsigned char modrm ); +#endif diff --git a/src/third_party/libdisasm/ia32_reg.c b/src/third_party/libdisasm/ia32_reg.c new file mode 100644 index 0000000..f270c1f --- /dev/null +++ b/src/third_party/libdisasm/ia32_reg.c @@ -0,0 +1,234 @@ +#include +#include + +#include "ia32_reg.h" +#include "ia32_insn.h" + +#define NUM_X86_REGS 92 + +/* register sizes */ +#define REG_DWORD_SIZE 4 +#define REG_WORD_SIZE 2 +#define REG_BYTE_SIZE 1 +#define REG_MMX_SIZE 8 +#define REG_SIMD_SIZE 16 +#define REG_DEBUG_SIZE 4 +#define REG_CTRL_SIZE 4 +#define REG_TEST_SIZE 4 +#define REG_SEG_SIZE 2 +#define REG_FPU_SIZE 10 +#define REG_FLAGS_SIZE 4 +#define REG_FPCTRL_SIZE 2 +#define REG_FPSTATUS_SIZE 2 +#define REG_FPTAG_SIZE 2 +#define REG_EIP_SIZE 4 +#define REG_IP_SIZE 2 + +/* REGISTER ALIAS TABLE: + * + * NOTE: the MMX register mapping is fixed to the physical registers + * used by the FPU. The floating FP stack does not effect the location + * of the MMX registers, so this aliasing is not 100% accurate. + * */ +static struct { + unsigned char alias; /* id of register this is an alias for */ + unsigned char shift; /* # of bits register must be shifted */ +} ia32_reg_aliases[] = { + { 0,0 }, + { REG_DWORD_OFFSET, 0 }, /* al : 1 */ + { REG_DWORD_OFFSET, 8 }, /* ah : 2 */ + { REG_DWORD_OFFSET, 0 }, /* ax : 3 */ + { REG_DWORD_OFFSET + 1, 0 }, /* cl : 4 */ + { REG_DWORD_OFFSET + 1, 8 }, /* ch : 5 */ + { REG_DWORD_OFFSET + 1, 0 }, /* cx : 6 */ + { REG_DWORD_OFFSET + 2, 0 }, /* dl : 7 */ + { REG_DWORD_OFFSET + 2, 8 }, /* dh : 8 */ + { REG_DWORD_OFFSET + 2, 0 }, /* dx : 9 */ + { REG_DWORD_OFFSET + 3, 0 }, /* bl : 10 */ + { REG_DWORD_OFFSET + 3, 8 }, /* bh : 11 */ + { REG_DWORD_OFFSET + 3, 0 }, /* bx : 12 */ + { REG_DWORD_OFFSET + 4, 0 }, /* sp : 13 */ + { REG_DWORD_OFFSET + 5, 0 }, /* bp : 14 */ + { REG_DWORD_OFFSET + 6, 0 }, /* si : 15 */ + { REG_DWORD_OFFSET + 7, 0 }, /* di : 16 */ + { REG_EIP_INDEX, 0 }, /* ip : 17 */ + { REG_FPU_OFFSET, 0 }, /* mm0 : 18 */ + { REG_FPU_OFFSET + 1, 0 }, /* mm1 : 19 */ + { REG_FPU_OFFSET + 2, 0 }, /* mm2 : 20 */ + { REG_FPU_OFFSET + 3, 0 }, /* mm3 : 21 */ + { REG_FPU_OFFSET + 4, 0 }, /* mm4 : 22 */ + { REG_FPU_OFFSET + 5, 0 }, /* mm5 : 23 */ + { REG_FPU_OFFSET + 6, 0 }, /* mm6 : 24 */ + { REG_FPU_OFFSET + 7, 0 } /* mm7 : 25 */ + }; + +/* REGISTER TABLE: size, type, and name of every register in the + * CPU. Does not include MSRs since the are, after all, + * model specific. */ +static struct { + unsigned int size; + enum x86_reg_type type; + unsigned int alias; + char mnemonic[8]; +} ia32_reg_table[NUM_X86_REGS + 2] = { + { 0, 0, 0, "" }, + /* REG_DWORD_OFFSET */ + { REG_DWORD_SIZE, reg_gen | reg_ret, 0, "eax" }, + { REG_DWORD_SIZE, reg_gen | reg_count, 0, "ecx" }, + { REG_DWORD_SIZE, reg_gen, 0, "edx" }, + { REG_DWORD_SIZE, reg_gen, 0, "ebx" }, + /* REG_ESP_INDEX */ + { REG_DWORD_SIZE, reg_gen | reg_sp, 0, "esp" }, + { REG_DWORD_SIZE, reg_gen | reg_fp, 0, "ebp" }, + { REG_DWORD_SIZE, reg_gen | reg_src, 0, "esi" }, + { REG_DWORD_SIZE, reg_gen | reg_dest, 0, "edi" }, + /* REG_WORD_OFFSET */ + { REG_WORD_SIZE, reg_gen | reg_ret, 3, "ax" }, + { REG_WORD_SIZE, reg_gen | reg_count, 6, "cx" }, + { REG_WORD_SIZE, reg_gen, 9, "dx" }, + { REG_WORD_SIZE, reg_gen, 12, "bx" }, + { REG_WORD_SIZE, reg_gen | reg_sp, 13, "sp" }, + { REG_WORD_SIZE, reg_gen | reg_fp, 14, "bp" }, + { REG_WORD_SIZE, reg_gen | reg_src, 15, "si" }, + { REG_WORD_SIZE, reg_gen | reg_dest, 16, "di" }, + /* REG_BYTE_OFFSET */ + { REG_BYTE_SIZE, reg_gen, 1, "al" }, + { REG_BYTE_SIZE, reg_gen, 4, "cl" }, + { REG_BYTE_SIZE, reg_gen, 7, "dl" }, + { REG_BYTE_SIZE, reg_gen, 10, "bl" }, + { REG_BYTE_SIZE, reg_gen, 2, "ah" }, + { REG_BYTE_SIZE, reg_gen, 5, "ch" }, + { REG_BYTE_SIZE, reg_gen, 8, "dh" }, + { REG_BYTE_SIZE, reg_gen, 11, "bh" }, + /* REG_MMX_OFFSET */ + { REG_MMX_SIZE, reg_simd, 18, "mm0" }, + { REG_MMX_SIZE, reg_simd, 19, "mm1" }, + { REG_MMX_SIZE, reg_simd, 20, "mm2" }, + { REG_MMX_SIZE, reg_simd, 21, "mm3" }, + { REG_MMX_SIZE, reg_simd, 22, "mm4" }, + { REG_MMX_SIZE, reg_simd, 23, "mm5" }, + { REG_MMX_SIZE, reg_simd, 24, "mm6" }, + { REG_MMX_SIZE, reg_simd, 25, "mm7" }, + /* REG_SIMD_OFFSET */ + { REG_SIMD_SIZE, reg_simd, 0, "xmm0" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm1" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm2" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm3" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm4" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm5" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm6" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm7" }, + /* REG_DEBUG_OFFSET */ + { REG_DEBUG_SIZE, reg_sys, 0, "dr0" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr1" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr2" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr3" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr4" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr5" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr6" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr7" }, + /* REG_CTRL_OFFSET */ + { REG_CTRL_SIZE, reg_sys, 0, "cr0" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr1" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr2" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr3" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr4" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr5" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr6" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr7" }, + /* REG_TEST_OFFSET */ + { REG_TEST_SIZE, reg_sys, 0, "tr0" }, + { REG_TEST_SIZE, reg_sys, 0, "tr1" }, + { REG_TEST_SIZE, reg_sys, 0, "tr2" }, + { REG_TEST_SIZE, reg_sys, 0, "tr3" }, + { REG_TEST_SIZE, reg_sys, 0, "tr4" }, + { REG_TEST_SIZE, reg_sys, 0, "tr5" }, + { REG_TEST_SIZE, reg_sys, 0, "tr6" }, + { REG_TEST_SIZE, reg_sys, 0, "tr7" }, + /* REG_SEG_OFFSET */ + { REG_SEG_SIZE, reg_seg, 0, "es" }, + { REG_SEG_SIZE, reg_seg, 0, "cs" }, + { REG_SEG_SIZE, reg_seg, 0, "ss" }, + { REG_SEG_SIZE, reg_seg, 0, "ds" }, + { REG_SEG_SIZE, reg_seg, 0, "fs" }, + { REG_SEG_SIZE, reg_seg, 0, "gs" }, + /* REG_LDTR_INDEX */ + { REG_DWORD_SIZE, reg_sys, 0, "ldtr" }, + /* REG_GDTR_INDEX */ + { REG_DWORD_SIZE, reg_sys, 0, "gdtr" }, + /* REG_FPU_OFFSET */ + { REG_FPU_SIZE, reg_fpu, 0, "st(0)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(1)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(2)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(3)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(4)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(5)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(6)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(7)" }, + /* REG_FLAGS_INDEX : 81 */ + { REG_FLAGS_SIZE, reg_cond, 0, "eflags" }, + /* REG_FPCTRL_INDEX : 82*/ + { REG_FPCTRL_SIZE, reg_fpu | reg_sys, 0, "fpctrl" }, + /* REG_FPSTATUS_INDEX : 83*/ + { REG_FPSTATUS_SIZE, reg_fpu | reg_sys, 0, "fpstat" }, + /* REG_FPTAG_INDEX : 84 */ + { REG_FPTAG_SIZE, reg_fpu | reg_sys, 0, "fptag" }, + /* REG_EIP_INDEX : 85 */ + { REG_EIP_SIZE, reg_pc, 0, "eip" }, + /* REG_IP_INDEX : 86 */ + { REG_IP_SIZE, reg_pc, 17, "ip" }, + /* REG_IDTR_INDEX : 87 */ + { REG_DWORD_SIZE, reg_sys, 0, "idtr" }, + /* REG_MXCSG_INDEX : SSE Control Reg : 88 */ + { REG_DWORD_SIZE, reg_sys | reg_simd, 0, "mxcsr" }, + /* REG_TR_INDEX : Task Register : 89 */ + { 16 + 64, reg_sys, 0, "tr" }, + /* REG_CSMSR_INDEX : SYSENTER_CS_MSR : 90 */ + { REG_DWORD_SIZE, reg_sys, 0, "cs_msr" }, + /* REG_ESPMSR_INDEX : SYSENTER_ESP_MSR : 91 */ + { REG_DWORD_SIZE, reg_sys, 0, "esp_msr" }, + /* REG_EIPMSR_INDEX : SYSENTER_EIP_MSR : 92 */ + { REG_DWORD_SIZE, reg_sys, 0, "eip_msr" }, + { 0 } + }; + + +static size_t sz_regtable = NUM_X86_REGS + 1; + + +void ia32_handle_register( x86_reg_t *reg, size_t id ) { + unsigned int alias; + if (! id || id > sz_regtable ) { + return; + } + + memset( reg, 0, sizeof(x86_reg_t) ); + + strncpy( reg->name, ia32_reg_table[id].mnemonic, MAX_REGNAME ); + + reg->type = ia32_reg_table[id].type; + reg->size = ia32_reg_table[id].size; + + alias = ia32_reg_table[id].alias; + if ( alias ) { + reg->alias = ia32_reg_aliases[alias].alias; + reg->shift = ia32_reg_aliases[alias].shift; + } + reg->id = id; + + return; +} + +size_t ia32_true_register_id( size_t id ) { + size_t reg; + + if (! id || id > sz_regtable ) { + return 0; + } + + reg = id; + if (ia32_reg_table[reg].alias) { + reg = ia32_reg_aliases[ia32_reg_table[reg].alias].alias; + } + return reg; +} diff --git a/src/third_party/libdisasm/ia32_reg.h b/src/third_party/libdisasm/ia32_reg.h new file mode 100644 index 0000000..fbbc77a --- /dev/null +++ b/src/third_party/libdisasm/ia32_reg.h @@ -0,0 +1,41 @@ +#ifndef IA32_REG_H +#define IA32_REG_H + +#include /* for size_t */ +#include "libdis.h" /* for x86_reg_t */ + +/* NOTE these are used in opcode tables for hard-coded registers */ +#define REG_DWORD_OFFSET 1 /* 0 + 1 */ +#define REG_ECX_INDEX 2 /* 0 + 1 + 1 */ +#define REG_ESP_INDEX 5 /* 0 + 4 + 1 */ +#define REG_EBP_INDEX 6 /* 0 + 5 + 1 */ +#define REG_ESI_INDEX 7 /* 0 + 6 + 1 */ +#define REG_EDI_INDEX 8 /* 0 + 7 + 1 */ +#define REG_WORD_OFFSET 9 /* 1 * 8 + 1 */ +#define REG_BYTE_OFFSET 17 /* 2 * 8 + 1 */ +#define REG_MMX_OFFSET 25 /* 3 * 8 + 1 */ +#define REG_SIMD_OFFSET 33 /* 4 * 8 + 1 */ +#define REG_DEBUG_OFFSET 41 /* 5 * 8 + 1 */ +#define REG_CTRL_OFFSET 49 /* 6 * 8 + 1 */ +#define REG_TEST_OFFSET 57 /* 7 * 8 + 1 */ +#define REG_SEG_OFFSET 65 /* 8 * 8 + 1 */ +#define REG_LDTR_INDEX 71 /* 8 * 8 + 1 + 1 */ +#define REG_GDTR_INDEX 72 /* 8 * 8 + 2 + 1 */ +#define REG_FPU_OFFSET 73 /* 9 * 8 + 1 */ +#define REG_FLAGS_INDEX 81 /* 10 * 8 + 1 */ +#define REG_FPCTRL_INDEX 82 /* 10 * 8 + 1 + 1 */ +#define REG_FPSTATUS_INDEX 83 /* 10 * 8 + 2 + 1 */ +#define REG_FPTAG_INDEX 84 /* 10 * 8 + 3 + 1 */ +#define REG_EIP_INDEX 85 /* 10 * 8 + 4 + 1 */ +#define REG_IP_INDEX 86 /* 10 * 8 + 5 + 1 */ +#define REG_IDTR_INDEX 87 /* 10 * 8 + 6 + 1 */ +#define REG_MXCSG_INDEX 88 /* 10 * 8 + 7 + 1 */ +#define REG_TR_INDEX 89 /* 10 * 8 + 8 + 1 */ +#define REG_CSMSR_INDEX 90 /* 10 * 8 + 9 + 1 */ +#define REG_ESPMSR_INDEX 91 /* 10 * 8 + 10 + 1 */ +#define REG_EIPMSR_INDEX 92 /* 10 * 8 + 11 + 1 */ + +void ia32_handle_register( x86_reg_t *reg, size_t id ); +size_t ia32_true_register_id( size_t id ); + +#endif diff --git a/src/third_party/libdisasm/ia32_settings.c b/src/third_party/libdisasm/ia32_settings.c new file mode 100644 index 0000000..b578e34 --- /dev/null +++ b/src/third_party/libdisasm/ia32_settings.c @@ -0,0 +1,13 @@ +#include "libdis.h" +#include "ia32_settings.h" +#include "ia32_reg.h" +#include "ia32_insn.h" + +ia32_settings_t ia32_settings = { + 1, 0xF4, + MAX_INSTRUCTION_SIZE, + 4, 4, 8, 4, 8, + REG_ESP_INDEX, REG_EBP_INDEX, REG_EIP_INDEX, REG_FLAGS_INDEX, + REG_DWORD_OFFSET, REG_SEG_OFFSET, REG_FPU_OFFSET, + opt_none +}; diff --git a/src/third_party/libdisasm/ia32_settings.h b/src/third_party/libdisasm/ia32_settings.h new file mode 100644 index 0000000..769c0e9 --- /dev/null +++ b/src/third_party/libdisasm/ia32_settings.h @@ -0,0 +1,27 @@ +#ifndef IA32_SETTINGS_H +#define IA32_SETTINGS_H + +#include "libdis.h" + +typedef struct { + /* options */ + unsigned char endian, /* 0 = big, 1 = little */ + wc_byte, /* wildcard byte */ + max_insn, /* max insn size */ + sz_addr, /* default address size */ + sz_oper, /* default operand size */ + sz_byte, /* # bits in byte */ + sz_word, /* # bytes in machine word */ + sz_dword; /* # bytes in machine dword */ + unsigned int id_sp_reg, /* id of stack pointer */ + id_fp_reg, /* id of frame pointer */ + id_ip_reg, /* id of instruction pointer */ + id_flag_reg, /* id of flags register */ + offset_gen_regs, /* start of general regs */ + offset_seg_regs, /* start of segment regs */ + offset_fpu_regs; /* start of floating point regs */ + /* user-controlled settings */ + enum x86_options options; +} ia32_settings_t; + +#endif diff --git a/src/third_party/libdisasm/libdis.h b/src/third_party/libdisasm/libdis.h new file mode 100644 index 0000000..83a8861 --- /dev/null +++ b/src/third_party/libdisasm/libdis.h @@ -0,0 +1,832 @@ +#ifndef LIBDISASM_H +#define LIBDISASM_H + +#include + +/* 'NEW" types + * __________________________________________________________________________*/ +#ifndef LIBDISASM_QWORD_H /* do not interfere with qword.h */ + #define LIBDISASM_QWORD_H + #ifdef _MSC_VER + typedef __int64 qword_t; + #else + typedef int64_t qword_t; + #endif +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* 'NEW" x86 API + * __________________________________________________________________________*/ + + +/* ========================================= Error Reporting */ +/* REPORT CODES + * These are passed to a reporter function passed at initialization. + * Each code determines the type of the argument passed to the reporter; + * this allows the report to recover from errors, or just log them. + */ +enum x86_report_codes { + report_disasm_bounds, /* RVA OUT OF BOUNDS : The disassembler could + not disassemble the supplied RVA as it is + out of the range of the buffer. The + application should store the address and + attempt to determine what section of the + binary it is in, then disassemble the + address from the bytes in that section. + data: uint32_t rva */ + report_insn_bounds, /* INSTRUCTION OUT OF BOUNDS: The disassembler + could not disassemble the instruction as + the instruction would require bytes beyond + the end of the current buffer. This usually + indicated garbage bytes at the end of a + buffer, or an incorrectly-sized buffer. + data: uint32_t rva */ + report_invalid_insn, /* INVALID INSTRUCTION: The disassembler could + not disassemble the instruction as it has an + invalid combination of opcodes and operands. + This will stop automated disassembly; the + application can restart the disassembly + after the invalid instruction. + data: uint32_t rva */ + report_unknown +}; + +/* 'arg' is optional arbitrary data provided by the code passing the + * callback -- for example, it could be 'this' or 'self' in OOP code. + * 'code' is provided by libdisasm, it is one of the above + * 'data' is provided by libdisasm and is context-specific, per the enums */ +typedef void (*DISASM_REPORTER)( enum x86_report_codes code, + void *data, void *arg ); + + +/* x86_report_error : Call the register reporter to report an error */ +void x86_report_error( enum x86_report_codes code, void *data ); + +/* ========================================= Libdisasm Management Routines */ +enum x86_options { /* these can be ORed together */ + opt_none= 0, + opt_ignore_nulls=1, /* ignore sequences of > 4 NULL bytes */ + opt_16_bit=2, /* 16-bit/DOS disassembly */ + opt_att_mnemonics=4, /* use AT&T syntax names for alternate opcode mnemonics */ +}; + +/* management routines */ +/* 'arg' is caller-specific data which is passed as the first argument + * to the reporter callback routine */ +int x86_init( enum x86_options options, DISASM_REPORTER reporter, void *arg); +void x86_set_reporter( DISASM_REPORTER reporter, void *arg); +void x86_set_options( enum x86_options options ); +enum x86_options x86_get_options( void ); +int x86_cleanup(void); + + +/* ========================================= Instruction Representation */ +/* these defines are only intended for use in the array decl's */ +#define MAX_REGNAME 8 + +#define MAX_PREFIX_STR 32 +#define MAX_MNEM_STR 16 +#define MAX_INSN_SIZE 20 /* same as in i386.h */ +#define MAX_OP_STRING 32 /* max possible operand size in string form */ +#define MAX_OP_RAW_STRING 64 /* max possible operand size in raw form */ +#define MAX_OP_XML_STRING 256 /* max possible operand size in xml form */ +#define MAX_NUM_OPERANDS 8 /* max # implicit and explicit operands */ +/* in these, the '2 *' is arbitrary: the max # of operands should require + * more space than the rest of the insn */ +#define MAX_INSN_STRING 512 /* 2 * 8 * MAX_OP_STRING */ +#define MAX_INSN_RAW_STRING 1024 /* 2 * 8 * MAX_OP_RAW_STRING */ +#define MAX_INSN_XML_STRING 4096 /* 2 * 8 * MAX_OP_XML_STRING */ + +enum x86_reg_type { /* NOTE: these may be ORed together */ + reg_gen = 0x00001, /* general purpose */ + reg_in = 0x00002, /* incoming args, ala RISC */ + reg_out = 0x00004, /* args to calls, ala RISC */ + reg_local = 0x00008, /* local vars, ala RISC */ + reg_fpu = 0x00010, /* FPU data register */ + reg_seg = 0x00020, /* segment register */ + reg_simd = 0x00040, /* SIMD/MMX reg */ + reg_sys = 0x00080, /* restricted/system register */ + reg_sp = 0x00100, /* stack pointer */ + reg_fp = 0x00200, /* frame pointer */ + reg_pc = 0x00400, /* program counter */ + reg_retaddr = 0x00800, /* return addr for func */ + reg_cond = 0x01000, /* condition code / flags */ + reg_zero = 0x02000, /* zero register, ala RISC */ + reg_ret = 0x04000, /* return value */ + reg_src = 0x10000, /* array/rep source */ + reg_dest = 0x20000, /* array/rep destination */ + reg_count = 0x40000 /* array/rep/loop counter */ +}; + +/* x86_reg_t : an X86 CPU register */ +typedef struct { + char name[MAX_REGNAME]; + enum x86_reg_type type; /* what register is used for */ + unsigned int size; /* size of register in bytes */ + unsigned int id; /* register ID #, for quick compares */ + unsigned int alias; /* ID of reg this is an alias for */ + unsigned int shift; /* amount to shift aliased reg by */ +} x86_reg_t; + +/* x86_ea_t : an X86 effective address (address expression) */ +typedef struct { + unsigned int scale; /* scale factor */ + x86_reg_t index, base; /* index, base registers */ + int32_t disp; /* displacement */ + char disp_sign; /* is negative? 1/0 */ + char disp_size; /* 0, 1, 2, 4 */ +} x86_ea_t; + +/* x86_absolute_t : an X86 segment:offset address (descriptor) */ +typedef struct { + unsigned short segment; /* loaded directly into CS */ + union { + unsigned short off16; /* loaded directly into IP */ + uint32_t off32; /* loaded directly into EIP */ + } offset; +} x86_absolute_t; + +enum x86_op_type { /* mutually exclusive */ + op_unused = 0, /* empty/unused operand: should never occur */ + op_register = 1, /* CPU register */ + op_immediate = 2, /* Immediate Value */ + op_relative_near = 3, /* Relative offset from IP */ + op_relative_far = 4, /* Relative offset from IP */ + op_absolute = 5, /* Absolute address (ptr16:32) */ + op_expression = 6, /* Address expression (scale/index/base/disp) */ + op_offset = 7, /* Offset from start of segment (m32) */ + op_unknown +}; + +#define x86_optype_is_address( optype ) \ + ( optype == op_absolute || optype == op_offset ) +#define x86_optype_is_relative( optype ) \ + ( optype == op_relative_near || optype == op_relative_far ) +#define x86_optype_is_memory( optype ) \ + ( optype > op_immediate && optype < op_unknown ) + +enum x86_op_datatype { /* these use Intel's lame terminology */ + op_byte = 1, /* 1 byte integer */ + op_word = 2, /* 2 byte integer */ + op_dword = 3, /* 4 byte integer */ + op_qword = 4, /* 8 byte integer */ + op_dqword = 5, /* 16 byte integer */ + op_sreal = 6, /* 4 byte real (single real) */ + op_dreal = 7, /* 8 byte real (double real) */ + op_extreal = 8, /* 10 byte real (extended real) */ + op_bcd = 9, /* 10 byte binary-coded decimal */ + op_ssimd = 10, /* 16 byte : 4 packed single FP (SIMD, MMX) */ + op_dsimd = 11, /* 16 byte : 2 packed double FP (SIMD, MMX) */ + op_sssimd = 12, /* 4 byte : scalar single FP (SIMD, MMX) */ + op_sdsimd = 13, /* 8 byte : scalar double FP (SIMD, MMX) */ + op_descr32 = 14, /* 6 byte Intel descriptor 2:4 */ + op_descr16 = 15, /* 4 byte Intel descriptor 2:2 */ + op_pdescr32 = 16, /* 6 byte Intel pseudo-descriptor 32:16 */ + op_pdescr16 = 17, /* 6 byte Intel pseudo-descriptor 8:24:16 */ + op_bounds16 = 18, /* signed 16:16 lower:upper bounds */ + op_bounds32 = 19, /* signed 32:32 lower:upper bounds */ + op_fpuenv16 = 20, /* 14 byte FPU control/environment data */ + op_fpuenv32 = 21, /* 28 byte FPU control/environment data */ + op_fpustate16 = 22, /* 94 byte FPU state (env & reg stack) */ + op_fpustate32 = 23, /* 108 byte FPU state (env & reg stack) */ + op_fpregset = 24, /* 512 bytes: register set */ + op_fpreg = 25, /* FPU register */ + op_none = 0xFF, /* operand without a datatype (INVLPG) */ +}; + +enum x86_op_access { /* ORed together */ + op_read = 1, + op_write = 2, + op_execute = 4 +}; + +enum x86_op_flags { /* ORed together, but segs are mutually exclusive */ + op_signed = 1, /* signed integer */ + op_string = 2, /* possible string or array */ + op_constant = 4, /* symbolic constant */ + op_pointer = 8, /* operand points to a memory address */ + op_sysref = 0x010, /* operand is a syscall number */ + op_implied = 0x020, /* operand is implicit in the insn */ + op_hardcode = 0x40, /* operand is hardcoded in insn definition */ + /* NOTE: an 'implied' operand is one which can be considered a side + * effect of the insn, e.g. %esp being modified by PUSH or POP. A + * 'hard-coded' operand is one which is specified in the instruction + * definition, e.g. %es:%edi in MOVSB or 1 in ROL Eb, 1. The difference + * is that hard-coded operands are printed by disassemblers and are + * required to re-assemble, while implicit operands are invisible. */ + op_es_seg = 0x100, /* ES segment override */ + op_cs_seg = 0x200, /* CS segment override */ + op_ss_seg = 0x300, /* SS segment override */ + op_ds_seg = 0x400, /* DS segment override */ + op_fs_seg = 0x500, /* FS segment override */ + op_gs_seg = 0x600 /* GS segment override */ +}; + +/* x86_op_t : an X86 instruction operand */ +typedef struct { + enum x86_op_type type; /* operand type */ + enum x86_op_datatype datatype; /* operand size */ + enum x86_op_access access; /* operand access [RWX] */ + enum x86_op_flags flags; /* misc flags */ + union { + /* sizeof will have to work on these union members! */ + /* immediate values */ + char sbyte; + short sword; + int32_t sdword; + qword_t sqword; + unsigned char byte; + unsigned short word; + uint32_t dword; + qword_t qword; + float sreal; + double dreal; + /* misc large/non-native types */ + unsigned char extreal[10]; + unsigned char bcd[10]; + qword_t dqword[2]; + unsigned char simd[16]; + unsigned char fpuenv[28]; + /* offset from segment */ + uint32_t offset; + /* ID of CPU register */ + x86_reg_t reg; + /* offsets from current insn */ + char relative_near; + int32_t relative_far; + /* segment:offset */ + x86_absolute_t absolute; + /* effective address [expression] */ + x86_ea_t expression; + } data; + /* this is needed to make formatting operands more sane */ + void * insn; /* pointer to x86_insn_t owning operand */ +} x86_op_t; + +/* Linked list of x86_op_t; provided for manual traversal of the operand + * list in an insn. Users wishing to add operands to this list, e.g. to add + * implicit operands, should use x86_operand_new in x86_operand_list.h */ +typedef struct x86_operand_list { + x86_op_t op; + struct x86_operand_list *next; +} x86_oplist_t; + +enum x86_insn_group { + insn_none = 0, /* invalid instruction */ + insn_controlflow = 1, + insn_arithmetic = 2, + insn_logic = 3, + insn_stack = 4, + insn_comparison = 5, + insn_move = 6, + insn_string = 7, + insn_bit_manip = 8, + insn_flag_manip = 9, + insn_fpu = 10, + insn_interrupt = 13, + insn_system = 14, + insn_other = 15 +}; + +enum x86_insn_type { + insn_invalid = 0, /* invalid instruction */ + /* insn_controlflow */ + insn_jmp = 0x1001, + insn_jcc = 0x1002, + insn_call = 0x1003, + insn_callcc = 0x1004, + insn_return = 0x1005, + /* insn_arithmetic */ + insn_add = 0x2001, + insn_sub = 0x2002, + insn_mul = 0x2003, + insn_div = 0x2004, + insn_inc = 0x2005, + insn_dec = 0x2006, + insn_shl = 0x2007, + insn_shr = 0x2008, + insn_rol = 0x2009, + insn_ror = 0x200A, + /* insn_logic */ + insn_and = 0x3001, + insn_or = 0x3002, + insn_xor = 0x3003, + insn_not = 0x3004, + insn_neg = 0x3005, + /* insn_stack */ + insn_push = 0x4001, + insn_pop = 0x4002, + insn_pushregs = 0x4003, + insn_popregs = 0x4004, + insn_pushflags = 0x4005, + insn_popflags = 0x4006, + insn_enter = 0x4007, + insn_leave = 0x4008, + /* insn_comparison */ + insn_test = 0x5001, + insn_cmp = 0x5002, + /* insn_move */ + insn_mov = 0x6001, /* move */ + insn_movcc = 0x6002, /* conditional move */ + insn_xchg = 0x6003, /* exchange */ + insn_xchgcc = 0x6004, /* conditional exchange */ + /* insn_string */ + insn_strcmp = 0x7001, + insn_strload = 0x7002, + insn_strmov = 0x7003, + insn_strstore = 0x7004, + insn_translate = 0x7005, /* xlat */ + /* insn_bit_manip */ + insn_bittest = 0x8001, + insn_bitset = 0x8002, + insn_bitclear = 0x8003, + /* insn_flag_manip */ + insn_clear_carry = 0x9001, + insn_clear_zero = 0x9002, + insn_clear_oflow = 0x9003, + insn_clear_dir = 0x9004, + insn_clear_sign = 0x9005, + insn_clear_parity = 0x9006, + insn_set_carry = 0x9007, + insn_set_zero = 0x9008, + insn_set_oflow = 0x9009, + insn_set_dir = 0x900A, + insn_set_sign = 0x900B, + insn_set_parity = 0x900C, + insn_tog_carry = 0x9010, + insn_tog_zero = 0x9020, + insn_tog_oflow = 0x9030, + insn_tog_dir = 0x9040, + insn_tog_sign = 0x9050, + insn_tog_parity = 0x9060, + /* insn_fpu */ + insn_fmov = 0xA001, + insn_fmovcc = 0xA002, + insn_fneg = 0xA003, + insn_fabs = 0xA004, + insn_fadd = 0xA005, + insn_fsub = 0xA006, + insn_fmul = 0xA007, + insn_fdiv = 0xA008, + insn_fsqrt = 0xA009, + insn_fcmp = 0xA00A, + insn_fcos = 0xA00C, + insn_fldpi = 0xA00D, + insn_fldz = 0xA00E, + insn_ftan = 0xA00F, + insn_fsine = 0xA010, + insn_fsys = 0xA020, + /* insn_interrupt */ + insn_int = 0xD001, + insn_intcc = 0xD002, /* not present in x86 ISA */ + insn_iret = 0xD003, + insn_bound = 0xD004, + insn_debug = 0xD005, + insn_trace = 0xD006, + insn_invalid_op = 0xD007, + insn_oflow = 0xD008, + /* insn_system */ + insn_halt = 0xE001, + insn_in = 0xE002, /* input from port/bus */ + insn_out = 0xE003, /* output to port/bus */ + insn_cpuid = 0xE004, + /* insn_other */ + insn_nop = 0xF001, + insn_bcdconv = 0xF002, /* convert to or from BCD */ + insn_szconv = 0xF003 /* change size of operand */ +}; + +/* These flags specify special characteristics of the instruction, such as + * whether the inatruction is privileged or whether it serializes the + * pipeline. + * NOTE : These may not be accurate for all instructions; updates to the + * opcode tables have not been completed. */ +enum x86_insn_note { + insn_note_ring0 = 1, /* Only available in ring 0 */ + insn_note_smm = 2, /* "" in System Management Mode */ + insn_note_serial = 4, /* Serializing instruction */ + insn_note_nonswap = 8, /* Does not swap arguments in att-style formatting */ + insn_note_nosuffix = 16, /* Does not have size suffix in att-style formatting */ +}; + +/* This specifies what effects the instruction has on the %eflags register */ +enum x86_flag_status { + insn_carry_set = 0x1, /* CF */ + insn_zero_set = 0x2, /* ZF */ + insn_oflow_set = 0x4, /* OF */ + insn_dir_set = 0x8, /* DF */ + insn_sign_set = 0x10, /* SF */ + insn_parity_set = 0x20, /* PF */ + insn_carry_or_zero_set = 0x40, + insn_zero_set_or_sign_ne_oflow = 0x80, + insn_carry_clear = 0x100, + insn_zero_clear = 0x200, + insn_oflow_clear = 0x400, + insn_dir_clear = 0x800, + insn_sign_clear = 0x1000, + insn_parity_clear = 0x2000, + insn_sign_eq_oflow = 0x4000, + insn_sign_ne_oflow = 0x8000 +}; + +/* The CPU model in which the insturction first appeared; this can be used + * to mask out instructions appearing in earlier or later models or to + * check the portability of a binary. + * NOTE : These may not be accurate for all instructions; updates to the + * opcode tables have not been completed. */ +enum x86_insn_cpu { + cpu_8086 = 1, /* Intel */ + cpu_80286 = 2, + cpu_80386 = 3, + cpu_80387 = 4, + cpu_80486 = 5, + cpu_pentium = 6, + cpu_pentiumpro = 7, + cpu_pentium2 = 8, + cpu_pentium3 = 9, + cpu_pentium4 = 10, + cpu_k6 = 16, /* AMD */ + cpu_k7 = 32, + cpu_athlon = 48 +}; + +/* CPU ISA subsets: These are derived from the Instruction Groups in + * Intel Vol 1 Chapter 5; they represent subsets of the IA32 ISA but + * do not reflect the 'type' of the instruction in the same way that + * x86_insn_group does. In short, these are AMD/Intel's somewhat useless + * designations. + * NOTE : These may not be accurate for all instructions; updates to the + * opcode tables have not been completed. */ +enum x86_insn_isa { + isa_gp = 1, /* general purpose */ + isa_fp = 2, /* floating point */ + isa_fpumgt = 3, /* FPU/SIMD management */ + isa_mmx = 4, /* Intel MMX */ + isa_sse1 = 5, /* Intel SSE SIMD */ + isa_sse2 = 6, /* Intel SSE2 SIMD */ + isa_sse3 = 7, /* Intel SSE3 SIMD */ + isa_3dnow = 8, /* AMD 3DNow! SIMD */ + isa_sys = 9 /* system instructions */ +}; + +enum x86_insn_prefix { + insn_no_prefix = 0, + insn_rep_zero = 1, /* REPZ and REPE */ + insn_rep_notzero = 2, /* REPNZ and REPNZ */ + insn_lock = 4 /* LOCK: */ +}; + +/* TODO: maybe provide insn_new/free(), and have disasm return new insn_t */ +/* x86_insn_t : an X86 instruction */ +typedef struct { + /* information about the instruction */ + uint32_t addr; /* load address */ + uint32_t offset; /* offset into file/buffer */ + enum x86_insn_group group; /* meta-type, e.g. INS_EXEC */ + enum x86_insn_type type; /* type, e.g. INS_BRANCH */ + enum x86_insn_note note; /* note, e.g. RING0 */ + unsigned char bytes[MAX_INSN_SIZE]; + unsigned char size; /* size of insn in bytes */ + /* 16/32-bit mode settings */ + unsigned char addr_size; /* default address size : 2 or 4 */ + unsigned char op_size; /* default operand size : 2 or 4 */ + /* CPU/instruction set */ + enum x86_insn_cpu cpu; + enum x86_insn_isa isa; + /* flags */ + enum x86_flag_status flags_set; /* flags set or tested by insn */ + enum x86_flag_status flags_tested; + /* stack */ + unsigned char stack_mod; /* 0 or 1 : is the stack modified? */ + int32_t stack_mod_val; /* val stack is modified by if known */ + + /* the instruction proper */ + enum x86_insn_prefix prefix; /* prefixes ORed together */ + char prefix_string[MAX_PREFIX_STR]; /* prefixes [might be truncated] */ + char mnemonic[MAX_MNEM_STR]; + x86_oplist_t *operands; /* list of explicit/implicit operands */ + size_t operand_count; /* total number of operands */ + size_t explicit_count; /* number of explicit operands */ + /* convenience fields for user */ + void *block; /* code block containing this insn */ + void *function; /* function containing this insn */ + int tag; /* tag the insn as seen/processed */ +} x86_insn_t; + + +/* returns 0 if an instruction is invalid, 1 if valid */ +int x86_insn_is_valid( x86_insn_t *insn ); + +/* DISASSEMBLY ROUTINES + * Canonical order of arguments is + * (buf, buf_len, buf_rva, offset, len, insn, func, arg, resolve_func) + * ...but of course all of these are not used at the same time. + */ + + +/* Function prototype for caller-supplied callback routine + * These callbacks are intended to process 'insn' further, e.g. by + * adding it to a linked list, database, etc */ +typedef void (*DISASM_CALLBACK)( x86_insn_t *insn, void * arg ); + +/* Function prototype for caller-supplied address resolver. + * This routine is used to determine the rva to disassemble next, given + * the 'dest' operand of a jump/call. This allows the caller to resolve + * jump/call targets stored in a register or on the stack, and also allows + * the caller to prevent endless loops by checking if an address has + * already been disassembled. If an address cannot be resolved from the + * operand, or if the address has already been disassembled, this routine + * should return -1; in all other cases the RVA to be disassembled next + * should be returned. */ +typedef int32_t (*DISASM_RESOLVER)( x86_op_t *op, x86_insn_t * current_insn, + void *arg ); + + +/* x86_disasm: Disassemble a single instruction from a buffer of bytes. + * Returns size of instruction in bytes. + * Caller is responsible for calling x86_oplist_free() on + * a reused "insn" to avoid leaking memory when calling this + * function repeatedly. + * buf : Buffer of bytes to disassemble + * buf_len : Length of the buffer + * buf_rva : Load address of the start of the buffer + * offset : Offset in buffer to disassemble + * insn : Structure to fill with disassembled instruction + */ +unsigned int x86_disasm( unsigned char *buf, unsigned int buf_len, + uint32_t buf_rva, unsigned int offset, + x86_insn_t * insn ); + +/* x86_disasm_range: Sequential disassembly of a range of bytes in a buffer, + * invoking a callback function each time an instruction + * is successfully disassembled. The 'range' refers to the + * bytes between 'offset' and 'offset + len' in the buffer; + * 'len' is assumed to be less than the length of the buffer. + * Returns number of instructions processed. + * buf : Buffer of bytes to disassemble (e.g. .text section) + * buf_rva : Load address of buffer (e.g. ELF Virtual Address) + * offset : Offset in buffer to start disassembly at + * len : Number of bytes to disassemble + * func : Callback function to invoke (may be NULL) + * arg : Arbitrary data to pass to callback (may be NULL) + */ +unsigned int x86_disasm_range( unsigned char *buf, uint32_t buf_rva, + unsigned int offset, unsigned int len, + DISASM_CALLBACK func, void *arg ); + +/* x86_disasm_forward: Flow-of-execution disassembly of the bytes in a buffer, + * invoking a callback function each time an instruction + * is successfully disassembled. + * buf : Buffer to disassemble (e.g. .text section) + * buf_len : Number of bytes in buffer + * buf_rva : Load address of buffer (e.g. ELF Virtual Address) + * offset : Offset in buffer to start disassembly at (e.g. entry point) + * func : Callback function to invoke (may be NULL) + * arg : Arbitrary data to pass to callback (may be NULL) + * resolver: Caller-supplied address resolver. If no resolver is + * supplied, a default internal one is used -- however the + * internal resolver does NOT catch loops and could end up + * disassembling forever.. + * r_arg : Arbitrary data to pass to resolver (may be NULL) + */ +unsigned int x86_disasm_forward( unsigned char *buf, unsigned int buf_len, + uint32_t buf_rva, unsigned int offset, + DISASM_CALLBACK func, void *arg, + DISASM_RESOLVER resolver, void *r_arg ); + +/* Instruction operands: these are stored as a list of explicit and + * implicit operands. It is recommended that the 'foreach' routines + * be used to when examining operands for purposes of data flow analysis */ + +/* Operand FOREACH callback: 'arg' is an abritrary parameter passed to the + * foreach routine, 'insn' is the x86_insn_t whose operands are being + * iterated over, and 'op' is the current x86_op_t */ +typedef void (*x86_operand_fn)(x86_op_t *op, x86_insn_t *insn, void *arg); + +/* FOREACH types: these are used to limit the foreach results to + * operands which match a certain "type" (implicit or explicit) + * or which are accessed in certain ways (e.g. read or write). Note + * that this operates on the operand list of single instruction, so + * specifying the 'real' operand type (register, memory, etc) is not + * useful. Note also that by definition Execute Access implies Read + * Access and implies Not Write Access. + * The "type" (implicit or explicit) and the access method can + * be ORed together, e.g. op_wo | op_explicit */ +enum x86_op_foreach_type { + op_any = 0, /* ALL operands (explicit, implicit, rwx) */ + op_dest = 1, /* operands with Write access */ + op_src = 2, /* operands with Read access */ + op_ro = 3, /* operands with Read but not Write access */ + op_wo = 4, /* operands with Write but not Read access */ + op_xo = 5, /* operands with Execute access */ + op_rw = 6, /* operands with Read AND Write access */ + op_implicit = 0x10, /* operands that are implied by the opcode */ + op_explicit = 0x20 /* operands that are not side-effects */ +}; + + +/* free the operand list associated with an instruction -- useful for + * preventing memory leaks when free()ing an x86_insn_t */ +void x86_oplist_free( x86_insn_t *insn ); + +/* Operand foreach: invokes 'func' with 'insn' and 'arg' as arguments. The + * 'type' parameter is used to select only operands matching specific + * criteria. */ +int x86_operand_foreach( x86_insn_t *insn, x86_operand_fn func, void *arg, + enum x86_op_foreach_type type); + +/* convenience routine: returns count of operands matching 'type' */ +size_t x86_operand_count( x86_insn_t *insn, enum x86_op_foreach_type type ); + +/* accessor functions for the operands */ +x86_op_t * x86_operand_1st( x86_insn_t *insn ); +x86_op_t * x86_operand_2nd( x86_insn_t *insn ); +x86_op_t * x86_operand_3rd( x86_insn_t *insn ); + +/* these allow libdisasm 2.0 accessor functions to still be used */ +#define x86_get_dest_operand( insn ) x86_operand_1st( insn ) +#define x86_get_src_operand( insn ) x86_operand_2nd( insn ) +#define x86_get_imm_operand( insn ) x86_operand_3rd( insn ) + +/* get size of operand data in bytes */ +unsigned int x86_operand_size( x86_op_t *op ); + +/* Operand Convenience Routines: the following three routines are common + * operations on operands, intended to ease the burden of the programmer. */ + +/* Get Address: return the value of an offset operand, or the offset of + * a segment:offset absolute address */ +uint32_t x86_get_address( x86_insn_t *insn ); + +/* Get Relative Offset: return as a sign-extended int32_t the near or far + * relative offset operand, or 0 if there is none. There can be only one + * relaive offset operand in an instruction. */ +int32_t x86_get_rel_offset( x86_insn_t *insn ); + +/* Get Branch Target: return the x86_op_t containing the target of + * a jump or call operand, or NULL if there is no branch target. + * Internally, a 'branch target' is defined as any operand with + * Execute Access set. There can be only one branch target per instruction. */ +x86_op_t * x86_get_branch_target( x86_insn_t *insn ); + +/* Get Immediate: return the x86_op_t containing the immediate operand + * for this instruction, or NULL if there is no immediate operand. There + * can be only one immediate operand per instruction */ +x86_op_t * x86_get_imm( x86_insn_t *insn ); + +/* Get Raw Immediate Data: returns a pointer to the immediate data encoded + * in the instruction. This is useful for large data types [>32 bits] currently + * not supported by libdisasm, or for determining if the disassembler + * screwed up the conversion of the immediate data. Note that 'imm' in this + * context refers to immediate data encoded at the end of an instruction as + * detailed in the Intel Manual Vol II Chapter 2; it does not refer to the + * 'op_imm' operand (the third operand in instructions like 'mul' */ +unsigned char * x86_get_raw_imm( x86_insn_t *insn ); + + +/* More accessor fuctions, this time for user-defined info... */ +/* set the address (usually RVA) of the insn */ +void x86_set_insn_addr( x86_insn_t *insn, uint32_t addr ); + +/* set the offset (usually offset into file) of the insn */ +void x86_set_insn_offset( x86_insn_t *insn, unsigned int offset ); + +/* set a pointer to the function owning the instruction. The + * type of 'func' is user-defined; libdisasm does not use the func field. */ +void x86_set_insn_function( x86_insn_t *insn, void * func ); + +/* set a pointer to the block of code owning the instruction. The + * type of 'block' is user-defined; libdisasm does not use the block field. */ +void x86_set_insn_block( x86_insn_t *insn, void * block ); + +/* instruction tagging: these routines allow the programmer to mark + * instructions as "seen" in a DFS, for example. libdisasm does not use + * the tag field.*/ +/* set insn->tag to 1 */ +void x86_tag_insn( x86_insn_t *insn ); +/* set insn->tag to 0 */ +void x86_untag_insn( x86_insn_t *insn ); +/* return insn->tag */ +int x86_insn_is_tagged( x86_insn_t *insn ); + + +/* Disassembly formats: + * AT&T is standard AS/GAS-style: "mnemonic\tsrc, dest, imm" + * Intel is standard MASM/NASM/TASM: "mnemonic\tdest,src, imm" + * Native is tab-delimited: "RVA\tbytes\tmnemonic\tdest\tsrc\timm" + * XML is your typical ... + * Raw is addr|offset|size|bytes|prefix... see libdisasm_formats.7 + */ +enum x86_asm_format { + unknown_syntax = 0, /* never use! */ + native_syntax, /* header: 35 bytes */ + intel_syntax, /* header: 23 bytes */ + att_syntax, /* header: 23 bytes */ + xml_syntax, /* header: 679 bytes */ + raw_syntax /* header: 172 bytes */ +}; + +/* format (sprintf) an operand into 'buf' using specified syntax */ +int x86_format_operand(x86_op_t *op, char *buf, int len, + enum x86_asm_format format); + +/* format (sprintf) an instruction mnemonic into 'buf' using specified syntax */ +int x86_format_mnemonic(x86_insn_t *insn, char *buf, int len, + enum x86_asm_format format); + +/* format (sprintf) an instruction into 'buf' using specified syntax; + * this includes formatting all operands */ +int x86_format_insn(x86_insn_t *insn, char *buf, int len, enum x86_asm_format); + +/* fill 'buf' with a description of the format's syntax */ +int x86_format_header( char *buf, int len, enum x86_asm_format format); + +/* Endianness of an x86 CPU : 0 is big, 1 is little; always returns 1 */ +unsigned int x86_endian(void); + +/* Default address and operand size in bytes */ +unsigned int x86_addr_size(void); +unsigned int x86_op_size(void); + +/* Size of a machine word in bytes */ +unsigned int x86_word_size(void); + +/* maximum size of a code instruction */ +#define x86_max_inst_size(x) x86_max_insn_size(x) +unsigned int x86_max_insn_size(void); + +/* register IDs of Stack, Frame, Instruction pointer and Flags register */ +unsigned int x86_sp_reg(void); +unsigned int x86_fp_reg(void); +unsigned int x86_ip_reg(void); +unsigned int x86_flag_reg(void); + +/* fill 'reg' struct with details of register 'id' */ +void x86_reg_from_id( unsigned int id, x86_reg_t * reg ); + +/* convenience macro demonstrating how to get an aliased register; proto is + * void x86_get_aliased_reg( x86_reg_t *alias_reg, x86_reg_t *output_reg ) + * where 'alias_reg' is a reg operand and 'output_reg' is filled with the + * register that the operand is an alias for */ +#define x86_get_aliased_reg( alias_reg, output_reg ) \ + x86_reg_from_id( alias_reg->alias, output_reg ) + + +/* ================================== Invariant Instruction Representation */ +/* Invariant instructions are used for generating binary signatures; + * the instruction is modified so that all variant bytes in an instruction + * are replaced with a wildcard byte. + * + * A 'variant byte' is one that is expected to be modified by either the + * static or the dynamic linker: for example, an address encoded in an + * instruction. + * + * By comparing the invariant representation of one instruction [or of a + * sequence of instructions] with the invariant representation of another, + * one determine whether the two invariant representations are from the same + * relocatable object [.o] file. Thus one can use binary signatures [which + * are just sequences of invariant instruction representations] to look for + * library routines which have been statically-linked into a binary. + * + * The invariant routines are faster and smaller than the disassembly + * routines; they can be used to determine the size of an instruction + * without all of the overhead of a full instruction disassembly. + */ + +/* This byte is used to replace variant bytes */ +#define X86_WILDCARD_BYTE 0xF4 + +typedef struct { + enum x86_op_type type; /* operand type */ + enum x86_op_datatype datatype; /* operand size */ + enum x86_op_access access; /* operand access [RWX] */ + enum x86_op_flags flags; /* misc flags */ +} x86_invariant_op_t; + +typedef struct { + unsigned char bytes[64]; /* invariant representation */ + unsigned int size; /* number of bytes in insn */ + enum x86_insn_group group; /* meta-type, e.g. INS_EXEC */ + enum x86_insn_type type; /* type, e.g. INS_BRANCH */ + x86_invariant_op_t operands[3]; /* operands: dest, src, imm */ +} x86_invariant_t; + + +/* return a version of the instruction with the variant bytes masked out */ +size_t x86_invariant_disasm( unsigned char *buf, int buf_len, + x86_invariant_t *inv ); +/* return the size in bytes of the intruction pointed to by 'buf'; + * this used x86_invariant_disasm since it faster than x86_disasm */ +size_t x86_size_disasm( unsigned char *buf, unsigned int buf_len ); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/src/third_party/libdisasm/qword.h b/src/third_party/libdisasm/qword.h new file mode 100644 index 0000000..5f0e803 --- /dev/null +++ b/src/third_party/libdisasm/qword.h @@ -0,0 +1,14 @@ +#ifndef LIBDISASM_QWORD_H +#define LIBDISASM_QWORD_H + +#include + +/* platform independent data types */ + +#ifdef _MSC_VER + typedef __int64 qword_t; +#else + typedef int64_t qword_t; +#endif + +#endif diff --git a/src/third_party/libdisasm/swig/Makefile b/src/third_party/libdisasm/swig/Makefile new file mode 100644 index 0000000..44ef486 --- /dev/null +++ b/src/third_party/libdisasm/swig/Makefile @@ -0,0 +1,70 @@ +# change these values if you need to +SWIG = swig # apt-get install swig ! +GCC = gcc + +CC_FLAGS = -c -fPIC +LD_FLAGS = -shared -L../.. -ldisasm + +BASE_NAME = x86disasm + +export INTERFACE_FILE BASE_NAME SWIG GCC CC_FLAGS LD_FLAGS + +#==================================================== +# TARGETS + +all: swig +dummy: swig swig-python swig-ruby swig-perl swig-tcl install uninstall clean + +swig: swig-python swig-perl +# swig-rub swig-tcl + +swig-python: + cd python && make -f Makefile-swig + +swig-ruby: + cd ruby && make -f Makefile-swig + +swig-perl: + cd perl && make -f Makefile-swig + +swig-tcl: + cd tcl && make -f Makefile-swig + +# ================================================================== +install: install-python install-perl +# install-ruby install-tcl + +install-python: + cd python && sudo make -f Makefile-swig install + +install-ruby: + cd ruby && sudo make -f Makefile-swig install + +install-perl: + cd perl && sudo make -f Makefile-swig install + +install-tcl: + cd tcl && sudo make -f Makefile-swig install + +# ================================================================== +uninstall: uninstall-python +#uninstall-ruby uninstall-perl uninstall-tcl + +uninstall-python: + cd python && sudo make -f Makefile-swig uninstall + +uninstall-ruby: + cd ruby && sudo make -f Makefile-swig uninstall + +uninstall-perl: + cd perl && sudo make -f Makefile-swig uninstall + +uninstall-tcl: + cd tcl && sudo make -f Makefile-swig uninstall + +# ================================================================== +clean: + cd python && make -f Makefile-swig clean + cd ruby && make -f Makefile-swig clean + cd perl && make -f Makefile-swig clean + cd tcl && make -f Makefile-swig clean diff --git a/src/third_party/libdisasm/swig/README b/src/third_party/libdisasm/swig/README new file mode 100644 index 0000000..a9fa79e --- /dev/null +++ b/src/third_party/libdisasm/swig/README @@ -0,0 +1,128 @@ + Libdisasm SWIG README + +The SWIG utility (www.swig.org) can be used to generate + + +Building SWIG Modules +--------------------- + + make + make install + +Make and Install both build Python, Perl, Ruby, and Tcl modules. If you +do not have one of these languages installed, comment out the relevant +target in the main Makefile. + +Install uses 'sudo' to put files in the correct locations; if you +do not have sudo installed, change the install targets. + +The Module API +-------------- + +The OOP API +----------- + + +The Python Module +----------------- + +To test that the module loads: + + bash# python + >>> import x86disasm + >>> x86disasm.version_string() + '0.21-pre' + >>>^D + bash# + + >>> import x86disasm + >>> import array + >>> disasm = x86disasm.X86_Disasm( ) + >>> tgt = open( "/tmp/a.out", "rb" ) + >>> tgt.seek( 0, 2 ) + >>> size = tgt.tell() + >>> tgt.seek( 0, 0 ) + >>> buf = array.array( 'B' ) + >>> buf.fromfile( tgt, size ) + >>> tgt.close() + >>> data = x86disasm.byteArray( size ) + >>> for i in range( size ): + ... data[i] = buf.pop(0) + ... + >>> del buf + >>> del tgt + >>> insn = disasm.disasm( data, size - 1, 0, 0 ) + >>> insn.format( x86disasm.att_syntax ) + 'jg\t0x00000047' + >>> insn.format( x86disasm.raw_syntax ) + '0x00000000|0x00000000|2|7F 45 |||controlflow|jcc|jg|80386|General Purpose|||zero_clear sign_eq_oflow |0|0|relative|sbyte|00000047|' + >>> ops = insn.operand_list() + >>> node = ops.first() + >>> while node is not None: + ... s = node.op.format(x86disasm.raw_syntax) + ... print s + ... node = ops.next() + ... + relative|sbyte|00000047| + + + + + + +The Perl Module +--------------- + +To test that the module loads: + + bash# perl + use x86disasm; + print x86disasm::version_string() . "\n"; + ^D + 0.21-pre + bash# + +The Ruby Module +--------------- + +To test that the module loads: + + bash# irb + irb(main):001:0> require 'x86disasm' + => true + irb(main):002:0> X86disasm.version_string() + => "0.21-pre" + irb(main):003:0> x = X86disasm::X86_Disasm.new + => # + irb(main):004:0> x.max_register_string() + => 8 + irb(main):003:0> ^D + bash# + +The Tcl Module +--------------- + +To test that the module loads: + + bash# tclsh + % load /usr/lib/tcl8.3/x86disasm.so X86disasm + % version_string + 0.21-pre + % ^D + bash# + + % x86_init 0 NULL NULL + OR + % x86disasm dis + _486b0708_p_x86disasm + % puts "[dis cget -last_error]" + 0 + + + + +The Interface Files +------------------- + + libdisasm.i -- interface file without shadow classes + libdisasm_oop.i -- interface file with shadow classes diff --git a/src/third_party/libdisasm/swig/libdisasm.i b/src/third_party/libdisasm/swig/libdisasm.i new file mode 100644 index 0000000..ec12041 --- /dev/null +++ b/src/third_party/libdisasm/swig/libdisasm.i @@ -0,0 +1,508 @@ +%module x86disasm +%{ +#include "../../libdis.h" +#include "../../../config.h" +%} + +%rename(version_string) x86_version_string; +%include "../../libdis.h" +#include "../../../config.h" + +%inline %{ + const char * x86_version_string( void ) { + return PACKAGE_VERSION; + } +%} + +%rename(report_codes) x86_report_codes; +%rename(report_error) x86_report_error; +%rename(options) x86_options; +%rename(init) x86_init; +%rename(set_reporter) x86_set_reporter; +%rename(set_options) x86_set_options; +%rename(options) x86_get_options; +%rename(cleanup) x86_cleanup; +%rename(reg_type) x86_reg_type; +%rename(reg) x86_reg_t; +%rename(eaddr) x86_ea_t; +%rename(op_type) x86_op_type; +%rename(optype_is_address) x86_optype_is_address; +%rename(optype_is_relative) x86_optype_is_relative; +%rename(op_datatype) x86_op_datatype; +%rename(op_access) x86_op_access; +%rename(op_flags) x86_op_flags; +%rename(operand) x86_op_t; +%rename(insn_group) x86_insn_group; +%rename(insn_type) x86_insn_type; +%rename(insn_note) x86_insn_note ; +%rename(flag_status) x86_flag_status; +%rename(insn_cpu) x86_insn_cpu ; +%rename(insn_isa) x86_insn_isa ; +%rename(insn_prefix) x86_insn_prefix ; +%rename(insn) x86_insn_t; +%rename(insn_is_valid) x86_insn_is_valid; +%rename(i_disasm) x86_disasm; +%rename(i_disasm_range) x86_disasm_range; +%rename(i_disasm_forward) x86_disasm_forward; +%rename(insn_operand_count) x86_operand_count; +%rename(insn_operand_1st) x86_operand_1st; +%rename(insn_operand_2nd) x86_operand_2nd; +%rename(insn_operand_3rd) x86_operand_3rd; +%rename(insn_dest_operand) x86_get_dest_operand; +%rename(insn_src_operand) x86_get_src_operand; +%rename(insn_imm_operand) x86_get_imm_operand; +%rename(operand_size) x86_operand_size; +%rename(insn_rel_offset) x86_get_rel_offset; +%rename(insn_branch_target) x86_get_branch_target; +%rename(insn_imm) x86_get_imm; +%rename(insn_raw_imm) x86_get_raw_imm; +%rename(insn_set_addr) x86_set_insn_addr; +%rename(insn_set_offset) x86_set_insn_offset; +%rename(insn_set_function) x86_set_insn_function; +%rename(insn_set_block) x86_set_insn_block; +%rename(insn_tag) x86_tag_insn; +%rename(insn_untag) x86_untag_insn; +%rename(insn_is_tagged) x86_insn_is_tagged; +%rename(asm_format) x86_asm_format; +%rename(operand_format) x86_format_operand; +%rename(insn_format_mnemonic) x86_format_mnemonic; +%rename(insn_format) x86_format_insn; +%rename(header_format) x86_format_header; +%rename(endian) x86_endian; +%rename(size_default_address) x86_addr_size; +%rename(size_default_operand) x86_op_size; +%rename(size_machine_word) x86_word_size; +%rename(size_max_insn) x86_max_insn_size; +%rename(reg_sp) x86_sp_reg; +%rename(reg_fp) x86_fp_reg; +%rename(reg_ip) x86_ip_reg; +%rename(reg_from_id) x86_reg_from_id; +%rename(reg_from_alias) x86_get_aliased_reg; +%rename(invariant_op) x86_invariant_op_t; +%rename(invariant) x86_invariant_t; +%rename(disasm_invariant) x86_invariant_disasm; +%rename(disasm_size) x86_size_disasm; + +%include "carrays.i" + +%array_class( unsigned char, byteArray ); + + +%apply (unsigned char *STRING, int LENGTH) { + (unsigned char *buf, size_t buf_len) +}; + + +%newobject x86_op_copy; +%inline %{ + x86_op_t * x86_op_copy( x86_op_t * src ) { + x86_op_t *op; + + if (! src ) { + return NULL; + } + + op = (x86_op_t *) calloc( sizeof(x86_op_t), 1 ); + if ( op ) { + memcpy( op, src, sizeof(x86_op_t) ); + } + + return op; + } + + typedef struct x86_op_list_node { + x86_op_t *op; + struct x86_op_list_node *next, *prev; + } x86_op_list_node; + + typedef struct x86_op_list { + size_t count; + x86_op_list_node *head, *tail, *curr; + } x86_op_list; + + x86_op_list * x86_op_list_new () { + x86_op_list *list = (x86_op_list *) + calloc( sizeof(x86_op_list), 1 ); + list->count = 0; + return list; + } + + void x86_op_list_free(x86_op_list *list) { + x86_op_list_node *node, *next; + + node = list->head; + while ( node ) { + next = node->next; + /* free( node->insn ); */ + free( node ); + node = next; + } + + free( list ); + } + + x86_op_list_node * x86_op_list_first(x86_op_list *list) { + return list->head; + } + + x86_op_list_node * x86_op_list_last(x86_op_list *list) { + return list->tail; + } + + x86_op_list_node * x86_op_list_next(x86_op_list *list) { + if (! list->curr ) { + list->curr = list->head; + return list->head; + } + + list->curr = list->curr->next; + return list->curr; + } + + x86_op_list_node * x86_op_list_prev(x86_op_list *list) { + if (! list->curr ) { + list->curr = list->tail; + return list->tail; + } + + list->curr = list->curr->prev; + return list->curr; + } + +%} + +%newobject x86_op_list_append; + +%inline %{ + void x86_op_list_append( x86_op_list * list, x86_op_t *op ) { + x86_op_list_node *node = (x86_op_list_node *) + calloc( sizeof(x86_op_list_node) , 1 ); + if (! node ) { + return; + } + + list->count++; + if ( ! list->tail ) { + list->head = list->tail = node; + } else { + list->tail->next = node; + node->prev = list->tail; + list->tail = node; + } + + node->op = x86_op_copy( op ); + } + + x86_oplist_t * x86_op_list_node_copy( x86_oplist_t * list ) { + x86_oplist_t *ptr; + ptr = (x86_oplist_t *) calloc( sizeof(x86_oplist_t), 1 ); + if ( ptr ) { + memcpy( &ptr->op, &list->op, sizeof(x86_op_t) ); + } + + return ptr; + } + + x86_insn_t * x86_insn_new() { + x86_insn_t *insn = (x86_insn_t *) + calloc( sizeof(x86_insn_t), 1 ); + return insn; + } + + void x86_insn_free( x86_insn_t *insn ) { + x86_oplist_free( insn ); + free( insn ); + } +%} + +%newobject x86_insn_copy; + +%inline %{ + x86_insn_t * x86_insn_copy( x86_insn_t *src) { + x86_oplist_t *ptr, *list, *last = NULL; + x86_insn_t *insn = (x86_insn_t *) + calloc( sizeof(x86_insn_t), 1 ); + + if ( insn ) { + memcpy( insn, src, sizeof(x86_insn_t) ); + insn->operands = NULL; + insn->block = NULL; + insn->function = NULL; + + /* copy operand list */ + for ( list = src->operands; list; list = list->next ) { + ptr = x86_op_list_node_copy( list ); + + if (! ptr ) { + continue; + } + + if ( insn->operands ) { + last->next = ptr; + } else { + insn->operands = ptr; + } + last = ptr; + } + } + + return insn; + } + + x86_op_list * x86_insn_op_list( x86_insn_t *insn ) { + x86_oplist_t *list = insn->operands; + x86_op_list *op_list = x86_op_list_new(); + + for ( list = insn->operands; list; list = list->next ) { + x86_op_list_append( op_list, &list->op ); + } + + return op_list; + } + + typedef struct x86_insn_list_node { + x86_insn_t *insn; + struct x86_insn_list_node *next, *prev; + } x86_insn_list_node; + + typedef struct x86_insn_list { + size_t count; + x86_insn_list_node *head, *tail, *curr; + } x86_insn_list; + +%} + +%newobject x86_insn_list_new; + +%inline %{ + x86_insn_list * x86_insn_list_new () { + x86_insn_list *list = (x86_insn_list *) + calloc( sizeof(x86_insn_list), 1 ); + list->count = 0; + return list; + } + + void x86_insn_list_free( x86_insn_list * list ) { + x86_insn_list_node *node, *next; + + if (! list ) { + return; + } + + node = list->head; + while ( node ) { + next = node->next; + /* free( node->insn ); */ + free( node ); + node = next; + } + + free( list ); + } + + x86_insn_list_node * x86_insn_list_first( x86_insn_list *list ) { + if (! list ) { + return NULL; + } + return list->head; + } + + x86_insn_list_node * x86_insn_list_last( x86_insn_list *list ) { + if (! list ) { + return NULL; + } + return list->tail; + } + + x86_insn_list_node * x86_insn_list_next( x86_insn_list *list ) { + if (! list ) { + return NULL; + } + if (! list->curr ) { + list->curr = list->head; + return list->head; + } + + list->curr = list->curr->next; + return list->curr; + } + + x86_insn_list_node * x86_insn_list_prev( x86_insn_list *list ) { + if (! list ) { + return NULL; + } + if (! list->curr ) { + list->curr = list->tail; + return list->tail; + } + + list->curr = list->curr->prev; + return list->curr; + } + +%} + +%newobject x86_insn_list_append; + +%inline %{ + void x86_insn_list_append( x86_insn_list *list, x86_insn_t *insn ) { + x86_insn_list_node *node; + if (! list ) { + return; + } + + node = (x86_insn_list_node *) + calloc( sizeof(x86_insn_list_node) , 1 ); + + if (! node ) { + return; + } + + list->count++; + if ( ! list->tail ) { + list->head = list->tail = node; + } else { + list->tail->next = node; + node->prev = list->tail; + list->tail = node; + } + + node->insn = x86_insn_copy( insn ); + } + + typedef struct { + enum x86_report_codes last_error; + void * last_error_data; + void * disasm_callback; + void * disasm_resolver; + } x86disasm; + + void x86_default_reporter( enum x86_report_codes code, + void *data, void *arg ) { + x86disasm *dis = (x86disasm *) arg; + if ( dis ) { + dis->last_error = code; + dis->last_error_data = data; + } + } + + void x86_default_callback( x86_insn_t *insn, void *arg ) { + x86_insn_list *list = (x86_insn_list *) arg; + if ( list ) { + x86_insn_list_append( list, insn ); + } + } + + /* TODO: resolver stack, maybe a callback */ + long x86_default_resolver( x86_op_t *op, x86_insn_t *insn, void *arg ) { + x86disasm *dis = (x86disasm *) arg; + if ( dis ) { + //return dis->resolver( op, insn ); + return 0; + } + + return 0; + } + + +%} + +%newobject x86disasm_new; + +%inline %{ + x86disasm * x86disasm_new ( enum x86_options options ) { + x86disasm * dis = (x86disasm *) + calloc( sizeof( x86disasm ), 1 ); + x86_init( options, x86_default_reporter, dis ); + return dis; + } + + void x86disasm_free( x86disasm * dis ) { + x86_cleanup(); + free( dis ); + } +%} + +%newobject x86_disasm; + +%inline %{ + x86_insn_t * disasm( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset ) { + x86_insn_t *insn = calloc( sizeof( x86_insn_t ), 1 ); + x86_disasm( buf, buf_len, buf_rva, offset, insn ); + return insn; + } + + int disasm_range( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset, + unsigned int len ) { + + x86_insn_list *list = x86_insn_list_new(); + + if ( len > buf_len ) { + len = buf_len; + } + + return x86_disasm_range( buf, buf_rva, offset, len, + x86_default_callback, list ); + } + + int disasm_forward( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset ) { + x86_insn_list *list = x86_insn_list_new(); + + /* use default resolver: damn SWIG callbacks! */ + return x86_disasm_forward( buf, buf_len, buf_rva, offset, + x86_default_callback, list, + x86_default_resolver, NULL ); + } + + size_t disasm_invariant( unsigned char *buf, size_t buf_len, + x86_invariant_t *inv ) { + return x86_invariant_disasm( buf, buf_len, inv ); + } + + size_t disasm_size( unsigned char *buf, size_t buf_len ) { + return x86_size_disasm( buf, buf_len ); + } + + int x86_max_operand_string( enum x86_asm_format format ) { + switch ( format ) { + case xml_syntax: + return MAX_OP_XML_STRING; + break; + case raw_syntax: + return MAX_OP_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + return MAX_OP_STRING; + break; + } + } + + + int x86_max_insn_string( enum x86_asm_format format ) { + switch ( format ) { + case xml_syntax: + return MAX_INSN_XML_STRING; + break; + case raw_syntax: + return MAX_INSN_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + return MAX_INSN_STRING; + break; + } + } + + int x86_max_num_operands( ) { return MAX_NUM_OPERANDS; } +%} + diff --git a/src/third_party/libdisasm/swig/libdisasm_oop.i b/src/third_party/libdisasm/swig/libdisasm_oop.i new file mode 100644 index 0000000..973a47e --- /dev/null +++ b/src/third_party/libdisasm/swig/libdisasm_oop.i @@ -0,0 +1,1114 @@ +%module x86disasm +%{ +#ifdef _MSC_VER + typedef __int64 qword; +#else + typedef long long qword; +#endif + +#include + +#define MAX_REGNAME 8 +#define MAX_PREFIX_STR 32 +#define MAX_MNEM_STR 16 +#define MAX_INSN_SIZE 20 +#define MAX_OP_STRING 32 +#define MAX_OP_RAW_STRING 64 +#define MAX_OP_XML_STRING 256 +#define MAX_NUM_OPERANDS 8 +#define MAX_INSN_STRING 512 +#define MAX_INSN_RAW_STRING 1024 +#define MAX_INSN_XML_STRING 4096 + +#include "../../../config.h" + + +const char * version_string( void ) { + return PACKAGE_VERSION; +} + +%} + +const char * version_string( void ); + +%rename(X86_Register) x86_reg_t; +%rename(X86_EAddr) x86_ea_t; +%rename(X86_Operand) x86_op_t; +//%rename(X86_OpList) x86_oplist_t; +%rename(X86_Insn) x86_insn_t; +%rename(X86_InvOperand) x86_invariant_op_t; +%rename(X86_Invariant) x86_invariant_t; + +%include "carrays.i" + +%array_class( unsigned char, byteArray ); + + +%apply (unsigned char *STRING, int LENGTH) { + (unsigned char *buf, size_t buf_len) +}; + + +%inline %{ + + +enum x86_asm_format { + unknown_syntax = 0, /* never use! */ + native_syntax, /* header: 35 bytes */ + intel_syntax, /* header: 23 bytes */ + att_syntax, /* header: 23 bytes */ + xml_syntax, /* header: 679 bytes */ + raw_syntax /* header: 172 bytes */ +}; +%} + +/* ================================================================== */ +/* operand class */ +%inline %{ + enum x86_reg_type { + reg_gen = 0x00001, reg_in = 0x00002, + reg_out = 0x00004, reg_local = 0x00008, + reg_fpu = 0x00010, reg_seg = 0x00020, + reg_simd = 0x00040, reg_sys = 0x00080, + reg_sp = 0x00100, reg_fp = 0x00200, + reg_pc = 0x00400, reg_retaddr = 0x00800, + reg_cond = 0x01000, reg_zero = 0x02000, + reg_ret = 0x04000, reg_src = 0x10000, + reg_dest = 0x20000, reg_count = 0x40000 + }; + + typedef struct { + char name[MAX_REGNAME]; + enum x86_reg_type type; + unsigned int size; + unsigned int id; + unsigned int alias; + unsigned int shift; + } x86_reg_t; + + void x86_reg_from_id( unsigned int id, x86_reg_t * reg ); + + typedef struct { + unsigned int scale; + x86_reg_t index, base; + long disp; + char disp_sign; + char disp_size; + } x86_ea_t; + + enum x86_op_type { + op_unused = 0, + op_register = 1, + op_immediate = 2, + op_relative_near = 3, + op_relative_far = 4, + op_absolute = 5, + op_expression = 6, + op_offset = 7, + op_unknown + }; + + enum x86_op_datatype { + op_byte = 1, op_word = 2, + op_dword = 3, op_qword = 4, + op_dqword = 5, op_sreal = 6, + op_dreal = 7, op_extreal = 8, + op_bcd = 9, op_ssimd = 10, + op_dsimd = 11, op_sssimd = 12, + op_sdsimd = 13, op_descr32 = 14, + op_descr16 = 15, op_pdescr32 = 16, + op_pdescr16 = 17, op_fpuenv = 18, + op_fpregset = 19, + }; + + enum x86_op_access { + op_read = 1, + op_write = 2, + op_execute = 4 + }; + + enum x86_op_flags { + op_signed = 1, op_string = 2, + op_constant = 4, op_pointer = 8, + op_sysref = 0x010, op_implied = 0x020, + op_hardcode = 0x40, op_es_seg = 0x100, + op_cs_seg = 0x200, op_ss_seg = 0x300, + op_ds_seg = 0x400, op_fs_seg = 0x500, + op_gs_seg = 0x600 + }; + + typedef struct { + enum x86_op_type type; + enum x86_op_datatype datatype; + enum x86_op_access access; + enum x86_op_flags flags; + union { + char sbyte; + short sword; + long sdword; + qword sqword; + unsigned char byte; + unsigned short word; + unsigned long dword; + qword qword; + float sreal; + double dreal; + unsigned char extreal[10]; + unsigned char bcd[10]; + qword dqword[2]; + unsigned char simd[16]; + unsigned char fpuenv[28]; + void * address; + unsigned long offset; + x86_reg_t reg; + char relative_near; + long relative_far; + x86_ea_t expression; + } data; + void * insn; + } x86_op_t; + + unsigned int x86_operand_size( x86_op_t *op ); + + int x86_format_operand(x86_op_t *op, char *buf, int len, + enum x86_asm_format format); +%} + +%extend x86_reg_t{ + x86_reg_t * aliased_reg( ) { + x86_reg_t * reg = (x86_reg_t * ) + calloc( sizeof(x86_reg_t), 1 ); + x86_reg_from_id( self->id, reg ); + return reg; + } +} + +%extend x86_op_t{ + size_t size() { + return x86_operand_size( self ); + } + char * format( enum x86_asm_format format ) { + char *buf, *str; + size_t len; + + switch ( format ) { + case xml_syntax: + len = MAX_OP_XML_STRING; + break; + case raw_syntax: + len = MAX_OP_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + len = MAX_OP_STRING; + break; + } + + buf = (char * ) calloc( len + 1, 1 ); + x86_format_operand( self, buf, len, format ); + + /* drop buffer down to a reasonable size */ + str = strdup( buf ); + free(buf); + return str; + } + + int is_address( ) { + if ( self->type == op_absolute || + self->type == op_offset ) { + return 1; + } + + return 0; + } + + int is_relative( ) { + if ( self->type == op_relative_near || + self->type == op_relative_far ) { + return 1; + } + + return 0; + } + + %newobject copy; + x86_op_t * copy() { + x86_op_t *op = (x86_op_t *) calloc( sizeof(x86_op_t), 1 ); + + if ( op ) { + memcpy( op, self, sizeof(x86_op_t) ); + } + + return op; + } +} + +/* ================================================================== */ +/* operand list class */ +%inline %{ + typedef struct X86_OpListNode { + x86_op_t *op; + struct X86_OpListNode *next, *prev; + } X86_OpListNode; + + typedef struct X86_OpList { + size_t count; + X86_OpListNode *head, *tail, *curr; + } X86_OpList; +%} + +%extend X86_OpList { + X86_OpList () { + X86_OpList *list = (X86_OpList *) + calloc( sizeof(X86_OpList), 1 ); + list->count = 0; + return list; + } + + ~X86_OpList() { + X86_OpListNode *node, *next; + + node = self->head; + while ( node ) { + next = node->next; + /* free( node->insn ); */ + free( node ); + node = next; + } + + free( self ); + } + + X86_OpListNode * first() { + self->curr = self->head; + return self->head; + } + + X86_OpListNode * last() { + self->curr = self->tail; + return self->tail; + } + + X86_OpListNode * next() { + if (! self->curr ) { + self->curr = self->head; + return self->head; + } + + self->curr = self->curr->next; + return self->curr; + } + + X86_OpListNode * prev() { + if (! self->curr ) { + self->curr = self->tail; + return self->tail; + } + + self->curr = self->curr->prev; + return self->curr; + } + + %newobject append; + void append( x86_op_t *op ) { + X86_OpListNode *node = (X86_OpListNode *) + calloc( sizeof(X86_OpListNode) , 1 ); + if (! node ) { + return; + } + + self->count++; + if ( ! self->tail ) { + self->head = self->tail = node; + } else { + self->tail->next = node; + node->prev = self->tail; + self->tail = node; + } + + node->op = x86_op_t_copy( op ); + } +} + +%inline %{ + typedef struct x86_operand_list { + x86_op_t op; + struct x86_operand_list *next; + } x86_oplist_t; +%} + +%extend x86_oplist_t { + %newobject x86_oplist_node_copy; +} + +/* ================================================================== */ +/* instruction class */ +%inline %{ + x86_oplist_t * x86_oplist_node_copy( x86_oplist_t * list ) { + x86_oplist_t *ptr; + ptr = (x86_oplist_t *) calloc( sizeof(x86_oplist_t), 1 ); + if ( ptr ) { + memcpy( &ptr->op, &list->op, sizeof(x86_op_t) ); + } + + return ptr; + } + + enum x86_insn_group { + insn_none = 0, insn_controlflow = 1, + insn_arithmetic = 2, insn_logic = 3, + insn_stack = 4, insn_comparison = 5, + insn_move = 6, insn_string = 7, + insn_bit_manip = 8, insn_flag_manip = 9, + insn_fpu = 10, insn_interrupt = 13, + insn_system = 14, insn_other = 15 + }; + + enum x86_insn_type { + insn_invalid = 0, insn_jmp = 0x1001, + insn_jcc = 0x1002, insn_call = 0x1003, + insn_callcc = 0x1004, insn_return = 0x1005, + insn_add = 0x2001, insn_sub = 0x2002, + insn_mul = 0x2003, insn_div = 0x2004, + insn_inc = 0x2005, insn_dec = 0x2006, + insn_shl = 0x2007, insn_shr = 0x2008, + insn_rol = 0x2009, insn_ror = 0x200A, + insn_and = 0x3001, insn_or = 0x3002, + insn_xor = 0x3003, insn_not = 0x3004, + insn_neg = 0x3005, insn_push = 0x4001, + insn_pop = 0x4002, insn_pushregs = 0x4003, + insn_popregs = 0x4004, insn_pushflags = 0x4005, + insn_popflags = 0x4006, insn_enter = 0x4007, + insn_leave = 0x4008, insn_test = 0x5001, + insn_cmp = 0x5002, insn_mov = 0x6001, + insn_movcc = 0x6002, insn_xchg = 0x6003, + insn_xchgcc = 0x6004, insn_strcmp = 0x7001, + insn_strload = 0x7002, insn_strmov = 0x7003, + insn_strstore = 0x7004, insn_translate = 0x7005, + insn_bittest = 0x8001, insn_bitset = 0x8002, + insn_bitclear = 0x8003, insn_clear_carry = 0x9001, + insn_clear_zero = 0x9002, insn_clear_oflow = 0x9003, + insn_clear_dir = 0x9004, insn_clear_sign = 0x9005, + insn_clear_parity = 0x9006, insn_set_carry = 0x9007, + insn_set_zero = 0x9008, insn_set_oflow = 0x9009, + insn_set_dir = 0x900A, insn_set_sign = 0x900B, + insn_set_parity = 0x900C, insn_tog_carry = 0x9010, + insn_tog_zero = 0x9020, insn_tog_oflow = 0x9030, + insn_tog_dir = 0x9040, insn_tog_sign = 0x9050, + insn_tog_parity = 0x9060, insn_fmov = 0xA001, + insn_fmovcc = 0xA002, insn_fneg = 0xA003, + insn_fabs = 0xA004, insn_fadd = 0xA005, + insn_fsub = 0xA006, insn_fmul = 0xA007, + insn_fdiv = 0xA008, insn_fsqrt = 0xA009, + insn_fcmp = 0xA00A, insn_fcos = 0xA00C, + insn_fldpi = 0xA00D, insn_fldz = 0xA00E, + insn_ftan = 0xA00F, insn_fsine = 0xA010, + insn_fsys = 0xA020, insn_int = 0xD001, + insn_intcc = 0xD002, insn_iret = 0xD003, + insn_bound = 0xD004, insn_debug = 0xD005, + insn_trace = 0xD006, insn_invalid_op = 0xD007, + insn_oflow = 0xD008, insn_halt = 0xE001, + insn_in = 0xE002, insn_out = 0xE003, + insn_cpuid = 0xE004, insn_nop = 0xF001, + insn_bcdconv = 0xF002, insn_szconv = 0xF003 + }; + + enum x86_insn_note { + insn_note_ring0 = 1, + insn_note_smm = 2, + insn_note_serial = 4 + }; + + enum x86_flag_status { + insn_carry_set = 0x1, + insn_zero_set = 0x2, + insn_oflow_set = 0x4, + insn_dir_set = 0x8, + insn_sign_set = 0x10, + insn_parity_set = 0x20, + insn_carry_or_zero_set = 0x40, + insn_zero_set_or_sign_ne_oflow = 0x80, + insn_carry_clear = 0x100, + insn_zero_clear = 0x200, + insn_oflow_clear = 0x400, + insn_dir_clear = 0x800, + insn_sign_clear = 0x1000, + insn_parity_clear = 0x2000, + insn_sign_eq_oflow = 0x4000, + insn_sign_ne_oflow = 0x8000 + }; + + enum x86_insn_cpu { + cpu_8086 = 1, cpu_80286 = 2, + cpu_80386 = 3, cpu_80387 = 4, + cpu_80486 = 5, cpu_pentium = 6, + cpu_pentiumpro = 7, cpu_pentium2 = 8, + cpu_pentium3 = 9, cpu_pentium4 = 10, + cpu_k6 = 16, cpu_k7 = 32, + cpu_athlon = 48 + }; + + enum x86_insn_isa { + isa_gp = 1, isa_fp = 2, + isa_fpumgt = 3, isa_mmx = 4, + isa_sse1 = 5, isa_sse2 = 6, + isa_sse3 = 7, isa_3dnow = 8, + isa_sys = 9 + }; + + enum x86_insn_prefix { + insn_no_prefix = 0, + insn_rep_zero = 1, + insn_rep_notzero = 2, + insn_lock = 4 + }; + + + typedef struct { + unsigned long addr; + unsigned long offset; + enum x86_insn_group group; + enum x86_insn_type type; + enum x86_insn_note note; + unsigned char bytes[MAX_INSN_SIZE]; + unsigned char size; + unsigned char addr_size; + unsigned char op_size; + enum x86_insn_cpu cpu; + enum x86_insn_isa isa; + enum x86_flag_status flags_set; + enum x86_flag_status flags_tested; + unsigned char stack_mod; + long stack_mod_val; + enum x86_insn_prefix prefix; + char prefix_string[MAX_PREFIX_STR]; + char mnemonic[MAX_MNEM_STR]; + x86_oplist_t *operands; + size_t operand_count; + size_t explicit_count; + void *block; + void *function; + int tag; + } x86_insn_t; + + typedef void (*x86_operand_fn)(x86_op_t *op, x86_insn_t *insn, + void *arg); + + enum x86_op_foreach_type { + op_any = 0, + op_dest = 1, + op_src = 2, + op_ro = 3, + op_wo = 4, + op_xo = 5, + op_rw = 6, + op_implicit = 0x10, + op_explicit = 0x20 + }; + + size_t x86_operand_count( x86_insn_t *insn, + enum x86_op_foreach_type type ); + x86_op_t * x86_operand_1st( x86_insn_t *insn ); + x86_op_t * x86_operand_2nd( x86_insn_t *insn ); + x86_op_t * x86_operand_3rd( x86_insn_t *insn ); + long x86_get_rel_offset( x86_insn_t *insn ); + x86_op_t * x86_get_branch_target( x86_insn_t *insn ); + x86_op_t * x86_get_imm( x86_insn_t *insn ); + unsigned char * x86_get_raw_imm( x86_insn_t *insn ); + void x86_set_insn_addr( x86_insn_t *insn, unsigned long addr ); + int x86_format_mnemonic(x86_insn_t *insn, char *buf, int len, + enum x86_asm_format format); + int x86_format_insn(x86_insn_t *insn, char *buf, int len, + enum x86_asm_format); + void x86_oplist_free( x86_insn_t *insn ); + int x86_insn_is_valid( x86_insn_t *insn ); +%} + +%extend x86_insn_t { + x86_insn_t() { + x86_insn_t *insn = (x86_insn_t *) + calloc( sizeof(x86_insn_t), 1 ); + return insn; + } + ~x86_insn_t() { + x86_oplist_free( self ); + free( self ); + } + + int is_valid( ) { + return x86_insn_is_valid( self ); + } + + x86_op_t * operand_1st() { + return x86_operand_1st( self ); + } + + x86_op_t * operand_2nd() { + return x86_operand_2nd( self ); + } + + x86_op_t * operand_3rd() { + return x86_operand_3rd( self ); + } + + x86_op_t * operand_dest() { + return x86_operand_1st( self ); + } + + x86_op_t * operand_src() { + return x86_operand_2nd( self ); + } + + size_t num_operands( enum x86_op_foreach_type type ) { + return x86_operand_count( self, type ); + } + + long rel_offset() { + return x86_get_rel_offset( self ); + } + + x86_op_t * branch_target() { + return x86_get_branch_target( self ); + } + + x86_op_t * imm() { + return x86_get_imm( self ); + } + + unsigned char * raw_imm() { + return x86_get_raw_imm( self ); + } + + %newobject format; + char * format( enum x86_asm_format format ) { + char *buf, *str; + size_t len; + + switch ( format ) { + case xml_syntax: + len = MAX_INSN_XML_STRING; + break; + case raw_syntax: + len = MAX_INSN_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + len = MAX_INSN_STRING; + break; + } + + buf = (char * ) calloc( len + 1, 1 ); + x86_format_insn( self, buf, len, format ); + + /* drop buffer down to a reasonable size */ + str = strdup( buf ); + free(buf); + return str; + } + + %newobject format_mnemonic; + char * format_mnemonic( enum x86_asm_format format ) { + char *buf, *str; + size_t len = MAX_MNEM_STR + MAX_PREFIX_STR + 4; + + buf = (char * ) calloc( len, 1 ); + x86_format_mnemonic( self, buf, len, format ); + + /* drop buffer down to a reasonable size */ + str = strdup( buf ); + free(buf); + + return str; + } + + %newobject copy; + x86_insn_t * copy() { + x86_oplist_t *ptr, *list, *last = NULL; + x86_insn_t *insn = (x86_insn_t *) + calloc( sizeof(x86_insn_t), 1 ); + + if ( insn ) { + memcpy( insn, self, sizeof(x86_insn_t) ); + insn->operands = NULL; + insn->block = NULL; + insn->function = NULL; + + /* copy operand list */ + for ( list = self->operands; list; list = list->next ) { + ptr = x86_oplist_node_copy( list ); + + if (! ptr ) { + continue; + } + + if ( insn->operands ) { + last->next = ptr; + } else { + insn->operands = ptr; + } + last = ptr; + } + } + + return insn; + } + + X86_OpList * operand_list( ) { + x86_oplist_t *list = self->operands; + X86_OpList *op_list = new_X86_OpList(); + + for ( list = self->operands; list; list = list->next ) { + X86_OpList_append( op_list, &list->op ); + } + + return op_list; + } +} + +/* ================================================================== */ +/* invariant instruction class */ +%inline %{ + #define X86_WILDCARD_BYTE 0xF4 + + typedef struct { + enum x86_op_type type; + enum x86_op_datatype datatype; + enum x86_op_access access; + enum x86_op_flags flags; + } x86_invariant_op_t; + + typedef struct { + unsigned char bytes[64]; + unsigned int size; + enum x86_insn_group group; + enum x86_insn_type type; + x86_invariant_op_t operands[3]; + } x86_invariant_t; +%} + +%extend x86_invariant_t { + + x86_invariant_t() { + x86_invariant_t *inv = (x86_invariant_t *) + calloc( sizeof(x86_invariant_t), 1 ); + return inv; + } + + ~x86_invariant_t() { + free( self ); + } +} + +/* ================================================================== */ +/* instruction list class */ +%inline %{ + typedef struct X86_InsnListNode { + x86_insn_t *insn; + struct X86_InsnListNode *next, *prev; + } X86_InsnListNode; + + typedef struct X86_InsnList { + size_t count; + X86_InsnListNode *head, *tail, *curr; + } X86_InsnList; +%} + +%extend X86_InsnList { + X86_InsnList () { + X86_InsnList *list = (X86_InsnList *) + calloc( sizeof(X86_InsnList), 1 ); + list->count = 0; + return list; + } + + ~X86_InsnList() { + X86_InsnListNode *node, *next; + + node = self->head; + while ( node ) { + next = node->next; + /* free( node->insn ); */ + free( node ); + node = next; + } + + free( self ); + } + + X86_InsnListNode * first() { return self->head; } + + X86_InsnListNode * last() { return self->tail; } + + X86_InsnListNode * next() { + if (! self->curr ) { + self->curr = self->head; + return self->head; + } + + self->curr = self->curr->next; + return self->curr; + } + + X86_InsnListNode * prev() { + if (! self->curr ) { + self->curr = self->tail; + return self->tail; + } + + self->curr = self->curr->prev; + return self->curr; + } + + %newobject append; + void append( x86_insn_t *insn ) { + X86_InsnListNode *node = (X86_InsnListNode *) + calloc( sizeof(X86_InsnListNode) , 1 ); + if (! node ) { + return; + } + + self->count++; + if ( ! self->tail ) { + self->head = self->tail = node; + } else { + self->tail->next = node; + node->prev = self->tail; + self->tail = node; + } + + node->insn = x86_insn_t_copy( insn ); + } +} + +/* ================================================================== */ +/* address table class */ +/* slight TODO */ + +/* ================================================================== */ +/* Main disassembler class */ +%inline %{ + + enum x86_options { + opt_none= 0, + opt_ignore_nulls=1, + opt_16_bit=2 + }; + enum x86_report_codes { + report_disasm_bounds, + report_insn_bounds, + report_invalid_insn, + report_unknown + }; + + + typedef struct { + enum x86_report_codes last_error; + void * last_error_data; + void * disasm_callback; + void * disasm_resolver; + } X86_Disasm; + + typedef void (*DISASM_REPORTER)( enum x86_report_codes code, + void *data, void *arg ); + typedef void (*DISASM_CALLBACK)( x86_insn_t *insn, void * arg ); + typedef long (*DISASM_RESOLVER)( x86_op_t *op, + x86_insn_t * current_insn, + void *arg ); + + void x86_report_error( enum x86_report_codes code, void *data ); + int x86_init( enum x86_options options, DISASM_REPORTER reporter, + void *arg); + void x86_set_reporter( DISASM_REPORTER reporter, void *arg); + void x86_set_options( enum x86_options options ); + enum x86_options x86_get_options( void ); + int x86_cleanup(void); + int x86_format_header( char *buf, int len, enum x86_asm_format format); + unsigned int x86_endian(void); + unsigned int x86_addr_size(void); + unsigned int x86_op_size(void); + unsigned int x86_word_size(void); + unsigned int x86_max_insn_size(void); + unsigned int x86_sp_reg(void); + unsigned int x86_fp_reg(void); + unsigned int x86_ip_reg(void); + size_t x86_invariant_disasm( unsigned char *buf, int buf_len, + x86_invariant_t *inv ); + size_t x86_size_disasm( unsigned char *buf, unsigned int buf_len ); + int x86_disasm( unsigned char *buf, unsigned int buf_len, + unsigned long buf_rva, unsigned int offset, + x86_insn_t * insn ); + int x86_disasm_range( unsigned char *buf, unsigned long buf_rva, + unsigned int offset, unsigned int len, + DISASM_CALLBACK func, void *arg ); + int x86_disasm_forward( unsigned char *buf, unsigned int buf_len, + unsigned long buf_rva, unsigned int offset, + DISASM_CALLBACK func, void *arg, + DISASM_RESOLVER resolver, void *r_arg ); + + void x86_default_reporter( enum x86_report_codes code, + void *data, void *arg ) { + X86_Disasm *dis = (X86_Disasm *) arg; + if ( dis ) { + dis->last_error = code; + dis->last_error_data = data; + } + } + + void x86_default_callback( x86_insn_t *insn, void *arg ) { + X86_InsnList *list = (X86_InsnList *) arg; + if ( list ) { + X86_InsnList_append( list, insn ); + } + } + + /* TODO: resolver stack, maybe a callback */ + long x86_default_resolver( x86_op_t *op, x86_insn_t *insn, void *arg ) { + X86_Disasm *dis = (X86_Disasm *) arg; + if ( dis ) { + //return dis->resolver( op, insn ); + return 0; + } + + return 0; + } + +%} + +%extend X86_Disasm { + + X86_Disasm( ) { + X86_Disasm * dis = (X86_Disasm *) + calloc( sizeof( X86_Disasm ), 1 ); + x86_init( opt_none, x86_default_reporter, dis ); + return dis; + } + + X86_Disasm( enum x86_options options ) { + X86_Disasm * dis = (X86_Disasm *) + calloc( sizeof( X86_Disasm ), 1 ); + x86_init( options, x86_default_reporter, dis ); + return dis; + } + + X86_Disasm( enum x86_options options, DISASM_REPORTER reporter ) { + X86_Disasm * dis = (X86_Disasm *) + calloc( sizeof( X86_Disasm ), 1 ); + x86_init( options, reporter, NULL ); + return dis; + } + + X86_Disasm( enum x86_options options, DISASM_REPORTER reporter, + void * arg ) { + X86_Disasm * dis = (X86_Disasm *) + calloc( sizeof( X86_Disasm ), 1 ); + x86_init( options, reporter, arg ); + return dis; + } + + ~X86_Disasm() { + x86_cleanup(); + free( self ); + } + + void set_options( enum x86_options options ) { + return x86_set_options( options ); + } + + enum x86_options options() { + return x86_get_options(); + } + + void set_callback( void * callback ) { + self->disasm_callback = callback; + } + + void set_resolver( void * callback ) { + self->disasm_resolver = callback; + } + + void report_error( enum x86_report_codes code ) { + x86_report_error( code, NULL ); + } + + %newobject disasm; + x86_insn_t * disasm( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset ) { + x86_insn_t *insn = calloc( sizeof( x86_insn_t ), 1 ); + x86_disasm( buf, buf_len, buf_rva, offset, insn ); + return insn; + } + + int disasm_range( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset, + unsigned int len ) { + + X86_InsnList *list = new_X86_InsnList(); + + if ( len > buf_len ) { + len = buf_len; + } + + return x86_disasm_range( buf, buf_rva, offset, len, + x86_default_callback, list ); + } + + int disasm_forward( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset ) { + X86_InsnList *list = new_X86_InsnList(); + + /* use default resolver: damn SWIG callbacks! */ + return x86_disasm_forward( buf, buf_len, buf_rva, offset, + x86_default_callback, list, + x86_default_resolver, NULL ); + } + + size_t disasm_invariant( unsigned char *buf, size_t buf_len, + x86_invariant_t *inv ) { + return x86_invariant_disasm( buf, buf_len, inv ); + } + + size_t disasm_size( unsigned char *buf, size_t buf_len ) { + return x86_size_disasm( buf, buf_len ); + } + + %newobject format_header; + char * format_header( enum x86_asm_format format) { + char *buf, *str; + size_t len; + + switch ( format ) { + /* these were obtained from x86_format.c */ + case xml_syntax: + len = 679; break; + case raw_syntax: + len = 172; break; + case native_syntax: + len = 35; break; + case intel_syntax: + len = 23; break; + case att_syntax: + len = 23; break; + case unknown_syntax: + default: + len = 23; break; + } + + buf = (char * ) calloc( len + 1, 1 ); + x86_format_header( buf, len, format ); + + return buf; + } + + unsigned int endian() { + return x86_endian(); + } + + unsigned int addr_size() { + return x86_addr_size(); + } + + unsigned int op_size() { + return x86_op_size(); + } + + unsigned int word_size() { + return x86_word_size(); + } + + unsigned int max_insn_size() { + return x86_max_insn_size(); + } + + unsigned int sp_reg() { + return x86_sp_reg(); + } + + unsigned int fp_reg() { + return x86_fp_reg(); + } + + unsigned int ip_reg() { + return x86_ip_reg(); + } + + %newobject reg_from_id; + x86_reg_t * reg_from_id( unsigned int id ) { + x86_reg_t * reg = calloc( sizeof(x86_reg_t), 1 ); + x86_reg_from_id( id, reg ); + return reg; + } + + unsigned char wildcard_byte() { return X86_WILDCARD_BYTE; } + + int max_register_string() { return MAX_REGNAME; } + + int max_prefix_string() { return MAX_PREFIX_STR; } + + int max_mnemonic_string() { return MAX_MNEM_STR; } + + int max_operand_string( enum x86_asm_format format ) { + switch ( format ) { + case xml_syntax: + return MAX_OP_XML_STRING; + break; + case raw_syntax: + return MAX_OP_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + return MAX_OP_STRING; + break; + } + } + + + int max_insn_string( enum x86_asm_format format ) { + switch ( format ) { + case xml_syntax: + return MAX_INSN_XML_STRING; + break; + case raw_syntax: + return MAX_INSN_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + return MAX_INSN_STRING; + break; + } + } + + int max_num_operands( ) { return MAX_NUM_OPERANDS; } +} + +/* python callback, per the manual */ +/*%typemap(python,in) PyObject *pyfunc { + if (!PyCallable_Check($source)) { + PyErr_SetString(PyExc_TypeError, "Need a callable object!"); + return NULL; + } + $target = $source; +}*/ + +/* python FILE * callback, per the manual */ +/* +%typemap(python,in) FILE * { + if (!PyFile_Check($source)) { + PyErr_SetString(PyExc_TypeError, "Need a file!"); + return NULL; + } + $target = PyFile_AsFile($source); +}*/ + + diff --git a/src/third_party/libdisasm/swig/perl/Makefile-swig b/src/third_party/libdisasm/swig/perl/Makefile-swig new file mode 100644 index 0000000..9f3a645 --- /dev/null +++ b/src/third_party/libdisasm/swig/perl/Makefile-swig @@ -0,0 +1,65 @@ +ifndef BASE_NAME +BASE_NAME = x86disasm +endif + +ifndef SWIG +SWIG = swig # apt-get install swig ! +endif + +ifndef GCC +GCC = gcc +endif + +ifndef CC_FLAGS +CC_FLAGS = -c -fPIC +endif + +ifndef LD_FLAGS +LD_FLAGS = -shared -L.. -ldisasm +endif + +INTERFACE_FILE = libdisasm_oop.i + +SWIG_INTERFACE = ../$(INTERFACE_FILE) + +# PERL rules +PERL_MOD = blib/arch/auto/$(BASE_NAME)/$(BASE_NAME).so +PERL_SHADOW = $(BASE_NAME)_wrap.c +PERL_SWIG = $(BASE_NAME).pl +PERL_OBJ = $(BASE_NAME)_wrap.o +PERL_INC = `perl -e 'use Config; print $$Config{archlib};'`/CORE +PERL_CC_FLAGS = `perl -e 'use Config; print $$Config{ccflags};'` + +#==================================================== +# TARGETS + +all: swig-perl + +dummy: swig-perl install uninstall clean + +swig-perl: $(PERL_MOD) + +$(PERL_MOD): $(PERL_OBJ) + perl Makefile.PL + make + #$(GCC) $(LD_FLAGS) $(PERL_OBJ) -o $@ + +$(PERL_OBJ): $(PERL_SHADOW) + $(GCC) $(CC_FLAGS) $(PERL_CC_FLAGS) -I$(PERL_INC) -o $@ $< + +$(PERL_SHADOW): $(SWIG_INTERFACE) + swig -perl -shadow -o $(PERL_SHADOW) -outdir . $< + +# ================================================================== +install: $(PERL_MOD) + make install + +# ================================================================== +uninstall: + +# ================================================================== +clean: + rm $(PERL_MOD) $(PERL_OBJ) + rm $(PERL_SHADOW) + rm -rf Makefile blib pm_to_blib + diff --git a/src/third_party/libdisasm/swig/perl/Makefile.PL b/src/third_party/libdisasm/swig/perl/Makefile.PL new file mode 100644 index 0000000..6e625df --- /dev/null +++ b/src/third_party/libdisasm/swig/perl/Makefile.PL @@ -0,0 +1,7 @@ +use ExtUtils::MakeMaker; + +WriteMakefile( + 'NAME' => 'x86disasm', + 'LIBS' => ['-ldisasm'], + 'OBJECT' => 'x86disasm_wrap.o' +); diff --git a/src/third_party/libdisasm/swig/python/Makefile-swig b/src/third_party/libdisasm/swig/python/Makefile-swig new file mode 100644 index 0000000..544681a --- /dev/null +++ b/src/third_party/libdisasm/swig/python/Makefile-swig @@ -0,0 +1,64 @@ +ifndef BASE_NAME +BASE_NAME = x86disasm +endif + +ifndef SWIG +SWIG = swig # apt-get install swig ! +endif + +ifndef GCC +GCC = gcc +endif + +ifndef CC_FLAGS +CC_FLAGS = -c -fPIC +endif + +ifndef LD_FLAGS +LD_FLAGS = -shared -L.. -ldisasm +endif + +INTERFACE_FILE = libdisasm_oop.i + +SWIG_INTERFACE = ../$(INTERFACE_FILE) + +# PYTHON rules +PYTHON_MOD = $(BASE_NAME)-python.so +PYTHON_SHADOW = $(BASE_NAME)_wrap.c +PYTHON_SWIG = $(BASE_NAME).py +PYTHON_OBJ = $(BASE_NAME)_wrap.o +PYTHON_INC = `/bin/echo -e 'import sys\nprint sys.prefix + "/include/python" + sys.version[:3]' | python` +PYTHON_LIB = `/bin/echo -e 'import sys\nprint sys.prefix + "/lib/python" + sys.version[:3]' | python` +PYTHON_DEST = $(PYTHON_LIB)/lib-dynload/_$(BASE_NAME).so + +#==================================================== +# TARGETS + +all: swig-python + +dummy: swig-python install uninstall clean + +swig-python: $(PYTHON_MOD) + +$(PYTHON_MOD): $(PYTHON_OBJ) + $(GCC) $(LD_FLAGS) $(PYTHON_OBJ) -o $@ + +$(PYTHON_OBJ): $(PYTHON_SHADOW) + $(GCC) $(CC_FLAGS) -I$(PYTHON_INC) -I.. -o $@ $< + +$(PYTHON_SHADOW): $(SWIG_INTERFACE) + swig -python -shadow -o $(PYTHON_SHADOW) -outdir . $< + +# ================================================================== +install: $(PYTHON_MOD) + sudo cp $(PYTHON_MOD) $(PYTHON_DEST) + sudo cp $(PYTHON_SWIG) $(PYTHON_LIB) + +# ================================================================== +uninstall: + +# ================================================================== +clean: + rm $(PYTHON_MOD) $(PYTHON_SWIG) $(PYTHON_OBJ) + rm $(PYTHON_SHADOW) + diff --git a/src/third_party/libdisasm/swig/ruby/Makefile-swig b/src/third_party/libdisasm/swig/ruby/Makefile-swig new file mode 100644 index 0000000..ee48002 --- /dev/null +++ b/src/third_party/libdisasm/swig/ruby/Makefile-swig @@ -0,0 +1,68 @@ +ifndef BASE_NAME +BASE_NAME = x86disasm +endif + +ifndef SWIG +SWIG = swig # apt-get install swig ! +endif + +ifndef GCC +GCC = gcc +endif + +ifndef CC_FLAGS +CC_FLAGS = -c -fPIC +endif + +ifndef LD_FLAGS +LD_FLAGS = -shared -L../.. -ldisasm +endif + +LIBDISASM_DIR = ../.. + +INTERFACE_FILE = libdisasm_oop.i + +SWIG_INTERFACE = ../$(INTERFACE_FILE) + +# RUBY rules +RUBY_MAKEFILE = Makefile +RUBY_MOD = $(BASE_NAME).so +RUBY_SHADOW = $(BASE_NAME)_wrap.c +#RUBY_SWIG = $(BASE_NAME).rb +RUBY_OBJ = $(BASE_NAME)_wrap.o +RUBY_INC = `ruby -e 'puts $$:.join("\n")' | tail -2 | head -1` +#RUBY_LIB = +#RUBY_DEST = + +#==================================================== +# TARGETS + +all: swig-ruby + +dummy: swig-ruby install uninstall clean + +swig-ruby: $(RUBY_MOD) + +$(RUBY_MOD): $(RUBY_MAKEFILE) + make + +$(RUBY_MAKEFILE): $(RUBY_OBJ) + ruby extconf.rb + +$(RUBY_OBJ):$(RUBY_SHADOW) + $(GCC) $(CC_FLAGS) -I$(RUBY_INC) -I.. -o $@ $< + +$(RUBY_SHADOW): $(SWIG_INTERFACE) + swig -ruby -o $(RUBY_SHADOW) -outdir . $< + +# ================================================================== +install: $(RUBY_MOD) + make install + +# ================================================================== +uninstall: + +# ================================================================== +clean: + make clean || true + rm $(RUBY_SHADOW) $(RUBY_MAKEFILE) $(RUBY_MOD) $(RUBY_OBJ) diff --git a/src/third_party/libdisasm/swig/ruby/extconf.rb b/src/third_party/libdisasm/swig/ruby/extconf.rb new file mode 100644 index 0000000..4e74326 --- /dev/null +++ b/src/third_party/libdisasm/swig/ruby/extconf.rb @@ -0,0 +1,4 @@ +require 'mkmf' +find_library('disasm', 'x86_init', "/usr/local/lib", "../..") +create_makefile('x86disasm') + diff --git a/src/third_party/libdisasm/swig/tcl/Makefile-swig b/src/third_party/libdisasm/swig/tcl/Makefile-swig new file mode 100644 index 0000000..5145a82 --- /dev/null +++ b/src/third_party/libdisasm/swig/tcl/Makefile-swig @@ -0,0 +1,63 @@ +ifndef BASE_NAME +BASE_NAME = x86disasm +endif + +ifndef SWIG +SWIG = swig # apt-get install swig ! +endif + +ifndef GCC +GCC = gcc +endif + +ifndef CC_FLAGS +CC_FLAGS = -c -fPIC +endif + +ifndef LD_FLAGS +LD_FLAGS = -shared -L../.. -ldisasm +endif + +INTERFACE_FILE = libdisasm.i + +SWIG_INTERFACE = ../$(INTERFACE_FILE) + +# TCL rules +TCL_VERSION = 8.3 +TCL_MOD = $(BASE_NAME)-tcl.so +TCL_SHADOW = $(BASE_NAME)_wrap.c +TCL_OBJ = $(BASE_NAME)_wrap.o +TCL_INC = /usr/include/tcl$(TCL_VERSION) +TCL_LIB = /usr/lib/tcl$(TCL_VERSION) +TCL_DEST = $(TCL_LIB)/$(BASE_NAME).so + +#==================================================== +# TARGETS + +all: swig-tcl + +dummy: swig-tcl install uninstall clean + +swig-tcl: $(TCL_MOD) + +$(TCL_MOD): $(TCL_OBJ) + $(GCC) $(LD_FLAGS) $(TCL_OBJ) -o $@ + +$(TCL_OBJ): $(TCL_SHADOW) + $(GCC) $(CC_FLAGS) -I$(TCL_INC) -I.. -o $@ $< + +$(TCL_SHADOW): $(SWIG_INTERFACE) + swig -tcl -o $(TCL_SHADOW) -outdir . $< + +# ================================================================== +install: $(TCL_MOD) + sudo cp $(TCL_MOD) $(TCL_DEST) + +# ================================================================== +uninstall: + +# ================================================================== +clean: + rm $(TCL_MOD) $(TCL_SWIG) $(TCL_OBJ) + rm $(TCL_SHADOW) + diff --git a/src/third_party/libdisasm/x86_disasm.c b/src/third_party/libdisasm/x86_disasm.c new file mode 100644 index 0000000..1b82f4e --- /dev/null +++ b/src/third_party/libdisasm/x86_disasm.c @@ -0,0 +1,210 @@ +#include +#include +#include + +#include "libdis.h" +#include "ia32_insn.h" +#include "ia32_invariant.h" +#include "x86_operand_list.h" + + +#ifdef _MSC_VER + #define snprintf _snprintf + #define inline __inline +#endif + +unsigned int x86_disasm( unsigned char *buf, unsigned int buf_len, + uint32_t buf_rva, unsigned int offset, + x86_insn_t *insn ){ + int len, size; + unsigned char bytes[MAX_INSTRUCTION_SIZE]; + + if ( ! buf || ! insn || ! buf_len ) { + /* caller screwed up somehow */ + return 0; + } + + + /* ensure we are all NULLed up */ + memset( insn, 0, sizeof(x86_insn_t) ); + insn->addr = buf_rva + offset; + insn->offset = offset; + /* default to invalid insn */ + insn->type = insn_invalid; + insn->group = insn_none; + + if ( offset >= buf_len ) { + /* another caller screwup ;) */ + x86_report_error(report_disasm_bounds, (void*)(long)(buf_rva+offset)); + return 0; + } + + len = buf_len - offset; + + /* copy enough bytes for disassembly into buffer : this + * helps prevent buffer overruns at the end of a file */ + memset( bytes, 0, MAX_INSTRUCTION_SIZE ); + memcpy( bytes, &buf[offset], (len < MAX_INSTRUCTION_SIZE) ? len : + MAX_INSTRUCTION_SIZE ); + + /* actually do the disassembly */ + /* TODO: allow switching when more disassemblers are added */ + size = ia32_disasm_addr( bytes, len, insn); + + /* check and see if we had an invalid instruction */ + if (! size ) { + x86_report_error(report_invalid_insn, (void*)(long)(buf_rva+offset)); + return 0; + } + + /* check if we overran the end of the buffer */ + if ( size > len ) { + x86_report_error( report_insn_bounds, (void*)(long)(buf_rva + offset)); + MAKE_INVALID( insn, bytes ); + return 0; + } + + /* fill bytes field of insn */ + memcpy( insn->bytes, bytes, size ); + + return size; +} + +unsigned int x86_disasm_range( unsigned char *buf, uint32_t buf_rva, + unsigned int offset, unsigned int len, + DISASM_CALLBACK func, void *arg ) { + x86_insn_t insn; + unsigned int buf_len, size, count = 0, bytes = 0; + + /* buf_len is implied by the arguments */ + buf_len = len + offset; + + while ( bytes < len ) { + size = x86_disasm( buf, buf_len, buf_rva, offset + bytes, + &insn ); + if ( size ) { + /* invoke callback if it exists */ + if ( func ) { + (*func)( &insn, arg ); + } + bytes += size; + count ++; + } else { + /* error */ + bytes++; /* try next byte */ + } + + x86_oplist_free( &insn ); + } + + return( count ); +} + +static inline int follow_insn_dest( x86_insn_t *insn ) { + if ( insn->type == insn_jmp || insn->type == insn_jcc || + insn->type == insn_call || insn->type == insn_callcc ) { + return(1); + } + return(0); +} + +static inline int insn_doesnt_return( x86_insn_t *insn ) { + return( (insn->type == insn_jmp || insn->type == insn_return) ? 1: 0 ); +} + +static int32_t internal_resolver( x86_op_t *op, x86_insn_t *insn ){ + int32_t next_addr = -1; + if ( x86_optype_is_address(op->type) ) { + next_addr = op->data.sdword; + } else if ( op->type == op_relative_near ) { + next_addr = insn->addr + insn->size + op->data.relative_near; + } else if ( op->type == op_relative_far ) { + next_addr = insn->addr + insn->size + op->data.relative_far; + } + return( next_addr ); +} + +unsigned int x86_disasm_forward( unsigned char *buf, unsigned int buf_len, + uint32_t buf_rva, unsigned int offset, + DISASM_CALLBACK func, void *arg, + DISASM_RESOLVER resolver, void *r_arg ){ + x86_insn_t insn; + x86_op_t *op; + int32_t next_addr; + uint32_t next_offset; + unsigned int size, count = 0, bytes = 0, cont = 1; + + while ( cont && bytes < buf_len ) { + size = x86_disasm( buf, buf_len, buf_rva, offset + bytes, + &insn ); + + if ( size ) { + /* invoke callback if it exists */ + if ( func ) { + (*func)( &insn, arg ); + } + bytes += size; + count ++; + } else { + /* error */ + bytes++; /* try next byte */ + } + + if ( follow_insn_dest(&insn) ) { + op = x86_get_dest_operand( &insn ); + next_addr = -1; + + /* if caller supplied a resolver, use it to determine + * the address to disassemble */ + if ( resolver ) { + next_addr = resolver(op, &insn, r_arg); + } else { + next_addr = internal_resolver(op, &insn); + } + + if (next_addr != -1 ) { + next_offset = next_addr - buf_rva; + /* if offset is in this buffer... */ + if ( (uint32_t)next_addr >= buf_rva && + next_offset < buf_len ) { + /* go ahead and disassemble */ + count += x86_disasm_forward( buf, + buf_len, + buf_rva, + next_offset, + func, arg, + resolver, r_arg ); + } else { + /* report unresolved address */ + x86_report_error( report_disasm_bounds, + (void*)(long)next_addr ); + } + } + } /* end follow_insn */ + + if ( insn_doesnt_return(&insn) ) { + /* stop disassembling */ + cont = 0; + } + + x86_oplist_free( &insn ); + } + return( count ); +} + +/* invariant instruction representation */ +size_t x86_invariant_disasm( unsigned char *buf, int buf_len, + x86_invariant_t *inv ){ + if (! buf || ! buf_len || ! inv ) { + return(0); + } + + return ia32_disasm_invariant(buf, buf_len, inv); +} +size_t x86_size_disasm( unsigned char *buf, unsigned int buf_len ) { + if (! buf || ! buf_len ) { + return(0); + } + + return ia32_disasm_size(buf, buf_len); +} diff --git a/src/third_party/libdisasm/x86_format.c b/src/third_party/libdisasm/x86_format.c new file mode 100644 index 0000000..bb547ad --- /dev/null +++ b/src/third_party/libdisasm/x86_format.c @@ -0,0 +1,1430 @@ +#include +#include +#include + +#include "libdis.h" +#include + +#ifdef _MSC_VER + #define snprintf _snprintf + #define inline __inline +#endif + + +/* + * concatenation macros. STRNCATF concatenates a format string, buf + * only with one argument. + */ +#define STRNCAT( buf, str, len ) do { \ + int _i = strlen(str), _blen = strlen(buf), _len = len - 1; \ + if ( len ) { \ + strncat( buf, str, _len ); \ + if ( _len <= _i ) { \ + buf[_blen+_len] = '\0'; \ + len = 0; \ + } else { \ + len -= _i; \ + } \ + } \ +} while( 0 ) + +#define STRNCATF( buf, fmt, data, len ) do { \ + char _tmp[MAX_OP_XML_STRING]; \ + \ + snprintf( _tmp, sizeof _tmp, fmt, data ); \ + STRNCAT( buf, _tmp, len ); \ +} while( 0 ) + + +#define PRINT_DISPLACEMENT( ea ) do { \ + if ( ea->disp_size && ea->disp ) { \ + if ( ea->disp_sign ) { \ + STRNCATF( buf, "-0x%" PRIX32, -ea->disp, len ); \ + } else { \ + STRNCATF( buf, "0x%" PRIX32, ea->disp, len ); \ + } \ + } \ +} while( 0 ) + +static const char *prefix_strings[] = { + "", /* no prefix */ + "repz ", /* the trailing spaces make it easy to prepend to mnemonic */ + "repnz ", + "lock ", + "branch delay " /* unused in x86 */ +}; + +static int format_insn_prefix_str( enum x86_insn_prefix prefix, char *buf, + int len ) { + + int len_orig = len; + + /* concat all prefix strings */ + if ( prefix & 1 ) { STRNCAT( buf, prefix_strings[1], len ); } + if ( prefix & 2 ) { STRNCAT( buf, prefix_strings[2], len ); } + if ( prefix & 4 ) { STRNCAT( buf, prefix_strings[3], len ); } + if ( prefix & 8 ) { STRNCAT( buf, prefix_strings[4], len ); } + + /* return the number of characters added */ + return (len_orig - len); +} + +/* + * sprint's an operand's data to string str. + */ +static void get_operand_data_str( x86_op_t *op, char *str, int len ){ + + if ( op->flags & op_signed ) { + switch ( op->datatype ) { + case op_byte: + snprintf( str, len, "%" PRId8, op->data.sbyte ); + return; + case op_word: + snprintf( str, len, "%" PRId16, op->data.sword ); + return; + case op_qword: + snprintf( str, len, "%" PRId64, op->data.sqword ); + return; + default: + snprintf( str, len, "%" PRId32, op->data.sdword ); + return; + } + } + + //else + switch ( op->datatype ) { + case op_byte: + snprintf( str, len, "0x%02" PRIX8, op->data.byte ); + return; + case op_word: + snprintf( str, len, "0x%04" PRIX16, op->data.word ); + return; + case op_qword: + snprintf( str, len, "0x%08" PRIX64,op->data.sqword ); + return; + default: + snprintf( str, len, "0x%08" PRIX32, op->data.dword ); + return; + } +} + +/* + * sprints register types to a string. the register types can be ORed + * together. + */ +static void get_operand_regtype_str( int regtype, char *str, int len ) +{ + static struct { + const char *name; + int value; + } operand_regtypes[] = { + {"reg_gen" , 0x00001}, + {"reg_in" , 0x00002}, + {"reg_out" , 0x00004}, + {"reg_local" , 0x00008}, + {"reg_fpu" , 0x00010}, + {"reg_seg" , 0x00020}, + {"reg_simd" , 0x00040}, + {"reg_sys" , 0x00080}, + {"reg_sp" , 0x00100}, + {"reg_fp" , 0x00200}, + {"reg_pc" , 0x00400}, + {"reg_retaddr", 0x00800}, + {"reg_cond" , 0x01000}, + {"reg_zero" , 0x02000}, + {"reg_ret" , 0x04000}, + {"reg_src" , 0x10000}, + {"reg_dest" , 0x20000}, + {"reg_count" , 0x40000}, + {NULL, 0}, //end + }; + + unsigned int i; + + memset( str, 0, len ); + + //go thru every type in the enum + for ( i = 0; operand_regtypes[i].name; i++ ) { + //skip if type is not set + if(! (regtype & operand_regtypes[i].value) ) + continue; + + //not the first time around + if( str[0] ) { + STRNCAT( str, " ", len ); + } + + STRNCAT(str, operand_regtypes[i].name, len ); + } +} + +static int format_expr( x86_ea_t *ea, char *buf, int len, + enum x86_asm_format format ) { + char str[MAX_OP_STRING]; + + if ( format == att_syntax ) { + if (ea->base.name[0] || ea->index.name[0] || ea->scale) { + PRINT_DISPLACEMENT(ea); + STRNCAT( buf, "(", len ); + + if ( ea->base.name[0]) { + STRNCATF( buf, "%%%s", ea->base.name, len ); + } + if ( ea->index.name[0]) { + STRNCATF( buf, ",%%%s", ea->index.name, len ); + if ( ea->scale > 1 ) { + STRNCATF( buf, ",%d", ea->scale, len ); + } + } + /* handle the syntactic exception */ + if ( ! ea->base.name[0] && + ! ea->index.name[0] ) { + STRNCATF( buf, ",%d", ea->scale, len ); + } + + STRNCAT( buf, ")", len ); + } else + STRNCATF( buf, "0x%" PRIX32, ea->disp, len ); + + } else if ( format == xml_syntax ){ + + if ( ea->base.name[0]) { + STRNCAT (buf, "\t\t\t\n", len); + + get_operand_regtype_str (ea->base.type, str, + sizeof str); + STRNCAT (buf, "\t\t\t\tbase.name, len); + STRNCATF (buf, "type=\"%s\" ", str, len); + STRNCATF (buf, "size=%d/>\n", ea->base.size, len); + + STRNCAT (buf, "\t\t\t\n", len); + } + + if ( ea->index.name[0]) { + STRNCAT (buf, "\t\t\t\n", len); + + get_operand_regtype_str (ea->index.type, str, + sizeof str); + + STRNCAT (buf, "\t\t\t\tindex.name, len); + STRNCATF (buf, "type=\"%s\" ", str, len); + STRNCATF (buf, "size=%d/>\n", ea->index.size, len); + + STRNCAT (buf, "\t\t\t\n", len); + } + + //scale + STRNCAT (buf, "\t\t\t\n", len); + STRNCAT (buf, "\t\t\t\t\n", ea->scale, len); + STRNCAT (buf, "\t\t\t\n", len); + + if ( ea->disp_size ) { + + STRNCAT (buf, "\t\t\t\n", len); + + if ( ea->disp_size > 1 && ! ea->disp_sign ) { + STRNCAT (buf, "\t\t\t\t

    \n", ea->disp, + len); + } else { + STRNCAT (buf, "\t\t\t\t\n", ea->disp, len); + } + + STRNCAT (buf, "\t\t\t\n", len); + } + + } else if ( format == raw_syntax ) { + + PRINT_DISPLACEMENT(ea); + STRNCAT( buf, "(", len ); + + STRNCATF( buf, "%s,", ea->base.name, len ); + STRNCATF( buf, "%s,", ea->index.name, len ); + STRNCATF( buf, "%d", ea->scale, len ); + STRNCAT( buf, ")", len ); + + } else { + + STRNCAT( buf, "[", len ); + + if ( ea->base.name[0] ) { + STRNCAT( buf, ea->base.name, len ); + if ( ea->index.name[0] || + (ea->disp_size && ! ea->disp_sign) ) { + STRNCAT( buf, "+", len ); + } + } + if ( ea->index.name[0] ) { + STRNCAT( buf, ea->index.name, len ); + if ( ea->scale > 1 ) + { + STRNCATF( buf, "*%" PRId32, ea->scale, len ); + } + if ( ea->disp_size && ! ea->disp_sign ) + { + STRNCAT( buf, "+", len ); + } + } + + if ( ea->disp_size || (! ea->index.name[0] && + ! ea->base.name[0] ) ) + { + PRINT_DISPLACEMENT(ea); + } + + STRNCAT( buf, "]", len ); + } + + return( strlen(buf) ); +} + +static int format_seg( x86_op_t *op, char *buf, int len, + enum x86_asm_format format ) { + int len_orig = len; + const char *reg = ""; + + if (! op || ! buf || ! len || ! op->flags) { + return(0); + } + if ( op->type != op_offset && op->type != op_expression ){ + return(0); + } + if (! ((int) op->flags & 0xF00) ) { + return(0); + } + + switch (op->flags & 0xF00) { + case op_es_seg: reg = "es"; break; + case op_cs_seg: reg = "cs"; break; + case op_ss_seg: reg = "ss"; break; + case op_ds_seg: reg = "ds"; break; + case op_fs_seg: reg = "fs"; break; + case op_gs_seg: reg = "gs"; break; + default: + break; + } + + if (! reg[0] ) { + return( 0 ); + } + + switch( format ) { + case xml_syntax: + STRNCAT( buf, "\t\t\t\n", reg, len ); + break; + case att_syntax: + STRNCATF( buf, "%%%s:", reg, len ); + break; + + default: + STRNCATF( buf, "%s:", reg, len ); + break; + } + + return( len_orig - len ); /* return length of appended string */ +} + +static const char *get_operand_datatype_str( x86_op_t *op ){ + + static const char *types[] = { + "sbyte", /* 0 */ + "sword", + "sqword", + "sdword", + "sdqword", /* 4 */ + "byte", + "word", + "qword", + "dword", /* 8 */ + "dqword", + "sreal", + "dreal", + "extreal", /* 12 */ + "bcd", + "ssimd", + "dsimd", + "sssimd", /* 16 */ + "sdsimd", + "descr32", + "descr16", + "pdescr32", /* 20 */ + "pdescr16", + "bounds16", + "bounds32", + "fpu_env16", + "fpu_env32", /* 25 */ + "fpu_state16", + "fpu_state32", + "fp_reg_set" + }; + + /* handle signed values first */ + if ( op->flags & op_signed ) { + switch (op->datatype) { + case op_byte: return types[0]; + case op_word: return types[1]; + case op_qword: return types[2]; + case op_dqword: return types[4]; + default: return types[3]; + } + } + + switch (op->datatype) { + case op_byte: return types[5]; + case op_word: return types[6]; + case op_qword: return types[7]; + case op_dqword: return types[9]; + case op_sreal: return types[10]; + case op_dreal: return types[11]; + case op_extreal: return types[12]; + case op_bcd: return types[13]; + case op_ssimd: return types[14]; + case op_dsimd: return types[15]; + case op_sssimd: return types[16]; + case op_sdsimd: return types[17]; + case op_descr32: return types[18]; + case op_descr16: return types[19]; + case op_pdescr32: return types[20]; + case op_pdescr16: return types[21]; + case op_bounds16: return types[22]; + case op_bounds32: return types[23]; + case op_fpustate16: return types[24]; + case op_fpustate32: return types[25]; + case op_fpuenv16: return types[26]; + case op_fpuenv32: return types[27]; + case op_fpregset: return types[28]; + default: return types[8]; + } +} + +static int format_insn_eflags_str( enum x86_flag_status flags, char *buf, + int len) { + + static struct { + const char *name; + int value; + } insn_flags[] = { + { "carry_set ", 0x0001 }, + { "zero_set ", 0x0002 }, + { "oflow_set ", 0x0004 }, + { "dir_set ", 0x0008 }, + { "sign_set ", 0x0010 }, + { "parity_set ", 0x0020 }, + { "carry_or_zero_set ", 0x0040 }, + { "zero_set_or_sign_ne_oflow ", 0x0080 }, + { "carry_clear ", 0x0100 }, + { "zero_clear ", 0x0200 }, + { "oflow_clear ", 0x0400 }, + { "dir_clear ", 0x0800 }, + { "sign_clear ", 0x1000 }, + { "parity_clear ", 0x2000 }, + { "sign_eq_oflow ", 0x4000 }, + { "sign_ne_oflow ", 0x8000 }, + { NULL, 0x0000 }, //end + }; + + unsigned int i; + int len_orig = len; + + for (i = 0; insn_flags[i].name; i++) { + if (! (flags & insn_flags[i].value) ) + continue; + + STRNCAT( buf, insn_flags[i].name, len ); + } + + return( len_orig - len ); +} + +static const char *get_insn_group_str( enum x86_insn_group gp ) { + + static const char *types[] = { + "", // 0 + "controlflow",// 1 + "arithmetic", // 2 + "logic", // 3 + "stack", // 4 + "comparison", // 5 + "move", // 6 + "string", // 7 + "bit_manip", // 8 + "flag_manip", // 9 + "fpu", // 10 + "", // 11 + "", // 12 + "interrupt", // 13 + "system", // 14 + "other", // 15 + }; + + if ( gp > sizeof (types)/sizeof(types[0]) ) + return ""; + + return types[gp]; +} + +static const char *get_insn_type_str( enum x86_insn_type type ) { + + static struct { + const char *name; + int value; + } types[] = { + /* insn_controlflow */ + { "jmp", 0x1001 }, + { "jcc", 0x1002 }, + { "call", 0x1003 }, + { "callcc", 0x1004 }, + { "return", 0x1005 }, + { "loop", 0x1006 }, + /* insn_arithmetic */ + { "add", 0x2001 }, + { "sub", 0x2002 }, + { "mul", 0x2003 }, + { "div", 0x2004 }, + { "inc", 0x2005 }, + { "dec", 0x2006 }, + { "shl", 0x2007 }, + { "shr", 0x2008 }, + { "rol", 0x2009 }, + { "ror", 0x200A }, + /* insn_logic */ + { "and", 0x3001 }, + { "or", 0x3002 }, + { "xor", 0x3003 }, + { "not", 0x3004 }, + { "neg", 0x3005 }, + /* insn_stack */ + { "push", 0x4001 }, + { "pop", 0x4002 }, + { "pushregs", 0x4003 }, + { "popregs", 0x4004 }, + { "pushflags", 0x4005 }, + { "popflags", 0x4006 }, + { "enter", 0x4007 }, + { "leave", 0x4008 }, + /* insn_comparison */ + { "test", 0x5001 }, + { "cmp", 0x5002 }, + /* insn_move */ + { "mov", 0x6001 }, /* move */ + { "movcc", 0x6002 }, /* conditional move */ + { "xchg", 0x6003 }, /* exchange */ + { "xchgcc", 0x6004 }, /* conditional exchange */ + /* insn_string */ + { "strcmp", 0x7001 }, + { "strload", 0x7002 }, + { "strmov", 0x7003 }, + { "strstore", 0x7004 }, + { "translate", 0x7005 }, /* xlat */ + /* insn_bit_manip */ + { "bittest", 0x8001 }, + { "bitset", 0x8002 }, + { "bitclear", 0x8003 }, + /* insn_flag_manip */ + { "clear_carry", 0x9001 }, + { "clear_zero", 0x9002 }, + { "clear_oflow", 0x9003 }, + { "clear_dir", 0x9004 }, + { "clear_sign", 0x9005 }, + { "clear_parity", 0x9006 }, + { "set_carry", 0x9007 }, + { "set_zero", 0x9008 }, + { "set_oflow", 0x9009 }, + { "set_dir", 0x900A }, + { "set_sign", 0x900B }, + { "set_parity", 0x900C }, + { "tog_carry", 0x9010 }, + { "tog_zero", 0x9020 }, + { "tog_oflow", 0x9030 }, + { "tog_dir", 0x9040 }, + { "tog_sign", 0x9050 }, + { "tog_parity", 0x9060 }, + /* insn_fpu */ + { "fmov", 0xA001 }, + { "fmovcc", 0xA002 }, + { "fneg", 0xA003 }, + { "fabs", 0xA004 }, + { "fadd", 0xA005 }, + { "fsub", 0xA006 }, + { "fmul", 0xA007 }, + { "fdiv", 0xA008 }, + { "fsqrt", 0xA009 }, + { "fcmp", 0xA00A }, + { "fcos", 0xA00C }, + { "fldpi", 0xA00D }, + { "fldz", 0xA00E }, + { "ftan", 0xA00F }, + { "fsine", 0xA010 }, + { "fsys", 0xA020 }, + /* insn_interrupt */ + { "int", 0xD001 }, + { "intcc", 0xD002 }, /* not present in x86 ISA */ + { "iret", 0xD003 }, + { "bound", 0xD004 }, + { "debug", 0xD005 }, + { "trace", 0xD006 }, + { "invalid_op", 0xD007 }, + { "oflow", 0xD008 }, + /* insn_system */ + { "halt", 0xE001 }, + { "in", 0xE002 }, /* input from port/bus */ + { "out", 0xE003 }, /* output to port/bus */ + { "cpuid", 0xE004 }, + /* insn_other */ + { "nop", 0xF001 }, + { "bcdconv", 0xF002 }, /* convert to or from BCD */ + { "szconv", 0xF003 }, /* change size of operand */ + { NULL, 0 }, //end + }; + + unsigned int i; + + //go thru every type in the enum + for ( i = 0; types[i].name; i++ ) { + if ( types[i].value == type ) + return types[i].name; + } + + return ""; +} + +static const char *get_insn_cpu_str( enum x86_insn_cpu cpu ) { + static const char *intel[] = { + "", // 0 + "8086", // 1 + "80286", // 2 + "80386", // 3 + "80387", // 4 + "80486", // 5 + "Pentium", // 6 + "Pentium Pro", // 7 + "Pentium 2", // 8 + "Pentium 3", // 9 + "Pentium 4" // 10 + }; + + if ( cpu < sizeof(intel)/sizeof(intel[0]) ) { + return intel[cpu]; + } else if ( cpu == 16 ) { + return "K6"; + } else if ( cpu == 32 ) { + return "K7"; + } else if ( cpu == 48 ) { + return "Athlon"; + } + + return ""; +} + +static const char *get_insn_isa_str( enum x86_insn_isa isa ) { + static const char *subset[] = { + NULL, // 0 + "General Purpose", // 1 + "Floating Point", // 2 + "FPU Management", // 3 + "MMX", // 4 + "SSE", // 5 + "SSE2", // 6 + "SSE3", // 7 + "3DNow!", // 8 + "System" // 9 + }; + + if ( isa > sizeof (subset)/sizeof(subset[0]) ) { + return ""; + } + + return subset[isa]; +} + +static int format_operand_att( x86_op_t *op, x86_insn_t *insn, char *buf, + int len){ + + char str[MAX_OP_STRING]; + + memset (str, 0, sizeof str); + + switch ( op->type ) { + case op_register: + STRNCATF( buf, "%%%s", op->data.reg.name, len ); + break; + + case op_immediate: + get_operand_data_str( op, str, sizeof str ); + STRNCATF( buf, "$%s", str, len ); + break; + + case op_relative_near: + STRNCATF( buf, "0x%08X", + (unsigned int)(op->data.sbyte + + insn->addr + insn->size), len ); + break; + + case op_relative_far: + if (op->datatype == op_word) { + STRNCATF( buf, "0x%08X", + (unsigned int)(op->data.sword + + insn->addr + insn->size), len ); + } else { + STRNCATF( buf, "0x%08X", + (unsigned int)(op->data.sdword + + insn->addr + insn->size), len ); + } + break; + + case op_absolute: + /* ATT uses the syntax $section, $offset */ + STRNCATF( buf, "$0x%04" PRIX16 ", ", op->data.absolute.segment, + len ); + if (op->datatype == op_descr16) { + STRNCATF( buf, "$0x%04" PRIX16, + op->data.absolute.offset.off16, len ); + } else { + STRNCATF( buf, "$0x%08" PRIX32, + op->data.absolute.offset.off32, len ); + } + break; + case op_offset: + /* ATT requires a '*' before JMP/CALL ops */ + if (insn->type == insn_jmp || insn->type == insn_call) + STRNCAT( buf, "*", len ); + + len -= format_seg( op, buf, len, att_syntax ); + STRNCATF( buf, "0x%08" PRIX32, op->data.sdword, len ); + break; + + case op_expression: + /* ATT requires a '*' before JMP/CALL ops */ + if (insn->type == insn_jmp || insn->type == insn_call) + STRNCAT( buf, "*", len ); + + len -= format_seg( op, buf, len, att_syntax ); + len -= format_expr( &op->data.expression, buf, len, + att_syntax ); + break; + case op_unused: + case op_unknown: + /* return 0-truncated buffer */ + break; + } + + return ( strlen( buf ) ); +} + +static int format_operand_native( x86_op_t *op, x86_insn_t *insn, char *buf, + int len){ + + char str[MAX_OP_STRING]; + + switch (op->type) { + case op_register: + STRNCAT( buf, op->data.reg.name, len ); + break; + + case op_immediate: + get_operand_data_str( op, str, sizeof str ); + STRNCAT( buf, str, len ); + break; + + case op_relative_near: + STRNCATF( buf, "0x%08" PRIX32, + (unsigned int)(op->data.sbyte + + insn->addr + insn->size), len ); + break; + + case op_relative_far: + if ( op->datatype == op_word ) { + STRNCATF( buf, "0x%08" PRIX32, + (unsigned int)(op->data.sword + + insn->addr + insn->size), len ); + break; + } else { + STRNCATF( buf, "0x%08" PRIX32, op->data.sdword + + insn->addr + insn->size, len ); + } + break; + + case op_absolute: + STRNCATF( buf, "$0x%04" PRIX16 ":", op->data.absolute.segment, + len ); + if (op->datatype == op_descr16) { + STRNCATF( buf, "0x%04" PRIX16, + op->data.absolute.offset.off16, len ); + } else { + STRNCATF( buf, "0x%08" PRIX32, + op->data.absolute.offset.off32, len ); + } + break; + + case op_offset: + len -= format_seg( op, buf, len, native_syntax ); + STRNCATF( buf, "[0x%08" PRIX32 "]", op->data.sdword, len ); + break; + + case op_expression: + len -= format_seg( op, buf, len, native_syntax ); + len -= format_expr( &op->data.expression, buf, len, + native_syntax ); + break; + case op_unused: + case op_unknown: + /* return 0-truncated buffer */ + break; + } + + return( strlen( buf ) ); +} + +static int format_operand_xml( x86_op_t *op, x86_insn_t *insn, char *buf, + int len){ + + char str[MAX_OP_STRING] = "\0"; + + switch (op->type) { + case op_register: + + get_operand_regtype_str( op->data.reg.type, str, + sizeof str ); + + STRNCAT( buf, "\t\tdata.reg.name, len ); + STRNCATF( buf, "type=\"%s\" ", str, len ); + STRNCATF( buf, "size=%d/>\n", op->data.reg.size, len ); + break; + + case op_immediate: + + get_operand_data_str( op, str, sizeof str ); + + STRNCAT( buf, "\t\t\n", str, len ); + break; + + case op_relative_near: + STRNCAT( buf, "\t\t\n", + (unsigned int)(op->data.sbyte + + insn->addr + insn->size), len ); + break; + + case op_relative_far: + STRNCAT( buf, "\t\tdatatype == op_word) { + STRNCATF( buf, "value=\"0x%08" PRIX32 "\"/>\n", + (unsigned int)(op->data.sword + + insn->addr + insn->size), len); + break; + } else { + + STRNCATF( buf, "value=\"0x%08" PRIX32 "\"/>\n", + op->data.sdword + insn->addr + insn->size, + len ); + } + break; + + case op_absolute: + + STRNCATF( buf, + "\t\tdata.absolute.segment, len ); + + if (op->datatype == op_descr16) { + STRNCATF( buf, "offset=\"0x%04" PRIX16 "\">", + op->data.absolute.offset.off16, len ); + } else { + STRNCATF( buf, "offset=\"0x%08" PRIX32 "\">", + op->data.absolute.offset.off32, len ); + } + + STRNCAT( buf, "\t\t\n", len ); + break; + + case op_expression: + + + STRNCAT( buf, "\t\t\n", len ); + + len -= format_seg( op, buf, len, xml_syntax ); + len -= format_expr( &op->data.expression, buf, len, + xml_syntax ); + + STRNCAT( buf, "\t\t\n", len ); + break; + + case op_offset: + + STRNCAT( buf, "\t\t\n", len ); + + len -= format_seg( op, buf, len, xml_syntax ); + + STRNCAT( buf, "\t\t\t
    \n", + op->data.sdword, len ); + STRNCAT( buf, "\t\t\n", len ); + break; + + case op_unused: + case op_unknown: + /* return 0-truncated buffer */ + break; + } + + return( strlen( buf ) ); +} + +static int format_operand_raw( x86_op_t *op, x86_insn_t *insn, char *buf, + int len){ + + char str[MAX_OP_RAW_STRING]; + const char *datatype = get_operand_datatype_str(op); + + switch (op->type) { + case op_register: + + get_operand_regtype_str( op->data.reg.type, str, + sizeof str ); + + STRNCAT( buf, "reg|", len ); + STRNCATF( buf, "%s|", datatype, len ); + STRNCATF( buf, "%s:", op->data.reg.name, len ); + STRNCATF( buf, "%s:", str, len ); + STRNCATF( buf, "%d|", op->data.reg.size, len ); + break; + + case op_immediate: + + get_operand_data_str( op, str, sizeof str ); + + STRNCAT( buf, "immediate|", len ); + STRNCATF( buf, "%s|", datatype, len ); + STRNCATF( buf, "%s|", str, len ); + break; + + case op_relative_near: + /* NOTE: in raw format, we print the + * relative offset, not the actual + * address of the jump target */ + + STRNCAT( buf, "relative|", len ); + STRNCATF( buf, "%s|", datatype, len ); + STRNCATF( buf, "%" PRId8 "|", op->data.sbyte, len ); + break; + + case op_relative_far: + + STRNCAT( buf, "relative|", len ); + STRNCATF( buf, "%s|", datatype, len ); + + if (op->datatype == op_word) { + STRNCATF( buf, "%" PRId16 "|", op->data.sword, len); + break; + } else { + STRNCATF( buf, "%" PRId32 "|", op->data.sdword, len ); + } + break; + + case op_absolute: + + STRNCAT( buf, "absolute_address|", len ); + STRNCATF( buf, "%s|", datatype, len ); + + STRNCATF( buf, "$0x%04" PRIX16 ":", op->data.absolute.segment, + len ); + if (op->datatype == op_descr16) { + STRNCATF( buf, "0x%04" PRIX16 "|", + op->data.absolute.offset.off16, len ); + } else { + STRNCATF( buf, "0x%08" PRIX32 "|", + op->data.absolute.offset.off32, len ); + } + + break; + + case op_expression: + + STRNCAT( buf, "address_expression|", len ); + STRNCATF( buf, "%s|", datatype, len ); + + len -= format_seg( op, buf, len, native_syntax ); + len -= format_expr( &op->data.expression, buf, len, + raw_syntax ); + + STRNCAT( buf, "|", len ); + break; + + case op_offset: + + STRNCAT( buf, "segment_offset|", len ); + STRNCATF( buf, "%s|", datatype, len ); + + len -= format_seg( op, buf, len, xml_syntax ); + + STRNCATF( buf, "%08" PRIX32 "|", op->data.sdword, len ); + break; + + case op_unused: + case op_unknown: + /* return 0-truncated buffer */ + break; + } + + return( strlen( buf ) ); +} + +int x86_format_operand( x86_op_t *op, char *buf, int len, + enum x86_asm_format format ){ + x86_insn_t *insn; + + if ( ! op || ! buf || len < 1 ) { + return(0); + } + + /* insn is stored in x86_op_t since .21-pre3 */ + insn = (x86_insn_t *) op->insn; + + memset( buf, 0, len ); + + switch ( format ) { + case att_syntax: + return format_operand_att( op, insn, buf, len ); + case xml_syntax: + return format_operand_xml( op, insn, buf, len ); + case raw_syntax: + return format_operand_raw( op, insn, buf, len ); + case native_syntax: + case intel_syntax: + default: + return format_operand_native( op, insn, buf, len ); + } +} + +#define is_imm_jmp(op) (op->type == op_absolute || \ + op->type == op_immediate || \ + op->type == op_offset) +#define is_memory_op(op) (op->type == op_absolute || \ + op->type == op_expression || \ + op->type == op_offset) + +static int format_att_mnemonic( x86_insn_t *insn, char *buf, int len) { + int size = 0; + const char *suffix; + + if (! insn || ! buf || ! len ) + return(0); + + memset( buf, 0, len ); + + /* do long jump/call prefix */ + if ( insn->type == insn_jmp || insn->type == insn_call ) { + if (! is_imm_jmp( x86_operand_1st(insn) ) || + (x86_operand_1st(insn))->datatype != op_byte ) { + /* far jump/call, use "l" prefix */ + STRNCAT( buf, "l", len ); + } + STRNCAT( buf, insn->mnemonic, len ); + + return ( strlen( buf ) ); + } + + /* do mnemonic */ + STRNCAT( buf, insn->mnemonic, len ); + + /* do suffixes for memory operands */ + if (!(insn->note & insn_note_nosuffix) && + (insn->group == insn_arithmetic || + insn->group == insn_logic || + insn->group == insn_move || + insn->group == insn_stack || + insn->group == insn_string || + insn->group == insn_comparison || + insn->type == insn_in || + insn->type == insn_out + )) { + if ( x86_operand_count( insn, op_explicit ) > 0 && + is_memory_op( x86_operand_1st(insn) ) ){ + size = x86_operand_size( x86_operand_1st( insn ) ); + } else if ( x86_operand_count( insn, op_explicit ) > 1 && + is_memory_op( x86_operand_2nd(insn) ) ){ + size = x86_operand_size( x86_operand_2nd( insn ) ); + } + } + + if ( size == 1 ) suffix = "b"; + else if ( size == 2 ) suffix = "w"; + else if ( size == 4 ) suffix = "l"; + else if ( size == 8 ) suffix = "q"; + else suffix = ""; + + STRNCAT( buf, suffix, len ); + return ( strlen( buf ) ); +} + +int x86_format_mnemonic(x86_insn_t *insn, char *buf, int len, + enum x86_asm_format format){ + char str[MAX_OP_STRING]; + + memset( buf, 0, len ); + STRNCAT( buf, insn->prefix_string, len ); + if ( format == att_syntax ) { + format_att_mnemonic( insn, str, sizeof str ); + STRNCAT( buf, str, len ); + } else { + STRNCAT( buf, insn->mnemonic, len ); + } + + return( strlen( buf ) ); +} + +struct op_string { char *buf; size_t len; }; + +static void format_op_raw( x86_op_t *op, x86_insn_t *insn, void *arg ) { + struct op_string * opstr = (struct op_string *) arg; + + format_operand_raw(op, insn, opstr->buf, opstr->len); +} + +static int format_insn_note(x86_insn_t *insn, char *buf, int len){ + char note[32] = {0}; + int len_orig = len, note_len = 32; + + if ( insn->note & insn_note_ring0 ) { + STRNCATF( note, "%s", "Ring0 ", note_len ); + } + if ( insn->note & insn_note_smm ) { + STRNCATF( note, "%s", "SMM ", note_len ); + } + if ( insn->note & insn_note_serial ) { + STRNCATF(note, "%s", "Serialize ", note_len ); + } + STRNCATF( buf, "%s|", note, len ); + + return( len_orig - len ); +} + +static int format_raw_insn( x86_insn_t *insn, char *buf, int len ){ + struct op_string opstr = { buf, len }; + int i; + + /* RAW style: + * ADDRESS|OFFSET|SIZE|BYTES| + * PREFIX|PREFIX_STRING|GROUP|TYPE|NOTES| + * MNEMONIC|CPU|ISA|FLAGS_SET|FLAGS_TESTED| + * STACK_MOD|STACK_MOD_VAL + * [|OP_TYPE|OP_DATATYPE|OP_ACCESS|OP_FLAGS|OP]* + * + * Register values are encoded as: + * NAME:TYPE:SIZE + * + * Effective addresses are encoded as: + * disp(base_reg,index_reg,scale) + */ + STRNCATF( buf, "0x%08" PRIX32 "|", insn->addr , len ); + STRNCATF( buf, "0x%08" PRIX32 "|", insn->offset, len ); + STRNCATF( buf, "%d|" , insn->size , len ); + + /* print bytes */ + for ( i = 0; i < insn->size; i++ ) { + STRNCATF( buf, "%02X ", insn->bytes[i], len ); + } + STRNCAT( buf, "|", len ); + + len -= format_insn_prefix_str( insn->prefix, buf, len ); + STRNCATF( buf, "|%s|", insn->prefix_string , len ); + STRNCATF( buf, "%s|", get_insn_group_str( insn->group ), len ); + STRNCATF( buf, "%s|", get_insn_type_str( insn->type ) , len ); + STRNCATF( buf, "%s|", insn->mnemonic , len ); + STRNCATF( buf, "%s|", get_insn_cpu_str( insn->cpu ) , len ); + STRNCATF( buf, "%s|", get_insn_isa_str( insn->isa ) , len ); + + /* insn note */ + len -= format_insn_note( insn, buf, len ); + + len -= format_insn_eflags_str( insn->flags_set, buf, len ); + STRNCAT( buf, "|", len ); + len -= format_insn_eflags_str( insn->flags_tested, buf, len ); + STRNCAT( buf, "|", len ); + STRNCATF( buf, "%d|", insn->stack_mod, len ); + STRNCATF( buf, "%" PRId32 "|", insn->stack_mod_val, len ); + + opstr.len = len; + x86_operand_foreach( insn, format_op_raw, &opstr, op_any ); + + return( strlen (buf) ); +} + +static int format_xml_insn( x86_insn_t *insn, char *buf, int len ) { + char str[MAX_OP_XML_STRING]; + int i; + + STRNCAT( buf, "\n", len ); + + STRNCATF( buf, "\t
    addr, len ); + STRNCATF( buf, "offset=\"0x%08" PRIX32 "\" ", insn->offset, len ); + STRNCATF( buf, "size=%d bytes=\"", insn->size, len ); + + for ( i = 0; i < insn->size; i++ ) { + STRNCATF( buf, "%02X ", insn->bytes[i], len ); + } + STRNCAT( buf, "\"/>\n", len ); + + STRNCAT( buf, "\tprefix, buf, len ); + STRNCATF( buf, "\" string=\"%s\"/>\n", insn->prefix_string, len ); + + STRNCATF( buf, "\tgroup), len ); + STRNCATF( buf, "type=\"%s\" ", get_insn_type_str (insn->type), len ); + STRNCATF( buf, "string=\"%s\"/>\n", insn->mnemonic, len ); + + STRNCAT( buf, "\t\n", len ); + STRNCAT( buf, "\t\tflags_set, buf, len ); + STRNCAT( buf, "\"/>\n\t\n", len ); + + + STRNCAT( buf, "\t\n", len ); + STRNCAT( buf, "\t\tflags_tested, buf, len ); + STRNCAT( buf, "\"/>\n\t\n", len ); + + if ( x86_operand_1st( insn ) ) { + x86_format_operand( x86_operand_1st(insn), str, + sizeof str, xml_syntax); + STRNCAT( buf, "\t\n", len ); + STRNCAT( buf, str, len ); + STRNCAT( buf, "\t\n", len ); + } + + if ( x86_operand_2nd( insn ) ) { + x86_format_operand( x86_operand_2nd( insn ), str, + sizeof str, xml_syntax); + STRNCAT( buf, "\t\n", len ); + STRNCAT( buf, str, len ); + STRNCAT( buf, "\t\n", len ); + } + + if ( x86_operand_3rd( insn ) ) { + x86_format_operand( x86_operand_3rd(insn), str, + sizeof str, xml_syntax); + STRNCAT( buf, "\t\n", len ); + STRNCAT( buf, str, len ); + STRNCAT( buf, "\t\n", len ); + } + + STRNCAT( buf, "\n", len ); + + return strlen (buf); +} + +int x86_format_header( char *buf, int len, enum x86_asm_format format ) { + switch (format) { + case att_syntax: + snprintf( buf, len, "MNEMONIC\tSRC, DEST, IMM" ); + break; + case intel_syntax: + snprintf( buf, len, "MNEMONIC\tDEST, SRC, IMM" ); + break; + case native_syntax: + snprintf( buf, len, "ADDRESS\tBYTES\tMNEMONIC\t" + "DEST\tSRC\tIMM" ); + break; + case raw_syntax: + snprintf( buf, len, "ADDRESS|OFFSET|SIZE|BYTES|" + "PREFIX|PREFIX_STRING|GROUP|TYPE|NOTES|" + "MNEMONIC|CPU|ISA|FLAGS_SET|FLAGS_TESTED|" + "STACK_MOD|STACK_MOD_VAL" + "[|OP_TYPE|OP_DATATYPE|OP_ACCESS|OP_FLAGS|OP]*" + ); + break; + case xml_syntax: + snprintf( buf, len, + "" + "
    " + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "
    " + "" + "" + "" + "
    " + "" + "" + "" + ); + break; + case unknown_syntax: + if ( len ) { + buf[0] = '\0'; + } + break; + } + + return( strlen(buf) ); +} + +int x86_format_insn( x86_insn_t *insn, char *buf, int len, + enum x86_asm_format format ){ + char str[MAX_OP_STRING]; + x86_op_t *src, *dst; + int i; + + memset(buf, 0, len); + if ( format == intel_syntax ) { + /* INTEL STYLE: mnemonic dest, src, imm */ + STRNCAT( buf, insn->prefix_string, len ); + STRNCAT( buf, insn->mnemonic, len ); + STRNCAT( buf, "\t", len ); + + /* dest */ + if ( (dst = x86_operand_1st( insn )) && !(dst->flags & op_implied) ) { + x86_format_operand( dst, str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + } + + /* src */ + if ( (src = x86_operand_2nd( insn )) ) { + if ( !(dst->flags & op_implied) ) { + STRNCAT( buf, ", ", len ); + } + x86_format_operand( src, str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + } + + /* imm */ + if ( x86_operand_3rd( insn )) { + STRNCAT( buf, ", ", len ); + x86_format_operand( x86_operand_3rd( insn ), + str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + } + + } else if ( format == att_syntax ) { + /* ATT STYLE: mnemonic src, dest, imm */ + STRNCAT( buf, insn->prefix_string, len ); + format_att_mnemonic(insn, str, MAX_OP_STRING); + STRNCATF( buf, "%s\t", str, len); + + + /* not sure which is correct? sometimes GNU as requires + * an imm as the first operand, sometimes as the third... */ + /* imm */ + if ( x86_operand_3rd( insn ) ) { + x86_format_operand(x86_operand_3rd( insn ), + str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + /* there is always 'dest' operand if there is 'src' */ + STRNCAT( buf, ", ", len ); + } + + if ( (insn->note & insn_note_nonswap ) == 0 ) { + /* regular AT&T style swap */ + src = x86_operand_2nd( insn ); + dst = x86_operand_1st( insn ); + } + else { + /* special-case instructions */ + src = x86_operand_1st( insn ); + dst = x86_operand_2nd( insn ); + } + + /* src */ + if ( src ) { + x86_format_operand(src, str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + /* there is always 'dest' operand if there is 'src' */ + if ( dst && !(dst->flags & op_implied) ) { + STRNCAT( buf, ", ", len ); + } + } + + /* dest */ + if ( dst && !(dst->flags & op_implied) ) { + x86_format_operand( dst, str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + } + + + } else if ( format == raw_syntax ) { + format_raw_insn( insn, buf, len ); + } else if ( format == xml_syntax ) { + format_xml_insn( insn, buf, len ); + } else { /* default to native */ + /* NATIVE style: RVA\tBYTES\tMNEMONIC\tOPERANDS */ + /* print address */ + STRNCATF( buf, "%08" PRIX32 "\t", insn->addr, len ); + + /* print bytes */ + for ( i = 0; i < insn->size; i++ ) { + STRNCATF( buf, "%02X ", insn->bytes[i], len ); + } + + STRNCAT( buf, "\t", len ); + + /* print mnemonic */ + STRNCAT( buf, insn->prefix_string, len ); + STRNCAT( buf, insn->mnemonic, len ); + STRNCAT( buf, "\t", len ); + + /* print operands */ + /* dest */ + if ( x86_operand_1st( insn ) ) { + x86_format_operand( x86_operand_1st( insn ), + str, MAX_OP_STRING, format); + STRNCATF( buf, "%s\t", str, len ); + } + + /* src */ + if ( x86_operand_2nd( insn ) ) { + x86_format_operand(x86_operand_2nd( insn ), + str, MAX_OP_STRING, format); + STRNCATF( buf, "%s\t", str, len ); + } + + /* imm */ + if ( x86_operand_3rd( insn )) { + x86_format_operand( x86_operand_3rd( insn ), + str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + } + } + + return( strlen( buf ) ); +} + diff --git a/src/third_party/libdisasm/x86_imm.c b/src/third_party/libdisasm/x86_imm.c new file mode 100644 index 0000000..cd59bfc --- /dev/null +++ b/src/third_party/libdisasm/x86_imm.c @@ -0,0 +1,70 @@ +#include "qword.h" +#include "x86_imm.h" + +#include + +unsigned int x86_imm_signsized( unsigned char * buf, size_t buf_len, + void *dest, unsigned int size ) { + signed char *cp = (signed char *) dest; + signed short *sp = (signed short *) dest; + int32_t *lp = (int32_t *) dest; + qword_t *qp = (qword_t *) dest; + + if ( size > buf_len ) { + return 0; + } + + /* Copy 'size' bytes from *buf to *op + * return number of bytes copied */ + switch (size) { + case 1: /* BYTE */ + *cp = *((signed char *) buf); + break; + case 2: /* WORD */ + *sp = *((signed short *) buf); + break; + case 6: + case 8: /* QWORD */ + *qp = *((qword_t *) buf); + break; + case 4: /* DWORD */ + default: + *lp = *((int32_t *) buf); + break; + } + return (size); +} + +unsigned int x86_imm_sized( unsigned char * buf, size_t buf_len, void *dest, + unsigned int size ) { + unsigned char *cp = (unsigned char *) dest; + unsigned short *sp = (unsigned short *) dest; + uint32_t *lp = (uint32_t *) dest; + qword_t *qp = (qword_t *) dest; + + if ( size > buf_len ) { + return 0; + } + + /* Copy 'size' bytes from *buf to *op + * return number of bytes copied */ + switch (size) { + case 1: /* BYTE */ + *cp = *((unsigned char *) buf); + break; + case 2: /* WORD */ + *sp = *((unsigned short *) buf); + break; + case 6: + case 8: /* QWORD */ + *qp = *((qword_t *) buf); + break; + case 4: /* DWORD */ + default: + *lp = *((uint32_t *) buf); + break; + } + + return (size); +} + diff --git a/src/third_party/libdisasm/x86_imm.h b/src/third_party/libdisasm/x86_imm.h new file mode 100644 index 0000000..fa35ff2 --- /dev/null +++ b/src/third_party/libdisasm/x86_imm.h @@ -0,0 +1,18 @@ +#ifndef x86_IMM_H +#define x86_IMM_H + +#include "./qword.h" +#include + +#ifdef WIN32 +#include +#endif + +/* these are in the global x86 namespace but are not a part of the + * official API */ +unsigned int x86_imm_sized( unsigned char *buf, size_t buf_len, void *dest, + unsigned int size ); + +unsigned int x86_imm_signsized( unsigned char *buf, size_t buf_len, void *dest, + unsigned int size ); +#endif diff --git a/src/third_party/libdisasm/x86_insn.c b/src/third_party/libdisasm/x86_insn.c new file mode 100644 index 0000000..5649b89 --- /dev/null +++ b/src/third_party/libdisasm/x86_insn.c @@ -0,0 +1,182 @@ +#include +#include + +#include "libdis.h" + +#ifdef _MSC_VER + #define snprintf _snprintf + #define inline __inline +#endif + +int x86_insn_is_valid( x86_insn_t *insn ) { + if ( insn && insn->type != insn_invalid && insn->size > 0 ) { + return 1; + } + + return 0; +} + +uint32_t x86_get_address( x86_insn_t *insn ) { + x86_oplist_t *op_lst; + if (! insn || ! insn->operands ) { + return 0; + } + + for (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) { + if ( op_lst->op.type == op_offset ) { + return op_lst->op.data.offset; + } else if ( op_lst->op.type == op_absolute ) { + if ( op_lst->op.datatype == op_descr16 ) { + return (uint32_t) + op_lst->op.data.absolute.offset.off16; + } + return op_lst->op.data.absolute.offset.off32; + } + } + + return 0; +} + +int32_t x86_get_rel_offset( x86_insn_t *insn ) { + x86_oplist_t *op_lst; + if (! insn || ! insn->operands ) { + return 0; + } + + for (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) { + if ( op_lst->op.type == op_relative_near ) { + return (int32_t) op_lst->op.data.relative_near; + } else if ( op_lst->op.type == op_relative_far ) { + return op_lst->op.data.relative_far; + } + } + + return 0; +} + +x86_op_t * x86_get_branch_target( x86_insn_t *insn ) { + x86_oplist_t *op_lst; + if (! insn || ! insn->operands ) { + return NULL; + } + + for (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) { + if ( op_lst->op.access & op_execute ) { + return &(op_lst->op); + } + } + + return NULL; +} +x86_op_t * x86_get_imm( x86_insn_t *insn ) { + x86_oplist_t *op_lst; + if (! insn || ! insn->operands ) { + return NULL; + } + + for (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) { + if ( op_lst->op.type == op_immediate ) { + return &(op_lst->op); + } + } + + return NULL; +} + +#define IS_PROPER_IMM( x ) \ + x->op.type == op_immediate && ! (x->op.flags & op_hardcode) + + +/* if there is an immediate value in the instruction, return a pointer to + * it */ +unsigned char * x86_get_raw_imm( x86_insn_t *insn ) { + int size, offset; + x86_op_t *op = NULL; + + if (! insn || ! insn->operands ) { + return(NULL); + } + + /* a bit inelegant, but oh well... */ + if ( IS_PROPER_IMM( insn->operands ) ) { + op = &insn->operands->op; + } else if ( insn->operands->next ) { + if ( IS_PROPER_IMM( insn->operands->next ) ) { + op = &insn->operands->next->op; + } else if ( insn->operands->next->next && + IS_PROPER_IMM( insn->operands->next->next ) ) { + op = &insn->operands->next->next->op; + } + } + + if (! op ) { + return( NULL ); + } + + /* immediate data is at the end of the insn */ + size = x86_operand_size( op ); + offset = insn->size - size; + return( &insn->bytes[offset] ); +} + + +unsigned int x86_operand_size( x86_op_t *op ) { + switch (op->datatype ) { + case op_byte: return 1; + case op_word: return 2; + case op_dword: return 4; + case op_qword: return 8; + case op_dqword: return 16; + case op_sreal: return 4; + case op_dreal: return 8; + case op_extreal: return 10; + case op_bcd: return 10; + case op_ssimd: return 16; + case op_dsimd: return 16; + case op_sssimd: return 4; + case op_sdsimd: return 8; + case op_descr32: return 6; + case op_descr16: return 4; + case op_pdescr32: return 6; + case op_pdescr16: return 6; + case op_bounds16: return 4; + case op_bounds32: return 8; + case op_fpuenv16: return 14; + case op_fpuenv32: return 28; + case op_fpustate16: return 94; + case op_fpustate32: return 108; + case op_fpregset: return 512; + case op_fpreg: return 10; + case op_none: return 0; + } + return(4); /* default size */ +} + +void x86_set_insn_addr( x86_insn_t *insn, uint32_t addr ) { + if ( insn ) insn->addr = addr; +} + +void x86_set_insn_offset( x86_insn_t *insn, unsigned int offset ){ + if ( insn ) insn->offset = offset; +} + +void x86_set_insn_function( x86_insn_t *insn, void * func ){ + if ( insn ) insn->function = func; +} + +void x86_set_insn_block( x86_insn_t *insn, void * block ){ + if ( insn ) insn->block = block; +} + +void x86_tag_insn( x86_insn_t *insn ){ + if ( insn ) insn->tag = 1; +} + +void x86_untag_insn( x86_insn_t *insn ){ + if ( insn ) insn->tag = 0; +} + +int x86_insn_is_tagged( x86_insn_t *insn ){ + return insn->tag; +} + diff --git a/src/third_party/libdisasm/x86_misc.c b/src/third_party/libdisasm/x86_misc.c new file mode 100644 index 0000000..3d2dd0a --- /dev/null +++ b/src/third_party/libdisasm/x86_misc.c @@ -0,0 +1,71 @@ +#include +#include +#include + +#include "libdis.h" +#include "ia32_insn.h" +#include "ia32_reg.h" /* for ia32_reg wrapper */ +#include "ia32_settings.h" +extern ia32_settings_t ia32_settings; + +#ifdef _MSC_VER + #define snprintf _snprintf + #define inline __inline +#endif + + +/* =========================================================== INIT/TERM */ +static DISASM_REPORTER __x86_reporter_func = NULL; +static void * __x86_reporter_arg = NULL; + +int x86_init( enum x86_options options, DISASM_REPORTER reporter, void * arg ) +{ + ia32_settings.options = options; + __x86_reporter_func = reporter; + __x86_reporter_arg = arg; + + return 1; +} + +void x86_set_reporter( DISASM_REPORTER reporter, void * arg ) { + __x86_reporter_func = reporter; + __x86_reporter_arg = arg; +} + +void x86_set_options( enum x86_options options ){ + ia32_settings.options = options; +} + +enum x86_options x86_get_options( void ) { + return ia32_settings.options; +} + +int x86_cleanup( void ) +{ + return 1; +} + +/* =========================================================== ERRORS */ +void x86_report_error( enum x86_report_codes code, void *data ) { + if ( __x86_reporter_func ) { + (*__x86_reporter_func)(code, data, __x86_reporter_arg); + } +} + + +/* =========================================================== MISC */ +unsigned int x86_endian(void) { return ia32_settings.endian; } +unsigned int x86_addr_size(void) { return ia32_settings.sz_addr; } +unsigned int x86_op_size(void) { return ia32_settings.sz_oper; } +unsigned int x86_word_size(void) { return ia32_settings.sz_word; } +unsigned int x86_max_insn_size(void) { return ia32_settings.max_insn; } +unsigned int x86_sp_reg(void) { return ia32_settings.id_sp_reg; } +unsigned int x86_fp_reg(void) { return ia32_settings.id_fp_reg; } +unsigned int x86_ip_reg(void) { return ia32_settings.id_ip_reg; } +unsigned int x86_flag_reg(void) { return ia32_settings.id_flag_reg; } + +/* wrapper function to hide the IA32 register fn */ +void x86_reg_from_id( unsigned int id, x86_reg_t * reg ) { + ia32_handle_register( reg, id ); + return; +} diff --git a/src/third_party/libdisasm/x86_operand_list.c b/src/third_party/libdisasm/x86_operand_list.c new file mode 100644 index 0000000..95409e0 --- /dev/null +++ b/src/third_party/libdisasm/x86_operand_list.c @@ -0,0 +1,191 @@ +#include +#include "libdis.h" + + +static void x86_oplist_append( x86_insn_t *insn, x86_oplist_t *op ) { + x86_oplist_t *list; + + if (! insn ) { + return; + } + + list = insn->operands; + if (! list ) { + insn->operand_count = 1; + /* Note that we have no way of knowing if this is an + * exlicit operand or not, since the caller fills + * the x86_op_t after we return. We increase the + * explicit count automatically, and ia32_insn_implicit_ops + * decrements it */ + insn->explicit_count = 1; + insn->operands = op; + return; + } + + /* get to end of list */ + for ( ; list->next; list = list->next ) + ; + + insn->operand_count = insn->operand_count + 1; + insn->explicit_count = insn->explicit_count + 1; + list->next = op; + + return; +} + +x86_op_t * x86_operand_new( x86_insn_t *insn ) { + x86_oplist_t *op; + + if (! insn ) { + return(NULL); + } + op = calloc( sizeof(x86_oplist_t), 1 ); + op->op.insn = insn; + x86_oplist_append( insn, op ); + return( &(op->op) ); +} + +void x86_oplist_free( x86_insn_t *insn ) { + x86_oplist_t *op, *list; + + if (! insn ) { + return; + } + + for ( list = insn->operands; list; ) { + op = list; + list = list->next; + free(op); + } + + insn->operands = NULL; + insn->operand_count = 0; + insn->explicit_count = 0; + + return; +} + +/* ================================================== LIBDISASM API */ +/* these could probably just be #defines, but that means exposing the + enum... yet one more confusing thing in the API */ +int x86_operand_foreach( x86_insn_t *insn, x86_operand_fn func, void *arg, + enum x86_op_foreach_type type ){ + x86_oplist_t *list; + char explicit = 1, implicit = 1; + + if (! insn || ! func ) { + return 0; + } + + /* note: explicit and implicit can be ORed together to + * allow an "all" limited by access type, even though the + * user is stupid to do this since it is default behavior :) */ + if ( (type & op_explicit) && ! (type & op_implicit) ) { + implicit = 0; + } + if ( (type & op_implicit) && ! (type & op_explicit) ) { + explicit = 0; + } + + type = type & 0x0F; /* mask out explicit/implicit operands */ + + for ( list = insn->operands; list; list = list->next ) { + if (! implicit && (list->op.flags & op_implied) ) { + /* operand is implicit */ + continue; + } + + if (! explicit && ! (list->op.flags & op_implied) ) { + /* operand is not implicit */ + continue; + } + + switch ( type ) { + case op_any: + break; + case op_dest: + if (! (list->op.access & op_write) ) { + continue; + } + break; + case op_src: + if (! (list->op.access & op_read) ) { + continue; + } + break; + case op_ro: + if (! (list->op.access & op_read) || + (list->op.access & op_write ) ) { + continue; + } + break; + case op_wo: + if (! (list->op.access & op_write) || + (list->op.access & op_read ) ) { + continue; + } + break; + case op_xo: + if (! (list->op.access & op_execute) ) { + continue; + } + break; + case op_rw: + if (! (list->op.access & op_write) || + ! (list->op.access & op_read ) ) { + continue; + } + break; + case op_implicit: case op_explicit: /* make gcc happy */ + break; + } + /* any non-continue ends up here: invoke the callback */ + (*func)( &list->op, insn, arg ); + } + + return 1; +} + +static void count_operand( x86_op_t *op, x86_insn_t *insn, void *arg ) { + size_t * count = (size_t *) arg; + *count = *count + 1; +} + +size_t x86_operand_count( x86_insn_t *insn, enum x86_op_foreach_type type ) { + size_t count = 0; + + /* save us a list traversal for common counts... */ + if ( type == op_any ) { + return insn->operand_count; + } else if ( type == op_explicit ) { + return insn->explicit_count; + } + + x86_operand_foreach( insn, count_operand, &count, type ); + return count; +} + +/* accessor functions */ +x86_op_t * x86_operand_1st( x86_insn_t *insn ) { + if (! insn->explicit_count ) { + return NULL; + } + + return &(insn->operands->op); +} + +x86_op_t * x86_operand_2nd( x86_insn_t *insn ) { + if ( insn->explicit_count < 2 ) { + return NULL; + } + + return &(insn->operands->next->op); +} + +x86_op_t * x86_operand_3rd( x86_insn_t *insn ) { + if ( insn->explicit_count < 3 ) { + return NULL; + } + + return &(insn->operands->next->next->op); +} diff --git a/src/third_party/libdisasm/x86_operand_list.h b/src/third_party/libdisasm/x86_operand_list.h new file mode 100644 index 0000000..5366865 --- /dev/null +++ b/src/third_party/libdisasm/x86_operand_list.h @@ -0,0 +1,8 @@ +#ifndef X86_OPERAND_LIST_H +#define X86_OPERAND_LIST_H +#include "libdis.h" + + +x86_op_t * x86_operand_new( x86_insn_t *insn ); + +#endif diff --git a/src/third_party/linux/include/gflags/gflags_completions.h b/src/third_party/linux/include/gflags/gflags_completions.h new file mode 100644 index 0000000..fe06b47 --- /dev/null +++ b/src/third_party/linux/include/gflags/gflags_completions.h @@ -0,0 +1,120 @@ +// Copyright 2008 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// --- +// Author: Dave Nicponski +// +// Implement helpful bash-style command line flag completions +// +// ** Functional API: +// HandleCommandLineCompletions() should be called early during +// program startup, but after command line flag code has been +// initialized, such as the beginning of HandleCommandLineHelpFlags(). +// It checks the value of the flag --tab_completion_word. If this +// flag is empty, nothing happens here. If it contains a string, +// however, then HandleCommandLineCompletions() will hijack the +// process, attempting to identify the intention behind this +// completion. Regardless of the outcome of this deduction, the +// process will be terminated, similar to --helpshort flag +// handling. +// +// ** Overview of Bash completions: +// Bash can be told to programatically determine completions for the +// current 'cursor word'. It does this by (in this case) invoking a +// command with some additional arguments identifying the command +// being executed, the word being completed, and the previous word +// (if any). Bash then expects a sequence of output lines to be +// printed to stdout. If these lines all contain a common prefix +// longer than the cursor word, bash will replace the cursor word +// with that common prefix, and display nothing. If there isn't such +// a common prefix, bash will display the lines in pages using 'more'. +// +// ** Strategy taken for command line completions: +// If we can deduce either the exact flag intended, or a common flag +// prefix, we'll output exactly that. Otherwise, if information +// must be displayed to the user, we'll take the opportunity to add +// some helpful information beyond just the flag name (specifically, +// we'll include the default flag value and as much of the flag's +// description as can fit on a single terminal line width, as specified +// by the flag --tab_completion_columns). Furthermore, we'll try to +// make bash order the output such that the most useful or relevent +// flags are the most likely to be shown at the top. +// +// ** Additional features: +// To assist in finding that one really useful flag, substring matching +// was implemented. Before pressing a to get completion for the +// current word, you can append one or more '?' to the flag to do +// substring matching. Here's the semantics: +// --foo Show me all flags with names prefixed by 'foo' +// --foo? Show me all flags with 'foo' somewhere in the name +// --foo?? Same as prior case, but also search in module +// definition path for 'foo' +// --foo??? Same as prior case, but also search in flag +// descriptions for 'foo' +// Finally, we'll trim the output to a relatively small number of +// flags to keep bash quiet about the verbosity of output. If one +// really wanted to see all possible matches, appending a '+' to the +// search word will force the exhaustive list of matches to be printed. +// +// ** How to have bash accept completions from a binary: +// Bash requires that it be informed about each command that programmatic +// completion should be enabled for. Example addition to a .bashrc +// file would be (your path to gflags_completions.sh file may differ): + +/* +$ complete -o bashdefault -o default -o nospace -C \ + '/usr/local/bin/gflags_completions.sh --tab_completion_columns $COLUMNS' \ + time env binary_name another_binary [...] +*/ + +// This would allow the following to work: +// $ /path/to/binary_name --vmodule +// Or: +// $ ./bin/path/another_binary --gfs_u +// (etc) +// +// Sadly, it appears that bash gives no easy way to force this behavior for +// all commands. That's where the "time" in the above example comes in. +// If you haven't specifically added a command to the list of completion +// supported commands, you can still get completions by prefixing the +// entire command with "env". +// $ env /some/brand/new/binary --vmod +// Assuming that "binary" is a newly compiled binary, this should still +// produce the expected completion output. + + +#ifndef GOOGLE_GFLAGS_COMPLETIONS_H_ +#define GOOGLE_GFLAGS_COMPLETIONS_H_ + +namespace google { + +void HandleCommandLineCompletions(void); + +} + +#endif // GOOGLE_GFLAGS_COMPLETIONS_H_ diff --git a/src/third_party/lss/.gitignore b/src/third_party/lss/.gitignore new file mode 100644 index 0000000..4032eb0 --- /dev/null +++ b/src/third_party/lss/.gitignore @@ -0,0 +1,3 @@ +*.o + +core diff --git a/src/third_party/lss/DIR_METADATA b/src/third_party/lss/DIR_METADATA new file mode 100644 index 0000000..eccfd35 --- /dev/null +++ b/src/third_party/lss/DIR_METADATA @@ -0,0 +1,12 @@ +# Metadata information for this directory. +# +# For more information on DIR_METADATA files, see: +# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/README.md +# +# For the schema of this file, see Metadata message: +# https://source.chromium.org/chromium/infra/infra/+/HEAD:go/src/infra/tools/dirmd/proto/dir_metadata.proto + +os: LINUX +monorail { + project: "linux-syscall-support" +} diff --git a/src/third_party/lss/LICENSE b/src/third_party/lss/LICENSE new file mode 100644 index 0000000..b66a6b2 --- /dev/null +++ b/src/third_party/lss/LICENSE @@ -0,0 +1,27 @@ +Copyright 2005-2011 Google LLC + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/third_party/lss/OWNERS b/src/third_party/lss/OWNERS new file mode 100644 index 0000000..29b02fa --- /dev/null +++ b/src/third_party/lss/OWNERS @@ -0,0 +1,2 @@ +mseaborn@chromium.org +vapier@chromium.org diff --git a/src/third_party/lss/README.md b/src/third_party/lss/README.md new file mode 100644 index 0000000..e25abdd --- /dev/null +++ b/src/third_party/lss/README.md @@ -0,0 +1,138 @@ +# Linux Syscall Support (LSS) + +Every so often, projects need to directly embed Linux system calls instead of +calling the implementations in the system runtime library. + +This project provides a header file that can be included into your application +whenever you need to make direct system calls. + +The goal is to provide an API that generally mirrors the standard C library +while still making direct syscalls. We try to hide some of the differences +between arches when reasonably feasible. e.g. Newer architectures no longer +provide an `open` syscall, but do provide `openat`. We will still expose a +`sys_open` helper by default that calls into `openat` instead. + +We explicitly do not expose the raw syscall ABI including all of its historical +warts to the user. We want people to be able to easily make a syscall, not have +to worry that on some arches size args are swapped or they are shifted. + +Please be sure to review the Caveats section below however. + +## How to include linux\_syscall\_support.h in your project + +You can either copy the file into your project, or preferably, you can set up +Git submodules to automatically pull from our source repository. + +## Supported targets + +The following architectures/ABIs have been tested (at some point) and should +generally work. If you don't see your combo listed here, please double check +the header itself as this list might be out of date. + +* x86 32-bit (i.e. i386, i486, i586, i686, Intel, AMD, etc...) +* [x86_64 64-bit](https://en.wikipedia.org/wiki/X86-64) (i.e. x86-64, amd64, etc...) +* [x32 32-bit](https://sites.google.com/site/x32abi/) +* [ARM 32-bit](https://en.wikipedia.org/wiki/ARM_architecture) OABI +* [ARM 32-bit](https://en.wikipedia.org/wiki/ARM_architecture) EABI (i.e. armv6, armv7, etc...) +* AARCH64 64-bit (i.e. arm64, armv8, etc...) +* PowerPC 32-bit (i.e. ppc, ppc32, etc...) +* MIPS 32-bit o32 ABI +* MIPS 32-bit n32 ABI +* MIPS 64-bit n64 ABI +* LOONGARCH 64-bit ABI + +## API + +By default, you can just add a `sys_` prefix to any function you want to call. +So if you want to call `open(...)`, use `sys_open(...)` instead. + +### Knobs + +The linux\_syscall\_support.h header provides many knobs for you to control +the exported API. These are all documented in the top of the header in a big +comment block, so refer to that instead. + +## Caveats + +### ABI differences + +Some functions that the standard C library exposes use a different ABI than +what the Linux kernel uses. Care must be taken when making syscalls directly +that you use the right structure and flags. e.g. Most C libraries define a +`struct stat` (commonly in `sys/stat.h` or `bits/stat.h`) that is different +from the `struct stat` the kernel uses (commonly in `asm/stat.h`). If you use +the wrong structure layout, then you can see errors like memory corruption or +weird/shifted values. If you plan on making syscalls directly, you should +focus on headers that are available under the `linux/` and `asm/` namespaces. + +Note: LSS provides structs for most of these cases. For `sys_stat()`, it +provides `struct kernel_stat` for you to use. + +### Transparent backwards compatibility with older kernels + +While some C libraries (notably, glibc) take care to fallback to older syscalls +when running on older kernels, there is no such support in LSS. If you plan on +trying to run on older kernels, you will need to handle errors yourself (e.g. +`ENOSYS` when using a too new syscall). + +Remember that this can happen with new flag bits too. e.g. The `O_CLOEXEC` +flag was added to many syscalls, but if you try to run use it on older kernels, +it will fail with `EINVAL`. In that case, you must handle the fallback logic +yourself. + +### Variable arguments (varargs) + +We do not support vararg type functions. e.g. While the standard `open()` +function can accept 2 or 3 arguments (with the mode field being optional), +the `sys_open()` function always requires 3 arguments. + +## Bug reports & feature requests + +If you wish to report a problem or request a feature, please file them in our +[bug tracker](https://bugs.chromium.org/p/linux-syscall-support/issues/). + +Please do not post patches to the tracker. Instead, see below for how to send +patches to us directly. + +While we welcome feature requests, please keep in mind that it is unlikely that +anyone will find time to implement them for you. Sending patches is strongly +preferred and will often move things much faster. + +## Projects that use LSS + +* [Chromium](https://www.chromium.org/) +* [Breakpad](https://chromium.googlesource.com/breakpad/breakpad) +* [Native Client](https://developer.chrome.com/native-client), in nacl\_bootstrap.c + +## How to get an LSS change committed + +### Review + +You get your change reviewed, you can upload it to +[Gerrit](https://chromium-review.googlesource.com/q/project:linux-syscall-support+status:open) +using `git cl upload` from +[Chromium's depot-tools](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html). + +### Testing + +Tests are found in the [tests/](./tests/) subdirectory. It does not (yet) offer +100% coverage, but should grow over time. + +New commits that update/change/add syscall wrappers should include tests for +them too. Consult the [test documentation](./tests/README.md) for more details. + +To run, just run `make` inside the tests directory. It will compile & execute +the tests locally. + +There is some limited cross-compile coverage available if you run `make cross`. +It only compiles things (does not execute at all). + +### Rolling into Chromium + +If you commit a change to LSS, please also commit a Chromium change to update +`lss_revision` in +[Chromium's DEPS](https://chromium.googlesource.com/chromium/src/+/HEAD/DEPS) +file. + +This ensures that the LSS change gets tested, so that people who commit later +LSS changes don't run into problems with updating `lss_revision`. diff --git a/src/third_party/lss/codereview.settings b/src/third_party/lss/codereview.settings new file mode 100644 index 0000000..b5082e8 --- /dev/null +++ b/src/third_party/lss/codereview.settings @@ -0,0 +1,5 @@ +# This file is used by git cl to get repository specific information. +CC_LIST: chromium-reviews@chromium.org,mseaborn@chromium.org +CODE_REVIEW_SERVER: codereview.chromium.org +GERRIT_HOST: True +VIEW_VC: https://chromium.googlesource.com/linux-syscall-support/+/ diff --git a/src/third_party/lss/linux_syscall_support.h b/src/third_party/lss/linux_syscall_support.h new file mode 100644 index 0000000..aab95e6 --- /dev/null +++ b/src/third_party/lss/linux_syscall_support.h @@ -0,0 +1,5333 @@ +/* Copyright 2005-2011 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Markus Gutschke + */ + +/* This file includes Linux-specific support functions common to the + * coredumper and the thread lister; primarily, this is a collection + * of direct system calls, and a couple of symbols missing from + * standard header files. + * There are a few options that the including file can set to control + * the behavior of this file: + * + * SYS_CPLUSPLUS: + * The entire header file will normally be wrapped in 'extern "C" { }", + * making it suitable for compilation as both C and C++ source. If you + * do not want to do this, you can set the SYS_CPLUSPLUS macro to inhibit + * the wrapping. N.B. doing so will suppress inclusion of all prerequisite + * system header files, too. It is the caller's responsibility to provide + * the necessary definitions. + * + * SYS_ERRNO: + * All system calls will update "errno" unless overridden by setting the + * SYS_ERRNO macro prior to including this file. SYS_ERRNO should be + * an l-value. + * + * SYS_INLINE: + * New symbols will be defined "static inline", unless overridden by + * the SYS_INLINE macro. + * + * SYS_LINUX_SYSCALL_SUPPORT_H + * This macro is used to avoid multiple inclusions of this header file. + * If you need to include this file more than once, make sure to + * unset SYS_LINUX_SYSCALL_SUPPORT_H before each inclusion. + * + * SYS_PREFIX: + * New system calls will have a prefix of "sys_" unless overridden by + * the SYS_PREFIX macro. Valid values for this macro are [0..9] which + * results in prefixes "sys[0..9]_". It is also possible to set this + * macro to -1, which avoids all prefixes. + * + * SYS_SYSCALL_ENTRYPOINT: + * Some applications (such as sandboxes that filter system calls), need + * to be able to run custom-code each time a system call is made. If this + * macro is defined, it expands to the name of a "common" symbol. If + * this symbol is assigned a non-NULL pointer value, it is used as the + * address of the system call entrypoint. + * A pointer to this symbol can be obtained by calling + * get_syscall_entrypoint() + * + * This file defines a few internal symbols that all start with "LSS_". + * Do not access these symbols from outside this file. They are not part + * of the supported API. + */ +#ifndef SYS_LINUX_SYSCALL_SUPPORT_H +#define SYS_LINUX_SYSCALL_SUPPORT_H + +/* We currently only support x86-32, x86-64, ARM, MIPS, PPC, s390 and s390x + * on Linux. + * Porting to other related platforms should not be difficult. + */ +#if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) || \ + defined(__mips__) || defined(__PPC__) || defined(__ARM_EABI__) || \ + defined(__aarch64__) || defined(__s390__) || defined(__e2k__) || \ + (defined(__riscv) && __riscv_xlen == 64) || defined(__loongarch_lp64)) \ + && (defined(__linux) || defined(__ANDROID__)) + +#ifndef SYS_CPLUSPLUS +#ifdef __cplusplus +/* Some system header files in older versions of gcc neglect to properly + * handle being included from C++. As it appears to be harmless to have + * multiple nested 'extern "C"' blocks, just add another one here. + */ +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __mips__ +/* Include definitions of the ABI currently in use. */ +#ifdef __ANDROID__ +/* Android doesn't have sgidefs.h, but does have asm/sgidefs.h, + * which has the definitions we need. + */ +#include +#else +#include +#endif +#endif +#endif + +/* Some libcs, for example Android NDK and musl, #define these + * macros as aliases to their non-64 counterparts. To avoid naming + * conflict, remove them. + * + * These are restored by the corresponding #pragma pop_macro near + * the end of this file. + */ +#pragma push_macro("stat64") +#pragma push_macro("fstat64") +#pragma push_macro("lstat64") +#pragma push_macro("pread64") +#pragma push_macro("pwrite64") +#pragma push_macro("getdents64") +#undef stat64 +#undef fstat64 +#undef lstat64 +#undef pread64 +#undef pwrite64 +#undef getdents64 + +#if defined(__ANDROID__) && defined(__x86_64__) +// A number of x86_64 syscalls are blocked by seccomp on recent Android; +// undefine them so that modern alternatives will be used instead where +// possible. +// The alternative syscalls have been sanity checked against linux-3.4+; +// older versions might not work. +# undef __NR_getdents +# undef __NR_dup2 +# undef __NR_fork +# undef __NR_getpgrp +# undef __NR_open +# undef __NR_poll +# undef __NR_readlink +# undef __NR_stat +# undef __NR_unlink +# undef __NR_pipe +#endif + +#if defined(__ANDROID__) +// waitpid is blocked by seccomp on all architectures on recent Android. +# undef __NR_waitpid +#endif + +/* As glibc often provides subtly incompatible data structures (and implicit + * wrapper functions that convert them), we provide our own kernel data + * structures for use by the system calls. + * These structures have been developed by using Linux 2.6.23 headers for + * reference. Note though, we do not care about exact API compatibility + * with the kernel, and in fact the kernel often does not have a single + * API that works across architectures. Instead, we try to mimic the glibc + * API where reasonable, and only guarantee ABI compatibility with the + * kernel headers. + * Most notably, here are a few changes that were made to the structures + * defined by kernel headers: + * + * - we only define structures, but not symbolic names for kernel data + * types. For the latter, we directly use the native C datatype + * (i.e. "unsigned" instead of "mode_t"). + * - in a few cases, it is possible to define identical structures for + * both 32bit (e.g. i386) and 64bit (e.g. x86-64) platforms by + * standardizing on the 64bit version of the data types. In particular, + * this means that we use "unsigned" where the 32bit headers say + * "unsigned long". + * - overall, we try to minimize the number of cases where we need to + * conditionally define different structures. + * - the "struct kernel_sigaction" class of structures have been + * modified to more closely mimic glibc's API by introducing an + * anonymous union for the function pointer. + * - a small number of field names had to have an underscore appended to + * them, because glibc defines a global macro by the same name. + */ + +/* include/linux/dirent.h */ +struct kernel_dirent64 { + unsigned long long d_ino; + long long d_off; + unsigned short d_reclen; + unsigned char d_type; + char d_name[256]; +}; + +/* include/linux/dirent.h */ +#if !defined(__NR_getdents) +// when getdents is not available, getdents64 is used for both. +#define kernel_dirent kernel_dirent64 +#else +struct kernel_dirent { + long d_ino; + long d_off; + unsigned short d_reclen; + char d_name[256]; +}; +#endif + +/* include/linux/uio.h */ +struct kernel_iovec { + void *iov_base; + unsigned long iov_len; +}; + +/* include/linux/socket.h */ +struct kernel_msghdr { + void *msg_name; + int msg_namelen; + struct kernel_iovec*msg_iov; + unsigned long msg_iovlen; + void *msg_control; + unsigned long msg_controllen; + unsigned msg_flags; +}; + +/* include/asm-generic/poll.h */ +struct kernel_pollfd { + int fd; + short events; + short revents; +}; + +/* include/linux/resource.h */ +struct kernel_rlimit { + unsigned long rlim_cur; + unsigned long rlim_max; +}; + +/* include/linux/time.h */ +struct kernel_timespec { + long tv_sec; + long tv_nsec; +}; + +/* include/linux/time.h */ +struct kernel_timeval { + long tv_sec; + long tv_usec; +}; + +/* include/linux/time.h */ +struct kernel_itimerval { + struct kernel_timeval it_interval; + struct kernel_timeval it_value; +}; + +/* include/linux/resource.h */ +struct kernel_rusage { + struct kernel_timeval ru_utime; + struct kernel_timeval ru_stime; + long ru_maxrss; + long ru_ixrss; + long ru_idrss; + long ru_isrss; + long ru_minflt; + long ru_majflt; + long ru_nswap; + long ru_inblock; + long ru_oublock; + long ru_msgsnd; + long ru_msgrcv; + long ru_nsignals; + long ru_nvcsw; + long ru_nivcsw; +}; + +#if defined(__i386__) || defined(__ARM_EABI__) || defined(__ARM_ARCH_3__) \ + || defined(__PPC__) || (defined(__s390__) && !defined(__s390x__)) \ + || defined(__e2k__) + +/* include/asm-{arm,i386,mips,ppc}/signal.h */ +struct kernel_old_sigaction { + union { + void (*sa_handler_)(int); + void (*sa_sigaction_)(int, siginfo_t *, void *); + }; + unsigned long sa_mask; + unsigned long sa_flags; + void (*sa_restorer)(void); +} __attribute__((packed,aligned(4))); +#elif (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) + #define kernel_old_sigaction kernel_sigaction +#elif defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) + // No kernel_old_sigaction defined for arm64 riscv and loongarch64. +#endif + +/* Some kernel functions (e.g. sigaction() in 2.6.23) require that the + * exactly match the size of the signal set, even though the API was + * intended to be extensible. We define our own KERNEL_NSIG to deal with + * this. + * Please note that glibc provides signals [1.._NSIG-1], whereas the + * kernel (and this header) provides the range [1..KERNEL_NSIG]. The + * actual number of signals is obviously the same, but the constants + * differ by one. + */ +#ifdef __mips__ +#define KERNEL_NSIG 128 +#else +#define KERNEL_NSIG 64 +#endif + +/* include/asm-{arm,aarch64,i386,mips,x86_64}/signal.h */ +struct kernel_sigset_t { + unsigned long sig[(KERNEL_NSIG + 8*sizeof(unsigned long) - 1)/ + (8*sizeof(unsigned long))]; +}; + +/* include/asm-{arm,i386,mips,x86_64,ppc}/signal.h */ +struct kernel_sigaction { +#ifdef __mips__ + unsigned long sa_flags; + union { + void (*sa_handler_)(int); + void (*sa_sigaction_)(int, siginfo_t *, void *); + }; + struct kernel_sigset_t sa_mask; +#else + union { + void (*sa_handler_)(int); + void (*sa_sigaction_)(int, siginfo_t *, void *); + }; + unsigned long sa_flags; +#if !defined(__riscv) && !defined(__loongarch_lp64) + void (*sa_restorer)(void); +#endif + struct kernel_sigset_t sa_mask; +#endif +}; + +/* include/linux/socket.h */ +struct kernel_sockaddr { + unsigned short sa_family; + char sa_data[14]; +}; + +/* include/asm-{arm,aarch64,i386,mips,ppc,s390}/stat.h */ +#ifdef __mips__ +#if _MIPS_SIM == _MIPS_SIM_ABI64 +typedef unsigned long long kernel_blkcnt_t; +typedef unsigned kernel_blksize_t; +typedef unsigned kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef unsigned long long kernel_ino_t; +typedef unsigned kernel_mode_t; +typedef unsigned kernel_nlink_t; +typedef long long kernel_off_t; +typedef unsigned kernel_time_t; +typedef unsigned kernel_uid_t; +struct kernel_stat { +#else +struct kernel_stat64 { +#endif + unsigned st_dev; + unsigned __pad0[3]; + unsigned long long st_ino; + unsigned st_mode; + unsigned st_nlink; + unsigned st_uid; + unsigned st_gid; + unsigned st_rdev; + unsigned __pad1[3]; + long long st_size; + unsigned st_atime_; + unsigned st_atime_nsec_; + unsigned st_mtime_; + unsigned st_mtime_nsec_; + unsigned st_ctime_; + unsigned st_ctime_nsec_; + unsigned st_blksize; + unsigned __pad2; + unsigned long long st_blocks; +}; +#elif defined __PPC__ +struct kernel_stat64 { + unsigned long long st_dev; + unsigned long long st_ino; + unsigned st_mode; + unsigned st_nlink; + unsigned st_uid; + unsigned st_gid; + unsigned long long st_rdev; + unsigned short int __pad2; + long long st_size; + long st_blksize; + long long st_blocks; + long st_atime_; + unsigned long st_atime_nsec_; + long st_mtime_; + unsigned long st_mtime_nsec_; + long st_ctime_; + unsigned long st_ctime_nsec_; + unsigned long __unused4; + unsigned long __unused5; +}; +#elif defined(__e2k__) +struct kernel_stat64 { + unsigned long long st_dev; + unsigned long long st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned int st_uid; + unsigned int st_gid; + unsigned long long st_rdev; + long long st_size; + int st_blksize; + int __pad2; + unsigned long long st_blocks; + int st_atime_; + unsigned int st_atime_nsec_; + int st_mtime_; + unsigned int st_mtime_nsec_; + int st_ctime_; + unsigned int st_ctime_nsec_; + unsigned int __unused4; + unsigned int __unused5; +}; +#else +struct kernel_stat64 { + unsigned long long st_dev; + unsigned char __pad0[4]; + unsigned __st_ino; + unsigned st_mode; + unsigned st_nlink; + unsigned st_uid; + unsigned st_gid; + unsigned long long st_rdev; + unsigned char __pad3[4]; + long long st_size; + unsigned st_blksize; + unsigned long long st_blocks; + unsigned st_atime_; + unsigned st_atime_nsec_; + unsigned st_mtime_; + unsigned st_mtime_nsec_; + unsigned st_ctime_; + unsigned st_ctime_nsec_; + unsigned long long st_ino; +}; +#endif + +/* include/asm-{arm,aarch64,i386,mips,x86_64,ppc,s390}/stat.h */ +#if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) +typedef unsigned kernel_blkcnt_t; +typedef unsigned kernel_blksize_t; +typedef unsigned short kernel_dev_t; +typedef unsigned short kernel_gid_t; +typedef unsigned kernel_ino_t; +typedef unsigned short kernel_mode_t; +typedef unsigned short kernel_nlink_t; +typedef unsigned kernel_off_t; +typedef unsigned kernel_time_t; +typedef unsigned short kernel_uid_t; +struct kernel_stat { + /* The kernel headers suggest that st_dev and st_rdev should be 32bit + * quantities encoding 12bit major and 20bit minor numbers in an interleaved + * format. In reality, we do not see useful data in the top bits. So, + * we'll leave the padding in here, until we find a better solution. + */ + kernel_dev_t st_dev; + short pad1; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; + short pad2; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; + unsigned st_atime_nsec_; + kernel_time_t st_mtime_; + unsigned st_mtime_nsec_; + kernel_time_t st_ctime_; + unsigned st_ctime_nsec_; + unsigned __unused4; + unsigned __unused5; +}; +#elif defined(__x86_64__) +typedef int64_t kernel_blkcnt_t; +typedef int64_t kernel_blksize_t; +typedef uint64_t kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef uint64_t kernel_ino_t; +typedef unsigned kernel_mode_t; +typedef uint64_t kernel_nlink_t; +typedef int64_t kernel_off_t; +typedef uint64_t kernel_time_t; +typedef unsigned kernel_uid_t; +struct kernel_stat { + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_nlink_t st_nlink; + kernel_mode_t st_mode; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + unsigned __pad0; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; + uint64_t st_atime_nsec_; + kernel_time_t st_mtime_; + uint64_t st_mtime_nsec_; + kernel_time_t st_ctime_; + uint64_t st_ctime_nsec_; + int64_t __unused4[3]; +}; +#elif defined(__PPC__) +typedef unsigned long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned long kernel_mode_t; +typedef unsigned short kernel_nlink_t; +typedef long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned kernel_uid_t; +struct kernel_stat { + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_gid_t st_uid; + kernel_uid_t st_gid; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; + unsigned long st_atime_nsec_; + kernel_time_t st_mtime_; + unsigned long st_mtime_nsec_; + kernel_time_t st_ctime_; + unsigned long st_ctime_nsec_; + unsigned long __unused4; + unsigned long __unused5; +}; +#elif (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64) +typedef int kernel_blkcnt_t; +typedef int kernel_blksize_t; +typedef unsigned kernel_dev_t; +typedef unsigned kernel_gid_t; +typedef unsigned kernel_ino_t; +typedef unsigned kernel_mode_t; +typedef unsigned kernel_nlink_t; +typedef long kernel_off_t; +typedef long kernel_time_t; +typedef unsigned kernel_uid_t; +struct kernel_stat { + kernel_dev_t st_dev; + int st_pad1[3]; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; + int st_pad2[2]; + kernel_off_t st_size; + int st_pad3; + kernel_time_t st_atime_; + long st_atime_nsec_; + kernel_time_t st_mtime_; + long st_mtime_nsec_; + kernel_time_t st_ctime_; + long st_ctime_nsec_; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + int st_pad4[14]; +}; +#elif defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) +typedef long kernel_blkcnt_t; +typedef int kernel_blksize_t; +typedef unsigned long kernel_dev_t; +typedef unsigned int kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned int kernel_mode_t; +typedef unsigned int kernel_nlink_t; +typedef long kernel_off_t; +typedef long kernel_time_t; +typedef unsigned int kernel_uid_t; +struct kernel_stat { + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; + unsigned long __pad1; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + int __pad2; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; + unsigned long st_atime_nsec_; + kernel_time_t st_mtime_; + unsigned long st_mtime_nsec_; + kernel_time_t st_ctime_; + unsigned long st_ctime_nsec_; + unsigned int __unused4; + unsigned int __unused5; +}; +#elif defined(__s390x__) +typedef long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned long kernel_dev_t; +typedef unsigned int kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned int kernel_mode_t; +typedef unsigned long kernel_nlink_t; +typedef unsigned long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned int kernel_uid_t; +struct kernel_stat { + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_nlink_t st_nlink; + kernel_mode_t st_mode; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + unsigned int __pad1; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_time_t st_atime_; + unsigned long st_atime_nsec_; + kernel_time_t st_mtime_; + unsigned long st_mtime_nsec_; + kernel_time_t st_ctime_; + unsigned long st_ctime_nsec_; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + unsigned long __unused[3]; +}; +#elif defined(__s390__) +typedef unsigned long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned short kernel_dev_t; +typedef unsigned short kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned short kernel_mode_t; +typedef unsigned short kernel_nlink_t; +typedef unsigned long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned short kernel_uid_t; +struct kernel_stat { + kernel_dev_t st_dev; + unsigned short __pad1; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; + unsigned short __pad2; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; + unsigned long st_atime_nsec_; + kernel_time_t st_mtime_; + unsigned long st_mtime_nsec_; + kernel_time_t st_ctime_; + unsigned long st_ctime_nsec_; + unsigned long __unused4; + unsigned long __unused5; +}; +#elif defined(__e2k__) +typedef unsigned long kernel_blkcnt_t; +typedef unsigned long kernel_blksize_t; +typedef unsigned long kernel_dev_t; +typedef unsigned int kernel_gid_t; +typedef unsigned long kernel_ino_t; +typedef unsigned int kernel_mode_t; +typedef unsigned long kernel_nlink_t; +typedef unsigned long kernel_off_t; +typedef unsigned long kernel_time_t; +typedef unsigned int kernel_uid_t; +struct kernel_stat { + kernel_dev_t st_dev; + kernel_ino_t st_ino; + kernel_mode_t st_mode; + kernel_nlink_t st_nlink; + kernel_uid_t st_uid; + kernel_gid_t st_gid; + kernel_dev_t st_rdev; + kernel_off_t st_size; + kernel_blksize_t st_blksize; + kernel_blkcnt_t st_blocks; + kernel_time_t st_atime_; + unsigned long st_atime_nsec_; + kernel_time_t st_mtime_; + unsigned long st_mtime_nsec_; + kernel_time_t st_ctime_; + unsigned long st_ctime_nsec_; +}; +#endif + +/* include/asm-{arm,aarch64,i386,mips,x86_64,ppc,s390}/statfs.h */ +#ifdef __mips__ +#if _MIPS_SIM != _MIPS_SIM_ABI64 +struct kernel_statfs64 { + unsigned long f_type; + unsigned long f_bsize; + unsigned long f_frsize; + unsigned long __pad; + unsigned long long f_blocks; + unsigned long long f_bfree; + unsigned long long f_files; + unsigned long long f_ffree; + unsigned long long f_bavail; + struct { int val[2]; } f_fsid; + unsigned long f_namelen; + unsigned long f_spare[6]; +}; +#endif +#elif defined(__s390__) +/* See also arch/s390/include/asm/compat.h */ +struct kernel_statfs64 { + unsigned int f_type; + unsigned int f_bsize; + unsigned long long f_blocks; + unsigned long long f_bfree; + unsigned long long f_bavail; + unsigned long long f_files; + unsigned long long f_ffree; + struct { int val[2]; } f_fsid; + unsigned int f_namelen; + unsigned int f_frsize; + unsigned int f_flags; + unsigned int f_spare[4]; +}; +#elif !defined(__x86_64__) +struct kernel_statfs64 { + unsigned long f_type; + unsigned long f_bsize; + unsigned long long f_blocks; + unsigned long long f_bfree; + unsigned long long f_bavail; + unsigned long long f_files; + unsigned long long f_ffree; + struct { int val[2]; } f_fsid; + unsigned long f_namelen; + unsigned long f_frsize; + unsigned long f_spare[5]; +}; +#endif + +/* include/asm-{arm,i386,mips,x86_64,ppc,generic,s390}/statfs.h */ +#ifdef __mips__ +struct kernel_statfs { + long f_type; + long f_bsize; + long f_frsize; + long f_blocks; + long f_bfree; + long f_files; + long f_ffree; + long f_bavail; + struct { int val[2]; } f_fsid; + long f_namelen; + long f_spare[6]; +}; +#elif defined(__x86_64__) +struct kernel_statfs { + /* x86_64 actually defines all these fields as signed, whereas all other */ + /* platforms define them as unsigned. Leaving them at unsigned should not */ + /* cause any problems. Make sure these are 64-bit even on x32. */ + uint64_t f_type; + uint64_t f_bsize; + uint64_t f_blocks; + uint64_t f_bfree; + uint64_t f_bavail; + uint64_t f_files; + uint64_t f_ffree; + struct { int val[2]; } f_fsid; + uint64_t f_namelen; + uint64_t f_frsize; + uint64_t f_spare[5]; +}; +#elif defined(__s390__) +struct kernel_statfs { + unsigned int f_type; + unsigned int f_bsize; + unsigned long f_blocks; + unsigned long f_bfree; + unsigned long f_bavail; + unsigned long f_files; + unsigned long f_ffree; + struct { int val[2]; } f_fsid; + unsigned int f_namelen; + unsigned int f_frsize; + unsigned int f_flags; + unsigned int f_spare[4]; +}; +#else +struct kernel_statfs { + unsigned long f_type; + unsigned long f_bsize; + unsigned long f_blocks; + unsigned long f_bfree; + unsigned long f_bavail; + unsigned long f_files; + unsigned long f_ffree; + struct { int val[2]; } f_fsid; + unsigned long f_namelen; + unsigned long f_frsize; + unsigned long f_spare[5]; +}; +#endif + +struct kernel_statx_timestamp { + int64_t tv_sec; + uint32_t tv_nsec; + int32_t __reserved; +}; + +struct kernel_statx { + uint32_t stx_mask; + uint32_t stx_blksize; + uint64_t stx_attributes; + uint32_t stx_nlink; + uint32_t stx_uid; + uint32_t stx_gid; + uint16_t stx_mode; + uint16_t __spare0[1]; + uint64_t stx_ino; + uint64_t stx_size; + uint64_t stx_blocks; + uint64_t stx_attributes_mask; + struct kernel_statx_timestamp stx_atime; + struct kernel_statx_timestamp stx_btime; + struct kernel_statx_timestamp stx_ctime; + struct kernel_statx_timestamp stx_mtime; + uint32_t stx_rdev_major; + uint32_t stx_rdev_minor; + uint32_t stx_dev_major; + uint32_t stx_dev_minor; + uint64_t stx_mnt_id; + uint64_t __spare2; + uint64_t __spare3[12]; +}; + +/* Definitions missing from the standard header files */ +#ifndef O_DIRECTORY +#if defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || defined(__aarch64__) +#define O_DIRECTORY 0040000 +#else +#define O_DIRECTORY 0200000 +#endif +#endif +#ifndef NT_PRXFPREG +#define NT_PRXFPREG 0x46e62b7f +#endif +#ifndef PTRACE_GETFPXREGS +#define PTRACE_GETFPXREGS ((enum __ptrace_request)18) +#endif +#ifndef PR_GET_DUMPABLE +#define PR_GET_DUMPABLE 3 +#endif +#ifndef PR_SET_DUMPABLE +#define PR_SET_DUMPABLE 4 +#endif +#ifndef PR_GET_SECCOMP +#define PR_GET_SECCOMP 21 +#endif +#ifndef PR_SET_SECCOMP +#define PR_SET_SECCOMP 22 +#endif +#ifndef AT_FDCWD +#define AT_FDCWD (-100) +#endif +#ifndef AT_SYMLINK_NOFOLLOW +#define AT_SYMLINK_NOFOLLOW 0x100 +#endif +#ifndef AT_REMOVEDIR +#define AT_REMOVEDIR 0x200 +#endif +#ifndef AT_NO_AUTOMOUNT +#define AT_NO_AUTOMOUNT 0x800 +#endif +#ifndef AT_EMPTY_PATH +#define AT_EMPTY_PATH 0x1000 +#endif +#ifndef STATX_BASIC_STATS +#define STATX_BASIC_STATS 0x000007ffU +#endif +#ifndef AT_STATX_SYNC_AS_STAT +#define AT_STATX_SYNC_AS_STAT 0x0000 +#endif +#ifndef MREMAP_FIXED +#define MREMAP_FIXED 2 +#endif +#ifndef SA_RESTORER +#define SA_RESTORER 0x04000000 +#endif +#ifndef CPUCLOCK_PROF +#define CPUCLOCK_PROF 0 +#endif +#ifndef CPUCLOCK_VIRT +#define CPUCLOCK_VIRT 1 +#endif +#ifndef CPUCLOCK_SCHED +#define CPUCLOCK_SCHED 2 +#endif +#ifndef CPUCLOCK_PERTHREAD_MASK +#define CPUCLOCK_PERTHREAD_MASK 4 +#endif +#ifndef MAKE_PROCESS_CPUCLOCK +#define MAKE_PROCESS_CPUCLOCK(pid, clock) \ + ((int)(~(unsigned)(pid) << 3) | (int)(clock)) +#endif +#ifndef MAKE_THREAD_CPUCLOCK +#define MAKE_THREAD_CPUCLOCK(tid, clock) \ + ((int)(~(unsigned)(tid) << 3) | \ + (int)((clock) | CPUCLOCK_PERTHREAD_MASK)) +#endif + +#ifndef FUTEX_WAIT +#define FUTEX_WAIT 0 +#endif +#ifndef FUTEX_WAKE +#define FUTEX_WAKE 1 +#endif +#ifndef FUTEX_FD +#define FUTEX_FD 2 +#endif +#ifndef FUTEX_REQUEUE +#define FUTEX_REQUEUE 3 +#endif +#ifndef FUTEX_CMP_REQUEUE +#define FUTEX_CMP_REQUEUE 4 +#endif +#ifndef FUTEX_WAKE_OP +#define FUTEX_WAKE_OP 5 +#endif +#ifndef FUTEX_LOCK_PI +#define FUTEX_LOCK_PI 6 +#endif +#ifndef FUTEX_UNLOCK_PI +#define FUTEX_UNLOCK_PI 7 +#endif +#ifndef FUTEX_TRYLOCK_PI +#define FUTEX_TRYLOCK_PI 8 +#endif +#ifndef FUTEX_PRIVATE_FLAG +#define FUTEX_PRIVATE_FLAG 128 +#endif +#ifndef FUTEX_CMD_MASK +#define FUTEX_CMD_MASK ~FUTEX_PRIVATE_FLAG +#endif +#ifndef FUTEX_WAIT_PRIVATE +#define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_WAKE_PRIVATE +#define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_REQUEUE_PRIVATE +#define FUTEX_REQUEUE_PRIVATE (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_CMP_REQUEUE_PRIVATE +#define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_WAKE_OP_PRIVATE +#define FUTEX_WAKE_OP_PRIVATE (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_LOCK_PI_PRIVATE +#define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_UNLOCK_PI_PRIVATE +#define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_TRYLOCK_PI_PRIVATE +#define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG) +#endif + + +#if defined(__x86_64__) +#ifndef ARCH_SET_GS +#define ARCH_SET_GS 0x1001 +#endif +#ifndef ARCH_GET_GS +#define ARCH_GET_GS 0x1004 +#endif +#endif + +#if defined(__i386__) +#ifndef __NR_quotactl +#define __NR_quotactl 131 +#endif +#ifndef __NR_setresuid +#define __NR_setresuid 164 +#define __NR_getresuid 165 +#define __NR_setresgid 170 +#define __NR_getresgid 171 +#endif +#ifndef __NR_rt_sigaction +#define __NR_rt_sigreturn 173 +#define __NR_rt_sigaction 174 +#define __NR_rt_sigprocmask 175 +#define __NR_rt_sigpending 176 +#define __NR_rt_sigsuspend 179 +#endif +#ifndef __NR_pread64 +#define __NR_pread64 180 +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 181 +#endif +#ifndef __NR_ugetrlimit +#define __NR_ugetrlimit 191 +#endif +#ifndef __NR_stat64 +#define __NR_stat64 195 +#endif +#ifndef __NR_fstat64 +#define __NR_fstat64 197 +#endif +#ifndef __NR_setresuid32 +#define __NR_setresuid32 208 +#define __NR_getresuid32 209 +#define __NR_setresgid32 210 +#define __NR_getresgid32 211 +#endif +#ifndef __NR_setfsuid32 +#define __NR_setfsuid32 215 +#define __NR_setfsgid32 216 +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 220 +#endif +#ifndef __NR_gettid +#define __NR_gettid 224 +#endif +#ifndef __NR_readahead +#define __NR_readahead 225 +#endif +#ifndef __NR_setxattr +#define __NR_setxattr 226 +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr 227 +#endif +#ifndef __NR_getxattr +#define __NR_getxattr 229 +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr 230 +#endif +#ifndef __NR_listxattr +#define __NR_listxattr 232 +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr 233 +#endif +#ifndef __NR_tkill +#define __NR_tkill 238 +#endif +#ifndef __NR_futex +#define __NR_futex 240 +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity 241 +#define __NR_sched_getaffinity 242 +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address 258 +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime 265 +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres 266 +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 268 +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 269 +#endif +#ifndef __NR_fadvise64_64 +#define __NR_fadvise64_64 272 +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set 289 +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get 290 +#endif +#ifndef __NR_openat +#define __NR_openat 295 +#endif +#ifndef __NR_fstatat64 +#define __NR_fstatat64 300 +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat 301 +#endif +#ifndef __NR_move_pages +#define __NR_move_pages 317 +#endif +#ifndef __NR_getcpu +#define __NR_getcpu 318 +#endif +#ifndef __NR_fallocate +#define __NR_fallocate 324 +#endif +#ifndef __NR_getrandom +#define __NR_getrandom 355 +#endif +/* End of i386 definitions */ +#elif defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) +#ifndef __NR_setresuid +#define __NR_setresuid (__NR_SYSCALL_BASE + 164) +#define __NR_getresuid (__NR_SYSCALL_BASE + 165) +#define __NR_setresgid (__NR_SYSCALL_BASE + 170) +#define __NR_getresgid (__NR_SYSCALL_BASE + 171) +#endif +#ifndef __NR_rt_sigaction +#define __NR_rt_sigreturn (__NR_SYSCALL_BASE + 173) +#define __NR_rt_sigaction (__NR_SYSCALL_BASE + 174) +#define __NR_rt_sigprocmask (__NR_SYSCALL_BASE + 175) +#define __NR_rt_sigpending (__NR_SYSCALL_BASE + 176) +#define __NR_rt_sigsuspend (__NR_SYSCALL_BASE + 179) +#endif +#ifndef __NR_pread64 +#define __NR_pread64 (__NR_SYSCALL_BASE + 180) +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 (__NR_SYSCALL_BASE + 181) +#endif +#ifndef __NR_ugetrlimit +#define __NR_ugetrlimit (__NR_SYSCALL_BASE + 191) +#endif +#ifndef __NR_stat64 +#define __NR_stat64 (__NR_SYSCALL_BASE + 195) +#endif +#ifndef __NR_fstat64 +#define __NR_fstat64 (__NR_SYSCALL_BASE + 197) +#endif +#ifndef __NR_setresuid32 +#define __NR_setresuid32 (__NR_SYSCALL_BASE + 208) +#define __NR_getresuid32 (__NR_SYSCALL_BASE + 209) +#define __NR_setresgid32 (__NR_SYSCALL_BASE + 210) +#define __NR_getresgid32 (__NR_SYSCALL_BASE + 211) +#endif +#ifndef __NR_setfsuid32 +#define __NR_setfsuid32 (__NR_SYSCALL_BASE + 215) +#define __NR_setfsgid32 (__NR_SYSCALL_BASE + 216) +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 (__NR_SYSCALL_BASE + 217) +#endif +#ifndef __NR_gettid +#define __NR_gettid (__NR_SYSCALL_BASE + 224) +#endif +#ifndef __NR_readahead +#define __NR_readahead (__NR_SYSCALL_BASE + 225) +#endif +#ifndef __NR_setxattr +#define __NR_setxattr (__NR_SYSCALL_BASE + 226) +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr (__NR_SYSCALL_BASE + 227) +#endif +#ifndef __NR_getxattr +#define __NR_getxattr (__NR_SYSCALL_BASE + 229) +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr (__NR_SYSCALL_BASE + 230) +#endif +#ifndef __NR_listxattr +#define __NR_listxattr (__NR_SYSCALL_BASE + 232) +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr (__NR_SYSCALL_BASE + 233) +#endif +#ifndef __NR_tkill +#define __NR_tkill (__NR_SYSCALL_BASE + 238) +#endif +#ifndef __NR_futex +#define __NR_futex (__NR_SYSCALL_BASE + 240) +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity (__NR_SYSCALL_BASE + 241) +#define __NR_sched_getaffinity (__NR_SYSCALL_BASE + 242) +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address (__NR_SYSCALL_BASE + 256) +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime (__NR_SYSCALL_BASE + 263) +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres (__NR_SYSCALL_BASE + 264) +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 (__NR_SYSCALL_BASE + 266) +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 (__NR_SYSCALL_BASE + 267) +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set (__NR_SYSCALL_BASE + 314) +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get (__NR_SYSCALL_BASE + 315) +#endif +#ifndef __NR_fstatat64 +#define __NR_fstatat64 (__NR_SYSCALL_BASE + 327) +#endif +#ifndef __NR_move_pages +#define __NR_move_pages (__NR_SYSCALL_BASE + 344) +#endif +#ifndef __NR_getcpu +#define __NR_getcpu (__NR_SYSCALL_BASE + 345) +#endif +#ifndef __NR_getrandom +#define __NR_getrandom (__NR_SYSCALL_BASE + 384) +#endif +/* End of ARM 3/EABI definitions */ +#elif defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) +#ifndef __NR_setxattr +#define __NR_setxattr 5 +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr 6 +#endif +#ifndef __NR_getxattr +#define __NR_getxattr 8 +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr 9 +#endif +#ifndef __NR_listxattr +#define __NR_listxattr 11 +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr 12 +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set 30 +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get 31 +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat 35 +#endif +#ifndef __NR_fallocate +#define __NR_fallocate 47 +#endif +#ifndef __NR_openat +#define __NR_openat 56 +#endif +#ifndef __NR_quotactl +#define __NR_quotactl 60 +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 61 +#endif +#ifndef __NR_getdents +// when getdents is not available, getdents64 is used for both. +#define __NR_getdents __NR_getdents64 +#endif +#ifndef __NR_pread64 +#define __NR_pread64 67 +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 68 +#endif +#ifndef __NR_ppoll +#define __NR_ppoll 73 +#endif +#ifndef __NR_readlinkat +#define __NR_readlinkat 78 +#endif +#if !defined(__loongarch_lp64) +#ifndef __NR_newfstatat +#define __NR_newfstatat 79 +#endif +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address 96 +#endif +#ifndef __NR_futex +#define __NR_futex 98 +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime 113 +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres 114 +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity 122 +#define __NR_sched_getaffinity 123 +#endif +#ifndef __NR_tkill +#define __NR_tkill 130 +#endif +#ifndef __NR_setresuid +#define __NR_setresuid 147 +#define __NR_getresuid 148 +#define __NR_setresgid 149 +#define __NR_getresgid 150 +#endif +#ifndef __NR_gettid +#define __NR_gettid 178 +#endif +#ifndef __NR_readahead +#define __NR_readahead 213 +#endif +#ifndef __NR_fadvise64 +#define __NR_fadvise64 223 +#endif +#ifndef __NR_move_pages +#define __NR_move_pages 239 +#endif +#ifndef __NR_getrandom +#define __NR_getrandom 278 +#endif +#ifndef __NR_statx +#define __NR_statx 291 +#endif +#elif defined(__x86_64__) +#ifndef __NR_pread64 +#define __NR_pread64 17 +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 18 +#endif +#ifndef __NR_setresuid +#define __NR_setresuid 117 +#define __NR_getresuid 118 +#define __NR_setresgid 119 +#define __NR_getresgid 120 +#endif +#ifndef __NR_quotactl +#define __NR_quotactl 179 +#endif +#ifndef __NR_gettid +#define __NR_gettid 186 +#endif +#ifndef __NR_readahead +#define __NR_readahead 187 +#endif +#ifndef __NR_setxattr +#define __NR_setxattr 188 +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr 189 +#endif +#ifndef __NR_getxattr +#define __NR_getxattr 191 +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr 192 +#endif +#ifndef __NR_listxattr +#define __NR_listxattr 194 +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr 195 +#endif +#ifndef __NR_tkill +#define __NR_tkill 200 +#endif +#ifndef __NR_futex +#define __NR_futex 202 +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity 203 +#define __NR_sched_getaffinity 204 +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 217 +#endif +#ifndef __NR_getdents +// when getdents is not available, getdents64 is used for both. +#define __NR_getdents __NR_getdents64 +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address 218 +#endif +#ifndef __NR_fadvise64 +#define __NR_fadvise64 221 +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime 228 +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres 229 +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set 251 +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get 252 +#endif +#ifndef __NR_openat +#define __NR_openat 257 +#endif +#ifndef __NR_newfstatat +#define __NR_newfstatat 262 +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat 263 +#endif +#ifndef __NR_move_pages +#define __NR_move_pages 279 +#endif +#ifndef __NR_fallocate +#define __NR_fallocate 285 +#endif +#ifndef __NR_getrandom +#define __NR_getrandom 318 +#endif +/* End of x86-64 definitions */ +#elif defined(__mips__) +#if _MIPS_SIM == _MIPS_SIM_ABI32 +#ifndef __NR_setresuid +#define __NR_setresuid (__NR_Linux + 185) +#define __NR_getresuid (__NR_Linux + 186) +#define __NR_setresgid (__NR_Linux + 190) +#define __NR_getresgid (__NR_Linux + 191) +#endif +#ifndef __NR_rt_sigaction +#define __NR_rt_sigreturn (__NR_Linux + 193) +#define __NR_rt_sigaction (__NR_Linux + 194) +#define __NR_rt_sigprocmask (__NR_Linux + 195) +#define __NR_rt_sigpending (__NR_Linux + 196) +#define __NR_rt_sigsuspend (__NR_Linux + 199) +#endif +#ifndef __NR_pread64 +#define __NR_pread64 (__NR_Linux + 200) +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 (__NR_Linux + 201) +#endif +#ifndef __NR_stat64 +#define __NR_stat64 (__NR_Linux + 213) +#endif +#ifndef __NR_fstat64 +#define __NR_fstat64 (__NR_Linux + 215) +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 (__NR_Linux + 219) +#endif +#ifndef __NR_gettid +#define __NR_gettid (__NR_Linux + 222) +#endif +#ifndef __NR_readahead +#define __NR_readahead (__NR_Linux + 223) +#endif +#ifndef __NR_setxattr +#define __NR_setxattr (__NR_Linux + 224) +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr (__NR_Linux + 225) +#endif +#ifndef __NR_getxattr +#define __NR_getxattr (__NR_Linux + 227) +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr (__NR_Linux + 228) +#endif +#ifndef __NR_listxattr +#define __NR_listxattr (__NR_Linux + 230) +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr (__NR_Linux + 231) +#endif +#ifndef __NR_tkill +#define __NR_tkill (__NR_Linux + 236) +#endif +#ifndef __NR_futex +#define __NR_futex (__NR_Linux + 238) +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity (__NR_Linux + 239) +#define __NR_sched_getaffinity (__NR_Linux + 240) +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address (__NR_Linux + 252) +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 (__NR_Linux + 255) +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 (__NR_Linux + 256) +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime (__NR_Linux + 263) +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres (__NR_Linux + 264) +#endif +#ifndef __NR_openat +#define __NR_openat (__NR_Linux + 288) +#endif +#ifndef __NR_fstatat +#define __NR_fstatat (__NR_Linux + 293) +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat (__NR_Linux + 294) +#endif +#ifndef __NR_move_pages +#define __NR_move_pages (__NR_Linux + 308) +#endif +#ifndef __NR_getcpu +#define __NR_getcpu (__NR_Linux + 312) +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set (__NR_Linux + 314) +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get (__NR_Linux + 315) +#endif +#ifndef __NR_getrandom +#define __NR_getrandom (__NR_Linux + 353) +#endif +/* End of MIPS (old 32bit API) definitions */ +#elif _MIPS_SIM == _MIPS_SIM_ABI64 +#ifndef __NR_pread64 +#define __NR_pread64 (__NR_Linux + 16) +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 (__NR_Linux + 17) +#endif +#ifndef __NR_setresuid +#define __NR_setresuid (__NR_Linux + 115) +#define __NR_getresuid (__NR_Linux + 116) +#define __NR_setresgid (__NR_Linux + 117) +#define __NR_getresgid (__NR_Linux + 118) +#endif +#ifndef __NR_gettid +#define __NR_gettid (__NR_Linux + 178) +#endif +#ifndef __NR_readahead +#define __NR_readahead (__NR_Linux + 179) +#endif +#ifndef __NR_setxattr +#define __NR_setxattr (__NR_Linux + 180) +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr (__NR_Linux + 181) +#endif +#ifndef __NR_getxattr +#define __NR_getxattr (__NR_Linux + 183) +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr (__NR_Linux + 184) +#endif +#ifndef __NR_listxattr +#define __NR_listxattr (__NR_Linux + 186) +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr (__NR_Linux + 187) +#endif +#ifndef __NR_tkill +#define __NR_tkill (__NR_Linux + 192) +#endif +#ifndef __NR_futex +#define __NR_futex (__NR_Linux + 194) +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity (__NR_Linux + 195) +#define __NR_sched_getaffinity (__NR_Linux + 196) +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address (__NR_Linux + 212) +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime (__NR_Linux + 222) +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres (__NR_Linux + 223) +#endif +#ifndef __NR_openat +#define __NR_openat (__NR_Linux + 247) +#endif +#ifndef __NR_fstatat +#define __NR_fstatat (__NR_Linux + 252) +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat (__NR_Linux + 253) +#endif +#ifndef __NR_move_pages +#define __NR_move_pages (__NR_Linux + 267) +#endif +#ifndef __NR_getcpu +#define __NR_getcpu (__NR_Linux + 271) +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set (__NR_Linux + 273) +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get (__NR_Linux + 274) +#endif +#ifndef __NR_getrandom +#define __NR_getrandom (__NR_Linux + 313) +#endif +/* End of MIPS (64bit API) definitions */ +#else +#ifndef __NR_setresuid +#define __NR_setresuid (__NR_Linux + 115) +#define __NR_getresuid (__NR_Linux + 116) +#define __NR_setresgid (__NR_Linux + 117) +#define __NR_getresgid (__NR_Linux + 118) +#endif +#ifndef __NR_gettid +#define __NR_gettid (__NR_Linux + 178) +#endif +#ifndef __NR_readahead +#define __NR_readahead (__NR_Linux + 179) +#endif +#ifndef __NR_setxattr +#define __NR_setxattr (__NR_Linux + 180) +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr (__NR_Linux + 181) +#endif +#ifndef __NR_getxattr +#define __NR_getxattr (__NR_Linux + 183) +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr (__NR_Linux + 184) +#endif +#ifndef __NR_listxattr +#define __NR_listxattr (__NR_Linux + 186) +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr (__NR_Linux + 187) +#endif +#ifndef __NR_tkill +#define __NR_tkill (__NR_Linux + 192) +#endif +#ifndef __NR_futex +#define __NR_futex (__NR_Linux + 194) +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity (__NR_Linux + 195) +#define __NR_sched_getaffinity (__NR_Linux + 196) +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address (__NR_Linux + 213) +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 (__NR_Linux + 217) +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 (__NR_Linux + 218) +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime (__NR_Linux + 226) +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres (__NR_Linux + 227) +#endif +#ifndef __NR_openat +#define __NR_openat (__NR_Linux + 251) +#endif +#ifndef __NR_fstatat +#define __NR_fstatat (__NR_Linux + 256) +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat (__NR_Linux + 257) +#endif +#ifndef __NR_move_pages +#define __NR_move_pages (__NR_Linux + 271) +#endif +#ifndef __NR_getcpu +#define __NR_getcpu (__NR_Linux + 275) +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set (__NR_Linux + 277) +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get (__NR_Linux + 278) +#endif +/* End of MIPS (new 32bit API) definitions */ +#endif +/* End of MIPS definitions */ +#elif defined(__PPC__) +#ifndef __NR_setfsuid +#define __NR_setfsuid 138 +#define __NR_setfsgid 139 +#endif +#ifndef __NR_setresuid +#define __NR_setresuid 164 +#define __NR_getresuid 165 +#define __NR_setresgid 169 +#define __NR_getresgid 170 +#endif +#ifndef __NR_rt_sigaction +#define __NR_rt_sigreturn 172 +#define __NR_rt_sigaction 173 +#define __NR_rt_sigprocmask 174 +#define __NR_rt_sigpending 175 +#define __NR_rt_sigsuspend 178 +#endif +#ifndef __NR_pread64 +#define __NR_pread64 179 +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 180 +#endif +#ifndef __NR_ugetrlimit +#define __NR_ugetrlimit 190 +#endif +#ifndef __NR_readahead +#define __NR_readahead 191 +#endif +#ifndef __NR_stat64 +#define __NR_stat64 195 +#endif +#ifndef __NR_fstat64 +#define __NR_fstat64 197 +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 202 +#endif +#ifndef __NR_gettid +#define __NR_gettid 207 +#endif +#ifndef __NR_tkill +#define __NR_tkill 208 +#endif +#ifndef __NR_setxattr +#define __NR_setxattr 209 +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr 210 +#endif +#ifndef __NR_getxattr +#define __NR_getxattr 212 +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr 213 +#endif +#ifndef __NR_listxattr +#define __NR_listxattr 215 +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr 216 +#endif +#ifndef __NR_futex +#define __NR_futex 221 +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity 222 +#define __NR_sched_getaffinity 223 +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address 232 +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime 246 +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres 247 +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 252 +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 253 +#endif +#ifndef __NR_fadvise64_64 +#define __NR_fadvise64_64 254 +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set 273 +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get 274 +#endif +#ifndef __NR_openat +#define __NR_openat 286 +#endif +#ifndef __NR_fstatat64 +#define __NR_fstatat64 291 +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat 292 +#endif +#ifndef __NR_move_pages +#define __NR_move_pages 301 +#endif +#ifndef __NR_getcpu +#define __NR_getcpu 302 +#endif +/* End of powerpc definitions */ +#elif defined(__s390__) +#ifndef __NR_quotactl +#define __NR_quotactl 131 +#endif +#ifndef __NR_rt_sigreturn +#define __NR_rt_sigreturn 173 +#endif +#ifndef __NR_rt_sigaction +#define __NR_rt_sigaction 174 +#endif +#ifndef __NR_rt_sigprocmask +#define __NR_rt_sigprocmask 175 +#endif +#ifndef __NR_rt_sigpending +#define __NR_rt_sigpending 176 +#endif +#ifndef __NR_rt_sigsuspend +#define __NR_rt_sigsuspend 179 +#endif +#ifndef __NR_pread64 +#define __NR_pread64 180 +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 181 +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 220 +#endif +#ifndef __NR_readahead +#define __NR_readahead 222 +#endif +#ifndef __NR_setxattr +#define __NR_setxattr 224 +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr 225 +#endif +#ifndef __NR_getxattr +#define __NR_getxattr 227 +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr 228 +#endif +#ifndef __NR_listxattr +#define __NR_listxattr 230 +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr 231 +#endif +#ifndef __NR_gettid +#define __NR_gettid 236 +#endif +#ifndef __NR_tkill +#define __NR_tkill 237 +#endif +#ifndef __NR_futex +#define __NR_futex 238 +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity 239 +#endif +#ifndef __NR_sched_getaffinity +#define __NR_sched_getaffinity 240 +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address 252 +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime 260 +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres 261 +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 265 +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 266 +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set 282 +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get 283 +#endif +#ifndef __NR_openat +#define __NR_openat 288 +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat 294 +#endif +#ifndef __NR_move_pages +#define __NR_move_pages 310 +#endif +#ifndef __NR_getcpu +#define __NR_getcpu 311 +#endif +#ifndef __NR_fallocate +#define __NR_fallocate 314 +#endif +/* Some syscalls are named/numbered differently between s390 and s390x. */ +#ifdef __s390x__ +# ifndef __NR_getrlimit +# define __NR_getrlimit 191 +# endif +# ifndef __NR_setresuid +# define __NR_setresuid 208 +# endif +# ifndef __NR_getresuid +# define __NR_getresuid 209 +# endif +# ifndef __NR_setresgid +# define __NR_setresgid 210 +# endif +# ifndef __NR_getresgid +# define __NR_getresgid 211 +# endif +# ifndef __NR_setfsuid +# define __NR_setfsuid 215 +# endif +# ifndef __NR_setfsgid +# define __NR_setfsgid 216 +# endif +# ifndef __NR_fadvise64 +# define __NR_fadvise64 253 +# endif +# ifndef __NR_newfstatat +# define __NR_newfstatat 293 +# endif +#else /* __s390x__ */ +# ifndef __NR_getrlimit +# define __NR_getrlimit 76 +# endif +# ifndef __NR_setfsuid +# define __NR_setfsuid 138 +# endif +# ifndef __NR_setfsgid +# define __NR_setfsgid 139 +# endif +# ifndef __NR_setresuid +# define __NR_setresuid 164 +# endif +# ifndef __NR_getresuid +# define __NR_getresuid 165 +# endif +# ifndef __NR_setresgid +# define __NR_setresgid 170 +# endif +# ifndef __NR_getresgid +# define __NR_getresgid 171 +# endif +# ifndef __NR_ugetrlimit +# define __NR_ugetrlimit 191 +# endif +# ifndef __NR_mmap2 +# define __NR_mmap2 192 +# endif +# ifndef __NR_setresuid32 +# define __NR_setresuid32 208 +# endif +# ifndef __NR_getresuid32 +# define __NR_getresuid32 209 +# endif +# ifndef __NR_setresgid32 +# define __NR_setresgid32 210 +# endif +# ifndef __NR_getresgid32 +# define __NR_getresgid32 211 +# endif +# ifndef __NR_setfsuid32 +# define __NR_setfsuid32 215 +# endif +# ifndef __NR_setfsgid32 +# define __NR_setfsgid32 216 +# endif +# ifndef __NR_fadvise64_64 +# define __NR_fadvise64_64 264 +# endif +# ifndef __NR_fstatat64 +# define __NR_fstatat64 293 +# endif +#endif /* __s390__ */ +/* End of s390/s390x definitions */ +#endif + + +/* After forking, we must make sure to only call system calls. */ +#if defined(__BOUNDED_POINTERS__) + #error "Need to port invocations of syscalls for bounded ptrs" +#else + /* The core dumper and the thread lister get executed after threads + * have been suspended. As a consequence, we cannot call any functions + * that acquire locks. Unfortunately, libc wraps most system calls + * (e.g. in order to implement pthread_atfork, and to make calls + * cancellable), which means we cannot call these functions. Instead, + * we have to call syscall() directly. + */ + #undef LSS_ERRNO + #ifdef SYS_ERRNO + /* Allow the including file to override the location of errno. This can + * be useful when using clone() with the CLONE_VM option. + */ + #define LSS_ERRNO SYS_ERRNO + #else + #define LSS_ERRNO errno + #endif + + #undef LSS_INLINE + #ifdef SYS_INLINE + #define LSS_INLINE SYS_INLINE + #else + #define LSS_INLINE static inline + #endif + + /* Allow the including file to override the prefix used for all new + * system calls. By default, it will be set to "sys_". + */ + #undef LSS_NAME + #ifndef SYS_PREFIX + #define LSS_NAME(name) sys_##name + #elif defined(SYS_PREFIX) && SYS_PREFIX < 0 + #define LSS_NAME(name) name + #elif defined(SYS_PREFIX) && SYS_PREFIX == 0 + #define LSS_NAME(name) sys0_##name + #elif defined(SYS_PREFIX) && SYS_PREFIX == 1 + #define LSS_NAME(name) sys1_##name + #elif defined(SYS_PREFIX) && SYS_PREFIX == 2 + #define LSS_NAME(name) sys2_##name + #elif defined(SYS_PREFIX) && SYS_PREFIX == 3 + #define LSS_NAME(name) sys3_##name + #elif defined(SYS_PREFIX) && SYS_PREFIX == 4 + #define LSS_NAME(name) sys4_##name + #elif defined(SYS_PREFIX) && SYS_PREFIX == 5 + #define LSS_NAME(name) sys5_##name + #elif defined(SYS_PREFIX) && SYS_PREFIX == 6 + #define LSS_NAME(name) sys6_##name + #elif defined(SYS_PREFIX) && SYS_PREFIX == 7 + #define LSS_NAME(name) sys7_##name + #elif defined(SYS_PREFIX) && SYS_PREFIX == 8 + #define LSS_NAME(name) sys8_##name + #elif defined(SYS_PREFIX) && SYS_PREFIX == 9 + #define LSS_NAME(name) sys9_##name + #endif + + #undef LSS_RETURN + #if defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) \ + || defined(__ARM_EABI__) || defined(__aarch64__) || defined(__s390__) \ + || defined(__e2k__) || defined(__riscv) || defined(__loongarch_lp64) + /* Failing system calls return a negative result in the range of + * -1..-4095. These are "errno" values with the sign inverted. + */ + #define LSS_RETURN(type, res) \ + do { \ + if ((unsigned long)(res) >= (unsigned long)(-4095)) { \ + LSS_ERRNO = (int)(-(res)); \ + res = -1; \ + } \ + return (type) (res); \ + } while (0) + #elif defined(__mips__) + /* On MIPS, failing system calls return -1, and set errno in a + * separate CPU register. + */ + #define LSS_RETURN(type, res, err) \ + do { \ + if (err) { \ + unsigned long __errnovalue = (res); \ + LSS_ERRNO = __errnovalue; \ + res = -1; \ + } \ + return (type) (res); \ + } while (0) + #elif defined(__PPC__) + /* On PPC, failing system calls return -1, and set errno in a + * separate CPU register. See linux/unistd.h. + */ + #define LSS_RETURN(type, res, err) \ + do { \ + if (err & 0x10000000 ) { \ + LSS_ERRNO = (res); \ + res = -1; \ + } \ + return (type) (res); \ + } while (0) + #endif + #if defined(__i386__) + /* In PIC mode (e.g. when building shared libraries), gcc for i386 + * reserves ebx. Unfortunately, most distribution ship with implementations + * of _syscallX() which clobber ebx. + * Also, most definitions of _syscallX() neglect to mark "memory" as being + * clobbered. This causes problems with compilers, that do a better job + * at optimizing across __asm__ calls. + * So, we just have to redefine all of the _syscallX() macros. + */ + #undef LSS_ENTRYPOINT + #ifdef SYS_SYSCALL_ENTRYPOINT + static inline void (**LSS_NAME(get_syscall_entrypoint)(void))(void) { + void (**entrypoint)(void); + asm volatile(".bss\n" + ".align 8\n" + ".globl " SYS_SYSCALL_ENTRYPOINT "\n" + ".common " SYS_SYSCALL_ENTRYPOINT ",8,8\n" + ".previous\n" + /* This logically does 'lea "SYS_SYSCALL_ENTRYPOINT", %0' */ + "call 0f\n" + "0:pop %0\n" + "add $_GLOBAL_OFFSET_TABLE_+[.-0b], %0\n" + "mov " SYS_SYSCALL_ENTRYPOINT "@GOT(%0), %0\n" + : "=r"(entrypoint)); + return entrypoint; + } + + #define LSS_ENTRYPOINT ".bss\n" \ + ".align 8\n" \ + ".globl " SYS_SYSCALL_ENTRYPOINT "\n" \ + ".common " SYS_SYSCALL_ENTRYPOINT ",8,8\n" \ + ".previous\n" \ + /* Check the SYS_SYSCALL_ENTRYPOINT vector */ \ + "push %%eax\n" \ + "call 10000f\n" \ + "10000:pop %%eax\n" \ + "add $_GLOBAL_OFFSET_TABLE_+[.-10000b], %%eax\n" \ + "mov " SYS_SYSCALL_ENTRYPOINT \ + "@GOT(%%eax), %%eax\n" \ + "mov 0(%%eax), %%eax\n" \ + "test %%eax, %%eax\n" \ + "jz 10002f\n" \ + "push %%eax\n" \ + "call 10001f\n" \ + "10001:pop %%eax\n" \ + "add $(10003f-10001b), %%eax\n" \ + "xchg 4(%%esp), %%eax\n" \ + "ret\n" \ + "10002:pop %%eax\n" \ + "int $0x80\n" \ + "10003:\n" + #else + #define LSS_ENTRYPOINT "int $0x80\n" + #endif + #undef LSS_BODY + #define LSS_BODY(type,args...) \ + long __res; \ + __asm__ __volatile__("push %%ebx\n" \ + "movl %2,%%ebx\n" \ + LSS_ENTRYPOINT \ + "pop %%ebx" \ + args \ + : "memory"); \ + LSS_RETURN(type,__res) + #undef _syscall0 + #define _syscall0(type,name) \ + type LSS_NAME(name)(void) { \ + long __res; \ + __asm__ volatile(LSS_ENTRYPOINT \ + : "=a" (__res) \ + : "0" (__NR_##name) \ + : "memory"); \ + LSS_RETURN(type,__res); \ + } + #undef _syscall1 + #define _syscall1(type,name,type1,arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_BODY(type, \ + : "=a" (__res) \ + : "0" (__NR_##name), "ri" ((long)(arg1))); \ + } + #undef _syscall2 + #define _syscall2(type,name,type1,arg1,type2,arg2) \ + type LSS_NAME(name)(type1 arg1,type2 arg2) { \ + LSS_BODY(type, \ + : "=a" (__res) \ + : "0" (__NR_##name),"ri" ((long)(arg1)), "c" ((long)(arg2))); \ + } + #undef _syscall3 + #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ + type LSS_NAME(name)(type1 arg1,type2 arg2,type3 arg3) { \ + LSS_BODY(type, \ + : "=a" (__res) \ + : "0" (__NR_##name), "ri" ((long)(arg1)), "c" ((long)(arg2)), \ + "d" ((long)(arg3))); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_BODY(type, \ + : "=a" (__res) \ + : "0" (__NR_##name), "ri" ((long)(arg1)), "c" ((long)(arg2)), \ + "d" ((long)(arg3)),"S" ((long)(arg4))); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + long __res; \ + __asm__ __volatile__("push %%ebx\n" \ + "movl %2,%%ebx\n" \ + "movl %1,%%eax\n" \ + LSS_ENTRYPOINT \ + "pop %%ebx" \ + : "=a" (__res) \ + : "i" (__NR_##name), "ri" ((long)(arg1)), \ + "c" ((long)(arg2)), "d" ((long)(arg3)), \ + "S" ((long)(arg4)), "D" ((long)(arg5)) \ + : "memory"); \ + LSS_RETURN(type,__res); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + long __res; \ + struct { long __a1; long __a6; } __s = { (long)arg1, (long) arg6 }; \ + __asm__ __volatile__("push %%ebp\n" \ + "push %%ebx\n" \ + "movl 4(%2),%%ebp\n" \ + "movl 0(%2), %%ebx\n" \ + "movl %1,%%eax\n" \ + LSS_ENTRYPOINT \ + "pop %%ebx\n" \ + "pop %%ebp" \ + : "=a" (__res) \ + : "i" (__NR_##name), "0" ((long)(&__s)), \ + "c" ((long)(arg2)), "d" ((long)(arg3)), \ + "S" ((long)(arg4)), "D" ((long)(arg5)) \ + : "memory"); \ + LSS_RETURN(type,__res); \ + } + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long __res; + __asm__ __volatile__(/* if (fn == NULL) + * return -EINVAL; + */ + "movl %3,%%ecx\n" + "jecxz 1f\n" + + /* if (child_stack == NULL) + * return -EINVAL; + */ + "movl %4,%%ecx\n" + "jecxz 1f\n" + + /* Set up alignment of the child stack: + * child_stack = (child_stack & ~0xF) - 20; + */ + "andl $-16,%%ecx\n" + "subl $20,%%ecx\n" + + /* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "movl %6,%%eax\n" + "movl %%eax,4(%%ecx)\n" + "movl %3,%%eax\n" + "movl %%eax,(%%ecx)\n" + + /* %eax = syscall(%eax = __NR_clone, + * %ebx = flags, + * %ecx = child_stack, + * %edx = parent_tidptr, + * %esi = newtls, + * %edi = child_tidptr) + * Also, make sure that %ebx gets preserved as it is + * used in PIC mode. + */ + "movl %8,%%esi\n" + "movl %7,%%edx\n" + "movl %5,%%eax\n" + "movl %9,%%edi\n" + "pushl %%ebx\n" + "movl %%eax,%%ebx\n" + "movl %2,%%eax\n" + LSS_ENTRYPOINT + + /* In the parent: restore %ebx + * In the child: move "fn" into %ebx + */ + "popl %%ebx\n" + + /* if (%eax != 0) + * return %eax; + */ + "test %%eax,%%eax\n" + "jnz 1f\n" + + /* In the child, now. Terminate frame pointer chain. + */ + "movl $0,%%ebp\n" + + /* Call "fn". "arg" is already on the stack. + */ + "call *%%ebx\n" + + /* Call _exit(%ebx). Unfortunately older versions + * of gcc restrict the number of arguments that can + * be passed to asm(). So, we need to hard-code the + * system call number. + */ + "movl %%eax,%%ebx\n" + "movl $1,%%eax\n" + LSS_ENTRYPOINT + + /* Return to parent. + */ + "1:\n" + : "=a" (__res) + : "0"(-EINVAL), "i"(__NR_clone), + "m"(fn), "m"(child_stack), "m"(flags), "m"(arg), + "m"(parent_tidptr), "m"(newtls), "m"(child_tidptr) + : "memory", "ecx", "edx", "esi", "edi"); + LSS_RETURN(int, __res); + } + + LSS_INLINE _syscall1(int, set_thread_area, void *, u) + LSS_INLINE _syscall1(int, get_thread_area, void *, u) + + LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) { + /* On i386, the kernel does not know how to return from a signal + * handler. Instead, it relies on user space to provide a + * restorer function that calls the {rt_,}sigreturn() system call. + * Unfortunately, we cannot just reference the glibc version of this + * function, as glibc goes out of its way to make it inaccessible. + */ + void (*res)(void); + __asm__ __volatile__("call 2f\n" + "0:.align 16\n" + "1:movl %1,%%eax\n" + LSS_ENTRYPOINT + "2:popl %0\n" + "addl $(1b-0b),%0\n" + : "=a" (res) + : "i" (__NR_rt_sigreturn)); + return res; + } + LSS_INLINE void (*LSS_NAME(restore)(void))(void) { + /* On i386, the kernel does not know how to return from a signal + * handler. Instead, it relies on user space to provide a + * restorer function that calls the {rt_,}sigreturn() system call. + * Unfortunately, we cannot just reference the glibc version of this + * function, as glibc goes out of its way to make it inaccessible. + */ + void (*res)(void); + __asm__ __volatile__("call 2f\n" + "0:.align 16\n" + "1:pop %%eax\n" + "movl %1,%%eax\n" + LSS_ENTRYPOINT + "2:popl %0\n" + "addl $(1b-0b),%0\n" + : "=a" (res) + : "i" (__NR_sigreturn)); + return res; + } + #elif defined(__x86_64__) + /* There are no known problems with any of the _syscallX() macros + * currently shipping for x86_64, but we still need to be able to define + * our own version so that we can override the location of the errno + * location (e.g. when using the clone() system call with the CLONE_VM + * option). + */ + #undef LSS_ENTRYPOINT + #ifdef SYS_SYSCALL_ENTRYPOINT + static inline void (**LSS_NAME(get_syscall_entrypoint)(void))(void) { + void (**entrypoint)(void); + asm volatile(".bss\n" + ".align 8\n" + ".globl " SYS_SYSCALL_ENTRYPOINT "\n" + ".common " SYS_SYSCALL_ENTRYPOINT ",8,8\n" + ".previous\n" + "mov " SYS_SYSCALL_ENTRYPOINT "@GOTPCREL(%%rip), %0\n" + : "=r"(entrypoint)); + return entrypoint; + } + + #define LSS_ENTRYPOINT \ + ".bss\n" \ + ".align 8\n" \ + ".globl " SYS_SYSCALL_ENTRYPOINT "\n" \ + ".common " SYS_SYSCALL_ENTRYPOINT ",8,8\n" \ + ".previous\n" \ + "mov " SYS_SYSCALL_ENTRYPOINT "@GOTPCREL(%%rip), %%rcx\n" \ + "mov 0(%%rcx), %%rcx\n" \ + "test %%rcx, %%rcx\n" \ + "jz 10001f\n" \ + "call *%%rcx\n" \ + "jmp 10002f\n" \ + "10001:syscall\n" \ + "10002:\n" + + #else + #define LSS_ENTRYPOINT "syscall\n" + #endif + + /* The x32 ABI has 32 bit longs, but the syscall interface is 64 bit. + * We need to explicitly cast to an unsigned 64 bit type to avoid implicit + * sign extension. We can't cast pointers directly because those are + * 32 bits, and gcc will dump ugly warnings about casting from a pointer + * to an integer of a different size. + */ + #undef LSS_SYSCALL_ARG + #define LSS_SYSCALL_ARG(a) ((uint64_t)(uintptr_t)(a)) + #undef _LSS_RETURN + #define _LSS_RETURN(type, res, cast) \ + do { \ + if ((uint64_t)(res) >= (uint64_t)(-4095)) { \ + LSS_ERRNO = (int)(-(res)); \ + res = -1; \ + } \ + return (type)(cast)(res); \ + } while (0) + #undef LSS_RETURN + #define LSS_RETURN(type, res) _LSS_RETURN(type, res, uintptr_t) + + #undef _LSS_BODY + #define _LSS_BODY(nr, type, name, cast, ...) \ + long long __res; \ + __asm__ __volatile__(LSS_BODY_ASM##nr LSS_ENTRYPOINT \ + : "=a" (__res) \ + : "0" (__NR_##name) LSS_BODY_ARG##nr(__VA_ARGS__) \ + : LSS_BODY_CLOBBER##nr "r11", "rcx", "memory"); \ + _LSS_RETURN(type, __res, cast) + #undef LSS_BODY + #define LSS_BODY(nr, type, name, args...) \ + _LSS_BODY(nr, type, name, uintptr_t, ## args) + + #undef LSS_BODY_ASM0 + #undef LSS_BODY_ASM1 + #undef LSS_BODY_ASM2 + #undef LSS_BODY_ASM3 + #undef LSS_BODY_ASM4 + #undef LSS_BODY_ASM5 + #undef LSS_BODY_ASM6 + #define LSS_BODY_ASM0 + #define LSS_BODY_ASM1 LSS_BODY_ASM0 + #define LSS_BODY_ASM2 LSS_BODY_ASM1 + #define LSS_BODY_ASM3 LSS_BODY_ASM2 + #define LSS_BODY_ASM4 LSS_BODY_ASM3 "movq %5,%%r10;" + #define LSS_BODY_ASM5 LSS_BODY_ASM4 "movq %6,%%r8;" + #define LSS_BODY_ASM6 LSS_BODY_ASM5 "movq %7,%%r9;" + + #undef LSS_BODY_CLOBBER0 + #undef LSS_BODY_CLOBBER1 + #undef LSS_BODY_CLOBBER2 + #undef LSS_BODY_CLOBBER3 + #undef LSS_BODY_CLOBBER4 + #undef LSS_BODY_CLOBBER5 + #undef LSS_BODY_CLOBBER6 + #define LSS_BODY_CLOBBER0 + #define LSS_BODY_CLOBBER1 LSS_BODY_CLOBBER0 + #define LSS_BODY_CLOBBER2 LSS_BODY_CLOBBER1 + #define LSS_BODY_CLOBBER3 LSS_BODY_CLOBBER2 + #define LSS_BODY_CLOBBER4 LSS_BODY_CLOBBER3 "r10", + #define LSS_BODY_CLOBBER5 LSS_BODY_CLOBBER4 "r8", + #define LSS_BODY_CLOBBER6 LSS_BODY_CLOBBER5 "r9", + + #undef LSS_BODY_ARG0 + #undef LSS_BODY_ARG1 + #undef LSS_BODY_ARG2 + #undef LSS_BODY_ARG3 + #undef LSS_BODY_ARG4 + #undef LSS_BODY_ARG5 + #undef LSS_BODY_ARG6 + #define LSS_BODY_ARG0() + #define LSS_BODY_ARG1(arg1) \ + LSS_BODY_ARG0(), "D" (arg1) + #define LSS_BODY_ARG2(arg1, arg2) \ + LSS_BODY_ARG1(arg1), "S" (arg2) + #define LSS_BODY_ARG3(arg1, arg2, arg3) \ + LSS_BODY_ARG2(arg1, arg2), "d" (arg3) + #define LSS_BODY_ARG4(arg1, arg2, arg3, arg4) \ + LSS_BODY_ARG3(arg1, arg2, arg3), "r" (arg4) + #define LSS_BODY_ARG5(arg1, arg2, arg3, arg4, arg5) \ + LSS_BODY_ARG4(arg1, arg2, arg3, arg4), "r" (arg5) + #define LSS_BODY_ARG6(arg1, arg2, arg3, arg4, arg5, arg6) \ + LSS_BODY_ARG5(arg1, arg2, arg3, arg4, arg5), "r" (arg6) + + #undef _syscall0 + #define _syscall0(type,name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(0, type, name); \ + } + #undef _syscall1 + #define _syscall1(type,name,type1,arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_BODY(1, type, name, LSS_SYSCALL_ARG(arg1)); \ + } + #undef _syscall2 + #define _syscall2(type,name,type1,arg1,type2,arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_BODY(2, type, name, LSS_SYSCALL_ARG(arg1), LSS_SYSCALL_ARG(arg2));\ + } + #undef _syscall3 + #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_BODY(3, type, name, LSS_SYSCALL_ARG(arg1), LSS_SYSCALL_ARG(arg2), \ + LSS_SYSCALL_ARG(arg3)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_BODY(4, type, name, LSS_SYSCALL_ARG(arg1), LSS_SYSCALL_ARG(arg2), \ + LSS_SYSCALL_ARG(arg3), LSS_SYSCALL_ARG(arg4));\ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_BODY(5, type, name, LSS_SYSCALL_ARG(arg1), LSS_SYSCALL_ARG(arg2), \ + LSS_SYSCALL_ARG(arg3), LSS_SYSCALL_ARG(arg4), \ + LSS_SYSCALL_ARG(arg5)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_BODY(6, type, name, LSS_SYSCALL_ARG(arg1), LSS_SYSCALL_ARG(arg2), \ + LSS_SYSCALL_ARG(arg3), LSS_SYSCALL_ARG(arg4), \ + LSS_SYSCALL_ARG(arg5), LSS_SYSCALL_ARG(arg6));\ + } + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long long __res; + { + __asm__ __volatile__(/* if (fn == NULL) + * return -EINVAL; + */ + "testq %4,%4\n" + "jz 1f\n" + + /* if (child_stack == NULL) + * return -EINVAL; + */ + "testq %5,%5\n" + "jz 1f\n" + + /* childstack -= 2*sizeof(void *); + */ + "subq $16,%5\n" + + /* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "movq %7,8(%5)\n" + "movq %4,0(%5)\n" + + /* %rax = syscall(%rax = __NR_clone, + * %rdi = flags, + * %rsi = child_stack, + * %rdx = parent_tidptr, + * %r8 = new_tls, + * %r10 = child_tidptr) + */ + "movq %2,%%rax\n" + "movq %9,%%r8\n" + "movq %10,%%r10\n" + LSS_ENTRYPOINT + + /* if (%rax != 0) + * return; + */ + "testq %%rax,%%rax\n" + "jnz 1f\n" + + /* In the child. Terminate frame pointer chain. + */ + "xorq %%rbp,%%rbp\n" + + /* Call "fn(arg)". + */ + "popq %%rax\n" + "popq %%rdi\n" + "call *%%rax\n" + + /* Call _exit(%ebx). + */ + "movq %%rax,%%rdi\n" + "movq %3,%%rax\n" + LSS_ENTRYPOINT + + /* Return to parent. + */ + "1:\n" + : "=a" (__res) + : "0"(-EINVAL), "i"(__NR_clone), "i"(__NR_exit), + "r"(LSS_SYSCALL_ARG(fn)), + "S"(LSS_SYSCALL_ARG(child_stack)), + "D"(LSS_SYSCALL_ARG(flags)), + "r"(LSS_SYSCALL_ARG(arg)), + "d"(LSS_SYSCALL_ARG(parent_tidptr)), + "r"(LSS_SYSCALL_ARG(newtls)), + "r"(LSS_SYSCALL_ARG(child_tidptr)) + : "memory", "r8", "r10", "r11", "rcx"); + } + LSS_RETURN(int, __res); + } + LSS_INLINE _syscall2(int, arch_prctl, int, c, void *, a) + + LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) { + /* On x86-64, the kernel does not know how to return from + * a signal handler. Instead, it relies on user space to provide a + * restorer function that calls the rt_sigreturn() system call. + * Unfortunately, we cannot just reference the glibc version of this + * function, as glibc goes out of its way to make it inaccessible. + */ + long long res; + __asm__ __volatile__("jmp 2f\n" + ".align 16\n" + "1:movq %1,%%rax\n" + LSS_ENTRYPOINT + "2:leaq 1b(%%rip),%0\n" + : "=r" (res) + : "i" (__NR_rt_sigreturn)); + return (void (*)(void))(uintptr_t)res; + } + #elif defined(__ARM_ARCH_3__) + /* Most definitions of _syscallX() neglect to mark "memory" as being + * clobbered. This causes problems with compilers, that do a better job + * at optimizing across __asm__ calls. + * So, we just have to redefine all of the _syscallX() macros. + */ + #undef LSS_REG + #define LSS_REG(r,a) register long __r##r __asm__("r"#r) = (long)a + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register long __res_r0 __asm__("r0"); \ + long __res; \ + __asm__ __volatile__ (__syscall(name) \ + : "=r"(__res_r0) : args : "lr", "memory"); \ + __res = __res_r0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long __res; + { + register int __flags __asm__("r0") = flags; + register void *__stack __asm__("r1") = child_stack; + register void *__ptid __asm__("r2") = parent_tidptr; + register void *__tls __asm__("r3") = newtls; + register int *__ctid __asm__("r4") = child_tidptr; + __asm__ __volatile__(/* if (fn == NULL || child_stack == NULL) + * return -EINVAL; + */ + "cmp %2,#0\n" + "cmpne %3,#0\n" + "moveq %0,%1\n" + "beq 1f\n" + + /* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "str %5,[%3,#-4]!\n" + "str %2,[%3,#-4]!\n" + + /* %r0 = syscall(%r0 = flags, + * %r1 = child_stack, + * %r2 = parent_tidptr, + * %r3 = newtls, + * %r4 = child_tidptr) + */ + __syscall(clone)"\n" + + /* if (%r0 != 0) + * return %r0; + */ + "movs %0,r0\n" + "bne 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ldr r0,[sp, #4]\n" + "mov lr,pc\n" + "ldr pc,[sp]\n" + + /* Call _exit(%r0). + */ + __syscall(exit)"\n" + "1:\n" + : "=r" (__res) + : "i"(-EINVAL), + "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__tls), "r"(__ctid) + : "cc", "lr", "memory"); + } + LSS_RETURN(int, __res); + } + #elif defined(__ARM_EABI__) + /* Most definitions of _syscallX() neglect to mark "memory" as being + * clobbered. This causes problems with compilers, that do a better job + * at optimizing across __asm__ calls. + * So, we just have to redefine all fo the _syscallX() macros. + */ + #undef LSS_REG + #define LSS_REG(r,a) register long __r##r __asm__("r"#r) = (long)a + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register long __res_r0 __asm__("r0"); \ + long __res; \ + __asm__ __volatile__ ("push {r7}\n" \ + "mov r7, %1\n" \ + "swi 0x0\n" \ + "pop {r7}\n" \ + : "=r"(__res_r0) \ + : "i"(__NR_##name) , ## args \ + : "lr", "memory"); \ + __res = __res_r0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long __res; + if (fn == NULL || child_stack == NULL) { + __res = -EINVAL; + LSS_RETURN(int, __res); + } + + /* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + { + uintptr_t* cstack = (uintptr_t*)child_stack - 2; + cstack[0] = (uintptr_t)fn; + cstack[1] = (uintptr_t)arg; + child_stack = cstack; + } + { + register int __flags __asm__("r0") = flags; + register void *__stack __asm__("r1") = child_stack; + register void *__ptid __asm__("r2") = parent_tidptr; + register void *__tls __asm__("r3") = newtls; + register int *__ctid __asm__("r4") = child_tidptr; + __asm__ __volatile__( +#ifdef __thumb2__ + "push {r7}\n" +#endif + /* %r0 = syscall(%r0 = flags, + * %r1 = child_stack, + * %r2 = parent_tidptr, + * %r3 = newtls, + * %r4 = child_tidptr) + */ + "mov r7, %6\n" + "swi 0x0\n" + + /* if (%r0 != 0) + * return %r0; + */ + "cmp r0, #0\n" + "bne 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ldr r0,[sp, #4]\n" + + "ldr lr,[sp]\n" + "blx lr\n" + + /* Call _exit(%r0). + */ + "mov r7, %7\n" + "swi 0x0\n" + /* Unreachable */ + "bkpt #0\n" + "1:\n" +#ifdef __thumb2__ + "pop {r7}\n" +#endif + "movs %0,r0\n" + : "=r"(__res) + : "r"(__stack), "r"(__flags), "r"(__ptid), "r"(__tls), "r"(__ctid), + "i"(__NR_clone), "i"(__NR_exit) + : "cc", "lr", "memory" +#ifndef __thumb2__ + , "r7" +#endif + ); + } + LSS_RETURN(int, __res); + } + #elif defined(__aarch64__) + /* Most definitions of _syscallX() neglect to mark "memory" as being + * clobbered. This causes problems with compilers, that do a better job + * at optimizing across __asm__ calls. + * So, we just have to redefine all of the _syscallX() macros. + */ + #undef LSS_REG + #define LSS_REG(r,a) register int64_t __r##r __asm__("x"#r) = (int64_t)a + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register int64_t __res_x0 __asm__("x0"); \ + int64_t __res; \ + __asm__ __volatile__ ("mov x8, %1\n" \ + "svc 0x0\n" \ + : "=r"(__res_x0) \ + : "i"(__NR_##name) , ## args \ + : "x8", "memory"); \ + __res = __res_x0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + int64_t __res; + { + register uint64_t __flags __asm__("x0") = (uint64_t)flags; + register void *__stack __asm__("x1") = child_stack; + register void *__ptid __asm__("x2") = parent_tidptr; + register void *__tls __asm__("x3") = newtls; + register int *__ctid __asm__("x4") = child_tidptr; + __asm__ __volatile__(/* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "stp %1, %4, [%2, #-16]!\n" + + /* %x0 = syscall(%x0 = flags, + * %x1 = child_stack, + * %x2 = parent_tidptr, + * %x3 = newtls, + * %x4 = child_tidptr) + */ + "mov x8, %8\n" + "svc 0x0\n" + + /* if (%r0 != 0) + * return %r0; + */ + "mov %0, x0\n" + "cbnz x0, 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ldp x1, x0, [sp], #16\n" + "blr x1\n" + + /* Call _exit(%r0). + */ + "mov x8, %9\n" + "svc 0x0\n" + "1:\n" + : "=r" (__res) + : "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__tls), "r"(__ctid), + "i"(__NR_clone), "i"(__NR_exit) + : "cc", "x8", "memory"); + } + LSS_RETURN(int, __res); + } + #elif defined(__mips__) + #undef LSS_REG + #define LSS_REG(r,a) register unsigned long __r##r __asm__("$"#r) = \ + (unsigned long)(a) + #undef LSS_BODY + #undef LSS_SYSCALL_CLOBBERS + #if _MIPS_SIM == _MIPS_SIM_ABI32 + #define LSS_SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", \ + "$11", "$12", "$13", "$14", "$15", \ + "$24", "$25", "hi", "lo", "memory" + #else + #define LSS_SYSCALL_CLOBBERS "$1", "$3", "$10", "$11", "$12", \ + "$13", "$14", "$15", "$24", "$25", \ + "hi", "lo", "memory" + #endif + #define LSS_BODY(type,name,r7,...) \ + register unsigned long __v0 __asm__("$2") = __NR_##name; \ + __asm__ __volatile__ ("syscall\n" \ + : "=r"(__v0), r7 (__r7) \ + : "0"(__v0), ##__VA_ARGS__ \ + : LSS_SYSCALL_CLOBBERS); \ + LSS_RETURN(type, __v0, __r7) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + register unsigned long __r7 __asm__("$7"); \ + LSS_BODY(type, name, "=r"); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + register unsigned long __r7 __asm__("$7"); \ + LSS_REG(4, arg1); LSS_BODY(type, name, "=r", "r"(__r4)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + register unsigned long __r7 __asm__("$7"); \ + LSS_REG(4, arg1); LSS_REG(5, arg2); \ + LSS_BODY(type, name, "=r", "r"(__r4), "r"(__r5)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + register unsigned long __r7 __asm__("$7"); \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_BODY(type, name, "=r", "r"(__r4), "r"(__r5), "r"(__r6)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_REG(7, arg4); \ + LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6)); \ + } + #undef _syscall5 + #if _MIPS_SIM == _MIPS_SIM_ABI32 + /* The old 32bit MIPS system call API passes the fifth and sixth argument + * on the stack, whereas the new APIs use registers "r8" and "r9". + */ + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_REG(7, arg4); \ + register unsigned long __v0 __asm__("$2") = __NR_##name; \ + __asm__ __volatile__ (".set noreorder\n" \ + "subu $29, 32\n" \ + "sw %5, 16($29)\n" \ + "syscall\n" \ + "addiu $29, 32\n" \ + ".set reorder\n" \ + : "+r"(__v0), "+r" (__r7) \ + : "r"(__r4), "r"(__r5), \ + "r"(__r6), "r" ((unsigned long)arg5) \ + : "$8", "$9", "$10", "$11", "$12", \ + "$13", "$14", "$15", "$24", "$25", \ + "memory"); \ + LSS_RETURN(type, __v0, __r7); \ + } + #else + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_REG(7, arg4); LSS_REG(8, arg5); \ + LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6), \ + "r"(__r8)); \ + } + #endif + #undef _syscall6 + #if _MIPS_SIM == _MIPS_SIM_ABI32 + /* The old 32bit MIPS system call API passes the fifth and sixth argument + * on the stack, whereas the new APIs use registers "r8" and "r9". + */ + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_REG(7, arg4); \ + register unsigned long __v0 __asm__("$2") = __NR_##name; \ + __asm__ __volatile__ (".set noreorder\n" \ + "subu $29, 32\n" \ + "sw %5, 16($29)\n" \ + "sw %6, 20($29)\n" \ + "syscall\n" \ + "addiu $29, 32\n" \ + ".set reorder\n" \ + : "+r"(__v0), "+r" (__r7) \ + : "r"(__r4), "r"(__r5), \ + "r"(__r6), "r" ((unsigned long)arg5), \ + "r" ((unsigned long)arg6) \ + : "$8", "$9", "$10", "$11", "$12", \ + "$13", "$14", "$15", "$24", "$25", \ + "memory"); \ + LSS_RETURN(type, __v0, __r7); \ + } + #else + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5,type6 arg6) { \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_REG(7, arg4); LSS_REG(8, arg5); LSS_REG(9, arg6); \ + LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6), \ + "r"(__r8), "r"(__r9)); \ + } + #endif + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + register unsigned long __v0 __asm__("$2") = -EINVAL; + register unsigned long __r7 __asm__("$7") = (unsigned long)newtls; + { + register int __flags __asm__("$4") = flags; + register void *__stack __asm__("$5") = child_stack; + register void *__ptid __asm__("$6") = parent_tidptr; + register int *__ctid __asm__("$8") = child_tidptr; + __asm__ __volatile__( + #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 + "subu $29,24\n" + #elif _MIPS_SIM == _MIPS_SIM_NABI32 + "sub $29,16\n" + #else + "dsubu $29,16\n" + #endif + + /* if (fn == NULL || child_stack == NULL) + * return -EINVAL; + */ + "beqz %4,1f\n" + "beqz %5,1f\n" + + /* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 + "subu %5,32\n" + "sw %4,0(%5)\n" + "sw %7,4(%5)\n" + #elif _MIPS_SIM == _MIPS_SIM_NABI32 + "sub %5,32\n" + "sw %4,0(%5)\n" + "sw %7,8(%5)\n" + #else + "dsubu %5,32\n" + "sd %4,0(%5)\n" + "sd %7,8(%5)\n" + #endif + + /* $7 = syscall($4 = flags, + * $5 = child_stack, + * $6 = parent_tidptr, + * $7 = newtls, + * $8 = child_tidptr) + */ + "li $2,%2\n" + "syscall\n" + + /* if ($7 != 0) + * return $2; + */ + "bnez $7,1f\n" + "bnez $2,1f\n" + + /* In the child, now. Call "fn(arg)". + */ + #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 + "lw $25,0($29)\n" + "lw $4,4($29)\n" + #elif _MIPS_SIM == _MIPS_SIM_NABI32 + "lw $25,0($29)\n" + "lw $4,8($29)\n" + #else + "ld $25,0($29)\n" + "ld $4,8($29)\n" + #endif + "jalr $25\n" + + /* Call _exit($2) + */ + "move $4,$2\n" + "li $2,%3\n" + "syscall\n" + + "1:\n" + #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 + "addu $29, 24\n" + #elif _MIPS_SIM == _MIPS_SIM_NABI32 + "add $29, 16\n" + #else + "daddu $29,16\n" + #endif + : "+r" (__v0), "+r" (__r7) + : "i"(__NR_clone), "i"(__NR_exit), "r"(fn), + "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__ctid) + : "$9", "$10", "$11", "$12", "$13", "$14", "$15", + "$24", "$25", "memory"); + } + LSS_RETURN(int, __v0, __r7); + } + #elif defined (__PPC__) + #undef LSS_LOADARGS_0 + #define LSS_LOADARGS_0(name, dummy...) \ + __sc_0 = __NR_##name + #undef LSS_LOADARGS_1 + #define LSS_LOADARGS_1(name, arg1) \ + LSS_LOADARGS_0(name); \ + __sc_3 = (unsigned long) (arg1) + #undef LSS_LOADARGS_2 + #define LSS_LOADARGS_2(name, arg1, arg2) \ + LSS_LOADARGS_1(name, arg1); \ + __sc_4 = (unsigned long) (arg2) + #undef LSS_LOADARGS_3 + #define LSS_LOADARGS_3(name, arg1, arg2, arg3) \ + LSS_LOADARGS_2(name, arg1, arg2); \ + __sc_5 = (unsigned long) (arg3) + #undef LSS_LOADARGS_4 + #define LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4) \ + LSS_LOADARGS_3(name, arg1, arg2, arg3); \ + __sc_6 = (unsigned long) (arg4) + #undef LSS_LOADARGS_5 + #define LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5) \ + LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4); \ + __sc_7 = (unsigned long) (arg5) + #undef LSS_LOADARGS_6 + #define LSS_LOADARGS_6(name, arg1, arg2, arg3, arg4, arg5, arg6) \ + LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5); \ + __sc_8 = (unsigned long) (arg6) + #undef LSS_ASMINPUT_0 + #define LSS_ASMINPUT_0 "0" (__sc_0) + #undef LSS_ASMINPUT_1 + #define LSS_ASMINPUT_1 LSS_ASMINPUT_0, "1" (__sc_3) + #undef LSS_ASMINPUT_2 + #define LSS_ASMINPUT_2 LSS_ASMINPUT_1, "2" (__sc_4) + #undef LSS_ASMINPUT_3 + #define LSS_ASMINPUT_3 LSS_ASMINPUT_2, "3" (__sc_5) + #undef LSS_ASMINPUT_4 + #define LSS_ASMINPUT_4 LSS_ASMINPUT_3, "4" (__sc_6) + #undef LSS_ASMINPUT_5 + #define LSS_ASMINPUT_5 LSS_ASMINPUT_4, "5" (__sc_7) + #undef LSS_ASMINPUT_6 + #define LSS_ASMINPUT_6 LSS_ASMINPUT_5, "6" (__sc_8) + #undef LSS_BODY + #define LSS_BODY(nr, type, name, args...) \ + long __sc_ret, __sc_err; \ + { \ + register unsigned long __sc_0 __asm__ ("r0"); \ + register unsigned long __sc_3 __asm__ ("r3"); \ + register unsigned long __sc_4 __asm__ ("r4"); \ + register unsigned long __sc_5 __asm__ ("r5"); \ + register unsigned long __sc_6 __asm__ ("r6"); \ + register unsigned long __sc_7 __asm__ ("r7"); \ + register unsigned long __sc_8 __asm__ ("r8"); \ + \ + LSS_LOADARGS_##nr(name, args); \ + __asm__ __volatile__ \ + ("sc\n\t" \ + "mfcr %0" \ + : "=&r" (__sc_0), \ + "=&r" (__sc_3), "=&r" (__sc_4), \ + "=&r" (__sc_5), "=&r" (__sc_6), \ + "=&r" (__sc_7), "=&r" (__sc_8) \ + : LSS_ASMINPUT_##nr \ + : "cr0", "ctr", "memory", \ + "r9", "r10", "r11", "r12"); \ + __sc_ret = __sc_3; \ + __sc_err = __sc_0; \ + } \ + LSS_RETURN(type, __sc_ret, __sc_err) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(0, type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_BODY(1, type, name, arg1); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_BODY(2, type, name, arg1, arg2); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_BODY(3, type, name, arg1, arg2, arg3); \ + } + #undef _syscall4 + #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_BODY(4, type, name, arg1, arg2, arg3, arg4); \ + } + #undef _syscall5 + #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_BODY(5, type, name, arg1, arg2, arg3, arg4, arg5); \ + } + #undef _syscall6 + #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5, type6, arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_BODY(6, type, name, arg1, arg2, arg3, arg4, arg5, arg6); \ + } + /* clone function adapted from glibc 2.3.6 clone.S */ + /* TODO(csilvers): consider wrapping some args up in a struct, like we + * do for i386's _syscall6, so we can compile successfully on gcc 2.95 + */ + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long __ret, __err; + { + register int (*__fn)(void *) __asm__ ("r8") = fn; + register void *__cstack __asm__ ("r4") = child_stack; + register int __flags __asm__ ("r3") = flags; + register void * __arg __asm__ ("r9") = arg; + register int * __ptidptr __asm__ ("r5") = parent_tidptr; + register void * __newtls __asm__ ("r6") = newtls; + register int * __ctidptr __asm__ ("r7") = child_tidptr; + __asm__ __volatile__( + /* check for fn == NULL + * and child_stack == NULL + */ + "cmpwi cr0, %6, 0\n\t" + "cmpwi cr1, %7, 0\n\t" + "cror cr0*4+eq, cr1*4+eq, cr0*4+eq\n\t" + "beq- cr0, 1f\n\t" + + /* set up stack frame for child */ + "clrrwi %7, %7, 4\n\t" + "li 0, 0\n\t" + "stwu 0, -16(%7)\n\t" + + /* fn, arg, child_stack are saved across the syscall: r28-30 */ + "mr 28, %6\n\t" + "mr 29, %7\n\t" + "mr 27, %9\n\t" + + /* syscall */ + "li 0, %4\n\t" + /* flags already in r3 + * child_stack already in r4 + * ptidptr already in r5 + * newtls already in r6 + * ctidptr already in r7 + */ + "sc\n\t" + + /* Test if syscall was successful */ + "cmpwi cr1, 3, 0\n\t" + "crandc cr1*4+eq, cr1*4+eq, cr0*4+so\n\t" + "bne- cr1, 1f\n\t" + + /* Do the function call */ + "mtctr 28\n\t" + "mr 3, 27\n\t" + "bctrl\n\t" + + /* Call _exit(r3) */ + "li 0, %5\n\t" + "sc\n\t" + + /* Return to parent */ + "1:\n" + "mfcr %1\n\t" + "mr %0, 3\n\t" + : "=r" (__ret), "=r" (__err) + : "0" (-1), "1" (EINVAL), + "i" (__NR_clone), "i" (__NR_exit), + "r" (__fn), "r" (__cstack), "r" (__flags), + "r" (__arg), "r" (__ptidptr), "r" (__newtls), + "r" (__ctidptr) + : "cr0", "cr1", "memory", "ctr", + "r0", "r29", "r27", "r28"); + } + LSS_RETURN(int, __ret, __err); + } + #elif defined(__s390__) + #undef LSS_REG + #define LSS_REG(r, a) register unsigned long __r##r __asm__("r"#r) = (unsigned long) a + #undef LSS_BODY + #define LSS_BODY(type, name, args...) \ + register unsigned long __nr __asm__("r1") \ + = (unsigned long)(__NR_##name); \ + register long __res_r2 __asm__("r2"); \ + long __res; \ + __asm__ __volatile__ \ + ("svc 0\n\t" \ + : "=d"(__res_r2) \ + : "d"(__nr), ## args \ + : "memory"); \ + __res = __res_r2; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(2, arg1); \ + LSS_BODY(type, name, "0"(__r2)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(2, arg1); LSS_REG(3, arg2); \ + LSS_BODY(type, name, "0"(__r2), "d"(__r3)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(2, arg1); LSS_REG(3, arg2); LSS_REG(4, arg3); \ + LSS_BODY(type, name, "0"(__r2), "d"(__r3), "d"(__r4)); \ + } + #undef _syscall4 + #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, \ + type4 arg4) { \ + LSS_REG(2, arg1); LSS_REG(3, arg2); LSS_REG(4, arg3); \ + LSS_REG(5, arg4); \ + LSS_BODY(type, name, "0"(__r2), "d"(__r3), "d"(__r4), \ + "d"(__r5)); \ + } + #undef _syscall5 + #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, \ + type4 arg4, type5 arg5) { \ + LSS_REG(2, arg1); LSS_REG(3, arg2); LSS_REG(4, arg3); \ + LSS_REG(5, arg4); LSS_REG(6, arg5); \ + LSS_BODY(type, name, "0"(__r2), "d"(__r3), "d"(__r4), \ + "d"(__r5), "d"(__r6)); \ + } + #undef _syscall6 + #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5, type6, arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, \ + type4 arg4, type5 arg5, type6 arg6) { \ + LSS_REG(2, arg1); LSS_REG(3, arg2); LSS_REG(4, arg3); \ + LSS_REG(5, arg4); LSS_REG(6, arg5); LSS_REG(7, arg6); \ + LSS_BODY(type, name, "0"(__r2), "d"(__r3), "d"(__r4), \ + "d"(__r5), "d"(__r6), "d"(__r7)); \ + } + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long __ret; + { + register int (*__fn)(void *) __asm__ ("r1") = fn; + register void *__cstack __asm__ ("r2") = child_stack; + register int __flags __asm__ ("r3") = flags; + register void *__arg __asm__ ("r0") = arg; + register int *__ptidptr __asm__ ("r4") = parent_tidptr; + register void *__newtls __asm__ ("r6") = newtls; + register int *__ctidptr __asm__ ("r5") = child_tidptr; + __asm__ __volatile__ ( + #ifndef __s390x__ + /* arg already in r0 */ + "ltr %4, %4\n\t" /* check fn, which is already in r1 */ + "jz 1f\n\t" /* NULL function pointer, return -EINVAL */ + "ltr %5, %5\n\t" /* check child_stack, which is already in r2 */ + "jz 1f\n\t" /* NULL stack pointer, return -EINVAL */ + /* flags already in r3 */ + /* parent_tidptr already in r4 */ + /* child_tidptr already in r5 */ + /* newtls already in r6 */ + "svc %2\n\t" /* invoke clone syscall */ + "ltr %0,%%r2\n\t" /* load return code into __ret and test */ + "jnz 1f\n\t" /* return to parent if non-zero */ + /* start child thread */ + "lr %%r2, %7\n\t" /* set first parameter to void *arg */ + "ahi %%r15, -96\n\t" /* make room on the stack for the save area */ + "xc 0(4,%%r15), 0(%%r15)\n\t" + "basr %%r14, %4\n\t" /* jump to fn */ + "svc %3\n" /* invoke exit syscall */ + "1:\n" + #else + /* arg already in r0 */ + "ltgr %4, %4\n\t" /* check fn, which is already in r1 */ + "jz 1f\n\t" /* NULL function pointer, return -EINVAL */ + "ltgr %5, %5\n\t" /* check child_stack, which is already in r2 */ + "jz 1f\n\t" /* NULL stack pointer, return -EINVAL */ + /* flags already in r3 */ + /* parent_tidptr already in r4 */ + /* child_tidptr already in r5 */ + /* newtls already in r6 */ + "svc %2\n\t" /* invoke clone syscall */ + "ltgr %0, %%r2\n\t" /* load return code into __ret and test */ + "jnz 1f\n\t" /* return to parent if non-zero */ + /* start child thread */ + "lgr %%r2, %7\n\t" /* set first parameter to void *arg */ + "aghi %%r15, -160\n\t" /* make room on the stack for the save area */ + "xc 0(8,%%r15), 0(%%r15)\n\t" + "basr %%r14, %4\n\t" /* jump to fn */ + "svc %3\n" /* invoke exit syscall */ + "1:\n" + #endif + : "=r" (__ret) + : "0" (-EINVAL), "i" (__NR_clone), "i" (__NR_exit), + "d" (__fn), "d" (__cstack), "d" (__flags), "d" (__arg), + "d" (__ptidptr), "d" (__newtls), "d" (__ctidptr) + : "cc", "r14", "memory" + ); + } + LSS_RETURN(int, __ret); + } + #elif defined(__riscv) && __riscv_xlen == 64 + #undef LSS_REG + #define LSS_REG(r,a) register int64_t __r##r __asm__("a"#r) = (int64_t)a + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register int64_t __res_a0 __asm__("a0"); \ + register int64_t __a7 __asm__("a7") = __NR_##name; \ + int64_t __res; \ + __asm__ __volatile__ ("scall\n" \ + : "=r"(__res_a0) \ + : "r"(__a7) , ## args \ + : "memory"); \ + __res = __res_a0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + int64_t __res; + { + register int64_t __res_a0 __asm__("a0"); + register uint64_t __flags __asm__("a0") = flags; + register void *__stack __asm__("a1") = child_stack; + register void *__ptid __asm__("a2") = parent_tidptr; + register void *__tls __asm__("a3") = newtls; + register int *__ctid __asm__("a4") = child_tidptr; + __asm__ __volatile__(/* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "addi %2,%2,-16\n" + "sd %1, 0(%2)\n" + "sd %4, 8(%2)\n" + + /* %a0 = syscall(%a0 = flags, + * %a1 = child_stack, + * %a2 = parent_tidptr, + * %a3 = newtls, + * %a4 = child_tidptr) + */ + "li a7, %8\n" + "scall\n" + + /* if (%a0 != 0) + * return %a0; + */ + "bnez %0, 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ld a1, 0(sp)\n" + "ld a0, 8(sp)\n" + "jalr a1\n" + + /* Call _exit(%a0). + */ + "li a7, %9\n" + "scall\n" + "1:\n" + : "=r" (__res_a0) + : "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__tls), "r"(__ctid), + "i"(__NR_clone), "i"(__NR_exit) + : "cc", "memory"); + __res = __res_a0; + } + LSS_RETURN(int, __res); + } + #elif defined(__e2k__) + + #undef _LSS_BODY + #define _LSS_BODY(nr, type, name, ...) \ + register unsigned long long __res; \ + __asm__ __volatile__ \ + ( \ + "{\n\t" \ + " sdisp %%ctpr1, 0x3\n\t" \ + " addd, s 0x0, %[sys_num], %%b[0]\n\t" \ + LSS_BODY_ASM##nr \ + "}\n\t" \ + "{\n\t" \ + " call %%ctpr1, wbs = %#\n\t" \ + "}\n\t" \ + "{\n\t" \ + " addd, s 0x0, %%b[0], %[res]\n\t" \ + "}\n\t" \ + : [res] "=r" (__res) \ + : \ + LSS_BODY_ARG##nr(__VA_ARGS__) \ + [sys_num] "ri" (__NR_##name) \ + : "ctpr1", "ctpr2", "ctpr3", \ + "b[0]", "b[1]", "b[2]", "b[3]", \ + "b[4]", "b[5]", "b[6]", "b[7]" \ + ); \ + LSS_RETURN(type, __res); + + #undef LSS_BODY + #define LSS_BODY(nr, type, name, args...) \ + _LSS_BODY(nr, type, name, ## args) + + #undef LSS_BODY_ASM0 + #undef LSS_BODY_ASM1 + #undef LSS_BODY_ASM2 + #undef LSS_BODY_ASM3 + #undef LSS_BODY_ASM4 + #undef LSS_BODY_ASM5 + #undef LSS_BODY_ASM6 + + #define LSS_BODY_ASM0 + #define LSS_BODY_ASM1 LSS_BODY_ASM0 \ + " addd, s 0x0, %[arg1], %%b[1]\n\t" + #define LSS_BODY_ASM2 LSS_BODY_ASM1 \ + " addd, s 0x0, %[arg2], %%b[2]\n\t" + #define LSS_BODY_ASM3 LSS_BODY_ASM2 \ + " addd, s 0x0, %[arg3], %%b[3]\n\t" + #define LSS_BODY_ASM4 LSS_BODY_ASM3 \ + " addd, s 0x0, %[arg4], %%b[4]\n\t" + #define LSS_BODY_ASM5 LSS_BODY_ASM4 \ + " addd, s 0x0, %[arg5], %%b[5]\n\t" + #define LSS_BODY_ASM6 LSS_BODY_ASM5 \ + "}\n\t" \ + "{\n\t" \ + " addd, s 0x0, %[arg6], %%b[6]\n\t" + + #undef LSS_SYSCALL_ARG + #define LSS_SYSCALL_ARG(a) ((unsigned long long)(uintptr_t)(a)) + + #undef LSS_BODY_ARG0 + #undef LSS_BODY_ARG1 + #undef LSS_BODY_ARG2 + #undef LSS_BODY_ARG3 + #undef LSS_BODY_ARG4 + #undef LSS_BODY_ARG5 + #undef LSS_BODY_ARG6 + + #define LSS_BODY_ARG0() + #define LSS_BODY_ARG1(_arg1) \ + [arg1] "ri" LSS_SYSCALL_ARG(_arg1), + #define LSS_BODY_ARG2(_arg1, _arg2) \ + LSS_BODY_ARG1(_arg1) \ + [arg2] "ri" LSS_SYSCALL_ARG(_arg2), + #define LSS_BODY_ARG3(_arg1, _arg2, _arg3) \ + LSS_BODY_ARG2(_arg1, _arg2) \ + [arg3] "ri" LSS_SYSCALL_ARG(_arg3), + #define LSS_BODY_ARG4(_arg1, _arg2, _arg3, _arg4) \ + LSS_BODY_ARG3(_arg1, _arg2, _arg3) \ + [arg4] "ri" LSS_SYSCALL_ARG(_arg4), + #define LSS_BODY_ARG5(_arg1, _arg2, _arg3, _arg4, _arg5) \ + LSS_BODY_ARG4(_arg1, _arg2, _arg3, _arg4) \ + [arg5] "ri" LSS_SYSCALL_ARG(_arg5), + #define LSS_BODY_ARG6(_arg1, _arg2, _arg3, _arg4, _arg5, _arg6) \ + LSS_BODY_ARG5(_arg1, _arg2, _arg3, _arg4, _arg5) \ + [arg6] "ri" LSS_SYSCALL_ARG(_arg6), + + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(0, type, name); \ + } + + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_BODY(1, type, name, arg1) \ + } + + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_BODY(2, type, name, arg1, arg2) \ + } + + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_BODY(3, type, name, arg1, arg2, arg3) \ + } + + #undef _syscall4 + #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_BODY(4, type, name, arg1, arg2, arg3, arg4) \ + } + + #undef _syscall5 + #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_BODY(5, type, name, arg1, arg2, arg3, arg4, arg5) \ + } + + #undef _syscall6 + #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5, type6, arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_BODY(6, type, name, arg1, arg2, arg3, arg4, arg5, arg6) \ + } + + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + unsigned long long __res; + + __asm__ __volatile__ ( + "{\n\t" + " addd,s 0x0, %[nr_clone], %%b[0]\n\t" + " addd,s 0x0, %[flags], %%db[1]\n\t" + " addd,s 0x0, %[child_stack], %%db[2]\n\t" + " addd,s 0x0, %[parent_tidptr], %%db[3]\n\t" + " addd,s 0x0, %[child_tidptr], %%db[4]\n\t" + " addd,s 0x0, %[newtls], %%db[5]\n\t" + "}\n\t" + /* if (fn == NULL) + * return -EINVAL; + */ + + "{\n\t" + " disp %%ctpr1, .L1\n\t" + "}\n\t" + "{\n\t" + " cmpesb,s 0x0, %[fn], %%pred0\n\t" + "}\n\t" + "{\n\t" + " ct %%ctpr1 ? %%pred0\n\t" + "}\n\t" + + /* if (child_stack == NULL) + * return -EINVAL; + */ + "{\n\t" + " cmpesb,s 0x0, %%db[2], %%pred0\n\t" + "}\n\t" + "{\n\t" + " ct %%ctpr1 ? %%pred0\n\t" + "}\n\t" + + /* b[0] = syscall(%b[0] = __NR_clone, + * %db[1] = flags, + * %db[2] = child_stack, + * %db[3] = parent_tidptr, + * %db[4] = child_tidptr, + * %db[5] = newtls) + */ + "{\n\t" + " sdisp %%ctpr1, 0x3\n\t" + "}\n\t" + "{\n\t" + " call %%ctpr1, wbs = %#\n\t" + "}\n\t" + + /* if (%[b0] != 0) + * return %b[0]; + */ + "{\n\t" + " disp %%ctpr1, .L2\n\t" + " cmpesb,s 0x0, %%b[0], %%pred0\n\t" + "}\n\t" + "{\n\t" + " ct %%ctpr1 ? ~%%pred0\n\t" + "}\n\t" + /* In the child, now. Call "fn(arg)". + */ + + "{\n\t" + " movtd,s %[fn], %%ctpr1\n\t" + "}\n\t" + "{\n\t" + " addd,s 0x0, %[arg], %%db[0]\n\t" + "}\n\t" + "{\n\t" + " call %%ctpr1, wbs = %#\n\t" + "}\n\t" + /* Call _exit(%b[0]). + */ + + "{\n\t" + " sdisp %%ctpr1, 0x3\n\t" + " addd,s 0x0, %%b[0], %%b[1]\n\t" + "}\n\t" + "{\n\t" + " addd,s 0x0, %[nr_exit], %%b[0]\n\t" + "}\n\t" + "{\n\t" + " call %%ctpr1, wbs = %#\n\t" + "}\n\t" + "{\n\t" + " disp %%ctpr1, .L2\n\t" + " adds,s 0x0, 0x0, %%b[0]\n\t" + "}\n\t" + "{\n\t" + " ct %%ctpr1\n\t" + "}\n\t" + ".L1:\n\t" + "{\n\t" + " addd,s 0x0, %[einval], %%b[0]\n\t" + "}\n\t" + ".L2:\n\t" + "{\n\t" + " addd,s 0x0, %%b[0], %[res]\n\t" + "}\n\t" + : [res] "=r" LSS_SYSCALL_ARG(__res) + : [nr_clone] "ri" LSS_SYSCALL_ARG(__NR_clone) + [arg] "ri" LSS_SYSCALL_ARG(arg) + [nr_exit] "ri" LSS_SYSCALL_ARG(__NR_exit) + [flags] "ri" LSS_SYSCALL_ARG(flags) + [child_stack] "ri" LSS_SYSCALL_ARG(child_stack) + [parent_tidptr] "ri" + LSS_SYSCALL_ARG(parent_tidptr) + [newtls] "ri" LSS_SYSCALL_ARG(newtls) + [child_tidptr] "ri" + LSS_SYSCALL_ARG(child_tidptr) + [fn] "ri" LSS_SYSCALL_ARG(fn) + [einval] "ri" LSS_SYSCALL_ARG(-EINVAL) + : "ctpr1", "b[0]", "b[1]", "b[2]", "b[3]", + "b[4]", "b[5]", "pred0"); + LSS_RETURN(int, __res); + } + #elif defined(__loongarch_lp64) + /* Most definitions of _syscallX() neglect to mark "memory" as being + * clobbered. This causes problems with compilers, that do a better job + * at optimizing across __asm__ calls. + * So, we just have to redefine all of the _syscallX() macros. + */ + #undef LSS_REG + #define LSS_REG(ar,a) register int64_t __r##ar __asm__("a"#ar) = (int64_t)a + /* syscall is like subroutine calls, all caller-saved registers may be + * clobbered, we should add them to the |Clobbers| list. + * a0 is not included because it's in the output list. + */ + #define LSS_SYSCALL_CLOBBERS "t0", "t1", "t2", "t3", "t4", "t5", "t6", \ + "t7", "t8", "memory" + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register int64_t __res_a0 __asm__("a0"); \ + register int64_t __a7 __asm__("a7") = __NR_##name; \ + int64_t __res; \ + __asm__ __volatile__ ("syscall 0x0\n" \ + : "=r"(__res_a0) \ + : "r"(__a7), ## args \ + : LSS_SYSCALL_CLOBBERS); \ + __res = __res_a0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + int64_t __res; + { + register int64_t __res_a0 __asm__("a0"); + register uint64_t __flags __asm__("a0") = flags; + register void *__stack __asm__("a1") = child_stack; + register void *__ptid __asm__("a2") = parent_tidptr; + register void *__tls __asm__("a3") = newtls; + register int *__ctid __asm__("a4") = child_tidptr; + __asm__ __volatile__(/* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "addi.d %2, %2, -16\n" + "st.d %1, %2, 8\n" + "st.d %4, %2, 0\n" + + /* %a0 = syscall(%a0 = flags, + * %a1 = child_stack, + * %a2 = parent_tidptr, + * %a3 = newtls, + * %a4 = child_tidptr) + */ + "li.d $a7, %8\n" + "syscall 0x0\n" + + /* if (%a0 != 0) + * return %a0; + */ + "bnez $a0, 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ld.d $a0, $sp, 0\n" + "ld.d $a1, $sp, 8\n" + "addi.d $sp, $sp, 16\n" + "jirl $ra, $a1, 0\n" + + /* Call _exit(%a0). + */ + "li.d $a7, %9\n" + "syscall 0x0\n" + "1:\n" + : "=r" (__res_a0) + : "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__tls), "r"(__ctid), + "i"(__NR_clone), "i"(__NR_exit) + : "a7", LSS_SYSCALL_CLOBBERS); + __res = __res_a0; + } + LSS_RETURN(int, __res); + } + + #endif + #define __NR__exit __NR_exit + #define __NR__gettid __NR_gettid + #define __NR__mremap __NR_mremap + LSS_INLINE _syscall1(void *, brk, void *, e) + LSS_INLINE _syscall1(int, chdir, const char *,p) + LSS_INLINE _syscall1(int, close, int, f) + LSS_INLINE _syscall2(int, clock_getres, int, c, + struct kernel_timespec*, t) + LSS_INLINE _syscall2(int, clock_gettime, int, c, + struct kernel_timespec*, t) + LSS_INLINE _syscall1(int, dup, int, f) + #if defined(__NR_dup2) + // dup2 is polyfilled below when not available. + LSS_INLINE _syscall2(int, dup2, int, s, + int, d) + #endif + #if defined(__NR_dup3) + LSS_INLINE _syscall3(int, dup3, int, s, int, d, int, f) + #endif + LSS_INLINE _syscall3(int, execve, const char*, f, + const char*const*,a,const char*const*, e) + LSS_INLINE _syscall1(int, _exit, int, e) + LSS_INLINE _syscall1(int, exit_group, int, e) + LSS_INLINE _syscall3(int, fcntl, int, f, + int, c, long, a) + #if defined(__NR_fork) + // fork is polyfilled below when not available. + LSS_INLINE _syscall0(pid_t, fork) + #endif + #if defined(__NR_fstat) + LSS_INLINE _syscall2(int, fstat, int, f, + struct kernel_stat*, b) + #endif + LSS_INLINE _syscall2(int, fstatfs, int, f, + struct kernel_statfs*, b) + #if defined(__x86_64__) + /* Need to make sure off_t isn't truncated to 32-bits under x32. */ + LSS_INLINE int LSS_NAME(ftruncate)(int f, off_t l) { + LSS_BODY(2, int, ftruncate, LSS_SYSCALL_ARG(f), (uint64_t)(l)); + } + #else + LSS_INLINE _syscall2(int, ftruncate, int, f, + off_t, l) + #endif + LSS_INLINE _syscall6(int, futex, int*, u, + int, o, int, v, + struct kernel_timespec*, t, + int*, u2, int, v2) + LSS_INLINE _syscall3(int, getdents, int, f, + struct kernel_dirent*, d, int, c) + LSS_INLINE _syscall3(int, getdents64, int, f, + struct kernel_dirent64*, d, int, c) + LSS_INLINE _syscall0(gid_t, getegid) + LSS_INLINE _syscall0(uid_t, geteuid) + LSS_INLINE _syscall2(int, getitimer, int, w, + struct kernel_itimerval*, c) + #if defined(__NR_getpgrp) + LSS_INLINE _syscall0(pid_t, getpgrp) + #endif + LSS_INLINE _syscall0(pid_t, getpid) + LSS_INLINE _syscall0(pid_t, getppid) + LSS_INLINE _syscall2(int, getpriority, int, a, + int, b) + LSS_INLINE _syscall3(int, getresgid, gid_t *, r, + gid_t *, e, gid_t *, s) + LSS_INLINE _syscall3(int, getresuid, uid_t *, r, + uid_t *, e, uid_t *, s) + #if defined(__NR_getrlimit) + LSS_INLINE _syscall2(int, getrlimit, int, r, + struct kernel_rlimit*, l) + #endif + LSS_INLINE _syscall1(pid_t, getsid, pid_t, p) + LSS_INLINE _syscall0(pid_t, _gettid) + LSS_INLINE _syscall2(pid_t, gettimeofday, struct kernel_timeval*, t, + void*, tz) + LSS_INLINE _syscall5(int, setxattr, const char *,p, + const char *, n, const void *,v, + size_t, s, int, f) + LSS_INLINE _syscall5(int, lsetxattr, const char *,p, + const char *, n, const void *,v, + size_t, s, int, f) + LSS_INLINE _syscall4(ssize_t, getxattr, const char *,p, + const char *, n, void *, v, size_t, s) + LSS_INLINE _syscall4(ssize_t, lgetxattr, const char *,p, + const char *, n, void *, v, size_t, s) + LSS_INLINE _syscall3(ssize_t, listxattr, const char *,p, + char *, l, size_t, s) + LSS_INLINE _syscall3(ssize_t, llistxattr, const char *,p, + char *, l, size_t, s) + LSS_INLINE _syscall3(int, ioctl, int, d, + int, r, void *, a) + LSS_INLINE _syscall2(int, ioprio_get, int, which, + int, who) + LSS_INLINE _syscall3(int, ioprio_set, int, which, + int, who, int, ioprio) + LSS_INLINE _syscall2(int, kill, pid_t, p, + int, s) + #if defined(__x86_64__) + /* Need to make sure off_t isn't truncated to 32-bits under x32. */ + LSS_INLINE off_t LSS_NAME(lseek)(int f, off_t o, int w) { + _LSS_BODY(3, off_t, lseek, off_t, LSS_SYSCALL_ARG(f), (uint64_t)(o), + LSS_SYSCALL_ARG(w)); + } + #else + LSS_INLINE _syscall3(off_t, lseek, int, f, + off_t, o, int, w) + #endif + LSS_INLINE _syscall2(int, munmap, void*, s, + size_t, l) + LSS_INLINE _syscall6(long, move_pages, pid_t, p, + unsigned long, n, void **,g, int *, d, + int *, s, int, f) + LSS_INLINE _syscall3(int, mprotect, const void *,a, + size_t, l, int, p) + LSS_INLINE _syscall5(void*, _mremap, void*, o, + size_t, os, size_t, ns, + unsigned long, f, void *, a) + #if defined(__NR_open) + // open is polyfilled below when not available. + LSS_INLINE _syscall3(int, open, const char*, p, + int, f, int, m) + #endif + #if defined(__NR_poll) + // poll is polyfilled below when not available. + LSS_INLINE _syscall3(int, poll, struct kernel_pollfd*, u, + unsigned int, n, int, t) + #endif + #if defined(__NR_ppoll) + LSS_INLINE _syscall5(int, ppoll, struct kernel_pollfd *, u, + unsigned int, n, const struct kernel_timespec *, t, + const struct kernel_sigset_t *, sigmask, size_t, s) + #endif + LSS_INLINE _syscall5(int, prctl, int, option, + unsigned long, arg2, + unsigned long, arg3, + unsigned long, arg4, + unsigned long, arg5) + LSS_INLINE _syscall4(long, ptrace, int, r, + pid_t, p, void *, a, void *, d) + #if defined(__NR_quotactl) + // Defined on x86_64 / i386 only + LSS_INLINE _syscall4(int, quotactl, int, cmd, const char *, special, + int, id, caddr_t, addr) + #endif + LSS_INLINE _syscall3(ssize_t, read, int, f, + void *, b, size_t, c) + #if defined(__NR_readlink) + // readlink is polyfilled below when not available. + LSS_INLINE _syscall3(int, readlink, const char*, p, + char*, b, size_t, s) + #endif + #if defined(__NR_readlinkat) + LSS_INLINE _syscall4(int, readlinkat, int, d, const char *, p, char *, b, + size_t, s) + #endif + LSS_INLINE _syscall4(int, rt_sigaction, int, s, + const struct kernel_sigaction*, a, + struct kernel_sigaction*, o, size_t, c) + LSS_INLINE _syscall2(int, rt_sigpending, struct kernel_sigset_t *, s, + size_t, c) + LSS_INLINE _syscall4(int, rt_sigprocmask, int, h, + const struct kernel_sigset_t*, s, + struct kernel_sigset_t*, o, size_t, c) + LSS_INLINE _syscall2(int, rt_sigsuspend, + const struct kernel_sigset_t*, s, size_t, c) + LSS_INLINE _syscall4(int, rt_sigtimedwait, const struct kernel_sigset_t*, s, + siginfo_t*, i, const struct timespec*, t, size_t, c) + LSS_INLINE _syscall3(int, sched_getaffinity,pid_t, p, + unsigned int, l, unsigned long *, m) + LSS_INLINE _syscall3(int, sched_setaffinity,pid_t, p, + unsigned int, l, unsigned long *, m) + LSS_INLINE _syscall0(int, sched_yield) + LSS_INLINE _syscall1(long, set_tid_address, int *, t) + LSS_INLINE _syscall1(int, setfsgid, gid_t, g) + LSS_INLINE _syscall1(int, setfsuid, uid_t, u) + LSS_INLINE _syscall1(int, setuid, uid_t, u) + LSS_INLINE _syscall1(int, setgid, gid_t, g) + LSS_INLINE _syscall3(int, setitimer, int, w, + const struct kernel_itimerval*, n, + struct kernel_itimerval*, o) + LSS_INLINE _syscall2(int, setpgid, pid_t, p, + pid_t, g) + LSS_INLINE _syscall3(int, setpriority, int, a, + int, b, int, p) + LSS_INLINE _syscall3(int, setresgid, gid_t, r, + gid_t, e, gid_t, s) + LSS_INLINE _syscall3(int, setresuid, uid_t, r, + uid_t, e, uid_t, s) + #if defined(__NR_setrlimit) + LSS_INLINE _syscall2(int, setrlimit, int, r, + const struct kernel_rlimit*, l) + #endif + LSS_INLINE _syscall0(pid_t, setsid) + LSS_INLINE _syscall2(int, sigaltstack, const stack_t*, s, + const stack_t*, o) + #if defined(__NR_sigreturn) + LSS_INLINE _syscall1(int, sigreturn, unsigned long, u) + #endif + #if defined(__NR_stat) + // stat and lstat are polyfilled below when not available. + LSS_INLINE _syscall2(int, stat, const char*, f, + struct kernel_stat*, b) + #endif + #if defined(__NR_lstat) + LSS_INLINE _syscall2(int, lstat, const char*, f, + struct kernel_stat*, b) + #endif + LSS_INLINE _syscall2(int, statfs, const char*, f, + struct kernel_statfs*, b) + LSS_INLINE _syscall3(int, tgkill, pid_t, p, + pid_t, t, int, s) + LSS_INLINE _syscall2(int, tkill, pid_t, p, + int, s) + #if defined(__NR_unlink) + // unlink is polyfilled below when not available. + LSS_INLINE _syscall1(int, unlink, const char*, f) + #endif + LSS_INLINE _syscall3(ssize_t, write, int, f, + const void *, b, size_t, c) + LSS_INLINE _syscall3(ssize_t, writev, int, f, + const struct kernel_iovec*, v, size_t, c) + #if defined(__NR_getcpu) + LSS_INLINE _syscall3(long, getcpu, unsigned *, cpu, + unsigned *, node, void *, unused) + #endif + #if defined(__NR_fadvise64) + #if defined(__x86_64__) + /* Need to make sure loff_t isn't truncated to 32-bits under x32. */ + LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset, loff_t len, + int advice) { + LSS_BODY(4, int, fadvise64, LSS_SYSCALL_ARG(fd), (uint64_t)(offset), + (uint64_t)(len), LSS_SYSCALL_ARG(advice)); + } + #else + LSS_INLINE _syscall4(int, fadvise64, + int, fd, loff_t, offset, loff_t, len, int, advice) + #endif + #elif defined(__i386__) + #define __NR__fadvise64_64 __NR_fadvise64_64 + LSS_INLINE _syscall6(int, _fadvise64_64, int, fd, + unsigned, offset_lo, unsigned, offset_hi, + unsigned, len_lo, unsigned, len_hi, + int, advice) + + LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset, + loff_t len, int advice) { + return LSS_NAME(_fadvise64_64)(fd, + (unsigned)offset, (unsigned)(offset >>32), + (unsigned)len, (unsigned)(len >> 32), + advice); + } + + #elif defined(__s390__) && !defined(__s390x__) + #define __NR__fadvise64_64 __NR_fadvise64_64 + struct kernel_fadvise64_64_args { + int fd; + long long offset; + long long len; + int advice; + }; + + LSS_INLINE _syscall1(int, _fadvise64_64, + struct kernel_fadvise64_64_args *args) + + LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset, + loff_t len, int advice) { + struct kernel_fadvise64_64_args args = { fd, offset, len, advice }; + return LSS_NAME(_fadvise64_64)(&args); + } + #endif + #if defined(__NR_fallocate) + #if defined(__x86_64__) + /* Need to make sure loff_t isn't truncated to 32-bits under x32. */ + LSS_INLINE int LSS_NAME(fallocate)(int f, int mode, loff_t offset, + loff_t len) { + LSS_BODY(4, int, fallocate, LSS_SYSCALL_ARG(f), LSS_SYSCALL_ARG(mode), + (uint64_t)(offset), (uint64_t)(len)); + } + #elif (defined(__i386__) || (defined(__s390__) && !defined(__s390x__)) \ + || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) \ + || (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) \ + || defined(__PPC__)) + #define __NR__fallocate __NR_fallocate + LSS_INLINE _syscall6(int, _fallocate, int, fd, + int, mode, + unsigned, offset_lo, unsigned, offset_hi, + unsigned, len_lo, unsigned, len_hi) + + LSS_INLINE int LSS_NAME(fallocate)(int fd, int mode, + loff_t offset, loff_t len) { + union { loff_t off; unsigned w[2]; } o = { offset }, l = { len }; + return LSS_NAME(_fallocate)(fd, mode, o.w[0], o.w[1], l.w[0], l.w[1]); + } + #else + LSS_INLINE _syscall4(int, fallocate, + int, f, int, mode, loff_t, offset, loff_t, len) + #endif + #endif + #if defined(__NR_getrandom) + LSS_INLINE _syscall3(ssize_t, getrandom, void*, buffer, size_t, length, + unsigned int, flags) + #endif + #if defined(__NR_newfstatat) + LSS_INLINE _syscall4(int, newfstatat, int, d, + const char *, p, + struct kernel_stat*, b, int, f) + #endif + #if defined(__NR_statx) + LSS_INLINE _syscall5(int, statx, int, d, + const char *, p, + int, f, int, m, + struct kernel_statx*, b) + #endif + #if defined(__x86_64__) || defined(__s390x__) + LSS_INLINE int LSS_NAME(getresgid32)(gid_t *rgid, + gid_t *egid, + gid_t *sgid) { + return LSS_NAME(getresgid)(rgid, egid, sgid); + } + + LSS_INLINE int LSS_NAME(getresuid32)(uid_t *ruid, + uid_t *euid, + uid_t *suid) { + return LSS_NAME(getresuid)(ruid, euid, suid); + } + + LSS_INLINE int LSS_NAME(setfsgid32)(gid_t gid) { + return LSS_NAME(setfsgid)(gid); + } + + LSS_INLINE int LSS_NAME(setfsuid32)(uid_t uid) { + return LSS_NAME(setfsuid)(uid); + } + + LSS_INLINE int LSS_NAME(setresgid32)(gid_t rgid, gid_t egid, gid_t sgid) { + return LSS_NAME(setresgid)(rgid, egid, sgid); + } + + LSS_INLINE int LSS_NAME(setresuid32)(uid_t ruid, uid_t euid, uid_t suid) { + return LSS_NAME(setresuid)(ruid, euid, suid); + } + + LSS_INLINE int LSS_NAME(sigaction)(int signum, + const struct kernel_sigaction *act, + struct kernel_sigaction *oldact) { + #if defined(__x86_64__) + /* On x86_64, the kernel requires us to always set our own + * SA_RESTORER in order to be able to return from a signal handler. + * This function must have a "magic" signature that the "gdb" + * (and maybe the kernel?) can recognize. + */ + if (act != NULL && !(act->sa_flags & SA_RESTORER)) { + struct kernel_sigaction a = *act; + a.sa_flags |= SA_RESTORER; + a.sa_restorer = LSS_NAME(restore_rt)(); + return LSS_NAME(rt_sigaction)(signum, &a, oldact, + (KERNEL_NSIG+7)/8); + } else + #endif + return LSS_NAME(rt_sigaction)(signum, act, oldact, + (KERNEL_NSIG+7)/8); + } + + LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) { + return LSS_NAME(rt_sigpending)(set, (KERNEL_NSIG+7)/8); + } + + LSS_INLINE int LSS_NAME(sigsuspend)(const struct kernel_sigset_t *set) { + return LSS_NAME(rt_sigsuspend)(set, (KERNEL_NSIG+7)/8); + } + #endif + #if defined(__NR_rt_sigprocmask) + LSS_INLINE int LSS_NAME(sigprocmask)(int how, + const struct kernel_sigset_t *set, + struct kernel_sigset_t *oldset) { + return LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8); + } + #endif + #if defined(__NR_rt_sigtimedwait) + LSS_INLINE int LSS_NAME(sigtimedwait)(const struct kernel_sigset_t *set, + siginfo_t *info, + const struct timespec *timeout) { + return LSS_NAME(rt_sigtimedwait)(set, info, timeout, (KERNEL_NSIG+7)/8); + } + #endif + #if defined(__NR_wait4) + LSS_INLINE _syscall4(pid_t, wait4, pid_t, p, + int*, s, int, o, + struct kernel_rusage*, r) + #endif + #if defined(__NR_openat) + LSS_INLINE _syscall4(int, openat, int, d, const char *, p, int, f, int, m) + #endif + #if defined(__NR_unlinkat) + LSS_INLINE _syscall3(int, unlinkat, int, d, const char *, p, int, f) + #endif + #if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \ + (defined(__s390__) && !defined(__s390x__)) + #define __NR__getresgid32 __NR_getresgid32 + #define __NR__getresuid32 __NR_getresuid32 + #define __NR__setfsgid32 __NR_setfsgid32 + #define __NR__setfsuid32 __NR_setfsuid32 + #define __NR__setresgid32 __NR_setresgid32 + #define __NR__setresuid32 __NR_setresuid32 +#if defined(__ARM_EABI__) + LSS_INLINE _syscall2(int, ugetrlimit, int, r, + struct kernel_rlimit*, l) +#endif + LSS_INLINE _syscall3(int, _getresgid32, gid_t *, r, + gid_t *, e, gid_t *, s) + LSS_INLINE _syscall3(int, _getresuid32, uid_t *, r, + uid_t *, e, uid_t *, s) + LSS_INLINE _syscall1(int, _setfsgid32, gid_t, f) + LSS_INLINE _syscall1(int, _setfsuid32, uid_t, f) + LSS_INLINE _syscall3(int, _setresgid32, gid_t, r, + gid_t, e, gid_t, s) + LSS_INLINE _syscall3(int, _setresuid32, uid_t, r, + uid_t, e, uid_t, s) + + LSS_INLINE int LSS_NAME(getresgid32)(gid_t *rgid, + gid_t *egid, + gid_t *sgid) { + int rc; + if ((rc = LSS_NAME(_getresgid32)(rgid, egid, sgid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((rgid == NULL) || (egid == NULL) || (sgid == NULL)) { + return EFAULT; + } + // Clear the high bits first, since getresgid only sets 16 bits + *rgid = *egid = *sgid = 0; + rc = LSS_NAME(getresgid)(rgid, egid, sgid); + } + return rc; + } + + LSS_INLINE int LSS_NAME(getresuid32)(uid_t *ruid, + uid_t *euid, + uid_t *suid) { + int rc; + if ((rc = LSS_NAME(_getresuid32)(ruid, euid, suid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((ruid == NULL) || (euid == NULL) || (suid == NULL)) { + return EFAULT; + } + // Clear the high bits first, since getresuid only sets 16 bits + *ruid = *euid = *suid = 0; + rc = LSS_NAME(getresuid)(ruid, euid, suid); + } + return rc; + } + + LSS_INLINE int LSS_NAME(setfsgid32)(gid_t gid) { + int rc; + if ((rc = LSS_NAME(_setfsgid32)(gid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((unsigned int)gid & ~0xFFFFu) { + rc = EINVAL; + } else { + rc = LSS_NAME(setfsgid)(gid); + } + } + return rc; + } + + LSS_INLINE int LSS_NAME(setfsuid32)(uid_t uid) { + int rc; + if ((rc = LSS_NAME(_setfsuid32)(uid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((unsigned int)uid & ~0xFFFFu) { + rc = EINVAL; + } else { + rc = LSS_NAME(setfsuid)(uid); + } + } + return rc; + } + + LSS_INLINE int LSS_NAME(setresgid32)(gid_t rgid, gid_t egid, gid_t sgid) { + int rc; + if ((rc = LSS_NAME(_setresgid32)(rgid, egid, sgid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((unsigned int)rgid & ~0xFFFFu || + (unsigned int)egid & ~0xFFFFu || + (unsigned int)sgid & ~0xFFFFu) { + rc = EINVAL; + } else { + rc = LSS_NAME(setresgid)(rgid, egid, sgid); + } + } + return rc; + } + + LSS_INLINE int LSS_NAME(setresuid32)(uid_t ruid, uid_t euid, uid_t suid) { + int rc; + if ((rc = LSS_NAME(_setresuid32)(ruid, euid, suid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((unsigned int)ruid & ~0xFFFFu || + (unsigned int)euid & ~0xFFFFu || + (unsigned int)suid & ~0xFFFFu) { + rc = EINVAL; + } else { + rc = LSS_NAME(setresuid)(ruid, euid, suid); + } + } + return rc; + } + #endif + LSS_INLINE int LSS_NAME(sigemptyset)(struct kernel_sigset_t *set) { + memset(&set->sig, 0, sizeof(set->sig)); + return 0; + } + + LSS_INLINE int LSS_NAME(sigfillset)(struct kernel_sigset_t *set) { + memset(&set->sig, -1, sizeof(set->sig)); + return 0; + } + + LSS_INLINE int LSS_NAME(sigaddset)(struct kernel_sigset_t *set, + int signum) { + if (signum < 1 || (size_t)signum > (8*sizeof(set->sig))) { + LSS_ERRNO = EINVAL; + return -1; + } else { + set->sig[(size_t)(signum - 1)/(8*sizeof(set->sig[0]))] + |= 1UL << ((size_t)(signum - 1) % (8*sizeof(set->sig[0]))); + return 0; + } + } + + LSS_INLINE int LSS_NAME(sigdelset)(struct kernel_sigset_t *set, + int signum) { + if (signum < 1 || (size_t)signum > (8*sizeof(set->sig))) { + LSS_ERRNO = EINVAL; + return -1; + } else { + set->sig[(size_t)(signum - 1)/(8*sizeof(set->sig[0]))] + &= ~(1UL << ((size_t)(signum - 1) % (8*sizeof(set->sig[0])))); + return 0; + } + } + + LSS_INLINE int LSS_NAME(sigismember)(struct kernel_sigset_t *set, + int signum) { + if (signum < 1 || (size_t)signum > (8*sizeof(set->sig))) { + LSS_ERRNO = EINVAL; + return -1; + } else { + return !!(set->sig[(size_t)(signum - 1)/(8*sizeof(set->sig[0]))] & + (1UL << ((size_t)(signum - 1) % (8*sizeof(set->sig[0]))))); + } + } + #if defined(__i386__) || \ + defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \ + (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || \ + defined(__PPC__) || \ + (defined(__s390__) && !defined(__s390x__)) || defined(__e2k__) + #define __NR__sigaction __NR_sigaction + #define __NR__sigpending __NR_sigpending + #define __NR__sigsuspend __NR_sigsuspend + #define __NR__socketcall __NR_socketcall + LSS_INLINE _syscall2(int, fstat64, int, f, + struct kernel_stat64 *, b) + LSS_INLINE _syscall5(int, _llseek, uint, fd, + unsigned long, hi, unsigned long, lo, + loff_t *, res, uint, wh) +#if defined(__s390__) && !defined(__s390x__) + /* On s390, mmap2() arguments are passed in memory. */ + LSS_INLINE void* LSS_NAME(_mmap2)(void *s, size_t l, int p, int f, int d, + off_t o) { + unsigned long buf[6] = { (unsigned long) s, (unsigned long) l, + (unsigned long) p, (unsigned long) f, + (unsigned long) d, (unsigned long) o }; + LSS_REG(2, buf); + LSS_BODY(void*, mmap2, "0"(__r2)); + } +#else + #define __NR__mmap2 __NR_mmap2 + LSS_INLINE _syscall6(void*, _mmap2, void*, s, + size_t, l, int, p, + int, f, int, d, + off_t, o) +#endif + LSS_INLINE _syscall3(int, _sigaction, int, s, + const struct kernel_old_sigaction*, a, + struct kernel_old_sigaction*, o) + LSS_INLINE _syscall1(int, _sigpending, unsigned long*, s) + #ifdef __PPC__ + LSS_INLINE _syscall1(int, _sigsuspend, unsigned long, s) + #else + LSS_INLINE _syscall3(int, _sigsuspend, const void*, a, + int, b, + unsigned long, s) + #endif + LSS_INLINE _syscall2(int, stat64, const char *, p, + struct kernel_stat64 *, b) + + LSS_INLINE int LSS_NAME(sigaction)(int signum, + const struct kernel_sigaction *act, + struct kernel_sigaction *oldact) { + int old_errno = LSS_ERRNO; + int rc; + struct kernel_sigaction a; + if (act != NULL) { + a = *act; + #ifdef __i386__ + /* On i386, the kernel requires us to always set our own + * SA_RESTORER when using realtime signals. Otherwise, it does not + * know how to return from a signal handler. This function must have + * a "magic" signature that the "gdb" (and maybe the kernel?) can + * recognize. + * Apparently, a SA_RESTORER is implicitly set by the kernel, when + * using non-realtime signals. + * + * TODO: Test whether ARM needs a restorer + */ + if (!(a.sa_flags & SA_RESTORER)) { + a.sa_flags |= SA_RESTORER; + a.sa_restorer = (a.sa_flags & SA_SIGINFO) + ? LSS_NAME(restore_rt)() : LSS_NAME(restore)(); + } + #endif + } + rc = LSS_NAME(rt_sigaction)(signum, act ? &a : act, oldact, + (KERNEL_NSIG+7)/8); + if (rc < 0 && LSS_ERRNO == ENOSYS) { + struct kernel_old_sigaction oa, ooa, *ptr_a = &oa, *ptr_oa = &ooa; + if (!act) { + ptr_a = NULL; + } else { + oa.sa_handler_ = act->sa_handler_; + memcpy(&oa.sa_mask, &act->sa_mask, sizeof(oa.sa_mask)); + #ifndef __mips__ + oa.sa_restorer = act->sa_restorer; + #endif + oa.sa_flags = act->sa_flags; + } + if (!oldact) { + ptr_oa = NULL; + } + LSS_ERRNO = old_errno; + rc = LSS_NAME(_sigaction)(signum, ptr_a, ptr_oa); + if (rc == 0 && oldact) { + if (act) { + memcpy(oldact, act, sizeof(*act)); + } else { + memset(oldact, 0, sizeof(*oldact)); + } + oldact->sa_handler_ = ptr_oa->sa_handler_; + oldact->sa_flags = ptr_oa->sa_flags; + memcpy(&oldact->sa_mask, &ptr_oa->sa_mask, sizeof(ptr_oa->sa_mask)); + #ifndef __mips__ + oldact->sa_restorer = ptr_oa->sa_restorer; + #endif + } + } + return rc; + } + + LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) { + int old_errno = LSS_ERRNO; + int rc = LSS_NAME(rt_sigpending)(set, (KERNEL_NSIG+7)/8); + if (rc < 0 && LSS_ERRNO == ENOSYS) { + LSS_ERRNO = old_errno; + LSS_NAME(sigemptyset)(set); + rc = LSS_NAME(_sigpending)(&set->sig[0]); + } + return rc; + } + + LSS_INLINE int LSS_NAME(sigsuspend)(const struct kernel_sigset_t *set) { + int olderrno = LSS_ERRNO; + int rc = LSS_NAME(rt_sigsuspend)(set, (KERNEL_NSIG+7)/8); + if (rc < 0 && LSS_ERRNO == ENOSYS) { + LSS_ERRNO = olderrno; + rc = LSS_NAME(_sigsuspend)( + #ifndef __PPC__ + set, 0, + #endif + set->sig[0]); + } + return rc; + } + #endif + #if defined(__i386__) || \ + defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \ + (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || \ + defined(__PPC__) || \ + (defined(__s390__) && !defined(__s390x__)) + /* On these architectures, implement mmap() with mmap2(). */ + LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d, + int64_t o) { + if (o % 4096) { + LSS_ERRNO = EINVAL; + return (void *) -1; + } + return LSS_NAME(_mmap2)(s, l, p, f, d, (o / 4096)); + } + #elif defined(__s390x__) + /* On s390x, mmap() arguments are passed in memory. */ + LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d, + int64_t o) { + unsigned long buf[6] = { (unsigned long) s, (unsigned long) l, + (unsigned long) p, (unsigned long) f, + (unsigned long) d, (unsigned long) o }; + LSS_REG(2, buf); + LSS_BODY(void*, mmap, "0"(__r2)); + } + #elif defined(__x86_64__) + /* Need to make sure __off64_t isn't truncated to 32-bits under x32. */ + LSS_INLINE void* LSS_NAME(mmap)(void *s, size_t l, int p, int f, int d, + int64_t o) { + LSS_BODY(6, void*, mmap, LSS_SYSCALL_ARG(s), LSS_SYSCALL_ARG(l), + LSS_SYSCALL_ARG(p), LSS_SYSCALL_ARG(f), + LSS_SYSCALL_ARG(d), (uint64_t)(o)); + } + #else + /* Remaining 64-bit architectures. */ + LSS_INLINE _syscall6(void*, mmap, void*, addr, size_t, length, int, prot, + int, flags, int, fd, int64_t, offset) + #endif + #if defined(__PPC__) + #undef LSS_SC_LOADARGS_0 + #define LSS_SC_LOADARGS_0(dummy...) + #undef LSS_SC_LOADARGS_1 + #define LSS_SC_LOADARGS_1(arg1) \ + __sc_4 = (unsigned long) (arg1) + #undef LSS_SC_LOADARGS_2 + #define LSS_SC_LOADARGS_2(arg1, arg2) \ + LSS_SC_LOADARGS_1(arg1); \ + __sc_5 = (unsigned long) (arg2) + #undef LSS_SC_LOADARGS_3 + #define LSS_SC_LOADARGS_3(arg1, arg2, arg3) \ + LSS_SC_LOADARGS_2(arg1, arg2); \ + __sc_6 = (unsigned long) (arg3) + #undef LSS_SC_LOADARGS_4 + #define LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4) \ + LSS_SC_LOADARGS_3(arg1, arg2, arg3); \ + __sc_7 = (unsigned long) (arg4) + #undef LSS_SC_LOADARGS_5 + #define LSS_SC_LOADARGS_5(arg1, arg2, arg3, arg4, arg5) \ + LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4); \ + __sc_8 = (unsigned long) (arg5) + #undef LSS_SC_BODY + #define LSS_SC_BODY(nr, type, opt, args...) \ + long __sc_ret, __sc_err; \ + { \ + register unsigned long __sc_0 __asm__ ("r0") = __NR_socketcall; \ + register unsigned long __sc_3 __asm__ ("r3") = opt; \ + register unsigned long __sc_4 __asm__ ("r4"); \ + register unsigned long __sc_5 __asm__ ("r5"); \ + register unsigned long __sc_6 __asm__ ("r6"); \ + register unsigned long __sc_7 __asm__ ("r7"); \ + register unsigned long __sc_8 __asm__ ("r8"); \ + LSS_SC_LOADARGS_##nr(args); \ + __asm__ __volatile__ \ + ("stwu 1, -48(1)\n\t" \ + "stw 4, 20(1)\n\t" \ + "stw 5, 24(1)\n\t" \ + "stw 6, 28(1)\n\t" \ + "stw 7, 32(1)\n\t" \ + "stw 8, 36(1)\n\t" \ + "addi 4, 1, 20\n\t" \ + "sc\n\t" \ + "mfcr %0" \ + : "=&r" (__sc_0), \ + "=&r" (__sc_3), "=&r" (__sc_4), \ + "=&r" (__sc_5), "=&r" (__sc_6), \ + "=&r" (__sc_7), "=&r" (__sc_8) \ + : LSS_ASMINPUT_##nr \ + : "cr0", "ctr", "memory"); \ + __sc_ret = __sc_3; \ + __sc_err = __sc_0; \ + } \ + LSS_RETURN(type, __sc_ret, __sc_err) + + LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg, + int flags){ + LSS_SC_BODY(3, ssize_t, 17, s, msg, flags); + } + + LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s, + const struct kernel_msghdr *msg, + int flags) { + LSS_SC_BODY(3, ssize_t, 16, s, msg, flags); + } + + // TODO(csilvers): why is this ifdef'ed out? +#if 0 + LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len, + int flags, + const struct kernel_sockaddr *to, + unsigned int tolen) { + LSS_BODY(6, ssize_t, 11, s, buf, len, flags, to, tolen); + } +#endif + + LSS_INLINE int LSS_NAME(shutdown)(int s, int how) { + LSS_SC_BODY(2, int, 13, s, how); + } + + LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) { + LSS_SC_BODY(3, int, 1, domain, type, protocol); + } + + LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol, + int sv[2]) { + LSS_SC_BODY(4, int, 8, d, type, protocol, sv); + } + #endif + #if defined(__NR_recvmsg) + LSS_INLINE _syscall3(ssize_t, recvmsg, int, s, struct kernel_msghdr*, msg, + int, flags) + #endif + #if defined(__NR_sendmsg) + LSS_INLINE _syscall3(ssize_t, sendmsg, int, s, const struct kernel_msghdr*, + msg, int, flags) + #endif + #if defined(__NR_sendto) + LSS_INLINE _syscall6(ssize_t, sendto, int, s, const void*, buf, size_t,len, + int, flags, const struct kernel_sockaddr*, to, + unsigned int, tolen) + #endif + #if defined(__NR_shutdown) + LSS_INLINE _syscall2(int, shutdown, int, s, int, how) + #endif + #if defined(__NR_socket) + LSS_INLINE _syscall3(int, socket, int, domain, int, type, int, protocol) + #endif + #if defined(__NR_socketpair) + LSS_INLINE _syscall4(int, socketpair, int, d, int, type, int, protocol, + int*, sv) + #endif + + #if defined(__NR_socketcall) + LSS_INLINE _syscall2(int, _socketcall, int, c, + va_list, a) + LSS_INLINE int LSS_NAME(socketcall)(int op, ...) { + int rc; + va_list ap; + va_start(ap, op); + rc = LSS_NAME(_socketcall)(op, ap); + va_end(ap); + return rc; + } + + # if !defined(__NR_recvmsg) + LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg, + int flags){ + return (ssize_t)LSS_NAME(socketcall)(17, s, msg, flags); + } + # endif + # if !defined(__NR_sendmsg) + LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s, + const struct kernel_msghdr *msg, + int flags) { + return (ssize_t)LSS_NAME(socketcall)(16, s, msg, flags); + } + # endif + # if !defined(__NR_sendto) + LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len, + int flags, + const struct kernel_sockaddr *to, + unsigned int tolen) { + return (ssize_t)LSS_NAME(socketcall)(11, s, buf, len, flags, to, tolen); + } + # endif + # if !defined(__NR_shutdown) + LSS_INLINE int LSS_NAME(shutdown)(int s, int how) { + return LSS_NAME(socketcall)(13, s, how); + } + # endif + # if !defined(__NR_socket) + LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) { + return LSS_NAME(socketcall)(1, domain, type, protocol); + } + # endif + # if !defined(__NR_socketpair) + LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol, + int sv[2]) { + return LSS_NAME(socketcall)(8, d, type, protocol, sv); + } + # endif + #endif + #if defined(__NR_fstatat64) + LSS_INLINE _syscall4(int, fstatat64, int, d, + const char *, p, + struct kernel_stat64 *, b, int, f) + #endif + #if defined(__NR_waitpid) + // waitpid is polyfilled below when not available. + LSS_INLINE _syscall3(pid_t, waitpid, pid_t, p, + int*, s, int, o) + #endif + #if defined(__mips__) + /* sys_pipe() on MIPS has non-standard calling conventions, as it returns + * both file handles through CPU registers. + */ + LSS_INLINE int LSS_NAME(pipe)(int *p) { + register unsigned long __v0 __asm__("$2") = __NR_pipe; + register unsigned long __v1 __asm__("$3"); + register unsigned long __r7 __asm__("$7"); + __asm__ __volatile__ ("syscall\n" + : "=r"(__v0), "=r"(__v1), "=r" (__r7) + : "0"(__v0) + : "$8", "$9", "$10", "$11", "$12", + "$13", "$14", "$15", "$24", "$25", "memory"); + if (__r7) { + unsigned long __errnovalue = __v0; + LSS_ERRNO = __errnovalue; + return -1; + } else { + p[0] = __v0; + p[1] = __v1; + return 0; + } + } + #elif defined(__NR_pipe) + // pipe is polyfilled below when not available. + LSS_INLINE _syscall1(int, pipe, int *, p) + #endif + #if defined(__NR_pipe2) + LSS_INLINE _syscall2(int, pipe2, int *, pipefd, int, flags) + #endif + /* TODO(csilvers): see if ppc can/should support this as well */ + #if defined(__i386__) || defined(__ARM_ARCH_3__) || \ + defined(__ARM_EABI__) || \ + (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64) || \ + (defined(__s390__) && !defined(__s390x__)) + #define __NR__statfs64 __NR_statfs64 + #define __NR__fstatfs64 __NR_fstatfs64 + LSS_INLINE _syscall3(int, _statfs64, const char*, p, + size_t, s,struct kernel_statfs64*, b) + LSS_INLINE _syscall3(int, _fstatfs64, int, f, + size_t, s,struct kernel_statfs64*, b) + LSS_INLINE int LSS_NAME(statfs64)(const char *p, + struct kernel_statfs64 *b) { + return LSS_NAME(_statfs64)(p, sizeof(*b), b); + } + LSS_INLINE int LSS_NAME(fstatfs64)(int f,struct kernel_statfs64 *b) { + return LSS_NAME(_fstatfs64)(f, sizeof(*b), b); + } + #endif + + LSS_INLINE int LSS_NAME(execv)(const char *path, const char *const argv[]) { + extern char **environ; + return LSS_NAME(execve)(path, argv, (const char *const *)environ); + } + + LSS_INLINE pid_t LSS_NAME(gettid)(void) { + pid_t tid = LSS_NAME(_gettid)(); + if (tid != -1) { + return tid; + } + return LSS_NAME(getpid)(); + } + + LSS_INLINE void *LSS_NAME(mremap)(void *old_address, size_t old_size, + size_t new_size, int flags, ...) { + va_list ap; + void *new_address, *rc; + va_start(ap, flags); + new_address = va_arg(ap, void *); + rc = LSS_NAME(_mremap)(old_address, old_size, new_size, + (unsigned long)flags, new_address); + va_end(ap); + return rc; + } + + LSS_INLINE long LSS_NAME(ptrace_detach)(pid_t pid) { + /* PTRACE_DETACH can sometimes forget to wake up the tracee and it + * then sends job control signals to the real parent, rather than to + * the tracer. We reduce the risk of this happening by starting a + * whole new time slice, and then quickly sending a SIGCONT signal + * right after detaching from the tracee. + * + * We use tkill to ensure that we only issue a wakeup for the thread being + * detached. Large multi threaded apps can take a long time in the kernel + * processing SIGCONT. + */ + long rc; + int err; + LSS_NAME(sched_yield)(); + rc = LSS_NAME(ptrace)(PTRACE_DETACH, pid, (void *)0, (void *)0); + err = LSS_ERRNO; + LSS_NAME(tkill)(pid, SIGCONT); + /* Old systems don't have tkill */ + if (LSS_ERRNO == ENOSYS) + LSS_NAME(kill)(pid, SIGCONT); + LSS_ERRNO = err; + return rc; + } + + LSS_INLINE int LSS_NAME(raise)(int sig) { + return LSS_NAME(kill)(LSS_NAME(getpid)(), sig); + } + + LSS_INLINE int LSS_NAME(setpgrp)(void) { + return LSS_NAME(setpgid)(0, 0); + } + + #if defined(__x86_64__) + /* Need to make sure loff_t isn't truncated to 32-bits under x32. */ + LSS_INLINE ssize_t LSS_NAME(pread64)(int f, void *b, size_t c, loff_t o) { + LSS_BODY(4, ssize_t, pread64, LSS_SYSCALL_ARG(f), LSS_SYSCALL_ARG(b), + LSS_SYSCALL_ARG(c), (uint64_t)(o)); + } + + LSS_INLINE ssize_t LSS_NAME(pwrite64)(int f, const void *b, size_t c, + loff_t o) { + LSS_BODY(4, ssize_t, pwrite64, LSS_SYSCALL_ARG(f), LSS_SYSCALL_ARG(b), + LSS_SYSCALL_ARG(c), (uint64_t)(o)); + } + + LSS_INLINE int LSS_NAME(readahead)(int f, loff_t o, size_t c) { + LSS_BODY(3, int, readahead, LSS_SYSCALL_ARG(f), (uint64_t)(o), + LSS_SYSCALL_ARG(c)); + } + #elif defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI64 + LSS_INLINE _syscall4(ssize_t, pread64, int, f, + void *, b, size_t, c, + loff_t, o) + LSS_INLINE _syscall4(ssize_t, pwrite64, int, f, + const void *, b, size_t, c, + loff_t, o) + LSS_INLINE _syscall3(int, readahead, int, f, + loff_t, o, unsigned, c) + #else + #define __NR__pread64 __NR_pread64 + #define __NR__pwrite64 __NR_pwrite64 + #define __NR__readahead __NR_readahead + #if defined(__ARM_EABI__) || defined(__mips__) + /* On ARM and MIPS, a 64-bit parameter has to be in an even-odd register + * pair. Hence these calls ignore their fourth argument (r3) so that their + * fifth and sixth make such a pair (r4,r5). + */ + #define LSS_LLARG_PAD 0, + LSS_INLINE _syscall6(ssize_t, _pread64, int, f, + void *, b, size_t, c, + unsigned, skip, unsigned, o1, unsigned, o2) + LSS_INLINE _syscall6(ssize_t, _pwrite64, int, f, + const void *, b, size_t, c, + unsigned, skip, unsigned, o1, unsigned, o2) + LSS_INLINE _syscall5(int, _readahead, int, f, + unsigned, skip, + unsigned, o1, unsigned, o2, size_t, c) + #else + #define LSS_LLARG_PAD + LSS_INLINE _syscall5(ssize_t, _pread64, int, f, + void *, b, size_t, c, unsigned, o1, + unsigned, o2) + LSS_INLINE _syscall5(ssize_t, _pwrite64, int, f, + const void *, b, size_t, c, unsigned, o1, + unsigned, o2) + LSS_INLINE _syscall4(int, _readahead, int, f, + unsigned, o1, unsigned, o2, size_t, c) + #endif + /* We force 64bit-wide parameters onto the stack, then access each + * 32-bit component individually. This guarantees that we build the + * correct parameters independent of the native byte-order of the + * underlying architecture. + */ + LSS_INLINE ssize_t LSS_NAME(pread64)(int fd, void *buf, size_t count, + loff_t off) { + union { loff_t off; unsigned arg[2]; } o = { off }; + return LSS_NAME(_pread64)(fd, buf, count, + LSS_LLARG_PAD o.arg[0], o.arg[1]); + } + LSS_INLINE ssize_t LSS_NAME(pwrite64)(int fd, const void *buf, + size_t count, loff_t off) { + union { loff_t off; unsigned arg[2]; } o = { off }; + return LSS_NAME(_pwrite64)(fd, buf, count, + LSS_LLARG_PAD o.arg[0], o.arg[1]); + } + LSS_INLINE int LSS_NAME(readahead)(int fd, loff_t off, size_t count) { + union { loff_t off; unsigned arg[2]; } o = { off }; + return LSS_NAME(_readahead)(fd, LSS_LLARG_PAD o.arg[0], o.arg[1], count); + } + #endif +#endif + +/* + * Polyfills for deprecated syscalls. + */ + +#if !defined(__NR_dup2) + LSS_INLINE int LSS_NAME(dup2)(int s, int d) { + return LSS_NAME(dup3)(s, d, 0); + } +#endif + +#if !defined(__NR_open) + LSS_INLINE int LSS_NAME(open)(const char *pathname, int flags, int mode) { + return LSS_NAME(openat)(AT_FDCWD, pathname, flags, mode); + } +#endif + +#if !defined(__NR_unlink) + LSS_INLINE int LSS_NAME(unlink)(const char *pathname) { + return LSS_NAME(unlinkat)(AT_FDCWD, pathname, 0); + } +#endif + +#if !defined(__NR_readlink) + LSS_INLINE int LSS_NAME(readlink)(const char *pathname, char *buffer, + size_t size) { + return LSS_NAME(readlinkat)(AT_FDCWD, pathname, buffer, size); + } +#endif + +#if !defined(__NR_pipe) + LSS_INLINE int LSS_NAME(pipe)(int *pipefd) { + return LSS_NAME(pipe2)(pipefd, 0); + } +#endif + +#if !defined(__NR_poll) + LSS_INLINE int LSS_NAME(poll)(struct kernel_pollfd *fds, unsigned int nfds, + int timeout) { + struct kernel_timespec timeout_ts; + struct kernel_timespec *timeout_ts_p = NULL; + + if (timeout >= 0) { + timeout_ts.tv_sec = timeout / 1000; + timeout_ts.tv_nsec = (timeout % 1000) * 1000000; + timeout_ts_p = &timeout_ts; + } + return LSS_NAME(ppoll)(fds, nfds, timeout_ts_p, NULL, 0); + } +#endif + +#if defined(__NR_statx) + /* copy the contents of kernel_statx to the kernel_stat structure. */ + LSS_INLINE void LSS_NAME(cp_stat_statx)(struct kernel_stat *to, + struct kernel_statx *from) { + memset(to, 0, sizeof(struct kernel_stat)); + to->st_dev = (kernel_dev_t)((from->stx_dev_minor & 0xff) | + ((from->stx_dev_major & 0xfff) << 8) | + ((from->stx_dev_minor & ~0xffu) << 12)); + to->st_rdev = (kernel_dev_t)((from->stx_rdev_minor & 0xff) | + ((from->stx_rdev_major & 0xfff) << 8) | + ((from->stx_rdev_minor & ~0xffu) << 12)); + to->st_ino = (kernel_ino_t)from->stx_ino; + to->st_mode = (kernel_mode_t)from->stx_mode; + to->st_nlink = (kernel_nlink_t)from->stx_nlink; + to->st_uid = (kernel_uid_t)from->stx_uid; + to->st_gid = (kernel_gid_t)from->stx_gid; + to->st_atime_ = (kernel_time_t)(from->stx_atime.tv_sec); + to->st_atime_nsec_ = from->stx_atime.tv_nsec; + to->st_mtime_ = (kernel_time_t)(from->stx_mtime.tv_sec); + to->st_mtime_nsec_ = from->stx_mtime.tv_nsec; + to->st_ctime_ = (kernel_time_t)(from->stx_ctime.tv_sec); + to->st_ctime_nsec_ = from->stx_ctime.tv_nsec; + to->st_size = (kernel_off_t)(from->stx_size); + to->st_blocks = (kernel_blkcnt_t)(from->stx_blocks); + to->st_blksize = (kernel_blksize_t)from->stx_blksize; + } +#endif + +#if !defined(__NR_fstat) + LSS_INLINE int LSS_NAME(fstat)(int fd, + struct kernel_stat *buf) { + #if defined(__NR_newfstatat) + return LSS_NAME(newfstatat)(fd, "", buf, AT_EMPTY_PATH); + #elif defined(__NR_statx) + struct kernel_statx stx; + int flags = AT_NO_AUTOMOUNT | AT_EMPTY_PATH; + int mask = STATX_BASIC_STATS; + int res = LSS_NAME(statx)(fd, "", flags, mask, &stx); + LSS_NAME(cp_stat_statx)(buf, &stx); + return res; + #endif + } +#endif + +#if !defined(__NR_stat) + LSS_INLINE int LSS_NAME(stat)(const char *pathname, + struct kernel_stat *buf) { + #if defined(__NR_newfstatat) + return LSS_NAME(newfstatat)(AT_FDCWD, pathname, buf, 0); + #elif defined(__NR_statx) + struct kernel_statx stx; + int flags = AT_NO_AUTOMOUNT | AT_STATX_SYNC_AS_STAT; + int mask = STATX_BASIC_STATS; + int res = LSS_NAME(statx)(AT_FDCWD, pathname, flags, mask, &stx); + LSS_NAME(cp_stat_statx)(buf, &stx); + return res; + #endif + } +#endif + +#if !defined(__NR_lstat) + LSS_INLINE int LSS_NAME(lstat)(const char *pathname, + struct kernel_stat *buf) { + #if defined(__NR_newfstatat) + return LSS_NAME(newfstatat)(AT_FDCWD, pathname, buf, AT_SYMLINK_NOFOLLOW); + #elif defined(__NR_statx) + struct kernel_statx stx; + int flags = AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW; + int mask = STATX_BASIC_STATS; + int res = LSS_NAME(statx)(AT_FDCWD, pathname, flags, mask, &stx); + LSS_NAME(cp_stat_statx)(buf, &stx); + return res; + #endif + } +#endif + +#if !defined(__NR_waitpid) + LSS_INLINE pid_t LSS_NAME(waitpid)(pid_t pid, int *status, int options) { + return LSS_NAME(wait4)(pid, status, options, 0); + } +#endif + +#if !defined(__NR_fork) +// TODO: define this in an arch-independant way instead of inlining the clone +// syscall body. + +# if defined(__aarch64__) || defined(__riscv) || defined(__loongarch_lp64) + LSS_INLINE pid_t LSS_NAME(fork)(void) { + // No fork syscall on aarch64 - implement by means of the clone syscall. + // Note that this does not reset glibc's cached view of the PID/TID, so + // some glibc interfaces might go wrong in the forked subprocess. + int flags = SIGCHLD; + void *child_stack = NULL; + void *parent_tidptr = NULL; + void *newtls = NULL; + void *child_tidptr = NULL; + + LSS_REG(0, flags); + LSS_REG(1, child_stack); + LSS_REG(2, parent_tidptr); + LSS_REG(3, newtls); + LSS_REG(4, child_tidptr); + LSS_BODY(pid_t, clone, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), + "r"(__r4)); + } +# elif defined(__x86_64__) + LSS_INLINE pid_t LSS_NAME(fork)(void) { + // Android disallows the fork syscall on x86_64 - implement by means of the + // clone syscall as above for aarch64. + int flags = SIGCHLD; + void *child_stack = NULL; + void *parent_tidptr = NULL; + void *newtls = NULL; + void *child_tidptr = NULL; + + LSS_BODY(5, pid_t, clone, LSS_SYSCALL_ARG(flags), + LSS_SYSCALL_ARG(child_stack), LSS_SYSCALL_ARG(parent_tidptr), + LSS_SYSCALL_ARG(newtls), LSS_SYSCALL_ARG(child_tidptr)); + } +# else +# error missing fork polyfill for this architecture +# endif +#endif + +/* These restore the original values of these macros saved by the + * corresponding #pragma push_macro near the top of this file. */ +#pragma pop_macro("stat64") +#pragma pop_macro("fstat64") +#pragma pop_macro("lstat64") +#pragma pop_macro("pread64") +#pragma pop_macro("pwrite64") +#pragma pop_macro("getdents64") + +#if defined(__cplusplus) && !defined(SYS_CPLUSPLUS) +} +#endif + +#endif +#endif diff --git a/src/third_party/lss/tests/.gitignore b/src/third_party/lss/tests/.gitignore new file mode 100644 index 0000000..89c5d3c --- /dev/null +++ b/src/third_party/lss/tests/.gitignore @@ -0,0 +1,4 @@ +/*_test + +# Some tests create temp files. +/tempfile.* diff --git a/src/third_party/lss/tests/Makefile b/src/third_party/lss/tests/Makefile new file mode 100644 index 0000000..a4e2f38 --- /dev/null +++ b/src/third_party/lss/tests/Makefile @@ -0,0 +1,147 @@ +# Copyright 2018 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +top_srcdir ?= .. + +DEF_FLAGS = -g -pipe +DEF_WFLAGS = -Wall +CFLAGS ?= $(DEF_FLAGS) +CXXFLAGS ?= $(DEF_FLAGS) +CFLAGS += $(DEF_WFLAGS) -Wstrict-prototypes +CXXFLAGS += $(DEF_WFLAGS) +CPPFLAGS += -I$(top_srcdir) +# We use static linking here so that if people run through qemu/etc... by hand, +# it's a lot easier to run/debug. Same for strace output. +LDFLAGS += -static + +TESTS = \ + fallocate \ + getitimer \ + getrandom \ + lstat \ + setitimer \ + sigaction \ + sigtimedwait \ + stat \ + unlink \ + +all: check + +%_test: %.c test_skel.h $(top_srcdir)/linux_syscall_support.h + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< + +# Force building C as C++ code to improve compile-time coverage. +%_cc_test: %.c test_skel.h $(top_srcdir)/linux_syscall_support.h + $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< + +%_test: %.cc test_skel.h $(top_srcdir)/linux_syscall_support.h + $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< + +%_run: %_test + @t=$(@:_run=_test); \ + echo "./$$t"; \ + env -i ./$$t; \ + exit_status=$$?; \ + if [ $$exit_status = 77 ]; then \ + echo "SKIP: $$t"; \ + elif [ $$exit_status != 0 ]; then \ + echo "FAIL: $$t"; \ + env -i strace -f -v ./$$t; \ + echo "TRY: gdb -q -ex r -ex bt ./$$t"; \ + exit 1; \ + fi + +ALL_TEST_TARGETS = $(TESTS:=_test) $(TESTS:=_cc_test) +compile_tests: $(ALL_TEST_TARGETS) + +ALL_RUN_TARGETS = $(TESTS:=_run) $(TESTS:=_cc_run) +check: $(ALL_RUN_TARGETS) + +# The "tempfile" targets are the names we use with temp files. +# Clean them out in case some tests crashed in the middle. +clean: + rm -f *~ *.o tempfile.* a.out core $(ALL_TEST_TARGETS) + +.SUFFIXES: +.PHONY: all check clean compile_tests +.SECONDARY: $(ALL_TEST_TARGETS) + +# Try to cross-compile the tests for all our supported arches. We test with +# both gcc and clang. We don't support execution (yet?), but just compiling +# & linking helps catch common bugs. +.PHONY: cross compile_cross +cross_compile: + @echo "Running: $(MAKE) $@ CC='$(CC)' CXX='$(CXX)'"; \ + if (echo '#include ' | $(CC) -x c -c -o /dev/null -) 2>/dev/null; then \ + $(MAKE) -s clean; \ + $(MAKE) -k --no-print-directory compile_tests; \ + else \ + echo "Skipping $(CC) test: not installed"; \ + fi; \ + echo + +# The names here are a best effort. Not easy to probe for. +cross: + @for cc in \ + "x86_64-pc-linux-gnu-gcc" \ + "i686-pc-linux-gnu-gcc" \ + "x86_64-pc-linux-gnu-gcc -mx32" \ + "armv7a-unknown-linux-gnueabi-gcc -marm -mhard-float" \ + "armv7a-unknown-linux-gnueabi-gcc -mthumb -mhard-float" \ + "powerpc-unknown-linux-gnu-gcc" \ + "aarch64-unknown-linux-gnu-gcc" \ + "mips64-unknown-linux-gnu-gcc -mabi=64" \ + "mips64-unknown-linux-gnu-gcc -mabi=32" \ + "mips64-unknown-linux-gnu-gcc -mabi=n32" \ + "s390-ibm-linux-gnu-gcc" \ + "s390x-ibm-linux-gnu-gcc" \ + "loongarch64-unknown-linux-gnu-gcc" \ + ; do \ + cxx=`echo "$$cc" | sed 's:-gcc:-g++:'`; \ + $(MAKE) --no-print-directory CC="$$cc" CXX="$$cxx" cross_compile; \ + \ + sysroot=`$$cc --print-sysroot 2>/dev/null`; \ + gccdir=`$$cc -print-file-name=libgcc.a 2>/dev/null`; \ + gccdir=`dirname "$$gccdir"`; \ + : Skip building for clang for mips/o32 and s390/31-bit until it works.; \ + case $$cc in \ + mips64*-mabi=32) continue;; \ + s390-*) continue;; \ + esac; \ + set -- $$cc; \ + tuple=$${1%-gcc}; \ + shift; \ + cc="clang -target $$tuple $$*"; \ + : Assume the build system is x86_64 based, so ignore the sysroot.; \ + case $$tuple in \ + x86_64*) ;; \ + *) cc="$$cc --sysroot $$sysroot -B$$gccdir -L$$gccdir";; \ + esac; \ + cxx=`echo "$$cc" | sed 's:^clang:clang++:'`; \ + $(MAKE) --no-print-directory CC="$$cc" CXX="$$cxx" cross_compile; \ + done diff --git a/src/third_party/lss/tests/README.md b/src/third_party/lss/tests/README.md new file mode 100644 index 0000000..45af3c3 --- /dev/null +++ b/src/third_party/lss/tests/README.md @@ -0,0 +1,52 @@ +# LSS Tests + +## Source Layout + +The general layout of the tests: +* [test_skel.h]: Test helpers for common checks/etc... +* xxx.c: Unittest for the xxx syscall (e.g. `open.c`). +* [Makefile]: New tests should be registered in the `TESTS` variable. + +## Test Guidelines + +The unittest itself generally follows the conventions: +* Written in C (unless a very specific language behavior is needed). +* You should only need to `#include "test_skel.h"`. For new system headers, try + to add them here rather than copying to exact unittest (if possible). + It might slow compilation down slightly, but makes the code easier to manage. + Make sure it is included first. +* Use `assert()` on everything to check return values. +* Use `sys_xxx()` to access the syscall via LSS (compared to `xxx()` which tends + to come from the C library). +* If you need a tempfile, use `tempfile.XXXXXX` for templates with helpers like + `mkstemp`. Try to clean them up when you're done with them. + These will be created in the cwd, but that's fine. +* Don't worry about trying to verify the kernel/C library API and various edge + cases. The goal of LSS is to make sure that we pass args along correctly to + the syscall only. +* Make sure to leave comments in the test so it's clear what behavior you're + trying to verify (and how). + +Feel free to extend [test_skel.h] with more helpers if they're useful to more +than one test. + +If you're looking for a simple example, start with [unlink.c](./unlink.c). +You should be able to copy this over and replace the content of `main()`. + +## Running The Tests + +Simply run `make`. This will compile & execute all the tests on your local +system. A standard `make clean` will clean up all the objects. + +If you need to debug something, then the programs are simply named `xxx_test` +and can easily be thrown into `gdb ./xxx_test`. + +We have rudimentary cross-compile testing via gcc and clang. Try running +`make cross` -- for any toolchains you don't have available, it should skip +things automatically. This only verifies the compilation & linking stages +though. + +The cross-compilers can be created using . + +[Makefile]: ./Makefile +[test_skel.h]: ./test_skel.h diff --git a/src/third_party/lss/tests/fallocate.c b/src/third_party/lss/tests/fallocate.c new file mode 100644 index 0000000..1a26fed --- /dev/null +++ b/src/third_party/lss/tests/fallocate.c @@ -0,0 +1,69 @@ +/* Copyright 2019 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + int fd = 0, mode = 0; + loff_t offset = 0, len = 0; + + // Bad file descriptor. + fd = -1; + assert(sys_fallocate(fd, mode, offset, len) == -1); + assert(errno == EBADF); + + char filename[] = "tempfile.XXXXXX"; + fd = mkstemp(filename); + assert(fd >= 0); + + // Invalid len. + assert(sys_fallocate(fd, mode, offset, len) == -1); + assert(errno == EINVAL); + + // Small offset and length succeeds. + len = 4096; + assert(sys_fallocate(fd, mode, offset, len) == 0); + + // Large offset succeeds and isn't truncated. + offset = 1llu + UINT32_MAX; + assert(sys_fallocate(fd, mode , offset, len) == 0); + +#if defined(__NR_fstat64) + struct kernel_stat64 st; + assert(sys_fstat64(fd, &st) == 0); +#else + struct kernel_stat st; + assert(sys_fstat(fd, &st) == 0); +#endif + assert(st.st_size == offset + len); + + sys_unlink(filename); + + return 0; +} diff --git a/src/third_party/lss/tests/getitimer.c b/src/third_party/lss/tests/getitimer.c new file mode 100644 index 0000000..860538a --- /dev/null +++ b/src/third_party/lss/tests/getitimer.c @@ -0,0 +1,84 @@ +/* Copyright 2022 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + // We need an invalid timer value. The assert()'s below should + // be static asserts but it is not available in older C versions. +#define kInvalidTimer 9999 + assert(kInvalidTimer != ITIMER_REAL); + assert(kInvalidTimer != ITIMER_VIRTUAL); + assert(kInvalidTimer != ITIMER_PROF); + + // This should fail with EINVAL. + struct kernel_itimerval curr_itimer; + assert(sys_getitimer(kInvalidTimer, &curr_itimer) == -1); + assert(errno == EINVAL); + + // Create a read-only page. + size_t page_size = getpagesize(); + void* read_only_page = sys_mmap(NULL, page_size, PROT_READ, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + assert(read_only_page != MAP_FAILED); + + // This should fail with EFAULT. + assert(sys_getitimer(ITIMER_REAL, + (struct kernel_itimerval*) read_only_page) == -1); + assert(errno == EFAULT); + + // This should complete without an error. + assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0); + + // Set up a real time timer with very long interval and value so that + // we do not need to handle SIGALARM in test. + struct kernel_itimerval new_itimer; + const time_t kIntervalSec = 60 * 60 * 24 * 365; // One year. + const long kIntervalUSec = 123; + new_itimer.it_interval.tv_sec = kIntervalSec; + new_itimer.it_interval.tv_usec = kIntervalUSec; + new_itimer.it_value = new_itimer.it_interval; + assert(sys_setitimer(ITIMER_REAL, &new_itimer, NULL) == 0); + + assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0); + assert(kernel_timeval_eq(&curr_itimer.it_interval, &new_itimer.it_interval)); + + // Disable timer. + struct kernel_itimerval empty_itimer; + empty_itimer.it_interval.tv_sec = 0; + empty_itimer.it_interval.tv_usec = 0; + empty_itimer.it_value = empty_itimer.it_interval; + assert(sys_setitimer(ITIMER_REAL, &empty_itimer, NULL) == 0); + + // We should read back an empty itimer. + assert(sys_getitimer(ITIMER_REAL, &curr_itimer) == 0); + assert(kernel_itimerval_eq(&curr_itimer, &empty_itimer)); + + return 0; +} diff --git a/src/third_party/lss/tests/getrandom.c b/src/third_party/lss/tests/getrandom.c new file mode 100644 index 0000000..0ec38b3 --- /dev/null +++ b/src/third_party/lss/tests/getrandom.c @@ -0,0 +1,59 @@ +/* Copyright 2020 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +#define BUFFER_SIZE 256 + +int main(int argc, char *argv[]) { + char buffer[BUFFER_SIZE]; + // Zero it out so we can check later that it's at least not all 0s. + memset(buffer, 0, BUFFER_SIZE); + bool buffer_contains_all_zeros = true; + + // Don't bother passing any flags. (If we're using lss, we might not have the + // right header files with the flags defined anyway, and we'd have to copy + // this in here too, and risk getting out of sync in yet another way.) + const ssize_t r = sys_getrandom(buffer, BUFFER_SIZE, 0); + + // Make sure it either worked, or that it's just not supported. + assert(r == BUFFER_SIZE || errno == ENOSYS); + + if (r == BUFFER_SIZE) { + // If all the bytes are 0, it didn't really work. + for (size_t i = 0; i < BUFFER_SIZE; ++i) { + if (buffer[i] != 0) { + buffer_contains_all_zeros = false; + } + } + assert(!buffer_contains_all_zeros); + } + + return 0; +} diff --git a/src/third_party/lss/tests/lstat.c b/src/third_party/lss/tests/lstat.c new file mode 100644 index 0000000..816ba9f --- /dev/null +++ b/src/third_party/lss/tests/lstat.c @@ -0,0 +1,97 @@ +/* Copyright 2021 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + int exit_status = 0; + + // Get two unique paths to play with. + char foo[] = "tempfile.XXXXXX"; + char bar[] = "tempfile.XXXXXX"; + int fd_foo = mkstemp(foo); + int fd_bar = mkstemp(bar); + assert(fd_foo != -1); + assert(fd_bar != -1); + + // Then delete foo. + assert(sys_unlink(foo) == 0); + + // Now make foo a symlink to bar. + assert(symlink(bar, foo) == 0); + + // Make sure sys_stat() and sys_lstat() implementation return different + // information. + + // We need to check our stat syscalls for EOVERFLOW, as sometimes the integer + // types used in the stat structures are too small to fit the actual value. + // E.g. on some systems st_ino is 32-bit, but some filesystems have 64-bit + // inodes. + + struct kernel_stat lstat_info; + int rc = sys_lstat(foo, &lstat_info); + if (rc < 0 && errno == EOVERFLOW) { + // Bail out since we had an overflow in the stat structure. + exit_status = SKIP_TEST_EXIT_STATUS; + goto cleanup; + } + assert(rc == 0); + + struct kernel_stat stat_info; + rc = sys_stat(foo, &stat_info); + if (rc < 0 && errno == EOVERFLOW) { + // Bail out since we had an overflow in the stat structure. + exit_status = SKIP_TEST_EXIT_STATUS; + goto cleanup; + } + assert(rc == 0); + + struct kernel_stat bar_stat_info; + rc = sys_stat(bar, &bar_stat_info); + if (rc < 0 && errno == EOVERFLOW) { + // Bail out since we had an overflow in the stat structure. + exit_status = SKIP_TEST_EXIT_STATUS; + goto cleanup; + } + assert(rc == 0); + + // lstat should produce information about a symlink. + assert((lstat_info.st_mode & S_IFMT) == S_IFLNK); + + // stat-ing foo and bar should produce the same inode. + assert(stat_info.st_ino == bar_stat_info.st_ino); + + // lstat-ing foo should give a different inode than stat-ing foo. + assert(stat_info.st_ino != lstat_info.st_ino); + +cleanup: + sys_unlink(foo); + sys_unlink(bar); + return exit_status; +} diff --git a/src/third_party/lss/tests/setitimer.c b/src/third_party/lss/tests/setitimer.c new file mode 100644 index 0000000..dd2ccfe --- /dev/null +++ b/src/third_party/lss/tests/setitimer.c @@ -0,0 +1,90 @@ +/* Copyright 2022 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + // We need an invalid timer value. The assert()'s below should + // be static asserts but it is not avalible in older C versions. +#define kInvalidTimer 9999 + assert(kInvalidTimer != ITIMER_REAL); + assert(kInvalidTimer != ITIMER_VIRTUAL); + assert(kInvalidTimer != ITIMER_PROF); + + // Invalid timer returns EINVAL. + assert(sys_setitimer(kInvalidTimer, NULL, NULL) == -1); + assert(errno == EINVAL); + + const int kSignal = SIGALRM; + const size_t kSigsetSize = sizeof(struct kernel_sigset_t); + + // Block SIGALRM. + struct kernel_sigset_t sigalarm_only; + struct kernel_sigset_t old_sigset; + assert(sys_sigemptyset(&sigalarm_only) == 0); + assert(sys_sigaddset(&sigalarm_only, kSignal) == 0); + assert(sys_rt_sigprocmask(SIG_BLOCK, &sigalarm_only, &old_sigset, + kSigsetSize) == 0); + + // Set up a real time timer. + struct kernel_itimerval new_itimer = {}; + const long kIntervalUSec = 123; + new_itimer.it_interval.tv_sec = 0; + new_itimer.it_interval.tv_usec = kIntervalUSec; + new_itimer.it_value = new_itimer.it_interval; + assert(sys_setitimer(ITIMER_REAL, &new_itimer, NULL) == 0); + + // Wait for alarm. + struct timespec timeout; + const unsigned long kNanoSecsPerSec = 1000000000; + const unsigned long kNanoSecsPerMicroSec = 1000; + + // Use a timeout 3 times of the timer interval. + unsigned long duration_ns = kIntervalUSec * kNanoSecsPerMicroSec * 3; + timeout.tv_sec = duration_ns / kNanoSecsPerSec ; + timeout.tv_nsec = duration_ns % kNanoSecsPerSec; + + int sig; + do { + sig = sys_sigtimedwait(&sigalarm_only, NULL, &timeout); + } while (sig == -1 && errno == EINTR); + assert(sig == kSignal); + + // Disable timer, check saving of old timer value. + struct kernel_itimerval empty_itimer = {}; + struct kernel_itimerval old_itimer; + empty_itimer.it_interval.tv_sec = 0; + empty_itimer.it_interval.tv_usec = 0; + empty_itimer.it_value = empty_itimer.it_interval; + + assert(sys_setitimer(ITIMER_REAL, &empty_itimer, &old_itimer) == 0); + assert(kernel_timeval_eq(&old_itimer.it_interval, &new_itimer.it_interval)); + + return 0; +} diff --git a/src/third_party/lss/tests/sigaction.c b/src/third_party/lss/tests/sigaction.c new file mode 100644 index 0000000..db3658f --- /dev/null +++ b/src/third_party/lss/tests/sigaction.c @@ -0,0 +1,54 @@ +/* Copyright 2020 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +void test_handler(int sig) {} + +int main(int argc, char *argv[]) { + const size_t kSigsetSize = sizeof(struct kernel_sigset_t); + struct kernel_sigaction action = {}; + // Invalid signal returns EINVAL. + assert(sys_rt_sigaction(SIGKILL, &action, NULL, kSigsetSize) == -1); + assert(errno == EINVAL); + + // Set an action. + action.sa_handler_ = test_handler; + action.sa_flags = SA_SIGINFO; + assert(sys_sigemptyset(&action.sa_mask) == 0); + assert(sys_sigaddset(&action.sa_mask, SIGPIPE) == 0); + assert(sys_rt_sigaction(SIGSEGV, &action, NULL, kSigsetSize) == 0); + + // Retrieve the action. + struct kernel_sigaction old_action = {}; + assert(sys_rt_sigaction(SIGSEGV, NULL, &old_action, kSigsetSize) == 0); + assert(memcmp(&action, &old_action, sizeof(action)) == 0); + + return 0; +} diff --git a/src/third_party/lss/tests/sigtimedwait.c b/src/third_party/lss/tests/sigtimedwait.c new file mode 100644 index 0000000..d56d304 --- /dev/null +++ b/src/third_party/lss/tests/sigtimedwait.c @@ -0,0 +1,58 @@ +/* Copyright 2019 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + + struct kernel_sigset_t sigset = {}; + siginfo_t siginfo = {}; + struct timespec timeout = {}; + + // Invalid timeouts. + timeout.tv_sec = -1; + assert(sys_sigtimedwait(&sigset, &siginfo, &timeout) == -1); + assert(errno == EINVAL); + + // Expired timeouts. + timeout.tv_sec = 0; + assert(sys_sigtimedwait(&sigset, &siginfo, &timeout) == -1); + assert(errno == EAGAIN); + + // Success. + const int kTestSignal = SIGCONT; + assert(sys_sigemptyset(&sigset) == 0); + assert(sys_sigaddset(&sigset, kTestSignal) == 0); + assert(sys_sigprocmask(SIG_BLOCK, &sigset, NULL) == 0); + assert(raise(kTestSignal) == 0); + assert(sys_sigtimedwait(&sigset, &siginfo, &timeout) == kTestSignal); + assert(siginfo.si_signo == kTestSignal); + + return 0; +} diff --git a/src/third_party/lss/tests/stat.c b/src/third_party/lss/tests/stat.c new file mode 100644 index 0000000..5ae6685 --- /dev/null +++ b/src/third_party/lss/tests/stat.c @@ -0,0 +1,67 @@ +/* Copyright 2021 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + int exit_status = 0; + + // Get two unique paths to play with. + char foo[] = "tempfile.XXXXXX"; + int fd_foo = mkstemp(foo); + assert(fd_foo != -1); + + // Make sure it exists. + assert(access(foo, F_OK) == 0); + + // Make sure sys_stat() and a libc stat() implementation return the same + // information. + struct stat libc_stat; + assert(stat(foo, &libc_stat) == 0); + + struct kernel_stat raw_stat; + // We need to check our stat syscall for EOVERFLOW, as sometimes the integer + // types used in the stat structures are too small to fit the actual value. + // E.g. on some systems st_ino is 32-bit, but some filesystems have 64-bit + // inodes. + int rc = sys_stat(foo, &raw_stat); + if (rc < 0 && errno == EOVERFLOW) { + // Bail out since we had an overflow in the stat structure. + exit_status = SKIP_TEST_EXIT_STATUS; + goto cleanup; + } + assert(rc == 0); + + assert(libc_stat.st_ino == raw_stat.st_ino); + + +cleanup: + sys_unlink(foo); + return exit_status; +} diff --git a/src/third_party/lss/tests/test_skel.h b/src/third_party/lss/tests/test_skel.h new file mode 100644 index 0000000..89077c9 --- /dev/null +++ b/src/third_party/lss/tests/test_skel.h @@ -0,0 +1,89 @@ +/* Copyright 2018 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Make sure it's defined before including anything else. A number of syscalls + * are GNU extensions and rely on being exported by glibc. + */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +/* + * Make sure the assert checks aren't removed as all the unittests are based + * on them. + */ +#undef NDEBUG + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "linux_syscall_support.h" + +#define SKIP_TEST_EXIT_STATUS 77 + +void assert_buffers_eq_len(const void *buf1, const void *buf2, size_t len) { + const uint8_t *u8_1 = (const uint8_t *)buf1; + const uint8_t *u8_2 = (const uint8_t *)buf2; + size_t i; + + for (i = 0; i < len; ++i) { + if (u8_1[i] != u8_2[i]) + printf("offset %zu: %02x != %02x\n", i, u8_1[i], u8_2[i]); + } +} +#define assert_buffers_eq(obj1, obj2) assert_buffers_eq_len(obj1, obj2, sizeof(*obj1)) + +// Returns true iff pointed timevals are equal. +static inline bool kernel_timeval_eq(const struct kernel_timeval* lhs, + const struct kernel_timeval* rhs) { + return (lhs->tv_sec == rhs->tv_sec) && (lhs->tv_usec == rhs->tv_usec); +} + +// Returns true iff pointed itimervals are equal. +static inline bool kernel_itimerval_eq(const struct kernel_itimerval* lhs, + const struct kernel_itimerval* rhs) { + return kernel_timeval_eq(&lhs->it_interval, &rhs->it_interval) && + kernel_timeval_eq(&lhs->it_value, &rhs->it_value); +} + diff --git a/src/third_party/lss/tests/unlink.c b/src/third_party/lss/tests/unlink.c new file mode 100644 index 0000000..191e367 --- /dev/null +++ b/src/third_party/lss/tests/unlink.c @@ -0,0 +1,48 @@ +/* Copyright 2018 Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + // Get a unique path to play with. + char foo[] = "tempfile.XXXXXX"; + int fd = mkstemp(foo); + assert(fd != -1); + + // Make sure it exists. + assert(access(foo, F_OK) == 0); + + // Then delete it. + assert(sys_unlink(foo) == 0); + + // Make sure it's gone. + assert(access(foo, F_OK) != 0); + + return 0; +} diff --git a/src/third_party/mac_headers/README b/src/third_party/mac_headers/README new file mode 100644 index 0000000..2b855b6 --- /dev/null +++ b/src/third_party/mac_headers/README @@ -0,0 +1,25 @@ +These headers were copied to enable building the Mac dump_syms code that +processes Mach-O files on Linux. + +From xnu-8792.41.9 (https://github.com/apple-oss-distributions/xnu at 5c2921b) +i386/_types.h +arm/_types.h +mach/boolean.h +mach/machine.h +mach/thread_status.h +mach/vm_prot.h +mach/i386/boolean.h +mach/i386/vm_types.h +mach/arm/boolean.h +mach/arm/vm_types.h +mach/machine/boolean.h +mach/machine/vm_types.h + +From cctools-986 (https://github.com/apple-oss-distributions/cctools at cbe977a) +mach-o/arch.h +mach-o/fat.h +mach-o/loader.h +mach-o/nlist.h + +From architecture-282 (https://github.com/apple-oss-distributions/architecture at fe86900) +architecture/byte_order.h diff --git a/src/third_party/mac_headers/architecture/byte_order.h b/src/third_party/mac_headers/architecture/byte_order.h new file mode 100644 index 0000000..1f723ae --- /dev/null +++ b/src/third_party/mac_headers/architecture/byte_order.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 1999-2008 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1992 NeXT Computer, Inc. + * + * Byte ordering conversion. + * + */ + +#ifndef _ARCHITECTURE_BYTE_ORDER_H_ +#define _ARCHITECTURE_BYTE_ORDER_H_ + +enum NXByteOrder { + NX_UnknownByteOrder, + NX_LittleEndian, + NX_BigEndian +}; + +#endif /* _ARCHITECTURE_BYTE_ORDER_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/arm/_types.h b/src/third_party/mac_headers/arm/_types.h new file mode 100644 index 0000000..f464d6b --- /dev/null +++ b/src/third_party/mac_headers/arm/_types.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2000-2007 Apple Inc. All rights reserved. + */ +#ifndef _BSD_ARM__TYPES_H_ +#define _BSD_ARM__TYPES_H_ + +#if defined (__arm__) || defined (__arm64__) || defined (__aarch64__) + + +typedef long __darwin_intptr_t; +typedef unsigned int __darwin_natural_t; + + +#endif /* defined (__arm__) || defined (__arm64__) || defined (__aarch64__) */ + +#endif /* _BSD_ARM__TYPES_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/i386/_types.h b/src/third_party/mac_headers/i386/_types.h new file mode 100644 index 0000000..c0478d3 --- /dev/null +++ b/src/third_party/mac_headers/i386/_types.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +#ifndef _BSD_I386__TYPES_H_ +#define _BSD_I386__TYPES_H_ + +#if defined (__i386__) || defined (__x86_64__) + +typedef long __darwin_intptr_t; +typedef unsigned int __darwin_natural_t; + +#endif /* defined (__i386__) || defined (__x86_64__) */ + +#endif /* _BSD_I386__TYPES_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach-o/arch.h b/src/third_party/mac_headers/mach-o/arch.h new file mode 100644 index 0000000..29b81c5 --- /dev/null +++ b/src/third_party/mac_headers/mach-o/arch.h @@ -0,0 +1,150 @@ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _MACH_O_ARCH_H_ +#define _MACH_O_ARCH_H_ +/* + * Copyright (c) 1997 Apple Computer, Inc. + * + * Functions that deal with information about architectures. + * + */ + +#include +#include +#include + +/* The NXArchInfo structs contain the architectures symbolic name + * (such as "ppc"), its CPU type and CPU subtype as defined in + * mach/machine.h, the byte order for the architecture, and a + * describing string (such as "PowerPC"). + * There will both be entries for specific CPUs (such as ppc604e) as + * well as generic "family" entries (such as ppc). + */ +typedef struct { + const char *name; + cpu_type_t cputype; + cpu_subtype_t cpusubtype; + enum NXByteOrder byteorder; + const char *description; +} NXArchInfo; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* NXGetAllArchInfos() returns a pointer to an array of all known + * NXArchInfo structures. The last NXArchInfo is marked by a NULL name. + */ +extern const NXArchInfo *NXGetAllArchInfos(void); + +/* NXGetLocalArchInfo() returns the NXArchInfo for the local host, or NULL + * if none is known. + */ +extern const NXArchInfo *NXGetLocalArchInfo(void); + +/* NXGetArchInfoFromName() and NXGetArchInfoFromCpuType() return the + * NXArchInfo from the architecture's name or cputype/cpusubtype + * combination. A cpusubtype of CPU_SUBTYPE_MULTIPLE can be used + * to request the most general NXArchInfo known for the given cputype. + * NULL is returned if no matching NXArchInfo can be found. + */ +extern const NXArchInfo *NXGetArchInfoFromName(const char *name); +extern const NXArchInfo *NXGetArchInfoFromCpuType(cpu_type_t cputype, + cpu_subtype_t cpusubtype); + +/* The above interfaces that return pointers to NXArchInfo structs in normal + * cases returns a pointer from the array returned in NXGetAllArchInfos(). + * In some cases when the cputype is CPU_TYPE_I386 or CPU_TYPE_POWERPC it will + * retun malloc(3)'ed NXArchInfo struct which contains a string in the + * description field also a malloc(3)'ed pointer. To allow programs not to + * leak memory they can call NXFreeArchInfo() on pointers returned from the + * above interfaces. Since this is a new API on older systems can use the + * code below. Going forward the above interfaces will only return pointers + * from the array returned in NXGetAllArchInfos(). + */ +extern void NXFreeArchInfo(const NXArchInfo *x); + +/* The code that can be used for NXFreeArchInfo() when it is not available is: + * + * static void NXFreeArchInfo( + * const NXArchInfo *x) + * { + * const NXArchInfo *p; + * + * p = NXGetAllArchInfos(); + * while(p->name != NULL){ + * if(x == p) + * return; + * p++; + * } + * free((char *)x->description); + * free((NXArchInfo *)x); + * } + */ + +/* NXFindBestFatArch() is passed a cputype and cpusubtype and a set of + * fat_arch structs and selects the best one that matches (if any) and returns + * a pointer to that fat_arch struct (or NULL). The fat_arch structs must be + * in the host byte order and correct such that the fat_archs really points to + * enough memory for nfat_arch structs. It is possible that this routine could + * fail if new cputypes or cpusubtypes are added and an old version of this + * routine is used. But if there is an exact match between the cputype and + * cpusubtype and one of the fat_arch structs this routine will always succeed. + */ +extern struct fat_arch *NXFindBestFatArch(cpu_type_t cputype, + cpu_subtype_t cpusubtype, + struct fat_arch *fat_archs, + uint32_t nfat_archs); + +/* NXFindBestFatArch_64() is passed a cputype and cpusubtype and a set of + * fat_arch_64 structs and selects the best one that matches (if any) and + * returns a pointer to that fat_arch_64 struct (or NULL). The fat_arch_64 + * structs must be in the host byte order and correct such that the fat_archs64 + * really points to enough memory for nfat_arch structs. It is possible that + * this routine could fail if new cputypes or cpusubtypes are added and an old + * version of this routine is used. But if there is an exact match between the + * cputype and cpusubtype and one of the fat_arch_64 structs this routine will + * always succeed. + */ +extern struct fat_arch_64 *NXFindBestFatArch_64(cpu_type_t cputype, + cpu_subtype_t cpusubtype, + struct fat_arch_64 *fat_archs64, + uint32_t nfat_archs); + +/* NXCombineCpuSubtypes() returns the resulting cpusubtype when combining two + * different cpusubtypes for the specified cputype. If the two cpusubtypes + * can't be combined (the specific subtypes are mutually exclusive) -1 is + * returned indicating it is an error to combine them. This can also fail and + * return -1 if new cputypes or cpusubtypes are added and an old version of + * this routine is used. But if the cpusubtypes are the same they can always + * be combined and this routine will return the cpusubtype pass in. + */ +extern cpu_subtype_t NXCombineCpuSubtypes(cpu_type_t cputype, + cpu_subtype_t cpusubtype1, + cpu_subtype_t cpusubtype2); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _MACH_O_ARCH_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach-o/fat.h b/src/third_party/mac_headers/mach-o/fat.h new file mode 100644 index 0000000..0e5927d --- /dev/null +++ b/src/third_party/mac_headers/mach-o/fat.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2016 Apple, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _MACH_O_FAT_H_ +#define _MACH_O_FAT_H_ +/* + * This header file describes the structures of the file format for "fat" + * architecture specific file (wrapper design). At the begining of the file + * there is one fat_header structure followed by a number of fat_arch + * structures. For each architecture in the file, specified by a pair of + * cputype and cpusubtype, the fat_header describes the file offset, file + * size and alignment in the file of the architecture specific member. + * The padded bytes in the file to place each member on it's specific alignment + * are defined to be read as zeros and can be left as "holes" if the file system + * can support them as long as they read as zeros. + * + * All structures defined here are always written and read to/from disk + * in big-endian order. + */ + +/* + * is needed here for the cpu_type_t and cpu_subtype_t types + * and contains the constants for the possible values of these types. + */ +#include +#include +#include + +#define FAT_MAGIC 0xcafebabe +#define FAT_CIGAM 0xbebafeca /* NXSwapLong(FAT_MAGIC) */ + +struct fat_header { + uint32_t magic; /* FAT_MAGIC or FAT_MAGIC_64 */ + uint32_t nfat_arch; /* number of structs that follow */ +}; + +struct fat_arch { + cpu_type_t cputype; /* cpu specifier (int) */ + cpu_subtype_t cpusubtype; /* machine specifier (int) */ + uint32_t offset; /* file offset to this object file */ + uint32_t size; /* size of this object file */ + uint32_t align; /* alignment as a power of 2 */ +}; + +/* + * The support for the 64-bit fat file format described here is a work in + * progress and not yet fully supported in all the Apple Developer Tools. + * + * When a slice is greater than 4mb or an offset to a slice is greater than 4mb + * then the 64-bit fat file format is used. + */ +#define FAT_MAGIC_64 0xcafebabf +#define FAT_CIGAM_64 0xbfbafeca /* NXSwapLong(FAT_MAGIC_64) */ + +struct fat_arch_64 { + cpu_type_t cputype; /* cpu specifier (int) */ + cpu_subtype_t cpusubtype; /* machine specifier (int) */ + uint64_t offset; /* file offset to this object file */ + uint64_t size; /* size of this object file */ + uint32_t align; /* alignment as a power of 2 */ + uint32_t reserved; /* reserved */ +}; + +#endif /* _MACH_O_FAT_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach-o/loader.h b/src/third_party/mac_headers/mach-o/loader.h new file mode 100644 index 0000000..2b03dfd --- /dev/null +++ b/src/third_party/mac_headers/mach-o/loader.h @@ -0,0 +1,1606 @@ +/* + * Copyright (c) 1999-2010 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _MACHO_LOADER_H_ +#define _MACHO_LOADER_H_ + +/* + * This file describes the format of mach object files. + */ +#include + +/* + * is needed here for the cpu_type_t and cpu_subtype_t types + * and contains the constants for the possible values of these types. + */ +#include + +/* + * is needed here for the vm_prot_t type and contains the + * constants that are or'ed together for the possible values of this type. + */ +#include + +/* + * is expected to define the flavors of the thread + * states and the structures of those flavors for each machine. + */ +#include +#include + +/* + * The 32-bit mach header appears at the very beginning of the object file for + * 32-bit architectures. + */ +struct mach_header { + uint32_t magic; /* mach magic number identifier */ + cpu_type_t cputype; /* cpu specifier */ + cpu_subtype_t cpusubtype; /* machine specifier */ + uint32_t filetype; /* type of file */ + uint32_t ncmds; /* number of load commands */ + uint32_t sizeofcmds; /* the size of all the load commands */ + uint32_t flags; /* flags */ +}; + +/* Constant for the magic field of the mach_header (32-bit architectures) */ +#define MH_MAGIC 0xfeedface /* the mach magic number */ +#define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */ + +/* + * The 64-bit mach header appears at the very beginning of object files for + * 64-bit architectures. + */ +struct mach_header_64 { + uint32_t magic; /* mach magic number identifier */ + cpu_type_t cputype; /* cpu specifier */ + cpu_subtype_t cpusubtype; /* machine specifier */ + uint32_t filetype; /* type of file */ + uint32_t ncmds; /* number of load commands */ + uint32_t sizeofcmds; /* the size of all the load commands */ + uint32_t flags; /* flags */ + uint32_t reserved; /* reserved */ +}; + +/* Constant for the magic field of the mach_header_64 (64-bit architectures) */ +#define MH_MAGIC_64 0xfeedfacf /* the 64-bit mach magic number */ +#define MH_CIGAM_64 0xcffaedfe /* NXSwapInt(MH_MAGIC_64) */ + +/* + * The layout of the file depends on the filetype. For all but the MH_OBJECT + * file type the segments are padded out and aligned on a segment alignment + * boundary for efficient demand pageing. The MH_EXECUTE, MH_FVMLIB, MH_DYLIB, + * MH_DYLINKER and MH_BUNDLE file types also have the headers included as part + * of their first segment. + * + * The file type MH_OBJECT is a compact format intended as output of the + * assembler and input (and possibly output) of the link editor (the .o + * format). All sections are in one unnamed segment with no segment padding. + * This format is used as an executable format when the file is so small the + * segment padding greatly increases its size. + * + * The file type MH_PRELOAD is an executable format intended for things that + * are not executed under the kernel (proms, stand alones, kernels, etc). The + * format can be executed under the kernel but may demand paged it and not + * preload it before execution. + * + * A core file is in MH_CORE format and can be any in an arbritray legal + * Mach-O file. + * + * Constants for the filetype field of the mach_header + */ +#define MH_OBJECT 0x1 /* relocatable object file */ +#define MH_EXECUTE 0x2 /* demand paged executable file */ +#define MH_FVMLIB 0x3 /* fixed VM shared library file */ +#define MH_CORE 0x4 /* core file */ +#define MH_PRELOAD 0x5 /* preloaded executable file */ +#define MH_DYLIB 0x6 /* dynamically bound shared library */ +#define MH_DYLINKER 0x7 /* dynamic link editor */ +#define MH_BUNDLE 0x8 /* dynamically bound bundle file */ +#define MH_DYLIB_STUB 0x9 /* shared library stub for static + linking only, no section contents */ +#define MH_DSYM 0xa /* companion file with only debug + sections */ +#define MH_KEXT_BUNDLE 0xb /* x86_64 kexts */ +#define MH_FILESET 0xc /* a file composed of other Mach-Os to + be run in the same userspace sharing + a single linkedit. */ + +/* Constants for the flags field of the mach_header */ +#define MH_NOUNDEFS 0x1 /* the object file has no undefined + references */ +#define MH_INCRLINK 0x2 /* the object file is the output of an + incremental link against a base file + and can't be link edited again */ +#define MH_DYLDLINK 0x4 /* the object file is input for the + dynamic linker and can't be staticly + link edited again */ +#define MH_BINDATLOAD 0x8 /* the object file's undefined + references are bound by the dynamic + linker when loaded. */ +#define MH_PREBOUND 0x10 /* the file has its dynamic undefined + references prebound. */ +#define MH_SPLIT_SEGS 0x20 /* the file has its read-only and + read-write segments split */ +#define MH_LAZY_INIT 0x40 /* the shared library init routine is + to be run lazily via catching memory + faults to its writeable segments + (obsolete) */ +#define MH_TWOLEVEL 0x80 /* the image is using two-level name + space bindings */ +#define MH_FORCE_FLAT 0x100 /* the executable is forcing all images + to use flat name space bindings */ +#define MH_NOMULTIDEFS 0x200 /* this umbrella guarantees no multiple + defintions of symbols in its + sub-images so the two-level namespace + hints can always be used. */ +#define MH_NOFIXPREBINDING 0x400 /* do not have dyld notify the + prebinding agent about this + executable */ +#define MH_PREBINDABLE 0x800 /* the binary is not prebound but can + have its prebinding redone. only used + when MH_PREBOUND is not set. */ +#define MH_ALLMODSBOUND 0x1000 /* indicates that this binary binds to + all two-level namespace modules of + its dependent libraries. only used + when MH_PREBINDABLE and MH_TWOLEVEL + are both set. */ +#define MH_SUBSECTIONS_VIA_SYMBOLS 0x2000/* safe to divide up the sections into + sub-sections via symbols for dead + code stripping */ +#define MH_CANONICAL 0x4000 /* the binary has been canonicalized + via the unprebind operation */ +#define MH_WEAK_DEFINES 0x8000 /* the final linked image contains + external weak symbols */ +#define MH_BINDS_TO_WEAK 0x10000 /* the final linked image uses + weak symbols */ + +#define MH_ALLOW_STACK_EXECUTION 0x20000/* When this bit is set, all stacks + in the task will be given stack + execution privilege. Only used in + MH_EXECUTE filetypes. */ +#define MH_ROOT_SAFE 0x40000 /* When this bit is set, the binary + declares it is safe for use in + processes with uid zero */ + +#define MH_SETUID_SAFE 0x80000 /* When this bit is set, the binary + declares it is safe for use in + processes when issetugid() is true */ + +#define MH_NO_REEXPORTED_DYLIBS 0x100000 /* When this bit is set on a dylib, + the static linker does not need to + examine dependent dylibs to see + if any are re-exported */ +#define MH_PIE 0x200000 /* When this bit is set, the OS will + load the main executable at a + random address. Only used in + MH_EXECUTE filetypes. */ +#define MH_DEAD_STRIPPABLE_DYLIB 0x400000 /* Only for use on dylibs. When + linking against a dylib that + has this bit set, the static linker + will automatically not create a + LC_LOAD_DYLIB load command to the + dylib if no symbols are being + referenced from the dylib. */ +#define MH_HAS_TLV_DESCRIPTORS 0x800000 /* Contains a section of type + S_THREAD_LOCAL_VARIABLES */ + +#define MH_NO_HEAP_EXECUTION 0x1000000 /* When this bit is set, the OS will + run the main executable with + a non-executable heap even on + platforms (e.g. i386) that don't + require it. Only used in MH_EXECUTE + filetypes. */ + +#define MH_APP_EXTENSION_SAFE 0x02000000 /* The code was linked for use in an + application extension. */ + +#define MH_NLIST_OUTOFSYNC_WITH_DYLDINFO 0x04000000 /* The external symbols + listed in the nlist symbol table do + not include all the symbols listed in + the dyld info. */ + +#define MH_SIM_SUPPORT 0x08000000 /* Allow LC_MIN_VERSION_MACOS and + LC_BUILD_VERSION load commands with + the platforms macOS, macCatalyst, + iOSSimulator, tvOSSimulator and + watchOSSimulator. */ + +#define MH_DYLIB_IN_CACHE 0x80000000 /* Only for use on dylibs. When this bit + is set, the dylib is part of the dyld + shared cache, rather than loose in + the filesystem. */ + +/* + * The load commands directly follow the mach_header. The total size of all + * of the commands is given by the sizeofcmds field in the mach_header. All + * load commands must have as their first two fields cmd and cmdsize. The cmd + * field is filled in with a constant for that command type. Each command type + * has a structure specifically for it. The cmdsize field is the size in bytes + * of the particular load command structure plus anything that follows it that + * is a part of the load command (i.e. section structures, strings, etc.). To + * advance to the next load command the cmdsize can be added to the offset or + * pointer of the current load command. The cmdsize for 32-bit architectures + * MUST be a multiple of 4 bytes and for 64-bit architectures MUST be a multiple + * of 8 bytes (these are forever the maximum alignment of any load commands). + * The padded bytes must be zero. All tables in the object file must also + * follow these rules so the file can be memory mapped. Otherwise the pointers + * to these tables will not work well or at all on some machines. With all + * padding zeroed like objects will compare byte for byte. + */ +struct load_command { + uint32_t cmd; /* type of load command */ + uint32_t cmdsize; /* total size of command in bytes */ +}; + +/* + * After MacOS X 10.1 when a new load command is added that is required to be + * understood by the dynamic linker for the image to execute properly the + * LC_REQ_DYLD bit will be or'ed into the load command constant. If the dynamic + * linker sees such a load command it it does not understand will issue a + * "unknown load command required for execution" error and refuse to use the + * image. Other load commands without this bit that are not understood will + * simply be ignored. + */ +#define LC_REQ_DYLD 0x80000000 + +/* Constants for the cmd field of all load commands, the type */ +#define LC_SEGMENT 0x1 /* segment of this file to be mapped */ +#define LC_SYMTAB 0x2 /* link-edit stab symbol table info */ +#define LC_SYMSEG 0x3 /* link-edit gdb symbol table info (obsolete) */ +#define LC_THREAD 0x4 /* thread */ +#define LC_UNIXTHREAD 0x5 /* unix thread (includes a stack) */ +#define LC_LOADFVMLIB 0x6 /* load a specified fixed VM shared library */ +#define LC_IDFVMLIB 0x7 /* fixed VM shared library identification */ +#define LC_IDENT 0x8 /* object identification info (obsolete) */ +#define LC_FVMFILE 0x9 /* fixed VM file inclusion (internal use) */ +#define LC_PREPAGE 0xa /* prepage command (internal use) */ +#define LC_DYSYMTAB 0xb /* dynamic link-edit symbol table info */ +#define LC_LOAD_DYLIB 0xc /* load a dynamically linked shared library */ +#define LC_ID_DYLIB 0xd /* dynamically linked shared lib ident */ +#define LC_LOAD_DYLINKER 0xe /* load a dynamic linker */ +#define LC_ID_DYLINKER 0xf /* dynamic linker identification */ +#define LC_PREBOUND_DYLIB 0x10 /* modules prebound for a dynamically */ + /* linked shared library */ +#define LC_ROUTINES 0x11 /* image routines */ +#define LC_SUB_FRAMEWORK 0x12 /* sub framework */ +#define LC_SUB_UMBRELLA 0x13 /* sub umbrella */ +#define LC_SUB_CLIENT 0x14 /* sub client */ +#define LC_SUB_LIBRARY 0x15 /* sub library */ +#define LC_TWOLEVEL_HINTS 0x16 /* two-level namespace lookup hints */ +#define LC_PREBIND_CKSUM 0x17 /* prebind checksum */ + +/* + * load a dynamically linked shared library that is allowed to be missing + * (all symbols are weak imported). + */ +#define LC_LOAD_WEAK_DYLIB (0x18 | LC_REQ_DYLD) + +#define LC_SEGMENT_64 0x19 /* 64-bit segment of this file to be + mapped */ +#define LC_ROUTINES_64 0x1a /* 64-bit image routines */ +#define LC_UUID 0x1b /* the uuid */ +#define LC_RPATH (0x1c | LC_REQ_DYLD) /* runpath additions */ +#define LC_CODE_SIGNATURE 0x1d /* local of code signature */ +#define LC_SEGMENT_SPLIT_INFO 0x1e /* local of info to split segments */ +#define LC_REEXPORT_DYLIB (0x1f | LC_REQ_DYLD) /* load and re-export dylib */ +#define LC_LAZY_LOAD_DYLIB 0x20 /* delay load of dylib until first use */ +#define LC_ENCRYPTION_INFO 0x21 /* encrypted segment information */ +#define LC_DYLD_INFO 0x22 /* compressed dyld information */ +#define LC_DYLD_INFO_ONLY (0x22|LC_REQ_DYLD) /* compressed dyld information only */ +#define LC_LOAD_UPWARD_DYLIB (0x23 | LC_REQ_DYLD) /* load upward dylib */ +#define LC_VERSION_MIN_MACOSX 0x24 /* build for MacOSX min OS version */ +#define LC_VERSION_MIN_IPHONEOS 0x25 /* build for iPhoneOS min OS version */ +#define LC_FUNCTION_STARTS 0x26 /* compressed table of function start addresses */ +#define LC_DYLD_ENVIRONMENT 0x27 /* string for dyld to treat + like environment variable */ +#define LC_MAIN (0x28|LC_REQ_DYLD) /* replacement for LC_UNIXTHREAD */ +#define LC_DATA_IN_CODE 0x29 /* table of non-instructions in __text */ +#define LC_SOURCE_VERSION 0x2A /* source version used to build binary */ +#define LC_DYLIB_CODE_SIGN_DRS 0x2B /* Code signing DRs copied from linked dylibs */ +#define LC_ENCRYPTION_INFO_64 0x2C /* 64-bit encrypted segment information */ +#define LC_LINKER_OPTION 0x2D /* linker options in MH_OBJECT files */ +#define LC_LINKER_OPTIMIZATION_HINT 0x2E /* optimization hints in MH_OBJECT files */ +#define LC_VERSION_MIN_TVOS 0x2F /* build for AppleTV min OS version */ +#define LC_VERSION_MIN_WATCHOS 0x30 /* build for Watch min OS version */ +#define LC_NOTE 0x31 /* arbitrary data included within a Mach-O file */ +#define LC_BUILD_VERSION 0x32 /* build for platform min OS version */ +#define LC_DYLD_EXPORTS_TRIE (0x33 | LC_REQ_DYLD) /* used with linkedit_data_command, payload is trie */ +#define LC_DYLD_CHAINED_FIXUPS (0x34 | LC_REQ_DYLD) /* used with linkedit_data_command */ +#define LC_FILESET_ENTRY (0x35 | LC_REQ_DYLD) /* used with fileset_entry_command */ + +/* + * A variable length string in a load command is represented by an lc_str + * union. The strings are stored just after the load command structure and + * the offset is from the start of the load command structure. The size + * of the string is reflected in the cmdsize field of the load command. + * Once again any padded bytes to bring the cmdsize field to a multiple + * of 4 bytes must be zero. + */ +union lc_str { + uint32_t offset; /* offset to the string */ +#ifndef __LP64__ + char *ptr; /* pointer to the string */ +#endif +}; + +/* + * The segment load command indicates that a part of this file is to be + * mapped into the task's address space. The size of this segment in memory, + * vmsize, maybe equal to or larger than the amount to map from this file, + * filesize. The file is mapped starting at fileoff to the beginning of + * the segment in memory, vmaddr. The rest of the memory of the segment, + * if any, is allocated zero fill on demand. The segment's maximum virtual + * memory protection and initial virtual memory protection are specified + * by the maxprot and initprot fields. If the segment has sections then the + * section structures directly follow the segment command and their size is + * reflected in cmdsize. + */ +struct segment_command { /* for 32-bit architectures */ + uint32_t cmd; /* LC_SEGMENT */ + uint32_t cmdsize; /* includes sizeof section structs */ + char segname[16]; /* segment name */ + uint32_t vmaddr; /* memory address of this segment */ + uint32_t vmsize; /* memory size of this segment */ + uint32_t fileoff; /* file offset of this segment */ + uint32_t filesize; /* amount to map from the file */ + vm_prot_t maxprot; /* maximum VM protection */ + vm_prot_t initprot; /* initial VM protection */ + uint32_t nsects; /* number of sections in segment */ + uint32_t flags; /* flags */ +}; + +/* + * The 64-bit segment load command indicates that a part of this file is to be + * mapped into a 64-bit task's address space. If the 64-bit segment has + * sections then section_64 structures directly follow the 64-bit segment + * command and their size is reflected in cmdsize. + */ +struct segment_command_64 { /* for 64-bit architectures */ + uint32_t cmd; /* LC_SEGMENT_64 */ + uint32_t cmdsize; /* includes sizeof section_64 structs */ + char segname[16]; /* segment name */ + uint64_t vmaddr; /* memory address of this segment */ + uint64_t vmsize; /* memory size of this segment */ + uint64_t fileoff; /* file offset of this segment */ + uint64_t filesize; /* amount to map from the file */ + vm_prot_t maxprot; /* maximum VM protection */ + vm_prot_t initprot; /* initial VM protection */ + uint32_t nsects; /* number of sections in segment */ + uint32_t flags; /* flags */ +}; + +/* Constants for the flags field of the segment_command */ +#define SG_HIGHVM 0x1 /* the file contents for this segment is for + the high part of the VM space, the low part + is zero filled (for stacks in core files) */ +#define SG_FVMLIB 0x2 /* this segment is the VM that is allocated by + a fixed VM library, for overlap checking in + the link editor */ +#define SG_NORELOC 0x4 /* this segment has nothing that was relocated + in it and nothing relocated to it, that is + it maybe safely replaced without relocation*/ +#define SG_PROTECTED_VERSION_1 0x8 /* This segment is protected. If the + segment starts at file offset 0, the + first page of the segment is not + protected. All other pages of the + segment are protected. */ +#define SG_READ_ONLY 0x10 /* This segment is made read-only after fixups */ + + + +/* + * A segment is made up of zero or more sections. Non-MH_OBJECT files have + * all of their segments with the proper sections in each, and padded to the + * specified segment alignment when produced by the link editor. The first + * segment of a MH_EXECUTE and MH_FVMLIB format file contains the mach_header + * and load commands of the object file before its first section. The zero + * fill sections are always last in their segment (in all formats). This + * allows the zeroed segment padding to be mapped into memory where zero fill + * sections might be. The gigabyte zero fill sections, those with the section + * type S_GB_ZEROFILL, can only be in a segment with sections of this type. + * These segments are then placed after all other segments. + * + * The MH_OBJECT format has all of its sections in one segment for + * compactness. There is no padding to a specified segment boundary and the + * mach_header and load commands are not part of the segment. + * + * Sections with the same section name, sectname, going into the same segment, + * segname, are combined by the link editor. The resulting section is aligned + * to the maximum alignment of the combined sections and is the new section's + * alignment. The combined sections are aligned to their original alignment in + * the combined section. Any padded bytes to get the specified alignment are + * zeroed. + * + * The format of the relocation entries referenced by the reloff and nreloc + * fields of the section structure for mach object files is described in the + * header file . + */ +struct section { /* for 32-bit architectures */ + char sectname[16]; /* name of this section */ + char segname[16]; /* segment this section goes in */ + uint32_t addr; /* memory address of this section */ + uint32_t size; /* size in bytes of this section */ + uint32_t offset; /* file offset of this section */ + uint32_t align; /* section alignment (power of 2) */ + uint32_t reloff; /* file offset of relocation entries */ + uint32_t nreloc; /* number of relocation entries */ + uint32_t flags; /* flags (section type and attributes)*/ + uint32_t reserved1; /* reserved (for offset or index) */ + uint32_t reserved2; /* reserved (for count or sizeof) */ +}; + +struct section_64 { /* for 64-bit architectures */ + char sectname[16]; /* name of this section */ + char segname[16]; /* segment this section goes in */ + uint64_t addr; /* memory address of this section */ + uint64_t size; /* size in bytes of this section */ + uint32_t offset; /* file offset of this section */ + uint32_t align; /* section alignment (power of 2) */ + uint32_t reloff; /* file offset of relocation entries */ + uint32_t nreloc; /* number of relocation entries */ + uint32_t flags; /* flags (section type and attributes)*/ + uint32_t reserved1; /* reserved (for offset or index) */ + uint32_t reserved2; /* reserved (for count or sizeof) */ + uint32_t reserved3; /* reserved */ +}; + +/* + * The flags field of a section structure is separated into two parts a section + * type and section attributes. The section types are mutually exclusive (it + * can only have one type) but the section attributes are not (it may have more + * than one attribute). + */ +#define SECTION_TYPE 0x000000ff /* 256 section types */ +#define SECTION_ATTRIBUTES 0xffffff00 /* 24 section attributes */ + +/* Constants for the type of a section */ +#define S_REGULAR 0x0 /* regular section */ +#define S_ZEROFILL 0x1 /* zero fill on demand section */ +#define S_CSTRING_LITERALS 0x2 /* section with only literal C strings*/ +#define S_4BYTE_LITERALS 0x3 /* section with only 4 byte literals */ +#define S_8BYTE_LITERALS 0x4 /* section with only 8 byte literals */ +#define S_LITERAL_POINTERS 0x5 /* section with only pointers to */ + /* literals */ +/* + * For the two types of symbol pointers sections and the symbol stubs section + * they have indirect symbol table entries. For each of the entries in the + * section the indirect symbol table entries, in corresponding order in the + * indirect symbol table, start at the index stored in the reserved1 field + * of the section structure. Since the indirect symbol table entries + * correspond to the entries in the section the number of indirect symbol table + * entries is inferred from the size of the section divided by the size of the + * entries in the section. For symbol pointers sections the size of the entries + * in the section is 4 bytes and for symbol stubs sections the byte size of the + * stubs is stored in the reserved2 field of the section structure. + */ +#define S_NON_LAZY_SYMBOL_POINTERS 0x6 /* section with only non-lazy + symbol pointers */ +#define S_LAZY_SYMBOL_POINTERS 0x7 /* section with only lazy symbol + pointers */ +#define S_SYMBOL_STUBS 0x8 /* section with only symbol + stubs, byte size of stub in + the reserved2 field */ +#define S_MOD_INIT_FUNC_POINTERS 0x9 /* section with only function + pointers for initialization*/ +#define S_MOD_TERM_FUNC_POINTERS 0xa /* section with only function + pointers for termination */ +#define S_COALESCED 0xb /* section contains symbols that + are to be coalesced */ +#define S_GB_ZEROFILL 0xc /* zero fill on demand section + (that can be larger than 4 + gigabytes) */ +#define S_INTERPOSING 0xd /* section with only pairs of + function pointers for + interposing */ +#define S_16BYTE_LITERALS 0xe /* section with only 16 byte + literals */ +#define S_DTRACE_DOF 0xf /* section contains + DTrace Object Format */ +#define S_LAZY_DYLIB_SYMBOL_POINTERS 0x10 /* section with only lazy + symbol pointers to lazy + loaded dylibs */ +/* + * Section types to support thread local variables + */ +#define S_THREAD_LOCAL_REGULAR 0x11 /* template of initial + values for TLVs */ +#define S_THREAD_LOCAL_ZEROFILL 0x12 /* template of initial + values for TLVs */ +#define S_THREAD_LOCAL_VARIABLES 0x13 /* TLV descriptors */ +#define S_THREAD_LOCAL_VARIABLE_POINTERS 0x14 /* pointers to TLV + descriptors */ +#define S_THREAD_LOCAL_INIT_FUNCTION_POINTERS 0x15 /* functions to call + to initialize TLV + values */ +#define S_INIT_FUNC_OFFSETS 0x16 /* 32-bit offsets to + initializers */ + +/* + * Constants for the section attributes part of the flags field of a section + * structure. + */ +#define SECTION_ATTRIBUTES_USR 0xff000000 /* User setable attributes */ +#define S_ATTR_PURE_INSTRUCTIONS 0x80000000 /* section contains only true + machine instructions */ +#define S_ATTR_NO_TOC 0x40000000 /* section contains coalesced + symbols that are not to be + in a ranlib table of + contents */ +#define S_ATTR_STRIP_STATIC_SYMS 0x20000000 /* ok to strip static symbols + in this section in files + with the MH_DYLDLINK flag */ +#define S_ATTR_NO_DEAD_STRIP 0x10000000 /* no dead stripping */ +#define S_ATTR_LIVE_SUPPORT 0x08000000 /* blocks are live if they + reference live blocks */ +#define S_ATTR_SELF_MODIFYING_CODE 0x04000000 /* Used with i386 code stubs + written on by dyld */ +/* + * If a segment contains any sections marked with S_ATTR_DEBUG then all + * sections in that segment must have this attribute. No section other than + * a section marked with this attribute may reference the contents of this + * section. A section with this attribute may contain no symbols and must have + * a section type S_REGULAR. The static linker will not copy section contents + * from sections with this attribute into its output file. These sections + * generally contain DWARF debugging info. + */ +#define S_ATTR_DEBUG 0x02000000 /* a debug section */ +#define SECTION_ATTRIBUTES_SYS 0x00ffff00 /* system setable attributes */ +#define S_ATTR_SOME_INSTRUCTIONS 0x00000400 /* section contains some + machine instructions */ +#define S_ATTR_EXT_RELOC 0x00000200 /* section has external + relocation entries */ +#define S_ATTR_LOC_RELOC 0x00000100 /* section has local + relocation entries */ + + +/* + * The names of segments and sections in them are mostly meaningless to the + * link-editor. But there are few things to support traditional UNIX + * executables that require the link-editor and assembler to use some names + * agreed upon by convention. + * + * The initial protection of the "__TEXT" segment has write protection turned + * off (not writeable). + * + * The link-editor will allocate common symbols at the end of the "__common" + * section in the "__DATA" segment. It will create the section and segment + * if needed. + */ + +/* The currently known segment names and the section names in those segments */ + +#define SEG_PAGEZERO "__PAGEZERO" /* the pagezero segment which has no */ + /* protections and catches NULL */ + /* references for MH_EXECUTE files */ + + +#define SEG_TEXT "__TEXT" /* the tradition UNIX text segment */ +#define SECT_TEXT "__text" /* the real text part of the text */ + /* section no headers, and no padding */ +#define SECT_FVMLIB_INIT0 "__fvmlib_init0" /* the fvmlib initialization */ + /* section */ +#define SECT_FVMLIB_INIT1 "__fvmlib_init1" /* the section following the */ + /* fvmlib initialization */ + /* section */ + +#define SEG_DATA "__DATA" /* the tradition UNIX data segment */ +#define SECT_DATA "__data" /* the real initialized data section */ + /* no padding, no bss overlap */ +#define SECT_BSS "__bss" /* the real uninitialized data section*/ + /* no padding */ +#define SECT_COMMON "__common" /* the section common symbols are */ + /* allocated in by the link editor */ + +#define SEG_OBJC "__OBJC" /* objective-C runtime segment */ +#define SECT_OBJC_SYMBOLS "__symbol_table" /* symbol table */ +#define SECT_OBJC_MODULES "__module_info" /* module information */ +#define SECT_OBJC_STRINGS "__selector_strs" /* string table */ +#define SECT_OBJC_REFS "__selector_refs" /* string table */ + +#define SEG_ICON "__ICON" /* the icon segment */ +#define SECT_ICON_HEADER "__header" /* the icon headers */ +#define SECT_ICON_TIFF "__tiff" /* the icons in tiff format */ + +#define SEG_LINKEDIT "__LINKEDIT" /* the segment containing all structs */ + /* created and maintained by the link */ + /* editor. Created with -seglinkedit */ + /* option to ld(1) for MH_EXECUTE and */ + /* FVMLIB file types only */ + +#define SEG_UNIXSTACK "__UNIXSTACK" /* the unix stack segment */ + +#define SEG_IMPORT "__IMPORT" /* the segment for the self (dyld) */ + /* modifing code stubs that has read, */ + /* write and execute permissions */ + +/* + * Fixed virtual memory shared libraries are identified by two things. The + * target pathname (the name of the library as found for execution), and the + * minor version number. The address of where the headers are loaded is in + * header_addr. (THIS IS OBSOLETE and no longer supported). + */ +struct fvmlib { + union lc_str name; /* library's target pathname */ + uint32_t minor_version; /* library's minor version number */ + uint32_t header_addr; /* library's header address */ +}; + +/* + * A fixed virtual shared library (filetype == MH_FVMLIB in the mach header) + * contains a fvmlib_command (cmd == LC_IDFVMLIB) to identify the library. + * An object that uses a fixed virtual shared library also contains a + * fvmlib_command (cmd == LC_LOADFVMLIB) for each library it uses. + * (THIS IS OBSOLETE and no longer supported). + */ +struct fvmlib_command { + uint32_t cmd; /* LC_IDFVMLIB or LC_LOADFVMLIB */ + uint32_t cmdsize; /* includes pathname string */ + struct fvmlib fvmlib; /* the library identification */ +}; + +/* + * Dynamicly linked shared libraries are identified by two things. The + * pathname (the name of the library as found for execution), and the + * compatibility version number. The pathname must match and the compatibility + * number in the user of the library must be greater than or equal to the + * library being used. The time stamp is used to record the time a library was + * built and copied into user so it can be use to determined if the library used + * at runtime is exactly the same as used to built the program. + */ +struct dylib { + union lc_str name; /* library's path name */ + uint32_t timestamp; /* library's build time stamp */ + uint32_t current_version; /* library's current version number */ + uint32_t compatibility_version; /* library's compatibility vers number*/ +}; + +/* + * A dynamically linked shared library (filetype == MH_DYLIB in the mach header) + * contains a dylib_command (cmd == LC_ID_DYLIB) to identify the library. + * An object that uses a dynamically linked shared library also contains a + * dylib_command (cmd == LC_LOAD_DYLIB, LC_LOAD_WEAK_DYLIB, or + * LC_REEXPORT_DYLIB) for each library it uses. + */ +struct dylib_command { + uint32_t cmd; /* LC_ID_DYLIB, LC_LOAD_{,WEAK_}DYLIB, + LC_REEXPORT_DYLIB */ + uint32_t cmdsize; /* includes pathname string */ + struct dylib dylib; /* the library identification */ +}; + +/* + * A dynamically linked shared library may be a subframework of an umbrella + * framework. If so it will be linked with "-umbrella umbrella_name" where + * Where "umbrella_name" is the name of the umbrella framework. A subframework + * can only be linked against by its umbrella framework or other subframeworks + * that are part of the same umbrella framework. Otherwise the static link + * editor produces an error and states to link against the umbrella framework. + * The name of the umbrella framework for subframeworks is recorded in the + * following structure. + */ +struct sub_framework_command { + uint32_t cmd; /* LC_SUB_FRAMEWORK */ + uint32_t cmdsize; /* includes umbrella string */ + union lc_str umbrella; /* the umbrella framework name */ +}; + +/* + * For dynamically linked shared libraries that are subframework of an umbrella + * framework they can allow clients other than the umbrella framework or other + * subframeworks in the same umbrella framework. To do this the subframework + * is built with "-allowable_client client_name" and an LC_SUB_CLIENT load + * command is created for each -allowable_client flag. The client_name is + * usually a framework name. It can also be a name used for bundles clients + * where the bundle is built with "-client_name client_name". + */ +struct sub_client_command { + uint32_t cmd; /* LC_SUB_CLIENT */ + uint32_t cmdsize; /* includes client string */ + union lc_str client; /* the client name */ +}; + +/* + * A dynamically linked shared library may be a sub_umbrella of an umbrella + * framework. If so it will be linked with "-sub_umbrella umbrella_name" where + * Where "umbrella_name" is the name of the sub_umbrella framework. When + * staticly linking when -twolevel_namespace is in effect a twolevel namespace + * umbrella framework will only cause its subframeworks and those frameworks + * listed as sub_umbrella frameworks to be implicited linked in. Any other + * dependent dynamic libraries will not be linked it when -twolevel_namespace + * is in effect. The primary library recorded by the static linker when + * resolving a symbol in these libraries will be the umbrella framework. + * Zero or more sub_umbrella frameworks may be use by an umbrella framework. + * The name of a sub_umbrella framework is recorded in the following structure. + */ +struct sub_umbrella_command { + uint32_t cmd; /* LC_SUB_UMBRELLA */ + uint32_t cmdsize; /* includes sub_umbrella string */ + union lc_str sub_umbrella; /* the sub_umbrella framework name */ +}; + +/* + * A dynamically linked shared library may be a sub_library of another shared + * library. If so it will be linked with "-sub_library library_name" where + * Where "library_name" is the name of the sub_library shared library. When + * staticly linking when -twolevel_namespace is in effect a twolevel namespace + * shared library will only cause its subframeworks and those frameworks + * listed as sub_umbrella frameworks and libraries listed as sub_libraries to + * be implicited linked in. Any other dependent dynamic libraries will not be + * linked it when -twolevel_namespace is in effect. The primary library + * recorded by the static linker when resolving a symbol in these libraries + * will be the umbrella framework (or dynamic library). Zero or more sub_library + * shared libraries may be use by an umbrella framework or (or dynamic library). + * The name of a sub_library framework is recorded in the following structure. + * For example /usr/lib/libobjc_profile.A.dylib would be recorded as "libobjc". + */ +struct sub_library_command { + uint32_t cmd; /* LC_SUB_LIBRARY */ + uint32_t cmdsize; /* includes sub_library string */ + union lc_str sub_library; /* the sub_library name */ +}; + +/* + * A program (filetype == MH_EXECUTE) that is + * prebound to its dynamic libraries has one of these for each library that + * the static linker used in prebinding. It contains a bit vector for the + * modules in the library. The bits indicate which modules are bound (1) and + * which are not (0) from the library. The bit for module 0 is the low bit + * of the first byte. So the bit for the Nth module is: + * (linked_modules[N/8] >> N%8) & 1 + */ +struct prebound_dylib_command { + uint32_t cmd; /* LC_PREBOUND_DYLIB */ + uint32_t cmdsize; /* includes strings */ + union lc_str name; /* library's path name */ + uint32_t nmodules; /* number of modules in library */ + union lc_str linked_modules; /* bit vector of linked modules */ +}; + +/* + * A program that uses a dynamic linker contains a dylinker_command to identify + * the name of the dynamic linker (LC_LOAD_DYLINKER). And a dynamic linker + * contains a dylinker_command to identify the dynamic linker (LC_ID_DYLINKER). + * A file can have at most one of these. + * This struct is also used for the LC_DYLD_ENVIRONMENT load command and + * contains string for dyld to treat like environment variable. + */ +struct dylinker_command { + uint32_t cmd; /* LC_ID_DYLINKER, LC_LOAD_DYLINKER or + LC_DYLD_ENVIRONMENT */ + uint32_t cmdsize; /* includes pathname string */ + union lc_str name; /* dynamic linker's path name */ +}; + +/* + * Thread commands contain machine-specific data structures suitable for + * use in the thread state primitives. The machine specific data structures + * follow the struct thread_command as follows. + * Each flavor of machine specific data structure is preceded by an uint32_t + * constant for the flavor of that data structure, an uint32_t that is the + * count of uint32_t's of the size of the state data structure and then + * the state data structure follows. This triple may be repeated for many + * flavors. The constants for the flavors, counts and state data structure + * definitions are expected to be in the header file . + * These machine specific data structures sizes must be multiples of + * 4 bytes. The cmdsize reflects the total size of the thread_command + * and all of the sizes of the constants for the flavors, counts and state + * data structures. + * + * For executable objects that are unix processes there will be one + * thread_command (cmd == LC_UNIXTHREAD) created for it by the link-editor. + * This is the same as a LC_THREAD, except that a stack is automatically + * created (based on the shell's limit for the stack size). Command arguments + * and environment variables are copied onto that stack. + */ +struct thread_command { + uint32_t cmd; /* LC_THREAD or LC_UNIXTHREAD */ + uint32_t cmdsize; /* total size of this command */ + /* uint32_t flavor flavor of thread state */ + /* uint32_t count count of uint32_t's in thread state */ + /* struct XXX_thread_state state thread state for this flavor */ + /* ... */ +}; + +/* + * The routines command contains the address of the dynamic shared library + * initialization routine and an index into the module table for the module + * that defines the routine. Before any modules are used from the library the + * dynamic linker fully binds the module that defines the initialization routine + * and then calls it. This gets called before any module initialization + * routines (used for C++ static constructors) in the library. + */ +struct routines_command { /* for 32-bit architectures */ + uint32_t cmd; /* LC_ROUTINES */ + uint32_t cmdsize; /* total size of this command */ + uint32_t init_address; /* address of initialization routine */ + uint32_t init_module; /* index into the module table that */ + /* the init routine is defined in */ + uint32_t reserved1; + uint32_t reserved2; + uint32_t reserved3; + uint32_t reserved4; + uint32_t reserved5; + uint32_t reserved6; +}; + +/* + * The 64-bit routines command. Same use as above. + */ +struct routines_command_64 { /* for 64-bit architectures */ + uint32_t cmd; /* LC_ROUTINES_64 */ + uint32_t cmdsize; /* total size of this command */ + uint64_t init_address; /* address of initialization routine */ + uint64_t init_module; /* index into the module table that */ + /* the init routine is defined in */ + uint64_t reserved1; + uint64_t reserved2; + uint64_t reserved3; + uint64_t reserved4; + uint64_t reserved5; + uint64_t reserved6; +}; + +/* + * The symtab_command contains the offsets and sizes of the link-edit 4.3BSD + * "stab" style symbol table information as described in the header files + * and . + */ +struct symtab_command { + uint32_t cmd; /* LC_SYMTAB */ + uint32_t cmdsize; /* sizeof(struct symtab_command) */ + uint32_t symoff; /* symbol table offset */ + uint32_t nsyms; /* number of symbol table entries */ + uint32_t stroff; /* string table offset */ + uint32_t strsize; /* string table size in bytes */ +}; + +/* + * This is the second set of the symbolic information which is used to support + * the data structures for the dynamically link editor. + * + * The original set of symbolic information in the symtab_command which contains + * the symbol and string tables must also be present when this load command is + * present. When this load command is present the symbol table is organized + * into three groups of symbols: + * local symbols (static and debugging symbols) - grouped by module + * defined external symbols - grouped by module (sorted by name if not lib) + * undefined external symbols (sorted by name if MH_BINDATLOAD is not set, + * and in order the were seen by the static + * linker if MH_BINDATLOAD is set) + * In this load command there are offsets and counts to each of the three groups + * of symbols. + * + * This load command contains a the offsets and sizes of the following new + * symbolic information tables: + * table of contents + * module table + * reference symbol table + * indirect symbol table + * The first three tables above (the table of contents, module table and + * reference symbol table) are only present if the file is a dynamically linked + * shared library. For executable and object modules, which are files + * containing only one module, the information that would be in these three + * tables is determined as follows: + * table of contents - the defined external symbols are sorted by name + * module table - the file contains only one module so everything in the + * file is part of the module. + * reference symbol table - is the defined and undefined external symbols + * + * For dynamically linked shared library files this load command also contains + * offsets and sizes to the pool of relocation entries for all sections + * separated into two groups: + * external relocation entries + * local relocation entries + * For executable and object modules the relocation entries continue to hang + * off the section structures. + */ +struct dysymtab_command { + uint32_t cmd; /* LC_DYSYMTAB */ + uint32_t cmdsize; /* sizeof(struct dysymtab_command) */ + + /* + * The symbols indicated by symoff and nsyms of the LC_SYMTAB load command + * are grouped into the following three groups: + * local symbols (further grouped by the module they are from) + * defined external symbols (further grouped by the module they are from) + * undefined symbols + * + * The local symbols are used only for debugging. The dynamic binding + * process may have to use them to indicate to the debugger the local + * symbols for a module that is being bound. + * + * The last two groups are used by the dynamic binding process to do the + * binding (indirectly through the module table and the reference symbol + * table when this is a dynamically linked shared library file). + */ + uint32_t ilocalsym; /* index to local symbols */ + uint32_t nlocalsym; /* number of local symbols */ + + uint32_t iextdefsym;/* index to externally defined symbols */ + uint32_t nextdefsym;/* number of externally defined symbols */ + + uint32_t iundefsym; /* index to undefined symbols */ + uint32_t nundefsym; /* number of undefined symbols */ + + /* + * For the for the dynamic binding process to find which module a symbol + * is defined in the table of contents is used (analogous to the ranlib + * structure in an archive) which maps defined external symbols to modules + * they are defined in. This exists only in a dynamically linked shared + * library file. For executable and object modules the defined external + * symbols are sorted by name and is use as the table of contents. + */ + uint32_t tocoff; /* file offset to table of contents */ + uint32_t ntoc; /* number of entries in table of contents */ + + /* + * To support dynamic binding of "modules" (whole object files) the symbol + * table must reflect the modules that the file was created from. This is + * done by having a module table that has indexes and counts into the merged + * tables for each module. The module structure that these two entries + * refer to is described below. This exists only in a dynamically linked + * shared library file. For executable and object modules the file only + * contains one module so everything in the file belongs to the module. + */ + uint32_t modtaboff; /* file offset to module table */ + uint32_t nmodtab; /* number of module table entries */ + + /* + * To support dynamic module binding the module structure for each module + * indicates the external references (defined and undefined) each module + * makes. For each module there is an offset and a count into the + * reference symbol table for the symbols that the module references. + * This exists only in a dynamically linked shared library file. For + * executable and object modules the defined external symbols and the + * undefined external symbols indicates the external references. + */ + uint32_t extrefsymoff; /* offset to referenced symbol table */ + uint32_t nextrefsyms; /* number of referenced symbol table entries */ + + /* + * The sections that contain "symbol pointers" and "routine stubs" have + * indexes and (implied counts based on the size of the section and fixed + * size of the entry) into the "indirect symbol" table for each pointer + * and stub. For every section of these two types the index into the + * indirect symbol table is stored in the section header in the field + * reserved1. An indirect symbol table entry is simply a 32bit index into + * the symbol table to the symbol that the pointer or stub is referring to. + * The indirect symbol table is ordered to match the entries in the section. + */ + uint32_t indirectsymoff; /* file offset to the indirect symbol table */ + uint32_t nindirectsyms; /* number of indirect symbol table entries */ + + /* + * To support relocating an individual module in a library file quickly the + * external relocation entries for each module in the library need to be + * accessed efficiently. Since the relocation entries can't be accessed + * through the section headers for a library file they are separated into + * groups of local and external entries further grouped by module. In this + * case the presents of this load command who's extreloff, nextrel, + * locreloff and nlocrel fields are non-zero indicates that the relocation + * entries of non-merged sections are not referenced through the section + * structures (and the reloff and nreloc fields in the section headers are + * set to zero). + * + * Since the relocation entries are not accessed through the section headers + * this requires the r_address field to be something other than a section + * offset to identify the item to be relocated. In this case r_address is + * set to the offset from the vmaddr of the first LC_SEGMENT command. + * For MH_SPLIT_SEGS images r_address is set to the the offset from the + * vmaddr of the first read-write LC_SEGMENT command. + * + * The relocation entries are grouped by module and the module table + * entries have indexes and counts into them for the group of external + * relocation entries for that the module. + * + * For sections that are merged across modules there must not be any + * remaining external relocation entries for them (for merged sections + * remaining relocation entries must be local). + */ + uint32_t extreloff; /* offset to external relocation entries */ + uint32_t nextrel; /* number of external relocation entries */ + + /* + * All the local relocation entries are grouped together (they are not + * grouped by their module since they are only used if the object is moved + * from it staticly link edited address). + */ + uint32_t locreloff; /* offset to local relocation entries */ + uint32_t nlocrel; /* number of local relocation entries */ + +}; + +/* + * An indirect symbol table entry is simply a 32bit index into the symbol table + * to the symbol that the pointer or stub is refering to. Unless it is for a + * non-lazy symbol pointer section for a defined symbol which strip(1) as + * removed. In which case it has the value INDIRECT_SYMBOL_LOCAL. If the + * symbol was also absolute INDIRECT_SYMBOL_ABS is or'ed with that. + */ +#define INDIRECT_SYMBOL_LOCAL 0x80000000 +#define INDIRECT_SYMBOL_ABS 0x40000000 + + +/* a table of contents entry */ +struct dylib_table_of_contents { + uint32_t symbol_index; /* the defined external symbol + (index into the symbol table) */ + uint32_t module_index; /* index into the module table this symbol + is defined in */ +}; + +/* a module table entry */ +struct dylib_module { + uint32_t module_name; /* the module name (index into string table) */ + + uint32_t iextdefsym; /* index into externally defined symbols */ + uint32_t nextdefsym; /* number of externally defined symbols */ + uint32_t irefsym; /* index into reference symbol table */ + uint32_t nrefsym; /* number of reference symbol table entries */ + uint32_t ilocalsym; /* index into symbols for local symbols */ + uint32_t nlocalsym; /* number of local symbols */ + + uint32_t iextrel; /* index into external relocation entries */ + uint32_t nextrel; /* number of external relocation entries */ + + uint32_t iinit_iterm; /* low 16 bits are the index into the init + section, high 16 bits are the index into + the term section */ + uint32_t ninit_nterm; /* low 16 bits are the number of init section + entries, high 16 bits are the number of + term section entries */ + + uint32_t /* for this module address of the start of */ + objc_module_info_addr; /* the (__OBJC,__module_info) section */ + uint32_t /* for this module size of */ + objc_module_info_size; /* the (__OBJC,__module_info) section */ +}; + +/* a 64-bit module table entry */ +struct dylib_module_64 { + uint32_t module_name; /* the module name (index into string table) */ + + uint32_t iextdefsym; /* index into externally defined symbols */ + uint32_t nextdefsym; /* number of externally defined symbols */ + uint32_t irefsym; /* index into reference symbol table */ + uint32_t nrefsym; /* number of reference symbol table entries */ + uint32_t ilocalsym; /* index into symbols for local symbols */ + uint32_t nlocalsym; /* number of local symbols */ + + uint32_t iextrel; /* index into external relocation entries */ + uint32_t nextrel; /* number of external relocation entries */ + + uint32_t iinit_iterm; /* low 16 bits are the index into the init + section, high 16 bits are the index into + the term section */ + uint32_t ninit_nterm; /* low 16 bits are the number of init section + entries, high 16 bits are the number of + term section entries */ + + uint32_t /* for this module size of */ + objc_module_info_size; /* the (__OBJC,__module_info) section */ + uint64_t /* for this module address of the start of */ + objc_module_info_addr; /* the (__OBJC,__module_info) section */ +}; + +/* + * The entries in the reference symbol table are used when loading the module + * (both by the static and dynamic link editors) and if the module is unloaded + * or replaced. Therefore all external symbols (defined and undefined) are + * listed in the module's reference table. The flags describe the type of + * reference that is being made. The constants for the flags are defined in + * as they are also used for symbol table entries. + */ +struct dylib_reference { + uint32_t isym:24, /* index into the symbol table */ + flags:8; /* flags to indicate the type of reference */ +}; + +/* + * The twolevel_hints_command contains the offset and number of hints in the + * two-level namespace lookup hints table. + */ +struct twolevel_hints_command { + uint32_t cmd; /* LC_TWOLEVEL_HINTS */ + uint32_t cmdsize; /* sizeof(struct twolevel_hints_command) */ + uint32_t offset; /* offset to the hint table */ + uint32_t nhints; /* number of hints in the hint table */ +}; + +/* + * The entries in the two-level namespace lookup hints table are twolevel_hint + * structs. These provide hints to the dynamic link editor where to start + * looking for an undefined symbol in a two-level namespace image. The + * isub_image field is an index into the sub-images (sub-frameworks and + * sub-umbrellas list) that made up the two-level image that the undefined + * symbol was found in when it was built by the static link editor. If + * isub-image is 0 the the symbol is expected to be defined in library and not + * in the sub-images. If isub-image is non-zero it is an index into the array + * of sub-images for the umbrella with the first index in the sub-images being + * 1. The array of sub-images is the ordered list of sub-images of the umbrella + * that would be searched for a symbol that has the umbrella recorded as its + * primary library. The table of contents index is an index into the + * library's table of contents. This is used as the starting point of the + * binary search or a directed linear search. + */ +struct twolevel_hint { + uint32_t + isub_image:8, /* index into the sub images */ + itoc:24; /* index into the table of contents */ +}; + +/* + * The prebind_cksum_command contains the value of the original check sum for + * prebound files or zero. When a prebound file is first created or modified + * for other than updating its prebinding information the value of the check sum + * is set to zero. When the file has it prebinding re-done and if the value of + * the check sum is zero the original check sum is calculated and stored in + * cksum field of this load command in the output file. If when the prebinding + * is re-done and the cksum field is non-zero it is left unchanged from the + * input file. + */ +struct prebind_cksum_command { + uint32_t cmd; /* LC_PREBIND_CKSUM */ + uint32_t cmdsize; /* sizeof(struct prebind_cksum_command) */ + uint32_t cksum; /* the check sum or zero */ +}; + +/* + * The uuid load command contains a single 128-bit unique random number that + * identifies an object produced by the static link editor. + */ +struct uuid_command { + uint32_t cmd; /* LC_UUID */ + uint32_t cmdsize; /* sizeof(struct uuid_command) */ + uint8_t uuid[16]; /* the 128-bit uuid */ +}; + +/* + * The rpath_command contains a path which at runtime should be added to + * the current run path used to find @rpath prefixed dylibs. + */ +struct rpath_command { + uint32_t cmd; /* LC_RPATH */ + uint32_t cmdsize; /* includes string */ + union lc_str path; /* path to add to run path */ +}; + +/* + * The linkedit_data_command contains the offsets and sizes of a blob + * of data in the __LINKEDIT segment. + */ +struct linkedit_data_command { + uint32_t cmd; /* LC_CODE_SIGNATURE, LC_SEGMENT_SPLIT_INFO, + LC_FUNCTION_STARTS, LC_DATA_IN_CODE, + LC_DYLIB_CODE_SIGN_DRS, + LC_LINKER_OPTIMIZATION_HINT, + LC_DYLD_EXPORTS_TRIE, or + LC_DYLD_CHAINED_FIXUPS. */ + uint32_t cmdsize; /* sizeof(struct linkedit_data_command) */ + uint32_t dataoff; /* file offset of data in __LINKEDIT segment */ + uint32_t datasize; /* file size of data in __LINKEDIT segment */ +}; + +/* + * The encryption_info_command contains the file offset and size of an + * of an encrypted segment. + */ +struct encryption_info_command { + uint32_t cmd; /* LC_ENCRYPTION_INFO */ + uint32_t cmdsize; /* sizeof(struct encryption_info_command) */ + uint32_t cryptoff; /* file offset of encrypted range */ + uint32_t cryptsize; /* file size of encrypted range */ + uint32_t cryptid; /* which enryption system, + 0 means not-encrypted yet */ +}; + +/* + * The encryption_info_command_64 contains the file offset and size of an + * of an encrypted segment (for use in x86_64 targets). + */ +struct encryption_info_command_64 { + uint32_t cmd; /* LC_ENCRYPTION_INFO_64 */ + uint32_t cmdsize; /* sizeof(struct encryption_info_command_64) */ + uint32_t cryptoff; /* file offset of encrypted range */ + uint32_t cryptsize; /* file size of encrypted range */ + uint32_t cryptid; /* which enryption system, + 0 means not-encrypted yet */ + uint32_t pad; /* padding to make this struct's size a multiple + of 8 bytes */ +}; + +/* + * The version_min_command contains the min OS version on which this + * binary was built to run. + */ +struct version_min_command { + uint32_t cmd; /* LC_VERSION_MIN_MACOSX or + LC_VERSION_MIN_IPHONEOS or + LC_VERSION_MIN_WATCHOS or + LC_VERSION_MIN_TVOS */ + uint32_t cmdsize; /* sizeof(struct min_version_command) */ + uint32_t version; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ + uint32_t sdk; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ +}; + +/* + * The build_version_command contains the min OS version on which this + * binary was built to run for its platform. The list of known platforms and + * tool values following it. + */ +struct build_version_command { + uint32_t cmd; /* LC_BUILD_VERSION */ + uint32_t cmdsize; /* sizeof(struct build_version_command) plus */ + /* ntools * sizeof(struct build_tool_version) */ + uint32_t platform; /* platform */ + uint32_t minos; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ + uint32_t sdk; /* X.Y.Z is encoded in nibbles xxxx.yy.zz */ + uint32_t ntools; /* number of tool entries following this */ +}; + +struct build_tool_version { + uint32_t tool; /* enum for the tool */ + uint32_t version; /* version number of the tool */ +}; + +/* Known values for the platform field above. */ +#define PLATFORM_MACOS 1 +#define PLATFORM_IOS 2 +#define PLATFORM_TVOS 3 +#define PLATFORM_WATCHOS 4 +#define PLATFORM_BRIDGEOS 5 +#define PLATFORM_MACCATALYST 6 +#define PLATFORM_IOSSIMULATOR 7 +#define PLATFORM_TVOSSIMULATOR 8 +#define PLATFORM_WATCHOSSIMULATOR 9 +#define PLATFORM_DRIVERKIT 10 + +#ifndef __APPLE_BLEACH_SDK__ +#endif /* __APPLE_BLEACH_SDK__ */ + +/* Known values for the tool field above. */ +#define TOOL_CLANG 1 +#define TOOL_SWIFT 2 +#define TOOL_LD 3 + +/* + * The dyld_info_command contains the file offsets and sizes of + * the new compressed form of the information dyld needs to + * load the image. This information is used by dyld on Mac OS X + * 10.6 and later. All information pointed to by this command + * is encoded using byte streams, so no endian swapping is needed + * to interpret it. + */ +struct dyld_info_command { + uint32_t cmd; /* LC_DYLD_INFO or LC_DYLD_INFO_ONLY */ + uint32_t cmdsize; /* sizeof(struct dyld_info_command) */ + + /* + * Dyld rebases an image whenever dyld loads it at an address different + * from its preferred address. The rebase information is a stream + * of byte sized opcodes whose symbolic names start with REBASE_OPCODE_. + * Conceptually the rebase information is a table of tuples: + * + * The opcodes are a compressed way to encode the table by only + * encoding when a column changes. In addition simple patterns + * like "every n'th offset for m times" can be encoded in a few + * bytes. + */ + uint32_t rebase_off; /* file offset to rebase info */ + uint32_t rebase_size; /* size of rebase info */ + + /* + * Dyld binds an image during the loading process, if the image + * requires any pointers to be initialized to symbols in other images. + * The bind information is a stream of byte sized + * opcodes whose symbolic names start with BIND_OPCODE_. + * Conceptually the bind information is a table of tuples: + * + * The opcodes are a compressed way to encode the table by only + * encoding when a column changes. In addition simple patterns + * like for runs of pointers initialzed to the same value can be + * encoded in a few bytes. + */ + uint32_t bind_off; /* file offset to binding info */ + uint32_t bind_size; /* size of binding info */ + + /* + * Some C++ programs require dyld to unique symbols so that all + * images in the process use the same copy of some code/data. + * This step is done after binding. The content of the weak_bind + * info is an opcode stream like the bind_info. But it is sorted + * alphabetically by symbol name. This enable dyld to walk + * all images with weak binding information in order and look + * for collisions. If there are no collisions, dyld does + * no updating. That means that some fixups are also encoded + * in the bind_info. For instance, all calls to "operator new" + * are first bound to libstdc++.dylib using the information + * in bind_info. Then if some image overrides operator new + * that is detected when the weak_bind information is processed + * and the call to operator new is then rebound. + */ + uint32_t weak_bind_off; /* file offset to weak binding info */ + uint32_t weak_bind_size; /* size of weak binding info */ + + /* + * Some uses of external symbols do not need to be bound immediately. + * Instead they can be lazily bound on first use. The lazy_bind + * are contains a stream of BIND opcodes to bind all lazy symbols. + * Normal use is that dyld ignores the lazy_bind section when + * loading an image. Instead the static linker arranged for the + * lazy pointer to initially point to a helper function which + * pushes the offset into the lazy_bind area for the symbol + * needing to be bound, then jumps to dyld which simply adds + * the offset to lazy_bind_off to get the information on what + * to bind. + */ + uint32_t lazy_bind_off; /* file offset to lazy binding info */ + uint32_t lazy_bind_size; /* size of lazy binding infs */ + + /* + * The symbols exported by a dylib are encoded in a trie. This + * is a compact representation that factors out common prefixes. + * It also reduces LINKEDIT pages in RAM because it encodes all + * information (name, address, flags) in one small, contiguous range. + * The export area is a stream of nodes. The first node sequentially + * is the start node for the trie. + * + * Nodes for a symbol start with a uleb128 that is the length of + * the exported symbol information for the string so far. + * If there is no exported symbol, the node starts with a zero byte. + * If there is exported info, it follows the length. + * + * First is a uleb128 containing flags. Normally, it is followed by + * a uleb128 encoded offset which is location of the content named + * by the symbol from the mach_header for the image. If the flags + * is EXPORT_SYMBOL_FLAGS_REEXPORT, then following the flags is + * a uleb128 encoded library ordinal, then a zero terminated + * UTF8 string. If the string is zero length, then the symbol + * is re-export from the specified dylib with the same name. + * If the flags is EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER, then following + * the flags is two uleb128s: the stub offset and the resolver offset. + * The stub is used by non-lazy pointers. The resolver is used + * by lazy pointers and must be called to get the actual address to use. + * + * After the optional exported symbol information is a byte of + * how many edges (0-255) that this node has leaving it, + * followed by each edge. + * Each edge is a zero terminated UTF8 of the addition chars + * in the symbol, followed by a uleb128 offset for the node that + * edge points to. + * + */ + uint32_t export_off; /* file offset to lazy binding info */ + uint32_t export_size; /* size of lazy binding infs */ +}; + +/* + * The following are used to encode rebasing information + */ +#define REBASE_TYPE_POINTER 1 +#define REBASE_TYPE_TEXT_ABSOLUTE32 2 +#define REBASE_TYPE_TEXT_PCREL32 3 + +#define REBASE_OPCODE_MASK 0xF0 +#define REBASE_IMMEDIATE_MASK 0x0F +#define REBASE_OPCODE_DONE 0x00 +#define REBASE_OPCODE_SET_TYPE_IMM 0x10 +#define REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x20 +#define REBASE_OPCODE_ADD_ADDR_ULEB 0x30 +#define REBASE_OPCODE_ADD_ADDR_IMM_SCALED 0x40 +#define REBASE_OPCODE_DO_REBASE_IMM_TIMES 0x50 +#define REBASE_OPCODE_DO_REBASE_ULEB_TIMES 0x60 +#define REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB 0x70 +#define REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB 0x80 + + +/* + * The following are used to encode binding information + */ +#define BIND_TYPE_POINTER 1 +#define BIND_TYPE_TEXT_ABSOLUTE32 2 +#define BIND_TYPE_TEXT_PCREL32 3 + +#define BIND_SPECIAL_DYLIB_SELF 0 +#define BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE -1 +#define BIND_SPECIAL_DYLIB_FLAT_LOOKUP -2 +#define BIND_SPECIAL_DYLIB_WEAK_LOOKUP -3 + +#define BIND_SYMBOL_FLAGS_WEAK_IMPORT 0x1 +#define BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION 0x8 + +#define BIND_OPCODE_MASK 0xF0 +#define BIND_IMMEDIATE_MASK 0x0F +#define BIND_OPCODE_DONE 0x00 +#define BIND_OPCODE_SET_DYLIB_ORDINAL_IMM 0x10 +#define BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB 0x20 +#define BIND_OPCODE_SET_DYLIB_SPECIAL_IMM 0x30 +#define BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM 0x40 +#define BIND_OPCODE_SET_TYPE_IMM 0x50 +#define BIND_OPCODE_SET_ADDEND_SLEB 0x60 +#define BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB 0x70 +#define BIND_OPCODE_ADD_ADDR_ULEB 0x80 +#define BIND_OPCODE_DO_BIND 0x90 +#define BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB 0xA0 +#define BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED 0xB0 +#define BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB 0xC0 +#define BIND_OPCODE_THREADED 0xD0 +#define BIND_SUBOPCODE_THREADED_SET_BIND_ORDINAL_TABLE_SIZE_ULEB 0x00 +#define BIND_SUBOPCODE_THREADED_APPLY 0x01 + + +/* + * The following are used on the flags byte of a terminal node + * in the export information. + */ +#define EXPORT_SYMBOL_FLAGS_KIND_MASK 0x03 +#define EXPORT_SYMBOL_FLAGS_KIND_REGULAR 0x00 +#define EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL 0x01 +#define EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE 0x02 +#define EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION 0x04 +#define EXPORT_SYMBOL_FLAGS_REEXPORT 0x08 +#define EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER 0x10 +#define EXPORT_SYMBOL_FLAGS_STATIC_RESOLVER 0x20 + + +/* + * The linker_option_command contains linker options embedded in object files. + */ +struct linker_option_command { + uint32_t cmd; /* LC_LINKER_OPTION only used in MH_OBJECT filetypes */ + uint32_t cmdsize; + uint32_t count; /* number of strings */ + /* concatenation of zero terminated UTF8 strings. + Zero filled at end to align */ +}; + +/* + * The symseg_command contains the offset and size of the GNU style + * symbol table information as described in the header file . + * The symbol roots of the symbol segments must also be aligned properly + * in the file. So the requirement of keeping the offsets aligned to a + * multiple of a 4 bytes translates to the length field of the symbol + * roots also being a multiple of a long. Also the padding must again be + * zeroed. (THIS IS OBSOLETE and no longer supported). + */ +struct symseg_command { + uint32_t cmd; /* LC_SYMSEG */ + uint32_t cmdsize; /* sizeof(struct symseg_command) */ + uint32_t offset; /* symbol segment offset */ + uint32_t size; /* symbol segment size in bytes */ +}; + +/* + * The ident_command contains a free format string table following the + * ident_command structure. The strings are null terminated and the size of + * the command is padded out with zero bytes to a multiple of 4 bytes/ + * (THIS IS OBSOLETE and no longer supported). + */ +struct ident_command { + uint32_t cmd; /* LC_IDENT */ + uint32_t cmdsize; /* strings that follow this command */ +}; + +/* + * The fvmfile_command contains a reference to a file to be loaded at the + * specified virtual address. (Presently, this command is reserved for + * internal use. The kernel ignores this command when loading a program into + * memory). + */ +struct fvmfile_command { + uint32_t cmd; /* LC_FVMFILE */ + uint32_t cmdsize; /* includes pathname string */ + union lc_str name; /* files pathname */ + uint32_t header_addr; /* files virtual address */ +}; + + +/* + * The entry_point_command is a replacement for thread_command. + * It is used for main executables to specify the location (file offset) + * of main(). If -stack_size was used at link time, the stacksize + * field will contain the stack size need for the main thread. + */ +struct entry_point_command { + uint32_t cmd; /* LC_MAIN only used in MH_EXECUTE filetypes */ + uint32_t cmdsize; /* 24 */ + uint64_t entryoff; /* file (__TEXT) offset of main() */ + uint64_t stacksize;/* if not zero, initial stack size */ +}; + + +/* + * The source_version_command is an optional load command containing + * the version of the sources used to build the binary. + */ +struct source_version_command { + uint32_t cmd; /* LC_SOURCE_VERSION */ + uint32_t cmdsize; /* 16 */ + uint64_t version; /* A.B.C.D.E packed as a24.b10.c10.d10.e10 */ +}; + + +/* + * The LC_DATA_IN_CODE load commands uses a linkedit_data_command + * to point to an array of data_in_code_entry entries. Each entry + * describes a range of data in a code section. + */ +struct data_in_code_entry { + uint32_t offset; /* from mach_header to start of data range*/ + uint16_t length; /* number of bytes in data range */ + uint16_t kind; /* a DICE_KIND_* value */ +}; +#define DICE_KIND_DATA 0x0001 +#define DICE_KIND_JUMP_TABLE8 0x0002 +#define DICE_KIND_JUMP_TABLE16 0x0003 +#define DICE_KIND_JUMP_TABLE32 0x0004 +#define DICE_KIND_ABS_JUMP_TABLE32 0x0005 + + + +/* + * Sections of type S_THREAD_LOCAL_VARIABLES contain an array + * of tlv_descriptor structures. + */ +struct tlv_descriptor +{ + void* (*thunk)(struct tlv_descriptor*); + unsigned long key; + unsigned long offset; +}; + +/* + * LC_NOTE commands describe a region of arbitrary data included in a Mach-O + * file. Its initial use is to record extra data in MH_CORE files. + */ +struct note_command { + uint32_t cmd; /* LC_NOTE */ + uint32_t cmdsize; /* sizeof(struct note_command) */ + char data_owner[16]; /* owner name for this LC_NOTE */ + uint64_t offset; /* file offset of this data */ + uint64_t size; /* length of data region */ +}; + +/* + * LC_FILESET_ENTRY commands describe constituent Mach-O files that are part + * of a fileset. In one implementation, entries are dylibs with individual + * mach headers and repositionable text and data segments. Each entry is + * further described by its own mach header. + */ +struct fileset_entry_command { + uint32_t cmd; /* LC_FILESET_ENTRY */ + uint32_t cmdsize; /* includes entry_id string */ + uint64_t vmaddr; /* memory address of the entry */ + uint64_t fileoff; /* file offset of the entry */ + union lc_str entry_id; /* contained entry id */ + uint32_t reserved; /* reserved */ +}; + +/* + * These deprecated values may still be used within Apple but are mechanically + * removed from public API. The mechanical process may produce unusual results. + */ +#if (!defined(PLATFORM_IOSMAC)) +#define PLATFORM_IOSMAC PLATFORM_MACCATALYST +#endif + +#endif /* _MACHO_LOADER_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach-o/nlist.h b/src/third_party/mac_headers/mach-o/nlist.h new file mode 100644 index 0000000..7b979a5 --- /dev/null +++ b/src/third_party/mac_headers/mach-o/nlist.h @@ -0,0 +1,324 @@ +/* + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#ifndef _MACHO_NLIST_H_ +#define _MACHO_NLIST_H_ +/* $NetBSD: nlist.h,v 1.5 1994/10/26 00:56:11 cgd Exp $ */ + +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)nlist.h 8.2 (Berkeley) 1/21/94 + */ +#include + +/* + * Format of a symbol table entry of a Mach-O file for 32-bit architectures. + * Modified from the BSD format. The modifications from the original format + * were changing n_other (an unused field) to n_sect and the addition of the + * N_SECT type. These modifications are required to support symbols in a larger + * number of sections not just the three sections (text, data and bss) in a BSD + * file. + */ +struct nlist { + union { +#ifndef __LP64__ + char *n_name; /* for use when in-core */ +#endif + uint32_t n_strx; /* index into the string table */ + } n_un; + uint8_t n_type; /* type flag, see below */ + uint8_t n_sect; /* section number or NO_SECT */ + int16_t n_desc; /* see */ + uint32_t n_value; /* value of this symbol (or stab offset) */ +}; + +/* + * This is the symbol table entry structure for 64-bit architectures. + */ +struct nlist_64 { + union { + uint32_t n_strx; /* index into the string table */ + } n_un; + uint8_t n_type; /* type flag, see below */ + uint8_t n_sect; /* section number or NO_SECT */ + uint16_t n_desc; /* see */ + uint64_t n_value; /* value of this symbol (or stab offset) */ +}; + +/* + * Symbols with a index into the string table of zero (n_un.n_strx == 0) are + * defined to have a null, "", name. Therefore all string indexes to non null + * names must not have a zero string index. This is bit historical information + * that has never been well documented. + */ + +/* + * The n_type field really contains four fields: + * unsigned char N_STAB:3, + * N_PEXT:1, + * N_TYPE:3, + * N_EXT:1; + * which are used via the following masks. + */ +#define N_STAB 0xe0 /* if any of these bits set, a symbolic debugging entry */ +#define N_PEXT 0x10 /* private external symbol bit */ +#define N_TYPE 0x0e /* mask for the type bits */ +#define N_EXT 0x01 /* external symbol bit, set for external symbols */ + +/* + * Only symbolic debugging entries have some of the N_STAB bits set and if any + * of these bits are set then it is a symbolic debugging entry (a stab). In + * which case then the values of the n_type field (the entire field) are given + * in + */ + +/* + * Values for N_TYPE bits of the n_type field. + */ +#define N_UNDF 0x0 /* undefined, n_sect == NO_SECT */ +#define N_ABS 0x2 /* absolute, n_sect == NO_SECT */ +#define N_SECT 0xe /* defined in section number n_sect */ +#define N_PBUD 0xc /* prebound undefined (defined in a dylib) */ +#define N_INDR 0xa /* indirect */ + +/* + * If the type is N_INDR then the symbol is defined to be the same as another + * symbol. In this case the n_value field is an index into the string table + * of the other symbol's name. When the other symbol is defined then they both + * take on the defined type and value. + */ + +/* + * If the type is N_SECT then the n_sect field contains an ordinal of the + * section the symbol is defined in. The sections are numbered from 1 and + * refer to sections in order they appear in the load commands for the file + * they are in. This means the same ordinal may very well refer to different + * sections in different files. + * + * The n_value field for all symbol table entries (including N_STAB's) gets + * updated by the link editor based on the value of it's n_sect field and where + * the section n_sect references gets relocated. If the value of the n_sect + * field is NO_SECT then it's n_value field is not changed by the link editor. + */ +#define NO_SECT 0 /* symbol is not in any section */ +#define MAX_SECT 255 /* 1 thru 255 inclusive */ + +/* + * Common symbols are represented by undefined (N_UNDF) external (N_EXT) types + * who's values (n_value) are non-zero. In which case the value of the n_value + * field is the size (in bytes) of the common symbol. The n_sect field is set + * to NO_SECT. The alignment of a common symbol may be set as a power of 2 + * between 2^1 and 2^15 as part of the n_desc field using the macros below. If + * the alignment is not set (a value of zero) then natural alignment based on + * the size is used. + */ +#define GET_COMM_ALIGN(n_desc) (((n_desc) >> 8) & 0x0f) +#define SET_COMM_ALIGN(n_desc,align) \ + (n_desc) = (((n_desc) & 0xf0ff) | (((align) & 0x0f) << 8)) + +/* + * To support the lazy binding of undefined symbols in the dynamic link-editor, + * the undefined symbols in the symbol table (the nlist structures) are marked + * with the indication if the undefined reference is a lazy reference or + * non-lazy reference. If both a non-lazy reference and a lazy reference is + * made to the same symbol the non-lazy reference takes precedence. A reference + * is lazy only when all references to that symbol are made through a symbol + * pointer in a lazy symbol pointer section. + * + * The implementation of marking nlist structures in the symbol table for + * undefined symbols will be to use some of the bits of the n_desc field as a + * reference type. The mask REFERENCE_TYPE will be applied to the n_desc field + * of an nlist structure for an undefined symbol to determine the type of + * undefined reference (lazy or non-lazy). + * + * The constants for the REFERENCE FLAGS are propagated to the reference table + * in a shared library file. In that case the constant for a defined symbol, + * REFERENCE_FLAG_DEFINED, is also used. + */ +/* Reference type bits of the n_desc field of undefined symbols */ +#define REFERENCE_TYPE 0x7 +/* types of references */ +#define REFERENCE_FLAG_UNDEFINED_NON_LAZY 0 +#define REFERENCE_FLAG_UNDEFINED_LAZY 1 +#define REFERENCE_FLAG_DEFINED 2 +#define REFERENCE_FLAG_PRIVATE_DEFINED 3 +#define REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 4 +#define REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 5 + +/* + * To simplify stripping of objects that use are used with the dynamic link + * editor, the static link editor marks the symbols defined an object that are + * referenced by a dynamicly bound object (dynamic shared libraries, bundles). + * With this marking strip knows not to strip these symbols. + */ +#define REFERENCED_DYNAMICALLY 0x0010 + +/* + * For images created by the static link editor with the -twolevel_namespace + * option in effect the flags field of the mach header is marked with + * MH_TWOLEVEL. And the binding of the undefined references of the image are + * determined by the static link editor. Which library an undefined symbol is + * bound to is recorded by the static linker in the high 8 bits of the n_desc + * field using the SET_LIBRARY_ORDINAL macro below. The ordinal recorded + * references the libraries listed in the Mach-O's LC_LOAD_DYLIB, + * LC_LOAD_WEAK_DYLIB, LC_REEXPORT_DYLIB, LC_LOAD_UPWARD_DYLIB, and + * LC_LAZY_LOAD_DYLIB, etc. load commands in the order they appear in the + * headers. The library ordinals start from 1. + * For a dynamic library that is built as a two-level namespace image the + * undefined references from module defined in another use the same nlist struct + * an in that case SELF_LIBRARY_ORDINAL is used as the library ordinal. For + * defined symbols in all images they also must have the library ordinal set to + * SELF_LIBRARY_ORDINAL. The EXECUTABLE_ORDINAL refers to the executable + * image for references from plugins that refer to the executable that loads + * them. + * + * The DYNAMIC_LOOKUP_ORDINAL is for undefined symbols in a two-level namespace + * image that are looked up by the dynamic linker with flat namespace semantics. + * This ordinal was added as a feature in Mac OS X 10.3 by reducing the + * value of MAX_LIBRARY_ORDINAL by one. So it is legal for existing binaries + * or binaries built with older tools to have 0xfe (254) dynamic libraries. In + * this case the ordinal value 0xfe (254) must be treated as a library ordinal + * for compatibility. + */ +#define GET_LIBRARY_ORDINAL(n_desc) (((n_desc) >> 8) & 0xff) +#define SET_LIBRARY_ORDINAL(n_desc,ordinal) \ + (n_desc) = (((n_desc) & 0x00ff) | (((ordinal) & 0xff) << 8)) +#define SELF_LIBRARY_ORDINAL 0x0 +#define MAX_LIBRARY_ORDINAL 0xfd +#define DYNAMIC_LOOKUP_ORDINAL 0xfe +#define EXECUTABLE_ORDINAL 0xff + +/* + * The bit 0x0020 of the n_desc field is used for two non-overlapping purposes + * and has two different symbolic names, N_NO_DEAD_STRIP and N_DESC_DISCARDED. + */ + +/* + * The N_NO_DEAD_STRIP bit of the n_desc field only ever appears in a + * relocatable .o file (MH_OBJECT filetype). And is used to indicate to the + * static link editor it is never to dead strip the symbol. + */ +#define N_NO_DEAD_STRIP 0x0020 /* symbol is not to be dead stripped */ + +/* + * The N_DESC_DISCARDED bit of the n_desc field never appears in linked image. + * But is used in very rare cases by the dynamic link editor to mark an in + * memory symbol as discared and longer used for linking. + */ +#define N_DESC_DISCARDED 0x0020 /* symbol is discarded */ + +/* + * The N_WEAK_REF bit of the n_desc field indicates to the dynamic linker that + * the undefined symbol is allowed to be missing and is to have the address of + * zero when missing. + */ +#define N_WEAK_REF 0x0040 /* symbol is weak referenced */ + +/* + * The N_WEAK_DEF bit of the n_desc field indicates to the static and dynamic + * linkers that the symbol definition is weak, allowing a non-weak symbol to + * also be used which causes the weak definition to be discared. Currently this + * is only supported for symbols in coalesed sections. + */ +#define N_WEAK_DEF 0x0080 /* coalesed symbol is a weak definition */ + +/* + * The N_REF_TO_WEAK bit of the n_desc field indicates to the dynamic linker + * that the undefined symbol should be resolved using flat namespace searching. + */ +#define N_REF_TO_WEAK 0x0080 /* reference to a weak symbol */ + +/* + * The N_ARM_THUMB_DEF bit of the n_desc field indicates that the symbol is + * a defintion of a Thumb function. + */ +#define N_ARM_THUMB_DEF 0x0008 /* symbol is a Thumb function (ARM) */ + +/* + * The N_SYMBOL_RESOLVER bit of the n_desc field indicates that the + * that the function is actually a resolver function and should + * be called to get the address of the real function to use. + * This bit is only available in .o files (MH_OBJECT filetype) + */ +#define N_SYMBOL_RESOLVER 0x0100 + +/* + * The N_ALT_ENTRY bit of the n_desc field indicates that the + * symbol is pinned to the previous content. + */ +#define N_ALT_ENTRY 0x0200 + +/* + * The N_COLD_FUNC bit of the n_desc field indicates that the symbol is used + * infrequently and the linker should order it towards the end of the section. + */ +#define N_COLD_FUNC 0x0400 + +#ifndef __STRICT_BSD__ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +/* + * The function nlist(3) from the C library. + */ +extern int nlist (const char *filename, struct nlist *list); +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* __STRICT_BSD__ */ + +#endif /* _MACHO_LIST_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/arm/boolean.h b/src/third_party/mac_headers/mach/arm/boolean.h new file mode 100644 index 0000000..d653a39 --- /dev/null +++ b/src/third_party/mac_headers/mach/arm/boolean.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2000-2007 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * @OSF_COPYRIGHT@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + */ + +/* + * File: boolean.h + * + * Boolean type, for ARM. + */ + +#ifndef _MACH_ARM_BOOLEAN_H_ +#define _MACH_ARM_BOOLEAN_H_ + +#if defined (__arm__) || defined (__arm64__) || defined (__aarch64__) + +typedef int boolean_t; + +#endif /* defined (__arm__) || defined (__arm64__) */ + +#endif /* _MACH_ARM_BOOLEAN_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/arm/vm_types.h b/src/third_party/mac_headers/mach/arm/vm_types.h new file mode 100644 index 0000000..3650a86 --- /dev/null +++ b/src/third_party/mac_headers/mach/arm/vm_types.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2000-2007 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * @OSF_COPYRIGHT@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + */ + +/* + * File: vm_types.h + * Author: Avadis Tevanian, Jr. + * Date: 1985 + * + * Header file for VM data types. ARM version. + */ + +#ifndef _MACH_ARM_VM_TYPES_H_ +#define _MACH_ARM_VM_TYPES_H_ + +#if defined (__arm__) || defined (__arm64__) || defined (__aarch64__) + +#ifndef ASSEMBLER + +#include +#include +#include + +/* + * natural_t and integer_t are Mach's legacy types for machine- + * independent integer types (unsigned, and signed, respectively). + * Their original purpose was to define other types in a machine/ + * compiler independent way. + * + * They also had an implicit "same size as pointer" characteristic + * to them (i.e. Mach's traditional types are very ILP32 or ILP64 + * centric). We will likely support x86 ABIs that do not follow + * either ofthese models (specifically LP64). Therefore, we had to + * make a choice between making these types scale with pointers or stay + * tied to integers. Because their use is predominantly tied to + * to the size of an integer, we are keeping that association and + * breaking free from pointer size guarantees. + * + * New use of these types is discouraged. + */ +typedef __darwin_natural_t natural_t; +typedef int integer_t; + +/* + * A vm_offset_t is a type-neutral pointer, + * e.g. an offset into a virtual memory space. + */ +#ifdef __LP64__ +typedef uintptr_t vm_offset_t ; +typedef uintptr_t vm_size_t; + +typedef uint64_t mach_vm_address_t ; +typedef uint64_t mach_vm_offset_t ; +typedef uint64_t mach_vm_size_t; + +typedef uint64_t vm_map_offset_t ; +typedef uint64_t vm_map_address_t ; +typedef uint64_t vm_map_size_t; +#else +typedef natural_t vm_offset_t ; +/* + * A vm_size_t is the proper type for e.g. + * expressing the difference between two + * vm_offset_t entities. + */ +typedef natural_t vm_size_t; + +/* + * This new type is independent of a particular vm map's + * implementation size - and represents appropriate types + * for all possible maps. This is used for interfaces + * where the size of the map is not known - or we don't + * want to have to distinguish. + */ +typedef uint64_t mach_vm_address_t ; +typedef uint64_t mach_vm_offset_t ; +typedef uint64_t mach_vm_size_t; + +typedef uint32_t vm_map_offset_t ; +typedef uint32_t vm_map_address_t ; +typedef uint32_t vm_map_size_t; +#endif /* __LP64__ */ + + +typedef uint32_t vm32_offset_t; +typedef uint32_t vm32_address_t; +typedef uint32_t vm32_size_t; + +typedef vm_offset_t mach_port_context_t; + +#ifdef MACH_KERNEL_PRIVATE +typedef vm32_offset_t mach_port_context32_t; +typedef mach_vm_offset_t mach_port_context64_t; +#endif + +#endif /* ASSEMBLER */ + +/* + * If composing messages by hand (please do not) + */ +#define MACH_MSG_TYPE_INTEGER_T MACH_MSG_TYPE_INTEGER_32 + +#endif /* defined (__arm__) || defined (__arm64__) || defined (__aarch64__) */ + +#endif /* _MACH_ARM_VM_TYPES_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/boolean.h b/src/third_party/mac_headers/mach/boolean.h new file mode 100644 index 0000000..ba88429 --- /dev/null +++ b/src/third_party/mac_headers/mach/boolean.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * @OSF_COPYRIGHT@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + */ +/* + * File: mach/boolean.h + * + * Boolean data type. + * + */ + +#ifndef _MACH_BOOLEAN_H_ +#define _MACH_BOOLEAN_H_ + +/* + * Pick up "boolean_t" type definition + */ + +#ifndef ASSEMBLER +#include +#endif /* ASSEMBLER */ + +/* + * Define TRUE and FALSE if not defined. + */ + +#ifndef TRUE +#define TRUE 1 +#endif /* TRUE */ + +#ifndef FALSE +#define FALSE 0 +#endif /* FALSE */ + +#endif /* _MACH_BOOLEAN_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/i386/boolean.h b/src/third_party/mac_headers/mach/i386/boolean.h new file mode 100644 index 0000000..b1d69a1 --- /dev/null +++ b/src/third_party/mac_headers/mach/i386/boolean.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * @OSF_COPYRIGHT@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + */ + +/* + * File: boolean.h + * + * Boolean type, for I386. + */ + +#ifndef _MACH_I386_BOOLEAN_H_ +#define _MACH_I386_BOOLEAN_H_ + +#if defined (__i386__) || defined (__x86_64__) + +#if defined(__x86_64__) && !defined(KERNEL) +typedef unsigned int boolean_t; +#else +typedef int boolean_t; +#endif + +#endif /* defined (__i386__) || defined (__x86_64__) */ + +#endif /* _MACH_I386_BOOLEAN_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/i386/vm_types.h b/src/third_party/mac_headers/mach/i386/vm_types.h new file mode 100644 index 0000000..0c3bb6b --- /dev/null +++ b/src/third_party/mac_headers/mach/i386/vm_types.h @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2000-2016 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * @OSF_COPYRIGHT@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + */ + +/* + * File: vm_types.h + * Author: Avadis Tevanian, Jr. + * Date: 1985 + * + * Header file for VM data types. I386 version. + */ + +#ifndef _MACH_I386_VM_TYPES_H_ +#define _MACH_I386_VM_TYPES_H_ + +#if defined (__i386__) || defined (__x86_64__) + +#ifndef ASSEMBLER + +#include +#include +#include + +/* + * natural_t and integer_t are Mach's legacy types for machine- + * independent integer types (unsigned, and signed, respectively). + * Their original purpose was to define other types in a machine/ + * compiler independent way. + * + * They also had an implicit "same size as pointer" characteristic + * to them (i.e. Mach's traditional types are very ILP32 or ILP64 + * centric). We support x86 ABIs that do not follow either of + * these models (specifically LP64). Therefore, we had to make a + * choice between making these types scale with pointers or stay + * tied to integers. Because their use is predominantly tied to + * to the size of an integer, we are keeping that association and + * breaking free from pointer size guarantees. + * + * New use of these types is discouraged. + */ +typedef __darwin_natural_t natural_t; +typedef int integer_t; + +/* + * A vm_offset_t is a type-neutral pointer, + * e.g. an offset into a virtual memory space. + */ +#ifdef __LP64__ +typedef uintptr_t vm_offset_t ; +#else /* __LP64__ */ +typedef natural_t vm_offset_t ; +#endif /* __LP64__ */ + +/* + * A vm_size_t is the proper type for e.g. + * expressing the difference between two + * vm_offset_t entities. + */ +#ifdef __LP64__ +typedef uintptr_t vm_size_t; +#else /* __LP64__ */ +typedef natural_t vm_size_t; +#endif /* __LP64__ */ + +/* + * This new type is independent of a particular vm map's + * implementation size - and represents appropriate types + * for all possible maps. This is used for interfaces + * where the size of the map is not known - or we don't + * want to have to distinguish. + */ +typedef uint64_t mach_vm_address_t ; +typedef uint64_t mach_vm_offset_t ; +typedef uint64_t mach_vm_size_t; + +typedef uint64_t vm_map_offset_t ; +typedef uint64_t vm_map_address_t ; +typedef uint64_t vm_map_size_t; + +typedef mach_vm_address_t mach_port_context_t; + +#ifdef MACH_KERNEL_PRIVATE + +/* + * These are types used internal to Mach to implement the + * legacy 32-bit VM APIs published by the kernel. + */ +typedef uint32_t vm32_address_t; +typedef uint32_t vm32_offset_t; +typedef uint32_t vm32_size_t; + +#endif /* MACH_KERNEL_PRIVATE */ + +#endif /* ASSEMBLER */ + +/* + * If composing messages by hand (please do not) + */ +#define MACH_MSG_TYPE_INTEGER_T MACH_MSG_TYPE_INTEGER_32 + +#endif /* defined (__i386__) || defined (__x86_64__) */ + +#endif /* _MACH_I386_VM_TYPES_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/machine.h b/src/third_party/mac_headers/mach/machine.h new file mode 100644 index 0000000..53457cc --- /dev/null +++ b/src/third_party/mac_headers/mach/machine.h @@ -0,0 +1,461 @@ +/* + * Copyright (c) 2007-2016 Apple, Inc. All rights reserved. + * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* File: machine.h + * Author: Avadis Tevanian, Jr. + * Date: 1986 + * + * Machine independent machine abstraction. + */ + +#ifndef _MACH_MACHINE_H_ +#define _MACH_MACHINE_H_ + +#ifndef __ASSEMBLER__ + +#include +#include +#include + +typedef integer_t cpu_type_t; +typedef integer_t cpu_subtype_t; +typedef integer_t cpu_threadtype_t; + +#define CPU_STATE_MAX 4 + +#define CPU_STATE_USER 0 +#define CPU_STATE_SYSTEM 1 +#define CPU_STATE_IDLE 2 +#define CPU_STATE_NICE 3 + +#ifdef KERNEL_PRIVATE + +#include + +__BEGIN_DECLS +cpu_type_t cpu_type(void); + +cpu_subtype_t cpu_subtype(void); + +cpu_threadtype_t cpu_threadtype(void); +__END_DECLS + +#ifdef MACH_KERNEL_PRIVATE + +struct machine_info { + integer_t major_version; /* kernel major version id */ + integer_t minor_version; /* kernel minor version id */ + integer_t max_cpus; /* max number of CPUs possible */ + uint32_t memory_size; /* size of memory in bytes, capped at 2 GB */ + uint64_t max_mem; /* actual size of physical memory */ + uint32_t physical_cpu; /* number of physical CPUs now available */ + integer_t physical_cpu_max; /* max number of physical CPUs possible */ + uint32_t logical_cpu; /* number of logical cpu now available */ + integer_t logical_cpu_max; /* max number of physical CPUs possible */ +}; + +typedef struct machine_info *machine_info_t; +typedef struct machine_info machine_info_data_t; + +extern struct machine_info machine_info; + +__BEGIN_DECLS +cpu_type_t slot_type( + int slot_num); + +cpu_subtype_t slot_subtype( + int slot_num); + +cpu_threadtype_t slot_threadtype( + int slot_num); +__END_DECLS + +#endif /* MACH_KERNEL_PRIVATE */ +#endif /* KERNEL_PRIVATE */ + + +/* + * Capability bits used in the definition of cpu_type. + */ +#define CPU_ARCH_MASK 0xff000000 /* mask for architecture bits */ +#define CPU_ARCH_ABI64 0x01000000 /* 64 bit ABI */ +#define CPU_ARCH_ABI64_32 0x02000000 /* ABI for 64-bit hardware with 32-bit types; LP32 */ + +/* + * Machine types known by all. + */ + +#define CPU_TYPE_ANY ((cpu_type_t) -1) + +#define CPU_TYPE_VAX ((cpu_type_t) 1) +/* skip ((cpu_type_t) 2) */ +/* skip ((cpu_type_t) 3) */ +/* skip ((cpu_type_t) 4) */ +/* skip ((cpu_type_t) 5) */ +#define CPU_TYPE_MC680x0 ((cpu_type_t) 6) +#define CPU_TYPE_X86 ((cpu_type_t) 7) +#define CPU_TYPE_I386 CPU_TYPE_X86 /* compatibility */ +#define CPU_TYPE_X86_64 (CPU_TYPE_X86 | CPU_ARCH_ABI64) + +/* skip CPU_TYPE_MIPS ((cpu_type_t) 8) */ +/* skip ((cpu_type_t) 9) */ +#define CPU_TYPE_MC98000 ((cpu_type_t) 10) +#define CPU_TYPE_HPPA ((cpu_type_t) 11) +#define CPU_TYPE_ARM ((cpu_type_t) 12) +#define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64) +#define CPU_TYPE_ARM64_32 (CPU_TYPE_ARM | CPU_ARCH_ABI64_32) +#define CPU_TYPE_MC88000 ((cpu_type_t) 13) +#define CPU_TYPE_SPARC ((cpu_type_t) 14) +#define CPU_TYPE_I860 ((cpu_type_t) 15) +/* skip CPU_TYPE_ALPHA ((cpu_type_t) 16) */ +/* skip ((cpu_type_t) 17) */ +#define CPU_TYPE_POWERPC ((cpu_type_t) 18) +#define CPU_TYPE_POWERPC64 (CPU_TYPE_POWERPC | CPU_ARCH_ABI64) +/* skip ((cpu_type_t) 19) */ +/* skip ((cpu_type_t) 20 */ +/* skip ((cpu_type_t) 21 */ +/* skip ((cpu_type_t) 22 */ +/* skip ((cpu_type_t) 23 */ + +/* + * Machine subtypes (these are defined here, instead of in a machine + * dependent directory, so that any program can get all definitions + * regardless of where is it compiled). + */ + +/* + * Capability bits used in the definition of cpu_subtype. + */ +#define CPU_SUBTYPE_MASK 0xff000000 /* mask for feature flags */ +#define CPU_SUBTYPE_LIB64 0x80000000 /* 64 bit libraries */ +#define CPU_SUBTYPE_PTRAUTH_ABI 0x80000000 /* pointer authentication with versioned ABI */ + +/* + * When selecting a slice, ANY will pick the slice with the best + * grading for the selected cpu_type_t, unlike the "ALL" subtypes, + * which are the slices that can run on any hardware for that cpu type. + */ +#define CPU_SUBTYPE_ANY ((cpu_subtype_t) -1) + +/* + * Object files that are hand-crafted to run on any + * implementation of an architecture are tagged with + * CPU_SUBTYPE_MULTIPLE. This functions essentially the same as + * the "ALL" subtype of an architecture except that it allows us + * to easily find object files that may need to be modified + * whenever a new implementation of an architecture comes out. + * + * It is the responsibility of the implementor to make sure the + * software handles unsupported implementations elegantly. + */ +#define CPU_SUBTYPE_MULTIPLE ((cpu_subtype_t) -1) +#define CPU_SUBTYPE_LITTLE_ENDIAN ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_BIG_ENDIAN ((cpu_subtype_t) 1) + +/* + * Machine threadtypes. + * This is none - not defined - for most machine types/subtypes. + */ +#define CPU_THREADTYPE_NONE ((cpu_threadtype_t) 0) + +/* + * VAX subtypes (these do *not* necessary conform to the actual cpu + * ID assigned by DEC available via the SID register). + */ + +#define CPU_SUBTYPE_VAX_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_VAX780 ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_VAX785 ((cpu_subtype_t) 2) +#define CPU_SUBTYPE_VAX750 ((cpu_subtype_t) 3) +#define CPU_SUBTYPE_VAX730 ((cpu_subtype_t) 4) +#define CPU_SUBTYPE_UVAXI ((cpu_subtype_t) 5) +#define CPU_SUBTYPE_UVAXII ((cpu_subtype_t) 6) +#define CPU_SUBTYPE_VAX8200 ((cpu_subtype_t) 7) +#define CPU_SUBTYPE_VAX8500 ((cpu_subtype_t) 8) +#define CPU_SUBTYPE_VAX8600 ((cpu_subtype_t) 9) +#define CPU_SUBTYPE_VAX8650 ((cpu_subtype_t) 10) +#define CPU_SUBTYPE_VAX8800 ((cpu_subtype_t) 11) +#define CPU_SUBTYPE_UVAXIII ((cpu_subtype_t) 12) + +/* + * 680x0 subtypes + * + * The subtype definitions here are unusual for historical reasons. + * NeXT used to consider 68030 code as generic 68000 code. For + * backwards compatability: + * + * CPU_SUBTYPE_MC68030 symbol has been preserved for source code + * compatability. + * + * CPU_SUBTYPE_MC680x0_ALL has been defined to be the same + * subtype as CPU_SUBTYPE_MC68030 for binary comatability. + * + * CPU_SUBTYPE_MC68030_ONLY has been added to allow new object + * files to be tagged as containing 68030-specific instructions. + */ + +#define CPU_SUBTYPE_MC680x0_ALL ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_MC68030 ((cpu_subtype_t) 1) /* compat */ +#define CPU_SUBTYPE_MC68040 ((cpu_subtype_t) 2) +#define CPU_SUBTYPE_MC68030_ONLY ((cpu_subtype_t) 3) + +/* + * I386 subtypes + */ + +#define CPU_SUBTYPE_INTEL(f, m) ((cpu_subtype_t) (f) + ((m) << 4)) + +#define CPU_SUBTYPE_I386_ALL CPU_SUBTYPE_INTEL(3, 0) +#define CPU_SUBTYPE_386 CPU_SUBTYPE_INTEL(3, 0) +#define CPU_SUBTYPE_486 CPU_SUBTYPE_INTEL(4, 0) +#define CPU_SUBTYPE_486SX CPU_SUBTYPE_INTEL(4, 8) // 8 << 4 = 128 +#define CPU_SUBTYPE_586 CPU_SUBTYPE_INTEL(5, 0) +#define CPU_SUBTYPE_PENT CPU_SUBTYPE_INTEL(5, 0) +#define CPU_SUBTYPE_PENTPRO CPU_SUBTYPE_INTEL(6, 1) +#define CPU_SUBTYPE_PENTII_M3 CPU_SUBTYPE_INTEL(6, 3) +#define CPU_SUBTYPE_PENTII_M5 CPU_SUBTYPE_INTEL(6, 5) +#define CPU_SUBTYPE_CELERON CPU_SUBTYPE_INTEL(7, 6) +#define CPU_SUBTYPE_CELERON_MOBILE CPU_SUBTYPE_INTEL(7, 7) +#define CPU_SUBTYPE_PENTIUM_3 CPU_SUBTYPE_INTEL(8, 0) +#define CPU_SUBTYPE_PENTIUM_3_M CPU_SUBTYPE_INTEL(8, 1) +#define CPU_SUBTYPE_PENTIUM_3_XEON CPU_SUBTYPE_INTEL(8, 2) +#define CPU_SUBTYPE_PENTIUM_M CPU_SUBTYPE_INTEL(9, 0) +#define CPU_SUBTYPE_PENTIUM_4 CPU_SUBTYPE_INTEL(10, 0) +#define CPU_SUBTYPE_PENTIUM_4_M CPU_SUBTYPE_INTEL(10, 1) +#define CPU_SUBTYPE_ITANIUM CPU_SUBTYPE_INTEL(11, 0) +#define CPU_SUBTYPE_ITANIUM_2 CPU_SUBTYPE_INTEL(11, 1) +#define CPU_SUBTYPE_XEON CPU_SUBTYPE_INTEL(12, 0) +#define CPU_SUBTYPE_XEON_MP CPU_SUBTYPE_INTEL(12, 1) + +#define CPU_SUBTYPE_INTEL_FAMILY(x) ((x) & 15) +#define CPU_SUBTYPE_INTEL_FAMILY_MAX 15 + +#define CPU_SUBTYPE_INTEL_MODEL(x) ((x) >> 4) +#define CPU_SUBTYPE_INTEL_MODEL_ALL 0 + +/* + * X86 subtypes. + */ + +#define CPU_SUBTYPE_X86_ALL ((cpu_subtype_t)3) +#define CPU_SUBTYPE_X86_64_ALL ((cpu_subtype_t)3) +#define CPU_SUBTYPE_X86_ARCH1 ((cpu_subtype_t)4) +#define CPU_SUBTYPE_X86_64_H ((cpu_subtype_t)8) /* Haswell feature subset */ + + +#define CPU_THREADTYPE_INTEL_HTT ((cpu_threadtype_t) 1) + +/* + * Mips subtypes. + */ + +#define CPU_SUBTYPE_MIPS_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_MIPS_R2300 ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_MIPS_R2600 ((cpu_subtype_t) 2) +#define CPU_SUBTYPE_MIPS_R2800 ((cpu_subtype_t) 3) +#define CPU_SUBTYPE_MIPS_R2000a ((cpu_subtype_t) 4) /* pmax */ +#define CPU_SUBTYPE_MIPS_R2000 ((cpu_subtype_t) 5) +#define CPU_SUBTYPE_MIPS_R3000a ((cpu_subtype_t) 6) /* 3max */ +#define CPU_SUBTYPE_MIPS_R3000 ((cpu_subtype_t) 7) + +/* + * MC98000 (PowerPC) subtypes + */ +#define CPU_SUBTYPE_MC98000_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_MC98601 ((cpu_subtype_t) 1) + +/* + * HPPA subtypes for Hewlett-Packard HP-PA family of + * risc processors. Port by NeXT to 700 series. + */ + +#define CPU_SUBTYPE_HPPA_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_HPPA_7100 ((cpu_subtype_t) 0) /* compat */ +#define CPU_SUBTYPE_HPPA_7100LC ((cpu_subtype_t) 1) + +/* + * MC88000 subtypes. + */ +#define CPU_SUBTYPE_MC88000_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_MC88100 ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_MC88110 ((cpu_subtype_t) 2) + +/* + * SPARC subtypes + */ +#define CPU_SUBTYPE_SPARC_ALL ((cpu_subtype_t) 0) + +/* + * I860 subtypes + */ +#define CPU_SUBTYPE_I860_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_I860_860 ((cpu_subtype_t) 1) + +/* + * PowerPC subtypes + */ +#define CPU_SUBTYPE_POWERPC_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_POWERPC_601 ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_POWERPC_602 ((cpu_subtype_t) 2) +#define CPU_SUBTYPE_POWERPC_603 ((cpu_subtype_t) 3) +#define CPU_SUBTYPE_POWERPC_603e ((cpu_subtype_t) 4) +#define CPU_SUBTYPE_POWERPC_603ev ((cpu_subtype_t) 5) +#define CPU_SUBTYPE_POWERPC_604 ((cpu_subtype_t) 6) +#define CPU_SUBTYPE_POWERPC_604e ((cpu_subtype_t) 7) +#define CPU_SUBTYPE_POWERPC_620 ((cpu_subtype_t) 8) +#define CPU_SUBTYPE_POWERPC_750 ((cpu_subtype_t) 9) +#define CPU_SUBTYPE_POWERPC_7400 ((cpu_subtype_t) 10) +#define CPU_SUBTYPE_POWERPC_7450 ((cpu_subtype_t) 11) +#define CPU_SUBTYPE_POWERPC_970 ((cpu_subtype_t) 100) + +/* + * ARM subtypes + */ +#define CPU_SUBTYPE_ARM_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_ARM_V4T ((cpu_subtype_t) 5) +#define CPU_SUBTYPE_ARM_V6 ((cpu_subtype_t) 6) +#define CPU_SUBTYPE_ARM_V5TEJ ((cpu_subtype_t) 7) +#define CPU_SUBTYPE_ARM_XSCALE ((cpu_subtype_t) 8) +#define CPU_SUBTYPE_ARM_V7 ((cpu_subtype_t) 9) /* ARMv7-A and ARMv7-R */ +#define CPU_SUBTYPE_ARM_V7F ((cpu_subtype_t) 10) /* Cortex A9 */ +#define CPU_SUBTYPE_ARM_V7S ((cpu_subtype_t) 11) /* Swift */ +#define CPU_SUBTYPE_ARM_V7K ((cpu_subtype_t) 12) +#define CPU_SUBTYPE_ARM_V8 ((cpu_subtype_t) 13) +#define CPU_SUBTYPE_ARM_V6M ((cpu_subtype_t) 14) /* Not meant to be run under xnu */ +#define CPU_SUBTYPE_ARM_V7M ((cpu_subtype_t) 15) /* Not meant to be run under xnu */ +#define CPU_SUBTYPE_ARM_V7EM ((cpu_subtype_t) 16) /* Not meant to be run under xnu */ +#define CPU_SUBTYPE_ARM_V8M ((cpu_subtype_t) 17) /* Not meant to be run under xnu */ + +/* + * ARM64 subtypes + */ +#define CPU_SUBTYPE_ARM64_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_ARM64_V8 ((cpu_subtype_t) 1) +#define CPU_SUBTYPE_ARM64E ((cpu_subtype_t) 2) + +/* CPU subtype feature flags for ptrauth on arm64e platforms */ +#define CPU_SUBTYPE_ARM64_PTR_AUTH_MASK 0x0f000000 +#define CPU_SUBTYPE_ARM64_PTR_AUTH_VERSION(x) (((x) & CPU_SUBTYPE_ARM64_PTR_AUTH_MASK) >> 24) +#ifdef PRIVATE +#define CPU_SUBTYPE_ARM64_PTR_AUTH_CURRENT_VERSION 0 +#endif /* PRIVATE */ + +/* + * ARM64_32 subtypes + */ +#define CPU_SUBTYPE_ARM64_32_ALL ((cpu_subtype_t) 0) +#define CPU_SUBTYPE_ARM64_32_V8 ((cpu_subtype_t) 1) + +#endif /* !__ASSEMBLER__ */ + +/* + * CPU families (sysctl hw.cpufamily) + * + * These are meant to identify the CPU's marketing name - an + * application can map these to (possibly) localized strings. + * NB: the encodings of the CPU families are intentionally arbitrary. + * There is no ordering, and you should never try to deduce whether + * or not some feature is available based on the family. + * Use feature flags (eg, hw.optional.altivec) to test for optional + * functionality. + */ +#define CPUFAMILY_UNKNOWN 0 +#define CPUFAMILY_POWERPC_G3 0xcee41549 +#define CPUFAMILY_POWERPC_G4 0x77c184ae +#define CPUFAMILY_POWERPC_G5 0xed76d8aa +#define CPUFAMILY_INTEL_6_13 0xaa33392b +#define CPUFAMILY_INTEL_PENRYN 0x78ea4fbc +#define CPUFAMILY_INTEL_NEHALEM 0x6b5a4cd2 +#define CPUFAMILY_INTEL_WESTMERE 0x573b5eec +#define CPUFAMILY_INTEL_SANDYBRIDGE 0x5490b78c +#define CPUFAMILY_INTEL_IVYBRIDGE 0x1f65e835 +#define CPUFAMILY_INTEL_HASWELL 0x10b282dc +#define CPUFAMILY_INTEL_BROADWELL 0x582ed09c +#define CPUFAMILY_INTEL_SKYLAKE 0x37fc219f +#define CPUFAMILY_INTEL_KABYLAKE 0x0f817246 +#define CPUFAMILY_INTEL_ICELAKE 0x38435547 +#define CPUFAMILY_ARM_9 0xe73283ae +#define CPUFAMILY_ARM_11 0x8ff620d8 +#define CPUFAMILY_ARM_XSCALE 0x53b005f5 +#define CPUFAMILY_ARM_12 0xbd1b0ae9 +#define CPUFAMILY_ARM_13 0x0cc90e64 +#define CPUFAMILY_ARM_14 0x96077ef1 +#define CPUFAMILY_ARM_15 0xa8511bca +#define CPUFAMILY_ARM_SWIFT 0x1e2d6381 +#define CPUFAMILY_ARM_CYCLONE 0x37a09642 +#define CPUFAMILY_ARM_TYPHOON 0x2c91a47e +#define CPUFAMILY_ARM_TWISTER 0x92fb37c8 +#define CPUFAMILY_ARM_HURRICANE 0x67ceee93 +#define CPUFAMILY_ARM_MONSOON_MISTRAL 0xe81e7ef6 +#define CPUFAMILY_ARM_VORTEX_TEMPEST 0x07d34b9f +#define CPUFAMILY_ARM_LIGHTNING_THUNDER 0x462504d2 +#ifndef RC_HIDE_XNU_FIRESTORM +#define CPUFAMILY_ARM_FIRESTORM_ICESTORM 0x1b588bb3 +#endif /* !RC_HIDE_XNU_FIRESTORM */ + +/* Described in rdar://64125549 */ +#define CPUSUBFAMILY_UNKNOWN 0 +#define CPUSUBFAMILY_ARM_HP 1 +#define CPUSUBFAMILY_ARM_HG 2 +#define CPUSUBFAMILY_ARM_M 3 +#ifndef RC_HIDE_XNU_FIRESTORM +#define CPUSUBFAMILY_ARM_HS 4 +#define CPUSUBFAMILY_ARM_HC_HD 5 +#endif /* !RC_HIDE_XNU_FIRESTORM */ + +/* The following synonyms are deprecated: */ +#define CPUFAMILY_INTEL_6_23 CPUFAMILY_INTEL_PENRYN +#define CPUFAMILY_INTEL_6_26 CPUFAMILY_INTEL_NEHALEM + + +#endif /* _MACH_MACHINE_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/machine/boolean.h b/src/third_party/mac_headers/mach/machine/boolean.h new file mode 100644 index 0000000..adca083 --- /dev/null +++ b/src/third_party/mac_headers/mach/machine/boolean.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2000-2007 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _MACH_MACHINE_BOOLEAN_H_ +#define _MACH_MACHINE_BOOLEAN_H_ + +#if defined (__i386__) || defined(__x86_64__) +#include "mach/i386/boolean.h" +#elif defined (__arm__) || defined (__arm64__) || defined(__aarch64__) +#include "mach/arm/boolean.h" +#else +#error architecture not supported +#endif + +#endif /* _MACH_MACHINE_BOOLEAN_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/machine/thread_state.h b/src/third_party/mac_headers/mach/machine/thread_state.h new file mode 100644 index 0000000..fceb427 --- /dev/null +++ b/src/third_party/mac_headers/mach/machine/thread_state.h @@ -0,0 +1,9 @@ +/* + * This file is a stub with the bare minimum needed to make things work. + */ +#ifndef _MACH_MACHINE_THREAD_STATE_H_ +#define _MACH_MACHINE_THREAD_STATE_H_ + +#define THREAD_STATE_MAX 1 + +#endif /* _MACH_MACHINE_THREAD_STATE_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/machine/thread_status.h b/src/third_party/mac_headers/mach/machine/thread_status.h new file mode 100644 index 0000000..4309afd --- /dev/null +++ b/src/third_party/mac_headers/mach/machine/thread_status.h @@ -0,0 +1 @@ +/* This file intentionally left blank */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/machine/vm_types.h b/src/third_party/mac_headers/mach/machine/vm_types.h new file mode 100644 index 0000000..7ee7ac8 --- /dev/null +++ b/src/third_party/mac_headers/mach/machine/vm_types.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2000-2007 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ + +#ifndef _MACH_MACHINE_VM_TYPES_H_ +#define _MACH_MACHINE_VM_TYPES_H_ + +#if defined (__i386__) || defined(__x86_64__) +#include "mach/i386/vm_types.h" +#elif defined (__arm__) || defined (__arm64__) || defined(__aarch64__) +#include "mach/arm/vm_types.h" +#else +#error architecture not supported +#endif + +#endif /* _MACH_MACHINE_VM_TYPES_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/thread_status.h b/src/third_party/mac_headers/mach/thread_status.h new file mode 100644 index 0000000..f742500 --- /dev/null +++ b/src/third_party/mac_headers/mach/thread_status.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * @OSF_COPYRIGHT@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + */ +/* + * File: mach/thread_status.h + * Author: Avadis Tevanian, Jr. + * + * This file contains the structure definitions for the user-visible + * thread state. This thread state is examined with the thread_get_state + * kernel call and may be changed with the thread_set_state kernel call. + * + */ + +#ifndef _MACH_THREAD_STATUS_H_ +#define _MACH_THREAD_STATUS_H_ + +/* + * The actual structure that comprises the thread state is defined + * in the machine dependent module. + */ +#include +#include +#include + +/* + * Generic definition for machine-dependent thread status. + */ + +typedef natural_t *thread_state_t; /* Variable-length array */ + +/* THREAD_STATE_MAX is now defined in */ +typedef natural_t thread_state_data_t[THREAD_STATE_MAX]; + +#define THREAD_STATE_FLAVOR_LIST 0 /* List of valid flavors */ +#define THREAD_STATE_FLAVOR_LIST_NEW 128 +#define THREAD_STATE_FLAVOR_LIST_10_9 129 +#define THREAD_STATE_FLAVOR_LIST_10_13 130 +#define THREAD_STATE_FLAVOR_LIST_10_15 131 + +typedef int thread_state_flavor_t; +typedef thread_state_flavor_t *thread_state_flavor_array_t; + +#define THREAD_CONVERT_THREAD_STATE_TO_SELF 1 +#define THREAD_CONVERT_THREAD_STATE_FROM_SELF 2 + +#endif /* _MACH_THREAD_STATUS_H_ */ \ No newline at end of file diff --git a/src/third_party/mac_headers/mach/vm_prot.h b/src/third_party/mac_headers/mach/vm_prot.h new file mode 100644 index 0000000..b19c8e2 --- /dev/null +++ b/src/third_party/mac_headers/mach/vm_prot.h @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2000-2021 Apple Computer, Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * @OSF_COPYRIGHT@ + */ +/* + * Mach Operating System + * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ +/* + */ +/* + * File: mach/vm_prot.h + * Author: Avadis Tevanian, Jr., Michael Wayne Young + * + * Virtual memory protection definitions. + * + */ + +#ifndef _MACH_VM_PROT_H_ +#define _MACH_VM_PROT_H_ + +/* + * Types defined: + * + * vm_prot_t VM protection values. + */ + +typedef int vm_prot_t; + +/* + * Protection values, defined as bits within the vm_prot_t type + */ + +#define VM_PROT_NONE ((vm_prot_t) 0x00) + +#define VM_PROT_READ ((vm_prot_t) 0x01) /* read permission */ +#define VM_PROT_WRITE ((vm_prot_t) 0x02) /* write permission */ +#define VM_PROT_EXECUTE ((vm_prot_t) 0x04) /* execute permission */ + +/* + * The default protection for newly-created virtual memory + */ + +#define VM_PROT_DEFAULT (VM_PROT_READ|VM_PROT_WRITE) + +/* + * The maximum privileges possible, for parameter checking. + */ + +#define VM_PROT_ALL (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE) + +/* + * This is an alias to VM_PROT_EXECUTE to identify callers that + * want to allocate an hardware assisted Read-only/read-write + * trusted path in userland. + */ +#define VM_PROT_RORW_TP (VM_PROT_EXECUTE) + +/* + * An invalid protection value. + * Used only by memory_object_lock_request to indicate no change + * to page locks. Using -1 here is a bad idea because it + * looks like VM_PROT_ALL and then some. + */ + +#define VM_PROT_NO_CHANGE_LEGACY ((vm_prot_t) 0x08) +#define VM_PROT_NO_CHANGE ((vm_prot_t) 0x01000000) + +/* + * When a caller finds that he cannot obtain write permission on a + * mapped entry, the following flag can be used. The entry will + * be made "needs copy" effectively copying the object (using COW), + * and write permission will be added to the maximum protections + * for the associated entry. + */ + +#define VM_PROT_COPY ((vm_prot_t) 0x10) + + +/* + * Another invalid protection value. + * Used only by memory_object_data_request upon an object + * which has specified a copy_call copy strategy. It is used + * when the kernel wants a page belonging to a copy of the + * object, and is only asking the object as a result of + * following a shadow chain. This solves the race between pages + * being pushed up by the memory manager and the kernel + * walking down the shadow chain. + */ + +#define VM_PROT_WANTS_COPY ((vm_prot_t) 0x10) + +#ifdef PRIVATE +/* + * The caller wants this memory region treated as if it had a valid + * code signature. + */ + +#define VM_PROT_TRUSTED ((vm_prot_t) 0x20) +#endif /* PRIVATE */ + +/* + * Another invalid protection value. + * Indicates that the other protection bits are to be applied as a mask + * against the actual protection bits of the map entry. + */ +#define VM_PROT_IS_MASK ((vm_prot_t) 0x40) + +/* + * Another invalid protection value to support execute-only protection. + * VM_PROT_STRIP_READ is a special marker that tells mprotect to not + * set VM_PROT_READ. We have to do it this way because existing code + * expects the system to set VM_PROT_READ if VM_PROT_EXECUTE is set. + * VM_PROT_EXECUTE_ONLY is just a convenience value to indicate that + * the memory should be executable and explicitly not readable. It will + * be ignored on platforms that do not support this type of protection. + */ +#define VM_PROT_STRIP_READ ((vm_prot_t) 0x80) +#define VM_PROT_EXECUTE_ONLY (VM_PROT_EXECUTE|VM_PROT_STRIP_READ) + +#ifdef PRIVATE +/* + * When using VM_PROT_COPY, fail instead of copying an executable mapping, + * since that could cause code-signing violations. + */ +#define VM_PROT_COPY_FAIL_IF_EXECUTABLE ((vm_prot_t)0x100) +#endif /* PRIVATE */ + +#if defined(__x86_64__) +/* + * Another invalid protection value to support specifying different + * execute permissions for user- and supervisor- modes. When + * MBE is enabled in a VM, VM_PROT_EXECUTE is used to indicate + * supervisor-mode execute permission, and VM_PROT_UEXEC specifies + * user-mode execute permission. Currently only used by the + * x86 Hypervisor kext. + */ +#define VM_PROT_UEXEC ((vm_prot_t) 0x8) /* User-mode Execute Permission */ + +#define VM_PROT_ALLEXEC (VM_PROT_EXECUTE | VM_PROT_UEXEC) +#else +#define VM_PROT_ALLEXEC (VM_PROT_EXECUTE) +#endif /* defined(__x86_64__) */ + + +#endif /* _MACH_VM_PROT_H_ */ \ No newline at end of file diff --git a/src/third_party/musl/COPYRIGHT b/src/third_party/musl/COPYRIGHT new file mode 100644 index 0000000..f0ee3b7 --- /dev/null +++ b/src/third_party/musl/COPYRIGHT @@ -0,0 +1,163 @@ +musl as a whole is licensed under the following standard MIT license: + +---------------------------------------------------------------------- +Copyright © 2005-2014 Rich Felker, et al. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +---------------------------------------------------------------------- + +Authors/contributors include: + +Alex Dowad +Alexander Monakov +Anthony G. Basile +Arvid Picciani +Bobby Bingham +Boris Brezillon +Brent Cook +Chris Spiegel +Clément Vasseur +Daniel Micay +Denys Vlasenko +Emil Renner Berthing +Felix Fietkau +Felix Janda +Gianluca Anzolin +Hauke Mehrtens +Hiltjo Posthuma +Isaac Dunham +Jaydeep Patil +Jens Gustedt +Jeremy Huntwork +Jo-Philipp Wich +Joakim Sindholt +John Spencer +Josiah Worcester +Justin Cormack +Khem Raj +Kylie McClain +Luca Barbato +Luka Perkov +M Farkas-Dyck (Strake) +Mahesh Bodapati +Michael Forney +Natanael Copa +Nicholas J. Kain +orc +Pascal Cuoq +Petr Hosek +Pierre Carrier +Rich Felker +Richard Pennington +Shiz +sin +Solar Designer +Stefan Kristiansson +Szabolcs Nagy +Timo Teräs +Trutz Behn +Valentin Ochs +William Haddon + +Portions of this software are derived from third-party works licensed +under terms compatible with the above MIT license: + +The TRE regular expression implementation (src/regex/reg* and +src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed +under a 2-clause BSD license (license text in the source files). The +included version has been heavily modified by Rich Felker in 2012, in +the interests of size, simplicity, and namespace cleanliness. + +Much of the math library code (src/math/* and src/complex/*) is +Copyright © 1993,2004 Sun Microsystems or +Copyright © 2003-2011 David Schultz or +Copyright © 2003-2009 Steven G. Kargl or +Copyright © 2003-2009 Bruce D. Evans or +Copyright © 2008 Stephen L. Moshier +and labelled as such in comments in the individual source files. All +have been licensed under extremely permissive terms. + +The ARM memcpy code (src/string/arm/memcpy_el.S) is Copyright © 2008 +The Android Open Source Project and is licensed under a two-clause BSD +license. It was taken from Bionic libc, used on Android. + +The implementation of DES for crypt (src/crypt/crypt_des.c) is +Copyright © 1994 David Burren. It is licensed under a BSD license. + +The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was +originally written by Solar Designer and placed into the public +domain. The code also comes with a fallback permissive license for use +in jurisdictions that may not recognize the public domain. + +The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011 +Valentin Ochs and is licensed under an MIT-style license. + +The BSD PRNG implementation (src/prng/random.c) and XSI search API +(src/search/*.c) functions are Copyright © 2011 Szabolcs Nagy and +licensed under following terms: "Permission to use, copy, modify, +and/or distribute this code for any purpose with or without fee is +hereby granted. There is no warranty." + +The x86_64 port was written by Nicholas J. Kain and is licensed under +the standard MIT terms. + +The mips and microblaze ports were originally written by Richard +Pennington for use in the ellcc project. The original code was adapted +by Rich Felker for build system and code conventions during upstream +integration. It is licensed under the standard MIT terms. + +The mips64 port was contributed by Imagination Technologies and is +licensed under the standard MIT terms. + +The powerpc port was also originally written by Richard Pennington, +and later supplemented and integrated by John Spencer. It is licensed +under the standard MIT terms. + +All other files which have no copyright comments are original works +produced specifically for use as part of this library, written either +by Rich Felker, the main author of the library, or by one or more +contibutors listed above. Details on authorship of individual files +can be found in the git version control history of the project. The +omission of copyright and license comments in each file is in the +interest of source tree size. + +In addition, permission is hereby granted for all public header files +(include/* and arch/*/bits/*) and crt files intended to be linked into +applications (crt/*, ldso/dlstart.c, and arch/*/crt_arch.h) to omit +the copyright notice and permission notice otherwise required by the +license, and to use these files without any requirement of +attribution. These files include substantial contributions from: + +Bobby Bingham +John Spencer +Nicholas J. Kain +Rich Felker +Richard Pennington +Stefan Kristiansson +Szabolcs Nagy + +all of whom have explicitly granted such permission. + +This file previously contained text expressing a belief that most of +the files covered by the above exception were sufficiently trivial not +to be subject to copyright, resulting in confusion over whether it +negated the permissions granted in the license. In the spirit of +permissive licensing, and of not having licensing issues being an +obstacle to adoption, that text has been removed. diff --git a/src/third_party/musl/README b/src/third_party/musl/README new file mode 100644 index 0000000..a30eb11 --- /dev/null +++ b/src/third_party/musl/README @@ -0,0 +1,23 @@ + + musl libc + +musl, pronounced like the word "mussel", is an MIT-licensed +implementation of the standard C library targetting the Linux syscall +API, suitable for use in a wide range of deployment environments. musl +offers efficient static and dynamic linking support, lightweight code +and low runtime overhead, strong fail-safe guarantees under correct +usage, and correctness in the sense of standards conformance and +safety. musl is built on the principle that these goals are best +achieved through simple code that is easy to understand and maintain. + +The 1.1 release series for musl features coverage for all interfaces +defined in ISO C99 and POSIX 2008 base, along with a number of +non-standardized interfaces for compatibility with Linux, BSD, and +glibc functionality. + +For basic installation instructions, see the included INSTALL file. +Information on full musl-targeted compiler toolchains, system +bootstrapping, and Linux distributions built on musl can be found on +the project website: + + http://www.musl-libc.org/ diff --git a/src/third_party/musl/README.breakpad b/src/third_party/musl/README.breakpad new file mode 100644 index 0000000..f500c43 --- /dev/null +++ b/src/third_party/musl/README.breakpad @@ -0,0 +1,3 @@ +This directory contains the elf header from +https://git.musl-libc.org/cgit/musl/tree/ +that is required to get ELF working in dump_syms on Mac OS X. diff --git a/src/third_party/musl/VERSION b/src/third_party/musl/VERSION new file mode 100644 index 0000000..e9bc149 --- /dev/null +++ b/src/third_party/musl/VERSION @@ -0,0 +1 @@ +1.1.14 diff --git a/src/third_party/musl/include/elf.h b/src/third_party/musl/include/elf.h new file mode 100644 index 0000000..8b3cd3e --- /dev/null +++ b/src/third_party/musl/include/elf.h @@ -0,0 +1,2827 @@ +#ifndef _ELF_H +#define _ELF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef uint16_t Elf32_Half; +typedef uint16_t Elf64_Half; + +typedef uint32_t Elf32_Word; +typedef int32_t Elf32_Sword; +typedef uint32_t Elf64_Word; +typedef int32_t Elf64_Sword; + +typedef uint64_t Elf32_Xword; +typedef int64_t Elf32_Sxword; +typedef uint64_t Elf64_Xword; +typedef int64_t Elf64_Sxword; + +typedef uint32_t Elf32_Addr; +typedef uint64_t Elf64_Addr; + +typedef uint32_t Elf32_Off; +typedef uint64_t Elf64_Off; + +typedef uint16_t Elf32_Section; +typedef uint16_t Elf64_Section; + +typedef Elf32_Half Elf32_Versym; +typedef Elf64_Half Elf64_Versym; + +#define EI_NIDENT (16) + +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +} Elf32_Ehdr; + +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +} Elf64_Ehdr; + +#define EI_MAG0 0 +#define ELFMAG0 0x7f + +#define EI_MAG1 1 +#define ELFMAG1 'E' + +#define EI_MAG2 2 +#define ELFMAG2 'L' + +#define EI_MAG3 3 +#define ELFMAG3 'F' + + +#define ELFMAG "\177ELF" +#define SELFMAG 4 + +#define EI_CLASS 4 +#define ELFCLASSNONE 0 +#define ELFCLASS32 1 +#define ELFCLASS64 2 +#define ELFCLASSNUM 3 + +#define EI_DATA 5 +#define ELFDATANONE 0 +#define ELFDATA2LSB 1 +#define ELFDATA2MSB 2 +#define ELFDATANUM 3 + +#define EI_VERSION 6 + + +#define EI_OSABI 7 +#define ELFOSABI_NONE 0 +#define ELFOSABI_SYSV 0 +#define ELFOSABI_HPUX 1 +#define ELFOSABI_NETBSD 2 +#define ELFOSABI_LINUX 3 +#define ELFOSABI_GNU 3 +#define ELFOSABI_SOLARIS 6 +#define ELFOSABI_AIX 7 +#define ELFOSABI_IRIX 8 +#define ELFOSABI_FREEBSD 9 +#define ELFOSABI_TRU64 10 +#define ELFOSABI_MODESTO 11 +#define ELFOSABI_OPENBSD 12 +#define ELFOSABI_ARM 97 +#define ELFOSABI_STANDALONE 255 + +#define EI_ABIVERSION 8 + +#define EI_PAD 9 + + + +#define ET_NONE 0 +#define ET_REL 1 +#define ET_EXEC 2 +#define ET_DYN 3 +#define ET_CORE 4 +#define ET_NUM 5 +#define ET_LOOS 0xfe00 +#define ET_HIOS 0xfeff +#define ET_LOPROC 0xff00 +#define ET_HIPROC 0xffff + + + +#define EM_NONE 0 +#define EM_M32 1 +#define EM_SPARC 2 +#define EM_386 3 +#define EM_68K 4 +#define EM_88K 5 +#define EM_860 7 +#define EM_MIPS 8 +#define EM_S370 9 +#define EM_MIPS_RS3_LE 10 + +#define EM_PARISC 15 +#define EM_VPP500 17 +#define EM_SPARC32PLUS 18 +#define EM_960 19 +#define EM_PPC 20 +#define EM_PPC64 21 +#define EM_S390 22 + +#define EM_V800 36 +#define EM_FR20 37 +#define EM_RH32 38 +#define EM_RCE 39 +#define EM_ARM 40 +#define EM_FAKE_ALPHA 41 +#define EM_SH 42 +#define EM_SPARCV9 43 +#define EM_TRICORE 44 +#define EM_ARC 45 +#define EM_H8_300 46 +#define EM_H8_300H 47 +#define EM_H8S 48 +#define EM_H8_500 49 +#define EM_IA_64 50 +#define EM_MIPS_X 51 +#define EM_COLDFIRE 52 +#define EM_68HC12 53 +#define EM_MMA 54 +#define EM_PCP 55 +#define EM_NCPU 56 +#define EM_NDR1 57 +#define EM_STARCORE 58 +#define EM_ME16 59 +#define EM_ST100 60 +#define EM_TINYJ 61 +#define EM_X86_64 62 +#define EM_PDSP 63 + +#define EM_FX66 66 +#define EM_ST9PLUS 67 +#define EM_ST7 68 +#define EM_68HC16 69 +#define EM_68HC11 70 +#define EM_68HC08 71 +#define EM_68HC05 72 +#define EM_SVX 73 +#define EM_ST19 74 +#define EM_VAX 75 +#define EM_CRIS 76 +#define EM_JAVELIN 77 +#define EM_FIREPATH 78 +#define EM_ZSP 79 +#define EM_MMIX 80 +#define EM_HUANY 81 +#define EM_PRISM 82 +#define EM_AVR 83 +#define EM_FR30 84 +#define EM_D10V 85 +#define EM_D30V 86 +#define EM_V850 87 +#define EM_M32R 88 +#define EM_MN10300 89 +#define EM_MN10200 90 +#define EM_PJ 91 +#define EM_OR1K 92 +#define EM_ARC_A5 93 +#define EM_XTENSA 94 +#define EM_AARCH64 183 +#define EM_TILEPRO 188 +#define EM_MICROBLAZE 189 +#define EM_TILEGX 191 +#define EM_NUM 192 +#define EM_ALPHA 0x9026 + +#define EV_NONE 0 +#define EV_CURRENT 1 +#define EV_NUM 2 + +typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +} Elf32_Shdr; + +typedef struct { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +} Elf64_Shdr; + + + +#define SHN_UNDEF 0 +#define SHN_LORESERVE 0xff00 +#define SHN_LOPROC 0xff00 +#define SHN_BEFORE 0xff00 + +#define SHN_AFTER 0xff01 + +#define SHN_HIPROC 0xff1f +#define SHN_LOOS 0xff20 +#define SHN_HIOS 0xff3f +#define SHN_ABS 0xfff1 +#define SHN_COMMON 0xfff2 +#define SHN_XINDEX 0xffff +#define SHN_HIRESERVE 0xffff + + + +#define SHT_NULL 0 +#define SHT_PROGBITS 1 +#define SHT_SYMTAB 2 +#define SHT_STRTAB 3 +#define SHT_RELA 4 +#define SHT_HASH 5 +#define SHT_DYNAMIC 6 +#define SHT_NOTE 7 +#define SHT_NOBITS 8 +#define SHT_REL 9 +#define SHT_SHLIB 10 +#define SHT_DYNSYM 11 +#define SHT_INIT_ARRAY 14 +#define SHT_FINI_ARRAY 15 +#define SHT_PREINIT_ARRAY 16 +#define SHT_GROUP 17 +#define SHT_SYMTAB_SHNDX 18 +#define SHT_NUM 19 +#define SHT_LOOS 0x60000000 +#define SHT_GNU_ATTRIBUTES 0x6ffffff5 +#define SHT_GNU_HASH 0x6ffffff6 +#define SHT_GNU_LIBLIST 0x6ffffff7 +#define SHT_CHECKSUM 0x6ffffff8 +#define SHT_LOSUNW 0x6ffffffa +#define SHT_SUNW_move 0x6ffffffa +#define SHT_SUNW_COMDAT 0x6ffffffb +#define SHT_SUNW_syminfo 0x6ffffffc +#define SHT_GNU_verdef 0x6ffffffd +#define SHT_GNU_verneed 0x6ffffffe +#define SHT_GNU_versym 0x6fffffff +#define SHT_HISUNW 0x6fffffff +#define SHT_HIOS 0x6fffffff +#define SHT_LOPROC 0x70000000 +#define SHT_HIPROC 0x7fffffff +#define SHT_LOUSER 0x80000000 +#define SHT_HIUSER 0x8fffffff + +#define SHF_WRITE (1 << 0) +#define SHF_ALLOC (1 << 1) +#define SHF_EXECINSTR (1 << 2) +#define SHF_MERGE (1 << 4) +#define SHF_STRINGS (1 << 5) +#define SHF_INFO_LINK (1 << 6) +#define SHF_LINK_ORDER (1 << 7) +#define SHF_OS_NONCONFORMING (1 << 8) + +#define SHF_GROUP (1 << 9) +#define SHF_TLS (1 << 10) +#define SHF_MASKOS 0x0ff00000 +#define SHF_MASKPROC 0xf0000000 +#define SHF_ORDERED (1 << 30) +#define SHF_EXCLUDE (1U << 31) + +#define GRP_COMDAT 0x1 + +typedef struct { + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + Elf32_Section st_shndx; +} Elf32_Sym; + +typedef struct { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Section st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +} Elf64_Sym; + +typedef struct { + Elf32_Half si_boundto; + Elf32_Half si_flags; +} Elf32_Syminfo; + +typedef struct { + Elf64_Half si_boundto; + Elf64_Half si_flags; +} Elf64_Syminfo; + +#define SYMINFO_BT_SELF 0xffff +#define SYMINFO_BT_PARENT 0xfffe +#define SYMINFO_BT_LOWRESERVE 0xff00 + +#define SYMINFO_FLG_DIRECT 0x0001 +#define SYMINFO_FLG_PASSTHRU 0x0002 +#define SYMINFO_FLG_COPY 0x0004 +#define SYMINFO_FLG_LAZYLOAD 0x0008 + +#define SYMINFO_NONE 0 +#define SYMINFO_CURRENT 1 +#define SYMINFO_NUM 2 + +#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4) +#define ELF32_ST_TYPE(val) ((val) & 0xf) +#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) + +#define ELF64_ST_BIND(val) ELF32_ST_BIND (val) +#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val) +#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type)) + +#define STB_LOCAL 0 +#define STB_GLOBAL 1 +#define STB_WEAK 2 +#define STB_NUM 3 +#define STB_LOOS 10 +#define STB_GNU_UNIQUE 10 +#define STB_HIOS 12 +#define STB_LOPROC 13 +#define STB_HIPROC 15 + +#define STT_NOTYPE 0 +#define STT_OBJECT 1 +#define STT_FUNC 2 +#define STT_SECTION 3 +#define STT_FILE 4 +#define STT_COMMON 5 +#define STT_TLS 6 +#define STT_NUM 7 +#define STT_LOOS 10 +#define STT_GNU_IFUNC 10 +#define STT_HIOS 12 +#define STT_LOPROC 13 +#define STT_HIPROC 15 + +#define STN_UNDEF 0 + +#define ELF32_ST_VISIBILITY(o) ((o) & 0x03) +#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o) + +#define STV_DEFAULT 0 +#define STV_INTERNAL 1 +#define STV_HIDDEN 2 +#define STV_PROTECTED 3 + + + + +typedef struct +{ + Elf32_Addr r_offset; + Elf32_Word r_info; +} Elf32_Rel; + +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; +} Elf64_Rel; + + + +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; + Elf32_Sword r_addend; +} Elf32_Rela; + +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +} Elf64_Rela; + + + +#define ELF32_R_SYM(val) ((val) >> 8) +#define ELF32_R_TYPE(val) ((val) & 0xff) +#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff)) + +#define ELF64_R_SYM(i) ((i) >> 32) +#define ELF64_R_TYPE(i) ((i) & 0xffffffff) +#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type)) + + + +typedef struct { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +} Elf32_Phdr; + +typedef struct { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +} Elf64_Phdr; + + + +#define PT_NULL 0 +#define PT_LOAD 1 +#define PT_DYNAMIC 2 +#define PT_INTERP 3 +#define PT_NOTE 4 +#define PT_SHLIB 5 +#define PT_PHDR 6 +#define PT_TLS 7 +#define PT_NUM 8 +#define PT_LOOS 0x60000000 +#define PT_GNU_EH_FRAME 0x6474e550 +#define PT_GNU_STACK 0x6474e551 +#define PT_GNU_RELRO 0x6474e552 +#define PT_LOSUNW 0x6ffffffa +#define PT_SUNWBSS 0x6ffffffa +#define PT_SUNWSTACK 0x6ffffffb +#define PT_HISUNW 0x6fffffff +#define PT_HIOS 0x6fffffff +#define PT_LOPROC 0x70000000 +#define PT_HIPROC 0x7fffffff + + +#define PN_XNUM 0xffff + + +#define PF_X (1 << 0) +#define PF_W (1 << 1) +#define PF_R (1 << 2) +#define PF_MASKOS 0x0ff00000 +#define PF_MASKPROC 0xf0000000 + + + +#define NT_PRSTATUS 1 +#define NT_FPREGSET 2 +#define NT_PRPSINFO 3 +#define NT_PRXREG 4 +#define NT_TASKSTRUCT 4 +#define NT_PLATFORM 5 +#define NT_AUXV 6 +#define NT_GWINDOWS 7 +#define NT_ASRS 8 +#define NT_PSTATUS 10 +#define NT_PSINFO 13 +#define NT_PRCRED 14 +#define NT_UTSNAME 15 +#define NT_LWPSTATUS 16 +#define NT_LWPSINFO 17 +#define NT_PRFPXREG 20 +#define NT_SIGINFO 0x53494749 +#define NT_FILE 0x46494c45 +#define NT_PRXFPREG 0x46e62b7f +#define NT_PPC_VMX 0x100 +#define NT_PPC_SPE 0x101 +#define NT_PPC_VSX 0x102 +#define NT_386_TLS 0x200 +#define NT_386_IOPERM 0x201 +#define NT_X86_XSTATE 0x202 +#define NT_S390_HIGH_GPRS 0x300 +#define NT_S390_TIMER 0x301 +#define NT_S390_TODCMP 0x302 +#define NT_S390_TODPREG 0x303 +#define NT_S390_CTRS 0x304 +#define NT_S390_PREFIX 0x305 +#define NT_S390_LAST_BREAK 0x306 +#define NT_S390_SYSTEM_CALL 0x307 +#define NT_S390_TDB 0x308 +#define NT_ARM_VFP 0x400 +#define NT_ARM_TLS 0x401 +#define NT_ARM_HW_BREAK 0x402 +#define NT_ARM_HW_WATCH 0x403 +#define NT_METAG_CBUF 0x500 +#define NT_METAG_RPIPE 0x501 +#define NT_METAG_TLS 0x502 +#define NT_VERSION 1 + + + + +typedef struct { + Elf32_Sword d_tag; + union { + Elf32_Word d_val; + Elf32_Addr d_ptr; + } d_un; +} Elf32_Dyn; + +typedef struct { + Elf64_Sxword d_tag; + union { + Elf64_Xword d_val; + Elf64_Addr d_ptr; + } d_un; +} Elf64_Dyn; + + + +#define DT_NULL 0 +#define DT_NEEDED 1 +#define DT_PLTRELSZ 2 +#define DT_PLTGOT 3 +#define DT_HASH 4 +#define DT_STRTAB 5 +#define DT_SYMTAB 6 +#define DT_RELA 7 +#define DT_RELASZ 8 +#define DT_RELAENT 9 +#define DT_STRSZ 10 +#define DT_SYMENT 11 +#define DT_INIT 12 +#define DT_FINI 13 +#define DT_SONAME 14 +#define DT_RPATH 15 +#define DT_SYMBOLIC 16 +#define DT_REL 17 +#define DT_RELSZ 18 +#define DT_RELENT 19 +#define DT_PLTREL 20 +#define DT_DEBUG 21 +#define DT_TEXTREL 22 +#define DT_JMPREL 23 +#define DT_BIND_NOW 24 +#define DT_INIT_ARRAY 25 +#define DT_FINI_ARRAY 26 +#define DT_INIT_ARRAYSZ 27 +#define DT_FINI_ARRAYSZ 28 +#define DT_RUNPATH 29 +#define DT_FLAGS 30 +#define DT_ENCODING 32 +#define DT_PREINIT_ARRAY 32 +#define DT_PREINIT_ARRAYSZ 33 +#define DT_NUM 34 +#define DT_LOOS 0x6000000d +#define DT_HIOS 0x6ffff000 +#define DT_LOPROC 0x70000000 +#define DT_HIPROC 0x7fffffff +#define DT_PROCNUM DT_MIPS_NUM + +#define DT_VALRNGLO 0x6ffffd00 +#define DT_GNU_PRELINKED 0x6ffffdf5 +#define DT_GNU_CONFLICTSZ 0x6ffffdf6 +#define DT_GNU_LIBLISTSZ 0x6ffffdf7 +#define DT_CHECKSUM 0x6ffffdf8 +#define DT_PLTPADSZ 0x6ffffdf9 +#define DT_MOVEENT 0x6ffffdfa +#define DT_MOVESZ 0x6ffffdfb +#define DT_FEATURE_1 0x6ffffdfc +#define DT_POSFLAG_1 0x6ffffdfd + +#define DT_SYMINSZ 0x6ffffdfe +#define DT_SYMINENT 0x6ffffdff +#define DT_VALRNGHI 0x6ffffdff +#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) +#define DT_VALNUM 12 + +#define DT_ADDRRNGLO 0x6ffffe00 +#define DT_GNU_HASH 0x6ffffef5 +#define DT_TLSDESC_PLT 0x6ffffef6 +#define DT_TLSDESC_GOT 0x6ffffef7 +#define DT_GNU_CONFLICT 0x6ffffef8 +#define DT_GNU_LIBLIST 0x6ffffef9 +#define DT_CONFIG 0x6ffffefa +#define DT_DEPAUDIT 0x6ffffefb +#define DT_AUDIT 0x6ffffefc +#define DT_PLTPAD 0x6ffffefd +#define DT_MOVETAB 0x6ffffefe +#define DT_SYMINFO 0x6ffffeff +#define DT_ADDRRNGHI 0x6ffffeff +#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag)) +#define DT_ADDRNUM 11 + + + +#define DT_VERSYM 0x6ffffff0 + +#define DT_RELACOUNT 0x6ffffff9 +#define DT_RELCOUNT 0x6ffffffa + + +#define DT_FLAGS_1 0x6ffffffb +#define DT_VERDEF 0x6ffffffc + +#define DT_VERDEFNUM 0x6ffffffd +#define DT_VERNEED 0x6ffffffe + +#define DT_VERNEEDNUM 0x6fffffff +#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) +#define DT_VERSIONTAGNUM 16 + + + +#define DT_AUXILIARY 0x7ffffffd +#define DT_FILTER 0x7fffffff +#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1) +#define DT_EXTRANUM 3 + + +#define DF_ORIGIN 0x00000001 +#define DF_SYMBOLIC 0x00000002 +#define DF_TEXTREL 0x00000004 +#define DF_BIND_NOW 0x00000008 +#define DF_STATIC_TLS 0x00000010 + + + +#define DF_1_NOW 0x00000001 +#define DF_1_GLOBAL 0x00000002 +#define DF_1_GROUP 0x00000004 +#define DF_1_NODELETE 0x00000008 +#define DF_1_LOADFLTR 0x00000010 +#define DF_1_INITFIRST 0x00000020 +#define DF_1_NOOPEN 0x00000040 +#define DF_1_ORIGIN 0x00000080 +#define DF_1_DIRECT 0x00000100 +#define DF_1_TRANS 0x00000200 +#define DF_1_INTERPOSE 0x00000400 +#define DF_1_NODEFLIB 0x00000800 +#define DF_1_NODUMP 0x00001000 +#define DF_1_CONFALT 0x00002000 +#define DF_1_ENDFILTEE 0x00004000 +#define DF_1_DISPRELDNE 0x00008000 +#define DF_1_DISPRELPND 0x00010000 +#define DF_1_NODIRECT 0x00020000 +#define DF_1_IGNMULDEF 0x00040000 +#define DF_1_NOKSYMS 0x00080000 +#define DF_1_NOHDR 0x00100000 +#define DF_1_EDITED 0x00200000 +#define DF_1_NORELOC 0x00400000 +#define DF_1_SYMINTPOSE 0x00800000 +#define DF_1_GLOBAUDIT 0x01000000 +#define DF_1_SINGLETON 0x02000000 + +#define DTF_1_PARINIT 0x00000001 +#define DTF_1_CONFEXP 0x00000002 + + +#define DF_P1_LAZYLOAD 0x00000001 +#define DF_P1_GROUPPERM 0x00000002 + + + + +typedef struct { + Elf32_Half vd_version; + Elf32_Half vd_flags; + Elf32_Half vd_ndx; + Elf32_Half vd_cnt; + Elf32_Word vd_hash; + Elf32_Word vd_aux; + Elf32_Word vd_next; +} Elf32_Verdef; + +typedef struct { + Elf64_Half vd_version; + Elf64_Half vd_flags; + Elf64_Half vd_ndx; + Elf64_Half vd_cnt; + Elf64_Word vd_hash; + Elf64_Word vd_aux; + Elf64_Word vd_next; +} Elf64_Verdef; + + + +#define VER_DEF_NONE 0 +#define VER_DEF_CURRENT 1 +#define VER_DEF_NUM 2 + + +#define VER_FLG_BASE 0x1 +#define VER_FLG_WEAK 0x2 + + +#define VER_NDX_LOCAL 0 +#define VER_NDX_GLOBAL 1 +#define VER_NDX_LORESERVE 0xff00 +#define VER_NDX_ELIMINATE 0xff01 + + + +typedef struct { + Elf32_Word vda_name; + Elf32_Word vda_next; +} Elf32_Verdaux; + +typedef struct { + Elf64_Word vda_name; + Elf64_Word vda_next; +} Elf64_Verdaux; + + + + +typedef struct { + Elf32_Half vn_version; + Elf32_Half vn_cnt; + Elf32_Word vn_file; + Elf32_Word vn_aux; + Elf32_Word vn_next; +} Elf32_Verneed; + +typedef struct { + Elf64_Half vn_version; + Elf64_Half vn_cnt; + Elf64_Word vn_file; + Elf64_Word vn_aux; + Elf64_Word vn_next; +} Elf64_Verneed; + + + +#define VER_NEED_NONE 0 +#define VER_NEED_CURRENT 1 +#define VER_NEED_NUM 2 + + + +typedef struct { + Elf32_Word vna_hash; + Elf32_Half vna_flags; + Elf32_Half vna_other; + Elf32_Word vna_name; + Elf32_Word vna_next; +} Elf32_Vernaux; + +typedef struct { + Elf64_Word vna_hash; + Elf64_Half vna_flags; + Elf64_Half vna_other; + Elf64_Word vna_name; + Elf64_Word vna_next; +} Elf64_Vernaux; + + + +#define VER_FLG_WEAK 0x2 + + + +typedef struct { + uint32_t a_type; + union { + uint32_t a_val; + } a_un; +} Elf32_auxv_t; + +typedef struct { + uint64_t a_type; + union { + uint64_t a_val; + } a_un; +} Elf64_auxv_t; + + + +#define AT_NULL 0 +#define AT_IGNORE 1 +#define AT_EXECFD 2 +#define AT_PHDR 3 +#define AT_PHENT 4 +#define AT_PHNUM 5 +#define AT_PAGESZ 6 +#define AT_BASE 7 +#define AT_FLAGS 8 +#define AT_ENTRY 9 +#define AT_NOTELF 10 +#define AT_UID 11 +#define AT_EUID 12 +#define AT_GID 13 +#define AT_EGID 14 +#define AT_CLKTCK 17 + + +#define AT_PLATFORM 15 +#define AT_HWCAP 16 + + + + +#define AT_FPUCW 18 + + +#define AT_DCACHEBSIZE 19 +#define AT_ICACHEBSIZE 20 +#define AT_UCACHEBSIZE 21 + + + +#define AT_IGNOREPPC 22 + +#define AT_SECURE 23 + +#define AT_BASE_PLATFORM 24 + +#define AT_RANDOM 25 + +#define AT_HWCAP2 26 + +#define AT_EXECFN 31 + + + +#define AT_SYSINFO 32 +#define AT_SYSINFO_EHDR 33 + + + +#define AT_L1I_CACHESHAPE 34 +#define AT_L1D_CACHESHAPE 35 +#define AT_L2_CACHESHAPE 36 +#define AT_L3_CACHESHAPE 37 + + + + +typedef struct { + Elf32_Word n_namesz; + Elf32_Word n_descsz; + Elf32_Word n_type; +} Elf32_Nhdr; + +typedef struct { + Elf64_Word n_namesz; + Elf64_Word n_descsz; + Elf64_Word n_type; +} Elf64_Nhdr; + + + + +#define ELF_NOTE_SOLARIS "SUNW Solaris" + + +#define ELF_NOTE_GNU "GNU" + + + + + +#define ELF_NOTE_PAGESIZE_HINT 1 + + +#define NT_GNU_ABI_TAG 1 +#define ELF_NOTE_ABI NT_GNU_ABI_TAG + + + +#define ELF_NOTE_OS_LINUX 0 +#define ELF_NOTE_OS_GNU 1 +#define ELF_NOTE_OS_SOLARIS2 2 +#define ELF_NOTE_OS_FREEBSD 3 + +#define NT_GNU_BUILD_ID 3 +#define NT_GNU_GOLD_VERSION 4 + + + +typedef struct { + Elf32_Xword m_value; + Elf32_Word m_info; + Elf32_Word m_poffset; + Elf32_Half m_repeat; + Elf32_Half m_stride; +} Elf32_Move; + +typedef struct { + Elf64_Xword m_value; + Elf64_Xword m_info; + Elf64_Xword m_poffset; + Elf64_Half m_repeat; + Elf64_Half m_stride; +} Elf64_Move; + + +#define ELF32_M_SYM(info) ((info) >> 8) +#define ELF32_M_SIZE(info) ((unsigned char) (info)) +#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size)) + +#define ELF64_M_SYM(info) ELF32_M_SYM (info) +#define ELF64_M_SIZE(info) ELF32_M_SIZE (info) +#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size) + +#define EF_CPU32 0x00810000 + +#define R_68K_NONE 0 +#define R_68K_32 1 +#define R_68K_16 2 +#define R_68K_8 3 +#define R_68K_PC32 4 +#define R_68K_PC16 5 +#define R_68K_PC8 6 +#define R_68K_GOT32 7 +#define R_68K_GOT16 8 +#define R_68K_GOT8 9 +#define R_68K_GOT32O 10 +#define R_68K_GOT16O 11 +#define R_68K_GOT8O 12 +#define R_68K_PLT32 13 +#define R_68K_PLT16 14 +#define R_68K_PLT8 15 +#define R_68K_PLT32O 16 +#define R_68K_PLT16O 17 +#define R_68K_PLT8O 18 +#define R_68K_COPY 19 +#define R_68K_GLOB_DAT 20 +#define R_68K_JMP_SLOT 21 +#define R_68K_RELATIVE 22 +#define R_68K_NUM 23 + +#define R_386_NONE 0 +#define R_386_32 1 +#define R_386_PC32 2 +#define R_386_GOT32 3 +#define R_386_PLT32 4 +#define R_386_COPY 5 +#define R_386_GLOB_DAT 6 +#define R_386_JMP_SLOT 7 +#define R_386_RELATIVE 8 +#define R_386_GOTOFF 9 +#define R_386_GOTPC 10 +#define R_386_32PLT 11 +#define R_386_TLS_TPOFF 14 +#define R_386_TLS_IE 15 +#define R_386_TLS_GOTIE 16 +#define R_386_TLS_LE 17 +#define R_386_TLS_GD 18 +#define R_386_TLS_LDM 19 +#define R_386_16 20 +#define R_386_PC16 21 +#define R_386_8 22 +#define R_386_PC8 23 +#define R_386_TLS_GD_32 24 +#define R_386_TLS_GD_PUSH 25 +#define R_386_TLS_GD_CALL 26 +#define R_386_TLS_GD_POP 27 +#define R_386_TLS_LDM_32 28 +#define R_386_TLS_LDM_PUSH 29 +#define R_386_TLS_LDM_CALL 30 +#define R_386_TLS_LDM_POP 31 +#define R_386_TLS_LDO_32 32 +#define R_386_TLS_IE_32 33 +#define R_386_TLS_LE_32 34 +#define R_386_TLS_DTPMOD32 35 +#define R_386_TLS_DTPOFF32 36 +#define R_386_TLS_TPOFF32 37 +#define R_386_SIZE32 38 +#define R_386_TLS_GOTDESC 39 +#define R_386_TLS_DESC_CALL 40 +#define R_386_TLS_DESC 41 +#define R_386_IRELATIVE 42 +#define R_386_NUM 43 + + + + + +#define STT_SPARC_REGISTER 13 + + + +#define EF_SPARCV9_MM 3 +#define EF_SPARCV9_TSO 0 +#define EF_SPARCV9_PSO 1 +#define EF_SPARCV9_RMO 2 +#define EF_SPARC_LEDATA 0x800000 +#define EF_SPARC_EXT_MASK 0xFFFF00 +#define EF_SPARC_32PLUS 0x000100 +#define EF_SPARC_SUN_US1 0x000200 +#define EF_SPARC_HAL_R1 0x000400 +#define EF_SPARC_SUN_US3 0x000800 + + + +#define R_SPARC_NONE 0 +#define R_SPARC_8 1 +#define R_SPARC_16 2 +#define R_SPARC_32 3 +#define R_SPARC_DISP8 4 +#define R_SPARC_DISP16 5 +#define R_SPARC_DISP32 6 +#define R_SPARC_WDISP30 7 +#define R_SPARC_WDISP22 8 +#define R_SPARC_HI22 9 +#define R_SPARC_22 10 +#define R_SPARC_13 11 +#define R_SPARC_LO10 12 +#define R_SPARC_GOT10 13 +#define R_SPARC_GOT13 14 +#define R_SPARC_GOT22 15 +#define R_SPARC_PC10 16 +#define R_SPARC_PC22 17 +#define R_SPARC_WPLT30 18 +#define R_SPARC_COPY 19 +#define R_SPARC_GLOB_DAT 20 +#define R_SPARC_JMP_SLOT 21 +#define R_SPARC_RELATIVE 22 +#define R_SPARC_UA32 23 + + + +#define R_SPARC_PLT32 24 +#define R_SPARC_HIPLT22 25 +#define R_SPARC_LOPLT10 26 +#define R_SPARC_PCPLT32 27 +#define R_SPARC_PCPLT22 28 +#define R_SPARC_PCPLT10 29 +#define R_SPARC_10 30 +#define R_SPARC_11 31 +#define R_SPARC_64 32 +#define R_SPARC_OLO10 33 +#define R_SPARC_HH22 34 +#define R_SPARC_HM10 35 +#define R_SPARC_LM22 36 +#define R_SPARC_PC_HH22 37 +#define R_SPARC_PC_HM10 38 +#define R_SPARC_PC_LM22 39 +#define R_SPARC_WDISP16 40 +#define R_SPARC_WDISP19 41 +#define R_SPARC_GLOB_JMP 42 +#define R_SPARC_7 43 +#define R_SPARC_5 44 +#define R_SPARC_6 45 +#define R_SPARC_DISP64 46 +#define R_SPARC_PLT64 47 +#define R_SPARC_HIX22 48 +#define R_SPARC_LOX10 49 +#define R_SPARC_H44 50 +#define R_SPARC_M44 51 +#define R_SPARC_L44 52 +#define R_SPARC_REGISTER 53 +#define R_SPARC_UA64 54 +#define R_SPARC_UA16 55 +#define R_SPARC_TLS_GD_HI22 56 +#define R_SPARC_TLS_GD_LO10 57 +#define R_SPARC_TLS_GD_ADD 58 +#define R_SPARC_TLS_GD_CALL 59 +#define R_SPARC_TLS_LDM_HI22 60 +#define R_SPARC_TLS_LDM_LO10 61 +#define R_SPARC_TLS_LDM_ADD 62 +#define R_SPARC_TLS_LDM_CALL 63 +#define R_SPARC_TLS_LDO_HIX22 64 +#define R_SPARC_TLS_LDO_LOX10 65 +#define R_SPARC_TLS_LDO_ADD 66 +#define R_SPARC_TLS_IE_HI22 67 +#define R_SPARC_TLS_IE_LO10 68 +#define R_SPARC_TLS_IE_LD 69 +#define R_SPARC_TLS_IE_LDX 70 +#define R_SPARC_TLS_IE_ADD 71 +#define R_SPARC_TLS_LE_HIX22 72 +#define R_SPARC_TLS_LE_LOX10 73 +#define R_SPARC_TLS_DTPMOD32 74 +#define R_SPARC_TLS_DTPMOD64 75 +#define R_SPARC_TLS_DTPOFF32 76 +#define R_SPARC_TLS_DTPOFF64 77 +#define R_SPARC_TLS_TPOFF32 78 +#define R_SPARC_TLS_TPOFF64 79 +#define R_SPARC_GOTDATA_HIX22 80 +#define R_SPARC_GOTDATA_LOX10 81 +#define R_SPARC_GOTDATA_OP_HIX22 82 +#define R_SPARC_GOTDATA_OP_LOX10 83 +#define R_SPARC_GOTDATA_OP 84 +#define R_SPARC_H34 85 +#define R_SPARC_SIZE32 86 +#define R_SPARC_SIZE64 87 +#define R_SPARC_GNU_VTINHERIT 250 +#define R_SPARC_GNU_VTENTRY 251 +#define R_SPARC_REV32 252 + +#define R_SPARC_NUM 253 + + + +#define DT_SPARC_REGISTER 0x70000001 +#define DT_SPARC_NUM 2 + + +#define EF_MIPS_NOREORDER 1 +#define EF_MIPS_PIC 2 +#define EF_MIPS_CPIC 4 +#define EF_MIPS_XGOT 8 +#define EF_MIPS_64BIT_WHIRL 16 +#define EF_MIPS_ABI2 32 +#define EF_MIPS_ABI_ON32 64 +#define EF_MIPS_NAN2008 1024 +#define EF_MIPS_ARCH 0xf0000000 + + + +#define EF_MIPS_ARCH_1 0x00000000 +#define EF_MIPS_ARCH_2 0x10000000 +#define EF_MIPS_ARCH_3 0x20000000 +#define EF_MIPS_ARCH_4 0x30000000 +#define EF_MIPS_ARCH_5 0x40000000 +#define EF_MIPS_ARCH_32 0x50000000 +#define EF_MIPS_ARCH_64 0x60000000 +#define EF_MIPS_ARCH_32R2 0x70000000 +#define EF_MIPS_ARCH_64R2 0x80000000 + + +#define E_MIPS_ARCH_1 0x00000000 +#define E_MIPS_ARCH_2 0x10000000 +#define E_MIPS_ARCH_3 0x20000000 +#define E_MIPS_ARCH_4 0x30000000 +#define E_MIPS_ARCH_5 0x40000000 +#define E_MIPS_ARCH_32 0x50000000 +#define E_MIPS_ARCH_64 0x60000000 + + + +#define SHN_MIPS_ACOMMON 0xff00 +#define SHN_MIPS_TEXT 0xff01 +#define SHN_MIPS_DATA 0xff02 +#define SHN_MIPS_SCOMMON 0xff03 +#define SHN_MIPS_SUNDEFINED 0xff04 + + + +#define SHT_MIPS_LIBLIST 0x70000000 +#define SHT_MIPS_MSYM 0x70000001 +#define SHT_MIPS_CONFLICT 0x70000002 +#define SHT_MIPS_GPTAB 0x70000003 +#define SHT_MIPS_UCODE 0x70000004 +#define SHT_MIPS_DEBUG 0x70000005 +#define SHT_MIPS_REGINFO 0x70000006 +#define SHT_MIPS_PACKAGE 0x70000007 +#define SHT_MIPS_PACKSYM 0x70000008 +#define SHT_MIPS_RELD 0x70000009 +#define SHT_MIPS_IFACE 0x7000000b +#define SHT_MIPS_CONTENT 0x7000000c +#define SHT_MIPS_OPTIONS 0x7000000d +#define SHT_MIPS_SHDR 0x70000010 +#define SHT_MIPS_FDESC 0x70000011 +#define SHT_MIPS_EXTSYM 0x70000012 +#define SHT_MIPS_DENSE 0x70000013 +#define SHT_MIPS_PDESC 0x70000014 +#define SHT_MIPS_LOCSYM 0x70000015 +#define SHT_MIPS_AUXSYM 0x70000016 +#define SHT_MIPS_OPTSYM 0x70000017 +#define SHT_MIPS_LOCSTR 0x70000018 +#define SHT_MIPS_LINE 0x70000019 +#define SHT_MIPS_RFDESC 0x7000001a +#define SHT_MIPS_DELTASYM 0x7000001b +#define SHT_MIPS_DELTAINST 0x7000001c +#define SHT_MIPS_DELTACLASS 0x7000001d +#define SHT_MIPS_DWARF 0x7000001e +#define SHT_MIPS_DELTADECL 0x7000001f +#define SHT_MIPS_SYMBOL_LIB 0x70000020 +#define SHT_MIPS_EVENTS 0x70000021 +#define SHT_MIPS_TRANSLATE 0x70000022 +#define SHT_MIPS_PIXIE 0x70000023 +#define SHT_MIPS_XLATE 0x70000024 +#define SHT_MIPS_XLATE_DEBUG 0x70000025 +#define SHT_MIPS_WHIRL 0x70000026 +#define SHT_MIPS_EH_REGION 0x70000027 +#define SHT_MIPS_XLATE_OLD 0x70000028 +#define SHT_MIPS_PDR_EXCEPTION 0x70000029 + + + +#define SHF_MIPS_GPREL 0x10000000 +#define SHF_MIPS_MERGE 0x20000000 +#define SHF_MIPS_ADDR 0x40000000 +#define SHF_MIPS_STRINGS 0x80000000 +#define SHF_MIPS_NOSTRIP 0x08000000 +#define SHF_MIPS_LOCAL 0x04000000 +#define SHF_MIPS_NAMES 0x02000000 +#define SHF_MIPS_NODUPE 0x01000000 + + + + + +#define STO_MIPS_DEFAULT 0x0 +#define STO_MIPS_INTERNAL 0x1 +#define STO_MIPS_HIDDEN 0x2 +#define STO_MIPS_PROTECTED 0x3 +#define STO_MIPS_PLT 0x8 +#define STO_MIPS_SC_ALIGN_UNUSED 0xff + + +#define STB_MIPS_SPLIT_COMMON 13 + + + +typedef union { + struct { + Elf32_Word gt_current_g_value; + Elf32_Word gt_unused; + } gt_header; + struct { + Elf32_Word gt_g_value; + Elf32_Word gt_bytes; + } gt_entry; +} Elf32_gptab; + + + +typedef struct { + Elf32_Word ri_gprmask; + Elf32_Word ri_cprmask[4]; + Elf32_Sword ri_gp_value; +} Elf32_RegInfo; + + + +typedef struct { + unsigned char kind; + + unsigned char size; + Elf32_Section section; + + Elf32_Word info; +} Elf_Options; + + + +#define ODK_NULL 0 +#define ODK_REGINFO 1 +#define ODK_EXCEPTIONS 2 +#define ODK_PAD 3 +#define ODK_HWPATCH 4 +#define ODK_FILL 5 +#define ODK_TAGS 6 +#define ODK_HWAND 7 +#define ODK_HWOR 8 + + + +#define OEX_FPU_MIN 0x1f +#define OEX_FPU_MAX 0x1f00 +#define OEX_PAGE0 0x10000 +#define OEX_SMM 0x20000 +#define OEX_FPDBUG 0x40000 +#define OEX_PRECISEFP OEX_FPDBUG +#define OEX_DISMISS 0x80000 + +#define OEX_FPU_INVAL 0x10 +#define OEX_FPU_DIV0 0x08 +#define OEX_FPU_OFLO 0x04 +#define OEX_FPU_UFLO 0x02 +#define OEX_FPU_INEX 0x01 + + + +#define OHW_R4KEOP 0x1 +#define OHW_R8KPFETCH 0x2 +#define OHW_R5KEOP 0x4 +#define OHW_R5KCVTL 0x8 + +#define OPAD_PREFIX 0x1 +#define OPAD_POSTFIX 0x2 +#define OPAD_SYMBOL 0x4 + + + +typedef struct { + Elf32_Word hwp_flags1; + Elf32_Word hwp_flags2; +} Elf_Options_Hw; + + + +#define OHWA0_R4KEOP_CHECKED 0x00000001 +#define OHWA1_R4KEOP_CLEAN 0x00000002 + + + +#define R_MIPS_NONE 0 +#define R_MIPS_16 1 +#define R_MIPS_32 2 +#define R_MIPS_REL32 3 +#define R_MIPS_26 4 +#define R_MIPS_HI16 5 +#define R_MIPS_LO16 6 +#define R_MIPS_GPREL16 7 +#define R_MIPS_LITERAL 8 +#define R_MIPS_GOT16 9 +#define R_MIPS_PC16 10 +#define R_MIPS_CALL16 11 +#define R_MIPS_GPREL32 12 + +#define R_MIPS_SHIFT5 16 +#define R_MIPS_SHIFT6 17 +#define R_MIPS_64 18 +#define R_MIPS_GOT_DISP 19 +#define R_MIPS_GOT_PAGE 20 +#define R_MIPS_GOT_OFST 21 +#define R_MIPS_GOT_HI16 22 +#define R_MIPS_GOT_LO16 23 +#define R_MIPS_SUB 24 +#define R_MIPS_INSERT_A 25 +#define R_MIPS_INSERT_B 26 +#define R_MIPS_DELETE 27 +#define R_MIPS_HIGHER 28 +#define R_MIPS_HIGHEST 29 +#define R_MIPS_CALL_HI16 30 +#define R_MIPS_CALL_LO16 31 +#define R_MIPS_SCN_DISP 32 +#define R_MIPS_REL16 33 +#define R_MIPS_ADD_IMMEDIATE 34 +#define R_MIPS_PJUMP 35 +#define R_MIPS_RELGOT 36 +#define R_MIPS_JALR 37 +#define R_MIPS_TLS_DTPMOD32 38 +#define R_MIPS_TLS_DTPREL32 39 +#define R_MIPS_TLS_DTPMOD64 40 +#define R_MIPS_TLS_DTPREL64 41 +#define R_MIPS_TLS_GD 42 +#define R_MIPS_TLS_LDM 43 +#define R_MIPS_TLS_DTPREL_HI16 44 +#define R_MIPS_TLS_DTPREL_LO16 45 +#define R_MIPS_TLS_GOTTPREL 46 +#define R_MIPS_TLS_TPREL32 47 +#define R_MIPS_TLS_TPREL64 48 +#define R_MIPS_TLS_TPREL_HI16 49 +#define R_MIPS_TLS_TPREL_LO16 50 +#define R_MIPS_GLOB_DAT 51 +#define R_MIPS_COPY 126 +#define R_MIPS_JUMP_SLOT 127 + +#define R_MIPS_NUM 128 + + + +#define PT_MIPS_REGINFO 0x70000000 +#define PT_MIPS_RTPROC 0x70000001 +#define PT_MIPS_OPTIONS 0x70000002 + + + +#define PF_MIPS_LOCAL 0x10000000 + + + +#define DT_MIPS_RLD_VERSION 0x70000001 +#define DT_MIPS_TIME_STAMP 0x70000002 +#define DT_MIPS_ICHECKSUM 0x70000003 +#define DT_MIPS_IVERSION 0x70000004 +#define DT_MIPS_FLAGS 0x70000005 +#define DT_MIPS_BASE_ADDRESS 0x70000006 +#define DT_MIPS_MSYM 0x70000007 +#define DT_MIPS_CONFLICT 0x70000008 +#define DT_MIPS_LIBLIST 0x70000009 +#define DT_MIPS_LOCAL_GOTNO 0x7000000a +#define DT_MIPS_CONFLICTNO 0x7000000b +#define DT_MIPS_LIBLISTNO 0x70000010 +#define DT_MIPS_SYMTABNO 0x70000011 +#define DT_MIPS_UNREFEXTNO 0x70000012 +#define DT_MIPS_GOTSYM 0x70000013 +#define DT_MIPS_HIPAGENO 0x70000014 +#define DT_MIPS_RLD_MAP 0x70000016 +#define DT_MIPS_DELTA_CLASS 0x70000017 +#define DT_MIPS_DELTA_CLASS_NO 0x70000018 + +#define DT_MIPS_DELTA_INSTANCE 0x70000019 +#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a + +#define DT_MIPS_DELTA_RELOC 0x7000001b +#define DT_MIPS_DELTA_RELOC_NO 0x7000001c + +#define DT_MIPS_DELTA_SYM 0x7000001d + +#define DT_MIPS_DELTA_SYM_NO 0x7000001e + +#define DT_MIPS_DELTA_CLASSSYM 0x70000020 + +#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 + +#define DT_MIPS_CXX_FLAGS 0x70000022 +#define DT_MIPS_PIXIE_INIT 0x70000023 +#define DT_MIPS_SYMBOL_LIB 0x70000024 +#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025 +#define DT_MIPS_LOCAL_GOTIDX 0x70000026 +#define DT_MIPS_HIDDEN_GOTIDX 0x70000027 +#define DT_MIPS_PROTECTED_GOTIDX 0x70000028 +#define DT_MIPS_OPTIONS 0x70000029 +#define DT_MIPS_INTERFACE 0x7000002a +#define DT_MIPS_DYNSTR_ALIGN 0x7000002b +#define DT_MIPS_INTERFACE_SIZE 0x7000002c +#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d + +#define DT_MIPS_PERF_SUFFIX 0x7000002e + +#define DT_MIPS_COMPACT_SIZE 0x7000002f +#define DT_MIPS_GP_VALUE 0x70000030 +#define DT_MIPS_AUX_DYNAMIC 0x70000031 + +#define DT_MIPS_PLTGOT 0x70000032 + +#define DT_MIPS_RWPLT 0x70000034 +#define DT_MIPS_NUM 0x35 + + + +#define RHF_NONE 0 +#define RHF_QUICKSTART (1 << 0) +#define RHF_NOTPOT (1 << 1) +#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) +#define RHF_NO_MOVE (1 << 3) +#define RHF_SGI_ONLY (1 << 4) +#define RHF_GUARANTEE_INIT (1 << 5) +#define RHF_DELTA_C_PLUS_PLUS (1 << 6) +#define RHF_GUARANTEE_START_INIT (1 << 7) +#define RHF_PIXIE (1 << 8) +#define RHF_DEFAULT_DELAY_LOAD (1 << 9) +#define RHF_REQUICKSTART (1 << 10) +#define RHF_REQUICKSTARTED (1 << 11) +#define RHF_CORD (1 << 12) +#define RHF_NO_UNRES_UNDEF (1 << 13) +#define RHF_RLD_ORDER_SAFE (1 << 14) + + + +typedef struct +{ + Elf32_Word l_name; + Elf32_Word l_time_stamp; + Elf32_Word l_checksum; + Elf32_Word l_version; + Elf32_Word l_flags; +} Elf32_Lib; + +typedef struct +{ + Elf64_Word l_name; + Elf64_Word l_time_stamp; + Elf64_Word l_checksum; + Elf64_Word l_version; + Elf64_Word l_flags; +} Elf64_Lib; + + + + +#define LL_NONE 0 +#define LL_EXACT_MATCH (1 << 0) +#define LL_IGNORE_INT_VER (1 << 1) +#define LL_REQUIRE_MINOR (1 << 2) +#define LL_EXPORTS (1 << 3) +#define LL_DELAY_LOAD (1 << 4) +#define LL_DELTA (1 << 5) + + + +typedef Elf32_Addr Elf32_Conflict; + + + + + + +#define EF_PARISC_TRAPNIL 0x00010000 +#define EF_PARISC_EXT 0x00020000 +#define EF_PARISC_LSB 0x00040000 +#define EF_PARISC_WIDE 0x00080000 +#define EF_PARISC_NO_KABP 0x00100000 + +#define EF_PARISC_LAZYSWAP 0x00400000 +#define EF_PARISC_ARCH 0x0000ffff + + + +#define EFA_PARISC_1_0 0x020b +#define EFA_PARISC_1_1 0x0210 +#define EFA_PARISC_2_0 0x0214 + + + +#define SHN_PARISC_ANSI_COMMON 0xff00 + +#define SHN_PARISC_HUGE_COMMON 0xff01 + + + +#define SHT_PARISC_EXT 0x70000000 +#define SHT_PARISC_UNWIND 0x70000001 +#define SHT_PARISC_DOC 0x70000002 + + + +#define SHF_PARISC_SHORT 0x20000000 +#define SHF_PARISC_HUGE 0x40000000 +#define SHF_PARISC_SBP 0x80000000 + + + +#define STT_PARISC_MILLICODE 13 + +#define STT_HP_OPAQUE (STT_LOOS + 0x1) +#define STT_HP_STUB (STT_LOOS + 0x2) + + + +#define R_PARISC_NONE 0 +#define R_PARISC_DIR32 1 +#define R_PARISC_DIR21L 2 +#define R_PARISC_DIR17R 3 +#define R_PARISC_DIR17F 4 +#define R_PARISC_DIR14R 6 +#define R_PARISC_PCREL32 9 +#define R_PARISC_PCREL21L 10 +#define R_PARISC_PCREL17R 11 +#define R_PARISC_PCREL17F 12 +#define R_PARISC_PCREL14R 14 +#define R_PARISC_DPREL21L 18 +#define R_PARISC_DPREL14R 22 +#define R_PARISC_GPREL21L 26 +#define R_PARISC_GPREL14R 30 +#define R_PARISC_LTOFF21L 34 +#define R_PARISC_LTOFF14R 38 +#define R_PARISC_SECREL32 41 +#define R_PARISC_SEGBASE 48 +#define R_PARISC_SEGREL32 49 +#define R_PARISC_PLTOFF21L 50 +#define R_PARISC_PLTOFF14R 54 +#define R_PARISC_LTOFF_FPTR32 57 +#define R_PARISC_LTOFF_FPTR21L 58 +#define R_PARISC_LTOFF_FPTR14R 62 +#define R_PARISC_FPTR64 64 +#define R_PARISC_PLABEL32 65 +#define R_PARISC_PLABEL21L 66 +#define R_PARISC_PLABEL14R 70 +#define R_PARISC_PCREL64 72 +#define R_PARISC_PCREL22F 74 +#define R_PARISC_PCREL14WR 75 +#define R_PARISC_PCREL14DR 76 +#define R_PARISC_PCREL16F 77 +#define R_PARISC_PCREL16WF 78 +#define R_PARISC_PCREL16DF 79 +#define R_PARISC_DIR64 80 +#define R_PARISC_DIR14WR 83 +#define R_PARISC_DIR14DR 84 +#define R_PARISC_DIR16F 85 +#define R_PARISC_DIR16WF 86 +#define R_PARISC_DIR16DF 87 +#define R_PARISC_GPREL64 88 +#define R_PARISC_GPREL14WR 91 +#define R_PARISC_GPREL14DR 92 +#define R_PARISC_GPREL16F 93 +#define R_PARISC_GPREL16WF 94 +#define R_PARISC_GPREL16DF 95 +#define R_PARISC_LTOFF64 96 +#define R_PARISC_LTOFF14WR 99 +#define R_PARISC_LTOFF14DR 100 +#define R_PARISC_LTOFF16F 101 +#define R_PARISC_LTOFF16WF 102 +#define R_PARISC_LTOFF16DF 103 +#define R_PARISC_SECREL64 104 +#define R_PARISC_SEGREL64 112 +#define R_PARISC_PLTOFF14WR 115 +#define R_PARISC_PLTOFF14DR 116 +#define R_PARISC_PLTOFF16F 117 +#define R_PARISC_PLTOFF16WF 118 +#define R_PARISC_PLTOFF16DF 119 +#define R_PARISC_LTOFF_FPTR64 120 +#define R_PARISC_LTOFF_FPTR14WR 123 +#define R_PARISC_LTOFF_FPTR14DR 124 +#define R_PARISC_LTOFF_FPTR16F 125 +#define R_PARISC_LTOFF_FPTR16WF 126 +#define R_PARISC_LTOFF_FPTR16DF 127 +#define R_PARISC_LORESERVE 128 +#define R_PARISC_COPY 128 +#define R_PARISC_IPLT 129 +#define R_PARISC_EPLT 130 +#define R_PARISC_TPREL32 153 +#define R_PARISC_TPREL21L 154 +#define R_PARISC_TPREL14R 158 +#define R_PARISC_LTOFF_TP21L 162 +#define R_PARISC_LTOFF_TP14R 166 +#define R_PARISC_LTOFF_TP14F 167 +#define R_PARISC_TPREL64 216 +#define R_PARISC_TPREL14WR 219 +#define R_PARISC_TPREL14DR 220 +#define R_PARISC_TPREL16F 221 +#define R_PARISC_TPREL16WF 222 +#define R_PARISC_TPREL16DF 223 +#define R_PARISC_LTOFF_TP64 224 +#define R_PARISC_LTOFF_TP14WR 227 +#define R_PARISC_LTOFF_TP14DR 228 +#define R_PARISC_LTOFF_TP16F 229 +#define R_PARISC_LTOFF_TP16WF 230 +#define R_PARISC_LTOFF_TP16DF 231 +#define R_PARISC_GNU_VTENTRY 232 +#define R_PARISC_GNU_VTINHERIT 233 +#define R_PARISC_TLS_GD21L 234 +#define R_PARISC_TLS_GD14R 235 +#define R_PARISC_TLS_GDCALL 236 +#define R_PARISC_TLS_LDM21L 237 +#define R_PARISC_TLS_LDM14R 238 +#define R_PARISC_TLS_LDMCALL 239 +#define R_PARISC_TLS_LDO21L 240 +#define R_PARISC_TLS_LDO14R 241 +#define R_PARISC_TLS_DTPMOD32 242 +#define R_PARISC_TLS_DTPMOD64 243 +#define R_PARISC_TLS_DTPOFF32 244 +#define R_PARISC_TLS_DTPOFF64 245 +#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L +#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R +#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L +#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R +#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32 +#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64 +#define R_PARISC_HIRESERVE 255 + + + +#define PT_HP_TLS (PT_LOOS + 0x0) +#define PT_HP_CORE_NONE (PT_LOOS + 0x1) +#define PT_HP_CORE_VERSION (PT_LOOS + 0x2) +#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3) +#define PT_HP_CORE_COMM (PT_LOOS + 0x4) +#define PT_HP_CORE_PROC (PT_LOOS + 0x5) +#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6) +#define PT_HP_CORE_STACK (PT_LOOS + 0x7) +#define PT_HP_CORE_SHM (PT_LOOS + 0x8) +#define PT_HP_CORE_MMF (PT_LOOS + 0x9) +#define PT_HP_PARALLEL (PT_LOOS + 0x10) +#define PT_HP_FASTBIND (PT_LOOS + 0x11) +#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12) +#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13) +#define PT_HP_STACK (PT_LOOS + 0x14) + +#define PT_PARISC_ARCHEXT 0x70000000 +#define PT_PARISC_UNWIND 0x70000001 + + + +#define PF_PARISC_SBP 0x08000000 + +#define PF_HP_PAGE_SIZE 0x00100000 +#define PF_HP_FAR_SHARED 0x00200000 +#define PF_HP_NEAR_SHARED 0x00400000 +#define PF_HP_CODE 0x01000000 +#define PF_HP_MODIFY 0x02000000 +#define PF_HP_LAZYSWAP 0x04000000 +#define PF_HP_SBP 0x08000000 + + + + + + +#define EF_ALPHA_32BIT 1 +#define EF_ALPHA_CANRELAX 2 + + + + +#define SHT_ALPHA_DEBUG 0x70000001 +#define SHT_ALPHA_REGINFO 0x70000002 + + + +#define SHF_ALPHA_GPREL 0x10000000 + + +#define STO_ALPHA_NOPV 0x80 +#define STO_ALPHA_STD_GPLOAD 0x88 + + + +#define R_ALPHA_NONE 0 +#define R_ALPHA_REFLONG 1 +#define R_ALPHA_REFQUAD 2 +#define R_ALPHA_GPREL32 3 +#define R_ALPHA_LITERAL 4 +#define R_ALPHA_LITUSE 5 +#define R_ALPHA_GPDISP 6 +#define R_ALPHA_BRADDR 7 +#define R_ALPHA_HINT 8 +#define R_ALPHA_SREL16 9 +#define R_ALPHA_SREL32 10 +#define R_ALPHA_SREL64 11 +#define R_ALPHA_GPRELHIGH 17 +#define R_ALPHA_GPRELLOW 18 +#define R_ALPHA_GPREL16 19 +#define R_ALPHA_COPY 24 +#define R_ALPHA_GLOB_DAT 25 +#define R_ALPHA_JMP_SLOT 26 +#define R_ALPHA_RELATIVE 27 +#define R_ALPHA_TLS_GD_HI 28 +#define R_ALPHA_TLSGD 29 +#define R_ALPHA_TLS_LDM 30 +#define R_ALPHA_DTPMOD64 31 +#define R_ALPHA_GOTDTPREL 32 +#define R_ALPHA_DTPREL64 33 +#define R_ALPHA_DTPRELHI 34 +#define R_ALPHA_DTPRELLO 35 +#define R_ALPHA_DTPREL16 36 +#define R_ALPHA_GOTTPREL 37 +#define R_ALPHA_TPREL64 38 +#define R_ALPHA_TPRELHI 39 +#define R_ALPHA_TPRELLO 40 +#define R_ALPHA_TPREL16 41 + +#define R_ALPHA_NUM 46 + + +#define LITUSE_ALPHA_ADDR 0 +#define LITUSE_ALPHA_BASE 1 +#define LITUSE_ALPHA_BYTOFF 2 +#define LITUSE_ALPHA_JSR 3 +#define LITUSE_ALPHA_TLS_GD 4 +#define LITUSE_ALPHA_TLS_LDM 5 + + +#define DT_ALPHA_PLTRO (DT_LOPROC + 0) +#define DT_ALPHA_NUM 1 + + + + +#define EF_PPC_EMB 0x80000000 + + +#define EF_PPC_RELOCATABLE 0x00010000 +#define EF_PPC_RELOCATABLE_LIB 0x00008000 + + + +#define R_PPC_NONE 0 +#define R_PPC_ADDR32 1 +#define R_PPC_ADDR24 2 +#define R_PPC_ADDR16 3 +#define R_PPC_ADDR16_LO 4 +#define R_PPC_ADDR16_HI 5 +#define R_PPC_ADDR16_HA 6 +#define R_PPC_ADDR14 7 +#define R_PPC_ADDR14_BRTAKEN 8 +#define R_PPC_ADDR14_BRNTAKEN 9 +#define R_PPC_REL24 10 +#define R_PPC_REL14 11 +#define R_PPC_REL14_BRTAKEN 12 +#define R_PPC_REL14_BRNTAKEN 13 +#define R_PPC_GOT16 14 +#define R_PPC_GOT16_LO 15 +#define R_PPC_GOT16_HI 16 +#define R_PPC_GOT16_HA 17 +#define R_PPC_PLTREL24 18 +#define R_PPC_COPY 19 +#define R_PPC_GLOB_DAT 20 +#define R_PPC_JMP_SLOT 21 +#define R_PPC_RELATIVE 22 +#define R_PPC_LOCAL24PC 23 +#define R_PPC_UADDR32 24 +#define R_PPC_UADDR16 25 +#define R_PPC_REL32 26 +#define R_PPC_PLT32 27 +#define R_PPC_PLTREL32 28 +#define R_PPC_PLT16_LO 29 +#define R_PPC_PLT16_HI 30 +#define R_PPC_PLT16_HA 31 +#define R_PPC_SDAREL16 32 +#define R_PPC_SECTOFF 33 +#define R_PPC_SECTOFF_LO 34 +#define R_PPC_SECTOFF_HI 35 +#define R_PPC_SECTOFF_HA 36 + + +#define R_PPC_TLS 67 +#define R_PPC_DTPMOD32 68 +#define R_PPC_TPREL16 69 +#define R_PPC_TPREL16_LO 70 +#define R_PPC_TPREL16_HI 71 +#define R_PPC_TPREL16_HA 72 +#define R_PPC_TPREL32 73 +#define R_PPC_DTPREL16 74 +#define R_PPC_DTPREL16_LO 75 +#define R_PPC_DTPREL16_HI 76 +#define R_PPC_DTPREL16_HA 77 +#define R_PPC_DTPREL32 78 +#define R_PPC_GOT_TLSGD16 79 +#define R_PPC_GOT_TLSGD16_LO 80 +#define R_PPC_GOT_TLSGD16_HI 81 +#define R_PPC_GOT_TLSGD16_HA 82 +#define R_PPC_GOT_TLSLD16 83 +#define R_PPC_GOT_TLSLD16_LO 84 +#define R_PPC_GOT_TLSLD16_HI 85 +#define R_PPC_GOT_TLSLD16_HA 86 +#define R_PPC_GOT_TPREL16 87 +#define R_PPC_GOT_TPREL16_LO 88 +#define R_PPC_GOT_TPREL16_HI 89 +#define R_PPC_GOT_TPREL16_HA 90 +#define R_PPC_GOT_DTPREL16 91 +#define R_PPC_GOT_DTPREL16_LO 92 +#define R_PPC_GOT_DTPREL16_HI 93 +#define R_PPC_GOT_DTPREL16_HA 94 + + + +#define R_PPC_EMB_NADDR32 101 +#define R_PPC_EMB_NADDR16 102 +#define R_PPC_EMB_NADDR16_LO 103 +#define R_PPC_EMB_NADDR16_HI 104 +#define R_PPC_EMB_NADDR16_HA 105 +#define R_PPC_EMB_SDAI16 106 +#define R_PPC_EMB_SDA2I16 107 +#define R_PPC_EMB_SDA2REL 108 +#define R_PPC_EMB_SDA21 109 +#define R_PPC_EMB_MRKREF 110 +#define R_PPC_EMB_RELSEC16 111 +#define R_PPC_EMB_RELST_LO 112 +#define R_PPC_EMB_RELST_HI 113 +#define R_PPC_EMB_RELST_HA 114 +#define R_PPC_EMB_BIT_FLD 115 +#define R_PPC_EMB_RELSDA 116 + + +#define R_PPC_DIAB_SDA21_LO 180 +#define R_PPC_DIAB_SDA21_HI 181 +#define R_PPC_DIAB_SDA21_HA 182 +#define R_PPC_DIAB_RELSDA_LO 183 +#define R_PPC_DIAB_RELSDA_HI 184 +#define R_PPC_DIAB_RELSDA_HA 185 + + +#define R_PPC_IRELATIVE 248 + + +#define R_PPC_REL16 249 +#define R_PPC_REL16_LO 250 +#define R_PPC_REL16_HI 251 +#define R_PPC_REL16_HA 252 + + + +#define R_PPC_TOC16 255 + + +#define DT_PPC_GOT (DT_LOPROC + 0) +#define DT_PPC_NUM 1 + + +#define R_PPC64_NONE R_PPC_NONE +#define R_PPC64_ADDR32 R_PPC_ADDR32 +#define R_PPC64_ADDR24 R_PPC_ADDR24 +#define R_PPC64_ADDR16 R_PPC_ADDR16 +#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO +#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI +#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA +#define R_PPC64_ADDR14 R_PPC_ADDR14 +#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN +#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN +#define R_PPC64_REL24 R_PPC_REL24 +#define R_PPC64_REL14 R_PPC_REL14 +#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN +#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN +#define R_PPC64_GOT16 R_PPC_GOT16 +#define R_PPC64_GOT16_LO R_PPC_GOT16_LO +#define R_PPC64_GOT16_HI R_PPC_GOT16_HI +#define R_PPC64_GOT16_HA R_PPC_GOT16_HA + +#define R_PPC64_COPY R_PPC_COPY +#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT +#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT +#define R_PPC64_RELATIVE R_PPC_RELATIVE + +#define R_PPC64_UADDR32 R_PPC_UADDR32 +#define R_PPC64_UADDR16 R_PPC_UADDR16 +#define R_PPC64_REL32 R_PPC_REL32 +#define R_PPC64_PLT32 R_PPC_PLT32 +#define R_PPC64_PLTREL32 R_PPC_PLTREL32 +#define R_PPC64_PLT16_LO R_PPC_PLT16_LO +#define R_PPC64_PLT16_HI R_PPC_PLT16_HI +#define R_PPC64_PLT16_HA R_PPC_PLT16_HA + +#define R_PPC64_SECTOFF R_PPC_SECTOFF +#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO +#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI +#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA +#define R_PPC64_ADDR30 37 +#define R_PPC64_ADDR64 38 +#define R_PPC64_ADDR16_HIGHER 39 +#define R_PPC64_ADDR16_HIGHERA 40 +#define R_PPC64_ADDR16_HIGHEST 41 +#define R_PPC64_ADDR16_HIGHESTA 42 +#define R_PPC64_UADDR64 43 +#define R_PPC64_REL64 44 +#define R_PPC64_PLT64 45 +#define R_PPC64_PLTREL64 46 +#define R_PPC64_TOC16 47 +#define R_PPC64_TOC16_LO 48 +#define R_PPC64_TOC16_HI 49 +#define R_PPC64_TOC16_HA 50 +#define R_PPC64_TOC 51 +#define R_PPC64_PLTGOT16 52 +#define R_PPC64_PLTGOT16_LO 53 +#define R_PPC64_PLTGOT16_HI 54 +#define R_PPC64_PLTGOT16_HA 55 + +#define R_PPC64_ADDR16_DS 56 +#define R_PPC64_ADDR16_LO_DS 57 +#define R_PPC64_GOT16_DS 58 +#define R_PPC64_GOT16_LO_DS 59 +#define R_PPC64_PLT16_LO_DS 60 +#define R_PPC64_SECTOFF_DS 61 +#define R_PPC64_SECTOFF_LO_DS 62 +#define R_PPC64_TOC16_DS 63 +#define R_PPC64_TOC16_LO_DS 64 +#define R_PPC64_PLTGOT16_DS 65 +#define R_PPC64_PLTGOT16_LO_DS 66 + + +#define R_PPC64_TLS 67 +#define R_PPC64_DTPMOD64 68 +#define R_PPC64_TPREL16 69 +#define R_PPC64_TPREL16_LO 70 +#define R_PPC64_TPREL16_HI 71 +#define R_PPC64_TPREL16_HA 72 +#define R_PPC64_TPREL64 73 +#define R_PPC64_DTPREL16 74 +#define R_PPC64_DTPREL16_LO 75 +#define R_PPC64_DTPREL16_HI 76 +#define R_PPC64_DTPREL16_HA 77 +#define R_PPC64_DTPREL64 78 +#define R_PPC64_GOT_TLSGD16 79 +#define R_PPC64_GOT_TLSGD16_LO 80 +#define R_PPC64_GOT_TLSGD16_HI 81 +#define R_PPC64_GOT_TLSGD16_HA 82 +#define R_PPC64_GOT_TLSLD16 83 +#define R_PPC64_GOT_TLSLD16_LO 84 +#define R_PPC64_GOT_TLSLD16_HI 85 +#define R_PPC64_GOT_TLSLD16_HA 86 +#define R_PPC64_GOT_TPREL16_DS 87 +#define R_PPC64_GOT_TPREL16_LO_DS 88 +#define R_PPC64_GOT_TPREL16_HI 89 +#define R_PPC64_GOT_TPREL16_HA 90 +#define R_PPC64_GOT_DTPREL16_DS 91 +#define R_PPC64_GOT_DTPREL16_LO_DS 92 +#define R_PPC64_GOT_DTPREL16_HI 93 +#define R_PPC64_GOT_DTPREL16_HA 94 +#define R_PPC64_TPREL16_DS 95 +#define R_PPC64_TPREL16_LO_DS 96 +#define R_PPC64_TPREL16_HIGHER 97 +#define R_PPC64_TPREL16_HIGHERA 98 +#define R_PPC64_TPREL16_HIGHEST 99 +#define R_PPC64_TPREL16_HIGHESTA 100 +#define R_PPC64_DTPREL16_DS 101 +#define R_PPC64_DTPREL16_LO_DS 102 +#define R_PPC64_DTPREL16_HIGHER 103 +#define R_PPC64_DTPREL16_HIGHERA 104 +#define R_PPC64_DTPREL16_HIGHEST 105 +#define R_PPC64_DTPREL16_HIGHESTA 106 + + +#define R_PPC64_JMP_IREL 247 +#define R_PPC64_IRELATIVE 248 +#define R_PPC64_REL16 249 +#define R_PPC64_REL16_LO 250 +#define R_PPC64_REL16_HI 251 +#define R_PPC64_REL16_HA 252 + + +#define DT_PPC64_GLINK (DT_LOPROC + 0) +#define DT_PPC64_OPD (DT_LOPROC + 1) +#define DT_PPC64_OPDSZ (DT_LOPROC + 2) +#define DT_PPC64_NUM 3 + + + + + +#define EF_ARM_RELEXEC 0x01 +#define EF_ARM_HASENTRY 0x02 +#define EF_ARM_INTERWORK 0x04 +#define EF_ARM_APCS_26 0x08 +#define EF_ARM_APCS_FLOAT 0x10 +#define EF_ARM_PIC 0x20 +#define EF_ARM_ALIGN8 0x40 +#define EF_ARM_NEW_ABI 0x80 +#define EF_ARM_OLD_ABI 0x100 +#define EF_ARM_SOFT_FLOAT 0x200 +#define EF_ARM_VFP_FLOAT 0x400 +#define EF_ARM_MAVERICK_FLOAT 0x800 + +#define EF_ARM_ABI_FLOAT_SOFT 0x200 +#define EF_ARM_ABI_FLOAT_HARD 0x400 + + +#define EF_ARM_SYMSARESORTED 0x04 +#define EF_ARM_DYNSYMSUSESEGIDX 0x08 +#define EF_ARM_MAPSYMSFIRST 0x10 +#define EF_ARM_EABIMASK 0XFF000000 + + +#define EF_ARM_BE8 0x00800000 +#define EF_ARM_LE8 0x00400000 + +#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) +#define EF_ARM_EABI_UNKNOWN 0x00000000 +#define EF_ARM_EABI_VER1 0x01000000 +#define EF_ARM_EABI_VER2 0x02000000 +#define EF_ARM_EABI_VER3 0x03000000 +#define EF_ARM_EABI_VER4 0x04000000 +#define EF_ARM_EABI_VER5 0x05000000 + + +#define STT_ARM_TFUNC STT_LOPROC +#define STT_ARM_16BIT STT_HIPROC + + +#define SHF_ARM_ENTRYSECT 0x10000000 +#define SHF_ARM_COMDEF 0x80000000 + + + +#define PF_ARM_SB 0x10000000 + +#define PF_ARM_PI 0x20000000 +#define PF_ARM_ABS 0x40000000 + + +#define PT_ARM_EXIDX (PT_LOPROC + 1) + + +#define SHT_ARM_EXIDX (SHT_LOPROC + 1) +#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) +#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) + + +#define R_AARCH64_NONE 0 +#define R_AARCH64_ABS64 257 +#define R_AARCH64_ABS32 258 +#define R_AARCH64_ABS16 259 +#define R_AARCH64_PREL64 260 +#define R_AARCH64_PREL32 261 +#define R_AARCH64_PREL16 262 +#define R_AARCH64_MOVW_UABS_G0 263 +#define R_AARCH64_MOVW_UABS_G0_NC 264 +#define R_AARCH64_MOVW_UABS_G1 265 +#define R_AARCH64_MOVW_UABS_G1_NC 266 +#define R_AARCH64_MOVW_UABS_G2 267 +#define R_AARCH64_MOVW_UABS_G2_NC 268 +#define R_AARCH64_MOVW_UABS_G3 269 +#define R_AARCH64_MOVW_SABS_G0 270 +#define R_AARCH64_MOVW_SABS_G1 271 +#define R_AARCH64_MOVW_SABS_G2 272 +#define R_AARCH64_LD_PREL_LO19 273 +#define R_AARCH64_ADR_PREL_LO21 274 +#define R_AARCH64_ADR_PREL_PG_HI21 275 +#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 +#define R_AARCH64_ADD_ABS_LO12_NC 277 +#define R_AARCH64_LDST8_ABS_LO12_NC 278 +#define R_AARCH64_TSTBR14 279 +#define R_AARCH64_CONDBR19 280 +#define R_AARCH64_JUMP26 282 +#define R_AARCH64_CALL26 283 +#define R_AARCH64_LDST16_ABS_LO12_NC 284 +#define R_AARCH64_LDST32_ABS_LO12_NC 285 +#define R_AARCH64_LDST64_ABS_LO12_NC 286 +#define R_AARCH64_MOVW_PREL_G0 287 +#define R_AARCH64_MOVW_PREL_G0_NC 288 +#define R_AARCH64_MOVW_PREL_G1 289 +#define R_AARCH64_MOVW_PREL_G1_NC 290 +#define R_AARCH64_MOVW_PREL_G2 291 +#define R_AARCH64_MOVW_PREL_G2_NC 292 +#define R_AARCH64_MOVW_PREL_G3 293 +#define R_AARCH64_LDST128_ABS_LO12_NC 299 +#define R_AARCH64_MOVW_GOTOFF_G0 300 +#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 +#define R_AARCH64_MOVW_GOTOFF_G1 302 +#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 +#define R_AARCH64_MOVW_GOTOFF_G2 304 +#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 +#define R_AARCH64_MOVW_GOTOFF_G3 306 +#define R_AARCH64_GOTREL64 307 +#define R_AARCH64_GOTREL32 308 +#define R_AARCH64_GOT_LD_PREL19 309 +#define R_AARCH64_LD64_GOTOFF_LO15 310 +#define R_AARCH64_ADR_GOT_PAGE 311 +#define R_AARCH64_LD64_GOT_LO12_NC 312 +#define R_AARCH64_LD64_GOTPAGE_LO15 313 +#define R_AARCH64_TLSGD_ADR_PREL21 512 +#define R_AARCH64_TLSGD_ADR_PAGE21 513 +#define R_AARCH64_TLSGD_ADD_LO12_NC 514 +#define R_AARCH64_TLSGD_MOVW_G1 515 +#define R_AARCH64_TLSGD_MOVW_G0_NC 516 +#define R_AARCH64_TLSLD_ADR_PREL21 517 +#define R_AARCH64_TLSLD_ADR_PAGE21 518 +#define R_AARCH64_TLSLD_ADD_LO12_NC 519 +#define R_AARCH64_TLSLD_MOVW_G1 520 +#define R_AARCH64_TLSLD_MOVW_G0_NC 521 +#define R_AARCH64_TLSLD_LD_PREL19 522 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 +#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 +#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 +#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 +#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 +#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 +#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 +#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 +#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 +#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 +#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 +#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 +#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 +#define R_AARCH64_TLSDESC_LD_PREL19 560 +#define R_AARCH64_TLSDESC_ADR_PREL21 561 +#define R_AARCH64_TLSDESC_ADR_PAGE21 562 +#define R_AARCH64_TLSDESC_LD64_LO12 563 +#define R_AARCH64_TLSDESC_ADD_LO12 564 +#define R_AARCH64_TLSDESC_OFF_G1 565 +#define R_AARCH64_TLSDESC_OFF_G0_NC 566 +#define R_AARCH64_TLSDESC_LDR 567 +#define R_AARCH64_TLSDESC_ADD 568 +#define R_AARCH64_TLSDESC_CALL 569 +#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 +#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 +#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 +#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 +#define R_AARCH64_COPY 1024 +#define R_AARCH64_GLOB_DAT 1025 +#define R_AARCH64_JUMP_SLOT 1026 +#define R_AARCH64_RELATIVE 1027 +#define R_AARCH64_TLS_DTPMOD64 1028 +#define R_AARCH64_TLS_DTPREL64 1029 +#define R_AARCH64_TLS_TPREL64 1030 +#define R_AARCH64_TLSDESC 1031 + + +#define R_ARM_NONE 0 +#define R_ARM_PC24 1 +#define R_ARM_ABS32 2 +#define R_ARM_REL32 3 +#define R_ARM_PC13 4 +#define R_ARM_ABS16 5 +#define R_ARM_ABS12 6 +#define R_ARM_THM_ABS5 7 +#define R_ARM_ABS8 8 +#define R_ARM_SBREL32 9 +#define R_ARM_THM_PC22 10 +#define R_ARM_THM_PC8 11 +#define R_ARM_AMP_VCALL9 12 +#define R_ARM_TLS_DESC 13 +#define R_ARM_THM_SWI8 14 +#define R_ARM_XPC25 15 +#define R_ARM_THM_XPC22 16 +#define R_ARM_TLS_DTPMOD32 17 +#define R_ARM_TLS_DTPOFF32 18 +#define R_ARM_TLS_TPOFF32 19 +#define R_ARM_COPY 20 +#define R_ARM_GLOB_DAT 21 +#define R_ARM_JUMP_SLOT 22 +#define R_ARM_RELATIVE 23 +#define R_ARM_GOTOFF 24 +#define R_ARM_GOTPC 25 +#define R_ARM_GOT32 26 +#define R_ARM_PLT32 27 +#define R_ARM_CALL 28 +#define R_ARM_JUMP24 29 +#define R_ARM_THM_JUMP24 30 +#define R_ARM_BASE_ABS 31 +#define R_ARM_ALU_PCREL_7_0 32 +#define R_ARM_ALU_PCREL_15_8 33 +#define R_ARM_ALU_PCREL_23_15 34 +#define R_ARM_LDR_SBREL_11_0 35 +#define R_ARM_ALU_SBREL_19_12 36 +#define R_ARM_ALU_SBREL_27_20 37 +#define R_ARM_TARGET1 38 +#define R_ARM_SBREL31 39 +#define R_ARM_V4BX 40 +#define R_ARM_TARGET2 41 +#define R_ARM_PREL31 42 +#define R_ARM_MOVW_ABS_NC 43 +#define R_ARM_MOVT_ABS 44 +#define R_ARM_MOVW_PREL_NC 45 +#define R_ARM_MOVT_PREL 46 +#define R_ARM_THM_MOVW_ABS_NC 47 +#define R_ARM_THM_MOVT_ABS 48 +#define R_ARM_THM_MOVW_PREL_NC 49 +#define R_ARM_THM_MOVT_PREL 50 +#define R_ARM_THM_JUMP19 51 +#define R_ARM_THM_JUMP6 52 +#define R_ARM_THM_ALU_PREL_11_0 53 +#define R_ARM_THM_PC12 54 +#define R_ARM_ABS32_NOI 55 +#define R_ARM_REL32_NOI 56 +#define R_ARM_ALU_PC_G0_NC 57 +#define R_ARM_ALU_PC_G0 58 +#define R_ARM_ALU_PC_G1_NC 59 +#define R_ARM_ALU_PC_G1 60 +#define R_ARM_ALU_PC_G2 61 +#define R_ARM_LDR_PC_G1 62 +#define R_ARM_LDR_PC_G2 63 +#define R_ARM_LDRS_PC_G0 64 +#define R_ARM_LDRS_PC_G1 65 +#define R_ARM_LDRS_PC_G2 66 +#define R_ARM_LDC_PC_G0 67 +#define R_ARM_LDC_PC_G1 68 +#define R_ARM_LDC_PC_G2 69 +#define R_ARM_ALU_SB_G0_NC 70 +#define R_ARM_ALU_SB_G0 71 +#define R_ARM_ALU_SB_G1_NC 72 +#define R_ARM_ALU_SB_G1 73 +#define R_ARM_ALU_SB_G2 74 +#define R_ARM_LDR_SB_G0 75 +#define R_ARM_LDR_SB_G1 76 +#define R_ARM_LDR_SB_G2 77 +#define R_ARM_LDRS_SB_G0 78 +#define R_ARM_LDRS_SB_G1 79 +#define R_ARM_LDRS_SB_G2 80 +#define R_ARM_LDC_SB_G0 81 +#define R_ARM_LDC_SB_G1 82 +#define R_ARM_LDC_SB_G2 83 +#define R_ARM_MOVW_BREL_NC 84 +#define R_ARM_MOVT_BREL 85 +#define R_ARM_MOVW_BREL 86 +#define R_ARM_THM_MOVW_BREL_NC 87 +#define R_ARM_THM_MOVT_BREL 88 +#define R_ARM_THM_MOVW_BREL 89 +#define R_ARM_TLS_GOTDESC 90 +#define R_ARM_TLS_CALL 91 +#define R_ARM_TLS_DESCSEQ 92 +#define R_ARM_THM_TLS_CALL 93 +#define R_ARM_PLT32_ABS 94 +#define R_ARM_GOT_ABS 95 +#define R_ARM_GOT_PREL 96 +#define R_ARM_GOT_BREL12 97 +#define R_ARM_GOTOFF12 98 +#define R_ARM_GOTRELAX 99 +#define R_ARM_GNU_VTENTRY 100 +#define R_ARM_GNU_VTINHERIT 101 +#define R_ARM_THM_PC11 102 +#define R_ARM_THM_PC9 103 +#define R_ARM_TLS_GD32 104 + +#define R_ARM_TLS_LDM32 105 + +#define R_ARM_TLS_LDO32 106 + +#define R_ARM_TLS_IE32 107 + +#define R_ARM_TLS_LE32 108 +#define R_ARM_TLS_LDO12 109 +#define R_ARM_TLS_LE12 110 +#define R_ARM_TLS_IE12GP 111 +#define R_ARM_ME_TOO 128 +#define R_ARM_THM_TLS_DESCSEQ 129 +#define R_ARM_THM_TLS_DESCSEQ16 129 +#define R_ARM_THM_TLS_DESCSEQ32 130 +#define R_ARM_THM_GOT_BREL12 131 +#define R_ARM_IRELATIVE 160 +#define R_ARM_RXPC25 249 +#define R_ARM_RSBREL32 250 +#define R_ARM_THM_RPC22 251 +#define R_ARM_RREL32 252 +#define R_ARM_RABS22 253 +#define R_ARM_RPC24 254 +#define R_ARM_RBASE 255 + +#define R_ARM_NUM 256 + + + + +#define EF_IA_64_MASKOS 0x0000000f +#define EF_IA_64_ABI64 0x00000010 +#define EF_IA_64_ARCH 0xff000000 + + +#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) +#define PT_IA_64_UNWIND (PT_LOPROC + 1) +#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12) +#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13) +#define PT_IA_64_HP_STACK (PT_LOOS + 0x14) + + +#define PF_IA_64_NORECOV 0x80000000 + + +#define SHT_IA_64_EXT (SHT_LOPROC + 0) +#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) + + +#define SHF_IA_64_SHORT 0x10000000 +#define SHF_IA_64_NORECOV 0x20000000 + + +#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0) +#define DT_IA_64_NUM 1 + + +#define R_IA64_NONE 0x00 +#define R_IA64_IMM14 0x21 +#define R_IA64_IMM22 0x22 +#define R_IA64_IMM64 0x23 +#define R_IA64_DIR32MSB 0x24 +#define R_IA64_DIR32LSB 0x25 +#define R_IA64_DIR64MSB 0x26 +#define R_IA64_DIR64LSB 0x27 +#define R_IA64_GPREL22 0x2a +#define R_IA64_GPREL64I 0x2b +#define R_IA64_GPREL32MSB 0x2c +#define R_IA64_GPREL32LSB 0x2d +#define R_IA64_GPREL64MSB 0x2e +#define R_IA64_GPREL64LSB 0x2f +#define R_IA64_LTOFF22 0x32 +#define R_IA64_LTOFF64I 0x33 +#define R_IA64_PLTOFF22 0x3a +#define R_IA64_PLTOFF64I 0x3b +#define R_IA64_PLTOFF64MSB 0x3e +#define R_IA64_PLTOFF64LSB 0x3f +#define R_IA64_FPTR64I 0x43 +#define R_IA64_FPTR32MSB 0x44 +#define R_IA64_FPTR32LSB 0x45 +#define R_IA64_FPTR64MSB 0x46 +#define R_IA64_FPTR64LSB 0x47 +#define R_IA64_PCREL60B 0x48 +#define R_IA64_PCREL21B 0x49 +#define R_IA64_PCREL21M 0x4a +#define R_IA64_PCREL21F 0x4b +#define R_IA64_PCREL32MSB 0x4c +#define R_IA64_PCREL32LSB 0x4d +#define R_IA64_PCREL64MSB 0x4e +#define R_IA64_PCREL64LSB 0x4f +#define R_IA64_LTOFF_FPTR22 0x52 +#define R_IA64_LTOFF_FPTR64I 0x53 +#define R_IA64_LTOFF_FPTR32MSB 0x54 +#define R_IA64_LTOFF_FPTR32LSB 0x55 +#define R_IA64_LTOFF_FPTR64MSB 0x56 +#define R_IA64_LTOFF_FPTR64LSB 0x57 +#define R_IA64_SEGREL32MSB 0x5c +#define R_IA64_SEGREL32LSB 0x5d +#define R_IA64_SEGREL64MSB 0x5e +#define R_IA64_SEGREL64LSB 0x5f +#define R_IA64_SECREL32MSB 0x64 +#define R_IA64_SECREL32LSB 0x65 +#define R_IA64_SECREL64MSB 0x66 +#define R_IA64_SECREL64LSB 0x67 +#define R_IA64_REL32MSB 0x6c +#define R_IA64_REL32LSB 0x6d +#define R_IA64_REL64MSB 0x6e +#define R_IA64_REL64LSB 0x6f +#define R_IA64_LTV32MSB 0x74 +#define R_IA64_LTV32LSB 0x75 +#define R_IA64_LTV64MSB 0x76 +#define R_IA64_LTV64LSB 0x77 +#define R_IA64_PCREL21BI 0x79 +#define R_IA64_PCREL22 0x7a +#define R_IA64_PCREL64I 0x7b +#define R_IA64_IPLTMSB 0x80 +#define R_IA64_IPLTLSB 0x81 +#define R_IA64_COPY 0x84 +#define R_IA64_SUB 0x85 +#define R_IA64_LTOFF22X 0x86 +#define R_IA64_LDXMOV 0x87 +#define R_IA64_TPREL14 0x91 +#define R_IA64_TPREL22 0x92 +#define R_IA64_TPREL64I 0x93 +#define R_IA64_TPREL64MSB 0x96 +#define R_IA64_TPREL64LSB 0x97 +#define R_IA64_LTOFF_TPREL22 0x9a +#define R_IA64_DTPMOD64MSB 0xa6 +#define R_IA64_DTPMOD64LSB 0xa7 +#define R_IA64_LTOFF_DTPMOD22 0xaa +#define R_IA64_DTPREL14 0xb1 +#define R_IA64_DTPREL22 0xb2 +#define R_IA64_DTPREL64I 0xb3 +#define R_IA64_DTPREL32MSB 0xb4 +#define R_IA64_DTPREL32LSB 0xb5 +#define R_IA64_DTPREL64MSB 0xb6 +#define R_IA64_DTPREL64LSB 0xb7 +#define R_IA64_LTOFF_DTPREL22 0xba + + + + +#define R_SH_NONE 0 +#define R_SH_DIR32 1 +#define R_SH_REL32 2 +#define R_SH_DIR8WPN 3 +#define R_SH_IND12W 4 +#define R_SH_DIR8WPL 5 +#define R_SH_DIR8WPZ 6 +#define R_SH_DIR8BP 7 +#define R_SH_DIR8W 8 +#define R_SH_DIR8L 9 +#define R_SH_SWITCH16 25 +#define R_SH_SWITCH32 26 +#define R_SH_USES 27 +#define R_SH_COUNT 28 +#define R_SH_ALIGN 29 +#define R_SH_CODE 30 +#define R_SH_DATA 31 +#define R_SH_LABEL 32 +#define R_SH_SWITCH8 33 +#define R_SH_GNU_VTINHERIT 34 +#define R_SH_GNU_VTENTRY 35 +#define R_SH_TLS_GD_32 144 +#define R_SH_TLS_LD_32 145 +#define R_SH_TLS_LDO_32 146 +#define R_SH_TLS_IE_32 147 +#define R_SH_TLS_LE_32 148 +#define R_SH_TLS_DTPMOD32 149 +#define R_SH_TLS_DTPOFF32 150 +#define R_SH_TLS_TPOFF32 151 +#define R_SH_GOT32 160 +#define R_SH_PLT32 161 +#define R_SH_COPY 162 +#define R_SH_GLOB_DAT 163 +#define R_SH_JMP_SLOT 164 +#define R_SH_RELATIVE 165 +#define R_SH_GOTOFF 166 +#define R_SH_GOTPC 167 +#define R_SH_GOT20 201 +#define R_SH_GOTOFF20 202 +#define R_SH_GOTFUNCDESC 203 +#define R_SH_GOTFUNCDEST20 204 +#define R_SH_GOTOFFFUNCDESC 205 +#define R_SH_GOTOFFFUNCDEST20 206 +#define R_SH_FUNCDESC 207 +#define R_SH_FUNCDESC_VALUE 208 + +#define R_SH_NUM 256 + + + +#define R_390_NONE 0 +#define R_390_8 1 +#define R_390_12 2 +#define R_390_16 3 +#define R_390_32 4 +#define R_390_PC32 5 +#define R_390_GOT12 6 +#define R_390_GOT32 7 +#define R_390_PLT32 8 +#define R_390_COPY 9 +#define R_390_GLOB_DAT 10 +#define R_390_JMP_SLOT 11 +#define R_390_RELATIVE 12 +#define R_390_GOTOFF32 13 +#define R_390_GOTPC 14 +#define R_390_GOT16 15 +#define R_390_PC16 16 +#define R_390_PC16DBL 17 +#define R_390_PLT16DBL 18 +#define R_390_PC32DBL 19 +#define R_390_PLT32DBL 20 +#define R_390_GOTPCDBL 21 +#define R_390_64 22 +#define R_390_PC64 23 +#define R_390_GOT64 24 +#define R_390_PLT64 25 +#define R_390_GOTENT 26 +#define R_390_GOTOFF16 27 +#define R_390_GOTOFF64 28 +#define R_390_GOTPLT12 29 +#define R_390_GOTPLT16 30 +#define R_390_GOTPLT32 31 +#define R_390_GOTPLT64 32 +#define R_390_GOTPLTENT 33 +#define R_390_PLTOFF16 34 +#define R_390_PLTOFF32 35 +#define R_390_PLTOFF64 36 +#define R_390_TLS_LOAD 37 +#define R_390_TLS_GDCALL 38 + +#define R_390_TLS_LDCALL 39 + +#define R_390_TLS_GD32 40 + +#define R_390_TLS_GD64 41 + +#define R_390_TLS_GOTIE12 42 + +#define R_390_TLS_GOTIE32 43 + +#define R_390_TLS_GOTIE64 44 + +#define R_390_TLS_LDM32 45 + +#define R_390_TLS_LDM64 46 + +#define R_390_TLS_IE32 47 + +#define R_390_TLS_IE64 48 + +#define R_390_TLS_IEENT 49 + +#define R_390_TLS_LE32 50 + +#define R_390_TLS_LE64 51 + +#define R_390_TLS_LDO32 52 + +#define R_390_TLS_LDO64 53 + +#define R_390_TLS_DTPMOD 54 +#define R_390_TLS_DTPOFF 55 +#define R_390_TLS_TPOFF 56 + +#define R_390_20 57 +#define R_390_GOT20 58 +#define R_390_GOTPLT20 59 +#define R_390_TLS_GOTIE20 60 + + +#define R_390_NUM 61 + + + +#define R_CRIS_NONE 0 +#define R_CRIS_8 1 +#define R_CRIS_16 2 +#define R_CRIS_32 3 +#define R_CRIS_8_PCREL 4 +#define R_CRIS_16_PCREL 5 +#define R_CRIS_32_PCREL 6 +#define R_CRIS_GNU_VTINHERIT 7 +#define R_CRIS_GNU_VTENTRY 8 +#define R_CRIS_COPY 9 +#define R_CRIS_GLOB_DAT 10 +#define R_CRIS_JUMP_SLOT 11 +#define R_CRIS_RELATIVE 12 +#define R_CRIS_16_GOT 13 +#define R_CRIS_32_GOT 14 +#define R_CRIS_16_GOTPLT 15 +#define R_CRIS_32_GOTPLT 16 +#define R_CRIS_32_GOTREL 17 +#define R_CRIS_32_PLT_GOTREL 18 +#define R_CRIS_32_PLT_PCREL 19 + +#define R_CRIS_NUM 20 + + + +#define R_X86_64_NONE 0 +#define R_X86_64_64 1 +#define R_X86_64_PC32 2 +#define R_X86_64_GOT32 3 +#define R_X86_64_PLT32 4 +#define R_X86_64_COPY 5 +#define R_X86_64_GLOB_DAT 6 +#define R_X86_64_JUMP_SLOT 7 +#define R_X86_64_RELATIVE 8 +#define R_X86_64_GOTPCREL 9 + +#define R_X86_64_32 10 +#define R_X86_64_32S 11 +#define R_X86_64_16 12 +#define R_X86_64_PC16 13 +#define R_X86_64_8 14 +#define R_X86_64_PC8 15 +#define R_X86_64_DTPMOD64 16 +#define R_X86_64_DTPOFF64 17 +#define R_X86_64_TPOFF64 18 +#define R_X86_64_TLSGD 19 + +#define R_X86_64_TLSLD 20 + +#define R_X86_64_DTPOFF32 21 +#define R_X86_64_GOTTPOFF 22 + +#define R_X86_64_TPOFF32 23 +#define R_X86_64_PC64 24 +#define R_X86_64_GOTOFF64 25 +#define R_X86_64_GOTPC32 26 +#define R_X86_64_GOT64 27 +#define R_X86_64_GOTPCREL64 28 +#define R_X86_64_GOTPC64 29 +#define R_X86_64_GOTPLT64 30 +#define R_X86_64_PLTOFF64 31 +#define R_X86_64_SIZE32 32 +#define R_X86_64_SIZE64 33 + +#define R_X86_64_GOTPC32_TLSDESC 34 +#define R_X86_64_TLSDESC_CALL 35 + +#define R_X86_64_TLSDESC 36 +#define R_X86_64_IRELATIVE 37 +#define R_X86_64_RELATIVE64 38 +#define R_X86_64_NUM 39 + + + +#define R_MN10300_NONE 0 +#define R_MN10300_32 1 +#define R_MN10300_16 2 +#define R_MN10300_8 3 +#define R_MN10300_PCREL32 4 +#define R_MN10300_PCREL16 5 +#define R_MN10300_PCREL8 6 +#define R_MN10300_GNU_VTINHERIT 7 +#define R_MN10300_GNU_VTENTRY 8 +#define R_MN10300_24 9 +#define R_MN10300_GOTPC32 10 +#define R_MN10300_GOTPC16 11 +#define R_MN10300_GOTOFF32 12 +#define R_MN10300_GOTOFF24 13 +#define R_MN10300_GOTOFF16 14 +#define R_MN10300_PLT32 15 +#define R_MN10300_PLT16 16 +#define R_MN10300_GOT32 17 +#define R_MN10300_GOT24 18 +#define R_MN10300_GOT16 19 +#define R_MN10300_COPY 20 +#define R_MN10300_GLOB_DAT 21 +#define R_MN10300_JMP_SLOT 22 +#define R_MN10300_RELATIVE 23 + +#define R_MN10300_NUM 24 + + + +#define R_M32R_NONE 0 +#define R_M32R_16 1 +#define R_M32R_32 2 +#define R_M32R_24 3 +#define R_M32R_10_PCREL 4 +#define R_M32R_18_PCREL 5 +#define R_M32R_26_PCREL 6 +#define R_M32R_HI16_ULO 7 +#define R_M32R_HI16_SLO 8 +#define R_M32R_LO16 9 +#define R_M32R_SDA16 10 +#define R_M32R_GNU_VTINHERIT 11 +#define R_M32R_GNU_VTENTRY 12 + +#define R_M32R_16_RELA 33 +#define R_M32R_32_RELA 34 +#define R_M32R_24_RELA 35 +#define R_M32R_10_PCREL_RELA 36 +#define R_M32R_18_PCREL_RELA 37 +#define R_M32R_26_PCREL_RELA 38 +#define R_M32R_HI16_ULO_RELA 39 +#define R_M32R_HI16_SLO_RELA 40 +#define R_M32R_LO16_RELA 41 +#define R_M32R_SDA16_RELA 42 +#define R_M32R_RELA_GNU_VTINHERIT 43 +#define R_M32R_RELA_GNU_VTENTRY 44 +#define R_M32R_REL32 45 + +#define R_M32R_GOT24 48 +#define R_M32R_26_PLTREL 49 +#define R_M32R_COPY 50 +#define R_M32R_GLOB_DAT 51 +#define R_M32R_JMP_SLOT 52 +#define R_M32R_RELATIVE 53 +#define R_M32R_GOTOFF 54 +#define R_M32R_GOTPC24 55 +#define R_M32R_GOT16_HI_ULO 56 + +#define R_M32R_GOT16_HI_SLO 57 + +#define R_M32R_GOT16_LO 58 +#define R_M32R_GOTPC_HI_ULO 59 + +#define R_M32R_GOTPC_HI_SLO 60 + +#define R_M32R_GOTPC_LO 61 + +#define R_M32R_GOTOFF_HI_ULO 62 + +#define R_M32R_GOTOFF_HI_SLO 63 + +#define R_M32R_GOTOFF_LO 64 +#define R_M32R_NUM 256 + +#define R_MICROBLAZE_NONE 0 +#define R_MICROBLAZE_32 1 +#define R_MICROBLAZE_32_PCREL 2 +#define R_MICROBLAZE_64_PCREL 3 +#define R_MICROBLAZE_32_PCREL_LO 4 +#define R_MICROBLAZE_64 5 +#define R_MICROBLAZE_32_LO 6 +#define R_MICROBLAZE_SRO32 7 +#define R_MICROBLAZE_SRW32 8 +#define R_MICROBLAZE_64_NONE 9 +#define R_MICROBLAZE_32_SYM_OP_SYM 10 +#define R_MICROBLAZE_GNU_VTINHERIT 11 +#define R_MICROBLAZE_GNU_VTENTRY 12 +#define R_MICROBLAZE_GOTPC_64 13 +#define R_MICROBLAZE_GOT_64 14 +#define R_MICROBLAZE_PLT_64 15 +#define R_MICROBLAZE_REL 16 +#define R_MICROBLAZE_JUMP_SLOT 17 +#define R_MICROBLAZE_GLOB_DAT 18 +#define R_MICROBLAZE_GOTOFF_64 19 +#define R_MICROBLAZE_GOTOFF_32 20 +#define R_MICROBLAZE_COPY 21 +#define R_MICROBLAZE_TLS 22 +#define R_MICROBLAZE_TLSGD 23 +#define R_MICROBLAZE_TLSLD 24 +#define R_MICROBLAZE_TLSDTPMOD32 25 +#define R_MICROBLAZE_TLSDTPREL32 26 +#define R_MICROBLAZE_TLSDTPREL64 27 +#define R_MICROBLAZE_TLSGOTTPREL32 28 +#define R_MICROBLAZE_TLSTPREL32 29 + +#define R_OR1K_NONE 0 +#define R_OR1K_32 1 +#define R_OR1K_16 2 +#define R_OR1K_8 3 +#define R_OR1K_LO_16_IN_INSN 4 +#define R_OR1K_HI_16_IN_INSN 5 +#define R_OR1K_INSN_REL_26 6 +#define R_OR1K_GNU_VTENTRY 7 +#define R_OR1K_GNU_VTINHERIT 8 +#define R_OR1K_32_PCREL 9 +#define R_OR1K_16_PCREL 10 +#define R_OR1K_8_PCREL 11 +#define R_OR1K_GOTPC_HI16 12 +#define R_OR1K_GOTPC_LO16 13 +#define R_OR1K_GOT16 14 +#define R_OR1K_PLT26 15 +#define R_OR1K_GOTOFF_HI16 16 +#define R_OR1K_GOTOFF_LO16 17 +#define R_OR1K_COPY 18 +#define R_OR1K_GLOB_DAT 19 +#define R_OR1K_JMP_SLOT 20 +#define R_OR1K_RELATIVE 21 +#define R_OR1K_TLS_GD_HI16 22 +#define R_OR1K_TLS_GD_LO16 23 +#define R_OR1K_TLS_LDM_HI16 24 +#define R_OR1K_TLS_LDM_LO16 25 +#define R_OR1K_TLS_LDO_HI16 26 +#define R_OR1K_TLS_LDO_LO16 27 +#define R_OR1K_TLS_IE_HI16 28 +#define R_OR1K_TLS_IE_LO16 29 +#define R_OR1K_TLS_LE_HI16 30 +#define R_OR1K_TLS_LE_LO16 31 +#define R_OR1K_TLS_TPOFF 32 +#define R_OR1K_TLS_DTPOFF 33 +#define R_OR1K_TLS_DTPMOD 34 + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/src/tools/linux/core2md/core2md.cc b/src/tools/linux/core2md/core2md.cc new file mode 100644 index 0000000..ec4a012 --- /dev/null +++ b/src/tools/linux/core2md/core2md.cc @@ -0,0 +1,77 @@ +// Copyright 2012 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// core2md.cc: A utility to convert an ELF core file to a minidump file. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "client/linux/minidump_writer/minidump_writer.h" +#include "client/linux/minidump_writer/linux_core_dumper.h" +#include "common/path_helper.h" + +using google_breakpad::AppMemoryList; +using google_breakpad::MappingList; +using google_breakpad::LinuxCoreDumper; + +static int ShowUsage(const char* argv0) { + fprintf(stderr, "Usage: %s \n", + google_breakpad::BaseName(argv0).c_str()); + return 1; +} + +bool WriteMinidumpFromCore(const char* filename, + const char* core_path, + const char* procfs_override) { + MappingList mappings; + AppMemoryList memory_list; + LinuxCoreDumper dumper(0, core_path, procfs_override); + return google_breakpad::WriteMinidump(filename, mappings, memory_list, + &dumper); +} + +int main(int argc, char *argv[]) { + if (argc != 4) { + return ShowUsage(argv[0]); + } + + const char* core_file = argv[1]; + const char* procfs_dir = argv[2]; + const char* minidump_file = argv[3]; + if (!WriteMinidumpFromCore(minidump_file, + core_file, + procfs_dir)) { + perror("core2md: Unable to generate minidump"); + return 1; + } + + return 0; +} diff --git a/src/tools/linux/core_handler/core_handler.cc b/src/tools/linux/core_handler/core_handler.cc new file mode 100644 index 0000000..8a1d976 --- /dev/null +++ b/src/tools/linux/core_handler/core_handler.cc @@ -0,0 +1,151 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// core_handler.cc: A tool to handle coredumps on Linux + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "client/linux/minidump_writer/linux_core_dumper.h" +#include "client/linux/minidump_writer/minidump_writer.h" +#include "common/path_helper.h" +#include "common/scoped_ptr.h" + +namespace { + +using google_breakpad::AppMemoryList; +using google_breakpad::LinuxCoreDumper; +using google_breakpad::MappingList; +using google_breakpad::scoped_array; + +// Size of the core dump to read in order to access all the threads +// descriptions. +// +// The first section is the note0 section which contains the thread states. On +// x86-64 a typical thread description take about 1432B. Reading 1 MB allows +// several hundreds of threads. +const int core_read_size = 1024 * 1024; + +void ShowUsage(const char* argv0) { + fprintf(stderr, "Usage: %s \n\n", + google_breakpad::BaseName(argv0).c_str()); + fprintf(stderr, + "A tool which serves as a core dump handler and produces " + "minidump files.\n"); + fprintf(stderr, "Please refer to the online documentation:\n"); + fprintf(stderr, + "https://chromium.googlesource.com/breakpad/breakpad/+/HEAD" + "/docs/linux_core_handler.md\n"); +} + +bool WriteMinidumpFromCore(const char* filename, + const char* core_path, + const char* procfs_override) { + MappingList mappings; + AppMemoryList memory_list; + LinuxCoreDumper dumper(0, core_path, procfs_override); + return google_breakpad::WriteMinidump(filename, mappings, memory_list, + &dumper); +} + +bool HandleCrash(pid_t pid, const char* procfs_dir, const char* md_filename) { + int r = 0; + scoped_array buf(new char[core_read_size]); + while (r != core_read_size) { + int ret = read(STDIN_FILENO, &buf[r], core_read_size - r); + if (ret == 0) { + break; + } else if (ret == -1) { + return false; + } + r += ret; + } + + int fd = memfd_create("core_file", MFD_CLOEXEC); + if (fd == -1) { + return false; + } + + int w = write(fd, &buf[0], r); + if (w != r) { + close(fd); + return false; + } + + std::stringstream core_file_ss; + core_file_ss << "/proc/self/fd/" << fd; + std::string core_file(core_file_ss.str()); + + if (!WriteMinidumpFromCore(md_filename, core_file.c_str(), procfs_dir)) { + close(fd); + return false; + } + close(fd); + + return true; +} + +} // namespace + +int main(int argc, char* argv[]) { + int ret = EXIT_FAILURE; + + if (argc != 3) { + ShowUsage(argv[0]); + return ret; + } + + const char* pid_str = argv[1]; + const char* md_filename = argv[2]; + pid_t pid = atoi(pid_str); + + std::stringstream proc_dir_ss; + proc_dir_ss << "/proc/" << pid_str; + std::string proc_dir(proc_dir_ss.str()); + + openlog("core_handler", 0, 0); + if (HandleCrash(pid, proc_dir.c_str(), md_filename)) { + syslog(LOG_NOTICE, "Minidump generated at %s\n", md_filename); + ret = EXIT_SUCCESS; + } else { + syslog(LOG_ERR, "Cannot generate minidump %s\n", md_filename); + } + closelog(); + + return ret; +} diff --git a/src/tools/linux/dump_syms/dump_syms.cc b/src/tools/linux/dump_syms/dump_syms.cc new file mode 100644 index 0000000..2fce23c --- /dev/null +++ b/src/tools/linux/dump_syms/dump_syms.cc @@ -0,0 +1,155 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include +#include +#include +#include + +#include "common/linux/dump_symbols.h" +#include "common/path_helper.h" + +using google_breakpad::WriteSymbolFile; +using google_breakpad::WriteSymbolFileHeader; + +int usage(const char* self) { + fprintf(stderr, + "Usage: %s [OPTION] " + "[directories-for-debug-file]\n\n", + google_breakpad::BaseName(self).c_str()); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -i: Output module header information only.\n"); + fprintf(stderr, " -c Do not generate CFI section\n"); + fprintf(stderr, " -d Generate INLINE/INLINE_ORIGIN records\n"); + fprintf(stderr, " -r Do not handle inter-compilation " + "unit references\n"); + fprintf(stderr, " -v Print all warnings to stderr\n"); + fprintf(stderr, " -n Use specified name for name of the object\n"); + fprintf(stderr, " -o Use specified name for the " + "operating system\n"); + fprintf(stderr, " -m Enable writing the optional 'm' field on FUNC " + "and PUBLIC, denoting multiple symbols for " + "the address.\n"); + return 1; +} + +int main(int argc, char** argv) { + if (argc < 2) + return usage(argv[0]); + bool header_only = false; + bool cfi = true; + bool handle_inlines = false; + bool handle_inter_cu_refs = true; + bool log_to_stderr = false; + bool enable_multiple_field = false; + std::string obj_name; + const char* obj_os = "Linux"; + int arg_index = 1; + while (arg_index < argc && strlen(argv[arg_index]) > 0 && + argv[arg_index][0] == '-') { + if (strcmp("-i", argv[arg_index]) == 0) { + header_only = true; + } else if (strcmp("-c", argv[arg_index]) == 0) { + cfi = false; + } else if (strcmp("-d", argv[arg_index]) == 0) { + handle_inlines = true; + } else if (strcmp("-r", argv[arg_index]) == 0) { + handle_inter_cu_refs = false; + } else if (strcmp("-v", argv[arg_index]) == 0) { + log_to_stderr = true; + } else if (strcmp("-n", argv[arg_index]) == 0) { + if (arg_index + 1 >= argc) { + fprintf(stderr, "Missing argument to -n\n"); + return usage(argv[0]); + } + obj_name = argv[arg_index + 1]; + ++arg_index; + } else if (strcmp("-o", argv[arg_index]) == 0) { + if (arg_index + 1 >= argc) { + fprintf(stderr, "Missing argument to -o\n"); + return usage(argv[0]); + } + obj_os = argv[arg_index + 1]; + ++arg_index; + } else if (strcmp("-m", argv[arg_index]) == 0) { + enable_multiple_field = true; + } else { + printf("2.4 %s\n", argv[arg_index]); + return usage(argv[0]); + } + ++arg_index; + } + if (arg_index == argc) + return usage(argv[0]); + // Save stderr so it can be used below. + FILE* saved_stderr = fdopen(dup(fileno(stderr)), "w"); + if (!log_to_stderr) { + if (freopen(_PATH_DEVNULL, "w", stderr)) { + // If it fails, not a lot we can (or should) do. + // Add this brace section to silence gcc warnings. + } + } + const char* binary; + std::vector debug_dirs; + binary = argv[arg_index]; + for (int debug_dir_index = arg_index + 1; + debug_dir_index < argc; + ++debug_dir_index) { + debug_dirs.push_back(argv[debug_dir_index]); + } + + if (obj_name.empty()) + obj_name = binary; + + if (header_only) { + if (!WriteSymbolFileHeader(binary, obj_name, obj_os, std::cout)) { + fprintf(saved_stderr, "Failed to process file.\n"); + return 1; + } + } else { + SymbolData symbol_data = (handle_inlines ? INLINES : NO_DATA) | + (cfi ? CFI : NO_DATA) | SYMBOLS_AND_FILES; + google_breakpad::DumpOptions options(symbol_data, handle_inter_cu_refs, + enable_multiple_field); + if (!WriteSymbolFile(binary, obj_name, obj_os, debug_dirs, options, + std::cout)) { + fprintf(saved_stderr, "Failed to write symbol file.\n"); + return 1; + } + } + + return 0; +} diff --git a/src/tools/linux/md2core/minidump-2-core.cc b/src/tools/linux/md2core/minidump-2-core.cc new file mode 100644 index 0000000..3e310bc --- /dev/null +++ b/src/tools/linux/md2core/minidump-2-core.cc @@ -0,0 +1,1534 @@ +// Copyright 2009 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Converts a minidump file to a core file which gdb can read. +// Large parts lifted from the userspace core dumper: +// http://code.google.com/p/google-coredumper/ + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "common/linux/memory_mapped_file.h" +#include "common/minidump_type_helper.h" +#include "common/path_helper.h" +#include "common/scoped_ptr.h" +#include "common/using_std_string.h" +#include "google_breakpad/common/breakpad_types.h" +#include "google_breakpad/common/minidump_format.h" +#include "third_party/lss/linux_syscall_support.h" +#include "tools/linux/md2core/minidump_memory_range.h" + +#if ULONG_MAX == 0xffffffffffffffff + #define ELF_CLASS ELFCLASS64 +#else + #define ELF_CLASS ELFCLASS32 +#endif +#define Ehdr ElfW(Ehdr) +#define Phdr ElfW(Phdr) +#define Shdr ElfW(Shdr) +#define Nhdr ElfW(Nhdr) +#define auxv_t ElfW(auxv_t) + + +#if defined(__x86_64__) + #define ELF_ARCH EM_X86_64 +#elif defined(__i386__) + #define ELF_ARCH EM_386 +#elif defined(__arm__) + #define ELF_ARCH EM_ARM +#elif defined(__mips__) + #define ELF_ARCH EM_MIPS +#elif defined(__aarch64__) + #define ELF_ARCH EM_AARCH64 +#elif defined(__riscv) + #define ELF_ARCH EM_RISCV +#endif + +#if defined(__arm__) +// GLibc/ARM and Android/ARM both use 'user_regs' for the structure type +// containing core registers, while they use 'user_regs_struct' on other +// architectures. This file-local typedef simplifies the source code. +typedef user_regs user_regs_struct; +#elif defined (__mips__) || defined(__riscv) +// This file-local typedef simplifies the source code. +typedef gregset_t user_regs_struct; +#endif + +using google_breakpad::MDTypeHelper; +using google_breakpad::MemoryMappedFile; +using google_breakpad::MinidumpMemoryRange; + +typedef MDTypeHelper::MDRawDebug MDRawDebug; +typedef MDTypeHelper::MDRawLinkMap MDRawLinkMap; + +static const MDRVA kInvalidMDRVA = static_cast(-1); + +struct Options { + string minidump_path; + bool verbose; + int out_fd; + bool use_filename; + bool inc_guid; + string so_basedir; +}; + +static void +Usage(int argc, const char* argv[]) { + fprintf(stderr, + "Usage: %s [options] \n" + "\n" + "Convert a minidump file into a core file (often for use by gdb).\n" + "\n" + "The shared library list will by default have filenames as the runtime expects.\n" + "There are many flags to control the output names though to make it easier to\n" + "integrate with your debug environment (e.g. gdb).\n" + " Default: /lib64/libpthread.so.0\n" + " -f: /lib64/libpthread-2.19.so\n" + " -i: /lib64/-libpthread.so.0\n" + " -f -i: /lib64/-libpthread-2.19.so\n" + " -S /foo/: /foo/libpthread.so.0\n" + "\n" + "Options:\n" + " -v Enable verbose output\n" + " -o Write coredump to specified file (otherwise use stdout).\n" + " -f Use the filename rather than the soname in the sharedlib list.\n" + " The soname is what the runtime system uses, but the filename is\n" + " how it's stored on disk.\n" + " -i Prefix sharedlib names with ID (when available). This makes it\n" + " easier to have a single directory full of symbols.\n" + " -S Set soname base directory. This will force all debug/symbol\n" + " lookups to be done in this directory rather than the filesystem\n" + " layout as it exists in the crashing image. This path should end\n" + " with a slash if it's a directory. e.g. /var/lib/breakpad/\n" + "", google_breakpad::BaseName(argv[0]).c_str()); +} + +static void +SetupOptions(int argc, const char* argv[], Options* options) { + extern int optind; + int ch; + const char* output_file = NULL; + + // Initialize the options struct as needed. + options->verbose = false; + options->use_filename = false; + options->inc_guid = false; + + while ((ch = getopt(argc, (char * const*)argv, "fhio:S:v")) != -1) { + switch (ch) { + case 'h': + Usage(argc, argv); + exit(0); + case '?': + Usage(argc, argv); + exit(1); + + case 'f': + options->use_filename = true; + break; + case 'i': + options->inc_guid = true; + break; + case 'o': + output_file = optarg; + break; + case 'S': + options->so_basedir = optarg; + break; + case 'v': + options->verbose = true; + break; + } + } + + if ((argc - optind) != 1) { + fprintf(stderr, "%s: Missing minidump file\n", argv[0]); + Usage(argc, argv); + exit(1); + } + + if (output_file == NULL || !strcmp(output_file, "-")) { + options->out_fd = STDOUT_FILENO; + } else { + options->out_fd = open(output_file, O_WRONLY|O_CREAT|O_TRUNC, 0664); + if (options->out_fd == -1) { + fprintf(stderr, "%s: could not open output %s: %s\n", argv[0], + output_file, strerror(errno)); + exit(1); + } + } + + options->minidump_path = argv[optind]; +} + +// Write all of the given buffer, handling short writes and EINTR. Return true +// iff successful. +static bool +writea(int fd, const void* idata, size_t length) { + const uint8_t* data = (const uint8_t*) idata; + + size_t done = 0; + while (done < length) { + ssize_t r; + do { + r = write(fd, data + done, length - done); + } while (r == -1 && errno == EINTR); + + if (r < 1) + return false; + done += r; + } + + return true; +} + +/* Dynamically determines the byte sex of the system. Returns non-zero + * for big-endian machines. + */ +static inline int sex() { + int probe = 1; + return !*(char*)&probe; +} + +typedef struct elf_timeval { /* Time value with microsecond resolution */ + long tv_sec; /* Seconds */ + long tv_usec; /* Microseconds */ +} elf_timeval; + +typedef struct _elf_siginfo { /* Information about signal (unused) */ + int32_t si_signo; /* Signal number */ + int32_t si_code; /* Extra code */ + int32_t si_errno; /* Errno */ +} _elf_siginfo; + +typedef struct prstatus { /* Information about thread; includes CPU reg*/ + _elf_siginfo pr_info; /* Info associated with signal */ + uint16_t pr_cursig; /* Current signal */ + unsigned long pr_sigpend; /* Set of pending signals */ + unsigned long pr_sighold; /* Set of held signals */ + pid_t pr_pid; /* Process ID */ + pid_t pr_ppid; /* Parent's process ID */ + pid_t pr_pgrp; /* Group ID */ + pid_t pr_sid; /* Session ID */ + elf_timeval pr_utime; /* User time */ + elf_timeval pr_stime; /* System time */ + elf_timeval pr_cutime; /* Cumulative user time */ + elf_timeval pr_cstime; /* Cumulative system time */ + user_regs_struct pr_reg; /* CPU registers */ + uint32_t pr_fpvalid; /* True if math co-processor being used */ +} prstatus; + +typedef struct prpsinfo { /* Information about process */ + unsigned char pr_state; /* Numeric process state */ + char pr_sname; /* Char for pr_state */ + unsigned char pr_zomb; /* Zombie */ + signed char pr_nice; /* Nice val */ + unsigned long pr_flag; /* Flags */ +#if defined(__x86_64__) || defined(__mips__) || defined(__riscv) + uint32_t pr_uid; /* User ID */ + uint32_t pr_gid; /* Group ID */ +#else + uint16_t pr_uid; /* User ID */ + uint16_t pr_gid; /* Group ID */ +#endif + pid_t pr_pid; /* Process ID */ + pid_t pr_ppid; /* Parent's process ID */ + pid_t pr_pgrp; /* Group ID */ + pid_t pr_sid; /* Session ID */ + char pr_fname[16]; /* Filename of executable */ + char pr_psargs[80]; /* Initial part of arg list */ +} prpsinfo; + +// We parse the minidump file and keep the parsed information in this structure +struct CrashedProcess { + CrashedProcess() + : exception{-1}, + auxv(NULL), + auxv_length(0) { + memset(&prps, 0, sizeof(prps)); + prps.pr_sname = 'R'; + memset(&debug, 0, sizeof(debug)); + } + + struct Mapping { + Mapping() + : permissions(0xFFFFFFFF), + start_address(0), + end_address(0), + offset(0) { + } + + uint32_t permissions; + uint64_t start_address, end_address, offset; + // The name we write out to the core. + string filename; + string data; + }; + std::map mappings; + + int fatal_signal; + + struct Thread { + pid_t tid; +#if defined(__mips__) || defined(__riscv) + mcontext_t mcontext; +#else + user_regs_struct regs; +#endif +#if defined(__i386__) || defined(__x86_64__) + user_fpregs_struct fpregs; +#endif +#if defined(__i386__) + user_fpxregs_struct fpxregs; +#endif +#if defined(__aarch64__) + user_fpsimd_struct fpregs; +#endif + uintptr_t stack_addr; + const uint8_t* stack; + size_t stack_length; + }; + std::vector threads; + Thread exception; + + const uint8_t* auxv; + size_t auxv_length; + + prpsinfo prps; + + // The GUID/filename from MD_MODULE_LIST_STREAM entries. + // We gather them for merging later on into the list of maps. + struct Signature { + char guid[40]; + string filename; + }; + std::map signatures; + + string dynamic_data; + MDRawDebug debug; + std::vector link_map; +}; + +#if defined(__i386__) +static uint32_t +U32(const uint8_t* data) { + uint32_t v; + memcpy(&v, data, sizeof(v)); + return v; +} + +static uint16_t +U16(const uint8_t* data) { + uint16_t v; + memcpy(&v, data, sizeof(v)); + return v; +} + +static void +ParseThreadRegisters(CrashedProcess::Thread* thread, + const MinidumpMemoryRange& range) { + const MDRawContextX86* rawregs = range.GetData(0); + + thread->regs.ebx = rawregs->ebx; + thread->regs.ecx = rawregs->ecx; + thread->regs.edx = rawregs->edx; + thread->regs.esi = rawregs->esi; + thread->regs.edi = rawregs->edi; + thread->regs.ebp = rawregs->ebp; + thread->regs.eax = rawregs->eax; + thread->regs.xds = rawregs->ds; + thread->regs.xes = rawregs->es; + thread->regs.xfs = rawregs->fs; + thread->regs.xgs = rawregs->gs; + thread->regs.orig_eax = rawregs->eax; + thread->regs.eip = rawregs->eip; + thread->regs.xcs = rawregs->cs; + thread->regs.eflags = rawregs->eflags; + thread->regs.esp = rawregs->esp; + thread->regs.xss = rawregs->ss; + + thread->fpregs.cwd = rawregs->float_save.control_word; + thread->fpregs.swd = rawregs->float_save.status_word; + thread->fpregs.twd = rawregs->float_save.tag_word; + thread->fpregs.fip = rawregs->float_save.error_offset; + thread->fpregs.fcs = rawregs->float_save.error_selector; + thread->fpregs.foo = rawregs->float_save.data_offset; + thread->fpregs.fos = rawregs->float_save.data_selector; + memcpy(thread->fpregs.st_space, rawregs->float_save.register_area, + 10 * 8); + + thread->fpxregs.cwd = rawregs->float_save.control_word; + thread->fpxregs.swd = rawregs->float_save.status_word; + thread->fpxregs.twd = rawregs->float_save.tag_word; + thread->fpxregs.fop = U16(rawregs->extended_registers + 6); + thread->fpxregs.fip = U16(rawregs->extended_registers + 8); + thread->fpxregs.fcs = U16(rawregs->extended_registers + 12); + thread->fpxregs.foo = U16(rawregs->extended_registers + 16); + thread->fpxregs.fos = U16(rawregs->extended_registers + 20); + thread->fpxregs.mxcsr = U32(rawregs->extended_registers + 24); + memcpy(thread->fpxregs.st_space, rawregs->extended_registers + 32, 128); + memcpy(thread->fpxregs.xmm_space, rawregs->extended_registers + 160, 128); +} +#elif defined(__x86_64__) +static void +ParseThreadRegisters(CrashedProcess::Thread* thread, + const MinidumpMemoryRange& range) { + const MDRawContextAMD64* rawregs = range.GetData(0); + + thread->regs.r15 = rawregs->r15; + thread->regs.r14 = rawregs->r14; + thread->regs.r13 = rawregs->r13; + thread->regs.r12 = rawregs->r12; + thread->regs.rbp = rawregs->rbp; + thread->regs.rbx = rawregs->rbx; + thread->regs.r11 = rawregs->r11; + thread->regs.r10 = rawregs->r10; + thread->regs.r9 = rawregs->r9; + thread->regs.r8 = rawregs->r8; + thread->regs.rax = rawregs->rax; + thread->regs.rcx = rawregs->rcx; + thread->regs.rdx = rawregs->rdx; + thread->regs.rsi = rawregs->rsi; + thread->regs.rdi = rawregs->rdi; + thread->regs.orig_rax = rawregs->rax; + thread->regs.rip = rawregs->rip; + thread->regs.cs = rawregs->cs; + thread->regs.eflags = rawregs->eflags; + thread->regs.rsp = rawregs->rsp; + thread->regs.ss = rawregs->ss; + thread->regs.fs_base = 0; + thread->regs.gs_base = 0; + thread->regs.ds = rawregs->ds; + thread->regs.es = rawregs->es; + thread->regs.fs = rawregs->fs; + thread->regs.gs = rawregs->gs; + + thread->fpregs.cwd = rawregs->flt_save.control_word; + thread->fpregs.swd = rawregs->flt_save.status_word; + thread->fpregs.ftw = rawregs->flt_save.tag_word; + thread->fpregs.fop = rawregs->flt_save.error_opcode; + thread->fpregs.rip = rawregs->flt_save.error_offset; + thread->fpregs.rdp = rawregs->flt_save.data_offset; + thread->fpregs.mxcsr = rawregs->flt_save.mx_csr; + thread->fpregs.mxcr_mask = rawregs->flt_save.mx_csr_mask; + memcpy(thread->fpregs.st_space, rawregs->flt_save.float_registers, 8 * 16); + memcpy(thread->fpregs.xmm_space, rawregs->flt_save.xmm_registers, 16 * 16); +} +#elif defined(__arm__) +static void +ParseThreadRegisters(CrashedProcess::Thread* thread, + const MinidumpMemoryRange& range) { + const MDRawContextARM* rawregs = range.GetData(0); + + thread->regs.uregs[0] = rawregs->iregs[0]; + thread->regs.uregs[1] = rawregs->iregs[1]; + thread->regs.uregs[2] = rawregs->iregs[2]; + thread->regs.uregs[3] = rawregs->iregs[3]; + thread->regs.uregs[4] = rawregs->iregs[4]; + thread->regs.uregs[5] = rawregs->iregs[5]; + thread->regs.uregs[6] = rawregs->iregs[6]; + thread->regs.uregs[7] = rawregs->iregs[7]; + thread->regs.uregs[8] = rawregs->iregs[8]; + thread->regs.uregs[9] = rawregs->iregs[9]; + thread->regs.uregs[10] = rawregs->iregs[10]; + thread->regs.uregs[11] = rawregs->iregs[11]; + thread->regs.uregs[12] = rawregs->iregs[12]; + thread->regs.uregs[13] = rawregs->iregs[13]; + thread->regs.uregs[14] = rawregs->iregs[14]; + thread->regs.uregs[15] = rawregs->iregs[15]; + + thread->regs.uregs[16] = rawregs->cpsr; + thread->regs.uregs[17] = 0; // what is ORIG_r0 exactly? +} +#elif defined(__aarch64__) +static void +ParseThreadRegisters(CrashedProcess::Thread* thread, + const MinidumpMemoryRange& range) { +#define COPY_REGS(rawregs) \ + do { \ + for (int i = 0; i < 31; ++i) \ + thread->regs.regs[i] = rawregs->iregs[i]; \ + thread->regs.sp = rawregs->iregs[MD_CONTEXT_ARM64_REG_SP]; \ + thread->regs.pc = rawregs->iregs[MD_CONTEXT_ARM64_REG_PC]; \ + thread->regs.pstate = rawregs->cpsr; \ + \ + memcpy(thread->fpregs.vregs, rawregs->float_save.regs, 8 * 32); \ + thread->fpregs.fpsr = rawregs->float_save.fpsr; \ + thread->fpregs.fpcr = rawregs->float_save.fpcr; \ + } while (false) + + if (range.length() == sizeof(MDRawContextARM64_Old)) { + const MDRawContextARM64_Old* rawregs = + range.GetData(0); + COPY_REGS(rawregs); + } else { + const MDRawContextARM64* rawregs = range.GetData(0); + COPY_REGS(rawregs); + } +#undef COPY_REGS +} +#elif defined(__mips__) +static void +ParseThreadRegisters(CrashedProcess::Thread* thread, + const MinidumpMemoryRange& range) { + const MDRawContextMIPS* rawregs = range.GetData(0); + + for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i) + thread->mcontext.gregs[i] = rawregs->iregs[i]; + + thread->mcontext.pc = rawregs->epc; + + thread->mcontext.mdlo = rawregs->mdlo; + thread->mcontext.mdhi = rawregs->mdhi; + + thread->mcontext.hi1 = rawregs->hi[0]; + thread->mcontext.lo1 = rawregs->lo[0]; + thread->mcontext.hi2 = rawregs->hi[1]; + thread->mcontext.lo2 = rawregs->lo[1]; + thread->mcontext.hi3 = rawregs->hi[2]; + thread->mcontext.lo3 = rawregs->lo[2]; + + for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i) { + thread->mcontext.fpregs.fp_r.fp_fregs[i]._fp_fregs = + rawregs->float_save.regs[i]; + } + + thread->mcontext.fpc_csr = rawregs->float_save.fpcsr; +#if _MIPS_SIM == _ABIO32 + thread->mcontext.fpc_eir = rawregs->float_save.fir; +#endif +} +#elif defined(__riscv) +static void +ParseThreadRegisters(CrashedProcess::Thread* thread, + const MinidumpMemoryRange& range) { +# if __riscv_xlen == 32 + const MDRawContextRISCV* rawregs = range.GetData(0); +# elif __riscv_xlen == 64 + const MDRawContextRISCV64* rawregs = range.GetData(0); +# else +# error "Unexpected __riscv_xlen" +# endif + + thread->mcontext.__gregs[0] = rawregs->pc; + thread->mcontext.__gregs[1] = rawregs->ra; + thread->mcontext.__gregs[2] = rawregs->sp; + thread->mcontext.__gregs[3] = rawregs->gp; + thread->mcontext.__gregs[4] = rawregs->tp; + thread->mcontext.__gregs[5] = rawregs->t0; + thread->mcontext.__gregs[6] = rawregs->t1; + thread->mcontext.__gregs[7] = rawregs->t2; + thread->mcontext.__gregs[8] = rawregs->s0; + thread->mcontext.__gregs[9] = rawregs->s1; + thread->mcontext.__gregs[10] = rawregs->a0; + thread->mcontext.__gregs[11] = rawregs->a1; + thread->mcontext.__gregs[12] = rawregs->a2; + thread->mcontext.__gregs[13] = rawregs->a3; + thread->mcontext.__gregs[14] = rawregs->a4; + thread->mcontext.__gregs[15] = rawregs->a5; + thread->mcontext.__gregs[16] = rawregs->a6; + thread->mcontext.__gregs[17] = rawregs->a7; + thread->mcontext.__gregs[18] = rawregs->s2; + thread->mcontext.__gregs[19] = rawregs->s3; + thread->mcontext.__gregs[20] = rawregs->s4; + thread->mcontext.__gregs[21] = rawregs->s5; + thread->mcontext.__gregs[22] = rawregs->s6; + thread->mcontext.__gregs[23] = rawregs->s7; + thread->mcontext.__gregs[24] = rawregs->s8; + thread->mcontext.__gregs[25] = rawregs->s9; + thread->mcontext.__gregs[26] = rawregs->s10; + thread->mcontext.__gregs[27] = rawregs->s11; + thread->mcontext.__gregs[28] = rawregs->t3; + thread->mcontext.__gregs[29] = rawregs->t4; + thread->mcontext.__gregs[30] = rawregs->t5; + thread->mcontext.__gregs[31] = rawregs->t6; + + // Breakpad only supports RISCV32 with 32 bit floating point. + // Breakpad only supports RISCV64 with 64 bit floating point. +#if __riscv_xlen == 32 + for (int i = 0; i < MD_CONTEXT_RISCV_FPR_COUNT; ++i) { + thread->mcontext.__fpregs.__f.__f[i] = rawregs->fpregs[i]; + } + thread->mcontext.__fpregs.__f.__fcsr = rawregs->fcsr; +#elif __riscv_xlen == 64 + for (int i = 0; i < MD_CONTEXT_RISCV_FPR_COUNT; ++i) { + thread->mcontext.__fpregs.__d.__f[i] = rawregs->fpregs[i]; + } + thread->mcontext.__fpregs.__d.__fcsr = rawregs->fcsr; +#else +#error "Unexpected __riscv_xlen" +#endif +} +#else +#error "This code has not been ported to your platform yet" +#endif + +static void +ParseThreadList(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range, + const MinidumpMemoryRange& full_file) { + const uint32_t num_threads = *range.GetData(0); + if (options.verbose) { + fprintf(stderr, + "MD_THREAD_LIST_STREAM:\n" + "Found %d threads\n" + "\n\n", + num_threads); + } + for (unsigned i = 0; i < num_threads; ++i) { + CrashedProcess::Thread thread; + memset(&thread, 0, sizeof(thread)); + const MDRawThread* rawthread = + range.GetArrayElement(sizeof(uint32_t), i); + thread.tid = rawthread->thread_id; + thread.stack_addr = rawthread->stack.start_of_memory_range; + MinidumpMemoryRange stack_range = + full_file.Subrange(rawthread->stack.memory); + thread.stack = stack_range.data(); + thread.stack_length = rawthread->stack.memory.data_size; + + ParseThreadRegisters(&thread, + full_file.Subrange(rawthread->thread_context)); + + crashinfo->threads.push_back(thread); + } +} + +static void +ParseSystemInfo(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range, + const MinidumpMemoryRange& full_file) { + const MDRawSystemInfo* sysinfo = range.GetData(0); + if (!sysinfo) { + fprintf(stderr, "Failed to access MD_SYSTEM_INFO_STREAM\n"); + exit(1); + } +#if defined(__i386__) + if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_X86) { + fprintf(stderr, + "This version of minidump-2-core only supports x86 (32bit)%s.\n", + sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_AMD64 ? + ",\nbut the minidump file is from a 64bit machine" : ""); + exit(1); + } +#elif defined(__x86_64__) + if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_AMD64) { + fprintf(stderr, + "This version of minidump-2-core only supports x86 (64bit)%s.\n", + sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_X86 ? + ",\nbut the minidump file is from a 32bit machine" : ""); + exit(1); + } +#elif defined(__arm__) + if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_ARM) { + fprintf(stderr, + "This version of minidump-2-core only supports ARM (32bit).\n"); + exit(1); + } +#elif defined(__aarch64__) + if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_ARM64_OLD && + sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_ARM64) { + fprintf(stderr, + "This version of minidump-2-core only supports ARM (64bit).\n"); + exit(1); + } +#elif defined(__mips__) +# if _MIPS_SIM == _ABIO32 + if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_MIPS) { + fprintf(stderr, + "This version of minidump-2-core only supports mips o32 (32bit).\n"); + exit(1); + } +# elif _MIPS_SIM == _ABI64 + if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_MIPS64) { + fprintf(stderr, + "This version of minidump-2-core only supports mips n64 (64bit).\n"); + exit(1); + } +# else +# error "This mips ABI is currently not supported (n32)" +# endif +#elif defined(__riscv) +# if __riscv_xlen == 32 + if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_RISCV) { + fprintf(stderr, + "This version of minidump-2-core only supports RISCV.\n"); + exit(1); + } +# elif __riscv_xlen == 64 + if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_RISCV64) { + fprintf(stderr, + "This version of minidump-2-core only supports RISCV64.\n"); + exit(1); + } +# else +# error "Unexpected __riscv_xlen" +# endif +#else +#error "This code has not been ported to your platform yet" +#endif + if (sysinfo->platform_id != MD_OS_LINUX && + sysinfo->platform_id != MD_OS_NACL) { + fprintf(stderr, "This minidump was not generated by Linux or NaCl.\n"); + exit(1); + } + + if (options.verbose) { + fprintf(stderr, + "MD_SYSTEM_INFO_STREAM:\n" + "Architecture: %s\n" + "Number of processors: %d\n" + "Processor level: %d\n" + "Processor model: %d\n" + "Processor stepping: %d\n", + sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_X86 + ? "i386" + : sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_AMD64 + ? "x86-64" + : sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_ARM + ? "ARM" + : sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_MIPS + ? "MIPS" + : sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_MIPS64 + ? "MIPS64" + : sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_RISCV + ? "RISCV" + : sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_RISCV64 + ? "RISCV64" + : "???", + sysinfo->number_of_processors, + sysinfo->processor_level, + sysinfo->processor_revision >> 8, + sysinfo->processor_revision & 0xFF); + if (sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_X86 || + sysinfo->processor_architecture == MD_CPU_ARCHITECTURE_AMD64) { + fputs("Vendor id: ", stderr); + const char *nul = + (const char*)memchr(sysinfo->cpu.x86_cpu_info.vendor_id, 0, + sizeof(sysinfo->cpu.x86_cpu_info.vendor_id)); + fwrite(sysinfo->cpu.x86_cpu_info.vendor_id, + nul ? nul - (const char*)&sysinfo->cpu.x86_cpu_info.vendor_id[0] + : sizeof(sysinfo->cpu.x86_cpu_info.vendor_id), 1, stderr); + fputs("\n", stderr); + } + fprintf(stderr, "OS: %s\n", + full_file.GetAsciiMDString(sysinfo->csd_version_rva).c_str()); + fputs("\n\n", stderr); + } +} + +static void +ParseCPUInfo(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range) { + if (options.verbose) { + fputs("MD_LINUX_CPU_INFO:\n", stderr); + fwrite(range.data(), range.length(), 1, stderr); + fputs("\n\n\n", stderr); + } +} + +static void +ParseProcessStatus(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range) { + if (options.verbose) { + fputs("MD_LINUX_PROC_STATUS:\n", stderr); + fwrite(range.data(), range.length(), 1, stderr); + fputs("\n\n", stderr); + } +} + +static void +ParseLSBRelease(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range) { + if (options.verbose) { + fputs("MD_LINUX_LSB_RELEASE:\n", stderr); + fwrite(range.data(), range.length(), 1, stderr); + fputs("\n\n", stderr); + } +} + +static void +ParseMaps(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range) { + if (options.verbose) { + fputs("MD_LINUX_MAPS:\n", stderr); + fwrite(range.data(), range.length(), 1, stderr); + } + for (const uint8_t* ptr = range.data(); + ptr < range.data() + range.length();) { + const uint8_t* eol = (uint8_t*)memchr(ptr, '\n', + range.data() + range.length() - ptr); + string line((const char*)ptr, + eol ? eol - ptr : range.data() + range.length() - ptr); + ptr = eol ? eol + 1 : range.data() + range.length(); + unsigned long long start, stop, offset; + char* permissions = NULL; + char* filename = NULL; + sscanf(line.c_str(), "%llx-%llx %m[-rwxp] %llx %*[:0-9a-f] %*d %ms", + &start, &stop, &permissions, &offset, &filename); + if (filename && *filename == '/') { + CrashedProcess::Mapping mapping; + mapping.permissions = 0; + if (strchr(permissions, 'r')) { + mapping.permissions |= PF_R; + } + if (strchr(permissions, 'w')) { + mapping.permissions |= PF_W; + } + if (strchr(permissions, 'x')) { + mapping.permissions |= PF_X; + } + mapping.start_address = start; + mapping.end_address = stop; + mapping.offset = offset; + if (filename) { + mapping.filename = filename; + } + crashinfo->mappings[mapping.start_address] = mapping; + } + free(permissions); + free(filename); + } + if (options.verbose) { + fputs("\n\n\n", stderr); + } +} + +static void +ParseEnvironment(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range) { + if (options.verbose) { + fputs("MD_LINUX_ENVIRON:\n", stderr); + char* env = new char[range.length()]; + memcpy(env, range.data(), range.length()); + int nul_count = 0; + for (char *ptr = env;;) { + ptr = (char*)memchr(ptr, '\000', range.length() - (ptr - env)); + if (!ptr) { + break; + } + if (ptr > env && ptr[-1] == '\n') { + if (++nul_count > 5) { + // Some versions of Chrome try to rewrite the process' command line + // in a way that causes the environment to be corrupted. Afterwards, + // part of the environment will contain the trailing bit of the + // command line. The rest of the environment will be filled with + // NUL bytes. + // We detect this corruption by counting the number of consecutive + // NUL bytes. Normally, we would not expect any consecutive NUL + // bytes. But we are conservative and only suppress printing of + // the environment if we see at least five consecutive NULs. + fputs("Environment has been corrupted; no data available", stderr); + goto env_corrupted; + } + } else { + nul_count = 0; + } + *ptr = '\n'; + } + fwrite(env, range.length(), 1, stderr); + env_corrupted: + delete[] env; + fputs("\n\n\n", stderr); + } +} + +static void +ParseAuxVector(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range) { + // Some versions of Chrome erroneously used the MD_LINUX_AUXV stream value + // when dumping /proc/$x/maps + if (range.length() > 17) { + // The AUXV vector contains binary data, whereas the maps always begin + // with an 8+ digit hex address followed by a hyphen and another 8+ digit + // address. + char addresses[18]; + memcpy(addresses, range.data(), 17); + addresses[17] = '\000'; + if (strspn(addresses, "0123456789abcdef-") == 17) { + ParseMaps(options, crashinfo, range); + return; + } + } + + crashinfo->auxv = range.data(); + crashinfo->auxv_length = range.length(); +} + +static void +ParseCmdLine(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range) { + // The command line is supposed to use NUL bytes to separate arguments. + // As Chrome rewrites its own command line and (incorrectly) substitutes + // spaces, this is often not the case in our minidump files. + const char* cmdline = (const char*) range.data(); + if (options.verbose) { + fputs("MD_LINUX_CMD_LINE:\n", stderr); + unsigned i = 0; + for (; i < range.length() && cmdline[i] && cmdline[i] != ' '; ++i) { } + fputs("argv[0] = \"", stderr); + fwrite(cmdline, i, 1, stderr); + fputs("\"\n", stderr); + for (unsigned j = ++i, argc = 1; j < range.length(); ++j) { + if (!cmdline[j] || cmdline[j] == ' ') { + fprintf(stderr, "argv[%d] = \"", argc++); + fwrite(cmdline + i, j - i, 1, stderr); + fputs("\"\n", stderr); + i = j + 1; + } + } + fputs("\n\n", stderr); + } + + const char *binary_name = cmdline; + for (size_t i = 0; i < range.length(); ++i) { + if (cmdline[i] == '/') { + binary_name = cmdline + i + 1; + } else if (cmdline[i] == 0 || cmdline[i] == ' ') { + static const size_t fname_len = sizeof(crashinfo->prps.pr_fname) - 1; + static const size_t args_len = sizeof(crashinfo->prps.pr_psargs) - 1; + memset(crashinfo->prps.pr_fname, 0, fname_len + 1); + memset(crashinfo->prps.pr_psargs, 0, args_len + 1); + unsigned len = cmdline + i - binary_name; + memcpy(crashinfo->prps.pr_fname, binary_name, + len > fname_len ? fname_len : len); + + len = range.length() > args_len ? args_len : range.length(); + memcpy(crashinfo->prps.pr_psargs, cmdline, len); + for (unsigned j = 0; j < len; ++j) { + if (crashinfo->prps.pr_psargs[j] == 0) + crashinfo->prps.pr_psargs[j] = ' '; + } + break; + } + } +} + +static void +ParseDSODebugInfo(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range, + const MinidumpMemoryRange& full_file) { + const MDRawDebug* debug = range.GetData(0); + if (!debug) { + return; + } + if (options.verbose) { + fprintf(stderr, + "MD_LINUX_DSO_DEBUG:\n" + "Version: %d\n" + "Number of DSOs: %d\n" + "Brk handler: 0x%" PRIx64 "\n" + "Dynamic loader at: 0x%" PRIx64 "\n" + "_DYNAMIC: 0x%" PRIx64 "\n", + debug->version, + debug->dso_count, + static_cast(debug->brk), + static_cast(debug->ldbase), + static_cast(debug->dynamic)); + } + crashinfo->debug = *debug; + if (range.length() > sizeof(MDRawDebug)) { + char* dynamic_data = (char*)range.data() + sizeof(MDRawDebug); + crashinfo->dynamic_data.assign(dynamic_data, + range.length() - sizeof(MDRawDebug)); + } + if (debug->map != kInvalidMDRVA) { + for (unsigned int i = 0; i < debug->dso_count; ++i) { + const MDRawLinkMap* link_map = + full_file.GetArrayElement(debug->map, i); + if (link_map) { + if (options.verbose) { + fprintf(stderr, + "#%03d: %" PRIx64 ", %" PRIx64 ", \"%s\"\n", + i, static_cast(link_map->addr), + static_cast(link_map->ld), + full_file.GetAsciiMDString(link_map->name).c_str()); + } + crashinfo->link_map.push_back(*link_map); + } + } + } + if (options.verbose) { + fputs("\n\n", stderr); + } +} + +static void +ParseExceptionStream(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range, + const MinidumpMemoryRange& full_file) { + const MDRawExceptionStream* exp = range.GetData(0); + if (!exp) { + return; + } + if (options.verbose) { + fprintf(stderr, + "MD_EXCEPTION_STREAM:\n" + "Found exception thread %" PRIu32 " \n" + "\n\n", + exp->thread_id); + } + crashinfo->fatal_signal = (int) exp->exception_record.exception_code; + crashinfo->exception = {}; + crashinfo->exception.tid = exp->thread_id; + // crashinfo->threads[].tid == crashinfo->exception.tid provides the stack. + ParseThreadRegisters(&crashinfo->exception, + full_file.Subrange(exp->thread_context)); +} + +static bool +WriteThread(const Options& options, const CrashedProcess::Thread& thread, + int fatal_signal) { + struct prstatus pr; + memset(&pr, 0, sizeof(pr)); + + pr.pr_info.si_signo = fatal_signal; + pr.pr_cursig = fatal_signal; + pr.pr_pid = thread.tid; +#if defined(__mips__) + memcpy(&pr.pr_reg, &thread.mcontext.gregs, sizeof(user_regs_struct)); +#elif defined(__riscv) + memcpy(&pr.pr_reg, &thread.mcontext.__gregs, sizeof(user_regs_struct)); +#else + memcpy(&pr.pr_reg, &thread.regs, sizeof(user_regs_struct)); +#endif + + Nhdr nhdr; + memset(&nhdr, 0, sizeof(nhdr)); + nhdr.n_namesz = 5; + nhdr.n_descsz = sizeof(struct prstatus); + nhdr.n_type = NT_PRSTATUS; + if (!writea(options.out_fd, &nhdr, sizeof(nhdr)) || + !writea(options.out_fd, "CORE\0\0\0\0", 8) || + !writea(options.out_fd, &pr, sizeof(struct prstatus))) { + return false; + } + +#if defined(__i386__) || defined(__x86_64__) + nhdr.n_descsz = sizeof(user_fpregs_struct); + nhdr.n_type = NT_FPREGSET; + if (!writea(options.out_fd, &nhdr, sizeof(nhdr)) || + !writea(options.out_fd, "CORE\0\0\0\0", 8) || + !writea(options.out_fd, &thread.fpregs, sizeof(user_fpregs_struct))) { + return false; + } +#endif + +#if defined(__i386__) + nhdr.n_descsz = sizeof(user_fpxregs_struct); + nhdr.n_type = NT_PRXFPREG; + if (!writea(options.out_fd, &nhdr, sizeof(nhdr)) || + !writea(options.out_fd, "LINUX\0\0\0", 8) || + !writea(options.out_fd, &thread.fpxregs, sizeof(user_fpxregs_struct))) { + return false; + } +#endif + + return true; +} + +static void +ParseModuleStream(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& range, + const MinidumpMemoryRange& full_file) { + if (options.verbose) { + fputs("MD_MODULE_LIST_STREAM:\n", stderr); + } + const uint32_t num_mappings = *range.GetData(0); + for (unsigned i = 0; i < num_mappings; ++i) { + CrashedProcess::Mapping mapping; + const MDRawModule* rawmodule = reinterpret_cast( + range.GetArrayElement(sizeof(uint32_t), MD_MODULE_SIZE, i)); + mapping.start_address = rawmodule->base_of_image; + mapping.end_address = rawmodule->size_of_image + rawmodule->base_of_image; + + if (crashinfo->mappings.find(mapping.start_address) == + crashinfo->mappings.end()) { + // We prefer data from MD_LINUX_MAPS over MD_MODULE_LIST_STREAM, as + // the former is a strict superset of the latter. + crashinfo->mappings[mapping.start_address] = mapping; + } + + const MDCVInfoPDB70* record = reinterpret_cast( + full_file.GetData(rawmodule->cv_record.rva, MDCVInfoPDB70_minsize)); + char guid[40]; + sprintf(guid, "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", + record->signature.data1, record->signature.data2, + record->signature.data3, + record->signature.data4[0], record->signature.data4[1], + record->signature.data4[2], record->signature.data4[3], + record->signature.data4[4], record->signature.data4[5], + record->signature.data4[6], record->signature.data4[7]); + + string filename = full_file.GetAsciiMDString(rawmodule->module_name_rva); + + CrashedProcess::Signature signature; + strcpy(signature.guid, guid); + signature.filename = filename; + crashinfo->signatures[rawmodule->base_of_image] = signature; + + if (options.verbose) { + fprintf(stderr, "0x%" PRIx64 "-0x%" PRIx64 ", ChkSum: 0x%08X, GUID: %s, " + " \"%s\"\n", + rawmodule->base_of_image, + rawmodule->base_of_image + rawmodule->size_of_image, + rawmodule->checksum, guid, filename.c_str()); + } + } + if (options.verbose) { + fputs("\n\n", stderr); + } +} + +static void +AddDataToMapping(CrashedProcess* crashinfo, const string& data, + uintptr_t addr) { + for (std::map::iterator + iter = crashinfo->mappings.begin(); + iter != crashinfo->mappings.end(); + ++iter) { + if (addr >= iter->second.start_address && + addr < iter->second.end_address) { + CrashedProcess::Mapping mapping = iter->second; + if ((addr & ~4095) != iter->second.start_address) { + // If there are memory pages in the mapping prior to where the + // data starts, truncate the existing mapping so that it ends with + // the page immediately preceding the data region. + iter->second.end_address = addr & ~4095; + if (!mapping.filename.empty()) { + // "mapping" is a copy of "iter->second". We are splitting the + // existing mapping into two separate ones when we write the data + // to the core file. The first one does not have any associated + // data in the core file, the second one is backed by data that is + // included with the core file. + // If this mapping wasn't supposed to be anonymous, then we also + // have to update the file offset upon splitting the mapping. + mapping.offset += iter->second.end_address - + iter->second.start_address; + } + } + // Create a new mapping that contains the data contents. We often + // limit the amount of data that is actually written to the core + // file. But it is OK if the mapping itself extends past the end of + // the data. + mapping.start_address = addr & ~4095; + mapping.data.assign(addr & 4095, 0).append(data); + mapping.data.append(-mapping.data.size() & 4095, 0); + crashinfo->mappings[mapping.start_address] = mapping; + return; + } + } + // Didn't find a suitable existing mapping for the data. Create a new one. + CrashedProcess::Mapping mapping; + mapping.permissions = PF_R | PF_W; + mapping.start_address = addr & ~4095; + mapping.end_address = + (addr + data.size() + 4095) & ~4095; + mapping.data.assign(addr & 4095, 0).append(data); + mapping.data.append(-mapping.data.size() & 4095, 0); + crashinfo->mappings[mapping.start_address] = mapping; +} + +static void +AugmentMappings(const Options& options, CrashedProcess* crashinfo, + const MinidumpMemoryRange& full_file) { + // For each thread, find the memory mapping that matches the thread's stack. + // Then adjust the mapping to include the stack dump. + for (unsigned i = 0; i < crashinfo->threads.size(); ++i) { + const CrashedProcess::Thread& thread = crashinfo->threads[i]; + AddDataToMapping(crashinfo, + string((char*)thread.stack, thread.stack_length), + thread.stack_addr); + } + + // Create a new link map with information about DSOs. We move this map to + // the beginning of the address space, as this area should always be + // available. + static const uintptr_t start_addr = 4096; + string data; + struct r_debug debug = { 0 }; + debug.r_version = crashinfo->debug.version; + debug.r_brk = (ElfW(Addr))crashinfo->debug.brk; + debug.r_state = r_debug::RT_CONSISTENT; + debug.r_ldbase = (ElfW(Addr))crashinfo->debug.ldbase; + debug.r_map = crashinfo->debug.dso_count > 0 ? + (struct link_map*)(start_addr + sizeof(debug)) : 0; + data.append((char*)&debug, sizeof(debug)); + + struct link_map* prev = 0; + for (std::vector::iterator iter = crashinfo->link_map.begin(); + iter != crashinfo->link_map.end(); + ++iter) { + struct link_map link_map = { 0 }; + link_map.l_addr = (ElfW(Addr))iter->addr; + link_map.l_name = (char*)(start_addr + data.size() + sizeof(link_map)); + link_map.l_ld = (ElfW(Dyn)*)iter->ld; + link_map.l_prev = prev; + prev = (struct link_map*)(start_addr + data.size()); + string filename = full_file.GetAsciiMDString(iter->name); + + // Look up signature for this filename. If available, change filename + // to point to GUID, instead. + std::map::const_iterator sig = + crashinfo->signatures.find((uintptr_t)iter->addr); + if (sig != crashinfo->signatures.end()) { + // At this point, we have: + // old_filename: The path as found via SONAME (e.g. /lib/libpthread.so.0). + // sig_filename: The path on disk (e.g. /lib/libpthread-2.19.so). + const char* guid = sig->second.guid; + string sig_filename = sig->second.filename; + string old_filename = filename.empty() ? sig_filename : filename; + string new_filename; + + // First set up the leading path. We assume dirname always ends with a + // trailing slash (as needed), so we won't be appending one manually. + if (options.so_basedir.empty()) { + string dirname; + if (options.use_filename) { + dirname = sig_filename; + } else { + dirname = old_filename; + } + size_t slash = dirname.find_last_of('/'); + if (slash != string::npos) { + new_filename = dirname.substr(0, slash + 1); + } + } else { + new_filename = options.so_basedir; + } + + // Insert the module ID if requested. + if (options.inc_guid && + strcmp(guid, "00000000-0000-0000-0000-000000000000") != 0) { + new_filename += guid; + new_filename += "-"; + } + + // Decide whether we use the filename or the SONAME (where the SONAME tends + // to be a symlink to the actual file). + new_filename += google_breakpad::BaseName( + options.use_filename ? sig_filename : old_filename); + + if (filename != new_filename) { + if (options.verbose) { + fprintf(stderr, "0x%" PRIx64": rewriting mapping \"%s\" to \"%s\"\n", + static_cast(link_map.l_addr), + filename.c_str(), new_filename.c_str()); + } + filename = new_filename; + } + } + + if (std::distance(iter, crashinfo->link_map.end()) == 1) { + link_map.l_next = 0; + } else { + link_map.l_next = (struct link_map*)(start_addr + data.size() + + sizeof(link_map) + + ((filename.size() + 8) & ~7)); + } + data.append((char*)&link_map, sizeof(link_map)); + data.append(filename); + data.append(8 - (filename.size() & 7), 0); + } + AddDataToMapping(crashinfo, data, start_addr); + + // Map the page containing the _DYNAMIC array + if (!crashinfo->dynamic_data.empty()) { + // Make _DYNAMIC DT_DEBUG entry point to our link map + for (int i = 0;; ++i) { + ElfW(Dyn) dyn; + if ((i+1)*sizeof(dyn) > crashinfo->dynamic_data.length()) { + no_dt_debug: + if (options.verbose) { + fprintf(stderr, "No DT_DEBUG entry found\n"); + } + return; + } + memcpy(&dyn, crashinfo->dynamic_data.c_str() + i*sizeof(dyn), + sizeof(dyn)); + if (dyn.d_tag == DT_DEBUG) { + crashinfo->dynamic_data.replace(i*sizeof(dyn) + + offsetof(ElfW(Dyn), d_un.d_ptr), + sizeof(start_addr), + (char*)&start_addr, sizeof(start_addr)); + break; + } else if (dyn.d_tag == DT_NULL) { + goto no_dt_debug; + } + } + AddDataToMapping(crashinfo, crashinfo->dynamic_data, + (uintptr_t)crashinfo->debug.dynamic); + } +} + +int +main(int argc, const char* argv[]) { + Options options; + SetupOptions(argc, argv, &options); + + MemoryMappedFile mapped_file(options.minidump_path.c_str(), 0); + if (!mapped_file.data()) { + fprintf(stderr, "Failed to mmap dump file: %s: %s\n", + options.minidump_path.c_str(), strerror(errno)); + return 1; + } + + MinidumpMemoryRange dump(mapped_file.data(), mapped_file.size()); + + const MDRawHeader* header = dump.GetData(0); + + CrashedProcess crashinfo; + + // Always check the system info first, as that allows us to tell whether + // this is a minidump file that is compatible with our converter. + bool ok = false; + for (unsigned i = 0; i < header->stream_count; ++i) { + const MDRawDirectory* dirent = + dump.GetArrayElement(header->stream_directory_rva, i); + switch (dirent->stream_type) { + case MD_SYSTEM_INFO_STREAM: + ParseSystemInfo(options, &crashinfo, dump.Subrange(dirent->location), + dump); + ok = true; + break; + default: + break; + } + } + if (!ok) { + fprintf(stderr, "Cannot determine input file format.\n"); + exit(1); + } + + for (unsigned i = 0; i < header->stream_count; ++i) { + const MDRawDirectory* dirent = + dump.GetArrayElement(header->stream_directory_rva, i); + switch (dirent->stream_type) { + case MD_THREAD_LIST_STREAM: + ParseThreadList(options, &crashinfo, dump.Subrange(dirent->location), + dump); + break; + case MD_LINUX_CPU_INFO: + ParseCPUInfo(options, &crashinfo, dump.Subrange(dirent->location)); + break; + case MD_LINUX_PROC_STATUS: + ParseProcessStatus(options, &crashinfo, + dump.Subrange(dirent->location)); + break; + case MD_LINUX_LSB_RELEASE: + ParseLSBRelease(options, &crashinfo, dump.Subrange(dirent->location)); + break; + case MD_LINUX_ENVIRON: + ParseEnvironment(options, &crashinfo, dump.Subrange(dirent->location)); + break; + case MD_LINUX_MAPS: + ParseMaps(options, &crashinfo, dump.Subrange(dirent->location)); + break; + case MD_LINUX_AUXV: + ParseAuxVector(options, &crashinfo, dump.Subrange(dirent->location)); + break; + case MD_LINUX_CMD_LINE: + ParseCmdLine(options, &crashinfo, dump.Subrange(dirent->location)); + break; + case MD_LINUX_DSO_DEBUG: + ParseDSODebugInfo(options, &crashinfo, dump.Subrange(dirent->location), + dump); + break; + case MD_EXCEPTION_STREAM: + ParseExceptionStream(options, &crashinfo, + dump.Subrange(dirent->location), dump); + break; + case MD_MODULE_LIST_STREAM: + ParseModuleStream(options, &crashinfo, dump.Subrange(dirent->location), + dump); + break; + default: + if (options.verbose) + fprintf(stderr, "Skipping %x\n", dirent->stream_type); + } + } + + AugmentMappings(options, &crashinfo, dump); + + // Write the ELF header. The file will look like: + // ELF header + // Phdr for the PT_NOTE + // Phdr for each of the thread stacks + // PT_NOTE + // each of the thread stacks + Ehdr ehdr; + memset(&ehdr, 0, sizeof(Ehdr)); + ehdr.e_ident[0] = ELFMAG0; + ehdr.e_ident[1] = ELFMAG1; + ehdr.e_ident[2] = ELFMAG2; + ehdr.e_ident[3] = ELFMAG3; + ehdr.e_ident[4] = ELF_CLASS; + ehdr.e_ident[5] = sex() ? ELFDATA2MSB : ELFDATA2LSB; + ehdr.e_ident[6] = EV_CURRENT; + ehdr.e_type = ET_CORE; + ehdr.e_machine = ELF_ARCH; + ehdr.e_version = EV_CURRENT; + ehdr.e_phoff = sizeof(Ehdr); + ehdr.e_ehsize = sizeof(Ehdr); + ehdr.e_phentsize= sizeof(Phdr); + ehdr.e_phnum = 1 + // PT_NOTE + crashinfo.mappings.size(); // memory mappings + ehdr.e_shentsize= sizeof(Shdr); + if (!writea(options.out_fd, &ehdr, sizeof(Ehdr))) + return 1; + + size_t offset = sizeof(Ehdr) + ehdr.e_phnum * sizeof(Phdr); + size_t filesz = sizeof(Nhdr) + 8 + sizeof(prpsinfo) + + // sizeof(Nhdr) + 8 + sizeof(user) + + sizeof(Nhdr) + 8 + crashinfo.auxv_length + + crashinfo.threads.size() * ( + (sizeof(Nhdr) + 8 + sizeof(prstatus)) +#if defined(__i386__) || defined(__x86_64__) + + sizeof(Nhdr) + 8 + sizeof(user_fpregs_struct) +#endif +#if defined(__i386__) + + sizeof(Nhdr) + 8 + sizeof(user_fpxregs_struct) +#endif + ); + + Phdr phdr; + memset(&phdr, 0, sizeof(Phdr)); + phdr.p_type = PT_NOTE; + phdr.p_offset = offset; + phdr.p_filesz = filesz; + if (!writea(options.out_fd, &phdr, sizeof(phdr))) + return 1; + + phdr.p_type = PT_LOAD; + phdr.p_align = 4096; + size_t note_align = phdr.p_align - ((offset+filesz) % phdr.p_align); + if (note_align == phdr.p_align) + note_align = 0; + offset += note_align; + + for (std::map::const_iterator iter = + crashinfo.mappings.begin(); + iter != crashinfo.mappings.end(); ++iter) { + const CrashedProcess::Mapping& mapping = iter->second; + if (mapping.permissions == 0xFFFFFFFF) { + // This is a map that we found in MD_MODULE_LIST_STREAM (as opposed to + // MD_LINUX_MAPS). It lacks some of the information that we would like + // to include. + phdr.p_flags = PF_R; + } else { + phdr.p_flags = mapping.permissions; + } + phdr.p_vaddr = mapping.start_address; + phdr.p_memsz = mapping.end_address - mapping.start_address; + if (mapping.data.size()) { + offset += filesz; + filesz = mapping.data.size(); + phdr.p_filesz = mapping.data.size(); + phdr.p_offset = offset; + } else { + phdr.p_filesz = 0; + phdr.p_offset = 0; + } + if (!writea(options.out_fd, &phdr, sizeof(phdr))) + return 1; + } + + Nhdr nhdr; + memset(&nhdr, 0, sizeof(nhdr)); + nhdr.n_namesz = 5; + nhdr.n_descsz = sizeof(prpsinfo); + nhdr.n_type = NT_PRPSINFO; + if (!writea(options.out_fd, &nhdr, sizeof(nhdr)) || + !writea(options.out_fd, "CORE\0\0\0\0", 8) || + !writea(options.out_fd, &crashinfo.prps, sizeof(prpsinfo))) { + return 1; + } + + nhdr.n_descsz = crashinfo.auxv_length; + nhdr.n_type = NT_AUXV; + if (!writea(options.out_fd, &nhdr, sizeof(nhdr)) || + !writea(options.out_fd, "CORE\0\0\0\0", 8) || + !writea(options.out_fd, crashinfo.auxv, crashinfo.auxv_length)) { + return 1; + } + + for (const auto& current_thread : crashinfo.threads) { + if (current_thread.tid == crashinfo.exception.tid) { + // Use the exception record's context for the crashed thread instead of + // the thread's own context. For the crashed thread the thread's own + // context is the state inside the exception handler. Using it would not + // result in the expected stack trace from the time of the crash. + // The stack memory has already been provided by current_thread. + WriteThread(options, crashinfo.exception, crashinfo.fatal_signal); + break; + } + } + + for (const auto& current_thread : crashinfo.threads) { + if (current_thread.tid != crashinfo.exception.tid) + WriteThread(options, current_thread, 0); + } + + if (note_align) { + google_breakpad::scoped_array scratch(new char[note_align]); + memset(scratch.get(), 0, note_align); + if (!writea(options.out_fd, scratch.get(), note_align)) + return 1; + } + + for (std::map::const_iterator iter = + crashinfo.mappings.begin(); + iter != crashinfo.mappings.end(); ++iter) { + const CrashedProcess::Mapping& mapping = iter->second; + if (mapping.data.size()) { + if (!writea(options.out_fd, mapping.data.c_str(), mapping.data.size())) + return 1; + } + } + + if (options.out_fd != STDOUT_FILENO) { + close(options.out_fd); + } + + return 0; +} diff --git a/src/tools/linux/md2core/minidump_memory_range.h b/src/tools/linux/md2core/minidump_memory_range.h new file mode 100644 index 0000000..6cf0747 --- /dev/null +++ b/src/tools/linux/md2core/minidump_memory_range.h @@ -0,0 +1,88 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_memory_range.h: Define the google_breakpad::MinidumpMemoryRange +// class, which adds methods for handling minidump specific data structures +// on top of google_breakpad::MemoryRange. See common/memory_range.h for +// more details on MemoryRange. + +#ifndef TOOLS_LINUX_MD2CORE_MINIDUMP_MEMORY_RANGE_H_ +#define TOOLS_LINUX_MD2CORE_MINIDUMP_MEMORY_RANGE_H_ + +#include + +#include "common/memory_range.h" +#include "google_breakpad/common/minidump_format.h" + +namespace google_breakpad { + +// A derived class of MemoryRange with added methods for handling minidump +// specific data structures. To avoid virtual functions, it is not designed +// to be used polymorphically. +class MinidumpMemoryRange : public MemoryRange { + public: + MinidumpMemoryRange() {} + + MinidumpMemoryRange(const void* data, size_t length) + : MemoryRange(data, length) {} + + // Returns a subrange of |length| bytes at |offset| bytes of this memory + // range, or an empty range if the subrange is out of bounds. + // This methods overrides the base implemementation in order to return + // an instance of MinidumpMemoryRange instead of MemoryRange. + MinidumpMemoryRange Subrange(size_t sub_offset, size_t sub_length) const { + if (Covers(sub_offset, sub_length)) + return MinidumpMemoryRange(data() + sub_offset, sub_length); + return MinidumpMemoryRange(); + } + + // Returns a subrange that covers the offset and length specified by + // |location|, or an empty range if the subrange is out of bounds. + MinidumpMemoryRange Subrange(const MDLocationDescriptor& location) const { + return MinidumpMemoryRange::Subrange(location.rva, location.data_size); + } + + // Gets a STL string from a MDString at |sub_offset| bytes of this memory + // range. This method only works correctly for ASCII characters and does + // not convert between UTF-16 and UTF-8. + const std::string GetAsciiMDString(size_t sub_offset) const { + std::string str; + const MDString* md_str = GetData(sub_offset); + if (md_str) { + const uint16_t* buffer = &md_str->buffer[0]; + for (uint32_t i = 0; i < md_str->length && buffer[i]; ++i) { + str.push_back(buffer[i]); + } + } + return str; + } +}; + +} // namespace google_breakpad + +#endif // TOOLS_LINUX_MD2CORE_MINIDUMP_MEMORY_RANGE_H_ diff --git a/src/tools/linux/md2core/minidump_memory_range_unittest.cc b/src/tools/linux/md2core/minidump_memory_range_unittest.cc new file mode 100644 index 0000000..c939dd6 --- /dev/null +++ b/src/tools/linux/md2core/minidump_memory_range_unittest.cc @@ -0,0 +1,261 @@ +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_memory_range_unittest.cc: +// Unit tests for google_breakpad::MinidumpMemoryRange. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "breakpad_googletest_includes.h" +#include "tools/linux/md2core/minidump_memory_range.h" + +using google_breakpad::MinidumpMemoryRange; +using testing::Message; + +namespace { + +const uint32_t kBuffer[10] = { 0 }; +const size_t kBufferSize = sizeof(kBuffer); +const uint8_t* kBufferPointer = reinterpret_cast(kBuffer); + +// Test vectors for verifying Covers, GetData, and Subrange. +const struct { + bool valid; + size_t offset; + size_t length; +} kSubranges[] = { + { true, 0, 0 }, + { true, 0, 2 }, + { true, 0, kBufferSize }, + { true, 2, 0 }, + { true, 2, 4 }, + { true, 2, kBufferSize - 2 }, + { true, kBufferSize - 1, 1 }, + { false, kBufferSize, 0 }, + { false, kBufferSize, static_cast(-1) }, + { false, kBufferSize + 1, 0 }, + { false, static_cast(-1), 2 }, + { false, 1, kBufferSize }, + { false, kBufferSize - 1, 2 }, + { false, 0, static_cast(-1) }, + { false, 1, static_cast(-1) }, +}; +const size_t kNumSubranges = sizeof(kSubranges) / sizeof(kSubranges[0]); + +// Test vectors for verifying GetArrayElement. +const struct { + size_t offset; + size_t size; + size_t index; + const void* const pointer; +} kElements[] = { + // Valid array elemenets + { 0, 1, 0, kBufferPointer }, + { 0, 1, 1, kBufferPointer + 1 }, + { 0, 1, kBufferSize - 1, kBufferPointer + kBufferSize - 1 }, + { 0, 2, 1, kBufferPointer + 2 }, + { 0, 4, 2, kBufferPointer + 8 }, + { 0, 4, 9, kBufferPointer + 36 }, + { kBufferSize - 1, 1, 0, kBufferPointer + kBufferSize - 1 }, + // Invalid array elemenets + { 0, 1, kBufferSize, NULL }, + { 0, 4, 10, NULL }, + { kBufferSize - 1, 1, 1, NULL }, + { kBufferSize - 1, 2, 0, NULL }, + { kBufferSize, 1, 0, NULL }, +}; +const size_t kNumElements = sizeof(kElements) / sizeof(kElements[0]); + +} // namespace + +TEST(MinidumpMemoryRangeTest, DefaultConstructor) { + MinidumpMemoryRange range; + EXPECT_EQ(NULL, range.data()); + EXPECT_EQ(0U, range.length()); +} + +TEST(MinidumpMemoryRangeTest, ConstructorWithDataAndLength) { + MinidumpMemoryRange range(kBuffer, kBufferSize); + EXPECT_EQ(kBufferPointer, range.data()); + EXPECT_EQ(kBufferSize, range.length()); +} + +TEST(MinidumpMemoryRangeTest, Reset) { + MinidumpMemoryRange range; + range.Reset(); + EXPECT_EQ(NULL, range.data()); + EXPECT_EQ(0U, range.length()); + + range.Set(kBuffer, kBufferSize); + EXPECT_EQ(kBufferPointer, range.data()); + EXPECT_EQ(kBufferSize, range.length()); + + range.Reset(); + EXPECT_EQ(NULL, range.data()); + EXPECT_EQ(0U, range.length()); +} + +TEST(MinidumpMemoryRangeTest, Set) { + MinidumpMemoryRange range; + range.Set(kBuffer, kBufferSize); + EXPECT_EQ(kBufferPointer, range.data()); + EXPECT_EQ(kBufferSize, range.length()); + + range.Set(NULL, 0); + EXPECT_EQ(NULL, range.data()); + EXPECT_EQ(0U, range.length()); +} + +TEST(MinidumpMemoryRangeTest, SubrangeOfEmptyMemoryRange) { + MinidumpMemoryRange range; + MinidumpMemoryRange subrange = range.Subrange(0, 10); + EXPECT_EQ(NULL, subrange.data()); + EXPECT_EQ(0U, subrange.length()); +} + +TEST(MinidumpMemoryRangeTest, SubrangeAndGetData) { + MinidumpMemoryRange range(kBuffer, kBufferSize); + for (size_t i = 0; i < kNumSubranges; ++i) { + bool valid = kSubranges[i].valid; + size_t sub_offset = kSubranges[i].offset; + size_t sub_length = kSubranges[i].length; + SCOPED_TRACE(Message() << "offset=" << sub_offset + << ", length=" << sub_length); + + MinidumpMemoryRange subrange = range.Subrange(sub_offset, sub_length); + if (valid) { + EXPECT_TRUE(range.Covers(sub_offset, sub_length)); + EXPECT_EQ(kBufferPointer + sub_offset, + range.GetData(sub_offset, sub_length)); + EXPECT_EQ(kBufferPointer + sub_offset, subrange.data()); + EXPECT_EQ(sub_length, subrange.length()); + } else { + EXPECT_FALSE(range.Covers(sub_offset, sub_length)); + EXPECT_EQ(NULL, range.GetData(sub_offset, sub_length)); + EXPECT_EQ(NULL, subrange.data()); + EXPECT_EQ(0U, subrange.length()); + } + } +} + +TEST(MinidumpMemoryRangeTest, SubrangeWithMDLocationDescriptor) { + MinidumpMemoryRange range(kBuffer, kBufferSize); + for (size_t i = 0; i < kNumSubranges; ++i) { + bool valid = kSubranges[i].valid; + size_t sub_offset = kSubranges[i].offset; + size_t sub_length = kSubranges[i].length; + SCOPED_TRACE(Message() << "offset=" << sub_offset + << ", length=" << sub_length); + + MDLocationDescriptor location; + location.rva = sub_offset; + location.data_size = sub_length; + MinidumpMemoryRange subrange = range.Subrange(location); + if (valid) { + EXPECT_TRUE(range.Covers(sub_offset, sub_length)); + EXPECT_EQ(kBufferPointer + sub_offset, + range.GetData(sub_offset, sub_length)); + EXPECT_EQ(kBufferPointer + sub_offset, subrange.data()); + EXPECT_EQ(sub_length, subrange.length()); + } else { + EXPECT_FALSE(range.Covers(sub_offset, sub_length)); + EXPECT_EQ(NULL, range.GetData(sub_offset, sub_length)); + EXPECT_EQ(NULL, subrange.data()); + EXPECT_EQ(0U, subrange.length()); + } + } +} + +TEST(MinidumpMemoryRangeTest, GetDataWithTemplateType) { + MinidumpMemoryRange range(kBuffer, kBufferSize); + const char* char_pointer = range.GetData(0); + EXPECT_EQ(reinterpret_cast(kBufferPointer), char_pointer); + const int* int_pointer = range.GetData(0); + EXPECT_EQ(reinterpret_cast(kBufferPointer), int_pointer); +} + +TEST(MinidumpMemoryRangeTest, GetArrayElement) { + MinidumpMemoryRange range(kBuffer, kBufferSize); + for (size_t i = 0; i < kNumElements; ++i) { + size_t element_offset = kElements[i].offset; + size_t element_size = kElements[i].size; + unsigned element_index = kElements[i].index; + const void* const element_pointer = kElements[i].pointer; + SCOPED_TRACE(Message() << "offset=" << element_offset + << ", size=" << element_size + << ", index=" << element_index); + EXPECT_EQ(element_pointer, range.GetArrayElement( + element_offset, element_size, element_index)); + } +} + +TEST(MinidumpMemoryRangeTest, GetArrayElmentWithTemplateType) { + MinidumpMemoryRange range(kBuffer, kBufferSize); + const char* char_pointer = range.GetArrayElement(0, 0); + EXPECT_EQ(reinterpret_cast(kBufferPointer), char_pointer); + const int* int_pointer = range.GetArrayElement(0, 0); + EXPECT_EQ(reinterpret_cast(kBufferPointer), int_pointer); +} + +TEST(MinidumpMemoryRangeTest, GetAsciiMDString) { + uint8_t buffer[100] = { 0 }; + + MDString* md_str = reinterpret_cast(buffer); + md_str->length = 4; + md_str->buffer[0] = 'T'; + md_str->buffer[1] = 'e'; + md_str->buffer[2] = 's'; + md_str->buffer[3] = 't'; + md_str->buffer[4] = '\0'; + + size_t str2_offset = + sizeof(MDString) + (md_str->length + 1) * sizeof(uint16_t); + + md_str = reinterpret_cast(buffer + str2_offset); + md_str->length = 9; // Test length larger than actual string + md_str->buffer[0] = 'S'; + md_str->buffer[1] = 't'; + md_str->buffer[2] = 'r'; + md_str->buffer[3] = 'i'; + md_str->buffer[4] = 'n'; + md_str->buffer[5] = 'g'; + md_str->buffer[6] = '\0'; + md_str->buffer[7] = '1'; + md_str->buffer[8] = '2'; + + MinidumpMemoryRange range(buffer, sizeof(buffer)); + EXPECT_EQ("Test", range.GetAsciiMDString(0)); + EXPECT_EQ("String", range.GetAsciiMDString(str2_offset)); + + // Test out-of-bounds cases. + EXPECT_EQ("", range.GetAsciiMDString( + sizeof(buffer) - sizeof(MDString) + 1)); + EXPECT_EQ("", range.GetAsciiMDString(sizeof(buffer))); +} diff --git a/src/tools/linux/pid2md/pid2md.cc b/src/tools/linux/pid2md/pid2md.cc new file mode 100644 index 0000000..add12a7 --- /dev/null +++ b/src/tools/linux/pid2md/pid2md.cc @@ -0,0 +1,62 @@ +// Copyright 2020 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// pid2md.cc: An utility to generate a minidump from a running process + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include "client/linux/minidump_writer/minidump_writer.h" +#include "common/path_helper.h" + +int main(int argc, char* argv[]) { + if (argc != 3) { + fprintf(stderr, "Usage: %s \n\n", + google_breakpad::BaseName(argv[0]).c_str()); + fprintf(stderr, + "A tool to generate a minidump from a running process. The process " + "resumes its\nactivity once the operation is completed. Permission " + "to trace the process is\nrequired.\n"); + return EXIT_FAILURE; + } + + pid_t process_id = atoi(argv[1]); + const char* minidump_file = argv[2]; + + if (!google_breakpad::WriteMinidump(minidump_file, process_id, process_id)) { + fprintf(stderr, "Unable to generate minidump.\n"); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} diff --git a/src/tools/linux/symupload/minidump_upload.cc b/src/tools/linux/symupload/minidump_upload.cc new file mode 100644 index 0000000..9f2c967 --- /dev/null +++ b/src/tools/linux/symupload/minidump_upload.cc @@ -0,0 +1,159 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// minidump_upload.cc: Upload a minidump to a HTTP server. +// The upload is sent as a multipart/form-data POST request with +// the following parameters: +// prod: the product name +// ver: the product version +// symbol_file: the breakpad format symbol file + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include + +#include "common/linux/http_upload.h" +#include "common/path_helper.h" +#include "common/using_std_string.h" + +using google_breakpad::HTTPUpload; + +struct Options { + string minidumpPath; + string uploadURLStr; + string product; + string version; + string proxy; + string proxy_user_pwd; + bool success; +}; + +//============================================================================= +static void Start(Options *options) { + std::map parameters; + // Add parameters + parameters["prod"] = options->product; + parameters["ver"] = options->version; + + std::map files; + files["upload_file_minidump"] = options->minidumpPath; + + // Send it + string response, error; + bool success = HTTPUpload::SendRequest(options->uploadURLStr, + parameters, + files, + options->proxy, + options->proxy_user_pwd, + "", + &response, + NULL, + &error); + + if (success) { + printf("Successfully sent the minidump file.\n"); + } else { + printf("Failed to send minidump: %s\n", error.c_str()); + } + printf("Response:\n"); + printf("%s\n", response.c_str()); + options->success = success; +} + +//============================================================================= +static void +Usage(int argc, const char *argv[]) { + fprintf(stderr, "Submit minidump information.\n"); + fprintf(stderr, + "Usage: %s [options...] -p -v " + "\n", + google_breakpad::BaseName(argv[0]).c_str()); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " should be a minidump.\n"); + fprintf(stderr, " is the destination for the upload\n"); + + fprintf(stderr, "-p:\t Product name\n"); + fprintf(stderr, "-v:\t Product version\n"); + fprintf(stderr, "-x:\t Use HTTP proxy on given port\n"); + fprintf(stderr, "-u:\t Set proxy user and password\n"); + fprintf(stderr, "-h:\t Usage\n"); + fprintf(stderr, "-?:\t Usage\n"); +} + +//============================================================================= +static void +SetupOptions(int argc, const char *argv[], Options *options) { + extern int optind; + int ch; + + while ((ch = getopt(argc, (char * const*)argv, "p:u:v:x:h?")) != -1) { + switch (ch) { + case 'p': + options->product = optarg; + break; + case 'u': + options->proxy_user_pwd = optarg; + break; + case 'v': + options->version = optarg; + break; + case 'x': + options->proxy = optarg; + break; + + default: + fprintf(stderr, "Invalid option '%c'\n", ch); + Usage(argc, argv); + exit(1); + break; + } + } + + if ((argc - optind) != 2) { + fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]); + Usage(argc, argv); + exit(1); + } + + options->minidumpPath = argv[optind]; + options->uploadURLStr = argv[optind + 1]; +} + +//============================================================================= +int main(int argc, const char* argv[]) { + Options options; + SetupOptions(argc, argv, &options); + Start(&options); + return options.success ? 0 : 1; +} diff --git a/src/tools/linux/symupload/sym_upload.cc b/src/tools/linux/symupload/sym_upload.cc new file mode 100644 index 0000000..a76c55f --- /dev/null +++ b/src/tools/linux/symupload/sym_upload.cc @@ -0,0 +1,217 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// symupload.cc: Upload a symbol file to a HTTP server. The upload is sent as +// a multipart/form-data POST request with the following parameters: +// code_file: the basename of the module, e.g. "app" +// debug_file: the basename of the debugging file, e.g. "app" +// debug_identifier: the debug file's identifier, usually consisting of +// the guid and age embedded in the pdb, e.g. +// "11111111BBBB3333DDDD555555555555F" +// version: the file version of the module, e.g. "1.2.3.4" +// os: the operating system that the module was built for +// cpu: the CPU that the module was built for +// symbol_file: the contents of the breakpad-format symbol file + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include + +#include + +#include "common/linux/symbol_upload.h" +#include "common/path_helper.h" + +using google_breakpad::sym_upload::UploadProtocol; +using google_breakpad::sym_upload::Options; + +static void StrToUpper(std::string* str) { + if (str == nullptr) { + fprintf(stderr, "nullptr passed to StrToUpper.\n"); + exit(1); + } + for (size_t i = 0; i < str->length(); i++) { + (*str)[i] = std::toupper((*str)[i], std::locale::classic()); + } +} + +//============================================================================= +static void +Usage(int argc, const char *argv[]) { + fprintf(stderr, "Submit symbol information.\n"); + fprintf(stderr, "Usage: %s [options...] \n", + google_breakpad::BaseName(argv[0]).c_str()); + fprintf(stderr, "Options:\n"); + fprintf(stderr, + " should be created by using the dump_syms " + "tool.\n"); + fprintf(stderr, " is the destination for the upload\n"); + fprintf(stderr, "-p:\t One of ['sym-upload-v1'," + " 'sym-upload-v2'], defaults to 'sym-upload-v1'.\n"); + fprintf(stderr, "-v:\t Version information (e.g., 1.2.3.4)\n"); + fprintf(stderr, "-x:\t Use HTTP proxy on given port\n"); + fprintf(stderr, "-u:\t Set proxy user and password\n"); + fprintf(stderr, "-h:\t Usage\n"); + fprintf(stderr, "-?:\t Usage\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "These options only work with 'sym-upload-v2' protocol:\n"); + fprintf(stderr, "-k:\t A secret used to authenticate with the" + " API.\n"); + fprintf(stderr, "-f:\t Force symbol upload if already exists.\n"); + fprintf(stderr, "-t:\t Explicitly set symbol upload type (" + "default is 'breakpad').\n" + "\t One of ['breakpad', 'elf', 'pe', 'macho', 'debug_only', 'dwp', " + "'dsym', 'pdb'].\n" + "\t Note: When this flag is set to anything other than 'breakpad', then " + "the '-c' and '-i' flags must also be set.\n"); + fprintf(stderr, "-c:\t Explicitly set 'code_file' for symbol " + "upload (basename of executable).\n"); + fprintf(stderr, "-i:\t Explicitly set 'debug_id' for symbol " + "upload (typically build ID of executable).\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Examples:\n"); + fprintf(stderr, " With 'sym-upload-v1':\n"); + fprintf(stderr, " %s path/to/symbol_file http://myuploadserver\n", + argv[0]); + fprintf(stderr, " With 'sym-upload-v2':\n"); + fprintf(stderr, " [Defaulting to symbol type 'BREAKPAD']\n"); + fprintf(stderr, " %s -p sym-upload-v2 -k mysecret123! " + "path/to/symbol_file http://myuploadserver\n", argv[0]); + fprintf(stderr, " [Explicitly set symbol type to 'elf']\n"); + fprintf(stderr, " %s -p sym-upload-v2 -k mysecret123! -t elf " + "-c app -i 11111111BBBB3333DDDD555555555555F " + "path/to/symbol_file http://myuploadserver\n", argv[0]); +} + +//============================================================================= +static void +SetupOptions(int argc, const char *argv[], Options *options) { + extern int optind, optopt; + int ch; + constexpr char flag_pattern[] = "u:v:x:p:k:t:c:i:hf?"; + + while ((ch = getopt(argc, (char * const*)argv, flag_pattern)) != -1) { + switch (ch) { + case 'h': + case '?': + Usage(argc, argv); + // ch might be '?' because getopt found an error while parsing args (as + // opposed to finding "-?" as an arg), in which case optopt is set to + // the bad arg value, so return an error code if optopt is set, + // otherwise exit cleanly. + exit(optopt == 0 ? 0 : 1); + case 'u': + options->proxy_user_pwd = optarg; + break; + case 'v': + options->version = optarg; + break; + case 'x': + options->proxy = optarg; + break; + case 'p': + if (strcmp(optarg, "sym-upload-v2") == 0) { + options->upload_protocol = UploadProtocol::SYM_UPLOAD_V2; + } else if (strcmp(optarg, "sym-upload-v1") == 0) { + options->upload_protocol = UploadProtocol::SYM_UPLOAD_V1; + } else { + fprintf(stderr, "Invalid protocol '%s'\n", optarg); + Usage(argc, argv); + exit(1); + } + break; + case 'k': + options->api_key = optarg; + break; + case 't': { + // This is really an enum, so treat as upper-case for consistency with + // enum naming convention on server-side. + options->type = optarg; + StrToUpper(&(options->type)); + break; + } + case 'c': + options->code_file = optarg; + break; + case 'i': + options->debug_id = optarg; + break; + case 'f': + options->force = true; + break; + + default: + fprintf(stderr, "Invalid option '%c'\n", ch); + Usage(argc, argv); + exit(1); + } + } + + if ((argc - optind) != 2) { + fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]); + Usage(argc, argv); + exit(1); + } + + bool is_breakpad_upload = options->type.empty() || + options->type == google_breakpad::sym_upload::kBreakpadSymbolType; + bool has_code_file = !options->code_file.empty(); + bool has_debug_id = !options->debug_id.empty(); + if (is_breakpad_upload && (has_code_file || has_debug_id)) { + fprintf(stderr, "\n"); + fprintf(stderr, "%s: -c and -i should only be specified for non-breakpad " + "symbol upload types.\n", argv[0]); + fprintf(stderr, "\n"); + Usage(argc, argv); + exit(1); + } + if (!is_breakpad_upload && (!has_code_file || !has_debug_id)) { + fprintf(stderr, "\n"); + fprintf(stderr, "%s: -c and -i must be specified for non-breakpad " + "symbol upload types.\n", argv[0]); + fprintf(stderr, "\n"); + Usage(argc, argv); + exit(1); + } + + options->symbolsPath = argv[optind]; + options->uploadURLStr = argv[optind + 1]; +} + +//============================================================================= +int main(int argc, const char* argv[]) { + Options options; + SetupOptions(argc, argv, &options); + google_breakpad::sym_upload::Start(&options); + return options.success ? 0 : 1; +} diff --git a/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj b/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c98b6ac --- /dev/null +++ b/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj @@ -0,0 +1,1857 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXAggregateTarget section */ + B88FAFC9116BDCAD00407530 /* all_unittests */ = { + isa = PBXAggregateTarget; + buildConfigurationList = B88FAFCC116BDCCC00407530 /* Build configuration list for PBXAggregateTarget "all_unittests" */; + buildPhases = ( + B88FB094116CE73E00407530 /* ShellScript */, + ); + dependencies = ( + B88FB15B116CF53E00407530 /* PBXTargetDependency */, + B88FAFCF116BDD7000407530 /* PBXTargetDependency */, + B88FB01D116BDF9800407530 /* PBXTargetDependency */, + B88FB167116CF54B00407530 /* PBXTargetDependency */, + B88FAFD1116BDD7000407530 /* PBXTargetDependency */, + B88FB165116CF54B00407530 /* PBXTargetDependency */, + B88FB161116CF54B00407530 /* PBXTargetDependency */, + B88FB15F116CF54B00407530 /* PBXTargetDependency */, + B88FB15D116CF54B00407530 /* PBXTargetDependency */, + B84A9201116CF7D2006C210E /* PBXTargetDependency */, + B88FB0C8116CEB4A00407530 /* PBXTargetDependency */, + 8B31051511F100CF00FCF3E4 /* PBXTargetDependency */, + ); + name = all_unittests; + productName = all_unittests; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 162F64FA161C591500CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F8161C591500CD68D5 /* arch_utilities.cc */; }; + 162F6500161C5F2200CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F8161C591500CD68D5 /* arch_utilities.cc */; }; + 4247E63D2110D4B200482558 /* path_helper.cc in Sources */ = {isa = PBXBuildFile; fileRef = EB06C7511FEBC515000214D9 /* path_helper.cc */; }; + 4262382721AC496F00E5A3A6 /* dwarf_range_list_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4262382521AC496F00E5A3A6 /* dwarf_range_list_handler.cc */; }; + 4262382821AC49A000E5A3A6 /* dwarf_range_list_handler.h in Sources */ = {isa = PBXBuildFile; fileRef = 4262382621AC496F00E5A3A6 /* dwarf_range_list_handler.h */; }; + 4D72CAF513DFBAC2006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CAF413DFBAC2006CABE3 /* md5.cc */; }; + 8BCAAA4C1CE3A7980046090B /* elf_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8BCAAA4A1CE3A7980046090B /* elf_reader.cc */; }; + 8BCAAA4D1CE3B1260046090B /* elf_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8BCAAA4A1CE3A7980046090B /* elf_reader.cc */; }; + B84A91F8116CF78F006C210E /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B84A91FB116CF7AF006C210E /* module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE241166603300407530 /* module.cc */; }; + B84A91FC116CF7AF006C210E /* stabs_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE3C11666C8900407530 /* stabs_to_module.cc */; }; + B84A91FD116CF7AF006C210E /* stabs_to_module_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0D8116CEC0600407530 /* stabs_to_module_unittest.cc */; }; + B88FAE1911665FE400407530 /* dwarf2diehandler.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE1711665FE400407530 /* dwarf2diehandler.cc */; }; + B88FAE261166603300407530 /* dwarf_cu_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE1E1166603300407530 /* dwarf_cu_to_module.cc */; }; + B88FAE271166603300407530 /* dwarf_line_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE201166603300407530 /* dwarf_line_to_module.cc */; }; + B88FAE281166603300407530 /* language.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE221166603300407530 /* language.cc */; }; + B88FAE291166603300407530 /* module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE241166603300407530 /* module.cc */; }; + B88FAE2C1166606200407530 /* macho_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = B89E0E6E1166571D00DD08C9 /* macho_reader.cc */; }; + B88FAE351166673E00407530 /* dwarf_cfi_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE331166673E00407530 /* dwarf_cfi_to_module.cc */; }; + B88FAE3B11666C6F00407530 /* stabs_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE3911666C6F00407530 /* stabs_reader.cc */; }; + B88FAE3E11666C8900407530 /* stabs_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE3C11666C8900407530 /* stabs_to_module.cc */; }; + B88FAF37116A595400407530 /* cfi_assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAF34116A595400407530 /* cfi_assembler.cc */; }; + B88FAF38116A595400407530 /* dwarf2reader_cfi_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAF36116A595400407530 /* dwarf2reader_cfi_unittest.cc */; }; + B88FAF3F116A5A2E00407530 /* dwarf2reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */; }; + B88FAF40116A5A2E00407530 /* bytereader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F95B422C0E0E22D100DBDE83 /* bytereader.cc */; }; + B88FB00F116BDEA700407530 /* stabs_reader_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB003116BDE7200407530 /* stabs_reader_unittest.cc */; }; + B88FB010116BDEA700407530 /* stabs_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE3911666C6F00407530 /* stabs_reader.cc */; }; + B88FB028116BE03100407530 /* test_assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE0911665B5700407530 /* test_assembler.cc */; }; + B88FB029116BE03100407530 /* gmock-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = B89E0EA311665AEA00DD08C9 /* gmock-all.cc */; }; + B88FB02A116BE03100407530 /* gtest_main.cc in Sources */ = {isa = PBXBuildFile; fileRef = B89E0E9F11665AC300DD08C9 /* gtest_main.cc */; }; + B88FB02B116BE03100407530 /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = B89E0EA011665AC300DD08C9 /* gtest-all.cc */; }; + B88FB03F116BE24200407530 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B88FB042116BE3C400407530 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B88FB057116C0CDE00407530 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B88FB0BD116CEAE000407530 /* module_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0B5116CEA8A00407530 /* module_unittest.cc */; }; + B88FB0C1116CEB0600407530 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B88FB0C4116CEB4100407530 /* module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE241166603300407530 /* module.cc */; }; + B88FB0E3116CEEB000407530 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B88FB0E5116CEED300407530 /* dwarf2diehandler.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE1711665FE400407530 /* dwarf2diehandler.cc */; }; + B88FB0E6116CEED300407530 /* dwarf2diehandler_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0DB116CEC5800407530 /* dwarf2diehandler_unittest.cc */; }; + B88FB0F6116CEF2000407530 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B88FB0FA116CF00E00407530 /* dwarf_line_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE201166603300407530 /* dwarf_line_to_module.cc */; }; + B88FB0FB116CF00E00407530 /* dwarf_line_to_module_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0D7116CEC0600407530 /* dwarf_line_to_module_unittest.cc */; }; + B88FB0FE116CF02400407530 /* module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE241166603300407530 /* module.cc */; }; + B88FB10E116CF08100407530 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B88FB112116CF1F000407530 /* dwarf_cu_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE1E1166603300407530 /* dwarf_cu_to_module.cc */; }; + B88FB113116CF1F000407530 /* dwarf_cu_to_module_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0D6116CEC0600407530 /* dwarf_cu_to_module_unittest.cc */; }; + B88FB114116CF1F000407530 /* language.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE221166603300407530 /* language.cc */; }; + B88FB115116CF1F000407530 /* module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE241166603300407530 /* module.cc */; }; + B88FB123116CF28500407530 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B88FB129116CF2DD00407530 /* module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE241166603300407530 /* module.cc */; }; + B88FB12A116CF2DD00407530 /* dwarf_cfi_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE331166673E00407530 /* dwarf_cfi_to_module.cc */; }; + B88FB12B116CF2DD00407530 /* dwarf_cfi_to_module_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0D5116CEC0600407530 /* dwarf_cfi_to_module_unittest.cc */; }; + B88FB139116CF31600407530 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B88FB13D116CF38300407530 /* cfi_assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAF34116A595400407530 /* cfi_assembler.cc */; }; + B88FB13E116CF38300407530 /* bytereader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F95B422C0E0E22D100DBDE83 /* bytereader.cc */; }; + B88FB13F116CF38300407530 /* bytereader_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0DA116CEC5800407530 /* bytereader_unittest.cc */; }; + B88FB14F116CF4AE00407530 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + B88FB152116CF4D300407530 /* byte_cursor_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0D4116CEC0600407530 /* byte_cursor_unittest.cc */; }; + B89E0E781166576C00DD08C9 /* macho_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = B89E0E6E1166571D00DD08C9 /* macho_reader.cc */; }; + B89E0E7A1166576C00DD08C9 /* macho_dump.cc in Sources */ = {isa = PBXBuildFile; fileRef = B89E0E701166573700DD08C9 /* macho_dump.cc */; }; + B89E0E9911665A7200DD08C9 /* macho_reader_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B89E0E6D1166571D00DD08C9 /* macho_reader_unittest.cc */; }; + B89E0E9A11665A7200DD08C9 /* macho_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = B89E0E6E1166571D00DD08C9 /* macho_reader.cc */; }; + B8C5B5171166534700D34F4E /* dwarf2reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */; }; + B8C5B5181166534700D34F4E /* bytereader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F95B422C0E0E22D100DBDE83 /* bytereader.cc */; }; + B8C5B5191166534700D34F4E /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 557800890BE1F3AB00EC23E0 /* macho_utilities.cc */; }; + B8C5B51A1166534700D34F4E /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BE650410B52F6D800611104 /* file_id.cc */; }; + B8C5B51B1166534700D34F4E /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BE650430B52F6D800611104 /* macho_id.cc */; }; + B8C5B51C1166534700D34F4E /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BE650450B52F6D800611104 /* macho_walker.cc */; }; + B8C5B51D1166534700D34F4E /* dump_syms.cc in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* dump_syms.cc */; }; + B8C5B51E1166534700D34F4E /* dump_syms_tool.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BDF186E0B1BB43700F8391B /* dump_syms_tool.cc */; }; + B8C5B523116653BA00D34F4E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; }; + D21F97D711CBA12300239E38 /* test_assembler_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0D9116CEC0600407530 /* test_assembler_unittest.cc */; }; + D21F97D811CBA13D00239E38 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; + D21F97E911CBA1FF00239E38 /* test_assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE0911665B5700407530 /* test_assembler.cc */; }; + EB06C7531FEBC516000214D9 /* path_helper.cc in Sources */ = {isa = PBXBuildFile; fileRef = EB06C7511FEBC515000214D9 /* path_helper.cc */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 8B31051411F100CF00FCF3E4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = D21F97D111CBA0F200239E38; + remoteInfo = test_assembler_unittest; + }; + B84A91F9116CF796006C210E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B84A9200116CF7D2006C210E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B84A91F3116CF784006C210E; + remoteInfo = stabs_to_module_unittest; + }; + B88FAFCE116BDD7000407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B89E0E9411665A6400DD08C9; + remoteInfo = macho_reader_unittest; + }; + B88FAFD0116BDD7000407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FAF2E116A591D00407530; + remoteInfo = dwarf2reader_cfi_unittest; + }; + B88FB01C116BDF9800407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB006116BDE8300407530; + remoteInfo = stabs_reader_unittest; + }; + B88FB039116BE17E00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B88FB087116CE6D800407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B88FB08F116CE71000407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B88FB0BF116CEAFE00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B88FB0C7116CEB4A00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB0B8116CEABF00407530; + remoteInfo = module_unittest; + }; + B88FB0E7116CEEDA00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B88FB0F7116CEF2E00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B88FB10F116CF08A00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B88FB124116CF29E00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B88FB13B116CF35C00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B88FB150116CF4C100407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB023116BDFFF00407530; + remoteInfo = gtestmockall; + }; + B88FB15A116CF53E00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB14A116CF4A700407530; + remoteInfo = byte_cursor_unittest; + }; + B88FB15C116CF54B00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB11E116CF27F00407530; + remoteInfo = dwarf_cfi_to_module_unittest; + }; + B88FB15E116CF54B00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB0F1116CEF1900407530; + remoteInfo = dwarf_line_to_module_unittest; + }; + B88FB160116CF54B00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB109116CF07900407530; + remoteInfo = dwarf_cu_to_module_unittest; + }; + B88FB164116CF54B00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB0DE116CEEA800407530; + remoteInfo = dwarf2diehandler_unittest; + }; + B88FB166116CF54B00407530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 08FB7793FE84155DC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88FB134116CF30F00407530; + remoteInfo = bytereader_unittest; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 08FB7796FE84155DC02AAC07 /* dump_syms.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = dump_syms.cc; path = ../../../common/mac/dump_syms.cc; sourceTree = ""; }; + 08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 162F64F8161C591500CD68D5 /* arch_utilities.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = arch_utilities.cc; path = ../../../common/mac/arch_utilities.cc; sourceTree = ""; }; + 162F64F9161C591500CD68D5 /* arch_utilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = arch_utilities.h; path = ../../../common/mac/arch_utilities.h; sourceTree = ""; }; + 4262382521AC496F00E5A3A6 /* dwarf_range_list_handler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_range_list_handler.cc; path = ../../../common/dwarf_range_list_handler.cc; sourceTree = ""; }; + 4262382621AC496F00E5A3A6 /* dwarf_range_list_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf_range_list_handler.h; path = ../../../common/dwarf_range_list_handler.h; sourceTree = ""; }; + 4D72CAF413DFBAC2006CABE3 /* md5.cc */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = md5.cc; path = ../../../common/md5.cc; sourceTree = SOURCE_ROOT; }; + 557800890BE1F3AB00EC23E0 /* macho_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_utilities.cc; path = ../../../common/mac/macho_utilities.cc; sourceTree = SOURCE_ROOT; }; + 5578008A0BE1F3AB00EC23E0 /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_utilities.h; path = ../../../common/mac/macho_utilities.h; sourceTree = SOURCE_ROOT; }; + 8B31023E11F0CF1C00FCF3E4 /* Breakpad.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Breakpad.xcconfig; path = ../../../common/mac/Breakpad.xcconfig; sourceTree = SOURCE_ROOT; }; + 8B3102D411F0D60300FCF3E4 /* BreakpadDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadDebug.xcconfig; path = ../../../common/mac/BreakpadDebug.xcconfig; sourceTree = SOURCE_ROOT; }; + 8B3102D511F0D60300FCF3E4 /* BreakpadRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadRelease.xcconfig; path = ../../../common/mac/BreakpadRelease.xcconfig; sourceTree = SOURCE_ROOT; }; + 8BCAAA4A1CE3A7980046090B /* elf_reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = elf_reader.cc; path = ../../../common/dwarf/elf_reader.cc; sourceTree = ""; }; + 8BCAAA4B1CE3A7980046090B /* elf_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = elf_reader.h; path = ../../../common/dwarf/elf_reader.h; sourceTree = ""; }; + 9BDF186D0B1BB43700F8391B /* dump_syms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dump_syms.h; path = ../../../common/mac/dump_syms.h; sourceTree = ""; }; + 9BDF186E0B1BB43700F8391B /* dump_syms_tool.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = dump_syms_tool.cc; sourceTree = ""; }; + 9BE650410B52F6D800611104 /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = file_id.cc; path = ../../../common/mac/file_id.cc; sourceTree = SOURCE_ROOT; }; + 9BE650420B52F6D800611104 /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = file_id.h; path = ../../../common/mac/file_id.h; sourceTree = SOURCE_ROOT; }; + 9BE650430B52F6D800611104 /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_id.cc; path = ../../../common/mac/macho_id.cc; sourceTree = SOURCE_ROOT; }; + 9BE650440B52F6D800611104 /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../../common/mac/macho_id.h; sourceTree = SOURCE_ROOT; }; + 9BE650450B52F6D800611104 /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; }; + 9BE650460B52F6D800611104 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; }; + B84A91F4116CF784006C210E /* stabs_to_module_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = stabs_to_module_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B88FAE0911665B5700407530 /* test_assembler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = test_assembler.cc; path = ../../../common/test_assembler.cc; sourceTree = SOURCE_ROOT; }; + B88FAE0A11665B5700407530 /* test_assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test_assembler.h; path = ../../../common/test_assembler.h; sourceTree = SOURCE_ROOT; }; + B88FAE1711665FE400407530 /* dwarf2diehandler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2diehandler.cc; path = ../../../common/dwarf/dwarf2diehandler.cc; sourceTree = SOURCE_ROOT; }; + B88FAE1811665FE400407530 /* dwarf2diehandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2diehandler.h; path = ../../../common/dwarf/dwarf2diehandler.h; sourceTree = SOURCE_ROOT; }; + B88FAE1D1166603300407530 /* byte_cursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = byte_cursor.h; path = ../../../common/byte_cursor.h; sourceTree = SOURCE_ROOT; }; + B88FAE1E1166603300407530 /* dwarf_cu_to_module.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_cu_to_module.cc; path = ../../../common/dwarf_cu_to_module.cc; sourceTree = SOURCE_ROOT; }; + B88FAE1F1166603300407530 /* dwarf_cu_to_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf_cu_to_module.h; path = ../../../common/dwarf_cu_to_module.h; sourceTree = SOURCE_ROOT; }; + B88FAE201166603300407530 /* dwarf_line_to_module.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_line_to_module.cc; path = ../../../common/dwarf_line_to_module.cc; sourceTree = SOURCE_ROOT; }; + B88FAE211166603300407530 /* dwarf_line_to_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf_line_to_module.h; path = ../../../common/dwarf_line_to_module.h; sourceTree = SOURCE_ROOT; }; + B88FAE221166603300407530 /* language.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = language.cc; path = ../../../common/language.cc; sourceTree = SOURCE_ROOT; }; + B88FAE231166603300407530 /* language.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = language.h; path = ../../../common/language.h; sourceTree = SOURCE_ROOT; }; + B88FAE241166603300407530 /* module.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = module.cc; path = ../../../common/module.cc; sourceTree = SOURCE_ROOT; }; + B88FAE251166603300407530 /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = module.h; path = ../../../common/module.h; sourceTree = SOURCE_ROOT; }; + B88FAE331166673E00407530 /* dwarf_cfi_to_module.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_cfi_to_module.cc; path = ../../../common/dwarf_cfi_to_module.cc; sourceTree = SOURCE_ROOT; }; + B88FAE341166673E00407530 /* dwarf_cfi_to_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf_cfi_to_module.h; path = ../../../common/dwarf_cfi_to_module.h; sourceTree = SOURCE_ROOT; }; + B88FAE3911666C6F00407530 /* stabs_reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = stabs_reader.cc; path = ../../../common/stabs_reader.cc; sourceTree = SOURCE_ROOT; }; + B88FAE3A11666C6F00407530 /* stabs_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stabs_reader.h; path = ../../../common/stabs_reader.h; sourceTree = SOURCE_ROOT; }; + B88FAE3C11666C8900407530 /* stabs_to_module.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = stabs_to_module.cc; path = ../../../common/stabs_to_module.cc; sourceTree = SOURCE_ROOT; }; + B88FAE3D11666C8900407530 /* stabs_to_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stabs_to_module.h; path = ../../../common/stabs_to_module.h; sourceTree = SOURCE_ROOT; }; + B88FAF2F116A591E00407530 /* dwarf2reader_cfi_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dwarf2reader_cfi_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B88FAF34116A595400407530 /* cfi_assembler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cfi_assembler.cc; path = ../../../common/dwarf/cfi_assembler.cc; sourceTree = SOURCE_ROOT; }; + B88FAF35116A595400407530 /* cfi_assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cfi_assembler.h; path = ../../../common/dwarf/cfi_assembler.h; sourceTree = SOURCE_ROOT; }; + B88FAF36116A595400407530 /* dwarf2reader_cfi_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader_cfi_unittest.cc; path = ../../../common/dwarf/dwarf2reader_cfi_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB003116BDE7200407530 /* stabs_reader_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = stabs_reader_unittest.cc; path = ../../../common/stabs_reader_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB007116BDE8300407530 /* stabs_reader_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = stabs_reader_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B88FB024116BDFFF00407530 /* libgtestmockall.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtestmockall.a; sourceTree = BUILT_PRODUCTS_DIR; }; + B88FB0B5116CEA8A00407530 /* module_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = module_unittest.cc; path = ../../../common/module_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB0B9116CEABF00407530 /* module_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = module_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B88FB0D4116CEC0600407530 /* byte_cursor_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = byte_cursor_unittest.cc; path = ../../../common/byte_cursor_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB0D5116CEC0600407530 /* dwarf_cfi_to_module_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_cfi_to_module_unittest.cc; path = ../../../common/dwarf_cfi_to_module_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB0D6116CEC0600407530 /* dwarf_cu_to_module_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_cu_to_module_unittest.cc; path = ../../../common/dwarf_cu_to_module_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB0D7116CEC0600407530 /* dwarf_line_to_module_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_line_to_module_unittest.cc; path = ../../../common/dwarf_line_to_module_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB0D8116CEC0600407530 /* stabs_to_module_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = stabs_to_module_unittest.cc; path = ../../../common/stabs_to_module_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB0D9116CEC0600407530 /* test_assembler_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = test_assembler_unittest.cc; path = ../../../common/test_assembler_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB0DA116CEC5800407530 /* bytereader_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader_unittest.cc; path = ../../../common/dwarf/bytereader_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB0DB116CEC5800407530 /* dwarf2diehandler_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2diehandler_unittest.cc; path = ../../../common/dwarf/dwarf2diehandler_unittest.cc; sourceTree = SOURCE_ROOT; }; + B88FB0DF116CEEA800407530 /* dwarf2diehandler_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dwarf2diehandler_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B88FB0F2116CEF1900407530 /* dwarf_line_to_module_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dwarf_line_to_module_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B88FB10A116CF07900407530 /* dwarf_cu_to_module_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dwarf_cu_to_module_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B88FB11F116CF27F00407530 /* dwarf_cfi_to_module_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dwarf_cfi_to_module_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B88FB135116CF30F00407530 /* bytereader_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = bytereader_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B88FB14B116CF4A700407530 /* byte_cursor_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = byte_cursor_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B89E0E6D1166571D00DD08C9 /* macho_reader_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_reader_unittest.cc; path = ../../../common/mac/macho_reader_unittest.cc; sourceTree = SOURCE_ROOT; }; + B89E0E6E1166571D00DD08C9 /* macho_reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_reader.cc; path = ../../../common/mac/macho_reader.cc; sourceTree = SOURCE_ROOT; }; + B89E0E6F1166571D00DD08C9 /* macho_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_reader.h; path = ../../../common/mac/macho_reader.h; sourceTree = SOURCE_ROOT; }; + B89E0E701166573700DD08C9 /* macho_dump.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = macho_dump.cc; sourceTree = ""; }; + B89E0E741166575200DD08C9 /* macho_dump */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = macho_dump; sourceTree = BUILT_PRODUCTS_DIR; }; + B89E0E9511665A6400DD08C9 /* macho_reader_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = macho_reader_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + B89E0E9F11665AC300DD08C9 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gtest_main.cc; path = ../../../testing/googletest/src/gtest_main.cc; sourceTree = SOURCE_ROOT; }; + B89E0EA011665AC300DD08C9 /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gtest-all.cc"; path = "../../../testing/googletest/src/gtest-all.cc"; sourceTree = SOURCE_ROOT; }; + B89E0EA311665AEA00DD08C9 /* gmock-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gmock-all.cc"; path = "../../../testing/googlemock/src/gmock-all.cc"; sourceTree = SOURCE_ROOT; }; + B8C5B5111166531A00D34F4E /* dump_syms */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dump_syms; sourceTree = BUILT_PRODUCTS_DIR; }; + B8E8CA0C1156C854009E61B2 /* byteswap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = byteswap.h; path = ../../../common/mac/byteswap.h; sourceTree = SOURCE_ROOT; }; + D21F97D211CBA0F200239E38 /* test_assembler_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = test_assembler_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + EB06C7511FEBC515000214D9 /* path_helper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = path_helper.cc; path = ../../../common/path_helper.cc; sourceTree = ""; }; + EB06C7521FEBC516000214D9 /* path_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path_helper.h; path = ../../../common/path_helper.h; sourceTree = ""; }; + F95B422B0E0E22D100DBDE83 /* bytereader-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "bytereader-inl.h"; path = "../../../common/dwarf/bytereader-inl.h"; sourceTree = SOURCE_ROOT; }; + F95B422C0E0E22D100DBDE83 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; }; + F95B422D0E0E22D100DBDE83 /* bytereader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bytereader.h; path = ../../../common/dwarf/bytereader.h; sourceTree = SOURCE_ROOT; }; + F95B422E0E0E22D100DBDE83 /* dwarf2enums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2enums.h; path = ../../../common/dwarf/dwarf2enums.h; sourceTree = SOURCE_ROOT; }; + F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; }; + F95B42300E0E22D100DBDE83 /* dwarf2reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2reader.h; path = ../../../common/dwarf/dwarf2reader.h; sourceTree = SOURCE_ROOT; }; + F95B42310E0E22D100DBDE83 /* line_state_machine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = line_state_machine.h; path = ../../../common/dwarf/line_state_machine.h; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B84A91F2116CF784006C210E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B84A91F8116CF78F006C210E /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FAF2D116A591D00407530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB042116BE3C400407530 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB005116BDE8300407530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB03F116BE24200407530 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB022116BDFFF00407530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB0B7116CEABF00407530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB0C1116CEB0600407530 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB0DD116CEEA800407530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB0E3116CEEB000407530 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB0F0116CEF1900407530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB0F6116CEF2000407530 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB108116CF07900407530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB10E116CF08100407530 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB11D116CF27F00407530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB123116CF28500407530 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB133116CF30F00407530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB139116CF31600407530 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB149116CF4A700407530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB14F116CF4AE00407530 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B89E0E721166575200DD08C9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B89E0E9311665A6400DD08C9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB057116C0CDE00407530 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B8C5B50F1166531A00D34F4E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B8C5B523116653BA00D34F4E /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D21F97D011CBA0F200239E38 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D21F97D811CBA13D00239E38 /* libgtestmockall.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* dump_syms */ = { + isa = PBXGroup; + children = ( + 8B31023E11F0CF1C00FCF3E4 /* Breakpad.xcconfig */, + 8B3102D411F0D60300FCF3E4 /* BreakpadDebug.xcconfig */, + 8B3102D511F0D60300FCF3E4 /* BreakpadRelease.xcconfig */, + B89E0E9D11665A9500DD08C9 /* TESTING */, + F9F5344B0E7C8FFC0012363F /* DWARF */, + B89E0E6C1166569700DD08C9 /* MACHO */, + B88FAE3811666A1700407530 /* STABS */, + B88FAE1C11665FFD00407530 /* MODULE */, + 162F64F8161C591500CD68D5 /* arch_utilities.cc */, + 162F64F9161C591500CD68D5 /* arch_utilities.h */, + B88FAE1D1166603300407530 /* byte_cursor.h */, + B88FB0D4116CEC0600407530 /* byte_cursor_unittest.cc */, + B8E8CA0C1156C854009E61B2 /* byteswap.h */, + 9BE650410B52F6D800611104 /* file_id.cc */, + 9BE650420B52F6D800611104 /* file_id.h */, + 9BDF186D0B1BB43700F8391B /* dump_syms.h */, + 08FB7796FE84155DC02AAC07 /* dump_syms.cc */, + 9BDF186E0B1BB43700F8391B /* dump_syms_tool.cc */, + B89E0E701166573700DD08C9 /* macho_dump.cc */, + 4D72CAF413DFBAC2006CABE3 /* md5.cc */, + EB06C7511FEBC515000214D9 /* path_helper.cc */, + EB06C7521FEBC516000214D9 /* path_helper.h */, + 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = dump_syms; + sourceTree = ""; + }; + 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 08FB779EFE84155DC02AAC07 /* Foundation.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + B8C5B5111166531A00D34F4E /* dump_syms */, + B89E0E741166575200DD08C9 /* macho_dump */, + B89E0E9511665A6400DD08C9 /* macho_reader_unittest */, + B88FAF2F116A591E00407530 /* dwarf2reader_cfi_unittest */, + B88FB007116BDE8300407530 /* stabs_reader_unittest */, + B88FB024116BDFFF00407530 /* libgtestmockall.a */, + B88FB0B9116CEABF00407530 /* module_unittest */, + B88FB0DF116CEEA800407530 /* dwarf2diehandler_unittest */, + B88FB0F2116CEF1900407530 /* dwarf_line_to_module_unittest */, + B88FB10A116CF07900407530 /* dwarf_cu_to_module_unittest */, + B88FB11F116CF27F00407530 /* dwarf_cfi_to_module_unittest */, + B88FB135116CF30F00407530 /* bytereader_unittest */, + B88FB14B116CF4A700407530 /* byte_cursor_unittest */, + B84A91F4116CF784006C210E /* stabs_to_module_unittest */, + D21F97D211CBA0F200239E38 /* test_assembler_unittest */, + ); + name = Products; + sourceTree = ""; + }; + B88FAE1C11665FFD00407530 /* MODULE */ = { + isa = PBXGroup; + children = ( + B88FAE1E1166603300407530 /* dwarf_cu_to_module.cc */, + B88FAE1F1166603300407530 /* dwarf_cu_to_module.h */, + B88FB0D6116CEC0600407530 /* dwarf_cu_to_module_unittest.cc */, + B88FAE201166603300407530 /* dwarf_line_to_module.cc */, + B88FAE211166603300407530 /* dwarf_line_to_module.h */, + B88FB0D7116CEC0600407530 /* dwarf_line_to_module_unittest.cc */, + B88FAE221166603300407530 /* language.cc */, + B88FAE231166603300407530 /* language.h */, + B88FAE241166603300407530 /* module.cc */, + B88FAE251166603300407530 /* module.h */, + B88FB0B5116CEA8A00407530 /* module_unittest.cc */, + B88FAE331166673E00407530 /* dwarf_cfi_to_module.cc */, + B88FAE341166673E00407530 /* dwarf_cfi_to_module.h */, + B88FB0D5116CEC0600407530 /* dwarf_cfi_to_module_unittest.cc */, + B88FAE3C11666C8900407530 /* stabs_to_module.cc */, + B88FAE3D11666C8900407530 /* stabs_to_module.h */, + B88FB0D8116CEC0600407530 /* stabs_to_module_unittest.cc */, + ); + name = MODULE; + sourceTree = ""; + }; + B88FAE3811666A1700407530 /* STABS */ = { + isa = PBXGroup; + children = ( + B88FB003116BDE7200407530 /* stabs_reader_unittest.cc */, + B88FAE3911666C6F00407530 /* stabs_reader.cc */, + B88FAE3A11666C6F00407530 /* stabs_reader.h */, + ); + name = STABS; + sourceTree = ""; + }; + B89E0E6C1166569700DD08C9 /* MACHO */ = { + isa = PBXGroup; + children = ( + B89E0E6D1166571D00DD08C9 /* macho_reader_unittest.cc */, + B89E0E6E1166571D00DD08C9 /* macho_reader.cc */, + B89E0E6F1166571D00DD08C9 /* macho_reader.h */, + 557800890BE1F3AB00EC23E0 /* macho_utilities.cc */, + 5578008A0BE1F3AB00EC23E0 /* macho_utilities.h */, + 9BE650430B52F6D800611104 /* macho_id.cc */, + 9BE650440B52F6D800611104 /* macho_id.h */, + 9BE650450B52F6D800611104 /* macho_walker.cc */, + 9BE650460B52F6D800611104 /* macho_walker.h */, + ); + name = MACHO; + sourceTree = ""; + }; + B89E0E9D11665A9500DD08C9 /* TESTING */ = { + isa = PBXGroup; + children = ( + B88FAE0911665B5700407530 /* test_assembler.cc */, + B88FAE0A11665B5700407530 /* test_assembler.h */, + B88FB0D9116CEC0600407530 /* test_assembler_unittest.cc */, + B89E0EA311665AEA00DD08C9 /* gmock-all.cc */, + B89E0E9F11665AC300DD08C9 /* gtest_main.cc */, + B89E0EA011665AC300DD08C9 /* gtest-all.cc */, + ); + name = TESTING; + sourceTree = ""; + }; + F9F5344B0E7C8FFC0012363F /* DWARF */ = { + isa = PBXGroup; + children = ( + B88FAF34116A595400407530 /* cfi_assembler.cc */, + B88FAF35116A595400407530 /* cfi_assembler.h */, + F95B422E0E0E22D100DBDE83 /* dwarf2enums.h */, + F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */, + 4262382521AC496F00E5A3A6 /* dwarf_range_list_handler.cc */, + 4262382621AC496F00E5A3A6 /* dwarf_range_list_handler.h */, + F95B42300E0E22D100DBDE83 /* dwarf2reader.h */, + B88FAF36116A595400407530 /* dwarf2reader_cfi_unittest.cc */, + F95B422D0E0E22D100DBDE83 /* bytereader.h */, + F95B422B0E0E22D100DBDE83 /* bytereader-inl.h */, + F95B422C0E0E22D100DBDE83 /* bytereader.cc */, + B88FB0DA116CEC5800407530 /* bytereader_unittest.cc */, + F95B42310E0E22D100DBDE83 /* line_state_machine.h */, + B88FAE1711665FE400407530 /* dwarf2diehandler.cc */, + B88FAE1811665FE400407530 /* dwarf2diehandler.h */, + B88FB0DB116CEC5800407530 /* dwarf2diehandler_unittest.cc */, + 8BCAAA4A1CE3A7980046090B /* elf_reader.cc */, + 8BCAAA4B1CE3A7980046090B /* elf_reader.h */, + ); + name = DWARF; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + B88FB020116BDFFF00407530 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + B84A91F3116CF784006C210E /* stabs_to_module_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B84A9202116CF7F0006C210E /* Build configuration list for PBXNativeTarget "stabs_to_module_unittest" */; + buildPhases = ( + B84A91F1116CF784006C210E /* Sources */, + B84A91F2116CF784006C210E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B84A91FA116CF796006C210E /* PBXTargetDependency */, + ); + name = stabs_to_module_unittest; + productName = stabs_to_module_unittest; + productReference = B84A91F4116CF784006C210E /* stabs_to_module_unittest */; + productType = "com.apple.product-type.tool"; + }; + B88FAF2E116A591D00407530 /* dwarf2reader_cfi_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B88FAF33116A594800407530 /* Build configuration list for PBXNativeTarget "dwarf2reader_cfi_unittest" */; + buildPhases = ( + B88FAF2C116A591D00407530 /* Sources */, + B88FAF2D116A591D00407530 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B88FB03A116BE17E00407530 /* PBXTargetDependency */, + ); + name = dwarf2reader_cfi_unittest; + productName = dwarf2reader_cfi_unittest; + productReference = B88FAF2F116A591E00407530 /* dwarf2reader_cfi_unittest */; + productType = "com.apple.product-type.tool"; + }; + B88FB006116BDE8300407530 /* stabs_reader_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B88FB013116BDEC800407530 /* Build configuration list for PBXNativeTarget "stabs_reader_unittest" */; + buildPhases = ( + B88FB004116BDE8300407530 /* Sources */, + B88FB005116BDE8300407530 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B88FB088116CE6D800407530 /* PBXTargetDependency */, + ); + name = stabs_reader_unittest; + productName = stabs_reader_unittest; + productReference = B88FB007116BDE8300407530 /* stabs_reader_unittest */; + productType = "com.apple.product-type.tool"; + }; + B88FB023116BDFFF00407530 /* gtestmockall */ = { + isa = PBXNativeTarget; + buildConfigurationList = B88FB027116BE02900407530 /* Build configuration list for PBXNativeTarget "gtestmockall" */; + buildPhases = ( + B88FB020116BDFFF00407530 /* Headers */, + B88FB021116BDFFF00407530 /* Sources */, + B88FB022116BDFFF00407530 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = gtestmockall; + productName = gtestmockall; + productReference = B88FB024116BDFFF00407530 /* libgtestmockall.a */; + productType = "com.apple.product-type.library.static"; + }; + B88FB0B8116CEABF00407530 /* module_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B88FB0BE116CEAFE00407530 /* Build configuration list for PBXNativeTarget "module_unittest" */; + buildPhases = ( + B88FB0B6116CEABF00407530 /* Sources */, + B88FB0B7116CEABF00407530 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B88FB0C0116CEAFE00407530 /* PBXTargetDependency */, + ); + name = module_unittest; + productName = module_unittest; + productReference = B88FB0B9116CEABF00407530 /* module_unittest */; + productType = "com.apple.product-type.tool"; + }; + B88FB0DE116CEEA800407530 /* dwarf2diehandler_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B88FB0E4116CEECE00407530 /* Build configuration list for PBXNativeTarget "dwarf2diehandler_unittest" */; + buildPhases = ( + B88FB0DC116CEEA800407530 /* Sources */, + B88FB0DD116CEEA800407530 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B88FB0E8116CEEDA00407530 /* PBXTargetDependency */, + ); + name = dwarf2diehandler_unittest; + productName = dwarf2diehandler_unittest; + productReference = B88FB0DF116CEEA800407530 /* dwarf2diehandler_unittest */; + productType = "com.apple.product-type.tool"; + }; + B88FB0F1116CEF1900407530 /* dwarf_line_to_module_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B88FB0F9116CEF9800407530 /* Build configuration list for PBXNativeTarget "dwarf_line_to_module_unittest" */; + buildPhases = ( + B88FB0EF116CEF1900407530 /* Sources */, + B88FB0F0116CEF1900407530 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B88FB0F8116CEF2E00407530 /* PBXTargetDependency */, + ); + name = dwarf_line_to_module_unittest; + productName = dwarf_line_to_module_unittest; + productReference = B88FB0F2116CEF1900407530 /* dwarf_line_to_module_unittest */; + productType = "com.apple.product-type.tool"; + }; + B88FB109116CF07900407530 /* dwarf_cu_to_module_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B88FB111116CF0A800407530 /* Build configuration list for PBXNativeTarget "dwarf_cu_to_module_unittest" */; + buildPhases = ( + B88FB107116CF07900407530 /* Sources */, + B88FB108116CF07900407530 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B88FB110116CF08A00407530 /* PBXTargetDependency */, + ); + name = dwarf_cu_to_module_unittest; + productName = dwarf_cu_to_module_unittest; + productReference = B88FB10A116CF07900407530 /* dwarf_cu_to_module_unittest */; + productType = "com.apple.product-type.tool"; + }; + B88FB11E116CF27F00407530 /* dwarf_cfi_to_module_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B88FB128116CF2C800407530 /* Build configuration list for PBXNativeTarget "dwarf_cfi_to_module_unittest" */; + buildPhases = ( + B88FB11C116CF27F00407530 /* Sources */, + B88FB11D116CF27F00407530 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B88FB125116CF29E00407530 /* PBXTargetDependency */, + ); + name = dwarf_cfi_to_module_unittest; + productName = dwarf_cfi_to_module_unittest; + productReference = B88FB11F116CF27F00407530 /* dwarf_cfi_to_module_unittest */; + productType = "com.apple.product-type.tool"; + }; + B88FB134116CF30F00407530 /* bytereader_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B88FB13A116CF33400407530 /* Build configuration list for PBXNativeTarget "bytereader_unittest" */; + buildPhases = ( + B88FB132116CF30F00407530 /* Sources */, + B88FB133116CF30F00407530 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B88FB13C116CF35C00407530 /* PBXTargetDependency */, + ); + name = bytereader_unittest; + productName = bytereader_unittest; + productReference = B88FB135116CF30F00407530 /* bytereader_unittest */; + productType = "com.apple.product-type.tool"; + }; + B88FB14A116CF4A700407530 /* byte_cursor_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B88FB159116CF4F900407530 /* Build configuration list for PBXNativeTarget "byte_cursor_unittest" */; + buildPhases = ( + B88FB148116CF4A700407530 /* Sources */, + B88FB149116CF4A700407530 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B88FB151116CF4C100407530 /* PBXTargetDependency */, + ); + name = byte_cursor_unittest; + productName = byte_cursor_unittest; + productReference = B88FB14B116CF4A700407530 /* byte_cursor_unittest */; + productType = "com.apple.product-type.tool"; + }; + B89E0E731166575200DD08C9 /* macho_dump */ = { + isa = PBXNativeTarget; + buildConfigurationList = B89E0E7F116657A100DD08C9 /* Build configuration list for PBXNativeTarget "macho_dump" */; + buildPhases = ( + B89E0E711166575200DD08C9 /* Sources */, + B89E0E721166575200DD08C9 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = macho_dump; + productName = macho_dump; + productReference = B89E0E741166575200DD08C9 /* macho_dump */; + productType = "com.apple.product-type.tool"; + }; + B89E0E9411665A6400DD08C9 /* macho_reader_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = B89E0E9E11665A9600DD08C9 /* Build configuration list for PBXNativeTarget "macho_reader_unittest" */; + buildPhases = ( + B89E0E9211665A6400DD08C9 /* Sources */, + B89E0E9311665A6400DD08C9 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + B88FB090116CE71000407530 /* PBXTargetDependency */, + ); + name = macho_reader_unittest; + productName = macho_reader_unittest; + productReference = B89E0E9511665A6400DD08C9 /* macho_reader_unittest */; + productType = "com.apple.product-type.tool"; + }; + B8C5B5101166531A00D34F4E /* dump_syms */ = { + isa = PBXNativeTarget; + buildConfigurationList = B8C5B5151166533900D34F4E /* Build configuration list for PBXNativeTarget "dump_syms" */; + buildPhases = ( + B8C5B50E1166531A00D34F4E /* Sources */, + B8C5B50F1166531A00D34F4E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = dump_syms; + productName = dump_syms; + productReference = B8C5B5111166531A00D34F4E /* dump_syms */; + productType = "com.apple.product-type.tool"; + }; + D21F97D111CBA0F200239E38 /* test_assembler_unittest */ = { + isa = PBXNativeTarget; + buildConfigurationList = D21F97D611CBA11000239E38 /* Build configuration list for PBXNativeTarget "test_assembler_unittest" */; + buildPhases = ( + D21F97CF11CBA0F200239E38 /* Sources */, + D21F97D011CBA0F200239E38 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = test_assembler_unittest; + productName = test_assembler_unittest; + productReference = D21F97D211CBA0F200239E38 /* test_assembler_unittest */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + }; + buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "dump_syms" */; + compatibilityVersion = "Xcode 3.1"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* dump_syms */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + B8C5B5101166531A00D34F4E /* dump_syms */, + B89E0E731166575200DD08C9 /* macho_dump */, + B88FB023116BDFFF00407530 /* gtestmockall */, + B88FB14A116CF4A700407530 /* byte_cursor_unittest */, + B89E0E9411665A6400DD08C9 /* macho_reader_unittest */, + B88FB006116BDE8300407530 /* stabs_reader_unittest */, + B88FB134116CF30F00407530 /* bytereader_unittest */, + B88FAF2E116A591D00407530 /* dwarf2reader_cfi_unittest */, + B88FB0DE116CEEA800407530 /* dwarf2diehandler_unittest */, + B88FB109116CF07900407530 /* dwarf_cu_to_module_unittest */, + B88FB0F1116CEF1900407530 /* dwarf_line_to_module_unittest */, + B88FB11E116CF27F00407530 /* dwarf_cfi_to_module_unittest */, + B84A91F3116CF784006C210E /* stabs_to_module_unittest */, + B88FB0B8116CEABF00407530 /* module_unittest */, + B88FAFC9116BDCAD00407530 /* all_unittests */, + D21F97D111CBA0F200239E38 /* test_assembler_unittest */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + B88FB094116CE73E00407530 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -eu\n\ncd $BUILT_PRODUCTS_DIR\npwd\n\n./byte_cursor_unittest\n./macho_reader_unittest\n./stabs_reader_unittest\n./bytereader_unittest\n./dwarf2reader_cfi_unittest\n./dwarf2diehandler_unittest\n./dwarf_cu_to_module_unittest\n./dwarf_line_to_module_unittest\n./dwarf_cfi_to_module_unittest\n./stabs_to_module_unittest\n./module_unittest\n./test_assembler_unittest\n\necho \"Expect two warnings from the following tests:\"\necho \" Errors.BadFileNumber\"\necho \" Errors.BadDirectoryNumber\"\necho \"The proper behavior of these tests is to print text that XCode confuses with compiler warnings.\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + B84A91F1116CF784006C210E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B84A91FB116CF7AF006C210E /* module.cc in Sources */, + B84A91FC116CF7AF006C210E /* stabs_to_module.cc in Sources */, + B84A91FD116CF7AF006C210E /* stabs_to_module_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FAF2C116A591D00407530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FAF38116A595400407530 /* dwarf2reader_cfi_unittest.cc in Sources */, + B88FAF3F116A5A2E00407530 /* dwarf2reader.cc in Sources */, + 8BCAAA4D1CE3B1260046090B /* elf_reader.cc in Sources */, + B88FAF40116A5A2E00407530 /* bytereader.cc in Sources */, + B88FAF37116A595400407530 /* cfi_assembler.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB004116BDE8300407530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB00F116BDEA700407530 /* stabs_reader_unittest.cc in Sources */, + B88FB010116BDEA700407530 /* stabs_reader.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB021116BDFFF00407530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB028116BE03100407530 /* test_assembler.cc in Sources */, + B88FB029116BE03100407530 /* gmock-all.cc in Sources */, + B88FB02A116BE03100407530 /* gtest_main.cc in Sources */, + B88FB02B116BE03100407530 /* gtest-all.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB0B6116CEABF00407530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB0BD116CEAE000407530 /* module_unittest.cc in Sources */, + B88FB0C4116CEB4100407530 /* module.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB0DC116CEEA800407530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB0E5116CEED300407530 /* dwarf2diehandler.cc in Sources */, + B88FB0E6116CEED300407530 /* dwarf2diehandler_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB0EF116CEF1900407530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB0FA116CF00E00407530 /* dwarf_line_to_module.cc in Sources */, + B88FB0FE116CF02400407530 /* module.cc in Sources */, + B88FB0FB116CF00E00407530 /* dwarf_line_to_module_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB107116CF07900407530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB112116CF1F000407530 /* dwarf_cu_to_module.cc in Sources */, + B88FB113116CF1F000407530 /* dwarf_cu_to_module_unittest.cc in Sources */, + B88FB114116CF1F000407530 /* language.cc in Sources */, + B88FB115116CF1F000407530 /* module.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB11C116CF27F00407530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB129116CF2DD00407530 /* module.cc in Sources */, + B88FB12A116CF2DD00407530 /* dwarf_cfi_to_module.cc in Sources */, + B88FB12B116CF2DD00407530 /* dwarf_cfi_to_module_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB132116CF30F00407530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB13D116CF38300407530 /* cfi_assembler.cc in Sources */, + B88FB13E116CF38300407530 /* bytereader.cc in Sources */, + B88FB13F116CF38300407530 /* bytereader_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B88FB148116CF4A700407530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B88FB152116CF4D300407530 /* byte_cursor_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B89E0E711166575200DD08C9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4247E63D2110D4B200482558 /* path_helper.cc in Sources */, + 162F6500161C5F2200CD68D5 /* arch_utilities.cc in Sources */, + B89E0E781166576C00DD08C9 /* macho_reader.cc in Sources */, + B89E0E7A1166576C00DD08C9 /* macho_dump.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B89E0E9211665A6400DD08C9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B89E0E9911665A7200DD08C9 /* macho_reader_unittest.cc in Sources */, + B89E0E9A11665A7200DD08C9 /* macho_reader.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B8C5B50E1166531A00D34F4E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4262382821AC49A000E5A3A6 /* dwarf_range_list_handler.h in Sources */, + 162F64FA161C591500CD68D5 /* arch_utilities.cc in Sources */, + B88FAE2C1166606200407530 /* macho_reader.cc in Sources */, + 8BCAAA4C1CE3A7980046090B /* elf_reader.cc in Sources */, + B8C5B5171166534700D34F4E /* dwarf2reader.cc in Sources */, + EB06C7531FEBC516000214D9 /* path_helper.cc in Sources */, + B8C5B5181166534700D34F4E /* bytereader.cc in Sources */, + B8C5B5191166534700D34F4E /* macho_utilities.cc in Sources */, + B8C5B51A1166534700D34F4E /* file_id.cc in Sources */, + B8C5B51B1166534700D34F4E /* macho_id.cc in Sources */, + B8C5B51C1166534700D34F4E /* macho_walker.cc in Sources */, + B8C5B51D1166534700D34F4E /* dump_syms.cc in Sources */, + B8C5B51E1166534700D34F4E /* dump_syms_tool.cc in Sources */, + B88FAE1911665FE400407530 /* dwarf2diehandler.cc in Sources */, + B88FAE261166603300407530 /* dwarf_cu_to_module.cc in Sources */, + B88FAE271166603300407530 /* dwarf_line_to_module.cc in Sources */, + 4262382721AC496F00E5A3A6 /* dwarf_range_list_handler.cc in Sources */, + B88FAE281166603300407530 /* language.cc in Sources */, + B88FAE291166603300407530 /* module.cc in Sources */, + B88FAE351166673E00407530 /* dwarf_cfi_to_module.cc in Sources */, + B88FAE3B11666C6F00407530 /* stabs_reader.cc in Sources */, + B88FAE3E11666C8900407530 /* stabs_to_module.cc in Sources */, + 4D72CAF513DFBAC2006CABE3 /* md5.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D21F97CF11CBA0F200239E38 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D21F97E911CBA1FF00239E38 /* test_assembler.cc in Sources */, + D21F97D711CBA12300239E38 /* test_assembler_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 8B31051511F100CF00FCF3E4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = D21F97D111CBA0F200239E38 /* test_assembler_unittest */; + targetProxy = 8B31051411F100CF00FCF3E4 /* PBXContainerItemProxy */; + }; + B84A91FA116CF796006C210E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B84A91F9116CF796006C210E /* PBXContainerItemProxy */; + }; + B84A9201116CF7D2006C210E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B84A91F3116CF784006C210E /* stabs_to_module_unittest */; + targetProxy = B84A9200116CF7D2006C210E /* PBXContainerItemProxy */; + }; + B88FAFCF116BDD7000407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B89E0E9411665A6400DD08C9 /* macho_reader_unittest */; + targetProxy = B88FAFCE116BDD7000407530 /* PBXContainerItemProxy */; + }; + B88FAFD1116BDD7000407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FAF2E116A591D00407530 /* dwarf2reader_cfi_unittest */; + targetProxy = B88FAFD0116BDD7000407530 /* PBXContainerItemProxy */; + }; + B88FB01D116BDF9800407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB006116BDE8300407530 /* stabs_reader_unittest */; + targetProxy = B88FB01C116BDF9800407530 /* PBXContainerItemProxy */; + }; + B88FB03A116BE17E00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B88FB039116BE17E00407530 /* PBXContainerItemProxy */; + }; + B88FB088116CE6D800407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B88FB087116CE6D800407530 /* PBXContainerItemProxy */; + }; + B88FB090116CE71000407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B88FB08F116CE71000407530 /* PBXContainerItemProxy */; + }; + B88FB0C0116CEAFE00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B88FB0BF116CEAFE00407530 /* PBXContainerItemProxy */; + }; + B88FB0C8116CEB4A00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB0B8116CEABF00407530 /* module_unittest */; + targetProxy = B88FB0C7116CEB4A00407530 /* PBXContainerItemProxy */; + }; + B88FB0E8116CEEDA00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B88FB0E7116CEEDA00407530 /* PBXContainerItemProxy */; + }; + B88FB0F8116CEF2E00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B88FB0F7116CEF2E00407530 /* PBXContainerItemProxy */; + }; + B88FB110116CF08A00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B88FB10F116CF08A00407530 /* PBXContainerItemProxy */; + }; + B88FB125116CF29E00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B88FB124116CF29E00407530 /* PBXContainerItemProxy */; + }; + B88FB13C116CF35C00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B88FB13B116CF35C00407530 /* PBXContainerItemProxy */; + }; + B88FB151116CF4C100407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB023116BDFFF00407530 /* gtestmockall */; + targetProxy = B88FB150116CF4C100407530 /* PBXContainerItemProxy */; + }; + B88FB15B116CF53E00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB14A116CF4A700407530 /* byte_cursor_unittest */; + targetProxy = B88FB15A116CF53E00407530 /* PBXContainerItemProxy */; + }; + B88FB15D116CF54B00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB11E116CF27F00407530 /* dwarf_cfi_to_module_unittest */; + targetProxy = B88FB15C116CF54B00407530 /* PBXContainerItemProxy */; + }; + B88FB15F116CF54B00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB0F1116CEF1900407530 /* dwarf_line_to_module_unittest */; + targetProxy = B88FB15E116CF54B00407530 /* PBXContainerItemProxy */; + }; + B88FB161116CF54B00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB109116CF07900407530 /* dwarf_cu_to_module_unittest */; + targetProxy = B88FB160116CF54B00407530 /* PBXContainerItemProxy */; + }; + B88FB165116CF54B00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB0DE116CEEA800407530 /* dwarf2diehandler_unittest */; + targetProxy = B88FB164116CF54B00407530 /* PBXContainerItemProxy */; + }; + B88FB167116CF54B00407530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B88FB134116CF30F00407530 /* bytereader_unittest */; + targetProxy = B88FB166116CF54B00407530 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 1DEB927908733DD40010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8B3102D411F0D60300FCF3E4 /* BreakpadDebug.xcconfig */; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + HEADER_SEARCH_PATHS = ( + ../../.., + ../../../common/mac/include/, + ../../../third_party/musl/include/, + ); + }; + name = Debug; + }; + 1DEB927A08733DD40010E9CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8B3102D511F0D60300FCF3E4 /* BreakpadRelease.xcconfig */; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + HEADER_SEARCH_PATHS = ( + ../../.., + ../../../common/mac/include/, + ../../../third_party/musl/include/, + ); + }; + name = Release; + }; + B84A91F6116CF784006C210E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = stabs_to_module_unittest; + }; + name = Debug; + }; + B84A91F7116CF784006C210E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = stabs_to_module_unittest; + }; + name = Release; + }; + B88FAF31116A591F00407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", + ); + LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/build/Debug\""; + PRODUCT_NAME = dwarf2reader_cfi_unittest; + }; + name = Debug; + }; + B88FAF32116A591F00407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", + ); + LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/build/Debug\""; + PRODUCT_NAME = dwarf2reader_cfi_unittest; + }; + name = Release; + }; + B88FAFCA116BDCAD00407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = all_unittests; + }; + name = Debug; + }; + B88FAFCB116BDCAD00407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = all_unittests; + }; + name = Release; + }; + B88FB009116BDE8400407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = HAVE_MACH_O_NLIST_H; + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = stabs_reader_unittest; + }; + name = Debug; + }; + B88FB00A116BDE8400407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = HAVE_MACH_O_NLIST_H; + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = stabs_reader_unittest; + }; + name = Release; + }; + B88FB025116BE00100407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = gtestmockall; + }; + name = Debug; + }; + B88FB026116BE00100407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = gtestmockall; + }; + name = Release; + }; + B88FB0BB116CEAC000407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = module_unittest; + }; + name = Debug; + }; + B88FB0BC116CEAC000407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = module_unittest; + }; + name = Release; + }; + B88FB0E1116CEEA800407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = dwarf2diehandler_unittest; + }; + name = Debug; + }; + B88FB0E2116CEEA800407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = dwarf2diehandler_unittest; + }; + name = Release; + }; + B88FB0F4116CEF1900407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = dwarf_line_to_module_unittest; + }; + name = Debug; + }; + B88FB0F5116CEF1900407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = dwarf_line_to_module_unittest; + }; + name = Release; + }; + B88FB10C116CF07A00407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = dwarf_cu_to_module_unittest; + }; + name = Debug; + }; + B88FB10D116CF07A00407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = dwarf_cu_to_module_unittest; + }; + name = Release; + }; + B88FB121116CF28000407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = dwarf_cfi_to_module_unittest; + }; + name = Debug; + }; + B88FB122116CF28000407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = dwarf_cfi_to_module_unittest; + }; + name = Release; + }; + B88FB137116CF30F00407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = bytereader_unittest; + }; + name = Debug; + }; + B88FB138116CF30F00407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ); + PRODUCT_NAME = bytereader_unittest; + }; + name = Release; + }; + B88FB14D116CF4A800407530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ); + PRODUCT_NAME = byte_cursor_unittest; + }; + name = Debug; + }; + B88FB14E116CF4A800407530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ); + PRODUCT_NAME = byte_cursor_unittest; + }; + name = Release; + }; + B89E0E761166575300DD08C9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = macho_dump; + }; + name = Debug; + }; + B89E0E771166575300DD08C9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = macho_dump; + }; + name = Release; + }; + B89E0E9711665A6400DD08C9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ); + PRODUCT_NAME = macho_reader_unittest; + }; + name = Debug; + }; + B89E0E9811665A6400DD08C9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ); + PRODUCT_NAME = macho_reader_unittest; + }; + name = Release; + }; + B8C5B5131166531B00D34F4E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = HAVE_MACH_O_NLIST_H; + GCC_VERSION = ""; + PRODUCT_NAME = dump_syms; + }; + name = Debug; + }; + B8C5B5141166531B00D34F4E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS = HAVE_MACH_O_NLIST_H; + GCC_VERSION = ""; + PRODUCT_NAME = dump_syms; + }; + name = Release; + }; + D21F97D411CBA0F200239E38 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ); + PRODUCT_NAME = test_assembler_unittest; + }; + name = Debug; + }; + D21F97D511CBA0F200239E38 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ( + $inherited, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ); + PRODUCT_NAME = test_assembler_unittest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "dump_syms" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB927908733DD40010E9CD /* Debug */, + 1DEB927A08733DD40010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B84A9202116CF7F0006C210E /* Build configuration list for PBXNativeTarget "stabs_to_module_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B84A91F6116CF784006C210E /* Debug */, + B84A91F7116CF784006C210E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FAF33116A594800407530 /* Build configuration list for PBXNativeTarget "dwarf2reader_cfi_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FAF31116A591F00407530 /* Debug */, + B88FAF32116A591F00407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FAFCC116BDCCC00407530 /* Build configuration list for PBXAggregateTarget "all_unittests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FAFCA116BDCAD00407530 /* Debug */, + B88FAFCB116BDCAD00407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FB013116BDEC800407530 /* Build configuration list for PBXNativeTarget "stabs_reader_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FB009116BDE8400407530 /* Debug */, + B88FB00A116BDE8400407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FB027116BE02900407530 /* Build configuration list for PBXNativeTarget "gtestmockall" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FB025116BE00100407530 /* Debug */, + B88FB026116BE00100407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FB0BE116CEAFE00407530 /* Build configuration list for PBXNativeTarget "module_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FB0BB116CEAC000407530 /* Debug */, + B88FB0BC116CEAC000407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FB0E4116CEECE00407530 /* Build configuration list for PBXNativeTarget "dwarf2diehandler_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FB0E1116CEEA800407530 /* Debug */, + B88FB0E2116CEEA800407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FB0F9116CEF9800407530 /* Build configuration list for PBXNativeTarget "dwarf_line_to_module_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FB0F4116CEF1900407530 /* Debug */, + B88FB0F5116CEF1900407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FB111116CF0A800407530 /* Build configuration list for PBXNativeTarget "dwarf_cu_to_module_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FB10C116CF07A00407530 /* Debug */, + B88FB10D116CF07A00407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FB128116CF2C800407530 /* Build configuration list for PBXNativeTarget "dwarf_cfi_to_module_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FB121116CF28000407530 /* Debug */, + B88FB122116CF28000407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FB13A116CF33400407530 /* Build configuration list for PBXNativeTarget "bytereader_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FB137116CF30F00407530 /* Debug */, + B88FB138116CF30F00407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B88FB159116CF4F900407530 /* Build configuration list for PBXNativeTarget "byte_cursor_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B88FB14D116CF4A800407530 /* Debug */, + B88FB14E116CF4A800407530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B89E0E7F116657A100DD08C9 /* Build configuration list for PBXNativeTarget "macho_dump" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B89E0E761166575300DD08C9 /* Debug */, + B89E0E771166575300DD08C9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B89E0E9E11665A9600DD08C9 /* Build configuration list for PBXNativeTarget "macho_reader_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B89E0E9711665A6400DD08C9 /* Debug */, + B89E0E9811665A6400DD08C9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B8C5B5151166533900D34F4E /* Build configuration list for PBXNativeTarget "dump_syms" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B8C5B5131166531B00D34F4E /* Debug */, + B8C5B5141166531B00D34F4E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D21F97D611CBA11000239E38 /* Build configuration list for PBXNativeTarget "test_assembler_unittest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D21F97D411CBA0F200239E38 /* Debug */, + D21F97D511CBA0F200239E38 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/src/tools/mac/dump_syms/dump_syms_tool.cc b/src/tools/mac/dump_syms/dump_syms_tool.cc new file mode 100644 index 0000000..9fb8d13 --- /dev/null +++ b/src/tools/mac/dump_syms/dump_syms_tool.cc @@ -0,0 +1,340 @@ +// -*- mode: c++ -*- + +// Copyright 2011 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// dump_syms_tool.cc: Command line tool that uses the DumpSymbols class. +// TODO(waylonis): accept stdin + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include +#include +#include +#include + +#include "common/mac/dump_syms.h" +#include "common/mac/arch_utilities.h" +#include "common/mac/macho_utilities.h" +#include "common/scoped_ptr.h" + +using google_breakpad::DumpSymbols; +using google_breakpad::Module; +using google_breakpad::scoped_ptr; +using std::vector; + +struct Options { + Options() + : srcPath(), + dsymPath(), + arch(), + header_only(false), + cfi(true), + handle_inter_cu_refs(true), + handle_inlines(false), + enable_multiple(false), + module_name(), + prefer_extern_name(false) {} + + string srcPath; + string dsymPath; + std::optional arch; + bool header_only; + bool cfi; + bool handle_inter_cu_refs; + bool handle_inlines; + bool enable_multiple; + string module_name; + bool prefer_extern_name; +}; + +static bool StackFrameEntryComparator(const Module::StackFrameEntry* a, + const Module::StackFrameEntry* b) { + return a->address < b->address; +} + +// Copy the CFI data from |from_module| into |to_module|, for any non- +// overlapping ranges. +static void CopyCFIDataBetweenModules(Module* to_module, + const Module* from_module) { + typedef vector::const_iterator Iterator; + + // Get the CFI data from both the source and destination modules and ensure + // it is sorted by start address. + vector from_data; + from_module->GetStackFrameEntries(&from_data); + std::sort(from_data.begin(), from_data.end(), &StackFrameEntryComparator); + + vector to_data; + to_module->GetStackFrameEntries(&to_data); + std::sort(to_data.begin(), to_data.end(), &StackFrameEntryComparator); + + Iterator to_it = to_data.begin(); + + for (Iterator it = from_data.begin(); it != from_data.end(); ++it) { + Module::StackFrameEntry* from_entry = *it; + Module::Address from_entry_end = from_entry->address + from_entry->size; + + // Find the first CFI record in the |to_module| that does not have an + // address less than the entry to be copied. + while (to_it != to_data.end()) { + if (from_entry->address > (*to_it)->address) + ++to_it; + else + break; + } + + // If the entry does not overlap, then it is safe to copy to |to_module|. + if (to_it == to_data.end() || (from_entry->address < (*to_it)->address && + from_entry_end < (*to_it)->address)) { + to_module->AddStackFrameEntry( + std::make_unique(*from_entry)); + } + } +} + +static bool SetArchitecture(DumpSymbols& dump_symbols, + const ArchInfo& arch, + const std::string& filename) { + if (!dump_symbols.SetArchitecture(arch)) { + fprintf(stderr, "%s: no architecture '%s' is present in file.\n", + filename.c_str(), + GetNameFromCPUType(arch.cputype, arch.cpusubtype)); + size_t available_size; + const SuperFatArch* available = + dump_symbols.AvailableArchitectures(&available_size); + if (available_size == 1) + fprintf(stderr, "the file's architecture is: "); + else + fprintf(stderr, "architectures present in the file are:\n"); + for (size_t i = 0; i < available_size; i++) { + const SuperFatArch* arch = &available[i]; + fprintf(stderr, "%s\n", + GetNameFromCPUType(arch->cputype, arch->cpusubtype)); + } + return false; + } + return true; +} + +static bool Start(const Options& options) { + SymbolData symbol_data = + (options.handle_inlines ? INLINES : NO_DATA) | + (options.cfi ? CFI : NO_DATA) | SYMBOLS_AND_FILES; + DumpSymbols dump_symbols(symbol_data, options.handle_inter_cu_refs, + options.enable_multiple, options.module_name, + options.prefer_extern_name); + + // For x86_64 binaries, the CFI data is in the __TEXT,__eh_frame of the + // Mach-O file, which is not copied into the dSYM. Whereas in i386, the CFI + // data is in the __DWARF,__debug_frame section, which is moved into the + // dSYM. Therefore, to get x86_64 CFI data, dump_syms needs to look at both + // the dSYM and the Mach-O file. If both paths are present and CFI was + // requested, then consider the Module as "split" and dump all the debug data + // from the primary debug info file, the dSYM, and then dump additional CFI + // data from the source Mach-O file. + bool split_module = + !options.dsymPath.empty() && !options.srcPath.empty() && options.cfi; + const string& primary_file = + split_module ? options.dsymPath : options.srcPath; + + if (!dump_symbols.Read(primary_file)) + return false; + + if (options.arch && + !SetArchitecture(dump_symbols, *options.arch, primary_file)) { + return false; + } + + if (options.header_only) + return dump_symbols.WriteSymbolFileHeader(std::cout); + + // Read the primary file into a Breakpad Module. + Module* module = NULL; + if (!dump_symbols.ReadSymbolData(&module)) + return false; + scoped_ptr scoped_module(module); + + // If this is a split module, read the secondary Mach-O file, from which the + // CFI data will be extracted. + if (split_module && primary_file == options.dsymPath) { + if (!dump_symbols.Read(options.srcPath)) + return false; + + if (options.arch && + !SetArchitecture(dump_symbols, *options.arch, options.srcPath)) { + return false; + } + Module* cfi_module = NULL; + if (!dump_symbols.ReadSymbolData(&cfi_module)) + return false; + scoped_ptr scoped_cfi_module(cfi_module); + + bool name_matches; + if (!options.module_name.empty()) { + // Ignore the basename of the dSYM and binary and use the passed-in module + // name. + name_matches = true; + } else { + name_matches = cfi_module->name() == module->name(); + } + + // Ensure that the modules are for the same debug code file. + if (!name_matches || cfi_module->os() != module->os() || + cfi_module->architecture() != module->architecture() || + cfi_module->identifier() != module->identifier()) { + fprintf(stderr, "Cannot generate a symbol file from split sources that do" + " not match.\n"); + if (!name_matches) { + fprintf(stderr, "Name mismatch: binary=[%s], dSYM=[%s]\n", + cfi_module->name().c_str(), module->name().c_str()); + } + if (cfi_module->os() != module->os()) { + fprintf(stderr, "OS mismatch: binary=[%s], dSYM=[%s]\n", + cfi_module->os().c_str(), module->os().c_str()); + } + if (cfi_module->architecture() != module->architecture()) { + fprintf(stderr, "Architecture mismatch: binary=[%s], dSYM=[%s]\n", + cfi_module->architecture().c_str(), + module->architecture().c_str()); + } + if (cfi_module->identifier() != module->identifier()) { + fprintf(stderr, "Identifier mismatch: binary=[%s], dSYM=[%s]\n", + cfi_module->identifier().c_str(), module->identifier().c_str()); + } + return false; + } + + CopyCFIDataBetweenModules(module, cfi_module); + } + + return module->Write(std::cout, symbol_data); +} + +//============================================================================= +static void Usage(int argc, const char *argv[]) { + fprintf(stderr, "Output a Breakpad symbol file from a Mach-o file.\n"); + fprintf(stderr, + "Usage: %s [-a ARCHITECTURE] [-c] [-g dSYM path] " + "[-n MODULE] [-x] \n", + argv[0]); + fprintf(stderr, "\t-i: Output module header information only.\n"); + fprintf(stderr, "\t-a: Architecture type [default: native, or whatever is\n"); + fprintf(stderr, "\t in the file, if it contains only one architecture]\n"); + fprintf(stderr, "\t-g: Debug symbol file (dSYM) to dump in addition to the " + "Mach-o file\n"); + fprintf(stderr, "\t-c: Do not generate CFI section\n"); + fprintf(stderr, "\t-r: Do not handle inter-compilation unit references\n"); + fprintf(stderr, "\t-d: Generate INLINE and INLINE_ORIGIN records\n"); + fprintf(stderr, + "\t-m: Enable writing the optional 'm' field on FUNC " + "and PUBLIC, denoting multiple symbols for the address.\n"); + fprintf(stderr, + "\t-n: Use MODULE as the name of the module rather than \n" + "the basename of the Mach-O file/dSYM.\n"); + fprintf(stderr, + "\t-x: Prefer the PUBLIC (extern) name over the FUNC if\n" + "they do not match.\n"); + fprintf(stderr, "\t-h: Usage\n"); + fprintf(stderr, "\t-?: Usage\n"); +} + +//============================================================================= +static void SetupOptions(int argc, const char *argv[], Options *options) { + extern int optind; + signed char ch; + + while ((ch = getopt(argc, (char* const*)argv, "ia:g:crdm?hn:x")) != -1) { + switch (ch) { + case 'i': + options->header_only = true; + break; + case 'a': { + std::optional arch_info = GetArchInfoFromName(optarg); + if (!arch_info) { + fprintf(stderr, "%s: Invalid architecture: %s\n", argv[0], optarg); + Usage(argc, argv); + exit(1); + } + options->arch = arch_info; + break; + } + case 'g': + options->dsymPath = optarg; + break; + case 'c': + options->cfi = false; + break; + case 'r': + options->handle_inter_cu_refs = false; + break; + case 'd': + options->handle_inlines = true; + break; + case 'm': + options->enable_multiple = true; + break; + case 'n': + options->module_name = optarg; + break; + case 'x': + options->prefer_extern_name = true; + break; + case '?': + case 'h': + Usage(argc, argv); + exit(0); + break; + } + } + + if ((argc - optind) != 1) { + fprintf(stderr, "Must specify Mach-o file\n"); + Usage(argc, argv); + exit(1); + } + + options->srcPath = argv[optind]; +} + +//============================================================================= +int main (int argc, const char * argv[]) { + Options options; + bool result; + + SetupOptions(argc, argv, &options); + result = Start(options); + + return !result; +} diff --git a/src/tools/mac/symupload/symupload.mm b/src/tools/mac/symupload/symupload.mm new file mode 100644 index 0000000..521b811 --- /dev/null +++ b/src/tools/mac/symupload/symupload.mm @@ -0,0 +1,474 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// symupload.mm: Upload a symbol file to a HTTP server. The upload is sent as +// a multipart/form-data POST request with the following parameters: +// code_file: the basename of the module, e.g. "app" +// debug_file: the basename of the debugging file, e.g. "app" +// debug_identifier: the debug file's identifier, usually consisting of +// the guid and age embedded in the pdb, e.g. +// "11111111BBBB3333DDDD555555555555F" +// os: the operating system that the module was built for +// cpu: the CPU that the module was built for (x86 or ppc) +// symbol_file: the contents of the breakpad-format symbol file + +#include +#include +#include + +#include + +#include "HTTPMultipartUpload.h" +#include "HTTPPutRequest.h" +#include "SymbolCollectorClient.h" +#include "common/mac/dump_syms.h" + +using google_breakpad::DumpSymbols; + +NSString* const kBreakpadSymbolType = @"BREAKPAD"; +NSString* const kMachOSymbolType = @"MACHO"; +NSString* const kDSYMSymbolType = @"DSYM"; + +typedef enum { kSymUploadProtocolV1, kSymUploadProtocolV2 } SymUploadProtocol; + +typedef enum { + kResultSuccess = 0, + kResultFailure = 1, + kResultAlreadyExists = 2 +} Result; + +typedef struct { + NSString* symbolsPath; + NSString* uploadURLStr; + SymUploadProtocol symUploadProtocol; + NSString* apiKey; + BOOL force; + Result result; + NSString* type; + NSString* codeFile; + NSString* debugID; + NSString* productName; +} Options; + +//============================================================================= +static NSArray* ModuleDataForSymbolFile(NSString* file) { + NSFileHandle* fh = [NSFileHandle fileHandleForReadingAtPath:file]; + NSData* data = [fh readDataOfLength:1024]; + NSString* str = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + NSScanner* scanner = [NSScanner scannerWithString:str]; + NSString* line; + NSMutableArray* parts = nil; + const int MODULE_ID_INDEX = 3; + + if ([scanner scanUpToString:@"\n" intoString:&line]) { + parts = [[NSMutableArray alloc] init]; + NSScanner* moduleInfoScanner = [NSScanner scannerWithString:line]; + NSString* moduleInfo; + // Get everything BEFORE the module name. None of these properties + // can have spaces. + for (int i = 0; i <= MODULE_ID_INDEX; i++) { + [moduleInfoScanner scanUpToString:@" " intoString:&moduleInfo]; + [parts addObject:moduleInfo]; + } + + // Now get the module name. This can have a space so we scan to + // the end of the line. + [moduleInfoScanner scanUpToString:@"\n" intoString:&moduleInfo]; + [parts addObject:moduleInfo]; + } + + [str release]; + + return parts; +} + +//============================================================================= +static void StartSymUploadProtocolV1(Options* options, + NSString* OS, + NSString* CPU, + NSString* debugID, + NSString* debugFile) { + NSURL* url = [NSURL URLWithString:options->uploadURLStr]; + HTTPMultipartUpload* ul = [[HTTPMultipartUpload alloc] initWithURL:url]; + NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; + + // Add parameters + [parameters setObject:debugID forKey:@"debug_identifier"]; + [parameters setObject:OS forKey:@"os"]; + [parameters setObject:CPU forKey:@"cpu"]; + [parameters setObject:debugFile forKey:@"debug_file"]; + [parameters setObject:debugFile forKey:@"code_file"]; + [ul setParameters:parameters]; + + NSArray* keys = [parameters allKeys]; + int count = [keys count]; + for (int i = 0; i < count; ++i) { + NSString* key = [keys objectAtIndex:i]; + NSString* value = [parameters objectForKey:key]; + fprintf(stdout, "'%s' = '%s'\n", [key UTF8String], [value UTF8String]); + } + + // Add file + [ul addFileAtPath:options->symbolsPath name:@"symbol_file"]; + + // Send it + NSError* error = nil; + NSData* data = [ul send:&error]; + NSString* result = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + int status = [[ul response] statusCode]; + + fprintf(stdout, "Send: %s\n", + error ? [[error description] UTF8String] : "No Error"); + fprintf(stdout, "Response: %d\n", status); + fprintf(stdout, "Result: %lu bytes\n%s\n", (unsigned long)[data length], + [result UTF8String]); + + [result release]; + [ul release]; + options->result = (!error && status == 200) ? kResultSuccess : kResultFailure; +} + +//============================================================================= +static void StartSymUploadProtocolV2(Options* options, + NSString* debugID, + NSString* debugFile) { + options->result = kResultFailure; + + // Only check status of BREAKPAD symbols, because the v2 protocol doesn't + // (yet) have a way to check status of other symbol types. + if (!options->force && [options->type isEqualToString:kBreakpadSymbolType]) { + SymbolStatus symbolStatus = + [SymbolCollectorClient checkSymbolStatusOnServer:options->uploadURLStr + withAPIKey:options->apiKey + withDebugFile:debugFile + withDebugID:debugID]; + if (symbolStatus == SymbolStatusFound) { + fprintf(stdout, "Symbol file already exists, upload aborted." + " Use \"-f\" to overwrite.\n"); + options->result = kResultAlreadyExists; + return; + } else if (symbolStatus == SymbolStatusUnknown) { + fprintf(stdout, "Failed to get check for existing symbol.\n"); + return; + } + } + + UploadURLResponse* URLResponse = + [SymbolCollectorClient createUploadURLOnServer:options->uploadURLStr + withAPIKey:options->apiKey]; + if (URLResponse == nil) { + return; + } + + NSURL* uploadURL = [NSURL URLWithString:[URLResponse uploadURL]]; + HTTPPutRequest* putRequest = [[HTTPPutRequest alloc] initWithURL:uploadURL]; + [putRequest setFile:options->symbolsPath]; + + NSError* error = nil; + NSData* data = [putRequest send:&error]; + NSString* result = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + int responseCode = [[putRequest response] statusCode]; + [putRequest release]; + + if (error || responseCode != 200) { + fprintf(stdout, "Failed to upload symbol file.\n"); + fprintf(stdout, "Response code: %d\n", responseCode); + fprintf(stdout, "Response:\n"); + fprintf(stdout, "%s\n", [result UTF8String]); + return; + } + + CompleteUploadResult completeUploadResult = + [SymbolCollectorClient completeUploadOnServer:options->uploadURLStr + withAPIKey:options->apiKey + withUploadKey:[URLResponse uploadKey] + withDebugFile:debugFile + withDebugID:debugID + withType:options->type + withProductName:options->productName]; + [URLResponse release]; + if (completeUploadResult == CompleteUploadResultError) { + fprintf(stdout, "Failed to complete upload.\n"); + return; + } else if (completeUploadResult == CompleteUploadResultDuplicateData) { + fprintf(stdout, "Uploaded file checksum matched existing file checksum," + " no change necessary.\n"); + } else { + fprintf(stdout, "Successfully sent the symbol file.\n"); + } + options->result = kResultSuccess; +} + +//============================================================================= +static void Start(Options* options) { + // If non-BREAKPAD upload special-case. + if (![options->type isEqualToString:kBreakpadSymbolType]) { + StartSymUploadProtocolV2(options, options->debugID, options->codeFile); + return; + } + + NSArray* moduleParts = ModuleDataForSymbolFile(options->symbolsPath); + // MODULE + // 0 1 2 3 4 + NSString* OS = [moduleParts objectAtIndex:1]; + NSString* CPU = [moduleParts objectAtIndex:2]; + NSMutableString* debugID = + [NSMutableString stringWithString:[moduleParts objectAtIndex:3]]; + [debugID replaceOccurrencesOfString:@"-" + withString:@"" + options:0 + range:NSMakeRange(0, [debugID length])]; + NSString* debugFile = [moduleParts objectAtIndex:4]; + + if (options->symUploadProtocol == kSymUploadProtocolV1) { + StartSymUploadProtocolV1(options, OS, CPU, debugID, debugFile); + } else if (options->symUploadProtocol == kSymUploadProtocolV2) { + StartSymUploadProtocolV2(options, debugID, debugFile); + } +} + +//============================================================================= +static void Usage(int argc, const char* argv[]) { + fprintf(stderr, "Submit symbol information.\n"); + fprintf(stderr, "Usage: %s [options] \n", argv[0]); + fprintf(stderr, " should be created by using the dump_syms " + "tool.\n"); + fprintf(stderr, " is the destination for the upload.\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, "\t-p : protocol to use for upload, accepts " + "[\"sym-upload-v1\", \"sym-upload-v2\"]. Default is " + "\"sym-upload-v1\".\n"); + fprintf(stderr, "\t-k : secret for authentication with upload " + "server. [Only in sym-upload-v2 protocol mode]\n"); + fprintf(stderr, "\t-f: Overwrite symbol file on server if already present. " + "[Only in sym-upload-v2 protocol mode]\n"); + fprintf( + stderr, + "\t-t: Explicitly set symbol upload type (" + "default is 'breakpad').\n" + "\t One of ['breakpad', 'elf', 'pe', 'macho', 'debug_only', 'dwp', " + "'dsym', 'pdb'].\n" + "\t Note: When this flag is set to anything other than 'breakpad', then " + "the '-c' and '-i' flags must also be set.\n"); + fprintf(stderr, "\t-c: Explicitly set 'code_file' for symbol " + "upload (basename of executable).\n"); + fprintf(stderr, "\t-i: Explicitly set 'debug_id' for symbol " + "upload (typically build ID of executable). The debug-id for " + "symbol-types 'dsym' and 'macho' will be determined " + "automatically. \n"); + fprintf(stderr, "\t-n: Optionally set 'product_name' for " + "symbol upload\n"); + fprintf(stderr, "\t-h: Usage\n"); + fprintf(stderr, "\t-?: Usage\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Exit codes:\n"); + fprintf(stderr, "\t%d: Success\n", kResultSuccess); + fprintf(stderr, "\t%d: Failure\n", kResultFailure); + fprintf(stderr, + "\t%d: Symbol file already exists on server (and -f was not " + "specified).\n", + kResultAlreadyExists); + fprintf(stderr, + "\t [This exit code will only be returned by the sym-upload-v2 " + "protocol.\n"); + fprintf(stderr, + "\t The sym-upload-v1 protocol can return either Success or " + "Failure\n"); + fprintf(stderr, "\t in this case, and the action taken by the server is " + "unspecified.]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Examples:\n"); + fprintf(stderr, " With 'sym-upload-v1':\n"); + fprintf(stderr, " %s path/to/symbol_file http://myuploadserver\n", + argv[0]); + fprintf(stderr, " With 'sym-upload-v2':\n"); + fprintf(stderr, " [Defaulting to symbol type 'BREAKPAD']\n"); + fprintf(stderr, + " %s -p sym-upload-v2 -k mysecret123! " + "path/to/symbol_file http://myuploadserver\n", + argv[0]); + fprintf(stderr, " [Explicitly set symbol type to 'macho']\n"); + fprintf(stderr, + " %s -p sym-upload-v2 -k mysecret123! -t macho " + "-c app -i 11111111BBBB3333DDDD555555555555F " + "path/to/symbol_file http://myuploadserver\n", + argv[0]); +} + +//============================================================================= +static void SetupOptions(int argc, const char* argv[], Options* options) { + // Set default options values. + options->symUploadProtocol = kSymUploadProtocolV1; + options->apiKey = nil; + options->type = kBreakpadSymbolType; + options->codeFile = nil; + options->debugID = nil; + options->force = NO; + options->productName = nil; + + extern int optind; + int ch; + + while ((ch = getopt(argc, (char* const*)argv, "p:k:t:c:i:n:hf?")) != -1) { + switch (ch) { + case 'p': + if (strcmp(optarg, "sym-upload-v2") == 0) { + options->symUploadProtocol = kSymUploadProtocolV2; + break; + } else if (strcmp(optarg, "sym-upload-v1") == 0) { + // This is already the default but leave in case that changes. + options->symUploadProtocol = kSymUploadProtocolV1; + break; + } + Usage(argc, argv); + exit(0); + break; + case 'k': + options->apiKey = [NSString stringWithCString:optarg + encoding:NSASCIIStringEncoding]; + break; + case 't': { + // This is really an enum, so treat as upper-case for consistency with + // enum naming convention on server-side. + options->type = [[NSString stringWithCString:optarg + encoding:NSASCIIStringEncoding] + uppercaseString]; + break; + } + case 'c': + options->codeFile = [NSString stringWithCString:optarg + encoding:NSASCIIStringEncoding]; + break; + case 'i': + options->debugID = [NSString stringWithCString:optarg + encoding:NSASCIIStringEncoding]; + break; + case 'n': + options->productName = + [NSString stringWithCString:optarg + encoding:NSASCIIStringEncoding]; + break; + case 'f': + options->force = YES; + break; + default: + Usage(argc, argv); + exit(0); + break; + } + } + + if ((argc - optind) != 2) { + fprintf(stderr, "%s: Missing symbols file and/or upload-URL\n", argv[0]); + Usage(argc, argv); + exit(1); + } + + int fd = open(argv[optind], O_RDONLY); + if (fd < 0) { + fprintf(stderr, "%s: %s: %s\n", argv[0], argv[optind], strerror(errno)); + exit(1); + } + + struct stat statbuf; + if (fstat(fd, &statbuf) < 0) { + fprintf(stderr, "%s: %s: %s\n", argv[0], argv[optind], strerror(errno)); + close(fd); + exit(1); + } + close(fd); + + if (!S_ISREG(statbuf.st_mode)) { + fprintf(stderr, "%s: %s: not a regular file\n", argv[0], argv[optind]); + exit(1); + } + + bool isBreakpadUpload = [options->type isEqualToString:kBreakpadSymbolType]; + bool hasCodeFile = options->codeFile != nil; + bool hasDebugID = options->debugID != nil; + if (isBreakpadUpload && (hasCodeFile || hasDebugID)) { + fprintf(stderr, "\n"); + fprintf(stderr, + "%s: -c and -i should only be specified for non-breakpad " + "symbol upload types.\n", + argv[0]); + fprintf(stderr, "\n"); + Usage(argc, argv); + exit(1); + } + + if (!isBreakpadUpload && hasCodeFile && !hasDebugID && + ([options->type isEqualToString:kMachOSymbolType] || + [options->type isEqualToString:kDSYMSymbolType])) { + DumpSymbols dump_symbols(SYMBOLS_AND_FILES | INLINES, false); + if (dump_symbols.Read(argv[optind])) { + std::string identifier = dump_symbols.Identifier(); + if (identifier.empty()) { + fprintf(stderr, "\n"); + fprintf(stderr, + "%s: Unable to determine debug-id. Please specify with '-i'.\n", + argv[0]); + fprintf(stderr, "\n"); + Usage(argc, argv); + exit(1); + } + options->debugID = [NSString stringWithUTF8String:identifier.c_str()]; + hasDebugID = true; + } + } + + if (!isBreakpadUpload && (!hasCodeFile || !hasDebugID)) { + fprintf(stderr, "\n"); + fprintf(stderr, + "%s: -c and -i must be specified for non-breakpad " + "symbol upload types.\n", + argv[0]); + fprintf(stderr, "\n"); + Usage(argc, argv); + exit(1); + } + + options->symbolsPath = [NSString stringWithUTF8String:argv[optind]]; + options->uploadURLStr = [NSString stringWithUTF8String:argv[optind + 1]]; +} + +//============================================================================= +int main(int argc, const char* argv[]) { + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + Options options; + + bzero(&options, sizeof(Options)); + SetupOptions(argc, argv, &options); + Start(&options); + + [pool release]; + return options.result; +} diff --git a/src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj b/src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj new file mode 100644 index 0000000..b1dd6a1 --- /dev/null +++ b/src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj @@ -0,0 +1,466 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 5B6060BD222716FC0015F0A0 /* HTTPRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B6060BC222716FC0015F0A0 /* HTTPRequest.m */; }; + 5B6060C02227201B0015F0A0 /* HTTPPutRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B6060BF2227201B0015F0A0 /* HTTPPutRequest.m */; }; + 5B6060C7222735E50015F0A0 /* HTTPGetRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B6060C6222735E50015F0A0 /* HTTPGetRequest.m */; }; + 5B6060CA2227374E0015F0A0 /* HTTPSimplePostRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B6060C92227374E0015F0A0 /* HTTPSimplePostRequest.m */; }; + 5B6060D022273BDA0015F0A0 /* SymbolCollectorClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B6060CF22273BDA0015F0A0 /* SymbolCollectorClient.m */; }; + 5B97447524D0AA5F000C71F5 /* encoding_util.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B97447424D0AA5F000C71F5 /* encoding_util.m */; }; + 8B31022C11F0CEBD00FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; }; + 8DD76F9A0486AA7600D96B5E /* symupload.mm in Sources */ = {isa = PBXBuildFile; fileRef = 08FB7796FE84155DC02AAC07 /* symupload.mm */; settings = {ATTRIBUTES = (); }; }; + 8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB779EFE84155DC02AAC07 /* Foundation.framework */; }; + 930DA19225ED543A008558E3 /* dump_syms.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA19025ED543A008558E3 /* dump_syms.cc */; }; + 930DA22C25ED55A9008558E3 /* module.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA21F25ED55A8008558E3 /* module.cc */; }; + 930DA22D25ED55A9008558E3 /* dwarf_cfi_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA22325ED55A8008558E3 /* dwarf_cfi_to_module.cc */; }; + 930DA22E25ED55A9008558E3 /* stabs_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA22525ED55A8008558E3 /* stabs_to_module.cc */; }; + 930DA22F25ED55A9008558E3 /* language.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA22625ED55A9008558E3 /* language.cc */; }; + 930DA23125ED55A9008558E3 /* dwarf_line_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA22A25ED55A9008558E3 /* dwarf_line_to_module.cc */; }; + 930DA23225ED55A9008558E3 /* dwarf_cu_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA22B25ED55A9008558E3 /* dwarf_cu_to_module.cc */; }; + 930DA23725ED55B6008558E3 /* stabs_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA23625ED55B6008558E3 /* stabs_reader.cc */; }; + 930DA24225ED55BF008558E3 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA23A25ED55BF008558E3 /* macho_id.cc */; }; + 930DA24325ED55BF008558E3 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA23C25ED55BF008558E3 /* macho_utilities.cc */; }; + 930DA24425ED55BF008558E3 /* macho_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA23F25ED55BF008558E3 /* macho_reader.cc */; }; + 930DA24525ED55BF008558E3 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA24125ED55BF008558E3 /* macho_walker.cc */; }; + 930DA25C25ED56DB008558E3 /* dwarf_range_list_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA24D25ED56DB008558E3 /* dwarf_range_list_handler.cc */; }; + 930DA25D25ED56DB008558E3 /* cfi_assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA24E25ED56DB008558E3 /* cfi_assembler.cc */; }; + 930DA25E25ED56DB008558E3 /* elf_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA25225ED56DB008558E3 /* elf_reader.cc */; }; + 930DA25F25ED56DB008558E3 /* dwarf2diehandler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA25325ED56DB008558E3 /* dwarf2diehandler.cc */; }; + 930DA26025ED56DB008558E3 /* dwarf2reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA25625ED56DB008558E3 /* dwarf2reader.cc */; }; + 930DA26125ED56DB008558E3 /* bytereader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA25925ED56DB008558E3 /* bytereader.cc */; }; + 930DA26925ED56FF008558E3 /* test_assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA26825ED56FF008558E3 /* test_assembler.cc */; }; + 930DA26E25ED571F008558E3 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA26D25ED571F008558E3 /* arch_utilities.cc */; }; + 930DA27825ED572D008558E3 /* path_helper.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA27125ED572C008558E3 /* path_helper.cc */; }; + 930DA27925ED572D008558E3 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA27525ED572C008558E3 /* file_id.cc */; }; + 930DA27A25ED572D008558E3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 930DA27725ED572D008558E3 /* md5.cc */; }; + 9BC1D49E0B37427A00F2A2B4 /* minidump_upload.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BD836000B0544BA0055103E /* minidump_upload.m */; }; + 9BD8336A0B03E4080055103E /* HTTPMultipartUpload.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD833680B03E4080055103E /* HTTPMultipartUpload.h */; }; + 9BD8336B0B03E4080055103E /* HTTPMultipartUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BD833690B03E4080055103E /* HTTPMultipartUpload.m */; }; + 9BD836180B0549F70055103E /* HTTPMultipartUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BD833690B03E4080055103E /* HTTPMultipartUpload.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8DD76F9E0486AA7600D96B5E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + 9BD8336A0B03E4080055103E /* HTTPMultipartUpload.h in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 08FB7796FE84155DC02AAC07 /* symupload.mm */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.objcpp; path = symupload.mm; sourceTree = ""; tabWidth = 2; }; + 08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 5B6060BB222716FC0015F0A0 /* HTTPRequest.h */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = HTTPRequest.h; path = ../../../common/mac/HTTPRequest.h; sourceTree = ""; tabWidth = 2; }; + 5B6060BC222716FC0015F0A0 /* HTTPRequest.m */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; name = HTTPRequest.m; path = ../../../common/mac/HTTPRequest.m; sourceTree = ""; tabWidth = 2; }; + 5B6060BE2227201B0015F0A0 /* HTTPPutRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HTTPPutRequest.h; path = ../../../common/mac/HTTPPutRequest.h; sourceTree = ""; }; + 5B6060BF2227201B0015F0A0 /* HTTPPutRequest.m */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; name = HTTPPutRequest.m; path = ../../../common/mac/HTTPPutRequest.m; sourceTree = ""; tabWidth = 2; }; + 5B6060C22227303A0015F0A0 /* encoding_util.h */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = encoding_util.h; path = ../../../common/mac/encoding_util.h; sourceTree = ""; tabWidth = 2; }; + 5B6060C5222735E50015F0A0 /* HTTPGetRequest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HTTPGetRequest.h; path = ../../../common/mac/HTTPGetRequest.h; sourceTree = ""; }; + 5B6060C6222735E50015F0A0 /* HTTPGetRequest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = HTTPGetRequest.m; path = ../../../common/mac/HTTPGetRequest.m; sourceTree = ""; }; + 5B6060C82227374E0015F0A0 /* HTTPSimplePostRequest.h */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = HTTPSimplePostRequest.h; path = ../../../common/mac/HTTPSimplePostRequest.h; sourceTree = ""; tabWidth = 2; }; + 5B6060C92227374E0015F0A0 /* HTTPSimplePostRequest.m */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; name = HTTPSimplePostRequest.m; path = ../../../common/mac/HTTPSimplePostRequest.m; sourceTree = ""; tabWidth = 2; }; + 5B6060CE22273BDA0015F0A0 /* SymbolCollectorClient.h */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = SymbolCollectorClient.h; path = ../../../common/mac/SymbolCollectorClient.h; sourceTree = ""; tabWidth = 2; }; + 5B6060CF22273BDA0015F0A0 /* SymbolCollectorClient.m */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; name = SymbolCollectorClient.m; path = ../../../common/mac/SymbolCollectorClient.m; sourceTree = ""; tabWidth = 2; }; + 5B97447424D0AA5F000C71F5 /* encoding_util.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = encoding_util.m; path = ../../../common/mac/encoding_util.m; sourceTree = ""; }; + 8B31022B11F0CE6900FCF3E4 /* Breakpad.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Breakpad.xcconfig; path = ../../../common/mac/Breakpad.xcconfig; sourceTree = SOURCE_ROOT; }; + 8B3102B611F0D5CE00FCF3E4 /* BreakpadDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadDebug.xcconfig; path = ../../../common/mac/BreakpadDebug.xcconfig; sourceTree = SOURCE_ROOT; }; + 8B3102B711F0D5CE00FCF3E4 /* BreakpadRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadRelease.xcconfig; path = ../../../common/mac/BreakpadRelease.xcconfig; sourceTree = SOURCE_ROOT; }; + 8DD76FA10486AA7600D96B5E /* symupload */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = symupload; sourceTree = BUILT_PRODUCTS_DIR; }; + 930DA19025ED543A008558E3 /* dump_syms.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dump_syms.cc; path = ../../../common/mac/dump_syms.cc; sourceTree = ""; }; + 930DA19125ED543A008558E3 /* dump_syms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dump_syms.h; path = ../../../common/mac/dump_syms.h; sourceTree = ""; }; + 930DA21F25ED55A8008558E3 /* module.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = module.cc; path = ../../../common/module.cc; sourceTree = ""; }; + 930DA22025ED55A8008558E3 /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = module.h; path = ../../../common/module.h; sourceTree = ""; }; + 930DA22125ED55A8008558E3 /* dwarf_cfi_to_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf_cfi_to_module.h; path = ../../../common/dwarf_cfi_to_module.h; sourceTree = ""; }; + 930DA22225ED55A8008558E3 /* dwarf_cu_to_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf_cu_to_module.h; path = ../../../common/dwarf_cu_to_module.h; sourceTree = ""; }; + 930DA22325ED55A8008558E3 /* dwarf_cfi_to_module.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_cfi_to_module.cc; path = ../../../common/dwarf_cfi_to_module.cc; sourceTree = ""; }; + 930DA22425ED55A8008558E3 /* language.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = language.h; path = ../../../common/language.h; sourceTree = ""; }; + 930DA22525ED55A8008558E3 /* stabs_to_module.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = stabs_to_module.cc; path = ../../../common/stabs_to_module.cc; sourceTree = ""; }; + 930DA22625ED55A9008558E3 /* language.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = language.cc; path = ../../../common/language.cc; sourceTree = ""; }; + 930DA22725ED55A9008558E3 /* dwarf_line_to_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf_line_to_module.h; path = ../../../common/dwarf_line_to_module.h; sourceTree = ""; }; + 930DA22825ED55A9008558E3 /* stabs_to_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stabs_to_module.h; path = ../../../common/stabs_to_module.h; sourceTree = ""; }; + 930DA22A25ED55A9008558E3 /* dwarf_line_to_module.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_line_to_module.cc; path = ../../../common/dwarf_line_to_module.cc; sourceTree = ""; }; + 930DA22B25ED55A9008558E3 /* dwarf_cu_to_module.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_cu_to_module.cc; path = ../../../common/dwarf_cu_to_module.cc; sourceTree = ""; }; + 930DA23525ED55B6008558E3 /* stabs_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stabs_reader.h; path = ../../../common/stabs_reader.h; sourceTree = ""; }; + 930DA23625ED55B6008558E3 /* stabs_reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = stabs_reader.cc; path = ../../../common/stabs_reader.cc; sourceTree = ""; }; + 930DA23A25ED55BF008558E3 /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_id.cc; path = ../../../common/mac/macho_id.cc; sourceTree = ""; }; + 930DA23B25ED55BF008558E3 /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../../common/mac/macho_id.h; sourceTree = ""; }; + 930DA23C25ED55BF008558E3 /* macho_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_utilities.cc; path = ../../../common/mac/macho_utilities.cc; sourceTree = ""; }; + 930DA23D25ED55BF008558E3 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = ""; }; + 930DA23E25ED55BF008558E3 /* macho_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_reader.h; path = ../../../common/mac/macho_reader.h; sourceTree = ""; }; + 930DA23F25ED55BF008558E3 /* macho_reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_reader.cc; path = ../../../common/mac/macho_reader.cc; sourceTree = ""; }; + 930DA24025ED55BF008558E3 /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_utilities.h; path = ../../../common/mac/macho_utilities.h; sourceTree = ""; }; + 930DA24125ED55BF008558E3 /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../../common/mac/macho_walker.cc; sourceTree = ""; }; + 930DA24C25ED56DB008558E3 /* line_state_machine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = line_state_machine.h; path = ../../../common/dwarf/line_state_machine.h; sourceTree = ""; }; + 930DA24D25ED56DB008558E3 /* dwarf_range_list_handler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_range_list_handler.cc; path = ../../../common/dwarf_range_list_handler.cc; sourceTree = ""; }; + 930DA24E25ED56DB008558E3 /* cfi_assembler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cfi_assembler.cc; path = ../../../common/dwarf/cfi_assembler.cc; sourceTree = ""; }; + 930DA24F25ED56DB008558E3 /* dwarf2enums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2enums.h; path = ../../../common/dwarf/dwarf2enums.h; sourceTree = ""; }; + 930DA25025ED56DB008558E3 /* bytereader-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "bytereader-inl.h"; path = "../../../common/dwarf/bytereader-inl.h"; sourceTree = ""; }; + 930DA25125ED56DB008558E3 /* dwarf_range_list_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf_range_list_handler.h; path = ../../../common/dwarf_range_list_handler.h; sourceTree = ""; }; + 930DA25225ED56DB008558E3 /* elf_reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = elf_reader.cc; path = ../../../common/dwarf/elf_reader.cc; sourceTree = ""; }; + 930DA25325ED56DB008558E3 /* dwarf2diehandler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2diehandler.cc; path = ../../../common/dwarf/dwarf2diehandler.cc; sourceTree = ""; }; + 930DA25425ED56DB008558E3 /* elf_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = elf_reader.h; path = ../../../common/dwarf/elf_reader.h; sourceTree = ""; }; + 930DA25525ED56DB008558E3 /* bytereader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bytereader.h; path = ../../../common/dwarf/bytereader.h; sourceTree = ""; }; + 930DA25625ED56DB008558E3 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/dwarf/dwarf2reader.cc; sourceTree = ""; }; + 930DA25725ED56DB008558E3 /* dwarf2reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2reader.h; path = ../../../common/dwarf/dwarf2reader.h; sourceTree = ""; }; + 930DA25825ED56DB008558E3 /* dwarf2diehandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2diehandler.h; path = ../../../common/dwarf/dwarf2diehandler.h; sourceTree = ""; }; + 930DA25925ED56DB008558E3 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/dwarf/bytereader.cc; sourceTree = ""; }; + 930DA25A25ED56DB008558E3 /* cfi_assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cfi_assembler.h; path = ../../../common/dwarf/cfi_assembler.h; sourceTree = ""; }; + 930DA26725ED56FF008558E3 /* test_assembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test_assembler.h; path = ../../../common/test_assembler.h; sourceTree = ""; }; + 930DA26825ED56FF008558E3 /* test_assembler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = test_assembler.cc; path = ../../../common/test_assembler.cc; sourceTree = ""; }; + 930DA26C25ED571F008558E3 /* arch_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = arch_utilities.h; path = ../../../common/mac/arch_utilities.h; sourceTree = ""; }; + 930DA26D25ED571F008558E3 /* arch_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arch_utilities.cc; path = ../../../common/mac/arch_utilities.cc; sourceTree = ""; }; + 930DA27125ED572C008558E3 /* path_helper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = path_helper.cc; path = ../../../common/path_helper.cc; sourceTree = ""; }; + 930DA27225ED572C008558E3 /* byteswap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = byteswap.h; path = ../../../common/mac/byteswap.h; sourceTree = ""; }; + 930DA27325ED572C008558E3 /* path_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path_helper.h; path = ../../../common/path_helper.h; sourceTree = ""; }; + 930DA27425ED572C008558E3 /* byte_cursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = byte_cursor.h; path = ../../../common/byte_cursor.h; sourceTree = ""; }; + 930DA27525ED572C008558E3 /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = file_id.cc; path = ../../../common/mac/file_id.cc; sourceTree = ""; }; + 930DA27625ED572C008558E3 /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = file_id.h; path = ../../../common/mac/file_id.h; sourceTree = ""; }; + 930DA27725ED572D008558E3 /* md5.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = md5.cc; path = ../../../common/md5.cc; sourceTree = ""; }; + 9BD833680B03E4080055103E /* HTTPMultipartUpload.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = HTTPMultipartUpload.h; path = ../../../common/mac/HTTPMultipartUpload.h; sourceTree = ""; tabWidth = 2; }; + 9BD833690B03E4080055103E /* HTTPMultipartUpload.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; name = HTTPMultipartUpload.m; path = ../../../common/mac/HTTPMultipartUpload.m; sourceTree = ""; tabWidth = 2; }; + 9BD835FB0B0544950055103E /* minidump_upload */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = minidump_upload; sourceTree = BUILT_PRODUCTS_DIR; }; + 9BD836000B0544BA0055103E /* minidump_upload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = minidump_upload.m; path = ../../../common/mac/minidump_upload.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8DD76F9B0486AA7600D96B5E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9BD835F90B0544950055103E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8B31022C11F0CEBD00FCF3E4 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* symupload */ = { + isa = PBXGroup; + children = ( + 930DA21E25ED5586008558E3 /* dump_syms */, + 5B6060CE22273BDA0015F0A0 /* SymbolCollectorClient.h */, + 5B6060CF22273BDA0015F0A0 /* SymbolCollectorClient.m */, + 5B6060C82227374E0015F0A0 /* HTTPSimplePostRequest.h */, + 5B6060C92227374E0015F0A0 /* HTTPSimplePostRequest.m */, + 5B6060C5222735E50015F0A0 /* HTTPGetRequest.h */, + 5B6060C6222735E50015F0A0 /* HTTPGetRequest.m */, + 5B6060C22227303A0015F0A0 /* encoding_util.h */, + 5B97447424D0AA5F000C71F5 /* encoding_util.m */, + 5B6060BE2227201B0015F0A0 /* HTTPPutRequest.h */, + 5B6060BF2227201B0015F0A0 /* HTTPPutRequest.m */, + 5B6060BB222716FC0015F0A0 /* HTTPRequest.h */, + 5B6060BC222716FC0015F0A0 /* HTTPRequest.m */, + 8B31022B11F0CE6900FCF3E4 /* Breakpad.xcconfig */, + 8B3102B611F0D5CE00FCF3E4 /* BreakpadDebug.xcconfig */, + 8B3102B711F0D5CE00FCF3E4 /* BreakpadRelease.xcconfig */, + 08FB7796FE84155DC02AAC07 /* symupload.mm */, + 9BD836000B0544BA0055103E /* minidump_upload.m */, + 9BD833680B03E4080055103E /* HTTPMultipartUpload.h */, + 9BD833690B03E4080055103E /* HTTPMultipartUpload.m */, + 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = symupload; + sourceTree = ""; + }; + 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 08FB779EFE84155DC02AAC07 /* Foundation.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8DD76FA10486AA7600D96B5E /* symupload */, + 9BD835FB0B0544950055103E /* minidump_upload */, + ); + name = Products; + sourceTree = ""; + }; + 930DA21E25ED5586008558E3 /* dump_syms */ = { + isa = PBXGroup; + children = ( + 930DA23A25ED55BF008558E3 /* macho_id.cc */, + 930DA23B25ED55BF008558E3 /* macho_id.h */, + 930DA23F25ED55BF008558E3 /* macho_reader.cc */, + 930DA23E25ED55BF008558E3 /* macho_reader.h */, + 930DA23C25ED55BF008558E3 /* macho_utilities.cc */, + 930DA24025ED55BF008558E3 /* macho_utilities.h */, + 930DA24125ED55BF008558E3 /* macho_walker.cc */, + 930DA23D25ED55BF008558E3 /* macho_walker.h */, + 930DA19025ED543A008558E3 /* dump_syms.cc */, + 930DA19125ED543A008558E3 /* dump_syms.h */, + 930DA23625ED55B6008558E3 /* stabs_reader.cc */, + 930DA23525ED55B6008558E3 /* stabs_reader.h */, + 930DA22325ED55A8008558E3 /* dwarf_cfi_to_module.cc */, + 930DA22125ED55A8008558E3 /* dwarf_cfi_to_module.h */, + 930DA22B25ED55A9008558E3 /* dwarf_cu_to_module.cc */, + 930DA22225ED55A8008558E3 /* dwarf_cu_to_module.h */, + 930DA22A25ED55A9008558E3 /* dwarf_line_to_module.cc */, + 930DA22725ED55A9008558E3 /* dwarf_line_to_module.h */, + 930DA22625ED55A9008558E3 /* language.cc */, + 930DA22425ED55A8008558E3 /* language.h */, + 930DA21F25ED55A8008558E3 /* module.cc */, + 930DA22025ED55A8008558E3 /* module.h */, + 930DA22525ED55A8008558E3 /* stabs_to_module.cc */, + 930DA22825ED55A9008558E3 /* stabs_to_module.h */, + 930DA25025ED56DB008558E3 /* bytereader-inl.h */, + 930DA25925ED56DB008558E3 /* bytereader.cc */, + 930DA25525ED56DB008558E3 /* bytereader.h */, + 930DA24E25ED56DB008558E3 /* cfi_assembler.cc */, + 930DA25A25ED56DB008558E3 /* cfi_assembler.h */, + 930DA24D25ED56DB008558E3 /* dwarf_range_list_handler.cc */, + 930DA25125ED56DB008558E3 /* dwarf_range_list_handler.h */, + 930DA25325ED56DB008558E3 /* dwarf2diehandler.cc */, + 930DA25825ED56DB008558E3 /* dwarf2diehandler.h */, + 930DA24F25ED56DB008558E3 /* dwarf2enums.h */, + 930DA25625ED56DB008558E3 /* dwarf2reader.cc */, + 930DA25725ED56DB008558E3 /* dwarf2reader.h */, + 930DA25225ED56DB008558E3 /* elf_reader.cc */, + 930DA25425ED56DB008558E3 /* elf_reader.h */, + 930DA24C25ED56DB008558E3 /* line_state_machine.h */, + 930DA26825ED56FF008558E3 /* test_assembler.cc */, + 930DA26725ED56FF008558E3 /* test_assembler.h */, + 930DA26D25ED571F008558E3 /* arch_utilities.cc */, + 930DA26C25ED571F008558E3 /* arch_utilities.h */, + 930DA27425ED572C008558E3 /* byte_cursor.h */, + 930DA27225ED572C008558E3 /* byteswap.h */, + 930DA27525ED572C008558E3 /* file_id.cc */, + 930DA27625ED572C008558E3 /* file_id.h */, + 930DA27725ED572D008558E3 /* md5.cc */, + 930DA27125ED572C008558E3 /* path_helper.cc */, + 930DA27325ED572C008558E3 /* path_helper.h */, + ); + name = dump_syms; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8DD76F960486AA7600D96B5E /* symupload */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "symupload" */; + buildPhases = ( + 8DD76F990486AA7600D96B5E /* Sources */, + 8DD76F9B0486AA7600D96B5E /* Frameworks */, + 8DD76F9E0486AA7600D96B5E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = symupload; + productInstallPath = "$(HOME)/bin"; + productName = symupload; + productReference = 8DD76FA10486AA7600D96B5E /* symupload */; + productType = "com.apple.product-type.tool"; + }; + 9BD835FA0B0544950055103E /* minidump_upload */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9BD836020B0544BB0055103E /* Build configuration list for PBXNativeTarget "minidump_upload" */; + buildPhases = ( + 9BD835F80B0544950055103E /* Sources */, + 9BD835F90B0544950055103E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = minidump_upload; + productName = minidump_upload; + productReference = 9BD835FB0B0544950055103E /* minidump_upload */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + }; + buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "symupload" */; + compatibilityVersion = "Xcode 3.1"; + developmentRegion = en; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* symupload */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76F960486AA7600D96B5E /* symupload */, + 9BD835FA0B0544950055103E /* minidump_upload */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 8DD76F990486AA7600D96B5E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8DD76F9A0486AA7600D96B5E /* symupload.mm in Sources */, + 930DA19225ED543A008558E3 /* dump_syms.cc in Sources */, + 930DA24525ED55BF008558E3 /* macho_walker.cc in Sources */, + 930DA22E25ED55A9008558E3 /* stabs_to_module.cc in Sources */, + 5B6060CA2227374E0015F0A0 /* HTTPSimplePostRequest.m in Sources */, + 930DA25F25ED56DB008558E3 /* dwarf2diehandler.cc in Sources */, + 930DA27825ED572D008558E3 /* path_helper.cc in Sources */, + 930DA27A25ED572D008558E3 /* md5.cc in Sources */, + 930DA22D25ED55A9008558E3 /* dwarf_cfi_to_module.cc in Sources */, + 930DA24425ED55BF008558E3 /* macho_reader.cc in Sources */, + 930DA24325ED55BF008558E3 /* macho_utilities.cc in Sources */, + 5B6060D022273BDA0015F0A0 /* SymbolCollectorClient.m in Sources */, + 5B6060C7222735E50015F0A0 /* HTTPGetRequest.m in Sources */, + 930DA27925ED572D008558E3 /* file_id.cc in Sources */, + 930DA26925ED56FF008558E3 /* test_assembler.cc in Sources */, + 930DA22F25ED55A9008558E3 /* language.cc in Sources */, + 930DA25E25ED56DB008558E3 /* elf_reader.cc in Sources */, + 930DA26E25ED571F008558E3 /* arch_utilities.cc in Sources */, + 930DA24225ED55BF008558E3 /* macho_id.cc in Sources */, + 5B6060C02227201B0015F0A0 /* HTTPPutRequest.m in Sources */, + 930DA25C25ED56DB008558E3 /* dwarf_range_list_handler.cc in Sources */, + 5B6060BD222716FC0015F0A0 /* HTTPRequest.m in Sources */, + 930DA25D25ED56DB008558E3 /* cfi_assembler.cc in Sources */, + 930DA23225ED55A9008558E3 /* dwarf_cu_to_module.cc in Sources */, + 930DA23125ED55A9008558E3 /* dwarf_line_to_module.cc in Sources */, + 930DA26125ED56DB008558E3 /* bytereader.cc in Sources */, + 930DA22C25ED55A9008558E3 /* module.cc in Sources */, + 5B97447524D0AA5F000C71F5 /* encoding_util.m in Sources */, + 930DA23725ED55B6008558E3 /* stabs_reader.cc in Sources */, + 9BD8336B0B03E4080055103E /* HTTPMultipartUpload.m in Sources */, + 930DA26025ED56DB008558E3 /* dwarf2reader.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9BD835F80B0544950055103E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9BD836180B0549F70055103E /* HTTPMultipartUpload.m in Sources */, + 9BC1D49E0B37427A00F2A2B4 /* minidump_upload.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB927508733DD40010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + GCC_PREPROCESSOR_DEFINITIONS = HAVE_MACH_O_NLIST_H; + HEADER_SEARCH_PATHS = ( + ../../.., + ../../../common/mac/include, + ../../../third_party/musl/include/, + ); + PRODUCT_NAME = symupload; + }; + name = Debug; + }; + 1DEB927608733DD40010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + NDEBUG, + HAVE_MACH_O_NLIST_H, + ); + HEADER_SEARCH_PATHS = ( + ../../.., + ../../../common/mac/include, + ../../../third_party/musl/include/, + ); + PRODUCT_NAME = symupload; + }; + name = Release; + }; + 1DEB927908733DD40010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8B3102B611F0D5CE00FCF3E4 /* BreakpadDebug.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 1DEB927A08733DD40010E9CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8B3102B711F0D5CE00FCF3E4 /* BreakpadRelease.xcconfig */; + buildSettings = { + }; + name = Release; + }; + 9BD836030B0544BB0055103E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../../..; + PRODUCT_NAME = minidump_upload; + }; + name = Debug; + }; + 9BD836040B0544BB0055103E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../../..; + PRODUCT_NAME = minidump_upload; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB927408733DD40010E9CD /* Build configuration list for PBXNativeTarget "symupload" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB927508733DD40010E9CD /* Debug */, + 1DEB927608733DD40010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "symupload" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB927908733DD40010E9CD /* Debug */, + 1DEB927A08733DD40010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9BD836020B0544BB0055103E /* Build configuration list for PBXNativeTarget "minidump_upload" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9BD836030B0544BB0055103E /* Debug */, + 9BD836040B0544BB0055103E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/src/tools/mac/upload_system_symbols/arch_constants.h b/src/tools/mac/upload_system_symbols/arch_constants.h new file mode 100644 index 0000000..b6dbc89 --- /dev/null +++ b/src/tools/mac/upload_system_symbols/arch_constants.h @@ -0,0 +1,66 @@ +/* Copyright 2014 Google LLC + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include + +// Go/Cgo does not support #define constants, so turn them into symbols +// that are reachable from Go. + +#ifndef CPU_TYPE_ARM64 +#define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64) +#endif + +#ifndef CPU_SUBTYPE_ARM64_ALL +#define CPU_SUBTYPE_ARM64_ALL 0 +#endif + +#ifndef CPU_SUBTYPE_ARM64_E +#define CPU_SUBTYPE_ARM64_E 2 +#endif + +const cpu_type_t kCPU_TYPE_ARM = CPU_TYPE_ARM; +const cpu_type_t kCPU_TYPE_ARM64 = CPU_TYPE_ARM64; + +const cpu_subtype_t kCPU_SUBTYPE_ARM64_ALL = CPU_SUBTYPE_ARM64_ALL; +const cpu_subtype_t kCPU_SUBTYPE_ARM64_E = CPU_SUBTYPE_ARM64_E; +const cpu_subtype_t kCPU_SUBTYPE_ARM_V7S = CPU_SUBTYPE_ARM_V7S; + +const char* GetNXArchInfoName(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) { + const NXArchInfo* arch_info = NXGetArchInfoFromCpuType(cpu_type, cpu_subtype); + if (!arch_info) + return 0; + return arch_info->name; +} + +const uint32_t kMachHeaderFtypeDylib = MH_DYLIB; +const uint32_t kMachHeaderFtypeBundle = MH_BUNDLE; +const uint32_t kMachHeaderFtypeExe = MH_EXECUTE; +const uint32_t kMachHeaderFtypeDylinker = MH_DYLINKER; diff --git a/src/tools/mac/upload_system_symbols/arch_reader.go b/src/tools/mac/upload_system_symbols/arch_reader.go new file mode 100644 index 0000000..03a7642 --- /dev/null +++ b/src/tools/mac/upload_system_symbols/arch_reader.go @@ -0,0 +1,68 @@ +/* Copyright 2014 Google LLC + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package main + +import ( + "debug/macho" +) + +/* +#include "arch_constants.h" +*/ +import "C" + +// getArchStringFromHeader takes a MachO FileHeader and returns a string that +// represents the CPU type and subtype. +// This function is a Go version of src/common/mac/arch_utilities.cc:BreakpadGetArchInfoFromCpuType(). +func getArchStringFromHeader(header macho.FileHeader) string { + // TODO(rsesek): As of 10.9.4, OS X doesn't list these in /usr/include/mach/machine.h. + if header.Cpu == C.kCPU_TYPE_ARM64 && header.SubCpu == C.kCPU_SUBTYPE_ARM64_ALL { + return "arm64" + } + if header.Cpu == C.kCPU_TYPE_ARM64 && header.SubCpu == C.kCPU_SUBTYPE_ARM64_E { + return "arm64e" + } + if header.Cpu == C.kCPU_TYPE_ARM && header.SubCpu == C.kCPU_SUBTYPE_ARM_V7S { + return "armv7s" + } + + cstr := C.GetNXArchInfoName(C.cpu_type_t(header.Cpu), C.cpu_subtype_t(header.SubCpu)) + if cstr == nil { + return "" + } + return C.GoString(cstr) +} + +const ( + MachODylib macho.Type = C.kMachHeaderFtypeDylib + MachOBundle = C.kMachHeaderFtypeBundle + MachOExe = C.kMachHeaderFtypeExe + MachODylinker = C.kMachHeaderFtypeDylinker +) diff --git a/src/tools/mac/upload_system_symbols/go.mod b/src/tools/mac/upload_system_symbols/go.mod new file mode 100644 index 0000000..ff21bba --- /dev/null +++ b/src/tools/mac/upload_system_symbols/go.mod @@ -0,0 +1,3 @@ +module upload_system_symbols + +go 1.17 diff --git a/src/tools/mac/upload_system_symbols/upload_system_symbols.go b/src/tools/mac/upload_system_symbols/upload_system_symbols.go new file mode 100644 index 0000000..f34c288 --- /dev/null +++ b/src/tools/mac/upload_system_symbols/upload_system_symbols.go @@ -0,0 +1,484 @@ +/* Copyright 2014 Google LLC + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +Tool upload_system_symbols generates and uploads Breakpad symbol files for OS X system libraries. + +This tool shells out to the dump_syms and symupload Breakpad tools. In its default mode, this +will find all dynamic libraries on the system, run dump_syms to create the Breakpad symbol files, +and then upload them to Google's crash infrastructure. + +The tool can also be used to only dump libraries or upload from a directory. See -help for more +information. + +Both i386 and x86_64 architectures will be dumped and uploaded. +*/ +package main + +import ( + "debug/macho" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "os/exec" + "path" + "regexp" + "strings" + "sync" + "time" +) + +var ( + breakpadTools = flag.String("breakpad-tools", "out/Release/", "Path to the Breakpad tools directory, containing dump_syms and symupload.") + uploadOnlyPath = flag.String("upload-from", "", "Upload a directory of symbol files that has been dumped independently.") + dumpOnlyPath = flag.String("dump-to", "", "Dump the symbols to the specified directory, but do not upload them.") + systemRoot = flag.String("system-root", "", "Path to the root of the Mac OS X system whose symbols will be dumped.") + dumpArchitecture = flag.String("arch", "", "The CPU architecture for which symbols should be dumped. If not specified, dumps all architectures.") + apiKey = flag.String("api-key", "", "API key to use. If this is present, the `sym-upload-v2` protocol is used.\nSee https://chromium.googlesource.com/breakpad/breakpad/+/HEAD/docs/sym_upload_v2_protocol.md or\n`symupload`'s help for more information.") +) + +var ( + // pathsToScan are the subpaths in the systemRoot that should be scanned for shared libraries. + pathsToScan = []string{ + "/System/Library/Frameworks", + "/System/Library/PrivateFrameworks", + "/usr/lib", + } + + // optionalPathsToScan is just like pathsToScan, but the paths are permitted to be absent. + optionalPathsToScan = []string{ + // Gone in 10.15. + "/Library/QuickTime", + // Not present in dumped dyld_shared_caches + "/System/Library/Components", + } + + // uploadServersV1 are the list of servers to which symbols should be + // uploaded when using the V1 protocol. + uploadServersV1 = []string{ + "https://clients2.google.com/cr/symbol", + "https://clients2.google.com/cr/staging_symbol", + } + // uploadServersV2 are the list of servers to which symbols should be + // uploaded when using the V2 protocol. + uploadServersV2 = []string{ + "https://staging-crashsymbolcollector-pa.googleapis.com", + "https://prod-crashsymbolcollector-pa.googleapis.com", + } + + // uploadServers are the list of servers that should be used, accounting + // for whether v1 or v2 protocol is used. + uploadServers = uploadServersV1 + + // blacklistRegexps match paths that should be excluded from dumping. + blacklistRegexps = []*regexp.Regexp{ + regexp.MustCompile(`/System/Library/Frameworks/Python\.framework/`), + regexp.MustCompile(`/System/Library/Frameworks/Ruby\.framework/`), + regexp.MustCompile(`_profile\.dylib$`), + regexp.MustCompile(`_debug\.dylib$`), + regexp.MustCompile(`\.a$`), + regexp.MustCompile(`\.dat$`), + } +) + +func main() { + flag.Parse() + log.SetFlags(0) + + // If `apiKey` is set, we're using the v2 protocol. + if len(*apiKey) > 0 { + uploadServers = uploadServersV2 + } + + var uq *UploadQueue + + if *uploadOnlyPath != "" { + // -upload-from specified, so handle that case early. + uq = StartUploadQueue() + uploadFromDirectory(*uploadOnlyPath, uq) + uq.Wait() + return + } + + if *systemRoot == "" { + log.Fatal("Need a -system-root to dump symbols for") + } + + if *dumpOnlyPath != "" { + // -dump-to specified, so make sure that the path is a directory. + if fi, err := os.Stat(*dumpOnlyPath); err != nil { + log.Fatalf("-dump-to location: %v", err) + } else if !fi.IsDir() { + log.Fatal("-dump-to location is not a directory") + } + } + + dumpPath := *dumpOnlyPath + if *dumpOnlyPath == "" { + // If -dump-to was not specified, then run the upload pipeline and create + // a temporary dump output directory. + uq = StartUploadQueue() + + if p, err := ioutil.TempDir("", "upload_system_symbols"); err != nil { + log.Fatalf("Failed to create temporary directory: %v", err) + } else { + dumpPath = p + defer os.RemoveAll(p) + } + } + + dq := StartDumpQueue(*systemRoot, dumpPath, uq) + dq.Wait() + if uq != nil { + uq.Wait() + } +} + +// manglePath reduces an absolute filesystem path to a string suitable as the +// base for a file name which encodes some of the original path. The result +// concatenates the leading initial from each path component except the last to +// the last path component; for example /System/Library/Frameworks/AppKit +// becomes SLFAppKit. +// Assumes ASCII. +func manglePath(path string) string { + components := strings.Split(path, "/") + n := len(components) + builder := strings.Builder{} + for i, component := range components { + if len(component) == 0 { + continue + } + if i < n-1 { + builder.WriteString(component[:1]) + } else { + builder.WriteString(component) + } + } + return builder.String() +} + +type WorkerPool struct { + wg sync.WaitGroup +} + +// StartWorkerPool will launch numWorkers goroutines all running workerFunc. +// When workerFunc exits, the goroutine will terminate. +func StartWorkerPool(numWorkers int, workerFunc func()) *WorkerPool { + p := new(WorkerPool) + for i := 0; i < numWorkers; i++ { + p.wg.Add(1) + go func() { + workerFunc() + p.wg.Done() + }() + } + return p +} + +// Wait for all the workers in the pool to complete the workerFunc. +func (p *WorkerPool) Wait() { + p.wg.Wait() +} + +type UploadQueue struct { + *WorkerPool + queue chan string +} + +// StartUploadQueue creates a new worker pool and queue, to which paths to +// Breakpad symbol files may be sent for uploading. +func StartUploadQueue() *UploadQueue { + uq := &UploadQueue{ + queue: make(chan string, 10), + } + uq.WorkerPool = StartWorkerPool(5, uq.worker) + return uq +} + +// Upload enqueues the contents of filepath to be uploaded. +func (uq *UploadQueue) Upload(filepath string) { + uq.queue <- filepath +} + +// Done tells the queue that no more files need to be uploaded. This must be +// called before WorkerPool.Wait. +func (uq *UploadQueue) Done() { + close(uq.queue) +} + +func (uq *UploadQueue) runSymUpload(symfile, server string) *exec.Cmd { + symUpload := path.Join(*breakpadTools, "symupload") + args := []string{symfile, server} + if len(*apiKey) > 0 { + args = append([]string{"-p", "sym-upload-v2", "-k", *apiKey}, args...) + } + return exec.Command(symUpload, args...) +} + +func (uq *UploadQueue) worker() { + for symfile := range uq.queue { + for _, server := range uploadServers { + for i := 0; i < 3; i++ { // Give each upload 3 attempts to succeed. + cmd := uq.runSymUpload(symfile, server) + if output, err := cmd.Output(); err == nil { + // Success. No retry needed. + fmt.Printf("Uploaded %s to %s\n", symfile, server) + break + } else if exitError, ok := err.(*exec.ExitError); ok && exitError.ExitCode() == 2 && *apiKey != "" { + // Exit code 2 in protocol v2 means the file already exists on the server. + // No point retrying. + fmt.Printf("File %s already exists on %s\n", symfile, server) + break + } else { + log.Printf("Error running symupload(%s, %s), attempt %d: %v: %s\n", symfile, server, i, err, output) + time.Sleep(1 * time.Second) + } + } + } + } +} + +type DumpQueue struct { + *WorkerPool + dumpPath string + queue chan dumpRequest + uq *UploadQueue +} + +type dumpRequest struct { + path string + arch string +} + +// StartDumpQueue creates a new worker pool to find all the Mach-O libraries in +// root and dump their symbols to dumpPath. If an UploadQueue is passed, the +// path to the symbol file will be enqueued there, too. +func StartDumpQueue(root, dumpPath string, uq *UploadQueue) *DumpQueue { + dq := &DumpQueue{ + dumpPath: dumpPath, + queue: make(chan dumpRequest), + uq: uq, + } + dq.WorkerPool = StartWorkerPool(12, dq.worker) + + findLibsInRoot(root, dq) + + return dq +} + +// DumpSymbols enqueues the filepath to have its symbols dumped in the specified +// architecture. +func (dq *DumpQueue) DumpSymbols(filepath string, arch string) { + dq.queue <- dumpRequest{ + path: filepath, + arch: arch, + } +} + +func (dq *DumpQueue) Wait() { + dq.WorkerPool.Wait() + if dq.uq != nil { + dq.uq.Done() + } +} + +func (dq *DumpQueue) done() { + close(dq.queue) +} + +func (dq *DumpQueue) worker() { + dumpSyms := path.Join(*breakpadTools, "dump_syms") + + for req := range dq.queue { + filebase := path.Join(dq.dumpPath, manglePath(req.path)) + symfile := fmt.Sprintf("%s_%s.sym", filebase, req.arch) + f, err := os.Create(symfile) + if err != nil { + log.Fatalf("Error creating symbol file: %v", err) + } + + cmd := exec.Command(dumpSyms, "-a", req.arch, req.path) + cmd.Stdout = f + err = cmd.Run() + f.Close() + + if err != nil { + os.Remove(symfile) + log.Printf("Error running dump_syms(%s, %s): %v\n", req.arch, req.path, err) + } else if dq.uq != nil { + dq.uq.Upload(symfile) + } + } +} + +// uploadFromDirectory handles the upload-only case and merely uploads all files in +// a directory. +func uploadFromDirectory(directory string, uq *UploadQueue) { + d, err := os.Open(directory) + if err != nil { + log.Fatalf("Could not open directory to upload: %v", err) + } + defer d.Close() + + entries, err := d.Readdirnames(0) + if err != nil { + log.Fatalf("Could not read directory: %v", err) + } + + for _, entry := range entries { + uq.Upload(path.Join(directory, entry)) + } + + uq.Done() +} + +// findQueue is an implementation detail of the DumpQueue that finds all the +// Mach-O files and their architectures. +type findQueue struct { + *WorkerPool + queue chan string + dq *DumpQueue +} + +// findLibsInRoot looks in all the pathsToScan in the root and manages the +// interaction between findQueue and DumpQueue. +func findLibsInRoot(root string, dq *DumpQueue) { + fq := &findQueue{ + queue: make(chan string, 10), + dq: dq, + } + fq.WorkerPool = StartWorkerPool(12, fq.worker) + + for _, p := range pathsToScan { + fq.findLibsInPath(path.Join(root, p), true) + } + + for _, p := range optionalPathsToScan { + fq.findLibsInPath(path.Join(root, p), false) + } + + close(fq.queue) + fq.Wait() + dq.done() +} + +// findLibsInPath recursively walks the directory tree, sending file paths to +// test for being Mach-O to the findQueue. +func (fq *findQueue) findLibsInPath(loc string, mustExist bool) { + d, err := os.Open(loc) + if err != nil { + if !mustExist && os.IsNotExist(err) { + return + } + log.Fatalf("Could not open %s: %v", loc, err) + } + defer d.Close() + + for { + fis, err := d.Readdir(100) + if err != nil && err != io.EOF { + log.Fatalf("Error reading directory %s: %v", loc, err) + } + + for _, fi := range fis { + fp := path.Join(loc, fi.Name()) + if fi.IsDir() { + fq.findLibsInPath(fp, true) + continue + } else if fi.Mode()&os.ModeSymlink != 0 { + continue + } + + // Test the blacklist in the worker to not slow down this main loop. + + fq.queue <- fp + } + + if err == io.EOF { + break + } + } +} + +func (fq *findQueue) worker() { + for fp := range fq.queue { + blacklisted := false + for _, re := range blacklistRegexps { + blacklisted = blacklisted || re.MatchString(fp) + } + if blacklisted { + continue + } + + f, err := os.Open(fp) + if err != nil { + log.Printf("%s: %v", fp, err) + continue + } + + fatFile, err := macho.NewFatFile(f) + if err == nil { + // The file is fat, so dump its architectures. + for _, fatArch := range fatFile.Arches { + fq.dumpMachOFile(fp, fatArch.File) + } + fatFile.Close() + } else if err == macho.ErrNotFat { + // The file isn't fat but may still be MachO. + thinFile, err := macho.NewFile(f) + if err != nil { + log.Printf("%s: %v", fp, err) + continue + } + fq.dumpMachOFile(fp, thinFile) + thinFile.Close() + } else { + f.Close() + } + } +} + +func (fq *findQueue) dumpMachOFile(fp string, image *macho.File) { + if image.Type != MachODylib && image.Type != MachOBundle && image.Type != MachODylinker { + return + } + + arch := getArchStringFromHeader(image.FileHeader) + if arch == "" { + // Don't know about this architecture type. + return + } + + if (*dumpArchitecture != "" && *dumpArchitecture == arch) || *dumpArchitecture == "" { + fq.dq.DumpSymbols(fp, arch) + } +} diff --git a/src/tools/mac/upload_system_symbols/upload_system_symbols.sh b/src/tools/mac/upload_system_symbols/upload_system_symbols.sh new file mode 100644 index 0000000..43fd98e --- /dev/null +++ b/src/tools/mac/upload_system_symbols/upload_system_symbols.sh @@ -0,0 +1,114 @@ +#!/bin/bash + +# Copyright 2023 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Finds the dyld_shared_cache on a system, extracts it, and dumps the symbols +# in Breakpad format to the directory passed as the first argument +# The script must be in the same directory as `dump_syms`, +# `upload_system_symbols` and `dsc_extractor` binaries. +# Exits with 0 if all supported architectures for this OS version were found and +# dumped, and nonzero otherwise. + +set -ex + +if [[ $# -ne 1 ]]; then + echo "usage: $0 " >& 2 + exit 1 +fi + +destination_dir="$1" + +dir="$(dirname "$0")" +dir="$(cd "${dir}"; pwd)" +major_version=$(sw_vers -productVersion | cut -d . -f 1) +if [[ "${major_version}" -lt 13 ]]; then + dsc_directory="/System/Library/dyld" +else + dsc_directory="/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld" +fi + +working_dir=$(mktemp -d) +mkdir "${destination_dir}" +trap 'rm -rf "${working_dir}" "${destination_dir}"' EXIT + +architectures=(x86_64h) +missing_architectures=() +# macOS >= 13 on arm64 still has a x86_64 cache for Rosetta. +if [[ "${major_version}" -lt 13 ]] || [[ $(uname -p) == "arm" ]]; then + architectures+=( x86_64 ) +fi +if [[ "${major_version}" -ge 11 ]]; then + architectures+=( arm64e ) +fi + +for arch in "${architectures[@]}"; do + cache="${dsc_directory}/dyld_shared_cache_${arch}" + if [[ ! -f "${cache}" ]]; then + missing_architectures+=("${arch}") + continue + fi + "${dir}/dsc_extractor" \ + "${cache}" \ + "${working_dir}/${arch}" + "${dir}/upload_system_symbols" \ + --breakpad-tools="${dir}" \ + --system-root="${working_dir}/${arch}" \ + --dump-to="${destination_dir}" +done +if [[ "${#missing_architectures[@]}" -eq "${#architectures[@]}" ]]; then + echo "Couldn't locate dyld_shared_cache for any architectures" >& 2 + echo "in ${dsc_directory}. Exiting." >& 2 + exit 1 +fi + +rm -rf "${working_dir}" +# We have results now, so let's keep `destination_dir`. +trap '' EXIT + +"${dir}/upload_system_symbols" \ + --breakpad-tools="${dir}" \ + --system-root=/ \ + --dump-to="${destination_dir}" + +set +x +echo +echo "Dumped!" +echo "To upload, run:" +echo +echo "'${dir}/upload_system_symbols'" \\ +echo " --breakpad-tools='${dir}'" \\ +echo " --api-key=" \\ +echo " --upload-from='${destination_dir}'" + +if [[ "${#missing_architectures[@]}" -gt 0 ]]; then + echo "dyld_shared_cache not found for architecture(s):" >& 2 + echo " " "${missing_architectures[@]}" >& 2 + echo "You'll need to get symbols for them elsewhere." >& 2 + exit 1 +fi diff --git a/src/tools/python/deps-to-manifest.py b/src/tools/python/deps-to-manifest.py new file mode 100644 index 0000000..b614f94 --- /dev/null +++ b/src/tools/python/deps-to-manifest.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +# Copyright 2016 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Convert gclient's DEPS file to repo's manifest xml file.""" + +import argparse +import os +import sys + + +REMOTES = { + 'chromium': 'https://chromium.googlesource.com/', + 'github': 'https://github.com/', +} +REVIEWS = { + 'chromium': 'https://chromium-review.googlesource.com', +} + +MANIFEST_HEAD = """ + + + + +""" + +MANIFEST_REMOTE = """ + +""" + +MANIFEST_PROJECT = """ + +""" + +MANIFEST_TAIL = """ + +""" + + +def ConvertDepsToManifest(deps, manifest): + """Convert the |deps| file to the |manifest|.""" + # Load the DEPS file data. + ctx = {} + with open(deps, 'rb') as file: + exec(compile(file.read(), deps, 'exec'), ctx) + + new_contents = '' + + # Write out the common header. + data = { + 'prog': os.path.basename(__file__), + } + new_contents += MANIFEST_HEAD % data + + # Write out the sections. + for name, fetch in REMOTES.items(): + data = { + 'name': name, + 'fetch': fetch, + 'review': REVIEWS.get(name, ''), + } + new_contents += MANIFEST_REMOTE % data + + # Write out the main repo itself. + data = { + 'path': 'src', + 'name': 'breakpad/breakpad', + 'revision': 'refs/heads/main', + 'remote': 'chromium', + } + new_contents += MANIFEST_PROJECT % data + + # Write out the sections. + for path, url in ctx['deps'].items(): + for name, fetch in REMOTES.items(): + if url.startswith(fetch): + remote = name + break + else: + raise ValueError('Unknown DEPS remote: %s: %s' % (path, url)) + + # The DEPS url will look like: + # https://chromium.googlesource.com/external/gyp/@e8ab0833a42691cd2 + remote_path, rev = url.split('@') + remote_path = remote_path[len(fetch):] + + # If it's not a revision, assume it's a tag. Repo wants full ref names. + if len(rev) != 40: + rev = 'refs/tags/%s' % rev + + data = { + 'path': path, + 'name': remote_path, + 'revision': rev, + 'remote': remote, + } + new_contents += MANIFEST_PROJECT % data + + # Write out the common footer. + new_contents += MANIFEST_TAIL + + # See if the manifest has actually changed contents to avoid thrashing. + try: + old_contents = open(manifest).read() + except IOError: + # In case the file doesn't exist yet. + old_contents = '' + if old_contents != new_contents: + print('Updating %s due to changed %s' % (manifest, deps)) + with open(manifest, 'w') as fp: + fp.write(new_contents) + + +def GetParser(): + """Return a CLI parser.""" + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('deps', + help='The DEPS file to convert') + parser.add_argument('manifest', + help='The manifest xml to generate') + return parser + + +def main(argv): + """The main func!""" + parser = GetParser() + opts = parser.parse_args(argv) + ConvertDepsToManifest(opts.deps, opts.manifest) + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/src/tools/python/filter_syms.py b/src/tools/python/filter_syms.py new file mode 100644 index 0000000..8537769 --- /dev/null +++ b/src/tools/python/filter_syms.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python3 +# Copyright 2012 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Normalizes and de-duplicates paths within Breakpad symbol files. + +When using DWARF for storing debug symbols, some file information will be +stored relative to the current working directory of the current compilation +unit, and may be further relativized based upon how the file was #included. + +This helper can be used to parse the Breakpad symbol file generated from such +DWARF files and normalize and de-duplicate the FILE records found within, +updating any references to the FILE records in the other record types. +""" + +import ntpath +import optparse +import os +import posixpath +import sys + +class BreakpadParseError(Exception): + """Unsupported Breakpad symbol record exception class.""" + pass + +class SymbolFileParser(object): + """Parser for Breakpad symbol files. + + The format of these files is documented at + https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/symbol_files.md + """ + + def __init__(self, input_stream, output_stream, ignored_prefixes=None, + path_handler=os.path): + """Inits a SymbolFileParser to read symbol records from |input_stream| and + write the processed output to |output_stream|. + + |ignored_prefixes| contains a list of optional path prefixes that + should be stripped from the final, normalized path outputs. + + For example, if the Breakpad symbol file had all paths starting with a + common prefix, such as: + FILE 1 /b/build/src/foo.cc + FILE 2 /b/build/src/bar.cc + Then adding "/b/build/src" as an ignored prefix would result in an output + file that contained: + FILE 1 foo.cc + FILE 2 bar.cc + + Note that |ignored_prefixes| does not necessarily contain file system + paths, as the contents of the DWARF DW_AT_comp_dir attribute is dependent + upon the host system and compiler, and may contain additional information + such as hostname or compiler version. + """ + + self.unique_files = {} + self.duplicate_files = {} + self.input_stream = input_stream + self.output_stream = output_stream + self.ignored_prefixes = ignored_prefixes or [] + self.path_handler = path_handler + + def Process(self): + """Processes the Breakpad symbol file.""" + for line in self.input_stream: + parsed = self._ParseRecord(line.rstrip()) + if parsed: + self.output_stream.write(parsed + '\n') + + def _ParseRecord(self, record): + """Parses a single Breakpad symbol record - a single line from the symbol + file. + + Returns: + The modified string to write to the output file, or None if no line + should be written. + """ + record_type = record.partition(' ')[0] + if record_type == 'FILE': + return self._ParseFileRecord(record) + elif self._IsLineRecord(record_type): + return self._ParseLineRecord(record) + else: + # Simply pass the record through unaltered. + return record + + def _NormalizePath(self, path): + """Normalizes a file path to its canonical form. + + As this may not execute on the machine or file system originally + responsible for compilation, it may be necessary to further correct paths + for symlinks, junctions, or other such file system indirections. + + Returns: + A unique, canonical representation for the the file path. + """ + return self.path_handler.normpath(path) + + def _AdjustPath(self, path): + """Adjusts the supplied path after performing path de-duplication. + + This may be used to perform secondary adjustments, such as removing a + common prefix, such as "/D/build", or replacing the file system path with + information from the version control system. + + Returns: + The actual path to use when writing the FILE record. + """ + return path[len(next(filter(path.startswith, + self.ignored_prefixes + ['']))):] + + def _ParseFileRecord(self, file_record): + """Parses and corrects a FILE record.""" + file_info = file_record[5:].split(' ', 3) + if len(file_info) > 2: + raise BreakpadParseError('Unsupported FILE record: ' + file_record) + file_index = int(file_info[0]) + file_name = self._NormalizePath(file_info[1]) + existing_file_index = self.unique_files.get(file_name) + if existing_file_index is None: + self.unique_files[file_name] = file_index + file_info[1] = self._AdjustPath(file_name) + return 'FILE ' + ' '.join(file_info) + else: + self.duplicate_files[file_index] = existing_file_index + return None + + def _IsLineRecord(self, record_type): + """Determines if the current record type is a Line record""" + try: + line = int(record_type, 16) + except (ValueError, TypeError): + return False + return True + + def _ParseLineRecord(self, line_record): + """Parses and corrects a Line record.""" + line_info = line_record.split(' ', 5) + if len(line_info) > 4: + raise BreakpadParseError('Unsupported Line record: ' + line_record) + file_index = int(line_info[3]) + line_info[3] = str(self.duplicate_files.get(file_index, file_index)) + return ' '.join(line_info) + +def main(): + option_parser = optparse.OptionParser() + option_parser.add_option("-p", "--prefix", + action="append", dest="prefixes", type="string", + default=[], + help="A path prefix that should be removed from " + "all FILE lines. May be repeated to specify " + "multiple prefixes.") + option_parser.add_option("-t", "--path_type", + action="store", type="choice", dest="path_handler", + choices=['win32', 'posix'], + help="Indicates how file paths should be " + "interpreted. The default is to treat paths " + "the same as the OS running Python (eg: " + "os.path)") + options, args = option_parser.parse_args() + if args: + option_parser.error('Unknown argument: %s' % args) + + path_handler = { 'win32': ntpath, + 'posix': posixpath }.get(options.path_handler, os.path) + try: + symbol_parser = SymbolFileParser(sys.stdin, sys.stdout, options.prefixes, + path_handler) + symbol_parser.Process() + except BreakpadParseError as e: + print >> sys.stderr, 'Got an error while processing symbol file' + print >> sys.stderr, str(e) + return 1 + return 0 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/tools/python/tests/filter_syms_unittest.py b/src/tools/python/tests/filter_syms_unittest.py new file mode 100644 index 0000000..f6364b8 --- /dev/null +++ b/src/tools/python/tests/filter_syms_unittest.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +# Copyright 2012 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unit tests for filter_syms.py""" + +import io +import ntpath +import os +import sys +import unittest + +ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, os.path.join(ROOT_DIR, '..')) + +# In root +import filter_syms + +class FilterSysmsTest(unittest.TestCase): + def assertParsed(self, input_data, ignored_prefixes, expected): + input_io = io.StringIO(input_data) + output_io = io.StringIO() + parser = filter_syms.SymbolFileParser(input_io, output_io, + ignored_prefixes, ntpath) + parser.Process() + self.assertEqual(output_io.getvalue(), expected) + + def testDuplicateFiles(self): + """Tests that duplicate files in FILE records are correctly removed and + that Line records are updated.""" + + INPUT = \ +"""MODULE windows x86 111111111111111111111111111111111 module1.pdb +INFO CODE_ID FFFFFFFF module1.exe +FILE 1 foo/../file1_1.cc +FILE 2 bar/../file1_1.cc +FILE 3 baz/../file1_1.cc +FUNC 1000 c 0 Function1_1 +1000 8 45 2 +1008 4 46 3 +100c 4 44 1 +""" + EXPECTED_OUTPUT = \ +"""MODULE windows x86 111111111111111111111111111111111 module1.pdb +INFO CODE_ID FFFFFFFF module1.exe +FILE 1 file1_1.cc +FUNC 1000 c 0 Function1_1 +1000 8 45 1 +1008 4 46 1 +100c 4 44 1 +""" + self.assertParsed(INPUT, [], EXPECTED_OUTPUT) + + def testIgnoredPrefix(self): + """Tests that prefixes in FILE records are correctly removed.""" + + INPUT = \ +"""MODULE windows x86 111111111111111111111111111111111 module1.pdb +INFO CODE_ID FFFFFFFF module1.exe +FILE 1 /src/build/foo/../file1_1.cc +FILE 2 /src/build/bar/../file1_2.cc +FILE 3 /src/build/baz/../file1_2.cc +FUNC 1000 c 0 Function1_1 +1000 8 45 2 +1008 4 46 3 +100c 4 44 1 +""" + EXPECTED_OUTPUT = \ +"""MODULE windows x86 111111111111111111111111111111111 module1.pdb +INFO CODE_ID FFFFFFFF module1.exe +FILE 1 file1_1.cc +FILE 2 file1_2.cc +FUNC 1000 c 0 Function1_1 +1000 8 45 2 +1008 4 46 2 +100c 4 44 1 +""" + IGNORED_PREFIXES = ['\\src\\build\\'] + self.assertParsed(INPUT, IGNORED_PREFIXES, EXPECTED_OUTPUT) + + def testIgnoredPrefixesDuplicateFiles(self): + """Tests that de-duplication of FILE records happens BEFORE prefixes + are removed.""" + + INPUT = \ +"""MODULE windows x86 111111111111111111111111111111111 module1.pdb +INFO CODE_ID FFFFFFFF module1.exe +FILE 1 /src/build/foo/../file1_1.cc +FILE 2 /src/build/bar/../file1_2.cc +FILE 3 D:/src/build2/baz/../file1_2.cc +FUNC 1000 c 0 Function1_1 +1000 8 45 2 +1008 4 46 3 +100c 4 44 1 +""" + EXPECTED_OUTPUT = \ +"""MODULE windows x86 111111111111111111111111111111111 module1.pdb +INFO CODE_ID FFFFFFFF module1.exe +FILE 1 file1_1.cc +FILE 2 file1_2.cc +FILE 3 file1_2.cc +FUNC 1000 c 0 Function1_1 +1000 8 45 2 +1008 4 46 3 +100c 4 44 1 +""" + IGNORED_PREFIXES = ['\\src\\build\\', 'D:\\src\\build2\\'] + self.assertParsed(INPUT, IGNORED_PREFIXES, EXPECTED_OUTPUT) + +if __name__ == '__main__': + unittest.main() diff --git a/src/tools/solaris/dump_syms/Makefile b/src/tools/solaris/dump_syms/Makefile new file mode 100644 index 0000000..c5f4824 --- /dev/null +++ b/src/tools/solaris/dump_syms/Makefile @@ -0,0 +1,63 @@ +# Copyright 2007 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Author: Alfred Peng + +CXX=CC +CC=cc + +CXXFLAGS=-g -xs -xdebugformat=stabs -I../../.. -I../../../common/solaris -lelf -ldemangle -D_REENTRANT + +.PHONY:all clean + +BIN=dump_syms + +all:$(BIN) + +DUMP_OBJ=dump_symbols.o guid_creator.o dump_syms.o file_id.o md5.o + +dump_syms:$(DUMP_OBJ) + $(CXX) $(CXXFLAGS) -o $@ $^ + +dump_symbols.o:../../../common/solaris/dump_symbols.cc + $(CXX) $(CXXFLAGS) -c $^ + +guid_creator.o:../../../common/solaris/guid_creator.cc + $(CXX) $(CXXFLAGS) -c $^ + +file_id.o:../../../common/solaris/file_id.cc + $(CXX) $(CXXFLAGS) -c $^ + +md5.o:../../../common/md5.cc + $(CXX) $(CXXFLAGS) -c $^ + +test:all + ./run_regtest.sh + +clean: + rm -f $(BIN) $(DUMP_OBJ) diff --git a/src/tools/solaris/dump_syms/dump_syms.cc b/src/tools/solaris/dump_syms/dump_syms.cc new file mode 100644 index 0000000..ead1600 --- /dev/null +++ b/src/tools/solaris/dump_syms/dump_syms.cc @@ -0,0 +1,57 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Alfred Peng + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include "common/solaris/dump_symbols.h" + +using namespace google_breakpad; + +int main(int argc, char** argv) { + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char* binary = argv[1]; + + DumpSymbols dumper; + if (!dumper.WriteSymbolFile(binary, fileno(stdout))) { + fprintf(stderr, "Failed to write symbol file.\n"); + return 1; + } + + return 0; +} diff --git a/src/tools/solaris/dump_syms/run_regtest.sh b/src/tools/solaris/dump_syms/run_regtest.sh new file mode 100644 index 0000000..27710d9 --- /dev/null +++ b/src/tools/solaris/dump_syms/run_regtest.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +# Copyright 2007 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +./dump_syms testdata/dump_syms_regtest.o > testdata/dump_syms_regtest.new +status=$? + +if [ $status -ne 0 ] ; then + echo "FAIL, dump_syms failed" + exit $status +fi + +diff -u testdata/dump_syms_regtest.new testdata/dump_syms_regtest.sym > \ + testdata/dump_syms_regtest.diff +status=$? + +if [ $status -eq 0 ] ; then + rm testdata/dump_syms_regtest.diff testdata/dump_syms_regtest.new + echo "PASS" +else + echo "FAIL, see testdata/dump_syms_regtest.[new|diff]" +fi + +exit $status diff --git a/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc b/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc new file mode 100644 index 0000000..fb6c883 --- /dev/null +++ b/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc @@ -0,0 +1,67 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ./dump_syms dump_syms_regtest.pdb > dump_syms_regtest.sym + +#ifdef HAVE_CONFIG_H +#include +#endif + +namespace google_breakpad { + +class C { + public: + C() : member_(1) {} + virtual ~C() {} + + void set_member(int value) { member_ = value; } + int member() const { return member_; } + + void f() { member_ = g(); } + virtual int g() { return 2; } + static char* h(const C& that) { return 0; } + + private: + int member_; +}; + +static int i() { + return 3; +} + +} // namespace google_breakpad + +int main(int argc, char** argv) { + google_breakpad::C object; + object.set_member(google_breakpad::i()); + object.f(); + int value = object.g(); + char* nothing = object.h(object); + + return 0; +} diff --git a/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs b/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs new file mode 100644 index 0000000..c5f93ef --- /dev/null +++ b/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs @@ -0,0 +1,129 @@ + + +Debugging Stab table -- 104 entries + + 0: .stabs "dump_syms_regtest.cc",N_UNDF,0x0,0x67,0x71c + 1: .stabs "/export/home/alfred/cvs/breakpad/google-breakpad20070927/src/tools/solaris/dump_syms/testdata/",N_SO,0x0,0x0,0x0 + 2: .stabs "dump_syms_regtest.cc",N_SO,0x0,0x4,0x0 + 3: .stabs "",N_OBJ,0x0,0x0,0x0 + 4: .stabs "",N_OBJ,0x0,0x0,0x0 + 5: .stabs "V=9.0;DBG_GEN=5.0.8;dm;cd;backend;ptf;ptx;ptk;s;g;R=5.8<>;G=.XAB6Z2hOiL$Gl1b.;A=2",N_OPT,0x0,0x0,0x46fcb88e + 6: .stabs "dump_syms_regtest.cc",N_SOL,0x0,0x0,0x0 + 7: .stabs "char:t(0,1)=bsc1;0;8",N_ISYM,0x0,0x0,0x0 + 8: .stabs "short:t(0,2)=bs2;0;16",N_ISYM,0x0,0x0,0x0 + 9: .stabs "int:t(0,3)=bs4;0;32",N_ISYM,0x0,0x0,0x0 + 10: .stabs "long:t(0,4)=bs4;0;32",N_ISYM,0x0,0x0,0x0 + 11: .stabs "long long:t(0,5)=bs8;0;64",N_ISYM,0x0,0x0,0x0 + 12: .stabs "unsigned char:t(0,6)=buc1;0;8",N_ISYM,0x0,0x0,0x0 + 13: .stabs "unsigned short:t(0,7)=bu2;0;16",N_ISYM,0x0,0x0,0x0 + 14: .stabs "unsigned:t(0,8)=bu4;0;32",N_ISYM,0x0,0x0,0x0 + 15: .stabs "unsigned long:t(0,9)=bu4;0;32",N_ISYM,0x0,0x0,0x0 + 16: .stabs "unsigned long long:t(0,10)=bu8;0;64",N_ISYM,0x0,0x0,0x0 + 17: .stabs "signed char:t(0,11)=bsc1;0;8",N_ISYM,0x0,0x0,0x0 + 18: .stabs "wchar_t:t(0,12)=buc4;0;32",N_ISYM,0x0,0x0,0x0 + 19: .stabs "void:t(0,13)=bs0;0;0",N_ISYM,0x0,0x0,0x0 + 20: .stabs "float:t(0,14)=R1;4",N_ISYM,0x0,0x0,0x0 + 21: .stabs "double:t(0,15)=R2;8",N_ISYM,0x0,0x0,0x0 + 22: .stabs "long double:t(0,16)=R6;12",N_ISYM,0x0,0x0,0x0 + 23: .stabs "...:t(0,17)=buv4;0;32",N_ISYM,0x0,0x0,0x0 + 24: .stabs "bool:t(0,18)=bub1;0;8",N_ISYM,0x0,0x0,0x0 + 25: .stabs "__1nPgoogle_breakpad_:T(0,19)=Yn0google_breakpad;",N_ISYM,0x0,0x0,0x0 + 26: .stabs "nBC(0,19):U(0,20)",N_ESYM,0x0,0x0,0x0 + 27: .stabs "nBC(0,19):T(0,20)=Yc8C;;AcHmember_:(0,3),32,32;;Cc2t6M_v K2c2T6M_v CcKset_member6Mi_v CcGmember6kM_i CcBf6M_v K3cBg6M_i GcBh6Frk1_pc;;;2 0;;;;110;",N_ESYM,0x0,0x8,0x0 + 28: .stabs "main:F(0,3);(0,3);(0,21)=*(0,22)=*(0,1)",N_FUN,0x0,0x38,0x0 + 29: .stabs "main",N_MAIN,0x0,0x0,0x0 + 30: .stabs "argc:p(0,3)",N_PSYM,0x0,0x4,0x8 + 31: .stabs "argv:p(0,21)",N_PSYM,0x0,0x4,0xc + 32: .stabn N_LBRAC,0x0,0x1,0x12 + 33: .stabs "object:(0,20)",N_LSYM,0x0,0x8,0xfffffff4 + 34: .stabs "value:(0,3)",N_LSYM,0x0,0x4,0xfffffff0 + 35: .stabs "nothing:(0,22)",N_LSYM,0x0,0x4,0xffffffec + 36: .stabn N_SLINE,0x0,0x39,0x12 + 37: .stabs "object:2",N_CONSTRUCT,0x0,0xc,0x12 + 38: .stabn N_SLINE,0x2,0x3a,0x1e + 39: .stabn N_SLINE,0x0,0x3b,0x36 + 40: .stabn N_SLINE,0x0,0x3c,0x42 + 41: .stabn N_SLINE,0x0,0x3d,0x57 + 42: .stabn N_SLINE,0x0,0x3f,0x6c + 43: .stabs "2:0",N_DESTRUCT,0x0,0xc,0x73 + 44: .stabn N_SLINE,0xfffffffe,0x40,0x9c + 45: .stabn N_RBRAC,0x0,0x1,0x9c + 46: .stabs "__1cPgoogle_breakpadBi6F_i_:f(0,3)",N_FUN,0x0,0x32,0x0 + 47: .stabn N_LBRAC,0x0,0x1,0x6 + 48: .stabn N_SLINE,0x0,0x33,0x6 + 49: .stabn N_SLINE,0x0,0x34,0x10 + 50: .stabn N_RBRAC,0x0,0x1,0x10 + 51: .stabs "__1cPgoogle_breakpadBC2t6M_v_:F(0,13);(0,23)=*(0,20)",N_FUN,0x0,0x24,0x0 + 52: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 53: .stabn N_LBRAC,0x0,0x1,0x3 + 54: .stabn N_SLINE,0x0,0x24,0x25 + 55: .stabn N_RBRAC,0x0,0x1,0x25 + 56: .stabs "__1cPgoogle_breakpadBC2T6M_v_:F(0,13);(0,23)",N_FUN,0x0,0x25,0x0 + 57: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 58: .stabn N_LBRAC,0x0,0x1,0x3 + 59: .stabn N_SLINE,0x0,0x25,0x3 + 60: .stabn N_RBRAC,0x0,0x1,0x3 + 61: .stabs "__1cPgoogle_breakpadBCKset_member6Mi_v_:F(0,13);(0,23);(0,3)",N_FUN,0x0,0x27,0x0 + 62: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 63: .stabs "value:p(0,3)",N_PSYM,0x0,0x4,0xc + 64: .stabn N_LBRAC,0x0,0x1,0x3 + 65: .stabn N_SLINE,0x0,0x27,0x3 + 66: .stabn N_SLINE,0x0,0x27,0xc + 67: .stabn N_RBRAC,0x0,0x1,0xc + 68: .stabs "__1cPgoogle_breakpadBCBf6M_v_:F(0,13);(0,23)",N_FUN,0x0,0x2a,0x0 + 69: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 70: .stabn N_LBRAC,0x0,0x1,0x3 + 71: .stabn N_SLINE,0x0,0x2a,0x3 + 72: .stabn N_SLINE,0x0,0x2a,0x1d + 73: .stabn N_RBRAC,0x0,0x1,0x1d + 74: .stabs "__1cPgoogle_breakpadBCBg6M_i_:F(0,3);(0,23)",N_FUN,0x0,0x2b,0x0 + 75: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 76: .stabn N_LBRAC,0x0,0x1,0x6 + 77: .stabn N_SLINE,0x0,0x2b,0x6 + 78: .stabn N_SLINE,0x0,0x2b,0x10 + 79: .stabn N_RBRAC,0x0,0x1,0x10 + 80: .stabs "__1cPgoogle_breakpadBCBh6Frk1_pc_:F(0,22);(0,24)=&(0,25)=k(0,20)",N_FUN,0x0,0x2c,0x0 + 81: .stabs "that:p(0,24)",N_PSYM,0x0,0x4,0x8 + 82: .stabn N_LBRAC,0x0,0x1,0x6 + 83: .stabn N_SLINE,0x0,0x2c,0x6 + 84: .stabn N_SLINE,0x0,0x2c,0x10 + 85: .stabn N_RBRAC,0x0,0x1,0x10 + 86: .stabs "__1cPgoogle_breakpadBC2T5B6M_v_:F(0,13);(0,23)",N_FUN,0x0,0x25,0x0 + 87: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 88: .stabn N_LBRAC,0x0,0x1,0x3 + 89: .stabn N_SLINE,0x0,0x25,0xf + 90: .stabn N_RBRAC,0x0,0x1,0xf + 91: .stabs "__SLIP.DELETER__A:f(0,13);(0,23);(0,3)",N_FUN,0x0,0x25,0x0 + 92: .stabs "this:p(0,23)",N_PSYM,0x0,0x4,0x8 + 93: .stabs "delete:p(0,3)",N_PSYM,0x0,0x4,0xc + 94: .stabn N_LBRAC,0x0,0x1,0x3 + 95: .stabn N_LBRAC,0x0,0x2,0x3 + 96: .stabn N_RBRAC,0x0,0x2,0x28 + 97: .stabn N_RBRAC,0x0,0x1,0x28 + 98: .stabs "true:l(0,18);1",N_LSYM,0x0,0x4,0x0 + 99: .stabs "false:l(0,18);0",N_LSYM,0x0,0x4,0x0 + 100: .stabs "__1c2k6Fpv_v_:P(0,13);(0,26)=*(0,13)",N_FUN,0x0,0x0,0x0 + 101: .stabs "__1cPgoogle_breakpadBC2t5B6M_v_:F__1cPgoogle_breakpadBC2t6M_v_",N_ALIAS,0x0,0x0,0x0 + 102: .stabs "cbD__RTTI__1nPgoogle_breakpadBC_(0,19):YR(0,20)",N_LSYM,0x0,0x0,0x0 + 103: .stabn N_ENDM,0x0,0x0,0x0 + + +Index Stab table -- 17 entries + + 0: .stabs "dump_syms_regtest.cc",N_UNDF,0x0,0x10,0x3b1 + 1: .stabs "/export/home/alfred/cvs/breakpad/google-breakpad20070927/src/tools/solaris/dump_syms/testdata/",N_SO,0x0,0x0,0x0 + 2: .stabs "dump_syms_regtest.cc",N_SO,0x0,0x4,0x0 + 3: .stabs "/export/home/alfred/cvs/breakpad/google-breakpad20070927/src/tools/solaris/dump_syms/testdata",N_OBJ,0x0,0x0,0x0 + 4: .stabs "dump_syms_regtest.o",N_OBJ,0x0,0x0,0x0 + 5: .stabs "V=9.0;DBG_GEN=5.0.8;dm;cd;backend;ptf;ptx;ptk;s;g;R=5.8<>;G=.XAB6Z2hOiL$Gl1b.;A=2",N_OPT,0x0,0x0,0x46fcb88e + 6: .stabs "/export/home/alfred/cvs/breakpad/google-breakpad20070927/src/tools/solaris/dump_syms/testdata/; /ws/on10-tools-prc/SUNWspro/SS11/prod/bin/CC -g -xs -xdebugformat=stabs -I../../.. -I../../../common/solaris -D_REENTRANT -xs dump_syms_regtest.cc -Qoption ccfe -prefix -Qoption ccfe .XAB6Z2hOiL\$Gl1b.",N_CMDLINE,0x0,0x0,0x0 + 7: .stabs "__1nPgoogle_breakpadBC_:U",N_ESYM,0x0,0x0,0x0 + 8: .stabs "main",N_MAIN,0x0,0x0,0x0 + 9: .stabs "main",N_FUN,0x0,0x0,0x0 + 10: .stabs "__1cPgoogle_breakpadBC2t6M_v_",N_FUN,0x0,0x0,0x0 + 11: .stabs "__1cPgoogle_breakpadBC2T6M_v_",N_FUN,0x0,0x0,0x0 + 12: .stabs "__1cPgoogle_breakpadBCKset_member6Mi_v_",N_FUN,0x0,0x0,0x0 + 13: .stabs "__1cPgoogle_breakpadBCBf6M_v_",N_FUN,0x0,0x0,0x0 + 14: .stabs "__1cPgoogle_breakpadBCBg6M_i_",N_FUN,0x0,0x0,0x0 + 15: .stabs "__1cPgoogle_breakpadBCBh6Frk1_pc_",N_FUN,0x0,0x0,0x0 + 16: .stabs "__1cPgoogle_breakpadBC2T5B6M_v_",N_FUN,0x0,0x0,0x0 diff --git a/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym b/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym new file mode 100644 index 0000000..44d3c53 --- /dev/null +++ b/src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym @@ -0,0 +1,33 @@ +MODULE solaris x86 3DC8191474338D8587339B5FB3E2C62A0 dump_syms_regtest.o +FILE 0 dump_syms_regtest.cc +FUNC 0 156 0 main +12 18 57 0 +1e 12 58 0 +36 24 59 0 +42 12 60 0 +57 21 61 0 +6c 21 63 0 +9c 48 64 0 +FUNC 0 16 0 int google_breakpad::i() +6 6 51 0 +10 10 52 0 +FUNC 0 37 0 google_breakpad::C::C() +25 37 36 0 +FUNC 0 3 0 google_breakpad::C::~C() +3 3 37 0 +FUNC 0 12 0 void google_breakpad::C::set_member(int) +3 3 39 0 +c 9 39 0 +FUNC 0 29 0 void google_breakpad::C::f() +3 3 42 0 +1d 26 42 0 +FUNC 0 16 0 int google_breakpad::C::g() +6 6 43 0 +10 10 43 0 +FUNC 0 16 0 char*google_breakpad::C::h(const google_breakpad::C&) +6 6 44 0 +10 10 44 0 +FUNC 0 15 0 google_breakpad::C::~C #Nvariant 1() +f 15 37 0 +FUNC 0 0 0 __SLIP.DELETER__A +FUNC 0 0 0 void operator delete(void*) diff --git a/src/tools/windows/binaries/dump_syms.exe b/src/tools/windows/binaries/dump_syms.exe new file mode 100644 index 0000000000000000000000000000000000000000..3a2dfd8e50446d0d1e16a0ab16ec7e00fc2a6cda GIT binary patch literal 141824 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
    Y+zAJ@V;6gt>GvJ(e3Jd64~J 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
    J6NrMnu@PV<}+&8A$ACfm`m;d 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Óg{4M#2Ksq> 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 ngK=quk%{e&gs~ZIYyB1&itN zI>BbxPOH}T*mFGR=xO__ziLlu>ruSaCIkr<<>IA9v8`=wyVJo6ULYtk?|1EIazX9o zyr1`de}BAuK4kW@pM6<-?X}llYwfl6GxxK1*c>*S&B^~<&Su-nul%bpfB()OyUjM? ztj8zV9zNx{v$xvopF4X&{D#ipijFV-Q^$2*2!8&$n{N7IBKW!MgB{76f;Ze0th%N# z_=PVnz5c>ePaPM^H~sEaPd)#m@ZOC>|HnLf_Qof99`oqA8$V@!&)N78zY98E+VB&8 zHz!}%@ICYU(uS{@-xoK0gWu&Zp0V*het#6+x3PrZQ1ayskMMhL@}iAf%=7abk`-5Y}?)?SH^yX->>pJ>R$y2xzH+RD>{Q0_d!u^e!GOSM*dZR#tZ*x*$qoOZMNew z)*jwVQ+Ir%T*ZZn<&?77PLV%*^X2aPNV%R1J32c)PZ5JVaA?}Q`y=HlF6_8|`4=fD zxU_*&+d2Gx^CRWvko*6ue~-QPV5Loe`97O1-gwU(n?3~w(9#!QBIyqvHR*qn^kFM~ zv!wrE(vL0v0X6HS<}H%D$IA8onB2E}$lWBlkD1(OhyQKWk5}6IGF2gWwB43VguL=! z|1rnE70z6VZY{CfQrrD~F_j3p+U@#B)9tpFOnu1R&~A%G^-qTje#R=;Ds6eKwtTc@ z{_AfJ7uzJop2?-Q2R8M1>U#SWJv(}$lyu8~eH=(r+ueO?LC9J9%(C)vi7By6N5L{x zklI$TEYh2NSN%M^d*88EW!2r(lN>`E&c4x&eC64EBlRKYre~6l(w@H5&Rps9M;Sw; zw{y(E)_=FzJU^@txi+i~xowHFHy)EU*D)QU_^G&2`gY(i_>ia?HRtudvhJTyMUefU0&qa8^>Qy5o_ZoxctDrUsoI zucQXgT{$NEf|~1U(DQ#tYfJi42c!3|xUbSyx;{{*@x1iuxh&A^-bUI9l^%%l<4Z3N z`J(X$mR3roP;T-HQ#>&bta(+PTSZ--M|-2a1KtMDquZjrfA&&o=KT0WRA~1{^#vz# zxze6xz}LZxs;K@P8L90-^_;X`9Mw^J{E6K_win1Y_bpQOp@nU&OG=;BEB;F+BHFj{ z;8u9q&``TV5A)R6q#g=wClOPJsa@Qx-qWjn)*u5qMpF%R5Qy@wOrJBEmiJ31?Y1Ka z+U=(w&}m9+=(Bq^Z3Z)$uFzIES2XT~kL4yi?-P_HI?3L`TgWlKo$>IvT}tI9yQ~89 zQ%gfW$(B;_XDK3s3Pg32p=LK|y+}|^$20XGrdxR5ykDQ-HMJh5R!g+&fM?Tfr1XOk z*2atjncG7T$m7G80N3rIdnH{^X3}>^dY9zaht}#d%S|GoFSinlwcAQ8(8o!D#=1?< zBnp+iAs2PE+u8-mW%|ysyt>_BZgU@KUId<9Kd{+0ZWkQ)>21ezxt3@iI<+UNe@KNU zGlD&gVDtWgMXW|4;@1Z^9%QAAnwOnCr9vTFiUpo)R7>2k=F%Jl6sS$Da}{{LdN=Qt z`-!bR@k*Q8w@j5Ri_A!#xop#s#N=ga1?#h;An8f6NV9FNG6kC+q}e|# z=>yTl`kpa7>?OHEU%!sBM@SaMV4pAYg0xqkNg`fy12ie+AUEQ#EM97 zVtjip)}VH3H}F%R+!B3C3=gOVoPWtp&yr9PFi5{GOpUzHm|-|4bXe zFH-L)2n63l@C$Ov*(nlL@%x6_IPau38fk+?>jsQRjtLk%c-3zGJxYy0aTQP5sg3b1 zG{UUEe7>3Ww+GFvm-aw2%Y|m3lZEL-D6V!1^(@p^F|e+l#1-+9_WayEBp?r?@E7nG zW@#bNyW4Z^HkrI@7=E61O7!y-mwqd#Pruh${oZ2rOULSG3#H6;4%{<{@3-%3YjV=CtXk z!GgQBuaS034>YT_A#eK3bgMJn>e`e`oZD`1w>Rq-fwZ|XnsJw<3)3~u^gNfI`3s>0 zzkR*4P3>r1w9RR2Xi&ZE*~>#d<&QP97`*Cjb&E4Qr73fbR|{j<)U#%cy496+s-x

    ^}q@;MnrNn56-h#jq^h5iH) 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

    NjORENPB^B*99?0YSChfW{)zp) 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 qs)je=9Q|9}6h3H&!@B9^@X literal 0 HcmV?d00001 diff --git a/src/tools/windows/converter/ms_symbol_server_converter.cc b/src/tools/windows/converter/ms_symbol_server_converter.cc new file mode 100644 index 0000000..f7d9d94 --- /dev/null +++ b/src/tools/windows/converter/ms_symbol_server_converter.cc @@ -0,0 +1,770 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ms_symbol_server_converter.cc: Obtain symbol files from a Microsoft +// symbol server, and convert them to Breakpad's dumped format. +// +// See ms_symbol_server_converter.h for documentation. +// +// Author: Mark Mentovai + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include + +#include +#include + +#include "tools/windows/converter/ms_symbol_server_converter.h" +#include "common/windows/pdb_source_line_writer.h" +#include "common/windows/pe_source_line_writer.h" +#include "common/windows/string_utils-inl.h" + +// SYMOPT_NO_PROMPTS is not defined in earlier platform SDKs. Define it +// in that case, in the event that this code is used with a newer version +// of DbgHelp at runtime that recognizes the option. The presence of this +// bit in the symbol options should not harm earlier versions of DbgHelp. +#ifndef SYMOPT_NO_PROMPTS +#define SYMOPT_NO_PROMPTS 0x00080000 +#endif // SYMOPT_NO_PROMPTS + +namespace { + +std::wstring GetExeDirectory() { + wchar_t directory[MAX_PATH]; + + // Get path to this process exe. + DWORD result = GetModuleFileName(/*hModule=*/nullptr, directory, MAX_PATH); + if (result <= 0 || result == MAX_PATH) { + fprintf(stderr, + "GetExeDirectory: failed to get path to process exe.\n"); + return L""; + } + HRESULT hr = PathCchRemoveFileSpec(directory, result + 1); + if (hr != S_OK) { + fprintf(stderr, + "GetExeDirectory: failed to remove basename from path '%ls'.\n", + directory); + return L""; + } + + return std::wstring(directory); +} + +} // namespace + +namespace google_breakpad { + +// Use sscanf_s if it is available, to quench the warning about scanf being +// deprecated. Use scanf where sscanf_is not available. Note that the +// parameters passed to sscanf and sscanf_s are only compatible as long as +// fields of type c, C, s, S, and [ are not used. +#if _MSC_VER >= 1400 // MSVC 2005/8 +#define SSCANF sscanf_s +#else // _MSC_VER >= 1400 +#define SSCANF sscanf +#endif // _MSC_VER >= 1400 + +bool GUIDOrSignatureIdentifier::InitializeFromString( + const string& identifier) { + type_ = TYPE_NONE; + + size_t length = identifier.length(); + + if (length > 32 && length <= 40) { + // GUID + if (SSCANF(identifier.c_str(), + "%08X%04hX%04hX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX%X", + &guid_.Data1, &guid_.Data2, &guid_.Data3, + &guid_.Data4[0], &guid_.Data4[1], + &guid_.Data4[2], &guid_.Data4[3], + &guid_.Data4[4], &guid_.Data4[5], + &guid_.Data4[6], &guid_.Data4[7], + &age_) != 12) { + return false; + } + + type_ = TYPE_GUID; + } else if (length > 8 && length <= 15) { + // Signature + if (SSCANF(identifier.c_str(), "%08X%x", &signature_, &age_) != 2) { + return false; + } + + type_ = TYPE_SIGNATURE; + } else { + return false; + } + + return true; +} + +#undef SSCANF + +MSSymbolServerConverter::MSSymbolServerConverter( + const string& local_cache, + const vector& symbol_servers, + bool trace_symsrv) + : symbol_path_(), + fail_dns_(false), + fail_timeout_(false), + fail_http_https_redir_(false), + fail_not_found_(false), + trace_symsrv_(trace_symsrv) { + // Setting local_cache can be done without verifying that it exists because + // SymSrv will create it if it is missing - any creation failures will occur + // at that time, so there's nothing to check here, making it safe to + // assign this in the constructor. + + assert(symbol_servers.size() > 0); + +#if !defined(NDEBUG) + // These are characters that are interpreted as having special meanings in + // symbol_path_. + const char kInvalidCharacters[] = "*;"; + assert(local_cache.find_first_of(kInvalidCharacters) == string::npos); +#endif // !defined(NDEBUG) + + for (vector::const_iterator symbol_server = symbol_servers.begin(); + symbol_server != symbol_servers.end(); + ++symbol_server) { + // The symbol path format is explained by + // http://msdn.microsoft.com/library/en-us/debug/base/using_symsrv.asp . + // "srv*" is the same as "symsrv*symsrv.dll*", which means that + // symsrv.dll is to be responsible for locating symbols. symsrv.dll + // interprets the rest of the string as a series of symbol stores separated + // by '*'. "srv*local_cache*symbol_server" means to check local_cache + // first for the symbol file, and if it is not found there, to check + // symbol_server. Symbol files found on the symbol server will be placed + // in the local cache, decompressed. + // + // Multiple specifications in this format may be presented, separated by + // semicolons. + + assert((*symbol_server).find_first_of(kInvalidCharacters) == string::npos); + symbol_path_ += "srv*" + local_cache + "*" + *symbol_server + ";"; + } + + // Strip the trailing semicolon. + symbol_path_.erase(symbol_path_.length() - 1); +} + +// A stack-based class that manages SymInitialize and SymCleanup calls. +class AutoSymSrv { + public: + AutoSymSrv() : initialized_(false) {} + + ~AutoSymSrv() { + if (!Cleanup()) { + // Print the error message here, because destructors have no return + // value. + fprintf(stderr, "~AutoSymSrv: SymCleanup: error %lu\n", GetLastError()); + } + } + + bool Initialize(HANDLE process, char* path, bool invade_process) { + process_ = process; + + // TODO(nbilling): Figure out why dbghelp.dll is being loaded from + // system32/SysWOW64 before exe folder. + + // Attempt to locate and load dbghelp.dll beside the process exe. This is + // somewhat of a workaround to loader delay load behavior that is occurring + // when we call into symsrv APIs. dbghelp.dll must be loaded from beside + // the process exe so that we are guaranteed to find symsrv.dll alongside + // dbghelp.dll (a security requirement of dbghelp.dll) and so that the + // symsrv.dll file that is loaded has a symsrv.yes file alongside it (a + // requirement of symsrv.dll when accessing Microsoft-owned symbol + // servers). + // 'static local' because we don't care about the value but we need the + // initialization to happen exactly once. + static HMODULE dbghelp_module = [] () -> HMODULE { + std::wstring exe_directory = GetExeDirectory(); + if (exe_directory.empty()) { + return nullptr; + } + std::wstring dbghelp_path = exe_directory + L"\\dbghelp.dll"; + return LoadLibrary(dbghelp_path.c_str()); + }(); + if (dbghelp_module == nullptr) { + fprintf(stderr, + "AutoSymSrv::Initialize: failed to load dbghelp.dll beside exe."); + return false; + } + + initialized_ = SymInitialize(process, path, invade_process) == TRUE; + return initialized_; + } + + bool Cleanup() { + if (initialized_) { + if (SymCleanup(process_)) { + initialized_ = false; + return true; + } + return false; + } + + return true; + } + + private: + HANDLE process_; + bool initialized_; +}; + +// A stack-based class that "owns" a pathname and deletes it when destroyed, +// unless told not to by having its Release() method called. Early deletions +// are supported by calling Delete(). +class AutoDeleter { + public: + explicit AutoDeleter(const string& path) : path_(path) {} + + ~AutoDeleter() { + int error; + if ((error = Delete()) != 0) { + // Print the error message here, because destructors have no return + // value. + fprintf(stderr, "~AutoDeleter: Delete: error %d for %s\n", + error, path_.c_str()); + } + } + + int Delete() { + if (path_.empty()) + return 0; + + int error = remove(path_.c_str()); + Release(); + return error; + } + + void Release() { + path_.clear(); + } + + private: + string path_; +}; + +MSSymbolServerConverter::LocateResult +MSSymbolServerConverter::LocateFile(const string& debug_or_code_file, + const string& debug_or_code_id, + const string& version, + string* file_name) { + assert(file_name); + file_name->clear(); + + GUIDOrSignatureIdentifier identifier; + if (!identifier.InitializeFromString(debug_or_code_id)) { + fprintf(stderr, + "LocateFile: Unparseable identifier for %s %s %s\n", + debug_or_code_file.c_str(), + debug_or_code_id.c_str(), + version.c_str()); + return LOCATE_FAILURE; + } + + HANDLE process = GetCurrentProcess(); // CloseHandle is not needed. + AutoSymSrv symsrv; + if (!symsrv.Initialize(process, + const_cast(symbol_path_.c_str()), + false)) { + fprintf(stderr, "LocateFile: SymInitialize: error %lu for %s %s %s\n", + GetLastError(), + debug_or_code_file.c_str(), + debug_or_code_id.c_str(), + version.c_str()); + return LOCATE_FAILURE; + } + + if (!SymRegisterCallback64(process, SymCallback, + reinterpret_cast(this))) { + fprintf(stderr, + "LocateFile: SymRegisterCallback64: error %lu for %s %s %s\n", + GetLastError(), + debug_or_code_file.c_str(), + debug_or_code_id.c_str(), + version.c_str()); + return LOCATE_FAILURE; + } + + // SYMOPT_DEBUG arranges for SymCallback to be called with additional + // debugging information. This is used to determine the nature of failures. + DWORD options = SymGetOptions() | SYMOPT_DEBUG | SYMOPT_NO_PROMPTS | + SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_SECURE; + SymSetOptions(options); + + // SymCallback will set these as needed inisde the SymFindFileInPath call. + fail_dns_ = false; + fail_timeout_ = false; + fail_not_found_ = false; + + // Do the lookup. + char path[MAX_PATH]; + if (!SymFindFileInPath( + process, NULL, + const_cast(debug_or_code_file.c_str()), + const_cast(identifier.guid_or_signature_pointer()), + identifier.age(), 0, + identifier.type() == GUIDOrSignatureIdentifier::TYPE_GUID ? + SSRVOPT_GUIDPTR : SSRVOPT_DWORDPTR, + path, SymFindFileInPathCallback, this)) { + DWORD error = GetLastError(); + if (error == ERROR_FILE_NOT_FOUND) { + // This can be returned for a number of reasons. Use the crumbs + // collected by SymCallback to determine which one is relevant. + + // These errors are possibly transient. + if (fail_dns_ || fail_timeout_) { + return LOCATE_RETRY; + } + + if (fail_http_https_redir_) { + return LOCATE_HTTP_HTTPS_REDIR; + } + + // This is an authoritiative file-not-found message. + if (fail_not_found_) { + fprintf(stderr, + "LocateFile: SymFindFileInPath: LOCATE_NOT_FOUND error " + "for %s %s %s\n", + debug_or_code_file.c_str(), + debug_or_code_id.c_str(), + version.c_str()); + return LOCATE_NOT_FOUND; + } + + // If the error is FILE_NOT_FOUND but none of the known error + // conditions are matched, fall through to LOCATE_FAILURE. + } + + fprintf(stderr, + "LocateFile: SymFindFileInPath: error %lu for %s %s %s\n", + error, + debug_or_code_file.c_str(), + debug_or_code_id.c_str(), + version.c_str()); + return LOCATE_FAILURE; + } + + // Making sure path is null-terminated. + path[MAX_PATH - 1] = '\0'; + + // The AutoDeleter ensures that the file is only kept when returning + // LOCATE_SUCCESS. + AutoDeleter deleter(path); + + // Do the cleanup here even though it will happen when symsrv goes out of + // scope, to allow it to influence the return value. + if (!symsrv.Cleanup()) { + fprintf(stderr, "LocateFile: SymCleanup: error %lu for %s %s %s\n", + GetLastError(), + debug_or_code_file.c_str(), + debug_or_code_id.c_str(), + version.c_str()); + return LOCATE_FAILURE; + } + + deleter.Release(); + + printf("Downloaded: %s\n", path); + *file_name = path; + return LOCATE_SUCCESS; +} + + +MSSymbolServerConverter::LocateResult +MSSymbolServerConverter::LocatePEFile(const MissingSymbolInfo& missing, + string* pe_file) { + return LocateFile(missing.code_file, missing.code_identifier, + missing.version, pe_file); +} + +MSSymbolServerConverter::LocateResult +MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo& missing, + string* symbol_file) { + return LocateFile(missing.debug_file, missing.debug_identifier, + missing.version, symbol_file); +} + + +// static +BOOL CALLBACK MSSymbolServerConverter::SymCallback(HANDLE process, + ULONG action, + ULONG64 data, + ULONG64 context) { + MSSymbolServerConverter* self = + reinterpret_cast(context); + + switch (action) { + case CBA_EVENT: { + IMAGEHLP_CBA_EVENT* cba_event = + reinterpret_cast(data); + + // Put the string into a string object to be able to use string::find + // for substring matching. This is important because the not-found + // message does not use the entire string but is appended to the URL + // that SymSrv attempted to retrieve. + string desc(cba_event->desc); + if (self->trace_symsrv_) { + fprintf(stderr, "LocateFile: SymCallback: action desc '%s'\n", + desc.c_str()); + } + + // desc_action maps strings (in desc) to boolean pointers that are to + // be set to true if the string matches. + struct desc_action { + const char* desc; // The substring to match. + bool* action; // On match, this pointer will be set to true. + }; + + static const desc_action desc_actions[] = { + // When a DNS error occurs, it could be indiciative of network + // problems. + {"SYMSRV: The server name or address could not be resolved\n", + &self->fail_dns_}, + + // This message is produced if no connection is opened. + {"SYMSRV: A connection with the server could not be established\n", + &self->fail_timeout_}, + + // This message is produced if a connection is established but the + // server fails to respond to the HTTP request. + {"SYMSRV: The operation timed out\n", &self->fail_timeout_}, + + // This message is produced if the server is redirecting us from http + // to https. When this happens SymSrv will fail and we need to use + // the https URL in our call-- we've made a mistake. + {"ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR\n", + &self->fail_http_https_redir_}, + + // This message is produced when the requested file is not found, + // even if one or more of the above messages are also produced. + // It's trapped to distinguish between not-found and unknown-failure + // conditions. Note that this message will not be produced if a + // connection is established and the server begins to respond to the + // HTTP request but does not finish transmitting the file. + {" not found\n", &self->fail_not_found_}}; + + for (int desc_action_index = 0; + desc_action_index < + static_cast(sizeof(desc_actions) / sizeof(desc_action)); + ++desc_action_index) { + if (desc.find(desc_actions[desc_action_index].desc) != string::npos) { + *(desc_actions[desc_action_index].action) = true; + break; + } + } + + break; + } + } + + // This function is a mere fly on the wall. Treat everything as unhandled. + return FALSE; +} + +// static +BOOL CALLBACK MSSymbolServerConverter::SymFindFileInPathCallback( + const char* filename, void* context) { + // FALSE ends the search, indicating that the located symbol file is + // satisfactory. + return FALSE; +} + +MSSymbolServerConverter::LocateResult +MSSymbolServerConverter::LocateAndConvertSymbolFile( + const MissingSymbolInfo& missing, + bool keep_symbol_file, + bool keep_pe_file, + string* converted_symbol_file, + string* symbol_file, + string* out_pe_file) { + assert(converted_symbol_file); + converted_symbol_file->clear(); + if (symbol_file) { + symbol_file->clear(); + } + + string pdb_file; + LocateResult result = LocateSymbolFile(missing, &pdb_file); + if (result != LOCATE_SUCCESS) { + fprintf(stderr, "Fallback to PE-only symbol generation for: %s\n", + missing.debug_file.c_str()); + return LocateAndConvertPEFile(missing, keep_pe_file, converted_symbol_file, + out_pe_file); + } + + if (symbol_file && keep_symbol_file) { + *symbol_file = pdb_file; + } + + // The conversion of a symbol file for a Windows 64-bit module requires + // loading of the executable file. If there is no executable file, convert + // using only the PDB file. Without an executable file, the conversion will + // fail for 64-bit modules but it should succeed for 32-bit modules. + string pe_file; + result = LocatePEFile(missing, &pe_file); + if (result != LOCATE_SUCCESS) { + fprintf(stderr, "WARNING: Could not download: %s\n", pe_file.c_str()); + } + + if (out_pe_file && keep_pe_file) { + *out_pe_file = pe_file; + } + + // Conversion may fail because the file is corrupt. If a broken file is + // kept in the local cache, LocateSymbolFile will not hit the network again + // to attempt to locate it. To guard against problems like this, the + // symbol file in the local cache will be removed if conversion fails. + AutoDeleter pdb_deleter(pdb_file); + AutoDeleter pe_deleter(pe_file); + + // Be sure that it's a .pdb file, since we'll be replacing .pdb with .sym + // for the converted file's name. + string pdb_extension = pdb_file.substr(pdb_file.length() - 4); + // strcasecmp is called _stricmp here. + if (_stricmp(pdb_extension.c_str(), ".pdb") != 0) { + fprintf(stderr, "LocateAndConvertSymbolFile: " + "no .pdb extension for %s %s %s %s\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + pdb_file.c_str()); + return LOCATE_FAILURE; + } + + PDBSourceLineWriter writer; + wstring pe_file_w; + if (!WindowsStringUtils::safe_mbstowcs(pe_file, &pe_file_w)) { + fprintf(stderr, + "LocateAndConvertSymbolFile: " + "WindowsStringUtils::safe_mbstowcs failed for %s\n", + pe_file.c_str()); + return LOCATE_FAILURE; + } + wstring pdb_file_w; + if (!WindowsStringUtils::safe_mbstowcs(pdb_file, &pdb_file_w)) { + fprintf(stderr, + "LocateAndConvertSymbolFile: " + "WindowsStringUtils::safe_mbstowcs failed for %ws\n", + pdb_file_w.c_str()); + return LOCATE_FAILURE; + } + if (!writer.Open(pdb_file_w, PDBSourceLineWriter::PDB_FILE)) { + fprintf(stderr, + "ERROR: PDBSourceLineWriter::Open failed for %s %s %s %ws\n", + missing.debug_file.c_str(), missing.debug_identifier.c_str(), + missing.version.c_str(), pdb_file_w.c_str()); + return LOCATE_FAILURE; + } + if (!writer.SetCodeFile(pe_file_w)) { + fprintf(stderr, + "ERROR: PDBSourceLineWriter::SetCodeFile failed for %s %s %s %ws\n", + missing.debug_file.c_str(), missing.debug_identifier.c_str(), + missing.version.c_str(), pe_file_w.c_str()); + return LOCATE_FAILURE; + } + + *converted_symbol_file = pdb_file.substr(0, pdb_file.length() - 4) + ".sym"; + + FILE* converted_output = NULL; +#if _MSC_VER >= 1400 // MSVC 2005/8 + errno_t err; + if ((err = fopen_s(&converted_output, converted_symbol_file->c_str(), "w")) + != 0) { +#else // _MSC_VER >= 1400 + // fopen_s and errno_t were introduced in MSVC8. Use fopen for earlier + // environments. Don't use fopen with MSVC8 and later, because it's + // deprecated. fopen does not provide reliable error codes, so just use + // -1 in the event of a failure. + int err; + if (!(converted_output = fopen(converted_symbol_file->c_str(), "w"))) { + err = -1; +#endif // _MSC_VER >= 1400 + fprintf(stderr, "LocateAndConvertSymbolFile: " + "fopen_s: error %d for %s %s %s %s\n", + err, + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + converted_symbol_file->c_str()); + return LOCATE_FAILURE; + } + + AutoDeleter sym_deleter(*converted_symbol_file); + + bool success = writer.WriteSymbols(converted_output); + fclose(converted_output); + + if (!success) { + fprintf(stderr, "LocateAndConvertSymbolFile: " + "PDBSourceLineWriter::WriteMap failed for %s %s %s %s\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + pdb_file.c_str()); + return LOCATE_FAILURE; + } + + if (keep_symbol_file) { + pdb_deleter.Release(); + } + + if (keep_pe_file) { + pe_deleter.Release(); + } + + sym_deleter.Release(); + + return LOCATE_SUCCESS; +} + +MSSymbolServerConverter::LocateResult +MSSymbolServerConverter::LocateAndConvertPEFile( + const MissingSymbolInfo& missing, + bool keep_pe_file, + string* converted_symbol_file, + string* out_pe_file) { + assert(converted_symbol_file); + converted_symbol_file->clear(); + + string pe_file; + MSSymbolServerConverter::LocateResult result = LocatePEFile(missing, + &pe_file); + if (result != LOCATE_SUCCESS) { + fprintf(stderr, "WARNING: Could not download: %s\n", pe_file.c_str()); + return result; + } + + if (out_pe_file && keep_pe_file) { + *out_pe_file = pe_file; + } + + // Conversion may fail because the file is corrupt. If a broken file is + // kept in the local cache, LocatePEFile will not hit the network again + // to attempt to locate it. To guard against problems like this, the + // PE file in the local cache will be removed if conversion fails. + AutoDeleter pe_deleter(pe_file); + + // Be sure that it's a .exe or .dll file, since we'll be replacing extension + // with .sym for the converted file's name. + string pe_extension = pe_file.substr(pe_file.length() - 4); + // strcasecmp is called _stricmp here. + if (_stricmp(pe_extension.c_str(), ".exe") != 0 && + _stricmp(pe_extension.c_str(), ".dll") != 0) { + fprintf(stderr, "LocateAndConvertPEFile: " + "no .dll/.exe extension for %s %s %s %s\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + pe_file.c_str()); + return LOCATE_FAILURE; + } + + *converted_symbol_file = pe_file.substr(0, pe_file.length() - 4) + ".sym"; + + FILE* converted_output = NULL; +#if _MSC_VER >= 1400 // MSVC 2005/8 + errno_t err; + if ((err = fopen_s(&converted_output, converted_symbol_file->c_str(), "w")) + != 0) { +#else // _MSC_VER >= 1400 + // fopen_s and errno_t were introduced in MSVC8. Use fopen for earlier + // environments. Don't use fopen with MSVC8 and later, because it's + // deprecated. fopen does not provide reliable error codes, so just use + // -1 in the event of a failure. + int err; + if (!(converted_output = fopen(converted_symbol_file->c_str(), "w"))) { + err = -1; +#endif // _MSC_VER >= 1400 + fprintf(stderr, "LocateAndConvertPEFile: " + "fopen_s: error %d for %s %s %s %s\n", + err, + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + converted_symbol_file->c_str()); + return LOCATE_FAILURE; + } + AutoDeleter sym_deleter(*converted_symbol_file); + + wstring pe_file_w; + if (!WindowsStringUtils::safe_mbstowcs(pe_file, &pe_file_w)) { + fprintf(stderr, + "LocateAndConvertPEFile: " + "WindowsStringUtils::safe_mbstowcs failed for %s\n", + pe_file.c_str()); + return LOCATE_FAILURE; + } + PESourceLineWriter writer(pe_file_w); + PDBModuleInfo module_info; + if (!writer.GetModuleInfo(&module_info)) { + fprintf(stderr, "LocateAndConvertPEFile: " + "PESourceLineWriter::GetModuleInfo failed for %s %s %s %s\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + pe_file.c_str()); + return LOCATE_FAILURE; + } + if (module_info.cpu.compare(L"x86_64") != 0) { + // This module is not x64 so we cannot generate Breakpad symbols from the + // PE alone. Don't delete PE-- no need to retry download. + pe_deleter.Release(); + return LOCATE_FAILURE; + } + + bool success = writer.WriteSymbols(converted_output); + fclose(converted_output); + + if (!success) { + fprintf(stderr, "LocateAndConvertPEFile: " + "PESourceLineWriter::WriteMap failed for %s %s %s %s\n", + missing.debug_file.c_str(), + missing.debug_identifier.c_str(), + missing.version.c_str(), + pe_file.c_str()); + return LOCATE_FAILURE; + } + + if (keep_pe_file) { + pe_deleter.Release(); + } + + sym_deleter.Release(); + + return LOCATE_SUCCESS; +} + +} // namespace google_breakpad diff --git a/src/tools/windows/converter/ms_symbol_server_converter.h b/src/tools/windows/converter/ms_symbol_server_converter.h new file mode 100644 index 0000000..ffdea7c --- /dev/null +++ b/src/tools/windows/converter/ms_symbol_server_converter.h @@ -0,0 +1,242 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ms_symbol_server_converter.h: Obtain symbol files from a Microsoft +// symbol server, and convert them to Breakpad's dumped format. +// +// At runtime, MSSymbolServerConverter and code that it calls depend on being +// able to locate suitable versions of dbghelp.dll and symsrv.dll. For best +// results, place these files in the same directory as the executable. +// dbghelp.dll and symsrv.dll as supplied with Debugging Tools for Windows are +// both redistributable, as indicated by the package's redist.txt file. +// +// When connecting to Microsoft's symbol server at +// http://msdl.microsoft.com/download/symbols/, which provides access to +// symbols for the operating system itself, symsrv.dll requires agreement to +// Microsoft's "Terms of Use for Microsoft Symbols and Binaries." Because this +// library places the symbol engine into a promptless mode, the dialog with the +// terms will not appear, and use of Microsoft's symbol server will not be +// possible. To indicate agreement to the terms, create a file called +// symsrv.yes in the same directory as symsrv.dll. (Note that symsrv.dll will +// also recognize a symsrv.no file as indicating that you do not accept the +// terms; the .yes file takes priority over the .no file.) The terms of use +// are contained within symsrv.dll; they were formerly available online at +// http://www.microsoft.com/whdc/devtools/debugging/symsrvTOU2.mspx , but +// do not appear to be available online any longer as of January, 2007. It is +// possible to view the terms from within WinDbg (Debugging Tools for Windows) +// by removing any symsrv.yes and symsrv.no files from WinDbg's directory, +// setting the symbol path to include Microsoft's symbol server (.sympath), and +// attempting to load symbols from their server (.reload). +// +// This code has been tested with dbghelp.dll 6.5.3.7 and symsrv.dll 6.5.3.8, +// included with Microsoft Visual Studio 8 in Common7/IDE. This has also been +// tested with dbghelp.dll and symsrv.dll versions 6.6.7.5 and 6.12.2.633, +// included with the same versions of Debugging Tools for Windows, available at +// http://www.microsoft.com/whdc/devtools/debugging/ . +// +// Author: Mark Mentovai + +#ifndef TOOLS_WINDOWS_MS_SYMBOL_SERVER_CONVERTER_H_ +#define TOOLS_WINDOWS_MS_SYMBOL_SERVER_CONVERTER_H_ + +#include + +#include +#include + +namespace google_breakpad { + +using std::string; +using std::vector; + +// MissingSymbolInfo contains the subset of the information in the processor's +// CodeModule structure relevant to obtaining a missing symbol file. Only +// debug_file and debug_identifier are relevant in actually obtaining the +// missing file; the other fields are for convenience. +struct MissingSymbolInfo { + string code_file; + string code_identifier; + string debug_file; + string debug_identifier; + string version; +}; + +class GUIDOrSignatureIdentifier { + public: + enum GUIDOrSignatureType { + TYPE_NONE = 0, + TYPE_GUID, + TYPE_SIGNATURE + }; + + GUIDOrSignatureIdentifier() : type_(TYPE_NONE) {} + + // Converts |identifier|, a debug_identifier-formatted string, into its + // component fields: either a GUID and age, or signature and age. If + // successful, sets the relevant fields in the object, including the type + // field, and returns true. On error, returns false. + bool InitializeFromString(const string& identifier); + + GUIDOrSignatureType type() const { return type_; } + GUID guid() const { return guid_; } + DWORD signature() const { return signature_; } + int age() const { return age_; } + const void* guid_or_signature_pointer() const { return &guid_; } + + private: + GUIDOrSignatureType type_; + + // An identifier contains either a 128-bit uuid or a 32-bit signature. + union { + GUID guid_; + DWORD signature_; + }; + + // All identifiers used here have age fields, which indicate a specific + // revision given a uuid or signature. + int age_; +}; + +class MSSymbolServerConverter { + public: + enum LocateResult { + LOCATE_FAILURE = 0, + LOCATE_NOT_FOUND, // Authoritative: the file is not present. + LOCATE_RETRY, // Transient (network?) error, try again later. + LOCATE_SUCCESS, + LOCATE_HTTP_HTTPS_REDIR + }; + + // Create a new object. local_cache is the location (pathname) of a local + // symbol store used to hold downloaded and converted symbol files. This + // directory will be created by LocateSymbolFile when it successfully + // retrieves a symbol file. symbol_servers contains a list of locations (URLs + // or pathnames) of the upstream symbol server stores, given in order of + // preference, with the first string in the vector identifying the first + // store to try. The vector must contain at least one string. None of the + // strings passed to this constructor may contain asterisk ('*') or semicolon + // (';') characters, as the symbol engine uses these characters as separators. + // If |trace_symsrv| is set then callbacks from SymSrv will be logged to + // stderr. + MSSymbolServerConverter(const string& local_cache, + const vector& symbol_servers, + bool trace_symsrv); + + // Locates the PE file (DLL or EXE) specified by the identifying information + // in |missing|, by checking the symbol stores identified when the object + // was created. When returning LOCATE_SUCCESS, pe_file is set to + // the pathname of the decompressed PE file as it is stored in the + // local cache. + LocateResult LocatePEFile(const MissingSymbolInfo& missing, string* pe_file); + + // Locates the symbol file specified by the identifying information in + // |missing|, by checking the symbol stores identified when the object + // was created. When returning LOCATE_SUCCESS, symbol_file is set to + // the pathname of the decompressed symbol file as it is stored in the + // local cache. + LocateResult LocateSymbolFile(const MissingSymbolInfo& missing, + string* symbol_file); + + // Calls LocateSymbolFile and converts the returned symbol file to the + // dumped-symbol format, storing it adjacent to the symbol file. The + // only conversion supported is from pdb files. Returns the return + // value of LocateSymbolFile, or if LocateSymbolFile succeeds but + // conversion fails, returns LOCATE_FAILURE. The pathname to the + // pdb file and to the converted symbol file are returned in + // |converted_symbol_file|, |symbol_file|, and |pe_file|. |symbol_file| and + // |pe_file| are optional and may be NULL. If only the converted symbol file + // is desired, set |keep_symbol_file| and |keep_pe_file| to false to indicate + // that the original symbol file (pdb) and executable file (exe, dll) should + // be deleted after conversion. + LocateResult LocateAndConvertSymbolFile(const MissingSymbolInfo& missing, + bool keep_symbol_file, + bool keep_pe_file, + string* converted_symbol_file, + string* symbol_file, + string* pe_file); + + // Calls LocatePEFile and converts the returned PE file to the + // dumped-symbol format, storing it adjacent to the PE file. The + // only conversion supported is from PE files. Returns the return + // value of LocatePEFile, or if LocatePEFile succeeds but + // conversion fails, returns LOCATE_FAILURE. The pathname to the + // PE file and to the converted symbol file are returned in + // |converted_symbol_file| and |pe_file|. |pe_file| is optional and may be + // NULL. If only the converted symbol file is desired, set |keep_pe_file| + // to false to indicate that the executable file (exe, dll) should be deleted + // after conversion. + // NOTE: Currrently only supports x64 PEs. + LocateResult LocateAndConvertPEFile(const MissingSymbolInfo& missing, + bool keep_pe_file, + string* converted_symbol_file, + string* pe_file); + + private: + // Locates the PDB or PE file (DLL or EXE) specified by the identifying + // information in |debug_or_code_file| and |debug_or_code_id|, by checking + // the symbol stores identified when the object was created. When + // returning LOCATE_SUCCESS, file_name is set to the pathname of the + // decompressed PDB or PE file file as it is stored in the local cache. + LocateResult LocateFile(const string& debug_or_code_file, + const string& debug_or_code_id, + const string& version, string* file_name); + + // Called by various SymSrv functions to report status as progress is made + // and to allow the callback to influence processing. Messages sent to this + // callback can be used to distinguish between the various failure modes + // that SymFindFileInPath might encounter. + static BOOL CALLBACK SymCallback(HANDLE process, ULONG action, ULONG64 data, + ULONG64 context); + + // Called by SymFindFileInPath (in LocateSymbolFile) after a candidate + // symbol file is located, when it's present in the local cache. + // SymFindFileInPath actually seems to accept NULL for a callback function + // and behave properly for our needs in that case, but the documentation + // doesn't mention it, so this little callback is provided. + static BOOL CALLBACK SymFindFileInPathCallback(const char* filename, + void* context); + + // The search path used by SymSrv, built based on the arguments to the + // constructor. + string symbol_path_; + + // SymCallback will set at least one of these failure variables if + // SymFindFileInPath fails for an expected reason. + bool fail_dns_; // DNS failures (fail_not_found_ will also be set). + bool fail_timeout_; // Timeouts (fail_not_found_ will also be set). + bool fail_http_https_redir_; // Bad URL-- we should be using HTTPS. + bool fail_not_found_; // The file could not be found. If this is the only + // fail_* member set, then it is authoritative. + + // If set then callbacks from SymSrv will be logged to stderr. + bool trace_symsrv_; +}; + +} // namespace google_breakpad + +#endif // TOOLS_WINDOWS_MS_SYMBOL_SERVER_CONVERTER_H_ diff --git a/src/tools/windows/converter_exe/configure.cmd b/src/tools/windows/converter_exe/configure.cmd new file mode 100644 index 0000000..da80ef8 --- /dev/null +++ b/src/tools/windows/converter_exe/configure.cmd @@ -0,0 +1,33 @@ +@if "%ECHOON%"=="" @echo off +SETLOCAL + +REM ****************************************************************** +REM Please, make sure to run this in an Elevated Command Prompt. +REM Usage: +REM configure.cmd +REM ****************************************************************** + +REM ****************************************************************** +REM Initialize +REM ****************************************************************** +SET SCRIPT_LOCATION=%~dp0 + +REM ****************************************************************** +REM Go to script location +REM ****************************************************************** +pushd %SCRIPT_LOCATION% + +REM ****************************************************************** +REM Register msdia140.dll. +REM ****************************************************************** +SET MSG=Failed to register msdia140.dll. Make sure to run this in elevated command prompt. +%systemroot%\SysWoW64\regsvr32.exe /s msdia140.dll & if errorlevel 1 echo %MSG% & goto :fail + +:success +echo Configuration was successful. +ENDLOCAL +exit /b 0 + +:fail +ENDLOCAL +exit /b 1 diff --git a/src/tools/windows/converter_exe/converter.cc b/src/tools/windows/converter_exe/converter.cc new file mode 100644 index 0000000..92c4177 --- /dev/null +++ b/src/tools/windows/converter_exe/converter.cc @@ -0,0 +1,908 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma comment(lib, "winhttp.lib") +#pragma comment(lib, "wininet.lib") +#pragma comment(lib, "diaguids.lib") +#pragma comment(lib, "imagehlp.lib") + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "common/windows/http_upload.h" +#include "common/windows/string_utils-inl.h" +#include "common/windows/sym_upload_v2_protocol.h" +#include "tools/windows/converter/ms_symbol_server_converter.h" +#include "tools/windows/converter_exe/escaping.h" +#include "tools/windows/converter_exe/http_download.h" +#include "tools/windows/converter_exe/tokenizer.h" + +using strings::WebSafeBase64Unescape; +using strings::WebSafeBase64Escape; + +namespace { + +using std::map; +using std::string; +using std::vector; +using std::wstring; +using crash::HTTPDownload; +using crash::Tokenizer; +using google_breakpad::HTTPUpload; +using google_breakpad::MissingSymbolInfo; +using google_breakpad::MSSymbolServerConverter; +using google_breakpad::WindowsStringUtils; + +const char* kMissingStringDelimiters = "|"; +const char* kLocalCachePath = "c:\\symbols"; +const char* kNoExeMSSSServer = "http://msdl.microsoft.com/download/symbols/"; +const wchar_t* kSymbolUploadTypeBreakpad = L"BREAKPAD"; +const wchar_t* kSymbolUploadTypePE = L"PE"; +const wchar_t* kSymbolUploadTypePDB = L"PDB"; +const wchar_t* kConverterProductName = L"WinSymConv"; + +// Windows stdio doesn't do line buffering. Use this function to flush after +// writing to stdout and stderr so that a log will be available if the +// converter crashes. +static int FprintfFlush(FILE* file, const char* format, ...) { + va_list arguments; + va_start(arguments, format); + int retval = vfprintf(file, format, arguments); + va_end(arguments); + fflush(file); + return retval; +} + +static string CurrentDateAndTime() { + const string kUnknownDateAndTime = R"(????-??-?? ??:??:??)"; + + time_t current_time; + time(¤t_time); + + // localtime_s is safer but is only available in MSVC8. Use localtime + // in earlier environments. + struct tm* time_pointer; +#if _MSC_VER >= 1400 // MSVC 2005/8 + struct tm time_struct; + time_pointer =& time_struct; + if (localtime_s(time_pointer,& current_time) != 0) { + return kUnknownDateAndTime; + } +#else // _MSC_VER >= 1400 + time_pointer = localtime(¤t_time); + if (!time_pointer) { + return kUnknownDateAndTime; + } +#endif // _MSC_VER >= 1400 + + char buffer[256]; + if (!strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", time_pointer)) { + return kUnknownDateAndTime; + } + + return string(buffer); +} + +// ParseMissingString turns |missing_string| into a MissingSymbolInfo +// structure. It returns true on success, and false if no such conversion +// is possible. +static bool ParseMissingString(const string& missing_string, + MissingSymbolInfo* missing_info) { + assert(missing_info); + + vector tokens; + Tokenizer::Tokenize(kMissingStringDelimiters, missing_string,& tokens); + if (tokens.size() != 5) { + return false; + } + + missing_info->debug_file = tokens[0]; + missing_info->debug_identifier = tokens[1]; + missing_info->version = tokens[2]; + missing_info->code_file = tokens[3]; + missing_info->code_identifier = tokens[4]; + + return true; +} + +// StringMapToWStringMap takes each element in a map that associates +// (narrow) strings to strings and converts the keys and values to wstrings. +// Returns true on success and false on failure, printing an error message. +static bool StringMapToWStringMap(const map& smap, + map* wsmap) { + assert(wsmap); + wsmap->clear(); + + for (map::const_iterator iterator = smap.begin(); + iterator != smap.end(); + ++iterator) { + wstring key; + if (!WindowsStringUtils::safe_mbstowcs(iterator->first,& key)) { + FprintfFlush(stderr, + "StringMapToWStringMap: safe_mbstowcs failed for key %s\n", + iterator->first.c_str()); + return false; + } + + wstring value; + if (!WindowsStringUtils::safe_mbstowcs(iterator->second,& value)) { + FprintfFlush(stderr, "StringMapToWStringMap: safe_mbstowcs failed " + "for value %s\n", + iterator->second.c_str()); + return false; + } + + wsmap->insert(make_pair(key, value)); + } + + return true; +} + +// MissingSymbolInfoToParameters turns a MissingSymbolInfo structure into a +// map of parameters suitable for passing to HTTPDownload or HTTPUpload. +// Returns true on success and false on failure, printing an error message. +static bool MissingSymbolInfoToParameters(const MissingSymbolInfo& missing_info, + map* wparameters) { + assert(wparameters); + + map parameters; + string encoded_param; + // Indicate the params are encoded. + parameters["encoded"] = "true"; // The string value here does not matter. + + WebSafeBase64Escape(missing_info.code_file,& encoded_param); + parameters["code_file"] = encoded_param; + + WebSafeBase64Escape(missing_info.code_identifier,& encoded_param); + parameters["code_identifier"] = encoded_param; + + WebSafeBase64Escape(missing_info.debug_file,& encoded_param); + parameters["debug_file"] = encoded_param; + + WebSafeBase64Escape(missing_info.debug_identifier,& encoded_param); + parameters["debug_identifier"] = encoded_param; + + if (!missing_info.version.empty()) { + // The version is optional. + WebSafeBase64Escape(missing_info.version,& encoded_param); + parameters["version"] = encoded_param; + } + + WebSafeBase64Escape("WinSymConv",& encoded_param); + parameters["product"] = encoded_param; + + if (!StringMapToWStringMap(parameters, wparameters)) { + // StringMapToWStringMap will have printed an error. + return false; + } + + return true; +} + +// UploadSymbolFile sends |converted_file| as identified by |debug_file| and +// |debug_identifier|, to the symbol server rooted at |upload_symbol_url|. +// Returns true on success and false on failure, printing an error message. +static bool UploadSymbolFile(const wstring& upload_symbol_url, + const wstring& api_key, + const string& debug_file, + const string& debug_identifier, + const string& symbol_file, + const wstring& symbol_type) { + wstring debug_file_w; + if (!WindowsStringUtils::safe_mbstowcs(debug_file, &debug_file_w)) { + FprintfFlush(stderr, "UploadSymbolFile: safe_mbstowcs failed for %s\n", + symbol_file.c_str()); + return false; + } + + wstring debug_id_w; + if (!WindowsStringUtils::safe_mbstowcs(debug_identifier, &debug_id_w)) { + FprintfFlush(stderr, "UploadSymbolFile: safe_mbstowcs failed for %s\n", + symbol_file.c_str()); + return false; + } + + wstring symbol_file_w; + if (!WindowsStringUtils::safe_mbstowcs(symbol_file, &symbol_file_w)) { + FprintfFlush(stderr, "UploadSymbolFile: safe_mbstowcs failed for %s\n", + symbol_file.c_str()); + return false; + } + + int timeout_ms = 60 * 1000; + FprintfFlush(stderr, "Uploading %s\n", symbol_file.c_str()); + if (!google_breakpad::SymUploadV2ProtocolSend( + upload_symbol_url.c_str(), api_key.c_str(), &timeout_ms, debug_file_w, + debug_id_w, symbol_file_w, symbol_type, kConverterProductName, + /*force=*/true)) { + FprintfFlush(stderr, + "UploadSymbolFile: HTTPUpload::SendRequest failed " + "for %s %s\n", + debug_file.c_str(), debug_identifier.c_str()); + return false; + } + + return true; +} + +// SendFetchFailedPing informs the symbol server based at +// |fetch_symbol_failure_url| that the symbol file identified by +// |missing_info| could authoritatively not be located. Returns +// true on success and false on failure. +static bool SendFetchFailedPing(const wstring& fetch_symbol_failure_url, + const MissingSymbolInfo& missing_info) { + map parameters; + if (!MissingSymbolInfoToParameters(missing_info,& parameters)) { + // MissingSymbolInfoToParameters or a callee will have printed an error. + return false; + } + + string content; + if (!HTTPDownload::Download(fetch_symbol_failure_url, + & parameters, + & content, + NULL)) { + FprintfFlush(stderr, "SendFetchFailedPing: HTTPDownload::Download failed " + "for %s %s %s\n", + missing_info.debug_file.c_str(), + missing_info.debug_identifier.c_str(), + missing_info.version.c_str()); + return false; + } + + return true; +} + +// Returns true if it's safe to make an external request for the symbol +// file described in missing_info. It's considered safe to make an +// external request unless the symbol file's debug_file string matches +// the given blacklist regular expression. +// The debug_file name is used from the MissingSymbolInfo struct, +// matched against the blacklist_regex. +static bool SafeToMakeExternalRequest(const MissingSymbolInfo& missing_info, + std::regex blacklist_regex) { + string file_name = missing_info.debug_file; + // Use regex_search because we want to match substrings. + if (std::regex_search(file_name, blacklist_regex)) { + FprintfFlush(stderr, "Not safe to make external request for file %s\n", + file_name.c_str()); + return false; + } + + return true; +} + +// Converter options derived from command line parameters. +struct ConverterOptions { + ConverterOptions() + : report_fetch_failures(true), trace_symsrv(false), keep_files(false) {} + + ~ConverterOptions() { + } + + // Names of MS Symbol Supplier Servers that are internal to Google, and may + // have symbols for any request. + vector full_internal_msss_servers; + + // Names of MS Symbol Supplier Servers that are internal to Google, and + // shouldn't be checked for symbols for any .exe files. + vector full_external_msss_servers; + + // Names of MS Symbol Supplier Servers that are external to Google, and may + // have symbols for any request. + vector no_exe_internal_msss_servers; + + // Names of MS Symbol Supplier Servers that are external to Google, and + // shouldn't be checked for symbols for any .exe files. + vector no_exe_external_msss_servers; + + // Temporary local storage for symbols. + string local_cache_path; + + // URL for uploading symbols. + wstring upload_symbols_url; + + // API key to use when uploading symbols. + wstring api_key; + + // URL to fetch list of missing symbols. + wstring missing_symbols_url; + + // URL to report symbol fetch failure. + wstring fetch_symbol_failure_url; + + // Are symbol fetch failures reported. + bool report_fetch_failures; + + // File containing the list of missing symbols. Fetch failures are not + // reported if such file is provided. + string missing_symbols_file; + + // Regex used to blacklist files to prevent external symbol requests. + // Owned and cleaned up by this struct. + std::regex blacklist_regex; + + // If set then SymSrv callbacks are logged to stderr. + bool trace_symsrv; + + // If set then Breakpad/PE/PDB files won't be deleted after processing. + bool keep_files; + + private: + // DISABLE_COPY_AND_ASSIGN + ConverterOptions(const ConverterOptions&); + ConverterOptions& operator=(const ConverterOptions&); +}; + +// ConverMissingSymbolFile takes a single MissingSymbolInfo structure and +// attempts to locate it from the symbol servers provided in the +// |options.*_msss_servers| arguments. "Full" servers are those that will be +// queried for all symbol files; "No-EXE" servers will only be queried for +// modules whose missing symbol data indicates are not main program executables. +// Results will be sent to the |options.upload_symbols_url| on success or +// |options.fetch_symbol_failure_url| on failure, and the local cache will be +// stored at |options.local_cache_path|. Because nothing can be done even in +// the event of a failure, this function returns no value, although it +// may result in error messages being printed. +static void ConvertMissingSymbolFile(const MissingSymbolInfo& missing_info, + const ConverterOptions& options) { + string time_string = CurrentDateAndTime(); + FprintfFlush(stdout, "converter: %s: attempting %s %s %s\n", + time_string.c_str(), + missing_info.debug_file.c_str(), + missing_info.debug_identifier.c_str(), + missing_info.version.c_str()); + + // The first lookup is always to internal symbol servers. + // Always ask the symbol servers identified as "full." + vector msss_servers = options.full_internal_msss_servers; + + // If the file is not an .exe file, also ask an additional set of symbol + // servers, such as Microsoft's public symbol server. + bool is_exe = false; + + if (missing_info.code_file.length() >= 4) { + string code_extension = + missing_info.code_file.substr(missing_info.code_file.size() - 4); + + // Firefox is a special case: .dll-only servers should be consulted for + // its symbols. This enables us to get its symbols from Mozilla's + // symbol server when crashes occur in Google extension code hosted by a + // Firefox process. + if (_stricmp(code_extension.c_str(), ".exe") == 0 && + _stricmp(missing_info.code_file.c_str(), "firefox.exe") != 0) { + is_exe = true; + } + } + + if (!is_exe) { + msss_servers.insert(msss_servers.end(), + options.no_exe_internal_msss_servers.begin(), + options.no_exe_internal_msss_servers.end()); + } + + // If there are any suitable internal symbol servers, make a request. + MSSymbolServerConverter::LocateResult located = + MSSymbolServerConverter::LOCATE_FAILURE; + string converted_file; + string symbol_file; + string pe_file; + if (msss_servers.size() > 0) { + // Attempt to fetch the symbol file and convert it. + FprintfFlush(stderr, "Making internal request for %s (%s)\n", + missing_info.debug_file.c_str(), + missing_info.debug_identifier.c_str()); + MSSymbolServerConverter converter(options.local_cache_path, msss_servers, + options.trace_symsrv); + located = converter.LocateAndConvertSymbolFile( + missing_info, + /*keep_symbol_file=*/true, + /*keep_pe_file=*/true, &converted_file, &symbol_file, &pe_file); + switch (located) { + case MSSymbolServerConverter::LOCATE_SUCCESS: + FprintfFlush(stderr, "LocateResult = LOCATE_SUCCESS\n"); + // Upload it. Don't bother checking the return value. If this + // succeeds, it should disappear from the missing symbol list. + // If it fails, something will print an error message indicating + // the cause of the failure, and the item will remain on the + // missing symbol list. + UploadSymbolFile(options.upload_symbols_url, options.api_key, + missing_info.debug_file, missing_info.debug_identifier, + converted_file, kSymbolUploadTypeBreakpad); + if (!options.keep_files) + remove(converted_file.c_str()); + + // Upload PDB/PE if we have them + if (!symbol_file.empty()) { + UploadSymbolFile(options.upload_symbols_url, options.api_key, + missing_info.debug_file, + missing_info.debug_identifier, symbol_file, + kSymbolUploadTypePDB); + if (!options.keep_files) + remove(symbol_file.c_str()); + } + if (!pe_file.empty()) { + UploadSymbolFile(options.upload_symbols_url, options.api_key, + missing_info.code_file, + missing_info.debug_identifier, pe_file, + kSymbolUploadTypePE); + if (!options.keep_files) + remove(pe_file.c_str()); + } + + // Note: this does leave some directories behind that could be + // cleaned up. The directories inside options.local_cache_path for + // debug_file/debug_identifier can be removed at this point. + break; + + case MSSymbolServerConverter::LOCATE_NOT_FOUND: + FprintfFlush(stderr, "LocateResult = LOCATE_NOT_FOUND\n"); + // The symbol file definitively did not exist. Fall through, + // so we can attempt an external query if it's safe to do so. + break; + + case MSSymbolServerConverter::LOCATE_RETRY: + FprintfFlush(stderr, "LocateResult = LOCATE_RETRY\n"); + // Fall through in case we should make an external request. + // If not, or if an external request fails in the same way, + // we'll leave the entry in the symbol file list and + // try again on a future pass. Print a message so that there's + // a record. + break; + + case MSSymbolServerConverter::LOCATE_HTTP_HTTPS_REDIR: + FprintfFlush( + stderr, + "LocateResult = LOCATE_HTTP_HTTPS_REDIR\n" + "One of the specified URLs is using HTTP, which causes a redirect " + "from the server to HTTPS, which causes the SymSrv lookup to " + "fail.\n" + "This URL must be replaced with the correct HTTPS URL.\n"); + break; + + case MSSymbolServerConverter::LOCATE_FAILURE: + FprintfFlush(stderr, "LocateResult = LOCATE_FAILURE\n"); + // LocateAndConvertSymbolFile printed an error message. + break; + + default: + FprintfFlush( + stderr, + "FATAL: Unexpected return value '%d' from " + "LocateAndConvertSymbolFile()\n", + located); + assert(0); + break; + } + } else { + // No suitable internal symbol servers. This is fine because the converter + // is mainly used for downloading and converting of external symbols. + } + + // Make a request to an external server if the internal request didn't + // succeed, and it's safe to do so. + if (located != MSSymbolServerConverter::LOCATE_SUCCESS && + SafeToMakeExternalRequest(missing_info, options.blacklist_regex)) { + msss_servers = options.full_external_msss_servers; + if (!is_exe) { + msss_servers.insert(msss_servers.end(), + options.no_exe_external_msss_servers.begin(), + options.no_exe_external_msss_servers.end()); + } + if (msss_servers.size() > 0) { + FprintfFlush(stderr, "Making external request for %s (%s)\n", + missing_info.debug_file.c_str(), + missing_info.debug_identifier.c_str()); + MSSymbolServerConverter external_converter( + options.local_cache_path, msss_servers, options.trace_symsrv); + located = external_converter.LocateAndConvertSymbolFile( + missing_info, + /*keep_symbol_file=*/true, + /*keep_pe_file=*/true, &converted_file, &symbol_file, &pe_file); + } else { + FprintfFlush(stderr, "ERROR: No suitable external symbol servers.\n"); + } + } + + // Final handling for this symbol file is based on the result from the + // external request (if performed above), or on the result from the + // previous internal lookup. + switch (located) { + case MSSymbolServerConverter::LOCATE_SUCCESS: + FprintfFlush(stderr, "LocateResult = LOCATE_SUCCESS\n"); + // Upload it. Don't bother checking the return value. If this + // succeeds, it should disappear from the missing symbol list. + // If it fails, something will print an error message indicating + // the cause of the failure, and the item will remain on the + // missing symbol list. + UploadSymbolFile(options.upload_symbols_url, options.api_key, + missing_info.debug_file, missing_info.debug_identifier, + converted_file, kSymbolUploadTypeBreakpad); + if (!options.keep_files) + remove(converted_file.c_str()); + + // Upload PDB/PE if we have them + if (!symbol_file.empty()) { + UploadSymbolFile(options.upload_symbols_url, options.api_key, + missing_info.debug_file, missing_info.debug_identifier, + symbol_file, kSymbolUploadTypePDB); + if (!options.keep_files) + remove(symbol_file.c_str()); + } + if (!pe_file.empty()) { + UploadSymbolFile(options.upload_symbols_url, options.api_key, + missing_info.code_file, missing_info.debug_identifier, + pe_file, kSymbolUploadTypePE); + if (!options.keep_files) + remove(pe_file.c_str()); + } + + // Note: this does leave some directories behind that could be + // cleaned up. The directories inside options.local_cache_path for + // debug_file/debug_identifier can be removed at this point. + break; + + case MSSymbolServerConverter::LOCATE_NOT_FOUND: + // The symbol file definitively didn't exist. Inform the server. + // If this fails, something will print an error message indicating + // the cause of the failure, but there's really nothing more to + // do. If this succeeds, the entry should be removed from the + // missing symbols list. + if (!options.report_fetch_failures) { + FprintfFlush(stderr, "SendFetchFailedPing skipped\n"); + } else if (SendFetchFailedPing(options.fetch_symbol_failure_url, + missing_info)) { + FprintfFlush(stderr, "SendFetchFailedPing succeeded\n"); + } else { + FprintfFlush(stderr, "SendFetchFailedPing failed\n"); + } + break; + + case MSSymbolServerConverter::LOCATE_RETRY: + FprintfFlush(stderr, "LocateResult = LOCATE_RETRY\n"); + // Nothing to do but leave the entry in the symbol file list and + // try again on a future pass. Print a message so that there's + // a record. + FprintfFlush(stderr, "ConvertMissingSymbolFile: deferring retry " + "for %s %s %s\n", + missing_info.debug_file.c_str(), + missing_info.debug_identifier.c_str(), + missing_info.version.c_str()); + break; + + case MSSymbolServerConverter::LOCATE_HTTP_HTTPS_REDIR: + FprintfFlush( + stderr, + "LocateResult = LOCATE_HTTP_HTTPS_REDIR\n" + "One of the specified URLs is using HTTP, which causes a redirect " + "from the server to HTTPS, which causes the SymSrv lookup to fail.\n" + "This URL must be replaced with the correct HTTPS URL.\n"); + break; + + case MSSymbolServerConverter::LOCATE_FAILURE: + FprintfFlush(stderr, "LocateResult = LOCATE_FAILURE\n"); + // LocateAndConvertSymbolFile printed an error message. + + // This is due to a bad debug file name, so fetch failed. + if (!options.report_fetch_failures) { + FprintfFlush(stderr, "SendFetchFailedPing skipped\n"); + } else if (SendFetchFailedPing(options.fetch_symbol_failure_url, + missing_info)) { + FprintfFlush(stderr, "SendFetchFailedPing succeeded\n"); + } else { + FprintfFlush(stderr, "SendFetchFailedPing failed\n"); + } + break; + + default: + FprintfFlush( + stderr, + "FATAL: Unexpected return value '%d' from " + "LocateAndConvertSymbolFile()\n", + located); + assert(0); + break; + } +} + + +// Reads the contents of file |file_name| and populates |contents|. +// Returns true on success. +static bool ReadFile(string file_name, string* contents) { + char buffer[1024 * 8]; + FILE* fp = fopen(file_name.c_str(), "rt"); + if (!fp) { + return false; + } + contents->clear(); + while (fgets(buffer, sizeof(buffer), fp) != NULL) { + contents->append(buffer); + } + fclose(fp); + return true; +} + +// ConvertMissingSymbolsList obtains a missing symbol list from +// |options.missing_symbols_url| or |options.missing_symbols_file| and calls +// ConvertMissingSymbolFile for each missing symbol file in the list. +static bool ConvertMissingSymbolsList(const ConverterOptions& options) { + // Set param to indicate requesting for encoded response. + map parameters; + parameters[L"product"] = kConverterProductName; + parameters[L"encoded"] = L"true"; + // Get the missing symbol list. + string missing_symbol_list; + if (!options.missing_symbols_file.empty()) { + if (!ReadFile(options.missing_symbols_file,& missing_symbol_list)) { + return false; + } + } else if (!HTTPDownload::Download(options.missing_symbols_url,& parameters, + & missing_symbol_list, NULL)) { + return false; + } + + // Tokenize the content into a vector. + vector missing_symbol_lines; + Tokenizer::Tokenize("\n", missing_symbol_list,& missing_symbol_lines); + + FprintfFlush(stderr, "Found %d missing symbol files in list.\n", + missing_symbol_lines.size() - 1); // last line is empty. + int convert_attempts = 0; + for (vector::const_iterator iterator = missing_symbol_lines.begin(); + iterator != missing_symbol_lines.end(); + ++iterator) { + // Decode symbol line. + const string& encoded_line = *iterator; + // Skip lines that are blank. + if (encoded_line.empty()) { + continue; + } + + string line; + if (!WebSafeBase64Unescape(encoded_line,& line)) { + // If decoding fails, assume the line is not encoded. + // This is helpful when the program connects to a debug server without + // encoding. + line = encoded_line; + } + + FprintfFlush(stderr, "\nLine: %s\n", line.c_str()); + + // Turn each element into a MissingSymbolInfo structure. + MissingSymbolInfo missing_info; + if (!ParseMissingString(line,& missing_info)) { + FprintfFlush(stderr, "ConvertMissingSymbols: ParseMissingString failed " + "for %s from %ws\n", + line.c_str(), options.missing_symbols_url.c_str()); + continue; + } + + ++convert_attempts; + ConvertMissingSymbolFile(missing_info, options); + } + + // Say something reassuring, since ConvertMissingSymbolFile was never called + // and therefore never reported any progress. + if (convert_attempts == 0) { + string current_time = CurrentDateAndTime(); + FprintfFlush(stdout, "converter: %s: nothing to convert\n", + current_time.c_str()); + } + + return true; +} + +// usage prints the usage message. It returns 1 as a convenience, to be used +// as a return value from main. +static int usage(const char* program_name) { + FprintfFlush( + stderr, + "usage: %s [options]\n" + " -f MS servers to ask for all symbols\n" + " -n same, but prevent asking for EXEs\n" + " -l Temporary local storage for symbols\n" + " -s URL for uploading symbols\n" + " -k API key to use when uploading symbols\n" + " -m URL to fetch list of missing symbols\n" + " -mf File containing the list of missing\n" + " symbols. Fetch failures are not\n" + " reported if such file is provided.\n" + " -t URL to report symbol fetch failure\n" + " -b Regex used to blacklist files to\n" + " prevent external symbol requests\n" + " -tss If set then SymSrv callbacks will be\n" + " traced to stderr.\n" + " -keep-files If set then don't delete Breakpad/PE/\n" + " PDB files after conversion.\n" + " Note that any server specified by -f or -n that starts with \\filer\n" + " will be treated as internal, and all others as external.\n", + program_name); + + return 1; +} + +// "Internal" servers consist only of those whose names start with +// the literal string "\\filer\". +static bool IsInternalServer(const string& server_name) { + if (server_name.find("\\\\filer\\") == 0) { + return true; + } + return false; +} + +// Adds a server with the given name to the list of internal or external +// servers, as appropriate. +static void AddServer(const string& server_name, + vector* internal_servers, + vector* external_servers) { + if (IsInternalServer(server_name)) { + internal_servers->push_back(server_name); + } else { + external_servers->push_back(server_name); + } +} + +} // namespace + +int main(int argc, char** argv) { + string time_string = CurrentDateAndTime(); + FprintfFlush(stdout, "converter: %s: starting\n", time_string.c_str()); + + ConverterOptions options; + options.report_fetch_failures = true; + + string blacklist_regex_str; + bool have_any_msss_servers = false; + for (int argi = 1; argi < argc; argi++) { + string option = argv[argi]; + if (option == "-tss") { + printf("Tracing SymSrv callbacks to stderr.\n"); + options.trace_symsrv = true; + continue; + } else if (option == "-keep-files") { + printf("Keeping Breakpad/PE/PDB files after conversion.\n"); + options.keep_files = true; + continue; + } + + string value = argv[++argi]; + if (option == "-f") { + AddServer(value,& options.full_internal_msss_servers, + & options.full_external_msss_servers); + have_any_msss_servers = true; + } else if (option == "-n") { + AddServer(value,& options.no_exe_internal_msss_servers, + & options.no_exe_external_msss_servers); + have_any_msss_servers = true; + } else if (option == "-l") { + if (!options.local_cache_path.empty()) { + return usage(argv[0]); + } + options.local_cache_path = value; + } else if (option == "-s") { + if (!WindowsStringUtils::safe_mbstowcs(value, + & options.upload_symbols_url)) { + FprintfFlush(stderr, "main: safe_mbstowcs failed for %s\n", + value.c_str()); + return 1; + } + } else if (option == "-k") { + if (!WindowsStringUtils::safe_mbstowcs(value, &options.api_key)) { + FprintfFlush(stderr, "main: safe_mbstowcs failed for %s\n", + value.c_str()); + return 1; + } + } else if (option == "-m") { + if (!WindowsStringUtils::safe_mbstowcs(value, + & options.missing_symbols_url)) { + FprintfFlush(stderr, "main: safe_mbstowcs failed for %s\n", + value.c_str()); + return 1; + } + } else if (option == "-mf") { + options.missing_symbols_file = value; + printf("Getting the list of missing symbols from a file. Fetch failures" + " will not be reported.\n"); + options.report_fetch_failures = false; + } else if (option == "-t") { + if (!WindowsStringUtils::safe_mbstowcs( + value, + & options.fetch_symbol_failure_url)) { + FprintfFlush(stderr, "main: safe_mbstowcs failed for %s\n", + value.c_str()); + return 1; + } + } else if (option == "-b") { + blacklist_regex_str = value; + } else { + return usage(argv[0]); + } + } + + if (blacklist_regex_str.empty()) { + FprintfFlush(stderr, "No blacklist specified.\n"); + return usage(argv[0]); + } + + // Compile the blacklist regular expression for later use. + options.blacklist_regex = std::regex(blacklist_regex_str.c_str(), + std::regex_constants::icase); + + // Set the defaults. If the user specified any MSSS servers, don't use + // any default. + if (!have_any_msss_servers) { + AddServer(kNoExeMSSSServer,& options.no_exe_internal_msss_servers, + & options.no_exe_external_msss_servers); + } + + if (options.local_cache_path.empty()) { + options.local_cache_path = kLocalCachePath; + } + + if (options.upload_symbols_url.empty()) { + FprintfFlush(stderr, "No upload symbols URL specified.\n"); + return usage(argv[0]); + } + if (options.api_key.empty()) { + FprintfFlush(stderr, "No API key specified.\n"); + return usage(argv[0]); + } + if (options.missing_symbols_url.empty() && + options.missing_symbols_file.empty()) { + FprintfFlush(stderr, "No missing symbols URL or file specified.\n"); + return usage(argv[0]); + } + if (options.fetch_symbol_failure_url.empty()) { + FprintfFlush(stderr, "No fetch symbol failure URL specified.\n"); + return usage(argv[0]); + } + + FprintfFlush(stdout, + "# of Symbol Servers (int/ext): %d/%d full, %d/%d no_exe\n", + options.full_internal_msss_servers.size(), + options.full_external_msss_servers.size(), + options.no_exe_internal_msss_servers.size(), + options.no_exe_external_msss_servers.size()); + + if (!ConvertMissingSymbolsList(options)) { + return 1; + } + + time_string = CurrentDateAndTime(); + FprintfFlush(stdout, "converter: %s: finished\n", time_string.c_str()); + return 0; +} diff --git a/src/tools/windows/converter_exe/escaping.cc b/src/tools/windows/converter_exe/escaping.cc new file mode 100644 index 0000000..e399c0f --- /dev/null +++ b/src/tools/windows/converter_exe/escaping.cc @@ -0,0 +1,761 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "tools/windows/converter_exe/escaping.h" + +#include + +#define kApb kAsciiPropertyBits + +const unsigned char kAsciiPropertyBits[256] = { + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x00 + 0x40, 0x68, 0x48, 0x48, 0x48, 0x48, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x10 + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, // 0x20 + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x84, 0x84, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x05, // 0x40 + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, // 0x50 + 0x05, 0x05, 0x05, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x05, // 0x60 + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, // 0x70 + 0x05, 0x05, 0x05, 0x10, 0x10, 0x10, 0x10, 0x40, +}; + +// Use !! to suppress the warning C4800 of forcing 'int' to 'bool'. +static inline bool ascii_isspace(unsigned char c) { return !!(kApb[c] & 0x08); } + +/////////////////////////////////// +// scoped_array +/////////////////////////////////// +// scoped_array is like scoped_ptr, except that the caller must allocate +// with new [] and the destructor deletes objects with delete []. +// +// As with scoped_ptr, a scoped_array either points to an object +// or is NULL. A scoped_array owns the object that it points to. +// scoped_array is thread-compatible, and once you index into it, +// the returned objects have only the threadsafety guarantees of T. +// +// Size: sizeof(scoped_array) == sizeof(C*) +template +class scoped_array { + public: + + // The element type + typedef C element_type; + + // Constructor. Defaults to intializing with NULL. + // There is no way to create an uninitialized scoped_array. + // The input parameter must be allocated with new []. + explicit scoped_array(C* p = NULL) : array_(p) { } + + // Destructor. If there is a C object, delete it. + // We don't need to test ptr_ == NULL because C++ does that for us. + ~scoped_array() { + enum { type_must_be_complete = sizeof(C) }; + delete[] array_; + } + + // Reset. Deletes the current owned object, if any. + // Then takes ownership of a new object, if given. + // this->reset(this->get()) works. + void reset(C* p = NULL) { + if (p != array_) { + enum { type_must_be_complete = sizeof(C) }; + delete[] array_; + array_ = p; + } + } + + // Get one element of the current object. + // Will assert() if there is no current object, or index i is negative. + C& operator[](std::ptrdiff_t i) const { + assert(i >= 0); + assert(array_ != NULL); + return array_[i]; + } + + // Get a pointer to the zeroth element of the current object. + // If there is no current object, return NULL. + C* get() const { + return array_; + } + + // Comparison operators. + // These return whether a scoped_array and a raw pointer refer to + // the same array, not just to two different but equal arrays. + bool operator==(const C* p) const { return array_ == p; } + bool operator!=(const C* p) const { return array_ != p; } + + // Swap two scoped arrays. + void swap(scoped_array& p2) { + C* tmp = array_; + array_ = p2.array_; + p2.array_ = tmp; + } + + // Release an array. + // The return value is the current pointer held by this object. + // If this object holds a NULL pointer, the return value is NULL. + // After this operation, this object will hold a NULL pointer, + // and will not own the object any more. + C* release() { + C* retVal = array_; + array_ = NULL; + return retVal; + } + + private: + C* array_; + + // Forbid comparison of different scoped_array types. + template bool operator==(scoped_array const& p2) const; + template bool operator!=(scoped_array const& p2) const; + + // Disallow evil constructors + scoped_array(const scoped_array&); + void operator=(const scoped_array&); +}; + + +/////////////////////////////////// +// Escape methods +/////////////////////////////////// + +namespace strings { + +// Return a mutable char* pointing to a string's internal buffer, +// which may not be null-terminated. Writing through this pointer will +// modify the string. +// +// string_as_array(&str)[i] is valid for 0 <= i < str.size() until the +// next call to a string method that invalidates iterators. +// +// As of 2006-04, there is no standard-blessed way of getting a +// mutable reference to a string's internal buffer. However, issue 530 +// (http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#530) +// proposes this as the method. According to Matt Austern, this should +// already work on all current implementations. +inline char* string_as_array(string* str) { + // DO NOT USE const_cast(str->data())! See the unittest for why. + return str->empty() ? NULL : &*str->begin(); +} + +int CalculateBase64EscapedLen(int input_len, bool do_padding) { + // these formulae were copied from comments that used to go with the base64 + // encoding functions + int intermediate_result = 8 * input_len + 5; + assert(intermediate_result > 0); // make sure we didn't overflow + int len = intermediate_result / 6; + if (do_padding) len = ((len + 3) / 4) * 4; + return len; +} + +// Base64Escape does padding, so this calculation includes padding. +int CalculateBase64EscapedLen(int input_len) { + return CalculateBase64EscapedLen(input_len, true); +} + +// ---------------------------------------------------------------------- +// int Base64Unescape() - base64 decoder +// int Base64Escape() - base64 encoder +// int WebSafeBase64Unescape() - Google's variation of base64 decoder +// int WebSafeBase64Escape() - Google's variation of base64 encoder +// +// Check out +// http://www.cis.ohio-state.edu/htbin/rfc/rfc2045.html for formal +// description, but what we care about is that... +// Take the encoded stuff in groups of 4 characters and turn each +// character into a code 0 to 63 thus: +// A-Z map to 0 to 25 +// a-z map to 26 to 51 +// 0-9 map to 52 to 61 +// +(- for WebSafe) maps to 62 +// /(_ for WebSafe) maps to 63 +// There will be four numbers, all less than 64 which can be represented +// by a 6 digit binary number (aaaaaa, bbbbbb, cccccc, dddddd respectively). +// Arrange the 6 digit binary numbers into three bytes as such: +// aaaaaabb bbbbcccc ccdddddd +// Equals signs (one or two) are used at the end of the encoded block to +// indicate that the text was not an integer multiple of three bytes long. +// ---------------------------------------------------------------------- + +int Base64UnescapeInternal(const char *src, int szsrc, + char *dest, int szdest, + const signed char* unbase64) { + static const char kPad64 = '='; + + int decode = 0; + int destidx = 0; + int state = 0; + unsigned int ch = 0; + unsigned int temp = 0; + + // The GET_INPUT macro gets the next input character, skipping + // over any whitespace, and stopping when we reach the end of the + // string or when we read any non-data character. The arguments are + // an arbitrary identifier (used as a label for goto) and the number + // of data bytes that must remain in the input to avoid aborting the + // loop. +#define GET_INPUT(label, remain) \ + label: \ + --szsrc; \ + ch = *src++; \ + decode = unbase64[ch]; \ + if (decode < 0) { \ + if (ascii_isspace((char)ch) && szsrc >= remain) \ + goto label; \ + state = 4 - remain; \ + break; \ + } + + // if dest is null, we're just checking to see if it's legal input + // rather than producing output. (I suspect this could just be done + // with a regexp...). We duplicate the loop so this test can be + // outside it instead of in every iteration. + + if (dest) { + // This loop consumes 4 input bytes and produces 3 output bytes + // per iteration. We can't know at the start that there is enough + // data left in the string for a full iteration, so the loop may + // break out in the middle; if so 'state' will be set to the + // number of input bytes read. + + while (szsrc >= 4) { + // We'll start by optimistically assuming that the next four + // bytes of the string (src[0..3]) are four good data bytes + // (that is, no nulls, whitespace, padding chars, or illegal + // chars). We need to test src[0..2] for nulls individually + // before constructing temp to preserve the property that we + // never read past a null in the string (no matter how long + // szsrc claims the string is). + + if (!src[0] || !src[1] || !src[2] || + (temp = ((unbase64[static_cast(src[0])] << 18) | + (unbase64[static_cast(src[1])] << 12) | + (unbase64[static_cast(src[2])] << 6) | + (unbase64[static_cast(src[3])]))) & 0x80000000) { + // Iff any of those four characters was bad (null, illegal, + // whitespace, padding), then temp's high bit will be set + // (because unbase64[] is -1 for all bad characters). + // + // We'll back up and resort to the slower decoder, which knows + // how to handle those cases. + + GET_INPUT(first, 4); + temp = decode; + GET_INPUT(second, 3); + temp = (temp << 6) | decode; + GET_INPUT(third, 2); + temp = (temp << 6) | decode; + GET_INPUT(fourth, 1); + temp = (temp << 6) | decode; + } else { + // We really did have four good data bytes, so advance four + // characters in the string. + + szsrc -= 4; + src += 4; + decode = -1; + ch = '\0'; + } + + // temp has 24 bits of input, so write that out as three bytes. + + if (destidx+3 > szdest) return -1; + dest[destidx+2] = (char)temp; + temp >>= 8; + dest[destidx+1] = (char)temp; + temp >>= 8; + dest[destidx] = (char)temp; + destidx += 3; + } + } else { + while (szsrc >= 4) { + if (!src[0] || !src[1] || !src[2] || + (temp = ((unbase64[static_cast(src[0])] << 18) | + (unbase64[static_cast(src[1])] << 12) | + (unbase64[static_cast(src[2])] << 6) | + (unbase64[static_cast(src[3])]))) & 0x80000000) { + GET_INPUT(first_no_dest, 4); + GET_INPUT(second_no_dest, 3); + GET_INPUT(third_no_dest, 2); + GET_INPUT(fourth_no_dest, 1); + } else { + szsrc -= 4; + src += 4; + decode = -1; + ch = '\0'; + } + destidx += 3; + } + } + +#undef GET_INPUT + + // if the loop terminated because we read a bad character, return + // now. + if (decode < 0 && ch != '\0' && ch != kPad64 && !ascii_isspace((char)ch)) + return -1; + + if (ch == kPad64) { + // if we stopped by hitting an '=', un-read that character -- we'll + // look at it again when we count to check for the proper number of + // equals signs at the end. + ++szsrc; + --src; + } else { + // This loop consumes 1 input byte per iteration. It's used to + // clean up the 0-3 input bytes remaining when the first, faster + // loop finishes. 'temp' contains the data from 'state' input + // characters read by the first loop. + while (szsrc > 0) { + --szsrc; + ch = *src++; + decode = unbase64[ch]; + if (decode < 0) { + if (ascii_isspace((char)ch)) { + continue; + } else if (ch == '\0') { + break; + } else if (ch == kPad64) { + // back up one character; we'll read it again when we check + // for the correct number of equals signs at the end. + ++szsrc; + --src; + break; + } else { + return -1; + } + } + + // Each input character gives us six bits of output. + temp = (temp << 6) | decode; + ++state; + if (state == 4) { + // If we've accumulated 24 bits of output, write that out as + // three bytes. + if (dest) { + if (destidx+3 > szdest) return -1; + dest[destidx+2] = (char)temp; + temp >>= 8; + dest[destidx+1] = (char)temp; + temp >>= 8; + dest[destidx] = (char)temp; + } + destidx += 3; + state = 0; + temp = 0; + } + } + } + + // Process the leftover data contained in 'temp' at the end of the input. + int expected_equals = 0; + switch (state) { + case 0: + // Nothing left over; output is a multiple of 3 bytes. + break; + + case 1: + // Bad input; we have 6 bits left over. + return -1; + + case 2: + // Produce one more output byte from the 12 input bits we have left. + if (dest) { + if (destidx+1 > szdest) return -1; + temp >>= 4; + dest[destidx] = (char)temp; + } + ++destidx; + expected_equals = 2; + break; + + case 3: + // Produce two more output bytes from the 18 input bits we have left. + if (dest) { + if (destidx+2 > szdest) return -1; + temp >>= 2; + dest[destidx+1] = (char)temp; + temp >>= 8; + dest[destidx] = (char)temp; + } + destidx += 2; + expected_equals = 1; + break; + + default: + // state should have no other values at this point. + fprintf(stdout, "This can't happen; base64 decoder state = %d", state); + } + + // The remainder of the string should be all whitespace, mixed with + // exactly 0 equals signs, or exactly 'expected_equals' equals + // signs. (Always accepting 0 equals signs is a google extension + // not covered in the RFC.) + + int equals = 0; + while (szsrc > 0 && *src) { + if (*src == kPad64) + ++equals; + else if (!ascii_isspace(*src)) + return -1; + --szsrc; + ++src; + } + + return (equals == 0 || equals == expected_equals) ? destidx : -1; +} + +int Base64Unescape(const char *src, int szsrc, char *dest, int szdest) { + static const signed char UnBase64[] = { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 62/*+*/, -1, -1, -1, 63/*/ */, + 52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/, + 60/*8*/, 61/*9*/, -1, -1, -1, -1, -1, -1, + -1, 0/*A*/, 1/*B*/, 2/*C*/, 3/*D*/, 4/*E*/, 5/*F*/, 6/*G*/, + 7/*H*/, 8/*I*/, 9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/, + 15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/, + 23/*X*/, 24/*Y*/, 25/*Z*/, -1, -1, -1, -1, -1, + -1, 26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/, + 33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/, + 41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/, + 49/*x*/, 50/*y*/, 51/*z*/, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1 + }; + // The above array was generated by the following code + // #include + // #include + // #include + // main() + // { + // static const char Base64[] = + // "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + // char *pos; + // int idx, i, j; + // printf(" "); + // for (i = 0; i < 255; i += 8) { + // for (j = i; j < i + 8; j++) { + // pos = strchr(Base64, j); + // if ((pos == NULL) || (j == 0)) + // idx = -1; + // else + // idx = pos - Base64; + // if (idx == -1) + // printf(" %2d, ", idx); + // else + // printf(" %2d/*%c*/,", idx, j); + // } + // printf("\n "); + // } + // } + + return Base64UnescapeInternal(src, szsrc, dest, szdest, UnBase64); +} + +bool Base64Unescape(const char *src, int slen, string* dest) { + // Determine the size of the output string. Base64 encodes every 3 bytes into + // 4 characters. any leftover chars are added directly for good measure. + // This is documented in the base64 RFC: http://www.ietf.org/rfc/rfc3548.txt + const int dest_len = 3 * (slen / 4) + (slen % 4); + + dest->resize(dest_len); + + // We are getting the destination buffer by getting the beginning of the + // string and converting it into a char *. + const int len = Base64Unescape(src, slen, + string_as_array(dest), dest->size()); + if (len < 0) { + return false; + } + + // could be shorter if there was padding + assert(len <= dest_len); + dest->resize(len); + + return true; +} + +// Base64Escape +// +// NOTE: We have to use an unsigned type for src because code built +// in the the /google tree treats characters as signed unless +// otherwised specified. +// +// TODO(who?): Move this function to use the char* type for "src" +int Base64EscapeInternal(const unsigned char *src, int szsrc, + char *dest, int szdest, const char *base64, + bool do_padding) { + static const char kPad64 = '='; + + if (szsrc <= 0) return 0; + + char *cur_dest = dest; + const unsigned char *cur_src = src; + + // Three bytes of data encodes to four characters of cyphertext. + // So we can pump through three-byte chunks atomically. + while (szsrc > 2) { /* keep going until we have less than 24 bits */ + if ((szdest -= 4) < 0) return 0; + cur_dest[0] = base64[cur_src[0] >> 2]; + cur_dest[1] = base64[((cur_src[0] & 0x03) << 4) + (cur_src[1] >> 4)]; + cur_dest[2] = base64[((cur_src[1] & 0x0f) << 2) + (cur_src[2] >> 6)]; + cur_dest[3] = base64[cur_src[2] & 0x3f]; + + cur_dest += 4; + cur_src += 3; + szsrc -= 3; + } + + /* now deal with the tail (<=2 bytes) */ + switch (szsrc) { + case 0: + // Nothing left; nothing more to do. + break; + case 1: + // One byte left: this encodes to two characters, and (optionally) + // two pad characters to round out the four-character cypherblock. + if ((szdest -= 2) < 0) return 0; + cur_dest[0] = base64[cur_src[0] >> 2]; + cur_dest[1] = base64[(cur_src[0] & 0x03) << 4]; + cur_dest += 2; + if (do_padding) { + if ((szdest -= 2) < 0) return 0; + cur_dest[0] = kPad64; + cur_dest[1] = kPad64; + cur_dest += 2; + } + break; + case 2: + // Two bytes left: this encodes to three characters, and (optionally) + // one pad character to round out the four-character cypherblock. + if ((szdest -= 3) < 0) return 0; + cur_dest[0] = base64[cur_src[0] >> 2]; + cur_dest[1] = base64[((cur_src[0] & 0x03) << 4) + (cur_src[1] >> 4)]; + cur_dest[2] = base64[(cur_src[1] & 0x0f) << 2]; + cur_dest += 3; + if (do_padding) { + if ((szdest -= 1) < 0) return 0; + cur_dest[0] = kPad64; + cur_dest += 1; + } + break; + default: + // Should not be reached: blocks of 3 bytes are handled + // in the while loop before this switch statement. + fprintf(stderr, "Logic problem? szsrc = %d", szsrc); + assert(false); + break; + } + return (cur_dest - dest); +} + +static const char kBase64Chars[] = +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static const char kWebSafeBase64Chars[] = +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + +int Base64Escape(const unsigned char *src, int szsrc, char *dest, int szdest) { + return Base64EscapeInternal(src, szsrc, dest, szdest, kBase64Chars, true); +} + +void Base64Escape(const unsigned char *src, int szsrc, + string* dest, bool do_padding) { + const int max_escaped_size = + CalculateBase64EscapedLen(szsrc, do_padding); + dest->clear(); + dest->resize(max_escaped_size + 1, '\0'); + const int escaped_len = Base64EscapeInternal(src, szsrc, + &*dest->begin(), dest->size(), + kBase64Chars, + do_padding); + assert(max_escaped_size <= escaped_len); + dest->resize(escaped_len); +} + +void Base64Escape(const string& src, string* dest) { + Base64Escape(reinterpret_cast(src.c_str()), + src.size(), dest, true); +} + +//////////////////////////////////////////////////// +// WebSafe methods +//////////////////////////////////////////////////// + +int WebSafeBase64Unescape(const char *src, int szsrc, char *dest, int szdest) { + static const signed char UnBase64[] = { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 62/*-*/, -1, -1, + 52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/, + 60/*8*/, 61/*9*/, -1, -1, -1, -1, -1, -1, + -1, 0/*A*/, 1/*B*/, 2/*C*/, 3/*D*/, 4/*E*/, 5/*F*/, 6/*G*/, + 7/*H*/, 8/*I*/, 9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/, + 15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/, + 23/*X*/, 24/*Y*/, 25/*Z*/, -1, -1, -1, -1, 63/*_*/, + -1, 26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/, + 33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/, + 41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/, + 49/*x*/, 50/*y*/, 51/*z*/, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1 + }; + // The above array was generated by the following code + // #include + // #include + // #include + // main() + // { + // static const char Base64[] = + // "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + // char *pos; + // int idx, i, j; + // printf(" "); + // for (i = 0; i < 255; i += 8) { + // for (j = i; j < i + 8; j++) { + // pos = strchr(Base64, j); + // if ((pos == NULL) || (j == 0)) + // idx = -1; + // else + // idx = pos - Base64; + // if (idx == -1) + // printf(" %2d, ", idx); + // else + // printf(" %2d/*%c*/,", idx, j); + // } + // printf("\n "); + // } + // } + + return Base64UnescapeInternal(src, szsrc, dest, szdest, UnBase64); +} + +bool WebSafeBase64Unescape(const char *src, int slen, string* dest) { + int dest_len = 3 * (slen / 4) + (slen % 4); + dest->clear(); + dest->resize(dest_len); + int len = WebSafeBase64Unescape(src, slen, &*dest->begin(), dest->size()); + if (len < 0) { + dest->clear(); + return false; + } + // could be shorter if there was padding + assert(len <= dest_len); + dest->resize(len); + return true; +} + +bool WebSafeBase64Unescape(const string& src, string* dest) { + return WebSafeBase64Unescape(src.data(), src.size(), dest); +} + +int WebSafeBase64Escape(const unsigned char *src, int szsrc, char *dest, + int szdest, bool do_padding) { + return Base64EscapeInternal(src, szsrc, dest, szdest, + kWebSafeBase64Chars, do_padding); +} + +void WebSafeBase64Escape(const unsigned char *src, int szsrc, + string *dest, bool do_padding) { + const int max_escaped_size = + CalculateBase64EscapedLen(szsrc, do_padding); + dest->clear(); + dest->resize(max_escaped_size + 1, '\0'); + const int escaped_len = Base64EscapeInternal(src, szsrc, + &*dest->begin(), dest->size(), + kWebSafeBase64Chars, + do_padding); + assert(max_escaped_size <= escaped_len); + dest->resize(escaped_len); +} + +void WebSafeBase64EscapeInternal(const string& src, + string* dest, + bool do_padding) { + int encoded_len = CalculateBase64EscapedLen(src.size()); + scoped_array buf(new char[encoded_len]); + int len = WebSafeBase64Escape(reinterpret_cast(src.c_str()), + src.size(), buf.get(), + encoded_len, do_padding); + dest->assign(buf.get(), len); +} + +void WebSafeBase64Escape(const string& src, string* dest) { + WebSafeBase64EscapeInternal(src, dest, false); +} + +void WebSafeBase64EscapeWithPadding(const string& src, string* dest) { + WebSafeBase64EscapeInternal(src, dest, true); +} + +} // namespace strings diff --git a/src/tools/windows/converter_exe/escaping.h b/src/tools/windows/converter_exe/escaping.h new file mode 100644 index 0000000..bc36bf5 --- /dev/null +++ b/src/tools/windows/converter_exe/escaping.h @@ -0,0 +1,99 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Base64 escaping methods to encode/decode strings. + +#ifndef TOOLS_WINDOWS_CONVERTER_EXE_ESCAPING_H_ +#define TOOLS_WINDOWS_CONVERTER_EXE_ESCAPING_H_ + +#include + +namespace strings { + +using std::string; + +// ---------------------------------------------------------------------- +// Base64Escape() +// WebSafeBase64Escape() +// Encode "src" to "dest" using base64 encoding. +// src is not null terminated, instead specify len. +// 'dest' should have at least CalculateBase64EscapedLen() length. +// RETURNS the length of dest. +// The WebSafe variation use '-' instead of '+' and '_' instead of '/' +// so that we can place the out in the URL or cookies without having +// to escape them. It also has an extra parameter "do_padding", +// which when set to false will prevent padding with "=". +// ---------------------------------------------------------------------- +void Base64Escape(const string& src, string* dest); +int Base64Escape(const unsigned char* src, int slen, char* dest, int szdest); +// Encode src into dest with padding. +void Base64Escape(const unsigned char* src, int szsrc, + string* dest, bool do_padding); + +int WebSafeBase64Escape(const unsigned char* src, int slen, char* dest, + int szdest, bool do_padding); +// Encode src into dest web-safely without padding. +void WebSafeBase64Escape(const string& src, string* dest); +// Encode src into dest web-safely with padding. +void WebSafeBase64EscapeWithPadding(const string& src, string* dest); +void WebSafeBase64Escape(const unsigned char* src, int szsrc, + string* dest, bool do_padding); + +// ---------------------------------------------------------------------- +// Base64Unescape() +// WebSafeBase64Unescape() +// Copies "src" to "dest", where src is in base64 and is written to its +// ASCII equivalents. src is not null terminated, instead specify len. +// I recommend that slen +#include +#include + +typedef void* HttpHandle; + +namespace crash { + +// HttpClient provides an abstract layer for HTTP APIs. The actual +// implementation can be based on either WinHttp or WinInet. +class HttpClient { + public: + enum AccessType { + ACCESS_TYPE_PRECONFIG, + ACCESS_TYPE_DIRECT, + ACCESS_TYPE_PROXY, + }; + + virtual ~HttpClient() {} + + virtual bool CrackUrl(const TCHAR* url, + DWORD flags, + TCHAR* scheme, + size_t scheme_buffer_length, + TCHAR* host, + size_t host_buffer_length, + TCHAR* uri, + size_t uri_buffer_length, + int* port) const = 0; + virtual bool Open(const TCHAR* user_agent, + DWORD access_type, + const TCHAR* proxy_name, + const TCHAR* proxy_bypass, + HttpHandle* session_handle) const = 0; + virtual bool Connect(HttpHandle session_handle, + const TCHAR* server, + int port, + HttpHandle* connection_handle) const = 0; + virtual bool OpenRequest(HttpHandle connection_handle, + const TCHAR* verb, + const TCHAR* uri, + const TCHAR* version, + const TCHAR* referrer, + bool is_secure, + HttpHandle* request_handle) const = 0; + virtual bool SendRequest(HttpHandle request_handle, + const TCHAR* headers, + DWORD headers_length) const = 0; + virtual bool ReceiveResponse(HttpHandle request_handle) const = 0; + virtual bool GetHttpStatusCode(HttpHandle request_handle, + int* status_code) const = 0; + virtual bool GetContentLength(HttpHandle request_handle, + DWORD* content_length) const = 0; + virtual bool ReadData(HttpHandle request_handle, + void* buffer, + DWORD buffer_length, + DWORD* bytes_read) const = 0; + virtual bool Close(HttpHandle handle) const = 0; + + static const DWORD kUnknownContentLength = (DWORD)-1; +}; + +} // namespace crash + +#endif // TOOLS_CRASH_CONVERTER_WINDOWS_HTTP_CLIENT_H_ diff --git a/src/tools/windows/converter_exe/http_download.cc b/src/tools/windows/converter_exe/http_download.cc new file mode 100644 index 0000000..de82419 --- /dev/null +++ b/src/tools/windows/converter_exe/http_download.cc @@ -0,0 +1,330 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include +#include +#include + +#include + +#include "tools/windows/converter_exe/http_download.h" +#include "tools/windows/converter_exe/winhttp_client.h" +#include "tools/windows/converter_exe/wininet_client.h" + +namespace crash { +static const std::vector::size_type kVectorChunkSize = 4096; // 4 KB + +using std::vector; + +// Class that atuo closes the contained HttpHandle when the object +// goes out of scope. +class AutoHttpHandle { + public: + AutoHttpHandle() : handle_(NULL) {} + explicit AutoHttpHandle(HttpHandle handle) : handle_(handle) {} + ~AutoHttpHandle() { + if (handle_) { + InternetCloseHandle(handle_); + } + } + + HttpHandle get() { return handle_; } + HttpHandle* get_handle_addr () { return &handle_; } + + private: + HttpHandle handle_; +}; + +// Template class for auto releasing the contained pointer when +// the object goes out of scope. +template +class AutoPtr { + public: + explicit AutoPtr(T* ptr) : ptr_(ptr) {} + ~AutoPtr() { + if (ptr_) { + delete ptr_; + } + } + + T* get() { return ptr_; } + T* operator -> () { return ptr_; } + + private: + T* ptr_; +}; + +// CheckParameters ensures that the parameters in |parameters| are safe for +// use in an HTTP URL. Returns true if they are, false if unsafe characters +// are present. +static bool CheckParameters(const map* parameters) { + for (map::const_iterator iterator = parameters->begin(); + iterator != parameters->end(); + ++iterator) { + const wstring& key = iterator->first; + if (key.empty()) { + // Disallow empty parameter names. + return false; + } + for (unsigned int i = 0; i < key.size(); ++i) { + wchar_t c = key[i]; + if (c < 32 || c == '"' || c == '?' || c == '&' || c > 127) { + return false; + } + } + + const wstring& value = iterator->second; + for (unsigned int i = 0; i < value.size(); ++i) { + wchar_t c = value[i]; + if (c < 32 || c == '"' || c == '?' || c == '&' || c > 127) { + return false; + } + } + } + + return true; +} + +HttpClient* HTTPDownload::CreateHttpClient(const wchar_t* url) { + const TCHAR* kHttpApiPolicyEnvironmentVariable = TEXT("USE_WINHTTP"); + TCHAR buffer[2] = {0}; + HttpClient* http_client = NULL; + + if (::GetEnvironmentVariable(kHttpApiPolicyEnvironmentVariable, + buffer, + sizeof(buffer)/sizeof(buffer[0])) > 0) { + fprintf(stdout, + "Environment variable [%ws] is set, use WinHttp\n", + kHttpApiPolicyEnvironmentVariable); + http_client = CreateWinHttpClient(url); + if (http_client == NULL) { + fprintf(stderr, "WinHttpClient not created, Is the protocol HTTPS? " + "Fall back to WinInet API.\n"); + } + } else { + fprintf(stderr, + "Environment variable [%ws] is NOT set, use WinInet API\n", + kHttpApiPolicyEnvironmentVariable); + } + + if (http_client == NULL) { + return CreateWinInetClient(url); + } + + return http_client; +} + +// static +bool HTTPDownload::Download(const wstring& url, + const map* parameters, + string *content, int *status_code) { + assert(content); + AutoPtr http_client(CreateHttpClient(url.c_str())); + + if (!http_client.get()) { + fprintf(stderr, "Failed to create any http client.\n"); + return false; + } + + if (status_code) { + *status_code = 0; + } + + wchar_t scheme[16] = {0}; + wchar_t host[256] = {0}; + wchar_t path[256] = {0}; + int port = 0; + if (!http_client->CrackUrl(url.c_str(), + 0, + scheme, + sizeof(scheme)/sizeof(scheme[0]), + host, + sizeof(host)/sizeof(host[0]), + path, + sizeof(path)/sizeof(path[0]), + &port)) { + fprintf(stderr, + "HTTPDownload::Download: InternetCrackUrl: error %lu for %ws\n", + GetLastError(), url.c_str()); + return false; + } + + bool secure = false; + if (_wcsicmp(scheme, L"https") == 0) { + secure = true; + } else if (wcscmp(scheme, L"http") != 0) { + fprintf(stderr, + "HTTPDownload::Download: scheme must be http or https for %ws\n", + url.c_str()); + return false; + } + + AutoHttpHandle internet; + if (!http_client->Open(NULL, // user agent + HttpClient::ACCESS_TYPE_PRECONFIG, + NULL, // proxy name + NULL, // proxy bypass + internet.get_handle_addr())) { + fprintf(stderr, + "HTTPDownload::Download: Open: error %lu for %ws\n", + GetLastError(), url.c_str()); + return false; + } + + AutoHttpHandle connection; + if (!http_client->Connect(internet.get(), + host, + port, + connection.get_handle_addr())) { + fprintf(stderr, + "HTTPDownload::Download: InternetConnect: error %lu for %ws\n", + GetLastError(), url.c_str()); + return false; + } + + wstring request_string = path; + if (parameters) { + // TODO(mmentovai): escape bad characters in parameters instead of + // forbidding them. + if (!CheckParameters(parameters)) { + fprintf(stderr, + "HTTPDownload::Download: invalid characters in parameters\n"); + return false; + } + + bool added_parameter = false; + for (map::const_iterator iterator = parameters->begin(); + iterator != parameters->end(); + ++iterator) { + request_string.append(added_parameter ? L"&" : L"?"); + request_string.append(iterator->first); + request_string.append(L"="); + request_string.append(iterator->second); + added_parameter = true; + } + } + + AutoHttpHandle request; + if (!http_client->OpenRequest(connection.get(), + L"GET", + request_string.c_str(), + NULL, // version + NULL, // referer + secure, + request.get_handle_addr())) { + fprintf(stderr, + "HttpClient::OpenRequest: error %lu for %ws, request: %ws\n", + GetLastError(), url.c_str(), request_string.c_str()); + return false; + } + + if (!http_client->SendRequest(request.get(), NULL, 0)) { + fprintf(stderr, + "HttpClient::SendRequest: error %lu for %ws\n", + GetLastError(), url.c_str()); + return false; + } + + if (!http_client->ReceiveResponse(request.get())) { + fprintf(stderr, + "HttpClient::ReceiveResponse: error %lu for %ws\n", + GetLastError(), url.c_str()); + return false; + } + + int http_status = 0; + if (!http_client->GetHttpStatusCode(request.get(), &http_status)) { + fprintf(stderr, + "HttpClient::GetHttpStatusCode: error %lu for %ws\n", + GetLastError(), url.c_str()); + return false; + } + if (http_status != 200) { + fprintf(stderr, + "HTTPDownload::Download: HTTP status code %d for %ws\n", + http_status, url.c_str()); + return false; + } + + DWORD content_length = 0; + vector::size_type buffer_size = 0; + http_client->GetContentLength(request.get(), &content_length); + if (content_length == HttpClient::kUnknownContentLength) { + buffer_size = kVectorChunkSize; + } else { + buffer_size = content_length; + } + + if (content_length != 0) { + vector response_buffer = vector(buffer_size+1); + DWORD size_read; + DWORD total_read = 0; + bool read_result; + do { + if (content_length == HttpClient::kUnknownContentLength + && buffer_size == total_read) { + // The content length wasn't specified in the response header, so we + // have to keep growing the buffer until we're done reading. + buffer_size += kVectorChunkSize; + response_buffer.resize(buffer_size); + } + read_result = !!http_client->ReadData( + request.get(), + &response_buffer[total_read], + static_cast(buffer_size) - total_read, + &size_read); + total_read += size_read; + } while (read_result && (size_read != 0)); + + if (!read_result) { + fprintf(stderr, + "HttpClient::ReadData: error %lu for %ws\n", + GetLastError(), + url.c_str()); + return false; + } else if (size_read != 0) { + fprintf(stderr, + "HttpClient::ReadData: error %lu/%lu for %ws\n", + total_read, + content_length, + url.c_str()); + return false; + } + content->assign(&response_buffer[0], total_read); + } else { + content->clear(); + } + return true; +} + +} // namespace crash diff --git a/src/tools/windows/converter_exe/http_download.h b/src/tools/windows/converter_exe/http_download.h new file mode 100644 index 0000000..f58a3d0 --- /dev/null +++ b/src/tools/windows/converter_exe/http_download.h @@ -0,0 +1,62 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef TOOLS_WINDOWS_CONVERTER_EXE_HTTP_DOWNLOAD_H_ +#define TOOLS_WINDOWS_CONVERTER_EXE_HTTP_DOWNLOAD_H_ + +#include +#include +#include "tools/windows/converter_exe/winhttp_client.h" + +namespace crash { + +using std::map; +using std::string; +using std::wstring; + +class HTTPDownload { + public: + // Retrieves the resource located at |url|, a http or https URL, via WinInet. + // The request is fetched with GET request; the optional |parameters| are + // appended to the URL. Returns true on success, placing the content of the + // retrieved resource in |content|. Returns false on failure. HTTP status + // codes other than 200 cause Download to return false. If |status_code| is + // supplied, it will be set to the value of the HTTP status code, if an HTTP + // transaction occurs. If Download fails before a transaction can occur, + // |status_code| will be set to 0. Any failures will result in messages + // being printed to stderr. + static bool Download(const wstring& url, + const map* parameters, + string *content, int *status_code); + private: + static HttpClient* CreateHttpClient(const wchar_t*); +}; + +} // namespace crash + +#endif // TOOLS_WINDOWS_CONVERTER_EXE_HTTP_DOWNLOAD_H_ diff --git a/src/tools/windows/converter_exe/missing_symbols_test.txt b/src/tools/windows/converter_exe/missing_symbols_test.txt new file mode 100644 index 0000000..6262f06 --- /dev/null +++ b/src/tools/windows/converter_exe/missing_symbols_test.txt @@ -0,0 +1,5 @@ +msctf.pdb|6A5BABB8E88644C696530BFE3C90F32F2|6.1.7600.16385|msctf.dll|4A5BDFAA109000 +imm32.pdb|98F27BA5AEE541ECBEE00CD03AD50FEE2|6.1.7600.16385|imm32.dll|4A5BDF402e000 +amd_opencl64.pdb|3D306D0FCCB14F47AF322A5ACDF5EEA81||amd_opencl64.dll|587901FB1E000 +igd10iumd64.pdb|B2B72475BB0846D8ADE4344FAE0CCE361 ||igd10iumd64.dll|568D69FBD99000 +NvCameraWhitelisting64.pdb|3C364C4D3FBF4180B021D52D469C6DAB1||NvCameraWhitelisting64.dll|5B8ED23485000 \ No newline at end of file diff --git a/src/tools/windows/converter_exe/symsrv.yes b/src/tools/windows/converter_exe/symsrv.yes new file mode 100644 index 0000000..9535dd7 --- /dev/null +++ b/src/tools/windows/converter_exe/symsrv.yes @@ -0,0 +1,2 @@ +See breakpad/tools/windows/converter/ms_symbol_server_converter.h for a +description of this file's function. diff --git a/src/tools/windows/converter_exe/tokenizer.cc b/src/tools/windows/converter_exe/tokenizer.cc new file mode 100644 index 0000000..08480d7 --- /dev/null +++ b/src/tools/windows/converter_exe/tokenizer.cc @@ -0,0 +1,65 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "tools/windows/converter_exe/tokenizer.h" + +namespace crash { + +// static +void Tokenizer::Tokenize(const string& delimiters, const string& input, + vector* output) { + assert(output); + output->clear(); + + string::size_type position = 0; // Where to begin looking for a delimiter + string::size_type new_position; // Position of found delimiter + string token; + + while ((new_position = input.find_first_of(delimiters, position)) != + string::npos) { + token = input.substr(position, new_position - position); + output->push_back(token); + + // Next time, begin looking right after this delimiter. + position = new_position + 1; + } + + // There are no more delimiters in the string. Take everything from the + // final delimiter up to the end of the string as a token. This may be + // an empty string. + token = input.substr(position); + output->push_back(token); +} + +} // namespace crash diff --git a/src/tools/windows/converter_exe/tokenizer.h b/src/tools/windows/converter_exe/tokenizer.h new file mode 100644 index 0000000..d9829f6 --- /dev/null +++ b/src/tools/windows/converter_exe/tokenizer.h @@ -0,0 +1,51 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef TOOLS_WINDOWS_CONVERTER_EXE_TOKENIZER_H_ +#define TOOLS_WINDOWS_CONVERTER_EXE_TOKENIZER_H_ + +#include +#include + +namespace crash { + +using std::string; +using std::vector; + +class Tokenizer { + public: + // Splits |input| into a series of tokens delimited in the input string by + // any of the characters in |delimiters|. The tokens are passed back in the + // |output| vector. + static void Tokenize(const string& delimiters, const string& input, + vector* output); +}; + +} // namespace crash + +#endif // TOOLS_WINDOWS_CONVERTER_EXE_TOKENIZER_H_ diff --git a/src/tools/windows/converter_exe/winhttp_client.cc b/src/tools/windows/converter_exe/winhttp_client.cc new file mode 100644 index 0000000..425a9da --- /dev/null +++ b/src/tools/windows/converter_exe/winhttp_client.cc @@ -0,0 +1,311 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "tools/windows/converter_exe/winhttp_client.h" + +#include +#include +#include +#include +#include + +namespace crash { + +namespace internal { + +// This class implements HttpClient based on WinInet APIs. +class WinHttpClient : public HttpClient { + public: + virtual ~WinHttpClient() {} + virtual bool CrackUrl(const TCHAR* url, + DWORD flags, + TCHAR* scheme, + size_t scheme_buffer_length, + TCHAR* host, + size_t host_buffer_length, + TCHAR* uri, + size_t uri_buffer_length, + int* port) const; + virtual bool Open(const TCHAR* user_agent, + DWORD access_type, + const TCHAR* proxy_name, + const TCHAR* proxy_bypass, + HttpHandle* session_handle) const; + virtual bool Connect(HttpHandle session_handle, + const TCHAR* server, + int port, + HttpHandle* connection_handle) const; + virtual bool OpenRequest(HttpHandle connection_handle, + const TCHAR* verb, + const TCHAR* uri, + const TCHAR* version, + const TCHAR* referrer, + bool is_secure, + HttpHandle* request_handle) const; + virtual bool SendRequest(HttpHandle request_handle, + const TCHAR* headers, + DWORD headers_length) const; + virtual bool ReceiveResponse(HttpHandle request_handle) const; + virtual bool GetHttpStatusCode(HttpHandle request_handle, + int* status_code) const; + virtual bool GetContentLength(HttpHandle request_handle, + DWORD* content_length) const; + virtual bool ReadData(HttpHandle request_handle, + void* buffer, + DWORD buffer_length, + DWORD* bytes_read) const; + virtual bool Close(HttpHandle handle) const; + + private: + static DWORD MapAccessType(DWORD access_type); + static HINTERNET ToHINTERNET(HttpHandle handle); + static HttpHandle FromHINTERNET(HINTERNET handle); +}; + +bool WinHttpClient::CrackUrl(const TCHAR* url, + DWORD flags, + TCHAR* scheme, + size_t scheme_buffer_length, + TCHAR* host, + size_t host_buffer_length, + TCHAR* uri, + size_t uri_buffer_length, + int* port) const { + assert(url); + assert(scheme); + assert(host); + assert(uri); + assert(port); + + URL_COMPONENTS url_comp = {0}; + url_comp.dwStructSize = sizeof(url_comp); + url_comp.lpszScheme = scheme; + url_comp.dwSchemeLength = static_cast(scheme_buffer_length); + url_comp.lpszHostName = host; + url_comp.dwHostNameLength = static_cast(host_buffer_length); + url_comp.lpszUrlPath = uri; + url_comp.dwUrlPathLength = static_cast(uri_buffer_length); + + bool result = !!::WinHttpCrackUrl(url, 0, flags, &url_comp); + if (result) { + *port = static_cast(url_comp.nPort); + } + return result; +} + +bool WinHttpClient::Open(const TCHAR* user_agent, + DWORD access_type, + const TCHAR* proxy_name, + const TCHAR* proxy_bypass, + HttpHandle* session_handle) const { + *session_handle = FromHINTERNET(::WinHttpOpen(user_agent, + MapAccessType(access_type), + proxy_name, + proxy_bypass, + 0)); + + return !!(*session_handle); +} + +bool WinHttpClient::Connect(HttpHandle session_handle, + const TCHAR* server, + int port, + HttpHandle* connection_handle) const { + assert(server); + + // Uses NULL user name and password to connect. + *connection_handle = FromHINTERNET(::WinHttpConnect( + ToHINTERNET(session_handle), + server, + static_cast(port), + NULL)); + return !!(*connection_handle); +} + +bool WinHttpClient::OpenRequest(HttpHandle connection_handle, + const TCHAR* verb, + const TCHAR* uri, + const TCHAR* version, + const TCHAR* referrer, + bool is_secure, + HttpHandle* request_handle) const { + assert(connection_handle); + assert(verb); + assert(uri); + assert(request_handle); + + *request_handle = FromHINTERNET(::WinHttpOpenRequest( + ToHINTERNET(connection_handle), + verb, + uri, + version, + referrer, + WINHTTP_DEFAULT_ACCEPT_TYPES, + is_secure ? WINHTTP_FLAG_SECURE : 0)); + return !!(*request_handle); +} + +bool WinHttpClient::SendRequest(HttpHandle request_handle, + const TCHAR* headers, + DWORD headers_length) const { + assert(request_handle); + + return !!::WinHttpSendRequest(ToHINTERNET(request_handle), + headers, + headers_length, + NULL, + 0, + WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH, + NULL); +} + +bool WinHttpClient::ReceiveResponse(HttpHandle request_handle) const { + assert(request_handle); + + return !!::WinHttpReceiveResponse(ToHINTERNET(request_handle), NULL); +} + +bool WinHttpClient::GetHttpStatusCode(HttpHandle request_handle, + int* status_code) const { + TCHAR http_status_string[4] = {0}; + DWORD http_status_string_size = sizeof(http_status_string); + if (!::WinHttpQueryHeaders(ToHINTERNET(request_handle), + WINHTTP_QUERY_STATUS_CODE, + WINHTTP_HEADER_NAME_BY_INDEX, + static_cast(&http_status_string), + &http_status_string_size, 0)) { + return false; + } + + *status_code = static_cast(_tcstol(http_status_string, NULL, 10)); + return true; +} + +bool WinHttpClient::GetContentLength(HttpHandle request_handle, + DWORD* content_length) const { + assert(request_handle); + assert(content_length); + + TCHAR content_length_string[11] = {0}; + DWORD content_length_string_size = sizeof(content_length_string); + if (!::WinHttpQueryHeaders(ToHINTERNET(request_handle), + WINHTTP_QUERY_CONTENT_LENGTH, + WINHTTP_HEADER_NAME_BY_INDEX, + static_cast(&content_length_string), + &content_length_string_size, 0)) { + *content_length = kUnknownContentLength; + } else { + *content_length = + static_cast(wcstol(content_length_string, NULL, 10)); + } + return true; +} + +bool WinHttpClient::ReadData(HttpHandle request_handle, + void* buffer, + DWORD buffer_length, + DWORD* bytes_read) const { + assert(request_handle); + assert(buffer); + assert(bytes_read); + + DWORD bytes_read_local = 0; + if (!::WinHttpReadData(ToHINTERNET(request_handle), + buffer, + buffer_length, + &bytes_read_local)) { + return false; + } + *bytes_read = bytes_read_local; + return true; +} + +bool WinHttpClient::Close(HttpHandle handle) const { + assert(handle); + return !!::WinHttpCloseHandle(ToHINTERNET(handle)); +} + +DWORD WinHttpClient::MapAccessType(DWORD access_type) { + switch (static_cast(access_type)) { + case ACCESS_TYPE_PRECONFIG: + default: + return WINHTTP_ACCESS_TYPE_DEFAULT_PROXY; + case ACCESS_TYPE_DIRECT: + return WINHTTP_ACCESS_TYPE_NO_PROXY; + case ACCESS_TYPE_PROXY: + return WINHTTP_ACCESS_TYPE_NAMED_PROXY; + } +} + + +HINTERNET WinHttpClient::ToHINTERNET(HttpHandle handle) { + return static_cast(handle); +} + +HttpHandle WinHttpClient::FromHINTERNET(HINTERNET handle) { + return static_cast(handle); +} + +} // namespace internal + +HttpClient* CreateWinHttpClient(const TCHAR* url) { + assert(url); + + internal::WinHttpClient winhttp; + wchar_t scheme[16] = {0}; + wchar_t host[256] = {0}; + wchar_t path[256] = {0}; + int port = 0; + + if (!winhttp.CrackUrl(url, + 0, + scheme, + sizeof(scheme)/sizeof(scheme[0]), + host, + sizeof(host)/sizeof(host[0]), + path, + sizeof(path)/sizeof(path[0]), + &port)) { + return NULL; + } + + if (_wcsicmp(scheme, L"https") == 0) { + // Winhttp under WINE doesn't support wildcard certificates, so avoid + // to use it if the scheme is https. The caller should fall back to + // use wininet if NULL is returned. + return NULL; + } + + return new internal::WinHttpClient(); +} + +} // namespace crash diff --git a/src/tools/windows/converter_exe/winhttp_client.h b/src/tools/windows/converter_exe/winhttp_client.h new file mode 100644 index 0000000..4ccac7e --- /dev/null +++ b/src/tools/windows/converter_exe/winhttp_client.h @@ -0,0 +1,40 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef TOOLS_WINDOWS_CONVERTER_EXE_WINHTTP_CLIENT_H_ +#define TOOLS_WINDOWS_CONVERTER_EXE_WINHTTP_CLIENT_H_ + +#include "tools/windows/converter_exe/http_client.h" + +namespace crash { + +HttpClient* CreateWinHttpClient(const TCHAR* url); + +} // namespace crash + +#endif // TOOLS_WINDOWS_CONVERTER_EXE_WINHTTP_CLIENT_H_ diff --git a/src/tools/windows/converter_exe/wininet_client.cc b/src/tools/windows/converter_exe/wininet_client.cc new file mode 100644 index 0000000..571ab86 --- /dev/null +++ b/src/tools/windows/converter_exe/wininet_client.cc @@ -0,0 +1,282 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include "tools/windows/converter_exe/wininet_client.h" + +#include +#include +#include +#include + +namespace crash { + +namespace internal { + +// This class implements HttpClient based on WinInet APIs. +class WinInetClient : public HttpClient { + public: + virtual ~WinInetClient() {} + virtual bool CrackUrl(const TCHAR* url, + DWORD flags, + TCHAR* scheme, + size_t scheme_buffer_length, + TCHAR* host, + size_t host_buffer_length, + TCHAR* uri, + size_t uri_buffer_length, + int* port) const; + virtual bool Open(const TCHAR* user_agent, + DWORD access_type, + const TCHAR* proxy_name, + const TCHAR* proxy_bypass, + HttpHandle* session_handle) const; + virtual bool Connect(HttpHandle session_handle, + const TCHAR* server, + int port, + HttpHandle* connection_handle) const; + virtual bool OpenRequest(HttpHandle connection_handle, + const TCHAR* verb, + const TCHAR* uri, + const TCHAR* version, + const TCHAR* referrer, + bool is_secure, + HttpHandle* request_handle) const; + virtual bool SendRequest(HttpHandle request_handle, + const TCHAR* headers, + DWORD headers_length) const; + virtual bool ReceiveResponse(HttpHandle request_handle) const; + virtual bool GetHttpStatusCode(HttpHandle request_handle, + int* status_code) const; + virtual bool GetContentLength(HttpHandle request_handle, + DWORD* content_length) const; + virtual bool ReadData(HttpHandle request_handle, + void* buffer, + DWORD buffer_length, + DWORD* bytes_read) const; + virtual bool Close(HttpHandle handle) const; + + private: + static DWORD MapAccessType(DWORD access_type); + static HINTERNET ToHINTERNET(HttpHandle handle); + static HttpHandle FromHINTERNET(HINTERNET handle); +}; + +bool WinInetClient::CrackUrl(const TCHAR* url, + DWORD flags, + TCHAR* scheme, + size_t scheme_buffer_length, + TCHAR* host, + size_t host_buffer_length, + TCHAR* uri, + size_t uri_buffer_length, + int* port) const { + assert(url); + assert(scheme); + assert(host); + assert(uri); + assert(port); + + URL_COMPONENTS url_comp = {0}; + url_comp.dwStructSize = sizeof(url_comp); + url_comp.lpszScheme = scheme; + url_comp.dwSchemeLength = static_cast(scheme_buffer_length); + url_comp.lpszHostName = host; + url_comp.dwHostNameLength = static_cast(host_buffer_length); + url_comp.lpszUrlPath = uri; + url_comp.dwUrlPathLength = static_cast(uri_buffer_length); + + bool result = !!::InternetCrackUrl(url, 0, flags, &url_comp); + if (result) { + *port = static_cast(url_comp.nPort); + } + return result; +} + +bool WinInetClient::Open(const TCHAR* user_agent, + DWORD access_type, + const TCHAR* proxy_name, + const TCHAR* proxy_bypass, + HttpHandle* session_handle) const { + *session_handle = FromHINTERNET(::InternetOpen(user_agent, + MapAccessType(access_type), + proxy_name, + proxy_bypass, + 0)); + return !!(*session_handle); +} + +bool WinInetClient::Connect(HttpHandle session_handle, + const TCHAR* server, + int port, + HttpHandle* connection_handle) const { + assert(server); + + // Uses NULL user name and password to connect. Always uses http service. + *connection_handle = FromHINTERNET(::InternetConnect( + ToHINTERNET(session_handle), + server, + static_cast(port), + NULL, + NULL, + INTERNET_SERVICE_HTTP, + 0, + 0)); + return !!(*connection_handle); +} + +bool WinInetClient::OpenRequest(HttpHandle connection_handle, + const TCHAR* verb, + const TCHAR* uri, + const TCHAR* version, + const TCHAR* referrer, + bool is_secure, + HttpHandle* request_handle) const { + assert(connection_handle); + assert(verb); + assert(uri); + + *request_handle = FromHINTERNET(::HttpOpenRequest( + ToHINTERNET(connection_handle), + verb, + uri, + version, + referrer, + NULL, + is_secure ? INTERNET_FLAG_SECURE : 0, + NULL)); + return !!(*request_handle); +} + +bool WinInetClient::SendRequest(HttpHandle request_handle, + const TCHAR* headers, + DWORD headers_length) const { + assert(request_handle); + + return !!::HttpSendRequest(ToHINTERNET(request_handle), + headers, + headers_length, + NULL, + 0); +} + +bool WinInetClient::ReceiveResponse(HttpHandle) const { + return true; +} + +bool WinInetClient::GetHttpStatusCode(HttpHandle request_handle, + int* status_code) const { + assert(request_handle); + + TCHAR http_status_string[4] = {0}; + DWORD http_status_string_size = sizeof(http_status_string); + if (!::HttpQueryInfo(ToHINTERNET(request_handle), + HTTP_QUERY_STATUS_CODE, + static_cast(&http_status_string), + &http_status_string_size, + 0)) { + return false; + } + + *status_code = _tcstol(http_status_string, NULL, 10); + return true; +} + +bool WinInetClient::GetContentLength(HttpHandle request_handle, + DWORD* content_length) const { + assert(request_handle); + assert(content_length); + + TCHAR content_length_string[11]; + DWORD content_length_string_size = sizeof(content_length_string); + if (!::HttpQueryInfo(ToHINTERNET(request_handle), + HTTP_QUERY_CONTENT_LENGTH, + static_cast(&content_length_string), + &content_length_string_size, + 0)) { + *content_length = kUnknownContentLength; + } else { + *content_length = wcstol(content_length_string, NULL, 10); + } + return true; +} + +bool WinInetClient::ReadData(HttpHandle request_handle, + void* buffer, + DWORD buffer_length, + DWORD* bytes_read) const { + assert(request_handle); + assert(buffer); + assert(bytes_read); + + DWORD bytes_read_local = 0; + if (!::InternetReadFile(ToHINTERNET(request_handle), + buffer, + buffer_length, + &bytes_read_local)) { + return false; + } + *bytes_read = bytes_read_local; + return true; +} + +bool WinInetClient::Close(HttpHandle handle) const { + assert(handle); + return !!::InternetCloseHandle(ToHINTERNET(handle)); +} + +DWORD WinInetClient::MapAccessType(DWORD access_type) { + switch (static_cast(access_type)) { + case ACCESS_TYPE_PRECONFIG: + default: + return INTERNET_OPEN_TYPE_PRECONFIG; + case ACCESS_TYPE_DIRECT: + return INTERNET_OPEN_TYPE_DIRECT; + case ACCESS_TYPE_PROXY: + return INTERNET_OPEN_TYPE_PROXY; + } +} + +HINTERNET WinInetClient::ToHINTERNET(HttpHandle handle) { + return static_cast(handle); +} + +HttpHandle WinInetClient::FromHINTERNET(HINTERNET handle) { + return static_cast(handle); +} + +} // namespace internal + +HttpClient* CreateWinInetClient(const TCHAR*) { + return new internal::WinInetClient(); +} + +} // namespace crash diff --git a/src/tools/windows/converter_exe/wininet_client.h b/src/tools/windows/converter_exe/wininet_client.h new file mode 100644 index 0000000..8b4c61b --- /dev/null +++ b/src/tools/windows/converter_exe/wininet_client.h @@ -0,0 +1,40 @@ +// Copyright 2019 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef TOOLS_WINDOWS_CONVERTER_EXE_WININET_CLIENT_H_ +#define TOOLS_WINDOWS_CONVERTER_EXE_WININET_CLIENT_H_ + +#include "tools/windows/converter_exe/http_client.h" + +namespace crash { + +HttpClient* CreateWinInetClient(const TCHAR* url); + +} // namespace crash + +#endif // TOOLS_WINDOWS_CONVERTER_EXE_WININET_CLIENT_H_ diff --git a/src/tools/windows/converter_exe/winsymconv.cmd b/src/tools/windows/converter_exe/winsymconv.cmd new file mode 100644 index 0000000..b8c3449 --- /dev/null +++ b/src/tools/windows/converter_exe/winsymconv.cmd @@ -0,0 +1,86 @@ +@if "%ECHOON%"=="" @echo off +SETLOCAL + +REM ****************************************************************** +REM Usage: +REM winsymconv +REM ****************************************************************** + +REM ****************************************************************** +REM Initialize +REM ****************************************************************** +SET SCRIPT_LOCATION=%~dp0 +SET DBGHELP_WINHTTP= +SET USE_WINHTTP= + +REM ****************************************************************** +REM Go to script location +REM ****************************************************************** +pushd %SCRIPT_LOCATION% + +REM ****************************************************************** +REM Make sure the symbol file directory exists +REM ****************************************************************** +SET SYMBOL_DIR=%SCRIPT_LOCATION%symbol +if NOT EXIST %SYMBOL_DIR% MKDIR %SYMBOL_DIR% +if NOT EXIST %SYMBOL_DIR% echo Failed to create directory '%SYMBOL_DIR%' & goto :fail + +:restart + +REM ****************************************************************** +REM Convert missing Windows symbols on the staging instance. +REM ****************************************************************** +echo Converting missing Windows symbols on staging instance ... + +google_converter.exe ^ + -n http://msdl.microsoft.com/download/symbols ^ + -n http://symbols.mozilla.org/firefox ^ + -n http://chromium-browser-symsrv.commondatastorage.googleapis.com ^ + -n https://download.amd.com/dir/bin ^ + -n https://driver-symbols.nvidia.com ^ + -n https://software.intel.com/sites/downloads/symbols ^ + -l %SYMBOL_DIR% ^ + -s https://clients2.google.com/cr/staging_symbol ^ + -m https://clients2.google.com/cr/staging_symbol/missingsymbols ^ + -t https://clients2.google.com/cr/staging_symbol/fetchfailed ^ + -b "google|chrome|internal|private" ^ + > %SCRIPT_LOCATION%last_cycle_staging.txt + +REM ****************************************************************** +REM Convert missing Windows symbols on the production instance. +REM ****************************************************************** +echo Converting missing Windows symbols on production instance ... + +google_converter.exe ^ + -n http://msdl.microsoft.com/download/symbols ^ + -n http://symbols.mozilla.org/firefox ^ + -n http://chromium-browser-symsrv.commondatastorage.googleapis.com ^ + -n https://download.amd.com/dir/bin ^ + -n https://driver-symbols.nvidia.com ^ + -n https://software.intel.com/sites/downloads/symbols ^ + -l %SYMBOL_DIR% ^ + -s https://clients2.google.com/cr/symbol ^ + -m https://clients2.google.com/cr/symbol/missingsymbols ^ + -t https://clients2.google.com/cr/symbol/fetchfailed ^ + -b "google|chrome|internal|private" ^ + > %SCRIPT_LOCATION%last_cycle_prod.txt + +REM ****************************************************************** +REM Sleep for 5 minutes ... +REM ****************************************************************** +echo Sleeping for 5 minutes ... + +%SCRIPT_LOCATION%sleep.exe 300 + +REM ****************************************** +REM Restart work loop ... +REM ****************************************** +goto :restart + +:success +ENDLOCAL +exit /b 0 + +:fail +ENDLOCAL +exit /b 1 diff --git a/src/tools/windows/converter_exe/winsymconv_test.cmd b/src/tools/windows/converter_exe/winsymconv_test.cmd new file mode 100644 index 0000000..ba72627 --- /dev/null +++ b/src/tools/windows/converter_exe/winsymconv_test.cmd @@ -0,0 +1,72 @@ +@if "%ECHOON%"=="" @echo off +SETLOCAL + +REM ****************************************************************** +REM Usage: +REM winsymconv_test +REM ****************************************************************** + +REM ****************************************************************** +REM Initialize +REM ****************************************************************** +SET SCRIPT_LOCATION=%~dp0 +SET DBGHELP_WINHTTP= +SET USE_WINHTTP= + +REM ****************************************************************** +REM Go to script location +REM ****************************************************************** +pushd %SCRIPT_LOCATION% + +REM ****************************************************************** +REM Make sure the symbol file directory exists +REM ****************************************************************** +SET SYMBOL_DIR=%SCRIPT_LOCATION%symbol +if NOT EXIST %SYMBOL_DIR% MKDIR %SYMBOL_DIR% +if NOT EXIST %SYMBOL_DIR% echo Failed to create directory '%SYMBOL_DIR%' & goto :fail + +REM ****************************************************************** +REM Testing on the staging instance. +REM ****************************************************************** +echo Testing on the staging instance ... + +google_converter.exe ^ + -n http://msdl.microsoft.com/download/symbols ^ + -n http://symbols.mozilla.org/firefox ^ + -n http://chromium-browser-symsrv.commondatastorage.googleapis.com ^ + -n https://download.amd.com/dir/bin ^ + -n https://driver-symbols.nvidia.com ^ + -n https://software.intel.com/sites/downloads/symbols ^ + -l %SYMBOL_DIR% ^ + -s https://clients2.google.com/cr/staging_symbol ^ + -mf %SCRIPT_LOCATION%missing_symbols_test.txt ^ + -t https://clients2.google.com/cr/staging_symbol/fetchfailed ^ + -b "google|chrome|internal|private" ^ + > %SCRIPT_LOCATION%last_cycle_staging.txt + +REM ****************************************************************** +REM Testing on the production instance. +REM ****************************************************************** +echo Testing on the production instance ... + +google_converter.exe ^ + -n http://msdl.microsoft.com/download/symbols ^ + -n http://symbols.mozilla.org/firefox ^ + -n http://chromium-browser-symsrv.commondatastorage.googleapis.com ^ + -n https://download.amd.com/dir/bin ^ + -n https://driver-symbols.nvidia.com ^ + -n https://software.intel.com/sites/downloads/symbols ^ + -l %SYMBOL_DIR% ^ + -s https://clients2.google.com/cr/symbol ^ + -mf %SCRIPT_LOCATION%missing_symbols_test.txt ^ + -t https://clients2.google.com/cr/symbol/fetchfailed ^ + -b "google|chrome|internal|private" ^ + > %SCRIPT_LOCATION%last_cycle_prod.txt + +:success +ENDLOCAL +exit /b 0 + +:fail +ENDLOCAL +exit /b 1 diff --git a/src/tools/windows/dump_syms/dump_syms.cc b/src/tools/windows/dump_syms/dump_syms.cc new file mode 100644 index 0000000..1979d43 --- /dev/null +++ b/src/tools/windows/dump_syms/dump_syms.cc @@ -0,0 +1,102 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Windows utility to dump the line number data from a pdb file to +// a text-based format that we can use from the minidump processor. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include + +#include "common/windows/pdb_source_line_writer.h" +#include "common/windows/pe_source_line_writer.h" + +using google_breakpad::PDBSourceLineWriter; +using google_breakpad::PESourceLineWriter; +using std::unique_ptr; +using std::wstring; + +int usage(const wchar_t* self) { + fprintf(stderr, "Usage: %ws [--pe] [--i] \n", self); + fprintf(stderr, "Options:\n"); + fprintf(stderr, + "--pe:\tRead debugging information from PE file and do " + "not attempt to locate matching PDB file.\n" + "\tThis is only supported for PE32+ (64 bit) PE files.\n"); + fprintf(stderr, + "--i:\tOutput INLINE/INLINE_ORIGIN record\n" + "\tThis cannot be used with [--pe].\n"); + return 1; +} + +int wmain(int argc, wchar_t** argv) { + bool success = false; + bool pe = false; + bool handle_inline = false; + int arg_index = 1; + while (arg_index < argc && wcslen(argv[arg_index]) > 0 && + wcsncmp(L"--", argv[arg_index], 2) == 0) { + if (wcscmp(L"--pe", argv[arg_index]) == 0) { + pe = true; + } else if (wcscmp(L"--i", argv[arg_index]) == 0) { + handle_inline = true; + } + ++arg_index; + } + + if ((pe && handle_inline) || arg_index == argc) { + usage(argv[0]); + return 1; + } + + wchar_t* file_path = argv[arg_index]; + if (pe) { + PESourceLineWriter pe_writer(file_path); + success = pe_writer.WriteSymbols(stdout); + } else { + PDBSourceLineWriter pdb_writer(handle_inline); + if (!pdb_writer.Open(wstring(file_path), PDBSourceLineWriter::ANY_FILE)) { + fprintf(stderr, "Open failed.\n"); + return 1; + } + success = pdb_writer.WriteSymbols(stdout); + } + + if (!success) { + fprintf(stderr, "WriteSymbols failed.\n"); + return 1; + } + + return 0; +} diff --git a/src/tools/windows/dump_syms/dump_syms_unittest.cc b/src/tools/windows/dump_syms/dump_syms_unittest.cc new file mode 100644 index 0000000..73c48a2 --- /dev/null +++ b/src/tools/windows/dump_syms/dump_syms_unittest.cc @@ -0,0 +1,248 @@ +// Copyright 2003 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include +#include + +#include +#include + +#include "breakpad_googletest_includes.h" + +namespace tools { +namespace windows { +namespace dump_syms { + +namespace { + +// Root names of PDB and dumped symbol files to be regression tested. These are +// specified in complexity of the resulting dumped symbol files. +const wchar_t* kRootNames[] = { + // A PDB file with no OMAP data. + L"dump_syms_regtest", + // A PDB file with OMAP data for an image that has been function-level + // reordered. + L"omap_reorder_funcs", + // A PDB file with OMAP data for an image that had new content injected, all + // of it with source data. + L"omap_stretched_filled", + // A PDB file with OMAP data for an image that had new content injected, but + // without source data. + L"omap_stretched", + // A PDB file with OMAP data for an image that has been basic block reordered. + L"omap_reorder_bbs", + // A 64bit PDB file with no OMAP data. + L"dump_syms_regtest64", +}; + +const wchar_t* kPEOnlyRootNames[] = { + L"pe_only_symbol_test", +}; + +void TrimLastComponent(const std::wstring& path, + std::wstring* trimmed, + std::wstring* component) { + size_t len = path.size(); + while (len > 0 && path[len - 1] != '\\') + --len; + + if (component != NULL) + component->assign(path.c_str() + len, path.c_str() + path.size()); + + while (len > 0 && path[len - 1] == '\\') + --len; + + if (trimmed != NULL) + trimmed->assign(path.c_str(), len); +} + +// Get the directory of the current executable. +bool GetSelfDirectory(std::wstring* self_dir) { + std::wstring command_line = GetCommandLineW(); + + int num_args = 0; + wchar_t** args = NULL; + args = ::CommandLineToArgvW(command_line.c_str(), &num_args); + if (args == NULL) + return false; + + *self_dir = args[0]; + TrimLastComponent(*self_dir, self_dir, NULL); + + return true; +} + +void RunCommand(const std::wstring& command_line, + std::string* stdout_string) { + // Create a PIPE for the child process stdout. + HANDLE child_stdout_read = 0; + HANDLE child_stdout_write = 0; + SECURITY_ATTRIBUTES sec_attr_stdout = {}; + sec_attr_stdout.nLength = sizeof(sec_attr_stdout); + sec_attr_stdout.bInheritHandle = TRUE; + ASSERT_TRUE(::CreatePipe(&child_stdout_read, &child_stdout_write, + &sec_attr_stdout, 0)); + ASSERT_TRUE(::SetHandleInformation(child_stdout_read, HANDLE_FLAG_INHERIT, + 0)); + + // Create a PIPE for the child process stdin. + HANDLE child_stdin_read = 0; + HANDLE child_stdin_write = 0; + SECURITY_ATTRIBUTES sec_attr_stdin = {}; + sec_attr_stdin.nLength = sizeof(sec_attr_stdin); + sec_attr_stdin.bInheritHandle = TRUE; + ASSERT_TRUE(::CreatePipe(&child_stdin_read, &child_stdin_write, + &sec_attr_stdin, 0)); + ASSERT_TRUE(::SetHandleInformation(child_stdin_write, HANDLE_FLAG_INHERIT, + 0)); + + // Startup the child. + STARTUPINFO startup_info = {}; + PROCESS_INFORMATION process_info = {}; + startup_info.cb = sizeof(STARTUPINFO); + startup_info.hStdError = NULL; + startup_info.hStdInput = child_stdin_read; + startup_info.hStdOutput = child_stdout_write; + startup_info.dwFlags = STARTF_USESTDHANDLES; + ASSERT_TRUE(::CreateProcessW(NULL, (LPWSTR)command_line.c_str(), NULL, NULL, + TRUE, 0, NULL, NULL, + &startup_info, &process_info)); + + // Collect the output. + ASSERT_TRUE(::CloseHandle(child_stdout_write)); + char buffer[4096] = {}; + DWORD bytes_read = 0; + while (::ReadFile(child_stdout_read, buffer, sizeof(buffer), &bytes_read, + NULL) && bytes_read > 0) { + stdout_string->append(buffer, bytes_read); + } + + // Wait for the process to finish. + ::WaitForSingleObject(process_info.hProcess, INFINITE); + + // Shut down all of our handles. + ASSERT_TRUE(::CloseHandle(process_info.hThread)); + ASSERT_TRUE(::CloseHandle(process_info.hProcess)); + ASSERT_TRUE(::CloseHandle(child_stdin_write)); + ASSERT_TRUE(::CloseHandle(child_stdin_read)); + ASSERT_TRUE(::CloseHandle(child_stdout_read)); +} + +void GetFileContents(const std::wstring& path, std::string* content) { + FILE* f = ::_wfopen(path.c_str(), L"rb"); + ASSERT_TRUE(f != NULL); + + char buffer[4096] = {}; + while (true) { + size_t bytes_read = ::fread(buffer, 1, sizeof(buffer), f); + if (bytes_read == 0) + break; + content->append(buffer, bytes_read); + } +} + +class DumpSymsRegressionTest : public testing::TestWithParam { + public: + virtual void SetUp() { + std::wstring self_dir; + ASSERT_TRUE(GetSelfDirectory(&self_dir)); + dump_syms_exe = self_dir + L"\\dump_syms.exe"; + + TrimLastComponent(self_dir, &testdata_dir, NULL); + testdata_dir += L"\\testdata"; + } + + std::wstring dump_syms_exe; + std::wstring testdata_dir; +}; + +class DumpSymsPEOnlyRegressionTest : public testing::TestWithParam { +public: + virtual void SetUp() { + std::wstring self_dir; + ASSERT_TRUE(GetSelfDirectory(&self_dir)); + dump_syms_exe = self_dir + L"\\dump_syms.exe"; + + TrimLastComponent(self_dir, &testdata_dir, NULL); + testdata_dir += L"\\testdata"; + } + + std::wstring dump_syms_exe; + std::wstring testdata_dir; +}; + +} //namespace + +TEST_P(DumpSymsRegressionTest, EnsureDumpedSymbolsMatch) { + const wchar_t* root_name = GetParam(); + std::wstring root_path = testdata_dir + L"\\" + root_name; + + std::wstring sym_path = root_path + L".sym"; + std::string expected_symbols; + ASSERT_NO_FATAL_FAILURE(GetFileContents(sym_path, &expected_symbols)); + + std::wstring pdb_path = root_path + L".pdb"; + std::wstring command_line = L"\"" + dump_syms_exe + L"\" \"" + + pdb_path + L"\""; + std::string symbols; + ASSERT_NO_FATAL_FAILURE(RunCommand(command_line, &symbols)); + + EXPECT_EQ(expected_symbols, symbols); +} + +INSTANTIATE_TEST_SUITE_P(DumpSyms, DumpSymsRegressionTest, + testing::ValuesIn(kRootNames)); + +TEST_P(DumpSymsPEOnlyRegressionTest, EnsurePEOnlyDumpedSymbolsMatch) { + const wchar_t* root_name = GetParam(); + std::wstring root_path = testdata_dir + L"\\" + root_name; + + std::wstring sym_path = root_path + L".sym"; + std::string expected_symbols; + ASSERT_NO_FATAL_FAILURE(GetFileContents(sym_path, &expected_symbols)); + + std::wstring dll_path = root_path + L".dll"; + std::wstring command_line = L"\"" + dump_syms_exe + L"\" --pe \"" + + dll_path + L"\""; + std::string symbols; + ASSERT_NO_FATAL_FAILURE(RunCommand(command_line, &symbols)); + + EXPECT_EQ(expected_symbols, symbols); +} + +INSTANTIATE_TEST_SUITE_P(PEOnlyDumpSyms, DumpSymsPEOnlyRegressionTest, + testing::ValuesIn(kPEOnlyRootNames)); + + +} // namespace dump_syms +} // namespace windows +} // namespace tools diff --git a/src/tools/windows/dump_syms/run_regtest.sh b/src/tools/windows/dump_syms/run_regtest.sh new file mode 100644 index 0000000..2401edd --- /dev/null +++ b/src/tools/windows/dump_syms/run_regtest.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +# Copyright 2006 Google LLC +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google LLC nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Release/dump_syms.exe testdata/dump_syms_regtest.pdb | \ + tr -d '\015' > \ + testdata/dump_syms_regtest.new +status=$? + +if [ $status -ne 0 ] ; then + echo "FAIL, dump_syms.exe failed" + exit $status +fi + +diff -u testdata/dump_syms_regtest.new testdata/dump_syms_regtest.sym > \ + testdata/dump_syms_regtest.diff +status=$? + +if [ $status -eq 0 ] ; then + rm testdata/dump_syms_regtest.diff testdata/dump_syms_regtest.new + echo "PASS" +else + echo "FAIL, see testdata/dump_syms_regtest.[new|diff]" +fi + +exit $status diff --git a/src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc b/src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc new file mode 100644 index 0000000..90d00af --- /dev/null +++ b/src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc @@ -0,0 +1,75 @@ +// Copyright 2007 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// with 32-bit cl +// cl /Zi dump_syms_regtest.cc /link /PROFILE +// dump_syms dump_syms_regtest.pdb > dump_syms_regtest.sym + +// with 64-bit cl +// cp dump_syms_regtest.cc dump_syms_regtest64.cc +// cl /Zi dump_syms_regtest64.cc /link /PROFILE +// dump_syms dump_syms_regtest64.pdb > dump_syms_regtest64.sym + +#ifdef HAVE_CONFIG_H +#include +#endif + + +namespace google_breakpad { + +class C { + public: + C() : member_(1) {} + virtual ~C() {} + + void set_member(int value) { member_ = value; } + int member() const { return member_; } + + void f() { member_ = g(); } + virtual int g() { return 2; } + static char* h(const C& that) { return 0; } + + private: + int member_; +}; + +static int i() { + return 3; +} + +} // namespace google_breakpad + +int main(int argc, char** argv) { + google_breakpad::C object; + object.set_member(google_breakpad::i()); + object.f(); + int value = object.g(); + char* nothing = object.h(object); + + return 0; +} diff --git a/src/tools/windows/dump_syms/testdata/dump_syms_regtest.pdb b/src/tools/windows/dump_syms/testdata/dump_syms_regtest.pdb new file mode 100644 index 0000000000000000000000000000000000000000..04c42a78fff304440fb577458c660b70834b4b76 GIT binary patch literal 707584 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Ìo3OI^ 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¨@MlcQbtzp1U$m9$RL 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�jdB|4LGuYOJ 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%0DBhhcX>|kT288;@YM6v((#@r9(Y{ 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 literal 0 HcmV?d00001 diff --git a/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym b/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym new file mode 100644 index 0000000..1de6f16 --- /dev/null +++ b/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym @@ -0,0 +1,4561 @@ +MODULE windows x86_64 72E103A85CB249078B76B2E7C06257B13 dump_syms_regtest64.pdb +INFO CODE_ID 589DFD111A000 dump_syms_regtest64.exe +FILE 1 c:\cygwin64\wip\breakpad-depot\src\src\tools\windows\dump_syms\testdata\dump_syms_regtest.cc +FILE 2 f:\dd\vctools\crt\crtw32\misc\amd64\amdsecgs.asm +FILE 3 f:\dd\ExternalAPIs\Windows\WinBlue\sdk\inc\ksamd64.inc +FILE 4 f:\dd\ExternalAPIs\Windows\WinBlue\sdk\inc\kxamd64.inc +FILE 5 f:\dd\ExternalAPIs\Windows\WinBlue\sdk\inc\macamd64.inc +FILE 6 f:\dd\vctools\crt\crtw32\misc\amd64\chandler.c +FILE 7 f:\dd\externalapis\windows\winblue\sdk\inc\pshpack8.h +FILE 8 f:\dd\vctools\crt\crtw32\h\excpt.h +FILE 9 f:\dd\externalapis\windows\winblue\sdk\inc\ktmtypes.h +FILE 10 f:\dd\externalapis\windows\winblue\sdk\inc\winternl.h +FILE 11 f:\dd\externalapis\windows\winblue\sdk\inc\winapifamily.h +FILE 12 f:\dd\externalapis\windows\winblue\sdk\inc\windef.h +FILE 13 f:\dd\externalapis\windows\winblue\sdk\inc\minwindef.h +FILE 14 f:\dd\externalapis\windows\winblue\sdk\inc\specstrings.h +FILE 15 f:\dd\externalapis\windows\winblue\sdk\inc\specstrings_strict.h +FILE 16 f:\dd\externalapis\windows\winblue\sdk\inc\specstrings_undef.h +FILE 17 f:\dd\externalapis\windows\winblue\sdk\inc\driverspecs.h +FILE 18 f:\dd\externalapis\windows\winblue\sdk\inc\sdv_driverspecs.h +FILE 19 f:\dd\externalapis\windows\winblue\sdk\inc\apiset.h +FILE 20 f:\dd\vctools\inc\vcwininternls.h +FILE 21 f:\dd\tools\devdiv\inc\ddbanned.h +FILE 22 f:\dd\vctools\crt\crtw32\h\vadefs.h +FILE 23 f:\dd\vctools\crt\crtw32\h\cruntime.h +FILE 24 f:\dd\vctools\crt\crtw32\h\sal.h +FILE 25 f:\dd\vctools\crt\crtw32\h\concurrencysal.h +FILE 26 f:\dd\externalapis\windows\winblue\sdk\inc\guiddef.h +FILE 27 f:\dd\externalapis\windows\winblue\sdk\inc\winnt.h +FILE 28 f:\dd\externalapis\windows\winblue\sdk\inc\kernelspecs.h +FILE 29 f:\dd\externalapis\windows\winblue\sdk\inc\basetsd.h +FILE 30 f:\dd\vctools\crt\crtw32\h\ctype.h +FILE 31 f:\dd\vctools\crt\crtw32\h\crtdefs.h +FILE 32 f:\dd\vctools\crt\crtw32\h\string.h +FILE 33 f:\dd\externalapis\windows\winblue\sdk\inc\pshpack2.h +FILE 34 f:\dd\externalapis\windows\winblue\sdk\inc\pshpack4.h +FILE 35 f:\dd\externalapis\windows\winblue\sdk\inc\sdkddkver.h +FILE 36 f:\dd\externalapis\windows\winblue\sdk\inc\poppack.h +FILE 37 f:\dd\vctools\crt\crtw32\misc\amd64\gshandler.c +FILE 58 f:\dd\vctools\crt\crtw32\h\process.h +FILE 69 f:\dd\vctools\crt\crtw32\misc\amd64\jmpuwind.asm +FILE 73 f:\dd\externalapis\windows\winblue\sdk\inc\processtopologyapi.h +FILE 74 f:\dd\externalapis\windows\winblue\sdk\inc\securityappcontainer.h +FILE 75 f:\dd\externalapis\windows\winblue\sdk\inc\pshpack1.h +FILE 76 f:\dd\externalapis\windows\winblue\sdk\inc\realtimeapiset.h +FILE 77 f:\dd\externalapis\windows\winblue\sdk\inc\profileapi.h +FILE 78 f:\dd\externalapis\windows\winblue\sdk\inc\timezoneapi.h +FILE 79 f:\dd\externalapis\windows\winblue\sdk\inc\jobapi.h +FILE 80 f:\dd\externalapis\windows\winblue\sdk\inc\heapapi.h +FILE 82 f:\dd\externalapis\windows\winblue\sdk\inc\wincon.h +FILE 83 f:\dd\externalapis\windows\winblue\sdk\inc\wow64apiset.h +FILE 85 f:\dd\externalapis\windows\winblue\sdk\inc\threadpoolapiset.h +FILE 87 f:\dd\externalapis\windows\winblue\sdk\inc\winver.h +FILE 88 f:\dd\externalapis\windows\winblue\sdk\inc\debugapi.h +FILE 89 f:\dd\externalapis\windows\winblue\sdk\inc\winnetwk.h +FILE 90 f:\dd\externalapis\windows\winblue\sdk\inc\verrsrc.h +FILE 91 f:\dd\externalapis\windows\winblue\sdk\inc\wnnc.h +FILE 92 f:\dd\externalapis\windows\winblue\sdk\inc\libloaderapi.h +FILE 93 f:\dd\externalapis\windows\winblue\sdk\inc\fibersapi.h +FILE 94 f:\dd\vctools\langapi\include\isa_availability.h +FILE 95 f:\dd\vctools\crt\crtw32\convert\_fptostr.c +FILE 96 f:\dd\externalapis\windows\winblue\sdk\inc\winnls.h +FILE 97 f:\dd\externalapis\windows\winblue\sdk\inc\datetimeapi.h +FILE 98 f:\dd\externalapis\windows\winblue\sdk\inc\securitybaseapi.h +FILE 99 f:\dd\externalapis\windows\winblue\sdk\inc\namedpipeapi.h +FILE 103 f:\dd\vctools\crt\crtw32\h\stddef.h +FILE 104 f:\dd\externalapis\windows\winblue\sdk\inc\fileapi.h +FILE 105 f:\dd\vctools\crt\crtw32\h\internal.h +FILE 106 f:\dd\externalapis\windows\winblue\sdk\inc\interlockedapi.h +FILE 107 f:\dd\externalapis\windows\winblue\sdk\inc\utilapiset.h +FILE 108 f:\dd\vctools\crt\crtw32\h\limits.h +FILE 110 f:\dd\externalapis\windows\winblue\sdk\inc\windows.h +FILE 111 f:\dd\externalapis\windows\winblue\sdk\inc\processenv.h +FILE 115 f:\dd\vctools\crt\crtw32\h\fltintrn.h +FILE 116 f:\dd\externalapis\windows\winblue\sdk\inc\stringapiset.h +FILE 118 f:\dd\externalapis\windows\winblue\sdk\inc\stralign.h +FILE 121 f:\dd\externalapis\windows\winblue\sdk\inc\memoryapi.h +FILE 124 f:\dd\externalapis\windows\winblue\sdk\inc\mcx.h +FILE 125 f:\dd\externalapis\windows\winblue\sdk\inc\processthreadsapi.h +FILE 126 f:\dd\externalapis\windows\winblue\sdk\inc\handleapi.h +FILE 128 f:\dd\externalapis\windows\winblue\sdk\inc\tvout.h +FILE 129 f:\dd\externalapis\windows\winblue\sdk\inc\winreg.h +FILE 130 f:\dd\externalapis\windows\winblue\sdk\inc\reason.h +FILE 131 f:\dd\externalapis\windows\winblue\sdk\inc\consoleapi.h +FILE 132 f:\dd\externalapis\windows\winblue\sdk\inc\wingdi.h +FILE 133 f:\dd\externalapis\windows\winblue\sdk\inc\synchapi.h +FILE 134 f:\dd\externalapis\windows\winblue\sdk\inc\winbase.h +FILE 135 f:\dd\externalapis\windows\winblue\sdk\inc\apisetcconv.h +FILE 137 f:\dd\externalapis\windows\winblue\sdk\inc\minwinbase.h +FILE 140 f:\dd\externalapis\windows\winblue\sdk\inc\namespaceapi.h +FILE 141 f:\dd\vctools\crt\crtw32\h\crtdbg.h +FILE 142 f:\dd\externalapis\windows\winblue\sdk\inc\bemapiset.h +FILE 143 f:\dd\externalapis\windows\winblue\sdk\inc\threadpoollegacyapiset.h +FILE 144 f:\dd\externalapis\windows\winblue\sdk\inc\ime_cmodes.h +FILE 145 f:\dd\vctools\crt\crtw32\h\mtdll.h +FILE 146 f:\dd\externalapis\windows\winblue\sdk\inc\winuser.h +FILE 147 f:\dd\externalapis\windows\winblue\sdk\inc\errhandlingapi.h +FILE 148 f:\dd\vctools\crt\crtw32\h\stdarg.h +FILE 156 f:\dd\externalapis\windows\winblue\sdk\inc\imm.h +FILE 158 f:\dd\externalapis\windows\winblue\sdk\inc\ioapiset.h +FILE 160 f:\dd\vctools\crt\crtw32\h\errno.h +FILE 161 f:\dd\externalapis\windows\winblue\sdk\inc\winerror.h +FILE 162 f:\dd\externalapis\windows\winblue\sdk\inc\systemtopologyapi.h +FILE 163 f:\dd\externalapis\windows\winblue\sdk\inc\sysinfoapi.h +FILE 181 f:\dd\vctools\crt\crtw32\convert\atox.c +FILE 208 f:\dd\vctools\crt\crtw32\h\setlocal.h +FILE 211 f:\dd\vctools\crt\crtw32\h\oscalls.h +FILE 212 f:\dd\vctools\crt\crtw32\h\mbctype.h +FILE 218 f:\dd\vctools\crt\crtw32\h\tchar.h +FILE 220 f:\dd\vctools\crt\crtw32\h\mbstring.h +FILE 231 f:\dd\vctools\crt\crtw32\h\stdlib.h +FILE 255 f:\dd\vctools\crt\crtw32\convert\wchtodig.c +FILE 256 f:\dd\vctools\crt\crtw32\h\wchar.h +FILE 263 f:\dd\vctools\crt\crtw32\h\swprintf.inl +FILE 264 f:\dd\vctools\crt\crtw32\h\wtime.inl +FILE 283 f:\dd\vctools\crt\crtw32\convert\wtox.c +FILE 377 f:\dd\vctools\crt\crtw32\convert\xtows.c +FILE 384 f:\dd\vctools\crt\crtw32\h\internal_securecrt.h +FILE 385 f:\dd\vctools\crt\crtw32\convert\xtoa.c +FILE 480 f:\dd\vctools\crt\crtw32\dos\dosmap.c +FILE 556 f:\dd\vctools\crt\crtw32\h\dbgint.h +FILE 566 f:\dd\vctools\crt\crtw32\heap\calloc_impl.c +FILE 576 f:\dd\vctools\crt\crtw32\h\rtcsup.h +FILE 581 f:\dd\vctools\crt\crtw32\h\rtcapi.h +FILE 583 f:\dd\vctools\crt\crtw32\h\malloc.h +FILE 597 f:\dd\vctools\crt\crtw32\h\winheap.h +FILE 658 f:\dd\vctools\crt\crtw32\heap\crtheap.c +FILE 716 f:\dd\vctools\crt\crtw32\h\awint.h +FILE 744 f:\dd\vctools\crt\crtw32\heap\free.c +FILE 828 f:\dd\vctools\crt\crtw32\heap\heapinit.c +FILE 930 f:\dd\vctools\crt\crtw32\heap\malloc.c +FILE 997 f:\dd\vctools\crt\crtw32\h\rterr.h +FILE 1027 f:\dd\vctools\crt\crtw32\heap\msize.c +FILE 1111 f:\dd\vctools\crt\crtw32\heap\realloc.c +FILE 1206 f:\dd\vctools\crt\crtw32\heap\recalloc.c +FILE 1307 f:\dd\vctools\crt\crtw32\heap\_newmode.c +FILE 1396 f:\dd\vctools\crt\crtw32\lowio\close.c +FILE 1444 f:\dd\vctools\crt\crtw32\h\msdos.h +FILE 1451 f:\dd\vctools\crt\crtw32\h\io.h +FILE 1490 f:\dd\vctools\crt\crtw32\lowio\commit.c +FILE 1584 f:\dd\vctools\crt\crtw32\lowio\ioinit.c +FILE 1677 f:\dd\vctools\crt\crtw32\lowio\isatty.c +FILE 1769 f:\dd\vctools\crt\crtw32\lowio\lseeki64.c +FILE 1804 f:\dd\vctools\crt\crtw32\h\stdio.h +FILE 1865 f:\dd\vctools\crt\crtw32\lowio\osfinfo.c +FILE 1909 f:\dd\vctools\crt\crtw32\h\fcntl.h +FILE 1964 f:\dd\vctools\crt\crtw32\lowio\write.c +FILE 1974 f:\dd\vctools\crt\crtw32\h\locale.h +FILE 2057 f:\dd\vctools\crt\crtw32\lowio\initcon.c +FILE 2072 f:\dd\vctools\crt\crtw32\h\sect_attribs.h +FILE 2139 f:\dd\vctools\crt\crtw32\h\file2.h +FILE 2149 f:\dd\vctools\crt\crtw32\lowio\putwch.c +FILE 2199 f:\dd\vctools\crt\crtw32\h\conio.h +FILE 2246 f:\dd\vctools\crt\crtw32\misc\amd64\loadcfg.c +FILE 2325 f:\dd\vctools\crt\crtw32\misc\abort.c +FILE 2334 f:\dd\vctools\crt\crtw32\h\signal.h +FILE 2424 f:\dd\vctools\crt\crtw32\misc\ctype.c +FILE 2495 f:\dd\vctools\crt\crtw32\misc\dbghook.c +FILE 2522 f:\dd\vctools\crt\crtw32\misc\errmode.c +FILE 2602 f:\dd\vctools\crt\crtw32\misc\getqloc.c +FILE 2706 f:\dd\vctools\crt\crtw32\misc\glstatus.c +FILE 2794 f:\dd\vctools\crt\crtw32\misc\gs_cookie.c +FILE 2878 f:\dd\vctools\crt\crtw32\misc\gs_report.c +FILE 2962 f:\binaries.amd64ret\interapiscandidates\vctools\inc\vc\immintrin.h +FILE 2963 f:\binaries.amd64ret\interapiscandidates\vctools\inc\vc\wmmintrin.h +FILE 2964 f:\binaries.amd64ret\interapiscandidates\vctools\inc\vc\nmmintrin.h +FILE 2965 f:\binaries.amd64ret\interapiscandidates\vctools\inc\vc\smmintrin.h +FILE 2966 f:\binaries.amd64ret\interapiscandidates\vctools\inc\vc\tmmintrin.h +FILE 2967 f:\binaries.amd64ret\interapiscandidates\vctools\inc\vc\pmmintrin.h +FILE 2969 f:\binaries.amd64ret\interapiscandidates\vctools\inc\vc\emmintrin.h +FILE 2970 f:\binaries.amd64ret\interapiscandidates\vctools\inc\vc\xmmintrin.h +FILE 2971 f:\binaries.amd64ret\interapiscandidates\vctools\inc\vc\mmintrin.h +FILE 2974 f:\dd\vctools\crt\crtw32\misc\gs_support.c +FILE 3018 f:\binaries.amd64ret\interapiscandidates\vctools\inc\vc\ammintrin.h +FILE 3023 f:\dd\vctools\crt\crtw32\h\intrin.h +FILE 3024 f:\dd\vctools\crt\crtw32\h\setjmp.h +FILE 3061 f:\dd\vctools\crt\crtw32\misc\initcoll.c +FILE 3147 f:\dd\vctools\crt\crtw32\misc\initctyp.c +FILE 3233 f:\dd\vctools\crt\crtw32\misc\inithelp.c +FILE 3335 f:\dd\vctools\crt\crtw32\misc\initmon.c +FILE 3420 f:\dd\vctools\crt\crtw32\misc\initnum.c +FILE 3462 f:\dd\vctools\crt\crtw32\h\nlsint.h +FILE 3520 f:\dd\vctools\crt\crtw32\misc\inittime.c +FILE 3613 f:\dd\vctools\crt\crtw32\misc\lconv.c +FILE 3702 f:\dd\vctools\crt\crtw32\misc\localref.c +FILE 3795 f:\dd\vctools\crt\crtw32\misc\onexit.c +FILE 3889 f:\dd\vctools\crt\crtw32\misc\nlsdata.c +FILE 3978 f:\dd\vctools\crt\crtw32\misc\pesect.c +FILE 4060 f:\dd\vctools\crt\crtw32\misc\purevirt.c +FILE 4150 f:\dd\vctools\crt\crtw32\misc\winsig.c +FILE 4218 f:\dd\vctools\crt\crtw32\h\float.h +FILE 4220 f:\dd\vctools\crt\crtw32\h\crtwrn.h +FILE 4248 f:\dd\vctools\crt\crtw32\misc\winapinls.c +FILE 4282 f:\dd\vctools\crt\crtw32\h\nlsdownlevel.h +FILE 4340 f:\dd\vctools\crt\crtw32\misc\winapisupp.c +FILE 4354 f:\dd\externalapis\windows\winblue\sdk\inc\appmodel.h +FILE 4355 f:\dd\externalapis\windows\winblue\sdk\inc\minappmodel.h +FILE 4434 f:\dd\vctools\crt\crtw32\misc\winxfltr.c +FILE 4530 f:\dd\vctools\crt\crtw32\misc\wsetloca.c +FILE 4628 f:\dd\vctools\crt\crtw32\misc\rand_s.c +FILE 4640 f:\dd\externalapis\windows\winblue\sdk\inc\ntsecapi.h +FILE 4690 f:\dd\externalapis\windows\winblue\sdk\inc\lsalookup.h +FILE 4721 f:\dd\vctools\crt\crtw32\misc\a_env.c +FILE 4803 f:\dd\vctools\crt\crtw32\misc\getqloc_downlevel.c +FILE 4901 f:\dd\vctools\crt\crtw32\misc\crtmboxw.c +FILE 4913 f:\dd\vctools\crt\crtw32\misc\crtmbox.c +FILE 5002 f:\dd\vctools\crt\crtw32\misc\cmiscdat.c +FILE 5093 f:\dd\vctools\crt\crtw32\stdio\fileno.c +FILE 5182 f:\dd\vctools\crt\crtw32\stdio\_file.c +FILE 5276 f:\dd\vctools\crt\crtw32\stdio\_freebuf.c +FILE 5374 f:\dd\vctools\crt\crtw32\stdio\_sftbuf.c +FILE 5472 f:\dd\vctools\crt\crtw32\stdio\closeall.c +FILE 5556 f:\dd\vctools\crt\crtw32\stdio\fclose.c +FILE 5660 f:\dd\vctools\crt\crtw32\stdio\fflush.c +FILE 5753 f:\dd\vctools\crt\crtw32\stdio\outputformat.c +FILE 5837 f:\dd\vctools\crt\crtw32\string\amd64\cpu_disp.c +FILE 5933 f:\dd\vctools\crt\crtw32\string\amd64\strrchr.c +FILE 6036 f:\dd\vctools\crt\crtw32\string\amd64\wcschr.c +FILE 6136 f:\dd\vctools\crt\crtw32\string\strcpy_s.c +FILE 6169 f:\dd\vctools\crt\crtw32\h\tcscpy_s.inl +FILE 6227 f:\dd\vctools\crt\crtw32\string\strncpy_s.c +FILE 6260 f:\dd\vctools\crt\crtw32\h\tcsncpy_s.inl +FILE 6318 f:\dd\vctools\crt\crtw32\string\wcscat_s.c +FILE 6351 f:\dd\vctools\crt\crtw32\h\tcscat_s.inl +FILE 6394 f:\dd\vctools\crt\crtw32\string\wcscmp.c +FILE 6417 f:\dd\vctools\crt\crtw32\string\wcscpy_s.c +FILE 6493 f:\dd\vctools\crt\crtw32\string\wcscspn.c +FILE 6501 f:\dd\vctools\crt\crtw32\string\wcslen.c +FILE 6509 f:\dd\vctools\crt\crtw32\string\wcslen_s.c +FILE 6517 f:\dd\vctools\crt\crtw32\string\wcsncmp.c +FILE 6540 f:\dd\vctools\crt\crtw32\string\wcsncpy_s.c +FILE 6616 f:\dd\vctools\crt\crtw32\string\wcspbrk.c +FILE 6647 f:\dd\vctools\crt\crtw32\heap\handler.cpp +FILE 6670 f:\dd\vctools\crt\crtw32\h\new.h +FILE 6742 f:\dd\vctools\crt\crtw32\heap\delete.cpp +FILE 6804 f:\dd\vctools\crt\crtw32\string\amd64\memcmp.asm +FILE 6808 f:\dd\vctools\crt\crtw32\string\amd64\memcpy.asm +FILE 6812 f:\dd\vctools\crt\crtw32\string\amd64\memset.asm +FILE 6816 f:\dd\vctools\crt\crtw32\string\amd64\strcmp.asm +FILE 6820 f:\dd\vctools\crt\crtw32\string\amd64\strlen.asm +FILE 6847 f:\dd\vctools\crt\crtw32\convert\_ctype.c +FILE 6940 f:\dd\vctools\crt\crtw32\convert\_wctype.c +FILE 7006 f:\dd\vctools\crt\crtw32\h\math.h +FILE 7027 f:\dd\vctools\crt\crtw32\convert\atodbl.c +FILE 7081 f:\dd\vctools\crt\crtw32\h\atodbl.inl +FILE 7128 f:\dd\vctools\crt\crtw32\convert\iswctype.c +FILE 7216 f:\dd\vctools\crt\crtw32\convert\isctype.c +FILE 7310 f:\dd\vctools\crt\crtw32\convert\mbtowc.c +FILE 7401 f:\dd\vctools\crt\crtw32\convert\strtod.c +FILE 7499 f:\dd\vctools\crt\crtw32\convert\strtol.c +FILE 7592 f:\dd\vctools\crt\crtw32\convert\strtoq.c +FILE 7593 f:\dd\vctools\crt\crtw32\stdhpp\stdint.h +FILE 7683 f:\dd\vctools\crt\crtw32\convert\tolower.c +FILE 7784 f:\dd\vctools\crt\crtw32\convert\towlower.c +FILE 7874 f:\dd\vctools\crt\crtw32\convert\wcstod.c +FILE 7970 f:\dd\vctools\crt\crtw32\convert\wcstol.c +FILE 8064 f:\dd\vctools\crt\crtw32\convert\wcstoq.c +FILE 8156 f:\dd\vctools\crt\crtw32\h\mbdata.h +FILE 8159 f:\dd\vctools\crt\crtw32\mbstring\ismbbyte.c +FILE 8253 f:\dd\vctools\crt\crtw32\mbstring\mbctype.c +FILE 8352 f:\dd\vctools\crt\crtw32\misc\a_loc.c +FILE 8449 f:\dd\vctools\crt\crtw32\misc\a_map.c +FILE 8545 f:\dd\vctools\crt\crtw32\misc\a_str.c +FILE 8649 f:\dd\vctools\crt\crtw32\misc\invarg.c +FILE 8749 f:\dd\vctools\crt\crtw32\misc\w_map.c +FILE 8849 f:\dd\vctools\crt\crtw32\string\wcsicmp.c +FILE 8936 f:\dd\vctools\crt\crtw32\string\wcsnicmp.c +FILE 9010 f:\dd\vctools\crt\crtw32\startup\stdenvp.c +FILE 9116 f:\dd\vctools\crt\crtw32\startup\crt0.c +FILE 9140 f:\dd\vctools\crt\crtw32\h\dos.h +FILE 9214 f:\dd\vctools\crt\crtw32\startup\crt0msg.c +FILE 9217 f:\dd\vctools\crt\crtw32\h\cmsgs.h +FILE 9313 f:\dd\vctools\crt\crtw32\startup\tidtable.c +FILE 9391 f:\dd\vctools\crt\crtw32\h\memory.h +FILE 9411 f:\dd\vctools\crt\crtw32\startup\stdargv.c +FILE 9509 f:\dd\vctools\crt\crtw32\startup\mlock.c +FILE 9605 f:\dd\vctools\crt\crtw32\startup\crt0init.c +FILE 9698 f:\dd\vctools\crt\crtw32\startup\crt0fp.c +FILE 9790 f:\dd\vctools\crt\crtw32\startup\crt0dat.c +FILE 9872 f:\dd\vctools\crt\crtw32\startup\amd64\chkstk.asm +FILE 9904 f:\dd\vctools\crt\fpw32\conv\cvt.c +FILE 9916 f:\dd\vctools\crt\fpw32\include\cv.inl +FILE 9930 f:\dd\vctools\crt\fpw32\include\cv.h +FILE 9988 f:\dd\vctools\crt\fpw32\conv\x10fout.c +FILE 10087 f:\dd\vctools\crt\fpw32\conv\wstrgtold.c +FILE 10104 f:\dd\vctools\crt\fpw32\conv\strgtold.c +FILE 10127 f:\dd\vctools\crt\fpw32\include\strgtold12.inl +FILE 10173 f:\dd\vctools\crt\fpw32\conv\wcfin.c +FILE 10176 f:\dd\vctools\crt\fpw32\conv\cfin.c +FILE 10284 f:\dd\vctools\crt\fpw32\conv\mantold.c +FILE 10294 f:\dd\vctools\crt\fpw32\include\mantold.inl +FILE 10297 f:\dd\vctools\crt\fpw32\conv\intrncvt.c +FILE 10306 f:\dd\vctools\crt\fpw32\include\intrncvt.inl +FILE 10323 f:\dd\vctools\crt\fpw32\conv\fpinit.c +FILE 10399 f:\dd\vctools\crt\fpw32\conv\constpow.c +FILE 10409 f:\dd\vctools\crt\fpw32\include\constpow.inl +FILE 10420 f:\dd\vctools\crt\fpw32\conv\cfout.c +FILE 10514 f:\dd\vctools\crt\fpw32\tran\amd64\huge.asm +FILE 10545 f:\dd\vctools\langapi\undname\undname.inl +FILE 10546 f:\dd\vctools\langapi\undname\undname.cxx +FILE 10566 f:\dd\vctools\langapi\undname\utf8.h +FILE 10584 f:\dd\vctools\langapi\undname\undname.hxx +FILE 10586 f:\dd\vctools\langapi\undname\undname.h +FILE 10610 f:\dd\vctools\crt\crtw32\h\eh.h +FILE 10621 f:\dd\vctools\langapi\include\ehdata.h +FILE 10632 f:\dd\vctools\crt\crtw32\h\ehhooks.h +FILE 10634 f:\dd\vctools\crt\crtw32\eh\unhandld.cpp +FILE 10641 f:\dd\vctools\crt\crtw32\h\ehassert.h +FILE 10708 f:\dd\vctools\crt\crtw32\stdhpp\exception +FILE 10741 f:\dd\vctools\crt\crtw32\eh\typname.cpp +FILE 10756 f:\dd\vctools\crt\crtw32\stdhpp\initializer_list +FILE 10773 f:\dd\vctools\crt\crtw32\stdhpp\xtr1common +FILE 10797 f:\dd\vctools\crt\crtw32\h\typeinfo.h +FILE 10798 f:\dd\vctools\crt\crtw32\stdhpp\typeinfo +FILE 10799 f:\dd\vctools\crt\crtw32\stdhpp\xstddef +FILE 10802 f:\dd\vctools\crt\crtw32\stdhpp\cstddef +FILE 10803 f:\dd\vctools\crt\crtw32\stdhpp\yvals.h +FILE 10804 f:\dd\vctools\crt\crtw32\stdhpp\xkeycheck.h +FILE 10807 f:\dd\vctools\crt\crtw32\stdhpp\use_ansi.h +FILE 10809 f:\binaries.amd64ret\interapiscandidates\vctools\inc\undname.h +FILE 10842 f:\dd\vctools\crt\crtw32\eh\typinfo.cpp +FILE 10933 f:\dd\vctools\crt\crtw32\eh\hooks.cpp +FILE 11032 f:\dd\vctools\crt\crtw32\rtc\initsect.cpp +FILE 11055 f:\dd\vctools\crt\crtw32\h\rtcpriv.h +FUNC 1000 6 0 static int google_breakpad::i() +1000 0 51 1 +1000 5 52 1 +1005 1 53 1 +FUNC 1010 6a 0 main +1010 d 57 1 +101d a 58 1 +1027 11 59 1 +1038 a 60 1 +1042 e 61 1 +1050 f 62 1 +105f 16 64 1 +1075 5 65 1 +FUNC 1080 26 0 google_breakpad::C::C() +1080 26 37 1 +FUNC 10b0 15 0 google_breakpad::C::~C() +10b0 15 38 1 +FUNC 10d0 36 0 google_breakpad::C::`scalar deleting destructor'(unsigned int) +FUNC 1110 26 0 google_breakpad::C::f() +1110 26 43 1 +FUNC 1140 b 0 google_breakpad::C::g() +1140 b 44 1 +FUNC 1150 8 0 google_breakpad::C::h(google_breakpad::C const &) +1150 8 45 1 +FUNC 1160 16 0 google_breakpad::C::set_member(int) +1160 16 40 1 +FUNC 1178 5 0 operator delete(void *) +1178 0 20 6742 +1178 5 23 6742 +FUNC 1180 39 0 type_info::`scalar deleting destructor'(unsigned int) +FUNC 11bc 180 0 static int __tmainCRTStartup() +11bc a 172 9116 +11c6 c 188 9116 +11d2 4e 196 9116 +1220 9 198 9116 +1229 22 199 9116 +124b 9 201 9116 +1254 22 202 9116 +1276 6 211 9116 +127c 9 221 9116 +1285 a 222 9116 +128f d 226 9116 +129c c 229 9116 +12a8 9 231 9116 +12b1 a 232 9116 +12bb 9 233 9116 +12c4 a 234 9116 +12ce 7 237 9116 +12d5 4 238 9116 +12d9 7 239 9116 +12e0 e 254 9116 +12ee 18 255 9116 +1306 4 261 9116 +130a 7 262 9116 +1311 5 264 9116 +1316 2 266 9116 +1318 2 267 9116 +131a 7 275 9116 +1321 8 276 9116 +1329 6 278 9116 +132f 2 282 9116 +1331 b 283 9116 +FUNC 133c 2c 0 static void fast_error_exit(int) +133c 6 305 9116 +1342 b 315 9116 +134d 5 317 9116 +1352 7 319 9116 +1359 5 322 9116 +135e 5 323 9116 +1363 5 322 9116 +FUNC 1368 12 0 mainCRTStartup +1368 4 155 9116 +136c 5 162 9116 +1371 4 165 9116 +1375 5 164 9116 +FUNC 137c 3d 0 free +137c 0 40 744 +137c a 45 744 +1386 12 50 744 +1398 4 51 744 +139c 17 53 744 +13b3 6 55 744 +FUNC 13d0 67 0 strcmp +13d0 0 70 6816 +13d0 3 77 6816 +13d3 3 78 6816 +13d6 2 79 6816 +13d8 3 82 6816 +13db 3 83 6816 +13de 2 84 6816 +13e0 3 86 6816 +13e3 2 88 6816 +13e5 2 89 6816 +13e7 3 91 6816 +13ea 2 92 6816 +13ec a 96 6816 +13f6 a 97 6816 +1400 4 100 6816 +1404 5 101 6816 +1409 5 102 6816 +140e 2 103 6816 +1410 3 105 6816 +1413 4 106 6816 +1417 2 109 6816 +1419 4 112 6816 +141d 3 113 6816 +1420 4 114 6816 +1424 3 115 6816 +1427 3 117 6816 +142a 2 118 6816 +142c 2 121 6816 +142e 1 122 6816 +142f 3 125 6816 +1432 4 126 6816 +1436 1 127 6816 +FUNC 1438 6c 0 type_info::_Type_info_dtor(type_info *) +1438 9 31 10741 +1441 b 32 10741 +144c 9 34 10741 +1455 13 39 10741 +1468 5 41 10741 +146d 5 43 10741 +1472 8 48 10741 +147a 5 49 10741 +147f 2 50 10741 +1481 3 52 10741 +1484 2 41 10741 +1486 9 63 10741 +148f 5 70 10741 +1494 a 73 10741 +149e 6 76 10741 +FUNC 14a4 38 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *) +14a4 4 37 10634 +14a8 27 38 10634 +14cf 2 42 10634 +14d1 5 43 10634 +14d6 6 39 10634 +FUNC 14dc 17 0 _CxxSetUnhandledExceptionFilter +14dc 4 56 10634 +14e0 c 60 10634 +14ec 2 62 10634 +14ee 5 63 10634 +FUNC 14f4 1cc 0 XcptFilter +14f4 19 195 4434 +150d 5 202 4434 +1512 f 203 4434 +1521 31 208 4434 +1552 9 210 4434 +155b 4 216 4434 +155f 9 223 4434 +1568 6 232 4434 +156e 4 237 4434 +1572 9 238 4434 +157b 6 244 4434 +1581 8 248 4434 +1589 7 262 4434 +1590 7 263 4434 +1597 a 272 4434 +15a1 5 280 4434 +15a6 19 283 4434 +15bf e 310 4434 +15cd f 312 4434 +15dc 8 314 4434 +15e4 f 316 4434 +15f3 8 318 4434 +15fb c 320 4434 +1607 8 322 4434 +160f c 324 4434 +161b 8 326 4434 +1623 c 328 4434 +162f 8 330 4434 +1637 c 332 4434 +1643 8 334 4434 +164b c 336 4434 +1657 8 338 4434 +165f c 340 4434 +166b 8 342 4434 +1673 a 344 4434 +167d e 353 4434 +168b 6 358 4434 +1691 2 360 4434 +1693 4 365 4434 +1697 6 366 4434 +169d 7 372 4434 +16a4 5 374 4434 +16a9 2 224 4434 +16ab 15 376 4434 +FUNC 16c0 133 0 freefls +16c0 0 370 9313 +16c0 13 381 9313 +16d3 3 370 9313 +16d6 9 382 9313 +16df 5 383 9313 +16e4 9 385 9313 +16ed 5 386 9313 +16f2 9 388 9313 +16fb 5 389 9313 +1700 9 391 9313 +1709 5 392 9313 +170e 9 394 9313 +1717 5 395 9313 +171c 9 397 9313 +1725 5 398 9313 +172a c 400 9313 +1736 5 401 9313 +173b 13 403 9313 +174e 5 404 9313 +1753 d 406 9313 +1760 27 410 9313 +1787 6 411 9313 +178d 7 414 9313 +1794 b 417 9313 +179f c 420 9313 +17ab 8 422 9313 +17b3 1a 425 9313 +17cd 9 426 9313 +17d6 a 430 9313 +17e0 8 433 9313 +17e8 b 436 9313 +FUNC 17f4 24 0 getptd +17f4 6 336 9313 +17fa 8 337 9313 +1802 5 338 9313 +1807 8 339 9313 +180f 3 341 9313 +1812 6 342 9313 +FUNC 1818 82 0 getptd_noexit +1818 a 270 9313 +1822 6 274 9313 +1828 15 277 9313 +183d 15 286 9313 +1852 e 289 9313 +1860 e 295 9313 +186e 6 297 9313 +1874 7 298 9313 +187b 2 300 9313 +187d 5 306 9313 +1882 2 307 9313 +1884 8 312 9313 +188c 3 314 9313 +188f b 315 9313 +FUNC 189c c2 0 initptd +189c 10 203 9313 +18ac e 204 9313 +18ba 4 205 9313 +18be 7 206 9313 +18c5 a 211 9313 +18cf c 215 9313 +18db 7 216 9313 +18e2 e 217 9313 +18f0 8 219 9313 +18f8 b 221 9313 +1903 a 224 9313 +190d a 228 9313 +1917 b 233 9313 +1922 7 235 9313 +1929 5 243 9313 +192e e 244 9313 +193c d 245 9313 +1949 a 248 9313 +1953 b 250 9313 +FUNC 1960 7f 0 mtinit +1960 6 88 9313 +1966 5 91 9313 +196b 9 97 9313 +1974 17 105 9313 +198b 29 115 9313 +19b4 a 125 9313 +19be 6 127 9313 +19c4 7 128 9313 +19cb 7 130 9313 +19d2 5 117 9313 +19d7 2 118 9313 +19d9 6 131 9313 +FUNC 19e0 24 0 mtterm +19e0 4 160 9313 +19e4 b 167 9313 +19ef 5 168 9313 +19f4 7 169 9313 +19fb 4 177 9313 +19ff 5 176 9313 +FUNC 1a04 41 0 _crtCorExitProcess +1a04 8 734 9790 +1a0c 18 738 9790 +1a24 12 739 9790 +1a36 5 740 9790 +1a3b 4 741 9790 +1a3f 6 751 9790 +FUNC 1a48 16 0 _crtExitProcess +1a48 8 757 9790 +1a50 5 764 9790 +1a55 9 774 9790 +FUNC 1a60 26 0 amsg_exit +1a60 8 485 9790 +1a68 5 487 9790 +1a6d 7 488 9790 +1a74 12 490 9790 +FUNC 1a88 f 0 c_exit +1a88 0 454 9790 +1a88 f 455 9790 +FUNC 1a98 d 0 cexit +1a98 0 447 9790 +1a98 d 448 9790 +FUNC 1aa8 96 0 cinit +1aa8 6 278 9790 +1aae 1c 288 9790 +1aca 8 290 9790 +1ad2 5 292 9790 +1ad7 13 298 9790 +1aea 4 299 9790 +1aee c 303 9790 +1afa 13 308 9790 +1b0d 1a 321 9790 +1b27 f 323 9790 +1b36 2 327 9790 +1b38 6 328 9790 +FUNC 1b40 c 0 exit +1b40 0 432 9790 +1b40 c 433 9790 +FUNC 1b4c 4b 0 init_pointers +1b4c 6 879 9790 +1b52 8 880 9790 +1b5a b 882 9790 +1b65 8 883 9790 +1b6d 8 884 9790 +1b75 8 885 9790 +1b7d 8 886 9790 +1b85 8 889 9790 +1b8d 5 900 9790 +1b92 5 893 9790 +FUNC 1b98 60 0 static void _initterm( * *, * *) +1b98 30 941 9790 +1bc8 5 948 9790 +1bcd 8 953 9790 +1bd5 2 954 9790 +1bd7 c 955 9790 +1be3 15 957 9790 +FUNC 1bf8 39 0 initterm_e +1bf8 a 990 9790 +1c02 8 991 9790 +1c0a 9 999 9790 +1c13 8 1004 9790 +1c1b 2 1005 9790 +1c1d 9 1006 9790 +1c26 b 1010 9790 +FUNC 1c34 a 0 lockexit +1c34 0 825 9790 +1c34 a 826 9790 +FUNC 1c40 a 0 unlockexit +1c40 0 851 9790 +1c40 a 852 9790 +FUNC 1c4c 195 0 static void doexit(int, int, int) +1c4c 24 552 9790 +1c70 b 568 9790 +1c7b d 571 9790 +1c88 a 572 9790 +1c92 7 575 9790 +1c99 8 577 9790 +1ca1 15 593 9790 +1cb6 9 594 9790 +1cbf 15 595 9790 +1cd4 8 599 9790 +1cdc 8 600 9790 +1ce4 1b 608 9790 +1cff 2 611 9790 +1d01 5 613 9790 +1d06 c 620 9790 +1d12 b 623 9790 +1d1d 2 626 9790 +1d1f 10 628 9790 +1d2f d 629 9790 +1d3c a 631 9790 +1d46 10 634 9790 +1d56 10 635 9790 +1d66 2 637 9790 +1d68 13 643 9790 +1d7b 14 651 9790 +1d8f 5 666 9790 +1d94 a 667 9790 +1d9e 5 670 9790 +1da3 a 674 9790 +1dad a 676 9790 +1db7 12 678 9790 +1dc9 18 679 9790 +FUNC 1de4 a 0 exit +1de4 0 416 9790 +1de4 a 417 9790 +FUNC 1df0 20 0 heap_init +1df0 4 40 828 +1df4 17 42 828 +1e0b 5 46 828 +FUNC 1e10 32d 0 ioinit +1e10 25 110 1584 +1e35 b 125 1584 +1e40 23 134 1584 +1e63 19 136 1584 +1e7c 7 139 1584 +1e83 7 140 1584 +1e8a b 142 1584 +1e95 6 143 1584 +1e9b 4 144 1584 +1e9f 4 146 1584 +1ea3 7 147 1584 +1eaa 5 148 1584 +1eaf 6 149 1584 +1eb5 4 151 1584 +1eb9 4 152 1584 +1ebd 11 142 1584 +1ece b 160 1584 +1ed9 20 162 1584 +1ef9 9 173 1584 +1f02 b 174 1584 +1f0d d 180 1584 +1f1a 12 186 1584 +1f2c 18 192 1584 +1f44 7 198 1584 +1f4b 2 199 1584 +1f4d e 205 1584 +1f5b 7 206 1584 +1f62 f 208 1584 +1f71 6 209 1584 +1f77 4 210 1584 +1f7b 4 212 1584 +1f7f 4 213 1584 +1f83 6 214 1584 +1f89 4 216 1584 +1f8d 4 217 1584 +1f91 a 208 1584 +1f9b 4 186 1584 +1f9f 14 224 1584 +1fb3 23 237 1584 +1fd6 1b 239 1584 +1ff1 6 240 1584 +1ff7 6 241 1584 +1ffd 11 243 1584 +200e 3 244 1584 +2011 19 224 1584 +202a 18 255 1584 +2042 20 257 1584 +2062 10 320 1584 +2072 4 271 1584 +2076 34 275 1584 +20aa 3 280 1584 +20ad 8 286 1584 +20b5 9 287 1584 +20be 5 288 1584 +20c3 a 289 1584 +20cd 11 292 1584 +20de 3 293 1584 +20e1 2 295 1584 +20e3 a 304 1584 +20ed 3 305 1584 +20f0 c 311 1584 +20fc 8 312 1584 +2104 b 255 1584 +210f a 326 1584 +2119 2 329 1584 +211b 22 330 1584 +FUNC 2140 f3 0 setargv +2140 f 88 9411 +214f 9 97 9411 +2158 5 98 9411 +215d 1f 105 9411 +217c 7 122 9411 +2183 7 110 9411 +218a d 122 9411 +2197 1c 129 9411 +21b3 1f 136 9411 +21d2 9 140 9411 +21db b 144 9411 +21e6 5 145 9411 +21eb 1e 153 9411 +2209 4 158 9411 +220d f 162 9411 +221c 4 177 9411 +2220 3 138 9411 +2223 10 178 9411 +FUNC 2234 1c7 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +2234 1d 223 9411 +2251 15 230 9411 +2266 7 231 9411 +226d 5 235 9411 +2272 7 236 9411 +2279 2 255 9411 +227b 5 257 9411 +2280 4 259 9411 +2284 b 260 9411 +228f 2 261 9411 +2291 3 263 9411 +2294 5 264 9411 +2299 7 265 9411 +22a0 6 267 9411 +22a6 b 269 9411 +22b1 3 270 9411 +22b4 5 271 9411 +22b9 7 272 9411 +22c0 3 273 9411 +22c3 15 277 9411 +22d8 5 282 9411 +22dd 6 283 9411 +22e3 3 280 9411 +22e6 2 286 9411 +22e8 9 291 9411 +22f1 a 292 9411 +22fb 5 293 9411 +2300 9 296 9411 +2309 5 300 9411 +230e 7 301 9411 +2315 4 302 9411 +2319 5 316 9411 +231e 4 320 9411 +2322 3 323 9411 +2325 2 324 9411 +2327 5 321 9411 +232c 5 326 9411 +2331 4 329 9411 +2335 d 330 9411 +2342 3 331 9411 +2345 2 332 9411 +2347 b 334 9411 +2352 4 337 9411 +2356 2 341 9411 +2358 5 342 9411 +235d 6 343 9411 +2363 3 344 9411 +2366 4 341 9411 +236a 12 348 9411 +237c 4 353 9411 +2380 11 355 9411 +2391 a 356 9411 +239b 3 357 9411 +239e 7 359 9411 +23a5 2 360 9411 +23a7 4 361 9411 +23ab 3 362 9411 +23ae 3 363 9411 +23b1 3 366 9411 +23b4 3 368 9411 +23b7 5 377 9411 +23bc 5 381 9411 +23c1 6 382 9411 +23c7 3 383 9411 +23ca 5 292 9411 +23cf 5 387 9411 +23d4 4 388 9411 +23d8 4 389 9411 +23dc 1f 390 9411 +FUNC 23fc 131 0 setenvp +23fc 14 77 9010 +2410 9 85 9010 +2419 5 86 9010 +241e 9 91 9010 +2427 5 98 9010 +242c 8 99 9010 +2434 4 110 9010 +2438 2 111 9010 +243a e 112 9010 +2448 6 108 9010 +244e 1f 117 9010 +246d c 121 9010 +2479 8 123 9010 +2481 8 125 9010 +2489 18 127 9010 +24a1 12 133 9010 +24b3 4 134 9010 +24b7 b 121 9010 +24c2 7 131 9010 +24c9 8 138 9010 +24d1 8 139 9010 +24d9 4 142 9010 +24dd a 149 9010 +24e7 2 152 9010 +24e9 15 153 9010 +24fe c 129 9010 +250a 8 130 9010 +2512 5 131 9010 +2517 16 133 9010 +FUNC 2530 43 0 FF_MSGBANNER +2530 4 143 9214 +2534 26 147 9214 +255a a 149 9214 +2564 a 150 9214 +256e 5 152 9214 +FUNC 2574 2f 0 GET_RTERRMSG +2574 0 174 9214 +2574 c 177 9214 +2580 5 178 9214 +2585 f 177 9214 +2594 2 181 9214 +2596 1 182 9214 +2597 b 179 9214 +25a2 1 182 9214 +FUNC 25a4 26f 0 NMSG_WRITE +25a4 2f 205 9214 +25d3 5 206 9214 +25d8 e 208 9214 +25e6 2a 235 9214 +2610 c 272 9214 +261c 1f 281 9214 +263b 2 284 9214 +263d 8 281 9214 +2645 25 284 9214 +266a 19 285 9214 +2683 11 288 9214 +2694 c 290 9214 +26a0 2d 291 9214 +26cd 1a 294 9214 +26e7 16 295 9214 +26fd 17 299 9214 +2714 18 237 9214 +272c 8 253 9214 +2734 4 255 9214 +2738 5 257 9214 +273d 15 253 9214 +2752 2d 269 9214 +277f 2d 303 9214 +27ac 15 285 9214 +27c1 15 291 9214 +27d6 15 295 9214 +27eb 15 294 9214 +2800 13 281 9214 +FUNC 2814 7 0 _set_app_type +2814 0 94 2522 +2814 6 95 2522 +281a 1 96 2522 +FUNC 281c 40 0 set_error_mode +281c 4 49 2522 +2820 e 52 2522 +282e 6 60 2522 +2834 2 61 2522 +2836 6 56 2522 +283c 6 57 2522 +2842 2 66 2522 +2844 13 63 2522 +2857 5 67 2522 +FUNC 285c ac 0 _security_init_cookie +285c d 82 2974 +2869 1b 99 2974 +2884 a 112 2974 +288e 8 114 2974 +2896 c 120 2974 +28a2 6 121 2974 +28a8 10 130 2974 +28b8 7 132 2974 +28bf 1c 149 2974 +28db 11 157 2974 +28ec 7 168 2974 +28f3 15 171 2974 +FUNC 2908 38 0 RTC_Initialize +2908 a 43 11032 +2912 10 46 11032 +2922 8 48 11032 +292a 2 50 11032 +292c 9 46 11032 +2935 b 53 11032 +FUNC 2940 38 0 RTC_Terminate +2940 a 57 11032 +294a 10 60 11032 +295a 8 62 11032 +2962 2 64 11032 +2964 9 60 11032 +296d b 67 11032 +FUNC 2978 f4 0 _crtGetEnvironmentStringsA +2978 19 40 4721 +2991 15 49 4721 +29a6 3 53 4721 +29a9 6 54 4721 +29af a 55 4721 +29b9 a 56 4721 +29c3 2e 70 4721 +29f1 14 74 4721 +2a05 28 88 4721 +2a2d 8 90 4721 +2a35 3 91 4721 +2a38 9 94 4721 +2a41 5 95 4721 +2a46 9 76 4721 +2a4f 2 77 4721 +2a51 1b 96 4721 +FUNC 2a6c 1e1 0 _C_specific_handler +2a6c 1c 91 6 +2a88 4 112 6 +2a8c 3 113 6 +2a8f 7 114 6 +2a96 13 124 6 +2aa9 14 133 6 +2abd 2a 136 6 +2ae7 7 145 6 +2aee 4 150 6 +2af2 d 152 6 +2aff 4 162 6 +2b03 2 165 6 +2b05 23 176 6 +2b28 e 178 6 +2b36 15 191 6 +2b4b 29 198 6 +2b74 5 204 6 +2b79 7 133 6 +2b80 7 163 6 +2b87 4 216 6 +2b8b c 218 6 +2b97 17 220 6 +2bae 6 222 6 +2bb4 7 238 6 +2bbb 30 242 6 +2beb 8 238 6 +2bf3 5 248 6 +2bf8 8 263 6 +2c00 5 264 6 +2c05 2 267 6 +2c07 3 218 6 +2c0a 14 272 6 +2c1e c 218 6 +2c2a 5 284 6 +2c2f 1e 285 6 +FUNC 2c50 20 0 _doserrno +2c50 4 292 480 +2c54 5 293 480 +2c59 5 294 480 +2c5e 9 295 480 +2c67 4 297 480 +2c6b 5 299 480 +FUNC 2c70 4e 0 dosmaperr +2c70 c 110 480 +2c7c 19 111 480 +2c95 1e 113 480 +2cb3 b 114 480 +FUNC 2cc0 20 0 errno +2cc0 4 279 480 +2cc4 5 280 480 +2cc9 5 281 480 +2cce 9 282 480 +2cd7 4 284 480 +2cdb 5 287 480 +FUNC 2ce0 4d 0 get_errno_from_oserr +2ce0 0 119 480 +2ce0 10 123 480 +2cf0 5 124 480 +2cf5 e 123 480 +2d03 8 133 480 +2d0b 5 134 480 +2d10 1 139 480 +2d11 12 135 480 +2d23 1 139 480 +2d24 8 125 480 +2d2c 1 139 480 +FUNC 2d30 f2 0 call_reportfault +2d30 36 148 8649 +2d66 5 150 8649 +2d6b 5 151 8649 +2d70 17 154 8649 +2d87 5 156 8649 +2d8c 17 188 8649 +2da3 e 189 8649 +2db1 7 190 8649 +2db8 8 194 8649 +2dc0 8 195 8649 +2dc8 c 196 8649 +2dd4 6 198 8649 +2dda c 201 8649 +2de6 d 205 8649 +2df3 7 206 8649 +2dfa 28 208 8649 +FUNC 2e24 8 0 initp_misc_invarg +2e24 0 39 8649 +2e24 7 40 8649 +2e2b 1 41 8649 +FUNC 2e2c 65 0 invalid_parameter +2e2c 17 71 8649 +2e43 16 78 8649 +2e59 11 81 8649 +2e6a 14 86 8649 +2e7e 3 81 8649 +2e81 10 85 8649 +FUNC 2e94 1e 0 invalid_parameter_noinfo +2e94 4 95 8649 +2e98 15 96 8649 +2ead 5 97 8649 +FUNC 2eb4 3b 0 invoke_watson +2eb4 4 121 8649 +2eb8 e 131 8649 +2ec6 7 132 8649 +2ecd 14 136 8649 +2ee1 5 138 8649 +2ee6 4 140 8649 +2eea 5 138 8649 +FUNC 2ef0 61 0 strcpy_s +2ef0 6 13 6169 +2ef6 a 18 6169 +2f00 8 19 6169 +2f08 13 18 6169 +2f1b 6 34 6169 +2f21 19 23 6169 +2f3a 5 27 6169 +2f3f 2 29 6169 +2f41 c 30 6169 +2f4d 4 33 6169 +FUNC 2f70 a8 0 strlen +2f70 0 46 6820 +2f70 3 50 6820 +2f73 3 51 6820 +2f76 6 52 6820 +2f7c 4 53 6820 +2f80 2 58 6820 +2f82 3 59 6820 +2f85 2 60 6820 +2f87 2 61 6820 +2f89 2 62 6820 +2f8b 2 63 6820 +2f8d a 66 6820 +2f97 a 67 6820 +2fa1 3 70 6820 +2fa4 3 72 6820 +2fa7 4 73 6820 +2fab 3 74 6820 +2fae 3 75 6820 +2fb1 3 76 6820 +2fb4 3 77 6820 +2fb7 2 78 6820 +2fb9 4 82 6820 +2fbd 2 84 6820 +2fbf 2 85 6820 +2fc1 2 86 6820 +2fc3 2 87 6820 +2fc5 4 88 6820 +2fc9 2 89 6820 +2fcb 2 90 6820 +2fcd 2 91 6820 +2fcf 2 92 6820 +2fd1 4 93 6820 +2fd5 2 94 6820 +2fd7 2 95 6820 +2fd9 2 96 6820 +2fdb 2 97 6820 +2fdd 3 98 6820 +2fe0 2 99 6820 +2fe2 2 100 6820 +2fe4 2 101 6820 +2fe6 2 102 6820 +2fe8 5 105 6820 +2fed 1 106 6820 +2fee 5 108 6820 +2ff3 1 109 6820 +2ff4 5 111 6820 +2ff9 1 112 6820 +2ffa 5 114 6820 +2fff 1 115 6820 +3000 5 117 6820 +3005 1 118 6820 +3006 5 120 6820 +300b 1 121 6820 +300c 5 123 6820 +3011 1 124 6820 +3012 5 126 6820 +3017 1 127 6820 +FUNC 3018 44 0 lock +3018 a 325 9509 +3022 14 330 9509 +3036 9 332 9509 +303f 8 333 9509 +3047 4 340 9509 +304b a 341 9509 +3055 7 340 9509 +FUNC 305c 87 0 mtdeletelocks +305c 14 183 9509 +3070 e 189 9509 +307e e 191 9509 +308c 9 195 9509 +3095 8 201 9509 +309d 4 202 9509 +30a1 9 189 9509 +30aa b 210 9509 +30b5 a 212 9509 +30bf 6 216 9509 +30c5 9 210 9509 +30ce 15 219 9509 +FUNC 30e4 bd 0 mtinitlocknum +30e4 13 254 9509 +30f7 a 264 9509 +3101 5 266 9509 +3106 a 267 9509 +3110 a 269 9509 +311a 11 273 9509 +312b 7 274 9509 +3132 12 276 9509 +3144 b 277 9509 +314f 4 278 9509 +3153 b 281 9509 +315e 3 285 9509 +3161 7 284 9509 +3168 d 285 9509 +3175 4 286 9509 +3179 2 288 9509 +317b 6 289 9509 +3181 d 293 9509 +318e 2 296 9509 +3190 11 297 9509 +FUNC 31a4 61 0 mtinitlocks +31a4 f 137 9509 +31b3 c 139 9509 +31bf 6 145 9509 +31c5 a 146 9509 +31cf 1a 147 9509 +31e9 9 144 9509 +31f2 13 153 9509 +FUNC 3208 18 0 unlock +3208 0 363 9509 +3208 18 367 9509 +FUNC 3220 b6 0 malloc +3220 12 84 930 +3232 b 88 930 +323d 41 92 930 +327e 5 97 930 +3283 8 101 930 +328b c 108 930 +3297 2 112 930 +3299 b 103 930 +32a4 b 122 930 +32af 5 124 930 +32b4 5 114 930 +32b9 b 115 930 +32c4 2 116 930 +32c6 10 125 930 +FUNC 32f0 24 0 local_unwind +32f0 0 47 69 +32f0 7 49 69 +32f7 3 58 69 +32fa 3 59 69 +32fd 5 65 69 +3302 5 66 69 +3307 5 67 69 +330c 7 68 69 +3313 d 69 69 +FUNC 3320 18 0 NLG_Notify +3320 0 103 69 +3320 5 105 69 +3325 5 106 69 +332a 5 107 69 +332f 7 108 69 +3336 a 109 69 +FUNC 3340 1 0 _NLG_Dispatch2 +3340 0 113 69 +3340 10 114 69 +FUNC 3350 1 0 _NLG_Return2 +3350 0 137 69 +3350 1 138 69 +FUNC 3354 1f 0 terminate() +3354 4 66 10933 +3358 c 71 10933 +3364 5 72 10933 +3369 2 81 10933 +336b 2 82 10933 +336d 6 96 10933 +FUNC 3374 1d 0 initp_eh_hooks +3374 4 51 10933 +3378 14 52 10933 +338c 5 53 10933 +FUNC 3394 6d 0 _crtCaptureCurrentContext +3394 d 327 4340 +33a1 6 335 4340 +33a7 7 337 4340 +33ae 11 338 4340 +33bf 5 340 4340 +33c4 32 348 4340 +33f6 b 350 4340 +FUNC 3404 71 0 _crtCapturePreviousContext +3404 b 279 4340 +340f 6 287 4340 +3415 7 289 4340 +341c 2 292 4340 +341e 11 294 4340 +342f 5 296 4340 +3434 39 304 4340 +346d 8 309 4340 +FUNC 3478 1a 0 _crtFlsAlloc +3478 0 381 4340 +3478 10 386 4340 +3488 3 388 4340 +348b 7 392 4340 +FUNC 3494 1a 0 _crtFlsFree +3494 0 398 4340 +3494 10 403 4340 +34a4 3 405 4340 +34a7 7 409 4340 +FUNC 34b0 1a 0 _crtFlsGetValue +34b0 0 415 4340 +34b0 10 420 4340 +34c0 3 422 4340 +34c3 7 426 4340 +FUNC 34cc 1a 0 _crtFlsSetValue +34cc 0 433 4340 +34cc 10 438 4340 +34dc 3 440 4340 +34df 7 444 4340 +FUNC 34e8 2b 0 _crtInitializeCriticalSectionEx +34e8 4 457 4340 +34ec 10 459 4340 +34fc 4 467 4340 +3500 3 461 4340 +3503 6 465 4340 +3509 5 466 4340 +350e 5 467 4340 +FUNC 3514 4c 0 _crtIsPackagedApp +3514 6 126 4340 +351a c 133 4340 +3526 2d 135 4340 +3553 7 138 4340 +355a 6 140 4340 +FUNC 3560 3fa 0 _crtLoadWinApiPointers +3560 6 749 4340 +3566 d 750 4340 +3573 13 752 4340 +3586 1e 753 4340 +35a4 1e 754 4340 +35c2 1e 755 4340 +35e0 1e 756 4340 +35fe 1e 757 4340 +361c 1e 758 4340 +363a 1e 759 4340 +3658 1e 760 4340 +3676 1e 761 4340 +3694 1e 762 4340 +36b2 1e 763 4340 +36d0 1e 764 4340 +36ee 1e 765 4340 +370c 1e 766 4340 +372a 25 767 4340 +374f 17 768 4340 +3766 1e 769 4340 +3784 1e 770 4340 +37a2 1e 771 4340 +37c0 1e 772 4340 +37de 1e 773 4340 +37fc 1e 774 4340 +381a 1e 775 4340 +3838 1e 776 4340 +3856 1e 777 4340 +3874 1e 778 4340 +3892 1e 779 4340 +38b0 1e 780 4340 +38ce 1e 781 4340 +38ec 1e 782 4340 +390a 25 783 4340 +392f 25 784 4340 +3954 6 785 4340 +FUNC 395c 7 0 _crtSetUnhandledExceptionFilter +395c 0 194 4340 +395c 7 198 4340 +FUNC 3964 7 0 _crtSleep +3964 0 727 4340 +3964 7 739 4340 +FUNC 396c 1f 0 _crtTerminateProcess +396c 8 221 4340 +3974 b 224 4340 +397f 5 225 4340 +3984 7 224 4340 +FUNC 398c 20 0 _crtUnhandledException +398c 9 253 4340 +3995 8 255 4340 +399d 3 258 4340 +39a0 5 259 4340 +39a5 7 258 4340 +FUNC 39ac 7f 0 calloc_crt +39ac 19 55 658 +39c5 c 56 658 +39d1 11 62 658 +39e2 d 63 658 +39ef 19 64 658 +3a08 5 65 658 +3a0d 1e 69 658 +FUNC 3a2c 7a 0 malloc_crt +3a2c 19 40 658 +3a45 f 41 658 +3a54 b 45 658 +3a5f 9 46 658 +3a68 1b 47 658 +3a83 5 48 658 +3a88 1e 52 658 +FUNC 3aa8 81 0 realloc_crt +3aa8 19 72 658 +3ac1 c 73 658 +3acd e 77 658 +3adb 12 78 658 +3aed 19 79 658 +3b06 5 80 658 +3b0b 1e 84 658 +FUNC 3b2c 8c 0 _addlocaleref +3b2c 0 36 3702 +3b2c 3 39 3702 +3b2f c 41 3702 +3b3b 3 42 3702 +3b3e c 44 3702 +3b4a 3 45 3702 +3b4d c 47 3702 +3b59 3 48 3702 +3b5c c 50 3702 +3b68 3 51 3702 +3b6b a 53 3702 +3b75 15 55 3702 +3b8a 3 56 3702 +3b8d 10 59 3702 +3b9d 3 60 3702 +3ba0 9 53 3702 +3ba9 e 63 3702 +3bb7 1 64 3702 +FUNC 3bb8 196 0 _freetlocinfo +3bb8 14 129 3702 +3bcc 2c 137 3702 +3bf8 11 140 3702 +3c09 5 142 3702 +3c0e c 143 3702 +3c1a 11 147 3702 +3c2b 5 149 3702 +3c30 c 150 3702 +3c3c c 153 3702 +3c48 c 154 3702 +3c54 11 161 3702 +3c65 13 163 3702 +3c78 14 164 3702 +3c8c f 165 3702 +3c9b c 166 3702 +3ca7 1c 173 3702 +3cc3 5 175 3702 +3cc8 c 176 3702 +3cd4 10 179 3702 +3ce4 1a 182 3702 +3cfe 5 184 3702 +3d03 8 185 3702 +3d0b 15 193 3702 +3d20 5 195 3702 +3d25 d 179 3702 +3d32 3 202 3702 +3d35 14 203 3702 +3d49 5 202 3702 +FUNC 3d50 a4 0 _removelocaleref +3d50 0 74 3702 +3d50 9 77 3702 +3d59 8 79 3702 +3d61 c 81 3702 +3d6d 4 82 3702 +3d71 c 84 3702 +3d7d 4 85 3702 +3d81 c 87 3702 +3d8d 4 88 3702 +3d91 c 90 3702 +3d9d 4 91 3702 +3da1 a 93 3702 +3dab 15 95 3702 +3dc0 4 96 3702 +3dc4 10 99 3702 +3dd4 4 100 3702 +3dd8 9 93 3702 +3de1 f 103 3702 +3df0 3 106 3702 +3df3 1 107 3702 +FUNC 3df4 75 0 _updatetlocinfo +3df4 6 282 3702 +3dfa 8 284 3702 +3e02 18 286 3702 +3e1a e 298 3702 +3e28 b 287 3702 +3e33 16 291 3702 +3e49 a 295 3702 +3e53 5 301 3702 +3e58 8 303 3702 +3e60 3 306 3702 +3e63 6 307 3702 +FUNC 3e6c 62 0 updatetlocinfoEx_nolock +3e6c d 217 3702 +3e79 a 220 3702 +3e83 3 223 3702 +3e86 5 224 3702 +3e8b 3 230 3702 +3e8e 8 231 3702 +3e96 5 237 3702 +3e9b 8 239 3702 +3ea3 11 249 3702 +3eb4 8 250 3702 +3ebc 5 254 3702 +3ec1 2 221 3702 +3ec3 b 255 3702 +FUNC 3ed0 28 0 _initmbctable +3ed0 4 854 8253 +3ed4 9 864 8253 +3edd a 865 8253 +3ee7 a 866 8253 +3ef1 2 871 8253 +3ef3 5 872 8253 +FUNC 3ef8 a8 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *) +3ef8 d 245 208 +3f05 9 246 208 +3f0e 9 248 208 +3f17 a 249 208 +3f21 b 250 208 +3f2c 1f 252 208 +3f4b 28 253 208 +3f73 e 254 208 +3f81 9 256 208 +3f8a 4 257 208 +3f8e 2 260 208 +3f90 7 262 208 +3f97 9 264 208 +FUNC 3fa0 7d 0 static int getSystemCP(int) +3fa0 8 295 8253 +3fa8 c 297 8253 +3fb4 7 298 8253 +3fbb 5 303 8253 +3fc0 a 305 8253 +3fca 8 306 8253 +3fd2 5 309 8253 +3fd7 a 311 8253 +3fe1 a 312 8253 +3feb 5 317 8253 +3ff0 12 320 8253 +4002 15 323 8253 +4017 6 324 8253 +FUNC 4020 8e 0 static void setSBCS(struct threadmbcinfostruct *) +4020 14 374 8253 +4034 7 378 8253 +403b 12 379 8253 +404d a 382 8253 +4057 7 387 8253 +405e b 390 8253 +4069 a 392 8253 +4073 d 393 8253 +4080 c 395 8253 +408c d 396 8253 +4099 15 397 8253 +FUNC 40b0 1e1 0 static void setSBUpLow(struct threadmbcinfostruct *) +40b0 2e 413 8253 +40de e 423 8253 +40ec 14 426 8253 +4100 b 427 8253 +410b 10 431 8253 +411b e 433 8253 +4129 9 434 8253 +4132 5 433 8253 +4137 a 431 8253 +4141 2c 439 8253 +416d 33 444 8253 +41a0 39 449 8253 +41d9 1c 458 8253 +41f5 5 455 8253 +41fa 3 457 8253 +41fd 7 458 8253 +4204 5 460 8253 +4209 3 462 8253 +420c b 463 8253 +4217 2 465 8253 +4219 7 466 8253 +4220 c 454 8253 +422c 2 468 8253 +422e 6 472 8253 +4234 d 473 8253 +4241 3 475 8253 +4244 5 476 8253 +4249 6 478 8253 +424f 3 480 8253 +4252 9 481 8253 +425b 2 483 8253 +425d 7 484 8253 +4264 9 472 8253 +426d 24 486 8253 +FUNC 4294 ba 0 _updatetmbcinfo +4294 a 507 8253 +429e 8 510 8253 +42a6 18 511 8253 +42be 9 545 8253 +42c7 b 513 8253 +42d2 15 516 8253 +42e7 1b 522 8253 +4302 5 527 8253 +4307 1a 534 8253 +4321 8 535 8253 +4329 a 540 8253 +4333 5 548 8253 +4338 8 550 8253 +4340 3 553 8253 +4343 b 554 8253 +FUNC 4350 244 0 setmbcp +4350 1b 585 8253 +436b 4 586 8253 +436f 8 590 8253 +4377 5 592 8253 +437c 7 593 8253 +4383 a 595 8253 +438d 9 597 8253 +4396 d 603 8253 +43a3 b 605 8253 +43ae 70 607 8253 +441e 2 618 8253 +4420 16 623 8253 +4436 1f 625 8253 +4455 c 626 8253 +4461 3 631 8253 +4464 1a 633 8253 +447e d 635 8253 +448b 9 641 8253 +4494 9 642 8253 +449d e 643 8253 +44ab 12 644 8253 +44bd 11 645 8253 +44ce 4 644 8253 +44d2 e 646 8253 +44e0 f 647 8253 +44ef 4 646 8253 +44f3 c 648 8253 +44ff 12 649 8253 +4511 4 648 8253 +4515 1e 651 8253 +4533 5 652 8253 +4538 7 656 8253 +453f 3 657 8253 +4542 9 661 8253 +454b 5 665 8253 +4550 c 671 8253 +455c 8 672 8253 +4564 b 673 8253 +456f 2 679 8253 +4571 5 684 8253 +4576 3 693 8253 +4579 1b 694 8253 +FUNC 4594 2ae 0 setmbcp_nolock +4594 28 697 8253 +45bc 5 704 8253 +45c1 8 707 8253 +45c9 8 709 8253 +45d1 5 710 8253 +45d6 12 714 8253 +45e8 8 719 8253 +45f0 1b 716 8253 +460b 11 754 8253 +461c 15 762 8253 +4631 4 766 8253 +4635 d 767 8253 +4642 3 769 8253 +4645 7 770 8253 +464c b 772 8253 +4657 12 775 8253 +4669 1f 777 8253 +4688 b 778 8253 +4693 9 775 8253 +469c 9 782 8253 +46a5 b 783 8253 +46b0 47 786 8253 +46f7 4 789 8253 +46fb 2 791 8253 +46fd 3 793 8253 +4700 4 795 8253 +4704 b 796 8253 +470f 5 800 8253 +4714 c 805 8253 +4720 8 812 8253 +4728 4 722 8253 +472c d 723 8253 +4739 1e 726 8253 +4757 3 729 8253 +475a b 731 8253 +4765 1a 734 8253 +477f 17 735 8253 +4796 9 731 8253 +479f c 726 8253 +47ab 3 739 8253 +47ae 4 741 8253 +47b2 38 742 8253 +47ea 17 743 8253 +4801 11 744 8253 +4812 8 747 8253 +481a 2 748 8253 +481c 26 813 8253 +FUNC 4850 44 0 FindPESection +4850 0 86 3978 +4850 4 93 3978 +4854 1f 102 3978 +4873 12 105 3978 +4885 c 102 3978 +4891 2 117 3978 +4893 1 118 3978 +FUNC 48a0 4d 0 IsNonwritableInCurrentImage +48a0 d 143 3978 +48ad 13 158 3978 +48c0 3 168 3978 +48c3 b 169 3978 +48ce 5 170 3978 +48d3 d 179 3978 +48e0 2 187 3978 +48e2 b 189 3978 +FUNC 48f0 2e 0 ValidateImageBase +48f0 3 38 3978 +48f3 a 44 3978 +48fd 2 46 3978 +48ff 1 62 3978 +4900 7 49 3978 +4907 a 52 3978 +4911 c 56 3978 +491d 1 62 3978 +FUNC 4920 43 0 _onexitinit +4920 6 201 3795 +4926 d 204 3795 +4933 1a 205 3795 +494d 5 207 3795 +4952 5 212 3795 +4957 4 214 3795 +495b 2 216 3795 +495d 6 217 3795 +FUNC 4964 10a 0 onexit +4964 1c 81 3795 +4980 6 84 3795 +4986 c6 87 3795 +4a4c 5 90 3795 +4a51 3 93 3795 +4a54 1a 94 3795 +FUNC 4a70 17 0 atexit +4a70 4 161 3795 +4a74 e 162 3795 +4a82 5 163 3795 +FUNC 4a88 39 0 initp_misc_cfltcvt_tab +4a88 a 54 5002 +4a92 9 56 5002 +4a9b 1b 58 5002 +4ab6 b 60 5002 +FUNC 4ac4 33 0 callnewh +4ac4 9 131 6647 +4acd d 133 6647 +4ada e 135 6647 +4ae8 7 138 6647 +4aef 2 136 6647 +4af1 6 139 6647 +FUNC 4af8 8 0 initp_heap_handler +4af8 0 31 6647 +4af8 7 32 6647 +4aff 1 33 6647 +FUNC 4b00 8 0 initp_misc_purevirt +4b00 0 179 3233 +4b00 7 180 3233 +4b07 1 181 3233 +FUNC 4b08 e 0 _get_sigabrt +4b08 0 670 4150 +4b08 e 671 4150 +FUNC 4b18 1d 0 initp_misc_winsig +4b18 0 57 4150 +4b18 7 58 4150 +4b1f 7 59 4150 +4b26 7 60 4150 +4b2d 7 61 4150 +4b34 1 62 4150 +FUNC 4b38 233 0 raise +4b38 19 451 4150 +4b51 3 454 4150 +4b54 5 455 4150 +4b59 6 458 4150 +4b5f 2 459 4150 +4b61 2d 461 4150 +4b8e 12 499 4150 +4ba0 e 469 4150 +4bae 5 471 4150 +4bb3 e 480 4150 +4bc1 2 482 4150 +4bc3 e 475 4150 +4bd1 2 477 4150 +4bd3 8 487 4150 +4bdb 5 488 4150 +4be0 8 489 4150 +4be8 46 491 4150 +4c2e 2 492 4150 +4c30 e 464 4150 +4c3e 9 465 4150 +4c47 9 501 4150 +4c50 6 508 4150 +4c56 7 509 4150 +4c5d 5 514 4150 +4c62 a 519 4150 +4c6c 4 526 4150 +4c70 19 527 4150 +4c89 c 541 4150 +4c95 8 542 4150 +4c9d 5 548 4150 +4ca2 a 549 4150 +4cac a 550 4150 +4cb6 5 558 4150 +4cbb 18 565 4150 +4cd3 13 568 4150 +4ce6 e 565 4150 +4cf4 b 571 4150 +4cff 4 575 4150 +4d03 7 576 4150 +4d0a 5 579 4150 +4d0f b 585 4150 +4d1a 2 586 4150 +4d1c 18 587 4150 +4d34 7 595 4150 +4d3b 9 600 4150 +4d44 a 601 4150 +4d4e 5 604 4150 +4d53 18 605 4150 +FUNC 4d6c 8 0 initp_misc_rand_s +4d6c 0 52 4628 +4d6c 7 53 4628 +4d73 1 54 4628 +FUNC 4d74 98 0 _initstdio +4d74 a 109 5182 +4d7e 11 118 5182 +4d8f 7 119 5182 +4d96 5 120 5182 +4d9b 1f 130 5182 +4dba 1d 133 5182 +4dd7 7 134 5182 +4dde 7 141 5182 +4de5 11 142 5182 +4df6 9 141 5182 +4dff 2 144 5182 +4e01 b 145 5182 +FUNC 4e0c 30 0 _endstdio +4e0c 4 173 5182 +4e10 5 175 5182 +4e15 9 178 5182 +4e1e 5 179 5182 +4e23 c 180 5182 +4e2f 8 181 5182 +4e37 5 182 5182 +FUNC 4e3c 65 0 lock_file +4e3c 9 203 5182 +4e45 18 208 5182 +4e5d 29 213 5182 +4e86 5 215 5182 +4e8b 6 224 5182 +4e91 4 223 5182 +4e95 5 224 5182 +4e9a 7 223 5182 +FUNC 4ea4 31 0 lock_file2 +4ea4 9 246 5182 +4ead 5 251 5182 +4eb2 8 256 5182 +4eba 5 258 5182 +4ebf 6 267 5182 +4ec5 4 266 5182 +4ec9 5 267 5182 +4ece 7 266 5182 +FUNC 4ed8 4e 0 unlock_file +4ed8 0 288 5182 +4ed8 18 293 5182 +4ef0 5 299 5182 +4ef5 26 300 5182 +4f1b b 308 5182 +FUNC 4f28 1d 0 unlock_file2 +4f28 0 331 5182 +4f28 5 336 5182 +4f2d 5 342 5182 +4f32 8 343 5182 +4f3a b 351 5182 +FUNC 4f48 79 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) +4f48 11 223 8159 +4f59 13 224 8159 +4f6c 45 232 8159 +4fb1 10 233 8159 +FUNC 4fc4 12 0 ismbblead +4fc4 0 181 8159 +4fc4 12 182 8159 +FUNC 4fd8 85 0 wcscat_s +4fd8 6 13 6351 +4fde 10 18 6351 +4fee 9 19 6351 +4ff7 13 18 6351 +500a 6 46 6351 +5010 6 23 6351 +5016 4 25 6351 +501a 5 26 6351 +501f 5 29 6351 +5024 6 31 6351 +502a 1a 35 6351 +5044 5 39 6351 +5049 4 41 6351 +504d c 42 6351 +5059 4 45 6351 +FUNC 5060 6b 0 wcscpy_s +5060 6 13 6169 +5066 d 18 6169 +5073 9 19 6169 +507c 13 18 6169 +508f 6 34 6169 +5095 1d 23 6169 +50b2 5 27 6169 +50b7 4 29 6169 +50bb c 30 6169 +50c7 4 33 6169 +FUNC 50cc 19 0 wcslen +50cc 0 41 6501 +50cc 3 42 6501 +50cf c 44 6501 +50db 9 46 6501 +50e4 1 47 6501 +FUNC 50e8 cc 0 wcsncpy_s +50e8 6 13 6260 +50ee 11 17 6260 +50ff 4 20 6260 +5103 a 24 6260 +510d 5 25 6260 +5112 3 28 6260 +5115 2 29 6260 +5117 8 31 6260 +511f 13 24 6260 +5132 6 66 6260 +5138 3 33 6260 +513b 3 34 6260 +513e 6 35 6260 +5144 1a 37 6260 +515e 2 41 6260 +5160 1f 45 6260 +517f 5 48 6260 +5184 4 50 6260 +5188 9 54 6260 +5191 6 56 6260 +5197 5 58 6260 +519c 6 59 6260 +51a2 3 61 6260 +51a5 f 62 6260 +FUNC 51b4 273 0 _crtMessageBoxW +51b4 21 91 4913 +51d5 e 99 4913 +51e3 5 106 4913 +51e8 5 108 4913 +51ed 10 115 4913 +51fd 18 117 4913 +5215 14 118 4913 +5229 15 122 4913 +523e 9 124 4913 +5247 19 127 4913 +5260 9 130 4913 +5269 20 133 4913 +5289 20 136 4913 +52a9 17 138 4913 +52c0 10 139 4913 +52d0 5 141 4913 +52d5 20 143 4913 +52f5 a 147 4913 +52ff 5 152 4913 +5304 9 153 4913 +530d 5 159 4913 +5312 a 161 4913 +531c 5 166 4913 +5321 d 168 4913 +532e a 181 4913 +5338 15 202 4913 +534d 6 205 4913 +5353 13 206 4913 +5366 a 208 4913 +5370 31 213 4913 +53a1 4 222 4913 +53a5 2 224 4913 +53a7 c 226 4913 +53b3 6 228 4913 +53b9 5 229 4913 +53be 5 231 4913 +53c3 11 235 4913 +53d4 6 237 4913 +53da 5 238 4913 +53df 8 240 4913 +53e7 d 247 4913 +53f4 5 248 4913 +53f9 10 250 4913 +5409 2 255 4913 +540b 1c 258 4913 +FUNC 5428 1d 0 _GSHandlerCheck +5428 4 75 37 +542c f 84 37 +543b 5 91 37 +5440 5 92 37 +FUNC 5448 63 0 _GSHandlerCheckCommon +5448 6 126 37 +544e d 140 37 +545b 9 149 37 +5464 13 154 37 +5477 7 162 37 +547e b 171 37 +5489 6 173 37 +548f c 175 37 +549b 3 184 37 +549e 3 185 37 +54a1 5 186 37 +54a6 5 185 37 +FUNC 54c0 1f 0 _security_check_cookie +54c0 0 45 2 +54c0 7 47 2 +54c7 2 48 2 +54c9 4 49 2 +54cd 5 50 2 +54d2 3 51 2 +54d5 1 53 2 +54d6 4 61 2 +54da 5 65 2 +FUNC 54e0 8 0 _crt_debugger_hook +54e0 0 57 2495 +54e0 7 60 2495 +54e7 1 61 2495 +FUNC 5500 22a 0 memset +5500 0 55 6812 +5500 3 59 6812 +5503 3 60 6812 +5506 4 61 6812 +550a 6 62 6812 +5510 8 67 6812 +5518 2 68 6812 +551a 1 71 6812 +551b 3 72 6812 +551e 2 73 6812 +5520 3 74 6812 +5523 2 75 6812 +5525 1 76 6812 +5526 2 77 6812 +5528 a 79 6812 +5532 4 80 6812 +5536 8 82 6812 +553e 6 83 6812 +5544 4 87 6812 +5548 2 88 6812 +554a 3 93 6812 +554d 3 94 6812 +5550 2 95 6812 +5552 3 96 6812 +5555 3 97 6812 +5558 3 98 6812 +555b 3 104 6812 +555e 4 105 6812 +5562 4 106 6812 +5566 2 107 6812 +5568 3 113 6812 +556b 4 114 6812 +556f 4 115 6812 +5573 7 116 6812 +557a 3 120 6812 +557d 4 121 6812 +5581 3 122 6812 +5584 2 123 6812 +5586 3 129 6812 +5589 2 130 6812 +558b 2 131 6812 +558d 3 132 6812 +5590 3 133 6812 +5593 2 134 6812 +5595 3 135 6812 +5598 f 136 6812 +55a7 3 147 6812 +55aa 4 148 6812 +55ae 4 149 6812 +55b2 4 150 6812 +55b6 4 151 6812 +55ba 4 152 6812 +55be 3 153 6812 +55c1 4 154 6812 +55c5 4 155 6812 +55c9 4 156 6812 +55cd 2 157 6812 +55cf 11 158 6812 +55e0 5 170 6812 +55e5 4 171 6812 +55e9 3 172 6812 +55ec 2 173 6812 +55ee 3 183 6812 +55f1 3 184 6812 +55f4 4 185 6812 +55f8 4 186 6812 +55fc 3 187 6812 +55ff 5 188 6812 +5604 3 194 6812 +5607 4 195 6812 +560b 2 196 6812 +560d 3 197 6812 +5610 3 204 6812 +5613 4 205 6812 +5617 7 206 6812 +561e 4 207 6812 +5622 4 208 6812 +5626 3 209 6812 +5629 4 210 6812 +562d 4 211 6812 +5631 4 212 6812 +5635 4 213 6812 +5639 2 214 6812 +563b 4 216 6812 +563f 3 221 6812 +5642 4 222 6812 +5646 a 223 6812 +5650 3 236 6812 +5653 4 237 6812 +5657 3 238 6812 +565a 2 239 6812 +565c 4 242 6812 +5660 2 243 6812 +5662 6 248 6812 +5668 3 251 6812 +566b 1 252 6812 +566c a 263 6812 +5676 4 264 6812 +567a 7 265 6812 +5681 8 266 6812 +5689 3 267 6812 +568c 3 268 6812 +568f 3 269 6812 +5692 4e 270 6812 +56e0 4 296 6812 +56e4 3 299 6812 +56e7 4 302 6812 +56eb 3 305 6812 +56ee 1 307 6812 +56ef 4 309 6812 +56f3 2 310 6812 +56f5 4 312 6812 +56f9 3 315 6812 +56fc 4 318 6812 +5700 1 319 6812 +5701 4 321 6812 +5705 3 324 6812 +5708 3 325 6812 +570b 1 326 6812 +570c 4 328 6812 +5710 3 331 6812 +5713 1 332 6812 +5714 4 334 6812 +5718 4 335 6812 +571c 1 336 6812 +571d 4 338 6812 +5721 3 339 6812 +5724 1 340 6812 +5725 4 342 6812 +5729 1 343 6812 +FUNC 572c 55 0 abort +572c 4 55 2325 +5730 5 72 2325 +5735 5 73 2325 +573a a 75 2325 +5744 9 82 2325 +574d e 87 2325 +575b 7 88 2325 +5762 14 90 2325 +5776 b 100 2325 +FUNC 5784 d3 0 realloc +5784 15 62 1111 +5799 5 67 1111 +579e a 68 1111 +57a8 5 71 1111 +57ad 5 73 1111 +57b2 2 74 1111 +57b4 6 81 1111 +57ba 24 85 1111 +57de d 94 1111 +57eb c 109 1111 +57f7 6 81 1111 +57fd 8 89 1111 +5805 b 90 1111 +5810 2 91 1111 +5812 10 117 1111 +5822 17 111 1111 +5839 2 112 1111 +583b 17 103 1111 +5852 5 105 1111 +FUNC 5858 9a 0 calloc_impl +5858 10 21 566 +5868 5 26 566 +586d 1d 28 566 +588a 4 30 566 +588e c 34 566 +589a 2 39 566 +589c 6 41 566 +58a2 13 44 566 +58b5 e 47 566 +58c3 c 59 566 +58cf 5 61 566 +58d4 6 62 566 +58da 2 63 566 +58dc 5 52 566 +58e1 6 53 566 +58e7 b 69 566 +FUNC 58f4 10a 0 _free_lconv_mon +58f4 0 270 3335 +58f4 e 271 3335 +5902 3 270 3335 +5905 d 274 3335 +5912 5 275 3335 +5917 d 277 3335 +5924 5 278 3335 +5929 d 280 3335 +5936 5 281 3335 +593b d 283 3335 +5948 5 284 3335 +594d d 286 3335 +595a 5 287 3335 +595f d 289 3335 +596c 5 290 3335 +5971 d 292 3335 +597e 5 293 3335 +5983 d 295 3335 +5990 5 296 3335 +5995 d 298 3335 +59a2 5 299 3335 +59a7 d 301 3335 +59b4 5 302 3335 +59b9 10 304 3335 +59c9 5 305 3335 +59ce 10 307 3335 +59de 5 308 3335 +59e3 10 310 3335 +59f3 5 311 3335 +59f8 6 312 3335 +FUNC 5a00 6c 0 _free_lconv_num +5a00 0 217 3420 +5a00 a 218 3420 +5a0a 3 217 3420 +5a0d c 221 3420 +5a19 5 222 3420 +5a1e d 224 3420 +5a2b 5 225 3420 +5a30 d 227 3420 +5a3d 5 228 3420 +5a42 d 230 3420 +5a4f 5 231 3420 +5a54 d 233 3420 +5a61 5 234 3420 +5a66 6 235 3420 +FUNC 5a6c 3fa 0 _free_lc_time +5a6c 0 230 3520 +5a6c e 231 3520 +5a7a 3 230 3520 +5a7d 9 234 3520 +5a86 9 235 3520 +5a8f 9 236 3520 +5a98 9 237 3520 +5aa1 9 238 3520 +5aaa 9 239 3520 +5ab3 8 240 3520 +5abb 9 242 3520 +5ac4 9 243 3520 +5acd 9 244 3520 +5ad6 9 245 3520 +5adf 9 246 3520 +5ae8 9 247 3520 +5af1 9 248 3520 +5afa 9 250 3520 +5b03 9 251 3520 +5b0c c 252 3520 +5b18 c 253 3520 +5b24 c 254 3520 +5b30 c 255 3520 +5b3c c 256 3520 +5b48 c 257 3520 +5b54 c 258 3520 +5b60 c 259 3520 +5b6c c 260 3520 +5b78 c 261 3520 +5b84 c 263 3520 +5b90 c 264 3520 +5b9c c 265 3520 +5ba8 c 266 3520 +5bb4 c 267 3520 +5bc0 c 268 3520 +5bcc c 269 3520 +5bd8 c 270 3520 +5be4 c 271 3520 +5bf0 c 272 3520 +5bfc c 273 3520 +5c08 c 274 3520 +5c14 c 276 3520 +5c20 c 277 3520 +5c2c c 279 3520 +5c38 c 280 3520 +5c44 c 281 3520 +5c50 c 284 3520 +5c5c c 285 3520 +5c68 c 286 3520 +5c74 c 287 3520 +5c80 c 288 3520 +5c8c c 289 3520 +5c98 c 290 3520 +5ca4 c 292 3520 +5cb0 c 293 3520 +5cbc c 294 3520 +5cc8 c 295 3520 +5cd4 c 296 3520 +5ce0 c 297 3520 +5cec c 298 3520 +5cf8 c 300 3520 +5d04 c 301 3520 +5d10 c 302 3520 +5d1c c 303 3520 +5d28 c 304 3520 +5d34 c 305 3520 +5d40 c 306 3520 +5d4c c 307 3520 +5d58 c 308 3520 +5d64 c 309 3520 +5d70 c 310 3520 +5d7c c 311 3520 +5d88 c 313 3520 +5d94 c 314 3520 +5da0 c 315 3520 +5dac c 316 3520 +5db8 c 317 3520 +5dc4 c 318 3520 +5dd0 c 319 3520 +5ddc c 320 3520 +5de8 c 321 3520 +5df4 c 322 3520 +5e00 c 323 3520 +5e0c c 324 3520 +5e18 c 326 3520 +5e24 c 327 3520 +5e30 c 329 3520 +5e3c c 330 3520 +5e48 c 331 3520 +5e54 c 333 3520 +5e60 6 336 3520 +FUNC 5e68 2ec 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, const wchar_t *, unsigned long, const char *, int, char *, int, int, int) +5e68 2d 96 8449 +5e95 13 101 8449 +5ea8 21 102 8449 +5ec9 2 106 8449 +5ecb 5 107 8449 +5ed0 2 109 8449 +5ed2 b 133 8449 +5edd 7 134 8449 +5ee4 2c 145 8449 +5f10 7 146 8449 +5f17 7c 149 8449 +5f93 9 150 8449 +5f9c 26 160 8449 +5fc2 29 169 8449 +5feb b 172 8449 +5ff6 b 175 8449 +6001 8 177 8449 +6009 1e 186 8449 +6027 5 190 8449 +602c 7d 196 8449 +60a9 5 197 8449 +60ae 20 207 8449 +60ce 3 210 8449 +60d1 1f 220 8449 +60f0 2 223 8449 +60f2 18 233 8449 +610a 11 240 8449 +611b 11 242 8449 +612c 2 244 8449 +612e 26 245 8449 +FUNC 6154 96 0 _crtLCMapStringA +6154 12 258 8449 +6166 13 259 8449 +6179 5f 271 8449 +61d8 12 272 8449 +FUNC 61ec 176 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int) +61ec 2d 60 8545 +6219 14 80 8545 +622d 7 81 8545 +6234 23 92 8545 +6257 7 93 8545 +625e 7c 96 8545 +62da 9 97 8545 +62e3 10 100 8545 +62f3 21 108 8545 +6314 15 113 8545 +6329 11 115 8545 +633a 2 117 8545 +633c 26 118 8545 +FUNC 6364 7c 0 _crtGetStringTypeA +6364 11 129 8545 +6375 13 130 8545 +6388 48 140 8545 +63d0 10 141 8545 +FUNC 63e0 39 0 msize +63e0 4 39 1027 +63e4 19 43 1027 +63fd 5 50 1027 +6402 c 46 1027 +640e 4 50 1027 +6412 7 46 1027 +FUNC 641c a 0 fptrap +641c 0 46 9698 +641c a 47 9698 +FUNC 6428 8a 0 GetTableIndexFromLocaleName +6428 1c 52 4248 +6444 2 54 4248 +6446 c 55 4248 +6452 3 59 4248 +6455 20 60 4248 +6475 4 62 4248 +6479 2 65 4248 +647b 3 66 4248 +647e 2 67 4248 +6480 3 68 4248 +6483 4 57 4248 +6487 5 71 4248 +648c b 63 4248 +6497 1b 72 4248 +FUNC 64b4 32 0 _crtDownlevelLocaleNameToLCID +64b4 4 107 4248 +64b8 5 110 4248 +64bd 5 113 4248 +64c2 e 115 4248 +64d0 f 118 4248 +64df 2 116 4248 +64e1 5 119 4248 +FUNC 64e8 8f 0 _crtLCMapStringEx +64e8 10 325 4248 +64f8 18 327 4248 +6510 2a 329 4248 +653a 2d 333 4248 +6567 10 334 4248 +FUNC 6578 55 0 _wcsnicmp_ascii +6578 0 28 4248 +6578 9 30 4248 +6581 5 32 4248 +6586 3 40 4248 +6589 12 36 4248 +659b 11 37 4248 +65ac 4 39 4248 +65b0 f 40 4248 +65bf a 42 4248 +65c9 3 45 4248 +65cc 1 46 4248 +FUNC 65e0 565 0 memcpy +65e0 0 101 6808 +65e0 3 107 6808 +65e3 3 108 6808 +65e6 4 109 6808 +65ea 6 110 6808 +65f0 3 111 6808 +65f3 2 112 6808 +65f5 3 113 6808 +65f8 3 114 6808 +65fb 3 115 6808 +65fe 6 116 6808 +6604 8 119 6808 +660c 2 120 6808 +660e 1 123 6808 +660f 1 124 6808 +6610 3 125 6808 +6613 3 126 6808 +6616 3 127 6808 +6619 2 128 6808 +661b 1 129 6808 +661c 1 130 6808 +661d 3 131 6808 +6620 1 132 6808 +6621 8 135 6808 +6629 6 136 6808 +662f 3 142 6808 +6632 2 143 6808 +6634 3 144 6808 +6637 2 145 6808 +6639 3 146 6808 +663c 3 147 6808 +663f 2 148 6808 +6641 3 149 6808 +6644 3 150 6808 +6647 2 151 6808 +6649 4 152 6808 +664d 4 153 6808 +6651 3 154 6808 +6654 4 155 6808 +6658 3 156 6808 +665b 2 157 6808 +665d 3 158 6808 +6660 4 159 6808 +6664 2 160 6808 +6666 4 161 6808 +666a 3 167 6808 +666d 4 168 6808 +6671 6 169 6808 +6677 3 175 6808 +667a 4 176 6808 +667e 2 177 6808 +6680 4 178 6808 +6684 3 179 6808 +6687 4 180 6808 +668b 3 181 6808 +668e 2 182 6808 +6690 4 183 6808 +6694 3 189 6808 +6697 2 190 6808 +6699 3 191 6808 +669c 4 192 6808 +66a0 4 200 6808 +66a4 3 201 6808 +66a7 2 202 6808 +66a9 3 205 6808 +66ac 7 207 6808 +66b3 8 208 6808 +66bb 3 209 6808 +66be 46 210 6808 +6704 3 232 6808 +6707 1 233 6808 +6708 4 236 6808 +670c 3 237 6808 +670f 3 238 6808 +6712 1 239 6808 +6713 4 241 6808 +6717 4 242 6808 +671b 3 243 6808 +671e 1 244 6808 +671f 4 246 6808 +6723 5 247 6808 +6728 3 248 6808 +672b 5 249 6808 +6730 3 250 6808 +6733 1 251 6808 +6734 2 253 6808 +6736 3 254 6808 +6739 3 255 6808 +673c 1 256 6808 +673d 4 258 6808 +6741 3 259 6808 +6744 3 260 6808 +6747 4 261 6808 +674b 3 262 6808 +674e 1 263 6808 +674f 4 265 6808 +6753 3 266 6808 +6756 4 267 6808 +675a 4 268 6808 +675e 3 269 6808 +6761 1 270 6808 +6762 4 272 6808 +6766 5 273 6808 +676b 3 274 6808 +676e 3 275 6808 +6771 5 276 6808 +6776 4 277 6808 +677a 3 278 6808 +677d 1 279 6808 +677e 3 281 6808 +6781 3 282 6808 +6784 3 283 6808 +6787 1 284 6808 +6788 4 286 6808 +678c 4 287 6808 +6790 3 288 6808 +6793 4 289 6808 +6797 3 290 6808 +679a 1 291 6808 +679b 4 293 6808 +679f 4 294 6808 +67a3 4 295 6808 +67a7 4 296 6808 +67ab 3 297 6808 +67ae 1 298 6808 +67af 4 300 6808 +67b3 5 301 6808 +67b8 4 302 6808 +67bc 3 303 6808 +67bf 5 304 6808 +67c4 4 305 6808 +67c8 3 306 6808 +67cb 1 307 6808 +67cc 2 309 6808 +67ce 4 310 6808 +67d2 3 311 6808 +67d5 4 312 6808 +67d9 3 313 6808 +67dc 1 314 6808 +67dd 4 316 6808 +67e1 3 317 6808 +67e4 4 318 6808 +67e8 3 319 6808 +67eb 4 320 6808 +67ef 4 321 6808 +67f3 3 322 6808 +67f6 1 323 6808 +67f7 4 325 6808 +67fb 3 326 6808 +67fe 4 327 6808 +6802 4 328 6808 +6806 4 329 6808 +680a 4 330 6808 +680e 3 331 6808 +6811 1 332 6808 +6812 4 334 6808 +6816 5 335 6808 +681b 3 336 6808 +681e 4 337 6808 +6822 3 338 6808 +6825 5 339 6808 +682a 4 340 6808 +682e 4 341 6808 +6832 3 342 6808 +6835 1 343 6808 +6836 4 345 6808 +683a 5 346 6808 +683f 3 347 6808 +6842 e 348 6808 +6850 4 356 6808 +6854 5 357 6808 +6859 4 358 6808 +685d 4 359 6808 +6861 4 360 6808 +6865 5 361 6808 +686a 5 362 6808 +686f 3 363 6808 +6872 4 364 6808 +6876 4 365 6808 +687a 2 366 6808 +687c 4 367 6808 +6880 5 368 6808 +6885 4 381 6808 +6889 6 382 6808 +688f 3 406 6808 +6892 2 407 6808 +6894 4 411 6808 +6898 4 412 6808 +689c 4 413 6808 +68a0 2 414 6808 +68a2 4 419 6808 +68a6 4 420 6808 +68aa 3 421 6808 +68ad 5 422 6808 +68b2 4 423 6808 +68b6 3 424 6808 +68b9 3 425 6808 +68bc 3 426 6808 +68bf 3 431 6808 +68c2 4 432 6808 +68c6 2 433 6808 +68c8 4 434 6808 +68cc 4 435 6808 +68d0 4 452 6808 +68d4 4 453 6808 +68d8 4 455 6808 +68dc 5 456 6808 +68e1 7 457 6808 +68e8 4 458 6808 +68ec 4 459 6808 +68f0 5 460 6808 +68f5 5 461 6808 +68fa 3 462 6808 +68fd 4 463 6808 +6901 4 464 6808 +6905 5 465 6808 +690a 5 466 6808 +690f 4 467 6808 +6913 4 468 6808 +6917 5 469 6808 +691c 5 470 6808 +6921 2 471 6808 +6923 4 473 6808 +6927 4 474 6808 +692b 3 475 6808 +692e 3 480 6808 +6931 4 481 6808 +6935 b 482 6808 +6940 4 487 6808 +6944 4 489 6808 +6948 4 490 6808 +694c 3 491 6808 +694f 2 492 6808 +6951 4 495 6808 +6955 2 496 6808 +6957 4 505 6808 +695b 5 506 6808 +6960 4 507 6808 +6964 4 511 6808 +6968 3 512 6808 +696b 5 513 6808 +6970 4 538 6808 +6974 5 539 6808 +6979 4 540 6808 +697d 4 541 6808 +6981 3 542 6808 +6984 3 543 6808 +6987 13 544 6808 +699a 8 557 6808 +69a2 6 558 6808 +69a8 3 559 6808 +69ab 3 565 6808 +69ae 2 566 6808 +69b0 3 567 6808 +69b3 2 568 6808 +69b5 3 569 6808 +69b8 3 570 6808 +69bb 3 571 6808 +69be 2 572 6808 +69c0 3 573 6808 +69c3 2 574 6808 +69c5 4 575 6808 +69c9 4 576 6808 +69cd 4 577 6808 +69d1 3 578 6808 +69d4 3 579 6808 +69d7 2 580 6808 +69d9 4 581 6808 +69dd 3 582 6808 +69e0 4 583 6808 +69e4 2 584 6808 +69e6 3 590 6808 +69e9 4 591 6808 +69ed 2 592 6808 +69ef 3 598 6808 +69f2 4 599 6808 +69f6 2 600 6808 +69f8 4 601 6808 +69fc 4 602 6808 +6a00 3 603 6808 +6a03 3 604 6808 +6a06 2 605 6808 +6a08 4 606 6808 +6a0c 3 612 6808 +6a0f 2 613 6808 +6a11 3 614 6808 +6a14 c 615 6808 +6a20 3 623 6808 +6a23 3 624 6808 +6a26 4 625 6808 +6a2a 6 626 6808 +6a30 5 634 6808 +6a35 5 635 6808 +6a3a 4 636 6808 +6a3e 4 637 6808 +6a42 4 638 6808 +6a46 5 639 6808 +6a4b 4 640 6808 +6a4f 3 641 6808 +6a52 4 642 6808 +6a56 3 643 6808 +6a59 2 644 6808 +6a5b 4 645 6808 +6a5f 2 646 6808 +6a61 4 661 6808 +6a65 6 662 6808 +6a6b 3 663 6808 +6a6e 3 684 6808 +6a71 2 685 6808 +6a73 4 689 6808 +6a77 4 690 6808 +6a7b 4 691 6808 +6a7f 2 692 6808 +6a81 4 697 6808 +6a85 4 698 6808 +6a89 3 699 6808 +6a8c 3 700 6808 +6a8f 4 701 6808 +6a93 3 702 6808 +6a96 3 703 6808 +6a99 3 704 6808 +6a9c 3 710 6808 +6a9f 4 711 6808 +6aa3 2 712 6808 +6aa5 3 713 6808 +6aa8 8 714 6808 +6ab0 4 721 6808 +6ab4 3 722 6808 +6ab7 5 724 6808 +6abc 5 725 6808 +6ac1 7 726 6808 +6ac8 4 727 6808 +6acc 4 728 6808 +6ad0 5 729 6808 +6ad5 5 730 6808 +6ada 3 731 6808 +6add 4 732 6808 +6ae1 4 733 6808 +6ae5 5 734 6808 +6aea 5 735 6808 +6aef 4 736 6808 +6af3 4 737 6808 +6af7 5 738 6808 +6afc 4 739 6808 +6b00 2 740 6808 +6b02 4 742 6808 +6b06 4 743 6808 +6b0a 3 744 6808 +6b0d 3 749 6808 +6b10 4 750 6808 +6b14 c 751 6808 +6b20 3 756 6808 +6b23 4 758 6808 +6b27 4 759 6808 +6b2b 3 760 6808 +6b2e 2 761 6808 +6b30 4 764 6808 +6b34 2 765 6808 +6b36 4 775 6808 +6b3a 4 776 6808 +6b3e 3 779 6808 +6b41 3 780 6808 +6b44 1 781 6808 +FUNC 6b48 26 0 fileno +6b48 4 40 5093 +6b4c 1a 41 5093 +6b66 3 42 5093 +6b69 5 43 5093 +FUNC 6b70 5f 0 isatty +6b70 4 37 1677 +6b74 12 39 1677 +6b86 c 40 1677 +6b92 26 43 1677 +6bb8 12 40 1677 +6bca 5 44 1677 +FUNC 6bd0 4c 0 fflush_nolock +6bd0 9 97 5660 +6bd9 5 101 5660 +6bde 5 116 5660 +6be3 5 102 5660 +6be8 9 104 5660 +6bf1 5 106 5660 +6bf6 9 111 5660 +6bff 15 112 5660 +6c14 2 115 5660 +6c16 6 116 5660 +FUNC 6c1c 79 0 flush +6c1c f 142 5660 +6c2b 20 152 5660 +6c4b 17 154 5660 +6c62 7 158 5660 +6c69 6 159 5660 +6c6f 2 161 5660 +6c71 4 162 5660 +6c75 3 163 5660 +6c78 4 167 5660 +6c7c 4 168 5660 +6c80 2 170 5660 +6c82 13 171 5660 +FUNC 6c98 a 0 flushall +6c98 0 193 5660 +6c98 a 194 5660 +FUNC 6ca4 e6 0 static int flsall(int) +6ca4 1c 228 5660 +6cc0 2 230 5660 +6cc2 2 231 5660 +6cc4 9 233 5660 +6ccd 12 235 5660 +6cdf 19 236 5660 +6cf8 8 243 5660 +6d00 11 251 5660 +6d11 6 252 5660 +6d17 a 258 5660 +6d21 6 262 5660 +6d27 2 264 5660 +6d29 b 265 5660 +6d34 10 271 5660 +6d44 12 277 5660 +6d56 7 235 5660 +6d5d a 283 5660 +6d67 9 286 5660 +6d70 1a 290 5660 +FUNC 6d8c a8 0 fcloseall +6d8c f 43 5472 +6d9b 2 44 5472 +6d9d 9 47 5472 +6da6 f 49 5472 +6db5 13 50 5472 +6dc8 10 55 5472 +6dd8 6 56 5472 +6dde 5 61 5472 +6de3 15 62 5472 +6df8 10 63 5472 +6e08 c 64 5472 +6e14 4 49 5472 +6e18 a 70 5472 +6e22 2 73 5472 +6e24 10 74 5472 +FUNC 6e34 49 0 _raise_securityfailure +6e34 9 64 2878 +6e3d 6 66 2878 +6e43 10 67 2878 +6e53 8 70 2878 +6e5b 9 79 2878 +6e64 a 81 2878 +6e6e 5 85 2878 +6e73 5 86 2878 +6e78 5 85 2878 +FUNC 6e80 d1 0 _report_gsfailure +6e80 9 129 2878 +6e89 e 149 2878 +6e97 7 151 2878 +6e9e c 210 2878 +6eaa c 212 2878 +6eb6 10 213 2878 +6ec6 e 214 2878 +6ed4 c 215 2878 +6ee0 a 218 2878 +6eea a 219 2878 +6ef4 a 220 2878 +6efe 18 221 2878 +6f16 15 228 2878 +6f2b 15 229 2878 +6f40 c 236 2878 +6f4c 5 241 2878 +FUNC 6f54 1a4 0 _isa_available_init +6f54 14 63 5837 +6f68 1f 75 5837 +6f87 23 81 5837 +6faa 3a 88 5837 +6fe4 40 100 5837 +7024 1b 102 5837 +703f 15 106 5837 +7054 b 109 5837 +705f 9 113 5837 +7068 11 114 5837 +7079 6 118 5837 +707f b 120 5837 +708a 7 127 5837 +7091 a 129 5837 +709b a 130 5837 +70a5 e 134 5837 +70b3 a 135 5837 +70bd a 136 5837 +70c7 6 139 5837 +70cd a 140 5837 +70d7 a 141 5837 +70e1 17 147 5837 +FUNC 70f8 47 0 locterm +70f8 6 186 4530 +70fe 10 187 4530 +710e b 188 4530 +7119 16 191 4530 +712f a 195 4530 +7139 6 198 4530 +FUNC 7150 4e 0 _chkstk +7150 0 67 9872 +7150 4 71 9872 +7154 4 83 9872 +7158 5 84 9872 +715d 3 86 9872 +7160 5 87 9872 +7165 3 88 9872 +7168 4 89 9872 +716c 9 97 9872 +7175 3 98 9872 +7178 2 99 9872 +717a 6 107 9872 +7180 7 108 9872 +7187 4 109 9872 +718b 3 110 9872 +718e 2 111 9872 +7190 4 112 9872 +7194 5 113 9872 +7199 4 114 9872 +719d 1 115 9872 +FUNC 71a0 d7 0 commit +71a0 14 39 1490 +71b4 15 43 1490 +71c9 10 44 1490 +71d9 26 45 1490 +71ff 8 47 1490 +7207 b 49 1490 +7212 14 51 1490 +7226 8 52 1490 +722e 2 54 1490 +7230 2 55 1490 +7232 4 59 1490 +7236 7 62 1490 +723d b 66 1490 +7248 3 67 1490 +724b 7 73 1490 +7252 4 75 1490 +7256 13 44 1490 +7269 e 76 1490 +FUNC 7278 e1 0 write +7278 1e 61 1964 +7296 1d 65 1964 +72b3 c 66 1964 +72bf 27 67 1964 +72e6 8 69 1964 +72ee c 72 1964 +72fa f 73 1964 +7309 2 74 1964 +730b b 75 1964 +7316 8 76 1964 +731e 3 77 1964 +7321 7 82 1964 +7328 4 85 1964 +732c 1b 66 1964 +7347 12 86 1964 +FUNC 735c 7f1 0 write_nolock +735c 36 94 1964 +7392 11 95 1964 +73a3 3 96 1964 +73a6 3 98 1964 +73a9 5 105 1964 +73ae 7 106 1964 +73b5 25 108 1964 +73da 3a 110 1964 +7414 14 116 1964 +7428 8 119 1964 +7430 d 122 1964 +743d 2b 137 1964 +7468 5 140 1964 +746d 36 142 1964 +74a3 19 146 1964 +74bc 6 147 1964 +74c2 1e 154 1964 +74e0 3 155 1964 +74e3 9 157 1964 +74ec 2 158 1964 +74ee 29 170 1964 +7517 5 176 1964 +751c 8 177 1964 +7524 5 179 1964 +7529 b 181 1964 +7534 2 184 1964 +7536 c 185 1964 +7542 13 186 1964 +7555 1c 188 1964 +7571 3 194 1964 +7574 2 206 1964 +7576 1c 208 1964 +7592 43 233 1964 +75d5 3b 240 1964 +7610 b 248 1964 +761b b 249 1964 +7626 a 257 1964 +7630 40 264 1964 +7670 b 265 1964 +767b 4 267 1964 +767f 9 273 1964 +7688 10 293 1964 +7698 3 219 1964 +769b 12 220 1964 +76ad d 221 1964 +76ba f 277 1964 +76c9 3 279 1964 +76cc 5 286 1964 +76d1 5 289 1964 +76d6 16 290 1964 +76ec 2 292 1964 +76ee 9 293 1964 +76f7 11 154 1964 +7708 12 197 1964 +771a 2 203 1964 +771c 17 204 1964 +7733 8 270 1964 +773b 2 271 1964 +773d 16 252 1964 +7753 8 480 1964 +775b a 484 1964 +7765 9 486 1964 +776e b 489 1964 +7779 7 490 1964 +7780 13 492 1964 +7793 17 305 1964 +77aa 2 308 1964 +77ac 9 310 1964 +77b5 3 314 1964 +77b8 17 315 1964 +77cf a 316 1964 +77d9 b 320 1964 +77e4 7 321 1964 +77eb 4 322 1964 +77ef b 324 1964 +77fa 11 326 1964 +780b 46 334 1964 +7851 4 336 1964 +7855 18 337 1964 +786d 1b 315 1964 +7888 5 456 1964 +788d 4 345 1964 +7891 9 348 1964 +789a 17 351 1964 +78b1 a 352 1964 +78bb b 356 1964 +78c6 9 357 1964 +78cf 6 358 1964 +78d5 f 360 1964 +78e4 14 362 1964 +78f8 46 370 1964 +793e 4 372 1964 +7942 18 373 1964 +795a 1b 351 1964 +7975 5 456 1964 +797a 13 396 1964 +798d 7 398 1964 +7994 b 402 1964 +799f 9 403 1964 +79a8 6 404 1964 +79ae c 406 1964 +79ba 14 408 1964 +79ce 44 419 1964 +7a12 8 421 1964 +7a1a 42 443 1964 +7a5c 4 444 1964 +7a60 7 449 1964 +7a67 8 446 1964 +7a6f 9 456 1964 +7a78 15 460 1964 +7a8d 5 456 1964 +7a92 1f 471 1964 +7ab1 4 474 1964 +7ab5 7 476 1964 +7abc 1e 477 1964 +7ada 7 493 1964 +7ae1 a 494 1964 +7aeb 1d 496 1964 +7b08 b 499 1964 +7b13 7 500 1964 +7b1a 5 501 1964 +7b1f 4 506 1964 +7b23 2a 507 1964 +FUNC 7b50 7a 0 fclose_nolock +7b50 a 85 5556 +7b5a 6 87 5556 +7b60 19 89 5556 +7b79 6 94 5556 +7b7f 5 103 5556 +7b84 a 104 5556 +7b8e 13 106 5556 +7ba1 5 107 5556 +7ba6 9 109 5556 +7baf 5 118 5556 +7bb4 5 119 5556 +7bb9 4 124 5556 +7bbd 2 125 5556 +7bbf b 126 5556 +FUNC 7bcc 66 0 fclose +7bcc 12 43 5556 +7bde 3 44 5556 +7be1 20 46 5556 +7c01 6 49 5556 +7c07 4 50 5556 +7c0b 2 53 5556 +7c0d 6 54 5556 +7c13 a 56 5556 +7c1d 8 59 5556 +7c25 2 63 5556 +7c27 b 64 5556 +FUNC 7c34 db 0 isctype_l +7c34 16 114 7216 +7c4a c 118 7216 +7c56 a 121 7216 +7c60 11 122 7216 +7c71 1b 124 7216 +7c8c 4 126 7216 +7c90 4 127 7216 +7c94 4 128 7216 +7c98 4 129 7216 +7c9c 2 130 7216 +7c9e 4 131 7216 +7ca2 4 132 7216 +7ca6 3 133 7216 +7ca9 29 143 7216 +7cd2 14 145 7216 +7ce6 18 148 7216 +7cfe 11 149 7216 +FUNC 7d10 cf 0 _crt_atoflt_l +7d10 20 125 7081 +7d30 10 132 7081 +7d40 30 139 7081 +7d70 5 140 7081 +7d75 8 141 7081 +7d7d f 143 7081 +7d8c 9 144 7081 +7d95 5 145 7081 +7d9a 7 147 7081 +7da1 5 150 7081 +7da6 7 151 7081 +7dad 5 152 7081 +7db2 15 155 7081 +7dc7 18 156 7081 +FUNC 7de0 c7 0 atodbl_l +7de0 22 40 7081 +7e02 d 47 7081 +7e0f 2e 55 7081 +7e3d 11 56 7081 +7e4e 9 57 7081 +7e57 5 58 7081 +7e5c 7 60 7081 +7e63 5 63 7081 +7e68 7 64 7081 +7e6f 5 65 7081 +7e74 15 68 7081 +7e89 1e 69 7081 +FUNC 7ea8 8 0 atoflt_l +7ea8 0 163 7081 +7ea8 8 167 7081 +FUNC 7eb0 5 0 fpmath +7eb0 0 56 10323 +7eb0 5 64 10323 +FUNC 7eb8 86 0 cfltcvt_init +7eb8 0 82 10323 +7eb8 15 84 10323 +7ecd 15 85 10323 +7ee2 7 86 10323 +7ee9 1c 89 10323 +7f05 e 91 10323 +7f13 e 92 10323 +7f21 e 93 10323 +7f2f e 94 10323 +7f3d 1 95 10323 +FUNC 7f50 c7 0 memcmp +7f50 0 56 6804 +7f50 3 60 6804 +7f53 4 61 6804 +7f57 2 62 6804 +7f59 3 63 6804 +7f5c 4 64 6804 +7f60 2 72 6804 +7f62 3 73 6804 +7f65 2 74 6804 +7f67 3 75 6804 +7f6a 3 76 6804 +7f6d 3 77 6804 +7f70 2 78 6804 +7f72 3 84 6804 +7f75 4 85 6804 +7f79 2 86 6804 +7f7b 3 92 6804 +7f7e 2 93 6804 +7f80 2 94 6804 +7f82 3 95 6804 +7f85 2 96 6804 +7f87 3 97 6804 +7f8a 3 98 6804 +7f8d 2 99 6804 +7f8f 3 106 6804 +7f92 1 107 6804 +7f93 2 114 6804 +7f95 3 115 6804 +7f98 2 116 6804 +7f9a 4 124 6804 +7f9e 2 125 6804 +7fa0 3 126 6804 +7fa3 4 127 6804 +7fa7 2 128 6804 +7fa9 4 129 6804 +7fad 5 130 6804 +7fb2 2 131 6804 +7fb4 4 132 6804 +7fb8 5 133 6804 +7fbd 2 134 6804 +7fbf 4 135 6804 +7fc3 5 136 6804 +7fc8 2 137 6804 +7fca 4 138 6804 +7fce 3 139 6804 +7fd1 2 140 6804 +7fd3 4 141 6804 +7fd7 3 147 6804 +7fda 4 148 6804 +7fde 2 149 6804 +7fe0 3 150 6804 +7fe3 4 151 6804 +7fe7 2 152 6804 +7fe9 4 153 6804 +7fed 3 154 6804 +7ff0 2 155 6804 +7ff2 4 156 6804 +7ff6 2 157 6804 +7ff8 4 164 6804 +7ffc 4 167 6804 +8000 4 170 6804 +8004 4 173 6804 +8008 3 174 6804 +800b 3 175 6804 +800e 3 176 6804 +8011 2 177 6804 +8013 3 178 6804 +8016 1 179 6804 +FUNC 8018 98 0 _lock_fhandle +8018 15 436 1865 +802d 1c 437 1865 +8049 7 443 1865 +8050 b 445 1865 +805b 7 447 1865 +8062 14 448 1865 +8076 4 449 1865 +807a a 452 1865 +8084 11 458 1865 +8095 5 461 1865 +809a 16 462 1865 +FUNC 80b0 aa 0 free_osfhnd +80b0 10 257 1865 +80c0 36 260 1865 +80f6 9 263 1865 +80ff c 264 1865 +810b 5 272 1865 +8110 2 273 1865 +8112 5 269 1865 +8117 2 270 1865 +8119 d 266 1865 +8126 9 277 1865 +812f 4 278 1865 +8133 b 280 1865 +813e 8 281 1865 +8146 3 282 1865 +8149 11 284 1865 +FUNC 815c 74 0 get_osfhandle +815c 4 307 1865 +8160 1a 308 1865 +817a c 309 1865 +8186 23 310 1865 +81a9 6 312 1865 +81af 1c 309 1865 +81cb 5 313 1865 +FUNC 81d0 2a 0 unlock_fhandle +81d0 0 483 1865 +81d0 2a 484 1865 +FUNC 81fc 43 0 isleadbyte_l +81fc 8 55 6940 +8204 a 56 6940 +820e 2b 57 6940 +8239 6 58 6940 +FUNC 8240 45 0 isleadbyte +8240 8 63 6940 +8248 37 64 6940 +827f 6 65 6940 +FUNC 8288 93 0 lseeki64_nolock +8288 18 106 1769 +82a0 d 116 1769 +82ad b 118 1769 +82b8 6 120 1769 +82be 18 126 1769 +82d6 d 128 1769 +82e3 2 129 1769 +82e5 21 132 1769 +8306 5 133 1769 +830b 10 134 1769 +FUNC 831c 151 0 mbtowc_l +831c 19 55 7310 +8335 16 56 7310 +834b 5 61 7310 +8350 5 64 7310 +8355 4 65 7310 +8359 2 59 7310 +835b 1b 116 7310 +8376 d 70 7310 +8383 e 73 7310 +8391 5 75 7310 +8396 10 76 7310 +83a6 d 80 7310 +83b3 49 90 7310 +83fc 12 93 7310 +840e 8 99 7310 +8416 2f 108 7310 +8445 5 110 7310 +844a 9 111 7310 +8453 1a 113 7310 +FUNC 8470 8 0 mbtowc +8470 0 123 7310 +8470 8 124 7310 +FUNC 8478 59 0 putwch_nolock +8478 9 84 2149 +8481 d 87 2149 +848e c 88 2149 +849a 6 90 2149 +84a0 7 91 2149 +84a7 20 99 2149 +84c7 5 104 2149 +84cc 5 105 2149 +FUNC 84d4 c3 0 close +84d4 14 41 1396 +84e8 1d 45 1396 +8505 c 46 1396 +8511 26 47 1396 +8537 8 49 1396 +853f b 52 1396 +854a 9 53 1396 +8553 2 54 1396 +8555 b 55 1396 +8560 3 56 1396 +8563 7 61 1396 +856a 4 64 1396 +856e 1b 46 1396 +8589 e 65 1396 +FUNC 8598 ba 0 close_nolock +8598 d 71 1396 +85a5 5c 92 1396 +8601 a 98 1396 +860b 2 95 1396 +860d 7 100 1396 +8614 21 102 1396 +8635 4 104 1396 +8639 7 106 1396 +8640 5 107 1396 +8645 2 110 1396 +8647 b 111 1396 +FUNC 8654 37 0 freebuf +8654 6 45 5276 +865a f 48 5276 +8669 9 50 5276 +8672 7 52 5276 +8679 9 53 5276 +8682 3 54 5276 +8685 6 56 5276 +FUNC 8690 5b6 0 ld12tod +8690 2d 598 10306 +86bd 33 599 10306 +86f0 4 598 10306 +86f4 528 599 10306 +8c1c 2a 600 10306 +FUNC 8c48 5b6 0 ld12tof +8c48 2d 618 10306 +8c75 33 619 10306 +8ca8 4 618 10306 +8cac 528 619 10306 +91d4 2a 620 10306 +FUNC 9200 861 0 _strgtold12_l +9200 2a 80 10127 +922a 51 126 10127 +927b 22 129 10127 +929d 6 132 10127 +92a3 3e 133 10127 +92e1 6 238 10127 +92e7 e 241 10127 +92f5 2 240 10127 +92f7 3 241 10127 +92fa 6 242 10127 +9300 6 241 10127 +9306 5 244 10127 +930b 6 245 10127 +9311 b 247 10127 +931c 3 248 10127 +931f 11 244 10127 +9330 1a 251 10127 +934a 5 256 10127 +934f 5 257 10127 +9354 3 260 10127 +9357 5 261 10127 +935c 5 267 10127 +9361 6 207 10127 +9367 c 208 10127 +9373 6 209 10127 +9379 b 211 10127 +9384 2 212 10127 +9386 3 213 10127 +9389 a 208 10127 +9393 11 216 10127 +93a4 5 217 10127 +93a9 5 218 10127 +93ae 7 190 10127 +93b5 5 191 10127 +93ba e 192 10127 +93c8 11 193 10127 +93d9 5 194 10127 +93de b 195 10127 +93e9 9 196 10127 +93f2 9 198 10127 +93fb 5 205 10127 +9400 10 162 10127 +9410 4 163 10127 +9414 2 164 10127 +9416 20 165 10127 +9436 5 168 10127 +943b 5 177 10127 +9440 b 135 10127 +944b 15 138 10127 +9460 f 141 10127 +946f 6 155 10127 +9475 8 265 10127 +947d 5 150 10127 +9482 7 151 10127 +9489 5 152 10127 +948e 5 146 10127 +9493 4 147 10127 +9497 5 159 10127 +949c 10 270 10127 +94ac 5 271 10127 +94b1 5 273 10127 +94b6 2a 133 10127 +94e0 5 345 10127 +94e5 4 346 10127 +94e9 e 347 10127 +94f7 9 350 10127 +9500 5 351 10127 +9505 5 353 10127 +950a 5 359 10127 +950f b 302 10127 +951a b 303 10127 +9525 c 304 10127 +9531 5 305 10127 +9536 5 307 10127 +953b 7 313 10127 +9542 5 314 10127 +9547 5 316 10127 +954c 9 317 10127 +9555 5 319 10127 +955a 5 326 10127 +955f b 280 10127 +956a a 284 10127 +9574 2 287 10127 +9576 5 293 10127 +957b a 131 10127 +9585 3 275 10127 +9588 2 277 10127 +958a 6 328 10127 +9590 d 331 10127 +959d 10 332 10127 +95ad 9 333 10127 +95b6 b 331 10127 +95c1 2 333 10127 +95c3 8 334 10127 +95cb 14 340 10127 +95df 5 343 10127 +95e4 9 297 10127 +95ed 7 367 10127 +95f4 9 373 10127 +95fd 6 374 10127 +9603 7 375 10127 +960a 6 380 10127 +9610 9 383 10127 +9619 3 384 10127 +961c 5 386 10127 +9621 3 424 10127 +9624 7 425 10127 +962b 5 429 10127 +9630 3 392 10127 +9633 3 393 10127 +9636 8 390 10127 +963e 10 395 10127 +964e 5 397 10127 +9653 3 398 10127 +9656 3 399 10127 +9659 5 402 10127 +965e 4 403 10127 +9662 5 405 10127 +9667 4 406 10127 +966b d 410 10127 +9678 d 412 10127 +9685 353 415 10127 +99d8 10 420 10127 +99e8 2 422 10127 +99ea 2 443 10127 +99ec 7 444 10127 +99f3 7 445 10127 +99fa 2 438 10127 +99fc 8 439 10127 +9a04 c 440 10127 +9a10 3 431 10127 +9a13 7 432 10127 +9a1a 5 433 10127 +9a1f 4 452 10127 +9a23 9 455 10127 +9a2c e 457 10127 +9a3a 27 458 10127 +FUNC 9a64 24 0 cfltcvt +9a64 4 913 9904 +9a68 1b 914 9904 +9a83 5 915 9904 +FUNC 9a88 7e 0 cfltcvt_l +9a88 13 897 9904 +9a9b 6 902 9904 +9aa1 1a 903 9904 +9abb 23 907 9904 +9ade 5 905 9904 +9ae3 2 906 9904 +9ae5 1c 901 9904 +9b01 5 910 9904 +FUNC 9b08 3b0 0 cftoa_l +9b08 1f 415 9904 +9b27 2a 426 9904 +9b51 9 428 9904 +9b5a 11 432 9904 +9b6b 5 433 9904 +9b70 27 441 9904 +9b97 18 444 9904 +9baf 25 447 9904 +9bd4 3 448 9904 +9bd7 2 447 9904 +9bd9 4 448 9904 +9bdd 8 451 9904 +9be5 b 456 9904 +9bf0 6 458 9904 +9bf6 a 461 9904 +9c00 5 463 9904 +9c05 16 461 9904 +9c1b 5 463 9904 +9c20 c 464 9904 +9c2c c 466 9904 +9c38 9 472 9904 +9c41 14 478 9904 +9c55 6 480 9904 +9c5b b 485 9904 +9c66 3e 489 9904 +9ca4 3 491 9904 +9ca7 16 492 9904 +9cbd 2 503 9904 +9cbf 6 505 9904 +9cc5 6 509 9904 +9ccb 4 510 9904 +9ccf 3 515 9904 +9cd2 2 517 9904 +9cd4 14 519 9904 +9ce8 9 523 9904 +9cf1 a 528 9904 +9cfb 4 530 9904 +9cff f 532 9904 +9d0e 4 533 9904 +9d12 6 534 9904 +9d18 3 536 9904 +9d1b 2 538 9904 +9d1d 4 539 9904 +9d21 b 541 9904 +9d2c 5 545 9904 +9d31 f 547 9904 +9d40 6 548 9904 +9d46 c 551 9904 +9d52 6 557 9904 +9d58 2 558 9904 +9d5a 5 562 9904 +9d5f 6 564 9904 +9d65 5 566 9904 +9d6a 2 568 9904 +9d6c 5 570 9904 +9d71 2 573 9904 +9d73 3 576 9904 +9d76 3 578 9904 +9d79 1c 585 9904 +9d95 7 591 9904 +9d9c b 597 9904 +9da7 13 598 9904 +9dba 2 599 9904 +9dbc 6 601 9904 +9dc2 2 603 9904 +9dc4 6 605 9904 +9dca 3 606 9904 +9dcd 3 609 9904 +9dd0 3 610 9904 +9dd3 9 611 9904 +9ddc 24 612 9904 +9e00 a 613 9904 +9e0a b 615 9904 +9e15 27 616 9904 +9e3c 7 617 9904 +9e43 b 619 9904 +9e4e 24 620 9904 +9e72 7 621 9904 +9e79 5 623 9904 +9e7e 4 626 9904 +9e82 16 628 9904 +9e98 20 629 9904 +FUNC 9eb8 1f9 0 static int _cftoe2_l(char *, unsigned __int64, int, int, struct _strflt *, char, struct localeinfo_struct *) +9eb8 20 242 9904 +9ed8 1a 246 9904 +9ef2 5 249 9904 +9ef7 11 250 9904 +9f08 27 258 9904 +9f2f 12 266 9904 +9f41 9 268 9904 +9f4a 2b 269 9904 +9f75 9 278 9904 +9f7e 7 279 9904 +9f85 4 285 9904 +9f89 5 286 9904 +9f8e 16 287 9904 +9fa4 6 292 9904 +9faa 33 293 9904 +9fdd 9 300 9904 +9fe6 3 301 9904 +9fe9 9 309 9904 +9ff2 9 315 9904 +9ffb 3 316 9904 +9ffe 4 317 9904 +a002 6 321 9904 +a008 15 322 9904 +a01d 6 323 9904 +a023 6 327 9904 +a029 15 328 9904 +a03e 6 329 9904 +a044 4 332 9904 +a048 9 335 9904 +a051 5 338 9904 +a056 f 340 9904 +a065 15 344 9904 +a07a 21 345 9904 +a09b 16 293 9904 +FUNC a0b4 f7 0 cftoe_l +a0b4 1b 354 9904 +a0cf 23 362 9904 +a0f2 18 366 9904 +a10a 5 367 9904 +a10f 48 373 9904 +a157 4 374 9904 +a15b 3 376 9904 +a15e 2 377 9904 +a160 32 380 9904 +a192 19 383 9904 +FUNC a1ac 161 0 static int _cftof2_l(char *, unsigned __int64, int, struct _strflt *, char, struct localeinfo_struct *) +a1ac 19 638 9904 +a1c5 7 640 9904 +a1cc 19 641 9904 +a1e5 5 644 9904 +a1ea 1b 645 9904 +a205 7 654 9904 +a20c 5 656 9904 +a211 6 655 9904 +a217 9 657 9904 +a220 6 658 9904 +a226 6 672 9904 +a22c 6 673 9904 +a232 6 679 9904 +a238 18 680 9904 +a250 6 681 9904 +a256 2 683 9904 +a258 7 684 9904 +a25f 5 688 9904 +a264 1b 689 9904 +a27f 13 690 9904 +a292 7 696 9904 +a299 9 698 9904 +a2a2 b 700 9904 +a2ad 1e 701 9904 +a2cb 10 702 9904 +a2db 15 706 9904 +a2f0 1d 707 9904 +FUNC a310 d1 0 cftof_l +a310 18 736 9904 +a328 23 744 9904 +a34b 15 748 9904 +a360 5 749 9904 +a365 38 755 9904 +a39d 4 756 9904 +a3a1 3 758 9904 +a3a4 2 759 9904 +a3a6 25 762 9904 +a3cb 16 765 9904 +FUNC a3e4 134 0 cftog_l +a3e4 1d 795 9904 +a401 23 810 9904 +a424 18 813 9904 +a43c 5 814 9904 +a441 5 817 9904 +a446 d 818 9904 +a453 23 820 9904 +a476 4 821 9904 +a47a 3 823 9904 +a47d 2 824 9904 +a47f c 826 9904 +a48b 9 835 9904 +a494 4 843 9904 +a498 9 845 9904 +a4a1 3 846 9904 +a4a4 27 849 9904 +a4cb 32 840 9904 +a4fd 1b 851 9904 +FUNC a518 7 0 cropzeros +a518 0 139 9904 +a518 7 140 9904 +FUNC a520 96 0 cropzeros_l +a520 9 144 9904 +a529 a 145 9904 +a533 1b 148 9904 +a54e 9 149 9904 +a557 9 151 9904 +a560 8 152 9904 +a568 3 153 9904 +a56b 6 152 9904 +a571 3 155 9904 +a574 8 158 9904 +a57c 10 160 9904 +a58c 3 161 9904 +a58f e 163 9904 +a59d 19 165 9904 +FUNC a5b8 8 0 fassign +a5b8 0 214 9904 +a5b8 8 215 9904 +FUNC a5c0 40 0 fassign_l +a5c0 c 175 9904 +a5cc 14 203 9904 +a5e0 8 204 9904 +a5e8 2 205 9904 +a5ea a 206 9904 +a5f4 6 207 9904 +a5fa 6 211 9904 +FUNC a600 7 0 forcdecpt +a600 0 73 9904 +a600 7 74 9904 +FUNC a608 7f 0 forcdecpt_l +a608 9 78 9904 +a611 a 79 9904 +a61b d 83 9904 +a628 3 87 9904 +a62b c 88 9904 +a637 d 92 9904 +a644 4 97 9904 +a648 18 102 9904 +a660 2 105 9904 +a662 2 106 9904 +a664 2 107 9904 +a666 9 108 9904 +a66f 18 109 9904 +FUNC a688 12 0 positive +a688 0 169 9904 +a688 11 170 9904 +a699 1 171 9904 +FUNC a69c 20 0 _termconout +a69c 15 83 2057 +a6b1 6 85 2057 +a6b7 5 87 2057 +FUNC a6bc 3b 0 _initconout +a6bc 4 53 2057 +a6c0 32 60 2057 +a6f2 5 61 2057 +FUNC a6f8 222 0 _mtold12 +a6f8 18 34 10294 +a710 4 38 10294 +a714 5 39 10294 +a719 12 40 10294 +a72b 15 41 10294 +a740 9 42 10294 +a749 c 43 10294 +a755 5 42 10294 +a75a d 43 10294 +a767 3 44 10294 +a76a 3 43 10294 +a76d 13 44 10294 +a780 2 45 10294 +a782 3 44 10294 +a785 3 45 10294 +a788 3 41 10294 +a78b 3 45 10294 +a78e 8 41 10294 +a796 b 45 10294 +a7a1 3 41 10294 +a7a4 19 45 10294 +a7bd 4 41 10294 +a7c1 7 45 10294 +a7c8 4 41 10294 +a7cc 1b 45 10294 +a7e7 4 41 10294 +a7eb 7 45 10294 +a7f2 4 41 10294 +a7f6 3 45 10294 +a7f9 15 46 10294 +a80e 3 41 10294 +a811 3 46 10294 +a814 4 41 10294 +a818 3 46 10294 +a81b 2 50 10294 +a81d 4 41 10294 +a821 4 47 10294 +a825 11 50 10294 +a836 3 41 10294 +a839 19 50 10294 +a852 4 41 10294 +a856 7 50 10294 +a85d 17 41 10294 +a874 b 54 10294 +a87f e 56 10294 +a88d 13 57 10294 +a8a0 15 58 10294 +a8b5 16 60 10294 +a8cb 14 61 10294 +a8df 5 62 10294 +a8e4 2 61 10294 +a8e6 3 62 10294 +a8e9 3 61 10294 +a8ec 10 60 10294 +a8fc 1e 65 10294 +FUNC a91c 7a 0 isdigit +a91c 6 139 6847 +a922 c 140 6847 +a92e 10 142 6847 +a93e 52 146 6847 +a990 6 148 6847 +FUNC a998 152 0 tolower_l +a998 15 70 7683 +a9ad 9 74 7683 +a9b6 8 77 7683 +a9be 35 79 7683 +a9f3 10 80 7683 +aa03 18 82 7683 +aa1b 25 86 7683 +aa40 4 88 7683 +aa44 4 89 7683 +aa48 4 90 7683 +aa4c 5 91 7683 +aa51 2 92 7683 +aa53 5 94 7683 +aa58 13 97 7683 +aa6b 4a 110 7683 +aab5 3 116 7683 +aab8 6 117 7683 +aabe 1a 119 7683 +aad8 12 120 7683 +FUNC aaec 1e 0 tolower +aaec 0 143 7683 +aaec 9 145 7683 +aaf5 d 147 7683 +ab02 1 153 7683 +ab03 7 151 7683 +FUNC ab0c 144 0 strrchr +ab0c 4 80 5933 +ab10 6 84 5933 +ab16 4 89 5933 +ab1a e 96 5933 +ab28 19 105 5933 +ab41 2 106 5933 +ab43 8 108 5933 +ab4b 4 109 5933 +ab4f 8 110 5933 +ab57 3 115 5933 +ab5a 8 116 5933 +ab62 d 121 5933 +ab6f 3 125 5933 +ab72 15 138 5933 +ab87 4 139 5933 +ab8b 2a 147 5933 +abb5 a 148 5933 +abbf 2 149 5933 +abc1 3 153 5933 +abc4 1f 164 5933 +abe3 c 166 5933 +abef a 175 5933 +abf9 3 179 5933 +abfc 3 180 5933 +abff 6 181 5933 +ac05 3 211 5933 +ac08 5 216 5933 +ac0d 5 194 5933 +ac12 a 196 5933 +ac1c 6 197 5933 +ac22 9 194 5933 +ac2b 7 201 5933 +ac32 9 205 5933 +ac3b 6 207 5933 +ac41 9 209 5933 +ac4a 4 213 5933 +ac4e 2 214 5933 +FUNC ac50 cb 0 fptostr +ac50 d 50 95 +ac5d 4 52 95 +ac61 20 55 95 +ac81 5 56 95 +ac86 22 61 95 +aca8 c 70 95 +acb4 17 77 95 +accb 3 78 95 +acce 5 76 95 +acd3 3 80 95 +acd6 7 87 95 +acdd 2 88 95 +acdf b 90 95 +acea 2 91 95 +acec 5 94 95 +acf1 4 99 95 +acf5 2 101 95 +acf7 17 105 95 +ad0e 2 108 95 +ad10 b 109 95 +FUNC ad1c cd 0 _dtold +ad1c 5 51 10420 +ad21 8 58 10420 +ad29 1b 60 10420 +ad44 11 61 10420 +ad55 d 63 10420 +ad62 9 81 10420 +ad6b 2 82 10420 +ad6d 6 65 10420 +ad73 2 66 10420 +ad75 8 69 10420 +ad7d 4 70 10420 +ad81 3 71 10420 +ad84 2 73 10420 +ad86 9 76 10420 +ad8f 2 77 10420 +ad91 6 85 10420 +ad97 14 86 10420 +adab 5 89 10420 +adb0 12 92 10420 +adc2 6 93 10420 +adc8 12 94 10420 +adda 4 97 10420 +adde b 99 10420 +FUNC adec b7 0 fltout2 +adec 26 21 10420 +ae12 13 25 10420 +ae25 26 26 10420 +ae4b 6 27 10420 +ae51 4 28 10420 +ae55 19 29 10420 +ae6e 4 30 10420 +ae72 3 32 10420 +ae75 18 33 10420 +ae8d 16 29 10420 +FUNC aea4 ad8 0 $I10_OUTPUT +aea4 2a 60 9988 +aece 8 96 9988 +aed6 6 98 9988 +aedc 1a 99 9988 +aef6 4 100 9988 +aefa 30 102 9988 +af2a 4 103 9988 +af2e 2 104 9988 +af30 3 105 9988 +af33 18 107 9988 +af4b 17 108 9988 +af62 5 109 9988 +af67 a 112 9988 +af71 1a 116 9988 +af8b 22 118 9988 +afad 13 122 9988 +afc0 1d 124 9988 +afdd a 128 9988 +afe7 1c 130 9988 +b003 8 131 9988 +b00b 2 134 9988 +b00d 1d 136 9988 +b02a 4 137 9988 +b02e 3 138 9988 +b031 5 141 9988 +b036 4 228 9988 +b03a e 256 9988 +b048 7 260 9988 +b04f 6 226 9988 +b055 6 260 9988 +b05b 3 228 9988 +b05e a 260 9988 +b068 4 255 9988 +b06c 5 257 9988 +b071 5 260 9988 +b076 e 228 9988 +b084 8 260 9988 +b08c 5 228 9988 +b091 386 260 9988 +b417 16 263 9988 +b42d 4 264 9988 +b431 e 265 9988 +b43f 3 264 9988 +b442 2a6 265 9988 +b6e8 3 268 9988 +b6eb 11 271 9988 +b6fc 5 272 9988 +b701 f 274 9988 +b710 5 275 9988 +b715 9 281 9988 +b71e 1e 282 9988 +b73c 17 293 9988 +b753 5 292 9988 +b758 7 293 9988 +b75f 5 295 9988 +b764 7 296 9988 +b76b 5 297 9988 +b770 10 298 9988 +b780 3 297 9988 +b783 7 298 9988 +b78a 5 297 9988 +b78f 7 298 9988 +b796 14 302 9988 +b7aa 5 303 9988 +b7af 14 304 9988 +b7c3 5 303 9988 +b7c8 6 304 9988 +b7ce e 305 9988 +b7dc 3 306 9988 +b7df 8 305 9988 +b7e7 4 306 9988 +b7eb 3 305 9988 +b7ee 44 306 9988 +b832 3 307 9988 +b835 3 306 9988 +b838 7 307 9988 +b83f 3 311 9988 +b842 11 307 9988 +b853 3 302 9988 +b856 c 307 9988 +b862 3 310 9988 +b865 11 311 9988 +b876 8 302 9988 +b87e 6 314 9988 +b884 3 315 9988 +b887 6 317 9988 +b88d 6 319 9988 +b893 7 320 9988 +b89a 5 319 9988 +b89f 5 322 9988 +b8a4 3 323 9988 +b8a7 4 324 9988 +b8ab 3 326 9988 +b8ae 7 337 9988 +b8b5 d 338 9988 +b8c2 3 340 9988 +b8c5 27 341 9988 +b8ec e 330 9988 +b8fa 5 331 9988 +b8ff 24 333 9988 +b923 5 334 9988 +b928 15 118 9988 +b93d 15 124 9988 +b952 15 130 9988 +b967 15 136 9988 +PUBLIC b97c 0 RtlUnwindEx +PUBLIC b982 0 IsProcessorFeaturePresent +FUNC b990 1e 0 static __tmainCRTStartup$filt$0() +b990 1e 267 9116 +FUNC b9ae 19 0 static `type_info::_Type_info_dtor'::`1'::fin$0() +b9ae 9 72 10741 +b9b7 10 73 10741 +FUNC b9c7 19 0 static _freefls$fin$1() +b9c7 9 413 9313 +b9d0 10 414 9313 +FUNC b9e0 19 0 static _freefls$fin$0() +b9e0 9 429 9313 +b9e9 10 430 9313 +FUNC b9f9 19 0 static _initptd$fin$1() +b9f9 9 226 9313 +ba02 10 228 9313 +FUNC ba12 19 0 static _initptd$fin$0() +ba12 9 247 9313 +ba1b 10 248 9313 +FUNC ba2b 24 0 static doexit$fin$0() +ba2b 9 665 9790 +ba34 9 666 9790 +ba3d 12 667 9790 +FUNC ba4f 1b 0 static _ioinit$fin$0() +ba4f 9 325 1584 +ba58 12 326 1584 +FUNC ba6a 1d 0 static _mtinitlocknum$fin$0() +ba6a 9 292 9509 +ba73 14 293 9509 +FUNC ba87 19 0 static __updatetlocinfo$fin$0() +ba87 9 293 3702 +ba90 10 295 3702 +FUNC baa0 19 0 static __updatetmbcinfo$fin$0() +baa0 9 538 8253 +baa9 10 540 8253 +FUNC bab9 19 0 static _setmbcp$fin$0() +bab9 9 659 8253 +bac2 10 661 8253 +FUNC bae0 20 0 static _IsNonwritableInCurrentImage$filt$0() +bae0 20 181 3978 +FUNC bb00 14 0 static _onexit$fin$0() +bb00 e 89 3795 +bb0e 6 90 3795 +FUNC bb14 1e 0 static raise$fin$0() +bb14 9 574 4150 +bb1d 6 575 4150 +bb23 f 576 4150 +FUNC bb32 28 0 static flsall$fin$0() +bb32 9 276 5660 +bb3b 1f 277 5660 +FUNC bb5a 19 0 static flsall$fin$1() +bb5a 9 282 5660 +bb63 10 283 5660 +FUNC bb73 19 0 static _fcloseall$fin$0() +bb73 9 69 5472 +bb7c 10 70 5472 +FUNC bb8c 19 0 static _locterm$fin$0() +bb8c 9 193 4530 +bb95 10 195 4530 +FUNC bba5 17 0 static _commit$fin$0() +bba5 9 72 1490 +bbae e 73 1490 +FUNC bbbc 17 0 static _write$fin$0() +bbbc 9 81 1964 +bbc5 e 82 1964 +FUNC bbd3 18 0 static fclose$fin$0() +bbd3 9 58 5556 +bbdc f 59 5556 +FUNC bbeb 19 0 static __lock_fhandle$fin$0() +bbeb 9 451 1865 +bbf4 10 452 1865 +FUNC bc04 17 0 static _close$fin$0() +bc04 9 60 1396 +bc0d e 61 1396 +STACK CFI INIT 1010 6a .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1010 .cfa: $rsp 80 + +STACK CFI INIT 10d0 36 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 10d0 .cfa: $rsp 48 + +STACK CFI INIT 1110 26 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1110 .cfa: $rsp 48 + +STACK CFI INIT 1180 39 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1180 .cfa: $rsp 48 + +STACK CFI INIT 11bc 180 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 11bc .cfa: $rsp 64 + +STACK CFI INIT 133c 2c .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 133c .cfa: $rsp 48 + +STACK CFI INIT 1368 12 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1368 .cfa: $rsp 48 + +STACK CFI INIT 137c 3d .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 137c .cfa: $rsp 48 + +STACK CFI INIT 13d0 67 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 13d0 .cfa: $rsp 8 + +STACK CFI INIT 1438 6c .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1438 .cfa: $rsp 64 + +STACK CFI INIT 14a4 38 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 14a4 .cfa: $rsp 48 + +STACK CFI INIT 14dc 17 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 14dc .cfa: $rsp 48 + +STACK CFI INIT 14f4 1cc .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 14f4 .cfa: $rsp 48 + +STACK CFI INIT 16c0 133 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 16c0 .cfa: $rsp 48 + +STACK CFI INIT 17f4 24 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 17f4 .cfa: $rsp 48 + +STACK CFI INIT 1818 82 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1818 .cfa: $rsp 48 + +STACK CFI INIT 189c c2 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 189c .cfa: $rsp 48 + +STACK CFI INIT 1960 7f .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1960 .cfa: $rsp 48 + +STACK CFI INIT 19e0 24 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 19e0 .cfa: $rsp 48 + +STACK CFI INIT 1a04 41 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1a04 .cfa: $rsp 48 + +STACK CFI INIT 1a48 16 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1a48 .cfa: $rsp 48 + +STACK CFI INIT 1a60 26 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1a60 .cfa: $rsp 48 + +STACK CFI INIT 1aa8 96 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1aa8 .cfa: $rsp 48 + +STACK CFI INIT 1b4c 4b .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1b4c .cfa: $rsp 48 + +STACK CFI INIT 1b98 60 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1b98 .cfa: $rsp 48 + +STACK CFI INIT 1bf8 39 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1bf8 .cfa: $rsp 48 + +STACK CFI INIT 1c4c 195 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1c4c .cfa: $rsp 112 + +STACK CFI INIT 1df0 20 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1df0 .cfa: $rsp 48 + +STACK CFI INIT 1e10 32d .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 1e10 .cfa: $rsp 224 + +STACK CFI INIT 2140 f3 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2140 .cfa: $rsp 64 + +STACK CFI INIT 2234 1c7 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2234 .cfa: $rsp 64 + +STACK CFI INIT 23fc 131 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 23fc .cfa: $rsp 64 + +STACK CFI INIT 2530 43 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2530 .cfa: $rsp 48 + +STACK CFI INIT 25a4 26f .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 25a4 .cfa: $rsp 624 + +STACK CFI INIT 281c 40 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 281c .cfa: $rsp 48 + +STACK CFI INIT 285c ac .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 285c .cfa: $rsp 48 + +STACK CFI INIT 2908 38 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2908 .cfa: $rsp 48 + +STACK CFI INIT 2940 38 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2940 .cfa: $rsp 48 + +STACK CFI INIT 2978 f4 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2978 .cfa: $rsp 80 + +STACK CFI INIT 2a6c 1e1 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2a6c .cfa: $rsp 112 + +STACK CFI INIT 2c50 20 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2c50 .cfa: $rsp 48 + +STACK CFI INIT 2c70 4e .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2c70 .cfa: $rsp 48 + +STACK CFI INIT 2cc0 20 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2cc0 .cfa: $rsp 48 + +STACK CFI INIT 2d30 f2 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2d30 .cfa: $rsp 1472 + +STACK CFI INIT 2e2c 65 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2e2c .cfa: $rsp 64 + +STACK CFI INIT 2e94 1e .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2e94 .cfa: $rsp 64 + +STACK CFI INIT 2eb4 3b .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2eb4 .cfa: $rsp 48 + +STACK CFI INIT 2ef0 61 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2ef0 .cfa: $rsp 48 + +STACK CFI INIT 2f70 a8 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 2f70 .cfa: $rsp 8 + +STACK CFI INIT 3018 44 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3018 .cfa: $rsp 48 + +STACK CFI INIT 305c 87 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 305c .cfa: $rsp 48 + +STACK CFI INIT 30e4 bd .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 30e4 .cfa: $rsp 48 + +STACK CFI INIT 31a4 61 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 31a4 .cfa: $rsp 48 + +STACK CFI INIT 3220 b6 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3220 .cfa: $rsp 48 + +STACK CFI INIT 32f0 24 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 32f0 .cfa: $rsp 1248 + +STACK CFI INIT 3320 18 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3320 .cfa: $rsp 8 + +STACK CFI INIT 3340 1 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3340 .cfa: $rsp 8 + +STACK CFI INIT 3350 1 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3350 .cfa: $rsp 8 + +STACK CFI INIT 3354 1f .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3354 .cfa: $rsp 48 + +STACK CFI INIT 3374 1d .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3374 .cfa: $rsp 48 + +STACK CFI INIT 3394 6d .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3394 .cfa: $rsp 80 + +STACK CFI INIT 3404 71 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3404 .cfa: $rsp 96 + +STACK CFI INIT 34e8 2b .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 34e8 .cfa: $rsp 48 + +STACK CFI INIT 3514 4c .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3514 .cfa: $rsp 48 + +STACK CFI INIT 3560 3fa .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3560 .cfa: $rsp 48 + +STACK CFI INIT 396c 1f .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 396c .cfa: $rsp 48 + +STACK CFI INIT 398c 20 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 398c .cfa: $rsp 48 + +STACK CFI INIT 39ac 7f .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 39ac .cfa: $rsp 48 + +STACK CFI INIT 3a2c 7a .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3a2c .cfa: $rsp 48 + +STACK CFI INIT 3aa8 81 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3aa8 .cfa: $rsp 48 + +STACK CFI INIT 3bb8 196 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3bb8 .cfa: $rsp 48 + +STACK CFI INIT 3df4 75 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3df4 .cfa: $rsp 48 + +STACK CFI INIT 3e6c 62 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3e6c .cfa: $rsp 48 + +STACK CFI INIT 3ed0 28 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3ed0 .cfa: $rsp 48 + +STACK CFI INIT 3ef8 a8 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3ef8 .cfa: $rsp 48 + +STACK CFI INIT 3fa0 7d .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 3fa0 .cfa: $rsp 80 + +STACK CFI INIT 4020 8e .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4020 .cfa: $rsp 48 + +STACK CFI INIT 40b0 1e1 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 40b0 .cfa: $rsp 1424 + +STACK CFI INIT 4294 ba .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4294 .cfa: $rsp 48 + +STACK CFI INIT 4350 244 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4350 .cfa: $rsp 64 + +STACK CFI INIT 4594 2ae .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4594 .cfa: $rsp 112 + +STACK CFI INIT 48a0 4d .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 48a0 .cfa: $rsp 48 + +STACK CFI INIT 4920 43 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4920 .cfa: $rsp 48 + +STACK CFI INIT 4964 10a .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4964 .cfa: $rsp 64 + +STACK CFI INIT 4a70 17 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4a70 .cfa: $rsp 48 + +STACK CFI INIT 4a88 39 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4a88 .cfa: $rsp 48 + +STACK CFI INIT 4ac4 33 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4ac4 .cfa: $rsp 48 + +STACK CFI INIT 4b38 233 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4b38 .cfa: $rsp 96 + +STACK CFI INIT 4d74 98 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4d74 .cfa: $rsp 48 + +STACK CFI INIT 4e0c 30 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4e0c .cfa: $rsp 48 + +STACK CFI INIT 4e3c 65 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4e3c .cfa: $rsp 48 + +STACK CFI INIT 4ea4 31 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4ea4 .cfa: $rsp 48 + +STACK CFI INIT 4f48 79 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4f48 .cfa: $rsp 80 + +STACK CFI INIT 4fd8 85 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 4fd8 .cfa: $rsp 48 + +STACK CFI INIT 5060 6b .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 5060 .cfa: $rsp 48 + +STACK CFI INIT 50e8 cc .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 50e8 .cfa: $rsp 48 + +STACK CFI INIT 51b4 273 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 51b4 .cfa: $rsp 144 + +STACK CFI INIT 5428 1d .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 5428 .cfa: $rsp 48 + +STACK CFI INIT 5448 63 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 5448 .cfa: $rsp 48 + +STACK CFI INIT 54c0 1f .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 54c0 .cfa: $rsp 8 + +STACK CFI INIT 5500 22a .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 5500 .cfa: $rsp 8 + +STACK CFI INIT 572c 55 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 572c .cfa: $rsp 48 + +STACK CFI INIT 5784 d3 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 5784 .cfa: $rsp 48 + +STACK CFI INIT 5858 9a .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 5858 .cfa: $rsp 48 + +STACK CFI INIT 58f4 10a .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 58f4 .cfa: $rsp 48 + +STACK CFI INIT 5a00 6c .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 5a00 .cfa: $rsp 48 + +STACK CFI INIT 5a6c 3fa .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 5a6c .cfa: $rsp 48 + +STACK CFI INIT 5e68 2ec .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 5e68 .cfa: $rsp 128 + +STACK CFI INIT 6154 96 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6154 .cfa: $rsp 128 + +STACK CFI INIT 61ec 176 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 61ec .cfa: $rsp 112 + +STACK CFI INIT 6364 7c .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6364 .cfa: $rsp 112 + +STACK CFI INIT 63e0 39 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 63e0 .cfa: $rsp 48 + +STACK CFI INIT 6428 8a .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6428 .cfa: $rsp 48 + +STACK CFI INIT 64b4 32 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 64b4 .cfa: $rsp 48 + +STACK CFI INIT 64e8 8f .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 64e8 .cfa: $rsp 96 + +STACK CFI INIT 65e0 565 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 65e0 .cfa: $rsp 8 + +STACK CFI INIT 6b48 26 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6b48 .cfa: $rsp 48 + +STACK CFI INIT 6b70 5f .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6b70 .cfa: $rsp 48 + +STACK CFI INIT 6bd0 4c .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6bd0 .cfa: $rsp 48 + +STACK CFI INIT 6c1c 79 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6c1c .cfa: $rsp 48 + +STACK CFI INIT 6ca4 e6 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6ca4 .cfa: $rsp 80 + +STACK CFI INIT 6d8c a8 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6d8c .cfa: $rsp 64 + +STACK CFI INIT 6e34 49 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6e34 .cfa: $rsp 48 + +STACK CFI INIT 6e80 d1 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6e80 .cfa: $rsp 64 + +STACK CFI INIT 6f54 1a4 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 6f54 .cfa: $rsp 32 + +STACK CFI INIT 70f8 47 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 70f8 .cfa: $rsp 48 + +STACK CFI INIT 7150 4e .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 7150 .cfa: $rsp 24 + +STACK CFI INIT 71a0 d7 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 71a0 .cfa: $rsp 64 + +STACK CFI INIT 7278 e1 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 7278 .cfa: $rsp 80 + +STACK CFI INIT 735c 7f1 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 735c .cfa: $rsp 7040 + +STACK CFI INIT 7b50 7a .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 7b50 .cfa: $rsp 48 + +STACK CFI INIT 7bcc 66 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 7bcc .cfa: $rsp 48 + +STACK CFI INIT 7c34 db .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 7c34 .cfa: $rsp 128 + +STACK CFI INIT 7d10 cf .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 7d10 .cfa: $rsp 160 + +STACK CFI INIT 7de0 c7 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 7de0 .cfa: $rsp 144 + +STACK CFI INIT 7f50 c7 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 7f50 .cfa: $rsp 8 + +STACK CFI INIT 8018 98 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 8018 .cfa: $rsp 48 + +STACK CFI INIT 80b0 aa .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 80b0 .cfa: $rsp 48 + +STACK CFI INIT 815c 74 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 815c .cfa: $rsp 48 + +STACK CFI INIT 81fc 43 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 81fc .cfa: $rsp 80 + +STACK CFI INIT 8240 45 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 8240 .cfa: $rsp 80 + +STACK CFI INIT 8288 93 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 8288 .cfa: $rsp 48 + +STACK CFI INIT 831c 151 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 831c .cfa: $rsp 96 + +STACK CFI INIT 8478 59 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 8478 .cfa: $rsp 64 + +STACK CFI INIT 84d4 c3 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 84d4 .cfa: $rsp 64 + +STACK CFI INIT 8598 ba .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 8598 .cfa: $rsp 48 + +STACK CFI INIT 8654 37 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 8654 .cfa: $rsp 48 + +STACK CFI INIT 8690 5b6 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 8690 .cfa: $rsp 144 + +STACK CFI INIT 8c48 5b6 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 8c48 .cfa: $rsp 144 + +STACK CFI INIT 9200 861 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 9200 .cfa: $rsp 224 + +STACK CFI INIT 9a64 24 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 9a64 .cfa: $rsp 80 + +STACK CFI INIT 9a88 7e .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 9a88 .cfa: $rsp 64 + +STACK CFI INIT 9b08 3b0 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 9b08 .cfa: $rsp 128 + +STACK CFI INIT 9eb8 1f9 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI 9eb8 .cfa: $rsp 112 + +STACK CFI INIT a0b4 f7 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a0b4 .cfa: $rsp 176 + +STACK CFI INIT a1ac 161 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a1ac .cfa: $rsp 80 + +STACK CFI INIT a310 d1 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a310 .cfa: $rsp 160 + +STACK CFI INIT a3e4 134 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a3e4 .cfa: $rsp 176 + +STACK CFI INIT a520 96 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a520 .cfa: $rsp 80 + +STACK CFI INIT a5c0 40 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a5c0 .cfa: $rsp 64 + +STACK CFI INIT a608 7f .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a608 .cfa: $rsp 80 + +STACK CFI INIT a69c 20 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a69c .cfa: $rsp 48 + +STACK CFI INIT a6bc 3b .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a6bc .cfa: $rsp 80 + +STACK CFI INIT a6f8 222 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a6f8 .cfa: $rsp 48 + +STACK CFI INIT a91c 7a .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a91c .cfa: $rsp 80 + +STACK CFI INIT a998 152 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI a998 .cfa: $rsp 128 + +STACK CFI INIT ab0c 144 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI ab0c .cfa: $rsp 32 + +STACK CFI INIT ac50 cb .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI ac50 .cfa: $rsp 48 + +STACK CFI INIT ad1c cd .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI ad1c .cfa: $rsp 8 + +STACK CFI INIT adec b7 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI adec .cfa: $rsp 176 + +STACK CFI INIT aea4 ad8 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI aea4 .cfa: $rsp 256 + +STACK CFI INIT b990 1e .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI b990 .cfa: $rsp 48 + +STACK CFI INIT b9ae 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI b9ae .cfa: $rsp 48 + +STACK CFI INIT b9c7 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI b9c7 .cfa: $rsp 48 + +STACK CFI INIT b9e0 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI b9e0 .cfa: $rsp 48 + +STACK CFI INIT b9f9 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI b9f9 .cfa: $rsp 48 + +STACK CFI INIT ba12 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI ba12 .cfa: $rsp 48 + +STACK CFI INIT ba2b 24 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI ba2b .cfa: $rsp 48 + +STACK CFI INIT ba4f 1b .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI ba4f .cfa: $rsp 48 + +STACK CFI INIT ba6a 1d .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI ba6a .cfa: $rsp 48 + +STACK CFI INIT ba87 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI ba87 .cfa: $rsp 48 + +STACK CFI INIT baa0 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI baa0 .cfa: $rsp 48 + +STACK CFI INIT bab9 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bab9 .cfa: $rsp 48 + +STACK CFI INIT bae0 20 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bae0 .cfa: $rsp 48 + +STACK CFI INIT bb00 14 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bb00 .cfa: $rsp 48 + +STACK CFI INIT bb14 1e .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bb14 .cfa: $rsp 48 + +STACK CFI INIT bb32 28 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bb32 .cfa: $rsp 48 + +STACK CFI INIT bb5a 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bb5a .cfa: $rsp 48 + +STACK CFI INIT bb73 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bb73 .cfa: $rsp 48 + +STACK CFI INIT bb8c 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bb8c .cfa: $rsp 48 + +STACK CFI INIT bba5 17 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bba5 .cfa: $rsp 48 + +STACK CFI INIT bbbc 17 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bbbc .cfa: $rsp 48 + +STACK CFI INIT bbd3 18 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bbd3 .cfa: $rsp 48 + +STACK CFI INIT bbeb 19 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bbeb .cfa: $rsp 48 + +STACK CFI INIT bc04 17 .cfa: $rsp .ra: .cfa 8 - ^ +STACK CFI bc04 .cfa: $rsp 48 + diff --git a/src/tools/windows/dump_syms/testdata/omap_reorder_bbs.pdb b/src/tools/windows/dump_syms/testdata/omap_reorder_bbs.pdb new file mode 100644 index 0000000000000000000000000000000000000000..7b6d2ba8f1d3ebf81516e615d9ce9dfda5ffceca GIT binary patch literal 756736 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

      }*NZyhTX!|$YQ?rZEX!qG)UL*05 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

      oB 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

      -npF0AT6@K=r-8 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%0A#DO*b)97#E9i#8uW>`eK!etj$sz@B^`jL+c^ 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ℜ{J3*xv9 zSORe0F4mr1^nP6)rn7i^c5^_Bw{Le4w14E@o!+;L-m|k|y)g*5(tW!``*k�Bir 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

      bklPe2g^S?~h%6G6 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 bTmasS-tw5X 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

    D+#7TBwc{6+tedcS|VR^L!Wo19b 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/microdump-arm.dmp b/src/processor/testdata/microdump-arm.dmp new file mode 100644 index 0000000..cd409d3 --- /dev/null +++ b/src/processor/testdata/microdump-arm.dmp @@ -0,0 +1,34 @@ +W/google-breakpad( 3745): -----BEGIN BREAKPAD MICRODUMP----- +W/google-breakpad( 3745): O A arm 02 armv7l OS VERSION INFO +W/google-breakpad( 3745): G OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)|Qualcomm|Adreno (TM) 330 +W/google-breakpad( 3745): S 0 FFEA68C0 FFEA6000 00002000 +W/google-breakpad( 3745): S FFEA6000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080020000A000002CA705F728000000000000000A000000000000000000000028000000 +W/google-breakpad( 3745): S FFEA6180 2168EAFFC59104F77C67EAFF7C62EAFF4062EAFF1E71B3AA040000001E71B3AA4062EAFF020000007C62EAFFD062EAFFE867EAFFFAFFFFFF8263EAFFC9A404F700000000000000000000000000000000000000008363EAFF000000005462EAFFFFFFFFFF7C67EAFF1E71B3AA00000000000000003B62EAFF800000000600000000000000000000003C62EAFF06000000000000001B71B3AA000000005C62EAFF0000000000000000000000004462EAFF80000000D4ED06F7000000000000000000000000000000000000000000000000000000000000000000000000E467EAFF00000000000000000000000000000000000000000000000000000000C862EAFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008263EAFF06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): S FFEA6300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003430313631380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): S FFEA6480 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): S FFEA6600 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BAE0417D0000000000000000060000002168EAFFD4ED06F71869EAFFF867EAFF070000001B71B3AAA76805F70000000000000000E467EAFF000000000000000000000000000000000000000000000000FFFFFFFF004000002768EAFF +W/google-breakpad( 3745): S FFEA6780 0000000000000000285F20ABB467EAFF030000002768EAFF200000007702B3AA1869EAFF1F0000000868EAFF6347AEAA1869EAFF200000001869EAFF1F0000002768EAFF0868EAFF1869EAFF4548AEAA00000000800000000868EAFF2168EAFFD4ED06F7B549AEAA00000000000000000000000000000000010000000000000058585858585800002F646174612F6C6F63616C2F746D702F627265616B7061642E3430313631380000FD0000000000000000000031000000F941000002000000D0070000D0070000000000000000000000000000000000000010000000000000001000000000000080B220AB9468EAFFA0B220ABD53AAEAA3069EAFF914BAEAA3069EAFF4882B3AA083020ABF068EAFFA20E0000FFFFFFFF083020ABE99902F7C8DE08F7FF8102F700000000D0DE08F70069EAFFF068EAFFF868EAFFB3B2AEAAD068EAFF0000000000000000D4ED06F70500000000000000000000000000000003000000040000000000000000000000FFFFFFFF00000000FFFFFFFF00000000 +W/google-breakpad( 3745): S FFEA6900 010000000000000000000000000000000000000000000000485F20AB000000000000000000000000475F20AB285F20ABB0B220AB05000000D1D320AB379304F7AAB220AB80B220ABF869EAFF3BBAB3AA040000003BBAB3AAF869EAFF03000000346AEAFF906AEAFF346FEAFFFBFFFFFF605420ABC9A404F74C6AEAFFA86AEAFF4C6FEAFFEDFFFFFF303D20AB046AEAFF6FCAB3AA0C6AEAFFFFFFFFFFF4D306F73BBAB3AA0000000000000000F369EAFF0000000019000000EC69EAFF00000000F469EAFF050000000000000036BAB3AA00000000146AEAFF0C6AEAFFF469EAFF00000000FC69EAFF00000000D4ED06F70000000000000000000000000000000000000000000000000000000000000000000000002C6FEAFF0000000000000000DC3CB4AA000000005C6AEAFF786AEAFF00000000806AEAFF0000000000000000DC3CB4AA906AEAFF00000000986AEAFF0000000000000000000000000000000000000000000000005D6BEAFF30A820ABA06BEAFF0000000028BAB3AA0D000000 +W/google-breakpad( 3745): S FFEA6A80 38BAB3AA01000000605420AB05000000FAB9B3AA0D00000083C9B3AA06000000303D20AB13000000746FEAFF0B00000000A820ABF8A720AB904020AB78A820ABC52DAEAAC72DAEAA0A0000000A0000000000000046696C654944546573742F3100A820ABE06AEAFFFAB9B3AA0D0000004944546573742F3100000000F86AEAFFEC6AEAFF46696C6572000000874220ABCD6EEAFF6163B0AA6F000000864220ABCD6EEAFF6163B0AA65000000BDC620ABCD6EEAFF6163B0AA70000000BCC620ABCD6EEAFF6163B0AA79000000BBC620ABCD6EEAFF6163B0AA54000000BAC620ABCD6EEAFF6163B0AA65000000B9C620ABCD6EEAFF6163B0AA74000000B8C620ABCD6EEAFF6163B0AA61000000B7C620ABCD6EEAFF6163B0AA6C000000B6C620ABCD6EEAFF6163B0AA70000000B5C620ABCD6EEAFF6163B0AA6D000000B4C620ABCD6EEAFF6163B0AA65000000B3C620ABCD6EEAFF6163B0AA54000000B2C620ABCD6EEAFF6163B0AA68000000B1C620ABCD6EEAFF6163B0AA74000000B0C620AB +W/google-breakpad( 3745): S FFEA6C00 CD6EEAFF6163B0AA67000000A7B220ABCD6EEAFF6163B0AA6E000000A6B220ABCD6EEAFF6163B0AA69000000A5B220ABCD6EEAFF6163B0AA72000000A4B220ABCD6EEAFF6163B0AA74000000A3B220ABCD6EEAFF6163B0AA53000000A2B220ABCD6EEAFF6163B0AA44000000A1B220ABCD6EEAFF6163B0AA4D000000A0B220ABCD6EEAFF6163B0AA690000009FB220ABCD6EEAFF6163B0AA690000009EB220ABCD6EEAFF6163B0AA630000009DB220ABCD6EEAFF6163B0AA730000009CB220ABCD6EEAFF6163B0AA74000000435F20ABCD6EEAFF6163B0AA65000000425F20AB00000000C4D720AB310000007762AEAAC4D720AB7E6EEAFFC06EEAFF693BB2AAC4D720AB01CAB3AAC4D720AB01CAB3AAC4D720AB00000000C06EEAFF20000000C06EEAFF08100000088120ABFBACB2AA088120ABC4D720AB01CAB3AAC4D720AB016FEAFF6163B0AA6D0000003B5F20ABCD6EEAFF6163B0AA670000003A5F20ABCD6EEAFF6163B0AA69000000395F20ABCD6EEAFF6163B0AAB8E8B4AACC6DEAFF +W/google-breakpad( 3745): S FFEA6D80 15000000010000007D6EEAFF00D820ABC06EEAFF08100000088120AB01000000D83420ABC7AFB2AA01000000C4D720AB01CAB3AA0810000000000000200000002B0000002D000000B8E8B4AAB8E8B4AA00D820AB1C6EEAFF0000000000000000D06DEAFFD06DEAFF0A0000000A000000000000000000000000000000A35DB3AA01000000000000000A00000031000000000000007D6EEAFF7D6EEAFF005DB3AA286EEAFF5F24B2AAB8E8B4AA20D820AB12000000BCE8B4AAFC6EEAFFBB2CB2AAB8E8B4AA20D820ABB8D720AB02000000B0D720AB000000C0B8D720ABB8D720ABFC6EEAFF29F003F7B8D720ABC0D720ABB8D720ABA86EEAFFFC6EEAFF595D02F7B542AEAAC342AEAAA86EEAFF073BAEAAAC6EEAFFD19DAFAA00D820AB20000000576FEAFFD53AAEAA546FEAFF914BAEAA546FEAFF76C9B3AA546FEAFF146FEAFFBB00000048070000E0D720AB0300000018D820ABF4E3B4AA18D820AB0700000000000000485420ABD0D720AB8399B0AA23C8B3AAD0D720ABD0D720ABBAE0417D +W/google-breakpad( 3745): S FFEA6F00 23C8B3AADC31B4AAD0D720AB783420AB49010000883520ABD0D720AB606FEAFFD83420AB41A7B0AA08000000010000001000000001000000783420AB8399B0AA485420AB783420ABDD1CD2F675A8B0AA08000000010000005AC8B3AAC85420AB08000000010000000800000001000000C85420AB00000000DD1CD2F649010000783420AB883520AB01000000FDA8B0AA715FB0AA0000000000000000C78404F7D160B0AA783420AB883520AB000000000100000000000000F04720ABFDAAB0AAF4E8B4AA01000000DD1CD2F64901000040E4B4AA40E4B4AA2EBCB3AAE7C8B3AA1EC9B3AA33C9B3AA02000000B0B220AB2C70EAFF00000000783420AB02000000192CAEAA0000000000000000000000006C70EAFF619AB0AA2C70EAFF7470EAFF020000003B2CAEAA02000000010000008070EAFF7470EAFF8070EAFF9F5E02F75870EAFF00000000000000000000000000000000842DAEAA00B9B4AA98B8B4AA90B8B4AAF8B8B4AA00000000FF2608F7020000007F7BEAFF0000000000000000 +W/google-breakpad( 3745): S FFEA7080 B97BEAFFDE7BEAFF0A7CEAFF1D7CEAFFD97DEAFF167EEAFF2F7EEAFF447EEAFF6E7EEAFF877EEAFF9E7EEAFFC87EEAFFE37EEAFFFD7EEAFF0A7FEAFF247FEAFF437FEAFFC27FEAFF0000000010000000D6B00700060000000010000011000000640000000300000034D0ACAA040000002000000005000000080000000700000000F007F7080000000000000009000000282DAEAA0B000000000000000C000000000000000D000000000000000E000000000000001700000000000000190000006C71EAFF1A0000001F0000001F000000D57FEAFF0F0000007C71EAFF00000000000000000000000000000000BAE0417DA395F6D9D5EFEE82959378DA76386C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): S FFEA7200 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): S FFEA7380 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): S FFEA7500 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): S FFEA7680 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): S FFEA7800 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): S FFEA7980 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): S FFEA7B00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002F646174612F6C6F63616C2F746D702F627265616B7061645F756E69747465737473002D2D67746573745F66696C7465723D2A4D6963726F2A005F3D2F646174612F6C6F63616C2F746D702F627265616B7061645F756E6974746573747300454D554C415445445F53544F524147455F534F555243453D2F6D6E742F7368656C6C2F656D756C6174656400414E44524F49445F444154413D2F6461746100424F4F54434C415353504154483D2F73797374656D2F6672616D65776F726B2F636F72652D6C69626172742E6A61723A2F73797374656D2F6672616D65776F726B2F636F6E7363727970742E6A61723A2F73797374656D2F6672616D65776F726B2F6F +W/google-breakpad( 3745): S FFEA7C80 6B687474702E6A61723A2F73797374656D2F6672616D65776F726B2F636F72652D6A756E69742E6A61723A2F73797374656D2F6672616D65776F726B2F626F756E6379636173746C652E6A61723A2F73797374656D2F6672616D65776F726B2F6578742E6A61723A2F73797374656D2F6672616D65776F726B2F6672616D65776F726B2E6A61723A2F73797374656D2F6672616D65776F726B2F74656C6570686F6E792D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F766F69702D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F696D732D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F6D6D732D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F616E64726F69642E706F6C6963792E6A61723A2F73797374656D2F6672616D65776F726B2F6170616368652D786D6C2E6A617200504154483D2F7362696E3A2F76656E646F722F62696E3A2F73797374656D2F7362696E3A2F7379 +W/google-breakpad( 3745): S FFEA7E00 7374656D2F62696E3A2F73797374656D2F7862696E004C4F4F505F4D4F554E54504F494E543D2F6D6E742F6F626200414E44524F49445F524F4F543D2F73797374656D00454D554C415445445F53544F524147455F5441524745543D2F73746F726167652F656D756C6174656400414E44524F49445F53544F524147453D2F73746F7261676500414E44524F49445F534F434B45545F616462643D31310045585445524E414C5F53544F524147453D2F73746F726167652F656D756C617465642F6C656761637900414E44524F49445F4153534554533D2F73797374656D2F617070004C445F5052454C4F41443D6C6962736967636861696E2E736F0052414E444F4D3D313131373200415345435F4D4F554E54504F494E543D2F6D6E742F6173656300414E44524F49445F50524F50455254595F574F524B53504143453D392C300053595354454D534552564552434C415353504154483D2F73797374656D2F6672616D65776F726B2F73657276696365732E6A61723A2F73797374656D2F +W/google-breakpad( 3745): S FFEA7F80 6672616D65776F726B2F65746865726E65742D736572766963652E6A61723A2F73797374656D2F6672616D65776F726B2F776966692D736572766963652E6A617200414E44524F49445F424F4F544C4F474F3D31002F646174612F6C6F63616C2F746D702F627265616B7061645F756E69747465737473000000000000000000 +W/google-breakpad( 3745): C 06000040000000000000000000000000000000000069EAFFF068EAFFF868EAFF0469EAFFE068EAFF0069EAFF3069EAFFA20E000000000000C068EAFF07B3AEAA07B3AEAA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3745): M AAACD000 00000000 0007C000 DA7778FB66018A4E9B4110ED06E730D00 breakpad_unittests +W/google-breakpad( 3745): M F6FCA000 00000000 00004000 56B149396A4DAF176E26B4A85DA87BF30 libnetd_client.so +W/google-breakpad( 3745): M F6FEE000 00000000 00004000 DFCD7772F3A5BD1E84A50C4DBFDE6F570 libstdc++.so +W/google-breakpad( 3745): M F6FF2000 00000000 00019000 AE3467401278371A956801500FC8187D0 libm.so +W/google-breakpad( 3745): M F700C000 00000000 00007000 0A492DEF82842051996A468D87F23F010 liblog.so +W/google-breakpad( 3745): M F7014000 00000000 0005A000 167F187B09A27F7444EF989603AAFD3D0 libc.so +W/google-breakpad( 3745): -----END BREAKPAD MICRODUMP----- diff --git a/src/processor/testdata/microdump-arm64.dmp b/src/processor/testdata/microdump-arm64.dmp new file mode 100644 index 0000000..f5cc4a4 --- /dev/null +++ b/src/processor/testdata/microdump-arm64.dmp @@ -0,0 +1,45 @@ +W/google-breakpad( 3728): -----BEGIN BREAKPAD MICRODUMP----- +W/google-breakpad( 3728): O A arm64 02 aarch64 OS 64 VERSION INFO +W/google-breakpad( 3728): S 0 0000007FE2BA6120 0000007FE2BA6000 0000000000003000 +W/google-breakpad( 3728): S 0000007FE2BA6000 0700000000000000A060BAE27F0000007060BAE27F000000E4006A5F550000007060BAE27F000000FC006A5F550000001000000000000000D0006E5F550000002061BAE27F0000004C6E635F550000002061BAE27F0000002061BAE27F000000F060BAE27F000000D0FFFFFF80FFFFFFD060BAE27F00000020142B807F00000010E04E9555000000E065BAE27F000000A061BAE27F00000000406B5F55000000D060BAE27F00000058142B807F00000010E04E955500000000000000000000000104104001041040FFFFFFFFFFFFFFFFF060BAE27F00000048E62A807F000000E8C036807F00000040E62A807F0000002061BAE27F000000E86E635F55000000506ABAE27F000000E065BAE27F000000A061BAE27F000000FEFE2E7273636471507ABAE27F0000003C32665F55000000D02250955500000070E14E955500000070E14E955500000090E34E95550000004A62D1F64901000000F06D5F5500000001000000000000004962D1F6490100000100000000000000C9356B5F55000000 +W/google-breakpad( 3728): S 0000007FE2BA6180 00000000000000009863BAE27F0000000000000005000000000000000000000003000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002F646174612F6C6F63616C2F746D702F627265616B7061642E323839333833000F62BAE27F000000F061BAE27F000000D0F34E9555000000000000000000000000000000000000000000000000000000CAF34E9555000000A0F34E95550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA6300 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA6480 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA6600 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004067BAE27F000000A04E2D807F0000004067BAE27F000000104E2D807F000000186E33807F0000002000000000000000006033807F000000007033807F00000090E64E9555000000000000000000000000000000000000000000000000000000A067BAE27F00000010C22A807F000000020000000000000000F06D5F550000002079BAE27F00000058F66D5F55000000D067BAE27F000000986A2D807F000000 +W/google-breakpad( 3728): S 0000007FE2BA6780 80E64E9555000000006033807F00000090E64E955500000058F66D5F5500000020B5625F550000001CB5625F550000000068BAE27F000000C8C12A807F0000004868BAE27F0000008068BAE27F0000002079BAE27F00000058F66D5F5500000020B5625F550000008068BAE27F0000002079BAE27F00000058F66D5F550000001068BAE27F000000D0B9665F550000008078BAE27F000000987C665F550000002079BAE27F00000070E14E955500000060E04E9555000000000000000000000000000000000000002F000000000000000000000000000000000000000000000000000000000000004968BAE27F0000004868BAE27F0000002F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA6900 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA6A80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA6C00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA6D80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA6F00 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008070BAE27F000000DC4C2E807F0000002300000000000000000C509555000000702333807F0000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA7080 B070BAE27F000000B8672E807F000000C070BAE27F000000DC4C2E807F0000002E00000000000000000C5095550000001071BAE27F000000A4882E807F0000000073BAE27F000000B073BAE27F0000000D000000000000000D00000000000000DB336B5F55000000702333807F0000005071BAE27F000000A4882E807F0000004073BAE27F000000F073BAE27F0000007071BAE27F0000001C8A2E807F000000F472BAE27F000000F073BAE27F0000000073BAE27F000000E1336B5F55000000E1336B5F55000000702333807F0000000000000000000000050000000000000005000000000000004073BAE27F000000F078BAE27F000000F0BB2E807F000000702333807F00000090E34E955500000090384F955500000090E34E95550000004A62D1F64901000000F06D5F5500000001000000000000004962D1F6490100000100000000000000C9356B5F55000000000000000000000050E24E9555000000D3416B5F550000000A426B5F5500000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA7200 00000000000000000000000000000000000000000000000000000000000000002F73BAE27F0000005073BAE27F0000003F73BAE280FFFFFF2873BAE27F0000000000000000000000107ABAE27F0000000000000000000000207ABAE27F0000000000000000000000A772BAE27F0000007F73BAE280FFFFFFCDCCCCCCCCCCCCCC0000000000000000507ABAE27F000000E46E30807F000000607ABAE27F000000E872BAE27F000000E772BAE27F000000000000007F000000030000007F000000000000000000000003000000CCCCCCCC0000000000000000E07ABAE27F00000000000000000000006000655F550000008DEE4E95000000008100BAE27F000000000000000000000000000000000000000000000000000000507ABAE27F000000207ABAE27F000000D0FFFFFF80FFFFFF307ABAE27F000000D0FFFFFF80FFFFFFF073BAE27F0000000000000000000000507ABAE27F000000507ABAE27F000000107ABAE27F000000C8FFFFFF80FFFFFF207ABAE27F000000C8FFFFFF80FFFFFF +W/google-breakpad( 3728): S 0000007FE2BA7380 A073BAE27F00000060DC655F550000004074BAE27F0000000000000000000000E07ABAE27F000000E07ABAE27F000000CE336B5F550000000D00000000000000A0336B5F550000000D00000000000000C6F34E95550000008179BAE27F0000000074BAE27F00000060DC655F55000000DE336B5F550000000100000000000000C0384F95550000000500000000000000A8394F955500000013000000000000004074BAE27F00000060DC655F55000000C3F34E95550000008179BAE27F000000A0336B5F550000000D00000000000000C2F34E95550000008179BAE27F0000008074BAE27F00000060DC655F55000000C1F34E95550000008179BAE27F000000A074BAE27F00000060DC655F55000000C0F34E95550000008179BAE27F000000C074BAE27F00000060DC655F55000000BFF34E95550000008179BAE27F000000E074BAE27F00000060DC655F55000000BEF34E95550000008179BAE27F0000000075BAE27F00000060DC655F55000000BDF34E95550000008179BAE27F000000 +W/google-breakpad( 3728): S 0000007FE2BA7500 2075BAE27F00000060DC655F55000000BCF34E95550000008179BAE27F0000004075BAE27F00000060DC655F550000006B79BAE27F0000008179BAE27F0000006075BAE27F00000060DC655F550000006A79BAE27F0000008179BAE27F0000008075BAE27F00000060DC655F550000006979BAE27F0000008179BAE27F000000A075BAE27F00000060DC655F550000006879BAE27F0000008179BAE27F000000C075BAE27F00000060DC655F550000006779BAE27F0000008179BAE27F000000E075BAE27F00000060DC655F550000006679BAE27F0000008179BAE27F0000000076BAE27F00000060DC655F550000006579BAE27F0000008179BAE27F0000002076BAE27F00000060DC655F550000006479BAE27F0000008179BAE27F0000004076BAE27F00000060DC655F550000006379BAE27F0000008179BAE27F0000006076BAE27F00000060DC655F550000006279BAE27F0000008179BAE27F0000008076BAE27F00000060DC655F550000006179BAE27F0000008179BAE27F000000 +W/google-breakpad( 3728): S 0000007FE2BA7680 A076BAE27F00000060DC655F550000006079BAE27F0000008179BAE27F000000C076BAE27F00000060DC655F550000005F79BAE27F0000008179BAE27F000000E076BAE27F00000060DC655F550000005E79BAE27F0000008179BAE27F0000000077BAE27F00000060DC655F550000005D79BAE27F0000008179BAE27F0000002077BAE27F00000060DC655F55000000E077BAE27F000000AC74685F55000000F077BAE27F000000AC74685F550000004023509555000000A078BAE27F00000010235095550000009878BAE27F0000002078BAE27F000000AC74685F550000008077BAE27F000000C006635F5500000098225095550000003100000000000000B077BAE27F00000088BB695F5500000098225095550000005979BAE27F0000005A79BAE27F0000004488685F550000001078BAE27F00000054BF695F55000000B078BAE27F000000010000000000000050834F95550000008078BAE27F0000005979BAE27F000000982250955500000098225095550000000100000000000000 +W/google-breakpad( 3728): S 0000007FE2BA7800 2D00000000000000C8FF6D5F55000000F078BAE27F00000068C4695F550000005A79BAE27F0000001023509555000000200000000000000098225095550000000100000000000000007ABAE27F000000B078BAE27F000000CCBB2E807F000000B078BAE27F000000FCBB2E807F000000702333807F0000000D00000000000000020000000000000090E34E9555000000F078BAE27F000000CCBB2E807F000000F078BAE27F000000FCBB2E807F000000702333807F000000190000000000000090384F955500000090E34E95550000004A62D1F649010000CE336B5F55000000507ABAE27F000000443272DD1F92C7154079BAE27F000000C0752E807F00000090384F955500000090E34E95550000005079BAE27F000000DC336B5F550000008079BAE27F000000A04E2D807F0000008079BAE27F000000104E2D807F000000186E33807F0000006001000000000000006033807F000000007033807F000000F022509555000000C8FFFFFF80FFFFFFC079BAE27F00000090DD625F55000000 +W/google-breakpad( 3728): S 0000007FE2BA7980 60235095550000000700000000000000D7F66D5F55000000D0F66D5F55000000C079BAE27F00000068DD625F5500000010245095550000000000000000000000F079BAE27F000000C4F2655F55000000007ABAE27F000000F031665F55000000D022509555000000D022509555000000107ABAE27F00000060FE655F55000000107ABAE27F0000001441665F55000000407ABAE27F000000F031665F55000000D02250955500000070E14E9555000000607ABAE27F000000F031665F55000000507ABAE27F0000001832665F55000000807ABAE27F0000008C44665F55000000D02250955500000070E14E955500000020000000000000000100000000000000A07ABAE27F000000B845665F5500000090384F9555000000D022509555000000E07ABAE27F0000007446665F55000000A0394F955500000070E14E955500000090E34E955500000001000000000000004A62D1F6490100005EC60A0000000000207BBAE27F0000004C49665F5500000070E14E95550000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA7B00 90E34E955500000002000000000000000000000000000000D048665F55000000C07BBAE27F000000684B665F55000000000000000000000070E14E9555000000020000000000000060B3625F550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C07BBAE27F000000E0054F9555000000C07BBAE27F000000604B665F55000000F07BBAE27F00000098B3625F550000001C7CBAE27F000000887CBAE27F0000000200000000000000A0F34E9555000000207CBAE27F0000008CC32A807F000000A07CBAE27F0000000000000000000000887CBAE27F0000000010000001000000507CBAE27F00000004B5625F550000000000000000000000000000000000000000000000000000000000000000000000000000000000000050B635807F0000000000000000000000D07D6D5F55000000E07D6D5F55000000A07E6D5F55000000 +W/google-breakpad( 3728): S 0000007FE2BA7C80 02000000000000007F8BBAE27F00000000000000000000000000000000000000B98BBAE27F000000DE8BBAE27F0000000A8CBAE27F0000001D8CBAE27F000000D98DBAE27F000000168EBAE27F0000002F8EBAE27F000000448EBAE27F0000006E8EBAE27F000000878EBAE27F0000009E8EBAE27F000000C88EBAE27F000000E38EBAE27F000000FD8EBAE27F0000000A8FBAE27F000000248FBAE27F000000438FBAE27F000000C28FBAE27F00000000000000000000002100000000000000008035807F0000001000000000000000FB00000000000000060000000000000000100000000000001100000000000000640000000000000003000000000000004080605F550000000400000000000000380000000000000005000000000000000800000000000000070000000000000000A035807F000000080000000000000000000000000000000900000000000000A4B4625F550000000B0000000000000000000000000000000C0000000000000000000000000000000D00000000000000 +W/google-breakpad( 3728): S 0000007FE2BA7E00 00000000000000000E000000000000000000000000000000170000000000000000000000000000001900000000000000687EBAE27F0000001F00000000000000D58FBAE27F0000000F00000000000000787EBAE27F00000000000000000000000000000000000000443272DD1F92C715BDF280FA6D8DE039616172636836340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA7F80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA8100 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA8280 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA8400 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA8580 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA8700 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA8880 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): S 0000007FE2BA8A00 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002F +W/google-breakpad( 3728): S 0000007FE2BA8B80 646174612F6C6F63616C2F746D702F627265616B7061645F756E69747465737473002D2D67746573745F66696C7465723D2A4D6963726F2A005F3D2F646174612F6C6F63616C2F746D702F627265616B7061645F756E6974746573747300454D554C415445445F53544F524147455F534F555243453D2F6D6E742F7368656C6C2F656D756C6174656400414E44524F49445F444154413D2F6461746100424F4F54434C415353504154483D2F73797374656D2F6672616D65776F726B2F636F72652D6C69626172742E6A61723A2F73797374656D2F6672616D65776F726B2F636F6E7363727970742E6A61723A2F73797374656D2F6672616D65776F726B2F6F6B687474702E6A61723A2F73797374656D2F6672616D65776F726B2F636F72652D6A756E69742E6A61723A2F73797374656D2F6672616D65776F726B2F626F756E6379636173746C652E6A61723A2F73797374656D2F6672616D65776F726B2F6578742E6A61723A2F73797374656D2F6672616D65776F726B2F6672616D6577 +W/google-breakpad( 3728): S 0000007FE2BA8D00 6F726B2E6A61723A2F73797374656D2F6672616D65776F726B2F74656C6570686F6E792D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F766F69702D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F696D732D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F6D6D732D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F616E64726F69642E706F6C6963792E6A61723A2F73797374656D2F6672616D65776F726B2F6170616368652D786D6C2E6A617200504154483D2F7362696E3A2F76656E646F722F62696E3A2F73797374656D2F7362696E3A2F73797374656D2F62696E3A2F73797374656D2F7862696E004C4F4F505F4D4F554E54504F494E543D2F6D6E742F6F626200414E44524F49445F524F4F543D2F73797374656D00454D554C415445445F53544F524147455F5441524745543D2F73746F726167652F656D756C6174656400414E44524F49445F53544F524147453D2F73 +W/google-breakpad( 3728): S 0000007FE2BA8E80 746F7261676500414E44524F49445F534F434B45545F616462643D31310045585445524E414C5F53544F524147453D2F73746F726167652F656D756C617465642F6C656761637900414E44524F49445F4153534554533D2F73797374656D2F617070004C445F5052454C4F41443D6C6962736967636861696E2E736F0052414E444F4D3D313638323700415345435F4D4F554E54504F494E543D2F6D6E742F6173656300414E44524F49445F50524F50455254595F574F524B53504143453D392C300053595354454D534552564552434C415353504154483D2F73797374656D2F6672616D65776F726B2F73657276696365732E6A61723A2F73797374656D2F6672616D65776F726B2F65746865726E65742D736572766963652E6A61723A2F73797374656D2F6672616D65776F726B2F776966692D736572766963652E6A617200414E44524F49445F424F4F544C4F474F3D31002F646174612F6C6F63616C2F746D702F627265616B7061645F756E69747465737473000000000000000000 +W/google-breakpad( 3728): C 06000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000506ABAE27F000000E065BAE27F000000E061BAE27F00000000406B5F550000008062BAE27F0000005062BAE27F000000514C6B5F55000000910E0000000000002062BAE27F000000F061BAE27F0000002061BAE27F0000006C6F635F550000002061BAE27F0000006C6F635F550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +W/google-breakpad( 3728): M 000000555F608000 0000000000000000 00000000000C0000 D6D1FEC9A15DE7F38A236898871A2E770 breakpad_unittests +W/google-breakpad( 3728): M 0000007F801F6000 0000000000000000 0000000000013000 7735F44BA6D7C27FD5C3636A43369B7C0 libnetd_client.so +W/google-breakpad( 3728): M 0000007F80229000 0000000000000000 0000000000014000 380C0B7CD8FA3F094BC3BA58A81CBAD00 libstdc++.so +W/google-breakpad( 3728): M 0000007F8023D000 0000000000000000 000000000003D000 F832D47D1E237E46D835991594DA6E890 libm.so +W/google-breakpad( 3728): M 0000007F8027B000 0000000000000000 0000000000019000 C407B93F87A835BE05451FC7B0B3E65E0 liblog.so +W/google-breakpad( 3728): M 0000007F80295000 0000000000000000 000000000009E000 479D5438753E27F019F2C9980DDBF4F30 libc.so +W/google-breakpad( 3728): M 0000007F80341000 0000000000000000 0000000000013000 9DA3FF8EF9CA0FDC481292EE530DF6EC0 libsigchain.so +W/google-breakpad( 3728): M 0000007F80358000 0000000000000000 0000000000002000 672B2CD6CF8AF6C43BD70F2AB02B3D0C0 linux-gate.so +W/google-breakpad( 3728): -----END BREAKPAD MICRODUMP----- diff --git a/src/processor/testdata/microdump-mips32.dmp b/src/processor/testdata/microdump-mips32.dmp new file mode 100644 index 0000000..1b02fa9 --- /dev/null +++ b/src/processor/testdata/microdump-mips32.dmp @@ -0,0 +1,37 @@ +F/google-breakpad(11976): -----BEGIN BREAKPAD MICRODUMP----- +F/google-breakpad(11976): V UNKNOWN:0.0.0.0 +F/google-breakpad(11976): O A mips 02 mips 3.0.8-g893bf16 #7 SMP PREEMPT Fri Jul 10 15:20:59 PDT 2015 +F/google-breakpad(11976): G UNKNOWN +F/google-breakpad(11976): S 0 7F92FC38 7F92F000 00002000 +F/google-breakpad(11976): S 7F92F000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F92F180 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F92F300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C801007701000000880140770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094020077010000008801407700000000880200770100000088014077000000005043BD770000000099999999000000000500000000000000030000000945BA7791F4927F0000000090F8927F90F4927F5043BD7700F8927F000000005432B67790F4927F00000000 +F/google-breakpad(11976): S 7F92F480 18000077000000005043BD77000000003100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF000000005043BD77000000009402B877FFFFFFFF0000400000004000000040000456B2774041C177000000005043BD7700000000FFFFFFFF9402B87700000000000000005043BD77C000407700000077700FB877000040006805B877E02FBA7700000000C8C6BA77000000005043BD77000000009402B877EC0EB877D02F007723000000C0004077FC0300000030B7770487B7775043BD77044BBF779402B8770000000000000000010000005043BD7700000000020000000000000000000077040000005043BD7754D2BC771E000000E00C4077 +F/google-breakpad(11976): S 7F92F600 D02F007701000000C0004077FC0300000030B7770487B777C0004077FC0300000030B7770487B77700000000010000005043BD770030B777000000000000000000000077370000000100000054D2BC770200000060024077C8004077888BB77717000000400A4077C8004077888BB7770100000054D2BC775043BD77A00140771000000000700377007003000030B777C00040772865BD775043BD77FC8CB777C0004077020000000070037780000000C00040772865BD77286AB77760024077C80040774CA4B777286AB777400A4077C80040774CA4B7775043BD7794D2BC770010000060300077C0004077020000005043BD77000000008001407702000000180000000000000028700377DCB0B77700000000000000000000000024AAB7775043BD7780D2BC7750300077180000000004000080D2BC77B8F7927F8C37BD7778D2BC77A0F8927F5043BD773C7EB9775043BD77B8F7927F9837BD779C37BD77B8F7927F8C37BD7778D2BC77A0F8927FE87BBC77307DB9770300000000000000 +F/google-breakpad(11976): S 7F92F780 5043BD77FF00000028700377000400005043BD77B8F7927F8C37BD77E03ABD7798A4BA770000000070A7BA7784A6BA7700000000A8A8BA77E87BBC776090B67702000000A0F8927FE03ABD770445BA77A4F9927FA0F9927F7CD2BC77E87BBC7728A6BF7778F5B5778004000000040000A4F9927FF4E0B5775043BD77F844BA77A0F8927F070000005043BD770400BC77A0F8927F070000005043BD77E03ABD775043BD77D0F4B577E03ABD7788EEB5775043BD77E03ABD7700000000E03ABD775043BD7700000000A002007701000000880140770445BA77A4F9927F64DCB3775043BD770000000002000000A0F8927F5043BD770445BA77A4F9927F02000000A0F8927F5426B2779402B877FFFFFFFFA0F9927FA4F9927F5043BD770456B277736F667469727100313736373431313720302032363138303938203020313436D002007701000000880140773431383020313136383631335043BD772031333136373332504E00775043BD77C000000000000000040000000000000000000000 +F/google-breakpad(11976): S 7F92F900 0000000024AAB777302030203020302030203020302032335043BD7720302030203020382865BD774000000000010000800000000030BD77504E00771800000050000000004E007702000000100000007CD2BC77E87BBC7728A6BF772C60B9772030203020302030020000000030BD7700000000000000005043BD776CD2BC7740000000DCDEB877203020302030203020302030203020305043BD7720302000010000008CD2BC775043BD77010000005043BD77000000005043BD770030BD77008D4077400000000030BD770030BD770030BD77E4F9B777A8C8B877F0C2B1775043BD770030BD775043BD77010000005043BD770000000000000000C000407768D2BC7770D2BC7702000000C4CFB877FCD185095043BD775043BD77FCD185095043BD7758F1B177C0004077144FB177D02F007701000000C0004077FC0300000030B7770487B77707000000AC50B17700000000B452C07700000000010000005043BD77B866B177040000000000000000000077380000000100000054D2BC77 +F/google-breakpad(11976): S 7F92FA80 0100000000024077C8004077888BB7770300000060CDC0775043BD7788C2BE770100000003000000D02F007704000000C0004077FC0300000030B7770487B777C00040772865BD775043BD77FC8CB77700000000010000005043BD77400000005043BD770400000000400000204E00775043BD7700000000000000000400000000000000000000000000000024AAB7770010000030D9BE7704000000040000005043BD7700024077009003772865BD7700000000000000000000000000000000204E00770800000020000000004E00770000000000000000EC17C87700E0C77700E0C7772C60B9774489B7770100000000000000588AB77700000000000000005043BD770800000000000000DCDEB8775043BD7701000000400D4077004000005043BD77009003770000000048B7B7775043BD770450C0775043BD77DCDEB877080000080020C177A80600002090C877040000000100000054FC927F0400000000E0C77784CBC177B00DC177C011BF772090C877000000000800000830800377 +F/google-breakpad(11976): S 7F92FC00 000000003828C17700000000000000002472C376E4FC927F5043BD775014C177E4FC927F004000005014C17700E0C77700E0C7778C2BC177C4FC927FC4FC927FC4FC927FC4FC927F2090C877C4FC927FC4FC927FEC10C17700000000E4FD927F010000006C11C1772090C8772472C3760100000000000000E86A98771012C177B0FC927FA821C77700000000000000000000000001000000FFFFFFFF080000002090C8770090BE7700500200E4FD927F03000000FFFFFFFF00000000000000000000000000000000000000000000000014000000FFFFFFFF000000000000000000000000000000006C0FC177000000000000000003000000FFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFF00000000000000000000000000000000030000000400000034FD927F34FD927F0000000040FD927F40FD927F0000000013AD8CAFECFD927F6465B177010000000000000000000000000000005043BD778B0000000100000060C7C077FFFFFFFFE86A9877 +F/google-breakpad(11976): S 7F92FD80 00E09677500EC1771C40C07700000000F0FB927F0090C0772090C877CCEDBE77480DC877500DC877580DC877600DC877680DC87700E0967701000000DC0DC1770100000000000000E86A987764B1BE7700000000000000000000000000000000010000007E0B937F000000008E0B937FA00B937FB30B937FD60B937FE10B937FFC0B937F070C937F1E0C937F370C937F4B0C937F640C937FE30C937FFD0C937FB90E937FCE0E937FE10E937F0D0F937F370F937F470F937F510F937F8E0F937FAD0F937FC20F937F000000001000000000000000060000000010000011000000640000000300000034E0C0770400000020000000050000000B000000070000000090BE77080000000000000009000000B00DC1770B000000000000000C000000000000000D000000000000000E00000000000000170000000000000019000000D8FE927F1F000000EC0F937F00000000000000000000000013AD8CAF8ABDF68B3A80A7E02317024E000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F92FF00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F930080 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F930200 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F930380 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F930500 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F930680 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F930800 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F930980 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): S 7F930B00 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E2F63726173685F6578616D706C65005F3D2E2F63726173685F6578616D706C6500414E44524F49445F444154413D2F64617461005345434F4E444152595F53544F524147453D2F73746F726167652F7364636172643100484F4D453D2F6461746100414E44524F49445F4153534554533D2F73797374656D2F617070005445524D3D767431303000414E44524F49445F534F434B45545F616462643D313000414E44524F49445F53544F524147453D2F73746F72616765004D4B53483D2F73797374656D2F62696E2F7368004C4F4F505F4D4F554E54504F494E543D2F6D6E742F6F62620053595354454D534552564552434C415353504154483D2F7379737465 +F/google-breakpad(11976): S 7F930C80 6D2F6672616D65776F726B2F73657276696365732E6A61723A2F73797374656D2F6672616D65776F726B2F65746865726E65742D736572766963652E6A61723A2F73797374656D2F6672616D65776F726B2F776966692D736572766963652E6A617200415345435F4D4F554E54504F494E543D2F6D6E742F6173656300424F4F54434C415353504154483D2F73797374656D2F6672616D65776F726B2F636F72652D6C69626172742E6A61723A2F73797374656D2F6672616D65776F726B2F636F6E7363727970742E6A61723A2F73797374656D2F6672616D65776F726B2F6F6B687474702E6A61723A2F73797374656D2F6672616D65776F726B2F636F72652D6A756E69742E6A61723A2F73797374656D2F6672616D65776F726B2F626F756E6379636173746C652E6A61723A2F73797374656D2F6672616D65776F726B2F6578742E6A61723A2F73797374656D2F6672616D65776F726B2F6672616D65776F726B2E6A61723A2F73797374656D2F6672616D65776F726B2F74656C657068 +F/google-breakpad(11976): S 7F930E00 6F6E792D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F766F69702D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F696D732D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F6D6D732D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F616E64726F69642E706F6C6963792E6A61723A2F73797374656D2F6672616D65776F726B2F6170616368652D786D6C2E6A6172005348454C4C3D2F73797374656D2F62696E2F736800414E44524F49445F424F4F544C4F474F3D3100454D554C415445445F53544F524147455F534F555243453D2F6D6E742F7368656C6C2F656D756C6174656400454D554C415445445F53544F524147455F5441524745543D2F73746F726167652F656D756C6174656400484F53544E414D453D6E706D38303100555345523D726F6F7400504154483D2F7362696E3A2F76656E646F722F62696E3A2F73797374656D2F7362696E3A2F73797374656D2F62696E +F/google-breakpad(11976): S 7F930F80 3A2F73797374656D2F7862696E00414E44524F49445F50524F50455254595F574F524B53504143453D382C3000414E44524F49445F524F4F543D2F73797374656D0045585445524E414C5F53544F524147453D2F73746F726167652F656D756C617465642F6C6567616379002E2F63726173685F6578616D706C650000000000 +F/google-breakpad(11976): C 0E0004000000000000000000000000000100000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000006830007700000000683000770000000068300077000000002865BD770000000000000000000000002870037700000000284400000000000000000000000000003044000000000000ECFD927F00000000E4FD927F0000000001000000000000006C11C1770000000001000000000000002472C376000000000100000000000000000000000000000001000000000000005810C17700000000000000000000000000000000000000002090C8770000000038FC927F00000000E86A987700000000EC10C177000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000007C10C1770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +F/google-breakpad(11976): M 77C0E000 00000000 0006D000 8F36148CC4647A8116CAF2A25F591F570 crash_example +F/google-breakpad(11976): M 77A9B000 00000000 00012000 3A1A14AAD5B1EB3BC54F2E1C36CE3ACB0 libnetd_client.so +F/google-breakpad(11976): M 77ACD000 00000000 00012000 E8FC3CD6F45E059AD5849A4BEE176D0F0 libstdc++.so +F/google-breakpad(11976): M 77ADF000 00000000 00024000 07C6570597295683DE36D8FE97E6AEC30 libm.so +F/google-breakpad(11976): M 77B03000 00000000 000CB000 D1E0DFA8390BAADD25564F8B0E139FF90 libc.so +F/google-breakpad(11976): M 77BD7000 00000000 00012000 EC0B4DDBEFC52282C34AF60EEEB8EAAA0 liblog.so +F/google-breakpad(11976): M 77BE9000 00000000 00014000 8C70B1BF8FBAC1170EB21E350AB2E7580 linker +F/google-breakpad(11976): -----END BREAKPAD MICRODUMP----- + diff --git a/src/processor/testdata/microdump-mips64.dmp b/src/processor/testdata/microdump-mips64.dmp new file mode 100644 index 0000000..e8ead87 --- /dev/null +++ b/src/processor/testdata/microdump-mips64.dmp @@ -0,0 +1,26 @@ +02-23 15:49:14.700 1740 1739 F google-breakpad: -----BEGIN BREAKPAD MICRODUMP----- +02-23 15:49:14.700 1740 1739 F google-breakpad: V UNKNOWN:0.0.0.0 +02-23 15:49:14.702 1740 1739 F google-breakpad: O A mips64 01 mips64 3.10.0-gf185e20 #112 PREEMPT Mon Oct 5 11:12:49 PDT 2015 +02-23 15:49:14.702 1740 1739 F google-breakpad: G UNKNOWN +02-23 15:49:14.702 1740 1739 F google-breakpad: S 0 000000FFFFCCF650 000000FFFFCCF000 0000000000001000 +02-23 15:49:14.707 1740 1739 F google-breakpad: S 000000FFFFCCF000 FF0000000000000000301DF1FF00000040701DF1FF0000008C7216F1FF000000704F1DF1FF00000000301DF1FF000000604F1DF1FF000000E0511DF1FF00000040701DF1FF0000001C2E16F1FF00000080501DF1FF000000A04F1DF1FF00000090501DF1FF000000E0511DF1FF000000C08416F1FF0000000000000000000000B0501DF1FF000000C08416F1FF0000000000000000000000C0501DF1FF000000C08416F1FF000000000000000000000008521DF1FF000000C08416F1FF0000000000000000000000F8511DF1FF000000C08416F1FF000000000000000000000000000000000000001000F5F0FF0000001000F5F0FF0000001000F5F0FF0000000800F5F0FF0000000010F5F0FF00000001000000000000000010F5F0FF0000000010F5F0FF0000000800F5F0FF0000000010F5F0FF0000000800F5F0FF0000000010F5F0FF0000000010F5F0FF0000000010F5F0FF0000001010F5F0FF0000001010F5F0FF0000000010F5F0FF0000000800F5F0FF0000000010F5F0FF000000 +02-23 15:49:14.708 1740 1739 F google-breakpad: S 000000FFFFCCF180 0010F5F0FF0000000010F5F0FF0000001010F5F0FF0000001010F5F0FF0000000010F5F0FF0000000800F5F0FF000000306042F1FF00000018F4CCFFFF00000018F4CCFFFF0000001010F5F0FF000000306042F1FF000000000000000000000018F4CCFFFF00000018F4CCFFFF000000000000000000000018F4CCFFFF0000000000000000000000000000000000000020F4CCFFFF00000000000000000000000010F5F0FF00000020F4CCFFFF0000000010F5F0FF00000020F4CCFFFF0000000810F5F0FF00000028F4CCFFFF0000000810F5F0FF00000028F4CCFFFF0000000010F5F0FF0000001010F5F0FF0000001010F5F0FF00000018F4CCFFFF00000030F4CCFFFF00000030F4CCFFFF0000001010F5F0FF00000030F4CCFFFF0000001010F5F0FF00000030F4CCFFFF0000000010F5F0FF0000000010F5F0FF000000306042F1FF00000060DF38F1FF000000A8F4CCFFFF0000000010F5F0FF0000000040000000000000880000000000000078462EF1FF000000D06B28F1FF000000 +02-23 15:49:14.710 1740 1739 F google-breakpad: S 000000FFFFCCF300 01000000000000001010F5F0FF0000000010F5F0FF0000001010F5F0FF0000001010F5F0FF0000000010F5F0FF0000000010F5F0FF000000FFFFFFFFFFFFFF1F0010F5F0FF0000000010F5F0FF0000000010F5F0FF0000001010F5F0FF0000001010F5F0FF000000000000000000000018F4CCFFFF00000000F3CCFFFF00000018F4CCFFFF00000000F3CCFFFF0000000010F5F0FF0000000800F5F0FF000000A8F4CCFFFF0000001010F5F0FF0000000800F5F0FF000000A8F4CCFFFF000000A8F4CCFFFF0000001010F5F0FF0000000800F5F0FF000000A8F4CCFFFF000000A8F4CCFFFF0000001010F5F0FF0000000800F5F0FF000000A8F4CCFFFF000000A8F4CCFFFF00000008000000000000000800F5F0FF00000000000000000000000000000000000000000000000000000000000000000000001010F5F0FF00000078F8CCFFFF00000088F8CCFFFF000000306042F1FF00000024BB38F1FF000000FFFFFFFF0100000000000000000000005CA138F1FF0000000000000000000000 +02-23 15:49:14.711 1740 1739 F google-breakpad: S 000000FFFFCCF480 A8F6CCFFFF00000008F7CCFFFF000000404538F1FF000000344E33F1FF0000004B3838F1FF00000008F7CCFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098F7CCFFFF00000098F7CCFFFF00000098F7CCFFFF00000098F7CCFFFF00000098F7CCFFFF00000098F7CCFFFF00000098F7CCFFFF000000A8F7CCFFFF000000A8F7CCFFFF000000A8F7CCFFFF000000B0F7CCFFFF000000B0F7CCFFFF000000B0F7CCFFFF000000B0F7CCFFFF000000B0F7CCFFFF000000B0F7CCFFFF000000B0F7CCFFFF000000C0F7CCFFFF000000C0F7CCFFFF000000C0F7CCFFFF0000000010F5F0FF0000000010F5F0FF0000000010F5F0FF0000001010F5F0FF0000001010F5F0FF0000001010F5F0FF0000000010F5F0FF0000000010F5F0FF0000001010F5F0FF0000001010F5F0FF000000389732F1FF000000E09432F1FF00000011000000000000001900000000000000389432F1FF0000007C9432F1FF000000 +02-23 15:49:14.713 1740 1739 F google-breakpad: S 000000FFFFCCF600 50C537F1FF000000C8F6CCFFFF0000000000000000000000C8F6CCFFFF000000D100000003000000C8F6CCFFFF000000C8F6CCFFFF000000C8F6CCFFFF000000C8F6CCFFFF000000C8F6CCFFFF000000C8F6CCFFFF0000000000000000000000306042F1FF000000B0A238F1FF00000078F8CCFFFF0000000000000000000000306042F1FF000000B0A338F1FF00000078F8CCFFFF0000000000000001000000000000000000000003000000FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000005CA138F1FF0000000000000000000000000000000000000003000000FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000 +02-23 15:49:14.715 1740 1739 F google-breakpad: S 000000FFFFCCF780 00000000000000000000000000000000030000000400000098F7CCFFFF00000098F7CCFFFF0000000000000000000000B0F7CCFFFF000000B0F7CCFFFF0000000000000000000000EF89807E722BAE6F0820BAECFF00000078F8CCFFFF00000080462EF1FF000000ACBB1FF1FF00000008D537F1FF000000FFFFFFFFFFFFFFFF06261800000000000020B8ECFF000000306042F1FF0000003CA038F1FF000000D8DC41F1FF000000E8DC41F1FF000000F8DC41F1FF00000048C472ECFF000000306042F1FF000000D09F38F1FF0000000626180000000000443333F1FF000000404538F1FF000000000000000000000001000000000000000AFCCCFFFF00000000000000000000001AFCCCFFFF0000002CFCCCFFFF0000003FFCCCFFFF00000053FCCCFFFF0000005EFCCCFFFF00000068FCCCFFFF0000007DFCCCFFFF00000088FCCCFFFF0000009DFCCCFFFF000000B0FCCCFFFF000000C7FCCCFFFF000000E2FCCCFFFF0000008AFECCFFFF000000A4FECCFFFF000000BBFECCFFFF000000 +02-23 15:49:14.716 1740 1739 F google-breakpad: S 000000FFFFCCF900 D3FECCFFFF000000F4FECCFFFF0000000DFFCCFFFF0000004AFFCCFFFF000000C9FFCCFFFF00000000000000000000001000000000000000030000000000000006000000000000000010000000000000110000000000000064000000000000000300000000000000402038F1FF0000000400000000000000380000000000000005000000000000000B000000000000000700000000000000009032F1FF000000080000000000000000000000000000000900000000000000A09F38F1FF0000000B0000000000000000000000000000000C0000000000000000000000000000000D0000000000000000000000000000000E00000000000000000000000000000017000000000000000000000000000000190000000000000040FACCFFFF0000001F00000000000000E8FFCCFFFF00000000000000000000000000000000000000EF89807E722BAE6F9B236B56712BD221000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-23 15:49:14.717 1740 1739 F google-breakpad: S 000000FFFFCCFA80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-23 15:49:14.719 1740 1739 F google-breakpad: S 000000FFFFCCFC00 000000000000000000002E2F63726173685F6578616D706C65005F3D2E2F63726173685F6578616D706C6500414E44524F49445F444154413D2F64617461004D4B53483D2F73797374656D2F62696E2F736800484F4D453D2F6461746100555345523D726F6F7400414E44524F49445F524F4F543D2F73797374656D005445524D3D787465726D005348454C4C3D2F73797374656D2F62696E2F736800414E44524F49445F424F4F544C4F474F3D3100544D504449523D2F646174612F6C6F63616C2F746D7000414E44524F49445F4153534554533D2F73797374656D2F61707000424F4F54434C415353504154483D2F73797374656D2F6672616D65776F726B2F636F72652D6C69626172742E6A61723A2F73797374656D2F6672616D65776F726B2F636F6E7363727970742E6A61723A2F73797374656D2F6672616D65776F726B2F6F6B687474702E6A61723A2F73797374656D2F6672616D65776F726B2F636F72652D6A756E69742E6A61723A2F73797374656D2F6672616D65776F72 +02-23 15:49:14.720 1740 1739 F google-breakpad: S 000000FFFFCCFD80 6B2F626F756E6379636173746C652E6A61723A2F73797374656D2F6672616D65776F726B2F6578742E6A61723A2F73797374656D2F6672616D65776F726B2F6672616D65776F726B2E6A61723A2F73797374656D2F6672616D65776F726B2F74656C6570686F6E792D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F766F69702D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F696D732D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F6170616368652D786D6C2E6A61723A2F73797374656D2F6672616D65776F726B2F6F72672E6170616368652E687474702E6C65676163792E626F6F742E6A617200415345435F4D4F554E54504F494E543D2F6D6E742F6173656300414E44524F49445F534F434B45545F616462643D313000484F53544E414D453D67656E657269635F6D69707336340045585445524E414C5F53544F524147453D2F73746F726167652F73646361726400414E44524F49445F53544F52 +02-23 15:49:14.720 1740 1739 F google-breakpad: S 000000FFFFCCFF00 4147453D2F73746F7261676500504154483D2F7362696E3A2F76656E646F722F62696E3A2F73797374656D2F7362696E3A2F73797374656D2F62696E3A2F73797374656D2F7862696E0053595354454D534552564552434C415353504154483D2F73797374656D2F6672616D65776F726B2F73657276696365732E6A61723A2F73797374656D2F6672616D65776F726B2F65746865726E65742D736572766963652E6A61723A2F73797374656D2F6672616D65776F726B2F776966692D736572766963652E6A617200414E44524F49445F50524F50455254595F574F524B53504143453D392C30002E2F63726173685F6578616D706C65000000000000000000 +02-23 15:49:14.723 1740 1739 F google-breakpad: C 0E000800000000000000000000000000010000000000000000000000000000000100000000000000000000000000000038F241F1FF0000000000FFFFFFFFFFFF0000000000000000FFFF000000000000FCFFFFFFFFFFFFFF00000000000000000100000000000000010000000000000000000000000000000100000000000000010000000000000078F8CCFFFF00000088F8CCFFFF00000001000000000000001CA338F1FF00000000001000000000000820BAECFF00000048C472ECFF0000000000000000000000000000000000000028A238F1FF00000010000000000000000000000000000000306042F1FF00000050F6CCFFFF0000000626180000000000B0A238F1FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004CA238F1FF00000000000000000000000000000000000000FFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFF7F0000000000000000 +02-23 15:49:14.725 1740 1739 F google-breakpad: M 000000FFF1382000 0000000000000000 0000000000081000 6E72E2F1A5F59AB3D51356FDFE394D490 crash_example +02-23 15:49:14.725 1740 1739 F google-breakpad: M 000000FFF0FE2000 0000000000000000 0000000000014000 3C1F908C8C62D8A2EBFC12D8AF285F670 libnetd_client.so +02-23 15:49:14.726 1740 1739 F google-breakpad: M 000000FFF1016000 0000000000000000 000000000005D000 F53A8A43C039FF5DB65F78E97ADAAE000 libm.so +02-23 15:49:14.726 1740 1739 F google-breakpad: M 000000FFF1073000 0000000000000000 0000000000014000 906759235C65BD24385BA1376F1C4A0D0 libstdc++.so +02-23 15:49:14.726 1740 1739 F google-breakpad: M 000000FFF1083000 0000000000000000 0000000000150000 FF1D9D1DA2F0B636817320E78C3E2AF20 libc++.so +02-23 15:49:14.726 1740 1739 F google-breakpad: M 000000FFF11D6000 0000000000000000 0000000000109000 3A55BF92DE1E4C51F6F6140479CFA5080 libc.so +02-23 15:49:14.726 1740 1739 F google-breakpad: M 000000FFF12ED000 0000000000000000 000000000001C000 44F1FB3127301036FA2EFE040F09CF6C0 liblog.so +02-23 15:49:14.726 1740 1739 F google-breakpad: M 000000FFF1329000 0000000000000000 000000000003A000 519DF595D6558C61E962693B460A31C80 linker64 +02-23 15:49:14.726 1740 1739 F google-breakpad: -----END BREAKPAD MICRODUMP----- diff --git a/src/processor/testdata/microdump-multiple.dmp b/src/processor/testdata/microdump-multiple.dmp new file mode 100644 index 0000000..5bdc057 --- /dev/null +++ b/src/processor/testdata/microdump-multiple.dmp @@ -0,0 +1,197 @@ +02-25 07:54:01.688 F/google-breakpad(13589): M F6F86000 00000000 00032000 9475E844ABDBBE3B512F5232E393E5590 libbinder.so +02-25 07:54:01.688 F/google-breakpad(13589): M F6FB8000 00000000 0000A000 51CB626B9BC61903D8FB79C054262BA70 liblog.so +02-25 07:54:01.688 F/google-breakpad(13589): M F6FC2000 00000000 0001B000 9E35C45774B38BC266DAB3081CB02E890 libutils.so +02-25 07:54:01.688 F/google-breakpad(13589): M F6FDD000 00000000 00011000 B4E57058D30C724FB546974E8F0D99690 libcutils.so +02-25 07:54:01.688 F/google-breakpad(13589): M F7019000 00000000 00020000 143F053EC6AACF47A289E950D893D9EE0 linker +02-25 07:54:01.688 F/google-breakpad(13589): -----END BREAKPAD MICRODUMP----- +02-25 07:59:17.030 F/google-breakpad(16162): -----BEGIN BREAKPAD MICRODUMP----- +02-25 07:59:17.030 F/google-breakpad(16162): V WebView:48.0.2564.106 +02-25 07:59:17.030 F/google-breakpad(16162): O A arm 06 armv8l lge/p1_tmo_us/p1:6.0/MRA58K/1603210524c8d:user/release-keys +02-25 07:59:17.030 F/google-breakpad(16162): G OpenGL ES 3.1 V@136.0 (GIT@I86756fd4a8)|Qualcomm|Adreno (TM) 418 +02-25 07:59:17.030 F/google-breakpad(16162): S 0 C3A397E8 C3A39000 00002000 +02-25 07:59:17.034 F/google-breakpad(16162): S C3A39000 60000000C1AF24E50000000000000000CC5E93CD0C000000CC90A3C30000000000000000000000006094A3C3000000000100000000000000208644C501000000AC90A3C3000000005C9CA3C300000000C0CEDDF6B490A3C30000000001000000CC90A3C3000000000086E5C00200000002000000DC90A3C3A490A3C34097A3C34497A3C3A490A3C388BD54E55097A3C30091A3C3010000000000000001000000C0CEDDF6010000000091A3C3000000000091A3C30091A3C300000000010000000100000000000000F490A3C300000000000000000100000001000000000000000000000001000000010000000400000000000000010000005091A3C30000000008C5BBBB00000000000000000000000000000000000000000000000000000000000000002000000020000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-25 07:59:17.034 F/google-breakpad(16162): S C3A39180 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-25 07:59:17.035 F/google-breakpad(16162): S C3A39300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091A3C3700C93CD000000002000000000000000000000000000000000000000000000000F00000000000000 +02-25 07:59:17.035 F/google-breakpad(16162): S C3A39480 000000000000000000809ABB000000000000000080000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000100000020000000010000001C0000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AA92CDA48644C500000000A48644C500000000C3FB25E5340000005CE6DAC0A44310CE55FB25E5FC67A8CD00000000EC014BCEE7F51BE50C531FC2E04310CE00000000D0064BCE01000000004310CE000000000100000001000000DC23000001000000000000000C531FC297FD1BE5000000800000000002000000004310CE208644C588BD54E5030000000C531FC2 +02-25 07:59:17.036 F/google-breakpad(16162): S C3A39600 18531FC20C00000000301FC218531FC20C531FC21C96A3C30000008000301FC20000000000301FC28053D9C000000000400000004897A3C3010000006C9CA3C301000000D30418E5D689F39BD6C00300000000BE0320BE1F180000006F300000000000006C9CA3C3010000000000000001000000000000004097A3C34897A3C301000000971518E54097A3C34497A3C35097A3C3D30418E5D688F39B4097A3C34497A3C30100000000000000010000000100000000301FC28053D9C001000000DC9DA3C301000000000000000000000069B717E56C97A3C3010000000000000000000000BC9CA3C369B717E5000000005097A3C30000000001000000ABAAAAAA00000000000000005C97A3C39A4F1FC20000000020989BD5010000000100000000000000000000004C97A3C30000000088BD54E50100000008280000F18FDBF600000000000000000030000003000000010000000100000000000000000000000000000001000000010000000000000000000000000000000000000000000000 +02-25 07:59:17.036 F/google-breakpad(16162): S C3A39780 00000000000000009897A3C3010000000000000000000000010000000100000001000000010000000100000000000000000000000828000000001AC200000000007F82E408280000008004C22168F2E408280000008004C200001AC2CECD01E50100000001000000000000000000FFFF000000000000000000000000000000000000000000000000007F82E44046F4C3D08004C294160000000000005008000090150000CECD01E501CE01E5048CFDE46ACD01E502000000000000000000000000000000D08104C2408D04C200000000000000000000000000000000B407000050080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-25 07:59:17.037 F/google-breakpad(16162): S C3A39900 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000100000000000000BC9CA3C30000000000301FC26C9CA3C3E51D18E50000000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000100000001000000010000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000001000000010000000100000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000D08904C22C8A04C2888A04C200000000E48A04C20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-25 07:59:17.037 F/google-breakpad(16162): S C3A39A80 408B04C20000000000000000010000000100000001000000FC9BA3C30200000000301FC200000000000000000000000001000000010000000100000001000000304F66D5D0B018F40000000000000000040000003C0000000100000001000000010000003C0000000300000067C1DAF625000000009BA3C3A1C257E534091CC0649BA3C31C000000F052DEF6000000000000000000000000000000000000000000000000DC9504C2389604C2949604C2000000000400000024A3A3C31F7518E50200000024A3A3C3000000000000000000000000004310CEBC9CA3C30000000000301FC2040000000004000000000000000100000080030000E0ABCD000000001401000000000000482C87C500000000400773F30080030000E0ABCD9485DDF61402000000000000482C87C50000000000E7DAC04DEEDAF60000000014010000400100000000000000000000800200000025DDF6130200004001000014020000482C87C580020000402C87C5400773F30025DDF6CD9FDBF61402000000000000 +02-25 07:59:17.037 F/google-breakpad(16162): S C3A39C00 000000000000000000E0ABCD41BB25E5308B0000408B000020000000000100001F000000100000006000000010000000000100000100000001000000010000000000000000000000000000000000000000000000010000000100000000000000000000000100000001000000050000005C9CA3C3000000000086E5C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007C02E4F3FFFFFFFF3813C8F3FFFFFFFF3C12C8F3FFFFFFFF941170F3010000004405D8F400000000000000000000000000000000000000000000000000010000C0B0EBC0C0CEDDF68CA1A3C3000000000037F2E790A1A3C388A1A3C300020000C0B0EBC0C0CEDDF68CA1A3C3000000000037F2E790A1A3C388A1A3C355B24ADD000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-25 07:59:17.038 F/google-breakpad(16162): S C3A39D80 000000000000000000000000000000000000000028D7D056C1000000BD214CDD3E0AACDEFFFFFFFFB421B22D4A00000054010000000000003E0AACDE0000000084000000409EA3C360FE4ACE78FE4ACE0000000000000000000000000000000088A1A3C3DCD7A1B2409EA3C30100000010ED5CCF409EA3C3C017B5D4089FA3000000000010ED5CCFF0E1D2C389ABCDEFFEDCBA9876543210409EA3C3689EA3C36E3066B42DC2BDAB9656B500CF56A0C900000000689EA3C3B0A0A3C3C0CEDDF6F0E1D2C3000000000000000038000000000000007FE94ADDD89FA3C37C9EA3C3B0A0A3C319EA4ADD7D330C8F234046F4EAD5458272B2B035AC7BDDE189C4831AA004025082FB2C80FF5109419643AC1A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C00100000000000000000000800300000000000000000000000700000000000080030000000000004046F4C300000000001C0000 +02-25 07:59:17.038 F/google-breakpad(16162): S C3A39F00 00000000C0CEDDF6349FA3C34046F4C3007F82E4000000000828000000001AC20000000075FCEEE40000000000000000000000000000000000000000000000000400000000000000000000000000000004000000DCD7A1B2000000004046F4C30828000000001AC200001AC20828000000000000BFEDF2E400000000007F82E4082800004046F4C35082CBF34055E6F3006610CED16B1CE500001AC2006610CE4C6610CE00301FC200001AC240870000082800002F6F1BE5082800004C6610CE00301FC200301FC2006610CE0000000000001AC2F39317E50828000008280000B0A0A3C37D381AE500001AC24087000001000000C8A0A3C3406693CD006793CD88A0A3C3797A16E5082800009CA0A3C320A0A3C308280000C06193CDC06193CDB0A0A3C301000000F823F6DEA9E651DD0828000000000000B0A0A3C30000000058A0A3C39CA0A3C3C0CEDDF601000000F42E66D570A0A3C30C53DEF6402C87C59485DDF6482C87C5806691C09FA7DBF62100000014000000806691C0739E4ADD +02-25 07:59:17.039 F/google-breakpad(16162): S C3A3A080 02000000E86373F364A04321DAAA00899A15B6BF55337DFB8AAB0941F101072981F46CF1416F8EB9B27C5A0C04375D8689C4831AA004025082FB2C80FF5109419643AC1ADCD7A1B2198D4ADD209319C2C0DAF3DED9E551DD20114BCE18A1A3C3F42E66D500000000E813F6DE195952DD889319C2A09319C200000000F42E66D5C91653DDC0CEDDF6A4E5C55294000000A09319C2889319C2A4E5C55294000000482C87C5006D93CD00E0ABCD010000000C53DEF6402C87C59485DDF6C000000054DABDDEC10500002D040000009EE5C0C10500009803000000A4E5C0DCD7A1B20000000000000000002C66D5209319C2D0A1A3C300000000010000000500000012000000175650DD3F000000002C66D5410000003FF14FDD0C53DEF6402C87C59485DDF6482C87C500DC64D19FA7DBF6C1000000BD000000006D93CDDCD7A1B2006793CD00000000304F66D503000000A1E5C5529400000000AC58C508E246D2006610CE00000000002C66D51BF34BDD0100000000AC58C500301FC202000000 +02-25 07:59:17.039 F/google-breakpad(16162): S C3A3A200 1001000088010000A003B8C003000000002C66D50500000012000000815750DD795750DD11F650DD0CA3A3C31080E7DE1080E7DEC0CEDDF60000000002090CC086E4C5529400000000000000C0CEDDF6D0104BCEC1F255DD606691C0E97C87DD377C87DDC0CEDDF60000000004000000FCA2A3C30900000001000000A0A2A3C3010000007BC557E5317787DD00000000317787DD00000000317787DD0000000009000000FCA2A3C304000000377C87DD9485DDF6406691C00312F6DEC897F6DE00000000A0FF4ACEA40000000D7D87DD00000040DCD7A1B214A3A3C3106373F3F10051DD000000000000B8C0C0CEDDF668A3A3C3F70000000A0000002FFB4DDD0CA3A3C386E4C55294000000000000000000000080C190D30000000086E4C55294000000755D51DD010000000C70F6D2C0CEDDF653B84EDD10A4A3C3D386B0DDE0004BCE0000000054A3A3C300000000DCA3A3C3406691C0D8A3A3C3DF4C87DDDCA3A3C380A6F7CE86E4C5529400000056000000B8A5A3C3A4000000A4000000 +02-25 07:59:17.040 F/google-breakpad(16162): S C3A3A380 406691C07182B0DD00000000A4000000090000000000000002000000A400000009000000000000000200000059000000090000003F194CDD1712F6DEDCD7A1B2002C66D580A6F7CE2C23F7DE1712F6DE7CA4A3C30000000058A5A3C3F70000000A00000071913DDDA573B0DD000000005D913DDD0578B0DD20A4A3C3B8E4ABCDC0CEDDF6239DB0DDF653E3A50000000000000000B3351B70090000003F194CDD00000000090000000000000064DFA7DE200000009ECF2560C1000000BD214CDD6C63AFDEFFFFFFFFB0AB05534200000030010000000000006C63AFDE00000000D007000074A4A3C3A4000000090000000000000002000000580000009CA4A3C350A5A3C3084617F468A5A3C350A5A3C301000000084617F480A6F7CE0100000068A5A3C301000000010000000C70F6D2C0CEDDF64B95B0DD0795B0DD020000009C7214F4DCD7A1B200000000F081CBF3F081CBF3943217F4000000000000000060FE4ACE492C4CDD00000000B8A5A3C3D0A5A3C3D4A5A3C300000000B8A5A3C3 +02-25 07:59:17.040 F/google-breakpad(16162): S C3A3A500 9CA5A3C3D0A5A3C30C70F6D201000000A4A5A3C30800000001000000D199B0DD419CB0DD0000000060332BC500E0ABCD08000000482C87C59485DDF600000000809BBDDE1379DBF60400000060332BC5F70000000A00000000000000000000000000000009000000486CCBF3000000000000000060FE4ACE00000000F0A6A3C3C04517F4419CB0DD00000000C7C852DD804FA8CD603217F440DA64D1A05C45D20000000019C752DDAC5C45D2D04517F4D0A5A3C3C4A5A3C3A4000000A4000000AC5C45D2000000000000000000000000F081CBF3000000000000000001000000C1000000DCD7A1B260332BC540DA64D1F84517F480A6F7CE084617F460332BC5010000000C70F6D2809BBDDE975FB0DDE86254D9D4F95CCF000000000100000060FE4ACE492C4CDD40A6A3C3E86254D910A8A3C350A6A3C3F0A6A3C3E86254D900000000000000000C70F6D2E12C4CDD00000000DCD7A1B24411F6DE10A8A3C3F0A6A3C3E8A6A3C3EB11F6DEA870F6D200000000E33F49DD00E0ABCDC0CEDDF6 +02-25 07:59:17.041 F/google-breakpad(16162): S C3A3A680 C0CEDDF684CEDDF610A7A3C300000000C0CEDDF6C0CEDDF6C0CEDDF684CEDDF60000000054A7A3C3C0CEDDF6DDBBD7F676D7C552940000000000000000000000C0C2B852940000000000000000000000000000009400000000000000000000006541B0DDC0CEDDF60000000084CEDDF6000000000000000060FE4ACE000000009CA8A3C300000000000000002322DAF6C0C2B85294000000000000000070F6D2E411F6DE10A8A3C30000000000000000C1C0C0C00C70F6D218A8A3C3EB434ADD00000000F18FDBF640070000E852DEF61000000007000100010087C5C0302BC576D7C5520100000080A9A3C334A8A3C3020000000000000080000000C0A7A3C366A64519B923DAF634A8A3C38000010000000000D917DAF6C0A7A3C334A8A3C382B8090034A8A3C338A8A3C30000000038A8A3C3000000008C6E58F0A718DAF60E00000021580C2B80A9A3C310A8A3C30070F6D20070F6D20100000028A8A3C3C1C0C0C00C70F6D218A8A3C3A5484ADD00000000607346CE10A8A3C30070F6D2 +02-25 07:59:17.041 F/google-breakpad(16162): S C3A3A800 20A8A3C328A8A3C3C1C0C0C0354C4ADDA8AA5CE3000000000000000000000000606691C055048ADD80B2CDDEB760AFDECA0000006541B0DD2D0000000100A3C3A8A28AE9000000000070F6D276D7C55294000000A8A28AE9B8A28AE900C093C3A9C54BDDBB564ADD76D7C55294000000B8A4E000000000004411F6DEC0A8A3C39CA8A3C3C844F4C30070F6D2804928D3944128D331E64ADDA8A8A3C3000000000000000060FE4ACE0000000000000000C844F4C3C044F4C3C0CEDDF6F53D4ADD0070F6D200000000010000000100010000000000C0A8A3C3C044F4C351EE4BDD2100000016000000E0F5A7CDDCD7A1B27800000030A9A3C3C044F4C3609152D978000000E5C54BDD30A9A3C370A9A3C330A9A3C3A519DAF68519DAF638A9A3C38519DAF6C7C0D7F678A9A3C30000000030F96FC530C984C2113F0000E03C00000000000000C093C330E90F000010000000000000000000000000000000000000A9C54BDD60FEF6C3000000000090AAD40100000000F00F0078A9A3C330A9A3C3 +02-25 07:59:17.042 F/google-breakpad(16162): S C3A3A980 1600000058B38AF600000000DCD7A1B2F4ADA3C30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000402C87C500000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000008E246D2000000000000000001000000A0F1ABCD0000000000000000000000000000000001000000882715F401000000005822C40100000050FF4ACE0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000004E419C20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-25 07:59:17.042 F/google-breakpad(16162): S C3A3AB00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-25 07:59:17.043 F/google-breakpad(16162): S C3A3AC80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000756E646566696E6564207379 +02-25 07:59:17.043 F/google-breakpad(16162): S C3A3AE00 6D626F6C3A20676C5761697453796E630072696249506F696E74657200696E6773006D706C6545585400760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-25 07:59:17.043 F/google-breakpad(16162): S C3A3AF80 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-25 07:59:17.044 F/google-breakpad(16162): C 06000040008004C2949604C2008003C20000FFFF008004C200001AC203000000949604C2949AA3C301000000010000000100000024FB09E5E897A3C31774F2E4F870F2E4300007A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +02-25 07:59:17.044 F/google-breakpad(16162): M AAB37000 00000000 00005000 CDDB210E1401729DD9368E97D91BFA6F0 app_process32 +02-25 07:59:17.044 F/google-breakpad(16162): M D403B000 00000000 0000C000 04BEB4408EDD689C7C9D16B3935B434C0 eglSubDriverAndroid.so +02-25 07:59:17.044 F/google-breakpad(16162): M D6666000 00000000 0130E000 632AB61E504FB945701535B3D9CC8D6F0 libllvm-qcom.so +02-25 07:59:17.044 F/google-breakpad(16162): M D7E76000 00000000 00102000 6A49ABB973AC76966D0BF9EB151B1DAA0 libCB.so +02-25 07:59:17.044 F/google-breakpad(16162): M D7F79000 00000000 000C7000 E965EAB3ED52E0D9033467CF35BA54FA0 libblas.so +02-25 07:59:17.044 F/google-breakpad(16162): M D94D4000 00000000 0002C000 F15305FE3A594A9A8EDD43DC502FABFA0 librs_adreno.so +02-25 07:59:17.044 F/google-breakpad(16162): M DD1C0000 00000000 01C47000 8506F83DD6FA1E55AAEDF5288D23914C0 libwebviewchromium.so +02-25 07:59:17.044 F/google-breakpad(16162): M E388F000 00000000 0003B000 6FA4AB536BB4518557BC07CA8FC573C90 libRSCpuRef.so +02-25 07:59:17.044 F/google-breakpad(16162): M E38CA000 00000000 00033000 F7FA517643A376EFD12A7B3D2EFEE6F90 libRSDriver_adreno.so +02-25 07:59:17.045 F/google-breakpad(16162): M E3C80000 00000000 0000C000 7630048E025652922B3F1588F02A8F2B0 librsjni.so +02-25 07:59:17.045 F/google-breakpad(16162): M E3C96000 00000000 0000D000 561706F94B94192BF9ED468A3E068D7D0 librs_jni.so +02-25 07:59:17.045 F/google-breakpad(16162): M E3CA3000 00000000 00006000 C359CF7872D4C441EF00D6FC60798F460 libwebviewchromium_loader.so +02-25 07:59:17.045 F/google-breakpad(16162): M E3CAB000 00000000 00006000 8F426AC7147B1BCAFB00A84FA30818A60 libwebviewchromium_plat_support.so +02-25 07:59:17.045 F/google-breakpad(16162): M E48C1000 00000000 00005000 45F29673A241F20E48A7F4A69C94558F0 libjnigraphics.so +02-25 07:59:17.045 F/google-breakpad(16162): M E48C5000 00000000 00013000 9C1B0414377D9B563658C37B62D890D00 libandroid.so +02-25 07:59:17.045 F/google-breakpad(16162): M E48D7000 00000000 0000B000 2A0263F47116D42F23AEA8976017142A0 libqservice.so +02-25 07:59:17.045 F/google-breakpad(16162): M E48E2000 00000000 0000D000 9A42EE0ADA890E52077B660CBA9E6F9F0 libqdutils.so +02-25 07:59:17.045 F/google-breakpad(16162): M E48EF000 00000000 00005000 7B806100E8814ADC4926CAED36A155C90 libqdMetaData.so +02-25 07:59:17.045 F/google-breakpad(16162): M E48F4000 00000000 00008000 2265B4F6E87C3AB2B24ADF3AD7916DAC0 libmemalloc.so +02-25 07:59:17.045 F/google-breakpad(16162): M E48FC000 00000000 00009000 66E98553EFB870D30328E6E7236C33D30 gralloc.msm8992.so +02-25 07:59:17.045 F/google-breakpad(16162): M E4907000 00000000 0000A000 AD580971FA6754A290D06A3B18E8E81D0 libcompiler_rt.so +02-25 07:59:17.045 F/google-breakpad(16162): M E4911000 00000000 00026000 7A54ADD97509B2BA34F02CD72D7CE1EB0 libGLESv1_CM_adreno.so +02-25 07:59:17.045 F/google-breakpad(16162): M E4919000 00000000 0078F000 9F67EE99805EFC8AA9D25EC32DE705C80 libllvm-glnext.so +02-25 07:59:17.045 F/google-breakpad(16162): M E50A2000 00000000 004B9000 D7CC9C6F6A2C2F9B53C5DB501AC4E51B0 libGLESv2_adreno.so +02-25 07:59:17.045 F/google-breakpad(16162): M E555D000 00000000 0003D000 C9EA007BBDDEC224D1E0C7AFEE4E45330 libgsl.so +02-25 07:59:17.045 F/google-breakpad(16162): M E559A000 00000000 00008000 CD7367DF671CBD3EDBED183581789FA70 libadreno_utils.so +02-25 07:59:17.045 F/google-breakpad(16162): M E55A4000 00000000 00012000 B4E6C005EC6CC69155CC735B3EFFECDE0 libEGL_adreno.so +02-25 07:59:17.045 F/google-breakpad(16162): M E7ECE000 00000000 0001B000 2B30B67A31DE9BF64555151EA17005B90 libkeymaster1.so +02-25 07:59:17.045 F/google-breakpad(16162): M E7EE9000 00000000 00017000 54102E8ACB90A9125408636632CD808D0 libsoftkeymasterdevice.so +02-25 07:59:17.045 F/google-breakpad(16162): M E7F40000 00000000 0000B000 26B523F5A4D29ADFFC9E5424083E7A430 libkeymaster_messages.so +02-25 07:59:17.045 F/google-breakpad(16162): M E7F4B000 00000000 0000E000 ACC6C5A530F89DFAF9D49763349280FD0 libkeystore_binder.so +02-25 07:59:17.046 F/google-breakpad(16162): M E7F59000 00000000 00006000 3427C2F006C3794AE74735BE6DB0C11D0 libkeystore-engine.so +02-25 07:59:17.046 F/google-breakpad(16162): M E7F5E000 00000000 00019000 315244E498B82AC7DC9417BC69BEE0D10 libjavacrypto.so +02-25 07:59:17.046 F/google-breakpad(16162): M E7F77000 00000000 00006000 C22F0B9417EE729F3F103A2099BABE2A0 libemoji.so +02-25 07:59:17.046 F/google-breakpad(16162): M E7F7D000 00000000 00006000 A1DC8D6A0E0FFBE3CDD733E2C1A656E90 libextmedia_jni.so +02-25 07:59:17.046 F/google-breakpad(16162): M E7F83000 00000000 00010000 9DB457B0E067D0E3319B0AA6F5658BD70 libstagefright_amrnb_common.so +02-25 07:59:17.046 F/google-breakpad(16162): M E7F90000 00000000 0002F000 40852323FEC1ADB356FEB0F3EF22BBC90 libexif.so +02-25 07:59:17.046 F/google-breakpad(16162): M E7FBF000 00000000 0000E000 E63910A6D6C98BCEF90CCDFF910A7BAA0 libjhead.so +02-25 07:59:17.046 F/google-breakpad(16162): M E7FCE000 00000000 00018000 BC53BCECC219F8AA3641A10B8AA0784C0 libmtp.so +02-25 07:59:17.046 F/google-breakpad(16162): M E7FE4000 00000000 0004B000 D9429A5D3289DA7E416BAAC35181F8240 libmedia_jni.so +02-25 07:59:17.046 F/google-breakpad(16162): M E818A000 00000000 00036000 5D7E900D07265C7CAEEAF336A4E5C63C0 liblgDivxDrm.so +02-25 07:59:17.046 F/google-breakpad(16162): M E98C0000 00000000 00007000 DCEA7FBB2F6009454EF32A08356F56BA0 libqmi_encdec.so +02-25 07:59:17.046 F/google-breakpad(16162): M E98C6000 00000000 00011000 D60B8FE7332A5FEC91B053060DE9F6FC0 libsensor1.so +02-25 07:59:17.046 F/google-breakpad(16162): M E98D8000 00000000 0000D000 3659AA2CD6F8DC14B4DD7B781BE06C0C0 libmtpexif.so +02-25 07:59:17.046 F/google-breakpad(16162): M E98F1000 00000000 00007000 093F37D73F3782B9CA6AD929FC59020D0 libsensor_reg.so +02-25 07:59:17.046 F/google-breakpad(16162): M EA169000 00000000 00007000 332FEA72D63439385A9B130899F943D50 libsensor_lge_cal.so +02-25 07:59:17.046 F/google-breakpad(16162): M EA94B000 00000000 00009000 5DFEC0CEBA9B6E5D08B85A18DF6F18210 libmtp_ex.so +02-25 07:59:17.046 F/google-breakpad(16162): M EA954000 00000000 00014000 F2D84209872178839F4780618E1198970 liblgruntime.so +02-25 07:59:17.046 F/google-breakpad(16162): M F0488000 00000000 00038000 A7A101BB08294CC8BD8C611C1E99A2B50 libjavacore.so +02-25 07:59:17.046 F/google-breakpad(16162): M F0508000 00000000 00005000 ADCC285BDC45AE9A03B43D1EB9B982370 libqti-at.so +02-25 07:59:17.046 F/google-breakpad(16162): M F050D000 00000000 00005000 31397DC744C7B604D2E04451B0C017450 memtrack.msm8992.so +02-25 07:59:17.046 F/google-breakpad(16162): M F4632000 00000000 0044C000 B596BED69EF0A030CE000B15595135270 libart.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4ADE000 00000000 0001A000 78B64557986220CC0618C7BBF513B6450 liblgalmond.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4AF8000 00000000 00005000 086CED5EB0F44F0EB0A5D6612670B9F30 libsigchain.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4AFD000 00000000 00020000 F2636CCC92E2C9D3154DE7D1BBEAB9720 libdashplayer.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4B1D000 00000000 00005000 78E450DE95D1700FFAEB4754C75C67680 libExtendedExtractor.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4B22000 00000000 00012000 F64E6A6F48C5BBDB0F2116A4623286870 libLGCodecParserUtils.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4B34000 00000000 00009000 F6AFB30995F2AF1A03CF5A93FB2EA4860 liblgresampler.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4B3C000 00000000 0005D000 0C1A50765556AB67675FE067B8A3515B0 libLGParserOSAL.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4B99000 00000000 00009000 DE2A64F9A04C710DC19C33C1928FE8410 libLGTimedText_ccparser.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4BA2000 00000000 00007000 83545AED3509EAAEBAE78D667F0FA48C0 libLGTimedText_xsub.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4BA9000 00000000 00032000 0D0E443B4EDCA0A81486DB513E65D0320 libstagefright_wfd.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4BDB000 00000000 00027000 E508C5A720E83FD049B04F67C09305880 libstagefright_httplive.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4BFC000 00000000 000CB000 211023EB29ED67D7BAEFB2CDD27B81910 libmediaplayerservice.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4CC6000 00000000 0003A000 E4D19B5FF8BFE7BBA363D18FC83E38160 libavenhancements.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4DC4000 00000000 00013000 DB3836D74FA669D5B70136175A3618FA0 liblge_audioeffect.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4DD7000 00000000 00009000 D59647F68E3CF58770736388D46690C70 liblgaudioutils.so +02-25 07:59:17.047 F/google-breakpad(16162): M F4DDF000 00000000 00A80000 4868B28C6E03144A7AF8FA02AE2DBA570 libLLVM.so +02-25 07:59:17.047 F/google-breakpad(16162): M F5867000 00000000 00038000 3C50F87D21BDDE58DCBD0FC7B0D476A40 libbcinfo.so +02-25 07:59:17.047 F/google-breakpad(16162): M F589F000 00000000 0005B000 99E203411790EE639624229BDF048A060 libbcc.so +02-25 07:59:17.047 F/google-breakpad(16162): M F58F9000 00000000 0000F000 0B1C07F5A59090EA875EEB64AA39FC980 libcommon_time_client.so +02-25 07:59:17.047 F/google-breakpad(16162): M F5908000 00000000 0001A000 AE6052FF75313268848C7D13396423490 libprotobuf-cpp-lite.so +02-25 07:59:17.047 F/google-breakpad(16162): M F5923000 00000000 0000D000 CFE41500FDCC495A26EE1C462156F57B0 libstreamingpolicy.so +02-25 07:59:17.047 F/google-breakpad(16162): M F592F000 00000000 0001F000 2F8F7D5FB7E04203F8FDA98680EC8A790 liblgdrm_client.so +02-25 07:59:17.047 F/google-breakpad(16162): M F594F000 00000000 00009000 BB24CC31D79784F55C4E785A5C0756DC0 libstagefright_avc_common.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5958000 00000000 00005000 314F92E6AC1822FB41D4F5DCB956F4BF0 libstagefright_enc_common.so +02-25 07:59:17.048 F/google-breakpad(16162): M F595D000 00000000 00007000 2996388C9A56DCC091AFE5897ECB87420 libpowermanager.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5964000 00000000 0001F000 09E3F520D8A5ED01B912678FA7755BB70 libvorbisidec.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5983000 00000000 00007000 F1EBDCC5D77A0008E973267AD4EB70780 libstagefright_yuv.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5989000 00000000 00033000 5A264F74CAA4BD27A2059ECA2F4F91710 libstagefright_omx.so +02-25 07:59:17.048 F/google-breakpad(16162): M F59BC000 00000000 0003B000 1F0F2D5FA3E2C08EC77EE7D2BD2255D10 libopus.so +02-25 07:59:17.048 F/google-breakpad(16162): M F59F7000 00000000 00007000 A9BEBB44C2987437574B9D2F4739898D0 libmediautils.so +02-25 07:59:17.048 F/google-breakpad(16162): M F59FC000 00000000 0001C000 7829435CE6CA0A5C60F5AACB7DED21390 libdrmframework.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5A19000 00000000 00021000 E915848185A62DFD6DED2112824D701F0 libRScpp.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5A3A000 00000000 00042000 55720349AF6FDF693DC39A570F2AECB30 libRS.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5A7C000 00000000 00009000 1DF91851FB36A8C8D29A31D5A8505CFC0 libspeexresampler.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5A85000 00000000 00017000 DD81FC74A25EFCCA887C61F71ABD287E0 libbrunch.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5A9C000 00000000 0000A000 2737A38251A7112EA0568006C3FFA9F10 libmedia_ex.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5AA6000 00000000 0000B000 EE720194B028BFBE8A292B179616DE210 libnbaio.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5AB1000 00000000 00014000 9002695E41EE3D59AF4A757AF3C0978B0 libpcre.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5AC5000 00000000 00007000 24E93BD4CCE0713FA05014B9EDEF2F590 libwpa_client.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5ACC000 00000000 00008000 A34EF29278866D2CB7506556B789086F0 libvolumevibratorcallback.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5AD6000 00000000 00071000 8E1F436C87B785BF87EB1CEDA326F7E40 libGLES_trace.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5B47000 00000000 00007000 E40891DAD8E7B2F6B30188C30D74D7C20 libsnappy.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5B4E000 00000000 00060000 749CAC9D9C512FE78C3EC16EDB296D680 libft2.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5BAE000 00000000 00029000 B9CE36FCAA829DC2258A470AD303352E0 libpng.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5BD7000 00000000 00005000 C018D84B775D61FAF368DF2AA665697F0 libsync.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5BDC000 00000000 00007000 9A5B1E364901420D8AA63CEC08475AEE0 libstdc++.so +02-25 07:59:17.048 F/google-breakpad(16162): M F5BE3000 00000000 00012000 26D8F1619C0D09102263C2334BC89C380 libunwind.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5C3B000 00000000 0000B000 D5090E204623B87A90F7F15DA838EA380 libbase.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5C46000 00000000 00007000 CF0651C637D52CCB9C593CABBB81E7BF0 libeffects.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5C4E000 00000000 00006000 C62F88A12F526FE996E1CDFB580D04670 libstagefright_http_support.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5C54000 00000000 0001B000 E2958E4C4DCD3A1C268168C2B755D9C20 libstagefright_foundation.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5C67000 00000000 0017D000 C5F6C6E6FFF7561E36B15B79D5F7960A0 libstagefright.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5DE2000 00000000 0006F000 01E0D36215F9ADFA6376148F110B151E0 libhwui.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5E51000 00000000 00005000 5E0DC92209DE1A811703898BA40879580 libradio_metadata.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5E56000 00000000 00006000 1EAD24C94329023E7C914CB60213710C0 libnativebridge.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5E5C000 00000000 00006000 2B273894878184E5533F6316C78142A90 libprocessgroup.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5E62000 00000000 00012000 847F69C739C64569AC93DC2BD612B0990 libminikin.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5E73000 00000000 0000F000 23F0E58C16D9321168B5AD72727C91D80 libsoundtrigger.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5E82000 00000000 0000F000 9485DC0440DA431817DEB656A1D89C970 libradio.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5E91000 00000000 00006000 9839EE33771040E0817D04EA1607A2E90 libnetd_client.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5E97000 00000000 00010000 253056B18E13B3ABBE25335D850E4FCF0 libimg_utils.so +02-25 07:59:17.049 F/google-breakpad(16162): M F5EA1000 00000000 0040F000 B14E0BC488816A24E8875B05F91D5A020 libpdfium.so +02-25 07:59:17.049 F/google-breakpad(16162): M F62B1000 00000000 00009000 E700CB5D5EFAD4A0982C6C92AAB24EF20 libaudioutils.so +02-25 07:59:17.049 F/google-breakpad(16162): M F62BA000 00000000 0001C000 E561DE316E10404961913562EC88C7D00 libz.so +02-25 07:59:17.049 F/google-breakpad(16162): M F62D6000 00000000 0004C000 E6A19592808FD8CCBACFB4E4585A9A0F0 libharfbuzz_ng.so +02-25 07:59:17.049 F/google-breakpad(16162): M F6322000 00000000 00007000 FB66B1BB06FB93A55E83675AC33F36980 libusbhost.so +02-25 07:59:17.049 F/google-breakpad(16162): M F632A000 00000000 0003A000 1D436B4AF7629FD99D73A7246A6BF8420 libjpeg.so +02-25 07:59:17.050 F/google-breakpad(16162): M F634B000 00000000 000DA000 E3F897ABB8F544220CA13A40126C17DC0 libmedia.so +02-25 07:59:17.051 F/google-breakpad(16162): M F641E000 00000000 00177000 E7C23CFADC8EFF8C4F22AA261B4964020 libicui18n.so +02-25 07:59:17.051 F/google-breakpad(16162): M F658E000 00000000 00121000 BD724C85205F8035CA32DB1D56D516A40 libicuuc.so +02-25 07:59:17.051 F/google-breakpad(16162): M F66B3000 00000000 00026000 CF0E97E48357CAE56758A8A052CED17F0 libssl.so +02-25 07:59:17.051 F/google-breakpad(16162): M F66D9000 00000000 0009D000 1F63A7690455B59E3DC1BAC22FD35D710 libcrypto.so +02-25 07:59:17.051 F/google-breakpad(16162): M F6776000 00000000 00088000 92D82F190EDA3EFAE4ABE1D0E9F92A440 libsonivox.so +02-25 07:59:17.051 F/google-breakpad(16162): M F6803000 00000000 00011000 EA55EB7A4E330F3A321D71A6633A350E0 libselinux.so +02-25 07:59:17.051 F/google-breakpad(16162): M F6814000 00000000 0000A000 FE9A06EDA059ABD73AA5BE0C50FDF15F0 libhardware_legacy.so +02-25 07:59:17.051 F/google-breakpad(16162): M F681F000 00000000 00005000 C1528E5AC47440C91D08992754C97A020 libhardware.so +02-25 07:59:17.051 F/google-breakpad(16162): M F6824000 00000000 00006000 D560734E4C12B1D32A8A01D9872059240 libETC1.so +02-25 07:59:17.051 F/google-breakpad(16162): M F682A000 00000000 0000F000 FF299F9F7DD8D50AFF9D4AF2FD92FE950 libGLESv2.so +02-25 07:59:17.052 F/google-breakpad(16162): M F6839000 00000000 0000A000 4ECC7F0C7C9B36FBDAC0181538C1436B0 libGLESv1_CM.so +02-25 07:59:17.052 F/google-breakpad(16162): M F683B000 00000000 00070000 1F6FBD4345A4742270A85AE7E8E129AA0 libEGL.so +02-25 07:59:17.052 F/google-breakpad(16162): M F68AD000 00000000 000B2000 5C8AABBE271B00B986091CDE0474DD700 libsqlite.so +02-25 07:59:17.052 F/google-breakpad(16162): M F694E000 00000000 00289000 5E933FF5391447BF290ADDF4FA2842B60 libskia.so +02-25 07:59:17.052 F/google-breakpad(16162): M F6BDC000 00000000 0000A000 201B23B91FB159C9C52866ADFAAA8FED0 libcamera_metadata.so +02-25 07:59:17.052 F/google-breakpad(16162): M F6BE2000 00000000 00031000 3A9285D251F3217BFF5E41689FD922AC0 libcamera_client.so +02-25 07:59:17.052 F/google-breakpad(16162): M F6C12000 00000000 00041000 80FD1F6AF746B0E1AB7B598DF55AE8D80 libinputflinger.so +02-25 07:59:17.052 F/google-breakpad(16162): M F6C51000 00000000 00021000 0D56C40D7CC3D423A16A53B3D7DED5DC0 libinput.so +02-25 07:59:17.052 F/google-breakpad(16162): M F6C69000 00000000 00062000 08E6880DE9F1CB02651AE953A7F6923F0 libgui.so +02-25 07:59:17.052 F/google-breakpad(16162): M F6CCB000 00000000 00010000 DD09E336297956492AD7C177519A1D6A0 libui.so +02-25 07:59:17.052 F/google-breakpad(16162): M F6CDB000 00000000 0000B000 F2F0AB06F84A0D783F4E17BBEB01C0690 libnetutils.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6CE6000 00000000 00009000 9ABC995145EAE750139A08FF17395D920 libnativehelper.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6CEF000 00000000 00017000 67C16CEE4A7E7012A6440053D4FEC19C0 libexpat.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6D06000 00000000 0002A000 CF824E9B76F884C161C11A28C0AA231D0 libandroidfw.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6D30000 00000000 00005000 F800D7423F3487DE8090E30BFAFED02F0 libmemtrack.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6D35000 00000000 0000B000 F15D32A9F149B74D256C52097B3A55BB0 libbacktrace.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6D40000 00000000 00022000 554E8A8627D8B1EB593D3AA5B2B3D6020 libm.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6D62000 00000000 0007A000 E726B74CE5D6F65B006BC7045662C9340 libc.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6DE4000 00000000 00090000 93219962EC5CCFD98B897B0DC910493D0 libc++.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6E74000 00000000 0002E000 FD3369BE00741CA1B70811BB61796B4C0 libwilhelm.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6E93000 00000000 000F1000 3799D3B349DB137A08F3DB434E6A88D70 libandroid_runtime.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6F86000 00000000 00032000 9475E844ABDBBE3B512F5232E393E5590 libbinder.so +02-25 07:59:17.053 F/google-breakpad(16162): M F6FB8000 00000000 0000A000 51CB626B9BC61903D8FB79C054262BA70 liblog.so +02-25 07:59:17.054 F/google-breakpad(16162): M F6FC2000 00000000 0001B000 9E35C45774B38BC266DAB3081CB02E890 libutils.so +02-25 07:59:17.054 F/google-breakpad(16162): M F6FDD000 00000000 00011000 B4E57058D30C724FB546974E8F0D99690 libcutils.so +02-25 07:59:17.054 F/google-breakpad(16162): M F7019000 00000000 00020000 143F053EC6AACF47A289E950D893D9EE0 linker +02-25 07:59:17.054 F/google-breakpad(16162): -----END BREAKPAD MICRODUMP----- +02-25 08:45:32.669 F/google-breakpad(18894): -----BEGIN BREAKPAD MICRODUMP----- +02-25 08:45:32.669 F/google-breakpad(18894): V WebView:48.0.2564.106 +02-25 08:45:32.669 F/google-breakpad(18894): O A arm 06 armv8l lge/p1_tmo_us/p1:6.0/MRA58K/1603210524c8d:user/release-keys +02-25 08:45:32.669 F/google-breakpad(18894): G OpenGL ES 3.1 V@136.0 (GIT@I86756fd4a8)|Qualcomm|Adreno (TM) 418 +02-25 08:45:32.669 F/google-breakpad(18894): S 0 C44FFF18 C44FF000 00002000 + diff --git a/src/processor/testdata/microdump-withcrashreason.dmp b/src/processor/testdata/microdump-withcrashreason.dmp new file mode 100644 index 0000000..b27c6a4 --- /dev/null +++ b/src/processor/testdata/microdump-withcrashreason.dmp @@ -0,0 +1,1422 @@ +08-17 19:45:06.579 F/google-breakpad(25655): -----BEGIN BREAKPAD MICRODUMP----- +08-17 19:45:06.579 F/google-breakpad(25655): V AndroidWebView:62.0.3188.0 +08-17 19:45:06.580 F/google-breakpad(25655): O A arm 08 armv8l Nokia/TA-1025_00WW/PLE:7.1.1/NMF26F/00WW_3_32C:user/release-keys +08-17 19:45:06.580 F/google-breakpad(25655): P webview +08-17 19:45:06.580 F/google-breakpad(25655): R 00000005 SIGTRAP 4A7CB000 +08-17 19:45:06.580 F/google-breakpad(25655): G +08-17 19:45:06.605 F/google-breakpad(25655): H 12C00000 FFF73000 00D9 31E89000 975F4000 0C:18 0D:0B 0E:0F 0F:2F 10:09 11:08 12:06 13:1A 14:08 15:06 16:12 17:10 18:0D 19:06 1B:01 1C:02 1D:01 +08-17 19:45:06.608 F/google-breakpad(25655): S 0 C9379C60 C9379000 00002000 +08-17 19:45:06.609 F/google-breakpad(25655): S C9379000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.609 F/google-breakpad(25655): S C9379180 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.610 F/google-breakpad(25655): S C9379300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.610 F/google-breakpad(25655): S C9379480 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.611 F/google-breakpad(25655): S C9379600 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.612 F/google-breakpad(25655): S C9379780 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.612 F/google-breakpad(25655): S C9379900 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.613 F/google-breakpad(25655): S C9379A80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.614 F/google-breakpad(25655): S C9379C00 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C9D37C94C9D37C9509D37C98C9C37C9EDACEF0DEDACEF0D01000000249E37C9010000009D20FCD3EDACEF0DEDACEF0D00000000EDACEF0D0000000000000000EDACEF0DEDACEF0D0000000000000000BC9C37C901000000000000008F02000000000000EDACEF0D00000000200000000000000000002CD4000000000000000000000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D00000000EDACEF0D0000000000000000EDACEF0D0000000000000000000000000000000020000000D09C37C9EDACEF0D509D37C94C9D37C9EDACEF0DEDACEF0DD5D92BD4EDACEF0DEDACEF0DEDACEF0D0000000003000000EDACEF0D0000000000000000EDACEF0DEDACEF0DEDACEF0DB7D72BD4C09D37C9B7EF57D2 +08-17 19:45:06.614 F/google-breakpad(25655): S C9379D80 00000000EDACEF0DEDACEF0D0000000000000000EDACEF0D000000000000000001000000EDACEF0D0000000000000000EDACEF0D000000000000000001000000EDACEF0D0000000000000000EDACEF0D000000000000000001000000010000000000000000000000FFFFFFFF000000000000000000000000FFFFFFFF01000000EDACEF0D7C9E37C9849E37C9889E37C9249E37C9D89E37C9789E37C98F0830D4EDACEF0DEDACEF0DEDACEF0DDD7755D2EDACEF0DD89E37C94C9E37C9489E37C9D89E37C9389F37C9749F37C9D89E37C900000000EDACEF0DEDACEF0DEDACEF0D3CA137C947733DD4D89E37C9809E37C9789E37C900000000EDACEF0DEDACEF0DEDACEF0D018D98D200000000000000000400000000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF070000001D00000000000000FFFFFFFF00000000FFFFFFFF00CB97D200000000EDACEF0D000000000000000000000000076291D2A0A037C9EDACEF0D389F37C9EDACEF0D4543A7D400000000 +08-17 19:45:06.615 F/google-breakpad(25655): S C9379F00 08A037C9EB8E3DD4A4A037C902000000309F37C9EDACEF0D389F37C9EDACEF0DEDACEF0D31000000EDACEF0DEDACEF0DEDACEF0D31000000EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFFEDACEF0D6C0000000000000001000000EDACEF0DEDACEF0D742F6874EDACEF0D14617274EDACEF0DEDACEF0D3100000024000000EDACEF0D31000000FFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFFA4A037C9A0A037C934A137C9EDACEF0D4543A7D40000000008A037C93CA137C911A03DD400000000000000000CA037C9EDACEF0DEDACEF0DEDACEF0D00000000EDACEF0D00000000EDACEF0D02000000B9D89CD2EDACEF0DEDACEF0D20A037C970A337C90000000000000000EDACEF0D0000000078A437C923D89CD200000000080000000100000000000000EDACEF0D3D8658D288C83CD3EDACEF0DEDACEF0D78A037C9D8A037C9558758D2000000000000000088A037C9EDACEF0DD8A037C9191592D2178076D2270A000001000000FFFFFFFF0000000000000000 +08-17 19:45:06.616 F/google-breakpad(25655): S C937A080 000000000000000000000000000000000400000000000000FFFFFFFF00000000EDACEF0D00000000EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000A137C900000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000007000000440000000200000000000000EDACEF0DEDACEF0D000000000000000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000038A237C94543A7D4EDACEF0D38A237C970A337C928A237C9EDACEF0DEDACEF0D4543A7D400000000EDACEF0D78A437C92DB773D2EDACEF0DEDACEF0DD9C68DD2F1C68DD2EDACEF0D01000000EDACEF0DD9C68DD20100000065C38DD2EDACEF0D0900000009000000EDACEF0D7DF856D2EDACEF0D7D933DD453E29CD2CF228BD2CF228BD2178076D2EDACEF0D38A237C90000000078A437C98D8064D2 +08-17 19:45:06.616 F/google-breakpad(25655): S C937A200 6E70E4D48970E4D400000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D0000000000000000A4A237C90000000000000000EDACEF0DEDACEF0DEDACEF0D7B2B84EAEDACEF0DEDACEF0D78A437C9B97855D2EDACEF0DA4A237C9EDACEF0DEDACEF0DEDACEF0D090000000000000009000000EDACEF0DEDACEF0D0000000000000000EDACEF0DEDACEF0D0000000000000000D0A537C9EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D38A337C900000000EDACEF0DEDACEF0D78A437C93FD49CD203000000F9C973D208A337C9EDACEF0D08A337C9F0A337C904A337C9AFA673D20100000021C973D200000000000000000100000000000000EDACEF0D00000000000000000000000000000000EDACEF0D1B000000FFFFFFFF70A337C94F1B59D2EDACEF0D090000000000000000000000000000000000000025B0B6D4EDACEF0D00000000A1CE9CD2270A000000000000EDACEF0D0200000094A437C905000000EDACEF0DEDACEF0D0000000000000000 +08-17 19:45:06.617 F/google-breakpad(25655): S C937A380 000000000000000000000000D5B0B6D425B0B6D42C0100007D933DD453E29CD2CF228BD2CF228BD2178076D2270A0000EDACEF0DE8A337C9270A000000000000EDACEF0DEDACEF0DEDACEF0D2BC83CD3EDACEF0D090000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000EDACEF0DEDACEF0D98A437C90000000000000000D8A437C90000000078A437C9FBC69CD2EDACEF0D2BC83CD3EDACEF0D0900000088A437C9000000000000000000000000E8030000000000000000000000000000E8030000B0A437C9EDACEF0D80A437C900000000EDACEF0D00000000000000000000000000000000000000000CA3BDD2000000000000000000000000EDACEF0DEDACEF0D2BC83CD3EDACEF0D0900000000000000000000000000000000000000EDACEF0DEDACEF0D00000000EDACEF0DD0A537C965CC73D2000000000000000000000000000000000000000000000000EDACEF0D00000000D0A537C9EDACEF0D0000000000000000 +08-17 19:45:06.617 F/google-breakpad(25655): S C937A500 0000000000000000EDACEF0D28A737C9C0A537C9EDACEF0DEDACEF0D747D92D40000000028A737C9EDACEF0D2DB773D2EDACEF0D30A737C9F0A537C9EDACEF0DEDACEF0D747D92D4000000006BB773D201010000DCA537C9EDACEF0DEDACEF0DB000000080000000EDACEF0D7B2B84EA53E29CD253E29CD2CF228BD2CF228BD2178076D2DCA537C9EDACEF0D0000000007E29CD207E29CD207E29CD207E29CD200000000000000000000000000000000FCA537C9000000000000000000000000EDACEF0D00000000EDACEF0DF6FFFFFF00000000000000004000000000000000EDACEF0DEDACEF0D00000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EDACEF0DC4A637C9000000000000000040A837C9EDACEF0DEDACEF0D0000000028A737C9A4A637C948A737C92842A7D4EDACEF0D28A737C9EDACEF0D5FB473D2FFFFFFFF7B2B84EAEDACEF0DEDACEF0DFFFFFFFFC0A637C9 +08-17 19:45:06.618 F/google-breakpad(25655): S C937A680 EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0DFFFFFFFFC0A637C9020000000000000000000000000000000000000077D5BED2EDACEF0D00000000F4FFFFFFEDACEF0DE4A637C9EDACEF0DB8A737C9EDACEF0D00000000000000000000000000000000EDACEF0DEDACEF0D28A737C9EDACEF0DB8A737C9EDACEF0DC8A737C928A737C970A737C92BAA73D2EDACEF0DEDACEF0D01000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000000000000000000000000000000000000000000002843A7D42842A7D49601000053E29CD253E29CD2CF228BD2CF228BD2178076D2DD020000010037C900000000FFFFFFFFD0A4BDD202000000F0A737C900000000EDACEF0DEDACEF0DEDACEF0DACA737C9FFFFFFFFE0A737C9EDACEF0D010000006B9855D2EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000000000000000000000000000000000000000000002843A7D42842A7D49601000053E29CD253E29CD2CF228BD2CF228BD2178076D2DD02000001000000D34657D2 +08-17 19:45:06.619 F/google-breakpad(25655): S C937A800 EDACEF0DEDACEF0DEDACEF0D01000000EDACEF0DEDACEF0D000000005B8173D2020000009BD47ED2CCA837C940A837C9EDACEF0D00000000CCA837C91FA773D20000000000000000EDACEF0D3100000020000000EDACEF0D0000000000000000000000000000000098A837C9EDACEF0DEDACEF0DEDACEF0D94A837C9EDACEF0D00000000CCA837C9000000006B9855D20000000000000000EDACEF0D214657D2000000000000000000000000B34557D2EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000498473D2EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00000000CCA837C9EDACEF0DEDACEF0D20A937C978000000EDACEF0DEDACEF0DA38173D220A937C9CD2F82EA20A937C9E52F82EA28A937C9EF5C7FEA7800000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00100000000000000000000000000000000000005B8173D2EDACEF0D00000000EDACEF0D0100000000000000EDACEF0D0000000070A937C920A937C91600000000000000 +08-17 19:45:06.619 F/google-breakpad(25655): S C937A980 00000000EDACEF0D00000000EDACEF0D0000000001000000EDACEF0D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000EDACEF0D01000000EDACEF0D000000000000000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D010000000100000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D00000000000000000000000000000000000000000000000001000000EDACEF0D01000000EDACEF0D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.620 F/google-breakpad(25655): S C937AB00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.620 F/google-breakpad(25655): S C937AC80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.621 F/google-breakpad(25655): S C937AE00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.621 F/google-breakpad(25655): S C937AF80 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.622 F/google-breakpad(25655): C 06000040000000000000000005B88FD2000000008C9C37C9CC9C37C99025E63EAC9C37C94C9D37C95C9D37C9509D37C9809E37C9D9C5F7D3609C37C91B89B3D28684B3D2300001680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:06.622 F/google-breakpad(25655): M AAAAA000 00000000 00005000 8D2477F3B51997BDCC3733B8D1F920BE0 app_process32 +08-17 19:45:06.622 F/google-breakpad(25655): M 70D29000 00000000 00806000 E9166D3ED622EE65A3A4086EBEA4A7950 boot.oat +08-17 19:45:06.622 F/google-breakpad(25655): M 71531000 00000000 006C0000 668D96384E4368B01BC9B9F365028CA20 boot-core-libart.oat +08-17 19:45:06.623 F/google-breakpad(25655): M 71BF3000 00000000 000AA000 0D160B642FB1639805B72AC6F4DF3F380 boot-conscrypt.oat +08-17 19:45:06.623 F/google-breakpad(25655): M 71C9F000 00000000 000D1000 9D69BDC94BD07F2468D5B7DB0AEEF0140 boot-okhttp.oat +08-17 19:45:06.623 F/google-breakpad(25655): M 71D72000 00000000 0000C000 566CD32860A984FD445A4852058609CB0 boot-core-junit.oat +08-17 19:45:06.623 F/google-breakpad(25655): M 71D80000 00000000 0019F000 09C1E8B1D7FC826CB75691EC5BDBA1DB0 boot-bouncycastle.oat +08-17 19:45:06.623 F/google-breakpad(25655): M 71F21000 00000000 0014B000 069BAE4D2D7831B857A3C236021D868A0 boot-ext.oat +08-17 19:45:06.623 F/google-breakpad(25655): M 7206E000 00000000 0223E000 D0BEBD37E215DDC845099212203F792F0 boot-framework.oat +08-17 19:45:06.623 F/google-breakpad(25655): M 742AE000 00000000 00502000 B41E052DBA2949CE100713743053E1E40 boot-telephony-common.oat +08-17 19:45:06.623 F/google-breakpad(25655): M 747B2000 00000000 0003D000 65E4B1E28F33F9C51062E2D0630394830 boot-voip-common.oat +08-17 19:45:06.624 F/google-breakpad(25655): M 747F1000 00000000 00045000 EB491A6AF6568A675D81746238ACC78B0 boot-ims-common.oat +08-17 19:45:06.624 F/google-breakpad(25655): M 74838000 00000000 0016C000 C369D6D4F8DCF10CC0AD1800000000000 boot-apache-xml.oat +08-17 19:45:06.624 F/google-breakpad(25655): M 749A6000 00000000 000FF000 1FAC5317B0FEBD01C31E8039D76CCAF50 boot-org.apache.http.legacy.boot.oat +08-17 19:45:06.624 F/google-breakpad(25655): M 74AA7000 00000000 00004000 C368F8D0F8DCF10C00BE1800000000000 boot-tcmiface.oat +08-17 19:45:06.624 F/google-breakpad(25655): M 74AAD000 00000000 00016000 C368FA40F8DCF10C3FB11800000000000 boot-WfdCommon.oat +08-17 19:45:06.624 F/google-breakpad(25655): M 74AC5000 00000000 00004000 A2EDD62E4499B2C98D8C251F0977951B0 boot-oem-services.oat +08-17 19:45:06.624 F/google-breakpad(25655): M 74ACB000 00000000 0001C000 3794BA12A18F802DF4E8F10D4B2662FB0 boot-qcom.fmradio.oat +08-17 19:45:06.624 F/google-breakpad(25655): M 74AE9000 00000000 00009000 C368F9A8F8DCF10C95B41800000000000 boot-qcmediaplayer.oat +08-17 19:45:06.624 F/google-breakpad(25655): M 74AF4000 00000000 00008000 C368E898F8DCF10CDEAD1800000000000 boot-telephony-ext.oat +08-17 19:45:06.624 F/google-breakpad(25655): M 74AFE000 00000000 00013000 C368E46FF8DCF10CA3A11800000000000 boot-dolby_ds2.oat +08-17 19:45:06.625 F/google-breakpad(25655): M 74B13000 00000000 0000A000 C368F9E4F8DCF10C41B01800000000000 boot-dolby_ds1.oat +08-17 19:45:06.625 F/google-breakpad(25655): M C8F1F000 00000000 00005000 F841612CF1D458AB70296575A996EE5F0 QPerformance.odex +08-17 19:45:06.625 F/google-breakpad(25655): M CB799000 00000000 00856000 000003F10000000031270A00000000000 base.odex +08-17 19:45:06.625 F/google-breakpad(25655): M CCAF6000 00000000 00936000 00000F700000000098480B00000000000 base.odex +08-17 19:45:06.625 F/google-breakpad(25655): M CF4C6000 00000000 02000000 000000000000000000000000000000000 dalvik-jit-code-cache (deleted) +08-17 19:45:06.625 F/google-breakpad(25655): M D2273000 04247000 02C94000 8A2EFA0DECC3EF7057A1C62BF1AECCA80 libmonochrome.so +08-17 19:45:06.625 F/google-breakpad(25655): M D9155000 00000000 00004000 C1741AE46077EF13F70D0DC7D8A9DDE80 libwebviewchromium_loader.so +08-17 19:45:06.625 F/google-breakpad(25655): M D9276000 00000000 00006000 C700FED4854EA9F553FC4EB1AC49DAD50 libqdutils.so +08-17 19:45:06.625 F/google-breakpad(25655): M D927F000 00000000 00007000 5AF3845B7F31952390092BB2318667B00 gralloc.msm8937.so +08-17 19:45:06.626 F/google-breakpad(25655): M D926B000 00000000 00823000 A91A29ADD65BB0AF28A4C9A6208E33C40 libllvm-glnext.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9AB7000 00000000 00316000 9F7E6C49A0A8C88C317716B031320CA30 libESXGLESv2_adreno.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9F1F000 00000000 0000C000 CEC6F7F71723450F4D1E527FA1BDDA310 libqservice.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9F30000 00000000 00007000 BB9F7CD0BF1178F273EB8B4D2D5C67C30 libmemalloc.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9F39000 00000000 00003000 B4B80A1B5D6C50F5C0DD7F1C29A9F6C10 libqdMetaData.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9F43000 00000000 00009000 0BA85EA850C07E5B86AF8281EF7641E70 libcompiler_rt.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9F4E000 00000000 0000B000 362BA72B9CF73AB8BD02283F491283E40 eglSubDriverAndroid.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9F5B000 00000000 0000B000 9BAA0F603A10810D4A6BEE7A903A762F0 libGLESv2_adreno.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9F68000 00000000 00007000 C08FDBDAB5792096DB0BEDBE3D23B48D0 libGLESv1_CM_adreno.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9F71000 00000000 00024000 C346DBBCF27F603F9321CCF737B3C0550 libESXGLESv1_CM_adreno.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9F97000 00000000 00010000 A7800610AD28E2DF469D023E70516C190 libESXEGL_adreno.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9FAB000 00000000 00006000 6CC274368542A8270BC225BE519068D80 libadreno_utils.so +08-17 19:45:06.626 F/google-breakpad(25655): M D9FBC000 00000000 00009000 649C0C218A9C0A611E5E0DB24CDD058C0 libEGL_adreno.so +08-17 19:45:06.626 F/google-breakpad(25655): M DA4BC000 00000000 00020000 1195E0A668F3644AC0EC8D1122457A140 libkeymaster1.so +08-17 19:45:06.627 F/google-breakpad(25655): M DA4DF000 00000000 00018000 39E3D5620A966F5DB960EEE55CCD8BB30 libsoftkeymasterdevice.so +08-17 19:45:06.627 F/google-breakpad(25655): M DA4F9000 00000000 0001A000 C1B07DA2D52E6EC3C54992A3A953D63B0 libjavacrypto.so +08-17 19:45:06.627 F/google-breakpad(25655): M DA516000 00000000 00004000 B051A444B9312E4DAF242DA3A951538A0 libkeystore-engine.so +08-17 19:45:06.627 F/google-breakpad(25655): M DA51B000 00000000 00016000 1988D915061DDC4921FF608AD3E810AD0 libkeystore_binder.so +08-17 19:45:06.627 F/google-breakpad(25655): M DA534000 00000000 0000C000 DDF063ABB28459B09548F8329934DDEB0 libkeymaster_messages.so +08-17 19:45:06.627 F/google-breakpad(25655): M DC57D000 00000000 00016000 A686CFCA0E870C10B425EB769017BE930 libmtp.so +08-17 19:45:06.627 F/google-breakpad(25655): M DC593000 00000000 00052000 E9F8299757E5E543C03723101E5B1BEC0 libmedia_jni.so +08-17 19:45:06.627 F/google-breakpad(25655): M DC5E8000 00000000 00020000 ADF61BE35FF269EC7E7B32B1DDCD31E00 libexif.so +08-17 19:45:06.627 F/google-breakpad(25655): M DC616000 00000000 0000E000 ABA3C77DD3386AE87B586632CE1979D50 libstagefright_amrnb_common.so +08-17 19:45:06.627 F/google-breakpad(25655): M DC634000 00000000 00007000 CD70BA801CA3E12D258565013535D7440 tcmclient.odex +08-17 19:45:06.627 F/google-breakpad(25655): M DC645000 00000000 00004000 042B2B738C75036986EB80BC08A71F060 libextmedia_jni.so +08-17 19:45:06.627 F/google-breakpad(25655): M E1E9B000 00000000 002B2000 FCA7431984CE2AEF979FFEEF99432D320 libart-compiler.so +08-17 19:45:06.628 F/google-breakpad(25655): M E215E000 00000000 000B1000 1EBE7A1A3E1A3134DE689251E1ABC0380 libvixl.so +08-17 19:45:06.628 F/google-breakpad(25655): M E2264000 00000000 0002B000 6E46C8EDE63F81CC2A4375E4F85517CD0 libopenjdk.so +08-17 19:45:06.628 F/google-breakpad(25655): M E2291000 00000000 00029000 4F845000DEA8066D684FEAB08A91A3480 libjavacore.so +08-17 19:45:06.628 F/google-breakpad(25655): M E22BC000 00000000 00138000 523FDEBEF6ECE577AF3716E9703AD4FF0 lib-imsqimf.so +08-17 19:45:06.628 F/google-breakpad(25655): M E23FA000 00000000 00004000 48E9F68098728AFF9A198AE7A14A7F700 libmdmdetect.so +08-17 19:45:06.628 F/google-breakpad(25655): M E2400000 00000000 00005000 12F24D77003A5660A06BA8690696A5C30 libconfigdb.so +08-17 19:45:06.628 F/google-breakpad(25655): M E2405000 00000000 00085000 DB9D3DADFB06F6B1AB9CEC5443F295370 lib-imsxml.so +08-17 19:45:06.628 F/google-breakpad(25655): M E2496000 00000000 00005000 F812502D41A460BDD2D9AA83A9564CC70 libqmi_encdec.so +08-17 19:45:06.628 F/google-breakpad(25655): M E249C000 00000000 0001C000 A53A45C88FFCD4CB3AFF323AF8FFFBAB0 libqdi.so +08-17 19:45:06.628 F/google-breakpad(25655): M E24B7000 00000000 0006A000 D110B55DE7DB9FD5086D2D1CE57152480 libdsi_netctrl.so +08-17 19:45:06.628 F/google-breakpad(25655): M E2534000 00000000 00023000 E7FB6A8B99C97103F258028CF27324660 lib-imsrcscm.so +08-17 19:45:06.628 F/google-breakpad(25655): M E255A000 00000000 0001C000 5BE35B9E5D50332052532AE119C50B930 libnetmgr.so +08-17 19:45:06.628 F/google-breakpad(25655): M E257A000 00000000 00004000 AB354652140A356C9787104C87CB30E00 libidl.so +08-17 19:45:06.628 F/google-breakpad(25655): M E2581000 00000000 00004000 63ED38853810ED69BA1AA57CE82E74B10 libtime_genoff.so +08-17 19:45:06.629 F/google-breakpad(25655): M E2587000 00000000 00004000 51134658113749962ABB7BA3A3C5E9740 libqmi_client_helper.so +08-17 19:45:06.629 F/google-breakpad(25655): M E258E000 00000000 00009000 1D288EC9F32773EBC0D380D4E238D8D60 libqmi_client_qmux.so +08-17 19:45:06.629 F/google-breakpad(25655): M E25C9000 00000000 0006A000 60BAE0DAB14BFBC4BE1805CC4CAF8B4D0 lib-imsdpl.so +08-17 19:45:06.629 F/google-breakpad(25655): M E263D000 00000000 00019000 0333752023452FF1E40F6BA9169471500 libdiag.so +08-17 19:45:06.629 F/google-breakpad(25655): M E274E000 00000000 0002C000 0FC3AF7C85EA4B0DA653AEA111020A2D0 libqmi.so +08-17 19:45:06.629 F/google-breakpad(25655): M E27B7000 00000000 000B8000 023971CEF8E022AAD4090C7D1432C3690 libCB.so +08-17 19:45:06.629 F/google-breakpad(25655): M E7D93000 00000000 00461000 39CBB6C545073B5DB56B60665F81D4B00 libart.so +08-17 19:45:06.629 F/google-breakpad(25655): M E8384000 00000000 00001000 7691C4BE084B030B3AA118A6F412EE260 libqmi_common_so.so +08-17 19:45:06.629 F/google-breakpad(25655): M E8387000 00000000 0000A000 37A576E22F2B9973E1734E556E1E99990 libqmi_cci.so +08-17 19:45:06.629 F/google-breakpad(25655): M E8395000 00000000 00003000 DCDF68ACFBFC2DEFC89FA0F5783199070 libpackagelistparser.so +08-17 19:45:06.629 F/google-breakpad(25655): M E839A000 00000000 00056000 0C1D30C5E6EA7E82800A2B00935E4B060 libharfbuzz_ng.so +08-17 19:45:06.629 F/google-breakpad(25655): M E83F3000 00000000 00037000 8AF00237A05209C2E429D0F70ED3EB900 libopus.so +08-17 19:45:06.629 F/google-breakpad(25655): M E842C000 00000000 00017000 215A7F63855CB46EC59B425BEDFD847D0 libminikin.so +08-17 19:45:06.630 F/google-breakpad(25655): M E8447000 00000000 00018000 EAB4CCC4544F5D8E2ECF256D527F4A430 libutils.so +08-17 19:45:06.630 F/google-breakpad(25655): M E8461000 00000000 0001E000 CCAA49412B791630FD4EAD7755A3E4CD0 libvorbisidec.so +08-17 19:45:06.630 F/google-breakpad(25655): M E8481000 00000000 00008000 F3F7CCE4ADD14C5DB852DF06407AE2FA0 libcamera_metadata.so +08-17 19:45:06.630 F/google-breakpad(25655): M E848C000 00000000 0000E000 1F6ED3D6536346B3B20CF40C5F9799D80 liblog.so +08-17 19:45:06.630 F/google-breakpad(25655): M E849D000 00000000 00010000 D6821B30C7A106C623EEE331974C9BF50 libGLESv2.so +08-17 19:45:06.630 F/google-breakpad(25655): M E84AF000 00000000 00014000 22B107B0382117ED603FF6000B248B8D0 libpcre.so +08-17 19:45:06.630 F/google-breakpad(25655): M E84C4000 00000000 00040000 9CC9AFC89D88D4C4AE6AEF2E290594B70 libinputflinger.so +08-17 19:45:06.630 F/google-breakpad(25655): M E8508000 00000000 00005000 459EC08F2C9F91A7E6AB6F293540B4510 libstdc++.so +08-17 19:45:06.630 F/google-breakpad(25655): M E850F000 00000000 00005000 DE5A396AAF801AF9A298A50BADE143E60 libspeexresampler.so +08-17 19:45:06.630 F/google-breakpad(25655): M E84F0000 00000000 00B36000 F1644AA2ACE475925E0DA02A814C13DF0 libLLVM.so +08-17 19:45:06.630 F/google-breakpad(25655): M E9081000 00000000 00008000 225E121AA129BB96606A1B3B91A2737A0 libnbaio.so +08-17 19:45:06.630 F/google-breakpad(25655): M E908C000 00000000 00017000 9A6B379EB3F10874FC241C570801C6070 libmemunreachable.so +08-17 19:45:06.630 F/google-breakpad(25655): M E909C000 00000000 0005F000 0FAC08487B9CD62449A19C8D161E7D820 libgui.so +08-17 19:45:06.631 F/google-breakpad(25655): M E9109000 00000000 00004000 E9B0F0A724940363FCBE11FB96B6ADF30 libnativebridge.so +08-17 19:45:06.631 F/google-breakpad(25655): M E910D000 00000000 0007B000 B44B5897A497DCB27C105B61AC30F1180 libhwui.so +08-17 19:45:06.631 F/google-breakpad(25655): M E918B000 00000000 0008B000 DCAB7F6AA60C5E74587E56973C6653120 libc++.so +08-17 19:45:06.631 F/google-breakpad(25655): M E921C000 00000000 00003000 3C7CC5BEA31C9C85C9BC25EC0891B7B10 libsync.so +08-17 19:45:06.631 F/google-breakpad(25655): M E9221000 00000000 00009000 4334A7FB3D1CB8582D4D676DE6E5E2930 libpiex.so +08-17 19:45:06.631 F/google-breakpad(25655): M E922A000 00000000 0000E000 EBD0DA428C58F5CBD72761DD6F1C03A10 libsoundtrigger.so +08-17 19:45:06.631 F/google-breakpad(25655): M E923D000 00000000 00020000 27C83DAE0AB0E161280BB40C384BD4BC0 libm.so +08-17 19:45:06.631 F/google-breakpad(25655): M E925F000 00000000 00003000 C9108BAA1E466D60D4591919420BBB6A0 libradio_metadata.so +08-17 19:45:06.631 F/google-breakpad(25655): M E9264000 00000000 0000E000 63E3F027146D592F9FBE03A33EDC8C6D0 libimg_utils.so +08-17 19:45:06.631 F/google-breakpad(25655): M E9275000 00000000 00015000 53AF0C4E2096697687AC0081AC7AD97C0 libunwind.so +08-17 19:45:06.631 F/google-breakpad(25655): M E92D0000 00000000 0001F000 9F74D840029038F65C040D5492CAE7360 libinput.so +08-17 19:45:06.631 F/google-breakpad(25655): M E92F5000 00000000 00005000 17620CAE201DC01DFD868F3276E8AA810 libpowermanager.so +08-17 19:45:06.631 F/google-breakpad(25655): M E92FD000 00000000 00055000 5E4B1D0F4D553AA92665AE0925229AF40 libsonivox.so +08-17 19:45:06.631 F/google-breakpad(25655): M E9359000 00000000 00006000 E727B84B0F5B3D982CAE8FB6E64B88030 libtiff_directory.so +08-17 19:45:06.632 F/google-breakpad(25655): M E9362000 00000000 00021000 52D2F4BBC71C3EE2E161E009B0331EF80 libstagefright_foundation.so +08-17 19:45:06.632 F/google-breakpad(25655): M E9386000 00000000 0003B000 2D4A4F8139C7842165EA73A6ACD835340 libjpeg.so +08-17 19:45:06.632 F/google-breakpad(25655): M E93C3000 00000000 00003000 9945E8F5AE0ADE1ED46FA08B41A6C9BE0 libmemtrack.so +08-17 19:45:06.632 F/google-breakpad(25655): M E93C6000 00000000 00019000 D2D0067E628DCC03418B99399D251A990 libEGL.so +08-17 19:45:06.632 F/google-breakpad(25655): M E93E4000 00000000 00019000 6534179E8DC7D8EDBF1236C375D51ECD0 libdrmframework.so +08-17 19:45:06.632 F/google-breakpad(25655): M E93FB000 00000000 00110000 994744AF5261DAC7CD0003EC5456DBDF0 libicuuc.so +08-17 19:45:06.632 F/google-breakpad(25655): M E9519000 00000000 00015000 BDA36CE4717D8C1A324C7CA4E1CA9B860 libvulkan.so +08-17 19:45:06.632 F/google-breakpad(25655): M E9521000 00000000 000F8000 91002184018FFAC8E26ECCB238E392440 libandroid_runtime.so +08-17 19:45:06.632 F/google-breakpad(25655): M E962A000 00000000 00004000 644559B020FD089F8180BB62CF9420590 libprocessgroup.so +08-17 19:45:06.632 F/google-breakpad(25655): M E9629000 00000000 00183000 035813361AA690A2E08F1E059823C9D50 libicui18n.so +08-17 19:45:06.632 F/google-breakpad(25655): M E97B8000 00000000 00008000 9D6466250A83301B3BE4CAA85227525D0 libnativeloader.so +08-17 19:45:06.632 F/google-breakpad(25655): M E97C0000 00000000 0000E000 031F092D2D476376D52F41FD2ADD2A3E0 libradio.so +08-17 19:45:06.632 F/google-breakpad(25655): M E97D2000 00000000 00003000 159F2CAC750E3DB60EF444F05BACCC850 libregionalization.so +08-17 19:45:06.633 F/google-breakpad(25655): M E97D8000 00000000 00008000 16C813B71CC34E81BCF6F5DD8648DC3B0 libGLESv1_CM.so +08-17 19:45:06.633 F/google-breakpad(25655): M E97E2000 00000000 00003000 AA06FF77B6E4CC83470C006104304D0F0 libhardware.so +08-17 19:45:06.633 F/google-breakpad(25655): M E97E0000 00000000 00039000 B613B07CCC9703A9AAE92861C92202BD0 libcamera_client.so +08-17 19:45:06.633 F/google-breakpad(25655): M E980D000 00000000 003A9000 42F6682A5C7E8B66743C6087B578D6C40 libskia.so +08-17 19:45:06.633 F/google-breakpad(25655): M E9BDC000 00000000 00007000 AD9132F0D394659639CBE5858DD1BB750 libhardware_legacy.so +08-17 19:45:06.633 F/google-breakpad(25655): M E9BE7000 00000000 00005000 EE5BF022DE057918231B46C6EDDC38690 libstagefright_yuv.so +08-17 19:45:06.633 F/google-breakpad(25655): M E9BEE000 00000000 00007000 9BC1C9D1E638BF1B7B32AC308B08D9DA0 libimage_type_recognition.so +08-17 19:45:06.633 F/google-breakpad(25655): M E9BF7000 00000000 0000D000 3C492E547FA88D7E2E85BD9451F613090 libbacktrace.so +08-17 19:45:06.633 F/google-breakpad(25655): M E9C07000 00000000 00007000 B165EC37228240E1EBEDC14160C16A3A0 libnativehelper.so +08-17 19:45:06.633 F/google-breakpad(25655): M E9C10000 00000000 0001A000 4D1780AFB25B59BBD625608B400D70C20 libprotobuf-cpp-lite.so +08-17 19:45:06.633 F/google-breakpad(25655): M E9C2D000 00000000 00004000 989F274AF037FE14219BE6DC42503B950 libnetd_client.so +08-17 19:45:06.633 F/google-breakpad(25655): M E9C33000 00000000 000A0000 8E23BB4E73E86B4A2AD4C17D7BAFD8A90 libcrypto.so +08-17 19:45:06.633 F/google-breakpad(25655): M E9CE0000 00000000 00003000 675D9BCC56AB210C8017D6625F994D250 libstagefright_enc_common.so +08-17 19:45:06.634 F/google-breakpad(25655): M E9CE5000 00000000 00024000 CC51150390EA9EFB0315C02573CCFD000 libpng.so +08-17 19:45:06.634 F/google-breakpad(25655): M E9D0B000 00000000 0003B000 4FBF4968372FEB1C8D593076E1B171610 libRScpp.so +08-17 19:45:06.634 F/google-breakpad(25655): M E9D49000 00000000 0000A000 415DAD77CED2441456E20CAD35C536250 libRS.so +08-17 19:45:06.634 F/google-breakpad(25655): M E9D55000 00000000 00004000 F168A985060F7993C937719998C96FD20 libusbhost.so +08-17 19:45:06.634 F/google-breakpad(25655): M E9D5B000 00000000 00086000 58C592B73EA51A0AFC3287247961D0940 libdng_sdk.so +08-17 19:45:06.634 F/google-breakpad(25655): M E9DE1000 00000000 00057000 44C1EA73F38E47E95712BF5848E8937E0 libbinder.so +08-17 19:45:06.634 F/google-breakpad(25655): M E9E3F000 00000000 0002E000 2824A9CACA3A870AD713A3405D6249530 libwilhelm.so +08-17 19:45:06.634 F/google-breakpad(25655): M E9E72000 00000000 00030000 E9CE28F8F628E4501925FF4D0FD6168F0 libstagefright_omx.so +08-17 19:45:06.634 F/google-breakpad(25655): M E9EA0000 00000000 00487000 3CD6A967C46ED23F4AB4B39092B43AB70 libpdfium.so +08-17 19:45:06.634 F/google-breakpad(25655): M EA337000 00000000 00004000 76B7583F8773D45C53E165CABC841DE70 libETC1.so +08-17 19:45:06.634 F/google-breakpad(25655): M EA33D000 00000000 00015000 F0658EC8F5FCD09AB82C2EFC3A6834210 libui.so +08-17 19:45:06.634 F/google-breakpad(25655): M EA355000 00000000 00038000 E4F681ED6DAD0F793516317FBE3DD55A0 libRS_internal.so +08-17 19:45:06.634 F/google-breakpad(25655): M EA390000 00000000 00016000 0DB58A0AF796EA03A43AAD505A8723310 liblzma.so +08-17 19:45:06.634 F/google-breakpad(25655): M EA3AE000 00000000 00011000 2618247A47A298A5C4574CC818C7F3280 libselinux.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA3C1000 00000000 00005000 961542B344C4A0F54F87B49C0F1429E80 libwpa_client.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA3C8000 00000000 00007000 5FF53AA38050A1DE3BF7A4D755DC75B70 libaudioutils.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA3D1000 00000000 00017000 31235ADAF427BE11933CD87290CCAF050 libcutils.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA3EB000 00000000 00036000 CBC6DC0C255BAB785FCD0511A7CBF0690 libbcinfo.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA423000 00000000 00003000 FDA204F888F3C0D8070BFDEC834066D20 libstagefright_http_support.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA428000 00000000 00005000 14FB257C9C6F43C8FA0B475D81C47FFC0 libbinary_parse.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA42F000 00000000 00009000 93F30055C78E1D80E40A8E717405CF500 libmediautils.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA43B000 00000000 0000A000 0F98C20EB2725367604DCE7EDA8EED9D0 libbase.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA447000 00000000 00016000 DC1FEB19B377562139F4F8AAFFA610710 libz.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA460000 00000000 00015000 68F77CDFB35DA081E510A50D11F299D70 libexpat.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA45D000 00000000 000C3000 3B22B766CDBB99263CF24B4CC2986E510 libmedia.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA541000 00000000 00031000 335A60B9AA0F00A47BD5A781CCA820740 libandroidfw.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA574000 00000000 0007A000 21086BE83826AA7DC32AB49C79D5CCE30 libsqlite.so +08-17 19:45:06.635 F/google-breakpad(25655): M EA5F2000 00000000 0006C000 6EA54A19597F20D46626700FE9F206F50 libft2.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA64F000 00000000 0016B000 4E69F13734FEABE1CA5BA98594235DCD0 libstagefright.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA7D3000 00000000 00007000 475E29D0A243BEE93EC1A630C99503FC0 libnetutils.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA7DC000 00000000 00084000 49B02E01AEC77331A1D6D19B540265610 libc.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA86E000 00000000 00025000 8B6ECC65C09CAFF5ACAAB6C9249CD2C20 libssl.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA896000 00000000 00008000 22114C778A7ED1CC3953CCB22323EA1B0 libstagefright_avc_common.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA8A1000 00000000 00003000 7FA19C935E6148BD8002A3CA630C4E6F0 libsmemlog.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA8A1000 00000000 00017000 EEAF8ABB6827B80A458A5D483E5562400 libqmiservices.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA8C1000 00000000 00008000 090640ECFC69E16A25A3E27006AF282E0 libxml.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA8CC000 00000000 00012000 67F4D476A96F053ACB61531379FCC4810 libdsutils.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA8EF000 00000000 00014000 EFD5F0A0F81252A037F1C06B8E6809700 libsdsprpc.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA905000 00000000 0003E000 C4311189AF8DA8405EDC0701CD38FC770 libgsl.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA99F000 00000000 00014000 75BC34362D3F387A08AE8241CED8E2550 libadsprpc.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA9B2000 00000000 0001A000 840BD6EAC45DEFC59D2F1E8C681CFF1A0 lib-imsrcscmclient.so +08-17 19:45:06.636 F/google-breakpad(25655): M EA9DA000 00000000 00011000 6034A9FBADF19CE6C259DA006E8158FC0 lib-imsrcscmservice.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAA09000 00000000 00003000 7BB31E1D28279A11B8087C3F4DF7D0BA0 libqti-at.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAA0E000 00000000 0000C000 7D5A1CA22F6A85FCC57B3D36A92461560 lib-ims-rcscmjni.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAA1C000 00000000 00012000 FAD2DBDF65F36590FFE591C62DBEFA1E0 libOpenCL.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAA38000 00000000 00003000 025B4D5BBA39265D6260B27597E321730 memtrack.msm8937.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAA3D000 00000000 00011000 F5FF7C8214A82029405A068BCDF69A580 libmediandk.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAA53000 00000000 00008000 5373A05304D5AFD8BC2BB49D6C22977D0 libopenjdkjvm.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAA5C000 00000000 0000F000 96A60B84ED1352C202B6695FD32373790 libmediadrm.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAA6E000 00000000 00010000 3D880E60A39C482BA4210DA0AD4E20490 libGLESv3.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAA97000 00000000 00003000 F4CB54FA6F9A644292CE2DCC9FA89DA80 libqti_performance.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAA9D000 00000000 00004000 B2EAC3688B9EFF0E79EA2C170AA859C50 libwebviewchromium_plat_support.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAAA5000 00000000 00004000 837BE31E60CD67A2C45BF27A1E8C10140 libOpenSLES.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAAAB000 00000000 00004000 3C4D0169CD09A3AEEC0868A7FC87CCFA0 libOpenMAXAL.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAAB0000 00000000 00016000 BAF17608D25635EFA63708C89561474D0 libcamera2ndk.so +08-17 19:45:06.637 F/google-breakpad(25655): M EAB53000 00000000 00003000 78C8F6360CF612E4333D4EB1796927460 libqti-perfd-client.so +08-17 19:45:06.638 F/google-breakpad(25655): M EAB57000 00000000 00014000 01EE9AC4109E06B182E77B55242AEBE20 libandroid.so +08-17 19:45:06.638 F/google-breakpad(25655): M EABAF000 00000000 00003000 4C4B6F03AF5049885FD4A43F149D13630 libjnigraphics.so +08-17 19:45:06.638 F/google-breakpad(25655): M EABB0000 00000000 00090000 FBA40D2822A0C6DCF7CE29FB42DC37230 libmediaplayerservice.so +08-17 19:45:06.638 F/google-breakpad(25655): M EAC7B000 00000000 0000A000 52C41240B217BFE92F7381218169FD760 liblz4.so +08-17 19:45:06.638 F/google-breakpad(25655): M EACF9000 00000000 00038000 FEF1DA3EC5AA99E4FF38C1DF2A9A91570 libavenhancements.so +08-17 19:45:06.638 F/google-breakpad(25655): M EAD35000 00000000 0002F000 85E4C8F7646AA02A46215564266690BA0 libstagefright_wfd.so +08-17 19:45:06.638 F/google-breakpad(25655): M EAD6A000 00000000 00026000 7B91D8B6A15FF171BF114D8D638785D80 libstagefright_httplive.so +08-17 19:45:06.638 F/google-breakpad(25655): M EAD94000 00000000 00003000 6DE080E13BB1741A34C157CE97277ABD0 libsigchain.so +08-17 19:45:06.638 F/google-breakpad(25655): M EADE7000 00000000 00003000 1390052238CBD9474F1747EA0BA53C740 libExtendedExtractor.so +08-17 19:45:06.638 F/google-breakpad(25655): M EAE32000 00000000 00006000 3B45281FC4EB699207799FD6018FBD910 libvendorconn.so +08-17 19:45:06.638 F/google-breakpad(25655): M EAEB2000 00000000 0005F000 7AC50A488023F3DA8182906BDFFA72C10 linker +08-17 19:45:06.638 F/google-breakpad(25655): -----END BREAKPAD MICRODUMP----- +08-17 19:45:26.056 F/google-breakpad(25833): -----BEGIN BREAKPAD MICRODUMP----- +08-17 19:45:26.057 F/google-breakpad(25833): V AndroidWebView:62.0.3188.0 +08-17 19:45:26.057 F/google-breakpad(25833): O A arm 08 armv8l Nokia/TA-1025_00WW/PLE:7.1.1/NMF26F/00WW_3_32C:user/release-keys +08-17 19:45:26.057 F/google-breakpad(25833): P webview +08-17 19:45:26.057 F/google-breakpad(25833): R 00000005 SIGTRAP 22F73000 +08-17 19:45:26.057 F/google-breakpad(25833): G +08-17 19:45:26.074 F/google-breakpad(25833): H 12C00000 FFF73000 00EE 31E89000 95FAB000 0C:1B 0D:0F 0E:0B 0F:35 10:06 11:05 12:05 13:1C 14:0D 15:0D 16:15 17:18 18:0A 19:03 1B:01 1C:02 1D:01 +08-17 19:45:26.076 F/google-breakpad(25833): S 0 C9472C60 C9472000 00002000 +08-17 19:45:26.077 F/google-breakpad(25833): S C9472000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.078 F/google-breakpad(25833): S C9472180 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.078 F/google-breakpad(25833): S C9472300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.079 F/google-breakpad(25833): S C9472480 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.079 F/google-breakpad(25833): S C9472600 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.080 F/google-breakpad(25833): S C9472780 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.081 F/google-breakpad(25833): S C9472900 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.081 F/google-breakpad(25833): S C9472A80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.082 F/google-breakpad(25833): S C9472C00 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C2D47C94C2D47C9502D47C98C2C47C9EDACEF0DEDACEF0D01000000242E47C9010000009D20FCD3EDACEF0DEDACEF0D00000000EDACEF0D0000000000000000EDACEF0DEDACEF0D0000000000000000BC2C47C901000000000000009002000000000000EDACEF0D00000000200000000000000000002CD4000000000000000000000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D00000000EDACEF0D0000000000000000EDACEF0D0000000000000000000000000000000020000000D02C47C9EDACEF0D502D47C94C2D47C9EDACEF0DEDACEF0DD5D92BD4EDACEF0DEDACEF0DEDACEF0D0000000003000000EDACEF0D0000000000000000EDACEF0DEDACEF0DEDACEF0DB7D72BD4C02D47C9B7EF57D2 +08-17 19:45:26.083 F/google-breakpad(25833): S C9472D80 00000000EDACEF0DEDACEF0D0000000000000000EDACEF0D000000000000000001000000EDACEF0D0000000000000000EDACEF0D000000000000000001000000EDACEF0D0000000000000000EDACEF0D000000000000000001000000010000000000000000000000FFFFFFFF000000000000000000000000FFFFFFFF01000000EDACEF0D7C2E47C9842E47C9882E47C9242E47C9D82E47C9782E47C98F0830D4EDACEF0DEDACEF0DEDACEF0DDD7755D2EDACEF0DD82E47C94C2E47C9482E47C9D82E47C9382F47C9742F47C9D82E47C900000000EDACEF0DEDACEF0DEDACEF0D3C3147C947733DD4D82E47C9802E47C9782E47C900000000EDACEF0DEDACEF0DEDACEF0D018D98D200000000000000000400000000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF070000001D00000000000000FFFFFFFF00000000FFFFFFFF00CB97D200000000EDACEF0D000000000000000000000000076291D2A03047C9EDACEF0D382F47C9EDACEF0D4543A7D400000000 +08-17 19:45:26.083 F/google-breakpad(25833): S C9472F00 083047C9EB8E3DD4A43047C902000000302F47C9EDACEF0D382F47C9EDACEF0DEDACEF0D3C000000EDACEF0DEDACEF0DEDACEF0D3C000000EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFFEDACEF0D6C0000000000000001000000EDACEF0DEDACEF0D742F6874EDACEF0D14617274EDACEF0DEDACEF0D3100000024000000EDACEF0D3C000000FFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFFA43047C9A03047C9343147C9EDACEF0D4543A7D400000000083047C93C3147C911A03DD400000000000000000C3047C9EDACEF0DEDACEF0DEDACEF0D00000000EDACEF0D00000000EDACEF0D02000000B9D89CD2EDACEF0DEDACEF0D203047C9703347C90000000001000000EDACEF0D00000000783447C923D89CD2000000000800000001000000006291D200000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFF00000000 +08-17 19:45:26.084 F/google-breakpad(25833): S C9473080 0000000000000000000000000000000007000000470000006D8741D4EDACEF0DEDACEF0DEDACEF0DEDACEF0DFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000003147C900000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000007000000470000000200000000000000EDACEF0DEDACEF0D000000000000000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000383247C94543A7D4EDACEF0D383247C9703347C9283247C9EDACEF0DEDACEF0D4543A7D400000000EDACEF0D783447C92DB773D200000000D5B0B6D425B0B6D42C0100007D933DD453E29CD253E29CD2CF228BD2CF228BD29C0A0000EDACEF0D090000009C0A0000000000007DF856D2EDACEF0D7D933DD453E29CD253E29CD2CF228BD2CF228BD2EDACEF0D383247C900000000783447C98D8064D2 +08-17 19:45:26.084 F/google-breakpad(25833): S C9473200 6E70E4D48970E4D400000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D0000000000000000A43247C90000000000000000EDACEF0DEDACEF0DEDACEF0D7B2B84EAEDACEF0DEDACEF0D783447C9B97855D2EDACEF0DA43247C9EDACEF0DEDACEF0DEDACEF0D090000000000000009000000EDACEF0DEDACEF0D0000000000000000EDACEF0DEDACEF0D0000000000000000D03547C9EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D383347C901000000EDACEF0DEDACEF0D783447C93FD49CD2EDACEF0D09000000083347C9EDACEF0D083347C9F03347C9043347C9AFA673D20100000021C973D2000000000000000001000000000000000000000000000000000000000000000000000000EDACEF0D1B000000FFFFFFFF703347C94F1B59D2EDACEF0D090000000000000000000000000000000000000025B0B6D4EDACEF0D00000000A1CE9CD29C0A000000000000EDACEF0D02000000943447C905000000EDACEF0D000000000000000000000000 +08-17 19:45:26.085 F/google-breakpad(25833): S C9473380 000000000000000000000000D5B0B6D425B0B6D42C0100007D933DD453E29CD253E29CD2CF228BD2CF228BD29C0A0000EDACEF0DE83347C99C0A000000000000EDACEF0DEDACEF0D0000000000000000EDACEF0D090000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000EDACEF0DEDACEF0D983447C90000000001000000D83447C900000000783447C9FBC69CD20000000000000000EDACEF0D09000000883447C9010000000000000000000000E8030000000000000000000000000000E8030000B03447C9EDACEF0D803447C900000000EDACEF0D00000000000000000000000000000000EDACEF0D09000000000000000000000000000000EDACEF0D0000000000000000EDACEF0D0900000000000000000000000000000000000000EDACEF0DEDACEF0D00000000EDACEF0DD03547C965CC73D20000000000000000EDACEF0D02000000EDACEF0D01000000EDACEF0D00000000D03547C9EDACEF0D0000000000000000 +08-17 19:45:26.086 F/google-breakpad(25833): S C9473500 0000000000000000EDACEF0D283747C9C03547C9EDACEF0DEDACEF0D747D92D400000000283747C9EDACEF0D2DB773D2EDACEF0D303747C9F03547C9EDACEF0DEDACEF0D747D92D4000000006BB773D201010000DC3547C9EDACEF0DEDACEF0DB000000080000000EDACEF0D7B2B84EA53E29CD253E29CD2CF228BD2CF228BD2178076D2DC3547C9EDACEF0D0000000007E29CD207E29CD207E29CD207E29CD200000000000000000000000000000000FC3547C9000000000000000000000000EDACEF0D00000000EDACEF0DF6FFFFFF00000000000000004000000000000000EDACEF0DEDACEF0D00000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EDACEF0DC43647C90000000000000000403847C9EDACEF0DEDACEF0D00000000283747C9A43647C9483747C92842A7D4EDACEF0D283747C9EDACEF0D5FB473D2303747C9C43647C9503747C92842A7D400000000303747C9 +08-17 19:45:26.086 F/google-breakpad(25833): S C9473680 503747C935B573D2EDACEF0DEDACEF0DEDACEF0DEDACEF0DFFFFFFFFC03647C9020000000000000000000000000000000000000077D5BED2EDACEF0D00000000F8FFFFFFEDACEF0DE43647C9EDACEF0DB83747C9EDACEF0D00000000000000000000000000000000EDACEF0DEDACEF0D283747C9EDACEF0DB83747C9EDACEF0DC83747C9283747C9703747C92BAA73D2EDACEF0DEDACEF0D01000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000000000000000000000000000000000000000000002843A7D42842A7D49601000053E29CD253E29CD2CF228BD2CF228BD2178076D2C9020000010047C900000000FFFFFFFFD0A4BDD20B000000F03747C900000000EDACEF0DEDACEF0DEDACEF0DAC3747C9FFFFFFFFE03747C9EDACEF0D010000006B9855D2EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000000000000000000000000000000000000000000002843A7D42842A7D49601000053E29CD253E29CD2CF228BD2CF228BD2178076D2C902000001000000D34657D2 +08-17 19:45:26.087 F/google-breakpad(25833): S C9473800 EDACEF0DEDACEF0DEDACEF0D01000000EDACEF0DEDACEF0D000000005B8173D2020000009BD47ED2CC3847C9403847C9EDACEF0D00000000CC3847C91FA773D20000000000000000EDACEF0D3100000020000000EDACEF0D00000000000000000000000000000000983847C9EDACEF0DEDACEF0DEDACEF0D943847C9EDACEF0D00000000CC3847C9000000006B9855D20000000000000000EDACEF0D214657D2000000000000000000000000B34557D2EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000498473D2EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00000000CC3847C9EDACEF0DEDACEF0D203947C978000000EDACEF0DEDACEF0DA38173D2203947C9CD2F82EA203947C9E52F82EA283947C9EF5C7FEA7800000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00100000000000000000000000000000000000005B8173D2EDACEF0D00000000EDACEF0D0100000000000000EDACEF0D00000000703947C9203947C91600000000000000 +08-17 19:45:26.087 F/google-breakpad(25833): S C9473980 00000000EDACEF0D00000000EDACEF0D0000000001000000EDACEF0D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000EDACEF0D01000000EDACEF0D000000000000000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D010000000100000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D00000000000000000000000000000000000000000000000001000000EDACEF0D01000000EDACEF0D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.088 F/google-breakpad(25833): S C9473B00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.089 F/google-breakpad(25833): S C9473C80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.089 F/google-breakpad(25833): S C9473E00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.089 F/google-breakpad(25833): S C9473F80 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.090 F/google-breakpad(25833): C 06000040000000000000000005B88FD2000000008C2C47C9CC2C47C960410046AC2C47C94C2D47C95C2D47C9502D47C9802E47C9D9C5F7D3602C47C91B89B3D28684B3D2300001680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:45:26.090 F/google-breakpad(25833): M AAAAA000 00000000 00005000 8D2477F3B51997BDCC3733B8D1F920BE0 app_process32 +08-17 19:45:26.090 F/google-breakpad(25833): M 70D29000 00000000 00806000 E9166D3ED622EE65A3A4086EBEA4A7950 boot.oat +08-17 19:45:26.090 F/google-breakpad(25833): M 71531000 00000000 006C0000 668D96384E4368B01BC9B9F365028CA20 boot-core-libart.oat +08-17 19:45:26.091 F/google-breakpad(25833): M 71BF3000 00000000 000AA000 0D160B642FB1639805B72AC6F4DF3F380 boot-conscrypt.oat +08-17 19:45:26.091 F/google-breakpad(25833): M 71C9F000 00000000 000D1000 9D69BDC94BD07F2468D5B7DB0AEEF0140 boot-okhttp.oat +08-17 19:45:26.091 F/google-breakpad(25833): M 71D72000 00000000 0000C000 566CD32860A984FD445A4852058609CB0 boot-core-junit.oat +08-17 19:45:26.091 F/google-breakpad(25833): M 71D80000 00000000 0019F000 09C1E8B1D7FC826CB75691EC5BDBA1DB0 boot-bouncycastle.oat +08-17 19:45:26.091 F/google-breakpad(25833): M 71F21000 00000000 0014B000 069BAE4D2D7831B857A3C236021D868A0 boot-ext.oat +08-17 19:45:26.091 F/google-breakpad(25833): M 7206E000 00000000 0223E000 D0BEBD37E215DDC845099212203F792F0 boot-framework.oat +08-17 19:45:26.091 F/google-breakpad(25833): M 742AE000 00000000 00502000 B41E052DBA2949CE100713743053E1E40 boot-telephony-common.oat +08-17 19:45:26.091 F/google-breakpad(25833): M 747B2000 00000000 0003D000 65E4B1E28F33F9C51062E2D0630394830 boot-voip-common.oat +08-17 19:45:26.092 F/google-breakpad(25833): M 747F1000 00000000 00045000 EB491A6AF6568A675D81746238ACC78B0 boot-ims-common.oat +08-17 19:45:26.092 F/google-breakpad(25833): M 74838000 00000000 0016C000 C369D6D4F8DCF10CC0AD1800000000000 boot-apache-xml.oat +08-17 19:45:26.092 F/google-breakpad(25833): M 749A6000 00000000 000FF000 1FAC5317B0FEBD01C31E8039D76CCAF50 boot-org.apache.http.legacy.boot.oat +08-17 19:45:26.092 F/google-breakpad(25833): M 74AA7000 00000000 00004000 C368F8D0F8DCF10C00BE1800000000000 boot-tcmiface.oat +08-17 19:45:26.092 F/google-breakpad(25833): M 74AAD000 00000000 00016000 C368FA40F8DCF10C3FB11800000000000 boot-WfdCommon.oat +08-17 19:45:26.092 F/google-breakpad(25833): M 74AC5000 00000000 00004000 A2EDD62E4499B2C98D8C251F0977951B0 boot-oem-services.oat +08-17 19:45:26.092 F/google-breakpad(25833): M 74ACB000 00000000 0001C000 3794BA12A18F802DF4E8F10D4B2662FB0 boot-qcom.fmradio.oat +08-17 19:45:26.092 F/google-breakpad(25833): M 74AE9000 00000000 00009000 C368F9A8F8DCF10C95B41800000000000 boot-qcmediaplayer.oat +08-17 19:45:26.092 F/google-breakpad(25833): M 74AF4000 00000000 00008000 C368E898F8DCF10CDEAD1800000000000 boot-telephony-ext.oat +08-17 19:45:26.093 F/google-breakpad(25833): M 74AFE000 00000000 00013000 C368E46FF8DCF10CA3A11800000000000 boot-dolby_ds2.oat +08-17 19:45:26.093 F/google-breakpad(25833): M 74B13000 00000000 0000A000 C368F9E4F8DCF10C41B01800000000000 boot-dolby_ds1.oat +08-17 19:45:26.093 F/google-breakpad(25833): M C6B80000 00000000 00005000 F841612CF1D458AB70296575A996EE5F0 QPerformance.odex +08-17 19:45:26.093 F/google-breakpad(25833): M CB999000 00000000 00856000 000003F10000000031270A00000000000 base.odex +08-17 19:45:26.093 F/google-breakpad(25833): M CCAF6000 00000000 00936000 00000F700000000098480B00000000000 base.odex +08-17 19:45:26.093 F/google-breakpad(25833): M CF4C6000 00000000 02000000 000000000000000000000000000000000 dalvik-jit-code-cache (deleted) +08-17 19:45:26.093 F/google-breakpad(25833): M D2273000 04247000 02C94000 8A2EFA0DECC3EF7057A1C62BF1AECCA80 libmonochrome.so +08-17 19:45:26.093 F/google-breakpad(25833): M D9155000 00000000 00004000 C1741AE46077EF13F70D0DC7D8A9DDE80 libwebviewchromium_loader.so +08-17 19:45:26.093 F/google-breakpad(25833): M D9276000 00000000 00006000 C700FED4854EA9F553FC4EB1AC49DAD50 libqdutils.so +08-17 19:45:26.093 F/google-breakpad(25833): M D927F000 00000000 00007000 5AF3845B7F31952390092BB2318667B00 gralloc.msm8937.so +08-17 19:45:26.094 F/google-breakpad(25833): M D926B000 00000000 00823000 A91A29ADD65BB0AF28A4C9A6208E33C40 libllvm-glnext.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9AB7000 00000000 00316000 9F7E6C49A0A8C88C317716B031320CA30 libESXGLESv2_adreno.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9F1F000 00000000 0000C000 CEC6F7F71723450F4D1E527FA1BDDA310 libqservice.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9F30000 00000000 00007000 BB9F7CD0BF1178F273EB8B4D2D5C67C30 libmemalloc.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9F39000 00000000 00003000 B4B80A1B5D6C50F5C0DD7F1C29A9F6C10 libqdMetaData.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9F43000 00000000 00009000 0BA85EA850C07E5B86AF8281EF7641E70 libcompiler_rt.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9F4E000 00000000 0000B000 362BA72B9CF73AB8BD02283F491283E40 eglSubDriverAndroid.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9F5B000 00000000 0000B000 9BAA0F603A10810D4A6BEE7A903A762F0 libGLESv2_adreno.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9F68000 00000000 00007000 C08FDBDAB5792096DB0BEDBE3D23B48D0 libGLESv1_CM_adreno.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9F71000 00000000 00024000 C346DBBCF27F603F9321CCF737B3C0550 libESXGLESv1_CM_adreno.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9F97000 00000000 00010000 A7800610AD28E2DF469D023E70516C190 libESXEGL_adreno.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9FAB000 00000000 00006000 6CC274368542A8270BC225BE519068D80 libadreno_utils.so +08-17 19:45:26.094 F/google-breakpad(25833): M D9FBC000 00000000 00009000 649C0C218A9C0A611E5E0DB24CDD058C0 libEGL_adreno.so +08-17 19:45:26.094 F/google-breakpad(25833): M DA4BC000 00000000 00020000 1195E0A668F3644AC0EC8D1122457A140 libkeymaster1.so +08-17 19:45:26.095 F/google-breakpad(25833): M DA4DF000 00000000 00018000 39E3D5620A966F5DB960EEE55CCD8BB30 libsoftkeymasterdevice.so +08-17 19:45:26.095 F/google-breakpad(25833): M DA4F9000 00000000 0001A000 C1B07DA2D52E6EC3C54992A3A953D63B0 libjavacrypto.so +08-17 19:45:26.095 F/google-breakpad(25833): M DA516000 00000000 00004000 B051A444B9312E4DAF242DA3A951538A0 libkeystore-engine.so +08-17 19:45:26.095 F/google-breakpad(25833): M DA51B000 00000000 00016000 1988D915061DDC4921FF608AD3E810AD0 libkeystore_binder.so +08-17 19:45:26.095 F/google-breakpad(25833): M DA534000 00000000 0000C000 DDF063ABB28459B09548F8329934DDEB0 libkeymaster_messages.so +08-17 19:45:26.095 F/google-breakpad(25833): M DC57D000 00000000 00016000 A686CFCA0E870C10B425EB769017BE930 libmtp.so +08-17 19:45:26.095 F/google-breakpad(25833): M DC593000 00000000 00052000 E9F8299757E5E543C03723101E5B1BEC0 libmedia_jni.so +08-17 19:45:26.095 F/google-breakpad(25833): M DC5E8000 00000000 00020000 ADF61BE35FF269EC7E7B32B1DDCD31E00 libexif.so +08-17 19:45:26.095 F/google-breakpad(25833): M DC616000 00000000 0000E000 ABA3C77DD3386AE87B586632CE1979D50 libstagefright_amrnb_common.so +08-17 19:45:26.095 F/google-breakpad(25833): M DC634000 00000000 00007000 CD70BA801CA3E12D258565013535D7440 tcmclient.odex +08-17 19:45:26.095 F/google-breakpad(25833): M DC645000 00000000 00004000 042B2B738C75036986EB80BC08A71F060 libextmedia_jni.so +08-17 19:45:26.095 F/google-breakpad(25833): M E1E9B000 00000000 002B2000 FCA7431984CE2AEF979FFEEF99432D320 libart-compiler.so +08-17 19:45:26.095 F/google-breakpad(25833): M E215E000 00000000 000B1000 1EBE7A1A3E1A3134DE689251E1ABC0380 libvixl.so +08-17 19:45:26.095 F/google-breakpad(25833): M E2264000 00000000 0002B000 6E46C8EDE63F81CC2A4375E4F85517CD0 libopenjdk.so +08-17 19:45:26.096 F/google-breakpad(25833): M E2291000 00000000 00029000 4F845000DEA8066D684FEAB08A91A3480 libjavacore.so +08-17 19:45:26.096 F/google-breakpad(25833): M E22BC000 00000000 00138000 523FDEBEF6ECE577AF3716E9703AD4FF0 lib-imsqimf.so +08-17 19:45:26.096 F/google-breakpad(25833): M E23FA000 00000000 00004000 48E9F68098728AFF9A198AE7A14A7F700 libmdmdetect.so +08-17 19:45:26.096 F/google-breakpad(25833): M E2400000 00000000 00005000 12F24D77003A5660A06BA8690696A5C30 libconfigdb.so +08-17 19:45:26.096 F/google-breakpad(25833): M E2405000 00000000 00085000 DB9D3DADFB06F6B1AB9CEC5443F295370 lib-imsxml.so +08-17 19:45:26.096 F/google-breakpad(25833): M E2496000 00000000 00005000 F812502D41A460BDD2D9AA83A9564CC70 libqmi_encdec.so +08-17 19:45:26.096 F/google-breakpad(25833): M E249C000 00000000 0001C000 A53A45C88FFCD4CB3AFF323AF8FFFBAB0 libqdi.so +08-17 19:45:26.096 F/google-breakpad(25833): M E24B7000 00000000 0006A000 D110B55DE7DB9FD5086D2D1CE57152480 libdsi_netctrl.so +08-17 19:45:26.096 F/google-breakpad(25833): M E2534000 00000000 00023000 E7FB6A8B99C97103F258028CF27324660 lib-imsrcscm.so +08-17 19:45:26.096 F/google-breakpad(25833): M E255A000 00000000 0001C000 5BE35B9E5D50332052532AE119C50B930 libnetmgr.so +08-17 19:45:26.096 F/google-breakpad(25833): M E257A000 00000000 00004000 AB354652140A356C9787104C87CB30E00 libidl.so +08-17 19:45:26.096 F/google-breakpad(25833): M E2581000 00000000 00004000 63ED38853810ED69BA1AA57CE82E74B10 libtime_genoff.so +08-17 19:45:26.096 F/google-breakpad(25833): M E2587000 00000000 00004000 51134658113749962ABB7BA3A3C5E9740 libqmi_client_helper.so +08-17 19:45:26.096 F/google-breakpad(25833): M E258E000 00000000 00009000 1D288EC9F32773EBC0D380D4E238D8D60 libqmi_client_qmux.so +08-17 19:45:26.097 F/google-breakpad(25833): M E25C9000 00000000 0006A000 60BAE0DAB14BFBC4BE1805CC4CAF8B4D0 lib-imsdpl.so +08-17 19:45:26.097 F/google-breakpad(25833): M E263D000 00000000 00019000 0333752023452FF1E40F6BA9169471500 libdiag.so +08-17 19:45:26.097 F/google-breakpad(25833): M E274E000 00000000 0002C000 0FC3AF7C85EA4B0DA653AEA111020A2D0 libqmi.so +08-17 19:45:26.097 F/google-breakpad(25833): M E27B7000 00000000 000B8000 023971CEF8E022AAD4090C7D1432C3690 libCB.so +08-17 19:45:26.097 F/google-breakpad(25833): M E7D93000 00000000 00461000 39CBB6C545073B5DB56B60665F81D4B00 libart.so +08-17 19:45:26.097 F/google-breakpad(25833): M E8384000 00000000 00001000 7691C4BE084B030B3AA118A6F412EE260 libqmi_common_so.so +08-17 19:45:26.097 F/google-breakpad(25833): M E8387000 00000000 0000A000 37A576E22F2B9973E1734E556E1E99990 libqmi_cci.so +08-17 19:45:26.097 F/google-breakpad(25833): M E8395000 00000000 00003000 DCDF68ACFBFC2DEFC89FA0F5783199070 libpackagelistparser.so +08-17 19:45:26.097 F/google-breakpad(25833): M E839A000 00000000 00056000 0C1D30C5E6EA7E82800A2B00935E4B060 libharfbuzz_ng.so +08-17 19:45:26.097 F/google-breakpad(25833): M E83F3000 00000000 00037000 8AF00237A05209C2E429D0F70ED3EB900 libopus.so +08-17 19:45:26.097 F/google-breakpad(25833): M E842C000 00000000 00017000 215A7F63855CB46EC59B425BEDFD847D0 libminikin.so +08-17 19:45:26.097 F/google-breakpad(25833): M E8447000 00000000 00018000 EAB4CCC4544F5D8E2ECF256D527F4A430 libutils.so +08-17 19:45:26.097 F/google-breakpad(25833): M E8461000 00000000 0001E000 CCAA49412B791630FD4EAD7755A3E4CD0 libvorbisidec.so +08-17 19:45:26.097 F/google-breakpad(25833): M E8481000 00000000 00008000 F3F7CCE4ADD14C5DB852DF06407AE2FA0 libcamera_metadata.so +08-17 19:45:26.098 F/google-breakpad(25833): M E848C000 00000000 0000E000 1F6ED3D6536346B3B20CF40C5F9799D80 liblog.so +08-17 19:45:26.098 F/google-breakpad(25833): M E849D000 00000000 00010000 D6821B30C7A106C623EEE331974C9BF50 libGLESv2.so +08-17 19:45:26.098 F/google-breakpad(25833): M E84AF000 00000000 00014000 22B107B0382117ED603FF6000B248B8D0 libpcre.so +08-17 19:45:26.098 F/google-breakpad(25833): M E84C4000 00000000 00040000 9CC9AFC89D88D4C4AE6AEF2E290594B70 libinputflinger.so +08-17 19:45:26.098 F/google-breakpad(25833): M E8508000 00000000 00005000 459EC08F2C9F91A7E6AB6F293540B4510 libstdc++.so +08-17 19:45:26.098 F/google-breakpad(25833): M E850F000 00000000 00005000 DE5A396AAF801AF9A298A50BADE143E60 libspeexresampler.so +08-17 19:45:26.098 F/google-breakpad(25833): M E84F0000 00000000 00B36000 F1644AA2ACE475925E0DA02A814C13DF0 libLLVM.so +08-17 19:45:26.098 F/google-breakpad(25833): M E9081000 00000000 00008000 225E121AA129BB96606A1B3B91A2737A0 libnbaio.so +08-17 19:45:26.098 F/google-breakpad(25833): M E908C000 00000000 00017000 9A6B379EB3F10874FC241C570801C6070 libmemunreachable.so +08-17 19:45:26.098 F/google-breakpad(25833): M E909C000 00000000 0005F000 0FAC08487B9CD62449A19C8D161E7D820 libgui.so +08-17 19:45:26.098 F/google-breakpad(25833): M E9109000 00000000 00004000 E9B0F0A724940363FCBE11FB96B6ADF30 libnativebridge.so +08-17 19:45:26.098 F/google-breakpad(25833): M E910D000 00000000 0007B000 B44B5897A497DCB27C105B61AC30F1180 libhwui.so +08-17 19:45:26.098 F/google-breakpad(25833): M E918B000 00000000 0008B000 DCAB7F6AA60C5E74587E56973C6653120 libc++.so +08-17 19:45:26.098 F/google-breakpad(25833): M E921C000 00000000 00003000 3C7CC5BEA31C9C85C9BC25EC0891B7B10 libsync.so +08-17 19:45:26.098 F/google-breakpad(25833): M E9221000 00000000 00009000 4334A7FB3D1CB8582D4D676DE6E5E2930 libpiex.so +08-17 19:45:26.099 F/google-breakpad(25833): M E922A000 00000000 0000E000 EBD0DA428C58F5CBD72761DD6F1C03A10 libsoundtrigger.so +08-17 19:45:26.099 F/google-breakpad(25833): M E923D000 00000000 00020000 27C83DAE0AB0E161280BB40C384BD4BC0 libm.so +08-17 19:45:26.099 F/google-breakpad(25833): M E925F000 00000000 00003000 C9108BAA1E466D60D4591919420BBB6A0 libradio_metadata.so +08-17 19:45:26.099 F/google-breakpad(25833): M E9264000 00000000 0000E000 63E3F027146D592F9FBE03A33EDC8C6D0 libimg_utils.so +08-17 19:45:26.099 F/google-breakpad(25833): M E9275000 00000000 00015000 53AF0C4E2096697687AC0081AC7AD97C0 libunwind.so +08-17 19:45:26.099 F/google-breakpad(25833): M E92D0000 00000000 0001F000 9F74D840029038F65C040D5492CAE7360 libinput.so +08-17 19:45:26.099 F/google-breakpad(25833): M E92F5000 00000000 00005000 17620CAE201DC01DFD868F3276E8AA810 libpowermanager.so +08-17 19:45:26.099 F/google-breakpad(25833): M E92FD000 00000000 00055000 5E4B1D0F4D553AA92665AE0925229AF40 libsonivox.so +08-17 19:45:26.099 F/google-breakpad(25833): M E9359000 00000000 00006000 E727B84B0F5B3D982CAE8FB6E64B88030 libtiff_directory.so +08-17 19:45:26.099 F/google-breakpad(25833): M E9362000 00000000 00021000 52D2F4BBC71C3EE2E161E009B0331EF80 libstagefright_foundation.so +08-17 19:45:26.099 F/google-breakpad(25833): M E9386000 00000000 0003B000 2D4A4F8139C7842165EA73A6ACD835340 libjpeg.so +08-17 19:45:26.099 F/google-breakpad(25833): M E93C3000 00000000 00003000 9945E8F5AE0ADE1ED46FA08B41A6C9BE0 libmemtrack.so +08-17 19:45:26.099 F/google-breakpad(25833): M E93C6000 00000000 00019000 D2D0067E628DCC03418B99399D251A990 libEGL.so +08-17 19:45:26.099 F/google-breakpad(25833): M E93E4000 00000000 00019000 6534179E8DC7D8EDBF1236C375D51ECD0 libdrmframework.so +08-17 19:45:26.100 F/google-breakpad(25833): M E93FB000 00000000 00110000 994744AF5261DAC7CD0003EC5456DBDF0 libicuuc.so +08-17 19:45:26.100 F/google-breakpad(25833): M E9519000 00000000 00015000 BDA36CE4717D8C1A324C7CA4E1CA9B860 libvulkan.so +08-17 19:45:26.100 F/google-breakpad(25833): M E9521000 00000000 000F8000 91002184018FFAC8E26ECCB238E392440 libandroid_runtime.so +08-17 19:45:26.100 F/google-breakpad(25833): M E962A000 00000000 00004000 644559B020FD089F8180BB62CF9420590 libprocessgroup.so +08-17 19:45:26.100 F/google-breakpad(25833): M E9629000 00000000 00183000 035813361AA690A2E08F1E059823C9D50 libicui18n.so +08-17 19:45:26.100 F/google-breakpad(25833): M E97B8000 00000000 00008000 9D6466250A83301B3BE4CAA85227525D0 libnativeloader.so +08-17 19:45:26.100 F/google-breakpad(25833): M E97C0000 00000000 0000E000 031F092D2D476376D52F41FD2ADD2A3E0 libradio.so +08-17 19:45:26.100 F/google-breakpad(25833): M E97D2000 00000000 00003000 159F2CAC750E3DB60EF444F05BACCC850 libregionalization.so +08-17 19:45:26.100 F/google-breakpad(25833): M E97D8000 00000000 00008000 16C813B71CC34E81BCF6F5DD8648DC3B0 libGLESv1_CM.so +08-17 19:45:26.100 F/google-breakpad(25833): M E97E2000 00000000 00003000 AA06FF77B6E4CC83470C006104304D0F0 libhardware.so +08-17 19:45:26.100 F/google-breakpad(25833): M E97E0000 00000000 00039000 B613B07CCC9703A9AAE92861C92202BD0 libcamera_client.so +08-17 19:45:26.100 F/google-breakpad(25833): M E980D000 00000000 003A9000 42F6682A5C7E8B66743C6087B578D6C40 libskia.so +08-17 19:45:26.100 F/google-breakpad(25833): M E9BDC000 00000000 00007000 AD9132F0D394659639CBE5858DD1BB750 libhardware_legacy.so +08-17 19:45:26.100 F/google-breakpad(25833): M E9BE7000 00000000 00005000 EE5BF022DE057918231B46C6EDDC38690 libstagefright_yuv.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9BEE000 00000000 00007000 9BC1C9D1E638BF1B7B32AC308B08D9DA0 libimage_type_recognition.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9BF7000 00000000 0000D000 3C492E547FA88D7E2E85BD9451F613090 libbacktrace.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9C07000 00000000 00007000 B165EC37228240E1EBEDC14160C16A3A0 libnativehelper.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9C10000 00000000 0001A000 4D1780AFB25B59BBD625608B400D70C20 libprotobuf-cpp-lite.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9C2D000 00000000 00004000 989F274AF037FE14219BE6DC42503B950 libnetd_client.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9C33000 00000000 000A0000 8E23BB4E73E86B4A2AD4C17D7BAFD8A90 libcrypto.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9CE0000 00000000 00003000 675D9BCC56AB210C8017D6625F994D250 libstagefright_enc_common.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9CE5000 00000000 00024000 CC51150390EA9EFB0315C02573CCFD000 libpng.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9D0B000 00000000 0003B000 4FBF4968372FEB1C8D593076E1B171610 libRScpp.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9D49000 00000000 0000A000 415DAD77CED2441456E20CAD35C536250 libRS.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9D55000 00000000 00004000 F168A985060F7993C937719998C96FD20 libusbhost.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9D5B000 00000000 00086000 58C592B73EA51A0AFC3287247961D0940 libdng_sdk.so +08-17 19:45:26.101 F/google-breakpad(25833): M E9DE1000 00000000 00057000 44C1EA73F38E47E95712BF5848E8937E0 libbinder.so +08-17 19:45:26.102 F/google-breakpad(25833): M E9E3F000 00000000 0002E000 2824A9CACA3A870AD713A3405D6249530 libwilhelm.so +08-17 19:45:26.102 F/google-breakpad(25833): M E9E72000 00000000 00030000 E9CE28F8F628E4501925FF4D0FD6168F0 libstagefright_omx.so +08-17 19:45:26.102 F/google-breakpad(25833): M E9EA0000 00000000 00487000 3CD6A967C46ED23F4AB4B39092B43AB70 libpdfium.so +08-17 19:45:26.102 F/google-breakpad(25833): M EA337000 00000000 00004000 76B7583F8773D45C53E165CABC841DE70 libETC1.so +08-17 19:45:26.102 F/google-breakpad(25833): M EA33D000 00000000 00015000 F0658EC8F5FCD09AB82C2EFC3A6834210 libui.so +08-17 19:45:26.102 F/google-breakpad(25833): M EA355000 00000000 00038000 E4F681ED6DAD0F793516317FBE3DD55A0 libRS_internal.so +08-17 19:45:26.102 F/google-breakpad(25833): M EA390000 00000000 00016000 0DB58A0AF796EA03A43AAD505A8723310 liblzma.so +08-17 19:45:26.102 F/google-breakpad(25833): M EA3AE000 00000000 00011000 2618247A47A298A5C4574CC818C7F3280 libselinux.so +08-17 19:45:26.102 F/google-breakpad(25833): M EA3C1000 00000000 00005000 961542B344C4A0F54F87B49C0F1429E80 libwpa_client.so +08-17 19:45:26.102 F/google-breakpad(25833): M EA3C8000 00000000 00007000 5FF53AA38050A1DE3BF7A4D755DC75B70 libaudioutils.so +08-17 19:45:26.102 F/google-breakpad(25833): M EA3D1000 00000000 00017000 31235ADAF427BE11933CD87290CCAF050 libcutils.so +08-17 19:45:26.102 F/google-breakpad(25833): M EA3EB000 00000000 00036000 CBC6DC0C255BAB785FCD0511A7CBF0690 libbcinfo.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA423000 00000000 00003000 FDA204F888F3C0D8070BFDEC834066D20 libstagefright_http_support.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA428000 00000000 00005000 14FB257C9C6F43C8FA0B475D81C47FFC0 libbinary_parse.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA42F000 00000000 00009000 93F30055C78E1D80E40A8E717405CF500 libmediautils.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA43B000 00000000 0000A000 0F98C20EB2725367604DCE7EDA8EED9D0 libbase.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA447000 00000000 00016000 DC1FEB19B377562139F4F8AAFFA610710 libz.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA460000 00000000 00015000 68F77CDFB35DA081E510A50D11F299D70 libexpat.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA45D000 00000000 000C3000 3B22B766CDBB99263CF24B4CC2986E510 libmedia.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA541000 00000000 00031000 335A60B9AA0F00A47BD5A781CCA820740 libandroidfw.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA574000 00000000 0007A000 21086BE83826AA7DC32AB49C79D5CCE30 libsqlite.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA5F2000 00000000 0006C000 6EA54A19597F20D46626700FE9F206F50 libft2.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA64F000 00000000 0016B000 4E69F13734FEABE1CA5BA98594235DCD0 libstagefright.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA7D3000 00000000 00007000 475E29D0A243BEE93EC1A630C99503FC0 libnetutils.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA7DC000 00000000 00084000 49B02E01AEC77331A1D6D19B540265610 libc.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA86E000 00000000 00025000 8B6ECC65C09CAFF5ACAAB6C9249CD2C20 libssl.so +08-17 19:45:26.103 F/google-breakpad(25833): M EA896000 00000000 00008000 22114C778A7ED1CC3953CCB22323EA1B0 libstagefright_avc_common.so +08-17 19:45:26.104 F/google-breakpad(25833): M EA8A1000 00000000 00003000 7FA19C935E6148BD8002A3CA630C4E6F0 libsmemlog.so +08-17 19:45:26.104 F/google-breakpad(25833): M EA8A1000 00000000 00017000 EEAF8ABB6827B80A458A5D483E5562400 libqmiservices.so +08-17 19:45:26.104 F/google-breakpad(25833): M EA8C1000 00000000 00008000 090640ECFC69E16A25A3E27006AF282E0 libxml.so +08-17 19:45:26.104 F/google-breakpad(25833): M EA8CC000 00000000 00012000 67F4D476A96F053ACB61531379FCC4810 libdsutils.so +08-17 19:45:26.104 F/google-breakpad(25833): M EA8EF000 00000000 00014000 EFD5F0A0F81252A037F1C06B8E6809700 libsdsprpc.so +08-17 19:45:26.104 F/google-breakpad(25833): M EA905000 00000000 0003E000 C4311189AF8DA8405EDC0701CD38FC770 libgsl.so +08-17 19:45:26.104 F/google-breakpad(25833): M EA99F000 00000000 00014000 75BC34362D3F387A08AE8241CED8E2550 libadsprpc.so +08-17 19:45:26.104 F/google-breakpad(25833): M EA9B2000 00000000 0001A000 840BD6EAC45DEFC59D2F1E8C681CFF1A0 lib-imsrcscmclient.so +08-17 19:45:26.104 F/google-breakpad(25833): M EA9DA000 00000000 00011000 6034A9FBADF19CE6C259DA006E8158FC0 lib-imsrcscmservice.so +08-17 19:45:26.104 F/google-breakpad(25833): M EAA09000 00000000 00003000 7BB31E1D28279A11B8087C3F4DF7D0BA0 libqti-at.so +08-17 19:45:26.104 F/google-breakpad(25833): M EAA0E000 00000000 0000C000 7D5A1CA22F6A85FCC57B3D36A92461560 lib-ims-rcscmjni.so +08-17 19:45:26.104 F/google-breakpad(25833): M EAA1C000 00000000 00012000 FAD2DBDF65F36590FFE591C62DBEFA1E0 libOpenCL.so +08-17 19:45:26.104 F/google-breakpad(25833): M EAA38000 00000000 00003000 025B4D5BBA39265D6260B27597E321730 memtrack.msm8937.so +08-17 19:45:26.104 F/google-breakpad(25833): M EAA3D000 00000000 00011000 F5FF7C8214A82029405A068BCDF69A580 libmediandk.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAA53000 00000000 00008000 5373A05304D5AFD8BC2BB49D6C22977D0 libopenjdkjvm.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAA5C000 00000000 0000F000 96A60B84ED1352C202B6695FD32373790 libmediadrm.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAA6E000 00000000 00010000 3D880E60A39C482BA4210DA0AD4E20490 libGLESv3.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAA97000 00000000 00003000 F4CB54FA6F9A644292CE2DCC9FA89DA80 libqti_performance.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAA9D000 00000000 00004000 B2EAC3688B9EFF0E79EA2C170AA859C50 libwebviewchromium_plat_support.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAAA5000 00000000 00004000 837BE31E60CD67A2C45BF27A1E8C10140 libOpenSLES.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAAAB000 00000000 00004000 3C4D0169CD09A3AEEC0868A7FC87CCFA0 libOpenMAXAL.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAAB0000 00000000 00016000 BAF17608D25635EFA63708C89561474D0 libcamera2ndk.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAB53000 00000000 00003000 78C8F6360CF612E4333D4EB1796927460 libqti-perfd-client.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAB57000 00000000 00014000 01EE9AC4109E06B182E77B55242AEBE20 libandroid.so +08-17 19:45:26.105 F/google-breakpad(25833): M EABAF000 00000000 00003000 4C4B6F03AF5049885FD4A43F149D13630 libjnigraphics.so +08-17 19:45:26.105 F/google-breakpad(25833): M EABB0000 00000000 00090000 FBA40D2822A0C6DCF7CE29FB42DC37230 libmediaplayerservice.so +08-17 19:45:26.105 F/google-breakpad(25833): M EAC7B000 00000000 0000A000 52C41240B217BFE92F7381218169FD760 liblz4.so +08-17 19:45:26.105 F/google-breakpad(25833): M EACF9000 00000000 00038000 FEF1DA3EC5AA99E4FF38C1DF2A9A91570 libavenhancements.so +08-17 19:45:26.106 F/google-breakpad(25833): M EAD35000 00000000 0002F000 85E4C8F7646AA02A46215564266690BA0 libstagefright_wfd.so +08-17 19:45:26.106 F/google-breakpad(25833): M EAD6A000 00000000 00026000 7B91D8B6A15FF171BF114D8D638785D80 libstagefright_httplive.so +08-17 19:45:26.106 F/google-breakpad(25833): M EAD94000 00000000 00003000 6DE080E13BB1741A34C157CE97277ABD0 libsigchain.so +08-17 19:45:26.106 F/google-breakpad(25833): M EADE7000 00000000 00003000 1390052238CBD9474F1747EA0BA53C740 libExtendedExtractor.so +08-17 19:45:26.106 F/google-breakpad(25833): M EAE32000 00000000 00006000 3B45281FC4EB699207799FD6018FBD910 libvendorconn.so +08-17 19:45:26.106 F/google-breakpad(25833): M EAEB2000 00000000 0005F000 7AC50A488023F3DA8182906BDFFA72C10 linker +08-17 19:45:26.106 F/google-breakpad(25833): -----END BREAKPAD MICRODUMP----- +08-17 19:47:07.900 F/google-breakpad(26081): -----BEGIN BREAKPAD MICRODUMP----- +08-17 19:47:07.900 F/google-breakpad(26081): V AndroidWebView:62.0.3188.0 +08-17 19:47:07.901 F/google-breakpad(26081): O A arm 08 armv8l Nokia/TA-1025_00WW/PLE:7.1.1/NMF26F/00WW_3_32C:user/release-keys +08-17 19:47:07.901 F/google-breakpad(26081): P webview +08-17 19:47:07.901 F/google-breakpad(26081): R 00000005 SIGTRAP 29627000 +08-17 19:47:07.901 F/google-breakpad(26081): G +08-17 19:47:07.913 F/google-breakpad(26081): H 12C00000 FFF73000 0108 31E89000 9516B000 0C:12 0D:13 0E:13 0F:3A 10:07 11:05 12:12 13:20 14:0F 15:0E 16:19 17:12 18:07 19:05 1B:01 1C:02 1D:01 +08-17 19:47:07.914 F/google-breakpad(26081): S 0 C94F5C60 C94F5000 00002000 +08-17 19:47:07.914 F/google-breakpad(26081): S C94F5000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.915 F/google-breakpad(26081): S C94F5180 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.915 F/google-breakpad(26081): S C94F5300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.916 F/google-breakpad(26081): S C94F5480 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.916 F/google-breakpad(26081): S C94F5600 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.917 F/google-breakpad(26081): S C94F5780 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.917 F/google-breakpad(26081): S C94F5900 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.918 F/google-breakpad(26081): S C94F5A80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.918 F/google-breakpad(26081): S C94F5C00 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C5D4FC94C5D4FC9505D4FC98C5C4FC9EDACEF0DEDACEF0D01000000245E4FC9010000009D20FCD3EDACEF0DEDACEF0D00000000EDACEF0D02000000EDACEF0DEDACEF0DEDACEF0D0000000000000000BC5C4FC901000000000000005206000000000000EDACEF0D00000000200000000000000000002CD4000000000000000000000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D00000000EDACEF0D0000000000000000EDACEF0D0000000000000000000000000000000020000000D05C4FC9EDACEF0D505D4FC94C5D4FC9EDACEF0DEDACEF0DD5D92BD4EDACEF0DEDACEF0DEDACEF0D0000000003000000EDACEF0D0000000002000000EDACEF0DEDACEF0DEDACEF0DB7D72BD424000000EDACEF0D +08-17 19:47:07.919 F/google-breakpad(26081): S C94F5D80 F85D4FC9EDACEF0DEDACEF0D0200000000000000EDACEF0D000000000200000001000000EDACEF0D0200000000000000EDACEF0D000000000200000001000000EDACEF0D0000000002000000EDACEF0D000000000200000001000000EDACEF0D0000000000000000FFFFFFFF000000000000000000000000FFFFFFFF01000000EDACEF0D7C5E4FC9845E4FC9885E4FC9245E4FC9D85E4FC9785E4FC98F0830D4EDACEF0DEDACEF0DEDACEF0DDD7755D2EDACEF0DD85E4FC94C5E4FC9485E4FC9D85E4FC9385F4FC9745F4FC9D85E4FC900000000EDACEF0DEDACEF0DEDACEF0D3C614FC947733DD4D85E4FC9805E4FC9785E4FC901000000EDACEF0DEDACEF0DEDACEF0D018D98D200000000000000000400000000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF070000001D00000000000000FFFFFFFF00000000FFFFFFFF00CB97D20000000001B056D2000000000000000000000000F05E4FC9A0604FC9EDACEF0D385F4FC9EDACEF0D4543A7D400000000 +08-17 19:47:07.919 F/google-breakpad(26081): S C94F5F00 08604FC9EB8E3DD4A4604FC9DF8697D2EDACEF0DE38598D2EDACEF0DEDACEF0DEDACEF0D62000000EDACEF0DEDACEF0DEDACEF0D62000000EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFFEDACEF0D6C0000000000000001000000EDACEF0DEDACEF0D742F6874EDACEF0DEDACEF0DEDACEF0D000000003100000024000000EDACEF0D62000000FFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFFA4604FC9A0604FC934614FC9EDACEF0D4543A7D40000000008604FC93C614FC911A03DD400000000000000000C604FC9EDACEF0DEDACEF0DEDACEF0D00000000EDACEF0D00000000EDACEF0D02000000B9D89CD2EDACEF0DEDACEF0D20604FC970634FC90000000003000000EDACEF0D0000000078644FC923D89CD200000000080000000100000095CD90D2EDACEF0D4543A7D400000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D000000000100000000000000EDACEF0DEDACEF0D00000000000000004543A7D400000000EDACEF0D97C090D2EDACEF0DEDACEF0D +08-17 19:47:07.920 F/google-breakpad(26081): S C94F6080 9C604FC900000000EDACEF0D00000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D00604FC9EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000614FC900000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000002D000000620000000200000000000000EDACEF0DEDACEF0D000000000000000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000038624FC94543A7D4EDACEF0D38624FC970634FC928624FC9EDACEF0DEDACEF0D4543A7D400000000EDACEF0D78644FC92DB773D2EDACEF0DEDACEF0DD9C68DD2F1C68DD2EDACEF0D07000000EDACEF0DD9C68DD20700000065C38DD2EDACEF0D0900000009000000EDACEF0D7DF856D2EDACEF0D7D933DD4CF228BD2CF228BD2178076D2013B65D2EDACEF0D38624FC90000000078644FC98D8064D2 +08-17 19:47:07.920 F/google-breakpad(26081): S C94F6200 6E70E4D48970E4D400000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D0000000000000000A4624FC90000000000000000EDACEF0DEDACEF0DEDACEF0D7B2B84EAEDACEF0DEDACEF0D78644FC9B97855D2EDACEF0DA4624FC9EDACEF0DEDACEF0DEDACEF0D090000000000000009000000EDACEF0DEDACEF0D0000000000000000EDACEF0DEDACEF0D0000000000000000D0654FC9EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D38634FC903000000EDACEF0DEDACEF0D78644FC93FD49CD2EDACEF0D09000000010000006B9855D2FC624FC90000000048634FC900000000EDACEF0DEDACEF0D0900000005E09CD209000000EDACEF0D0000000000000000000000000000000000000000EDACEF0D1B000000FFFFFFFF70634FC94F1B59D2EDACEF0D090000000000000000000000000000000000000025B0B6D4EDACEF0D00000000A1CE9CD2EDACEF0D00000000EDACEF0D0200000094644FC905000000EDACEF0D000000000000000000000000 +08-17 19:47:07.921 F/google-breakpad(26081): S C94F6380 000000000000000000000000D5B0B6D425B0B6D42C0100007D933DD4CF228BD2CF228BD2178076D2013B65D2EDACEF0DEDACEF0DE8634FC9EDACEF0D00000000EDACEF0DEDACEF0D0000000000000000EDACEF0D090000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000EDACEF0DEDACEF0D98644FC90000000003000000D8644FC90000000078644FC9FBC69CD20000000000000000EDACEF0D0900000088644FC9000000000000000000000000E8030000000000000000000000000000E8030000B0644FC9EDACEF0D80644FC900000000EDACEF0D00000000000000000000000000000000EDACEF0D09000000000000000000000000000000EDACEF0D0000000000000000EDACEF0D0900000000000000000000000000000000000000EDACEF0DEDACEF0D00000000EDACEF0DD0654FC965CC73D2000000000000000000000000000000000000000000000000EDACEF0D00000000D0654FC9EDACEF0D0000000000000000 +08-17 19:47:07.921 F/google-breakpad(26081): S C94F6500 0000000000000000EDACEF0D28674FC9C0654FC9EDACEF0DEDACEF0D747D92D40000000028674FC9EDACEF0D2DB773D2EDACEF0D30674FC9F0654FC9EDACEF0DEDACEF0D747D92D4000000006BB773D201010000DC654FC9EDACEF0DEDACEF0DB000000080000000EDACEF0D7B2B84EACF228BD2CF228BD2178076D2013B65D2479B9CD2DC654FC9EDACEF0D0000000007E29CD253E29CD2CF228BD2CF228BD200000000000000000000000000000000FC654FC9000000000000000000000000EDACEF0D00000000EDACEF0DF6FFFFFF00000000000000004000000000000000EDACEF0DEDACEF0D000000000000000000000000000000002000000000000000000000000000000000000000EDACEF0D000000000000000000000000F76985EA0000000000000000EDACEF0D00000000000000000000000040684FC9EDACEF0DEDACEF0D0000000028674FC9A4664FC948674FC92842A7D4EDACEF0D28674FC9EDACEF0D5FB473D230674FC9C4664FC950674FC92842A7D40000000030674FC9 +08-17 19:47:07.922 F/google-breakpad(26081): S C94F6680 50674FC935B573D2EDACEF0DEDACEF0DEDACEF0DEDACEF0DFFFFFFFFC0664FC9020000000000000000000000000000000000000077D5BED2EDACEF0D00000000FCFFFFFFEDACEF0DE4664FC9EDACEF0DB8674FC9EDACEF0D00000000000000000000000000000000EDACEF0DEDACEF0D28674FC9EDACEF0DB8674FC9EDACEF0DC8674FC928674FC970674FC92BAA73D2EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000000000000000000000000000000000000000000007642A7D42842A7D4C9000000CF228BD2CF228BD2178076D2013B65D2479B9CD2F708000001004FC900000000FFFFFFFFD0A4BDD202000000F0674FC900000000EDACEF0DEDACEF0DEDACEF0DAC674FC9FFFFFFFFE0674FC9EDACEF0D010000006B9855D2EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000000000000000000000000000000000000000000007642A7D42842A7D4C9000000CF228BD2CF228BD2178076D2013B65D2479B9CD2F708000001000000D34657D2 +08-17 19:47:07.922 F/google-breakpad(26081): S C94F6800 EDACEF0DEDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D000000005B8173D2020000009BD47ED2CC684FC940684FC9EDACEF0D00000000CC684FC91FA773D20000000000000000EDACEF0D3100000020000000EDACEF0D0000000000000000000000000000000098684FC9EDACEF0DEDACEF0DEDACEF0D94684FC9EDACEF0D00000000CC684FC9000000006B9855D20000000000000000EDACEF0D214657D2000000000000000000000000B34557D2EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000498473D2EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00000000CC684FC9EDACEF0DEDACEF0D20694FC978000000EDACEF0DEDACEF0DA38173D220694FC9CD2F82EA20694FC9E52F82EA28694FC9EF5C7FEA7800000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00100000000000000000000000000000000000005B8173D2EDACEF0D00000000EDACEF0D0100000000000000EDACEF0D0000000070694FC920694FC91600000000000000 +08-17 19:47:07.923 F/google-breakpad(26081): S C94F6980 00000000EDACEF0D00000000EDACEF0D0000000001000000EDACEF0D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000EDACEF0D01000000EDACEF0D000000000000000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D010000000100000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D00000000000000000000000000000000000000000000000001000000EDACEF0D01000000EDACEF0D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.923 F/google-breakpad(26081): S C94F6B00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.924 F/google-breakpad(26081): S C94F6C80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.924 F/google-breakpad(26081): S C94F6E00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.924 F/google-breakpad(26081): S C94F6F80 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.925 F/google-breakpad(26081): C 06000040000000000000000005B88FD2020000008C5C4FC9CC5C4FC918F76A2CAC5C4FC94C5D4FC95C5D4FC9505D4FC9805E4FC9D9C5F7D3605C4FC91B89B3D28684B3D2300001680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:07.925 F/google-breakpad(26081): M AAAAA000 00000000 00005000 8D2477F3B51997BDCC3733B8D1F920BE0 app_process32 +08-17 19:47:07.925 F/google-breakpad(26081): M 70D29000 00000000 00806000 E9166D3ED622EE65A3A4086EBEA4A7950 boot.oat +08-17 19:47:07.925 F/google-breakpad(26081): M 71531000 00000000 006C0000 668D96384E4368B01BC9B9F365028CA20 boot-core-libart.oat +08-17 19:47:07.926 F/google-breakpad(26081): M 71BF3000 00000000 000AA000 0D160B642FB1639805B72AC6F4DF3F380 boot-conscrypt.oat +08-17 19:47:07.926 F/google-breakpad(26081): M 71C9F000 00000000 000D1000 9D69BDC94BD07F2468D5B7DB0AEEF0140 boot-okhttp.oat +08-17 19:47:07.926 F/google-breakpad(26081): M 71D72000 00000000 0000C000 566CD32860A984FD445A4852058609CB0 boot-core-junit.oat +08-17 19:47:07.926 F/google-breakpad(26081): M 71D80000 00000000 0019F000 09C1E8B1D7FC826CB75691EC5BDBA1DB0 boot-bouncycastle.oat +08-17 19:47:07.926 F/google-breakpad(26081): M 71F21000 00000000 0014B000 069BAE4D2D7831B857A3C236021D868A0 boot-ext.oat +08-17 19:47:07.926 F/google-breakpad(26081): M 7206E000 00000000 0223E000 D0BEBD37E215DDC845099212203F792F0 boot-framework.oat +08-17 19:47:07.926 F/google-breakpad(26081): M 742AE000 00000000 00502000 B41E052DBA2949CE100713743053E1E40 boot-telephony-common.oat +08-17 19:47:07.926 F/google-breakpad(26081): M 747B2000 00000000 0003D000 65E4B1E28F33F9C51062E2D0630394830 boot-voip-common.oat +08-17 19:47:07.926 F/google-breakpad(26081): M 747F1000 00000000 00045000 EB491A6AF6568A675D81746238ACC78B0 boot-ims-common.oat +08-17 19:47:07.927 F/google-breakpad(26081): M 74838000 00000000 0016C000 C369D6D4F8DCF10CC0AD1800000000000 boot-apache-xml.oat +08-17 19:47:07.927 F/google-breakpad(26081): M 749A6000 00000000 000FF000 1FAC5317B0FEBD01C31E8039D76CCAF50 boot-org.apache.http.legacy.boot.oat +08-17 19:47:07.927 F/google-breakpad(26081): M 74AA7000 00000000 00004000 C368F8D0F8DCF10C00BE1800000000000 boot-tcmiface.oat +08-17 19:47:07.927 F/google-breakpad(26081): M 74AAD000 00000000 00016000 C368FA40F8DCF10C3FB11800000000000 boot-WfdCommon.oat +08-17 19:47:07.927 F/google-breakpad(26081): M 74AC5000 00000000 00004000 A2EDD62E4499B2C98D8C251F0977951B0 boot-oem-services.oat +08-17 19:47:07.927 F/google-breakpad(26081): M 74ACB000 00000000 0001C000 3794BA12A18F802DF4E8F10D4B2662FB0 boot-qcom.fmradio.oat +08-17 19:47:07.927 F/google-breakpad(26081): M 74AE9000 00000000 00009000 C368F9A8F8DCF10C95B41800000000000 boot-qcmediaplayer.oat +08-17 19:47:07.927 F/google-breakpad(26081): M 74AF4000 00000000 00008000 C368E898F8DCF10CDEAD1800000000000 boot-telephony-ext.oat +08-17 19:47:07.927 F/google-breakpad(26081): M 74AFE000 00000000 00013000 C368E46FF8DCF10CA3A11800000000000 boot-dolby_ds2.oat +08-17 19:47:07.927 F/google-breakpad(26081): M 74B13000 00000000 0000A000 C368F9E4F8DCF10C41B01800000000000 boot-dolby_ds1.oat +08-17 19:47:07.927 F/google-breakpad(26081): M C7D92000 00000000 00005000 F841612CF1D458AB70296575A996EE5F0 QPerformance.odex +08-17 19:47:07.928 F/google-breakpad(26081): M CBA19000 00000000 00856000 000003F10000000031270A00000000000 base.odex +08-17 19:47:07.928 F/google-breakpad(26081): M CCAF6000 00000000 00936000 00000F700000000098480B00000000000 base.odex +08-17 19:47:07.928 F/google-breakpad(26081): M CF4C6000 00000000 02000000 000000000000000000000000000000000 dalvik-jit-code-cache (deleted) +08-17 19:47:07.928 F/google-breakpad(26081): M D2273000 04247000 02C94000 8A2EFA0DECC3EF7057A1C62BF1AECCA80 libmonochrome.so +08-17 19:47:07.928 F/google-breakpad(26081): M D9155000 00000000 00004000 C1741AE46077EF13F70D0DC7D8A9DDE80 libwebviewchromium_loader.so +08-17 19:47:07.928 F/google-breakpad(26081): M D9276000 00000000 00006000 C700FED4854EA9F553FC4EB1AC49DAD50 libqdutils.so +08-17 19:47:07.928 F/google-breakpad(26081): M D927F000 00000000 00007000 5AF3845B7F31952390092BB2318667B00 gralloc.msm8937.so +08-17 19:47:07.928 F/google-breakpad(26081): M D926B000 00000000 00823000 A91A29ADD65BB0AF28A4C9A6208E33C40 libllvm-glnext.so +08-17 19:47:07.928 F/google-breakpad(26081): M D9AB7000 00000000 00316000 9F7E6C49A0A8C88C317716B031320CA30 libESXGLESv2_adreno.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9F1F000 00000000 0000C000 CEC6F7F71723450F4D1E527FA1BDDA310 libqservice.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9F30000 00000000 00007000 BB9F7CD0BF1178F273EB8B4D2D5C67C30 libmemalloc.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9F39000 00000000 00003000 B4B80A1B5D6C50F5C0DD7F1C29A9F6C10 libqdMetaData.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9F43000 00000000 00009000 0BA85EA850C07E5B86AF8281EF7641E70 libcompiler_rt.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9F4E000 00000000 0000B000 362BA72B9CF73AB8BD02283F491283E40 eglSubDriverAndroid.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9F5B000 00000000 0000B000 9BAA0F603A10810D4A6BEE7A903A762F0 libGLESv2_adreno.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9F68000 00000000 00007000 C08FDBDAB5792096DB0BEDBE3D23B48D0 libGLESv1_CM_adreno.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9F71000 00000000 00024000 C346DBBCF27F603F9321CCF737B3C0550 libESXGLESv1_CM_adreno.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9F97000 00000000 00010000 A7800610AD28E2DF469D023E70516C190 libESXEGL_adreno.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9FAB000 00000000 00006000 6CC274368542A8270BC225BE519068D80 libadreno_utils.so +08-17 19:47:07.929 F/google-breakpad(26081): M D9FBC000 00000000 00009000 649C0C218A9C0A611E5E0DB24CDD058C0 libEGL_adreno.so +08-17 19:47:07.929 F/google-breakpad(26081): M DA4BC000 00000000 00020000 1195E0A668F3644AC0EC8D1122457A140 libkeymaster1.so +08-17 19:47:07.929 F/google-breakpad(26081): M DA4DF000 00000000 00018000 39E3D5620A966F5DB960EEE55CCD8BB30 libsoftkeymasterdevice.so +08-17 19:47:07.929 F/google-breakpad(26081): M DA4F9000 00000000 0001A000 C1B07DA2D52E6EC3C54992A3A953D63B0 libjavacrypto.so +08-17 19:47:07.929 F/google-breakpad(26081): M DA516000 00000000 00004000 B051A444B9312E4DAF242DA3A951538A0 libkeystore-engine.so +08-17 19:47:07.929 F/google-breakpad(26081): M DA51B000 00000000 00016000 1988D915061DDC4921FF608AD3E810AD0 libkeystore_binder.so +08-17 19:47:07.930 F/google-breakpad(26081): M DA534000 00000000 0000C000 DDF063ABB28459B09548F8329934DDEB0 libkeymaster_messages.so +08-17 19:47:07.930 F/google-breakpad(26081): M DC57D000 00000000 00016000 A686CFCA0E870C10B425EB769017BE930 libmtp.so +08-17 19:47:07.930 F/google-breakpad(26081): M DC593000 00000000 00052000 E9F8299757E5E543C03723101E5B1BEC0 libmedia_jni.so +08-17 19:47:07.930 F/google-breakpad(26081): M DC5E8000 00000000 00020000 ADF61BE35FF269EC7E7B32B1DDCD31E00 libexif.so +08-17 19:47:07.930 F/google-breakpad(26081): M DC616000 00000000 0000E000 ABA3C77DD3386AE87B586632CE1979D50 libstagefright_amrnb_common.so +08-17 19:47:07.930 F/google-breakpad(26081): M DC634000 00000000 00007000 CD70BA801CA3E12D258565013535D7440 tcmclient.odex +08-17 19:47:07.930 F/google-breakpad(26081): M DC645000 00000000 00004000 042B2B738C75036986EB80BC08A71F060 libextmedia_jni.so +08-17 19:47:07.930 F/google-breakpad(26081): M E1E9B000 00000000 002B2000 FCA7431984CE2AEF979FFEEF99432D320 libart-compiler.so +08-17 19:47:07.930 F/google-breakpad(26081): M E215E000 00000000 000B1000 1EBE7A1A3E1A3134DE689251E1ABC0380 libvixl.so +08-17 19:47:07.930 F/google-breakpad(26081): M E2264000 00000000 0002B000 6E46C8EDE63F81CC2A4375E4F85517CD0 libopenjdk.so +08-17 19:47:07.930 F/google-breakpad(26081): M E2291000 00000000 00029000 4F845000DEA8066D684FEAB08A91A3480 libjavacore.so +08-17 19:47:07.930 F/google-breakpad(26081): M E22BC000 00000000 00138000 523FDEBEF6ECE577AF3716E9703AD4FF0 lib-imsqimf.so +08-17 19:47:07.930 F/google-breakpad(26081): M E23FA000 00000000 00004000 48E9F68098728AFF9A198AE7A14A7F700 libmdmdetect.so +08-17 19:47:07.930 F/google-breakpad(26081): M E2400000 00000000 00005000 12F24D77003A5660A06BA8690696A5C30 libconfigdb.so +08-17 19:47:07.931 F/google-breakpad(26081): M E2405000 00000000 00085000 DB9D3DADFB06F6B1AB9CEC5443F295370 lib-imsxml.so +08-17 19:47:07.931 F/google-breakpad(26081): M E2496000 00000000 00005000 F812502D41A460BDD2D9AA83A9564CC70 libqmi_encdec.so +08-17 19:47:07.931 F/google-breakpad(26081): M E249C000 00000000 0001C000 A53A45C88FFCD4CB3AFF323AF8FFFBAB0 libqdi.so +08-17 19:47:07.931 F/google-breakpad(26081): M E24B7000 00000000 0006A000 D110B55DE7DB9FD5086D2D1CE57152480 libdsi_netctrl.so +08-17 19:47:07.931 F/google-breakpad(26081): M E2534000 00000000 00023000 E7FB6A8B99C97103F258028CF27324660 lib-imsrcscm.so +08-17 19:47:07.931 F/google-breakpad(26081): M E255A000 00000000 0001C000 5BE35B9E5D50332052532AE119C50B930 libnetmgr.so +08-17 19:47:07.931 F/google-breakpad(26081): M E257A000 00000000 00004000 AB354652140A356C9787104C87CB30E00 libidl.so +08-17 19:47:07.931 F/google-breakpad(26081): M E2581000 00000000 00004000 63ED38853810ED69BA1AA57CE82E74B10 libtime_genoff.so +08-17 19:47:07.931 F/google-breakpad(26081): M E2587000 00000000 00004000 51134658113749962ABB7BA3A3C5E9740 libqmi_client_helper.so +08-17 19:47:07.931 F/google-breakpad(26081): M E258E000 00000000 00009000 1D288EC9F32773EBC0D380D4E238D8D60 libqmi_client_qmux.so +08-17 19:47:07.931 F/google-breakpad(26081): M E25C9000 00000000 0006A000 60BAE0DAB14BFBC4BE1805CC4CAF8B4D0 lib-imsdpl.so +08-17 19:47:07.931 F/google-breakpad(26081): M E263D000 00000000 00019000 0333752023452FF1E40F6BA9169471500 libdiag.so +08-17 19:47:07.931 F/google-breakpad(26081): M E274E000 00000000 0002C000 0FC3AF7C85EA4B0DA653AEA111020A2D0 libqmi.so +08-17 19:47:07.931 F/google-breakpad(26081): M E27B7000 00000000 000B8000 023971CEF8E022AAD4090C7D1432C3690 libCB.so +08-17 19:47:07.931 F/google-breakpad(26081): M E7D93000 00000000 00461000 39CBB6C545073B5DB56B60665F81D4B00 libart.so +08-17 19:47:07.931 F/google-breakpad(26081): M E8384000 00000000 00001000 7691C4BE084B030B3AA118A6F412EE260 libqmi_common_so.so +08-17 19:47:07.932 F/google-breakpad(26081): M E8387000 00000000 0000A000 37A576E22F2B9973E1734E556E1E99990 libqmi_cci.so +08-17 19:47:07.932 F/google-breakpad(26081): M E8395000 00000000 00003000 DCDF68ACFBFC2DEFC89FA0F5783199070 libpackagelistparser.so +08-17 19:47:07.932 F/google-breakpad(26081): M E839A000 00000000 00056000 0C1D30C5E6EA7E82800A2B00935E4B060 libharfbuzz_ng.so +08-17 19:47:07.932 F/google-breakpad(26081): M E83F3000 00000000 00037000 8AF00237A05209C2E429D0F70ED3EB900 libopus.so +08-17 19:47:07.932 F/google-breakpad(26081): M E842C000 00000000 00017000 215A7F63855CB46EC59B425BEDFD847D0 libminikin.so +08-17 19:47:07.932 F/google-breakpad(26081): M E8447000 00000000 00018000 EAB4CCC4544F5D8E2ECF256D527F4A430 libutils.so +08-17 19:47:07.932 F/google-breakpad(26081): M E8461000 00000000 0001E000 CCAA49412B791630FD4EAD7755A3E4CD0 libvorbisidec.so +08-17 19:47:07.932 F/google-breakpad(26081): M E8481000 00000000 00008000 F3F7CCE4ADD14C5DB852DF06407AE2FA0 libcamera_metadata.so +08-17 19:47:07.932 F/google-breakpad(26081): M E848C000 00000000 0000E000 1F6ED3D6536346B3B20CF40C5F9799D80 liblog.so +08-17 19:47:07.932 F/google-breakpad(26081): M E849D000 00000000 00010000 D6821B30C7A106C623EEE331974C9BF50 libGLESv2.so +08-17 19:47:07.932 F/google-breakpad(26081): M E84AF000 00000000 00014000 22B107B0382117ED603FF6000B248B8D0 libpcre.so +08-17 19:47:07.932 F/google-breakpad(26081): M E84C4000 00000000 00040000 9CC9AFC89D88D4C4AE6AEF2E290594B70 libinputflinger.so +08-17 19:47:07.932 F/google-breakpad(26081): M E8508000 00000000 00005000 459EC08F2C9F91A7E6AB6F293540B4510 libstdc++.so +08-17 19:47:07.932 F/google-breakpad(26081): M E850F000 00000000 00005000 DE5A396AAF801AF9A298A50BADE143E60 libspeexresampler.so +08-17 19:47:07.932 F/google-breakpad(26081): M E84F0000 00000000 00B36000 F1644AA2ACE475925E0DA02A814C13DF0 libLLVM.so +08-17 19:47:07.933 F/google-breakpad(26081): M E9081000 00000000 00008000 225E121AA129BB96606A1B3B91A2737A0 libnbaio.so +08-17 19:47:07.933 F/google-breakpad(26081): M E908C000 00000000 00017000 9A6B379EB3F10874FC241C570801C6070 libmemunreachable.so +08-17 19:47:07.933 F/google-breakpad(26081): M E909C000 00000000 0005F000 0FAC08487B9CD62449A19C8D161E7D820 libgui.so +08-17 19:47:07.933 F/google-breakpad(26081): M E9109000 00000000 00004000 E9B0F0A724940363FCBE11FB96B6ADF30 libnativebridge.so +08-17 19:47:07.933 F/google-breakpad(26081): M E910D000 00000000 0007B000 B44B5897A497DCB27C105B61AC30F1180 libhwui.so +08-17 19:47:07.933 F/google-breakpad(26081): M E918B000 00000000 0008B000 DCAB7F6AA60C5E74587E56973C6653120 libc++.so +08-17 19:47:07.933 F/google-breakpad(26081): M E921C000 00000000 00003000 3C7CC5BEA31C9C85C9BC25EC0891B7B10 libsync.so +08-17 19:47:07.933 F/google-breakpad(26081): M E9221000 00000000 00009000 4334A7FB3D1CB8582D4D676DE6E5E2930 libpiex.so +08-17 19:47:07.933 F/google-breakpad(26081): M E922A000 00000000 0000E000 EBD0DA428C58F5CBD72761DD6F1C03A10 libsoundtrigger.so +08-17 19:47:07.933 F/google-breakpad(26081): M E923D000 00000000 00020000 27C83DAE0AB0E161280BB40C384BD4BC0 libm.so +08-17 19:47:07.933 F/google-breakpad(26081): M E925F000 00000000 00003000 C9108BAA1E466D60D4591919420BBB6A0 libradio_metadata.so +08-17 19:47:07.933 F/google-breakpad(26081): M E9264000 00000000 0000E000 63E3F027146D592F9FBE03A33EDC8C6D0 libimg_utils.so +08-17 19:47:07.933 F/google-breakpad(26081): M E9275000 00000000 00015000 53AF0C4E2096697687AC0081AC7AD97C0 libunwind.so +08-17 19:47:07.933 F/google-breakpad(26081): M E92D0000 00000000 0001F000 9F74D840029038F65C040D5492CAE7360 libinput.so +08-17 19:47:07.933 F/google-breakpad(26081): M E92F5000 00000000 00005000 17620CAE201DC01DFD868F3276E8AA810 libpowermanager.so +08-17 19:47:07.933 F/google-breakpad(26081): M E92FD000 00000000 00055000 5E4B1D0F4D553AA92665AE0925229AF40 libsonivox.so +08-17 19:47:07.933 F/google-breakpad(26081): M E9359000 00000000 00006000 E727B84B0F5B3D982CAE8FB6E64B88030 libtiff_directory.so +08-17 19:47:07.934 F/google-breakpad(26081): M E9362000 00000000 00021000 52D2F4BBC71C3EE2E161E009B0331EF80 libstagefright_foundation.so +08-17 19:47:07.934 F/google-breakpad(26081): M E9386000 00000000 0003B000 2D4A4F8139C7842165EA73A6ACD835340 libjpeg.so +08-17 19:47:07.934 F/google-breakpad(26081): M E93C3000 00000000 00003000 9945E8F5AE0ADE1ED46FA08B41A6C9BE0 libmemtrack.so +08-17 19:47:07.934 F/google-breakpad(26081): M E93C6000 00000000 00019000 D2D0067E628DCC03418B99399D251A990 libEGL.so +08-17 19:47:07.934 F/google-breakpad(26081): M E93E4000 00000000 00019000 6534179E8DC7D8EDBF1236C375D51ECD0 libdrmframework.so +08-17 19:47:07.934 F/google-breakpad(26081): M E93FB000 00000000 00110000 994744AF5261DAC7CD0003EC5456DBDF0 libicuuc.so +08-17 19:47:07.934 F/google-breakpad(26081): M E9519000 00000000 00015000 BDA36CE4717D8C1A324C7CA4E1CA9B860 libvulkan.so +08-17 19:47:07.934 F/google-breakpad(26081): M E9521000 00000000 000F8000 91002184018FFAC8E26ECCB238E392440 libandroid_runtime.so +08-17 19:47:07.934 F/google-breakpad(26081): M E962A000 00000000 00004000 644559B020FD089F8180BB62CF9420590 libprocessgroup.so +08-17 19:47:07.934 F/google-breakpad(26081): M E9629000 00000000 00183000 035813361AA690A2E08F1E059823C9D50 libicui18n.so +08-17 19:47:07.934 F/google-breakpad(26081): M E97B8000 00000000 00008000 9D6466250A83301B3BE4CAA85227525D0 libnativeloader.so +08-17 19:47:07.934 F/google-breakpad(26081): M E97C0000 00000000 0000E000 031F092D2D476376D52F41FD2ADD2A3E0 libradio.so +08-17 19:47:07.934 F/google-breakpad(26081): M E97D2000 00000000 00003000 159F2CAC750E3DB60EF444F05BACCC850 libregionalization.so +08-17 19:47:07.934 F/google-breakpad(26081): M E97D8000 00000000 00008000 16C813B71CC34E81BCF6F5DD8648DC3B0 libGLESv1_CM.so +08-17 19:47:07.934 F/google-breakpad(26081): M E97E2000 00000000 00003000 AA06FF77B6E4CC83470C006104304D0F0 libhardware.so +08-17 19:47:07.934 F/google-breakpad(26081): M E97E0000 00000000 00039000 B613B07CCC9703A9AAE92861C92202BD0 libcamera_client.so +08-17 19:47:07.935 F/google-breakpad(26081): M E980D000 00000000 003A9000 42F6682A5C7E8B66743C6087B578D6C40 libskia.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9BDC000 00000000 00007000 AD9132F0D394659639CBE5858DD1BB750 libhardware_legacy.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9BE7000 00000000 00005000 EE5BF022DE057918231B46C6EDDC38690 libstagefright_yuv.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9BEE000 00000000 00007000 9BC1C9D1E638BF1B7B32AC308B08D9DA0 libimage_type_recognition.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9BF7000 00000000 0000D000 3C492E547FA88D7E2E85BD9451F613090 libbacktrace.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9C07000 00000000 00007000 B165EC37228240E1EBEDC14160C16A3A0 libnativehelper.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9C10000 00000000 0001A000 4D1780AFB25B59BBD625608B400D70C20 libprotobuf-cpp-lite.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9C2D000 00000000 00004000 989F274AF037FE14219BE6DC42503B950 libnetd_client.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9C33000 00000000 000A0000 8E23BB4E73E86B4A2AD4C17D7BAFD8A90 libcrypto.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9CE0000 00000000 00003000 675D9BCC56AB210C8017D6625F994D250 libstagefright_enc_common.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9CE5000 00000000 00024000 CC51150390EA9EFB0315C02573CCFD000 libpng.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9D0B000 00000000 0003B000 4FBF4968372FEB1C8D593076E1B171610 libRScpp.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9D49000 00000000 0000A000 415DAD77CED2441456E20CAD35C536250 libRS.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9D55000 00000000 00004000 F168A985060F7993C937719998C96FD20 libusbhost.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9D5B000 00000000 00086000 58C592B73EA51A0AFC3287247961D0940 libdng_sdk.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9DE1000 00000000 00057000 44C1EA73F38E47E95712BF5848E8937E0 libbinder.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9E3F000 00000000 0002E000 2824A9CACA3A870AD713A3405D6249530 libwilhelm.so +08-17 19:47:07.935 F/google-breakpad(26081): M E9E72000 00000000 00030000 E9CE28F8F628E4501925FF4D0FD6168F0 libstagefright_omx.so +08-17 19:47:07.936 F/google-breakpad(26081): M E9EA0000 00000000 00487000 3CD6A967C46ED23F4AB4B39092B43AB70 libpdfium.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA337000 00000000 00004000 76B7583F8773D45C53E165CABC841DE70 libETC1.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA33D000 00000000 00015000 F0658EC8F5FCD09AB82C2EFC3A6834210 libui.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA355000 00000000 00038000 E4F681ED6DAD0F793516317FBE3DD55A0 libRS_internal.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA390000 00000000 00016000 0DB58A0AF796EA03A43AAD505A8723310 liblzma.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA3AE000 00000000 00011000 2618247A47A298A5C4574CC818C7F3280 libselinux.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA3C1000 00000000 00005000 961542B344C4A0F54F87B49C0F1429E80 libwpa_client.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA3C8000 00000000 00007000 5FF53AA38050A1DE3BF7A4D755DC75B70 libaudioutils.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA3D1000 00000000 00017000 31235ADAF427BE11933CD87290CCAF050 libcutils.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA3EB000 00000000 00036000 CBC6DC0C255BAB785FCD0511A7CBF0690 libbcinfo.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA423000 00000000 00003000 FDA204F888F3C0D8070BFDEC834066D20 libstagefright_http_support.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA428000 00000000 00005000 14FB257C9C6F43C8FA0B475D81C47FFC0 libbinary_parse.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA42F000 00000000 00009000 93F30055C78E1D80E40A8E717405CF500 libmediautils.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA43B000 00000000 0000A000 0F98C20EB2725367604DCE7EDA8EED9D0 libbase.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA447000 00000000 00016000 DC1FEB19B377562139F4F8AAFFA610710 libz.so +08-17 19:47:07.936 F/google-breakpad(26081): M EA460000 00000000 00015000 68F77CDFB35DA081E510A50D11F299D70 libexpat.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA45D000 00000000 000C3000 3B22B766CDBB99263CF24B4CC2986E510 libmedia.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA541000 00000000 00031000 335A60B9AA0F00A47BD5A781CCA820740 libandroidfw.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA574000 00000000 0007A000 21086BE83826AA7DC32AB49C79D5CCE30 libsqlite.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA5F2000 00000000 0006C000 6EA54A19597F20D46626700FE9F206F50 libft2.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA64F000 00000000 0016B000 4E69F13734FEABE1CA5BA98594235DCD0 libstagefright.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA7D3000 00000000 00007000 475E29D0A243BEE93EC1A630C99503FC0 libnetutils.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA7DC000 00000000 00084000 49B02E01AEC77331A1D6D19B540265610 libc.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA86E000 00000000 00025000 8B6ECC65C09CAFF5ACAAB6C9249CD2C20 libssl.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA896000 00000000 00008000 22114C778A7ED1CC3953CCB22323EA1B0 libstagefright_avc_common.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA8A1000 00000000 00003000 7FA19C935E6148BD8002A3CA630C4E6F0 libsmemlog.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA8A1000 00000000 00017000 EEAF8ABB6827B80A458A5D483E5562400 libqmiservices.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA8C1000 00000000 00008000 090640ECFC69E16A25A3E27006AF282E0 libxml.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA8CC000 00000000 00012000 67F4D476A96F053ACB61531379FCC4810 libdsutils.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA8EF000 00000000 00014000 EFD5F0A0F81252A037F1C06B8E6809700 libsdsprpc.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA905000 00000000 0003E000 C4311189AF8DA8405EDC0701CD38FC770 libgsl.so +08-17 19:47:07.937 F/google-breakpad(26081): M EA99F000 00000000 00014000 75BC34362D3F387A08AE8241CED8E2550 libadsprpc.so +08-17 19:47:07.938 F/google-breakpad(26081): M EA9B2000 00000000 0001A000 840BD6EAC45DEFC59D2F1E8C681CFF1A0 lib-imsrcscmclient.so +08-17 19:47:07.938 F/google-breakpad(26081): M EA9DA000 00000000 00011000 6034A9FBADF19CE6C259DA006E8158FC0 lib-imsrcscmservice.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAA09000 00000000 00003000 7BB31E1D28279A11B8087C3F4DF7D0BA0 libqti-at.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAA0E000 00000000 0000C000 7D5A1CA22F6A85FCC57B3D36A92461560 lib-ims-rcscmjni.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAA1C000 00000000 00012000 FAD2DBDF65F36590FFE591C62DBEFA1E0 libOpenCL.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAA38000 00000000 00003000 025B4D5BBA39265D6260B27597E321730 memtrack.msm8937.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAA3D000 00000000 00011000 F5FF7C8214A82029405A068BCDF69A580 libmediandk.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAA53000 00000000 00008000 5373A05304D5AFD8BC2BB49D6C22977D0 libopenjdkjvm.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAA5C000 00000000 0000F000 96A60B84ED1352C202B6695FD32373790 libmediadrm.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAA6E000 00000000 00010000 3D880E60A39C482BA4210DA0AD4E20490 libGLESv3.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAA97000 00000000 00003000 F4CB54FA6F9A644292CE2DCC9FA89DA80 libqti_performance.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAA9D000 00000000 00004000 B2EAC3688B9EFF0E79EA2C170AA859C50 libwebviewchromium_plat_support.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAAA5000 00000000 00004000 837BE31E60CD67A2C45BF27A1E8C10140 libOpenSLES.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAAAB000 00000000 00004000 3C4D0169CD09A3AEEC0868A7FC87CCFA0 libOpenMAXAL.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAAB0000 00000000 00016000 BAF17608D25635EFA63708C89561474D0 libcamera2ndk.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAB53000 00000000 00003000 78C8F6360CF612E4333D4EB1796927460 libqti-perfd-client.so +08-17 19:47:07.938 F/google-breakpad(26081): M EAB57000 00000000 00014000 01EE9AC4109E06B182E77B55242AEBE20 libandroid.so +08-17 19:47:07.939 F/google-breakpad(26081): M EABAF000 00000000 00003000 4C4B6F03AF5049885FD4A43F149D13630 libjnigraphics.so +08-17 19:47:07.939 F/google-breakpad(26081): M EABB0000 00000000 00090000 FBA40D2822A0C6DCF7CE29FB42DC37230 libmediaplayerservice.so +08-17 19:47:07.939 F/google-breakpad(26081): M EAC7B000 00000000 0000A000 52C41240B217BFE92F7381218169FD760 liblz4.so +08-17 19:47:07.939 F/google-breakpad(26081): M EACF9000 00000000 00038000 FEF1DA3EC5AA99E4FF38C1DF2A9A91570 libavenhancements.so +08-17 19:47:07.939 F/google-breakpad(26081): M EAD35000 00000000 0002F000 85E4C8F7646AA02A46215564266690BA0 libstagefright_wfd.so +08-17 19:47:07.939 F/google-breakpad(26081): M EAD6A000 00000000 00026000 7B91D8B6A15FF171BF114D8D638785D80 libstagefright_httplive.so +08-17 19:47:07.939 F/google-breakpad(26081): M EAD94000 00000000 00003000 6DE080E13BB1741A34C157CE97277ABD0 libsigchain.so +08-17 19:47:07.939 F/google-breakpad(26081): M EADE7000 00000000 00003000 1390052238CBD9474F1747EA0BA53C740 libExtendedExtractor.so +08-17 19:47:07.939 F/google-breakpad(26081): M EAE32000 00000000 00006000 3B45281FC4EB699207799FD6018FBD910 libvendorconn.so +08-17 19:47:07.939 F/google-breakpad(26081): M EAEB2000 00000000 0005F000 7AC50A488023F3DA8182906BDFFA72C10 linker +08-17 19:47:07.939 F/google-breakpad(26081): -----END BREAKPAD MICRODUMP----- +08-17 19:47:35.311 F/google-breakpad(26227): -----BEGIN BREAKPAD MICRODUMP----- +08-17 19:47:35.311 F/google-breakpad(26227): V AndroidWebView:62.0.3188.0 +08-17 19:47:35.311 F/google-breakpad(26227): O A arm 08 armv8l Nokia/TA-1025_00WW/PLE:7.1.1/NMF26F/00WW_3_32C:user/release-keys +08-17 19:47:35.311 F/google-breakpad(26227): P webview +08-17 19:47:35.311 F/google-breakpad(26227): R 00000005 SIGTRAP 00000000 +08-17 19:47:35.311 F/google-breakpad(26227): G +08-17 19:47:35.323 F/google-breakpad(26227): H 12C00000 FFF73000 00F5 31E89000 9598E000 0C:16 0D:08 0E:11 0F:47 10:06 11:0A 12:08 13:13 14:09 15:0A 16:1B 17:13 18:0D 19:02 1B:01 1C:02 1D:01 +08-17 19:47:35.324 F/google-breakpad(26227): S 0 C92FFC60 C92FF000 00002000 +08-17 19:47:35.324 F/google-breakpad(26227): S C92FF000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.325 F/google-breakpad(26227): S C92FF180 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.325 F/google-breakpad(26227): S C92FF300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.326 F/google-breakpad(26227): S C92FF480 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.326 F/google-breakpad(26227): S C92FF600 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.327 F/google-breakpad(26227): S C92FF780 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.327 F/google-breakpad(26227): S C92FF900 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.328 F/google-breakpad(26227): S C92FFA80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.328 F/google-breakpad(26227): S C92FFC00 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005CFD2FC94CFD2FC950FD2FC98CFC2FC9EDACEF0DEDACEF0D0100000024FE2FC9010000009D20FCD3EDACEF0DEDACEF0D00000000EDACEF0D02000000EDACEF0DEDACEF0DEDACEF0D0000000000000000BCFC2FC901000000000000007F02000000000000EDACEF0D00000000200000000000000000002CD4000000000000000000000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D00000000EDACEF0D0000000000000000EDACEF0D0000000000000000000000000000000020000000D0FC2FC9EDACEF0D50FD2FC94CFD2FC9EDACEF0DEDACEF0DD5D92BD4EDACEF0DEDACEF0DEDACEF0D0000000003000000EDACEF0D0000000002000000EDACEF0DEDACEF0DEDACEF0DB7D72BD424000000EDACEF0D +08-17 19:47:35.329 F/google-breakpad(26227): S C92FFD80 F8FD2FC9EDACEF0DEDACEF0D0200000000000000EDACEF0D000000000200000001000000EDACEF0D0200000000000000EDACEF0D000000000200000001000000EDACEF0D0000000002000000EDACEF0D0000000002000000010000000F0B00000000000000000000FFFFFFFF000000000000000000000000FFFFFFFF01000000EDACEF0D7CFE2FC984FE2FC988FE2FC924FE2FC9D8FE2FC978FE2FC98F0830D4EDACEF0DEDACEF0DEDACEF0DDD7755D2EDACEF0DD8FE2FC94CFE2FC948FE2FC9D8FE2FC938FF2FC974FF2FC9D8FE2FC900000000EDACEF0DEDACEF0DEDACEF0D3C0130C947733DD4D8FE2FC980FE2FC978FE2FC901000000EDACEF0DEDACEF0DEDACEF0D018D98D200000000000000000400000000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF070000001D00000000000000FFFFFFFF00000000FFFFFFFF00CB97D20000000001B056D2000000000000000000000000F0FE2FC9A00030C9EDACEF0D38FF2FC9EDACEF0D4543A7D400000000 +08-17 19:47:35.329 F/google-breakpad(26227): S C92FFF00 080030C9EB8E3DD4A40030C9DF8697D2EDACEF0DE38598D2EDACEF0DEDACEF0DEDACEF0D31000000EDACEF0DEDACEF0DEDACEF0D31000000EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFFEDACEF0D6C0000000000000001000000EDACEF0DEDACEF0D742F6874EDACEF0D14617274EDACEF0DEDACEF0D3100000024000000EDACEF0D31000000FFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFFA40030C9A00030C9340130C9EDACEF0D4543A7D400000000080030C93C0130C911A03DD400000000000000000C0030C9EDACEF0DEDACEF0DEDACEF0D00000000EDACEF0D00000000EDACEF0D02000000B9D89CD2EDACEF0DEDACEF0D200030C9700330C90000000003000000EDACEF0D00000000780430C923D89CD200000000080000000100000095CD90D2EDACEF0D4543A7D400000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D000000000100000000000000EDACEF0DEDACEF0D00000000000000004543A7D400000000EDACEF0D97C090D2EDACEF0DEDACEF0D +08-17 19:47:35.330 F/google-breakpad(26227): S C9300080 9C0030C900000000EDACEF0D00000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D000030C9EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000130C900000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000002D000000310000000200000000000000EDACEF0DEDACEF0D000000000000000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000380230C94543A7D4EDACEF0D380230C9700330C9280230C9EDACEF0DEDACEF0D4543A7D400000000EDACEF0D780430C92DB773D2EDACEF0DEDACEF0DD9C68DD2F1C68DD2EDACEF0D07000000EDACEF0DD9C68DD20700000065C38DD2EDACEF0D0900000009000000DCC61D727DF856D2EDACEF0D7D933DD4CF228BD2CF228BD2178076D2013B65D2EDACEF0D380230C900000000780430C98D8064D2 +08-17 19:47:35.330 F/google-breakpad(26227): S C9300200 6E70E4D48970E4D400000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D0000000000000000A40230C90000000000000000EDACEF0DEDACEF0DEDACEF0D7B2B84EAEDACEF0DEDACEF0D780430C9B97855D2EDACEF0DA40230C9EDACEF0DEDACEF0DEDACEF0D090000000000000009000000EDACEF0DEDACEF0D0000000000000000EDACEF0DEDACEF0D0000000000000000D00530C9EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D380330C903000000EDACEF0DEDACEF0D780430C93FD49CD2EDACEF0D09000000010000006B9855D2FC0230C900000000480330C900000000EDACEF0DEDACEF0D0900000005E09CD209000000EDACEF0D0000000000000000000000000000000000000000EDACEF0D1B000000FFFFFFFF700330C94F1B59D2EDACEF0D090000000000000000000000000000000000000025B0B6D4EDACEF0D00000000A1CE9CD20E0B000000000000EDACEF0D02000000940430C905000000EDACEF0D000000000000000000000000 +08-17 19:47:35.331 F/google-breakpad(26227): S C9300380 000000000000000000000000D5B0B6D425B0B6D42C0100007D933DD4CF228BD2CF228BD2178076D2013B65D20E0B0000EDACEF0DE80330C90E0B000000000000EDACEF0DEDACEF0D0000000000000000EDACEF0D090000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000EDACEF0DEDACEF0D980430C90000000003000000D80430C900000000780430C9FBC69CD20000000000000000EDACEF0D09000000880430C9000000000000000000000000E8030000000000000000000000000000E8030000B00430C9EDACEF0D800430C900000000EDACEF0D00000000000000000000000000000000EDACEF0D09000000000000000000000000000000EDACEF0D0000000000000000EDACEF0D0900000000000000000000000000000000000000EDACEF0DEDACEF0D00000000EDACEF0DD00530C965CC73D2000000000000000000000000000000000000000000000000EDACEF0D00000000D00530C9EDACEF0D0000000000000000 +08-17 19:47:35.331 F/google-breakpad(26227): S C9300500 0000000000000000EDACEF0D280730C9C00530C9EDACEF0DEDACEF0D747D92D400000000280730C9EDACEF0D2DB773D2EDACEF0D300730C9F00530C9EDACEF0DEDACEF0D747D92D4000000006BB773D201010000DC0530C9EDACEF0DEDACEF0DB000000080000000EDACEF0D7B2B84EACF228BD2CF228BD2178076D2013B65D2479B9CD2DC0530C9EDACEF0D0000000007E29CD253E29CD2CF228BD2CF228BD200000000000000000000000000000000FC0530C9000000000000000000000000EDACEF0D00000000EDACEF0DF6FFFFFF00000000000000004000000000000000EDACEF0DEDACEF0D000000000000000000000000000000002000000000000000000000000000000000000000EDACEF0D000000000000000000000000F76985EA0000000000000000EDACEF0D000000000000000000000000400830C9EDACEF0DEDACEF0D00000000280730C9A40630C9480730C92842A7D4EDACEF0D280730C9EDACEF0D5FB473D2300730C9C40630C9500730C92842A7D400000000300730C9 +08-17 19:47:35.332 F/google-breakpad(26227): S C9300680 500730C935B573D2EDACEF0DEDACEF0DEDACEF0DEDACEF0DFFFFFFFFC00630C9020000000000000000000000000000000000000077D5BED2EDACEF0D00000000F4FFFFFFEDACEF0DE40630C9EDACEF0DB80730C9EDACEF0D00000000000000000000000000000000EDACEF0DEDACEF0D280730C9EDACEF0DB80730C9EDACEF0DC80730C9280730C9700730C92BAA73D2EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000000000000000000000000000000000007642A7D42842A7D4C9000000CF228BD2CF228BD2178076D2013B65D2479B9CD246030000010030C900000000FFFFFFFFD0A4BDD202000000F00730C900000000EDACEF0DEDACEF0DEDACEF0DAC0730C9FFFFFFFFE00730C9EDACEF0D010000006B9855D2EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000000000000000000000000000000000007642A7D42842A7D4C9000000CF228BD2CF228BD2178076D2013B65D2479B9CD24603000001000000D34657D2 +08-17 19:47:35.332 F/google-breakpad(26227): S C9300800 EDACEF0DEDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D000000005B8173D2020000009BD47ED2CC0830C9400830C9EDACEF0D00000000CC0830C91FA773D20000000000000000EDACEF0D3100000020000000EDACEF0D00000000000000000000000000000000980830C9EDACEF0DEDACEF0DEDACEF0D940830C9EDACEF0D00000000CC0830C9000000006B9855D20000000000000000EDACEF0D214657D2000000000000000000000000B34557D2EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000498473D2EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00000000CC0830C9EDACEF0DEDACEF0D200930C978000000EDACEF0DEDACEF0DA38173D2200930C9CD2F82EA200930C9E52F82EA280930C9EF5C7FEA7800000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00100000000000000000000000000000000000005B8173D2EDACEF0D00000000EDACEF0D0100000000000000EDACEF0D00000000700930C9200930C91600000000000000 +08-17 19:47:35.333 F/google-breakpad(26227): S C9300980 00000000EDACEF0D00000000EDACEF0D0000000001000000EDACEF0D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000EDACEF0D01000000EDACEF0D000000000000000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D010000000100000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D00000000000000000000000000000000000000000000000001000000EDACEF0D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.333 F/google-breakpad(26227): S C9300B00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.334 F/google-breakpad(26227): S C9300C80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.334 F/google-breakpad(26227): S C9300E00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.334 F/google-breakpad(26227): S C9300F80 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.335 F/google-breakpad(26227): C 06000040000000000000000005B88FD2020000008CFC2FC9CCFC2FC9003480C8ACFC2FC94CFD2FC95CFD2FC950FD2FC980FE2FC9D9C5F7D360FC2FC91B89B3D28684B3D2300003680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:47:35.335 F/google-breakpad(26227): M AAAAA000 00000000 00005000 8D2477F3B51997BDCC3733B8D1F920BE0 app_process32 +08-17 19:47:35.335 F/google-breakpad(26227): M 70D29000 00000000 00806000 E9166D3ED622EE65A3A4086EBEA4A7950 boot.oat +08-17 19:47:35.335 F/google-breakpad(26227): M 71531000 00000000 006C0000 668D96384E4368B01BC9B9F365028CA20 boot-core-libart.oat +08-17 19:47:35.335 F/google-breakpad(26227): M 71BF3000 00000000 000AA000 0D160B642FB1639805B72AC6F4DF3F380 boot-conscrypt.oat +08-17 19:47:35.336 F/google-breakpad(26227): M 71C9F000 00000000 000D1000 9D69BDC94BD07F2468D5B7DB0AEEF0140 boot-okhttp.oat +08-17 19:47:35.336 F/google-breakpad(26227): M 71D72000 00000000 0000C000 566CD32860A984FD445A4852058609CB0 boot-core-junit.oat +08-17 19:47:35.336 F/google-breakpad(26227): M 71D80000 00000000 0019F000 09C1E8B1D7FC826CB75691EC5BDBA1DB0 boot-bouncycastle.oat +08-17 19:47:35.336 F/google-breakpad(26227): M 71F21000 00000000 0014B000 069BAE4D2D7831B857A3C236021D868A0 boot-ext.oat +08-17 19:47:35.336 F/google-breakpad(26227): M 7206E000 00000000 0223E000 D0BEBD37E215DDC845099212203F792F0 boot-framework.oat +08-17 19:47:35.336 F/google-breakpad(26227): M 742AE000 00000000 00502000 B41E052DBA2949CE100713743053E1E40 boot-telephony-common.oat +08-17 19:47:35.336 F/google-breakpad(26227): M 747B2000 00000000 0003D000 65E4B1E28F33F9C51062E2D0630394830 boot-voip-common.oat +08-17 19:47:35.336 F/google-breakpad(26227): M 747F1000 00000000 00045000 EB491A6AF6568A675D81746238ACC78B0 boot-ims-common.oat +08-17 19:47:35.336 F/google-breakpad(26227): M 74838000 00000000 0016C000 C369D6D4F8DCF10CC0AD1800000000000 boot-apache-xml.oat +08-17 19:47:35.337 F/google-breakpad(26227): M 749A6000 00000000 000FF000 1FAC5317B0FEBD01C31E8039D76CCAF50 boot-org.apache.http.legacy.boot.oat +08-17 19:47:35.337 F/google-breakpad(26227): M 74AA7000 00000000 00004000 C368F8D0F8DCF10C00BE1800000000000 boot-tcmiface.oat +08-17 19:47:35.337 F/google-breakpad(26227): M 74AAD000 00000000 00016000 C368FA40F8DCF10C3FB11800000000000 boot-WfdCommon.oat +08-17 19:47:35.337 F/google-breakpad(26227): M 74AC5000 00000000 00004000 A2EDD62E4499B2C98D8C251F0977951B0 boot-oem-services.oat +08-17 19:47:35.337 F/google-breakpad(26227): M 74ACB000 00000000 0001C000 3794BA12A18F802DF4E8F10D4B2662FB0 boot-qcom.fmradio.oat +08-17 19:47:35.337 F/google-breakpad(26227): M 74AE9000 00000000 00009000 C368F9A8F8DCF10C95B41800000000000 boot-qcmediaplayer.oat +08-17 19:47:35.337 F/google-breakpad(26227): M 74AF4000 00000000 00008000 C368E898F8DCF10CDEAD1800000000000 boot-telephony-ext.oat +08-17 19:47:35.337 F/google-breakpad(26227): M 74AFE000 00000000 00013000 C368E46FF8DCF10CA3A11800000000000 boot-dolby_ds2.oat +08-17 19:47:35.337 F/google-breakpad(26227): M 74B13000 00000000 0000A000 C368F9E4F8DCF10C41B01800000000000 boot-dolby_ds1.oat +08-17 19:47:35.337 F/google-breakpad(26227): M C691B000 00000000 00005000 F841612CF1D458AB70296575A996EE5F0 QPerformance.odex +08-17 19:47:35.337 F/google-breakpad(26227): M CB91A000 00000000 00856000 000003F10000000031270A00000000000 base.odex +08-17 19:47:35.338 F/google-breakpad(26227): M CCAF6000 00000000 00936000 00000F700000000098480B00000000000 base.odex +08-17 19:47:35.338 F/google-breakpad(26227): M CF4C6000 00000000 02000000 000000000000000000000000000000000 dalvik-jit-code-cache (deleted) +08-17 19:47:35.338 F/google-breakpad(26227): M D2273000 04247000 02C94000 8A2EFA0DECC3EF7057A1C62BF1AECCA80 libmonochrome.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9155000 00000000 00004000 C1741AE46077EF13F70D0DC7D8A9DDE80 libwebviewchromium_loader.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9276000 00000000 00006000 C700FED4854EA9F553FC4EB1AC49DAD50 libqdutils.so +08-17 19:47:35.338 F/google-breakpad(26227): M D927F000 00000000 00007000 5AF3845B7F31952390092BB2318667B00 gralloc.msm8937.so +08-17 19:47:35.338 F/google-breakpad(26227): M D926B000 00000000 00823000 A91A29ADD65BB0AF28A4C9A6208E33C40 libllvm-glnext.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9AB7000 00000000 00316000 9F7E6C49A0A8C88C317716B031320CA30 libESXGLESv2_adreno.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9F1F000 00000000 0000C000 CEC6F7F71723450F4D1E527FA1BDDA310 libqservice.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9F30000 00000000 00007000 BB9F7CD0BF1178F273EB8B4D2D5C67C30 libmemalloc.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9F39000 00000000 00003000 B4B80A1B5D6C50F5C0DD7F1C29A9F6C10 libqdMetaData.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9F43000 00000000 00009000 0BA85EA850C07E5B86AF8281EF7641E70 libcompiler_rt.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9F4E000 00000000 0000B000 362BA72B9CF73AB8BD02283F491283E40 eglSubDriverAndroid.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9F5B000 00000000 0000B000 9BAA0F603A10810D4A6BEE7A903A762F0 libGLESv2_adreno.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9F68000 00000000 00007000 C08FDBDAB5792096DB0BEDBE3D23B48D0 libGLESv1_CM_adreno.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9F71000 00000000 00024000 C346DBBCF27F603F9321CCF737B3C0550 libESXGLESv1_CM_adreno.so +08-17 19:47:35.338 F/google-breakpad(26227): M D9F97000 00000000 00010000 A7800610AD28E2DF469D023E70516C190 libESXEGL_adreno.so +08-17 19:47:35.339 F/google-breakpad(26227): M D9FAB000 00000000 00006000 6CC274368542A8270BC225BE519068D80 libadreno_utils.so +08-17 19:47:35.339 F/google-breakpad(26227): M D9FBC000 00000000 00009000 649C0C218A9C0A611E5E0DB24CDD058C0 libEGL_adreno.so +08-17 19:47:35.339 F/google-breakpad(26227): M DA4BC000 00000000 00020000 1195E0A668F3644AC0EC8D1122457A140 libkeymaster1.so +08-17 19:47:35.339 F/google-breakpad(26227): M DA4DF000 00000000 00018000 39E3D5620A966F5DB960EEE55CCD8BB30 libsoftkeymasterdevice.so +08-17 19:47:35.339 F/google-breakpad(26227): M DA4F9000 00000000 0001A000 C1B07DA2D52E6EC3C54992A3A953D63B0 libjavacrypto.so +08-17 19:47:35.339 F/google-breakpad(26227): M DA516000 00000000 00004000 B051A444B9312E4DAF242DA3A951538A0 libkeystore-engine.so +08-17 19:47:35.339 F/google-breakpad(26227): M DA51B000 00000000 00016000 1988D915061DDC4921FF608AD3E810AD0 libkeystore_binder.so +08-17 19:47:35.339 F/google-breakpad(26227): M DA534000 00000000 0000C000 DDF063ABB28459B09548F8329934DDEB0 libkeymaster_messages.so +08-17 19:47:35.339 F/google-breakpad(26227): M DC57D000 00000000 00016000 A686CFCA0E870C10B425EB769017BE930 libmtp.so +08-17 19:47:35.339 F/google-breakpad(26227): M DC593000 00000000 00052000 E9F8299757E5E543C03723101E5B1BEC0 libmedia_jni.so +08-17 19:47:35.339 F/google-breakpad(26227): M DC5E8000 00000000 00020000 ADF61BE35FF269EC7E7B32B1DDCD31E00 libexif.so +08-17 19:47:35.339 F/google-breakpad(26227): M DC616000 00000000 0000E000 ABA3C77DD3386AE87B586632CE1979D50 libstagefright_amrnb_common.so +08-17 19:47:35.339 F/google-breakpad(26227): M DC634000 00000000 00007000 CD70BA801CA3E12D258565013535D7440 tcmclient.odex +08-17 19:47:35.339 F/google-breakpad(26227): M DC645000 00000000 00004000 042B2B738C75036986EB80BC08A71F060 libextmedia_jni.so +08-17 19:47:35.339 F/google-breakpad(26227): M E1E9B000 00000000 002B2000 FCA7431984CE2AEF979FFEEF99432D320 libart-compiler.so +08-17 19:47:35.340 F/google-breakpad(26227): M E215E000 00000000 000B1000 1EBE7A1A3E1A3134DE689251E1ABC0380 libvixl.so +08-17 19:47:35.340 F/google-breakpad(26227): M E2264000 00000000 0002B000 6E46C8EDE63F81CC2A4375E4F85517CD0 libopenjdk.so +08-17 19:47:35.340 F/google-breakpad(26227): M E2291000 00000000 00029000 4F845000DEA8066D684FEAB08A91A3480 libjavacore.so +08-17 19:47:35.340 F/google-breakpad(26227): M E22BC000 00000000 00138000 523FDEBEF6ECE577AF3716E9703AD4FF0 lib-imsqimf.so +08-17 19:47:35.340 F/google-breakpad(26227): M E23FA000 00000000 00004000 48E9F68098728AFF9A198AE7A14A7F700 libmdmdetect.so +08-17 19:47:35.340 F/google-breakpad(26227): M E2400000 00000000 00005000 12F24D77003A5660A06BA8690696A5C30 libconfigdb.so +08-17 19:47:35.340 F/google-breakpad(26227): M E2405000 00000000 00085000 DB9D3DADFB06F6B1AB9CEC5443F295370 lib-imsxml.so +08-17 19:47:35.340 F/google-breakpad(26227): M E2496000 00000000 00005000 F812502D41A460BDD2D9AA83A9564CC70 libqmi_encdec.so +08-17 19:47:35.340 F/google-breakpad(26227): M E249C000 00000000 0001C000 A53A45C88FFCD4CB3AFF323AF8FFFBAB0 libqdi.so +08-17 19:47:35.340 F/google-breakpad(26227): M E24B7000 00000000 0006A000 D110B55DE7DB9FD5086D2D1CE57152480 libdsi_netctrl.so +08-17 19:47:35.340 F/google-breakpad(26227): M E2534000 00000000 00023000 E7FB6A8B99C97103F258028CF27324660 lib-imsrcscm.so +08-17 19:47:35.340 F/google-breakpad(26227): M E255A000 00000000 0001C000 5BE35B9E5D50332052532AE119C50B930 libnetmgr.so +08-17 19:47:35.340 F/google-breakpad(26227): M E257A000 00000000 00004000 AB354652140A356C9787104C87CB30E00 libidl.so +08-17 19:47:35.340 F/google-breakpad(26227): M E2581000 00000000 00004000 63ED38853810ED69BA1AA57CE82E74B10 libtime_genoff.so +08-17 19:47:35.340 F/google-breakpad(26227): M E2587000 00000000 00004000 51134658113749962ABB7BA3A3C5E9740 libqmi_client_helper.so +08-17 19:47:35.340 F/google-breakpad(26227): M E258E000 00000000 00009000 1D288EC9F32773EBC0D380D4E238D8D60 libqmi_client_qmux.so +08-17 19:47:35.340 F/google-breakpad(26227): M E25C9000 00000000 0006A000 60BAE0DAB14BFBC4BE1805CC4CAF8B4D0 lib-imsdpl.so +08-17 19:47:35.340 F/google-breakpad(26227): M E263D000 00000000 00019000 0333752023452FF1E40F6BA9169471500 libdiag.so +08-17 19:47:35.341 F/google-breakpad(26227): M E274E000 00000000 0002C000 0FC3AF7C85EA4B0DA653AEA111020A2D0 libqmi.so +08-17 19:47:35.341 F/google-breakpad(26227): M E27B7000 00000000 000B8000 023971CEF8E022AAD4090C7D1432C3690 libCB.so +08-17 19:47:35.341 F/google-breakpad(26227): M E7D93000 00000000 00461000 39CBB6C545073B5DB56B60665F81D4B00 libart.so +08-17 19:47:35.341 F/google-breakpad(26227): M E8384000 00000000 00001000 7691C4BE084B030B3AA118A6F412EE260 libqmi_common_so.so +08-17 19:47:35.341 F/google-breakpad(26227): M E8387000 00000000 0000A000 37A576E22F2B9973E1734E556E1E99990 libqmi_cci.so +08-17 19:47:35.341 F/google-breakpad(26227): M E8395000 00000000 00003000 DCDF68ACFBFC2DEFC89FA0F5783199070 libpackagelistparser.so +08-17 19:47:35.341 F/google-breakpad(26227): M E839A000 00000000 00056000 0C1D30C5E6EA7E82800A2B00935E4B060 libharfbuzz_ng.so +08-17 19:47:35.341 F/google-breakpad(26227): M E83F3000 00000000 00037000 8AF00237A05209C2E429D0F70ED3EB900 libopus.so +08-17 19:47:35.341 F/google-breakpad(26227): M E842C000 00000000 00017000 215A7F63855CB46EC59B425BEDFD847D0 libminikin.so +08-17 19:47:35.341 F/google-breakpad(26227): M E8447000 00000000 00018000 EAB4CCC4544F5D8E2ECF256D527F4A430 libutils.so +08-17 19:47:35.341 F/google-breakpad(26227): M E8461000 00000000 0001E000 CCAA49412B791630FD4EAD7755A3E4CD0 libvorbisidec.so +08-17 19:47:35.341 F/google-breakpad(26227): M E8481000 00000000 00008000 F3F7CCE4ADD14C5DB852DF06407AE2FA0 libcamera_metadata.so +08-17 19:47:35.341 F/google-breakpad(26227): M E848C000 00000000 0000E000 1F6ED3D6536346B3B20CF40C5F9799D80 liblog.so +08-17 19:47:35.341 F/google-breakpad(26227): M E849D000 00000000 00010000 D6821B30C7A106C623EEE331974C9BF50 libGLESv2.so +08-17 19:47:35.341 F/google-breakpad(26227): M E84AF000 00000000 00014000 22B107B0382117ED603FF6000B248B8D0 libpcre.so +08-17 19:47:35.341 F/google-breakpad(26227): M E84C4000 00000000 00040000 9CC9AFC89D88D4C4AE6AEF2E290594B70 libinputflinger.so +08-17 19:47:35.341 F/google-breakpad(26227): M E8508000 00000000 00005000 459EC08F2C9F91A7E6AB6F293540B4510 libstdc++.so +08-17 19:47:35.342 F/google-breakpad(26227): M E850F000 00000000 00005000 DE5A396AAF801AF9A298A50BADE143E60 libspeexresampler.so +08-17 19:47:35.342 F/google-breakpad(26227): M E84F0000 00000000 00B36000 F1644AA2ACE475925E0DA02A814C13DF0 libLLVM.so +08-17 19:47:35.342 F/google-breakpad(26227): M E9081000 00000000 00008000 225E121AA129BB96606A1B3B91A2737A0 libnbaio.so +08-17 19:47:35.342 F/google-breakpad(26227): M E908C000 00000000 00017000 9A6B379EB3F10874FC241C570801C6070 libmemunreachable.so +08-17 19:47:35.342 F/google-breakpad(26227): M E909C000 00000000 0005F000 0FAC08487B9CD62449A19C8D161E7D820 libgui.so +08-17 19:47:35.342 F/google-breakpad(26227): M E9109000 00000000 00004000 E9B0F0A724940363FCBE11FB96B6ADF30 libnativebridge.so +08-17 19:47:35.342 F/google-breakpad(26227): M E910D000 00000000 0007B000 B44B5897A497DCB27C105B61AC30F1180 libhwui.so +08-17 19:47:35.342 F/google-breakpad(26227): M E918B000 00000000 0008B000 DCAB7F6AA60C5E74587E56973C6653120 libc++.so +08-17 19:47:35.342 F/google-breakpad(26227): M E921C000 00000000 00003000 3C7CC5BEA31C9C85C9BC25EC0891B7B10 libsync.so +08-17 19:47:35.342 F/google-breakpad(26227): M E9221000 00000000 00009000 4334A7FB3D1CB8582D4D676DE6E5E2930 libpiex.so +08-17 19:47:35.342 F/google-breakpad(26227): M E922A000 00000000 0000E000 EBD0DA428C58F5CBD72761DD6F1C03A10 libsoundtrigger.so +08-17 19:47:35.342 F/google-breakpad(26227): M E923D000 00000000 00020000 27C83DAE0AB0E161280BB40C384BD4BC0 libm.so +08-17 19:47:35.342 F/google-breakpad(26227): M E925F000 00000000 00003000 C9108BAA1E466D60D4591919420BBB6A0 libradio_metadata.so +08-17 19:47:35.342 F/google-breakpad(26227): M E9264000 00000000 0000E000 63E3F027146D592F9FBE03A33EDC8C6D0 libimg_utils.so +08-17 19:47:35.343 F/google-breakpad(26227): M E9275000 00000000 00015000 53AF0C4E2096697687AC0081AC7AD97C0 libunwind.so +08-17 19:47:35.343 F/google-breakpad(26227): M E92D0000 00000000 0001F000 9F74D840029038F65C040D5492CAE7360 libinput.so +08-17 19:47:35.343 F/google-breakpad(26227): M E92F5000 00000000 00005000 17620CAE201DC01DFD868F3276E8AA810 libpowermanager.so +08-17 19:47:35.343 F/google-breakpad(26227): M E92FD000 00000000 00055000 5E4B1D0F4D553AA92665AE0925229AF40 libsonivox.so +08-17 19:47:35.343 F/google-breakpad(26227): M E9359000 00000000 00006000 E727B84B0F5B3D982CAE8FB6E64B88030 libtiff_directory.so +08-17 19:47:35.343 F/google-breakpad(26227): M E9362000 00000000 00021000 52D2F4BBC71C3EE2E161E009B0331EF80 libstagefright_foundation.so +08-17 19:47:35.343 F/google-breakpad(26227): M E9386000 00000000 0003B000 2D4A4F8139C7842165EA73A6ACD835340 libjpeg.so +08-17 19:47:35.343 F/google-breakpad(26227): M E93C3000 00000000 00003000 9945E8F5AE0ADE1ED46FA08B41A6C9BE0 libmemtrack.so +08-17 19:47:35.343 F/google-breakpad(26227): M E93C6000 00000000 00019000 D2D0067E628DCC03418B99399D251A990 libEGL.so +08-17 19:47:35.343 F/google-breakpad(26227): M E93E4000 00000000 00019000 6534179E8DC7D8EDBF1236C375D51ECD0 libdrmframework.so +08-17 19:47:35.343 F/google-breakpad(26227): M E93FB000 00000000 00110000 994744AF5261DAC7CD0003EC5456DBDF0 libicuuc.so +08-17 19:47:35.343 F/google-breakpad(26227): M E9519000 00000000 00015000 BDA36CE4717D8C1A324C7CA4E1CA9B860 libvulkan.so +08-17 19:47:35.343 F/google-breakpad(26227): M E9521000 00000000 000F8000 91002184018FFAC8E26ECCB238E392440 libandroid_runtime.so +08-17 19:47:35.343 F/google-breakpad(26227): M E962A000 00000000 00004000 644559B020FD089F8180BB62CF9420590 libprocessgroup.so +08-17 19:47:35.343 F/google-breakpad(26227): M E9629000 00000000 00183000 035813361AA690A2E08F1E059823C9D50 libicui18n.so +08-17 19:47:35.343 F/google-breakpad(26227): M E97B8000 00000000 00008000 9D6466250A83301B3BE4CAA85227525D0 libnativeloader.so +08-17 19:47:35.344 F/google-breakpad(26227): M E97C0000 00000000 0000E000 031F092D2D476376D52F41FD2ADD2A3E0 libradio.so +08-17 19:47:35.344 F/google-breakpad(26227): M E97D2000 00000000 00003000 159F2CAC750E3DB60EF444F05BACCC850 libregionalization.so +08-17 19:47:35.344 F/google-breakpad(26227): M E97D8000 00000000 00008000 16C813B71CC34E81BCF6F5DD8648DC3B0 libGLESv1_CM.so +08-17 19:47:35.344 F/google-breakpad(26227): M E97E2000 00000000 00003000 AA06FF77B6E4CC83470C006104304D0F0 libhardware.so +08-17 19:47:35.344 F/google-breakpad(26227): M E97E0000 00000000 00039000 B613B07CCC9703A9AAE92861C92202BD0 libcamera_client.so +08-17 19:47:35.344 F/google-breakpad(26227): M E980D000 00000000 003A9000 42F6682A5C7E8B66743C6087B578D6C40 libskia.so +08-17 19:47:35.344 F/google-breakpad(26227): M E9BDC000 00000000 00007000 AD9132F0D394659639CBE5858DD1BB750 libhardware_legacy.so +08-17 19:47:35.344 F/google-breakpad(26227): M E9BE7000 00000000 00005000 EE5BF022DE057918231B46C6EDDC38690 libstagefright_yuv.so +08-17 19:47:35.344 F/google-breakpad(26227): M E9BEE000 00000000 00007000 9BC1C9D1E638BF1B7B32AC308B08D9DA0 libimage_type_recognition.so +08-17 19:47:35.344 F/google-breakpad(26227): M E9BF7000 00000000 0000D000 3C492E547FA88D7E2E85BD9451F613090 libbacktrace.so +08-17 19:47:35.344 F/google-breakpad(26227): M E9C07000 00000000 00007000 B165EC37228240E1EBEDC14160C16A3A0 libnativehelper.so +08-17 19:47:35.344 F/google-breakpad(26227): M E9C10000 00000000 0001A000 4D1780AFB25B59BBD625608B400D70C20 libprotobuf-cpp-lite.so +08-17 19:47:35.344 F/google-breakpad(26227): M E9C2D000 00000000 00004000 989F274AF037FE14219BE6DC42503B950 libnetd_client.so +08-17 19:47:35.344 F/google-breakpad(26227): M E9C33000 00000000 000A0000 8E23BB4E73E86B4A2AD4C17D7BAFD8A90 libcrypto.so +08-17 19:47:35.344 F/google-breakpad(26227): M E9CE0000 00000000 00003000 675D9BCC56AB210C8017D6625F994D250 libstagefright_enc_common.so +08-17 19:47:35.344 F/google-breakpad(26227): M E9CE5000 00000000 00024000 CC51150390EA9EFB0315C02573CCFD000 libpng.so +08-17 19:47:35.345 F/google-breakpad(26227): M E9D0B000 00000000 0003B000 4FBF4968372FEB1C8D593076E1B171610 libRScpp.so +08-17 19:47:35.345 F/google-breakpad(26227): M E9D49000 00000000 0000A000 415DAD77CED2441456E20CAD35C536250 libRS.so +08-17 19:47:35.345 F/google-breakpad(26227): M E9D55000 00000000 00004000 F168A985060F7993C937719998C96FD20 libusbhost.so +08-17 19:47:35.345 F/google-breakpad(26227): M E9D5B000 00000000 00086000 58C592B73EA51A0AFC3287247961D0940 libdng_sdk.so +08-17 19:47:35.345 F/google-breakpad(26227): M E9DE1000 00000000 00057000 44C1EA73F38E47E95712BF5848E8937E0 libbinder.so +08-17 19:47:35.345 F/google-breakpad(26227): M E9E3F000 00000000 0002E000 2824A9CACA3A870AD713A3405D6249530 libwilhelm.so +08-17 19:47:35.345 F/google-breakpad(26227): M E9E72000 00000000 00030000 E9CE28F8F628E4501925FF4D0FD6168F0 libstagefright_omx.so +08-17 19:47:35.345 F/google-breakpad(26227): M E9EA0000 00000000 00487000 3CD6A967C46ED23F4AB4B39092B43AB70 libpdfium.so +08-17 19:47:35.345 F/google-breakpad(26227): M EA337000 00000000 00004000 76B7583F8773D45C53E165CABC841DE70 libETC1.so +08-17 19:47:35.345 F/google-breakpad(26227): M EA33D000 00000000 00015000 F0658EC8F5FCD09AB82C2EFC3A6834210 libui.so +08-17 19:47:35.345 F/google-breakpad(26227): M EA355000 00000000 00038000 E4F681ED6DAD0F793516317FBE3DD55A0 libRS_internal.so +08-17 19:47:35.345 F/google-breakpad(26227): M EA390000 00000000 00016000 0DB58A0AF796EA03A43AAD505A8723310 liblzma.so +08-17 19:47:35.345 F/google-breakpad(26227): M EA3AE000 00000000 00011000 2618247A47A298A5C4574CC818C7F3280 libselinux.so +08-17 19:47:35.345 F/google-breakpad(26227): M EA3C1000 00000000 00005000 961542B344C4A0F54F87B49C0F1429E80 libwpa_client.so +08-17 19:47:35.345 F/google-breakpad(26227): M EA3C8000 00000000 00007000 5FF53AA38050A1DE3BF7A4D755DC75B70 libaudioutils.so +08-17 19:47:35.345 F/google-breakpad(26227): M EA3D1000 00000000 00017000 31235ADAF427BE11933CD87290CCAF050 libcutils.so +08-17 19:47:35.345 F/google-breakpad(26227): M EA3EB000 00000000 00036000 CBC6DC0C255BAB785FCD0511A7CBF0690 libbcinfo.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA423000 00000000 00003000 FDA204F888F3C0D8070BFDEC834066D20 libstagefright_http_support.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA428000 00000000 00005000 14FB257C9C6F43C8FA0B475D81C47FFC0 libbinary_parse.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA42F000 00000000 00009000 93F30055C78E1D80E40A8E717405CF500 libmediautils.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA43B000 00000000 0000A000 0F98C20EB2725367604DCE7EDA8EED9D0 libbase.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA447000 00000000 00016000 DC1FEB19B377562139F4F8AAFFA610710 libz.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA460000 00000000 00015000 68F77CDFB35DA081E510A50D11F299D70 libexpat.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA45D000 00000000 000C3000 3B22B766CDBB99263CF24B4CC2986E510 libmedia.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA541000 00000000 00031000 335A60B9AA0F00A47BD5A781CCA820740 libandroidfw.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA574000 00000000 0007A000 21086BE83826AA7DC32AB49C79D5CCE30 libsqlite.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA5F2000 00000000 0006C000 6EA54A19597F20D46626700FE9F206F50 libft2.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA64F000 00000000 0016B000 4E69F13734FEABE1CA5BA98594235DCD0 libstagefright.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA7D3000 00000000 00007000 475E29D0A243BEE93EC1A630C99503FC0 libnetutils.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA7DC000 00000000 00084000 49B02E01AEC77331A1D6D19B540265610 libc.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA86E000 00000000 00025000 8B6ECC65C09CAFF5ACAAB6C9249CD2C20 libssl.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA896000 00000000 00008000 22114C778A7ED1CC3953CCB22323EA1B0 libstagefright_avc_common.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA8A1000 00000000 00003000 7FA19C935E6148BD8002A3CA630C4E6F0 libsmemlog.so +08-17 19:47:35.346 F/google-breakpad(26227): M EA8A1000 00000000 00017000 EEAF8ABB6827B80A458A5D483E5562400 libqmiservices.so +08-17 19:47:35.347 F/google-breakpad(26227): M EA8C1000 00000000 00008000 090640ECFC69E16A25A3E27006AF282E0 libxml.so +08-17 19:47:35.347 F/google-breakpad(26227): M EA8CC000 00000000 00012000 67F4D476A96F053ACB61531379FCC4810 libdsutils.so +08-17 19:47:35.347 F/google-breakpad(26227): M EA8EF000 00000000 00014000 EFD5F0A0F81252A037F1C06B8E6809700 libsdsprpc.so +08-17 19:47:35.347 F/google-breakpad(26227): M EA905000 00000000 0003E000 C4311189AF8DA8405EDC0701CD38FC770 libgsl.so +08-17 19:47:35.347 F/google-breakpad(26227): M EA99F000 00000000 00014000 75BC34362D3F387A08AE8241CED8E2550 libadsprpc.so +08-17 19:47:35.347 F/google-breakpad(26227): M EA9B2000 00000000 0001A000 840BD6EAC45DEFC59D2F1E8C681CFF1A0 lib-imsrcscmclient.so +08-17 19:47:35.347 F/google-breakpad(26227): M EA9DA000 00000000 00011000 6034A9FBADF19CE6C259DA006E8158FC0 lib-imsrcscmservice.so +08-17 19:47:35.347 F/google-breakpad(26227): M EAA09000 00000000 00003000 7BB31E1D28279A11B8087C3F4DF7D0BA0 libqti-at.so +08-17 19:47:35.347 F/google-breakpad(26227): M EAA0E000 00000000 0000C000 7D5A1CA22F6A85FCC57B3D36A92461560 lib-ims-rcscmjni.so +08-17 19:47:35.347 F/google-breakpad(26227): M EAA1C000 00000000 00012000 FAD2DBDF65F36590FFE591C62DBEFA1E0 libOpenCL.so +08-17 19:47:35.347 F/google-breakpad(26227): M EAA38000 00000000 00003000 025B4D5BBA39265D6260B27597E321730 memtrack.msm8937.so +08-17 19:47:35.347 F/google-breakpad(26227): M EAA3D000 00000000 00011000 F5FF7C8214A82029405A068BCDF69A580 libmediandk.so +08-17 19:47:35.347 F/google-breakpad(26227): M EAA53000 00000000 00008000 5373A05304D5AFD8BC2BB49D6C22977D0 libopenjdkjvm.so +08-17 19:47:35.347 F/google-breakpad(26227): M EAA5C000 00000000 0000F000 96A60B84ED1352C202B6695FD32373790 libmediadrm.so +08-17 19:47:35.347 F/google-breakpad(26227): M EAA6E000 00000000 00010000 3D880E60A39C482BA4210DA0AD4E20490 libGLESv3.so +08-17 19:47:35.347 F/google-breakpad(26227): M EAA97000 00000000 00003000 F4CB54FA6F9A644292CE2DCC9FA89DA80 libqti_performance.so +08-17 19:47:35.347 F/google-breakpad(26227): M EAA9D000 00000000 00004000 B2EAC3688B9EFF0E79EA2C170AA859C50 libwebviewchromium_plat_support.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAAA5000 00000000 00004000 837BE31E60CD67A2C45BF27A1E8C10140 libOpenSLES.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAAAB000 00000000 00004000 3C4D0169CD09A3AEEC0868A7FC87CCFA0 libOpenMAXAL.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAAB0000 00000000 00016000 BAF17608D25635EFA63708C89561474D0 libcamera2ndk.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAB53000 00000000 00003000 78C8F6360CF612E4333D4EB1796927460 libqti-perfd-client.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAB57000 00000000 00014000 01EE9AC4109E06B182E77B55242AEBE20 libandroid.so +08-17 19:47:35.348 F/google-breakpad(26227): M EABAF000 00000000 00003000 4C4B6F03AF5049885FD4A43F149D13630 libjnigraphics.so +08-17 19:47:35.348 F/google-breakpad(26227): M EABB0000 00000000 00090000 FBA40D2822A0C6DCF7CE29FB42DC37230 libmediaplayerservice.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAC7B000 00000000 0000A000 52C41240B217BFE92F7381218169FD760 liblz4.so +08-17 19:47:35.348 F/google-breakpad(26227): M EACF9000 00000000 00038000 FEF1DA3EC5AA99E4FF38C1DF2A9A91570 libavenhancements.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAD35000 00000000 0002F000 85E4C8F7646AA02A46215564266690BA0 libstagefright_wfd.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAD6A000 00000000 00026000 7B91D8B6A15FF171BF114D8D638785D80 libstagefright_httplive.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAD94000 00000000 00003000 6DE080E13BB1741A34C157CE97277ABD0 libsigchain.so +08-17 19:47:35.348 F/google-breakpad(26227): M EADE7000 00000000 00003000 1390052238CBD9474F1747EA0BA53C740 libExtendedExtractor.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAE32000 00000000 00006000 3B45281FC4EB699207799FD6018FBD910 libvendorconn.so +08-17 19:47:35.348 F/google-breakpad(26227): M EAEB2000 00000000 0005F000 7AC50A488023F3DA8182906BDFFA72C10 linker +08-17 19:47:35.348 F/google-breakpad(26227): -----END BREAKPAD MICRODUMP----- +08-17 19:48:17.238 F/google-breakpad(26353): -----BEGIN BREAKPAD MICRODUMP----- +08-17 19:48:17.238 F/google-breakpad(26353): V AndroidWebView:62.0.3188.0 +08-17 19:48:17.238 F/google-breakpad(26353): O A arm 08 armv8l Nokia/TA-1025_00WW/PLE:7.1.1/NMF26F/00WW_3_32C:user/release-keys +08-17 19:48:17.238 F/google-breakpad(26353): P webview +08-17 19:48:17.238 F/google-breakpad(26353): R 00000005 SIGTRAP 4ED50008 +08-17 19:48:17.238 F/google-breakpad(26353): G +08-17 19:48:17.249 F/google-breakpad(26353): H 12C00000 FFF73000 00E0 31E89000 955B2000 0C:18 0D:11 0E:0B 0F:3E 10:01 11:02 12:05 13:14 14:0C 15:07 16:0F 17:1E 18:0C 19:02 1B:01 1C:02 1D:01 +08-17 19:48:17.251 F/google-breakpad(26353): S 0 C94F5C60 C94F5000 00002000 +08-17 19:48:17.251 F/google-breakpad(26353): S C94F5000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.252 F/google-breakpad(26353): S C94F5180 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.252 F/google-breakpad(26353): S C94F5300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.253 F/google-breakpad(26353): S C94F5480 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.253 F/google-breakpad(26353): S C94F5600 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.254 F/google-breakpad(26353): S C94F5780 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.254 F/google-breakpad(26353): S C94F5900 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.255 F/google-breakpad(26353): S C94F5A80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.255 F/google-breakpad(26353): S C94F5C00 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C5D4FC94C5D4FC9505D4FC98C5C4FC9EDACEF0DEDACEF0D01000000245E4FC9010000009D20FCD3EDACEF0DEDACEF0D00000000EDACEF0D02000000EDACEF0DEDACEF0DEDACEF0D0000000000000000BC5C4FC901000000000000008602000000000000EDACEF0D00000000200000000000000000002CD4000000000000000000000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D00000000EDACEF0D0000000000000000EDACEF0D0000000000000000000000000000000020000000D05C4FC9EDACEF0D505D4FC94C5D4FC9EDACEF0DEDACEF0DD5D92BD4EDACEF0DEDACEF0DEDACEF0D0000000003000000EDACEF0D0000000002000000EDACEF0DEDACEF0DEDACEF0DB7D72BD424000000EDACEF0D +08-17 19:48:17.256 F/google-breakpad(26353): S C94F5D80 F85D4FC9EDACEF0DEDACEF0D0200000000000000EDACEF0D000000000200000001000000EDACEF0D0200000000000000EDACEF0D000000000200000001000000EDACEF0D0000000002000000EDACEF0D0000000002000000010000000F0B00000000000000000000FFFFFFFF000000000000000000000000FFFFFFFF01000000EDACEF0D7C5E4FC9845E4FC9885E4FC9245E4FC9D85E4FC9785E4FC98F0830D4EDACEF0DEDACEF0DEDACEF0DDD7755D2EDACEF0DD85E4FC94C5E4FC9485E4FC9D85E4FC9385F4FC9745F4FC9D85E4FC900000000EDACEF0DEDACEF0DEDACEF0D3C614FC947733DD4D85E4FC9805E4FC9785E4FC901000000EDACEF0DEDACEF0DEDACEF0D018D98D200000000000000000400000000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF070000001D00000000000000FFFFFFFF00000000FFFFFFFF00CB97D20000000001B056D2000000000000000000000000F05E4FC9A0604FC9EDACEF0D385F4FC9EDACEF0D4543A7D400000000 +08-17 19:48:17.256 F/google-breakpad(26353): S C94F5F00 08604FC9EB8E3DD4A4604FC9DF8697D2EDACEF0DE38598D2EDACEF0DEDACEF0DEDACEF0D31000000EDACEF0DEDACEF0DEDACEF0D31000000EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFFEDACEF0D6C0000000000000001000000EDACEF0DEDACEF0D742F6874EDACEF0D14617274EDACEF0DEDACEF0D3100000024000000EDACEF0D31000000FFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFFA4604FC9A0604FC934614FC9EDACEF0D4543A7D40000000008604FC93C614FC911A03DD400000000000000000C604FC9EDACEF0DEDACEF0DEDACEF0D00000000EDACEF0D00000000EDACEF0D02000000B9D89CD2EDACEF0DEDACEF0D20604FC970634FC90000000003000000EDACEF0D0000000078644FC923D89CD200000000080000000100000095CD90D2EDACEF0D4543A7D400000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D000000000100000000000000EDACEF0DEDACEF0D00000000000000004543A7D400000000EDACEF0D97C090D2EDACEF0DEDACEF0D +08-17 19:48:17.257 F/google-breakpad(26353): S C94F6080 9C604FC900000000EDACEF0D00000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D00604FC9EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000614FC900000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000002D000000310000000200000000000000EDACEF0DEDACEF0D000000000000000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000038624FC94543A7D4EDACEF0D38624FC970634FC928624FC9EDACEF0DEDACEF0D4543A7D400000000EDACEF0D78644FC92DB773D207000000EDACEF0DEDACEF0DD9C68DD207000000B1AF56D2EDACEF0D07000000EDACEF0D65C38DD2EDACEF0D0900000009000000EDACEF0D7DF856D2EDACEF0D7D933DD4CF228BD2CF228BD2178076D2013B65D2EDACEF0D38624FC90000000078644FC98D8064D2 +08-17 19:48:17.257 F/google-breakpad(26353): S C94F6200 6E70E4D48970E4D400000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D0000000000000000A4624FC90000000000000000EDACEF0DEDACEF0DEDACEF0D7B2B84EAEDACEF0DEDACEF0D78644FC9B97855D2EDACEF0DA4624FC9EDACEF0DEDACEF0DEDACEF0D090000000000000009000000EDACEF0DEDACEF0D0000000000000000EDACEF0DEDACEF0D0000000000000000D0654FC9EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D38634FC903000000EDACEF0DEDACEF0D78644FC93FD49CD2EDACEF0D09000000010000006B9855D2FC624FC90000000048634FC900000000EDACEF0DEDACEF0D0900000005E09CD209000000EDACEF0D0000000000000000000000000000000000000000EDACEF0D1B000000FFFFFFFF70634FC94F1B59D2EDACEF0D090000000000000000000000000000000000000025B0B6D4EDACEF0D00000000A1CE9CD20F0B000000000000EDACEF0D0200000094644FC905000000EDACEF0D000000000000000000000000 +08-17 19:48:17.257 F/google-breakpad(26353): S C94F6380 000000000000000000000000D5B0B6D425B0B6D42C0100007D933DD4CF228BD2CF228BD2178076D2013B65D20F0B0000EDACEF0DE8634FC90F0B000000000000EDACEF0DEDACEF0D0000000000000000EDACEF0D090000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000EDACEF0DEDACEF0D98644FC90000000003000000D8644FC90000000078644FC9FBC69CD20000000000000000EDACEF0D0900000088644FC9000000000000000000000000E8030000000000000000000000000000E8030000B0644FC9EDACEF0D80644FC900000000EDACEF0D00000000000000000000000000000000EDACEF0D09000000000000000000000000000000EDACEF0D0000000000000000EDACEF0D0900000000000000000000000000000000000000EDACEF0DEDACEF0D00000000EDACEF0DD0654FC965CC73D2000000000000000000000000000000000000000000000000EDACEF0D00000000D0654FC9EDACEF0D0000000000000000 +08-17 19:48:17.258 F/google-breakpad(26353): S C94F6500 0000000000000000EDACEF0D28674FC9C0654FC9EDACEF0DEDACEF0D747D92D40000000028674FC9EDACEF0D2DB773D2EDACEF0D30674FC9F0654FC9EDACEF0DEDACEF0D747D92D4000000006BB773D201010000DC654FC9EDACEF0DEDACEF0DB000000080000000EDACEF0D7B2B84EACF228BD2CF228BD2178076D2013B65D2479B9CD2DC654FC9EDACEF0D0000000007E29CD253E29CD2CF228BD2CF228BD200000000000000000000000000000000FC654FC9000000000000000000000000EDACEF0D00000000EDACEF0DF6FFFFFF00000000000000004000000000000000EDACEF0DEDACEF0D00000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EDACEF0DC4664FC9000000000000000040684FC9EDACEF0DEDACEF0D0000000028674FC9A4664FC948674FC92842A7D4EDACEF0D28674FC9EDACEF0D5FB473D230674FC9C4664FC950674FC92842A7D40000000030674FC9 +08-17 19:48:17.258 F/google-breakpad(26353): S C94F6680 50674FC935B573D2EDACEF0DEDACEF0DEDACEF0DEDACEF0DFFFFFFFFC0664FC9020000000000000000000000000000000000000077D5BED2EDACEF0D00000000EDACEF0DEDACEF0DE4664FC9EDACEF0DB8674FC9EDACEF0D00000000000000000000000000000000EDACEF0DEDACEF0D28674FC9EDACEF0DB8674FC9EDACEF0DC8674FC928674FC970674FC92BAA73D2EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000000000000000000000000000000000007642A7D42842A7D4C9000000CF228BD2CF228BD2178076D2013B65D2479B9CD23703000001004FC900000000FFFFFFFFD0A4BDD202000000F0674FC900000000EDACEF0DEDACEF0DEDACEF0DAC674FC9FFFFFFFFE0674FC9EDACEF0D010000006B9855D2EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000000000000000000000000000000000007642A7D42842A7D4C9000000CF228BD2CF228BD2178076D2013B65D2479B9CD23703000001000000D34657D2 +08-17 19:48:17.259 F/google-breakpad(26353): S C94F6800 EDACEF0DEDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D000000005B8173D2020000009BD47ED2CC684FC940684FC9EDACEF0D00000000CC684FC91FA773D20000000000000000EDACEF0D3100000020000000EDACEF0D0000000000000000000000000000000098684FC9EDACEF0DEDACEF0DEDACEF0D94684FC9EDACEF0D00000000CC684FC9000000006B9855D20000000000000000EDACEF0D214657D2000000000000000000000000B34557D2EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000498473D2EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00000000CC684FC9EDACEF0DEDACEF0D20694FC978000000EDACEF0DEDACEF0DA38173D220694FC9CD2F82EA20694FC9E52F82EA28694FC9EF5C7FEA7800000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00100000000000000000000000000000000000005B8173D2EDACEF0D00000000EDACEF0D0100000000000000EDACEF0D0000000070694FC920694FC91600000000000000 +08-17 19:48:17.259 F/google-breakpad(26353): S C94F6980 00000000EDACEF0D00000000EDACEF0D0000000001000000EDACEF0D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000EDACEF0D01000000EDACEF0D000000000000000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D010000000100000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D00000000000000000000000000000000000000000000000001000000EDACEF0D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.260 F/google-breakpad(26353): S C94F6B00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.260 F/google-breakpad(26353): S C94F6C80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.261 F/google-breakpad(26353): S C94F6E00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.261 F/google-breakpad(26353): S C94F6F80 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.261 F/google-breakpad(26353): C 06000040000000000000000005B88FD2020000008C5C4FC9CC5C4FC9D0C16F30AC5C4FC94C5D4FC95C5D4FC9505D4FC9805E4FC9D9C5F7D3605C4FC91B89B3D28684B3D2300001680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 19:48:17.262 F/google-breakpad(26353): M AAAAA000 00000000 00005000 8D2477F3B51997BDCC3733B8D1F920BE0 app_process32 +08-17 19:48:17.262 F/google-breakpad(26353): M 70D29000 00000000 00806000 E9166D3ED622EE65A3A4086EBEA4A7950 boot.oat +08-17 19:48:17.262 F/google-breakpad(26353): M 71531000 00000000 006C0000 668D96384E4368B01BC9B9F365028CA20 boot-core-libart.oat +08-17 19:48:17.262 F/google-breakpad(26353): M 71BF3000 00000000 000AA000 0D160B642FB1639805B72AC6F4DF3F380 boot-conscrypt.oat +08-17 19:48:17.262 F/google-breakpad(26353): M 71C9F000 00000000 000D1000 9D69BDC94BD07F2468D5B7DB0AEEF0140 boot-okhttp.oat +08-17 19:48:17.262 F/google-breakpad(26353): M 71D72000 00000000 0000C000 566CD32860A984FD445A4852058609CB0 boot-core-junit.oat +08-17 19:48:17.262 F/google-breakpad(26353): M 71D80000 00000000 0019F000 09C1E8B1D7FC826CB75691EC5BDBA1DB0 boot-bouncycastle.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 71F21000 00000000 0014B000 069BAE4D2D7831B857A3C236021D868A0 boot-ext.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 7206E000 00000000 0223E000 D0BEBD37E215DDC845099212203F792F0 boot-framework.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 742AE000 00000000 00502000 B41E052DBA2949CE100713743053E1E40 boot-telephony-common.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 747B2000 00000000 0003D000 65E4B1E28F33F9C51062E2D0630394830 boot-voip-common.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 747F1000 00000000 00045000 EB491A6AF6568A675D81746238ACC78B0 boot-ims-common.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 74838000 00000000 0016C000 C369D6D4F8DCF10CC0AD1800000000000 boot-apache-xml.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 749A6000 00000000 000FF000 1FAC5317B0FEBD01C31E8039D76CCAF50 boot-org.apache.http.legacy.boot.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 74AA7000 00000000 00004000 C368F8D0F8DCF10C00BE1800000000000 boot-tcmiface.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 74AAD000 00000000 00016000 C368FA40F8DCF10C3FB11800000000000 boot-WfdCommon.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 74AC5000 00000000 00004000 A2EDD62E4499B2C98D8C251F0977951B0 boot-oem-services.oat +08-17 19:48:17.263 F/google-breakpad(26353): M 74ACB000 00000000 0001C000 3794BA12A18F802DF4E8F10D4B2662FB0 boot-qcom.fmradio.oat +08-17 19:48:17.264 F/google-breakpad(26353): M 74AE9000 00000000 00009000 C368F9A8F8DCF10C95B41800000000000 boot-qcmediaplayer.oat +08-17 19:48:17.264 F/google-breakpad(26353): M 74AF4000 00000000 00008000 C368E898F8DCF10CDEAD1800000000000 boot-telephony-ext.oat +08-17 19:48:17.264 F/google-breakpad(26353): M 74AFE000 00000000 00013000 C368E46FF8DCF10CA3A11800000000000 boot-dolby_ds2.oat +08-17 19:48:17.264 F/google-breakpad(26353): M 74B13000 00000000 0000A000 C368F9E4F8DCF10C41B01800000000000 boot-dolby_ds1.oat +08-17 19:48:17.264 F/google-breakpad(26353): M C79F1000 00000000 00005000 F841612CF1D458AB70296575A996EE5F0 QPerformance.odex +08-17 19:48:17.264 F/google-breakpad(26353): M CBA19000 00000000 00856000 000003F10000000031270A00000000000 base.odex +08-17 19:48:17.264 F/google-breakpad(26353): M CCAF6000 00000000 00936000 00000F700000000098480B00000000000 base.odex +08-17 19:48:17.264 F/google-breakpad(26353): M CF4C6000 00000000 02000000 000000000000000000000000000000000 dalvik-jit-code-cache (deleted) +08-17 19:48:17.264 F/google-breakpad(26353): M D2273000 04247000 02C94000 8A2EFA0DECC3EF7057A1C62BF1AECCA80 libmonochrome.so +08-17 19:48:17.264 F/google-breakpad(26353): M D9155000 00000000 00004000 C1741AE46077EF13F70D0DC7D8A9DDE80 libwebviewchromium_loader.so +08-17 19:48:17.264 F/google-breakpad(26353): M D9276000 00000000 00006000 C700FED4854EA9F553FC4EB1AC49DAD50 libqdutils.so +08-17 19:48:17.264 F/google-breakpad(26353): M D927F000 00000000 00007000 5AF3845B7F31952390092BB2318667B00 gralloc.msm8937.so +08-17 19:48:17.265 F/google-breakpad(26353): M D926B000 00000000 00823000 A91A29ADD65BB0AF28A4C9A6208E33C40 libllvm-glnext.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9AB7000 00000000 00316000 9F7E6C49A0A8C88C317716B031320CA30 libESXGLESv2_adreno.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9F1F000 00000000 0000C000 CEC6F7F71723450F4D1E527FA1BDDA310 libqservice.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9F30000 00000000 00007000 BB9F7CD0BF1178F273EB8B4D2D5C67C30 libmemalloc.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9F39000 00000000 00003000 B4B80A1B5D6C50F5C0DD7F1C29A9F6C10 libqdMetaData.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9F43000 00000000 00009000 0BA85EA850C07E5B86AF8281EF7641E70 libcompiler_rt.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9F4E000 00000000 0000B000 362BA72B9CF73AB8BD02283F491283E40 eglSubDriverAndroid.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9F5B000 00000000 0000B000 9BAA0F603A10810D4A6BEE7A903A762F0 libGLESv2_adreno.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9F68000 00000000 00007000 C08FDBDAB5792096DB0BEDBE3D23B48D0 libGLESv1_CM_adreno.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9F71000 00000000 00024000 C346DBBCF27F603F9321CCF737B3C0550 libESXGLESv1_CM_adreno.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9F97000 00000000 00010000 A7800610AD28E2DF469D023E70516C190 libESXEGL_adreno.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9FAB000 00000000 00006000 6CC274368542A8270BC225BE519068D80 libadreno_utils.so +08-17 19:48:17.265 F/google-breakpad(26353): M D9FBC000 00000000 00009000 649C0C218A9C0A611E5E0DB24CDD058C0 libEGL_adreno.so +08-17 19:48:17.266 F/google-breakpad(26353): M DA4BC000 00000000 00020000 1195E0A668F3644AC0EC8D1122457A140 libkeymaster1.so +08-17 19:48:17.266 F/google-breakpad(26353): M DA4DF000 00000000 00018000 39E3D5620A966F5DB960EEE55CCD8BB30 libsoftkeymasterdevice.so +08-17 19:48:17.266 F/google-breakpad(26353): M DA4F9000 00000000 0001A000 C1B07DA2D52E6EC3C54992A3A953D63B0 libjavacrypto.so +08-17 19:48:17.266 F/google-breakpad(26353): M DA516000 00000000 00004000 B051A444B9312E4DAF242DA3A951538A0 libkeystore-engine.so +08-17 19:48:17.266 F/google-breakpad(26353): M DA51B000 00000000 00016000 1988D915061DDC4921FF608AD3E810AD0 libkeystore_binder.so +08-17 19:48:17.266 F/google-breakpad(26353): M DA534000 00000000 0000C000 DDF063ABB28459B09548F8329934DDEB0 libkeymaster_messages.so +08-17 19:48:17.266 F/google-breakpad(26353): M DC57D000 00000000 00016000 A686CFCA0E870C10B425EB769017BE930 libmtp.so +08-17 19:48:17.266 F/google-breakpad(26353): M DC593000 00000000 00052000 E9F8299757E5E543C03723101E5B1BEC0 libmedia_jni.so +08-17 19:48:17.266 F/google-breakpad(26353): M DC5E8000 00000000 00020000 ADF61BE35FF269EC7E7B32B1DDCD31E00 libexif.so +08-17 19:48:17.266 F/google-breakpad(26353): M DC616000 00000000 0000E000 ABA3C77DD3386AE87B586632CE1979D50 libstagefright_amrnb_common.so +08-17 19:48:17.266 F/google-breakpad(26353): M DC634000 00000000 00007000 CD70BA801CA3E12D258565013535D7440 tcmclient.odex +08-17 19:48:17.266 F/google-breakpad(26353): M DC645000 00000000 00004000 042B2B738C75036986EB80BC08A71F060 libextmedia_jni.so +08-17 19:48:17.266 F/google-breakpad(26353): M E1E9B000 00000000 002B2000 FCA7431984CE2AEF979FFEEF99432D320 libart-compiler.so +08-17 19:48:17.266 F/google-breakpad(26353): M E215E000 00000000 000B1000 1EBE7A1A3E1A3134DE689251E1ABC0380 libvixl.so +08-17 19:48:17.267 F/google-breakpad(26353): M E2264000 00000000 0002B000 6E46C8EDE63F81CC2A4375E4F85517CD0 libopenjdk.so +08-17 19:48:17.267 F/google-breakpad(26353): M E2291000 00000000 00029000 4F845000DEA8066D684FEAB08A91A3480 libjavacore.so +08-17 19:48:17.267 F/google-breakpad(26353): M E22BC000 00000000 00138000 523FDEBEF6ECE577AF3716E9703AD4FF0 lib-imsqimf.so +08-17 19:48:17.267 F/google-breakpad(26353): M E23FA000 00000000 00004000 48E9F68098728AFF9A198AE7A14A7F700 libmdmdetect.so +08-17 19:48:17.267 F/google-breakpad(26353): M E2400000 00000000 00005000 12F24D77003A5660A06BA8690696A5C30 libconfigdb.so +08-17 19:48:17.267 F/google-breakpad(26353): M E2405000 00000000 00085000 DB9D3DADFB06F6B1AB9CEC5443F295370 lib-imsxml.so +08-17 19:48:17.267 F/google-breakpad(26353): M E2496000 00000000 00005000 F812502D41A460BDD2D9AA83A9564CC70 libqmi_encdec.so +08-17 19:48:17.267 F/google-breakpad(26353): M E249C000 00000000 0001C000 A53A45C88FFCD4CB3AFF323AF8FFFBAB0 libqdi.so +08-17 19:48:17.267 F/google-breakpad(26353): M E24B7000 00000000 0006A000 D110B55DE7DB9FD5086D2D1CE57152480 libdsi_netctrl.so +08-17 19:48:17.267 F/google-breakpad(26353): M E2534000 00000000 00023000 E7FB6A8B99C97103F258028CF27324660 lib-imsrcscm.so +08-17 19:48:17.267 F/google-breakpad(26353): M E255A000 00000000 0001C000 5BE35B9E5D50332052532AE119C50B930 libnetmgr.so +08-17 19:48:17.267 F/google-breakpad(26353): M E257A000 00000000 00004000 AB354652140A356C9787104C87CB30E00 libidl.so +08-17 19:48:17.267 F/google-breakpad(26353): M E2581000 00000000 00004000 63ED38853810ED69BA1AA57CE82E74B10 libtime_genoff.so +08-17 19:48:17.267 F/google-breakpad(26353): M E2587000 00000000 00004000 51134658113749962ABB7BA3A3C5E9740 libqmi_client_helper.so +08-17 19:48:17.267 F/google-breakpad(26353): M E258E000 00000000 00009000 1D288EC9F32773EBC0D380D4E238D8D60 libqmi_client_qmux.so +08-17 19:48:17.267 F/google-breakpad(26353): M E25C9000 00000000 0006A000 60BAE0DAB14BFBC4BE1805CC4CAF8B4D0 lib-imsdpl.so +08-17 19:48:17.267 F/google-breakpad(26353): M E263D000 00000000 00019000 0333752023452FF1E40F6BA9169471500 libdiag.so +08-17 19:48:17.268 F/google-breakpad(26353): M E274E000 00000000 0002C000 0FC3AF7C85EA4B0DA653AEA111020A2D0 libqmi.so +08-17 19:48:17.268 F/google-breakpad(26353): M E27B7000 00000000 000B8000 023971CEF8E022AAD4090C7D1432C3690 libCB.so +08-17 19:48:17.268 F/google-breakpad(26353): M E7D93000 00000000 00461000 39CBB6C545073B5DB56B60665F81D4B00 libart.so +08-17 19:48:17.268 F/google-breakpad(26353): M E8384000 00000000 00001000 7691C4BE084B030B3AA118A6F412EE260 libqmi_common_so.so +08-17 19:48:17.268 F/google-breakpad(26353): M E8387000 00000000 0000A000 37A576E22F2B9973E1734E556E1E99990 libqmi_cci.so +08-17 19:48:17.268 F/google-breakpad(26353): M E8395000 00000000 00003000 DCDF68ACFBFC2DEFC89FA0F5783199070 libpackagelistparser.so +08-17 19:48:17.268 F/google-breakpad(26353): M E839A000 00000000 00056000 0C1D30C5E6EA7E82800A2B00935E4B060 libharfbuzz_ng.so +08-17 19:48:17.268 F/google-breakpad(26353): M E83F3000 00000000 00037000 8AF00237A05209C2E429D0F70ED3EB900 libopus.so +08-17 19:48:17.268 F/google-breakpad(26353): M E842C000 00000000 00017000 215A7F63855CB46EC59B425BEDFD847D0 libminikin.so +08-17 19:48:17.268 F/google-breakpad(26353): M E8447000 00000000 00018000 EAB4CCC4544F5D8E2ECF256D527F4A430 libutils.so +08-17 19:48:17.268 F/google-breakpad(26353): M E8461000 00000000 0001E000 CCAA49412B791630FD4EAD7755A3E4CD0 libvorbisidec.so +08-17 19:48:17.268 F/google-breakpad(26353): M E8481000 00000000 00008000 F3F7CCE4ADD14C5DB852DF06407AE2FA0 libcamera_metadata.so +08-17 19:48:17.268 F/google-breakpad(26353): M E848C000 00000000 0000E000 1F6ED3D6536346B3B20CF40C5F9799D80 liblog.so +08-17 19:48:17.268 F/google-breakpad(26353): M E849D000 00000000 00010000 D6821B30C7A106C623EEE331974C9BF50 libGLESv2.so +08-17 19:48:17.268 F/google-breakpad(26353): M E84AF000 00000000 00014000 22B107B0382117ED603FF6000B248B8D0 libpcre.so +08-17 19:48:17.268 F/google-breakpad(26353): M E84C4000 00000000 00040000 9CC9AFC89D88D4C4AE6AEF2E290594B70 libinputflinger.so +08-17 19:48:17.268 F/google-breakpad(26353): M E8508000 00000000 00005000 459EC08F2C9F91A7E6AB6F293540B4510 libstdc++.so +08-17 19:48:17.269 F/google-breakpad(26353): M E850F000 00000000 00005000 DE5A396AAF801AF9A298A50BADE143E60 libspeexresampler.so +08-17 19:48:17.269 F/google-breakpad(26353): M E84F0000 00000000 00B36000 F1644AA2ACE475925E0DA02A814C13DF0 libLLVM.so +08-17 19:48:17.269 F/google-breakpad(26353): M E9081000 00000000 00008000 225E121AA129BB96606A1B3B91A2737A0 libnbaio.so +08-17 19:48:17.269 F/google-breakpad(26353): M E908C000 00000000 00017000 9A6B379EB3F10874FC241C570801C6070 libmemunreachable.so +08-17 19:48:17.269 F/google-breakpad(26353): M E909C000 00000000 0005F000 0FAC08487B9CD62449A19C8D161E7D820 libgui.so +08-17 19:48:17.269 F/google-breakpad(26353): M E9109000 00000000 00004000 E9B0F0A724940363FCBE11FB96B6ADF30 libnativebridge.so +08-17 19:48:17.269 F/google-breakpad(26353): M E910D000 00000000 0007B000 B44B5897A497DCB27C105B61AC30F1180 libhwui.so +08-17 19:48:17.269 F/google-breakpad(26353): M E918B000 00000000 0008B000 DCAB7F6AA60C5E74587E56973C6653120 libc++.so +08-17 19:48:17.269 F/google-breakpad(26353): M E921C000 00000000 00003000 3C7CC5BEA31C9C85C9BC25EC0891B7B10 libsync.so +08-17 19:48:17.269 F/google-breakpad(26353): M E9221000 00000000 00009000 4334A7FB3D1CB8582D4D676DE6E5E2930 libpiex.so +08-17 19:48:17.269 F/google-breakpad(26353): M E922A000 00000000 0000E000 EBD0DA428C58F5CBD72761DD6F1C03A10 libsoundtrigger.so +08-17 19:48:17.269 F/google-breakpad(26353): M E923D000 00000000 00020000 27C83DAE0AB0E161280BB40C384BD4BC0 libm.so +08-17 19:48:17.269 F/google-breakpad(26353): M E925F000 00000000 00003000 C9108BAA1E466D60D4591919420BBB6A0 libradio_metadata.so +08-17 19:48:17.270 F/google-breakpad(26353): M E9264000 00000000 0000E000 63E3F027146D592F9FBE03A33EDC8C6D0 libimg_utils.so +08-17 19:48:17.270 F/google-breakpad(26353): M E9275000 00000000 00015000 53AF0C4E2096697687AC0081AC7AD97C0 libunwind.so +08-17 19:48:17.270 F/google-breakpad(26353): M E92D0000 00000000 0001F000 9F74D840029038F65C040D5492CAE7360 libinput.so +08-17 19:48:17.270 F/google-breakpad(26353): M E92F5000 00000000 00005000 17620CAE201DC01DFD868F3276E8AA810 libpowermanager.so +08-17 19:48:17.270 F/google-breakpad(26353): M E92FD000 00000000 00055000 5E4B1D0F4D553AA92665AE0925229AF40 libsonivox.so +08-17 19:48:17.270 F/google-breakpad(26353): M E9359000 00000000 00006000 E727B84B0F5B3D982CAE8FB6E64B88030 libtiff_directory.so +08-17 19:48:17.270 F/google-breakpad(26353): M E9362000 00000000 00021000 52D2F4BBC71C3EE2E161E009B0331EF80 libstagefright_foundation.so +08-17 19:48:17.270 F/google-breakpad(26353): M E9386000 00000000 0003B000 2D4A4F8139C7842165EA73A6ACD835340 libjpeg.so +08-17 19:48:17.270 F/google-breakpad(26353): M E93C3000 00000000 00003000 9945E8F5AE0ADE1ED46FA08B41A6C9BE0 libmemtrack.so +08-17 19:48:17.270 F/google-breakpad(26353): M E93C6000 00000000 00019000 D2D0067E628DCC03418B99399D251A990 libEGL.so +08-17 19:48:17.270 F/google-breakpad(26353): M E93E4000 00000000 00019000 6534179E8DC7D8EDBF1236C375D51ECD0 libdrmframework.so +08-17 19:48:17.270 F/google-breakpad(26353): M E93FB000 00000000 00110000 994744AF5261DAC7CD0003EC5456DBDF0 libicuuc.so +08-17 19:48:17.270 F/google-breakpad(26353): M E9519000 00000000 00015000 BDA36CE4717D8C1A324C7CA4E1CA9B860 libvulkan.so +08-17 19:48:17.270 F/google-breakpad(26353): M E9521000 00000000 000F8000 91002184018FFAC8E26ECCB238E392440 libandroid_runtime.so +08-17 19:48:17.271 F/google-breakpad(26353): M E962A000 00000000 00004000 644559B020FD089F8180BB62CF9420590 libprocessgroup.so +08-17 19:48:17.271 F/google-breakpad(26353): M E9629000 00000000 00183000 035813361AA690A2E08F1E059823C9D50 libicui18n.so +08-17 19:48:17.271 F/google-breakpad(26353): M E97B8000 00000000 00008000 9D6466250A83301B3BE4CAA85227525D0 libnativeloader.so +08-17 19:48:17.271 F/google-breakpad(26353): M E97C0000 00000000 0000E000 031F092D2D476376D52F41FD2ADD2A3E0 libradio.so +08-17 19:48:17.271 F/google-breakpad(26353): M E97D2000 00000000 00003000 159F2CAC750E3DB60EF444F05BACCC850 libregionalization.so +08-17 19:48:17.271 F/google-breakpad(26353): M E97D8000 00000000 00008000 16C813B71CC34E81BCF6F5DD8648DC3B0 libGLESv1_CM.so +08-17 19:48:17.271 F/google-breakpad(26353): M E97E2000 00000000 00003000 AA06FF77B6E4CC83470C006104304D0F0 libhardware.so +08-17 19:48:17.271 F/google-breakpad(26353): M E97E0000 00000000 00039000 B613B07CCC9703A9AAE92861C92202BD0 libcamera_client.so +08-17 19:48:17.271 F/google-breakpad(26353): M E980D000 00000000 003A9000 42F6682A5C7E8B66743C6087B578D6C40 libskia.so +08-17 19:48:17.271 F/google-breakpad(26353): M E9BDC000 00000000 00007000 AD9132F0D394659639CBE5858DD1BB750 libhardware_legacy.so +08-17 19:48:17.271 F/google-breakpad(26353): M E9BE7000 00000000 00005000 EE5BF022DE057918231B46C6EDDC38690 libstagefright_yuv.so +08-17 19:48:17.271 F/google-breakpad(26353): M E9BEE000 00000000 00007000 9BC1C9D1E638BF1B7B32AC308B08D9DA0 libimage_type_recognition.so +08-17 19:48:17.271 F/google-breakpad(26353): M E9BF7000 00000000 0000D000 3C492E547FA88D7E2E85BD9451F613090 libbacktrace.so +08-17 19:48:17.271 F/google-breakpad(26353): M E9C07000 00000000 00007000 B165EC37228240E1EBEDC14160C16A3A0 libnativehelper.so +08-17 19:48:17.271 F/google-breakpad(26353): M E9C10000 00000000 0001A000 4D1780AFB25B59BBD625608B400D70C20 libprotobuf-cpp-lite.so +08-17 19:48:17.271 F/google-breakpad(26353): M E9C2D000 00000000 00004000 989F274AF037FE14219BE6DC42503B950 libnetd_client.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9C33000 00000000 000A0000 8E23BB4E73E86B4A2AD4C17D7BAFD8A90 libcrypto.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9CE0000 00000000 00003000 675D9BCC56AB210C8017D6625F994D250 libstagefright_enc_common.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9CE5000 00000000 00024000 CC51150390EA9EFB0315C02573CCFD000 libpng.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9D0B000 00000000 0003B000 4FBF4968372FEB1C8D593076E1B171610 libRScpp.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9D49000 00000000 0000A000 415DAD77CED2441456E20CAD35C536250 libRS.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9D55000 00000000 00004000 F168A985060F7993C937719998C96FD20 libusbhost.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9D5B000 00000000 00086000 58C592B73EA51A0AFC3287247961D0940 libdng_sdk.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9DE1000 00000000 00057000 44C1EA73F38E47E95712BF5848E8937E0 libbinder.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9E3F000 00000000 0002E000 2824A9CACA3A870AD713A3405D6249530 libwilhelm.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9E72000 00000000 00030000 E9CE28F8F628E4501925FF4D0FD6168F0 libstagefright_omx.so +08-17 19:48:17.272 F/google-breakpad(26353): M E9EA0000 00000000 00487000 3CD6A967C46ED23F4AB4B39092B43AB70 libpdfium.so +08-17 19:48:17.272 F/google-breakpad(26353): M EA337000 00000000 00004000 76B7583F8773D45C53E165CABC841DE70 libETC1.so +08-17 19:48:17.272 F/google-breakpad(26353): M EA33D000 00000000 00015000 F0658EC8F5FCD09AB82C2EFC3A6834210 libui.so +08-17 19:48:17.272 F/google-breakpad(26353): M EA355000 00000000 00038000 E4F681ED6DAD0F793516317FBE3DD55A0 libRS_internal.so +08-17 19:48:17.272 F/google-breakpad(26353): M EA390000 00000000 00016000 0DB58A0AF796EA03A43AAD505A8723310 liblzma.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA3AE000 00000000 00011000 2618247A47A298A5C4574CC818C7F3280 libselinux.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA3C1000 00000000 00005000 961542B344C4A0F54F87B49C0F1429E80 libwpa_client.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA3C8000 00000000 00007000 5FF53AA38050A1DE3BF7A4D755DC75B70 libaudioutils.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA3D1000 00000000 00017000 31235ADAF427BE11933CD87290CCAF050 libcutils.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA3EB000 00000000 00036000 CBC6DC0C255BAB785FCD0511A7CBF0690 libbcinfo.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA423000 00000000 00003000 FDA204F888F3C0D8070BFDEC834066D20 libstagefright_http_support.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA428000 00000000 00005000 14FB257C9C6F43C8FA0B475D81C47FFC0 libbinary_parse.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA42F000 00000000 00009000 93F30055C78E1D80E40A8E717405CF500 libmediautils.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA43B000 00000000 0000A000 0F98C20EB2725367604DCE7EDA8EED9D0 libbase.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA447000 00000000 00016000 DC1FEB19B377562139F4F8AAFFA610710 libz.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA460000 00000000 00015000 68F77CDFB35DA081E510A50D11F299D70 libexpat.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA45D000 00000000 000C3000 3B22B766CDBB99263CF24B4CC2986E510 libmedia.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA541000 00000000 00031000 335A60B9AA0F00A47BD5A781CCA820740 libandroidfw.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA574000 00000000 0007A000 21086BE83826AA7DC32AB49C79D5CCE30 libsqlite.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA5F2000 00000000 0006C000 6EA54A19597F20D46626700FE9F206F50 libft2.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA64F000 00000000 0016B000 4E69F13734FEABE1CA5BA98594235DCD0 libstagefright.so +08-17 19:48:17.273 F/google-breakpad(26353): M EA7D3000 00000000 00007000 475E29D0A243BEE93EC1A630C99503FC0 libnetutils.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA7DC000 00000000 00084000 49B02E01AEC77331A1D6D19B540265610 libc.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA86E000 00000000 00025000 8B6ECC65C09CAFF5ACAAB6C9249CD2C20 libssl.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA896000 00000000 00008000 22114C778A7ED1CC3953CCB22323EA1B0 libstagefright_avc_common.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA8A1000 00000000 00003000 7FA19C935E6148BD8002A3CA630C4E6F0 libsmemlog.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA8A1000 00000000 00017000 EEAF8ABB6827B80A458A5D483E5562400 libqmiservices.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA8C1000 00000000 00008000 090640ECFC69E16A25A3E27006AF282E0 libxml.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA8CC000 00000000 00012000 67F4D476A96F053ACB61531379FCC4810 libdsutils.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA8EF000 00000000 00014000 EFD5F0A0F81252A037F1C06B8E6809700 libsdsprpc.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA905000 00000000 0003E000 C4311189AF8DA8405EDC0701CD38FC770 libgsl.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA99F000 00000000 00014000 75BC34362D3F387A08AE8241CED8E2550 libadsprpc.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA9B2000 00000000 0001A000 840BD6EAC45DEFC59D2F1E8C681CFF1A0 lib-imsrcscmclient.so +08-17 19:48:17.274 F/google-breakpad(26353): M EA9DA000 00000000 00011000 6034A9FBADF19CE6C259DA006E8158FC0 lib-imsrcscmservice.so +08-17 19:48:17.274 F/google-breakpad(26353): M EAA09000 00000000 00003000 7BB31E1D28279A11B8087C3F4DF7D0BA0 libqti-at.so +08-17 19:48:17.274 F/google-breakpad(26353): M EAA0E000 00000000 0000C000 7D5A1CA22F6A85FCC57B3D36A92461560 lib-ims-rcscmjni.so +08-17 19:48:17.274 F/google-breakpad(26353): M EAA1C000 00000000 00012000 FAD2DBDF65F36590FFE591C62DBEFA1E0 libOpenCL.so +08-17 19:48:17.274 F/google-breakpad(26353): M EAA38000 00000000 00003000 025B4D5BBA39265D6260B27597E321730 memtrack.msm8937.so +08-17 19:48:17.274 F/google-breakpad(26353): M EAA3D000 00000000 00011000 F5FF7C8214A82029405A068BCDF69A580 libmediandk.so +08-17 19:48:17.274 F/google-breakpad(26353): M EAA53000 00000000 00008000 5373A05304D5AFD8BC2BB49D6C22977D0 libopenjdkjvm.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAA5C000 00000000 0000F000 96A60B84ED1352C202B6695FD32373790 libmediadrm.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAA6E000 00000000 00010000 3D880E60A39C482BA4210DA0AD4E20490 libGLESv3.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAA97000 00000000 00003000 F4CB54FA6F9A644292CE2DCC9FA89DA80 libqti_performance.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAA9D000 00000000 00004000 B2EAC3688B9EFF0E79EA2C170AA859C50 libwebviewchromium_plat_support.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAAA5000 00000000 00004000 837BE31E60CD67A2C45BF27A1E8C10140 libOpenSLES.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAAAB000 00000000 00004000 3C4D0169CD09A3AEEC0868A7FC87CCFA0 libOpenMAXAL.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAAB0000 00000000 00016000 BAF17608D25635EFA63708C89561474D0 libcamera2ndk.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAB53000 00000000 00003000 78C8F6360CF612E4333D4EB1796927460 libqti-perfd-client.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAB57000 00000000 00014000 01EE9AC4109E06B182E77B55242AEBE20 libandroid.so +08-17 19:48:17.275 F/google-breakpad(26353): M EABAF000 00000000 00003000 4C4B6F03AF5049885FD4A43F149D13630 libjnigraphics.so +08-17 19:48:17.275 F/google-breakpad(26353): M EABB0000 00000000 00090000 FBA40D2822A0C6DCF7CE29FB42DC37230 libmediaplayerservice.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAC7B000 00000000 0000A000 52C41240B217BFE92F7381218169FD760 liblz4.so +08-17 19:48:17.275 F/google-breakpad(26353): M EACF9000 00000000 00038000 FEF1DA3EC5AA99E4FF38C1DF2A9A91570 libavenhancements.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAD35000 00000000 0002F000 85E4C8F7646AA02A46215564266690BA0 libstagefright_wfd.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAD6A000 00000000 00026000 7B91D8B6A15FF171BF114D8D638785D80 libstagefright_httplive.so +08-17 19:48:17.275 F/google-breakpad(26353): M EAD94000 00000000 00003000 6DE080E13BB1741A34C157CE97277ABD0 libsigchain.so +08-17 19:48:17.275 F/google-breakpad(26353): M EADE7000 00000000 00003000 1390052238CBD9474F1747EA0BA53C740 libExtendedExtractor.so +08-17 19:48:17.276 F/google-breakpad(26353): M EAE32000 00000000 00006000 3B45281FC4EB699207799FD6018FBD910 libvendorconn.so +08-17 19:48:17.276 F/google-breakpad(26353): M EAEB2000 00000000 0005F000 7AC50A488023F3DA8182906BDFFA72C10 linker +08-17 19:48:17.276 F/google-breakpad(26353): -----END BREAKPAD MICRODUMP----- +08-17 20:31:35.553 W/google-breakpad( 2783): Output crash dump file: +08-17 20:31:35.553 W/google-breakpad( 2783): /data/user/0/com.devhd.feedly/cache/WebView/Crash Reports/43961460-fc25-4f3e-8f3e429a-43a548d8.dmp +08-17 20:31:35.554 W/google-breakpad( 2783): ### ### ### ### ### ### ### ### ### ### ### ### ### +08-17 20:31:35.554 W/google-breakpad( 2783): Chrome build fingerprint: +08-17 20:31:35.554 W/google-breakpad( 2783): 37.3.0 +08-17 20:31:35.554 W/google-breakpad( 2783): 668 +08-17 20:31:35.554 W/google-breakpad( 2783): ### ### ### ### ### ### ### ### ### ### ### ### ### +08-17 20:31:35.709 F/google-breakpad( 2913): -----BEGIN BREAKPAD MICRODUMP----- +08-17 20:31:35.709 F/google-breakpad( 2913): V AndroidWebView:62.0.3188.0 +08-17 20:31:35.709 F/google-breakpad( 2913): O A arm 08 armv8l Nokia/TA-1025_00WW/PLE:7.1.1/NMF26F/00WW_3_32C:user/release-keys +08-17 20:31:35.709 F/google-breakpad( 2913): P webview +08-17 20:31:35.709 F/google-breakpad( 2913): R 00000005 SIGTRAP 00000000 +08-17 20:31:35.709 F/google-breakpad( 2913): G +08-17 20:31:35.718 F/google-breakpad( 2913): H 12C00000 FFF73000 00B3 31E89000 9A70D000 0C:10 0D:0D 0E:06 0F:27 10:04 11:04 12:05 13:0B 14:06 15:11 16:0D 17:17 18:10 19:02 1B:01 1C:02 1D:01 +08-17 20:31:35.718 F/google-breakpad( 2913): S 0 C96F4C60 C96F4000 00002000 +08-17 20:31:35.719 F/google-breakpad( 2913): S C96F4000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.719 F/google-breakpad( 2913): S C96F4180 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.720 F/google-breakpad( 2913): S C96F4300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.720 F/google-breakpad( 2913): S C96F4480 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.721 F/google-breakpad( 2913): S C96F4600 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.721 F/google-breakpad( 2913): S C96F4780 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.722 F/google-breakpad( 2913): S C96F4900 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.722 F/google-breakpad( 2913): S C96F4A80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.723 F/google-breakpad( 2913): S C96F4C00 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005C4D6FC94C4D6FC9504D6FC98C4C6FC9EDACEF0DEDACEF0D01000000244E6FC9010000009D20FCD3EDACEF0DEDACEF0D00000000EDACEF0D02000000EDACEF0DEDACEF0DEDACEF0D0000000000000000BC4C6FC90100000000000000DA01000000000000EDACEF0D00000000200000000000000000002CD4000000000000000000000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D00000000EDACEF0D0000000000000000EDACEF0D0000000000000000000000000000000020000000D04C6FC9EDACEF0D504D6FC94C4D6FC9EDACEF0DEDACEF0DD5D92BD4EDACEF0DEDACEF0DEDACEF0D0000000003000000EDACEF0D0000000002000000EDACEF0DEDACEF0DEDACEF0DB7D72BD424000000EDACEF0D +08-17 20:31:35.723 F/google-breakpad( 2913): S C96F4D80 F84D6FC9EDACEF0DEDACEF0D0200000000000000EDACEF0D000000000200000001000000EDACEF0D0200000000000000EDACEF0D000000000200000001000000EDACEF0D0000000002000000EDACEF0D000000000200000001000000230900000000000000000000FFFFFFFF000000000000000000000000FFFFFFFF01000000EDACEF0D7C4E6FC9844E6FC9884E6FC9244E6FC9D84E6FC9784E6FC98F0830D4EDACEF0DEDACEF0DEDACEF0DDD7755D2EDACEF0DD84E6FC94C4E6FC9484E6FC9D84E6FC9384F6FC9744F6FC9D84E6FC900000000EDACEF0DEDACEF0DEDACEF0D3C516FC947733DD4D84E6FC9804E6FC9784E6FC901000000EDACEF0DEDACEF0DEDACEF0D018D98D200000000000000000400000000000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF070000001D00000000000000FFFFFFFF00000000FFFFFFFF00CB97D20000000001B056D2000000000000000000000000F04E6FC9A0506FC9EDACEF0D384F6FC9EDACEF0D4543A7D400000000 +08-17 20:31:35.724 F/google-breakpad( 2913): S C96F4F00 08506FC9EB8E3DD4A4506FC9DF8697D2EDACEF0DE38598D2EDACEF0DEDACEF0DEDACEF0D31000000EDACEF0DEDACEF0DEDACEF0D31000000EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFFEDACEF0D6C0000000000000001000000EDACEF0DEDACEF0D742F6874EDACEF0D14617274EDACEF0DEDACEF0D3100000024000000EDACEF0D31000000FFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFFA4506FC9A0506FC934516FC9EDACEF0D4543A7D40000000008506FC93C516FC911A03DD400000000000000000C506FC9EDACEF0DEDACEF0DEDACEF0D00000000EDACEF0D00000000EDACEF0D02000000B9D89CD2EDACEF0DEDACEF0D20506FC970536FC90000000003000000EDACEF0D0000000078546FC923D89CD200000000080000000100000095CD90D2EDACEF0D4543A7D400000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D000000000100000000000000EDACEF0DEDACEF0D00000000000000004543A7D400000000EDACEF0D97C090D2EDACEF0DEDACEF0D +08-17 20:31:35.724 F/google-breakpad( 2913): S C96F5080 9C506FC900000000EDACEF0D00000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D00506FC9EDACEF0DFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000516FC900000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF02000000FFFFFFFFFFFFFFFF01000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000002D000000310000000200000000000000EDACEF0DEDACEF0D000000000000000000000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000038526FC94543A7D4EDACEF0D38526FC970536FC928526FC9EDACEF0DEDACEF0D4543A7D400000000EDACEF0D78546FC92DB773D2EDACEF0DEDACEF0DD9C68DD2F1C68DD2EDACEF0D07000000EDACEF0DD9C68DD20700000065C38DD2EDACEF0D0900000009000000EDACEF0D7DF856D2EDACEF0D7D933DD4CF228BD2CF228BD2178076D2013B65D2EDACEF0D38526FC90000000078546FC98D8064D2 +08-17 20:31:35.725 F/google-breakpad( 2913): S C96F5200 6E70E4D48970E4D400000000000000000000000000000000EDACEF0D000000000000000000000000EDACEF0D0000000000000000A4526FC90000000000000000EDACEF0DEDACEF0DEDACEF0D7B2B84EAEDACEF0DEDACEF0D78546FC9B97855D2EDACEF0DA4526FC9EDACEF0DEDACEF0DEDACEF0D090000000000000009000000EDACEF0DEDACEF0D0000000000000000EDACEF0DEDACEF0D0000000000000000D0556FC9EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D38536FC903000000EDACEF0DEDACEF0D78546FC93FD49CD2EDACEF0D09000000EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D0100000000000000F9C973D20900000005E09CD209000000EDACEF0D0000000000000000000000000000000000000000EDACEF0D1C000000FFFFFFFF70536FC94F1B59D2EDACEF0D090000000000000000000000000000000000000025B0B6D4EDACEF0D00000000A1CE9CD22209000000000000EDACEF0D0200000094546FC905000000EDACEF0D000000000000000000000000 +08-17 20:31:35.725 F/google-breakpad( 2913): S C96F5380 000000000000000000000000D5B0B6D425B0B6D42C0100007D933DD4CF228BD2CF228BD2178076D2013B65D222090000EDACEF0DE8536FC92209000000000000EDACEF0DEDACEF0D0000000000000000EDACEF0D090000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000EDACEF0DEDACEF0D98546FC90000000003000000D8546FC90000000078546FC9FBC69CD20000000000000000EDACEF0D0900000088546FC9000000000000000000000000E8030000000000000000000000000000E8030000B0546FC9EDACEF0D80546FC900000000EDACEF0D00000000000000000000000000000000EDACEF0D09000000000000000000000000000000EDACEF0D0000000000000000EDACEF0D0900000000000000000000000000000000000000EDACEF0DEDACEF0D00000000EDACEF0DD0556FC965CC73D2000000000000000000000000000000000000000000000000EDACEF0D00000000D0556FC9EDACEF0D0000000000000000 +08-17 20:31:35.726 F/google-breakpad( 2913): S C96F5500 0000000000000000EDACEF0D28576FC9C0556FC9EDACEF0DEDACEF0D747D92D40000000028576FC9EDACEF0D2DB773D2EDACEF0D30576FC9F0556FC9EDACEF0DEDACEF0D747D92D4000000006BB773D201010000DC556FC9EDACEF0DEDACEF0DB000000080000000EDACEF0D7B2B84EACF228BD2CF228BD2178076D2013B65D2479B9CD2DC556FC9EDACEF0D0000000007E29CD207E29CD207E29CD207E29CD200000000000000000000000000000000FC556FC9000000000000000000000000EDACEF0D00000000EDACEF0DF6FFFFFF00000000000000004000000000000000EDACEF0DEDACEF0D00000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EDACEF0DC4566FC9000000000000000040586FC9EDACEF0DEDACEF0D0000000028576FC9A4566FC948576FC92842A7D4EDACEF0D28576FC9EDACEF0D5FB473D2FFFFFFFF7B2B84EAEDACEF0DEDACEF0DFFFFFFFFC0566FC9 +08-17 20:31:35.726 F/google-breakpad( 2913): S C96F5680 EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0DFFFFFFFFC0566FC9020000000000000000000000000000000000000077D5BED2EDACEF0D00000000FCFFFFFFEDACEF0DE4566FC9EDACEF0DB8576FC9EDACEF0D00000000000000000000000000000000EDACEF0DEDACEF0D28576FC9EDACEF0DB8576FC9EDACEF0DC8576FC928576FC970576FC92BAA73D2EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000000000000000000000000000000000000000000007642A7D42842A7D4C9000000CF228BD2CF228BD2178076D2013B65D2479B9CD24102000001006FC900000000FFFFFFFFD0A4BDD202000000F0576FC900000000EDACEF0DEDACEF0DEDACEF0DAC576FC9FFFFFFFFE0576FC9EDACEF0D010000006B9855D2EDACEF0DEDACEF0DEDACEF0DEDACEF0DEDACEF0D0000000000000000000000000000000000000000000000007642A7D42842A7D4C9000000CF228BD2CF228BD2178076D2013B65D2479B9CD24102000001000000D34657D2 +08-17 20:31:35.727 F/google-breakpad( 2913): S C96F5800 EDACEF0DEDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D000000005B8173D2020000009BD47ED2CC586FC940586FC9EDACEF0D00000000CC586FC91FA773D20000000000000000EDACEF0D3100000020000000EDACEF0D0000000000000000000000000000000098586FC9EDACEF0DEDACEF0DEDACEF0D94586FC9EDACEF0D00000000CC586FC9000000006B9855D20000000000000000EDACEF0D214657D2000000000000000000000000B34557D2EDACEF0DEDACEF0DEDACEF0DEDACEF0D00000000498473D2EDACEF0DEDACEF0D00000000EDACEF0DEDACEF0D00000000CC586FC9EDACEF0DEDACEF0D20596FC978000000EDACEF0DEDACEF0DA38173D220596FC9CD2F82EA20596FC9E52F82EA28596FC9EF5C7FEA7800000000000000EDACEF0DEDACEF0D2F0B0000DF0A000000000000EDACEF0DEDACEF0D00100000000000000000000000000000000000005B8173D2EDACEF0D00000000EDACEF0D0100000000000000EDACEF0D0000000070596FC920596FC91600000000000000 +08-17 20:31:35.727 F/google-breakpad( 2913): S C96F5980 00000000EDACEF0D00000000EDACEF0D0000000001000000EDACEF0D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000EDACEF0D01000000EDACEF0D0000000000000000010000002F0B000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D010000000100000001000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D01000000EDACEF0D00000000000000000000000000000000000000000000000001000000EDACEF0D01000000EDACEF0D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.728 F/google-breakpad( 2913): S C96F5B00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.728 F/google-breakpad( 2913): S C96F5C80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.729 F/google-breakpad( 2913): S C96F5E00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.729 F/google-breakpad( 2913): S C96F5F80 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.729 F/google-breakpad( 2913): C 06000040000000000000000005B88FD2020000008C4C6FC9CC4C6FC9C885634FAC4C6FC94C4D6FC95C4D6FC9504D6FC9804E6FC9D9C5F7D3604C6FC91B89B3D28684B3D2300001680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +08-17 20:31:35.729 F/google-breakpad( 2913): M AAAAA000 00000000 00005000 8D2477F3B51997BDCC3733B8D1F920BE0 app_process32 +08-17 20:31:35.729 F/google-breakpad( 2913): M 70D29000 00000000 00806000 E9166D3ED622EE65A3A4086EBEA4A7950 boot.oat +08-17 20:31:35.730 F/google-breakpad( 2913): M 71531000 00000000 006C0000 668D96384E4368B01BC9B9F365028CA20 boot-core-libart.oat +08-17 20:31:35.730 F/google-breakpad( 2913): M 71BF3000 00000000 000AA000 0D160B642FB1639805B72AC6F4DF3F380 boot-conscrypt.oat +08-17 20:31:35.730 F/google-breakpad( 2913): M 71C9F000 00000000 000D1000 9D69BDC94BD07F2468D5B7DB0AEEF0140 boot-okhttp.oat +08-17 20:31:35.730 F/google-breakpad( 2913): M 71D72000 00000000 0000C000 566CD32860A984FD445A4852058609CB0 boot-core-junit.oat +08-17 20:31:35.730 F/google-breakpad( 2913): M 71D80000 00000000 0019F000 09C1E8B1D7FC826CB75691EC5BDBA1DB0 boot-bouncycastle.oat +08-17 20:31:35.730 F/google-breakpad( 2913): M 71F21000 00000000 0014B000 069BAE4D2D7831B857A3C236021D868A0 boot-ext.oat +08-17 20:31:35.730 F/google-breakpad( 2913): M 7206E000 00000000 0223E000 D0BEBD37E215DDC845099212203F792F0 boot-framework.oat +08-17 20:31:35.730 F/google-breakpad( 2913): M 742AE000 00000000 00502000 B41E052DBA2949CE100713743053E1E40 boot-telephony-common.oat +08-17 20:31:35.730 F/google-breakpad( 2913): M 747B2000 00000000 0003D000 65E4B1E28F33F9C51062E2D0630394830 boot-voip-common.oat +08-17 20:31:35.730 F/google-breakpad( 2913): M 747F1000 00000000 00045000 EB491A6AF6568A675D81746238ACC78B0 boot-ims-common.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M 74838000 00000000 0016C000 C369D6D4F8DCF10CC0AD1800000000000 boot-apache-xml.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M 749A6000 00000000 000FF000 1FAC5317B0FEBD01C31E8039D76CCAF50 boot-org.apache.http.legacy.boot.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M 74AA7000 00000000 00004000 C368F8D0F8DCF10C00BE1800000000000 boot-tcmiface.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M 74AAD000 00000000 00016000 C368FA40F8DCF10C3FB11800000000000 boot-WfdCommon.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M 74AC5000 00000000 00004000 A2EDD62E4499B2C98D8C251F0977951B0 boot-oem-services.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M 74ACB000 00000000 0001C000 3794BA12A18F802DF4E8F10D4B2662FB0 boot-qcom.fmradio.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M 74AE9000 00000000 00009000 C368F9A8F8DCF10C95B41800000000000 boot-qcmediaplayer.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M 74AF4000 00000000 00008000 C368E898F8DCF10CDEAD1800000000000 boot-telephony-ext.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M 74AFE000 00000000 00013000 C368E46FF8DCF10CA3A11800000000000 boot-dolby_ds2.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M 74B13000 00000000 0000A000 C368F9E4F8DCF10C41B01800000000000 boot-dolby_ds1.oat +08-17 20:31:35.731 F/google-breakpad( 2913): M CBCC8000 00000000 00856000 000003F10000000031270A00000000000 base.odex +08-17 20:31:35.732 F/google-breakpad( 2913): M CCAF6000 00000000 00936000 00000F700000000098480B00000000000 base.odex +08-17 20:31:35.732 F/google-breakpad( 2913): M CF4C6000 00000000 02000000 000000000000000000000000000000000 dalvik-jit-code-cache (deleted) +08-17 20:31:35.732 F/google-breakpad( 2913): M D2273000 04247000 02C94000 8A2EFA0DECC3EF7057A1C62BF1AECCA80 libmonochrome.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9155000 00000000 00004000 C1741AE46077EF13F70D0DC7D8A9DDE80 libwebviewchromium_loader.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9276000 00000000 00006000 C700FED4854EA9F553FC4EB1AC49DAD50 libqdutils.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D927F000 00000000 00007000 5AF3845B7F31952390092BB2318667B00 gralloc.msm8937.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D926B000 00000000 00823000 A91A29ADD65BB0AF28A4C9A6208E33C40 libllvm-glnext.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9AB7000 00000000 00316000 9F7E6C49A0A8C88C317716B031320CA30 libESXGLESv2_adreno.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9F1F000 00000000 0000C000 CEC6F7F71723450F4D1E527FA1BDDA310 libqservice.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9F30000 00000000 00007000 BB9F7CD0BF1178F273EB8B4D2D5C67C30 libmemalloc.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9F39000 00000000 00003000 B4B80A1B5D6C50F5C0DD7F1C29A9F6C10 libqdMetaData.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9F43000 00000000 00009000 0BA85EA850C07E5B86AF8281EF7641E70 libcompiler_rt.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9F4E000 00000000 0000B000 362BA72B9CF73AB8BD02283F491283E40 eglSubDriverAndroid.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9F5B000 00000000 0000B000 9BAA0F603A10810D4A6BEE7A903A762F0 libGLESv2_adreno.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9F68000 00000000 00007000 C08FDBDAB5792096DB0BEDBE3D23B48D0 libGLESv1_CM_adreno.so +08-17 20:31:35.732 F/google-breakpad( 2913): M D9F71000 00000000 00024000 C346DBBCF27F603F9321CCF737B3C0550 libESXGLESv1_CM_adreno.so +08-17 20:31:35.733 F/google-breakpad( 2913): M D9F97000 00000000 00010000 A7800610AD28E2DF469D023E70516C190 libESXEGL_adreno.so +08-17 20:31:35.733 F/google-breakpad( 2913): M D9FAB000 00000000 00006000 6CC274368542A8270BC225BE519068D80 libadreno_utils.so +08-17 20:31:35.733 F/google-breakpad( 2913): M D9FBC000 00000000 00009000 649C0C218A9C0A611E5E0DB24CDD058C0 libEGL_adreno.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DA4BC000 00000000 00020000 1195E0A668F3644AC0EC8D1122457A140 libkeymaster1.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DA4DF000 00000000 00018000 39E3D5620A966F5DB960EEE55CCD8BB30 libsoftkeymasterdevice.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DA4F9000 00000000 0001A000 C1B07DA2D52E6EC3C54992A3A953D63B0 libjavacrypto.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DA516000 00000000 00004000 B051A444B9312E4DAF242DA3A951538A0 libkeystore-engine.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DA51B000 00000000 00016000 1988D915061DDC4921FF608AD3E810AD0 libkeystore_binder.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DA534000 00000000 0000C000 DDF063ABB28459B09548F8329934DDEB0 libkeymaster_messages.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DC57D000 00000000 00016000 A686CFCA0E870C10B425EB769017BE930 libmtp.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DC593000 00000000 00052000 E9F8299757E5E543C03723101E5B1BEC0 libmedia_jni.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DC5E8000 00000000 00020000 ADF61BE35FF269EC7E7B32B1DDCD31E00 libexif.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DC616000 00000000 0000E000 ABA3C77DD3386AE87B586632CE1979D50 libstagefright_amrnb_common.so +08-17 20:31:35.733 F/google-breakpad( 2913): M DC634000 00000000 00007000 CD70BA801CA3E12D258565013535D7440 tcmclient.odex +08-17 20:31:35.733 F/google-breakpad( 2913): M DC645000 00000000 00004000 042B2B738C75036986EB80BC08A71F060 libextmedia_jni.so +08-17 20:31:35.733 F/google-breakpad( 2913): M E1E9B000 00000000 002B2000 FCA7431984CE2AEF979FFEEF99432D320 libart-compiler.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E215E000 00000000 000B1000 1EBE7A1A3E1A3134DE689251E1ABC0380 libvixl.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E2264000 00000000 0002B000 6E46C8EDE63F81CC2A4375E4F85517CD0 libopenjdk.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E2291000 00000000 00029000 4F845000DEA8066D684FEAB08A91A3480 libjavacore.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E22BC000 00000000 00138000 523FDEBEF6ECE577AF3716E9703AD4FF0 lib-imsqimf.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E23FA000 00000000 00004000 48E9F68098728AFF9A198AE7A14A7F700 libmdmdetect.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E2400000 00000000 00005000 12F24D77003A5660A06BA8690696A5C30 libconfigdb.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E2405000 00000000 00085000 DB9D3DADFB06F6B1AB9CEC5443F295370 lib-imsxml.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E2496000 00000000 00005000 F812502D41A460BDD2D9AA83A9564CC70 libqmi_encdec.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E249C000 00000000 0001C000 A53A45C88FFCD4CB3AFF323AF8FFFBAB0 libqdi.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E24B7000 00000000 0006A000 D110B55DE7DB9FD5086D2D1CE57152480 libdsi_netctrl.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E2534000 00000000 00023000 E7FB6A8B99C97103F258028CF27324660 lib-imsrcscm.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E255A000 00000000 0001C000 5BE35B9E5D50332052532AE119C50B930 libnetmgr.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E257A000 00000000 00004000 AB354652140A356C9787104C87CB30E00 libidl.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E2581000 00000000 00004000 63ED38853810ED69BA1AA57CE82E74B10 libtime_genoff.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E2587000 00000000 00004000 51134658113749962ABB7BA3A3C5E9740 libqmi_client_helper.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E258E000 00000000 00009000 1D288EC9F32773EBC0D380D4E238D8D60 libqmi_client_qmux.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E25C9000 00000000 0006A000 60BAE0DAB14BFBC4BE1805CC4CAF8B4D0 lib-imsdpl.so +08-17 20:31:35.734 F/google-breakpad( 2913): M E263D000 00000000 00019000 0333752023452FF1E40F6BA9169471500 libdiag.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E274E000 00000000 0002C000 0FC3AF7C85EA4B0DA653AEA111020A2D0 libqmi.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E27B7000 00000000 000B8000 023971CEF8E022AAD4090C7D1432C3690 libCB.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E6BB5000 00000000 00005000 F841612CF1D458AB70296575A996EE5F0 QPerformance.odex +08-17 20:31:35.735 F/google-breakpad( 2913): M E7D93000 00000000 00461000 39CBB6C545073B5DB56B60665F81D4B00 libart.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E8384000 00000000 00001000 7691C4BE084B030B3AA118A6F412EE260 libqmi_common_so.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E8387000 00000000 0000A000 37A576E22F2B9973E1734E556E1E99990 libqmi_cci.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E8395000 00000000 00003000 DCDF68ACFBFC2DEFC89FA0F5783199070 libpackagelistparser.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E839A000 00000000 00056000 0C1D30C5E6EA7E82800A2B00935E4B060 libharfbuzz_ng.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E83F3000 00000000 00037000 8AF00237A05209C2E429D0F70ED3EB900 libopus.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E842C000 00000000 00017000 215A7F63855CB46EC59B425BEDFD847D0 libminikin.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E8447000 00000000 00018000 EAB4CCC4544F5D8E2ECF256D527F4A430 libutils.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E8461000 00000000 0001E000 CCAA49412B791630FD4EAD7755A3E4CD0 libvorbisidec.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E8481000 00000000 00008000 F3F7CCE4ADD14C5DB852DF06407AE2FA0 libcamera_metadata.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E848C000 00000000 0000E000 1F6ED3D6536346B3B20CF40C5F9799D80 liblog.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E849D000 00000000 00010000 D6821B30C7A106C623EEE331974C9BF50 libGLESv2.so +08-17 20:31:35.735 F/google-breakpad( 2913): M E84AF000 00000000 00014000 22B107B0382117ED603FF6000B248B8D0 libpcre.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E84C4000 00000000 00040000 9CC9AFC89D88D4C4AE6AEF2E290594B70 libinputflinger.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E8508000 00000000 00005000 459EC08F2C9F91A7E6AB6F293540B4510 libstdc++.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E850F000 00000000 00005000 DE5A396AAF801AF9A298A50BADE143E60 libspeexresampler.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E84F0000 00000000 00B36000 F1644AA2ACE475925E0DA02A814C13DF0 libLLVM.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E9081000 00000000 00008000 225E121AA129BB96606A1B3B91A2737A0 libnbaio.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E908C000 00000000 00017000 9A6B379EB3F10874FC241C570801C6070 libmemunreachable.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E909C000 00000000 0005F000 0FAC08487B9CD62449A19C8D161E7D820 libgui.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E9109000 00000000 00004000 E9B0F0A724940363FCBE11FB96B6ADF30 libnativebridge.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E910D000 00000000 0007B000 B44B5897A497DCB27C105B61AC30F1180 libhwui.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E918B000 00000000 0008B000 DCAB7F6AA60C5E74587E56973C6653120 libc++.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E921C000 00000000 00003000 3C7CC5BEA31C9C85C9BC25EC0891B7B10 libsync.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E9221000 00000000 00009000 4334A7FB3D1CB8582D4D676DE6E5E2930 libpiex.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E922A000 00000000 0000E000 EBD0DA428C58F5CBD72761DD6F1C03A10 libsoundtrigger.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E923D000 00000000 00020000 27C83DAE0AB0E161280BB40C384BD4BC0 libm.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E925F000 00000000 00003000 C9108BAA1E466D60D4591919420BBB6A0 libradio_metadata.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E9264000 00000000 0000E000 63E3F027146D592F9FBE03A33EDC8C6D0 libimg_utils.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E9275000 00000000 00015000 53AF0C4E2096697687AC0081AC7AD97C0 libunwind.so +08-17 20:31:35.736 F/google-breakpad( 2913): M E92D0000 00000000 0001F000 9F74D840029038F65C040D5492CAE7360 libinput.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E92F5000 00000000 00005000 17620CAE201DC01DFD868F3276E8AA810 libpowermanager.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E92FD000 00000000 00055000 5E4B1D0F4D553AA92665AE0925229AF40 libsonivox.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E9359000 00000000 00006000 E727B84B0F5B3D982CAE8FB6E64B88030 libtiff_directory.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E9362000 00000000 00021000 52D2F4BBC71C3EE2E161E009B0331EF80 libstagefright_foundation.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E9386000 00000000 0003B000 2D4A4F8139C7842165EA73A6ACD835340 libjpeg.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E93C3000 00000000 00003000 9945E8F5AE0ADE1ED46FA08B41A6C9BE0 libmemtrack.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E93C6000 00000000 00019000 D2D0067E628DCC03418B99399D251A990 libEGL.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E93E4000 00000000 00019000 6534179E8DC7D8EDBF1236C375D51ECD0 libdrmframework.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E93FB000 00000000 00110000 994744AF5261DAC7CD0003EC5456DBDF0 libicuuc.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E9519000 00000000 00015000 BDA36CE4717D8C1A324C7CA4E1CA9B860 libvulkan.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E9521000 00000000 000F8000 91002184018FFAC8E26ECCB238E392440 libandroid_runtime.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E962A000 00000000 00004000 644559B020FD089F8180BB62CF9420590 libprocessgroup.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E9629000 00000000 00183000 035813361AA690A2E08F1E059823C9D50 libicui18n.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E97B8000 00000000 00008000 9D6466250A83301B3BE4CAA85227525D0 libnativeloader.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E97C0000 00000000 0000E000 031F092D2D476376D52F41FD2ADD2A3E0 libradio.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E97D2000 00000000 00003000 159F2CAC750E3DB60EF444F05BACCC850 libregionalization.so +08-17 20:31:35.737 F/google-breakpad( 2913): M E97D8000 00000000 00008000 16C813B71CC34E81BCF6F5DD8648DC3B0 libGLESv1_CM.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E97E2000 00000000 00003000 AA06FF77B6E4CC83470C006104304D0F0 libhardware.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E97E0000 00000000 00039000 B613B07CCC9703A9AAE92861C92202BD0 libcamera_client.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E980D000 00000000 003A9000 42F6682A5C7E8B66743C6087B578D6C40 libskia.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9BDC000 00000000 00007000 AD9132F0D394659639CBE5858DD1BB750 libhardware_legacy.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9BE7000 00000000 00005000 EE5BF022DE057918231B46C6EDDC38690 libstagefright_yuv.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9BEE000 00000000 00007000 9BC1C9D1E638BF1B7B32AC308B08D9DA0 libimage_type_recognition.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9BF7000 00000000 0000D000 3C492E547FA88D7E2E85BD9451F613090 libbacktrace.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9C07000 00000000 00007000 B165EC37228240E1EBEDC14160C16A3A0 libnativehelper.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9C10000 00000000 0001A000 4D1780AFB25B59BBD625608B400D70C20 libprotobuf-cpp-lite.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9C2D000 00000000 00004000 989F274AF037FE14219BE6DC42503B950 libnetd_client.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9C33000 00000000 000A0000 8E23BB4E73E86B4A2AD4C17D7BAFD8A90 libcrypto.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9CE0000 00000000 00003000 675D9BCC56AB210C8017D6625F994D250 libstagefright_enc_common.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9CE5000 00000000 00024000 CC51150390EA9EFB0315C02573CCFD000 libpng.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9D0B000 00000000 0003B000 4FBF4968372FEB1C8D593076E1B171610 libRScpp.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9D49000 00000000 0000A000 415DAD77CED2441456E20CAD35C536250 libRS.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9D55000 00000000 00004000 F168A985060F7993C937719998C96FD20 libusbhost.so +08-17 20:31:35.738 F/google-breakpad( 2913): M E9D5B000 00000000 00086000 58C592B73EA51A0AFC3287247961D0940 libdng_sdk.so +08-17 20:31:35.739 F/google-breakpad( 2913): M E9DE1000 00000000 00057000 44C1EA73F38E47E95712BF5848E8937E0 libbinder.so +08-17 20:31:35.739 F/google-breakpad( 2913): M E9E3F000 00000000 0002E000 2824A9CACA3A870AD713A3405D6249530 libwilhelm.so +08-17 20:31:35.739 F/google-breakpad( 2913): M E9E72000 00000000 00030000 E9CE28F8F628E4501925FF4D0FD6168F0 libstagefright_omx.so +08-17 20:31:35.739 F/google-breakpad( 2913): M E9EA0000 00000000 00487000 3CD6A967C46ED23F4AB4B39092B43AB70 libpdfium.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA337000 00000000 00004000 76B7583F8773D45C53E165CABC841DE70 libETC1.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA33D000 00000000 00015000 F0658EC8F5FCD09AB82C2EFC3A6834210 libui.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA355000 00000000 00038000 E4F681ED6DAD0F793516317FBE3DD55A0 libRS_internal.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA390000 00000000 00016000 0DB58A0AF796EA03A43AAD505A8723310 liblzma.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA3AE000 00000000 00011000 2618247A47A298A5C4574CC818C7F3280 libselinux.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA3C1000 00000000 00005000 961542B344C4A0F54F87B49C0F1429E80 libwpa_client.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA3C8000 00000000 00007000 5FF53AA38050A1DE3BF7A4D755DC75B70 libaudioutils.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA3D1000 00000000 00017000 31235ADAF427BE11933CD87290CCAF050 libcutils.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA3EB000 00000000 00036000 CBC6DC0C255BAB785FCD0511A7CBF0690 libbcinfo.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA423000 00000000 00003000 FDA204F888F3C0D8070BFDEC834066D20 libstagefright_http_support.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA428000 00000000 00005000 14FB257C9C6F43C8FA0B475D81C47FFC0 libbinary_parse.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA42F000 00000000 00009000 93F30055C78E1D80E40A8E717405CF500 libmediautils.so +08-17 20:31:35.739 F/google-breakpad( 2913): M EA43B000 00000000 0000A000 0F98C20EB2725367604DCE7EDA8EED9D0 libbase.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA447000 00000000 00016000 DC1FEB19B377562139F4F8AAFFA610710 libz.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA460000 00000000 00015000 68F77CDFB35DA081E510A50D11F299D70 libexpat.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA45D000 00000000 000C3000 3B22B766CDBB99263CF24B4CC2986E510 libmedia.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA541000 00000000 00031000 335A60B9AA0F00A47BD5A781CCA820740 libandroidfw.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA574000 00000000 0007A000 21086BE83826AA7DC32AB49C79D5CCE30 libsqlite.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA5F2000 00000000 0006C000 6EA54A19597F20D46626700FE9F206F50 libft2.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA64F000 00000000 0016B000 4E69F13734FEABE1CA5BA98594235DCD0 libstagefright.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA7D3000 00000000 00007000 475E29D0A243BEE93EC1A630C99503FC0 libnetutils.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA7DC000 00000000 00084000 49B02E01AEC77331A1D6D19B540265610 libc.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA86E000 00000000 00025000 8B6ECC65C09CAFF5ACAAB6C9249CD2C20 libssl.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA896000 00000000 00008000 22114C778A7ED1CC3953CCB22323EA1B0 libstagefright_avc_common.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA8A1000 00000000 00003000 7FA19C935E6148BD8002A3CA630C4E6F0 libsmemlog.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA8A1000 00000000 00017000 EEAF8ABB6827B80A458A5D483E5562400 libqmiservices.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA8C1000 00000000 00008000 090640ECFC69E16A25A3E27006AF282E0 libxml.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA8CC000 00000000 00012000 67F4D476A96F053ACB61531379FCC4810 libdsutils.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA8EF000 00000000 00014000 EFD5F0A0F81252A037F1C06B8E6809700 libsdsprpc.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA905000 00000000 0003E000 C4311189AF8DA8405EDC0701CD38FC770 libgsl.so +08-17 20:31:35.740 F/google-breakpad( 2913): M EA99F000 00000000 00014000 75BC34362D3F387A08AE8241CED8E2550 libadsprpc.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EA9B2000 00000000 0001A000 840BD6EAC45DEFC59D2F1E8C681CFF1A0 lib-imsrcscmclient.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EA9DA000 00000000 00011000 6034A9FBADF19CE6C259DA006E8158FC0 lib-imsrcscmservice.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAA09000 00000000 00003000 7BB31E1D28279A11B8087C3F4DF7D0BA0 libqti-at.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAA0E000 00000000 0000C000 7D5A1CA22F6A85FCC57B3D36A92461560 lib-ims-rcscmjni.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAA1C000 00000000 00012000 FAD2DBDF65F36590FFE591C62DBEFA1E0 libOpenCL.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAA38000 00000000 00003000 025B4D5BBA39265D6260B27597E321730 memtrack.msm8937.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAA3D000 00000000 00011000 F5FF7C8214A82029405A068BCDF69A580 libmediandk.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAA53000 00000000 00008000 5373A05304D5AFD8BC2BB49D6C22977D0 libopenjdkjvm.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAA5C000 00000000 0000F000 96A60B84ED1352C202B6695FD32373790 libmediadrm.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAA6E000 00000000 00010000 3D880E60A39C482BA4210DA0AD4E20490 libGLESv3.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAA97000 00000000 00003000 F4CB54FA6F9A644292CE2DCC9FA89DA80 libqti_performance.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAA9D000 00000000 00004000 B2EAC3688B9EFF0E79EA2C170AA859C50 libwebviewchromium_plat_support.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAAA5000 00000000 00004000 837BE31E60CD67A2C45BF27A1E8C10140 libOpenSLES.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAAAB000 00000000 00004000 3C4D0169CD09A3AEEC0868A7FC87CCFA0 libOpenMAXAL.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAAB0000 00000000 00016000 BAF17608D25635EFA63708C89561474D0 libcamera2ndk.so +08-17 20:31:35.741 F/google-breakpad( 2913): M EAB53000 00000000 00003000 78C8F6360CF612E4333D4EB1796927460 libqti-perfd-client.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EAB57000 00000000 00014000 01EE9AC4109E06B182E77B55242AEBE20 libandroid.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EABAF000 00000000 00003000 4C4B6F03AF5049885FD4A43F149D13630 libjnigraphics.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EABB0000 00000000 00090000 FBA40D2822A0C6DCF7CE29FB42DC37230 libmediaplayerservice.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EAC7B000 00000000 0000A000 52C41240B217BFE92F7381218169FD760 liblz4.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EACF9000 00000000 00038000 FEF1DA3EC5AA99E4FF38C1DF2A9A91570 libavenhancements.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EAD35000 00000000 0002F000 85E4C8F7646AA02A46215564266690BA0 libstagefright_wfd.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EAD6A000 00000000 00026000 7B91D8B6A15FF171BF114D8D638785D80 libstagefright_httplive.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EAD94000 00000000 00003000 6DE080E13BB1741A34C157CE97277ABD0 libsigchain.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EADE7000 00000000 00003000 1390052238CBD9474F1747EA0BA53C740 libExtendedExtractor.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EAE32000 00000000 00006000 3B45281FC4EB699207799FD6018FBD910 libvendorconn.so +08-17 20:31:35.742 F/google-breakpad( 2913): M EAEB2000 00000000 0005F000 7AC50A488023F3DA8182906BDFFA72C10 linker +08-17 20:31:35.742 F/google-breakpad( 2913): -----END BREAKPAD MICRODUMP----- +08-17 20:31:35.770 W/google-breakpad( 2783): ### ### ### ### ### ### ### ### ### ### ### ### ### +08-17 20:31:35.770 W/google-breakpad( 2783): Chrome build fingerprint: +08-17 20:31:35.770 W/google-breakpad( 2783): 37.3.0 +08-17 20:31:35.770 W/google-breakpad( 2783): 668 +08-17 20:31:35.770 W/google-breakpad( 2783): ### ### ### ### ### ### ### ### ### ### ### ### ### diff --git a/src/processor/testdata/microdump-x86.dmp b/src/processor/testdata/microdump-x86.dmp new file mode 100644 index 0000000..ece9ef4 --- /dev/null +++ b/src/processor/testdata/microdump-x86.dmp @@ -0,0 +1,174 @@ +01-25 09:57:54.139 F/google-breakpad(23467): -----BEGIN BREAKPAD MICRODUMP----- +01-25 09:57:54.139 F/google-breakpad(23467): V Chrome_Android:49.0.2623.15 +01-25 09:57:54.139 F/google-breakpad(23467): O A x86 04 i686 asus/WW_Z00A/Z00A:5.0/LRX21V/2.19.40.22_20150627_5104_user:user/release-keys +01-25 09:57:54.139 F/google-breakpad(23467): G UNKNOWN +01-25 09:57:54.140 F/google-breakpad(23467): S 0 FFB44BD0 FFB44000 00004000 +01-25 09:57:54.152 F/google-breakpad(23467): S FFB44000 A4C46FF7E429FAF30000000046BD6DF7E429FAF30000000000000000A4C40101303B3BCF88D06FF7A841B4FF160000000000000000000000000000000300000011000000000000000000000050000000A70A39F71CC740F7A841B4FF12093DF70B000080D440B4FF1E1239F7A4C46FF7A7B471F7C00973F7C0253DE780B571F704D000F4E02000F48029FAF3B8C96DF78029FAF30000000059B571F7A4C46FF7D440B4FF0001FEC1000000004D316EF70000B1E6D440B4FFA841B4FF46000000A841B4FF04000000E9083DF71CC740F7A841B4FF88D06FF7F841B4FF003031F70001FEC1460000001E1239F7A4C46FF7A841B4FFE62F31F7A4C46FF790336EF70001FEC17041B4FFD9C86DF7A4C46FF7404B01E716000000F841B4FF08336EF7A4C46FF7A841B4FF7041B4FFCC336EF7A841B4FF01000000A841B4FFB8196DF718FD20F7B6336EF718FD20F72D761DF7A841B4FF03000000A841B4FF7041B4FF01000000CC6D08F4000000000000000000000000000000000000000000000000 +01-25 09:57:54.153 F/google-breakpad(23467): S FFB44180 000000000000000000000000000000000000000001000100000000004051000000000000FFFFFFFF000000000001FEC150000000780000005000000000000000000000000000000000000000010001D4000000008082173300000000301F97F30C42B4FFB46238CF01000000A0B203E70000000018FD20F71842B4FFCE0C1DF720B803E78087C0CA590D5CF7BCAB6AF7A0B203E7BCAB6AF7D050F8F3ED2FE8F3306D08F4C00973F7D08F2DED80B571F7D08F2DED8842B4FF00000000F8B371F7D08F2DED6442B4FF6842B4FFBCAB6AF7A0B203E7FFFFFFFFEEF36674B10F5CF7B8B203E70000000000005700BA86ECF3A70A39F71CC740F70000000095D63CF70B000080FFFFFFFFD050F8F3ED2FE8F3306D08F4FFFFFFFFA0B203E73C4695F30800000008E61C71C00973F74000000040000000400104F404D000F40000000000000000000000000000000000000000040167748028CB328028CB32DAF96674904E1D717A0700006E7E7D0000000000D074E7320000000004016774902C7CF7 +01-25 09:57:54.153 F/google-breakpad(23467): S FFB44300 81000000A832FAF31CC740F7E01239F7F0000000A832FAF3810000000100000000000000A832FAF3C00973F7315972F7190000004843B4FF080000000B000000380000009057E532D050F8F3ED2FE8F3306D08F4A832FAF380F9C2CAD971AFF5A832FAF3463031F7082150F77AD447F7380000009443B4FF9843B4FF9813B9F5C06FBECF9057E532C06FBECF9354AFF58032FAF30100000000005700BA86ECF33754AFF5BCAB6AF7FFFFFFFF00000000306D08F49057E532C06FBECF804395F3FFFFFFFF56345DF7FFFFFFFF30AC537308000000306D08F4C06FBECFFFFFFFFF78521D718028CB3202000000D074E732589F1D712456B4FF010000009865E77008000000306D08F4CC7D83D43C4695F3C06FBECFFFFFFFFF9057E532502F717410F20D71C06FBECFFFFFFFFF2E717474888D0E718028CB3200000000D074E732588B0E714000DB3200000000BA5E747400890E710000000000000000FFFFFFFF3C7274744000DB3200000000F3727474D88D0E718028CB32020000005075E732 +01-25 09:57:54.154 F/google-breakpad(23467): S FFB44480 00000000306D08F4005FB0D45C2FE8F35075E73202000000000000003C4695F370D77374000000004000DB32DFD87374C0780E71FFFFFFFFFFFFFFFF0000000038040000800700000000803F0100000008000000001087448007000038040000F00000000000003F0000000000000000306D08F48054E63200824DCC804395F3FFFFFFFF8054E632FFFFFFFFC40F747308000000306D08F400824DCCFFFFFFFF0000000000000000FFFFFFFF88AE95F3007F1D712456B4FF010000009841E7700800000000000000809CE532609DE53200824DCCFFFFFFFF8054E632C0F86F74585F0D7100824DCCFFFFFFFFE45A95F3901C0E710000000078B20D71209AE4328054E63200D8DF3274236C7406066C7498AB0D710000000000000000000000000000000000D8DF3200D8DF32EF106C7468AE0D7100E0DF3200D8DF320000000000000000000000000100000074256C7478B20D7100E0DF3200D8DF32609DE532380400000600000003BBCDC5C0D7C932609DE53200E0DF32D446B4FF00000000 +01-25 09:57:54.154 F/google-breakpad(23467): S FFB44600 000000000000008000800000AC4A90C900D8DF3200D8DF320000000009226C7400B20D7140E79BC0000000000000000038040000060000000100000001000000019A01F40000000034000000380400000600000001000000010000000000000000D8DF328061E632D050F8F3ED2FE8F3306D08F4AC4A90C9010000003C4695F30100000008E61C71C00973F78DFB71F7F84F1D71B446B4FFB846B4FF0000000000000000000000000000000000000000040167748028CB328028CB32DAF96674904E1D717A0700006E7E7D0000000000A017C03200000000040167745404677498501D718028CB328028CB32F1E9667448281871306D08F46E7E7D0000000000A017C03200000000C075E032C869E670080000006E7E7D00010000009F93B0D4040167747017C0328028CB32A501677420501D717017C0326E7E7D0000000000A017C03200000000608517336E7E7D000000000000D8DF32F3B79AF3E9A2B0F340A102F43C2696DE52B8DE3D0000000074186774030000000100000074C9F7F3 +01-25 09:57:54.155 F/google-breakpad(23467): S FFB44780 000000001849B4FF1FB89AF3A43296F340A102F43C2696DE0400000000D8DF3252B8DE3DCDCC4C3DC02DDC32804395F38028CB3201000000A017C032F8D702EF3C2696DE8028CB32C02DDC32A017C03200000000000000000000000001000000080000006E7E7D00000000009CE0D4F300000000000000000000000000000000000000009848B4FF9748B4FFBCD032547E4BB4FF0B0000005048B4FF3803000000000000380300005048B4FF032E5FC74048B4FF4848B4FF000000009F93B0D45048B4FF38030000E75EC4C70B0000004E616D653A09636F6D2E6368726F6D652E6465760A53746174653A0952202872756E6E696E67290A546769643A09383233330A5069643A09383233330A505069643A093736320A5472616365725069643A09300A5569643A0931303136330931303136330931303136330931303136330A4769643A0931303136330931303136330931303136330931303136330A464453697A653A093235360A47726F7570733A093330303120333030322033303033 +01-25 09:57:54.155 F/google-breakpad(23467): S FFB44900 2039393937203530313633200A566D5065616B3A092031363034313634206B420A566D53697A653A092031343137343136206B420A566D4C636B3A092020202020202030206B420A566D50696E3A092020202020202030206B420A566D48574D3A092020323538343230206B420A566D5253533A092020323134333936206B420A566D446174613A092020333835373038206B420A566D53746B3A092020202038313932206B420A566D4578653A092020202020203532206B420A566D4C69623A092020323035373732206B420A566D5054453A092020202031313536206B420A566D537761703A092020202020202030206B420A546872656164733A0935390A536967513A09302F33313230320A536967506E643A09303030303030303030303030303030300A536864506E643A09303030303030303030303030303030300A536967426C6B3A09303030303030303030303030313230340A53696749676E3A09303030303030303030303030303030300A5369674367743A093030303030 +01-25 09:57:54.156 F/google-breakpad(23467): S FFB44A80 30303230303030393466380A436170496E683A09303030303030303030303030303030300A43617050726D3A09303030303030303030303030303030300A4361704566663A09303030303030303030303030303030300A436170426E643A09303030303030303030303030303030300A536563636F6D703A09300A437075735F616C6C6F7765643A09660A437075735F616C6C6F7765645F6C6973743A09302D330A4D656D735F616C6C6F7765643A09310A4D656D735F616C6C6F7765645F6C6973743A09300A766F6C756E746172795F637478745F73776974636865733A0934303930390A6E6F6E766F6C756E746172795F637478745F73776974636865733A0931383937370A0300000000000000E66441F70000000029200000000040F7650000000A0000001E1239F71CC740F7402C7CF7902C41F71851B4FFD20739F7902C41F7D04BB4FFD84BB4FF980739F706000000000000001CC740F79D0B39F7292000002920000006000000C6E97CF7020000000C4CB4FF590B39F71CC740F7 +01-25 09:57:54.156 F/google-breakpad(23467): S FFB44C00 4C4CB4FF504CB4FF1851B4FF463333F7402C7CF706000000E9CB37F71CC740F7273333F71CC740F74C4CB4FF56BF32F7060000004C4CB4FF0000000073E132F7E46441F701000000449500F4DFFFFFFF47E132F71CC740F7592D5FC708BF32F7AC4A90C900000000444DB4FFC92E5FC7C4F99BC90700000089D437F70000000097AB37F7962E5FC7AC4A90C9ED5560C7E04CB4FF650000000100000068F440F7306D08F45A0600005A0600000A4495F3306D08F45D001000E04CB4FF2051B4FF306D08F4010000007100000065000000D0DFEDD10020183300000000E42F50735B464154414C3A6A6E695F616E64726F69642E636328323333295D20436865636B206661696C65643A2066616C73652E20506C6561736520696E636C756465204A61766120657863657074696F6E20737461636B20696E206372617368207265706F72740A000000010000006F0E4C7300201833000000005A0600004329507378641A7100201833F88BA670001303F400B8D570C08C1733F40D1F731E8BD2F3 +01-25 09:57:54.157 F/google-breakpad(23467): S FFB44D80 60D9FE7000B8D570587B19711E8BD2F30A00000038C006752900000000101833B8C30271690064005A0600005A0600005A0600005A06000000B8D5705A060000A70A39F71CC740F70000000074C9F7F3E09A01F45D0020005D002000CE73D6F3F09A01F45D00200049000000CE73D6F334205073E8CB037500101833884FB4FF0C000000AC4A90C9E84EB4FF4765AAC7C44EB4FF404EB4FF904EB4FF95D63CF70B0000800000000000000000884FB4FF0C00000003000000010000005A06000004D000F4A82200F4010000002000000020000000400104F404D000F474C9F7F37C4EB4FF4E6C5971704FB4FF636095F3A70A39F71CC740F70000000095D63CF70B00008074C9F7F3E9083DF7CCE7CCC4AC4A90C9F86B9CC9884FB4FFFB73A9C7004FB4FF046C9CC9CE1439F74000000040000000400104F404D000F495D63CF7A70A39F71CC740F70000000095D63CF70B0000802051B4FFB84FB4FFA0ECEDC42051B4FF734FB4FF030000002000000004D000F4502000F404D000F480000000 +01-25 09:57:54.157 F/google-breakpad(23467): S FFB44F00 80000000400104F404D000F41F95A9C7A70A39F71CC740F73FA304C212093DF70B000080C84FB4FFB84FB4FFA244A8C7EC4FB4FF2051B4FFE9083DF71CC740F704D000F4802000F4884FB4FF003031F7C073F4CB1CC740F71C51B4FF12093DF70B000080E62F31F7AC4A90C915ABA9C7C073F4CB333300003ED63CF71CC740F72051B4FFAC4A90C9E9083DF71CC740F73FA304C2BF0EFEC1D84FB4FF003031F700A304C2463031F74000000000A304C220000000E62F31F7AC4A90C915ABA9C700A304C21F000000EB5BCEC4AC4A90C92051B4FFAC4A90C94051B4FFC45BCEC400A304C23F00000000000000902400F4000000000000000080000000800EFEC1802AC2CEC073F4CB3F000000000000002051B4FF3F000000EB5BCEC4AC4A90C92051B4FF3F0000004051B4FFA686CEC44051B4FF7F00000000000000D02400F400000000000000003F00000020000000B450B45B49000000DD85CEC4AC4A90C90E0000002051B4FFDC36CEC70F1CCEC42051B4FF2000000065A304C265A304C2 +01-25 09:57:54.158 F/google-breakpad(23467): S FFB45080 200EFEC1AC4A90C9330000000CA0CCC4CC50B4FFDC36CEC733000000000000001C51B4FF2051B4FF1C51B4FF5451B4FFDC36CEC70F37CEC720000000003031F70000BAC9E09A01F4F9EC38F70150B4FF1C51B4FF0000000000000000000000000000BAC900100000995160C7AC4A90C9E09A01F41851B4FF450020008F885EC71851B4FFDC36CEC733000000A158ABC73C51B4FF6F06100003000000DC4682C9884682C9886A9CC9000000000000000000000000800EFEC1E50EFEC1FF0EFEC1810000007F000000800EFEC1E50EFEC110000000F04682C902100000060000000000000000000000000000002051B4FF886A9CC90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000001C0000006436CEC7E90000002500200029001000C9875EC7AC4A90C97C52B4FFE09A01F47052B4FFC10EA4C5E09A01F42FF9D3C46F0610002E0CA4C53052B4FF3852B4FF4052B4FF4852B4FF5052B4FF5852B4FF610000002FF9D3C4 +01-25 09:57:54.158 F/google-breakpad(23467): S FFB45200 6052B4FF18A304013D0020003900000035000000310000002D001000290010002500200021000000410010006852B4FF21000000E09A01F425002000E09A01F429001000E09A01F42D001000E09A01F431000000E09A01F435000000E09A01F439000000E09A01F43D002000E09A01F441001000E09A01F4260000000000000000000000000000000000000000000000A70A39F7AC4A90C9B30BA4C5AC4A90C9A03A45CF205CB8C001000000C0F8A3C5A03A45CF0900000004000000205CB8C001000000F85AD6C469AB66C7AC4A90C9B1847BCA1853B4FF470B9CC96161D0C4005CB8C0B1847BCA69AF66C7AC4A90C9C853B4FFF6C666C7AC4A90C99661D0C41853B4FFB1847BCA00000000ADB266C7C853B4FFE02000F4005CB8C089F8A3C5AC4A90C9C853B4FF4055B4FFEF395FC7A0847BCAC053B4FFDC53B4FF3B47D4F3A87A0B71CC68387401000000BB243BF7A7B471F7C00973F774C9F7F3F0A7D5F34C54B4FF010000000000000074C9F7F374C9F7F3A87A0B71E853B4FF447FD4F3 +01-25 09:57:54.159 F/google-breakpad(23467): S FFB45380 4C54B4FF682D2071C053B4FFB053B4FF800EFEC1B453B4FF1E1239F7B84872F700B971F7CC6D08F4009A01F40000000000000000502500F41CC740F7B2D932F76C02A4C59054B4FF0000000000000000F025FAD40000000000000000000000000B0000801001FEC120000000E00100000000000056D932F729395FC7AC4A90C9C0D00BEF400B9CC94055B4FFEDC460C764D10BEF3763C4C74055B4FF301F97F34C54B4FFB46238CF01000000F6BBD5F34C54B4FF00000000000000000000000020927BCA007A45CF6C54B4FFB87FF7F3306D08F400000000000000004056B4FFCC68387400000000000000000000000000000000A87A0B71180000009F93B0D400A304C200000000EB9564C774C9F7F3306D08F4F4010000606238CF058DC6F3606238CF306D08F4010000000000000007000000AC4A90C9202000001868DB15AC4A90C90100000059C460C7AC4A90C94055B4FFC0D00BEFC0D00BEFC4CD60C7C0D00BEF4055B4FFAC4A90C9DFA760C707DB61C7AC4A90C9CCD00BEF9DC760C7 +01-25 09:57:54.159 F/google-breakpad(23467): S FFB45500 7092B0CF706238CFB9CC60C7AC4A90C94055B4FF7092B0CFC0D00BEFBED360C7C0D00BEF4055B4FFB029FAF38A3C6EF75055B4FF5855B4FFCCD00BEF4855B4FF808D51D3000000000000000000000000A0847BCA6661D0C4D033DDC78286B4C7CA0000006C02A4C5A18400000100B0D4606238CF306D08F499D260C7AC4A90C9C071F13201000000C0D00BEF72E660C7C0D00BEF306D08F4C00973F78DFB71F700000000C455B4FFC855B4FF000000000000000000000000CE9C75EAC050F8F3080000000100000000005700BA86ECF3010000004000C032000043000200000074C9F7F32E68387449E660C7FFFFFFFFC071F132FFFFFFFFF004C032CD2696DEE09A01F42C56B4FFC0D00BEFFFFFFFFFCE9C75EA0100000001000000C869E670F8D702EF5459B4FF01000000F004C032080000002E683874C071F132DD6C3874F004C032C071F132FFFFFFFF24C296DEC0D802EFF004C032C0D00BEFFFFFFFFFCE9C75EA010000000053D2120000000000000000C071F132F004C032AD84BE73 +01-25 09:57:54.160 F/google-breakpad(23467): S FFB45680 A05F0B718029B0E6FFFFFFFF6A7E7D0000000000385ADA70320000000C07B573DA1938740053D212F004C0326F1B387458700B714000C032000000009EE2BE7329200000B3270000000000004020C032C071F1324000C03229200000B32700000000000000000000FFFFFFFF1800DC0060B6BF730053D212A8C91B71A1B7BF73A8C91B7120BCB37000000000D0E6B3703E21A574C059B4FF7360ADEB8010C0320031C0320000000000000000000000007180ADEB40000000000000007480ADEB5C57B4FF2E760F725058B4FF336295F3000000009010C0327B80ADEBCC6D08F4306D08F474C9F7F3E857B4FFD21B96F3A8C91B714C58B4FF04000000306D08F43458B4FF2B760F72306D08F401000000B07BF7F3306D08F4000000002B760F72B457B4FF3458B4FF00000000B491DEF3102301F45059B4FFA45AB4FF00000000306D08F49855DB70000000009F93B0D41C58B4FF306D08F44010CF1274C9F7F34C58B4FF1459B4FFE858B4FFCFC4D2F3A8C91B71306D08F44C58B4FF04000000 +01-25 09:57:54.160 F/google-breakpad(23467): S FFB45800 3458B4FF2B760F72E03DCD120000000034A0A4742B760F723C58B4FF2B760F7200000000003ECD123458B4FFA8C91B71F00E117100000000000000002B760F7202000000040000004C58B4FFE03DCD12306D08F4000000008D0DA5744835E8F3306D08F4B0BBCD12503CCD1200000000B0BBCD12001303F400000000045A95F34010CF12306D08F40000000000000000402D20714000000000000000FFFFFFFF8D0DA57400000000000000008810A574600D1171A011C012801ECE123C4695F30000000000000000030000009F93B0D4B0BBCD12804BCE12204BCE1274C9F7F3D0BFCD1203000000EE18A5742499CAF31459B4FF5C59B4FF000000006459B4FF01000000010000000000000003000000004BCE12306D08F4E09A01F4C010FAF3D0BFCD1203000000003ECD12755B4D73E09A01F45C59B4FF000000006459B4FFD0BFCD1203000000EE18A574127195F3E08D1A7100000000030000007000C032000000007010C032000000000543A574EE18A5747000C032030000006919A574 +01-25 09:57:54.161 F/google-breakpad(23467): S FFB45980 B00D1171D0BFCD1200000000003ECD124011C01200000000A011C0126011C0127010C032000000000000000058EBF2703E21A574E09BBA70030000004D22A574F00E1171A000C0326025C27000000000F00E1171E8BFFEEE8093FD74A000C032FFFFFFFF10C0FEEE6025C27001000000E6DE0000C801C370D60B000010F2C51238DBFDEE01000000B892FD74061087ED38DBFDEEB892FD7401000000306D08F44C5BB4FF90AAF9F3005BB4FF010000004C5AB4FFBC6C83ED305BB4FF336295F300000000A082C61240A102F4CC6D08F4306D08F474C9F7F3D85AB4FFD21B96F338DBFDEE2C5BB4FF04000000306D08F4145BB4FFB96C83EDF85BB4FF505AB4FFD0E101F4010000001B0F65F7B96C83EDA45AB4FF145BB4FF01000000C4A49DF31A0F65F7000000000000000000000000D0E101F413000000803480ED9F93B0D400000000D0E101F40700000074C9F7F3605CB4FF2C5BB4FF885BB4FFD591D2F338DBFDEE306D08F42C5BB4FF04000000145BB4FFB96C83ED04000000395B98F3 +01-25 09:57:54.161 F/google-breakpad(23467): S FFB45B00 00000000E85BB400B96C83EDB96C83ED306D08F40000000000000000B96C83ED02000000040000002C5BB4FFA082C612BA86ECF3C050F8F3D0E101F47C7F80ED1D000000EC5BB4FF885BB4FF74C9F7F310F2C512E85BB4FF000043000100000010F2C512F05BB4FFE85BB4FF0000000038DBFDEE040000001D0F65F774C9F7F3F45BB4FF38DBFDEE306D08F41147BFF3D85BB4FFF45BB4FF0000000038DBFDEE5C5CB4FF306D08F4060F65F71D0000001D0F65F7DC5BB4FF60AAF9F3045CB4FFEC5BB4FF40A102F4E45BB4FFE09A01F498F27CF7020000000000000000005700000000000000570000000000000057001D0F65F7306D08F4E09A01F4C010FAF3306D08F443000000570000000010FAF3306D08F44300000057000000BCAB6AF760AAF9F31D0000000D0020008BF357F7E09A01F41D00000038DBFDEE5C5CB4FF60AAF9F31D0000000D0020003E3258F7E09A01F41D00000038DBFDEE0D0020000000000004D00AF4010000000100000000000000905CB4FF01000000A60E65F7 +01-25 09:57:54.162 F/google-breakpad(23467): S FFB45C80 E4F57CF70100000021000000E09A01F434930DF403DFBBF3C05BBCF3BBDEBBF39CFFFFFF20F67CF70400000027CC7CF700D00AF426DD32F71CC740F79F93B0D49CFFFFFF20F67CF709F573F7503D7DF70100000020F67CF774FE7CF74EA47CF70400000074FE7CF744F67CF720F67CF7297AB4FF3090F8F3692F58F7503D7DF7010000008C5DB4FF585EB4FF88927CF7A05DB4FF98F27CF78C5DB4FF01000000C85EB4FF000000000000000000000000000000000000000000000000C85EB4FFC45DB4FF805DB4FFA05DB4FF8C037DF7000001017C5DB4FFC85DB4FF040000008C5DB4FF04000000845DB4FFC45EB4FF080000000000000000A077F73090F8F330C000F410D400F4C00901F448337DF75090F8F302000000000000000400000088337DF7E87E6AF71040FAF32C000000000000000800000001000000297AB4FF4C00000030C000F448337DF700000000000000000000000004000000000000007838362C61726D656162692D7637612C61726D65616269000000000001000000 +01-25 09:57:54.162 F/google-breakpad(23467): S FFB45E00 00000000067B33F71CC740F74A623AF700700BF40010000001000000000000000000000000000000000000000000000001000000FD000000030000009F93B0D424A377F70100000079613AF71CC740F7C45EB4FFDC5EB4FF05000000FE3231F705000000C45EB4FFDC5EB4FF000000000000000000000000993231F7503D7DF7C05EB4FF00000000BC5EB4FF08977CF7C05EB4FF00000000308E7CF7A05EB4FF00337DF708337DF71C337DF7C05EB4FFADB978F700000000E00F7CF7BC5EB4FF05000000297AB4FF417AB4FF4A7AB4FF567AB4FF5F7AB4FF00000000757AB4FFB27AB4FFC57AB4FFDA7AB4FFF57AB4FF087BB4FF217BB4FF3A7BB4FF547BB4FFFC7CB4FFD97DB4FF747FB4FF897FB4FFA77FB4FFC77FB4FF000000002000000020E4FFFF2100000000E0FFFF10000000FFFBEBBF060000000010000011000000640000000300000034507CF7040000002000000005000000090000000700000000A077F7080000000000000009000000A5967CF70B000000000000000C000000 +01-25 09:57:54.163 F/google-breakpad(23467): S FFB45F80 000000000D000000000000000E00000000000000170000000000000019000000CB5FB4FF1F000000E07FB4FF0F000000DB5FB4FF00000000000000000000000000000000000000000000009F93B0D475A5398BA918E032A02885506936383600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.163 F/google-breakpad(23467): S FFB46100 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.164 F/google-breakpad(23467): S FFB46280 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.164 F/google-breakpad(23467): S FFB46400 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.165 F/google-breakpad(23467): S FFB46580 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.165 F/google-breakpad(23467): S FFB46700 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.166 F/google-breakpad(23467): S FFB46880 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.166 F/google-breakpad(23467): S FFB46A00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.167 F/google-breakpad(23467): S FFB46B80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.167 F/google-breakpad(23467): S FFB46D00 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.168 F/google-breakpad(23467): S FFB46E80 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.168 F/google-breakpad(23467): S FFB47000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.169 F/google-breakpad(23467): S FFB47180 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.169 F/google-breakpad(23467): S FFB47300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.170 F/google-breakpad(23467): S FFB47480 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.170 F/google-breakpad(23467): S FFB47600 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.171 F/google-breakpad(23467): S FFB47780 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.171 F/google-breakpad(23467): S FFB47900 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000636F6D2E6368726F6D652E6465760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000504154483D2F7362696E3A +01-25 09:57:54.172 F/google-breakpad(23467): S FFB47A80 2F76656E646F722F62696E3A2F73797374656D2F7362696E3A2F73797374656D2F62696E3A2F73797374656D2F7862696E00414E44524F49445F424F4F544C4F474F3D3100414E44524F49445F524F4F543D2F73797374656D00414E44524F49445F4153534554533D2F73797374656D2F61707000414E44524F49445F444154413D2F6461746100414E44524F49445F53544F524147453D2F73746F726167650045585445524E414C5F53544F524147453D2F73646361726400415345435F4D4F554E54504F494E543D2F6D6E742F6173656300424F4F54434C415353504154483D2F73797374656D2F6672616D65776F726B2F636F72652D6C69626172742E6A61723A2F73797374656D2F6672616D65776F726B2F636F6E7363727970742E6A61723A2F73797374656D2F6672616D65776F726B2F6F6B687474702E6A61723A2F73797374656D2F6672616D65776F726B2F636F72652D6A756E69742E6A61723A2F73797374656D2F6672616D65776F726B2F626F756E6379636173746C65 +01-25 09:57:54.172 F/google-breakpad(23467): S FFB47C00 2E6A61723A2F73797374656D2F6672616D65776F726B2F6578742E6A61723A2F73797374656D2F6672616D65776F726B2F6672616D65776F726B2E6A61723A2F73797374656D2F6672616D65776F726B2F74656C6570686F6E792D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F766F69702D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F696D732D636F6D6D6F6E2E6A61723A2F73797374656D2F6672616D65776F726B2F6170616368652D786D6C2E6A61723A2F73797374656D2F6672616D65776F726B2F6F72672E6170616368652E687474702E6C65676163792E626F6F742E6A61720053595354454D534552564552434C415353504154483D2F73797374656D2F6672616D65776F726B2F6F72672E6379616E6F67656E6D6F642E706C6174666F726D2E6A61723A2F73797374656D2F6672616D65776F726B2F6F72672E6379616E6F67656E6D6F642E68617264776172652E6A61723A2F73797374656D2F6672616D65776F72 +01-25 09:57:54.173 F/google-breakpad(23467): S FFB47D80 6B2F73657276696365732E6A61723A2F73797374656D2F6672616D65776F726B2F65746865726E65742D736572766963652E6A61723A2F73797374656D2F6672616D65776F726B2F776966692D736572766963652E6A6172004C445F5348494D5F4C4942533D2F73797374656D2F62696E2F6D6D67727C6C69627368696D5F6D6D67722E736F3A2F73797374656D2F62696E2F677073647C6C69627368696D5F6770732E736F3A2F73797374656D2F6C69622F68772F6770732E6D6F66645F76312E736F7C6C69627368696D5F6770732E736F3A2F73797374656D2F6C69622F68772F73656E736F72732E6D6F66645F76312E736F7C6C69627368696D5F73656E736F72732E736F3A2F73797374656D2F6C69622F6C69627463732E736F7C6C69627368696D5F7463732E736F3A2F73797374656D2F6C69622F6C6962706172616D657465722E736F7C6C69627368696D5F617564696F2E736F3A2F73797374656D2F6C69622F706172616D657465722D6672616D65776F726B2D706C756769 +01-25 09:57:54.173 F/google-breakpad(23467): S FFB47F00 6E732F417564696F2F6C696274696E79616C73615F637573746F6D2D73756273797374656D2E736F7C6C69627368696D5F617564696F2E736F3A2F73797374656D2F6C69622F68772F63616D6572612E76656E646F722E6D6F66645F76312E736F7C6C69627368696D5F63616D6572612E736F00414E44524F49445F43414348453D2F6361636865005445524D494E464F3D2F73797374656D2F6574632F7465726D696E666F00414E44524F49445F50524F50455254595F574F524B53504143453D31302C3000414E44524F49445F534F434B45545F7A79676F74653D3132002F73797374656D2F62696E2F6170705F70726F63657373000000000000000000 +01-25 09:57:54.175 F/google-breakpad(23467): C 0F0001000000000000000000000000000000000000000000000000007F03FFFF2000FFFFFFFFFFFFA70F7473230000004445B4FF2B00FFFF0A00000000000000FFFF0000000000000000FFFF7800000000000000FFFFFADCFFFFFFFF0100FFFF2E01FFFF90B60100FFFF00309276A38FF980F23F00309276A38FF980F23F000000000000000000000000000063000000070000002B0000002B00000002000000902C7CF72920000006000000292000000000000029200000864B39F72300000002020000D04BB4FF2B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +01-25 09:57:54.175 F/google-breakpad(23467): M F77C5000 00000000 0000D000 50D89C8096239F07B843A4C5C35923170 app_process32_xposed +01-25 09:57:54.175 F/google-breakpad(23467): M C4A68000 00E89000 04EB7000 7AEFEEE07C050930D779F813A65B7FE60 libchrome.so +01-25 09:57:54.175 F/google-breakpad(23467): M CF638000 00000000 00148000 1A8A2BF0604D9446617771B6897B96BA0 libblas.so +01-25 09:57:54.175 F/google-breakpad(23467): M D06BF000 00000000 00041000 253BBF60002FDEC2B9A3005415117F280 libRSCpuRef.so +01-25 09:57:54.176 F/google-breakpad(23467): M D1FB3000 00000000 00039000 507958F205384891BCB21E1FFB2E30620 libRSDriver.so +01-25 09:57:54.176 F/google-breakpad(23467): M E6217000 00000000 0001D000 36ABF97FDAFFF60863FA23FC1B540D6A0 libcompiler_rt.so +01-25 09:57:54.176 F/google-breakpad(23467): M E6243000 00000000 00018000 0DBD5467C6AB422397203A66A0E121750 libandroid.so +01-25 09:57:54.176 F/google-breakpad(23467): M E625B000 00000000 0000D000 AE6E13458FB630763E5ED161161B739D0 libpvrANDROID_WSEGL.so +01-25 09:57:54.176 F/google-breakpad(23467): M E6268000 00000000 000D0000 C28CF55E5E98E2B1EB84198BE1FC14190 libglslcompiler.so +01-25 09:57:54.176 F/google-breakpad(23467): M E633B000 00000000 0012B000 E147F17CF855F17795C1DC0A9CBB843C0 libGLESv2_POWERVR_ROGUE.so +01-25 09:57:54.176 F/google-breakpad(23467): M E6469000 00000000 0016F000 1891D5688EE312EFFF2A194AB6FF1C7A0 libusc.so +01-25 09:57:54.176 F/google-breakpad(23467): M E65DB000 00000000 000AC000 D20CCBE31F52F5AE0144452692BC9D610 libGLESv1_CM_POWERVR_ROGUE.so +01-25 09:57:54.176 F/google-breakpad(23467): M E668A000 00000000 0000F000 182671F227066A6551586589082D1D320 libdrm.so +01-25 09:57:54.176 F/google-breakpad(23467): M E6699000 00000000 000EA000 F6C6DA624665611B3A75C8617A45ED000 libsrv_um.so +01-25 09:57:54.177 F/google-breakpad(23467): M E6784000 00000000 0002D000 3D95B38C591077B213DA98AC767F766D0 libIMGegl.so +01-25 09:57:54.177 F/google-breakpad(23467): M E6B41000 00000000 00004000 0DF18ED649E4593BA356C7F4C48CEF510 libwebviewchromium_loader.so +01-25 09:57:54.177 F/google-breakpad(23467): M E7406000 00000000 00005000 CFD4567F004DC85AA15EFCA44B6DA69D0 libemoji.so +01-25 09:57:54.177 F/google-breakpad(23467): M E740B000 00000000 00027000 13EA00418F2B15CED6BAB031DF0FC9E60 libswresample.so +01-25 09:57:54.177 F/google-breakpad(23467): M E7432000 00000000 0000B000 BA492148E0772FEDECD63D3EC92D2B780 libffmpeg_utils.so +01-25 09:57:54.177 F/google-breakpad(23467): M E743C000 00000000 00065000 F57A52849D51BE8BC164CE7D9FC008340 libavutil.so +01-25 09:57:54.177 F/google-breakpad(23467): M E74AB000 00000000 00243000 5CE62901E1D3DDB2AE8F71866CB3837C0 libavformat.so +01-25 09:57:54.177 F/google-breakpad(23467): M E76C5000 00000000 00DAC000 419A89DE37C5668FE3839DE6775723F90 libavcodec.so +01-25 09:57:54.177 F/google-breakpad(23467): M E8B25000 00000000 00012000 2D3BB7901C6990F220F3ABDEFE773BFE0 libffmpeg_extractor.so +01-25 09:57:54.177 F/google-breakpad(23467): M E8B37000 00000000 0000D000 DF11B21AABFD31A4CCA2CF3CCB7640E90 libstagefright_avc_common.so +01-25 09:57:54.177 F/google-breakpad(23467): M E8B44000 00000000 00003000 7DEA05EC7AD8537FF4C2DD5F065D6FDB0 libstagefright_enc_common.so +01-25 09:57:54.177 F/google-breakpad(23467): M E8B47000 00000000 00025000 8E547CC694E28C3221068AC4B2507B4F0 libvorbisidec.so +01-25 09:57:54.177 F/google-breakpad(23467): M E8B6C000 00000000 00006000 90B62412D5756080C8DFE217016115050 libstagefright_yuv.so +01-25 09:57:54.177 F/google-breakpad(23467): M E8B71000 00000000 00040000 6656D67F836F6F06F00CD5748A8C5CCE0 libstagefright_omx.so +01-25 09:57:54.178 F/google-breakpad(23467): M E8BB1000 00000000 00053000 5EF9E30F4E73B3E9EF2DC1A9575E73780 libopus.so +01-25 09:57:54.178 F/google-breakpad(23467): M E8C04000 00000000 0000A000 CA739485462BA0B2658CEA503AA286600 libmediautils.so +01-25 09:57:54.178 F/google-breakpad(23467): M E8C0D000 00000000 0002A000 943AF1BD8889740374C861F61F851E7C0 libdrmframework.so +01-25 09:57:54.178 F/google-breakpad(23467): M E8C37000 00000000 00016000 4361A537B8F4746F41962F90DDF2105A0 libstagefright_amrnb_common.so +01-25 09:57:54.178 F/google-breakpad(23467): M E8C4A000 00000000 00036000 29E1806354A34338B5E3EDAD561C41E70 libexif.so +01-25 09:57:54.178 F/google-breakpad(23467): M E8C80000 00000000 00010000 FBD7045E4FD674AF48F2638450AB98370 libjhead.so +01-25 09:57:54.178 F/google-breakpad(23467): M E8C91000 00000000 00023000 A5F93B3BF69410560186A8A0DD92D2740 libmtp.so +01-25 09:57:54.178 F/google-breakpad(23467): M E8CAE000 00000000 0021A000 41A51F8C4C3FC353F38448CAA10917AF0 libstagefright.so +01-25 09:57:54.178 F/google-breakpad(23467): M E8EC6000 00000000 00084000 568DDECBE861936F6D47FF78B73C723D0 libmedia_jni.so +01-25 09:57:54.178 F/google-breakpad(23467): M E8FB7000 00000000 00005000 CC6218E5D33D8438DCB93DD96DEA72110 libEGL_POWERVR_ROGUE.so +01-25 09:57:54.178 F/google-breakpad(23467): M EC748000 00000000 00003000 FE3B8B5AB45DA562F7F82698A7FD70D60 libjnigraphics.so +01-25 09:57:54.178 F/google-breakpad(23467): M EC760000 00000000 0002C000 37F37614ED1AD2703EC7C4BF663D6FBC0 libkeymaster1.so +01-25 09:57:54.179 F/google-breakpad(23467): M EC78C000 00000000 0000F000 BA8DB5284A4BD164616442FA11CFF5920 libkeymaster_messages.so +01-25 09:57:54.179 F/google-breakpad(23467): M EC79B000 00000000 00027000 AA80FB24AA303CC663A777C51E3818ED0 libsoftkeymasterdevice.so +01-25 09:57:54.179 F/google-breakpad(23467): M EC7C1000 00000000 0002A000 68CC3C7DE2A9A509E0F2D37ED98245E80 libjavacrypto.so +01-25 09:57:54.179 F/google-breakpad(23467): M ED516000 00000000 0006A000 A20830D97DB0FDF7250C5FB692BC26BC0 libPVROCL.so +01-25 09:57:54.179 F/google-breakpad(23467): M ED5C0000 00000000 00013000 18A3369A4C4CA77CE18A05D3747670E80 libkeystore_binder.so +01-25 09:57:54.179 F/google-breakpad(23467): M ED5D3000 00000000 00005000 A4579FE84F51DE9109C9A4DD4594BF180 libkeystore-engine.so +01-25 09:57:54.179 F/google-breakpad(23467): M ED90D000 00000000 0000F000 8C4B5781D6EF79154ABE62B8D606324A0 libxposed_art.so +01-25 09:57:54.179 F/google-breakpad(23467): M EEF1B000 00000000 00065000 B97DB0D98582BFAB3EA871F0D1C222C70 libjavacore.so +01-25 09:57:54.179 F/google-breakpad(23467): M EF00B000 00000000 0001A000 18AFFB18B60EAFBF0AA29C4D2F4C070E0 gralloc.moorefield.so +01-25 09:57:54.179 F/google-breakpad(23467): M EF04C000 00000000 0001D000 1A8ADB6F40B957D02CC0DC7682A8F9E90 libchromium_android_linker.so +01-25 09:57:54.179 F/google-breakpad(23467): M F381B000 00000000 00763000 6F79159F51864D6FC2A36A966C3560800 libart.so +01-25 09:57:54.179 F/google-breakpad(23467): M F40A9000 00000000 00003000 91BAE6D69B00A7052346F44956D08A800 libsigchain.so +01-25 09:57:54.179 F/google-breakpad(23467): M F40A2000 00000000 01630000 9B531434F5F02E022A2FAC5A643057470 libLLVM.so +01-25 09:57:54.179 F/google-breakpad(23467): M F56DA000 00000000 0005B000 26441D9EACA6885AF23F38BC6F82C8BB0 libbcinfo.so +01-25 09:57:54.179 F/google-breakpad(23467): M F5735000 00000000 0006B000 C55576D7E6926857E160CC48CB8225CB0 libbcc.so +01-25 09:57:54.180 F/google-breakpad(23467): M F579F000 00000000 00012000 B0FCE9881D277F89F61D053C092AE2260 libcommon_time_client.so +01-25 09:57:54.180 F/google-breakpad(23467): M F57B1000 00000000 00005000 65A183A86D11AE7430AF32DA7C57E8710 libpowermanager.so +01-25 09:57:54.180 F/google-breakpad(23467): M F57B6000 00000000 0002C000 4B085FDBF44B8FFC0782E729A90C3D750 libprotobuf-cpp-lite.so +01-25 09:57:54.180 F/google-breakpad(23467): M F57E2000 00000000 00028000 EBF5D67B2D84118021978F6A898B8C980 libRScpp.so +01-25 09:57:54.180 F/google-breakpad(23467): M F580A000 00000000 00062000 EDCFDD6BC6599F31992F99F529194AC20 libRS.so +01-25 09:57:54.180 F/google-breakpad(23467): M F586C000 00000000 00007000 4EEBBE38940F43AFCE2D433E624449190 libspeexresampler.so +01-25 09:57:54.180 F/google-breakpad(23467): M F5873000 00000000 0000E000 79E25E1031DD6618903A712ADDA6744C0 libnbaio.so +01-25 09:57:54.180 F/google-breakpad(23467): M F5882000 00000000 00024000 21755D2D62F48C0EBF4C73D09C5CD53E0 libstagefright_foundation.so +01-25 09:57:54.180 F/google-breakpad(23467): M F58A7000 00000000 00006000 ECAD531238F0812D85679F21BE758C3C0 libwpa_client.so +01-25 09:57:54.180 F/google-breakpad(23467): M F58AD000 00000000 000F5000 7C9614194568F34D00760957437E80EC0 libGLES_trace.so +01-25 09:57:54.180 F/google-breakpad(23467): M F59A2000 00000000 0008F000 5FCA392FDA7D0D7AC84DC750C5E113300 libft2.so +01-25 09:57:54.180 F/google-breakpad(23467): M F5A31000 00000000 0003B000 68FA4909919B676A0FC62C8398316D960 libpng.so +01-25 09:57:54.180 F/google-breakpad(23467): M F5A6C000 00000000 00003000 72547142E4BC3E69AA1C3BB812ED5F380 libsync.so +01-25 09:57:54.180 F/google-breakpad(23467): M F5A6F000 00000000 00005000 B2AFDC2AE3419BBEFDB0F61CD2BF7E5D0 libstdc++.so +01-25 09:57:54.180 F/google-breakpad(23467): M F5A74000 00000000 00020000 1BA1AF0070EA904E97616F543CA0A4250 libunwind.so +01-25 09:57:54.180 F/google-breakpad(23467): M F5AA3000 00000000 0000B000 CE0285F7C123410DF6756F6C4C73B44E0 libbase.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5AAE000 00000000 00023000 C136291942C5971173AB64521D8DED2B0 libpcre.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5AD0000 00000000 000C3000 49D590DD4DB4918B246A4FAD58594D170 libhwui.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5B93000 00000000 00004000 85FDF7C6756D80699F02513B48446DB20 libradio_metadata.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5B97000 00000000 00005000 15ED52221AC2EC85BBC0EC8924446FDD0 libnativebridge.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5B9C000 00000000 00004000 1A369C385D95936BF1CB35CEFFC46C520 libprocessgroup.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5BA0000 00000000 00019000 F88BC9F41A7D2C66D6ABED1DAE189BC40 libminikin.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5BB8000 00000000 00010000 1A47CE702A7C2780188905377C9638680 libsoundtrigger.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5BC7000 00000000 00010000 92302D61D2269AB1F7C5FF5C908EDCAE0 libradio.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5BD7000 00000000 00004000 BEB3710C92B6DFAEFABE9626CDFC9C790 libnetd_client.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5BDB000 00000000 00017000 A9948C1B8A77CED99AAC0EF29C4CF2C20 libimg_utils.so +01-25 09:57:54.181 F/google-breakpad(23467): M F5BEC000 00000000 004DD000 013677E0F0932D4B4D9A26CD06311BE90 libpdfium.so +01-25 09:57:54.181 F/google-breakpad(23467): M F60CA000 00000000 0000F000 B7D024DD71ADA4E55665023B404807070 libaudioutils.so +01-25 09:57:54.181 F/google-breakpad(23467): M F60DA000 00000000 00022000 CB4FE7BB63F1E58C8F93A21FAED1353D0 libz.so +01-25 09:57:54.181 F/google-breakpad(23467): M F60FC000 00000000 0005C000 DBF3BE9737586981641FAF665822AFDC0 libharfbuzz_ng.so +01-25 09:57:54.181 F/google-breakpad(23467): M F6158000 00000000 00006000 D6241B08071BE367421E5461266CDD880 libusbhost.so +01-25 09:57:54.181 F/google-breakpad(23467): M F615E000 00000000 00047000 2CC00B9AC5953D3E3435BFFB1036240B0 libjpeg.so +01-25 09:57:54.181 F/google-breakpad(23467): M F618F000 00000000 0012B000 15D0E646E5B33C21414E682A042C93AB0 libmedia.so +01-25 09:57:54.182 F/google-breakpad(23467): M F62B3000 00000000 0028E000 07184F89E98C8DFC92370FCB8BD43A060 libicui18n.so +01-25 09:57:54.182 F/google-breakpad(23467): M F653A000 00000000 001DA000 1DDE4876E097DDAA58EFDE24F6B0AF230 libicuuc.so +01-25 09:57:54.182 F/google-breakpad(23467): M F6718000 00000000 00049000 28AA4EE3518707C5C2CB494D27D7E42E0 libssl.so +01-25 09:57:54.182 F/google-breakpad(23467): M F6761000 00000000 00131000 BDC34E23A0ACF7FB9DA4B37B834EB9330 libcrypto.so +01-25 09:57:54.182 F/google-breakpad(23467): M F6893000 00000000 0005E000 231B6740DAFF45EFA880C2ACCA1711120 libsonivox.so +01-25 09:57:54.182 F/google-breakpad(23467): M F68F6000 00000000 00009000 07D3E350957BE9781AA79CFE4D1615930 libhardware_legacy.so +01-25 09:57:54.182 F/google-breakpad(23467): M F6900000 00000000 00004000 8F7402EB008A16522221FC3BDC3805430 libhardware.so +01-25 09:57:54.182 F/google-breakpad(23467): M F6904000 00000000 00007000 836E381CA556529A0567A7404F6168440 libETC1.so +01-25 09:57:54.182 F/google-breakpad(23467): M F690B000 00000000 00011000 9BABF059941D73F530F6D1845A7B05830 libGLESv2.so +01-25 09:57:54.182 F/google-breakpad(23467): M F691C000 00000000 0000B000 F95AE8B6C538A7F0C5C8D1555FF8103C0 libGLESv1_CM.so +01-25 09:57:54.182 F/google-breakpad(23467): M F691F000 00000000 000CF000 956D0B30A7C83D397182A912892E9C2C0 libEGL.so +01-25 09:57:54.182 F/google-breakpad(23467): M F69F0000 00000000 00106000 1E685E8DD6A14FAC43BD47187FC352D10 libsqlite.so +01-25 09:57:54.182 F/google-breakpad(23467): M F6AE8000 00000000 005BB000 EF07C6881EBD2EB937DAE1B6E28ACD500 libskia.so +01-25 09:57:54.182 F/google-breakpad(23467): M F70A8000 00000000 0000A000 63F744099900E2D51FFD078EACB1B86C0 libcamera_metadata.so +01-25 09:57:54.182 F/google-breakpad(23467): M F70B0000 00000000 00046000 C827130CE4D86CAD14313C93C29C73120 libcamera_client.so +01-25 09:57:54.182 F/google-breakpad(23467): M F70F6000 00000000 00067000 80003CA0F4A276917CF1D46DF8511B910 libinputflinger.so +01-25 09:57:54.183 F/google-breakpad(23467): M F715C000 00000000 0002E000 588B28D23521BFE45DA0922F9B2BC0780 libinput.so +01-25 09:57:54.183 F/google-breakpad(23467): M F7182000 00000000 00090000 3A979946F483682F902E867B4461A7B50 libgui.so +01-25 09:57:54.183 F/google-breakpad(23467): M F7212000 00000000 00013000 F63C997D5B56627993AB03838CFAA09C0 libui.so +01-25 09:57:54.183 F/google-breakpad(23467): M F7225000 00000000 0000A000 DAC710CBBFF628A68578077BEDEAB7750 libnetutils.so +01-25 09:57:54.183 F/google-breakpad(23467): M F722F000 00000000 00008000 B28981AE75F117447377C79B01B4F0FF0 libnativehelper.so +01-25 09:57:54.183 F/google-breakpad(23467): M F7237000 00000000 00031000 3234F24F029666DF5464E0E6991800540 libexpat.so +01-25 09:57:54.183 F/google-breakpad(23467): M F7268000 00000000 00047000 F02DEB41178B1A4DE3C2EE24549A2D860 libandroidfw.so +01-25 09:57:54.183 F/google-breakpad(23467): M F72AF000 00000000 00003000 CC7E87B840DDAA0CA6D5E9640CD163880 libmemtrack.so +01-25 09:57:54.183 F/google-breakpad(23467): M F72B3000 00000000 0000E000 969377A0F848DAECF436F7FE45DCBD620 libbacktrace.so +01-25 09:57:54.183 F/google-breakpad(23467): M F72C1000 00000000 0003B000 9ADB6F900638406445920C1C4895A3100 libm.so +01-25 09:57:54.183 F/google-breakpad(23467): M F72FC000 00000000 00114000 12FA662923A8693EE010FC5D185739100 libc.so +01-25 09:57:54.183 F/google-breakpad(23467): M F7418000 00000000 000EC000 7F716BC28C5E66FE5A89C28109356D560 libc++.so +01-25 09:57:54.183 F/google-breakpad(23467): M F7505000 00000000 0001A000 1EDB8B98CB4D94472F14CEEE7C68F6840 libselinux.so +01-25 09:57:54.183 F/google-breakpad(23467): M F7511000 00000000 001A5000 4726889CE3166AE9E4D7B57F4ED5D8690 libandroid_runtime.so +01-25 09:57:54.183 F/google-breakpad(23467): M F76B4000 00000000 0004A000 E55E2313EEDBEB4399F81A47356541DE0 libbinder.so +01-25 09:57:54.183 F/google-breakpad(23467): M F76FE000 00000000 0000C000 3D4F877618F66DDE1EC5DB3C43F1F6060 liblog.so +01-25 09:57:54.184 F/google-breakpad(23467): M F770A000 00000000 00028000 3843F9877B109321C4AFE68E66DD1E1E0 libutils.so +01-25 09:57:54.184 F/google-breakpad(23467): M F7732000 00000000 0001A000 F1D443198CFEFCB1FDD91940941D39CE0 libcutils.so +01-25 09:57:54.184 F/google-breakpad(23467): M F777A000 00000000 00045000 02B4F87528C887F70529FFDBCCFBE5260 linker +01-25 09:57:54.186 F/google-breakpad(23467): M FFFFE000 00000000 00001000 4A7B1DECECE5E80AE3E4E2E4F1F2CDAE0 linux-gate.so +01-25 09:57:54.186 F/google-breakpad(23467): -----END BREAKPAD MICRODUMP----- diff --git a/src/processor/testdata/microdump.stackwalk-arm.out b/src/processor/testdata/microdump.stackwalk-arm.out new file mode 100644 index 0000000..ae018d3 --- /dev/null +++ b/src/processor/testdata/microdump.stackwalk-arm.out @@ -0,0 +1,63 @@ +Operating system: Android + OS VERSION INFO +CPU: arm + 2 CPUs + +GPU: OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc) + Qualcomm + Adreno (TM) 330 + +Crash reason: +Crash address: 0x0 +Process uptime: not available + +Thread 0 (crashed) + 0 breakpad_unittests!MicrodumpWriterTest_Setup_Test::TestBody [gtest.h : 1481 + 0x1] + r0 = 0x00000000 r1 = 0x00000000 r2 = 0x00000000 r3 = 0x00000000 + r4 = 0xffea6900 r5 = 0xffea68f0 r6 = 0xffea68f8 r7 = 0xffea6904 + r8 = 0xffea68e0 r9 = 0xffea6900 r10 = 0xffea6930 r12 = 0x00000000 + fp = 0x00000ea2 sp = 0xffea68c0 lr = 0xaaaeb307 pc = 0xaaaeb307 + Found by: given as instruction pointer in context + 1 breakpad_unittests!testing::Test::Run [gtest.cc : 2435 + 0x17] + r4 = 0xaab431dc r5 = 0xab20d7d0 r6 = 0xab203478 r7 = 0x00000149 + r8 = 0xab203588 r9 = 0xab20d7d0 r10 = 0xffea6f60 fp = 0xab2034d8 + sp = 0xffea6f28 pc = 0xaab0a741 + Found by: call frame info + 2 breakpad_unittests!testing::TestInfo::Run [gtest.cc : 2610 + 0x5] + r4 = 0xab205448 r5 = 0xab203478 r6 = 0xf6d21cdd r7 = 0x00000149 + r8 = 0xab203588 r9 = 0xab20d7d0 r10 = 0xffea6f60 fp = 0xab2034d8 + sp = 0xffea6f50 pc = 0xaab0a875 + Found by: call frame info + 3 breakpad_unittests!testing::TestCase::Run [gtest.cc : 2728 + 0x3] + r4 = 0xab2054c8 r5 = 0x00000000 r6 = 0xf6d21cdd r7 = 0x00000149 + r8 = 0xab203478 r9 = 0xab203588 r10 = 0x00000001 fp = 0xab2034d8 + sp = 0xffea6f90 pc = 0xaab0a8fd + Found by: call frame info + 4 breakpad_unittests!testing::internal::UnitTestImpl::RunAllTests [gtest.cc : 4591 + 0x3] + r4 = 0xab203478 r5 = 0xab203588 r6 = 0x00000000 r7 = 0x00000001 + r8 = 0x00000000 r9 = 0xab2047f0 r10 = 0x00000001 fp = 0xab2034d8 + sp = 0xffea6fc0 pc = 0xaab0aafd + Found by: call frame info + 5 breakpad_unittests!testing::UnitTest::Run [gtest.cc : 2418 + 0x5] + r4 = 0x00000000 r5 = 0xab203478 r6 = 0x00000002 r7 = 0xaaae2c19 + r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0xffea706c + sp = 0xffea7018 pc = 0xaab09a61 + Found by: call frame info + 6 breakpad_unittests!main [gtest.h : 2326 + 0x3] + r4 = 0xffea702c r5 = 0xffea7074 r6 = 0x00000002 r7 = 0xaaae2c19 + r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0xffea706c + sp = 0xffea7028 pc = 0xaaae2c3b + Found by: call frame info + 7 libc.so + 0x11e9d + r4 = 0xffea7074 r5 = 0xffea7080 r6 = 0x00000002 r7 = 0xaaae2c19 + r8 = 0x00000000 r9 = 0x00000000 r10 = 0x00000000 fp = 0xffea706c + sp = 0xffea7040 pc = 0xf7025e9f + Found by: call frame info + +Loaded modules: +0xaaacd000 - 0xaab48fff breakpad_unittests ??? +0xf6fca000 - 0xf6fcdfff libnetd_client.so ??? +0xf6fee000 - 0xf6ff1fff libstdc++.so ??? +0xf6ff2000 - 0xf700afff libm.so ??? +0xf700c000 - 0xf7012fff liblog.so ??? +0xf7014000 - 0xf706dfff libc.so ??? (WARNING: No symbols, libc.so, 167F187B09A27F7444EF989603AAFD3D0) diff --git a/src/processor/testdata/microdump.stackwalk-arm64.out b/src/processor/testdata/microdump.stackwalk-arm64.out new file mode 100644 index 0000000..e6ed424 --- /dev/null +++ b/src/processor/testdata/microdump.stackwalk-arm64.out @@ -0,0 +1,113 @@ +Operating system: Android + OS 64 VERSION INFO +CPU: arm64 + 2 CPUs + +GPU: UNKNOWN + +Crash reason: +Crash address: 0x0 +Process uptime: not available + +Thread 0 (crashed) + 0 breakpad_unittests!MicrodumpWriterTest_Setup_Test::TestBody [microdump_writer_unittest.cc : 77 + 0xc] + x0 = 0x0000000000000000 x1 = 0x0000000000000000 + x2 = 0x0000000000000000 x3 = 0x0000000000000000 + x4 = 0x0000000000000000 x5 = 0x0000000000000000 + x6 = 0x0000000000000000 x7 = 0x0000000000000000 + x8 = 0x0000000000000000 x9 = 0x0000000000000000 + x10 = 0x0000000000000000 x11 = 0x0000000000000000 + x12 = 0x0000000000000000 x13 = 0x0000000000000000 + x14 = 0x0000000000000000 x15 = 0x0000000000000000 + x16 = 0x0000000000000000 x17 = 0x0000000000000000 + x18 = 0x0000000000000000 x19 = 0x0000007fe2ba6a50 + x20 = 0x0000007fe2ba65e0 x21 = 0x0000007fe2ba61e0 + x22 = 0x000000555f6b4000 x23 = 0x0000007fe2ba6280 + x24 = 0x0000007fe2ba6250 x25 = 0x000000555f6b4c51 + x26 = 0x0000000000000e91 x27 = 0x0000007fe2ba6220 + x28 = 0x0000007fe2ba61f0 fp = 0x0000007fe2ba6120 + lr = 0x000000555f636f6c sp = 0x0000007fe2ba6120 + pc = 0x000000555f636f6c + Found by: given as instruction pointer in context + 1 breakpad_unittests!testing::internal::HandleExceptionsInMethodIfSupported [gtest.cc : 2418 + 0x4] + x19 = 0x00000055955022d0 x20 = 0x00000055954ee170 + x21 = 0x00000055954ee170 x22 = 0x00000055954ee390 + x23 = 0x00000149f6d1624a x24 = 0x000000555f6df000 + x25 = 0x0000000000000001 x26 = 0x00000149f6d16249 + x27 = 0x0000000000000001 x28 = 0x000000555f6b35c9 + fp = 0x0000007fe2ba7a50 sp = 0x0000007fe2ba7a50 + pc = 0x000000555f66323c + Found by: call frame info + 2 breakpad_unittests!testing::Test::Run [gtest.cc : 2435 + 0x14] + x19 = 0x00000055955022d0 x20 = 0x00000055954ee170 + x21 = 0x00000055954ee170 x22 = 0x00000055954ee390 + x23 = 0x00000149f6d1624a x24 = 0x000000555f6df000 + x25 = 0x0000000000000001 x26 = 0x00000149f6d16249 + x27 = 0x0000000000000001 x28 = 0x000000555f6b35c9 + fp = 0x0000007fe2ba7a80 sp = 0x0000007fe2ba7a80 + pc = 0x000000555f66448c + Found by: call frame info + 3 breakpad_unittests!testing::TestInfo::Run [gtest.cc : 2610 + 0x4] + x19 = 0x00000055954f3890 x20 = 0x00000055955022d0 + x21 = 0x00000055954ee170 x22 = 0x00000055954ee390 + x23 = 0x00000149f6d1624a x24 = 0x000000555f6df000 + x25 = 0x0000000000000001 x26 = 0x00000149f6d16249 + x27 = 0x0000000000000001 x28 = 0x000000555f6b35c9 + fp = 0x0000007fe2ba7aa0 sp = 0x0000007fe2ba7aa0 + pc = 0x000000555f6645b8 + Found by: call frame info + 4 breakpad_unittests!testing::TestCase::Run [gtest.cc : 2728 + 0x0] + x19 = 0x00000055954f39a0 x20 = 0x00000055954ee170 + x21 = 0x00000055954ee390 x22 = 0x0000000000000001 + x23 = 0x00000149f6d1624a x24 = 0x000000555f6df000 + x25 = 0x0000000000000001 x26 = 0x00000149f6d16249 + x27 = 0x0000000000000001 x28 = 0x000000555f6b35c9 + fp = 0x0000007fe2ba7ae0 sp = 0x0000007fe2ba7ae0 + pc = 0x000000555f664674 + Found by: call frame info + 5 breakpad_unittests!testing::internal::UnitTestImpl::RunAllTests [gtest.cc : 4591 + 0x0] + x19 = 0x00000055954ee170 x20 = 0x0000000000000000 + x21 = 0x00000055954ee390 x22 = 0x0000000000000002 + x23 = 0x0000000000000000 x24 = 0x000000555f6df000 + x25 = 0x0000000000000001 x26 = 0x00000149f6d16249 + x27 = 0x0000000000000001 x28 = 0x000000555f6b35c9 + fp = 0x0000007fe2ba7b20 sp = 0x0000007fe2ba7b20 + pc = 0x000000555f66494c + Found by: call frame info + 6 breakpad_unittests!testing::UnitTest::Run [gtest.cc : 2418 + 0x4] + x19 = 0x0000000000000000 x20 = 0x00000055954ee170 + x21 = 0x0000000000000002 x22 = 0x000000555f62b360 + x23 = 0x0000000000000000 x24 = 0x0000000000000000 + x25 = 0x0000000000000000 x26 = 0x0000000000000000 + x27 = 0x0000000000000000 x28 = 0x0000000000000000 + fp = 0x0000007fe2ba7bc0 sp = 0x0000007fe2ba7bc0 + pc = 0x000000555f664b68 + Found by: call frame info + 7 breakpad_unittests!main [gtest.h : 2326 + 0x0] + x19 = 0x0000007fe2ba7c1c x20 = 0x0000007fe2ba7c88 + x21 = 0x0000000000000002 x22 = 0x000000555f62b360 + x23 = 0x0000000000000000 x24 = 0x0000000000000000 + x25 = 0x0000000000000000 x26 = 0x0000000000000000 + x27 = 0x0000000000000000 x28 = 0x0000000000000000 + fp = 0x0000007fe2ba7bf0 sp = 0x0000007fe2ba7bf0 + pc = 0x000000555f62b398 + Found by: call frame info + 8 libc.so + 0x17388 + x19 = 0x0000007fe2ba7ca0 x20 = 0x0000007fe2ba7c88 + x21 = 0x0000000000000002 x22 = 0x000000555f62b360 + x23 = 0x0000000000000000 x24 = 0x0000000000000000 + x25 = 0x0000000000000000 x26 = 0x0000000000000000 + x27 = 0x0000000000000000 x28 = 0x0000000000000000 + fp = 0x0000007fe2ba7c20 sp = 0x0000007fe2ba7c20 + pc = 0x0000007f802ac38c + Found by: call frame info + +Loaded modules: +0x555f608000 - 0x555f6c7fff breakpad_unittests ??? +0x7f801f6000 - 0x7f80208fff libnetd_client.so ??? +0x7f80229000 - 0x7f8023cfff libstdc++.so ??? +0x7f8023d000 - 0x7f80279fff libm.so ??? +0x7f8027b000 - 0x7f80293fff liblog.so ??? +0x7f80295000 - 0x7f80332fff libc.so ??? (WARNING: No symbols, libc.so, 479D5438753E27F019F2C9980DDBF4F30) +0x7f80341000 - 0x7f80353fff libsigchain.so ??? +0x7f80358000 - 0x7f80359fff linux-gate.so ??? diff --git a/src/processor/testdata/microdump.stackwalk.machine_readable-arm.out b/src/processor/testdata/microdump.stackwalk.machine_readable-arm.out new file mode 100644 index 0000000..869fc4d --- /dev/null +++ b/src/processor/testdata/microdump.stackwalk.machine_readable-arm.out @@ -0,0 +1,19 @@ +OS|Android|OS VERSION INFO +CPU|arm||2 +GPU|OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)|Qualcomm|Adreno (TM) 330 +Crash||0x0|0 +Module|breakpad_unittests||breakpad_unittests|DA7778FB66018A4E9B4110ED06E730D00|0xaaacd000|0xaab48fff|0 +Module|libnetd_client.so||libnetd_client.so|56B149396A4DAF176E26B4A85DA87BF30|0xf6fca000|0xf6fcdfff|0 +Module|libstdc++.so||libstdc++.so|DFCD7772F3A5BD1E84A50C4DBFDE6F570|0xf6fee000|0xf6ff1fff|0 +Module|libm.so||libm.so|AE3467401278371A956801500FC8187D0|0xf6ff2000|0xf700afff|0 +Module|liblog.so||liblog.so|0A492DEF82842051996A468D87F23F010|0xf700c000|0xf7012fff|0 +Module|libc.so||libc.so|167F187B09A27F7444EF989603AAFD3D0|0xf7014000|0xf706dfff|0 + +0|0|breakpad_unittests|MicrodumpWriterTest_Setup_Test::TestBody|/s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/gtest.h|1481|0x1 +0|1|breakpad_unittests|testing::Test::Run|/s/clank/src/out_arm/Release/../../testing/gtest/src/gtest.cc|2435|0x17 +0|2|breakpad_unittests|testing::TestInfo::Run|/s/clank/src/out_arm/Release/../../testing/gtest/src/gtest.cc|2610|0x5 +0|3|breakpad_unittests|testing::TestCase::Run|/s/clank/src/out_arm/Release/../../testing/gtest/src/gtest.cc|2728|0x3 +0|4|breakpad_unittests|testing::internal::UnitTestImpl::RunAllTests|/s/clank/src/out_arm/Release/../../testing/gtest/src/gtest.cc|4591|0x3 +0|5|breakpad_unittests|testing::UnitTest::Run|/s/clank/src/out_arm/Release/../../testing/gtest/src/gtest.cc|2418|0x5 +0|6|breakpad_unittests|main|/s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/gtest.h|2326|0x3 +0|7|libc.so||||0x11e9d diff --git a/src/processor/testdata/microdump.stackwalk.machine_readable-arm64.out b/src/processor/testdata/microdump.stackwalk.machine_readable-arm64.out new file mode 100644 index 0000000..7734dda --- /dev/null +++ b/src/processor/testdata/microdump.stackwalk.machine_readable-arm64.out @@ -0,0 +1,22 @@ +OS|Android|OS 64 VERSION INFO +CPU|arm64||2 +GPU||| +Crash||0x0|0 +Module|breakpad_unittests||breakpad_unittests|D6D1FEC9A15DE7F38A236898871A2E770|0x555f608000|0x555f6c7fff|0 +Module|libnetd_client.so||libnetd_client.so|7735F44BA6D7C27FD5C3636A43369B7C0|0x7f801f6000|0x7f80208fff|0 +Module|libstdc++.so||libstdc++.so|380C0B7CD8FA3F094BC3BA58A81CBAD00|0x7f80229000|0x7f8023cfff|0 +Module|libm.so||libm.so|F832D47D1E237E46D835991594DA6E890|0x7f8023d000|0x7f80279fff|0 +Module|liblog.so||liblog.so|C407B93F87A835BE05451FC7B0B3E65E0|0x7f8027b000|0x7f80293fff|0 +Module|libc.so||libc.so|479D5438753E27F019F2C9980DDBF4F30|0x7f80295000|0x7f80332fff|0 +Module|libsigchain.so||libsigchain.so|9DA3FF8EF9CA0FDC481292EE530DF6EC0|0x7f80341000|0x7f80353fff|0 +Module|linux-gate.so||linux-gate.so|672B2CD6CF8AF6C43BD70F2AB02B3D0C0|0x7f80358000|0x7f80359fff|0 + +0|0|breakpad_unittests|MicrodumpWriterTest_Setup_Test::TestBody|/s/clank/src/out/Release/../../breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc|77|0xc +0|1|breakpad_unittests|testing::internal::HandleExceptionsInMethodIfSupported|/s/clank/src/out/Release/../../testing/gtest/src/gtest.cc|2418|0x4 +0|2|breakpad_unittests|testing::Test::Run|/s/clank/src/out/Release/../../testing/gtest/src/gtest.cc|2435|0x14 +0|3|breakpad_unittests|testing::TestInfo::Run|/s/clank/src/out/Release/../../testing/gtest/src/gtest.cc|2610|0x4 +0|4|breakpad_unittests|testing::TestCase::Run|/s/clank/src/out/Release/../../testing/gtest/src/gtest.cc|2728|0x0 +0|5|breakpad_unittests|testing::internal::UnitTestImpl::RunAllTests|/s/clank/src/out/Release/../../testing/gtest/src/gtest.cc|4591|0x0 +0|6|breakpad_unittests|testing::UnitTest::Run|/s/clank/src/out/Release/../../testing/gtest/src/gtest.cc|2418|0x4 +0|7|breakpad_unittests|main|/s/clank/src/out/Release/../../testing/gtest/include/gtest/gtest.h|2326|0x0 +0|8|libc.so||||0x17388 diff --git a/src/processor/testdata/minidump2.dmp b/src/processor/testdata/minidump2.dmp new file mode 100644 index 0000000000000000000000000000000000000000..1a6feee7cc1f6a988c3810c325dc43df70562799 GIT binary patch literal 11317 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/minidump2.dump.out b/src/processor/testdata/minidump2.dump.out new file mode 100644 index 0000000..bad1b80 --- /dev/null +++ b/src/processor/testdata/minidump2.dump.out @@ -0,0 +1,706 @@ +MDRawHeader + signature = 0x504d444d + version = 0x5128a793 + stream_count = 9 + stream_directory_rva = 0x20 + checksum = 0x0 + time_date_stamp = 0x45d35f73 2007-02-14 19:13:55 + flags = 0x0 + +mDirectory[0] +MDRawDirectory + stream_type = 0x3 (MD_THREAD_LIST_STREAM) + location.data_size = 100 + location.rva = 0x184 + +mDirectory[1] +MDRawDirectory + stream_type = 0x4 (MD_MODULE_LIST_STREAM) + location.data_size = 1408 + location.rva = 0x1e8 + +mDirectory[2] +MDRawDirectory + stream_type = 0x5 (MD_MEMORY_LIST_STREAM) + location.data_size = 52 + location.rva = 0x1505 + +mDirectory[3] +MDRawDirectory + stream_type = 0x6 (MD_EXCEPTION_STREAM) + location.data_size = 168 + location.rva = 0xdc + +mDirectory[4] +MDRawDirectory + stream_type = 0x7 (MD_SYSTEM_INFO_STREAM) + location.data_size = 56 + location.rva = 0x8c + +mDirectory[5] +MDRawDirectory + stream_type = 0xf (MD_MISC_INFO_STREAM) + location.data_size = 24 + location.rva = 0xc4 + +mDirectory[6] +MDRawDirectory + stream_type = 0x47670001 (MD_BREAKPAD_INFO_STREAM) + location.data_size = 12 + location.rva = 0x14f9 + +mDirectory[7] +MDRawDirectory + stream_type = 0x0 (MD_UNUSED_STREAM) + location.data_size = 0 + location.rva = 0x0 + +mDirectory[8] +MDRawDirectory + stream_type = 0x0 (MD_UNUSED_STREAM) + location.data_size = 0 + location.rva = 0x0 + +Streams: + stream type 0x0 (MD_UNUSED_STREAM) at index 8 + stream type 0x3 (MD_THREAD_LIST_STREAM) at index 0 + stream type 0x4 (MD_MODULE_LIST_STREAM) at index 1 + stream type 0x5 (MD_MEMORY_LIST_STREAM) at index 2 + stream type 0x6 (MD_EXCEPTION_STREAM) at index 3 + stream type 0x7 (MD_SYSTEM_INFO_STREAM) at index 4 + stream type 0xf (MD_MISC_INFO_STREAM) at index 5 + stream type 0x47670001 (MD_BREAKPAD_INFO_STREAM) at index 6 + +MinidumpThreadList + thread_count = 2 + +thread[0] +MDRawThread + thread_id = 0xbf4 + suspend_count = 0 + priority_class = 0x0 + priority = 0x0 + teb = 0x7ffdf000 + stack.start_of_memory_range = 0x12f31c + stack.memory.data_size = 0xce4 + stack.memory.rva = 0x1639 + thread_context.data_size = 0x2cc + thread_context.rva = 0xd94 + +MDRawContextX86 + context_flags = 0x1003f + dr0 = 0x0 + dr1 = 0x0 + dr2 = 0x0 + dr3 = 0x0 + dr6 = 0x0 + dr7 = 0x0 + float_save.control_word = 0xffff027f + float_save.status_word = 0xffff0000 + float_save.tag_word = 0xffffffff + float_save.error_offset = 0x0 + float_save.error_selector = 0x220000 + float_save.data_offset = 0x0 + float_save.data_selector = 0xffff0000 + float_save.register_area[80] = 0x0000000018b72200000118b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + float_save.cr0_npx_state = 0x0 + gs = 0x0 + fs = 0x3b + es = 0x23 + ds = 0x23 + edi = 0x0 + esi = 0x7b8 + ebx = 0x7c883780 + edx = 0x7c97c0d8 + ecx = 0x7c80b46e + eax = 0x400000 + ebp = 0x12f384 + eip = 0x7c90eb94 + cs = 0x1b + eflags = 0x246 + esp = 0x12f320 + ss = 0x23 + extended_registers[512] = 0x7f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b62200 + +Stack +0x00000000c0e9907ccb25807cb8070000000000000000000034ff1200b0fe12008037887c140000000100000000000000000000001000000027e0907c2e39917c0050fd7f00f0fd7f000000000400000034f312006947c788d4f31200a89a837cf825807c0000000098f312003225807cb8070000ffffffff00000000e4f31200ff1d4000b8070000ffffffffa8fa12008037887c0e1c4000a8fa120000000000ff792a0f64f91200b01b400000004000b0fe12000040020070fa1200084042000000000080fa120080fa12004e30867ca8fa12000000000000000000000000000018000002100000e3ef907c0000000079d900000000000048f41200000014003207917c0500000078071400000014000000000020f412003207917ca05f140018ee907cfa00000074f61200000000009615917ceb06917cf00298000100000000000000384f14009615917ceb06917c7801140008000000404f14000000a659985f1400080000000000000018ee907c90fea700400698003815917c184f1400eb06917c00000000800000000000a65988f69f0090f51200a569917cf8f41200d95c878880f5120043ef907c480485000500000090f5120088fea700a8212400000000000000000080f512002469917cf8fbfd7fa821240008000000f500000000000000384d850078019800a8fa120004000000a05f140096d4917c00000000b0d4917c0000000008069800184f140000000000104f140000000000184f140000004000000000010040020063003a005c0074006500730074005f006100700070002e006500780065000000000000002f00000028000000184f1400780185007801140028000000000000000000140084f3120010000000d8f5120018ee907cf006917cffffffffeb06917ce619917c88e6a7003003000001030000ff1b917c0000980080e6a70080069800400698000000980080e6a70000000000000000000000000080e6a7000818000088e6a700d759927c78019800081800000210000000009800f8f31200280a0000dcf6120018ee907cf006917cffffffffeb06917c0859927c00009800080000005859927c00000000000001000000a659000000005a6202000010000068fe030001000000dffe03000000010000000100fffffe7f0100000001c0c27700008500000000002dc0c27700000000684aaf590000a659241a917c80c0977c0000000000000000cd5c927c0050fd7f0000a65900000100080000004550fd7f0000000000000000000000000050fd7fcd5c927c05000000d4f61200f45c927c80e4977c05000000010000000050fd7f18f712007009917cc0e4977c172e817cff2d817c000000000000a6590000a6590210000000f0fd7f05000000e8f612000806980064f81200a89a837c002e817cffffffffff2d817cc8242400dd8ea75901000000000000004cf712003608a9590000a65901000000000000000100000060f71200e407a9596cf7120000004000000000010040020063003a005c0074006500730074005f006100700070002e0065007800650000006d05917c905f140000000000440d020000000000604f14000c0000007801140000000000a04e1400d84d8700400687004509917c0800000000000000000000004000000078011400a8038700404f14000510907c000000000000000078011400980387000800000008000000c0e4977cd04d8700f835887c7801140010000000a0e7ae591600000030fd1200d39b917c44000000620000000000a65950e9ae59d8eaae59a80387000100000014040000000000000100000002000000f800a659c003870001000000780114009508917c0000a659091b917c020000000900000040000000a2fd12009cfd1200404f1400a2fd1200d04d8700640187000000000000000000d04d870010000000d84d8700384f1400a803870010000000c00300000000870074fb1200404f14006cfe120018ee907cf006917cffffffffeb06917ca09d400000008700000000000400000000000000ffffff3fc04d8700ccfd12009c4d400004000000fa19917cb84d870064018700c04d8700063440000400000018000000c04d870079d90000c0038700fa31400000000000c04d8700c04d87000000000001000000b0fe120082294000c04d87000000000000000000c04d870048fe12008cfe120000000000e224400040fe12008cfe1200c04d8700d84d8700b0fe12008600817c54fa1200d8f9120000000000160018005479420079d90000000000000757917c00000200a4f91200a4f91200a4f91200020000000200000000000000c4f912000000000079d9000014fb12004cfa120014fb1200005a917c00fa1200a0fb120001000000655a917ca405817c74c1977ce705817c00000000f4fd120098fb120000000000a0fb12000000000090fb12000000800070fa120000000000000000000000000016001800547942000000000001000000000000000000000000000000000000003308917ca89a837c0000807c0000807ce800807c2cfa12001fe2907c11fa877cffffffffe06f817c000000006cfa12001c0000000f000000e06f817c8fc60000f0f312000060817cc8fa1200a89a837c7039867cfffffffff0ff1200da36847ca8fa1200099b837cb0fa120000000000b0fa12000000000000000000000000009cfb1200b8fb1200d4fa1200bf37907c9cfb1200e0ff1200b8fb120070fb1200b0ff1200d837907ce0ff120084fb12008b37907c9cfb1200e0ff1200b8fb120070fb1200a89a837c010000009cfb1200e0ff12006078937c9cfb1200e0ff1200b8fb120070fb1200a89a837c280a00009cfb12000200000018ee907c9032917cffffffff8832917c3364917c68fb1200000087003207917c02000000dc31917c1232917c8132917c8832917c1e000000c01e2400080200003807917c54fb12003207917cc4fb120018ee907c9032917c0000130000d01200beb4800088fe1200faea907c00000000b8fb12009cfb1200b8fb1200050000c000000000000000009e4240000200000001000000450000003f0001000000000000000000000000000000000000000000000000007f02ffff0000ffffffffffff0000000000002200000000000000ffff0000000018b72200000118b7220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b0000002300000023000000280a000002000000c1ab807c58bc420094fe12004500000088fe12009e4240001b0000004602010084fe1200230000007f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b622004500000070ff120000424000b8278700dc31917c00000000004c870000000020040000000000000007000000000000004042400000000000000000002e000000000000000cff12007b434100010000000700000084434100004d87002e39917cffffffff24000000240000002700000000000000584d870004000000b1944000244c87002a0000002f000000c0fe1200004d8700584d87000000a659b0b9a859015d400015aa400000000000b4070000784e14000000000001000000f40b00000000000000000000bc070000b8070000f40b0000a8fa120000000000009c4000599c400094b240004f752a0fc0ff1200ec534000010000003039870050398700ff752a0f00002400a02024000050fd7f050000c00100000005000000000000000000240084ff1200acfa1200e0ff1200d06f4000a70b7a0f00000000f0ff1200d76f817c00002400a02024000050fd7f050000c0c8ff1200a8fa1200ffffffffa89a837ce06f817c0000000000000000000000004354400000000000 + +thread[1] +MDRawThread + thread_id = 0x11c0 + suspend_count = 0 + priority_class = 0x0 + priority = 0x0 + teb = 0x7ffde000 + stack.start_of_memory_range = 0x97f6e8 + stack.memory.data_size = 0x918 + stack.memory.rva = 0x231d + thread_context.data_size = 0x2cc + thread_context.rva = 0x1060 + +MDRawContextX86 + context_flags = 0x1003f + dr0 = 0x0 + dr1 = 0x0 + dr2 = 0x0 + dr3 = 0x0 + dr6 = 0x0 + dr7 = 0x0 + float_save.control_word = 0xffff027f + float_save.status_word = 0xffff0000 + float_save.tag_word = 0xffffffff + float_save.error_offset = 0x0 + float_save.error_selector = 0x870000 + float_save.data_offset = 0x0 + float_save.data_selector = 0xffff0000 + float_save.register_area[80] = 0x84fb120000001400320778071400000014000000f4fe1200a0fd120018eeb0fd12003815917c961534ff120034ff12000000e7712a0f2a0000005400ccfb120068514000584d540000002a000000f4fe + float_save.cr0_npx_state = 0x0 + gs = 0x0 + fs = 0x3b + es = 0x23 + ds = 0x23 + edi = 0x145b00 + esi = 0x145aa8 + ebx = 0x145ad0 + edx = 0x7c90eb94 + ecx = 0x7 + eax = 0xa80000 + ebp = 0x97f6fc + eip = 0x7c90eb94 + cs = 0x1b + eflags = 0x246 + esp = 0x97f6ec + ss = 0x23 + extended_registers[512] = 0x7f0200000000870000000000000000000000000000000000801f0000ccfb120084fb1200000014003207917c050000007807140000001400000000005cfb1200f4fe1200a0fd120018ee907c2d020000b0fd12003815917c9615917ceb06917c34ff120034ff12000000000060000000e7712a0f2a0000005400000000000000ccfb120068514000584d870034fc1200540000002a000000f4fe1200f8fe12002c2f4000584d87005e00000034fc12005400000000000000b0fe1200f4fe1200c0fe12005f21400034fc12002a0000003b762a0f91214000303132330000870038393a3b3c3d3e3f4041424300000000070000003bd11e2340061400b858101e5e03e0652e005c00320033003100650064003100780114002d0066003300380034002d0000000000390034002d0062003800350038002d0031003000984e1400350065003000330065003000360035002e0064006d0070000000907c08000000ffffffff8832917cbeb4807c780114001d00f40b784e14000401000044fd120050fd1200c01e240078011400bdb9807ca04e14007c80c2770000000008fd120078011400ecfc1200f0fc1200e6b9807cffffffff7c80c27708fd12001c00000024fd1200e92a867c7c80c277b45a887c8037887c2d0200000080c2770000c17780000000005003000010000020000000780114005cff12001648847c091b917c + +Stack +0x8000108020fa97009fd7907c0000000048f7970005000f0040061400000000004cf7970037b9807c00000000000000003103917c780114000000000061dc907cf1b8807c00000000ffffffff70f79700000000000000000054f797003082140001000000000000000200000000000000000000007cf7970020b9807c0e00000004000000006000000000a80078011400000000000882140092d5907c8b9b807c9c070000d0f89700780114009c07000038821400807f140020dea85910fa9700780114009807000088fb9700e07f14009c0700000000000078011400000000000882140000000000000000000000000078011400ba0300000000000000000000000000000000000000000000000000007801140000000000000000000000000000000000c0030000000000000000000000000000088214005c0057000600000078011400000000005c00730079007300740065006d0033000082140068011400000000000000000000821400d47f1400807f140070f8970061eea859e000a8000000a8001c4e000084f89700bdeea859e000a8000000a8001c4e0000a4f897005fefa8590000a8000000000006000000c4f89700e000a80060fe9700c8f897005abfa8590000a80000000000060000001c000000d47f1400807f1400380000006ce9907c88b9807cffffffff0000a80000000000807f140030fa97007fc3a859a0c4a859b0fb970060fe9700684f1400504500004c010400ca9610410000000000000000e0000e210b01070a00400000003a000000000000f1100000001000000000bf760000000000100000000200000500010005000100040000000000000000b00000000400009ba2000000001400285214000000000034fa97007801140034fa9700910e917c080614006d05917cc84d85005c4e8500684f140000000000b04800002852140078011400e00300003052140000000000000000000000000078011400c403000030821400380000000000000000000000000000000000000000000000000000003882140048050000780200003800000000100000ec000000b8470000400000000000000000000000000000000000140000000000807f140000000000000000000000000000000101a900000060fe9700dcff9700dcff97000050fd7f78fa970054fa9700ad9d917c8cfa9700c2066f7f0e000000000000001c01000078fa9700c84d850068fa970085ae807c78fc970024fc970083dba85978fc97008cfa9700800000008edba85914010000050000000100000096020000b8fc97003815917c9615917ceb06917c60fe970060fe9700c4fd9700d8fa9700000014003207917c21000000b80c14000000140030521400b0fa9700fffffffff4fc970018ee907c3807917cffffffff3207917cab06917ceb06917ccc4f140060fe9700684f1400e0004000e4fa9700a863917c74fb970018ee907c3808917cffffffff3308917c5b2c817c872c817c00000000f4fb9700000000000000000054fd970018ee907c4006140064fd97003815917c00e0fd7feb06917c684f140038821400780114000050fd7facfb970000000000000004000000000090fe97000000000018fb970050531400508b1400a89a837cffe9907cf60d817ca807000000000000ffe9907cf60d817c08000000000000000000000000000000585314003cfc97003882140000000000160e817cc4fd970060fe970058531400208f1400588b1400460f917c50531400208f1400780114003082140000000000b8fc970078011400b8fc9700910e917c080614006d05917c3882140060fe97000000000000000000960200003082140078011400ffe9907c38821400a807000000000000780114005853140058fc9700505314001000000000000000160e817c784e8500c4fd9700388214000000000024010000f00c00001000000044fc970000000000c7e2907ce721807cffffffffe8f69700388214001809000098fc9700acfc9700d2e2a859ffffffffe8f697003882140018090000c4fc97003882140060fe9700c4fd9700ccfc97004ee3a859ffffffffe8f69700000000003882140018090000e0fc9700f4fc970093b2a859ffffffffe8f69700000000003882140018090000c4fd970060fe9700a85a140078fd9700a5b3a85960fe9700c4fd9700684f1400e8f697000000000018090000000000000200000080fd9700c4fd970060fe970000000000f40b000000000000000000000000000000f0fd7f000000001cf3120000000000e40c000039160000cc020000940d00000000000000000000000000000000000002000000ac4f14006010000098fd97005eb7a8593916000000000000684f1400784e85000000000084ff9700d4fe97007bb9a85960fe9700c4fd9700684f14003849140084ff9700010000000000000008ff9700f40b0000090000000000000020000000200000006c0000008c000000380000001e000000c4000000dc000000a80000008401000064000000b801000030000000e801000080050000e8010000680700000000000068070000680700000000000005150000340000002915000039150000fc1600001d23000068070000600300008a070000c80a0000310a00002c130000f91400000c000000352c000000000000ffffffff5c0f0000c84d8500784e8500884e85000000000000000000000000004c010000fc39a6590000000002000000050000000100000000008500280a000001000001cc0200009c0000000b00000050000000040000000010000000000000000000000001000000000000000000000000000034ff970078baa859384914005c0f0000c84d850001000000884e8500684f140008ff970064ff970000000000a8070000b0fe1200f40b00009cfb120000000000b8fb12000000000000000000ae20140000000000884e8500784e8500c84d8500a8fa120011204000ffffffff5c0f0000a80700000000000078ff970064ff970000000000adbf807c2025807cecff97000100000084ff970003000000c0110000f40b0000f40b0000a8fa120000000000010067470c0000006cff9700bc070000ffffffff000000006c1a4000f40b000000fa12000000000000004000a09d4000b0fe120083b6807cb0fe120000004000a09d4000b0fe120000e0fd7f00069c86c0ff9700d8863f86ffffffffa89a837c90b6807c000000000000000000000000301a4000b0fe120000000000 + +MinidumpModuleList + module_count = 13 + +module[0] +MDRawModule + base_of_image = 0x400000 + size_of_image = 0x2d000 + checksum = 0x0 + time_date_stamp = 0x45d35f6c 2007-02-14 19:13:48 + module_name_rva = 0x78a + version_info.signature = 0x0 + version_info.struct_version = 0x0 + version_info.file_version = 0x0:0x0 + version_info.product_version = 0x0:0x0 + version_info.file_flags_mask = 0x0 + version_info.file_flags = 0x0 + version_info.file_os = 0x0 + version_info.file_type = 0x0 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 40 + cv_record.rva = 0x132c + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "c:\test_app.exe" + (code_identifier) = "45D35F6C2d000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 5a9832e5-2872-41c1-838e-d98914e9b7ff + (cv_record).age = 1 + (cv_record).pdb_file_name = "c:\test_app.pdb" + (misc_record) = (null) + (debug_file) = "c:\test_app.pdb" + (debug_identifier) = "5A9832E5287241C1838ED98914E9B7FF1" + (version) = "" + +module[1] +MDRawModule + base_of_image = 0x7c900000 + size_of_image = 0xb0000 + checksum = 0xaf2f7 + time_date_stamp = 0x411096b4 2004-08-04 07:56:36 + module_name_rva = 0x7ae + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 34 + cv_record.rva = 0x1354 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\ntdll.dll" + (code_identifier) = "411096B4b0000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 36515fb5-d043-45e4-91f6-72fa2e2878c0 + (cv_record).age = 2 + (cv_record).pdb_file_name = "ntdll.pdb" + (misc_record) = (null) + (debug_file) = "ntdll.pdb" + (debug_identifier) = "36515FB5D04345E491F672FA2E2878C02" + (version) = "5.1.2600.2180" + +module[2] +MDRawModule + base_of_image = 0x7c800000 + size_of_image = 0xf4000 + checksum = 0xf724d + time_date_stamp = 0x44ab9a84 2006-07-05 10:55:00 + module_name_rva = 0x7ee + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280b81 + version_info.product_version = 0x50001:0xa280b81 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 37 + cv_record.rva = 0x1376 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\kernel32.dll" + (code_identifier) = "44AB9A84f4000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = bce8785c-57b4-4245-a669-896b6a19b954 + (cv_record).age = 2 + (cv_record).pdb_file_name = "kernel32.pdb" + (misc_record) = (null) + (debug_file) = "kernel32.pdb" + (debug_identifier) = "BCE8785C57B44245A669896B6A19B9542" + (version) = "5.1.2600.2945" + +module[3] +MDRawModule + base_of_image = 0x774e0000 + size_of_image = 0x13d000 + checksum = 0x13dc6b + time_date_stamp = 0x42e5be93 2005-07-26 04:39:47 + module_name_rva = 0x834 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280aa6 + version_info.product_version = 0x50001:0xa280aa6 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 34 + cv_record.rva = 0x139b + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\ole32.dll" + (code_identifier) = "42E5BE9313d000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 683b65b2-46f4-4187-96d2-ee6d4c55eb11 + (cv_record).age = 2 + (cv_record).pdb_file_name = "ole32.pdb" + (misc_record) = (null) + (debug_file) = "ole32.pdb" + (debug_identifier) = "683B65B246F4418796D2EE6D4C55EB112" + (version) = "5.1.2600.2726" + +module[4] +MDRawModule + base_of_image = 0x77dd0000 + size_of_image = 0x9b000 + checksum = 0xa0de4 + time_date_stamp = 0x411096a7 2004-08-04 07:56:23 + module_name_rva = 0x874 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 37 + cv_record.rva = 0x13bd + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\advapi32.dll" + (code_identifier) = "411096A79b000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 455d6c5f-184d-45bb-b5c5-f30f82975114 + (cv_record).age = 2 + (cv_record).pdb_file_name = "advapi32.pdb" + (misc_record) = (null) + (debug_file) = "advapi32.pdb" + (debug_identifier) = "455D6C5F184D45BBB5C5F30F829751142" + (version) = "5.1.2600.2180" + +module[5] +MDRawModule + base_of_image = 0x77e70000 + size_of_image = 0x91000 + checksum = 0x9c482 + time_date_stamp = 0x411096ae 2004-08-04 07:56:30 + module_name_rva = 0x8ba + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 35 + cv_record.rva = 0x13e2 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\rpcrt4.dll" + (code_identifier) = "411096AE91000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = bea45a72-1da1-41da-a3ba-86b3a2031153 + (cv_record).age = 2 + (cv_record).pdb_file_name = "rpcrt4.pdb" + (misc_record) = (null) + (debug_file) = "rpcrt4.pdb" + (debug_identifier) = "BEA45A721DA141DAA3BA86B3A20311532" + (version) = "5.1.2600.2180" + +module[6] +MDRawModule + base_of_image = 0x77f10000 + size_of_image = 0x47000 + checksum = 0x4d0d0 + time_date_stamp = 0x43b34feb 2005-12-29 02:54:35 + module_name_rva = 0x8fc + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280b02 + version_info.product_version = 0x50001:0xa280b02 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 34 + cv_record.rva = 0x1405 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\gdi32.dll" + (code_identifier) = "43B34FEB47000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = c0ea66be-00a6-4bd7-aef7-9e443a91869c + (cv_record).age = 2 + (cv_record).pdb_file_name = "gdi32.pdb" + (misc_record) = (null) + (debug_file) = "gdi32.pdb" + (debug_identifier) = "C0EA66BE00A64BD7AEF79E443A91869C2" + (version) = "5.1.2600.2818" + +module[7] +MDRawModule + base_of_image = 0x77d40000 + size_of_image = 0x90000 + checksum = 0x9505c + time_date_stamp = 0x42260159 2005-03-02 18:09:29 + module_name_rva = 0x93c + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280a3e + version_info.product_version = 0x50001:0xa280a3e + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 35 + cv_record.rva = 0x1427 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\user32.dll" + (code_identifier) = "4226015990000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = ee2b714d-83a3-4c9d-8802-7621272f8326 + (cv_record).age = 2 + (cv_record).pdb_file_name = "user32.pdb" + (misc_record) = (null) + (debug_file) = "user32.pdb" + (debug_identifier) = "EE2B714D83A34C9D88027621272F83262" + (version) = "5.1.2600.2622" + +module[8] +MDRawModule + base_of_image = 0x77c10000 + size_of_image = 0x58000 + checksum = 0x57cd3 + time_date_stamp = 0x41109752 2004-08-04 07:59:14 + module_name_rva = 0x97e + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x70000:0xa280884 + version_info.product_version = 0x60001:0x21be0884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x1 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 35 + cv_record.rva = 0x144a + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\msvcrt.dll" + (code_identifier) = "4110975258000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = a678f3c3-0ded-426b-8390-32b996987e38 + (cv_record).age = 1 + (cv_record).pdb_file_name = "msvcrt.pdb" + (misc_record) = (null) + (debug_file) = "msvcrt.pdb" + (debug_identifier) = "A678F3C30DED426B839032B996987E381" + (version) = "7.0.2600.2180" + +module[9] +MDRawModule + base_of_image = 0x76390000 + size_of_image = 0x1d000 + checksum = 0x2a024 + time_date_stamp = 0x411096ae 2004-08-04 07:56:30 + module_name_rva = 0x9c0 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 34 + cv_record.rva = 0x146d + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\imm32.dll" + (code_identifier) = "411096AE1d000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 2c17a49c-251b-4c8e-b9e2-ad13d7d9ea16 + (cv_record).age = 2 + (cv_record).pdb_file_name = "imm32.pdb" + (misc_record) = (null) + (debug_file) = "imm32.pdb" + (debug_identifier) = "2C17A49C251B4C8EB9E2AD13D7D9EA162" + (version) = "5.1.2600.2180" + +module[10] +MDRawModule + base_of_image = 0x59a60000 + size_of_image = 0xa1000 + checksum = 0xa8824 + time_date_stamp = 0x4110969a 2004-08-04 07:56:10 + module_name_rva = 0xa00 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 36 + cv_record.rva = 0x148f + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\dbghelp.dll" + (code_identifier) = "4110969Aa1000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 39559573-e21b-46f2-8e28-6923be9e6a76 + (cv_record).age = 1 + (cv_record).pdb_file_name = "dbghelp.pdb" + (misc_record) = (null) + (debug_file) = "dbghelp.pdb" + (debug_identifier) = "39559573E21B46F28E286923BE9E6A761" + (version) = "5.1.2600.2180" + +module[11] +MDRawModule + base_of_image = 0x77c00000 + size_of_image = 0x8000 + checksum = 0x11d78 + time_date_stamp = 0x411096b7 2004-08-04 07:56:39 + module_name_rva = 0xa44 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 36 + cv_record.rva = 0x14b3 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\version.dll" + (code_identifier) = "411096B78000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = 180a90c4-0384-463e-82dd-c45b2c8ab76e + (cv_record).age = 2 + (cv_record).pdb_file_name = "version.pdb" + (misc_record) = (null) + (debug_file) = "version.pdb" + (debug_identifier) = "180A90C40384463E82DDC45B2C8AB76E2" + (version) = "5.1.2600.2180" + +module[12] +MDRawModule + base_of_image = 0x76bf0000 + size_of_image = 0xb000 + checksum = 0xa29b + time_date_stamp = 0x411096ca 2004-08-04 07:56:58 + module_name_rva = 0xa88 + version_info.signature = 0xfeef04bd + version_info.struct_version = 0x10000 + version_info.file_version = 0x50001:0xa280884 + version_info.product_version = 0x50001:0xa280884 + version_info.file_flags_mask = 0x3f + version_info.file_flags = 0x0 + version_info.file_os = 0x40004 + version_info.file_type = 0x2 + version_info.file_subtype = 0x0 + version_info.file_date = 0x0:0x0 + cv_record.data_size = 34 + cv_record.rva = 0x14d7 + misc_record.data_size = 0 + misc_record.rva = 0x0 + (code_file) = "C:\WINDOWS\system32\psapi.dll" + (code_identifier) = "411096CAb000" + (cv_record).cv_signature = 0x53445352 + (cv_record).signature = a5c3a1f9-689f-43d8-ad22-8a0929388970 + (cv_record).age = 2 + (cv_record).pdb_file_name = "psapi.pdb" + (misc_record) = (null) + (debug_file) = "psapi.pdb" + (debug_identifier) = "A5C3A1F9689F43D8AD228A09293889702" + (version) = "5.1.2600.2180" + +MinidumpMemoryList + region_count = 3 + +region[0] +MDMemoryDescriptor + start_of_memory_range = 0x7c90eb14 + memory.data_size = 0x100 + memory.rva = 0x1539 +Memory +0xff83c4ec890424c744240401000000895c2408c74424100000000054e877000000c208009090909090558bec83ec508944240c64a1180000008b80a4010000890424c744240400000000c744240800000000c74424100000000054e8380000008b04248be55dc3908da424000000008d490090909090908bd40f349090909090c38da424000000008d64240090909090908d542408cd2ec3558bec9c81ecd00200008985dcfdffff898dd8fdffff8b45088b4d0489480c8d852cfdffff8988b80000008998a40000008990a800000089b0a000000089b89c0000008d4d0c8988c40000008b4d008988b40000008b4dfc8988c00000008c88bc0000008c989800 + +region[1] +MDMemoryDescriptor + start_of_memory_range = 0x12f31c + memory.data_size = 0xce4 + memory.rva = 0x1639 +Memory +0x00000000c0e9907ccb25807cb8070000000000000000000034ff1200b0fe12008037887c140000000100000000000000000000001000000027e0907c2e39917c0050fd7f00f0fd7f000000000400000034f312006947c788d4f31200a89a837cf825807c0000000098f312003225807cb8070000ffffffff00000000e4f31200ff1d4000b8070000ffffffffa8fa12008037887c0e1c4000a8fa120000000000ff792a0f64f91200b01b400000004000b0fe12000040020070fa1200084042000000000080fa120080fa12004e30867ca8fa12000000000000000000000000000018000002100000e3ef907c0000000079d900000000000048f41200000014003207917c0500000078071400000014000000000020f412003207917ca05f140018ee907cfa00000074f61200000000009615917ceb06917cf00298000100000000000000384f14009615917ceb06917c7801140008000000404f14000000a659985f1400080000000000000018ee907c90fea700400698003815917c184f1400eb06917c00000000800000000000a65988f69f0090f51200a569917cf8f41200d95c878880f5120043ef907c480485000500000090f5120088fea700a8212400000000000000000080f512002469917cf8fbfd7fa821240008000000f500000000000000384d850078019800a8fa120004000000a05f140096d4917c00000000b0d4917c0000000008069800184f140000000000104f140000000000184f140000004000000000010040020063003a005c0074006500730074005f006100700070002e006500780065000000000000002f00000028000000184f1400780185007801140028000000000000000000140084f3120010000000d8f5120018ee907cf006917cffffffffeb06917ce619917c88e6a7003003000001030000ff1b917c0000980080e6a70080069800400698000000980080e6a70000000000000000000000000080e6a7000818000088e6a700d759927c78019800081800000210000000009800f8f31200280a0000dcf6120018ee907cf006917cffffffffeb06917c0859927c00009800080000005859927c00000000000001000000a659000000005a6202000010000068fe030001000000dffe03000000010000000100fffffe7f0100000001c0c27700008500000000002dc0c27700000000684aaf590000a659241a917c80c0977c0000000000000000cd5c927c0050fd7f0000a65900000100080000004550fd7f0000000000000000000000000050fd7fcd5c927c05000000d4f61200f45c927c80e4977c05000000010000000050fd7f18f712007009917cc0e4977c172e817cff2d817c000000000000a6590000a6590210000000f0fd7f05000000e8f612000806980064f81200a89a837c002e817cffffffffff2d817cc8242400dd8ea75901000000000000004cf712003608a9590000a65901000000000000000100000060f71200e407a9596cf7120000004000000000010040020063003a005c0074006500730074005f006100700070002e0065007800650000006d05917c905f140000000000440d020000000000604f14000c0000007801140000000000a04e1400d84d8700400687004509917c0800000000000000000000004000000078011400a8038700404f14000510907c000000000000000078011400980387000800000008000000c0e4977cd04d8700f835887c7801140010000000a0e7ae591600000030fd1200d39b917c44000000620000000000a65950e9ae59d8eaae59a80387000100000014040000000000000100000002000000f800a659c003870001000000780114009508917c0000a659091b917c020000000900000040000000a2fd12009cfd1200404f1400a2fd1200d04d8700640187000000000000000000d04d870010000000d84d8700384f1400a803870010000000c00300000000870074fb1200404f14006cfe120018ee907cf006917cffffffffeb06917ca09d400000008700000000000400000000000000ffffff3fc04d8700ccfd12009c4d400004000000fa19917cb84d870064018700c04d8700063440000400000018000000c04d870079d90000c0038700fa31400000000000c04d8700c04d87000000000001000000b0fe120082294000c04d87000000000000000000c04d870048fe12008cfe120000000000e224400040fe12008cfe1200c04d8700d84d8700b0fe12008600817c54fa1200d8f9120000000000160018005479420079d90000000000000757917c00000200a4f91200a4f91200a4f91200020000000200000000000000c4f912000000000079d9000014fb12004cfa120014fb1200005a917c00fa1200a0fb120001000000655a917ca405817c74c1977ce705817c00000000f4fd120098fb120000000000a0fb12000000000090fb12000000800070fa120000000000000000000000000016001800547942000000000001000000000000000000000000000000000000003308917ca89a837c0000807c0000807ce800807c2cfa12001fe2907c11fa877cffffffffe06f817c000000006cfa12001c0000000f000000e06f817c8fc60000f0f312000060817cc8fa1200a89a837c7039867cfffffffff0ff1200da36847ca8fa1200099b837cb0fa120000000000b0fa12000000000000000000000000009cfb1200b8fb1200d4fa1200bf37907c9cfb1200e0ff1200b8fb120070fb1200b0ff1200d837907ce0ff120084fb12008b37907c9cfb1200e0ff1200b8fb120070fb1200a89a837c010000009cfb1200e0ff12006078937c9cfb1200e0ff1200b8fb120070fb1200a89a837c280a00009cfb12000200000018ee907c9032917cffffffff8832917c3364917c68fb1200000087003207917c02000000dc31917c1232917c8132917c8832917c1e000000c01e2400080200003807917c54fb12003207917cc4fb120018ee907c9032917c0000130000d01200beb4800088fe1200faea907c00000000b8fb12009cfb1200b8fb1200050000c000000000000000009e4240000200000001000000450000003f0001000000000000000000000000000000000000000000000000007f02ffff0000ffffffffffff0000000000002200000000000000ffff0000000018b72200000118b7220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b0000002300000023000000280a000002000000c1ab807c58bc420094fe12004500000088fe12009e4240001b0000004602010084fe1200230000007f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b622004500000070ff120000424000b8278700dc31917c00000000004c870000000020040000000000000007000000000000004042400000000000000000002e000000000000000cff12007b434100010000000700000084434100004d87002e39917cffffffff24000000240000002700000000000000584d870004000000b1944000244c87002a0000002f000000c0fe1200004d8700584d87000000a659b0b9a859015d400015aa400000000000b4070000784e14000000000001000000f40b00000000000000000000bc070000b8070000f40b0000a8fa120000000000009c4000599c400094b240004f752a0fc0ff1200ec534000010000003039870050398700ff752a0f00002400a02024000050fd7f050000c00100000005000000000000000000240084ff1200acfa1200e0ff1200d06f4000a70b7a0f00000000f0ff1200d76f817c00002400a02024000050fd7f050000c0c8ff1200a8fa1200ffffffffa89a837ce06f817c0000000000000000000000004354400000000000 + +region[2] +MDMemoryDescriptor + start_of_memory_range = 0x97f6e8 + memory.data_size = 0x918 + memory.rva = 0x231d +Memory +0x8000108020fa97009fd7907c0000000048f7970005000f0040061400000000004cf7970037b9807c00000000000000003103917c780114000000000061dc907cf1b8807c00000000ffffffff70f79700000000000000000054f797003082140001000000000000000200000000000000000000007cf7970020b9807c0e00000004000000006000000000a80078011400000000000882140092d5907c8b9b807c9c070000d0f89700780114009c07000038821400807f140020dea85910fa9700780114009807000088fb9700e07f14009c0700000000000078011400000000000882140000000000000000000000000078011400ba0300000000000000000000000000000000000000000000000000007801140000000000000000000000000000000000c0030000000000000000000000000000088214005c0057000600000078011400000000005c00730079007300740065006d0033000082140068011400000000000000000000821400d47f1400807f140070f8970061eea859e000a8000000a8001c4e000084f89700bdeea859e000a8000000a8001c4e0000a4f897005fefa8590000a8000000000006000000c4f89700e000a80060fe9700c8f897005abfa8590000a80000000000060000001c000000d47f1400807f1400380000006ce9907c88b9807cffffffff0000a80000000000807f140030fa97007fc3a859a0c4a859b0fb970060fe9700684f1400504500004c010400ca9610410000000000000000e0000e210b01070a00400000003a000000000000f1100000001000000000bf760000000000100000000200000500010005000100040000000000000000b00000000400009ba2000000001400285214000000000034fa97007801140034fa9700910e917c080614006d05917cc84d85005c4e8500684f140000000000b04800002852140078011400e00300003052140000000000000000000000000078011400c403000030821400380000000000000000000000000000000000000000000000000000003882140048050000780200003800000000100000ec000000b8470000400000000000000000000000000000000000140000000000807f140000000000000000000000000000000101a900000060fe9700dcff9700dcff97000050fd7f78fa970054fa9700ad9d917c8cfa9700c2066f7f0e000000000000001c01000078fa9700c84d850068fa970085ae807c78fc970024fc970083dba85978fc97008cfa9700800000008edba85914010000050000000100000096020000b8fc97003815917c9615917ceb06917c60fe970060fe9700c4fd9700d8fa9700000014003207917c21000000b80c14000000140030521400b0fa9700fffffffff4fc970018ee907c3807917cffffffff3207917cab06917ceb06917ccc4f140060fe9700684f1400e0004000e4fa9700a863917c74fb970018ee907c3808917cffffffff3308917c5b2c817c872c817c00000000f4fb9700000000000000000054fd970018ee907c4006140064fd97003815917c00e0fd7feb06917c684f140038821400780114000050fd7facfb970000000000000004000000000090fe97000000000018fb970050531400508b1400a89a837cffe9907cf60d817ca807000000000000ffe9907cf60d817c08000000000000000000000000000000585314003cfc97003882140000000000160e817cc4fd970060fe970058531400208f1400588b1400460f917c50531400208f1400780114003082140000000000b8fc970078011400b8fc9700910e917c080614006d05917c3882140060fe97000000000000000000960200003082140078011400ffe9907c38821400a807000000000000780114005853140058fc9700505314001000000000000000160e817c784e8500c4fd9700388214000000000024010000f00c00001000000044fc970000000000c7e2907ce721807cffffffffe8f69700388214001809000098fc9700acfc9700d2e2a859ffffffffe8f697003882140018090000c4fc97003882140060fe9700c4fd9700ccfc97004ee3a859ffffffffe8f69700000000003882140018090000e0fc9700f4fc970093b2a859ffffffffe8f69700000000003882140018090000c4fd970060fe9700a85a140078fd9700a5b3a85960fe9700c4fd9700684f1400e8f697000000000018090000000000000200000080fd9700c4fd970060fe970000000000f40b000000000000000000000000000000f0fd7f000000001cf3120000000000e40c000039160000cc020000940d00000000000000000000000000000000000002000000ac4f14006010000098fd97005eb7a8593916000000000000684f1400784e85000000000084ff9700d4fe97007bb9a85960fe9700c4fd9700684f14003849140084ff9700010000000000000008ff9700f40b0000090000000000000020000000200000006c0000008c000000380000001e000000c4000000dc000000a80000008401000064000000b801000030000000e801000080050000e8010000680700000000000068070000680700000000000005150000340000002915000039150000fc1600001d23000068070000600300008a070000c80a0000310a00002c130000f91400000c000000352c000000000000ffffffff5c0f0000c84d8500784e8500884e85000000000000000000000000004c010000fc39a6590000000002000000050000000100000000008500280a000001000001cc0200009c0000000b00000050000000040000000010000000000000000000000001000000000000000000000000000034ff970078baa859384914005c0f0000c84d850001000000884e8500684f140008ff970064ff970000000000a8070000b0fe1200f40b00009cfb120000000000b8fb12000000000000000000ae20140000000000884e8500784e8500c84d8500a8fa120011204000ffffffff5c0f0000a80700000000000078ff970064ff970000000000adbf807c2025807cecff97000100000084ff970003000000c0110000f40b0000f40b0000a8fa120000000000010067470c0000006cff9700bc070000ffffffff000000006c1a4000f40b000000fa12000000000000004000a09d4000b0fe120083b6807cb0fe120000004000a09d4000b0fe120000e0fd7f00069c86c0ff9700d8863f86ffffffffa89a837c90b6807c000000000000000000000000301a4000b0fe120000000000 + +MDException + thread_id = 0xbf4 + exception_record.exception_code = 0xc0000005 + exception_record.exception_flags = 0x0 + exception_record.exception_record = 0x0 + exception_record.exception_address = 0x40429e + exception_record.number_parameters = 2 + exception_record.exception_information[ 0] = 0x1 + exception_record.exception_information[ 1] = 0x45 + thread_context.data_size = 716 + thread_context.rva = 0xac8 + +MDRawContextX86 + context_flags = 0x1003f + dr0 = 0x0 + dr1 = 0x0 + dr2 = 0x0 + dr3 = 0x0 + dr6 = 0x0 + dr7 = 0x0 + float_save.control_word = 0xffff027f + float_save.status_word = 0xffff0000 + float_save.tag_word = 0xffffffff + float_save.error_offset = 0x0 + float_save.error_selector = 0x220000 + float_save.data_offset = 0x0 + float_save.data_selector = 0xffff0000 + float_save.register_area[80] = 0x0000000018b72200000118b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + float_save.cr0_npx_state = 0x0 + gs = 0x0 + fs = 0x3b + es = 0x23 + ds = 0x23 + edi = 0xa28 + esi = 0x2 + ebx = 0x7c80abc1 + edx = 0x42bc58 + ecx = 0x12fe94 + eax = 0x45 + ebp = 0x12fe88 + eip = 0x40429e + cs = 0x1b + eflags = 0x10246 + esp = 0x12fe84 + ss = 0x23 + extended_registers[512] = 0x7f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b62200 + +MDRawSystemInfo + processor_architecture = 0x0 (x86) + processor_level = 6 + processor_revision = 0xd08 + number_of_processors = 1 + product_type = 1 + major_version = 5 + minor_version = 1 + build_number = 2600 + platform_id = 0x2 (windows) + csd_version_rva = 0x768 + suite_mask = 0x100 + cpu.x86_cpu_info (valid): + cpu.x86_cpu_info.vendor_id[0] = 0x756e6547 + cpu.x86_cpu_info.vendor_id[1] = 0x49656e69 + cpu.x86_cpu_info.vendor_id[2] = 0x6c65746e + cpu.x86_cpu_info.version_information = 0x6d8 + cpu.x86_cpu_info.feature_information = 0xafe9fbff + cpu.x86_cpu_info.amd_extended_cpu_features = 0xffffffff + (csd_version) = "Service Pack 2" + (cpu_vendor) = "GenuineIntel" + +MDRawMiscInfo + size_of_info = 24 + flags1 = 0x3 + process_id = 3932 + process_create_time = 0x45d35f73 2007-02-14 19:13:55 + process_user_time = 0 + process_kernel_time = 0 + +MDRawBreakpadInfo + validity = 0x3 + dump_thread_id = 0x11c0 + requesting_thread_id = 0xbf4 + diff --git a/src/processor/testdata/minidump2.stackwalk.machine_readable.out b/src/processor/testdata/minidump2.stackwalk.machine_readable.out new file mode 100644 index 0000000..c976555 --- /dev/null +++ b/src/processor/testdata/minidump2.stackwalk.machine_readable.out @@ -0,0 +1,22 @@ +OS|Windows NT|5.1.2600 Service Pack 2 +CPU|x86|GenuineIntel family 6 model 13 stepping 8|1 +GPU||| +Crash|EXCEPTION_ACCESS_VIOLATION_WRITE|0x45|0 +Module|test_app.exe||test_app.pdb|5A9832E5287241C1838ED98914E9B7FF1|0x00400000|0x0042cfff|1 +Module|dbghelp.dll|5.1.2600.2180|dbghelp.pdb|39559573E21B46F28E286923BE9E6A761|0x59a60000|0x59b00fff|0 +Module|imm32.dll|5.1.2600.2180|imm32.pdb|2C17A49C251B4C8EB9E2AD13D7D9EA162|0x76390000|0x763acfff|0 +Module|psapi.dll|5.1.2600.2180|psapi.pdb|A5C3A1F9689F43D8AD228A09293889702|0x76bf0000|0x76bfafff|0 +Module|ole32.dll|5.1.2600.2726|ole32.pdb|683B65B246F4418796D2EE6D4C55EB112|0x774e0000|0x7761cfff|0 +Module|version.dll|5.1.2600.2180|version.pdb|180A90C40384463E82DDC45B2C8AB76E2|0x77c00000|0x77c07fff|0 +Module|msvcrt.dll|7.0.2600.2180|msvcrt.pdb|A678F3C30DED426B839032B996987E381|0x77c10000|0x77c67fff|0 +Module|user32.dll|5.1.2600.2622|user32.pdb|EE2B714D83A34C9D88027621272F83262|0x77d40000|0x77dcffff|0 +Module|advapi32.dll|5.1.2600.2180|advapi32.pdb|455D6C5F184D45BBB5C5F30F829751142|0x77dd0000|0x77e6afff|0 +Module|rpcrt4.dll|5.1.2600.2180|rpcrt4.pdb|BEA45A721DA141DAA3BA86B3A20311532|0x77e70000|0x77f00fff|0 +Module|gdi32.dll|5.1.2600.2818|gdi32.pdb|C0EA66BE00A64BD7AEF79E443A91869C2|0x77f10000|0x77f56fff|0 +Module|kernel32.dll|5.1.2600.2945|kernel32.pdb|BCE8785C57B44245A669896B6A19B9542|0x7c800000|0x7c8f3fff|0 +Module|ntdll.dll|5.1.2600.2180|ntdll.pdb|36515FB5D04345E491F672FA2E2878C02|0x7c900000|0x7c9affff|0 + +0|0|test_app.exe|`anonymous namespace'::CrashFunction|c:\test_app.cc|58|0x3 +0|1|test_app.exe|main|c:\test_app.cc|65|0x5 +0|2|test_app.exe|__tmainCRTStartup|f:\sp\vctools\crt_bld\self_x86\crt\src\crt0.c|327|0x12 +0|3|kernel32.dll|BaseProcessStart|||0x23 diff --git a/src/processor/testdata/minidump2.stackwalk.out b/src/processor/testdata/minidump2.stackwalk.out new file mode 100644 index 0000000..d04234a --- /dev/null +++ b/src/processor/testdata/minidump2.stackwalk.out @@ -0,0 +1,42 @@ +Operating system: Windows NT + 5.1.2600 Service Pack 2 +CPU: x86 + GenuineIntel family 6 model 13 stepping 8 + 1 CPU + +GPU: UNKNOWN + +Crash reason: EXCEPTION_ACCESS_VIOLATION_WRITE +Crash address: 0x45 +Process uptime: 0 seconds + +Thread 0 (crashed) + 0 test_app.exe!`anonymous namespace'::CrashFunction [test_app.cc : 58 + 0x3] + eip = 0x0040429e esp = 0x0012fe84 ebp = 0x0012fe88 ebx = 0x7c80abc1 + esi = 0x00000002 edi = 0x00000a28 eax = 0x00000045 ecx = 0x0012fe94 + edx = 0x0042bc58 efl = 0x00010246 + Found by: given as instruction pointer in context + 1 test_app.exe!main [test_app.cc : 65 + 0x5] + eip = 0x00404200 esp = 0x0012fe90 ebp = 0x0012ff70 + Found by: call frame info + 2 test_app.exe!__tmainCRTStartup [crt0.c : 327 + 0x12] + eip = 0x004053ec esp = 0x0012ff78 ebp = 0x0012ffc0 + Found by: call frame info + 3 kernel32.dll!BaseProcessStart + 0x23 + eip = 0x7c816fd7 esp = 0x0012ffc8 ebp = 0x0012fff0 + Found by: call frame info + +Loaded modules: +0x00400000 - 0x0042cfff test_app.exe ??? (main) +0x59a60000 - 0x59b00fff dbghelp.dll 5.1.2600.2180 +0x76390000 - 0x763acfff imm32.dll 5.1.2600.2180 +0x76bf0000 - 0x76bfafff psapi.dll 5.1.2600.2180 +0x774e0000 - 0x7761cfff ole32.dll 5.1.2600.2726 +0x77c00000 - 0x77c07fff version.dll 5.1.2600.2180 +0x77c10000 - 0x77c67fff msvcrt.dll 7.0.2600.2180 +0x77d40000 - 0x77dcffff user32.dll 5.1.2600.2622 +0x77dd0000 - 0x77e6afff advapi32.dll 5.1.2600.2180 +0x77e70000 - 0x77f00fff rpcrt4.dll 5.1.2600.2180 +0x77f10000 - 0x77f56fff gdi32.dll 5.1.2600.2818 +0x7c800000 - 0x7c8f3fff kernel32.dll 5.1.2600.2945 +0x7c900000 - 0x7c9affff ntdll.dll 5.1.2600.2180 diff --git a/src/processor/testdata/minidump_32bit_crash_addr.dmp b/src/processor/testdata/minidump_32bit_crash_addr.dmp new file mode 100644 index 0000000000000000000000000000000000000000..78becc6f1ad8dbb148ca016d6fce604b25df346c GIT binary patch literal 11317 zcmeHNeN>d!nSTZm!7mUe*4B@rnN(vH5lI3utFL?*(*-4woH&L=)R_tubc%%H_B~+` zgdwPzX{>M(Vn}LqvPmqBwqn*8jO@mCmt#%T#5Ja&#u%0T{qFm|Fw&H$ z%^x|teK_~M_dehExgYQIUM4F&EBmRPlkblbkvJ5>+NJMg7%hV^rKJXjaj$#zV+E_-_pL5*7k0pC_ZMe=*$to#`k4!Zp}uzw0TKXxt*T)@wxw#SMcoA2 zB4nUY-<%$dLSOfzJdD!a-G&yUZS*Y_6Rn1-kHCS$<`^wsdl=4NDQA1^r?Cok62VIu zB|@1k!!V!`J)B0P)8IdSpYVha9h(H9Osi(9<37`=3`~+ir6EGPvQ%CkE z=+_PE5c%wngJsXwn7O-P>y7Y_uQK8`%t}?{;7!r23w{5+FI}vNf%=%akB8Xe>1fPX1nL75LTy=R5KJhbtsnGjE2UI1w%f$f z6sG2@HN=*+udF)M)|c(CqJC}da4K6dgT>(+EKg%?2+pn07+&u>bU@LQ{n~0ZV<=KK z&L(?dEB&vqwYy(iZyGUd#y)&OS6!@H?*aW5b1$JSWT7l~VnrBn)J1zK^EEz8ha zg;pY{<55<~-I6OMpsvMpDd-;j#iL(_BA|+-DV~SqK3O2?vQQp^-dymnQ!;KTl9|w# zE32WwC58BlH*4ekzh3!OuviQ&ZfKy!UM)A`#TrPv`^alIFp6dHy;Q}appTY&Za_;h zqPPO1DM8M1bK_VEKmHmI9>eS~p4Ue5M#fMC4W;HNZf*<(SR2Ob=#`&+15tFza#<<) zYDI8W8mmj>Ms$>_D6B;+*I;e+>bQ|Lx`&?z5pfpHxtEytkJP&qRJipa|60~u9Odq@#{xkGv>N+_e2?e z&aZpG-+HoMUo$(PFGq<)tdB!}4+>A|JI(p6kg>Yl!0 zdiuh&2eUFBpD{fvD`P>n%<>n%y$vBDy9>c>-}r=ZS}BaqF%Uz5dI zIp`DDbrlZ_n$(wzwKZyfl^!)Fpg*uEebM`g4NHnAADmmc`Q2LknZ4a`O;+5UTjE|@vUHip z6Yp^?7xMjj>HT-6wV%ugTqwR2Ke?=xW>%ND3JZHUa?4Kd-}6vL>W+fiRX_Unz8rF_ zau=_57tT!VVS3FyE5B=A&D^cOJ6DwX;723Kw5HG7pZi7SvzflI(g~BMSALHikF9kVhuAsvY1xkd8MZ35(x13*Ys2Ho zj84(oQW)y7)42UxQ^(x4Idk8MS4SRu_rp=tQczSBqGavQA50l@;*aw-PcFFiz_uTi zQi*H%%6xZWZ+P4MgGW~lm_2X(dunsyC(vmw$+sfKPk6BIY~|VP+H}WI*Ymuotn+S%fGJ9Lh;j9^HpO{?S{Lr9d;gI` z{!QEY$t;`hGqlwmjZRW(4_O44!=P-+aYX(${t(PHR-EMxU+sqDSGv1vH+A4yml0W) z6<#}k=%x)*iS)HVXKllFKK(&Ho16G-X~c6=*3eoXFKz3xq}I1bH7?isTG80(+s|i1 z1D=TA8NdE-w|R9Y1QzfRI)D zq7FV?sb7R%$~B;$XxgwYQ%?fdJx)`J2ywwnhP~lqHDR03y>3dh>vQ-rMng|iK8Y44 z9?&DTRI-SdawrQDs&z|F5%|Ddg~8!Jd~B?Xbx6<%^Si7U)1M#maiAp*3g}Hs?JC*4 z1pbl>hCf^Jy5b>!KCGc9Cdmu!V&Qq%a2aU8iR^GTK!;iu=rM8iU)?EMM1y+mjRp^O zfh1l&!0)^8ocR9~D=!uV^o#K0-P{_V7yUH&KRDd&je+IrNm+icd6@QMBqV$9m;Yed-?^RK$rAmenD$taX9v(c_y z^-1IFp9v<{PY3*EJkDeMoO{OMgKr0P-v>J-0UOzd(v8C!D@VM*dEp=9X7#Df0@5Qf z&y+pp{25+44XV$1C;vs*Do}!PtI zh5Q7_9CkS5z0EtFN-uabq4&j{h{a9~=^kIl4 zAP;MU|3u>2ATR;wK*FO%)Cd!3Yrl}Dp^z^)0CdRlV~}_P@eRO}pM@WU?a*`a4xdUq zIQ>nhb~*9?7D+(T@Xj*`^6v%cZbYGfY|{sqtvA7BU#)r6$>5kg$~?sibTn&fC80v*}q) z@sQJWj|tYCR_HoHyIGpTU&7vLG3}BTk!0YpErflZdmPK985&h79PtE>muLO@+ckw( zNIXcN5Bx?H!U=~an%O6fb4IypsnBz9{&wJ;CXB+No3k!e*<^pvLyTLPYzN&cj2{c3 z&6J~$cElnRx>(B+$f4bYHhpxXzkOhZUUINrKZTmIU5G&gc>&}j_*Lyy?+Ar3AC_P2 zQeR(~iTUL_3#X|nr%_LZ{qLUe>mx4Js6ErU#;{um{8%X9g#vL;{)@izDPOxg#!J`p=x1bya{mr}lI{TfFCC-D=jCKd`#PK7g z?n`)Rmt(VJ^U9w3Gd<+tc}O14fqE|?Vds&+#C@hKpyz|ewaND&d5+Hr=&_(xppb`` zEKK5g@sbRl9PpF34Yj3DWTZ%Ytl&dHcu98YLu2o9Jl0roKD9!Xf^Dgq@`wIspnQ`r zQ2urqsHW^|fBav)K;e4!VBbnA^4&=_YCoyqWvVkc&N|zz6kG$J1@UHMDCB>dHdmcp zG`Zy;HS|UH zKsi6y3EYdJKWf+y8ov{W>&dknHF2VBc}yuL z`3v_wb)z=HAytrj1!o`6xArxf>>TnBJYI$8=P`BeUMqhXc>2Jx^GvhOW=msQj;5Mk ziSfo=s+Z@E8RyUZ&+1_}8u^AX#!U3@!bO86H)B9R?| zW8k;SbAb1KQ7@gqlZQY&fx1G0_}5i#5sK|?TXMY^OhzAm>deJIB_qIO@%R1rq<|;i z^g-!D|0w*U?;eb2*}0&zQ~jhUC}S63y#n_}AKZ4}mVO*Wz8O?1Xs-=8%H>_Hm&0f; zdGlI2-@BHbWV8$M{pvF>iYz_!Apx-~KNNH}wFRBch#mFiBhSjlX3VsOtA7+Lqj+@6 z@Cid~g9eL+4*!b<_=HIsiMe!!TIBy;Xq2ZkfB z#d>2td>G$jxeGQZUntQ$AKy%nVVpZL4+*9`X$0cih(~-m-oFG~H}kQf%HX5ogTH6N z+;Xp|VO=X{_{cb23pU$JKrmLvyN$yAT81&?puGBQK;MY^t%x<{T-$`P*vO=FT=}Rs z?83$0<$7_TRQ_ks$u?!Y;N6VA9sJz)-2YqQYYXVcHL&q*P1`JOSL&q$a*Qc+iwS78 z45h!ATg0dtH15eR$TR0)9>P9(U&i+&zbTJkzO8xhL=;X!Cb%M?mtZ|88RUGFVea?v z)C#=@1qP%GbPICe2YGp3xX`Arf*)#8Ki3oEuJ#Dx^h%GMu{!)12Vpeu*^99D>X85A ztm?*^y)djo51M<~>hn7$6c$6~9>xbY2&0Bq=!^@;L|WXFc3BLa^P&Sf^|Mc3xK;>^ zE&HrP*C6##hXtGm%8-}7kZ$=#9BnOz4%$##0)q6V4C|QwSpGRMsps)=N1k->6W&Jt zd}@Mmk<0rx^74mm4WPe*^1Bm3C+8rP)&{)gBlRCaf59Jm`KZ^@(+L{az*Db%Io*mE z|4C2=T`%qqI<57^`3t=hq+WzVyx_CshzorOvTxma^}S!Te%PmYLLSul3T)*eFb&ZC z=-!}{KLjMu2gZ?5g*|r^^YT-?lS6$>z7KaNpmEO-BGIN#{01e&nWYf*MilOU=ICuG z$5D8?RzcW>x&?ItYW@J!i;c)S-&}{Rtu}uYngqVvQS&bKGW_L_5lPR(dBh(b9>#aX z3>5x|kUt8=)XN=H@c?j6`D0F=3ml)%9HT+y84R5%#ytz;W1R`SOJRNuvW@X<1Pw#Q z4{gkMDHoRoUG+{C`bzZ&_JcH^^^S$ahx~NHmf!&<}p;$tcK$2LALUjbsu7(Gm+W5;KJPLs&FP zgr8r(2mXB~)fB4a3nT(pwIl;LYJzJL$b%Mmo&?en1e^_o-@#NyIs@O0 zKv&*@<@}kyhuV?lHmpy!rYIz%&z zT?^Y2VruL~=>ws_J}0NoGgErgE9{yL3L?5cqeo@4R8F7!3Z)NQ#;*CD;N7M%`htdp zyey|Lc!Q;XfL*iO5|aBWqt6AUb?SnBehW1dD1B~Ac8zaMNZ==o-qZs0ikv<=fzoRp zWLL~@_HjlZ*2eBry8WXS@g=#fnBL`)YH`KL1KhX(Y3@C>>hgu@e3!z+Imlb`SmF8uYRbbEAn_bLIInS%+#@%ONP1b_1b z^H^5Kf7#!Qp%uU5X%8e<>3872E1sfzF(2{#_CVgK-Y;CdyXW#YSDHRh+vFSh_}Jb* zy?e3$q^nQ8xn|LpH{!ndqwTAUhY#u2`k5PsNn_J=iN{kWH)^tf`d2slHno1Rs&~MV zKKEa%e{`Gvp`=+KN4&H6>7z~V(aacge&&@WDW7{BZ}Uv{+D;FSc(dWUrjHDnv;0)& zl3}+791dCk?dxB*-L|d6df(9Pb^B#r-{}AA9~X_go-)oK{Ppu6zILJi)X;t{e=W%J zn(lw;><8!S))`y#i@zqjmn-+F@MB}WuO8|bz%SrTpAF^;<2F8#$%CmG|3_KfLJKv- z_YP}GQ{my!!gH%|4HGZ~RVMrrFSd6P>Ms6-r_a;bJo`UHpMi~t$F;J1Fe^2R!WSi@ z-fhA5sPx`22M^~fdj;qg6Kmy;S{#O^l){VyG=KKozdcKLaArq8%dRDNucg4<_V zE1B)fpX9G%zj=6}@Vu5csqGC!{5hw`t0x+E!qxUJ^;sB?$Di}7Gy9CiVCU*$pS?S& z;G4y}_lAq_W|jTUUpS`6A<1)*(w)18^OhZ0;kTwm&7fz7H1=<@w{zafqFuN4>$bPM z`P-7{p})5Ae|YiW_l|Cu`Ixoe``a?EeQ)lvgREVjatVXNXuIMddD{D zUpDzk+v>ZK=ccvO&mQ*Y!ii&#Y`=8h#)l>+`nCOT&j62|-uM6bYvbaaCf_8iOM3Fj zHlYQRUOe#Cr9Jn~Zdz;Kt`4;y-RAM_+Se~fz4+Y=$9Hcyap3)t6aU<};o%S6$;0i? zsQT=7zSe&~E$TBXw8gOf&yN}vu+O+Y8~P$^nX?s%->~=(B8DglhMib8KxsWFpttUp!8l!SJ8W(p1i$zw17R~&w0N1wW4@x zJoW`teWpr+^b0uCXEvKiN?6YQ{eu52>ucsaoUv*}Ka3LgS-vNUCxnOR3eWK&(s(|C zRG`1ug`OKuWIyn^t9Mzy>O224>j{aO@JepLjz}_2=0B4pM{lc(K7;DR$x#F?PW7nB z7f|(CMZVg9Zyaa(Y;XnaGwwfI*NXLR$iEm5FOWU=k`bbO+8q9HYkL==??gs!`ziOI z*&YZt)kdGmUrhb|ufBk)&;Hft`>%`q|EeKK4vK%Yvwz%>=d{^;naA9<>dzxkM+tn}yz z>C>Q<4X9sE7@k4o&!x1Ld5>d>vW5POir`>*_MHW--`{GppVlz;+oX@C;kh}& zb>1H}Fx_0?%K4#=mr=*da7j|H|M_1a0S$)uZv}Nyi)N_yTbYSF_Ym^2*ZEt5n~{cl z+)Z2CR{F!msWpU$>~--Fg9~d5Sj-Oo1ja(g1HBx}Sqj|7<=Gu8EyrpL4^Mm{rI6hR22!k>OM>Zx&Vc3pWyP?t`ak`ZEPd(Eym!6nxXA3sX(;B) z_kf7yNmhW+0B7(*eDkGI<@ti)r{wh4QVRL~Ob^7m7zcw{;qXSRZ$vDcES`syy@{0) z2`4!g%HiRIQVQ99{7V$;st*%^{UGzDK+k0(gm|4J#Ez`q&~vPI z#E(9x!!EXHcq7L`*=YBJ9f|!9(-4}k60mRZzD2HXM zn9Mf?ti?djv3U9N`59C8wMt{lu}}_^ev?wj?h6LiqnyfLPcPrYH(U(#B9{BQw+$qn zS}053?q_Q+3Swo7{(Zy(dJ(HX)xAWxNTbU0g}T>pTuLFkw|X$FLN+r9byPOcb1V-! z3kl-*(0F0e*v_y_Oq8T#lKatqRQH-#F}eczS_bqS3r5VdBs=1ze16S7B}rO-8`g#D z!;?#f(I@8sYYotgSghQU7|gdOUm9JWFAY3QJuRh>-Dj6{$9$ErZ$!=j)&igxv9M-` zL%6UX>@3G>2f>CjQVQ99;VfEzT{{>^AGAY$0X@g6M|CgE8@LC`7$ISlNI1!{P&VSB zR&aR~)}-I?av4*I9RX`T&~q$84p0zwiMLAAkz--`n)Hv9LUx}WQxm`8g=3rOgYEDQ z=L5Zn#rWm(8PqEz*DiUxAMjKIe?yDlk{)g|Z~k7HxM?iuD+aAY7!e3OWbP5`}_ zFX0=$j%;J{!&8uB1;7LAW&YI3HSZ4%e#48$Sj_q$8+ky_v2I7tW4^Xtb%Mczd?$M% z)>R|Z8%+SK5a>Bp2+=@>YZ4#4z^pszAfwj2w;VUtoRh3r0iWF5r1u%sz{fHvDupy&A_T*14c=QWT*^INj?r9VwI z=r<(3tjMB{3ITc%i`l5;1gi(6QRVqUz0q9IGg3O+eRc>fUnQ%0(;zSShG9T2Vlh4v ze|inG#e*9;RvQSbUxUf5l+Jb^{ZnoHhBxOlra?Y{6$tbqmJs)IOgS*$77uQmVzJs# zN+#Y%M^PPB8d{fz)j%wu7qJ+rXJ=Oa#E6bqo#0_$EropLKjek^DlKCJ@zA!J1oRxs zlZCfQ^bS}fF%4fSl+*H+?Wcg1|4w7f*X4sO znQMTx73dwXXpu14WyS6XL~jj$vl}U3S?AF5b<>AoVV#l-^bT0>JEkGW!uo5C(uAMv zT2%KI`!u9rzd^nVfZhQs&YQiA5=k zW4?-ovivvX%K-Eu)=%v9g^Lo_{fO0G0gFtfW%=@XMuYae3Ft*E7VfpX9;B3ORl@Rz zhe;h2umbnBp!{0JUjJLj*J7ZTV>Q)DQP{nlUx;OWKmp6Q9j(8v3-vPU`E@`q$0E6y zzOqkG0~E76DPR>beR%aet2(|0td&47$MX0XzhU`pSW6cLtiro}@f%*=$ja9-!~%K| z%YE6vvYaE-?{MpQgsr6C@UoHFhd%<=UZ5AT1p839NE49r3;k?cyD8)=?0K56Qo$dU z4_HTmUc@@hk{2#YSQ>bk*Fyn|{Miz}A+MTzLFNm9Uc_Sg_34h^Sh-DvWjVK}0#;EA zX0sja1C($8)?T0&v1ZjoM=!w(u_A@-kblEA@Fcsp0#;Z`! z_bJOE>W$n!3RtEMv|V{Ej_jCSUgAptME%I z8<(&=!*K!f8LcdM@p$b?3Rv0KXt^5(2H1DLg5fD><2r`^MyJ}Gh6|S{7w0FGnBzE(5F}pyya2WC|#hTEqu0Bwh;TP^VxU_V8o{tlWka zt9Uo7ml4Y=PQ)T)K2u)8MG7YWhM2E4@d{Y5uoL};J}f56VFA$deDQDSZ2X2C3(ImU z9TXycBguXKuT(Z{Zeu84*+9>+YLLHJ{lzX;Nlb@th%)b=q>wM)-x!vLrGnou8t6F| zA))MnaA7~#S)MQCSFuh3E1UT@ij9m0WnPmk#ahH32$%A(_NFLc`PQTSx+J{!4Ztb_ zdNE(IEP3IggoXMrN3Vbt&9F*FfgOzp@M}NNb1Z*y3*@i{sf!n)K?>U;|Ar`ssZ$lO z2wQ`uWE4w+>J6Z;2v!gzF*Hp9EAJob(<{Lb00+v(Y@p{@A>;@YJWt{S7msqwrgY1hSzYIXnv3U9N`4!(+x$S^09sg+x`6|q#`jC&QKz*15^di<1 z?CrAUFX?Fa_5_k9846fM9jF|ZEMaM(-iQWz5sSrjM>dcRB^CuNU*^Xq!h54^_-Be( zA>>vqLYfjEypU|WgyeFF^;f}kI}(-wehy@MgZqf^8{$v}@ho43p{(jaIm`!o5o<+#DvNk2$HvC8 z96wtLs|n2)j)lPk`L!76IaUaH86rbniI;NfN|cSD#}%-O{ODSIr9v6RvYZ6;9LrX| z8lY_C!Jl}@zbck5ja30l^ET^i+bE;~`fw7^i&))RWZ@zrIr0nhssLYr^v7!`>LbVIk001PkkwWzQ&J zfjpxfRW^swVENh)^c*XMJWlIMAG{C^dm-U0|AwfeOipYCTcq4Sm~CTaA&8X=^c>5R ze90cLOFsL-&T=el>4ZG1kS}X(ny+h1m}!P(ISJ@FRtR|w992HV2QQ>Z3gw^=+r!h6 z=M=C48Naytxei#GB_h`C$VOklDzvW(?B0#UH=?ppvWf*~{qam<^XH{l8up^XMH*TD z4ZFcZ3&eGKL<_dfD)tQ#Yn=qEKN;T!HG~gdh$c*$jvNd1MyV23AuC_}8=}m2enFZq z_scT&SDs#~lrMXJp=@ZDRSXMt@6i_(un5an$!_*_@EbOHNs1-RjBzqSM*a;^9~vO8 z%cJNgs(ZOOS3VgSiG(zBk8Nyo#grI08f)vDqvYzKP;C+^rb8YdO4OmW6aQh z*!(pmtTWVaQzDGTY6<)r3iKk@A1v~9ylAX&vK{h#p&b>StAw@oKGgFU&NG_BkS{CH zi&!kY?k_($QHc``BNEPXtnLt=v{nJDXj5Cny1bFa zJOo%dKrdnm2~#XzMJ%kp7OzvlDoncvv3T1Y$LVbadJ$_oOJBH1!Q}ZuIgETq0W1Gu zTE0qKu~hIInt;9{SZGK2tyjQ`9!|0L8<{^B%hyn#7qNu6&r5T}?&bMHnJ;`#0n4PL4;8Qq7*@$BMuYy1bwDp-2?M@_3&+N*JYQ(DMekI=%Knt*>q@AQ3dn{P=tV4S zyTTz{*bjD=V|9bz&bt(_NHNv(#e$wke#HZQMX=BhP`X(eB;*sRCB^=agSJgti{~MN5HR{DyT| zhJ_2q#;crPSf}KCrhpZgMzKl+8^9B=_5wY}^5jC{M)^X07`;ycE04{|B34F&SXn^N zu>wG6(1V$(>|Qv_^Mx|+_k{vh;Df9z3u$7V5()Gii|JmdZ?K@s4mlQn!$V&xU}+{( ztYROgdusv~`AUiYVDdrDbSmGi7hUniY z`BnkTdT(=TAD(AvpltYm=ZHm60m%+I7OlU&SHQ|`K=XC!AWNtd*x09mUd-2I_CUBu z;pAAY;bHy{3Rs07)Wv+2#(hGQSq%9)0rVo4Fi=3aC}E+AdEzGpEMI1C@b=dN!16jQ zVucVKgav&ZZj8l3EU%vxunOBS+a{nfedY5YhwXr#=j(Q`u$>ZgQ~}F3gN`vPIM&>T zH3{fB7Pr~l$=Cgmg5fs>tia2SkY9&{IggmHWk4^-B6HE6vOnaqfmmw_6|j8S*tt?8 zU5b++)&Zce2o~!3!s7~9fd}ar7!uED5X&2y$Q8i~04)EL3Ru3M(Xw0;AYzRN`ifwo zf5Y;p0+yA@VR0M~!h!k91$qZ8H|j6M+WD6PR$fSIieFU={Bv&>NG0p69DMLDR;I z)TS0r7~G4891BaRrbr3v8>%-*9y6Ez0jv<9=UBWflY9|_-^sDsz=I|i6|k(iw5}|L zwj>_dHV*-M5esY$JX*1f^eo3hd*i?*1+0P)I?lXwH}<6w@(W;<0KJGM#0_C>TuLOI z&!cJ%pRCDqt1-!^UFy+)Goq z404zQ^dgoJ7sgr04|%?@d@a7_NN0;@s@VqRuw)|(xdK=_fW9JFn6KO$N?3=4`is4# zAJ_o1^)^H}ZV7g|Kxu6|ll?w8ngumQjX~63Ev9pck=(xYr;dFJgtW z?T}+(3Ef+!g!MP&*OgT)3H*k|K<|K+YJ;%d$gyah;vo;UkrNVjh5GcajbddP^@cb2 z;zcZh_B^Cf&iWfTZuyX>0#+f**9E~o+yz+0Krdnm-^7i4p==zjseq*kuZjG+6u|Vu zS-|qD<%m_M1cf7du#ii7k*A6>@9ixQmBa{4p>wjX0UjQg0V@dT9rC52kL^zKRM9jJ ztSb+dM9C#IU$>4i+Xd%4Oagili_y9>ZW-&Zq4gE8@gWth%(4tV?Q8)tqaU#B|W} zZQ$Y2W(ruoyC}ad9&1XI!SVCtJ`u~4bcYOqDB^{LumV>zUrIbv59s>}19}mQrM|Z5Ot{hH zvtR5iPZj&W3fsv;B{A{}I-?vC4GSxVeEGE(vC0U7)FAF+`FBvlx}Ww1+zMd!#&yWo zB%tT{s!4=z$I7Ucy%9UhQ*8sm{tw7QB{AZ)bgbirCCsj^1+p<5=s6bGhwjYRL#!s9 z6tMDd((+Y&j0rWa+YZ6ulYbP$8tw+pszBuw*pq+2mV-= z541W8l+a!QtQ?@1W047vMiVlR5(y`HssRu_yN^6n5~HA)`2lthp@F!D$$FrdW8K{b zWh9qXs6upks%;=VtDihnAjV7KZ**QZ?v0HH+5jtoUc~Cn1W~v!Dt4Bq+8Tl_{pF#O z7^X&44zC^);zPc2fL_F6P+l`6afDlWs@VS(?8JX+i&^*p)rVJBVM!#U4dlxJ^m44a z_fxyrN{NJ%91CSWDO?^Zi4oR@`M%;9jRvr?fnJW~j^74tfJqSwSf&SQy?pr~V|yLI znho?K)*$v`IAlb2$WujrMGlgON+MaGt;gywrZ><(p9=IM7Q=Ao8=}qTJ46ACw5MYa zZU}Pt6<`eodO4QQF~lsAyriRTgZ6x6lmb@KAZj1p@L|b(0azxW7qNuRj)aR8Or9!A zSJE(fs3b43Et=sDKy zte4UOUgW?i1uS1&R2q)x8I&jsu!@1cB3K$orf9SRR{lUQiWS%!5y?NGdws`L3=8#q zNUQ>u@1LF&OIXus2IR{C^cBfhE5J$`r+}56T8m=kKabg>`I-;(6~RI|Tr*w)%l9lD zZ*%eB{S>PM=#2wF&#}18=HtfrdDMqnv7U2vgYp_ec zG#PoS__hZo$wMVE!XBkM>Ov^R{D$Y^6|l$zYGd;;W;mX$iPjN|yoV)~gyD%F@>H>%vLitr z%BkU6R7Cr~E~3D~f$M#p1A2MB>VAaz^QAQWBu^FJ=4g^UlvBese>wF76bp4F_M3a@ z9I@PyL(JD2Tms6~;oGGL>fX}xjNmF@9R_+aUo6}m-&b28-I1z*W!gvA?YZg0+Lb#1 z>nPBRSWGrNKB1Ul44IwfsiGY2ogxpF#0Wc2ZJV+<7Ipxz&H=px7Ji^|#=)ZAC^RTw z4bf=2|}btCassRg|aYQJHl_86srfTmxYToraTAu4ZSnup^_My61omdX&g%u*F6XX zdU?L6%h*>ViRftCplmeBRKN=KW9y|XsZG=Q39!O|UXDd_=(|{@VDeO3!$WUYy-Uf& z`@lhL?b!kr)Cj&|XP|e$I$1}IBizZcP|r7+DG!xIE4)JcQ*MPaIm9(*!hl}H8p4Q$ zizKFl9fkh+$VU~havQL|QK3(>2)>~S=tV5{4({*^^?d4M3RrWUu&LFz$#co5P%2^S?Sl#To+ z6|f4~oZ^dR^=UF_1DpeT5la{VAzYNOG>G-I0#+Vt6O}BfNt2;#5(2%5b%Pe-rZwoN z45LKCNuDaohT$1`s3b;F4eE0!KF?@y+}ARo7qQqUBteomF0iou)ozgjmX+m;`-pHn zb~MmCV7aj_7W%$UELOnE7REYi*vq0F<@>A?ta|LZ^ej&m{Wj~LlZQ%T6s(}*0m|Z- z>4!GQZRX{Xp%H}Q64IZk;~Toz98s%T(5FC z&{q^Ib-4l-`Lzk!hqnTl%~lFnD}i2)MfOVGPq>w*iuLmRm*t_7c)rJ}f8**#7KVC$ zJ%A+Ed2C-HtU`4N>eF1!{4V**QB-atkb2TIcs+FFFlRQUlhhip|tXmarIv8(8fC>*(7GSovpY8loTzBC&Yu(H#r9d-Hq-83ES%N`E& z;x`nMcf${Wa_FC@fK^yZ`@b&vurzV*QZ&$uSgcNQ$G?I4FnF^9mL`$5^{$pNEF8ZP z5A<>@k5=?~KBHo1d8(MN;alaQk{I!OsT`I;{~8`oL%u9P&#`VtHc$?iZBxK1dWPBn zmye;GfgJ?-+5z+;7CO#gU4805i>5UEBu^E~SI!Q3D5r*NA)AND$H8J>c0SN^Ebh~D z$47)VTl9wtSfrHBp}QH%@`YHlf!+b@aXJVlO!Afv<*OGwY`0SZD|?dACSvmTAz)1c zdJ#**j2<8MTnP)?=Fz*9uqII1C|SkoFKp{&0X@e`C7nv~J2t~hIleFahL(H6|mwr({ET3$5O#HOhSNO#6mv7AzauG zc9y4#cJJvg;#{-lUrMpGl-QlN1Fng2_$vjh!jEXa$~M-fY2v(5 zzXKvx2*C|uIudv0>|=k*j;|H43JR$IuyhXlNVq2aX`mOsp&;{zQ1q2$9{E*pPytKR zo0hNQV{K@@(BF&eaXDbQQNHen6i$4rfECz;`o1ofF@0DJSoOcF7*<=rI`_Q-R@mpX zfBA}$m07f-d=E*nSoknEz9Ckpg+C}@<>gTu;EGVbaQq?pQHte0zpyX+z)uQTxmj!- zGXV?pbq?qq_~k~v5NpQ~1+4r64cfgoM*$%m9+0oYKrdpkZ|IJWLYwXIFA7-kM`>BU ziXR&eEMHznMXV4yNW?uG0Q=2%{HlOebcWW;CA(Rbh(3oRpqJ;%oi-8Hl_!oVV3{sZ z{~^g|-wM~CuU{y|!ra0^^><)Cy%$dMR1u3DmxoGXWFKVxu!3(H$BX&{y_l~Pl-Qm9 z^-%Zj|3d*QUQ5^1B?T;BIPazu=tZnh7FoDR-qN8?L46o_N&zeT6Y94q3BXbh_Bik> z9_U3Z_6}Zi(H>E5e__2m>9hitwG-7*H|gF3u(k?dEdY8s7I6cs4PYgmQNo%?`$jLF z$5C5^>;rx+0D3vrm~B|tmGjjOC=BNmu!_8xZ+T+_graLZX9K;6b+j%aun!qt2y;A8 zLO97SRA9*OJhO6)3cBnV5989KxSf^wIy@52cTnc5$V1G&w(95w1tW^whm@mN4i#%1VzsL=Fs3b=I392_rLs_!`=cj0Z zo@03uSlAQ~cFCvr!bzSg`o5anl!r=U#Q#F`bxW9s_&H!j0zJpFwJY7o7izh7WeQk% zEt+Ea;%l^C0<57x?|^la)o+rwbSPigvY6!INN0;v@DK+mx>L<>Swhj_!qD=8aEY=;~R^`W(<0+wkQ zo&QzZiqYWSaBF~`V=+bOo<78SIj6P)R`x5*S9uI|EAwyU1HFjF#Lyjk1IzNtIto}t zS7=+WIFv$>&wyWhfu3XC&Nsw-?Wm`K74|+Ivs5aqfsFQiA<%Oyo6Nt6@8Zi|NI1*+ zg?i)kT?$yatPOif=;OEx_|>F=BbHzTgh|2VSRLS@x32+*Yl{8hrDu|}C!PkPL`*JpO#3BqU43e`Q@_b>R zRA6%jtgtoo8(uxg@`b*XB%tT{szs1du*g$GV+4bZBEocTm9c-Al3f+Ue+Ln+^0FOPD}!y9l3; zUgX~pW#0b*1+2hJ)DLj$ppXh+O#*t31$$*elJFld<>;vXNYP0F%XdG`7tZ^}1APwh zK+myk>t(SnMoPm^@_eCxgLF~A$~{eeDa9LKrb*!b=AD6F#Cnt^t;2Uw*1fHP!b_O5 z#v;kid97%ja&1&U`rtRzhd?i4vHbe1#I}XTF0wpds1HvED {0{e!?SeiKB!MmFj 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/module0.out b/src/processor/testdata/module0.out new file mode 100644 index 0000000..72fb4da --- /dev/null +++ b/src/processor/testdata/module0.out @@ -0,0 +1,22151 @@ +MODULE windows x86 5A9832E5287241C1838ED98914E9B7FF1 test_app.pdb +FILE 1 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winbase.h +FILE 2 c:\program files\microsoft visual studio 8\vc\include\typeinfo +FILE 3 c:\breakpad\trunk\src\common\windows\guid_string.h +FILE 4 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcdce.h +FILE 5 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winreg.h +FILE 6 c:\program files\microsoft visual studio 8\vc\platformsdk\include\objidl.h +FILE 7 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wtypes.h +FILE 8 c:\program files\microsoft visual studio 8\vc\platformsdk\include\tvout.h +FILE 9 c:\program files\microsoft visual studio 8\vc\include\malloc.h +FILE 10 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack2.h +FILE 11 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winuser.h +FILE 12 c:\breakpad\trunk\src\client\windows\handler\exception_handler.cc +FILE 13 c:\program files\microsoft visual studio 8\vc\platformsdk\include\urlmon.h +FILE 14 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wincon.h +FILE 15 c:\program files\microsoft visual studio 8\vc\platformsdk\include\imm.h +FILE 16 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcdcep.h +FILE 17 c:\program files\microsoft visual studio 8\vc\include\xstring +FILE 18 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winver.h +FILE 19 c:\program files\microsoft visual studio 8\vc\include\xmemory +FILE 20 c:\program files\microsoft visual studio 8\vc\include\new +FILE 21 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack4.h +FILE 22 c:\program files\microsoft visual studio 8\vc\platformsdk\include\reason.h +FILE 23 c:\program files\microsoft visual studio 8\vc\include\vector +FILE 24 c:\program files\microsoft visual studio 8\vc\include\memory +FILE 25 c:\program files\microsoft visual studio 8\vc\include\wtime.inl +FILE 26 c:\program files\microsoft visual studio 8\vc\include\iterator +FILE 27 c:\program files\microsoft visual studio 8\vc\platformsdk\include\propidl.h +FILE 28 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack1.h +FILE 29 c:\program files\microsoft visual studio 8\vc\platformsdk\include\specstrings.h +FILE 30 c:\program files\microsoft visual studio 8\vc\platformsdk\include\basetsd.h +FILE 31 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winerror.h +FILE 32 c:\program files\microsoft visual studio 8\vc\include\assert.h +FILE 33 c:\program files\microsoft visual studio 8\vc\platformsdk\include\poppack.h +FILE 34 c:\program files\microsoft visual studio 8\vc\include\cstdio +FILE 35 c:\program files\microsoft visual studio 8\vc\include\stdio.h +FILE 36 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnterr.h +FILE 37 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcasync.h +FILE 38 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnsi.h +FILE 39 c:\program files\microsoft visual studio 8\vc\include\stdlib.h +FILE 40 c:\program files\microsoft visual studio 8\vc\platformsdk\include\servprov.h +FILE 41 c:\program files\microsoft visual studio 8\vc\include\limits.h +FILE 42 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcndr.h +FILE 43 c:\breakpad\trunk\src\client\windows\handler\exception_handler.h +FILE 44 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnsip.h +FILE 45 c:\program files\microsoft visual studio 8\vc\platformsdk\include\dbghelp.h +FILE 46 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnetwk.h +FILE 47 c:\program files\microsoft visual studio 8\vc\include\share.h +FILE 48 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack8.h +FILE 49 c:\program files\microsoft visual studio 8\vc\platformsdk\include\stralign.h +FILE 50 c:\breakpad\trunk\src\google_breakpad\common\minidump_format.h +FILE 51 c:\breakpad\trunk\src\google_breakpad\common\breakpad_types.h +FILE 52 c:\program files\microsoft visual studio 8\vc\include\xdebug +FILE 53 c:\program files\microsoft visual studio 8\vc\include\stdarg.h +FILE 54 c:\program files\microsoft visual studio 8\vc\platformsdk\include\windef.h +FILE 55 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsvc.h +FILE 56 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wingdi.h +FILE 57 c:\program files\microsoft visual studio 8\vc\include\xlocinfo +FILE 58 c:\program files\microsoft visual studio 8\vc\include\xlocinfo.h +FILE 59 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oleidl.h +FILE 60 c:\program files\microsoft visual studio 8\vc\include\locale.h +FILE 61 c:\program files\microsoft visual studio 8\vc\include\string +FILE 62 c:\program files\microsoft visual studio 8\vc\include\istream +FILE 63 c:\breakpad\trunk\src\common\windows\string_utils-inl.h +FILE 64 c:\program files\microsoft visual studio 8\vc\include\ostream +FILE 65 c:\program files\microsoft visual studio 8\vc\include\xutility +FILE 66 c:\program files\microsoft visual studio 8\vc\include\wchar.h +FILE 67 c:\program files\microsoft visual studio 8\vc\include\utility +FILE 68 c:\program files\microsoft visual studio 8\vc\include\ios +FILE 69 c:\program files\microsoft visual studio 8\vc\include\xlocnum +FILE 70 c:\program files\microsoft visual studio 8\vc\include\iosfwd +FILE 71 c:\program files\microsoft visual studio 8\vc\include\swprintf.inl +FILE 72 c:\program files\microsoft visual studio 8\vc\platformsdk\include\guiddef.h +FILE 73 c:\program files\microsoft visual studio 8\vc\include\cwchar +FILE 74 c:\program files\microsoft visual studio 8\vc\include\climits +FILE 75 c:\program files\microsoft visual studio 8\vc\include\crtdbg.h +FILE 76 c:\program files\microsoft visual studio 8\vc\include\cstdlib +FILE 77 c:\program files\microsoft visual studio 8\vc\include\streambuf +FILE 78 c:\program files\microsoft visual studio 8\vc\include\xiosbase +FILE 79 c:\program files\microsoft visual studio 8\vc\include\xlocale +FILE 80 c:\program files\microsoft visual studio 8\vc\include\cstring +FILE 81 c:\program files\microsoft visual studio 8\vc\platformsdk\include\mcx.h +FILE 82 c:\program files\microsoft visual studio 8\vc\include\stdexcept +FILE 83 c:\program files\microsoft visual studio 8\vc\include\exception +FILE 84 c:\program files\microsoft visual studio 8\vc\include\xstddef +FILE 85 c:\program files\microsoft visual studio 8\vc\platformsdk\include\objbase.h +FILE 86 c:\program files\microsoft visual studio 8\vc\include\cstddef +FILE 87 c:\program files\microsoft visual studio 8\vc\platformsdk\include\unknwn.h +FILE 88 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpc.h +FILE 89 c:\program files\microsoft visual studio 8\vc\include\stddef.h +FILE 90 c:\program files\microsoft visual studio 8\vc\include\cassert +FILE 91 c:\program files\microsoft visual studio 8\vc\platformsdk\include\ole2.h +FILE 92 c:\program files\microsoft visual studio 8\vc\platformsdk\include\windows.h +FILE 93 c:\program files\microsoft visual studio 8\vc\include\yvals.h +FILE 94 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oleauto.h +FILE 95 c:\program files\microsoft visual studio 8\vc\include\excpt.h +FILE 96 c:\program files\microsoft visual studio 8\vc\include\use_ansi.h +FILE 97 c:\program files\microsoft visual studio 8\vc\platformsdk\include\cguid.h +FILE 98 c:\program files\microsoft visual studio 8\vc\include\crtdefs.h +FILE 99 c:\program files\microsoft visual studio 8\vc\platformsdk\include\msxml.h +FILE 100 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oaidl.h +FILE 101 c:\program files\microsoft visual studio 8\vc\include\sal.h +FILE 102 c:\program files\microsoft visual studio 8\vc\include\vadefs.h +FILE 103 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h +FILE 104 c:\program files\microsoft visual studio 8\vc\include\ctype.h +FILE 105 c:\program files\microsoft visual studio 8\vc\include\eh.h +FILE 106 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnls.h +FILE 107 c:\program files\microsoft visual studio 8\vc\include\string.h +FILE 108 c:\program files\microsoft visual studio 8\vc\include\ctype.h +FILE 109 c:\program files\microsoft visual studio 8\vc\include\xutility +FILE 110 c:\program files\microsoft visual studio 8\vc\include\utility +FILE 111 c:\program files\microsoft visual studio 8\vc\include\iosfwd +FILE 112 c:\program files\microsoft visual studio 8\vc\include\cwchar +FILE 113 c:\program files\microsoft visual studio 8\vc\include\crtdbg.h +FILE 114 c:\program files\microsoft visual studio 8\vc\include\stdexcept +FILE 115 c:\program files\microsoft visual studio 8\vc\include\exception +FILE 116 c:\program files\microsoft visual studio 8\vc\include\xstddef +FILE 117 c:\program files\microsoft visual studio 8\vc\include\cstddef +FILE 118 c:\program files\microsoft visual studio 8\vc\include\stddef.h +FILE 119 c:\program files\microsoft visual studio 8\vc\include\eh.h +FILE 120 c:\program files\microsoft visual studio 8\vc\include\streambuf +FILE 121 c:\program files\microsoft visual studio 8\vc\include\xiosbase +FILE 122 c:\program files\microsoft visual studio 8\vc\include\xlocale +FILE 123 c:\program files\microsoft visual studio 8\vc\include\cstring +FILE 124 c:\program files\microsoft visual studio 8\vc\include\string.h +FILE 125 c:\program files\microsoft visual studio 8\vc\include\typeinfo +FILE 126 c:\breakpad\trunk\src\common\windows\guid_string.cc +FILE 127 c:\breakpad\trunk\src\common\windows\string_utils-inl.h +FILE 128 c:\program files\microsoft visual studio 8\vc\include\stdarg.h +FILE 129 c:\program files\microsoft visual studio 8\vc\include\string +FILE 130 c:\program files\microsoft visual studio 8\vc\include\istream +FILE 131 c:\program files\microsoft visual studio 8\vc\include\ostream +FILE 132 c:\program files\microsoft visual studio 8\vc\include\ios +FILE 133 c:\program files\microsoft visual studio 8\vc\include\xlocnum +FILE 134 c:\program files\microsoft visual studio 8\vc\include\climits +FILE 135 c:\program files\microsoft visual studio 8\vc\include\yvals.h +FILE 136 c:\program files\microsoft visual studio 8\vc\include\use_ansi.h +FILE 137 c:\program files\microsoft visual studio 8\vc\include\cstdlib +FILE 138 c:\program files\microsoft visual studio 8\vc\include\stdlib.h +FILE 139 c:\program files\microsoft visual studio 8\vc\include\malloc.h +FILE 140 c:\breakpad\trunk\src\common\windows\guid_string.h +FILE 141 c:\program files\microsoft visual studio 8\vc\platformsdk\include\guiddef.h +FILE 142 c:\program files\microsoft visual studio 8\vc\include\share.h +FILE 143 c:\program files\microsoft visual studio 8\vc\include\xstring +FILE 144 c:\program files\microsoft visual studio 8\vc\include\xmemory +FILE 145 c:\program files\microsoft visual studio 8\vc\include\new +FILE 146 c:\program files\microsoft visual studio 8\vc\include\locale.h +FILE 147 c:\program files\microsoft visual studio 8\vc\include\swprintf.inl +FILE 148 c:\program files\microsoft visual studio 8\vc\include\limits.h +FILE 149 c:\program files\microsoft visual studio 8\vc\include\wchar.h +FILE 150 c:\program files\microsoft visual studio 8\vc\include\cstdio +FILE 151 c:\program files\microsoft visual studio 8\vc\include\crtdefs.h +FILE 152 c:\program files\microsoft visual studio 8\vc\include\stdio.h +FILE 153 c:\program files\microsoft visual studio 8\vc\include\wtime.inl +FILE 154 c:\program files\microsoft visual studio 8\vc\include\sal.h +FILE 155 c:\program files\microsoft visual studio 8\vc\include\xdebug +FILE 156 c:\program files\microsoft visual studio 8\vc\include\vadefs.h +FILE 157 c:\program files\microsoft visual studio 8\vc\include\xlocinfo +FILE 158 c:\program files\microsoft visual studio 8\vc\include\xlocinfo.h +FILE 159 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnetwk.h +FILE 160 c:\program files\microsoft visual studio 8\vc\platformsdk\include\urlmon.h +FILE 161 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack8.h +FILE 162 c:\program files\microsoft visual studio 8\vc\platformsdk\include\cderr.h +FILE 163 c:\program files\microsoft visual studio 8\vc\platformsdk\include\shellapi.h +FILE 164 c:\program files\microsoft visual studio 8\vc\platformsdk\include\dde.h +FILE 165 c:\program files\microsoft visual studio 8\vc\include\vector +FILE 166 c:\program files\microsoft visual studio 8\vc\include\stdio.h +FILE 167 c:\program files\microsoft visual studio 8\vc\include\memory +FILE 168 c:\program files\microsoft visual studio 8\vc\include\iterator +FILE 169 c:\program files\microsoft visual studio 8\vc\include\malloc.h +FILE 170 c:\program files\microsoft visual studio 8\vc\include\stdarg.h +FILE 171 c:\program files\microsoft visual studio 8\vc\platformsdk\include\windef.h +FILE 172 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wingdi.h +FILE 173 c:\program files\microsoft visual studio 8\vc\platformsdk\include\imm.h +FILE 174 c:\program files\microsoft visual studio 8\vc\platformsdk\include\mmsystem.h +FILE 175 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winioctl.h +FILE 176 c:\program files\microsoft visual studio 8\vc\platformsdk\include\guiddef.h +FILE 177 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsmcrd.h +FILE 178 c:\test_app.cc +FILE 179 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oaidl.h +FILE 180 c:\program files\microsoft visual studio 8\vc\platformsdk\include\nb30.h +FILE 181 c:\program files\microsoft visual studio 8\vc\include\xstring +FILE 182 c:\program files\microsoft visual studio 8\vc\include\xmemory +FILE 183 c:\program files\microsoft visual studio 8\vc\include\new +FILE 184 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oleidl.h +FILE 185 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnls.h +FILE 186 c:\breakpad\trunk\src\google_breakpad\common\minidump_format.h +FILE 187 c:\program files\microsoft visual studio 8\vc\include\string.h +FILE 188 c:\breakpad\trunk\src\google_breakpad\common\breakpad_types.h +FILE 189 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h +FILE 190 c:\program files\microsoft visual studio 8\vc\include\ctype.h +FILE 191 c:\program files\microsoft visual studio 8\vc\include\wtime.inl +FILE 192 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winbase.h +FILE 193 c:\program files\microsoft visual studio 8\vc\platformsdk\include\propidl.h +FILE 194 c:\breakpad\trunk\src\client\windows\handler\exception_handler.h +FILE 195 c:\program files\microsoft visual studio 8\vc\include\stdlib.h +FILE 196 c:\program files\microsoft visual studio 8\vc\include\swprintf.inl +FILE 197 c:\program files\microsoft visual studio 8\vc\include\limits.h +FILE 198 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winreg.h +FILE 199 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpc.h +FILE 200 c:\program files\microsoft visual studio 8\vc\platformsdk\include\ole2.h +FILE 201 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winscard.h +FILE 202 c:\program files\microsoft visual studio 8\vc\platformsdk\include\objbase.h +FILE 203 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wtypes.h +FILE 204 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcndr.h +FILE 205 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcdce.h +FILE 206 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnsip.h +FILE 207 c:\program files\microsoft visual studio 8\vc\include\share.h +FILE 208 c:\program files\microsoft visual studio 8\vc\platformsdk\include\tvout.h +FILE 209 c:\program files\microsoft visual studio 8\vc\include\use_ansi.h +FILE 210 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winefs.h +FILE 211 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack2.h +FILE 212 c:\program files\microsoft visual studio 8\vc\platformsdk\include\commdlg.h +FILE 213 c:\program files\microsoft visual studio 8\vc\platformsdk\include\unknwn.h +FILE 214 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h +FILE 215 c:\program files\microsoft visual studio 8\vc\platformsdk\include\stralign.h +FILE 216 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winuser.h +FILE 217 c:\program files\microsoft visual studio 8\vc\platformsdk\include\servprov.h +FILE 218 c:\program files\microsoft visual studio 8\vc\include\xdebug +FILE 219 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsvc.h +FILE 220 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wincon.h +FILE 221 c:\program files\microsoft visual studio 8\vc\include\xlocinfo +FILE 222 c:\program files\microsoft visual studio 8\vc\include\xlocinfo.h +FILE 223 c:\program files\microsoft visual studio 8\vc\include\locale.h +FILE 224 c:\program files\microsoft visual studio 8\vc\platformsdk\include\cguid.h +FILE 225 c:\program files\microsoft visual studio 8\vc\include\string +FILE 226 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winver.h +FILE 227 c:\program files\microsoft visual studio 8\vc\include\istream +FILE 228 c:\program files\microsoft visual studio 8\vc\include\ostream +FILE 229 c:\program files\microsoft visual studio 8\vc\include\xutility +FILE 230 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winperf.h +FILE 231 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack4.h +FILE 232 c:\program files\microsoft visual studio 8\vc\include\utility +FILE 233 c:\program files\microsoft visual studio 8\vc\include\ios +FILE 234 c:\program files\microsoft visual studio 8\vc\include\xlocnum +FILE 235 c:\program files\microsoft visual studio 8\vc\include\crtdbg.h +FILE 236 c:\program files\microsoft visual studio 8\vc\include\iosfwd +FILE 237 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcdcep.h +FILE 238 c:\program files\microsoft visual studio 8\vc\include\cwchar +FILE 239 c:\program files\microsoft visual studio 8\vc\include\climits +FILE 240 c:\program files\microsoft visual studio 8\vc\include\wchar.h +FILE 241 c:\program files\microsoft visual studio 8\vc\include\cstdlib +FILE 242 c:\program files\microsoft visual studio 8\vc\platformsdk\include\mcx.h +FILE 243 c:\program files\microsoft visual studio 8\vc\include\streambuf +FILE 244 c:\program files\microsoft visual studio 8\vc\include\xiosbase +FILE 245 c:\program files\microsoft visual studio 8\vc\platformsdk\include\reason.h +FILE 246 c:\program files\microsoft visual studio 8\vc\include\xlocale +FILE 247 c:\program files\microsoft visual studio 8\vc\platformsdk\include\dlgs.h +FILE 248 c:\program files\microsoft visual studio 8\vc\include\cstring +FILE 249 c:\program files\microsoft visual studio 8\vc\include\stdexcept +FILE 250 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack1.h +FILE 251 c:\program files\microsoft visual studio 8\vc\include\exception +FILE 252 c:\program files\microsoft visual studio 8\vc\include\xstddef +FILE 253 c:\program files\microsoft visual studio 8\vc\platformsdk\include\specstrings.h +FILE 254 c:\program files\microsoft visual studio 8\vc\include\cstddef +FILE 255 c:\program files\microsoft visual studio 8\vc\platformsdk\include\basetsd.h +FILE 256 c:\program files\microsoft visual studio 8\vc\include\stddef.h +FILE 257 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winerror.h +FILE 258 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wincrypt.h +FILE 259 c:\program files\microsoft visual studio 8\vc\platformsdk\include\poppack.h +FILE 260 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winspool.h +FILE 261 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oleauto.h +FILE 262 c:\program files\microsoft visual studio 8\vc\platformsdk\include\prsht.h +FILE 263 c:\program files\microsoft visual studio 8\vc\platformsdk\include\objidl.h +FILE 264 c:\program files\microsoft visual studio 8\vc\include\cstdio +FILE 265 c:\program files\microsoft visual studio 8\vc\include\yvals.h +FILE 266 c:\program files\microsoft visual studio 8\vc\include\eh.h +FILE 267 c:\program files\microsoft visual studio 8\vc\platformsdk\include\lzexpand.h +FILE 268 c:\program files\microsoft visual studio 8\vc\platformsdk\include\ddeml.h +FILE 269 c:\program files\microsoft visual studio 8\vc\include\crtdefs.h +FILE 270 c:\program files\microsoft visual studio 8\vc\include\sal.h +FILE 271 c:\program files\microsoft visual studio 8\vc\include\vadefs.h +FILE 272 c:\program files\microsoft visual studio 8\vc\platformsdk\include\dbghelp.h +FILE 273 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnterr.h +FILE 274 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcasync.h +FILE 275 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnsi.h +FILE 276 c:\program files\microsoft visual studio 8\vc\include\typeinfo +FILE 277 c:\program files\microsoft visual studio 8\vc\platformsdk\include\windows.h +FILE 278 c:\program files\microsoft visual studio 8\vc\include\excpt.h +FILE 279 c:\program files\microsoft visual studio 8\vc\platformsdk\include\msxml.h +FILE 280 f:\sp\vctools\crt_bld\self_x86\crt\src\xdebug +FILE 281 f:\sp\vctools\crt_bld\self_x86\crt\src\streambuf +FILE 282 f:\sp\vctools\crt_bld\self_x86\crt\src\xiosbase +FILE 283 f:\sp\vctools\crt_bld\self_x86\crt\src\xlocale +FILE 284 f:\sp\vctools\crt_bld\self_x86\crt\src\cstring +FILE 285 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 286 f:\sp\vctools\crt_bld\self_x86\crt\src\xlocinfo +FILE 287 f:\sp\vctools\crt_bld\self_x86\crt\src\xlocinfo.h +FILE 288 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 289 f:\sp\vctools\crt_bld\self_x86\crt\src\share.h +FILE 290 f:\sp\vctools\crt_bld\self_x86\crt\src\use_ansi.h +FILE 291 f:\sp\vctools\crt_bld\self_x86\crt\src\string.cpp +FILE 292 f:\sp\vctools\crt_bld\self_x86\crt\src\typeinfo +FILE 293 f:\sp\vctools\crt_bld\self_x86\crt\src\xutility +FILE 294 f:\sp\vctools\crt_bld\self_x86\crt\src\utility +FILE 295 f:\sp\vctools\crt_bld\self_x86\crt\src\iosfwd +FILE 296 f:\sp\vctools\crt_bld\self_x86\crt\src\cwchar +FILE 297 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 298 f:\sp\vctools\crt_bld\self_x86\crt\src\stdexcept +FILE 299 f:\sp\vctools\crt_bld\self_x86\crt\src\exception +FILE 300 f:\sp\vctools\crt_bld\self_x86\crt\src\xstddef +FILE 301 f:\sp\vctools\crt_bld\self_x86\crt\src\cstddef +FILE 302 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 303 f:\sp\vctools\crt_bld\self_x86\crt\src\istream +FILE 304 f:\sp\vctools\crt_bld\self_x86\crt\src\ostream +FILE 305 f:\sp\vctools\crt_bld\self_x86\crt\src\ios +FILE 306 f:\sp\vctools\crt_bld\self_x86\crt\src\xlocnum +FILE 307 f:\sp\vctools\crt_bld\self_x86\crt\src\eh.h +FILE 308 f:\sp\vctools\crt_bld\self_x86\crt\src\cstdlib +FILE 309 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 310 f:\sp\vctools\crt_bld\self_x86\crt\src\climits +FILE 311 f:\sp\vctools\crt_bld\self_x86\crt\src\yvals.h +FILE 312 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 313 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 314 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 315 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 316 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 317 f:\sp\vctools\crt_bld\self_x86\crt\src\cstdio +FILE 318 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 319 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 320 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 321 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 322 f:\sp\public\sdk\inc\ddbanned.h +FILE 323 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 324 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 325 f:\sp\vctools\crt_bld\self_x86\crt\src\xstring +FILE 326 f:\sp\vctools\crt_bld\self_x86\crt\src\xmemory +FILE 327 f:\sp\vctools\crt_bld\self_x86\crt\src\new +FILE 328 f:\sp\public\sdk\inc\reason.h +FILE 329 f:\sp\public\sdk\inc\wincon.h +FILE 330 f:\sp\public\sdk\inc\pshpack2.h +FILE 331 f:\sp\public\sdk\inc\mcx.h +FILE 332 f:\sp\public\sdk\inc\winuser.h +FILE 333 f:\sp\public\sdk\inc\winnls.h +FILE 334 f:\sp\public\sdk\inc\guiddef.h +FILE 335 f:\sp\public\sdk\inc\specstrings.h +FILE 336 f:\sp\public\sdk\inc\basetsd.h +FILE 337 f:\sp\public\sdk\inc\stralign.h +FILE 338 f:\sp\public\sdk\inc\tvout.h +FILE 339 f:\sp\public\sdk\inc\winsvc.h +FILE 340 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 341 f:\sp\public\sdk\inc\wingdi.h +FILE 342 f:\sp\public\sdk\inc\pshpack4.h +FILE 343 f:\sp\public\sdk\inc\poppack.h +FILE 344 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 345 f:\sp\public\sdk\inc\winnetwk.h +FILE 346 f:\sp\public\sdk\inc\imm.h +FILE 347 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 348 f:\sp\public\sdk\inc\windef.h +FILE 349 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 350 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\tran\i386\cpu_disp.c +FILE 351 f:\sp\public\sdk\inc\pshpack1.h +FILE 352 f:\sp\public\sdk\inc\winver.h +FILE 353 f:\sp\public\sdk\inc\windows.h +FILE 354 f:\sp\public\sdk\inc\winnt.h +FILE 355 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 356 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 357 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 358 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 359 f:\sp\public\sdk\inc\ddbanned.h +FILE 360 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 361 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 362 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 363 f:\sp\public\sdk\inc\winreg.h +FILE 364 f:\sp\public\sdk\inc\winbase.h +FILE 365 f:\sp\public\sdk\inc\winerror.h +FILE 366 f:\sp\public\sdk\inc\pshpack8.h +FILE 367 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 368 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 369 f:\sp\public\sdk\inc\reason.h +FILE 370 f:\sp\public\sdk\inc\wincon.h +FILE 371 f:\sp\public\sdk\inc\pshpack2.h +FILE 372 f:\sp\public\sdk\inc\mcx.h +FILE 373 f:\sp\public\sdk\inc\winuser.h +FILE 374 f:\sp\public\sdk\inc\winnls.h +FILE 375 f:\sp\public\sdk\inc\guiddef.h +FILE 376 f:\sp\public\sdk\inc\specstrings.h +FILE 377 f:\sp\public\sdk\inc\basetsd.h +FILE 378 f:\sp\public\sdk\inc\stralign.h +FILE 379 f:\sp\public\sdk\inc\tvout.h +FILE 380 f:\sp\public\sdk\inc\winsvc.h +FILE 381 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 382 f:\sp\public\sdk\inc\wingdi.h +FILE 383 f:\sp\public\sdk\inc\pshpack4.h +FILE 384 f:\sp\public\sdk\inc\poppack.h +FILE 385 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 386 f:\sp\public\sdk\inc\winnetwk.h +FILE 387 f:\sp\public\sdk\inc\imm.h +FILE 388 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 389 f:\sp\public\sdk\inc\windef.h +FILE 390 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 391 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\tran\i386\mathfcns.c +FILE 392 f:\sp\public\sdk\inc\pshpack1.h +FILE 393 f:\sp\public\sdk\inc\winver.h +FILE 394 f:\sp\public\sdk\inc\windows.h +FILE 395 f:\sp\public\sdk\inc\winnt.h +FILE 396 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 397 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 398 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 399 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 400 f:\sp\public\sdk\inc\ddbanned.h +FILE 401 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 402 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 403 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 404 f:\sp\public\sdk\inc\winreg.h +FILE 405 f:\sp\public\sdk\inc\winbase.h +FILE 406 f:\sp\public\sdk\inc\winerror.h +FILE 407 f:\sp\public\sdk\inc\pshpack8.h +FILE 408 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 409 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 410 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 411 f:\sp\public\sdk\inc\winreg.h +FILE 412 f:\sp\public\sdk\inc\winbase.h +FILE 413 f:\sp\public\sdk\inc\winerror.h +FILE 414 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 415 f:\sp\public\sdk\inc\windef.h +FILE 416 f:\sp\vctools\crt_bld\self_x86\crt\src\ctime.h +FILE 417 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 418 f:\sp\vctools\crt_bld\self_x86\crt\src\time.h +FILE 419 f:\sp\public\sdk\inc\pshpack8.h +FILE 420 f:\sp\public\sdk\inc\reason.h +FILE 421 f:\sp\public\sdk\inc\wincon.h +FILE 422 f:\sp\vctools\crt_bld\self_x86\crt\src\time.inl +FILE 423 f:\sp\public\sdk\inc\pshpack2.h +FILE 424 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 425 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 426 f:\sp\public\sdk\inc\mcx.h +FILE 427 f:\sp\public\sdk\inc\winuser.h +FILE 428 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 429 f:\sp\public\sdk\inc\winnls.h +FILE 430 f:\sp\public\sdk\inc\guiddef.h +FILE 431 f:\sp\public\sdk\inc\stralign.h +FILE 432 f:\sp\public\sdk\inc\winnt.h +FILE 433 f:\sp\public\sdk\inc\specstrings.h +FILE 434 f:\sp\public\sdk\inc\basetsd.h +FILE 435 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 436 f:\sp\public\sdk\inc\tvout.h +FILE 437 f:\sp\public\sdk\inc\winsvc.h +FILE 438 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 439 f:\sp\public\sdk\inc\wingdi.h +FILE 440 f:\sp\vctools\crt_bld\self_x86\crt\src\tzset.c +FILE 441 f:\sp\public\sdk\inc\pshpack4.h +FILE 442 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 443 f:\sp\public\sdk\inc\poppack.h +FILE 444 f:\sp\public\sdk\inc\winnetwk.h +FILE 445 f:\sp\public\sdk\inc\imm.h +FILE 446 f:\sp\public\sdk\inc\ddbanned.h +FILE 447 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 448 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 449 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 450 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 451 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 452 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 453 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 454 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 455 f:\sp\public\sdk\inc\windows.h +FILE 456 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 457 f:\sp\public\sdk\inc\pshpack1.h +FILE 458 f:\sp\public\sdk\inc\winver.h +FILE 459 f:\sp\vctools\crt_bld\self_x86\crt\src\time.inl +FILE 460 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 461 f:\sp\public\sdk\inc\winnt.h +FILE 462 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 463 f:\sp\public\sdk\inc\winreg.h +FILE 464 f:\sp\public\sdk\inc\winbase.h +FILE 465 f:\sp\public\sdk\inc\winerror.h +FILE 466 f:\sp\public\sdk\inc\pshpack8.h +FILE 467 f:\sp\public\sdk\inc\reason.h +FILE 468 f:\sp\public\sdk\inc\wincon.h +FILE 469 f:\sp\public\sdk\inc\pshpack2.h +FILE 470 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 471 f:\sp\public\sdk\inc\mcx.h +FILE 472 f:\sp\public\sdk\inc\winuser.h +FILE 473 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 474 f:\sp\public\sdk\inc\winnls.h +FILE 475 f:\sp\public\sdk\inc\guiddef.h +FILE 476 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 477 f:\sp\public\sdk\inc\stralign.h +FILE 478 f:\sp\public\sdk\inc\specstrings.h +FILE 479 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 480 f:\sp\public\sdk\inc\basetsd.h +FILE 481 f:\sp\public\sdk\inc\windows.h +FILE 482 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 483 f:\sp\public\sdk\inc\tvout.h +FILE 484 f:\sp\public\sdk\inc\winsvc.h +FILE 485 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 486 f:\sp\public\sdk\inc\wingdi.h +FILE 487 f:\sp\vctools\crt_bld\self_x86\crt\src\timeset.c +FILE 488 f:\sp\public\sdk\inc\pshpack4.h +FILE 489 f:\sp\public\sdk\inc\poppack.h +FILE 490 f:\sp\public\sdk\inc\winnetwk.h +FILE 491 f:\sp\public\sdk\inc\imm.h +FILE 492 f:\sp\public\sdk\inc\ddbanned.h +FILE 493 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 494 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 495 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 496 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 497 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 498 f:\sp\public\sdk\inc\windef.h +FILE 499 f:\sp\public\sdk\inc\pshpack1.h +FILE 500 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 501 f:\sp\vctools\crt_bld\self_x86\crt\src\time.h +FILE 502 f:\sp\public\sdk\inc\winver.h +FILE 503 f:\sp\public\sdk\inc\wincon.h +FILE 504 f:\sp\vctools\crt_bld\self_x86\crt\src\time.h +FILE 505 f:\sp\public\sdk\inc\imm.h +FILE 506 f:\sp\public\sdk\inc\winbase.h +FILE 507 f:\sp\public\sdk\inc\wingdi.h +FILE 508 f:\sp\public\sdk\inc\winver.h +FILE 509 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 510 f:\sp\public\sdk\inc\windows.h +FILE 511 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 512 f:\sp\public\sdk\inc\pshpack2.h +FILE 513 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 514 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 515 f:\sp\public\sdk\inc\reason.h +FILE 516 f:\sp\vctools\crt_bld\self_x86\crt\src\strftime.c +FILE 517 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 518 f:\sp\public\sdk\inc\specstrings.h +FILE 519 f:\sp\public\sdk\inc\basetsd.h +FILE 520 f:\sp\public\sdk\inc\pshpack4.h +FILE 521 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 522 f:\sp\public\sdk\inc\winnetwk.h +FILE 523 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 524 f:\sp\public\sdk\inc\stralign.h +FILE 525 f:\sp\vctools\crt_bld\self_x86\crt\src\time.inl +FILE 526 f:\sp\public\sdk\inc\poppack.h +FILE 527 f:\sp\public\sdk\inc\winsvc.h +FILE 528 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 529 f:\sp\public\sdk\inc\windef.h +FILE 530 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 531 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 532 f:\sp\public\sdk\inc\winuser.h +FILE 533 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 534 f:\sp\public\sdk\inc\mcx.h +FILE 535 f:\sp\public\sdk\inc\pshpack8.h +FILE 536 f:\sp\public\sdk\inc\guiddef.h +FILE 537 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 538 f:\sp\public\sdk\inc\winnt.h +FILE 539 f:\sp\public\sdk\inc\winnls.h +FILE 540 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 541 f:\sp\public\sdk\inc\pshpack1.h +FILE 542 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 543 f:\sp\public\sdk\inc\winerror.h +FILE 544 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 545 f:\sp\public\sdk\inc\winreg.h +FILE 546 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 547 f:\sp\public\sdk\inc\ddbanned.h +FILE 548 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 549 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 550 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 551 f:\sp\public\sdk\inc\tvout.h +FILE 552 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 553 f:\sp\public\sdk\inc\poppack.h +FILE 554 f:\sp\public\sdk\inc\winnetwk.h +FILE 555 f:\sp\public\sdk\inc\imm.h +FILE 556 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 557 f:\sp\public\sdk\inc\windef.h +FILE 558 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 559 f:\sp\public\sdk\inc\pshpack1.h +FILE 560 f:\sp\public\sdk\inc\winver.h +FILE 561 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 562 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 563 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 564 f:\sp\public\sdk\inc\winnt.h +FILE 565 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 566 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 567 f:\sp\public\sdk\inc\winreg.h +FILE 568 f:\sp\vctools\crt_bld\self_x86\crt\src\days.c +FILE 569 f:\sp\public\sdk\inc\winbase.h +FILE 570 f:\sp\public\sdk\inc\winerror.h +FILE 571 f:\sp\public\sdk\inc\pshpack8.h +FILE 572 f:\sp\public\sdk\inc\reason.h +FILE 573 f:\sp\public\sdk\inc\wincon.h +FILE 574 f:\sp\public\sdk\inc\ddbanned.h +FILE 575 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 576 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 577 f:\sp\public\sdk\inc\pshpack2.h +FILE 578 f:\sp\public\sdk\inc\mcx.h +FILE 579 f:\sp\public\sdk\inc\winuser.h +FILE 580 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 581 f:\sp\public\sdk\inc\winnls.h +FILE 582 f:\sp\public\sdk\inc\guiddef.h +FILE 583 f:\sp\public\sdk\inc\windows.h +FILE 584 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 585 f:\sp\public\sdk\inc\specstrings.h +FILE 586 f:\sp\public\sdk\inc\basetsd.h +FILE 587 f:\sp\public\sdk\inc\stralign.h +FILE 588 f:\sp\public\sdk\inc\tvout.h +FILE 589 f:\sp\public\sdk\inc\winsvc.h +FILE 590 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 591 f:\sp\public\sdk\inc\wingdi.h +FILE 592 f:\sp\public\sdk\inc\pshpack4.h +FILE 593 f:\sp\public\sdk\inc\wincon.h +FILE 594 f:\sp\public\sdk\inc\imm.h +FILE 595 f:\sp\public\sdk\inc\winbase.h +FILE 596 f:\sp\public\sdk\inc\wingdi.h +FILE 597 f:\sp\public\sdk\inc\winver.h +FILE 598 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 599 f:\sp\public\sdk\inc\windows.h +FILE 600 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 601 f:\sp\public\sdk\inc\pshpack2.h +FILE 602 f:\sp\public\sdk\inc\reason.h +FILE 603 f:\sp\vctools\crt_bld\self_x86\crt\src\strnicol.c +FILE 604 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 605 f:\sp\public\sdk\inc\specstrings.h +FILE 606 f:\sp\public\sdk\inc\basetsd.h +FILE 607 f:\sp\public\sdk\inc\pshpack4.h +FILE 608 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 609 f:\sp\public\sdk\inc\winnetwk.h +FILE 610 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 611 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 612 f:\sp\public\sdk\inc\stralign.h +FILE 613 f:\sp\public\sdk\inc\poppack.h +FILE 614 f:\sp\public\sdk\inc\winsvc.h +FILE 615 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 616 f:\sp\public\sdk\inc\windef.h +FILE 617 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 618 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 619 f:\sp\public\sdk\inc\winuser.h +FILE 620 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 621 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 622 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 623 f:\sp\public\sdk\inc\mcx.h +FILE 624 f:\sp\public\sdk\inc\pshpack8.h +FILE 625 f:\sp\public\sdk\inc\guiddef.h +FILE 626 f:\sp\public\sdk\inc\winnt.h +FILE 627 f:\sp\public\sdk\inc\winnls.h +FILE 628 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 629 f:\sp\public\sdk\inc\pshpack1.h +FILE 630 f:\sp\public\sdk\inc\winerror.h +FILE 631 f:\sp\public\sdk\inc\winreg.h +FILE 632 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 633 f:\sp\public\sdk\inc\ddbanned.h +FILE 634 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 635 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 636 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 637 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 638 f:\sp\public\sdk\inc\tvout.h +FILE 639 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 640 f:\sp\public\sdk\inc\mcx.h +FILE 641 f:\sp\public\sdk\inc\pshpack8.h +FILE 642 f:\sp\public\sdk\inc\winnt.h +FILE 643 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 644 f:\sp\public\sdk\inc\specstrings.h +FILE 645 f:\sp\public\sdk\inc\basetsd.h +FILE 646 f:\sp\public\sdk\inc\winnls.h +FILE 647 f:\sp\public\sdk\inc\pshpack1.h +FILE 648 f:\sp\public\sdk\inc\winerror.h +FILE 649 f:\sp\public\sdk\inc\winreg.h +FILE 650 f:\sp\vctools\crt_bld\self_x86\crt\src\strnicmp.c +FILE 651 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 652 f:\sp\public\sdk\inc\tvout.h +FILE 653 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 654 f:\sp\public\sdk\inc\wincon.h +FILE 655 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 656 f:\sp\public\sdk\inc\imm.h +FILE 657 f:\sp\public\sdk\inc\guiddef.h +FILE 658 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 659 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 660 f:\sp\public\sdk\inc\winbase.h +FILE 661 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 662 f:\sp\public\sdk\inc\wingdi.h +FILE 663 f:\sp\public\sdk\inc\windows.h +FILE 664 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 665 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 666 f:\sp\public\sdk\inc\winver.h +FILE 667 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 668 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 669 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 670 f:\sp\public\sdk\inc\pshpack2.h +FILE 671 f:\sp\public\sdk\inc\reason.h +FILE 672 f:\sp\public\sdk\inc\pshpack4.h +FILE 673 f:\sp\public\sdk\inc\winnetwk.h +FILE 674 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 675 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 676 f:\sp\public\sdk\inc\stralign.h +FILE 677 f:\sp\public\sdk\inc\windef.h +FILE 678 f:\sp\public\sdk\inc\poppack.h +FILE 679 f:\sp\public\sdk\inc\winsvc.h +FILE 680 f:\sp\public\sdk\inc\ddbanned.h +FILE 681 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 682 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 683 f:\sp\public\sdk\inc\winuser.h +FILE 684 f:\sp\public\sdk\inc\mcx.h +FILE 685 f:\sp\public\sdk\inc\pshpack8.h +FILE 686 f:\sp\public\sdk\inc\winnt.h +FILE 687 f:\sp\public\sdk\inc\specstrings.h +FILE 688 f:\sp\public\sdk\inc\basetsd.h +FILE 689 f:\sp\public\sdk\inc\winnls.h +FILE 690 f:\sp\public\sdk\inc\pshpack1.h +FILE 691 f:\sp\public\sdk\inc\winerror.h +FILE 692 f:\sp\public\sdk\inc\winreg.h +FILE 693 f:\sp\vctools\crt_bld\self_x86\crt\src\stricmp.c +FILE 694 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 695 f:\sp\public\sdk\inc\tvout.h +FILE 696 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 697 f:\sp\public\sdk\inc\wincon.h +FILE 698 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 699 f:\sp\public\sdk\inc\imm.h +FILE 700 f:\sp\public\sdk\inc\guiddef.h +FILE 701 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 702 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 703 f:\sp\public\sdk\inc\winbase.h +FILE 704 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 705 f:\sp\public\sdk\inc\wingdi.h +FILE 706 f:\sp\public\sdk\inc\windows.h +FILE 707 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 708 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 709 f:\sp\public\sdk\inc\winver.h +FILE 710 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 711 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 712 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 713 f:\sp\public\sdk\inc\pshpack2.h +FILE 714 f:\sp\public\sdk\inc\reason.h +FILE 715 f:\sp\public\sdk\inc\pshpack4.h +FILE 716 f:\sp\public\sdk\inc\winnetwk.h +FILE 717 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 718 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 719 f:\sp\public\sdk\inc\stralign.h +FILE 720 f:\sp\public\sdk\inc\windef.h +FILE 721 f:\sp\public\sdk\inc\poppack.h +FILE 722 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 723 f:\sp\public\sdk\inc\winsvc.h +FILE 724 f:\sp\public\sdk\inc\ddbanned.h +FILE 725 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 726 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 727 f:\sp\public\sdk\inc\winuser.h +FILE 728 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 729 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 730 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 731 f:\sp\vctools\crt_bld\self_x86\crt\src\wcslen.c +FILE 732 f:\sp\public\sdk\inc\ddbanned.h +FILE 733 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 734 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 735 f:\sp\public\sdk\inc\winnt.h +FILE 736 f:\sp\public\sdk\inc\pshpack4.h +FILE 737 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 738 f:\sp\public\sdk\inc\poppack.h +FILE 739 f:\sp\vctools\crt_bld\self_x86\crt\src\tcsncpy_s.inl +FILE 740 f:\sp\public\sdk\inc\winnetwk.h +FILE 741 f:\sp\public\sdk\inc\imm.h +FILE 742 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 743 f:\sp\public\sdk\inc\pshpack1.h +FILE 744 f:\sp\public\sdk\inc\winver.h +FILE 745 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 746 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 747 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 748 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 749 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 750 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 751 f:\sp\public\sdk\inc\guiddef.h +FILE 752 f:\sp\public\sdk\inc\windows.h +FILE 753 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 754 f:\sp\public\sdk\inc\specstrings.h +FILE 755 f:\sp\public\sdk\inc\basetsd.h +FILE 756 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 757 f:\sp\public\sdk\inc\winreg.h +FILE 758 f:\sp\vctools\crt_bld\self_x86\crt\src\strncpy_s.c +FILE 759 f:\sp\public\sdk\inc\winbase.h +FILE 760 f:\sp\public\sdk\inc\winerror.h +FILE 761 f:\sp\public\sdk\inc\pshpack8.h +FILE 762 f:\sp\public\sdk\inc\reason.h +FILE 763 f:\sp\public\sdk\inc\wincon.h +FILE 764 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 765 f:\sp\public\sdk\inc\ddbanned.h +FILE 766 f:\sp\public\sdk\inc\windef.h +FILE 767 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 768 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 769 f:\sp\public\sdk\inc\pshpack2.h +FILE 770 f:\sp\public\sdk\inc\mcx.h +FILE 771 f:\sp\public\sdk\inc\winuser.h +FILE 772 f:\sp\public\sdk\inc\winnls.h +FILE 773 f:\sp\public\sdk\inc\stralign.h +FILE 774 f:\sp\public\sdk\inc\tvout.h +FILE 775 f:\sp\public\sdk\inc\winsvc.h +FILE 776 f:\sp\public\sdk\inc\wingdi.h +FILE 777 f:\sp\public\sdk\inc\winnt.h +FILE 778 f:\sp\public\sdk\inc\pshpack4.h +FILE 779 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 780 f:\sp\public\sdk\inc\poppack.h +FILE 781 f:\sp\vctools\crt_bld\self_x86\crt\src\tcscpy_s.inl +FILE 782 f:\sp\public\sdk\inc\winnetwk.h +FILE 783 f:\sp\public\sdk\inc\imm.h +FILE 784 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 785 f:\sp\public\sdk\inc\pshpack1.h +FILE 786 f:\sp\public\sdk\inc\winver.h +FILE 787 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 788 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 789 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 790 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 791 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 792 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 793 f:\sp\public\sdk\inc\guiddef.h +FILE 794 f:\sp\public\sdk\inc\windows.h +FILE 795 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 796 f:\sp\public\sdk\inc\specstrings.h +FILE 797 f:\sp\public\sdk\inc\basetsd.h +FILE 798 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 799 f:\sp\public\sdk\inc\winreg.h +FILE 800 f:\sp\vctools\crt_bld\self_x86\crt\src\strcpy_s.c +FILE 801 f:\sp\public\sdk\inc\winbase.h +FILE 802 f:\sp\public\sdk\inc\winerror.h +FILE 803 f:\sp\public\sdk\inc\pshpack8.h +FILE 804 f:\sp\public\sdk\inc\reason.h +FILE 805 f:\sp\public\sdk\inc\wincon.h +FILE 806 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 807 f:\sp\public\sdk\inc\ddbanned.h +FILE 808 f:\sp\public\sdk\inc\windef.h +FILE 809 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 810 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 811 f:\sp\public\sdk\inc\pshpack2.h +FILE 812 f:\sp\public\sdk\inc\mcx.h +FILE 813 f:\sp\public\sdk\inc\winuser.h +FILE 814 f:\sp\public\sdk\inc\winnls.h +FILE 815 f:\sp\public\sdk\inc\stralign.h +FILE 816 f:\sp\public\sdk\inc\tvout.h +FILE 817 f:\sp\public\sdk\inc\winsvc.h +FILE 818 f:\sp\public\sdk\inc\wingdi.h +FILE 819 f:\sp\public\sdk\inc\winnt.h +FILE 820 f:\sp\public\sdk\inc\pshpack4.h +FILE 821 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 822 f:\sp\public\sdk\inc\poppack.h +FILE 823 f:\sp\vctools\crt_bld\self_x86\crt\src\tcscat_s.inl +FILE 824 f:\sp\public\sdk\inc\winnetwk.h +FILE 825 f:\sp\public\sdk\inc\imm.h +FILE 826 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 827 f:\sp\public\sdk\inc\pshpack1.h +FILE 828 f:\sp\public\sdk\inc\winver.h +FILE 829 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 830 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 831 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 832 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 833 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 834 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 835 f:\sp\public\sdk\inc\guiddef.h +FILE 836 f:\sp\public\sdk\inc\windows.h +FILE 837 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 838 f:\sp\public\sdk\inc\specstrings.h +FILE 839 f:\sp\public\sdk\inc\basetsd.h +FILE 840 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 841 f:\sp\public\sdk\inc\winreg.h +FILE 842 f:\sp\vctools\crt_bld\self_x86\crt\src\strcat_s.c +FILE 843 f:\sp\public\sdk\inc\winbase.h +FILE 844 f:\sp\public\sdk\inc\winerror.h +FILE 845 f:\sp\public\sdk\inc\pshpack8.h +FILE 846 f:\sp\public\sdk\inc\reason.h +FILE 847 f:\sp\public\sdk\inc\wincon.h +FILE 848 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 849 f:\sp\public\sdk\inc\ddbanned.h +FILE 850 f:\sp\public\sdk\inc\windef.h +FILE 851 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 852 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 853 f:\sp\public\sdk\inc\pshpack2.h +FILE 854 f:\sp\public\sdk\inc\mcx.h +FILE 855 f:\sp\public\sdk\inc\winuser.h +FILE 856 f:\sp\public\sdk\inc\winnls.h +FILE 857 f:\sp\public\sdk\inc\stralign.h +FILE 858 f:\sp\public\sdk\inc\tvout.h +FILE 859 f:\sp\public\sdk\inc\winsvc.h +FILE 860 f:\sp\public\sdk\inc\wingdi.h +FILE 861 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 862 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 863 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 864 f:\sp\vctools\crt_bld\self_x86\crt\src\strlen_s.c +FILE 865 f:\sp\public\sdk\inc\ddbanned.h +FILE 866 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 867 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 868 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strpbrk.asm +FILE 869 F:\SP\vctools\crt_bld\SELF_X86\crt\src\Intel\STRSPN.ASM +FILE 870 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 871 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\_strnicm.asm +FILE 872 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 873 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 874 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 875 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 876 f:\sp\vctools\crt_bld\self_x86\crt\src\intel\strncmp.c +FILE 877 f:\sp\public\sdk\inc\ddbanned.h +FILE 878 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 879 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 880 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strlen.asm +FILE 881 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 882 f:\sp\public\sdk\inc\pshpack2.h +FILE 883 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 884 f:\sp\public\sdk\inc\mcx.h +FILE 885 f:\sp\public\sdk\inc\winuser.h +FILE 886 f:\sp\public\sdk\inc\winnls.h +FILE 887 f:\sp\public\sdk\inc\stralign.h +FILE 888 f:\sp\public\sdk\inc\tvout.h +FILE 889 f:\sp\public\sdk\inc\winsvc.h +FILE 890 f:\sp\public\sdk\inc\wingdi.h +FILE 891 f:\sp\public\sdk\inc\winnt.h +FILE 892 f:\sp\public\sdk\inc\pshpack4.h +FILE 893 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 894 f:\sp\public\sdk\inc\poppack.h +FILE 895 f:\sp\public\sdk\inc\winnetwk.h +FILE 896 f:\sp\public\sdk\inc\imm.h +FILE 897 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 898 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 899 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 900 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 901 f:\sp\vctools\crt_bld\self_x86\crt\src\strdup.c +FILE 902 f:\sp\public\sdk\inc\pshpack1.h +FILE 903 f:\sp\public\sdk\inc\winver.h +FILE 904 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 905 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 906 f:\sp\public\sdk\inc\guiddef.h +FILE 907 f:\sp\public\sdk\inc\windows.h +FILE 908 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 909 f:\sp\public\sdk\inc\specstrings.h +FILE 910 f:\sp\public\sdk\inc\basetsd.h +FILE 911 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 912 f:\sp\public\sdk\inc\winreg.h +FILE 913 f:\sp\public\sdk\inc\ddbanned.h +FILE 914 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 915 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 916 f:\sp\public\sdk\inc\winbase.h +FILE 917 f:\sp\public\sdk\inc\winerror.h +FILE 918 f:\sp\public\sdk\inc\pshpack8.h +FILE 919 f:\sp\public\sdk\inc\reason.h +FILE 920 f:\sp\public\sdk\inc\wincon.h +FILE 921 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 922 f:\sp\public\sdk\inc\windef.h +FILE 923 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strcspn.asm +FILE 924 F:\SP\vctools\crt_bld\SELF_X86\crt\src\Intel\STRSPN.ASM +FILE 925 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 926 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strcmp.asm +FILE 927 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 928 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strchr.asm +FILE 929 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 930 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\string\i386\p4_memset.c +FILE 931 f:\sp\public\sdk\inc\ddbanned.h +FILE 932 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 933 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 934 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\memset.asm +FILE 935 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 936 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 937 f:\sp\public\sdk\inc\poppack.h +FILE 938 f:\sp\public\sdk\inc\winnetwk.h +FILE 939 f:\sp\public\sdk\inc\imm.h +FILE 940 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 941 f:\sp\public\sdk\inc\pshpack1.h +FILE 942 f:\sp\public\sdk\inc\winver.h +FILE 943 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 944 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 945 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 946 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 947 f:\sp\public\sdk\inc\guiddef.h +FILE 948 f:\sp\public\sdk\inc\windows.h +FILE 949 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 950 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 951 f:\sp\public\sdk\inc\specstrings.h +FILE 952 f:\sp\public\sdk\inc\basetsd.h +FILE 953 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 954 f:\sp\public\sdk\inc\winreg.h +FILE 955 f:\sp\vctools\crt_bld\self_x86\crt\src\memmove_s.c +FILE 956 f:\sp\public\sdk\inc\winbase.h +FILE 957 f:\sp\public\sdk\inc\winerror.h +FILE 958 f:\sp\public\sdk\inc\pshpack8.h +FILE 959 f:\sp\public\sdk\inc\reason.h +FILE 960 f:\sp\public\sdk\inc\wincon.h +FILE 961 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 962 f:\sp\public\sdk\inc\windef.h +FILE 963 f:\sp\public\sdk\inc\ddbanned.h +FILE 964 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 965 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 966 f:\sp\public\sdk\inc\pshpack2.h +FILE 967 f:\sp\public\sdk\inc\mcx.h +FILE 968 f:\sp\public\sdk\inc\winuser.h +FILE 969 f:\sp\public\sdk\inc\winnls.h +FILE 970 f:\sp\public\sdk\inc\stralign.h +FILE 971 f:\sp\public\sdk\inc\tvout.h +FILE 972 f:\sp\public\sdk\inc\winsvc.h +FILE 973 f:\sp\public\sdk\inc\wingdi.h +FILE 974 f:\sp\public\sdk\inc\winnt.h +FILE 975 f:\sp\public\sdk\inc\pshpack4.h +FILE 976 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\memmove.asm +FILE 977 F:\SP\vctools\crt_bld\SELF_X86\crt\src\Intel\MEMCPY.ASM +FILE 978 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 979 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\string\i386\memcmp.c +FILE 980 f:\sp\public\sdk\inc\ddbanned.h +FILE 981 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 982 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 983 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 984 f:\sp\public\sdk\inc\poppack.h +FILE 985 f:\sp\public\sdk\inc\winnetwk.h +FILE 986 f:\sp\public\sdk\inc\imm.h +FILE 987 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 988 f:\sp\public\sdk\inc\pshpack1.h +FILE 989 f:\sp\public\sdk\inc\winver.h +FILE 990 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 991 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 992 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 993 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 994 f:\sp\public\sdk\inc\guiddef.h +FILE 995 f:\sp\public\sdk\inc\windows.h +FILE 996 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 997 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 998 f:\sp\public\sdk\inc\specstrings.h +FILE 999 f:\sp\public\sdk\inc\basetsd.h +FILE 1000 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1001 f:\sp\public\sdk\inc\winreg.h +FILE 1002 f:\sp\vctools\crt_bld\self_x86\crt\src\memcpy_s.c +FILE 1003 f:\sp\public\sdk\inc\winbase.h +FILE 1004 f:\sp\public\sdk\inc\winerror.h +FILE 1005 f:\sp\public\sdk\inc\pshpack8.h +FILE 1006 f:\sp\public\sdk\inc\reason.h +FILE 1007 f:\sp\public\sdk\inc\wincon.h +FILE 1008 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1009 f:\sp\public\sdk\inc\windef.h +FILE 1010 f:\sp\public\sdk\inc\ddbanned.h +FILE 1011 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1012 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1013 f:\sp\public\sdk\inc\pshpack2.h +FILE 1014 f:\sp\public\sdk\inc\mcx.h +FILE 1015 f:\sp\public\sdk\inc\winuser.h +FILE 1016 f:\sp\public\sdk\inc\winnls.h +FILE 1017 f:\sp\public\sdk\inc\stralign.h +FILE 1018 f:\sp\public\sdk\inc\tvout.h +FILE 1019 f:\sp\public\sdk\inc\winsvc.h +FILE 1020 f:\sp\public\sdk\inc\wingdi.h +FILE 1021 f:\sp\public\sdk\inc\winnt.h +FILE 1022 f:\sp\public\sdk\inc\pshpack4.h +FILE 1023 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\string\i386\p4_memcpy.c +FILE 1024 f:\sp\public\sdk\inc\ddbanned.h +FILE 1025 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 1026 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 1027 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\memcpy.asm +FILE 1028 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 1029 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1030 f:\sp\public\sdk\inc\wincon.h +FILE 1031 f:\sp\public\sdk\inc\imm.h +FILE 1032 f:\sp\public\sdk\inc\winbase.h +FILE 1033 f:\sp\public\sdk\inc\wingdi.h +FILE 1034 f:\sp\public\sdk\inc\winver.h +FILE 1035 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1036 f:\sp\public\sdk\inc\windows.h +FILE 1037 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1038 f:\sp\public\sdk\inc\pshpack2.h +FILE 1039 f:\sp\public\sdk\inc\reason.h +FILE 1040 f:\sp\vctools\crt_bld\self_x86\crt\src\woutputs.c +FILE 1041 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1042 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1043 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1044 f:\sp\public\sdk\inc\specstrings.h +FILE 1045 f:\sp\public\sdk\inc\basetsd.h +FILE 1046 f:\sp\public\sdk\inc\pshpack4.h +FILE 1047 f:\sp\public\sdk\inc\winnetwk.h +FILE 1048 f:\sp\public\sdk\inc\stralign.h +FILE 1049 f:\sp\public\sdk\inc\poppack.h +FILE 1050 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1051 f:\sp\public\sdk\inc\winsvc.h +FILE 1052 f:\sp\public\sdk\inc\windef.h +FILE 1053 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1054 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1055 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1056 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1057 f:\sp\public\sdk\inc\winuser.h +FILE 1058 f:\sp\public\sdk\inc\mcx.h +FILE 1059 f:\sp\public\sdk\inc\pshpack8.h +FILE 1060 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1061 f:\sp\public\sdk\inc\guiddef.h +FILE 1062 f:\sp\public\sdk\inc\winnt.h +FILE 1063 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1064 f:\sp\public\sdk\inc\winnls.h +FILE 1065 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1066 f:\sp\public\sdk\inc\pshpack1.h +FILE 1067 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1068 f:\sp\public\sdk\inc\winerror.h +FILE 1069 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1070 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1071 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1072 f:\sp\public\sdk\inc\winreg.h +FILE 1073 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1074 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1075 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1076 f:\sp\public\sdk\inc\ddbanned.h +FILE 1077 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1078 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1079 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1080 f:\sp\public\sdk\inc\tvout.h +FILE 1081 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1082 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1083 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1084 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1085 f:\sp\public\sdk\inc\wincon.h +FILE 1086 f:\sp\public\sdk\inc\imm.h +FILE 1087 f:\sp\public\sdk\inc\winbase.h +FILE 1088 f:\sp\public\sdk\inc\wingdi.h +FILE 1089 f:\sp\public\sdk\inc\winver.h +FILE 1090 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1091 f:\sp\public\sdk\inc\windows.h +FILE 1092 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1093 f:\sp\public\sdk\inc\pshpack2.h +FILE 1094 f:\sp\public\sdk\inc\reason.h +FILE 1095 f:\sp\vctools\crt_bld\self_x86\crt\src\woutputp.c +FILE 1096 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1097 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1098 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1099 f:\sp\public\sdk\inc\specstrings.h +FILE 1100 f:\sp\public\sdk\inc\basetsd.h +FILE 1101 f:\sp\public\sdk\inc\pshpack4.h +FILE 1102 f:\sp\public\sdk\inc\winnetwk.h +FILE 1103 f:\sp\public\sdk\inc\stralign.h +FILE 1104 f:\sp\public\sdk\inc\poppack.h +FILE 1105 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1106 f:\sp\public\sdk\inc\winsvc.h +FILE 1107 f:\sp\public\sdk\inc\windef.h +FILE 1108 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1109 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1110 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1111 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1112 f:\sp\public\sdk\inc\winuser.h +FILE 1113 f:\sp\public\sdk\inc\mcx.h +FILE 1114 f:\sp\public\sdk\inc\pshpack8.h +FILE 1115 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1116 f:\sp\public\sdk\inc\guiddef.h +FILE 1117 f:\sp\public\sdk\inc\winnt.h +FILE 1118 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1119 f:\sp\public\sdk\inc\winnls.h +FILE 1120 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1121 f:\sp\public\sdk\inc\pshpack1.h +FILE 1122 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1123 f:\sp\public\sdk\inc\winerror.h +FILE 1124 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1125 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1126 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1127 f:\sp\public\sdk\inc\winreg.h +FILE 1128 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1129 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1130 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1131 f:\sp\public\sdk\inc\ddbanned.h +FILE 1132 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1133 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1134 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1135 f:\sp\public\sdk\inc\tvout.h +FILE 1136 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1137 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1138 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1139 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1140 f:\sp\public\sdk\inc\wincon.h +FILE 1141 f:\sp\public\sdk\inc\imm.h +FILE 1142 f:\sp\public\sdk\inc\winbase.h +FILE 1143 f:\sp\public\sdk\inc\wingdi.h +FILE 1144 f:\sp\public\sdk\inc\winver.h +FILE 1145 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1146 f:\sp\public\sdk\inc\windows.h +FILE 1147 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1148 f:\sp\public\sdk\inc\pshpack2.h +FILE 1149 f:\sp\public\sdk\inc\reason.h +FILE 1150 f:\sp\vctools\crt_bld\self_x86\crt\src\woutput.c +FILE 1151 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1152 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1153 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1154 f:\sp\public\sdk\inc\specstrings.h +FILE 1155 f:\sp\public\sdk\inc\basetsd.h +FILE 1156 f:\sp\public\sdk\inc\pshpack4.h +FILE 1157 f:\sp\public\sdk\inc\winnetwk.h +FILE 1158 f:\sp\public\sdk\inc\stralign.h +FILE 1159 f:\sp\public\sdk\inc\poppack.h +FILE 1160 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1161 f:\sp\public\sdk\inc\winsvc.h +FILE 1162 f:\sp\public\sdk\inc\windef.h +FILE 1163 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1164 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1165 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1166 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1167 f:\sp\public\sdk\inc\winuser.h +FILE 1168 f:\sp\public\sdk\inc\mcx.h +FILE 1169 f:\sp\public\sdk\inc\pshpack8.h +FILE 1170 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1171 f:\sp\public\sdk\inc\guiddef.h +FILE 1172 f:\sp\public\sdk\inc\winnt.h +FILE 1173 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1174 f:\sp\public\sdk\inc\winnls.h +FILE 1175 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1176 f:\sp\public\sdk\inc\pshpack1.h +FILE 1177 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1178 f:\sp\public\sdk\inc\winerror.h +FILE 1179 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1180 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1181 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1182 f:\sp\public\sdk\inc\winreg.h +FILE 1183 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1184 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1185 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1186 f:\sp\public\sdk\inc\ddbanned.h +FILE 1187 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1188 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1189 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1190 f:\sp\public\sdk\inc\tvout.h +FILE 1191 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1192 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1193 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1194 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1195 f:\sp\public\sdk\inc\wincon.h +FILE 1196 f:\sp\public\sdk\inc\imm.h +FILE 1197 f:\sp\public\sdk\inc\winbase.h +FILE 1198 f:\sp\public\sdk\inc\wingdi.h +FILE 1199 f:\sp\public\sdk\inc\winver.h +FILE 1200 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1201 f:\sp\public\sdk\inc\windows.h +FILE 1202 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1203 f:\sp\public\sdk\inc\pshpack2.h +FILE 1204 f:\sp\public\sdk\inc\reason.h +FILE 1205 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1206 f:\sp\vctools\crt_bld\self_x86\crt\src\outputs.c +FILE 1207 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1208 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1209 f:\sp\public\sdk\inc\specstrings.h +FILE 1210 f:\sp\public\sdk\inc\basetsd.h +FILE 1211 f:\sp\public\sdk\inc\pshpack4.h +FILE 1212 f:\sp\public\sdk\inc\winnetwk.h +FILE 1213 f:\sp\public\sdk\inc\stralign.h +FILE 1214 f:\sp\public\sdk\inc\poppack.h +FILE 1215 f:\sp\public\sdk\inc\winsvc.h +FILE 1216 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1217 f:\sp\public\sdk\inc\windef.h +FILE 1218 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1219 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1220 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1221 f:\sp\public\sdk\inc\winuser.h +FILE 1222 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1223 f:\sp\public\sdk\inc\mcx.h +FILE 1224 f:\sp\public\sdk\inc\pshpack8.h +FILE 1225 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1226 f:\sp\public\sdk\inc\guiddef.h +FILE 1227 f:\sp\public\sdk\inc\winnt.h +FILE 1228 f:\sp\public\sdk\inc\winnls.h +FILE 1229 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1230 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1231 f:\sp\public\sdk\inc\pshpack1.h +FILE 1232 f:\sp\public\sdk\inc\winerror.h +FILE 1233 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1234 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1235 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1236 f:\sp\public\sdk\inc\winreg.h +FILE 1237 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1238 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1239 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1240 f:\sp\public\sdk\inc\ddbanned.h +FILE 1241 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1242 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1243 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1244 f:\sp\public\sdk\inc\tvout.h +FILE 1245 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1246 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1247 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1248 f:\sp\public\sdk\inc\wincon.h +FILE 1249 f:\sp\public\sdk\inc\imm.h +FILE 1250 f:\sp\public\sdk\inc\winbase.h +FILE 1251 f:\sp\public\sdk\inc\wingdi.h +FILE 1252 f:\sp\public\sdk\inc\winver.h +FILE 1253 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1254 f:\sp\public\sdk\inc\windows.h +FILE 1255 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1256 f:\sp\public\sdk\inc\pshpack2.h +FILE 1257 f:\sp\public\sdk\inc\reason.h +FILE 1258 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1259 f:\sp\vctools\crt_bld\self_x86\crt\src\outputp.c +FILE 1260 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1261 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1262 f:\sp\public\sdk\inc\specstrings.h +FILE 1263 f:\sp\public\sdk\inc\basetsd.h +FILE 1264 f:\sp\public\sdk\inc\pshpack4.h +FILE 1265 f:\sp\public\sdk\inc\winnetwk.h +FILE 1266 f:\sp\public\sdk\inc\stralign.h +FILE 1267 f:\sp\public\sdk\inc\poppack.h +FILE 1268 f:\sp\public\sdk\inc\winsvc.h +FILE 1269 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1270 f:\sp\public\sdk\inc\windef.h +FILE 1271 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1272 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1273 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1274 f:\sp\public\sdk\inc\winuser.h +FILE 1275 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1276 f:\sp\public\sdk\inc\mcx.h +FILE 1277 f:\sp\public\sdk\inc\pshpack8.h +FILE 1278 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1279 f:\sp\public\sdk\inc\guiddef.h +FILE 1280 f:\sp\public\sdk\inc\winnt.h +FILE 1281 f:\sp\public\sdk\inc\winnls.h +FILE 1282 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1283 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1284 f:\sp\public\sdk\inc\pshpack1.h +FILE 1285 f:\sp\public\sdk\inc\winerror.h +FILE 1286 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1287 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1288 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1289 f:\sp\public\sdk\inc\winreg.h +FILE 1290 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1291 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1292 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1293 f:\sp\public\sdk\inc\ddbanned.h +FILE 1294 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1295 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1296 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1297 f:\sp\public\sdk\inc\tvout.h +FILE 1298 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1299 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1300 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1301 f:\sp\public\sdk\inc\wincon.h +FILE 1302 f:\sp\public\sdk\inc\imm.h +FILE 1303 f:\sp\public\sdk\inc\winbase.h +FILE 1304 f:\sp\public\sdk\inc\wingdi.h +FILE 1305 f:\sp\public\sdk\inc\winver.h +FILE 1306 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1307 f:\sp\public\sdk\inc\windows.h +FILE 1308 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1309 f:\sp\public\sdk\inc\pshpack2.h +FILE 1310 f:\sp\public\sdk\inc\reason.h +FILE 1311 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1312 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1313 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1314 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1315 f:\sp\public\sdk\inc\specstrings.h +FILE 1316 f:\sp\public\sdk\inc\basetsd.h +FILE 1317 f:\sp\public\sdk\inc\pshpack4.h +FILE 1318 f:\sp\public\sdk\inc\winnetwk.h +FILE 1319 f:\sp\public\sdk\inc\stralign.h +FILE 1320 f:\sp\public\sdk\inc\poppack.h +FILE 1321 f:\sp\public\sdk\inc\winsvc.h +FILE 1322 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1323 f:\sp\public\sdk\inc\windef.h +FILE 1324 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1325 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1326 f:\sp\public\sdk\inc\winuser.h +FILE 1327 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1328 f:\sp\public\sdk\inc\mcx.h +FILE 1329 f:\sp\public\sdk\inc\pshpack8.h +FILE 1330 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1331 f:\sp\public\sdk\inc\guiddef.h +FILE 1332 f:\sp\public\sdk\inc\winnt.h +FILE 1333 f:\sp\public\sdk\inc\winnls.h +FILE 1334 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1335 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1336 f:\sp\public\sdk\inc\pshpack1.h +FILE 1337 f:\sp\public\sdk\inc\winerror.h +FILE 1338 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1339 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1340 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1341 f:\sp\public\sdk\inc\winreg.h +FILE 1342 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1343 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1344 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1345 f:\sp\public\sdk\inc\ddbanned.h +FILE 1346 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1347 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1348 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1349 f:\sp\public\sdk\inc\tvout.h +FILE 1350 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1351 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1352 f:\sp\public\sdk\inc\stralign.h +FILE 1353 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1354 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1355 f:\sp\public\sdk\inc\tvout.h +FILE 1356 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1357 f:\sp\public\sdk\inc\windows.h +FILE 1358 f:\sp\public\sdk\inc\winsvc.h +FILE 1359 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1360 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1361 f:\sp\public\sdk\inc\wingdi.h +FILE 1362 f:\sp\public\sdk\inc\pshpack4.h +FILE 1363 f:\sp\public\sdk\inc\poppack.h +FILE 1364 f:\sp\public\sdk\inc\winnetwk.h +FILE 1365 f:\sp\public\sdk\inc\imm.h +FILE 1366 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1367 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1368 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1369 f:\sp\public\sdk\inc\windef.h +FILE 1370 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1371 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1372 f:\sp\public\sdk\inc\pshpack1.h +FILE 1373 f:\sp\public\sdk\inc\winver.h +FILE 1374 f:\sp\vctools\crt_bld\self_x86\crt\src\vswprnc.c +FILE 1375 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1376 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1377 f:\sp\public\sdk\inc\winnt.h +FILE 1378 f:\sp\public\sdk\inc\winreg.h +FILE 1379 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1380 f:\sp\vctools\crt_bld\self_x86\crt\src\vswprint.c +FILE 1381 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1382 f:\sp\public\sdk\inc\winbase.h +FILE 1383 f:\sp\public\sdk\inc\winerror.h +FILE 1384 f:\sp\public\sdk\inc\ddbanned.h +FILE 1385 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1386 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1387 f:\sp\public\sdk\inc\pshpack8.h +FILE 1388 f:\sp\public\sdk\inc\guiddef.h +FILE 1389 f:\sp\public\sdk\inc\specstrings.h +FILE 1390 f:\sp\public\sdk\inc\basetsd.h +FILE 1391 f:\sp\public\sdk\inc\reason.h +FILE 1392 f:\sp\public\sdk\inc\wincon.h +FILE 1393 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1394 f:\sp\public\sdk\inc\pshpack2.h +FILE 1395 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1396 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1397 f:\sp\public\sdk\inc\mcx.h +FILE 1398 f:\sp\public\sdk\inc\winuser.h +FILE 1399 f:\sp\public\sdk\inc\winnls.h +FILE 1400 f:\sp\public\sdk\inc\pshpack1.h +FILE 1401 f:\sp\public\sdk\inc\winver.h +FILE 1402 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1403 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1404 f:\sp\public\sdk\inc\winnt.h +FILE 1405 f:\sp\public\sdk\inc\winreg.h +FILE 1406 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1407 f:\sp\public\sdk\inc\winbase.h +FILE 1408 f:\sp\public\sdk\inc\winerror.h +FILE 1409 f:\sp\public\sdk\inc\pshpack8.h +FILE 1410 f:\sp\public\sdk\inc\guiddef.h +FILE 1411 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1412 f:\sp\public\sdk\inc\specstrings.h +FILE 1413 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1414 f:\sp\public\sdk\inc\basetsd.h +FILE 1415 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1416 f:\sp\public\sdk\inc\reason.h +FILE 1417 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1418 f:\sp\public\sdk\inc\wincon.h +FILE 1419 f:\sp\public\sdk\inc\pshpack2.h +FILE 1420 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1421 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1422 f:\sp\public\sdk\inc\mcx.h +FILE 1423 f:\sp\public\sdk\inc\winuser.h +FILE 1424 f:\sp\public\sdk\inc\winnls.h +FILE 1425 f:\sp\vctools\crt_bld\self_x86\crt\src\vswprint.c +FILE 1426 f:\sp\public\sdk\inc\stralign.h +FILE 1427 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1428 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1429 f:\sp\public\sdk\inc\tvout.h +FILE 1430 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1431 f:\sp\public\sdk\inc\windows.h +FILE 1432 f:\sp\public\sdk\inc\winsvc.h +FILE 1433 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1434 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1435 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1436 f:\sp\public\sdk\inc\wingdi.h +FILE 1437 f:\sp\public\sdk\inc\pshpack4.h +FILE 1438 f:\sp\public\sdk\inc\poppack.h +FILE 1439 f:\sp\public\sdk\inc\ddbanned.h +FILE 1440 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1441 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1442 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1443 f:\sp\public\sdk\inc\winnetwk.h +FILE 1444 f:\sp\public\sdk\inc\imm.h +FILE 1445 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1446 f:\sp\public\sdk\inc\windef.h +FILE 1447 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1448 f:\sp\public\sdk\inc\windef.h +FILE 1449 f:\sp\public\sdk\inc\pshpack1.h +FILE 1450 f:\sp\public\sdk\inc\winver.h +FILE 1451 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1452 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1453 f:\sp\public\sdk\inc\winnt.h +FILE 1454 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1455 f:\sp\public\sdk\inc\winreg.h +FILE 1456 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1457 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1458 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1459 f:\sp\public\sdk\inc\winbase.h +FILE 1460 f:\sp\public\sdk\inc\winerror.h +FILE 1461 f:\sp\public\sdk\inc\pshpack8.h +FILE 1462 f:\sp\vctools\crt_bld\self_x86\crt\src\vfprintf.c +FILE 1463 f:\sp\public\sdk\inc\reason.h +FILE 1464 f:\sp\public\sdk\inc\wincon.h +FILE 1465 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1466 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1467 f:\sp\public\sdk\inc\pshpack2.h +FILE 1468 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1469 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1470 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1471 f:\sp\public\sdk\inc\mcx.h +FILE 1472 f:\sp\public\sdk\inc\winuser.h +FILE 1473 f:\sp\public\sdk\inc\winnls.h +FILE 1474 f:\sp\public\sdk\inc\guiddef.h +FILE 1475 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1476 f:\sp\public\sdk\inc\windows.h +FILE 1477 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1478 f:\sp\public\sdk\inc\specstrings.h +FILE 1479 f:\sp\public\sdk\inc\basetsd.h +FILE 1480 f:\sp\public\sdk\inc\stralign.h +FILE 1481 f:\sp\public\sdk\inc\tvout.h +FILE 1482 f:\sp\public\sdk\inc\ddbanned.h +FILE 1483 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1484 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1485 f:\sp\public\sdk\inc\winsvc.h +FILE 1486 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1487 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1488 f:\sp\public\sdk\inc\wingdi.h +FILE 1489 f:\sp\public\sdk\inc\pshpack4.h +FILE 1490 f:\sp\public\sdk\inc\poppack.h +FILE 1491 f:\sp\public\sdk\inc\winnetwk.h +FILE 1492 f:\sp\public\sdk\inc\imm.h +FILE 1493 f:\sp\public\sdk\inc\windef.h +FILE 1494 f:\sp\public\sdk\inc\pshpack1.h +FILE 1495 f:\sp\public\sdk\inc\winver.h +FILE 1496 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1497 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1498 f:\sp\public\sdk\inc\winnt.h +FILE 1499 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1500 f:\sp\public\sdk\inc\winreg.h +FILE 1501 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1502 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1503 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1504 f:\sp\public\sdk\inc\winbase.h +FILE 1505 f:\sp\public\sdk\inc\winerror.h +FILE 1506 f:\sp\public\sdk\inc\pshpack8.h +FILE 1507 f:\sp\vctools\crt_bld\self_x86\crt\src\vprintf.c +FILE 1508 f:\sp\public\sdk\inc\reason.h +FILE 1509 f:\sp\public\sdk\inc\wincon.h +FILE 1510 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1511 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1512 f:\sp\public\sdk\inc\pshpack2.h +FILE 1513 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1514 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1515 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1516 f:\sp\public\sdk\inc\mcx.h +FILE 1517 f:\sp\public\sdk\inc\winuser.h +FILE 1518 f:\sp\public\sdk\inc\winnls.h +FILE 1519 f:\sp\public\sdk\inc\guiddef.h +FILE 1520 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1521 f:\sp\public\sdk\inc\windows.h +FILE 1522 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1523 f:\sp\public\sdk\inc\specstrings.h +FILE 1524 f:\sp\public\sdk\inc\basetsd.h +FILE 1525 f:\sp\public\sdk\inc\stralign.h +FILE 1526 f:\sp\public\sdk\inc\tvout.h +FILE 1527 f:\sp\public\sdk\inc\ddbanned.h +FILE 1528 f:\sp\public\sdk\inc\winsvc.h +FILE 1529 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1530 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1531 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1532 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1533 f:\sp\public\sdk\inc\wingdi.h +FILE 1534 f:\sp\public\sdk\inc\pshpack4.h +FILE 1535 f:\sp\public\sdk\inc\poppack.h +FILE 1536 f:\sp\public\sdk\inc\winnetwk.h +FILE 1537 f:\sp\public\sdk\inc\imm.h +FILE 1538 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1539 f:\sp\public\sdk\inc\pshpack1.h +FILE 1540 f:\sp\public\sdk\inc\winver.h +FILE 1541 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1542 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1543 f:\sp\public\sdk\inc\winnt.h +FILE 1544 f:\sp\public\sdk\inc\winreg.h +FILE 1545 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1546 f:\sp\public\sdk\inc\winbase.h +FILE 1547 f:\sp\public\sdk\inc\winerror.h +FILE 1548 f:\sp\public\sdk\inc\pshpack8.h +FILE 1549 f:\sp\public\sdk\inc\guiddef.h +FILE 1550 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1551 f:\sp\public\sdk\inc\specstrings.h +FILE 1552 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1553 f:\sp\public\sdk\inc\basetsd.h +FILE 1554 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1555 f:\sp\public\sdk\inc\reason.h +FILE 1556 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1557 f:\sp\public\sdk\inc\wincon.h +FILE 1558 f:\sp\public\sdk\inc\pshpack2.h +FILE 1559 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1560 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1561 f:\sp\public\sdk\inc\mcx.h +FILE 1562 f:\sp\public\sdk\inc\winuser.h +FILE 1563 f:\sp\public\sdk\inc\winnls.h +FILE 1564 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.c +FILE 1565 f:\sp\public\sdk\inc\stralign.h +FILE 1566 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1567 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1568 f:\sp\public\sdk\inc\tvout.h +FILE 1569 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1570 f:\sp\public\sdk\inc\windows.h +FILE 1571 f:\sp\public\sdk\inc\winsvc.h +FILE 1572 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1573 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1574 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1575 f:\sp\public\sdk\inc\wingdi.h +FILE 1576 f:\sp\public\sdk\inc\pshpack4.h +FILE 1577 f:\sp\public\sdk\inc\poppack.h +FILE 1578 f:\sp\public\sdk\inc\ddbanned.h +FILE 1579 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1580 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1581 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1582 f:\sp\public\sdk\inc\winnetwk.h +FILE 1583 f:\sp\public\sdk\inc\imm.h +FILE 1584 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1585 f:\sp\public\sdk\inc\windef.h +FILE 1586 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1587 f:\sp\public\sdk\inc\windef.h +FILE 1588 f:\sp\public\sdk\inc\pshpack1.h +FILE 1589 f:\sp\public\sdk\inc\winver.h +FILE 1590 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1591 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1592 f:\sp\public\sdk\inc\winnt.h +FILE 1593 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1594 f:\sp\public\sdk\inc\winreg.h +FILE 1595 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1596 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1597 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1598 f:\sp\public\sdk\inc\winbase.h +FILE 1599 f:\sp\public\sdk\inc\winerror.h +FILE 1600 f:\sp\public\sdk\inc\pshpack8.h +FILE 1601 f:\sp\vctools\crt_bld\self_x86\crt\src\printf.c +FILE 1602 f:\sp\public\sdk\inc\reason.h +FILE 1603 f:\sp\public\sdk\inc\wincon.h +FILE 1604 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1605 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1606 f:\sp\public\sdk\inc\pshpack2.h +FILE 1607 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1608 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1609 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1610 f:\sp\public\sdk\inc\mcx.h +FILE 1611 f:\sp\public\sdk\inc\winuser.h +FILE 1612 f:\sp\public\sdk\inc\winnls.h +FILE 1613 f:\sp\public\sdk\inc\guiddef.h +FILE 1614 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1615 f:\sp\public\sdk\inc\windows.h +FILE 1616 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1617 f:\sp\public\sdk\inc\specstrings.h +FILE 1618 f:\sp\public\sdk\inc\basetsd.h +FILE 1619 f:\sp\public\sdk\inc\stralign.h +FILE 1620 f:\sp\public\sdk\inc\tvout.h +FILE 1621 f:\sp\public\sdk\inc\ddbanned.h +FILE 1622 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1623 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1624 f:\sp\public\sdk\inc\winsvc.h +FILE 1625 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1626 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1627 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 1628 f:\sp\public\sdk\inc\wingdi.h +FILE 1629 f:\sp\public\sdk\inc\pshpack4.h +FILE 1630 f:\sp\public\sdk\inc\poppack.h +FILE 1631 f:\sp\public\sdk\inc\winnetwk.h +FILE 1632 f:\sp\public\sdk\inc\imm.h +FILE 1633 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1634 f:\sp\public\sdk\inc\windef.h +FILE 1635 f:\sp\public\sdk\inc\pshpack1.h +FILE 1636 f:\sp\public\sdk\inc\winver.h +FILE 1637 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1638 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1639 f:\sp\public\sdk\inc\winnt.h +FILE 1640 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1641 f:\sp\public\sdk\inc\winreg.h +FILE 1642 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1643 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1644 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1645 f:\sp\public\sdk\inc\winbase.h +FILE 1646 f:\sp\public\sdk\inc\winerror.h +FILE 1647 f:\sp\public\sdk\inc\pshpack8.h +FILE 1648 f:\sp\vctools\crt_bld\self_x86\crt\src\fprintf.c +FILE 1649 f:\sp\public\sdk\inc\reason.h +FILE 1650 f:\sp\public\sdk\inc\wincon.h +FILE 1651 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1652 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1653 f:\sp\public\sdk\inc\pshpack2.h +FILE 1654 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1655 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1656 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1657 f:\sp\public\sdk\inc\mcx.h +FILE 1658 f:\sp\public\sdk\inc\winuser.h +FILE 1659 f:\sp\public\sdk\inc\winnls.h +FILE 1660 f:\sp\public\sdk\inc\guiddef.h +FILE 1661 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1662 f:\sp\public\sdk\inc\windows.h +FILE 1663 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1664 f:\sp\public\sdk\inc\specstrings.h +FILE 1665 f:\sp\public\sdk\inc\basetsd.h +FILE 1666 f:\sp\public\sdk\inc\stralign.h +FILE 1667 f:\sp\public\sdk\inc\tvout.h +FILE 1668 f:\sp\public\sdk\inc\ddbanned.h +FILE 1669 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1670 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1671 f:\sp\public\sdk\inc\winsvc.h +FILE 1672 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1673 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1674 f:\sp\public\sdk\inc\wingdi.h +FILE 1675 f:\sp\public\sdk\inc\pshpack4.h +FILE 1676 f:\sp\public\sdk\inc\poppack.h +FILE 1677 f:\sp\public\sdk\inc\winnetwk.h +FILE 1678 f:\sp\public\sdk\inc\imm.h +FILE 1679 f:\sp\public\sdk\inc\pshpack1.h +FILE 1680 f:\sp\public\sdk\inc\winver.h +FILE 1681 f:\sp\public\sdk\inc\winnt.h +FILE 1682 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1683 f:\sp\public\sdk\inc\winreg.h +FILE 1684 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1685 f:\sp\public\sdk\inc\winbase.h +FILE 1686 f:\sp\public\sdk\inc\winerror.h +FILE 1687 f:\sp\public\sdk\inc\pshpack8.h +FILE 1688 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 1689 f:\sp\public\sdk\inc\reason.h +FILE 1690 f:\sp\public\sdk\inc\wincon.h +FILE 1691 f:\sp\public\sdk\inc\pshpack2.h +FILE 1692 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1693 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1694 f:\sp\public\sdk\inc\mcx.h +FILE 1695 f:\sp\public\sdk\inc\winuser.h +FILE 1696 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1697 f:\sp\public\sdk\inc\winnls.h +FILE 1698 f:\sp\public\sdk\inc\guiddef.h +FILE 1699 f:\sp\public\sdk\inc\windows.h +FILE 1700 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1701 f:\sp\public\sdk\inc\specstrings.h +FILE 1702 f:\sp\public\sdk\inc\basetsd.h +FILE 1703 f:\sp\public\sdk\inc\stralign.h +FILE 1704 f:\sp\vctools\crt_bld\self_x86\crt\src\fflush.c +FILE 1705 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1706 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 1707 f:\sp\public\sdk\inc\tvout.h +FILE 1708 f:\sp\public\sdk\inc\winsvc.h +FILE 1709 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1710 f:\sp\public\sdk\inc\wingdi.h +FILE 1711 f:\sp\public\sdk\inc\pshpack4.h +FILE 1712 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1713 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1714 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1715 f:\sp\public\sdk\inc\poppack.h +FILE 1716 f:\sp\public\sdk\inc\ddbanned.h +FILE 1717 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1718 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1719 f:\sp\public\sdk\inc\winnetwk.h +FILE 1720 f:\sp\public\sdk\inc\imm.h +FILE 1721 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1722 f:\sp\public\sdk\inc\windef.h +FILE 1723 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1724 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1725 f:\sp\public\sdk\inc\pshpack8.h +FILE 1726 f:\sp\public\sdk\inc\reason.h +FILE 1727 f:\sp\public\sdk\inc\wincon.h +FILE 1728 f:\sp\public\sdk\inc\pshpack2.h +FILE 1729 f:\sp\public\sdk\inc\mcx.h +FILE 1730 f:\sp\public\sdk\inc\winuser.h +FILE 1731 f:\sp\public\sdk\inc\winnls.h +FILE 1732 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1733 f:\sp\public\sdk\inc\windef.h +FILE 1734 f:\sp\public\sdk\inc\stralign.h +FILE 1735 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1736 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1737 f:\sp\public\sdk\inc\tvout.h +FILE 1738 f:\sp\public\sdk\inc\winsvc.h +FILE 1739 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1740 f:\sp\public\sdk\inc\wingdi.h +FILE 1741 f:\sp\public\sdk\inc\pshpack4.h +FILE 1742 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1743 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1744 f:\sp\public\sdk\inc\poppack.h +FILE 1745 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1746 f:\sp\public\sdk\inc\winnt.h +FILE 1747 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1748 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1749 f:\sp\public\sdk\inc\winnetwk.h +FILE 1750 f:\sp\public\sdk\inc\imm.h +FILE 1751 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1752 f:\sp\vctools\crt_bld\self_x86\crt\src\fclose.c +FILE 1753 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1754 f:\sp\public\sdk\inc\pshpack1.h +FILE 1755 f:\sp\public\sdk\inc\winver.h +FILE 1756 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1757 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1758 f:\sp\public\sdk\inc\guiddef.h +FILE 1759 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1760 f:\sp\public\sdk\inc\ddbanned.h +FILE 1761 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1762 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1763 f:\sp\public\sdk\inc\specstrings.h +FILE 1764 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1765 f:\sp\public\sdk\inc\basetsd.h +FILE 1766 f:\sp\public\sdk\inc\windows.h +FILE 1767 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1768 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 1769 f:\sp\public\sdk\inc\winreg.h +FILE 1770 f:\sp\public\sdk\inc\winbase.h +FILE 1771 f:\sp\public\sdk\inc\winerror.h +FILE 1772 f:\sp\public\sdk\inc\poppack.h +FILE 1773 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1774 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1775 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1776 f:\sp\public\sdk\inc\winnetwk.h +FILE 1777 f:\sp\public\sdk\inc\imm.h +FILE 1778 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1779 f:\sp\public\sdk\inc\windef.h +FILE 1780 f:\sp\public\sdk\inc\pshpack1.h +FILE 1781 f:\sp\public\sdk\inc\winver.h +FILE 1782 f:\sp\public\sdk\inc\windows.h +FILE 1783 f:\sp\public\sdk\inc\winnt.h +FILE 1784 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1785 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1786 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1787 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1788 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1789 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1790 f:\sp\public\sdk\inc\winreg.h +FILE 1791 f:\sp\public\sdk\inc\winbase.h +FILE 1792 f:\sp\vctools\crt_bld\self_x86\crt\src\closeall.c +FILE 1793 f:\sp\public\sdk\inc\winerror.h +FILE 1794 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1795 f:\sp\public\sdk\inc\pshpack8.h +FILE 1796 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1797 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1798 f:\sp\public\sdk\inc\reason.h +FILE 1799 f:\sp\public\sdk\inc\wincon.h +FILE 1800 f:\sp\public\sdk\inc\ddbanned.h +FILE 1801 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1802 f:\sp\public\sdk\inc\pshpack2.h +FILE 1803 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1804 f:\sp\public\sdk\inc\mcx.h +FILE 1805 f:\sp\public\sdk\inc\winuser.h +FILE 1806 f:\sp\public\sdk\inc\winnls.h +FILE 1807 f:\sp\public\sdk\inc\guiddef.h +FILE 1808 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1809 f:\sp\public\sdk\inc\specstrings.h +FILE 1810 f:\sp\public\sdk\inc\basetsd.h +FILE 1811 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1812 f:\sp\public\sdk\inc\stralign.h +FILE 1813 f:\sp\public\sdk\inc\tvout.h +FILE 1814 f:\sp\public\sdk\inc\winsvc.h +FILE 1815 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1816 f:\sp\public\sdk\inc\wingdi.h +FILE 1817 f:\sp\public\sdk\inc\pshpack4.h +FILE 1818 f:\sp\public\sdk\inc\pshpack8.h +FILE 1819 f:\sp\public\sdk\inc\reason.h +FILE 1820 f:\sp\public\sdk\inc\wincon.h +FILE 1821 f:\sp\public\sdk\inc\pshpack2.h +FILE 1822 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1823 f:\sp\public\sdk\inc\mcx.h +FILE 1824 f:\sp\public\sdk\inc\winuser.h +FILE 1825 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1826 f:\sp\public\sdk\inc\winnls.h +FILE 1827 f:\sp\public\sdk\inc\guiddef.h +FILE 1828 f:\sp\public\sdk\inc\windows.h +FILE 1829 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1830 f:\sp\public\sdk\inc\specstrings.h +FILE 1831 f:\sp\public\sdk\inc\basetsd.h +FILE 1832 f:\sp\public\sdk\inc\stralign.h +FILE 1833 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1834 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 1835 f:\sp\public\sdk\inc\tvout.h +FILE 1836 f:\sp\public\sdk\inc\winsvc.h +FILE 1837 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1838 f:\sp\public\sdk\inc\wingdi.h +FILE 1839 f:\sp\public\sdk\inc\pshpack4.h +FILE 1840 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1841 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1842 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1843 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1844 f:\sp\public\sdk\inc\poppack.h +FILE 1845 f:\sp\public\sdk\inc\winnetwk.h +FILE 1846 f:\sp\public\sdk\inc\imm.h +FILE 1847 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1848 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1849 f:\sp\public\sdk\inc\windef.h +FILE 1850 f:\sp\vctools\crt_bld\self_x86\crt\src\_sftbuf.c +FILE 1851 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1852 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1853 f:\sp\public\sdk\inc\pshpack1.h +FILE 1854 f:\sp\public\sdk\inc\winver.h +FILE 1855 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1856 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1857 f:\sp\public\sdk\inc\ddbanned.h +FILE 1858 f:\sp\public\sdk\inc\winnt.h +FILE 1859 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1860 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1861 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1862 f:\sp\public\sdk\inc\winreg.h +FILE 1863 f:\sp\public\sdk\inc\winbase.h +FILE 1864 f:\sp\public\sdk\inc\winerror.h +FILE 1865 f:\sp\public\sdk\inc\pshpack1.h +FILE 1866 f:\sp\public\sdk\inc\winver.h +FILE 1867 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1868 f:\sp\public\sdk\inc\winnt.h +FILE 1869 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1870 f:\sp\public\sdk\inc\winreg.h +FILE 1871 f:\sp\public\sdk\inc\winbase.h +FILE 1872 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1873 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1874 f:\sp\public\sdk\inc\winerror.h +FILE 1875 f:\sp\public\sdk\inc\pshpack8.h +FILE 1876 f:\sp\public\sdk\inc\reason.h +FILE 1877 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1878 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1879 f:\sp\public\sdk\inc\wincon.h +FILE 1880 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1881 f:\sp\public\sdk\inc\pshpack2.h +FILE 1882 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1883 f:\sp\public\sdk\inc\mcx.h +FILE 1884 f:\sp\public\sdk\inc\winuser.h +FILE 1885 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1886 f:\sp\public\sdk\inc\winnls.h +FILE 1887 f:\sp\public\sdk\inc\guiddef.h +FILE 1888 f:\sp\public\sdk\inc\windows.h +FILE 1889 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1890 f:\sp\public\sdk\inc\specstrings.h +FILE 1891 f:\sp\public\sdk\inc\basetsd.h +FILE 1892 f:\sp\public\sdk\inc\stralign.h +FILE 1893 f:\sp\vctools\crt_bld\self_x86\crt\src\_getbuf.c +FILE 1894 f:\sp\public\sdk\inc\tvout.h +FILE 1895 f:\sp\public\sdk\inc\winsvc.h +FILE 1896 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1897 f:\sp\public\sdk\inc\wingdi.h +FILE 1898 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1899 f:\sp\public\sdk\inc\pshpack4.h +FILE 1900 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1901 f:\sp\public\sdk\inc\poppack.h +FILE 1902 f:\sp\public\sdk\inc\ddbanned.h +FILE 1903 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1904 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1905 f:\sp\public\sdk\inc\winnetwk.h +FILE 1906 f:\sp\public\sdk\inc\imm.h +FILE 1907 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1908 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1909 f:\sp\public\sdk\inc\windef.h +FILE 1910 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1911 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1912 f:\sp\public\sdk\inc\windef.h +FILE 1913 f:\sp\public\sdk\inc\pshpack1.h +FILE 1914 f:\sp\public\sdk\inc\winver.h +FILE 1915 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1916 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1917 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1918 f:\sp\public\sdk\inc\winnt.h +FILE 1919 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1920 f:\sp\public\sdk\inc\winreg.h +FILE 1921 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1922 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1923 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1924 f:\sp\public\sdk\inc\winbase.h +FILE 1925 f:\sp\public\sdk\inc\winerror.h +FILE 1926 f:\sp\public\sdk\inc\pshpack8.h +FILE 1927 f:\sp\vctools\crt_bld\self_x86\crt\src\_freebuf.c +FILE 1928 f:\sp\public\sdk\inc\reason.h +FILE 1929 f:\sp\public\sdk\inc\wincon.h +FILE 1930 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1931 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1932 f:\sp\public\sdk\inc\pshpack2.h +FILE 1933 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1934 f:\sp\public\sdk\inc\mcx.h +FILE 1935 f:\sp\public\sdk\inc\winuser.h +FILE 1936 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1937 f:\sp\public\sdk\inc\winnls.h +FILE 1938 f:\sp\public\sdk\inc\guiddef.h +FILE 1939 f:\sp\public\sdk\inc\windows.h +FILE 1940 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1941 f:\sp\public\sdk\inc\specstrings.h +FILE 1942 f:\sp\public\sdk\inc\basetsd.h +FILE 1943 f:\sp\public\sdk\inc\stralign.h +FILE 1944 f:\sp\public\sdk\inc\tvout.h +FILE 1945 f:\sp\public\sdk\inc\ddbanned.h +FILE 1946 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1947 f:\sp\public\sdk\inc\winsvc.h +FILE 1948 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1949 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1950 f:\sp\public\sdk\inc\wingdi.h +FILE 1951 f:\sp\public\sdk\inc\pshpack4.h +FILE 1952 f:\sp\public\sdk\inc\poppack.h +FILE 1953 f:\sp\public\sdk\inc\winnetwk.h +FILE 1954 f:\sp\public\sdk\inc\imm.h +FILE 1955 f:\sp\public\sdk\inc\specstrings.h +FILE 1956 f:\sp\public\sdk\inc\basetsd.h +FILE 1957 f:\sp\public\sdk\inc\reason.h +FILE 1958 f:\sp\public\sdk\inc\wincon.h +FILE 1959 f:\sp\public\sdk\inc\pshpack2.h +FILE 1960 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1961 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1962 f:\sp\public\sdk\inc\mcx.h +FILE 1963 f:\sp\public\sdk\inc\winuser.h +FILE 1964 f:\sp\public\sdk\inc\winnls.h +FILE 1965 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1966 f:\sp\public\sdk\inc\stralign.h +FILE 1967 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1968 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1969 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1970 f:\sp\public\sdk\inc\windows.h +FILE 1971 f:\sp\public\sdk\inc\tvout.h +FILE 1972 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1973 f:\sp\public\sdk\inc\winsvc.h +FILE 1974 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1975 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1976 f:\sp\public\sdk\inc\wingdi.h +FILE 1977 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 1978 f:\sp\public\sdk\inc\pshpack4.h +FILE 1979 f:\sp\public\sdk\inc\poppack.h +FILE 1980 f:\sp\vctools\crt_bld\self_x86\crt\src\_flsbuf.c +FILE 1981 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1982 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1983 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1984 f:\sp\public\sdk\inc\winnetwk.h +FILE 1985 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1986 f:\sp\public\sdk\inc\imm.h +FILE 1987 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1988 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1989 f:\sp\vctools\crt_bld\self_x86\crt\src\_flswbuf.c +FILE 1990 f:\sp\public\sdk\inc\windef.h +FILE 1991 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1992 f:\sp\public\sdk\inc\pshpack1.h +FILE 1993 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1994 f:\sp\public\sdk\inc\winver.h +FILE 1995 f:\sp\public\sdk\inc\ddbanned.h +FILE 1996 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1997 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1998 f:\sp\public\sdk\inc\winnt.h +FILE 1999 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2000 f:\sp\public\sdk\inc\winreg.h +FILE 2001 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 2002 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 2003 f:\sp\public\sdk\inc\winbase.h +FILE 2004 f:\sp\public\sdk\inc\winerror.h +FILE 2005 f:\sp\public\sdk\inc\pshpack8.h +FILE 2006 f:\sp\public\sdk\inc\guiddef.h +FILE 2007 f:\sp\public\sdk\inc\basetsd.h +FILE 2008 f:\sp\public\sdk\inc\reason.h +FILE 2009 f:\sp\public\sdk\inc\wincon.h +FILE 2010 f:\sp\public\sdk\inc\pshpack2.h +FILE 2011 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2012 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2013 f:\sp\public\sdk\inc\mcx.h +FILE 2014 f:\sp\public\sdk\inc\winuser.h +FILE 2015 f:\sp\public\sdk\inc\winnls.h +FILE 2016 f:\sp\public\sdk\inc\stralign.h +FILE 2017 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2018 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2019 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2020 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2021 f:\sp\public\sdk\inc\tvout.h +FILE 2022 f:\sp\public\sdk\inc\windows.h +FILE 2023 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2024 f:\sp\public\sdk\inc\winsvc.h +FILE 2025 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2026 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2027 f:\sp\public\sdk\inc\wingdi.h +FILE 2028 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 2029 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 2030 f:\sp\public\sdk\inc\pshpack4.h +FILE 2031 f:\sp\public\sdk\inc\poppack.h +FILE 2032 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2033 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2034 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2035 f:\sp\public\sdk\inc\winnetwk.h +FILE 2036 f:\sp\public\sdk\inc\imm.h +FILE 2037 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 2038 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2039 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2040 f:\sp\public\sdk\inc\windef.h +FILE 2041 f:\sp\vctools\crt_bld\self_x86\crt\src\_flsbuf.c +FILE 2042 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2043 f:\sp\public\sdk\inc\pshpack1.h +FILE 2044 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2045 f:\sp\public\sdk\inc\winver.h +FILE 2046 f:\sp\public\sdk\inc\ddbanned.h +FILE 2047 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2048 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2049 f:\sp\public\sdk\inc\winnt.h +FILE 2050 f:\sp\public\sdk\inc\winreg.h +FILE 2051 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2052 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 2053 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 2054 f:\sp\public\sdk\inc\winbase.h +FILE 2055 f:\sp\public\sdk\inc\winerror.h +FILE 2056 f:\sp\public\sdk\inc\pshpack8.h +FILE 2057 f:\sp\public\sdk\inc\guiddef.h +FILE 2058 f:\sp\public\sdk\inc\specstrings.h +FILE 2059 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2060 f:\sp\public\sdk\inc\reason.h +FILE 2061 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2062 f:\sp\public\sdk\inc\wincon.h +FILE 2063 f:\sp\public\sdk\inc\pshpack2.h +FILE 2064 f:\sp\public\sdk\inc\mcx.h +FILE 2065 f:\sp\public\sdk\inc\winuser.h +FILE 2066 f:\sp\public\sdk\inc\winnls.h +FILE 2067 f:\sp\public\sdk\inc\guiddef.h +FILE 2068 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2069 f:\sp\public\sdk\inc\specstrings.h +FILE 2070 f:\sp\public\sdk\inc\basetsd.h +FILE 2071 f:\sp\public\sdk\inc\stralign.h +FILE 2072 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2073 f:\sp\public\sdk\inc\tvout.h +FILE 2074 f:\sp\public\sdk\inc\winsvc.h +FILE 2075 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2076 f:\sp\public\sdk\inc\wingdi.h +FILE 2077 f:\sp\public\sdk\inc\pshpack4.h +FILE 2078 f:\sp\public\sdk\inc\poppack.h +FILE 2079 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2080 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 2081 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2082 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2083 f:\sp\public\sdk\inc\winnetwk.h +FILE 2084 f:\sp\public\sdk\inc\imm.h +FILE 2085 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2086 f:\sp\public\sdk\inc\windef.h +FILE 2087 f:\sp\vctools\crt_bld\self_x86\crt\src\_file.c +FILE 2088 f:\sp\public\sdk\inc\pshpack1.h +FILE 2089 f:\sp\public\sdk\inc\winver.h +FILE 2090 f:\sp\public\sdk\inc\windows.h +FILE 2091 f:\sp\public\sdk\inc\winnt.h +FILE 2092 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2093 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2094 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2095 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2096 f:\sp\public\sdk\inc\ddbanned.h +FILE 2097 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2098 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2099 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2100 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2101 f:\sp\public\sdk\inc\winreg.h +FILE 2102 f:\sp\public\sdk\inc\winbase.h +FILE 2103 f:\sp\public\sdk\inc\winerror.h +FILE 2104 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2105 f:\sp\public\sdk\inc\pshpack8.h +FILE 2106 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2107 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2108 f:\sp\public\sdk\inc\windef.h +FILE 2109 f:\sp\public\sdk\inc\pshpack1.h +FILE 2110 f:\sp\public\sdk\inc\winver.h +FILE 2111 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2112 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2113 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2114 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2115 f:\sp\public\sdk\inc\winnt.h +FILE 2116 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2117 f:\sp\public\sdk\inc\winreg.h +FILE 2118 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2119 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2120 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2121 f:\sp\public\sdk\inc\winbase.h +FILE 2122 f:\sp\public\sdk\inc\winerror.h +FILE 2123 f:\sp\public\sdk\inc\pshpack8.h +FILE 2124 f:\sp\vctools\crt_bld\self_x86\crt\src\fputwc.c +FILE 2125 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2126 f:\sp\public\sdk\inc\reason.h +FILE 2127 f:\sp\public\sdk\inc\wincon.h +FILE 2128 f:\sp\public\sdk\inc\pshpack2.h +FILE 2129 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2130 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2131 f:\sp\public\sdk\inc\mcx.h +FILE 2132 f:\sp\public\sdk\inc\winuser.h +FILE 2133 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2134 f:\sp\public\sdk\inc\winnls.h +FILE 2135 f:\sp\public\sdk\inc\guiddef.h +FILE 2136 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 2137 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 2138 f:\sp\public\sdk\inc\stralign.h +FILE 2139 f:\sp\public\sdk\inc\specstrings.h +FILE 2140 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 2141 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2142 f:\sp\public\sdk\inc\basetsd.h +FILE 2143 f:\sp\public\sdk\inc\windows.h +FILE 2144 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2145 f:\sp\public\sdk\inc\tvout.h +FILE 2146 f:\sp\public\sdk\inc\ddbanned.h +FILE 2147 f:\sp\public\sdk\inc\winsvc.h +FILE 2148 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2149 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2150 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2151 f:\sp\public\sdk\inc\wingdi.h +FILE 2152 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2153 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2154 f:\sp\public\sdk\inc\pshpack4.h +FILE 2155 f:\sp\public\sdk\inc\poppack.h +FILE 2156 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 2157 f:\sp\public\sdk\inc\winnetwk.h +FILE 2158 f:\sp\public\sdk\inc\imm.h +FILE 2159 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2160 f:\sp\public\sdk\inc\poppack.h +FILE 2161 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2162 f:\sp\public\sdk\inc\winnetwk.h +FILE 2163 f:\sp\public\sdk\inc\imm.h +FILE 2164 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2165 f:\sp\public\sdk\inc\windef.h +FILE 2166 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2167 f:\sp\public\sdk\inc\pshpack1.h +FILE 2168 f:\sp\public\sdk\inc\winver.h +FILE 2169 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2170 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2171 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2172 f:\sp\public\sdk\inc\winnt.h +FILE 2173 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2174 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2175 f:\sp\public\sdk\inc\winreg.h +FILE 2176 f:\sp\vctools\crt_bld\self_x86\crt\src\fileno.c +FILE 2177 f:\sp\public\sdk\inc\winbase.h +FILE 2178 f:\sp\public\sdk\inc\winerror.h +FILE 2179 f:\sp\public\sdk\inc\pshpack8.h +FILE 2180 f:\sp\public\sdk\inc\reason.h +FILE 2181 f:\sp\public\sdk\inc\wincon.h +FILE 2182 f:\sp\public\sdk\inc\ddbanned.h +FILE 2183 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2184 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2185 f:\sp\public\sdk\inc\pshpack2.h +FILE 2186 f:\sp\public\sdk\inc\mcx.h +FILE 2187 f:\sp\public\sdk\inc\winuser.h +FILE 2188 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2189 f:\sp\public\sdk\inc\winnls.h +FILE 2190 f:\sp\public\sdk\inc\guiddef.h +FILE 2191 f:\sp\public\sdk\inc\windows.h +FILE 2192 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2193 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2194 f:\sp\public\sdk\inc\specstrings.h +FILE 2195 f:\sp\public\sdk\inc\basetsd.h +FILE 2196 f:\sp\public\sdk\inc\stralign.h +FILE 2197 f:\sp\public\sdk\inc\tvout.h +FILE 2198 f:\sp\public\sdk\inc\winsvc.h +FILE 2199 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2200 f:\sp\public\sdk\inc\wingdi.h +FILE 2201 f:\sp\public\sdk\inc\pshpack4.h +FILE 2202 f:\sp\public\sdk\inc\pshpack2.h +FILE 2203 f:\sp\public\sdk\inc\winreg.h +FILE 2204 f:\sp\public\sdk\inc\guiddef.h +FILE 2205 f:\sp\public\sdk\inc\windows.h +FILE 2206 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2207 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2208 f:\sp\public\sdk\inc\specstrings.h +FILE 2209 f:\sp\public\sdk\inc\basetsd.h +FILE 2210 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2211 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2212 f:\sp\public\sdk\inc\pshpack4.h +FILE 2213 f:\sp\public\sdk\inc\reason.h +FILE 2214 f:\sp\public\sdk\inc\wincon.h +FILE 2215 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2216 f:\sp\public\sdk\inc\poppack.h +FILE 2217 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2218 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2219 f:\sp\public\sdk\inc\mcx.h +FILE 2220 f:\sp\public\sdk\inc\winuser.h +FILE 2221 f:\sp\public\sdk\inc\winnls.h +FILE 2222 f:\sp\public\sdk\inc\stralign.h +FILE 2223 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2224 f:\sp\public\sdk\inc\windef.h +FILE 2225 f:\sp\public\sdk\inc\tvout.h +FILE 2226 f:\sp\public\sdk\inc\winsvc.h +FILE 2227 f:\sp\vctools\crt_bld\self_x86\crt\src\tidtable.c +FILE 2228 f:\sp\public\sdk\inc\wingdi.h +FILE 2229 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2230 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2231 f:\sp\public\sdk\inc\winnt.h +FILE 2232 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2233 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2234 f:\sp\public\sdk\inc\winnetwk.h +FILE 2235 f:\sp\public\sdk\inc\imm.h +FILE 2236 f:\sp\public\sdk\inc\ddbanned.h +FILE 2237 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2238 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2239 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2240 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2241 f:\sp\public\sdk\inc\winbase.h +FILE 2242 f:\sp\public\sdk\inc\winerror.h +FILE 2243 f:\sp\public\sdk\inc\pshpack1.h +FILE 2244 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2245 f:\sp\vctools\crt_bld\self_x86\crt\src\memory.h +FILE 2246 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2247 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 2248 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2249 f:\sp\public\sdk\inc\pshpack8.h +FILE 2250 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2251 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2252 f:\sp\public\sdk\inc\winver.h +FILE 2253 f:\sp\public\sdk\inc\pshpack4.h +FILE 2254 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2255 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2256 f:\sp\public\sdk\inc\poppack.h +FILE 2257 f:\sp\public\sdk\inc\winnt.h +FILE 2258 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2259 f:\sp\public\sdk\inc\winnetwk.h +FILE 2260 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2261 f:\sp\public\sdk\inc\imm.h +FILE 2262 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2263 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2264 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2265 f:\sp\public\sdk\inc\pshpack1.h +FILE 2266 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2267 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2268 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2269 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2270 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2271 f:\sp\public\sdk\inc\winver.h +FILE 2272 f:\sp\public\sdk\inc\guiddef.h +FILE 2273 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2274 f:\sp\public\sdk\inc\specstrings.h +FILE 2275 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2276 f:\sp\public\sdk\inc\basetsd.h +FILE 2277 f:\sp\public\sdk\inc\windows.h +FILE 2278 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2279 f:\sp\public\sdk\inc\winreg.h +FILE 2280 f:\sp\vctools\crt_bld\self_x86\crt\src\stdenvp.c +FILE 2281 f:\sp\public\sdk\inc\winbase.h +FILE 2282 f:\sp\public\sdk\inc\winerror.h +FILE 2283 f:\sp\public\sdk\inc\pshpack8.h +FILE 2284 f:\sp\public\sdk\inc\reason.h +FILE 2285 f:\sp\public\sdk\inc\ddbanned.h +FILE 2286 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2287 f:\sp\public\sdk\inc\wincon.h +FILE 2288 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2289 f:\sp\public\sdk\inc\pshpack2.h +FILE 2290 f:\sp\public\sdk\inc\mcx.h +FILE 2291 f:\sp\public\sdk\inc\winuser.h +FILE 2292 f:\sp\public\sdk\inc\winnls.h +FILE 2293 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2294 f:\sp\public\sdk\inc\windef.h +FILE 2295 f:\sp\public\sdk\inc\stralign.h +FILE 2296 f:\sp\public\sdk\inc\tvout.h +FILE 2297 f:\sp\public\sdk\inc\winsvc.h +FILE 2298 f:\sp\public\sdk\inc\wingdi.h +FILE 2299 f:\sp\public\sdk\inc\poppack.h +FILE 2300 f:\sp\vctools\crt_bld\self_x86\crt\src\dos.h +FILE 2301 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2302 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2303 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2304 f:\sp\public\sdk\inc\winnetwk.h +FILE 2305 f:\sp\public\sdk\inc\imm.h +FILE 2306 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2307 f:\sp\public\sdk\inc\windef.h +FILE 2308 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2309 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2310 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2311 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2312 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 2313 f:\sp\public\sdk\inc\pshpack1.h +FILE 2314 f:\sp\public\sdk\inc\winver.h +FILE 2315 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2316 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2317 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2318 f:\sp\public\sdk\inc\winnt.h +FILE 2319 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2320 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2321 f:\sp\public\sdk\inc\winreg.h +FILE 2322 f:\sp\vctools\crt_bld\self_x86\crt\src\stdargv.c +FILE 2323 f:\sp\public\sdk\inc\winbase.h +FILE 2324 f:\sp\public\sdk\inc\winerror.h +FILE 2325 f:\sp\public\sdk\inc\pshpack8.h +FILE 2326 f:\sp\public\sdk\inc\reason.h +FILE 2327 f:\sp\public\sdk\inc\wincon.h +FILE 2328 f:\sp\public\sdk\inc\ddbanned.h +FILE 2329 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2330 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2331 f:\sp\public\sdk\inc\pshpack2.h +FILE 2332 f:\sp\public\sdk\inc\mcx.h +FILE 2333 f:\sp\public\sdk\inc\winuser.h +FILE 2334 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2335 f:\sp\public\sdk\inc\winnls.h +FILE 2336 f:\sp\public\sdk\inc\guiddef.h +FILE 2337 f:\sp\public\sdk\inc\windows.h +FILE 2338 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2339 f:\sp\public\sdk\inc\specstrings.h +FILE 2340 f:\sp\public\sdk\inc\basetsd.h +FILE 2341 f:\sp\public\sdk\inc\stralign.h +FILE 2342 f:\sp\public\sdk\inc\tvout.h +FILE 2343 f:\sp\public\sdk\inc\winsvc.h +FILE 2344 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2345 f:\sp\public\sdk\inc\wingdi.h +FILE 2346 f:\sp\public\sdk\inc\pshpack4.h +FILE 2347 f:\sp\public\sdk\inc\reason.h +FILE 2348 f:\sp\public\sdk\inc\wincon.h +FILE 2349 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2350 f:\sp\public\sdk\inc\poppack.h +FILE 2351 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2352 f:\sp\public\sdk\inc\mcx.h +FILE 2353 f:\sp\public\sdk\inc\winuser.h +FILE 2354 f:\sp\public\sdk\inc\winnls.h +FILE 2355 f:\sp\public\sdk\inc\stralign.h +FILE 2356 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2357 f:\sp\public\sdk\inc\windef.h +FILE 2358 f:\sp\public\sdk\inc\tvout.h +FILE 2359 f:\sp\public\sdk\inc\winsvc.h +FILE 2360 f:\sp\public\sdk\inc\wingdi.h +FILE 2361 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2362 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2363 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2364 f:\sp\public\sdk\inc\winnt.h +FILE 2365 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2366 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2367 f:\sp\public\sdk\inc\winnetwk.h +FILE 2368 f:\sp\public\sdk\inc\imm.h +FILE 2369 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 2370 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2371 f:\sp\vctools\crt_bld\self_x86\crt\src\mlock.c +FILE 2372 f:\sp\public\sdk\inc\winbase.h +FILE 2373 f:\sp\public\sdk\inc\winerror.h +FILE 2374 f:\sp\public\sdk\inc\pshpack1.h +FILE 2375 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2376 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2377 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2378 f:\sp\public\sdk\inc\pshpack8.h +FILE 2379 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2380 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2381 f:\sp\public\sdk\inc\winver.h +FILE 2382 f:\sp\public\sdk\inc\ddbanned.h +FILE 2383 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2384 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2385 f:\sp\public\sdk\inc\pshpack2.h +FILE 2386 f:\sp\public\sdk\inc\winreg.h +FILE 2387 f:\sp\public\sdk\inc\guiddef.h +FILE 2388 f:\sp\public\sdk\inc\windows.h +FILE 2389 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2390 f:\sp\public\sdk\inc\specstrings.h +FILE 2391 f:\sp\public\sdk\inc\basetsd.h +FILE 2392 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2393 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2394 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2395 f:\sp\public\sdk\inc\pshpack4.h +FILE 2396 f:\sp\public\sdk\inc\poppack.h +FILE 2397 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2398 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2399 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2400 f:\sp\public\sdk\inc\winnetwk.h +FILE 2401 f:\sp\public\sdk\inc\imm.h +FILE 2402 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2403 f:\sp\public\sdk\inc\windef.h +FILE 2404 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2405 f:\sp\public\sdk\inc\pshpack1.h +FILE 2406 f:\sp\public\sdk\inc\winver.h +FILE 2407 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2408 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2409 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2410 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2411 f:\sp\public\sdk\inc\winnt.h +FILE 2412 f:\sp\vctools\crt_bld\self_x86\crt\src\cmsgs.h +FILE 2413 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2414 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2415 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2416 f:\sp\public\sdk\inc\winreg.h +FILE 2417 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2418 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0msg.c +FILE 2419 f:\sp\public\sdk\inc\winbase.h +FILE 2420 f:\sp\public\sdk\inc\winerror.h +FILE 2421 f:\sp\public\sdk\inc\pshpack8.h +FILE 2422 f:\sp\public\sdk\inc\reason.h +FILE 2423 f:\sp\public\sdk\inc\wincon.h +FILE 2424 f:\sp\public\sdk\inc\ddbanned.h +FILE 2425 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2426 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2427 f:\sp\public\sdk\inc\pshpack2.h +FILE 2428 f:\sp\public\sdk\inc\mcx.h +FILE 2429 f:\sp\public\sdk\inc\winuser.h +FILE 2430 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2431 f:\sp\public\sdk\inc\winnls.h +FILE 2432 f:\sp\public\sdk\inc\guiddef.h +FILE 2433 f:\sp\public\sdk\inc\windows.h +FILE 2434 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2435 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2436 f:\sp\public\sdk\inc\specstrings.h +FILE 2437 f:\sp\public\sdk\inc\basetsd.h +FILE 2438 f:\sp\public\sdk\inc\stralign.h +FILE 2439 f:\sp\public\sdk\inc\tvout.h +FILE 2440 f:\sp\public\sdk\inc\winsvc.h +FILE 2441 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2442 f:\sp\public\sdk\inc\wingdi.h +FILE 2443 f:\sp\public\sdk\inc\pshpack4.h +FILE 2444 f:\sp\public\sdk\inc\pshpack1.h +FILE 2445 f:\sp\public\sdk\inc\winver.h +FILE 2446 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2447 f:\sp\public\sdk\inc\winnt.h +FILE 2448 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2449 f:\sp\public\sdk\inc\winreg.h +FILE 2450 f:\sp\public\sdk\inc\winbase.h +FILE 2451 f:\sp\public\sdk\inc\winerror.h +FILE 2452 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2453 f:\sp\public\sdk\inc\pshpack8.h +FILE 2454 f:\sp\public\sdk\inc\reason.h +FILE 2455 f:\sp\public\sdk\inc\wincon.h +FILE 2456 f:\sp\public\sdk\inc\pshpack2.h +FILE 2457 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0init.c +FILE 2458 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2459 f:\sp\public\sdk\inc\mcx.h +FILE 2460 f:\sp\public\sdk\inc\winuser.h +FILE 2461 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2462 f:\sp\public\sdk\inc\winnls.h +FILE 2463 f:\sp\public\sdk\inc\guiddef.h +FILE 2464 f:\sp\public\sdk\inc\windows.h +FILE 2465 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2466 f:\sp\public\sdk\inc\specstrings.h +FILE 2467 f:\sp\public\sdk\inc\basetsd.h +FILE 2468 f:\sp\public\sdk\inc\stralign.h +FILE 2469 f:\sp\public\sdk\inc\tvout.h +FILE 2470 f:\sp\public\sdk\inc\winsvc.h +FILE 2471 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2472 f:\sp\public\sdk\inc\wingdi.h +FILE 2473 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2474 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2475 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2476 f:\sp\public\sdk\inc\pshpack4.h +FILE 2477 f:\sp\public\sdk\inc\ddbanned.h +FILE 2478 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2479 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2480 f:\sp\public\sdk\inc\poppack.h +FILE 2481 f:\sp\public\sdk\inc\winnetwk.h +FILE 2482 f:\sp\public\sdk\inc\imm.h +FILE 2483 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2484 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2485 f:\sp\public\sdk\inc\windef.h +FILE 2486 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2487 f:\sp\public\sdk\inc\poppack.h +FILE 2488 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2489 f:\sp\public\sdk\inc\winnetwk.h +FILE 2490 f:\sp\public\sdk\inc\imm.h +FILE 2491 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2492 f:\sp\public\sdk\inc\windef.h +FILE 2493 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2494 f:\sp\public\sdk\inc\pshpack1.h +FILE 2495 f:\sp\public\sdk\inc\winver.h +FILE 2496 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2497 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2498 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2499 f:\sp\public\sdk\inc\winnt.h +FILE 2500 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2501 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2502 f:\sp\public\sdk\inc\winreg.h +FILE 2503 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0fp.c +FILE 2504 f:\sp\public\sdk\inc\winbase.h +FILE 2505 f:\sp\public\sdk\inc\winerror.h +FILE 2506 f:\sp\public\sdk\inc\pshpack8.h +FILE 2507 f:\sp\public\sdk\inc\reason.h +FILE 2508 f:\sp\public\sdk\inc\wincon.h +FILE 2509 f:\sp\public\sdk\inc\ddbanned.h +FILE 2510 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2511 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2512 f:\sp\public\sdk\inc\pshpack2.h +FILE 2513 f:\sp\public\sdk\inc\mcx.h +FILE 2514 f:\sp\public\sdk\inc\winuser.h +FILE 2515 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2516 f:\sp\public\sdk\inc\winnls.h +FILE 2517 f:\sp\public\sdk\inc\guiddef.h +FILE 2518 f:\sp\public\sdk\inc\windows.h +FILE 2519 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2520 f:\sp\public\sdk\inc\specstrings.h +FILE 2521 f:\sp\public\sdk\inc\basetsd.h +FILE 2522 f:\sp\public\sdk\inc\stralign.h +FILE 2523 f:\sp\public\sdk\inc\tvout.h +FILE 2524 f:\sp\public\sdk\inc\winsvc.h +FILE 2525 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2526 f:\sp\public\sdk\inc\wingdi.h +FILE 2527 f:\sp\public\sdk\inc\pshpack4.h +FILE 2528 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 2529 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2530 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2531 f:\sp\public\sdk\inc\pshpack4.h +FILE 2532 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2533 f:\sp\public\sdk\inc\reason.h +FILE 2534 f:\sp\public\sdk\inc\wincon.h +FILE 2535 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2536 f:\sp\public\sdk\inc\poppack.h +FILE 2537 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2538 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2539 f:\sp\public\sdk\inc\mcx.h +FILE 2540 f:\sp\public\sdk\inc\winuser.h +FILE 2541 f:\sp\public\sdk\inc\winnls.h +FILE 2542 f:\sp\public\sdk\inc\stralign.h +FILE 2543 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2544 f:\sp\public\sdk\inc\windef.h +FILE 2545 f:\sp\public\sdk\inc\tvout.h +FILE 2546 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2547 f:\sp\public\sdk\inc\winsvc.h +FILE 2548 f:\sp\public\sdk\inc\wingdi.h +FILE 2549 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 2550 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 2551 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2552 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2553 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 2554 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 2555 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2556 f:\sp\public\sdk\inc\winnt.h +FILE 2557 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2558 f:\sp\public\sdk\inc\winnetwk.h +FILE 2559 f:\sp\public\sdk\inc\imm.h +FILE 2560 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0dat.c +FILE 2561 f:\sp\public\sdk\inc\winbase.h +FILE 2562 f:\sp\public\sdk\inc\winerror.h +FILE 2563 f:\sp\public\sdk\inc\pshpack1.h +FILE 2564 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2565 f:\sp\public\sdk\inc\pshpack8.h +FILE 2566 f:\sp\public\sdk\inc\winver.h +FILE 2567 f:\sp\public\sdk\inc\ddbanned.h +FILE 2568 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2569 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2570 f:\sp\vctools\crt_bld\self_x86\crt\src\dos.h +FILE 2571 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2572 f:\sp\public\sdk\inc\pshpack2.h +FILE 2573 f:\sp\public\sdk\inc\winreg.h +FILE 2574 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2575 f:\sp\public\sdk\inc\guiddef.h +FILE 2576 f:\sp\public\sdk\inc\windows.h +FILE 2577 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2578 f:\sp\public\sdk\inc\specstrings.h +FILE 2579 f:\sp\public\sdk\inc\basetsd.h +FILE 2580 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2581 f:\sp\public\sdk\inc\tvout.h +FILE 2582 f:\sp\public\sdk\inc\winsvc.h +FILE 2583 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2584 f:\sp\public\sdk\inc\wingdi.h +FILE 2585 f:\sp\public\sdk\inc\pshpack4.h +FILE 2586 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2587 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2588 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 2589 f:\sp\public\sdk\inc\poppack.h +FILE 2590 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 2591 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2592 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2593 f:\sp\public\sdk\inc\winnetwk.h +FILE 2594 f:\sp\public\sdk\inc\imm.h +FILE 2595 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2596 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2597 f:\sp\public\sdk\inc\windef.h +FILE 2598 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2599 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2600 f:\sp\vctools\crt_bld\self_x86\crt\src\dos.h +FILE 2601 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2602 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2603 f:\sp\public\sdk\inc\pshpack1.h +FILE 2604 f:\sp\public\sdk\inc\winver.h +FILE 2605 f:\sp\public\sdk\inc\winnt.h +FILE 2606 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2607 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2608 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0.c +FILE 2609 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2610 f:\sp\public\sdk\inc\winreg.h +FILE 2611 f:\sp\public\sdk\inc\winbase.h +FILE 2612 f:\sp\public\sdk\inc\winerror.h +FILE 2613 f:\sp\public\sdk\inc\ddbanned.h +FILE 2614 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2615 f:\sp\public\sdk\inc\pshpack8.h +FILE 2616 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2617 f:\sp\public\sdk\inc\reason.h +FILE 2618 f:\sp\public\sdk\inc\wincon.h +FILE 2619 f:\sp\public\sdk\inc\pshpack2.h +FILE 2620 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2621 f:\sp\public\sdk\inc\mcx.h +FILE 2622 f:\sp\public\sdk\inc\winuser.h +FILE 2623 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2624 f:\sp\public\sdk\inc\winnls.h +FILE 2625 f:\sp\public\sdk\inc\guiddef.h +FILE 2626 f:\sp\public\sdk\inc\windows.h +FILE 2627 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2628 f:\sp\public\sdk\inc\specstrings.h +FILE 2629 f:\sp\public\sdk\inc\basetsd.h +FILE 2630 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2631 f:\sp\public\sdk\inc\stralign.h +FILE 2632 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\alloca16.asm +FILE 2633 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 2634 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\chkstk.asm +FILE 2635 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 2636 f:\sp\public\sdk\inc\wincon.h +FILE 2637 f:\sp\public\sdk\inc\imm.h +FILE 2638 f:\sp\public\sdk\inc\winbase.h +FILE 2639 f:\sp\public\sdk\inc\wingdi.h +FILE 2640 f:\sp\public\sdk\inc\winver.h +FILE 2641 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 2642 f:\sp\public\sdk\inc\windows.h +FILE 2643 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 2644 f:\sp\public\sdk\inc\pshpack2.h +FILE 2645 f:\sp\public\sdk\inc\reason.h +FILE 2646 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\rtc\initsect.cpp +FILE 2647 f:\sp\public\sdk\inc\specstrings.h +FILE 2648 f:\sp\public\sdk\inc\basetsd.h +FILE 2649 f:\sp\public\sdk\inc\pshpack4.h +FILE 2650 f:\sp\public\sdk\inc\winnetwk.h +FILE 2651 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 2652 f:\sp\public\sdk\inc\stralign.h +FILE 2653 f:\sp\public\sdk\inc\poppack.h +FILE 2654 f:\sp\public\sdk\inc\winsvc.h +FILE 2655 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 2656 f:\sp\public\sdk\inc\windef.h +FILE 2657 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 2658 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 2659 f:\sp\public\sdk\inc\winuser.h +FILE 2660 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 2661 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 2662 f:\sp\public\sdk\inc\mcx.h +FILE 2663 f:\sp\public\sdk\inc\pshpack8.h +FILE 2664 f:\sp\public\sdk\inc\guiddef.h +FILE 2665 f:\sp\public\sdk\inc\winnt.h +FILE 2666 f:\sp\public\sdk\inc\winnls.h +FILE 2667 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 2668 f:\sp\public\sdk\inc\pshpack1.h +FILE 2669 f:\sp\public\sdk\inc\winerror.h +FILE 2670 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\rtcapi.h +FILE 2671 f:\sp\public\sdk\inc\winreg.h +FILE 2672 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 2673 f:\sp\public\sdk\inc\ddbanned.h +FILE 2674 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 2675 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 2676 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\rtcpriv.h +FILE 2677 f:\sp\public\sdk\inc\tvout.h +FILE 2678 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 2679 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 2680 f:\sp\public\sdk\inc\poppack.h +FILE 2681 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2682 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2683 f:\sp\public\sdk\inc\winnetwk.h +FILE 2684 f:\sp\public\sdk\inc\imm.h +FILE 2685 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2686 f:\sp\public\sdk\inc\windef.h +FILE 2687 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2688 f:\sp\public\sdk\inc\pshpack1.h +FILE 2689 f:\sp\public\sdk\inc\winver.h +FILE 2690 f:\sp\public\sdk\inc\windows.h +FILE 2691 f:\sp\public\sdk\inc\winnt.h +FILE 2692 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2693 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2694 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2695 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2696 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2697 f:\sp\public\sdk\inc\winreg.h +FILE 2698 f:\sp\public\sdk\inc\winbase.h +FILE 2699 f:\sp\vctools\crt_bld\self_x86\crt\src\wtombenv.c +FILE 2700 f:\sp\public\sdk\inc\winerror.h +FILE 2701 f:\sp\public\sdk\inc\pshpack8.h +FILE 2702 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2703 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2704 f:\sp\public\sdk\inc\reason.h +FILE 2705 f:\sp\public\sdk\inc\wincon.h +FILE 2706 f:\sp\public\sdk\inc\ddbanned.h +FILE 2707 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2708 f:\sp\public\sdk\inc\pshpack2.h +FILE 2709 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2710 f:\sp\public\sdk\inc\mcx.h +FILE 2711 f:\sp\public\sdk\inc\winuser.h +FILE 2712 f:\sp\public\sdk\inc\winnls.h +FILE 2713 f:\sp\public\sdk\inc\guiddef.h +FILE 2714 f:\sp\public\sdk\inc\specstrings.h +FILE 2715 f:\sp\public\sdk\inc\basetsd.h +FILE 2716 f:\sp\public\sdk\inc\stralign.h +FILE 2717 f:\sp\public\sdk\inc\tvout.h +FILE 2718 f:\sp\public\sdk\inc\winsvc.h +FILE 2719 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2720 f:\sp\public\sdk\inc\wingdi.h +FILE 2721 f:\sp\public\sdk\inc\pshpack4.h +FILE 2722 f:\sp\public\sdk\inc\winnt.h +FILE 2723 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2724 f:\sp\public\sdk\inc\winreg.h +FILE 2725 f:\sp\public\sdk\inc\winbase.h +FILE 2726 f:\sp\public\sdk\inc\winerror.h +FILE 2727 f:\sp\public\sdk\inc\pshpack8.h +FILE 2728 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2729 f:\sp\public\sdk\inc\reason.h +FILE 2730 f:\sp\public\sdk\inc\wincon.h +FILE 2731 f:\sp\vctools\crt_bld\self_x86\crt\src\float.h +FILE 2732 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2733 f:\sp\public\sdk\inc\pshpack2.h +FILE 2734 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2735 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2736 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2737 f:\sp\public\sdk\inc\mcx.h +FILE 2738 f:\sp\public\sdk\inc\winuser.h +FILE 2739 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2740 f:\sp\public\sdk\inc\winnls.h +FILE 2741 f:\sp\public\sdk\inc\guiddef.h +FILE 2742 f:\sp\public\sdk\inc\windows.h +FILE 2743 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2744 f:\sp\public\sdk\inc\specstrings.h +FILE 2745 f:\sp\public\sdk\inc\basetsd.h +FILE 2746 f:\sp\public\sdk\inc\stralign.h +FILE 2747 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2748 f:\sp\vctools\crt_bld\self_x86\crt\src\signal.h +FILE 2749 f:\sp\public\sdk\inc\tvout.h +FILE 2750 f:\sp\public\sdk\inc\winsvc.h +FILE 2751 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2752 f:\sp\vctools\crt_bld\self_x86\crt\src\winxfltr.c +FILE 2753 f:\sp\public\sdk\inc\wingdi.h +FILE 2754 f:\sp\public\sdk\inc\pshpack4.h +FILE 2755 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2756 f:\sp\public\sdk\inc\poppack.h +FILE 2757 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2758 f:\sp\public\sdk\inc\winnetwk.h +FILE 2759 f:\sp\public\sdk\inc\imm.h +FILE 2760 f:\sp\public\sdk\inc\ddbanned.h +FILE 2761 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2762 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2763 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2764 f:\sp\public\sdk\inc\windef.h +FILE 2765 f:\sp\vctools\crt_bld\self_x86\crt\src\crtwrn.h +FILE 2766 f:\sp\public\sdk\inc\pshpack1.h +FILE 2767 f:\sp\public\sdk\inc\winver.h +FILE 2768 f:\sp\public\sdk\inc\winnetwk.h +FILE 2769 f:\sp\public\sdk\inc\imm.h +FILE 2770 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2771 f:\sp\public\sdk\inc\windef.h +FILE 2772 f:\sp\public\sdk\inc\pshpack1.h +FILE 2773 f:\sp\public\sdk\inc\winver.h +FILE 2774 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2775 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2776 f:\sp\public\sdk\inc\winnt.h +FILE 2777 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2778 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2779 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2780 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2781 f:\sp\public\sdk\inc\winreg.h +FILE 2782 f:\sp\public\sdk\inc\winbase.h +FILE 2783 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2784 f:\sp\public\sdk\inc\winerror.h +FILE 2785 f:\sp\vctools\crt_bld\self_x86\crt\src\winsig.c +FILE 2786 f:\sp\public\sdk\inc\pshpack8.h +FILE 2787 f:\sp\public\sdk\inc\reason.h +FILE 2788 f:\sp\public\sdk\inc\wincon.h +FILE 2789 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2790 f:\sp\public\sdk\inc\pshpack2.h +FILE 2791 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2792 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2793 f:\sp\public\sdk\inc\mcx.h +FILE 2794 f:\sp\public\sdk\inc\winuser.h +FILE 2795 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2796 f:\sp\public\sdk\inc\winnls.h +FILE 2797 f:\sp\public\sdk\inc\guiddef.h +FILE 2798 f:\sp\public\sdk\inc\windows.h +FILE 2799 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2800 f:\sp\public\sdk\inc\specstrings.h +FILE 2801 f:\sp\public\sdk\inc\ddbanned.h +FILE 2802 f:\sp\public\sdk\inc\basetsd.h +FILE 2803 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2804 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2805 f:\sp\public\sdk\inc\stralign.h +FILE 2806 f:\sp\vctools\crt_bld\self_x86\crt\src\signal.h +FILE 2807 f:\sp\public\sdk\inc\tvout.h +FILE 2808 f:\sp\public\sdk\inc\winsvc.h +FILE 2809 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2810 f:\sp\public\sdk\inc\wingdi.h +FILE 2811 f:\sp\vctools\crt_bld\self_x86\crt\src\float.h +FILE 2812 f:\sp\vctools\crt_bld\self_x86\crt\src\crtwrn.h +FILE 2813 f:\sp\public\sdk\inc\pshpack4.h +FILE 2814 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2815 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2816 f:\sp\public\sdk\inc\poppack.h +FILE 2817 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2818 f:\sp\public\sdk\inc\wincon.h +FILE 2819 f:\sp\public\sdk\inc\imm.h +FILE 2820 f:\sp\public\sdk\inc\winbase.h +FILE 2821 f:\sp\public\sdk\inc\wingdi.h +FILE 2822 f:\sp\public\sdk\inc\winver.h +FILE 2823 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2824 f:\sp\public\sdk\inc\windows.h +FILE 2825 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2826 f:\sp\public\sdk\inc\pshpack2.h +FILE 2827 f:\sp\public\sdk\inc\reason.h +FILE 2828 f:\sp\vctools\crt_bld\self_x86\crt\src\w_str.c +FILE 2829 f:\sp\public\sdk\inc\specstrings.h +FILE 2830 f:\sp\public\sdk\inc\basetsd.h +FILE 2831 f:\sp\public\sdk\inc\pshpack4.h +FILE 2832 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2833 f:\sp\public\sdk\inc\winnetwk.h +FILE 2834 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2835 f:\sp\public\sdk\inc\stralign.h +FILE 2836 f:\sp\public\sdk\inc\poppack.h +FILE 2837 f:\sp\public\sdk\inc\winsvc.h +FILE 2838 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2839 f:\sp\public\sdk\inc\windef.h +FILE 2840 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2841 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2842 f:\sp\public\sdk\inc\winuser.h +FILE 2843 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2844 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2845 f:\sp\public\sdk\inc\mcx.h +FILE 2846 f:\sp\public\sdk\inc\pshpack8.h +FILE 2847 f:\sp\public\sdk\inc\guiddef.h +FILE 2848 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2849 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2850 f:\sp\public\sdk\inc\winnt.h +FILE 2851 f:\sp\public\sdk\inc\winnls.h +FILE 2852 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2853 f:\sp\public\sdk\inc\pshpack1.h +FILE 2854 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2855 f:\sp\public\sdk\inc\winerror.h +FILE 2856 f:\sp\public\sdk\inc\winreg.h +FILE 2857 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2858 f:\sp\public\sdk\inc\ddbanned.h +FILE 2859 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2860 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2861 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2862 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2863 f:\sp\public\sdk\inc\tvout.h +FILE 2864 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2865 f:\sp\public\sdk\inc\wincon.h +FILE 2866 f:\sp\public\sdk\inc\imm.h +FILE 2867 f:\sp\public\sdk\inc\winbase.h +FILE 2868 f:\sp\public\sdk\inc\wingdi.h +FILE 2869 f:\sp\public\sdk\inc\winver.h +FILE 2870 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2871 f:\sp\public\sdk\inc\windows.h +FILE 2872 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2873 f:\sp\public\sdk\inc\pshpack2.h +FILE 2874 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2875 f:\sp\public\sdk\inc\reason.h +FILE 2876 f:\sp\vctools\crt_bld\self_x86\crt\src\w_loc.c +FILE 2877 f:\sp\public\sdk\inc\specstrings.h +FILE 2878 f:\sp\public\sdk\inc\basetsd.h +FILE 2879 f:\sp\public\sdk\inc\pshpack4.h +FILE 2880 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2881 f:\sp\public\sdk\inc\winnetwk.h +FILE 2882 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2883 f:\sp\public\sdk\inc\stralign.h +FILE 2884 f:\sp\public\sdk\inc\poppack.h +FILE 2885 f:\sp\public\sdk\inc\winsvc.h +FILE 2886 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2887 f:\sp\public\sdk\inc\windef.h +FILE 2888 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2889 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2890 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2891 f:\sp\public\sdk\inc\winuser.h +FILE 2892 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2893 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2894 f:\sp\public\sdk\inc\mcx.h +FILE 2895 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2896 f:\sp\public\sdk\inc\pshpack8.h +FILE 2897 f:\sp\public\sdk\inc\guiddef.h +FILE 2898 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2899 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2900 f:\sp\public\sdk\inc\winnt.h +FILE 2901 f:\sp\public\sdk\inc\winnls.h +FILE 2902 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2903 f:\sp\public\sdk\inc\pshpack1.h +FILE 2904 f:\sp\public\sdk\inc\winerror.h +FILE 2905 f:\sp\public\sdk\inc\winreg.h +FILE 2906 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2907 f:\sp\public\sdk\inc\ddbanned.h +FILE 2908 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2909 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2910 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2911 f:\sp\public\sdk\inc\tvout.h +FILE 2912 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2913 f:\sp\public\sdk\inc\poppack.h +FILE 2914 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2915 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2916 f:\sp\public\sdk\inc\winnetwk.h +FILE 2917 f:\sp\public\sdk\inc\imm.h +FILE 2918 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2919 f:\sp\public\sdk\inc\windef.h +FILE 2920 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2921 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 2922 f:\sp\public\sdk\inc\pshpack1.h +FILE 2923 f:\sp\public\sdk\inc\winver.h +FILE 2924 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2925 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2926 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2927 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2928 f:\sp\public\sdk\inc\winnt.h +FILE 2929 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2930 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2931 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2932 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2933 f:\sp\public\sdk\inc\winreg.h +FILE 2934 f:\sp\vctools\crt_bld\self_x86\crt\src\convrtcp.c +FILE 2935 f:\sp\public\sdk\inc\winbase.h +FILE 2936 f:\sp\public\sdk\inc\winerror.h +FILE 2937 f:\sp\public\sdk\inc\pshpack8.h +FILE 2938 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2939 f:\sp\public\sdk\inc\reason.h +FILE 2940 f:\sp\public\sdk\inc\wincon.h +FILE 2941 f:\sp\public\sdk\inc\ddbanned.h +FILE 2942 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2943 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2944 f:\sp\public\sdk\inc\pshpack2.h +FILE 2945 f:\sp\public\sdk\inc\mcx.h +FILE 2946 f:\sp\public\sdk\inc\winuser.h +FILE 2947 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2948 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 2949 f:\sp\public\sdk\inc\winnls.h +FILE 2950 f:\sp\public\sdk\inc\guiddef.h +FILE 2951 f:\sp\public\sdk\inc\windows.h +FILE 2952 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2953 f:\sp\public\sdk\inc\specstrings.h +FILE 2954 f:\sp\public\sdk\inc\basetsd.h +FILE 2955 f:\sp\public\sdk\inc\stralign.h +FILE 2956 f:\sp\public\sdk\inc\tvout.h +FILE 2957 f:\sp\public\sdk\inc\winsvc.h +FILE 2958 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2959 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2960 f:\sp\public\sdk\inc\wingdi.h +FILE 2961 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2962 f:\sp\public\sdk\inc\pshpack4.h +FILE 2963 f:\sp\public\sdk\inc\winerror.h +FILE 2964 f:\sp\public\sdk\inc\pshpack8.h +FILE 2965 f:\sp\public\sdk\inc\reason.h +FILE 2966 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2967 f:\sp\public\sdk\inc\wincon.h +FILE 2968 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2969 f:\sp\public\sdk\inc\pshpack2.h +FILE 2970 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2971 f:\sp\public\sdk\inc\mcx.h +FILE 2972 f:\sp\public\sdk\inc\winuser.h +FILE 2973 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2974 f:\sp\public\sdk\inc\winnls.h +FILE 2975 f:\sp\public\sdk\inc\guiddef.h +FILE 2976 f:\sp\public\sdk\inc\windows.h +FILE 2977 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 2978 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2979 f:\sp\public\sdk\inc\specstrings.h +FILE 2980 f:\sp\public\sdk\inc\basetsd.h +FILE 2981 f:\sp\public\sdk\inc\stralign.h +FILE 2982 f:\sp\public\sdk\inc\tvout.h +FILE 2983 f:\sp\public\sdk\inc\winsvc.h +FILE 2984 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2985 f:\sp\public\sdk\inc\wingdi.h +FILE 2986 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2987 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2988 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2989 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2990 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2991 f:\sp\public\sdk\inc\pshpack4.h +FILE 2992 f:\sp\public\sdk\inc\poppack.h +FILE 2993 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2994 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2995 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.c +FILE 2996 f:\sp\public\sdk\inc\winnetwk.h +FILE 2997 f:\sp\public\sdk\inc\imm.h +FILE 2998 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2999 f:\sp\public\sdk\inc\windef.h +FILE 3000 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3001 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3002 f:\sp\public\sdk\inc\pshpack1.h +FILE 3003 f:\sp\public\sdk\inc\ddbanned.h +FILE 3004 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3005 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3006 f:\sp\public\sdk\inc\winver.h +FILE 3007 f:\sp\public\sdk\inc\winnt.h +FILE 3008 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3009 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3010 f:\sp\public\sdk\inc\winreg.h +FILE 3011 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3012 f:\sp\public\sdk\inc\winbase.h +FILE 3013 f:\sp\public\sdk\inc\poppack.h +FILE 3014 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 3015 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 3016 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3017 f:\sp\public\sdk\inc\winnetwk.h +FILE 3018 f:\sp\public\sdk\inc\imm.h +FILE 3019 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3020 f:\sp\public\sdk\inc\windef.h +FILE 3021 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3022 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3023 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3024 f:\sp\public\sdk\inc\pshpack1.h +FILE 3025 f:\sp\public\sdk\inc\winver.h +FILE 3026 f:\sp\public\sdk\inc\windows.h +FILE 3027 f:\sp\public\sdk\inc\winnt.h +FILE 3028 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3029 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3030 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3031 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3032 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3033 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3034 f:\sp\public\sdk\inc\winreg.h +FILE 3035 f:\sp\public\sdk\inc\winbase.h +FILE 3036 f:\sp\vctools\crt_bld\self_x86\crt\src\setenv.c +FILE 3037 f:\sp\public\sdk\inc\winerror.h +FILE 3038 f:\sp\public\sdk\inc\pshpack8.h +FILE 3039 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3040 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3041 f:\sp\public\sdk\inc\reason.h +FILE 3042 f:\sp\public\sdk\inc\wincon.h +FILE 3043 f:\sp\public\sdk\inc\ddbanned.h +FILE 3044 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3045 f:\sp\public\sdk\inc\pshpack2.h +FILE 3046 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3047 f:\sp\public\sdk\inc\mcx.h +FILE 3048 f:\sp\public\sdk\inc\winuser.h +FILE 3049 f:\sp\public\sdk\inc\winnls.h +FILE 3050 f:\sp\public\sdk\inc\guiddef.h +FILE 3051 f:\sp\public\sdk\inc\specstrings.h +FILE 3052 f:\sp\public\sdk\inc\basetsd.h +FILE 3053 f:\sp\public\sdk\inc\stralign.h +FILE 3054 f:\sp\public\sdk\inc\tvout.h +FILE 3055 f:\sp\public\sdk\inc\winsvc.h +FILE 3056 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3057 f:\sp\public\sdk\inc\wingdi.h +FILE 3058 f:\sp\public\sdk\inc\pshpack4.h +FILE 3059 f:\sp\public\sdk\inc\poppack.h +FILE 3060 f:\sp\public\sdk\inc\winnetwk.h +FILE 3061 f:\sp\public\sdk\inc\imm.h +FILE 3062 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3063 f:\sp\public\sdk\inc\windef.h +FILE 3064 f:\sp\public\sdk\inc\pshpack1.h +FILE 3065 f:\sp\public\sdk\inc\winver.h +FILE 3066 f:\sp\public\sdk\inc\windows.h +FILE 3067 f:\sp\public\sdk\inc\winnt.h +FILE 3068 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3069 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3070 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3071 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3072 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3073 f:\sp\public\sdk\inc\winreg.h +FILE 3074 f:\sp\public\sdk\inc\winbase.h +FILE 3075 f:\sp\vctools\crt_bld\self_x86\crt\src\rand_s.c +FILE 3076 f:\sp\public\sdk\inc\winerror.h +FILE 3077 f:\sp\public\sdk\inc\pshpack8.h +FILE 3078 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3079 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3080 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3081 f:\sp\public\sdk\inc\reason.h +FILE 3082 f:\sp\public\sdk\inc\wincon.h +FILE 3083 f:\sp\public\sdk\inc\ddbanned.h +FILE 3084 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3085 f:\sp\public\sdk\inc\pshpack2.h +FILE 3086 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3087 f:\sp\public\sdk\inc\mcx.h +FILE 3088 f:\sp\public\sdk\inc\winuser.h +FILE 3089 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 3090 f:\sp\public\sdk\inc\winnls.h +FILE 3091 f:\sp\public\sdk\inc\guiddef.h +FILE 3092 f:\sp\public\sdk\inc\specstrings.h +FILE 3093 f:\sp\public\sdk\inc\basetsd.h +FILE 3094 f:\sp\public\sdk\inc\stralign.h +FILE 3095 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3096 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3097 f:\sp\public\sdk\inc\tvout.h +FILE 3098 f:\sp\public\sdk\inc\winsvc.h +FILE 3099 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3100 f:\sp\public\sdk\inc\wingdi.h +FILE 3101 f:\sp\public\sdk\inc\pshpack4.h +FILE 3102 f:\sp\public\sdk\inc\poppack.h +FILE 3103 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3104 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3105 f:\sp\public\sdk\inc\winnetwk.h +FILE 3106 f:\sp\public\sdk\inc\imm.h +FILE 3107 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3108 f:\sp\public\sdk\inc\windef.h +FILE 3109 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3110 f:\sp\public\sdk\inc\pshpack1.h +FILE 3111 f:\sp\public\sdk\inc\winver.h +FILE 3112 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3113 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3114 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3115 f:\sp\public\sdk\inc\winnt.h +FILE 3116 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3117 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3118 f:\sp\public\sdk\inc\winreg.h +FILE 3119 f:\sp\vctools\crt_bld\self_x86\crt\src\purevirt.c +FILE 3120 f:\sp\public\sdk\inc\winbase.h +FILE 3121 f:\sp\public\sdk\inc\winerror.h +FILE 3122 f:\sp\public\sdk\inc\pshpack8.h +FILE 3123 f:\sp\public\sdk\inc\reason.h +FILE 3124 f:\sp\public\sdk\inc\wincon.h +FILE 3125 f:\sp\public\sdk\inc\ddbanned.h +FILE 3126 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3127 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3128 f:\sp\public\sdk\inc\pshpack2.h +FILE 3129 f:\sp\public\sdk\inc\mcx.h +FILE 3130 f:\sp\public\sdk\inc\winuser.h +FILE 3131 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3132 f:\sp\public\sdk\inc\winnls.h +FILE 3133 f:\sp\public\sdk\inc\guiddef.h +FILE 3134 f:\sp\public\sdk\inc\windows.h +FILE 3135 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3136 f:\sp\public\sdk\inc\specstrings.h +FILE 3137 f:\sp\public\sdk\inc\basetsd.h +FILE 3138 f:\sp\public\sdk\inc\stralign.h +FILE 3139 f:\sp\public\sdk\inc\tvout.h +FILE 3140 f:\sp\public\sdk\inc\winsvc.h +FILE 3141 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3142 f:\sp\public\sdk\inc\wingdi.h +FILE 3143 f:\sp\public\sdk\inc\pshpack4.h +FILE 3144 f:\sp\public\sdk\inc\poppack.h +FILE 3145 f:\sp\public\sdk\inc\winnetwk.h +FILE 3146 f:\sp\public\sdk\inc\imm.h +FILE 3147 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3148 f:\sp\public\sdk\inc\windef.h +FILE 3149 f:\sp\public\sdk\inc\pshpack1.h +FILE 3150 f:\sp\public\sdk\inc\winver.h +FILE 3151 f:\sp\public\sdk\inc\windows.h +FILE 3152 f:\sp\public\sdk\inc\winnt.h +FILE 3153 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3154 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3155 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3156 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3157 f:\sp\public\sdk\inc\winreg.h +FILE 3158 f:\sp\public\sdk\inc\winbase.h +FILE 3159 f:\sp\vctools\crt_bld\self_x86\crt\src\pesect.c +FILE 3160 f:\sp\public\sdk\inc\winerror.h +FILE 3161 f:\sp\public\sdk\inc\pshpack8.h +FILE 3162 f:\sp\public\sdk\inc\reason.h +FILE 3163 f:\sp\public\sdk\inc\wincon.h +FILE 3164 f:\sp\public\sdk\inc\ddbanned.h +FILE 3165 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3166 f:\sp\public\sdk\inc\pshpack2.h +FILE 3167 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3168 f:\sp\public\sdk\inc\mcx.h +FILE 3169 f:\sp\public\sdk\inc\winuser.h +FILE 3170 f:\sp\public\sdk\inc\winnls.h +FILE 3171 f:\sp\public\sdk\inc\guiddef.h +FILE 3172 f:\sp\public\sdk\inc\specstrings.h +FILE 3173 f:\sp\public\sdk\inc\basetsd.h +FILE 3174 f:\sp\public\sdk\inc\stralign.h +FILE 3175 f:\sp\public\sdk\inc\tvout.h +FILE 3176 f:\sp\public\sdk\inc\winsvc.h +FILE 3177 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3178 f:\sp\public\sdk\inc\wingdi.h +FILE 3179 f:\sp\public\sdk\inc\pshpack4.h +FILE 3180 f:\sp\public\sdk\inc\winerror.h +FILE 3181 f:\sp\public\sdk\inc\pshpack1.h +FILE 3182 f:\sp\public\sdk\inc\pshpack8.h +FILE 3183 f:\sp\public\sdk\inc\winver.h +FILE 3184 f:\sp\public\sdk\inc\pshpack2.h +FILE 3185 f:\sp\public\sdk\inc\winreg.h +FILE 3186 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3187 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3188 f:\sp\public\sdk\inc\guiddef.h +FILE 3189 f:\sp\public\sdk\inc\windows.h +FILE 3190 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3191 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 3192 f:\sp\public\sdk\inc\specstrings.h +FILE 3193 f:\sp\public\sdk\inc\basetsd.h +FILE 3194 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3195 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3196 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3197 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3198 f:\sp\public\sdk\inc\pshpack4.h +FILE 3199 f:\sp\public\sdk\inc\reason.h +FILE 3200 f:\sp\public\sdk\inc\wincon.h +FILE 3201 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3202 f:\sp\public\sdk\inc\poppack.h +FILE 3203 f:\sp\public\sdk\inc\mcx.h +FILE 3204 f:\sp\public\sdk\inc\winuser.h +FILE 3205 f:\sp\public\sdk\inc\winnls.h +FILE 3206 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsdata2.c +FILE 3207 f:\sp\public\sdk\inc\stralign.h +FILE 3208 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3209 f:\sp\public\sdk\inc\windef.h +FILE 3210 f:\sp\public\sdk\inc\tvout.h +FILE 3211 f:\sp\public\sdk\inc\winsvc.h +FILE 3212 f:\sp\public\sdk\inc\wingdi.h +FILE 3213 f:\sp\public\sdk\inc\ddbanned.h +FILE 3214 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3215 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3216 f:\sp\public\sdk\inc\winnt.h +FILE 3217 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3218 f:\sp\public\sdk\inc\winnetwk.h +FILE 3219 f:\sp\public\sdk\inc\imm.h +FILE 3220 f:\sp\public\sdk\inc\winbase.h +FILE 3221 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3222 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3223 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3224 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsdata1.c +FILE 3225 f:\sp\public\sdk\inc\ddbanned.h +FILE 3226 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3227 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3228 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3229 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsint.h +FILE 3230 f:\sp\public\sdk\inc\reason.h +FILE 3231 f:\sp\public\sdk\inc\wincon.h +FILE 3232 f:\sp\public\sdk\inc\pshpack2.h +FILE 3233 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3234 f:\sp\public\sdk\inc\mcx.h +FILE 3235 f:\sp\public\sdk\inc\winuser.h +FILE 3236 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3237 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3238 f:\sp\public\sdk\inc\winnls.h +FILE 3239 f:\sp\public\sdk\inc\guiddef.h +FILE 3240 f:\sp\public\sdk\inc\windows.h +FILE 3241 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3242 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3243 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3244 f:\sp\public\sdk\inc\specstrings.h +FILE 3245 f:\sp\public\sdk\inc\basetsd.h +FILE 3246 f:\sp\public\sdk\inc\stralign.h +FILE 3247 f:\sp\public\sdk\inc\tvout.h +FILE 3248 f:\sp\public\sdk\inc\winsvc.h +FILE 3249 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3250 f:\sp\public\sdk\inc\wingdi.h +FILE 3251 f:\sp\public\sdk\inc\pshpack4.h +FILE 3252 f:\sp\public\sdk\inc\poppack.h +FILE 3253 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 3254 f:\sp\public\sdk\inc\winnetwk.h +FILE 3255 f:\sp\public\sdk\inc\imm.h +FILE 3256 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3257 f:\sp\public\sdk\inc\windef.h +FILE 3258 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3259 f:\sp\vctools\crt_bld\self_x86\crt\src\onexit.c +FILE 3260 f:\sp\public\sdk\inc\pshpack1.h +FILE 3261 f:\sp\public\sdk\inc\winver.h +FILE 3262 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3263 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3264 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3265 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3266 f:\sp\public\sdk\inc\winnt.h +FILE 3267 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3268 f:\sp\public\sdk\inc\ddbanned.h +FILE 3269 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3270 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3271 f:\sp\public\sdk\inc\winreg.h +FILE 3272 f:\sp\public\sdk\inc\winbase.h +FILE 3273 f:\sp\public\sdk\inc\winerror.h +FILE 3274 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3275 f:\sp\public\sdk\inc\pshpack8.h +FILE 3276 f:\sp\public\sdk\inc\winbase.h +FILE 3277 f:\sp\public\sdk\inc\winerror.h +FILE 3278 f:\sp\public\sdk\inc\pshpack1.h +FILE 3279 f:\sp\public\sdk\inc\pshpack8.h +FILE 3280 f:\sp\public\sdk\inc\winver.h +FILE 3281 f:\sp\public\sdk\inc\pshpack2.h +FILE 3282 f:\sp\public\sdk\inc\winreg.h +FILE 3283 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3284 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3285 f:\sp\public\sdk\inc\guiddef.h +FILE 3286 f:\sp\public\sdk\inc\windows.h +FILE 3287 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3288 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3289 f:\sp\public\sdk\inc\specstrings.h +FILE 3290 f:\sp\public\sdk\inc\basetsd.h +FILE 3291 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3292 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3293 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3294 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3295 f:\sp\public\sdk\inc\pshpack4.h +FILE 3296 f:\sp\public\sdk\inc\reason.h +FILE 3297 f:\sp\public\sdk\inc\wincon.h +FILE 3298 f:\sp\public\sdk\inc\poppack.h +FILE 3299 f:\sp\public\sdk\inc\mcx.h +FILE 3300 f:\sp\public\sdk\inc\winuser.h +FILE 3301 f:\sp\public\sdk\inc\winnls.h +FILE 3302 f:\sp\vctools\crt_bld\self_x86\crt\src\lconv.c +FILE 3303 f:\sp\public\sdk\inc\stralign.h +FILE 3304 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3305 f:\sp\public\sdk\inc\windef.h +FILE 3306 f:\sp\public\sdk\inc\tvout.h +FILE 3307 f:\sp\public\sdk\inc\winsvc.h +FILE 3308 f:\sp\public\sdk\inc\wingdi.h +FILE 3309 f:\sp\public\sdk\inc\ddbanned.h +FILE 3310 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3311 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3312 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3313 f:\sp\public\sdk\inc\winnt.h +FILE 3314 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3315 f:\sp\public\sdk\inc\winnetwk.h +FILE 3316 f:\sp\public\sdk\inc\imm.h +FILE 3317 f:\sp\public\sdk\inc\guiddef.h +FILE 3318 f:\sp\public\sdk\inc\winnt.h +FILE 3319 f:\sp\public\sdk\inc\winnls.h +FILE 3320 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3321 f:\sp\public\sdk\inc\pshpack1.h +FILE 3322 f:\sp\public\sdk\inc\winerror.h +FILE 3323 f:\sp\public\sdk\inc\winreg.h +FILE 3324 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3325 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3326 f:\sp\public\sdk\inc\tvout.h +FILE 3327 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3328 f:\sp\vctools\crt_bld\self_x86\crt\src\invarg.c +FILE 3329 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3330 f:\sp\public\sdk\inc\wincon.h +FILE 3331 f:\sp\public\sdk\inc\imm.h +FILE 3332 f:\sp\public\sdk\inc\winbase.h +FILE 3333 f:\sp\public\sdk\inc\wingdi.h +FILE 3334 f:\sp\public\sdk\inc\winver.h +FILE 3335 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3336 f:\sp\public\sdk\inc\windows.h +FILE 3337 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3338 f:\sp\public\sdk\inc\pshpack2.h +FILE 3339 f:\sp\public\sdk\inc\reason.h +FILE 3340 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 3341 f:\sp\public\sdk\inc\specstrings.h +FILE 3342 f:\sp\public\sdk\inc\basetsd.h +FILE 3343 f:\sp\public\sdk\inc\pshpack4.h +FILE 3344 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3345 f:\sp\public\sdk\inc\winnetwk.h +FILE 3346 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3347 f:\sp\public\sdk\inc\stralign.h +FILE 3348 f:\sp\public\sdk\inc\poppack.h +FILE 3349 f:\sp\public\sdk\inc\winsvc.h +FILE 3350 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3351 f:\sp\public\sdk\inc\windef.h +FILE 3352 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3353 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3354 f:\sp\public\sdk\inc\winuser.h +FILE 3355 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3356 f:\sp\public\sdk\inc\ddbanned.h +FILE 3357 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3358 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3359 f:\sp\public\sdk\inc\mcx.h +FILE 3360 f:\sp\public\sdk\inc\pshpack8.h +FILE 3361 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3362 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3363 f:\sp\public\sdk\inc\pshpack4.h +FILE 3364 f:\sp\public\sdk\inc\poppack.h +FILE 3365 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3366 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3367 f:\sp\public\sdk\inc\winnetwk.h +FILE 3368 f:\sp\public\sdk\inc\imm.h +FILE 3369 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3370 f:\sp\public\sdk\inc\windef.h +FILE 3371 f:\sp\public\sdk\inc\pshpack1.h +FILE 3372 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3373 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3374 f:\sp\public\sdk\inc\winver.h +FILE 3375 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3376 f:\sp\public\sdk\inc\winnt.h +FILE 3377 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3378 f:\sp\public\sdk\inc\winreg.h +FILE 3379 f:\sp\vctools\crt_bld\self_x86\crt\src\inittime.c +FILE 3380 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3381 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3382 f:\sp\public\sdk\inc\winbase.h +FILE 3383 f:\sp\public\sdk\inc\winerror.h +FILE 3384 f:\sp\public\sdk\inc\pshpack8.h +FILE 3385 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3386 f:\sp\public\sdk\inc\reason.h +FILE 3387 f:\sp\public\sdk\inc\ddbanned.h +FILE 3388 f:\sp\public\sdk\inc\wincon.h +FILE 3389 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3390 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3391 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3392 f:\sp\public\sdk\inc\pshpack2.h +FILE 3393 f:\sp\public\sdk\inc\mcx.h +FILE 3394 f:\sp\public\sdk\inc\winuser.h +FILE 3395 f:\sp\public\sdk\inc\winnls.h +FILE 3396 f:\sp\public\sdk\inc\guiddef.h +FILE 3397 f:\sp\public\sdk\inc\stralign.h +FILE 3398 f:\sp\public\sdk\inc\specstrings.h +FILE 3399 f:\sp\public\sdk\inc\basetsd.h +FILE 3400 f:\sp\public\sdk\inc\windows.h +FILE 3401 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3402 f:\sp\public\sdk\inc\tvout.h +FILE 3403 f:\sp\public\sdk\inc\winsvc.h +FILE 3404 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3405 f:\sp\public\sdk\inc\wingdi.h +FILE 3406 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3407 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3408 f:\sp\public\sdk\inc\pshpack4.h +FILE 3409 f:\sp\public\sdk\inc\poppack.h +FILE 3410 f:\sp\public\sdk\inc\winnt.h +FILE 3411 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3412 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3413 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3414 f:\sp\public\sdk\inc\winnetwk.h +FILE 3415 f:\sp\public\sdk\inc\imm.h +FILE 3416 f:\sp\public\sdk\inc\pshpack1.h +FILE 3417 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3418 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3419 f:\sp\public\sdk\inc\winver.h +FILE 3420 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3421 f:\sp\public\sdk\inc\guiddef.h +FILE 3422 f:\sp\public\sdk\inc\specstrings.h +FILE 3423 f:\sp\public\sdk\inc\basetsd.h +FILE 3424 f:\sp\public\sdk\inc\windows.h +FILE 3425 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3426 f:\sp\public\sdk\inc\winreg.h +FILE 3427 f:\sp\vctools\crt_bld\self_x86\crt\src\initnum.c +FILE 3428 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsint.h +FILE 3429 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3430 f:\sp\public\sdk\inc\winbase.h +FILE 3431 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3432 f:\sp\public\sdk\inc\winerror.h +FILE 3433 f:\sp\public\sdk\inc\pshpack8.h +FILE 3434 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3435 f:\sp\public\sdk\inc\reason.h +FILE 3436 f:\sp\public\sdk\inc\ddbanned.h +FILE 3437 f:\sp\public\sdk\inc\wincon.h +FILE 3438 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3439 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3440 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3441 f:\sp\public\sdk\inc\pshpack2.h +FILE 3442 f:\sp\public\sdk\inc\mcx.h +FILE 3443 f:\sp\public\sdk\inc\winuser.h +FILE 3444 f:\sp\public\sdk\inc\winnls.h +FILE 3445 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3446 f:\sp\public\sdk\inc\windef.h +FILE 3447 f:\sp\public\sdk\inc\stralign.h +FILE 3448 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3449 f:\sp\public\sdk\inc\tvout.h +FILE 3450 f:\sp\public\sdk\inc\winsvc.h +FILE 3451 f:\sp\public\sdk\inc\wingdi.h +FILE 3452 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3453 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3454 f:\sp\public\sdk\inc\pshpack4.h +FILE 3455 f:\sp\public\sdk\inc\poppack.h +FILE 3456 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3457 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3458 f:\sp\public\sdk\inc\winnetwk.h +FILE 3459 f:\sp\public\sdk\inc\imm.h +FILE 3460 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3461 f:\sp\public\sdk\inc\windef.h +FILE 3462 f:\sp\public\sdk\inc\pshpack1.h +FILE 3463 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3464 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3465 f:\sp\public\sdk\inc\winver.h +FILE 3466 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3467 f:\sp\public\sdk\inc\winnt.h +FILE 3468 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3469 f:\sp\public\sdk\inc\winreg.h +FILE 3470 f:\sp\vctools\crt_bld\self_x86\crt\src\initmon.c +FILE 3471 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3472 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3473 f:\sp\public\sdk\inc\winbase.h +FILE 3474 f:\sp\public\sdk\inc\winerror.h +FILE 3475 f:\sp\public\sdk\inc\pshpack8.h +FILE 3476 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3477 f:\sp\public\sdk\inc\reason.h +FILE 3478 f:\sp\public\sdk\inc\ddbanned.h +FILE 3479 f:\sp\public\sdk\inc\wincon.h +FILE 3480 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3481 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3482 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3483 f:\sp\public\sdk\inc\pshpack2.h +FILE 3484 f:\sp\public\sdk\inc\mcx.h +FILE 3485 f:\sp\public\sdk\inc\winuser.h +FILE 3486 f:\sp\public\sdk\inc\winnls.h +FILE 3487 f:\sp\public\sdk\inc\guiddef.h +FILE 3488 f:\sp\public\sdk\inc\stralign.h +FILE 3489 f:\sp\public\sdk\inc\specstrings.h +FILE 3490 f:\sp\public\sdk\inc\basetsd.h +FILE 3491 f:\sp\public\sdk\inc\windows.h +FILE 3492 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3493 f:\sp\public\sdk\inc\tvout.h +FILE 3494 f:\sp\public\sdk\inc\winsvc.h +FILE 3495 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3496 f:\sp\public\sdk\inc\wingdi.h +FILE 3497 f:\sp\public\sdk\inc\winbase.h +FILE 3498 f:\sp\public\sdk\inc\winerror.h +FILE 3499 f:\sp\public\sdk\inc\pshpack1.h +FILE 3500 f:\sp\public\sdk\inc\pshpack8.h +FILE 3501 f:\sp\public\sdk\inc\winver.h +FILE 3502 f:\sp\public\sdk\inc\pshpack2.h +FILE 3503 f:\sp\public\sdk\inc\winreg.h +FILE 3504 f:\sp\public\sdk\inc\guiddef.h +FILE 3505 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3506 f:\sp\public\sdk\inc\specstrings.h +FILE 3507 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3508 f:\sp\public\sdk\inc\basetsd.h +FILE 3509 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3510 f:\sp\public\sdk\inc\windows.h +FILE 3511 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3512 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3513 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3514 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3515 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3516 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3517 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3518 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3519 f:\sp\public\sdk\inc\pshpack4.h +FILE 3520 f:\sp\public\sdk\inc\reason.h +FILE 3521 f:\sp\public\sdk\inc\wincon.h +FILE 3522 f:\sp\public\sdk\inc\poppack.h +FILE 3523 f:\sp\vctools\crt_bld\self_x86\crt\src\inithelp.c +FILE 3524 f:\sp\public\sdk\inc\mcx.h +FILE 3525 f:\sp\public\sdk\inc\winuser.h +FILE 3526 f:\sp\public\sdk\inc\winnls.h +FILE 3527 f:\sp\public\sdk\inc\stralign.h +FILE 3528 f:\sp\public\sdk\inc\tvout.h +FILE 3529 f:\sp\public\sdk\inc\winsvc.h +FILE 3530 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3531 f:\sp\public\sdk\inc\wingdi.h +FILE 3532 f:\sp\public\sdk\inc\windef.h +FILE 3533 f:\sp\public\sdk\inc\ddbanned.h +FILE 3534 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3535 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3536 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3537 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3538 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3539 f:\sp\public\sdk\inc\winnetwk.h +FILE 3540 f:\sp\public\sdk\inc\imm.h +FILE 3541 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3542 f:\sp\public\sdk\inc\winnt.h +FILE 3543 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3544 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3545 f:\sp\public\sdk\inc\pshpack4.h +FILE 3546 f:\sp\public\sdk\inc\poppack.h +FILE 3547 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3548 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3549 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3550 f:\sp\public\sdk\inc\winnetwk.h +FILE 3551 f:\sp\public\sdk\inc\imm.h +FILE 3552 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3553 f:\sp\public\sdk\inc\windef.h +FILE 3554 f:\sp\public\sdk\inc\pshpack1.h +FILE 3555 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3556 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3557 f:\sp\public\sdk\inc\winver.h +FILE 3558 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3559 f:\sp\public\sdk\inc\winnt.h +FILE 3560 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3561 f:\sp\public\sdk\inc\winreg.h +FILE 3562 f:\sp\vctools\crt_bld\self_x86\crt\src\initctyp.c +FILE 3563 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3564 f:\sp\public\sdk\inc\winbase.h +FILE 3565 f:\sp\public\sdk\inc\winerror.h +FILE 3566 f:\sp\public\sdk\inc\pshpack8.h +FILE 3567 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3568 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3569 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3570 f:\sp\public\sdk\inc\reason.h +FILE 3571 f:\sp\public\sdk\inc\ddbanned.h +FILE 3572 f:\sp\public\sdk\inc\wincon.h +FILE 3573 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3574 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3575 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3576 f:\sp\public\sdk\inc\pshpack2.h +FILE 3577 f:\sp\public\sdk\inc\mcx.h +FILE 3578 f:\sp\public\sdk\inc\winuser.h +FILE 3579 f:\sp\public\sdk\inc\winnls.h +FILE 3580 f:\sp\public\sdk\inc\guiddef.h +FILE 3581 f:\sp\public\sdk\inc\stralign.h +FILE 3582 f:\sp\public\sdk\inc\specstrings.h +FILE 3583 f:\sp\public\sdk\inc\basetsd.h +FILE 3584 f:\sp\public\sdk\inc\windows.h +FILE 3585 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3586 f:\sp\public\sdk\inc\tvout.h +FILE 3587 f:\sp\public\sdk\inc\winsvc.h +FILE 3588 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3589 f:\sp\public\sdk\inc\wingdi.h +FILE 3590 f:\sp\public\sdk\inc\poppack.h +FILE 3591 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3592 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3593 f:\sp\public\sdk\inc\winnetwk.h +FILE 3594 f:\sp\public\sdk\inc\imm.h +FILE 3595 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3596 f:\sp\public\sdk\inc\windef.h +FILE 3597 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3598 f:\sp\public\sdk\inc\pshpack1.h +FILE 3599 f:\sp\public\sdk\inc\winver.h +FILE 3600 f:\sp\public\sdk\inc\windows.h +FILE 3601 f:\sp\public\sdk\inc\winnt.h +FILE 3602 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3603 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3604 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3605 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3606 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3607 f:\sp\public\sdk\inc\winreg.h +FILE 3608 f:\sp\public\sdk\inc\winbase.h +FILE 3609 f:\sp\vctools\crt_bld\self_x86\crt\src\initcrit.c +FILE 3610 f:\sp\public\sdk\inc\winerror.h +FILE 3611 f:\sp\public\sdk\inc\pshpack8.h +FILE 3612 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3613 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3614 f:\sp\public\sdk\inc\reason.h +FILE 3615 f:\sp\public\sdk\inc\wincon.h +FILE 3616 f:\sp\public\sdk\inc\ddbanned.h +FILE 3617 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3618 f:\sp\public\sdk\inc\pshpack2.h +FILE 3619 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3620 f:\sp\public\sdk\inc\mcx.h +FILE 3621 f:\sp\public\sdk\inc\winuser.h +FILE 3622 f:\sp\public\sdk\inc\winnls.h +FILE 3623 f:\sp\public\sdk\inc\guiddef.h +FILE 3624 f:\sp\public\sdk\inc\specstrings.h +FILE 3625 f:\sp\public\sdk\inc\basetsd.h +FILE 3626 f:\sp\public\sdk\inc\stralign.h +FILE 3627 f:\sp\public\sdk\inc\tvout.h +FILE 3628 f:\sp\public\sdk\inc\winsvc.h +FILE 3629 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3630 f:\sp\public\sdk\inc\wingdi.h +FILE 3631 f:\sp\public\sdk\inc\pshpack4.h +FILE 3632 f:\sp\public\sdk\inc\poppack.h +FILE 3633 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3634 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3635 f:\sp\public\sdk\inc\winnetwk.h +FILE 3636 f:\sp\public\sdk\inc\imm.h +FILE 3637 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3638 f:\sp\public\sdk\inc\windef.h +FILE 3639 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3640 f:\sp\public\sdk\inc\pshpack1.h +FILE 3641 f:\sp\public\sdk\inc\winver.h +FILE 3642 f:\sp\public\sdk\inc\windows.h +FILE 3643 f:\sp\public\sdk\inc\winnt.h +FILE 3644 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3645 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3646 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3647 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3648 f:\sp\public\sdk\inc\winreg.h +FILE 3649 f:\sp\public\sdk\inc\winbase.h +FILE 3650 f:\sp\vctools\crt_bld\self_x86\crt\src\initcoll.c +FILE 3651 f:\sp\public\sdk\inc\winerror.h +FILE 3652 f:\sp\public\sdk\inc\pshpack8.h +FILE 3653 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3654 f:\sp\public\sdk\inc\reason.h +FILE 3655 f:\sp\public\sdk\inc\wincon.h +FILE 3656 f:\sp\public\sdk\inc\ddbanned.h +FILE 3657 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3658 f:\sp\public\sdk\inc\pshpack2.h +FILE 3659 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3660 f:\sp\public\sdk\inc\mcx.h +FILE 3661 f:\sp\public\sdk\inc\winuser.h +FILE 3662 f:\sp\public\sdk\inc\winnls.h +FILE 3663 f:\sp\public\sdk\inc\guiddef.h +FILE 3664 f:\sp\public\sdk\inc\specstrings.h +FILE 3665 f:\sp\public\sdk\inc\basetsd.h +FILE 3666 f:\sp\public\sdk\inc\stralign.h +FILE 3667 f:\sp\public\sdk\inc\tvout.h +FILE 3668 f:\sp\public\sdk\inc\winsvc.h +FILE 3669 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3670 f:\sp\public\sdk\inc\wingdi.h +FILE 3671 f:\sp\public\sdk\inc\pshpack4.h +FILE 3672 f:\sp\public\sdk\inc\poppack.h +FILE 3673 f:\sp\public\sdk\inc\winnetwk.h +FILE 3674 f:\sp\public\sdk\inc\imm.h +FILE 3675 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3676 f:\sp\public\sdk\inc\windef.h +FILE 3677 f:\binaries.x86ret\vcboot\inc\mm3dnow.h +FILE 3678 f:\sp\public\sdk\inc\pshpack1.h +FILE 3679 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3680 f:\sp\public\sdk\inc\winver.h +FILE 3681 f:\sp\public\sdk\inc\windows.h +FILE 3682 f:\sp\public\sdk\inc\winnt.h +FILE 3683 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3684 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3685 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3686 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3687 f:\sp\public\sdk\inc\winreg.h +FILE 3688 f:\sp\public\sdk\inc\winbase.h +FILE 3689 f:\sp\vctools\crt_bld\self_x86\crt\src\gs_support.c +FILE 3690 f:\sp\public\sdk\inc\winerror.h +FILE 3691 f:\sp\public\sdk\inc\pshpack8.h +FILE 3692 f:\sp\vctools\crt_bld\self_x86\crt\src\intrin.h +FILE 3693 f:\sp\vctools\crt_bld\self_x86\crt\src\setjmp.h +FILE 3694 f:\sp\public\sdk\inc\reason.h +FILE 3695 f:\sp\public\sdk\inc\wincon.h +FILE 3696 f:\sp\public\sdk\inc\ddbanned.h +FILE 3697 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3698 f:\sp\public\sdk\inc\pshpack2.h +FILE 3699 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3700 f:\sp\public\sdk\inc\mcx.h +FILE 3701 f:\sp\public\sdk\inc\winuser.h +FILE 3702 f:\sp\public\sdk\inc\winnls.h +FILE 3703 f:\sp\public\sdk\inc\guiddef.h +FILE 3704 f:\sp\public\sdk\inc\specstrings.h +FILE 3705 f:\sp\public\sdk\inc\basetsd.h +FILE 3706 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 3707 f:\sp\public\sdk\inc\stralign.h +FILE 3708 f:\sp\public\sdk\inc\tvout.h +FILE 3709 f:\sp\public\sdk\inc\winsvc.h +FILE 3710 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3711 f:\sp\public\sdk\inc\wingdi.h +FILE 3712 f:\binaries.x86ret\vcboot\inc\emmintrin.h +FILE 3713 f:\binaries.x86ret\vcboot\inc\xmmintrin.h +FILE 3714 f:\binaries.x86ret\vcboot\inc\mmintrin.h +FILE 3715 f:\sp\public\sdk\inc\pshpack4.h +FILE 3716 f:\sp\public\sdk\inc\poppack.h +FILE 3717 f:\sp\public\sdk\inc\winnetwk.h +FILE 3718 f:\sp\public\sdk\inc\imm.h +FILE 3719 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3720 f:\sp\public\sdk\inc\windef.h +FILE 3721 f:\sp\public\sdk\inc\pshpack1.h +FILE 3722 f:\sp\public\sdk\inc\winver.h +FILE 3723 f:\sp\public\sdk\inc\windows.h +FILE 3724 f:\sp\public\sdk\inc\winnt.h +FILE 3725 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3726 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3727 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3728 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3729 f:\sp\public\sdk\inc\winreg.h +FILE 3730 f:\sp\public\sdk\inc\winbase.h +FILE 3731 f:\sp\vctools\crt_bld\self_x86\crt\src\gs_report.c +FILE 3732 f:\sp\public\sdk\inc\winerror.h +FILE 3733 f:\sp\public\sdk\inc\pshpack8.h +FILE 3734 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3735 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3736 f:\sp\public\sdk\inc\reason.h +FILE 3737 f:\sp\public\sdk\inc\wincon.h +FILE 3738 f:\sp\public\sdk\inc\ddbanned.h +FILE 3739 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3740 f:\sp\public\sdk\inc\pshpack2.h +FILE 3741 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3742 f:\sp\public\sdk\inc\mcx.h +FILE 3743 f:\sp\public\sdk\inc\winuser.h +FILE 3744 f:\sp\public\sdk\inc\winnls.h +FILE 3745 f:\sp\public\sdk\inc\guiddef.h +FILE 3746 f:\sp\public\sdk\inc\specstrings.h +FILE 3747 f:\sp\public\sdk\inc\basetsd.h +FILE 3748 f:\sp\public\sdk\inc\stralign.h +FILE 3749 f:\sp\public\sdk\inc\tvout.h +FILE 3750 f:\sp\public\sdk\inc\winsvc.h +FILE 3751 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3752 f:\sp\public\sdk\inc\wingdi.h +FILE 3753 f:\sp\public\sdk\inc\pshpack4.h +FILE 3754 f:\sp\public\sdk\inc\poppack.h +FILE 3755 f:\sp\public\sdk\inc\winnetwk.h +FILE 3756 f:\sp\public\sdk\inc\imm.h +FILE 3757 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3758 f:\sp\public\sdk\inc\windef.h +FILE 3759 f:\sp\public\sdk\inc\pshpack1.h +FILE 3760 f:\sp\public\sdk\inc\winver.h +FILE 3761 f:\sp\public\sdk\inc\windows.h +FILE 3762 f:\sp\public\sdk\inc\winnt.h +FILE 3763 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3764 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3765 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3766 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3767 f:\sp\public\sdk\inc\winreg.h +FILE 3768 f:\sp\public\sdk\inc\winbase.h +FILE 3769 f:\sp\vctools\crt_bld\self_x86\crt\src\gs_cookie.c +FILE 3770 f:\sp\public\sdk\inc\winerror.h +FILE 3771 f:\sp\public\sdk\inc\pshpack8.h +FILE 3772 f:\sp\public\sdk\inc\reason.h +FILE 3773 f:\sp\public\sdk\inc\wincon.h +FILE 3774 f:\sp\public\sdk\inc\ddbanned.h +FILE 3775 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3776 f:\sp\public\sdk\inc\pshpack2.h +FILE 3777 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3778 f:\sp\public\sdk\inc\mcx.h +FILE 3779 f:\sp\public\sdk\inc\winuser.h +FILE 3780 f:\sp\public\sdk\inc\winnls.h +FILE 3781 f:\sp\public\sdk\inc\guiddef.h +FILE 3782 f:\sp\public\sdk\inc\specstrings.h +FILE 3783 f:\sp\public\sdk\inc\basetsd.h +FILE 3784 f:\sp\public\sdk\inc\stralign.h +FILE 3785 f:\sp\public\sdk\inc\tvout.h +FILE 3786 f:\sp\public\sdk\inc\winsvc.h +FILE 3787 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3788 f:\sp\public\sdk\inc\wingdi.h +FILE 3789 f:\sp\public\sdk\inc\pshpack4.h +FILE 3790 f:\sp\public\sdk\inc\winerror.h +FILE 3791 f:\sp\public\sdk\inc\pshpack1.h +FILE 3792 f:\sp\public\sdk\inc\pshpack8.h +FILE 3793 f:\sp\public\sdk\inc\winver.h +FILE 3794 f:\sp\public\sdk\inc\pshpack2.h +FILE 3795 f:\sp\public\sdk\inc\winreg.h +FILE 3796 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3797 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3798 f:\sp\public\sdk\inc\guiddef.h +FILE 3799 f:\sp\public\sdk\inc\windows.h +FILE 3800 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3801 f:\sp\public\sdk\inc\specstrings.h +FILE 3802 f:\sp\public\sdk\inc\basetsd.h +FILE 3803 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3804 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3805 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3806 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3807 f:\sp\public\sdk\inc\pshpack4.h +FILE 3808 f:\sp\public\sdk\inc\reason.h +FILE 3809 f:\sp\public\sdk\inc\wincon.h +FILE 3810 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3811 f:\sp\public\sdk\inc\poppack.h +FILE 3812 f:\sp\public\sdk\inc\mcx.h +FILE 3813 f:\sp\public\sdk\inc\winuser.h +FILE 3814 f:\sp\public\sdk\inc\winnls.h +FILE 3815 f:\sp\vctools\crt_bld\self_x86\crt\src\glstatus.c +FILE 3816 f:\sp\public\sdk\inc\stralign.h +FILE 3817 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3818 f:\sp\public\sdk\inc\windef.h +FILE 3819 f:\sp\public\sdk\inc\tvout.h +FILE 3820 f:\sp\public\sdk\inc\winsvc.h +FILE 3821 f:\sp\public\sdk\inc\wingdi.h +FILE 3822 f:\sp\public\sdk\inc\ddbanned.h +FILE 3823 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3824 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3825 f:\sp\public\sdk\inc\winnt.h +FILE 3826 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3827 f:\sp\public\sdk\inc\winnetwk.h +FILE 3828 f:\sp\public\sdk\inc\imm.h +FILE 3829 f:\sp\public\sdk\inc\winbase.h +FILE 3830 f:\sp\public\sdk\inc\pshpack4.h +FILE 3831 f:\sp\public\sdk\inc\poppack.h +FILE 3832 f:\sp\public\sdk\inc\winnt.h +FILE 3833 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3834 f:\sp\public\sdk\inc\winnetwk.h +FILE 3835 f:\sp\public\sdk\inc\imm.h +FILE 3836 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3837 f:\sp\public\sdk\inc\pshpack1.h +FILE 3838 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3839 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3840 f:\sp\public\sdk\inc\winver.h +FILE 3841 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3842 f:\sp\public\sdk\inc\guiddef.h +FILE 3843 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3844 f:\sp\public\sdk\inc\specstrings.h +FILE 3845 f:\sp\public\sdk\inc\basetsd.h +FILE 3846 f:\sp\public\sdk\inc\windows.h +FILE 3847 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3848 f:\sp\public\sdk\inc\winreg.h +FILE 3849 f:\sp\vctools\crt_bld\self_x86\crt\src\getqloc.c +FILE 3850 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3851 f:\sp\public\sdk\inc\winbase.h +FILE 3852 f:\sp\public\sdk\inc\winerror.h +FILE 3853 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3854 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3855 f:\sp\public\sdk\inc\pshpack8.h +FILE 3856 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3857 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3858 f:\sp\public\sdk\inc\reason.h +FILE 3859 f:\sp\public\sdk\inc\ddbanned.h +FILE 3860 f:\sp\public\sdk\inc\wincon.h +FILE 3861 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3862 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3863 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3864 f:\sp\public\sdk\inc\pshpack2.h +FILE 3865 f:\sp\public\sdk\inc\mcx.h +FILE 3866 f:\sp\public\sdk\inc\winuser.h +FILE 3867 f:\sp\public\sdk\inc\winnls.h +FILE 3868 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3869 f:\sp\public\sdk\inc\windef.h +FILE 3870 f:\sp\public\sdk\inc\stralign.h +FILE 3871 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3872 f:\sp\public\sdk\inc\tvout.h +FILE 3873 f:\sp\public\sdk\inc\winsvc.h +FILE 3874 f:\sp\public\sdk\inc\wingdi.h +FILE 3875 f:\sp\public\sdk\inc\reason.h +FILE 3876 f:\sp\public\sdk\inc\wincon.h +FILE 3877 f:\sp\public\sdk\inc\pshpack2.h +FILE 3878 f:\sp\public\sdk\inc\mcx.h +FILE 3879 f:\sp\public\sdk\inc\winuser.h +FILE 3880 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3881 f:\sp\public\sdk\inc\winnls.h +FILE 3882 f:\sp\public\sdk\inc\guiddef.h +FILE 3883 f:\sp\public\sdk\inc\windows.h +FILE 3884 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3885 f:\sp\public\sdk\inc\specstrings.h +FILE 3886 f:\sp\public\sdk\inc\basetsd.h +FILE 3887 f:\sp\public\sdk\inc\stralign.h +FILE 3888 f:\sp\public\sdk\inc\tvout.h +FILE 3889 f:\sp\public\sdk\inc\winsvc.h +FILE 3890 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3891 f:\sp\public\sdk\inc\wingdi.h +FILE 3892 f:\sp\public\sdk\inc\pshpack4.h +FILE 3893 f:\sp\public\sdk\inc\poppack.h +FILE 3894 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 3895 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3896 f:\sp\public\sdk\inc\winnetwk.h +FILE 3897 f:\sp\public\sdk\inc\imm.h +FILE 3898 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3899 f:\sp\public\sdk\inc\windef.h +FILE 3900 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 3901 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 3902 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3903 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3904 f:\sp\vctools\crt_bld\self_x86\crt\src\getenv.c +FILE 3905 f:\sp\public\sdk\inc\pshpack1.h +FILE 3906 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3907 f:\sp\public\sdk\inc\winver.h +FILE 3908 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3909 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3910 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3911 f:\sp\public\sdk\inc\winnt.h +FILE 3912 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3913 f:\sp\public\sdk\inc\ddbanned.h +FILE 3914 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3915 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3916 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3917 f:\sp\public\sdk\inc\winreg.h +FILE 3918 f:\sp\public\sdk\inc\winbase.h +FILE 3919 f:\sp\public\sdk\inc\winerror.h +FILE 3920 f:\sp\public\sdk\inc\pshpack8.h +FILE 3921 f:\sp\public\sdk\inc\poppack.h +FILE 3922 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3923 f:\sp\public\sdk\inc\winnetwk.h +FILE 3924 f:\sp\public\sdk\inc\imm.h +FILE 3925 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3926 f:\sp\public\sdk\inc\windef.h +FILE 3927 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3928 f:\sp\public\sdk\inc\pshpack1.h +FILE 3929 f:\sp\public\sdk\inc\winver.h +FILE 3930 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3931 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3932 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3933 f:\sp\public\sdk\inc\winnt.h +FILE 3934 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3935 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3936 f:\sp\public\sdk\inc\winreg.h +FILE 3937 f:\sp\vctools\crt_bld\self_x86\crt\src\errmode.c +FILE 3938 f:\sp\public\sdk\inc\winbase.h +FILE 3939 f:\sp\public\sdk\inc\winerror.h +FILE 3940 f:\sp\public\sdk\inc\pshpack8.h +FILE 3941 f:\sp\public\sdk\inc\reason.h +FILE 3942 f:\sp\public\sdk\inc\wincon.h +FILE 3943 f:\sp\public\sdk\inc\ddbanned.h +FILE 3944 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3945 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3946 f:\sp\public\sdk\inc\pshpack2.h +FILE 3947 f:\sp\public\sdk\inc\mcx.h +FILE 3948 f:\sp\public\sdk\inc\winuser.h +FILE 3949 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3950 f:\sp\public\sdk\inc\winnls.h +FILE 3951 f:\sp\public\sdk\inc\guiddef.h +FILE 3952 f:\sp\public\sdk\inc\windows.h +FILE 3953 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3954 f:\sp\public\sdk\inc\specstrings.h +FILE 3955 f:\sp\public\sdk\inc\basetsd.h +FILE 3956 f:\sp\public\sdk\inc\stralign.h +FILE 3957 f:\sp\public\sdk\inc\tvout.h +FILE 3958 f:\sp\public\sdk\inc\winsvc.h +FILE 3959 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3960 f:\sp\public\sdk\inc\wingdi.h +FILE 3961 f:\sp\public\sdk\inc\pshpack4.h +FILE 3962 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3963 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3964 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3965 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3966 f:\sp\vctools\crt_bld\self_x86\crt\src\dbghook.c +FILE 3967 f:\sp\public\sdk\inc\ddbanned.h +FILE 3968 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3969 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3970 f:\sp\public\sdk\inc\poppack.h +FILE 3971 f:\sp\public\sdk\inc\winnetwk.h +FILE 3972 f:\sp\public\sdk\inc\imm.h +FILE 3973 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3974 f:\sp\public\sdk\inc\windef.h +FILE 3975 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3976 f:\sp\public\sdk\inc\pshpack1.h +FILE 3977 f:\sp\public\sdk\inc\winver.h +FILE 3978 f:\sp\public\sdk\inc\windows.h +FILE 3979 f:\sp\public\sdk\inc\winnt.h +FILE 3980 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3981 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3982 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3983 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3984 f:\sp\public\sdk\inc\winreg.h +FILE 3985 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 3986 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.c +FILE 3987 f:\sp\public\sdk\inc\winbase.h +FILE 3988 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 3989 f:\sp\public\sdk\inc\winerror.h +FILE 3990 f:\sp\public\sdk\inc\pshpack8.h +FILE 3991 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3992 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3993 f:\sp\public\sdk\inc\reason.h +FILE 3994 f:\sp\public\sdk\inc\wincon.h +FILE 3995 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3996 f:\sp\public\sdk\inc\ddbanned.h +FILE 3997 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3998 f:\sp\public\sdk\inc\pshpack2.h +FILE 3999 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4000 f:\sp\public\sdk\inc\mcx.h +FILE 4001 f:\sp\public\sdk\inc\winuser.h +FILE 4002 f:\sp\public\sdk\inc\winnls.h +FILE 4003 f:\sp\public\sdk\inc\guiddef.h +FILE 4004 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4005 f:\sp\public\sdk\inc\specstrings.h +FILE 4006 f:\sp\public\sdk\inc\basetsd.h +FILE 4007 f:\sp\public\sdk\inc\stralign.h +FILE 4008 f:\sp\public\sdk\inc\tvout.h +FILE 4009 f:\sp\public\sdk\inc\winsvc.h +FILE 4010 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4011 f:\sp\public\sdk\inc\wingdi.h +FILE 4012 f:\sp\public\sdk\inc\pshpack4.h +FILE 4013 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4014 f:\sp\public\sdk\inc\mcx.h +FILE 4015 f:\sp\public\sdk\inc\winuser.h +FILE 4016 f:\sp\public\sdk\inc\winnls.h +FILE 4017 f:\sp\public\sdk\inc\stralign.h +FILE 4018 f:\sp\public\sdk\inc\tvout.h +FILE 4019 f:\sp\public\sdk\inc\winsvc.h +FILE 4020 f:\sp\public\sdk\inc\wingdi.h +FILE 4021 f:\sp\public\sdk\inc\pshpack4.h +FILE 4022 f:\sp\public\sdk\inc\winnt.h +FILE 4023 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4024 f:\sp\public\sdk\inc\poppack.h +FILE 4025 f:\sp\public\sdk\inc\winnetwk.h +FILE 4026 f:\sp\public\sdk\inc\imm.h +FILE 4027 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 4028 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 4029 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4030 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4031 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4032 f:\sp\public\sdk\inc\pshpack1.h +FILE 4033 f:\sp\vctools\crt_bld\self_x86\crt\src\crtmbox.c +FILE 4034 f:\sp\public\sdk\inc\winver.h +FILE 4035 f:\sp\public\sdk\inc\guiddef.h +FILE 4036 f:\sp\public\sdk\inc\windows.h +FILE 4037 f:\sp\public\sdk\inc\specstrings.h +FILE 4038 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4039 f:\sp\public\sdk\inc\basetsd.h +FILE 4040 f:\sp\public\sdk\inc\winreg.h +FILE 4041 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4042 f:\sp\public\sdk\inc\winbase.h +FILE 4043 f:\sp\public\sdk\inc\ddbanned.h +FILE 4044 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4045 f:\sp\public\sdk\inc\winerror.h +FILE 4046 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4047 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4048 f:\sp\public\sdk\inc\pshpack8.h +FILE 4049 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4050 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4051 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4052 f:\sp\public\sdk\inc\reason.h +FILE 4053 f:\sp\public\sdk\inc\wincon.h +FILE 4054 f:\sp\public\sdk\inc\pshpack2.h +FILE 4055 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4056 f:\sp\public\sdk\inc\windef.h +FILE 4057 f:\sp\public\sdk\inc\poppack.h +FILE 4058 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 4059 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4060 f:\sp\public\sdk\inc\winnetwk.h +FILE 4061 f:\sp\public\sdk\inc\imm.h +FILE 4062 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4063 f:\sp\public\sdk\inc\windef.h +FILE 4064 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4065 f:\sp\public\sdk\inc\pshpack1.h +FILE 4066 f:\sp\public\sdk\inc\winver.h +FILE 4067 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4068 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4069 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4070 f:\sp\public\sdk\inc\winnt.h +FILE 4071 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4072 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4073 f:\sp\public\sdk\inc\winreg.h +FILE 4074 f:\sp\vctools\crt_bld\self_x86\crt\src\cmiscdat.c +FILE 4075 f:\sp\public\sdk\inc\winbase.h +FILE 4076 f:\sp\public\sdk\inc\winerror.h +FILE 4077 f:\sp\public\sdk\inc\pshpack8.h +FILE 4078 f:\sp\public\sdk\inc\reason.h +FILE 4079 f:\sp\public\sdk\inc\wincon.h +FILE 4080 f:\sp\public\sdk\inc\ddbanned.h +FILE 4081 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4082 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4083 f:\sp\public\sdk\inc\pshpack2.h +FILE 4084 f:\sp\public\sdk\inc\mcx.h +FILE 4085 f:\sp\public\sdk\inc\winuser.h +FILE 4086 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4087 f:\sp\public\sdk\inc\winnls.h +FILE 4088 f:\sp\public\sdk\inc\guiddef.h +FILE 4089 f:\sp\public\sdk\inc\windows.h +FILE 4090 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4091 f:\sp\public\sdk\inc\specstrings.h +FILE 4092 f:\sp\public\sdk\inc\basetsd.h +FILE 4093 f:\sp\public\sdk\inc\stralign.h +FILE 4094 f:\sp\public\sdk\inc\tvout.h +FILE 4095 f:\sp\public\sdk\inc\winsvc.h +FILE 4096 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4097 f:\sp\public\sdk\inc\wingdi.h +FILE 4098 f:\sp\public\sdk\inc\pshpack4.h +FILE 4099 f:\sp\public\sdk\inc\pshpack4.h +FILE 4100 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 4101 f:\sp\vctools\crt_bld\self_x86\crt\src\signal.h +FILE 4102 f:\sp\public\sdk\inc\poppack.h +FILE 4103 f:\sp\public\sdk\inc\winnetwk.h +FILE 4104 f:\sp\public\sdk\inc\imm.h +FILE 4105 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4106 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4107 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4108 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4109 f:\sp\public\sdk\inc\windef.h +FILE 4110 f:\sp\public\sdk\inc\pshpack1.h +FILE 4111 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4112 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4113 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4114 f:\sp\public\sdk\inc\winver.h +FILE 4115 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4116 f:\sp\public\sdk\inc\winnt.h +FILE 4117 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4118 f:\sp\public\sdk\inc\winreg.h +FILE 4119 f:\sp\vctools\crt_bld\self_x86\crt\src\abort.c +FILE 4120 f:\sp\public\sdk\inc\winbase.h +FILE 4121 f:\sp\public\sdk\inc\winerror.h +FILE 4122 f:\sp\public\sdk\inc\pshpack8.h +FILE 4123 f:\sp\public\sdk\inc\reason.h +FILE 4124 f:\sp\public\sdk\inc\ddbanned.h +FILE 4125 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4126 f:\sp\public\sdk\inc\wincon.h +FILE 4127 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4128 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4129 f:\sp\public\sdk\inc\pshpack2.h +FILE 4130 f:\sp\public\sdk\inc\mcx.h +FILE 4131 f:\sp\public\sdk\inc\winuser.h +FILE 4132 f:\sp\public\sdk\inc\winnls.h +FILE 4133 f:\sp\public\sdk\inc\guiddef.h +FILE 4134 f:\sp\public\sdk\inc\stralign.h +FILE 4135 f:\sp\public\sdk\inc\specstrings.h +FILE 4136 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4137 f:\sp\public\sdk\inc\basetsd.h +FILE 4138 f:\sp\public\sdk\inc\windows.h +FILE 4139 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4140 f:\sp\public\sdk\inc\tvout.h +FILE 4141 f:\sp\public\sdk\inc\winsvc.h +FILE 4142 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4143 f:\sp\public\sdk\inc\wingdi.h +FILE 4144 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4145 f:\sp\public\sdk\inc\wincon.h +FILE 4146 f:\sp\public\sdk\inc\imm.h +FILE 4147 f:\sp\public\sdk\inc\winbase.h +FILE 4148 f:\sp\public\sdk\inc\wingdi.h +FILE 4149 f:\sp\public\sdk\inc\winver.h +FILE 4150 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4151 f:\sp\public\sdk\inc\windows.h +FILE 4152 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4153 f:\sp\public\sdk\inc\pshpack2.h +FILE 4154 f:\sp\public\sdk\inc\reason.h +FILE 4155 f:\sp\vctools\crt_bld\self_x86\crt\src\a_str.c +FILE 4156 f:\sp\public\sdk\inc\specstrings.h +FILE 4157 f:\sp\public\sdk\inc\basetsd.h +FILE 4158 f:\sp\public\sdk\inc\pshpack4.h +FILE 4159 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4160 f:\sp\public\sdk\inc\winnetwk.h +FILE 4161 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4162 f:\sp\public\sdk\inc\stralign.h +FILE 4163 f:\sp\public\sdk\inc\poppack.h +FILE 4164 f:\sp\public\sdk\inc\winsvc.h +FILE 4165 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4166 f:\sp\public\sdk\inc\windef.h +FILE 4167 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4168 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4169 f:\sp\public\sdk\inc\winuser.h +FILE 4170 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4171 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4172 f:\sp\public\sdk\inc\mcx.h +FILE 4173 f:\sp\public\sdk\inc\pshpack8.h +FILE 4174 f:\sp\public\sdk\inc\guiddef.h +FILE 4175 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4176 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4177 f:\sp\public\sdk\inc\winnt.h +FILE 4178 f:\sp\public\sdk\inc\winnls.h +FILE 4179 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4180 f:\sp\public\sdk\inc\pshpack1.h +FILE 4181 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4182 f:\sp\public\sdk\inc\winerror.h +FILE 4183 f:\sp\public\sdk\inc\winreg.h +FILE 4184 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4185 f:\sp\public\sdk\inc\ddbanned.h +FILE 4186 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4187 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4188 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4189 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4190 f:\sp\public\sdk\inc\tvout.h +FILE 4191 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4192 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4193 f:\sp\public\sdk\inc\wincon.h +FILE 4194 f:\sp\public\sdk\inc\imm.h +FILE 4195 f:\sp\public\sdk\inc\winbase.h +FILE 4196 f:\sp\public\sdk\inc\wingdi.h +FILE 4197 f:\sp\public\sdk\inc\winver.h +FILE 4198 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4199 f:\sp\public\sdk\inc\windows.h +FILE 4200 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4201 f:\sp\public\sdk\inc\pshpack2.h +FILE 4202 f:\sp\public\sdk\inc\reason.h +FILE 4203 f:\sp\vctools\crt_bld\self_x86\crt\src\a_map.c +FILE 4204 f:\sp\public\sdk\inc\specstrings.h +FILE 4205 f:\sp\public\sdk\inc\basetsd.h +FILE 4206 f:\sp\public\sdk\inc\pshpack4.h +FILE 4207 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4208 f:\sp\public\sdk\inc\winnetwk.h +FILE 4209 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4210 f:\sp\public\sdk\inc\stralign.h +FILE 4211 f:\sp\public\sdk\inc\poppack.h +FILE 4212 f:\sp\public\sdk\inc\winsvc.h +FILE 4213 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4214 f:\sp\public\sdk\inc\windef.h +FILE 4215 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4216 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4217 f:\sp\public\sdk\inc\winuser.h +FILE 4218 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4219 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4220 f:\sp\public\sdk\inc\mcx.h +FILE 4221 f:\sp\public\sdk\inc\pshpack8.h +FILE 4222 f:\sp\public\sdk\inc\guiddef.h +FILE 4223 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4224 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4225 f:\sp\public\sdk\inc\winnt.h +FILE 4226 f:\sp\public\sdk\inc\winnls.h +FILE 4227 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4228 f:\sp\public\sdk\inc\pshpack1.h +FILE 4229 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4230 f:\sp\public\sdk\inc\winerror.h +FILE 4231 f:\sp\public\sdk\inc\winreg.h +FILE 4232 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4233 f:\sp\public\sdk\inc\ddbanned.h +FILE 4234 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4235 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4236 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4237 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4238 f:\sp\public\sdk\inc\tvout.h +FILE 4239 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4240 f:\sp\public\sdk\inc\wincon.h +FILE 4241 f:\sp\public\sdk\inc\imm.h +FILE 4242 f:\sp\public\sdk\inc\winbase.h +FILE 4243 f:\sp\public\sdk\inc\wingdi.h +FILE 4244 f:\sp\public\sdk\inc\winver.h +FILE 4245 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4246 f:\sp\public\sdk\inc\windows.h +FILE 4247 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4248 f:\sp\public\sdk\inc\pshpack2.h +FILE 4249 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4250 f:\sp\public\sdk\inc\reason.h +FILE 4251 f:\sp\vctools\crt_bld\self_x86\crt\src\a_loc.c +FILE 4252 f:\sp\public\sdk\inc\specstrings.h +FILE 4253 f:\sp\public\sdk\inc\basetsd.h +FILE 4254 f:\sp\public\sdk\inc\pshpack4.h +FILE 4255 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4256 f:\sp\public\sdk\inc\winnetwk.h +FILE 4257 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4258 f:\sp\public\sdk\inc\stralign.h +FILE 4259 f:\sp\public\sdk\inc\poppack.h +FILE 4260 f:\sp\public\sdk\inc\winsvc.h +FILE 4261 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4262 f:\sp\public\sdk\inc\windef.h +FILE 4263 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4264 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4265 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4266 f:\sp\public\sdk\inc\winuser.h +FILE 4267 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4268 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4269 f:\sp\public\sdk\inc\mcx.h +FILE 4270 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4271 f:\sp\public\sdk\inc\pshpack8.h +FILE 4272 f:\sp\public\sdk\inc\guiddef.h +FILE 4273 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4274 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4275 f:\sp\public\sdk\inc\winnt.h +FILE 4276 f:\sp\public\sdk\inc\winnls.h +FILE 4277 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4278 f:\sp\public\sdk\inc\pshpack1.h +FILE 4279 f:\sp\public\sdk\inc\winerror.h +FILE 4280 f:\sp\public\sdk\inc\winreg.h +FILE 4281 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4282 f:\sp\public\sdk\inc\ddbanned.h +FILE 4283 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4284 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4285 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4286 f:\sp\public\sdk\inc\tvout.h +FILE 4287 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4288 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4289 f:\sp\public\sdk\inc\poppack.h +FILE 4290 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4291 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4292 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4293 f:\sp\public\sdk\inc\winnetwk.h +FILE 4294 f:\sp\public\sdk\inc\imm.h +FILE 4295 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4296 f:\sp\public\sdk\inc\windef.h +FILE 4297 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4298 f:\sp\public\sdk\inc\pshpack1.h +FILE 4299 f:\sp\public\sdk\inc\winver.h +FILE 4300 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4301 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4302 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4303 f:\sp\public\sdk\inc\winnt.h +FILE 4304 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4305 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4306 f:\sp\public\sdk\inc\winreg.h +FILE 4307 f:\sp\vctools\crt_bld\self_x86\crt\src\a_env.c +FILE 4308 f:\sp\public\sdk\inc\winbase.h +FILE 4309 f:\sp\public\sdk\inc\winerror.h +FILE 4310 f:\sp\public\sdk\inc\pshpack8.h +FILE 4311 f:\sp\public\sdk\inc\reason.h +FILE 4312 f:\sp\public\sdk\inc\wincon.h +FILE 4313 f:\sp\public\sdk\inc\ddbanned.h +FILE 4314 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4315 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4316 f:\sp\public\sdk\inc\pshpack2.h +FILE 4317 f:\sp\public\sdk\inc\mcx.h +FILE 4318 f:\sp\public\sdk\inc\winuser.h +FILE 4319 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4320 f:\sp\public\sdk\inc\winnls.h +FILE 4321 f:\sp\public\sdk\inc\guiddef.h +FILE 4322 f:\sp\public\sdk\inc\windows.h +FILE 4323 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4324 f:\sp\public\sdk\inc\specstrings.h +FILE 4325 f:\sp\public\sdk\inc\basetsd.h +FILE 4326 f:\sp\public\sdk\inc\stralign.h +FILE 4327 f:\sp\public\sdk\inc\tvout.h +FILE 4328 f:\sp\public\sdk\inc\winsvc.h +FILE 4329 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4330 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4331 f:\sp\public\sdk\inc\wingdi.h +FILE 4332 f:\sp\public\sdk\inc\pshpack4.h +FILE 4333 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4334 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4335 f:\sp\public\sdk\inc\wincon.h +FILE 4336 f:\sp\public\sdk\inc\imm.h +FILE 4337 f:\sp\public\sdk\inc\winbase.h +FILE 4338 f:\sp\public\sdk\inc\wingdi.h +FILE 4339 f:\sp\public\sdk\inc\winver.h +FILE 4340 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4341 f:\sp\public\sdk\inc\windows.h +FILE 4342 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4343 f:\sp\public\sdk\inc\pshpack2.h +FILE 4344 f:\sp\public\sdk\inc\reason.h +FILE 4345 f:\sp\vctools\crt_bld\self_x86\crt\src\a_cmp.c +FILE 4346 f:\sp\public\sdk\inc\specstrings.h +FILE 4347 f:\sp\public\sdk\inc\basetsd.h +FILE 4348 f:\sp\public\sdk\inc\pshpack4.h +FILE 4349 f:\sp\public\sdk\inc\winnetwk.h +FILE 4350 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4351 f:\sp\public\sdk\inc\stralign.h +FILE 4352 f:\sp\public\sdk\inc\poppack.h +FILE 4353 f:\sp\public\sdk\inc\winsvc.h +FILE 4354 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4355 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4356 f:\sp\public\sdk\inc\windef.h +FILE 4357 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4358 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4359 f:\sp\public\sdk\inc\winuser.h +FILE 4360 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4361 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4362 f:\sp\public\sdk\inc\mcx.h +FILE 4363 f:\sp\public\sdk\inc\pshpack8.h +FILE 4364 f:\sp\public\sdk\inc\guiddef.h +FILE 4365 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4366 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4367 f:\sp\public\sdk\inc\winnt.h +FILE 4368 f:\sp\public\sdk\inc\winnls.h +FILE 4369 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4370 f:\sp\public\sdk\inc\pshpack1.h +FILE 4371 f:\sp\public\sdk\inc\winerror.h +FILE 4372 f:\sp\public\sdk\inc\winreg.h +FILE 4373 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4374 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4375 f:\sp\public\sdk\inc\ddbanned.h +FILE 4376 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4377 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4378 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4379 f:\sp\public\sdk\inc\tvout.h +FILE 4380 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4381 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\sehprolg4.asm +FILE 4382 f:\sp\public\sdk\inc\poppack.h +FILE 4383 f:\sp\public\sdk\inc\winnetwk.h +FILE 4384 f:\sp\public\sdk\inc\imm.h +FILE 4385 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4386 f:\sp\public\sdk\inc\windef.h +FILE 4387 f:\sp\public\sdk\inc\pshpack1.h +FILE 4388 f:\sp\public\sdk\inc\winver.h +FILE 4389 f:\sp\public\sdk\inc\windows.h +FILE 4390 f:\sp\public\sdk\inc\winnt.h +FILE 4391 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4392 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4393 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4394 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4395 f:\sp\public\sdk\inc\winreg.h +FILE 4396 f:\sp\public\sdk\inc\winbase.h +FILE 4397 f:\sp\vctools\crt_bld\self_x86\crt\src\intel\secchk.c +FILE 4398 f:\sp\public\sdk\inc\winerror.h +FILE 4399 f:\sp\public\sdk\inc\pshpack8.h +FILE 4400 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 4401 f:\sp\public\sdk\inc\reason.h +FILE 4402 f:\sp\public\sdk\inc\wincon.h +FILE 4403 f:\sp\public\sdk\inc\ddbanned.h +FILE 4404 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4405 f:\sp\public\sdk\inc\pshpack2.h +FILE 4406 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4407 f:\sp\public\sdk\inc\mcx.h +FILE 4408 f:\sp\public\sdk\inc\winuser.h +FILE 4409 f:\sp\public\sdk\inc\winnls.h +FILE 4410 f:\sp\public\sdk\inc\guiddef.h +FILE 4411 f:\sp\public\sdk\inc\specstrings.h +FILE 4412 f:\sp\public\sdk\inc\basetsd.h +FILE 4413 f:\sp\public\sdk\inc\stralign.h +FILE 4414 f:\sp\public\sdk\inc\tvout.h +FILE 4415 f:\sp\public\sdk\inc\winsvc.h +FILE 4416 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4417 f:\sp\public\sdk\inc\wingdi.h +FILE 4418 f:\sp\public\sdk\inc\pshpack4.h +FILE 4419 f:\sp\public\sdk\inc\poppack.h +FILE 4420 f:\sp\public\sdk\inc\winnetwk.h +FILE 4421 f:\sp\public\sdk\inc\imm.h +FILE 4422 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4423 f:\sp\public\sdk\inc\windef.h +FILE 4424 f:\sp\public\sdk\inc\pshpack1.h +FILE 4425 f:\sp\public\sdk\inc\winver.h +FILE 4426 f:\sp\public\sdk\inc\windows.h +FILE 4427 f:\sp\public\sdk\inc\winnt.h +FILE 4428 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4429 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4430 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4431 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4432 f:\sp\public\sdk\inc\winreg.h +FILE 4433 f:\sp\public\sdk\inc\winbase.h +FILE 4434 f:\sp\vctools\crt_bld\self_x86\crt\src\intel\loadcfg.c +FILE 4435 f:\sp\public\sdk\inc\winerror.h +FILE 4436 f:\sp\public\sdk\inc\pshpack8.h +FILE 4437 f:\sp\public\sdk\inc\reason.h +FILE 4438 f:\sp\public\sdk\inc\wincon.h +FILE 4439 f:\sp\public\sdk\inc\ddbanned.h +FILE 4440 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4441 f:\sp\public\sdk\inc\pshpack2.h +FILE 4442 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4443 f:\sp\public\sdk\inc\mcx.h +FILE 4444 f:\sp\public\sdk\inc\winuser.h +FILE 4445 f:\sp\public\sdk\inc\winnls.h +FILE 4446 f:\sp\public\sdk\inc\guiddef.h +FILE 4447 f:\sp\public\sdk\inc\specstrings.h +FILE 4448 f:\sp\public\sdk\inc\basetsd.h +FILE 4449 f:\sp\public\sdk\inc\stralign.h +FILE 4450 f:\sp\public\sdk\inc\tvout.h +FILE 4451 f:\sp\public\sdk\inc\winsvc.h +FILE 4452 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4453 f:\sp\public\sdk\inc\wingdi.h +FILE 4454 f:\sp\public\sdk\inc\pshpack4.h +FILE 4455 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\exsup4.asm +FILE 4456 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\exsup.inc +FILE 4457 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\exsup.asm +FILE 4458 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\pversion.inc +FILE 4459 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\cmacros.inc +FILE 4460 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\exsup.inc +FILE 4461 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\nlgsupp.asm +FILE 4462 f:\sp\public\sdk\inc\ntldr.h +FILE 4463 f:\sp\public\sdk\inc\ntpoapi.h +FILE 4464 f:\sp\public\sdk\inc\ntexapi.h +FILE 4465 f:\sp\public\sdk\inc\pshpack1.h +FILE 4466 f:\sp\public\sdk\inc\pshpack8.h +FILE 4467 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 4468 f:\sp\public\sdk\inc\ntdef.h +FILE 4469 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 4470 f:\sp\public\sdk\inc\mce.h +FILE 4471 f:\sp\public\sdk\inc\poppack.h +FILE 4472 f:\sp\public\sdk\inc\ntimage.h +FILE 4473 f:\sp\public\sdk\inc\pshpack2.h +FILE 4474 f:\sp\public\sdk\inc\ntpsapi.h +FILE 4475 f:\sp\public\sdk\inc\nti386.h +FILE 4476 f:\sp\public\sdk\inc\nt.h +FILE 4477 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 4478 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 4479 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 4480 f:\sp\public\sdk\inc\specstrings.h +FILE 4481 f:\sp\public\sdk\inc\basetsd.h +FILE 4482 f:\sp\public\sdk\inc\ntxcapi.h +FILE 4483 f:\sp\public\sdk\inc\guiddef.h +FILE 4484 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\misc\i386\chandler4.c +FILE 4485 f:\sp\public\sdk\inc\ntstatus.h +FILE 4486 f:\sp\public\sdk\inc\ntkeapi.h +FILE 4487 f:\sp\public\sdk\inc\ntconfig.h +FILE 4488 f:\sp\public\sdk\inc\ntregapi.h +FILE 4489 f:\sp\public\sdk\inc\ntmmapi.h +FILE 4490 f:\sp\public\sdk\inc\ntobapi.h +FILE 4491 f:\sp\public\sdk\inc\nxi386.h +FILE 4492 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\process.h +FILE 4493 f:\sp\public\sdk\inc\ntioapi.h +FILE 4494 f:\sp\public\sdk\inc\devioctl.h +FILE 4495 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 4496 f:\sp\public\sdk\inc\ntseapi.h +FILE 4497 f:\sp\public\sdk\inc\ddbanned.h +FILE 4498 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 4499 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 4500 f:\sp\public\sdk\inc\ntnls.h +FILE 4501 f:\sp\public\sdk\inc\ntelfapi.h +FILE 4502 f:\sp\public\sdk\inc\pshpack4.h +FILE 4503 f:\sp\public\sdk\inc\ntiolog.h +FILE 4504 f:\sp\public\sdk\inc\ntlpcapi.h +FILE 4505 f:\sp\public\sdk\inc\ntpnpapi.h +FILE 4506 f:\sp\public\sdk\inc\cfg.h +FILE 4507 f:\sp\public\sdk\inc\pebteb.h +FILE 4508 f:\sp\public\sdk\inc\wincon.h +FILE 4509 f:\sp\public\sdk\inc\imm.h +FILE 4510 f:\sp\public\sdk\inc\winbase.h +FILE 4511 f:\sp\public\sdk\inc\wingdi.h +FILE 4512 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4513 f:\sp\public\sdk\inc\winver.h +FILE 4514 f:\sp\public\sdk\inc\pshpack2.h +FILE 4515 f:\sp\public\sdk\inc\reason.h +FILE 4516 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 4517 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4518 f:\sp\vctools\crt_bld\self_x86\crt\src\mbsnbico.c +FILE 4519 f:\sp\public\sdk\inc\specstrings.h +FILE 4520 f:\sp\public\sdk\inc\basetsd.h +FILE 4521 f:\sp\public\sdk\inc\pshpack4.h +FILE 4522 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4523 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 4524 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4525 f:\sp\public\sdk\inc\winnetwk.h +FILE 4526 f:\sp\public\sdk\inc\stralign.h +FILE 4527 f:\sp\public\sdk\inc\poppack.h +FILE 4528 f:\sp\public\sdk\inc\winsvc.h +FILE 4529 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4530 f:\sp\public\sdk\inc\windef.h +FILE 4531 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4532 f:\sp\public\sdk\inc\winuser.h +FILE 4533 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4534 f:\sp\public\sdk\inc\windows.h +FILE 4535 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4536 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4537 f:\sp\public\sdk\inc\mcx.h +FILE 4538 f:\sp\public\sdk\inc\pshpack8.h +FILE 4539 f:\sp\public\sdk\inc\guiddef.h +FILE 4540 f:\sp\public\sdk\inc\winnt.h +FILE 4541 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4542 f:\sp\public\sdk\inc\winnls.h +FILE 4543 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4544 f:\sp\public\sdk\inc\pshpack1.h +FILE 4545 f:\sp\public\sdk\inc\winerror.h +FILE 4546 f:\sp\public\sdk\inc\winreg.h +FILE 4547 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4548 f:\sp\public\sdk\inc\ddbanned.h +FILE 4549 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4550 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4551 f:\sp\public\sdk\inc\tvout.h +FILE 4552 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4553 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4554 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4555 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 4556 f:\sp\public\sdk\inc\wincon.h +FILE 4557 f:\sp\public\sdk\inc\imm.h +FILE 4558 f:\sp\public\sdk\inc\winbase.h +FILE 4559 f:\sp\public\sdk\inc\wingdi.h +FILE 4560 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 4561 f:\sp\public\sdk\inc\winver.h +FILE 4562 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4563 f:\sp\public\sdk\inc\windows.h +FILE 4564 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4565 f:\sp\public\sdk\inc\pshpack2.h +FILE 4566 f:\sp\public\sdk\inc\reason.h +FILE 4567 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4568 f:\sp\vctools\crt_bld\self_x86\crt\src\mbschr.c +FILE 4569 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4570 f:\sp\public\sdk\inc\specstrings.h +FILE 4571 f:\sp\public\sdk\inc\basetsd.h +FILE 4572 f:\sp\public\sdk\inc\pshpack4.h +FILE 4573 f:\sp\public\sdk\inc\winnetwk.h +FILE 4574 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4575 f:\sp\public\sdk\inc\stralign.h +FILE 4576 f:\sp\public\sdk\inc\poppack.h +FILE 4577 f:\sp\public\sdk\inc\winsvc.h +FILE 4578 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4579 f:\sp\public\sdk\inc\windef.h +FILE 4580 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4581 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4582 f:\sp\public\sdk\inc\winuser.h +FILE 4583 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4584 f:\sp\public\sdk\inc\mcx.h +FILE 4585 f:\sp\public\sdk\inc\pshpack8.h +FILE 4586 f:\sp\public\sdk\inc\guiddef.h +FILE 4587 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 4588 f:\sp\public\sdk\inc\winnt.h +FILE 4589 f:\sp\public\sdk\inc\winnls.h +FILE 4590 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4591 f:\sp\public\sdk\inc\pshpack1.h +FILE 4592 f:\sp\public\sdk\inc\winerror.h +FILE 4593 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 4594 f:\sp\public\sdk\inc\winreg.h +FILE 4595 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4596 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4597 f:\sp\public\sdk\inc\ddbanned.h +FILE 4598 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4599 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4600 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4601 f:\sp\public\sdk\inc\tvout.h +FILE 4602 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4603 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 4604 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4605 f:\sp\public\sdk\inc\wincon.h +FILE 4606 f:\sp\public\sdk\inc\imm.h +FILE 4607 f:\sp\public\sdk\inc\winbase.h +FILE 4608 f:\sp\public\sdk\inc\wingdi.h +FILE 4609 f:\sp\public\sdk\inc\winver.h +FILE 4610 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4611 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4612 f:\sp\public\sdk\inc\pshpack2.h +FILE 4613 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 4614 f:\sp\public\sdk\inc\reason.h +FILE 4615 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.c +FILE 4616 f:\sp\public\sdk\inc\specstrings.h +FILE 4617 f:\sp\public\sdk\inc\basetsd.h +FILE 4618 f:\sp\public\sdk\inc\pshpack4.h +FILE 4619 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4620 f:\sp\public\sdk\inc\winnetwk.h +FILE 4621 f:\sp\public\sdk\inc\stralign.h +FILE 4622 f:\sp\public\sdk\inc\poppack.h +FILE 4623 f:\sp\public\sdk\inc\winsvc.h +FILE 4624 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4625 f:\sp\public\sdk\inc\windef.h +FILE 4626 f:\sp\public\sdk\inc\winuser.h +FILE 4627 f:\sp\public\sdk\inc\windows.h +FILE 4628 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4629 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4630 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4631 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4632 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4633 f:\sp\public\sdk\inc\mcx.h +FILE 4634 f:\sp\public\sdk\inc\pshpack8.h +FILE 4635 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4636 f:\sp\public\sdk\inc\guiddef.h +FILE 4637 f:\sp\public\sdk\inc\winnt.h +FILE 4638 f:\sp\public\sdk\inc\winnls.h +FILE 4639 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4640 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 4641 f:\sp\public\sdk\inc\pshpack1.h +FILE 4642 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4643 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4644 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4645 f:\sp\public\sdk\inc\winerror.h +FILE 4646 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 4647 f:\sp\public\sdk\inc\winreg.h +FILE 4648 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4649 f:\sp\public\sdk\inc\ddbanned.h +FILE 4650 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 4651 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4652 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 4653 f:\sp\public\sdk\inc\tvout.h +FILE 4654 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4655 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4656 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4657 f:\sp\public\sdk\inc\wincon.h +FILE 4658 f:\sp\public\sdk\inc\imm.h +FILE 4659 f:\sp\public\sdk\inc\winbase.h +FILE 4660 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4661 f:\sp\public\sdk\inc\wingdi.h +FILE 4662 f:\sp\public\sdk\inc\windef.h +FILE 4663 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 4664 f:\sp\public\sdk\inc\winver.h +FILE 4665 f:\sp\public\sdk\inc\pshpack2.h +FILE 4666 f:\sp\public\sdk\inc\reason.h +FILE 4667 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4668 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4669 f:\sp\vctools\crt_bld\self_x86\crt\src\ismbbyte.c +FILE 4670 f:\sp\public\sdk\inc\winnt.h +FILE 4671 f:\sp\public\sdk\inc\specstrings.h +FILE 4672 f:\sp\public\sdk\inc\basetsd.h +FILE 4673 f:\sp\public\sdk\inc\pshpack4.h +FILE 4674 f:\sp\public\sdk\inc\winnetwk.h +FILE 4675 f:\sp\public\sdk\inc\stralign.h +FILE 4676 f:\sp\public\sdk\inc\poppack.h +FILE 4677 f:\sp\public\sdk\inc\winsvc.h +FILE 4678 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4679 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4680 f:\sp\public\sdk\inc\winuser.h +FILE 4681 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4682 f:\sp\public\sdk\inc\mcx.h +FILE 4683 f:\sp\public\sdk\inc\pshpack8.h +FILE 4684 f:\sp\public\sdk\inc\guiddef.h +FILE 4685 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4686 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 4687 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4688 f:\sp\public\sdk\inc\windows.h +FILE 4689 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4690 f:\sp\public\sdk\inc\winnls.h +FILE 4691 f:\sp\public\sdk\inc\pshpack1.h +FILE 4692 f:\sp\public\sdk\inc\winerror.h +FILE 4693 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4694 f:\sp\public\sdk\inc\winreg.h +FILE 4695 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4696 f:\sp\public\sdk\inc\ddbanned.h +FILE 4697 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4698 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4699 f:\sp\public\sdk\inc\tvout.h +FILE 4700 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 4701 f:\sp\public\sdk\inc\winnetwk.h +FILE 4702 f:\sp\public\sdk\inc\imm.h +FILE 4703 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 4704 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4705 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 4706 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4707 f:\sp\public\sdk\inc\windef.h +FILE 4708 f:\sp\public\sdk\inc\pshpack1.h +FILE 4709 f:\sp\public\sdk\inc\winver.h +FILE 4710 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4711 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4712 f:\sp\public\sdk\inc\winnt.h +FILE 4713 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4714 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4715 f:\sp\public\sdk\inc\winreg.h +FILE 4716 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4717 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4718 f:\sp\public\sdk\inc\winbase.h +FILE 4719 f:\sp\public\sdk\inc\winerror.h +FILE 4720 f:\sp\public\sdk\inc\pshpack8.h +FILE 4721 f:\sp\vctools\crt_bld\self_x86\crt\src\putwch.c +FILE 4722 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4723 f:\sp\public\sdk\inc\reason.h +FILE 4724 f:\sp\public\sdk\inc\wincon.h +FILE 4725 f:\sp\public\sdk\inc\pshpack2.h +FILE 4726 f:\sp\public\sdk\inc\mcx.h +FILE 4727 f:\sp\public\sdk\inc\winuser.h +FILE 4728 f:\sp\public\sdk\inc\winnls.h +FILE 4729 f:\sp\public\sdk\inc\guiddef.h +FILE 4730 f:\sp\public\sdk\inc\stralign.h +FILE 4731 f:\sp\public\sdk\inc\ddbanned.h +FILE 4732 f:\sp\public\sdk\inc\specstrings.h +FILE 4733 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 4734 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4735 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4736 f:\sp\public\sdk\inc\basetsd.h +FILE 4737 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4738 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4739 f:\sp\public\sdk\inc\windows.h +FILE 4740 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4741 f:\sp\public\sdk\inc\tvout.h +FILE 4742 f:\sp\public\sdk\inc\winsvc.h +FILE 4743 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4744 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4745 f:\sp\public\sdk\inc\wingdi.h +FILE 4746 f:\sp\public\sdk\inc\pshpack4.h +FILE 4747 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 4748 f:\sp\public\sdk\inc\poppack.h +FILE 4749 f:\sp\public\sdk\inc\reason.h +FILE 4750 f:\sp\public\sdk\inc\wincon.h +FILE 4751 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 4752 f:\sp\public\sdk\inc\poppack.h +FILE 4753 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4754 f:\sp\public\sdk\inc\mcx.h +FILE 4755 f:\sp\public\sdk\inc\winuser.h +FILE 4756 f:\sp\public\sdk\inc\winnls.h +FILE 4757 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 4758 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4759 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4760 f:\sp\public\sdk\inc\stralign.h +FILE 4761 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4762 f:\sp\public\sdk\inc\windef.h +FILE 4763 f:\sp\public\sdk\inc\tvout.h +FILE 4764 f:\sp\public\sdk\inc\winsvc.h +FILE 4765 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 4766 f:\sp\public\sdk\inc\wingdi.h +FILE 4767 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4768 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4769 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4770 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4771 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4772 f:\sp\public\sdk\inc\winnt.h +FILE 4773 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4774 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4775 f:\sp\public\sdk\inc\winnetwk.h +FILE 4776 f:\sp\public\sdk\inc\imm.h +FILE 4777 f:\sp\vctools\crt_bld\self_x86\crt\src\write.c +FILE 4778 f:\sp\public\sdk\inc\winbase.h +FILE 4779 f:\sp\public\sdk\inc\winerror.h +FILE 4780 f:\sp\public\sdk\inc\pshpack1.h +FILE 4781 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4782 f:\sp\public\sdk\inc\pshpack8.h +FILE 4783 f:\sp\public\sdk\inc\winver.h +FILE 4784 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 4785 f:\sp\public\sdk\inc\ddbanned.h +FILE 4786 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4787 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4788 f:\sp\public\sdk\inc\pshpack2.h +FILE 4789 f:\sp\public\sdk\inc\winreg.h +FILE 4790 f:\sp\public\sdk\inc\guiddef.h +FILE 4791 f:\sp\public\sdk\inc\windows.h +FILE 4792 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4793 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4794 f:\sp\public\sdk\inc\specstrings.h +FILE 4795 f:\sp\public\sdk\inc\basetsd.h +FILE 4796 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4797 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4798 f:\sp\public\sdk\inc\pshpack4.h +FILE 4799 f:\sp\public\sdk\inc\reason.h +FILE 4800 f:\sp\public\sdk\inc\wincon.h +FILE 4801 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4802 f:\sp\public\sdk\inc\poppack.h +FILE 4803 f:\sp\public\sdk\inc\mcx.h +FILE 4804 f:\sp\public\sdk\inc\winuser.h +FILE 4805 f:\sp\public\sdk\inc\winnls.h +FILE 4806 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4807 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4808 f:\sp\public\sdk\inc\stralign.h +FILE 4809 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4810 f:\sp\public\sdk\inc\windef.h +FILE 4811 f:\sp\public\sdk\inc\tvout.h +FILE 4812 f:\sp\public\sdk\inc\winsvc.h +FILE 4813 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4814 f:\sp\public\sdk\inc\wingdi.h +FILE 4815 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4816 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4817 f:\sp\public\sdk\inc\winnt.h +FILE 4818 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4819 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4820 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 4821 f:\sp\public\sdk\inc\winnetwk.h +FILE 4822 f:\sp\public\sdk\inc\imm.h +FILE 4823 f:\sp\vctools\crt_bld\self_x86\crt\src\fcntl.h +FILE 4824 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4825 f:\sp\vctools\crt_bld\self_x86\crt\src\osfinfo.c +FILE 4826 f:\sp\public\sdk\inc\winbase.h +FILE 4827 f:\sp\public\sdk\inc\winerror.h +FILE 4828 f:\sp\public\sdk\inc\pshpack1.h +FILE 4829 f:\sp\public\sdk\inc\pshpack8.h +FILE 4830 f:\sp\public\sdk\inc\winver.h +FILE 4831 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4832 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 4833 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4834 f:\sp\public\sdk\inc\ddbanned.h +FILE 4835 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4836 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4837 f:\sp\public\sdk\inc\pshpack2.h +FILE 4838 f:\sp\public\sdk\inc\winreg.h +FILE 4839 f:\sp\public\sdk\inc\guiddef.h +FILE 4840 f:\sp\public\sdk\inc\windows.h +FILE 4841 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4842 f:\sp\public\sdk\inc\specstrings.h +FILE 4843 f:\sp\public\sdk\inc\basetsd.h +FILE 4844 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4845 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4846 f:\sp\public\sdk\inc\pshpack4.h +FILE 4847 f:\sp\public\sdk\inc\reason.h +FILE 4848 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4849 f:\sp\public\sdk\inc\wincon.h +FILE 4850 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4851 f:\sp\public\sdk\inc\poppack.h +FILE 4852 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4853 f:\sp\public\sdk\inc\mcx.h +FILE 4854 f:\sp\public\sdk\inc\winuser.h +FILE 4855 f:\sp\public\sdk\inc\winnls.h +FILE 4856 f:\sp\public\sdk\inc\stralign.h +FILE 4857 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4858 f:\sp\public\sdk\inc\windef.h +FILE 4859 f:\sp\public\sdk\inc\tvout.h +FILE 4860 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 4861 f:\sp\public\sdk\inc\winsvc.h +FILE 4862 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4863 f:\sp\public\sdk\inc\wingdi.h +FILE 4864 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4865 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4866 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4867 f:\sp\public\sdk\inc\winnt.h +FILE 4868 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4869 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4870 f:\sp\public\sdk\inc\winnetwk.h +FILE 4871 f:\sp\public\sdk\inc\imm.h +FILE 4872 f:\sp\vctools\crt_bld\self_x86\crt\src\lseeki64.c +FILE 4873 f:\sp\public\sdk\inc\winbase.h +FILE 4874 f:\sp\public\sdk\inc\winerror.h +FILE 4875 f:\sp\public\sdk\inc\pshpack1.h +FILE 4876 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 4877 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 4878 f:\sp\public\sdk\inc\pshpack8.h +FILE 4879 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4880 f:\sp\public\sdk\inc\winver.h +FILE 4881 f:\sp\public\sdk\inc\ddbanned.h +FILE 4882 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4883 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4884 f:\sp\public\sdk\inc\pshpack2.h +FILE 4885 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4886 f:\sp\public\sdk\inc\winreg.h +FILE 4887 f:\sp\public\sdk\inc\guiddef.h +FILE 4888 f:\sp\public\sdk\inc\windows.h +FILE 4889 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4890 f:\sp\public\sdk\inc\specstrings.h +FILE 4891 f:\sp\public\sdk\inc\basetsd.h +FILE 4892 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4893 f:\sp\public\sdk\inc\pshpack4.h +FILE 4894 f:\sp\public\sdk\inc\pshpack4.h +FILE 4895 f:\sp\public\sdk\inc\poppack.h +FILE 4896 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 4897 f:\sp\public\sdk\inc\winnetwk.h +FILE 4898 f:\sp\public\sdk\inc\imm.h +FILE 4899 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4900 f:\sp\public\sdk\inc\windef.h +FILE 4901 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4902 f:\sp\public\sdk\inc\pshpack1.h +FILE 4903 f:\sp\public\sdk\inc\winver.h +FILE 4904 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 4905 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4906 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4907 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4908 f:\sp\public\sdk\inc\winnt.h +FILE 4909 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4910 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4911 f:\sp\public\sdk\inc\winreg.h +FILE 4912 f:\sp\vctools\crt_bld\self_x86\crt\src\isatty.c +FILE 4913 f:\sp\public\sdk\inc\winbase.h +FILE 4914 f:\sp\public\sdk\inc\winerror.h +FILE 4915 f:\sp\public\sdk\inc\pshpack8.h +FILE 4916 f:\sp\public\sdk\inc\reason.h +FILE 4917 f:\sp\public\sdk\inc\wincon.h +FILE 4918 f:\sp\public\sdk\inc\ddbanned.h +FILE 4919 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4920 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4921 f:\sp\public\sdk\inc\pshpack2.h +FILE 4922 f:\sp\public\sdk\inc\mcx.h +FILE 4923 f:\sp\public\sdk\inc\winuser.h +FILE 4924 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4925 f:\sp\public\sdk\inc\winnls.h +FILE 4926 f:\sp\public\sdk\inc\guiddef.h +FILE 4927 f:\sp\public\sdk\inc\windows.h +FILE 4928 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4929 f:\sp\public\sdk\inc\specstrings.h +FILE 4930 f:\sp\public\sdk\inc\basetsd.h +FILE 4931 f:\sp\public\sdk\inc\stralign.h +FILE 4932 f:\sp\public\sdk\inc\tvout.h +FILE 4933 f:\sp\public\sdk\inc\winsvc.h +FILE 4934 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4935 f:\sp\public\sdk\inc\wingdi.h +FILE 4936 f:\sp\public\sdk\inc\poppack.h +FILE 4937 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4938 f:\sp\public\sdk\inc\winnetwk.h +FILE 4939 f:\sp\public\sdk\inc\imm.h +FILE 4940 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4941 f:\sp\public\sdk\inc\windef.h +FILE 4942 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4943 f:\sp\public\sdk\inc\pshpack1.h +FILE 4944 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 4945 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 4946 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 4947 f:\sp\public\sdk\inc\winver.h +FILE 4948 f:\sp\public\sdk\inc\windows.h +FILE 4949 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4950 f:\sp\public\sdk\inc\winnt.h +FILE 4951 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4952 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4953 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4954 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4955 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4956 f:\sp\public\sdk\inc\winreg.h +FILE 4957 f:\sp\public\sdk\inc\winbase.h +FILE 4958 f:\sp\vctools\crt_bld\self_x86\crt\src\ioinit.c +FILE 4959 f:\sp\public\sdk\inc\winerror.h +FILE 4960 f:\sp\public\sdk\inc\pshpack8.h +FILE 4961 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4962 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4963 f:\sp\public\sdk\inc\reason.h +FILE 4964 f:\sp\public\sdk\inc\wincon.h +FILE 4965 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4966 f:\sp\public\sdk\inc\ddbanned.h +FILE 4967 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4968 f:\sp\public\sdk\inc\pshpack2.h +FILE 4969 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4970 f:\sp\public\sdk\inc\mcx.h +FILE 4971 f:\sp\public\sdk\inc\winuser.h +FILE 4972 f:\sp\public\sdk\inc\winnls.h +FILE 4973 f:\sp\public\sdk\inc\guiddef.h +FILE 4974 f:\sp\public\sdk\inc\specstrings.h +FILE 4975 f:\sp\public\sdk\inc\basetsd.h +FILE 4976 f:\sp\public\sdk\inc\stralign.h +FILE 4977 f:\sp\public\sdk\inc\tvout.h +FILE 4978 f:\sp\public\sdk\inc\winsvc.h +FILE 4979 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4980 f:\sp\public\sdk\inc\wingdi.h +FILE 4981 f:\sp\public\sdk\inc\pshpack4.h +FILE 4982 f:\sp\public\sdk\inc\reason.h +FILE 4983 f:\sp\public\sdk\inc\wincon.h +FILE 4984 f:\sp\public\sdk\inc\pshpack2.h +FILE 4985 f:\sp\public\sdk\inc\mcx.h +FILE 4986 f:\sp\public\sdk\inc\winuser.h +FILE 4987 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4988 f:\sp\public\sdk\inc\winnls.h +FILE 4989 f:\sp\public\sdk\inc\guiddef.h +FILE 4990 f:\sp\public\sdk\inc\windows.h +FILE 4991 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4992 f:\sp\public\sdk\inc\specstrings.h +FILE 4993 f:\sp\public\sdk\inc\basetsd.h +FILE 4994 f:\sp\public\sdk\inc\stralign.h +FILE 4995 f:\sp\public\sdk\inc\tvout.h +FILE 4996 f:\sp\public\sdk\inc\winsvc.h +FILE 4997 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4998 f:\sp\public\sdk\inc\wingdi.h +FILE 4999 f:\sp\public\sdk\inc\pshpack4.h +FILE 5000 f:\sp\public\sdk\inc\poppack.h +FILE 5001 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 5002 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 5003 f:\sp\public\sdk\inc\winnetwk.h +FILE 5004 f:\sp\public\sdk\inc\imm.h +FILE 5005 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5006 f:\sp\public\sdk\inc\windef.h +FILE 5007 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5008 f:\sp\vctools\crt_bld\self_x86\crt\src\initcon.c +FILE 5009 f:\sp\public\sdk\inc\pshpack1.h +FILE 5010 f:\sp\public\sdk\inc\winver.h +FILE 5011 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5012 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5013 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5014 f:\sp\public\sdk\inc\winnt.h +FILE 5015 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5016 f:\sp\public\sdk\inc\ddbanned.h +FILE 5017 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5018 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5019 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5020 f:\sp\public\sdk\inc\winreg.h +FILE 5021 f:\sp\public\sdk\inc\winbase.h +FILE 5022 f:\sp\public\sdk\inc\winerror.h +FILE 5023 f:\sp\public\sdk\inc\pshpack8.h +FILE 5024 f:\sp\public\sdk\inc\poppack.h +FILE 5025 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 5026 f:\sp\public\sdk\inc\winnetwk.h +FILE 5027 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5028 f:\sp\public\sdk\inc\imm.h +FILE 5029 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5030 f:\sp\public\sdk\inc\windef.h +FILE 5031 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5032 f:\sp\public\sdk\inc\pshpack1.h +FILE 5033 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5034 f:\sp\public\sdk\inc\winver.h +FILE 5035 f:\sp\public\sdk\inc\windows.h +FILE 5036 f:\sp\public\sdk\inc\winnt.h +FILE 5037 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5038 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5039 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5040 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5041 f:\sp\public\sdk\inc\winreg.h +FILE 5042 f:\sp\public\sdk\inc\winbase.h +FILE 5043 f:\sp\vctools\crt_bld\self_x86\crt\src\commit.c +FILE 5044 f:\sp\public\sdk\inc\winerror.h +FILE 5045 f:\sp\public\sdk\inc\pshpack8.h +FILE 5046 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5047 f:\sp\public\sdk\inc\reason.h +FILE 5048 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 5049 f:\sp\public\sdk\inc\wincon.h +FILE 5050 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5051 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5052 f:\sp\public\sdk\inc\ddbanned.h +FILE 5053 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5054 f:\sp\public\sdk\inc\pshpack2.h +FILE 5055 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5056 f:\sp\public\sdk\inc\mcx.h +FILE 5057 f:\sp\public\sdk\inc\winuser.h +FILE 5058 f:\sp\public\sdk\inc\winnls.h +FILE 5059 f:\sp\public\sdk\inc\guiddef.h +FILE 5060 f:\sp\public\sdk\inc\specstrings.h +FILE 5061 f:\sp\public\sdk\inc\basetsd.h +FILE 5062 f:\sp\public\sdk\inc\stralign.h +FILE 5063 f:\sp\public\sdk\inc\tvout.h +FILE 5064 f:\sp\public\sdk\inc\winsvc.h +FILE 5065 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5066 f:\sp\public\sdk\inc\wingdi.h +FILE 5067 f:\sp\public\sdk\inc\pshpack4.h +FILE 5068 f:\sp\public\sdk\inc\reason.h +FILE 5069 f:\sp\public\sdk\inc\wincon.h +FILE 5070 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 5071 f:\sp\public\sdk\inc\poppack.h +FILE 5072 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5073 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5074 f:\sp\public\sdk\inc\mcx.h +FILE 5075 f:\sp\public\sdk\inc\winuser.h +FILE 5076 f:\sp\public\sdk\inc\winnls.h +FILE 5077 f:\sp\public\sdk\inc\stralign.h +FILE 5078 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5079 f:\sp\public\sdk\inc\windef.h +FILE 5080 f:\sp\public\sdk\inc\tvout.h +FILE 5081 f:\sp\public\sdk\inc\winsvc.h +FILE 5082 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5083 f:\sp\public\sdk\inc\wingdi.h +FILE 5084 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 5085 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5086 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5087 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 5088 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5089 f:\sp\public\sdk\inc\winnt.h +FILE 5090 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5091 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5092 f:\sp\public\sdk\inc\winnetwk.h +FILE 5093 f:\sp\public\sdk\inc\imm.h +FILE 5094 f:\sp\vctools\crt_bld\self_x86\crt\src\close.c +FILE 5095 f:\sp\public\sdk\inc\winbase.h +FILE 5096 f:\sp\public\sdk\inc\winerror.h +FILE 5097 f:\sp\public\sdk\inc\pshpack1.h +FILE 5098 f:\sp\public\sdk\inc\pshpack8.h +FILE 5099 f:\sp\public\sdk\inc\winver.h +FILE 5100 f:\sp\public\sdk\inc\ddbanned.h +FILE 5101 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5102 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5103 f:\sp\public\sdk\inc\pshpack2.h +FILE 5104 f:\sp\public\sdk\inc\winreg.h +FILE 5105 f:\sp\public\sdk\inc\guiddef.h +FILE 5106 f:\sp\public\sdk\inc\windows.h +FILE 5107 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5108 f:\sp\public\sdk\inc\specstrings.h +FILE 5109 f:\sp\public\sdk\inc\basetsd.h +FILE 5110 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5111 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5112 f:\sp\public\sdk\inc\pshpack4.h +FILE 5113 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\ulldvrm.asm +FILE 5114 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 5115 F:\SP\vctools\crt_bld\SELF_X86\crt\src\mm.inc +FILE 5116 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\llmul.asm +FILE 5117 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 5118 F:\SP\vctools\crt_bld\SELF_X86\crt\src\mm.inc +FILE 5119 f:\sp\vctools\crt_bld\self_x86\crt\src\use_ansi.h +FILE 5120 f:\sp\vctools\crt_bld\self_x86\crt\src\new +FILE 5121 f:\sp\vctools\crt_bld\self_x86\crt\src\exception +FILE 5122 f:\sp\vctools\crt_bld\self_x86\crt\src\xstddef +FILE 5123 f:\sp\vctools\crt_bld\self_x86\crt\src\new.cpp +FILE 5124 f:\sp\vctools\crt_bld\self_x86\crt\src\cstddef +FILE 5125 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 5126 f:\sp\vctools\crt_bld\self_x86\crt\src\eh.h +FILE 5127 f:\sp\vctools\crt_bld\self_x86\crt\src\cstdlib +FILE 5128 f:\sp\vctools\crt_bld\self_x86\crt\src\yvals.h +FILE 5129 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5130 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5131 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5132 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5133 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5134 f:\sp\public\sdk\inc\ddbanned.h +FILE 5135 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5136 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5137 f:\sp\public\sdk\inc\poppack.h +FILE 5138 f:\sp\public\sdk\inc\winnetwk.h +FILE 5139 f:\sp\public\sdk\inc\imm.h +FILE 5140 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5141 f:\sp\public\sdk\inc\windef.h +FILE 5142 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5143 f:\sp\public\sdk\inc\pshpack1.h +FILE 5144 f:\sp\public\sdk\inc\winver.h +FILE 5145 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5146 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5147 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5148 f:\sp\public\sdk\inc\winnt.h +FILE 5149 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5150 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5151 f:\sp\public\sdk\inc\winreg.h +FILE 5152 f:\sp\vctools\crt_bld\self_x86\crt\src\_newmode.c +FILE 5153 f:\sp\public\sdk\inc\winbase.h +FILE 5154 f:\sp\public\sdk\inc\winerror.h +FILE 5155 f:\sp\public\sdk\inc\pshpack8.h +FILE 5156 f:\sp\public\sdk\inc\reason.h +FILE 5157 f:\sp\public\sdk\inc\wincon.h +FILE 5158 f:\sp\public\sdk\inc\ddbanned.h +FILE 5159 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5160 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5161 f:\sp\public\sdk\inc\pshpack2.h +FILE 5162 f:\sp\public\sdk\inc\mcx.h +FILE 5163 f:\sp\public\sdk\inc\winuser.h +FILE 5164 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5165 f:\sp\public\sdk\inc\winnls.h +FILE 5166 f:\sp\public\sdk\inc\guiddef.h +FILE 5167 f:\sp\public\sdk\inc\windows.h +FILE 5168 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5169 f:\sp\public\sdk\inc\specstrings.h +FILE 5170 f:\sp\public\sdk\inc\basetsd.h +FILE 5171 f:\sp\public\sdk\inc\stralign.h +FILE 5172 f:\sp\public\sdk\inc\tvout.h +FILE 5173 f:\sp\public\sdk\inc\winsvc.h +FILE 5174 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5175 f:\sp\public\sdk\inc\wingdi.h +FILE 5176 f:\sp\public\sdk\inc\pshpack4.h +FILE 5177 f:\sp\vctools\crt_bld\self_x86\crt\src\new.h +FILE 5178 f:\sp\public\sdk\inc\winerror.h +FILE 5179 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 5180 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 5181 f:\sp\public\sdk\inc\winreg.h +FILE 5182 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5183 f:\sp\public\sdk\inc\tvout.h +FILE 5184 f:\sp\vctools\crt_bld\self_x86\crt\src\delete.cpp +FILE 5185 f:\sp\public\sdk\inc\wincon.h +FILE 5186 f:\sp\public\sdk\inc\imm.h +FILE 5187 f:\sp\public\sdk\inc\winbase.h +FILE 5188 f:\sp\public\sdk\inc\wingdi.h +FILE 5189 f:\sp\public\sdk\inc\winver.h +FILE 5190 f:\sp\public\sdk\inc\windows.h +FILE 5191 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5192 f:\sp\public\sdk\inc\pshpack2.h +FILE 5193 f:\sp\public\sdk\inc\reason.h +FILE 5194 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5195 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5196 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5197 f:\sp\public\sdk\inc\specstrings.h +FILE 5198 f:\sp\public\sdk\inc\basetsd.h +FILE 5199 f:\sp\public\sdk\inc\pshpack4.h +FILE 5200 f:\sp\public\sdk\inc\winnetwk.h +FILE 5201 f:\sp\public\sdk\inc\stralign.h +FILE 5202 f:\sp\public\sdk\inc\poppack.h +FILE 5203 f:\sp\public\sdk\inc\winsvc.h +FILE 5204 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5205 f:\sp\public\sdk\inc\windef.h +FILE 5206 f:\sp\public\sdk\inc\winuser.h +FILE 5207 f:\sp\public\sdk\inc\mcx.h +FILE 5208 f:\sp\public\sdk\inc\pshpack8.h +FILE 5209 f:\sp\public\sdk\inc\ddbanned.h +FILE 5210 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5211 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5212 f:\sp\public\sdk\inc\guiddef.h +FILE 5213 f:\sp\public\sdk\inc\winnt.h +FILE 5214 f:\sp\public\sdk\inc\winnls.h +FILE 5215 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5216 f:\sp\public\sdk\inc\pshpack1.h +FILE 5217 f:\sp\public\sdk\inc\tvout.h +FILE 5218 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5219 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 5220 f:\sp\public\sdk\inc\wincon.h +FILE 5221 f:\sp\public\sdk\inc\imm.h +FILE 5222 f:\sp\public\sdk\inc\winbase.h +FILE 5223 f:\sp\public\sdk\inc\wingdi.h +FILE 5224 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5225 f:\sp\public\sdk\inc\winver.h +FILE 5226 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5227 f:\sp\public\sdk\inc\windows.h +FILE 5228 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5229 f:\sp\public\sdk\inc\pshpack2.h +FILE 5230 f:\sp\vctools\crt_bld\self_x86\crt\src\handler.cpp +FILE 5231 f:\sp\public\sdk\inc\reason.h +FILE 5232 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5233 f:\sp\public\sdk\inc\specstrings.h +FILE 5234 f:\sp\public\sdk\inc\basetsd.h +FILE 5235 f:\sp\public\sdk\inc\pshpack4.h +FILE 5236 f:\sp\public\sdk\inc\winnetwk.h +FILE 5237 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 5238 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5239 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5240 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5241 f:\sp\public\sdk\inc\stralign.h +FILE 5242 f:\sp\public\sdk\inc\poppack.h +FILE 5243 f:\sp\public\sdk\inc\winsvc.h +FILE 5244 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5245 f:\sp\public\sdk\inc\windef.h +FILE 5246 f:\sp\public\sdk\inc\winuser.h +FILE 5247 f:\sp\public\sdk\inc\mcx.h +FILE 5248 f:\sp\public\sdk\inc\pshpack8.h +FILE 5249 f:\sp\public\sdk\inc\guiddef.h +FILE 5250 f:\sp\public\sdk\inc\winnt.h +FILE 5251 f:\sp\public\sdk\inc\winnls.h +FILE 5252 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5253 f:\sp\public\sdk\inc\pshpack1.h +FILE 5254 f:\sp\public\sdk\inc\winerror.h +FILE 5255 f:\sp\public\sdk\inc\ddbanned.h +FILE 5256 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5257 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5258 f:\sp\public\sdk\inc\winreg.h +FILE 5259 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5260 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5261 f:\sp\vctools\crt_bld\self_x86\crt\src\new.h +FILE 5262 f:\sp\public\sdk\inc\winsvc.h +FILE 5263 f:\sp\public\sdk\inc\wingdi.h +FILE 5264 f:\sp\public\sdk\inc\pshpack4.h +FILE 5265 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5266 f:\sp\public\sdk\inc\poppack.h +FILE 5267 f:\sp\public\sdk\inc\winnt.h +FILE 5268 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5269 f:\sp\public\sdk\inc\winnetwk.h +FILE 5270 f:\sp\public\sdk\inc\imm.h +FILE 5271 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5272 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 5273 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5274 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5275 f:\sp\public\sdk\inc\pshpack1.h +FILE 5276 f:\sp\public\sdk\inc\winver.h +FILE 5277 f:\sp\public\sdk\inc\guiddef.h +FILE 5278 f:\sp\public\sdk\inc\specstrings.h +FILE 5279 f:\sp\public\sdk\inc\basetsd.h +FILE 5280 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5281 f:\sp\vctools\crt_bld\self_x86\crt\src\sbheap.c +FILE 5282 f:\sp\public\sdk\inc\windows.h +FILE 5283 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5284 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5285 f:\sp\public\sdk\inc\winreg.h +FILE 5286 f:\sp\public\sdk\inc\winbase.h +FILE 5287 f:\sp\public\sdk\inc\winerror.h +FILE 5288 f:\sp\public\sdk\inc\pshpack8.h +FILE 5289 f:\sp\public\sdk\inc\ddbanned.h +FILE 5290 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5291 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5292 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5293 f:\sp\public\sdk\inc\reason.h +FILE 5294 f:\sp\public\sdk\inc\wincon.h +FILE 5295 f:\sp\public\sdk\inc\pshpack2.h +FILE 5296 f:\sp\public\sdk\inc\mcx.h +FILE 5297 f:\sp\public\sdk\inc\winuser.h +FILE 5298 f:\sp\public\sdk\inc\winnls.h +FILE 5299 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5300 f:\sp\public\sdk\inc\windef.h +FILE 5301 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5302 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5303 f:\sp\public\sdk\inc\stralign.h +FILE 5304 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5305 f:\sp\public\sdk\inc\tvout.h +FILE 5306 f:\sp\public\sdk\inc\winver.h +FILE 5307 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 5308 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 5309 f:\sp\public\sdk\inc\guiddef.h +FILE 5310 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5311 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5312 f:\sp\public\sdk\inc\specstrings.h +FILE 5313 f:\sp\public\sdk\inc\basetsd.h +FILE 5314 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5315 f:\sp\public\sdk\inc\windows.h +FILE 5316 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5317 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5318 f:\sp\public\sdk\inc\winreg.h +FILE 5319 f:\sp\public\sdk\inc\winbase.h +FILE 5320 f:\sp\public\sdk\inc\winerror.h +FILE 5321 f:\sp\public\sdk\inc\pshpack8.h +FILE 5322 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5323 f:\sp\public\sdk\inc\reason.h +FILE 5324 f:\sp\public\sdk\inc\wincon.h +FILE 5325 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5326 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5327 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5328 f:\sp\public\sdk\inc\pshpack2.h +FILE 5329 f:\sp\public\sdk\inc\mcx.h +FILE 5330 f:\sp\public\sdk\inc\winuser.h +FILE 5331 f:\sp\public\sdk\inc\winnls.h +FILE 5332 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5333 f:\sp\public\sdk\inc\windef.h +FILE 5334 f:\sp\public\sdk\inc\stralign.h +FILE 5335 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5336 f:\sp\public\sdk\inc\tvout.h +FILE 5337 f:\sp\public\sdk\inc\winsvc.h +FILE 5338 f:\sp\vctools\crt_bld\self_x86\crt\src\realloc.c +FILE 5339 f:\sp\public\sdk\inc\wingdi.h +FILE 5340 f:\sp\public\sdk\inc\pshpack4.h +FILE 5341 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5342 f:\sp\public\sdk\inc\poppack.h +FILE 5343 f:\sp\public\sdk\inc\winnt.h +FILE 5344 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5345 f:\sp\public\sdk\inc\winnetwk.h +FILE 5346 f:\sp\public\sdk\inc\ddbanned.h +FILE 5347 f:\sp\public\sdk\inc\imm.h +FILE 5348 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5349 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5350 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5351 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5352 f:\sp\public\sdk\inc\pshpack1.h +FILE 5353 f:\sp\public\sdk\inc\pshpack2.h +FILE 5354 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5355 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5356 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5357 f:\sp\public\sdk\inc\mcx.h +FILE 5358 f:\sp\public\sdk\inc\winuser.h +FILE 5359 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5360 f:\sp\public\sdk\inc\winnls.h +FILE 5361 f:\sp\public\sdk\inc\guiddef.h +FILE 5362 f:\sp\public\sdk\inc\windows.h +FILE 5363 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5364 f:\sp\public\sdk\inc\specstrings.h +FILE 5365 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5366 f:\sp\public\sdk\inc\basetsd.h +FILE 5367 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5368 f:\sp\public\sdk\inc\stralign.h +FILE 5369 f:\sp\public\sdk\inc\tvout.h +FILE 5370 f:\sp\public\sdk\inc\winsvc.h +FILE 5371 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5372 f:\sp\public\sdk\inc\wingdi.h +FILE 5373 f:\sp\public\sdk\inc\pshpack4.h +FILE 5374 f:\sp\public\sdk\inc\poppack.h +FILE 5375 f:\sp\public\sdk\inc\winnetwk.h +FILE 5376 f:\sp\public\sdk\inc\imm.h +FILE 5377 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5378 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5379 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5380 f:\sp\public\sdk\inc\windef.h +FILE 5381 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5382 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5383 f:\sp\vctools\crt_bld\self_x86\crt\src\msize.c +FILE 5384 f:\sp\public\sdk\inc\pshpack1.h +FILE 5385 f:\sp\public\sdk\inc\winver.h +FILE 5386 f:\sp\public\sdk\inc\winnt.h +FILE 5387 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5388 f:\sp\public\sdk\inc\winreg.h +FILE 5389 f:\sp\public\sdk\inc\ddbanned.h +FILE 5390 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5391 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5392 f:\sp\public\sdk\inc\winbase.h +FILE 5393 f:\sp\public\sdk\inc\winerror.h +FILE 5394 f:\sp\public\sdk\inc\pshpack8.h +FILE 5395 f:\sp\public\sdk\inc\reason.h +FILE 5396 f:\sp\public\sdk\inc\wincon.h +FILE 5397 f:\sp\public\sdk\inc\pshpack2.h +FILE 5398 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5399 f:\sp\public\sdk\inc\mcx.h +FILE 5400 f:\sp\public\sdk\inc\winuser.h +FILE 5401 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5402 f:\sp\public\sdk\inc\winnls.h +FILE 5403 f:\sp\public\sdk\inc\guiddef.h +FILE 5404 f:\sp\public\sdk\inc\windows.h +FILE 5405 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5406 f:\sp\public\sdk\inc\specstrings.h +FILE 5407 f:\sp\public\sdk\inc\basetsd.h +FILE 5408 f:\sp\public\sdk\inc\stralign.h +FILE 5409 f:\sp\public\sdk\inc\tvout.h +FILE 5410 f:\sp\public\sdk\inc\winsvc.h +FILE 5411 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5412 f:\sp\public\sdk\inc\wingdi.h +FILE 5413 f:\sp\public\sdk\inc\pshpack4.h +FILE 5414 f:\sp\public\sdk\inc\poppack.h +FILE 5415 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5416 f:\sp\public\sdk\inc\winnetwk.h +FILE 5417 f:\sp\public\sdk\inc\imm.h +FILE 5418 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5419 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5420 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5421 f:\sp\public\sdk\inc\windef.h +FILE 5422 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5423 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5424 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5425 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.c +FILE 5426 f:\sp\public\sdk\inc\pshpack1.h +FILE 5427 f:\sp\public\sdk\inc\winver.h +FILE 5428 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 5429 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 5430 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 5431 f:\sp\public\sdk\inc\winnt.h +FILE 5432 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5433 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5434 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5435 f:\sp\public\sdk\inc\winreg.h +FILE 5436 f:\sp\public\sdk\inc\ddbanned.h +FILE 5437 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5438 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5439 f:\sp\public\sdk\inc\winbase.h +FILE 5440 f:\sp\public\sdk\inc\winerror.h +FILE 5441 f:\sp\public\sdk\inc\pshpack8.h +FILE 5442 f:\sp\public\sdk\inc\reason.h +FILE 5443 f:\sp\public\sdk\inc\wincon.h +FILE 5444 f:\sp\public\sdk\inc\winver.h +FILE 5445 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5446 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5447 f:\sp\public\sdk\inc\winnt.h +FILE 5448 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5449 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5450 f:\sp\public\sdk\inc\winreg.h +FILE 5451 f:\sp\public\sdk\inc\winbase.h +FILE 5452 f:\sp\public\sdk\inc\winerror.h +FILE 5453 f:\sp\public\sdk\inc\pshpack8.h +FILE 5454 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5455 f:\sp\public\sdk\inc\reason.h +FILE 5456 f:\sp\public\sdk\inc\wincon.h +FILE 5457 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5458 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5459 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5460 f:\sp\public\sdk\inc\pshpack2.h +FILE 5461 f:\sp\public\sdk\inc\mcx.h +FILE 5462 f:\sp\public\sdk\inc\winuser.h +FILE 5463 f:\sp\public\sdk\inc\winnls.h +FILE 5464 f:\sp\public\sdk\inc\guiddef.h +FILE 5465 f:\sp\public\sdk\inc\stralign.h +FILE 5466 f:\sp\public\sdk\inc\specstrings.h +FILE 5467 f:\sp\public\sdk\inc\basetsd.h +FILE 5468 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5469 f:\sp\public\sdk\inc\windows.h +FILE 5470 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5471 f:\sp\public\sdk\inc\tvout.h +FILE 5472 f:\sp\public\sdk\inc\winsvc.h +FILE 5473 f:\sp\vctools\crt_bld\self_x86\crt\src\heapinit.c +FILE 5474 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5475 f:\sp\public\sdk\inc\wingdi.h +FILE 5476 f:\sp\public\sdk\inc\pshpack4.h +FILE 5477 f:\sp\public\sdk\inc\poppack.h +FILE 5478 f:\sp\public\sdk\inc\winnetwk.h +FILE 5479 f:\sp\public\sdk\inc\ddbanned.h +FILE 5480 f:\sp\public\sdk\inc\imm.h +FILE 5481 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5482 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5483 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5484 f:\sp\public\sdk\inc\windef.h +FILE 5485 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5486 f:\sp\public\sdk\inc\pshpack1.h +FILE 5487 f:\sp\public\sdk\inc\pshpack2.h +FILE 5488 f:\sp\public\sdk\inc\mcx.h +FILE 5489 f:\sp\public\sdk\inc\winuser.h +FILE 5490 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5491 f:\sp\public\sdk\inc\winnls.h +FILE 5492 f:\sp\public\sdk\inc\guiddef.h +FILE 5493 f:\sp\public\sdk\inc\windows.h +FILE 5494 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5495 f:\sp\public\sdk\inc\specstrings.h +FILE 5496 f:\sp\public\sdk\inc\basetsd.h +FILE 5497 f:\sp\public\sdk\inc\stralign.h +FILE 5498 f:\sp\public\sdk\inc\tvout.h +FILE 5499 f:\sp\public\sdk\inc\winsvc.h +FILE 5500 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5501 f:\sp\public\sdk\inc\wingdi.h +FILE 5502 f:\sp\public\sdk\inc\pshpack4.h +FILE 5503 f:\sp\public\sdk\inc\poppack.h +FILE 5504 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5505 f:\sp\public\sdk\inc\winnetwk.h +FILE 5506 f:\sp\public\sdk\inc\imm.h +FILE 5507 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5508 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5509 f:\sp\public\sdk\inc\windef.h +FILE 5510 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5511 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5512 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5513 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5514 f:\sp\public\sdk\inc\pshpack1.h +FILE 5515 f:\sp\vctools\crt_bld\self_x86\crt\src\free.c +FILE 5516 f:\sp\public\sdk\inc\winver.h +FILE 5517 f:\sp\public\sdk\inc\winnt.h +FILE 5518 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5519 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 5520 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 5521 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5522 f:\sp\public\sdk\inc\winreg.h +FILE 5523 f:\sp\public\sdk\inc\ddbanned.h +FILE 5524 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5525 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5526 f:\sp\public\sdk\inc\winbase.h +FILE 5527 f:\sp\public\sdk\inc\winerror.h +FILE 5528 f:\sp\public\sdk\inc\pshpack8.h +FILE 5529 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5530 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5531 f:\sp\public\sdk\inc\reason.h +FILE 5532 f:\sp\public\sdk\inc\wincon.h +FILE 5533 f:\sp\public\sdk\inc\pshpack2.h +FILE 5534 f:\sp\public\sdk\inc\mcx.h +FILE 5535 f:\sp\public\sdk\inc\winuser.h +FILE 5536 f:\sp\public\sdk\inc\winnls.h +FILE 5537 f:\sp\public\sdk\inc\guiddef.h +FILE 5538 f:\sp\public\sdk\inc\windows.h +FILE 5539 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5540 f:\sp\public\sdk\inc\specstrings.h +FILE 5541 f:\sp\public\sdk\inc\basetsd.h +FILE 5542 f:\sp\public\sdk\inc\stralign.h +FILE 5543 f:\sp\public\sdk\inc\tvout.h +FILE 5544 f:\sp\public\sdk\inc\winsvc.h +FILE 5545 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5546 f:\sp\public\sdk\inc\wingdi.h +FILE 5547 f:\sp\public\sdk\inc\pshpack4.h +FILE 5548 f:\sp\public\sdk\inc\poppack.h +FILE 5549 f:\sp\public\sdk\inc\winnetwk.h +FILE 5550 f:\sp\public\sdk\inc\imm.h +FILE 5551 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5552 f:\sp\public\sdk\inc\windef.h +FILE 5553 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5554 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5555 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5556 f:\sp\public\sdk\inc\pshpack1.h +FILE 5557 f:\sp\vctools\crt_bld\self_x86\crt\src\crtheap.c +FILE 5558 f:\sp\public\sdk\inc\winver.h +FILE 5559 f:\sp\public\sdk\inc\winnt.h +FILE 5560 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5561 f:\sp\public\sdk\inc\winreg.h +FILE 5562 f:\sp\public\sdk\inc\ddbanned.h +FILE 5563 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5564 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5565 f:\sp\public\sdk\inc\winbase.h +FILE 5566 f:\sp\public\sdk\inc\winerror.h +FILE 5567 f:\sp\public\sdk\inc\pshpack8.h +FILE 5568 f:\sp\public\sdk\inc\reason.h +FILE 5569 f:\sp\public\sdk\inc\wincon.h +FILE 5570 f:\sp\public\sdk\inc\pshpack2.h +FILE 5571 f:\sp\public\sdk\inc\mcx.h +FILE 5572 f:\sp\public\sdk\inc\winuser.h +FILE 5573 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5574 f:\sp\public\sdk\inc\winnls.h +FILE 5575 f:\sp\public\sdk\inc\stralign.h +FILE 5576 f:\sp\public\sdk\inc\tvout.h +FILE 5577 f:\sp\public\sdk\inc\winsvc.h +FILE 5578 f:\sp\public\sdk\inc\wingdi.h +FILE 5579 f:\sp\public\sdk\inc\winnt.h +FILE 5580 f:\sp\public\sdk\inc\pshpack4.h +FILE 5581 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5582 f:\sp\public\sdk\inc\poppack.h +FILE 5583 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5584 f:\sp\public\sdk\inc\winnetwk.h +FILE 5585 f:\sp\public\sdk\inc\imm.h +FILE 5586 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5587 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5588 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5589 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5590 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5591 f:\sp\public\sdk\inc\pshpack1.h +FILE 5592 f:\sp\vctools\crt_bld\self_x86\crt\src\calloc.c +FILE 5593 f:\sp\public\sdk\inc\winver.h +FILE 5594 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5595 f:\sp\public\sdk\inc\guiddef.h +FILE 5596 f:\sp\public\sdk\inc\windows.h +FILE 5597 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5598 f:\sp\public\sdk\inc\specstrings.h +FILE 5599 f:\sp\public\sdk\inc\basetsd.h +FILE 5600 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 5601 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 5602 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5603 f:\sp\public\sdk\inc\winreg.h +FILE 5604 f:\sp\public\sdk\inc\ddbanned.h +FILE 5605 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5606 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5607 f:\sp\public\sdk\inc\winbase.h +FILE 5608 f:\sp\public\sdk\inc\winerror.h +FILE 5609 f:\sp\public\sdk\inc\pshpack8.h +FILE 5610 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5611 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5612 f:\sp\public\sdk\inc\reason.h +FILE 5613 f:\sp\public\sdk\inc\wincon.h +FILE 5614 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5615 f:\sp\public\sdk\inc\windef.h +FILE 5616 f:\sp\public\sdk\inc\wincon.h +FILE 5617 f:\sp\public\sdk\inc\imm.h +FILE 5618 f:\sp\public\sdk\inc\winbase.h +FILE 5619 f:\sp\public\sdk\inc\wingdi.h +FILE 5620 f:\sp\public\sdk\inc\winver.h +FILE 5621 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 5622 f:\sp\public\sdk\inc\pshpack2.h +FILE 5623 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 5624 f:\sp\public\sdk\inc\reason.h +FILE 5625 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 5626 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\setjmp.h +FILE 5627 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\i386\trnsctrl.cpp +FILE 5628 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\process.h +FILE 5629 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 5630 f:\sp\public\sdk\inc\specstrings.h +FILE 5631 f:\sp\public\sdk\inc\basetsd.h +FILE 5632 f:\sp\public\sdk\inc\pshpack4.h +FILE 5633 f:\sp\public\sdk\inc\winnetwk.h +FILE 5634 f:\sp\public\sdk\inc\stralign.h +FILE 5635 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\trnsctrl.h +FILE 5636 f:\sp\public\sdk\inc\poppack.h +FILE 5637 f:\sp\public\sdk\inc\winsvc.h +FILE 5638 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5639 f:\sp\public\sdk\inc\windef.h +FILE 5640 f:\sp\public\sdk\inc\winuser.h +FILE 5641 f:\sp\public\sdk\inc\windows.h +FILE 5642 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5643 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5644 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5645 f:\sp\public\sdk\inc\mcx.h +FILE 5646 f:\sp\public\sdk\inc\pshpack8.h +FILE 5647 f:\sp\public\sdk\inc\guiddef.h +FILE 5648 f:\sp\public\sdk\inc\winnt.h +FILE 5649 f:\sp\public\sdk\inc\winnls.h +FILE 5650 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5651 f:\sp\public\sdk\inc\pshpack1.h +FILE 5652 f:\sp\public\sdk\inc\winerror.h +FILE 5653 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5654 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5655 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 5656 f:\sp\public\sdk\inc\winreg.h +FILE 5657 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5658 f:\sp\public\sdk\inc\ddbanned.h +FILE 5659 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5660 f:\sp\public\sdk\inc\tvout.h +FILE 5661 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5662 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5663 f:\sp\vctools\langapi\include\ehdata.h +FILE 5664 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5665 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\eh\i386\lowhelpr.asm +FILE 5666 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\cruntime.inc +FILE 5667 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\exsup.inc +FILE 5668 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\process.h +FILE 5669 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5670 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5671 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\i386\ehprolg3.c +FILE 5672 f:\sp\public\sdk\inc\ddbanned.h +FILE 5673 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5674 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5675 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 5676 f:\sp\public\sdk\inc\wincon.h +FILE 5677 f:\sp\public\sdk\inc\imm.h +FILE 5678 f:\sp\public\sdk\inc\winbase.h +FILE 5679 f:\sp\public\sdk\inc\wingdi.h +FILE 5680 f:\sp\public\sdk\inc\winver.h +FILE 5681 f:\sp\public\sdk\inc\pshpack2.h +FILE 5682 f:\sp\public\sdk\inc\reason.h +FILE 5683 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\validate.cpp +FILE 5684 f:\sp\public\sdk\inc\specstrings.h +FILE 5685 f:\sp\public\sdk\inc\basetsd.h +FILE 5686 f:\sp\public\sdk\inc\pshpack4.h +FILE 5687 f:\sp\public\sdk\inc\winnetwk.h +FILE 5688 f:\sp\public\sdk\inc\stralign.h +FILE 5689 f:\sp\public\sdk\inc\poppack.h +FILE 5690 f:\sp\public\sdk\inc\winsvc.h +FILE 5691 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5692 f:\sp\public\sdk\inc\windef.h +FILE 5693 f:\sp\public\sdk\inc\winuser.h +FILE 5694 f:\sp\public\sdk\inc\windows.h +FILE 5695 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5696 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5697 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5698 f:\sp\public\sdk\inc\mcx.h +FILE 5699 f:\sp\public\sdk\inc\pshpack8.h +FILE 5700 f:\sp\public\sdk\inc\guiddef.h +FILE 5701 f:\sp\public\sdk\inc\winnt.h +FILE 5702 f:\sp\public\sdk\inc\winnls.h +FILE 5703 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5704 f:\sp\public\sdk\inc\pshpack1.h +FILE 5705 f:\sp\public\sdk\inc\winerror.h +FILE 5706 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5707 f:\sp\public\sdk\inc\winreg.h +FILE 5708 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5709 f:\sp\public\sdk\inc\ddbanned.h +FILE 5710 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5711 f:\sp\public\sdk\inc\tvout.h +FILE 5712 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5713 f:\sp\public\sdk\inc\wincon.h +FILE 5714 f:\sp\public\sdk\inc\imm.h +FILE 5715 f:\sp\public\sdk\inc\winbase.h +FILE 5716 f:\sp\public\sdk\inc\wingdi.h +FILE 5717 f:\sp\public\sdk\inc\winver.h +FILE 5718 f:\sp\public\sdk\inc\pshpack2.h +FILE 5719 f:\sp\public\sdk\inc\reason.h +FILE 5720 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 5721 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\unhandld.cpp +FILE 5722 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5723 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 5724 f:\sp\public\sdk\inc\specstrings.h +FILE 5725 f:\sp\public\sdk\inc\basetsd.h +FILE 5726 f:\sp\public\sdk\inc\pshpack4.h +FILE 5727 f:\sp\public\sdk\inc\winnetwk.h +FILE 5728 f:\sp\public\sdk\inc\stralign.h +FILE 5729 f:\sp\public\sdk\inc\poppack.h +FILE 5730 f:\sp\public\sdk\inc\winsvc.h +FILE 5731 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5732 f:\sp\public\sdk\inc\windef.h +FILE 5733 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 5734 f:\sp\public\sdk\inc\winuser.h +FILE 5735 f:\sp\public\sdk\inc\windows.h +FILE 5736 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5737 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5738 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5739 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 5740 f:\sp\public\sdk\inc\mcx.h +FILE 5741 f:\sp\public\sdk\inc\pshpack8.h +FILE 5742 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 5743 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5744 f:\sp\public\sdk\inc\guiddef.h +FILE 5745 f:\sp\public\sdk\inc\winnt.h +FILE 5746 f:\sp\public\sdk\inc\winnls.h +FILE 5747 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5748 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5749 f:\sp\public\sdk\inc\pshpack1.h +FILE 5750 f:\sp\public\sdk\inc\winerror.h +FILE 5751 f:\sp\vctools\langapi\include\ehdata.h +FILE 5752 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5753 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 5754 f:\sp\public\sdk\inc\winreg.h +FILE 5755 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5756 f:\sp\public\sdk\inc\ddbanned.h +FILE 5757 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5758 f:\sp\public\sdk\inc\tvout.h +FILE 5759 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5760 f:\sp\public\sdk\inc\specstrings.h +FILE 5761 f:\sp\public\sdk\inc\basetsd.h +FILE 5762 f:\sp\public\sdk\inc\pshpack4.h +FILE 5763 f:\sp\public\sdk\inc\winnetwk.h +FILE 5764 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5765 f:\sp\public\sdk\inc\stralign.h +FILE 5766 f:\sp\public\sdk\inc\poppack.h +FILE 5767 f:\sp\public\sdk\inc\winsvc.h +FILE 5768 f:\sp\public\sdk\inc\winuser.h +FILE 5769 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5770 f:\sp\public\sdk\inc\windef.h +FILE 5771 f:\sp\vctools\langapi\undname\undname.cxx +FILE 5772 f:\sp\public\sdk\inc\mcx.h +FILE 5773 f:\sp\public\sdk\inc\pshpack8.h +FILE 5774 f:\sp\public\sdk\inc\guiddef.h +FILE 5775 f:\sp\vctools\langapi\undname\utf8.h +FILE 5776 f:\sp\public\sdk\inc\winnls.h +FILE 5777 f:\sp\public\sdk\inc\pshpack1.h +FILE 5778 f:\sp\public\sdk\inc\winnt.h +FILE 5779 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5780 f:\sp\public\sdk\inc\winerror.h +FILE 5781 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\swprintf.inl +FILE 5782 f:\sp\vctools\langapi\undname\undname.hxx +FILE 5783 f:\sp\vctools\langapi\undname\undname.h +FILE 5784 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5785 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5786 f:\sp\public\sdk\inc\winreg.h +FILE 5787 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5788 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5789 f:\sp\public\sdk\inc\tvout.h +FILE 5790 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdio.h +FILE 5791 f:\sp\public\sdk\inc\wincon.h +FILE 5792 f:\sp\public\sdk\inc\imm.h +FILE 5793 f:\sp\public\sdk\inc\winbase.h +FILE 5794 f:\sp\public\sdk\inc\wingdi.h +FILE 5795 f:\sp\public\sdk\inc\winver.h +FILE 5796 f:\sp\public\sdk\inc\pshpack2.h +FILE 5797 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5798 f:\sp\public\sdk\inc\windows.h +FILE 5799 f:\sp\public\sdk\inc\reason.h +FILE 5800 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5801 f:\sp\public\sdk\inc\ddbanned.h +FILE 5802 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5803 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5804 f:\sp\vctools\langapi\undname\undname.inl +FILE 5805 f:\sp\public\sdk\inc\guiddef.h +FILE 5806 f:\sp\public\sdk\inc\winnt.h +FILE 5807 f:\sp\public\sdk\inc\winnls.h +FILE 5808 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5809 f:\sp\public\sdk\inc\pshpack1.h +FILE 5810 f:\sp\public\sdk\inc\winerror.h +FILE 5811 f:\sp\public\sdk\inc\winreg.h +FILE 5812 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5813 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5814 f:\sp\public\sdk\inc\tvout.h +FILE 5815 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\typname.cpp +FILE 5816 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 5817 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\cstddef +FILE 5818 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5819 f:\sp\public\sdk\inc\wincon.h +FILE 5820 f:\sp\public\sdk\inc\imm.h +FILE 5821 f:\sp\public\sdk\inc\winbase.h +FILE 5822 f:\sp\public\sdk\inc\wingdi.h +FILE 5823 f:\sp\public\sdk\inc\winver.h +FILE 5824 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5825 f:\sp\public\sdk\inc\windows.h +FILE 5826 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5827 f:\sp\public\sdk\inc\pshpack2.h +FILE 5828 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5829 f:\sp\public\sdk\inc\reason.h +FILE 5830 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 5831 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\dbgint.h +FILE 5832 f:\sp\public\sdk\inc\specstrings.h +FILE 5833 f:\sp\public\sdk\inc\basetsd.h +FILE 5834 f:\sp\public\sdk\inc\pshpack4.h +FILE 5835 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\typeinfo.h +FILE 5836 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\typeinfo +FILE 5837 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\exception +FILE 5838 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\xstddef +FILE 5839 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5840 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\yvals.h +FILE 5841 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\use_ansi.h +FILE 5842 f:\sp\public\sdk\inc\winnetwk.h +FILE 5843 f:\sp\vctools\langapi\undname\undname.h +FILE 5844 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 5845 f:\sp\public\sdk\inc\stralign.h +FILE 5846 f:\sp\public\sdk\inc\poppack.h +FILE 5847 f:\sp\public\sdk\inc\winsvc.h +FILE 5848 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5849 f:\sp\public\sdk\inc\windef.h +FILE 5850 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 5851 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5852 f:\sp\public\sdk\inc\winuser.h +FILE 5853 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5854 f:\sp\public\sdk\inc\ddbanned.h +FILE 5855 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5856 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5857 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 5858 f:\sp\public\sdk\inc\mcx.h +FILE 5859 f:\sp\public\sdk\inc\pshpack8.h +FILE 5860 f:\sp\public\sdk\inc\winnls.h +FILE 5861 f:\sp\public\sdk\inc\pshpack1.h +FILE 5862 f:\sp\public\sdk\inc\winnt.h +FILE 5863 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5864 f:\sp\public\sdk\inc\winerror.h +FILE 5865 f:\sp\public\sdk\inc\winreg.h +FILE 5866 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5867 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5868 f:\sp\public\sdk\inc\tvout.h +FILE 5869 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\dbgint.h +FILE 5870 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 5871 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\cstddef +FILE 5872 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5873 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\typinfo.cpp +FILE 5874 f:\sp\public\sdk\inc\wincon.h +FILE 5875 f:\sp\public\sdk\inc\imm.h +FILE 5876 f:\sp\public\sdk\inc\winbase.h +FILE 5877 f:\sp\public\sdk\inc\wingdi.h +FILE 5878 f:\sp\public\sdk\inc\winver.h +FILE 5879 f:\sp\public\sdk\inc\pshpack2.h +FILE 5880 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5881 f:\sp\public\sdk\inc\reason.h +FILE 5882 f:\sp\public\sdk\inc\windows.h +FILE 5883 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5884 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5885 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5886 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5887 f:\sp\public\sdk\inc\specstrings.h +FILE 5888 f:\sp\public\sdk\inc\basetsd.h +FILE 5889 f:\sp\public\sdk\inc\pshpack4.h +FILE 5890 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\typeinfo +FILE 5891 f:\sp\public\sdk\inc\winnetwk.h +FILE 5892 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\exception +FILE 5893 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\xstddef +FILE 5894 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5895 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\yvals.h +FILE 5896 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\use_ansi.h +FILE 5897 f:\sp\public\sdk\inc\stralign.h +FILE 5898 f:\sp\public\sdk\inc\poppack.h +FILE 5899 f:\sp\public\sdk\inc\winsvc.h +FILE 5900 f:\sp\public\sdk\inc\winuser.h +FILE 5901 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5902 f:\sp\public\sdk\inc\windef.h +FILE 5903 f:\sp\vctools\langapi\undname\undname.h +FILE 5904 f:\sp\public\sdk\inc\ddbanned.h +FILE 5905 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 5906 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5907 f:\sp\public\sdk\inc\mcx.h +FILE 5908 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5909 f:\sp\public\sdk\inc\pshpack8.h +FILE 5910 f:\sp\public\sdk\inc\guiddef.h +FILE 5911 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5912 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\typeinfo +FILE 5913 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5914 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\exception +FILE 5915 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\xstddef +FILE 5916 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\stdexcpt.cpp +FILE 5917 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\yvals.h +FILE 5918 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\use_ansi.h +FILE 5919 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5920 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5921 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5922 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5923 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\cstddef +FILE 5924 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5925 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 5926 f:\sp\public\sdk\inc\ddbanned.h +FILE 5927 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5928 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5929 f:\sp\vctools\langapi\include\ehdata.h +FILE 5930 f:\sp\public\sdk\inc\wincon.h +FILE 5931 f:\sp\public\sdk\inc\imm.h +FILE 5932 f:\sp\public\sdk\inc\winbase.h +FILE 5933 f:\sp\public\sdk\inc\wingdi.h +FILE 5934 f:\sp\public\sdk\inc\winver.h +FILE 5935 f:\sp\public\sdk\inc\windows.h +FILE 5936 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5937 f:\sp\public\sdk\inc\pshpack2.h +FILE 5938 f:\sp\public\sdk\inc\reason.h +FILE 5939 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp +FILE 5940 f:\sp\public\sdk\inc\specstrings.h +FILE 5941 f:\sp\public\sdk\inc\basetsd.h +FILE 5942 f:\sp\public\sdk\inc\pshpack4.h +FILE 5943 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5944 f:\sp\public\sdk\inc\winnetwk.h +FILE 5945 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5946 f:\sp\public\sdk\inc\stralign.h +FILE 5947 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5948 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5949 f:\sp\public\sdk\inc\poppack.h +FILE 5950 f:\sp\public\sdk\inc\winsvc.h +FILE 5951 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5952 f:\sp\public\sdk\inc\windef.h +FILE 5953 f:\sp\public\sdk\inc\winuser.h +FILE 5954 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 5955 f:\sp\public\sdk\inc\mcx.h +FILE 5956 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 5957 f:\sp\public\sdk\inc\pshpack8.h +FILE 5958 f:\sp\public\sdk\inc\guiddef.h +FILE 5959 f:\sp\public\sdk\inc\winnt.h +FILE 5960 f:\sp\public\sdk\inc\winnls.h +FILE 5961 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5962 f:\sp\public\sdk\inc\pshpack1.h +FILE 5963 f:\sp\public\sdk\inc\winerror.h +FILE 5964 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5965 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5966 f:\sp\public\sdk\inc\ddbanned.h +FILE 5967 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5968 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5969 f:\sp\public\sdk\inc\winreg.h +FILE 5970 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5971 f:\sp\public\sdk\inc\tvout.h +FILE 5972 f:\sp\public\sdk\inc\poppack.h +FILE 5973 f:\sp\public\sdk\inc\winsvc.h +FILE 5974 f:\sp\public\sdk\inc\windows.h +FILE 5975 f:\sp\public\sdk\inc\winuser.h +FILE 5976 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5977 f:\sp\public\sdk\inc\windef.h +FILE 5978 f:\sp\public\sdk\inc\mcx.h +FILE 5979 f:\sp\public\sdk\inc\pshpack8.h +FILE 5980 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5981 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5982 f:\sp\public\sdk\inc\guiddef.h +FILE 5983 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\hooks.cpp +FILE 5984 f:\sp\public\sdk\inc\winnls.h +FILE 5985 f:\sp\public\sdk\inc\pshpack1.h +FILE 5986 f:\sp\public\sdk\inc\winnt.h +FILE 5987 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5988 f:\sp\public\sdk\inc\winerror.h +FILE 5989 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5990 f:\sp\public\sdk\inc\winreg.h +FILE 5991 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5992 f:\sp\public\sdk\inc\tvout.h +FILE 5993 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5994 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 5995 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5996 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5997 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5998 f:\sp\public\sdk\inc\wincon.h +FILE 5999 f:\sp\public\sdk\inc\imm.h +FILE 6000 f:\sp\public\sdk\inc\winbase.h +FILE 6001 f:\sp\public\sdk\inc\wingdi.h +FILE 6002 f:\sp\public\sdk\inc\winver.h +FILE 6003 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 6004 f:\sp\public\sdk\inc\pshpack2.h +FILE 6005 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 6006 f:\sp\public\sdk\inc\reason.h +FILE 6007 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 6008 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 6009 f:\sp\public\sdk\inc\specstrings.h +FILE 6010 f:\sp\public\sdk\inc\basetsd.h +FILE 6011 f:\sp\public\sdk\inc\pshpack4.h +FILE 6012 f:\sp\public\sdk\inc\ddbanned.h +FILE 6013 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 6014 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 6015 f:\sp\public\sdk\inc\winnetwk.h +FILE 6016 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 6017 f:\sp\public\sdk\inc\stralign.h +FILE 6018 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 6019 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 6020 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 6021 f:\sp\public\sdk\inc\wincon.h +FILE 6022 f:\sp\public\sdk\inc\imm.h +FILE 6023 f:\sp\public\sdk\inc\guiddef.h +FILE 6024 f:\sp\public\sdk\inc\winbase.h +FILE 6025 f:\sp\public\sdk\inc\wingdi.h +FILE 6026 f:\sp\vctools\langapi\include\ehdata.h +FILE 6027 f:\sp\public\sdk\inc\winver.h +FILE 6028 f:\sp\public\sdk\inc\winnt.h +FILE 6029 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 6030 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 6031 f:\sp\public\sdk\inc\pshpack2.h +FILE 6032 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 6033 f:\sp\public\sdk\inc\reason.h +FILE 6034 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\frame.cpp +FILE 6035 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\exception +FILE 6036 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\typeinfo.h +FILE 6037 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\typeinfo +FILE 6038 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\xstddef +FILE 6039 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\yvals.h +FILE 6040 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\use_ansi.h +FILE 6041 f:\sp\public\sdk\inc\pshpack4.h +FILE 6042 f:\sp\public\sdk\inc\winnetwk.h +FILE 6043 f:\sp\public\sdk\inc\stralign.h +FILE 6044 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 6045 f:\sp\public\sdk\inc\poppack.h +FILE 6046 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 6047 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 6048 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 6049 f:\sp\public\sdk\inc\winsvc.h +FILE 6050 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehstate.h +FILE 6051 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 6052 f:\sp\public\sdk\inc\winuser.h +FILE 6053 f:\sp\public\sdk\inc\windows.h +FILE 6054 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 6055 f:\sp\public\sdk\inc\mcx.h +FILE 6056 f:\sp\public\sdk\inc\pshpack8.h +FILE 6057 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 6058 f:\sp\public\sdk\inc\specstrings.h +FILE 6059 f:\sp\public\sdk\inc\basetsd.h +FILE 6060 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 6061 f:\sp\public\sdk\inc\winnls.h +FILE 6062 f:\sp\public\sdk\inc\pshpack1.h +FILE 6063 f:\sp\public\sdk\inc\winerror.h +FILE 6064 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\trnsctrl.h +FILE 6065 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 6066 f:\sp\public\sdk\inc\winreg.h +FILE 6067 f:\sp\public\sdk\inc\ddbanned.h +FILE 6068 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 6069 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\cstddef +FILE 6070 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 6071 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 6072 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 6073 f:\sp\public\sdk\inc\windef.h +FILE 6074 f:\sp\public\sdk\inc\tvout.h +FILE 6075 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6076 f:\sp\public\sdk\inc\pshpack4.h +FILE 6077 f:\sp\public\sdk\inc\reason.h +FILE 6078 f:\sp\public\sdk\inc\wincon.h +FILE 6079 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6080 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6081 f:\sp\public\sdk\inc\poppack.h +FILE 6082 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6083 f:\sp\public\sdk\inc\mcx.h +FILE 6084 f:\sp\public\sdk\inc\winuser.h +FILE 6085 f:\sp\public\sdk\inc\winnls.h +FILE 6086 f:\sp\public\sdk\inc\stralign.h +FILE 6087 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6088 f:\sp\public\sdk\inc\windef.h +FILE 6089 f:\sp\public\sdk\inc\tvout.h +FILE 6090 f:\sp\public\sdk\inc\winsvc.h +FILE 6091 f:\sp\public\sdk\inc\wingdi.h +FILE 6092 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6093 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6094 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6095 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6096 f:\sp\public\sdk\inc\winnt.h +FILE 6097 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6098 f:\sp\public\sdk\inc\winnetwk.h +FILE 6099 f:\sp\public\sdk\inc\imm.h +FILE 6100 f:\sp\vctools\crt_bld\self_x86\crt\src\dosmap.c +FILE 6101 f:\sp\public\sdk\inc\winbase.h +FILE 6102 f:\sp\public\sdk\inc\winerror.h +FILE 6103 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6104 f:\sp\public\sdk\inc\pshpack1.h +FILE 6105 f:\sp\public\sdk\inc\pshpack8.h +FILE 6106 f:\sp\public\sdk\inc\winver.h +FILE 6107 f:\sp\public\sdk\inc\ddbanned.h +FILE 6108 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6109 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6110 f:\sp\public\sdk\inc\pshpack2.h +FILE 6111 f:\sp\public\sdk\inc\winreg.h +FILE 6112 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6113 f:\sp\public\sdk\inc\guiddef.h +FILE 6114 f:\sp\public\sdk\inc\windows.h +FILE 6115 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6116 f:\sp\public\sdk\inc\specstrings.h +FILE 6117 f:\sp\public\sdk\inc\basetsd.h +FILE 6118 f:\sp\public\sdk\inc\winver.h +FILE 6119 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6120 f:\sp\public\sdk\inc\pshpack2.h +FILE 6121 f:\sp\public\sdk\inc\windows.h +FILE 6122 f:\sp\public\sdk\inc\reason.h +FILE 6123 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6124 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6125 f:\sp\public\sdk\inc\specstrings.h +FILE 6126 f:\sp\public\sdk\inc\basetsd.h +FILE 6127 f:\sp\public\sdk\inc\pshpack4.h +FILE 6128 f:\sp\vctools\crt_bld\self_x86\crt\src\wctomb.c +FILE 6129 f:\sp\public\sdk\inc\winnetwk.h +FILE 6130 f:\sp\public\sdk\inc\stralign.h +FILE 6131 f:\sp\public\sdk\inc\poppack.h +FILE 6132 f:\sp\public\sdk\inc\winsvc.h +FILE 6133 f:\sp\public\sdk\inc\winuser.h +FILE 6134 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6135 f:\sp\public\sdk\inc\windef.h +FILE 6136 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6137 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6138 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6139 f:\sp\public\sdk\inc\mcx.h +FILE 6140 f:\sp\public\sdk\inc\pshpack8.h +FILE 6141 f:\sp\public\sdk\inc\guiddef.h +FILE 6142 f:\sp\public\sdk\inc\winnls.h +FILE 6143 f:\sp\public\sdk\inc\pshpack1.h +FILE 6144 f:\sp\public\sdk\inc\winnt.h +FILE 6145 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6146 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6147 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6148 f:\sp\public\sdk\inc\winerror.h +FILE 6149 f:\sp\public\sdk\inc\winreg.h +FILE 6150 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6151 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6152 f:\sp\public\sdk\inc\tvout.h +FILE 6153 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6154 f:\sp\public\sdk\inc\ddbanned.h +FILE 6155 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6156 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6157 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6158 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6159 f:\sp\public\sdk\inc\wincon.h +FILE 6160 f:\sp\public\sdk\inc\imm.h +FILE 6161 f:\sp\public\sdk\inc\winbase.h +FILE 6162 f:\sp\public\sdk\inc\wingdi.h +FILE 6163 f:\sp\public\sdk\inc\winsvc.h +FILE 6164 f:\sp\public\sdk\inc\winuser.h +FILE 6165 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6166 f:\sp\public\sdk\inc\mcx.h +FILE 6167 f:\sp\public\sdk\inc\pshpack8.h +FILE 6168 f:\sp\public\sdk\inc\guiddef.h +FILE 6169 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6170 f:\sp\public\sdk\inc\windows.h +FILE 6171 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6172 f:\sp\public\sdk\inc\winnls.h +FILE 6173 f:\sp\vctools\crt_bld\self_x86\crt\src\wcstol.c +FILE 6174 f:\sp\public\sdk\inc\pshpack1.h +FILE 6175 f:\sp\public\sdk\inc\winerror.h +FILE 6176 f:\sp\public\sdk\inc\winreg.h +FILE 6177 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6178 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6179 f:\sp\public\sdk\inc\tvout.h +FILE 6180 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6181 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6182 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6183 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6184 f:\sp\public\sdk\inc\wincon.h +FILE 6185 f:\sp\public\sdk\inc\imm.h +FILE 6186 f:\sp\public\sdk\inc\winbase.h +FILE 6187 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6188 f:\sp\public\sdk\inc\wingdi.h +FILE 6189 f:\sp\public\sdk\inc\windef.h +FILE 6190 f:\sp\public\sdk\inc\winver.h +FILE 6191 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6192 f:\sp\public\sdk\inc\pshpack2.h +FILE 6193 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6194 f:\sp\public\sdk\inc\reason.h +FILE 6195 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6196 f:\sp\public\sdk\inc\winnt.h +FILE 6197 f:\sp\public\sdk\inc\specstrings.h +FILE 6198 f:\sp\public\sdk\inc\basetsd.h +FILE 6199 f:\sp\public\sdk\inc\pshpack4.h +FILE 6200 f:\sp\public\sdk\inc\ddbanned.h +FILE 6201 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6202 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6203 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6204 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6205 f:\sp\public\sdk\inc\winnetwk.h +FILE 6206 f:\sp\public\sdk\inc\stralign.h +FILE 6207 f:\sp\public\sdk\inc\poppack.h +FILE 6208 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6209 f:\sp\public\sdk\inc\mcx.h +FILE 6210 f:\sp\public\sdk\inc\pshpack8.h +FILE 6211 f:\sp\public\sdk\inc\guiddef.h +FILE 6212 f:\sp\public\sdk\inc\winnt.h +FILE 6213 f:\sp\public\sdk\inc\winnls.h +FILE 6214 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6215 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6216 f:\sp\public\sdk\inc\pshpack1.h +FILE 6217 f:\sp\public\sdk\inc\winerror.h +FILE 6218 f:\sp\vctools\crt_bld\self_x86\crt\src\tolower.c +FILE 6219 f:\sp\public\sdk\inc\winreg.h +FILE 6220 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6221 f:\sp\public\sdk\inc\tvout.h +FILE 6222 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6223 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6224 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6225 f:\sp\public\sdk\inc\wincon.h +FILE 6226 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 6227 f:\sp\public\sdk\inc\imm.h +FILE 6228 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6229 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6230 f:\sp\public\sdk\inc\winbase.h +FILE 6231 f:\sp\public\sdk\inc\wingdi.h +FILE 6232 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6233 f:\sp\public\sdk\inc\winver.h +FILE 6234 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 6235 f:\sp\public\sdk\inc\windows.h +FILE 6236 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6237 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6238 f:\sp\public\sdk\inc\pshpack2.h +FILE 6239 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6240 f:\sp\public\sdk\inc\reason.h +FILE 6241 f:\sp\public\sdk\inc\specstrings.h +FILE 6242 f:\sp\public\sdk\inc\basetsd.h +FILE 6243 f:\sp\public\sdk\inc\pshpack4.h +FILE 6244 f:\sp\public\sdk\inc\winnetwk.h +FILE 6245 f:\sp\public\sdk\inc\ddbanned.h +FILE 6246 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6247 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6248 f:\sp\public\sdk\inc\stralign.h +FILE 6249 f:\sp\public\sdk\inc\poppack.h +FILE 6250 f:\sp\public\sdk\inc\winsvc.h +FILE 6251 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6252 f:\sp\public\sdk\inc\windef.h +FILE 6253 f:\sp\public\sdk\inc\winuser.h +FILE 6254 f:\sp\public\sdk\inc\winsvc.h +FILE 6255 f:\sp\public\sdk\inc\winuser.h +FILE 6256 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6257 f:\sp\public\sdk\inc\mcx.h +FILE 6258 f:\sp\public\sdk\inc\pshpack8.h +FILE 6259 f:\sp\public\sdk\inc\guiddef.h +FILE 6260 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6261 f:\sp\public\sdk\inc\windows.h +FILE 6262 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6263 f:\sp\public\sdk\inc\winnls.h +FILE 6264 f:\sp\vctools\crt_bld\self_x86\crt\src\strtoq.c +FILE 6265 f:\sp\public\sdk\inc\pshpack1.h +FILE 6266 f:\sp\public\sdk\inc\winerror.h +FILE 6267 f:\sp\public\sdk\inc\winreg.h +FILE 6268 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6269 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6270 f:\sp\public\sdk\inc\tvout.h +FILE 6271 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6272 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6273 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6274 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6275 f:\sp\public\sdk\inc\wincon.h +FILE 6276 f:\sp\public\sdk\inc\imm.h +FILE 6277 f:\sp\public\sdk\inc\winbase.h +FILE 6278 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6279 f:\sp\public\sdk\inc\wingdi.h +FILE 6280 f:\sp\public\sdk\inc\windef.h +FILE 6281 f:\sp\public\sdk\inc\winver.h +FILE 6282 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6283 f:\sp\public\sdk\inc\pshpack2.h +FILE 6284 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6285 f:\sp\public\sdk\inc\reason.h +FILE 6286 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6287 f:\sp\public\sdk\inc\winnt.h +FILE 6288 f:\sp\public\sdk\inc\specstrings.h +FILE 6289 f:\sp\public\sdk\inc\basetsd.h +FILE 6290 f:\sp\public\sdk\inc\pshpack4.h +FILE 6291 f:\sp\public\sdk\inc\ddbanned.h +FILE 6292 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6293 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6294 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6295 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6296 f:\sp\public\sdk\inc\winnetwk.h +FILE 6297 f:\sp\public\sdk\inc\stralign.h +FILE 6298 f:\sp\public\sdk\inc\poppack.h +FILE 6299 f:\sp\public\sdk\inc\winsvc.h +FILE 6300 f:\sp\public\sdk\inc\winuser.h +FILE 6301 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6302 f:\sp\public\sdk\inc\mcx.h +FILE 6303 f:\sp\public\sdk\inc\pshpack8.h +FILE 6304 f:\sp\public\sdk\inc\guiddef.h +FILE 6305 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6306 f:\sp\public\sdk\inc\windows.h +FILE 6307 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6308 f:\sp\public\sdk\inc\winnls.h +FILE 6309 f:\sp\vctools\crt_bld\self_x86\crt\src\strtol.c +FILE 6310 f:\sp\public\sdk\inc\pshpack1.h +FILE 6311 f:\sp\public\sdk\inc\winerror.h +FILE 6312 f:\sp\public\sdk\inc\winreg.h +FILE 6313 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6314 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6315 f:\sp\public\sdk\inc\tvout.h +FILE 6316 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6317 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6318 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6319 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6320 f:\sp\public\sdk\inc\wincon.h +FILE 6321 f:\sp\public\sdk\inc\imm.h +FILE 6322 f:\sp\public\sdk\inc\winbase.h +FILE 6323 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6324 f:\sp\public\sdk\inc\wingdi.h +FILE 6325 f:\sp\public\sdk\inc\windef.h +FILE 6326 f:\sp\public\sdk\inc\winver.h +FILE 6327 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6328 f:\sp\public\sdk\inc\pshpack2.h +FILE 6329 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6330 f:\sp\public\sdk\inc\reason.h +FILE 6331 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6332 f:\sp\public\sdk\inc\winnt.h +FILE 6333 f:\sp\public\sdk\inc\specstrings.h +FILE 6334 f:\sp\public\sdk\inc\basetsd.h +FILE 6335 f:\sp\public\sdk\inc\pshpack4.h +FILE 6336 f:\sp\public\sdk\inc\ddbanned.h +FILE 6337 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6338 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6339 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6340 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6341 f:\sp\public\sdk\inc\winnetwk.h +FILE 6342 f:\sp\public\sdk\inc\stralign.h +FILE 6343 f:\sp\public\sdk\inc\poppack.h +FILE 6344 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6345 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6346 f:\sp\public\sdk\inc\tvout.h +FILE 6347 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6348 f:\sp\public\sdk\inc\wincon.h +FILE 6349 f:\sp\public\sdk\inc\imm.h +FILE 6350 f:\sp\public\sdk\inc\winbase.h +FILE 6351 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6352 f:\sp\public\sdk\inc\wingdi.h +FILE 6353 f:\sp\public\sdk\inc\windef.h +FILE 6354 f:\sp\public\sdk\inc\winver.h +FILE 6355 f:\sp\vctools\crt_bld\self_x86\crt\src\mbtowc.c +FILE 6356 f:\sp\public\sdk\inc\pshpack2.h +FILE 6357 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6358 f:\sp\public\sdk\inc\reason.h +FILE 6359 f:\sp\public\sdk\inc\winnt.h +FILE 6360 f:\sp\public\sdk\inc\specstrings.h +FILE 6361 f:\sp\public\sdk\inc\basetsd.h +FILE 6362 f:\sp\public\sdk\inc\pshpack4.h +FILE 6363 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6364 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6365 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6366 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6367 f:\sp\public\sdk\inc\winnetwk.h +FILE 6368 f:\sp\public\sdk\inc\stralign.h +FILE 6369 f:\sp\public\sdk\inc\poppack.h +FILE 6370 f:\sp\public\sdk\inc\winsvc.h +FILE 6371 f:\sp\public\sdk\inc\winuser.h +FILE 6372 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6373 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 6374 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6375 f:\sp\public\sdk\inc\mcx.h +FILE 6376 f:\sp\public\sdk\inc\pshpack8.h +FILE 6377 f:\sp\public\sdk\inc\guiddef.h +FILE 6378 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6379 f:\sp\public\sdk\inc\windows.h +FILE 6380 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6381 f:\sp\public\sdk\inc\winnls.h +FILE 6382 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6383 f:\sp\public\sdk\inc\pshpack1.h +FILE 6384 f:\sp\public\sdk\inc\ddbanned.h +FILE 6385 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6386 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6387 f:\sp\public\sdk\inc\winerror.h +FILE 6388 f:\sp\public\sdk\inc\winreg.h +FILE 6389 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6390 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 6391 f:\sp\public\sdk\inc\winreg.h +FILE 6392 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6393 f:\sp\public\sdk\inc\tvout.h +FILE 6394 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 6395 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6396 f:\sp\public\sdk\inc\wincon.h +FILE 6397 f:\sp\public\sdk\inc\imm.h +FILE 6398 f:\sp\public\sdk\inc\winbase.h +FILE 6399 f:\sp\vctools\crt_bld\self_x86\crt\src\isctype.c +FILE 6400 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6401 f:\sp\public\sdk\inc\wingdi.h +FILE 6402 f:\sp\public\sdk\inc\windef.h +FILE 6403 f:\sp\public\sdk\inc\winver.h +FILE 6404 f:\sp\public\sdk\inc\pshpack2.h +FILE 6405 f:\sp\public\sdk\inc\reason.h +FILE 6406 f:\sp\public\sdk\inc\winnt.h +FILE 6407 f:\sp\public\sdk\inc\specstrings.h +FILE 6408 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6409 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 6410 f:\sp\public\sdk\inc\basetsd.h +FILE 6411 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6412 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6413 f:\sp\public\sdk\inc\pshpack4.h +FILE 6414 f:\sp\public\sdk\inc\winnetwk.h +FILE 6415 f:\sp\public\sdk\inc\stralign.h +FILE 6416 f:\sp\public\sdk\inc\poppack.h +FILE 6417 f:\sp\public\sdk\inc\winsvc.h +FILE 6418 f:\sp\public\sdk\inc\winuser.h +FILE 6419 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6420 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6421 f:\sp\public\sdk\inc\mcx.h +FILE 6422 f:\sp\public\sdk\inc\pshpack8.h +FILE 6423 f:\sp\public\sdk\inc\guiddef.h +FILE 6424 f:\sp\public\sdk\inc\ddbanned.h +FILE 6425 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6426 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 6427 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6428 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6429 f:\sp\public\sdk\inc\windows.h +FILE 6430 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6431 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6432 f:\sp\public\sdk\inc\winnls.h +FILE 6433 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6434 f:\sp\public\sdk\inc\pshpack1.h +FILE 6435 f:\sp\public\sdk\inc\winerror.h +FILE 6436 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 6437 f:\sp\public\sdk\inc\winreg.h +FILE 6438 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6439 f:\sp\public\sdk\inc\tvout.h +FILE 6440 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6441 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6442 f:\sp\public\sdk\inc\wincon.h +FILE 6443 f:\sp\public\sdk\inc\imm.h +FILE 6444 f:\sp\public\sdk\inc\winbase.h +FILE 6445 f:\sp\vctools\crt_bld\self_x86\crt\src\iswctype.c +FILE 6446 f:\sp\public\sdk\inc\wingdi.h +FILE 6447 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6448 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6449 f:\sp\public\sdk\inc\winver.h +FILE 6450 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 6451 f:\sp\public\sdk\inc\windows.h +FILE 6452 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6453 f:\sp\public\sdk\inc\pshpack2.h +FILE 6454 f:\sp\public\sdk\inc\reason.h +FILE 6455 f:\sp\public\sdk\inc\specstrings.h +FILE 6456 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 6457 f:\sp\public\sdk\inc\basetsd.h +FILE 6458 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6459 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6460 f:\sp\public\sdk\inc\pshpack4.h +FILE 6461 f:\sp\public\sdk\inc\winnetwk.h +FILE 6462 f:\sp\public\sdk\inc\stralign.h +FILE 6463 f:\sp\public\sdk\inc\poppack.h +FILE 6464 f:\sp\public\sdk\inc\winsvc.h +FILE 6465 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6466 f:\sp\public\sdk\inc\windef.h +FILE 6467 f:\sp\public\sdk\inc\winuser.h +FILE 6468 f:\sp\public\sdk\inc\mcx.h +FILE 6469 f:\sp\public\sdk\inc\pshpack8.h +FILE 6470 f:\sp\public\sdk\inc\guiddef.h +FILE 6471 f:\sp\public\sdk\inc\ddbanned.h +FILE 6472 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6473 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6474 f:\sp\public\sdk\inc\winnt.h +FILE 6475 f:\sp\public\sdk\inc\winnls.h +FILE 6476 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6477 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6478 f:\sp\public\sdk\inc\pshpack1.h +FILE 6479 f:\sp\public\sdk\inc\winerror.h +FILE 6480 f:\sp\public\sdk\inc\winsvc.h +FILE 6481 f:\sp\public\sdk\inc\winuser.h +FILE 6482 f:\sp\public\sdk\inc\mcx.h +FILE 6483 f:\sp\public\sdk\inc\pshpack8.h +FILE 6484 f:\sp\public\sdk\inc\guiddef.h +FILE 6485 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6486 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6487 f:\sp\public\sdk\inc\windows.h +FILE 6488 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6489 f:\sp\public\sdk\inc\winnls.h +FILE 6490 f:\sp\vctools\crt_bld\self_x86\crt\src\_wctype.c +FILE 6491 f:\sp\public\sdk\inc\pshpack1.h +FILE 6492 f:\sp\public\sdk\inc\winerror.h +FILE 6493 f:\sp\public\sdk\inc\winreg.h +FILE 6494 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6495 f:\sp\public\sdk\inc\tvout.h +FILE 6496 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6497 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6498 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6499 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6500 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6501 f:\sp\public\sdk\inc\wincon.h +FILE 6502 f:\sp\public\sdk\inc\imm.h +FILE 6503 f:\sp\public\sdk\inc\winbase.h +FILE 6504 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6505 f:\sp\public\sdk\inc\wingdi.h +FILE 6506 f:\sp\public\sdk\inc\windef.h +FILE 6507 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 6508 f:\sp\public\sdk\inc\winver.h +FILE 6509 f:\sp\public\sdk\inc\pshpack2.h +FILE 6510 f:\sp\public\sdk\inc\reason.h +FILE 6511 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6512 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6513 f:\sp\public\sdk\inc\winnt.h +FILE 6514 f:\sp\public\sdk\inc\specstrings.h +FILE 6515 f:\sp\public\sdk\inc\basetsd.h +FILE 6516 f:\sp\public\sdk\inc\pshpack4.h +FILE 6517 f:\sp\public\sdk\inc\ddbanned.h +FILE 6518 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6519 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6520 f:\sp\public\sdk\inc\winnetwk.h +FILE 6521 f:\sp\public\sdk\inc\stralign.h +FILE 6522 f:\sp\public\sdk\inc\poppack.h +FILE 6523 f:\sp\public\sdk\inc\mcx.h +FILE 6524 f:\sp\public\sdk\inc\pshpack8.h +FILE 6525 f:\sp\public\sdk\inc\guiddef.h +FILE 6526 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6527 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6528 f:\sp\public\sdk\inc\windows.h +FILE 6529 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6530 f:\sp\public\sdk\inc\winnls.h +FILE 6531 f:\sp\public\sdk\inc\pshpack1.h +FILE 6532 f:\sp\public\sdk\inc\winerror.h +FILE 6533 f:\sp\public\sdk\inc\winreg.h +FILE 6534 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6535 f:\sp\vctools\crt_bld\self_x86\crt\src\_ctype.c +FILE 6536 f:\sp\public\sdk\inc\tvout.h +FILE 6537 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6538 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6539 f:\sp\public\sdk\inc\wincon.h +FILE 6540 f:\sp\public\sdk\inc\imm.h +FILE 6541 f:\sp\public\sdk\inc\winbase.h +FILE 6542 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6543 f:\sp\public\sdk\inc\wingdi.h +FILE 6544 f:\sp\public\sdk\inc\windef.h +FILE 6545 f:\sp\public\sdk\inc\winver.h +FILE 6546 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6547 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6548 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6549 f:\sp\public\sdk\inc\pshpack2.h +FILE 6550 f:\sp\public\sdk\inc\reason.h +FILE 6551 f:\sp\public\sdk\inc\winnt.h +FILE 6552 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6553 f:\sp\public\sdk\inc\specstrings.h +FILE 6554 f:\sp\public\sdk\inc\basetsd.h +FILE 6555 f:\sp\public\sdk\inc\pshpack4.h +FILE 6556 f:\sp\public\sdk\inc\winnetwk.h +FILE 6557 f:\sp\public\sdk\inc\stralign.h +FILE 6558 f:\sp\public\sdk\inc\poppack.h +FILE 6559 f:\sp\public\sdk\inc\winsvc.h +FILE 6560 f:\sp\public\sdk\inc\ddbanned.h +FILE 6561 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6562 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6563 f:\sp\public\sdk\inc\winuser.h +FILE 6564 f:\sp\public\sdk\inc\pshpack2.h +FILE 6565 f:\sp\public\sdk\inc\mcx.h +FILE 6566 f:\sp\public\sdk\inc\winuser.h +FILE 6567 f:\sp\public\sdk\inc\winnls.h +FILE 6568 f:\sp\public\sdk\inc\stralign.h +FILE 6569 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6570 f:\sp\public\sdk\inc\windef.h +FILE 6571 f:\sp\public\sdk\inc\tvout.h +FILE 6572 f:\sp\public\sdk\inc\winsvc.h +FILE 6573 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 6574 f:\sp\public\sdk\inc\wingdi.h +FILE 6575 f:\sp\public\sdk\inc\pshpack4.h +FILE 6576 f:\sp\public\sdk\inc\poppack.h +FILE 6577 f:\sp\public\sdk\inc\winnt.h +FILE 6578 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6579 f:\sp\public\sdk\inc\winnetwk.h +FILE 6580 f:\sp\public\sdk\inc\imm.h +FILE 6581 f:\sp\vctools\crt_bld\self_x86\crt\src\xtoa.c +FILE 6582 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6583 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6584 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6585 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6586 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 6587 f:\sp\vctools\crt_bld\self_x86\crt\src\xtoas.c +FILE 6588 f:\sp\public\sdk\inc\pshpack1.h +FILE 6589 f:\sp\public\sdk\inc\winver.h +FILE 6590 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6591 f:\sp\public\sdk\inc\guiddef.h +FILE 6592 f:\sp\public\sdk\inc\specstrings.h +FILE 6593 f:\sp\public\sdk\inc\basetsd.h +FILE 6594 f:\sp\public\sdk\inc\winreg.h +FILE 6595 f:\sp\public\sdk\inc\ddbanned.h +FILE 6596 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6597 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6598 f:\sp\public\sdk\inc\windows.h +FILE 6599 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6600 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6601 f:\sp\public\sdk\inc\winbase.h +FILE 6602 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6603 f:\sp\public\sdk\inc\winerror.h +FILE 6604 f:\sp\public\sdk\inc\pshpack8.h +FILE 6605 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 6606 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6607 f:\sp\public\sdk\inc\reason.h +FILE 6608 f:\sp\public\sdk\inc\wincon.h +FILE 6609 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 6610 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 6611 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6612 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6613 f:\sp\vctools\crt_bld\self_x86\crt\src\wchtodig.c +FILE 6614 f:\sp\public\sdk\inc\ddbanned.h +FILE 6615 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6616 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6617 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 6618 f:\sp\public\sdk\inc\poppack.h +FILE 6619 f:\sp\public\sdk\inc\winnetwk.h +FILE 6620 f:\sp\public\sdk\inc\imm.h +FILE 6621 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6622 f:\sp\public\sdk\inc\windef.h +FILE 6623 f:\sp\public\sdk\inc\pshpack1.h +FILE 6624 f:\sp\public\sdk\inc\winver.h +FILE 6625 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6626 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6627 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6628 f:\sp\public\sdk\inc\winnt.h +FILE 6629 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6630 f:\sp\public\sdk\inc\winreg.h +FILE 6631 f:\sp\vctools\crt_bld\self_x86\crt\src\atox.c +FILE 6632 f:\sp\public\sdk\inc\winbase.h +FILE 6633 f:\sp\public\sdk\inc\winerror.h +FILE 6634 f:\sp\public\sdk\inc\pshpack8.h +FILE 6635 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6636 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6637 f:\sp\public\sdk\inc\reason.h +FILE 6638 f:\sp\public\sdk\inc\wincon.h +FILE 6639 f:\sp\public\sdk\inc\ddbanned.h +FILE 6640 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6641 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6642 f:\sp\public\sdk\inc\pshpack2.h +FILE 6643 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 6644 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6645 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 6646 f:\sp\public\sdk\inc\mcx.h +FILE 6647 f:\sp\public\sdk\inc\winuser.h +FILE 6648 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6649 f:\sp\public\sdk\inc\winnls.h +FILE 6650 f:\sp\public\sdk\inc\guiddef.h +FILE 6651 f:\sp\public\sdk\inc\windows.h +FILE 6652 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6653 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 6654 f:\sp\public\sdk\inc\specstrings.h +FILE 6655 f:\sp\public\sdk\inc\basetsd.h +FILE 6656 f:\sp\public\sdk\inc\stralign.h +FILE 6657 f:\sp\public\sdk\inc\tvout.h +FILE 6658 f:\sp\public\sdk\inc\winsvc.h +FILE 6659 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6660 f:\sp\public\sdk\inc\wingdi.h +FILE 6661 f:\sp\public\sdk\inc\pshpack4.h +FUNC 1000 13 4 vswprintf +1000 0 50 71 +1000 12 51 71 +1012 1 52 71 +FUNC 1020 1b 10 wmemcpy_s +1020 0 1230 66 +1020 1b 1233 66 +FUNC 1040 1b 10 wmemmove_s +1040 0 1250 66 +1040 1b 1253 66 +FUNC 1060 19 4 std::bad_alloc::bad_alloc(char const *) +1060 13 371 83 +1073 6 372 83 +FUNC 1080 b 0 std::bad_alloc::~bad_alloc() +1080 6 380 83 +1086 5 381 83 +FUNC 1090 24 0 std::bad_alloc::`vector deleting destructor'(unsigned int) +FUNC 10c0 f 8 std::char_traits::assign(wchar_t &,wchar_t const &) +10c0 0 302 70 +10c0 e 303 70 +10ce 1 304 70 +FUNC 10d0 17 4 std::char_traits::length(wchar_t const *) +10d0 0 325 70 +10d0 16 327 70 +10e6 1 328 70 +FUNC 10f0 27 10 std::char_traits::_Copy_s(wchar_t *,unsigned int,wchar_t const *,unsigned int) +10f0 0 340 70 +10f0 23 343 70 +1113 3 344 70 +1116 1 345 70 +FUNC 1120 27 10 std::char_traits::_Move_s(wchar_t *,unsigned int,wchar_t const *,unsigned int) +1120 0 364 70 +1120 23 367 70 +1143 3 368 70 +1146 1 369 70 +FUNC 1150 d 8 std::char_traits::assign(char &,char const &) +1150 0 417 70 +1150 c 418 70 +115c 1 419 70 +FUNC 1160 13 4 std::char_traits::length(char const *) +1160 0 440 70 +1160 12 442 70 +1172 1 443 70 +FUNC 1180 21 10 std::char_traits::_Copy_s(char *,unsigned int,char const *,unsigned int) +1180 0 455 70 +1180 1d 458 70 +119d 3 459 70 +11a0 1 460 70 +FUNC 11b0 21 10 std::char_traits::_Move_s(char *,unsigned int,char const *,unsigned int) +11b0 0 479 70 +11b0 1d 482 70 +11cd 3 483 70 +11d0 1 484 70 +FUNC 11e0 7 0 std::_Iterator_base::_Iterator_base() +11e0 6 441 65 +11e6 1 442 65 +FUNC 11f0 6b 4 std::logic_error::logic_error(std::basic_string,std::allocator > const &) +11f0 56 27 82 +1246 15 28 82 +FUNC 1260 32 0 std::logic_error::~logic_error() +1260 9 31 82 +1269 29 32 82 +FUNC 12a0 e 0 std::logic_error::what() +12a0 0 35 82 +12a0 9 36 82 +12a9 1 37 82 +12aa 3 36 82 +12ad 1 37 82 +FUNC 12b0 47 0 std::logic_error::`scalar deleting destructor'(unsigned int) +FUNC 1300 19 4 std::length_error::length_error(std::basic_string,std::allocator > const &) +1300 13 106 82 +1313 6 107 82 +FUNC 1320 32 0 std::length_error::~length_error() +1320 3 110 82 +1323 2f 111 82 +FUNC 1360 47 0 std::length_error::`vector deleting destructor'(unsigned int) +FUNC 13b0 19 4 std::out_of_range::out_of_range(std::basic_string,std::allocator > const &) +13b0 13 130 82 +13c3 6 131 82 +FUNC 13d0 32 0 std::out_of_range::~out_of_range() +13d0 3 134 82 +13d3 2f 135 82 +FUNC 1410 47 0 std::out_of_range::`vector deleting destructor'(unsigned int) +FUNC 1460 19 4 std::out_of_range::out_of_range(std::out_of_range const &) +FUNC 1480 71 4 std::logic_error::logic_error(std::logic_error const &) +FUNC 1500 1b 8 google_breakpad::WindowsStringUtils::safe_swprintf(wchar_t *,unsigned int,wchar_t const *,...) +1500 0 94 63 +1500 1a 97 63 +151a 1 105 63 +FUNC 1520 35 0 google_breakpad::ExceptionHandler::set_dump_path(std::basic_string,std::allocator > const &) +1520 4 137 43 +1524 f 138 43 +1533 c 139 43 +153f 7 140 43 +1546 1 141 43 +1547 6 139 43 +154d 7 140 43 +1554 1 141 43 +FUNC 1560 20b 14 google_breakpad::ExceptionHandler::ExceptionHandler(std::basic_string,std::allocator > const &,bool (*)(void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *),bool (*)(wchar_t const *,wchar_t const *,void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *,bool),void *,bool) +1560 6d 75 12 +15cd 90 78 12 +165d 9 86 12 +1666 d 87 12 +1673 d 88 12 +1680 1e 96 12 +169e 11 98 12 +16af 7 99 12 +16b6 f 101 12 +16c5 a 104 12 +16cf 8 105 12 +16d7 7 106 12 +16de 7 107 12 +16e5 b 110 12 +16f0 8 114 12 +16f8 25 115 12 +171d d 117 12 +172a b 118 12 +1735 10 121 12 +1745 e 124 12 +1753 18 126 12 +FUNC 1770 274 0 google_breakpad::ExceptionHandler::~ExceptionHandler() +1770 e 128 12 +177e a 129 12 +1788 7 130 12 +178f a 133 12 +1799 b 134 12 +17a4 a 136 12 +17ae 9 139 12 +17b7 63 142 12 +181a 23 143 12 +183d 5 144 12 +1842 13 147 12 +1855 2b 149 12 +1880 2a 151 12 +18aa 17 152 12 +18c1 2c 153 12 +18ed 19 151 12 +1906 11 158 12 +1917 23 161 12 +193a 6 162 12 +1940 d 165 12 +194d f 169 12 +195c d 170 12 +1969 f 171 12 +1978 9 172 12 +1981 63 173 12 +FUNC 19f0 31 0 std::vector >::`scalar deleting destructor'(unsigned int) +FUNC 1a30 51 4 google_breakpad::ExceptionHandler::ExceptionHandlerThreadMain(void *) +1a30 13 176 12 +1a43 f 182 12 +1a52 1a 185 12 +1a6c 13 188 12 +1a7f 2 190 12 +FUNC 1a90 c7 4 google_breakpad::AutoExceptionHandler::AutoExceptionHandler() +1a90 7 204 12 +1a97 b 221 12 +1aa2 82 224 12 +1b24 d 225 12 +1b31 c 229 12 +1b3d e 231 12 +1b4b c 233 12 +FUNC 1b60 36 0 google_breakpad::AutoExceptionHandler::~AutoExceptionHandler() +1b60 0 235 12 +1b60 b 237 12 +1b6b d 239 12 +1b78 b 242 12 +1b83 7 243 12 +1b8a b 244 12 +1b95 1 245 12 +FUNC 1ba0 3 0 google_breakpad::AutoExceptionHandler::get_handler() +1ba0 3 247 12 +FUNC 1bb0 c4 4 google_breakpad::ExceptionHandler::HandleException(_EXCEPTION_POINTERS *) +1bb0 2b 254 12 +1bdb a 255 12 +1be5 f 262 12 +1bf4 1e 265 12 +1c12 5 273 12 +1c17 2 274 12 +1c19 7 283 12 +1c20 5 284 12 +1c25 2 285 12 +1c27 2 286 12 +1c29 37 290 12 +1c60 14 291 12 +FUNC 1c80 121 14 google_breakpad::ExceptionHandler::HandleInvalidParameter(wchar_t const *,wchar_t const *,wchar_t const *,unsigned int,unsigned int) +1c80 40 299 12 +1cc0 b7 319 12 +1d77 7 320 12 +1d7e 14 323 12 +1d92 2 324 12 +1d94 5 337 12 +1d99 8 345 12 +FUNC 1db0 81 8 google_breakpad::ExceptionHandler::WriteMinidumpOnHandlerThread(_EXCEPTION_POINTERS *,MDRawAssertionInfo *) +1db0 2 350 12 +1db2 d 351 12 +1dbf 6 354 12 +1dc5 2b 359 12 +1df0 f 362 12 +1dff 6 363 12 +1e05 26 370 12 +1e2b 3 372 12 +1e2e 3 373 12 +FUNC 1e40 1d 0 google_breakpad::ExceptionHandler::WriteMinidump() +1e40 3 375 12 +1e43 b 376 12 +1e4e b 377 12 +1e59 3 378 12 +1e5c 1 379 12 +FUNC 1e60 a2 4 google_breakpad::ExceptionHandler::WriteMinidump(std::basic_string,std::allocator > const &,bool (*)(wchar_t const *,wchar_t const *,void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *,bool),void *) +1e60 41 384 12 +1ea1 10 385 12 +1eb1 2a 386 12 +1edb 27 387 12 +FUNC 1f10 142 c google_breakpad::ExceptionHandler::WriteMinidumpWithException(unsigned long,_EXCEPTION_POINTERS *,MDRawAssertionInfo *) +1f10 0 392 12 +1f10 22 399 12 +1f32 7 466 12 +1f39 2 403 12 +1f3b e 404 12 +1f49 1f 411 12 +1f68 9 412 12 +1f71 8 414 12 +1f79 4 415 12 +1f7d 8 416 12 +1f85 8 426 12 +1f8d a 427 12 +1f97 34 440 12 +1fcb 8 441 12 +1fd3 8 442 12 +1fdb 4 443 12 +1fdf 8 444 12 +1fe7 30 454 12 +2017 c 456 12 +2023 7 460 12 +202a 1e 462 12 +2048 4 465 12 +204c 6 466 12 +FUNC 2060 138 0 google_breakpad::ExceptionHandler::UpdateNextID() +2060 38 468 12 +2098 b 470 12 +20a3 4a 471 12 +20ed 25 472 12 +2112 1c 477 12 +212e 31 478 12 +215f 14 479 12 +2173 25 480 12 +FUNC 21a0 3b 4 std::basic_string,std::allocator >::basic_string,std::allocator >(char const *) +21a0 0 650 17 +21a0 35 652 17 +21d5 6 653 17 +FUNC 21e0 25 4 std::basic_string,std::allocator >::basic_string,std::allocator >(std::basic_string,std::allocator > const &) +21e0 1 720 17 +21e1 4 721 17 +21e5 1a 722 17 +21ff 6 723 17 +FUNC 2210 26 0 std::basic_string,std::allocator >::~basic_string,std::allocator >() +2210 3 904 17 +2213 22 905 17 +2235 1 906 17 +FUNC 2240 e 0 std::basic_string,std::allocator >::c_str() +2240 0 1621 17 +2240 9 1622 17 +2249 1 1623 17 +224a 3 1622 17 +224d 1 1623 17 +FUNC 2250 4 0 std::basic_string,std::allocator >::size() +2250 0 1636 17 +2250 3 1637 17 +2253 1 1638 17 +FUNC 2260 11 0 std::basic_string,std::allocator >::basic_string,std::allocator >() +2260 0 564 17 +2260 10 565 17 +2270 1 566 17 +FUNC 2280 27 0 std::basic_string,std::allocator >::~basic_string,std::allocator >() +2280 3 904 17 +2283 23 905 17 +22a6 1 906 17 +FUNC 22b0 b 0 std::basic_string,std::allocator >::operator=(std::basic_string,std::allocator > const &) +22b0 0 914 17 +22b0 a 915 17 +22ba 1 916 17 +FUNC 22c0 24 4 std::basic_string,std::allocator >::operator=(wchar_t const *) +22c0 0 919 17 +22c0 21 920 17 +22e1 3 921 17 +FUNC 22f0 e 0 std::basic_string,std::allocator >::c_str() +22f0 0 1621 17 +22f0 9 1622 17 +22f9 1 1623 17 +22fa 3 1622 17 +22fd 1 1623 17 +FUNC 2300 c 0 std::vector >::vector >() +2300 0 457 23 +2300 b 458 23 +230b 1 459 23 +FUNC 2310 26 0 std::vector >::~vector >() +2310 0 545 23 +2310 25 546 23 +2335 1 547 23 +FUNC 2340 1d 0 std::vector >::begin() +2340 1 627 23 +2341 1b 628 23 +235c 1 629 23 +FUNC 2360 1d 0 std::vector >::end() +2360 1 637 23 +2361 1b 638 23 +237c 1 639 23 +FUNC 2380 13 0 std::vector >::size() +2380 0 702 23 +2380 9 703 23 +2389 1 704 23 +238a 8 703 23 +2392 1 704 23 +FUNC 23a0 23 0 std::vector >::empty() +23a0 0 712 23 +23a0 10 713 23 +23b0 1 714 23 +23b1 11 713 23 +23c2 1 714 23 +FUNC 23d0 56 0 std::vector >::at(unsigned int) +23d0 b 729 23 +23db 15 730 23 +23f0 5 731 23 +23f5 29 732 23 +241e 8 733 23 +FUNC 2430 47 0 std::vector >::back() +2430 c 776 23 +243c 32 777 23 +246e 9 778 23 +FUNC 2480 68 0 std::vector >::push_back(google_breakpad::ExceptionHandler * const &) +2480 10 786 23 +2490 24 787 23 +24b4 d 796 23 +24c1 6 801 23 +24c7 1b 800 23 +24e2 6 801 23 +FUNC 24f0 23 0 std::vector >::pop_back() +24f0 6 818 23 +24f6 15 819 23 +250b 6 822 23 +2511 2 824 23 +FUNC 2520 3f 8 std::vector >::erase(std::_Vector_iterator >) +2520 7 996 23 +2527 24 998 23 +254b 11 1001 23 +255c 3 1002 23 +FUNC 2560 20 0 std::_Vector_iterator >::operator*() +2560 0 325 23 +2560 1c 326 23 +257c 1 327 23 +257d 2 326 23 +257f 1 327 23 +FUNC 2580 20 0 std::_Vector_iterator >::operator++() +2580 0 335 23 +2580 1d 336 23 +259d 2 337 23 +259f 1 338 23 +FUNC 25a0 1d 0 std::_Vector_const_iterator >::operator!=(std::_Vector_const_iterator > const &) +25a0 0 202 23 +25a0 1c 203 23 +25bc 1 204 23 +FUNC 25c0 da c std::basic_string,std::allocator >::assign(std::basic_string,std::allocator > const &,unsigned int,unsigned int) +25c0 1 1038 17 +25c1 12 1039 17 +25d3 5 1040 17 +25d8 3 1041 17 +25db a 1042 17 +25e5 2 1043 17 +25e7 4 1045 17 +25eb 17 1046 17 +2602 5 1052 17 +2607 3 1053 17 +260a 21 1047 17 +262b b 1049 17 +2636 13 1047 17 +2649 5 1052 17 +264e 3 1053 17 +2651 7 1047 17 +2658 5 1052 17 +265d 3 1053 17 +2660 22 1049 17 +2682 10 1050 17 +2692 5 1052 17 +2697 3 1053 17 +FUNC 26a0 27 4 std::basic_string,std::allocator >::assign(char const *) +26a0 1 1069 17 +26a1 23 1070 17 +26c4 3 1071 17 +FUNC 26d0 4a 8 std::basic_string,std::allocator >::_Tidy(bool,unsigned int) +26d0 0 2066 17 +26d0 f 2067 17 +26df 6 2069 17 +26e5 a 2072 17 +26ef d 2073 17 +26fc a 2074 17 +2706 11 2077 17 +2717 3 2078 17 +FUNC 2720 e 0 std::basic_string,std::allocator >::_Myptr() +2720 0 2092 17 +2720 9 2093 17 +2729 1 2094 17 +272a 3 2093 17 +272d 1 2094 17 +FUNC 2730 5 4 std::_String_val >::_String_val >(std::allocator) +2730 2 471 17 +2732 3 472 17 +FUNC 2740 5 4 std::_String_val >::_String_val >(std::_String_val > const &) +2740 2 477 17 +2742 3 484 17 +FUNC 2750 3 0 std::allocator::allocator() +2750 2 120 19 +2752 1 122 19 +FUNC 2760 b 0 std::basic_string,std::allocator >::assign(std::basic_string,std::allocator > const &) +2760 0 1032 17 +2760 a 1033 17 +276a 1 1034 17 +FUNC 2770 ef c std::basic_string,std::allocator >::assign(std::basic_string,std::allocator > const &,unsigned int,unsigned int) +2770 1 1038 17 +2771 12 1039 17 +2783 5 1040 17 +2788 3 1041 17 +278b a 1042 17 +2795 2 1043 17 +2797 4 1045 17 +279b 17 1046 17 +27b2 5 1052 17 +27b7 3 1053 17 +27ba 24 1047 17 +27de b 1049 17 +27e9 13 1047 17 +27fc 5 1052 17 +2801 3 1053 17 +2804 9 1047 17 +280d 5 1052 17 +2812 3 1053 17 +2815 2f 1049 17 +2844 13 1050 17 +2857 5 1052 17 +285c 3 1053 17 +FUNC 2860 2b 4 std::basic_string,std::allocator >::assign(wchar_t const *) +2860 1 1069 17 +2861 27 1070 17 +2888 3 1071 17 +FUNC 2890 4f 8 std::basic_string,std::allocator >::_Tidy(bool,unsigned int) +2890 0 2066 17 +2890 f 2067 17 +289f 6 2069 17 +28a5 a 2072 17 +28af 10 2073 17 +28bf a 2074 17 +28c9 13 2077 17 +28dc 3 2078 17 +FUNC 28e0 e 0 std::basic_string,std::allocator >::_Myptr() +28e0 0 2092 17 +28e0 9 2093 17 +28e9 1 2094 17 +28ea 3 2093 17 +28ed 1 2094 17 +FUNC 28f0 5 4 std::_String_val >::_String_val >(std::allocator) +28f0 2 471 17 +28f2 3 472 17 +FUNC 2900 3 0 std::allocator::allocator() +2900 2 120 19 +2902 1 122 19 +FUNC 2910 13 0 std::vector >::capacity() +2910 0 621 23 +2910 9 622 23 +2919 1 623 23 +291a 8 622 23 +2922 1 623 23 +FUNC 2930 86 c std::vector >::insert(std::_Vector_iterator >,google_breakpad::ExceptionHandler * const &) +2930 3 852 23 +2933 3e 853 23 +2971 11 854 23 +2982 2a 855 23 +29ac a 856 23 +FUNC 29c0 23 0 std::vector >::_Buy(unsigned int) +29c0 0 1066 23 +29c0 8 1070 23 +29c8 5 1071 23 +29cd a 1074 23 +29d7 3 1075 23 +29da 6 1076 23 +29e0 2 1078 23 +29e2 1 1079 23 +FUNC 29f0 1 0 std::vector >::_Destroy(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *) +29f0 0 1082 23 +29f0 1 1084 23 +FUNC 2a00 26 0 std::vector >::_Tidy() +2a00 0 1087 23 +2a00 7 1088 23 +2a07 9 1096 23 +2a10 15 1098 23 +2a25 1 1099 23 +FUNC 2a30 23 0 std::vector >::_Ufill(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &) +2a30 0 1207 23 +2a30 1f 1208 23 +2a4f 3 1209 23 +2a52 1 1210 23 +FUNC 2a60 76 0 std::vector >::_Xran() +2a60 23 1218 23 +2a83 53 1219 23 +FUNC 2ae0 3 4 std::_Vector_val >::_Vector_val >(std::allocator) +2ae0 0 412 23 +2ae0 3 413 23 +FUNC 2af0 1 0 std::allocator::allocator() +2af0 0 120 19 +2af0 1 122 19 +FUNC 2b00 21 0 std::_Vector_iterator >::_Vector_iterator >(google_breakpad::ExceptionHandler * *,std::_Container_base const *) +2b00 1e 314 23 +2b1e 3 315 23 +FUNC 2b30 32 4 std::_Vector_iterator >::operator+(int) +2b30 1 367 23 +2b31 2 368 23 +2b33 26 369 23 +2b59 9 370 23 +FUNC 2b70 2f 0 std::_Vector_iterator >::operator-(int) +2b70 1 378 23 +2b71 2 379 23 +2b73 25 380 23 +2b98 7 381 23 +FUNC 2ba0 20 0 std::_Vector_const_iterator >::operator*() +2ba0 0 92 23 +2ba0 a 103 23 +2baa f 104 23 +2bb9 3 107 23 +2bbc 1 108 23 +2bbd 2 107 23 +2bbf 1 108 23 +FUNC 2bc0 20 0 std::_Vector_const_iterator >::operator++() +2bc0 0 116 23 +2bc0 a 117 23 +2bca f 118 23 +2bd9 4 119 23 +2bdd 2 120 23 +2bdf 1 121 23 +FUNC 2be0 1d 0 std::_Vector_const_iterator >::operator==(std::_Vector_const_iterator > const &) +2be0 0 190 23 +2be0 f 195 23 +2bef d 198 23 +2bfc 1 199 23 +FUNC 2c00 c1 8 std::basic_string,std::allocator >::assign(char const *,unsigned int) +2c00 5 1056 17 +2c05 2d 1057 17 +2c32 1a 1058 17 +2c4c 4 1066 17 +2c50 25 1060 17 +2c75 c 1062 17 +2c81 f 1060 17 +2c90 8 1065 17 +2c98 3 1066 17 +2c9b e 1062 17 +2ca9 10 1063 17 +2cb9 5 1065 17 +2cbe 3 1066 17 +FUNC 2cd0 83 8 std::basic_string,std::allocator >::erase(unsigned int,unsigned int) +2cd0 1 1240 17 +2cd1 d 1241 17 +2cde 5 1242 17 +2ce3 d 1243 17 +2cf0 2 1244 17 +2cf2 4 1245 17 +2cf6 3c 1248 17 +2d32 8 1249 17 +2d3a 12 1250 17 +2d4c 4 1252 17 +2d50 3 1253 17 +FUNC 2d60 1f 4 std::basic_string,std::allocator >::_Eos(unsigned int) +2d60 0 2030 17 +2d60 14 2031 17 +2d74 3 2032 17 +2d77 5 2031 17 +2d7c 3 2032 17 +FUNC 2d80 bc 8 std::basic_string,std::allocator >::_Grow(unsigned int,bool) +2d80 1 2036 17 +2d81 c 2037 17 +2d8d 5 2038 17 +2d92 7 2039 17 +2d99 c 2040 17 +2da5 a 2046 17 +2daf 3 2047 17 +2db2 d 2041 17 +2dbf 39 2043 17 +2df8 10 2046 17 +2e08 3 2047 17 +2e0b 4 2044 17 +2e0f b 2045 17 +2e1a c 2046 17 +2e26 3 2047 17 +2e29 6 2045 17 +2e2f a 2046 17 +2e39 3 2047 17 +FUNC 2e40 e 0 std::basic_string,std::allocator >::_Myptr() +2e40 0 2087 17 +2e40 9 2088 17 +2e49 1 2089 17 +2e4a 3 2088 17 +2e4d 1 2089 17 +FUNC 2e50 5 4 std::allocator::allocator(std::allocator const &) +2e50 2 124 19 +2e52 3 126 19 +FUNC 2e60 e 8 std::allocator::deallocate(char *,unsigned int) +2e60 0 140 19 +2e60 b 141 19 +2e6b 3 142 19 +FUNC 2e70 da 8 std::basic_string,std::allocator >::assign(wchar_t const *,unsigned int) +2e70 4 1056 17 +2e74 31 1057 17 +2ea5 1d 1058 17 +2ec2 3 1066 17 +2ec5 28 1060 17 +2eed d 1062 17 +2efa 10 1060 17 +2f0a a 1065 17 +2f14 3 1066 17 +2f17 18 1062 17 +2f2f 14 1063 17 +2f43 4 1065 17 +2f47 3 1066 17 +FUNC 2f50 97 8 std::basic_string,std::allocator >::erase(unsigned int,unsigned int) +2f50 1 1240 17 +2f51 d 1241 17 +2f5e 5 1242 17 +2f63 d 1243 17 +2f70 2 1244 17 +2f72 4 1245 17 +2f76 4d 1248 17 +2fc3 8 1249 17 +2fcb 15 1250 17 +2fe0 4 1252 17 +2fe4 3 1253 17 +FUNC 2ff0 4 0 std::basic_string,std::allocator >::size() +2ff0 0 1636 17 +2ff0 3 1637 17 +2ff3 1 1638 17 +FUNC 3000 23 4 std::basic_string,std::allocator >::_Eos(unsigned int) +3000 0 2030 17 +3000 16 2031 17 +3016 3 2032 17 +3019 7 2031 17 +3020 3 2032 17 +FUNC 3030 c7 8 std::basic_string,std::allocator >::_Grow(unsigned int,bool) +3030 1 2036 17 +3031 f 2037 17 +3040 5 2038 17 +3045 7 2039 17 +304c c 2040 17 +3058 a 2046 17 +3062 3 2047 17 +3065 d 2041 17 +3072 3c 2043 17 +30ae 12 2046 17 +30c0 3 2047 17 +30c3 4 2044 17 +30c7 b 2045 17 +30d2 d 2046 17 +30df 3 2047 17 +30e2 8 2045 17 +30ea a 2046 17 +30f4 3 2047 17 +FUNC 3100 e 0 std::basic_string,std::allocator >::_Myptr() +3100 0 2087 17 +3100 9 2088 17 +3109 1 2089 17 +310a 3 2088 17 +310d 1 2089 17 +FUNC 3110 5 4 std::allocator::allocator(std::allocator const &) +3110 2 124 19 +3112 3 126 19 +FUNC 3120 e 8 std::allocator::deallocate(wchar_t *,unsigned int) +3120 0 140 19 +3120 b 141 19 +312b 3 142 19 +FUNC 3130 6 0 std::vector >::max_size() +3130 0 707 23 +3130 5 708 23 +3135 1 709 23 +FUNC 3140 208 8 std::vector >::_Insert_n(std::_Vector_iterator >,unsigned int,google_breakpad::ExceptionHandler * const &) +3140 6 1117 23 +3146 2 1125 23 +3148 1c 1126 23 +3164 1c 1130 23 +3180 5 1131 23 +3185 1b 1132 23 +31a0 23 1135 23 +31c3 17 1136 23 +31da 19 1137 23 +31f3 7 1138 23 +31fa 25 1143 23 +321f 7 1144 23 +3226 1e 1145 23 +3244 13 1152 23 +3257 4 1153 23 +325b 9 1156 23 +3264 7 1163 23 +326b a 1164 23 +3275 3 1165 23 +3278 a 1204 23 +3282 13 1167 23 +3295 17 1170 23 +32ac 1a 1174 23 +32c6 7 1180 23 +32cd 16 1187 23 +32e3 a 1204 23 +32ed 2a 1193 23 +3317 e 1200 23 +3325 19 1202 23 +333e a 1204 23 +FUNC 3350 7c 0 std::vector >::_Xlen() +3350 29 1213 23 +3379 53 1214 23 +FUNC 33d0 1 0 std::allocator::allocator(std::allocator const &) +33d0 0 124 19 +33d0 1 126 19 +FUNC 33e0 8 0 std::allocator::deallocate(google_breakpad::ExceptionHandler * *,unsigned int) +33e0 0 140 19 +33e0 7 141 19 +33e7 1 142 19 +FUNC 33f0 56 0 std::allocator::allocate(unsigned int) +33f0 3 145 19 +33f3 16 146 19 +3409 4 147 19 +340d 39 146 19 +FUNC 3450 32 4 std::_Vector_iterator >::operator+=(int) +3450 0 361 23 +3450 2c 362 23 +347c 3 363 23 +347f 3 364 23 +FUNC 3490 28 0 std::_Vector_iterator >::operator-=(int) +3490 0 373 23 +3490 27 374 23 +34b7 1 375 23 +FUNC 34c0 19 0 std::_Vector_iterator >::operator-(std::_Vector_const_iterator > const &) +34c0 0 384 23 +34c0 18 385 23 +34d8 1 386 23 +FUNC 34e0 21 0 std::_Vector_const_iterator >::_Vector_const_iterator >(google_breakpad::ExceptionHandler * *,std::_Container_base const *) +34e0 0 77 23 +34e0 19 79 23 +34f9 2 80 23 +34fb 3 81 23 +34fe 3 82 23 +FUNC 3510 19 4 std::length_error::length_error(std::length_error const &) +FUNC 3530 7 0 std::_Ranit::_Ranit() +FUNC 3540 6 0 std::basic_string,std::allocator >::max_size() +3540 0 1641 17 +3540 5 1643 17 +3545 1 1644 17 +FUNC 3550 171 8 std::basic_string,std::allocator >::_Copy(unsigned int,unsigned int) +3550 30 2000 17 +3580 8 2001 17 +3588 5 2002 17 +358d 2 2003 17 +358f 2 2004 17 +3591 1f 2005 17 +35b0 3 2006 17 +35b3 2 2009 17 +35b5 18 2010 17 +35cd 2 2019 17 +35cf 30 2010 17 +35ff 3 2012 17 +3602 19 2014 17 +361b c 2019 17 +3627 7 2021 17 +362e 20 2022 17 +364e 12 2023 17 +3660 1c 2026 17 +367c 14 2027 17 +3690 15 2016 17 +36a5 1c 2017 17 +FUNC 36d0 39 4 std::basic_string,std::allocator >::_Inside(char const *) +36d0 1 2050 17 +36d1 2b 2052 17 +36fc 3 2055 17 +36ff 4 2056 17 +3703 3 2053 17 +3706 3 2056 17 +FUNC 3710 6 0 std::basic_string,std::allocator >::max_size() +3710 0 1641 17 +3710 5 1643 17 +3715 1 1644 17 +FUNC 3720 17b 8 std::basic_string,std::allocator >::_Copy(unsigned int,unsigned int) +3720 30 2000 17 +3750 8 2001 17 +3758 8 2002 17 +3760 2 2003 17 +3762 2 2004 17 +3764 1f 2005 17 +3783 3 2006 17 +3786 2 2009 17 +3788 1b 2010 17 +37a3 2 2019 17 +37a5 30 2010 17 +37d5 3 2012 17 +37d8 19 2014 17 +37f1 c 2019 17 +37fd 7 2021 17 +3804 24 2022 17 +3828 12 2023 17 +383a 20 2026 17 +385a 14 2027 17 +386e 17 2016 17 +3885 16 2017 17 +FUNC 38a0 3a 4 std::basic_string,std::allocator >::_Inside(wchar_t const *) +38a0 1 2050 17 +38a1 2c 2052 17 +38cd 3 2055 17 +38d0 4 2056 17 +38d4 3 2053 17 +38d7 3 2056 17 +FUNC 38e0 6 0 std::allocator::max_size() +38e0 0 165 19 +38e0 5 167 19 +38e5 1 168 19 +FUNC 38f0 32 4 std::_Vector_const_iterator >::operator+=(int) +38f0 0 146 23 +38f0 a 147 23 +38fa 1a 148 23 +3914 5 150 23 +3919 3 151 23 +391c 3 152 23 +391f 3 153 23 +FUNC 3930 19 0 std::_Vector_const_iterator >::operator-(std::_Vector_const_iterator > const &) +3930 0 173 23 +3930 f 178 23 +393f 9 181 23 +3948 1 182 23 +FUNC 3950 56 4 std::allocator::allocate(unsigned int) +3950 0 145 19 +3950 16 146 19 +3966 6 147 19 +396c 3a 146 19 +FUNC 39b0 4 0 std::allocator::max_size() +39b0 0 165 19 +39b0 3 167 19 +39b3 1 168 19 +FUNC 39c0 59 4 std::allocator::allocate(unsigned int) +39c0 0 145 19 +39c0 19 146 19 +39d9 6 147 19 +39df 3a 146 19 +FUNC 3a20 6 0 std::allocator::max_size() +3a20 0 165 19 +3a20 5 167 19 +3a25 1 168 19 +FUNC 3a30 21 10 std::_Traits_helper::copy_s >(char *,unsigned int,char const *,unsigned int) +3a30 0 581 70 +3a30 20 582 70 +3a50 1 583 70 +FUNC 3a60 27 10 std::_Traits_helper::copy_s >(wchar_t *,unsigned int,wchar_t const *,unsigned int) +3a60 0 581 70 +3a60 26 582 70 +3a86 1 583 70 +FUNC 3a90 24 0 stdext::unchecked_copy(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *) +3a90 0 3407 65 +3a90 23 3409 65 +3ab3 1 3410 65 +FUNC 3ac0 1 0 std::_Destroy_range >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &) +3ac0 0 225 19 +3ac0 1 227 19 +FUNC 3ad0 15 0 stdext::unchecked_uninitialized_fill_n >(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::allocator &) +3ad0 0 914 24 +3ad0 14 916 24 +3ae4 1 917 24 +FUNC 3af0 21 10 std::_Traits_helper::move_s >(char *,unsigned int,char const *,unsigned int) +3af0 0 608 70 +3af0 20 609 70 +3b10 1 610 70 +FUNC 3b20 27 10 std::_Traits_helper::move_s >(wchar_t *,unsigned int,wchar_t const *,unsigned int) +3b20 0 608 70 +3b20 26 609 70 +3b46 1 610 70 +FUNC 3b50 22 0 std::vector >::_Umove(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *) +3b50 0 1109 23 +3b50 21 1112 23 +3b71 1 1113 23 +FUNC 3b80 10 0 std::fill(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * const &) +3b80 0 2976 65 +3b80 f 2977 65 +3b8f 1 2978 65 +FUNC 3b90 25 0 stdext::_Unchecked_move_backward(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *) +3b90 0 3497 65 +3b90 24 3499 65 +3bb4 1 3500 65 +FUNC 3bc0 4f 0 std::_Allocate(unsigned int,google_breakpad::ExceptionHandler * *) +3bc0 0 37 19 +3bc0 f 40 19 +3bcf 2c 41 19 +3bfb 10 44 19 +3c0b 4 45 19 +FUNC 3c10 54 8 std::_Allocate(unsigned int,char *) +3c10 0 37 19 +3c10 b 38 19 +3c1b 2 39 19 +3c1d 9 44 19 +3c26 4 45 19 +3c2a c 40 19 +3c36 2e 41 19 +FUNC 3c70 57 8 std::_Allocate(unsigned int,wchar_t *) +3c70 0 37 19 +3c70 b 38 19 +3c7b 2 39 19 +3c7d c 44 19 +3c89 4 45 19 +3c8d c 40 19 +3c99 2e 41 19 +FUNC 3cd0 19 4 std::bad_alloc::bad_alloc(std::bad_alloc const &) +FUNC 3cf0 7 0 std::_Char_traits_cat >() +3cf0 1 568 70 +3cf1 4 570 70 +3cf5 2 571 70 +FUNC 3d00 21 14 std::_Traits_helper::copy_s >(char *,unsigned int,char const *,unsigned int,std::_Secure_char_traits_tag) +3d00 0 589 70 +3d00 20 590 70 +3d20 1 591 70 +FUNC 3d30 7 0 std::_Char_traits_cat >() +3d30 1 568 70 +3d31 4 570 70 +3d35 2 571 70 +FUNC 3d40 27 14 std::_Traits_helper::copy_s >(wchar_t *,unsigned int,wchar_t const *,unsigned int,std::_Secure_char_traits_tag) +3d40 0 589 70 +3d40 26 590 70 +3d66 1 591 70 +FUNC 3d70 3 0 std::_Checked_base(google_breakpad::ExceptionHandler * * &) +3d70 0 1009 65 +3d70 2 1011 65 +3d72 1 1012 65 +FUNC 3d80 1 0 std::_Iter_random(google_breakpad::ExceptionHandler * * const &,google_breakpad::ExceptionHandler * * const &) +3d80 0 839 65 +3d80 1 844 65 +FUNC 3d90 7 0 std::_Ptr_cat(google_breakpad::ExceptionHandler * * &,google_breakpad::ExceptionHandler * * &) +3d90 1 1329 65 +3d91 4 1331 65 +3d95 2 1332 65 +FUNC 3da0 15 4 std::_Copy_opt(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag) +3da0 0 2288 65 +3da0 d 2300 65 +3dad 7 2301 65 +3db4 1 2302 65 +FUNC 3dc0 1 4 std::_Destroy_range >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &,std::_Scalar_ptr_iterator_tag) +3dc0 0 242 19 +3dc0 1 243 19 +FUNC 3dd0 15 8 std::_Uninit_fill_n >(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::allocator &,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag) +3dd0 0 415 24 +3dd0 14 416 24 +3de4 1 417 24 +FUNC 3df0 21 14 std::_Traits_helper::move_s >(char *,unsigned int,char const *,unsigned int,std::_Secure_char_traits_tag) +3df0 0 616 70 +3df0 20 617 70 +3e10 1 618 70 +FUNC 3e20 27 14 std::_Traits_helper::move_s >(wchar_t *,unsigned int,wchar_t const *,unsigned int,std::_Secure_char_traits_tag) +3e20 0 616 70 +3e20 26 617 70 +3e46 1 618 70 +FUNC 3e50 22 0 stdext::_Unchecked_uninitialized_move >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &) +3e50 0 843 24 +3e50 21 845 24 +3e71 1 846 24 +FUNC 3e80 10 0 std::_Fill(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * const &) +3e80 0 2946 65 +3e80 6 2948 65 +3e86 9 2949 65 +3e8f 1 2950 65 +FUNC 3e90 7 0 std::_Move_cat(google_breakpad::ExceptionHandler * * const &) +3e90 1 1046 65 +3e91 4 1048 65 +3e95 2 1049 65 +FUNC 3ea0 25 c std::_Move_backward_opt(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Undefined_move_tag,std::_Range_checked_iterator_tag) +3ea0 0 2546 65 +3ea0 24 2548 65 +3ec4 1 2549 65 +FUNC 3ed0 3 4 std::_Checked_base(google_breakpad::ExceptionHandler * * &,std::_Unchanged_checked_iterator_base_type_tag) +3ed0 0 992 65 +3ed0 2 993 65 +3ed2 1 994 65 +FUNC 3ee0 15 0 stdext::unchecked_fill_n(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &) +3ee0 0 3523 65 +3ee0 14 3524 65 +3ef4 1 3525 65 +FUNC 3f00 22 8 std::_Uninit_move,std::_Undefined_move_tag>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &,std::_Undefined_move_tag,std::_Range_checked_iterator_tag) +3f00 0 205 24 +3f00 21 206 24 +3f21 1 207 24 +FUNC 3f30 13 0 std::_Copy_backward_opt(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag) +3f30 0 2492 65 +3f30 10 2506 65 +3f40 2 2507 65 +3f42 1 2508 65 +FUNC 3f50 1 0 std::_Iter_cat(google_breakpad::ExceptionHandler * * const &) +3f50 0 798 65 +3f50 1 801 65 +FUNC 3f60 15 8 std::_Fill_n(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::random_access_iterator_tag,std::_Range_checked_iterator_tag) +3f60 0 3040 65 +3f60 14 3044 65 +3f74 1 3045 65 +FUNC 3f80 22 0 stdext::unchecked_uninitialized_copy >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &) +3f80 0 803 24 +3f80 21 805 24 +3fa1 1 806 24 +FUNC 3fb0 15 4 std::_Fill_n(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::_Range_checked_iterator_tag) +3fb0 0 2986 65 +3fb0 5 2987 65 +3fb5 f 2988 65 +3fc4 1 2989 65 +FUNC 3fd0 15 4 std::_Uninit_copy >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag) +3fd0 0 144 24 +3fd0 d 150 24 +3fdd 7 151 24 +3fe4 1 152 24 +FUNC 3ff0 13 4 vswprintf +3ff0 0 50 147 +3ff0 12 51 147 +4002 1 52 147 +FUNC 4010 ae 4 google_breakpad::GUIDString::GUIDToWString(_GUID *) +4010 12 43 126 +4022 51 51 126 +4073 3a 52 126 +40ad 11 53 126 +FUNC 40c0 ae 4 google_breakpad::GUIDString::GUIDToSymbolServerWString(_GUID *) +40c0 12 56 126 +40d2 51 64 126 +4123 3a 65 126 +415d 11 66 126 +FUNC 4170 40 4 std::basic_string,std::allocator >::basic_string,std::allocator >(wchar_t const *) +4170 0 650 143 +4170 3a 652 143 +41aa 6 653 143 +FUNC 41b0 86 8 main +41b0 13 63 178 +41c3 38 64 178 +41fb 5 65 178 +4200 d 66 178 +420d 1b 67 178 +4228 e 68 178 +FUNC 4240 41 18 `anonymous namespace'::callback +4240 3 45 178 +4243 8 46 178 +424b 11 47 178 +425c 2 48 178 +425e d 49 178 +426b 11 51 178 +427c 3 53 178 +427f 2 54 178 +FUNC 4290 18 0 `anonymous namespace'::CrashFunction +4290 4 56 178 +4294 7 57 178 +429b 9 58 178 +42a4 4 59 178 +FUNC 42ae 18 4 std::invalid_argument::invalid_argument(std::basic_string,std::allocator > const &) +42ae 12 82 298 +42c0 6 83 298 +FUNC 42c6 b 0 std::invalid_argument::~invalid_argument() +42c6 6 86 298 +42cc 5 87 298 +FUNC 42d1 22 0 std::invalid_argument::`vector deleting destructor'(unsigned int) +FUNC 42f3 3f 0 std::_String_base::_Xlen() +42f3 c 12 291 +42ff 33 13 291 +FUNC 4332 3f 0 std::_String_base::_Xran() +4332 c 17 291 +433e 33 18 291 +FUNC 4371 3f 0 std::_String_base::_Xinvarg() +4371 c 22 291 +437d 33 23 291 +FUNC 43b0 18 4 std::invalid_argument::invalid_argument(std::invalid_argument const &) +FUNC 43c8 af 4 printf +43c8 c 49 1601 +43d4 2b 54 1601 +43ff 14 58 1601 +4413 3 59 1601 +4416 10 61 1601 +4426 18 63 1601 +443e 11 65 1601 +444f c 68 1601 +445b 3 72 1601 +445e 6 73 1601 +4464 13 69 1601 +FUNC 4477 16 8 _printf_l +4477 0 80 1601 +4477 15 85 1601 +448c 1 86 1601 +FUNC 448d 16 8 _printf_s_l +448d 0 94 1601 +448d 15 99 1601 +44a2 1 100 1601 +FUNC 44a3 14 4 printf_s +44a3 0 106 1601 +44a3 13 111 1601 +44b6 1 112 1601 +FUNC 44b7 16 8 _printf_p_l +44b7 0 119 1601 +44b7 15 124 1601 +44cc 1 125 1601 +FUNC 44cd 14 4 _printf_p +44cd 0 131 1601 +44cd 13 136 1601 +44e0 1 137 1601 +FUNC 44e1 25 4 _set_printf_count_output +44e1 0 154 1601 +44e1 6 155 1601 +44e7 1e 156 1601 +4505 1 158 1601 +FUNC 4506 16 0 _get_printf_count_output +4506 0 167 1601 +4506 15 168 1601 +451b 1 169 1601 +FUNC 451c f 0 __security_check_cookie +451c 0 52 4397 +451c 6 55 4397 +4522 2 56 4397 +4524 2 57 4397 +4526 5 59 4397 +FUNC 452b 62 4 _flush +452b 2 142 1704 +452d 25 152 1704 +4552 16 154 1704 +4568 7 158 1704 +456f 6 159 1704 +4575 2 161 1704 +4577 4 162 1704 +457b 4 163 1704 +457f 3 167 1704 +4582 7 168 1704 +4589 3 170 1704 +458c 1 171 1704 +FUNC 458d 42 4 _fflush_nolock +458d 1 98 1704 +458e 8 102 1704 +4596 8 103 1704 +459e 1 116 1704 +459f b 106 1704 +45aa 4 108 1704 +45ae 1 116 1704 +45af 8 112 1704 +45b7 13 113 1704 +45ca 1 116 1704 +45cb 3 115 1704 +45ce 1 116 1704 +FUNC 45cf da 4 flsall +45cf c 228 1704 +45db 5 230 1704 +45e0 3 231 1704 +45e3 8 233 1704 +45eb 3 234 1704 +45ee 11 236 1704 +45ff 14 238 1704 +4613 9 246 1704 +461c 6 248 1704 +4622 10 254 1704 +4632 5 256 1704 +4637 c 262 1704 +4643 3 266 1704 +4646 2 268 1704 +4648 a 269 1704 +4652 c 275 1704 +465e 3 276 1704 +4661 8 281 1704 +4669 3 236 1704 +466c 5 281 1704 +4671 11 282 1704 +4682 c 288 1704 +468e 4 292 1704 +4692 3 293 1704 +4695 2 292 1704 +4697 3 295 1704 +469a 6 296 1704 +46a0 9 289 1704 +FUNC 46a9 53 4 fflush +46a9 c 57 1704 +46b5 7 62 1704 +46bc 9 63 1704 +46c5 9 65 1704 +46ce 3 67 1704 +46d1 c 68 1704 +46dd c 70 1704 +46e9 3 74 1704 +46ec 6 75 1704 +46f2 a 71 1704 +FUNC 46fc 9 0 _flushall +46fc 0 193 1704 +46fc 8 194 1704 +4704 1 195 1704 +FUNC 4705 6 0 __iob_func +4705 0 53 2087 +4705 5 54 2087 +470a 1 55 2087 +FUNC 470b b1 0 __initstdio +470b 0 113 2087 +470b d 122 2087 +4718 7 123 2087 +471f 4 124 2087 +4723 7 125 2087 +472a 13 134 2087 +473d 19 137 2087 +4756 4 138 2087 +475a 1 163 2087 +475b e 145 2087 +4769 11 146 2087 +477a b 148 2087 +4785 24 151 2087 +47a9 2 158 2087 +47ab d 148 2087 +47b8 3 162 2087 +47bb 1 163 2087 +FUNC 47bc 20 0 __endstdio +47bc 0 191 2087 +47bc 5 193 2087 +47c1 9 196 2087 +47ca 5 197 2087 +47cf c 198 2087 +47db 1 199 2087 +FUNC 47dc 3c 4 _lock_file +47dc 1 221 2087 +47dd 15 226 2087 +47f2 10 231 2087 +4802 9 233 2087 +480b 1 242 2087 +480c b 241 2087 +4817 1 242 2087 +FUNC 4818 2e 8 _lock_file2 +4818 0 264 2087 +4818 9 269 2087 +4821 9 274 2087 +482a c 276 2087 +4836 1 285 2087 +4837 e 284 2087 +4845 1 285 2087 +FUNC 4846 36 4 _unlock_file +4846 0 306 2087 +4846 14 311 2087 +485a 7 317 2087 +4861 f 318 2087 +4870 1 327 2087 +4871 a 326 2087 +487b 1 327 2087 +FUNC 487c 2a 8 _unlock_file2 +487c 0 349 2087 +487c 7 354 2087 +4883 d 360 2087 +4890 a 361 2087 +489a 1 370 2087 +489b a 369 2087 +48a5 1 370 2087 +FUNC 48a6 16 4 wcslen +48a6 0 41 731 +48a6 4 42 731 +48aa a 44 731 +48b4 7 46 731 +48bb 1 47 731 +FUNC 48bc 5 4 operator delete(void *) +48bc 0 20 5184 +48bc 5 23 5184 +FUNC 48c1 30 8 _JumpToContinuation(void *,EHRegistrationNode *) +48c1 5 77 5627 +48c6 9 84 5627 +48cf 7 93 5627 +48d6 2 94 5627 +48d8 6 95 5627 +48de 3 100 5627 +48e1 3 101 5627 +48e4 3 102 5627 +48e7 3 103 5627 +48ea 2 104 5627 +48ec 5 106 5627 +FUNC 48f1 7 8 _CallMemberFunction0(void *,void *) +48f1 0 118 5627 +48f1 1 120 5627 +48f2 1 121 5627 +48f3 3 122 5627 +48f6 2 123 5627 +FUNC 48f8 7 c _CallMemberFunction1(void *,void *,void *) +48f8 0 139 5627 +48f8 1 141 5627 +48f9 1 142 5627 +48fa 3 143 5627 +48fd 2 144 5627 +FUNC 48ff 7 10 _CallMemberFunction2(void *,void *,void *,int) +48ff 0 161 5627 +48ff 1 163 5627 +4900 1 164 5627 +4901 3 165 5627 +4904 2 166 5627 +FUNC 4906 52 8 _UnwindNestedFrames(EHRegistrationNode *,EHExceptionRecord *) +4906 8 218 5627 +490e 7 232 5627 +4915 3 233 5627 +4918 7 236 5627 +491f 10 237 5627 +492f f 241 5627 +493e 7 247 5627 +4945 3 248 5627 +4948 2 249 5627 +494a 7 250 5627 +4951 7 256 5627 +FUNC 4958 36 10 __CxxFrameHandler +4958 0 287 5627 +4958 1 295 5627 +4959 2 296 5627 +495b 3 297 5627 +495e 1 298 5627 +495f 1 299 5627 +4960 1 300 5627 +4961 1 301 5627 +4962 3 306 5627 +4965 1f 311 5627 +4984 1 316 5627 +4985 1 317 5627 +4986 1 318 5627 +4987 3 319 5627 +498a 2 320 5627 +498c 1 321 5627 +498d 1 322 5627 +FUNC 498e 36 10 __CxxFrameHandler3 +498e 0 341 5627 +498e 1 349 5627 +498f 2 350 5627 +4991 3 351 5627 +4994 1 352 5627 +4995 1 353 5627 +4996 1 354 5627 +4997 1 355 5627 +4998 3 360 5627 +499b 1f 365 5627 +49ba 1 370 5627 +49bb 1 371 5627 +49bc 1 372 5627 +49bd 3 373 5627 +49c0 2 374 5627 +49c2 1 375 5627 +49c3 1 376 5627 +FUNC 49c4 36 10 __CxxFrameHandler2 +49c4 0 391 5627 +49c4 1 399 5627 +49c5 2 400 5627 +49c7 3 401 5627 +49ca 1 402 5627 +49cb 1 403 5627 +49cc 1 404 5627 +49cd 1 405 5627 +49ce 3 410 5627 +49d1 1f 415 5627 +49f0 1 420 5627 +49f1 1 421 5627 +49f2 1 422 5627 +49f3 3 423 5627 +49f6 2 424 5627 +49f8 1 425 5627 +49f9 1 426 5627 +FUNC 49fa 1a 4 __CxxLongjmpUnwind +49fa 0 443 5627 +49fa 17 449 5627 +4a11 3 452 5627 +FUNC 4a14 30 10 CatchGuardHandler +4a14 1 545 5627 +4a15 1 551 5627 +4a16 e 557 5627 +4a24 1f 567 5627 +4a43 1 572 5627 +FUNC 4a44 d5 1c _CallSETranslator(EHExceptionRecord *,EHRegistrationNode *,void *,void *,_s_FuncInfo const *,int,EHRegistrationNode *) +4a44 7 637 5627 +4a4b 9 642 5627 +4a54 5 644 5627 +4a59 3 645 5627 +4a5c 2 646 5627 +4a5e 8 648 5627 +4a66 4 656 5627 +4a6a 7 657 5627 +4a71 d 658 5627 +4a7e 6 659 5627 +4a84 6 660 5627 +4a8a 6 661 5627 +4a90 6 662 5627 +4a96 4 663 5627 +4a9a 4 664 5627 +4a9e 4 669 5627 +4aa2 3 675 5627 +4aa5 3 676 5627 +4aa8 6 681 5627 +4aae 3 682 5627 +4ab1 3 683 5627 +4ab4 6 684 5627 +4aba 7 690 5627 +4ac1 6 692 5627 +4ac7 6 693 5627 +4acd e 697 5627 +4adb e 701 5627 +4ae9 4 707 5627 +4aed 6 715 5627 +4af3 7 724 5627 +4afa 2 725 5627 +4afc 3 726 5627 +4aff 2 727 5627 +4b01 7 728 5627 +4b08 2 731 5627 +4b0a 3 737 5627 +4b0d 6 738 5627 +4b13 3 744 5627 +4b16 3 745 5627 +FUNC 4b19 9d 10 TranslatorGuardHandler +4b19 5 770 5627 +4b1e 1 776 5627 +4b1f e 782 5627 +4b2d b 784 5627 +4b38 a 786 5627 +4b42 5 790 5627 +4b47 2 792 5627 +4b49 2a 796 5627 +4b73 9 798 5627 +4b7c b 802 5627 +4b87 1b 811 5627 +4ba2 3 818 5627 +4ba5 3 819 5627 +4ba8 3 820 5627 +4bab 3 821 5627 +4bae 2 822 5627 +4bb0 3 826 5627 +4bb3 3 828 5627 +FUNC 4bb6 73 14 _GetRangeOfTrysToCheck(_s_FuncInfo const *,int,int,unsigned int *,unsigned int *) +4bb6 7 848 5627 +4bbd 6 849 5627 +4bc3 6 850 5627 +4bc9 2 851 5627 +4bcb 2 852 5627 +4bcd a 855 5627 +4bd7 1d 859 5627 +4bf4 3 860 5627 +4bf7 3 861 5627 +4bfa 3 862 5627 +4bfd 6 854 5627 +4c03 6 866 5627 +4c09 5 867 5627 +4c0e e 869 5627 +4c1c b 871 5627 +4c27 2 872 5627 +FUNC 4c29 28 8 _CreateFrameInfo +4c29 0 889 5627 +4c29 b 890 5627 +4c34 e 891 5627 +4c42 b 892 5627 +4c4d 3 893 5627 +4c50 1 894 5627 +FUNC 4c51 21 4 _IsExceptionObjectToBeDestroyed +4c51 0 907 5627 +4c51 d 910 5627 +4c5e 8 911 5627 +4c66 7 910 5627 +4c6d 1 915 5627 +4c6e 1 916 5627 +4c6f 2 912 5627 +4c71 1 916 5627 +FUNC 4c72 4c 4 _FindAndUnlinkFrame +4c72 1 926 5627 +4c73 11 927 5627 +4c84 f 928 5627 +4c93 1 944 5627 +4c94 d 931 5627 +4ca1 7 935 5627 +4ca8 9 933 5627 +4cb1 5 943 5627 +4cb6 7 936 5627 +4cbd 1 944 5627 +FUNC 4cbe 5e 14 _CallCatchBlock2(EHRegistrationNode *,_s_FuncInfo const *,void *,int,unsigned long) +4cbe 6 485 5627 +4cc4 e 493 5627 +4cd2 c 495 5627 +4cde 11 500 5627 +4cef 6 503 5627 +4cf5 3 504 5627 +4cf8 3 505 5627 +4cfb 6 506 5627 +4d01 e 512 5627 +4d0f 3 518 5627 +4d12 6 519 5627 +4d18 2 524 5627 +4d1a 2 525 5627 +FUNC 4d1c 4a 8 _CxxThrowException +4d1c 6 95 5939 +4d22 15 117 5939 +4d37 3 118 5939 +4d3a 9 134 5939 +4d43 5 136 5939 +4d48 7 138 5939 +4d4f 13 159 5939 +4d62 4 161 5939 +FUNC 4d66 19 0 std::bad_alloc::bad_alloc() +4d66 15 382 5121 +4d7b 4 383 5121 +FUNC 4d7f 6a 4 operator new(unsigned int) +4d7f 6 57 5123 +4d85 2 59 5123 +4d87 d 60 5123 +4d94 d 59 5123 +4da1 2 67 5123 +4da3 27 62 5123 +4dca 1f 63 5123 +FUNC 4de9 f 4 type_info::name(__type_info_node *) +4de9 0 44 5873 +4de9 c 45 5873 +4df5 3 46 5873 +FUNC 4df8 e 0 type_info::~type_info() +4df8 0 49 5873 +4df8 d 50 5873 +4e05 1 51 5873 +FUNC 4e06 1c 0 type_info::`scalar deleting destructor'(unsigned int) +FUNC 4e22 f 4 type_info::_name_internal_method(__type_info_node *) +4e22 0 54 5873 +4e22 c 55 5873 +4e2e 3 56 5873 +FUNC 4e31 8 0 type_info::_type_info_dtor_internal_method() +4e31 0 59 5873 +4e31 7 60 5873 +4e38 1 61 5873 +FUNC 4e39 1b 4 type_info::operator==(type_info const &) +4e39 0 89 5873 +4e39 18 90 5873 +4e51 3 91 5873 +FUNC 4e54 1c 4 type_info::operator!=(type_info const &) +4e54 0 98 5873 +4e54 19 99 5873 +4e6d 3 100 5873 +FUNC 4e70 1f 4 type_info::before(type_info const &) +4e70 0 103 5873 +4e70 1c 104 5873 +4e8c 3 105 5873 +FUNC 4e8f 4 0 type_info::raw_name() +4e8f 0 108 5873 +4e8f 3 109 5873 +4e92 1 110 5873 +FUNC 4e93 b 4 type_info::type_info(type_info const &) +4e93 8 113 5873 +4e9b 3 123 5873 +FUNC 4e9e 5 4 type_info::operator=(type_info const &) +4e9e 2 127 5873 +4ea0 3 135 5873 +FUNC 4ea3 11 0 std::exception::exception() +4ea3 2 68 5916 +4ea5 4 69 5916 +4ea9 a 70 5916 +4eb3 1 71 5916 +FUNC 4eb4 4e 4 std::exception::exception(char const * const &) +4eb4 1 77 5916 +4eb5 14 78 5916 +4ec9 9 80 5916 +4ed2 6 81 5916 +4ed8 9 82 5916 +4ee1 c 84 5916 +4eed 2 87 5916 +4eef 4 89 5916 +4ef3 7 91 5916 +4efa 8 92 5916 +FUNC 4f02 18 8 std::exception::exception(char const * const &,int) +4f02 2 98 5916 +4f04 c 99 5916 +4f10 7 100 5916 +4f17 3 101 5916 +FUNC 4f1a 58 4 std::exception::exception(std::exception const &) +4f1a 1 107 5916 +4f1b 13 108 5916 +4f2e 2 109 5916 +4f30 a 111 5916 +4f3a 9 113 5916 +4f43 6 114 5916 +4f49 9 115 5916 +4f52 d 117 5916 +4f5f 2 120 5916 +4f61 4 122 5916 +4f65 2 125 5916 +4f67 4 126 5916 +4f6b 7 127 5916 +FUNC 4f72 56 4 std::exception::operator=(std::exception const &) +4f72 1 133 5916 +4f73 c 134 5916 +4f7f 6 136 5916 +4f85 2 137 5916 +4f87 9 139 5916 +4f90 9 141 5916 +4f99 6 144 5916 +4f9f 9 146 5916 +4fa8 d 148 5916 +4fb5 2 151 5916 +4fb7 4 153 5916 +4fbb 2 156 5916 +4fbd 3 157 5916 +4fc0 5 159 5916 +4fc5 3 160 5916 +FUNC 4fc8 16 0 std::exception::~exception() +4fc8 0 167 5916 +4fc8 c 168 5916 +4fd4 9 169 5916 +4fdd 1 170 5916 +FUNC 4fde d 0 std::exception::what() +4fde 0 180 5916 +4fde 5 181 5916 +4fe3 2 182 5916 +4fe5 5 184 5916 +4fea 1 185 5916 +FUNC 4feb 19 4 std::bad_cast::bad_cast(char const *) +4feb 13 194 5916 +4ffe 6 195 5916 +FUNC 5004 18 4 std::bad_cast::bad_cast(std::bad_cast const &) +5004 12 199 5916 +5016 6 200 5916 +FUNC 501c b 0 std::bad_cast::~bad_cast() +501c 6 203 5916 +5022 5 204 5916 +FUNC 5027 19 4 std::bad_typeid::bad_typeid(char const *) +5027 13 229 5916 +503a 6 230 5916 +FUNC 5040 18 4 std::bad_typeid::bad_typeid(std::bad_typeid const &) +5040 12 234 5916 +5052 6 235 5916 +FUNC 5058 b 0 std::bad_typeid::~bad_typeid() +5058 6 238 5916 +505e 5 239 5916 +FUNC 5063 18 4 std::__non_rtti_object::__non_rtti_object(char const *) +5063 12 248 5916 +5075 6 249 5916 +FUNC 507b 18 4 std::__non_rtti_object::__non_rtti_object(std::__non_rtti_object const &) +507b 12 253 5916 +508d 6 254 5916 +FUNC 5093 b 0 std::__non_rtti_object::~__non_rtti_object() +5093 0 257 5916 +5093 b 258 5916 +FUNC 509e 1c 0 std::exception::`vector deleting destructor'(unsigned int) +FUNC 50ba 22 0 std::bad_cast::`vector deleting destructor'(unsigned int) +FUNC 50dc 22 0 std::bad_typeid::`scalar deleting destructor'(unsigned int) +FUNC 50fe 22 0 std::__non_rtti_object::`scalar deleting destructor'(unsigned int) +FUNC 5120 7b 10 memcpy_s +5120 4 47 1002 +5124 a 48 1002 +512e 4 51 1002 +5132 20 55 1002 +5152 a 56 1002 +515c f 67 1002 +516b 2 68 1002 +516d f 59 1002 +517c 5 61 1002 +5181 13 62 1002 +5194 5 64 1002 +5199 2 69 1002 +FUNC 519b 5b 10 memmove_s +519b 3 46 955 +519e 9 47 955 +51a7 2 50 955 +51a9 20 54 955 +51c9 5 55 955 +51ce 13 56 955 +51e1 f 58 955 +51f0 4 59 955 +51f4 2 60 955 +FUNC 51f6 a 4 _set_osplatform +51f6 a 385 2595 +FUNC 5200 a 4 _set_osver +5200 a 386 2595 +FUNC 520a a 4 _set_winver +520a a 387 2595 +FUNC 5214 a 4 _set_winmajor +5214 a 388 2595 +FUNC 521e a 4 _set_winminor +521e a 389 2595 +FUNC 5228 24 4 fast_error_exit +5228 0 375 2608 +5228 9 384 2608 +5231 5 386 2608 +5236 9 388 2608 +523f c 389 2608 +524b 1 390 2608 +FUNC 524c 41 0 check_managed_app +524c 0 413 2608 +524c b 418 2608 +5257 5 422 2608 +525c a 424 2608 +5266 2 425 2608 +5268 9 427 2608 +5271 2 428 2608 +5273 7 433 2608 +527a 2 434 2608 +527c d 437 2608 +5289 1 438 2608 +528a 2 419 2608 +528c 1 438 2608 +FUNC 528d 1b6 0 __tmainCRTStartup +528d c 203 2608 +5299 19 233 2608 +52b2 4 234 2608 +52b6 8 235 2608 +52be a 236 2608 +52c8 2 242 2608 +52ca 7 243 2608 +52d1 3 244 2608 +52d4 4 243 2608 +52d8 9 244 2608 +52e1 2 245 2608 +52e3 6 248 2608 +52e9 6 249 2608 +52ef 6 250 2608 +52f5 9 256 2608 +52fe 9 257 2608 +5307 8 258 2608 +530f 6 259 2608 +5315 d 260 2608 +5322 6 262 2608 +5328 5 263 2608 +532d 6 264 2608 +5333 6 265 2608 +5339 6 266 2608 +533f 8 271 2608 +5347 c 273 2608 +5353 8 274 2608 +535b 9 276 2608 +5364 8 277 2608 +536c 5 286 2608 +5371 4 294 2608 +5375 9 296 2608 +537e 8 297 2608 +5386 b 300 2608 +5391 a 303 2608 +539b 9 305 2608 +53a4 8 306 2608 +53ac 9 307 2608 +53b5 8 308 2608 +53bd 8 310 2608 +53c5 4 311 2608 +53c9 7 312 2608 +53d0 a 326 2608 +53da 18 327 2608 +53f2 6 330 2608 +53f8 6 331 2608 +53fe 5 333 2608 +5403 2 335 2608 +5405 17 336 2608 +541c 6 342 2608 +5422 6 344 2608 +5428 6 345 2608 +542e 5 347 2608 +5433 7 349 2608 +543a 3 351 2608 +543d 6 352 2608 +FUNC 5443 a 0 mainCRTStartup +5443 0 186 2608 +5443 5 193 2608 +5448 5 195 2608 +FUNC 544d a 4 _initp_misc_invarg +544d 0 38 3328 +544d 9 39 3328 +5456 1 40 3328 +FUNC 5457 fc 14 _invoke_watson +5457 1c 111 3328 +5473 6 128 3328 +5479 6 129 3328 +547f 6 130 3328 +5485 3 131 3328 +5488 3 132 3328 +548b 3 133 3328 +548e 7 134 3328 +5495 7 135 3328 +549c 4 136 3328 +54a0 4 137 3328 +54a4 4 138 3328 +54a8 4 139 3328 +54ac 1 140 3328 +54ad 6 141 3328 +54b3 6 147 3328 +54b9 19 148 3328 +54d2 3 150 3328 +54d5 13 163 3328 +54e8 6 168 3328 +54ee 13 169 3328 +5501 6 171 3328 +5507 a 174 3328 +5511 a 176 3328 +551b 8 180 3328 +5523 8 181 3328 +552b 12 184 3328 +553d 16 185 3328 +FUNC 5553 22 4 _set_invalid_parameter_handler +5553 1 207 3328 +5554 b 211 3328 +555f d 212 3328 +556c 5 214 3328 +5571 3 216 3328 +5574 1 217 3328 +FUNC 5575 d 0 _get_invalid_parameter_handler +5575 0 221 3328 +5575 c 225 3328 +5581 1 228 3328 +FUNC 5582 9 14 _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int) +5582 3 266 3328 +5585 1 274 3328 +5586 5 273 3328 +FUNC 558b 24 14 _invalid_parameter +558b 3 70 3328 +558e b 77 3328 +5599 5 78 3328 +559e 1 89 3328 +559f 2 80 3328 +55a1 8 86 3328 +55a9 1 89 3328 +55aa 5 88 3328 +FUNC 55af 10 0 _invalid_parameter_noinfo +55af 0 98 3328 +55af f 99 3328 +55be 1 100 3328 +FUNC 55bf 9 14 _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int) +55bf 3 249 3328 +55c2 1 257 3328 +55c3 5 256 3328 +FUNC 55c8 96 8 _swprintf +55c8 7 122 1564 +55cf 24 128 1564 +55f3 8 133 1564 +55fb 6 138 1564 +5601 22 153 1564 +5623 1d 160 1564 +5640 18 161 1564 +5658 4 163 1564 +565c 2 171 1564 +FUNC 565e 1a c __swprintf_l +565e 0 181 1564 +565e 19 186 1564 +5677 1 188 1564 +FUNC 5678 1c c swprintf_s +5678 0 238 1564 +5678 1b 243 1564 +5693 1 244 1564 +FUNC 5694 1f 10 _snwprintf_s +5694 3 253 1564 +5697 1a 258 1564 +56b1 2 259 1564 +FUNC 56b3 1c c _swprintf_p +56b3 0 267 1564 +56b3 1b 272 1564 +56ce 1 273 1564 +FUNC 56cf 1d 10 _swprintf_s_l +56cf 3 282 1564 +56d2 18 287 1564 +56ea 2 288 1564 +FUNC 56ec 20 14 _snwprintf_s_l +56ec 3 298 1564 +56ef 1b 303 1564 +570a 2 304 1564 +FUNC 570c 1d 10 _swprintf_p_l +570c 3 313 1564 +570f 18 318 1564 +5727 2 319 1564 +FUNC 5729 11 4 _scwprintf +5729 0 347 1564 +5729 10 352 1564 +5739 1 353 1564 +FUNC 573a 11 4 _scwprintf_p +573a 0 359 1564 +573a 10 364 1564 +574a 1 365 1564 +FUNC 574b 16 8 _scwprintf_l +574b 0 372 1564 +574b 15 376 1564 +5760 1 377 1564 +FUNC 5761 16 8 _scwprintf_p_l +5761 0 384 1564 +5761 15 389 1564 +5776 1 390 1564 +FUNC 5777 14f 8 fprintf +5777 c 49 1648 +5783 5 53 1648 +5788 2e 55 1648 +57b6 c 56 1648 +57c2 3 61 1648 +57c5 7 63 1648 +57cc 3 64 1648 +57cf b0 66 1648 +587f 5 67 1648 +5884 8 69 1648 +588c 11 70 1648 +589d a 71 1648 +58a7 c 75 1648 +58b3 3 79 1648 +58b6 6 80 1648 +58bc a 76 1648 +FUNC 58c6 1a c _fprintf_l +58c6 0 88 1648 +58c6 19 93 1648 +58df 1 94 1648 +FUNC 58e0 1a c _fprintf_s_l +58e0 0 102 1648 +58e0 19 107 1648 +58f9 1 108 1648 +FUNC 58fa 18 8 fprintf_s +58fa 0 115 1648 +58fa 17 120 1648 +5911 1 121 1648 +FUNC 5912 1a c _fprintf_p_l +5912 0 129 1648 +5912 19 134 1648 +592b 1 135 1648 +FUNC 592c 18 8 _fprintf_p +592c 0 142 1648 +592c 17 147 1648 +5943 1 148 1648 +FUNC 5944 f6 18 _vswprintf_helper +5944 7 125 1380 +594b 28 130 1380 +5973 2f 133 1380 +59a2 15 143 1380 +59b7 7 146 1380 +59be 2 148 1380 +59c0 6 150 1380 +59c6 13 157 1380 +59d9 5 160 1380 +59de 2 162 1380 +59e0 41 171 1380 +5a21 5 172 1380 +5a26 12 175 1380 +5a38 2 183 1380 +FUNC 5a3a 27 10 _vswprintf_c +5a3a 0 241 1380 +5a3a 1f 242 1380 +5a59 7 243 1380 +5a60 1 244 1380 +FUNC 5a61 28 14 _vswprintf_c_l +5a61 3 253 1380 +5a64 1c 254 1380 +5a80 7 255 1380 +5a87 2 256 1380 +FUNC 5a89 87 14 _vswprintf_s_l +5a89 4 265 1380 +5a8d 25 269 1380 +5ab2 19 270 1380 +5acb 1a 272 1380 +5ae5 4 273 1380 +5ae9 3 275 1380 +5aec 5 278 1380 +5af1 1d 280 1380 +5b0e 2 288 1380 +FUNC 5b10 1b 10 vswprintf_s +5b10 0 296 1380 +5b10 1a 297 1380 +5b2a 1 298 1380 +FUNC 5b2b 107 18 _vsnwprintf_s_l +5b2b 5 308 1380 +5b30 27 313 1380 +5b57 13 314 1380 +5b6a 7 317 1380 +5b71 1b 319 1380 +5b8c 8 323 1380 +5b94 20 324 1380 +5bb4 5 325 1380 +5bb9 a 329 1380 +5bc3 7 331 1380 +5bca 2 333 1380 +5bcc 2 338 1380 +5bce 12 339 1380 +5be0 10 342 1380 +5bf0 a 344 1380 +5bfa a 346 1380 +5c04 2 348 1380 +5c06 4 352 1380 +5c0a 8 356 1380 +5c12 18 358 1380 +5c2a 6 360 1380 +5c30 2 366 1380 +FUNC 5c32 1e 14 _vsnwprintf_s +5c32 3 375 1380 +5c35 19 376 1380 +5c4e 2 377 1380 +FUNC 5c50 27 10 _vswprintf_p +5c50 0 385 1380 +5c50 1f 386 1380 +5c6f 7 387 1380 +5c76 1 388 1380 +FUNC 5c77 28 14 _vswprintf_p_l +5c77 3 397 1380 +5c7a 1c 398 1380 +5c96 7 399 1380 +5c9d 2 400 1380 +FUNC 5c9f 24 4 _amsg_exit +5c9f 0 446 2560 +5c9f 5 449 2560 +5ca4 9 450 2560 +5cad b 451 2560 +5cb8 a 452 2560 +5cc2 1 453 2560 +FUNC 5cc3 26 4 __crtCorExitProcess +5cc3 0 650 2560 +5cc3 b 654 2560 +5cce 4 655 2560 +5cd2 c 656 2560 +5cde 4 657 2560 +5ce2 6 658 2560 +5ce8 1 668 2560 +FUNC 5ce9 15 4 __crtExitProcess +5ce9 0 673 2560 +5ce9 a 674 2560 +5cf3 b 683 2560 +FUNC 5cfe 9 0 _lockexit +5cfe 0 733 2560 +5cfe 8 734 2560 +5d06 1 735 2560 +FUNC 5d07 9 0 _unlockexit +5d07 0 759 2560 +5d07 8 760 2560 +5d0f 1 761 2560 +FUNC 5d10 18 4 _initterm +5d10 3 841 2560 +5d13 2 855 2560 +5d15 6 853 2560 +5d1b 2 854 2560 +5d1d 3 855 2560 +5d20 7 848 2560 +5d27 1 857 2560 +FUNC 5d28 20 8 _initterm_e +5d28 1 890 2560 +5d29 c 899 2560 +5d35 6 904 2560 +5d3b 2 905 2560 +5d3d 3 906 2560 +5d40 7 899 2560 +5d47 1 910 2560 +FUNC 5d48 37 4 _get_osplatform +5d48 0 929 2560 +5d48 27 931 2560 +5d6f 1 939 2560 +5d70 9 934 2560 +5d79 2 936 2560 +5d7b 3 938 2560 +5d7e 1 939 2560 +FUNC 5d7f 3c 4 _get_osver +5d7f 0 958 2560 +5d7f 27 960 2560 +5da6 1 968 2560 +5da7 8 963 2560 +5daf 8 965 2560 +5db7 3 967 2560 +5dba 1 968 2560 +FUNC 5dbb 3c 4 _get_winver +5dbb 0 987 2560 +5dbb 27 989 2560 +5de2 1 997 2560 +5de3 8 992 2560 +5deb 8 994 2560 +5df3 3 996 2560 +5df6 1 997 2560 +FUNC 5df7 3c 4 _get_winmajor +5df7 0 1016 2560 +5df7 27 1018 2560 +5e1e 1 1026 2560 +5e1f 8 1021 2560 +5e27 8 1023 2560 +5e2f 3 1025 2560 +5e32 1 1026 2560 +FUNC 5e33 3c 4 _get_winminor +5e33 0 1045 2560 +5e33 27 1047 2560 +5e5a 1 1055 2560 +5e5b 8 1050 2560 +5e63 8 1052 2560 +5e6b 3 1054 2560 +5e6e 1 1055 2560 +FUNC 5e6f 37 4 _get_wpgmptr +5e6f 0 1074 2560 +5e6f 27 1076 2560 +5e96 1 1085 2560 +5e97 9 1080 2560 +5ea0 2 1082 2560 +5ea2 3 1084 2560 +5ea5 1 1085 2560 +FUNC 5ea6 37 4 _get_pgmptr +5ea6 0 1104 2560 +5ea6 27 1106 2560 +5ecd 1 1115 2560 +5ece 9 1110 2560 +5ed7 2 1112 2560 +5ed9 3 1114 2560 +5edc 1 1115 2560 +FUNC 5edd 92 4 _cinit +5edd 0 263 2560 +5edd 18 273 2560 +5ef5 b 275 2560 +5f00 5 277 2560 +5f05 f 283 2560 +5f14 4 284 2560 +5f18 4 285 2560 +5f1c a 288 2560 +5f26 20 293 2560 +5f46 1a 306 2560 +5f60 c 308 2560 +5f6c 2 312 2560 +5f6e 1 313 2560 +FUNC 5f6f e2 c doexit +5f6f c 499 2560 +5f7b 8 517 2560 +5f83 5 518 2560 +5f88 b 520 2560 +5f93 6 521 2560 +5f99 8 524 2560 +5fa1 5 526 2560 +5fa6 e 542 2560 +5fb4 12 543 2560 +5fc6 5 545 2560 +5fcb b 546 2560 +5fd6 10 551 2560 +5fe6 9 552 2560 +5fef 2 553 2560 +5ff1 10 558 2560 +6001 10 566 2560 +6011 c 584 2560 +601d 6 588 2560 +6023 6 592 2560 +6029 8 594 2560 +6031 8 596 2560 +6039 3 584 2560 +603c 6 585 2560 +6042 9 586 2560 +604b 6 597 2560 +FUNC 6051 11 4 exit +6051 0 397 2560 +6051 10 398 2560 +6061 1 399 2560 +FUNC 6062 11 4 _exit +6062 0 405 2560 +6062 10 406 2560 +6072 1 407 2560 +FUNC 6073 f 0 _cexit +6073 0 412 2560 +6073 e 413 2560 +6081 1 414 2560 +FUNC 6082 f 0 _c_exit +6082 0 419 2560 +6082 e 420 2560 +6090 1 421 2560 +FUNC 6091 4c 0 _init_pointers +6091 1 786 2560 +6092 7 787 2560 +6099 6 789 2560 +609f 6 790 2560 +60a5 6 791 2560 +60ab 6 792 2560 +60b1 6 793 2560 +60b7 6 794 2560 +60bd 6 795 2560 +60c3 6 796 2560 +60c9 13 799 2560 +60dc 1 800 2560 +FUNC 60e0 8b 4 strlen +60e0 0 54 880 +60e0 4 63 880 +60e4 6 64 880 +60ea 2 65 880 +60ec 2 69 880 +60ee 3 70 880 +60f1 2 71 880 +60f3 2 72 880 +60f5 6 73 880 +60fb 2 74 880 +60fd 13 76 880 +6110 2 81 880 +6112 5 82 880 +6117 2 83 880 +6119 3 84 880 +611c 2 85 880 +611e 3 86 880 +6121 5 87 880 +6126 2 88 880 +6128 3 90 880 +612b 2 91 880 +612d 2 92 880 +612f 2 93 880 +6131 2 94 880 +6133 5 95 880 +6138 2 96 880 +613a 5 97 880 +613f 2 98 880 +6141 2 99 880 +6143 3 103 880 +6146 4 104 880 +614a 2 105 880 +614c 1 106 880 +614d 3 108 880 +6150 4 109 880 +6154 2 110 880 +6156 1 111 880 +6157 3 113 880 +615a 4 114 880 +615e 2 115 880 +6160 1 116 880 +6161 3 118 880 +6164 4 119 880 +6168 2 120 880 +616a 1 121 880 +FUNC 616b 33 4 _EH_prolog3 +616b 0 93 5671 +616b 1 101 5671 +616c 7 103 5671 +6173 4 112 5671 +6177 4 113 5671 +617b 1 114 5671 +617c 1 115 5671 +617d 1 116 5671 +617e 2 117 5671 +6180 2 118 5671 +6182 5 131 5671 +6187 2 132 5671 +6189 1 133 5671 +618a 3 134 5671 +618d 7 135 5671 +6194 3 150 5671 +6197 6 151 5671 +619d 1 153 5671 +FUNC 619e 36 4 _EH_prolog3_catch +619e 0 206 5671 +619e 1 214 5671 +619f 7 216 5671 +61a6 4 225 5671 +61aa 4 226 5671 +61ae 1 228 5671 +61af 1 229 5671 +61b0 1 230 5671 +61b1 2 231 5671 +61b3 2 232 5671 +61b5 5 246 5671 +61ba 2 247 5671 +61bc 1 248 5671 +61bd 3 249 5671 +61c0 3 250 5671 +61c3 7 251 5671 +61ca 3 267 5671 +61cd 6 268 5671 +61d3 1 270 5671 +FUNC 61d4 36 4 _EH_prolog3_GS +61d4 0 322 5671 +61d4 1 330 5671 +61d5 7 332 5671 +61dc 4 341 5671 +61e0 4 342 5671 +61e4 1 344 5671 +61e5 1 345 5671 +61e6 1 346 5671 +61e7 2 347 5671 +61e9 2 348 5671 +61eb 5 362 5671 +61f0 2 363 5671 +61f2 1 364 5671 +61f3 3 365 5671 +61f6 3 366 5671 +61f9 7 367 5671 +6200 3 384 5671 +6203 6 385 5671 +6209 1 387 5671 +FUNC 620a 39 4 _EH_prolog3_catch_GS +620a 0 441 5671 +620a 1 449 5671 +620b 7 451 5671 +6212 4 460 5671 +6216 4 461 5671 +621a 1 463 5671 +621b 1 464 5671 +621c 1 465 5671 +621d 2 466 5671 +621f 2 467 5671 +6221 5 482 5671 +6226 2 483 5671 +6228 1 484 5671 +6229 3 485 5671 +622c 3 486 5671 +622f 3 487 5671 +6232 7 488 5671 +6239 3 505 5671 +623c 6 506 5671 +6242 1 508 5671 +FUNC 6243 14 0 _EH_epilog3 +6243 0 534 5671 +6243 3 537 5671 +6246 7 538 5671 +624d 1 539 5671 +624e 1 540 5671 +624f 1 541 5671 +6250 1 542 5671 +6251 1 543 5671 +6252 2 544 5671 +6254 1 545 5671 +6255 1 546 5671 +6256 1 547 5671 +FUNC 6257 f 0 _EH_epilog3_GS +6257 0 575 5671 +6257 3 578 5671 +625a 2 579 5671 +625c 5 580 5671 +6261 5 581 5671 +FUNC 6266 f 0 _EH_epilog3_catch_GS +6266 0 609 5671 +6266 3 612 5671 +6269 2 613 5671 +626b 5 614 5671 +6270 5 615 5671 +FUNC 6275 96 4 _stbuf +6275 1 59 1850 +6276 14 69 1850 +628a 2 70 1850 +628c c 73 1850 +6298 4 74 1850 +629c c 75 1850 +62a8 3 76 1850 +62ab 6 82 1850 +62b1 6 86 1850 +62b7 4 87 1850 +62bb 1e 91 1850 +62d9 3 93 1850 +62dc e 94 1850 +62ea 2 96 1850 +62ec 7 98 1850 +62f3 6 99 1850 +62f9 8 102 1850 +6301 5 104 1850 +6306 1 105 1850 +6307 3 78 1850 +630a 1 105 1850 +FUNC 630b 2f 8 _ftbuf +630b 0 138 1850 +630b 8 146 1850 +6313 c 148 1850 +631f 6 151 1850 +6325 7 152 1850 +632c 4 153 1850 +6330 9 154 1850 +6339 1 166 1850 +FUNC 633a 82 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *) +633a 0 261 1343 +633a f 262 1343 +6349 8 264 1343 +6351 5 265 1343 +6356 6 266 1343 +635c 1c 268 1343 +6378 21 269 1343 +6399 9 270 1343 +63a2 4 272 1343 +63a6 4 273 1343 +63aa 2 276 1343 +63ac a 278 1343 +63b6 6 280 1343 +FUNC 63bc e 0 _LocaleUpdate::~_LocaleUpdate() +63bc 0 282 1343 +63bc 6 283 1343 +63c2 7 284 1343 +63c9 1 285 1343 +FUNC 63ca 3 0 _LocaleUpdate::GetLocaleT() +63ca 2 287 1343 +63cc 1 289 1343 +FUNC 63cd 33 0 write_char +63cd 0 2433 1312 +63cd a 2434 1312 +63d7 2 2437 1312 +63d9 21 2442 1312 +63fa 2 2444 1312 +63fc 1 2447 1312 +63fd 2 2446 1312 +63ff 1 2447 1312 +FUNC 6400 24 c write_multi_char +6400 6 2498 1312 +6406 2 2501 1312 +6408 e 2500 1312 +6416 5 2501 1312 +641b 7 2499 1312 +6422 2 2504 1312 +FUNC 6424 4a 4 write_string +6424 0 2563 1312 +6424 12 2564 1312 +6436 6 2566 1312 +643c 2 2567 1312 +643e e 2570 1312 +644c 5 2571 1312 +6451 a 2573 1312 +645b 9 2574 1312 +6464 9 2569 1312 +646d 1 2579 1312 +FUNC 646e d 4 get_int_arg +646e 0 2602 1312 +646e c 2603 1312 +647a 1 2604 1312 +FUNC 647b 10 4 get_int64_arg +647b 0 2644 1312 +647b f 2645 1312 +648a 1 2646 1312 +FUNC 648b e 4 get_short_arg +648b 0 2671 1312 +648b d 2672 1312 +6498 1 2673 1312 +FUNC 6499 994 10 _output_l +6499 1b 975 1312 +64b4 45 1036 1312 +64f9 2d 1031 1312 +6526 b1 1033 1312 +65d7 8 1036 1312 +65df 26 1073 1312 +6605 1d 1075 1312 +6622 8 1076 1312 +662a 18 1131 1312 +6642 13 1173 1312 +6655 3 1174 1312 +6658 5 1175 1312 +665d 1f 1179 1312 +667c 4 1193 1312 +6680 5 1194 1312 +6685 4 1181 1312 +6689 5 1182 1312 +668e 4 1184 1312 +6692 5 1185 1312 +6697 7 1190 1312 +669e 5 1191 1312 +66a3 4 1187 1312 +66a7 5 1196 1312 +66ac 5 1200 1312 +66b1 9 1206 1312 +66ba b 1233 1312 +66c5 4 1235 1312 +66c9 3 1236 1312 +66cc 5 1239 1312 +66d1 10 1241 1312 +66e1 5 1243 1312 +66e6 3 1248 1312 +66e9 5 1249 1312 +66ee 5 1253 1312 +66f3 9 1259 1312 +66fc b 1284 1312 +6707 4 1285 1312 +670b 5 1287 1312 +6710 10 1289 1312 +6720 5 1291 1312 +6725 18 1295 1312 +673d 7 1362 1312 +6744 5 1363 1312 +6749 5 1301 1312 +674e 1 1303 1312 +674f a 1304 1312 +6759 5 1306 1312 +675e 4 1308 1312 +6762 5 1310 1312 +6767 4 1358 1312 +676b 5 1359 1312 +6770 c 1322 1312 +677c 2 1324 1312 +677e f 1325 1312 +678d a 1327 1312 +6797 2 1329 1312 +6799 a 1330 1312 +67a3 5 1332 1312 +67a8 30 1337 1312 +67d8 3 1352 1312 +67db 13 1158 1312 +67ee 11 1160 1312 +67ff 3 1161 1312 +6802 b 1163 1312 +680d b 1166 1312 +6818 5 1167 1312 +681d 32 1378 1312 +684f d 1716 1312 +685c 4 1724 1312 +6860 17 1749 1312 +6877 c 1750 1312 +6883 8 1381 1312 +688b 9 1385 1312 +6894 8 1561 1312 +689c 7 1562 1312 +68a3 d 1584 1312 +68b0 3 1589 1312 +68b3 15 1635 1312 +68c8 4 1636 1312 +68cc 8 1637 1312 +68d4 f 1639 1312 +68e3 1d 1378 1312 +6900 12 1448 1312 +6912 16 1467 1312 +6928 4 1470 1312 +692c 7 1471 1312 +6933 2 1472 1312 +6935 6 1499 1312 +693b 7 1500 1312 +6942 6 1503 1312 +6948 5 1506 1312 +694d 5 1523 1312 +6952 e 1541 1312 +6960 6 1546 1312 +6966 d 1548 1312 +6973 7 1549 1312 +697a 5 1550 1312 +697f 3 1551 1312 +6982 5 1553 1312 +6987 8 1543 1312 +698f 7 1544 1312 +6996 5 1557 1312 +699b 34 1378 1312 +69cf d 1908 1312 +69dc 9 1910 1312 +69e5 8 1668 1312 +69ed d 1688 1312 +69fa 6 1702 1312 +6a00 7 1703 1312 +6a07 2 1704 1312 +6a09 5 1706 1312 +6a0e 7 1708 1312 +6a15 5 1710 1312 +6a1a 4 1864 1312 +6a1e 7 1869 1312 +6a25 c 1933 1312 +6a31 8 1939 1312 +6a39 5 1958 1312 +6a3e 7 1751 1312 +6a45 9 1752 1312 +6a4e 5 1753 1312 +6a53 3 1754 1312 +6a56 9 1756 1312 +6a5f f 1759 1312 +6a6e 2 1760 1312 +6a70 13 1765 1312 +6a83 9 1767 1312 +6a8c e 1809 1312 +6a9a 27 1828 1312 +6ac1 13 1838 1312 +6ad4 15 1840 1312 +6ae9 a 1844 1312 +6af3 15 1846 1312 +6b08 5 1852 1312 +6b0d 7 1853 1312 +6b14 4 1854 1312 +6b18 1 1857 1312 +6b19 5 1859 1312 +6b1e 7 1877 1312 +6b25 3 1887 1312 +6b28 2 1888 1312 +6b2a 1a 1378 1312 +6b44 7 1892 1312 +6b4b 11 1897 1312 +6b5c c 1900 1312 +6b68 7 1901 1312 +6b6f 5 1903 1312 +6b74 5 1961 1312 +6b79 6 1987 1312 +6b7f 14 2026 1312 +6b93 2 2045 1312 +6b95 5 2051 1312 +6b9a 2 2071 1312 +6b9c 3 2074 1312 +6b9f 6 2080 1312 +6ba5 2 2099 1312 +6ba7 5 2105 1312 +6bac f 2128 1312 +6bbb 7 2129 1312 +6bc2 7 2130 1312 +6bc9 c 2136 1312 +6bd5 2 2142 1312 +6bd7 6 2148 1312 +6bdd 7 2149 1312 +6be4 2 2150 1312 +6be6 4 2151 1312 +6bea a 2152 1312 +6bf4 3 2153 1312 +6bf7 6 2157 1312 +6bfd 3 2158 1312 +6c00 6 2163 1312 +6c06 10 2165 1312 +6c16 10 2166 1312 +6c26 c 2168 1312 +6c32 3 2170 1312 +6c35 3 2172 1312 +6c38 2 2173 1312 +6c3a 8 2175 1312 +6c42 1 2176 1312 +6c43 19 2180 1312 +6c5c 9 2181 1312 +6c65 1 2182 1312 +6c66 2 2185 1312 +6c68 6 1640 1312 +6c6e 2 1641 1312 +6c70 4 1640 1312 +6c74 5 1642 1312 +6c79 2 1644 1312 +6c7b 4 1645 1312 +6c7f 8 1646 1312 +6c87 5 1647 1312 +6c8c 6 1648 1312 +6c92 1 1649 1312 +6c93 4 1648 1312 +6c97 6 1650 1312 +6c9d a 2201 1312 +6ca7 7 2204 1312 +6cae 6 2205 1312 +6cb4 4 2207 1312 +6cb8 2 2208 1312 +6cba 4 2210 1312 +6cbe 4 2212 1312 +6cc2 2 2213 1312 +6cc4 4 2215 1312 +6cc8 4 2217 1312 +6ccc 7 2218 1312 +6cd3 9 2224 1312 +6cdc 6 2228 1312 +6ce2 11 2230 1312 +6cf3 11 2234 1312 +6d04 d 2236 1312 +6d11 f 2238 1312 +6d20 d 2243 1312 +6d2d 3 2249 1312 +6d30 3 2250 1312 +6d33 1e 2252 1312 +6d51 9 2253 1312 +6d5a 18 2257 1312 +6d72 2 1690 1312 +6d74 4 2254 1312 +6d78 2 2259 1312 +6d7a d 2260 1312 +6d87 c 2290 1312 +6d93 f 2292 1312 +6da2 6 2297 1312 +6da8 8 2298 1312 +6db0 1e 2299 1312 +6dce 17 1163 1312 +6de5 10 2376 1312 +6df5 38 2377 1312 +FUNC 6e2d 3b 4 _get_errno_from_oserr +6e2d 0 119 6100 +6e2d 6 123 6100 +6e33 f 124 6100 +6e42 8 133 6100 +6e4a 3 134 6100 +6e4d 1 139 6100 +6e4e 7 125 6100 +6e55 1 139 6100 +6e56 11 135 6100 +6e67 1 139 6100 +FUNC 6e68 13 0 _errno +6e68 0 280 6100 +6e68 5 281 6100 +6e6d 4 282 6100 +6e71 5 283 6100 +6e76 1 288 6100 +6e77 3 285 6100 +6e7a 1 288 6100 +FUNC 6e7b 13 0 __doserrno +6e7b 0 293 6100 +6e7b 5 294 6100 +6e80 4 295 6100 +6e84 5 296 6100 +6e89 1 300 6100 +6e8a 3 298 6100 +6e8d 1 300 6100 +FUNC 6e8e 1e 4 _dosmaperr +6e8e 1 110 6100 +6e8f 9 111 6100 +6e98 13 113 6100 +6eab 1 114 6100 +FUNC 6eac 1b 4 _set_errno +6eac 0 157 6100 +6eac 5 158 6100 +6eb1 4 159 6100 +6eb5 3 161 6100 +6eb8 1 168 6100 +6eb9 b 165 6100 +6ec4 2 166 6100 +6ec6 1 168 6100 +FUNC 6ec7 2a 4 _get_errno +6ec7 1 187 6100 +6ec8 1b 189 6100 +6ee3 1 195 6100 +6ee4 9 193 6100 +6eed 3 194 6100 +6ef0 1 195 6100 +FUNC 6ef1 1b 4 _set_doserrno +6ef1 0 213 6100 +6ef1 5 214 6100 +6ef6 4 215 6100 +6efa 3 217 6100 +6efd 1 224 6100 +6efe b 221 6100 +6f09 2 222 6100 +6f0b 1 224 6100 +FUNC 6f0c 2a 4 _get_doserrno +6f0c 1 243 6100 +6f0d 1b 245 6100 +6f28 1 251 6100 +6f29 9 249 6100 +6f32 3 250 6100 +6f35 1 251 6100 +FUNC 6f38 45 0 _SEH_prolog4 +FUNC 6f7d 14 0 _SEH_epilog4 +FUNC 6fa0 24 0 ValidateLocalCookies +FUNC 6fd0 196 10 _except_handler4 +FUNC 7166 90 10 vprintf_helper +7166 c 47 1507 +7172 d 48 1507 +717f 2b 52 1507 +71aa 7 55 1507 +71b1 3 56 1507 +71b4 8 58 1507 +71bc 10 59 1507 +71cc a 60 1507 +71d6 c 63 1507 +71e2 3 67 1507 +71e5 6 68 1507 +71eb 3 63 1507 +71ee 8 64 1507 +FUNC 71f6 1a c _vprintf_l +71f6 0 75 1507 +71f6 19 76 1507 +720f 1 77 1507 +FUNC 7210 1a c _vprintf_s_l +7210 0 84 1507 +7210 19 85 1507 +7229 1 86 1507 +FUNC 722a 1a c _vprintf_p_l +722a 0 93 1507 +722a 19 94 1507 +7243 1 95 1507 +FUNC 7244 18 8 vprintf +7244 0 101 1507 +7244 17 102 1507 +725b 1 103 1507 +FUNC 725c 18 8 vprintf_s +725c 0 109 1507 +725c 17 110 1507 +7273 1 111 1507 +FUNC 7274 18 8 _vprintf_p +7274 0 117 1507 +7274 17 118 1507 +728b 1 119 1507 +FUNC 728c 104 0 __report_gsfailure +728c 9 140 3731 +7295 5 170 3731 +729a 6 171 3731 +72a0 6 172 3731 +72a6 6 173 3731 +72ac 6 174 3731 +72b2 6 175 3731 +72b8 7 176 3731 +72bf 7 177 3731 +72c6 7 178 3731 +72cd 7 179 3731 +72d4 7 180 3731 +72db 7 181 3731 +72e2 1 182 3731 +72e3 6 183 3731 +72e9 3 190 3731 +72ec 5 191 3731 +72f1 3 192 3731 +72f4 5 193 3731 +72f9 3 194 3731 +72fc 5 195 3731 +7301 6 201 3731 +7307 a 204 3731 +7311 a 206 3731 +731b a 285 3731 +7325 a 286 3731 +732f b 293 3731 +733a b 294 3731 +7345 b 297 3731 +7350 8 298 3731 +7358 8 302 3731 +7360 b 304 3731 +736b 9 313 3731 +7374 8 315 3731 +737c 12 319 3731 +738e 2 320 3731 +FUNC 7390 5c6 c _write_nolock +7390 22 95 4777 +73b2 2 106 4777 +73b4 11 108 4777 +73c5 7 109 4777 +73cc 2b 111 4777 +73f7 27 113 4777 +741e 10 116 4777 +742e 33 119 4777 +7461 6 122 4777 +7467 f 126 4777 +7476 1c 143 4777 +7492 5 146 4777 +7497 8 147 4777 +749f 14 148 4777 +74b3 16 152 4777 +74c9 6 153 4777 +74cf 4 157 4777 +74d3 16 160 4777 +74e9 9 153 4777 +74f2 b 163 4777 +74fd 9 164 4777 +7506 11 170 4777 +7517 18 171 4777 +752f 2 173 4777 +7531 14 174 4777 +7545 18 175 4777 +755d 4 181 4777 +7561 2e 205 4777 +758f 21 212 4777 +75b0 6 213 4777 +75b6 8 214 4777 +75be a 222 4777 +75c8 29 229 4777 +75f1 a 230 4777 +75fb 3 232 4777 +75fe 3 233 4777 +7601 2 238 4777 +7603 8 186 4777 +760b 3 191 4777 +760e 9 192 4777 +7617 f 193 4777 +7626 8 240 4777 +762e 13 242 4777 +7641 3 244 4777 +7644 6 251 4777 +764a 3 254 4777 +764d 14 255 4777 +7661 3 257 4777 +7664 12 258 4777 +7676 5 236 4777 +767b e 268 4777 +7689 12 277 4777 +769b f 278 4777 +76aa d 279 4777 +76b7 8 283 4777 +76bf 9 284 4777 +76c8 5 285 4777 +76cd 3 286 4777 +76d0 7 287 4777 +76d7 f 289 4777 +76e6 25 297 4777 +770b 6 299 4777 +7711 16 300 4777 +7727 f 308 4777 +7736 f 314 4777 +7745 b 315 4777 +7750 8 319 4777 +7758 c 320 4777 +7764 6 321 4777 +776a 4 322 4777 +776e c 323 4777 +777a f 325 4777 +7789 25 333 4777 +77ae 6 335 4777 +77b4 1a 336 4777 +77ce 5 344 4777 +77d3 f 359 4777 +77e2 13 361 4777 +77f5 8 365 4777 +77fd b 366 4777 +7808 6 367 4777 +780e a 369 4777 +7818 11 371 4777 +7829 2f 382 4777 +7858 4 384 4777 +785c 25 406 4777 +7881 3 407 4777 +7884 6 412 4777 +788a 9 409 4777 +7893 4 419 4777 +7897 15 423 4777 +78ac 2 428 4777 +78ae 1b 434 4777 +78c9 a 437 4777 +78d3 2 439 4777 +78d5 9 440 4777 +78de a 443 4777 +78e8 7 447 4777 +78ef 8 449 4777 +78f7 b 452 4777 +7902 2 455 4777 +7904 9 456 4777 +790d 2 457 4777 +790f 11 459 4777 +7920 4 460 4777 +7924 b 462 4777 +792f 7 463 4777 +7936 5 464 4777 +793b 5 469 4777 +7940 16 470 4777 +FUNC 7956 dc c _write +7956 c 61 4777 +7962 23 66 4777 +7985 2f 67 4777 +79b4 20 68 4777 +79d4 7 70 4777 +79db 3 72 4777 +79de 9 73 4777 +79e7 14 74 4777 +79fb 2 75 4777 +79fd b 76 4777 +7a08 7 77 4777 +7a0f 4 78 4777 +7a13 c 82 4777 +7a1f 3 86 4777 +7a22 6 87 4777 +7a28 a 83 4777 +FUNC 7a32 2d 4 _fileno +7a32 0 40 2176 +7a32 27 41 2176 +7a59 1 43 2176 +7a5a 4 42 2176 +7a5e 1 43 2176 +FUNC 7a5f e1 4 _commit +7a5f c 39 5043 +7a6b 1b 43 5043 +7a86 28 44 5043 +7aae 20 45 5043 +7ace 7 47 5043 +7ad5 3 48 5043 +7ad8 9 49 5043 +7ae1 14 51 5043 +7af5 9 52 5043 +7afe 2 54 5043 +7b00 3 55 5043 +7b03 5 59 5043 +7b08 a 62 5043 +7b12 b 66 5043 +7b1d 4 67 5043 +7b21 c 72 5043 +7b2d 3 75 5043 +7b30 6 76 5043 +7b36 a 73 5043 +FUNC 7b40 49 0 _mtinitlocks +7b40 2 137 2371 +7b42 7 144 2371 +7b49 11 145 2371 +7b5a 2 146 2371 +7b5c 15 148 2371 +7b71 6 144 2371 +7b77 5 157 2371 +7b7c d 158 2371 +FUNC 7b89 55 0 _mtdeletelocks +7b89 1 188 2371 +7b8a d 194 2371 +7b97 c 196 2371 +7ba3 3 200 2371 +7ba6 6 206 2371 +7bac f 207 2371 +7bbb 6 215 2371 +7bc1 c 217 2371 +7bcd 10 221 2371 +7bdd 1 224 2371 +FUNC 7bde 15 4 _unlock +7bde 3 371 2371 +7be1 10 375 2371 +7bf1 2 376 2371 +FUNC 7bf3 18 4 _lockerr_exit +7bf3 0 403 2371 +7bf3 c 404 2371 +7bff b 405 2371 +7c0a 1 406 2371 +FUNC 7c0b c3 4 _mtinitlocknum +7c0b c 259 2371 +7c17 6 261 2371 +7c1d a 269 2371 +7c27 5 270 2371 +7c2c 7 271 2371 +7c33 c 272 2371 +7c3f e 276 2371 +7c4d 4 277 2371 +7c51 e 279 2371 +7c5f b 280 2371 +7c6a 4 281 2371 +7c6e 8 284 2371 +7c76 3 285 2371 +7c79 4 287 2371 +7c7d 11 288 2371 +7c8e 7 289 2371 +7c95 b 290 2371 +7ca0 3 291 2371 +7ca3 2 292 2371 +7ca5 2 293 2371 +7ca7 2 296 2371 +7ca9 7 297 2371 +7cb0 c 300 2371 +7cbc 3 304 2371 +7cbf 6 305 2371 +7cc5 9 301 2371 +FUNC 7cce 31 4 _lock +7cce 3 333 2371 +7cd1 10 338 2371 +7ce1 b 340 2371 +7cec 8 341 2371 +7cf4 9 348 2371 +7cfd 2 349 2371 +FUNC 7cff 240 0 _ioinit +7cff c 111 4958 +7d0b 5 122 4958 +7d10 a 127 4958 +7d1a 7 128 4958 +7d21 f 137 4958 +7d30 6 139 4958 +7d36 5 142 4958 +7d3b 6 143 4958 +7d41 8 145 4958 +7d49 4 146 4958 +7d4d 3 147 4958 +7d50 4 148 4958 +7d54 3 149 4958 +7d57 4 151 4958 +7d5b 4 152 4958 +7d5f 4 153 4958 +7d63 13 145 4958 +7d76 15 161 4958 +7d8b 2 166 4958 +7d8d 3 172 4958 +7d90 6 173 4958 +7d96 b 179 4958 +7da1 5 185 4958 +7da6 f 191 4958 +7db5 9 204 4958 +7dbe 7 205 4958 +7dc5 8 207 4958 +7dcd 4 208 4958 +7dd1 3 209 4958 +7dd4 4 210 4958 +7dd8 4 211 4958 +7ddc 4 212 4958 +7de0 4 213 4958 +7de4 4 214 4958 +7de8 f 207 4958 +7df7 9 185 4958 +7e00 2 284 4958 +7e02 6 197 4958 +7e08 8 221 4958 +7e10 24 234 4958 +7e34 15 236 4958 +7e49 7 237 4958 +7e50 5 238 4958 +7e55 18 241 4958 +7e6d 3 243 4958 +7e70 d 221 4958 +7e7d 2 253 4958 +7e7f b 255 4958 +7e8a c 258 4958 +7e96 6 306 4958 +7e9c 4 262 4958 +7ea0 30 266 4958 +7ed0 2 271 4958 +7ed2 a 277 4958 +7edc 6 278 4958 +7ee2 5 279 4958 +7ee7 4 280 4958 +7eeb 14 284 4958 +7eff 3 286 4958 +7f02 2 288 4958 +7f04 4 297 4958 +7f08 6 298 4958 +7f0e a 253 4958 +7f18 c 313 4958 +7f24 4 315 4958 +7f28 7 128 4958 +7f2f a 129 4958 +7f39 6 316 4958 +FUNC 7f3f 4c 0 _ioterm +7f3f 2 341 4958 +7f41 5 345 4958 +7f46 6 347 4958 +7f4c 8 353 4958 +7f54 9 355 4958 +7f5d 11 356 4958 +7f6e 4 353 4958 +7f72 7 361 4958 +7f79 11 362 4958 +7f8a 1 365 4958 +FUNC 7f8b 21 4 wait_a_bit +7f8b 1 18 5557 +7f8c b 19 5557 +7f97 6 20 5557 +7f9d 8 21 5557 +7fa5 3 22 5557 +7fa8 3 23 5557 +7fab 1 24 5557 +FUNC 7fac 10 4 _set_malloc_crt_max_wait +7fac 0 32 5557 +7fac f 34 5557 +7fbb 1 36 5557 +FUNC 7fbc 40 4 _malloc_crt +7fbc 2 39 5557 +7fbe 2 40 5557 +7fc0 b 44 5557 +7fcb d 45 5557 +7fd8 18 46 5557 +7ff0 7 47 5557 +7ff7 4 50 5557 +7ffb 1 51 5557 +FUNC 7ffc 48 8 _calloc_crt +7ffc 2 54 5557 +7ffe 2 55 5557 +8000 14 61 5557 +8014 c 62 5557 +8020 18 63 5557 +8038 7 64 5557 +803f 4 67 5557 +8043 1 68 5557 +FUNC 8044 4b 8 _realloc_crt +8044 2 71 5557 +8046 2 72 5557 +8048 f 76 5557 +8057 14 77 5557 +806b 18 78 5557 +8083 7 79 5557 +808a 4 82 5557 +808e 1 83 5557 +FUNC 808f 50 c _recalloc_crt +808f 2 86 5557 +8091 2 87 5557 +8093 16 91 5557 +80a9 12 92 5557 +80bb 18 94 5557 +80d3 7 95 5557 +80da 4 100 5557 +80de 1 101 5557 +FUNC 80df 8 0 _malloc_crt_fastcall +80df 0 105 5557 +80df 7 106 5557 +80e6 1 107 5557 +FUNC 80e7 a 0 _calloc_crt_fastcall +80e7 0 110 5557 +80e7 9 111 5557 +80f0 1 112 5557 +FUNC 80f1 a 0 _realloc_crt_fastcall +80f1 0 115 5557 +80f1 9 116 5557 +80fa 1 117 5557 +FUNC 80fb 8e 4 free +80fb c 42 5515 +8107 7 47 5515 +810e 9 53 5515 +8117 8 57 5515 +811f 4 58 5515 +8123 e 60 5515 +8131 9 61 5515 +813a c 64 5515 +8146 6 68 5515 +814c 3 70 5515 +814f 2 106 5515 +8151 9 65 5515 +815a f 109 5515 +8169 4 110 5515 +816d 16 112 5515 +8183 6 115 5515 +FUNC 8189 9f 0 _fcloseall +8189 c 43 1792 +8195 5 44 1792 +819a 8 47 1792 +81a2 3 48 1792 +81a5 e 50 1792 +81b3 10 52 1792 +81c3 14 57 1792 +81d7 3 58 1792 +81da 5 63 1792 +81df 12 65 1792 +81f1 e 66 1792 +81ff 8 67 1792 +8207 3 50 1792 +820a c 73 1792 +8216 3 77 1792 +8219 6 78 1792 +821f 9 74 1792 +FUNC 8228 19 4 std::bad_exception::bad_exception(char const *) +8228 13 351 6035 +823b 6 352 6035 +FUNC 8241 b 0 std::bad_exception::~bad_exception() +8241 6 355 6035 +8247 5 356 6035 +FUNC 824c 22 0 std::bad_exception::`vector deleting destructor'(unsigned int) +FUNC 826e 5c c __TypeMatch +826e 2 999 6034 +8270 13 1001 6034 +8283 1b 1008 6034 +829e 4 1009 6034 +82a2 22 1023 6034 +82c4 5 1002 6034 +82c9 1 1024 6034 +FUNC 82ca 44 4 __FrameUnwindFilter +82ca 0 1035 6034 +82ca 6 1038 6034 +82d0 e 1040 6034 +82de 13 1076 6034 +82f1 e 1068 6034 +82ff c 1070 6034 +830b 2 1072 6034 +830d 1 1078 6034 +FUNC 830e e1 10 __FrameUnwindToState +830e c 1105 6034 +831a 1b 1112 6034 +8335 c 1114 6034 +8341 4 1115 6034 +8345 5 1119 6034 +834a f 1123 6034 +8359 f 1126 6034 +8368 7 1128 6034 +836f 6 1131 6034 +8375 3 1138 6034 +8378 12 1145 6034 +838a 6 1149 6034 +8390 d 1151 6034 +839d d 1153 6034 +83aa 3 1155 6034 +83ad 2 1156 6034 +83af c 1157 6034 +83bb a 1169 6034 +83c5 3 1176 6034 +83c8 6 1180 6034 +83ce 6 1157 6034 +83d4 e 1158 6034 +83e2 d 1159 6034 +FUNC 83ef 45 0 ExFilterRethrow +83ef 0 1533 6034 +83ef 2 1535 6034 +83f1 2f 1538 6034 +8420 e 1542 6034 +842e 2 1543 6034 +8430 1 1547 6034 +8431 2 1545 6034 +8433 1 1547 6034 +FUNC 8434 54 8 __DestructExceptionObject +8434 c 1791 6034 +8440 f 1794 6034 +844f e 1801 6034 +845d 4 1803 6034 +8461 9 1810 6034 +846a 7 1814 6034 +8471 6 1824 6034 +8477 c 1815 6034 +8483 5 1819 6034 +FUNC 8488 25 8 __AdjustPointer +8488 0 1842 6034 +8488 d 1843 6034 +8495 6 1845 6034 +849b 3 1850 6034 +849e e 1852 6034 +84ac 1 1856 6034 +FUNC 84ad 13 0 __uncaught_exception() +84ad 0 1867 6034 +84ad 12 1868 6034 +84bf 1 1869 6034 +FUNC 84c0 b3 8 __CxxRegisterExceptionObject +84c0 0 2077 6034 +84c0 14 2085 6034 +84d4 26 2087 6034 +84fa 6 2088 6034 +8500 b 2090 6034 +850b b 2093 6034 +8516 e 2094 6034 +8524 e 2095 6034 +8532 b 2096 6034 +853d 2 2097 6034 +853f 4 2098 6034 +8543 4 2099 6034 +8547 c 2101 6034 +8553 10 2102 6034 +8563 c 2103 6034 +856f 3 2104 6034 +8572 1 2105 6034 +FUNC 8573 4c 4 __CxxDetectRethrow +8573 0 2117 6034 +8573 6 2119 6034 +8579 2 2120 6034 +857b 2 2121 6034 +857d 2f 2122 6034 +85ac c 2123 6034 +85b8 3 2124 6034 +85bb 1 2127 6034 +85bc 2 2126 6034 +85be 1 2127 6034 +FUNC 85bf 139 8 __CxxUnregisterExceptionObject +85bf 1 2139 6034 +85c0 4 2143 6034 +85c4 d 2145 6034 +85d1 6 2146 6034 +85d7 85 2149 6034 +865c 14 2150 6034 +8670 5b 2152 6034 +86cb c 2153 6034 +86d7 e 2154 6034 +86e5 12 2155 6034 +86f7 1 2157 6034 +FUNC 86f8 4 0 __CxxQueryExceptionSize +86f8 0 2167 6034 +86f8 3 2168 6034 +86fb 1 2169 6034 +FUNC 86fc 32 8 __CxxCallUnwindDtor +86fc c 2189 6034 +8708 4 2190 6034 +870c 6 2192 6034 +8712 2 2193 6034 +8714 d 2194 6034 +8721 7 2197 6034 +8728 6 2198 6034 +FUNC 872e 33 8 __CxxCallUnwindDelDtor +872e c 2218 6034 +873a 4 2219 6034 +873e 7 2221 6034 +8745 2 2222 6034 +8747 d 2223 6034 +8754 7 2226 6034 +875b 6 2227 6034 +FUNC 8761 32 8 __CxxCallUnwindStdDelDtor +8761 c 2247 6034 +876d 4 2248 6034 +8771 6 2250 6034 +8777 2 2251 6034 +8779 d 2252 6034 +8786 7 2255 6034 +878d 6 2256 6034 +FUNC 8793 3b 14 __CxxCallUnwindVecDtor +8793 c 2282 6034 +879f 4 2283 6034 +87a3 f 2285 6034 +87b2 2 2286 6034 +87b4 d 2287 6034 +87c1 7 2290 6034 +87c8 6 2291 6034 +FUNC 87ce 79 4 IsInExceptionSpec +87ce 6 2302 6034 +87d4 9 2303 6034 +87dd 5 2307 6034 +87e2 f 2323 6034 +87f1 9 2326 6034 +87fa 2 2327 6034 +87fc 10 2328 6034 +880c 26 2335 6034 +8832 4 2337 6034 +8836 c 2323 6034 +8842 3 2343 6034 +8845 2 2344 6034 +FUNC 8847 49 4 CallUnexpected +8847 c 2379 6034 +8853 13 2380 6034 +8866 4 2383 6034 +886a 5 2384 6034 +886f 4 2391 6034 +8873 5 2392 6034 +8878 8 2388 6034 +8880 10 2390 6034 +FUNC 8890 30 0 Is_bad_exception_allowed +8890 2 2399 6034 +8892 8 2400 6034 +889a 1d 2402 6034 +88b7 4 2408 6034 +88bb 1 2409 6034 +88bc 4 2404 6034 +FUNC 88c0 82 8 _is_exception_typeof(type_info const &,_EXCEPTION_POINTERS *) +88c0 1 2416 6034 +88c1 e 2417 6034 +88cf 2 2419 6034 +88d1 9 2422 6034 +88da 2b 2423 6034 +8905 6 2432 6034 +890b 7 2433 6034 +8912 2 2445 6034 +8914 20 2446 6034 +8934 4 2439 6034 +8938 4 2454 6034 +893c 6 2455 6034 +FUNC 8942 19c 18 CallCatchBlock +8942 14 1431 6034 +8956 3 1437 6034 +8959 4 1439 6034 +895d 6 1443 6034 +8963 11 1447 6034 +8974 e 1451 6034 +8982 e 1452 6034 +8990 b 1454 6034 +899b e 1455 6034 +89a9 a 1457 6034 +89b3 3 1458 6034 +89b6 16 1463 6034 +89cc 12 1464 6034 +89de c 1465 6034 +89ea 3 1470 6034 +89ed 15 1471 6034 +8a02 3 1472 6034 +8a05 c 1474 6034 +8a11 11 1476 6034 +8a22 7 1478 6034 +8a29 d 1482 6034 +8a36 b 1486 6034 +8a41 13 1488 6034 +8a54 3 1517 6034 +8a57 6 1518 6034 +8a5d 5 1474 6034 +8a62 6 1488 6034 +8a68 6 1494 6034 +8a6e 9 1497 6034 +8a77 e 1500 6034 +8a85 e 1501 6034 +8a93 3f 1510 6034 +8ad2 c 1511 6034 +FUNC 8ade 17f 10 __BuildCatchObjectHelper +8ade c 1575 6034 +8aea 5 1576 6034 +8aef 2a 1582 6034 +8b19 2 1588 6034 +8b1b 3 1590 6034 +8b1e 2 1588 6034 +8b20 2 1592 6034 +8b22 4 1611 6034 +8b26 3 1614 6034 +8b29 4 1622 6034 +8b2d 4 1615 6034 +8b31 26 1622 6034 +8b57 5 1623 6034 +8b5c 11 1625 6034 +8b6d 5 1628 6034 +8b72 3 1629 6034 +8b75 6 1636 6034 +8b7b 4 1629 6034 +8b7f 20 1636 6034 +8b9f 12 1637 6034 +8bb1 10 1639 6034 +8bc1 4 1641 6034 +8bc5 2 1646 6034 +8bc7 5 1649 6034 +8bcc 18 1654 6034 +8be4 1e 1656 6034 +8c02 2 1660 6034 +8c04 25 1668 6034 +8c29 d 1672 6034 +8c36 2 1677 6034 +8c38 5 1678 6034 +8c3d 7 1681 6034 +8c44 5 1688 6034 +8c49 7 1682 6034 +8c50 5 1684 6034 +8c55 2 1584 6034 +8c57 6 1689 6034 +FUNC 8c5d 91 10 __BuildCatchObject +8c5d c 1712 6034 +8c69 b 1716 6034 +8c74 3 1718 6034 +8c77 2 1720 6034 +8c79 a 1739 6034 +8c83 4 1743 6034 +8c87 1a 1744 6034 +8ca1 1a 1756 6034 +8cbb 2 1757 6034 +8cbd 18 1750 6034 +8cd5 7 1762 6034 +8cdc 6 1769 6034 +8ce2 7 1763 6034 +8ce9 5 1765 6034 +FUNC 8cee 143 10 __CxxExceptionFilter +8cee 3 1973 6034 +8cf1 a 1985 6034 +8cfb 3 2065 6034 +8cfe 2a 1993 6034 +8d28 32 2008 6034 +8d5a 6 2010 6034 +8d60 c 2011 6034 +8d6c 6 2012 6034 +8d72 b 2013 6034 +8d7d f 2040 6034 +8d8c a 2041 6034 +8d96 2 2047 6034 +8d98 1b 2050 6034 +8db3 4 2042 6034 +8db7 2 2050 6034 +8db9 c 2052 6034 +8dc5 6 2053 6034 +8dcb 13 2054 6034 +8dde 2 2055 6034 +8de0 25 1995 6034 +8e05 6 1997 6034 +8e0b e 1999 6034 +8e19 4 2000 6034 +8e1d c 2004 6034 +8e29 6 2005 6034 +8e2f 2 2065 6034 +FUNC 8e31 6c 20 CatchIt +8e31 3 1217 6034 +8e34 6 1233 6034 +8e3a 10 1234 6034 +8e4a 4 1253 6034 +8e4e 6 1254 6034 +8e54 2 1255 6034 +8e56 8 1256 6034 +8e5e e 1259 6034 +8e6c 3 1265 6034 +8e6f 21 1273 6034 +8e90 4 1278 6034 +8e94 7 1280 6034 +8e9b 2 1286 6034 +FUNC 8e9d f2 20 FindHandlerForForeignException +8e9d 6 913 6034 +8ea3 10 920 6034 +8eb3 2a 926 6034 +8edd 23 934 6034 +8f00 e 940 6034 +8f0e 17 945 6034 +8f25 c 948 6034 +8f31 29 954 6034 +8f5a 33 974 6034 +8f8d 2 984 6034 +FUNC 8f8f 356 20 FindHandler +8f8f 6 569 6034 +8f95 20 632 6034 +8fb5 11 634 6034 +8fc6 42 637 6034 +9008 12 639 6034 +901a e 645 6034 +9028 b 646 6034 +9033 16 652 6034 +9049 2a 653 6034 +9073 12 659 6034 +9085 b 661 6034 +9090 5 662 6034 +9095 15 666 6034 +90aa 23 676 6034 +90cd 5 692 6034 +90d2 c 686 6034 +90de 30 688 6034 +910e 2b 698 6034 +9139 d 707 6034 +9146 19 715 6034 +915f c 718 6034 +916b 10 729 6034 +917b 6 735 6034 +9181 3 736 6034 +9184 7 737 6034 +918b 9 740 6034 +9194 2 741 6034 +9196 7 742 6034 +919d 23 750 6034 +91c0 d 737 6034 +91cd 2 676 6034 +91cf 33 774 6034 +9202 3 718 6034 +9205 6 795 6034 +920b a 804 6034 +9215 27 812 6034 +923c f 814 6034 +924b 5 840 6034 +9250 5 841 6034 +9255 b 843 6034 +9260 5 844 6034 +9265 d 846 6034 +9272 6 847 6034 +9278 2 848 6034 +927a 8 849 6034 +9282 14 851 6034 +9296 b 853 6034 +92a1 6 863 6034 +92a7 a 864 6034 +92b1 1c 866 6034 +92cd 16 877 6034 +92e3 2 880 6034 +FUNC 92e5 18 4 std::bad_exception::bad_exception(std::bad_exception const &) +FUNC 92fd e4 20 __InternalCxxFrameHandler +92fd 6 412 6034 +9303 3d 426 6034 +9340 6 432 6034 +9346 6 435 6034 +934c 10 440 6034 +935c 11 479 6034 +936d 2 482 6034 +936f 18 489 6034 +9387 19 499 6034 +93a0 1d 513 6034 +93bd 1c 524 6034 +93d9 6 533 6034 +93df 2 535 6034 +FUNC 93e1 6c 0 _use_encode_pointer +93e1 7 66 2227 +93e8 2 72 2227 +93ea 12 75 2227 +93fc 7 76 2227 +9403 5 78 2227 +9408 7 82 2227 +940f 5 85 2227 +9414 e 91 2227 +9422 1f 93 2227 +9441 4 95 2227 +9445 6 100 2227 +944b 2 101 2227 +FUNC 944d 6e 4 _encode_pointer +944d 1 120 2227 +944e 2b 129 2227 +9479 8 145 2227 +9481 d 133 2227 +948e d 135 2227 +949b c 138 2227 +94a7 4 148 2227 +94ab a 150 2227 +94b5 5 153 2227 +94ba 1 154 2227 +FUNC 94bb 9 0 _encoded_null +94bb 0 173 2227 +94bb 8 174 2227 +94c3 1 175 2227 +FUNC 94c4 6e 4 _decode_pointer +94c4 1 194 2227 +94c5 2b 203 2227 +94f0 8 219 2227 +94f8 d 207 2227 +9505 d 209 2227 +9512 c 212 2227 +951e 4 222 2227 +9522 a 224 2227 +952c 5 227 2227 +9531 1 228 2227 +FUNC 9532 9 4 __crtTlsAlloc +9532 0 240 2227 +9532 6 241 2227 +9538 3 242 2227 +FUNC 953b 15 4 __fls_getvalue +953b 0 258 2227 +953b 12 259 2227 +954d 3 260 2227 +FUNC 9550 6 0 __get_flsindex +9550 0 272 2227 +9550 5 273 2227 +9555 1 274 2227 +FUNC 9556 32 0 __set_flsgetvalue +9556 1 286 2227 +9557 e 288 2227 +9565 4 289 2227 +9569 e 291 2227 +9577 d 292 2227 +9584 3 294 2227 +9587 1 298 2227 +FUNC 9588 19 8 __fls_setvalue +9588 0 315 2227 +9588 16 316 2227 +959e 3 317 2227 +FUNC 95a1 3d 0 _mtterm +95a1 0 473 2227 +95a1 a 480 2227 +95ab f 481 2227 +95ba 7 482 2227 +95c1 a 485 2227 +95cb 7 486 2227 +95d2 7 487 2227 +95d9 5 494 2227 +FUNC 95de bf 8 _initptd +95de c 521 2227 +95ea e 522 2227 +95f8 a 524 2227 +9602 6 525 2227 +9608 4 527 2227 +960c 9 529 2227 +9615 16 532 2227 +962b 10 533 2227 +963b 3 540 2227 +963e 7 544 2227 +9645 7 545 2227 +964c 8 546 2227 +9654 7 547 2227 +965b 8 551 2227 +9663 4 552 2227 +9667 6 553 2227 +966d 4 561 2227 +9671 8 562 2227 +9679 9 563 2227 +9682 c 565 2227 +968e 6 568 2227 +9694 9 566 2227 +FUNC 969d 77 0 _getptd_noexit +969d 2 588 2227 +969f 6 592 2227 +96a5 15 600 2227 +96ba 14 608 2227 +96ce 19 610 2227 +96e7 a 616 2227 +96f1 6 618 2227 +96f7 6 619 2227 +96fd 2 621 2227 +96ff 7 627 2227 +9706 2 628 2227 +9708 8 633 2227 +9710 3 635 2227 +9713 1 636 2227 +FUNC 9714 18 0 _getptd +9714 1 657 2227 +9715 7 658 2227 +971c 4 659 2227 +9720 8 660 2227 +9728 3 662 2227 +972b 1 663 2227 +FUNC 972c 121 4 _freefls +972c c 691 2227 +9738 b 702 2227 +9743 7 703 2227 +974a 7 704 2227 +9751 7 706 2227 +9758 7 707 2227 +975f 7 709 2227 +9766 7 710 2227 +976d 7 712 2227 +9774 7 713 2227 +977b 7 715 2227 +9782 7 716 2227 +9789 7 718 2227 +9790 7 719 2227 +9797 a 721 2227 +97a1 7 722 2227 +97a8 8 724 2227 +97b0 4 725 2227 +97b4 1a 728 2227 +97ce 7 729 2227 +97d5 c 731 2227 +97e1 8 735 2227 +97e9 7 737 2227 +97f0 7 738 2227 +97f7 7 740 2227 +97fe 15 743 2227 +9813 7 744 2227 +981a c 747 2227 +9826 7 751 2227 +982d 8 754 2227 +9835 3 731 2227 +9838 9 732 2227 +9841 3 747 2227 +9844 9 748 2227 +FUNC 984d 69 4 _freeptd +984d 0 778 2227 +984d a 783 2227 +9857 1b 795 2227 +9872 13 796 2227 +9885 16 802 2227 +989b 7 804 2227 +98a2 a 807 2227 +98ac 9 811 2227 +98b5 1 813 2227 +FUNC 98b6 6 0 __threadid +98b6 0 837 2227 +98b6 6 838 2227 +FUNC 98bc 6 0 __threadhandle +98bc 0 844 2227 +98bc 6 845 2227 +FUNC 98c2 184 0 _mtinit +98c2 1 346 2227 +98c3 d 355 2227 +98d0 4 356 2227 +98d4 5 357 2227 +98d9 3 358 2227 +98dc 2 444 2227 +98de e 362 2227 +98ec d 365 2227 +98f9 d 368 2227 +9906 d 371 2227 +9913 2a 372 2227 +993d a 375 2227 +9947 1a 379 2227 +9961 25 388 2227 +9986 5 393 2227 +998b b 400 2227 +9996 10 401 2227 +99a6 10 402 2227 +99b6 18 403 2227 +99ce 7 410 2227 +99d5 2 412 2227 +99d7 1b 418 2227 +99f2 2 420 2227 +99f4 2d 428 2227 +9a21 a 438 2227 +9a2b 6 440 2227 +9a31 6 441 2227 +9a37 5 443 2227 +9a3c 5 430 2227 +9a41 4 389 2227 +9a45 1 444 2227 +FUNC 9a46 39 0 terminate() +9a46 c 94 5983 +9a52 8 107 5983 +9a5a 4 111 5983 +9a5e 4 116 5983 +9a62 2 120 5983 +9a64 2 121 5983 +9a66 7 122 5983 +9a6d 7 127 5983 +9a74 5 135 5983 +9a79 6 136 5983 +FUNC 9a7f 13 0 unexpected() +9a7f 0 149 5983 +9a7f 8 159 5983 +9a87 4 163 5983 +9a8b 2 167 5983 +9a8d 5 173 5983 +FUNC 9a92 37 0 _inconsistency() +9a92 c 187 5983 +9a9e c 196 5983 +9aaa 4 197 5983 +9aae 4 202 5983 +9ab2 2 203 5983 +9ab4 2 204 5983 +9ab6 7 205 5983 +9abd 7 211 5983 +9ac4 5 217 5983 +FUNC 9ac9 11 4 _initp_eh_hooks +9ac9 0 74 5983 +9ac9 10 80 5983 +9ad9 1 81 5983 +FUNC 9ae0 4c c _CallSettingFrame +9ae0 3 48 5665 +9ae3 3 57 5665 +9ae6 1 58 5665 +9ae7 1 59 5665 +9ae8 3 60 5665 +9aeb 3 61 5665 +9aee 3 62 5665 +9af1 3 63 5665 +9af4 1 64 5665 +9af5 3 65 5665 +9af8 3 66 5665 +9afb 3 67 5665 +9afe 5 68 5665 +9b03 1 69 5665 +9b04 1 70 5665 +9b05 2 71 5665 +9b07 1 73 5665 +9b08 1 74 5665 +9b09 2 75 5665 +9b0b 1 76 5665 +9b0c 3 77 5665 +9b0f 1 78 5665 +9b10 2 79 5665 +9b12 6 80 5665 +9b18 2 81 5665 +9b1a 5 82 5665 +9b1f 1 84 5665 +9b20 5 85 5665 +9b25 1 86 5665 +9b26 1 87 5665 +9b27 1 88 5665 +9b28 4 89 5665 +PUBLIC 9b07 0 _NLG_Return +FUNC 9b2c b9 4 _onexit_nolock +9b2c 5 104 3259 +9b31 b 107 3259 +9b3c 13 108 3259 +9b4f 16 112 3259 +9b65 d 122 3259 +9b72 d 127 3259 +9b7f 14 129 3259 +9b93 3 134 3259 +9b96 14 136 3259 +9baa 3 147 3259 +9bad f 149 3259 +9bbc e 156 3259 +9bca c 157 3259 +9bd6 7 159 3259 +9bdd 6 114 3259 +9be3 2 160 3259 +FUNC 9be5 2f 0 __onexitinit +9be5 1 205 3259 +9be6 b 208 3259 +9bf1 9 209 3259 +9bfa e 211 3259 +9c08 4 216 3259 +9c0c 1 221 3259 +9c0d 3 218 3259 +9c10 3 220 3259 +9c13 1 221 3259 +FUNC 9c14 3c 4 _onexit +9c14 c 85 3259 +9c20 5 88 3259 +9c25 4 90 3259 +9c29 c 91 3259 +9c35 c 93 3259 +9c41 3 97 3259 +9c44 6 98 3259 +9c4a 6 94 3259 +FUNC 9c50 12 4 atexit +9c50 0 165 3259 +9c50 11 166 3259 +9c61 1 167 3259 +FUNC 9c62 4f 4 V6_HeapAlloc +9c62 c 27 5425 +9c6e 4 28 5425 +9c72 b 29 5425 +9c7d 8 31 5425 +9c85 4 32 5425 +9c89 a 33 5425 +9c93 c 35 5425 +9c9f 3 39 5425 +9ca2 6 40 5425 +9ca8 9 36 5425 +FUNC 9cb1 75 4 _heap_alloc +9cb1 0 90 5425 +9cb1 9 95 5425 +9cba 5 96 5425 +9cbf 7 97 5425 +9cc6 c 98 5425 +9cd2 a 104 5425 +9cdc 18 105 5425 +9cf4 1 129 5425 +9cf5 a 107 5425 +9cff 9 108 5425 +9d08 2 109 5425 +9d0a 4 121 5425 +9d0e 1 122 5425 +9d0f 6 124 5425 +9d15 10 126 5425 +9d25 1 129 5425 +FUNC 9d26 c3 4 malloc +9d26 1 155 5425 +9d27 16 159 5425 +9d3d 65 163 5425 +9da2 4 168 5425 +9da6 b 172 5425 +9db1 b 179 5425 +9dbc 2 183 5425 +9dbe 7 174 5425 +9dc5 8 193 5425 +9dcd 5 195 5425 +9dd2 1 196 5425 +9dd3 7 185 5425 +9dda b 186 5425 +9de5 3 187 5425 +9de8 1 196 5425 +FUNC 9de9 a 4 _initp_heap_handler +9de9 0 31 5230 +9de9 9 32 5230 +9df2 1 33 5230 +FUNC 9df3 31 4 _set_new_handler(int (*)(unsigned int)) +9df3 1 53 5230 +9df4 7 57 5230 +9dfb b 59 5230 +9e06 b 60 5230 +9e11 f 63 5230 +9e20 3 65 5230 +9e23 1 66 5230 +FUNC 9e24 9 4 _set_new_handler(int) +9e24 0 86 5230 +9e24 8 89 5230 +9e2c 1 90 5230 +FUNC 9e2d d 0 _query_new_handler() +9e2d 0 110 5230 +9e2d c 111 5230 +9e39 1 112 5230 +FUNC 9e3a 22 4 _callnewh +9e3a 0 131 5230 +9e3a b 133 5230 +9e45 10 135 5230 +9e55 3 138 5230 +9e58 1 139 5230 +9e59 2 136 5230 +9e5b 1 139 5230 +FUNC 9e5c 22 18 _invoke_watson_if_error +9e5c 3 754 5850 +9e5f 6 755 5850 +9e65 17 759 5850 +9e7c 2 760 5850 +FUNC 9e7e 70 4 type_info::_Type_info_dtor(type_info *) +9e7e c 62 5815 +9e8a 8 63 5815 +9e92 4 64 5815 +9e96 a 65 5815 +9ea0 d 70 5815 +9ead 4 72 5815 +9eb1 4 74 5815 +9eb5 6 79 5815 +9ebb 7 80 5815 +9ec2 9 94 5815 +9ecb 4 101 5815 +9ecf c 103 5815 +9edb 6 107 5815 +9ee1 2 83 5815 +9ee3 2 72 5815 +9ee5 9 104 5815 +FUNC 9eee f5 8 type_info::_Name_base(type_info const *,__type_info_node *) +9eee c 109 5815 +9efa e 113 5815 +9f08 24 124 5815 +9f2c 7 125 5815 +9f33 16 132 5815 +9f49 2 133 5815 +9f4b 5 132 5815 +9f50 b 136 5815 +9f5b 5 142 5815 +9f60 a 149 5815 +9f6a 4 150 5815 +9f6e 11 157 5815 +9f7f 20 158 5815 +9f9f 5 159 5815 +9fa4 9 165 5815 +9fad 3 166 5815 +9fb0 2 167 5815 +9fb2 7 173 5815 +9fb9 9 180 5815 +9fc2 c 181 5815 +9fce 3 188 5815 +9fd1 6 189 5815 +9fd7 3 181 5815 +9fda 9 182 5815 +FUNC 9fe3 70 4 type_info::_Type_info_dtor_internal(type_info *) +9fe3 c 197 5815 +9fef 8 198 5815 +9ff7 4 199 5815 +9ffb a 200 5815 +a005 d 205 5815 +a012 4 207 5815 +a016 4 209 5815 +a01a 6 214 5815 +a020 7 215 5815 +a027 9 229 5815 +a030 4 236 5815 +a034 c 238 5815 +a040 6 242 5815 +a046 2 218 5815 +a048 2 207 5815 +a04a 9 239 5815 +FUNC a053 31 10 __unDNameHelper +a053 3 249 5815 +a056 7 250 5815 +a05d 7 252 5815 +a064 1e 260 5815 +a082 2 261 5815 +FUNC a084 eb 8 type_info::_Name_base_internal(type_info const *,__type_info_node *) +a084 c 265 5815 +a090 e 269 5815 +a09e 1a 273 5815 +a0b8 7 274 5815 +a0bf 16 281 5815 +a0d5 2 282 5815 +a0d7 5 281 5815 +a0dc b 285 5815 +a0e7 5 291 5815 +a0ec a 298 5815 +a0f6 4 299 5815 +a0fa 11 306 5815 +a10b 20 307 5815 +a12b 5 308 5815 +a130 9 314 5815 +a139 3 315 5815 +a13c 2 316 5815 +a13e 7 322 5815 +a145 9 329 5815 +a14e c 330 5815 +a15a 3 337 5815 +a15d 6 338 5815 +a163 3 330 5815 +a166 9 331 5815 +FUNC a16f 53 4 __clean_type_info_names_internal +a16f c 346 5815 +a17b 8 347 5815 +a183 4 348 5815 +a187 6 352 5815 +a18d 4 354 5815 +a191 3 356 5815 +a194 7 357 5815 +a19b 8 358 5815 +a1a3 4 354 5815 +a1a7 c 359 5815 +a1b3 6 363 5815 +a1b9 9 361 5815 +FUNC a1d0 88 8 strcmp +a1d0 0 65 926 +a1d0 4 73 926 +a1d4 4 74 926 +a1d8 6 76 926 +a1de 2 77 926 +a1e0 2 81 926 +a1e2 2 83 926 +a1e4 2 84 926 +a1e6 2 85 926 +a1e8 2 86 926 +a1ea 3 87 926 +a1ed 2 88 926 +a1ef 2 89 926 +a1f1 2 90 926 +a1f3 3 92 926 +a1f6 3 94 926 +a1f9 2 95 926 +a1fb 2 96 926 +a1fd 2 97 926 +a1ff 3 98 926 +a202 2 99 926 +a204 3 100 926 +a207 3 101 926 +a20a 2 102 926 +a20c 4 103 926 +a210 2 107 926 +a212 2 108 926 +a214 2 115 926 +a216 2 116 926 +a218 3 117 926 +a21b 1 118 926 +a21c 6 122 926 +a222 2 123 926 +a224 2 125 926 +a226 3 126 926 +a229 2 127 926 +a22b 2 128 926 +a22d 3 129 926 +a230 2 130 926 +a232 2 131 926 +a234 6 133 926 +a23a 2 134 926 +a23c 3 139 926 +a23f 3 140 926 +a242 2 141 926 +a244 2 142 926 +a246 2 143 926 +a248 2 144 926 +a24a 3 145 926 +a24d 2 146 926 +a24f 2 147 926 +a251 2 148 926 +a253 3 149 926 +a256 2 150 926 +FUNC a258 65 c strcpy_s +a258 0 13 781 +a258 30 18 781 +a288 c 19 781 +a294 2 21 781 +a296 d 23 781 +a2a3 4 27 781 +a2a7 2 29 781 +a2a9 e 30 781 +a2b7 5 33 781 +a2bc 1 34 781 +FUNC a2c0 7a c memset +a2c0 0 59 934 +a2c0 4 68 934 +a2c4 4 69 934 +a2c8 2 71 934 +a2ca 2 72 934 +a2cc 2 74 934 +a2ce 4 75 934 +a2d2 2 78 934 +a2d4 2 79 934 +a2d6 6 80 934 +a2dc 2 81 934 +a2de 7 82 934 +a2e5 2 83 934 +a2e7 5 85 934 +a2ec 1 91 934 +a2ed 2 92 934 +a2ef 3 94 934 +a2f2 2 95 934 +a2f4 2 97 934 +a2f6 3 98 934 +a2f9 2 99 934 +a2fb 2 101 934 +a2fd 2 103 934 +a2ff 3 104 934 +a302 3 105 934 +a305 2 106 934 +a307 2 110 934 +a309 3 111 934 +a30c 2 113 934 +a30e 2 115 934 +a310 3 117 934 +a313 2 119 934 +a315 2 122 934 +a317 3 123 934 +a31a 3 124 934 +a31d 2 125 934 +a31f 2 127 934 +a321 2 129 934 +a323 2 130 934 +a325 2 134 934 +a327 3 135 934 +a32a 3 137 934 +a32d 2 138 934 +a32f 4 142 934 +a333 1 143 934 +a334 1 145 934 +a335 4 148 934 +a339 1 150 934 +FUNC a340 365 c memcpy +a340 3 101 1027 +a343 1 113 1027 +a344 1 114 1027 +a345 3 116 1027 +a348 3 117 1027 +a34b 3 119 1027 +a34e 2 129 1027 +a350 2 131 1027 +a352 2 132 1027 +a354 2 134 1027 +a356 2 135 1027 +a358 2 137 1027 +a35a 6 138 1027 +a360 6 147 1027 +a366 2 148 1027 +a368 7 150 1027 +a36f 2 151 1027 +a371 1 153 1027 +a372 1 154 1027 +a373 3 155 1027 +a376 3 156 1027 +a379 2 157 1027 +a37b 1 158 1027 +a37c 1 159 1027 +a37d 2 160 1027 +a37f 1 163 1027 +a380 1 164 1027 +a381 1 165 1027 +a382 5 166 1027 +a387 6 179 1027 +a38d 2 180 1027 +a38f 3 182 1027 +a392 3 183 1027 +a395 3 185 1027 +a398 2 186 1027 +a39a 2 188 1027 +a39c 8 190 1027 +a3a4 2 208 1027 +a3a6 5 209 1027 +a3ab 3 211 1027 +a3ae 2 212 1027 +a3b0 3 214 1027 +a3b3 2 215 1027 +a3b5 7 217 1027 +a3bc 8 221 1027 +a3c4 14 225 1027 +a3d8 2 232 1027 +a3da 2 233 1027 +a3dc 2 235 1027 +a3de 3 236 1027 +a3e1 3 238 1027 +a3e4 3 239 1027 +a3e7 3 241 1027 +a3ea 3 242 1027 +a3ed 3 244 1027 +a3f0 3 245 1027 +a3f3 3 247 1027 +a3f6 2 248 1027 +a3f8 2 250 1027 +a3fa a 252 1027 +a404 2 256 1027 +a406 2 257 1027 +a408 2 259 1027 +a40a 3 260 1027 +a40d 3 262 1027 +a410 3 263 1027 +a413 3 265 1027 +a416 3 266 1027 +a419 3 268 1027 +a41c 2 269 1027 +a41e 2 271 1027 +a420 8 273 1027 +a428 2 277 1027 +a42a 2 278 1027 +a42c 2 280 1027 +a42e 3 281 1027 +a431 3 283 1027 +a434 3 284 1027 +a437 3 286 1027 +a43a 2 287 1027 +a43c 2 289 1027 +a43e 2a 291 1027 +a468 4 298 1027 +a46c 4 300 1027 +a470 4 302 1027 +a474 4 304 1027 +a478 4 306 1027 +a47c 4 308 1027 +a480 4 310 1027 +a484 4 312 1027 +a488 4 314 1027 +a48c 4 316 1027 +a490 4 318 1027 +a494 4 320 1027 +a498 4 322 1027 +a49c 4 324 1027 +a4a0 7 326 1027 +a4a7 2 328 1027 +a4a9 2 329 1027 +a4ab 19 331 1027 +a4c4 3 340 1027 +a4c7 1 341 1027 +a4c8 1 342 1027 +a4c9 3 344 1027 +a4cc 2 348 1027 +a4ce 2 350 1027 +a4d0 3 351 1027 +a4d3 1 352 1027 +a4d4 1 353 1027 +a4d5 3 354 1027 +a4d8 2 358 1027 +a4da 2 360 1027 +a4dc 3 361 1027 +a4df 3 362 1027 +a4e2 3 363 1027 +a4e5 1 364 1027 +a4e6 1 365 1027 +a4e7 5 366 1027 +a4ec 2 370 1027 +a4ee 2 372 1027 +a4f0 3 373 1027 +a4f3 3 374 1027 +a4f6 3 375 1027 +a4f9 3 376 1027 +a4fc 3 377 1027 +a4ff 1 378 1027 +a500 1 379 1027 +a501 3 380 1027 +a504 4 391 1027 +a508 4 392 1027 +a50c 6 397 1027 +a512 2 398 1027 +a514 3 400 1027 +a517 3 401 1027 +a51a 3 403 1027 +a51d 2 404 1027 +a51f 1 406 1027 +a520 2 407 1027 +a522 1 408 1027 +a523 9 410 1027 +a52c 2 414 1027 +a52e a 417 1027 +a538 2 422 1027 +a53a 5 423 1027 +a53f 3 425 1027 +a542 2 426 1027 +a544 3 428 1027 +a547 2 429 1027 +a549 7 431 1027 +a550 14 435 1027 +a564 3 442 1027 +a567 2 443 1027 +a569 3 445 1027 +a56c 3 446 1027 +a56f 3 448 1027 +a572 3 449 1027 +a575 3 451 1027 +a578 2 452 1027 +a57a 1 454 1027 +a57b 2 455 1027 +a57d 1 456 1027 +a57e a 458 1027 +a588 3 462 1027 +a58b 2 463 1027 +a58d 3 465 1027 +a590 3 466 1027 +a593 3 468 1027 +a596 3 469 1027 +a599 3 471 1027 +a59c 3 472 1027 +a59f 3 474 1027 +a5a2 2 475 1027 +a5a4 1 477 1027 +a5a5 2 478 1027 +a5a7 1 479 1027 +a5a8 8 481 1027 +a5b0 3 485 1027 +a5b3 2 486 1027 +a5b5 3 488 1027 +a5b8 3 489 1027 +a5bb 3 491 1027 +a5be 3 492 1027 +a5c1 3 494 1027 +a5c4 3 495 1027 +a5c7 3 497 1027 +a5ca 3 498 1027 +a5cd 3 500 1027 +a5d0 6 501 1027 +a5d6 1 503 1027 +a5d7 2 504 1027 +a5d9 1 505 1027 +a5da 2a 507 1027 +a604 4 516 1027 +a608 4 518 1027 +a60c 4 520 1027 +a610 4 522 1027 +a614 4 524 1027 +a618 4 526 1027 +a61c 4 528 1027 +a620 4 530 1027 +a624 4 532 1027 +a628 4 534 1027 +a62c 4 536 1027 +a630 4 538 1027 +a634 4 540 1027 +a638 4 542 1027 +a63c 7 544 1027 +a643 2 546 1027 +a645 2 547 1027 +a647 19 549 1027 +a660 3 558 1027 +a663 1 560 1027 +a664 1 561 1027 +a665 3 562 1027 +a668 3 566 1027 +a66b 3 568 1027 +a66e 3 569 1027 +a671 1 570 1027 +a672 1 571 1027 +a673 5 572 1027 +a678 3 576 1027 +a67b 3 578 1027 +a67e 3 579 1027 +a681 3 580 1027 +a684 3 581 1027 +a687 1 582 1027 +a688 1 583 1027 +a689 3 584 1027 +a68c 3 588 1027 +a68f 3 590 1027 +a692 3 591 1027 +a695 3 592 1027 +a698 3 593 1027 +a69b 3 594 1027 +a69e 3 595 1027 +a6a1 1 596 1027 +a6a2 1 597 1027 +a6a3 2 598 1027 +FUNC a6b0 365 c memmove +a6b0 3 101 977 +a6b3 1 113 977 +a6b4 1 114 977 +a6b5 3 116 977 +a6b8 3 117 977 +a6bb 3 119 977 +a6be 2 129 977 +a6c0 2 131 977 +a6c2 2 132 977 +a6c4 2 134 977 +a6c6 2 135 977 +a6c8 2 137 977 +a6ca 6 138 977 +a6d0 6 147 977 +a6d6 2 148 977 +a6d8 7 150 977 +a6df 2 151 977 +a6e1 1 153 977 +a6e2 1 154 977 +a6e3 3 155 977 +a6e6 3 156 977 +a6e9 2 157 977 +a6eb 1 158 977 +a6ec 1 159 977 +a6ed 2 160 977 +a6ef 1 163 977 +a6f0 1 164 977 +a6f1 1 165 977 +a6f2 5 166 977 +a6f7 6 179 977 +a6fd 2 180 977 +a6ff 3 182 977 +a702 3 183 977 +a705 3 185 977 +a708 2 186 977 +a70a 2 188 977 +a70c 8 190 977 +a714 2 208 977 +a716 5 209 977 +a71b 3 211 977 +a71e 2 212 977 +a720 3 214 977 +a723 2 215 977 +a725 7 217 977 +a72c 8 221 977 +a734 14 225 977 +a748 2 232 977 +a74a 2 233 977 +a74c 2 235 977 +a74e 3 236 977 +a751 3 238 977 +a754 3 239 977 +a757 3 241 977 +a75a 3 242 977 +a75d 3 244 977 +a760 3 245 977 +a763 3 247 977 +a766 2 248 977 +a768 2 250 977 +a76a a 252 977 +a774 2 256 977 +a776 2 257 977 +a778 2 259 977 +a77a 3 260 977 +a77d 3 262 977 +a780 3 263 977 +a783 3 265 977 +a786 3 266 977 +a789 3 268 977 +a78c 2 269 977 +a78e 2 271 977 +a790 8 273 977 +a798 2 277 977 +a79a 2 278 977 +a79c 2 280 977 +a79e 3 281 977 +a7a1 3 283 977 +a7a4 3 284 977 +a7a7 3 286 977 +a7aa 2 287 977 +a7ac 2 289 977 +a7ae 2a 291 977 +a7d8 4 298 977 +a7dc 4 300 977 +a7e0 4 302 977 +a7e4 4 304 977 +a7e8 4 306 977 +a7ec 4 308 977 +a7f0 4 310 977 +a7f4 4 312 977 +a7f8 4 314 977 +a7fc 4 316 977 +a800 4 318 977 +a804 4 320 977 +a808 4 322 977 +a80c 4 324 977 +a810 7 326 977 +a817 2 328 977 +a819 2 329 977 +a81b 19 331 977 +a834 3 340 977 +a837 1 341 977 +a838 1 342 977 +a839 3 344 977 +a83c 2 348 977 +a83e 2 350 977 +a840 3 351 977 +a843 1 352 977 +a844 1 353 977 +a845 3 354 977 +a848 2 358 977 +a84a 2 360 977 +a84c 3 361 977 +a84f 3 362 977 +a852 3 363 977 +a855 1 364 977 +a856 1 365 977 +a857 5 366 977 +a85c 2 370 977 +a85e 2 372 977 +a860 3 373 977 +a863 3 374 977 +a866 3 375 977 +a869 3 376 977 +a86c 3 377 977 +a86f 1 378 977 +a870 1 379 977 +a871 3 380 977 +a874 4 391 977 +a878 4 392 977 +a87c 6 397 977 +a882 2 398 977 +a884 3 400 977 +a887 3 401 977 +a88a 3 403 977 +a88d 2 404 977 +a88f 1 406 977 +a890 2 407 977 +a892 1 408 977 +a893 9 410 977 +a89c 2 414 977 +a89e a 417 977 +a8a8 2 422 977 +a8aa 5 423 977 +a8af 3 425 977 +a8b2 2 426 977 +a8b4 3 428 977 +a8b7 2 429 977 +a8b9 7 431 977 +a8c0 14 435 977 +a8d4 3 442 977 +a8d7 2 443 977 +a8d9 3 445 977 +a8dc 3 446 977 +a8df 3 448 977 +a8e2 3 449 977 +a8e5 3 451 977 +a8e8 2 452 977 +a8ea 1 454 977 +a8eb 2 455 977 +a8ed 1 456 977 +a8ee a 458 977 +a8f8 3 462 977 +a8fb 2 463 977 +a8fd 3 465 977 +a900 3 466 977 +a903 3 468 977 +a906 3 469 977 +a909 3 471 977 +a90c 3 472 977 +a90f 3 474 977 +a912 2 475 977 +a914 1 477 977 +a915 2 478 977 +a917 1 479 977 +a918 8 481 977 +a920 3 485 977 +a923 2 486 977 +a925 3 488 977 +a928 3 489 977 +a92b 3 491 977 +a92e 3 492 977 +a931 3 494 977 +a934 3 495 977 +a937 3 497 977 +a93a 3 498 977 +a93d 3 500 977 +a940 6 501 977 +a946 1 503 977 +a947 2 504 977 +a949 1 505 977 +a94a 2a 507 977 +a974 4 516 977 +a978 4 518 977 +a97c 4 520 977 +a980 4 522 977 +a984 4 524 977 +a988 4 526 977 +a98c 4 528 977 +a990 4 530 977 +a994 4 532 977 +a998 4 534 977 +a99c 4 536 977 +a9a0 4 538 977 +a9a4 4 540 977 +a9a8 4 542 977 +a9ac 7 544 977 +a9b3 2 546 977 +a9b5 2 547 977 +a9b7 19 549 977 +a9d0 3 558 977 +a9d3 1 560 977 +a9d4 1 561 977 +a9d5 3 562 977 +a9d8 3 566 977 +a9db 3 568 977 +a9de 3 569 977 +a9e1 1 570 977 +a9e2 1 571 977 +a9e3 5 572 977 +a9e8 3 576 977 +a9eb 3 578 977 +a9ee 3 579 977 +a9f1 3 580 977 +a9f4 3 581 977 +a9f7 1 582 977 +a9f8 1 583 977 +a9f9 3 584 977 +a9fc 3 588 977 +a9ff 3 590 977 +aa02 3 591 977 +aa05 3 592 977 +aa08 3 593 977 +aa0b 3 594 977 +aa0e 3 595 977 +aa11 1 596 977 +aa12 1 597 977 +aa13 2 598 977 +FUNC aa15 3d 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *) +aa15 0 67 5721 +aa15 33 68 5721 +aa48 5 69 5721 +aa4d 2 72 5721 +aa4f 3 73 5721 +FUNC aa52 e 0 __CxxSetUnhandledExceptionFilter +aa52 0 86 5721 +aa52 b 89 5721 +aa5d 2 90 5721 +aa5f 1 91 5721 +FUNC aa60 1a0 4 _NMSG_WRITE +aa60 2 174 2418 +aa62 a 178 2418 +aa6c f 179 2418 +aa7b a 182 2418 +aa85 2a 203 2418 +aaaf c 215 2418 +aabb 2a 224 2418 +aae5 1e 227 2418 +ab03 26 228 2418 +ab29 d 231 2418 +ab36 b 233 2418 +ab41 2f 234 2418 +ab70 20 237 2418 +ab90 22 238 2418 +abb2 15 242 2418 +abc7 a 205 2418 +abd1 9 206 2418 +abda 24 212 2418 +abfe 2 245 2418 +FUNC ac00 20 4 _GET_RTERRMSG +ac00 0 268 2418 +ac00 2 271 2418 +ac02 13 272 2418 +ac15 2 275 2418 +ac17 1 276 2418 +ac18 7 273 2418 +ac1f 1 276 2418 +FUNC ac20 39 0 _FF_MSGBANNER +ac20 0 141 2418 +ac20 22 145 2418 +ac42 a 147 2418 +ac4c c 148 2418 +ac58 1 150 2418 +FUNC ac59 1 4 _initp_misc_winxfltr +ac59 0 105 2752 +ac59 1 106 2752 +FUNC ac5a 32 4 xcptlookup +ac5a 0 410 2752 +ac5a b 411 2752 +ac65 14 418 2752 +ac79 e 425 2752 +ac87 2 428 2752 +ac89 2 426 2752 +ac8b 1 429 2752 +FUNC ac8c 15e 8 _XcptFilter +ac8c 6 206 2752 +ac92 7 213 2752 +ac99 8 214 2752 +aca1 34 219 2752 +acd5 2 221 2752 +acd7 2 225 2752 +acd9 3 227 2752 +acdc 7 234 2752 +ace3 7 235 2752 +acea 5 243 2752 +acef 4 248 2752 +acf3 8 249 2752 +acfb 3 255 2752 +acfe 6 259 2752 +ad04 6 273 2752 +ad0a 6 274 2752 +ad10 c 283 2752 +ad1c 17 291 2752 +ad33 1e 294 2752 +ad51 3 291 2752 +ad54 c 321 2752 +ad60 9 323 2752 +ad69 7 325 2752 +ad70 9 327 2752 +ad79 7 329 2752 +ad80 9 331 2752 +ad89 7 333 2752 +ad90 9 335 2752 +ad99 7 337 2752 +ada0 9 339 2752 +ada9 7 341 2752 +adb0 9 343 2752 +adb9 7 345 2752 +adc0 7 347 2752 +adc7 8 356 2752 +adcf 3 361 2752 +add2 2 363 2752 +add4 4 368 2752 +add8 3 369 2752 +addb 7 375 2752 +ade2 6 377 2752 +ade8 2 379 2752 +FUNC adea 1b 8 __CppXcptFilter +adea 0 145 2752 +adea b 146 2752 +adf5 c 147 2752 +ae01 1 151 2752 +ae02 2 149 2752 +ae04 1 151 2752 +FUNC ae05 db 0 _setenvp +ae05 1 77 2280 +ae06 c 85 2280 +ae12 5 86 2280 +ae17 8 91 2280 +ae1f 4 98 2280 +ae23 8 99 2280 +ae2b 4 110 2280 +ae2f 1 111 2280 +ae30 11 112 2280 +ae41 15 117 2280 +ae56 2 118 2280 +ae58 9 121 2280 +ae61 9 123 2280 +ae6a 6 125 2280 +ae70 10 127 2280 +ae80 1c 133 2280 +ae9c 3 134 2280 +ae9f 6 121 2280 +aea5 b 138 2280 +aeb0 6 139 2280 +aeb6 2 142 2280 +aeb8 a 149 2280 +aec2 7 152 2280 +aec9 17 153 2280 +FUNC aee0 a 4 _set_pgmptr +aee0 a 334 2303 +FUNC aeea 198 c parse_cmdline +aeea 4 218 2322 +aeee 6 226 2322 +aef4 8 230 2322 +aefc 14 231 2322 +af10 3 250 2322 +af13 5 252 2322 +af18 5 254 2322 +af1d 9 255 2322 +af26 2 256 2322 +af28 2 258 2322 +af2a 4 259 2322 +af2e 8 260 2322 +af36 2 262 2322 +af38 f 264 2322 +af47 2 265 2322 +af49 6 266 2322 +af4f a 267 2322 +af59 1 268 2322 +af5a 1a 272 2322 +af74 4 277 2322 +af78 4 278 2322 +af7c 4 281 2322 +af80 9 286 2322 +af89 a 287 2322 +af93 3 288 2322 +af96 1 275 2322 +af97 2 276 2322 +af99 9 291 2322 +afa2 6 295 2322 +afa8 9 296 2322 +afb1 2 297 2322 +afb3 3 311 2322 +afb6 4 315 2322 +afba 1 318 2322 +afbb 1 319 2322 +afbc 5 316 2322 +afc1 5 321 2322 +afc6 5 324 2322 +afcb e 325 2322 +afd9 2 326 2322 +afdb 2 327 2322 +afdd d 329 2322 +afea 2 332 2322 +afec 5 336 2322 +aff1 4 337 2322 +aff5 4 338 2322 +aff9 6 339 2322 +afff 3 338 2322 +b002 14 343 2322 +b016 4 348 2322 +b01a 2 349 2322 +b01c 10 350 2322 +b02c b 351 2322 +b037 2 352 2322 +b039 a 354 2322 +b043 2 355 2322 +b045 a 356 2322 +b04f 1 357 2322 +b050 2 358 2322 +b052 5 361 2322 +b057 1 363 2322 +b058 5 372 2322 +b05d 4 376 2322 +b061 7 377 2322 +b068 2 378 2322 +b06a 8 379 2322 +b072 9 382 2322 +b07b 3 383 2322 +b07e 2 384 2322 +b080 2 385 2322 +FUNC b082 b9 0 _setargv +b082 7 88 2322 +b089 c 97 2322 +b095 5 98 2322 +b09a 18 104 2322 +b0b2 19 120 2322 +b0cb 11 127 2322 +b0dc 15 132 2322 +b0f1 a 136 2322 +b0fb 2 138 2322 +b0fd 8 140 2322 +b105 3 141 2322 +b108 2 142 2322 +b10a 13 149 2322 +b11d c 153 2322 +b129 6 157 2322 +b12f 4 172 2322 +b133 6 134 2322 +b139 2 173 2322 +FUNC b13b 135 0 __crtGetEnvironmentStringsA +b13b 2 43 4307 +b13d 1a 57 4307 +b157 8 59 4307 +b15f c 60 4307 +b16b b 62 4307 +b176 e 63 4307 +b184 9 68 4307 +b18d 4 71 4307 +b191 8 72 4307 +b199 7 73 4307 +b1a0 7 77 4307 +b1a7 7 78 4307 +b1ae 7 79 4307 +b1b5 1b 93 4307 +b1d0 13 97 4307 +b1e3 11 111 4307 +b1f4 a 113 4307 +b1fe 8 114 4307 +b206 7 99 4307 +b20d 4 100 4307 +b211 6 123 4307 +b217 2 152 4307 +b219 a 126 4307 +b223 6 127 4307 +b229 4 133 4307 +b22d 5 134 4307 +b232 5 135 4307 +b237 5 138 4307 +b23c d 140 4307 +b249 7 141 4307 +b250 5 142 4307 +b255 b 145 4307 +b260 7 147 4307 +b267 6 149 4307 +b26d 3 153 4307 +FUNC b270 24 0 _RTC_Initialize +FUNC b294 24 0 _RTC_Terminate +FUNC b2b8 5b 0 __heap_select +b2b8 6 70 5473 +b2be 23 143 5473 +b2e1 1b 144 5473 +b2fc d 145 5473 +b309 3 146 5473 +b30c 2 164 5473 +b30e 3 161 5473 +b311 2 164 5473 +FUNC b313 5a 4 _heap_init +b313 0 192 5473 +b313 20 199 5473 +b333 2 200 5473 +b335 1 240 5473 +b336 5 204 5473 +b33b a 206 5473 +b345 f 209 5473 +b354 c 211 5473 +b360 7 212 5473 +b367 2 213 5473 +b369 3 239 5473 +b36c 1 240 5473 +FUNC b36d 74 0 _heap_term +b36d 1 261 5473 +b36e c 264 5473 +b37a 1b 270 5473 +b395 f 273 5473 +b3a4 b 276 5473 +b3af d 278 5473 +b3bc 11 281 5473 +b3cd c 300 5473 +b3d9 7 301 5473 +b3e0 1 302 5473 +FUNC b3e1 6 0 _get_heap_handle +b3e1 0 320 5473 +b3e1 5 322 5473 +b3e6 1 323 5473 +FUNC b3e7 94 0 __security_init_cookie +b3e7 6 97 3689 +b3ed 21 114 3689 +b40e 7 116 3689 +b415 3 117 3689 +b418 a 127 3689 +b422 6 132 3689 +b428 8 135 3689 +b430 8 136 3689 +b438 8 137 3689 +b440 10 139 3689 +b450 2 144 3689 +b452 4 161 3689 +b456 7 163 3689 +b45d 4 166 3689 +b461 7 168 3689 +b468 6 172 3689 +b46e b 173 3689 +b479 2 175 3689 +FUNC b47b 8 4 _crt_debugger_hook +b47b 0 62 3966 +b47b 7 65 3966 +b482 1 66 3966 +FUNC b483 160 8 _flsbuf +b483 5 93 2041 +b488 c 104 2041 +b494 8 106 2041 +b49c b 107 2041 +b4a7 4 108 2041 +b4ab 8 109 2041 +b4b3 4 110 2041 +b4b7 b 111 2041 +b4c2 3 113 2041 +b4c5 6 124 2041 +b4cb b 126 2041 +b4d6 3 127 2041 +b4d9 8 128 2041 +b4e1 9 137 2041 +b4ea f 141 2041 +b4f9 25 151 2041 +b51e 7 153 2041 +b525 d 158 2041 +b532 5 162 2041 +b537 5 163 2041 +b53c 6 164 2041 +b542 7 166 2041 +b549 10 167 2041 +b559 2 168 2041 +b55b 6 131 2041 +b561 5 132 2041 +b566 2e 169 2041 +b594 12 171 2041 +b5a6 2 174 2041 +b5a8 8 179 2041 +b5b0 2 186 2041 +b5b2 3 187 2041 +b5b5 13 189 2041 +b5c8 5 201 2041 +b5cd 4 202 2041 +b5d1 5 203 2041 +b5d6 b 207 2041 +b5e1 2 212 2041 +FUNC b5e3 25 4 write_char +b5e3 0 2433 1163 +b5e3 a 2434 1163 +b5ed 2 2437 1163 +b5ef 12 2440 1163 +b601 3 2444 1163 +b604 1 2447 1163 +b605 2 2446 1163 +b607 1 2447 1163 +FUNC b608 25 c write_multi_char +b608 6 2498 1163 +b60e 2 2501 1163 +b610 e 2500 1163 +b61e 6 2501 1163 +b624 7 2499 1163 +b62b 2 2504 1163 +FUNC b62d 4f 4 write_string +b62d 0 2563 1163 +b62d 12 2564 1163 +b63f 6 2566 1163 +b645 2 2567 1163 +b647 11 2570 1163 +b658 6 2571 1163 +b65e a 2573 1163 +b668 a 2574 1163 +b672 9 2569 1163 +b67b 1 2579 1163 +FUNC b67c 910 10 _woutput_l +b67c 1b 975 1163 +b697 72 1031 1163 +b709 4 1036 1163 +b70d 2c 1073 1163 +b739 1a 1075 1163 +b753 8 1076 1163 +b75b 18 1131 1163 +b773 2 1171 1163 +b775 13 1173 1163 +b788 3 1174 1163 +b78b 5 1175 1163 +b790 1f 1179 1163 +b7af 4 1193 1163 +b7b3 5 1194 1163 +b7b8 4 1181 1163 +b7bc 5 1182 1163 +b7c1 4 1184 1163 +b7c5 5 1185 1163 +b7ca 7 1190 1163 +b7d1 5 1191 1163 +b7d6 3 1187 1163 +b7d9 5 1196 1163 +b7de 6 1200 1163 +b7e4 9 1206 1163 +b7ed b 1233 1163 +b7f8 4 1235 1163 +b7fc 3 1236 1163 +b7ff 5 1239 1163 +b804 10 1241 1163 +b814 5 1243 1163 +b819 4 1248 1163 +b81d 5 1249 1163 +b822 6 1253 1163 +b828 9 1259 1163 +b831 b 1284 1163 +b83c 4 1285 1163 +b840 5 1287 1163 +b845 10 1289 1163 +b855 5 1291 1163 +b85a 1b 1295 1163 +b875 7 1362 1163 +b87c 5 1363 1163 +b881 6 1301 1163 +b887 2 1303 1163 +b889 a 1304 1163 +b893 5 1306 1163 +b898 4 1308 1163 +b89c 5 1310 1163 +b8a1 4 1358 1163 +b8a5 5 1359 1163 +b8aa 10 1322 1163 +b8ba 3 1324 1163 +b8bd f 1325 1163 +b8cc d 1327 1163 +b8d9 3 1329 1163 +b8dc a 1330 1163 +b8e6 5 1332 1163 +b8eb 3c 1337 1163 +b927 4 1352 1163 +b92b 13 1166 1163 +b93e 5 1167 1163 +b943 32 1378 1163 +b975 d 1716 1163 +b982 4 1724 1163 +b986 18 1749 1163 +b99e c 1750 1163 +b9aa c 1381 1163 +b9b6 9 1383 1163 +b9bf 8 1564 1163 +b9c7 4 1565 1163 +b9cb d 1584 1163 +b9d8 3 1589 1163 +b9db 13 1610 1163 +b9ee 4 1611 1163 +b9f2 8 1612 1163 +b9fa 19 1614 1163 +ba13 13 1618 1163 +ba26 1 1620 1163 +ba27 9 1621 1163 +ba30 5 1622 1163 +ba35 1d 1378 1163 +ba52 9 1397 1163 +ba5b f 1415 1163 +ba6a 3 1420 1163 +ba6d 25 1430 1163 +ba92 3 1434 1163 +ba95 2 1436 1163 +ba97 4 1437 1163 +ba9b 6 1439 1163 +baa1 3 1440 1163 +baa4 5 1506 1163 +baa9 5 1523 1163 +baae e 1541 1163 +babc 6 1546 1163 +bac2 b 1548 1163 +bacd 7 1549 1163 +bad4 5 1550 1163 +bad9 4 1551 1163 +badd 5 1553 1163 +bae2 8 1543 1163 +baea 7 1544 1163 +baf1 5 1557 1163 +baf6 34 1378 1163 +bb2a d 1908 1163 +bb37 9 1910 1163 +bb40 8 1668 1163 +bb48 d 1688 1163 +bb55 6 1702 1163 +bb5b 7 1703 1163 +bb62 2 1704 1163 +bb64 5 1706 1163 +bb69 7 1708 1163 +bb70 5 1710 1163 +bb75 4 1864 1163 +bb79 7 1869 1163 +bb80 c 1933 1163 +bb8c 8 1939 1163 +bb94 5 1958 1163 +bb99 8 1751 1163 +bba1 9 1752 1163 +bbaa 5 1753 1163 +bbaf 3 1754 1163 +bbb2 9 1756 1163 +bbbb f 1759 1163 +bbca 2 1760 1163 +bbcc 13 1765 1163 +bbdf 7 1767 1163 +bbe6 e 1809 1163 +bbf4 27 1828 1163 +bc1b 14 1838 1163 +bc2f 15 1840 1163 +bc44 b 1844 1163 +bc4f 15 1846 1163 +bc64 5 1852 1163 +bc69 7 1853 1163 +bc70 4 1854 1163 +bc74 1 1857 1163 +bc75 5 1859 1163 +bc7a 7 1877 1163 +bc81 3 1887 1163 +bc84 2 1888 1163 +bc86 1a 1378 1163 +bca0 7 1892 1163 +bca7 11 1897 1163 +bcb8 10 1900 1163 +bcc8 3 1901 1163 +bccb 5 1903 1163 +bcd0 6 1961 1163 +bcd6 6 1987 1163 +bcdc 16 2026 1163 +bcf2 2 2045 1163 +bcf4 5 2051 1163 +bcf9 2 2071 1163 +bcfb 4 2074 1163 +bcff 6 2080 1163 +bd05 2 2099 1163 +bd07 5 2105 1163 +bd0c 10 2128 1163 +bd1c 7 2129 1163 +bd23 7 2130 1163 +bd2a c 2136 1163 +bd36 2 2142 1163 +bd38 6 2148 1163 +bd3e 7 2149 1163 +bd45 2 2150 1163 +bd47 4 2151 1163 +bd4b a 2152 1163 +bd55 3 2153 1163 +bd58 6 2157 1163 +bd5e 3 2158 1163 +bd61 6 2163 1163 +bd67 10 2165 1163 +bd77 10 2166 1163 +bd87 c 2168 1163 +bd93 3 2170 1163 +bd96 3 2172 1163 +bd99 2 2173 1163 +bd9b 8 2175 1163 +bda3 1 2176 1163 +bda4 19 2180 1163 +bdbd 9 2181 1163 +bdc6 1 2182 1163 +bdc7 2 2185 1163 +bdc9 4 1625 1163 +bdcd 8 1626 1163 +bdd5 c 1628 1163 +bde1 7 1629 1163 +bde8 2 1630 1163 +bdea 4 1629 1163 +bdee 8 1631 1163 +bdf6 a 2201 1163 +be00 7 2204 1163 +be07 6 2205 1163 +be0d 6 2207 1163 +be13 2 2208 1163 +be15 4 2210 1163 +be19 6 2212 1163 +be1f 2 2213 1163 +be21 4 2215 1163 +be25 6 2217 1163 +be2b 7 2218 1163 +be32 b 2224 1163 +be3d 6 2228 1163 +be43 11 2230 1163 +be54 11 2234 1163 +be65 d 2236 1163 +be72 f 2238 1163 +be81 a 2263 1163 +be8b 3 2267 1163 +be8e 3 2268 1163 +be91 3 2269 1163 +be94 1a 2276 1163 +beae 7 2278 1163 +beb5 e 2282 1163 +bec3 a 2283 1163 +becd 2 1690 1163 +becf 4 2279 1163 +bed3 2 2285 1163 +bed5 d 2286 1163 +bee2 c 2290 1163 +beee 11 2292 1163 +beff 6 2297 1163 +bf05 8 2298 1163 +bf0d 4 2299 1163 +bf11 1 2298 1163 +bf12 1b 1073 1163 +bf2d 17 1690 1163 +bf44 10 2376 1163 +bf54 38 2377 1163 +FUNC bf8c 97 10 _vswprintf_l +bf8c 7 125 1425 +bf93 24 130 1425 +bfb7 8 135 1425 +bfbf 29 155 1425 +bfe8 1d 166 1425 +c005 18 167 1425 +c01d 4 169 1425 +c021 2 183 1425 +FUNC c023 17 c _vswprintf +c023 0 192 1425 +c023 16 195 1425 +c039 1 197 1425 +FUNC c03a 5 10 __vswprintf_l +c03a 0 205 1425 +c03a 5 208 1425 +FUNC c03f 55 10 _vscwprintf_helper +c03f 7 430 1425 +c046 24 435 1425 +c06a 28 441 1425 +c092 2 443 1425 +FUNC c094 18 8 _vscwprintf +c094 0 449 1425 +c094 17 450 1425 +c0ab 1 451 1425 +FUNC c0ac 1a c _vscwprintf_l +c0ac 0 458 1425 +c0ac 19 459 1425 +c0c5 1 460 1425 +FUNC c0c6 18 8 _vscwprintf_p +c0c6 0 466 1425 +c0c6 17 467 1425 +c0dd 1 468 1425 +FUNC c0de 1a c _vscwprintf_p_l +c0de 0 475 1425 +c0de 19 476 1425 +c0f7 1 477 1425 +FUNC c0f8 14e 14 vfprintf_helper +c0f8 c 51 1462 +c104 5 54 1462 +c109 2e 56 1462 +c137 c 57 1462 +c143 3 60 1462 +c146 7 62 1462 +c14d 3 63 1462 +c150 b0 65 1462 +c200 5 66 1462 +c205 8 68 1462 +c20d 10 69 1462 +c21d a 70 1462 +c227 c 74 1462 +c233 3 78 1462 +c236 6 79 1462 +c23c a 75 1462 +FUNC c246 1e 10 _vfprintf_l +c246 0 87 1462 +c246 1d 88 1462 +c263 1 89 1462 +FUNC c264 1e 10 _vfprintf_s_l +c264 0 97 1462 +c264 1d 98 1462 +c281 1 99 1462 +FUNC c282 1e 10 _vfprintf_p_l +c282 0 107 1462 +c282 1d 108 1462 +c29f 1 109 1462 +FUNC c2a0 1c c vfprintf +c2a0 0 116 1462 +c2a0 1b 117 1462 +c2bb 1 118 1462 +FUNC c2bc 1c c vfprintf_s +c2bc 0 125 1462 +c2bc 1b 126 1462 +c2d7 1 127 1462 +FUNC c2d8 1c c _vfprintf_p +c2d8 0 134 1462 +c2d8 1b 135 1462 +c2f3 1 136 1462 +FUNC c2f4 25 4 write_char +c2f4 0 2433 1053 +c2f4 a 2434 1053 +c2fe 2 2437 1053 +c300 12 2440 1053 +c312 3 2444 1053 +c315 1 2447 1053 +c316 2 2446 1053 +c318 1 2447 1053 +FUNC c319 25 c write_multi_char +c319 6 2498 1053 +c31f 2 2501 1053 +c321 e 2500 1053 +c32f 6 2501 1053 +c335 7 2499 1053 +c33c 2 2504 1053 +FUNC c33e 4f 4 write_string +c33e 0 2563 1053 +c33e 12 2564 1053 +c350 6 2566 1053 +c356 2 2567 1053 +c358 11 2570 1053 +c369 6 2571 1053 +c36f a 2573 1053 +c379 a 2574 1053 +c383 9 2569 1053 +c38c 1 2579 1053 +FUNC c38d 91c 10 _woutput_s_l +c38d 29 975 1053 +c3b6 3 976 1053 +c3b9 f 1007 1053 +c3c8 24 2172 1053 +c3ec 2f 1031 1053 +c41b 18 1036 1053 +c433 2e 1073 1053 +c461 16 1078 1053 +c477 e 1079 1053 +c485 11 1124 1053 +c496 10 1131 1053 +c4a6 2 1171 1053 +c4a8 13 1173 1053 +c4bb 3 1174 1053 +c4be 5 1175 1053 +c4c3 1e 1179 1053 +c4e1 3 1193 1053 +c4e4 5 1194 1053 +c4e9 4 1181 1053 +c4ed 5 1182 1053 +c4f2 4 1184 1053 +c4f6 5 1185 1053 +c4fb 7 1190 1053 +c502 5 1191 1053 +c507 3 1187 1053 +c50a 5 1196 1053 +c50f 6 1200 1053 +c515 5 1206 1053 +c51a e 1233 1053 +c528 4 1235 1053 +c52c 3 1236 1053 +c52f 5 1239 1053 +c534 10 1241 1053 +c544 5 1243 1053 +c549 4 1248 1053 +c54d 5 1249 1053 +c552 6 1253 1053 +c558 5 1259 1053 +c55d e 1284 1053 +c56b 4 1285 1053 +c56f 5 1287 1053 +c574 10 1289 1053 +c584 5 1291 1053 +c589 1b 1295 1053 +c5a4 7 1362 1053 +c5ab 5 1363 1053 +c5b0 6 1301 1053 +c5b6 2 1303 1053 +c5b8 7 1304 1053 +c5bf 5 1306 1053 +c5c4 4 1308 1053 +c5c8 5 1310 1053 +c5cd 4 1358 1053 +c5d1 5 1359 1053 +c5d6 10 1322 1053 +c5e6 3 1324 1053 +c5e9 c 1325 1053 +c5f5 d 1327 1053 +c602 3 1329 1053 +c605 7 1330 1053 +c60c 5 1332 1053 +c611 3c 1337 1053 +c64d 4 1352 1053 +c651 14 1166 1053 +c665 5 1167 1053 +c66a 32 1378 1053 +c69c d 1716 1053 +c6a9 4 1724 1053 +c6ad 18 1749 1053 +c6c5 c 1750 1053 +c6d1 c 1381 1053 +c6dd 9 1383 1053 +c6e6 8 1564 1053 +c6ee 4 1565 1053 +c6f2 d 1584 1053 +c6ff 3 1589 1053 +c702 13 1610 1053 +c715 4 1611 1053 +c719 8 1612 1053 +c721 19 1614 1053 +c73a 13 1618 1053 +c74d 1 1620 1053 +c74e 9 1621 1053 +c757 5 1622 1053 +c75c 1e 1378 1053 +c77a 9 1397 1053 +c783 f 1415 1053 +c792 3 1420 1053 +c795 25 1430 1053 +c7ba 3 1434 1053 +c7bd 2 1436 1053 +c7bf 4 1437 1053 +c7c3 6 1439 1053 +c7c9 3 1440 1053 +c7cc 5 1506 1053 +c7d1 5 1523 1053 +c7d6 e 1541 1053 +c7e4 6 1546 1053 +c7ea b 1548 1053 +c7f5 7 1549 1053 +c7fc 5 1550 1053 +c801 4 1551 1053 +c805 5 1553 1053 +c80a 8 1543 1053 +c812 7 1544 1053 +c819 5 1557 1053 +c81e 34 1378 1053 +c852 9 1908 1053 +c85b 9 1910 1053 +c864 8 1668 1053 +c86c d 1688 1053 +c879 6 1702 1053 +c87f 7 1703 1053 +c886 2 1704 1053 +c888 5 1706 1053 +c88d 7 1708 1053 +c894 5 1710 1053 +c899 4 1864 1053 +c89d 7 1869 1053 +c8a4 c 1933 1053 +c8b0 8 1939 1053 +c8b8 5 1958 1053 +c8bd 8 1751 1053 +c8c5 9 1752 1053 +c8ce 5 1753 1053 +c8d3 3 1754 1053 +c8d6 9 1756 1053 +c8df f 1759 1053 +c8ee 3 1760 1053 +c8f1 15 1765 1053 +c906 7 1767 1053 +c90d e 1809 1053 +c91b 27 1828 1053 +c942 14 1838 1053 +c956 15 1840 1053 +c96b b 1844 1053 +c976 15 1846 1053 +c98b 5 1852 1053 +c990 7 1853 1053 +c997 4 1854 1053 +c99b 1 1857 1053 +c99c 5 1859 1053 +c9a1 3 1877 1053 +c9a4 7 1887 1053 +c9ab 2 1888 1053 +c9ad 1a 1378 1053 +c9c7 7 1892 1053 +c9ce 11 1897 1053 +c9df 10 1900 1053 +c9ef 3 1901 1053 +c9f2 5 1903 1053 +c9f7 6 1961 1053 +c9fd 6 1987 1053 +ca03 16 2026 1053 +ca19 2 2045 1053 +ca1b 5 2051 1053 +ca20 2 2071 1053 +ca22 4 2074 1053 +ca26 6 2080 1053 +ca2c 2 2099 1053 +ca2e 5 2105 1053 +ca33 10 2128 1053 +ca43 7 2129 1053 +ca4a 7 2130 1053 +ca51 c 2136 1053 +ca5d 2 2142 1053 +ca5f 6 2148 1053 +ca65 7 2149 1053 +ca6c 2 2150 1053 +ca6e 4 2151 1053 +ca72 a 2152 1053 +ca7c 3 2153 1053 +ca7f 6 2157 1053 +ca85 3 2158 1053 +ca88 6 2163 1053 +ca8e 10 2165 1053 +ca9e 10 2166 1053 +caae c 2168 1053 +caba 3 2170 1053 +cabd 3 2172 1053 +cac0 2 2173 1053 +cac2 8 2175 1053 +caca 1 2176 1053 +cacb 19 2180 1053 +cae4 9 2181 1053 +caed 1 2182 1053 +caee 2 2185 1053 +caf0 4 1625 1053 +caf4 8 1626 1053 +cafc c 1628 1053 +cb08 7 1629 1053 +cb0f 2 1630 1053 +cb11 4 1629 1053 +cb15 8 1631 1053 +cb1d a 2201 1053 +cb27 7 2204 1053 +cb2e 6 2205 1053 +cb34 6 2207 1053 +cb3a 2 2208 1053 +cb3c 4 2210 1053 +cb40 6 2212 1053 +cb46 2 2213 1053 +cb48 4 2215 1053 +cb4c 6 2217 1053 +cb52 7 2218 1053 +cb59 b 2224 1053 +cb64 6 2228 1053 +cb6a 11 2230 1053 +cb7b 11 2234 1053 +cb8c d 2236 1053 +cb99 f 2238 1053 +cba8 a 2263 1053 +cbb2 3 2267 1053 +cbb5 3 2268 1053 +cbb8 3 2269 1053 +cbbb 1a 2276 1053 +cbd5 7 2278 1053 +cbdc e 2282 1053 +cbea a 2283 1053 +cbf4 2 1690 1053 +cbf6 4 2279 1053 +cbfa 2 2285 1053 +cbfc d 2286 1053 +cc09 c 2290 1053 +cc15 11 2292 1053 +cc26 6 2297 1053 +cc2c 8 2298 1053 +cc34 16 2299 1053 +cc4a 7 1073 1053 +cc51 10 2310 1053 +cc61 10 2376 1053 +cc71 38 2377 1053 +FUNC cca9 154 10 _validate_param_reuseW +cca9 3 606 1108 +ccac 21 610 1108 +cccd 13 617 1108 +cce0 13 618 1108 +ccf3 10 620 1108 +cd03 4a 629 1108 +cd4d 54 632 1108 +cda1 2 633 1108 +cda3 1a 639 1108 +cdbd f 645 1108 +cdcc 23 626 1108 +cdef c 614 1108 +cdfb 2 646 1108 +FUNC cdfd 25 4 write_char +cdfd 0 2433 1108 +cdfd a 2434 1108 +ce07 2 2437 1108 +ce09 12 2440 1108 +ce1b 3 2444 1108 +ce1e 1 2447 1108 +ce1f 2 2446 1108 +ce21 1 2447 1108 +FUNC ce22 25 c write_multi_char +ce22 6 2498 1108 +ce28 2 2501 1108 +ce2a e 2500 1108 +ce38 6 2501 1108 +ce3e 7 2499 1108 +ce45 2 2504 1108 +FUNC ce47 4f 4 write_string +ce47 0 2563 1108 +ce47 12 2564 1108 +ce59 6 2566 1108 +ce5f 2 2567 1108 +ce61 11 2570 1108 +ce72 6 2571 1108 +ce78 a 2573 1108 +ce82 a 2574 1108 +ce8c 9 2569 1108 +ce95 1 2579 1108 +FUNC ce96 f60 10 _woutput_p_l +ce96 1b 975 1108 +ceb1 20 1013 1108 +ced1 28 2172 1108 +cef9 2c 1031 1108 +cf25 4 1036 1108 +cf29 3 1038 1108 +cf2c 3 1041 1108 +cf2f 3 1043 1108 +cf32 f 1046 1108 +cf41 44 1073 1108 +cf85 1a 1078 1108 +cf9f 11 1079 1108 +cfb0 16 1082 1108 +cfc6 6 1084 1108 +cfcc 1c 1087 1108 +cfe8 6 1089 1108 +cfee 16 1091 1108 +d004 7 1093 1108 +d00b 2 1095 1108 +d00d 7 1097 1108 +d014 6 1101 1108 +d01a c 1103 1108 +d026 7 1104 1108 +d02d f 1106 1108 +d03c 1d 1109 1108 +d059 8 1112 1108 +d061 5 1131 1108 +d066 3 1117 1108 +d069 7 1131 1108 +d070 9 1120 1108 +d079 b 1131 1108 +d084 24 1137 1108 +d0a8 5 1145 1108 +d0ad 2 1171 1108 +d0af 16 1173 1108 +d0c5 3 1174 1108 +d0c8 5 1175 1108 +d0cd 1f 1179 1108 +d0ec 7 1193 1108 +d0f3 5 1194 1108 +d0f8 7 1181 1108 +d0ff 5 1182 1108 +d104 7 1184 1108 +d10b 5 1185 1108 +d110 a 1190 1108 +d11a 5 1191 1108 +d11f 6 1187 1108 +d125 5 1196 1108 +d12a a 1200 1108 +d134 6 1203 1108 +d13a a 1206 1108 +d144 2 1209 1108 +d146 c 1211 1108 +d152 6 1212 1108 +d158 e 1214 1108 +d166 1c 1216 1108 +d182 8 1219 1108 +d18a 12 1221 1108 +d19c a 1274 1108 +d1a6 5 1275 1108 +d1ab c 1228 1108 +d1b7 b 1233 1108 +d1c2 7 1235 1108 +d1c9 3 1236 1108 +d1cc 5 1239 1108 +d1d1 10 1241 1108 +d1e1 5 1243 1108 +d1e6 4 1248 1108 +d1ea 5 1249 1108 +d1ef 6 1253 1108 +d1f5 6 1256 1108 +d1fb a 1259 1108 +d205 2 1262 1108 +d207 c 1264 1108 +d213 6 1265 1108 +d219 12 1267 1108 +d22b c 1280 1108 +d237 b 1284 1108 +d242 4 1285 1108 +d246 5 1287 1108 +d24b 22 1274 1108 +d26d 10 1289 1108 +d27d 5 1291 1108 +d282 1b 1295 1108 +d29d a 1362 1108 +d2a7 5 1363 1108 +d2ac 6 1301 1108 +d2b2 2 1303 1108 +d2b4 d 1304 1108 +d2c1 5 1306 1108 +d2c6 7 1308 1108 +d2cd 5 1310 1108 +d2d2 7 1358 1108 +d2d9 5 1359 1108 +d2de 10 1322 1108 +d2ee 3 1324 1108 +d2f1 12 1325 1108 +d303 d 1327 1108 +d310 3 1329 1108 +d313 d 1330 1108 +d320 5 1332 1108 +d325 24 1337 1108 +d349 4 1352 1108 +d34d 13 1166 1108 +d360 5 1167 1108 +d365 a 1342 1108 +d36f 5 1366 1108 +d374 36 1378 1108 +d3aa d 1716 1108 +d3b7 7 1724 1108 +d3be 14 1726 1108 +d3d2 9 1728 1108 +d3db 2a 1739 1108 +d405 b 1381 1108 +d410 9 1383 1108 +d419 b 1564 1108 +d424 7 1565 1108 +d42b d 1584 1108 +d438 b 1586 1108 +d443 a 1589 1108 +d44d 5 1592 1108 +d452 22 1378 1108 +d474 d 1394 1108 +d481 b 1397 1108 +d48c 2 1400 1108 +d48e 9 1402 1108 +d497 6 1404 1108 +d49d 24 1406 1108 +d4c1 5 1407 1108 +d4c6 d 1411 1108 +d4d3 c 1415 1108 +d4df 3 1420 1108 +d4e2 28 1430 1108 +d50a 7 1434 1108 +d511 2 1436 1108 +d513 7 1437 1108 +d51a 9 1439 1108 +d523 7 1440 1108 +d52a 5 1506 1108 +d52f 6 1520 1108 +d535 a 1523 1108 +d53f 2 1526 1108 +d541 9 1528 1108 +d54a 4 1530 1108 +d54e 6 1533 1108 +d554 c 1537 1108 +d560 b 1541 1108 +d56b 9 1546 1108 +d574 b 1548 1108 +d57f 7 1549 1108 +d586 5 1550 1108 +d58b 4 1551 1108 +d58f 5 1553 1108 +d594 8 1543 1108 +d59c 7 1544 1108 +d5a3 5 1557 1108 +d5a8 38 1378 1108 +d5e0 15 1908 1108 +d5f5 11 1910 1108 +d606 6 1665 1108 +d60c a 1668 1108 +d616 2 1671 1108 +d618 9 1673 1108 +d621 6 1675 1108 +d627 1f 1677 1108 +d646 5 1678 1108 +d64b c 1682 1108 +d657 d 1688 1108 +d664 9 1702 1108 +d66d 7 1703 1108 +d674 2 1704 1108 +d676 5 1706 1108 +d67b 7 1708 1108 +d682 5 1710 1108 +d687 7 1864 1108 +d68e 7 1869 1108 +d695 6 1910 1108 +d69b 9 1933 1108 +d6a4 a 1936 1108 +d6ae f 1939 1108 +d6bd 5 1942 1108 +d6c2 1a 1739 1108 +d6dc 21 1109 1108 +d6fd 17 1749 1108 +d714 9 1750 1108 +d71d 8 1751 1108 +d725 9 1752 1108 +d72e 5 1753 1108 +d733 3 1754 1108 +d736 a 1756 1108 +d740 f 1759 1108 +d74f 2 1760 1108 +d751 13 1765 1108 +d764 3 1767 1108 +d767 7 1806 1108 +d76e 9 1809 1108 +d777 2 1812 1108 +d779 a 1818 1108 +d783 6 1821 1108 +d789 16 1822 1108 +d79f 24 1828 1108 +d7c3 16 1838 1108 +d7d9 15 1840 1108 +d7ee b 1844 1108 +d7f9 15 1846 1108 +d80e 5 1852 1108 +d813 a 1853 1108 +d81d 4 1854 1108 +d821 1 1857 1108 +d822 5 1859 1108 +d827 7 1877 1108 +d82e 7 1887 1108 +d835 2 1888 1108 +d837 1a 1378 1108 +d851 7 1892 1108 +d858 14 1897 1108 +d86c 10 1900 1108 +d87c 3 1901 1108 +d87f 5 1903 1108 +d884 9 1944 1108 +d88d 28 1948 1108 +d8b5 5 1949 1108 +d8ba 7 1961 1108 +d8c1 4 1964 1108 +d8c5 6 1970 1108 +d8cb 9 1972 1108 +d8d4 28 1976 1108 +d8fc 5 1977 1108 +d901 c 1981 1108 +d90d 5 1987 1108 +d912 5 2019 1108 +d917 5 2020 1108 +d91c 6 2023 1108 +d922 b 2026 1108 +d92d 5 2029 1108 +d932 9 2031 1108 +d93b 4 2033 1108 +d93f 2 2036 1108 +d941 d 2040 1108 +d94e 5 2045 1108 +d953 6 2048 1108 +d959 b 2051 1108 +d964 5 2054 1108 +d969 9 2056 1108 +d972 4 2058 1108 +d976 2 2061 1108 +d978 d 2065 1108 +d985 2 2071 1108 +d987 5 2074 1108 +d98c 6 2077 1108 +d992 a 2080 1108 +d99c 2 2083 1108 +d99e 9 2085 1108 +d9a7 6 2087 1108 +d9ad 17 2089 1108 +d9c4 15 2114 1108 +d9d9 5 2115 1108 +d9de d 2094 1108 +d9eb 2 2099 1108 +d9ed 6 2102 1108 +d9f3 a 2105 1108 +d9fd 2 2108 1108 +d9ff 9 2110 1108 +da08 6 2112 1108 +da0e e 2119 1108 +da1c f 2128 1108 +da2b 7 2129 1108 +da32 c 2130 1108 +da3e c 2136 1108 +da4a 4 2142 1108 +da4e 6 2148 1108 +da54 7 2149 1108 +da5b 2 2150 1108 +da5d 1a 2114 1108 +da77 3 2151 1108 +da7a 10 2152 1108 +da8a 3 2153 1108 +da8d 7 2157 1108 +da94 3 2158 1108 +da97 6 2163 1108 +da9d 11 2165 1108 +daae 12 2166 1108 +dac0 d 2168 1108 +dacd 3 2170 1108 +dad0 b 2173 1108 +dadb 8 2175 1108 +dae3 1 2176 1108 +dae4 20 2180 1108 +db04 9 2181 1108 +db0d 1 2182 1108 +db0e 5 2185 1108 +db13 9 1594 1108 +db1c 9 1596 1108 +db25 c 1603 1108 +db31 c 1610 1108 +db3d 4 1611 1108 +db41 8 1612 1108 +db49 11 1614 1108 +db5a 13 1618 1108 +db6d 1 1620 1108 +db6e 9 1621 1108 +db77 2 1622 1108 +db79 19 1598 1108 +db92 5 1625 1108 +db97 8 1626 1108 +db9f c 1628 1108 +dbab 6 1629 1108 +dbb1 2 1630 1108 +dbb3 4 1629 1108 +dbb7 8 1631 1108 +dbbf 10 2189 1108 +dbcf a 2201 1108 +dbd9 a 2204 1108 +dbe3 6 2205 1108 +dbe9 6 2207 1108 +dbef 2 2208 1108 +dbf1 4 2210 1108 +dbf5 6 2212 1108 +dbfb 2 2213 1108 +dbfd 4 2215 1108 +dc01 6 2217 1108 +dc07 7 2218 1108 +dc0e b 2224 1108 +dc19 9 2228 1108 +dc22 11 2230 1108 +dc33 11 2234 1108 +dc44 13 2236 1108 +dc57 f 2238 1108 +dc66 a 2263 1108 +dc70 3 2267 1108 +dc73 3 2268 1108 +dc76 3 2269 1108 +dc79 1a 2276 1108 +dc93 7 2278 1108 +dc9a e 2282 1108 +dca8 a 2283 1108 +dcb2 2 2310 1108 +dcb4 4 2279 1108 +dcb8 2 2285 1108 +dcba d 2286 1108 +dcc7 f 2290 1108 +dcd6 11 2292 1108 +dce7 6 2297 1108 +dced 8 2298 1108 +dcf5 4 2299 1108 +dcf9 1 2298 1108 +dcfa 12 1073 1108 +dd0c c 2310 1108 +dd18 c 2314 1108 +dd24 10 2319 1108 +dd34 16 2321 1108 +dd4a 2 2360 1108 +dd4c 9 2361 1108 +dd55 6 2362 1108 +dd5b 2 2344 1108 +dd5d 3 2345 1108 +dd60 2 2346 1108 +dd62 2 2324 1108 +dd64 6 2325 1108 +dd6a 9 2319 1108 +dd73 13 1043 1108 +dd86 17 1121 1108 +dd9d f 1818 1108 +ddac 10 2376 1108 +ddbc 3a 2377 1108 +FUNC ddf6 1f 0 _initp_misc_cfltcvt_tab +ddf6 2 54 4074 +ddf8 8 56 4074 +de00 14 58 4074 +de14 1 60 4074 +FUNC de20 29 4 _ValidateImageBase +de20 0 44 3159 +de20 b 50 3159 +de2b 2 52 3159 +de2d 1 68 3159 +de2e 5 55 3159 +de33 6 56 3159 +de39 2 58 3159 +de3b d 62 3159 +de48 1 68 3159 +FUNC de50 42 8 _FindPESection +de50 0 92 3159 +de50 9 99 3159 +de59 19 108 3159 +de72 10 111 3159 +de82 a 108 3159 +de8c 5 123 3159 +de91 1 124 3159 +FUNC dea0 bb 4 _IsNonwritableInCurrentImage +dea0 33 149 3159 +ded3 7 156 3159 +deda f 164 3159 +dee9 2 166 3159 +deeb 8 174 3159 +def3 e 175 3159 +df01 2 176 3159 +df03 2 178 3159 +df05 12 185 3159 +df17 12 195 3159 +df29 17 187 3159 +df40 9 193 3159 +df49 12 195 3159 +FUNC df5b 19 4 _initp_misc_winsig +df5b 0 57 2785 +df5b 9 58 2785 +df64 5 59 2785 +df69 5 60 2785 +df6e 5 61 2785 +df73 1 62 2785 +FUNC df74 9b 4 ctrlevent_capture +df74 c 89 2785 +df80 9 94 2785 +df89 3 95 2785 +df8c 5 102 2785 +df91 5 103 2785 +df96 e 104 2785 +dfa4 7 105 2785 +dfab 2 107 2785 +dfad 5 108 2785 +dfb2 e 109 2785 +dfc0 7 110 2785 +dfc7 1 109 2785 +dfc8 9 113 2785 +dfd1 7 117 2785 +dfd8 c 120 2785 +dfe4 5 124 2785 +dfe9 4 128 2785 +dfed 2 120 2785 +dfef 8 121 2785 +dff7 6 130 2785 +dffd 7 131 2785 +e004 3 138 2785 +e007 8 139 2785 +FUNC e00f 34 4 siglookup +e00f 0 634 2785 +e00f b 635 2785 +e01a 15 645 2785 +e02f f 649 2785 +e03e 2 653 2785 +e040 2 658 2785 +e042 1 659 2785 +FUNC e043 d 0 __get_sigabrt +e043 0 676 2785 +e043 c 677 2785 +e04f 1 678 2785 +FUNC e050 9 0 __fpecode +e050 0 699 2785 +e050 8 700 2785 +e058 1 701 2785 +FUNC e059 9 0 __pxcptinfoptrs +e059 0 721 2785 +e059 8 722 2785 +e061 1 723 2785 +FUNC e062 23d 8 signal +e062 c 219 2785 +e06e 4 224 2785 +e072 3 230 2785 +e075 3 244 2785 +e078 12 230 2785 +e08a 2f 244 2785 +e0b9 13 327 2785 +e0cc 7 334 2785 +e0d3 8 335 2785 +e0db a 342 2785 +e0e5 17 346 2785 +e0fc 10 352 2785 +e10c 13 367 2785 +e11f 3 380 2785 +e122 e 382 2785 +e130 3 395 2785 +e133 17 401 2785 +e14a 5 390 2785 +e14f 5 401 2785 +e154 8 246 2785 +e15c 4 247 2785 +e160 12 254 2785 +e172 14 257 2785 +e186 6 259 2785 +e18c 2 261 2785 +e18e f 263 2785 +e19d a 264 2785 +e1a7 18 268 2785 +e1bf f 288 2785 +e1ce 4 289 2785 +e1d2 b 291 2785 +e1dd 2 293 2785 +e1df f 279 2785 +e1ee 4 280 2785 +e1f2 b 282 2785 +e1fd 2 284 2785 +e1ff f 296 2785 +e20e 4 297 2785 +e212 b 299 2785 +e21d 2 301 2785 +e21f f 271 2785 +e22e 4 272 2785 +e232 c 274 2785 +e23e c 305 2785 +e24a 9 309 2785 +e253 4 407 2785 +e257 3 305 2785 +e25a 9 306 2785 +e263 19 410 2785 +e27c 1a 419 2785 +e296 3 417 2785 +e299 6 423 2785 +FUNC e29f 1b0 4 raise +e29f c 452 2785 +e2ab 5 459 2785 +e2b0 3 460 2785 +e2b3 1f 462 2785 +e2d2 a 488 2785 +e2dc 4 489 2785 +e2e0 8 490 2785 +e2e8 a 465 2785 +e2f2 2 467 2785 +e2f4 11 492 2785 +e305 2 493 2785 +e307 f 462 2785 +e316 1c 500 2785 +e332 a 476 2785 +e33c 2 478 2785 +e33e a 470 2785 +e348 2 472 2785 +e34a a 481 2785 +e354 7 482 2785 +e35b a 502 2785 +e365 2 510 2785 +e367 4 509 2785 +e36b 6 510 2785 +e371 5 515 2785 +e376 7 520 2785 +e37d 5 527 2785 +e382 7 528 2785 +e389 5 530 2785 +e38e f 543 2785 +e39d 6 544 2785 +e3a3 3 545 2785 +e3a6 5 551 2785 +e3ab 6 552 2785 +e3b1 7 553 2785 +e3b8 5 561 2785 +e3bd 1c 568 2785 +e3d9 d 571 2785 +e3e6 5 568 2785 +e3eb 7 574 2785 +e3f2 c 577 2785 +e3fe 5 582 2785 +e403 8 588 2785 +e40b 2 589 2785 +e40d 6 577 2785 +e413 6 578 2785 +e419 9 579 2785 +e422 5 590 2785 +e427 f 597 2785 +e436 6 598 2785 +e43c 5 603 2785 +e441 6 604 2785 +e447 2 607 2785 +e449 6 608 2785 +FUNC e44f a 4 _initp_misc_rand_s +e44f 0 58 3075 +e44f 9 59 3075 +e458 1 60 3075 +FUNC e459 104 4 rand_s +e459 3 66 3075 +e45c b 67 3075 +e467 2b 68 3075 +e492 c 71 3075 +e49e d 77 3075 +e4ab 4 78 3075 +e4af 1e 80 3075 +e4cd e 83 3075 +e4db 4 84 3075 +e4df 2f 86 3075 +e50e 9 88 3075 +e517 5 89 3075 +e51c 16 94 3075 +e532 7 103 3075 +e539 9 107 3075 +e542 b 109 3075 +e54d 9 110 3075 +e556 6 112 3075 +e55c 1 113 3075 +FUNC e55d 15a 14 __getlocaleinfo +e55d 1d 70 3523 +e57a 7 76 3523 +e581 87 109 3523 +e608 13 103 3523 +e61b 5 114 3523 +e620 7 115 3523 +e627 3 141 3523 +e62a 12 142 3523 +e63c 20 106 3523 +e65c 5 108 3523 +e661 7 109 3523 +e668 4 111 3523 +e66c 5 118 3523 +e671 1a 126 3523 +e68b 2 127 3523 +e68d 2 129 3523 +e68f 10 134 3523 +e69f 16 135 3523 +e6b5 2 139 3523 +FUNC e6b7 a 4 _initp_misc_purevirt +e6b7 0 166 3523 +e6b7 9 167 3523 +e6c0 1 168 3523 +FUNC e6c1 a 4 _initp_misc_initcrit +e6c1 0 47 3609 +e6c1 9 48 3609 +e6ca 1 49 3609 +FUNC e6cb 10 8 __crtInitCritSecNoSpinCount +e6cb 0 76 3609 +e6cb a 77 3609 +e6d5 3 78 3609 +e6d8 3 79 3609 +FUNC e6db c5 8 __crtInitCritSecAndSpinCount +e6db c 109 3609 +e6e7 5 111 3609 +e6ec e 112 3609 +e6fa 4 114 3609 +e6fe 1b 120 3609 +e719 4 121 3609 +e71d 2 129 3609 +e71f b 130 3609 +e72a 4 131 3609 +e72e e 134 3609 +e73c 4 136 3609 +e740 5 149 3609 +e745 c 152 3609 +e751 3 155 3609 +e754 b 161 3609 +e75f 2 162 3609 +e761 1a 163 3609 +e77b 9 170 3609 +e784 8 171 3609 +e78c 4 173 3609 +e790 7 174 3609 +e797 3 176 3609 +e79a 6 177 3609 +FUNC e7a0 5e 4 _isatty +e7a0 0 37 4912 +e7a0 16 44 4912 +e7b6 2 59 4912 +e7b8 29 45 4912 +e7e1 1 59 4912 +e7e2 1b 58 4912 +e7fd 1 59 4912 +FUNC e7fe 2f 0 CPtoLCID +e7fe 0 329 4615 +e7fe 14 330 4615 +e812 2 345 4615 +e814 1 346 4615 +e815 5 342 4615 +e81a 1 346 4615 +e81b 5 339 4615 +e820 1 346 4615 +e821 5 336 4615 +e826 1 346 4615 +e827 5 333 4615 +e82c 1 346 4615 +FUNC e82d 55 0 setSBCS +e82d 4 363 4615 +e831 14 368 4615 +e845 3 371 4615 +e848 3 374 4615 +e84b 3 376 4615 +e84e 8 379 4615 +e856 a 381 4615 +e860 9 382 4615 +e869 b 384 4615 +e874 d 385 4615 +e881 1 386 4615 +FUNC e882 18a 0 setSBUpLow +e882 1d 402 4615 +e89f f 412 4615 +e8ae d 415 4615 +e8bb c 416 4615 +e8c7 e 420 4615 +e8d5 3 419 4615 +e8d8 28 421 4615 +e900 1d 427 4615 +e91d 23 432 4615 +e940 25 437 4615 +e965 2 442 4615 +e967 a 443 4615 +e971 5 445 4615 +e976 9 446 4615 +e97f 5 448 4615 +e984 5 450 4615 +e989 e 451 4615 +e997 2 453 4615 +e999 8 454 4615 +e9a1 5 442 4615 +e9a6 8 456 4615 +e9ae 2c 472 4615 +e9da 5 466 4615 +e9df 5 468 4615 +e9e4 7 469 4615 +e9eb 2 471 4615 +e9ed 3 472 4615 +e9f0 5 460 4615 +e9f5 17 474 4615 +FUNC ea0c a4 0 __updatetmbcinfo +ea0c c 496 4615 +ea18 7 499 4615 +ea1f 10 500 4615 +ea2f 3 533 4615 +ea32 4 536 4615 +ea36 8 538 4615 +ea3e 2 541 4615 +ea40 6 542 4615 +ea46 8 501 4615 +ea4e 4 503 4615 +ea52 e 506 4615 +ea60 17 512 4615 +ea77 7 517 4615 +ea7e 11 524 4615 +ea8f 7 525 4615 +ea96 11 528 4615 +eaa7 9 530 4615 +FUNC eab0 7a 0 getSystemCP +eab0 7 282 4615 +eab7 b 284 4615 +eac2 b 289 4615 +eacd a 291 4615 +ead7 14 292 4615 +eaeb 5 295 4615 +eaf0 a 297 4615 +eafa 8 298 4615 +eb02 5 302 4615 +eb07 12 305 4615 +eb19 f 308 4615 +eb28 2 309 4615 +FUNC eb2a 1d9 8 _setmbcp_nolock +eb2a 15 686 4615 +eb3f b 693 4615 +eb4a 9 696 4615 +eb53 7 698 4615 +eb5a 7 699 4615 +eb61 3 703 4615 +eb64 2 705 4615 +eb66 19 708 4615 +eb7f 2a 743 4615 +eba9 13 751 4615 +ebbc f 756 4615 +ebcb 15 761 4615 +ebe0 17 764 4615 +ebf7 c 766 4615 +ec03 f 712 4615 +ec12 15 715 4615 +ec27 9 720 4615 +ec30 8 723 4615 +ec38 12 724 4615 +ec4a 9 723 4615 +ec53 5 720 4615 +ec58 12 715 4615 +ec6a 20 731 4615 +ec8a d 733 4615 +ec97 7 736 4615 +ec9e 5 737 4615 +eca3 6 767 4615 +eca9 10 766 4615 +ecb9 8 771 4615 +ecc1 7 772 4615 +ecc8 b 775 4615 +ecd3 3 778 4615 +ecd6 2 780 4615 +ecd8 3 782 4615 +ecdb 8 785 4615 +ece3 2 789 4615 +ece5 6 794 4615 +eceb 6 797 4615 +ecf1 3 746 4615 +ecf4 f 802 4615 +FUNC ed03 3c 0 _getmbcp +ed03 6 819 4615 +ed09 a 821 4615 +ed13 9 822 4615 +ed1c 10 823 4615 +ed2c 2 826 4615 +ed2e f 825 4615 +ed3d 2 826 4615 +FUNC ed3f 19a 4 _setmbcp +ed3f c 574 4615 +ed4b 4 575 4615 +ed4f a 579 4615 +ed59 5 581 4615 +ed5e 3 582 4615 +ed61 b 585 4615 +ed6c 9 587 4615 +ed75 d 593 4615 +ed82 8 595 4615 +ed8a c 597 4615 +ed96 3 607 4615 +ed99 16 612 4615 +edaf 1a 614 4615 +edc9 7 615 4615 +edd0 3 619 4615 +edd3 9 620 4615 +eddc 17 622 4615 +edf3 8 624 4615 +edfb 4 625 4615 +edff 8 630 4615 +ee07 8 631 4615 +ee0f 8 632 4615 +ee17 a 633 4615 +ee21 d 634 4615 +ee2e 3 633 4615 +ee31 c 635 4615 +ee3d a 636 4615 +ee47 3 635 4615 +ee4a c 637 4615 +ee56 d 638 4615 +ee63 3 637 4615 +ee66 1c 640 4615 +ee82 7 641 4615 +ee89 6 645 4615 +ee8f 3 646 4615 +ee92 e 648 4615 +eea0 9 650 4615 +eea9 2 653 4615 +eeab 5 654 4615 +eeb0 8 660 4615 +eeb8 7 661 4615 +eebf b 662 4615 +eeca 2 668 4615 +eecc 4 673 4615 +eed0 3 682 4615 +eed3 6 683 4615 +FUNC eed9 1e 0 __initmbctable +eed9 0 843 4615 +eed9 9 853 4615 +eee2 8 854 4615 +eeea a 855 4615 +eef4 2 860 4615 +eef6 1 861 4615 +FUNC eef7 6 0 ___setlc_active_func +eef7 0 90 2995 +eef7 5 91 2995 +eefc 1 92 2995 +FUNC eefd 6 0 ___unguarded_readlc_active_add_func +eefd 0 104 2995 +eefd 5 105 2995 +ef02 1 106 2995 +FUNC ef03 140 4 __freetlocinfo +ef03 3 144 2995 +ef06 26 152 2995 +ef2c e 155 2995 +ef3a 6 157 2995 +ef40 d 158 2995 +ef4d e 162 2995 +ef5b 6 164 2995 +ef61 d 165 2995 +ef6e b 168 2995 +ef79 d 169 2995 +ef86 e 176 2995 +ef94 11 178 2995 +efa5 13 179 2995 +efb8 e 180 2995 +efc6 e 181 2995 +efd4 17 188 2995 +efeb 6 190 2995 +eff1 9 191 2995 +effa 6 194 2995 +f000 13 197 2995 +f013 7 199 2995 +f01a 10 205 2995 +f02a d 207 2995 +f037 b 214 2995 +f042 1 215 2995 +FUNC f043 86 4 __addlocaleref +f043 3 225 2995 +f046 e 227 2995 +f054 a 228 2995 +f05e 3 229 2995 +f061 a 231 2995 +f06b 3 232 2995 +f06e a 234 2995 +f078 3 235 2995 +f07b a 237 2995 +f085 3 238 2995 +f088 6 240 2995 +f08e f 242 2995 +f09d 3 243 2995 +f0a0 d 245 2995 +f0ad 9 246 2995 +f0b6 12 248 2995 +f0c8 1 249 2995 +FUNC f0c9 8c 4 __removelocaleref +f0c9 1 259 2995 +f0ca b 261 2995 +f0d5 9 263 2995 +f0de a 265 2995 +f0e8 3 266 2995 +f0eb a 268 2995 +f0f5 3 269 2995 +f0f8 a 271 2995 +f102 3 272 2995 +f105 a 274 2995 +f10f 3 275 2995 +f112 6 277 2995 +f118 f 279 2995 +f127 3 280 2995 +f12a d 282 2995 +f137 9 283 2995 +f140 11 285 2995 +f151 3 287 2995 +f154 1 288 2995 +FUNC f155 24 0 _copytlocinfo_nolock +f155 3 302 2995 +f158 d 303 2995 +f165 7 304 2995 +f16c 3 305 2995 +f16f 9 306 2995 +f178 1 308 2995 +FUNC f179 3e 0 _updatetlocinfoEx_nolock +f179 0 321 2995 +f179 9 324 2995 +f182 2 326 2995 +f184 4 327 2995 +f188 8 334 2995 +f190 5 339 2995 +f195 6 341 2995 +f19b e 350 2995 +f1a9 7 351 2995 +f1b0 3 355 2995 +f1b3 1 356 2995 +f1b4 2 325 2995 +f1b6 1 356 2995 +FUNC f1b7 76 0 __updatetlocinfo +f1b7 c 382 2995 +f1c3 7 384 2995 +f1ca 10 386 2995 +f1da 8 397 2995 +f1e2 4 399 2995 +f1e6 8 401 2995 +f1ee 2 404 2995 +f1f0 6 405 2995 +f1f6 8 387 2995 +f1fe 4 388 2995 +f202 11 390 2995 +f213 e 392 2995 +f221 8 394 2995 +f229 4 395 2995 +FUNC f22d 66 4 _configthreadlocale +f22d 2 420 2995 +f22f 5 434 2995 +f234 10 435 2995 +f244 19 437 2995 +f25d 1d 456 2995 +f27a 3 444 2995 +f27d 2 445 2995 +f27f 6 440 2995 +f285 2 441 2995 +f287 7 452 2995 +f28e 4 460 2995 +f292 1 462 2995 +FUNC f293 53 0 sync_legacy_variables_lk +f293 0 489 2995 +f293 e 490 2995 +f2a1 9 491 2995 +f2aa c 492 2995 +f2b6 c 493 2995 +f2c2 c 494 2995 +f2ce c 495 2995 +f2da b 496 2995 +f2e5 1 497 2995 +FUNC f2e6 96 4 _free_locale +f2e6 c 517 2995 +f2f2 9 518 2995 +f2fb 1c 522 2995 +f317 7 524 2995 +f31e 4 526 2995 +f322 8 534 2995 +f32a 3 535 2995 +f32d 8 537 2995 +f335 11 540 2995 +f346 7 541 2995 +f34d c 543 2995 +f359 7 552 2995 +f360 3 553 2995 +f363 7 554 2995 +f36a 6 556 2995 +f370 3 543 2995 +f373 9 545 2995 +FUNC f37c 5 4 __free_locale +f37c 0 562 2995 +f37c 5 563 2995 +FUNC f381 88 0 _get_current_locale +f381 c 687 2995 +f38d 7 689 2995 +f394 14 691 2995 +f3a8 b 693 2995 +f3b3 4 694 2995 +f3b7 5 697 2995 +f3bc 5 698 2995 +f3c1 5 706 2995 +f3c6 6 707 2995 +f3cc 8 708 2995 +f3d4 4 709 2995 +f3d8 8 710 2995 +f3e0 c 712 2995 +f3ec 9 715 2995 +f3f5 2 717 2995 +f3f7 6 718 2995 +f3fd 3 712 2995 +f400 9 713 2995 +FUNC f409 5 0 __get_current_locale +f409 0 722 2995 +f409 5 723 2995 +FUNC f40e 3 4 __init_dummy +f40e 0 1283 2995 +f40e 2 1284 2995 +f410 1 1285 2995 +FUNC f411 3e c _strcats +f411 2 1288 2995 +f413 f 1294 2995 +f422 26 1296 2995 +f448 6 1294 2995 +f44e 1 1299 2995 +FUNC f44f 129 8 __lc_strtolc +f44f 6 1302 2995 +f455 11 1307 2995 +f466 c 1309 2995 +f472 7 1310 2995 +f479 b 1313 2995 +f484 25 1315 2995 +f4a9 6 1317 2995 +f4af 2 1318 2995 +f4b1 15 1323 2995 +f4c6 1d 1328 2995 +f4e3 9 1329 2995 +f4ec 10 1331 2995 +f4fc c 1332 2995 +f508 14 1334 2995 +f51c 28 1335 2995 +f544 9 1340 2995 +f54d b 1348 2995 +f558 18 1350 2995 +f570 6 1338 2995 +f576 2 1353 2995 +FUNC f578 6b c __lc_lctostr +f578 5 1356 2995 +f57d 25 1357 2995 +f5a2 7 1358 2995 +f5a9 16 1359 2995 +f5bf c 1360 2995 +f5cb 16 1361 2995 +f5e1 2 1362 2995 +FUNC f5e3 171 0 _setlocale_get_all +f5e3 4 1124 2995 +f5e7 3 1126 2995 +f5ea 1d 1134 2995 +f607 3 1137 2995 +f60a 3 1139 2995 +f60d 2 1140 2995 +f60f 2f 1143 2995 +f63e 26 1146 2995 +f664 10 1147 2995 +f674 5 1148 2995 +f679 4 1141 2995 +f67d 2f 1143 2995 +f6ac a 1144 2995 +f6b6 8 1152 2995 +f6be 14 1154 2995 +f6d2 9 1156 2995 +f6db e 1159 2995 +f6e9 9 1161 2995 +f6f2 7 1165 2995 +f6f9 7 1166 2995 +f700 9 1168 2995 +f709 15 1170 2995 +f71e 9 1172 2995 +f727 e 1175 2995 +f735 9 1177 2995 +f73e 12 1183 2995 +f750 4 1187 2995 +FUNC f754 1d4 18 _expandlocale +f754 15 1198 2995 +f769 41 1230 2995 +f7aa 14 1211 2995 +f7be b 1216 2995 +f7c9 26 1219 2995 +f7ef 4 1220 2995 +f7f3 3 1222 2995 +f7f6 4 1223 2995 +f7fa 4 1224 2995 +f7fe 7 1226 2995 +f805 2 1228 2995 +f807 8 1230 2995 +f80f 6 1234 2995 +f815 2f 1236 2995 +f844 4 1241 2995 +f848 e 1243 2995 +f856 6 1244 2995 +f85c 10 1246 2995 +f86c 6 1247 2995 +f872 9 1251 2995 +f87b 10 1253 2995 +f88b a 1255 2995 +f895 2 1260 2995 +f897 8 1263 2995 +f89f 26 1267 2995 +f8c5 5 1271 2995 +f8ca e 1272 2995 +f8d8 5 1273 2995 +f8dd 10 1274 2995 +f8ed 22 1276 2995 +f90f 5 1277 2995 +f914 2 1212 2995 +f916 12 1278 2995 +FUNC f928 2f6 4 _setlocale_set_cat +f928 19 980 2995 +f941 5 993 2995 +f946 2f 998 2995 +f975 7 1000 2995 +f97c 19 1002 2995 +f995 6 1004 2995 +f99b c 1007 2995 +f9a7 16 1008 2995 +f9bd 2 1010 2995 +f9bf 3 1013 2995 +f9c2 d 1014 2995 +f9cf 2c 1015 2995 +f9fb 3 1016 2995 +f9fe 39 1019 2995 +fa37 6 1020 2995 +fa3d 15 1021 2995 +fa52 17 1022 2995 +fa69 a 1029 2995 +fa73 6 1031 2995 +fa79 18 1037 2995 +fa91 7 1039 2995 +fa98 8 1053 2995 +faa0 14 1054 2995 +fab4 18 1055 2995 +facc 2 1039 2995 +face a 1044 2995 +fad8 d 1046 2995 +fae5 b 1047 2995 +faf0 9 1058 2995 +faf9 26 1066 2995 +fb1f 2 1069 2995 +fb21 10 1071 2995 +fb31 22 1072 2995 +fb53 2 1081 2995 +fb55 4 1082 2995 +fb59 5 1083 2995 +fb5e 9 1085 2995 +fb67 6 1088 2995 +fb6d 9 1089 2995 +fb76 12 1091 2995 +fb88 6 1094 2995 +fb8e e 1095 2995 +fb9c f 1096 2995 +fbab 9 1097 2995 +fbb4 5 1099 2995 +fbb9 24 1106 2995 +fbdd 7 1109 2995 +fbe4 8 1110 2995 +fbec 6 1111 2995 +fbf2 18 1116 2995 +fc0a 3 1118 2995 +fc0d 11 1119 2995 +FUNC fc1e 1ce 4 _setlocale_nolock +fc1e 1a 873 2995 +fc38 7 877 2995 +fc3f 5 904 2995 +fc44 17 880 2995 +fc5b 5 882 2995 +fc60 12 888 2995 +fc72 1d 890 2995 +fc8f 2 894 2995 +fc91 d 898 2995 +fc9e 1e 900 2995 +fcbc 11 904 2995 +fccd 1d 907 2995 +fcea e 904 2995 +fcf8 1b 913 2995 +fd13 6 916 2995 +fd19 24 918 2995 +fd3d 18 922 2995 +fd55 3 923 2995 +fd58 7 925 2995 +fd5f 1 926 2995 +fd60 9 928 2995 +fd69 c 930 2995 +fd75 4 901 2995 +fd79 19 935 2995 +fd92 3 937 2995 +fd95 4 939 2995 +fd99 11 941 2995 +fdaa c 943 2995 +fdb6 2 947 2995 +fdb8 3 949 2995 +fdbb 2 952 2995 +fdbd 3 953 2995 +fdc0 9 937 2995 +fdc9 5 956 2995 +fdce 2 961 2995 +fdd0 3 962 2995 +fdd3 2 965 2995 +fdd5 5 966 2995 +fdda 12 972 2995 +FUNC fdec f3 8 _create_locale +fdec 0 605 2995 +fdec 10 609 2995 +fdfc 13 612 2995 +fe0f b 614 2995 +fe1a 4 610 2995 +fe1e c 658 2995 +fe2a 8 617 2995 +fe32 7 619 2995 +fe39 2 621 2995 +fe3b 14 623 2995 +fe4f 7 625 2995 +fe56 7 626 2995 +fe5d 2 628 2995 +fe5f c 630 2995 +fe6b 14 632 2995 +fe7f 7 634 2995 +fe86 7 635 2995 +fe8d 9 637 2995 +fe96 2 640 2995 +fe98 13 642 2995 +feab 8 644 2995 +feb3 7 645 2995 +feba 7 646 2995 +fec1 9 647 2995 +feca 2 648 2995 +fecc 2 650 2995 +fece 5 652 2995 +fed3 5 653 2995 +fed8 7 657 2995 +FUNC fedf 5 8 __create_locale +fedf 0 665 2995 +fedf 5 666 2995 +FUNC fee4 170 8 setlocale +fee4 c 791 2995 +fef0 5 792 2995 +fef5 25 797 2995 +ff1a a 799 2995 +ff24 5 801 2995 +ff29 4 806 2995 +ff2d 3 807 2995 +ff30 1b 808 2995 +ff4b 8 818 2995 +ff53 7 819 2995 +ff5a a 820 2995 +ff64 8 822 2995 +ff6c 19 826 2995 +ff85 18 834 2995 +ff9d a 836 2995 +ffa7 8 839 2995 +ffaf 7 840 2995 +ffb6 a 841 2995 +ffc0 7 842 2995 +ffc7 f 846 2995 +ffd6 c 847 2995 +ffe2 18 849 2995 +fffa 5 850 2995 +ffff b 852 2995 +1000a 8 822 2995 +10012 9 823 2995 +1001b 3 852 2995 +1001e 9 853 2995 +10027 2 855 2995 +10029 6 856 2995 +1002f 8 857 2995 +10037 c 860 2995 +10043 3 865 2995 +10046 6 866 2995 +1004c 3 860 2995 +1004f 5 862 2995 +FUNC 10054 15f 14 _wctomb_s_l +10054 8 56 6128 +1005c 11 57 6128 +1006d 7 60 6128 +10074 2 62 6128 +10076 4 64 6128 +1007a 7 67 6128 +10081 3 69 6128 +10084 23 74 6128 +100a7 b 77 6128 +100b2 c 79 6128 +100be a 81 6128 +100c8 8 83 6128 +100d0 b 85 6128 +100db b 125 6128 +100e6 13 126 6128 +100f9 5 136 6128 +100fe 4 91 6128 +10102 2c 93 6128 +1012e 2 94 6128 +10130 7 96 6128 +10137 6 98 6128 +1013d 15 100 6128 +10152 27 115 6128 +10179 7 129 6128 +10180 2 131 6128 +10182 2 133 6128 +10184 f 117 6128 +10193 10 119 6128 +101a3 b 121 6128 +101ae 5 123 6128 +FUNC 101b3 1b 10 wctomb_s +101b3 0 144 6128 +101b3 1a 145 6128 +101cd 1 146 6128 +FUNC 101ce 4f c _wctomb_l +101ce 6 178 6128 +101d4 f 181 6128 +101e3 1f 183 6128 +10202 19 184 6128 +1021b 2 185 6128 +FUNC 1021d 30 8 wctomb +1021d 4 191 6128 +10221 4 192 6128 +10225 1a 195 6128 +1023f 7 196 6128 +10246 2 197 6128 +10248 3 196 6128 +1024b 2 197 6128 +FUNC 1024d 36 8 _isleadbyte_l +1024d 6 55 6490 +10253 b 56 6490 +1025e 23 57 6490 +10281 2 58 6490 +FUNC 10283 e 4 isleadbyte +10283 0 63 6490 +10283 d 64 6490 +10290 1 65 6490 +FUNC 10291 16 8 _iswalpha_l +10291 0 71 6490 +10291 15 72 6490 +102a6 1 73 6490 +FUNC 102a7 11 4 iswalpha +102a7 0 78 6490 +102a7 10 79 6490 +102b7 1 80 6490 +FUNC 102b8 13 8 _iswupper_l +102b8 0 86 6490 +102b8 12 87 6490 +102ca 1 88 6490 +FUNC 102cb e 4 iswupper +102cb 0 93 6490 +102cb d 94 6490 +102d8 1 95 6490 +FUNC 102d9 13 8 _iswlower_l +102d9 0 101 6490 +102d9 12 102 6490 +102eb 1 103 6490 +FUNC 102ec e 4 iswlower +102ec 0 108 6490 +102ec d 109 6490 +102f9 1 110 6490 +FUNC 102fa 13 8 _iswdigit_l +102fa 0 116 6490 +102fa 12 117 6490 +1030c 1 118 6490 +FUNC 1030d e 4 iswdigit +1030d 0 123 6490 +1030d d 124 6490 +1031a 1 125 6490 +FUNC 1031b 16 8 _iswxdigit_l +1031b 0 131 6490 +1031b 15 132 6490 +10330 1 133 6490 +FUNC 10331 11 4 iswxdigit +10331 0 138 6490 +10331 10 139 6490 +10341 1 140 6490 +FUNC 10342 13 8 _iswspace_l +10342 0 146 6490 +10342 12 147 6490 +10354 1 148 6490 +FUNC 10355 e 4 iswspace +10355 0 153 6490 +10355 d 154 6490 +10362 1 155 6490 +FUNC 10363 13 8 _iswpunct_l +10363 0 161 6490 +10363 12 162 6490 +10375 1 163 6490 +FUNC 10376 e 4 iswpunct +10376 0 168 6490 +10376 d 169 6490 +10383 1 170 6490 +FUNC 10384 16 8 _iswalnum_l +10384 0 176 6490 +10384 15 177 6490 +10399 1 178 6490 +FUNC 1039a 11 4 iswalnum +1039a 0 183 6490 +1039a 10 184 6490 +103aa 1 185 6490 +FUNC 103ab 16 8 _iswprint_l +103ab 0 191 6490 +103ab 15 192 6490 +103c0 1 193 6490 +FUNC 103c1 11 4 iswprint +103c1 0 198 6490 +103c1 10 199 6490 +103d1 1 200 6490 +FUNC 103d2 16 8 _iswgraph_l +103d2 0 206 6490 +103d2 15 207 6490 +103e7 1 208 6490 +FUNC 103e8 11 4 iswgraph +103e8 0 213 6490 +103e8 10 214 6490 +103f8 1 215 6490 +FUNC 103f9 13 8 _iswcntrl_l +103f9 0 221 6490 +103f9 12 222 6490 +1040b 1 223 6490 +FUNC 1040c e 4 iswcntrl +1040c 0 228 6490 +1040c d 229 6490 +10419 1 230 6490 +FUNC 1041a c 4 iswascii +1041a 0 235 6490 +1041a b 236 6490 +10425 1 237 6490 +FUNC 10426 26 8 _iswcsym_l +10426 0 243 6490 +10426 21 244 6490 +10447 1 245 6490 +10448 3 244 6490 +1044b 1 245 6490 +FUNC 1044c 21 4 __iswcsym +1044c 0 250 6490 +1044c 1c 251 6490 +10468 1 252 6490 +10469 3 251 6490 +1046c 1 252 6490 +FUNC 1046d 26 8 _iswcsymf_l +1046d 0 258 6490 +1046d 21 259 6490 +1048e 1 260 6490 +1048f 3 259 6490 +10492 1 260 6490 +FUNC 10493 21 4 __iswcsymf +10493 0 265 6490 +10493 1c 266 6490 +104af 1 267 6490 +104b0 3 266 6490 +104b3 1 267 6490 +FUNC 104c0 95 0 _aulldvrm +104c0 0 45 5113 +104c0 1 47 5113 +104c1 4 79 5113 +104c5 2 80 5113 +104c7 2 81 5113 +104c9 4 82 5113 +104cd 4 83 5113 +104d1 2 84 5113 +104d3 2 85 5113 +104d5 2 86 5113 +104d7 4 87 5113 +104db 2 88 5113 +104dd 2 89 5113 +104df 2 94 5113 +104e1 4 95 5113 +104e5 2 96 5113 +104e7 2 97 5113 +104e9 4 98 5113 +104ed 2 99 5113 +104ef 2 100 5113 +104f1 2 107 5113 +104f3 4 108 5113 +104f7 4 109 5113 +104fb 4 110 5113 +104ff 2 112 5113 +10501 2 113 5113 +10503 2 114 5113 +10505 2 115 5113 +10507 2 116 5113 +10509 2 117 5113 +1050b 2 118 5113 +1050d 2 119 5113 +1050f 4 128 5113 +10513 2 129 5113 +10515 4 130 5113 +10519 2 131 5113 +1051b 2 132 5113 +1051d 2 133 5113 +1051f 4 141 5113 +10523 2 142 5113 +10525 2 143 5113 +10527 4 144 5113 +1052b 2 145 5113 +1052d 1 147 5113 +1052e 4 148 5113 +10532 4 149 5113 +10536 2 151 5113 +10538 4 160 5113 +1053c 4 161 5113 +10540 2 162 5113 +10542 2 163 5113 +10544 3 164 5113 +10547 2 169 5113 +10549 2 170 5113 +1054b 2 171 5113 +1054d 2 172 5113 +1054f 2 173 5113 +10551 1 179 5113 +10552 3 181 5113 +FUNC 10558 90 0 _local_unwind4 +FUNC 105e8 46 0 _unwind_handler4 +FUNC 1062e 1c 4 _seh_longjmp_unwind4 +FUNC 1064a 17 0 _EH4_CallFilterFunc +FUNC 10661 19 0 _EH4_TransferToHandler +FUNC 1067a 1a 0 _EH4_GlobalUnwind +FUNC 10694 17 8 _EH4_LocalUnwind +FUNC 106ab 33 0 write_char +106ab 0 2433 1218 +106ab a 2434 1218 +106b5 2 2437 1218 +106b7 21 2442 1218 +106d8 2 2444 1218 +106da 1 2447 1218 +106db 2 2446 1218 +106dd 1 2447 1218 +FUNC 106de 24 c write_multi_char +106de 6 2498 1218 +106e4 2 2501 1218 +106e6 e 2500 1218 +106f4 5 2501 1218 +106f9 7 2499 1218 +10700 2 2504 1218 +FUNC 10702 4a 4 write_string +10702 0 2563 1218 +10702 12 2564 1218 +10714 6 2566 1218 +1071a 2 2567 1218 +1071c e 2570 1218 +1072a 5 2571 1218 +1072f a 2573 1218 +10739 9 2574 1218 +10742 9 2569 1218 +1074b 1 2579 1218 +FUNC 1074c 9b0 10 _output_s_l +1074c 1b 975 1218 +10767 45 1036 1218 +107ac 2d 1031 1218 +107d9 b1 1033 1218 +1088a 8 1036 1218 +10892 28 1073 1218 +108ba 17 1078 1218 +108d1 e 1079 1218 +108df 11 1124 1218 +108f0 12 1131 1218 +10902 2 1171 1218 +10904 13 1173 1218 +10917 3 1174 1218 +1091a 5 1175 1218 +1091f 1e 1179 1218 +1093d 3 1193 1218 +10940 5 1194 1218 +10945 4 1181 1218 +10949 5 1182 1218 +1094e 4 1184 1218 +10952 5 1185 1218 +10957 7 1190 1218 +1095e 5 1191 1218 +10963 4 1187 1218 +10967 5 1196 1218 +1096c 5 1200 1218 +10971 9 1206 1218 +1097a b 1233 1218 +10985 4 1235 1218 +10989 3 1236 1218 +1098c 5 1239 1218 +10991 10 1241 1218 +109a1 5 1243 1218 +109a6 4 1248 1218 +109aa 5 1249 1218 +109af 5 1253 1218 +109b4 9 1259 1218 +109bd b 1284 1218 +109c8 4 1285 1218 +109cc 5 1287 1218 +109d1 10 1289 1218 +109e1 5 1291 1218 +109e6 18 1295 1218 +109fe 7 1362 1218 +10a05 5 1363 1218 +10a0a 5 1301 1218 +10a0f 1 1303 1218 +10a10 a 1304 1218 +10a1a 5 1306 1218 +10a1f 4 1308 1218 +10a23 5 1310 1218 +10a28 4 1358 1218 +10a2c 5 1359 1218 +10a31 c 1322 1218 +10a3d 2 1324 1218 +10a3f f 1325 1218 +10a4e a 1327 1218 +10a58 2 1329 1218 +10a5a a 1330 1218 +10a64 5 1332 1218 +10a69 30 1337 1218 +10a99 4 1352 1218 +10a9d 4 1154 1218 +10aa1 10 1158 1218 +10ab1 11 1160 1218 +10ac2 3 1161 1218 +10ac5 b 1163 1218 +10ad0 b 1166 1218 +10adb 5 1167 1218 +10ae0 32 1378 1218 +10b12 d 1716 1218 +10b1f 4 1724 1218 +10b23 18 1749 1218 +10b3b c 1750 1218 +10b47 8 1381 1218 +10b4f 9 1385 1218 +10b58 8 1561 1218 +10b60 7 1562 1218 +10b67 d 1584 1218 +10b74 3 1589 1218 +10b77 15 1635 1218 +10b8c 4 1636 1218 +10b90 8 1637 1218 +10b98 f 1639 1218 +10ba7 1d 1378 1218 +10bc4 12 1448 1218 +10bd6 16 1467 1218 +10bec 4 1470 1218 +10bf0 7 1471 1218 +10bf7 2 1472 1218 +10bf9 6 1499 1218 +10bff 7 1500 1218 +10c06 6 1503 1218 +10c0c 5 1506 1218 +10c11 5 1523 1218 +10c16 e 1541 1218 +10c24 6 1546 1218 +10c2a d 1548 1218 +10c37 7 1549 1218 +10c3e 5 1550 1218 +10c43 4 1551 1218 +10c47 5 1553 1218 +10c4c 8 1543 1218 +10c54 7 1544 1218 +10c5b 5 1557 1218 +10c60 34 1378 1218 +10c94 9 1908 1218 +10c9d 9 1910 1218 +10ca6 8 1668 1218 +10cae d 1688 1218 +10cbb 6 1702 1218 +10cc1 7 1703 1218 +10cc8 2 1704 1218 +10cca 5 1706 1218 +10ccf 7 1708 1218 +10cd6 5 1710 1218 +10cdb 4 1864 1218 +10cdf 7 1869 1218 +10ce6 c 1933 1218 +10cf2 8 1939 1218 +10cfa 5 1958 1218 +10cff 7 1751 1218 +10d06 9 1752 1218 +10d0f 5 1753 1218 +10d14 3 1754 1218 +10d17 9 1756 1218 +10d20 f 1759 1218 +10d2f 2 1760 1218 +10d31 15 1765 1218 +10d46 8 1767 1218 +10d4e e 1809 1218 +10d5c 27 1828 1218 +10d83 14 1838 1218 +10d97 15 1840 1218 +10dac a 1844 1218 +10db6 15 1846 1218 +10dcb 5 1852 1218 +10dd0 7 1853 1218 +10dd7 4 1854 1218 +10ddb 1 1857 1218 +10ddc 5 1859 1218 +10de1 3 1877 1218 +10de4 3 1887 1218 +10de7 2 1888 1218 +10de9 1a 1378 1218 +10e03 7 1892 1218 +10e0a 11 1897 1218 +10e1b c 1900 1218 +10e27 7 1901 1218 +10e2e 5 1903 1218 +10e33 5 1961 1218 +10e38 6 1987 1218 +10e3e 14 2026 1218 +10e52 2 2045 1218 +10e54 5 2051 1218 +10e59 2 2071 1218 +10e5b 3 2074 1218 +10e5e 6 2080 1218 +10e64 2 2099 1218 +10e66 5 2105 1218 +10e6b f 2128 1218 +10e7a 7 2129 1218 +10e81 7 2130 1218 +10e88 c 2136 1218 +10e94 2 2142 1218 +10e96 6 2148 1218 +10e9c 7 2149 1218 +10ea3 2 2150 1218 +10ea5 4 2151 1218 +10ea9 a 2152 1218 +10eb3 3 2153 1218 +10eb6 6 2157 1218 +10ebc 3 2158 1218 +10ebf 6 2163 1218 +10ec5 10 2165 1218 +10ed5 10 2166 1218 +10ee5 c 2168 1218 +10ef1 3 2170 1218 +10ef4 3 2172 1218 +10ef7 2 2173 1218 +10ef9 8 2175 1218 +10f01 1 2176 1218 +10f02 19 2180 1218 +10f1b 9 2181 1218 +10f24 1 2182 1218 +10f25 2 2185 1218 +10f27 7 1640 1218 +10f2e 2 1641 1218 +10f30 4 1640 1218 +10f34 5 1642 1218 +10f39 2 1644 1218 +10f3b 4 1645 1218 +10f3f 8 1646 1218 +10f47 5 1647 1218 +10f4c 6 1648 1218 +10f52 1 1649 1218 +10f53 4 1648 1218 +10f57 6 1650 1218 +10f5d a 2201 1218 +10f67 7 2204 1218 +10f6e 6 2205 1218 +10f74 4 2207 1218 +10f78 2 2208 1218 +10f7a 4 2210 1218 +10f7e 4 2212 1218 +10f82 2 2213 1218 +10f84 4 2215 1218 +10f88 4 2217 1218 +10f8c 7 2218 1218 +10f93 9 2224 1218 +10f9c 6 2228 1218 +10fa2 11 2230 1218 +10fb3 11 2234 1218 +10fc4 d 2236 1218 +10fd1 f 2238 1218 +10fe0 d 2243 1218 +10fed 3 2249 1218 +10ff0 3 2250 1218 +10ff3 1e 2252 1218 +11011 9 2253 1218 +1101a 18 2257 1218 +11032 2 1690 1218 +11034 4 2254 1218 +11038 2 2259 1218 +1103a d 2260 1218 +11047 c 2290 1218 +11053 f 2292 1218 +11062 6 2297 1218 +11068 8 2298 1218 +11070 1b 2299 1218 +1108b 17 1125 1218 +110a2 2 1690 1218 +110a4 f 2310 1218 +110b3 10 2376 1218 +110c3 39 2377 1218 +FUNC 110fc 129 10 _validate_param_reuseA +110fc 3 606 1271 +110ff 1c 610 1271 +1111b f 617 1271 +1112a 11 618 1271 +1113b 10 620 1271 +1114b 36 629 1271 +11181 46 632 1271 +111c7 2 633 1271 +111c9 17 639 1271 +111e0 c 645 1271 +111ec 2c 626 1271 +11218 b 614 1271 +11223 2 646 1271 +FUNC 11225 33 0 write_char +11225 0 2433 1271 +11225 a 2434 1271 +1122f 2 2437 1271 +11231 21 2442 1271 +11252 2 2444 1271 +11254 1 2447 1271 +11255 2 2446 1271 +11257 1 2447 1271 +FUNC 11258 24 c write_multi_char +11258 6 2498 1271 +1125e 2 2501 1271 +11260 e 2500 1271 +1126e 5 2501 1271 +11273 7 2499 1271 +1127a 2 2504 1271 +FUNC 1127c 4a 4 write_string +1127c 0 2563 1271 +1127c 12 2564 1271 +1128e 6 2566 1271 +11294 2 2567 1271 +11296 e 2570 1271 +112a4 5 2571 1271 +112a9 a 2573 1271 +112b3 9 2574 1271 +112bc 9 2569 1271 +112c5 1 2579 1271 +FUNC 112c6 10 4 get_crtdouble_arg +112c6 0 2684 1271 +112c6 f 2685 1271 +112d5 1 2686 1271 +FUNC 112d6 f88 10 _output_p_l +112d6 1b 975 1271 +112f1 15 986 1271 +11306 b 1007 1271 +11311 2b 2172 1271 +1133c 2c 1031 1271 +11368 9b 1033 1271 +11403 8 1036 1271 +1140b 3 1038 1271 +1140e 3 1041 1271 +11411 3 1043 1271 +11414 11 1046 1271 +11425 7 1061 1271 +1142c 4 1062 1271 +11430 7 1069 1271 +11437 32 1073 1271 +11469 19 1078 1271 +11482 e 1079 1271 +11490 1a 1082 1271 +114aa 6 1084 1271 +114b0 1b 1087 1271 +114cb 5 1089 1271 +114d0 15 1091 1271 +114e5 3 1093 1271 +114e8 2 1095 1271 +114ea 6 1097 1271 +114f0 5 1101 1271 +114f5 c 1103 1271 +11501 7 1104 1271 +11508 e 1106 1271 +11516 1a 1109 1271 +11530 8 1112 1271 +11538 f 1131 1271 +11547 9 1120 1271 +11550 b 1131 1271 +1155b 21 1137 1271 +1157c 5 1145 1271 +11581 16 1173 1271 +11597 3 1174 1271 +1159a 5 1175 1271 +1159f 1f 1179 1271 +115be 7 1193 1271 +115c5 5 1194 1271 +115ca 7 1181 1271 +115d1 5 1182 1271 +115d6 6 1184 1271 +115dc 5 1185 1271 +115e1 a 1190 1271 +115eb 5 1191 1271 +115f0 7 1187 1271 +115f7 5 1196 1271 +115fc 9 1200 1271 +11605 5 1203 1271 +1160a a 1206 1271 +11614 2 1209 1271 +11616 c 1211 1271 +11622 7 1212 1271 +11629 b 1214 1271 +11634 1b 1216 1271 +1164f 8 1219 1271 +11657 12 1221 1271 +11669 9 1274 1271 +11672 5 1275 1271 +11677 c 1228 1271 +11683 b 1233 1271 +1168e 7 1235 1271 +11695 3 1236 1271 +11698 5 1239 1271 +1169d 10 1241 1271 +116ad 5 1243 1271 +116b2 3 1248 1271 +116b5 5 1249 1271 +116ba 5 1253 1271 +116bf 5 1256 1271 +116c4 a 1259 1271 +116ce 2 1262 1271 +116d0 c 1264 1271 +116dc 7 1265 1271 +116e3 f 1267 1271 +116f2 c 1280 1271 +116fe b 1284 1271 +11709 4 1285 1271 +1170d 5 1287 1271 +11712 1c 1274 1271 +1172e 10 1289 1271 +1173e 5 1291 1271 +11743 18 1295 1271 +1175b a 1362 1271 +11765 5 1363 1271 +1176a 5 1301 1271 +1176f 1 1303 1271 +11770 d 1304 1271 +1177d 5 1306 1271 +11782 7 1308 1271 +11789 5 1310 1271 +1178e 7 1358 1271 +11795 5 1359 1271 +1179a c 1322 1271 +117a6 2 1324 1271 +117a8 12 1325 1271 +117ba a 1327 1271 +117c4 2 1329 1271 +117c6 d 1330 1271 +117d3 5 1332 1271 +117d8 18 1337 1271 +117f0 3 1352 1271 +117f3 13 1158 1271 +11806 11 1160 1271 +11817 8 1161 1271 +1181f 8 1163 1271 +11827 b 1166 1271 +11832 5 1167 1271 +11837 a 1342 1271 +11841 5 1366 1271 +11846 39 1378 1271 +1187f 9 1716 1271 +11888 7 1724 1271 +1188f 12 1726 1271 +118a1 a 1728 1271 +118ab 27 1739 1271 +118d2 b 1381 1271 +118dd c 1385 1271 +118e9 b 1561 1271 +118f4 a 1562 1271 +118fe d 1584 1271 +1190b 9 1586 1271 +11914 a 1589 1271 +1191e 5 1592 1271 +11923 25 1378 1271 +11948 b 1442 1271 +11953 5 1445 1271 +11958 b 1448 1271 +11963 2 1451 1271 +11965 a 1453 1271 +1196f 27 1457 1271 +11996 5 1458 1271 +1199b a 1462 1271 +119a5 19 1467 1271 +119be 4 1470 1271 +119c2 3 1471 1271 +119c5 2 1472 1271 +119c7 5 1477 1271 +119cc b 1480 1271 +119d7 2 1483 1271 +119d9 a 1485 1271 +119e3 f 1489 1271 +119f2 a 1494 1271 +119fc 6 1499 1271 +11a02 3 1500 1271 +11a05 9 1503 1271 +11a0e 5 1506 1271 +11a13 5 1520 1271 +11a18 a 1523 1271 +11a22 2 1526 1271 +11a24 a 1528 1271 +11a2e 9 1532 1271 +11a37 6 1533 1271 +11a3d 9 1537 1271 +11a46 b 1541 1271 +11a51 9 1546 1271 +11a5a d 1548 1271 +11a67 3 1549 1271 +11a6a 5 1550 1271 +11a6f 3 1551 1271 +11a72 5 1553 1271 +11a77 8 1543 1271 +11a7f 7 1544 1271 +11a86 5 1557 1271 +11a8b 38 1378 1271 +11ac3 14 1908 1271 +11ad7 f 1910 1271 +11ae6 5 1665 1271 +11aeb a 1668 1271 +11af5 2 1671 1271 +11af7 a 1673 1271 +11b01 25 1677 1271 +11b26 5 1678 1271 +11b2b 9 1682 1271 +11b34 9 1688 1271 +11b3d 9 1702 1271 +11b46 7 1703 1271 +11b4d 2 1704 1271 +11b4f 5 1706 1271 +11b54 3 1708 1271 +11b57 5 1710 1271 +11b5c 7 1864 1271 +11b63 7 1869 1271 +11b6a f 1933 1271 +11b79 9 1936 1271 +11b82 e 1939 1271 +11b90 5 1942 1271 +11b95 1c 1739 1271 +11bb1 21 1109 1271 +11bd2 16 1749 1271 +11be8 9 1750 1271 +11bf1 7 1751 1271 +11bf8 3 1767 1271 +11bfb 5 1806 1271 +11c00 9 1809 1271 +11c09 2 1812 1271 +11c0b 5 1753 1271 +11c10 3 1754 1271 +11c13 a 1756 1271 +11c1d f 1759 1271 +11c2c 2 1760 1271 +11c2e 11 1765 1271 +11c3f a 1818 1271 +11c49 6 1821 1271 +11c4f 16 1822 1271 +11c65 26 1828 1271 +11c8b 16 1838 1271 +11ca1 17 1840 1271 +11cb8 a 1844 1271 +11cc2 17 1846 1271 +11cd9 8 1852 1271 +11ce1 a 1853 1271 +11ceb 3 1854 1271 +11cee 3 1857 1271 +11cf1 5 1859 1271 +11cf6 7 1877 1271 +11cfd 7 1887 1271 +11d04 2 1888 1271 +11d06 1a 1378 1271 +11d20 7 1892 1271 +11d27 14 1897 1271 +11d3b c 1900 1271 +11d47 7 1901 1271 +11d4e 5 1903 1271 +11d53 a 1944 1271 +11d5d 2c 1948 1271 +11d89 5 1949 1271 +11d8e 6 1961 1271 +11d94 3 1964 1271 +11d97 6 1970 1271 +11d9d a 1972 1271 +11da7 2c 1976 1271 +11dd3 5 1977 1271 +11dd8 c 1981 1271 +11de4 5 1987 1271 +11de9 4 2019 1271 +11ded 4 2020 1271 +11df1 5 2023 1271 +11df6 b 2026 1271 +11e01 5 2029 1271 +11e06 a 2031 1271 +11e10 f 2035 1271 +11e1f a 2040 1271 +11e29 2 2045 1271 +11e2b 5 2048 1271 +11e30 b 2051 1271 +11e3b 2 2054 1271 +11e3d a 2056 1271 +11e47 b 2060 1271 +11e52 a 2065 1271 +11e5c 2 2071 1271 +11e5e 4 2074 1271 +11e62 5 2077 1271 +11e67 a 2080 1271 +11e71 2 2083 1271 +11e73 a 2085 1271 +11e7d b 2089 1271 +11e88 a 2094 1271 +11e92 2 2099 1271 +11e94 5 2102 1271 +11e99 a 2105 1271 +11ea3 2 2108 1271 +11ea5 a 2110 1271 +11eaf 38 2114 1271 +11ee7 5 2115 1271 +11eec b 2119 1271 +11ef7 13 2128 1271 +11f0a 7 2129 1271 +11f11 a 2130 1271 +11f1b f 2136 1271 +11f2a 2 2142 1271 +11f2c 6 2148 1271 +11f32 7 2149 1271 +11f39 2 2150 1271 +11f3b 7 2151 1271 +11f42 a 2152 1271 +11f4c 3 2153 1271 +11f4f 6 2157 1271 +11f55 3 2158 1271 +11f58 6 2163 1271 +11f5e 10 2165 1271 +11f6e 10 2166 1271 +11f7e c 2168 1271 +11f8a 3 2170 1271 +11f8d 3 2172 1271 +11f90 2 2173 1271 +11f92 8 2175 1271 +11f9a 1 2176 1271 +11f9b 24 2180 1271 +11fbf 9 2181 1271 +11fc8 1 2182 1271 +11fc9 5 2185 1271 +11fce c 1594 1271 +11fda c 1598 1271 +11fe6 9 1603 1271 +11fef e 1635 1271 +11ffd 4 1636 1271 +12001 8 1637 1271 +12009 8 1639 1271 +12011 1c 1598 1271 +1202d 6 1640 1271 +12033 2 1641 1271 +12035 4 1640 1271 +12039 5 1642 1271 +1203e 2 1644 1271 +12040 5 1645 1271 +12045 8 1646 1271 +1204d 5 1647 1271 +12052 6 1648 1271 +12058 1 1649 1271 +12059 4 1648 1271 +1205d 6 1650 1271 +12063 10 2189 1271 +12073 a 2201 1271 +1207d a 2204 1271 +12087 6 2205 1271 +1208d 4 2207 1271 +12091 2 2208 1271 +12093 4 2210 1271 +12097 4 2212 1271 +1209b 2 2213 1271 +1209d 4 2215 1271 +120a1 4 2217 1271 +120a5 7 2218 1271 +120ac 9 2224 1271 +120b5 4 2228 1271 +120b9 11 2230 1271 +120ca 11 2234 1271 +120db 13 2236 1271 +120ee f 2238 1271 +120fd d 2243 1271 +1210a 3 2249 1271 +1210d 3 2250 1271 +12110 1e 2252 1271 +1212e 9 2253 1271 +12137 18 2257 1271 +1214f 2 2310 1271 +12151 4 2254 1271 +12155 2 2259 1271 +12157 d 2260 1271 +12164 f 2290 1271 +12173 f 2292 1271 +12182 6 2297 1271 +12188 8 2298 1271 +12190 15 2299 1271 +121a5 2 1073 1271 +121a7 f 2310 1271 +121b6 b 2314 1271 +121c1 10 2319 1271 +121d1 1d 2321 1271 +121ee 2 2360 1271 +121f0 3 2361 1271 +121f3 2 2362 1271 +121f5 2 2324 1271 +121f7 f 2325 1271 +12206 10 1043 1271 +12216 10 2376 1271 +12226 38 2377 1271 +FUNC 1225e c2 4 _putwch_nolock +1225e 11 84 4721 +1226f a 89 4721 +12279 9 91 4721 +12282 5 92 4721 +12287 a 96 4721 +12291 6 97 4721 +12297 16 103 4721 +122ad 14 105 4721 +122c1 6 106 4721 +122c7 1c 123 4721 +122e3 1e 129 4721 +12301 2 131 4721 +12303 4 133 4721 +12307 d 134 4721 +12314 a 110 4721 +1231e 2 113 4721 +FUNC 12320 9b 4 _cputws +12320 c 151 4721 +1232c 5 153 4721 +12331 30 155 4721 +12361 b 157 4721 +1236c 9 158 4721 +12375 3 159 4721 +12378 a 160 4721 +12382 17 162 4721 +12399 4 164 4721 +1239d c 169 4721 +123a9 3 172 4721 +123ac 6 173 4721 +123b2 9 170 4721 +FUNC 123bb 46 4 _putwch +123bb c 49 4721 +123c7 8 52 4721 +123cf 4 53 4721 +123d3 f 55 4721 +123e2 c 58 4721 +123ee 4 62 4721 +123f2 6 63 4721 +123f8 9 59 4721 +FUNC 12401 113 10 _mbtowc_l +12401 8 55 6355 +12409 e 56 6355 +12417 4 61 6355 +1241b 7 64 6355 +12422 3 65 6355 +12425 4 59 6355 +12429 2 116 6355 +1242b b 70 6355 +12436 8 73 6355 +1243e 7 75 6355 +12445 7 76 6355 +1244c 11 77 6355 +1245d 13 80 6355 +12470 33 90 6355 +124a3 10 93 6355 +124b3 1b 99 6355 +124ce b 95 6355 +124d9 14 96 6355 +124ed 25 108 6355 +12512 2 111 6355 +FUNC 12514 17 c mbtowc +12514 0 123 6355 +12514 16 124 6355 +1252a 1 125 6355 +FUNC 1252b 83 10 _lseeki64_nolock +1252b 5 120 4872 +12530 4 126 4872 +12534 1b 134 4872 +1254f b 136 4872 +1255a 6 138 4872 +12560 22 146 4872 +12582 7 148 4872 +12589 2 149 4872 +1258b 19 152 4872 +125a4 8 153 4872 +125ac 2 154 4872 +FUNC 125ae 119 10 _lseeki64 +125ae c 73 4872 +125ba 9 74 4872 +125c3 24 77 4872 +125e7 2f 78 4872 +12616 46 79 4872 +1265c 7 81 4872 +12663 3 82 4872 +12666 9 84 4872 +1266f 1a 85 4872 +12689 2 86 4872 +1268b b 87 4872 +12696 7 88 4872 +1269d 8 89 4872 +126a5 c 93 4872 +126b1 6 97 4872 +126b7 6 98 4872 +126bd a 94 4872 +FUNC 126c7 7d 8 _set_osfhnd +126c7 0 213 4825 +126c7 2e 216 4825 +126f5 e 217 4825 +12703 b 218 4825 +1270e 3 226 4825 +12711 2 227 4825 +12713 3 223 4825 +12716 2 224 4825 +12718 9 220 4825 +12721 5 231 4825 +12726 5 232 4825 +1272b b 234 4825 +12736 8 235 4825 +1273e 5 236 4825 +12743 1 238 4825 +FUNC 12744 81 4 _free_osfhnd +12744 0 263 4825 +12744 38 266 4825 +1277c 9 268 4825 +12785 a 269 4825 +1278f 3 277 4825 +12792 2 278 4825 +12794 3 274 4825 +12797 2 275 4825 +12799 9 271 4825 +127a2 6 282 4825 +127a8 4 283 4825 +127ac b 285 4825 +127b7 7 286 4825 +127be 6 287 4825 +127c4 1 289 4825 +FUNC 127c5 71 4 _get_osfhandle +127c5 0 312 4825 +127c5 1f 313 4825 +127e4 2 318 4825 +127e6 e 314 4825 +127f4 3d 315 4825 +12831 1 318 4825 +12832 3 317 4825 +12835 1 318 4825 +FUNC 12836 a0 4 __lock_fhandle +12836 c 437 4825 +12842 17 438 4825 +12859 7 439 4825 +12860 7 444 4825 +12867 8 446 4825 +1286f 3 447 4825 +12872 5 448 4825 +12877 14 449 4825 +1288b 3 453 4825 +1288e 3 455 4825 +12891 c 457 4825 +1289d 5 462 4825 +128a2 1d 464 4825 +128bf 3 467 4825 +128c2 6 468 4825 +128c8 5 457 4825 +128cd 9 458 4825 +FUNC 128d6 22 4 _unlock_fhandle +128d6 0 489 4825 +128d6 21 490 4825 +128f7 1 491 4825 +FUNC 128f8 19f 0 _alloc_osfhnd +128f8 c 52 4825 +12904 4 53 4825 +12908 5 56 4825 +1290d c 58 4825 +12919 8 59 4825 +12921 8 61 4825 +12929 3 62 4825 +1292c c 71 4825 +12938 f 77 4825 +12947 17 83 4825 +1295e 6 85 4825 +12964 6 89 4825 +1296a 8 90 4825 +12972 6 91 4825 +12978 6 92 4825 +1297e 14 93 4825 +12992 3 99 4825 +12995 2 101 4825 +12997 3 103 4825 +1299a 9 106 4825 +129a3 6 111 4825 +129a9 a 113 4825 +129b3 6 119 4825 +129b9 7 120 4825 +129c0 5 83 4825 +129c5 6 106 4825 +129cb 9 107 4825 +129d4 6 124 4825 +129da 4 126 4825 +129de 3 127 4825 +129e1 19 128 4825 +129fa 6 137 4825 +12a00 6 71 4825 +12a06 12 145 4825 +12a18 9 151 4825 +12a21 7 152 4825 +12a28 c 154 4825 +12a34 4 155 4825 +12a38 3 156 4825 +12a3b 4 157 4825 +12a3f 4 158 4825 +12a43 8 154 4825 +12a4b 6 165 4825 +12a51 19 166 4825 +12a6a b 167 4825 +12a75 4 171 4825 +12a79 c 178 4825 +12a85 3 186 4825 +12a88 6 187 4825 +12a8e 9 179 4825 +FUNC 12a97 115 8 _open_osfhandle +12a97 c 343 4825 +12aa3 5 347 4825 +12aa8 2 351 4825 +12aaa 6 353 4825 +12ab0 3 354 4825 +12ab3 8 356 4825 +12abb 3 357 4825 +12abe 6 359 4825 +12ac4 3 360 4825 +12ac7 9 364 4825 +12ad0 4 365 4825 +12ad4 d 367 4825 +12ae1 3 409 4825 +12ae4 6 410 4825 +12aea 5 372 4825 +12aef 5 373 4825 +12af4 5 374 4825 +12af9 3 375 4825 +12afc f 380 4825 +12b0b b 381 4825 +12b16 7 382 4825 +12b1d 2 383 4825 +12b1f 3 385 4825 +12b22 b 391 4825 +12b2d 3 393 4825 +12b30 1a 395 4825 +12b4a 9 396 4825 +12b53 9 397 4825 +12b5c 7 399 4825 +12b63 c 401 4825 +12b6f 10 409 4825 +12b7f 5 401 4825 +12b84 5 402 4825 +12b89 1b 404 4825 +12ba4 8 406 4825 +FUNC 12bac 11e c _calloc_impl +12bac c 23 5592 +12bb8 9 28 5592 +12bc1 2e 30 5592 +12bef 9 32 5592 +12bf8 4 36 5592 +12bfc 3 37 5592 +12bff 5 41 5592 +12c04 5 43 5592 +12c09 9 46 5592 +12c12 9 50 5592 +12c1b b 52 5592 +12c26 8 56 5592 +12c2e 3 57 5592 +12c31 c 58 5592 +12c3d c 60 5592 +12c49 7 64 5592 +12c50 d 65 5592 +12c5d 4 93 5592 +12c61 11 94 5592 +12c72 c 97 5592 +12c7e f 109 5592 +12c8d b 111 5592 +12c98 6 112 5592 +12c9e 5 113 5592 +12ca3 5 60 5592 +12ca8 9 61 5592 +12cb1 4 100 5592 +12cb5 7 102 5592 +12cbc 6 103 5592 +12cc2 2 105 5592 +12cc4 6 119 5592 +FUNC 12cca 3f 8 calloc +12cca 4 145 5592 +12cce 5 146 5592 +12cd3 14 147 5592 +12ce7 15 149 5592 +12cfc 8 151 5592 +12d04 3 153 5592 +12d07 2 154 5592 +FUNC 12d09 21b 8 realloc +12d09 c 64 5338 +12d15 7 69 5338 +12d1c e 70 5338 +12d2a 7 73 5338 +12d31 7 75 5338 +12d38 5 76 5338 +12d3d d 81 5338 +12d4a 5 88 5338 +12d4f 9 89 5338 +12d58 8 91 5338 +12d60 3 92 5338 +12d63 12 96 5338 +12d75 8 100 5338 +12d7d f 102 5338 +12d8c 5 103 5338 +12d91 e 104 5338 +12d9f 4 107 5338 +12da3 10 108 5338 +12db3 9 110 5338 +12dbc a 111 5338 +12dc6 5 118 5338 +12dcb 4 120 5338 +12dcf 6 121 5338 +12dd5 9 123 5338 +12dde 15 124 5338 +12df3 4 127 5338 +12df7 10 128 5338 +12e07 c 129 5338 +12e13 c 135 5338 +12e1f 6 142 5338 +12e25 4 144 5338 +12e29 1 145 5338 +12e2a 9 147 5338 +12e33 14 148 5338 +12e47 6 135 5338 +12e4d 9 137 5338 +12e56 3 148 5338 +12e59 10 158 5338 +12e69 f 181 5338 +12e78 5 186 5338 +12e7d 5 183 5338 +12e82 11 186 5338 +12e93 2 188 5338 +12e95 8 160 5338 +12e9d 5 170 5338 +12ea2 3 167 5338 +12ea5 2 172 5338 +12ea7 6 174 5338 +12ead 2 155 5338 +12eaf 4 321 5338 +12eb3 1 322 5338 +12eb4 12 323 5338 +12ec6 c 332 5338 +12ed2 b 347 5338 +12edd 5 319 5338 +12ee2 7 327 5338 +12ee9 b 328 5338 +12ef4 2 329 5338 +12ef6 6 356 5338 +12efc 5 349 5338 +12f01 5 350 5338 +12f06 4 334 5338 +12f0a 16 341 5338 +12f20 4 343 5338 +FUNC 12f24 79 c _recalloc +12f24 3 744 5338 +12f27 a 749 5338 +12f31 28 751 5338 +12f59 4 753 5338 +12f5d 9 754 5338 +12f66 b 755 5338 +12f71 b 756 5338 +12f7c a 757 5338 +12f86 10 759 5338 +12f96 5 761 5338 +12f9b 2 762 5338 +FUNC 12f9d 21 0 _get_sbh_threshold +12f9d 0 61 5281 +12f9d 9 64 5281 +12fa6 2 66 5281 +12fa8 1 81 5281 +12fa9 14 69 5281 +12fbd 1 81 5281 +FUNC 12fbe 46 4 _set_amblksiz +12fbe 0 214 5281 +12fbe 2b 216 5281 +12fe9 1 224 5281 +12fea 11 217 5281 +12ffb 5 220 5281 +13000 3 223 5281 +13003 1 224 5281 +FUNC 13004 3c 4 _get_amblksiz +13004 0 243 5281 +13004 27 245 5281 +1302b 1 253 5281 +1302c 8 246 5281 +13034 8 249 5281 +1303c 3 252 5281 +1303f 1 253 5281 +FUNC 13040 48 4 __sbh_heap_init +13040 0 274 5281 +13040 1c 275 5281 +1305c 1 285 5281 +1305d 4 278 5281 +13061 7 280 5281 +13068 c 281 5281 +13074 13 284 5281 +13087 1 285 5281 +FUNC 13088 2b 4 __sbh_find_block +13088 0 306 5281 +13088 12 307 5281 +1309a 7 316 5281 +130a1 8 317 5281 +130a9 3 319 5281 +130ac 4 314 5281 +130b0 2 321 5281 +130b2 1 322 5281 +FUNC 130b3 314 8 __sbh_free_block +130b3 6 381 5281 +130b9 7 399 5281 +130c0 9 402 5281 +130c9 18 407 5281 +130e1 3 408 5281 +130e4 d 412 5281 +130f1 3 416 5281 +130f4 5 417 5281 +130f9 6 420 5281 +130ff b 424 5281 +1310a 4 429 5281 +1310e 5 430 5281 +13113 3 431 5281 +13116 8 434 5281 +1311e 3 439 5281 +13121 b 441 5281 +1312c e 442 5281 +1313a 5 443 5281 +1313f 2 445 5281 +13141 5 448 5281 +13146 11 449 5281 +13157 9 450 5281 +13160 9 455 5281 +13169 15 459 5281 +1317e 6 463 5281 +13184 5 464 5281 +13189 3 465 5281 +1318c f 468 5281 +1319b 3 474 5281 +1319e 6 477 5281 +131a4 b 478 5281 +131af 2 479 5281 +131b1 3 483 5281 +131b4 6 484 5281 +131ba 7 485 5281 +131c1 2 486 5281 +131c3 4 489 5281 +131c7 b 493 5281 +131d2 3 498 5281 +131d5 11 501 5281 +131e6 6 502 5281 +131ec 5 503 5281 +131f1 2 505 5281 +131f3 e 508 5281 +13201 6 509 5281 +13207 6 511 5281 +1320d c 516 5281 +13219 c 517 5281 +13225 8 520 5281 +1322d e 524 5281 +1323b 6 528 5281 +13241 3 529 5281 +13244 6 530 5281 +1324a 3 531 5281 +1324d 6 532 5281 +13253 8 535 5281 +1325b 18 541 5281 +13273 e 542 5281 +13281 f 543 5281 +13290 2 545 5281 +13292 6 547 5281 +13298 10 548 5281 +132a8 13 550 5281 +132bb 5 556 5281 +132c0 4 558 5281 +132c4 b 561 5281 +132cf d 564 5281 +132dc 6 568 5281 +132e2 1a 569 5281 +132fc 15 573 5281 +13311 16 577 5281 +13327 19 578 5281 +13340 9 579 5281 +13349 6 583 5281 +1334f 8 586 5281 +13357 16 589 5281 +1336d 25 595 5281 +13392 14 599 5281 +133a6 4 600 5281 +133aa a 603 5281 +133b4 8 608 5281 +133bc 9 609 5281 +133c5 2 611 5281 +FUNC 133c7 b0 0 __sbh_alloc_new_region +133c7 0 891 5281 +133c7 13 897 5281 +133da 1e 900 5281 +133f8 4 901 5281 +133fc 12 905 5281 +1340e 9 909 5281 +13417 18 913 5281 +1342f 2 914 5281 +13431 1a 918 5281 +1344b 10 920 5281 +1345b 2 921 5281 +1345d 9 927 5281 +13466 6 930 5281 +1346c 6 933 5281 +13472 4 935 5281 +13476 1 936 5281 +FUNC 13477 106 4 __sbh_alloc_new_group +13477 5 958 5281 +1347c 3 959 5281 +1347f 9 972 5281 +13488 4 973 5281 +1348c 2 976 5281 +1348e 1 977 5281 +1348f 4 974 5281 +13493 15 981 5281 +134a8 c 986 5281 +134b4 1f 993 5281 +134d3 8 994 5281 +134db 6 998 5281 +134e1 12 1001 5281 +134f3 4 1004 5281 +134f7 7 1005 5281 +134fe 8 1011 5281 +13506 10 1013 5281 +13516 12 1016 5281 +13528 3 1001 5281 +1352b 8 1021 5281 +13533 6 1023 5281 +13539 3 1024 5281 +1353c 6 1027 5281 +13542 3 1028 5281 +13545 5 1030 5281 +1354a a 1031 5281 +13554 9 1032 5281 +1355d b 1033 5281 +13568 e 1036 5281 +13576 5 1038 5281 +1357b 2 1039 5281 +FUNC 1357d 2df c __sbh_resize_block +1357d 6 1061 5281 +13583 c 1080 5281 +1358f b 1083 5281 +1359a 3 1084 5281 +1359d 12 1085 5281 +135af 7 1089 5281 +135b6 14 1096 5281 +135ca 13 1099 5281 +135dd 7 1105 5281 +135e4 8 1106 5281 +135ec 6 1107 5281 +135f2 8 1110 5281 +135fa 3 1115 5281 +135fd 9 1117 5281 +13606 11 1118 5281 +13617 5 1119 5281 +1361c 2 1121 5281 +1361e 5 1124 5281 +13623 14 1125 5281 +13637 6 1126 5281 +1363d 9 1131 5281 +13646 9 1132 5281 +1364f 12 1135 5281 +13661 a 1141 5281 +1366b 9 1142 5281 +13674 3 1143 5281 +13677 9 1147 5281 +13680 6 1148 5281 +13686 6 1149 5281 +1368c 3 1150 5281 +1368f 6 1151 5281 +13695 8 1154 5281 +1369d 18 1160 5281 +136b5 e 1161 5281 +136c3 6 1162 5281 +136c9 2 1164 5281 +136cb 6 1166 5281 +136d1 10 1167 5281 +136e1 13 1169 5281 +136f4 c 1174 5281 +13700 9 1176 5281 +13709 6 1180 5281 +1370f 9 1182 5281 +13718 7 1100 5281 +1371f 6 1186 5281 +13725 3 1189 5281 +13728 d 1195 5281 +13735 7 1198 5281 +1373c b 1199 5281 +13747 3 1200 5281 +1374a a 1203 5281 +13754 7 1208 5281 +1375b 5 1209 5281 +13760 3 1210 5281 +13763 8 1213 5281 +1376b 3 1218 5281 +1376e b 1221 5281 +13779 e 1222 5281 +13787 5 1223 5281 +1378c 2 1225 5281 +1378e 5 1228 5281 +13793 11 1229 5281 +137a4 9 1231 5281 +137ad 9 1236 5281 +137b6 9 1237 5281 +137bf 9 1240 5281 +137c8 4 1241 5281 +137cc 5 1242 5281 +137d1 3 1243 5281 +137d4 6 1249 5281 +137da 3 1250 5281 +137dd 6 1251 5281 +137e3 3 1252 5281 +137e6 6 1253 5281 +137ec 8 1256 5281 +137f4 18 1262 5281 +1380c e 1263 5281 +1381a 6 1264 5281 +13820 2 1266 5281 +13822 6 1268 5281 +13828 10 1269 5281 +13838 13 1271 5281 +1384b 5 1276 5281 +13850 4 1278 5281 +13854 6 1281 5281 +1385a 2 1282 5281 +FUNC 1385c cd 0 __sbh_heapmin +1385c 0 1302 5281 +1385c d 1306 5281 +13869 6 1310 5281 +1386f 17 1311 5281 +13886 15 1314 5281 +1389b 16 1318 5281 +138b1 19 1319 5281 +138ca 9 1320 5281 +138d3 f 1325 5281 +138e2 11 1328 5281 +138f3 28 1333 5281 +1391b 6 1334 5281 +13921 7 1338 5281 +13928 1 1340 5281 +FUNC 13929 2e2 0 __sbh_heap_check +13929 3 1361 5281 +1392c 12 1391 5281 +1393e 8 1393 5281 +13946 16 1398 5281 +1395c 3 1401 5281 +1395f 8 1402 5281 +13967 6 1406 5281 +1396d 9 1407 5281 +13976 c 1408 5281 +13982 3 1409 5281 +13985 3 1410 5281 +13988 6 1411 5281 +1398e 4 1418 5281 +13992 1b 1421 5281 +139ad 9 1424 5281 +139b6 9 1428 5281 +139bf 1c 1438 5281 +139db 2 1445 5281 +139dd 7 1446 5281 +139e4 1 1449 5281 +139e5 c 1452 5281 +139f1 3 1456 5281 +139f4 2 1458 5281 +139f6 6 1462 5281 +139fc 5 1463 5281 +13a01 3 1464 5281 +13a04 9 1465 5281 +13a0d 1e 1470 5281 +13a2b c 1475 5281 +13a37 2 1479 5281 +13a39 4 1481 5281 +13a3d 6 1484 5281 +13a43 10 1488 5281 +13a53 e 1492 5281 +13a61 2 1498 5281 +13a63 4 1502 5281 +13a67 20 1505 5281 +13a87 19 1509 5281 +13aa0 8 1514 5281 +13aa8 3 1518 5281 +13aab 6 1520 5281 +13ab1 8 1524 5281 +13ab9 4 1527 5281 +13abd e 1532 5281 +13acb 8 1536 5281 +13ad3 6 1541 5281 +13ad9 5 1542 5281 +13ade 3 1543 5281 +13ae1 8 1544 5281 +13ae9 c 1549 5281 +13af5 11 1554 5281 +13b06 6 1559 5281 +13b0c 3 1561 5281 +13b0f e 1563 5281 +13b1d 3 1564 5281 +13b20 2 1566 5281 +13b22 8 1568 5281 +13b2a 3 1569 5281 +13b2d 1c 1575 5281 +13b49 c 1580 5281 +13b55 10 1585 5281 +13b65 17 1591 5281 +13b7c 7 1595 5281 +13b83 7 1596 5281 +13b8a 16 1597 5281 +13ba0 f 1602 5281 +13baf 18 1606 5281 +13bc7 5 1608 5281 +13bcc 2 1609 5281 +13bce 4 1403 5281 +13bd2 4 1425 5281 +13bd6 4 1453 5281 +13bda 4 1485 5281 +13bde 4 1471 5281 +13be2 4 1439 5281 +13be6 4 1493 5281 +13bea 4 1537 5281 +13bee 4 1545 5281 +13bf2 4 1550 5281 +13bf6 4 1510 5281 +13bfa 4 1581 5281 +13bfe 4 1576 5281 +13c02 4 1592 5281 +13c06 5 1603 5281 +FUNC 13c0b a8 4 _set_sbh_threshold +13c0b 1 102 5281 +13c0c a 104 5281 +13c16 3 106 5281 +13c19 1 195 5281 +13c1a a 109 5281 +13c24 25 112 5281 +13c49 5 113 5281 +13c4e 4 114 5281 +13c52 2 195 5281 +13c54 6 173 5281 +13c5a 2 175 5281 +13c5c 5 179 5281 +13c61 2d 185 5281 +13c8e 6 186 5281 +13c94 a 187 5281 +13c9e 5 188 5281 +13ca3 b 193 5281 +13cae 4 194 5281 +13cb2 1 195 5281 +FUNC 13cb3 2e3 4 __sbh_alloc_block +13cb3 6 632 5281 +13cb9 5 633 5281 +13cbe 15 650 5281 +13cd3 5 668 5281 +13cd8 7 669 5281 +13cdf 5 671 5281 +13ce4 4 672 5281 +13ce8 2 674 5281 +13cea d 677 5281 +13cf7 a 682 5281 +13d01 e 686 5281 +13d0f 3 688 5281 +13d12 2 683 5281 +13d14 5 688 5281 +13d19 4 692 5281 +13d1d 8 694 5281 +13d25 e 698 5281 +13d33 3 700 5281 +13d36 2 695 5281 +13d38 5 700 5281 +13d3d 6 705 5281 +13d43 6 709 5281 +13d49 6 711 5281 +13d4f 4 707 5281 +13d53 4 715 5281 +13d57 8 717 5281 +13d5f 6 720 5281 +13d65 3 722 5281 +13d68 2 718 5281 +13d6a 5 722 5281 +13d6f 4 726 5281 +13d73 e 727 5281 +13d81 7 728 5281 +13d88 12 733 5281 +13d9a 2 734 5281 +13d9c 6 737 5281 +13da2 3 739 5281 +13da5 2 740 5281 +13da7 1c 745 5281 +13dc3 4 749 5281 +13dc7 14 751 5281 +13ddb e 752 5281 +13de9 3 751 5281 +13dec 12 754 5281 +13dfe a 760 5281 +13e08 d 763 5281 +13e15 2 768 5281 +13e17 2 767 5281 +13e19 1 768 5281 +13e1a 4 765 5281 +13e1e 7 770 5281 +13e25 5 775 5281 +13e2a 6 776 5281 +13e30 8 777 5281 +13e38 3 778 5281 +13e3b 8 781 5281 +13e43 8 784 5281 +13e4b 3 788 5281 +13e4e e 791 5281 +13e5c 15 792 5281 +13e71 8 793 5281 +13e79 2 795 5281 +13e7b f 798 5281 +13e8a f 799 5281 +13e99 e 800 5281 +13ea7 1c 809 5281 +13ec3 6 813 5281 +13ec9 3 814 5281 +13ecc 6 815 5281 +13ed2 3 816 5281 +13ed5 6 817 5281 +13edb 8 820 5281 +13ee3 18 826 5281 +13efb b 827 5281 +13f06 10 829 5281 +13f16 2 831 5281 +13f18 6 833 5281 +13f1e d 835 5281 +13f2b 16 837 5281 +13f41 3 831 5281 +13f44 4 844 5281 +13f48 2 846 5281 +13f4a 9 848 5281 +13f53 a 853 5281 +13f5d 4 855 5281 +13f61 e 858 5281 +13f6f 13 862 5281 +13f82 7 863 5281 +13f89 5 866 5281 +13f8e 6 868 5281 +13f94 2 869 5281 +FUNC 13f96 72 4 _fclose_nolock +13f96 2 86 1752 +13f98 2a 90 1752 +13fc2 6 96 1752 +13fc8 6 105 1752 +13fce 8 106 1752 +13fd6 13 108 1752 +13fe9 5 109 1752 +13fee 7 111 1752 +13ff5 7 120 1752 +13ffc 3 121 1752 +13fff 3 126 1752 +14002 5 127 1752 +14007 1 128 1752 +FUNC 14008 7c 4 fclose +14008 c 44 1752 +14014 4 45 1752 +14018 2d 47 1752 +14045 6 50 1752 +1404b 3 51 1752 +1404e 3 64 1752 +14051 6 65 1752 +14057 7 55 1752 +1405e 3 56 1752 +14061 a 57 1752 +1406b 11 59 1752 +1407c 8 60 1752 +FUNC 14084 d 8 _ValidateRead(void const *,unsigned int) +14084 0 63 5683 +14084 3 64 5683 +14087 7 65 5683 +1408e 2 68 5683 +14090 1 71 5683 +FUNC 14091 d 8 _ValidateWrite(void *,unsigned int) +14091 0 74 5683 +14091 3 75 5683 +14094 7 76 5683 +1409b 2 79 5683 +1409d 1 82 5683 +FUNC 1409e d 4 _ValidateExecute(int (*)(void)) +1409e 0 85 5683 +1409e 3 86 5683 +140a1 7 87 5683 +140a8 2 90 5683 +140aa 1 93 5683 +FUNC 140ab f3 0 abort +140ab 1b 53 4119 +140c6 a 56 4119 +140d0 8 59 4119 +140d8 5 68 4119 +140dd 4 69 4119 +140e1 8 71 4119 +140e9 d 78 4119 +140f6 6 87 4119 +140fc 6 88 4119 +14102 6 89 4119 +14108 3 90 4119 +1410b 3 91 4119 +1410e 3 92 4119 +14111 7 93 4119 +14118 7 94 4119 +1411f 4 95 4119 +14123 4 96 4119 +14127 4 97 4119 +1412b 4 98 4119 +1412f 1 99 4119 +14130 6 100 4119 +14136 6 106 4119 +1413c 19 107 4119 +14155 3 109 4119 +14158 13 117 4119 +1416b 9 122 4119 +14174 3 123 4119 +14177 15 126 4119 +1418c a 128 4119 +14196 8 137 4119 +FUNC 1419e 1e 8 _set_abort_behavior +1419e 0 158 4119 +1419e 1d 160 4119 +141bb 1 162 4119 +FUNC 141bc 20 0 _global_unwind2 +FUNC 141dc 45 0 __unwind_handler +FUNC 14221 84 0 _local_unwind2 +FUNC 142a5 23 0 _abnormal_termination +FUNC 142c8 9 0 _NLG_Notify1 +FUNC 142d1 1f 0 _NLG_Notify +PUBLIC 142e8 0 _NLG_Dispatch2 +FUNC 142f0 3 0 _NLG_Call +PUBLIC 142f2 0 _NLG_Return2 +FUNC 142f3 a3 4 _msize +142f3 c 43 5383 +142ff 2d 47 5383 +1432c 9 51 5383 +14335 8 55 5383 +1433d 3 56 5383 +14340 e 57 5383 +1434e e 59 5383 +1435c c 61 5383 +14368 5 64 5383 +1436d 10 88 5383 +1437d 2 91 5383 +1437f 6 93 5383 +14385 8 61 5383 +1438d 9 62 5383 +FUNC 14396 6 0 HeapManager::Block::Block() +14396 6 90 5771 +FUNC 1439c 1b 8 HeapManager::Constructor(void * (*)(unsigned int),void (*)(void *)) +1439c 6 100 5771 +143a2 7 101 5771 +143a9 5 102 5771 +143ae 3 103 5771 +143b1 3 104 5771 +143b4 3 105 5771 +FUNC 143b7 26 0 HeapManager::Destructor() +143b7 9 110 5771 +143c0 2 111 5771 +143c2 5 113 5771 +143c7 15 115 5771 +143dc 1 118 5771 +FUNC 143dd 63 0 UnDecorator::getNumberOfDimensions() +143dd 0 1663 5771 +143dd c 1664 5771 +143e9 2 1665 5771 +143eb 1 1696 5771 +143ec a 1666 5771 +143f6 d 1667 5771 +14403 1 1696 5771 +14404 4 1670 5771 +14408 4 1677 5771 +1440c a 1679 5771 +14416 6 1680 5771 +1441c d 1684 5771 +14429 5 1675 5771 +1442e e 1690 5771 +1443c 3 1691 5771 +1443f 1 1696 5771 +FUNC 14440 474 0 UnDecorator::getTypeEncoding() +14440 f 2335 5771 +1444f 2 2336 5771 +14451 5 2341 5771 +14456 9 2345 5771 +1445f c 2351 5771 +1446b 9 2423 5771 +14474 2 2426 5771 +14476 2a 2427 5771 +144a0 8 2450 5771 +144a8 2 2451 5771 +144aa 24 2454 5771 +144ce 7 2462 5771 +144d5 5 2463 5771 +144da 6 2353 5771 +144e0 8 2358 5771 +144e8 b 2362 5771 +144f3 5 2363 5771 +144f8 2 2364 5771 +144fa 5 2365 5771 +144ff 9 2369 5771 +14508 1b 2373 5771 +14523 11 2377 5771 +14534 a 2393 5771 +1453e 10 2388 5771 +1454e 2 2389 5771 +14550 18 2384 5771 +14568 2 2385 5771 +1456a 12 2380 5771 +1457c 16 2399 5771 +14592 11 2418 5771 +145a3 a 2406 5771 +145ad 5 2407 5771 +145b2 15 2410 5771 +145c7 5 2422 5771 +145cc 1b 2427 5771 +145e7 a 2430 5771 +145f1 5 2431 5771 +145f6 7 2472 5771 +145fd a 2478 5771 +14607 c 2483 5771 +14613 5 2485 5771 +14618 5 2486 5771 +1461d 5 2487 5771 +14622 5 2490 5771 +14627 5 2505 5771 +1462c 5 2508 5771 +14631 5 2509 5771 +14636 5 2434 5771 +1463b 5 2435 5771 +14640 1a 2427 5771 +1465a 30 2568 5771 +1468a 5 2529 5771 +1468f 4 2530 5771 +14693 a 2531 5771 +1469d 2 2532 5771 +1469f a 2533 5771 +146a9 5 2537 5771 +146ae 5 2538 5771 +146b3 2 2539 5771 +146b5 5 2540 5771 +146ba e 2544 5771 +146c8 6 2560 5771 +146ce 10 2555 5771 +146de 2 2556 5771 +146e0 18 2551 5771 +146f8 2 2552 5771 +146fa 12 2547 5771 +1470c 2 2564 5771 +1470e a 2442 5771 +14718 2 2443 5771 +1471a a 2438 5771 +14724 2 2439 5771 +14726 5 2445 5771 +1472b c 2574 5771 +14737 14 2577 5771 +1474b a 2579 5771 +14755 18 2586 5771 +1476d 1a 2589 5771 +14787 1b 2590 5771 +147a2 5 2591 5771 +147a7 1a 2594 5771 +147c1 1b 2595 5771 +147dc 5 2596 5771 +147e1 1a 2599 5771 +147fb 10 2600 5771 +1480b 2 2601 5771 +1480d 7 2604 5771 +14814 2 2605 5771 +14816 a 2608 5771 +14820 2 2609 5771 +14822 a 2612 5771 +1482c 2 2613 5771 +1482e a 2616 5771 +14838 2 2617 5771 +1483a a 2620 5771 +14844 2 2621 5771 +14846 a 2624 5771 +14850 7 2634 5771 +14857 7 2635 5771 +1485e 7 2637 5771 +14865 10 2639 5771 +14875 3f 2648 5771 +FUNC 148b4 b 0 UnDecorator::doUnderScore() +148b4 b 4259 5771 +FUNC 148bf d 0 UnDecorator::doMSKeywords() +148bf d 4260 5771 +FUNC 148cc e 0 UnDecorator::doPtr64() +148cc e 4261 5771 +FUNC 148da e 0 UnDecorator::doFunctionReturns() +148da e 4262 5771 +FUNC 148e8 e 0 UnDecorator::doAllocationModel() +148e8 e 4263 5771 +FUNC 148f6 e 0 UnDecorator::doAllocationLanguage() +148f6 e 4264 5771 +FUNC 14904 12 0 UnDecorator::doThisTypes() +14904 12 4271 5771 +FUNC 14916 e 0 UnDecorator::doAccessSpecifiers() +14916 e 4272 5771 +FUNC 14924 e 0 UnDecorator::doThrowTypes() +14924 e 4273 5771 +FUNC 14932 e 0 UnDecorator::doMemberTypes() +14932 e 4274 5771 +FUNC 14940 b 0 UnDecorator::doNameOnly() +14940 b 4279 5771 +FUNC 1494b b 0 UnDecorator::doTypeOnly() +1494b b 4280 5771 +FUNC 14956 b 0 UnDecorator::haveTemplateParameters() +14956 b 4281 5771 +FUNC 14961 e 0 UnDecorator::doEcsu() +14961 e 4282 5771 +FUNC 1496f b 0 UnDecorator::doNoIdentCharCheck() +1496f b 4283 5771 +FUNC 1497a e 0 UnDecorator::doEllipsis() +1497a e 4284 5771 +FUNC 14988 19 4 UnDecorator::UScore(Tokens) +14988 0 4288 5771 +14988 9 4293 5771 +14991 d 4294 5771 +1499e 2 4296 5771 +149a0 1 4298 5771 +FUNC 149a1 84 8 HeapManager::getMemory(unsigned int,int) +149a1 2 134 5804 +149a3 a 137 5804 +149ad 9 139 5804 +149b6 6 140 5804 +149bc 4 146 5804 +149c0 3 147 5804 +149c3 8 149 5804 +149cb 7 153 5804 +149d2 2 154 5804 +149d4 1c 159 5804 +149f0 4 164 5804 +149f4 7 168 5804 +149fb 2 169 5804 +149fd 2 170 5804 +149ff 3 171 5804 +14a02 8 175 5804 +14a0a 2 182 5804 +14a0c 4 179 5804 +14a10 5 183 5804 +14a15 d 187 5804 +14a22 3 190 5804 +FUNC 14a25 d 0 DName::DName() +14a25 2 210 5804 +14a27 3 211 5804 +14a2a 7 220 5804 +14a31 1 221 5804 +FUNC 14a32 12 4 DName::DName(DNameNode *) +14a32 2 224 5804 +14a34 4 225 5804 +14a38 9 234 5804 +14a41 3 235 5804 +FUNC 14a44 9c 4 DName::DName(DName const &) +14a44 2 259 5804 +14a46 17 260 5804 +14a5d 10 261 5804 +14a6d d 262 5804 +14a7a d 263 5804 +14a87 10 264 5804 +14a97 4 265 5804 +14a9b e 266 5804 +14aa9 13 267 5804 +14abc 10 268 5804 +14acc 11 269 5804 +14add 3 270 5804 +FUNC 14ae0 a 0 DName::status() +14ae0 a 481 5804 +FUNC 14aea 5 0 DName::clearStatus() +14aea 5 482 5804 +FUNC 14aef 7 0 DName::setPtrRef() +14aef 7 484 5804 +FUNC 14af6 a 0 DName::isPtrRef() +14af6 a 485 5804 +FUNC 14b00 8 0 DName::setIsArray() +14b00 8 490 5804 +FUNC 14b08 a 0 DName::isArray() +14b08 a 491 5804 +FUNC 14b12 a 0 DName::isNoTE() +14b12 a 492 5804 +FUNC 14b1c 8 0 DName::setIsNoTE() +14b1c 8 493 5804 +FUNC 14b24 a 0 DName::isPinPtr() +14b24 a 494 5804 +FUNC 14b2e 8 0 DName::setIsPinPtr() +14b2e 8 495 5804 +FUNC 14b36 a 0 DName::isComArray() +14b36 a 496 5804 +FUNC 14b40 8 0 DName::setIsComArray() +14b40 8 497 5804 +FUNC 14b48 a 0 DName::isVCallThunk() +14b48 a 498 5804 +FUNC 14b52 8 0 DName::setIsVCallThunk() +14b52 8 499 5804 +FUNC 14b5a 7b 4 DName::operator=(DName const &) +14b5a 3 879 5804 +14b5d 12 880 5804 +14b6f 17 882 5804 +14b86 d 883 5804 +14b93 d 884 5804 +14ba0 d 885 5804 +14bad 10 886 5804 +14bbd 10 887 5804 +14bcd 5 889 5804 +14bd2 3 897 5804 +FUNC 14bd5 9 0 Replicator::isFull() +14bd5 9 1001 5804 +FUNC 14bde 25 4 Replicator::operator[](int) +14bde 0 1028 5804 +14bde 9 1029 5804 +14be7 b 1031 5804 +14bf2 6 1034 5804 +14bf8 5 1032 5804 +14bfd 3 1030 5804 +14c00 3 1036 5804 +FUNC 14c03 d 0 DNameNode::DNameNode() +14c03 d 1048 5804 +FUNC 14c10 4 0 DNameNode::nextNode() +14c10 4 1052 5804 +FUNC 14c14 29 4 DNameNode::operator+=(DNameNode *) +14c14 2 1131 5804 +14c16 8 1132 5804 +14c1e 8 1134 5804 +14c26 b 1139 5804 +14c31 4 1144 5804 +14c35 2 1147 5804 +14c37 3 1148 5804 +14c3a 3 1156 5804 +FUNC 14c3d 16 4 charNode::charNode(char) +14c3d 16 1166 5804 +FUNC 14c53 4 0 charNode::length() +14c53 4 1168 5804 +FUNC 14c57 4 0 charNode::getLastChar() +14c57 4 1170 5804 +FUNC 14c5b 1b 8 charNode::getString(char *,int) +14c5b 0 1173 5804 +14c5b f 1174 5804 +14c6a 5 1175 5804 +14c6f 2 1176 5804 +14c71 2 1177 5804 +14c73 3 1183 5804 +FUNC 14c76 4 0 pcharNode::length() +14c76 4 1189 5804 +FUNC 14c7a 2f 4 pDNameNode::pDNameNode(DName *) +14c7a 2f 1244 5804 +FUNC 14ca9 25 4 DNameStatusNode::DNameStatusNode(DNameStatus) +14ca9 25 1261 5804 +FUNC 14cce 4 0 DNameStatusNode::length() +14cce 4 1263 5804 +FUNC 14cd2 d 0 DNameStatusNode::getLastChar() +14cd2 d 1266 5804 +FUNC 14cdf e 0 und_strlen +14cdf 0 1283 5804 +14cdf 6 1286 5804 +14ce5 7 1287 5804 +14cec 1 1291 5804 +FUNC 14ced 20 8 und_strncpy +14ced 0 1295 5804 +14ced 1b 1296 5804 +14d08 4 1299 5804 +14d0c 1 1301 5804 +FUNC 14d0d 25 4 und_strncmp +14d0d 0 1304 5804 +14d0d 7 1305 5804 +14d14 2 1306 5804 +14d16 1 1315 5804 +14d17 a 1308 5804 +14d21 1 1310 5804 +14d22 1 1311 5804 +14d23 6 1308 5804 +14d29 8 1314 5804 +14d31 1 1315 5804 +FUNC 14d32 33 0 UnDecorator::getDataIndirectType() +14d32 33 4033 5771 +FUNC 14d65 34 0 UnDecorator::getThisType() +14d65 34 4034 5771 +FUNC 14d99 13 c operator new(unsigned int,HeapManager &,int) +14d99 13 131 5804 +FUNC 14dac 56 4 DName::DName(DName *) +14dac 0 274 5804 +14dac a 275 5804 +14db6 23 277 5804 +14dd9 13 278 5804 +14dec 2 281 5804 +14dee 4 283 5804 +14df2 3 284 5804 +14df5 7 295 5804 +14dfc 6 296 5804 +FUNC 14e02 61 4 DName::DName(DNameStatus) +14e02 2 457 5804 +14e04 21 458 5804 +14e25 1e 459 5804 +14e43 7 467 5804 +14e4a 9 469 5804 +14e53 a 470 5804 +14e5d 6 472 5804 +FUNC 14e63 17 0 DName::isValid() +14e63 17 478 5804 +FUNC 14e7a 15 0 DName::isEmpty() +14e7a 15 479 5804 +FUNC 14e8f 14 0 DName::isUDC() +14e8f 14 486 5804 +FUNC 14ea3 e 0 DName::setIsUDC() +14ea3 e 487 5804 +FUNC 14eb1 14 0 DName::isUDTThunk() +14eb1 14 488 5804 +FUNC 14ec5 25 0 DName::length() +14ec5 1 502 5804 +14ec6 2 503 5804 +14ec8 a 506 5804 +14ed2 4 507 5804 +14ed6 b 508 5804 +14ee1 5 507 5804 +14ee6 3 510 5804 +14ee9 1 512 5804 +FUNC 14eea 38 0 DName::getLastChar() +14eea 2 516 5804 +14eec 2 517 5804 +14eee 9 519 5804 +14ef7 6 520 5804 +14efd a 521 5804 +14f07 2 522 5804 +14f09 7 520 5804 +14f10 11 524 5804 +14f21 1 526 5804 +FUNC 14f22 91 8 DName::getString(char *,int) +14f22 7 530 5804 +14f29 9 531 5804 +14f32 5 535 5804 +14f37 7 537 5804 +14f3e e 538 5804 +14f4c c 544 5804 +14f58 d 550 5804 +14f65 4 553 5804 +14f69 8 555 5804 +14f71 4 561 5804 +14f75 6 565 5804 +14f7b 2 566 5804 +14f7d b 570 5804 +14f88 4 574 5804 +14f8c 2 578 5804 +14f8e 3 579 5804 +14f91 3 586 5804 +14f94 4 553 5804 +14f98 4 590 5804 +14f9c 2 593 5804 +14f9e 6 594 5804 +14fa4 6 595 5804 +14faa 5 599 5804 +14faf 4 601 5804 +FUNC 14fb3 35 4 DName::operator|=(DName const &) +14fb3 3 832 5804 +14fb6 19 835 5804 +14fcf 13 836 5804 +14fe2 3 840 5804 +14fe5 3 842 5804 +FUNC 14fe8 81 4 DName::operator=(DNameStatus) +14fe8 2 928 5804 +14fea 10 929 5804 +14ffa 12 937 5804 +1500c 26 945 5804 +15032 6 947 5804 +15038 e 948 5804 +15046 10 933 5804 +15056 d 934 5804 +15063 3 954 5804 +15066 3 956 5804 +FUNC 15069 1e 0 Replicator::Replicator() +15069 1e 1004 5804 +FUNC 15087 47 4 Replicator::operator+=(DName const &) +15087 3 1009 5804 +1508a 12 1010 5804 +1509c 20 1012 5804 +150bc 4 1017 5804 +150c0 8 1018 5804 +150c8 3 1022 5804 +150cb 3 1024 5804 +FUNC 150ce 47 0 DNameNode::clone() +150ce 3 1055 5804 +150d1 43 1056 5804 +15114 1 1057 5804 +FUNC 15115 65 8 pcharNode::pcharNode(char const *,int) +15115 1 1197 5804 +15116 1f 1200 5804 +15135 c 1201 5804 +15141 8 1205 5804 +15149 c 1207 5804 +15155 a 1210 5804 +1515f b 1211 5804 +1516a 2 1214 5804 +1516c 3 1216 5804 +1516f 4 1217 5804 +15173 7 1220 5804 +FUNC 1517a 12 0 pcharNode::getLastChar() +1517a 12 1191 5804 +FUNC 1518c 31 8 pcharNode::getString(char *,int) +1518c 0 1224 5804 +1518c b 1227 5804 +15197 2 1228 5804 +15199 21 1232 5804 +151ba 3 1234 5804 +FUNC 151bd f 0 pDNameNode::length() +151bd f 1246 5804 +FUNC 151cc f 0 pDNameNode::getLastChar() +151cc f 1248 5804 +FUNC 151db 1d 8 pDNameNode::getString(char *,int) +151db 1d 1251 5804 +FUNC 151f8 33 8 DNameStatusNode::getString(char *,int) +151f8 0 1269 5804 +151f8 b 1272 5804 +15203 2 1273 5804 +15205 23 1277 5804 +15228 3 1279 5804 +FUNC 1522b 73 14 UnDecorator::UnDecorator(char *,char const *,int,char * (*)(long),unsigned long) +1522b 16 736 5771 +15241 8 737 5771 +15249 5 738 5771 +1524e 9 740 5771 +15257 a 741 5771 +15261 5 745 5771 +15266 2 747 5771 +15268 6 748 5771 +1526e 6 749 5771 +15274 8 754 5771 +1527c 15 755 5771 +15291 d 758 5771 +FUNC 1529e 2f 4 UnDecorator::getReturnType(DName *) +1529e 3 2906 5771 +152a1 8 2907 5771 +152a9 15 2911 5771 +152be d 2915 5771 +152cb 2 2917 5771 +FUNC 152cd f 0 UnDecorator::getStorageConvention() +152cd f 4032 5771 +FUNC 152dc 79 4 DName::operator+=(DNameStatus) +152dc 4 799 5804 +152e0 17 800 5804 +152f7 20 804 5804 +15317 4 807 5804 +1531b 7 809 5804 +15322 6 811 5804 +15328 8 812 5804 +15330 2 815 5804 +15332 3 816 5804 +15335 5 818 5804 +1533a e 819 5804 +15348 7 801 5804 +1534f 3 825 5804 +15352 3 827 5804 +FUNC 15355 68 4 DName::operator=(DName *) +15355 3 901 5804 +15358 12 902 5804 +1536a 7 903 5804 +15371 29 911 5804 +1539a 6 913 5804 +153a0 c 914 5804 +153ac 2 917 5804 +153ae 9 918 5804 +153b7 3 922 5804 +153ba 3 924 5804 +FUNC 153bd a6 8 DName::doPchar(char const *,int) +153bd 3 962 5804 +153c0 1e 963 5804 +153de 6 964 5804 +153e4 c 965 5804 +153f0 10 966 5804 +15400 5 970 5804 +15405 23 984 5804 +15428 6 986 5804 +1542e 9 987 5804 +15437 2 988 5804 +15439 1b 977 5804 +15454 c 993 5804 +15460 3 995 5804 +FUNC 15463 26 4 DName::DName(char) +15463 3 238 5804 +15466 3 244 5804 +15469 7 248 5804 +15470 7 252 5804 +15477 c 253 5804 +15483 6 255 5804 +FUNC 15489 31 4 DName::DName(char const *) +15489 0 300 5804 +15489 16 312 5804 +1549f 15 313 5804 +154b4 6 315 5804 +FUNC 154ba d0 8 DName::DName(char const * &,char) +154ba 7 319 5804 +154c1 d 329 5804 +154ce f 333 5804 +154dd 8 334 5804 +154e5 9 342 5804 +154ee 40 343 5804 +1552e b 344 5804 +15539 9 355 5804 +15542 8 359 5804 +1554a 8 361 5804 +15552 9 363 5804 +1555b 3 364 5804 +1555e 2 367 5804 +15560 3 347 5804 +15563 a 378 5804 +1556d 8 380 5804 +15575 6 368 5804 +1557b 7 371 5804 +15582 6 372 5804 +15588 2 375 5804 +FUNC 1558a 69 8 DName::DName(unsigned __int64) +1558a 15 384 5804 +1559f 3 390 5804 +155a2 a 398 5804 +155ac 4 402 5804 +155b0 13 406 5804 +155c3 3 407 5804 +155c6 c 409 5804 +155d2 e 411 5804 +155e0 13 413 5804 +FUNC 155f3 96 8 DName::DName(__int64) +155f3 10 416 5804 +15603 26 436 5804 +15629 15 438 5804 +1563e 10 443 5804 +1564e 5 444 5804 +15653 c 446 5804 +1565f 6 448 5804 +15665 4 449 5804 +15669 e 452 5804 +15677 12 453 5804 +FUNC 15689 2e 4 DName::operator+(DNameStatus) +15689 1 675 5804 +1568a c 676 5804 +15696 9 679 5804 +1569f b 680 5804 +156aa 2 681 5804 +156ac 5 682 5804 +156b1 3 686 5804 +156b4 3 688 5804 +FUNC 156b7 62 4 DName::operator+=(DName const &) +156b7 2 739 5804 +156b9 f 740 5804 +156c8 13 741 5804 +156db 2 742 5804 +156dd 9 743 5804 +156e6 6 744 5804 +156ec 2 745 5804 +156ee 7 747 5804 +156f5 6 749 5804 +156fb 9 750 5804 +15704 2 751 5804 +15706 d 752 5804 +15713 3 758 5804 +15716 3 760 5804 +FUNC 15719 8b 4 DName::operator+=(DName *) +15719 2 764 5804 +1571b a 765 5804 +15725 9 766 5804 +1572e 8 767 5804 +15736 10 768 5804 +15746 8 789 5804 +1574e 20 770 5804 +1576e 4 773 5804 +15772 7 775 5804 +15779 6 777 5804 +1577f 8 778 5804 +15787 2 781 5804 +15789 3 782 5804 +1578c 5 784 5804 +15791 d 785 5804 +1579e 3 793 5804 +157a1 3 795 5804 +FUNC 157a4 1c 4 DName::operator=(char) +157a4 1 847 5804 +157a5 15 854 5804 +157ba 3 856 5804 +157bd 3 858 5804 +FUNC 157c0 2a 4 DName::operator=(char const *) +157c0 0 862 5804 +157c0 24 869 5804 +157e4 3 873 5804 +157e7 3 875 5804 +FUNC 157ea a6 0 UnDecorator::getCallingConvention() +157ea 5 2825 5771 +157ef f 2826 5771 +157fe c 2828 5771 +1580a 5 2835 5771 +1580f 1a 2845 5771 +15829 20 2852 5771 +15849 2 2875 5771 +1584b 2 2876 5771 +1584d 2 2871 5771 +1584f 2 2872 5771 +15851 2 2867 5771 +15853 2 2868 5771 +15855 2 2863 5771 +15857 2 2864 5771 +15859 1 2859 5771 +1585a 2 2860 5771 +1585c 13 2855 5771 +1586f e 2891 5771 +1587d 4 2895 5771 +15881 d 2899 5771 +1588e 2 2901 5771 +FUNC 15890 37 0 UnDecorator::getVCallThunkType() +15890 3 4057 5771 +15893 9 4059 5771 +1589c 5 4066 5771 +158a1 4 4059 5771 +158a5 4 4066 5771 +158a9 6 4061 5771 +158af c 4062 5771 +158bb a 4064 5771 +158c5 2 4170 5771 +FUNC 158c7 51 4 DName::operator+(DName const &) +158c7 1 639 5804 +158c8 c 640 5804 +158d4 b 643 5804 +158df b 644 5804 +158ea d 645 5804 +158f7 11 646 5804 +15908 2 647 5804 +1590a 8 648 5804 +15912 3 652 5804 +15915 3 654 5804 +FUNC 15918 2e 4 DName::operator+(DName *) +15918 1 658 5804 +15919 c 659 5804 +15925 9 662 5804 +1592e b 663 5804 +15939 2 664 5804 +1593b 5 665 5804 +15940 3 669 5804 +15943 3 671 5804 +FUNC 15946 6a 4 DName::operator+=(char) +15946 1 693 5804 +15947 b 694 5804 +15952 9 695 5804 +1595b 6 696 5804 +15961 2 697 5804 +15963 7 699 5804 +1596a 6 701 5804 +15970 2b 702 5804 +1599b 2 703 5804 +1599d c 704 5804 +159a9 4 710 5804 +159ad 3 712 5804 +FUNC 159b0 6c 4 DName::operator+=(char const *) +159b0 2 716 5804 +159b2 f 717 5804 +159c1 9 718 5804 +159ca 6 719 5804 +159d0 2 720 5804 +159d2 7 722 5804 +159d9 6 724 5804 +159df 28 725 5804 +15a07 2 726 5804 +15a09 d 727 5804 +15a16 3 733 5804 +15a19 3 735 5804 +FUNC 15a1c e0 0 UnDecorator::getArgumentList() +15a1c 7 3076 5771 +15a23 12 3078 5771 +15a35 29 3081 5771 +15a5e 6 3085 5771 +15a64 4 3086 5771 +15a68 2 3087 5771 +15a6a e 3088 5771 +15a78 6 3093 5771 +15a7e 6 3095 5771 +15a84 5 3100 5771 +15a89 1 3102 5771 +15a8a 11 3106 5771 +15a9b 2 3109 5771 +15a9d 16 3116 5771 +15ab3 19 3121 5771 +15acc 9 3122 5771 +15ad5 17 3126 5771 +15aec b 3132 5771 +15af7 3 3141 5771 +15afa 2 3143 5771 +FUNC 15afc 4f 4 UnDecorator::getVdispMapType(DName const &) +15afc 6 4230 5771 +15b02 d 4231 5771 +15b0f c 4232 5771 +15b1b 12 4233 5771 +15b2d 9 4234 5771 +15b36 a 4236 5771 +15b40 6 4237 5771 +15b46 3 4238 5771 +15b49 2 4239 5771 +FUNC 15b4b 22 8 operator+(char,DName const &) +15b4b 22 198 5804 +FUNC 15b6d 22 8 operator+(DNameStatus,DName const &) +15b6d 22 201 5804 +FUNC 15b8f 22 8 operator+(char const *,DName const &) +15b8f 22 204 5804 +FUNC 15bb1 2e 4 DName::operator+(char) +15bb1 1 605 5804 +15bb2 c 606 5804 +15bbe 9 609 5804 +15bc7 b 610 5804 +15bd2 2 611 5804 +15bd4 5 612 5804 +15bd9 3 616 5804 +15bdc 3 618 5804 +FUNC 15bdf 2e 4 DName::operator+(char const *) +15bdf 1 622 5804 +15be0 c 623 5804 +15bec 9 626 5804 +15bf5 b 627 5804 +15c00 2 628 5804 +15c02 5 629 5804 +15c07 3 633 5804 +15c0a 3 635 5804 +FUNC 15c0d 141 4 UnDecorator::getDimension(bool) +15c0d 7 1616 5771 +15c14 10 1618 5771 +15c24 e 1620 5771 +15c32 6 1623 5771 +15c38 f 1624 5771 +15c47 8 1625 5771 +15c4f 47 1626 5771 +15c96 4 1629 5771 +15c9a 4 1636 5771 +15c9e 8 1638 5771 +15ca6 20 1639 5771 +15cc6 d 1643 5771 +15cd3 4 1634 5771 +15cd7 b 1649 5771 +15ce2 2 1650 5771 +15ce4 5 1652 5771 +15ce9 13 1653 5771 +15cfc c 1637 5771 +15d08 4 1641 5771 +15d0c a 1653 5771 +15d16 36 1655 5771 +15d4c 2 1659 5771 +FUNC 15d4e d4 0 UnDecorator::getEnumType() +15d4e 6 2762 5771 +15d54 1a 2766 5771 +15d6e 12 2770 5771 +15d80 5 2774 5771 +15d85 2 2775 5771 +15d87 5 2779 5771 +15d8c 2 2780 5771 +15d8e 5 2786 5771 +15d93 2 2787 5771 +15d95 d 2791 5771 +15da2 1f 2801 5771 +15dc1 1e 2807 5771 +15ddf e 2814 5771 +15ded 4 2795 5771 +15df1 d 2818 5771 +15dfe 24 2820 5771 +FUNC 15e22 c4 0 UnDecorator::getArgumentTypes() +15e22 3 3035 5771 +15e25 18 3036 5771 +15e3d 9 3046 5771 +15e46 7 3051 5771 +15e4d 13 3052 5771 +15e60 c 3064 5771 +15e6c 36 3058 5771 +15ea2 b 3061 5771 +15ead 21 3039 5771 +15ece 16 3042 5771 +15ee4 2 3072 5771 +FUNC 15ee6 7e 0 UnDecorator::getThrowTypes() +15ee6 3 3148 5771 +15ee9 e 3149 5771 +15ef7 2 3150 5771 +15ef9 21 3151 5771 +15f1a 1f 3153 5771 +15f39 29 3155 5771 +15f62 2 3157 5771 +FUNC 15f64 125 c UnDecorator::getExtendedDataIndirectType(char &,bool &,int) +15f64 6 3636 5771 +15f6a 1a 3641 5771 +15f84 1c 3643 5771 +15fa0 a 3669 5771 +15faa 6 3670 5771 +15fb0 b 3672 5771 +15fbb a 3674 5771 +15fc5 21 3675 5771 +15fe6 17 3678 5771 +15ffd a 3680 5771 +16007 6 3689 5771 +1600d 2 3691 5771 +1600f 17 3693 5771 +16026 1e 3700 5771 +16044 6 3663 5771 +1604a 2 3665 5771 +1604c 3 3656 5771 +1604f d 3657 5771 +1605c 2 3659 5771 +1605e 6 3647 5771 +16064 13 3649 5771 +16077 10 3703 5771 +16087 2 3704 5771 +FUNC 16089 15f 4 UnDecorator::getArrayType(DName const &) +16089 3 3986 5771 +1608c 12 3987 5771 +1609e 7 3989 5771 +160a5 4 3991 5771 +160a9 2 3992 5771 +160ab 4 3994 5771 +160af 9 3995 5771 +160b8 2a 4026 5771 +160e2 2 4028 5771 +160e4 c 3998 5771 +160f0 9 4000 5771 +160f9 d 4001 5771 +16106 35 4005 5771 +1613b b 4009 5771 +16146 4 4010 5771 +1614a 8 4011 5771 +16152 2 4012 5771 +16154 2c 4013 5771 +16180 d 4017 5771 +1618d 9 4018 5771 +16196 12 4019 5771 +161a8 a 4023 5771 +161b2 36 4024 5771 +FUNC 161e8 31 0 UnDecorator::getLexicalFrame() +161e8 31 4031 5771 +FUNC 16219 12 0 UnDecorator::getDisplacement() +16219 12 4048 5771 +FUNC 1622b 12 0 UnDecorator::getCallIndex() +1622b 12 4049 5771 +FUNC 1623d 12 0 UnDecorator::getGuardNumber() +1623d 12 4050 5771 +FUNC 1624f 150 4 UnDecorator::getVfTableType(DName const &) +1624f 7 4174 5771 +16256 d 4175 5771 +16263 1d 4178 5771 +16280 2c 4180 5771 +162ac f 4182 5771 +162bb e 4184 5771 +162c9 5 4186 5771 +162ce 11 4188 5771 +162df 2d 4190 5771 +1630c b 4194 5771 +16317 7 4195 5771 +1631e 10 4199 5771 +1632e a 4200 5771 +16338 b 4188 5771 +16343 b 4204 5771 +1634e a 4206 5771 +16358 7 4207 5771 +1635f 9 4209 5771 +16368 a 4216 5771 +16372 6 4217 5771 +16378 2 4220 5771 +1637a 9 4221 5771 +16383 17 4222 5771 +1639a 3 4224 5771 +1639d 2 4226 5771 +FUNC 1639f a0 8 UnDecorator::getStringEncoding(char *,int) +1639f 6 1447 5771 +163a5 b 1448 5771 +163b0 22 1451 5771 +163d2 6 1456 5771 +163d8 b 1459 5771 +163e3 b 1462 5771 +163ee 13 1464 5771 +16401 c 1466 5771 +1640d 5 1469 5771 +16412 6 1470 5771 +16418 4 1471 5771 +1641c 14 1477 5771 +16430 d 1452 5771 +1643d 2 1478 5771 +FUNC 1643f 50 0 UnDecorator::getSignedDimension() +1643f 5 1603 5771 +16444 b 1604 5771 +1644f c 1605 5771 +1645b 2 1606 5771 +1645d 23 1608 5771 +16480 d 1611 5771 +1648d 2 1612 5771 +FUNC 1648f 2bb 0 UnDecorator::getTemplateConstant() +1648f 15 1877 5771 +164a4 f 1884 5771 +164b3 32 1885 5771 +164e5 9 1921 5771 +164ee b 1922 5771 +164f9 20 1924 5771 +16519 12 1931 5771 +1652b e 1932 5771 +16539 3 1937 5771 +1653c 7 1939 5771 +16543 6 1941 5771 +16549 4 1942 5771 +1654d 2 1944 5771 +1654f 4 1945 5771 +16553 2a 1950 5771 +1657d a 1900 5771 +16587 6 1902 5771 +1658d 11 1903 5771 +1659e 1b 1906 5771 +165b9 b 1892 5771 +165c4 6 2034 5771 +165ca 7 1954 5771 +165d1 26 1885 5771 +165f7 b 1990 5771 +16602 c 1991 5771 +1660e 10 1992 5771 +1661e 9 1966 5771 +16627 c 1968 5771 +16633 e 1971 5771 +16641 10 1973 5771 +16651 6 1975 5771 +16657 6 1976 5771 +1665d 3 1980 5771 +16660 29 1981 5771 +16689 a 1983 5771 +16693 a 2001 5771 +1669d a 2003 5771 +166a7 13 2007 5771 +166ba a 2008 5771 +166c4 11 2012 5771 +166d5 13 2015 5771 +166e8 a 2016 5771 +166f2 13 2021 5771 +16705 a 2022 5771 +1670f 13 2026 5771 +16722 d 2029 5771 +1672f 7 1913 5771 +16736 14 2041 5771 +FUNC 1674a d9 8 UnDecorator::getPtrRefDataType(DName const &,int) +1674a 3 3937 5771 +1674d 11 3940 5771 +1675e b 3944 5771 +16769 12 3948 5771 +1677b 12 3949 5771 +1678d 10 3951 5771 +1679d 5 3957 5771 +167a2 16 3961 5771 +167b8 d 3967 5771 +167c5 c 3968 5771 +167d1 b 3970 5771 +167dc 6 3972 5771 +167e2 1e 3974 5771 +16800 e 3976 5771 +1680e 13 3980 5771 +16821 2 3982 5771 +FUNC 16823 14 4 UnDecorator::getVbTableType(DName const &) +16823 14 4053 5771 +FUNC 16837 1b8 0 UnDecorator::getTemplateArgumentList() +16837 14 1775 5771 +1684b c 1777 5771 +16857 7 1778 5771 +1685e 2a 1781 5771 +16888 6 1785 5771 +1688e 4 1786 5771 +16892 2 1787 5771 +16894 e 1788 5771 +168a2 8 1793 5771 +168aa 5 1798 5771 +168af 1 1800 5771 +168b0 11 1804 5771 +168c1 5 1807 5771 +168c6 7 1810 5771 +168cd 7 1816 5771 +168d4 6 1817 5771 +168da 12 1818 5771 +168ec a 1820 5771 +168f6 5 1821 5771 +168fb e 1822 5771 +16909 5 1824 5771 +1690e 9 1830 5771 +16917 c 1832 5771 +16923 e 1835 5771 +16931 10 1837 5771 +16941 6 1839 5771 +16947 1 1840 5771 +16948 2 1842 5771 +1694a 25 1843 5771 +1696f 2 1846 5771 +16971 10 1847 5771 +16981 2 1850 5771 +16983 1f 1851 5771 +169a2 17 1857 5771 +169b9 9 1858 5771 +169c2 16 1862 5771 +169d8 17 1873 5771 +FUNC 169ef 56f 8 UnDecorator::getOperatorName(bool,bool *) +169ef b 1095 5771 +169fa 53 1103 5771 +16a4d 13 1183 5771 +16a60 c 1439 5771 +16a6c 1d 1440 5771 +16a89 11 1442 5771 +16a9a 5 1444 5771 +16a9f 3 1124 5771 +16aa2 8 1126 5771 +16aaa 21 1127 5771 +16acb c 1129 5771 +16ad7 a 1130 5771 +16ae1 a 1133 5771 +16aeb 7 1135 5771 +16af2 3 1136 5771 +16af5 9 1144 5771 +16afe 5 1145 5771 +16b03 6 1148 5771 +16b09 2 1154 5771 +16b0b 15 1156 5771 +16b20 18 1160 5771 +16b38 1a 1161 5771 +16b52 10 1166 5771 +16b62 b 1167 5771 +16b6d 5 1170 5771 +16b72 6 1106 5771 +16b78 f 1108 5771 +16b87 21 1103 5771 +16ba8 3d 1220 5771 +16be5 18 1240 5771 +16bfd b 1234 5771 +16c08 5 1235 5771 +16c0d 13 1245 5771 +16c20 7 1247 5771 +16c27 8 1249 5771 +16c2f 18 1220 5771 +16c47 13 1255 5771 +16c5a 7 1256 5771 +16c61 2 1257 5771 +16c63 16 1335 5771 +16c79 7 1356 5771 +16c80 6 1350 5771 +16c86 2 1352 5771 +16c88 25 1220 5771 +16cad 13 1290 5771 +16cc0 17 1291 5771 +16cd7 24 1292 5771 +16cfb 14 1313 5771 +16d0f 6 1316 5771 +16d15 5 1317 5771 +16d1a 10 1302 5771 +16d2a 20 1303 5771 +16d4a 20 1304 5771 +16d6a 20 1305 5771 +16d8a 22 1306 5771 +16dac 12 1307 5771 +16dbe c 1296 5771 +16dca 2b 1297 5771 +16df5 13 1281 5771 +16e08 17 1282 5771 +16e1f 1a 1283 5771 +16e39 5 1284 5771 +16e3e 2d 1220 5771 +16e6b 25 1364 5771 +16e90 10 1373 5771 +16ea0 13 1378 5771 +16eb3 a 1397 5771 +16ebd 13 1399 5771 +16ed0 a 1403 5771 +16eda 6 1405 5771 +16ee0 2 1408 5771 +16ee2 13 1410 5771 +16ef5 d 1413 5771 +16f02 5 1415 5771 +16f07 10 1278 5771 +16f17 b 1330 5771 +16f22 5 1428 5771 +16f27 3 1187 5771 +16f2a 13 1216 5771 +16f3d 8 1437 5771 +16f45 19 1438 5771 +FUNC 16f5e 153 4 UnDecorator::getTemplateName(bool) +16f5e 5 1700 5771 +16f63 1f 1704 5771 +16f82 16 1714 5771 +16f98 1d 1716 5771 +16fb5 23 1725 5771 +16fd8 e 1729 5771 +16fe6 6 1730 5771 +16fec 12 1732 5771 +16ffe 2 1734 5771 +17000 16 1735 5771 +17016 c 1738 5771 +17022 7 1739 5771 +17029 6 1746 5771 +1702f 21 1747 5771 +17050 c 1749 5771 +1705c a 1750 5771 +17066 a 1753 5771 +17070 6 1755 5771 +17076 6 1756 5771 +1707c 23 1769 5771 +1709f d 1705 5771 +170ac 5 1771 5771 +FUNC 170b1 1ea 4 UnDecorator::getZName(bool) +170b1 10 1007 5771 +170c1 11 1008 5771 +170d2 3 1013 5771 +170d5 26 1043 5771 +170fb b 1024 5771 +17106 5 1026 5771 +1710b 16 1028 5771 +17121 16 1030 5771 +17137 17 1031 5771 +1714e 7 1033 5771 +17155 25 1040 5771 +1717a 5 1042 5771 +1717f 29 1043 5771 +171a8 8 1045 5771 +171b0 b 1051 5771 +171bb c 1053 5771 +171c7 e 1056 5771 +171d5 10 1058 5771 +171e5 4 1060 5771 +171e9 b 1061 5771 +171f4 2 1063 5771 +171f6 a 1064 5771 +17200 10 1065 5771 +17210 2 1068 5771 +17212 d 1069 5771 +1721f 2a 1070 5771 +17249 2 1073 5771 +1724b 1a 1076 5771 +17265 11 1083 5771 +17276 9 1084 5771 +1727f f 1087 5771 +1728e d 1090 5771 +FUNC 1729b e4 0 UnDecorator::getScopedName() +1729b 7 2727 5771 +172a2 e 2728 5771 +172b0 15 2733 5771 +172c5 1a 2737 5771 +172df 2a 2738 5771 +17309 b 2742 5771 +17314 8 2743 5771 +1731c 4 2744 5771 +17320 1b 2745 5771 +1733b b 2746 5771 +17346 7 2747 5771 +1734d 2 2748 5771 +1734f 2b 2749 5771 +1737a 3 2753 5771 +1737d 2 2755 5771 +FUNC 1737f f 0 UnDecorator::getECSUName() +1737f f 2758 5771 +FUNC 1738e 100 0 UnDecorator::getECSUDataType() +1738e 3 3392 5771 +17391 20 3395 5771 +173b1 37 3399 5771 +173e8 5 3424 5771 +173ed 2 3425 5771 +173ef 5 3420 5771 +173f4 2 3421 5771 +173f6 26 3431 5771 +1741c 2 3432 5771 +1741e 5 3415 5771 +17423 2 3416 5771 +17425 5 3411 5771 +1742a 2 3412 5771 +1742c d 3407 5771 +17439 7 3439 5771 +17440 4 3441 5771 +17444 c 3442 5771 +17450 16 3446 5771 +17466 e 3450 5771 +17474 18 3404 5771 +1748c 2 3452 5771 +FUNC 1748e 46 0 UnDecorator::getSymbolName() +1748e 3 989 5771 +17491 a 990 5771 +1749b 6 991 5771 +174a1 c 992 5771 +174ad 16 997 5771 +174c3 f 1001 5771 +174d2 2 1003 5771 +FUNC 174d4 92 0 UnDecorator::getBasedType() +174d4 6 2653 5771 +174da 13 2654 5771 +174ed a 2659 5771 +174f7 17 2661 5771 +1750e c 2707 5771 +1751a 13 2699 5771 +1752d 2 2700 5771 +1752f d 2674 5771 +1753c 2 2711 5771 +1753e a 2712 5771 +17548 d 2716 5771 +17555 f 2720 5771 +17564 2 2722 5771 +FUNC 17566 b42 4 UnDecorator::composeDeclaration(DName const &) +17566 6 2045 5771 +1756c e 2046 5771 +1757a 5 2047 5771 +1757f a 2048 5771 +17589 b 2053 5771 +17594 f 2054 5771 +175a3 8 2055 5771 +175ab 15 2056 5771 +175c0 8 2057 5771 +175c8 10 2058 5771 +175d8 83 2075 5771 +1765b 7 2081 5771 +17662 19 2082 5771 +1767b 21 2083 5771 +1769c 2 2084 5771 +1769e 15 2085 5771 +176b3 27 2090 5771 +176da 33 2092 5771 +1770d 9 2094 5771 +17716 9 2096 5771 +1771f 2b 2098 5771 +1774a d 2101 5771 +17757 9 2103 5771 +17760 2d 2105 5771 +1778d 2e 2107 5771 +177bb 5 2111 5771 +177c0 3 2114 5771 +177c3 3 2115 5771 +177c6 3 2116 5771 +177c9 3 2117 5771 +177cc 3 2118 5771 +177cf 26 2121 5771 +177f5 12 2123 5771 +17807 19 2125 5771 +17820 19 2126 5771 +17839 2 2127 5771 +1783b 12 2129 5771 +1784d 19 2131 5771 +17866 1b 2134 5771 +17881 13 2141 5771 +17894 a 2142 5771 +1789e 15 2143 5771 +178b3 2 2144 5771 +178b5 f 2145 5771 +178c4 10 2147 5771 +178d4 9 2151 5771 +178dd 22 2152 5771 +178ff 2 2153 5771 +17901 13 2168 5771 +17914 c 2172 5771 +17920 14 2173 5771 +17934 1a 2174 5771 +1794e 2 2175 5771 +17950 b 2176 5771 +1795b 5 2182 5771 +17960 6 2185 5771 +17966 27 2187 5771 +1798d b 2189 5771 +17998 5 2190 5771 +1799d 1b 2194 5771 +179b8 15 2195 5771 +179cd 1d 2202 5771 +179ea 16 2204 5771 +17a00 55 2205 5771 +17a55 12 2206 5771 +17a67 2b 2207 5771 +17a92 2 2208 5771 +17a94 d 2209 5771 +17aa1 1a 2211 5771 +17abb 2e 2218 5771 +17ae9 12 2222 5771 +17afb c 2223 5771 +17b07 c 2227 5771 +17b13 15 2228 5771 +17b28 2 2229 5771 +17b2a f 2230 5771 +17b39 1a 2235 5771 +17b53 b 2237 5771 +17b5e 3 2238 5771 +17b61 5 2243 5771 +17b66 b 2245 5771 +17b71 1c 2250 5771 +17b8d 13 2251 5771 +17ba0 e 2252 5771 +17bae 2 2253 5771 +17bb0 10 2254 5771 +17bc0 3d 2255 5771 +17bfd c 2256 5771 +17c09 e 2257 5771 +17c17 4c 2258 5771 +17c63 a 2259 5771 +17c6d 4b 2260 5771 +17cb8 7 2261 5771 +17cbf 4b 2262 5771 +17d0a f 2263 5771 +17d19 f 2264 5771 +17d28 6 2268 5771 +17d2e 61 2277 5771 +17d8f 15 2281 5771 +17da4 2 2283 5771 +17da6 18 2285 5771 +17dbe 2d 2292 5771 +17deb 12 2294 5771 +17dfd 37 2296 5771 +17e34 23 2297 5771 +17e57 b7 2299 5771 +17f0e 23 2300 5771 +17f31 12 2306 5771 +17f43 37 2307 5771 +17f7a b 2308 5771 +17f85 37 2309 5771 +17fbc b 2310 5771 +17fc7 30 2311 5771 +17ff7 23 2312 5771 +1801a 36 2319 5771 +18050 1e 2320 5771 +1806e 8 2325 5771 +18076 1e 2326 5771 +18094 12 2329 5771 +180a6 2 2331 5771 +FUNC 180a8 211 0 UnDecorator::getDecoratedName() +180a8 7 861 5771 +180af e 864 5771 +180bd a 868 5771 +180c7 b 873 5771 +180d2 8 874 5771 +180da 11 876 5771 +180eb 10 878 5771 +180fb 6 882 5771 +18101 9 903 5771 +1810a 9 906 5771 +18113 8 910 5771 +1811b 6 912 5771 +18121 5 910 5771 +18126 2 915 5771 +18128 a 918 5771 +18132 19 919 5771 +1814b 6 920 5771 +18151 f 924 5771 +18160 8 925 5771 +18168 17 929 5771 +1817f a 930 5771 +18189 c 932 5771 +18195 8 933 5771 +1819d 5 934 5771 +181a2 18 935 5771 +181ba a 936 5771 +181c4 13 937 5771 +181d7 b 938 5771 +181e2 2 940 5771 +181e4 29 941 5771 +1820d 4 945 5771 +18211 10 946 5771 +18221 9 948 5771 +1822a 3 950 5771 +1822d 1c 955 5771 +18249 f 959 5771 +18258 4 976 5771 +1825c 6 962 5771 +18262 14 964 5771 +18276 19 967 5771 +1828f 5 968 5771 +18294 10 971 5771 +182a4 2 979 5771 +182a6 2 980 5771 +182a8 f 982 5771 +182b7 2 984 5771 +FUNC 182b9 28b 0 UnDecorator::getScope() +182b9 d 1482 5771 +182c6 f 1483 5771 +182d5 2a 1489 5771 +182ff 14 1492 5771 +18313 b 1495 5771 +1831e 16 1496 5771 +18334 5 1498 5771 +18339 17 1499 5771 +18350 3 1500 5771 +18353 f 1506 5771 +18362 2a 1507 5771 +1838c 10 1566 5771 +1839c 5 1567 5771 +183a1 34 1561 5771 +183d5 4 1562 5771 +183d9 5 1563 5771 +183de e 1510 5771 +183ec 5 1514 5771 +183f1 22 1515 5771 +18413 e 1518 5771 +18421 6 1519 5771 +18427 5 1522 5771 +1842c 2a 1523 5771 +18456 2 1524 5771 +18458 f 1546 5771 +18467 1a 1548 5771 +18481 b 1550 5771 +1848c 9 1551 5771 +18495 2 1554 5771 +18497 f 1530 5771 +184a6 2 1570 5771 +184a8 21 1571 5771 +184c9 a 1489 5771 +184d3 f 1577 5771 +184e2 18 1590 5771 +184fa 2 1591 5771 +184fc b 1580 5771 +18507 7 1581 5771 +1850e 2 1582 5771 +18510 2b 1583 5771 +1853b 4 1597 5771 +1853f 5 1599 5771 +FUNC 18544 341 4 UnDecorator::getFunctionIndirectType(DName const &) +18544 3 3461 5771 +18547 e 3462 5771 +18555 15 3463 5771 +1856a f 3465 5771 +18579 10 3466 5771 +18589 7 3469 5771 +18590 a 3471 5771 +1859a 6 3473 5771 +185a0 7 3475 5771 +185a7 d 3477 5771 +185b4 17 3482 5771 +185cb 9 3485 5771 +185d4 3 3486 5771 +185d7 5 3490 5771 +185dc f 3491 5771 +185eb 6 3496 5771 +185f1 13 3497 5771 +18604 b 3501 5771 +1860f 1e 3503 5771 +1862d 8 3505 5771 +18635 29 3506 5771 +1865e 2 3507 5771 +18660 17 3508 5771 +18677 f 3510 5771 +18686 4 3511 5771 +1868a 10 3518 5771 +1869a 15 3519 5771 +186af 9 3527 5771 +186b8 d 3528 5771 +186c5 30 3529 5771 +186f5 2 3530 5771 +186f7 11 3521 5771 +18708 7 3514 5771 +1870f 16 3516 5771 +18725 13 3531 5771 +18738 d 3535 5771 +18745 22 3537 5771 +18767 2 3546 5771 +18769 13 3547 5771 +1877c c 3551 5771 +18788 28 3552 5771 +187b0 1e 3557 5771 +187ce c 3558 5771 +187da 2e 3561 5771 +18808 10 3563 5771 +18818 c 3564 5771 +18824 c 3566 5771 +18830 15 3567 5771 +18845 2 3568 5771 +18847 f 3569 5771 +18856 4 3573 5771 +1885a b 3574 5771 +18865 e 3580 5771 +18873 10 3576 5771 +18883 2 3581 5771 +FUNC 18885 4e4 10 UnDecorator::getDataIndirectType(DName const &,char,DName const &,int) +18885 6 3707 5771 +1888b 23 3711 5771 +188ae 4 3713 5771 +188b2 17 3715 5771 +188c9 c 3717 5771 +188d5 10 3719 5771 +188e5 e 3723 5771 +188f3 6 3725 5771 +188f9 15 3726 5771 +1890e 17 3732 5771 +18925 11 3751 5771 +18936 a 3752 5771 +18940 32 3753 5771 +18972 5 3754 5771 +18977 11 3743 5771 +18988 a 3744 5771 +18992 25 3745 5771 +189b7 2 3746 5771 +189b9 8 3747 5771 +189c1 2 3749 5771 +189c3 19 3735 5771 +189dc a 3736 5771 +189e6 14 3737 5771 +189fa 5 3738 5771 +189ff 11 3739 5771 +18a10 6 3766 5771 +18a16 a 3768 5771 +18a20 17 3770 5771 +18a37 10 3772 5771 +18a47 1a 3778 5771 +18a61 5 3780 5771 +18a66 6 3782 5771 +18a6c 9 3787 5771 +18a75 b 3789 5771 +18a80 19 3791 5771 +18a99 c 3793 5771 +18aa5 24 3794 5771 +18ac9 c 3796 5771 +18ad5 22 3797 5771 +18af7 9 3801 5771 +18b00 5 3805 5771 +18b05 7 3806 5771 +18b0c 6 3810 5771 +18b12 1e 3812 5771 +18b30 8 3814 5771 +18b38 1b 3815 5771 +18b53 2 3816 5771 +18b55 16 3817 5771 +18b6b a 3819 5771 +18b75 13 3828 5771 +18b88 b 3833 5771 +18b93 c 3834 5771 +18b9f 8 3835 5771 +18ba7 6 3836 5771 +18bad b 3842 5771 +18bb8 b 3843 5771 +18bc3 3 3863 5771 +18bc6 6 3864 5771 +18bcc 22 3866 5771 +18bee 9 3871 5771 +18bf7 13 3872 5771 +18c0a 5 3876 5771 +18c0f 1e 3877 5771 +18c2d 5 3879 5771 +18c32 1e 3880 5771 +18c50 5 3884 5771 +18c55 e 3885 5771 +18c63 14 3889 5771 +18c77 28 3895 5771 +18c9f 2 3890 5771 +18ca1 b 3891 5771 +18cac 2 3892 5771 +18cae c 3898 5771 +18cba 17 3899 5771 +18cd1 4 3902 5771 +18cd5 6 3904 5771 +18cdb 7 3906 5771 +18ce2 8 3774 5771 +18cea 13 3918 5771 +18cfd 12 3922 5771 +18d0f 29 3925 5771 +18d38 10 3923 5771 +18d48 c 3928 5771 +18d54 3 3929 5771 +18d57 10 3931 5771 +18d67 2 3933 5771 +FUNC 18d69 14c 0 UnDecorator::operator char *() +18d69 6 762 5771 +18d6f 4 763 5771 +18d73 f 764 5771 +18d82 9 770 5771 +18d8b c 772 5771 +18d97 7 775 5771 +18d9e 1d 776 5771 +18dbb 4 782 5771 +18dbf 16 783 5771 +18dd5 9 785 5771 +18dde 5 794 5771 +18de3 9 795 5771 +18dec 13 799 5771 +18dff e 808 5771 +18e0d 2 809 5771 +18e0f 2 848 5771 +18e11 1a 810 5771 +18e2b e 813 5771 +18e39 e 811 5771 +18e47 9 817 5771 +18e50 e 819 5771 +18e5e d 820 5771 +18e6b a 824 5771 +18e75 f 825 5771 +18e84 5 828 5771 +18e89 2 829 5771 +18e8b 2 830 5771 +18e8d 5 831 5771 +18e92 1 832 5771 +18e93 5 833 5771 +18e98 1 835 5771 +18e99 5 834 5771 +18e9e 2 838 5771 +18ea0 a 839 5771 +18eaa 9 841 5771 +18eb3 2 848 5771 +FUNC 18eb5 116 c UnDecorator::getPtrRefType(DName const &,DName const &,char) +18eb5 5 3585 5771 +18eba f 3588 5771 +18ec9 d 3589 5771 +18ed6 b 3591 5771 +18ee1 20 3594 5771 +18f01 b 3595 5771 +18f0c b 3597 5771 +18f17 9 3598 5771 +18f20 14 3600 5771 +18f34 14 3606 5771 +18f48 1b 3608 5771 +18f63 a 3612 5771 +18f6d b 3615 5771 +18f78 c 3617 5771 +18f84 9 3618 5771 +18f8d c 3620 5771 +18f99 c 3622 5771 +18fa5 a 3623 5771 +18faf b 3625 5771 +18fba f 3629 5771 +18fc9 2 3632 5771 +FUNC 18fcb 1b 8 UnDecorator::getPointerType(DName const &,DName const &) +18fcb 1b 4037 5771 +FUNC 18fe6 1b 8 UnDecorator::getPointerTypeArray(DName const &,DName const &) +18fe6 1b 4040 5771 +FUNC 19001 1b 8 UnDecorator::getReferenceType(DName const &,DName const &) +19001 1b 4043 5771 +FUNC 1901c a3 18 __unDName +1901c f 604 5771 +1902b 9 606 5771 +19034 4 607 5771 +19038 a 612 5771 +19042 2 613 5771 +19044 8 614 5771 +1904c 3 615 5771 +1904f 20 618 5771 +1906f 1a 627 5771 +19089 e 628 5771 +19097 a 633 5771 +190a1 c 636 5771 +190ad 3 643 5771 +190b0 6 645 5771 +190b6 9 637 5771 +FUNC 190bf a3 1c __unDNameEx +190bf f 684 5771 +190ce 9 687 5771 +190d7 4 688 5771 +190db a 693 5771 +190e5 2 694 5771 +190e7 8 695 5771 +190ef 3 696 5771 +190f2 20 699 5771 +19112 1a 708 5771 +1912c e 709 5771 +1913a a 714 5771 +19144 c 717 5771 +19150 3 724 5771 +19153 6 726 5771 +19159 9 718 5771 +FUNC 19162 387 4 UnDecorator::getBasicDataType(DName const &) +19162 3 3162 5771 +19165 15 3163 5771 +1917a 6 3165 5771 +19180 4 3168 5771 +19184 35 3173 5771 +191b9 5 3178 5771 +191be 5 3179 5771 +191c3 5 3183 5771 +191c8 5 3184 5771 +191cd 5 3188 5771 +191d2 5 3189 5771 +191d7 5 3193 5771 +191dc 5 3194 5771 +191e1 5 3203 5771 +191e6 5 3204 5771 +191eb 2a 3173 5771 +19215 3c 3222 5771 +19251 5 3231 5771 +19256 5 3232 5771 +1925b 22 3273 5771 +1927d 5 3235 5771 +19282 5 3236 5771 +19287 f 3222 5771 +19296 5 3243 5771 +1929b 5 3244 5771 +192a0 5 3239 5771 +192a5 5 3240 5771 +192aa 5 3247 5771 +192af 5 3248 5771 +192b4 1b 3222 5771 +192cf 3 3264 5771 +192d2 6 3262 5771 +192d8 10 3264 5771 +192e8 10 3266 5771 +192f8 11 3267 5771 +19309 5 3275 5771 +1930e 2 3276 5771 +19310 5 3255 5771 +19315 2 3257 5771 +19317 3 3224 5771 +1931a 12 3343 5771 +1932c 9 3345 5771 +19335 7 3347 5771 +1933c 16 3348 5771 +19352 6 3352 5771 +19358 d 3353 5771 +19365 5 3355 5771 +1936a 5 3227 5771 +1936f 2 3278 5771 +19371 d 3281 5771 +1937e 2 3282 5771 +19380 5 3219 5771 +19385 2 3220 5771 +19387 3 3287 5771 +1938a 5 3290 5771 +1938f d 3207 5771 +1939c d 3212 5771 +193a9 9 3297 5771 +193b2 1f 3301 5771 +193d1 19 3314 5771 +193ea c 3322 5771 +193f6 2 3326 5771 +193f8 c 3307 5771 +19404 2 3308 5771 +19406 1e 3311 5771 +19424 10 3332 5771 +19434 18 3333 5771 +1944c 5 3337 5771 +19451 c 3360 5771 +1945d 5 3367 5771 +19462 d 3369 5771 +1946f 5 3371 5771 +19474 d 3372 5771 +19481 2 3373 5771 +19483 5 3374 5771 +19488 d 3375 5771 +19495 17 3380 5771 +194ac 16 3385 5771 +194c2 27 3387 5771 +FUNC 194e9 13e 4 UnDecorator::getPrimaryDataType(DName const &) +194e9 7 2962 5771 +194f0 2b 2966 5771 +1951b 12 3027 5771 +1952d d 2972 5771 +1953a c 2974 5771 +19546 a 2975 5771 +19550 b 2981 5771 +1955b 6 2984 5771 +19561 1e 2986 5771 +1957f 7 2996 5771 +19586 2 2997 5771 +19588 6 2998 5771 +1958e f 3000 5771 +1959d 8 3002 5771 +195a5 10 3004 5771 +195b5 2f 3022 5771 +195e4 16 3012 5771 +195fa 17 3008 5771 +19611 14 2969 5771 +19625 2 3030 5771 +FUNC 19627 b1 4 UnDecorator::getDataType(DName *) +19627 6 2922 5771 +1962d b 2923 5771 +19638 15 2928 5771 +1964d 10 2954 5771 +1965d 6 2934 5771 +19663 c 2936 5771 +1966f f 2937 5771 +1967e 13 2939 5771 +19691 6 2944 5771 +19697 29 2946 5771 +196c0 2 2947 5771 +196c2 14 2931 5771 +196d6 2 2957 5771 +FUNC 196d8 64 4 UnDecorator::getExternalDataType(DName const &) +196d8 7 4244 5771 +196df 1e 4247 5771 +196fd 9 4248 5771 +19706 30 4253 5771 +19736 4 4255 5771 +1973a 2 4257 5771 +FUNC 1973c 57 8 fastzero_I +FUNC 19793 8f c _VEC_memzero +FUNC 19822 14 0 _sse2_mathfcns_init +FUNC 19836 14 4 _set_SSE2_enable +FUNC 1984a 87 c fastcopy_I +FUNC 198d1 e3 c _VEC_memcpy +FUNC 199b4 1bd c __crtMessageBoxA +199b4 9 41 4033 +199bd 5 49 4033 +199c2 2 56 4033 +199c4 18 64 4033 +199dc d 66 4033 +199e9 2 67 4033 +199eb 6 69 4033 +199f1 10 76 4033 +19a01 6 78 4033 +19a07 6 80 4033 +19a0d 15 83 4033 +19a22 1a 86 4033 +19a3c 1c 88 4033 +19a58 6 89 4033 +19a5e 8 95 4033 +19a66 6 98 4033 +19a6c a 100 4033 +19a76 14 102 4033 +19a8a 14 116 4033 +19a9e 6 119 4033 +19aa4 d 120 4033 +19ab1 c 122 4033 +19abd 1f 127 4033 +19adc 1b 136 4033 +19af7 6 137 4033 +19afd 7 138 4033 +19b04 2 139 4033 +19b06 7 140 4033 +19b0d 2 142 4033 +19b0f a 144 4033 +19b19 6 146 4033 +19b1f 5 147 4033 +19b24 2 149 4033 +19b26 11 153 4033 +19b37 6 155 4033 +19b3d 5 156 4033 +19b42 8 158 4033 +19b4a b 165 4033 +19b55 5 166 4033 +19b5a 10 168 4033 +19b6a 5 173 4033 +19b6f 2 176 4033 +FUNC 19b71 71 c strcat_s +19b71 0 13 823 +19b71 30 18 823 +19ba1 c 19 823 +19bad 2 21 823 +19baf 4 23 823 +19bb3 1 25 823 +19bb4 3 26 823 +19bb7 2 29 823 +19bb9 2 32 823 +19bbb d 35 823 +19bc8 4 39 823 +19bcc 2 41 823 +19bce e 42 823 +19bdc 5 45 823 +19be1 1 46 823 +FUNC 19be2 b3 10 strncpy_s +19be2 5 13 739 +19be7 14 17 739 +19bfb 5 65 739 +19c00 2 66 739 +19c02 26 24 739 +19c28 5 25 739 +19c2d 2 28 739 +19c2f 2 29 739 +19c31 b 31 739 +19c3c 8 35 739 +19c44 d 37 739 +19c51 2 41 739 +19c53 12 45 739 +19c65 5 48 739 +19c6a 2 50 739 +19c6c 4 54 739 +19c70 6 56 739 +19c76 3 58 739 +19c79 c 59 739 +19c85 2 61 739 +19c87 e 62 739 +FUNC 19c95 46 4 _set_error_mode +19c95 0 43 3937 +19c95 15 50 3937 +19caa 6 58 3937 +19cb0 1 65 3937 +19cb1 5 54 3937 +19cb6 7 55 3937 +19cbd 1 65 3937 +19cbe 1c 61 3937 +19cda 1 65 3937 +FUNC 19cdb a 4 __set_app_type +19cdb 0 91 3937 +19cdb 9 96 3937 +19ce4 1 97 3937 +FUNC 19ce5 6 0 __get_app_type +19ce5 0 120 3937 +19ce5 5 125 3937 +19cea 1 126 3937 +FUNC 19ceb 51 10 x_ismbbtype_l +19ceb 6 213 4669 +19cf1 b 214 4669 +19cfc 4 219 4669 +19d00 3a 222 4669 +19d3a 2 223 4669 +FUNC 19d3c 15 8 _ismbbkalnum_l +19d3c 0 80 4669 +19d3c 14 81 4669 +19d50 1 82 4669 +FUNC 19d51 13 4 _ismbbkalnum +19d51 0 85 4669 +19d51 12 86 4669 +19d63 1 87 4669 +FUNC 19d64 15 8 _ismbbkprint_l +19d64 0 90 4669 +19d64 14 91 4669 +19d78 1 92 4669 +FUNC 19d79 13 4 _ismbbkprint +19d79 0 95 4669 +19d79 12 96 4669 +19d8b 1 97 4669 +FUNC 19d8c 15 8 _ismbbkpunct_l +19d8c 0 100 4669 +19d8c 14 101 4669 +19da0 1 102 4669 +FUNC 19da1 13 4 _ismbbkpunct +19da1 0 105 4669 +19da1 12 106 4669 +19db3 1 107 4669 +FUNC 19db4 18 8 _ismbbalnum_l +19db4 0 113 4669 +19db4 17 114 4669 +19dcb 1 115 4669 +FUNC 19dcc 16 4 _ismbbalnum +19dcc 0 118 4669 +19dcc 15 119 4669 +19de1 1 120 4669 +FUNC 19de2 18 8 _ismbbalpha_l +19de2 0 123 4669 +19de2 17 124 4669 +19df9 1 125 4669 +FUNC 19dfa 16 4 _ismbbalpha +19dfa 0 128 4669 +19dfa 15 129 4669 +19e0f 1 130 4669 +FUNC 19e10 18 8 _ismbbgraph_l +19e10 0 133 4669 +19e10 17 134 4669 +19e27 1 135 4669 +FUNC 19e28 16 4 _ismbbgraph +19e28 0 138 4669 +19e28 15 139 4669 +19e3d 1 140 4669 +FUNC 19e3e 18 8 _ismbbprint_l +19e3e 0 143 4669 +19e3e 17 144 4669 +19e55 1 145 4669 +FUNC 19e56 16 4 _ismbbprint +19e56 0 148 4669 +19e56 15 149 4669 +19e6b 1 150 4669 +FUNC 19e6c 15 8 _ismbbpunct_l +19e6c 0 153 4669 +19e6c 14 154 4669 +19e80 1 155 4669 +FUNC 19e81 13 4 _ismbbpunct +19e81 0 158 4669 +19e81 12 159 4669 +19e93 1 160 4669 +FUNC 19e94 15 8 _ismbblead_l +19e94 0 166 4669 +19e94 14 167 4669 +19ea8 1 168 4669 +FUNC 19ea9 13 4 _ismbblead +19ea9 0 171 4669 +19ea9 12 172 4669 +19ebb 1 173 4669 +FUNC 19ebc 15 8 _ismbbtrail_l +19ebc 0 176 4669 +19ebc 14 177 4669 +19ed0 1 178 4669 +FUNC 19ed1 13 4 _ismbbtrail +19ed1 0 181 4669 +19ed1 12 182 4669 +19ee3 1 183 4669 +FUNC 19ee4 53 8 _ismbbkana_l +19ee4 6 189 4669 +19eea b 190 4669 +19ef5 10 192 4669 +19f05 1f 194 4669 +19f24 2 197 4669 +19f26 f 196 4669 +19f35 2 197 4669 +FUNC 19f37 e 4 _ismbbkana +19f37 0 200 4669 +19f37 d 201 4669 +19f44 1 202 4669 +FUNC 19f45 44 4 _getbuf +19f45 0 43 1893 +19f45 6 50 1893 +19f4b 16 58 1893 +19f61 4 61 1893 +19f65 7 62 1893 +19f6c 2 65 1893 +19f6e 4 69 1893 +19f72 6 70 1893 +19f78 7 71 1893 +19f7f 3 75 1893 +19f82 6 76 1893 +19f88 1 79 1893 +FUNC 19f89 1de 8 _fputwc_nolock +19f89 15 90 2124 +19f9e b 93 2124 +19fa9 48 95 2124 +19ff1 6 101 2124 +19ff7 45 104 2124 +1a03c 27 115 2124 +1a063 9 116 2124 +1a06c 22 120 2124 +1a08e 2 121 2124 +1a090 8 124 2124 +1a098 42 127 2124 +1a0da 17 133 2124 +1a0f1 6 139 2124 +1a0f7 7 141 2124 +1a0fe 34 143 2124 +1a132 6 146 2124 +1a138 6 150 2124 +1a13e d 151 2124 +1a14b d 153 2124 +1a158 f 154 2124 +FUNC 1a167 78 8 fputwc +1a167 c 48 2124 +1a173 2e 52 2124 +1a1a1 3 55 2124 +1a1a4 7 57 2124 +1a1ab 3 58 2124 +1a1ae 11 60 2124 +1a1bf c 63 2124 +1a1cb 4 67 2124 +1a1cf 6 68 2124 +1a1d5 a 64 2124 +FUNC 1a1df 5 8 putwc +1a1df 0 162 2124 +1a1df 5 163 2124 +FUNC 1a1e4 1f7 14 wcstoxl +1a1e4 8 82 6173 +1a1ec b 88 6173 +1a1f7 3 92 6173 +1a1fa b 95 6173 +1a205 2f 97 6173 +1a234 12 98 6173 +1a246 9 103 6173 +1a24f 2 105 6173 +1a251 18 106 6173 +1a269 6 108 6173 +1a26f 4 109 6173 +1a273 2 110 6173 +1a275 6 112 6173 +1a27b 5 113 6173 +1a280 5 115 6173 +1a285 b 118 6173 +1a290 9 119 6173 +1a299 f 120 6173 +1a2a8 9 123 6173 +1a2b1 7 121 6173 +1a2b8 6 126 6173 +1a2be 1a 128 6173 +1a2d8 2 129 6173 +1a2da 5 130 6173 +1a2df d 135 6173 +1a2ec c 141 6173 +1a2f8 15 143 6173 +1a30d 12 144 6173 +1a31f 5 148 6173 +1a324 4 152 6173 +1a328 c 159 6173 +1a334 4 165 6173 +1a338 6 166 6173 +1a33e 9 178 6173 +1a347 6 181 6173 +1a34d 3 183 6173 +1a350 4 184 6173 +1a354 2 186 6173 +1a356 c 161 6173 +1a362 5 173 6173 +1a367 2 174 6173 +1a369 24 189 6173 +1a38d 5 192 6173 +1a392 c 193 6173 +1a39e 6 194 6173 +1a3a4 10 195 6173 +1a3b4 8 201 6173 +1a3bc 2 203 6173 +1a3be 6 205 6173 +1a3c4 3 207 6173 +1a3c7 12 209 6173 +1a3d9 2 210 6173 +FUNC 1a3db 29 c wcstol +1a3db 3 217 6173 +1a3de 8 218 6173 +1a3e6 13 220 6173 +1a3f9 9 224 6173 +1a402 2 226 6173 +FUNC 1a404 1b 10 _wcstol_l +1a404 0 234 6173 +1a404 1a 235 6173 +1a41e 1 236 6173 +FUNC 1a41f 2a c wcstoul +1a41f 3 243 6173 +1a422 7 244 6173 +1a429 14 246 6173 +1a43d a 250 6173 +1a447 2 252 6173 +FUNC 1a449 1b 10 _wcstoul_l +1a449 0 260 6173 +1a449 1a 261 6173 +1a463 1 262 6173 +FUNC 1a464 9 0 _fptrap +1a464 0 46 2503 +1a464 8 47 2503 +1a46c 1 48 2503 +FUNC 1a46d 54 8 _isalpha_l +1a46d 6 57 6535 +1a473 b 58 6535 +1a47e 41 60 6535 +1a4bf 2 61 6535 +FUNC 1a4c1 2b 4 isalpha +1a4c1 0 66 6535 +1a4c1 9 67 6535 +1a4ca 13 69 6535 +1a4dd 1 75 6535 +1a4de d 73 6535 +1a4eb 1 75 6535 +FUNC 1a4ec 4f 8 _isupper_l +1a4ec 6 81 6535 +1a4f2 b 82 6535 +1a4fd 3c 84 6535 +1a539 2 85 6535 +FUNC 1a53b 29 4 isupper +1a53b 0 90 6535 +1a53b 9 91 6535 +1a544 11 93 6535 +1a555 1 99 6535 +1a556 d 97 6535 +1a563 1 99 6535 +FUNC 1a564 4f 8 _islower_l +1a564 6 105 6535 +1a56a b 106 6535 +1a575 3c 108 6535 +1a5b1 2 109 6535 +FUNC 1a5b3 29 4 islower +1a5b3 0 114 6535 +1a5b3 9 115 6535 +1a5bc 11 117 6535 +1a5cd 1 123 6535 +1a5ce d 121 6535 +1a5db 1 123 6535 +FUNC 1a5dc 4f 8 _isdigit_l +1a5dc 6 129 6535 +1a5e2 b 130 6535 +1a5ed 3c 132 6535 +1a629 2 133 6535 +FUNC 1a62b 29 4 isdigit +1a62b 0 138 6535 +1a62b 9 139 6535 +1a634 11 141 6535 +1a645 1 147 6535 +1a646 d 145 6535 +1a653 1 147 6535 +FUNC 1a654 54 8 _isxdigit_l +1a654 6 153 6535 +1a65a b 154 6535 +1a665 41 156 6535 +1a6a6 2 157 6535 +FUNC 1a6a8 2b 4 isxdigit +1a6a8 0 162 6535 +1a6a8 9 163 6535 +1a6b1 13 165 6535 +1a6c4 1 171 6535 +1a6c5 d 169 6535 +1a6d2 1 171 6535 +FUNC 1a6d3 4f 8 _isspace_l +1a6d3 6 177 6535 +1a6d9 b 178 6535 +1a6e4 3c 180 6535 +1a720 2 181 6535 +FUNC 1a722 29 4 isspace +1a722 0 186 6535 +1a722 9 187 6535 +1a72b 11 189 6535 +1a73c 1 195 6535 +1a73d d 193 6535 +1a74a 1 195 6535 +FUNC 1a74b 4f 8 _ispunct_l +1a74b 6 201 6535 +1a751 b 202 6535 +1a75c 3c 204 6535 +1a798 2 205 6535 +FUNC 1a79a 29 4 ispunct +1a79a 0 210 6535 +1a79a 9 211 6535 +1a7a3 11 213 6535 +1a7b4 1 219 6535 +1a7b5 d 217 6535 +1a7c2 1 219 6535 +FUNC 1a7c3 54 8 _isalnum_l +1a7c3 6 225 6535 +1a7c9 b 226 6535 +1a7d4 41 228 6535 +1a815 2 229 6535 +FUNC 1a817 2b 4 isalnum +1a817 0 234 6535 +1a817 9 235 6535 +1a820 13 237 6535 +1a833 1 243 6535 +1a834 d 241 6535 +1a841 1 243 6535 +FUNC 1a842 54 8 _isprint_l +1a842 6 249 6535 +1a848 b 250 6535 +1a853 41 252 6535 +1a894 2 253 6535 +FUNC 1a896 2b 4 isprint +1a896 0 258 6535 +1a896 9 259 6535 +1a89f 13 261 6535 +1a8b2 1 267 6535 +1a8b3 d 265 6535 +1a8c0 1 267 6535 +FUNC 1a8c1 54 8 _isgraph_l +1a8c1 6 273 6535 +1a8c7 b 274 6535 +1a8d2 41 276 6535 +1a913 2 277 6535 +FUNC 1a915 2b 4 isgraph +1a915 0 282 6535 +1a915 9 283 6535 +1a91e 13 285 6535 +1a931 1 291 6535 +1a932 d 289 6535 +1a93f 1 291 6535 +FUNC 1a940 4f 8 _iscntrl_l +1a940 6 297 6535 +1a946 b 298 6535 +1a951 3c 300 6535 +1a98d 2 301 6535 +FUNC 1a98f 29 4 iscntrl +1a98f 0 306 6535 +1a98f 9 307 6535 +1a998 11 309 6535 +1a9a9 1 315 6535 +1a9aa d 313 6535 +1a9b7 1 315 6535 +FUNC 1a9b8 d 4 __isascii +1a9b8 0 320 6535 +1a9b8 c 321 6535 +1a9c4 1 322 6535 +FUNC 1a9c5 8 4 __toascii +1a9c5 0 327 6535 +1a9c5 7 328 6535 +1a9cc 1 329 6535 +FUNC 1a9cd 1f 8 _iscsymf_l +1a9cd 0 335 6535 +1a9cd 1a 336 6535 +1a9e7 1 337 6535 +1a9e8 3 336 6535 +1a9eb 1 337 6535 +FUNC 1a9ec 1a 4 __iscsymf +1a9ec 0 341 6535 +1a9ec 15 342 6535 +1aa01 1 343 6535 +1aa02 3 342 6535 +1aa05 1 343 6535 +FUNC 1aa06 1f 8 _iscsym_l +1aa06 0 349 6535 +1aa06 1a 350 6535 +1aa20 1 351 6535 +1aa21 3 350 6535 +1aa24 1 351 6535 +FUNC 1aa25 1c 4 __iscsym +1aa25 0 356 6535 +1aa25 17 357 6535 +1aa3c 1 358 6535 +1aa3d 3 357 6535 +1aa40 1 358 6535 +FUNC 1aa41 12 8 _MarkAllocaS +1aa41 0 207 2895 +1aa41 8 208 2895 +1aa49 6 210 2895 +1aa4f 3 211 2895 +1aa52 1 214 2895 +FUNC 1aa53 1b 4 _freea +1aa53 0 249 2895 +1aa53 8 251 2895 +1aa5b 3 253 2895 +1aa5e 8 255 2895 +1aa66 7 257 2895 +1aa6d 1 266 2895 +FUNC 1aa6e 13b 18 __crtGetLocaleInfoW_stat +1aa6e f 60 2876 +1aa7d 14 68 2876 +1aa91 d 70 2876 +1aa9e 8 71 2876 +1aaa6 b 73 2876 +1aab1 f 74 2876 +1aac0 5 79 2876 +1aac5 13 81 2876 +1aad8 7 86 2876 +1aadf 2 140 2876 +1aae1 8 96 2876 +1aae9 b 97 2876 +1aaf4 16 100 2876 +1ab0a 7 101 2876 +1ab11 48 104 2876 +1ab59 2 105 2876 +1ab5b 2 106 2876 +1ab5d e 110 2876 +1ab6b 7 113 2876 +1ab72 2 121 2876 +1ab74 2 123 2876 +1ab76 17 130 2876 +1ab8d 6 134 2876 +1ab93 4 136 2876 +1ab97 12 141 2876 +FUNC 1aba9 3b 18 __crtGetLocaleInfoW +1aba9 6 151 2876 +1abaf b 152 2876 +1abba 28 161 2876 +1abe2 2 162 2876 +FUNC 1abe4 13d 18 __crtGetLocaleInfoA_stat +1abe4 f 60 4251 +1abf3 17 68 4251 +1ac0a a 70 4251 +1ac14 8 71 4251 +1ac1c b 73 4251 +1ac27 f 74 4251 +1ac36 11 79 4251 +1ac47 4 86 4251 +1ac4b 5 96 4251 +1ac50 b 97 4251 +1ac5b 13 100 4251 +1ac6e 7 101 4251 +1ac75 49 104 4251 +1acbe 2 105 4251 +1acc0 2 106 4251 +1acc2 10 110 4251 +1acd2 3 114 4251 +1acd5 6 124 4251 +1acdb 2 126 4251 +1acdd 15 135 4251 +1acf2 7 139 4251 +1acf9 4 141 4251 +1acfd 12 81 4251 +1ad0f 12 145 4251 +FUNC 1ad21 3b 18 __crtGetLocaleInfoA +1ad21 6 155 4251 +1ad27 b 156 4251 +1ad32 28 165 4251 +1ad5a 2 166 4251 +FUNC 1ad5c 1a 4 strncnt +1ad5c 0 48 4203 +1ad5c 6 49 4203 +1ad62 6 52 4203 +1ad68 1 53 4203 +1ad69 5 52 4203 +1ad6e 7 55 4203 +1ad75 1 56 4203 +FUNC 1ad76 3a2 20 __crtLCMapStringA_stat +1ad76 12 99 4203 +1ad88 d 108 4203 +1ad95 1b 109 4203 +1adb0 8 110 4203 +1adb8 b 111 4203 +1adc3 a 112 4203 +1adcd 5 119 4203 +1add2 19 120 4203 +1adeb 5 124 4203 +1adf0 1 125 4203 +1adf1 3 127 4203 +1adf4 16 133 4203 +1ae0a 9 213 4203 +1ae13 8 235 4203 +1ae1b 8 236 4203 +1ae23 27 247 4203 +1ae4a 6 248 4203 +1ae50 48 251 4203 +1ae98 3 252 4203 +1ae9b 6 253 4203 +1aea1 19 262 4203 +1aeba 21 271 4203 +1aedb 8 274 4203 +1aee3 9 277 4203 +1aeec 9 279 4203 +1aef5 12 288 4203 +1af07 5 292 4203 +1af0c 4b 298 4203 +1af57 4 299 4203 +1af5b 18 309 4203 +1af73 3 312 4203 +1af76 6 322 4203 +1af7c 2 325 4203 +1af7e 17 335 4203 +1af95 7 342 4203 +1af9c 8 344 4203 +1afa4 9 346 4203 +1afad b 141 4203 +1afb8 8 142 4203 +1afc0 5 143 4203 +1afc5 8 144 4203 +1afcd 11 146 4203 +1afde 7 147 4203 +1afe5 9 153 4203 +1afee 15 155 4203 +1b003 5 156 4203 +1b008 2 157 4203 +1b00a 1b 164 4203 +1b025 7 166 4203 +1b02c 41 169 4203 +1b06d 2 170 4203 +1b06f 28 196 4203 +1b097 2 183 4203 +1b099 2 184 4203 +1b09b 25 190 4203 +1b0c0 7 198 4203 +1b0c7 2 199 4203 +1b0c9 1a 202 4203 +1b0e3 5 204 4203 +1b0e8 9 205 4203 +1b0f1 c 206 4203 +1b0fd 7 207 4203 +1b104 2 208 4203 +1b106 12 350 4203 +FUNC 1b118 43 24 __crtLCMapStringA +1b118 6 363 4203 +1b11e b 364 4203 +1b129 30 376 4203 +1b159 2 377 4203 +FUNC 1b15b 1b8 1c __crtGetStringTypeA_stat +1b15b f 66 4155 +1b16a 10 75 4155 +1b17a 18 79 4155 +1b192 8 80 4155 +1b19a b 82 4155 +1b1a5 f 83 4155 +1b1b4 11 88 4155 +1b1c5 9 120 4155 +1b1ce 8 141 4155 +1b1d6 8 142 4155 +1b1de 27 153 4155 +1b205 6 154 4155 +1b20b 3e 157 4155 +1b249 2 158 4155 +1b24b 2 159 4155 +1b24d f 161 4155 +1b25c 13 169 4155 +1b26f 11 174 4155 +1b280 6 176 4155 +1b286 6 178 4155 +1b28c 2 90 4155 +1b28e 5 94 4155 +1b293 8 95 4155 +1b29b 5 96 4155 +1b2a0 8 97 4155 +1b2a8 e 99 4155 +1b2b6 4 100 4155 +1b2ba 5 104 4155 +1b2bf 17 106 4155 +1b2d6 2 107 4155 +1b2d8 2 108 4155 +1b2da 3 109 4155 +1b2dd 15 112 4155 +1b2f2 6 113 4155 +1b2f8 7 114 4155 +1b2ff 2 115 4155 +1b301 12 182 4155 +FUNC 1b313 40 20 __crtGetStringTypeA +1b313 6 194 4155 +1b319 b 195 4155 +1b324 2d 206 4155 +1b351 2 207 4155 +FUNC 1b353 6 0 __pwctype_func +1b353 0 24 3986 +1b353 5 25 3986 +1b358 1 26 3986 +FUNC 1b359 29 0 __pctype_func +1b359 0 29 3986 +1b359 7 35 3986 +1b360 3 36 3986 +1b363 18 38 3986 +1b37b 6 39 3986 +1b381 1 40 3986 +FUNC 1b382 419 0 _get_lc_time +1b382 6 94 3379 +1b388 12 104 3379 +1b39a 3 105 3379 +1b39d 2 170 3379 +1b39f 9 108 3379 +1b3a8 16 112 3379 +1b3be 15 113 3379 +1b3d3 15 114 3379 +1b3e8 18 115 3379 +1b400 15 116 3379 +1b415 13 117 3379 +1b428 14 118 3379 +1b43c 18 120 3379 +1b454 15 121 3379 +1b469 15 122 3379 +1b47e 15 123 3379 +1b493 18 124 3379 +1b4ab 15 125 3379 +1b4c0 15 126 3379 +1b4d5 15 128 3379 +1b4ea 18 129 3379 +1b502 15 130 3379 +1b517 15 131 3379 +1b52c 15 132 3379 +1b541 18 133 3379 +1b559 15 134 3379 +1b56e 15 135 3379 +1b583 15 136 3379 +1b598 18 137 3379 +1b5b0 15 138 3379 +1b5c5 15 139 3379 +1b5da 15 141 3379 +1b5ef 18 142 3379 +1b607 15 143 3379 +1b61c 15 144 3379 +1b631 15 145 3379 +1b646 18 146 3379 +1b65e 18 147 3379 +1b676 18 148 3379 +1b68e 18 149 3379 +1b6a6 1b 150 3379 +1b6c1 18 151 3379 +1b6d9 18 152 3379 +1b6f1 18 154 3379 +1b709 1b 155 3379 +1b724 18 160 3379 +1b73c 18 161 3379 +1b754 1b 163 3379 +1b76f 20 165 3379 +1b78f a 169 3379 +1b799 2 170 3379 +FUNC 1b79b 190 4 __free_lc_time +1b79b 1 179 3379 +1b79c c 180 3379 +1b7a8 8 183 3379 +1b7b0 8 184 3379 +1b7b8 8 185 3379 +1b7c0 8 186 3379 +1b7c8 8 187 3379 +1b7d0 8 188 3379 +1b7d8 7 189 3379 +1b7df 8 191 3379 +1b7e7 8 192 3379 +1b7ef 8 193 3379 +1b7f7 8 194 3379 +1b7ff 8 195 3379 +1b807 8 196 3379 +1b80f 8 197 3379 +1b817 8 199 3379 +1b81f b 200 3379 +1b82a 8 201 3379 +1b832 8 202 3379 +1b83a 8 203 3379 +1b842 8 204 3379 +1b84a 8 205 3379 +1b852 8 206 3379 +1b85a 8 207 3379 +1b862 8 208 3379 +1b86a 8 209 3379 +1b872 8 210 3379 +1b87a 8 212 3379 +1b882 8 213 3379 +1b88a 8 214 3379 +1b892 8 215 3379 +1b89a 8 216 3379 +1b8a2 b 217 3379 +1b8ad b 218 3379 +1b8b8 b 219 3379 +1b8c3 b 220 3379 +1b8ce b 221 3379 +1b8d9 b 222 3379 +1b8e4 b 223 3379 +1b8ef b 225 3379 +1b8fa b 226 3379 +1b905 b 228 3379 +1b910 b 229 3379 +1b91b f 230 3379 +1b92a 1 232 3379 +FUNC 1b92b 73 4 __init_time +1b92b 4 56 3379 +1b92f f 60 3379 +1b93e 16 64 3379 +1b954 4 65 3379 +1b958 b 67 3379 +1b963 6 69 3379 +1b969 8 70 3379 +1b971 2 71 3379 +1b973 6 73 3379 +1b979 2 74 3379 +1b97b 2 75 3379 +1b97d 18 78 3379 +1b995 2 82 3379 +1b997 6 83 3379 +1b99d 1 84 3379 +FUNC 1b99e 33 0 fix_grouping +1b99e 0 32 3427 +1b99e 8 40 3427 +1b9a6 a 43 3427 +1b9b0 4 45 3427 +1b9b4 1 61 3427 +1b9b5 6 40 3427 +1b9bb 1 63 3427 +1b9bc 4 50 3427 +1b9c0 2 52 3427 +1b9c2 7 55 3427 +1b9c9 6 56 3427 +1b9cf 2 60 3427 +FUNC 1b9d1 40 4 __free_lconv_num +1b9d1 1 211 3427 +1b9d2 8 212 3427 +1b9da a 215 3427 +1b9e4 7 216 3427 +1b9eb b 218 3427 +1b9f6 7 219 3427 +1b9fd b 221 3427 +1ba08 8 222 3427 +1ba10 1 223 3427 +FUNC 1ba11 1c8 4 __init_numeric +1ba11 7 84 3427 +1ba18 4 92 3427 +1ba1c 2 93 3427 +1ba1e 11 96 3427 +1ba2f 3 177 3427 +1ba32 3 178 3427 +1ba35 c 179 3427 +1ba41 14 102 3427 +1ba55 8 103 3427 +1ba5d 9 108 3427 +1ba66 13 113 3427 +1ba79 9 115 3427 +1ba82 2 116 3427 +1ba84 2 118 3427 +1ba86 9 120 3427 +1ba8f 12 125 3427 +1baa1 8 127 3427 +1baa9 a 128 3427 +1bab3 7 129 3427 +1baba 2 131 3427 +1babc 19 140 3427 +1bad5 15 142 3427 +1baea 1b 144 3427 +1bb05 2 146 3427 +1bb07 c 148 3427 +1bb13 1e 154 3427 +1bb31 2 156 3427 +1bb33 17 154 3427 +1bb4a b 164 3427 +1bb55 9 165 3427 +1bb5e c 166 3427 +1bb6a 8 168 3427 +1bb72 7 169 3427 +1bb79 2 170 3427 +1bb7b 13 186 3427 +1bb8e 11 191 3427 +1bb9f b 193 3427 +1bbaa d 194 3427 +1bbb7 9 197 3427 +1bbc0 9 198 3427 +1bbc9 9 200 3427 +1bbd2 5 201 3427 +1bbd7 2 202 3427 +FUNC 1bbd9 33 0 fix_grouping +1bbd9 0 214 3470 +1bbd9 8 222 3470 +1bbe1 a 225 3470 +1bbeb 4 227 3470 +1bbef 1 243 3470 +1bbf0 6 222 3470 +1bbf6 1 245 3470 +1bbf7 4 232 3470 +1bbfb 2 234 3470 +1bbfd 7 237 3470 +1bc04 6 238 3470 +1bc0a 2 242 3470 +FUNC 1bc0c 89 4 __free_lconv_mon +1bc0c 1 255 3470 +1bc0d 8 256 3470 +1bc15 b 259 3470 +1bc20 7 260 3470 +1bc27 b 262 3470 +1bc32 7 263 3470 +1bc39 b 265 3470 +1bc44 7 266 3470 +1bc4b b 268 3470 +1bc56 7 269 3470 +1bc5d b 271 3470 +1bc68 7 272 3470 +1bc6f b 274 3470 +1bc7a 7 275 3470 +1bc81 b 277 3470 +1bc8c 8 278 3470 +1bc94 1 279 3470 +FUNC 1bc95 2c4 4 __init_monetary +1bc95 8 65 3470 +1bc9d 6 73 3470 +1bca3 13 77 3470 +1bcb6 3 187 3470 +1bcb9 3 188 3470 +1bcbc a 189 3470 +1bcc6 11 83 3470 +1bcd7 8 84 3470 +1bcdf f 89 3470 +1bcee 7 91 3470 +1bcf5 2 92 3470 +1bcf7 2 94 3470 +1bcf9 9 96 3470 +1bd02 f 101 3470 +1bd11 6 103 3470 +1bd17 9 104 3470 +1bd20 2 105 3470 +1bd22 2 107 3470 +1bd24 4 112 3470 +1bd28 14 117 3470 +1bd3c 14 119 3470 +1bd50 14 121 3470 +1bd64 17 123 3470 +1bd7b 14 125 3470 +1bd8f 14 128 3470 +1bda3 14 130 3470 +1bdb7 17 133 3470 +1bdce 14 135 3470 +1bde2 14 137 3470 +1bdf6 14 139 3470 +1be0a 17 141 3470 +1be21 14 143 3470 +1be35 14 145 3470 +1be49 17 147 3470 +1be60 2 149 3470 +1be62 6 150 3470 +1be68 6 151 3470 +1be6e 8 152 3470 +1be76 b 153 3470 +1be81 5 154 3470 +1be86 1c 157 3470 +1bea2 2 159 3470 +1bea4 17 157 3470 +1bebb c 169 3470 +1bec7 3 175 3470 +1beca 32 181 3470 +1befc 11 194 3470 +1bf0d 15 199 3470 +1bf22 b 201 3470 +1bf2d d 202 3470 +1bf3a 9 204 3470 +1bf43 9 205 3470 +1bf4c 6 206 3470 +1bf52 5 208 3470 +1bf57 2 209 3470 +FUNC 1bf59 395 4 __init_ctype +1bf59 11 59 3562 +1bf6a 6 60 3562 +1bf70 1f 82 3562 +1bf8f 7 84 3562 +1bf96 20 89 3562 +1bfb6 7 94 3562 +1bfbd 10 98 3562 +1bfcd b 100 3562 +1bfd8 b 102 3562 +1bfe3 12 104 3562 +1bff5 2f 106 3562 +1c024 5 109 3562 +1c029 2 112 3562 +1c02b e 113 3562 +1c039 15 115 3562 +1c04e a 118 3562 +1c058 4 121 3562 +1c05c 8 124 3562 +1c064 e 126 3562 +1c072 9 128 3562 +1c07b b 129 3562 +1c086 b 128 3562 +1c091 2c 140 3562 +1c0bd 33 155 3562 +1c0f0 2d 166 3562 +1c11d 37 178 3562 +1c154 11 180 3562 +1c165 17 182 3562 +1c17c 15 183 3562 +1c191 d 180 3562 +1c19e 12 189 3562 +1c1b0 f 190 3562 +1c1bf 12 191 3562 +1c1d1 18 195 3562 +1c1e9 11 198 3562 +1c1fa 13 199 3562 +1c20d e 200 3562 +1c21b e 201 3562 +1c229 9 203 3562 +1c232 6 204 3562 +1c238 9 206 3562 +1c241 9 207 3562 +1c24a 9 208 3562 +1c253 9 209 3562 +1c25c 9 210 3562 +1c265 9 213 3562 +1c26e 4 214 3562 +1c272 8 217 3562 +1c27a 8 218 3562 +1c282 8 219 3562 +1c28a 10 220 3562 +1c29a 13 227 3562 +1c2ad 2 231 3562 +1c2af 6 232 3562 +1c2b5 a 233 3562 +1c2bf a 234 3562 +1c2c9 a 235 3562 +1c2d3 a 236 3562 +1c2dd 2 238 3562 +1c2df f 240 3562 +FUNC 1c2ee 29 0 ___mb_cur_max_func +1c2ee 0 248 3562 +1c2ee 7 254 3562 +1c2f5 3 255 3562 +1c2f8 18 257 3562 +1c310 6 259 3562 +1c316 1 260 3562 +FUNC 1c317 16 4 ___mb_cur_max_l_func +1c317 0 263 3562 +1c317 15 264 3562 +1c32c 1 265 3562 +FUNC 1c32d 26 0 ___lc_codepage_func +1c32d 0 268 3562 +1c32d 7 274 3562 +1c334 3 275 3562 +1c337 18 277 3562 +1c34f 3 279 3562 +1c352 1 280 3562 +FUNC 1c353 26 0 ___lc_collate_cp_func +1c353 0 284 3562 +1c353 7 290 3562 +1c35a 3 291 3562 +1c35d 18 293 3562 +1c375 3 295 3562 +1c378 1 296 3562 +FUNC 1c379 26 0 ___lc_handle_func +1c379 0 300 3562 +1c379 7 306 3562 +1c380 3 307 3562 +1c383 18 309 3562 +1c39b 3 311 3562 +1c39e 1 312 3562 +FUNC 1c39f 3 4 __init_collate +1c39f 0 41 3650 +1c39f 2 42 3650 +1c3a1 1 43 3650 +FUNC 1c3a2 fe 4 _Getdays_l +1c3a2 9 111 516 +1c3ab d 115 516 +1c3b8 9 117 516 +1c3c1 9 119 516 +1c3ca 28 120 516 +1c3f2 b 121 516 +1c3fd c 123 516 +1c409 4 126 516 +1c40d 30 128 516 +1c43d 8 129 516 +1c445 31 131 516 +1c476 12 132 516 +1c488 3 134 516 +1c48b 13 137 516 +1c49e 2 138 516 +FUNC 1c4a0 9 0 _Getdays +1c4a0 0 142 516 +1c4a0 8 143 516 +1c4a8 1 144 516 +FUNC 1c4a9 fe 4 _Getmonths_l +1c4a9 9 150 516 +1c4b2 d 154 516 +1c4bf 16 156 516 +1c4d5 2b 159 516 +1c500 b 160 516 +1c50b 8 162 516 +1c513 a 163 516 +1c51d 2d 167 516 +1c54a 8 168 516 +1c552 2c 170 516 +1c57e 11 171 516 +1c58f 3 173 516 +1c592 13 176 516 +1c5a5 2 177 516 +FUNC 1c5a7 9 0 _Getmonths +1c5a7 0 181 516 +1c5a7 8 182 516 +1c5af 1 183 516 +FUNC 1c5b0 355 4 _Gettnames_l +1c5b0 9 189 516 +1c5b9 d 193 516 +1c5c6 9 195 516 +1c5cf 9 197 516 +1c5d8 28 198 516 +1c600 d 199 516 +1c60d 29 200 516 +1c636 18 201 516 +1c64e 11 202 516 +1c65f f 203 516 +1c66e f 204 516 +1c67d 7 205 516 +1c684 e 206 516 +1c692 8 208 516 +1c69a 12 212 516 +1c6ac 13 213 516 +1c6bf 6 214 516 +1c6c5 2a 215 516 +1c6ef 6 216 516 +1c6f5 d 217 516 +1c702 26 218 516 +1c728 1c 219 516 +1c744 18 221 516 +1c75c 6 222 516 +1c762 26 223 516 +1c788 a 224 516 +1c792 5 225 516 +1c797 2a 226 516 +1c7c1 18 227 516 +1c7d9 30 230 516 +1c809 a 231 516 +1c813 30 233 516 +1c843 a 234 516 +1c84d 30 236 516 +1c87d a 237 516 +1c887 30 239 516 +1c8b7 a 240 516 +1c8c1 30 242 516 +1c8f1 12 245 516 +1c903 2 246 516 +FUNC 1c905 9 0 _Gettnames +1c905 0 250 516 +1c905 8 251 516 +1c90d 1 252 516 +FUNC 1c90e 20 0 _store_str +1c90e 0 869 516 +1c90e f 871 516 +1c91d 7 872 516 +1c924 9 873 516 +1c92d 1 875 516 +FUNC 1c92e 36 0 _store_number +1c92e 0 965 516 +1c92e 8 973 516 +1c936 c 976 516 +1c942 2 977 516 +1c944 b 978 516 +1c94f 2 981 516 +1c951 2 982 516 +1c953 1 983 516 +1c954 7 988 516 +1c95b 3 989 516 +1c95e 5 990 516 +1c963 1 991 516 +FUNC 1c964 79 4 _store_num +1c964 8 909 516 +1c96c 2 910 516 +1c96e 8 912 516 +1c976 33 913 516 +1c9a9 2 914 516 +1c9ab 4 917 516 +1c9af 8 918 516 +1c9b7 b 919 516 +1c9c2 c 921 516 +1c9ce 5 923 516 +1c9d3 2 924 516 +1c9d5 2 926 516 +1c9d7 4 927 516 +1c9db 2 928 516 +FUNC 1c9dd 3e6 10 _expandtime +1c9dd 5 548 516 +1c9e2 4f 558 516 +1ca31 16 659 516 +1ca47 5 662 516 +1ca4c 16 587 516 +1ca62 7 589 516 +1ca69 5 590 516 +1ca6e 16 571 516 +1ca84 7 573 516 +1ca8b 5 574 516 +1ca90 5 822 516 +1ca95 7 823 516 +1ca9c 5 824 516 +1caa1 16 667 516 +1cab7 10 668 516 +1cac7 2 669 516 +1cac9 5 672 516 +1cace 23 558 516 +1caf1 6 787 516 +1caf7 5 789 516 +1cafc 15 736 516 +1cb11 2 737 516 +1cb13 2 739 516 +1cb15 5 740 516 +1cb1a 15 722 516 +1cb2f 2 723 516 +1cb31 16 742 516 +1cb47 4 743 516 +1cb4b 2 744 516 +1cb4d 5 745 516 +1cb52 6 746 516 +1cb58 8 747 516 +1cb60 1 748 516 +1cb61 5 752 516 +1cb66 f 715 516 +1cb75 5 718 516 +1cb7a 3 696 516 +1cb7d 2 699 516 +1cb7f 1d 804 516 +1cb9c 6 806 516 +1cba2 d 808 516 +1cbaf 2 809 516 +1cbb1 37 558 516 +1cbe8 19 678 516 +1cc01 8 680 516 +1cc09 2 681 516 +1cc0b 15 650 516 +1cc20 13 652 516 +1cc33 5 653 516 +1cc38 1e 601 516 +1cc56 2 603 516 +1cc58 5 606 516 +1cc5d 2 607 516 +1cc5f 2 608 516 +1cc61 25 615 516 +1cc86 2 617 516 +1cc88 1 627 516 +1cc89 2 642 516 +1cc8b e 579 516 +1cc99 7 581 516 +1cca0 5 582 516 +1cca5 2d 562 516 +1ccd2 6 564 516 +1ccd8 5 565 516 +1ccdd e 687 516 +1cceb 3 689 516 +1ccee 5 690 516 +1ccf3 15 558 516 +1cd08 2 834 516 +1cd0a 5 814 516 +1cd0f 19 817 516 +1cd28 5 819 516 +1cd2d d 795 516 +1cd3a b 798 516 +1cd45 5 799 516 +1cd4a 11 762 516 +1cd5b 5 764 516 +1cd60 1 774 516 +1cd61 5 776 516 +1cd66 16 729 516 +1cd7c 6 731 516 +1cd82 5 732 516 +1cd87 16 704 516 +1cd9d 3 705 516 +1cda0 b 706 516 +1cdab 2 707 516 +1cdad e 708 516 +1cdbb 6 839 516 +1cdc1 2 840 516 +FUNC 1cdc3 45d 18 _store_winword +1cdc3 10 1035 516 +1cdd3 5 1043 516 +1cdd8 a 1053 516 +1cde2 3 1043 516 +1cde5 6 1053 516 +1cdeb 2 1054 516 +1cded 6 1049 516 +1cdf3 2 1050 516 +1cdf5 6 1046 516 +1cdfb 10 1057 516 +1ce0b 4 1066 516 +1ce0f 8 1067 516 +1ce17 6 1069 516 +1ce1d d 1075 516 +1ce2a a 1076 516 +1ce34 8 1077 516 +1ce3c 4 1078 516 +1ce40 2a 1085 516 +1ce6a b 1087 516 +1ce75 31 1092 516 +1cea6 7 1093 516 +1cead 3 1097 516 +1ceb0 13 1100 516 +1cec3 10 1101 516 +1ced3 b 1102 516 +1cede b 1103 516 +1cee9 9 1106 516 +1cef2 3 1291 516 +1cef5 12 1292 516 +1cf07 11 1114 516 +1cf18 5 1117 516 +1cf1d b 1120 516 +1cf28 37 1125 516 +1cf5f 14 1274 516 +1cf73 c 1277 516 +1cf7f 8 1283 516 +1cf87 4 1284 516 +1cf8b 9 1286 516 +1cf94 c 1287 516 +1cfa0 5 1277 516 +1cfa5 e 1128 516 +1cfb3 7 1133 516 +1cfba 7 1132 516 +1cfc1 7 1130 516 +1cfc8 2 1131 516 +1cfca 5 1134 516 +1cfcf a 1156 516 +1cfd9 7 1158 516 +1cfe0 2 1159 516 +1cfe2 5 1160 516 +1cfe7 11 1175 516 +1cff8 5 1176 516 +1cffd 11 1177 516 +1d00e 6 1178 516 +1d014 2 1179 516 +1d016 5 1180 516 +1d01b b 1225 516 +1d026 13 1226 516 +1d039 4 1228 516 +1d03d 1a 1233 516 +1d057 9 1236 516 +1d060 8 1242 516 +1d068 4 1243 516 +1d06c 9 1246 516 +1d075 8 1247 516 +1d07d 5 1277 516 +1d082 1 1230 516 +1d083 5 1250 516 +1d088 12 1136 516 +1d09a 7 1141 516 +1d0a1 7 1140 516 +1d0a8 7 1138 516 +1d0af 2 1139 516 +1d0b1 5 1142 516 +1d0b6 29 1125 516 +1d0df e 1144 516 +1d0ed 7 1147 516 +1d0f4 2 1146 516 +1d0f6 5 1148 516 +1d0fb 7 1182 516 +1d102 b 1183 516 +1d10d 2 1184 516 +1d10f 6 1185 516 +1d115 12 1187 516 +1d127 17 1188 516 +1d13e c 1191 516 +1d14a 8 1197 516 +1d152 4 1198 516 +1d156 8 1201 516 +1d15e 2 1202 516 +1d160 5 1203 516 +1d165 9 1204 516 +1d16e 1a 1205 516 +1d188 9 1207 516 +1d191 8 1212 516 +1d199 4 1213 516 +1d19d 9 1215 516 +1d1a6 8 1216 516 +1d1ae 2 1220 516 +1d1b0 d 1168 516 +1d1bd 7 1170 516 +1d1c4 2 1171 516 +1d1c6 2 1172 516 +1d1c8 d 1162 516 +1d1d5 7 1164 516 +1d1dc 2 1165 516 +1d1de 2 1166 516 +1d1e0 d 1150 516 +1d1ed 7 1152 516 +1d1f4 2 1153 516 +1d1f6 1b 1268 516 +1d211 3 1272 516 +1d214 5 1273 516 +1d219 7 1194 516 +FUNC 1d220 1af 18 _Strftime_l +1d220 6 356 516 +1d226 4 361 516 +1d22a 13 362 516 +1d23d 33 364 516 +1d270 33 365 516 +1d2a3 d 368 516 +1d2b0 10 375 516 +1d2c0 e 385 516 +1d2ce a 387 516 +1d2d8 1e 435 516 +1d2f6 4 438 516 +1d2fa a 446 516 +1d304 5 447 516 +1d309 b 452 516 +1d314 3 453 516 +1d317 2 454 516 +1d319 7 400 516 +1d320 1 405 516 +1d321 2 408 516 +1d323 5 409 516 +1d328 1 411 516 +1d329 1 412 516 +1d32a 1d 415 516 +1d347 1 428 516 +1d348 5 385 516 +1d34d 5 464 516 +1d352 5 469 516 +1d357 13 470 516 +1d36a 3 441 516 +1d36d f 478 516 +1d37c b 481 516 +1d387 2 483 516 +1d389 b 402 516 +1d394 2 403 516 +1d396 5 421 516 +1d39b 7 423 516 +1d3a2 2 464 516 +1d3a4 18 485 516 +1d3bc 11 488 516 +1d3cd 2 490 516 +FUNC 1d3cf 1e 14 _strftime_l +1d3cf 3 291 516 +1d3d2 19 292 516 +1d3eb 2 293 516 +FUNC 1d3ed 1d 10 strftime +1d3ed 0 300 516 +1d3ed 1c 301 516 +1d409 1 302 516 +FUNC 1d40a 1e 14 _Strftime +1d40a 3 343 516 +1d40d 19 345 516 +1d426 2 346 516 +FUNC 1d428 26 0 localeconv +1d428 0 69 3302 +1d428 5 75 3302 +1d42d 1b 78 3302 +1d448 5 79 3302 +1d44d 1 80 3302 +FUNC 1d450 46 8 strcspn +1d450 4 191 924 +1d454 2 198 924 +1d456 1 199 924 +1d457 1 200 924 +1d458 1 201 924 +1d459 1 202 924 +1d45a 1 203 924 +1d45b 1 204 924 +1d45c 1 205 924 +1d45d 1 206 924 +1d45e 6 212 924 +1d464 2 216 924 +1d466 2 217 924 +1d468 2 218 924 +1d46a 3 219 924 +1d46d 4 220 924 +1d471 2 221 924 +1d473 3 227 924 +1d476 6 229 924 +1d47c 3 234 924 +1d47f 2 236 924 +1d481 2 237 924 +1d483 2 238 924 +1d485 3 239 924 +1d488 4 240 924 +1d48c 2 245 924 +1d48e 2 255 924 +1d490 3 257 924 +1d493 3 259 924 +FUNC 1d496 60 c TranslateName +1d496 3 340 3849 +1d499 3 342 3849 +1d49c 3 343 3849 +1d49f b 346 3849 +1d4aa a 348 3849 +1d4b4 14 349 3849 +1d4c8 6 351 3849 +1d4ce a 352 3849 +1d4d8 2 353 3849 +1d4da 4 354 3849 +1d4de 2 355 3849 +1d4e0 3 356 3849 +1d4e3 7 346 3849 +1d4ea a 359 3849 +1d4f4 2 360 3849 +FUNC 1d4f6 14 0 GetLcidFromDefault +1d4f6 0 761 3849 +1d4f6 7 762 3849 +1d4fd c 763 3849 +1d509 1 764 3849 +FUNC 1d50a 77 0 ProcessCodePage +1d50a 13 784 3849 +1d51d 1a 787 3849 +1d537 11 795 3849 +1d548 8 799 3849 +1d550 2 801 3849 +1d552 18 791 3849 +1d56a 3 793 3849 +1d56d 7 805 3849 +1d574 d 806 3849 +FUNC 1d581 1e 4 TestDefaultCountry +1d581 0 826 3849 +1d581 2 830 3849 +1d583 15 832 3849 +1d598 3 835 3849 +1d59b 1 836 3849 +1d59c 2 833 3849 +1d59e 1 836 3849 +FUNC 1d59f 32 0 LcidFromHexString +1d59f 1 893 3849 +1d5a0 2 895 3849 +1d5a2 2 897 3849 +1d5a4 9 899 3849 +1d5ad 5 900 3849 +1d5b2 8 901 3849 +1d5ba 3 902 3849 +1d5bd 10 903 3849 +1d5cd 3 906 3849 +1d5d0 1 907 3849 +FUNC 1d5d1 1b 0 GetPrimaryLen +1d5d1 0 926 3849 +1d5d1 2 927 3849 +1d5d3 3 930 3849 +1d5d6 12 931 3849 +1d5e8 1 933 3849 +1d5e9 2 935 3849 +1d5eb 1 938 3849 +FUNC 1d5ec 96 4 CountryEnumProc +1d5ec 15 717 3849 +1d601 7 718 3849 +1d608 f 719 3849 +1d617 23 725 3849 +1d63a 3 728 3849 +1d63d 3 729 3849 +1d640 12 731 3849 +1d652 b 734 3849 +1d65d a 738 3849 +1d667 b 741 3849 +1d672 10 742 3849 +FUNC 1d682 72 8 TestDefaultLanguage +1d682 11 858 3849 +1d693 22 864 3849 +1d6b5 4 865 3849 +1d6b9 d 867 3849 +1d6c6 1c 871 3849 +1d6e2 2 872 3849 +1d6e4 3 874 3849 +1d6e7 d 875 3849 +FUNC 1d6f4 1d0 4 LangCountryEnumProc +1d6f4 16 435 3849 +1d70a 7 436 3849 +1d711 d 437 3849 +1d71e 27 444 3849 +1d745 4 447 3849 +1d749 8 448 3849 +1d751 16 450 3849 +1d767 1d 456 3849 +1d784 2 460 3849 +1d786 11 462 3849 +1d797 7 467 3849 +1d79e 5 468 3849 +1d7a3 6 472 3849 +1d7a9 1a 475 3849 +1d7c3 14 482 3849 +1d7d7 3 483 3849 +1d7da a 487 3849 +1d7e4 b 490 3849 +1d7ef 6 493 3849 +1d7f5 3 494 3849 +1d7f8 12 501 3849 +1d80a 1d 506 3849 +1d827 6 510 3849 +1d82d c 513 3849 +1d839 16 518 3849 +1d84f 8 522 3849 +1d857 14 528 3849 +1d86b 2 531 3849 +1d86d 2 540 3849 +1d86f 1b 550 3849 +1d88a f 553 3849 +1d899 7 557 3849 +1d8a0 5 558 3849 +1d8a5 3 559 3849 +1d8a8 b 566 3849 +1d8b3 11 567 3849 +FUNC 1d8c4 bf 4 LanguageEnumProc +1d8c4 15 624 3849 +1d8d9 7 625 3849 +1d8e0 f 626 3849 +1d8ef 23 632 3849 +1d912 3 635 3849 +1d915 3 636 3849 +1d918 11 639 3849 +1d929 7 643 3849 +1d930 2 650 3849 +1d932 1d 651 3849 +1d94f f 654 3849 +1d95e a 658 3849 +1d968 b 662 3849 +1d973 10 663 3849 +FUNC 1d983 2c 0 GetLcidFromCountry +1d983 0 686 3849 +1d983 10 687 3849 +1d993 11 689 3849 +1d9a4 6 693 3849 +1d9aa 4 694 3849 +1d9ae 1 695 3849 +FUNC 1d9af 65 0 GetLcidFromLangCountry +1d9af 0 386 3849 +1d9af 7 388 3849 +1d9b6 1a 389 3849 +1d9d0 5 390 3849 +1d9d5 17 392 3849 +1d9ec 10 394 3849 +1d9fc 13 402 3849 +1da0f 4 403 3849 +1da13 1 404 3849 +FUNC 1da14 3c 0 GetLcidFromLanguage +1da14 0 591 3849 +1da14 13 593 3849 +1da27 e 594 3849 +1da35 10 596 3849 +1da45 6 600 3849 +1da4b 4 601 3849 +1da4f 1 602 3849 +FUNC 1da50 1e3 c __get_qualified_locale +1da50 4 205 3849 +1da54 5 208 3849 +1da59 12 212 3849 +1da6b 7 215 3849 +1da72 5 217 3849 +1da77 3 222 3849 +1da7a f 223 3849 +1da89 10 226 3849 +1da99 d 230 3849 +1daa6 a 232 3849 +1dab0 5 235 3849 +1dab5 2 237 3849 +1dab7 5 240 3849 +1dabc 5 243 3849 +1dac1 14 248 3849 +1dad5 a 250 3849 +1dadf 5 252 3849 +1dae4 2 254 3849 +1dae6 5 256 3849 +1daeb 2 261 3849 +1daed a 263 3849 +1daf7 28 266 3849 +1db1f 2 268 3849 +1db21 13 271 3849 +1db34 3 277 3849 +1db37 6 278 3849 +1db3d 17 281 3849 +1db54 32 285 3849 +1db86 d 289 3849 +1db93 6 290 3849 +1db99 8 293 3849 +1dba1 7 295 3849 +1dba8 8 296 3849 +1dbb0 4 297 3849 +1dbb4 8 301 3849 +1dbbc d 305 3849 +1dbc9 23 306 3849 +1dbec 2 307 3849 +1dbee f 308 3849 +1dbfd 2 309 3849 +1dbff 12 311 3849 +1dc11 2 312 3849 +1dc13 14 313 3849 +1dc27 5 315 3849 +1dc2c 6 286 3849 +1dc32 1 316 3849 +FUNC 1dc33 12 0 cmpResult +FUNC 1dc45 18 0 cmpBYTE +FUNC 1dc5d 40 0 cmpWORD +FUNC 1dc9d 78 0 cmpDWORD +FUNC 1dd15 1490 0 unaligned_memcmp +FUNC 1f1a5 1680 c memcmp +FUNC 20825 be c strncmp +20825 4 42 876 +20829 5 43 876 +2082e 7 45 876 +20835 7 46 876 +2083c 6 48 876 +20842 d 51 876 +2084f 11 56 876 +20860 c 61 876 +2086c c 66 876 +20878 15 71 876 +2088d 2 81 876 +2088f a 73 876 +20899 a 68 876 +208a3 a 63 876 +208ad 10 58 876 +208bd 2 79 876 +208bf a 81 876 +208c9 1 85 876 +208ca 4 86 876 +208ce 5 79 876 +208d3 4 89 876 +208d7 2 90 876 +208d9 a 83 876 +FUNC 208f0 40 8 strpbrk +208f0 4 191 869 +208f4 2 198 869 +208f6 1 199 869 +208f7 1 200 869 +208f8 1 201 869 +208f9 1 202 869 +208fa 1 203 869 +208fb 1 204 869 +208fc 1 205 869 +208fd 1 206 869 +208fe 6 212 869 +20904 2 216 869 +20906 2 217 869 +20908 2 218 869 +2090a 3 219 869 +2090d 4 220 869 +20911 2 221 869 +20913 5 227 869 +20918 2 236 869 +2091a 2 237 869 +2091c 2 238 869 +2091e 3 239 869 +20921 4 240 869 +20925 2 247 869 +20927 3 248 869 +2092a 3 257 869 +2092d 3 259 869 +FUNC 20930 82 c _iswctype_l +20930 6 66 6445 +20936 8 69 6445 +2093e 6 70 6445 +20944 8 71 6445 +2094c 18 72 6445 +20964 2 73 6445 +20966 b 75 6445 +20971 25 85 6445 +20996 3 86 6445 +20999 d 87 6445 +209a6 a 89 6445 +209b0 2 90 6445 +FUNC 209b2 6e 8 iswctype +209b2 4 96 6445 +209b6 8 97 6445 +209be 2 99 6445 +209c0 2 122 6445 +209c2 8 101 6445 +209ca 14 103 6445 +209de 2 122 6445 +209e0 9 106 6445 +209e9 25 117 6445 +20a0e 10 121 6445 +20a1e 2 122 6445 +FUNC 20a20 5 8 is_wctype +20a20 0 148 6445 +20a20 5 149 6445 +FUNC 20a25 22b 14 strtoxl +20a25 8 80 6309 +20a2d b 86 6309 +20a38 3 89 6309 +20a3b b 92 6309 +20a46 30 94 6309 +20a76 11 95 6309 +20a87 c 100 6309 +20a93 34 101 6309 +20ac7 5 102 6309 +20acc 5 104 6309 +20ad1 4 105 6309 +20ad5 2 106 6309 +20ad7 5 108 6309 +20adc 3 109 6309 +20adf 1d 111 6309 +20afc 4 118 6309 +20b00 5 121 6309 +20b05 9 122 6309 +20b0e a 123 6309 +20b18 9 126 6309 +20b21 7 124 6309 +20b28 2 129 6309 +20b2a 5 140 6309 +20b2f f 142 6309 +20b3e 1 143 6309 +20b3f 9 144 6309 +20b48 8 149 6309 +20b50 c 154 6309 +20b5c 8 155 6309 +20b64 7 156 6309 +20b6b 13 157 6309 +20b7e 5 160 6309 +20b83 4 164 6309 +20b87 b 171 6309 +20b92 4 177 6309 +20b96 6 178 6309 +20b9c 8 190 6309 +20ba4 6 193 6309 +20baa 3 195 6309 +20bad 4 196 6309 +20bb1 2 198 6309 +20bb3 c 173 6309 +20bbf 3 185 6309 +20bc2 2 186 6309 +20bc4 24 201 6309 +20be8 5 204 6309 +20bed c 205 6309 +20bf9 6 206 6309 +20bff 10 207 6309 +20c0f 7 213 6309 +20c16 2 215 6309 +20c18 6 217 6309 +20c1e 3 219 6309 +20c21 12 221 6309 +20c33 7 113 6309 +20c3a 2 115 6309 +20c3c 12 116 6309 +20c4e 2 222 6309 +FUNC 20c50 29 c strtol +20c50 3 229 6309 +20c53 8 230 6309 +20c5b 13 232 6309 +20c6e 9 236 6309 +20c77 2 238 6309 +FUNC 20c79 1b 10 _strtol_l +20c79 0 246 6309 +20c79 1a 247 6309 +20c93 1 248 6309 +FUNC 20c94 2a c strtoul +20c94 3 255 6309 +20c97 7 256 6309 +20c9e 14 258 6309 +20cb2 a 262 6309 +20cbc 2 264 6309 +FUNC 20cbe 1b 10 _strtoul_l +20cbe 0 272 6309 +20cbe 1a 273 6309 +20cd8 1 274 6309 +FUNC 20cd9 1f 0 __initconin +20cd9 0 58 5008 +20cd9 1e 65 5008 +20cf7 1 67 5008 +FUNC 20cf8 1f 0 __initconout +20cf8 0 90 5008 +20cf8 1e 97 5008 +20d16 1 98 5008 +FUNC 20d17 2d 0 __termcon +20d17 0 120 5008 +20d17 16 121 5008 +20d2d 3 122 5008 +20d30 f 125 5008 +20d3f 4 126 5008 +20d43 1 128 5008 +FUNC 20d44 94 4 _close_nolock +20d44 1 72 5094 +20d45 54 93 5094 +20d99 a 99 5094 +20da3 2 96 5094 +20da5 6 101 5094 +20dab b 103 5094 +20db6 11 105 5094 +20dc7 7 107 5094 +20dce 5 108 5094 +20dd3 4 111 5094 +20dd7 1 112 5094 +FUNC 20dd8 cd 4 _close +20dd8 c 42 5094 +20de4 23 46 5094 +20e07 2f 47 5094 +20e36 20 48 5094 +20e56 7 50 5094 +20e5d 3 52 5094 +20e60 9 53 5094 +20e69 c 54 5094 +20e75 2 55 5094 +20e77 b 56 5094 +20e82 4 57 5094 +20e86 c 61 5094 +20e92 3 65 5094 +20e95 6 66 5094 +20e9b a 62 5094 +FUNC 20ea5 2c 4 _freebuf +20ea5 1 47 1927 +20ea6 f 50 1927 +20eb5 8 52 1927 +20ebd 7 54 1927 +20ec4 8 55 1927 +20ecc 4 56 1927 +20ed0 1 58 1927 +FUNC 20ed1 2a 0 _purecall +20ed1 0 43 3119 +20ed1 b 44 3119 +20edc 5 45 3119 +20ee1 2 47 3119 +20ee3 7 54 3119 +20eea c 56 3119 +20ef6 5 57 3119 +FUNC 20efb 22 4 _set_purecall_handler +20efb 1 82 3119 +20efc b 85 3119 +20f07 12 86 3119 +20f19 3 88 3119 +20f1c 1 89 3119 +FUNC 20f1d d 0 _get_purecall_handler +20f1d 0 92 3119 +20f1d c 93 3119 +20f29 1 94 3119 +FUNC 20f30 34 0 _allmul +20f30 0 47 5116 +20f30 4 62 5116 +20f34 4 63 5116 +20f38 2 64 5116 +20f3a 4 65 5116 +20f3e 2 66 5116 +20f40 4 68 5116 +20f44 2 69 5116 +20f46 3 71 5116 +20f49 1 74 5116 +20f4a 2 81 5116 +20f4c 2 82 5116 +20f4e 4 84 5116 +20f52 4 85 5116 +20f56 2 86 5116 +20f58 4 88 5116 +20f5c 2 89 5116 +20f5e 2 90 5116 +20f60 1 92 5116 +20f61 3 94 5116 +FUNC 20f64 11 4 atol +20f64 0 55 6631 +20f64 10 56 6631 +20f74 1 57 6631 +FUNC 20f75 15 8 _atol_l +20f75 0 64 6631 +20f75 14 65 6631 +20f89 1 66 6631 +FUNC 20f8a 5 4 atoi +20f8a 0 99 6631 +20f8a 5 100 6631 +FUNC 20f8f 5 8 _atoi_l +20f8f 0 107 6631 +20f8f 5 108 6631 +FUNC 20f94 11 4 _atoi64 +20f94 0 143 6631 +20f94 10 144 6631 +20fa4 1 145 6631 +FUNC 20fa5 15 8 _atoi64_l +20fa5 0 151 6631 +20fa5 14 152 6631 +20fb9 1 153 6631 +FUNC 20fba 50 0 has_osfxsr_set +FUNC 2100a 60 0 _get_sse2_info +FUNC 2106a d 0 __sse2_available_init +FUNC 21077 170 8 _flswbuf +21077 5 93 1980 +2107c c 104 1980 +21088 8 106 1980 +21090 b 107 1980 +2109b 4 108 1980 +2109f a 109 1980 +210a9 4 110 1980 +210ad b 111 1980 +210b8 2 113 1980 +210ba 4 124 1980 +210be 4 125 1980 +210c2 8 126 1980 +210ca 3 127 1980 +210cd 8 128 1980 +210d5 3 137 1980 +210d8 11 138 1980 +210e9 9 141 1980 +210f2 25 151 1980 +21117 7 153 1980 +2111e d 158 1980 +2112b 5 162 1980 +21130 5 163 1980 +21135 7 164 1980 +2113c 7 166 1980 +21143 10 167 1980 +21153 2 168 1980 +21155 6 131 1980 +2115b 5 132 1980 +21160 2e 169 1980 +2118e 13 171 1980 +211a1 2 174 1980 +211a3 9 181 1980 +211ac 2 186 1980 +211ae 1d 195 1980 +211cb 5 201 1980 +211d0 4 202 1980 +211d4 7 203 1980 +211db a 209 1980 +211e5 2 212 1980 +FUNC 211e7 182 4 _wchartodigit +211e7 0 32 6613 +211e7 1b 41 6613 +21202 1 73 6613 +21203 e 42 6613 +21211 19 44 6613 +2122a 1 73 6613 +2122b 14 45 6613 +2123f 14 46 6613 +21253 14 47 6613 +21267 14 48 6613 +2127b 14 49 6613 +2128f 14 50 6613 +212a3 18 51 6613 +212bb 18 52 6613 +212d3 18 53 6613 +212eb 14 54 6613 +212ff 14 55 6613 +21313 12 56 6613 +21325 14 57 6613 +21339 14 58 6613 +2134d c 59 6613 +21359 2 62 6613 +2135b 4 67 6613 +2135f 6 69 6613 +21365 3 71 6613 +21368 1 73 6613 +FUNC 21369 b6 c _isctype_l +21369 7 114 6399 +21370 b 118 6399 +2137b d 121 6399 +21388 f 122 6399 +21397 1f 124 6399 +213b6 3 126 6399 +213b9 d 129 6399 +213c6 2 130 6399 +213c8 a 133 6399 +213d2 26 144 6399 +213f8 10 146 6399 +21408 15 149 6399 +2141d 2 150 6399 +FUNC 2141f 2f 8 _isctype +2141f 0 156 6399 +2141f 9 157 6399 +21428 12 159 6399 +2143a 1 165 6399 +2143b 12 163 6399 +2144d 1 165 6399 +FUNC 21450 2c 0 _alloca_probe_16 +21450 0 44 2632 +21450 1 46 2632 +21451 4 47 2632 +21455 2 48 2632 +21457 3 49 2632 +2145a 2 50 2632 +2145c 2 51 2632 +2145e 2 52 2632 +21460 1 53 2632 +21461 5 54 2632 +21466 1 59 2632 +21467 4 60 2632 +2146b 2 61 2632 +2146d 3 62 2632 +21470 2 63 2632 +21472 2 64 2632 +21474 2 65 2632 +21476 1 66 2632 +21477 5 67 2632 +PUBLIC 21466 0 _alloca_probe_8 +FUNC 2147c 47 4 __ansicp +2147c 10 39 2934 +2148c 1c 44 2934 +214a8 3 45 2934 +214ab 2 46 2934 +214ad a 47 2934 +214b7 c 49 2934 +FUNC 214c3 1b2 18 __convertcp +214c3 16 79 2934 +214d9 10 83 2934 +214e9 18 85 2934 +21501 17 90 2934 +21518 13 92 2934 +2152b 6 93 2934 +21531 d 99 2934 +2153e 2 101 2934 +21540 c 103 2934 +2154c 2a 115 2934 +21576 15 111 2934 +2158b 7 112 2934 +21592 1c 115 2934 +215ae 3 116 2934 +215b1 2 117 2934 +215b3 10 119 2934 +215c3 15 127 2934 +215d8 7 129 2934 +215df 18 138 2934 +215f7 3 139 2934 +215fa 2 140 2934 +215fc 1f 149 2934 +2161b 11 151 2934 +2162c 12 160 2934 +2163e 9 162 2934 +21647 3 163 2934 +2164a 2 164 2934 +2164c 6 165 2934 +21652 5 166 2934 +21657 9 174 2934 +21660 3 177 2934 +21663 12 178 2934 +FUNC 21675 34 4 _get_daylight +21675 0 35 487 +21675 27 36 487 +2169c 1 41 487 +2169d 8 39 487 +216a5 3 40 487 +216a8 1 41 487 +FUNC 216a9 34 4 _get_dstbias +216a9 0 44 487 +216a9 27 45 487 +216d0 1 50 487 +216d1 8 48 487 +216d9 3 49 487 +216dc 1 50 487 +FUNC 216dd 34 4 _get_timezone +216dd 0 53 487 +216dd 27 54 487 +21704 1 59 487 +21705 8 57 487 +2170d 3 58 487 +21710 1 59 487 +FUNC 21711 a2 10 _get_tzname +21711 3 62 487 +21714 10 63 487 +21724 4 64 487 +21728 3 66 487 +2172b 7 68 487 +21732 27 69 487 +21759 20 63 487 +21779 f 72 487 +21788 8 73 487 +21790 4 76 487 +21794 5 78 487 +21799 5 80 487 +2179e 13 82 487 +217b1 2 83 487 +FUNC 217b3 6 0 __daylight +217b3 0 118 487 +217b3 5 119 487 +217b8 1 120 487 +FUNC 217b9 6 0 __dstbias +217b9 0 123 487 +217b9 5 124 487 +217be 1 125 487 +FUNC 217bf 6 0 __timezone +217bf 0 128 487 +217bf 5 129 487 +217c4 1 130 487 +FUNC 217c5 6 0 __tzname +217c5 0 133 487 +217c5 5 134 487 +217ca 1 135 487 +FUNC 217cb c 4 _set_daylight +217cb c 189 418 +FUNC 217d7 c 4 _set_dstbias +217d7 c 190 418 +FUNC 217e3 c 4 _set_timezone +217e3 c 191 418 +FUNC 217ef 349 0 _tzset_nolock +217ef c 124 440 +217fb 5 127 440 +21800 3 129 440 +21803 3 130 440 +21806 3 131 440 +21809 3 132 440 +2180c 3 133 440 +2180f 8 135 440 +21817 3 136 440 +2181a 8 139 440 +21822 1b 142 440 +2183d 1b 143 440 +21858 1b 144 440 +21873 8 149 440 +2187b 6 154 440 +21881 f 160 440 +21890 18 165 440 +218a8 14 260 440 +218bc b 268 440 +218c7 4 274 440 +218cb 7 275 440 +218d2 16 277 440 +218e8 6 281 440 +218ee 32 283 440 +21920 9 174 440 +21929 7 175 440 +21930 6 176 440 +21936 13 179 440 +21949 9 183 440 +21952 b 188 440 +2195d 9 190 440 +21966 e 191 440 +21974 12 199 440 +21986 3 201 440 +21989 c 203 440 +21995 2 205 440 +21997 3 206 440 +2199a 3 214 440 +2199d 27 234 440 +219c4 8 235 440 +219cc 2 236 440 +219ce 7 237 440 +219d5 23 247 440 +219f8 9 248 440 +21a01 2 249 440 +21a03 8 250 440 +21a0b 7 256 440 +21a12 a 288 440 +21a1c a 289 440 +21a26 a 290 440 +21a30 c 292 440 +21a3c 9 296 440 +21a45 23 301 440 +21a68 8 310 440 +21a70 7 311 440 +21a77 1 312 440 +21a78 10 318 440 +21a88 11 320 440 +21a99 5 292 440 +21a9e 9 293 440 +21aa7 5 325 440 +21aac e 329 440 +21aba d 330 440 +21ac7 5 335 440 +21acc b 339 440 +21ad7 d 340 440 +21ae4 5 344 440 +21ae9 3 345 440 +21aec 6 350 440 +21af2 4 351 440 +21af6 21 352 440 +21b17 2 354 440 +21b19 5 355 440 +21b1e a 357 440 +21b28 a 358 440 +21b32 6 360 440 +FUNC 21b38 1f5 24 cvtdate +21b38 6 409 440 +21b3e 4 412 440 +21b42 c 414 440 +21b4e 52 424 440 +21ba0 4c 430 440 +21bec 14 436 440 +21c00 2 437 440 +21c02 2 438 440 +21c04 46 447 440 +21c4a 3 449 440 +21c4d 2 452 440 +21c4f 3c 457 440 +21c8b 3 459 440 +21c8e 27 467 440 +21cb5 6 472 440 +21cbb 2 474 440 +21cbd 29 485 440 +21ce6 11 486 440 +21cf7 a 487 440 +21d01 8 488 440 +21d09 d 490 440 +21d16 6 491 440 +21d1c 6 492 440 +21d22 9 499 440 +21d2b 2 503 440 +FUNC 21d2d 1ae 0 _isindst_nolock +21d2d 5 554 440 +21d32 20 558 440 +21d52 5 560 440 +21d57 7 561 440 +21d5e 1b 568 440 +21d79 c 569 440 +21d85 7 573 440 +21d8c 34 584 440 +21dc0 2 585 440 +21dc2 19 596 440 +21ddb 40 611 440 +21e1b 2 612 440 +21e1d 1e 623 440 +21e3b 2 626 440 +21e3d 14 641 440 +21e51 1a 653 440 +21e6b d 660 440 +21e78 d 664 440 +21e85 8 666 440 +21e8d 4 674 440 +21e91 2 697 440 +21e93 8 673 440 +21e9b 8 675 440 +21ea3 4 676 440 +21ea7 14 679 440 +21ebb 4 681 440 +21ebf b 682 440 +21eca 2 685 440 +21ecc d 691 440 +21ed9 2 694 440 +FUNC 21edb 4f 0 __tzset +21edb c 85 440 +21ee7 a 88 440 +21ef1 8 90 440 +21ef9 3 91 440 +21efc 8 93 440 +21f04 5 94 440 +21f09 6 95 440 +21f0f c 98 440 +21f1b 6 103 440 +21f21 9 99 440 +FUNC 21f2a 38 0 _tzset +21f2a c 109 440 +21f36 8 110 440 +21f3e 4 111 440 +21f42 5 113 440 +21f47 c 115 440 +21f53 6 118 440 +21f59 9 116 440 +FUNC 21f62 41 4 _isindst +21f62 c 538 440 +21f6e 8 541 440 +21f76 4 542 440 +21f7a b 543 440 +21f85 c 544 440 +21f91 3 548 440 +21f94 6 549 440 +21f9a 9 545 440 +FUNC 21fa3 35 8 __ascii_stricmp +21fa3 a 75 693 +21fad c 80 693 +21fb9 3 81 693 +21fbc c 82 693 +21fc8 3 83 693 +21fcb 9 85 693 +21fd4 3 87 693 +21fd7 1 88 693 +FUNC 21fd8 d3 c _stricmp_l +21fd8 7 47 693 +21fdf b 49 693 +21fea 36 52 693 +22020 32 53 693 +22052 8 55 693 +2205a e 57 693 +22068 15 63 693 +2207d 11 64 693 +2208e 8 65 693 +22096 13 68 693 +220a9 2 69 693 +FUNC 220ab 50 8 _stricmp +220ab 4 94 693 +220af a 95 693 +220b9 24 98 693 +220dd 6 99 693 +220e3 1 107 693 +220e4 5 101 693 +220e9 10 105 693 +220f9 2 107 693 +FUNC 220fb f0 10 _strnicmp_l +220fb 7 51 650 +22102 d 54 650 +2210f b 56 650 +2211a 33 59 650 +2214d 7 60 650 +22154 32 61 650 +22186 8 63 650 +2218e 1d 65 650 +221ab 15 71 650 +221c0 11 72 650 +221d1 d 74 650 +221de 6 76 650 +221e4 5 79 650 +221e9 2 80 650 +FUNC 221eb 5c c _strnicmp +221eb 4 125 650 +221ef a 127 650 +221f9 24 130 650 +2221d 5 131 650 +22222 a 132 650 +2222c 1 141 650 +2222d 5 134 650 +22232 13 138 650 +22245 2 141 650 +FUNC 22247 db c xtoa_s +22247 8 93 6581 +2224f 24 102 6581 +22273 24 103 6581 +22297 19 105 6581 +222b0 b 106 6581 +222bb a 112 6581 +222c5 6 114 6581 +222cb 7 116 6581 +222d2 2 118 6581 +222d4 2 121 6581 +222d6 5 124 6581 +222db 5 128 6581 +222e0 3 129 6581 +222e3 2 130 6581 +222e5 6 131 6581 +222eb 3 135 6581 +222ee e 136 6581 +222fc 8 139 6581 +22304 2 141 6581 +22306 2 142 6581 +22308 3 148 6581 +2230b 6 152 6581 +22311 3 154 6581 +22314 1 155 6581 +22315 4 156 6581 +22319 5 158 6581 +2231e 4 160 6581 +FUNC 22322 28 10 _itoa_s +22322 3 172 6581 +22325 d 175 6581 +22332 4 176 6581 +22336 2 177 6581 +22338 10 178 6581 +22348 2 181 6581 +FUNC 2234a 25 10 _ltoa_s +2234a 3 189 6581 +2234d 20 190 6581 +2236d 2 191 6581 +FUNC 2236f 18 10 _ultoa_s +2236f 0 199 6581 +2236f 17 200 6581 +22386 1 201 6581 +FUNC 22387 f6 14 x64toa_s +22387 7 309 6581 +2238e 25 318 6581 +223b3 5 319 6581 +223b8 19 321 6581 +223d1 b 322 6581 +223dc 3 327 6581 +223df 20 333 6581 +223ff 3 336 6581 +22402 1e 352 6581 +22420 3 344 6581 +22423 2 345 6581 +22425 5 346 6581 +2242a 5 351 6581 +2242f 13 352 6581 +22442 5 355 6581 +22447 3 357 6581 +2244a 13 358 6581 +2245d 4 364 6581 +22461 9 368 6581 +2246a 3 370 6581 +2246d 1 371 6581 +2246e 7 372 6581 +22475 4 375 6581 +22479 4 377 6581 +FUNC 2247d 33 14 _i64toa_s +2247d 3 390 6581 +22480 2e 391 6581 +224ae 2 392 6581 +FUNC 224b0 1d 14 _ui64toa_s +224b0 4 400 6581 +224b4 17 401 6581 +224cb 2 402 6581 +FUNC 224cd 224 1c __crtGetStringTypeW_stat +224cd 10 64 2828 +224dd 9 72 2828 +224e6 7 73 2828 +224ed 14 75 2828 +22501 11 79 2828 +22512 8 80 2828 +2251a b 82 2828 +22525 f 83 2828 +22534 4 88 2828 +22538 13 90 2828 +2254b 7 95 2828 +22552 2 199 2828 +22554 8 119 2828 +2255c b 120 2828 +22567 5 121 2828 +2256c b 122 2828 +22577 e 128 2828 +22585 5 130 2828 +2258a 3 131 2828 +2258d 1d 142 2828 +225aa 6 143 2828 +225b0 40 146 2828 +225f0 3 147 2828 +225f3 6 148 2828 +225f9 d 150 2828 +22606 1a 160 2828 +22620 4d 164 2828 +2266d 4 165 2828 +22671 5 170 2828 +22676 b 171 2828 +22681 3 174 2828 +22684 23 178 2828 +226a7 12 186 2828 +226b9 f 189 2828 +226c8 4 187 2828 +226cc 7 191 2828 +226d3 8 194 2828 +226db 4 196 2828 +226df 12 200 2828 +FUNC 226f1 3e 1c __crtGetStringTypeW +226f1 6 211 2828 +226f7 b 212 2828 +22702 2b 222 2828 +2272d 2 223 2828 +FUNC 2272f 294 14 strtoxq +2272f 8 80 6264 +22737 b 86 6264 +22742 3 89 6264 +22745 b 92 6264 +22750 31 94 6264 +22781 12 95 6264 +22793 c 100 6264 +2279f 37 102 6264 +227d6 2 103 6264 +227d8 9 105 6264 +227e1 4 106 6264 +227e5 2 107 6264 +227e7 6 109 6264 +227ed 9 110 6264 +227f6 8 112 6264 +227fe 6 115 6264 +22804 9 116 6264 +2280d a 117 6264 +22817 9 120 6264 +22820 3 118 6264 +22823 5 123 6264 +22828 10 125 6264 +22838 1 126 6264 +22839 9 127 6264 +22842 26 132 6264 +22868 e 137 6264 +22876 8 138 6264 +2287e 6 139 6264 +22884 11 140 6264 +22895 5 143 6264 +2289a 31 154 6264 +228cb 4 160 6264 +228cf 6 161 6264 +228d5 a 173 6264 +228df 7 176 6264 +228e6 6 178 6264 +228ec 6 179 6264 +228f2 5 181 6264 +228f7 19 156 6264 +22910 b 168 6264 +2291b 5 169 6264 +22920 35 184 6264 +22955 5 187 6264 +2295a c 188 6264 +22966 a 189 6264 +22970 6 190 6264 +22976 7 191 6264 +2297d 2 192 6264 +2297f 7 193 6264 +22986 8 195 6264 +2298e 5 197 6264 +22993 6 199 6264 +22999 13 201 6264 +229ac 15 203 6264 +229c1 2 204 6264 +FUNC 229c3 29 c _strtoi64 +229c3 3 211 6264 +229c6 8 212 6264 +229ce 13 214 6264 +229e1 9 218 6264 +229ea 2 220 6264 +FUNC 229ec 1b 10 _strtoi64_l +229ec 0 227 6264 +229ec 1a 228 6264 +22a06 1 229 6264 +FUNC 22a07 2a c _strtoui64 +22a07 3 236 6264 +22a0a 7 237 6264 +22a11 14 239 6264 +22a25 a 243 6264 +22a2f 2 245 6264 +FUNC 22a31 1b 10 _strtoui64_l +22a31 0 253 6264 +22a31 1a 254 6264 +22a4b 1 255 6264 +FUNC 22a50 2b 0 _chkstk +22a50 0 65 2634 +22a50 1 69 2634 +22a51 4 73 2634 +22a55 2 74 2634 +22a57 2 79 2634 +22a59 2 80 2634 +22a5b 2 81 2634 +22a5d 2 83 2634 +22a5f 5 84 2634 +22a64 2 87 2634 +22a66 2 88 2634 +22a68 2 89 2634 +22a6a 1 90 2634 +22a6b 1 91 2634 +22a6c 2 92 2634 +22a6e 3 93 2634 +22a71 1 94 2634 +22a72 5 98 2634 +22a77 2 99 2634 +22a79 2 100 2634 +FUNC 22a7b 81 4 _getenv_helper_nolock +22a7b 0 95 3904 +22a7b 10 103 3904 +22a8b 3 104 3904 +22a8e 1 169 3904 +22a8f e 128 3904 +22a9d 7 131 3904 +22aa4 2 132 3904 +22aa6 6 135 3904 +22aac c 140 3904 +22ab8 9 142 3904 +22ac1 2 150 3904 +22ac3 22 154 3904 +22ae5 3 164 3904 +22ae8 6 150 3904 +22aee 5 168 3904 +22af3 9 169 3904 +FUNC 22afc 93 c _getenv_s_helper +22afc 7 220 3904 +22b03 21 224 3904 +22b24 15 226 3904 +22b39 4 227 3904 +22b3d 3 229 3904 +22b40 a 233 3904 +22b4a 3 234 3904 +22b4d 2 236 3904 +22b4f 7 239 3904 +22b56 6 240 3904 +22b5c 2 243 3904 +22b5e 5 246 3904 +22b63 5 251 3904 +22b68 20 254 3904 +22b88 5 256 3904 +22b8d 2 257 3904 +FUNC 22b8f a2 8 _dupenv_s_helper +22b8f 6 339 3904 +22b95 21 344 3904 +22bb6 9 346 3904 +22bbf 2 348 3904 +22bc1 5 350 3904 +22bc6 8 352 3904 +22bce 6 353 3904 +22bd4 2 355 3904 +22bd6 9 358 3904 +22bdf b 362 3904 +22bea 6 364 3904 +22bf0 b 366 3904 +22bfb 9 367 3904 +22c04 1e 370 3904 +22c22 7 371 3904 +22c29 2 373 3904 +22c2b 4 375 3904 +22c2f 2 376 3904 +FUNC 22c31 83 4 getenv +22c31 c 75 3904 +22c3d 2a 78 3904 +22c67 18 79 3904 +22c7f 8 81 3904 +22c87 3 82 3904 +22c8a c 83 3904 +22c96 c 85 3904 +22ca2 3 89 3904 +22ca5 6 90 3904 +22cab 9 86 3904 +FUNC 22cb4 d8 10 getenv_s +22cb4 c 198 3904 +22cc0 8 201 3904 +22cc8 5 202 3904 +22ccd a1 203 3904 +22d6e c 205 3904 +22d7a 3 209 3904 +22d7d 6 210 3904 +22d83 9 206 3904 +FUNC 22d8c e6 c _dupenv_s +22d8c c 303 3904 +22d98 8 306 3904 +22da0 5 307 3904 +22da5 af 311 3904 +22e54 c 314 3904 +22e60 3 318 3904 +22e63 6 319 3904 +22e69 9 315 3904 +FUNC 22e72 8 4 _tolower +22e72 0 48 6218 +22e72 7 49 6218 +22e79 1 50 6218 +FUNC 22e7a 117 8 _tolower_l +22e7a 8 70 6218 +22e82 b 74 6218 +22e8d c 77 6218 +22e99 31 79 6218 +22eca f 80 6218 +22ed9 14 82 6218 +22eed 2b 86 6218 +22f18 3 88 6218 +22f1b d 91 6218 +22f28 2 92 6218 +22f2a b 94 6218 +22f35 a 97 6218 +22f3f 25 110 6218 +22f64 6 112 6218 +22f6a 5 116 6218 +22f6f 6 117 6218 +22f75 1a 119 6218 +22f8f 2 120 6218 +FUNC 22f91 27 4 tolower +22f91 0 143 6218 +22f91 9 145 6218 +22f9a f 147 6218 +22fa9 1 153 6218 +22faa d 151 6218 +22fb7 1 153 6218 +FUNC 22fc0 61 c __ascii_strnicmp +22fc0 6 69 871 +22fc6 3 75 871 +22fc9 2 76 871 +22fcb 2 77 871 +22fcd 3 79 871 +22fd0 3 80 871 +22fd3 2 82 871 +22fd5 2 83 871 +22fd7 5 84 871 +22fdc 2 89 871 +22fde 2 91 871 +22fe0 2 93 871 +22fe2 2 95 871 +22fe4 2 97 871 +22fe6 2 98 871 +22fe8 3 100 871 +22feb 3 101 871 +22fee 2 103 871 +22ff0 2 104 871 +22ff2 2 106 871 +22ff4 2 107 871 +22ff6 2 109 871 +22ff8 2 112 871 +22ffa 2 113 871 +22ffc 2 115 871 +22ffe 2 116 871 +23000 2 118 871 +23002 2 121 871 +23004 2 122 871 +23006 3 124 871 +23009 2 125 871 +2300b 2 128 871 +2300d 2 129 871 +2300f 2 130 871 +23011 5 133 871 +23016 2 134 871 +23018 2 135 871 +2301a 2 138 871 +2301c 5 140 871 +FUNC 23021 ec 10 _mbsnbicoll_l +23021 7 53 4518 +23028 b 55 4518 +23033 9 57 4518 +2303c 13 58 4518 +2304f 33 61 4518 +23082 6 62 4518 +23088 23 63 4518 +230ab 8 65 4518 +230b3 14 66 4518 +230c7 23 74 4518 +230ea 10 75 4518 +230fa 11 77 4518 +2310b 2 79 4518 +FUNC 2310d 17 c _mbsnbicoll +2310d 0 85 4518 +2310d 16 86 4518 +23123 1 87 4518 +FUNC 23124 95 0 __wtomb_environ +23124 7 43 2699 +2312b 3 44 2699 +2312e 9 45 2699 +23137 c 52 2699 +23143 12 57 2699 +23155 11 61 2699 +23166 12 65 2699 +23178 10 72 2699 +23188 5 74 2699 +2318d 9 76 2699 +23196 3 77 2699 +23199 9 81 2699 +231a2 5 84 2699 +231a7 2 85 2699 +231a9 5 58 2699 +231ae 9 67 2699 +231b7 2 68 2699 +FUNC 231b9 1a 8 strnlen +231b9 0 38 864 +231b9 19 45 864 +231d2 1 49 864 +FUNC 231d3 1a 4 strncnt +231d3 0 50 4345 +231d3 6 51 4345 +231d9 6 54 4345 +231df 1 55 4345 +231e0 5 54 4345 +231e5 7 57 4345 +231ec 1 58 4345 +FUNC 231ed 389 18 __crtCompareStringA_stat +231ed 10 96 4345 +231fd 31 280 4345 +2322e c 107 4345 +2323a b 109 4345 +23245 a 110 4345 +2324f 5 118 4345 +23254 1b 119 4345 +2326f 7 122 4345 +23276 1f 123 4345 +23295 6 120 4345 +2329b 7 121 4345 +232a2 3 124 4345 +232a5 2 125 4345 +232a7 17 130 4345 +232be 7 189 4345 +232c5 8 201 4345 +232cd 8 202 4345 +232d5 d 208 4345 +232e2 5 214 4345 +232e7 8 215 4345 +232ef 2 218 4345 +232f1 6 219 4345 +232f7 5 222 4345 +232fc 4 223 4345 +23300 f 231 4345 +2330f 2 232 4345 +23311 5 237 4345 +23316 4 239 4345 +2331a 2 240 4345 +2331c 10 244 4345 +2332c a 246 4345 +23336 7 244 4345 +2333d 2 262 4345 +2333f 5 253 4345 +23344 6 255 4345 +2334a 8 256 4345 +23352 10 260 4345 +23362 11 262 4345 +23373 7 260 4345 +2337a 2 262 4345 +2337c 1a 280 4345 +23396 6 281 4345 +2339c 4d 284 4345 +233e9 4 285 4345 +233ed 6 286 4345 +233f3 19 295 4345 +2340c 17 305 4345 +23423 46 309 4345 +23469 4 310 4345 +2346d 13 320 4345 +23480 17 326 4345 +23497 7 328 4345 +2349e 8 331 4345 +234a6 9 333 4345 +234af 4 132 4345 +234b3 5 137 4345 +234b8 8 138 4345 +234c0 5 139 4345 +234c5 8 140 4345 +234cd e 142 4345 +234db 6 143 4345 +234e1 5 148 4345 +234e6 19 155 4345 +234ff 2 156 4345 +23501 6 157 4345 +23507 19 163 4345 +23520 4 164 4345 +23524 7 166 4345 +2352b 5 167 4345 +23530 3 169 4345 +23533 3 170 4345 +23536 18 178 4345 +2354e 6 179 4345 +23554 6 181 4345 +2355a 8 182 4345 +23562 2 184 4345 +23564 12 337 4345 +FUNC 23576 40 20 __crtCompareStringA +23576 6 349 4345 +2357c b 350 4345 +23587 2d 361 4345 +235b4 2 362 4345 +FUNC 235b6 f8 10 _strnicoll_l +235b6 7 55 603 +235bd b 57 603 +235c8 9 59 603 +235d1 13 60 603 +235e4 33 63 603 +23617 6 64 603 +2361d 23 65 603 +23640 a 67 603 +2364a 15 68 603 +2365f 21 78 603 +23680 b 80 603 +2368b 10 81 603 +2369b 11 84 603 +236ac 2 85 603 +FUNC 236ae 27 c _strnicoll +236ae 3 92 603 +236b1 9 93 603 +236ba 1 101 603 +236bb 5 95 603 +236c0 13 99 603 +236d3 2 101 603 +FUNC 236d5 4d 4 findenv +236d5 1 387 3036 +236d6 8 390 3036 +236de 12 394 3036 +236f0 d 399 3036 +236fd 9 390 3036 +23706 e 407 3036 +23714 1 408 3036 +23715 c 400 3036 +23721 1 408 3036 +FUNC 23722 5d 0 copy_environ +23722 4 428 3036 +23726 2 429 3036 +23728 6 434 3036 +2372e 2 464 3036 +23730 7 438 3036 +23737 8 439 3036 +2373f 14 443 3036 +23753 8 444 3036 +2375b 6 448 3036 +23761 11 458 3036 +23772 4 448 3036 +23776 2 461 3036 +23778 5 463 3036 +2377d 2 464 3036 +FUNC 2377f 24c 8 __crtsetenv +2377f 6 76 3036 +23785 2c 89 3036 +237b1 2 91 3036 +237b3 1c 98 3036 +237cf 5 114 3036 +237d4 13 125 3036 +237e7 c 126 3036 +237f3 4 130 3036 +237f7 d 153 3036 +23804 9 155 3036 +2380d b 100 3036 +23818 6 101 3036 +2381e 2 356 3036 +23820 3 164 3036 +23823 6 165 3036 +23829 f 171 3036 +23838 2 172 3036 +2383a 2 173 3036 +2383c 8 176 3036 +23844 f 178 3036 +23853 2 179 3036 +23855 2 180 3036 +23857 6 196 3036 +2385d 5 197 3036 +23862 2 200 3036 +23864 10 207 3036 +23874 9 210 3036 +2387d a 216 3036 +23887 6 218 3036 +2388d 5 235 3036 +23892 5 238 3036 +23897 5 241 3036 +2389c c 222 3036 +238a8 4 221 3036 +238ac 1d 230 3036 +238c9 2 233 3036 +238cb 9 245 3036 +238d4 4 250 3036 +238d8 2 251 3036 +238da 2f 255 3036 +23909 8 258 3036 +23911 3 259 3036 +23914 5 262 3036 +23919 5 264 3036 +2391e 21 287 3036 +2393f 25 289 3036 +23964 21 338 3036 +23985 4 339 3036 +23989 b 343 3036 +23994 7 346 3036 +2399b 5 349 3036 +239a0 8 351 3036 +239a8 6 352 3036 +239ae 8 355 3036 +239b6 8 271 3036 +239be 6 274 3036 +239c4 7 276 3036 +FUNC 239cb 50 4 _strdup +239cb 1 66 901 +239cc b 70 901 +239d7 6 71 901 +239dd 9 73 901 +239e6 e 77 901 +239f4 1c 80 901 +23a10 4 81 901 +23a14 6 84 901 +23a1a 1 85 901 +FUNC 23a1b ba c _mbschr_l +23a1b 7 53 4568 +23a22 b 55 4568 +23a2d 32 58 4568 +23a5f 8 60 4568 +23a67 d 61 4568 +23a74 a 65 4568 +23a7e 7 67 4568 +23a85 10 69 4568 +23a95 3 70 4568 +23a98 8 72 4568 +23aa0 d 63 4568 +23aad 8 76 4568 +23ab5 e 77 4568 +23ac3 10 79 4568 +23ad3 2 80 4568 +FUNC 23ad5 13 8 _mbschr +23ad5 0 86 4568 +23ad5 12 87 4568 +23ae7 1 88 4568 +FUNC 23b00 be 8 strchr +23b00 0 60 928 +23b00 2 68 928 +23b02 4 69 928 +23b06 1 73 928 +23b07 2 74 928 +23b09 3 75 928 +23b0c 4 76 928 +23b10 6 77 928 +23b16 2 78 928 +23b18 2 81 928 +23b1a 3 82 928 +23b1d 2 83 928 +23b1f 2 84 928 +23b21 2 85 928 +23b23 2 86 928 +23b25 6 87 928 +23b2b 2 88 928 +23b2d 2 91 928 +23b2f 1 92 928 +23b30 2 93 928 +23b32 3 94 928 +23b35 1 95 928 +23b36 2 96 928 +23b38 2 101 928 +23b3a 5 102 928 +23b3f 2 104 928 +23b41 2 105 928 +23b43 2 107 928 +23b45 2 108 928 +23b47 2 110 928 +23b49 3 111 928 +23b4c 3 113 928 +23b4f 2 114 928 +23b51 2 116 928 +23b53 3 117 928 +23b56 6 119 928 +23b5c 2 120 928 +23b5e 5 124 928 +23b63 2 125 928 +23b65 5 127 928 +23b6a 2 128 928 +23b6c 6 130 928 +23b72 2 131 928 +23b74 1 134 928 +23b75 1 135 928 +23b76 1 137 928 +23b77 2 138 928 +23b79 1 139 928 +23b7a 3 142 928 +23b7d 2 143 928 +23b7f 2 144 928 +23b81 2 145 928 +23b83 2 146 928 +23b85 2 147 928 +23b87 2 148 928 +23b89 2 149 928 +23b8b 2 150 928 +23b8d 3 151 928 +23b90 2 152 928 +23b92 2 153 928 +23b94 2 154 928 +23b96 2 155 928 +23b98 2 156 928 +23b9a 2 157 928 +23b9c 2 158 928 +23b9e 2 159 928 +23ba0 2 160 928 +23ba2 1 163 928 +23ba3 1 164 928 +23ba4 3 165 928 +23ba7 1 166 928 +23ba8 1 167 928 +23ba9 3 170 928 +23bac 1 171 928 +23bad 1 172 928 +23bae 1 173 928 +23baf 1 174 928 +23bb0 3 177 928 +23bb3 1 178 928 +23bb4 1 179 928 +23bb5 1 180 928 +23bb6 1 181 928 +23bb7 3 184 928 +23bba 1 185 928 +23bbb 1 186 928 +23bbc 1 187 928 +23bbd 1 188 928 +PUBLIC 23b06 0 __from_strstr_to_strchr +FUNC 240b9 14 0 `operator new'::`6'::`dynamic atexit destructor for 'nomem'' +STACK WIN 4 41b0 86 13 0 8 0 e0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4240 41 3 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4290 18 4 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 42ae 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42af 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42c6 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42d1 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42d2 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42f3 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4332 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4371 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 43b0 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 43b1 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 43c8 af c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4464 12 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 4477 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 448d 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 44a3 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 44b7 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 44cd 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 44e1 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4506 16 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 451c f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 452b 62 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 452c 60 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 452d 5c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 454a 35 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 458d 42 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 458e 40 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 45cf da c 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 466c 15 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 46a0 8 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 46a9 53 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 46f2 9 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 46fc 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4705 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 470b b1 8 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4713 a8 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4785 33 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 47bc 20 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 47dc 3c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 47dd 3a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4818 2e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4846 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 487c 2a 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48a6 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48bc 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48c1 30 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 48c6 2b 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 48f1 7 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48f8 7 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48ff 7 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4906 52 8 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 490c 4c 2 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 4958 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 498e 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 49c4 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 49fa 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4a14 30 1 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4a15 2e 0 0 10 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4a44 d5 7 0 1c 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4a4b ce 0 0 1c 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 4b19 9d 5 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4b1e 98 0 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 4bb6 73 7 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4bbb 6c 2 0 14 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 4bbc 6a 1 0 14 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 4bbd 68 0 0 14 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 4c29 28 5 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4c2e 22 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4c51 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4c72 4c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4c73 4a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4cbe 5e 6 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4d1c 4a b 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4d26 1b 1 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4d27 16 0 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4d66 19 a 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4d67 17 9 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4d7f 6a 6 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4de9 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4df8 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e06 1c 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e07 18 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e22 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e31 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e39 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e54 1c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e70 1f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e8f 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e93 b 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e9e 5 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4ea3 11 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4eb4 4e 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4eb5 4a 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4eba 44 3 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4ebb 42 2 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f02 18 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4f1a 58 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4f1b 54 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f20 4e 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f34 37 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f72 56 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4f73 52 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f78 4c 3 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f79 4a 2 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4fc8 16 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4fde d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4feb 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4fec 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5004 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5005 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 501c b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5027 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5028 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5040 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5041 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5058 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5063 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5064 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 507b 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 507c 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5093 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 509e 1c 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 509f 18 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50ba 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50bb 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50dc 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50dd 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50fe 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50ff 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5120 7b 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5124 75 4 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5128 70 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 519b 5b 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 51a2 52 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 51a3 50 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 51f6 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5200 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 520a a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5214 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 521e a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5228 24 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 524c 41 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 528d 1b6 c 0 0 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5405 14 0 0 0 c 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 5443 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 544d a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5457 fc 1c 0 14 4 328 0 1 $T0 $ebp 680 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5553 22 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5554 20 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5575 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5582 9 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 558b 24 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 55af 10 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 55bf 9 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 55c8 96 7 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 55cf 8d 0 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 55fb 60 0 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 565e 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5678 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5694 1f 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 56b3 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 56cf 1d 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 56ec 20 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 570c 1d 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5729 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 573a 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 574b 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5761 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5777 14f c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 58bc 9 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 58c6 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 58e0 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 58fa 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5912 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 592c 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5944 f6 7 0 18 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 594b ed 0 0 18 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 5973 c4 0 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 5977 bf 0 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 5a3a 27 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5a61 28 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5a89 87 4 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5a8d 81 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5ab2 5b 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5b10 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5b2b 107 5 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5b30 100 0 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5b5b d4 0 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5b5f cf 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5c32 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5c50 27 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5c77 28 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5c9f 24 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5cc3 26 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5ce9 15 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5cfe 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d07 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d10 18 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d11 16 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d28 20 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d29 1e 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d48 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d4d 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d7f 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d84 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5dbb 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5dc0 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5df7 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5dfc 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5e33 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5e38 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5e6f 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5e74 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5ea6 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5eab 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5edd 92 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5f1b 34 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5f1c 32 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5f6f e2 c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6039 11 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 6051 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6062 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6073 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6082 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6091 4c 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6092 4a 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 616b 33 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 619e 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 61d4 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 620a 39 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6243 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6257 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6266 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6275 96 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6276 94 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 62ba 4a 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 62bb 46 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 630b 2f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6313 26 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 633a 82 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6341 78 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 63bc e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 63ca 3 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 63cd 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6400 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6404 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6424 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6429 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 642a 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 646e d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 647b 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 648b e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6499 994 2c 0 10 0 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 64bb 945 a 0 10 4 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 64c2 93b 3 0 10 8 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 64c5 937 0 0 10 c 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 6e2d 3b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6e68 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6e7b 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6e8e 1e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6e8f 1c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6eac 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6ec7 2a 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6ec8 28 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6ef1 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6f0c 2a 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6f0d 28 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6fa0 24 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6fd0 196 14 0 10 0 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6fd4 d3 10 0 10 4 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 24 - ^ = +STACK WIN 4 6fd9 cd b 0 10 8 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ = +STACK WIN 4 6fda cb a 0 10 c 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ = +STACK WIN 4 6fe4 c0 0 0 10 10 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ = +STACK WIN 4 7166 90 c 0 10 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 71eb a 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 71f6 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7210 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 722a 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7244 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 725c 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7274 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 728c 104 9 0 0 0 328 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7390 5c6 22 0 c 0 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 73b2 597 0 0 c 4 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 73fe 542 0 0 c 8 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1436 - ^ = +STACK WIN 4 740c 533 0 0 c c 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1436 - ^ = +STACK WIN 4 7956 dc c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7a28 9 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 7a32 2d 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7a37 27 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7a5f e1 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7b36 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 7b40 49 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7b41 3b 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7b42 39 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7b89 55 8 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7b8a 53 7 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 7b91 4b 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 7b97 2a 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 7bde 15 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7bf3 18 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7c0b c3 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7cc5 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 7cce 31 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7cd5 28 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7cff 240 c 0 0 c 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7f28 4 0 0 0 c 64 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 7f3f 4c 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f40 4a 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f41 48 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f8b 21 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f8c 1f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7fac 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7fbc 40 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7fbd 3e 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7fbe 3c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ffc 48 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ffd 46 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ffe 44 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8044 4b 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8045 49 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8046 47 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 808f 50 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8090 4e 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8091 4c 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 80df 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 80e7 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 80f1 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 80fb 8e c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8151 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8189 9f c 0 0 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 821f 8 0 0 0 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8228 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8229 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8241 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 824c 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 824d 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 826e 5c 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 826f 5a 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8270 58 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 82ca 44 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 830e e1 c 0 10 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8390 a 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 83ce 20 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 83ef 45 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8434 54 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8477 9 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8488 25 7 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 848f 1d 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 84ad 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 84c0 b3 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 84c7 9a 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 84c8 98 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8573 4c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 85bf 139 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 85c0 137 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 85cf 127 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 85d0 11f 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 85d1 11d 0 0 8 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 86f8 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 86fc 32 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8714 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 872e 33 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8747 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8761 32 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8779 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8793 3b c 0 14 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 87b4 a 0 0 14 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 87ce 79 6 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 87f0 52 0 0 4 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 87f1 50 0 0 4 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 8847 49 c 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8890 30 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8891 2a 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 8892 28 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 88c0 82 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 88c1 7b 7 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 88c8 73 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8942 19c 14 0 18 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 89d2 9 0 0 18 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8a62 7b 0 0 18 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8ade 17f c 0 10 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8c49 4 0 0 10 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8c5d 91 c 0 10 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8ce2 4 0 0 10 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8cee 143 9 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8cfe 131 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 8d02 12c 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 8d05 128 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 8e31 6c 3 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8e9d f2 6 0 20 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8ea3 ea 0 0 20 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8eb3 d9 0 0 20 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8f31 5a 0 0 20 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 8f8f 356 17 0 20 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8f99 34a d 0 20 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 8fa5 33d 1 0 20 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 8fa6 33b 0 0 20 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 92e5 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 92e6 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 92fd e4 6 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9301 de 2 0 20 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 9302 dc 1 0 20 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 9303 da 0 0 20 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 93e1 6c 7 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 93e7 64 1 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 93e8 62 0 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 9408 41 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 944d 6e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 944e 6c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 94bb 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 94c4 6e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 94c5 6c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9532 9 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 953b 15 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9550 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9556 32 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9557 30 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9588 19 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 95a1 3d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 95de bf c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9694 8 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 969d 77 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 969e 75 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 969f 71 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9714 18 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9715 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 972c 121 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9835 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9841 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 984d 69 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9857 4b 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9860 25 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 98b6 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 98bc 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 98c2 184 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 98c3 182 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 98de 166 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9a46 39 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9a66 4 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9a7f 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9a92 37 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9ab6 4 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9ac9 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9b2c b9 5 0 4 0 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9b2e b5 3 0 4 4 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 9b2f b3 2 0 4 8 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9b30 b1 1 0 4 c 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9b31 af 0 0 4 10 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9be5 2f 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9be6 2d 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9c14 3c c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9c4a 5 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9c50 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9c62 4f c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9ca8 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9cb1 75 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9cf9 2c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9d26 c3 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9d27 c1 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 9d35 9c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9d3c 94 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9d3d 90 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9de9 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9df3 31 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9df4 2f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e24 9 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e2d d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e3a 22 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e5c 22 3 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9e7e 70 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9ee5 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9eee f5 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9fd7 b 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9fe3 70 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a04a 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 a053 31 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a084 eb c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a163 b 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 a16f 53 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a1b9 8 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 a258 65 b 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a25d 5f 6 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 a262 59 1 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 a263 57 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 aa15 3d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 aa52 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 aa60 1a0 8 0 4 0 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 aa62 19c 6 0 4 4 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 aa67 196 1 0 4 8 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 aa68 194 0 0 4 c 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 aa85 176 0 0 4 10 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 20 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 ac00 20 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac20 39 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac59 1 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac5a 32 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac65 1c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac8c 15e 6 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ac92 156 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 acaa 13d 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 acb0 136 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 adea 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae05 db b 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae06 c3 a 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ae0f b9 1 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ae10 b7 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ae5f 67 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 aee0 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 aeea 198 e 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 aef2 187 6 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 aef8 180 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 b082 b9 11 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b089 b0 a 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 b092 a6 1 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 b093 a4 0 0 0 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 b13b 135 b 0 0 0 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b143 12a 3 0 0 4 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ = +STACK WIN 4 b144 128 2 0 0 8 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ = +STACK WIN 4 b145 126 1 0 0 c 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ = +STACK WIN 4 b146 124 0 0 0 10 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ = +STACK WIN 4 b270 24 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b271 22 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b272 20 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b294 24 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b295 22 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b296 20 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b2b8 5b 6 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b2be 43 0 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b313 5a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b36d 74 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b36e 72 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 b37a 53 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 b381 4b 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 b38c 30 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 b3e1 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b3e7 94 15 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b3fb 7e 1 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 b3fc 7c 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 b418 5f 0 0 0 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 b47b 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b483 160 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b488 159 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b4c5 11b 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 b52c b3 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 b5e3 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b608 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b60c 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b62d 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b632 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 b633 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 b67c 910 30 0 10 0 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b69e 8c1 e 0 10 4 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 b6a5 8b7 7 0 10 8 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 b6ac 8af 0 0 10 c 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 bf8c 97 7 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 bf93 8e 0 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 bfbf 61 0 0 10 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 c023 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c03a 5 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c03f 55 7 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c046 4c 0 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c094 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0ac 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0c6 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0de 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0f8 14e c 0 14 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c23c 9 0 0 14 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 c246 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c264 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c282 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c2a0 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c2bc 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c2d8 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c2f4 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c319 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c31d 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c33e 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c343 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 c344 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 c38d 91c 2c 0 10 0 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c3a9 8d3 10 0 10 4 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 c3b0 8c9 9 0 10 8 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 c3b9 8bf 0 0 10 c 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 cca9 154 9 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ccb1 14a 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ccb2 148 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 cdfd 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ce22 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ce26 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ce47 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ce4c 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ce4d 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ce96 f60 2a 0 10 0 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ceb8 f0f 8 0 10 4 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ = +STACK WIN 4 ceb9 f0b 7 0 10 8 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ = +STACK WIN 4 cec0 f03 0 0 10 c ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ = +STACK WIN 4 ddf6 1f 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ddf7 1d 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ddf8 1b 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 de20 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 de50 42 18 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 de5e 33 a 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 de5f 31 9 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 de68 27 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 dea0 bb 33 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 deba a1 19 0 4 10 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 df29 14 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 df5b 19 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 df74 9b c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 dfed 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 e00f 34 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e01a 1d 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e043 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e050 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e059 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e062 23d c 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e257 b 0 0 8 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 e29f 1b0 c 0 4 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e40d 14 0 0 4 c 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 e44f a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e459 104 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e45a 102 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 e45b 100 1 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 e45c fe 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 e495 c4 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 16 - ^ = +STACK WIN 4 e55d 15a 24 0 14 0 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e576 bc b 0 14 4 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ = +STACK WIN 4 e577 b8 a 0 14 8 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ = +STACK WIN 4 e581 ad 0 0 14 c 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ = +STACK WIN 4 e6b7 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e6c1 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e6cb 10 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e6db c5 c 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e761 17 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 e7a0 5e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e7b8 45 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e7fe 2f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e82d 55 b 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e82e 53 a 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 e82f 51 9 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 e830 4f 8 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 e831 4d 7 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 e882 18a 1d 0 0 0 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e89e 161 1 0 0 4 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1312 - ^ = +STACK WIN 4 e89f 15d 0 0 0 8 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1312 - ^ = +STACK WIN 4 ea0c a4 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 eaa4 b 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 eab0 7a 7 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 eab7 71 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 eb2a 1d9 19 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 eb3b 1c1 8 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 eb3f 1ba 4 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 eb43 1b5 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 ed03 3c 6 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ed3f 19a c 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 eea0 8 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 eed9 1e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 eef7 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 eefd 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ef03 140 12 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ef04 13e 11 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ef05 13c 10 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 ef06 13a f 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 ef15 12a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 f043 86 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f044 84 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f045 82 6 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 f046 80 5 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 f04b 7a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 f0c9 8c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f0ca 8a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f0d3 7e 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 f0d4 7c 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 f0d5 7a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 f155 24 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f156 22 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f165 12 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f179 3e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f182 31 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f1b7 76 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f221 8 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 f22d 66 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f22e 64 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f22f 62 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f293 53 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f2e6 96 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f370 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 f37c 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f381 88 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f3fd b 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 f409 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f40e 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f411 3e 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f412 3c 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f413 3a 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f41e 2e 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f44f 129 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f453 123 2 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 f454 121 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 f455 11f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 f578 6b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f57c 4d 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 f57d 4b 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 f5e3 171 4 0 0 0 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f5e7 169 0 0 0 4 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 20 - ^ = +STACK WIN 4 f606 149 0 0 0 8 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 24 - ^ = $ebx $T0 20 - ^ = +STACK WIN 4 f607 141 0 0 0 c 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 24 - ^ = $ebx $T0 20 - ^ = +STACK WIN 4 f754 1d4 1e 0 18 0 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f76d 1b1 5 0 18 4 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 f76e 1ad 4 0 18 8 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 f772 1a8 0 0 18 c b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 f928 2f6 17 0 4 0 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f93e 2d6 1 0 4 4 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 456 - ^ = +STACK WIN 4 f93f 2d2 0 0 4 8 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 456 - ^ = +STACK WIN 4 fc1e 1ce 18 0 4 0 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 fc37 1ab 0 0 4 4 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 fc38 1a7 0 0 4 8 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 fc3f 19f 0 0 4 c 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 fdec f3 7 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fdf2 2c 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fdf3 2a 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fedf 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fee4 170 c 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1000a 10 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1001b b 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1004c 7 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 10054 15f 10 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1005b a1 9 0 14 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1005c b2 8 0 14 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 10064 96 0 0 14 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 101b3 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 101ce 4f 6 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1021d 30 4 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1024d 36 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10283 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10291 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102a7 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102b8 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102cb e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102d9 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102ec e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102fa 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1030d e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1031b 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10331 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10342 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10355 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10363 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10376 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10384 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1039a 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103ab 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103c1 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103d2 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103e8 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103f9 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1040c e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1041a c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10426 26 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1044c 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1046d 26 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10493 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 106ab 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 106de 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 106e2 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10702 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10707 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 10708 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1074c 9b0 2c 0 10 0 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1076e 960 a 0 10 4 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 10775 956 3 0 10 8 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 10778 952 0 0 10 c 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 110fc 129 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 11103 120 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 11104 11e 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 11225 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 11258 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1125c 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1127c 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 11281 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 11282 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 112c6 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 112d6 f88 2a 0 10 0 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 112f8 f39 8 0 10 4 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ = +STACK WIN 4 112f9 f35 7 0 10 8 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ = +STACK WIN 4 11300 f2d 0 0 10 c 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ = +STACK WIN 4 1225e c2 11 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1226f 9e 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12320 9b c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 123b2 8 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 123bb 46 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 123f8 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12401 113 8 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12408 21 1 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 12409 1f 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 12514 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1252b 83 13 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12534 78 a 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1253e 6d 0 0 10 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 125ae 119 c 0 10 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 126bd 9 0 0 10 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 126c7 7d 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 126ce 75 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 126cf 73 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 126fd 2c 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ = +STACK WIN 4 12744 81 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12749 7b 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1274e 75 1 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1274f 73 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 127c5 71 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 127e6 4f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12836 a0 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 128c8 d 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 128d6 22 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 128f8 19f c 0 0 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 129c5 e 0 0 0 c 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12a8e 8 0 0 0 c 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12a97 115 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12b7f 2c 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12bac 11e c 0 c c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12ca3 d 0 0 c c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12cca 3f 9 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12cd3 34 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12cec 18 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12d09 21b c 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12e47 e 0 0 8 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12f24 79 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12f2b 70 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 12f61 39 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 12f62 37 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 12f9d 21 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12fbe 46 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12fc9 3a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13004 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13009 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13040 48 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13088 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 130b3 314 11 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 130c0 305 4 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 130c4 300 0 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 130f1 2d2 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 133c7 b0 d 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 133cd a9 7 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 133d4 a1 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13477 106 11 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 13483 f8 5 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 13484 f6 4 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 13488 f1 0 0 4 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1357d 2df 12 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1358a 2d0 5 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 1358b 2ce 4 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 1358f 2c9 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 1385c cd 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13929 2e2 f 0 0 0 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 13938 294 0 0 0 4 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ = +STACK WIN 4 1394d 27e 0 0 0 8 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ = +STACK WIN 4 13950 27a 0 0 0 c 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ = +STACK WIN 4 13c0b a8 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13c0c a6 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13c54 5d 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13cb3 2e3 2a 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 13cd7 2bd 6 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 13cdc 2b7 1 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 13cdd 2b5 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 13f96 72 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13f97 70 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 13f98 6e 5 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 13f9d 68 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 14008 7c c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14079 a 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 14084 d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14091 d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1409e d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 140ab f3 23 0 0 4 328 0 1 $T0 $ebp 680 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1419e 1e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 142f3 a3 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14385 10 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 14396 6 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1439c 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 143b7 26 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 143b8 24 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 143dd 63 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14440 474 a 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14447 42e 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 14448 42c 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 14449 42a 1 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1444a 428 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 148b4 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148bf d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148cc e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148da e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148e8 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148f6 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14904 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14916 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14924 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14932 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14940 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1494b b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14956 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14961 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1496f b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1497a e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14988 19 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 149a1 84 13 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 149a2 80 12 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 149a3 7e 11 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 149c9 57 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ = +STACK WIN 4 14a25 d 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14a32 12 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14a44 9c 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14a57 86 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ae0 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14aea 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14aef 7 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14af6 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b00 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b08 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b12 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b1c 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b24 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b2e 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b36 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b40 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b48 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b52 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b5a 7b 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b5d 75 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14bd5 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14bde 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c03 d 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c10 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c14 29 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c26 f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c3d 16 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c53 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c57 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c5b 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c76 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c7a 2f 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ca9 25 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14cce 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14cd2 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14cdf e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ced 20 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14d0d 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14d32 33 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14d65 34 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14d99 13 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14dac 56 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14db2 4d 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e02 61 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e03 5d a 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e04 59 9 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e63 17 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e7a 15 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e8f 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ea3 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14eb1 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ec5 25 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ec6 23 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ed2 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14eea 38 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14eeb 36 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14eec 32 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14f22 91 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14f26 89 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14f27 87 2 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14f5c 40 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 14fb3 35 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14fb6 2f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14fe8 81 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14fe9 7d a 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14fea 79 9 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15069 1e 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1506a 1c 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15087 47 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15088 43 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 150ce 47 7 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 150cf 45 6 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 150d0 43 5 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 150d1 41 4 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 15115 65 11 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15116 61 10 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1511b 5b b 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1511c 57 a 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1517a 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1518c 31 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 151bd f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 151cc f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 151db 1d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 151f8 33 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1522b 73 7 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1522f 6b 3 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15230 5b 2 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1529e 2f 3 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 152cd f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 152dc 79 4 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 152dd 75 3 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 152de 71 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15355 68 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15356 64 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 153bd a6 3 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 153be a2 2 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 153de 81 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 153f0 6e 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 15463 26 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15464 22 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15489 31 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1548e 29 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 154ba d0 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 154be b3 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 154bf b1 2 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 154ce 9f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 1558a 69 13 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1559b 4f 2 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1559c 4b 1 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1559d 49 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 155f3 96 22 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15607 79 e 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15615 66 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1563a 29 0 0 8 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 15689 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1568a 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 156b7 62 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 156b8 5e 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 156b9 5a 6 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15719 8b a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1571a 87 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1571b 83 8 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157a4 1c 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157a5 18 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157c0 2a 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157c5 22 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157ea a6 5 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15890 37 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 158c7 51 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 158c8 4d 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15918 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15919 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15946 6a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15947 66 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1594e 5e 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 159b0 6c a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 159b1 68 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 159b2 64 8 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15a1c e0 e 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15a23 d7 7 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15a2a cd 0 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15a45 b1 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 15afc 4f 6 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15b02 47 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15b4b 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15b6d 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15b8f 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15bb1 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15bb2 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15bdf 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15be0 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15c0d 141 7 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15c14 138 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15c95 b3 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 15c96 b1 0 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 15d4e d4 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15e22 c4 e 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15ee6 7e d 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15f64 125 11 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15f75 112 0 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16089 15f f 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16098 4a 0 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 160f0 b3 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 161e8 31 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16219 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1622b 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1623d 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1624f 150 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16256 147 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1639f a0 6 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1643f 50 5 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1648f 2bb 2b 0 4 0 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 164aa 296 10 0 4 4 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 164b3 28a 7 0 4 8 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 164ba 282 0 0 4 c d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 1674a d9 b 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 167b8 17 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16823 14 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 16837 1b8 18 0 4 0 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16848 1a0 7 0 4 4 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1684f 18d 0 0 4 8 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16870 168 0 0 4 c 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 108 - ^ = +STACK WIN 4 169ef 56f 22 0 c 0 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16a03 97 e 0 c 4 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 164 - ^ = +STACK WIN 4 16a11 88 0 0 c 8 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 164 - ^ = +STACK WIN 4 16f5e 153 10 0 8 0 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16f82 11b 0 0 8 4 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 16f89 113 0 0 8 8 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 16f92 109 0 0 8 c d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 170b1 1ea 1b 0 8 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 170cc 1c8 0 0 8 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 17154 111 0 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 17155 10f 0 0 8 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 1729b e4 15 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 172a2 db e 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 172b0 ca 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1737f f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1738e 100 19 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1739a f2 d 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 173a7 e4 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1748e 46 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 174d4 92 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 17566 b42 14 0 8 0 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 17571 b35 9 0 8 4 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1757a b2b 0 0 8 8 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 175e3 abe 0 0 8 c 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 120 - ^ = +STACK WIN 4 180a8 211 13 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 180af 208 c 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 180bb 1fb 0 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 182b9 28b 1f 0 4 0 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 182c5 27a 13 0 4 4 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 182c6 278 12 0 4 8 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 182d8 263 0 0 4 c 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 18544 341 d 0 8 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 18589 2f7 0 0 8 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 185f0 28f 0 0 8 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 185f1 28d 0 0 8 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 18885 4e4 18 0 14 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 18893 4d4 a 0 14 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 18894 4d2 9 0 14 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 1889d 4c8 0 0 14 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 18d69 14c 6 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 18eb5 116 5 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 18ed6 59 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 18fcb 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 18fe6 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19001 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1901c a3 f 0 18 c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 190b6 8 0 0 18 c 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 190bf a3 f 0 1c c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19159 8 0 0 1c c 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 19162 387 12 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19172 350 2 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 19173 34e 1 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 19174 34c 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 194e9 13e 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 194f0 135 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19627 b1 6 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 196d8 64 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 196df 5b 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1973c 57 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19793 8f 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19822 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19836 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1984a 87 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 198d1 e3 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 199b4 1bd 9 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 199bb 1b4 2 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 199bc 1b2 1 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 199bd 1b0 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 19b71 71 b 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19b76 6b 6 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 19b7b 65 1 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 19b7c 63 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 19be2 b3 e 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19be6 1a a 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 19be7 2e 9 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 19bf0 e 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 19c95 46 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19c9a 40 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19cdb a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ce5 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ceb 51 6 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19d3c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19d51 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19d64 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19d79 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19d8c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19da1 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19db4 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19dcc 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19de2 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19dfa 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e10 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e28 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e3e 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e56 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e6c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e81 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e94 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ea9 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ebc 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ed1 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ee4 53 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19f37 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19f45 44 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19f89 1de 1a 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19f9a 1c6 9 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 19f9b 1c2 8 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 19fa3 1b9 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1a167 78 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a1d5 9 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1a1df 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a1e4 1f7 8 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a1eb 1ee 1 0 14 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1a1ec 1ec 0 0 14 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1a246 174 0 0 14 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1a3db 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a404 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a41f 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a449 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a464 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a46d 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a4c1 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a4ec 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a53b 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a564 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a5b3 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a5dc 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a62b 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a654 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a6a8 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a6d3 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a722 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a74b 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a79a 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a7c3 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a817 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a842 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a896 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a8c1 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a915 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a940 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a98f 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a9b8 d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a9c5 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a9cd 1f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a9ec 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1aa06 1f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1aa25 1c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1aa41 12 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1aa53 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1aa6e 13b 1d 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1aa83 126 8 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1aba9 3b 6 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1abe4 13d 1d 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1abf9 128 8 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1ad21 3b 6 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1ad5c 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1ad76 3a2 1d 0 20 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1ad87 391 c 0 20 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 1b118 43 6 0 24 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1b15b 1b8 1d 0 1c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1b170 1a3 8 0 1c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1b313 40 6 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1b353 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b359 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b382 419 6 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1b3a4 3f5 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1b3a5 3ed 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1b79b 190 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b79c 18e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b92b 73 4 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b92c 71 3 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1b92d 6f 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1b92e 6d 1 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1b92f 6b 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1b99e 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b9a5 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1b9a6 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1b9d1 40 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b9d2 3e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1ba11 1c8 11 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1ba18 1bf a 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1ba1c 1ba 6 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1ba22 1b3 0 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1bbd9 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bbe0 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1bbe1 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1bc0c 89 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bc0d 87 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bc95 2c4 c 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1bc9c 2bb 5 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1bc9d 2b9 4 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1bca1 2b4 0 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1bf59 395 1b 0 4 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1bf6a 37d a 0 4 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 1bf6d 377 7 0 4 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 1bf74 36f 0 0 4 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 1c2ee 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c317 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c32d 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c353 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c379 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c39f 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c3a2 fe 9 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1c3a9 e9 2 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1c3aa e7 1 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1c3ab e5 0 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1c4a0 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c4a9 fe 9 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1c4b0 e9 2 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 1c4b1 e7 1 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 1c4b2 e5 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 1c5a7 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c5b0 355 9 0 4 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1c5b7 34c 2 0 4 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1c5b8 348 1 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1c5b9 346 0 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1c905 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c90e 20 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c912 1b 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c917 15 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c92e 36 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c934 2f 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1c964 79 8 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1c969 72 3 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1c96a 70 2 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1c9dd 3e6 11 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1c9e2 3df c 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1c9e9 3d7 5 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1c9ea 3d5 4 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1cdc3 45d 1d 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1cdd7 449 9 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1d220 1af a 0 18 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d22a 1a3 0 0 18 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1d270 15c 0 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1d2a3 128 0 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1d3cf 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d3ed 1d 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d40a 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d428 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d496 60 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d49c 56 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 1d4a5 45 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 1d4a6 43 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 1d4f6 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d50a 77 11 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d51b 5f 0 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d581 1e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d59f 32 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d5a0 30 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d5d1 1b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d5ec 96 12 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d5fd 7c 1 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d5fe 78 0 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d682 72 11 0 8 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d693 5a 0 0 8 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d6cf 13 0 0 8 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d6f4 1d0 13 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d705 1b6 2 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 1d706 1b2 1 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 1d707 1b0 0 0 4 c 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 1d8c4 bf 12 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d8d5 a5 1 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d8d6 a1 0 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d983 2c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d9af 65 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1da14 3c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1da50 1e3 4 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1da51 1e1 3 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1da52 1df 2 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1da53 1dd 1 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1da54 1db 0 0 c 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1dc33 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dc45 18 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dc5d 40 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dc9d 78 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dd15 1490 4 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dd16 83f 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dd17 83d 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1f1a5 1680 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1f1a9 15f8 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1f1aa 15f6 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1f1db 86c 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 20825 be 9 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2082e a9 0 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 20840 96 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 20930 82 6 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 209b2 6e 4 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20a20 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20a25 22b 8 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20a2c 222 1 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20a2d 220 0 0 14 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20a8b 1c1 0 0 14 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 20c50 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20c79 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20c94 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20cbe 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20cd9 1f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20cf8 1f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20d17 2d 9 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20d20 23 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20d44 94 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20d45 92 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20d4a 8c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20dd8 cd c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20e9b 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 20ea5 2c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20ea6 2a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20ed1 2a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20efb 22 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20efc 20 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f1d d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f64 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f75 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f8a 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f8f 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f94 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20fa5 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20fba 50 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20fd7 1c 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 2100a 60 9 0 0 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21013 57 0 0 0 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 2106a d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21077 170 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2107c 169 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 210e1 103 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 21125 be 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 211e7 182 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21369 b6 7 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21370 ad 0 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 2141f 2f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2147c 47 10 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 214c3 1b2 2a 0 18 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 214e0 195 d 0 18 c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 21675 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2167a 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 216a9 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 216ae 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 216dd 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 216e2 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21711 a2 c 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21718 99 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 2171d 93 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 2172b 84 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 217b3 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217b9 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217bf 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217c5 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217cb c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217d7 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217e3 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217ef 349 c 0 0 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21a99 d 0 0 0 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 21b38 1f5 14 0 24 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21b47 1e4 5 0 24 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 21b48 1e2 4 0 24 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 21b49 1e0 3 0 24 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 21d2d 1ae 5 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21d32 15f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21d62 12e 0 0 0 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 21edb 4f c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21f21 8 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 21f2a 38 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21f59 8 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 21f62 41 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21f9a 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 21fa3 35 a 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21fa8 2f 5 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21fad 27 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21fd8 d3 7 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21fdf ca 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 22020 88 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 22068 33 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 220ab 50 4 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 220af 4a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 220fb f0 e 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22102 e7 7 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 22108 e0 1 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 22109 de 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 221eb 5c 4 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 221ef 56 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22247 db 8 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2224c d2 3 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2224d d0 2 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 22277 a5 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 22322 28 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2234a 25 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2236f 18 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22387 f6 c 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2238e eb 5 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 22393 e5 0 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2247d 33 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22498 16 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 224b0 1d 4 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 224b4 17 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 224cd 224 17 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 224e2 20f 2 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 226f1 3e 6 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2272f 294 8 0 14 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22736 28b 1 0 14 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 22737 289 0 0 14 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 22793 1f9 0 0 14 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 229c3 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 229ec 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22a07 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22a31 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22a7b 81 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22a83 70 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22a92 60 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 22a93 5e 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 22afc 93 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22b00 8d 3 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 22b01 8b 2 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 22b40 4b 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 22b8f a2 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22b94 9b 1 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22b95 99 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22c31 83 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22cab 8 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 22cb4 d8 c 0 10 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22d83 8 0 0 10 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 22d8c e6 c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22e69 8 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 22e72 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22e7a 117 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22e81 10e 1 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 22e82 10c 0 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 22f91 27 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 23021 ec 7 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 23028 e3 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 23088 82 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 2310d 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 23124 95 a 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2312a 7d 4 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 2312b 7b 3 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 2312e 77 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 231b9 1a 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 231d3 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 231ed 389 16 0 18 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 23201 375 2 0 18 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 23576 40 6 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 235b6 f8 7 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 235bd ef 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 2361d 8e 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 236ae 27 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 236d5 4d 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 236d6 48 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 23722 5d 4 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2373e 3f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2373f 3d 0 0 0 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2377f 24c f 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 23789 95 5 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 2378e 8f 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 237b1 6b 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 239cb 50 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 239cc 4e 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 239d1 48 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 239dc 3c 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 239dd 3a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 23a1b ba 7 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 23a22 b1 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 23a5f 73 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 23ad5 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 240b9 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 0 1000 13 0 0 4 0 0 0 0 0 +STACK WIN 0 1020 1b 0 0 10 0 0 0 0 0 +STACK WIN 0 1040 1b 0 0 10 0 0 0 0 0 +STACK WIN 0 1060 19 8 0 4 0 0 0 0 0 +STACK WIN 0 1080 b 0 0 0 0 0 0 0 0 +STACK WIN 0 1090 24 3 0 4 0 0 0 0 0 +STACK WIN 0 10c0 f 0 0 8 0 0 0 0 0 +STACK WIN 0 10d0 17 0 0 4 0 0 0 0 0 +STACK WIN 0 10f0 27 9 0 10 0 0 0 0 0 +STACK WIN 0 1120 27 9 0 10 0 0 0 0 0 +STACK WIN 0 1150 d 0 0 8 0 0 0 0 0 +STACK WIN 0 1160 13 0 0 4 0 0 0 0 0 +STACK WIN 0 1180 21 d 0 10 0 0 0 0 0 +STACK WIN 0 11b0 21 d 0 10 0 0 0 0 0 +STACK WIN 0 11e0 7 0 0 0 0 0 0 0 0 +STACK WIN 0 11f0 6b 28 0 4 8 10 0 0 0 +STACK WIN 0 1260 32 3 0 0 0 0 0 0 0 +STACK WIN 0 12a0 e 0 0 0 0 0 0 0 0 +STACK WIN 0 12b0 47 3 0 4 0 0 0 0 0 +STACK WIN 0 1300 19 8 0 4 0 0 0 0 0 +STACK WIN 0 1320 32 3 0 0 0 0 0 0 0 +STACK WIN 0 1360 47 3 0 4 0 0 0 0 0 +STACK WIN 0 13b0 19 8 0 4 0 0 0 0 0 +STACK WIN 0 13d0 32 3 0 0 0 0 0 0 0 +STACK WIN 0 1410 47 3 0 4 0 0 0 0 0 +STACK WIN 0 1460 19 8 0 4 0 0 0 0 0 +STACK WIN 0 1480 71 29 0 4 c 10 0 0 0 +STACK WIN 0 1500 1b 0 0 8 0 0 0 0 0 +STACK WIN 0 1520 35 4 0 0 0 0 0 0 0 +STACK WIN 0 1560 20b 2d 0 14 14 14 0 0 1 +STACK WIN 0 19f0 31 0 0 0 0 0 0 0 0 +STACK WIN 0 1a30 51 d 0 4 c 0 0 0 0 +STACK WIN 0 1a90 c7 7 0 4 10 8 0 0 1 +STACK WIN 0 1b60 36 0 0 0 0 0 0 0 0 +STACK WIN 0 1ba0 3 0 0 0 0 0 0 0 0 +STACK WIN 0 1db0 81 2 0 8 0 0 0 0 0 +STACK WIN 0 1e40 1d 7 0 0 0 0 0 0 0 +STACK WIN 0 1e60 a2 3a 0 4 10 c4 0 0 0 +STACK WIN 0 1f10 142 c 0 c 0 38 0 0 1 +STACK WIN 0 2060 138 38 0 0 8 244 0 0 0 +STACK WIN 0 21a0 3b 7 0 4 0 0 0 0 0 +STACK WIN 0 21e0 25 5 0 4 0 0 0 0 0 +STACK WIN 0 2210 26 3 0 0 0 0 0 0 0 +STACK WIN 0 2240 e 0 0 0 0 0 0 0 0 +STACK WIN 0 2250 4 0 0 0 0 0 0 0 0 +STACK WIN 0 2260 11 0 0 0 0 0 0 0 0 +STACK WIN 0 2280 27 3 0 0 0 0 0 0 0 +STACK WIN 0 22b0 b 0 0 0 0 0 0 0 0 +STACK WIN 0 22c0 24 3 0 4 0 0 0 0 0 +STACK WIN 0 22f0 e 0 0 0 0 0 0 0 0 +STACK WIN 0 2300 c 0 0 0 0 0 0 0 0 +STACK WIN 0 2310 26 0 0 0 0 0 0 0 0 +STACK WIN 0 2340 1d 1 0 0 0 0 0 0 0 +STACK WIN 0 2360 1d 1 0 0 0 0 0 0 0 +STACK WIN 0 2380 13 0 0 0 0 0 0 0 0 +STACK WIN 0 23a0 23 0 0 0 0 0 0 0 0 +STACK WIN 0 23d0 56 5 0 0 8 c 0 0 0 +STACK WIN 0 2430 47 c 0 0 c 8 0 0 0 +STACK WIN 0 24f0 23 1 0 0 0 4 0 0 0 +STACK WIN 0 2520 3f b 0 8 0 0 0 0 0 +STACK WIN 0 2560 20 0 0 0 0 0 0 0 0 +STACK WIN 0 2580 20 0 0 0 0 0 0 0 0 +STACK WIN 0 25a0 1d 0 0 0 0 0 0 0 0 +STACK WIN 0 25c0 da 11 0 c 0 0 0 0 1 +STACK WIN 0 26a0 27 8 0 4 0 0 0 0 0 +STACK WIN 0 26d0 4a d 0 8 0 0 0 0 0 +STACK WIN 0 2720 e 0 0 0 0 0 0 0 0 +STACK WIN 0 2730 5 2 0 4 0 0 0 0 0 +STACK WIN 0 2740 5 2 0 4 0 0 0 0 0 +STACK WIN 0 2750 3 2 0 0 0 0 0 0 0 +STACK WIN 0 2760 b 0 0 0 0 0 0 0 0 +STACK WIN 0 2770 ef 11 0 c 0 0 0 0 1 +STACK WIN 0 2860 2b 8 0 4 0 0 0 0 0 +STACK WIN 0 2890 4f d 0 8 0 0 0 0 0 +STACK WIN 0 28e0 e 0 0 0 0 0 0 0 0 +STACK WIN 0 28f0 5 2 0 4 0 0 0 0 0 +STACK WIN 0 2900 3 2 0 0 0 0 0 0 0 +STACK WIN 0 2910 13 0 0 0 0 0 0 0 0 +STACK WIN 0 2930 86 a 0 10 10 4 0 0 1 +STACK WIN 0 29c0 23 0 0 0 0 0 0 0 0 +STACK WIN 0 29f0 1 0 0 0 0 0 0 0 0 +STACK WIN 0 2a00 26 0 0 0 0 0 0 0 0 +STACK WIN 0 2a30 23 0 0 0 0 0 0 0 0 +STACK WIN 0 2a60 76 23 0 0 4 50 0 0 0 +STACK WIN 0 2ae0 3 0 0 4 0 0 0 0 0 +STACK WIN 0 2af0 1 0 0 0 0 0 0 0 0 +STACK WIN 0 2b00 21 0 0 0 0 0 0 0 0 +STACK WIN 0 2b30 32 6 0 4 8 0 0 0 0 +STACK WIN 0 2b70 2f 6 0 0 8 0 0 0 0 +STACK WIN 0 2ba0 20 0 0 0 0 0 0 0 0 +STACK WIN 0 2bc0 20 0 0 0 0 0 0 0 0 +STACK WIN 0 2be0 1d 0 0 0 0 0 0 0 0 +STACK WIN 0 2c00 c1 5 0 8 0 0 0 0 1 +STACK WIN 0 2cd0 83 8 0 8 0 0 0 0 1 +STACK WIN 0 2d60 1f 0 0 4 0 0 0 0 0 +STACK WIN 0 2d80 bc b 0 8 0 0 0 0 1 +STACK WIN 0 2e40 e 0 0 0 0 0 0 0 0 +STACK WIN 0 2e50 5 2 0 4 0 0 0 0 0 +STACK WIN 0 2e60 e 0 0 8 0 0 0 0 0 +STACK WIN 0 2e70 da 4 0 8 0 0 0 0 1 +STACK WIN 0 2f50 97 8 0 8 0 0 0 0 1 +STACK WIN 0 2ff0 4 0 0 0 0 0 0 0 0 +STACK WIN 0 3000 23 0 0 4 0 0 0 0 0 +STACK WIN 0 3030 c7 e 0 8 0 0 0 0 1 +STACK WIN 0 3100 e 0 0 0 0 0 0 0 0 +STACK WIN 0 3110 5 2 0 4 0 0 0 0 0 +STACK WIN 0 3120 e 0 0 8 0 0 0 0 0 +STACK WIN 0 3130 6 0 0 0 0 0 0 0 0 +STACK WIN 0 3140 208 6 0 8 10 8 0 0 1 +STACK WIN 0 33d0 1 0 0 0 0 0 0 0 0 +STACK WIN 0 33e0 8 0 0 0 0 0 0 0 0 +STACK WIN 0 33f0 56 3 0 0 0 10 0 0 0 +STACK WIN 0 3450 32 0 0 4 0 0 0 0 0 +STACK WIN 0 3490 28 0 0 0 0 0 0 0 0 +STACK WIN 0 34c0 19 0 0 0 0 0 0 0 0 +STACK WIN 0 34e0 21 0 0 0 0 0 0 0 0 +STACK WIN 0 3510 19 8 0 4 0 0 0 0 0 +STACK WIN 0 3530 7 0 0 0 0 0 0 0 0 +STACK WIN 0 3540 6 0 0 0 0 0 0 0 0 +STACK WIN 0 36d0 39 8 0 4 0 0 0 0 0 +STACK WIN 0 3710 6 0 0 0 0 0 0 0 0 +STACK WIN 0 38a0 3a 8 0 4 0 0 0 0 0 +STACK WIN 0 38e0 6 0 0 0 0 0 0 0 0 +STACK WIN 0 38f0 32 0 0 4 0 0 0 0 0 +STACK WIN 0 3930 19 0 0 0 0 0 0 0 0 +STACK WIN 0 3950 56 7 0 4 0 c 0 0 0 +STACK WIN 0 39b0 4 0 0 0 0 0 0 0 0 +STACK WIN 0 39c0 59 7 0 4 0 c 0 0 0 +STACK WIN 0 3a20 6 0 0 0 0 0 0 0 0 +STACK WIN 0 3a30 21 d 0 10 0 0 0 0 0 +STACK WIN 0 3a60 27 9 0 10 0 0 0 0 0 +STACK WIN 0 3a90 24 f 0 0 0 0 0 0 0 +STACK WIN 0 3ac0 1 0 0 0 0 0 0 0 0 +STACK WIN 0 3ad0 15 0 0 0 0 0 0 0 0 +STACK WIN 0 3af0 21 d 0 10 0 0 0 0 0 +STACK WIN 0 3b20 27 9 0 10 0 0 0 0 0 +STACK WIN 0 3b50 22 d 0 0 0 0 0 0 0 +STACK WIN 0 3b80 10 0 0 0 0 0 0 0 0 +STACK WIN 0 3b90 25 11 0 0 0 0 0 0 0 +STACK WIN 0 3bc0 4f a 0 0 0 10 0 0 0 +STACK WIN 0 3c10 54 7 0 8 0 c 0 0 0 +STACK WIN 0 3c70 57 7 0 8 0 c 0 0 0 +STACK WIN 0 3cd0 19 8 0 4 0 0 0 0 0 +STACK WIN 0 3cf0 7 1 0 0 0 4 0 0 0 +STACK WIN 0 3d00 21 d 0 14 0 0 0 0 0 +STACK WIN 0 3d30 7 1 0 0 0 4 0 0 0 +STACK WIN 0 3d40 27 9 0 14 0 0 0 0 0 +STACK WIN 0 3d70 3 0 0 0 0 0 0 0 0 +STACK WIN 0 3d80 1 0 0 0 0 0 0 0 0 +STACK WIN 0 3d90 7 1 0 0 0 4 0 0 0 +STACK WIN 0 3da0 15 0 0 4 0 0 0 0 0 +STACK WIN 0 3dc0 1 0 0 4 0 0 0 0 0 +STACK WIN 0 3dd0 15 0 0 8 0 0 0 0 0 +STACK WIN 0 3df0 21 d 0 14 0 0 0 0 0 +STACK WIN 0 3e20 27 9 0 14 0 0 0 0 0 +STACK WIN 0 3e50 22 d 0 0 0 0 0 0 0 +STACK WIN 0 3e80 10 0 0 0 0 0 0 0 0 +STACK WIN 0 3e90 7 1 0 0 0 4 0 0 0 +STACK WIN 0 3ea0 25 11 0 c 0 0 0 0 0 +STACK WIN 0 3ed0 3 0 0 4 0 0 0 0 0 +STACK WIN 0 3ee0 15 0 0 0 0 0 0 0 0 +STACK WIN 0 3f00 22 d 0 8 0 0 0 0 0 +STACK WIN 0 3f30 13 0 0 0 0 0 0 0 0 +STACK WIN 0 3f50 1 0 0 0 0 0 0 0 0 +STACK WIN 0 3f60 15 0 0 8 0 0 0 0 0 +STACK WIN 0 3f80 22 d 0 0 0 0 0 0 0 +STACK WIN 0 3fb0 15 0 0 4 0 0 0 0 0 +STACK WIN 0 3fd0 15 0 0 4 0 0 0 0 0 +STACK WIN 0 3ff0 13 0 0 4 0 0 0 0 0 +STACK WIN 0 4010 ae e 0 4 0 54 0 0 0 +STACK WIN 0 40c0 ae e 0 4 0 4c 0 0 0 +STACK WIN 0 4170 40 7 0 4 0 0 0 0 0 +STACK WIN 0 4464 13 0 0 0 0 0 0 0 0 +STACK WIN 0 466c 16 0 0 0 0 0 0 0 0 +STACK WIN 0 46a0 9 0 0 0 0 0 0 0 0 +STACK WIN 0 46f2 a 0 0 0 0 0 0 0 0 +STACK WIN 0 5405 14 0 0 0 0 0 0 0 0 +STACK WIN 0 58bc a 0 0 0 0 0 0 0 0 +STACK WIN 0 6039 12 0 0 0 0 0 0 0 0 +STACK WIN 0 60e0 8b 0 0 4 0 0 0 0 0 +STACK WIN 0 71eb b 0 0 0 0 0 0 0 0 +STACK WIN 0 7a28 a 0 0 0 0 0 0 0 0 +STACK WIN 0 7b36 a 0 0 0 0 0 0 0 0 +STACK WIN 0 7cc5 9 0 0 0 0 0 0 0 0 +STACK WIN 0 7f28 4 0 0 0 0 0 0 0 0 +STACK WIN 0 8151 9 0 0 0 0 0 0 0 0 +STACK WIN 0 821f 9 0 0 0 0 0 0 0 0 +STACK WIN 0 8390 a 0 0 0 0 0 0 0 0 +STACK WIN 0 83ce 21 0 0 0 0 0 0 0 0 +STACK WIN 0 8477 9 0 0 0 0 0 0 0 0 +STACK WIN 0 8714 a 0 0 0 0 0 0 0 0 +STACK WIN 0 8747 a 0 0 0 0 0 0 0 0 +STACK WIN 0 8779 a 0 0 0 0 0 0 0 0 +STACK WIN 0 87b4 a 0 0 0 0 0 0 0 0 +STACK WIN 0 89d2 9 0 0 0 0 0 0 0 0 +STACK WIN 0 8a62 7c 0 0 0 0 0 0 0 0 +STACK WIN 0 8c49 4 0 0 0 0 0 0 0 0 +STACK WIN 0 8ce2 4 0 0 0 0 0 0 0 0 +STACK WIN 0 9694 9 0 0 0 0 0 0 0 0 +STACK WIN 0 9835 c 0 0 0 0 0 0 0 0 +STACK WIN 0 9841 c 0 0 0 0 0 0 0 0 +STACK WIN 0 9a66 4 0 0 0 0 0 0 0 0 +STACK WIN 0 9ab6 4 0 0 0 0 0 0 0 0 +STACK WIN 0 9ae0 4c 8 0 c 10 0 0 0 1 +STACK WIN 0 9c4a 6 0 0 0 0 0 0 0 0 +STACK WIN 0 9ca8 9 0 0 0 0 0 0 0 0 +STACK WIN 0 9ee5 9 0 0 0 0 0 0 0 0 +STACK WIN 0 9fd7 c 0 0 0 0 0 0 0 0 +STACK WIN 0 a04a 9 0 0 0 0 0 0 0 0 +STACK WIN 0 a163 c 0 0 0 0 0 0 0 0 +STACK WIN 0 a1b9 9 0 0 0 0 0 0 0 0 +STACK WIN 0 a1d0 88 0 0 8 0 0 0 0 0 +STACK WIN 0 a2c0 7a 0 0 c 0 0 0 0 0 +STACK WIN 0 c23c a 0 0 0 0 0 0 0 0 +STACK WIN 0 df29 14 0 0 0 0 0 0 0 0 +STACK WIN 0 dfed a 0 0 0 0 0 0 0 0 +STACK WIN 0 e257 c 0 0 0 0 0 0 0 0 +STACK WIN 0 e40d 15 0 0 0 0 0 0 0 0 +STACK WIN 0 e761 17 0 0 0 0 0 0 0 0 +STACK WIN 0 eaa4 c 0 0 0 0 0 0 0 0 +STACK WIN 0 eea0 9 0 0 0 0 0 0 0 0 +STACK WIN 0 f221 9 0 0 0 0 0 0 0 0 +STACK WIN 0 f370 c 0 0 0 0 0 0 0 0 +STACK WIN 0 f3fd c 0 0 0 0 0 0 0 0 +STACK WIN 0 1000a 11 0 0 0 0 0 0 0 0 +STACK WIN 0 1001b c 0 0 0 0 0 0 0 0 +STACK WIN 0 1004c 8 0 0 0 0 0 0 0 0 +STACK WIN 0 10558 90 3 0 c c 0 0 0 0 +STACK WIN 0 105e8 46 0 0 10 4 0 0 0 1 +STACK WIN 0 1064a 17 4 0 0 10 0 0 0 1 +STACK WIN 0 10661 19 0 0 0 0 0 0 0 0 +STACK WIN 0 10694 17 1 0 8 4 0 0 0 1 +STACK WIN 0 123b2 9 0 0 0 0 0 0 0 0 +STACK WIN 0 123f8 9 0 0 0 0 0 0 0 0 +STACK WIN 0 126bd a 0 0 0 0 0 0 0 0 +STACK WIN 0 128c8 e 0 0 0 0 0 0 0 0 +STACK WIN 0 129c5 f 0 0 0 0 0 0 0 0 +STACK WIN 0 12a8e 9 0 0 0 0 0 0 0 0 +STACK WIN 0 12b7f 2d 0 0 0 0 0 0 0 0 +STACK WIN 0 12ca3 e 0 0 0 0 0 0 0 0 +STACK WIN 0 12e47 f 0 0 0 0 0 0 0 0 +STACK WIN 0 14079 b 0 0 0 0 0 0 0 0 +STACK WIN 0 14221 84 3 0 8 c 0 0 0 0 +STACK WIN 0 142a5 23 0 0 0 0 0 0 0 0 +STACK WIN 0 142f0 3 0 0 0 0 0 0 0 0 +STACK WIN 0 14385 11 0 0 0 0 0 0 0 0 +STACK WIN 0 190b6 9 0 0 0 0 0 0 0 0 +STACK WIN 0 19159 9 0 0 0 0 0 0 0 0 +STACK WIN 0 1a1d5 a 0 0 0 0 0 0 0 0 +STACK WIN 0 20e9b a 0 0 0 0 0 0 0 0 +STACK WIN 0 20fd7 1c 0 0 0 0 0 0 0 0 +STACK WIN 0 21a99 e 0 0 0 0 0 0 0 0 +STACK WIN 0 21f21 9 0 0 0 0 0 0 0 0 +STACK WIN 0 21f59 9 0 0 0 0 0 0 0 0 +STACK WIN 0 21f9a 9 0 0 0 0 0 0 0 0 +STACK WIN 0 22cab 9 0 0 0 0 0 0 0 0 +STACK WIN 0 22d83 9 0 0 0 0 0 0 0 0 +STACK WIN 0 22e69 9 0 0 0 0 0 0 0 0 +STACK WIN 0 23b00 be 0 0 8 0 0 0 0 0 diff --git a/src/processor/testdata/module1.out b/src/processor/testdata/module1.out new file mode 100644 index 0000000..6774e4f --- /dev/null +++ b/src/processor/testdata/module1.out @@ -0,0 +1,29 @@ +MODULE windows x86 111111111111111111111111111111111 module1.pdb +INFO CODE_ID FFFFFFFF module1.exe +FILE 1 file1_1.cc +FILE 2 file1_2.cc +FILE 3 file1_3.cc +FUNC m 1000 c 0 Function1_1 +1000 4 44 1 +1004 4 45 1 +1008 4 46 1 +FUNC 1100 8 4 Function1_2 +1100 4 65 2 +1104 4 66 2 +FUNC 1200 100 8 Function1_3 +FUNC 1300 100 c Function1_4 +FUNC 2000 0 0 Test_Zero_Size_Function_Is_Ignored +2000 4 88 2 +PUBLIC m 2800 0 PublicSymbol +FUNC 3000 7000 42 LargeFunction +3000 7000 4098359 3 +STACK WIN 4 1000 c 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = +STACK WIN 4 1100 8 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = +STACK WIN 4 1100 100 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = +STACK WIN 4 1300 100 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = +STACK CFI INIT 3d40 af .cfa: $esp 4 + .ra: .cfa 4 - ^ +STACK CFI 3d41 .cfa: $esp 8 + +STACK CFI 3d43 .cfa: $ebp 8 + $ebp: .cfa 8 - ^ +STACK CFI 3d54 $ebx: .cfa 20 - ^ +STACK CFI 3d5a $esi: .cfa 16 - ^ +STACK CFI 3d84 $edi: .cfa 12 - ^ diff --git a/src/processor/testdata/module2.out b/src/processor/testdata/module2.out new file mode 100644 index 0000000..845212c --- /dev/null +++ b/src/processor/testdata/module2.out @@ -0,0 +1,23 @@ +MODULE windows x86 222222222 module2.pdb +FILE 1 file2_1.cc +FILE 2 file2_2.cc +FILE 3 file2_3.cc +FUNC 2000 c 4 Function2_1 +1000 4 54 1 +1004 4 55 1 +1008 4 56 1 +PUBLIC 2160 0 Public2_1 +FUNC 2170 14 4 Function2_2 +2170 6 10 2 +2176 4 12 2 +217a 6 13 2 +2180 4 21 2 +PUBLIC 21a0 0 Public2_2 +STACK WIN 4 2000 c 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = +STACK WIN 4 2170 14 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ = +STACK CFI INIT 3df0 af .cfa: $esp 4 + .ra: .cfa 4 - ^ +STACK CFI 3df1 .cfa: $esp 8 + +STACK CFI 3df3 .cfa: $ebp 8 + $ebp: .cfa 8 - ^ +STACK CFI 3e04 $ebx: .cfa 20 - ^ +STACK CFI 3e0a $esi: .cfa 16 - ^ +STACK CFI 3e34 $edi: .cfa 12 - ^ diff --git a/src/processor/testdata/module3_bad.out b/src/processor/testdata/module3_bad.out new file mode 100644 index 0000000..bb77248 --- /dev/null +++ b/src/processor/testdata/module3_bad.out @@ -0,0 +1,3 @@ +MODULE windows x86 333333333333333333333333333333333 module3.pdb +FILE 1 file1.cc +FUNC 1000 diff --git a/src/processor/testdata/module4_bad.out b/src/processor/testdata/module4_bad.out new file mode 100644 index 0000000..d01fb2c --- /dev/null +++ b/src/processor/testdata/module4_bad.out @@ -0,0 +1,5 @@ +MODULE windows x86 444444444444444444444444444444444 module4.pdb +FILE 1 file4_1.cc +FILE 2 file4_2.cc +1000 4 44 1 +1004 4 45 1 diff --git a/src/processor/testdata/null_read_av.dmp b/src/processor/testdata/null_read_av.dmp new file mode 100644 index 0000000000000000000000000000000000000000..f146dc7f6ee8f211d2f58c476f4a9d9d8dbf3e09 GIT binary patch literal 15870 zcmeHO4P2B}x_<`A08vOK^D9Rq(?lRpQPV`lj|htk-pVV5Ff#%=z})#@)b$ovnMD+q zw(d`B+11SUno_qmtnJ24QggA)u+={4%jH@Y7Moh;?Ein>d53{u4BNZ6->zqV=RN0r z&hveqbIzRezVDorIq45QUY!#vB1UAU`=8yIrqx8cp<+g!8zd5p@^qL;9qJblhJ0YC zNOzQ5khdB{E<`yV`990N|1NniKR1X$`D5>qK0cKf> zTm?mzYm1x~>to#w;`#2gmp=X=!bKS;kQ*XJD*SYRD?}s?%vjP6W-*G)VTnZEjS!SB zIbxCmS%_=`LZ&zYDT3WOV#n18OADk>EQ+e5OAi1Iil5%vo@WYpEfp*H)>(3Q`9bPfXD8`wrBRv~qwdG#^NnLEYVpIN0Uo*%tfk zcVmIlh}i2qjdE*km&hx}`pAZ-pSUi#m&l93U!Gwc7%(EXCsz;F%PC$)!5Bg9`{**X zMP1stB#|#Q2S}v!s_ZH6zcW8IrJXE;R~E}avW7#<_<*t^G+7IRCFW4Dd;nSZo};W0 zkacT7Suxql>g3)sAf>nbB5hu3gP$ysP#F^$x`(tL>6e(5oTlzlVwx)tqYnZ0qy(%-K3 zF^^#{1BbNQ`NP_Wnygxphh`XL>Pz!eceRt%>ch6O+WU|(pBzxurJ4^b4U&)l$x=g^6cmnB0aq%=nSAI`ZMY0cDjHDZi!%$??J<35Q+leuAv+ z0cG8<*|opF?0vJpoI%XL{}W_21eA3`iw#?l6iy40&G2D#?;qD+9r^H7Kv{dd{S_)# zy%8+q;loAeD2rqHQlsjTPA*%#vLfZK8+*zm$okzm%3>T&HFhFKfk$ZTSCz=U!wqWQ z`1~AY4Fx}oQ8Df0(pOtk_J_)mVPTR0yGHbB?Js)})=SJ6dO5|*rK5R%7}{1EI}xM6 zQJN2%LnO=+Dti%!`F^sv9(OixbQBv~0?P7ecGX5nQ0B$58?v^Yqb%CBFQBY%wU{>= zGqR~LN~S<@$o<1j0cB0r;xJw0&3cj7 zVArImbMqnX+7wV0wdIa0MJ7rX_AhqqG#uDtaKDlTs6}$cgXfOIbb)fTLQn0lWcg3`#w9Yb|5c=g|Sis$OMU3 zTy+l;#|iwafMWt}E-c6eRt_K* z|DJEvg#OWDK%^@i?2xVbaEu>^v)SRVg9F~MsovsFx>bv5U9e+1B4-}<{Bt{qoUZ9& zfi?LmYWzKt+yz~7;Kvfg0BveJ8qUVWzjtlW!Ho#9sTf}9=a;i_Y3o}HqT2;7nm(=G z?FttYA~_Fnmj_+iTGW+UCJ%mT?~$%VnhSBld8VxfVhBqehOI@*mGmZ&9 z@Q>(~zCKJ>(at!_ffS?6M8wc<4%A0@=k}3m4J$@(XycSCTI-z=D+kxJ0vRng;%bM- zxh`-O&?&MJi5wTjXtSf{KLdBg78|&>A6HYhYkKR z&)5I{9{9P$vJs}Yk7ase3@=Fjv7GgFlH{C>aqF?%jI-(Uv8?&&pZWT8j^)x5E@|qy zUPkm<-=>Sw@tov9kI^cYgRpiaklVbmWqcx3>KDvKuzn-#FrU*nhms|0C`qr`c-t zp@dd0k6wS|Kc}y4dT-;*VF_UhWwFIxWU(eD_^>|Ob=jciXeqKt>u? zZjQs^!%JIo^t0%PFTLS`im{Co2HjIZyh2Bb$vz?899xh$ew+{Uol~!+G#{?MuDtLK z>)`vVuA^LYZeG5{YV+abJ-E9lJoAzn4_sNc=-?wSoFb0m=JcVQJa)9`Owccq*WCVk z)8%g;zgekox0&qDF+Q9PIZxTDTN+Y-wfBGSKK;e=|5eI69JT_JwZMn;>Cw0&U(7q4 zwl-&4RP}(DBgx2QUutu09(m`ieO1%3{-esl7vC;wP5`}q$Jgb#_{dIyng#csRJUcAt!Q^m|b zoj7oM@2n@5-&cNM^@rCI$zgH2Y~bZXD*k2B{i9YMOkTff``Po6BhPnV3m;9erQ9JZ_CeHd$p&NM!A z%6O1QB1MblH+pvsT-6rZRl-tZ%M5>KB`|`pMh6+k^C@r^{TryJ?pa> z54XJj?&+fb-HBngloaPK@=3bCba(#4zn?Je(H;*)^soQ&MP*PyVWA(FliMcuyL|CG zvp4s-{<*X{ahDOL&|z}6cEP}H4@?<*bJ&b$cPy3XW48U82AL*inJvy@m)((->ngCC zvoe;;>{nifxF9Yz@g`_Gy$+wRX$pUk{x9=;*4jkxd6bpg5aD@62wv z;}di~b;sKQGRONy05=%JhlzZ6B1Sv$=RN-JWMHKLntG%<9FGgyKb3F))E$`RE&0il zR!c>N@eE!?h?<1@)h$h%4|zPhXPhRhMHeo@PH~Y`+(nG^ii*C#Yx>v49?z~Br-RB{ zbjtA>r4^Km3|_2x1s)Fsg!Er6o~U)s)pAE&Fu2bKP7QgN%g)_*%?4ZEKpr@Iyrc~_ zkgB$f@_p$QQ8ABKO4Ae&-u!Rnb6U*zsCNM7W#2l#d`@%XzNSzA}R$66h>0%vDtAd#fm$cHm7KshArbZ1zOeq6(8=4wuRrDzk%HchJUOPki+U z4K?il9Rq$y6AgX{3E9CnCfbpWKpSJFGrI0<8>G?IqM&|}QnQO->e!au&WdZLW;ehc zskf&ic(ByG+7UcNYW8*l|0Cc#`s31pY@D;p4!(WVw(aE*n7I$&j`Vu1BY0n_dA&V+ zlXs_ZaY&>~-$?*Rio%m;r4OxCyNfj~NrIsiU{6m9yupIBeMqIM2ZL`q>T^L`eQR%5 z*eXi`8=QdOc~P^H#aJh79bl`F$G3x1x390%bRcecx6>}lXgHN5@1m{Wuu7qBOl)Jx z_Ih}XSHwUqaaq?(Gw^SE~8+L4umI z2&>#V+Pwv^f?y4%nBYSBpCDJEoiV!c_7hSMykFfN?HTru>!$J7;k`P+Aur;n6BAvTzhOB?@xoJ{1zJDy6ehwDqx7Xcy4~zcT`W&&IA8pf z^mEw>oj;-aDZO}}mL3@My~pzj1_VpKb;xyuX%EIp=)2k+rvNzd(k%S=0&bYhwjkUqsTskWC8Nw_u9q*dA81}O1d;)?k&Zd!gZo~4PvL{$SmSrg8LyW zDkU1Fdt9@NC+A$NracntW_@?+G3`G$k#SGHu3vuTVvYwM^@T|ut~rVJ6U36`fJcEo z5`0OcfPRLk1sVAlmJU!ksT!ZcTi}u1- za$I@H|HdVp6U#9ta?Zb{U!42IggE!B(a}No zd2z17?qL=1oXAYY6XVqX{YSqZ?Vd6d^RG9NhE>Ybvi2{aP6=+*8j(8rI9bF)s|2;l1NIt}&Vfk5fy znr=4Gur1PS_xk0U-MTH*o9zm}mxvK~(+5EY=n4M~>UYf2824vvG(@xnf7DbeYNVsDDup-{Q0KN)A>4pu&VV^J)M^CsnYykcz zUYU%KK3<(kduLfZ_J93l*y$Me_k$x{Tvz#zPvyN#mDgvO(Lb`$`*HHk@=RJmOBC8tbl7_#!J3V%<}&-R`Chq#J~%L+OTP(wtr< z`!mbLHgTDZdm+}n4ki1Xyd-qJf{#R1bnisZ4wf-P2tlw z`hFX7WR;KqHigUkOxQ_VN6ps8;U+M6-X$#@xMO!&vaAFBZ-U7RrH!Ax? z_A9z={L;)&1D|kK)NOURwQ)w9s$*l_eL-(T{w-)V|A-K_65|C0QV+-rl6`n;op2z+ zm8JoG*VC|f4dgWeLY&Uo8Sz?@GvQ2(n_ud29P(^AKVpNDu@3E9k$-rjvTE8cF!BY&MwBidS!A79XMJ9(7iscAj>wiJ0`Zjw`dO@=zhp8t6_`LZu5oA{(9 zj=s+@5`pO~U$kjRtyl75B5(Z*wkp7yt(q>?kU=?2@fe$`{2nye6Hy1!v;AhY9Ri$j zm(O-2p4+K7N8RYnR+RT4bJwEmLCG&Px1i+LoMx1Kgc6Uk24%RntV3P@%2R!L2{=o= z&M!Xa0>`}uju&2CwUVmP}2G9IE)8=(b;t2dgYJ( zC}(^9qT{ekgH4rL+P)F03(ph*Qa<4qr0Na;?)m9mbgQHzbKLs|0P7_3CgN~T(?Rq% z{k{(6-hbC(OxKM#x^C1h}HoVJqJ2#m3e*h;k@ zq?|M_K{((#Z-OS_o_kyJppL9F>0jHP^n+fGcN9%Yj^^^rXCiXGsWPQK81#s?n2qWXu2n literal 0 HcmV?d00001 diff --git a/src/processor/testdata/null_write_av.dmp b/src/processor/testdata/null_write_av.dmp new file mode 100644 index 0000000000000000000000000000000000000000..35c59335f98e408bd5c03b9f8338fc56e22787db GIT binary patch literal 17378 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/read_av_conditional.dmp b/src/processor/testdata/read_av_conditional.dmp new file mode 100644 index 0000000000000000000000000000000000000000..b3604233d67495f99911a6e3f6327e8bf3624b9a GIT binary patch literal 16779 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 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/stack_exhaustion.dmp b/src/processor/testdata/stack_exhaustion.dmp new file mode 100644 index 0000000000000000000000000000000000000000..4eb378b6cdc68de26deb1d38a2648e7cebbe88d6 GIT binary patch literal 1049914 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 {D>W%B^zV4p?GA#a8 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,int,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_NT_HEADERS *,_IMAGE_NT_HEADERS *,unsigned long,unsigned long *) +PUBLIC 6c922 0 PatchDebug<_IMAGE_NT_HEADERS64>(int,int,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_NT_HEADERS64 *,_IMAGE_NT_HEADERS64 *,unsigned long,unsigned long *) +PUBLIC 6ca9e 0 PatchRVAs<_IMAGE_NT_HEADERS>(int,int,_IMAGE_SECTION_HEADER *,unsigned long,_IMAGE_NT_HEADERS *,unsigned long) +PUBLIC 6cc38 0 PatchRVAs<_IMAGE_NT_HEADERS64>(int,int,_IMAGE_SECTION_HEADER *,unsigned long,_IMAGE_NT_HEADERS64 *,unsigned long) +PUBLIC 6cdd5 0 PEWriteResource<_IMAGE_NT_HEADERS>(int,int,unsigned long,_UPDATEDATA *,_IMAGE_NT_HEADERS *) +PUBLIC 6df34 0 PEWriteResource<_IMAGE_NT_HEADERS64>(int,int,unsigned long,_UPDATEDATA *,_IMAGE_NT_HEADERS64 *) +PUBLIC 335b7 0 StringCchCopyW(unsigned short *,unsigned int,unsigned short const *) +PUBLIC 6f093 0 AddResource(MY_STRING *,MY_STRING *,unsigned short,_UPDATEDATA *,void *,unsigned long) +PUBLIC 6f3ef 0 PEWriteResFile(int,int,unsigned long,_UPDATEDATA *) +PUBLIC 6f49a 0 WriteResFile(void *,unsigned short *) +PUBLIC 6f5a3 18 UpdateResourceW +PUBLIC 6f6aa 18 UpdateResourceA +PUBLIC 6f774 8 EndUpdateResourceW +PUBLIC 6f949 8 EndUpdateResourceA +PUBLIC 6f959 0 EnumLangsFunc(void *,unsigned short *,unsigned short *,unsigned short,long) +PUBLIC 6fa8d 0 EnumNamesFunc(void *,unsigned short *,unsigned short *,long) +PUBLIC 6fab4 0 EnumTypesFunc(void *,unsigned short *,long) +PUBLIC 6fad8 8 BeginUpdateResourceW +PUBLIC 6fc7b 8 BeginUpdateResourceA +PUBLIC 6fcdc 0 __report_gsfailure +PUBLIC 6fdca 0 __security_init_cookie_ex +PUBLIC 189fc 0 __security_init_cookie +PUBLIC 9702 0 __security_check_cookie +PUBLIC 6fe51 8 GetCurrentExeName +PUBLIC 6febb c GetExeName +PUBLIC 6ff39 18 GetConsoleAliasInternal +PUBLIC 70086 10 GetConsoleAliasW +PUBLIC 700b2 10 GetConsoleAliasA +PUBLIC 700dc 8 GetConsoleAliasesLengthInternal +PUBLIC 701a1 4 GetConsoleAliasesLengthW +PUBLIC 701b9 4 GetConsoleAliasesLengthA +PUBLIC 701d1 4 GetConsoleAliasExesLengthInternal +PUBLIC 70245 0 GetConsoleAliasExesLengthW +PUBLIC 70252 0 GetConsoleAliasExesLengthA +PUBLIC 7025f 10 GetConsoleAliasesInternal +PUBLIC 703c9 c GetConsoleAliasesW +PUBLIC 703e7 c GetConsoleAliasesA +PUBLIC 70405 c GetConsoleAliasExesInternal +PUBLIC 70531 8 GetConsoleAliasExesW +PUBLIC 7054c 8 GetConsoleAliasExesA +PUBLIC 70567 8 ExpungeConsoleCommandHistoryInternal +PUBLIC 7060f 4 ExpungeConsoleCommandHistoryW +PUBLIC 70627 4 ExpungeConsoleCommandHistoryA +PUBLIC 7063f c SetConsoleNumberOfCommandsInternal +PUBLIC 7070a 8 SetConsoleNumberOfCommandsW +PUBLIC 70725 8 SetConsoleNumberOfCommandsA +PUBLIC 70740 8 GetConsoleCommandHistoryLengthInternal +PUBLIC 707ed 4 GetConsoleCommandHistoryLengthW +PUBLIC 70805 4 GetConsoleCommandHistoryLengthA +PUBLIC 7081d 10 GetConsoleCommandHistoryInternal +PUBLIC 70989 c GetConsoleCommandHistoryW +PUBLIC 709a7 c GetConsoleCommandHistoryA +PUBLIC 709c5 4 SetConsoleCommandHistoryMode +PUBLIC 1ba6a c GetConsoleTitleInternal +PUBLIC 70a39 8 GetConsoleTitleA +PUBLIC 1ba3c 8 GetConsoleTitleW +PUBLIC 2da09 c SetConsoleTitleInternal +PUBLIC 70a61 4 SetConsoleTitleA +PUBLIC 2d9bd 4 SetConsoleTitleW +PUBLIC 70ad1 8 GetConsoleInputExeNameW +PUBLIC 1b355 4 SetConsoleInputExeNameW +PUBLIC 70b61 18 AddConsoleAliasInternal +PUBLIC 70c81 c AddConsoleAliasW +PUBLIC 70cbf c AddConsoleAliasA +PUBLIC 70cfc 8 GetConsoleInputExeNameA +PUBLIC 70da8 4 SetConsoleInputExeNameA +PUBLIC 1b10f 10 SetUpAppName +PUBLIC 29ee3 8 ParseReserved +PUBLIC 1aff3 4 GetConsoleLangId +PUBLIC 1afd5 0 SetTEBLangID +PUBLIC 18c64 c ConnectConsoleInternal +PUBLIC 70e05 2c AllocConsoleInternal +PUBLIC 71011 0 FreeConsoleInternal +PUBLIC 7108d 0 FreeConsole +PUBLIC 710e1 4 PropRoutine +PUBLIC 71191 10 AttachConsoleInternal +PUBLIC b6d7 8 ConDllInitialize +PUBLIC 71311 0 AllocConsole +PUBLIC 714f9 4 AttachConsole +PUBLIC 715f9 0 GetConsoleInputWaitHandle +PUBLIC 1ce32 14 WriteConsoleInternal +PUBLIC 1cf25 14 WriteConsoleA +PUBLIC 35484 14 WriteConsoleW +PUBLIC 1dc7e 4 CloseConsoleHandle +PUBLIC 1dd4d 10 DuplicateConsoleHandle +PUBLIC 71604 8 GetConsoleHandleInformation +PUBLIC 716c9 c SetConsoleHandleInformation +PUBLIC 1aeaa 4 VerifyConsoleIoHandle +PUBLIC 1ff5b 10 OpenConsoleWInternal +PUBLIC 10fe1 10 OpenConsoleW +PUBLIC 71749 20 ReadConsoleInternal +PUBLIC 71a1d 14 ReadConsoleA +PUBLIC 71a6c 14 ReadConsoleW +PUBLIC 71ac2 2c RegisterConsoleVDM +PUBLIC 71c19 c GetConsoleHardwareState +PUBLIC 71ce9 c SetConsoleHardwareState +PUBLIC 37c53 4 GetConsoleDisplayMode +PUBLIC 71d69 10 SetConsoleKeyShortcuts +PUBLIC 71e30 4 SetConsoleMenuClose +PUBLIC 71ea4 10 WriteConsoleInputVDMA +PUBLIC 71ec7 10 WriteConsoleInputVDMW +PUBLIC 71eea 8 SetConsoleCursor +PUBLIC 71f64 8 ShowConsoleCursor +PUBLIC 71fbf c ConsoleMenuControl +PUBLIC 72020 c SetConsolePaletteInternal +PUBLIC 720a0 c SetConsoleDisplayMode +PUBLIC 721c9 c SetConsolePalette +PUBLIC 72269 18 WriteConsoleInputInternal +PUBLIC 723c5 10 WriteConsoleInputA +PUBLIC 723e8 10 WriteConsoleInputW +PUBLIC 7240b 18 CopyRectangle +PUBLIC 7254f 18 ReadConsoleOutputInternal +PUBLIC 727e1 14 ReadConsoleOutputW +PUBLIC 72805 14 ReadConsoleOutputA +PUBLIC 72829 18 WriteConsoleOutputInternal +PUBLIC 72b21 14 WriteConsoleOutputW +PUBLIC 72b45 14 WriteConsoleOutputA +PUBLIC 72b69 1c ReadConsoleOutputString +PUBLIC 72cd9 14 ReadConsoleOutputCharacterA +PUBLIC 72cff 14 ReadConsoleOutputCharacterW +PUBLIC 72d25 14 ReadConsoleOutputAttribute +PUBLIC 72d4b 1c WriteConsoleOutputString +PUBLIC 72ea5 14 WriteConsoleOutputCharacterA +PUBLIC 72ecb 14 WriteConsoleOutputCharacterW +PUBLIC 72ef1 14 WriteConsoleOutputAttribute +PUBLIC 72f17 18 FillConsoleOutput +PUBLIC 72ff9 14 FillConsoleOutputCharacterA +PUBLIC 73020 14 FillConsoleOutputCharacterW +PUBLIC 73044 14 FillConsoleOutputAttribute +PUBLIC 73068 14 CreateConsoleScreenBuffer +PUBLIC 73215 8 InvalidateConsoleDIBits +PUBLIC 732e1 18 GetConsoleInput +PUBLIC 7348d 10 PeekConsoleInputA +PUBLIC 734b0 10 PeekConsoleInputW +PUBLIC 734d3 10 ReadConsoleInputA +PUBLIC 734f6 10 ReadConsoleInputW +PUBLIC 73519 14 ReadConsoleInputExA +PUBLIC 7353d 14 ReadConsoleInputExW +PUBLIC 73561 8 GetConsoleCursorInfo +PUBLIC 73629 4 GetConsoleSelectionInfo +PUBLIC 736e1 4 GetNumberOfConsoleMouseButtons +PUBLIC 73799 10 GetConsoleFontInfo +PUBLIC 738c1 8 GetConsoleFontSize +PUBLIC 7394f c GetCurrentConsoleFont +PUBLIC 1b1f0 8 SetConsoleMode +PUBLIC 73a21 8 GenerateConsoleCtrlEvent +PUBLIC 73aa8 4 SetConsoleActiveScreenBuffer +PUBLIC 73b1c 4 FlushConsoleInputBuffer +PUBLIC 73b90 8 SetConsoleScreenBufferSize +PUBLIC 73c0a 8 SetConsoleCursorPosition +PUBLIC 73c84 8 SetConsoleCursorInfo +PUBLIC 73d51 c SetConsoleWindowInfo +PUBLIC 73e21 18 ScrollConsoleScreenBufferInternal +PUBLIC 73f21 14 ScrollConsoleScreenBufferA +PUBLIC 73f45 14 ScrollConsoleScreenBufferW +PUBLIC 73f69 8 SetConsoleTextAttribute +PUBLIC 73fe5 8 SetConsoleFont +PUBLIC 7405f 4 SetConsoleIcon +PUBLIC 740d3 0 GetConsoleCP +PUBLIC 74143 4 SetConsoleCP +PUBLIC 1b18f 0 GetConsoleOutputCP +PUBLIC 741fe 4 SetConsoleOutputCPInternal +PUBLIC 74261 4 SetConsoleOutputCP +PUBLIC 74294 8 GetConsoleKeyboardLayoutNameWorker +PUBLIC 74329 4 GetConsoleKeyboardLayoutNameA +PUBLIC 74341 4 GetConsoleKeyboardLayoutNameW +PUBLIC 74359 0 GetConsoleWindow +PUBLIC 743c5 8 GetConsoleProcessList +PUBLIC 1af14 8 GetConsoleMode +PUBLIC 74501 0 GetNumberOfConsoleFonts +PUBLIC 7456d 8 GetNumberOfConsoleInputEvents +PUBLIC 74631 4 GetLargestConsoleWindowSize +PUBLIC 1bc2b 8 GetConsoleScreenBufferInfo +PUBLIC 746b9 10 SetConsoleLocalEUDC +PUBLIC 7477f c SetConsoleCursorMode +PUBLIC 747ff c GetConsoleCursorMode +PUBLIC 748c9 4 RegisterConsoleOS2 +PUBLIC 7493d 4 SetConsoleOS2OemFormat +PUBLIC 749b1 14 RegisterConsoleIMEInternal +PUBLIC 74ab9 8 RegisterConsoleIME +PUBLIC 74b12 4 UnregisterConsoleIMEInternal +PUBLIC 74b86 0 UnregisterConsoleIME +PUBLIC 74b97 c MyRegOpenKey +PUBLIC 74be9 10 MyRegQueryValue +PUBLIC 74c8e 8 GetCommandLineString +PUBLIC 74e13 4 ConsoleIMERoutine +PUBLIC 74f87 8 GetConsoleNlsMode +PUBLIC 750d9 8 SetConsoleNlsMode +PUBLIC 751a3 c GetConsoleCharType +PUBLIC 75271 4 DefaultHandler +PUBLIC 1b5c6 4 SetCtrlHandler +PUBLIC 2000c 4 RemoveCtrlHandler +PUBLIC 1b58b 8 SetConsoleCtrlHandler +PUBLIC 75280 4 CtrlRoutine +PUBLIC 75489 0 SetLastConsoleEventActiveInternal +PUBLIC 754d3 0 SetLastConsoleEventActive +PUBLIC 754e4 8 VDMConsoleOperation +PUBLIC 38211 10 EnumCalendarInfoA +PUBLIC 75749 10 EnumCalendarInfoExA +PUBLIC 7576c c EnumTimeFormatsA +PUBLIC 7578a c EnumDateFormatsA +PUBLIC 757aa c EnumDateFormatsExA +PUBLIC 757ca c EnumSystemLanguageGroupsA +PUBLIC 757e8 10 EnumLanguageGroupLocalesA +PUBLIC 75809 c EnumUILanguagesA +PUBLIC 37ce1 8 EnumSystemLocalesA +PUBLIC 75827 8 EnumSystemCodePagesA +PUBLIC 75842 14 GetGeoInfoA +PUBLIC a459 8 NlsGetACPFromLocale +PUBLIC cf52 18 NlsAnsiToUnicode +PUBLIC d239 14 NlsUnicodeToAnsi +PUBLIC 380ef c NlsEnumUnicodeToAnsi +PUBLIC 38063 24 NlsDispatchAnsiEnumProc +PUBLIC d077 18 CompareStringA +PUBLIC 38de8 18 LCMapStringA +PUBLIC d262 10 GetLocaleInfoA +PUBLIC 758cb c SetLocaleInfoA +PUBLIC 7596b 18 GetCalendarInfoA +PUBLIC 75ad6 10 SetCalendarInfoA +PUBLIC 3632d 18 GetTimeFormatA +PUBLIC 361ee 18 GetDateFormatA +PUBLIC 2ec56 18 GetNumberFormatA +PUBLIC 75b79 18 GetCurrencyFormatA +PUBLIC 38a0c 14 GetStringTypeA +PUBLIC 75eb1 14 FoldStringA +PUBLIC 76047 c GetCPInfoExA +PUBLIC 760cf 14 GetStringTypeExA +PUBLIC a490 10 GetStringTypeW +PUBLIC 760df 3c FindJamoDifference +PUBLIC bfef 14 GetStringTypeExW +PUBLIC af4f 1c LongCompareStringW +PUBLIC 763c9 0 NlsResetProcessLocale +PUBLIC 763ef 8 IsValidLanguageGroup +PUBLIC 1c48b 8 IsValidLocale +PUBLIC 764fb 4 IsValidUILanguage +PUBLIC a415 0 GetThreadLocale +PUBLIC 13038 0 GetSystemDefaultUILanguage +PUBLIC 13070 0 GetUserDefaultUILanguage +PUBLIC 127b2 0 GetSystemDefaultLangID +PUBLIC bf3d 0 GetSystemDefaultLCID +PUBLIC 9f10 0 GetUserDefaultLCID +PUBLIC 7668d c SetCurrentUserRegValue +PUBLIC 76734 1c SetMultipleUserInfoInRegistry +PUBLIC 769f2 1c SetMultipleUserInfo +PUBLIC 39200 c GetTwoDigitYearInfo +PUBLIC 76a53 c SetTwoDigitYearInfo +PUBLIC 76c59 10 GetNativeLanguageName +PUBLIC 383cf 4 ConvertDefaultLocale +PUBLIC 1bbba 4 SetThreadLocale +PUBLIC bf64 0 GetUserDefaultLangID +PUBLIC 2f041 c VerLanguageNameW +PUBLIC 2efb9 c VerLanguageNameA +PUBLIC 11562 10 GetLocaleInfoW +PUBLIC 39020 18 GetCalendarInfoW +PUBLIC 76d1b 10 SetCalendarInfoW +PUBLIC 76e34 c SetUserInfo +PUBLIC 1b258 4 SetThreadUILanguage +PUBLIC 76e73 c SetLocaleInfoW +PUBLIC 77cf7 10 CreateRegKey +PUBLIC 1bcfe 10 OpenRegKey +PUBLIC 15047 14 QueryRegValue +PUBLIC 77df0 10 SetRegValue +PUBLIC 1734f 10 MapSection +PUBLIC 77e24 4 UnMapSection +PUBLIC 17f7d 18 GetNlsSectionName +PUBLIC 77e43 c GetCodePageDLLPathName +PUBLIC 2ae21 8 GetNTFileName +PUBLIC 2ac6c c CreateNlsSecurityDescriptor +PUBLIC 2b95b 8 AppendAccessAllowedACE +PUBLIC 2b883 0 CreateNlsObjectDirectory +PUBLIC 172de 14 OpenSection +PUBLIC 2ad98 8 OpenDataFile +PUBLIC 77f87 8 CreateSectionTemp +PUBLIC 77fec 10 Internal_EnumSystemLanguageGroups +PUBLIC 782c6 14 Internal_EnumLanguageGroupLocales +PUBLIC 2a8fa 10 Internal_EnumUILanguages +PUBLIC 37cfc c Internal_EnumSystemLocales +PUBLIC 7849b c Internal_EnumSystemCodePages +PUBLIC 38234 18 Internal_EnumCalendarInfo +PUBLIC 38958 38 EnumDateTime +PUBLIC 786e5 c EnumSystemLanguageGroupsW +PUBLIC 78703 10 EnumLanguageGroupLocalesW +PUBLIC 2a8dc c EnumUILanguagesW +PUBLIC 78724 8 EnumSystemLocalesW +PUBLIC 7873f 8 EnumSystemCodePagesW +PUBLIC 7875a 10 EnumCalendarInfoW +PUBLIC 7877d 10 EnumCalendarInfoExW +PUBLIC 388dc 10 Internal_EnumTimeFormats +PUBLIC 38801 14 Internal_EnumDateFormats +PUBLIC 388be c EnumTimeFormatsW +PUBLIC 387e1 c EnumDateFormatsW +PUBLIC 787a0 c EnumDateFormatsExW +PUBLIC 787c0 8 GetGeoLCID +PUBLIC 78847 14 GetGeoInfoW +PUBLIC 78bd9 c EnumSystemGeoID +PUBLIC 3798e 4 GetUserGeoID +PUBLIC 78c5c 4 SetUserGeoID +PUBLIC 78db1 10 FoldCZone +PUBLIC 78e32 10 FoldDigits +PUBLIC 78eb3 10 FoldCZone_Digits +PUBLIC 78f7b 10 FoldLigatures +PUBLIC 790a7 10 FoldPreComposed +PUBLIC 791d2 10 FoldComposite +PUBLIC ce53 18 MapCase +PUBLIC 2d4ad 1c MapSortKey +PUBLIC 79269 18 MapNormalization +PUBLIC 374eb 18 MapHalfKana +PUBLIC 37787 18 MapFullKana +PUBLIC 794fb 1c MapTraditionalSimplified +PUBLIC 79636 14 FoldStringW +PUBLIC 37693 18 MapKanaWidth +PUBLIC cca8 18 LCMapStringW +PUBLIC 110cb 4 IsValidCodePage +PUBLIC 9915 0 GetACP +PUBLIC 797c3 4 SetCPGlobal +PUBLIC 127a7 0 GetOEMCP +PUBLIC b7dc 4 IsDBCSLeadByte +PUBLIC 2f540 10 GetWCCompSB +PUBLIC 797df 1c GetWCCompMB +PUBLIC 79866 14 GetWCCompSBErr +PUBLIC 798c1 1c GetWCCompMBErr +PUBLIC a1fb 18 GetMBNoDefault +PUBLIC bd19 20 GetMBDefault +PUBLIC 32cf3 1c GetMBCompSB +PUBLIC 7998a 24 GetMBCompMB +PUBLIC 7a064 0 GetMacCodePage +PUBLIC cfd4 18 SpecialMBToWC +PUBLIC 12e76 8 GetCPInfo +PUBLIC 7a1cd c GetCPInfoExW +PUBLIC 7a4ce 8 IsDBCSLeadByteEx +PUBLIC 9bf8 18 MultiByteToWideChar +PUBLIC 32c7b 20 GetMBDefaultComp +PUBLIC a0d4 20 WideCharToMultiByte +PUBLIC 7a6b5 0 GetXPSP2ResModuleHandle +PUBLIC 7a6e2 0 GetXPSP3ResModuleHandle +PUBLIC 35819 0 NlsGetCacheUpdateCount +PUBLIC 34474 c IsValidSeparatorString +PUBLIC 7a712 c IsValidGroupingString +PUBLIC 336f6 8 IsValidCalendarType +PUBLIC 33735 8 IsValidCalendarTypeStr +PUBLIC 7a773 0 GetPreComposedChar +PUBLIC 2f440 4 GetCompositeChars +PUBLIC 7a7f3 4 InsertPreComposedForm +PUBLIC 37834 8 InsertFullWidthPreComposedForm +PUBLIC 2f40d 0 InsertCompositeForm +PUBLIC 7a850 8 NlsConvertIntegerToHexStringW +PUBLIC 124d1 8 NlsConvertStringToIntegerW +PUBLIC 121de 0 NlsStrCpyW +PUBLIC 1bdd2 0 NlsStrCatW +PUBLIC a2d4 0 NlsStrLenW +PUBLIC 7a8b2 0 NlsStrEqualW +PUBLIC 7a962 4 NlsStrNEqualW +PUBLIC 7aa41 4 GetDefaultSortkeySize +PUBLIC 7aa6b 4 GetLinguistLangSize +PUBLIC 7aa95 10 ValidateLCType +PUBLIC 2ee51 14 GetStringTableEntry +PUBLIC 7ad9c 0 NlsIsDll +PUBLIC 2c16a 0 UpdateUserInfoCache +PUBLIC 12544 c NlsStringIsInRange +PUBLIC 2a5c3 10 GetUserInfoFromRegistry +PUBLIC 12090 1c GetUserInfo +PUBLIC 14f5c 14 NlsConvertIntegerToString +PUBLIC 397f8 4 ValidateLocale +PUBLIC 384db c GetCPFileNameFromRegistry +PUBLIC 3440e 4 IsValidNumberFormat +PUBLIC 7adfe 4 IsValidCurrencyFormat +PUBLIC 7ae7f 20 GetRegIntValue +PUBLIC 7af62 8 ConvertGroupingStringToInt +PUBLIC 7afd9 1c GetGroupingValue +PUBLIC 3472b 20 GetNumberString +PUBLIC 3465d 20 ParseNumber +PUBLIC 7b04e 20 ParseCurrency +PUBLIC 344bc 18 GetNumberFormatW +PUBLIC 7b6ca 18 GetCurrencyFormatW +PUBLIC 3414d 4 IsValidTime +PUBLIC 339dc 4 IsValidDate +PUBLIC 7bad3 18 GetCalendarYear +PUBLIC 7bb6e c GetAbsoluteDate +PUBLIC 7bc59 4 GetAdvanceHijriDate +PUBLIC 7be1b 4 DaysUpToHijriYear +PUBLIC 7be83 c IsValidDateForHebrew +PUBLIC 335d4 18 StringCchCopyExW +PUBLIC 33ec8 14 ParseTime +PUBLIC 7bf4d 8 GetHijriDate +PUBLIC 7c04f 8 GetHebrewDate +PUBLIC 7c86f c NumberToHebrewLetter +PUBLIC 33fd3 18 GetTimeFormatW +PUBLIC 33a4a 20 ParseDate +PUBLIC 33775 18 GetDateFormatW +PUBLIC c0ed 0 NlsThreadCleanup +PUBLIC 17fc1 0 InitKoreanWeights +PUBLIC 1805b c NlsDllInitialize +PUBLIC 38617 4 IsCPHashNodeLoaded +PUBLIC 7caa9 0 GetGeoFileInfo +PUBLIC a557 0 GetCTypeFileInfo +PUBLIC 7cb54 8 LoadCodePageAsDLL +PUBLIC 188fc 14 MakeCPHashNode +PUBLIC 16ea9 10 MakeLocHashNode +PUBLIC 336b6 8 GetCalendar +PUBLIC 7cc2b 4 IsValidSortId +PUBLIC 7cd42 0 GetLanguageExceptionInfo +PUBLIC 7cdc6 4 FindLanguageExceptionPointers +PUBLIC 7ce1e 4 CopyLanguageExceptionInfo +PUBLIC 184dc c FindExceptionPointers +PUBLIC 7ceb0 8 CopyExceptionInfo +PUBLIC 7cf53 4 WaitOnEvent +PUBLIC 183fe 8 GetSortkeyFileInfo +PUBLIC 3996f 8 GetCodePageFileInfo +PUBLIC 1831e 10 MakeLangHashNode +PUBLIC d1ae 0 GetCPHashNode +PUBLIC 150c2 0 GetLocHashNode +PUBLIC 7cf85 8 CreateAndCopyLanguageExceptions +PUBLIC 7d1b9 4 GetLinguisticLanguageInfo +PUBLIC 18297 10 GetLanguageFileInfo +PUBLIC 7d246 0 GetLangHashNode +PUBLIC 7d340 c UpdateJamoState +PUBLIC 7d3aa 14 GetJamoComposition +PUBLIC 7d4ae 18 MapOldHangulSortKey +PUBLIC 17210 0 NlsIsInteractiveUserProcess +PUBLIC 7d5b4 0 NlsCheckForInteractiveUser +PUBLIC 2a25d 4 NlsGetCacheBuffer +PUBLIC 2a41a 0 NlsInvalidateCache +PUBLIC 7d659 4 NlsFlushProcessCache +PUBLIC 2a855 10 NlsQueryCurrentUserInfo +PUBLIC 11fff 18 NlsGetCurrentUserNlsInfo +PUBLIC 2a532 4 NlsGetUserLocale +PUBLIC 7d6b7 c CsrBasepNlsSetUserInfo +PUBLIC 16ff1 8 CsrBasepNlsGetUserInfo +PUBLIC 7d765 1c CsrBasepNlsSetMultipleUserInfo +PUBLIC 7d9c9 0 CsrBasepNlsUpdateCacheCount +PUBLIC 7da0e c UTFCPInfo +PUBLIC 7da7f 10 UTF7ToUnicode +PUBLIC 31054 14 UTF8ToUnicode +PUBLIC 7dc45 10 UnicodeToUTF7 +PUBLIC 21523 10 UnicodeToUTF8 +PUBLIC 30f99 18 UTFToUnicode +PUBLIC 215f5 20 UnicodeToUTF +PUBLIC 2ad39 c CsrBasepNlsCreateSection +PUBLIC 7dead 8 DelayLoadFailureHook +PUBLIC 7debd 4 FindDll +PUBLIC 7dfad 8 LookupHandlerByName +PUBLIC 7e036 8 LookupHandlerByOrdinal +PUBLIC 7e07f 8 LookupHandler +PUBLIC 7e0cb 14 GetSSIDForAdapter +PUBLIC 7e0ef 18 GetSignalStrengthForAdapter +PUBLIC ddf5 0 GetCurrentProcess +PUBLIC 7e27b 4 ntohs +PUBLIC 7e299 c WSAEnumProtocolsW +PUBLIC 7e2bd 24 WSAIoctl +PUBLIC 7e313 4 GetActivePwrScheme +PUBLIC 7e34b 28 WinStationSendMessageW +PUBLIC 7e362 8 ReadPwrScheme +PUBLIC 7e39e 18 SdbQueryData +PUBLIC 14ae7 4 FreeEnvironmentStringsW +PUBLIC 7e3a9 c mixerGetID +PUBLIC 7e536 18 SetupDiGetDeviceInterfaceDetailA +PUBLIC cc97 4 LockResource +PUBLIC 7e848 8 DnsRecordCompare +PUBLIC 7e878 10 DnsRecordSetCompare +PUBLIC 260c2 4 DnsApiAlloc +PUBLIC 7e8b2 c DnsRecordSetCopyEx +PUBLIC 7e98d 4 DnsApiFree +PUBLIC 7e9e7 0 LZStart +PUBLIC 7ea57 c SfpInstallCatalog +PUBLIC 7ea62 8 SfpDeleteCatalog +PUBLIC 7eb14 10 pSetupConcatenatePaths +PUBLIC 7eb60 c SetActivePwrScheme +PUBLIC 7ec59 0 IsPwrShutdownAllowed +PUBLIC 7ece6 10 UrlMkSetSessionOption +PUBLIC 7f052 0 ldap_search_init_pageW +PUBLIC 7f078 8 DnsFreeConfigStructure +PUBLIC 7f0c5 c DnsSetConfigDword +PUBLIC 7f1f1 10 WZCProviderDeleteWirelessProfile +PUBLIC 7f1fe 0 LZDone +PUBLIC 7f215 8 SetConsoleMaximumWindowSize +PUBLIC 7f23b 1c MprAdminConnectionEnum +PUBLIC 7f251 8 NPCancelConnectionForCSCAgent +PUBLIC 7f6a5 5c LocalEnrollNoDS +PUBLIC 328ec 0 memmove +PUBLIC 2cf55 c RtlDnsHostNameToComputerName +PUBLIC 11fc7 0 wcsncpy +PUBLIC 7f853 0 wcschr +PUBLIC 29f14 0 wcsstr +PUBLIC a0c9 0 _allmul +PUBLIC 7f85e 0 DbgBreakPoint +PUBLIC 7f869 0 DbgPrint +PUBLIC 24c6 0 _SEH_prolog +PUBLIC 2501 0 _SEH_epilog +PUBLIC 39aa8 0 _except_handler3 +PUBLIC 39b8e 4 _seh_longjmp_unwind +PUBLIC 7f874 4 DbgUiDebugActiveProcess +PUBLIC 7f87f 0 DbgUiConnectToDbg +PUBLIC 7f88a 4 DbgUiIssueRemoteBreakin +PUBLIC 7f895 14 NtSetInformationDebugObject +PUBLIC 7f8a0 0 DbgUiGetThreadDebugObject +PUBLIC 7f8ab 8 DbgUiConvertStateChangeStructure +PUBLIC 7f8b6 8 DbgUiWaitStateChange +PUBLIC 7f8c1 8 DbgUiContinue +PUBLIC 7f8cc 4 DbgUiStopDebugging +PUBLIC 7f8d7 0 strncpy +PUBLIC 7f8e2 8 RtlFlushSecureMemoryCache +PUBLIC de84 0 _global_unwind2 +PUBLIC dedf 0 _local_unwind2 +PUBLIC df3f 0 _NLG_Return2 +PUBLIC df4f 0 _abnormal_termination +PUBLIC df72 0 _NLG_Notify1 +PUBLIC df7b 0 _NLG_Notify +PUBLIC df91 0 _NLG_Dispatch2 +PUBLIC 7f8ed 18 NtQueryVirtualMemory +PUBLIC 18045 4 LdrSetDllManifestProber +PUBLIC 18050 8 RtlSetThreadPoolStartFunc +PUBLIC 1017b 4 RtlEncodePointer +PUBLIC 39493 10 RtlSetHeapInformation +PUBLIC 7f8f8 14 RtlQueryHeapInformation +PUBLIC abd3 4 LdrUnloadDll +PUBLIC 14e44 4 LdrUnloadAlternateResourceModule +PUBLIC 112bb 4 LdrDisableThreadCalloutsForDll +PUBLIC e46c 10 LdrGetDllHandle +PUBLIC b4c4 8 LdrUnlockLoaderLock +PUBLIC 2129a 8 LdrAddRefDll +PUBLIC b3ca c LdrLockLoaderLock +PUBLIC 17779 c LdrEnumerateLoadedModules +PUBLIC 14e0f 8 LdrLoadAlternateResourceModule +PUBLIC e069 10 LdrLoadDll +PUBLIC ad95 10 LdrGetProcedureAddress +PUBLIC 9f9f 10 LdrFindResource_U +PUBLIC 9faa 10 LdrAccessResource +PUBLIC 1126d 10 LdrFindResourceDirectory_U +PUBLIC 1cdf8 0 LdrShutdownProcess +PUBLIC 7f903 8 NtTerminateProcess +PUBLIC 1a204 18 LdrQueryImageFileExecutionOptions +PUBLIC 7f90e 0 wcsncmp +PUBLIC c0d1 0 LdrShutdownThread +PUBLIC 10186 4 RtlDecodePointer +PUBLIC 2c053 c RtlSetIoCompletionCallback +PUBLIC 7f919 28 RtlApplicationVerifierStop +PUBLIC 7f924 0 _alloca_probe +PUBLIC 19a62 0 DbgPrintEx +PUBLIC 15451 4 LdrDestroyOutOfProcessImage +PUBLIC 162a8 14 LdrAccessOutOfProcessResource +PUBLIC 15446 14 LdrFindCreateProcessManifest +PUBLIC 15345 10 LdrCreateOutOfProcessImage +PUBLIC 16912 0 _allshl +PUBLIC 7f92f 4 RtlUnhandledExceptionFilter +PUBLIC 7f93a 0 wcspbrk +PUBLIC 7f945 0 _wcslwr +PUBLIC 37a6c 0 _wtol +PUBLIC 7f950 0 _strlwr +PUBLIC 7f95b 0 _ValidateEH3RN +PUBLIC 7fb82 10 RtlUnwind +PUBLIC 7fb8d c InitGlobalBuffers +PUBLIC 7fc40 0 InitGlobalBuffersEx +PUBLIC 7fc57 4 FreeGlobalBuffers +PUBLIC 7fca5 c lz_CopyFile +PUBLIC 7fd63 c ExpandOrCopyFile +PUBLIC 7fe21 4 ExtractFileNameW +PUBLIC 7fe56 4 ExtractFileName +PUBLIC 7fea2 4 ExtractExtensionW +PUBLIC 7fed7 4 ExtractExtension +PUBLIC 7ff1d 4 MakeCompressedNameW +PUBLIC 7ff89 4 MakeCompressedName +PUBLIC 7fff3 8 MakeExpandedName +PUBLIC 800fc 8 CopyDateTimeStamp +PUBLIC 80146 c GetHdr +PUBLIC 801f9 4 IsCompressed +PUBLIC 80246 18 LZDecode +PUBLIC 804ad c ReadInBuf +PUBLIC 80527 c WriteOutBuf +PUBLIC 80579 4 LZIsCharLowerA +PUBLIC 805dc 4 LZIsCharUpperA +PUBLIC 8063f 4 LZCharNextA +STACK WIN 4 b5ae 16 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9b47 66 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17826 35 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 55709 1f7 c 0 10 8 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 558b4 e 0 0 10 8 4c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 be41 c7 c 0 4 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39bc8 e 0 0 4 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 98f4 2b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 936b 1e 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9371 14 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 92b0 32 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 92b6 28 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 92b7 26 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30769 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b722 20 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 29d7a 164 a 0 18 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 29d83 157 1 0 18 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 29d84 155 0 0 18 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 29dc5 8e 0 0 18 c 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 1b069 a1 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b078 90 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b079 82 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 17860 24 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 29f30 6f 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 29f36 65 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1dc03 54 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12f39 52 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12f3f 48 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17889 5c 1d 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1789f 42 7 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 178a6 38 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17923 98 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1792a 8f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 180a6 23c 9 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 180af 231 0 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 180c5 21a 0 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1795e 89 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 17961 85 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1798a 5a 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 179ea 212 8 0 0 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17a3c 1bd 0 0 0 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17a49 1af 0 0 0 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16e70 85 8 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18a21 a1 e 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18a2f 91 0 0 0 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18a68 57 0 0 0 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17cb5 257 8 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17e09 89 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1839b d3 1b 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 183b2 b8 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 183b6 b3 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 998d 16b c 0 8 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39e42 e 0 0 8 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 992f 10b c 0 4 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39ea2 e 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39eca e 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1625 129 c 0 20 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1717 4 0 0 20 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32eb1 ba c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39f0b e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32e1d bb c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39f69 e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a03b 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a017 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55921 e8 8 0 4 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5595c a5 0 0 4 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5595d a3 0 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a35e b91 19 0 18 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a36a b81 d 0 18 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 132 - ^ = +STACK WIN 4 a36b b7f c 0 18 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 132 - ^ = +STACK WIN 4 a377 b72 0 0 18 c 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 132 - ^ = +STACK WIN 4 55a0e e0 c 0 4 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55abf e 0 0 4 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55b09 8b c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55b65 e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30927 209 c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3a7c5 e 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30bd3 142 c 0 c 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3a824 e 0 0 c 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3a86a 19 0 0 c 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33107 18f f 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33110 182 6 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 33116 17b 0 0 14 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 3312f 14d 0 0 14 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 ffb1 12d c 0 c 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3a94d e 0 0 c 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3a995 19 0 0 c 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 326c1 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ab78 ff c 0 4 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3a9c6 e 0 0 4 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 330e7 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a9cc 64 a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a9d2 5a 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 a9d6 55 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 ba64 39 c 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3aa01 4 0 0 8 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bbce b2 c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3aa1d e 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e6dc 185 c 0 18 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e6e8 175 0 0 18 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 e701 13c 0 0 18 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 e73a ed 0 0 18 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 1021c 1ba 9 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10225 1ad 0 0 10 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1026f 15c 0 0 10 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30b7d 3b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c86d 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2c87c 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ddfe d3 c 0 1c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3aad0 4 0 0 1c 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a996 65 a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a99c 5b 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 a9a0 56 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 b64c 63 c 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3ab10 11 0 0 8 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2520 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1042c 301 17 0 1c 8 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3abe7 7a 0 0 1c 8 420 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 98eb 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2ff92 18 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103a3 9e 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55bbc 2d 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55bee 31 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55c24 2e 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55c2c 22 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55c57 27 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55c83 4c b 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55c89 42 5 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 55c8d 3d 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 55c8e 3b 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 55cd4 119 15 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55cdc 10d d 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 55cdd 10b c 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 55ce9 fe 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 55df2 bd 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55df8 b3 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55e53 15 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55eb4 36 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55eef 15b 12 0 18 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55efb 14b 6 0 18 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 55f01 144 0 0 18 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5604f a4 18 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5605a 95 d 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 5605e 90 9 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 56067 86 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 560f8 d7 9 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56100 cb 1 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 56101 c9 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 5618d 3c 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 561d4 a5 16 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 561dd 98 d 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 561de 94 c 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 561ea 87 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 5627e fe 16 0 c 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56287 f1 d 0 c 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 56288 ef c 0 c 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 56294 e2 0 0 c c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 56381 2b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 563b1 20 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 563d6 60 10 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 563df 53 7 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 563e6 4b 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 56407 24 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5643b 1f 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56441 15 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5645f 54 a 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56465 4a 4 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 56469 45 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 56471 3c 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 564b8 5c 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 564be 52 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 564cf 16 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56519 180 e 0 c 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56522 173 5 0 c 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 56523 171 4 0 c 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 56527 16c 0 0 c c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 5669e c8 9 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 566a6 bc 1 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 566a7 ba 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 5676b 27b 15 0 c 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56774 26e c 0 c 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 5677f 262 1 0 c 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 56780 260 0 0 c c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 569ec e9 15 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 569f4 dd d 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 569f5 db c 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 56a01 ce 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 56ada b5 15 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56ae2 a9 d 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 56ae3 a7 c 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 56aef 9a 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 56b94 12e 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56b9c 122 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56bba 102 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56cc7 113 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56cdf f6 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56cea ea 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56ddf 22e 19 0 1c 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 56df1 2a 7 0 1c 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 56df2 28 6 0 1c 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 56df8 21 0 0 1c c 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 57012 8d 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57018 83 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5704b 45 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5704f 40 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 570a4 46 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 570ac 16 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 570ef 5b 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 570f7 16 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57112 2c 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5714f 75 e 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5715d 5e 0 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57177 35 0 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 571c9 e0 a 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 571cf d6 4 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 571d3 d1 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 572ae 14b 9 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 572b7 13e 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 572df 115 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 573fe 1f4 1c 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5740d 1b2 d 0 1c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 57411 1ad 9 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 5741a 1a3 0 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 37bfc 52 13 0 0 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 37a77 1c7 13 0 8 0 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 37a80 1ba a 0 8 4 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 37a8a 1af 0 0 8 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 575f7 69 b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 575fd 5f 5 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 575fe 5d 4 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 57602 58 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 57665 70 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5766b 66 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 576a6 2a 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 576da 5c c 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 576e1 51 5 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 576e2 4f 4 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 576e6 4a 0 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 5773b 82 15 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57748 71 8 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 57749 6f 7 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 57750 67 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 577c2 a4 e 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 577cb 97 5 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 577cc 95 4 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 577d0 90 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 5786b 4b 11 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57871 41 b 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 57878 37 4 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5787c 32 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 202af 1e8 22 0 10 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 202c3 1cb e 0 10 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 202c4 1c9 d 0 10 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 202d1 1bb 0 0 10 c c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 578bb 9d 10 0 c 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 578c4 90 7 0 c 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 578cb 88 0 0 c 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5795d 95 a 0 10 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57966 88 1 0 10 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57967 86 0 0 10 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 579f7 ac 9 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 579fe a1 2 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 579ff 9d 1 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 57a00 9b 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 57aa8 101 9 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57ab0 f5 1 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 57ab1 f3 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 57ae7 93 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 57bae e4 a 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57bb7 d7 1 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 57bb8 d5 0 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 57be2 a8 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 57c97 38 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57cd4 b4 9 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57cdd 54 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57d07 29 0 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57da5 80 b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57dab 76 5 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 57daf 71 1 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 57db0 6f 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 57e41 3f 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57e85 2c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57eb6 9e a 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57ebe 92 2 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 57ebf 8e 1 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 57ec0 8c 0 0 4 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 57f59 2c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57f8a 4e a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57f90 44 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57f94 3f 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57fdd a7 7 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 57fe4 9c 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 57ff3 8c 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 57ff4 8a 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 31893 136 22 0 10 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 318a7 119 e 0 10 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 318ab 114 a 0 10 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 318b5 109 0 0 10 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 316c7 20b 13 0 8 0 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 316d8 139 2 0 8 4 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 68 - ^ = +STACK WIN 4 316d9 137 1 0 8 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 68 - ^ = +STACK WIN 4 316da 135 0 0 8 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 68 - ^ = +STACK WIN 4 5808d 121 15 0 4 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5809a 110 8 0 4 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 580a1 108 1 0 4 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 580a2 106 0 0 4 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 201f1 25b a 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 201fb 22d 0 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 2020a 210 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 20210 209 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 581b3 7c 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 581b9 72 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 581cc 5e 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 216a4 105 a 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 216ad f8 1 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 216ae f6 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 21702 84 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 58234 6e 8 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5827c 17 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 582a7 a0 b 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 582ad 96 5 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 582ae 94 4 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 582b2 8f 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5834c 52 8 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58380 1a 0 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 583a3 17b 7 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 583aa 170 0 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 583d0 143 0 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58523 a7 b 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58529 9d 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5852a 9b 4 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5852e 96 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2ceb2 ae 1c 0 c 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2cec0 97 e 0 c 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 2cec4 92 a 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 2cece 87 0 0 c c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 585cf 97 18 0 c 0 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 585dd 76 a 0 c 4 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 585e7 6b 0 0 c 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5866b 476 1c 0 10 0 68c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5867c 2f7 b 0 10 4 68c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1684 - ^ = +STACK WIN 4 58680 2f2 7 0 10 8 68c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1684 - ^ = +STACK WIN 4 58687 2ea 0 0 10 c 68c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1684 - ^ = +STACK WIN 4 58bc3 76 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58be8 4d 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58c3e 26 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58c69 19c b 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58c72 18f 2 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 58c73 18d 1 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 58c74 18b 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 58e0a 117 a 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58e12 10b 2 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 58e13 109 1 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 58e14 107 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 58f26 44 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58f3c 2a 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58f6f dc 8 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 58f76 d1 1 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 58f77 cf 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 58f91 af 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 59050 44 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59066 2a 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59099 211 d 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 590a2 6d 4 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 590a6 68 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 592af 44 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 592c5 2a 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 592f8 b1 11 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 592fe a7 b 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 592ff a5 a 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 59309 9a 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 593ae b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b852 20 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b877 1a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30b14 3a 8 0 0 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f272 79 9 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f27a 6d 1 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f27b 6b 0 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 138fc 172 d 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 13905 165 4 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 13909 160 0 0 10 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34ffe 96 12 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35006 8a a 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 35010 7f 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 360dd 63 a 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 360e3 59 4 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 360e7 54 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 360f4 46 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 f2ee 40 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 176b 75 8 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17e5 24 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 593be 9b 40 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 593ed 68 11 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 593fe 53 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 929c f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e7ec 82 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10b1c 77 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e866 5d 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e88c 22 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35524 5d 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3554a 22 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3065d 96 8 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3214e 8e 8 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10ad9 3b 11 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10aea 26 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 350bf 166 15 0 4 0 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 350d0 14c 4 0 4 4 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 350d4 147 0 0 4 8 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5945e 121 2c 0 4 0 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5946f eb 1b 0 4 4 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5948a cf 0 0 4 8 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2d36f 46 8 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59584 38 b 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5958f 29 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e9c1 2e7 1d 0 c 0 188 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e9d2 29a c 0 c 4 188 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e9de 28d 0 0 c 8 188 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 595c1 278 15 0 c 0 180 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 595d2 25e 4 0 c 4 180 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 392 - ^ = +STACK WIN 4 595d6 259 0 0 c 8 180 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 392 - ^ = +STACK WIN 4 5961c 20f 0 0 c c 180 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 392 - ^ = +STACK WIN 4 5983e 1ee 13 0 8 0 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59847 1d2 a 0 8 4 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 59848 1d0 9 0 8 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 59851 1c6 0 0 8 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 a7d4 b7 8 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a810 67 0 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a811 61 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59a31 e8 1b 0 4 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59a42 ce a 0 4 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 59a4b c4 1 0 4 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 59a4c c2 0 0 4 c c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 13093 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 59b1e 4f a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59b28 41 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59b72 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 59b7c 1ea 11 0 0 0 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59b8a 1c5 3 0 0 4 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ = +STACK WIN 4 59b8d 1c1 0 0 0 8 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ = +STACK WIN 4 59c2c fa 0 0 0 c 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ = +STACK WIN 4 59d78 2ab 17 0 4 8 244 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59dd6 4 0 0 4 8 244 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 59f9f 14 0 0 4 8 244 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a0bd 61 8 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a0d4 46 0 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a123 4e 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a13c 31 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a14b 21 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a176 22 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a19d 46 6 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a1e8 44 8 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a231 59 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a28f 57 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a2eb 2b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a31b 31 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a351 70 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a357 66 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a358 64 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a3c6 62 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a3cc 58 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a3cd 56 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a42d 4e 9 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a436 35 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a480 e0 9 0 8 0 68 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a489 42 0 0 8 4 68 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a565 3f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a56d 33 4 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a571 2e 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a5a9 44 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a5af 3a 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a5be 1a 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 36f5b 460 9 0 4 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 36f64 e3 0 0 4 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 36f9d 98 0 0 4 8 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 36f9e 96 0 0 4 c 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 323d2 146 a 0 8 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 323db 139 1 0 8 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 323dc 137 0 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a5f2 c22 1d 0 c 0 2c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5a60f bfc 0 0 c 4 2c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 716 - ^ = +STACK WIN 4 5a689 b7e 0 0 c 8 2c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 716 - ^ = +STACK WIN 4 5a690 b76 0 0 c c 2c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 716 - ^ = +STACK WIN 4 5b219 1d 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 217ac 20 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b23b 4b 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b243 3f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2af8f 2c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30cce 1c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 360a9 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 360c3 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30bbb 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b28b 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1006c 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34e97 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c3be 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 354ed 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30cfe 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32695 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b2ab 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f827 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f726 59 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f72c 4f 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f72d 4d 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f763 59 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f769 4f 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f76a 4d 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ee95 e2 7 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ee9b d8 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ee9c d6 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f88c 181 13 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f893 176 c 0 14 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 f897 171 8 0 14 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 f89f 168 0 0 14 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 f6da 63 b 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f6e5 54 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 f7a0 124 22 0 c 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f7b1 10a 11 0 c 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 f7b5 105 d 0 c 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 f7c2 f7 0 0 c c 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 1c858 6a 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c85b 66 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 331f9 23 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c8a6 35 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1c8ac 27 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1c8ad 25 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b2cb 85 1b 0 8 0 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b315 2f 0 0 8 4 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e361 460 b 0 4 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e36a 453 2 0 4 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 1e36b 451 1 0 4 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 1e36c 44f 0 0 4 c 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 1e6e1 119 d 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e6ed 109 1 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1e6ee 107 0 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1e708 8c 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 35889 29 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e891 362 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e8a8 100 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e8b6 f1 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f18a 112 10 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f193 105 7 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f19a fd 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b355 db 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b36b c1 0 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b36c bf 0 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3331f 98 a 0 0 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33328 8d 1 0 0 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33329 8b 0 0 0 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f460 3a2 12 0 28 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f46c 392 6 0 28 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 f46d 390 5 0 28 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 f472 38a 0 0 28 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 f928 18 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f851 47 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1c8db 3b1 28 0 14 0 84 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1c8fb 388 8 0 14 4 84 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 140 - ^ = +STACK WIN 4 1c8fc 386 7 0 14 8 84 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 140 - ^ = +STACK WIN 4 1c903 37e 0 0 14 c 84 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 140 - ^ = +STACK WIN 4 5b435 158 1f 0 4 0 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b446 44 e 0 4 4 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ = +STACK WIN 4 5b44a 3f a 0 4 8 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ = +STACK WIN 4 5b454 34 0 0 4 c 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ = +STACK WIN 4 1b42d 157 1f 0 8 0 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b43e 46 e 0 8 4 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ = +STACK WIN 4 1b442 41 a 0 8 8 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ = +STACK WIN 4 1b44c 36 0 0 8 c 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ = +STACK WIN 4 1cac2 217 1e 0 10 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1cad0 200 10 0 10 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 1cad4 1fb c 0 10 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 1cae0 1ee 0 0 10 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 5b592 185 1f 0 8 0 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b5a3 5e e 0 8 4 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ = +STACK WIN 4 5b5a7 59 a 0 8 8 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ = +STACK WIN 4 5b5b1 4e 0 0 8 c 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ = +STACK WIN 4 2bb93 14d 1e 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2bba1 136 10 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 2bba5 131 c 0 10 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 2bbb1 124 0 0 10 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 32dd3 40 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32dd9 36 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e793 fa e 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e79c ed 5 0 4 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1e79d eb 4 0 4 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1e7a1 e6 0 0 4 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1e9c5 fa e 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e9ce ed 5 0 4 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1e9cf eb 4 0 4 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1e9d3 e6 0 0 4 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 5b71c 107 10 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b72b f4 1 0 10 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b72c f1 0 0 10 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2dc81 13a 16 0 8 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2dc92 120 5 0 8 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 2dc96 11b 1 0 8 8 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 2dc97 119 0 0 8 c 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 2dc43 3de c 0 8 8 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3bde2 e 0 0 8 8 5c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 358ed 48 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 358f3 3e 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ea7d 155 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ea83 14b 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ecd2 12f 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ecd8 125 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ecea 112 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b828 24f b 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5b831 242 2 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 5b832 240 1 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 5b833 23e 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1f021 325 e 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f02a 318 5 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1f02b 316 4 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1f02f 311 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1c7f4 af c 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1c7fa a5 6 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1c800 9e 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e291 166 c 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3c06f 15 0 0 4 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f331 225 26 0 20 0 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f34c 201 b 0 20 4 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 f34d 1ff a 0 20 8 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 f357 1f4 0 0 20 c cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 32b56 f5 f 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32b5c eb 9 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 32b60 e6 5 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 32b65 e0 0 0 18 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 35d54 4b 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35f21 7d b 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35f27 73 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 35f28 71 4 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 35f2c 6c 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5ba7c 42 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f95d d2 d 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f963 c8 7 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 f969 c1 1 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 f96a bd 0 0 18 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1ee4c 4b 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1edbd 81 b 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1edc3 77 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1edc4 75 4 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1edc8 70 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5bac3 42 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32da7 1c 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5bb0a 1c 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5bb2b 164 37 0 14 0 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5bb62 124 0 0 14 4 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 292 - ^ = +STACK WIN 4 5bb76 10c 0 0 14 8 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 292 - ^ = +STACK WIN 4 5bb77 10a 0 0 14 c 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 292 - ^ = +STACK WIN 4 5bc95 185 2d 0 14 0 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5bcb5 15c d 0 14 4 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ = +STACK WIN 4 5bcc2 14e 0 0 14 8 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ = +STACK WIN 4 5bcef 11d 0 0 14 c 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ = +STACK WIN 4 5be23 13d 18 0 14 0 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5be3a 11d 1 0 14 4 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5be3b 11b 0 0 14 8 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5bf65 14f 18 0 14 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5bf7c 12f 1 0 14 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5bf7d 12d 0 0 14 8 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21495 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c0b9 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c0d7 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c0f5 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 213f8 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 332b1 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c110 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c12e 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 36434 83 2f 0 10 0 108 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32730 ce 2f 0 10 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3277e 67 0 0 10 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 364a9 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f89a 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21f1e 2b9 39 0 c 0 f4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21f3c 292 1b 0 c 4 f4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 252 - ^ = +STACK WIN 4 21f50 27d 7 0 c 8 f4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 252 - ^ = +STACK WIN 4 21f57 275 0 0 c c f4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 252 - ^ = +STACK WIN 4 5c149 100 c 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c223 1e 0 0 8 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c269 57 d 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c26f 4d 7 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5c275 46 1 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5c276 44 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 21d8d 5b9 f 0 c 8 98 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3c77a 2c 0 0 c 8 98 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c2c5 a2 11 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c2ce 95 8 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 5c2cf 93 7 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 5c2d6 8b 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 5c36c fb d 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c379 ea 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c3ce 93 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31385 8e 9 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3138e 81 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 126f2 30 6 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 126f8 26 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a71d 74 8 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 315c4 67 6 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 315ca 5d 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ac4d 37 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ac0f 3e 7 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ac16 33 0 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ef3a 1bb c 0 8 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f049 e 0 0 8 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 edd7 db c 0 4 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3c85e e 0 0 4 8 34 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c46c 3a 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c475 2d 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34bef ec 9 0 c 0 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34bf8 df 0 0 c 4 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34c1f ac 0 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32113 3a 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32119 30 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3162f 107 15 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31638 fa c 0 20 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 31639 f8 b 0 20 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 31644 ec 0 0 20 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 ee81 6d 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ee87 63 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ee88 5f 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34eb1 10a 12 0 8 0 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34ec2 f0 1 0 8 4 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ = +STACK WIN 4 34ec3 ee 0 0 8 8 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ = +STACK WIN 4 34eea c0 0 0 8 c 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ = +STACK WIN 4 ea7d 4d7 1d 0 18 0 2cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ea92 4b9 8 0 18 4 2cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 724 - ^ = +STACK WIN 4 ea99 4b1 1 0 18 8 2cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 724 - ^ = +STACK WIN 4 ea9a 4af 0 0 18 c 2cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 724 - ^ = +STACK WIN 4 5c4ab 62 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c4b3 56 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 137d9 139 18 0 8 0 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 137ea 11f 7 0 8 4 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 137f1 117 0 0 8 8 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 eee1 1a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c512 137 1c 0 18 0 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c523 11d b 0 18 4 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ = +STACK WIN 4 5c524 11b a 0 18 8 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ = +STACK WIN 4 5c52e 110 0 0 18 c 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ = +STACK WIN 4 180e 1cd c 0 14 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18ef e 0 0 14 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1921 4 0 0 14 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10d87 140 c 0 14 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3cac5 4 0 0 14 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32044 98 9 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3204d 8b 0 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3207f 4f 0 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10b8e 122 8 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10bae ef 0 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10baf ed 0 0 10 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21057 e3 9 0 14 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21060 d6 0 0 14 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10c6d 11d 22 0 8 0 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10c7e 103 11 0 8 4 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ = +STACK WIN 4 10c8f f1 0 0 8 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ = +STACK WIN 4 10c99 d6 0 0 8 c c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ = +STACK WIN 4 31c45 7c 8 0 10 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31cb8 88 8 0 10 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31cd2 10 0 0 10 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12641 6d 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32361 8a 8 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3237e 5f 0 0 14 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f569 aa 8 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f5ad 41 0 0 18 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 322fb 6f 8 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10a09 40 8 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c64e 96 c 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c6de b 0 0 c 8 34 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2bd84 33 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2bd8a 29 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2bcfb 9b 13 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2bd0d 85 1 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 2bd0e 83 0 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 5c701 9b 13 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c713 85 1 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 5c714 83 0 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 300da 29 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2de51 9c c 0 14 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2dda5 99 c 0 14 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c7a1 51 7 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c7f7 c8 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c82d 8d 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c82e 8b 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c8c4 20 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10e51 de 9 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10e5a d1 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 322bc 67 12 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 322ce 51 0 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10a77 3d 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bada c8 9 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bae3 bb 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bb47 3c 0 0 c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b896 86 7 0 18 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35971 44 8 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b974 50 d 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b97a 46 7 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b981 3e 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 938e 153 d 0 18 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 939a 143 1 0 18 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 939b 141 0 0 18 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 9402 1d 0 0 18 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 bb76 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bb82 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b905 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 945c 73 8 0 18 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9464 67 0 0 18 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 110f5 f3 e 0 c 0 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11102 e2 1 0 c 4 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11103 e0 0 0 c 8 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31f31 25a 9 0 4 0 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31f3a 11e 0 0 4 4 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ = +STACK WIN 4 31f73 d3 0 0 4 8 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ = +STACK WIN 4 31f7a cb 0 0 4 c 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ = +STACK WIN 4 5c8e9 61 11 0 34 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5c8ef 57 b 0 34 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5c8f3 52 7 0 34 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5c8fa 4a 0 0 34 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5c94f 258 17 0 10 8 1b8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5cbad 1 0 0 10 8 1b8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5cbc1 2a4 22 0 10 0 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5cbd2 28a 11 0 10 4 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ = +STACK WIN 4 5cbd6 285 d 0 10 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ = +STACK WIN 4 5cbe3 277 0 0 10 c c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ = +STACK WIN 4 5cf6b 163 c 0 20 8 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d0d4 1 0 0 20 8 40 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d0e9 267 f 0 c 8 d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d2ff 39 0 0 c 8 d8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d371 123 11 0 8 0 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d382 109 0 0 8 4 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d3bb cb 0 0 8 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 314d5 151 9 0 8 0 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 314de d0 0 0 8 4 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 108 - ^ = +STACK WIN 4 31513 89 0 0 8 8 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 108 - ^ = +STACK WIN 4 3151a 81 0 0 8 c 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 108 - ^ = +STACK WIN 4 b74c ba 9 0 4 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b755 ad 0 0 4 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b77c 79 0 0 4 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 137b1 23 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31eab 1d 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f72e 537 f 0 14 8 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f951 3c 0 0 14 8 ac 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d499 25 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12782 20 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1153c 22 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35eae 72 8 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35ee1 2d 0 0 14 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35ee2 2b 0 0 14 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21261 1a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3565b 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35e8f 1a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d4c3 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21950 36 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d4e3 33 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10978 109 c 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3d377 4 0 0 8 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d539 44d f 0 20 8 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d93e 4d 0 0 20 8 b0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 284bd 53 8 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 284c5 33 0 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d9a1 3a 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d9a7 30 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d9b9 14 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2879d 55 d 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 287aa 44 0 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5d9e0 4b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5da30 85 17 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5da4a 5c 0 0 0 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10760 424 8 0 1c 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10788 3c2 0 0 1c 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1078c 3bd 0 0 1c 8 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3719a 9f 10 0 20 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 371a5 7a 5 0 20 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 371a6 78 4 0 20 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 371aa 73 0 0 20 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 5dadd 73 8 0 8 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5db0a 42 0 0 8 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5db13 23 0 0 8 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5db55 bc a 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5db5d b0 2 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 5db5e ae 1 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 5db5f ac 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 5dc16 23e c 0 24 8 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5de3f 1a 0 0 24 8 60 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5de71 198 c 0 1c 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e00f 1 0 0 1c 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 285c6 2c4 c 0 38 8 8c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3d7a4 10 0 0 38 8 8c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1a24 34 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21982 446 17 0 c 8 114 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3d9cf 10 0 0 c 8 114 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e021 292 9 0 28 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e02a 266 0 0 28 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e089 1f5 0 0 28 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 27bdb 1c8d 17 0 38 8 6bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3e895 11 0 0 38 8 6bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3eadf ab 0 0 38 8 6bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 36c3c f7e 17 0 18 8 3fc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3f743 134 0 0 18 8 3fc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 27613 d49 17 0 24 8 3c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3ffbd 3e 0 0 24 8 3c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 27b32 6d c 0 18 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 27b99 1d 0 0 18 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2005f 89 c 0 18 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 200d1 1d 0 0 18 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e307 b8 a 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e310 ab 1 0 18 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 5e311 a9 0 0 18 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 5e34f 5f 0 0 18 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 286ee 57 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 286f6 4b 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f873 22 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e3c4 54 8 0 18 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e3cc 48 0 0 18 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e41d 8a 1a 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e433 6b 4 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 5e437 66 0 0 10 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 5e446 25 0 0 10 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 5e4ac 83 1a 0 10 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e4c2 64 4 0 10 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 5e4c6 5f 0 0 10 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 5e4d5 25 0 0 10 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 5e534 8e 10 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e53d 81 7 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e544 79 0 0 10 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e5c7 8e 10 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e5d0 81 7 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e5d7 79 0 0 10 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e65a 11 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 fd2d 17d c 0 8 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40019 e 0 0 8 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 123b9 319 c 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 401f7 e 0 0 c 8 34 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ff19 d2 c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40258 e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34cb9 8b c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 4029c e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 fe82 b1 c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 402de e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34da1 f6 c 0 4 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40327 e 0 0 4 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 36772 e9 c 0 4 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 403bd e 0 0 4 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 fc2f 11b c 0 4 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40414 e 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 4043c e 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e670 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5e686 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e6a0 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e6ba b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e6ca b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 310f2 1c6 e 0 4 0 18c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 310fe 1b6 2 0 4 4 18c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 404 - ^ = +STACK WIN 4 310ff 1b4 1 0 4 8 18c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 404 - ^ = +STACK WIN 4 31100 1b2 0 0 4 c 18c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 404 - ^ = +STACK WIN 4 9a72 7d c 0 14 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 404b7 e 0 0 14 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9b02 82 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9b18 5e 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9b1f 56 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1a5d 6e d 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1a63 64 7 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1a6a 5c 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b9a0 32 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b13f 33 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b148 26 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e6da 33 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e6e3 26 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 355bc 2b 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 355c2 21 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e712 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e740 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e76e 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e79c 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f992 16f c 0 4 0 184 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f99e 15f 0 0 4 4 184 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f9ac 141 0 0 4 8 184 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e7ca 34 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e803 28 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9a51 1c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9ae4 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ad0 1c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b9d1 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e18c aa 7 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e193 9f 0 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2bdb5 8b 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1d07e 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 365f6 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3594f 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 17443 11 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 934b d6 e 0 0 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9359 c6 0 0 0 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 177c7 96 0 0 0 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b5c3 409 19 0 c 0 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b5d7 3ec 5 0 c 4 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ = +STACK WIN 4 b5d8 3ea 4 0 c 8 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ = +STACK WIN 4 b5dc 3e5 0 0 c c 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ = +STACK WIN 4 5e830 4d 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e836 43 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 365a5 2e 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 353ce 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38ae7 3d 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34e64 18 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35406 36 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30d74 8b b 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30d7a 81 5 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 30d7e 7c 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 30d7f 7a 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 baa1 6c a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 baa7 62 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 baab 5d 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 be01 3e c 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 407a9 4 0 0 8 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10111 65 c 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 407c5 4 0 0 c 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34d41 5a c 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 407e1 4 0 0 8 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bdb6 3e c 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 407fd 4 0 0 4 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b9ef 6c c 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40817 4 0 0 c 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10f32 39 c 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40833 4 0 0 8 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9a09 3b c 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 4084f 4 0 0 4 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 325bc f6 c 0 4 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40892 e 0 0 4 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e882 11 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12bb6 69 1d 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12bd3 48 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10ef8 22 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e898 2c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e8c9 c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e8da c 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e8eb 57 9 0 c 0 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e8f4 4a 0 0 c 4 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e947 6f 6 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e94d 65 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e976 b 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e9bb 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 abc1 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5e9db c 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3611e c 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5e9ec 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ea06 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ea20 100 9 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ea29 f3 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ea9d 74 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39469 2b 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5eb25 2e 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5eb58 97 8 0 14 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5eba8 43 0 0 14 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2cdd8 5b 8 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ccdc 122 8 0 10 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2cd12 dd 0 0 10 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2cd13 db 0 0 10 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2cc8b 66 8 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2cc93 5a 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34932 a4 f 0 c 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3493b 97 6 0 c 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 34941 90 0 0 c 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 34976 5d 0 0 c c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 5ebf4 55 a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ebfd 48 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ebfe 46 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ec4e 1e 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34b69 1a 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ec71 3a 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 349d8 29d c 0 20 8 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40a26 16 0 0 20 8 64 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f7a0 191 c 0 1c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f7ac 181 0 0 1c 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 2f7b9 12c 0 0 1c 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 2f7ca 118 0 0 1c c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 34b8f 25 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 abde 58 d 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 abe4 4e 7 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 abeb 46 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 c170 29 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11296 24 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1129c 1a 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ecb0 91 8 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ecfc 41 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ed46 8c 8 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ed8d 41 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5edd7 6a 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5eddd 60 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5edde 5e 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5ee15 1d 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 e477 a3 c 0 4 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40b63 e 0 0 4 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1fcff 64 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e4b9 26a 17 0 10 8 46c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40c62 17 0 0 10 8 46c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 111da 31 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae65 4a c 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ae6b 21 6 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ae71 1a 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1fb26 52 14 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ee46 98 16 0 10 0 120 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9f81 31 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5eee3 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5eef0 3b 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 14c3c 1d2 1f 0 c 0 238 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 14c50 1b5 b 0 c 4 238 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 576 - ^ = +STACK WIN 4 14c5a 1aa 1 0 c 8 238 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 576 - ^ = +STACK WIN 4 14c5b 1a8 0 0 c c 238 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 576 - ^ = +STACK WIN 4 1af1 1fe c 0 c 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1c8c e 0 0 c 8 44 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ef47 9a e 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ef53 8a 2 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 5ef54 88 1 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 5ef55 86 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 b3d5 146 c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40cf3 e 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40d2a e 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b4cf cc 9 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b4d8 bf 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b503 86 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e43d 34 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5efe6 51 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5efec 47 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1fcc1 39 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1fcc7 2f 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ada0 76 9 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ada8 6a 1 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 ada9 68 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 12ade 106 1a 0 4 0 130 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12aef 27 9 0 4 4 130 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12af8 1d 0 0 4 8 130 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 be89 b2 c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40d78 e 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35f78 b6 c 0 10 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40da4 e 0 0 10 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9fb5 5f c 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40dd0 e 0 0 8 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bc69 5f c 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40e00 e 0 0 8 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f03c 1ce c 0 c 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f1bf e 0 0 c 8 50 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f229 203 c 0 10 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f3e0 e 0 0 10 8 54 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e000 136 c 0 14 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40e66 e 0 0 14 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ac88 b6 c 0 10 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40e92 e 0 0 10 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f449 1cb c 0 c 8 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f5c9 e 0 0 c 8 4c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f631 130 c 0 14 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f72a e 0 0 14 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ae4b 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1d4f 23 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b6a1 31 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1d77 9a b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1d81 8c 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1d82 8a 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1dcf 3c 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 3145b 88 d 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31463 7c 5 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 31464 7a 4 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 31468 75 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 1269f 52 8 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 126a7 46 0 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f781 db c 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f78d cb 0 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f7e8 64 0 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 313ec d5 e 0 10 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 313fa c3 0 0 10 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31439 78 0 0 10 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f88a 80 8 0 14 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f90f 13f c 0 18 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5f9fa 4 0 0 18 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fa2d 1e 0 0 18 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 312e5 119 c 0 1c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40faa 4 0 0 1c 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 40fe6 4 0 0 1c 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c664 30b 8 0 8 0 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c686 2db 0 0 8 4 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c6b1 2ad 0 0 8 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f0d4 295 12 0 20 0 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f0e0 285 6 0 20 4 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 100 - ^ = +STACK WIN 4 2f0e5 27f 1 0 20 8 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 100 - ^ = +STACK WIN 4 2f0e6 27d 0 0 20 c 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 100 - ^ = +STACK WIN 4 5fa85 f5 11 0 1c 0 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fa8e e8 8 0 1c 4 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ = +STACK WIN 4 5fa8f e6 7 0 1c 8 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ = +STACK WIN 4 5fa96 de 0 0 1c c 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ = +STACK WIN 4 5fb7f a1 c 0 1c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fc02 9 0 0 1c 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fc39 36 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fc51 1a 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fc74 72 8 0 20 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fc7c 66 0 0 20 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fceb de b 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fcf4 d1 2 0 1c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 5fcf5 cf 1 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 5fcf6 cd 0 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 5fdce 6e 8 0 1c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fdd6 62 0 0 1c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fe41 46 8 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fe8c 88 b 0 8 0 8c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5fed6 2f 0 0 8 4 8c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ff19 60 b 0 8 0 8c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ff7e 41 9 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ff87 25 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ffc4 41 9 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 5ffcd 25 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6000a 60 b 0 8 0 8c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6006f 5e 9 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6007b 4e 0 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6008a 3d 0 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 600d2 2f8 c 0 10 0 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 600db 2eb 3 0 10 4 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 600de 2e7 0 0 10 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 6013a 28a 0 0 10 c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 f182 110 1b 0 8 0 654 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f193 f6 a 0 8 4 654 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f19d eb 0 0 8 8 654 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31db9 55 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31ddd 2a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ad29 4d 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ad46 2a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ad7b 24 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b2d0 3aa 18 0 4 0 480 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b2e1 37f 7 0 4 4 480 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1160 - ^ = +STACK WIN 4 b2e7 378 1 0 4 8 480 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1160 - ^ = +STACK WIN 4 b2e8 376 0 0 4 c 480 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1160 - ^ = +STACK WIN 4 112d5 1d5 c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11419 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 359b7 29d 26 0 10 0 ec 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 359cf 27c e 0 10 4 ec 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 244 - ^ = +STACK WIN 4 359dc 26e 1 0 10 8 ec 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 244 - ^ = +STACK WIN 4 359dd 26c 0 0 10 c ec 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 244 - ^ = +STACK WIN 4 301af 196 c 0 14 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 301bb 186 0 0 14 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 301e5 152 0 0 14 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 12803 1c9 c 0 10 0 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1280f 1b9 0 0 10 4 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ = +STACK WIN 4 12839 185 0 0 10 8 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ = +STACK WIN 4 1283d 180 0 0 10 c 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ = +STACK WIN 4 f9e5 37d c 0 20 8 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 4171b 4 0 0 20 8 6c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 41748 48 0 0 20 8 6c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c2d3 8f e 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c2dc 7a 5 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 2c2dd 78 4 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 2c2e1 73 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 603cf bc 1c 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 603e3 91 8 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 603ea 89 1 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 603eb 87 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 60499 35e 17 0 8 8 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 607cb 30 0 0 8 8 274 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60811 e9 1c 0 14 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60822 cf b 0 14 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 60826 ca 7 0 14 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 6082d c2 0 0 14 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 14eea 6e 8 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 212f1 6e 8 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21363 24 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 214e3 2b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 217ea 213 a 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 217f3 206 1 0 18 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 217f4 204 0 0 18 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30789 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 608ff e9 9 0 10 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60908 dc 0 0 10 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 302ed 36 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3039b 33 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21ba5 1d5 c 0 20 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 418d1 3f 0 0 20 8 54 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 609ed 5f 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60a02 46 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60a51 55 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35dca 172 11 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35dd6 162 5 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 35ddb 15c 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 35e0c 11d 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 a427 40 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fa46 42 8 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fa4e 36 0 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e0c7 19e 31 0 10 0 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e0df 17d 19 0 10 4 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ = +STACK WIN 4 1e0e9 172 f 0 10 8 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ = +STACK WIN 4 1e0f8 162 0 0 10 c 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ = +STACK WIN 4 35340 bd f 0 4 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3534e a6 1 0 4 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 3534f a4 0 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 35370 e 0 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 60aab 44 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 392b5 27 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60af4 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60b1c 3f 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60b60 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 60b6f 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60b97 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60bbf f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2f3a4 86 8 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f3aa 7c 2 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2f3ab 7a 1 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2f3ac 78 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1a1cf 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1500c 90 e 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1501a 7b 0 0 0 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ac85 28 0 0 0 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1930f 29e 1a 0 1c 0 248 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 19376 228 0 0 1c 4 248 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 19377 226 0 0 1c 8 248 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16f8e 11 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2dfa0 41 6 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60bd3 95 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60bd9 8b 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60bda 87 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 309e1 5f 12 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 309f3 3a 0 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1cd34 82 17 0 4 8 e0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 41b32 7 0 0 4 8 e0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e16 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ae17 4a 9 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ae20 3d 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e50 97 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1eee 2bc c 0 4 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21af 7 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12f1d 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 16f83 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1df77 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12f08 10 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1cf5b b6 9 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1cf64 ab 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 14af2 1d1 9 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 14afb 1c4 0 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 14b23 192 0 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 14b42 177 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 33478 b4 10 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33481 a7 7 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33488 9f 0 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f0f4 a5 11 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f105 90 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 f132 59 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 101be 59 9 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 101c7 4c 0 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 329d9 159 15 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 329e2 14c c 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 329e3 14a b 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 329ee 13e 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 305f6 6d 9 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 305ff 48 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9920 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 60c75 30 8 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21cc 3c 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 220f 10c 16 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 221a fd b 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 221e f8 7 0 14 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2225 f0 0 0 14 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 60caa 49 8 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60cf8 49 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60d00 3d 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60d46 e 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ae2a 1c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60d58 aa 9 0 10 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60d61 9d 0 0 10 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60dbf 29 0 0 10 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60e13 61 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9e01 6f c 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 41c56 4 0 0 8 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3593f b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9e79 73 c 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 41c70 4 0 0 8 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bf9d b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bccf 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32259 57 c 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 41c8a 4 0 0 8 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a5dc 5d c 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 41ca4 4 0 0 8 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c8ed 62 13 0 8 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60e79 6a 15 0 8 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60e8a 50 4 0 8 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60e8e 4b 0 0 8 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60ee8 35 6 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60f22 141 19 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 60f36 129 5 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 60f37 127 4 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 60f3b 122 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 352d9 68 8 0 14 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21765 48 8 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61068 43 9 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61071 36 0 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 303d0 72 f 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 303de 60 1 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 303df 5c 0 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 303e9 30 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 12c23 13f c 0 4 8 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 41dcc 10 0 0 4 8 60 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 610b0 2b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 610e0 36 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6111b 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61155 2c 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61186 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 611c0 45 8 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6120a 12b 9 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61212 11f 1 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61213 11d 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 15199 40 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1519f 36 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 194dd 314 b 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 194e6 307 2 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 194e7 305 1 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 194e8 303 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 19805 8b9 26 0 18 0 1d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1981c 899 f 0 18 4 1d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 480 - ^ = +STACK WIN 4 1981d 897 e 0 18 8 1d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 480 - ^ = +STACK WIN 4 1982b 888 0 0 18 c 1d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 480 - ^ = +STACK WIN 4 19513 218e 17 0 30 8 a18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 43025 4 0 0 30 8 a18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1e017 2eb 0 0 30 8 a18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2332 30 5 0 28 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12cb0 e7 a 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12cb6 dd 4 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12cba d8 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12d56 44 9 0 4 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12d5f 37 0 0 4 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 37945 44 9 0 4 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3794e 37 0 0 4 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c338 91 c 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c341 84 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2c344 80 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2c373 33 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 61351 17 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ddd6 33f f 0 30 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 43374 14 0 0 30 8 a8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 434b2 17 0 0 30 8 a8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 434e5 60 0 0 30 8 a8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2367 30 5 0 28 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6136d ec b 0 8 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61376 df 2 0 8 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ = +STACK WIN 4 61377 dd 1 0 8 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ = +STACK WIN 4 61378 db 0 0 8 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ = +STACK WIN 4 6147e 2fa f 0 8 8 b4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61723 e 0 0 8 8 b4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3965a 77 c 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39666 67 0 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 395d8 57 c 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 395e4 47 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c1e7 127 c 0 c 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 435d2 e 0 0 c 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12f89 ac 9 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12f92 9f 0 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 12fa9 7d 0 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 12faa 7b 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 132ee 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 61799 148 c 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 617fd e 0 0 c 8 34 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 92ea 6d c 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 92f0 63 6 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 92f6 5c 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2470 32 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16fb4 4f c 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 436ca 11 0 0 4 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61901 2d 6 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e0df 33 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e0e5 29 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 176db 28 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61933 24 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6195c 24 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30445 1c1 e 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30450 1b2 3 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 30453 1ae 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 3047d 17d 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 3053e 73 10 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30544 69 a 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 30545 67 9 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 3054e 5d 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 e275 3c7 c 0 c 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 437f5 10 0 0 c 8 54 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 438be 4a 0 0 c 8 54 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 df9e f2 13 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 dfac db 5 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 dfb0 d6 1 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 dfb1 d4 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 31d8e f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e074 67 8 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e07c 5b 0 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 114f8 5c 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1a2ce 6aa 17 0 34 8 2d0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1a834 36 0 0 34 8 2d0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9ef1 1d 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b829 28 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b82f 1e 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 13140 b3 9 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 13149 a6 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c05e 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10086 a7 f 0 10 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1008f 9a 6 0 10 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10095 93 0 0 10 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e30f b3 9 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e318 a6 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bfad 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e8b7 a4 f 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e8c0 97 6 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e8c6 90 0 0 c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e995 b3 9 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e99e a6 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 24a7 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2540 e6 c 0 c 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2610 b 0 0 c 8 44 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 36696 e9 c 0 10 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 36759 b 0 0 10 8 44 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 952a 188 c 0 14 8 74 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 951a b 0 0 14 8 74 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 239c 98 c 0 8 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2432 b 0 0 8 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fb52 72 8 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61985 72 8 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 619fc 6b c 0 c 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61a61 b 0 0 c 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 95f9 93 f 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9600 88 8 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 9604 83 4 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 9608 7e 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 2cc09 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a6a9 ae b 0 10 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a6b2 a1 2 0 10 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 a6b3 9f 1 0 10 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 a6b4 9d 0 0 10 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 1320c 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 13218 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12e1d 6d 8 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12e25 61 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ca47 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ca53 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e93f 6a 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 e947 5e 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ea1b 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ea27 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a05d 1c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2442 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61a81 6a 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61a89 5e 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61af0 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61afc 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 308ad 6d 8 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 308b5 61 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33609 19f 16 0 1c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33614 190 b 0 1c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 33615 18e a 0 1c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 3361f 183 0 0 1c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 61b64 39 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61b6a 2f 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1746c 23 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 17499 ef 15 0 0 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 174a6 e0 8 0 0 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 174a7 de 7 0 0 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 174ae d6 0 0 0 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 f1fa 76 18 0 0 0 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17459 10e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 43ee5 e5 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1efce 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 61ba2 162 11 0 4 0 d4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61bb3 148 0 0 4 4 d4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 220 - ^ = +STACK WIN 4 61bec 107 0 0 4 8 d4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 220 - ^ = +STACK WIN 4 61bed 103 0 0 4 c d4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 220 - ^ = +STACK WIN 4 61d3f 2b9 1f 0 c 0 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 61d53 29c b 0 c 4 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 628 - ^ = +STACK WIN 4 61d5e 290 0 0 c 8 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 628 - ^ = +STACK WIN 4 61dee 1c7 0 0 c c 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 628 - ^ = +STACK WIN 4 61ffd 408 1a 0 c 0 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62017 3e5 0 0 c 4 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 620a4 353 0 0 c 8 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6240a 64 9 0 8 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62413 3d 0 0 8 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62473 42 8 0 4 0 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 624ba 2be 27 0 c 0 22c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 624d1 29e 10 0 c 4 22c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 564 - ^ = +STACK WIN 4 624d4 29a d 0 c 8 22c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 564 - ^ = +STACK WIN 4 624e1 28c 0 0 c c 22c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 564 - ^ = +STACK WIN 4 17f41 141 13 0 8 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17f52 127 2 0 8 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 17f53 125 1 0 8 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 17f54 123 0 0 8 c 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 6277d 59 b 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62788 4a 0 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 627db 19f b 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 627e4 192 2 0 1c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 627e5 190 1 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 627e6 18e 0 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 6297f 59 b 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6298a 4a 0 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ebb1 4ac 21 0 4 0 2c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ebc2 492 10 0 4 4 2c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 720 - ^ = +STACK WIN 4 1ebc3 490 f 0 4 8 2c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 720 - ^ = +STACK WIN 4 1ebd2 480 0 0 4 c 2c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 720 - ^ = +STACK WIN 4 629dd 4e 9 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 629e6 41 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 629f4 30 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 629f5 2e 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 12980 8e c 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 129f9 b 0 0 c 8 34 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fc00 5f 12 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fc12 3a 0 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 c108 4b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a793 44 8 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62a30 36 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62a6b 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 c058 9f c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 44733 c 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ce03 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21435 38 8 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9728 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 3970d 26 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62aa5 26 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39732 28 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 328f7 28 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12a09 58 16 0 10 0 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12a1f 3e 0 0 10 4 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12a4b 6 0 0 10 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62ad0 7a 9 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62ad9 6d 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62af6 4b 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 4479d a2 15 0 4 0 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 447ae 88 4 0 4 4 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 447b2 81 0 0 4 8 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62b4f a8 c 0 4 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62be6 4 0 0 4 8 54 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62c19 7e e 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62c25 69 2 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 62c26 67 1 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 62c27 65 0 0 4 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 12d9f 10b c 0 0 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 448d9 a 0 0 0 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9740 4f 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9bc5 a7 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9bcb 9d 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9bcc 9b 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 136d7 cc c 0 4 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 13771 7 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62c9c 68 8 0 14 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62d09 3a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fa7a 53 9 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fa83 46 0 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c0e6 6f c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c151 14 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c082 71 c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c08e 1e 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62d48 2f 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62d4e 25 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ffcf b8 8 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ffe2 97 0 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fe84 73 7 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fe8b 68 0 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ff16 6f 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fed7 40 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 32992 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 211cd 86 7 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 211d3 6d 1 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 211d4 6b 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b086 82 7 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b08d 68 0 0 14 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2bff8 39 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30062 42 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30a62 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c02c 28 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2cba2 8e a 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2cbaa 6e 2 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2cbab 6c 1 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2cbac 6a 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2bfd6 23 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2117d 56 9 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21186 49 0 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12723 43 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 21130 4d 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62d7c 42 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b26e 57 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62dc3 28 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62df0 3f 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62e34 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10637 22 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 c1e0 e 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 62e62 97d 17 0 4 8 684 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63421 4 0 0 4 8 684 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6362b 4 0 0 4 8 684 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 636d3 4 0 0 4 8 684 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ffaf 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63999 a9 b 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 639a2 9c 2 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 639a3 9a 1 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 639a4 98 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 63a47 92 a 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63a50 85 1 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63a51 83 0 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63ade 115 c 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63ae5 10a 5 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 63ae6 108 4 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 63aea 103 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 63bf8 127 d 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63bfe 11d 7 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 63bff 11b 6 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 63c05 114 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 63d24 3b 6 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63d2a 31 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63d3d 1d 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63d64 b4 b 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63d6d a7 2 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 63d6e a5 1 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 63d6f a3 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 63e1d cd 11 0 8 0 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63e2e b3 0 0 8 4 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63eef 9c a 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63ef8 8f 1 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63ef9 8d 0 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63f90 cd 11 0 8 0 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 63fa1 b3 0 0 8 4 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64062 af b 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6406b a2 2 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 6406c a0 1 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 6406d 9e 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 64116 94 a 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6411f 87 1 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64120 85 0 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 641af b4 b 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 641b8 a7 2 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 641b9 a5 1 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 641ba a3 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 64268 df 15 0 8 0 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64279 c5 4 0 8 4 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6427d c0 0 0 8 8 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6434c 9c a 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64355 8f 1 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64356 8d 0 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 643ed d6 15 0 8 0 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 643fe bc 4 0 8 4 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64402 b7 0 0 8 8 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 644c8 195 c 0 14 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6452a e 0 0 14 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64679 19e e 0 18 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64685 18e 2 0 18 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ = +STACK WIN 4 64686 18c 1 0 18 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ = +STACK WIN 4 64687 18a 0 0 18 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ = +STACK WIN 4 6481c 37 8 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64858 2c5 9 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64861 2b8 0 0 18 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6489e 24c 0 0 18 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64b47 83 9 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64b50 76 0 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64bcf a8 20 0 8 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64be7 87 8 0 8 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 64beb 82 4 0 8 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 64bef 7d 0 0 8 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 64c7c 112 17 0 8 0 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64c93 f2 0 0 8 4 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64cf5 8c 0 0 8 8 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64d93 6b d 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64da0 5a 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64dc2 37 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64e03 22 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64e2a 156 11 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64e38 13f 3 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64e3b 13b 0 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64f85 c9 7 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 64f8b bf 1 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 64f8c bd 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 64fba 8e 0 0 14 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 65053 bc 11 0 c 0 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65064 a2 0 0 c 4 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ = +STACK WIN 4 6508f 73 0 0 c 8 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ = +STACK WIN 4 65090 71 0 0 c c 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ = +STACK WIN 4 65114 92 17 0 c 0 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6512b 72 0 0 c 4 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 651ab 86 b 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 651b6 77 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 651f5 32 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65236 209 13 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65248 1f3 1 0 c 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 65249 1f1 0 0 c 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 652a3 9b 0 0 c c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 65444 72 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6544a 68 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6547f 32 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 654bb 72 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 654c1 68 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 654f6 32 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65532 45 10 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6553b 38 7 0 18 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65542 2e 0 0 18 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6557c 146 a 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65585 139 1 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 65586 137 0 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 655ad 10f 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 656c7 c2 d 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 656d3 b2 1 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 656d4 b0 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6578e f7 11 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65799 c4 6 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 6579e be 1 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 6579f bc 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 6588a 84 9 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65892 78 1 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 65893 76 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 658aa 5e 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 65913 84 9 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6591b 78 1 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 6591c 76 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 65933 5e 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 6599c b3 15 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 659a5 a6 c 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 659b0 9a 1 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 659b1 98 0 0 8 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 65a54 2a9 d 0 8 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65a5d 29c 4 0 8 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65a61 297 0 0 8 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 22128 9e a 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 22131 91 1 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 22132 8f 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65d02 85 9 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65d0a 79 1 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 65d0b 77 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 65d22 5f 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 65d8c 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65da4 9a 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65dac 8e 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65dc4 74 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65e43 303 b 0 8 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 65e4c 2ec 2 0 8 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ = +STACK WIN 4 65e4d 2ea 1 0 8 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ = +STACK WIN 4 65e4e 2e8 0 0 8 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ = +STACK WIN 4 6614b a6 f 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66159 94 1 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 6615a 92 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 6618c 5f 0 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 661f6 85 9 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 661fe 79 1 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 661ff 77 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 66216 5f 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 66280 d4 10 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6628b c5 5 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66290 bf 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66359 6a 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6636c 53 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66370 4e 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 663c8 2ec f 0 8 8 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6665c 1c 0 0 8 8 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66682 b 0 0 8 8 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6677d ba c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66801 3b 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66871 bc c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66918 1a 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66949 ba c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 669cd 3b 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66a41 bc c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66ae8 1a 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66b19 ba c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66b9d 3b 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66c11 c3 c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66cbf 1a 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66cf1 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66d09 19d b 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66d12 190 2 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 66d13 18e 1 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 66d14 18c 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 66eab 93 a 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 66eb3 87 2 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 66eb4 85 1 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 66eb5 83 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 66f43 71c 17 0 4 8 ec 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67093 11 0 0 4 8 ec 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 675f4 11 0 0 4 8 ec 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67695 7a 13 0 8 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67714 114 17 0 8 8 e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 677e9 11 0 0 8 8 e4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67849 145 17 0 8 8 e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67941 11 0 0 8 8 e4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f609 58 13 0 4 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 679a9 53 13 0 4 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67a01 44 7 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67a4a df 16 0 10 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67a5b c5 5 0 10 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 67a5c c3 4 0 10 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 67a60 be 0 0 10 c c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 28b87 ad 21 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 28b95 9b 13 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 28ba8 87 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ae5e 85 15 0 8 0 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ae6f 6b 4 0 8 4 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ae73 66 0 0 8 8 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67b2e 3d 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67b70 57 c 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67b77 4c 5 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 67b7b 47 1 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 67b7c 45 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1143f 60 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11445 56 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f5a6 197 11 0 8 0 128 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f5b7 179 0 0 8 4 128 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f5ca 15f 0 0 8 8 128 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 132f9 54 c 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 13304 45 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 13305 43 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67bcc 231 f 0 8 8 9c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67dd6 2c 0 0 8 8 9c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67e19 17 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67e35 17e c 0 14 0 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67e3e 171 3 0 14 4 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 67e41 16d 0 0 14 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1146a 90 a 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11470 86 4 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11474 81 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6802b 8e 9 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68034 81 0 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f26e 432 17 0 c 8 2b4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1f571 50 0 0 c 8 2b4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 680be 42e c 0 c 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68496 4a 0 0 c 8 50 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 13353 406 17 0 c 8 2ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1366c 45 0 0 c 8 2ac 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 28c38 1099 17 0 24 8 2e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 29b93 127 0 0 24 8 2e4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68509 78 6 0 24 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6850f 6c 0 0 24 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68538 3b 0 0 24 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35bb0 1fe 17 0 c 8 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 44db3 55 0 0 c 8 254 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68586 1fe 17 0 c 8 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68734 55 0 0 c 8 254 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 687a1 2ab 1c 0 14 0 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 687bd 286 0 0 14 4 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 288 - ^ = +STACK WIN 4 68828 217 0 0 14 8 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 288 - ^ = +STACK WIN 4 68867 1d7 0 0 14 c 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 288 - ^ = +STACK WIN 4 2cf9b 28d f 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2cfa8 27c 2 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 2cfa9 27a 1 0 c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 2cfaa 278 0 0 c c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 2cf60 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68abf 2ed 11 0 10 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68ac8 2e0 8 0 10 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 68acf 2d8 1 0 10 8 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 68ad0 2d6 0 0 10 c 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 68db1 10d 9 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68dba 100 0 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68e39 80 0 0 c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68f11 148 8 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68f3e 115 0 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 68f75 dd 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6905d 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 357d5 b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2080d 5f7 11 0 c 0 24c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2081e 5dd 0 0 c 4 24c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2083d 5b0 0 0 c 8 24c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31b99 1f2 7 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31ba0 1e7 0 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 31bcf 1ac 0 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 31bd0 1aa 0 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 20799 e2 e 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 207a1 d6 6 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 207a7 cf 0 0 10 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 207d8 7d 0 0 10 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 1fb88 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6907b 199 9 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69084 18c 0 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 690b9 156 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 690ba 154 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 69218 17a 9 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69221 16d 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 692b0 da 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69395 3de 16 0 8 0 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 693a6 3c4 5 0 8 4 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 568 - ^ = +STACK WIN 4 693aa 3bf 1 0 8 8 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 568 - ^ = +STACK WIN 4 693ab 3bd 0 0 8 c 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 568 - ^ = +STACK WIN 4 69778 1b3 9 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69781 1a6 0 0 4 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 697b6 170 0 0 4 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 697b7 16e 0 0 4 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 69930 2ca 9 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69939 2bd 0 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69983 271 0 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e61c 39d a 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e625 390 1 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 2e626 38e 0 0 c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 2e63e 372 0 0 c c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 20d14 3ab b 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 20d1d 39e 2 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 20d1e 39c 1 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 20d1f 39a 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 2d2af 13d 9 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2d2b8 130 0 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 2d2de 106 0 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 2d2df 104 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 69bff fd c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69ce0 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69d19 111 c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69e0e 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69e49 fd c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69f2a 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 69f61 10f c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a054 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a091 48 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a099 3c 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a0de 1d 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e8b2 10f c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 453fe 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a100 13c c 0 10 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a220 21 0 0 10 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a259 fc c 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a339 21 0 0 8 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a371 172 a 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a37a 167 1 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 6a37b 165 0 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 6a4e8 11 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6a4fe c7 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6a5ca 3e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6a60d a4 10 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a613 9a a 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6a614 98 9 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6a61b 90 2 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6a6b6 d0 10 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a6bc c6 a 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6a6bd c4 9 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6a6c4 bc 2 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6a78b 66 8 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a7b8 33 0 0 18 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a7fb 60c e 0 8 0 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6a807 5fc 2 0 8 4 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 6a808 5fa 1 0 8 8 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 6a809 5f8 0 0 8 c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 6aebf 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6aeed 2d 8 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6af1f 55 8 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6af53 1d 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6af79 52 8 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6afad 1a 0 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6afd0 71 9 0 18 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6afd8 65 1 0 18 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 6afd9 63 0 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 6aff2 49 0 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 6b046 41 8 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b08c 57 8 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b0e8 2e 7 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b11b 2e 7 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b14e 35 8 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b188 35 8 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b1c2 57 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b21e 3c 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b25f 1c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2cb03 69 8 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b280 72 8 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e44a 28 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2e450 1e 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b2f7 28 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b2fd 1e 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2afc9 cc e 0 14 0 70 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2afd6 bb 1 0 14 4 70 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2afd7 b9 0 0 14 8 70 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ca9f 111 f 0 10 0 78 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2caac 100 2 0 10 4 78 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 2caad fe 1 0 10 8 78 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 2caae fc 0 0 10 c 78 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 6b324 35 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b35e 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b38c 67 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b394 5b 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b3f8 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b404 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b46c 19d c 0 c 8 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b5b5 48 0 0 c 8 5c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b629 55 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b631 49 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b683 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2146c c 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6b694 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1301e 22 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b6a3 53 6 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b6a9 49 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17190 c4 13 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1719f b1 4 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 171a2 ad 1 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 171a3 a9 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 2bf01 c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1305f c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b6fb 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a644 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a675 38 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 300a9 33 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 300af 29 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 967c 12f c 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9684 123 4 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9688 11e 0 0 10 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b723 39 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b729 2f 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 130a6 42 e 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 130ac 38 8 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 130b4 2f 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 15350 124 16 0 14 0 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1535e 10d 8 0 14 4 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 15362 108 4 0 14 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 15366 103 0 0 14 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 6b761 3f 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b76a 32 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1530d 47 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 19aaa 33 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1a9d9 3a 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 15229 170 e 0 10 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 15232 163 5 0 10 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 15233 15f 4 0 10 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 15237 15a 0 0 10 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 162db ef b 0 1c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 162e2 e4 4 0 1c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 162e6 df 0 0 1c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1529b af 8 0 3c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 152a1 a5 2 0 3c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 152a2 a3 1 0 3c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 152a3 a1 0 0 3c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1a86f 227 21 0 28 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1a878 21a 18 0 28 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1a879 216 17 0 28 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1a890 1fe 0 0 28 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 15921 ab5 45 0 c 0 3dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 15958 a75 e 0 c 4 3dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 996 - ^ = +STACK WIN 4 15965 a67 1 0 c 8 3dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 996 - ^ = +STACK WIN 4 15966 a65 0 0 c c 3dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 996 - ^ = +STACK WIN 4 1545c 910 17 0 4 8 2e0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 45f23 e 0 0 4 8 2e0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11210 83 9 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11219 76 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1123b 57 0 0 c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b7a5 32f 1d 0 4 0 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6b7bd 2c9 5 0 4 4 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ = +STACK WIN 4 6b7be 2c7 4 0 4 8 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ = +STACK WIN 4 6b7c2 2c2 0 0 4 c 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ = +STACK WIN 4 2fe16 84 3e 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fe54 1f 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30e9a a7 9 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30ea1 9c 2 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 30ea2 9a 1 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 30ea3 98 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 2fd92 73 9 0 14 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fd9b 66 0 0 14 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fdb4 2a 0 0 14 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bb0f 51 9 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bb17 45 1 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bb18 43 0 0 14 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fd4c 41 8 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2fd54 35 0 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30f21 73 9 0 14 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30f2a 66 0 0 14 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30f43 2a 0 0 14 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38653 18e 2e 0 14 0 e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38667 171 1a 0 14 4 e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 236 - ^ = +STACK WIN 4 3866b 16c 16 0 14 8 e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 236 - ^ = +STACK WIN 4 38681 155 0 0 14 c e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 236 - ^ = +STACK WIN 4 3835a 3f 6 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1612f 113 1f 0 4 0 d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16147 f2 7 0 4 4 d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1614e e8 0 0 4 8 d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bb65 38 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bba2 28 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bbcf 6b 8 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bbd7 5f 0 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bc0c 29 0 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16763 87 16 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16772 74 7 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 16778 6d 1 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 16779 6b 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 16602 5b 13 0 4 0 20c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16613 41 2 0 4 4 20c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 532 - ^ = +STACK WIN 4 16614 3d 1 0 4 8 20c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 532 - ^ = +STACK WIN 4 16615 3b 0 0 4 c 20c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 532 - ^ = +STACK WIN 4 1aa2c ff 13 0 0 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1aa3d e7 2 0 0 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 1aa3e e4 1 0 0 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 1aa3f e0 0 0 0 c 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 169ea 5c 9 0 c 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 169f3 4f 0 0 c 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1691d 5c 8 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b335 67 e 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b33e 5a 5 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2b33f 57 4 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2b343 50 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 16473 5f 10 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16479 47 a 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1647a 45 9 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 16483 3b 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1697f 66 7 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16996 47 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1699b 39 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c59b 87 c 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2c5a6 78 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2c5a7 76 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2c5be 5a 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2f70b 90 6 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f711 86 0 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f737 5f 0 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f695 bd 8 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f6ca 81 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f6ce 7b 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1642c 42 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1643c 2d 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16440 28 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 168bb 52 11 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 168c3 46 9 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 168c4 44 8 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 168cc 3b 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 16396 91 a 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1639f 5c 1 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 163a0 5a 0 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 163bf 3a 0 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 165e9 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 16b75 415 21 0 4 0 4a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16b8c 3f5 a 0 4 4 4a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1200 - ^ = +STACK WIN 4 16b95 3eb 1 0 4 8 4a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1200 - ^ = +STACK WIN 4 16b96 3e9 0 0 4 c 4a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1200 - ^ = +STACK WIN 4 164cd c4 c 0 0 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 46631 e 0 0 0 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b553 b8 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b55b ac 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2b57d 86 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2b57e 82 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 16662 f2 b 0 14 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1666b e5 2 0 14 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 1666c e3 1 0 14 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 1666d e1 0 0 14 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 16879 b7 f 0 10 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16884 a8 4 0 10 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 16888 a3 0 0 10 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 16a5c 79 0 0 10 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 16562 8d c 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 46678 4 0 0 8 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 167d7 9a c 0 10 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 466a9 4 0 0 10 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 15120 a1 c 0 c 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 466d4 4 0 0 c 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bc3f 63 c 0 0 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bc8a 4 0 0 0 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bcc1 a9 8 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bcc9 9f 0 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bcf0 77 0 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b38d 214 e 0 0 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b39b 1ff 0 0 0 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 2b3dd 1b6 0 0 0 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 2b3de 1b4 0 0 0 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 6be06 7f 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6be09 7b 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6be41 42 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6be8a 33 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1204d 44 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12061 1c 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bec2 70 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bec8 66 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bec9 64 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bf37 105 b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6bf3d fb 5 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6bf3e f9 4 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6bf42 f4 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6c041 167 10 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c04f 155 2 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 6c050 153 1 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 6c051 151 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 6c1ad 165 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c1c9 df 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c1cd da 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c317 f8 6 0 24 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c31d ee 0 0 24 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6c34d bd 0 0 24 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6c351 b6 0 0 24 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 6c414 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c42e 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c449 22 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c470 22 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c497 9a c 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c4a2 83 1 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 6c4a3 81 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 6c4d1 52 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 6c536 22 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c55d 30 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c592 50 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c598 42 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c599 40 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c5e7 3e 1a 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c601 20 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c62a 17b 15 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c639 168 6 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 6c63e 162 1 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 6c63f 15e 0 0 14 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 6c7a6 177 d 0 28 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c7ad 16c 6 0 28 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c7b3 165 0 0 28 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c922 177 d 0 28 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c929 16c 6 0 28 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6c92f 165 0 0 28 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6ca9e 195 10 0 18 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6caa7 188 7 0 18 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ = +STACK WIN 4 6caae 180 0 0 18 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ = +STACK WIN 4 6cabd 170 0 0 18 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ = +STACK WIN 4 6cc38 198 10 0 18 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6cc41 18b 7 0 18 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ = +STACK WIN 4 6cc48 183 0 0 18 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ = +STACK WIN 4 6cc57 173 0 0 18 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ = +STACK WIN 4 6cdd5 115c 1b 0 14 0 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6cde9 1144 7 0 14 4 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ = +STACK WIN 4 6cded 113f 3 0 14 8 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ = +STACK WIN 4 6cdf0 113b 0 0 14 c 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ = +STACK WIN 4 6df34 115c 1b 0 14 0 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6df48 1144 7 0 14 4 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 6df4c 113f 3 0 14 8 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 6df4f 113b 0 0 14 c 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 335b7 1d 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f093 357 13 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f09f 347 7 0 18 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 6f0a2 343 4 0 18 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 6f0a6 33e 0 0 18 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 6f3ef a6 c 0 10 0 f8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f3fb 96 0 0 10 4 f8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f49a 104 19 0 8 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f4a8 ed b 0 8 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 6f4a9 eb a 0 8 8 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 6f4b3 e0 0 0 8 c 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 6f5a3 102 8 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f5aa f7 1 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 6f5ab f5 0 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 6f602 9d 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 6f6aa c5 1a 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f6bc af 8 0 18 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 6f6bd ad 7 0 18 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 6f6c4 a5 0 0 18 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 6f774 1c7 16 0 8 0 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f785 1ad 5 0 8 4 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ = +STACK WIN 4 6f786 1ab 4 0 8 8 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ = +STACK WIN 4 6f78a 1a6 0 0 8 c 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ = +STACK WIN 4 6f949 b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f959 12f 7 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f97d 107 0 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6f9f0 92 0 0 14 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fa8d 22 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fab4 1f 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fad8 19e 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fae0 192 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fb1d 153 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fc7b 61 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fc83 55 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fcdc e9 c 0 0 4 330 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fdca 66 c 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fe04 4 0 0 4 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 189fc 28 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6fe51 65 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fe6d 44 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6fe6e 42 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6febb 5f c 0 c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6ff09 4 0 0 c 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6ff39 148 15 0 18 0 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6ff4a 12e 4 0 18 4 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 6ff4e 129 0 0 18 8 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70086 27 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 700b2 25 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 700dc c0 13 0 8 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 700ed a6 2 0 8 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 700ee a4 1 0 8 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 700ef a2 0 0 8 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 701a1 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 701b9 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 701d1 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70245 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 70252 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7025f 149 17 0 10 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70362 4 0 0 10 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 703c9 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 703e7 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70405 10c 17 0 c 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 704cb 4 0 0 c 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70531 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7054c 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70567 a3 19 0 8 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70578 89 8 0 8 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 70579 87 7 0 8 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 70580 7f 0 0 8 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 7060f 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70627 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7063f c6 13 0 c 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70650 ac 2 0 c 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 70651 aa 1 0 c 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 70652 a8 0 0 c c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 7070a 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70725 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70740 a8 19 0 8 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70751 8e 8 0 8 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 70752 8c 7 0 8 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 70759 84 0 0 8 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 707ed 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70805 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7081d 150 17 0 10 8 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70927 4 0 0 10 8 c8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70989 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 709a7 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 709c5 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ba6a 111 17 0 c 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 4677c 4 0 0 c 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70a39 23 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70a42 16 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ba3c 29 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ba45 1c 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2da09 a0 12 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2da1a 86 1 0 c 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2da1b 84 0 0 c 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70a61 4f c 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70a99 4 0 0 4 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2d9bd 4b c 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 467de 4 0 0 4 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70ad1 75 c 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70b3f c 0 0 8 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b355 6e c 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b3c1 c 0 0 4 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70b61 11b 1c 0 18 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70b72 101 b 0 18 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 70b73 ff a 0 18 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 70b7d f4 0 0 18 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 70c81 39 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70cbf 38 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70cfc a7 13 0 8 0 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70d0d 8d 2 0 8 4 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ = +STACK WIN 4 70d0e 8b 1 0 8 8 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ = +STACK WIN 4 70d0f 89 0 0 8 c 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ = +STACK WIN 4 70da8 58 8 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70db0 4c 0 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b10f 77 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b132 4f 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b13a 46 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 29ee3 70 d 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 29ef0 5f 0 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 46833 26 0 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1aff3 81 17 0 4 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 4687c 4 0 0 4 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1afd5 1f 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18c64 9a b 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18c6b 8f 4 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18c6f 8a 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70e05 1ef 17 0 2c 8 e0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 70fe7 12 0 0 2c 8 e0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71011 77 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7108d 4f 4 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 71090 4b 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 71091 49 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 710e1 93 7 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 710e8 88 0 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71107 68 0 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71191 164 17 0 10 8 d0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 712e3 17 0 0 10 8 d0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b6d7 228 16 0 8 0 640 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 b6ec 20a 1 0 8 4 640 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1608 - ^ = +STACK WIN 4 b6ed 208 0 0 8 8 640 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1608 - ^ = +STACK WIN 4 71311 1cd 17 0 0 8 480 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 714d7 c 0 0 0 8 480 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 714f9 e9 17 0 4 8 128 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 715db c 0 0 4 8 128 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 715f9 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1ce32 125 17 0 14 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 468d9 4 0 0 14 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 468e9 4 0 0 14 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1cf25 1c 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 35484 1c 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1dc7e 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1dd4d 9b 1c 0 10 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71604 a3 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71674 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 716c9 7b 13 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1aeaa 73 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1ff5b 82 13 0 10 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 10fe1 95 c 0 10 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 46968 4 0 0 10 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71749 29c 17 0 20 8 d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7189d 11 0 0 20 8 d8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7199c 4 0 0 20 8 d8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71a1d 4a 16 0 14 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71a2b 33 8 0 14 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ = +STACK WIN 4 71a2f 2e 4 0 14 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ = +STACK WIN 4 71a33 29 0 0 14 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ = +STACK WIN 4 71a6c 51 1c 0 14 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71a7a 3a e 0 14 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 71a7e 35 a 0 14 8 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 71a88 2a 0 0 14 c 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ = +STACK WIN 4 71ac2 139 17 0 2c 8 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71be9 4 0 0 2c 8 c8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71c19 ae 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71ca8 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71ce9 7b 13 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 37c53 9a 17 0 4 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 469a3 4 0 0 4 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71d69 c2 19 0 10 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71d7a a8 8 0 10 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 71d7e a3 4 0 10 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 71d82 9e 0 0 10 c a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 71e30 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71ea4 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71ec7 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71eea 75 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71f64 56 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 71fbf 5c 13 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72020 7b 13 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 720a0 107 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72188 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 721c9 78 8 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72269 12b 17 0 18 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7236f 4 0 0 18 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7237f 4 0 0 18 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 723c5 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 723e8 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7240b 13f 26 0 18 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72420 126 11 0 18 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 72421 124 10 0 18 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 72431 113 0 0 18 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 7254f 272 17 0 18 8 d4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72787 4 0 0 18 8 d4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 727e1 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72805 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72829 2d8 17 0 18 8 e8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72aa3 4 0 0 18 8 e8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72b21 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72b45 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72b69 151 17 0 1c 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72c86 4 0 0 1c 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72cd9 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72cff 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72d25 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72d4b 126 17 0 1c 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72e4c 4 0 0 1c 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72e5c 4 0 0 1c 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72ea5 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72ecb 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72ef1 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72f17 c3 17 0 18 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72fbb 4 0 0 18 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 72ff9 22 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73020 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73044 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73068 172 17 0 14 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7314a 4 0 0 14 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 731c9 4 0 0 14 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73215 af 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 732a4 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 732e1 17b 17 0 18 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73326 4 0 0 18 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73432 4 0 0 18 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7348d 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 734b0 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 734d3 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 734f6 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73519 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7353d 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73561 ad 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 735db 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73629 9c 17 0 4 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73692 4 0 0 4 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 736e1 9a 17 0 4 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73748 4 0 0 4 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73799 107 17 0 10 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73854 4 0 0 10 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 738c1 89 13 0 8 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7394f b5 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 739d1 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b1f0 75 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73a21 82 18 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73aa8 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73b1c 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73b90 75 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73c0a 75 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73c84 ac 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73d11 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73d51 b5 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73de7 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73e21 e1 17 0 18 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73ee3 4 0 0 18 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73f21 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73f45 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73f69 77 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 73fe5 75 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7405f 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 740d3 6b 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74143 b6 15 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74154 9c 4 0 4 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74158 97 0 0 4 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b18f 6e 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 741fe 5e 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74261 2e 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74294 90 12 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 742a5 76 1 0 8 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 742a6 74 0 0 8 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74329 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74341 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74359 67 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 743c5 11c 17 0 8 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74497 4 0 0 8 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1af14 a3 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 469dd 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74501 67 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7456d a3 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 745dd 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74631 83 13 0 4 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1bc2b e4 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 469fe 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 746b9 c1 19 0 10 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 746ca a7 8 0 10 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 746ce a2 4 0 10 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 746d2 9d 0 0 10 c a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 7477f 7b 13 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 747ff ae 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7487a 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 748c9 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7493d 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 749b1 e8 17 0 14 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74a7a 4 0 0 14 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74ab9 54 8 0 8 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74b12 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74b86 c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 74b97 4d 8 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74be9 a0 b 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74bf2 93 2 0 10 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 74bf3 91 1 0 10 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 74bf4 8f 0 0 10 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 74c8e bd 11 0 8 0 408 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74c9f a3 0 0 8 4 408 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74e13 13d 11 0 4 0 4b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74e24 123 0 0 4 4 4b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74e74 79 0 0 4 8 4b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 74f87 135 17 0 8 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7507d 4 0 0 8 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 750d9 c5 15 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 750ea ab 4 0 8 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 750ee a6 0 0 8 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 751a3 ac 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7521c 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75271 b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b5c6 ca 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b616 17 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b61d f 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2000c 78 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 20012 3d 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b58b 39 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b591 2f 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b592 2d 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75280 1cc c 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75348 4 0 0 4 8 7c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 753b9 c 0 0 4 8 7c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75454 c 0 0 4 8 7c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75489 45 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 754d3 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 754e4 242 17 0 8 8 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 756a5 4 0 0 8 8 c8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38211 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75749 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7576c 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7578a 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 757aa 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 757ca 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 757e8 1c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75809 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 37ce1 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75827 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75842 84 16 0 14 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75853 6a 5 0 14 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 75857 65 1 0 14 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 75858 63 0 0 14 c a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 a459 b3 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 d21d 15 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 cf52 136 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 cf63 111 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 cf7e f4 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 d239 24 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 380ef d7 c 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 380f9 c9 2 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 380fa c7 1 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 380fb c5 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 38063 f7 a 0 24 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3806c ea 1 0 24 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 3806d e8 0 0 24 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 380a9 65 0 0 24 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 d077 1a3 1e 0 18 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 d088 189 d 0 18 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 d08f 181 6 0 18 8 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 d095 17a 0 0 18 c 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 38de8 204 19 0 18 0 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38df9 1ea 8 0 18 4 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ = +STACK WIN 4 38dfd 1e5 4 0 18 8 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ = +STACK WIN 4 38e01 1e0 0 0 18 c 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ = +STACK WIN 4 d262 16c 1d 0 10 0 108 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 d277 14e 8 0 10 4 108 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 272 - ^ = +STACK WIN 4 d27e 146 1 0 10 8 108 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 272 - ^ = +STACK WIN 4 d27f 144 0 0 10 c 108 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 272 - ^ = +STACK WIN 4 758cb 9b 11 0 c 0 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 758dc 81 0 0 c 4 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75925 34 0 0 c 8 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7596b 166 21 0 18 0 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75981 47 b 0 18 4 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ = +STACK WIN 4 7598b 3c 1 0 18 8 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ = +STACK WIN 4 7598c 3a 0 0 18 c 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ = +STACK WIN 4 75ad6 9e 11 0 10 0 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75ae7 84 0 0 10 4 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75b30 37 0 0 10 8 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3632d 1a7 19 0 18 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3633e 18d 8 0 18 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 36342 188 4 0 18 8 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 36346 183 0 0 18 c 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 361ee 1ea 19 0 18 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 361ff 1d0 8 0 18 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 36203 1cb 4 0 18 8 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 36207 1c6 0 0 18 c 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ = +STACK WIN 4 2ec56 2cc 16 0 18 0 234 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ec67 2b2 5 0 18 4 234 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 572 - ^ = +STACK WIN 4 2ec68 2b0 4 0 18 8 234 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 572 - ^ = +STACK WIN 4 2ec6c 2ab 0 0 18 c 234 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 572 - ^ = +STACK WIN 4 75b79 333 16 0 18 0 23c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75b8a 319 5 0 18 4 23c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 580 - ^ = +STACK WIN 4 75b8b 317 4 0 18 8 23c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 580 - ^ = +STACK WIN 4 75b8f 312 0 0 18 c 23c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 580 - ^ = +STACK WIN 4 38a0c ad 15 0 14 0 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38a1d 93 4 0 14 4 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38a21 8e 0 0 14 8 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75eb1 191 21 0 14 0 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 75ec5 174 d 0 14 4 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ = +STACK WIN 4 75ec6 172 c 0 14 8 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ = +STACK WIN 4 75ed2 165 0 0 14 c 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ = +STACK WIN 4 76047 83 11 0 c 0 224 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76058 69 0 0 c 4 224 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7606e 4f 0 0 c 8 224 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 760cf b 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a490 196 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a496 18c 2 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 a497 18a 1 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 a498 188 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 760df 2e5 11 0 3c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 760eb 2d5 5 0 3c 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 760ef 2cb 1 0 3c 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 760f0 2c9 0 0 3c c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 bfef 93 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 af4f 12e7 1d 0 1c 0 98 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 af64 12ce 8 0 1c 4 98 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 160 - ^ = +STACK WIN 4 af68 12c9 4 0 1c 8 98 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 160 - ^ = +STACK WIN 4 af6c 12c4 0 0 1c c 98 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 160 - ^ = +STACK WIN 4 763c9 21 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 763ef 107 1e 0 8 0 424 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76400 6b d 0 8 4 424 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1068 - ^ = +STACK WIN 4 7640d 5d 0 0 8 8 424 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1068 - ^ = +STACK WIN 4 1c48b 263 26 0 8 0 648 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1c4a3 ad e 0 8 4 648 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1616 - ^ = +STACK WIN 4 1c4ad a2 4 0 8 8 648 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1616 - ^ = +STACK WIN 4 1c4b1 9d 0 0 8 c 648 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1616 - ^ = +STACK WIN 4 764fb fe 18 0 4 0 140 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7650c e4 7 0 4 4 140 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76513 dc 0 0 4 8 140 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a415 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13038 2d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13070 2a 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 127b2 7 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 bf3d 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9f10 e2 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7668d a2 9 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76696 95 0 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76734 2b9 6 0 1c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7676f 27a 0 0 1c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 769f2 5c 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39200 157 15 0 c 0 43c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39211 13d 4 0 c 4 43c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39215 138 0 0 c 8 43c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76a53 195 1d 0 c 0 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76a6b 174 5 0 c 4 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ = +STACK WIN 4 76a6f 16f 1 0 c 8 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ = +STACK WIN 4 76a70 16d 0 0 c c 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ = +STACK WIN 4 76c59 b2 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76c5f a8 2 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 76c60 a6 1 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 76c61 a4 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 383cf 49 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1bbba ac b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1bbc5 9d 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bf64 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2f041 131 11 0 c 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f052 117 0 0 c 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 2f06a ef 0 0 c 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 2f06b eb 0 0 c c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ = +STACK WIN 4 2efb9 83 f 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2efc2 76 6 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2efc8 6f 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11562 17bb 2f 0 10 0 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1157f ee5 12 0 10 4 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ = +STACK WIN 4 11582 19a f 0 10 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ = +STACK WIN 4 11591 18a 0 0 10 c bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ = +STACK WIN 4 39020 385 39 0 18 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39045 c8 14 0 18 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 39046 c6 13 0 18 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 39059 b2 0 0 18 c c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 76d1b 114 13 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76d2d fe 1 0 10 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76d2e fc 0 0 10 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76e34 3a 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76e3a 30 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b258 159 f 0 4 0 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b266 142 1 0 4 4 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1b267 140 0 0 4 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76e73 e22 23 0 c 0 570 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 76e84 d6c 12 0 c 4 570 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1400 - ^ = +STACK WIN 4 76e92 9ea 4 0 c 8 570 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1400 - ^ = +STACK WIN 4 76e96 9e5 0 0 c c 570 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1400 - ^ = +STACK WIN 4 77cf7 f4 1d 0 10 0 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 77d0b d7 9 0 10 4 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ = +STACK WIN 4 77d0f d2 5 0 10 8 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ = +STACK WIN 4 77d14 cc 0 0 10 c 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ = +STACK WIN 4 1bcfe f4 1c 0 10 0 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1bd12 d7 8 0 10 4 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ = +STACK WIN 4 1bd16 d2 4 0 10 8 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ = +STACK WIN 4 1bd1a cd 0 0 10 c 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ = +STACK WIN 4 15047 f9 7 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1505b e1 0 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1505c df 0 0 14 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 77df0 2f 7 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1734f 4a a 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17358 3d 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17359 3b 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 77e24 1a 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17f7d 3f 9 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17f86 32 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 77e43 13f 16 0 c 0 2a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 77e54 125 5 0 c 4 2a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 684 - ^ = +STACK WIN 4 77e58 120 1 0 c 8 2a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 684 - ^ = +STACK WIN 4 77e59 11e 0 0 c c 2a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 684 - ^ = +STACK WIN 4 2ae21 8d 1d 0 8 0 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ae3a 64 4 0 8 4 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ae3e 5f 0 0 8 8 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ac6c c8 10 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ac7a b1 2 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 2ac7b af 1 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 2ac7c ab 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 2b95b af 10 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b969 98 2 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 2b96a 96 1 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 2b96b 94 0 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 2b883 c6 15 0 0 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2b8c4 7b 0 0 0 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 172de 74 10 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 172ea 64 4 0 14 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 172ee 5f 0 0 14 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ad98 b5 9 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ada1 a8 0 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2adb4 90 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 77f87 60 9 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 77f90 53 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 77fec 2d5 1d 0 10 0 440 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 77ffd 2bb c 0 10 4 440 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1096 - ^ = +STACK WIN 4 78008 2af 1 0 10 8 440 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1096 - ^ = +STACK WIN 4 78009 2ad 0 0 10 c 440 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1096 - ^ = +STACK WIN 4 782c6 19a 15 0 14 0 e3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 782d7 15b 4 0 14 4 e3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3652 - ^ = +STACK WIN 4 782db 156 0 0 14 8 e3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3652 - ^ = +STACK WIN 4 7838b a2 0 0 14 c e3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3652 - ^ = +STACK WIN 4 2a8fa 221 12 0 10 0 430 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2a90b 1f9 1 0 10 4 430 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2a90c 1f7 0 0 10 8 430 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 37cfc 3ad 22 0 c 0 468 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 37d14 38c a 0 c 4 468 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1136 - ^ = +STACK WIN 4 37d1d 382 1 0 c 8 468 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1136 - ^ = +STACK WIN 4 37d1e 380 0 0 c c 468 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1136 - ^ = +STACK WIN 4 7849b 22b 1d 0 c 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 784ac 211 c 0 c 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 784ad 20f b 0 c 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 784b8 203 0 0 c c 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 38234 726 22 0 18 0 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38248 709 e 0 18 4 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ = +STACK WIN 4 38249 707 d 0 18 8 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ = +STACK WIN 4 38256 6f9 0 0 18 c dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ = +STACK WIN 4 38958 2ac 33 0 38 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38970 28b 1b 0 38 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 3897a 280 11 0 38 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 3898b 26c 0 0 38 c c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ = +STACK WIN 4 786e5 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78703 1c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2a8dc 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78724 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7873f 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7875a 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7877d 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 388dc df f 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 388e7 d0 4 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 388eb cb 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38801 15f c 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3880c 150 1 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 3880d 14e 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 388be 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 387e1 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 787a0 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 787c0 82 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 787e7 29 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 787f2 1d 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78847 389 16 0 14 0 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78858 343 5 0 14 4 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ = +STACK WIN 4 78859 341 4 0 14 8 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ = +STACK WIN 4 7885d 33c 0 0 14 c ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ = +STACK WIN 4 78bd9 7e 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78bdf 74 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78c22 30 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3798e da 18 0 4 0 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3799f c0 7 0 4 4 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 379a6 b8 0 0 4 8 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78c5c 150 12 0 4 0 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78c6d 136 1 0 4 4 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ = +STACK WIN 4 78c6e 134 0 0 4 8 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ = +STACK WIN 4 78cb4 ea 0 0 4 c 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ = +STACK WIN 4 78db1 7c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78dd9 4c 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78ddd 47 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78e32 7c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78e5a 4c 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78e5e 47 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78eb3 c3 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78ef0 7e 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78ef3 7a 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78f7b 127 e 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 78f88 116 1 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 78f89 114 0 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 78fac f0 0 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 790a7 126 11 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 790b5 114 3 0 10 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 790b8 110 0 0 10 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 791d2 92 18 0 10 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 791e0 7b a 0 10 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 791e4 76 6 0 10 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 791ea 6f 0 0 10 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 ce53 73 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ce77 40 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ce7b 3b 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2d4ad 1ced 29 0 1c 0 de4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2d4c1 1cd0 15 0 1c 4 de4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3564 - ^ = +STACK WIN 4 2d4d5 1cbb 1 0 1c 8 de4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3564 - ^ = +STACK WIN 4 2d4d6 1cb9 0 0 1c c de4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3564 - ^ = +STACK WIN 4 79269 289 7 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 79270 27e 0 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7928e 25e 0 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 374eb 220 1f 0 18 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 374fc 206 e 0 18 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3750a 1f7 0 0 18 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 37787 e9 23 0 18 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3779d ca d 0 18 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 377aa bc 0 0 18 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 377d2 55 0 0 18 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 794fb 136 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7952d ff 0 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7952e fd 0 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 79636 188 d 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 79641 179 2 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 79642 177 1 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 79643 175 0 0 14 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 37693 2ef a 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3769c 2e2 1 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 3769d 2e0 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 4acfb 1c3 0 0 18 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 cca8 3d3 13 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 ccb4 3c3 7 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 ccba 3bc 1 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 ccbb 3ba 0 0 18 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 110cb 48 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 110d1 3e 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9915 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 797c3 17 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 127a7 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b7dc 39 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f540 24 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 797df 82 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 79866 56 c 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 79872 46 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 798c1 c4 13 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 798cf 67 5 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 798d0 65 4 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 798d4 60 0 0 1c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 a1fb 2a0 13 0 18 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a20c 2c 2 0 18 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 a20d 2a 1 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 a20e 28 0 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 bd19 4ee 19 0 20 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 bd30 70 2 0 20 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 bd31 6e 1 0 20 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 bd32 48d 0 0 20 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 32cf3 1c3 1b 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32d04 1ae a 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 32d07 1aa 7 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 32d0e 1a2 0 0 1c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7998a 6d1 c 0 24 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 79991 6c6 5 0 24 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 79992 6c4 4 0 24 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 79996 6bf 0 0 24 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 7a064 158 19 0 0 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a07d 138 0 0 0 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a095 11b 0 0 0 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 cfd4 281 1c 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 cfe8 264 8 0 18 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 cfec 25f 4 0 18 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 cff0 25a 0 0 18 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 12e76 244 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12e7c 23a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12e96 212 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a1cd 2fc 10 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a1d3 2f2 a 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7a1dd 2e7 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7a21d 2a6 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7a4ce 1e2 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a4d4 1d8 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a58b 81 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9bf8 87b 15 0 18 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 9c0c 85e 1 0 18 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 9c0d 85c 0 0 18 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 9c38 81d 0 0 18 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 32c7b 10b f 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 32c84 41 6 0 20 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 32c85 3f 5 0 20 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 32c8a 39 0 0 20 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 a0d4 3c5 6 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a0da 3bb 0 0 20 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a0f1 387 0 0 20 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a6b5 1b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7a6e2 1b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 35819 c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 34474 45 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a712 5c 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 336f6 3a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33735 3b 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a773 7b e 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7a779 74 8 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 7a77a 72 7 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 7a781 6a 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 2f440 58 1c 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f44b 3b 11 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f45c 29 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a7f3 58 9 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a7fa 4d 2 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a81b 23 0 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 37834 11f 15 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3783c 113 d 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 3783d 111 c 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 3783e 10f b 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2f40d 7a d 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2f416 6f 4 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 2f417 6d 3 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 2f418 6b 2 0 0 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 7a850 5d 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a856 53 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a874 2c 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 124d1 109 c 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 124d7 ff 6 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 124dc f9 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 124dd f7 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 121de fc 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 121e1 f8 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bdd2 1bc 9 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bdd5 1b8 6 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bddb 1b1 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a2d4 85 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a2dc 7c 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7a8b2 ab 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7a8b5 a7 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7a962 da 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a968 cc 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7a969 ca 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7aa41 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7aa6b 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7aa95 302 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ee51 3c6 d 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ee57 3bc 7 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2ee5d 3b5 1 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2ee5e 3b3 0 0 14 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7ad9c 5d 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ad9f 59 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ada0 57 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2c16a 58 4 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2c16d 54 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2c16e 52 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12544 32 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2a5c3 13c 15 0 10 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2a5d4 bf 4 0 10 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 2a5d8 ba 0 0 10 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 2a615 6f 0 0 10 c 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ = +STACK WIN 4 12090 cb b 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12096 c1 5 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1209a bc 1 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1209b ba 0 0 1c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 14f5c 92 27 0 14 0 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 14f83 62 0 0 14 4 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 14fbe 16 0 0 14 8 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 397f8 1e2 19 0 4 0 644 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39826 1a4 0 0 4 4 644 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39827 1a2 0 0 4 8 644 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 384db f1 15 0 c 0 29c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 384ec d7 4 0 c 4 29c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 676 - ^ = +STACK WIN 4 384f0 d2 0 0 c 8 29c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 676 - ^ = +STACK WIN 4 38518 a3 0 0 c c 29c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 676 - ^ = +STACK WIN 4 3440e 61 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34414 57 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7adfe 7c 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ae04 72 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ae7f de 2d 0 20 0 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ae9b b9 11 0 20 4 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 7ae9f b4 d 0 20 8 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 7aeac a6 0 0 20 c b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 7af62 72 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7afd9 70 1b 0 1c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7aff4 4c 0 0 1c 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3472b 390 15 0 20 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34740 377 0 0 20 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34777 347 0 0 20 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3465d 1d3 43 0 20 0 b8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 34695 182 b 0 20 4 b8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 192 - ^ = +STACK WIN 4 3469c 17a 4 0 20 8 b8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 192 - ^ = +STACK WIN 4 346a0 175 0 0 20 c b8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 192 - ^ = +STACK WIN 4 7b04e 66c 43 0 20 0 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7b086 1c3 b 0 20 4 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ = +STACK WIN 4 7b08d 3aa 4 0 20 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ = +STACK WIN 4 7b091 1b6 0 0 20 c bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ = +STACK WIN 4 344bc 388 3c 0 18 0 378 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 344ea fe e 0 18 4 378 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 896 - ^ = +STACK WIN 4 344f7 f0 1 0 18 8 378 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 896 - ^ = +STACK WIN 4 344f8 ee 0 0 18 c 378 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 896 - ^ = +STACK WIN 4 7b6ca 404 3c 0 18 0 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7b6f8 fe e 0 18 4 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ = +STACK WIN 4 7b705 f0 1 0 18 8 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ = +STACK WIN 4 7b706 ee 0 0 18 c 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ = +STACK WIN 4 3414d 30 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 339dc 69 9 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 339e5 5c 0 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7bad3 96 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7bb13 4e 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7bb6e e6 f 0 c 0 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7bb7b d5 2 0 c 4 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 7bb7c d3 1 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 7bb7d cf 0 0 c c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 7bc59 17d e 0 4 0 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7bc65 168 2 0 4 4 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 7bc66 166 1 0 4 8 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 7bc67 164 0 0 4 c 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 7be1b 63 a 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7be24 56 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7be25 52 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7be83 c5 1d 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7bef3 35 0 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 335d4 33 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33ec8 a54 4c 0 14 0 508 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33eef a20 25 0 14 4 508 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1296 - ^ = +STACK WIN 4 33efe a10 16 0 14 8 508 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1296 - ^ = +STACK WIN 4 33f14 9f9 0 0 14 c 508 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1296 - ^ = +STACK WIN 4 7bf4d fd 18 0 8 0 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7bf56 f0 f 0 8 4 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 7bf64 dd 1 0 8 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 7bf65 d7 0 0 8 c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 7c04f 1d2 11 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7c058 1c5 8 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 7c059 1c3 7 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 7c060 1bb 0 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 7c86f 235 18 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7c887 1f0 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 7c8a5 1ce 0 0 c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 7c8a6 1cc 0 0 c c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ = +STACK WIN 4 33fd3 1f2 25 0 18 0 2bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33fea 17a e 0 18 4 2bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 708 - ^ = +STACK WIN 4 33ff4 16f 4 0 18 8 2bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 708 - ^ = +STACK WIN 4 33ff8 16a 0 0 18 c 2bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 708 - ^ = +STACK WIN 4 33a4a 8c9 30 0 20 0 258 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 33a6c 50 e 0 20 4 258 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 608 - ^ = +STACK WIN 4 33a70 4b a 0 20 8 258 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 608 - ^ = +STACK WIN 4 33a7a 578 0 0 20 c 258 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 608 - ^ = +STACK WIN 4 33775 3fb 38 0 18 0 2d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 3379f 308 e 0 18 4 2d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 736 - ^ = +STACK WIN 4 337a3 303 a 0 18 8 2d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 736 - ^ = +STACK WIN 4 337ad 2f8 0 0 18 c 2d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 736 - ^ = +STACK WIN 4 c0ed 74 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 17fc1 82 9 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 17fc8 7a 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 17fc9 78 1 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 17fca 76 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1805b 46 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38617 37 9 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 38620 13 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7caa9 a6 9 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cab1 9c 1 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cab2 98 0 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a557 9b e 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 a565 8b 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17395 78 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cb54 b5 1a 0 8 0 404 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cb6d 93 1 0 8 4 404 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1036 - ^ = +STACK WIN 4 7cb6e 8f 0 0 8 8 404 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1036 - ^ = +STACK WIN 4 7cba2 57 0 0 8 c 404 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1036 - ^ = +STACK WIN 4 188fc 146 7 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18902 13c 1 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 18903 13a 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1892c 10c 0 0 14 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 16ea9 130 f 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 16eb6 11f 2 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 16eb7 11d 1 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 16eb8 11b 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 336b6 9d e 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 336c4 8b 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 336d0 7d 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 336dd 6f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7cc2b 112 17 0 4 0 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cc42 f2 0 0 4 4 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cc60 d0 0 0 4 8 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cd42 7f 7 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cdc6 53 17 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cdcc 49 11 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7cdd4 40 9 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7cddd 36 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7ce1e 8d e 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ce30 76 0 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ce35 70 0 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 184dc db 12 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 184e6 cd 8 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 184e9 c9 5 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 18504 ad 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 7ceb0 9e d 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cebb 8f 2 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7cebc 8d 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7cebd 8b 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7cf53 2d 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 183fe 1fb 15 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1840f 1e1 4 0 8 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 18413 1dc 0 0 8 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 1844e 196 0 0 8 c a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ = +STACK WIN 4 3996f 176 1c 0 8 0 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 39980 15c b 0 8 4 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ = +STACK WIN 4 39984 157 7 0 8 8 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ = +STACK WIN 4 3998b 14f 0 0 8 c a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ = +STACK WIN 4 1831e 16a b 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18328 15c 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18329 15a 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 d1ae 89 1e 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 d1b6 7f 16 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 d1c9 69 3 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 150c2 d6 20 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 150ca 9c 18 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 150cb 9a 17 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 150df 85 3 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 7cf85 204 16 0 8 0 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7cf96 1ea 5 0 8 4 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ = +STACK WIN 4 7cf9a 1e5 1 0 8 8 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ = +STACK WIN 4 7cf9b 1e3 0 0 8 c a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ = +STACK WIN 4 7d1b9 88 8 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 18297 9a e 0 10 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 182a5 88 0 0 10 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d246 f5 24 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d24f a2 1b 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 7d250 a0 1a 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 7d267 88 3 0 0 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 7d340 65 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d3aa ff 1d 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d3bd e8 a 0 14 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 7d3be e6 9 0 14 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 7d3c7 dc 0 0 14 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 7d4ae 101 e 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d4b7 f4 5 0 18 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 7d4b8 f2 4 0 18 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 7d4bc ed 0 0 18 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 17210 6e a 0 0 0 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17219 63 1 0 0 4 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 1721a 5f 0 0 0 8 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d5b4 a0 a 0 0 0 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d5bd 95 1 0 0 4 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ = +STACK WIN 4 7d5be 93 0 0 0 8 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ = +STACK WIN 4 7d615 23 0 0 0 c 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ = +STACK WIN 4 2a25d 2a9 b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2a268 26e 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2a41a 113 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7d659 5a 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d65f 50 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d690 1c 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2a855 82 14 0 10 0 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2a869 65 0 0 10 4 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 11fff 23f 9 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 12006 234 2 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 12007 232 1 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 12008 230 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 2a532 8e 13 0 4 0 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2a543 74 2 0 4 4 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ = +STACK WIN 4 2a544 70 1 0 4 8 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ = +STACK WIN 4 2a545 6e 0 0 4 c ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ = +STACK WIN 4 7d6b7 a9 15 0 c 0 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d6c8 8f 4 0 c 4 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ = +STACK WIN 4 7d6cc 8a 0 0 c 8 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ = +STACK WIN 4 7d700 40 0 0 c c c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ = +STACK WIN 4 16ff1 9a 16 0 8 0 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 17002 80 5 0 8 4 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ = +STACK WIN 4 17003 7e 4 0 8 8 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ = +STACK WIN 4 17007 79 0 0 8 c c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ = +STACK WIN 4 7d765 25f 2b 0 1c 0 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7d77f 12f 11 0 1c 4 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ = +STACK WIN 4 7d78c 121 4 0 1c 8 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ = +STACK WIN 4 7d790 11c 0 0 1c c dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ = +STACK WIN 4 7d9c9 40 21 0 0 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7da0e 6c 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7da14 62 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7da47 15 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7da7f 13e b 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7da86 12e 4 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 7da89 12a 1 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 7da8a 128 0 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 31054 21d 13 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 31060 20d 7 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 31064 208 3 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 31067 204 0 0 14 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 7dc45 196 16 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7dc4c 17a f 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 7dc52 173 9 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 7dc5b 169 0 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 21523 2c6 d 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2152e 2b7 2 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2152f 2b5 1 0 10 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 21530 2b3 0 0 10 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 30f99 bb 9 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 30fa0 b0 2 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 30fa1 ae 1 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 30fa2 ac 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 215f5 a1 13 0 20 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 215fc 96 c 0 20 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 215fd 94 b 0 20 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 21608 88 0 0 20 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 2ad39 5a 17 0 c 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 2ad50 3a 0 0 c 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7dead b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7debd e1 1a 0 4 0 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7df16 75 0 0 4 4 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7df17 73 0 0 4 8 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7dfad 84 13 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7dfc0 6d 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7dfcd 5b 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e036 44 c 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e041 35 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7e042 31 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7e04a 28 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7e07f 47 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e085 3d 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e0cb 1f e 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e0ef 1f e 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e113 1f e 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e137 1f e 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e15b b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e16b f 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e17f f 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e193 f 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e1a7 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e1bb f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e1cf f 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ddf5 4 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e1e3 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e1ec 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e1f9 15 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e213 15 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e22d 15 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e247 2f 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e27b 19 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e299 d 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e2ab d 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e2bd d 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e2cf 14 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e2e8 4 0 0 2c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e2f1 10 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e306 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e313 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e31d 18 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e33a c 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e34b 5 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e355 8 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e362 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e36c c 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e37d 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e388 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e393 6 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e39e 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ae7 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e3a9 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e3b4 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e3bf 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e3ca 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e3e8 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e3f5 21 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e41b 1b 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e43b 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e446 11 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e45c 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e469 c 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e47a a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e489 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e496 5 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e4a0 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e4b1 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e4be c 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e4cf c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e4e0 c 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e4f1 1d 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e513 1e 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e536 c 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e547 e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e55a c 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e56b 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e593 8 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e5a0 17 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e5bc 8 0 0 34 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e5c9 5 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e5d3 5 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e5dd 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e5f5 a 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e604 c 0 0 30 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e615 d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e627 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e640 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e659 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e666 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e67f 18 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e69c 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e6a9 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e6b6 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e6c3 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e6ed 18 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e728 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 cc97 c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e735 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e742 c 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e753 f 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e767 10 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e77c 12 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e793 14 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e7ac c 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e7bd 1b 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e7dd 10 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e7f2 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e7fd 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e808 14 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e821 15 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e83b 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e848 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e878 5 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e88d 5 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 260c2 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e897 c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e8a8 5 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e8b2 5 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e8bc 14 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e8d5 14 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e8ee 14 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e907 15 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e90d b 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e921 1f 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e945 c 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e956 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e96f 19 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e975 f 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e98d 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e995 14 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e9ae 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e9bb 1a 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7e9da 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e9e7 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7e9f0 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ea09 14 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ea22 19 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ea40 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ea4d 5 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ea57 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ea62 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ea6d 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ea78 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ea83 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ea8e 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ea99 6 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eaa4 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eaaf 12 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7eac6 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eacf c 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eae0 d 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eaf2 d 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eb04 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eb14 23 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7eb3c d 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eb4e d 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eb60 5 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eb6a 8 0 0 38 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eb77 5 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eb81 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eb8c 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ebbe 8 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ebcb 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ebd8 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ebe5 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ebf2 8 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ebff 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ec0c 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ec19 3 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ec21 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ec2e 19 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ec34 f 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ec4c 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ec59 3 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ec61 15 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ec7b 18 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ec98 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eca1 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ecbf 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eccc 8 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ecd9 8 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ece6 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ed3f 3 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ed47 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ed54 5 0 0 38 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ed69 10 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ed7e 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ed98 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eda5 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7edb2 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7edbf 8 0 0 2c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7edcc 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7edd9 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ede6 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7edf3 14 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ee0c 14 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ee25 19 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ee2b f 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ee43 19 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ee49 f 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ee61 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ee6c 8 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ee79 8 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ee86 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ee93 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eea0 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eead 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eeb8 8 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eec5 8 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eed2 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eedf 8 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eeec 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ef05 14 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ef1e 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ef29 14 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ef42 14 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ef5b 1b 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ef61 11 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ef7b 14 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ef94 7 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7efa0 7 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7efac 7 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7efb8 7 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7efc4 7 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7efd0 7 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7efdc 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7efe7 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7eff2 12 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f009 12 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f020 19 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f03e f 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f052 3 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f05a 3 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f062 6 0 0 2c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f06d 6 0 0 30 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f078 3 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f093 18 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f0b0 6 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f0bb 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f0c5 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f0f5 3 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f0fd 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f108 18 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f125 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f132 5 0 0 2c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f13c 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f147 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f152 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f17e 18 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f19b c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f1ac 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f1d0 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f1db 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f1e6 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f1f1 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f1fe 1 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f204 c 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f215 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f220 16 5 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f23b 6 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f246 6 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f251 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f25c 18 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f279 18 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f296 27 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f2c2 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f2cd 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f2da 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f2e5 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f309 30 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f317 1b 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f31a 15 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f33e 3a 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f356 1b 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f359 15 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f37d 3e 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f399 1b 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f39c 15 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f3c0 7 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f3cc 7 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f3d8 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f3f8 1b 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f418 16 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f433 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f44e 16 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f469 16 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f484 16 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f49f 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f4aa 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f4b5 6 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f4c0 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f4cb 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f4e6 17 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f502 6 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f50d 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f518 19 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f51e f 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f536 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f541 16 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f55c 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f567 16 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f582 16 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f59d c 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f5ae 6 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f5b9 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f5c4 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f5cf 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f5da 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f5e5 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f5f0 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f5fb 6 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f606 f 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f61a f 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f62e d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f640 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f655 f 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f669 f 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f67d f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f691 f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f6a5 8 0 0 5c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f6b2 c 0 0 2c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f6c3 6 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f6ce 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f6d9 5 0 0 30 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f6e3 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f6fb 12 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f712 1a 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f731 8 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f73e 22 5 0 30 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f765 18 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f782 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f78f 20 5 0 24 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f7b4 16 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f7cf 20 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f7f4 16 5 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f80f 15 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f829 18 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f846 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f95b 222 a 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7f964 217 1 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 7f965 215 0 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 7f994 1e5 0 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 7fb8d ae 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fb93 a0 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fbdd 55 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fc40 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7fc57 49 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fc5d 3f 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fca5 b9 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fcab af 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7fcdd 7c 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7fceb 6d 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7fd63 b9 13 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fd71 a2 5 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 7fd72 a0 4 0 c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 7fd76 9b 0 0 c c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 7fe21 30 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fe56 47 a 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fe5c 3d 4 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fe60 38 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fea2 30 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fed7 41 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fedd 37 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ff1d 5a 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ff23 50 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ff24 4e 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ff89 65 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7ff8f 5b 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7ff90 57 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 7fff3 104 a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fff9 fa 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 7fffd f5 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 800fc 45 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 80146 ae 16 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 80154 97 8 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 80158 92 4 0 c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 8015c 8d 0 0 c c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 801f9 3f 12 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 80207 28 4 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 8020b 22 0 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 80246 262 c 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 8024d 257 5 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 8024e 255 4 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 80252 250 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 804ad 75 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 804b3 6b 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 80527 4d 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 8052d 43 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 8052e 41 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 80579 5e 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 805dc 5e 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 8063f 2f e 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 4 8064d 1d 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = +STACK WIN 0 17826 35 0 0 0 0 0 0 0 0 +STACK WIN 0 558b4 e 0 0 0 0 0 0 0 0 +STACK WIN 0 39bc8 e 0 0 0 0 0 0 0 0 +STACK WIN 0 30769 a 0 0 0 0 0 0 0 0 +STACK WIN 0 b722 20 0 0 0 0 0 0 0 0 +STACK WIN 0 1b069 a1 0 0 0 0 0 0 0 0 +STACK WIN 0 17860 24 0 0 0 0 0 0 0 0 +STACK WIN 0 1795e 89 3 0 0 0 0 0 0 0 +STACK WIN 0 39e42 e 0 0 0 0 0 0 0 0 +STACK WIN 0 39ea2 e 0 0 0 0 0 0 0 0 +STACK WIN 0 39eca e 0 0 0 0 0 0 0 0 +STACK WIN 0 1717 4 0 0 0 0 0 0 0 0 +STACK WIN 0 39f0b e 0 0 0 0 0 0 0 0 +STACK WIN 0 39f69 e 0 0 0 0 0 0 0 0 +STACK WIN 0 55abf e 0 0 0 0 0 0 0 0 +STACK WIN 0 55b65 e 0 0 0 0 0 0 0 0 +STACK WIN 0 3a7c5 e 0 0 0 0 0 0 0 0 +STACK WIN 0 3a824 e 0 0 0 0 0 0 0 0 +STACK WIN 0 3a86a 19 0 0 0 0 0 0 0 0 +STACK WIN 0 3a94d e 0 0 0 0 0 0 0 0 +STACK WIN 0 3a995 19 0 0 0 0 0 0 0 0 +STACK WIN 0 3a9c6 e 0 0 0 0 0 0 0 0 +STACK WIN 0 3aa01 4 0 0 0 0 0 0 0 0 +STACK WIN 0 3aa1d e 0 0 0 0 0 0 0 0 +STACK WIN 0 2c86d 29 0 0 0 0 0 0 0 0 +STACK WIN 0 3aad0 4 0 0 0 0 0 0 0 0 +STACK WIN 0 3ab10 11 0 0 0 0 0 0 0 0 +STACK WIN 0 3abe7 7a 0 0 0 0 0 0 0 0 +STACK WIN 0 98eb 4 0 0 0 0 0 0 0 0 +STACK WIN 0 9766 11 0 0 4 0 0 0 0 0 +STACK WIN 0 977a 11 0 0 4 0 0 0 0 0 +STACK WIN 0 978e 13 0 0 8 0 0 0 0 0 +STACK WIN 0 97a2 13 0 0 c 0 0 0 0 0 +STACK WIN 0 97b6 f 0 0 8 0 0 0 0 0 +STACK WIN 0 97c6 120 0 0 c 0 0 0 0 0 +STACK WIN 0 2ff92 18 0 0 0 0 0 0 0 0 +STACK WIN 0 929c f 0 0 0 0 0 0 0 0 +STACK WIN 0 13093 e 0 0 0 0 0 0 0 0 +STACK WIN 0 59b72 5 0 0 0 0 0 0 0 0 +STACK WIN 0 59dd6 4 0 0 0 0 0 0 0 0 +STACK WIN 0 59f9f 14 0 0 0 0 0 0 0 0 +STACK WIN 0 30cce 1c 0 0 0 0 0 0 0 0 +STACK WIN 0 1c858 6a 3 0 0 0 0 0 0 0 +STACK WIN 0 3bde2 e 0 0 0 0 0 0 0 0 +STACK WIN 0 3c06f 15 0 0 0 0 0 0 0 0 +STACK WIN 0 5c223 1e 0 0 0 0 0 0 0 0 +STACK WIN 0 3c77a 2c 0 0 0 0 0 0 0 0 +STACK WIN 0 f049 e 0 0 0 0 0 0 0 0 +STACK WIN 0 3c85e e 0 0 0 0 0 0 0 0 +STACK WIN 0 18ef e 0 0 0 0 0 0 0 0 +STACK WIN 0 1921 4 0 0 0 0 0 0 0 0 +STACK WIN 0 3cac5 4 0 0 0 0 0 0 0 0 +STACK WIN 0 5c6de b 0 0 0 0 0 0 0 0 +STACK WIN 0 5cbad 1 0 0 0 0 0 0 0 0 +STACK WIN 0 5d0d4 1 0 0 0 0 0 0 0 0 +STACK WIN 0 5d2ff 39 0 0 0 0 0 0 0 0 +STACK WIN 0 1f951 3c 0 0 0 0 0 0 0 0 +STACK WIN 0 3d377 4 0 0 0 0 0 0 0 0 +STACK WIN 0 5d93e 4d 0 0 0 0 0 0 0 0 +STACK WIN 0 5de3f 1a 0 0 0 0 0 0 0 0 +STACK WIN 0 5e00f 1 0 0 0 0 0 0 0 0 +STACK WIN 0 3d7a4 10 0 0 0 0 0 0 0 0 +STACK WIN 0 3d9cf 10 0 0 0 0 0 0 0 0 +STACK WIN 0 3e895 11 0 0 0 0 0 0 0 0 +STACK WIN 0 3eadf ab 0 0 0 0 0 0 0 0 +STACK WIN 0 3f743 134 0 0 0 0 0 0 0 0 +STACK WIN 0 3ffbd 3e 0 0 0 0 0 0 0 0 +STACK WIN 0 27b99 1d 0 0 0 0 0 0 0 0 +STACK WIN 0 200d1 1d 0 0 0 0 0 0 0 0 +STACK WIN 0 40019 e 0 0 0 0 0 0 0 0 +STACK WIN 0 401f7 e 0 0 0 0 0 0 0 0 +STACK WIN 0 40258 e 0 0 0 0 0 0 0 0 +STACK WIN 0 4029c e 0 0 0 0 0 0 0 0 +STACK WIN 0 402de e 0 0 0 0 0 0 0 0 +STACK WIN 0 40327 e 0 0 0 0 0 0 0 0 +STACK WIN 0 403bd e 0 0 0 0 0 0 0 0 +STACK WIN 0 40414 e 0 0 0 0 0 0 0 0 +STACK WIN 0 4043c e 0 0 0 0 0 0 0 0 +STACK WIN 0 5e670 11 0 0 4 0 0 0 0 0 +STACK WIN 0 404b7 e 0 0 0 0 0 0 0 0 +STACK WIN 0 1d07e 8 0 0 0 0 0 0 0 0 +STACK WIN 0 365f6 b 0 0 0 0 0 0 0 0 +STACK WIN 0 3594f 6 0 0 0 0 0 0 0 0 +STACK WIN 0 17443 11 0 0 0 0 0 0 0 0 +STACK WIN 0 407a9 4 0 0 0 0 0 0 0 0 +STACK WIN 0 407c5 4 0 0 0 0 0 0 0 0 +STACK WIN 0 407e1 4 0 0 0 0 0 0 0 0 +STACK WIN 0 407fd 4 0 0 0 0 0 0 0 0 +STACK WIN 0 40817 4 0 0 0 0 0 0 0 0 +STACK WIN 0 40833 4 0 0 0 0 0 0 0 0 +STACK WIN 0 4084f 4 0 0 0 0 0 0 0 0 +STACK WIN 0 40892 e 0 0 0 0 0 0 0 0 +STACK WIN 0 5e882 11 0 0 8 0 0 0 0 0 +STACK WIN 0 abc1 d 0 0 0 0 0 0 0 0 +STACK WIN 0 40a26 16 0 0 0 0 0 0 0 0 +STACK WIN 0 40b63 e 0 0 0 0 0 0 0 0 +STACK WIN 0 40c62 17 0 0 0 0 0 0 0 0 +STACK WIN 0 111da 31 0 0 0 0 0 0 0 0 +STACK WIN 0 5eee3 8 0 0 c 0 0 0 0 0 +STACK WIN 0 1c8c e 0 0 0 0 0 0 0 0 +STACK WIN 0 40cf3 e 0 0 0 0 0 0 0 0 +STACK WIN 0 40d2a e 0 0 0 0 0 0 0 0 +STACK WIN 0 40d78 e 0 0 0 0 0 0 0 0 +STACK WIN 0 40da4 e 0 0 0 0 0 0 0 0 +STACK WIN 0 40dd0 e 0 0 0 0 0 0 0 0 +STACK WIN 0 40e00 e 0 0 0 0 0 0 0 0 +STACK WIN 0 5f1bf e 0 0 0 0 0 0 0 0 +STACK WIN 0 5f3e0 e 0 0 0 0 0 0 0 0 +STACK WIN 0 40e66 e 0 0 0 0 0 0 0 0 +STACK WIN 0 40e92 e 0 0 0 0 0 0 0 0 +STACK WIN 0 5f5c9 e 0 0 0 0 0 0 0 0 +STACK WIN 0 5f72a e 0 0 0 0 0 0 0 0 +STACK WIN 0 5f9fa 4 0 0 0 0 0 0 0 0 +STACK WIN 0 5fa2d 1e 0 0 0 0 0 0 0 0 +STACK WIN 0 40faa 4 0 0 0 0 0 0 0 0 +STACK WIN 0 40fe6 4 0 0 0 0 0 0 0 0 +STACK WIN 0 5fc02 9 0 0 0 0 0 0 0 0 +STACK WIN 0 11419 21 0 0 0 0 0 0 0 0 +STACK WIN 0 4171b 4 0 0 0 0 0 0 0 0 +STACK WIN 0 41748 48 0 0 0 0 0 0 0 0 +STACK WIN 0 607cb 30 0 0 0 0 0 0 0 0 +STACK WIN 0 418d1 3f 0 0 0 0 0 0 0 0 +STACK WIN 0 60b60 a 0 0 0 0 0 0 0 0 +STACK WIN 0 60bbf f 0 0 8 0 0 0 0 0 +STACK WIN 0 41b32 7 0 0 0 0 0 0 0 0 +STACK WIN 0 21af 7 0 0 0 0 0 0 0 0 +STACK WIN 0 12f1d 6 0 0 0 0 0 0 0 0 +STACK WIN 0 16f83 6 0 0 0 0 0 0 0 0 +STACK WIN 0 12f08 10 0 0 0 0 0 0 0 0 +STACK WIN 0 9920 a 0 0 0 0 0 0 0 0 +STACK WIN 0 41c56 4 0 0 0 0 0 0 0 0 +STACK WIN 0 41c70 4 0 0 0 0 0 0 0 0 +STACK WIN 0 41c8a 4 0 0 0 0 0 0 0 0 +STACK WIN 0 41ca4 4 0 0 0 0 0 0 0 0 +STACK WIN 0 41dcc 10 0 0 0 0 0 0 0 0 +STACK WIN 0 43025 4 0 0 0 0 0 0 0 0 +STACK WIN 0 1e017 2eb 0 0 0 0 0 0 0 0 +STACK WIN 0 43374 14 0 0 0 0 0 0 0 0 +STACK WIN 0 434b2 17 0 0 0 0 0 0 0 0 +STACK WIN 0 434e5 60 0 0 0 0 0 0 0 0 +STACK WIN 0 61723 e 0 0 0 0 0 0 0 0 +STACK WIN 0 435d2 e 0 0 0 0 0 0 0 0 +STACK WIN 0 132ee 6 0 0 0 0 0 0 0 0 +STACK WIN 0 617fd e 0 0 0 0 0 0 0 0 +STACK WIN 0 436ca 11 0 0 0 0 0 0 0 0 +STACK WIN 0 437f5 10 0 0 0 0 0 0 0 0 +STACK WIN 0 438be 4a 0 0 0 0 0 0 0 0 +STACK WIN 0 31d8e f 0 0 0 0 0 0 0 0 +STACK WIN 0 1a834 36 0 0 0 0 0 0 0 0 +STACK WIN 0 2610 b 0 0 0 0 0 0 0 0 +STACK WIN 0 36759 b 0 0 0 0 0 0 0 0 +STACK WIN 0 951a b 0 0 0 0 0 0 0 0 +STACK WIN 0 2432 b 0 0 0 0 0 0 0 0 +STACK WIN 0 61a61 b 0 0 0 0 0 0 0 0 +STACK WIN 0 1746c 23 0 0 0 0 0 0 0 0 +STACK WIN 0 17459 10e 0 0 0 0 0 0 0 0 +STACK WIN 0 1efce 12 0 0 0 0 0 0 0 0 +STACK WIN 0 129f9 b 0 0 0 0 0 0 0 0 +STACK WIN 0 44733 c 0 0 0 0 0 0 0 0 +STACK WIN 0 9728 a 0 0 0 0 0 0 0 0 +STACK WIN 0 62be6 4 0 0 0 0 0 0 0 0 +STACK WIN 0 448d9 a 0 0 0 0 0 0 0 0 +STACK WIN 0 13771 7 0 0 0 0 0 0 0 0 +STACK WIN 0 2c151 14 0 0 0 0 0 0 0 0 +STACK WIN 0 2fed7 40 0 0 0 0 0 0 0 0 +STACK WIN 0 32992 13 0 0 0 0 0 0 0 0 +STACK WIN 0 63421 4 0 0 0 0 0 0 0 0 +STACK WIN 0 6362b 4 0 0 0 0 0 0 0 0 +STACK WIN 0 636d3 4 0 0 0 0 0 0 0 0 +STACK WIN 0 6452a e 0 0 0 0 0 0 0 0 +STACK WIN 0 6665c 1c 0 0 0 0 0 0 0 0 +STACK WIN 0 66682 b 0 0 0 0 0 0 0 0 +STACK WIN 0 66801 3b 0 0 0 0 0 0 0 0 +STACK WIN 0 66918 1a 0 0 0 0 0 0 0 0 +STACK WIN 0 669cd 3b 0 0 0 0 0 0 0 0 +STACK WIN 0 66ae8 1a 0 0 0 0 0 0 0 0 +STACK WIN 0 66b9d 3b 0 0 0 0 0 0 0 0 +STACK WIN 0 66cbf 1a 0 0 0 0 0 0 0 0 +STACK WIN 0 67093 11 0 0 0 0 0 0 0 0 +STACK WIN 0 675f4 11 0 0 0 0 0 0 0 0 +STACK WIN 0 677e9 11 0 0 0 0 0 0 0 0 +STACK WIN 0 67941 11 0 0 0 0 0 0 0 0 +STACK WIN 0 67dd6 2c 0 0 0 0 0 0 0 0 +STACK WIN 0 1f571 50 0 0 0 0 0 0 0 0 +STACK WIN 0 68496 4a 0 0 0 0 0 0 0 0 +STACK WIN 0 1366c 45 0 0 0 0 0 0 0 0 +STACK WIN 0 29b93 127 0 0 0 0 0 0 0 0 +STACK WIN 0 44db3 55 0 0 0 0 0 0 0 0 +STACK WIN 0 68734 55 0 0 0 0 0 0 0 0 +STACK WIN 0 69ce0 21 0 0 0 0 0 0 0 0 +STACK WIN 0 69e0e 21 0 0 0 0 0 0 0 0 +STACK WIN 0 69f2a 21 0 0 0 0 0 0 0 0 +STACK WIN 0 6a054 21 0 0 0 0 0 0 0 0 +STACK WIN 0 453fe 21 0 0 0 0 0 0 0 0 +STACK WIN 0 6a220 21 0 0 0 0 0 0 0 0 +STACK WIN 0 6a339 21 0 0 0 0 0 0 0 0 +STACK WIN 0 6a4e8 11 0 0 0 0 0 0 0 0 +STACK WIN 0 6a4fe c7 0 0 0 0 0 0 0 0 +STACK WIN 0 6a5ca 3e 0 0 0 0 0 0 0 0 +STACK WIN 0 6b5b5 48 0 0 0 0 0 0 0 0 +STACK WIN 0 6b683 c 0 0 4 0 0 0 0 0 +STACK WIN 0 2146c c 0 0 8 0 0 0 0 0 +STACK WIN 0 6b694 a 0 0 0 0 0 0 0 0 +STACK WIN 0 45f23 e 0 0 0 0 0 0 0 0 +STACK WIN 0 165e9 13 0 0 0 0 0 0 0 0 +STACK WIN 0 46631 e 0 0 0 0 0 0 0 0 +STACK WIN 0 46678 4 0 0 0 0 0 0 0 0 +STACK WIN 0 466a9 4 0 0 0 0 0 0 0 0 +STACK WIN 0 466d4 4 0 0 0 0 0 0 0 0 +STACK WIN 0 6bc8a 4 0 0 0 0 0 0 0 0 +STACK WIN 0 6be06 7f 3 0 0 0 0 0 0 0 +STACK WIN 0 6fe04 4 0 0 0 0 0 0 0 0 +STACK WIN 0 189fc 28 0 0 0 0 0 0 0 0 +STACK WIN 0 6ff09 4 0 0 0 0 0 0 0 0 +STACK WIN 0 70245 8 0 0 0 0 0 0 0 0 +STACK WIN 0 70252 8 0 0 0 0 0 0 0 0 +STACK WIN 0 70362 4 0 0 0 0 0 0 0 0 +STACK WIN 0 704cb 4 0 0 0 0 0 0 0 0 +STACK WIN 0 70927 4 0 0 0 0 0 0 0 0 +STACK WIN 0 4677c 4 0 0 0 0 0 0 0 0 +STACK WIN 0 70a99 4 0 0 0 0 0 0 0 0 +STACK WIN 0 467de 4 0 0 0 0 0 0 0 0 +STACK WIN 0 70b3f c 0 0 0 0 0 0 0 0 +STACK WIN 0 1b3c1 c 0 0 0 0 0 0 0 0 +STACK WIN 0 4687c 4 0 0 0 0 0 0 0 0 +STACK WIN 0 70fe7 12 0 0 0 0 0 0 0 0 +STACK WIN 0 7108d 4f 4 0 0 0 0 0 0 0 +STACK WIN 0 712e3 17 0 0 0 0 0 0 0 0 +STACK WIN 0 714d7 c 0 0 0 0 0 0 0 0 +STACK WIN 0 715db c 0 0 0 0 0 0 0 0 +STACK WIN 0 715f9 6 0 0 0 0 0 0 0 0 +STACK WIN 0 468d9 4 0 0 0 0 0 0 0 0 +STACK WIN 0 468e9 4 0 0 0 0 0 0 0 0 +STACK WIN 0 71674 4 0 0 0 0 0 0 0 0 +STACK WIN 0 46968 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7189d 11 0 0 0 0 0 0 0 0 +STACK WIN 0 7199c 4 0 0 0 0 0 0 0 0 +STACK WIN 0 71be9 4 0 0 0 0 0 0 0 0 +STACK WIN 0 71ca8 4 0 0 0 0 0 0 0 0 +STACK WIN 0 469a3 4 0 0 0 0 0 0 0 0 +STACK WIN 0 72188 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7236f 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7237f 4 0 0 0 0 0 0 0 0 +STACK WIN 0 72787 4 0 0 0 0 0 0 0 0 +STACK WIN 0 72aa3 4 0 0 0 0 0 0 0 0 +STACK WIN 0 72c86 4 0 0 0 0 0 0 0 0 +STACK WIN 0 72e4c 4 0 0 0 0 0 0 0 0 +STACK WIN 0 72e5c 4 0 0 0 0 0 0 0 0 +STACK WIN 0 72fbb 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7314a 4 0 0 0 0 0 0 0 0 +STACK WIN 0 731c9 4 0 0 0 0 0 0 0 0 +STACK WIN 0 732a4 4 0 0 0 0 0 0 0 0 +STACK WIN 0 73326 4 0 0 0 0 0 0 0 0 +STACK WIN 0 73432 4 0 0 0 0 0 0 0 0 +STACK WIN 0 735db 4 0 0 0 0 0 0 0 0 +STACK WIN 0 73692 4 0 0 0 0 0 0 0 0 +STACK WIN 0 73748 4 0 0 0 0 0 0 0 0 +STACK WIN 0 73854 4 0 0 0 0 0 0 0 0 +STACK WIN 0 739d1 4 0 0 0 0 0 0 0 0 +STACK WIN 0 73d11 4 0 0 0 0 0 0 0 0 +STACK WIN 0 73de7 4 0 0 0 0 0 0 0 0 +STACK WIN 0 73ee3 4 0 0 0 0 0 0 0 0 +STACK WIN 0 74497 4 0 0 0 0 0 0 0 0 +STACK WIN 0 469dd 4 0 0 0 0 0 0 0 0 +STACK WIN 0 745dd 4 0 0 0 0 0 0 0 0 +STACK WIN 0 469fe 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7487a 4 0 0 0 0 0 0 0 0 +STACK WIN 0 74a7a 4 0 0 0 0 0 0 0 0 +STACK WIN 0 74b86 c 0 0 0 0 0 0 0 0 +STACK WIN 0 7507d 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7521c 4 0 0 0 0 0 0 0 0 +STACK WIN 0 75271 b 0 0 4 0 0 0 0 0 +STACK WIN 0 75348 4 0 0 0 0 0 0 0 0 +STACK WIN 0 753b9 c 0 0 0 0 0 0 0 0 +STACK WIN 0 75454 c 0 0 0 0 0 0 0 0 +STACK WIN 0 754d3 f 0 0 0 0 0 0 0 0 +STACK WIN 0 756a5 4 0 0 0 0 0 0 0 0 +STACK WIN 0 763c9 21 0 0 0 0 0 0 0 0 +STACK WIN 0 a415 d 0 0 0 0 0 0 0 0 +STACK WIN 0 13038 2d 0 0 0 0 0 0 0 0 +STACK WIN 0 127b2 7 0 0 0 0 0 0 0 0 +STACK WIN 0 bf3d 6 0 0 0 0 0 0 0 0 +STACK WIN 0 bf64 5 0 0 0 0 0 0 0 0 +STACK WIN 0 9915 6 0 0 0 0 0 0 0 0 +STACK WIN 0 127a7 6 0 0 0 0 0 0 0 0 +STACK WIN 0 7a6b5 1b 0 0 0 0 0 0 0 0 +STACK WIN 0 7a6e2 1b 0 0 0 0 0 0 0 0 +STACK WIN 0 35819 c 0 0 0 0 0 0 0 0 +STACK WIN 0 7a773 7b e 0 0 0 0 0 0 0 +STACK WIN 0 121de fc 3 0 0 0 0 0 0 0 +STACK WIN 0 1bdd2 1bc 9 0 0 0 0 0 0 0 +STACK WIN 0 a2d4 85 2 0 0 0 0 0 0 0 +STACK WIN 0 7a8b2 ab 3 0 0 0 0 0 0 0 +STACK WIN 0 7ad9c 5d 6 0 0 0 0 0 0 0 +STACK WIN 0 2c16a 58 4 0 0 0 0 0 0 0 +STACK WIN 0 c0ed 74 0 0 0 0 0 0 0 0 +STACK WIN 0 17fc1 82 9 0 0 0 0 0 0 0 +STACK WIN 0 2a41a 113 0 0 0 0 0 0 0 0 +STACK WIN 0 7e16b f 0 0 c 0 0 0 0 0 +STACK WIN 0 7e17f f 0 0 14 0 0 0 0 0 +STACK WIN 0 7e193 f 0 0 28 0 0 0 0 0 +STACK WIN 0 7e1a7 f 0 0 4 0 0 0 0 0 +STACK WIN 0 7e1bb f 0 0 8 0 0 0 0 0 +STACK WIN 0 7e1cf f 0 0 10 0 0 0 0 0 +STACK WIN 0 ddf5 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7e1e3 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7e1ec 8 0 0 8 0 0 0 0 0 +STACK WIN 0 7e299 d 0 0 c 0 0 0 0 0 +STACK WIN 0 7e2ab d 0 0 18 0 0 0 0 0 +STACK WIN 0 7e2bd d 0 0 24 0 0 0 0 0 +STACK WIN 0 7e2e8 4 0 0 10 0 0 0 0 0 +STACK WIN 0 7e306 8 0 0 c 0 0 0 0 0 +STACK WIN 0 7e313 5 0 0 4 0 0 0 0 0 +STACK WIN 0 7e33a c 0 0 18 0 0 0 0 0 +STACK WIN 0 7e34b 5 0 0 28 0 0 0 0 0 +STACK WIN 0 7e355 8 0 0 28 0 0 0 0 0 +STACK WIN 0 7e362 5 0 0 8 0 0 0 0 0 +STACK WIN 0 7e36c c 0 0 14 0 0 0 0 0 +STACK WIN 0 7e37d 6 0 0 18 0 0 0 0 0 +STACK WIN 0 7e388 6 0 0 14 0 0 0 0 0 +STACK WIN 0 7e393 6 0 0 20 0 0 0 0 0 +STACK WIN 0 7e39e 6 0 0 18 0 0 0 0 0 +STACK WIN 0 14ae7 6 0 0 4 0 0 0 0 0 +STACK WIN 0 7e3a9 6 0 0 c 0 0 0 0 0 +STACK WIN 0 7e3b4 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7e3bf 6 0 0 14 0 0 0 0 0 +STACK WIN 0 7e3e8 8 0 0 10 0 0 0 0 0 +STACK WIN 0 7e43b 6 0 0 4 0 0 0 0 0 +STACK WIN 0 7e45c 8 0 0 14 0 0 0 0 0 +STACK WIN 0 7e469 c 0 0 1c 0 0 0 0 0 +STACK WIN 0 7e47a a 0 0 0 0 0 0 0 0 +STACK WIN 0 7e489 8 0 0 10 0 0 0 0 0 +STACK WIN 0 7e496 5 0 0 20 0 0 0 0 0 +STACK WIN 0 7e4a0 c 0 0 4 0 0 0 0 0 +STACK WIN 0 7e4b1 8 0 0 4 0 0 0 0 0 +STACK WIN 0 7e4be c 0 0 8 0 0 0 0 0 +STACK WIN 0 7e4cf c 0 0 c 0 0 0 0 0 +STACK WIN 0 7e4e0 c 0 0 14 0 0 0 0 0 +STACK WIN 0 7e536 c 0 0 18 0 0 0 0 0 +STACK WIN 0 7e547 e 0 0 8 0 0 0 0 0 +STACK WIN 0 7e55a c 0 0 28 0 0 0 0 0 +STACK WIN 0 7e56b 8 0 0 4 0 0 0 0 0 +STACK WIN 0 7e593 8 0 0 28 0 0 0 0 0 +STACK WIN 0 7e5bc 8 0 0 34 0 0 0 0 0 +STACK WIN 0 7e5c9 5 0 0 28 0 0 0 0 0 +STACK WIN 0 7e5d3 5 0 0 24 0 0 0 0 0 +STACK WIN 0 7e5f5 a 0 0 14 0 0 0 0 0 +STACK WIN 0 7e604 c 0 0 30 0 0 0 0 0 +STACK WIN 0 7e615 d 0 0 4 0 0 0 0 0 +STACK WIN 0 7e659 8 0 0 14 0 0 0 0 0 +STACK WIN 0 7e69c 8 0 0 1c 0 0 0 0 0 +STACK WIN 0 7e6a9 8 0 0 14 0 0 0 0 0 +STACK WIN 0 7e6b6 8 0 0 1c 0 0 0 0 0 +STACK WIN 0 7e6c3 6 0 0 8 0 0 0 0 0 +STACK WIN 0 7e728 8 0 0 4 0 0 0 0 0 +STACK WIN 0 7e735 8 0 0 8 0 0 0 0 0 +STACK WIN 0 7e7f2 6 0 0 c 0 0 0 0 0 +STACK WIN 0 7e7fd 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7e83b 8 0 0 4 0 0 0 0 0 +STACK WIN 0 7e848 5 0 0 8 0 0 0 0 0 +STACK WIN 0 7e878 5 0 0 10 0 0 0 0 0 +STACK WIN 0 7e88d 5 0 0 18 0 0 0 0 0 +STACK WIN 0 260c2 5 0 0 4 0 0 0 0 0 +STACK WIN 0 7e8a8 5 0 0 14 0 0 0 0 0 +STACK WIN 0 7e8b2 5 0 0 c 0 0 0 0 0 +STACK WIN 0 7e98d 3 0 0 4 0 0 0 0 0 +STACK WIN 0 7e9ae 8 0 0 8 0 0 0 0 0 +STACK WIN 0 7e9da 8 0 0 10 0 0 0 0 0 +STACK WIN 0 7e9e7 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7ea40 8 0 0 1c 0 0 0 0 0 +STACK WIN 0 7ea4d 5 0 0 1c 0 0 0 0 0 +STACK WIN 0 7ea57 6 0 0 c 0 0 0 0 0 +STACK WIN 0 7ea62 6 0 0 8 0 0 0 0 0 +STACK WIN 0 7ea6d 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7ea78 6 0 0 18 0 0 0 0 0 +STACK WIN 0 7ea83 6 0 0 4 0 0 0 0 0 +STACK WIN 0 7ea8e 6 0 0 c 0 0 0 0 0 +STACK WIN 0 7ea99 6 0 0 1c 0 0 0 0 0 +STACK WIN 0 7eaa4 6 0 0 14 0 0 0 0 0 +STACK WIN 0 7eac6 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7eacf c 0 0 20 0 0 0 0 0 +STACK WIN 0 7eae0 d 0 0 1c 0 0 0 0 0 +STACK WIN 0 7eaf2 d 0 0 10 0 0 0 0 0 +STACK WIN 0 7eb04 b 0 0 0 0 0 0 0 0 +STACK WIN 0 7eb3c d 0 0 14 0 0 0 0 0 +STACK WIN 0 7eb4e d 0 0 c 0 0 0 0 0 +STACK WIN 0 7eb60 5 0 0 c 0 0 0 0 0 +STACK WIN 0 7eb6a 8 0 0 38 0 0 0 0 0 +STACK WIN 0 7eb77 5 0 0 14 0 0 0 0 0 +STACK WIN 0 7eb81 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7eb8c 8 0 0 1c 0 0 0 0 0 +STACK WIN 0 7ebbe 8 0 0 18 0 0 0 0 0 +STACK WIN 0 7ebcb 8 0 0 4 0 0 0 0 0 +STACK WIN 0 7ebd8 8 0 0 14 0 0 0 0 0 +STACK WIN 0 7ebe5 8 0 0 10 0 0 0 0 0 +STACK WIN 0 7ebf2 8 0 0 24 0 0 0 0 0 +STACK WIN 0 7ebff 8 0 0 8 0 0 0 0 0 +STACK WIN 0 7ec0c 8 0 0 c 0 0 0 0 0 +STACK WIN 0 7ec19 3 0 0 18 0 0 0 0 0 +STACK WIN 0 7ec21 8 0 0 4 0 0 0 0 0 +STACK WIN 0 7ec4c 8 0 0 8 0 0 0 0 0 +STACK WIN 0 7ec59 3 0 0 0 0 0 0 0 0 +STACK WIN 0 7ec98 4 0 0 0 0 0 0 0 0 +STACK WIN 0 7ecbf 8 0 0 c 0 0 0 0 0 +STACK WIN 0 7eccc 8 0 0 18 0 0 0 0 0 +STACK WIN 0 7ecd9 8 0 0 24 0 0 0 0 0 +STACK WIN 0 7ece6 8 0 0 10 0 0 0 0 0 +STACK WIN 0 7ed3f 3 0 0 10 0 0 0 0 0 +STACK WIN 0 7ed47 8 0 0 1c 0 0 0 0 0 +STACK WIN 0 7ed54 5 0 0 38 0 0 0 0 0 +STACK WIN 0 7ed98 8 0 0 8 0 0 0 0 0 +STACK WIN 0 7eda5 8 0 0 c 0 0 0 0 0 +STACK WIN 0 7edb2 8 0 0 4 0 0 0 0 0 +STACK WIN 0 7edbf 8 0 0 2c 0 0 0 0 0 +STACK WIN 0 7edcc 8 0 0 14 0 0 0 0 0 +STACK WIN 0 7edd9 8 0 0 8 0 0 0 0 0 +STACK WIN 0 7ede6 8 0 0 10 0 0 0 0 0 +STACK WIN 0 7ee61 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7ee6c 8 0 0 20 0 0 0 0 0 +STACK WIN 0 7ee79 8 0 0 20 0 0 0 0 0 +STACK WIN 0 7ee86 8 0 0 10 0 0 0 0 0 +STACK WIN 0 7ee93 8 0 0 c 0 0 0 0 0 +STACK WIN 0 7eea0 8 0 0 1c 0 0 0 0 0 +STACK WIN 0 7eead 6 0 0 4 0 0 0 0 0 +STACK WIN 0 7eeb8 8 0 0 24 0 0 0 0 0 +STACK WIN 0 7eec5 8 0 0 18 0 0 0 0 0 +STACK WIN 0 7eed2 8 0 0 14 0 0 0 0 0 +STACK WIN 0 7eedf 8 0 0 20 0 0 0 0 0 +STACK WIN 0 7ef1e 6 0 0 0 0 0 0 0 0 +STACK WIN 0 7ef94 7 0 0 4 0 0 0 0 0 +STACK WIN 0 7efa0 7 0 0 c 0 0 0 0 0 +STACK WIN 0 7efac 7 0 0 8 0 0 0 0 0 +STACK WIN 0 7efb8 7 0 0 10 0 0 0 0 0 +STACK WIN 0 7efc4 7 0 0 28 0 0 0 0 0 +STACK WIN 0 7efd0 7 0 0 20 0 0 0 0 0 +STACK WIN 0 7efdc 6 0 0 4 0 0 0 0 0 +STACK WIN 0 7efe7 6 0 0 18 0 0 0 0 0 +STACK WIN 0 7f052 3 0 0 0 0 0 0 0 0 +STACK WIN 0 7f05a 3 0 0 c 0 0 0 0 0 +STACK WIN 0 7f062 6 0 0 2c 0 0 0 0 0 +STACK WIN 0 7f06d 6 0 0 30 0 0 0 0 0 +STACK WIN 0 7f078 3 0 0 8 0 0 0 0 0 +STACK WIN 0 7f0b0 6 0 0 20 0 0 0 0 0 +STACK WIN 0 7f0bb 5 0 0 4 0 0 0 0 0 +STACK WIN 0 7f0c5 6 0 0 c 0 0 0 0 0 +STACK WIN 0 7f0f5 3 0 0 14 0 0 0 0 0 +STACK WIN 0 7f0fd 6 0 0 0 0 0 0 0 0 +STACK WIN 0 7f125 8 0 0 4 0 0 0 0 0 +STACK WIN 0 7f132 5 0 0 2c 0 0 0 0 0 +STACK WIN 0 7f13c 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7f147 6 0 0 8 0 0 0 0 0 +STACK WIN 0 7f152 6 0 0 14 0 0 0 0 0 +STACK WIN 0 7f19b c 0 0 4 0 0 0 0 0 +STACK WIN 0 7f1ac 6 0 0 c 0 0 0 0 0 +STACK WIN 0 7f1d0 6 0 0 4 0 0 0 0 0 +STACK WIN 0 7f1db 6 0 0 4 0 0 0 0 0 +STACK WIN 0 7f1e6 6 0 0 4 0 0 0 0 0 +STACK WIN 0 7f1f1 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7f1fe 1 0 0 0 0 0 0 0 0 +STACK WIN 0 7f204 c 0 0 10 0 0 0 0 0 +STACK WIN 0 7f215 6 0 0 8 0 0 0 0 0 +STACK WIN 0 7f23b 6 0 0 1c 0 0 0 0 0 +STACK WIN 0 7f246 6 0 0 24 0 0 0 0 0 +STACK WIN 0 7f251 6 0 0 8 0 0 0 0 0 +STACK WIN 0 7f2c2 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7f2cd 8 0 0 4 0 0 0 0 0 +STACK WIN 0 7f2da 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7f2e5 8 0 0 c 0 0 0 0 0 +STACK WIN 0 7f3c0 7 0 0 1c 0 0 0 0 0 +STACK WIN 0 7f3cc 7 0 0 24 0 0 0 0 0 +STACK WIN 0 7f49f 6 0 0 4 0 0 0 0 0 +STACK WIN 0 7f4aa 6 0 0 18 0 0 0 0 0 +STACK WIN 0 7f4b5 6 0 0 1c 0 0 0 0 0 +STACK WIN 0 7f4c0 6 0 0 8 0 0 0 0 0 +STACK WIN 0 7f502 6 0 0 24 0 0 0 0 0 +STACK WIN 0 7f50d 6 0 0 c 0 0 0 0 0 +STACK WIN 0 7f536 6 0 0 14 0 0 0 0 0 +STACK WIN 0 7f55c 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7f59d c 0 0 24 0 0 0 0 0 +STACK WIN 0 7f5ae 6 0 0 1c 0 0 0 0 0 +STACK WIN 0 7f5b9 6 0 0 c 0 0 0 0 0 +STACK WIN 0 7f5c4 6 0 0 10 0 0 0 0 0 +STACK WIN 0 7f5cf 6 0 0 4 0 0 0 0 0 +STACK WIN 0 7f5da 6 0 0 8 0 0 0 0 0 +STACK WIN 0 7f5e5 6 0 0 14 0 0 0 0 0 +STACK WIN 0 7f5f0 6 0 0 18 0 0 0 0 0 +STACK WIN 0 7f5fb 6 0 0 20 0 0 0 0 0 +STACK WIN 0 7f606 f 0 0 10 0 0 0 0 0 +STACK WIN 0 7f61a f 0 0 14 0 0 0 0 0 +STACK WIN 0 7f62e d 0 0 0 0 0 0 0 0 +STACK WIN 0 7f640 10 0 0 4 0 0 0 0 0 +STACK WIN 0 7f655 f 0 0 18 0 0 0 0 0 +STACK WIN 0 7f669 f 0 0 c 0 0 0 0 0 +STACK WIN 0 7f67d f 0 0 4 0 0 0 0 0 +STACK WIN 0 7f691 f 0 0 8 0 0 0 0 0 +STACK WIN 0 7f6a5 8 0 0 5c 0 0 0 0 0 +STACK WIN 0 7f6b2 c 0 0 2c 0 0 0 0 0 +STACK WIN 0 7f6c3 6 0 0 28 0 0 0 0 0 +STACK WIN 0 7f6ce 6 0 0 c 0 0 0 0 0 +STACK WIN 0 7f6d9 5 0 0 30 0 0 0 0 0 +STACK WIN 0 7f731 8 0 0 20 0 0 0 0 0 +STACK WIN 0 7f782 8 0 0 4 0 0 0 0 0 +STACK WIN 0 7f846 8 0 0 14 0 0 0 0 0 +STACK WIN 0 39aa8 e6 a 0 c 1c 0 0 0 1 +STACK WIN 0 dedf 70 3 0 8 c 0 0 0 0 +STACK WIN 0 df4f 23 0 0 0 0 0 0 0 0 +STACK WIN 0 7fc40 12 0 0 0 0 0 0 0 0 diff --git a/src/processor/testdata/symbols/ld-2.13.so/C32AD7E235EA6112E02A5B9D6219C4850/ld-2.13.so.sym b/src/processor/testdata/symbols/ld-2.13.so/C32AD7E235EA6112E02A5B9D6219C4850/ld-2.13.so.sym new file mode 100644 index 0000000..b15688e --- /dev/null +++ b/src/processor/testdata/symbols/ld-2.13.so/C32AD7E235EA6112E02A5B9D6219C4850/ld-2.13.so.sym @@ -0,0 +1,782 @@ +MODULE Linux x86_64 C32AD7E235EA6112E02A5B9D6219C4850 ld-2.13.so +PUBLIC 8600 0 _dl_rtld_di_serinfo +PUBLIC e780 0 _dl_debug_state +PUBLIC fa80 0 _dl_mcount +PUBLIC 106e0 0 _dl_get_tls_static_info +PUBLIC 10930 0 _dl_allocate_tls_init +PUBLIC 10cf0 0 _dl_deallocate_tls +PUBLIC 110c0 0 __tls_get_addr +PUBLIC 11260 0 _dl_allocate_tls +PUBLIC 114a0 0 _dl_tls_setup +PUBLIC 117a0 0 _dl_make_stack_executable +PUBLIC 15480 0 free +PUBLIC 154c0 0 __libc_memalign +PUBLIC 155c0 0 malloc +PUBLIC 155d0 0 realloc +PUBLIC 15680 0 calloc +STACK CFI INIT b40 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b50 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b60 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b70 69 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b71 .cfa: $rsp 16 + +STACK CFI b74 $rbx: .cfa -16 + ^ +STACK CFI b7e .cfa: $rsp 48 + +STACK CFI INIT be0 49 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI be1 .cfa: $rsp 16 + +STACK CFI be4 $rbx: .cfa -16 + ^ +STACK CFI bfb .cfa: $rsp 32 + +STACK CFI INIT c30 4ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c32 .cfa: $rsp 16 + +STACK CFI c3e .cfa: $rsp 24 + +STACK CFI c41 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI c43 .cfa: $rsp 32 + +STACK CFI c44 .cfa: $rsp 40 + +STACK CFI c45 .cfa: $rsp 48 + +STACK CFI c4c $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI c53 .cfa: $rsp 320 + +STACK CFI INIT 1120 600 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1121 .cfa: $rsp 16 + +STACK CFI 1124 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 1130 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 1720 9b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 172d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 1736 .cfa: $rsp 96 + +STACK CFI 1739 $r12: .cfa -16 + ^ +STACK CFI INIT 17c0 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1800 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1840 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1841 .cfa: $rsp 16 + +STACK CFI 1844 $rbx: .cfa -16 + ^ +STACK CFI INIT 1870 92 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1871 .cfa: $rsp 16 + +STACK CFI 1872 .cfa: $rsp 24 + +STACK CFI 1876 .cfa: $rsp 48 + +STACK CFI 187b $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1910 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1930 217 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1931 .cfa: $rsp 16 + +STACK CFI 1934 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 193d $r14: .cfa -24 + ^ +STACK CFI 1946 $r13: .cfa -32 + ^ +STACK CFI 194c $r12: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 1b50 6cb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1b51 .cfa: $rsp 16 + +STACK CFI 1b62 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 1b6f $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 1b75 $r12: .cfa -48 + ^ +STACK CFI 1bb3 $rbx: .cfa -56 + ^ +STACK CFI INIT 2220 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2227 .cfa: $rsp 16 + +STACK CFI INIT 2240 163 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2252 .cfa: $rsp 16 + +STACK CFI 225b $rbx: .cfa -16 + ^ +STACK CFI INIT 23b0 128 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 23c3 .cfa: $rsp 48 + +STACK CFI 23d8 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 24e0 272f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 24e1 .cfa: $rsp 16 + +STACK CFI 24eb $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 24f2 $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 2500 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ +STACK CFI 2551 $rbx: .cfa -56 + ^ +STACK CFI INIT 4c10 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4c11 .cfa: $rsp 16 + +STACK CFI 4c14 $rbx: .cfa -16 + ^ +STACK CFI INIT 4c50 f7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4d50 ae .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4d52 .cfa: $rsp 16 + +STACK CFI 4d58 $r13: .cfa -16 + ^ +STACK CFI 4d5a .cfa: $rsp 24 + +STACK CFI 4d5d $r12: .cfa -24 + ^ +STACK CFI 4d5e .cfa: $rsp 32 + +STACK CFI 4d60 $rbp: .cfa -32 + ^ +STACK CFI 4d61 .cfa: $rsp 40 + +STACK CFI 4d65 .cfa: $rsp 48 + +STACK CFI 4d67 $rbx: .cfa -40 + ^ +STACK CFI INIT 4e00 57 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4e0e .cfa: $rsp 32 + +STACK CFI 4e11 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 4e60 32a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4e62 .cfa: $rsp 16 + +STACK CFI 4e64 .cfa: $rsp 24 + +STACK CFI 4e66 .cfa: $rsp 32 + +STACK CFI 4e69 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 4e6b .cfa: $rsp 40 + +STACK CFI 4e6c .cfa: $rsp 48 + +STACK CFI 4e6e $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 4e6f .cfa: $rsp 56 + +STACK CFI 4e72 $rbx: .cfa -56 + ^ +STACK CFI 4e76 .cfa: $rsp 128 + +STACK CFI INIT 5190 dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5192 .cfa: $rsp 16 + +STACK CFI 5194 .cfa: $rsp 24 + +STACK CFI 5197 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI 5198 .cfa: $rsp 32 + +STACK CFI 5199 .cfa: $rsp 40 + +STACK CFI 519c $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 51a0 .cfa: $rsp 48 + +STACK CFI INIT 5270 176 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5271 .cfa: $rsp 16 + +STACK CFI 5277 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI INIT 53f0 19c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 53f1 .cfa: $rsp 16 + +STACK CFI 53f4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 53ff $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 542e $rbx: .cfa -56 + ^ +STACK CFI INIT 5590 72 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 559c $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 55b7 .cfa: $rsp 64 + +STACK CFI 55bd $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 5610 58c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5611 .cfa: $rsp 16 + +STACK CFI 5617 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 561c $r15: .cfa -24 + ^ +STACK CFI 5625 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 5629 $rbx: .cfa -56 + ^ +STACK CFI INIT 5ba0 438 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5ba1 .cfa: $rsp 16 + +STACK CFI 5ba4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 5bf0 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 5fe0 119d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5fe1 .cfa: $rsp 16 + +STACK CFI 5fe4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 5feb $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 5ff0 $r13: .cfa -40 + ^ +STACK CFI 5ff5 $r12: .cfa -48 + ^ +STACK CFI 6017 $rbx: .cfa -56 + ^ +STACK CFI INIT 7180 2c7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7182 .cfa: $rsp 16 + +STACK CFI 718b $r15: .cfa -16 + ^ +STACK CFI 718d .cfa: $rsp 24 + +STACK CFI 7190 $r14: .cfa -24 + ^ +STACK CFI 7192 .cfa: $rsp 32 + +STACK CFI 7195 $r13: .cfa -32 + ^ +STACK CFI 7197 .cfa: $rsp 40 + +STACK CFI 719a $r12: .cfa -40 + ^ +STACK CFI 719b .cfa: $rsp 48 + +STACK CFI 719c .cfa: $rsp 56 + +STACK CFI 719f $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 71a6 .cfa: $rsp 96 + +STACK CFI INIT 7450 18f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7458 $rbx: .cfa -48 + ^ +STACK CFI 746a $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $rbp: .cfa -40 + ^ +STACK CFI 7478 .cfa: $rsp 48 + +STACK CFI 747e $r14: .cfa -16 + ^ +STACK CFI INIT 75e0 171 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 75e2 .cfa: $rsp 16 + +STACK CFI 75eb .cfa: $rsp 24 + +STACK CFI 75ee $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 75f3 .cfa: $rsp 32 + +STACK CFI 75f6 $r12: .cfa -32 + ^ +STACK CFI 75fa .cfa: $rsp 40 + +STACK CFI 75fb .cfa: $rsp 48 + +STACK CFI 7605 $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 7760 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 77b0 8e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 77b2 .cfa: $rsp 16 + +STACK CFI 77b4 .cfa: $rsp 24 + +STACK CFI 77b7 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 77b9 .cfa: $rsp 32 + +STACK CFI 77bb .cfa: $rsp 40 + +STACK CFI 77be $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 77bf .cfa: $rsp 48 + +STACK CFI 77c2 $rbp: .cfa -48 + ^ +STACK CFI 77c3 .cfa: $rsp 56 + +STACK CFI 77c6 $rbx: .cfa -56 + ^ +STACK CFI 77cd .cfa: $rsp 1072 + +STACK CFI INIT 80a0 48a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 80a1 .cfa: $rsp 16 + +STACK CFI 80b2 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 80bb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 80ca $rbx: .cfa -48 + ^ +STACK CFI INIT 8530 cb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8532 .cfa: $rsp 16 + +STACK CFI 8534 .cfa: $rsp 24 + +STACK CFI 8536 .cfa: $rsp 32 + +STACK CFI 8537 .cfa: $rsp 40 + +STACK CFI 8538 .cfa: $rsp 48 + +STACK CFI 853b $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 8600 1b6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 860d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 861b .cfa: $rsp 80 + +STACK CFI 8623 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 87c0 e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 88b0 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 88b4 .cfa: $rsp 16 + +STACK CFI INIT 88f0 629 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 88f2 .cfa: $rsp 16 + +STACK CFI 88f4 .cfa: $rsp 24 + +STACK CFI 88f6 .cfa: $rsp 32 + +STACK CFI 88f8 .cfa: $rsp 40 + +STACK CFI 88f9 .cfa: $rsp 48 + +STACK CFI 88fa .cfa: $rsp 56 + +STACK CFI 88fd $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 8901 .cfa: $rsp 96 + +STACK CFI INIT 8f20 72 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8f21 .cfa: $rsp 16 + +STACK CFI 8f28 $rbp: .cfa -16 + ^ +STACK CFI 8f29 .cfa: $rsp 24 + +STACK CFI 8f2b $rbx: .cfa -24 + ^ +STACK CFI INIT 8fa0 bb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8fa4 .cfa: $rsp 16 + +STACK CFI INIT 9060 1b5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 906d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 907b .cfa: $rsp 64 + +STACK CFI 908b $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 9220 873 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9222 .cfa: $rsp 16 + +STACK CFI 9225 $r15: .cfa -16 + ^ +STACK CFI 9227 .cfa: $rsp 24 + +STACK CFI 9229 .cfa: $rsp 32 + +STACK CFI 922c $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 922e .cfa: $rsp 40 + +STACK CFI 922f .cfa: $rsp 48 + +STACK CFI 9230 .cfa: $rsp 56 + +STACK CFI 9237 .cfa: $rsp 208 + +STACK CFI 923b $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 9aa0 f15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9aa1 .cfa: $rsp 16 + +STACK CFI 9aa4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 9aac $r15: .cfa -24 + ^ +STACK CFI 9ab1 $r14: .cfa -32 + ^ +STACK CFI 9ab6 $r13: .cfa -40 + ^ +STACK CFI 9ac0 $r12: .cfa -48 + ^ +STACK CFI 9ae7 $rbx: .cfa -56 + ^ +STACK CFI INIT a9c0 96 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a9c1 .cfa: $rsp 16 + +STACK CFI a9c4 $rbp: .cfa -16 + ^ +STACK CFI a9c5 .cfa: $rsp 24 + +STACK CFI a9c8 $rbx: .cfa -24 + ^ +STACK CFI a9d3 .cfa: $rsp 32 + +STACK CFI INIT aa60 348 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aa62 .cfa: $rsp 16 + +STACK CFI aa65 $r15: .cfa -16 + ^ +STACK CFI aa67 .cfa: $rsp 24 + +STACK CFI aa69 .cfa: $rsp 32 + +STACK CFI aa6b .cfa: $rsp 40 + +STACK CFI aa6c .cfa: $rsp 48 + +STACK CFI aa6f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI aa70 .cfa: $rsp 56 + +STACK CFI aa73 $rbx: .cfa -56 + ^ +STACK CFI aa7a .cfa: $rsp 96 + +STACK CFI INIT adb0 d9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI adc8 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI adcc .cfa: $rsp 80 + +STACK CFI INIT ae90 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ae98 .cfa: $rsp 16 + +STACK CFI ae9b $rbx: .cfa -16 + ^ +STACK CFI INIT aef0 8f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aef4 .cfa: $rsp 16 + +STACK CFI af04 $rbx: .cfa -16 + ^ +STACK CFI INIT af80 c9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI af81 .cfa: $rsp 16 + +STACK CFI af8c $rbx: .cfa -16 + ^ +STACK CFI INIT b050 2d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b051 .cfa: $rsp 16 + +STACK CFI b05c $rbx: .cfa -16 + ^ +STACK CFI INIT b080 f97 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b081 .cfa: $rsp 16 + +STACK CFI b084 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI b08f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI b097 $rbx: .cfa -56 + ^ +STACK CFI INIT c020 7d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c022 .cfa: $rsp 16 + +STACK CFI c025 $r12: .cfa -16 + ^ +STACK CFI c026 .cfa: $rsp 24 + +STACK CFI c02a $rbp: .cfa -24 + ^ +STACK CFI c02b .cfa: $rsp 32 + +STACK CFI c04d $rbx: .cfa -32 + ^ +STACK CFI INIT c0a0 1134 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c0a1 .cfa: $rsp 16 + +STACK CFI c0a7 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI c11b $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d1e0 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d1e1 .cfa: $rsp 16 + +STACK CFI d1e4 $rbx: .cfa -16 + ^ +STACK CFI INIT d220 10f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d222 .cfa: $rsp 16 + +STACK CFI d225 $r15: .cfa -16 + ^ +STACK CFI d227 .cfa: $rsp 24 + +STACK CFI d229 .cfa: $rsp 32 + +STACK CFI d22b .cfa: $rsp 40 + +STACK CFI d22e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI d233 .cfa: $rsp 48 + +STACK CFI d234 .cfa: $rsp 56 + +STACK CFI d238 .cfa: $rsp 144 + +STACK CFI d246 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d330 5c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d332 .cfa: $rsp 16 + +STACK CFI d336 .cfa: $rsp 24 + +STACK CFI d338 .cfa: $rsp 32 + +STACK CFI d33a .cfa: $rsp 40 + +STACK CFI d33d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI d33e .cfa: $rsp 48 + +STACK CFI d341 $rbp: .cfa -48 + ^ +STACK CFI d346 .cfa: $rsp 56 + +STACK CFI d34d .cfa: $rsp 208 + +STACK CFI d367 $rbx: .cfa -56 + ^ +STACK CFI INIT d900 1ee .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d902 .cfa: $rsp 16 + +STACK CFI d90a .cfa: $rsp 24 + +STACK CFI d90f .cfa: $rsp 32 + +STACK CFI d910 .cfa: $rsp 40 + +STACK CFI d914 .cfa: $rsp 80 + +STACK CFI d91f $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT daf0 7f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dafd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI db18 .cfa: $rsp 64 + +STACK CFI db1b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT db70 e2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db71 .cfa: $rsp 16 + +STACK CFI db78 .cfa: $rsp 304 + +STACK CFI db9a $rbx: .cfa -16 + ^ +STACK CFI INIT dc60 1a1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dc7e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI dc8f .cfa: $rsp 1136 + +STACK CFI dca6 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT de10 9a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de1d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI de2b .cfa: $rsp 48 + +STACK CFI de38 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT deb0 14f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI debc $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI dec9 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI ded7 .cfa: $rsp 64 + +STACK CFI deec $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT e000 10e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e002 .cfa: $rsp 16 + +STACK CFI e004 .cfa: $rsp 24 + +STACK CFI e006 .cfa: $rsp 32 + +STACK CFI e009 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI e00b .cfa: $rsp 40 + +STACK CFI e00e $r12: .cfa -40 + ^ +STACK CFI e00f .cfa: $rsp 48 + +STACK CFI e011 $rbp: .cfa -48 + ^ +STACK CFI e012 .cfa: $rsp 56 + +STACK CFI e015 $rbx: .cfa -56 + ^ +STACK CFI e019 .cfa: $rsp 80 + +STACK CFI INIT e110 1f8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e111 .cfa: $rsp 16 + +STACK CFI e114 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI e120 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT e310 3d9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e311 .cfa: $rsp 16 + +STACK CFI e314 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI e31f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI e322 $rbx: .cfa -56 + ^ +STACK CFI INIT e6f0 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e780 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e790 7b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e810 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e811 .cfa: $rsp 16 + +STACK CFI e814 $rbp: .cfa -16 + ^ +STACK CFI e815 .cfa: $rsp 24 + +STACK CFI e818 $rbx: .cfa -24 + ^ +STACK CFI e81c .cfa: $rsp 32 + +STACK CFI INIT e870 5f8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e871 .cfa: $rsp 16 + +STACK CFI e884 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI e88d $r15: .cfa -24 + ^ +STACK CFI e893 $r14: .cfa -32 + ^ +STACK CFI e898 $r13: .cfa -40 + ^ +STACK CFI e89d $r12: .cfa -48 + ^ +STACK CFI e8a0 $rbx: .cfa -56 + ^ +STACK CFI INIT ee70 95 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee77 .cfa: $rsp 224 + +STACK CFI INIT ef10 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef17 .cfa: $rsp 224 + +STACK CFI INIT efc0 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI efc7 .cfa: $rsp 224 + +STACK CFI INIT f070 ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f089 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI f090 .cfa: $rsp 192 + +STACK CFI INIT f120 3f1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f121 .cfa: $rsp 16 + +STACK CFI f124 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f12f $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI f15a $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI INIT f520 4e5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f521 .cfa: $rsp 16 + +STACK CFI f524 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f52d $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI f54d $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT fa10 61 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fa12 .cfa: $rsp 16 + +STACK CFI fa15 $r13: .cfa -16 + ^ +STACK CFI fa17 .cfa: $rsp 24 + +STACK CFI fa1a $r12: .cfa -24 + ^ +STACK CFI fa1b .cfa: $rsp 32 + +STACK CFI fa1d $rbp: .cfa -32 + ^ +STACK CFI fa1e .cfa: $rsp 40 + +STACK CFI fa21 $rbx: .cfa -40 + ^ +STACK CFI fa25 .cfa: $rsp 48 + +STACK CFI INIT fa80 299 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI faa7 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT fd20 7eb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fd21 .cfa: $rsp 16 + +STACK CFI fd24 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI fd66 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 10510 1c6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1051d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 1052a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 10538 .cfa: $rsp 80 + +STACK CFI 10548 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 106e0 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10700 d7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10702 .cfa: $rsp 16 + +STACK CFI 1070a .cfa: $rsp 24 + +STACK CFI 1070d $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI 1070e .cfa: $rsp 32 + +STACK CFI 10715 $rbx: .cfa -32 + ^ +STACK CFI INIT 107e0 63 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10850 de .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10854 .cfa: $rsp 16 + +STACK CFI INIT 10930 23c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10932 .cfa: $rsp 16 + +STACK CFI 10934 .cfa: $rsp 24 + +STACK CFI 10936 .cfa: $rsp 32 + +STACK CFI 10938 .cfa: $rsp 40 + +STACK CFI 10939 .cfa: $rsp 48 + +STACK CFI 1093a .cfa: $rsp 56 + +STACK CFI 1093e .cfa: $rsp 96 + +STACK CFI 1094c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 10b70 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10b80 .cfa: $rsp 16 + +STACK CFI INIT 10ba0 143 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10bad $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 10bbb .cfa: $rsp 48 + +STACK CFI 10bc4 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 10cf0 a1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10cf2 .cfa: $rsp 16 + +STACK CFI 10cf5 $r15: .cfa -16 + ^ +STACK CFI 10cf7 .cfa: $rsp 24 + +STACK CFI 10cf9 .cfa: $rsp 32 + +STACK CFI 10cfb .cfa: $rsp 40 + +STACK CFI 10cfe $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 10cff .cfa: $rsp 48 + +STACK CFI 10d00 .cfa: $rsp 56 + +STACK CFI 10d03 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10d07 .cfa: $rsp 64 + +STACK CFI INIT 10da0 31b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10da2 .cfa: $rsp 16 + +STACK CFI 10da4 .cfa: $rsp 24 + +STACK CFI 10da6 .cfa: $rsp 32 + +STACK CFI 10da8 .cfa: $rsp 40 + +STACK CFI 10da9 .cfa: $rsp 48 + +STACK CFI 10daa .cfa: $rsp 56 + +STACK CFI 10dae .cfa: $rsp 128 + +STACK CFI 10dd3 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 110c0 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 110c1 .cfa: $rsp 16 + +STACK CFI 110c4 $rbx: .cfa -16 + ^ +STACK CFI INIT 11120 131 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11122 .cfa: $rsp 16 + +STACK CFI 1112a .cfa: $rsp 24 + +STACK CFI 1112b .cfa: $rsp 32 + +STACK CFI 11132 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 11260 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1126e .cfa: $rsp 32 + +STACK CFI 11274 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 112d0 1c9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 112d2 .cfa: $rsp 16 + +STACK CFI 112d4 .cfa: $rsp 24 + +STACK CFI 112d6 .cfa: $rsp 32 + +STACK CFI 112d8 .cfa: $rsp 40 + +STACK CFI 112d9 .cfa: $rsp 48 + +STACK CFI 112da .cfa: $rsp 56 + +STACK CFI 112de .cfa: $rsp 64 + +STACK CFI 112e5 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 114a0 a1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 114a4 .cfa: $rsp 16 + +STACK CFI INIT 11550 179 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11551 .cfa: $rsp 16 + +STACK CFI 11563 .cfa: $rsp 24 + +STACK CFI 1156a .cfa: $rsp 4128 + +STACK CFI 11576 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 116d0 cb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 116dd $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 116e1 .cfa: $rsp 32 + +STACK CFI INIT 117a0 91 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 117ad $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI 117b6 .cfa: $rsp 32 + +STACK CFI 117be $rbp: .cfa -24 + ^ +STACK CFI INIT 11840 1d4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11842 .cfa: $rsp 16 + +STACK CFI 1184e .cfa: $rsp 24 + +STACK CFI 11853 .cfa: $rsp 32 + +STACK CFI 11855 .cfa: $rsp 40 + +STACK CFI 11856 .cfa: $rsp 48 + +STACK CFI 11857 .cfa: $rsp 56 + +STACK CFI 11862 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 11a20 63 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11a90 364 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11a91 .cfa: $rsp 16 + +STACK CFI 11a94 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 11a9e $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 11aa9 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 11abb $r15: .cfa -24 + ^ +STACK CFI INIT 11e00 1d4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11e02 .cfa: $rsp 16 + +STACK CFI 11e06 .cfa: $rsp 24 + +STACK CFI 11e08 .cfa: $rsp 32 + +STACK CFI 11e09 .cfa: $rsp 40 + +STACK CFI 11e0c $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI 11e0d .cfa: $rsp 48 + +STACK CFI 11e19 $rbx: .cfa -48 + ^ +STACK CFI INIT 11fe0 9a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11fe1 .cfa: $rsp 16 + +STACK CFI 11fe9 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 11ff5 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 12990 158 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 12991 .cfa: $rsp 16 + +STACK CFI 12997 $rbp: .cfa -16 + ^ +STACK CFI 1299b .cfa: $rsp 24 + +STACK CFI 1299e $rbx: .cfa -24 + ^ +STACK CFI 129a2 .cfa: $rsp 32 + +STACK CFI INIT 12af0 eaa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 12af1 .cfa: $rsp 16 + +STACK CFI 12b0b $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 12b2e $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 139a0 80 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 139a1 .cfa: $rsp 16 + +STACK CFI 139ab $rbx: .cfa -16 + ^ +STACK CFI INIT 13a20 61 .cfa: $rsp 24 + .ra: .cfa -8 + ^ +STACK CFI 13a24 .cfa: $rsp 80 + +STACK CFI 13a7e .cfa: $rsp 8 + +STACK CFI INIT 13a90 55d .cfa: $rsp 24 + .ra: .cfa -8 + ^ +STACK CFI 13a94 .cfa: $rsp 56 + +STACK CFI 13a98 $rbx: .cfa -56 + ^ +STACK CFI 13aa0 .cfa: $rbx 56 + +STACK CFI 13dfa $rbx: $rbx .cfa: $rsp 56 + +STACK CFI 13dfe .cfa: $rsp 8 + +STACK CFI 13e01 $rbx: .cfa -56 + ^ .cfa: $rbx 56 + +STACK CFI 13eda $rbx: $rbx .cfa: $rsp 56 + +STACK CFI 13ede .cfa: $rsp 8 + +STACK CFI 13edf $rbx: .cfa -56 + ^ .cfa: $rbx 56 + +STACK CFI 13f60 $rbx: $rbx .cfa: $rsp 56 + +STACK CFI 13f64 .cfa: $rsp 8 + +STACK CFI 13f67 $rbx: .cfa -56 + ^ .cfa: $rbx 56 + +STACK CFI 13fe8 $rbx: $rbx .cfa: $rsp 56 + +STACK CFI 13fec .cfa: $rsp 8 + +STACK CFI INIT 13ff0 e6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 140e0 ab .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 14190 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 141a0 1c1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 141a2 .cfa: $rsp 16 + +STACK CFI 141a3 .cfa: $rsp 24 + +STACK CFI 141a4 .cfa: $rsp 32 + +STACK CFI 141ab .cfa: $rsp 496 + +STACK CFI 141b2 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 14370 741 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 14371 .cfa: $rsp 16 + +STACK CFI 14374 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 1437f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 1438e $rbx: .cfa -56 + ^ +STACK CFI INIT 14ac0 18a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 14ac2 .cfa: $rsp 16 + +STACK CFI 14ac4 .cfa: $rsp 24 + +STACK CFI 14ac6 .cfa: $rsp 32 + +STACK CFI 14ac8 .cfa: $rsp 40 + +STACK CFI 14ac9 .cfa: $rsp 48 + +STACK CFI 14aca .cfa: $rsp 56 + +STACK CFI 14ace .cfa: $rsp 160 + +STACK CFI 14ad5 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 14c50 325 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 14c52 .cfa: $rsp 16 + +STACK CFI 14c54 .cfa: $rsp 24 + +STACK CFI 14c56 .cfa: $rsp 32 + +STACK CFI 14c58 .cfa: $rsp 40 + +STACK CFI 14c59 .cfa: $rsp 48 + +STACK CFI 14c5c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI 14c5d .cfa: $rsp 56 + +STACK CFI 14c61 .cfa: $rsp 80 + +STACK CFI 14c90 $rbx: .cfa -56 + ^ +STACK CFI INIT 14f80 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 14ff0 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 15030 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 15040 e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15044 .cfa: $rsp 16 + +STACK CFI INIT 15050 4c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15054 .cfa: $rsp 32 + +STACK CFI INIT 150a0 93 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 150a4 .cfa: $rsp 16 + +STACK CFI INIT 15140 53 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15144 .cfa: $rsp 16 + +STACK CFI INIT 151a0 173 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 151a4 .cfa: $rsp 16 + +STACK CFI INIT 15320 d8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 15400 74 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1540d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 15419 .cfa: $rsp 448 + +STACK CFI 1541c $r12: .cfa -16 + ^ +STACK CFI INIT 15480 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15484 .cfa: $rsp 16 + +STACK CFI INIT 154c0 f4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 154c1 .cfa: $rsp 16 + +STACK CFI 154c4 $rbp: .cfa -16 + ^ +STACK CFI 154c5 .cfa: $rsp 24 + +STACK CFI 154c9 .cfa: $rsp 32 + +STACK CFI 154d9 $rbx: .cfa -24 + ^ +STACK CFI INIT 155c0 d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 155d0 ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 155de .cfa: $rsp 32 + +STACK CFI 155e4 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 15680 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 156c0 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 15710 91 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1571e .cfa: $rsp 32 + +STACK CFI 15725 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 157b0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 157c0 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 157d0 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 157d4 .cfa: $rsp 16 + +STACK CFI INIT 15810 93 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15812 .cfa: $rsp 16 + +STACK CFI 15814 .cfa: $rsp 24 + +STACK CFI 15815 .cfa: $rsp 32 + +STACK CFI 15816 .cfa: $rsp 40 + +STACK CFI 15819 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 1581d .cfa: $rsp 48 + +STACK CFI INIT 158b0 2b9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 158b2 .cfa: $rsp 16 + +STACK CFI 158b4 .cfa: $rsp 24 + +STACK CFI 158b6 .cfa: $rsp 32 + +STACK CFI 158b9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 158c2 .cfa: $rsp 40 + +STACK CFI 158c5 $r12: .cfa -40 + ^ +STACK CFI 158c6 .cfa: $rsp 48 + +STACK CFI 158c7 .cfa: $rsp 56 + +STACK CFI 158cb $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 80 + +STACK CFI INIT 15b70 1cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15b7d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 15b86 .cfa: $rsp 80 + +STACK CFI 15b97 $r12: .cfa -16 + ^ +STACK CFI INIT 15d40 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 15d45 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 15d5e 96 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15dad .cfa: $rsp 80 + +STACK CFI 15df2 .cfa: $rsp 8 + +STACK CFI INIT 15df4 7b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15e00 .cfa: $rsp 16 + +STACK CFI 15e04 .cfa: $rsp 88 + +STACK CFI 15e6d .cfa: $rsp 8 + +STACK CFI INIT 15e6f 73 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15e74 .cfa: $rsp 80 + +STACK CFI 15edf .cfa: $rsp 8 + +STACK CFI INIT 15ef0 c3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15f03 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 15f0a .cfa: $rsp 176 + +STACK CFI INIT 15fc0 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 15fc4 .cfa: $rsp 16 + +STACK CFI INIT 16000 55 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16060 d7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 16067 .cfa: $rsp 208 + +STACK CFI INIT 16140 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16150 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16190 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 161d0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16200 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16230 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16260 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16290 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 162c0 da .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 163a0 68 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 163a4 .cfa: $rsp 16 + +STACK CFI INIT 16410 27 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16440 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16470 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 164a0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 164d0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16500 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16550 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16560 4f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 165b0 4a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 165dd $r12: .cfa 16 + ^ $r13: .cfa 24 + ^ $r14: .cfa 32 + ^ $r15: .cfa 40 + ^ $rbp: $r9 $rbx: .cfa 0 + ^ $rsp: $r8 .cfa: $rdi 0 + .ra: $rdx +STACK CFI INIT 1660f a .ra: $rip +STACK CFI INIT 16620 1f2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 16627 .cfa: $rsp 216 + +STACK CFI INIT 16820 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16840 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 168c0 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 168f0 dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 169d0 e9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16ac0 6d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16b30 75 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 16bb0 4d5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 16bb2 .cfa: $rsp 16 + +STACK CFI 16bb8 .cfa: $rsp 24 + +STACK CFI 16bba .cfa: $rsp 32 + +STACK CFI 16bbc .cfa: $rsp 40 + +STACK CFI 16bbd .cfa: $rsp 48 + +STACK CFI 16bbe .cfa: $rsp 56 + +STACK CFI 16bc4 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 17090 197 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 17092 .cfa: $rsp 16 + +STACK CFI 1709a .cfa: $rsp 24 + +STACK CFI 170a0 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 170a2 .cfa: $rsp 32 + +STACK CFI 170a5 $r12: .cfa -32 + ^ +STACK CFI 170a6 .cfa: $rsp 40 + +STACK CFI 170a7 .cfa: $rsp 48 + +STACK CFI 170aa $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 17230 550 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 17780 14d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 178d0 dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 179b0 160 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 17b10 135 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 17c50 126 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 17c57 .cfa: $rsp 16 + +STACK CFI 17c6c .cfa: $rsp 24 + +STACK CFI 17c79 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 17d80 18b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 17f10 17b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 17f4b $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 18090 4c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 180e0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 180f0 1b2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 180f1 .cfa: $rsp 16 + +STACK CFI 180f6 $rbx: .cfa -16 + ^ +STACK CFI INIT 182b0 292 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 182b2 .cfa: $rsp 16 + +STACK CFI 182b5 $r15: .cfa -16 + ^ +STACK CFI 182b7 .cfa: $rsp 24 + +STACK CFI 182ba $r14: .cfa -24 + ^ +STACK CFI 182bc .cfa: $rsp 32 + +STACK CFI 182bf $r13: .cfa -32 + ^ +STACK CFI 182c1 .cfa: $rsp 40 + +STACK CFI 182c2 .cfa: $rsp 48 + +STACK CFI 182c3 .cfa: $rsp 56 + +STACK CFI 182c5 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 182c9 .cfa: $rsp 80 + +STACK CFI INIT 18550 f7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 18552 .cfa: $rsp 16 + +STACK CFI 18556 .cfa: $rsp 24 + +STACK CFI 18558 .cfa: $rsp 32 + +STACK CFI 1855a .cfa: $rsp 40 + +STACK CFI 1855b .cfa: $rsp 48 + +STACK CFI 1855d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI 1855e .cfa: $rsp 56 + +STACK CFI 18562 .cfa: $rsp 96 + +STACK CFI 1856b $rbx: .cfa -56 + ^ +STACK CFI INIT 18650 2f6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 18663 .cfa: $rsp 32 + +STACK CFI 1866d $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 18950 5f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 18954 .cfa: $rsp 32 + +STACK CFI INIT 189b0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 189e0 1f2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 189e3 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI INIT 18be0 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 18c00 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 18c02 .cfa: $rsp 16 + +STACK CFI 18c05 $r15: .cfa -16 + ^ +STACK CFI 18c07 .cfa: $rsp 24 + +STACK CFI 18c0a $r14: .cfa -24 + ^ +STACK CFI 18c0c .cfa: $rsp 32 + +STACK CFI 18c0e .cfa: $rsp 40 + +STACK CFI 18c11 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 18c12 .cfa: $rsp 48 + +STACK CFI 18c15 $rbp: .cfa -48 + ^ +STACK CFI 18c16 .cfa: $rsp 56 + +STACK CFI 18c19 $rbx: .cfa -56 + ^ +STACK CFI 18c1d .cfa: $rsp 80 + diff --git a/src/processor/testdata/symbols/libc-2.13.so/F4F8DFCD5A5FB5A7CE64717E9E6AE3890/libc-2.13.so.sym b/src/processor/testdata/symbols/libc-2.13.so/F4F8DFCD5A5FB5A7CE64717E9E6AE3890/libc-2.13.so.sym new file mode 100644 index 0000000..e15670d --- /dev/null +++ b/src/processor/testdata/symbols/libc-2.13.so/F4F8DFCD5A5FB5A7CE64717E9E6AE3890/libc-2.13.so.sym @@ -0,0 +1,13458 @@ +MODULE Linux x86_64 F4F8DFCD5A5FB5A7CE64717E9E6AE3890 libc-2.13.so +PUBLIC 1eb80 0 __libc_init_first +PUBLIC 1edb0 0 __libc_start_main +PUBLIC 1ef80 0 gnu_get_libc_release +PUBLIC 1ef90 0 gnu_get_libc_version +PUBLIC 1f3f0 0 __get_cpu_features +PUBLIC 1f410 0 __errno_location +PUBLIC 1f4e0 0 iconv_open +PUBLIC 1f700 0 iconv +PUBLIC 1f8b0 0 iconv_close +PUBLIC 203d0 0 __gconv_get_modules_db +PUBLIC 203e0 0 __gconv_get_alias_db +PUBLIC 28090 0 __gconv_get_cache +PUBLIC 28c60 0 __ctype_get_mb_cur_max +PUBLIC 28f20 0 setlocale +PUBLIC 2a7d0 0 localeconv +PUBLIC 2a990 0 nl_langinfo +PUBLIC 2a9a0 0 __nl_langinfo_l +PUBLIC 2aa00 0 __newlocale +PUBLIC 2b0b0 0 duplocale +PUBLIC 2b250 0 __freelocale +PUBLIC 2b310 0 uselocale +PUBLIC 2b530 0 __assert_fail +PUBLIC 2b680 0 __assert_perror_fail +PUBLIC 2b7e0 0 __assert +PUBLIC 2b7f0 0 tolower +PUBLIC 2b820 0 toupper +PUBLIC 2b850 0 isxdigit +PUBLIC 2b890 0 isupper +PUBLIC 2b8d0 0 isspace +PUBLIC 2b910 0 ispunct +PUBLIC 2b950 0 isprint +PUBLIC 2b990 0 isgraph +PUBLIC 2b9d0 0 islower +PUBLIC 2ba10 0 isdigit +PUBLIC 2ba50 0 iscntrl +PUBLIC 2ba90 0 isalpha +PUBLIC 2bad0 0 isalnum +PUBLIC 2bb10 0 _tolower +PUBLIC 2bb30 0 _toupper +PUBLIC 2bb50 0 __toascii_l +PUBLIC 2bb60 0 __isascii_l +PUBLIC 2bb70 0 isblank_l +PUBLIC 2bb80 0 isblank +PUBLIC 2bbc0 0 isalnum_l +PUBLIC 2bbd0 0 isalpha_l +PUBLIC 2bbf0 0 iscntrl_l +PUBLIC 2bc00 0 isdigit_l +PUBLIC 2bc20 0 __islower_l +PUBLIC 2bc40 0 __isgraph_l +PUBLIC 2bc60 0 isprint_l +PUBLIC 2bc80 0 ispunct_l +PUBLIC 2bc90 0 isspace_l +PUBLIC 2bcb0 0 isupper_l +PUBLIC 2bcd0 0 __isxdigit_l +PUBLIC 2bcf0 0 __tolower_l +PUBLIC 2bd00 0 toupper_l +PUBLIC 2bd10 0 isctype +PUBLIC 2bd30 0 __ctype_tolower_loc +PUBLIC 2bd70 0 __ctype_toupper_loc +PUBLIC 2bdb0 0 __ctype_b_loc +PUBLIC 2c1f0 0 bind_textdomain_codeset +PUBLIC 2c210 0 bindtextdomain +PUBLIC 2c230 0 dcgettext +PUBLIC 2c240 0 dgettext +PUBLIC 2c250 0 gettext +PUBLIC 2db60 0 dcngettext +PUBLIC 2db70 0 dngettext +PUBLIC 2db80 0 ngettext +PUBLIC 2f5e0 0 textdomain +PUBLIC 30b00 0 catgets +PUBLIC 30ba0 0 catclose +PUBLIC 30c10 0 catopen +PUBLIC 30e50 0 __open_catalog +PUBLIC 31710 0 isinf +PUBLIC 31750 0 isnan +PUBLIC 31780 0 finite +PUBLIC 317a0 0 copysign +PUBLIC 317c0 0 modf +PUBLIC 318b0 0 scalbln +PUBLIC 319c0 0 frexp +PUBLIC 31a70 0 ldexp +PUBLIC 31b00 0 __signbit +PUBLIC 31b10 0 __isinff +PUBLIC 31b40 0 __isnanf +PUBLIC 31b60 0 finitef +PUBLIC 31b80 0 copysignf +PUBLIC 31ba0 0 modff +PUBLIC 31c30 0 scalbnf +PUBLIC 31d10 0 frexpf +PUBLIC 31d80 0 ldexpf +PUBLIC 31e10 0 __signbitf +PUBLIC 31e20 0 __isinfl +PUBLIC 31e70 0 __isnanl +PUBLIC 31eb0 0 finitel +PUBLIC 31ec0 0 copysignl +PUBLIC 31ee0 0 modfl +PUBLIC 32060 0 scalbnl +PUBLIC 32080 0 frexpl +PUBLIC 32120 0 ldexpl +PUBLIC 321b0 0 __signbitl +PUBLIC 321f0 0 __sigsetjmp +PUBLIC 32290 0 setjmp +PUBLIC 322a0 0 _setjmp +PUBLIC 322b0 0 _longjmp +PUBLIC 32380 0 signal +PUBLIC 32440 0 gsignal +PUBLIC 324b0 0 killpg +PUBLIC 32700 0 sigaction +PUBLIC 32720 0 sigprocmask +PUBLIC 32750 0 kill +PUBLIC 32780 0 sigpending +PUBLIC 327e0 0 sigsuspend +PUBLIC 328f0 0 sigwait +PUBLIC 32940 0 sigblock +PUBLIC 329a0 0 sigsetmask +PUBLIC 32a80 0 __sigpause +PUBLIC 32ad0 0 __xpg_sigpause +PUBLIC 32ae0 0 sigpause +PUBLIC 32af0 0 sigvec +PUBLIC 32be0 0 sigstack +PUBLIC 32c40 0 sigaltstack +PUBLIC 32c70 0 siginterrupt +PUBLIC 32d40 0 __sigismember +PUBLIC 32d60 0 __sigaddset +PUBLIC 32d80 0 __sigdelset +PUBLIC 32da0 0 sigemptyset +PUBLIC 32dd0 0 sigfillset +PUBLIC 32e80 0 sigaddset +PUBLIC 32ec0 0 sigdelset +PUBLIC 32f00 0 sigismember +PUBLIC 32f50 0 sigreturn +PUBLIC 32f70 0 siggetmask +PUBLIC 32f80 0 sysv_signal +PUBLIC 33010 0 sigisemptyset +PUBLIC 33060 0 sigandset +PUBLIC 330b0 0 sigorset +PUBLIC 33100 0 __libc_current_sigrtmin_private +PUBLIC 33110 0 __libc_current_sigrtmax +PUBLIC 33120 0 __libc_allocate_rtsig_private +PUBLIC 33200 0 sigtimedwait +PUBLIC 332f0 0 sigwaitinfo +PUBLIC 33340 0 sigqueue +PUBLIC 333f0 0 sighold +PUBLIC 33460 0 sigrelse +PUBLIC 334d0 0 sigignore +PUBLIC 33520 0 sigset +PUBLIC 35520 0 atof +PUBLIC 35530 0 atoi +PUBLIC 35550 0 atol +PUBLIC 35560 0 atoll +PUBLIC 35570 0 abort +PUBLIC 35810 0 bsearch +PUBLIC 36070 0 qsort_r +PUBLIC 363a0 0 qsort +PUBLIC 363b0 0 getenv +PUBLIC 364d0 0 putenv +PUBLIC 36550 0 clearenv +PUBLIC 365e0 0 unsetenv +PUBLIC 36b60 0 setenv +PUBLIC 36ce0 0 __secure_getenv +PUBLIC 36e30 0 exit +PUBLIC 36e50 0 on_exit +PUBLIC 37080 0 __cxa_atexit +PUBLIC 370d0 0 __cxa_finalize +PUBLIC 37230 0 quick_exit +PUBLIC 37250 0 __cxa_at_quick_exit +PUBLIC 37270 0 abs +PUBLIC 37280 0 imaxabs +PUBLIC 372a0 0 llabs +PUBLIC 372c0 0 div +PUBLIC 372f0 0 imaxdiv +PUBLIC 37320 0 lldiv +PUBLIC 37350 0 random +PUBLIC 373c0 0 setstate +PUBLIC 37440 0 initstate +PUBLIC 374c0 0 srand +PUBLIC 37630 0 setstate_r +PUBLIC 37720 0 random_r +PUBLIC 377c0 0 srandom_r +PUBLIC 378c0 0 initstate_r +PUBLIC 37a00 0 rand +PUBLIC 37a10 0 rand_r +PUBLIC 37a60 0 drand48 +PUBLIC 37a90 0 erand48 +PUBLIC 37ab0 0 lrand48 +PUBLIC 37ae0 0 nrand48 +PUBLIC 37b00 0 mrand48 +PUBLIC 37b30 0 jrand48 +PUBLIC 37b50 0 srand48 +PUBLIC 37b60 0 seed48 +PUBLIC 37b80 0 lcong48 +PUBLIC 37b90 0 drand48_r +PUBLIC 37ba0 0 erand48_r +PUBLIC 37c20 0 lrand48_r +PUBLIC 37c40 0 nrand48_r +PUBLIC 37c90 0 mrand48_r +PUBLIC 37cb0 0 jrand48_r +PUBLIC 37d00 0 srand48_r +PUBLIC 37d40 0 seed48_r +PUBLIC 37d80 0 lcong48_r +PUBLIC 37e40 0 strtoll +PUBLIC 37e60 0 __strtoll_internal +PUBLIC 37e70 0 strtoul +PUBLIC 37e90 0 __strtoull_internal +PUBLIC 38300 0 strtoll_l +PUBLIC 38740 0 strtoull_l +PUBLIC 38750 0 strtof +PUBLIC 38770 0 __strtof_internal +PUBLIC 38780 0 strtod +PUBLIC 387a0 0 __strtod_internal +PUBLIC 387b0 0 strtold +PUBLIC 387d0 0 __strtold_internal +PUBLIC 3ae10 0 strtof_l +PUBLIC 3d4f0 0 __strtod_l +PUBLIC 3fb10 0 strtold_l +PUBLIC 3ff80 0 __libc_system +PUBLIC 401b0 0 realpath +PUBLIC 40670 0 canonicalize_file_name +PUBLIC 40680 0 a64l +PUBLIC 406d0 0 l64a +PUBLIC 40720 0 getsubopt +PUBLIC 40830 0 __xpg_basename +PUBLIC 408e0 0 strtoimax +PUBLIC 408f0 0 strtoumax +PUBLIC 40900 0 getcontext +PUBLIC 409b0 0 setcontext +PUBLIC 40a50 0 makecontext +PUBLIC 40c50 0 swapcontext +PUBLIC 40d60 0 strfmon +PUBLIC 41fa0 0 strfmon_l +PUBLIC 42030 0 mblen +PUBLIC 420c0 0 mbstowcs +PUBLIC 420f0 0 mbtowc +PUBLIC 42180 0 wcstombs +PUBLIC 421b0 0 wctomb +PUBLIC 42220 0 wcstoimax +PUBLIC 42230 0 wcstoumax +PUBLIC 42300 0 rpmatch +PUBLIC 42410 0 addseverity +PUBLIC 426a0 0 fmtmsg +PUBLIC 43040 0 ctermid +PUBLIC 43070 0 cuserid +PUBLIC 43680 0 _IO_vfprintf +PUBLIC 48e40 0 vprintf +PUBLIC 49250 0 __printf_fp +PUBLIC 4b9c0 0 register_printf_specifier +PUBLIC 4bab0 0 register_printf_function +PUBLIC 4bb00 0 parse_printf_format +PUBLIC 4d800 0 register_printf_modifier +PUBLIC 4d9b0 0 register_printf_type +PUBLIC 4dac0 0 printf_size_info +PUBLIC 4dae0 0 printf_size +PUBLIC 4e350 0 _IO_fprintf +PUBLIC 4e3e0 0 _IO_printf +PUBLIC 4e490 0 snprintf +PUBLIC 4e520 0 sprintf +PUBLIC 4e5b0 0 asprintf +PUBLIC 4e640 0 dprintf +PUBLIC 4e6d0 0 _IO_vfscanf +PUBLIC 56b90 0 vfscanf +PUBLIC 56bd0 0 fscanf +PUBLIC 56c60 0 scanf +PUBLIC 56d10 0 _IO_sscanf +PUBLIC 56e30 0 perror +PUBLIC 56f20 0 psignal +PUBLIC 57030 0 tmpfile +PUBLIC 570c0 0 tmpnam +PUBLIC 57150 0 tmpnam_r +PUBLIC 571a0 0 tempnam +PUBLIC 57740 0 getline +PUBLIC 57750 0 getw +PUBLIC 57790 0 putw +PUBLIC 577c0 0 remove +PUBLIC 57800 0 rename +PUBLIC 57830 0 renameat +PUBLIC 57860 0 flockfile +PUBLIC 578c0 0 ftrylockfile +PUBLIC 57930 0 _IO_funlockfile +PUBLIC 57980 0 __isoc99_scanf +PUBLIC 57b60 0 __isoc99_vscanf +PUBLIC 57cc0 0 __isoc99_fscanf +PUBLIC 57e90 0 __isoc99_vfscanf +PUBLIC 57fd0 0 __isoc99_sscanf +PUBLIC 58060 0 __isoc99_vsscanf +PUBLIC 58110 0 psiginfo +PUBLIC 58a00 0 vfwprintf +PUBLIC 66ab0 0 vfwscanf +PUBLIC 67a70 0 _IO_file_doallocate +PUBLIC 67b80 0 fclose +PUBLIC 67e20 0 fdopen +PUBLIC 68070 0 fflush +PUBLIC 681c0 0 fgetpos +PUBLIC 683c0 0 fgets +PUBLIC 686c0 0 fopen +PUBLIC 68860 0 fopencookie +PUBLIC 68970 0 fputs +PUBLIC 68b20 0 fread +PUBLIC 68cc0 0 fsetpos64 +PUBLIC 68e70 0 ftell +PUBLIC 69000 0 fwrite +PUBLIC 691e0 0 getdelim +PUBLIC 694d0 0 _IO_getline +PUBLIC 694e0 0 _IO_getline_info +PUBLIC 69670 0 gets +PUBLIC 69860 0 _IO_padn +PUBLIC 69970 0 _IO_proc_close +PUBLIC 69b50 0 _IO_proc_open +PUBLIC 69f20 0 popen +PUBLIC 6a060 0 _IO_puts +PUBLIC 6a340 0 _IO_seekoff +PUBLIC 6a500 0 _IO_seekpos +PUBLIC 6a630 0 setbuffer +PUBLIC 6a7d0 0 _IO_setvbuf +PUBLIC 6a9d0 0 _IO_ungetc +PUBLIC 6aab0 0 vsprintf +PUBLIC 6ab70 0 vsscanf +PUBLIC 6ac10 0 putchar +PUBLIC 6ad70 0 putchar_unlocked +PUBLIC 6b3b0 0 clearerr +PUBLIC 6b470 0 _IO_feof +PUBLIC 6b540 0 _IO_ferror +PUBLIC 6b610 0 fileno_unlocked +PUBLIC 6b640 0 fputc +PUBLIC 6b790 0 freopen +PUBLIC 6ba40 0 fseek +PUBLIC 6bb80 0 getc +PUBLIC 6bcc0 0 getchar +PUBLIC 6be10 0 open_memstream +PUBLIC 6bfc0 0 pclose +PUBLIC 6bfd0 0 _IO_putc +PUBLIC 6c120 0 rewind +PUBLIC 6c250 0 setbuf +PUBLIC 6c260 0 setlinebuf +PUBLIC 6c270 0 vasprintf +PUBLIC 6c400 0 vdprintf +PUBLIC 6c560 0 vscanf +PUBLIC 6c600 0 vsnprintf +PUBLIC 6c880 0 obstack_vprintf +PUBLIC 6ca40 0 obstack_printf +PUBLIC 6cad0 0 fcloseall +PUBLIC 6cae0 0 fseeko64 +PUBLIC 6cc20 0 ftello64 +PUBLIC 6cdb0 0 freopen64 +PUBLIC 6d060 0 __fbufsize +PUBLIC 6d090 0 __freading +PUBLIC 6d0c0 0 __fwriting +PUBLIC 6d0d0 0 __freadable +PUBLIC 6d0e0 0 __fwritable +PUBLIC 6d0f0 0 __flbf +PUBLIC 6d100 0 __fpurge +PUBLIC 6d170 0 __fpending +PUBLIC 6d1a0 0 __fsetlocking +PUBLIC 6d5f0 0 __libc_fatal +PUBLIC 6d6a0 0 fmemopen +PUBLIC 6d970 0 clearerr_unlocked +PUBLIC 6d980 0 feof_unlocked +PUBLIC 6d990 0 ferror_unlocked +PUBLIC 6d9a0 0 fputc_unlocked +PUBLIC 6d9d0 0 getc_unlocked +PUBLIC 6d9f0 0 getchar_unlocked +PUBLIC 6da20 0 fflush_unlocked +PUBLIC 6da50 0 putc_unlocked +PUBLIC 6da80 0 _IO_peekc_locked +PUBLIC 6dbc0 0 fread_unlocked +PUBLIC 6dc20 0 fwrite_unlocked +PUBLIC 6dcc0 0 fgets_unlocked +PUBLIC 6dd80 0 fputs_unlocked +PUBLIC 6df50 0 swprintf +PUBLIC 6e060 0 vswprintf +PUBLIC 6e160 0 vswscanf +PUBLIC 6e210 0 swscanf +PUBLIC 6e2a0 0 _IO_least_wmarker +PUBLIC 6e2e0 0 _IO_switch_to_main_wget_area +PUBLIC 6e320 0 _IO_switch_to_wbackup_area +PUBLIC 6e360 0 _IO_wdefault_uflow +PUBLIC 6e390 0 _IO_wdoallocbuf +PUBLIC 6e3e0 0 _IO_switch_to_wget_mode +PUBLIC 6e460 0 _IO_sputbackwc +PUBLIC 6e4b0 0 _IO_sungetwc +PUBLIC 6e500 0 _IO_adjust_wcolumn +PUBLIC 6e550 0 _IO_init_wmarker +PUBLIC 6e5d0 0 _IO_wmarker_delta +PUBLIC 6e620 0 _IO_seekwmark +PUBLIC 6e6c0 0 _IO_unsave_wmarkers +PUBLIC 6e6f0 0 _IO_free_wbackup_area +PUBLIC 6e740 0 _IO_wdefault_doallocate +PUBLIC 6e790 0 __woverflow +PUBLIC 6e7e0 0 _IO_wdefault_xsputn +PUBLIC 6eae0 0 __wunderflow +PUBLIC 6ebf0 0 _IO_wdefault_xsgetn +PUBLIC 6ecc0 0 __wuflow +PUBLIC 6ede0 0 _IO_wdefault_pbackfail +PUBLIC 6ef80 0 _IO_wsetb +PUBLIC 6f030 0 _IO_wdefault_finish +PUBLIC 6fa10 0 _IO_wfile_xsputn +PUBLIC 6fbb0 0 _IO_wfile_seekoff +PUBLIC 700a0 0 _IO_wfile_sync +PUBLIC 70200 0 _IO_wfile_overflow +PUBLIC 70480 0 _IO_wfile_underflow +PUBLIC 70a60 0 _IO_wdo_write +PUBLIC 70c10 0 open_wmemstream +PUBLIC 70df0 0 fputwc +PUBLIC 70f70 0 fputwc_unlocked +PUBLIC 70ff0 0 fgetwc +PUBLIC 71140 0 getwc_unlocked +PUBLIC 71170 0 getwchar +PUBLIC 712d0 0 getwchar_unlocked +PUBLIC 71300 0 fgetws +PUBLIC 714e0 0 fgetws_unlocked +PUBLIC 715a0 0 fputws +PUBLIC 71730 0 fputws_unlocked +PUBLIC 71980 0 ungetwc +PUBLIC 71a70 0 putwc +PUBLIC 71bd0 0 putwc_unlocked +PUBLIC 71c00 0 putwchar +PUBLIC 71d70 0 putwchar_unlocked +PUBLIC 71db0 0 fwprintf +PUBLIC 71e40 0 vwprintf +PUBLIC 71e60 0 wprintf +PUBLIC 71f10 0 wscanf +PUBLIC 71fc0 0 fwscanf +PUBLIC 72050 0 vwscanf +PUBLIC 72070 0 fwide +PUBLIC 721a0 0 _IO_file_attach +PUBLIC 723c0 0 _IO_file_seek +PUBLIC 72bc0 0 _IO_file_xsputn +PUBLIC 72de0 0 _IO_do_write +PUBLIC 72e10 0 _IO_file_write +PUBLIC 72eb0 0 _IO_file_close +PUBLIC 72ef0 0 _IO_file_stat +PUBLIC 72f00 0 _IO_file_read +PUBLIC 72f30 0 _IO_file_underflow +PUBLIC 73160 0 _IO_file_seekoff +PUBLIC 73550 0 _IO_file_sync +PUBLIC 73610 0 _IO_file_overflow +PUBLIC 73850 0 _IO_file_setbuf +PUBLIC 738f0 0 _IO_file_open +PUBLIC 739c0 0 _IO_file_fopen +PUBLIC 73e50 0 _IO_file_init +PUBLIC 73e90 0 _IO_file_finish +PUBLIC 73f10 0 _IO_file_close_it +PUBLIC 74160 0 _IO_un_link +PUBLIC 743b0 0 _IO_link_in +PUBLIC 74630 0 _IO_switch_to_get_mode +PUBLIC 746b0 0 __overflow +PUBLIC 746e0 0 _IO_doallocbuf +PUBLIC 74740 0 _IO_default_uflow +PUBLIC 74770 0 _IO_sgetn +PUBLIC 749f0 0 _IO_init +PUBLIC 74a20 0 _IO_sputbackc +PUBLIC 74a70 0 _IO_sungetc +PUBLIC 74ab0 0 _IO_adjust_column +PUBLIC 74d80 0 _IO_flush_all +PUBLIC 74d90 0 _IO_flush_all_linebuffered +PUBLIC 74fe0 0 _IO_init_marker +PUBLIC 75040 0 _IO_remove_marker +PUBLIC 75080 0 _IO_marker_difference +PUBLIC 75090 0 _IO_marker_delta +PUBLIC 750d0 0 _IO_seekmark +PUBLIC 75160 0 _IO_unsave_markers +PUBLIC 751f0 0 _IO_iter_begin +PUBLIC 75200 0 _IO_iter_end +PUBLIC 75210 0 _IO_iter_next +PUBLIC 75220 0 _IO_iter_file +PUBLIC 75230 0 _IO_list_lock +PUBLIC 75280 0 _IO_list_unlock +PUBLIC 752d0 0 _IO_list_resetlock +PUBLIC 752f0 0 _IO_setb +PUBLIC 75370 0 _IO_default_finish +PUBLIC 753f0 0 _IO_free_backup_area +PUBLIC 75430 0 _IO_default_xsputn +PUBLIC 75690 0 _IO_default_pbackfail +PUBLIC 757f0 0 __uflow +PUBLIC 758c0 0 __underflow +PUBLIC 75980 0 _IO_default_xsgetn +PUBLIC 75c00 0 _IO_default_doallocate +PUBLIC 75eb0 0 _IO_str_underflow +PUBLIC 75f50 0 _IO_str_pbackfail +PUBLIC 76130 0 _IO_str_seekoff +PUBLIC 762d0 0 _IO_str_overflow +PUBLIC 76530 0 _IO_str_init_readonly +PUBLIC 76550 0 _IO_str_init_static +PUBLIC 768f0 0 malloc_usable_size +PUBLIC 77990 0 __libc_mallopt +PUBLIC 77ab0 0 __libc_mallinfo +PUBLIC 77b40 0 malloc_set_state +PUBLIC 78c00 0 malloc_trim +PUBLIC 7af90 0 malloc_info +PUBLIC 7b0b0 0 __libc_calloc +PUBLIC 7b510 0 pvalloc +PUBLIC 7b7c0 0 __libc_valloc +PUBLIC 7ba40 0 cfree +PUBLIC 7bb20 0 __libc_malloc +PUBLIC 7be60 0 malloc_get_state +PUBLIC 7c030 0 __libc_memalign +PUBLIC 7c310 0 posix_memalign +PUBLIC 7c380 0 malloc_stats +PUBLIC 7cb70 0 realloc +PUBLIC 7d9e0 0 __default_morecore +PUBLIC 7da90 0 mcheck_check_all +PUBLIC 7dad0 0 mprobe +PUBLIC 7daf0 0 mcheck +PUBLIC 7dbd0 0 mcheck_pedantic +PUBLIC 7e2f0 0 tr_break +PUBLIC 7e300 0 muntrace +PUBLIC 7e390 0 mtrace +PUBLIC 7ecf0 0 _obstack_begin +PUBLIC 7edb0 0 _obstack_begin_1 +PUBLIC 7ee70 0 _obstack_newchunk +PUBLIC 7f000 0 _obstack_allocated_p +PUBLIC 7f040 0 _obstack_memory_used +PUBLIC 7f0a0 0 obstack_free +PUBLIC 7f120 0 strcat +PUBLIC 80810 0 strcoll +PUBLIC 80a00 0 __strverscmp +PUBLIC 80b20 0 __strdup +PUBLIC 80b80 0 strndup +PUBLIC 80bf0 0 strerror +PUBLIC 80cb0 0 __strerror_r +PUBLIC 80ef0 0 strnlen +PUBLIC 80f60 0 strncat +PUBLIC 82ac0 0 strsignal +PUBLIC 82df0 0 strtok +PUBLIC 82ef0 0 strtok_r +PUBLIC 82fe0 0 strxfrm +PUBLIC 82ff0 0 memchr +PUBLIC 84690 0 bcopy +PUBLIC 846e0 0 ffs +PUBLIC 846f0 0 ffsl +PUBLIC 891e0 0 memccpy +PUBLIC 89c60 0 __strsep_g +PUBLIC 89cf0 0 swab +PUBLIC 89d30 0 strfry +PUBLIC 89e10 0 memfrob +PUBLIC 8a280 0 memmem +PUBLIC 8a640 0 strchrnul +PUBLIC 8a6b0 0 argz_append +PUBLIC 8a740 0 argz_add +PUBLIC 8a790 0 argz_count +PUBLIC 8a7d0 0 argz_create +PUBLIC 8a860 0 argz_create_sep +PUBLIC 8a970 0 argz_next +PUBLIC 8a9c0 0 argz_delete +PUBLIC 8aa50 0 argz_extract +PUBLIC 8aaa0 0 argz_insert +PUBLIC 8ac10 0 argz_stringify +PUBLIC 8ac60 0 argz_add_sep +PUBLIC 8adf0 0 argz_replace +PUBLIC 8b120 0 basename +PUBLIC 8b140 0 strcoll_l +PUBLIC 8c050 0 strxfrm_l +PUBLIC 8cb30 0 __mempcpy_small +PUBLIC 8cc00 0 __strcpy_small +PUBLIC 8cca0 0 __stpcpy_small +PUBLIC 8cd40 0 __strcspn_c1 +PUBLIC 8cd80 0 __strcspn_c2 +PUBLIC 8cdd0 0 __strcspn_c3 +PUBLIC 8ce20 0 __strspn_c1 +PUBLIC 8ce40 0 __strspn_c2 +PUBLIC 8ce60 0 __strspn_c3 +PUBLIC 8ce90 0 __strpbrk_c2 +PUBLIC 8cee0 0 __strpbrk_c3 +PUBLIC 8cf40 0 __strtok_r_1c +PUBLIC 8cfb0 0 __strsep_2c +PUBLIC 8d020 0 __strsep_3c +PUBLIC 8d090 0 __strsep_1c +PUBLIC 8d0e0 0 memrchr +PUBLIC 8d200 0 __xpg_strerror_r +PUBLIC 8d2e0 0 strerror_l +PUBLIC 8d3b0 0 envz_entry +PUBLIC 8d450 0 envz_get +PUBLIC 8d490 0 envz_strip +PUBLIC 8d510 0 envz_merge +PUBLIC 8d5c0 0 envz_remove +PUBLIC 8d610 0 envz_add +PUBLIC 904d0 0 wmemcpy +PUBLIC 904e0 0 wmemset +PUBLIC 90550 0 wcscat +PUBLIC 90590 0 wcschr +PUBLIC 905b0 0 wcscmp +PUBLIC 905e0 0 wcscpy +PUBLIC 90610 0 wcscspn +PUBLIC 90650 0 wcsdup +PUBLIC 906b0 0 wcslen +PUBLIC 90720 0 wcsncat +PUBLIC 907b0 0 wcsncmp +PUBLIC 90870 0 wcsncpy +PUBLIC 90950 0 wcspbrk +PUBLIC 909a0 0 wcsrchr +PUBLIC 909c0 0 wcsspn +PUBLIC 90a20 0 wcstok +PUBLIC 90ad0 0 wcswcs +PUBLIC 90be0 0 wmemchr +PUBLIC 90c60 0 wmemcmp +PUBLIC 90d40 0 wmemmove +PUBLIC 90d50 0 wcpcpy +PUBLIC 90d80 0 wcpncpy +PUBLIC 90e60 0 wmempcpy +PUBLIC 90e70 0 btowc +PUBLIC 91030 0 wctob +PUBLIC 911c0 0 mbsinit +PUBLIC 911e0 0 __mbrlen +PUBLIC 91200 0 mbrtowc +PUBLIC 91470 0 wcrtomb +PUBLIC 91690 0 mbsrtowcs +PUBLIC 916b0 0 wcsrtombs +PUBLIC 91a00 0 mbsnrtowcs +PUBLIC 91d80 0 wcsnrtombs +PUBLIC 920f0 0 wcsnlen +PUBLIC 92190 0 wcschrnul +PUBLIC 921c0 0 wcstoll +PUBLIC 921e0 0 __wcstol_internal +PUBLIC 921f0 0 wcstoul +PUBLIC 92210 0 __wcstoull_internal +PUBLIC 92220 0 wcstod +PUBLIC 92240 0 __wcstod_internal +PUBLIC 92250 0 wcstold +PUBLIC 92270 0 __wcstold_internal +PUBLIC 92280 0 wcstof +PUBLIC 922a0 0 __wcstof_internal +PUBLIC 92710 0 wcstoll_l +PUBLIC 92b40 0 wcstoul_l +PUBLIC 94fa0 0 __wcstod_l +PUBLIC 97350 0 wcstold_l +PUBLIC 99700 0 __wcstof_l +PUBLIC 99710 0 wcscoll +PUBLIC 99720 0 wcsxfrm +PUBLIC 99730 0 wcwidth +PUBLIC 997a0 0 wcswidth +PUBLIC 99880 0 __wcscoll_l +PUBLIC 9a510 0 wcsxfrm_l +PUBLIC 9ade0 0 wcscasecmp +PUBLIC 9ae40 0 wcsncasecmp +PUBLIC 9aed0 0 __wcscasecmp_l +PUBLIC 9af30 0 wcsncasecmp_l +PUBLIC 9b7c0 0 __isoc99_swscanf +PUBLIC 9b850 0 __isoc99_vswscanf +PUBLIC 9b900 0 __isoc99_wscanf +PUBLIC 9bae0 0 __isoc99_vwscanf +PUBLIC 9bc40 0 __isoc99_fwscanf +PUBLIC 9be10 0 __isoc99_vfwscanf +PUBLIC 9c470 0 asctime +PUBLIC 9c490 0 asctime_r +PUBLIC 9c4a0 0 clock +PUBLIC 9c530 0 ctime +PUBLIC 9c550 0 ctime_r +PUBLIC 9c580 0 difftime +PUBLIC 9c5a0 0 gmtime +PUBLIC 9c5b0 0 __gmtime_r +PUBLIC 9c5c0 0 localtime +PUBLIC 9c5e0 0 localtime_r +PUBLIC 9cf30 0 timelocal +PUBLIC 9cf50 0 time +PUBLIC 9cf70 0 __gettimeofday +PUBLIC 9cfb0 0 settimeofday +PUBLIC 9cfe0 0 adjtime +PUBLIC 9e0b0 0 tzset +PUBLIC 9f930 0 getitimer +PUBLIC 9f960 0 setitimer +PUBLIC 9f990 0 stime +PUBLIC 9f9e0 0 dysize +PUBLIC 9fa30 0 timegm +PUBLIC 9fa50 0 ftime +PUBLIC 9fae0 0 getdate_r +PUBLIC a0030 0 getdate +PUBLIC a0070 0 strptime +PUBLIC a2e50 0 strptime_l +PUBLIC a2e60 0 strftime +PUBLIC a4f30 0 strftime_l +PUBLIC a4f50 0 wcsftime +PUBLIC a70c0 0 wcsftime_l +PUBLIC a7a10 0 ntp_gettime +PUBLIC a7a60 0 ntp_gettimex +PUBLIC a7be0 0 opendir +PUBLIC a7c20 0 closedir +PUBLIC a7c50 0 readdir +PUBLIC a7d70 0 readdir_r +PUBLIC a7f10 0 rewinddir +PUBLIC a7fa0 0 seekdir +PUBLIC a8050 0 telldir +PUBLIC a8060 0 scandir +PUBLIC a82a0 0 alphasort64 +PUBLIC a82c0 0 versionsort +PUBLIC a8370 0 dirfd +PUBLIC a8380 0 fdopendir +PUBLIC a8410 0 getdirentries +PUBLIC a8480 0 fgetgrent +PUBLIC a8c60 0 initgroups +PUBLIC a8d30 0 getgrouplist +PUBLIC a8df0 0 setgroups +PUBLIC a8e50 0 getgrent +PUBLIC a8f10 0 getgrgid +PUBLIC a9070 0 getgrnam +PUBLIC a91d0 0 putgrent +PUBLIC a9470 0 getgrent_r +PUBLIC a9550 0 endgrent +PUBLIC a95f0 0 setgrent +PUBLIC a9750 0 getgrgid_r +PUBLIC a99b0 0 getgrnam_r +PUBLIC a9c10 0 _nss_files_parse_grent +PUBLIC a9f00 0 fgetgrent_r +PUBLIC aa200 0 fgetpwent +PUBLIC aa3e0 0 getpw +PUBLIC aa4b0 0 putpwent +PUBLIC aa5b0 0 getpwent +PUBLIC aa670 0 getpwnam +PUBLIC aa7d0 0 getpwuid +PUBLIC aa930 0 getpwent_r +PUBLIC aaa10 0 endpwent +PUBLIC aaab0 0 setpwent +PUBLIC aac10 0 getpwnam_r +PUBLIC aae70 0 getpwuid_r +PUBLIC ab0d0 0 _nss_files_parse_pwent +PUBLIC ab3b0 0 fgetpwent_r +PUBLIC ab680 0 uname +PUBLIC ab6b0 0 times +PUBLIC ab700 0 wait +PUBLIC ab7a0 0 waitpid +PUBLIC ab840 0 wait3 +PUBLIC ab860 0 wait4 +PUBLIC ab890 0 waitid +PUBLIC ab940 0 alarm +PUBLIC ab970 0 sleep +PUBLIC abb50 0 pause +PUBLIC abbb0 0 nanosleep +PUBLIC abc10 0 __libc_fork +PUBLIC abee0 0 vfork +PUBLIC abf30 0 _exit +PUBLIC abf80 0 execve +PUBLIC abfb0 0 fexecve +PUBLIC ac080 0 execv +PUBLIC ac090 0 execle +PUBLIC ac270 0 execl +PUBLIC ac430 0 execvp +PUBLIC ac440 0 execlp +PUBLIC ac5e0 0 execvpe +PUBLIC aca70 0 getpid +PUBLIC acab0 0 getppid +PUBLIC acac0 0 getuid +PUBLIC acad0 0 geteuid +PUBLIC acae0 0 getgid +PUBLIC acaf0 0 getegid +PUBLIC acb00 0 getgroups +PUBLIC acb30 0 setuid +PUBLIC acb90 0 setgid +PUBLIC acbf0 0 group_member +PUBLIC acc90 0 getpgid +PUBLIC accc0 0 setpgid +PUBLIC accf0 0 getpgrp +PUBLIC acd00 0 __bsd_getpgrp +PUBLIC acd10 0 setpgrp +PUBLIC acd20 0 getsid +PUBLIC acd50 0 setsid +PUBLIC acd80 0 getresuid +PUBLIC acdb0 0 getresgid +PUBLIC acde0 0 setresuid +PUBLIC ace50 0 setresgid +PUBLIC ad260 0 pathconf +PUBLIC ad590 0 __sysconf +PUBLIC ad9a0 0 fpathconf +PUBLIC add00 0 glob_pattern_p +PUBLIC add10 0 globfree64 +PUBLIC ae6c0 0 glob64 +PUBLIC b3aa0 0 fnmatch +PUBLIC b3e10 0 confstr +PUBLIC b56d0 0 __posix_getopt +PUBLIC b56f0 0 getopt +PUBLIC b5750 0 getopt_long_only +PUBLIC b5770 0 getopt_long +PUBLIC b5790 0 sched_setparam +PUBLIC b57c0 0 __sched_getparam +PUBLIC b57f0 0 sched_setscheduler +PUBLIC b5820 0 __sched_getscheduler +PUBLIC b5850 0 __sched_yield +PUBLIC b5880 0 __sched_get_priority_max +PUBLIC b58b0 0 sched_get_priority_min +PUBLIC b58e0 0 sched_rr_get_interval +PUBLIC b5910 0 sched_getaffinity +PUBLIC b5970 0 sched_setaffinity +PUBLIC b5ad0 0 pread64 +PUBLIC b5b40 0 __pwrite64 +PUBLIC b5bb0 0 posix_madvise +PUBLIC b5d40 0 __sched_cpualloc +PUBLIC b5d60 0 __sched_cpufree +PUBLIC b5e80 0 freeaddrinfo +PUBLIC b8fd0 0 getaddrinfo +PUBLIC b9940 0 gai_strerror +PUBLIC b9a00 0 re_set_syntax +PUBLIC b9c90 0 re_set_registers +PUBLIC bade0 0 regfree +PUBLIC c4490 0 regexec +PUBLIC c45d0 0 re_exec +PUBLIC c5460 0 regerror +PUBLIC c5be0 0 re_compile_fastmap +PUBLIC c62d0 0 re_search_2 +PUBLIC c6300 0 re_match_2 +PUBLIC c6330 0 re_search +PUBLIC c6350 0 re_match +PUBLIC c8f20 0 re_comp +PUBLIC c9060 0 re_compile_pattern +PUBLIC c90e0 0 regcomp +PUBLIC c92a0 0 posix_spawn_file_actions_init +PUBLIC c9300 0 posix_spawn_file_actions_destroy +PUBLIC c9320 0 posix_spawn_file_actions_addclose +PUBLIC c93b0 0 posix_spawn_file_actions_addopen +PUBLIC c9470 0 posix_spawn_file_actions_adddup2 +PUBLIC c9510 0 posix_spawnattr_init +PUBLIC c9520 0 posix_spawnattr_destroy +PUBLIC c9530 0 posix_spawnattr_getsigdefault +PUBLIC c95c0 0 posix_spawnattr_setsigdefault +PUBLIC c9650 0 posix_spawnattr_getflags +PUBLIC c9660 0 posix_spawnattr_setflags +PUBLIC c9680 0 posix_spawnattr_getpgroup +PUBLIC c9690 0 posix_spawnattr_setpgroup +PUBLIC c96a0 0 posix_spawn +PUBLIC c96c0 0 posix_spawnp +PUBLIC c9d10 0 posix_spawnattr_getsigmask +PUBLIC c9da0 0 posix_spawnattr_getschedpolicy +PUBLIC c9db0 0 posix_spawnattr_getschedparam +PUBLIC c9dc0 0 posix_spawnattr_setsigmask +PUBLIC c9e50 0 posix_spawnattr_setschedpolicy +PUBLIC c9e70 0 posix_spawnattr_setschedparam +PUBLIC c9f60 0 getlogin +PUBLIC ca3c0 0 getlogin_r +PUBLIC ca450 0 wordfree +PUBLIC cd5c0 0 wordexp +PUBLIC ce2a0 0 setlogin +PUBLIC ce2f0 0 sched_getcpu +PUBLIC ce340 0 utime +PUBLIC ce370 0 mkfifo +PUBLIC ce3a0 0 mkfifoat +PUBLIC ce3d0 0 __xstat64 +PUBLIC ce420 0 __fxstat64 +PUBLIC ce470 0 __lxstat +PUBLIC ce4c0 0 __xmknod +PUBLIC ce520 0 __xmknodat +PUBLIC ce580 0 __fxstatat64 +PUBLIC ce5d0 0 __statfs +PUBLIC ce600 0 fstatfs +PUBLIC ce630 0 statvfs64 +PUBLIC ce6c0 0 fstatvfs +PUBLIC ce750 0 umask +PUBLIC ce760 0 chmod +PUBLIC ce790 0 fchmod +PUBLIC ce7c0 0 fchmodat +PUBLIC ce830 0 mkdir +PUBLIC ce860 0 mkdirat +PUBLIC ce890 0 __open64 +PUBLIC ce920 0 openat +PUBLIC cea00 0 __openat64_2 +PUBLIC cea20 0 close +PUBLIC cea80 0 __read +PUBLIC ceae0 0 __write +PUBLIC ceb40 0 access +PUBLIC ceb70 0 eaccess +PUBLIC cecb0 0 faccessat +PUBLIC cef40 0 fcntl +PUBLIC cefc0 0 flock +PUBLIC ceff0 0 lockf64 +PUBLIC cf100 0 dup +PUBLIC cf130 0 __dup2 +PUBLIC cf160 0 dup3 +PUBLIC cf190 0 pipe +PUBLIC cf1c0 0 pipe2 +PUBLIC cf1f0 0 creat64 +PUBLIC cf250 0 chdir +PUBLIC cf280 0 fchdir +PUBLIC cf2b0 0 getcwd +PUBLIC cf400 0 getwd +PUBLIC cf490 0 get_current_dir_name +PUBLIC cf520 0 chown +PUBLIC cf550 0 fchown +PUBLIC cf580 0 lchown +PUBLIC cf5b0 0 fchownat +PUBLIC cf5e0 0 ttyname +PUBLIC cf8f0 0 ttyname_r +PUBLIC cfc10 0 isatty +PUBLIC cfc30 0 link +PUBLIC cfc60 0 linkat +PUBLIC cfc90 0 symlink +PUBLIC cfcc0 0 symlinkat +PUBLIC cfcf0 0 readlink +PUBLIC cfd20 0 readlinkat +PUBLIC cfd50 0 unlink +PUBLIC cfd80 0 unlinkat +PUBLIC cfdb0 0 rmdir +PUBLIC cfde0 0 __poll +PUBLIC cfe80 0 ppoll +PUBLIC cff50 0 posix_fadvise +PUBLIC d0120 0 posix_fallocate64 +PUBLIC d0170 0 sendfile +PUBLIC d01a0 0 utimensat +PUBLIC d01f0 0 futimens +PUBLIC d0240 0 lchmod +PUBLIC d11b0 0 nftw64 +PUBLIC d11f0 0 ftw64 +PUBLIC d1200 0 fts_set +PUBLIC d1260 0 fts_close +PUBLIC d1f00 0 fts_children +PUBLIC d2040 0 fts_open +PUBLIC d2310 0 fts_read +PUBLIC d2e10 0 sync_file_range +PUBLIC d2e40 0 __open_2 +PUBLIC d2e70 0 __open64_2 +PUBLIC d2ea0 0 fallocate +PUBLIC d2ed0 0 cfgetospeed +PUBLIC d2ee0 0 cfgetispeed +PUBLIC d2f00 0 cfsetospeed +PUBLIC d2f50 0 cfsetispeed +PUBLIC d2fb0 0 cfsetspeed +PUBLIC d3040 0 tcsetattr +PUBLIC d3230 0 tcgetattr +PUBLIC d32e0 0 tcgetpgrp +PUBLIC d3310 0 tcsetpgrp +PUBLIC d3330 0 tcdrain +PUBLIC d33d0 0 tcflow +PUBLIC d33e0 0 tcflush +PUBLIC d33f0 0 tcsendbreak +PUBLIC d3430 0 cfmakeraw +PUBLIC d3460 0 tcgetsid +PUBLIC d3520 0 getrlimit64 +PUBLIC d3550 0 setrlimit64 +PUBLIC d3580 0 getrusage +PUBLIC d35b0 0 ulimit +PUBLIC d36d0 0 vlimit +PUBLIC d3830 0 vtimes +PUBLIC d3870 0 getpriority +PUBLIC d38b0 0 setpriority +PUBLIC d38e0 0 nice +PUBLIC d3980 0 brk +PUBLIC d39f0 0 __sbrk +PUBLIC d3aa0 0 sstk +PUBLIC d3ac0 0 ioctl +PUBLIC d3af0 0 readv +PUBLIC d3b90 0 writev +PUBLIC d3db0 0 preadv64 +PUBLIC d4030 0 pwritev +PUBLIC d4140 0 setreuid +PUBLIC d41b0 0 setregid +PUBLIC d4220 0 seteuid +PUBLIC d42c0 0 setegid +PUBLIC d4360 0 getpagesize +PUBLIC d4380 0 getdtablesize +PUBLIC d43b0 0 gethostname +PUBLIC d4460 0 sethostname +PUBLIC d4490 0 getdomainname +PUBLIC d4510 0 setdomainname +PUBLIC d4540 0 __select +PUBLIC d45b0 0 pselect +PUBLIC d4690 0 acct +PUBLIC d46c0 0 chroot +PUBLIC d46f0 0 fsync +PUBLIC d4750 0 sync +PUBLIC d4780 0 fdatasync +PUBLIC d47e0 0 reboot +PUBLIC d4810 0 gethostid +PUBLIC d4990 0 sethostid +PUBLIC d4a40 0 vhangup +PUBLIC d4a70 0 swapon +PUBLIC d4aa0 0 swapoff +PUBLIC d4ad0 0 mktemp +PUBLIC d4af0 0 mkstemp +PUBLIC d4b00 0 mkdtemp +PUBLIC d4b30 0 mkostemp64 +PUBLIC d4b40 0 mkstemps +PUBLIC d4b70 0 mkstemps64 +PUBLIC d4ba0 0 mkostemps +PUBLIC d4bd0 0 mkostemps64 +PUBLIC d4c00 0 ualarm +PUBLIC d4c60 0 usleep +PUBLIC d4ca0 0 gtty +PUBLIC d4ce0 0 stty +PUBLIC d4d20 0 ptrace +PUBLIC d4df0 0 getmntent +PUBLIC d4f70 0 hasmntopt +PUBLIC d4ff0 0 addmntent +PUBLIC d5520 0 __getmntent_r +PUBLIC d58c0 0 endmntent +PUBLIC d58e0 0 setmntent +PUBLIC d59a0 0 utimes +PUBLIC d59d0 0 lutimes +PUBLIC d5a70 0 futimes +PUBLIC d5b10 0 futimesat +PUBLIC d5b50 0 truncate +PUBLIC d5b80 0 ftruncate +PUBLIC d5bb0 0 insque +PUBLIC d5be0 0 remque +PUBLIC d5ce0 0 endttyent +PUBLIC d5d20 0 setttyent +PUBLIC d5d80 0 getttyent +PUBLIC d6110 0 getttynam +PUBLIC d6150 0 endusershell +PUBLIC d63c0 0 setusershell +PUBLIC d63e0 0 getusershell +PUBLIC d6430 0 getpass +PUBLIC d6680 0 ttyslot +PUBLIC d6780 0 setlogmask +PUBLIC d67a0 0 closelog +PUBLIC d6ab0 0 openlog +PUBLIC d6b20 0 __vsyslog_chk +PUBLIC d7100 0 vsyslog +PUBLIC d7110 0 __syslog_chk +PUBLIC d71a0 0 syslog +PUBLIC d72e0 0 syscall +PUBLIC d7320 0 daemon +PUBLIC d7480 0 mmap64 +PUBLIC d74b0 0 munmap +PUBLIC d74e0 0 mprotect +PUBLIC d7510 0 msync +PUBLIC d7570 0 madvise +PUBLIC d75a0 0 mincore +PUBLIC d75d0 0 remap_file_pages +PUBLIC d7600 0 mlock +PUBLIC d7630 0 munlock +PUBLIC d7660 0 mlockall +PUBLIC d7690 0 munlockall +PUBLIC d76c0 0 hdestroy +PUBLIC d76d0 0 hcreate +PUBLIC d76e0 0 hsearch +PUBLIC d7710 0 hsearch_r +PUBLIC d7930 0 hdestroy_r +PUBLIC d7960 0 hcreate_r +PUBLIC d7b40 0 tfind +PUBLIC d7c40 0 twalk +PUBLIC d7cb0 0 tdestroy +PUBLIC d7cd0 0 tdelete +PUBLIC d8110 0 tsearch +PUBLIC d8230 0 lfind +PUBLIC d82a0 0 lsearch +PUBLIC d8430 0 vwarn +PUBLIC d8560 0 verr +PUBLIC d8580 0 err +PUBLIC d8610 0 warn +PUBLIC d86b0 0 vwarnx +PUBLIC d87a0 0 verrx +PUBLIC d87c0 0 errx +PUBLIC d8850 0 warnx +PUBLIC d8b10 0 error_at_line +PUBLIC d8d10 0 error +PUBLIC d8e60 0 ustat +PUBLIC d8fa0 0 get_avphys_pages +PUBLIC d8fb0 0 get_phys_pages +PUBLIC d91b0 0 get_nprocs +PUBLIC d92f0 0 get_nprocs_conf +PUBLIC d93c0 0 dirname +PUBLIC d94b0 0 getloadavg +PUBLIC d95b0 0 fgetxattr +PUBLIC d95e0 0 flistxattr +PUBLIC d9610 0 fremovexattr +PUBLIC d9640 0 fsetxattr +PUBLIC d9670 0 getxattr +PUBLIC d96a0 0 listxattr +PUBLIC d96d0 0 lgetxattr +PUBLIC d9700 0 llistxattr +PUBLIC d9730 0 lremovexattr +PUBLIC d9760 0 lsetxattr +PUBLIC d9790 0 removexattr +PUBLIC d97c0 0 setxattr +PUBLIC d97f0 0 advance +PUBLIC d9850 0 step +PUBLIC d98b0 0 endfsent +PUBLIC d9970 0 setfsent +PUBLIC d9a80 0 getfsfile +PUBLIC d9ae0 0 getfsspec +PUBLIC d9b40 0 getfsent +PUBLIC d9b80 0 chflags +PUBLIC d9bc0 0 fchflags +PUBLIC d9c00 0 revoke +PUBLIC d9c20 0 gcvt +PUBLIC d9c50 0 ecvt +PUBLIC d9c80 0 fcvt +PUBLIC d9d30 0 fcvt_r +PUBLIC da040 0 ecvt_r +PUBLIC da240 0 qgcvt +PUBLIC da280 0 qecvt +PUBLIC da2c0 0 qfcvt +PUBLIC da390 0 qfcvt_r +PUBLIC da6c0 0 qecvt_r +PUBLIC da950 0 ioperm +PUBLIC da980 0 iopl +PUBLIC da9b0 0 __sysctl +PUBLIC daa10 0 clone +PUBLIC daaa0 0 llseek +PUBLIC dab00 0 umount +PUBLIC dab10 0 umount2 +PUBLIC dab40 0 readahead +PUBLIC dab70 0 setfsuid +PUBLIC daba0 0 setfsgid +PUBLIC dabd0 0 gnu_dev_major +PUBLIC dabf0 0 gnu_dev_minor +PUBLIC dac10 0 gnu_dev_makedev +PUBLIC dac40 0 epoll_pwait +PUBLIC dad00 0 signalfd +PUBLIC dad90 0 eventfd +PUBLIC dae10 0 eventfd_read +PUBLIC dae30 0 eventfd_write +PUBLIC dae60 0 prlimit +PUBLIC dae90 0 __arch_prctl +PUBLIC daec0 0 modify_ldt +PUBLIC daef0 0 fanotify_mark +PUBLIC daf20 0 ntp_adjtime +PUBLIC daf50 0 capget +PUBLIC daf80 0 capset +PUBLIC dafb0 0 create_module +PUBLIC dafe0 0 delete_module +PUBLIC db010 0 epoll_create +PUBLIC db040 0 epoll_create1 +PUBLIC db070 0 epoll_ctl +PUBLIC db0a0 0 epoll_wait +PUBLIC db110 0 get_kernel_syms +PUBLIC db140 0 init_module +PUBLIC db170 0 inotify_add_watch +PUBLIC db1a0 0 inotify_init +PUBLIC db1d0 0 inotify_init1 +PUBLIC db200 0 inotify_rm_watch +PUBLIC db230 0 klogctl +PUBLIC db260 0 mount +PUBLIC db290 0 mremap +PUBLIC db2c0 0 nfsservctl +PUBLIC db2f0 0 personality +PUBLIC db320 0 pivot_root +PUBLIC db350 0 prctl +PUBLIC db380 0 query_module +PUBLIC db3b0 0 quotactl +PUBLIC db3e0 0 splice +PUBLIC db450 0 sysinfo +PUBLIC db480 0 tee +PUBLIC db4f0 0 unshare +PUBLIC db520 0 uselib +PUBLIC db550 0 vmsplice +PUBLIC db5c0 0 timerfd_create +PUBLIC db5f0 0 timerfd_settime +PUBLIC db620 0 timerfd_gettime +PUBLIC db650 0 fanotify_init +PUBLIC db680 0 bdflush +PUBLIC db6a0 0 accept +PUBLIC db700 0 bind +PUBLIC db730 0 connect +PUBLIC db790 0 getpeername +PUBLIC db7c0 0 getsockname +PUBLIC db7f0 0 getsockopt +PUBLIC db820 0 listen +PUBLIC db850 0 recv +PUBLIC db900 0 recvfrom +PUBLIC db970 0 recvmsg +PUBLIC db9d0 0 __send +PUBLIC dba80 0 sendmsg +PUBLIC dbae0 0 sendto +PUBLIC dbb50 0 setsockopt +PUBLIC dbb80 0 shutdown +PUBLIC dbbb0 0 socket +PUBLIC dbbe0 0 socketpair +PUBLIC dbc10 0 isfdtype +PUBLIC dbf20 0 sockatmark +PUBLIC dbf50 0 accept4 +PUBLIC dbff0 0 recvmmsg +PUBLIC dc0a0 0 __cmsg_nxthdr +PUBLIC dc0f0 0 __libc_sa_len +PUBLIC dc110 0 ftok +PUBLIC dc160 0 msgsnd +PUBLIC dc1d0 0 msgrcv +PUBLIC dc240 0 msgget +PUBLIC dc270 0 msgctl +PUBLIC dc2a0 0 semop +PUBLIC dc2d0 0 semget +PUBLIC dc300 0 semctl +PUBLIC dc330 0 semtimedop +PUBLIC dc360 0 shmat +PUBLIC dc390 0 shmdt +PUBLIC dc3c0 0 shmget +PUBLIC dc3f0 0 shmctl +PUBLIC dc910 0 moncontrol +PUBLIC dc970 0 _mcleanup +PUBLIC dc9a0 0 __monstartup +PUBLIC dcd40 0 profil +PUBLIC dd250 0 sprofil +PUBLIC dd670 0 __profile_frequency +PUBLIC dd680 0 _mcount +PUBLIC dd6e0 0 __fentry__ +PUBLIC dd740 0 wctrans +PUBLIC dd7d0 0 towctrans +PUBLIC dd830 0 __towctrans_l +PUBLIC dd890 0 iswdigit +PUBLIC dd930 0 towlower +PUBLIC dd9a0 0 towupper +PUBLIC dda00 0 iswxdigit +PUBLIC ddad0 0 iswupper +PUBLIC ddba0 0 iswspace +PUBLIC ddc70 0 iswpunct +PUBLIC ddd40 0 iswprint +PUBLIC dde10 0 iswgraph +PUBLIC ddee0 0 iswlower +PUBLIC ddfb0 0 iswcntrl +PUBLIC de080 0 iswblank +PUBLIC de150 0 iswalpha +PUBLIC de220 0 iswalnum +PUBLIC de2f0 0 wctype +PUBLIC de370 0 __iswctype +PUBLIC de3d0 0 __iswalnum_l +PUBLIC de460 0 __iswalpha_l +PUBLIC de4f0 0 __iswblank_l +PUBLIC de580 0 iswcntrl_l +PUBLIC de610 0 iswdigit_l +PUBLIC de6a0 0 __iswlower_l +PUBLIC de730 0 __iswgraph_l +PUBLIC de7c0 0 __iswprint_l +PUBLIC de850 0 __iswpunct_l +PUBLIC de8e0 0 __iswspace_l +PUBLIC de970 0 __iswupper_l +PUBLIC dea00 0 iswxdigit_l +PUBLIC dea90 0 __towlower_l +PUBLIC deaf0 0 __towupper_l +PUBLIC deb50 0 __wctype_l +PUBLIC debd0 0 iswctype_l +PUBLIC dec30 0 wctrans_l +PUBLIC decb0 0 getspent +PUBLIC ded70 0 getspnam +PUBLIC deed0 0 sgetspent +PUBLIC df060 0 fgetspent +PUBLIC df240 0 putspent +PUBLIC df680 0 getspent_r +PUBLIC df760 0 endspent +PUBLIC df800 0 setspent +PUBLIC df960 0 getspnam_r +PUBLIC dfb50 0 _nss_files_parse_spent +PUBLIC dff10 0 sgetspent_r +PUBLIC dffc0 0 fgetspent_r +PUBLIC e0290 0 ulckpwdf +PUBLIC e0310 0 lckpwdf +PUBLIC e0620 0 getsgent +PUBLIC e06e0 0 getsgnam +PUBLIC e0840 0 sgetsgent +PUBLIC e09f0 0 fgetsgent +PUBLIC e0bd0 0 putsgent +PUBLIC e0df0 0 getsgent_r +PUBLIC e0ed0 0 endsgent +PUBLIC e0f70 0 setsgent +PUBLIC e10d0 0 getsgnam_r +PUBLIC e12c0 0 _nss_files_parse_sgent +PUBLIC e1650 0 sgetsgent_r +PUBLIC e1710 0 fgetsgent_r +PUBLIC e26f0 0 argp_failure +PUBLIC e5940 0 argp_state_help +PUBLIC e59f0 0 argp_error +PUBLIC e5b40 0 argp_help +PUBLIC e6150 0 argp_parse +PUBLIC e6e60 0 argp_usage +PUBLIC e6e80 0 __libc_alloca_cutoff +PUBLIC e6ed0 0 pthread_equal +PUBLIC e6f00 0 pthread_attr_destroy +PUBLIC e6f30 0 pthread_attr_init +PUBLIC e6f60 0 pthread_attr_getdetachstate +PUBLIC e6f90 0 pthread_attr_setdetachstate +PUBLIC e6fc0 0 pthread_attr_getinheritsched +PUBLIC e6ff0 0 pthread_attr_setinheritsched +PUBLIC e7020 0 pthread_attr_getschedparam +PUBLIC e7050 0 pthread_attr_setschedparam +PUBLIC e7080 0 pthread_attr_getschedpolicy +PUBLIC e70b0 0 pthread_attr_setschedpolicy +PUBLIC e70e0 0 pthread_attr_getscope +PUBLIC e7110 0 pthread_attr_setscope +PUBLIC e7140 0 pthread_condattr_destroy +PUBLIC e7170 0 pthread_condattr_init +PUBLIC e71a0 0 pthread_cond_broadcast +PUBLIC e71d0 0 pthread_cond_destroy +PUBLIC e7200 0 pthread_cond_init +PUBLIC e7230 0 pthread_cond_signal +PUBLIC e7260 0 pthread_cond_wait +PUBLIC e7290 0 pthread_cond_timedwait +PUBLIC e72c0 0 pthread_getschedparam +PUBLIC e72f0 0 pthread_setschedparam +PUBLIC e7320 0 pthread_mutex_destroy +PUBLIC e7350 0 pthread_mutex_init +PUBLIC e7380 0 pthread_mutex_lock +PUBLIC e73b0 0 pthread_mutex_unlock +PUBLIC e73e0 0 pthread_self +PUBLIC e7410 0 pthread_setcancelstate +PUBLIC e7440 0 pthread_setcanceltype +PUBLIC e7470 0 pthread_exit +PUBLIC e7610 0 __register_atfork +PUBLIC e7960 0 __libc_pthread_init +PUBLIC e79c0 0 hstrerror +PUBLIC e7a30 0 herror +PUBLIC e7b00 0 inet_aton +PUBLIC e7c50 0 inet_addr +PUBLIC e7cf0 0 inet_ntop +PUBLIC e80c0 0 inet_pton +PUBLIC e83b0 0 inet_nsap_ntoa +PUBLIC e8470 0 inet_nsap_addr +PUBLIC e8600 0 __res_iclose +PUBLIC e86d0 0 __res_nclose +PUBLIC e86e0 0 __res_randomid +PUBLIC e95a0 0 __res_ninit +PUBLIC ea2f0 0 __res_init +PUBLIC ea3b0 0 __res_maybe_init +PUBLIC ea540 0 __res_state +PUBLIC ea550 0 __gai_sigqueue +PUBLIC ea5e0 0 __nss_disable_nscd +PUBLIC ea680 0 __nss_lookup_function +PUBLIC eaff0 0 __nss_configure_lookup +PUBLIC eb100 0 __nss_next2 +PUBLIC eb210 0 __nss_database_lookup +PUBLIC ebce0 0 __nss_group_lookup2 +PUBLIC ebd90 0 __nss_passwd_lookup2 +PUBLIC ec040 0 __nss_services_lookup2 +PUBLIC ec0e0 0 __nss_hosts_lookup2 +PUBLIC ec570 0 __nss_hostname_digits_dots +PUBLIC ecc50 0 __cyg_profile_func_enter +PUBLIC ecef0 0 __stpcpy_chk +PUBLIC ed050 0 __strcat_chk +PUBLIC ed0b0 0 __strcpy_chk +PUBLIC ed210 0 __strncat_chk +PUBLIC ed340 0 __strncpy_chk +PUBLIC ed430 0 __stpncpy_chk +PUBLIC ed520 0 __sprintf_chk +PUBLIC ed5c0 0 __vsprintf_chk +PUBLIC ed6b0 0 __snprintf_chk +PUBLIC ed740 0 __vsnprintf_chk +PUBLIC ed860 0 __printf_chk +PUBLIC eda50 0 __fprintf_chk +PUBLIC edc30 0 __vprintf_chk +PUBLIC eddb0 0 __vfprintf_chk +PUBLIC edf20 0 __gets_chk +PUBLIC ee150 0 __chk_fail +PUBLIC ee370 0 __fgets_chk +PUBLIC ee560 0 __fgets_unlocked_chk +PUBLIC ee620 0 __read_chk +PUBLIC ee660 0 __pread_chk +PUBLIC ee680 0 __pread64_chk +PUBLIC ee6a0 0 __recv_chk +PUBLIC ee6c0 0 __recvfrom_chk +PUBLIC ee6f0 0 __readlink_chk +PUBLIC ee730 0 __readlinkat_chk +PUBLIC ee750 0 __getwd_chk +PUBLIC ee780 0 __getcwd_chk +PUBLIC ee7a0 0 __realpath_chk +PUBLIC ee7c0 0 __ptsname_r_chk +PUBLIC ee7e0 0 __fread_chk +PUBLIC ee9e0 0 __fread_unlocked_chk +PUBLIC eea70 0 __confstr_chk +PUBLIC eea90 0 __getgroups_chk +PUBLIC eead0 0 __ttyname_r_chk +PUBLIC eeaf0 0 __gethostname_chk +PUBLIC eeb10 0 __getdomainname_chk +PUBLIC eeb30 0 __asprintf_chk +PUBLIC eebc0 0 __vasprintf_chk +PUBLIC eed60 0 __dprintf_chk +PUBLIC eedf0 0 __vdprintf_chk +PUBLIC eef00 0 __obstack_vprintf_chk +PUBLIC ef0e0 0 __obstack_printf_chk +PUBLIC ef170 0 __longjmp_chk +PUBLIC ef260 0 __stack_chk_fail +PUBLIC ef270 0 __fortify_fail +PUBLIC ef2b0 0 __getlogin_r_chk +PUBLIC ef3c0 0 backtrace +PUBLIC ef490 0 __backtrace_symbols +PUBLIC ef720 0 backtrace_symbols_fd +PUBLIC ef9f0 0 __wprintf_chk +PUBLIC efbe0 0 __fwprintf_chk +PUBLIC efdc0 0 __vwprintf_chk +PUBLIC eff40 0 __vfwprintf_chk +PUBLIC f00b0 0 __fgetws_chk +PUBLIC f02a0 0 __fgetws_unlocked_chk +PUBLIC f0360 0 __wctomb_chk +PUBLIC f03a0 0 __wcscpy_chk +PUBLIC f03e0 0 __wmemcpy_chk +PUBLIC f0400 0 __wmemmove_chk +PUBLIC f0420 0 __wmempcpy_chk +PUBLIC f0440 0 __wcpcpy_chk +PUBLIC f0480 0 __wcsncpy_chk +PUBLIC f04a0 0 __wcscat_chk +PUBLIC f0500 0 __wcsncat_chk +PUBLIC f0620 0 __wmemset_chk +PUBLIC f0640 0 __wcpncpy_chk +PUBLIC f0660 0 __swprintf_chk +PUBLIC f06f0 0 __vswprintf_chk +PUBLIC f0810 0 __wcrtomb_chk +PUBLIC f0840 0 __mbsnrtowcs_chk +PUBLIC f0860 0 __wcsnrtombs_chk +PUBLIC f0880 0 __mbsrtowcs_chk +PUBLIC f08a0 0 __wcsrtombs_chk +PUBLIC f08c0 0 __mbstowcs_chk +PUBLIC f08f0 0 __wcstombs_chk +PUBLIC f0b80 0 htonl +PUBLIC f0b90 0 htons +PUBLIC f0ba0 0 inet_lnaof +PUBLIC f0bd0 0 inet_makeaddr +PUBLIC f0c20 0 inet_netof +PUBLIC f0c50 0 inet_ntoa +PUBLIC f0cf0 0 inet_network +PUBLIC f0ee0 0 __h_errno_location +PUBLIC f0f00 0 gethostbyaddr +PUBLIC f10d0 0 gethostbyaddr_r +PUBLIC f1470 0 gethostbyname +PUBLIC f1670 0 gethostbyname2 +PUBLIC f1880 0 gethostbyname2_r +PUBLIC f1bf0 0 gethostbyname_r +PUBLIC f1f50 0 gethostent +PUBLIC f2020 0 gethostent_r +PUBLIC f2110 0 endhostent +PUBLIC f21c0 0 sethostent +PUBLIC f2320 0 getnetbyaddr +PUBLIC f24f0 0 getnetbyaddr_r +PUBLIC f2760 0 getnetbyname +PUBLIC f2910 0 getnetent +PUBLIC f29e0 0 getnetent_r +PUBLIC f2ad0 0 endnetent +PUBLIC f2b80 0 setnetent +PUBLIC f2ce0 0 getnetbyname_r +PUBLIC f2f40 0 getprotobynumber +PUBLIC f30a0 0 getprotobynumber_r +PUBLIC f3290 0 getprotoent +PUBLIC f3350 0 getprotoent_r +PUBLIC f3430 0 endprotoent +PUBLIC f34d0 0 setprotoent +PUBLIC f3630 0 getprotobyname +PUBLIC f3790 0 getprotobyname_r +PUBLIC f3980 0 getservbyname +PUBLIC f3b00 0 getservbyname_r +PUBLIC f3d70 0 getservbyport +PUBLIC f3ef0 0 getservbyport_r +PUBLIC f4160 0 getservent +PUBLIC f4220 0 getservent_r +PUBLIC f4300 0 endservent +PUBLIC f43a0 0 setservent +PUBLIC f4500 0 getrpcent +PUBLIC f45c0 0 getrpcbyname +PUBLIC f4720 0 getrpcbynumber +PUBLIC f4880 0 getrpcent_r +PUBLIC f4960 0 endrpcent +PUBLIC f4a00 0 setrpcent +PUBLIC f4b60 0 getrpcbyname_r +PUBLIC f4d50 0 getrpcbynumber_r +PUBLIC f4f40 0 ether_aton +PUBLIC f4f50 0 ether_aton_r +PUBLIC f50c0 0 ether_hostton +PUBLIC f5240 0 ether_line +PUBLIC f54b0 0 ether_ntoa +PUBLIC f54c0 0 ether_ntoa_r +PUBLIC f5510 0 ether_ntohost +PUBLIC f58a0 0 __internal_getnetgrent_r +PUBLIC f5a90 0 getnetgrent_r +PUBLIC f5b80 0 innetgr +PUBLIC f5f00 0 __internal_endnetgrent +PUBLIC f5f20 0 endnetgrent +PUBLIC f5f90 0 __internal_setnetgrent +PUBLIC f5fe0 0 setnetgrent +PUBLIC f6130 0 getnetgrent +PUBLIC f6510 0 getnameinfo +PUBLIC f6fb0 0 if_indextoname +PUBLIC f7040 0 if_nametoindex +PUBLIC f70e0 0 if_freenameindex +PUBLIC f7120 0 if_nameindex +PUBLIC f7440 0 freeifaddrs +PUBLIC f86d0 0 getifaddrs +PUBLIC f86f0 0 getipv4sourcefilter +PUBLIC f8850 0 setipv4sourcefilter +PUBLIC f8a30 0 getsourcefilter +PUBLIC f8bc0 0 setsourcefilter +PUBLIC f9260 0 __ivaliduser +PUBLIC f9620 0 iruserok_af +PUBLIC f96b0 0 iruserok +PUBLIC f96d0 0 ruserok_af +PUBLIC f9790 0 ruserok +PUBLIC f97a0 0 rresvport_af +PUBLIC f9960 0 rresvport +PUBLIC f9970 0 rcmd_af +PUBLIC fa3c0 0 rcmd +PUBLIC fa3e0 0 rexec_af +PUBLIC fa960 0 rexec +PUBLIC faba0 0 ruserpass +PUBLIC fb020 0 getaliasent_r +PUBLIC fb100 0 endaliasent +PUBLIC fb1a0 0 setaliasent +PUBLIC fb300 0 getaliasent +PUBLIC fb3c0 0 getaliasbyname +PUBLIC fb520 0 getaliasbyname_r +PUBLIC fb710 0 inet6_option_space +PUBLIC fb720 0 inet6_option_init +PUBLIC fb750 0 inet6_option_next +PUBLIC fb800 0 inet6_option_find +PUBLIC fba10 0 inet6_option_alloc +PUBLIC fba20 0 inet6_option_append +PUBLIC fba70 0 inet6_opt_init +PUBLIC fbab0 0 inet6_opt_next +PUBLIC fbb40 0 inet6_opt_find +PUBLIC fbbd0 0 inet6_opt_get_val +PUBLIC fbc10 0 inet6_opt_set_val +PUBLIC fbc50 0 inet6_opt_finish +PUBLIC fbcd0 0 inet6_opt_append +PUBLIC fbde0 0 inet6_rth_space +PUBLIC fbe00 0 inet6_rth_segments +PUBLIC fbe20 0 inet6_rth_getaddr +PUBLIC fbe50 0 inet6_rth_reverse +PUBLIC fbf30 0 inet6_rth_add +PUBLIC fbf80 0 inet6_rth_init +PUBLIC fcc50 0 authnone_create +PUBLIC fccf0 0 authunix_create_default +PUBLIC fcf50 0 authunix_create +PUBLIC fd3a0 0 xdr_authunix_parms +PUBLIC fd440 0 bindresvport +PUBLIC fd840 0 clnt_create +PUBLIC fdaf0 0 clnt_sperrno +PUBLIC fdb60 0 clnt_spcreateerror +PUBLIC fdc60 0 clnt_pcreateerror +PUBLIC fdc80 0 clnt_perrno +PUBLIC fdca0 0 clnt_sperror +PUBLIC fdf40 0 clnt_perror +PUBLIC fe010 0 clntraw_create +PUBLIC fe3d0 0 callrpc +PUBLIC fe8e0 0 clnttcp_create +PUBLIC ff050 0 clntudp_bufcreate +PUBLIC ff080 0 clntudp_create +PUBLIC ff280 0 __libc_clntudp_bufcreate +PUBLIC ffde0 0 _rpc_dtablesize +PUBLIC ffe00 0 get_myaddress +PUBLIC ffea0 0 getrpcport +PUBLIC 100050 0 pmap_unset +PUBLIC 100150 0 pmap_set +PUBLIC 1002a0 0 pmap_getmaps +PUBLIC 100430 0 __libc_rpc_getport +PUBLIC 100620 0 pmap_getport +PUBLIC 100640 0 xdr_pmap +PUBLIC 1006b0 0 xdr_pmaplist +PUBLIC 100780 0 clnt_broadcast +PUBLIC 100de0 0 xdr_rmtcall_args +PUBLIC 100ef0 0 xdr_rmtcallres +PUBLIC 100f70 0 pmap_rmtcall +PUBLIC 1010c0 0 _seterr_reply +PUBLIC 1011e0 0 xdr_callhdr +PUBLIC 101280 0 xdr_rejected_reply +PUBLIC 101310 0 xdr_accepted_reply +PUBLIC 1013b0 0 xdr_replymsg +PUBLIC 101420 0 xdr_des_block +PUBLIC 101430 0 xdr_opaque_auth +PUBLIC 101490 0 xdr_callmsg +PUBLIC 1018e0 0 __rpc_thread_svc_max_pollfd +PUBLIC 101910 0 __rpc_thread_svc_pollfd +PUBLIC 101940 0 __rpc_thread_createerr +PUBLIC 101970 0 __rpc_thread_svc_fdset +PUBLIC 101990 0 svc_sendreply +PUBLIC 1019e0 0 svcerr_noproc +PUBLIC 101a30 0 svcerr_decode +PUBLIC 101a80 0 svcerr_systemerr +PUBLIC 101ad0 0 svcerr_auth +PUBLIC 101b00 0 svcerr_weakauth +PUBLIC 101b10 0 svcerr_noprog +PUBLIC 101b60 0 svcerr_progvers +PUBLIC 101bb0 0 svc_getreq +PUBLIC 101be0 0 svc_getreq_common +PUBLIC 101e00 0 svc_getreqset +PUBLIC 101ea0 0 svc_unregister +PUBLIC 101f90 0 svc_register +PUBLIC 102080 0 xprt_unregister +PUBLIC 102170 0 svc_getreq_poll +PUBLIC 102210 0 xprt_register +PUBLIC 102360 0 _authenticate +PUBLIC 1026b0 0 svcraw_create +PUBLIC 102840 0 svc_run +PUBLIC 102980 0 svc_exit +PUBLIC 1029b0 0 registerrpc +PUBLIC 102ef0 0 svcfd_create +PUBLIC 103180 0 svctcp_create +PUBLIC 103490 0 svcudp_create +PUBLIC 1034f0 0 svcudp_enablecache +PUBLIC 103620 0 svcudp_bufcreate +PUBLIC 103f20 0 xdr_free +PUBLIC 103f40 0 xdr_void +PUBLIC 103f50 0 xdr_int +PUBLIC 103fc0 0 xdr_u_int +PUBLIC 104030 0 xdr_long +PUBLIC 104070 0 xdr_u_long +PUBLIC 1040f0 0 xdr_hyper +PUBLIC 1041c0 0 xdr_u_hyper +PUBLIC 104290 0 xdr_longlong_t +PUBLIC 1042a0 0 xdr_u_longlong_t +PUBLIC 1042b0 0 xdr_short +PUBLIC 104320 0 xdr_u_short +PUBLIC 104390 0 xdr_char +PUBLIC 1043d0 0 xdr_u_char +PUBLIC 104410 0 xdr_bool +PUBLIC 104480 0 xdr_enum +PUBLIC 1044f0 0 xdr_opaque +PUBLIC 1045b0 0 xdr_netobj +PUBLIC 1045d0 0 xdr_union +PUBLIC 1046a0 0 xdr_wrapstring +PUBLIC 1046c0 0 xdr_string +PUBLIC 104800 0 xdr_bytes +PUBLIC 104950 0 xdr_vector +PUBLIC 1049d0 0 xdr_array +PUBLIC 104b50 0 xdr_float +PUBLIC 104bc0 0 xdr_double +PUBLIC 104c80 0 xdrmem_create +PUBLIC 104fd0 0 xdrrec_endofrecord +PUBLIC 105220 0 xdrrec_eof +PUBLIC 105280 0 xdrrec_skiprecord +PUBLIC 105510 0 xdrrec_create +PUBLIC 105810 0 xdr_pointer +PUBLIC 1058a0 0 xdr_reference +PUBLIC 105990 0 xdrstdio_create +PUBLIC 105bb0 0 getsecretkey +PUBLIC 105cc0 0 getpublickey +PUBLIC 105e20 0 xdr_sizeof +PUBLIC 1063b0 0 authdes_pk_create +PUBLIC 106610 0 authdes_create +PUBLIC 1066f0 0 xdr_authdes_verf +PUBLIC 106740 0 xdr_authdes_cred +PUBLIC 106c70 0 key_get_conv +PUBLIC 106cc0 0 key_setnet +PUBLIC 106d10 0 key_decryptsession_pk +PUBLIC 106d80 0 key_encryptsession_pk +PUBLIC 106df0 0 key_decryptsession +PUBLIC 106e50 0 key_encryptsession +PUBLIC 106eb0 0 key_setsecret +PUBLIC 106f00 0 key_gendes +PUBLIC 106fe0 0 key_secretkey_is_set +PUBLIC 107070 0 xdr_getcredres +PUBLIC 1070d0 0 xdr_key_netstarg +PUBLIC 107130 0 xdr_key_netstres +PUBLIC 107190 0 xdr_unixcred +PUBLIC 107200 0 xdr_cryptkeyres +PUBLIC 107260 0 xdr_cryptkeyarg +PUBLIC 1072b0 0 xdr_cryptkeyarg2 +PUBLIC 107310 0 xdr_netnamestr +PUBLIC 107330 0 xdr_keybuf +PUBLIC 107350 0 xdr_keystatus +PUBLIC 107370 0 netname2host +PUBLIC 107410 0 netname2user +PUBLIC 107520 0 host2netname +PUBLIC 107740 0 user2netname +PUBLIC 107850 0 getnetname +PUBLIC 1079f0 0 rtime +PUBLIC 107c20 0 authdes_getucred +PUBLIC 108640 0 clntunix_create +PUBLIC 109370 0 svcunixfd_create +PUBLIC 1097c0 0 svcunix_create +PUBLIC 109c10 0 xdr_int64_t +PUBLIC 109cd0 0 xdr_uint64_t +PUBLIC 109d90 0 xdr_int32_t +PUBLIC 109dd0 0 xdr_uint32_t +PUBLIC 109e10 0 xdr_int16_t +PUBLIC 109e80 0 xdr_uint16_t +PUBLIC 109ef0 0 xdr_int8_t +PUBLIC 109f60 0 xdr_uint8_t +PUBLIC 10a0c0 0 passwd2des +PUBLIC 10a110 0 xdecrypt +PUBLIC 10a210 0 xencrypt +PUBLIC 10a3a0 0 ecb_crypt +PUBLIC 10a3c0 0 cbc_crypt +PUBLIC 10afb0 0 des_setparity +PUBLIC 10e3f0 0 isastream +PUBLIC 10e410 0 getmsg +PUBLIC 10e430 0 getpmsg +PUBLIC 10e460 0 putmsg +PUBLIC 10e480 0 putpmsg +PUBLIC 10e4b0 0 fattach +PUBLIC 10e4d0 0 fdetach +PUBLIC 10e5a0 0 posix_openpt +PUBLIC 10e6b0 0 getpt +PUBLIC 10e6e0 0 grantpt +PUBLIC 10ebb0 0 unlockpt +PUBLIC 10ef10 0 ptsname_r +PUBLIC 10ef30 0 ptsname +PUBLIC 10ef60 0 getutent +PUBLIC 10f160 0 setutent +PUBLIC 10f1d0 0 getutent_r +PUBLIC 10f250 0 pututline +PUBLIC 10f2c0 0 endutent +PUBLIC 10f430 0 getutid +PUBLIC 10f490 0 getutline +PUBLIC 10f4f0 0 getutid_r +PUBLIC 10f5f0 0 getutline_r +PUBLIC 110740 0 utmpname +PUBLIC 110880 0 updwtmp +PUBLIC 110980 0 setutxent +PUBLIC 110990 0 getutxent +PUBLIC 1109a0 0 endutxent +PUBLIC 1109b0 0 getutxid +PUBLIC 1109c0 0 getutxline +PUBLIC 1109d0 0 pututxline +PUBLIC 1109e0 0 utmpxname +PUBLIC 1109f0 0 updwtmpx +PUBLIC 110a00 0 getutmp +PUBLIC 110a70 0 dl_iterate_phdr +PUBLIC 110cc0 0 _dl_addr +PUBLIC 111000 0 _dl_mcount_wrapper_check +PUBLIC 111040 0 _dl_mcount_wrapper +PUBLIC 111180 0 __libc_dlclose +PUBLIC 1111b0 0 __libc_dlsym +PUBLIC 111210 0 __libc_dlopen_mode +PUBLIC 1117a0 0 _dl_sym +PUBLIC 1117b0 0 _dl_vsym +PUBLIC 1118a0 0 __libc_dl_error_tsd +PUBLIC 111990 0 realpath +PUBLIC 1119c0 0 sched_getaffinity +PUBLIC 1119d0 0 sched_setaffinity +PUBLIC 1119e0 0 regexec +PUBLIC 111dd0 0 nftw64 +PUBLIC 111df0 0 pthread_cond_broadcast +PUBLIC 111e20 0 pthread_cond_destroy +PUBLIC 111e50 0 pthread_cond_init +PUBLIC 111e80 0 pthread_cond_signal +PUBLIC 111eb0 0 pthread_cond_wait +PUBLIC 111ee0 0 pthread_cond_timedwait +PUBLIC 111f50 0 __nss_next +PUBLIC 111f60 0 __nss_group_lookup +PUBLIC 111f70 0 __nss_passwd_lookup +PUBLIC 111fb0 0 __nss_hosts_lookup +PUBLIC 136380 0 __libc_freeres +PUBLIC 136990 0 __libc_thread_freeres +STACK CFI INIT 1eaf0 90 .cfa: $rsp 16 + .ra: .cfa -8 + ^ +STACK CFI 1eaf6 .cfa: $rsp 24 + +STACK CFI INIT 1eb80 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1eb90 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1eb94 .cfa: $rsp 16 + +STACK CFI INIT 1eba0 210 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1ebac $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 1ebba .cfa: $rsp 80 + +STACK CFI 1ebc7 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 1edb0 1c7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1edbd $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 1edd3 .cfa: $rsp 192 + +STACK CFI 1edf1 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 1ef80 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1ef90 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1efa0 16 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1efc0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1efc4 .cfa: $rsp 16 + +STACK CFI INIT 1efd0 c3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1efe3 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 1efea .cfa: $rsp 176 + +STACK CFI INIT 1f0a0 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f0a4 .cfa: $rsp 16 + +STACK CFI INIT 1f0e0 7b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f0fa $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ .cfa: $rsp 32 + +STACK CFI INIT 1f160 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f164 .cfa: $rsp 64 + +STACK CFI INIT 1f1c0 2e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f1c4 .cfa: $rsp 32 + +STACK CFI INIT 1f1f0 1f2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f1f3 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI INIT 1f3f0 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1f410 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1f430 aa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1f4e0 218 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f4e1 .cfa: $rsp 16 + +STACK CFI 1f4e4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 1f4e9 $r15: .cfa -24 + ^ +STACK CFI 1f4f2 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 1f4f7 $rbx: .cfa -56 + ^ +STACK CFI INIT 1f700 1a9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f70d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 1f71a $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ +STACK CFI 1f728 .cfa: $rsp 80 + +STACK CFI 1f734 $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 1f8b0 2d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f8b4 .cfa: $rsp 16 + +STACK CFI INIT 1f8e0 812 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f8e1 .cfa: $rsp 16 + +STACK CFI 1f8e4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 1f908 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 20100 212 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 20102 .cfa: $rsp 16 + +STACK CFI 2010a $r15: .cfa -16 + ^ +STACK CFI 2010c .cfa: $rsp 24 + +STACK CFI 2010f $r14: .cfa -24 + ^ +STACK CFI 20111 .cfa: $rsp 32 + +STACK CFI 20113 .cfa: $rsp 40 + +STACK CFI 20114 .cfa: $rsp 48 + +STACK CFI 20117 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI 20118 .cfa: $rsp 56 + +STACK CFI 2011b $rbx: .cfa -56 + ^ +STACK CFI 2011f .cfa: $rsp 112 + +STACK CFI INIT 20320 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 20322 .cfa: $rsp 16 + +STACK CFI 20324 .cfa: $rsp 24 + +STACK CFI 20327 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 20329 .cfa: $rsp 32 + +STACK CFI 2032d $r13: .cfa -32 + ^ +STACK CFI 2032f .cfa: $rsp 40 + +STACK CFI 20330 .cfa: $rsp 48 + +STACK CFI 20331 .cfa: $rsp 56 + +STACK CFI 20335 .cfa: $rsp 64 + +STACK CFI 20339 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 213c2 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 213d0 .cfa: $rsp 0 + +STACK CFI 213d4 .cfa: $rsp 128 + +STACK CFI 213dc .cfa: $rsp -128 + +STACK CFI INIT 213e1 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 213ef .cfa: $rsp 0 + +STACK CFI 213f3 .cfa: $rsp 128 + +STACK CFI 213fb .cfa: $rsp -128 + +STACK CFI INIT 21400 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2140e .cfa: $rsp 0 + +STACK CFI 21412 .cfa: $rsp 128 + +STACK CFI 2141a .cfa: $rsp -128 + +STACK CFI INIT 2141f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2142d .cfa: $rsp 0 + +STACK CFI 21431 .cfa: $rsp 128 + +STACK CFI 21439 .cfa: $rsp -128 + +STACK CFI INIT 2143e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2144c .cfa: $rsp 0 + +STACK CFI 21450 .cfa: $rsp 128 + +STACK CFI 21458 .cfa: $rsp -128 + +STACK CFI INIT 2145d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2146b .cfa: $rsp 0 + +STACK CFI 2146f .cfa: $rsp 128 + +STACK CFI 21477 .cfa: $rsp -128 + +STACK CFI INIT 2147c 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2148a .cfa: $rsp 0 + +STACK CFI 2148e .cfa: $rsp 128 + +STACK CFI 21496 .cfa: $rsp -128 + +STACK CFI INIT 203d0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 203e0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 135bd0 5a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 135bd1 .cfa: $rsp 16 + +STACK CFI 135bd2 .cfa: $rsp 24 + +STACK CFI 135bd5 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 135bd9 .cfa: $rsp 32 + +STACK CFI INIT 135c30 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 135c34 .cfa: $rsp 16 + +STACK CFI INIT 135c90 d9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 135c92 .cfa: $rsp 16 + +STACK CFI 135c95 $r13: .cfa -16 + ^ +STACK CFI 135c97 .cfa: $rsp 24 + +STACK CFI 135c98 .cfa: $rsp 32 + +STACK CFI 135c99 .cfa: $rsp 40 + +STACK CFI 135c9d .cfa: $rsp 48 + +STACK CFI 135ca8 $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 203f0 4f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 203fd $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 20401 .cfa: $rsp 32 + +STACK CFI INIT 20440 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 20450 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 20454 .cfa: $rsp 32 + +STACK CFI INIT 20490 c1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 20491 .cfa: $rsp 16 + +STACK CFI 20494 $rbp: .cfa -16 + ^ +STACK CFI 20495 .cfa: $rsp 24 + +STACK CFI 20498 $rbx: .cfa -24 + ^ +STACK CFI 2049c .cfa: $rsp 48 + +STACK CFI INIT 20560 bd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2056e .cfa: $rsp 32 + +STACK CFI 20575 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 20620 a6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 20622 .cfa: $rsp 16 + +STACK CFI 20626 .cfa: $rsp 24 + +STACK CFI 20627 .cfa: $rsp 32 + +STACK CFI 2062a $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI 2062b .cfa: $rsp 40 + +STACK CFI 2062e $rbx: .cfa -40 + ^ +STACK CFI 20637 .cfa: $rsp 48 + +STACK CFI INIT 206d0 a70 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 206d1 .cfa: $rsp 16 + +STACK CFI 206d7 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 20743 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 21140 282 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2114d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 21168 .cfa: $rsp 80 + +STACK CFI 21172 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 2220d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2221b .cfa: $rsp 0 + +STACK CFI 2221f .cfa: $rsp 128 + +STACK CFI 22227 .cfa: $rsp -128 + +STACK CFI INIT 2222c 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2223a .cfa: $rsp 0 + +STACK CFI 2223e .cfa: $rsp 128 + +STACK CFI 22246 .cfa: $rsp -128 + +STACK CFI INIT 135d70 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 214a0 ec .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 214a2 .cfa: $rsp 16 + +STACK CFI 214a5 $r14: .cfa -16 + ^ +STACK CFI 214a7 .cfa: $rsp 24 + +STACK CFI 214aa $r13: .cfa -24 + ^ +STACK CFI 214ac .cfa: $rsp 32 + +STACK CFI 214ad .cfa: $rsp 40 + +STACK CFI 214b4 $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ +STACK CFI 214b5 .cfa: $rsp 48 + +STACK CFI 214b7 $rbx: .cfa -48 + ^ +STACK CFI INIT 21590 359 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 21591 .cfa: $rsp 16 + +STACK CFI 21597 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 215a3 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 218f0 b9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 218f2 .cfa: $rsp 16 + +STACK CFI 218f5 $r13: .cfa -16 + ^ +STACK CFI 218f7 .cfa: $rsp 24 + +STACK CFI 218fa $r12: .cfa -24 + ^ +STACK CFI 218fb .cfa: $rsp 32 + +STACK CFI 218fc .cfa: $rsp 40 + +STACK CFI 218ff $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 21903 .cfa: $rsp 48 + +STACK CFI INIT 219b0 3c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 219b1 .cfa: $rsp 16 + +STACK CFI 219bb $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 219f8 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 21d80 48d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 21d81 .cfa: $rsp 16 + +STACK CFI 21d84 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 21db4 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 22250 da .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 22252 .cfa: $rsp 16 + +STACK CFI 22259 $r14: .cfa -16 + ^ +STACK CFI 2225b .cfa: $rsp 24 + +STACK CFI 2225e $r13: .cfa -24 + ^ +STACK CFI 22260 .cfa: $rsp 32 + +STACK CFI 22263 $r12: .cfa -32 + ^ +STACK CFI 22264 .cfa: $rsp 40 + +STACK CFI 22267 $rbp: .cfa -40 + ^ +STACK CFI 22268 .cfa: $rsp 48 + +STACK CFI 2226a $rbx: .cfa -48 + ^ +STACK CFI INIT 22330 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 22340 8f2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 22342 .cfa: $rsp 16 + +STACK CFI 22348 $r15: .cfa -16 + ^ +STACK CFI 22351 .cfa: $rsp 24 + +STACK CFI 22357 .cfa: $rsp 32 + +STACK CFI 22359 .cfa: $rsp 40 + +STACK CFI 2235c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 2235d .cfa: $rsp 48 + +STACK CFI 2235e .cfa: $rsp 56 + +STACK CFI 22365 .cfa: $rsp 240 + +STACK CFI 22388 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 22c40 5ca .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 22c42 .cfa: $rsp 16 + +STACK CFI 22c49 $r15: .cfa -16 + ^ +STACK CFI 22c4e .cfa: $rsp 24 + +STACK CFI 22c54 .cfa: $rsp 32 + +STACK CFI 22c56 .cfa: $rsp 40 + +STACK CFI 22c57 .cfa: $rsp 48 + +STACK CFI 22c5a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI 22c5b .cfa: $rsp 56 + +STACK CFI 22c62 .cfa: $rsp 192 + +STACK CFI 22c7c $rbx: .cfa -56 + ^ +STACK CFI INIT 23210 dfa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 23212 .cfa: $rsp 16 + +STACK CFI 23218 .cfa: $rsp 24 + +STACK CFI 2321b $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 23224 .cfa: $rsp 32 + +STACK CFI 23226 .cfa: $rsp 40 + +STACK CFI 23227 .cfa: $rsp 48 + +STACK CFI 2322a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI 2322b .cfa: $rsp 56 + +STACK CFI 23232 .cfa: $rsp 208 + +STACK CFI 23250 $rbx: .cfa -56 + ^ +STACK CFI INIT 24010 be8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 24012 .cfa: $rsp 16 + +STACK CFI 24018 $r15: .cfa -16 + ^ +STACK CFI 24021 .cfa: $rsp 24 + +STACK CFI 24027 .cfa: $rsp 32 + +STACK CFI 24029 .cfa: $rsp 40 + +STACK CFI 2402c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 2402d .cfa: $rsp 48 + +STACK CFI 2402e .cfa: $rsp 56 + +STACK CFI 24035 .cfa: $rsp 240 + +STACK CFI 24038 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 24c00 89e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 24c02 .cfa: $rsp 16 + +STACK CFI 24c08 $r15: .cfa -16 + ^ +STACK CFI 24c11 .cfa: $rsp 24 + +STACK CFI 24c17 .cfa: $rsp 32 + +STACK CFI 24c19 .cfa: $rsp 40 + +STACK CFI 24c1c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 24c1d .cfa: $rsp 48 + +STACK CFI 24c1e .cfa: $rsp 56 + +STACK CFI 24c25 .cfa: $rsp 240 + +STACK CFI 24c48 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 254a0 388 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 254a2 .cfa: $rsp 16 + +STACK CFI 254a8 $r15: .cfa -16 + ^ +STACK CFI 254ae .cfa: $rsp 24 + +STACK CFI 254b0 .cfa: $rsp 32 + +STACK CFI 254b2 .cfa: $rsp 40 + +STACK CFI 254b3 .cfa: $rsp 48 + +STACK CFI 254b6 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI 254b7 .cfa: $rsp 56 + +STACK CFI 254bb .cfa: $rsp 176 + +STACK CFI 254e4 $rbx: .cfa -56 + ^ +STACK CFI INIT 25830 4aa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 25832 .cfa: $rsp 16 + +STACK CFI 25839 $r15: .cfa -16 + ^ +STACK CFI 2583b .cfa: $rsp 24 + +STACK CFI 2583e $r14: .cfa -24 + ^ +STACK CFI 25844 .cfa: $rsp 32 + +STACK CFI 25846 .cfa: $rsp 40 + +STACK CFI 25847 .cfa: $rsp 48 + +STACK CFI 25848 .cfa: $rsp 56 + +STACK CFI 2584c .cfa: $rsp 176 + +STACK CFI 25865 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 25ce0 900 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 25ce2 .cfa: $rsp 16 + +STACK CFI 25ce8 $r15: .cfa -16 + ^ +STACK CFI 25cf1 .cfa: $rsp 24 + +STACK CFI 25cf7 .cfa: $rsp 32 + +STACK CFI 25cf9 .cfa: $rsp 40 + +STACK CFI 25cfc $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 25cfd .cfa: $rsp 48 + +STACK CFI 25cfe .cfa: $rsp 56 + +STACK CFI 25d05 .cfa: $rsp 240 + +STACK CFI 25d28 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 265e0 5c9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 265e2 .cfa: $rsp 16 + +STACK CFI 265e9 $r15: .cfa -16 + ^ +STACK CFI 265ee .cfa: $rsp 24 + +STACK CFI 265f4 .cfa: $rsp 32 + +STACK CFI 265f6 .cfa: $rsp 40 + +STACK CFI 265f7 .cfa: $rsp 48 + +STACK CFI 265fa $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI 265fb .cfa: $rsp 56 + +STACK CFI 26602 .cfa: $rsp 192 + +STACK CFI 2661c $rbx: .cfa -56 + ^ +STACK CFI INIT 26bb0 4bb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 26bb2 .cfa: $rsp 16 + +STACK CFI 26bb8 $r15: .cfa -16 + ^ +STACK CFI 26bba .cfa: $rsp 24 + +STACK CFI 26bbd $r14: .cfa -24 + ^ +STACK CFI 26bc3 .cfa: $rsp 32 + +STACK CFI 26bc5 .cfa: $rsp 40 + +STACK CFI 26bc6 .cfa: $rsp 48 + +STACK CFI 26bc7 .cfa: $rsp 56 + +STACK CFI 26bcb .cfa: $rsp 176 + +STACK CFI 26bf1 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 27070 40f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 27072 .cfa: $rsp 16 + +STACK CFI 27079 $r15: .cfa -16 + ^ +STACK CFI 2707b .cfa: $rsp 24 + +STACK CFI 2707e $r14: .cfa -24 + ^ +STACK CFI 27080 .cfa: $rsp 32 + +STACK CFI 27082 .cfa: $rsp 40 + +STACK CFI 27083 .cfa: $rsp 48 + +STACK CFI 27084 .cfa: $rsp 56 + +STACK CFI 27088 .cfa: $rsp 176 + +STACK CFI 270ab $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 27480 3f4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 27482 .cfa: $rsp 16 + +STACK CFI 27489 $r15: .cfa -16 + ^ +STACK CFI 2748b .cfa: $rsp 24 + +STACK CFI 2748d .cfa: $rsp 32 + +STACK CFI 2748f .cfa: $rsp 40 + +STACK CFI 27490 .cfa: $rsp 48 + +STACK CFI 27491 .cfa: $rsp 56 + +STACK CFI 27494 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 27498 .cfa: $rsp 176 + +STACK CFI INIT 28046 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 28054 .cfa: $rsp 0 + +STACK CFI 28058 .cfa: $rsp 128 + +STACK CFI 28060 .cfa: $rsp -128 + +STACK CFI INIT 28065 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 28073 .cfa: $rsp 0 + +STACK CFI 28077 .cfa: $rsp 128 + +STACK CFI 2807f .cfa: $rsp -128 + +STACK CFI INIT 27880 c0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 27881 .cfa: $rsp 16 + +STACK CFI 27884 $rbx: .cfa -16 + ^ +STACK CFI INIT 27940 29c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2794d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 27965 .cfa: $rsp 64 + +STACK CFI 2796f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 27be0 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 27bf0 456 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 27bf2 .cfa: $rsp 16 + +STACK CFI 27bf4 .cfa: $rsp 24 + +STACK CFI 27bf7 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 27bf9 .cfa: $rsp 32 + +STACK CFI 27bfb .cfa: $rsp 40 + +STACK CFI 27bfc .cfa: $rsp 48 + +STACK CFI 27bfd .cfa: $rsp 56 + +STACK CFI 27c04 .cfa: $rsp 240 + +STACK CFI 27c2a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 28090 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 280a0 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 135da0 3a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 280c0 f5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 280c2 .cfa: $rsp 16 + +STACK CFI 280c4 .cfa: $rsp 24 + +STACK CFI 280c6 .cfa: $rsp 32 + +STACK CFI 280c9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 280cb .cfa: $rsp 40 + +STACK CFI 280cc .cfa: $rsp 48 + +STACK CFI 280cd .cfa: $rsp 56 + +STACK CFI 280d1 .cfa: $rsp 96 + +STACK CFI 280e7 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 281c0 7f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 281cd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 281d6 .cfa: $rsp 48 + +STACK CFI 281e4 $r12: .cfa -16 + ^ +STACK CFI INIT 28240 106 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 28241 .cfa: $rsp 16 + +STACK CFI 28244 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 2824f $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 2825a $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 28265 $r15: .cfa -24 + ^ +STACK CFI INIT 28350 484 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2835d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 28378 .cfa: $rsp 128 + +STACK CFI 2837f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 287e0 1d4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 287f8 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ .cfa: $rsp 176 + +STACK CFI INIT 135de0 27 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 135de4 .cfa: $rsp 16 + +STACK CFI INIT 135e10 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 135e11 .cfa: $rsp 16 + +STACK CFI 135e14 $rbx: .cfa -16 + ^ +STACK CFI INIT 289c0 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 289e0 89 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 289e4 .cfa: $rsp 16 + +STACK CFI 289e7 $rbx: .cfa -16 + ^ +STACK CFI INIT 28a70 1df .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 28a71 .cfa: $rsp 16 + +STACK CFI 28a80 .cfa: $rsp 24 + +STACK CFI 28a84 .cfa: $rsp 48 + +STACK CFI 28a8e $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 28c50 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 28c60 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 28c80 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 28c8c $rbx: .cfa -32 + ^ +STACK CFI 28c94 $rbp: .cfa -24 + ^ +STACK CFI 28c9d .cfa: $rsp 32 + +STACK CFI 28ca8 $r12: .cfa -16 + ^ +STACK CFI INIT 135e30 104 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 135e32 .cfa: $rsp 16 + +STACK CFI 135e39 $r15: .cfa -16 + ^ +STACK CFI 135e3b .cfa: $rsp 24 + +STACK CFI 135e3d .cfa: $rsp 32 + +STACK CFI 135e43 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 135e45 .cfa: $rsp 40 + +STACK CFI 135e48 $r12: .cfa -40 + ^ +STACK CFI 135e49 .cfa: $rsp 48 + +STACK CFI 135e4a .cfa: $rsp 56 + +STACK CFI 135e4e .cfa: $rsp 80 + +STACK CFI 135e62 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 28ce0 232 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 28ce2 .cfa: $rsp 16 + +STACK CFI 28ceb $r15: .cfa -16 + ^ +STACK CFI 28ced .cfa: $rsp 24 + +STACK CFI 28cf0 $r14: .cfa -24 + ^ +STACK CFI 28cf2 .cfa: $rsp 32 + +STACK CFI 28cf4 .cfa: $rsp 40 + +STACK CFI 28cf7 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 28cf8 .cfa: $rsp 48 + +STACK CFI 28cfd $rbp: .cfa -48 + ^ +STACK CFI 28cfe .cfa: $rsp 56 + +STACK CFI 28d00 $rbx: .cfa -56 + ^ +STACK CFI 28d04 .cfa: $rsp 96 + +STACK CFI INIT 28f20 6c1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 28f21 .cfa: $rsp 16 + +STACK CFI 28f24 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 28f2b $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 28f32 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ +STACK CFI 28f36 $rbx: .cfa -56 + ^ +STACK CFI INIT 295f0 aa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 296a0 5a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 29700 4de .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 29701 .cfa: $rsp 16 + +STACK CFI 29704 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 2970f $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 2971a $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 29737 $r15: .cfa -24 + ^ +STACK CFI INIT 29be0 57 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 29be1 .cfa: $rsp 16 + +STACK CFI 29be8 $rbx: .cfa -16 + ^ +STACK CFI INIT 29c40 38c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 29c42 .cfa: $rsp 16 + +STACK CFI 29c45 $r13: .cfa -16 + ^ +STACK CFI 29c47 .cfa: $rsp 24 + +STACK CFI 29c48 .cfa: $rsp 32 + +STACK CFI 29c4b $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ +STACK CFI 29c4c .cfa: $rsp 40 + +STACK CFI 29c4e $rbx: .cfa -40 + ^ +STACK CFI 29c52 .cfa: $rsp 48 + +STACK CFI INIT 29fd0 2ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 29fd1 .cfa: $rsp 16 + +STACK CFI 29fd6 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 29fe1 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 29fec $r13: .cfa -40 + ^ $r15: .cfa -24 + ^ +STACK CFI 2a00b $r14: .cfa -32 + ^ +STACK CFI INIT 135f40 107 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 135f42 .cfa: $rsp 16 + +STACK CFI 135f44 .cfa: $rsp 24 + +STACK CFI 135f4b $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 135f4d .cfa: $rsp 32 + +STACK CFI 135f51 .cfa: $rsp 40 + +STACK CFI 135f52 .cfa: $rsp 48 + +STACK CFI 135f54 $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 2a280 548 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2a281 .cfa: $rsp 16 + +STACK CFI 2a284 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 2a2a9 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 2a7d0 1be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2a990 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2a9a0 5b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2aa00 6ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2aa01 .cfa: $rsp 16 + +STACK CFI 2aa04 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 2aa10 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 2b0b0 192 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2b0b2 .cfa: $rsp 16 + +STACK CFI 2b0bb .cfa: $rsp 24 + +STACK CFI 2b0c0 .cfa: $rsp 32 + +STACK CFI 2b0c1 .cfa: $rsp 40 + +STACK CFI 2b0c4 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI 2b0c5 .cfa: $rsp 48 + +STACK CFI 2b0cb $rbx: .cfa -48 + ^ +STACK CFI INIT 2b250 be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2b252 .cfa: $rsp 16 + +STACK CFI 2b25a .cfa: $rsp 24 + +STACK CFI 2b25e .cfa: $rsp 32 + +STACK CFI 2b261 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 2b310 5f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b370 43 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b3c0 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b410 f6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b510 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b530 14f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2b53d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 2b558 .cfa: $rsp 128 + +STACK CFI 2b561 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 2b680 15f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2b68c $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI 2b699 $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI 2b6aa .cfa: $rsp 1152 + +STACK CFI 2b6c0 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI INIT 2b7e0 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2b7e4 .cfa: $rsp 16 + +STACK CFI INIT 2b7f0 30 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b820 30 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b850 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b890 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b8d0 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b910 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b950 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b990 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2b9d0 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2ba10 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2ba50 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2ba90 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bad0 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bb10 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bb30 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bb50 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bb60 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bb70 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bb80 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bbc0 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bbd0 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bbf0 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bc00 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bc20 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bc40 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bc60 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bc80 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bc90 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bcb0 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bcd0 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bcf0 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bd00 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bd10 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bd30 37 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bd70 37 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bdb0 37 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2bdf0 3f6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2bdfd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 2be18 .cfa: $rsp 80 + +STACK CFI 2be1e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 2c1f0 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2c1f4 .cfa: $rsp 32 + +STACK CFI INIT 2c210 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2c214 .cfa: $rsp 32 + +STACK CFI INIT 2c230 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2c240 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2c250 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2da9e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2daac .cfa: $rsp 0 + +STACK CFI 2dab0 .cfa: $rsp 128 + +STACK CFI 2dab8 .cfa: $rsp -128 + +STACK CFI INIT 2dabd 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2dacb .cfa: $rsp 0 + +STACK CFI 2dacf .cfa: $rsp 128 + +STACK CFI 2dad7 .cfa: $rsp -128 + +STACK CFI INIT 2dadc 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2daea .cfa: $rsp 0 + +STACK CFI 2daee .cfa: $rsp 128 + +STACK CFI 2daf6 .cfa: $rsp -128 + +STACK CFI INIT 2dafb 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2db09 .cfa: $rsp 0 + +STACK CFI 2db0d .cfa: $rsp 128 + +STACK CFI 2db15 .cfa: $rsp -128 + +STACK CFI INIT 2db1a 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2db28 .cfa: $rsp 0 + +STACK CFI 2db2c .cfa: $rsp 128 + +STACK CFI 2db34 .cfa: $rsp -128 + +STACK CFI INIT 2db39 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2db47 .cfa: $rsp 0 + +STACK CFI 2db4b .cfa: $rsp 128 + +STACK CFI 2db53 .cfa: $rsp -128 + +STACK CFI INIT 2c260 1df .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2c268 $rbp: .cfa -24 + ^ +STACK CFI 2c276 .cfa: $rsp 32 + +STACK CFI 2c27c $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 136050 b8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136052 .cfa: $rsp 16 + +STACK CFI 136053 .cfa: $rsp 24 + +STACK CFI 13605a $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI 13605b .cfa: $rsp 32 + +STACK CFI 13605f $rbx: .cfa -32 + ^ +STACK CFI INIT 2c440 76 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2c441 .cfa: $rsp 16 + +STACK CFI 2c444 $rbp: .cfa -16 + ^ +STACK CFI 2c445 .cfa: $rsp 24 + +STACK CFI 2c448 $rbx: .cfa -24 + ^ +STACK CFI 2c450 .cfa: $rsp 32 + +STACK CFI INIT 2c4c0 c39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2c4c1 .cfa: $rsp 16 + +STACK CFI 2c4c4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 2c4fd $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 2d100 75 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2d102 .cfa: $rsp 16 + +STACK CFI 2d104 .cfa: $rsp 24 + +STACK CFI 2d107 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI 2d108 .cfa: $rsp 32 + +STACK CFI 2d109 .cfa: $rsp 40 + +STACK CFI 2d10c $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 2d114 .cfa: $rsp 48 + +STACK CFI INIT 2d180 91e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2d181 .cfa: $rsp 16 + +STACK CFI 2d184 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 2d1c6 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 2db60 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2db70 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2db80 16 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 136110 49 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136111 .cfa: $rsp 16 + +STACK CFI 136112 .cfa: $rsp 24 + +STACK CFI 136116 .cfa: $rsp 32 + +STACK CFI 13611d $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 2dba0 315 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2dba1 .cfa: $rsp 16 + +STACK CFI 2dba4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 2dbaf $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ +STACK CFI 2dbba $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 2dbdb $rbx: .cfa -56 + ^ +STACK CFI INIT 2ef65 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2ef73 .cfa: $rsp 0 + +STACK CFI 2ef77 .cfa: $rsp 128 + +STACK CFI 2ef7f .cfa: $rsp -128 + +STACK CFI INIT 2ef84 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2ef92 .cfa: $rsp 0 + +STACK CFI 2ef96 .cfa: $rsp 128 + +STACK CFI 2ef9e .cfa: $rsp -128 + +STACK CFI INIT 136160 c6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136162 .cfa: $rsp 16 + +STACK CFI 13616b .cfa: $rsp 24 + +STACK CFI 13616c .cfa: $rsp 32 + +STACK CFI 13616d .cfa: $rsp 40 + +STACK CFI 136170 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 136174 .cfa: $rsp 48 + +STACK CFI INIT 2dec0 10a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2dec1 .cfa: $rsp 16 + +STACK CFI 2decd $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 2ded8 $r14: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI 2def7 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r15: .cfa -24 + ^ +STACK CFI INIT 2f59b 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2f5a9 .cfa: $rsp 0 + +STACK CFI 2f5ad .cfa: $rsp 128 + +STACK CFI 2f5b5 .cfa: $rsp -128 + +STACK CFI INIT 2f5ba 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 2f5c8 .cfa: $rsp 0 + +STACK CFI 2f5cc .cfa: $rsp 128 + +STACK CFI 2f5d4 .cfa: $rsp -128 + +STACK CFI INIT 2efb0 49a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2efb1 .cfa: $rsp 16 + +STACK CFI 2efbe $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 2efda $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 2f450 136 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2f451 .cfa: $rsp 16 + +STACK CFI 2f459 .cfa: $rsp 24 + +STACK CFI 2f45c $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 2f460 .cfa: $rsp 48 + +STACK CFI INIT 2f590 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2f5e0 131 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2f5e1 .cfa: $rsp 16 + +STACK CFI 2f5e2 .cfa: $rsp 24 + +STACK CFI 2f5e5 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 2f5e9 .cfa: $rsp 32 + +STACK CFI INIT 2f720 1b5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2f722 .cfa: $rsp 16 + +STACK CFI 2f72b $r12: .cfa -16 + ^ +STACK CFI 2f72c .cfa: $rsp 24 + +STACK CFI 2f72f $rbp: .cfa -24 + ^ +STACK CFI 2f730 .cfa: $rsp 32 + +STACK CFI 2f733 $rbx: .cfa -32 + ^ +STACK CFI INIT 2f8e0 4bd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2f8e2 .cfa: $rsp 16 + +STACK CFI 2f8e4 .cfa: $rsp 24 + +STACK CFI 2f8e6 .cfa: $rsp 32 + +STACK CFI 2f8e9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 2f8eb .cfa: $rsp 40 + +STACK CFI 2f8ec .cfa: $rsp 48 + +STACK CFI 2f8ed .cfa: $rsp 56 + +STACK CFI 2f8f4 .cfa: $rsp 192 + +STACK CFI 2f910 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 2fda0 265 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2fda2 .cfa: $rsp 16 + +STACK CFI 2fda3 .cfa: $rsp 24 + +STACK CFI 2fda4 .cfa: $rsp 32 + +STACK CFI 2fda8 .cfa: $rsp 64 + +STACK CFI 2fdd2 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 30010 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 30014 .cfa: $rsp 16 + +STACK CFI 30017 $rbx: .cfa -16 + ^ +STACK CFI INIT 30070 c7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 30072 .cfa: $rsp 16 + +STACK CFI 30075 $r13: .cfa -16 + ^ +STACK CFI 30077 .cfa: $rsp 24 + +STACK CFI 3007a $r12: .cfa -24 + ^ +STACK CFI 3007b .cfa: $rsp 32 + +STACK CFI 3007d $rbp: .cfa -32 + ^ +STACK CFI 3007e .cfa: $rsp 40 + +STACK CFI 30080 $rbx: .cfa -40 + ^ +STACK CFI 30084 .cfa: $rsp 48 + +STACK CFI INIT 30140 86f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 30142 .cfa: $rsp 16 + +STACK CFI 30151 .cfa: $rsp 24 + +STACK CFI 30157 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 30159 .cfa: $rsp 32 + +STACK CFI 30160 $r13: .cfa -32 + ^ +STACK CFI 30162 .cfa: $rsp 40 + +STACK CFI 30163 .cfa: $rsp 48 + +STACK CFI 30164 .cfa: $rsp 56 + +STACK CFI 3016b .cfa: $rsp 2192 + +STACK CFI 30178 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 309b0 107 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 309b2 .cfa: $rsp 16 + +STACK CFI 309b4 .cfa: $rsp 24 + +STACK CFI 309b7 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI 309b8 .cfa: $rsp 32 + +STACK CFI 309bb $rbp: .cfa -32 + ^ +STACK CFI 309bc .cfa: $rsp 40 + +STACK CFI 309bf $rbx: .cfa -40 + ^ +STACK CFI 309c3 .cfa: $rsp 80 + +STACK CFI INIT 30ac0 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 30b00 94 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 30b01 .cfa: $rsp 16 + +STACK CFI 30b09 .cfa: $rsp 24 + +STACK CFI 30b0b $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 30ba0 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 30ba5 .cfa: $rsp 16 + +STACK CFI 30ba8 $rbx: .cfa -16 + ^ +STACK CFI INIT 30c10 235 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 30c11 .cfa: $rsp 16 + +STACK CFI 30c14 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 30c1e $r12: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 30c35 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI INIT 30e50 8b9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 30e51 .cfa: $rsp 16 + +STACK CFI 30e54 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 30e60 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 31710 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31750 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31780 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 317a0 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 317c0 ea .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 318b0 10a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 319c0 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31a70 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 31a71 .cfa: $rsp 16 + +STACK CFI 31a77 $rbx: .cfa -16 + ^ +STACK CFI 31a7b .cfa: $rsp 48 + +STACK CFI INIT 31b00 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31b10 23 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31b40 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31b60 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31b80 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31ba0 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31c30 d7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31d10 66 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31d80 82 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 31d81 .cfa: $rsp 16 + +STACK CFI 31d86 $rbx: .cfa -16 + ^ +STACK CFI 31d8a .cfa: $rsp 48 + +STACK CFI INIT 31e10 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31e20 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31e70 3f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31eb0 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31ec0 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31ee0 173 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32060 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32080 92 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32120 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32121 .cfa: $rsp 16 + +STACK CFI 32123 $rbx: .cfa -16 + ^ +STACK CFI 32127 .cfa: $rsp 64 + +STACK CFI INIT 321b0 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 321d0 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 321f0 57 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32250 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32253 .cfa: $rsp 16 + +STACK CFI 32256 $rbx: .cfa -16 + ^ +STACK CFI INIT 32290 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 322a0 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 322b0 4a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 322be .cfa: $rsp 32 + +STACK CFI 322c1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 32300 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32333 $r12: .cfa 16 + ^ $r13: .cfa 24 + ^ $r14: .cfa 32 + ^ $r15: .cfa 40 + ^ $rbp: $r9 $rbx: .cfa 0 + ^ $rsp: $r8 .cfa: $rdi 0 + .ra: $rdx +STACK CFI INIT 32350 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32380 b5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32387 .cfa: $rsp 336 + +STACK CFI INIT 32440 66 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 324b0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 324ef a .ra: $rip +STACK CFI INIT 32500 1f6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32507 .cfa: $rsp 216 + +STACK CFI INIT 32700 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32720 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32750 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32780 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 327b0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 327e0 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 327e4 .cfa: $rsp 32 + +STACK CFI INIT 32870 80 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32871 .cfa: $rsp 16 + +STACK CFI 32877 $rbx: .cfa -16 + ^ +STACK CFI 3287b .cfa: $rsp 24 + +STACK CFI INIT 328f0 4a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 328f1 .cfa: $rsp 16 + +STACK CFI 328f5 .cfa: $rsp 32 + +STACK CFI 328fb $rbx: .cfa -16 + ^ +STACK CFI INIT 32940 57 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32947 .cfa: $rsp 272 + +STACK CFI INIT 329a0 5a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 329a7 .cfa: $rsp 272 + +STACK CFI INIT 32a00 72 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32a01 .cfa: $rsp 16 + +STACK CFI 32a03 $rbp: .cfa -16 + ^ +STACK CFI 32a04 .cfa: $rsp 24 + +STACK CFI 32a0b .cfa: $rsp 160 + +STACK CFI 32a0f $rbx: .cfa -24 + ^ +STACK CFI INIT 32a80 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32a81 .cfa: $rsp 16 + +STACK CFI 32a85 .cfa: $rsp 32 + +STACK CFI 32a8b $rbx: .cfa -16 + ^ +STACK CFI INIT 32ad0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32ae0 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32af0 eb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32af1 .cfa: $rsp 16 + +STACK CFI 32af6 $rbx: .cfa -16 + ^ +STACK CFI 32afd .cfa: $rsp 336 + +STACK CFI INIT 32be0 5f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32be1 .cfa: $rsp 16 + +STACK CFI 32be4 $rbx: .cfa -16 + ^ +STACK CFI 32bea .cfa: $rsp 80 + +STACK CFI INIT 32c40 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32c70 cf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32c7d $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI 32c89 .cfa: $rsp 192 + +STACK CFI 32c90 $rbp: .cfa -24 + ^ +STACK CFI INIT 32d40 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32d60 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32d80 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32da0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32dd0 ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32e80 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32ec0 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32f00 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32f50 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32f70 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 32f80 8f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32f87 .cfa: $rsp 336 + +STACK CFI INIT 33010 45 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 33060 48 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 330b0 48 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 33100 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 33110 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 33120 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 33170 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33174 .cfa: $rsp 24 + +STACK CFI INIT 33200 58 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33201 .cfa: $rsp 16 + +STACK CFI 33205 .cfa: $rsp 48 + +STACK CFI 3320f $rbx: .cfa -16 + ^ +STACK CFI INIT 33260 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33264 .cfa: $rsp 24 + +STACK CFI INIT 332f0 4a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 332f1 .cfa: $rsp 16 + +STACK CFI 332f5 .cfa: $rsp 32 + +STACK CFI 332fb $rbx: .cfa -16 + ^ +STACK CFI INIT 33340 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3334c $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 3335d .cfa: $rsp 176 + +STACK CFI 3336d $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 333f0 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33401 .cfa: $rsp 160 + +STACK CFI 33405 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 33460 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33471 .cfa: $rsp 160 + +STACK CFI 33475 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 334d0 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 334d7 .cfa: $rsp 176 + +STACK CFI INIT 33520 195 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3352c $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 33538 .cfa: $rsp 608 + +STACK CFI 33542 $r12: .cfa -16 + ^ +STACK CFI INIT 336c0 6b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 33730 6c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33731 .cfa: $rsp 16 + +STACK CFI 3373b $rbx: .cfa -16 + ^ +STACK CFI INIT 337a0 8c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 337b5 .cfa: $rsp 48 + +STACK CFI 337bb $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 33830 8c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33845 .cfa: $rsp 48 + +STACK CFI 3384b $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 338c0 ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 33970 eb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 33a60 5c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 33ac0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 33b30 4b0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33b32 .cfa: $rsp 16 + +STACK CFI 33b37 .cfa: $rsp 24 + +STACK CFI 33b39 .cfa: $rsp 32 + +STACK CFI 33b3b .cfa: $rsp 40 + +STACK CFI 33b3c .cfa: $rsp 48 + +STACK CFI 33b3f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI 33b40 .cfa: $rsp 56 + +STACK CFI 33b43 $rbx: .cfa -56 + ^ +STACK CFI 33b47 .cfa: $rsp 176 + +STACK CFI INIT 33fe0 103 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 340f0 103 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 34200 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 34250 397 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 34251 .cfa: $rsp 16 + +STACK CFI 34254 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 34259 $r15: .cfa -24 + ^ +STACK CFI 3425e $r14: .cfa -32 + ^ +STACK CFI 34265 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ +STACK CFI 34269 $rbx: .cfa -56 + ^ +STACK CFI INIT 345f0 119 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 345f1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 34708 $rbx: $rbx .cfa: $rsp 8 + +STACK CFI INIT 34710 108 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 34712 .cfa: $rsp 16 + +STACK CFI 34714 .cfa: $rsp 24 + +STACK CFI 34717 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 34719 .cfa: $rsp 32 + +STACK CFI 3471c $r12: .cfa -32 + ^ +STACK CFI 3471d .cfa: $rsp 40 + +STACK CFI 34720 $rbp: .cfa -40 + ^ +STACK CFI 34721 .cfa: $rsp 48 + +STACK CFI 3472e $rbx: .cfa -48 + ^ +STACK CFI INIT 34820 376 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 34822 .cfa: $rsp 16 + +STACK CFI 34824 .cfa: $rsp 24 + +STACK CFI 34827 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 34829 .cfa: $rsp 32 + +STACK CFI 3482c $r13: .cfa -32 + ^ +STACK CFI 3482e .cfa: $rsp 40 + +STACK CFI 34831 $r12: .cfa -40 + ^ +STACK CFI 34832 .cfa: $rsp 48 + +STACK CFI 34835 $rbp: .cfa -48 + ^ +STACK CFI 34836 .cfa: $rsp 56 + +STACK CFI 3483a .cfa: $rsp 112 + +STACK CFI 3483f $rbx: .cfa -56 + ^ +STACK CFI INIT 34ba0 117 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 34ba2 .cfa: $rsp 16 + +STACK CFI 34ba5 $r15: .cfa -16 + ^ +STACK CFI 34ba7 .cfa: $rsp 24 + +STACK CFI 34ba9 .cfa: $rsp 32 + +STACK CFI 34bac $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 34bae .cfa: $rsp 40 + +STACK CFI 34bb1 $r12: .cfa -40 + ^ +STACK CFI 34bb2 .cfa: $rsp 48 + +STACK CFI 34bb5 $rbp: .cfa -48 + ^ +STACK CFI 34bb6 .cfa: $rsp 56 + +STACK CFI 34bba .cfa: $rsp 64 + +STACK CFI 34bc7 $rbx: .cfa -56 + ^ +STACK CFI INIT 34cc0 410 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 34cc2 .cfa: $rsp 16 + +STACK CFI 34cc5 $r15: .cfa -16 + ^ +STACK CFI 34cc7 .cfa: $rsp 24 + +STACK CFI 34cca $r14: .cfa -24 + ^ +STACK CFI 34ccc .cfa: $rsp 32 + +STACK CFI 34ccf $r13: .cfa -32 + ^ +STACK CFI 34cd1 .cfa: $rsp 40 + +STACK CFI 34cd4 $r12: .cfa -40 + ^ +STACK CFI 34cd5 .cfa: $rsp 48 + +STACK CFI 34cd8 $rbp: .cfa -48 + ^ +STACK CFI 34cd9 .cfa: $rsp 56 + +STACK CFI 34cdd .cfa: $rsp 128 + +STACK CFI 34ce2 $rbx: .cfa -56 + ^ +STACK CFI INIT 350d0 81 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 350d1 .cfa: $rsp 16 + +STACK CFI 350da $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI INIT 35160 ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 35210 eb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 35300 9c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 353a0 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 353a1 .cfa: $rsp 16 + +STACK CFI 353aa $rbx: .cfa -16 + ^ +STACK CFI INIT 35470 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 354a0 3a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 354e0 3f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 35520 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 35530 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 35534 .cfa: $rsp 16 + +STACK CFI INIT 35550 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 35560 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 357af 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 357bd .cfa: $rsp 0 + +STACK CFI 357c1 .cfa: $rsp 128 + +STACK CFI 357c9 .cfa: $rsp -128 + +STACK CFI INIT 357ce 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 357dc .cfa: $rsp 0 + +STACK CFI 357e0 .cfa: $rsp 128 + +STACK CFI 357e8 .cfa: $rsp -128 + +STACK CFI INIT 357ed 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 357fb .cfa: $rsp 0 + +STACK CFI 357ff .cfa: $rsp 128 + +STACK CFI 35807 .cfa: $rsp -128 + +STACK CFI INIT 35570 23f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 35577 .cfa: $rsp 304 + +STACK CFI INIT 35810 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 35812 .cfa: $rsp 16 + +STACK CFI 35815 $r15: .cfa -16 + ^ +STACK CFI 35817 .cfa: $rsp 24 + +STACK CFI 3581a $r14: .cfa -24 + ^ +STACK CFI 3581c .cfa: $rsp 32 + +STACK CFI 3581e .cfa: $rsp 40 + +STACK CFI 35821 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 35822 .cfa: $rsp 48 + +STACK CFI 35825 $rbp: .cfa -48 + ^ +STACK CFI 35826 .cfa: $rsp 56 + +STACK CFI 35829 $rbx: .cfa -56 + ^ +STACK CFI 3582d .cfa: $rsp 80 + +STACK CFI INIT 358a0 498 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 358a2 .cfa: $rsp 16 + +STACK CFI 358a4 .cfa: $rsp 24 + +STACK CFI 358a6 .cfa: $rsp 32 + +STACK CFI 358a9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 358ab .cfa: $rsp 40 + +STACK CFI 358ac .cfa: $rsp 48 + +STACK CFI 358af $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 358b0 .cfa: $rsp 56 + +STACK CFI 358b3 $rbx: .cfa -56 + ^ +STACK CFI 358ba .cfa: $rsp 1152 + +STACK CFI INIT 35d40 32f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 35d42 .cfa: $rsp 16 + +STACK CFI 35d44 .cfa: $rsp 24 + +STACK CFI 35d46 .cfa: $rsp 32 + +STACK CFI 35d48 .cfa: $rsp 40 + +STACK CFI 35d49 .cfa: $rsp 48 + +STACK CFI 35d4a .cfa: $rsp 56 + +STACK CFI 35d4e .cfa: $rsp 128 + +STACK CFI 35d67 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 36070 32b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36071 .cfa: $rsp 16 + +STACK CFI 36074 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 3607b $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 36082 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ +STACK CFI 36086 $rbx: .cfa -56 + ^ +STACK CFI INIT 363a0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 363b0 11a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 363c7 $r12: .cfa -40 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 363d5 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ .cfa: $rsp 64 + +STACK CFI INIT 364d0 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 364d1 .cfa: $rsp 16 + +STACK CFI 364d9 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 364dd $rbx: .cfa -24 + ^ +STACK CFI INIT 36be6 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 36bf4 .cfa: $rsp 0 + +STACK CFI 36bf8 .cfa: $rsp 128 + +STACK CFI 36c00 .cfa: $rsp -128 + +STACK CFI INIT 36c05 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 36c13 .cfa: $rsp 0 + +STACK CFI 36c17 .cfa: $rsp 128 + +STACK CFI 36c1f .cfa: $rsp -128 + +STACK CFI INIT 36c24 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 36c32 .cfa: $rsp 0 + +STACK CFI 36c36 .cfa: $rsp 128 + +STACK CFI 36c3e .cfa: $rsp -128 + +STACK CFI INIT 36c43 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 36c51 .cfa: $rsp 0 + +STACK CFI 36c55 .cfa: $rsp 128 + +STACK CFI 36c5d .cfa: $rsp -128 + +STACK CFI INIT 36c62 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 36c70 .cfa: $rsp 0 + +STACK CFI 36c74 .cfa: $rsp 128 + +STACK CFI 36c7c .cfa: $rsp -128 + +STACK CFI INIT 36c81 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 36c8f .cfa: $rsp 0 + +STACK CFI 36c93 .cfa: $rsp 128 + +STACK CFI 36c9b .cfa: $rsp -128 + +STACK CFI INIT 36ca0 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 36cae .cfa: $rsp 0 + +STACK CFI 36cb2 .cfa: $rsp 128 + +STACK CFI 36cba .cfa: $rsp -128 + +STACK CFI INIT 36cbf 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 36ccd .cfa: $rsp 0 + +STACK CFI 36cd1 .cfa: $rsp 128 + +STACK CFI 36cd9 .cfa: $rsp -128 + +STACK CFI INIT 36550 87 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36551 .cfa: $rsp 16 + +STACK CFI 36585 $rbx: .cfa -16 + ^ +STACK CFI INIT 136230 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136234 .cfa: $rsp 16 + +STACK CFI INIT 365e0 11e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 365e2 .cfa: $rsp 16 + +STACK CFI 365e4 .cfa: $rsp 24 + +STACK CFI 365e5 .cfa: $rsp 32 + +STACK CFI 365e6 .cfa: $rsp 40 + +STACK CFI 365e9 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 365ed .cfa: $rsp 48 + +STACK CFI INIT 36700 453 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36701 .cfa: $rsp 16 + +STACK CFI 36704 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 3670f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 3671f $rbx: .cfa -56 + ^ +STACK CFI INIT 36b60 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36b6d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 36b76 .cfa: $rsp 32 + +STACK CFI 36b7f $r12: .cfa -16 + ^ +STACK CFI INIT 36ce0 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 36d00 12e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36d02 .cfa: $rsp 16 + +STACK CFI 36d05 $r13: .cfa -16 + ^ +STACK CFI 36d07 .cfa: $rsp 24 + +STACK CFI 36d08 .cfa: $rsp 32 + +STACK CFI 36d0b $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ +STACK CFI 36d0c .cfa: $rsp 40 + +STACK CFI 36d0e $rbx: .cfa -40 + ^ +STACK CFI 36d12 .cfa: $rsp 48 + +STACK CFI INIT 36e30 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36e3b .cfa: $rsp 16 + +STACK CFI INIT 36e50 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36e58 $rbx: .cfa -24 + ^ +STACK CFI 36e68 .cfa: $rsp 32 + +STACK CFI 36e6b $rbp: .cfa -16 + ^ +STACK CFI INIT 3708c 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 3709a .cfa: $rsp 0 + +STACK CFI 3709e .cfa: $rsp 128 + +STACK CFI 370a6 .cfa: $rsp -128 + +STACK CFI INIT 370ab 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 370b9 .cfa: $rsp 0 + +STACK CFI 370bd .cfa: $rsp 128 + +STACK CFI 370c5 .cfa: $rsp -128 + +STACK CFI INIT 36eb0 160 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36eb1 .cfa: $rsp 16 + +STACK CFI 36eb9 $rbx: .cfa -16 + ^ +STACK CFI INIT 37010 65 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3701d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 37029 .cfa: $rsp 32 + +STACK CFI 3702c $r12: .cfa -16 + ^ +STACK CFI INIT 37080 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 370d0 159 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 370d2 .cfa: $rsp 16 + +STACK CFI 370d8 $r15: .cfa -16 + ^ +STACK CFI 370da .cfa: $rsp 24 + +STACK CFI 370dc .cfa: $rsp 32 + +STACK CFI 370df $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 370e1 .cfa: $rsp 40 + +STACK CFI 370e2 .cfa: $rsp 48 + +STACK CFI 370e5 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 370e6 .cfa: $rsp 56 + +STACK CFI 370ea .cfa: $rsp 80 + +STACK CFI 370fa $rbx: .cfa -56 + ^ +STACK CFI INIT 37230 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3723b .cfa: $rsp 16 + +STACK CFI INIT 37250 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37270 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37280 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 372a0 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 372c0 23 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 372f0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37320 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3752a 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 37538 .cfa: $rsp 0 + +STACK CFI 3753c .cfa: $rsp 128 + +STACK CFI 37544 .cfa: $rsp -128 + +STACK CFI INIT 37549 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 37557 .cfa: $rsp 0 + +STACK CFI 3755b .cfa: $rsp 128 + +STACK CFI 37563 .cfa: $rsp -128 + +STACK CFI INIT 37568 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 37576 .cfa: $rsp 0 + +STACK CFI 3757a .cfa: $rsp 128 + +STACK CFI 37582 .cfa: $rsp -128 + +STACK CFI INIT 37587 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 37595 .cfa: $rsp 0 + +STACK CFI 37599 .cfa: $rsp 128 + +STACK CFI 375a1 .cfa: $rsp -128 + +STACK CFI INIT 375a6 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 375b4 .cfa: $rsp 0 + +STACK CFI 375b8 .cfa: $rsp 128 + +STACK CFI 375c0 .cfa: $rsp -128 + +STACK CFI INIT 375c5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 375d3 .cfa: $rsp 0 + +STACK CFI 375d7 .cfa: $rsp 128 + +STACK CFI 375df .cfa: $rsp -128 + +STACK CFI INIT 375e4 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 375f2 .cfa: $rsp 0 + +STACK CFI 375f6 .cfa: $rsp 128 + +STACK CFI 375fe .cfa: $rsp -128 + +STACK CFI INIT 37603 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 37611 .cfa: $rsp 0 + +STACK CFI 37615 .cfa: $rsp 128 + +STACK CFI 3761d .cfa: $rsp -128 + +STACK CFI INIT 37350 70 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37354 .cfa: $rsp 32 + +STACK CFI INIT 373c0 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 373c1 .cfa: $rsp 16 + +STACK CFI 373f8 $rbx: .cfa -16 + ^ +STACK CFI INIT 37440 7a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37441 .cfa: $rsp 16 + +STACK CFI 3747b $rbx: .cfa -16 + ^ +STACK CFI INIT 374c0 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 374c4 .cfa: $rsp 16 + +STACK CFI INIT 37630 e4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37720 9c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 377c0 f7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 377cd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 377d6 .cfa: $rsp 48 + +STACK CFI 377db $r12: .cfa -16 + ^ +STACK CFI INIT 378c0 135 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 378cd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 378db .cfa: $rsp 48 + +STACK CFI 378e7 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 37a00 e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37a04 .cfa: $rsp 16 + +STACK CFI INIT 37a10 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37a60 23 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37a64 .cfa: $rsp 32 + +STACK CFI INIT 37a90 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37a94 .cfa: $rsp 32 + +STACK CFI INIT 37ab0 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37ab4 .cfa: $rsp 32 + +STACK CFI INIT 37ae0 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37ae4 .cfa: $rsp 32 + +STACK CFI INIT 37b00 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37b04 .cfa: $rsp 32 + +STACK CFI INIT 37b30 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37b34 .cfa: $rsp 32 + +STACK CFI INIT 37b50 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37b60 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37b6b .cfa: $rsp 16 + +STACK CFI INIT 37b80 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37b90 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37ba0 77 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37ba1 .cfa: $rsp 16 + +STACK CFI 37ba4 $rbp: .cfa -16 + ^ +STACK CFI 37ba5 .cfa: $rsp 24 + +STACK CFI 37ba8 $rbx: .cfa -24 + ^ +STACK CFI 37bac .cfa: $rsp 48 + +STACK CFI INIT 37c20 16 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37c40 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37c4e .cfa: $rsp 32 + +STACK CFI 37c51 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 37c90 16 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37cb0 48 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37cbe .cfa: $rsp 32 + +STACK CFI 37cc1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 37d00 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37d40 40 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37d80 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37dc0 74 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37e40 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37e60 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37e70 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37e90 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37ea0 455 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 37ea2 .cfa: $rsp 16 + +STACK CFI 37ea4 .cfa: $rsp 24 + +STACK CFI 37ea6 .cfa: $rsp 32 + +STACK CFI 37ea8 .cfa: $rsp 40 + +STACK CFI 37ea9 .cfa: $rsp 48 + +STACK CFI 37eaa .cfa: $rsp 56 + +STACK CFI 37ead $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 37eb1 .cfa: $rsp 96 + +STACK CFI INIT 38300 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 38310 425 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 38312 .cfa: $rsp 16 + +STACK CFI 38314 .cfa: $rsp 24 + +STACK CFI 38316 .cfa: $rsp 32 + +STACK CFI 38318 .cfa: $rsp 40 + +STACK CFI 38319 .cfa: $rsp 48 + +STACK CFI 3831a .cfa: $rsp 56 + +STACK CFI 3831d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 38321 .cfa: $rsp 96 + +STACK CFI INIT 38740 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 38750 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 38770 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 38780 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 387a0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 387b0 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 387d0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 387e0 309 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 387e2 .cfa: $rsp 16 + +STACK CFI 387e8 $r15: .cfa -16 + ^ +STACK CFI 387ea .cfa: $rsp 24 + +STACK CFI 387ec .cfa: $rsp 32 + +STACK CFI 387ee .cfa: $rsp 40 + +STACK CFI 387f1 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 387f2 .cfa: $rsp 48 + +STACK CFI 387f4 $rbp: .cfa -48 + ^ +STACK CFI 387f5 .cfa: $rsp 56 + +STACK CFI 387f8 $rbx: .cfa -56 + ^ +STACK CFI 387fc .cfa: $rsp 96 + +STACK CFI INIT 38af0 1dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 38afc $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 38b0a .cfa: $rsp 64 + +STACK CFI 38b14 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 38cd0 213c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 38cd2 .cfa: $rsp 16 + +STACK CFI 38cd5 $r15: .cfa -16 + ^ +STACK CFI 38cd7 .cfa: $rsp 24 + +STACK CFI 38cd9 .cfa: $rsp 32 + +STACK CFI 38cdb .cfa: $rsp 40 + +STACK CFI 38cdc .cfa: $rsp 48 + +STACK CFI 38cdd .cfa: $rsp 56 + +STACK CFI 38ce4 .cfa: $rsp 336 + +STACK CFI 38cfa $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 3ae10 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3ae20 309 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3ae22 .cfa: $rsp 16 + +STACK CFI 3ae28 $r15: .cfa -16 + ^ +STACK CFI 3ae2a .cfa: $rsp 24 + +STACK CFI 3ae2c .cfa: $rsp 32 + +STACK CFI 3ae2e .cfa: $rsp 40 + +STACK CFI 3ae31 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 3ae32 .cfa: $rsp 48 + +STACK CFI 3ae34 $rbp: .cfa -48 + ^ +STACK CFI 3ae35 .cfa: $rsp 56 + +STACK CFI 3ae38 $rbx: .cfa -56 + ^ +STACK CFI 3ae3c .cfa: $rsp 96 + +STACK CFI INIT 3b130 1fd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3b13c $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 3b14a .cfa: $rsp 64 + +STACK CFI 3b157 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 3b330 21b1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3b332 .cfa: $rsp 16 + +STACK CFI 3b335 $r15: .cfa -16 + ^ +STACK CFI 3b337 .cfa: $rsp 24 + +STACK CFI 3b339 .cfa: $rsp 32 + +STACK CFI 3b33b .cfa: $rsp 40 + +STACK CFI 3b33c .cfa: $rsp 48 + +STACK CFI 3b33d .cfa: $rsp 56 + +STACK CFI 3b344 .cfa: $rsp 576 + +STACK CFI 3b35a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 3d4f0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3d500 312 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3d502 .cfa: $rsp 16 + +STACK CFI 3d508 $r15: .cfa -16 + ^ +STACK CFI 3d50a .cfa: $rsp 24 + +STACK CFI 3d50c .cfa: $rsp 32 + +STACK CFI 3d50e .cfa: $rsp 40 + +STACK CFI 3d511 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 3d512 .cfa: $rsp 48 + +STACK CFI 3d514 $rbp: .cfa -48 + ^ +STACK CFI 3d515 .cfa: $rsp 56 + +STACK CFI 3d518 $rbx: .cfa -56 + ^ +STACK CFI 3d51c .cfa: $rsp 96 + +STACK CFI INIT 3d820 1ef .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3d82d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 3d83b .cfa: $rsp 64 + +STACK CFI 3d847 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 3da10 20f2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3da12 .cfa: $rsp 16 + +STACK CFI 3da18 $r15: .cfa -16 + ^ +STACK CFI 3da1a .cfa: $rsp 24 + +STACK CFI 3da1c .cfa: $rsp 32 + +STACK CFI 3da1e .cfa: $rsp 40 + +STACK CFI 3da1f .cfa: $rsp 48 + +STACK CFI 3da20 .cfa: $rsp 56 + +STACK CFI 3da27 .cfa: $rsp 4416 + +STACK CFI 3da38 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 3fb10 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 400b1 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 400bf .cfa: $rsp 0 + +STACK CFI 400c3 .cfa: $rsp 128 + +STACK CFI 400cb .cfa: $rsp -128 + +STACK CFI INIT 400d0 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 400de .cfa: $rsp 0 + +STACK CFI 400e2 .cfa: $rsp 128 + +STACK CFI 400ea .cfa: $rsp -128 + +STACK CFI INIT 400ef 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 400fd .cfa: $rsp 0 + +STACK CFI 40101 .cfa: $rsp 128 + +STACK CFI 40109 .cfa: $rsp -128 + +STACK CFI INIT 4010e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 4011c .cfa: $rsp 0 + +STACK CFI 40120 .cfa: $rsp 128 + +STACK CFI 40128 .cfa: $rsp -128 + +STACK CFI INIT 4012d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 4013b .cfa: $rsp 0 + +STACK CFI 4013f .cfa: $rsp 128 + +STACK CFI 40147 .cfa: $rsp -128 + +STACK CFI INIT 4014c 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 4015a .cfa: $rsp 0 + +STACK CFI 4015e .cfa: $rsp 128 + +STACK CFI 40166 .cfa: $rsp -128 + +STACK CFI INIT 4016b 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 40179 .cfa: $rsp 0 + +STACK CFI 4017d .cfa: $rsp 128 + +STACK CFI 40185 .cfa: $rsp -128 + +STACK CFI INIT 4018a 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 40198 .cfa: $rsp 0 + +STACK CFI 4019c .cfa: $rsp 128 + +STACK CFI 401a4 .cfa: $rsp -128 + +STACK CFI INIT 3fb20 458 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3fb22 .cfa: $rsp 16 + +STACK CFI 3fb27 $r12: .cfa -16 + ^ +STACK CFI 3fb32 .cfa: $rsp 24 + +STACK CFI 3fb33 .cfa: $rsp 32 + +STACK CFI 3fb3a .cfa: $rsp 400 + +STACK CFI 3fb55 $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 3ff80 61 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3ff81 .cfa: $rsp 16 + +STACK CFI 3ff85 .cfa: $rsp 32 + +STACK CFI 3ff8a $rbx: .cfa -16 + ^ +STACK CFI INIT 3fff0 c1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3fff1 .cfa: $rsp 16 + +STACK CFI 3fff3 $rbx: .cfa -16 + ^ +STACK CFI INIT 401b0 4bf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 401b1 .cfa: $rsp 16 + +STACK CFI 401b4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 401c0 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 40670 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 111990 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 40680 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 406d0 4d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 40720 104 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 40722 .cfa: $rsp 16 + +STACK CFI 40724 .cfa: $rsp 24 + +STACK CFI 40726 .cfa: $rsp 32 + +STACK CFI 40728 .cfa: $rsp 40 + +STACK CFI 4072e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 4072f .cfa: $rsp 48 + +STACK CFI 40732 $rbp: .cfa -48 + ^ +STACK CFI 40733 .cfa: $rsp 56 + +STACK CFI 40737 .cfa: $rsp 96 + +STACK CFI 4074e $rbx: .cfa -56 + ^ +STACK CFI INIT 40830 ae .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 40834 .cfa: $rsp 16 + +STACK CFI 40837 $rbx: .cfa -16 + ^ +STACK CFI INIT 408e0 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 408f0 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 40900 a1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 409b0 7d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 409b1 .cfa: $rsp 16 + +STACK CFI 409cd .cfa: $rsp 8 + +STACK CFI 409e5 $r12: .cfa 72 + ^ $r13: .cfa 80 + ^ $r14: .cfa 88 + ^ $r15: .cfa 96 + ^ $rbp: .cfa 120 + ^ $rbx: .cfa 128 + ^ $rsp: .cfa 160 + ^ .cfa: $rdi 0 + .ra: .cfa 168 + ^ +STACK CFI INIT 40a2d 18 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 40a50 1f6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 40a51 .cfa: $rsp 16 + +STACK CFI 40a71 $rbx: .cfa -16 + ^ +STACK CFI INIT 40c50 105 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 40d60 99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 40d67 .cfa: $rsp 224 + +STACK CFI INIT 40e00 1196 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 40e02 .cfa: $rsp 16 + +STACK CFI 40e15 .cfa: $rsp 24 + +STACK CFI 40e1a $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 40e1c .cfa: $rsp 32 + +STACK CFI 40e1f $r13: .cfa -32 + ^ +STACK CFI 40e21 .cfa: $rsp 40 + +STACK CFI 40e22 .cfa: $rsp 48 + +STACK CFI 40e23 .cfa: $rsp 56 + +STACK CFI 40e26 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 40e2d .cfa: $rsp 576 + +STACK CFI INIT 41fa0 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 41fa1 .cfa: $rsp 16 + +STACK CFI 41fac $rbx: .cfa -16 + ^ +STACK CFI 41fba .cfa: $rsp 224 + +STACK CFI INIT 42030 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 42034 .cfa: $rsp 16 + +STACK CFI 42036 $rbx: .cfa -16 + ^ +STACK CFI INIT 420c0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 420c4 .cfa: $rsp 48 + +STACK CFI INIT 420f0 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 420f4 .cfa: $rsp 16 + +STACK CFI 420f6 $rbx: .cfa -16 + ^ +STACK CFI INIT 42180 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 42184 .cfa: $rsp 48 + +STACK CFI INIT 421b0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 421b4 .cfa: $rsp 16 + +STACK CFI 421b6 $rbx: .cfa -16 + ^ +STACK CFI INIT 42220 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 42230 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 42240 b7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4224c $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 42259 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 42267 .cfa: $rsp 64 + +STACK CFI 4226a $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 42300 57 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 42301 .cfa: $rsp 16 + +STACK CFI 4231a .cfa: $rsp 32 + +STACK CFI 42326 $rbx: .cfa -16 + ^ +STACK CFI INIT 42bb8 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 42bc6 .cfa: $rsp 0 + +STACK CFI 42bca .cfa: $rsp 128 + +STACK CFI 42bd2 .cfa: $rsp -128 + +STACK CFI INIT 42bd7 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 42be5 .cfa: $rsp 0 + +STACK CFI 42be9 .cfa: $rsp 128 + +STACK CFI 42bf1 .cfa: $rsp -128 + +STACK CFI INIT 42bf6 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 42c04 .cfa: $rsp 0 + +STACK CFI 42c08 .cfa: $rsp 128 + +STACK CFI 42c10 .cfa: $rsp -128 + +STACK CFI INIT 42c15 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 42c23 .cfa: $rsp 0 + +STACK CFI 42c27 .cfa: $rsp 128 + +STACK CFI 42c2f .cfa: $rsp -128 + +STACK CFI INIT 136260 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136268 .cfa: $rsp 16 + +STACK CFI 13626d $rbx: .cfa -16 + ^ +STACK CFI INIT 42360 ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 42361 .cfa: $rsp 16 + +STACK CFI 42363 $rbx: .cfa -16 + ^ +STACK CFI 42367 .cfa: $rsp 32 + +STACK CFI INIT 42410 77 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 42414 .cfa: $rsp 16 + +STACK CFI INIT 42490 20a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 42492 .cfa: $rsp 16 + +STACK CFI 4249b .cfa: $rsp 24 + +STACK CFI 4249c .cfa: $rsp 32 + +STACK CFI 4249d .cfa: $rsp 40 + +STACK CFI 424a1 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ .cfa: $rsp 64 + +STACK CFI INIT 426a0 518 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 426ad $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 426cb .cfa: $rsp 192 + +STACK CFI 426d2 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 42c40 261 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 42c42 .cfa: $rsp 16 + +STACK CFI 42c4a .cfa: $rsp 24 + +STACK CFI 42c4c .cfa: $rsp 32 + +STACK CFI 42c4e .cfa: $rsp 40 + +STACK CFI 42c4f .cfa: $rsp 48 + +STACK CFI 42c50 .cfa: $rsp 56 + +STACK CFI 42c5b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 42eb0 164 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 42eb4 .cfa: $rsp 16 + +STACK CFI 42eb9 $rbx: .cfa -16 + ^ +STACK CFI INIT 43020 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 43024 .cfa: $rsp 0 + +STACK CFI INIT 43040 23 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 43070 94 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 43071 .cfa: $rsp 16 + +STACK CFI 43074 $rbx: .cfa -16 + ^ +STACK CFI 4307b .cfa: $rsp 1104 + +STACK CFI INIT 43110 cb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 431e0 58 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 431e1 .cfa: $rsp 16 + +STACK CFI 431e4 $rbp: .cfa -16 + ^ +STACK CFI 431e5 .cfa: $rsp 24 + +STACK CFI 431e9 .cfa: $rsp 64 + +STACK CFI 431ee $rbx: .cfa -24 + ^ +STACK CFI INIT 48dd1 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 48ddb .cfa: $rsp 0 + +STACK CFI 48ddf .cfa: $rsp 128 + +STACK CFI 48de7 .cfa: $rsp -128 + +STACK CFI INIT 48dec 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 48df6 .cfa: $rsp 0 + +STACK CFI 48dfa .cfa: $rsp 128 + +STACK CFI 48e02 .cfa: $rsp -128 + +STACK CFI INIT 48e07 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 48e11 .cfa: $rsp 0 + +STACK CFI 48e15 .cfa: $rsp 128 + +STACK CFI 48e1d .cfa: $rsp -128 + +STACK CFI INIT 48e22 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 48e2c .cfa: $rsp 0 + +STACK CFI 48e30 .cfa: $rsp 128 + +STACK CFI 48e38 .cfa: $rsp -128 + +STACK CFI INIT 43240 ce .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 43248 $rbx: .cfa -40 + ^ +STACK CFI 4325b .cfa: $rsp 48 + +STACK CFI 4325f $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT 43310 12d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 43311 .cfa: $rsp 16 + +STACK CFI 43314 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 43319 $r15: .cfa -24 + ^ +STACK CFI 43322 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 43326 $rbx: .cfa -56 + ^ +STACK CFI INIT 43440 231 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 43441 .cfa: $rsp 16 + +STACK CFI 43444 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 4344f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 43453 $rbx: .cfa -56 + ^ +STACK CFI INIT 43680 5525 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 43681 .cfa: $rsp 16 + +STACK CFI 43684 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 4368f $r13: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI 4369a $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 436c7 $r12: .cfa -48 + ^ +STACK CFI INIT 48bb0 221 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 48bbd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 48bce .cfa: $rsp 8528 + +STACK CFI 48bdc $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 48e40 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 48e60 3f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 48ea0 169 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 48ea1 .cfa: $rsp 16 + +STACK CFI 48ea2 .cfa: $rsp 24 + +STACK CFI 48ea5 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 48ea9 .cfa: $rsp 32 + +STACK CFI INIT 49010 231 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 49011 .cfa: $rsp 16 + +STACK CFI 49014 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 4901f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 49023 $rbx: .cfa -56 + ^ +STACK CFI INIT 49250 2764 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 49251 .cfa: $rsp 16 + +STACK CFI 49254 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 4925f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 49263 $rbx: .cfa -56 + ^ +STACK CFI INIT 4bab5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 4bac3 .cfa: $rsp 0 + +STACK CFI 4bac7 .cfa: $rsp 128 + +STACK CFI 4bacf .cfa: $rsp -128 + +STACK CFI INIT 4bad4 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 4bae2 .cfa: $rsp 0 + +STACK CFI 4bae6 .cfa: $rsp 128 + +STACK CFI 4baee .cfa: $rsp -128 + +STACK CFI INIT 4b9c0 ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4b9c1 .cfa: $rsp 16 + +STACK CFI 4b9c4 $rbp: .cfa -16 + ^ +STACK CFI 4b9c5 .cfa: $rsp 24 + +STACK CFI 4b9c7 $rbx: .cfa -24 + ^ +STACK CFI 4b9cb .cfa: $rsp 48 + +STACK CFI INIT 4bab0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4bb00 10b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4bb02 .cfa: $rsp 16 + +STACK CFI 4bb04 .cfa: $rsp 24 + +STACK CFI 4bb06 .cfa: $rsp 32 + +STACK CFI 4bb09 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 4bb0b .cfa: $rsp 40 + +STACK CFI 4bb0c .cfa: $rsp 48 + +STACK CFI 4bb0f $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 4bb15 .cfa: $rsp 56 + +STACK CFI 4bb19 .cfa: $rsp 144 + +STACK CFI 4bb22 $rbx: .cfa -56 + ^ +STACK CFI INIT 4bc10 1a25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4bc12 .cfa: $rsp 16 + +STACK CFI 4bc14 .cfa: $rsp 24 + +STACK CFI 4bc16 .cfa: $rsp 32 + +STACK CFI 4bc19 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 4bc1b .cfa: $rsp 40 + +STACK CFI 4bc1c .cfa: $rsp 48 + +STACK CFI 4bc1f $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 4bc20 .cfa: $rsp 56 + +STACK CFI 4bc27 .cfa: $rsp 480 + +STACK CFI 4bc2c $rbx: .cfa -56 + ^ +STACK CFI INIT 4d96f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 4d97d .cfa: $rsp 0 + +STACK CFI 4d981 .cfa: $rsp 128 + +STACK CFI 4d989 .cfa: $rsp -128 + +STACK CFI INIT 4d98e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 4d99c .cfa: $rsp 0 + +STACK CFI 4d9a0 .cfa: $rsp 128 + +STACK CFI 4d9a8 .cfa: $rsp -128 + +STACK CFI INIT 4d640 e2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4d642 .cfa: $rsp 16 + +STACK CFI 4d64e .cfa: $rsp 24 + +STACK CFI 4d650 .cfa: $rsp 32 + +STACK CFI 4d651 .cfa: $rsp 40 + +STACK CFI 4d652 .cfa: $rsp 48 + +STACK CFI 4d663 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 4d730 ca .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4d732 .cfa: $rsp 16 + +STACK CFI 4d73b .cfa: $rsp 24 + +STACK CFI 4d73c .cfa: $rsp 32 + +STACK CFI 4d73d .cfa: $rsp 40 + +STACK CFI 4d740 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 1362a0 5b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1362a1 .cfa: $rsp 16 + +STACK CFI 1362a2 .cfa: $rsp 24 + +STACK CFI 1362a6 .cfa: $rsp 32 + +STACK CFI 1362b2 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 4d800 16f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4d802 .cfa: $rsp 16 + +STACK CFI 4d803 .cfa: $rsp 24 + +STACK CFI 4d804 .cfa: $rsp 32 + +STACK CFI 4d809 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 4da73 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 4da81 .cfa: $rsp 0 + +STACK CFI 4da85 .cfa: $rsp 128 + +STACK CFI 4da8d .cfa: $rsp -128 + +STACK CFI INIT 4da92 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 4daa0 .cfa: $rsp 0 + +STACK CFI 4daa4 .cfa: $rsp 128 + +STACK CFI 4daac .cfa: $rsp -128 + +STACK CFI INIT 4d9b0 c3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4d9b1 .cfa: $rsp 16 + +STACK CFI 4d9b9 $rbx: .cfa -16 + ^ +STACK CFI INIT 4dac0 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4dae0 86d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4dae2 .cfa: $rsp 16 + +STACK CFI 4dae4 .cfa: $rsp 24 + +STACK CFI 4dae6 .cfa: $rsp 32 + +STACK CFI 4dae8 .cfa: $rsp 40 + +STACK CFI 4daeb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 4daec .cfa: $rsp 48 + +STACK CFI 4daed .cfa: $rsp 56 + +STACK CFI 4daf0 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 4daf7 .cfa: $rsp 192 + +STACK CFI INIT 4e350 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4e357 .cfa: $rsp 224 + +STACK CFI INIT 4e3e0 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4e3e7 .cfa: $rsp 224 + +STACK CFI INIT 4e490 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4e497 .cfa: $rsp 224 + +STACK CFI INIT 4e520 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4e527 .cfa: $rsp 224 + +STACK CFI INIT 4e5b0 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4e5b7 .cfa: $rsp 224 + +STACK CFI INIT 4e640 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4e647 .cfa: $rsp 224 + +STACK CFI INIT 56b97 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 56ba1 .cfa: $rsp 0 + +STACK CFI 56ba5 .cfa: $rsp 128 + +STACK CFI 56bad .cfa: $rsp -128 + +STACK CFI INIT 56bb2 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 56bbc .cfa: $rsp 0 + +STACK CFI 56bc0 .cfa: $rsp 128 + +STACK CFI 56bc8 .cfa: $rsp -128 + +STACK CFI INIT 4e6d0 84b7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4e6d1 .cfa: $rsp 16 + +STACK CFI 4e6d4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 4e6df $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 4e6e3 $rbx: .cfa -56 + ^ +STACK CFI INIT 56b90 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 56bd0 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 56bd7 .cfa: $rsp 224 + +STACK CFI INIT 56c60 a4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 56c67 .cfa: $rsp 224 + +STACK CFI INIT 56d10 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 56d17 .cfa: $rsp 224 + +STACK CFI INIT 56da0 8c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 56dad $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 56db9 .cfa: $rsp 1056 + +STACK CFI 56dc3 $r12: .cfa -16 + ^ +STACK CFI INIT 56e30 e6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 56e3d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 56e46 .cfa: $rsp 48 + +STACK CFI 56e65 $r12: .cfa -16 + ^ +STACK CFI INIT 56f20 101 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 56f2d $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI 56f36 .cfa: $rsp 48 + +STACK CFI 56f3e $rbp: .cfa -24 + ^ +STACK CFI INIT 57030 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57048 .cfa: $rsp 4128 + +STACK CFI 57055 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 570c0 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 570c1 .cfa: $rsp 16 + +STACK CFI 570c9 $rbp: .cfa -16 + ^ +STACK CFI 570ca .cfa: $rsp 24 + +STACK CFI 570ce .cfa: $rsp 64 + +STACK CFI 570d4 $rbx: .cfa -24 + ^ +STACK CFI INIT 57150 43 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57154 .cfa: $rsp 16 + +STACK CFI 57157 $rbx: .cfa -16 + ^ +STACK CFI INIT 571a0 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 571a1 .cfa: $rsp 16 + +STACK CFI 571b9 .cfa: $rsp 4112 + +STACK CFI 571bc $rbx: .cfa -16 + ^ +STACK CFI INIT 57200 36f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57202 .cfa: $rsp 16 + +STACK CFI 57204 .cfa: $rsp 24 + +STACK CFI 57206 .cfa: $rsp 32 + +STACK CFI 57208 .cfa: $rsp 40 + +STACK CFI 5720b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 5720c .cfa: $rsp 48 + +STACK CFI 5720e $rbp: .cfa -48 + ^ +STACK CFI 5720f .cfa: $rsp 56 + +STACK CFI 57216 .cfa: $rsp 288 + +STACK CFI 5722c $rbx: .cfa -56 + ^ +STACK CFI INIT 57570 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57577 .cfa: $rsp 160 + +STACK CFI INIT 575b0 190 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 575b2 .cfa: $rsp 16 + +STACK CFI 575b4 .cfa: $rsp 24 + +STACK CFI 575b6 .cfa: $rsp 32 + +STACK CFI 575b9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 575bb .cfa: $rsp 40 + +STACK CFI 575be $r12: .cfa -40 + ^ +STACK CFI 575bf .cfa: $rsp 48 + +STACK CFI 575c2 $rbp: .cfa -48 + ^ +STACK CFI 575c3 .cfa: $rsp 56 + +STACK CFI 575c6 $rbx: .cfa -56 + ^ +STACK CFI 575ca .cfa: $rsp 80 + +STACK CFI INIT 57740 d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 57750 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57754 .cfa: $rsp 32 + +STACK CFI INIT 57790 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57794 .cfa: $rsp 32 + +STACK CFI INIT 577c0 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 577c1 .cfa: $rsp 16 + +STACK CFI 577c4 $rbx: .cfa -16 + ^ +STACK CFI INIT 57800 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 57830 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 578a6 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 578b0 .cfa: $rsp 0 + +STACK CFI 578b4 .cfa: $rsp 128 + +STACK CFI 578bc .cfa: $rsp -128 + +STACK CFI INIT 57860 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 578c0 68 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 57962 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 5796c .cfa: $rsp 0 + +STACK CFI 57970 .cfa: $rsp 128 + +STACK CFI 57978 .cfa: $rsp -128 + +STACK CFI INIT 57930 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 57b09 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 57b13 .cfa: $rsp 0 + +STACK CFI 57b17 .cfa: $rsp 128 + +STACK CFI 57b1f .cfa: $rsp -128 + +STACK CFI INIT 57b24 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 57b2e .cfa: $rsp 0 + +STACK CFI 57b32 .cfa: $rsp 128 + +STACK CFI 57b3a .cfa: $rsp -128 + +STACK CFI INIT 57b3f 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 57b49 .cfa: $rsp 0 + +STACK CFI 57b4d .cfa: $rsp 128 + +STACK CFI 57b55 .cfa: $rsp -128 + +STACK CFI INIT 57980 189 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57981 .cfa: $rsp 16 + +STACK CFI 5798b .cfa: $rsp 224 + +STACK CFI 579ed $rbx: .cfa -16 + ^ +STACK CFI INIT 57c67 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 57c71 .cfa: $rsp 0 + +STACK CFI 57c75 .cfa: $rsp 128 + +STACK CFI 57c7d .cfa: $rsp -128 + +STACK CFI INIT 57c82 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 57c8c .cfa: $rsp 0 + +STACK CFI 57c90 .cfa: $rsp 128 + +STACK CFI 57c98 .cfa: $rsp -128 + +STACK CFI INIT 57c9d 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 57ca7 .cfa: $rsp 0 + +STACK CFI 57cab .cfa: $rsp 128 + +STACK CFI 57cb3 .cfa: $rsp -128 + +STACK CFI INIT 57b60 107 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57b61 .cfa: $rsp 16 + +STACK CFI 57b68 .cfa: $rsp 24 + +STACK CFI 57b6c .cfa: $rsp 32 + +STACK CFI 57b76 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 57e37 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 57e41 .cfa: $rsp 0 + +STACK CFI 57e45 .cfa: $rsp 128 + +STACK CFI 57e4d .cfa: $rsp -128 + +STACK CFI INIT 57e52 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 57e5c .cfa: $rsp 0 + +STACK CFI 57e60 .cfa: $rsp 128 + +STACK CFI 57e68 .cfa: $rsp -128 + +STACK CFI INIT 57e6d 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 57e77 .cfa: $rsp 0 + +STACK CFI 57e7b .cfa: $rsp 128 + +STACK CFI 57e83 .cfa: $rsp -128 + +STACK CFI INIT 57cc0 177 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57cc1 .cfa: $rsp 16 + +STACK CFI 57cc7 $rbx: .cfa -16 + ^ +STACK CFI 57cce .cfa: $rsp 224 + +STACK CFI INIT 57f80 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 57f8a .cfa: $rsp 0 + +STACK CFI 57f8e .cfa: $rsp 128 + +STACK CFI 57f96 .cfa: $rsp -128 + +STACK CFI INIT 57f9b 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 57fa5 .cfa: $rsp 0 + +STACK CFI 57fa9 .cfa: $rsp 128 + +STACK CFI 57fb1 .cfa: $rsp -128 + +STACK CFI INIT 57fb3 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 57fbd .cfa: $rsp 0 + +STACK CFI 57fc1 .cfa: $rsp 128 + +STACK CFI 57fc9 .cfa: $rsp -128 + +STACK CFI INIT 57e90 f0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57e91 .cfa: $rsp 16 + +STACK CFI 57e98 $rbx: .cfa -16 + ^ +STACK CFI INIT 57fd0 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57fd7 .cfa: $rsp 224 + +STACK CFI INIT 58060 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5807e .cfa: $rsp 288 + +STACK CFI 58081 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 58110 5cf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5812e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 5813f .cfa: $rsp 576 + +STACK CFI 5814a $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 5dede 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 5dee8 .cfa: $rsp 0 + +STACK CFI 5deec .cfa: $rsp 128 + +STACK CFI 5def4 .cfa: $rsp -128 + +STACK CFI INIT 5def9 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 5df03 .cfa: $rsp 0 + +STACK CFI 5df07 .cfa: $rsp 128 + +STACK CFI 5df0f .cfa: $rsp -128 + +STACK CFI INIT 5df14 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 5df1e .cfa: $rsp 0 + +STACK CFI 5df22 .cfa: $rsp 128 + +STACK CFI 5df2a .cfa: $rsp -128 + +STACK CFI INIT 5df2f 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 5df39 .cfa: $rsp 0 + +STACK CFI 5df3d .cfa: $rsp 128 + +STACK CFI 5df45 .cfa: $rsp -128 + +STACK CFI INIT 586e0 fa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 586e8 $rbx: .cfa -40 + ^ +STACK CFI 586fb .cfa: $rsp 48 + +STACK CFI 58704 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT 587e0 dd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 587e1 .cfa: $rsp 16 + +STACK CFI 587e4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 587eb $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 587f2 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ +STACK CFI 587f6 $rbx: .cfa -56 + ^ +STACK CFI INIT 588c0 139 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 588c1 .cfa: $rsp 16 + +STACK CFI 588c4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 588cb $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 588d2 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ +STACK CFI 588e9 $rbx: .cfa -56 + ^ +STACK CFI INIT 58a00 52ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 58a01 .cfa: $rsp 16 + +STACK CFI 58a04 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 58a0f $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 58a1a $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 58a2c $r15: .cfa -24 + ^ +STACK CFI INIT 5dcb0 22e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5dcbd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 5dcca $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI 5dcd1 .cfa: $rsp 33424 + +STACK CFI INIT 66ab7 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 66ac1 .cfa: $rsp 0 + +STACK CFI 66ac5 .cfa: $rsp 128 + +STACK CFI 66acd .cfa: $rsp -128 + +STACK CFI INIT 66ad2 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 66adc .cfa: $rsp 0 + +STACK CFI 66ae0 .cfa: $rsp 128 + +STACK CFI 66ae8 .cfa: $rsp -128 + +STACK CFI INIT 5df50 8b5c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5df51 .cfa: $rsp 16 + +STACK CFI 5df54 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 5df59 $r15: .cfa -24 + ^ +STACK CFI 5df65 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 5df69 $rbx: .cfa -56 + ^ +STACK CFI INIT 66ab0 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 66af0 71d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 66af2 .cfa: $rsp 16 + +STACK CFI 66af5 $r12: .cfa -16 + ^ +STACK CFI 66af6 .cfa: $rsp 24 + +STACK CFI 66af7 .cfa: $rsp 32 + +STACK CFI 66afa $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 66b02 .cfa: $rsp 48 + +STACK CFI INIT 67210 171 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 67211 .cfa: $rsp 16 + +STACK CFI 67217 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 6721e $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 67224 $r12: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 67390 6d7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 67392 .cfa: $rsp 16 + +STACK CFI 67399 $r12: .cfa -16 + ^ +STACK CFI 6739a .cfa: $rsp 24 + +STACK CFI 6739b .cfa: $rsp 32 + +STACK CFI 6739e $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 673a2 .cfa: $rsp 48 + +STACK CFI INIT 67a70 102 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 67a71 .cfa: $rsp 16 + +STACK CFI 67a72 .cfa: $rsp 24 + +STACK CFI 67a75 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 67a7c .cfa: $rsp 176 + +STACK CFI INIT 67d86 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 67d90 .cfa: $rsp 0 + +STACK CFI 67d94 .cfa: $rsp 128 + +STACK CFI 67d9c .cfa: $rsp -128 + +STACK CFI INIT 67da1 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 67daf .cfa: $rsp 0 + +STACK CFI 67db3 .cfa: $rsp 128 + +STACK CFI 67dbb .cfa: $rsp -128 + +STACK CFI INIT 67dc0 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 67dce .cfa: $rsp 0 + +STACK CFI 67dd2 .cfa: $rsp 128 + +STACK CFI 67dda .cfa: $rsp -128 + +STACK CFI INIT 67ddf 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 67de9 .cfa: $rsp 0 + +STACK CFI 67ded .cfa: $rsp 128 + +STACK CFI 67df5 .cfa: $rsp -128 + +STACK CFI INIT 67dfa 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 67e04 .cfa: $rsp 0 + +STACK CFI 67e08 .cfa: $rsp 128 + +STACK CFI 67e10 .cfa: $rsp -128 + +STACK CFI INIT 67b80 206 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 67b82 .cfa: $rsp 16 + +STACK CFI 67b83 .cfa: $rsp 24 + +STACK CFI 67b84 .cfa: $rsp 32 + +STACK CFI 67b89 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 67e20 242 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 67e2c $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 67e3a .cfa: $rsp 48 + +STACK CFI 67e45 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 68167 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 68171 .cfa: $rsp 0 + +STACK CFI 68175 .cfa: $rsp 128 + +STACK CFI 6817d .cfa: $rsp -128 + +STACK CFI INIT 68182 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6818c .cfa: $rsp 0 + +STACK CFI 68190 .cfa: $rsp 128 + +STACK CFI 68198 .cfa: $rsp -128 + +STACK CFI INIT 6819d 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 681a7 .cfa: $rsp 0 + +STACK CFI 681ab .cfa: $rsp 128 + +STACK CFI 681b3 .cfa: $rsp -128 + +STACK CFI INIT 68070 f7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 68074 .cfa: $rsp 16 + +STACK CFI 68077 $rbx: .cfa -16 + ^ +STACK CFI INIT 68365 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6836f .cfa: $rsp 0 + +STACK CFI 68373 .cfa: $rsp 128 + +STACK CFI 6837b .cfa: $rsp -128 + +STACK CFI INIT 68380 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6838a .cfa: $rsp 0 + +STACK CFI 6838e .cfa: $rsp 128 + +STACK CFI 68396 .cfa: $rsp -128 + +STACK CFI INIT 6839b 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 683a5 .cfa: $rsp 0 + +STACK CFI 683a9 .cfa: $rsp 128 + +STACK CFI 683b1 .cfa: $rsp -128 + +STACK CFI INIT 681c0 1a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 681c1 .cfa: $rsp 16 + +STACK CFI 681c4 $rbp: .cfa -16 + ^ +STACK CFI 681c5 .cfa: $rsp 24 + +STACK CFI 681c8 $rbx: .cfa -24 + ^ +STACK CFI 681cc .cfa: $rsp 32 + +STACK CFI INIT 6854a 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 68554 .cfa: $rsp 0 + +STACK CFI 68558 .cfa: $rsp 128 + +STACK CFI 68560 .cfa: $rsp -128 + +STACK CFI INIT 68565 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6856f .cfa: $rsp 0 + +STACK CFI 68573 .cfa: $rsp 128 + +STACK CFI 6857b .cfa: $rsp -128 + +STACK CFI INIT 68580 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6858a .cfa: $rsp 0 + +STACK CFI 6858e .cfa: $rsp 128 + +STACK CFI 68596 .cfa: $rsp -128 + +STACK CFI INIT 683c0 18a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 683d6 .cfa: $rsp 32 + +STACK CFI 683db $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 685a0 3f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 685e0 db .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 685ed $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 685fb .cfa: $rsp 48 + +STACK CFI 685fe $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 686c0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 686d0 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 686f0 40 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 686fe .cfa: $rsp 32 + +STACK CFI 68708 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 68730 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 68734 .cfa: $rsp 32 + +STACK CFI INIT 68780 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 687a0 c0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 687ac $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 687c6 .cfa: $rsp 80 + +STACK CFI 687ce $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 68860 fa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6886d $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI 68876 .cfa: $rsp 64 + +STACK CFI 68881 $rbp: .cfa -24 + ^ +STACK CFI INIT 68960 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 68ac3 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 68acd .cfa: $rsp 0 + +STACK CFI 68ad1 .cfa: $rsp 128 + +STACK CFI 68ad9 .cfa: $rsp -128 + +STACK CFI INIT 68ade 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 68ae8 .cfa: $rsp 0 + +STACK CFI 68aec .cfa: $rsp 128 + +STACK CFI 68af4 .cfa: $rsp -128 + +STACK CFI INIT 68af9 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 68b03 .cfa: $rsp 0 + +STACK CFI 68b07 .cfa: $rsp 128 + +STACK CFI 68b0f .cfa: $rsp -128 + +STACK CFI INIT 68970 153 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6897d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 68986 .cfa: $rsp 32 + +STACK CFI 68989 $r12: .cfa -16 + ^ +STACK CFI INIT 68c6d 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 68c77 .cfa: $rsp 0 + +STACK CFI 68c7b .cfa: $rsp 128 + +STACK CFI 68c83 .cfa: $rsp -128 + +STACK CFI INIT 68c88 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 68c92 .cfa: $rsp 0 + +STACK CFI 68c96 .cfa: $rsp 128 + +STACK CFI 68c9e .cfa: $rsp -128 + +STACK CFI INIT 68ca3 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 68cad .cfa: $rsp 0 + +STACK CFI 68cb1 .cfa: $rsp 128 + +STACK CFI 68cb9 .cfa: $rsp -128 + +STACK CFI INIT 68b20 14d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 68b28 $r12: .cfa -24 + ^ +STACK CFI 68b3f .cfa: $rsp 48 + +STACK CFI 68b45 $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 68e15 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 68e1f .cfa: $rsp 0 + +STACK CFI 68e23 .cfa: $rsp 128 + +STACK CFI 68e2b .cfa: $rsp -128 + +STACK CFI INIT 68e30 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 68e3a .cfa: $rsp 0 + +STACK CFI 68e3e .cfa: $rsp 128 + +STACK CFI 68e46 .cfa: $rsp -128 + +STACK CFI INIT 68e4b 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 68e55 .cfa: $rsp 0 + +STACK CFI 68e59 .cfa: $rsp 128 + +STACK CFI 68e61 .cfa: $rsp -128 + +STACK CFI INIT 68cc0 155 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 68cc1 .cfa: $rsp 16 + +STACK CFI 68cc4 $rbp: .cfa -16 + ^ +STACK CFI 68cc5 .cfa: $rsp 24 + +STACK CFI 68cc8 $rbx: .cfa -24 + ^ +STACK CFI 68ccc .cfa: $rsp 32 + +STACK CFI INIT 68fa8 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 68fb2 .cfa: $rsp 0 + +STACK CFI 68fb6 .cfa: $rsp 128 + +STACK CFI 68fbe .cfa: $rsp -128 + +STACK CFI INIT 68fc3 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 68fcd .cfa: $rsp 0 + +STACK CFI 68fd1 .cfa: $rsp 128 + +STACK CFI 68fd9 .cfa: $rsp -128 + +STACK CFI INIT 68fde 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 68fe8 .cfa: $rsp 0 + +STACK CFI 68fec .cfa: $rsp 128 + +STACK CFI 68ff4 .cfa: $rsp -128 + +STACK CFI INIT 68e70 138 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 68e71 .cfa: $rsp 16 + +STACK CFI 68e78 $rbx: .cfa -16 + ^ +STACK CFI INIT 6918a 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 69194 .cfa: $rsp 0 + +STACK CFI 69198 .cfa: $rsp 128 + +STACK CFI 691a0 .cfa: $rsp -128 + +STACK CFI INIT 691a5 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 691af .cfa: $rsp 0 + +STACK CFI 691b3 .cfa: $rsp 128 + +STACK CFI 691bb .cfa: $rsp -128 + +STACK CFI INIT 691bd 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 691c7 .cfa: $rsp 0 + +STACK CFI 691cb .cfa: $rsp 128 + +STACK CFI 691d3 .cfa: $rsp -128 + +STACK CFI INIT 69000 18a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 69008 $r13: .cfa -16 + ^ +STACK CFI 6901f .cfa: $rsp 48 + +STACK CFI 69025 $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 6947c 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 69486 .cfa: $rsp 0 + +STACK CFI 6948a .cfa: $rsp 128 + +STACK CFI 69492 .cfa: $rsp -128 + +STACK CFI INIT 69497 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 694a1 .cfa: $rsp 0 + +STACK CFI 694a5 .cfa: $rsp 128 + +STACK CFI 694ad .cfa: $rsp -128 + +STACK CFI INIT 694b2 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 694bc .cfa: $rsp 0 + +STACK CFI 694c0 .cfa: $rsp 128 + +STACK CFI 694c8 .cfa: $rsp -128 + +STACK CFI INIT 691e0 29c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 691e2 .cfa: $rsp 16 + +STACK CFI 691e4 .cfa: $rsp 24 + +STACK CFI 691e6 .cfa: $rsp 32 + +STACK CFI 691e8 .cfa: $rsp 40 + +STACK CFI 691eb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 691ec .cfa: $rsp 48 + +STACK CFI 691ed .cfa: $rsp 56 + +STACK CFI 691f0 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 691f4 .cfa: $rsp 96 + +STACK CFI INIT 694d0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 694e0 18f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 694e2 .cfa: $rsp 16 + +STACK CFI 694e4 .cfa: $rsp 24 + +STACK CFI 694e6 .cfa: $rsp 32 + +STACK CFI 694e8 .cfa: $rsp 40 + +STACK CFI 694eb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 694ec .cfa: $rsp 48 + +STACK CFI 694ef $rbp: .cfa -48 + ^ +STACK CFI 694f0 .cfa: $rsp 56 + +STACK CFI 694f3 $rbx: .cfa -56 + ^ +STACK CFI 694f7 .cfa: $rsp 96 + +STACK CFI INIT 69810 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6981a .cfa: $rsp 0 + +STACK CFI 6981e .cfa: $rsp 128 + +STACK CFI 69826 .cfa: $rsp -128 + +STACK CFI INIT 6982b 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 69835 .cfa: $rsp 0 + +STACK CFI 69839 .cfa: $rsp 128 + +STACK CFI 69841 .cfa: $rsp -128 + +STACK CFI INIT 69846 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 69850 .cfa: $rsp 0 + +STACK CFI 69854 .cfa: $rsp 128 + +STACK CFI 6985c .cfa: $rsp -128 + +STACK CFI INIT 69670 1a0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6967d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 69686 .cfa: $rsp 32 + +STACK CFI 69696 $r12: .cfa -16 + ^ +STACK CFI INIT 69860 bd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 69862 .cfa: $rsp 16 + +STACK CFI 69865 $r15: .cfa -16 + ^ +STACK CFI 69867 .cfa: $rsp 24 + +STACK CFI 6986e $r14: .cfa -24 + ^ +STACK CFI 69870 .cfa: $rsp 32 + +STACK CFI 69873 $r13: .cfa -32 + ^ +STACK CFI 69875 .cfa: $rsp 40 + +STACK CFI 69876 .cfa: $rsp 48 + +STACK CFI 69877 .cfa: $rsp 56 + +STACK CFI 6987b .cfa: $rsp 80 + +STACK CFI 69880 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 69fb8 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 69fc6 .cfa: $rsp 0 + +STACK CFI 69fca .cfa: $rsp 128 + +STACK CFI 69fd2 .cfa: $rsp -128 + +STACK CFI INIT 69fd7 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 69fe5 .cfa: $rsp 0 + +STACK CFI 69fe9 .cfa: $rsp 128 + +STACK CFI 69ff1 .cfa: $rsp -128 + +STACK CFI INIT 69ff6 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a004 .cfa: $rsp 0 + +STACK CFI 6a008 .cfa: $rsp 128 + +STACK CFI 6a010 .cfa: $rsp -128 + +STACK CFI INIT 6a015 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a023 .cfa: $rsp 0 + +STACK CFI 6a027 .cfa: $rsp 128 + +STACK CFI 6a02f .cfa: $rsp -128 + +STACK CFI INIT 6a034 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a042 .cfa: $rsp 0 + +STACK CFI 6a046 .cfa: $rsp 128 + +STACK CFI 6a04e .cfa: $rsp -128 + +STACK CFI INIT 69920 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 69970 1d1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 69972 .cfa: $rsp 16 + +STACK CFI 69973 .cfa: $rsp 24 + +STACK CFI 69974 .cfa: $rsp 32 + +STACK CFI 69977 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 6997b .cfa: $rsp 80 + +STACK CFI INIT 69b50 3c3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 69b69 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 69b77 .cfa: $rsp 128 + +STACK CFI 69b87 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI INIT 69f20 98 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 69f2d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 69f3b .cfa: $rsp 32 + +STACK CFI 69f3e $r12: .cfa -16 + ^ +STACK CFI INIT 6a212 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a21c .cfa: $rsp 0 + +STACK CFI 6a220 .cfa: $rsp 128 + +STACK CFI 6a228 .cfa: $rsp -128 + +STACK CFI INIT 6a22d 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a237 .cfa: $rsp 0 + +STACK CFI 6a23b .cfa: $rsp 128 + +STACK CFI 6a243 .cfa: $rsp -128 + +STACK CFI INIT 6a248 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a252 .cfa: $rsp 0 + +STACK CFI 6a256 .cfa: $rsp 128 + +STACK CFI 6a25e .cfa: $rsp -128 + +STACK CFI INIT 6a060 1b2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6a06d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 6a076 $r12: .cfa -16 + ^ .cfa: $rsp 32 + +STACK CFI INIT 6a434 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a43e .cfa: $rsp 0 + +STACK CFI 6a442 .cfa: $rsp 128 + +STACK CFI 6a44a .cfa: $rsp -128 + +STACK CFI INIT 6a44f 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a459 .cfa: $rsp 0 + +STACK CFI 6a45d .cfa: $rsp 128 + +STACK CFI 6a465 .cfa: $rsp -128 + +STACK CFI INIT 6a467 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a471 .cfa: $rsp 0 + +STACK CFI 6a475 .cfa: $rsp 128 + +STACK CFI 6a47d .cfa: $rsp -128 + +STACK CFI INIT 6a260 e0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6a261 .cfa: $rsp 16 + +STACK CFI 6a264 $rbx: .cfa -16 + ^ +STACK CFI 6a268 .cfa: $rsp 48 + +STACK CFI INIT 6a340 f4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6a341 .cfa: $rsp 16 + +STACK CFI 6a348 .cfa: $rsp 24 + +STACK CFI 6a34b $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 6a34f .cfa: $rsp 32 + +STACK CFI INIT 6a5e4 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a5ee .cfa: $rsp 0 + +STACK CFI 6a5f2 .cfa: $rsp 128 + +STACK CFI 6a5fa .cfa: $rsp -128 + +STACK CFI INIT 6a5ff 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a609 .cfa: $rsp 0 + +STACK CFI 6a60d .cfa: $rsp 128 + +STACK CFI 6a615 .cfa: $rsp -128 + +STACK CFI INIT 6a617 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a621 .cfa: $rsp 0 + +STACK CFI 6a625 .cfa: $rsp 128 + +STACK CFI 6a62d .cfa: $rsp -128 + +STACK CFI INIT 6a480 76 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6a48d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 6a496 .cfa: $rsp 32 + +STACK CFI 6a4a2 $r12: .cfa -16 + ^ +STACK CFI INIT 6a500 e4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6a501 .cfa: $rsp 16 + +STACK CFI 6a508 $rbx: .cfa -16 + ^ +STACK CFI INIT 6a772 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a77d .cfa: $rsp 0 + +STACK CFI 6a781 .cfa: $rsp 128 + +STACK CFI 6a789 .cfa: $rsp -128 + +STACK CFI INIT 6a78e 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a798 .cfa: $rsp 0 + +STACK CFI 6a79c .cfa: $rsp 128 + +STACK CFI 6a7a4 .cfa: $rsp -128 + +STACK CFI INIT 6a7a9 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a7b3 .cfa: $rsp 0 + +STACK CFI 6a7b7 .cfa: $rsp 128 + +STACK CFI 6a7bf .cfa: $rsp -128 + +STACK CFI INIT 6a630 142 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6a63d $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI 6a646 .cfa: $rsp 32 + +STACK CFI 6a650 $rbp: .cfa -24 + ^ +STACK CFI INIT 6a977 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a981 .cfa: $rsp 0 + +STACK CFI 6a985 .cfa: $rsp 128 + +STACK CFI 6a98d .cfa: $rsp -128 + +STACK CFI INIT 6a992 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a99c .cfa: $rsp 0 + +STACK CFI 6a9a0 .cfa: $rsp 128 + +STACK CFI 6a9a8 .cfa: $rsp -128 + +STACK CFI INIT 6a9ad 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6a9b7 .cfa: $rsp 0 + +STACK CFI 6a9bb .cfa: $rsp 128 + +STACK CFI 6a9c3 .cfa: $rsp -128 + +STACK CFI INIT 6a7d0 1a7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6a7d1 .cfa: $rsp 16 + +STACK CFI 6a7d8 .cfa: $rsp 24 + +STACK CFI 6a7db $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 6a7df .cfa: $rsp 32 + +STACK CFI INIT 6aa73 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6aa7d .cfa: $rsp 0 + +STACK CFI 6aa81 .cfa: $rsp 128 + +STACK CFI 6aa89 .cfa: $rsp -128 + +STACK CFI INIT 6aa8b 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6aa95 .cfa: $rsp 0 + +STACK CFI 6aa99 .cfa: $rsp 128 + +STACK CFI 6aaa1 .cfa: $rsp -128 + +STACK CFI INIT 6a9d0 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6a9d4 .cfa: $rsp 16 + +STACK CFI 6a9d9 $rbx: .cfa -16 + ^ +STACK CFI INIT 6aab0 c0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6aabd $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ +STACK CFI 6aace .cfa: $rsp 288 + +STACK CFI 6aad9 $r13: .cfa -16 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 6ab70 9d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6ab8e .cfa: $rsp 288 + +STACK CFI 6ab91 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 6ad1e 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6ad28 .cfa: $rsp 0 + +STACK CFI 6ad2c .cfa: $rsp 128 + +STACK CFI 6ad34 .cfa: $rsp -128 + +STACK CFI INIT 6ad39 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6ad43 .cfa: $rsp 0 + +STACK CFI 6ad47 .cfa: $rsp 128 + +STACK CFI 6ad4f .cfa: $rsp -128 + +STACK CFI INIT 6ad54 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6ad5e .cfa: $rsp 0 + +STACK CFI 6ad62 .cfa: $rsp 128 + +STACK CFI 6ad6a .cfa: $rsp -128 + +STACK CFI INIT 6ac10 10e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6ac18 .cfa: $rsp 16 + +STACK CFI 6ac22 $rbx: .cfa -16 + ^ +STACK CFI INIT 6ad70 2d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6ada0 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6adc0 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6add0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6ade0 d4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6aded $r13: .cfa -24 + ^ $rbx: .cfa -48 + ^ +STACK CFI 6adfa $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI 6ae03 .cfa: $rsp 80 + +STACK CFI 6ae0b $r12: .cfa -32 + ^ +STACK CFI INIT 6aec0 be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6aecd $r13: .cfa -16 + ^ $rbx: .cfa -40 + ^ +STACK CFI 6aedb .cfa: $rsp 80 + +STACK CFI 6aee2 $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT 6af80 e6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6af8d $r13: .cfa -24 + ^ $rbx: .cfa -48 + ^ +STACK CFI 6af9a $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI 6afa3 .cfa: $rsp 80 + +STACK CFI 6afb1 $r12: .cfa -32 + ^ +STACK CFI INIT 6b070 b8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6b071 .cfa: $rsp 16 + +STACK CFI 6b078 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 6b083 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 6b0a2 $r12: .cfa -48 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 6b130 272 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6b14a .cfa: $rsp 80 + +STACK CFI 6b150 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 6b43d 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6b447 .cfa: $rsp 0 + +STACK CFI 6b44b .cfa: $rsp 128 + +STACK CFI 6b453 .cfa: $rsp -128 + +STACK CFI INIT 6b455 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6b45f .cfa: $rsp 0 + +STACK CFI 6b463 .cfa: $rsp 128 + +STACK CFI 6b46b .cfa: $rsp -128 + +STACK CFI INIT 6b3b0 8d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6b509 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6b513 .cfa: $rsp 0 + +STACK CFI 6b517 .cfa: $rsp 128 + +STACK CFI 6b51f .cfa: $rsp -128 + +STACK CFI INIT 6b521 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6b52b .cfa: $rsp 0 + +STACK CFI 6b52f .cfa: $rsp 128 + +STACK CFI 6b537 .cfa: $rsp -128 + +STACK CFI INIT 6b470 99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6b5d9 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6b5e3 .cfa: $rsp 0 + +STACK CFI 6b5e7 .cfa: $rsp 128 + +STACK CFI 6b5ef .cfa: $rsp -128 + +STACK CFI INIT 6b5f1 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6b5fb .cfa: $rsp 0 + +STACK CFI 6b5ff .cfa: $rsp 128 + +STACK CFI 6b607 .cfa: $rsp -128 + +STACK CFI INIT 6b540 99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6b610 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6b73d 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6b747 .cfa: $rsp 0 + +STACK CFI 6b74b .cfa: $rsp 128 + +STACK CFI 6b753 .cfa: $rsp -128 + +STACK CFI INIT 6b758 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6b762 .cfa: $rsp 0 + +STACK CFI 6b766 .cfa: $rsp 128 + +STACK CFI 6b76e .cfa: $rsp -128 + +STACK CFI INIT 6b773 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6b77d .cfa: $rsp 0 + +STACK CFI 6b781 .cfa: $rsp 128 + +STACK CFI 6b789 .cfa: $rsp -128 + +STACK CFI INIT 6b640 fd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6b641 .cfa: $rsp 16 + +STACK CFI 6b64b $rbx: .cfa -16 + ^ +STACK CFI INIT 6b9ee 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6b9f8 .cfa: $rsp 0 + +STACK CFI 6b9fc .cfa: $rsp 128 + +STACK CFI 6ba04 .cfa: $rsp -128 + +STACK CFI INIT 6ba09 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6ba13 .cfa: $rsp 0 + +STACK CFI 6ba17 .cfa: $rsp 128 + +STACK CFI 6ba1f .cfa: $rsp -128 + +STACK CFI INIT 6ba24 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6ba2e .cfa: $rsp 0 + +STACK CFI 6ba32 .cfa: $rsp 128 + +STACK CFI 6ba3a .cfa: $rsp -128 + +STACK CFI INIT 6b790 25e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6b79c $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 6b7b5 .cfa: $rsp 192 + +STACK CFI 6b7ba $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 6bb2e 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6bb38 .cfa: $rsp 0 + +STACK CFI 6bb3c .cfa: $rsp 128 + +STACK CFI 6bb44 .cfa: $rsp -128 + +STACK CFI INIT 6bb49 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6bb53 .cfa: $rsp 0 + +STACK CFI 6bb57 .cfa: $rsp 128 + +STACK CFI 6bb5f .cfa: $rsp -128 + +STACK CFI INIT 6bb61 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6bb6b .cfa: $rsp 0 + +STACK CFI 6bb6f .cfa: $rsp 128 + +STACK CFI 6bb77 .cfa: $rsp -128 + +STACK CFI INIT 6ba40 ee .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6ba41 .cfa: $rsp 16 + +STACK CFI 6ba48 $rbx: .cfa -16 + ^ +STACK CFI INIT 6bc70 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6bc7a .cfa: $rsp 0 + +STACK CFI 6bc7e .cfa: $rsp 128 + +STACK CFI 6bc86 .cfa: $rsp -128 + +STACK CFI INIT 6bc8b 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6bc95 .cfa: $rsp 0 + +STACK CFI 6bc99 .cfa: $rsp 128 + +STACK CFI 6bca1 .cfa: $rsp -128 + +STACK CFI INIT 6bca6 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6bcb0 .cfa: $rsp 0 + +STACK CFI 6bcb4 .cfa: $rsp 128 + +STACK CFI 6bcbc .cfa: $rsp -128 + +STACK CFI INIT 6bb80 f0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6bb81 .cfa: $rsp 16 + +STACK CFI 6bb88 $rbx: .cfa -16 + ^ +STACK CFI INIT 6bdc1 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6bdcb .cfa: $rsp 0 + +STACK CFI 6bdcf .cfa: $rsp 128 + +STACK CFI 6bdd7 .cfa: $rsp -128 + +STACK CFI INIT 6bddc 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6bde6 .cfa: $rsp 0 + +STACK CFI 6bdea .cfa: $rsp 128 + +STACK CFI 6bdf2 .cfa: $rsp -128 + +STACK CFI INIT 6bdf7 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6be01 .cfa: $rsp 0 + +STACK CFI 6be05 .cfa: $rsp 128 + +STACK CFI 6be0d .cfa: $rsp -128 + +STACK CFI INIT 6bcc0 101 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6bcc8 .cfa: $rsp 16 + +STACK CFI 6bccf $rbx: .cfa -16 + ^ +STACK CFI INIT 6be10 e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6be1d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 6be30 .cfa: $rsp 64 + +STACK CFI 6be33 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 6bf00 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6bf09 .cfa: $rsp 16 + +STACK CFI 6bf0c $rbx: .cfa -16 + ^ +STACK CFI INIT 6bf50 6d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6bf51 .cfa: $rsp 16 + +STACK CFI 6bf52 .cfa: $rsp 24 + +STACK CFI 6bf55 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 6bf59 .cfa: $rsp 32 + +STACK CFI INIT 6bfc0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6c0cd 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6c0d7 .cfa: $rsp 0 + +STACK CFI 6c0db .cfa: $rsp 128 + +STACK CFI 6c0e3 .cfa: $rsp -128 + +STACK CFI INIT 6c0e8 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6c0f2 .cfa: $rsp 0 + +STACK CFI 6c0f6 .cfa: $rsp 128 + +STACK CFI 6c0fe .cfa: $rsp -128 + +STACK CFI INIT 6c103 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6c10d .cfa: $rsp 0 + +STACK CFI 6c111 .cfa: $rsp 128 + +STACK CFI 6c119 .cfa: $rsp -128 + +STACK CFI INIT 6bfd0 fd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6bfd1 .cfa: $rsp 16 + +STACK CFI 6bfdb $rbx: .cfa -16 + ^ +STACK CFI INIT 6c204 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6c20e .cfa: $rsp 0 + +STACK CFI 6c212 .cfa: $rsp 128 + +STACK CFI 6c21a .cfa: $rsp -128 + +STACK CFI INIT 6c21f 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6c229 .cfa: $rsp 0 + +STACK CFI 6c22d .cfa: $rsp 128 + +STACK CFI 6c235 .cfa: $rsp -128 + +STACK CFI INIT 6c237 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6c241 .cfa: $rsp 0 + +STACK CFI 6c245 .cfa: $rsp 128 + +STACK CFI 6c24d .cfa: $rsp -128 + +STACK CFI INIT 6c120 e4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6c121 .cfa: $rsp 16 + +STACK CFI 6c128 $rbx: .cfa -16 + ^ +STACK CFI INIT 6c250 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6c260 e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6c270 187 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6c27d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 6c298 .cfa: $rsp 288 + +STACK CFI 6c29e $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 6c400 152 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6c422 .cfa: $rsp 608 + +STACK CFI 6c42a $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 6c560 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6c580 7a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6c591 $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 6c59f .cfa: $rsp 48 + +STACK CFI 6c5a9 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 6c600 e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6c60d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 6c61a $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI 6c626 .cfa: $rsp 352 + +STACK CFI 6c630 $r14: .cfa -16 + ^ +STACK CFI INIT 6c6f0 d6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6c6fd $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ +STACK CFI 6c713 .cfa: $rsp 48 + +STACK CFI 6c71a $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 6c7d0 a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6c7dd $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI 6c7e6 .cfa: $rsp 32 + +STACK CFI 6c7f3 $rbx: .cfa -32 + ^ +STACK CFI INIT 6c880 1ba .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6c88d $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI 6c8aa .cfa: $rsp 304 + +STACK CFI 6c8b3 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI INIT 6ca40 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6ca47 .cfa: $rsp 224 + +STACK CFI INIT 6cad0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6cbce 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6cbd8 .cfa: $rsp 0 + +STACK CFI 6cbdc .cfa: $rsp 128 + +STACK CFI 6cbe4 .cfa: $rsp -128 + +STACK CFI INIT 6cbe9 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6cbf3 .cfa: $rsp 0 + +STACK CFI 6cbf7 .cfa: $rsp 128 + +STACK CFI 6cbff .cfa: $rsp -128 + +STACK CFI INIT 6cc01 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6cc0b .cfa: $rsp 0 + +STACK CFI 6cc0f .cfa: $rsp 128 + +STACK CFI 6cc17 .cfa: $rsp -128 + +STACK CFI INIT 6cae0 ee .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6cae1 .cfa: $rsp 16 + +STACK CFI 6cae8 $rbx: .cfa -16 + ^ +STACK CFI INIT 6cd58 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6cd62 .cfa: $rsp 0 + +STACK CFI 6cd66 .cfa: $rsp 128 + +STACK CFI 6cd6e .cfa: $rsp -128 + +STACK CFI INIT 6cd73 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6cd7d .cfa: $rsp 0 + +STACK CFI 6cd81 .cfa: $rsp 128 + +STACK CFI 6cd89 .cfa: $rsp -128 + +STACK CFI INIT 6cd8e 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6cd98 .cfa: $rsp 0 + +STACK CFI 6cd9c .cfa: $rsp 128 + +STACK CFI 6cda4 .cfa: $rsp -128 + +STACK CFI INIT 6cc20 138 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6cc21 .cfa: $rsp 16 + +STACK CFI 6cc28 $rbx: .cfa -16 + ^ +STACK CFI INIT 6d00e 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6d018 .cfa: $rsp 0 + +STACK CFI 6d01c .cfa: $rsp 128 + +STACK CFI 6d024 .cfa: $rsp -128 + +STACK CFI INIT 6d029 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6d033 .cfa: $rsp 0 + +STACK CFI 6d037 .cfa: $rsp 128 + +STACK CFI 6d03f .cfa: $rsp -128 + +STACK CFI INIT 6d044 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6d04e .cfa: $rsp 0 + +STACK CFI 6d052 .cfa: $rsp 128 + +STACK CFI 6d05a .cfa: $rsp -128 + +STACK CFI INIT 6cdb0 25e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6cdbc $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 6cdd5 .cfa: $rsp 192 + +STACK CFI 6cdda $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 6d060 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d090 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d0c0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d0d0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d0e0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d0f0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d100 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6d107 .cfa: $rsp 16 + +STACK CFI 6d10a $rbx: .cfa -16 + ^ +STACK CFI INIT 6d170 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d1a0 2e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d1d0 412 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6d1d1 .cfa: $rsp 16 + +STACK CFI 6d1d7 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 6d2a3 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 6d5f0 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6d5f1 .cfa: $rsp 16 + +STACK CFI 6d5f4 $rbx: .cfa -16 + ^ +STACK CFI INIT 6d610 61 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d680 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6d681 .cfa: $rsp 16 + +STACK CFI 6d687 $rbx: .cfa -16 + ^ +STACK CFI INIT 6d6a0 198 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6d6ad $r12: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI 6d6bb .cfa: $rsp 112 + +STACK CFI 6d6c4 $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT 6d840 c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6d84d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 6d856 .cfa: $rsp 32 + +STACK CFI 6d860 $r12: .cfa -16 + ^ +STACK CFI INIT 6d910 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6d911 .cfa: $rsp 16 + +STACK CFI 6d914 $rbp: .cfa -16 + ^ +STACK CFI 6d915 .cfa: $rsp 24 + +STACK CFI 6d918 $rbx: .cfa -24 + ^ +STACK CFI 6d91f .cfa: $rsp 32 + +STACK CFI INIT 6d970 4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d980 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d990 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d9a0 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d9d0 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6d9f0 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6da20 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6da24 .cfa: $rsp 16 + +STACK CFI INIT 6da50 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6db71 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6db7b .cfa: $rsp 0 + +STACK CFI 6db7f .cfa: $rsp 128 + +STACK CFI 6db87 .cfa: $rsp -128 + +STACK CFI INIT 6db8c 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 6db96 .cfa: $rsp 0 + +STACK CFI 6db9a .cfa: $rsp 128 + +STACK CFI 6dba2 .cfa: $rsp -128 + +STACK CFI INIT 6dba7 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 6dbb1 .cfa: $rsp 0 + +STACK CFI 6dbb5 .cfa: $rsp 128 + +STACK CFI 6dbbd .cfa: $rsp -128 + +STACK CFI INIT 6da80 f1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6da81 .cfa: $rsp 16 + +STACK CFI 6da88 $rbx: .cfa -16 + ^ +STACK CFI INIT 6dbc0 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6dbc8 $r12: .cfa -16 + ^ +STACK CFI 6dbda .cfa: $rsp 32 + +STACK CFI 6dbdd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 6dc20 92 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6dc28 $r12: .cfa -16 + ^ +STACK CFI 6dc3a .cfa: $rsp 32 + +STACK CFI 6dc3d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 6dcc0 b1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6dccd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 6dcd6 .cfa: $rsp 32 + +STACK CFI 6dce1 $r12: .cfa -16 + ^ +STACK CFI INIT 6dd80 77 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6dd8d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 6dd96 .cfa: $rsp 32 + +STACK CFI 6dd99 $r12: .cfa -16 + ^ +STACK CFI INIT 6de00 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6de01 .cfa: $rsp 16 + +STACK CFI 6de04 $rbp: .cfa -16 + ^ +STACK CFI 6de05 .cfa: $rsp 24 + +STACK CFI 6de09 .cfa: $rsp 32 + +STACK CFI 6de12 $rbx: .cfa -24 + ^ +STACK CFI INIT 6de90 bd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6de92 .cfa: $rsp 16 + +STACK CFI 6de95 $r15: .cfa -16 + ^ +STACK CFI 6de97 .cfa: $rsp 24 + +STACK CFI 6de9e $r14: .cfa -24 + ^ +STACK CFI 6dea0 .cfa: $rsp 32 + +STACK CFI 6dea3 $r13: .cfa -32 + ^ +STACK CFI 6dea5 .cfa: $rsp 40 + +STACK CFI 6dea6 .cfa: $rsp 48 + +STACK CFI 6dea7 .cfa: $rsp 56 + +STACK CFI 6deab .cfa: $rsp 128 + +STACK CFI 6deb0 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 6df50 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6df57 .cfa: $rsp 224 + +STACK CFI INIT 6dfe0 80 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6dff1 $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 6dfff .cfa: $rsp 48 + +STACK CFI 6e00c $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 6e060 f9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e06d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 6e086 .cfa: $rsp 880 + +STACK CFI 6e08c $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 6e160 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e182 .cfa: $rsp 624 + +STACK CFI 6e18a $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 6e210 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e217 .cfa: $rsp 224 + +STACK CFI INIT 6e2a0 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6e2e0 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6e320 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6e360 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e368 .cfa: $rsp 16 + +STACK CFI 6e36b $rbx: .cfa -16 + ^ +STACK CFI INIT 6e390 4c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e391 .cfa: $rsp 16 + +STACK CFI 6e39b $rbx: .cfa -16 + ^ +STACK CFI INIT 6e3e0 7d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e3e8 .cfa: $rsp 16 + +STACK CFI 6e3eb $rbx: .cfa -16 + ^ +STACK CFI INIT 6e460 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e461 .cfa: $rsp 16 + +STACK CFI 6e46b $rbx: .cfa -16 + ^ +STACK CFI INIT 6e4b0 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e4b8 .cfa: $rsp 16 + +STACK CFI 6e4bb $rbx: .cfa -16 + ^ +STACK CFI INIT 6e500 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6e550 76 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e551 .cfa: $rsp 16 + +STACK CFI 6e554 $rbx: .cfa -16 + ^ +STACK CFI 6e558 .cfa: $rsp 32 + +STACK CFI INIT 6e5d0 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6e620 97 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e621 .cfa: $rsp 16 + +STACK CFI 6e62a .cfa: $rsp 32 + +STACK CFI 6e62e $rbx: .cfa -16 + ^ +STACK CFI INIT 6e6c0 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6e6f0 41 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e6f1 .cfa: $rsp 16 + +STACK CFI 6e6f6 $rbx: .cfa -16 + ^ +STACK CFI INIT 6e740 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e741 .cfa: $rsp 16 + +STACK CFI 6e74c $rbx: .cfa -16 + ^ +STACK CFI INIT 6e790 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e79e .cfa: $rsp 32 + +STACK CFI 6e7a7 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 6e7e0 e5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e7e2 .cfa: $rsp 16 + +STACK CFI 6e7e7 $r15: .cfa -16 + ^ +STACK CFI 6e7e9 .cfa: $rsp 24 + +STACK CFI 6e7ec $r14: .cfa -24 + ^ +STACK CFI 6e7ee .cfa: $rsp 32 + +STACK CFI 6e7f0 .cfa: $rsp 40 + +STACK CFI 6e7f1 .cfa: $rsp 48 + +STACK CFI 6e7f4 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI 6e7f5 .cfa: $rsp 56 + +STACK CFI 6e7f8 $rbx: .cfa -56 + ^ +STACK CFI 6e7fc .cfa: $rsp 64 + +STACK CFI INIT 6e8d0 20d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6e8dd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 6e8f8 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 80 + +STACK CFI INIT 6eae0 10a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6eae1 .cfa: $rsp 16 + +STACK CFI 6eaeb $rbx: .cfa -16 + ^ +STACK CFI INIT 6ebf0 c6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6ebf2 .cfa: $rsp 16 + +STACK CFI 6ebf5 $r14: .cfa -16 + ^ +STACK CFI 6ebf7 .cfa: $rsp 24 + +STACK CFI 6ebf9 .cfa: $rsp 32 + +STACK CFI 6ebfc $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI 6ebfd .cfa: $rsp 40 + +STACK CFI 6ec00 $rbp: .cfa -40 + ^ +STACK CFI 6ec01 .cfa: $rsp 48 + +STACK CFI 6ec04 $rbx: .cfa -48 + ^ +STACK CFI INIT 6ecc0 11a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6ecc1 .cfa: $rsp 16 + +STACK CFI 6eccb $rbx: .cfa -16 + ^ +STACK CFI INIT 6ede0 199 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6edec $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 6ee07 .cfa: $rsp 64 + +STACK CFI 6ee1a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 6ef80 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6ef8e .cfa: $rsp 48 + +STACK CFI 6ef98 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 6f030 98 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6f031 .cfa: $rsp 16 + +STACK CFI 6f03b $rbx: .cfa -16 + ^ +STACK CFI INIT 6f0d0 4f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6f120 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6f140 3a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6f141 .cfa: $rsp 16 + +STACK CFI 6f14b $rbx: .cfa -16 + ^ +STACK CFI INIT 6f180 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 6f1a0 243 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6f1b9 $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 6f1c7 .cfa: $rsp 96 + +STACK CFI 6f1da $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 6f3f0 1e0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6f3fd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 6f40b .cfa: $rsp 64 + +STACK CFI 6f413 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 6f5d0 1ef .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6f5dc $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 6f5e9 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 6f5f7 .cfa: $rsp 80 + +STACK CFI 6f607 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 6f7c0 be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6f7cd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 6f7db .cfa: $rsp 48 + +STACK CFI 6f7e4 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 70bbe 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 70bc8 .cfa: $rsp 0 + +STACK CFI 70bcc .cfa: $rsp 128 + +STACK CFI 70bd4 .cfa: $rsp -128 + +STACK CFI INIT 70bd9 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 70be3 .cfa: $rsp 0 + +STACK CFI 70be7 .cfa: $rsp 128 + +STACK CFI 70bef .cfa: $rsp -128 + +STACK CFI INIT 70bf4 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 70bfe .cfa: $rsp 0 + +STACK CFI 70c02 .cfa: $rsp 128 + +STACK CFI 70c0a .cfa: $rsp -128 + +STACK CFI INIT 6f880 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6f881 .cfa: $rsp 16 + +STACK CFI 6f884 $rbx: .cfa -16 + ^ +STACK CFI INIT 6f8c0 145 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6f8c1 .cfa: $rsp 16 + +STACK CFI 6f8c2 .cfa: $rsp 24 + +STACK CFI 6f8c5 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 6f8c9 .cfa: $rsp 64 + +STACK CFI INIT 6fa10 198 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6fa29 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 6fa37 .cfa: $rsp 64 + +STACK CFI 6fa42 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 6fbb0 4ec .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 6fbbd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 6fbca $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 6fbdb .cfa: $rsp 208 + +STACK CFI 6fbe5 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 700a0 15a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 700ad $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 700b6 .cfa: $rsp 32 + +STACK CFI 700ca $r12: .cfa -16 + ^ +STACK CFI INIT 70200 272 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 70201 .cfa: $rsp 16 + +STACK CFI 70203 $rbp: .cfa -16 + ^ +STACK CFI 70204 .cfa: $rsp 24 + +STACK CFI 70207 $rbx: .cfa -24 + ^ +STACK CFI 7020b .cfa: $rsp 32 + +STACK CFI INIT 70480 5d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 70482 .cfa: $rsp 16 + +STACK CFI 70484 .cfa: $rsp 24 + +STACK CFI 70486 .cfa: $rsp 32 + +STACK CFI 70488 .cfa: $rsp 40 + +STACK CFI 70489 .cfa: $rsp 48 + +STACK CFI 7048a .cfa: $rsp 56 + +STACK CFI 7048d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 70491 .cfa: $rsp 128 + +STACK CFI INIT 70a60 15e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 70a6d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 70a7a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 70a88 .cfa: $rsp 112 + +STACK CFI 70a9b $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 70c10 e2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 70c1d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 70c2a $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI 70c2e .cfa: $rsp 48 + +STACK CFI INIT 70d00 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 70d08 .cfa: $rsp 16 + +STACK CFI 70d0b $rbx: .cfa -16 + ^ +STACK CFI INIT 70d60 82 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 70d61 .cfa: $rsp 16 + +STACK CFI 70d62 .cfa: $rsp 24 + +STACK CFI 70d65 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 70d69 .cfa: $rsp 32 + +STACK CFI INIT 70f16 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 70f20 .cfa: $rsp 0 + +STACK CFI 70f24 .cfa: $rsp 128 + +STACK CFI 70f2c .cfa: $rsp -128 + +STACK CFI INIT 70f31 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 70f3b .cfa: $rsp 0 + +STACK CFI 70f3f .cfa: $rsp 128 + +STACK CFI 70f47 .cfa: $rsp -128 + +STACK CFI INIT 70f4c 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 70f56 .cfa: $rsp 0 + +STACK CFI 70f5a .cfa: $rsp 128 + +STACK CFI 70f62 .cfa: $rsp -128 + +STACK CFI INIT 70df0 126 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 70df1 .cfa: $rsp 16 + +STACK CFI 70df3 $rbp: .cfa -16 + ^ +STACK CFI 70df4 .cfa: $rsp 24 + +STACK CFI 70df7 $rbx: .cfa -24 + ^ +STACK CFI 70dfb .cfa: $rsp 32 + +STACK CFI INIT 70f70 74 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 70f78 $rbx: .cfa -24 + ^ +STACK CFI 70f86 .cfa: $rsp 32 + +STACK CFI 70f88 $rbp: .cfa -16 + ^ +STACK CFI INIT 710e9 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 710f3 .cfa: $rsp 0 + +STACK CFI 710f7 .cfa: $rsp 128 + +STACK CFI 710ff .cfa: $rsp -128 + +STACK CFI INIT 71104 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7110e .cfa: $rsp 0 + +STACK CFI 71112 .cfa: $rsp 128 + +STACK CFI 7111a .cfa: $rsp -128 + +STACK CFI INIT 7111f 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 71129 .cfa: $rsp 0 + +STACK CFI 7112d .cfa: $rsp 128 + +STACK CFI 71135 .cfa: $rsp -128 + +STACK CFI INIT 70ff0 f9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 70ff1 .cfa: $rsp 16 + +STACK CFI 70ff8 $rbx: .cfa -16 + ^ +STACK CFI INIT 71140 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7127a 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 71284 .cfa: $rsp 0 + +STACK CFI 71288 .cfa: $rsp 128 + +STACK CFI 71290 .cfa: $rsp -128 + +STACK CFI INIT 71295 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7129f .cfa: $rsp 0 + +STACK CFI 712a3 .cfa: $rsp 128 + +STACK CFI 712ab .cfa: $rsp -128 + +STACK CFI INIT 712b0 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 712ba .cfa: $rsp 0 + +STACK CFI 712be .cfa: $rsp 128 + +STACK CFI 712c6 .cfa: $rsp -128 + +STACK CFI INIT 71170 10a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 71178 .cfa: $rsp 16 + +STACK CFI 7117f $rbx: .cfa -16 + ^ +STACK CFI INIT 712d0 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7148d 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 71497 .cfa: $rsp 0 + +STACK CFI 7149b .cfa: $rsp 128 + +STACK CFI 714a3 .cfa: $rsp -128 + +STACK CFI INIT 714a8 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 714b2 .cfa: $rsp 0 + +STACK CFI 714b6 .cfa: $rsp 128 + +STACK CFI 714be .cfa: $rsp -128 + +STACK CFI INIT 714c3 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 714cd .cfa: $rsp 0 + +STACK CFI 714d1 .cfa: $rsp 128 + +STACK CFI 714d9 .cfa: $rsp -128 + +STACK CFI INIT 71300 18d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 71316 .cfa: $rsp 32 + +STACK CFI 7131b $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 714e0 b4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 714ed $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 714f6 .cfa: $rsp 32 + +STACK CFI 71501 $r12: .cfa -16 + ^ +STACK CFI INIT 716e0 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 716ea .cfa: $rsp 0 + +STACK CFI 716ee .cfa: $rsp 128 + +STACK CFI 716f6 .cfa: $rsp -128 + +STACK CFI INIT 716fb 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 71705 .cfa: $rsp 0 + +STACK CFI 71709 .cfa: $rsp 128 + +STACK CFI 71711 .cfa: $rsp -128 + +STACK CFI INIT 71716 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 71720 .cfa: $rsp 0 + +STACK CFI 71724 .cfa: $rsp 128 + +STACK CFI 7172c .cfa: $rsp -128 + +STACK CFI INIT 715a0 140 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 715ad $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 715b6 .cfa: $rsp 32 + +STACK CFI 715b9 $r12: .cfa -16 + ^ +STACK CFI INIT 71730 6d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7173d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 71746 .cfa: $rsp 32 + +STACK CFI 71749 $r12: .cfa -16 + ^ +STACK CFI INIT 717a0 1d0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 717a2 .cfa: $rsp 16 + +STACK CFI 717a4 .cfa: $rsp 24 + +STACK CFI 717a6 .cfa: $rsp 32 + +STACK CFI 717a8 .cfa: $rsp 40 + +STACK CFI 717ab $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 717ac .cfa: $rsp 48 + +STACK CFI 717af $rbp: .cfa -48 + ^ +STACK CFI 717b0 .cfa: $rsp 56 + +STACK CFI 717b3 $rbx: .cfa -56 + ^ +STACK CFI 717b7 .cfa: $rsp 96 + +STACK CFI INIT 71970 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 71a32 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 71a3c .cfa: $rsp 0 + +STACK CFI 71a40 .cfa: $rsp 128 + +STACK CFI 71a48 .cfa: $rsp -128 + +STACK CFI INIT 71a4d 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 71a57 .cfa: $rsp 0 + +STACK CFI 71a5b .cfa: $rsp 128 + +STACK CFI 71a63 .cfa: $rsp -128 + +STACK CFI INIT 71980 b2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 71981 .cfa: $rsp 16 + +STACK CFI 71983 $rbp: .cfa -16 + ^ +STACK CFI 71984 .cfa: $rsp 24 + +STACK CFI 71987 $rbx: .cfa -24 + ^ +STACK CFI 7198b .cfa: $rsp 32 + +STACK CFI INIT 71b74 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 71b7e .cfa: $rsp 0 + +STACK CFI 71b82 .cfa: $rsp 128 + +STACK CFI 71b8a .cfa: $rsp -128 + +STACK CFI INIT 71b8f 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 71b99 .cfa: $rsp 0 + +STACK CFI 71b9d .cfa: $rsp 128 + +STACK CFI 71ba5 .cfa: $rsp -128 + +STACK CFI INIT 71baa 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 71bb4 .cfa: $rsp 0 + +STACK CFI 71bb8 .cfa: $rsp 128 + +STACK CFI 71bc0 .cfa: $rsp -128 + +STACK CFI INIT 71a70 104 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 71a71 .cfa: $rsp 16 + +STACK CFI 71a7b $rbx: .cfa -16 + ^ +STACK CFI INIT 71bd0 30 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 71d15 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 71d1f .cfa: $rsp 0 + +STACK CFI 71d23 .cfa: $rsp 128 + +STACK CFI 71d2b .cfa: $rsp -128 + +STACK CFI INIT 71d30 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 71d3a .cfa: $rsp 0 + +STACK CFI 71d3e .cfa: $rsp 128 + +STACK CFI 71d46 .cfa: $rsp -128 + +STACK CFI INIT 71d4b 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 71d55 .cfa: $rsp 0 + +STACK CFI 71d59 .cfa: $rsp 128 + +STACK CFI 71d61 .cfa: $rsp -128 + +STACK CFI INIT 71c00 115 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 71c08 .cfa: $rsp 16 + +STACK CFI 71c12 $rbx: .cfa -16 + ^ +STACK CFI INIT 71d70 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 71db0 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 71db7 .cfa: $rsp 224 + +STACK CFI INIT 71e40 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 71e60 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 71e67 .cfa: $rsp 224 + +STACK CFI INIT 71f10 a4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 71f17 .cfa: $rsp 224 + +STACK CFI INIT 71fc0 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 71fc7 .cfa: $rsp 224 + +STACK CFI INIT 72050 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 72167 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 72171 .cfa: $rsp 0 + +STACK CFI 72175 .cfa: $rsp 128 + +STACK CFI 7217d .cfa: $rsp -128 + +STACK CFI INIT 72182 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 7218c .cfa: $rsp 0 + +STACK CFI 72190 .cfa: $rsp 128 + +STACK CFI 72198 .cfa: $rsp -128 + +STACK CFI INIT 72070 f7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72074 .cfa: $rsp 16 + +STACK CFI 7207c $rbx: .cfa -16 + ^ +STACK CFI INIT 74077 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 74081 .cfa: $rsp 0 + +STACK CFI 74085 .cfa: $rsp 128 + +STACK CFI 7408d .cfa: $rsp -128 + +STACK CFI INIT 74092 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7409c .cfa: $rsp 0 + +STACK CFI 740a0 .cfa: $rsp 128 + +STACK CFI 740a8 .cfa: $rsp -128 + +STACK CFI INIT 740ad 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 740b7 .cfa: $rsp 0 + +STACK CFI 740bb .cfa: $rsp 128 + +STACK CFI 740c3 .cfa: $rsp -128 + +STACK CFI INIT 721a0 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 721ad $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 721b6 .cfa: $rsp 32 + +STACK CFI 721bc $r12: .cfa -16 + ^ +STACK CFI INIT 72230 f9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72231 .cfa: $rsp 16 + +STACK CFI 72234 $rbp: .cfa -16 + ^ +STACK CFI 72235 .cfa: $rsp 24 + +STACK CFI 72238 $rbx: .cfa -24 + ^ +STACK CFI 7223c .cfa: $rsp 32 + +STACK CFI INIT 72330 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72338 .cfa: $rsp 16 + +STACK CFI 7233b $rbx: .cfa -16 + ^ +STACK CFI INIT 72360 5a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72361 .cfa: $rsp 16 + +STACK CFI 72368 $rbx: .cfa -16 + ^ +STACK CFI INIT 723c0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 723d0 153 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 723e1 .cfa: $rsp 176 + +STACK CFI 723eb $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 72530 49 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7253d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 72546 .cfa: $rsp 32 + +STACK CFI 7254c $r12: .cfa -16 + ^ +STACK CFI INIT 72580 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72581 .cfa: $rsp 16 + +STACK CFI 72584 $rbx: .cfa -16 + ^ +STACK CFI INIT 725a0 1be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 725a1 .cfa: $rsp 16 + +STACK CFI 725a2 .cfa: $rsp 24 + +STACK CFI 725a5 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 725ac .cfa: $rsp 176 + +STACK CFI INIT 72760 116 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7276d $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 72788 .cfa: $rsp 64 + +STACK CFI 7278c $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 72880 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72881 .cfa: $rsp 16 + +STACK CFI 72888 $rbx: .cfa -16 + ^ +STACK CFI INIT 728d0 1a9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 728d2 .cfa: $rsp 16 + +STACK CFI 728d5 $r14: .cfa -16 + ^ +STACK CFI 728d7 .cfa: $rsp 24 + +STACK CFI 728da $r13: .cfa -24 + ^ +STACK CFI 728dc .cfa: $rsp 32 + +STACK CFI 728dd .cfa: $rsp 40 + +STACK CFI 728de .cfa: $rsp 48 + +STACK CFI 728e6 $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 72a80 131 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72a8d $r12: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI 72a9b .cfa: $rsp 48 + +STACK CFI 72aa3 $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT 72bc0 217 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72bd9 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 72be7 .cfa: $rsp 64 + +STACK CFI 72bf6 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 72de0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72de4 .cfa: $rsp 16 + +STACK CFI 72de7 $rbx: .cfa -16 + ^ +STACK CFI INIT 72e10 9c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72e12 .cfa: $rsp 16 + +STACK CFI 72e17 $r13: .cfa -16 + ^ +STACK CFI 72e19 .cfa: $rsp 24 + +STACK CFI 72e1c $r12: .cfa -24 + ^ +STACK CFI 72e1d .cfa: $rsp 32 + +STACK CFI 72e20 $rbp: .cfa -32 + ^ +STACK CFI 72e21 .cfa: $rsp 40 + +STACK CFI 72e24 $rbx: .cfa -40 + ^ +STACK CFI 72e28 .cfa: $rsp 48 + +STACK CFI INIT 72eb0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 72ec0 2d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72ec1 .cfa: $rsp 16 + +STACK CFI 72ec4 $rbx: .cfa -16 + ^ +STACK CFI INIT 72ef0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 72f00 23 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72f04 .cfa: $rsp 16 + +STACK CFI INIT 72f30 22f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 72f31 .cfa: $rsp 16 + +STACK CFI 72f32 .cfa: $rsp 24 + +STACK CFI 72f35 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 72f39 .cfa: $rsp 32 + +STACK CFI INIT 73160 3e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7316d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 73186 .cfa: $rsp 192 + +STACK CFI 73191 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 73550 bf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 73551 .cfa: $rsp 16 + +STACK CFI 73558 $rbx: .cfa -16 + ^ +STACK CFI INIT 73610 235 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7361d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 73626 .cfa: $rsp 32 + +STACK CFI 73632 $r12: .cfa -16 + ^ +STACK CFI INIT 73850 37 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 73851 .cfa: $rsp 16 + +STACK CFI 73854 $rbx: .cfa -16 + ^ +STACK CFI INIT 73890 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7389f .cfa: $rsp 16 + +STACK CFI 738a2 $rbx: .cfa -16 + ^ +STACK CFI INIT 738f0 ca .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 738f8 $rbx: .cfa -32 + ^ +STACK CFI 73906 .cfa: $rsp 32 + +STACK CFI 73910 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI INIT 739c0 487 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 739c1 .cfa: $rsp 16 + +STACK CFI 739c4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 739cf $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 739d3 $rbx: .cfa -56 + ^ +STACK CFI INIT 73e50 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 73e5e .cfa: $rsp 32 + +STACK CFI 73e6b $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 73e90 72 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 73e91 .cfa: $rsp 16 + +STACK CFI 73e98 $rbx: .cfa -16 + ^ +STACK CFI INIT 73f10 167 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 73f12 .cfa: $rsp 16 + +STACK CFI 73f18 $r12: .cfa -16 + ^ +STACK CFI 73f19 .cfa: $rsp 24 + +STACK CFI 73f1a .cfa: $rsp 32 + +STACK CFI 73f21 $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 75c47 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 75c51 .cfa: $rsp 0 + +STACK CFI 75c55 .cfa: $rsp 128 + +STACK CFI 75c5d .cfa: $rsp -128 + +STACK CFI INIT 75c62 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75c70 .cfa: $rsp 0 + +STACK CFI 75c74 .cfa: $rsp 128 + +STACK CFI 75c7c .cfa: $rsp -128 + +STACK CFI INIT 75c81 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75c8f .cfa: $rsp 0 + +STACK CFI 75c93 .cfa: $rsp 128 + +STACK CFI 75c9b .cfa: $rsp -128 + +STACK CFI INIT 75ca0 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 75caa .cfa: $rsp 0 + +STACK CFI 75cae .cfa: $rsp 128 + +STACK CFI 75cb6 .cfa: $rsp -128 + +STACK CFI INIT 75cbb 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75cc9 .cfa: $rsp 0 + +STACK CFI 75ccd .cfa: $rsp 128 + +STACK CFI 75cd5 .cfa: $rsp -128 + +STACK CFI INIT 75cda 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 75ce4 .cfa: $rsp 0 + +STACK CFI 75ce8 .cfa: $rsp 128 + +STACK CFI 75cf0 .cfa: $rsp -128 + +STACK CFI INIT 75cf5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75d03 .cfa: $rsp 0 + +STACK CFI 75d07 .cfa: $rsp 128 + +STACK CFI 75d0f .cfa: $rsp -128 + +STACK CFI INIT 75d14 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 75d1e .cfa: $rsp 0 + +STACK CFI 75d22 .cfa: $rsp 128 + +STACK CFI 75d2a .cfa: $rsp -128 + +STACK CFI INIT 75d2f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75d3d .cfa: $rsp 0 + +STACK CFI 75d41 .cfa: $rsp 128 + +STACK CFI 75d49 .cfa: $rsp -128 + +STACK CFI INIT 75d4e 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 75d58 .cfa: $rsp 0 + +STACK CFI 75d5c .cfa: $rsp 128 + +STACK CFI 75d64 .cfa: $rsp -128 + +STACK CFI INIT 75d69 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75d77 .cfa: $rsp 0 + +STACK CFI 75d7b .cfa: $rsp 128 + +STACK CFI 75d83 .cfa: $rsp -128 + +STACK CFI INIT 75d88 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 75d92 .cfa: $rsp 0 + +STACK CFI 75d96 .cfa: $rsp 128 + +STACK CFI 75d9e .cfa: $rsp -128 + +STACK CFI INIT 75da3 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 75dad .cfa: $rsp 0 + +STACK CFI 75db1 .cfa: $rsp 128 + +STACK CFI 75db9 .cfa: $rsp -128 + +STACK CFI INIT 75dbe 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75dcc .cfa: $rsp 0 + +STACK CFI 75dd0 .cfa: $rsp 128 + +STACK CFI 75dd8 .cfa: $rsp -128 + +STACK CFI INIT 75ddd 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75deb .cfa: $rsp 0 + +STACK CFI 75def .cfa: $rsp 128 + +STACK CFI 75df7 .cfa: $rsp -128 + +STACK CFI INIT 75dfc 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 75e06 .cfa: $rsp 0 + +STACK CFI 75e0a .cfa: $rsp 128 + +STACK CFI 75e12 .cfa: $rsp -128 + +STACK CFI INIT 75e17 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 75e21 .cfa: $rsp 0 + +STACK CFI 75e25 .cfa: $rsp 128 + +STACK CFI 75e2d .cfa: $rsp -128 + +STACK CFI INIT 75e32 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75e40 .cfa: $rsp 0 + +STACK CFI 75e44 .cfa: $rsp 128 + +STACK CFI 75e4c .cfa: $rsp -128 + +STACK CFI INIT 75e51 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75e5f .cfa: $rsp 0 + +STACK CFI 75e63 .cfa: $rsp 128 + +STACK CFI 75e6b .cfa: $rsp -128 + +STACK CFI INIT 75e70 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 75e7e .cfa: $rsp 0 + +STACK CFI 75e82 .cfa: $rsp 128 + +STACK CFI 75e8a .cfa: $rsp -128 + +STACK CFI INIT 75e8f 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 75e99 .cfa: $rsp 0 + +STACK CFI 75e9d .cfa: $rsp 128 + +STACK CFI 75ea5 .cfa: $rsp -128 + +STACK CFI INIT 740d0 8e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74160 247 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 74161 .cfa: $rsp 16 + +STACK CFI 74162 .cfa: $rsp 24 + +STACK CFI 74165 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 74169 .cfa: $rsp 64 + +STACK CFI INIT 743b0 1e9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 743b1 .cfa: $rsp 16 + +STACK CFI 743b2 .cfa: $rsp 24 + +STACK CFI 743b5 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 743b9 .cfa: $rsp 64 + +STACK CFI INIT 745a0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 745d0 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74600 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74630 72 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 74639 .cfa: $rsp 16 + +STACK CFI 7463c $rbx: .cfa -16 + ^ +STACK CFI INIT 746b0 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 746e0 4a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 746e1 .cfa: $rsp 16 + +STACK CFI 746e9 $rbx: .cfa -16 + ^ +STACK CFI INIT 74730 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74740 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 74748 .cfa: $rsp 16 + +STACK CFI 7474b $rbx: .cfa -16 + ^ +STACK CFI INIT 74770 d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74780 c4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7478d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 74796 .cfa: $rsp 32 + +STACK CFI 747a3 $r12: .cfa -16 + ^ +STACK CFI INIT 74850 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74870 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74920 c7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7492c $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 7493a .cfa: $rsp 48 + +STACK CFI 74940 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 749f0 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74a00 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74a10 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74a20 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 74a21 .cfa: $rsp 16 + +STACK CFI 74a28 $rbx: .cfa -16 + ^ +STACK CFI INIT 74a70 36 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 74a79 .cfa: $rsp 16 + +STACK CFI 74a7c $rbx: .cfa -16 + ^ +STACK CFI INIT 74ab0 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74af0 287 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 74af2 .cfa: $rsp 16 + +STACK CFI 74af4 .cfa: $rsp 24 + +STACK CFI 74af6 .cfa: $rsp 32 + +STACK CFI 74af8 .cfa: $rsp 40 + +STACK CFI 74af9 .cfa: $rsp 48 + +STACK CFI 74afa .cfa: $rsp 56 + +STACK CFI 74afc $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 74b00 .cfa: $rsp 96 + +STACK CFI INIT 74d80 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 74d90 247 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 74d92 .cfa: $rsp 16 + +STACK CFI 74d94 .cfa: $rsp 24 + +STACK CFI 74d96 .cfa: $rsp 32 + +STACK CFI 74d98 .cfa: $rsp 40 + +STACK CFI 74d99 .cfa: $rsp 48 + +STACK CFI 74d9a .cfa: $rsp 56 + +STACK CFI 74d9e .cfa: $rsp 96 + +STACK CFI 74da5 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 74fe0 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 74fe1 .cfa: $rsp 16 + +STACK CFI 74fe4 $rbx: .cfa -16 + ^ +STACK CFI 74fe8 .cfa: $rsp 32 + +STACK CFI INIT 75040 3f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75080 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75090 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 750d0 87 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 750d1 .cfa: $rsp 16 + +STACK CFI 750da .cfa: $rsp 32 + +STACK CFI 750de $rbx: .cfa -16 + ^ +STACK CFI INIT 75160 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75190 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 751a0 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 751b0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 751c0 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 751d0 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 751e0 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 751f0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75200 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75210 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75220 4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75230 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75280 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 752d0 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 136300 60 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136304 .cfa: $rsp 16 + +STACK CFI INIT 752f0 74 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 752fd $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 75301 .cfa: $rsp 48 + +STACK CFI INIT 75370 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 75371 .cfa: $rsp 16 + +STACK CFI 75374 $rbx: .cfa -16 + ^ +STACK CFI INIT 753f0 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 753f1 .cfa: $rsp 16 + +STACK CFI 753f6 $rbx: .cfa -16 + ^ +STACK CFI INIT 75430 bf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 75432 .cfa: $rsp 16 + +STACK CFI 7543a $r14: .cfa -16 + ^ +STACK CFI 7543c .cfa: $rsp 24 + +STACK CFI 7543e .cfa: $rsp 32 + +STACK CFI 75441 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI 75442 .cfa: $rsp 40 + +STACK CFI 75445 $rbp: .cfa -40 + ^ +STACK CFI 75446 .cfa: $rsp 48 + +STACK CFI 75449 $rbx: .cfa -48 + ^ +STACK CFI INIT 754f0 196 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 754fd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 75518 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 80 + +STACK CFI INIT 75690 15f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7569c $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 756b7 .cfa: $rsp 64 + +STACK CFI 756c4 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 757f0 c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 757f1 .cfa: $rsp 16 + +STACK CFI 757fa $rbx: .cfa -16 + ^ +STACK CFI INIT 758c0 b8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 758c1 .cfa: $rsp 16 + +STACK CFI 758ca $rbx: .cfa -16 + ^ +STACK CFI INIT 75980 ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 75982 .cfa: $rsp 16 + +STACK CFI 75985 $r14: .cfa -16 + ^ +STACK CFI 75987 .cfa: $rsp 24 + +STACK CFI 7598a $r13: .cfa -24 + ^ +STACK CFI 7598c .cfa: $rsp 32 + +STACK CFI 7598d .cfa: $rsp 40 + +STACK CFI 75990 $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ +STACK CFI 75991 .cfa: $rsp 48 + +STACK CFI 75994 $rbx: .cfa -48 + ^ +STACK CFI INIT 75a30 1d0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 75a32 .cfa: $rsp 16 + +STACK CFI 75a36 .cfa: $rsp 24 + +STACK CFI 75a38 .cfa: $rsp 32 + +STACK CFI 75a3a .cfa: $rsp 40 + +STACK CFI 75a3b .cfa: $rsp 48 + +STACK CFI 75a3c .cfa: $rsp 56 + +STACK CFI 75a40 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 64 + +STACK CFI INIT 75c00 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 75c01 .cfa: $rsp 16 + +STACK CFI 75c0c $rbx: .cfa -16 + ^ +STACK CFI INIT 75eb0 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75f00 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75f20 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 75f21 .cfa: $rsp 16 + +STACK CFI 75f24 $rbx: .cfa -16 + ^ +STACK CFI INIT 75f50 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 75f70 1ba .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 75f89 $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 75f97 .cfa: $rsp 80 + +STACK CFI 75fad $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 76130 197 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7613d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 7614b .cfa: $rsp 64 + +STACK CFI 76153 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 762d0 1ae .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 762dd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 762ea $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 762f8 .cfa: $rsp 80 + +STACK CFI 76307 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 76480 ae .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7648d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 7649b .cfa: $rsp 48 + +STACK CFI 764a4 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 76530 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 76538 .cfa: $rsp 16 + +STACK CFI 7653e $rbx: .cfa -16 + ^ +STACK CFI INIT 76550 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7d1b4 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d1be .cfa: $rsp 0 + +STACK CFI 7d1c2 .cfa: $rsp 128 + +STACK CFI 7d1ca .cfa: $rsp -128 + +STACK CFI INIT 7d1cf 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d1dd .cfa: $rsp 0 + +STACK CFI 7d1e1 .cfa: $rsp 128 + +STACK CFI 7d1e9 .cfa: $rsp -128 + +STACK CFI INIT 7d1ee 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d1f8 .cfa: $rsp 0 + +STACK CFI 7d1fc .cfa: $rsp 128 + +STACK CFI 7d204 .cfa: $rsp -128 + +STACK CFI INIT 7d209 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d217 .cfa: $rsp 0 + +STACK CFI 7d21b .cfa: $rsp 128 + +STACK CFI 7d223 .cfa: $rsp -128 + +STACK CFI INIT 7d228 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d236 .cfa: $rsp 0 + +STACK CFI 7d23a .cfa: $rsp 128 + +STACK CFI 7d242 .cfa: $rsp -128 + +STACK CFI INIT 7d247 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d255 .cfa: $rsp 0 + +STACK CFI 7d259 .cfa: $rsp 128 + +STACK CFI 7d261 .cfa: $rsp -128 + +STACK CFI INIT 7d266 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d274 .cfa: $rsp 0 + +STACK CFI 7d278 .cfa: $rsp 128 + +STACK CFI 7d280 .cfa: $rsp -128 + +STACK CFI INIT 7d285 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d293 .cfa: $rsp 0 + +STACK CFI 7d297 .cfa: $rsp 128 + +STACK CFI 7d29f .cfa: $rsp -128 + +STACK CFI INIT 7d2a4 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d2b2 .cfa: $rsp 0 + +STACK CFI 7d2b6 .cfa: $rsp 128 + +STACK CFI 7d2be .cfa: $rsp -128 + +STACK CFI INIT 7d2c3 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d2d1 .cfa: $rsp 0 + +STACK CFI 7d2d5 .cfa: $rsp 128 + +STACK CFI 7d2dd .cfa: $rsp -128 + +STACK CFI INIT 7d2e2 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d2ec .cfa: $rsp 0 + +STACK CFI 7d2f0 .cfa: $rsp 128 + +STACK CFI 7d2f8 .cfa: $rsp -128 + +STACK CFI INIT 7d2fd 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d307 .cfa: $rsp 0 + +STACK CFI 7d30b .cfa: $rsp 128 + +STACK CFI 7d313 .cfa: $rsp -128 + +STACK CFI INIT 7d318 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d326 .cfa: $rsp 0 + +STACK CFI 7d32a .cfa: $rsp 128 + +STACK CFI 7d332 .cfa: $rsp -128 + +STACK CFI INIT 7d337 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d345 .cfa: $rsp 0 + +STACK CFI 7d349 .cfa: $rsp 128 + +STACK CFI 7d351 .cfa: $rsp -128 + +STACK CFI INIT 7d356 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d364 .cfa: $rsp 0 + +STACK CFI 7d368 .cfa: $rsp 128 + +STACK CFI 7d370 .cfa: $rsp -128 + +STACK CFI INIT 7d375 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d383 .cfa: $rsp 0 + +STACK CFI 7d387 .cfa: $rsp 128 + +STACK CFI 7d38f .cfa: $rsp -128 + +STACK CFI INIT 7d394 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d39e .cfa: $rsp 0 + +STACK CFI 7d3a2 .cfa: $rsp 128 + +STACK CFI 7d3aa .cfa: $rsp -128 + +STACK CFI INIT 7d3af 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d3b9 .cfa: $rsp 0 + +STACK CFI 7d3bd .cfa: $rsp 128 + +STACK CFI 7d3c5 .cfa: $rsp -128 + +STACK CFI INIT 7d3ca 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d3d8 .cfa: $rsp 0 + +STACK CFI 7d3dc .cfa: $rsp 128 + +STACK CFI 7d3e4 .cfa: $rsp -128 + +STACK CFI INIT 7d3e9 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d3f7 .cfa: $rsp 0 + +STACK CFI 7d3fb .cfa: $rsp 128 + +STACK CFI 7d403 .cfa: $rsp -128 + +STACK CFI INIT 7d408 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d412 .cfa: $rsp 0 + +STACK CFI 7d416 .cfa: $rsp 128 + +STACK CFI 7d41e .cfa: $rsp -128 + +STACK CFI INIT 7d423 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d431 .cfa: $rsp 0 + +STACK CFI 7d435 .cfa: $rsp 128 + +STACK CFI 7d43d .cfa: $rsp -128 + +STACK CFI INIT 7d442 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d450 .cfa: $rsp 0 + +STACK CFI 7d454 .cfa: $rsp 128 + +STACK CFI 7d45c .cfa: $rsp -128 + +STACK CFI INIT 7d461 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d46f .cfa: $rsp 0 + +STACK CFI 7d473 .cfa: $rsp 128 + +STACK CFI 7d47b .cfa: $rsp -128 + +STACK CFI INIT 7d480 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d48e .cfa: $rsp 0 + +STACK CFI 7d492 .cfa: $rsp 128 + +STACK CFI 7d49a .cfa: $rsp -128 + +STACK CFI INIT 7d49f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d4ad .cfa: $rsp 0 + +STACK CFI 7d4b1 .cfa: $rsp 128 + +STACK CFI 7d4b9 .cfa: $rsp -128 + +STACK CFI INIT 7d4be 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d4cc .cfa: $rsp 0 + +STACK CFI 7d4d0 .cfa: $rsp 128 + +STACK CFI 7d4d8 .cfa: $rsp -128 + +STACK CFI INIT 7d4dd 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d4e7 .cfa: $rsp 0 + +STACK CFI 7d4eb .cfa: $rsp 128 + +STACK CFI 7d4f3 .cfa: $rsp -128 + +STACK CFI INIT 7d4f8 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d502 .cfa: $rsp 0 + +STACK CFI 7d506 .cfa: $rsp 128 + +STACK CFI 7d50e .cfa: $rsp -128 + +STACK CFI INIT 7d513 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d51d .cfa: $rsp 0 + +STACK CFI 7d521 .cfa: $rsp 128 + +STACK CFI 7d529 .cfa: $rsp -128 + +STACK CFI INIT 7d52e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d53c .cfa: $rsp 0 + +STACK CFI 7d540 .cfa: $rsp 128 + +STACK CFI 7d548 .cfa: $rsp -128 + +STACK CFI INIT 7d54d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d55b .cfa: $rsp 0 + +STACK CFI 7d55f .cfa: $rsp 128 + +STACK CFI 7d567 .cfa: $rsp -128 + +STACK CFI INIT 7d56c 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d576 .cfa: $rsp 0 + +STACK CFI 7d57a .cfa: $rsp 128 + +STACK CFI 7d582 .cfa: $rsp -128 + +STACK CFI INIT 7d587 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d595 .cfa: $rsp 0 + +STACK CFI 7d599 .cfa: $rsp 128 + +STACK CFI 7d5a1 .cfa: $rsp -128 + +STACK CFI INIT 7d5a6 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d5b0 .cfa: $rsp 0 + +STACK CFI 7d5b4 .cfa: $rsp 128 + +STACK CFI 7d5bc .cfa: $rsp -128 + +STACK CFI INIT 7d5c1 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d5cb .cfa: $rsp 0 + +STACK CFI 7d5cf .cfa: $rsp 128 + +STACK CFI 7d5d7 .cfa: $rsp -128 + +STACK CFI INIT 7d5dc 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d5ea .cfa: $rsp 0 + +STACK CFI 7d5ee .cfa: $rsp 128 + +STACK CFI 7d5f6 .cfa: $rsp -128 + +STACK CFI INIT 7d5fb 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d609 .cfa: $rsp 0 + +STACK CFI 7d60d .cfa: $rsp 128 + +STACK CFI 7d615 .cfa: $rsp -128 + +STACK CFI INIT 7d61a 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d624 .cfa: $rsp 0 + +STACK CFI 7d628 .cfa: $rsp 128 + +STACK CFI 7d630 .cfa: $rsp -128 + +STACK CFI INIT 7d635 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d63f .cfa: $rsp 0 + +STACK CFI 7d643 .cfa: $rsp 128 + +STACK CFI 7d64b .cfa: $rsp -128 + +STACK CFI INIT 7d650 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d65e .cfa: $rsp 0 + +STACK CFI 7d662 .cfa: $rsp 128 + +STACK CFI 7d66a .cfa: $rsp -128 + +STACK CFI INIT 7d66f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d67d .cfa: $rsp 0 + +STACK CFI 7d681 .cfa: $rsp 128 + +STACK CFI 7d689 .cfa: $rsp -128 + +STACK CFI INIT 7d68e 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d698 .cfa: $rsp 0 + +STACK CFI 7d69c .cfa: $rsp 128 + +STACK CFI 7d6a4 .cfa: $rsp -128 + +STACK CFI INIT 7d6a9 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d6b3 .cfa: $rsp 0 + +STACK CFI 7d6b7 .cfa: $rsp 128 + +STACK CFI 7d6bf .cfa: $rsp -128 + +STACK CFI INIT 7d6c4 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d6ce .cfa: $rsp 0 + +STACK CFI 7d6d2 .cfa: $rsp 128 + +STACK CFI 7d6da .cfa: $rsp -128 + +STACK CFI INIT 7d6df 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d6ea .cfa: $rsp 0 + +STACK CFI 7d6ee .cfa: $rsp 128 + +STACK CFI 7d6f6 .cfa: $rsp -128 + +STACK CFI INIT 7d6fb 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d706 .cfa: $rsp 0 + +STACK CFI 7d70a .cfa: $rsp 128 + +STACK CFI 7d712 .cfa: $rsp -128 + +STACK CFI INIT 7d717 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d725 .cfa: $rsp 0 + +STACK CFI 7d729 .cfa: $rsp 128 + +STACK CFI 7d731 .cfa: $rsp -128 + +STACK CFI INIT 7d736 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d744 .cfa: $rsp 0 + +STACK CFI 7d748 .cfa: $rsp 128 + +STACK CFI 7d750 .cfa: $rsp -128 + +STACK CFI INIT 7d755 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d763 .cfa: $rsp 0 + +STACK CFI 7d767 .cfa: $rsp 128 + +STACK CFI 7d76f .cfa: $rsp -128 + +STACK CFI INIT 7d774 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d77f .cfa: $rsp 0 + +STACK CFI 7d783 .cfa: $rsp 128 + +STACK CFI 7d78b .cfa: $rsp -128 + +STACK CFI INIT 7d790 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d79e .cfa: $rsp 0 + +STACK CFI 7d7a2 .cfa: $rsp 128 + +STACK CFI 7d7aa .cfa: $rsp -128 + +STACK CFI INIT 7d7af 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d7bd .cfa: $rsp 0 + +STACK CFI 7d7c1 .cfa: $rsp 128 + +STACK CFI 7d7c9 .cfa: $rsp -128 + +STACK CFI INIT 7d7ce 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d7dc .cfa: $rsp 0 + +STACK CFI 7d7e0 .cfa: $rsp 128 + +STACK CFI 7d7e8 .cfa: $rsp -128 + +STACK CFI INIT 7d7ed 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d7fb .cfa: $rsp 0 + +STACK CFI 7d7ff .cfa: $rsp 128 + +STACK CFI 7d807 .cfa: $rsp -128 + +STACK CFI INIT 7d80c 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d817 .cfa: $rsp 0 + +STACK CFI 7d81b .cfa: $rsp 128 + +STACK CFI 7d823 .cfa: $rsp -128 + +STACK CFI INIT 7d828 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d833 .cfa: $rsp 0 + +STACK CFI 7d837 .cfa: $rsp 128 + +STACK CFI 7d83f .cfa: $rsp -128 + +STACK CFI INIT 7d844 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d852 .cfa: $rsp 0 + +STACK CFI 7d856 .cfa: $rsp 128 + +STACK CFI 7d85e .cfa: $rsp -128 + +STACK CFI INIT 7d863 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d871 .cfa: $rsp 0 + +STACK CFI 7d875 .cfa: $rsp 128 + +STACK CFI 7d87d .cfa: $rsp -128 + +STACK CFI INIT 7d882 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d890 .cfa: $rsp 0 + +STACK CFI 7d894 .cfa: $rsp 128 + +STACK CFI 7d89c .cfa: $rsp -128 + +STACK CFI INIT 7d8a1 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d8ac .cfa: $rsp 0 + +STACK CFI 7d8b0 .cfa: $rsp 128 + +STACK CFI 7d8b8 .cfa: $rsp -128 + +STACK CFI INIT 7d8bd 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d8c7 .cfa: $rsp 0 + +STACK CFI 7d8cb .cfa: $rsp 128 + +STACK CFI 7d8d3 .cfa: $rsp -128 + +STACK CFI INIT 7d8d8 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d8e2 .cfa: $rsp 0 + +STACK CFI 7d8e6 .cfa: $rsp 128 + +STACK CFI 7d8ee .cfa: $rsp -128 + +STACK CFI INIT 7d8f3 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d8fd .cfa: $rsp 0 + +STACK CFI 7d901 .cfa: $rsp 128 + +STACK CFI 7d909 .cfa: $rsp -128 + +STACK CFI INIT 7d90e 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d918 .cfa: $rsp 0 + +STACK CFI 7d91c .cfa: $rsp 128 + +STACK CFI 7d924 .cfa: $rsp -128 + +STACK CFI INIT 7d929 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d933 .cfa: $rsp 0 + +STACK CFI 7d937 .cfa: $rsp 128 + +STACK CFI 7d93f .cfa: $rsp -128 + +STACK CFI INIT 7d944 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d94e .cfa: $rsp 0 + +STACK CFI 7d952 .cfa: $rsp 128 + +STACK CFI 7d95a .cfa: $rsp -128 + +STACK CFI INIT 7d95f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d96d .cfa: $rsp 0 + +STACK CFI 7d971 .cfa: $rsp 128 + +STACK CFI 7d979 .cfa: $rsp -128 + +STACK CFI INIT 7d97e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d98c .cfa: $rsp 0 + +STACK CFI 7d990 .cfa: $rsp 128 + +STACK CFI 7d998 .cfa: $rsp -128 + +STACK CFI INIT 7d99d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d9ab .cfa: $rsp 0 + +STACK CFI 7d9af .cfa: $rsp 128 + +STACK CFI 7d9b7 .cfa: $rsp -128 + +STACK CFI INIT 7d9bc 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7d9ca .cfa: $rsp 0 + +STACK CFI 7d9ce .cfa: $rsp 128 + +STACK CFI 7d9d6 .cfa: $rsp -128 + +STACK CFI INIT 76570 11b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 76577 .cfa: $rsp 16 + +STACK CFI 7657f $rbx: .cfa -16 + ^ +STACK CFI INIT 76690 b6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 76750 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 767d0 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 767e0 6b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 76850 9a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 768f0 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 76930 ca .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7693d $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI 76950 .cfa: $rsp 48 + +STACK CFI 76958 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 76a00 2b8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 76a0e .cfa: $rsp 48 + +STACK CFI 76a18 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 76cc0 e0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 76cc7 $rbp: .cfa -24 + ^ +STACK CFI 76cd7 .cfa: $rsp 64 + +STACK CFI 76cdd $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 76da0 169 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 76db8 .cfa: $rsp 48 + +STACK CFI 76dbf $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 76f10 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 76f14 .cfa: $rsp 48 + +STACK CFI INIT 76f90 463 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 76f92 .cfa: $rsp 16 + +STACK CFI 76f97 .cfa: $rsp 24 + +STACK CFI 76f99 .cfa: $rsp 32 + +STACK CFI 76f9b .cfa: $rsp 40 + +STACK CFI 76f9c .cfa: $rsp 48 + +STACK CFI 76f9d .cfa: $rsp 56 + +STACK CFI 76fa1 .cfa: $rsp 96 + +STACK CFI 76faf $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 77400 19a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 77401 .cfa: $rsp 16 + +STACK CFI 77403 $rbp: .cfa -16 + ^ +STACK CFI 77404 .cfa: $rsp 24 + +STACK CFI 77406 $rbx: .cfa -24 + ^ +STACK CFI 7740a .cfa: $rsp 32 + +STACK CFI INIT 775a0 3e3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 775a2 .cfa: $rsp 16 + +STACK CFI 775a4 .cfa: $rsp 24 + +STACK CFI 775a5 .cfa: $rsp 32 + +STACK CFI 775a6 .cfa: $rsp 40 + +STACK CFI 775aa .cfa: $rsp 96 + +STACK CFI 775b6 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 77990 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 779a0 10b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 779a1 .cfa: $rsp 16 + +STACK CFI 779a5 .cfa: $rsp 24 + +STACK CFI 779a9 .cfa: $rsp 48 + +STACK CFI 779b6 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 77ab0 87 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 77ab1 .cfa: $rsp 16 + +STACK CFI 77ab4 $rbx: .cfa -16 + ^ +STACK CFI 77ab8 .cfa: $rsp 64 + +STACK CFI INIT 77b40 513 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 77b4d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 77b65 .cfa: $rsp 64 + +STACK CFI 77b6f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 78060 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 78061 .cfa: $rsp 16 + +STACK CFI 78062 .cfa: $rsp 24 + +STACK CFI 78065 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 78069 .cfa: $rsp 32 + +STACK CFI INIT 78130 913 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 78132 .cfa: $rsp 16 + +STACK CFI 78134 .cfa: $rsp 24 + +STACK CFI 78136 .cfa: $rsp 32 + +STACK CFI 78138 .cfa: $rsp 40 + +STACK CFI 7813b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 7813c .cfa: $rsp 48 + +STACK CFI 7813d .cfa: $rsp 56 + +STACK CFI 78140 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 78144 .cfa: $rsp 112 + +STACK CFI INIT 78a50 b9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 78a54 .cfa: $rsp 16 + +STACK CFI 78a56 $rbx: .cfa -16 + ^ +STACK CFI INIT 78b10 ea .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 78b14 .cfa: $rsp 16 + +STACK CFI 78b17 $rbx: .cfa -16 + ^ +STACK CFI INIT 78c00 2be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 78c02 .cfa: $rsp 16 + +STACK CFI 78c04 .cfa: $rsp 24 + +STACK CFI 78c06 .cfa: $rsp 32 + +STACK CFI 78c08 .cfa: $rsp 40 + +STACK CFI 78c09 .cfa: $rsp 48 + +STACK CFI 78c0a .cfa: $rsp 56 + +STACK CFI 78c0e .cfa: $rsp 112 + +STACK CFI 78c20 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 78ec0 1d5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 78ecd $r12: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI 78ee1 $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ .cfa: $rsp 48 + +STACK CFI INIT 790a0 299 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 790a4 .cfa: $rsp 16 + +STACK CFI 790aa $rbx: .cfa -16 + ^ +STACK CFI INIT 79340 13ef .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 79342 .cfa: $rsp 16 + +STACK CFI 79344 .cfa: $rsp 24 + +STACK CFI 79346 .cfa: $rsp 32 + +STACK CFI 79348 .cfa: $rsp 40 + +STACK CFI 79349 .cfa: $rsp 48 + +STACK CFI 7934c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI 7934d .cfa: $rsp 56 + +STACK CFI 79351 .cfa: $rsp 144 + +STACK CFI 79360 $rbx: .cfa -56 + ^ +STACK CFI INIT 7a730 9a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7a735 .cfa: $rsp 16 + +STACK CFI 7a738 $rbx: .cfa -16 + ^ +STACK CFI INIT 7a7d0 29b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7a7dd $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI 7a7f8 .cfa: $rsp 64 + +STACK CFI 7a802 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 7aa70 123 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7aa7d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 7aa86 .cfa: $rsp 32 + +STACK CFI 7aa93 $r12: .cfa -16 + ^ +STACK CFI INIT 7aba0 3e7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7aba2 .cfa: $rsp 16 + +STACK CFI 7aba5 $r15: .cfa -16 + ^ +STACK CFI 7abae .cfa: $rsp 24 + +STACK CFI 7abb1 $r14: .cfa -24 + ^ +STACK CFI 7abb3 .cfa: $rsp 32 + +STACK CFI 7abb5 .cfa: $rsp 40 + +STACK CFI 7abb6 .cfa: $rsp 48 + +STACK CFI 7abb7 .cfa: $rsp 56 + +STACK CFI 7abbe .cfa: $rsp 4480 + +STACK CFI 7abcf $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 7af90 11f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7af92 .cfa: $rsp 16 + +STACK CFI 7af98 .cfa: $rsp 24 + +STACK CFI 7af99 .cfa: $rsp 32 + +STACK CFI 7af9d .cfa: $rsp 144 + +STACK CFI 7afa5 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 7b0b0 453 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7b0c0 $r13: .cfa -32 + ^ +STACK CFI 7b0e0 .cfa: $rsp 64 + +STACK CFI 7b0ed $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 7b510 2a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7b51d $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 7b535 .cfa: $rsp 64 + +STACK CFI 7b543 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 7b7c0 273 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7b7cd $r12: .cfa -32 + ^ $rbx: .cfa -48 + ^ +STACK CFI 7b7e0 .cfa: $rsp 48 + +STACK CFI 7b7f0 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI INIT 7ba40 d3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7ba48 .cfa: $rsp 16 + +STACK CFI 7ba54 $rbx: .cfa -16 + ^ +STACK CFI INIT 7bb20 257 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7bb2d $r12: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI 7bb3b .cfa: $rsp 48 + +STACK CFI 7bb4e $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT 7bd80 b9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7bd88 .cfa: $rsp 16 + +STACK CFI 7bd8b $rbx: .cfa -16 + ^ +STACK CFI INIT 7be40 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7be48 .cfa: $rsp 16 + +STACK CFI 7be4b $rbx: .cfa -16 + ^ +STACK CFI INIT 7be60 1c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7be61 .cfa: $rsp 16 + +STACK CFI 7be66 $rbx: .cfa -16 + ^ +STACK CFI INIT 7c030 29f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7c03d $r12: .cfa -32 + ^ $rbx: .cfa -48 + ^ +STACK CFI 7c053 .cfa: $rsp 48 + +STACK CFI 7c066 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI INIT 7c2d0 40 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7c2de .cfa: $rsp 32 + +STACK CFI 7c2e8 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 7c310 63 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7c311 .cfa: $rsp 16 + +STACK CFI 7c314 $rbx: .cfa -16 + ^ +STACK CFI INIT 7c380 1ba .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7c382 .cfa: $rsp 16 + +STACK CFI 7c384 .cfa: $rsp 24 + +STACK CFI 7c386 .cfa: $rsp 32 + +STACK CFI 7c388 .cfa: $rsp 40 + +STACK CFI 7c389 .cfa: $rsp 48 + +STACK CFI 7c38a .cfa: $rsp 56 + +STACK CFI 7c38e .cfa: $rsp 144 + +STACK CFI 7c39c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 7c540 471 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7c54d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 7c55a $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 7c568 .cfa: $rsp 64 + +STACK CFI 7c57c $r12: .cfa -40 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 7c9c0 1a4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7c9cd $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 7c9da $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI 7c9e8 .cfa: $rsp 64 + +STACK CFI 7c9f3 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI INIT 7cb70 340 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7cb7d $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 7cb98 .cfa: $rsp 64 + +STACK CFI 7cbab $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 7ceb0 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7cebe .cfa: $rsp 32 + +STACK CFI 7cec8 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 7cf00 2b4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7cf0d $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI 7cf28 .cfa: $rsp 112 + +STACK CFI 7cf32 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI INIT 7d9e0 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7d9e4 .cfa: $rsp 16 + +STACK CFI INIT 7da00 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7da04 .cfa: $rsp 32 + +STACK CFI INIT 7da90 3d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7da91 .cfa: $rsp 16 + +STACK CFI 7da98 $rbx: .cfa -16 + ^ +STACK CFI INIT 7dad0 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7daf0 d6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7daf4 .cfa: $rsp 16 + +STACK CFI INIT 7dbd0 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7dbd4 .cfa: $rsp 16 + +STACK CFI INIT 7dbf0 116 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7dbf1 .cfa: $rsp 16 + +STACK CFI 7dbf4 $rbp: .cfa -16 + ^ +STACK CFI 7dbf5 .cfa: $rsp 24 + +STACK CFI 7dbf9 .cfa: $rsp 48 + +STACK CFI 7dc09 $rbx: .cfa -24 + ^ +STACK CFI INIT 7dd10 12c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7dd1d $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI 7dd26 .cfa: $rsp 32 + +STACK CFI 7dd37 $rbp: .cfa -24 + ^ +STACK CFI INIT 7de40 28f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7de4d $r13: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI 7de5a $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI 7de68 .cfa: $rsp 80 + +STACK CFI 7de74 $r12: .cfa -40 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 7e0d0 14f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e0dd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 7e0e6 .cfa: $rsp 48 + +STACK CFI 7e0f4 $r12: .cfa -16 + ^ +STACK CFI INIT 7e220 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e224 .cfa: $rsp 16 + +STACK CFI INIT 7ebb0 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7ebbe .cfa: $rsp 0 + +STACK CFI 7ebc2 .cfa: $rsp 128 + +STACK CFI 7ebca .cfa: $rsp -128 + +STACK CFI INIT 7ebcf 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7ebdd .cfa: $rsp 0 + +STACK CFI 7ebe1 .cfa: $rsp 128 + +STACK CFI 7ebe9 .cfa: $rsp -128 + +STACK CFI INIT 7ebee 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7ebfc .cfa: $rsp 0 + +STACK CFI 7ec00 .cfa: $rsp 128 + +STACK CFI 7ec08 .cfa: $rsp -128 + +STACK CFI INIT 7ec0d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7ec1b .cfa: $rsp 0 + +STACK CFI 7ec1f .cfa: $rsp 128 + +STACK CFI 7ec27 .cfa: $rsp -128 + +STACK CFI INIT 7ec2c 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7ec3a .cfa: $rsp 0 + +STACK CFI 7ec3e .cfa: $rsp 128 + +STACK CFI 7ec46 .cfa: $rsp -128 + +STACK CFI INIT 7ec4b 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7ec59 .cfa: $rsp 0 + +STACK CFI 7ec5d .cfa: $rsp 128 + +STACK CFI 7ec65 .cfa: $rsp -128 + +STACK CFI INIT 7ec6a 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7ec78 .cfa: $rsp 0 + +STACK CFI 7ec7c .cfa: $rsp 128 + +STACK CFI 7ec84 .cfa: $rsp -128 + +STACK CFI INIT 7ec89 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7ec97 .cfa: $rsp 0 + +STACK CFI 7ec9b .cfa: $rsp 128 + +STACK CFI 7eca3 .cfa: $rsp -128 + +STACK CFI INIT 7eca8 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7ecb6 .cfa: $rsp 0 + +STACK CFI 7ecba .cfa: $rsp 128 + +STACK CFI 7ecc2 .cfa: $rsp -128 + +STACK CFI INIT 7ecc7 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 7ecd5 .cfa: $rsp 0 + +STACK CFI 7ecd9 .cfa: $rsp 128 + +STACK CFI 7ece1 .cfa: $rsp -128 + +STACK CFI INIT 7e2f0 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7e300 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e304 .cfa: $rsp 16 + +STACK CFI INIT 7e390 1aa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e39e .cfa: $rsp 32 + +STACK CFI 7e3a8 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 136360 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7e540 12c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e541 .cfa: $rsp 16 + +STACK CFI 7e544 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 7e54f $r12: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 7e560 $r13: .cfa -24 + ^ +STACK CFI INIT 7e670 123 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e67d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 7e692 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 7e696 .cfa: $rsp 48 + +STACK CFI INIT 7e7a0 ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e7ad $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ +STACK CFI 7e7be .cfa: $rsp 48 + +STACK CFI 7e7f9 $r13: .cfa -16 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 7e890 142 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e89d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 7e8ab .cfa: $rsp 48 + +STACK CFI 7e8b7 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 7e9e0 1d0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e9ed $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 7e9fa $r13: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI 7ea0b .cfa: $rsp 80 + +STACK CFI 7ea4d $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 7ecf0 bd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7ecfd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 7ed06 .cfa: $rsp 48 + +STACK CFI 7ed15 $r12: .cfa -16 + ^ +STACK CFI INIT 7edb0 b5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7edb2 .cfa: $rsp 16 + +STACK CFI 7edb8 $r12: .cfa -16 + ^ +STACK CFI 7edb9 .cfa: $rsp 24 + +STACK CFI 7edc0 $rbp: .cfa -24 + ^ +STACK CFI 7edc1 .cfa: $rsp 32 + +STACK CFI 7edc4 $rbx: .cfa -32 + ^ +STACK CFI 7edcd .cfa: $rsp 48 + +STACK CFI INIT 7ee70 182 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7ee72 .cfa: $rsp 16 + +STACK CFI 7ee77 .cfa: $rsp 24 + +STACK CFI 7ee78 .cfa: $rsp 32 + +STACK CFI 7ee79 .cfa: $rsp 40 + +STACK CFI 7ee7c $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 7ee80 .cfa: $rsp 64 + +STACK CFI INIT 7f000 36 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7f040 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7f060 3d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7f072 .cfa: $rsp 16 + +STACK CFI INIT 7f0a0 7d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7f0a2 .cfa: $rsp 16 + +STACK CFI 7f0a5 $r12: .cfa -16 + ^ +STACK CFI 7f0a6 .cfa: $rsp 24 + +STACK CFI 7f0a7 .cfa: $rsp 32 + +STACK CFI 7f0ae $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 136380 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136381 .cfa: $rsp 16 + +STACK CFI 136389 .cfa: $rsp 24 + +STACK CFI 13638d .cfa: $rsp 32 + +STACK CFI 136398 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 136990 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136991 .cfa: $rsp 16 + +STACK CFI 136998 $rbp: .cfa -16 + ^ +STACK CFI 136999 .cfa: $rsp 24 + +STACK CFI 1369a0 $rbx: .cfa -24 + ^ +STACK CFI 1369a4 .cfa: $rsp 32 + +STACK CFI INIT 7f120 1bc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7f2e0 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 112020 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7f310 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7f390 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1120d0 e99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 7f3d0 1439 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 80810 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 80820 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 119ca0 a0f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 80850 dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 80930 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 80960 97 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8096d .cfa: $rsp 264 + +STACK CFI 809f3 .cfa: $rsp 8 + +STACK CFI INIT 80a00 118 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 80b20 57 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 80b2e .cfa: $rsp 32 + +STACK CFI 80b31 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 80b80 61 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 80b8e .cfa: $rsp 32 + +STACK CFI 80b91 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 80bf0 b9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 80c07 .cfa: $rsp 32 + +STACK CFI 80c09 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 80cb0 11a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 80cbd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 80cd8 .cfa: $rsp 96 + +STACK CFI 80cdc $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 80dd0 3d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 80e10 dd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 80ef0 6d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 80f60 99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 81000 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 112f70 11b9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 81040 1849 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 82890 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11a6c0 f6b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 828c0 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 114130 19a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 828f0 9f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 82990 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 829c0 9c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 829cd .cfa: $rsp 264 + +STACK CFI 82a53 .cfa: $rsp 8 + +STACK CFI INIT 82a60 55 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 82a64 .cfa: $rsp 16 + +STACK CFI INIT 82ac0 20a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 82acc $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 82ad5 .cfa: $rsp 32 + +STACK CFI 82ae3 $r12: .cfa -16 + ^ +STACK CFI INIT 82cd0 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 82cd4 .cfa: $rsp 16 + +STACK CFI INIT 82d20 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 82d50 97 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 82d5d .cfa: $rsp 264 + +STACK CFI 82de3 .cfa: $rsp 8 + +STACK CFI INIT 1142d0 675 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1142d2 .cfa: $rsp 16 + +STACK CFI 1142da .cfa: $rsp 24 + +STACK CFI 1142dc .cfa: $rsp 32 + +STACK CFI 1142e0 .cfa: $rsp 40 + +STACK CFI 1142e1 .cfa: $rsp 48 + +STACK CFI 1142e2 .cfa: $rsp 56 + +STACK CFI 1142e8 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 82df0 f1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 82dfa .cfa: $rsp 264 + +STACK CFI 82ed5 .cfa: $rsp 8 + +STACK CFI INIT 82ef0 eb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 82efa .cfa: $rsp 264 + +STACK CFI 82fd3 .cfa: $rsp 8 + +STACK CFI INIT 82fe0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 82ff0 75 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 83070 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 830a0 400 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 834a0 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 834a4 .cfa: $rsp 16 + +STACK CFI INIT 834f0 197 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 834f2 .cfa: $rsp 16 + +STACK CFI 834fa .cfa: $rsp 24 + +STACK CFI 83500 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 83502 .cfa: $rsp 32 + +STACK CFI 83505 $r12: .cfa -32 + ^ +STACK CFI 83506 .cfa: $rsp 40 + +STACK CFI 83507 .cfa: $rsp 48 + +STACK CFI 8350a $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 83690 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 836c0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 836d0 b10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 841e0 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 84220 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 84230 452 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 843c4 $r14: .cfa -16 + ^ +STACK CFI 843c9 $r13: .cfa -24 + ^ +STACK CFI 843ce $r12: .cfa -32 + ^ +STACK CFI 843d3 $rbx: .cfa -40 + ^ +STACK CFI 8455b $rbx: $rbx +STACK CFI 84560 $r12: $r12 +STACK CFI 84565 $r13: $r13 +STACK CFI 8456a $r14: $r14 +STACK CFI 845a2 $r14: .cfa -16 + ^ +STACK CFI 845a7 $r13: .cfa -24 + ^ +STACK CFI 845ac $r12: .cfa -32 + ^ +STACK CFI 8466b $r12: $r12 +STACK CFI 84670 $r13: $r13 +STACK CFI 84675 $r14: $r14 +STACK CFI INIT 84690 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 846a0 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 846c9 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 846d3 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 846e0 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 846f0 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 84710 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11b640 b03 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 84740 dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 84820 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11c160 10d6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 84850 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 84890 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 114950 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 114960 1c86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 848d0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 848e0 2226 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 86b10 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 86b50 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1165f0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 116600 2096 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 86b90 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 86ba0 2636 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 891e0 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 89220 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 89260 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 89270 465 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 89414 $r14: .cfa -24 + ^ +STACK CFI 89419 $r13: .cfa -32 + ^ +STACK CFI 8941e $r12: .cfa -40 + ^ +STACK CFI 89423 $rbx: .cfa -48 + ^ +STACK CFI 895ab $rbx: $rbx +STACK CFI 895b0 $r12: $r12 +STACK CFI 895b5 $r13: $r13 +STACK CFI 895ba $r14: $r14 +STACK CFI 895f2 $r14: .cfa -24 + ^ +STACK CFI 895f7 $r13: .cfa -32 + ^ +STACK CFI 895fc $r12: .cfa -40 + ^ +STACK CFI 896bb $r12: $r12 +STACK CFI 896c0 $r13: $r13 +STACK CFI 896c5 $r14: $r14 +STACK CFI INIT 896e0 135 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 89820 126 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 89827 .cfa: $rsp 16 + +STACK CFI 8983c .cfa: $rsp 24 + +STACK CFI 89849 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 89950 18b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 89ae0 17b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 89b1b $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 89c60 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 89c6e .cfa: $rsp 32 + +STACK CFI 89c71 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1186a0 89b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1186a2 .cfa: $rsp 16 + +STACK CFI 1186aa .cfa: $rsp 24 + +STACK CFI 1186ac .cfa: $rsp 32 + +STACK CFI 1186b0 .cfa: $rsp 40 + +STACK CFI 1186b1 .cfa: $rsp 48 + +STACK CFI 1186b2 .cfa: $rsp 56 + +STACK CFI 1186b8 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 89cf0 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 89d30 dd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 89d32 .cfa: $rsp 16 + +STACK CFI 89d34 .cfa: $rsp 24 + +STACK CFI 89d36 .cfa: $rsp 32 + +STACK CFI 89d37 .cfa: $rsp 40 + +STACK CFI 89d38 .cfa: $rsp 48 + +STACK CFI 89d3b $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 89d3f .cfa: $rsp 64 + +STACK CFI INIT 89e10 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 89e30 f9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 89e31 .cfa: $rsp 16 + +STACK CFI 89e42 .cfa: $rsp 24 + +STACK CFI 89e47 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 89f30 341 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 89f32 .cfa: $rsp 16 + +STACK CFI 89f35 $r15: .cfa -16 + ^ +STACK CFI 89f3a .cfa: $rsp 24 + +STACK CFI 89f3c .cfa: $rsp 32 + +STACK CFI 89f3e .cfa: $rsp 40 + +STACK CFI 89f41 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 89f42 .cfa: $rsp 48 + +STACK CFI 89f45 $rbp: .cfa -48 + ^ +STACK CFI 89f49 .cfa: $rsp 56 + +STACK CFI 89f4c $rbx: .cfa -56 + ^ +STACK CFI 89f53 .cfa: $rsp 2176 + +STACK CFI INIT 8a280 335 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8a28d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 8a29a $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 8a2a8 .cfa: $rsp 128 + +STACK CFI 8a2b6 $r12: .cfa -40 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 8a5c0 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 118f40 53 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8a5f0 4c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8a640 6f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8a6b0 89 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8a6bd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 8a6d7 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 8a6db .cfa: $rsp 64 + +STACK CFI INIT 8a740 48 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8a74d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 8a759 .cfa: $rsp 32 + +STACK CFI 8a75f $r12: .cfa -16 + ^ +STACK CFI INIT 8a790 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8a792 .cfa: $rsp 16 + +STACK CFI 8a795 $r12: .cfa -16 + ^ +STACK CFI 8a799 .cfa: $rsp 24 + +STACK CFI 8a79c $rbp: .cfa -24 + ^ +STACK CFI 8a79d .cfa: $rsp 32 + +STACK CFI 8a7a0 $rbx: .cfa -32 + ^ +STACK CFI INIT 8a7d0 8f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8a7d2 .cfa: $rsp 16 + +STACK CFI 8a7d4 .cfa: $rsp 24 + +STACK CFI 8a7d7 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 8a7d9 .cfa: $rsp 32 + +STACK CFI 8a7dc $r12: .cfa -32 + ^ +STACK CFI 8a7dd .cfa: $rsp 40 + +STACK CFI 8a7de .cfa: $rsp 48 + +STACK CFI 8a7e1 $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 8a860 103 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8a86d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 8a882 .cfa: $rsp 48 + +STACK CFI 8a885 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 8a970 41 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8a974 .cfa: $rsp 16 + +STACK CFI 8a979 $rbx: .cfa -16 + ^ +STACK CFI INIT 8a9c0 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8a9cd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 8a9d6 .cfa: $rsp 32 + +STACK CFI 8a9dc $r12: .cfa -16 + ^ +STACK CFI INIT 8aa50 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8aa52 .cfa: $rsp 16 + +STACK CFI 8aa58 $r12: .cfa -16 + ^ +STACK CFI 8aa59 .cfa: $rsp 24 + +STACK CFI 8aa5c $rbp: .cfa -24 + ^ +STACK CFI 8aa5d .cfa: $rsp 32 + +STACK CFI 8aa60 $rbx: .cfa -32 + ^ +STACK CFI INIT 8aaa0 162 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8aaad $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 8aac8 .cfa: $rsp 96 + +STACK CFI 8aace $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 8ac10 43 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8ac12 .cfa: $rsp 16 + +STACK CFI 8ac18 $r12: .cfa -16 + ^ +STACK CFI 8ac19 .cfa: $rsp 24 + +STACK CFI 8ac1c $rbp: .cfa -24 + ^ +STACK CFI 8ac1d .cfa: $rsp 32 + +STACK CFI 8ac20 $rbx: .cfa -32 + ^ +STACK CFI INIT 8ac60 d6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8ac6d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 8ac83 .cfa: $rsp 48 + +STACK CFI 8ac89 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 8ad40 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8ad4d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 8ad67 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 8ad6b .cfa: $rsp 64 + +STACK CFI INIT 8adf0 322 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8adf2 .cfa: $rsp 16 + +STACK CFI 8adf4 .cfa: $rsp 24 + +STACK CFI 8adf6 .cfa: $rsp 32 + +STACK CFI 8adf8 .cfa: $rsp 40 + +STACK CFI 8adf9 .cfa: $rsp 48 + +STACK CFI 8adfa .cfa: $rsp 56 + +STACK CFI 8adfd $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 8ae04 .cfa: $rsp 192 + +STACK CFI INIT 8b120 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8b121 .cfa: $rsp 16 + +STACK CFI 8b129 $rbx: .cfa -16 + ^ +STACK CFI INIT 8b140 e91 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8b141 .cfa: $rsp 16 + +STACK CFI 8b144 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 8b149 $r15: .cfa -24 + ^ +STACK CFI 8b153 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 8bfe0 66 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8c050 ad3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8c051 .cfa: $rsp 16 + +STACK CFI 8c054 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 8c05f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 8c063 $rbx: .cfa -56 + ^ +STACK CFI INIT 8cb30 c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8cb31 .cfa: $rsp 16 + +STACK CFI 8cb35 .cfa: $rsp 24 + +STACK CFI 8cb44 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 8cc00 9e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8cca0 9f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8cd40 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8cd80 45 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8cdd0 4d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8ce20 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8ce40 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8ce60 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8ce90 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8cee0 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8cf40 65 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8cfb0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8d020 6c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8d090 4b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8d09e .cfa: $rsp 32 + +STACK CFI 8d0a1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 8d0e0 111 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8d200 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8d20d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 8d216 .cfa: $rsp 32 + +STACK CFI 8d21d $r12: .cfa -16 + ^ +STACK CFI INIT 1369d0 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1369d4 .cfa: $rsp 16 + +STACK CFI INIT 8d290 4d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8d29e .cfa: $rsp 32 + +STACK CFI 8d2a1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 8d2e0 cf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8d2ed $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI 8d2f6 .cfa: $rsp 48 + +STACK CFI 8d2fa $rbp: .cfa -24 + ^ +STACK CFI INIT 8d3b0 91 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8d450 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8d490 71 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8d492 .cfa: $rsp 16 + +STACK CFI 8d496 .cfa: $rsp 24 + +STACK CFI 8d499 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 8d49b .cfa: $rsp 32 + +STACK CFI 8d49e $r12: .cfa -32 + ^ +STACK CFI 8d49f .cfa: $rsp 40 + +STACK CFI 8d4a0 .cfa: $rsp 48 + +STACK CFI 8d4a3 $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 8d510 af .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8d512 .cfa: $rsp 16 + +STACK CFI 8d517 $r15: .cfa -16 + ^ +STACK CFI 8d519 .cfa: $rsp 24 + +STACK CFI 8d51b .cfa: $rsp 32 + +STACK CFI 8d51e $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 8d520 .cfa: $rsp 40 + +STACK CFI 8d523 $r12: .cfa -40 + ^ +STACK CFI 8d524 .cfa: $rsp 48 + +STACK CFI 8d527 $rbp: .cfa -48 + ^ +STACK CFI 8d528 .cfa: $rsp 56 + +STACK CFI 8d52b $rbx: .cfa -56 + ^ +STACK CFI 8d52f .cfa: $rsp 80 + +STACK CFI INIT 8d5c0 4f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8d5cd $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 8d5d1 .cfa: $rsp 32 + +STACK CFI INIT 8d610 120 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8d61d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 8d62a $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ +STACK CFI 8d638 .cfa: $rsp 96 + +STACK CFI 8d63e $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 8d730 d4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8d810 c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11d240 1259 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11e4a0 1759 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 118fa0 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 134290 163e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11fc00 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11fc10 29b6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1225d0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1225e0 29b6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 124fa0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 124fb0 2b67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 127b20 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 127b30 2ab6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 12a5f0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 12a600 2ab6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 12d0c0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 12d0d0 2b06 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 118fe0 87c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 118fe2 .cfa: $rsp 16 + +STACK CFI 118fe6 .cfa: $rsp 24 + +STACK CFI 118fe8 .cfa: $rsp 32 + +STACK CFI 118fea .cfa: $rsp 40 + +STACK CFI 118feb .cfa: $rsp 48 + +STACK CFI 118fec .cfa: $rsp 56 + +STACK CFI 118ff0 .cfa: $rsp 152 + +STACK CFI 119000 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 12fbe0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 12fbf0 2136 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 131d30 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 131d40 2546 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 119860 9a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1358d0 2fc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8d8e0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8d8f0 550 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 119900 14c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 119a50 117 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 119b70 115 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8de40 f9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8de41 .cfa: $rsp 16 + +STACK CFI 8de52 .cfa: $rsp 24 + +STACK CFI 8de57 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 8df40 37 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8df44 .cfa: $rsp 16 + +STACK CFI INIT 8df80 3f2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8df82 .cfa: $rsp 16 + +STACK CFI 8df84 .cfa: $rsp 24 + +STACK CFI 8df86 .cfa: $rsp 32 + +STACK CFI 8df89 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 8df8b .cfa: $rsp 40 + +STACK CFI 8df8e $r12: .cfa -40 + ^ +STACK CFI 8df92 .cfa: $rsp 48 + +STACK CFI 8df95 $rbp: .cfa -48 + ^ +STACK CFI 8df99 .cfa: $rsp 56 + +STACK CFI 8df9c $rbx: .cfa -56 + ^ +STACK CFI 8dfa3 .cfa: $rsp 2208 + +STACK CFI INIT 8e380 3fe .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8e382 .cfa: $rsp 16 + +STACK CFI 8e384 .cfa: $rsp 24 + +STACK CFI 8e386 .cfa: $rsp 32 + +STACK CFI 8e388 .cfa: $rsp 40 + +STACK CFI 8e38b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 8e38c .cfa: $rsp 48 + +STACK CFI 8e38d .cfa: $rsp 56 + +STACK CFI 8e390 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 8e394 .cfa: $rsp 144 + +STACK CFI INIT 8e780 37 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8e784 .cfa: $rsp 16 + +STACK CFI INIT 8e7c0 335 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8e7c2 .cfa: $rsp 16 + +STACK CFI 8e7d4 .cfa: $rsp 24 + +STACK CFI 8e7d6 .cfa: $rsp 32 + +STACK CFI 8e7dc $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 8e7de .cfa: $rsp 40 + +STACK CFI 8e7df .cfa: $rsp 48 + +STACK CFI 8e7e0 .cfa: $rsp 56 + +STACK CFI 8e7f7 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 8eb00 88f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8eb02 .cfa: $rsp 16 + +STACK CFI 8eb04 .cfa: $rsp 24 + +STACK CFI 8eb06 .cfa: $rsp 32 + +STACK CFI 8eb08 .cfa: $rsp 40 + +STACK CFI 8eb0b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 8eb0c .cfa: $rsp 48 + +STACK CFI 8eb0f $rbp: .cfa -48 + ^ +STACK CFI 8eb13 .cfa: $rsp 56 + +STACK CFI 8eb16 $rbx: .cfa -56 + ^ +STACK CFI 8eb1d .cfa: $rsp 2208 + +STACK CFI INIT 8f390 7d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8f392 .cfa: $rsp 16 + +STACK CFI 8f394 .cfa: $rsp 24 + +STACK CFI 8f397 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 8f399 .cfa: $rsp 32 + +STACK CFI 8f39b .cfa: $rsp 40 + +STACK CFI 8f39c .cfa: $rsp 48 + +STACK CFI 8f39f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI 8f3a0 .cfa: $rsp 56 + +STACK CFI 8f3a4 .cfa: $rsp 160 + +STACK CFI 8f3ad $rbx: .cfa -56 + ^ +STACK CFI INIT 8fb70 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8fb80 1b2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8fb81 .cfa: $rsp 16 + +STACK CFI 8fb86 $rbx: .cfa -16 + ^ +STACK CFI INIT 8fd40 292 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8fd42 .cfa: $rsp 16 + +STACK CFI 8fd45 $r15: .cfa -16 + ^ +STACK CFI 8fd47 .cfa: $rsp 24 + +STACK CFI 8fd4a $r14: .cfa -24 + ^ +STACK CFI 8fd4c .cfa: $rsp 32 + +STACK CFI 8fd4f $r13: .cfa -32 + ^ +STACK CFI 8fd51 .cfa: $rsp 40 + +STACK CFI 8fd52 .cfa: $rsp 48 + +STACK CFI 8fd53 .cfa: $rsp 56 + +STACK CFI 8fd55 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 8fd59 .cfa: $rsp 80 + +STACK CFI INIT 8ffe0 f7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8ffe2 .cfa: $rsp 16 + +STACK CFI 8ffe6 .cfa: $rsp 24 + +STACK CFI 8ffe8 .cfa: $rsp 32 + +STACK CFI 8ffea .cfa: $rsp 40 + +STACK CFI 8ffeb .cfa: $rsp 48 + +STACK CFI 8ffed $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI 8ffee .cfa: $rsp 56 + +STACK CFI 8fff2 .cfa: $rsp 96 + +STACK CFI 8fffb $rbx: .cfa -56 + ^ +STACK CFI INIT 900e0 2f6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 900f3 .cfa: $rsp 32 + +STACK CFI 900fd $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 903e0 5f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 903e4 .cfa: $rsp 32 + +STACK CFI INIT 90440 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90480 43 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 904d0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 904e0 66 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90550 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90590 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 905b0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 905e0 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90610 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 90612 .cfa: $rsp 16 + +STACK CFI 90615 $r12: .cfa -16 + ^ +STACK CFI 90616 .cfa: $rsp 24 + +STACK CFI 90619 $rbp: .cfa -24 + ^ +STACK CFI 9061a .cfa: $rsp 32 + +STACK CFI 9061e $rbx: .cfa -32 + ^ +STACK CFI INIT 90650 5f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9065e .cfa: $rsp 32 + +STACK CFI 90661 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 906b0 68 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90720 8c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 907b0 b1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90870 d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90950 4c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 90951 .cfa: $rsp 16 + +STACK CFI 90954 $rbp: .cfa -16 + ^ +STACK CFI 90955 .cfa: $rsp 24 + +STACK CFI 90958 $rbx: .cfa -24 + ^ +STACK CFI 9095c .cfa: $rsp 32 + +STACK CFI INIT 909a0 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 909c0 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90a20 ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 90a2d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 90a36 .cfa: $rsp 32 + +STACK CFI 90a3f $r12: .cfa -16 + ^ +STACK CFI INIT 90ad0 10b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 90ae0 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 90be0 7b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90c60 d5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90d40 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90d50 23 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90d80 d3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90e60 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 90e70 1b1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 90e78 $r13: .cfa -16 + ^ +STACK CFI 90e95 .cfa: $rsp 144 + +STACK CFI 90ea3 $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 91030 18d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9103d $r13: .cfa -24 + ^ $rbx: .cfa -48 + ^ +STACK CFI 91053 .cfa: $rsp 176 + +STACK CFI 9105c $r12: .cfa -32 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI INIT 911c0 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 911e0 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 91200 265 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 91211 $r13: .cfa -24 + ^ $rbx: .cfa -48 + ^ +STACK CFI 9122a .cfa: $rsp 176 + +STACK CFI 91249 $r12: .cfa -32 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI INIT 91470 220 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 91471 .cfa: $rsp 16 + +STACK CFI 91474 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 9147c $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 91690 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 916b0 34b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 916b2 .cfa: $rsp 16 + +STACK CFI 916bb .cfa: $rsp 24 + +STACK CFI 916be $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 916c0 .cfa: $rsp 32 + +STACK CFI 916c3 $r13: .cfa -32 + ^ +STACK CFI 916c5 .cfa: $rsp 40 + +STACK CFI 916c6 .cfa: $rsp 48 + +STACK CFI 916c9 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 916ca .cfa: $rsp 56 + +STACK CFI 916d1 .cfa: $rsp 464 + +STACK CFI 9171b $rbx: .cfa -56 + ^ +STACK CFI INIT 91a00 373 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 91a1e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 91a2f .cfa: $rsp 448 + +STACK CFI 91a44 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 91d80 362 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 91d9e $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 91daf .cfa: $rsp 464 + +STACK CFI 91dc4 $r12: .cfa -40 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 920f0 99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 92190 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 921c0 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 921e0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 921f0 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 92210 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 92220 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 92240 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 92250 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 92270 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 92280 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 922a0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 922b0 458 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 922b2 .cfa: $rsp 16 + +STACK CFI 922b4 .cfa: $rsp 24 + +STACK CFI 922b6 .cfa: $rsp 32 + +STACK CFI 922b8 .cfa: $rsp 40 + +STACK CFI 922bb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 922bc .cfa: $rsp 48 + +STACK CFI 922be $rbp: .cfa -48 + ^ +STACK CFI 922bf .cfa: $rsp 56 + +STACK CFI 922c3 .cfa: $rsp 144 + +STACK CFI 922d9 $rbx: .cfa -56 + ^ +STACK CFI INIT 92710 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 92720 417 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 92722 .cfa: $rsp 16 + +STACK CFI 92724 .cfa: $rsp 24 + +STACK CFI 92726 .cfa: $rsp 32 + +STACK CFI 92728 .cfa: $rsp 40 + +STACK CFI 9272b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 9272c .cfa: $rsp 48 + +STACK CFI 9272e $rbp: .cfa -48 + ^ +STACK CFI 9272f .cfa: $rsp 56 + +STACK CFI 92733 .cfa: $rsp 144 + +STACK CFI 92749 $rbx: .cfa -56 + ^ +STACK CFI INIT 92b40 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 92b50 27f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 92b52 .cfa: $rsp 16 + +STACK CFI 92b55 $r15: .cfa -16 + ^ +STACK CFI 92b57 .cfa: $rsp 24 + +STACK CFI 92b59 .cfa: $rsp 32 + +STACK CFI 92b5c $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 92b5e .cfa: $rsp 40 + +STACK CFI 92b61 $r12: .cfa -40 + ^ +STACK CFI 92b62 .cfa: $rsp 48 + +STACK CFI 92b64 $rbp: .cfa -48 + ^ +STACK CFI 92b65 .cfa: $rsp 56 + +STACK CFI 92b68 $rbx: .cfa -56 + ^ +STACK CFI 92b6c .cfa: $rsp 80 + +STACK CFI INIT 92dd0 1fd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 92ddc $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 92dea .cfa: $rsp 64 + +STACK CFI 92df7 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 92fd0 1fc4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 92fd2 .cfa: $rsp 16 + +STACK CFI 92fd5 $r15: .cfa -16 + ^ +STACK CFI 92fd7 .cfa: $rsp 24 + +STACK CFI 92fd9 .cfa: $rsp 32 + +STACK CFI 92fdb .cfa: $rsp 40 + +STACK CFI 92fdc .cfa: $rsp 48 + +STACK CFI 92fdd .cfa: $rsp 56 + +STACK CFI 92fe4 .cfa: $rsp 544 + +STACK CFI 92ffa $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 94fa0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 94fb0 27f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 94fb2 .cfa: $rsp 16 + +STACK CFI 94fb5 $r15: .cfa -16 + ^ +STACK CFI 94fb7 .cfa: $rsp 24 + +STACK CFI 94fb9 .cfa: $rsp 32 + +STACK CFI 94fbc $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 94fbe .cfa: $rsp 40 + +STACK CFI 94fc1 $r12: .cfa -40 + ^ +STACK CFI 94fc2 .cfa: $rsp 48 + +STACK CFI 94fc4 $rbp: .cfa -48 + ^ +STACK CFI 94fc5 .cfa: $rsp 56 + +STACK CFI 94fc8 $rbx: .cfa -56 + ^ +STACK CFI 94fcc .cfa: $rsp 80 + +STACK CFI INIT 95230 1ef .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9523d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 9524b .cfa: $rsp 64 + +STACK CFI 95257 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 95420 1f22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 95422 .cfa: $rsp 16 + +STACK CFI 95425 $r15: .cfa -16 + ^ +STACK CFI 95427 .cfa: $rsp 24 + +STACK CFI 95429 .cfa: $rsp 32 + +STACK CFI 9542b .cfa: $rsp 40 + +STACK CFI 9542c .cfa: $rsp 48 + +STACK CFI 9542d .cfa: $rsp 56 + +STACK CFI 95434 .cfa: $rsp 4384 + +STACK CFI 9544a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 97350 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 97360 27f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 97362 .cfa: $rsp 16 + +STACK CFI 97365 $r15: .cfa -16 + ^ +STACK CFI 97367 .cfa: $rsp 24 + +STACK CFI 97369 .cfa: $rsp 32 + +STACK CFI 9736c $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 9736e .cfa: $rsp 40 + +STACK CFI 97371 $r12: .cfa -40 + ^ +STACK CFI 97372 .cfa: $rsp 48 + +STACK CFI 97374 $rbp: .cfa -48 + ^ +STACK CFI 97375 .cfa: $rsp 56 + +STACK CFI 97378 $rbx: .cfa -56 + ^ +STACK CFI 9737c .cfa: $rsp 80 + +STACK CFI INIT 975e0 1dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 975ec $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 975fa .cfa: $rsp 64 + +STACK CFI 97604 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 977c0 1f32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 977c2 .cfa: $rsp 16 + +STACK CFI 977c5 $r15: .cfa -16 + ^ +STACK CFI 977c7 .cfa: $rsp 24 + +STACK CFI 977c9 .cfa: $rsp 32 + +STACK CFI 977cb .cfa: $rsp 40 + +STACK CFI 977cc .cfa: $rsp 48 + +STACK CFI 977cd .cfa: $rsp 56 + +STACK CFI 977d4 .cfa: $rsp 304 + +STACK CFI 977ea $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 99700 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 99710 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 99720 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 99730 68 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 99738 .cfa: $rsp 16 + +STACK CFI 99753 $rbx: .cfa -16 + ^ +STACK CFI INIT 997a0 dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 997a2 .cfa: $rsp 16 + +STACK CFI 997a6 .cfa: $rsp 24 + +STACK CFI 997a7 .cfa: $rsp 32 + +STACK CFI 997ad $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT 99880 c8c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 99881 .cfa: $rsp 16 + +STACK CFI 99884 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 99889 $r15: .cfa -24 + ^ +STACK CFI 99890 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 998ae $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 9a510 8c6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9a511 .cfa: $rsp 16 + +STACK CFI 9a514 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 9a51f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 9a523 $rbx: .cfa -56 + ^ +STACK CFI INIT 9ade0 54 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9ade2 .cfa: $rsp 16 + +STACK CFI 9ade7 $r13: .cfa -16 + ^ +STACK CFI 9ade9 .cfa: $rsp 24 + +STACK CFI 9adea .cfa: $rsp 32 + +STACK CFI 9adec $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ +STACK CFI 9aded .cfa: $rsp 40 + +STACK CFI 9adf0 $rbx: .cfa -40 + ^ +STACK CFI 9adf4 .cfa: $rsp 48 + +STACK CFI INIT 9ae40 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9ae4d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 9ae63 .cfa: $rsp 48 + +STACK CFI 9ae69 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 9aed0 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9aed2 .cfa: $rsp 16 + +STACK CFI 9aed7 $r14: .cfa -16 + ^ +STACK CFI 9aed9 .cfa: $rsp 24 + +STACK CFI 9aedb .cfa: $rsp 32 + +STACK CFI 9aede $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI 9aee2 .cfa: $rsp 40 + +STACK CFI 9aee5 $rbp: .cfa -40 + ^ +STACK CFI 9aee6 .cfa: $rsp 48 + +STACK CFI 9aee9 $rbx: .cfa -48 + ^ +STACK CFI INIT 9af30 a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9af3d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 9af58 .cfa: $rsp 64 + +STACK CFI 9af5e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 9afe0 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9afe1 .cfa: $rsp 16 + +STACK CFI 9afe5 $rbx: .cfa -16 + ^ +STACK CFI INIT 9b030 4d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9b031 .cfa: $rsp 16 + +STACK CFI 9b037 $rbx: .cfa -16 + ^ +STACK CFI 9b03b .cfa: $rsp 32 + +STACK CFI INIT 9b080 7e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9b081 .cfa: $rsp 16 + +STACK CFI 9b088 $rbp: .cfa -16 + ^ +STACK CFI 9b089 .cfa: $rsp 24 + +STACK CFI 9b08c $rbx: .cfa -24 + ^ +STACK CFI 9b097 .cfa: $rsp 32 + +STACK CFI INIT 9b100 207 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9b101 .cfa: $rsp 16 + +STACK CFI 9b104 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 9b109 $r13: .cfa -24 + ^ +STACK CFI 9b11e $r12: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 9b310 7e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9b311 .cfa: $rsp 16 + +STACK CFI 9b312 .cfa: $rsp 24 + +STACK CFI 9b315 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 9b319 .cfa: $rsp 32 + +STACK CFI INIT 9b390 42c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9b392 .cfa: $rsp 16 + +STACK CFI 9b394 .cfa: $rsp 24 + +STACK CFI 9b396 .cfa: $rsp 32 + +STACK CFI 9b398 .cfa: $rsp 40 + +STACK CFI 9b399 .cfa: $rsp 48 + +STACK CFI 9b39a .cfa: $rsp 56 + +STACK CFI 9b3a1 .cfa: $rsp 448 + +STACK CFI 9b3a4 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 9b7c0 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9b7c7 .cfa: $rsp 224 + +STACK CFI INIT 9b850 ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9b872 .cfa: $rsp 624 + +STACK CFI 9b87a $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 9ba89 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 9ba93 .cfa: $rsp 0 + +STACK CFI 9ba97 .cfa: $rsp 128 + +STACK CFI 9ba9f .cfa: $rsp -128 + +STACK CFI INIT 9baa4 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 9baae .cfa: $rsp 0 + +STACK CFI 9bab2 .cfa: $rsp 128 + +STACK CFI 9baba .cfa: $rsp -128 + +STACK CFI INIT 9babf 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 9bac9 .cfa: $rsp 0 + +STACK CFI 9bacd .cfa: $rsp 128 + +STACK CFI 9bad5 .cfa: $rsp -128 + +STACK CFI INIT 9b900 189 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9b901 .cfa: $rsp 16 + +STACK CFI 9b90b .cfa: $rsp 224 + +STACK CFI 9b96d $rbx: .cfa -16 + ^ +STACK CFI INIT 9bbe7 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 9bbf1 .cfa: $rsp 0 + +STACK CFI 9bbf5 .cfa: $rsp 128 + +STACK CFI 9bbfd .cfa: $rsp -128 + +STACK CFI INIT 9bc02 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 9bc0c .cfa: $rsp 0 + +STACK CFI 9bc10 .cfa: $rsp 128 + +STACK CFI 9bc18 .cfa: $rsp -128 + +STACK CFI INIT 9bc1d 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 9bc27 .cfa: $rsp 0 + +STACK CFI 9bc2b .cfa: $rsp 128 + +STACK CFI 9bc33 .cfa: $rsp -128 + +STACK CFI INIT 9bae0 107 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9bae1 .cfa: $rsp 16 + +STACK CFI 9bae8 .cfa: $rsp 24 + +STACK CFI 9baec .cfa: $rsp 32 + +STACK CFI 9baf6 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 9bdb7 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 9bdc1 .cfa: $rsp 0 + +STACK CFI 9bdc5 .cfa: $rsp 128 + +STACK CFI 9bdcd .cfa: $rsp -128 + +STACK CFI INIT 9bdd2 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 9bddc .cfa: $rsp 0 + +STACK CFI 9bde0 .cfa: $rsp 128 + +STACK CFI 9bde8 .cfa: $rsp -128 + +STACK CFI INIT 9bded 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 9bdf7 .cfa: $rsp 0 + +STACK CFI 9bdfb .cfa: $rsp 128 + +STACK CFI 9be03 .cfa: $rsp -128 + +STACK CFI INIT 9bc40 177 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9bc41 .cfa: $rsp 16 + +STACK CFI 9bc47 $rbx: .cfa -16 + ^ +STACK CFI 9bc4e .cfa: $rsp 224 + +STACK CFI INIT 9bf00 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI 9bf0a .cfa: $rsp 0 + +STACK CFI 9bf0e .cfa: $rsp 128 + +STACK CFI 9bf16 .cfa: $rsp -128 + +STACK CFI INIT 9bf1b 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 9bf25 .cfa: $rsp 0 + +STACK CFI 9bf29 .cfa: $rsp 128 + +STACK CFI 9bf31 .cfa: $rsp -128 + +STACK CFI INIT 9bf33 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI 9bf3d .cfa: $rsp 0 + +STACK CFI 9bf41 .cfa: $rsp 128 + +STACK CFI 9bf49 .cfa: $rsp -128 + +STACK CFI INIT 9be10 f0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9be11 .cfa: $rsp 16 + +STACK CFI 9be18 $rbx: .cfa -16 + ^ +STACK CFI INIT 9bf50 41a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9bf52 .cfa: $rsp 16 + +STACK CFI 9bf5e .cfa: $rsp 24 + +STACK CFI 9bf5f .cfa: $rsp 32 + +STACK CFI 9bf62 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI 9bf63 .cfa: $rsp 40 + +STACK CFI 9bf66 $rbx: .cfa -40 + ^ +STACK CFI INIT 9c370 fa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9c371 .cfa: $rsp 16 + +STACK CFI 9c374 $rbp: .cfa -16 + ^ +STACK CFI 9c375 .cfa: $rsp 24 + +STACK CFI 9c378 $rbx: .cfa -24 + ^ +STACK CFI 9c37c .cfa: $rsp 64 + +STACK CFI INIT 9c470 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9c490 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9c4a0 82 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9c4a1 .cfa: $rsp 16 + +STACK CFI 9c4aa $rbx: .cfa -16 + ^ .cfa: $rsp 48 + +STACK CFI INIT 9c530 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9c534 .cfa: $rsp 16 + +STACK CFI INIT 9c550 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9c551 .cfa: $rsp 16 + +STACK CFI 9c554 $rbx: .cfa -16 + ^ +STACK CFI 9c558 .cfa: $rsp 80 + +STACK CFI INIT 9c580 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9c5a0 e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9c5b0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9c5c0 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9c5e0 d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9c5f0 102 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9c5f8 $rbx: .cfa -56 + ^ +STACK CFI 9c60a $r12: .cfa -40 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI 9c61b .cfa: $rsp 64 + +STACK CFI 9c621 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI INIT 9c700 827 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9c702 .cfa: $rsp 16 + +STACK CFI 9c705 $r15: .cfa -16 + ^ +STACK CFI 9c707 .cfa: $rsp 24 + +STACK CFI 9c70a $r14: .cfa -24 + ^ +STACK CFI 9c70c .cfa: $rsp 32 + +STACK CFI 9c70e .cfa: $rsp 40 + +STACK CFI 9c70f .cfa: $rsp 48 + +STACK CFI 9c710 .cfa: $rsp 56 + +STACK CFI 9c717 .cfa: $rsp 352 + +STACK CFI 9c727 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 9cf30 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9cf31 .cfa: $rsp 16 + +STACK CFI 9cf34 $rbx: .cfa -16 + ^ +STACK CFI INIT 9cf50 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9cf54 .cfa: $rsp 16 + +STACK CFI 9cf61 .cfa: $rsp 8 + +STACK CFI INIT 9cf70 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9cf74 .cfa: $rsp 16 + +STACK CFI 9cf95 .cfa: $rsp 8 + +STACK CFI INIT 9cfb0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9cfe0 14e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9cfe1 .cfa: $rsp 16 + +STACK CFI 9cfe4 $rbx: .cfa -16 + ^ +STACK CFI 9cfeb .cfa: $rsp 224 + +STACK CFI INIT 9e1ba 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 9e1c8 .cfa: $rsp 0 + +STACK CFI 9e1cc .cfa: $rsp 128 + +STACK CFI 9e1d4 .cfa: $rsp -128 + +STACK CFI INIT 9e1d9 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 9e1e7 .cfa: $rsp 0 + +STACK CFI 9e1eb .cfa: $rsp 128 + +STACK CFI 9e1f3 .cfa: $rsp -128 + +STACK CFI INIT 9e1f8 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 9e206 .cfa: $rsp 0 + +STACK CFI 9e20a .cfa: $rsp 128 + +STACK CFI 9e212 .cfa: $rsp -128 + +STACK CFI INIT 9e217 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 9e225 .cfa: $rsp 0 + +STACK CFI 9e229 .cfa: $rsp 128 + +STACK CFI 9e231 .cfa: $rsp -128 + +STACK CFI INIT 9e236 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 9e244 .cfa: $rsp 0 + +STACK CFI 9e248 .cfa: $rsp 128 + +STACK CFI 9e250 .cfa: $rsp -128 + +STACK CFI INIT 9e255 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 9e263 .cfa: $rsp 0 + +STACK CFI 9e267 .cfa: $rsp 128 + +STACK CFI 9e26f .cfa: $rsp -128 + +STACK CFI INIT 9d130 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9d170 2e8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9d171 .cfa: $rsp 16 + +STACK CFI 9d175 .cfa: $rsp 24 + +STACK CFI 9d17b $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 136400 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136404 .cfa: $rsp 16 + +STACK CFI INIT 9d460 84 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9d461 .cfa: $rsp 16 + +STACK CFI 9d464 .cfa: $rsp 24 + +STACK CFI 9d468 .cfa: $rsp 32 + +STACK CFI 9d4a7 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 9d4f0 ce .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9d4fd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 9d506 .cfa: $rsp 32 + +STACK CFI 9d516 $r12: .cfa -16 + ^ +STACK CFI INIT 9d5c0 a1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9d5c2 .cfa: $rsp 16 + +STACK CFI 9d5c5 $r14: .cfa -16 + ^ +STACK CFI 9d5c7 .cfa: $rsp 24 + +STACK CFI 9d5ca $r13: .cfa -24 + ^ +STACK CFI 9d5cc .cfa: $rsp 32 + +STACK CFI 9d5cd .cfa: $rsp 40 + +STACK CFI 9d5ce $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI INIT 9d670 715 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9d671 .cfa: $rsp 16 + +STACK CFI 9d67b $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 9d686 $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 9d68c $r13: .cfa -40 + ^ +STACK CFI 9d692 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 9dd90 19e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9dd9e .cfa: $rsp 32 + +STACK CFI 9dda2 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 9df30 175 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9df32 .cfa: $rsp 16 + +STACK CFI 9df35 $r12: .cfa -16 + ^ +STACK CFI 9df36 .cfa: $rsp 24 + +STACK CFI 9df39 $rbp: .cfa -24 + ^ +STACK CFI 9df3a .cfa: $rsp 32 + +STACK CFI 9df3d $rbx: .cfa -32 + ^ +STACK CFI 9df41 .cfa: $rsp 48 + +STACK CFI INIT 9e0b0 91 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9e0b4 .cfa: $rsp 16 + +STACK CFI INIT 9e150 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9e154 .cfa: $rsp 16 + +STACK CFI INIT 9e280 69c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9e282 .cfa: $rsp 16 + +STACK CFI 9e284 .cfa: $rsp 24 + +STACK CFI 9e286 .cfa: $rsp 32 + +STACK CFI 9e289 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 9e28b .cfa: $rsp 40 + +STACK CFI 9e28c .cfa: $rsp 48 + +STACK CFI 9e28f $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 9e290 .cfa: $rsp 56 + +STACK CFI 9e293 $rbx: .cfa -56 + ^ +STACK CFI 9e297 .cfa: $rsp 96 + +STACK CFI INIT 9e920 e0e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9e921 .cfa: $rsp 16 + +STACK CFI 9e924 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 9e92f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 9e933 $rbx: .cfa -56 + ^ +STACK CFI INIT 9f730 1fa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9f732 .cfa: $rsp 16 + +STACK CFI 9f734 .cfa: $rsp 24 + +STACK CFI 9f736 .cfa: $rsp 32 + +STACK CFI 9f738 .cfa: $rsp 40 + +STACK CFI 9f73b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 9f73c .cfa: $rsp 48 + +STACK CFI 9f73f $rbp: .cfa -48 + ^ +STACK CFI 9f740 .cfa: $rsp 56 + +STACK CFI 9f743 $rbx: .cfa -56 + ^ +STACK CFI 9f747 .cfa: $rsp 96 + +STACK CFI INIT 9f930 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9f960 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9f990 45 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9f994 .cfa: $rsp 32 + +STACK CFI INIT 9f9e0 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9fa30 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9fa50 87 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9fa51 .cfa: $rsp 16 + +STACK CFI 9fa54 $rbx: .cfa -16 + ^ +STACK CFI 9fa58 .cfa: $rsp 48 + +STACK CFI INIT 9fae0 54a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9fae8 $r12: .cfa -40 + ^ +STACK CFI 9fafc $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 9fb12 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 352 + +STACK CFI INIT a0030 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a003b .cfa: $rsp 16 + +STACK CFI INIT a0070 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a0090 d4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a0170 2cd9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a0172 .cfa: $rsp 16 + +STACK CFI a0174 .cfa: $rsp 24 + +STACK CFI a0176 .cfa: $rsp 32 + +STACK CFI a0179 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI a017b .cfa: $rsp 40 + +STACK CFI a017e $r12: .cfa -40 + ^ +STACK CFI a017f .cfa: $rsp 48 + +STACK CFI a0182 $rbp: .cfa -48 + ^ +STACK CFI a0183 .cfa: $rsp 56 + +STACK CFI a0186 $rbx: .cfa -56 + ^ +STACK CFI a018d .cfa: $rsp 272 + +STACK CFI INIT a2e50 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a2e60 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a2e70 20b5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a2e72 .cfa: $rsp 16 + +STACK CFI a2e75 $r15: .cfa -16 + ^ +STACK CFI a2e77 .cfa: $rsp 24 + +STACK CFI a2e79 .cfa: $rsp 32 + +STACK CFI a2e7b .cfa: $rsp 40 + +STACK CFI a2e7e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI a2e7f .cfa: $rsp 48 + +STACK CFI a2e80 .cfa: $rsp 56 + +STACK CFI a2e87 .cfa: $rsp 304 + +STACK CFI a2eb8 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT a4f30 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a4f34 .cfa: $rsp 32 + +STACK CFI INIT a4f50 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a4f60 5a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a4f62 .cfa: $rsp 16 + +STACK CFI a4f68 $r14: .cfa -16 + ^ +STACK CFI a4f6a .cfa: $rsp 24 + +STACK CFI a4f6c .cfa: $rsp 32 + +STACK CFI a4f6d .cfa: $rsp 40 + +STACK CFI a4f70 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $rbp: .cfa -40 + ^ +STACK CFI a4f71 .cfa: $rsp 48 + +STACK CFI a4f74 $rbx: .cfa -48 + ^ +STACK CFI INIT a4fc0 20fa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a4fc1 .cfa: $rsp 16 + +STACK CFI a4fc4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI a5018 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT a70c0 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a70c4 .cfa: $rsp 32 + +STACK CFI INIT a70e0 a7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a70e2 .cfa: $rsp 16 + +STACK CFI a70e3 .cfa: $rsp 24 + +STACK CFI a70e6 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI a70e7 .cfa: $rsp 32 + +STACK CFI a70eb $rbx: .cfa -32 + ^ +STACK CFI INIT a7190 135 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7192 .cfa: $rsp 16 + +STACK CFI a7194 .cfa: $rsp 24 + +STACK CFI a719a $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI a719c .cfa: $rsp 32 + +STACK CFI a719e .cfa: $rsp 40 + +STACK CFI a719f .cfa: $rsp 48 + +STACK CFI a71a0 .cfa: $rsp 56 + +STACK CFI a71a3 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI a71a7 .cfa: $rsp 80 + +STACK CFI INIT a72d0 dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a72d1 .cfa: $rsp 16 + +STACK CFI a72d3 $rbx: .cfa -16 + ^ +STACK CFI a72d7 .cfa: $rsp 32 + +STACK CFI INIT a73b0 189 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a73bc $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI a73ca .cfa: $rsp 64 + +STACK CFI a73cf $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT a7540 2b4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a754d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI a7565 .cfa: $rsp 64 + +STACK CFI a7573 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT a7800 55 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a780e .cfa: $rsp 32 + +STACK CFI a7814 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT a7860 152 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7861 .cfa: $rsp 16 + +STACK CFI a7864 $rbp: .cfa -16 + ^ +STACK CFI a7865 .cfa: $rsp 24 + +STACK CFI a7868 $rbx: .cfa -24 + ^ +STACK CFI a786c .cfa: $rsp 32 + +STACK CFI INIT a79c0 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a79c1 .cfa: $rsp 16 + +STACK CFI a79c5 $rbx: .cfa -16 + ^ +STACK CFI INIT a7a10 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7a11 .cfa: $rsp 16 + +STACK CFI a7a14 $rbx: .cfa -16 + ^ +STACK CFI a7a1b .cfa: $rsp 224 + +STACK CFI INIT a7a60 72 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7a61 .cfa: $rsp 16 + +STACK CFI a7a64 $rbx: .cfa -16 + ^ +STACK CFI a7a6b .cfa: $rsp 224 + +STACK CFI INIT a7ae0 f6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7aed $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI a7afb .cfa: $rsp 48 + +STACK CFI a7b03 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT a7be0 3d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7be4 .cfa: $rsp 16 + +STACK CFI INIT a7c20 2d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7c24 .cfa: $rsp 16 + +STACK CFI a7c26 $rbx: .cfa -16 + ^ +STACK CFI INIT a7d2f 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI a7d3a .cfa: $rsp 0 + +STACK CFI a7d3e .cfa: $rsp 128 + +STACK CFI a7d46 .cfa: $rsp -128 + +STACK CFI INIT a7d4b 19 .cfa: $rsp -128 + .ra: $rip +STACK CFI a7d56 .cfa: $rsp 0 + +STACK CFI a7d5a .cfa: $rsp 128 + +STACK CFI a7d62 .cfa: $rsp -128 + +STACK CFI INIT a7c50 df .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7c52 .cfa: $rsp 16 + +STACK CFI a7c5b .cfa: $rsp 24 + +STACK CFI a7c5c .cfa: $rsp 32 + +STACK CFI a7c5d .cfa: $rsp 40 + +STACK CFI a7c60 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI a7c64 .cfa: $rsp 48 + +STACK CFI INIT a7eca 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI a7ed5 .cfa: $rsp 0 + +STACK CFI a7ed9 .cfa: $rsp 128 + +STACK CFI a7ee1 .cfa: $rsp -128 + +STACK CFI INIT a7ee6 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI a7ef1 .cfa: $rsp 0 + +STACK CFI a7ef5 .cfa: $rsp 128 + +STACK CFI a7efd .cfa: $rsp -128 + +STACK CFI INIT a7d70 15a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7d72 .cfa: $rsp 16 + +STACK CFI a7d74 .cfa: $rsp 24 + +STACK CFI a7d77 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI a7d79 .cfa: $rsp 32 + +STACK CFI a7d7c $r13: .cfa -32 + ^ +STACK CFI a7d83 .cfa: $rsp 40 + +STACK CFI a7d84 .cfa: $rsp 48 + +STACK CFI a7d85 .cfa: $rsp 56 + +STACK CFI a7d88 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI a7d8c .cfa: $rsp 80 + +STACK CFI INIT a7f6e 19 .cfa: $rsp -128 + .ra: $rip +STACK CFI a7f79 .cfa: $rsp 0 + +STACK CFI a7f7d .cfa: $rsp 128 + +STACK CFI a7f85 .cfa: $rsp -128 + +STACK CFI INIT a7f87 19 .cfa: $rsp -128 + .ra: $rip +STACK CFI a7f92 .cfa: $rsp 0 + +STACK CFI a7f96 .cfa: $rsp 128 + +STACK CFI a7f9e .cfa: $rsp -128 + +STACK CFI INIT a7f10 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7f11 .cfa: $rsp 16 + +STACK CFI a7f19 $rbx: .cfa -16 + ^ +STACK CFI INIT a8018 19 .cfa: $rsp -128 + .ra: $rip +STACK CFI a8023 .cfa: $rsp 0 + +STACK CFI a8027 .cfa: $rsp 128 + +STACK CFI a802f .cfa: $rsp -128 + +STACK CFI INIT a8031 19 .cfa: $rsp -128 + .ra: $rip +STACK CFI a803c .cfa: $rsp 0 + +STACK CFI a8040 .cfa: $rsp 128 + +STACK CFI a8048 .cfa: $rsp -128 + +STACK CFI INIT a7fa0 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7fad $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI a7fb1 .cfa: $rsp 32 + +STACK CFI INIT a8050 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a8060 1f3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a8062 .cfa: $rsp 16 + +STACK CFI a8064 .cfa: $rsp 24 + +STACK CFI a8066 .cfa: $rsp 32 + +STACK CFI a8068 .cfa: $rsp 40 + +STACK CFI a8069 .cfa: $rsp 48 + +STACK CFI a806c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI a806d .cfa: $rsp 56 + +STACK CFI a8071 .cfa: $rsp 128 + +STACK CFI a807b $rbx: .cfa -56 + ^ +STACK CFI INIT a8260 40 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a8262 .cfa: $rsp 16 + +STACK CFI a8263 .cfa: $rsp 24 + +STACK CFI a8266 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI a8267 .cfa: $rsp 32 + +STACK CFI a8272 $rbx: .cfa -32 + ^ +STACK CFI INIT a82a0 13 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a82c0 13 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a82e0 87 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a82e2 .cfa: $rsp 16 + +STACK CFI a82ef .cfa: $rsp 24 + +STACK CFI a82f1 .cfa: $rsp 32 + +STACK CFI a82f2 .cfa: $rsp 40 + +STACK CFI a82f3 .cfa: $rsp 48 + +STACK CFI a82fd $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT a8370 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a8380 87 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a8381 .cfa: $rsp 16 + +STACK CFI a8384 .cfa: $rsp 24 + +STACK CFI a8386 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI a8392 .cfa: $rsp 176 + +STACK CFI INIT a8410 6b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a841c $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI a8434 .cfa: $rsp 48 + +STACK CFI a8437 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT a861f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI a862d .cfa: $rsp 0 + +STACK CFI a8631 .cfa: $rsp 128 + +STACK CFI a8639 .cfa: $rsp -128 + +STACK CFI INIT a863e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI a864c .cfa: $rsp 0 + +STACK CFI a8650 .cfa: $rsp 128 + +STACK CFI a8658 .cfa: $rsp -128 + +STACK CFI INIT a8480 19f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a8482 .cfa: $rsp 16 + +STACK CFI a8484 .cfa: $rsp 24 + +STACK CFI a8485 .cfa: $rsp 32 + +STACK CFI a8486 .cfa: $rsp 40 + +STACK CFI a8489 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI a848d .cfa: $rsp 96 + +STACK CFI INIT a8660 354 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a8661 .cfa: $rsp 16 + +STACK CFI a8664 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI a8669 $r15: .cfa -24 + ^ +STACK CFI a8678 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT a89c0 297 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a89c2 .cfa: $rsp 16 + +STACK CFI a89c5 $r15: .cfa -16 + ^ +STACK CFI a89c7 .cfa: $rsp 24 + +STACK CFI a89ca $r14: .cfa -24 + ^ +STACK CFI a89cc .cfa: $rsp 32 + +STACK CFI a89ce .cfa: $rsp 40 + +STACK CFI a89cf .cfa: $rsp 48 + +STACK CFI a89d2 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI a89d3 .cfa: $rsp 56 + +STACK CFI a89d7 .cfa: $rsp 128 + +STACK CFI a89f0 $rbx: .cfa -56 + ^ +STACK CFI INIT a8c60 d0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a8c62 .cfa: $rsp 16 + +STACK CFI a8c63 .cfa: $rsp 24 + +STACK CFI a8c65 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI a8c66 .cfa: $rsp 32 + +STACK CFI a8c69 $rbx: .cfa -32 + ^ +STACK CFI a8c72 .cfa: $rsp 64 + +STACK CFI INIT a8d30 b7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a8d3d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI a8d4b .cfa: $rsp 64 + +STACK CFI a8d50 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT a8df0 5f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a8df4 .cfa: $rsp 64 + +STACK CFI INIT a8ed8 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI a8ee6 .cfa: $rsp 0 + +STACK CFI a8eea .cfa: $rsp 128 + +STACK CFI a8ef2 .cfa: $rsp -128 + +STACK CFI INIT a8ef4 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI a8f02 .cfa: $rsp 0 + +STACK CFI a8f06 .cfa: $rsp 128 + +STACK CFI a8f0e .cfa: $rsp -128 + +STACK CFI INIT a8e50 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a8e54 .cfa: $rsp 16 + +STACK CFI INIT a9035 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI a9043 .cfa: $rsp 0 + +STACK CFI a9047 .cfa: $rsp 128 + +STACK CFI a904f .cfa: $rsp -128 + +STACK CFI INIT a9054 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI a9062 .cfa: $rsp 0 + +STACK CFI a9066 .cfa: $rsp 128 + +STACK CFI a906e .cfa: $rsp -128 + +STACK CFI INIT a8f10 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a8f11 .cfa: $rsp 16 + +STACK CFI a8f19 .cfa: $rsp 24 + +STACK CFI a8f1b $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI a8f1f .cfa: $rsp 48 + +STACK CFI INIT a9195 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI a91a3 .cfa: $rsp 0 + +STACK CFI a91a7 .cfa: $rsp 128 + +STACK CFI a91af .cfa: $rsp -128 + +STACK CFI INIT a91b4 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI a91c2 .cfa: $rsp 0 + +STACK CFI a91c6 .cfa: $rsp 128 + +STACK CFI a91ce .cfa: $rsp -128 + +STACK CFI INIT a9070 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a9071 .cfa: $rsp 16 + +STACK CFI a9079 .cfa: $rsp 24 + +STACK CFI a907c $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI a9080 .cfa: $rsp 48 + +STACK CFI INIT a9414 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI a941e .cfa: $rsp 0 + +STACK CFI a9422 .cfa: $rsp 128 + +STACK CFI a942a .cfa: $rsp -128 + +STACK CFI INIT a942f 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI a9439 .cfa: $rsp 0 + +STACK CFI a943d .cfa: $rsp 128 + +STACK CFI a9445 .cfa: $rsp -128 + +STACK CFI INIT a944a 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI a9454 .cfa: $rsp 0 + +STACK CFI a9458 .cfa: $rsp 128 + +STACK CFI a9460 .cfa: $rsp -128 + +STACK CFI INIT a91d0 244 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a91d2 .cfa: $rsp 16 + +STACK CFI a91d4 .cfa: $rsp 24 + +STACK CFI a91d6 .cfa: $rsp 32 + +STACK CFI a91d8 .cfa: $rsp 40 + +STACK CFI a91d9 .cfa: $rsp 48 + +STACK CFI a91dc $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI a91dd .cfa: $rsp 56 + +STACK CFI a91e0 $rbx: .cfa -56 + ^ +STACK CFI a91e4 .cfa: $rsp 64 + +STACK CFI INIT a9692 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI a96a0 .cfa: $rsp 0 + +STACK CFI a96a4 .cfa: $rsp 128 + +STACK CFI a96ac .cfa: $rsp -128 + +STACK CFI INIT a96b1 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI a96bf .cfa: $rsp 0 + +STACK CFI a96c3 .cfa: $rsp 128 + +STACK CFI a96cb .cfa: $rsp -128 + +STACK CFI INIT a96d0 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI a96de .cfa: $rsp 0 + +STACK CFI a96e2 .cfa: $rsp 128 + +STACK CFI a96ea .cfa: $rsp -128 + +STACK CFI INIT a96ef 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI a96fd .cfa: $rsp 0 + +STACK CFI a9701 .cfa: $rsp 128 + +STACK CFI a9709 .cfa: $rsp -128 + +STACK CFI INIT a970e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI a971c .cfa: $rsp 0 + +STACK CFI a9720 .cfa: $rsp 128 + +STACK CFI a9728 .cfa: $rsp -128 + +STACK CFI INIT a972d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI a973b .cfa: $rsp 0 + +STACK CFI a973f .cfa: $rsp 128 + +STACK CFI a9747 .cfa: $rsp -128 + +STACK CFI INIT a9470 d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a9474 .cfa: $rsp 80 + +STACK CFI INIT a9550 a0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a9554 .cfa: $rsp 16 + +STACK CFI INIT a95f0 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a95f4 .cfa: $rsp 32 + +STACK CFI INIT a9750 25d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a9752 .cfa: $rsp 16 + +STACK CFI a9755 $r15: .cfa -16 + ^ +STACK CFI a9757 .cfa: $rsp 24 + +STACK CFI a975a $r14: .cfa -24 + ^ +STACK CFI a975c .cfa: $rsp 32 + +STACK CFI a975f $r13: .cfa -32 + ^ +STACK CFI a9761 .cfa: $rsp 40 + +STACK CFI a9762 .cfa: $rsp 48 + +STACK CFI a9765 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI a9766 .cfa: $rsp 56 + +STACK CFI a976a .cfa: $rsp 112 + +STACK CFI a977e $rbx: .cfa -56 + ^ +STACK CFI INIT a99b0 25d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a99b2 .cfa: $rsp 16 + +STACK CFI a99b5 $r15: .cfa -16 + ^ +STACK CFI a99b7 .cfa: $rsp 24 + +STACK CFI a99ba $r14: .cfa -24 + ^ +STACK CFI a99bc .cfa: $rsp 32 + +STACK CFI a99bf $r13: .cfa -32 + ^ +STACK CFI a99c1 .cfa: $rsp 40 + +STACK CFI a99c2 .cfa: $rsp 48 + +STACK CFI a99c5 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI a99c6 .cfa: $rsp 56 + +STACK CFI a99ca .cfa: $rsp 112 + +STACK CFI a99de $rbx: .cfa -56 + ^ +STACK CFI INIT aa186 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI aa190 .cfa: $rsp 0 + +STACK CFI aa194 .cfa: $rsp 128 + +STACK CFI aa19c .cfa: $rsp -128 + +STACK CFI INIT aa1a1 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI aa1ab .cfa: $rsp 0 + +STACK CFI aa1af .cfa: $rsp 128 + +STACK CFI aa1b7 .cfa: $rsp -128 + +STACK CFI INIT aa1bc 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI aa1c6 .cfa: $rsp 0 + +STACK CFI aa1ca .cfa: $rsp 128 + +STACK CFI aa1d2 .cfa: $rsp -128 + +STACK CFI INIT aa1d7 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI aa1e1 .cfa: $rsp 0 + +STACK CFI aa1e5 .cfa: $rsp 128 + +STACK CFI aa1ed .cfa: $rsp -128 + +STACK CFI INIT a9c10 2e9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a9c12 .cfa: $rsp 16 + +STACK CFI a9c15 $r15: .cfa -16 + ^ +STACK CFI a9c17 .cfa: $rsp 24 + +STACK CFI a9c1a $r14: .cfa -24 + ^ +STACK CFI a9c1c .cfa: $rsp 32 + +STACK CFI a9c20 $r13: .cfa -32 + ^ +STACK CFI a9c22 .cfa: $rsp 40 + +STACK CFI a9c25 $r12: .cfa -40 + ^ +STACK CFI a9c26 .cfa: $rsp 48 + +STACK CFI a9c29 $rbp: .cfa -48 + ^ +STACK CFI a9c2a .cfa: $rsp 56 + +STACK CFI a9c2d $rbx: .cfa -56 + ^ +STACK CFI a9c31 .cfa: $rsp 96 + +STACK CFI INIT a9f00 286 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a9f02 .cfa: $rsp 16 + +STACK CFI a9f04 .cfa: $rsp 24 + +STACK CFI a9f07 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI a9f09 .cfa: $rsp 32 + +STACK CFI a9f0b .cfa: $rsp 40 + +STACK CFI a9f0c .cfa: $rsp 48 + +STACK CFI a9f0f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI a9f10 .cfa: $rsp 56 + +STACK CFI a9f13 $rbx: .cfa -56 + ^ +STACK CFI a9f17 .cfa: $rsp 80 + +STACK CFI INIT aa39e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI aa3ac .cfa: $rsp 0 + +STACK CFI aa3b0 .cfa: $rsp 128 + +STACK CFI aa3b8 .cfa: $rsp -128 + +STACK CFI INIT aa3bd 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI aa3cb .cfa: $rsp 0 + +STACK CFI aa3cf .cfa: $rsp 128 + +STACK CFI aa3d7 .cfa: $rsp -128 + +STACK CFI INIT aa200 19e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aa202 .cfa: $rsp 16 + +STACK CFI aa204 .cfa: $rsp 24 + +STACK CFI aa205 .cfa: $rsp 32 + +STACK CFI aa206 .cfa: $rsp 40 + +STACK CFI aa209 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI aa20d .cfa: $rsp 96 + +STACK CFI INIT aa3e0 d0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aa3e1 .cfa: $rsp 16 + +STACK CFI aa3e4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI aa3e9 $r12: .cfa -24 + ^ +STACK CFI aa3ed $rbx: .cfa -32 + ^ +STACK CFI INIT aa4b0 100 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aa4b4 .cfa: $rsp 48 + +STACK CFI INIT aa638 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI aa646 .cfa: $rsp 0 + +STACK CFI aa64a .cfa: $rsp 128 + +STACK CFI aa652 .cfa: $rsp -128 + +STACK CFI INIT aa654 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI aa662 .cfa: $rsp 0 + +STACK CFI aa666 .cfa: $rsp 128 + +STACK CFI aa66e .cfa: $rsp -128 + +STACK CFI INIT aa5b0 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aa5b4 .cfa: $rsp 16 + +STACK CFI INIT aa795 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI aa7a3 .cfa: $rsp 0 + +STACK CFI aa7a7 .cfa: $rsp 128 + +STACK CFI aa7af .cfa: $rsp -128 + +STACK CFI INIT aa7b4 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI aa7c2 .cfa: $rsp 0 + +STACK CFI aa7c6 .cfa: $rsp 128 + +STACK CFI aa7ce .cfa: $rsp -128 + +STACK CFI INIT aa670 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aa671 .cfa: $rsp 16 + +STACK CFI aa679 .cfa: $rsp 24 + +STACK CFI aa67c $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI aa680 .cfa: $rsp 48 + +STACK CFI INIT aa8f5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI aa903 .cfa: $rsp 0 + +STACK CFI aa907 .cfa: $rsp 128 + +STACK CFI aa90f .cfa: $rsp -128 + +STACK CFI INIT aa914 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI aa922 .cfa: $rsp 0 + +STACK CFI aa926 .cfa: $rsp 128 + +STACK CFI aa92e .cfa: $rsp -128 + +STACK CFI INIT aa7d0 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aa7d1 .cfa: $rsp 16 + +STACK CFI aa7d9 .cfa: $rsp 24 + +STACK CFI aa7db $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI aa7df .cfa: $rsp 48 + +STACK CFI INIT aab52 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI aab60 .cfa: $rsp 0 + +STACK CFI aab64 .cfa: $rsp 128 + +STACK CFI aab6c .cfa: $rsp -128 + +STACK CFI INIT aab71 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI aab7f .cfa: $rsp 0 + +STACK CFI aab83 .cfa: $rsp 128 + +STACK CFI aab8b .cfa: $rsp -128 + +STACK CFI INIT aab90 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI aab9e .cfa: $rsp 0 + +STACK CFI aaba2 .cfa: $rsp 128 + +STACK CFI aabaa .cfa: $rsp -128 + +STACK CFI INIT aabaf 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI aabbd .cfa: $rsp 0 + +STACK CFI aabc1 .cfa: $rsp 128 + +STACK CFI aabc9 .cfa: $rsp -128 + +STACK CFI INIT aabce 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI aabdc .cfa: $rsp 0 + +STACK CFI aabe0 .cfa: $rsp 128 + +STACK CFI aabe8 .cfa: $rsp -128 + +STACK CFI INIT aabed 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI aabfb .cfa: $rsp 0 + +STACK CFI aabff .cfa: $rsp 128 + +STACK CFI aac07 .cfa: $rsp -128 + +STACK CFI INIT aa930 d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aa934 .cfa: $rsp 80 + +STACK CFI INIT aaa10 a0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aaa14 .cfa: $rsp 16 + +STACK CFI INIT aaab0 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aaab4 .cfa: $rsp 32 + +STACK CFI INIT aac10 25d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aac12 .cfa: $rsp 16 + +STACK CFI aac15 $r15: .cfa -16 + ^ +STACK CFI aac17 .cfa: $rsp 24 + +STACK CFI aac1a $r14: .cfa -24 + ^ +STACK CFI aac1c .cfa: $rsp 32 + +STACK CFI aac1f $r13: .cfa -32 + ^ +STACK CFI aac21 .cfa: $rsp 40 + +STACK CFI aac22 .cfa: $rsp 48 + +STACK CFI aac25 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI aac26 .cfa: $rsp 56 + +STACK CFI aac2a .cfa: $rsp 112 + +STACK CFI aac3e $rbx: .cfa -56 + ^ +STACK CFI INIT aae70 25d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aae72 .cfa: $rsp 16 + +STACK CFI aae75 $r15: .cfa -16 + ^ +STACK CFI aae77 .cfa: $rsp 24 + +STACK CFI aae7a $r14: .cfa -24 + ^ +STACK CFI aae7c .cfa: $rsp 32 + +STACK CFI aae7f $r13: .cfa -32 + ^ +STACK CFI aae81 .cfa: $rsp 40 + +STACK CFI aae82 .cfa: $rsp 48 + +STACK CFI aae85 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI aae86 .cfa: $rsp 56 + +STACK CFI aae8a .cfa: $rsp 112 + +STACK CFI aae9e $rbx: .cfa -56 + ^ +STACK CFI INIT ab606 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI ab610 .cfa: $rsp 0 + +STACK CFI ab614 .cfa: $rsp 128 + +STACK CFI ab61c .cfa: $rsp -128 + +STACK CFI INIT ab621 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI ab62b .cfa: $rsp 0 + +STACK CFI ab62f .cfa: $rsp 128 + +STACK CFI ab637 .cfa: $rsp -128 + +STACK CFI INIT ab63c 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI ab646 .cfa: $rsp 0 + +STACK CFI ab64a .cfa: $rsp 128 + +STACK CFI ab652 .cfa: $rsp -128 + +STACK CFI INIT ab657 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI ab661 .cfa: $rsp 0 + +STACK CFI ab665 .cfa: $rsp 128 + +STACK CFI ab66d .cfa: $rsp -128 + +STACK CFI INIT ab0d0 2d6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ab0d2 .cfa: $rsp 16 + +STACK CFI ab0d4 .cfa: $rsp 24 + +STACK CFI ab0d5 .cfa: $rsp 32 + +STACK CFI ab0d8 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI ab0de .cfa: $rsp 40 + +STACK CFI ab0e1 $rbx: .cfa -40 + ^ +STACK CFI ab0e5 .cfa: $rsp 64 + +STACK CFI INIT ab3b0 256 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ab3b2 .cfa: $rsp 16 + +STACK CFI ab3b4 .cfa: $rsp 24 + +STACK CFI ab3b7 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI ab3b9 .cfa: $rsp 32 + +STACK CFI ab3bb .cfa: $rsp 40 + +STACK CFI ab3bc .cfa: $rsp 48 + +STACK CFI ab3bf $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI ab3c0 .cfa: $rsp 56 + +STACK CFI ab3c3 $rbx: .cfa -56 + ^ +STACK CFI ab3c7 .cfa: $rsp 80 + +STACK CFI INIT ab680 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ab6b0 49 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ab700 93 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ab704 .cfa: $rsp 32 + +STACK CFI INIT ab7a0 9d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ab7a4 .cfa: $rsp 48 + +STACK CFI INIT ab840 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ab860 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ab890 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ab894 .cfa: $rsp 48 + +STACK CFI INIT ab940 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ab970 1d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ab98b .cfa: $rsp 480 + +STACK CFI ab993 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT abb50 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI abb6d .cfa: $rsp 16 + +STACK CFI abb90 .cfa: $rsp 8 + +STACK CFI INIT abbb0 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI abbcd .cfa: $rsp 16 + +STACK CFI abbf0 .cfa: $rsp 8 + +STACK CFI INIT abc10 2cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI abc11 .cfa: $rsp 16 + +STACK CFI abc14 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI abc27 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT abee0 4f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI abee1 .cfa: $rsp 0 + .ra: $rdi +STACK CFI abf05 .cfa: $rsp 8 + +STACK CFI INIT abf30 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT abf80 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT abfb0 c3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI abfbd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI abfc9 .cfa: $rsp 208 + +STACK CFI abfd1 $r12: .cfa -16 + ^ +STACK CFI INIT ac080 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ac090 1dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ac092 .cfa: $rsp 16 + +STACK CFI ac094 .cfa: $rsp 24 + +STACK CFI ac096 .cfa: $rsp 32 + +STACK CFI ac098 .cfa: $rsp 40 + +STACK CFI ac099 .cfa: $rsp 48 + +STACK CFI ac09a .cfa: $rsp 56 + +STACK CFI ac0a1 .cfa: $rsp 8352 + +STACK CFI ac0b1 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT ac270 1b7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ac272 .cfa: $rsp 16 + +STACK CFI ac274 .cfa: $rsp 24 + +STACK CFI ac276 .cfa: $rsp 32 + +STACK CFI ac278 .cfa: $rsp 40 + +STACK CFI ac279 .cfa: $rsp 48 + +STACK CFI ac27a .cfa: $rsp 56 + +STACK CFI ac281 .cfa: $rsp 8352 + +STACK CFI ac2df $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT ac430 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ac440 192 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ac442 .cfa: $rsp 16 + +STACK CFI ac444 .cfa: $rsp 24 + +STACK CFI ac446 .cfa: $rsp 32 + +STACK CFI ac448 .cfa: $rsp 40 + +STACK CFI ac449 .cfa: $rsp 48 + +STACK CFI ac44a .cfa: $rsp 56 + +STACK CFI ac451 .cfa: $rsp 8352 + +STACK CFI ac4af $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT ac5e0 485 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ac5e1 .cfa: $rsp 16 + +STACK CFI ac5e4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI ac5ef $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI ac5fa $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI ac60a $r15: .cfa -24 + ^ +STACK CFI INIT aca70 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acab0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acac0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acad0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acae0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acaf0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acb00 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acb30 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI acb34 .cfa: $rsp 64 + +STACK CFI INIT acb90 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI acb94 .cfa: $rsp 64 + +STACK CFI INIT acbf0 95 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI acbf1 .cfa: $rsp 16 + +STACK CFI acbf4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI acbf9 $r13: .cfa -24 + ^ +STACK CFI acc01 $r12: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT acc90 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT accc0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT accf0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acd00 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acd10 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acd20 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acd50 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acd80 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acdb0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acde0 70 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI acde4 .cfa: $rsp 64 + +STACK CFI INIT ace50 70 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ace54 .cfa: $rsp 64 + +STACK CFI INIT acec0 f6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT acfc0 115 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ad0e0 bd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ad1a0 bd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ad1a1 .cfa: $rsp 16 + +STACK CFI ad1a2 .cfa: $rsp 24 + +STACK CFI ad1a6 .cfa: $rsp 48 + +STACK CFI ad1aa $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT ad260 20b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ad271 .cfa: $rsp 544 + +STACK CFI ad27a $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT ad470 111 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ad471 .cfa: $rsp 16 + +STACK CFI ad474 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI ad47f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ +STACK CFI ad4a5 $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT ad590 405 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ad597 $rbx: .cfa -32 + ^ +STACK CFI ad5ab .cfa: $rsp 96 + +STACK CFI ad5b0 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI INIT ad9a0 26f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ad9ac $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI ad9b8 .cfa: $rsp 544 + +STACK CFI ad9bf $r12: .cfa -16 + ^ +STACK CFI INIT adc10 6e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT adc80 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT add00 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT add10 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI add11 .cfa: $rsp 16 + +STACK CFI add14 $rbp: .cfa -16 + ^ +STACK CFI add15 .cfa: $rsp 24 + +STACK CFI add19 .cfa: $rsp 32 + +STACK CFI add22 $rbx: .cfa -24 + ^ +STACK CFI INIT add70 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI add71 .cfa: $rsp 16 + +STACK CFI add74 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI add7f $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI add91 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI INIT ade20 110 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ade22 .cfa: $rsp 16 + +STACK CFI ade25 $r15: .cfa -16 + ^ +STACK CFI ade27 .cfa: $rsp 24 + +STACK CFI ade29 .cfa: $rsp 32 + +STACK CFI ade2b .cfa: $rsp 40 + +STACK CFI ade2c .cfa: $rsp 48 + +STACK CFI ade2f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI ade30 .cfa: $rsp 56 + +STACK CFI ade34 .cfa: $rsp 80 + +STACK CFI ade38 $rbx: .cfa -56 + ^ +STACK CFI INIT adf30 78e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI adf31 .cfa: $rsp 16 + +STACK CFI adf34 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI adf39 $r15: .cfa -24 + ^ +STACK CFI adf43 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT ae6c0 144d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ae6c1 .cfa: $rsp 16 + +STACK CFI ae6c4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI ae6cd $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI ae6d2 $r12: .cfa -48 + ^ +STACK CFI ae6d6 $rbx: .cfa -56 + ^ +STACK CFI INIT afb10 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT afb40 105 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI afb41 .cfa: $rsp 16 + +STACK CFI afb44 $rbp: .cfa -16 + ^ +STACK CFI afb45 .cfa: $rsp 24 + +STACK CFI afb49 $rbx: .cfa -24 + ^ +STACK CFI afb4d .cfa: $rsp 32 + +STACK CFI INIT afc50 105 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI afc51 .cfa: $rsp 16 + +STACK CFI afc54 $rbp: .cfa -16 + ^ +STACK CFI afc55 .cfa: $rsp 24 + +STACK CFI afc59 $rbx: .cfa -24 + ^ +STACK CFI afc5d .cfa: $rsp 32 + +STACK CFI INIT afd60 79f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI afd61 .cfa: $rsp 16 + +STACK CFI afd64 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI afd6d $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI afd99 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT b0500 1640 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b0501 .cfa: $rsp 16 + +STACK CFI b0504 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI b0509 $r15: .cfa -24 + ^ +STACK CFI b0515 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI b05a0 $rbx: .cfa -56 + ^ +STACK CFI INIT b1b40 76f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b1b41 .cfa: $rsp 16 + +STACK CFI b1b44 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI b1b4d $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI b1b79 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT b22b0 17e4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b22b2 .cfa: $rsp 16 + +STACK CFI b22b5 $r15: .cfa -16 + ^ +STACK CFI b22b7 .cfa: $rsp 24 + +STACK CFI b22b9 .cfa: $rsp 32 + +STACK CFI b22bc $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI b22c1 .cfa: $rsp 40 + +STACK CFI b22c2 .cfa: $rsp 48 + +STACK CFI b22c5 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI b22cc .cfa: $rsp 56 + +STACK CFI b22d3 .cfa: $rsp 2368 + +STACK CFI b22ef $rbx: .cfa -56 + ^ +STACK CFI INIT b3aa0 369 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b3aa1 .cfa: $rsp 16 + +STACK CFI b3aa4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI b3aaf $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI b3ae1 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI INIT b3e10 6e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b3e1d $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI b3e26 .cfa: $rsp 128 + +STACK CFI b3e35 $rbx: .cfa -32 + ^ +STACK CFI INIT b4500 e4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b4502 .cfa: $rsp 16 + +STACK CFI b4508 .cfa: $rsp 24 + +STACK CFI b450d .cfa: $rsp 32 + +STACK CFI b450f .cfa: $rsp 40 + +STACK CFI b4513 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI b4514 .cfa: $rsp 48 + +STACK CFI b4516 $rbp: .cfa -48 + ^ +STACK CFI b451a .cfa: $rsp 56 + +STACK CFI b451e $rbx: .cfa -56 + ^ +STACK CFI INIT b45f0 106d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b45f2 .cfa: $rsp 16 + +STACK CFI b45f4 .cfa: $rsp 24 + +STACK CFI b45f6 .cfa: $rsp 32 + +STACK CFI b45f8 .cfa: $rsp 40 + +STACK CFI b45f9 .cfa: $rsp 48 + +STACK CFI b45fa .cfa: $rsp 56 + +STACK CFI b4601 .cfa: $rsp 192 + +STACK CFI b460b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT b5660 69 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5661 .cfa: $rsp 16 + +STACK CFI b5665 .cfa: $rsp 32 + +STACK CFI b566c $rbx: .cfa -16 + ^ +STACK CFI INIT b56d0 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b56d4 .cfa: $rsp 32 + +STACK CFI INIT b56f0 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b56f4 .cfa: $rsp 32 + +STACK CFI INIT b5710 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5714 .cfa: $rsp 32 + +STACK CFI INIT b5730 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5734 .cfa: $rsp 32 + +STACK CFI INIT b5750 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5754 .cfa: $rsp 32 + +STACK CFI INIT b5770 18 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5774 .cfa: $rsp 32 + +STACK CFI INIT b5790 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b57c0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b57f0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5820 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5850 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5880 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b58b0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b58e0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5910 5c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5917 .cfa: $rsp 16 + +STACK CFI INIT 1119c0 d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5970 15e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5971 .cfa: $rsp 16 + +STACK CFI b5974 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI b597d $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI b5982 $r12: .cfa -48 + ^ +STACK CFI b5986 $rbx: .cfa -56 + ^ +STACK CFI INIT 1119d0 d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5ad0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5af0 .cfa: $rsp 16 + +STACK CFI b5b16 .cfa: $rsp 8 + +STACK CFI INIT b5b40 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5b60 .cfa: $rsp 16 + +STACK CFI b5b86 .cfa: $rsp 8 + +STACK CFI INIT b5bb0 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5bd0 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5bd4 .cfa: $rsp 32 + +STACK CFI INIT b5c10 bd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5c17 .cfa: $rsp 16 + +STACK CFI b5c24 $rbx: .cfa -16 + ^ +STACK CFI INIT b5cd0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5d00 37 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5d04 .cfa: $rsp 16 + +STACK CFI INIT b5d40 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5d60 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b98f5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI b9903 .cfa: $rsp 0 + +STACK CFI b9907 .cfa: $rsp 128 + +STACK CFI b990f .cfa: $rsp -128 + +STACK CFI INIT b9914 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI b9922 .cfa: $rsp 0 + +STACK CFI b9926 .cfa: $rsp 128 + +STACK CFI b992e .cfa: $rsp -128 + +STACK CFI INIT b5d70 c8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5e40 18 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5e60 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 136450 6d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136454 .cfa: $rsp 16 + +STACK CFI INIT b5e80 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5e81 .cfa: $rsp 16 + +STACK CFI b5e82 .cfa: $rsp 24 + +STACK CFI b5e85 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI b5e89 .cfa: $rsp 32 + +STACK CFI INIT b5ec0 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5ee0 c0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5ee1 .cfa: $rsp 16 + +STACK CFI b5eec $rbx: .cfa -16 + ^ +STACK CFI INIT b5fa0 e4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b5fa1 .cfa: $rsp 16 + +STACK CFI b5fa4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI b5faa $r15: .cfa -24 + ^ +STACK CFI b5fb3 $r14: .cfa -32 + ^ +STACK CFI b5fb8 $r13: .cfa -40 + ^ +STACK CFI b5fc1 $r12: .cfa -48 + ^ +STACK CFI b5fc7 $rbx: .cfa -56 + ^ +STACK CFI INIT b6090 1bfc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b6091 .cfa: $rsp 16 + +STACK CFI b6094 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI b609d $r15: .cfa -24 + ^ +STACK CFI b60a4 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI b60a9 $r12: .cfa -48 + ^ +STACK CFI b60b4 $rbx: .cfa -56 + ^ +STACK CFI INIT b7c90 615 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b7c9d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI b7cb5 .cfa: $rsp 112 + +STACK CFI b7cb8 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT b82b0 d1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b82b2 .cfa: $rsp 16 + +STACK CFI b82c2 .cfa: $rsp 24 + +STACK CFI b82c4 .cfa: $rsp 32 + +STACK CFI b82c6 .cfa: $rsp 40 + +STACK CFI b82c7 .cfa: $rsp 48 + +STACK CFI b82c8 .cfa: $rsp 56 + +STACK CFI b82cf .cfa: $rsp 416 + +STACK CFI b830f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT b8fd0 925 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b8fd1 .cfa: $rsp 16 + +STACK CFI b8fd9 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI b8fe4 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI b9000 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI INIT b9940 58 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c921f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI c922d .cfa: $rsp 0 + +STACK CFI c9231 .cfa: $rsp 128 + +STACK CFI c9239 .cfa: $rsp -128 + +STACK CFI INIT c923e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI c924c .cfa: $rsp 0 + +STACK CFI c9250 .cfa: $rsp 128 + +STACK CFI c9258 .cfa: $rsp -128 + +STACK CFI INIT c925d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI c926b .cfa: $rsp 0 + +STACK CFI c926f .cfa: $rsp 128 + +STACK CFI c9277 .cfa: $rsp -128 + +STACK CFI INIT c927c 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI c928a .cfa: $rsp 0 + +STACK CFI c928e .cfa: $rsp 128 + +STACK CFI c9296 .cfa: $rsp -128 + +STACK CFI INIT b99a0 5c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b9a00 e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b9a10 91 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b9ab0 63 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b9b20 141 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b9c70 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b9c90 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b9cd0 213 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b9cd2 .cfa: $rsp 16 + +STACK CFI b9cd7 .cfa: $rsp 24 + +STACK CFI b9cd9 .cfa: $rsp 32 + +STACK CFI b9cdb .cfa: $rsp 40 + +STACK CFI b9cde $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI b9ce3 .cfa: $rsp 48 + +STACK CFI b9ce4 .cfa: $rsp 56 + +STACK CFI b9ce8 .cfa: $rsp 144 + +STACK CFI b9d0f $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT b9ef0 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b9f70 1c7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b9f7d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI b9f8a $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ +STACK CFI b9f9a .cfa: $rsp 112 + +STACK CFI b9fad $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ +STACK CFI INIT ba140 2ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba142 .cfa: $rsp 16 + +STACK CFI ba143 .cfa: $rsp 24 + +STACK CFI ba146 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI ba147 .cfa: $rsp 32 + +STACK CFI ba14a $rbx: .cfa -32 + ^ +STACK CFI ba14e .cfa: $rsp 48 + +STACK CFI INIT ba3f0 5f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba3f2 .cfa: $rsp 16 + +STACK CFI ba3f5 $r12: .cfa -16 + ^ +STACK CFI ba3f6 .cfa: $rsp 24 + +STACK CFI ba3f9 $rbp: .cfa -24 + ^ +STACK CFI ba3fa .cfa: $rsp 32 + +STACK CFI ba3fd $rbx: .cfa -32 + ^ +STACK CFI INIT ba450 53 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba452 .cfa: $rsp 16 + +STACK CFI ba455 $r12: .cfa -16 + ^ +STACK CFI ba456 .cfa: $rsp 24 + +STACK CFI ba459 $rbp: .cfa -24 + ^ +STACK CFI ba45a .cfa: $rsp 32 + +STACK CFI ba45d $rbx: .cfa -32 + ^ +STACK CFI INIT ba4b0 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba4b1 .cfa: $rsp 16 + +STACK CFI ba4b9 $rbx: .cfa -16 + ^ +STACK CFI INIT ba4e0 57 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba4ed $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI ba4f1 .cfa: $rsp 32 + +STACK CFI INIT ba540 fc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba541 .cfa: $rsp 16 + +STACK CFI ba544 $rbx: .cfa -16 + ^ +STACK CFI ba548 .cfa: $rsp 48 + +STACK CFI INIT ba640 a4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba642 .cfa: $rsp 16 + +STACK CFI ba645 $r13: .cfa -16 + ^ +STACK CFI ba647 .cfa: $rsp 24 + +STACK CFI ba648 .cfa: $rsp 32 + +STACK CFI ba649 .cfa: $rsp 40 + +STACK CFI ba64c $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ba650 .cfa: $rsp 64 + +STACK CFI INIT ba6f0 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba6f4 .cfa: $rsp 32 + +STACK CFI INIT ba710 1ba .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba71d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI ba735 .cfa: $rsp 80 + +STACK CFI ba741 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT ba8d0 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba8de .cfa: $rsp 48 + +STACK CFI ba8e5 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT ba960 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba961 .cfa: $rsp 16 + +STACK CFI ba964 $rbx: .cfa -16 + ^ +STACK CFI INIT ba9c0 e5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ba9c2 .cfa: $rsp 16 + +STACK CFI ba9c4 .cfa: $rsp 24 + +STACK CFI ba9c6 .cfa: $rsp 32 + +STACK CFI ba9c8 .cfa: $rsp 40 + +STACK CFI ba9c9 .cfa: $rsp 48 + +STACK CFI ba9ca .cfa: $rsp 56 + +STACK CFI ba9ce .cfa: $rsp 80 + +STACK CFI ba9d5 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT baab0 5a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI baab2 .cfa: $rsp 16 + +STACK CFI baab6 .cfa: $rsp 24 + +STACK CFI baab9 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI baaba .cfa: $rsp 32 + +STACK CFI baabc $rbx: .cfa -32 + ^ +STACK CFI INIT bab10 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bab11 .cfa: $rsp 16 + +STACK CFI bab14 $rbx: .cfa -16 + ^ +STACK CFI INIT bab50 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bab51 .cfa: $rsp 16 + +STACK CFI bab54 $rbx: .cfa -16 + ^ +STACK CFI INIT baba0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT babd0 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI babd8 .cfa: $rsp 16 + +STACK CFI INIT babf0 5a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI babf1 .cfa: $rsp 16 + +STACK CFI babf2 .cfa: $rsp 24 + +STACK CFI babf6 .cfa: $rsp 32 + +STACK CFI babf9 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT bac50 18c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bac52 .cfa: $rsp 16 + +STACK CFI bac54 .cfa: $rsp 24 + +STACK CFI bac56 .cfa: $rsp 32 + +STACK CFI bac59 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI bac5b .cfa: $rsp 40 + +STACK CFI bac5c .cfa: $rsp 48 + +STACK CFI bac5d .cfa: $rsp 56 + +STACK CFI bac61 .cfa: $rsp 64 + +STACK CFI bac69 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT bade0 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bade1 .cfa: $rsp 16 + +STACK CFI bade4 $rbx: .cfa -16 + ^ +STACK CFI INIT 1364c0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT bae30 ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bae3d $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI bae46 .cfa: $rsp 32 + +STACK CFI bae48 $rbp: .cfa -24 + ^ +STACK CFI INIT baee0 231 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI baef3 .cfa: $rsp 32 + +STACK CFI baefa $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT bb120 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bb12d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI bb136 .cfa: $rsp 32 + +STACK CFI bb13e $r12: .cfa -16 + ^ +STACK CFI INIT bb1d0 6c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bb1de .cfa: $rsp 32 + +STACK CFI bb1e6 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT bb240 f7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bb242 .cfa: $rsp 16 + +STACK CFI bb245 $r15: .cfa -16 + ^ +STACK CFI bb247 .cfa: $rsp 24 + +STACK CFI bb24b $r14: .cfa -24 + ^ +STACK CFI bb24d .cfa: $rsp 32 + +STACK CFI bb24f .cfa: $rsp 40 + +STACK CFI bb250 .cfa: $rsp 48 + +STACK CFI bb253 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI bb257 .cfa: $rsp 56 + +STACK CFI bb25a $rbx: .cfa -56 + ^ +STACK CFI bb25e .cfa: $rsp 80 + +STACK CFI INIT bb340 1c0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bb342 .cfa: $rsp 16 + +STACK CFI bb346 .cfa: $rsp 24 + +STACK CFI bb349 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI bb34a .cfa: $rsp 32 + +STACK CFI bb34d $rbx: .cfa -32 + ^ +STACK CFI INIT bb500 14b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bb50e .cfa: $rsp 32 + +STACK CFI bb513 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT bb650 d4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bb652 .cfa: $rsp 16 + +STACK CFI bb655 $r15: .cfa -16 + ^ +STACK CFI bb657 .cfa: $rsp 24 + +STACK CFI bb65a $r14: .cfa -24 + ^ +STACK CFI bb65c .cfa: $rsp 32 + +STACK CFI bb65f $r13: .cfa -32 + ^ +STACK CFI bb661 .cfa: $rsp 40 + +STACK CFI bb664 $r12: .cfa -40 + ^ +STACK CFI bb665 .cfa: $rsp 48 + +STACK CFI bb668 $rbp: .cfa -48 + ^ +STACK CFI bb669 .cfa: $rsp 56 + +STACK CFI bb66d .cfa: $rsp 64 + +STACK CFI bb66f $rbx: .cfa -56 + ^ +STACK CFI INIT bb730 128 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bb732 .cfa: $rsp 16 + +STACK CFI bb735 $r15: .cfa -16 + ^ +STACK CFI bb737 .cfa: $rsp 24 + +STACK CFI bb739 .cfa: $rsp 32 + +STACK CFI bb73b .cfa: $rsp 40 + +STACK CFI bb73e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI bb73f .cfa: $rsp 48 + +STACK CFI bb741 $rbp: .cfa -48 + ^ +STACK CFI bb742 .cfa: $rsp 56 + +STACK CFI bb744 $rbx: .cfa -56 + ^ +STACK CFI bb748 .cfa: $rsp 96 + +STACK CFI INIT bb860 223 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bb862 .cfa: $rsp 16 + +STACK CFI bb864 .cfa: $rsp 24 + +STACK CFI bb866 .cfa: $rsp 32 + +STACK CFI bb868 .cfa: $rsp 40 + +STACK CFI bb869 .cfa: $rsp 48 + +STACK CFI bb86c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI bb86d .cfa: $rsp 56 + +STACK CFI bb870 $rbx: .cfa -56 + ^ +STACK CFI bb874 .cfa: $rsp 80 + +STACK CFI INIT bba90 79 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bba91 .cfa: $rsp 16 + +STACK CFI bba94 $rbp: .cfa -16 + ^ +STACK CFI bba95 .cfa: $rsp 24 + +STACK CFI bba98 $rbx: .cfa -24 + ^ +STACK CFI bba9c .cfa: $rsp 32 + +STACK CFI INIT bbb10 1f4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bbb1d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI bbb2a $r14: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI bbb38 .cfa: $rsp 64 + +STACK CFI bbb44 $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI INIT bbd10 230 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bbd12 .cfa: $rsp 16 + +STACK CFI bbd14 .cfa: $rsp 24 + +STACK CFI bbd16 .cfa: $rsp 32 + +STACK CFI bbd19 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI bbd1f .cfa: $rsp 40 + +STACK CFI bbd22 $r12: .cfa -40 + ^ +STACK CFI bbd23 .cfa: $rsp 48 + +STACK CFI bbd26 $rbp: .cfa -48 + ^ +STACK CFI bbd27 .cfa: $rsp 56 + +STACK CFI bbd2a $rbx: .cfa -56 + ^ +STACK CFI bbd2e .cfa: $rsp 128 + +STACK CFI INIT bbf40 1d1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bbf4d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI bbf65 .cfa: $rsp 96 + +STACK CFI bbf80 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT bc120 b9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bc12d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI bc13b .cfa: $rsp 48 + +STACK CFI bc145 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT bc1e0 2d1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bc1e2 .cfa: $rsp 16 + +STACK CFI bc1e4 .cfa: $rsp 24 + +STACK CFI bc1e7 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI bc1e9 .cfa: $rsp 32 + +STACK CFI bc1eb .cfa: $rsp 40 + +STACK CFI bc1ee $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI bc1ef .cfa: $rsp 48 + +STACK CFI bc1f2 $rbp: .cfa -48 + ^ +STACK CFI bc1f3 .cfa: $rsp 56 + +STACK CFI bc1f7 .cfa: $rsp 96 + +STACK CFI bc207 $rbx: .cfa -56 + ^ +STACK CFI INIT bc4c0 230 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bc4c2 .cfa: $rsp 16 + +STACK CFI bc4c4 .cfa: $rsp 24 + +STACK CFI bc4c6 .cfa: $rsp 32 + +STACK CFI bc4c8 .cfa: $rsp 40 + +STACK CFI bc4c9 .cfa: $rsp 48 + +STACK CFI bc4cc $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI bc4d1 .cfa: $rsp 56 + +STACK CFI bc4d4 $rbx: .cfa -56 + ^ +STACK CFI bc4d8 .cfa: $rsp 128 + +STACK CFI INIT bc6f0 9c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bc6f1 .cfa: $rsp 16 + +STACK CFI bc6f4 $rbp: .cfa -16 + ^ +STACK CFI bc6f5 .cfa: $rsp 24 + +STACK CFI bc6f8 $rbx: .cfa -24 + ^ +STACK CFI bc6fc .cfa: $rsp 32 + +STACK CFI INIT bc790 1db .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bc792 .cfa: $rsp 16 + +STACK CFI bc794 .cfa: $rsp 24 + +STACK CFI bc796 .cfa: $rsp 32 + +STACK CFI bc798 .cfa: $rsp 40 + +STACK CFI bc799 .cfa: $rsp 48 + +STACK CFI bc79c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI bc79d .cfa: $rsp 56 + +STACK CFI bc7a1 .cfa: $rsp 112 + +STACK CFI bc7ab $rbx: .cfa -56 + ^ +STACK CFI INIT bc970 cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bc971 .cfa: $rsp 16 + +STACK CFI bc972 .cfa: $rsp 24 + +STACK CFI bc975 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI bc979 .cfa: $rsp 32 + +STACK CFI INIT bca40 118 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bca4a .cfa: $rsp 16 + +STACK CFI bca5b $rbx: .cfa -16 + ^ +STACK CFI INIT bcb60 b2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bcb61 .cfa: $rsp 16 + +STACK CFI bcb64 $rbp: .cfa -16 + ^ +STACK CFI bcb67 .cfa: $rsp 24 + +STACK CFI bcb6a $rbx: .cfa -24 + ^ +STACK CFI bcb6e .cfa: $rsp 32 + +STACK CFI INIT bcc20 70f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bcc2d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI bcc43 .cfa: $rsp 80 + +STACK CFI bcc4f $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT bd330 2e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bd33e .cfa: $rsp 32 + +STACK CFI bd341 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT bd360 9b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bd362 .cfa: $rsp 16 + +STACK CFI bd368 $r14: .cfa -16 + ^ +STACK CFI bd36a .cfa: $rsp 24 + +STACK CFI bd36d $r13: .cfa -24 + ^ +STACK CFI bd36f .cfa: $rsp 32 + +STACK CFI bd372 $r12: .cfa -32 + ^ +STACK CFI bd373 .cfa: $rsp 40 + +STACK CFI bd378 $rbp: .cfa -40 + ^ +STACK CFI bd379 .cfa: $rsp 48 + +STACK CFI bd37c $rbx: .cfa -48 + ^ +STACK CFI INIT bd400 66c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bd402 .cfa: $rsp 16 + +STACK CFI bd404 .cfa: $rsp 24 + +STACK CFI bd406 .cfa: $rsp 32 + +STACK CFI bd408 .cfa: $rsp 40 + +STACK CFI bd409 .cfa: $rsp 48 + +STACK CFI bd40a .cfa: $rsp 56 + +STACK CFI bd40d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI bd411 .cfa: $rsp 176 + +STACK CFI INIT bda70 ec .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT bdb60 700 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bdb6c $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI bdb87 .cfa: $rsp 128 + +STACK CFI bdb8d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT be260 112 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI be261 .cfa: $rsp 16 + +STACK CFI be262 .cfa: $rsp 24 + +STACK CFI be265 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI be269 .cfa: $rsp 32 + +STACK CFI INIT be380 9a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI be38d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI be396 .cfa: $rsp 32 + +STACK CFI be3a2 $r12: .cfa -16 + ^ +STACK CFI INIT be420 38d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI be422 .cfa: $rsp 16 + +STACK CFI be425 $r15: .cfa -16 + ^ +STACK CFI be427 .cfa: $rsp 24 + +STACK CFI be429 .cfa: $rsp 32 + +STACK CFI be42b .cfa: $rsp 40 + +STACK CFI be42e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI be42f .cfa: $rsp 48 + +STACK CFI be430 .cfa: $rsp 56 + +STACK CFI be433 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI be437 .cfa: $rsp 112 + +STACK CFI INIT be7b0 15d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI be7b2 .cfa: $rsp 16 + +STACK CFI be7b4 .cfa: $rsp 24 + +STACK CFI be7b6 .cfa: $rsp 32 + +STACK CFI be7b8 .cfa: $rsp 40 + +STACK CFI be7b9 .cfa: $rsp 48 + +STACK CFI be7bc $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI be7bd .cfa: $rsp 56 + +STACK CFI be7c0 $rbx: .cfa -56 + ^ +STACK CFI be7c4 .cfa: $rsp 96 + +STACK CFI INIT be910 253 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI be912 .cfa: $rsp 16 + +STACK CFI be914 .cfa: $rsp 24 + +STACK CFI be917 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI be919 .cfa: $rsp 32 + +STACK CFI be91b .cfa: $rsp 40 + +STACK CFI be91e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI be91f .cfa: $rsp 48 + +STACK CFI be922 $rbp: .cfa -48 + ^ +STACK CFI be923 .cfa: $rsp 56 + +STACK CFI be927 .cfa: $rsp 64 + +STACK CFI be935 $rbx: .cfa -56 + ^ +STACK CFI INIT beb70 259 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI beb72 .cfa: $rsp 16 + +STACK CFI beb74 .cfa: $rsp 24 + +STACK CFI beb76 .cfa: $rsp 32 + +STACK CFI beb78 .cfa: $rsp 40 + +STACK CFI beb7b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI beb7c .cfa: $rsp 48 + +STACK CFI beb7e $rbp: .cfa -48 + ^ +STACK CFI beb7f .cfa: $rsp 56 + +STACK CFI beb82 $rbx: .cfa -56 + ^ +STACK CFI beb88 .cfa: $rsp 160 + +STACK CFI INIT bedd0 d1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bedd2 .cfa: $rsp 16 + +STACK CFI bedd5 $r15: .cfa -16 + ^ +STACK CFI bedd7 .cfa: $rsp 24 + +STACK CFI bedd9 .cfa: $rsp 32 + +STACK CFI beddb .cfa: $rsp 40 + +STACK CFI beddc .cfa: $rsp 48 + +STACK CFI beddf $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI bede0 .cfa: $rsp 56 + +STACK CFI bede3 $rbx: .cfa -56 + ^ +STACK CFI bede7 .cfa: $rsp 112 + +STACK CFI INIT beeb0 b3d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI beeb2 .cfa: $rsp 16 + +STACK CFI beebb .cfa: $rsp 24 + +STACK CFI beebd .cfa: $rsp 32 + +STACK CFI beebf .cfa: $rsp 40 + +STACK CFI beec2 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI beec3 .cfa: $rsp 48 + +STACK CFI beec4 .cfa: $rsp 56 + +STACK CFI beec7 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI beecb .cfa: $rsp 160 + +STACK CFI INIT bf9f0 775 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bf9f2 .cfa: $rsp 16 + +STACK CFI bf9f4 .cfa: $rsp 24 + +STACK CFI bf9f6 .cfa: $rsp 32 + +STACK CFI bf9f8 .cfa: $rsp 40 + +STACK CFI bf9f9 .cfa: $rsp 48 + +STACK CFI bf9fb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI bf9fc .cfa: $rsp 56 + +STACK CFI bf9fe $rbx: .cfa -56 + ^ +STACK CFI bfa05 .cfa: $rsp 240 + +STACK CFI INIT c0170 215 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c017d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI c018a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI c0198 .cfa: $rsp 96 + +STACK CFI c019b $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT c0390 7ec .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c0392 .cfa: $rsp 16 + +STACK CFI c0394 .cfa: $rsp 24 + +STACK CFI c0396 .cfa: $rsp 32 + +STACK CFI c0398 .cfa: $rsp 40 + +STACK CFI c039b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI c039c .cfa: $rsp 48 + +STACK CFI c039d .cfa: $rsp 56 + +STACK CFI c03a4 .cfa: $rsp 288 + +STACK CFI c03c9 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT c0b80 1dd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c0b8d $r13: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI c0ba8 .cfa: $rsp 96 + +STACK CFI c0bab $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI INIT c0d60 35d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c0d62 .cfa: $rsp 16 + +STACK CFI c0d64 .cfa: $rsp 24 + +STACK CFI c0d66 .cfa: $rsp 32 + +STACK CFI c0d68 .cfa: $rsp 40 + +STACK CFI c0d69 .cfa: $rsp 48 + +STACK CFI c0d6a .cfa: $rsp 56 + +STACK CFI c0d71 .cfa: $rsp 192 + +STACK CFI c0d92 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT c10c0 835 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c10c2 .cfa: $rsp 16 + +STACK CFI c10c7 .cfa: $rsp 24 + +STACK CFI c10c9 .cfa: $rsp 32 + +STACK CFI c10cb .cfa: $rsp 40 + +STACK CFI c10ce $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI c10cf .cfa: $rsp 48 + +STACK CFI c10d0 .cfa: $rsp 56 + +STACK CFI c10d3 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI c10da .cfa: $rsp 240 + +STACK CFI INIT c1900 da8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c1901 .cfa: $rsp 16 + +STACK CFI c1904 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI c190d $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI c1923 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT c26b0 834 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c26b1 .cfa: $rsp 16 + +STACK CFI c26b7 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI c26c3 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT c2ef0 1592 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c2ef2 .cfa: $rsp 16 + +STACK CFI c2ef4 .cfa: $rsp 24 + +STACK CFI c2ef6 .cfa: $rsp 32 + +STACK CFI c2ef8 .cfa: $rsp 40 + +STACK CFI c2efb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI c2efc .cfa: $rsp 48 + +STACK CFI c2efd .cfa: $rsp 56 + +STACK CFI c2eff $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI c2f0b .cfa: $rsp 528 + +STACK CFI INIT c4490 133 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c449d $r12: .cfa -32 + ^ $rbx: .cfa -48 + ^ +STACK CFI c44aa $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI c44b3 .cfa: $rsp 96 + +STACK CFI c44c3 $rbp: .cfa -40 + ^ +STACK CFI INIT c45d0 27 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c45de .cfa: $rsp 16 + +STACK CFI INIT 1119e0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c4600 c8e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c4602 .cfa: $rsp 16 + +STACK CFI c4604 .cfa: $rsp 24 + +STACK CFI c4607 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI c4609 .cfa: $rsp 32 + +STACK CFI c460c $r13: .cfa -32 + ^ +STACK CFI c460e .cfa: $rsp 40 + +STACK CFI c4611 $r12: .cfa -40 + ^ +STACK CFI c4612 .cfa: $rsp 48 + +STACK CFI c4615 $rbp: .cfa -48 + ^ +STACK CFI c4616 .cfa: $rsp 56 + +STACK CFI c4619 $rbx: .cfa -56 + ^ +STACK CFI c461d .cfa: $rsp 64 + +STACK CFI INIT c5290 1cc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c5292 .cfa: $rsp 16 + +STACK CFI c5295 $r15: .cfa -16 + ^ +STACK CFI c5297 .cfa: $rsp 24 + +STACK CFI c529a $r14: .cfa -24 + ^ +STACK CFI c529c .cfa: $rsp 32 + +STACK CFI c529e .cfa: $rsp 40 + +STACK CFI c52a1 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI c52a7 .cfa: $rsp 48 + +STACK CFI c52aa $rbp: .cfa -48 + ^ +STACK CFI c52ab .cfa: $rsp 56 + +STACK CFI c52af .cfa: $rsp 128 + +STACK CFI c52c6 $rbx: .cfa -56 + ^ +STACK CFI INIT c5460 a6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c546d $r12: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI c547b .cfa: $rsp 48 + +STACK CFI c5483 $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT c5510 6cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c5511 .cfa: $rsp 16 + +STACK CFI c5514 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI c551b $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI c5522 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ +STACK CFI c5525 $rbx: .cfa -56 + ^ +STACK CFI INIT c5be0 122 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c5be2 .cfa: $rsp 16 + +STACK CFI c5be8 .cfa: $rsp 24 + +STACK CFI c5be9 .cfa: $rsp 32 + +STACK CFI c5bed $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT c5d10 495 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c5d12 .cfa: $rsp 16 + +STACK CFI c5d14 .cfa: $rsp 24 + +STACK CFI c5d17 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI c5d19 .cfa: $rsp 32 + +STACK CFI c5d1c $r13: .cfa -32 + ^ +STACK CFI c5d1e .cfa: $rsp 40 + +STACK CFI c5d1f .cfa: $rsp 48 + +STACK CFI c5d20 .cfa: $rsp 56 + +STACK CFI c5d24 .cfa: $rsp 160 + +STACK CFI c5d36 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT c61b0 112 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c61bd $r13: .cfa -24 + ^ $rbp: .cfa -40 + ^ +STACK CFI c61ca $r14: .cfa -16 + ^ $rbx: .cfa -48 + ^ +STACK CFI c61d3 .cfa: $rsp 96 + +STACK CFI c61e7 $r12: .cfa -32 + ^ +STACK CFI INIT c62d0 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c62d4 .cfa: $rsp 48 + +STACK CFI INIT c6300 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c6304 .cfa: $rsp 48 + +STACK CFI INIT c6330 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c6334 .cfa: $rsp 32 + +STACK CFI INIT c6350 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c6354 .cfa: $rsp 32 + +STACK CFI INIT c6370 1daf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c6372 .cfa: $rsp 16 + +STACK CFI c6378 $r15: .cfa -16 + ^ +STACK CFI c637d .cfa: $rsp 24 + +STACK CFI c6380 $r14: .cfa -24 + ^ +STACK CFI c6389 .cfa: $rsp 32 + +STACK CFI c6390 $r13: .cfa -32 + ^ +STACK CFI c6392 .cfa: $rsp 40 + +STACK CFI c6395 $r12: .cfa -40 + ^ +STACK CFI c6396 .cfa: $rsp 48 + +STACK CFI c6399 $rbp: .cfa -48 + ^ +STACK CFI c639a .cfa: $rsp 56 + +STACK CFI c63a1 .cfa: $rsp 448 + +STACK CFI c63bc $rbx: .cfa -56 + ^ +STACK CFI INIT c8120 145 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c8122 .cfa: $rsp 16 + +STACK CFI c8125 $r15: .cfa -16 + ^ +STACK CFI c8127 .cfa: $rsp 24 + +STACK CFI c8129 .cfa: $rsp 32 + +STACK CFI c812c $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI c812e .cfa: $rsp 40 + +STACK CFI c812f .cfa: $rsp 48 + +STACK CFI c8132 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI c8133 .cfa: $rsp 56 + +STACK CFI c8136 $rbx: .cfa -56 + ^ +STACK CFI c813a .cfa: $rsp 96 + +STACK CFI INIT c8270 fd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c8272 .cfa: $rsp 16 + +STACK CFI c8274 .cfa: $rsp 24 + +STACK CFI c8276 .cfa: $rsp 32 + +STACK CFI c8279 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI c827b .cfa: $rsp 40 + +STACK CFI c827e $r12: .cfa -40 + ^ +STACK CFI c827f .cfa: $rsp 48 + +STACK CFI c8280 .cfa: $rsp 56 + +STACK CFI c8283 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI c8287 .cfa: $rsp 96 + +STACK CFI INIT c8370 bad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c8372 .cfa: $rsp 16 + +STACK CFI c8375 $r15: .cfa -16 + ^ +STACK CFI c8377 .cfa: $rsp 24 + +STACK CFI c8379 .cfa: $rsp 32 + +STACK CFI c837b .cfa: $rsp 40 + +STACK CFI c837e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI c837f .cfa: $rsp 48 + +STACK CFI c8382 $rbp: .cfa -48 + ^ +STACK CFI c8383 .cfa: $rsp 56 + +STACK CFI c838a .cfa: $rsp 256 + +STACK CFI c83b1 $rbx: .cfa -56 + ^ +STACK CFI INIT c8f20 138 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c8f2d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI c8f36 .cfa: $rsp 32 + +STACK CFI c8f3f $r12: .cfa -16 + ^ +STACK CFI INIT c9060 79 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c9064 .cfa: $rsp 16 + +STACK CFI INIT c90e0 13f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c9102 .cfa: $rsp 48 + +STACK CFI c9108 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT c92a0 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c92b0 4a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c92be .cfa: $rsp 32 + +STACK CFI c92c0 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT c9300 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c9304 .cfa: $rsp 16 + +STACK CFI INIT c9320 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c932d $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI c9331 .cfa: $rsp 32 + +STACK CFI INIT c93b0 b8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c93bd $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI c93d7 .cfa: $rsp 48 + +STACK CFI c93da $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT c9470 98 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c947d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI c948b .cfa: $rsp 32 + +STACK CFI c948e $r12: .cfa -16 + ^ +STACK CFI INIT c9510 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9520 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9530 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c95c0 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9650 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9660 13 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9680 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9690 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c96a0 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c96a4 .cfa: $rsp 32 + +STACK CFI INIT c96c0 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c96c4 .cfa: $rsp 32 + +STACK CFI INIT c96e0 84 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c96e1 .cfa: $rsp 16 + +STACK CFI c96e9 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI c96ff $rbx: .cfa -24 + ^ +STACK CFI INIT c9770 59a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c9771 .cfa: $rsp 16 + +STACK CFI c9779 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI c97c2 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT c9d10 8c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9da0 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9db0 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9dc0 8c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9e50 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9e70 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c9e80 d9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c9e81 .cfa: $rsp 16 + +STACK CFI c9e89 .cfa: $rsp 24 + +STACK CFI c9e90 .cfa: $rsp 1328 + +STACK CFI c9e93 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT c9f60 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c9f6b .cfa: $rsp 16 + +STACK CFI INIT ca409 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI ca417 .cfa: $rsp 0 + +STACK CFI ca41b .cfa: $rsp 128 + +STACK CFI ca423 .cfa: $rsp -128 + +STACK CFI INIT ca428 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI ca436 .cfa: $rsp 0 + +STACK CFI ca43a .cfa: $rsp 128 + +STACK CFI ca442 .cfa: $rsp -128 + +STACK CFI INIT c9fa0 1b5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c9fc0 .cfa: $rsp 1344 + +STACK CFI c9fc3 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT ca160 255 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ca161 .cfa: $rsp 16 + +STACK CFI ca166 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI ca16d $r12: .cfa -48 + ^ +STACK CFI ca17f $r14: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI ca190 $r13: .cfa -40 + ^ $r15: .cfa -24 + ^ +STACK CFI INIT ca3c0 49 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ca3ce .cfa: $rsp 32 + +STACK CFI ca3d1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT ca450 5c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ca451 .cfa: $rsp 16 + +STACK CFI ca454 $rbp: .cfa -16 + ^ +STACK CFI ca455 .cfa: $rsp 24 + +STACK CFI ca459 .cfa: $rsp 32 + +STACK CFI ca45e $rbx: .cfa -24 + ^ +STACK CFI INIT ca4b0 b3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ca4bd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI ca4c6 .cfa: $rsp 48 + +STACK CFI ca4d2 $r12: .cfa -16 + ^ +STACK CFI INIT ca570 63 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ca571 .cfa: $rsp 16 + +STACK CFI ca574 $rbx: .cfa -16 + ^ +STACK CFI ca578 .cfa: $rsp 32 + +STACK CFI INIT ca5e0 ee .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ca5ed $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI ca5fa $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI ca603 .cfa: $rsp 48 + +STACK CFI ca60f $r14: .cfa -16 + ^ +STACK CFI INIT ca6d0 c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ca6dd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI ca6e6 .cfa: $rsp 32 + +STACK CFI ca6e9 $r12: .cfa -16 + ^ +STACK CFI INIT ca7a0 e9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ca7ad $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI ca7ba $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI ca7c3 .cfa: $rsp 48 + +STACK CFI ca7d8 $r14: .cfa -16 + ^ +STACK CFI INIT ca890 7a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ca892 .cfa: $rsp 16 + +STACK CFI ca895 $r15: .cfa -16 + ^ +STACK CFI ca897 .cfa: $rsp 24 + +STACK CFI ca899 .cfa: $rsp 32 + +STACK CFI ca89b .cfa: $rsp 40 + +STACK CFI ca89c .cfa: $rsp 48 + +STACK CFI ca89d .cfa: $rsp 56 + +STACK CFI ca8a0 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI ca8a7 .cfa: $rsp 448 + +STACK CFI INIT cb040 1a7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cb042 .cfa: $rsp 16 + +STACK CFI cb044 .cfa: $rsp 24 + +STACK CFI cb046 .cfa: $rsp 32 + +STACK CFI cb048 .cfa: $rsp 40 + +STACK CFI cb049 .cfa: $rsp 48 + +STACK CFI cb04c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI cb04d .cfa: $rsp 56 + +STACK CFI cb050 $rbx: .cfa -56 + ^ +STACK CFI cb054 .cfa: $rsp 160 + +STACK CFI INIT cb1f0 12e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cb1f2 .cfa: $rsp 16 + +STACK CFI cb1f5 $r12: .cfa -16 + ^ +STACK CFI cb1f6 .cfa: $rsp 24 + +STACK CFI cb1f9 $rbp: .cfa -24 + ^ +STACK CFI cb1fa .cfa: $rsp 32 + +STACK CFI cb1fd $rbx: .cfa -32 + ^ +STACK CFI INIT cb320 10f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cb322 .cfa: $rsp 16 + +STACK CFI cb323 .cfa: $rsp 24 + +STACK CFI cb326 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI cb327 .cfa: $rsp 32 + +STACK CFI cb32a $rbx: .cfa -32 + ^ +STACK CFI cb32e .cfa: $rsp 48 + +STACK CFI INIT cb430 10b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cb432 .cfa: $rsp 16 + +STACK CFI cb433 .cfa: $rsp 24 + +STACK CFI cb434 .cfa: $rsp 32 + +STACK CFI cb437 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI cb43b .cfa: $rsp 64 + +STACK CFI INIT cb540 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cb54d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI cb55b .cfa: $rsp 48 + +STACK CFI cb564 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT cb5c0 3ea .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cb5c1 .cfa: $rsp 16 + +STACK CFI cb5c4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI cb5f2 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT cb9b0 17e6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cb9b2 .cfa: $rsp 16 + +STACK CFI cb9b4 .cfa: $rsp 24 + +STACK CFI cb9b6 .cfa: $rsp 32 + +STACK CFI cb9b8 .cfa: $rsp 40 + +STACK CFI cb9bb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI cb9bc .cfa: $rsp 48 + +STACK CFI cb9bd .cfa: $rsp 56 + +STACK CFI cb9c0 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI cb9c7 .cfa: $rsp 320 + +STACK CFI INIT cd1a0 414 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cd1a2 .cfa: $rsp 16 + +STACK CFI cd1a4 .cfa: $rsp 24 + +STACK CFI cd1a6 .cfa: $rsp 32 + +STACK CFI cd1a8 .cfa: $rsp 40 + +STACK CFI cd1a9 .cfa: $rsp 48 + +STACK CFI cd1ac $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI cd1ad .cfa: $rsp 56 + +STACK CFI cd1b0 $rbx: .cfa -56 + ^ +STACK CFI cd1b7 .cfa: $rsp 208 + +STACK CFI INIT cd5c0 cd7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cd5c2 .cfa: $rsp 16 + +STACK CFI cd5c5 $r15: .cfa -16 + ^ +STACK CFI cd5c7 .cfa: $rsp 24 + +STACK CFI cd5c9 .cfa: $rsp 32 + +STACK CFI cd5cb .cfa: $rsp 40 + +STACK CFI cd5cc .cfa: $rsp 48 + +STACK CFI cd5cd .cfa: $rsp 56 + +STACK CFI cd5d0 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI cd5d7 .cfa: $rsp 400 + +STACK CFI INIT ce2a0 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce2c0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce2f0 45 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ce2f4 .cfa: $rsp 16 + +STACK CFI ce31f .cfa: $rsp 8 + +STACK CFI INIT ce340 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce370 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ce374 .cfa: $rsp 32 + +STACK CFI INIT ce3a0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ce3a4 .cfa: $rsp 32 + +STACK CFI INIT ce3d0 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce420 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce470 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce4c0 54 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce520 54 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce580 4c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce5d0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce600 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce630 8d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ce63d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ce64e .cfa: $rsp 320 + +STACK CFI ce659 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT ce6c0 8c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ce6cd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ce6de .cfa: $rsp 320 + +STACK CFI ce6e9 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT ce750 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce760 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce790 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce7c0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce830 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce860 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce890 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ce8ad .cfa: $rsp 16 + +STACK CFI ce8d0 .cfa: $rsp 8 + +STACK CFI INIT ce8f0 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce920 d8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ce924 .cfa: $rsp 128 + +STACK CFI INIT cea00 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cea04 .cfa: $rsp 16 + +STACK CFI INIT cea20 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cea3d .cfa: $rsp 16 + +STACK CFI cea60 .cfa: $rsp 8 + +STACK CFI INIT cea80 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cea9d .cfa: $rsp 16 + +STACK CFI ceac0 .cfa: $rsp 8 + +STACK CFI INIT ceae0 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ceafd .cfa: $rsp 16 + +STACK CFI ceb20 .cfa: $rsp 8 + +STACK CFI INIT ceb40 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ceb70 13d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ceb7c $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ceb8d .cfa: $rsp 192 + +STACK CFI ceb9b $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT cecb0 183 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cecbc $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI cecc8 .cfa: $rsp 176 + +STACK CFI cecd6 $r12: .cfa -16 + ^ +STACK CFI INIT cee40 ca .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cef10 2e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cef14 .cfa: $rsp 96 + +STACK CFI INIT cef40 7f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cef41 .cfa: $rsp 16 + +STACK CFI cef44 $rbp: .cfa -16 + ^ +STACK CFI cef45 .cfa: $rsp 24 + +STACK CFI cef49 .cfa: $rsp 128 + +STACK CFI cef72 $rbx: .cfa -24 + ^ +STACK CFI INIT cefc0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ceff0 105 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ceff1 .cfa: $rsp 16 + +STACK CFI ceff5 .cfa: $rsp 48 + +STACK CFI cf024 $rbx: .cfa -16 + ^ +STACK CFI INIT cf100 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cf130 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cf160 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cf190 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cf1c0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cf1f0 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cf20d .cfa: $rsp 16 + +STACK CFI cf230 .cfa: $rsp 8 + +STACK CFI INIT cf250 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cf280 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cf2b0 148 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cf2bd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI cf2c6 .cfa: $rsp 48 + +STACK CFI cf2ce $r12: .cfa -16 + ^ +STACK CFI INIT cf400 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cf411 .cfa: $rsp 4128 + +STACK CFI cf417 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT cf490 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cf491 .cfa: $rsp 16 + +STACK CFI cf49f $rbx: .cfa -16 + ^ .cfa: $rsp 304 + +STACK CFI INIT cf520 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cf550 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cf580 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cf5b0 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1119f0 230 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1119f2 .cfa: $rsp 16 + +STACK CFI 1119f4 .cfa: $rsp 24 + +STACK CFI 1119f6 .cfa: $rsp 32 + +STACK CFI 1119f9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 1119fb .cfa: $rsp 40 + +STACK CFI 1119fc .cfa: $rsp 48 + +STACK CFI 1119fd .cfa: $rsp 56 + +STACK CFI 111a00 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 111a07 .cfa: $rsp 272 + +STACK CFI INIT cf5e0 307 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cf5ed $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI cf5fe .cfa: $rsp 448 + +STACK CFI cf61c $r12: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 111c20 1ae .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 111c22 .cfa: $rsp 16 + +STACK CFI 111c24 .cfa: $rsp 24 + +STACK CFI 111c26 .cfa: $rsp 32 + +STACK CFI 111c29 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 111c2b .cfa: $rsp 40 + +STACK CFI 111c2c .cfa: $rsp 48 + +STACK CFI 111c2d .cfa: $rsp 56 + +STACK CFI 111c30 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 111c37 .cfa: $rsp 256 + +STACK CFI INIT cf8f0 31a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cf8fd $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI cf91b .cfa: $rsp 464 + +STACK CFI cf922 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI INIT cfc10 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cfc14 .cfa: $rsp 80 + +STACK CFI INIT cfc30 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cfc60 2d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cfc90 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cfcc0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cfcf0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cfd20 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cfd50 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cfd80 27 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cfdb0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cfde0 93 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cfde4 .cfa: $rsp 48 + +STACK CFI INIT cfe80 c1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cfe84 .cfa: $rsp 64 + +STACK CFI INIT cff50 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cff70 1a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cff7d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI cff95 .cfa: $rsp 320 + +STACK CFI cff9b $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT d0120 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d0121 .cfa: $rsp 16 + +STACK CFI d0126 $rbx: .cfa -16 + ^ +STACK CFI INIT d0170 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d01a0 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d01f0 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d0240 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d0260 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d02a0 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d02ad $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI d02b1 .cfa: $rsp 32 + +STACK CFI INIT d0310 335 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d031d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI d032a $r12: .cfa -32 + ^ $r14: .cfa -16 + ^ +STACK CFI d0336 .cfa: $rsp 224 + +STACK CFI d0345 $r13: .cfa -24 + ^ +STACK CFI INIT d0650 690 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d0652 .cfa: $rsp 16 + +STACK CFI d0654 .cfa: $rsp 24 + +STACK CFI d0656 .cfa: $rsp 32 + +STACK CFI d0658 .cfa: $rsp 40 + +STACK CFI d0659 .cfa: $rsp 48 + +STACK CFI d065a .cfa: $rsp 56 + +STACK CFI d065d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI d0661 .cfa: $rsp 160 + +STACK CFI INIT d0ce0 4cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d0ce1 .cfa: $rsp 16 + +STACK CFI d0ce4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d0cef $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI d0d0b $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI INIT 111dd0 16 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d11b0 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d11f0 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d1200 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d1230 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d1234 .cfa: $rsp 16 + +STACK CFI d1236 $rbx: .cfa -16 + ^ +STACK CFI INIT d1260 c4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d1262 .cfa: $rsp 16 + +STACK CFI d1263 .cfa: $rsp 24 + +STACK CFI d1264 .cfa: $rsp 32 + +STACK CFI d1267 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT d1330 c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d1338 $r12: .cfa -24 + ^ +STACK CFI d134b .cfa: $rsp 48 + +STACK CFI d135f $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT d1400 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d1401 .cfa: $rsp 16 + +STACK CFI d1407 $rbx: .cfa -16 + ^ +STACK CFI INIT d1480 1af .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d148d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI d149e .cfa: $rsp 192 + +STACK CFI d14a8 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT d1630 121 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d163c $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI d1649 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI d1655 .cfa: $rsp 192 + +STACK CFI d165e $r14: .cfa -16 + ^ +STACK CFI INIT d1760 dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d1762 .cfa: $rsp 16 + +STACK CFI d1765 $r12: .cfa -16 + ^ +STACK CFI d1766 .cfa: $rsp 24 + +STACK CFI d1768 $rbp: .cfa -24 + ^ +STACK CFI d1769 .cfa: $rsp 32 + +STACK CFI d176f $rbx: .cfa -32 + ^ +STACK CFI INIT d1840 6b1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d1842 .cfa: $rsp 16 + +STACK CFI d1844 .cfa: $rsp 24 + +STACK CFI d1846 .cfa: $rsp 32 + +STACK CFI d1848 .cfa: $rsp 40 + +STACK CFI d1849 .cfa: $rsp 48 + +STACK CFI d184a .cfa: $rsp 56 + +STACK CFI d184d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI d1851 .cfa: $rsp 176 + +STACK CFI INIT d1f00 13c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d1f0d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI d1f16 .cfa: $rsp 48 + +STACK CFI d1f1e $r12: .cfa -16 + ^ +STACK CFI INIT d2040 2cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d2042 .cfa: $rsp 16 + +STACK CFI d2044 .cfa: $rsp 24 + +STACK CFI d2046 .cfa: $rsp 32 + +STACK CFI d2048 .cfa: $rsp 40 + +STACK CFI d204b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI d204c .cfa: $rsp 48 + +STACK CFI d204f $rbp: .cfa -48 + ^ +STACK CFI d2050 .cfa: $rsp 56 + +STACK CFI d2054 .cfa: $rsp 96 + +STACK CFI d205c $rbx: .cfa -56 + ^ +STACK CFI INIT d2310 54b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d231d $r12: .cfa -32 + ^ $rbx: .cfa -48 + ^ +STACK CFI d2330 .cfa: $rsp 48 + +STACK CFI d2333 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI INIT d2860 4fe .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d2862 .cfa: $rsp 16 + +STACK CFI d2864 .cfa: $rsp 24 + +STACK CFI d2866 .cfa: $rsp 32 + +STACK CFI d2868 .cfa: $rsp 40 + +STACK CFI d2869 .cfa: $rsp 48 + +STACK CFI d286a .cfa: $rsp 56 + +STACK CFI d286d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI d2874 .cfa: $rsp 1312 + +STACK CFI INIT d2d60 ab .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d2d61 .cfa: $rsp 16 + +STACK CFI d2d68 $rbx: .cfa -16 + ^ +STACK CFI INIT d2e10 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d2e40 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d2e44 .cfa: $rsp 16 + +STACK CFI INIT d2e70 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d2e74 .cfa: $rsp 16 + +STACK CFI INIT d2ea0 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d2ed0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d2ee0 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d2f00 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d2f50 54 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d2fb0 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d2fb2 .cfa: $rsp 16 + +STACK CFI d2fc3 $r12: .cfa -16 + ^ +STACK CFI d2fc4 .cfa: $rsp 24 + +STACK CFI d2fc5 .cfa: $rsp 32 + +STACK CFI d2fc7 $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT d3040 1e7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3042 .cfa: $rsp 16 + +STACK CFI d3051 .cfa: $rsp 24 + +STACK CFI d3052 .cfa: $rsp 32 + +STACK CFI d3054 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT d3230 a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d32e0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d32e4 .cfa: $rsp 32 + +STACK CFI INIT d3310 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3314 .cfa: $rsp 32 + +STACK CFI INIT d3330 93 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3334 .cfa: $rsp 32 + +STACK CFI INIT d33d0 e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d33e0 e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d33f0 36 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d3430 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d3460 b7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d346c $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI d3475 .cfa: $rsp 48 + +STACK CFI d347f $r12: .cfa -16 + ^ +STACK CFI INIT d3520 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d3550 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d3580 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d35b0 11e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d35b1 .cfa: $rsp 16 + +STACK CFI d35b5 .cfa: $rsp 112 + +STACK CFI d35da $rbx: .cfa -16 + ^ +STACK CFI INIT d36d0 70 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d36d8 $rbx: .cfa -32 + ^ +STACK CFI d36e6 .cfa: $rsp 48 + +STACK CFI d36e8 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI INIT d3740 e4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3741 .cfa: $rsp 16 + +STACK CFI d3744 $rbx: .cfa -16 + ^ +STACK CFI d374f .cfa: $rsp 160 + +STACK CFI INIT d3830 37 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3831 .cfa: $rsp 16 + +STACK CFI d3834 $rbx: .cfa -16 + ^ +STACK CFI INIT d3870 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d38b0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d38e0 a0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d38f5 .cfa: $rsp 32 + +STACK CFI d38fc $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT d3980 63 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d39f0 a9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d39fd $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI d3a06 .cfa: $rsp 32 + +STACK CFI d3a11 $rbx: .cfa -32 + ^ +STACK CFI INIT d3aa0 16 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d3ac0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d3af0 9b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3af4 .cfa: $rsp 48 + +STACK CFI INIT d3b90 9b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3b94 .cfa: $rsp 48 + +STACK CFI INIT d3c30 17f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3c31 .cfa: $rsp 16 + +STACK CFI d3c34 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d3c3b $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI d3c40 $r13: .cfa -40 + ^ +STACK CFI d3c45 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d3db0 109 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3dbd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI d3dcb .cfa: $rsp 64 + +STACK CFI d3dd4 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT d3ec0 165 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3ec1 .cfa: $rsp 16 + +STACK CFI d3ec4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d3ecf $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI d3ed2 $rbx: .cfa -56 + ^ +STACK CFI INIT d4030 109 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d403d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI d404b .cfa: $rsp 64 + +STACK CFI d4054 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT d4140 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4144 .cfa: $rsp 64 + +STACK CFI INIT d41b0 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d41b4 .cfa: $rsp 64 + +STACK CFI INIT d4220 96 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4224 .cfa: $rsp 64 + +STACK CFI INIT d42c0 96 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d42c4 .cfa: $rsp 64 + +STACK CFI INIT d4360 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4380 23 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4384 .cfa: $rsp 32 + +STACK CFI INIT d43b0 a1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d43bd $r12: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI d43ce .cfa: $rsp 448 + +STACK CFI d43d7 $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT d4460 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4490 79 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d449d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI d44a9 .cfa: $rsp 432 + +STACK CFI d44ac $r12: .cfa -16 + ^ +STACK CFI INIT d4510 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4540 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4560 .cfa: $rsp 16 + +STACK CFI d4586 .cfa: $rsp 8 + +STACK CFI INIT d45b0 dd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d45b1 .cfa: $rsp 16 + +STACK CFI d45b8 .cfa: $rsp 96 + +STACK CFI d45bd $rbx: .cfa -16 + ^ +STACK CFI INIT d4690 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d46c0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d46f0 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d470d .cfa: $rsp 16 + +STACK CFI d4730 .cfa: $rsp 8 + +STACK CFI INIT d4750 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4780 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d479d .cfa: $rsp 16 + +STACK CFI d47c0 .cfa: $rsp 8 + +STACK CFI INIT d47e0 30 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4810 174 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4811 .cfa: $rsp 16 + +STACK CFI d4821 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d4831 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d4990 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4991 .cfa: $rsp 16 + +STACK CFI d4995 .cfa: $rsp 32 + +STACK CFI d49a2 $rbx: .cfa -16 + ^ +STACK CFI INIT d4a40 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4a70 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4aa0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4ad0 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4ad1 .cfa: $rsp 16 + +STACK CFI d4add $rbx: .cfa -16 + ^ +STACK CFI INIT d4af0 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4b00 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4b01 .cfa: $rsp 16 + +STACK CFI d4b0d $rbx: .cfa -16 + ^ +STACK CFI INIT d4b30 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4b40 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4b70 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4ba0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4bd0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4c00 51 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4c04 .cfa: $rsp 80 + +STACK CFI INIT d4c60 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4c6b .cfa: $rsp 32 + +STACK CFI INIT d4ca0 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4ce0 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4d20 aa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4dd0 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4dd4 .cfa: $rsp 16 + +STACK CFI INIT d4df0 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4df7 .cfa: $rsp 16 + +STACK CFI d4dfa $rbx: .cfa -16 + ^ +STACK CFI INIT d594d 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI d5957 .cfa: $rsp 0 + +STACK CFI d595b .cfa: $rsp 128 + +STACK CFI d5963 .cfa: $rsp -128 + +STACK CFI INIT d5968 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI d5972 .cfa: $rsp 0 + +STACK CFI d5976 .cfa: $rsp 128 + +STACK CFI d597e .cfa: $rsp -128 + +STACK CFI INIT d5983 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI d598d .cfa: $rsp 0 + +STACK CFI d5991 .cfa: $rsp 128 + +STACK CFI d5999 .cfa: $rsp -128 + +STACK CFI INIT d4e80 e8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d4f70 7a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4f72 .cfa: $rsp 16 + +STACK CFI d4f73 .cfa: $rsp 24 + +STACK CFI d4f76 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI d4f77 .cfa: $rsp 32 + +STACK CFI d4f7a $rbx: .cfa -32 + ^ +STACK CFI INIT d4ff0 530 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d4ff1 .cfa: $rsp 16 + +STACK CFI d4ff9 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d5002 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI d5018 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d5520 399 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d5522 .cfa: $rsp 16 + +STACK CFI d5524 .cfa: $rsp 24 + +STACK CFI d5527 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI d5529 .cfa: $rsp 32 + +STACK CFI d552c $r12: .cfa -32 + ^ +STACK CFI d552d .cfa: $rsp 40 + +STACK CFI d5530 $rbp: .cfa -40 + ^ +STACK CFI d5531 .cfa: $rsp 48 + +STACK CFI d5534 $rbx: .cfa -48 + ^ +STACK CFI d553b .cfa: $rsp 1072 + +STACK CFI INIT d58c0 18 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d58c4 .cfa: $rsp 16 + +STACK CFI INIT d58e0 6d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d58e1 .cfa: $rsp 16 + +STACK CFI d58e4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d58ef $r12: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI d58fd $r13: .cfa -24 + ^ +STACK CFI INIT d59a0 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d59d0 9c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d5a70 94 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d5b10 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d5b50 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d5b80 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d5bb0 30 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d5be0 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d5c00 de .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d5ce0 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d5ce4 .cfa: $rsp 16 + +STACK CFI INIT d5d20 51 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d5d24 .cfa: $rsp 16 + +STACK CFI INIT d5d80 385 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d5d82 .cfa: $rsp 16 + +STACK CFI d5d84 .cfa: $rsp 24 + +STACK CFI d5d86 .cfa: $rsp 32 + +STACK CFI d5d88 .cfa: $rsp 40 + +STACK CFI d5d89 .cfa: $rsp 48 + +STACK CFI d5d8a .cfa: $rsp 56 + +STACK CFI d5d8e .cfa: $rsp 64 + +STACK CFI d5d9e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d6110 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d6111 .cfa: $rsp 16 + +STACK CFI d6114 $rbp: .cfa -16 + ^ +STACK CFI d6115 .cfa: $rsp 24 + +STACK CFI d6119 $rbx: .cfa -24 + ^ .cfa: $rsp 32 + +STACK CFI INIT d6150 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d6154 .cfa: $rsp 16 + +STACK CFI INIT d61a0 213 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d61a2 .cfa: $rsp 16 + +STACK CFI d61a4 .cfa: $rsp 24 + +STACK CFI d61a5 .cfa: $rsp 32 + +STACK CFI d61a6 .cfa: $rsp 40 + +STACK CFI d61ad .cfa: $rsp 192 + +STACK CFI d61b4 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT d63c0 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d63c4 .cfa: $rsp 16 + +STACK CFI INIT d63e0 41 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d63e4 .cfa: $rsp 16 + +STACK CFI INIT d6430 228 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d643f $r14: .cfa -24 + ^ +STACK CFI d6466 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 192 + +STACK CFI INIT d6660 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d6680 ca .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d6681 .cfa: $rsp 16 + +STACK CFI d6689 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d6692 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT d7238 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI d7246 .cfa: $rsp 0 + +STACK CFI d724a .cfa: $rsp 128 + +STACK CFI d7252 .cfa: $rsp -128 + +STACK CFI INIT d7257 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI d7265 .cfa: $rsp 0 + +STACK CFI d7269 .cfa: $rsp 128 + +STACK CFI d7271 .cfa: $rsp -128 + +STACK CFI INIT d7276 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI d7284 .cfa: $rsp 0 + +STACK CFI d7288 .cfa: $rsp 128 + +STACK CFI d7290 .cfa: $rsp -128 + +STACK CFI INIT d7295 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI d72a3 .cfa: $rsp 0 + +STACK CFI d72a7 .cfa: $rsp 128 + +STACK CFI d72af .cfa: $rsp -128 + +STACK CFI INIT d72b4 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI d72c2 .cfa: $rsp 0 + +STACK CFI d72c6 .cfa: $rsp 128 + +STACK CFI d72ce .cfa: $rsp -128 + +STACK CFI INIT d6750 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d6780 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d67a0 9a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d67a4 .cfa: $rsp 32 + +STACK CFI INIT d6840 265 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d685d .cfa: $rsp 48 + +STACK CFI d6862 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT d6ab0 66 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d6ab7 .cfa: $rsp 32 + +STACK CFI INIT d6b20 5d5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d6b2c $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI d6b4a .cfa: $rsp 256 + +STACK CFI d6b51 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d7100 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d7110 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d7117 .cfa: $rsp 224 + +STACK CFI INIT d71a0 98 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d71a7 .cfa: $rsp 224 + +STACK CFI INIT d72e0 37 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d7320 15e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d7331 .cfa: $rsp 176 + +STACK CFI d7333 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT d7480 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d74b0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d74e0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d7510 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d752d .cfa: $rsp 16 + +STACK CFI d7550 .cfa: $rsp 8 + +STACK CFI INIT d7570 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d75a0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d75d0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d7600 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d7630 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d7660 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d7690 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d76c0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d76d0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d76e0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d76e4 .cfa: $rsp 48 + +STACK CFI INIT d7710 21f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d7712 .cfa: $rsp 16 + +STACK CFI d7714 .cfa: $rsp 24 + +STACK CFI d7717 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI d7719 .cfa: $rsp 32 + +STACK CFI d771b .cfa: $rsp 40 + +STACK CFI d771c .cfa: $rsp 48 + +STACK CFI d771d .cfa: $rsp 56 + +STACK CFI d7720 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI d7724 .cfa: $rsp 144 + +STACK CFI INIT d7930 30 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d7934 .cfa: $rsp 16 + +STACK CFI d7937 $rbx: .cfa -16 + ^ +STACK CFI INIT d7960 bd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d7964 .cfa: $rsp 16 + +STACK CFI d7967 $rbx: .cfa -16 + ^ +STACK CFI INIT d7a20 115 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d7b40 58 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d7b42 .cfa: $rsp 16 + +STACK CFI d7b48 $r12: .cfa -16 + ^ +STACK CFI d7b49 .cfa: $rsp 24 + +STACK CFI d7b4a .cfa: $rsp 32 + +STACK CFI d7b4d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT d7ba0 9e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d7bad $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI d7bb6 .cfa: $rsp 32 + +STACK CFI d7bc1 $r12: .cfa -16 + ^ +STACK CFI INIT d7c40 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d7c60 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d7c6d $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI d7c71 .cfa: $rsp 32 + +STACK CFI INIT d7cb0 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d7cd0 433 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d7cd1 .cfa: $rsp 16 + +STACK CFI d7cd4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d7ce0 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d8110 120 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8112 .cfa: $rsp 16 + +STACK CFI d8116 .cfa: $rsp 24 + +STACK CFI d8118 .cfa: $rsp 32 + +STACK CFI d811b $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI d811d .cfa: $rsp 40 + +STACK CFI d811e .cfa: $rsp 48 + +STACK CFI d811f .cfa: $rsp 56 + +STACK CFI d8123 .cfa: $rsp 96 + +STACK CFI d8136 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d8230 65 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8232 .cfa: $rsp 16 + +STACK CFI d8235 $r15: .cfa -16 + ^ +STACK CFI d8237 .cfa: $rsp 24 + +STACK CFI d823a $r14: .cfa -24 + ^ +STACK CFI d823c .cfa: $rsp 32 + +STACK CFI d823f $r13: .cfa -32 + ^ +STACK CFI d8241 .cfa: $rsp 40 + +STACK CFI d8244 $r12: .cfa -40 + ^ +STACK CFI d8245 .cfa: $rsp 48 + +STACK CFI d8248 $rbp: .cfa -48 + ^ +STACK CFI d8249 .cfa: $rsp 56 + +STACK CFI d824c $rbx: .cfa -56 + ^ +STACK CFI d8250 .cfa: $rsp 64 + +STACK CFI INIT d82a0 6c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d82ad $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI d82bb .cfa: $rsp 48 + +STACK CFI d82be $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT d8310 115 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8311 .cfa: $rsp 16 + +STACK CFI d8314 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d831b $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI d8331 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d8430 126 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8447 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI d8450 .cfa: $rsp 48 + +STACK CFI d8469 $r12: .cfa -32 + ^ +STACK CFI INIT d8560 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8561 .cfa: $rsp 16 + +STACK CFI d8563 $rbx: .cfa -16 + ^ +STACK CFI INIT d8580 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8587 .cfa: $rsp 224 + +STACK CFI INIT d8610 95 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8617 .cfa: $rsp 224 + +STACK CFI INIT d86b0 e2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d86bd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI d86c6 .cfa: $rsp 32 + +STACK CFI d86d0 $r12: .cfa -16 + ^ +STACK CFI INIT d87a0 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d87a1 .cfa: $rsp 16 + +STACK CFI d87a3 $rbx: .cfa -16 + ^ +STACK CFI INIT d87c0 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d87c7 .cfa: $rsp 224 + +STACK CFI INIT d8850 95 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8857 .cfa: $rsp 224 + +STACK CFI INIT d88f0 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d88f7 .cfa: $rsp 1040 + +STACK CFI INIT d8920 1e8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8921 .cfa: $rsp 16 + +STACK CFI d8924 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d892b $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI d8956 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d8b10 1f7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8b1b $rbx: .cfa -48 + ^ +STACK CFI d8b3c $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $rbp: .cfa -40 + ^ +STACK CFI d8b48 .cfa: $rsp 256 + +STACK CFI d8b60 $r14: .cfa -16 + ^ +STACK CFI INIT d8d10 14f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8d12 .cfa: $rsp 16 + +STACK CFI d8d18 $r12: .cfa -16 + ^ +STACK CFI d8d19 .cfa: $rsp 24 + +STACK CFI d8d1b $rbp: .cfa -24 + ^ +STACK CFI d8d1c .cfa: $rsp 32 + +STACK CFI d8d1e $rbx: .cfa -32 + ^ +STACK CFI d8d25 .cfa: $rsp 240 + +STACK CFI INIT d8e60 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d8eb0 e4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8eb2 .cfa: $rsp 16 + +STACK CFI d8ebb .cfa: $rsp 24 + +STACK CFI d8ebe $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI d8ec6 .cfa: $rsp 32 + +STACK CFI d8ec7 .cfa: $rsp 40 + +STACK CFI d8ece .cfa: $rsp 8256 + +STACK CFI d8eda $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT d8fa0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d8fb0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d8fc0 1eb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8fcd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI d8fe8 .cfa: $rsp 96 + +STACK CFI d8feb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT d91b0 140 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d91b1 .cfa: $rsp 16 + +STACK CFI d91b9 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI d91c6 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT d92f0 c4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d92f2 .cfa: $rsp 16 + +STACK CFI d92fb .cfa: $rsp 24 + +STACK CFI d92fd .cfa: $rsp 32 + +STACK CFI d92ff .cfa: $rsp 40 + +STACK CFI d9300 .cfa: $rsp 48 + +STACK CFI d9301 .cfa: $rsp 56 + +STACK CFI d9305 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 80 + +STACK CFI INIT d93c0 e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d93c4 .cfa: $rsp 16 + +STACK CFI d93c7 $rbx: .cfa -16 + ^ +STACK CFI INIT d94b0 d6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d94b8 $rbp: .cfa -40 + ^ +STACK CFI d94d7 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbx: .cfa -48 + ^ +STACK CFI d94db .cfa: $rsp 128 + +STACK CFI INIT d9590 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d95b0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d95e0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d9610 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d9640 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d9670 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d96a0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d96d0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d9700 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d9730 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d9760 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d9790 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d97c0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d97f0 58 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d97f1 .cfa: $rsp 16 + +STACK CFI d97f4 $rbx: .cfa -16 + ^ +STACK CFI d980a .cfa: $rsp 32 + +STACK CFI INIT d9850 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d9851 .cfa: $rsp 16 + +STACK CFI d9854 $rbx: .cfa -16 + ^ +STACK CFI d986a .cfa: $rsp 32 + +STACK CFI INIT 1364d0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d98b0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d98b4 .cfa: $rsp 16 + +STACK CFI INIT d98e0 82 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d98e9 .cfa: $rsp 16 + +STACK CFI d98eb $rbx: .cfa -16 + ^ +STACK CFI INIT d9970 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d9974 .cfa: $rsp 16 + +STACK CFI INIT d9990 e2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d9991 .cfa: $rsp 16 + +STACK CFI d9995 $rbp: .cfa -16 + ^ +STACK CFI d999d .cfa: $rsp 24 + +STACK CFI d99a0 $rbx: .cfa -24 + ^ +STACK CFI d99a4 .cfa: $rsp 32 + +STACK CFI INIT d9a80 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d9a82 .cfa: $rsp 16 + +STACK CFI d9a83 .cfa: $rsp 24 + +STACK CFI d9a86 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI d9a8c $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI INIT d9ae0 5c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d9ae2 .cfa: $rsp 16 + +STACK CFI d9ae3 .cfa: $rsp 24 + +STACK CFI d9ae6 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI d9aec $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI INIT d9b40 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d9b41 .cfa: $rsp 16 + +STACK CFI d9b43 $rbx: .cfa -16 + ^ +STACK CFI INIT d9b80 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d9bc0 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d9c00 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d9c20 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d9c21 .cfa: $rsp 16 + +STACK CFI d9c27 $rbx: .cfa -16 + ^ +STACK CFI INIT d9c50 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d9c5b .cfa: $rsp 16 + +STACK CFI INIT d9c80 ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d9c8c $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI d9c95 .cfa: $rsp 48 + +STACK CFI d9ca6 $r12: .cfa -16 + ^ +STACK CFI INIT d9d30 301 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d9d32 .cfa: $rsp 16 + +STACK CFI d9d38 .cfa: $rsp 24 + +STACK CFI d9d3b $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI d9d3d .cfa: $rsp 32 + +STACK CFI d9d40 $r13: .cfa -32 + ^ +STACK CFI d9d42 .cfa: $rsp 40 + +STACK CFI d9d45 $r12: .cfa -40 + ^ +STACK CFI d9d46 .cfa: $rsp 48 + +STACK CFI d9d49 $rbp: .cfa -48 + ^ +STACK CFI d9d4a .cfa: $rsp 56 + +STACK CFI d9d4d $rbx: .cfa -56 + ^ +STACK CFI d9d51 .cfa: $rsp 96 + +STACK CFI INIT da040 1f1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI da056 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI da06c .cfa: $rsp 80 + +STACK CFI da077 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT da240 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI da241 .cfa: $rsp 16 + +STACK CFI da249 $rbx: .cfa -16 + ^ +STACK CFI da24d .cfa: $rsp 32 + +STACK CFI INIT da280 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI da281 .cfa: $rsp 16 + +STACK CFI da28b .cfa: $rsp 32 + +STACK CFI da294 $rbx: .cfa -16 + ^ +STACK CFI INIT da2c0 cf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI da2cc $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI da2e2 .cfa: $rsp 64 + +STACK CFI da2ee $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT da390 329 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI da392 .cfa: $rsp 16 + +STACK CFI da394 .cfa: $rsp 24 + +STACK CFI da397 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI da399 .cfa: $rsp 32 + +STACK CFI da39c $r13: .cfa -32 + ^ +STACK CFI da39e .cfa: $rsp 40 + +STACK CFI da3a1 $r12: .cfa -40 + ^ +STACK CFI da3a2 .cfa: $rsp 48 + +STACK CFI da3a5 $rbp: .cfa -48 + ^ +STACK CFI da3a6 .cfa: $rsp 56 + +STACK CFI da3a9 $rbx: .cfa -56 + ^ +STACK CFI da3ad .cfa: $rsp 128 + +STACK CFI INIT da6c0 220 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI da6cd $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI da6e8 .cfa: $rsp 112 + +STACK CFI da6ef $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT da8e0 6c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI da8ee .cfa: $rsp 32 + +STACK CFI da8f4 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT da950 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT da980 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT da9b0 55 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT daa10 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT daa85 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT daaa0 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI daabd .cfa: $rsp 16 + +STACK CFI daae0 .cfa: $rsp 8 + +STACK CFI INIT dab00 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dab10 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dab40 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dab70 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT daba0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dabd0 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dabf0 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dac10 2d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dac40 bb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dac41 .cfa: $rsp 16 + +STACK CFI dac45 .cfa: $rsp 64 + +STACK CFI dac4f $rbx: .cfa -16 + ^ +STACK CFI INIT dad00 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dad01 .cfa: $rsp 16 + +STACK CFI dad15 .cfa: $rsp 24 + +STACK CFI dad18 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT dad90 7a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dae10 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dae14 .cfa: $rsp 16 + +STACK CFI INIT dae30 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dae34 .cfa: $rsp 32 + +STACK CFI INIT dae60 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dae90 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT daec0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT daef0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT daf20 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT daf50 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT daf80 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dafb0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dafe0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db010 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db040 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db070 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db0a0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db0c0 .cfa: $rsp 16 + +STACK CFI db0e6 .cfa: $rsp 8 + +STACK CFI INIT db110 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db140 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db170 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db1a0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db1d0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db200 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db230 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db260 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db290 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db2c0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db2f0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db320 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db350 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db380 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db3b0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db3e0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db400 .cfa: $rsp 16 + +STACK CFI db426 .cfa: $rsp 8 + +STACK CFI INIT db450 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db480 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db4a0 .cfa: $rsp 16 + +STACK CFI db4c6 .cfa: $rsp 8 + +STACK CFI INIT db4f0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db520 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db550 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db570 .cfa: $rsp 16 + +STACK CFI db596 .cfa: $rsp 8 + +STACK CFI INIT db5c0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db5f0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db620 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db650 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db680 16 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db6a0 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db6bd .cfa: $rsp 16 + +STACK CFI db6e0 .cfa: $rsp 8 + +STACK CFI INIT db700 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db730 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db74d .cfa: $rsp 16 + +STACK CFI db770 .cfa: $rsp 8 + +STACK CFI INIT db790 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db7c0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db7f0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db820 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db850 af .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db851 .cfa: $rsp 16 + +STACK CFI db855 .cfa: $rsp 48 + +STACK CFI db85f $rbx: .cfa -16 + ^ +STACK CFI INIT db900 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db920 .cfa: $rsp 16 + +STACK CFI db946 .cfa: $rsp 8 + +STACK CFI INIT db970 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db98d .cfa: $rsp 16 + +STACK CFI db9b0 .cfa: $rsp 8 + +STACK CFI INIT db9d0 af .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db9d1 .cfa: $rsp 16 + +STACK CFI db9d5 .cfa: $rsp 48 + +STACK CFI db9df $rbx: .cfa -16 + ^ +STACK CFI INIT dba80 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dba9d .cfa: $rsp 16 + +STACK CFI dbac0 .cfa: $rsp 8 + +STACK CFI INIT dbae0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dbb00 .cfa: $rsp 16 + +STACK CFI dbb26 .cfa: $rsp 8 + +STACK CFI INIT dbb50 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dbb80 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dbbb0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dbbe0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dbc10 6b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dbc1d $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI dbc29 .cfa: $rsp 176 + +STACK CFI dbc3d $rbp: .cfa -24 + ^ +STACK CFI INIT dbc80 29f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dbc82 .cfa: $rsp 16 + +STACK CFI dbc84 .cfa: $rsp 24 + +STACK CFI dbc86 .cfa: $rsp 32 + +STACK CFI dbc88 .cfa: $rsp 40 + +STACK CFI dbc89 .cfa: $rsp 48 + +STACK CFI dbc8a .cfa: $rsp 56 + +STACK CFI dbc8e .cfa: $rsp 112 + +STACK CFI dbc9c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT dbf20 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dbf24 .cfa: $rsp 32 + +STACK CFI INIT dbf50 9f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dbf54 .cfa: $rsp 48 + +STACK CFI INIT dbff0 ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dbff4 .cfa: $rsp 64 + +STACK CFI INIT dc0a0 43 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc0f0 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc110 41 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dc111 .cfa: $rsp 16 + +STACK CFI dc113 $rbx: .cfa -16 + ^ +STACK CFI dc122 .cfa: $rsp 160 + +STACK CFI INIT dc160 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dc180 .cfa: $rsp 16 + +STACK CFI dc1a6 .cfa: $rsp 8 + +STACK CFI INIT dc1d0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dc1f0 .cfa: $rsp 16 + +STACK CFI dc216 .cfa: $rsp 8 + +STACK CFI INIT dc240 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc270 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc2a0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc2d0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc300 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc330 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc360 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc390 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc3c0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc3f0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dc420 4be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dc421 .cfa: $rsp 16 + +STACK CFI dc42b $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI dc43b $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT dc8e0 27 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dc8e1 .cfa: $rsp 16 + +STACK CFI dc8e7 $rbx: .cfa -16 + ^ +STACK CFI INIT dc910 60 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dc914 .cfa: $rsp 16 + +STACK CFI INIT dc970 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dc974 .cfa: $rsp 16 + +STACK CFI INIT dc9a0 1e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dc9ac .cfa: $rsp 16 + +STACK CFI INIT dcb90 14f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dcb91 .cfa: $rsp 16 + +STACK CFI dcb9b $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI INIT dcce0 55 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dcd40 1be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dcd4d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI dcd5e .cfa: $rsp 240 + +STACK CFI dcd64 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT dcf00 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dcf40 109 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dcf41 .cfa: $rsp 16 + +STACK CFI dcf43 $rbp: .cfa -16 + ^ +STACK CFI dcf44 .cfa: $rsp 24 + +STACK CFI dcf4b $rbx: .cfa -24 + ^ +STACK CFI INIT dd050 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dd060 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dd080 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dd0b0 195 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dd0bd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI dd0cb .cfa: $rsp 64 + +STACK CFI dd0d1 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT dd250 41b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dd251 .cfa: $rsp 16 + +STACK CFI dd254 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI dd25b $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI dd268 $r13: .cfa -40 + ^ +STACK CFI dd271 $r12: .cfa -48 + ^ +STACK CFI dd28d $rbx: .cfa -56 + ^ +STACK CFI INIT dd670 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dd740 85 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dd742 .cfa: $rsp 16 + +STACK CFI dd744 .cfa: $rsp 24 + +STACK CFI dd747 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI dd748 .cfa: $rsp 32 + +STACK CFI dd749 .cfa: $rsp 40 + +STACK CFI dd74d .cfa: $rsp 48 + +STACK CFI dd762 $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT dd7d0 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dd7d4 .cfa: $rsp 16 + +STACK CFI dd7d8 $rbx: .cfa -16 + ^ +STACK CFI INIT dd830 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dd834 .cfa: $rsp 16 + +STACK CFI dd838 $rbx: .cfa -16 + ^ +STACK CFI INIT dd890 95 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dd897 .cfa: $rsp 16 + +STACK CFI dd899 $rbx: .cfa -16 + ^ +STACK CFI INIT dd930 62 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dd938 .cfa: $rsp 16 + +STACK CFI dd93a $rbx: .cfa -16 + ^ +STACK CFI INIT dd9a0 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dd9a8 .cfa: $rsp 16 + +STACK CFI dd9aa $rbx: .cfa -16 + ^ +STACK CFI INIT dda00 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dda07 .cfa: $rsp 16 + +STACK CFI dda09 $rbx: .cfa -16 + ^ +STACK CFI INIT ddad0 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ddad7 .cfa: $rsp 16 + +STACK CFI ddad9 $rbx: .cfa -16 + ^ +STACK CFI INIT ddba0 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ddba7 .cfa: $rsp 16 + +STACK CFI ddba9 $rbx: .cfa -16 + ^ +STACK CFI INIT ddc70 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ddc77 .cfa: $rsp 16 + +STACK CFI ddc79 $rbx: .cfa -16 + ^ +STACK CFI INIT ddd40 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ddd47 .cfa: $rsp 16 + +STACK CFI ddd49 $rbx: .cfa -16 + ^ +STACK CFI INIT dde10 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dde17 .cfa: $rsp 16 + +STACK CFI dde19 $rbx: .cfa -16 + ^ +STACK CFI INIT ddee0 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ddee7 .cfa: $rsp 16 + +STACK CFI ddee9 $rbx: .cfa -16 + ^ +STACK CFI INIT ddfb0 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ddfb7 .cfa: $rsp 16 + +STACK CFI ddfb9 $rbx: .cfa -16 + ^ +STACK CFI INIT de080 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de087 .cfa: $rsp 16 + +STACK CFI de089 $rbx: .cfa -16 + ^ +STACK CFI INIT de150 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de157 .cfa: $rsp 16 + +STACK CFI de159 $rbx: .cfa -16 + ^ +STACK CFI INIT de220 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de227 .cfa: $rsp 16 + +STACK CFI de229 $rbx: .cfa -16 + ^ +STACK CFI INIT de2f0 7b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de2f2 .cfa: $rsp 16 + +STACK CFI de2f4 .cfa: $rsp 24 + +STACK CFI de2f7 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI de2f9 .cfa: $rsp 32 + +STACK CFI de2fa .cfa: $rsp 40 + +STACK CFI de2fc $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ +STACK CFI de2fd $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI INIT de370 5b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT de3d0 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de3d7 .cfa: $rsp 16 + +STACK CFI de3d9 $rbx: .cfa -16 + ^ +STACK CFI INIT de460 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de467 .cfa: $rsp 16 + +STACK CFI de469 $rbx: .cfa -16 + ^ +STACK CFI INIT de4f0 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de4f7 .cfa: $rsp 16 + +STACK CFI de4f9 $rbx: .cfa -16 + ^ +STACK CFI INIT de580 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de587 .cfa: $rsp 16 + +STACK CFI de589 $rbx: .cfa -16 + ^ +STACK CFI INIT de610 85 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de617 .cfa: $rsp 16 + +STACK CFI de619 $rbx: .cfa -16 + ^ +STACK CFI INIT de6a0 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de6a7 .cfa: $rsp 16 + +STACK CFI de6a9 $rbx: .cfa -16 + ^ +STACK CFI INIT de730 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de737 .cfa: $rsp 16 + +STACK CFI de739 $rbx: .cfa -16 + ^ +STACK CFI INIT de7c0 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de7c7 .cfa: $rsp 16 + +STACK CFI de7c9 $rbx: .cfa -16 + ^ +STACK CFI INIT de850 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de857 .cfa: $rsp 16 + +STACK CFI de859 $rbx: .cfa -16 + ^ +STACK CFI INIT de8e0 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de8e7 .cfa: $rsp 16 + +STACK CFI de8e9 $rbx: .cfa -16 + ^ +STACK CFI INIT de970 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de977 .cfa: $rsp 16 + +STACK CFI de979 $rbx: .cfa -16 + ^ +STACK CFI INIT dea00 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dea07 .cfa: $rsp 16 + +STACK CFI dea09 $rbx: .cfa -16 + ^ +STACK CFI INIT dea90 54 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dea91 .cfa: $rsp 16 + +STACK CFI dea96 $rbx: .cfa -16 + ^ +STACK CFI INIT deaf0 51 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI deaf1 .cfa: $rsp 16 + +STACK CFI deaf6 $rbx: .cfa -16 + ^ +STACK CFI INIT deb50 7b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI deb52 .cfa: $rsp 16 + +STACK CFI deb54 .cfa: $rsp 24 + +STACK CFI deb57 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI deb59 .cfa: $rsp 32 + +STACK CFI deb5a .cfa: $rsp 40 + +STACK CFI deb5c $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ +STACK CFI deb5d .cfa: $rsp 48 + +STACK CFI deb60 $rbx: .cfa -48 + ^ +STACK CFI INIT debd0 5b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dec30 75 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dec32 .cfa: $rsp 16 + +STACK CFI dec34 .cfa: $rsp 24 + +STACK CFI dec37 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI dec38 .cfa: $rsp 32 + +STACK CFI dec39 .cfa: $rsp 40 + +STACK CFI dec3d .cfa: $rsp 48 + +STACK CFI dec47 $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT ded38 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI ded46 .cfa: $rsp 0 + +STACK CFI ded4a .cfa: $rsp 128 + +STACK CFI ded52 .cfa: $rsp -128 + +STACK CFI INIT ded54 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI ded62 .cfa: $rsp 0 + +STACK CFI ded66 .cfa: $rsp 128 + +STACK CFI ded6e .cfa: $rsp -128 + +STACK CFI INIT decb0 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI decb4 .cfa: $rsp 16 + +STACK CFI INIT dee95 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI deea3 .cfa: $rsp 0 + +STACK CFI deea7 .cfa: $rsp 128 + +STACK CFI deeaf .cfa: $rsp -128 + +STACK CFI INIT deeb4 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI deec2 .cfa: $rsp 0 + +STACK CFI deec6 .cfa: $rsp 128 + +STACK CFI deece .cfa: $rsp -128 + +STACK CFI INIT ded70 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ded71 .cfa: $rsp 16 + +STACK CFI ded79 .cfa: $rsp 24 + +STACK CFI ded7c $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI ded80 .cfa: $rsp 48 + +STACK CFI INIT df01d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI df02b .cfa: $rsp 0 + +STACK CFI df02f .cfa: $rsp 128 + +STACK CFI df037 .cfa: $rsp -128 + +STACK CFI INIT df03c 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI df04a .cfa: $rsp 0 + +STACK CFI df04e .cfa: $rsp 128 + +STACK CFI df056 .cfa: $rsp -128 + +STACK CFI INIT deed0 14d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI deed1 .cfa: $rsp 16 + +STACK CFI deed9 .cfa: $rsp 24 + +STACK CFI deedc $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI deee0 .cfa: $rsp 48 + +STACK CFI INIT df1fe 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI df20c .cfa: $rsp 0 + +STACK CFI df210 .cfa: $rsp 128 + +STACK CFI df218 .cfa: $rsp -128 + +STACK CFI INIT df21d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI df22b .cfa: $rsp 0 + +STACK CFI df22f .cfa: $rsp 128 + +STACK CFI df237 .cfa: $rsp -128 + +STACK CFI INIT df060 19e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI df062 .cfa: $rsp 16 + +STACK CFI df064 .cfa: $rsp 24 + +STACK CFI df065 .cfa: $rsp 32 + +STACK CFI df066 .cfa: $rsp 40 + +STACK CFI df069 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI df06d .cfa: $rsp 96 + +STACK CFI INIT df647 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI df651 .cfa: $rsp 0 + +STACK CFI df655 .cfa: $rsp 128 + +STACK CFI df65d .cfa: $rsp -128 + +STACK CFI INIT df662 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI df66c .cfa: $rsp 0 + +STACK CFI df670 .cfa: $rsp 128 + +STACK CFI df678 .cfa: $rsp -128 + +STACK CFI INIT df240 407 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI df242 .cfa: $rsp 16 + +STACK CFI df243 .cfa: $rsp 24 + +STACK CFI df246 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI df247 .cfa: $rsp 32 + +STACK CFI df24e $rbx: .cfa -32 + ^ +STACK CFI INIT df8a2 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI df8b0 .cfa: $rsp 0 + +STACK CFI df8b4 .cfa: $rsp 128 + +STACK CFI df8bc .cfa: $rsp -128 + +STACK CFI INIT df8c1 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI df8cf .cfa: $rsp 0 + +STACK CFI df8d3 .cfa: $rsp 128 + +STACK CFI df8db .cfa: $rsp -128 + +STACK CFI INIT df8e0 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI df8ee .cfa: $rsp 0 + +STACK CFI df8f2 .cfa: $rsp 128 + +STACK CFI df8fa .cfa: $rsp -128 + +STACK CFI INIT df8ff 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI df90d .cfa: $rsp 0 + +STACK CFI df911 .cfa: $rsp 128 + +STACK CFI df919 .cfa: $rsp -128 + +STACK CFI INIT df91e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI df92c .cfa: $rsp 0 + +STACK CFI df930 .cfa: $rsp 128 + +STACK CFI df938 .cfa: $rsp -128 + +STACK CFI INIT df93d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI df94b .cfa: $rsp 0 + +STACK CFI df94f .cfa: $rsp 128 + +STACK CFI df957 .cfa: $rsp -128 + +STACK CFI INIT df680 d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI df684 .cfa: $rsp 80 + +STACK CFI INIT df760 a0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI df764 .cfa: $rsp 16 + +STACK CFI INIT df800 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI df804 .cfa: $rsp 32 + +STACK CFI INIT df960 1ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI df962 .cfa: $rsp 16 + +STACK CFI df965 $r15: .cfa -16 + ^ +STACK CFI df967 .cfa: $rsp 24 + +STACK CFI df96a $r14: .cfa -24 + ^ +STACK CFI df96c .cfa: $rsp 32 + +STACK CFI df96f $r13: .cfa -32 + ^ +STACK CFI df971 .cfa: $rsp 40 + +STACK CFI df974 $r12: .cfa -40 + ^ +STACK CFI df975 .cfa: $rsp 48 + +STACK CFI df976 .cfa: $rsp 56 + +STACK CFI df97a .cfa: $rsp 112 + +STACK CFI df98c $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT dfb50 3be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dfb52 .cfa: $rsp 16 + +STACK CFI dfb54 .cfa: $rsp 24 + +STACK CFI dfb55 .cfa: $rsp 32 + +STACK CFI dfb58 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI dfb5e .cfa: $rsp 40 + +STACK CFI dfb61 $rbx: .cfa -40 + ^ +STACK CFI dfb65 .cfa: $rsp 64 + +STACK CFI INIT dff10 a7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dff20 $r12: .cfa -16 + ^ +STACK CFI dff2d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI dff31 .cfa: $rsp 32 + +STACK CFI INIT e020e 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI e0218 .cfa: $rsp 0 + +STACK CFI e021c .cfa: $rsp 128 + +STACK CFI e0224 .cfa: $rsp -128 + +STACK CFI INIT e0229 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI e0233 .cfa: $rsp 0 + +STACK CFI e0237 .cfa: $rsp 128 + +STACK CFI e023f .cfa: $rsp -128 + +STACK CFI INIT e0244 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI e024e .cfa: $rsp 0 + +STACK CFI e0252 .cfa: $rsp 128 + +STACK CFI e025a .cfa: $rsp -128 + +STACK CFI INIT e025f 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI e0269 .cfa: $rsp 0 + +STACK CFI e026d .cfa: $rsp 128 + +STACK CFI e0275 .cfa: $rsp -128 + +STACK CFI INIT dffc0 24e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dffc2 .cfa: $rsp 16 + +STACK CFI dffc5 $r15: .cfa -16 + ^ +STACK CFI dffc7 .cfa: $rsp 24 + +STACK CFI dffc9 .cfa: $rsp 32 + +STACK CFI dffcc $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI dffce .cfa: $rsp 40 + +STACK CFI dffcf .cfa: $rsp 48 + +STACK CFI dffd2 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI dffd3 .cfa: $rsp 56 + +STACK CFI dffd6 $rbx: .cfa -56 + ^ +STACK CFI dffda .cfa: $rsp 80 + +STACK CFI INIT e0579 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e0587 .cfa: $rsp 0 + +STACK CFI e058b .cfa: $rsp 128 + +STACK CFI e0593 .cfa: $rsp -128 + +STACK CFI INIT e0598 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e05a6 .cfa: $rsp 0 + +STACK CFI e05aa .cfa: $rsp 128 + +STACK CFI e05b2 .cfa: $rsp -128 + +STACK CFI INIT e05b7 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e05c5 .cfa: $rsp 0 + +STACK CFI e05c9 .cfa: $rsp 128 + +STACK CFI e05d1 .cfa: $rsp -128 + +STACK CFI INIT e05d6 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e05e4 .cfa: $rsp 0 + +STACK CFI e05e8 .cfa: $rsp 128 + +STACK CFI e05f0 .cfa: $rsp -128 + +STACK CFI INIT e05f5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e0603 .cfa: $rsp 0 + +STACK CFI e0607 .cfa: $rsp 128 + +STACK CFI e060f .cfa: $rsp -128 + +STACK CFI INIT e0280 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e0290 80 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e0294 .cfa: $rsp 16 + +STACK CFI INIT e0310 269 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e031f $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI e032b .cfa: $rsp 640 + +STACK CFI e0333 $r12: .cfa -16 + ^ +STACK CFI INIT e06a8 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI e06b6 .cfa: $rsp 0 + +STACK CFI e06ba .cfa: $rsp 128 + +STACK CFI e06c2 .cfa: $rsp -128 + +STACK CFI INIT e06c4 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI e06d2 .cfa: $rsp 0 + +STACK CFI e06d6 .cfa: $rsp 128 + +STACK CFI e06de .cfa: $rsp -128 + +STACK CFI INIT e0620 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e0624 .cfa: $rsp 16 + +STACK CFI INIT e0805 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e0813 .cfa: $rsp 0 + +STACK CFI e0817 .cfa: $rsp 128 + +STACK CFI e081f .cfa: $rsp -128 + +STACK CFI INIT e0824 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI e0832 .cfa: $rsp 0 + +STACK CFI e0836 .cfa: $rsp 128 + +STACK CFI e083e .cfa: $rsp -128 + +STACK CFI INIT e06e0 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e06e1 .cfa: $rsp 16 + +STACK CFI e06e9 .cfa: $rsp 24 + +STACK CFI e06ec $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI e06f0 .cfa: $rsp 48 + +STACK CFI INIT e09a4 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e09b2 .cfa: $rsp 0 + +STACK CFI e09b6 .cfa: $rsp 128 + +STACK CFI e09be .cfa: $rsp -128 + +STACK CFI INIT e09c3 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e09d1 .cfa: $rsp 0 + +STACK CFI e09d5 .cfa: $rsp 128 + +STACK CFI e09dd .cfa: $rsp -128 + +STACK CFI INIT e0840 164 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e0842 .cfa: $rsp 16 + +STACK CFI e084a .cfa: $rsp 24 + +STACK CFI e084d $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI e084e .cfa: $rsp 32 + +STACK CFI e0852 .cfa: $rsp 48 + +STACK CFI e0888 $rbx: .cfa -32 + ^ +STACK CFI INIT e0b8e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e0b9c .cfa: $rsp 0 + +STACK CFI e0ba0 .cfa: $rsp 128 + +STACK CFI e0ba8 .cfa: $rsp -128 + +STACK CFI INIT e0bad 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e0bbb .cfa: $rsp 0 + +STACK CFI e0bbf .cfa: $rsp 128 + +STACK CFI e0bc7 .cfa: $rsp -128 + +STACK CFI INIT e09f0 19e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e09f2 .cfa: $rsp 16 + +STACK CFI e09f4 .cfa: $rsp 24 + +STACK CFI e09f5 .cfa: $rsp 32 + +STACK CFI e09f6 .cfa: $rsp 40 + +STACK CFI e09f9 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI e09fd .cfa: $rsp 96 + +STACK CFI INIT e0db8 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI e0dc2 .cfa: $rsp 0 + +STACK CFI e0dc6 .cfa: $rsp 128 + +STACK CFI e0dce .cfa: $rsp -128 + +STACK CFI INIT e0dd3 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI e0ddd .cfa: $rsp 0 + +STACK CFI e0de1 .cfa: $rsp 128 + +STACK CFI e0de9 .cfa: $rsp -128 + +STACK CFI INIT e0bd0 1e8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e0bd2 .cfa: $rsp 16 + +STACK CFI e0bd4 .cfa: $rsp 24 + +STACK CFI e0bd6 .cfa: $rsp 32 + +STACK CFI e0bd8 .cfa: $rsp 40 + +STACK CFI e0bdb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI e0bdc .cfa: $rsp 48 + +STACK CFI e0bdd .cfa: $rsp 56 + +STACK CFI e0be0 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI e0be4 .cfa: $rsp 64 + +STACK CFI INIT e1012 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e1020 .cfa: $rsp 0 + +STACK CFI e1024 .cfa: $rsp 128 + +STACK CFI e102c .cfa: $rsp -128 + +STACK CFI INIT e1031 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e103f .cfa: $rsp 0 + +STACK CFI e1043 .cfa: $rsp 128 + +STACK CFI e104b .cfa: $rsp -128 + +STACK CFI INIT e1050 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e105e .cfa: $rsp 0 + +STACK CFI e1062 .cfa: $rsp 128 + +STACK CFI e106a .cfa: $rsp -128 + +STACK CFI INIT e106f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e107d .cfa: $rsp 0 + +STACK CFI e1081 .cfa: $rsp 128 + +STACK CFI e1089 .cfa: $rsp -128 + +STACK CFI INIT e108e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e109c .cfa: $rsp 0 + +STACK CFI e10a0 .cfa: $rsp 128 + +STACK CFI e10a8 .cfa: $rsp -128 + +STACK CFI INIT e10ad 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e10bb .cfa: $rsp 0 + +STACK CFI e10bf .cfa: $rsp 128 + +STACK CFI e10c7 .cfa: $rsp -128 + +STACK CFI INIT e0df0 d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e0df4 .cfa: $rsp 80 + +STACK CFI INIT e0ed0 a0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e0ed4 .cfa: $rsp 16 + +STACK CFI INIT e0f70 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e0f74 .cfa: $rsp 32 + +STACK CFI INIT e10d0 1ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e10d2 .cfa: $rsp 16 + +STACK CFI e10d5 $r15: .cfa -16 + ^ +STACK CFI e10d7 .cfa: $rsp 24 + +STACK CFI e10da $r14: .cfa -24 + ^ +STACK CFI e10dc .cfa: $rsp 32 + +STACK CFI e10df $r13: .cfa -32 + ^ +STACK CFI e10e1 .cfa: $rsp 40 + +STACK CFI e10e4 $r12: .cfa -40 + ^ +STACK CFI e10e5 .cfa: $rsp 48 + +STACK CFI e10e6 .cfa: $rsp 56 + +STACK CFI e10ea .cfa: $rsp 112 + +STACK CFI e10fc $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT e12c0 387 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e12c2 .cfa: $rsp 16 + +STACK CFI e12c5 $r15: .cfa -16 + ^ +STACK CFI e12c7 .cfa: $rsp 24 + +STACK CFI e12c9 .cfa: $rsp 32 + +STACK CFI e12cd $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI e12cf .cfa: $rsp 40 + +STACK CFI e12d2 $r12: .cfa -40 + ^ +STACK CFI e12d3 .cfa: $rsp 48 + +STACK CFI e12d6 $rbp: .cfa -48 + ^ +STACK CFI e12d7 .cfa: $rsp 56 + +STACK CFI e12da $rbx: .cfa -56 + ^ +STACK CFI e12de .cfa: $rsp 80 + +STACK CFI INIT e1650 bf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e165d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI e1673 .cfa: $rsp 48 + +STACK CFI e1679 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT e1966 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI e1970 .cfa: $rsp 0 + +STACK CFI e1974 .cfa: $rsp 128 + +STACK CFI e197c .cfa: $rsp -128 + +STACK CFI INIT e1981 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI e198b .cfa: $rsp 0 + +STACK CFI e198f .cfa: $rsp 128 + +STACK CFI e1997 .cfa: $rsp -128 + +STACK CFI INIT e199c 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI e19a6 .cfa: $rsp 0 + +STACK CFI e19aa .cfa: $rsp 128 + +STACK CFI e19b2 .cfa: $rsp -128 + +STACK CFI INIT e19b7 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI e19c1 .cfa: $rsp 0 + +STACK CFI e19c5 .cfa: $rsp 128 + +STACK CFI e19cd .cfa: $rsp -128 + +STACK CFI INIT e1710 256 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e1712 .cfa: $rsp 16 + +STACK CFI e1714 .cfa: $rsp 24 + +STACK CFI e1717 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI e1719 .cfa: $rsp 32 + +STACK CFI e171b .cfa: $rsp 40 + +STACK CFI e171c .cfa: $rsp 48 + +STACK CFI e171f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI e1720 .cfa: $rsp 56 + +STACK CFI e1723 $rbx: .cfa -56 + ^ +STACK CFI e1727 .cfa: $rsp 80 + +STACK CFI INIT e19e0 5a6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e19e2 .cfa: $rsp 16 + +STACK CFI e19e4 .cfa: $rsp 24 + +STACK CFI e19e6 .cfa: $rsp 32 + +STACK CFI e19e8 .cfa: $rsp 40 + +STACK CFI e19e9 .cfa: $rsp 48 + +STACK CFI e19ea .cfa: $rsp 56 + +STACK CFI e19ed $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI e19f1 .cfa: $rsp 80 + +STACK CFI INIT e1f90 b7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e1f9e .cfa: $rsp 32 + +STACK CFI e1fa9 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT e2050 ff .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e2052 .cfa: $rsp 16 + +STACK CFI e2058 $r13: .cfa -16 + ^ +STACK CFI e205f .cfa: $rsp 24 + +STACK CFI e2060 .cfa: $rsp 32 + +STACK CFI e2061 .cfa: $rsp 40 + +STACK CFI e2064 $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI e206e .cfa: $rsp 256 + +STACK CFI INIT e2150 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e2151 .cfa: $rsp 16 + +STACK CFI e2154 $rbx: .cfa -16 + ^ +STACK CFI INIT e2190 a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e219d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI e21b5 .cfa: $rsp 48 + +STACK CFI e21bb $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT e2240 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e224d .cfa: $rsp 16 + +STACK CFI e2250 $rbx: .cfa -16 + ^ +STACK CFI INIT e2270 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e227e .cfa: $rsp 32 + +STACK CFI e2289 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT e22b0 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e22be .cfa: $rsp 32 + +STACK CFI e22c9 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT e22f0 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e22fe .cfa: $rsp 32 + +STACK CFI e2309 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT e2330 5b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e233e .cfa: $rsp 32 + +STACK CFI e2349 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT e2390 6c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e239d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI e23a6 .cfa: $rsp 32 + +STACK CFI e23ad $r12: .cfa -16 + ^ +STACK CFI INIT e2400 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e240d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI e2419 .cfa: $rsp 32 + +STACK CFI e241c $r12: .cfa -16 + ^ +STACK CFI INIT e2460 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e24a0 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e24a1 .cfa: $rsp 16 + +STACK CFI e24a4 $rbp: .cfa -16 + ^ +STACK CFI e24a5 .cfa: $rsp 24 + +STACK CFI e24a9 .cfa: $rsp 32 + +STACK CFI e24b2 $rbx: .cfa -24 + ^ +STACK CFI INIT e24f0 f5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e24f2 .cfa: $rsp 16 + +STACK CFI e24fa $r15: .cfa -16 + ^ +STACK CFI e24fc .cfa: $rsp 24 + +STACK CFI e24ff $r14: .cfa -24 + ^ +STACK CFI e2501 .cfa: $rsp 32 + +STACK CFI e2503 .cfa: $rsp 40 + +STACK CFI e2504 .cfa: $rsp 48 + +STACK CFI e2505 .cfa: $rsp 56 + +STACK CFI e2509 .cfa: $rsp 80 + +STACK CFI e250c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT e25f0 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e2650 95 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e26f0 23d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e26fa $rbp: .cfa -40 + ^ +STACK CFI e271b $r12: .cfa -32 + ^ $r14: .cfa -16 + ^ $rbx: .cfa -48 + ^ +STACK CFI e2727 .cfa: $rsp 432 + +STACK CFI e2773 $r13: .cfa -24 + ^ +STACK CFI INIT e2930 c6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e2938 $rbx: .cfa -32 + ^ +STACK CFI e2946 .cfa: $rsp 32 + +STACK CFI e294e $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI INIT e2a00 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e2a0d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI e2a16 .cfa: $rsp 32 + +STACK CFI e2a20 $r12: .cfa -16 + ^ +STACK CFI INIT e2a90 195 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e2a91 .cfa: $rsp 16 + +STACK CFI e2a94 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI e2a99 $r15: .cfa -24 + ^ +STACK CFI e2aa2 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI e2aae $rbx: .cfa -56 + ^ +STACK CFI INIT e2c30 66f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e2c32 .cfa: $rsp 16 + +STACK CFI e2c34 .cfa: $rsp 24 + +STACK CFI e2c37 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI e2c39 .cfa: $rsp 32 + +STACK CFI e2c3b .cfa: $rsp 40 + +STACK CFI e2c3c .cfa: $rsp 48 + +STACK CFI e2c3d .cfa: $rsp 56 + +STACK CFI e2c41 .cfa: $rsp 112 + +STACK CFI e2c45 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT e32a0 340 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e32a2 .cfa: $rsp 16 + +STACK CFI e32a4 .cfa: $rsp 24 + +STACK CFI e32a6 .cfa: $rsp 32 + +STACK CFI e32a7 .cfa: $rsp 40 + +STACK CFI e32aa $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI e32ab .cfa: $rsp 48 + +STACK CFI e32ae $rbx: .cfa -48 + ^ +STACK CFI e32b2 .cfa: $rsp 64 + +STACK CFI INIT e35e0 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e35e1 .cfa: $rsp 16 + +STACK CFI e35e3 $rbp: .cfa -16 + ^ +STACK CFI e35e4 .cfa: $rsp 24 + +STACK CFI e35e8 .cfa: $rsp 32 + +STACK CFI e35ec $rbx: .cfa -24 + ^ +STACK CFI INIT e3630 a7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e3631 .cfa: $rsp 16 + +STACK CFI e3634 $rbx: .cfa -16 + ^ +STACK CFI e3638 .cfa: $rsp 32 + +STACK CFI INIT e36e0 d4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e36e8 $rbx: .cfa -40 + ^ +STACK CFI e36fb .cfa: $rsp 48 + +STACK CFI e3705 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT e37c0 82 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e37c1 .cfa: $rsp 16 + +STACK CFI e37c3 $rbp: .cfa -16 + ^ +STACK CFI e37c4 .cfa: $rsp 24 + +STACK CFI e37c7 $rbx: .cfa -24 + ^ +STACK CFI e37cb .cfa: $rsp 32 + +STACK CFI INIT e3850 6e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e385d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI e3866 .cfa: $rsp 32 + +STACK CFI e386e $r12: .cfa -16 + ^ +STACK CFI INIT e38c0 21c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e38c2 .cfa: $rsp 16 + +STACK CFI e38c5 $r15: .cfa -16 + ^ +STACK CFI e38c7 .cfa: $rsp 24 + +STACK CFI e38ca $r14: .cfa -24 + ^ +STACK CFI e38cc .cfa: $rsp 32 + +STACK CFI e38cf $r13: .cfa -32 + ^ +STACK CFI e38d1 .cfa: $rsp 40 + +STACK CFI e38d4 $r12: .cfa -40 + ^ +STACK CFI e38d5 .cfa: $rsp 48 + +STACK CFI e38d7 $rbp: .cfa -48 + ^ +STACK CFI e38d8 .cfa: $rsp 56 + +STACK CFI e38dc .cfa: $rsp 112 + +STACK CFI e38e7 $rbx: .cfa -56 + ^ +STACK CFI INIT e3ae0 27f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e3afa $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI e3b08 .cfa: $rsp 80 + +STACK CFI e3b17 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT e3d60 1cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e3d6d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI e3d82 .cfa: $rsp 48 + +STACK CFI e3d86 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT e3f30 564 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e3f32 .cfa: $rsp 16 + +STACK CFI e3f35 $r15: .cfa -16 + ^ +STACK CFI e3f37 .cfa: $rsp 24 + +STACK CFI e3f3a $r14: .cfa -24 + ^ +STACK CFI e3f3c .cfa: $rsp 32 + +STACK CFI e3f3f $r13: .cfa -32 + ^ +STACK CFI e3f46 .cfa: $rsp 40 + +STACK CFI e3f49 $r12: .cfa -40 + ^ +STACK CFI e3f4a .cfa: $rsp 48 + +STACK CFI e3f4b .cfa: $rsp 56 + +STACK CFI e3f4f .cfa: $rsp 128 + +STACK CFI e3f61 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT e44a0 7e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e44a2 .cfa: $rsp 16 + +STACK CFI e44a4 .cfa: $rsp 24 + +STACK CFI e44a6 .cfa: $rsp 32 + +STACK CFI e44a9 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI e44aa .cfa: $rsp 40 + +STACK CFI e44ab .cfa: $rsp 48 + +STACK CFI e44b7 $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT e4520 1418 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e4521 .cfa: $rsp 16 + +STACK CFI e4524 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI e4529 $r15: .cfa -24 + ^ +STACK CFI e455b $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT e5940 a7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e594e .cfa: $rsp 32 + +STACK CFI e5954 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT e59f0 14c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e59f1 .cfa: $rsp 16 + +STACK CFI e59f5 .cfa: $rsp 24 + +STACK CFI e59f8 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI e59ff .cfa: $rsp 256 + +STACK CFI INIT e5b40 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e5b50 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e5b51 .cfa: $rsp 16 + +STACK CFI e5b59 $rbp: .cfa -16 + ^ +STACK CFI e5b5a .cfa: $rsp 24 + +STACK CFI e5b5d $rbx: .cfa -24 + ^ +STACK CFI e5b63 .cfa: $rsp 32 + +STACK CFI INIT e5ba0 96 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e5ba1 .cfa: $rsp 16 + +STACK CFI e5ba2 .cfa: $rsp 24 + +STACK CFI e5ba5 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI e5ba9 .cfa: $rsp 32 + +STACK CFI INIT e5c40 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e5c80 8e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e5c84 .cfa: $rsp 16 + +STACK CFI e5c8c $rbx: .cfa -16 + ^ +STACK CFI INIT e5d10 12c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e5d11 .cfa: $rsp 16 + +STACK CFI e5d14 $rbp: .cfa -16 + ^ +STACK CFI e5d15 .cfa: $rsp 24 + +STACK CFI e5d18 $rbx: .cfa -24 + ^ +STACK CFI e5d1c .cfa: $rsp 32 + +STACK CFI INIT e5e40 30f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e5e42 .cfa: $rsp 16 + +STACK CFI e5e44 .cfa: $rsp 24 + +STACK CFI e5e47 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI e5e49 .cfa: $rsp 32 + +STACK CFI e5e4b .cfa: $rsp 40 + +STACK CFI e5e4c .cfa: $rsp 48 + +STACK CFI e5e4f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI e5e50 .cfa: $rsp 56 + +STACK CFI e5e54 .cfa: $rsp 112 + +STACK CFI e5e5b $rbx: .cfa -56 + ^ +STACK CFI INIT e6150 c76 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e6151 .cfa: $rsp 16 + +STACK CFI e6154 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI e615d $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI e6163 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT e6dd0 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e6e00 5a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e6e60 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e6e80 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e6ed0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e6f00 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e6f30 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e6f60 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e6f90 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e6fc0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e6ff0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7020 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7050 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7080 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e70b0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e70e0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7110 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7140 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7170 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 111df0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e71a0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 111e20 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e71d0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 111e50 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7200 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 111e80 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7230 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 111eb0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7260 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 111ee0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7290 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e72c0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e72f0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7320 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7350 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7380 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e73b0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e73e0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7410 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7440 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 111f10 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 111f14 .cfa: $rsp 16 + +STACK CFI INIT e7470 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e7474 .cfa: $rsp 16 + +STACK CFI INIT e74b0 27 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e74b2 .cfa: $rsp 16 + +STACK CFI e74b3 $r10: .cfa -16 + ^ $rdx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e74d4 $rdx: $rdx .cfa: $rsp 16 + +STACK CFI e74d6 $r10: $r10 .cfa: $rsp 8 + +STACK CFI INIT e74e0 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e74e1 .cfa: $rsp 16 + +STACK CFI e74e2 $rdx: .cfa -24 + ^ $rsi: .cfa -16 + ^ .cfa: $rsp 24 + +STACK CFI e74fa $rdx: $rdx .cfa: $rsp 16 + +STACK CFI e74fb $rsi: $rsi .cfa: $rsp 8 + +STACK CFI INIT e7500 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e7530 .cfa: $rsp 16 + +STACK CFI INIT e7560 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e75c0 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 136565 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 136573 .cfa: $rsp 0 + +STACK CFI 136577 .cfa: $rsp 128 + +STACK CFI 13657f .cfa: $rsp -128 + +STACK CFI INIT 136581 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 13658f .cfa: $rsp 0 + +STACK CFI 136593 .cfa: $rsp 128 + +STACK CFI 13659b .cfa: $rsp -128 + +STACK CFI INIT e777a 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e7788 .cfa: $rsp 0 + +STACK CFI e778c .cfa: $rsp 128 + +STACK CFI e7794 .cfa: $rsp -128 + +STACK CFI INIT e7799 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e77a7 .cfa: $rsp 0 + +STACK CFI e77ab .cfa: $rsp 128 + +STACK CFI e77b3 .cfa: $rsp -128 + +STACK CFI INIT e75e0 27 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1364e0 85 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1364e1 .cfa: $rsp 16 + +STACK CFI 13654d $rbx: .cfa -16 + ^ +STACK CFI INIT e7610 16a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e7612 .cfa: $rsp 16 + +STACK CFI e7617 $r12: .cfa -16 + ^ +STACK CFI e7618 .cfa: $rsp 24 + +STACK CFI e761b $rbp: .cfa -24 + ^ +STACK CFI e761c .cfa: $rsp 32 + +STACK CFI e761f $rbx: .cfa -32 + ^ +STACK CFI e7628 .cfa: $rsp 48 + +STACK CFI INIT e7920 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e792e .cfa: $rsp 0 + +STACK CFI e7932 .cfa: $rsp 128 + +STACK CFI e793a .cfa: $rsp -128 + +STACK CFI INIT e793f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI e794d .cfa: $rsp 0 + +STACK CFI e7951 .cfa: $rsp 128 + +STACK CFI e7959 .cfa: $rsp -128 + +STACK CFI INIT e77c0 160 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e77c1 .cfa: $rsp 16 + +STACK CFI e77ce $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI INIT 1365a0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7960 5a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e7961 .cfa: $rsp 16 + +STACK CFI e796d $rbx: .cfa -16 + ^ +STACK CFI INIT e79c0 68 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7a30 cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e7a43 .cfa: $rsp 96 + +STACK CFI e7a4c $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT e7b00 14d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e7b02 .cfa: $rsp 16 + +STACK CFI e7b04 .cfa: $rsp 24 + +STACK CFI e7b06 .cfa: $rsp 32 + +STACK CFI e7b08 .cfa: $rsp 40 + +STACK CFI e7b09 .cfa: $rsp 48 + +STACK CFI e7b0c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI e7b0d .cfa: $rsp 56 + +STACK CFI e7b11 .cfa: $rsp 128 + +STACK CFI e7b40 $rbx: .cfa -56 + ^ +STACK CFI INIT e7c50 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e7c54 .cfa: $rsp 32 + +STACK CFI INIT e7c70 7a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e7c7c $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI e7c85 .cfa: $rsp 48 + +STACK CFI e7ca7 $rbx: .cfa -32 + ^ +STACK CFI INIT e7cf0 325 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e7cf2 .cfa: $rsp 16 + +STACK CFI e7cf4 .cfa: $rsp 24 + +STACK CFI e7cf6 .cfa: $rsp 32 + +STACK CFI e7cf8 .cfa: $rsp 40 + +STACK CFI e7cf9 .cfa: $rsp 48 + +STACK CFI e7cfa .cfa: $rsp 56 + +STACK CFI e7cfd $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI e7d01 .cfa: $rsp 176 + +STACK CFI INIT e8020 99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e80c0 2e6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e80cd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI e80e5 .cfa: $rsp 128 + +STACK CFI e80ea $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT e83b0 bf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e83b4 .cfa: $rsp 16 + +STACK CFI e83bd $rbx: .cfa -16 + ^ +STACK CFI INIT e8470 18e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e8471 .cfa: $rsp 16 + +STACK CFI e8474 .cfa: $rsp 24 + +STACK CFI e8483 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT e8600 cb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e860d $r12: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI e861b .cfa: $rsp 48 + +STACK CFI e8628 $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT 1369f0 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1369f1 .cfa: $rsp 16 + +STACK CFI 1369f8 $rbx: .cfa -16 + ^ +STACK CFI INIT e86d0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e86e0 13 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e86e4 .cfa: $rsp 16 + +STACK CFI INIT e8700 303 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e8702 .cfa: $rsp 16 + +STACK CFI e8709 $r15: .cfa -16 + ^ +STACK CFI e870b .cfa: $rsp 24 + +STACK CFI e8712 $r14: .cfa -24 + ^ +STACK CFI e8714 .cfa: $rsp 32 + +STACK CFI e871b $r13: .cfa -32 + ^ +STACK CFI e871d .cfa: $rsp 40 + +STACK CFI e8723 $r12: .cfa -40 + ^ +STACK CFI e8724 .cfa: $rsp 48 + +STACK CFI e8727 $rbp: .cfa -48 + ^ +STACK CFI e8728 .cfa: $rsp 56 + +STACK CFI e872b $rbx: .cfa -56 + ^ +STACK CFI e872f .cfa: $rsp 64 + +STACK CFI INIT e8a10 b84 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e8a12 .cfa: $rsp 16 + +STACK CFI e8a14 .cfa: $rsp 24 + +STACK CFI e8a16 .cfa: $rsp 32 + +STACK CFI e8a18 .cfa: $rsp 40 + +STACK CFI e8a19 .cfa: $rsp 48 + +STACK CFI e8a1a .cfa: $rsp 56 + +STACK CFI e8a1d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI e8a24 .cfa: $rsp 8416 + +STACK CFI INIT e95a0 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ea2b0 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI ea2be .cfa: $rsp 0 + +STACK CFI ea2c2 .cfa: $rsp 128 + +STACK CFI ea2ca .cfa: $rsp -128 + +STACK CFI INIT ea2cf 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI ea2dd .cfa: $rsp 0 + +STACK CFI ea2e1 .cfa: $rsp 128 + +STACK CFI ea2e9 .cfa: $rsp -128 + +STACK CFI INIT e95b0 93 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e95b2 .cfa: $rsp 16 + +STACK CFI e95b5 $r15: .cfa -16 + ^ +STACK CFI e95b7 .cfa: $rsp 24 + +STACK CFI e95b9 .cfa: $rsp 32 + +STACK CFI e95bb .cfa: $rsp 40 + +STACK CFI e95bc .cfa: $rsp 48 + +STACK CFI e95bd .cfa: $rsp 56 + +STACK CFI e95c1 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 80 + +STACK CFI INIT e9650 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e9651 .cfa: $rsp 16 + +STACK CFI e9654 $rbp: .cfa -16 + ^ +STACK CFI e9655 .cfa: $rsp 24 + +STACK CFI e9659 .cfa: $rsp 32 + +STACK CFI e9667 $rbx: .cfa -24 + ^ +STACK CFI INIT e96b0 2a1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e96bd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI e96d5 .cfa: $rsp 96 + +STACK CFI e96e2 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT e9960 f7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e996c $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ +STACK CFI e9983 $r13: .cfa -16 + ^ $rbx: .cfa -40 + ^ +STACK CFI e9987 .cfa: $rsp 64 + +STACK CFI INIT e9a60 11f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e9a62 .cfa: $rsp 16 + +STACK CFI e9a66 .cfa: $rsp 24 + +STACK CFI e9a67 .cfa: $rsp 32 + +STACK CFI e9a70 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT e9b80 221 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e9b82 .cfa: $rsp 16 + +STACK CFI e9b8c $r15: .cfa -16 + ^ +STACK CFI e9b8e .cfa: $rsp 24 + +STACK CFI e9b90 .cfa: $rsp 32 + +STACK CFI e9b92 .cfa: $rsp 40 + +STACK CFI e9b93 .cfa: $rsp 48 + +STACK CFI e9b95 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI e9b96 .cfa: $rsp 56 + +STACK CFI e9b99 $rbx: .cfa -56 + ^ +STACK CFI e9ba0 .cfa: $rsp 80 + +STACK CFI INIT e9db0 49a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e9db2 .cfa: $rsp 16 + +STACK CFI e9dbb .cfa: $rsp 24 + +STACK CFI e9dbd .cfa: $rsp 32 + +STACK CFI e9dbf .cfa: $rsp 40 + +STACK CFI e9dc0 .cfa: $rsp 48 + +STACK CFI e9dc1 .cfa: $rsp 56 + +STACK CFI e9dc8 .cfa: $rsp 400 + +STACK CFI e9dd9 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT ea250 60 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ea254 .cfa: $rsp 16 + +STACK CFI INIT ea4fe 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI ea50c .cfa: $rsp 0 + +STACK CFI ea510 .cfa: $rsp 128 + +STACK CFI ea518 .cfa: $rsp -128 + +STACK CFI INIT ea51d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI ea52b .cfa: $rsp 0 + +STACK CFI ea52f .cfa: $rsp 128 + +STACK CFI ea537 .cfa: $rsp -128 + +STACK CFI INIT ea2f0 b6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ea2f4 .cfa: $rsp 32 + +STACK CFI INIT ea3b0 14e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ea3b1 .cfa: $rsp 16 + +STACK CFI ea3b4 $rbx: .cfa -16 + ^ +STACK CFI ea3bb .cfa: $rsp 160 + +STACK CFI INIT ea540 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ea550 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ea55c $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI ea568 .cfa: $rsp 160 + +STACK CFI ea587 $r12: .cfa -16 + ^ +STACK CFI INIT eb61a 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI eb628 .cfa: $rsp 0 + +STACK CFI eb62c .cfa: $rsp 128 + +STACK CFI eb634 .cfa: $rsp -128 + +STACK CFI INIT eb639 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI eb647 .cfa: $rsp 0 + +STACK CFI eb64b .cfa: $rsp 128 + +STACK CFI eb653 .cfa: $rsp -128 + +STACK CFI INIT eb658 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI eb666 .cfa: $rsp 0 + +STACK CFI eb66a .cfa: $rsp 128 + +STACK CFI eb672 .cfa: $rsp -128 + +STACK CFI INIT eb677 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI eb685 .cfa: $rsp 0 + +STACK CFI eb689 .cfa: $rsp 128 + +STACK CFI eb691 .cfa: $rsp -128 + +STACK CFI INIT eb696 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI eb6a4 .cfa: $rsp 0 + +STACK CFI eb6a8 .cfa: $rsp 128 + +STACK CFI eb6b0 .cfa: $rsp -128 + +STACK CFI INIT eb6b5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI eb6c3 .cfa: $rsp 0 + +STACK CFI eb6c7 .cfa: $rsp 128 + +STACK CFI eb6cf .cfa: $rsp -128 + +STACK CFI INIT ea5e0 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ea610 63 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ea612 .cfa: $rsp 16 + +STACK CFI ea616 .cfa: $rsp 24 + +STACK CFI ea619 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI ea61a .cfa: $rsp 32 + +STACK CFI ea61c $rbx: .cfa -32 + ^ +STACK CFI INIT 1365d0 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 136600 75 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136602 .cfa: $rsp 16 + +STACK CFI 136603 .cfa: $rsp 24 + +STACK CFI 13660a $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI 13660b .cfa: $rsp 32 + +STACK CFI 136610 $rbx: .cfa -32 + ^ +STACK CFI INIT ea680 373 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ea681 .cfa: $rsp 16 + +STACK CFI ea686 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI ea691 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI ea6d4 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI INIT eaa00 af .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eaa02 .cfa: $rsp 16 + +STACK CFI eaa04 .cfa: $rsp 24 + +STACK CFI eaa07 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI eaa09 .cfa: $rsp 32 + +STACK CFI eaa0c $r12: .cfa -32 + ^ +STACK CFI eaa0d .cfa: $rsp 40 + +STACK CFI eaa10 $rbp: .cfa -40 + ^ +STACK CFI eaa11 .cfa: $rsp 48 + +STACK CFI eaa14 $rbx: .cfa -48 + ^ +STACK CFI INIT eaab0 13 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT eaad0 511 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eaad2 .cfa: $rsp 16 + +STACK CFI eaad4 .cfa: $rsp 24 + +STACK CFI eaad7 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI eaad9 .cfa: $rsp 32 + +STACK CFI eaadb .cfa: $rsp 40 + +STACK CFI eaadc .cfa: $rsp 48 + +STACK CFI eaadd .cfa: $rsp 56 + +STACK CFI eaae1 .cfa: $rsp 112 + +STACK CFI eaae8 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT eaff0 107 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eaff2 .cfa: $rsp 16 + +STACK CFI eaff4 .cfa: $rsp 24 + +STACK CFI eaff7 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI eaff9 .cfa: $rsp 32 + +STACK CFI eaffc $r13: .cfa -32 + ^ +STACK CFI eaffe .cfa: $rsp 40 + +STACK CFI eb005 $r12: .cfa -40 + ^ +STACK CFI eb006 .cfa: $rsp 48 + +STACK CFI eb007 .cfa: $rsp 56 + +STACK CFI eb009 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI eb00d .cfa: $rsp 64 + +STACK CFI INIT eb100 104 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eb10d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI eb123 .cfa: $rsp 48 + +STACK CFI eb129 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 111f50 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT eb210 40a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eb21d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI eb22a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI eb23e .cfa: $rsp 144 + +STACK CFI eb274 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT eb6e0 db .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eb6e2 .cfa: $rsp 16 + +STACK CFI eb6e5 $r15: .cfa -16 + ^ +STACK CFI eb6e7 .cfa: $rsp 24 + +STACK CFI eb6ea $r14: .cfa -24 + ^ +STACK CFI eb6ec .cfa: $rsp 32 + +STACK CFI eb6ee .cfa: $rsp 40 + +STACK CFI eb6f1 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI eb6f2 .cfa: $rsp 48 + +STACK CFI eb6f5 $rbp: .cfa -48 + ^ +STACK CFI eb6f6 .cfa: $rsp 56 + +STACK CFI eb6f9 $rbx: .cfa -56 + ^ +STACK CFI eb6fd .cfa: $rsp 112 + +STACK CFI INIT eb7c0 7e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eb7c1 .cfa: $rsp 16 + +STACK CFI eb7c4 $rbx: .cfa -16 + ^ +STACK CFI eb7cb .cfa: $rsp 32 + +STACK CFI INIT eb840 c9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eb842 .cfa: $rsp 16 + +STACK CFI eb845 $r15: .cfa -16 + ^ +STACK CFI eb847 .cfa: $rsp 24 + +STACK CFI eb84a $r14: .cfa -24 + ^ +STACK CFI eb84c .cfa: $rsp 32 + +STACK CFI eb84e .cfa: $rsp 40 + +STACK CFI eb851 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI eb852 .cfa: $rsp 48 + +STACK CFI eb855 $rbp: .cfa -48 + ^ +STACK CFI eb856 .cfa: $rsp 56 + +STACK CFI eb859 $rbx: .cfa -56 + ^ +STACK CFI eb85d .cfa: $rsp 80 + +STACK CFI INIT eb910 111 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eb912 .cfa: $rsp 16 + +STACK CFI eb915 $r15: .cfa -16 + ^ +STACK CFI eb917 .cfa: $rsp 24 + +STACK CFI eb91a $r14: .cfa -24 + ^ +STACK CFI eb91c .cfa: $rsp 32 + +STACK CFI eb91f $r13: .cfa -32 + ^ +STACK CFI eb921 .cfa: $rsp 40 + +STACK CFI eb924 $r12: .cfa -40 + ^ +STACK CFI eb925 .cfa: $rsp 48 + +STACK CFI eb926 .cfa: $rsp 56 + +STACK CFI eb929 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI eb92d .cfa: $rsp 96 + +STACK CFI INIT eba30 2af .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eba32 .cfa: $rsp 16 + +STACK CFI eba34 .cfa: $rsp 24 + +STACK CFI eba37 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI eba39 .cfa: $rsp 32 + +STACK CFI eba3b .cfa: $rsp 40 + +STACK CFI eba3c .cfa: $rsp 48 + +STACK CFI eba3f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI eba40 .cfa: $rsp 56 + +STACK CFI eba43 $rbx: .cfa -56 + ^ +STACK CFI eba47 .cfa: $rsp 144 + +STACK CFI INIT ebce0 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ebced $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ebcfb .cfa: $rsp 48 + +STACK CFI ebd08 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 111f60 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ebd90 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ebd9d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ebdab .cfa: $rsp 48 + +STACK CFI ebdb8 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 111f70 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ebe40 a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ebe4d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ebe5b .cfa: $rsp 48 + +STACK CFI ebe68 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 111f80 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ebef0 a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ebefd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ebf0b .cfa: $rsp 48 + +STACK CFI ebf18 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 111f90 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ebfa0 9e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ebfad $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ebfbb .cfa: $rsp 48 + +STACK CFI ebfc8 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 111fa0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ec040 9e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ec04d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ec05b .cfa: $rsp 48 + +STACK CFI ec068 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT ec0e0 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ec0ed $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ec0fb .cfa: $rsp 48 + +STACK CFI ec108 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 111fb0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ec190 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ec19d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ec1ab .cfa: $rsp 48 + +STACK CFI ec1b8 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 111fc0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ec240 9e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ec24d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ec25b .cfa: $rsp 48 + +STACK CFI ec268 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 111fd0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ec2e0 9e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ec2ed $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ec2fb .cfa: $rsp 48 + +STACK CFI ec308 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 111fe0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ec380 9e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ec38d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ec39b .cfa: $rsp 48 + +STACK CFI ec3a8 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 111ff0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ec420 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ec42d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ec43b .cfa: $rsp 48 + +STACK CFI ec448 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 112000 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ec4d0 9e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ec4dd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ec4eb .cfa: $rsp 48 + +STACK CFI ec4f8 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 112010 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ec570 6d3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ec572 .cfa: $rsp 16 + +STACK CFI ec574 .cfa: $rsp 24 + +STACK CFI ec576 .cfa: $rsp 32 + +STACK CFI ec578 .cfa: $rsp 40 + +STACK CFI ec57b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI ec57c .cfa: $rsp 48 + +STACK CFI ec57f $rbp: .cfa -48 + ^ +STACK CFI ec580 .cfa: $rsp 56 + +STACK CFI ec583 $rbx: .cfa -56 + ^ +STACK CFI ec587 .cfa: $rsp 128 + +STACK CFI INIT ecc50 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ecc60 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ecca0 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ecca4 .cfa: $rsp 16 + +STACK CFI INIT eccf0 18c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eccf2 .cfa: $rsp 16 + +STACK CFI eccf4 .cfa: $rsp 24 + +STACK CFI eccf5 .cfa: $rsp 32 + +STACK CFI eccf6 .cfa: $rsp 40 + +STACK CFI eccf9 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI eccfd .cfa: $rsp 48 + +STACK CFI INIT ece80 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ecec0 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ecef0 15d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ed050 57 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed054 .cfa: $rsp 16 + +STACK CFI INIT ed0b0 15d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ed210 124 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed214 .cfa: $rsp 16 + +STACK CFI INIT ed340 e5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed344 .cfa: $rsp 16 + +STACK CFI INIT ed430 ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed434 .cfa: $rsp 16 + +STACK CFI INIT ed520 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed521 .cfa: $rsp 16 + +STACK CFI ed52c $rbx: .cfa -16 + ^ +STACK CFI ed53a .cfa: $rsp 224 + +STACK CFI INIT ed5b0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed5b4 .cfa: $rsp 16 + +STACK CFI INIT ed5c0 e2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed5cd $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI ed5eb .cfa: $rsp 304 + +STACK CFI ed5f1 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI INIT ed6b0 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed6b1 .cfa: $rsp 16 + +STACK CFI ed6bc $rbx: .cfa -16 + ^ +STACK CFI ed6ca .cfa: $rsp 224 + +STACK CFI INIT ed740 11b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed74d $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI ed76b .cfa: $rsp 368 + +STACK CFI ed771 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT ed9fd 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI eda07 .cfa: $rsp 0 + +STACK CFI eda0b .cfa: $rsp 128 + +STACK CFI eda13 .cfa: $rsp -128 + +STACK CFI INIT eda18 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI eda22 .cfa: $rsp 0 + +STACK CFI eda26 .cfa: $rsp 128 + +STACK CFI eda2e .cfa: $rsp -128 + +STACK CFI INIT eda33 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI eda3d .cfa: $rsp 0 + +STACK CFI eda41 .cfa: $rsp 128 + +STACK CFI eda49 .cfa: $rsp -128 + +STACK CFI INIT ed860 19d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed862 .cfa: $rsp 16 + +STACK CFI ed868 $r12: .cfa -16 + ^ +STACK CFI ed869 .cfa: $rsp 24 + +STACK CFI ed86a .cfa: $rsp 32 + +STACK CFI ed871 .cfa: $rsp 240 + +STACK CFI ed878 $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT edbe2 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI edbec .cfa: $rsp 0 + +STACK CFI edbf0 .cfa: $rsp 128 + +STACK CFI edbf8 .cfa: $rsp -128 + +STACK CFI INIT edbfd 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI edc07 .cfa: $rsp 0 + +STACK CFI edc0b .cfa: $rsp 128 + +STACK CFI edc13 .cfa: $rsp -128 + +STACK CFI INIT edc18 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI edc22 .cfa: $rsp 0 + +STACK CFI edc26 .cfa: $rsp 128 + +STACK CFI edc2e .cfa: $rsp -128 + +STACK CFI INIT eda50 192 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eda51 .cfa: $rsp 16 + +STACK CFI eda56 $rbp: .cfa -16 + ^ +STACK CFI eda57 .cfa: $rsp 24 + +STACK CFI eda5a $rbx: .cfa -24 + ^ +STACK CFI eda61 .cfa: $rsp 240 + +STACK CFI INIT edd5f 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI edd69 .cfa: $rsp 0 + +STACK CFI edd6d .cfa: $rsp 128 + +STACK CFI edd75 .cfa: $rsp -128 + +STACK CFI INIT edd7a 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI edd84 .cfa: $rsp 0 + +STACK CFI edd88 .cfa: $rsp 128 + +STACK CFI edd90 .cfa: $rsp -128 + +STACK CFI INIT edd95 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI edd9f .cfa: $rsp 0 + +STACK CFI edda3 .cfa: $rsp 128 + +STACK CFI eddab .cfa: $rsp -128 + +STACK CFI INIT edc30 12f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI edc3c $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI edc45 .cfa: $rsp 32 + +STACK CFI edc53 $rbx: .cfa -32 + ^ +STACK CFI INIT edeca 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI eded4 .cfa: $rsp 0 + +STACK CFI eded8 .cfa: $rsp 128 + +STACK CFI edee0 .cfa: $rsp -128 + +STACK CFI INIT edee5 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI edeef .cfa: $rsp 0 + +STACK CFI edef3 .cfa: $rsp 128 + +STACK CFI edefb .cfa: $rsp -128 + +STACK CFI INIT edf00 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI edf0a .cfa: $rsp 0 + +STACK CFI edf0e .cfa: $rsp 128 + +STACK CFI edf16 .cfa: $rsp -128 + +STACK CFI INIT eddb0 11a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eddb1 .cfa: $rsp 16 + +STACK CFI eddb6 $rbp: .cfa -16 + ^ +STACK CFI eddba .cfa: $rsp 24 + +STACK CFI eddbd $rbx: .cfa -24 + ^ +STACK CFI eddc1 .cfa: $rsp 32 + +STACK CFI INIT ee0f9 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI ee103 .cfa: $rsp 0 + +STACK CFI ee107 .cfa: $rsp 128 + +STACK CFI ee10f .cfa: $rsp -128 + +STACK CFI INIT ee114 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI ee11e .cfa: $rsp 0 + +STACK CFI ee122 .cfa: $rsp 128 + +STACK CFI ee12a .cfa: $rsp -128 + +STACK CFI INIT ee12f 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI ee139 .cfa: $rsp 0 + +STACK CFI ee13d .cfa: $rsp 128 + +STACK CFI ee145 .cfa: $rsp -128 + +STACK CFI INIT edf20 1d9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI edf2d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI edf3b .cfa: $rsp 48 + +STACK CFI edf47 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT ee150 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee15b .cfa: $rsp 16 + +STACK CFI INIT ee160 206 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee162 .cfa: $rsp 16 + +STACK CFI ee168 .cfa: $rsp 24 + +STACK CFI ee16a .cfa: $rsp 32 + +STACK CFI ee16c .cfa: $rsp 40 + +STACK CFI ee16f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI ee177 .cfa: $rsp 48 + +STACK CFI ee17a $rbp: .cfa -48 + ^ +STACK CFI ee182 .cfa: $rsp 56 + +STACK CFI ee186 .cfa: $rsp 128 + +STACK CFI ee18b $rbx: .cfa -56 + ^ +STACK CFI INIT ee50a 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI ee514 .cfa: $rsp 0 + +STACK CFI ee518 .cfa: $rsp 128 + +STACK CFI ee520 .cfa: $rsp -128 + +STACK CFI INIT ee525 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI ee52f .cfa: $rsp 0 + +STACK CFI ee533 .cfa: $rsp 128 + +STACK CFI ee53b .cfa: $rsp -128 + +STACK CFI INIT ee540 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI ee54a .cfa: $rsp 0 + +STACK CFI ee54e .cfa: $rsp 128 + +STACK CFI ee556 .cfa: $rsp -128 + +STACK CFI INIT ee370 19a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee37d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ee38b .cfa: $rsp 48 + +STACK CFI ee390 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT ee560 b6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee57a .cfa: $rsp 48 + +STACK CFI ee57f $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT ee620 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee624 .cfa: $rsp 16 + +STACK CFI INIT ee660 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee664 .cfa: $rsp 16 + +STACK CFI INIT ee680 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee684 .cfa: $rsp 16 + +STACK CFI INIT ee6a0 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee6a4 .cfa: $rsp 16 + +STACK CFI INIT ee6c0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee6c4 .cfa: $rsp 16 + +STACK CFI INIT ee6f0 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee6f4 .cfa: $rsp 16 + +STACK CFI INIT ee730 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee734 .cfa: $rsp 16 + +STACK CFI INIT ee750 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee754 .cfa: $rsp 16 + +STACK CFI INIT ee780 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee784 .cfa: $rsp 16 + +STACK CFI INIT ee7a0 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee7a4 .cfa: $rsp 16 + +STACK CFI INIT ee7c0 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee7c4 .cfa: $rsp 16 + +STACK CFI INIT ee98a 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI ee994 .cfa: $rsp 0 + +STACK CFI ee998 .cfa: $rsp 128 + +STACK CFI ee9a0 .cfa: $rsp -128 + +STACK CFI INIT ee9a5 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI ee9af .cfa: $rsp 0 + +STACK CFI ee9b3 .cfa: $rsp 128 + +STACK CFI ee9bb .cfa: $rsp -128 + +STACK CFI INIT ee9c0 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI ee9ca .cfa: $rsp 0 + +STACK CFI ee9ce .cfa: $rsp 128 + +STACK CFI ee9d6 .cfa: $rsp -128 + +STACK CFI INIT ee7e0 1aa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee7e8 $r12: .cfa -24 + ^ +STACK CFI ee7f4 $r13: .cfa -16 + ^ +STACK CFI ee80d .cfa: $rsp 48 + +STACK CFI ee816 $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT ee9e0 8c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ee9e8 $r12: .cfa -16 + ^ +STACK CFI ee9f4 $rbx: .cfa -32 + ^ +STACK CFI eea08 .cfa: $rsp 32 + +STACK CFI eea0e $rbp: .cfa -24 + ^ +STACK CFI INIT eea70 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eea74 .cfa: $rsp 16 + +STACK CFI INIT eea90 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eea94 .cfa: $rsp 16 + +STACK CFI INIT eead0 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eead4 .cfa: $rsp 16 + +STACK CFI INIT eeaf0 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eeaf4 .cfa: $rsp 16 + +STACK CFI INIT eeb10 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eeb14 .cfa: $rsp 16 + +STACK CFI INIT eeb30 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eeb37 .cfa: $rsp 224 + +STACK CFI INIT eebc0 19f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eebcd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI eebed .cfa: $rsp 304 + +STACK CFI eebf0 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT eed60 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eed67 .cfa: $rsp 224 + +STACK CFI INIT eedf0 104 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eee0e $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI eee1a .cfa: $rsp 608 + +STACK CFI eee2a $r14: .cfa -16 + ^ +STACK CFI INIT eef00 1d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eef0d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI eef2b .cfa: $rsp 320 + +STACK CFI eef33 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT ef0e0 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef0e7 .cfa: $rsp 224 + +STACK CFI INIT ef170 4a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef17e .cfa: $rsp 32 + +STACK CFI ef181 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT ef1c0 9b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef1fb $rdi: $r10 +STACK CFI ef1fd $rsi: $rbx +STACK CFI ef23c $rdi: $rdi +STACK CFI ef23e $r12: .cfa 16 + ^ $r13: .cfa 24 + ^ $r14: .cfa 32 + ^ $r15: .cfa 40 + ^ $rbp: $r9 $rbx: .cfa 0 + ^ $rsi: $rsi $rsp: $r8 .cfa: $rdi 0 + .ra: $rdx +STACK CFI INIT ef260 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef26b .cfa: $rsp 16 + +STACK CFI INIT ef270 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef271 .cfa: $rsp 16 + +STACK CFI ef274 $rbp: .cfa -16 + ^ +STACK CFI ef275 .cfa: $rsp 24 + +STACK CFI ef27c $rbx: .cfa -24 + ^ +STACK CFI ef280 .cfa: $rsp 32 + +STACK CFI INIT ef2b0 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef2b4 .cfa: $rsp 16 + +STACK CFI INIT ef2d0 74 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef2d1 .cfa: $rsp 16 + +STACK CFI ef2d4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI ef2dc $rbx: .cfa -24 + ^ +STACK CFI INIT 136680 2d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136688 .cfa: $rsp 16 + +STACK CFI 136696 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI INIT ef350 6d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef351 .cfa: $rsp 16 + +STACK CFI ef360 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI INIT ef3c0 c1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef3c1 .cfa: $rsp 16 + +STACK CFI ef3c4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI ef3c7 $rbx: .cfa -24 + ^ +STACK CFI INIT ef490 289 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef491 .cfa: $rsp 16 + +STACK CFI ef497 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI ef49c $r15: .cfa -24 + ^ +STACK CFI ef4a3 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI ef4f4 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT ef720 2cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef722 .cfa: $rsp 16 + +STACK CFI ef724 .cfa: $rsp 24 + +STACK CFI ef726 .cfa: $rsp 32 + +STACK CFI ef728 .cfa: $rsp 40 + +STACK CFI ef729 .cfa: $rsp 48 + +STACK CFI ef72a .cfa: $rsp 56 + +STACK CFI ef731 .cfa: $rsp 336 + +STACK CFI ef741 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT efb8d 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI efb97 .cfa: $rsp 0 + +STACK CFI efb9b .cfa: $rsp 128 + +STACK CFI efba3 .cfa: $rsp -128 + +STACK CFI INIT efba8 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI efbb2 .cfa: $rsp 0 + +STACK CFI efbb6 .cfa: $rsp 128 + +STACK CFI efbbe .cfa: $rsp -128 + +STACK CFI INIT efbc3 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI efbcd .cfa: $rsp 0 + +STACK CFI efbd1 .cfa: $rsp 128 + +STACK CFI efbd9 .cfa: $rsp -128 + +STACK CFI INIT ef9f0 19d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef9f2 .cfa: $rsp 16 + +STACK CFI ef9f8 $r12: .cfa -16 + ^ +STACK CFI ef9f9 .cfa: $rsp 24 + +STACK CFI ef9fa .cfa: $rsp 32 + +STACK CFI efa01 .cfa: $rsp 240 + +STACK CFI efa08 $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT efd72 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI efd7c .cfa: $rsp 0 + +STACK CFI efd80 .cfa: $rsp 128 + +STACK CFI efd88 .cfa: $rsp -128 + +STACK CFI INIT efd8d 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI efd97 .cfa: $rsp 0 + +STACK CFI efd9b .cfa: $rsp 128 + +STACK CFI efda3 .cfa: $rsp -128 + +STACK CFI INIT efda8 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI efdb2 .cfa: $rsp 0 + +STACK CFI efdb6 .cfa: $rsp 128 + +STACK CFI efdbe .cfa: $rsp -128 + +STACK CFI INIT efbe0 192 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI efbe1 .cfa: $rsp 16 + +STACK CFI efbe6 $rbp: .cfa -16 + ^ +STACK CFI efbe7 .cfa: $rsp 24 + +STACK CFI efbea $rbx: .cfa -24 + ^ +STACK CFI efbf1 .cfa: $rsp 240 + +STACK CFI INIT efeef 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI efef9 .cfa: $rsp 0 + +STACK CFI efefd .cfa: $rsp 128 + +STACK CFI eff05 .cfa: $rsp -128 + +STACK CFI INIT eff0a 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI eff14 .cfa: $rsp 0 + +STACK CFI eff18 .cfa: $rsp 128 + +STACK CFI eff20 .cfa: $rsp -128 + +STACK CFI INIT eff25 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI eff2f .cfa: $rsp 0 + +STACK CFI eff33 .cfa: $rsp 128 + +STACK CFI eff3b .cfa: $rsp -128 + +STACK CFI INIT efdc0 12f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI efdcc $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI efdd5 .cfa: $rsp 32 + +STACK CFI efde3 $rbx: .cfa -32 + ^ +STACK CFI INIT f005a 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI f0064 .cfa: $rsp 0 + +STACK CFI f0068 .cfa: $rsp 128 + +STACK CFI f0070 .cfa: $rsp -128 + +STACK CFI INIT f0075 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI f007f .cfa: $rsp 0 + +STACK CFI f0083 .cfa: $rsp 128 + +STACK CFI f008b .cfa: $rsp -128 + +STACK CFI INIT f0090 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI f009a .cfa: $rsp 0 + +STACK CFI f009e .cfa: $rsp 128 + +STACK CFI f00a6 .cfa: $rsp -128 + +STACK CFI INIT eff40 11a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eff41 .cfa: $rsp 16 + +STACK CFI eff46 $rbp: .cfa -16 + ^ +STACK CFI eff4a .cfa: $rsp 24 + +STACK CFI eff4d $rbx: .cfa -24 + ^ +STACK CFI eff51 .cfa: $rsp 32 + +STACK CFI INIT f024a 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI f0254 .cfa: $rsp 0 + +STACK CFI f0258 .cfa: $rsp 128 + +STACK CFI f0260 .cfa: $rsp -128 + +STACK CFI INIT f0265 1b .cfa: $rsp -128 + .ra: $rip +STACK CFI f026f .cfa: $rsp 0 + +STACK CFI f0273 .cfa: $rsp 128 + +STACK CFI f027b .cfa: $rsp -128 + +STACK CFI INIT f0280 18 .cfa: $rsp -128 + .ra: $rip +STACK CFI f028a .cfa: $rsp 0 + +STACK CFI f028e .cfa: $rsp 128 + +STACK CFI f0296 .cfa: $rsp -128 + +STACK CFI INIT f00b0 19a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f00bd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI f00cb .cfa: $rsp 48 + +STACK CFI f00d0 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT f02a0 be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f02ba .cfa: $rsp 48 + +STACK CFI f02bf $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT f0360 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0364 .cfa: $rsp 16 + +STACK CFI INIT f03a0 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f03a7 .cfa: $rsp 16 + +STACK CFI INIT f03e0 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f03e4 .cfa: $rsp 16 + +STACK CFI INIT f0400 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0404 .cfa: $rsp 16 + +STACK CFI INIT f0420 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0424 .cfa: $rsp 16 + +STACK CFI INIT f0440 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f044b .cfa: $rsp 16 + +STACK CFI INIT f0480 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0484 .cfa: $rsp 16 + +STACK CFI INIT f04a0 58 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f04a4 .cfa: $rsp 16 + +STACK CFI INIT f0500 117 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0504 .cfa: $rsp 16 + +STACK CFI INIT f0620 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0624 .cfa: $rsp 16 + +STACK CFI INIT f0640 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0644 .cfa: $rsp 16 + +STACK CFI INIT f0660 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0661 .cfa: $rsp 16 + +STACK CFI f066c $rbx: .cfa -16 + ^ +STACK CFI f067a .cfa: $rsp 224 + +STACK CFI INIT f06f0 11c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f06fd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI f071b .cfa: $rsp 896 + +STACK CFI f0721 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT f0810 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0814 .cfa: $rsp 16 + +STACK CFI INIT f0840 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0844 .cfa: $rsp 16 + +STACK CFI INIT f0860 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0864 .cfa: $rsp 16 + +STACK CFI INIT f0880 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0884 .cfa: $rsp 16 + +STACK CFI INIT f08a0 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f08a4 .cfa: $rsp 16 + +STACK CFI INIT f08c0 30 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f08c4 .cfa: $rsp 48 + +STACK CFI INIT f08f0 30 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f08f4 .cfa: $rsp 48 + +STACK CFI INIT f0b3f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f0b4d .cfa: $rsp 0 + +STACK CFI f0b51 .cfa: $rsp 128 + +STACK CFI f0b59 .cfa: $rsp -128 + +STACK CFI INIT f0b5e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f0b6c .cfa: $rsp 0 + +STACK CFI f0b70 .cfa: $rsp 128 + +STACK CFI f0b78 .cfa: $rsp -128 + +STACK CFI INIT 1366b0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1366b4 .cfa: $rsp 16 + +STACK CFI INIT f0920 e4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0924 .cfa: $rsp 16 + +STACK CFI INIT f0a10 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0a14 .cfa: $rsp 48 + +STACK CFI INIT f0a90 af .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0a92 .cfa: $rsp 16 + +STACK CFI f0a98 $r14: .cfa -16 + ^ +STACK CFI f0a9a .cfa: $rsp 24 + +STACK CFI f0aa1 $r13: .cfa -24 + ^ +STACK CFI f0aa3 .cfa: $rsp 32 + +STACK CFI f0aa9 $r12: .cfa -32 + ^ +STACK CFI f0aaa .cfa: $rsp 40 + +STACK CFI f0aad $rbp: .cfa -40 + ^ +STACK CFI f0aae .cfa: $rsp 48 + +STACK CFI f0ab1 $rbx: .cfa -48 + ^ +STACK CFI INIT f0b80 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f0b90 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f0ba0 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f0bd0 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f0c20 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f0c50 99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0c72 .cfa: $rsp 80 + +STACK CFI f0c76 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT f0cf0 1e5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0cf1 .cfa: $rsp 16 + +STACK CFI f0cf9 .cfa: $rsp 24 + +STACK CFI f0cfd $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT f0ee0 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f108d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f109b .cfa: $rsp 0 + +STACK CFI f109f .cfa: $rsp 128 + +STACK CFI f10a7 .cfa: $rsp -128 + +STACK CFI INIT f10ac 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f10ba .cfa: $rsp 0 + +STACK CFI f10be .cfa: $rsp 128 + +STACK CFI f10c6 .cfa: $rsp -128 + +STACK CFI INIT f0f00 18d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0f02 .cfa: $rsp 16 + +STACK CFI f0f07 $r14: .cfa -16 + ^ +STACK CFI f0f09 .cfa: $rsp 24 + +STACK CFI f0f0c $r13: .cfa -24 + ^ +STACK CFI f0f13 .cfa: $rsp 32 + +STACK CFI f0f16 $r12: .cfa -32 + ^ +STACK CFI f0f17 .cfa: $rsp 40 + +STACK CFI f0f18 .cfa: $rsp 48 + +STACK CFI f0f1c .cfa: $rsp 80 + +STACK CFI f0f5a $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT f10d0 398 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f10d2 .cfa: $rsp 16 + +STACK CFI f10d5 $r15: .cfa -16 + ^ +STACK CFI f10d7 .cfa: $rsp 24 + +STACK CFI f10da $r14: .cfa -24 + ^ +STACK CFI f10dc .cfa: $rsp 32 + +STACK CFI f10df $r13: .cfa -32 + ^ +STACK CFI f10e1 .cfa: $rsp 40 + +STACK CFI f10e2 .cfa: $rsp 48 + +STACK CFI f10e3 .cfa: $rsp 56 + +STACK CFI f10e7 .cfa: $rsp 144 + +STACK CFI f1100 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f1626 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f1634 .cfa: $rsp 0 + +STACK CFI f1638 .cfa: $rsp 128 + +STACK CFI f1640 .cfa: $rsp -128 + +STACK CFI INIT f1645 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f1653 .cfa: $rsp 0 + +STACK CFI f1657 .cfa: $rsp 128 + +STACK CFI f165f .cfa: $rsp -128 + +STACK CFI INIT f1470 1b6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f1472 .cfa: $rsp 16 + +STACK CFI f147a $r12: .cfa -16 + ^ +STACK CFI f147d .cfa: $rsp 24 + +STACK CFI f147e .cfa: $rsp 32 + +STACK CFI f1482 .cfa: $rsp 80 + +STACK CFI f14be $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT f183a 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f1848 .cfa: $rsp 0 + +STACK CFI f184c .cfa: $rsp 128 + +STACK CFI f1854 .cfa: $rsp -128 + +STACK CFI INIT f1859 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f1867 .cfa: $rsp 0 + +STACK CFI f186b .cfa: $rsp 128 + +STACK CFI f1873 .cfa: $rsp -128 + +STACK CFI INIT f1670 1ca .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f1672 .cfa: $rsp 16 + +STACK CFI f1677 $r13: .cfa -16 + ^ +STACK CFI f1679 .cfa: $rsp 24 + +STACK CFI f167c $r12: .cfa -24 + ^ +STACK CFI f1682 .cfa: $rsp 32 + +STACK CFI f1683 .cfa: $rsp 40 + +STACK CFI f1687 .cfa: $rsp 96 + +STACK CFI f16c3 $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT f1880 363 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f1882 .cfa: $rsp 16 + +STACK CFI f1884 .cfa: $rsp 24 + +STACK CFI f1887 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI f1889 .cfa: $rsp 32 + +STACK CFI f188c $r13: .cfa -32 + ^ +STACK CFI f188e .cfa: $rsp 40 + +STACK CFI f1891 $r12: .cfa -40 + ^ +STACK CFI f1892 .cfa: $rsp 48 + +STACK CFI f1895 $rbp: .cfa -48 + ^ +STACK CFI f1896 .cfa: $rsp 56 + +STACK CFI f189a .cfa: $rsp 176 + +STACK CFI f18a2 $rbx: .cfa -56 + ^ +STACK CFI INIT f1bf0 353 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f1bf2 .cfa: $rsp 16 + +STACK CFI f1bf4 .cfa: $rsp 24 + +STACK CFI f1bf6 .cfa: $rsp 32 + +STACK CFI f1bf9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI f1bfb .cfa: $rsp 40 + +STACK CFI f1bfe $r12: .cfa -40 + ^ +STACK CFI f1bff .cfa: $rsp 48 + +STACK CFI f1c02 $rbp: .cfa -48 + ^ +STACK CFI f1c03 .cfa: $rsp 56 + +STACK CFI f1c06 $rbx: .cfa -56 + ^ +STACK CFI f1c0a .cfa: $rsp 176 + +STACK CFI INIT f1fe5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f1ff3 .cfa: $rsp 0 + +STACK CFI f1ff7 .cfa: $rsp 128 + +STACK CFI f1fff .cfa: $rsp -128 + +STACK CFI INIT f2004 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f2012 .cfa: $rsp 0 + +STACK CFI f2016 .cfa: $rsp 128 + +STACK CFI f201e .cfa: $rsp -128 + +STACK CFI INIT f1f50 95 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f1f54 .cfa: $rsp 16 + +STACK CFI INIT f2265 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f2273 .cfa: $rsp 0 + +STACK CFI f2277 .cfa: $rsp 128 + +STACK CFI f227f .cfa: $rsp -128 + +STACK CFI INIT f2284 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f2292 .cfa: $rsp 0 + +STACK CFI f2296 .cfa: $rsp 128 + +STACK CFI f229e .cfa: $rsp -128 + +STACK CFI INIT f22a3 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f22b1 .cfa: $rsp 0 + +STACK CFI f22b5 .cfa: $rsp 128 + +STACK CFI f22bd .cfa: $rsp -128 + +STACK CFI INIT f22c2 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f22d0 .cfa: $rsp 0 + +STACK CFI f22d4 .cfa: $rsp 128 + +STACK CFI f22dc .cfa: $rsp -128 + +STACK CFI INIT f22e1 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f22ef .cfa: $rsp 0 + +STACK CFI f22f3 .cfa: $rsp 128 + +STACK CFI f22fb .cfa: $rsp -128 + +STACK CFI INIT f2300 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f230e .cfa: $rsp 0 + +STACK CFI f2312 .cfa: $rsp 128 + +STACK CFI f231a .cfa: $rsp -128 + +STACK CFI INIT f2020 e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f2024 .cfa: $rsp 80 + +STACK CFI INIT f2110 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f2114 .cfa: $rsp 16 + +STACK CFI INIT f21c0 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f21c4 .cfa: $rsp 32 + +STACK CFI INIT f24ad 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f24bb .cfa: $rsp 0 + +STACK CFI f24bf .cfa: $rsp 128 + +STACK CFI f24c7 .cfa: $rsp -128 + +STACK CFI INIT f24cc 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f24da .cfa: $rsp 0 + +STACK CFI f24de .cfa: $rsp 128 + +STACK CFI f24e6 .cfa: $rsp -128 + +STACK CFI INIT f2320 18d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f2322 .cfa: $rsp 16 + +STACK CFI f2327 $r13: .cfa -16 + ^ +STACK CFI f2329 .cfa: $rsp 24 + +STACK CFI f232c $r12: .cfa -24 + ^ +STACK CFI f2332 .cfa: $rsp 32 + +STACK CFI f2333 .cfa: $rsp 40 + +STACK CFI f2337 .cfa: $rsp 80 + +STACK CFI f2375 $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT f24f0 266 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f24f2 .cfa: $rsp 16 + +STACK CFI f24f5 $r15: .cfa -16 + ^ +STACK CFI f24f7 .cfa: $rsp 24 + +STACK CFI f24fa $r14: .cfa -24 + ^ +STACK CFI f24fc .cfa: $rsp 32 + +STACK CFI f24ff $r13: .cfa -32 + ^ +STACK CFI f2501 .cfa: $rsp 40 + +STACK CFI f2502 .cfa: $rsp 48 + +STACK CFI f2503 .cfa: $rsp 56 + +STACK CFI f2507 .cfa: $rsp 144 + +STACK CFI f2523 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f28cd 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f28db .cfa: $rsp 0 + +STACK CFI f28df .cfa: $rsp 128 + +STACK CFI f28e7 .cfa: $rsp -128 + +STACK CFI INIT f28ec 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f28fa .cfa: $rsp 0 + +STACK CFI f28fe .cfa: $rsp 128 + +STACK CFI f2906 .cfa: $rsp -128 + +STACK CFI INIT f2760 16d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f2762 .cfa: $rsp 16 + +STACK CFI f276a $r12: .cfa -16 + ^ +STACK CFI f276d .cfa: $rsp 24 + +STACK CFI f276e .cfa: $rsp 32 + +STACK CFI f2772 .cfa: $rsp 48 + +STACK CFI f27b0 $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT f29a5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f29b3 .cfa: $rsp 0 + +STACK CFI f29b7 .cfa: $rsp 128 + +STACK CFI f29bf .cfa: $rsp -128 + +STACK CFI INIT f29c4 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f29d2 .cfa: $rsp 0 + +STACK CFI f29d6 .cfa: $rsp 128 + +STACK CFI f29de .cfa: $rsp -128 + +STACK CFI INIT f2910 95 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f2914 .cfa: $rsp 16 + +STACK CFI INIT f2c25 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f2c33 .cfa: $rsp 0 + +STACK CFI f2c37 .cfa: $rsp 128 + +STACK CFI f2c3f .cfa: $rsp -128 + +STACK CFI INIT f2c44 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f2c52 .cfa: $rsp 0 + +STACK CFI f2c56 .cfa: $rsp 128 + +STACK CFI f2c5e .cfa: $rsp -128 + +STACK CFI INIT f2c63 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f2c71 .cfa: $rsp 0 + +STACK CFI f2c75 .cfa: $rsp 128 + +STACK CFI f2c7d .cfa: $rsp -128 + +STACK CFI INIT f2c82 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f2c90 .cfa: $rsp 0 + +STACK CFI f2c94 .cfa: $rsp 128 + +STACK CFI f2c9c .cfa: $rsp -128 + +STACK CFI INIT f2ca1 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f2caf .cfa: $rsp 0 + +STACK CFI f2cb3 .cfa: $rsp 128 + +STACK CFI f2cbb .cfa: $rsp -128 + +STACK CFI INIT f2cc0 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f2cce .cfa: $rsp 0 + +STACK CFI f2cd2 .cfa: $rsp 128 + +STACK CFI f2cda .cfa: $rsp -128 + +STACK CFI INIT f29e0 e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f29e4 .cfa: $rsp 80 + +STACK CFI INIT f2ad0 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f2ad4 .cfa: $rsp 16 + +STACK CFI INIT f2b80 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f2b84 .cfa: $rsp 32 + +STACK CFI INIT f2ce0 256 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f2ce2 .cfa: $rsp 16 + +STACK CFI f2ce5 $r15: .cfa -16 + ^ +STACK CFI f2ce7 .cfa: $rsp 24 + +STACK CFI f2cea $r14: .cfa -24 + ^ +STACK CFI f2cec .cfa: $rsp 32 + +STACK CFI f2cef $r13: .cfa -32 + ^ +STACK CFI f2cf1 .cfa: $rsp 40 + +STACK CFI f2cf2 .cfa: $rsp 48 + +STACK CFI f2cf5 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI f2cf6 .cfa: $rsp 56 + +STACK CFI f2cfa .cfa: $rsp 128 + +STACK CFI f2d11 $rbx: .cfa -56 + ^ +STACK CFI INIT f3065 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f3073 .cfa: $rsp 0 + +STACK CFI f3077 .cfa: $rsp 128 + +STACK CFI f307f .cfa: $rsp -128 + +STACK CFI INIT f3084 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f3092 .cfa: $rsp 0 + +STACK CFI f3096 .cfa: $rsp 128 + +STACK CFI f309e .cfa: $rsp -128 + +STACK CFI INIT f2f40 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f2f41 .cfa: $rsp 16 + +STACK CFI f2f49 .cfa: $rsp 24 + +STACK CFI f2f4b $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI f2f4f .cfa: $rsp 48 + +STACK CFI INIT f30a0 1ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f30a2 .cfa: $rsp 16 + +STACK CFI f30a5 $r15: .cfa -16 + ^ +STACK CFI f30a7 .cfa: $rsp 24 + +STACK CFI f30aa $r14: .cfa -24 + ^ +STACK CFI f30ac .cfa: $rsp 32 + +STACK CFI f30af $r13: .cfa -32 + ^ +STACK CFI f30b1 .cfa: $rsp 40 + +STACK CFI f30b4 $r12: .cfa -40 + ^ +STACK CFI f30b5 .cfa: $rsp 48 + +STACK CFI f30b6 .cfa: $rsp 56 + +STACK CFI f30ba .cfa: $rsp 112 + +STACK CFI f30cc $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f3318 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f3326 .cfa: $rsp 0 + +STACK CFI f332a .cfa: $rsp 128 + +STACK CFI f3332 .cfa: $rsp -128 + +STACK CFI INIT f3334 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f3342 .cfa: $rsp 0 + +STACK CFI f3346 .cfa: $rsp 128 + +STACK CFI f334e .cfa: $rsp -128 + +STACK CFI INIT f3290 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3294 .cfa: $rsp 16 + +STACK CFI INIT f3575 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f3583 .cfa: $rsp 0 + +STACK CFI f3587 .cfa: $rsp 128 + +STACK CFI f358f .cfa: $rsp -128 + +STACK CFI INIT f3594 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f35a2 .cfa: $rsp 0 + +STACK CFI f35a6 .cfa: $rsp 128 + +STACK CFI f35ae .cfa: $rsp -128 + +STACK CFI INIT f35b3 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f35c1 .cfa: $rsp 0 + +STACK CFI f35c5 .cfa: $rsp 128 + +STACK CFI f35cd .cfa: $rsp -128 + +STACK CFI INIT f35d2 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f35e0 .cfa: $rsp 0 + +STACK CFI f35e4 .cfa: $rsp 128 + +STACK CFI f35ec .cfa: $rsp -128 + +STACK CFI INIT f35f1 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f35ff .cfa: $rsp 0 + +STACK CFI f3603 .cfa: $rsp 128 + +STACK CFI f360b .cfa: $rsp -128 + +STACK CFI INIT f3610 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f361e .cfa: $rsp 0 + +STACK CFI f3622 .cfa: $rsp 128 + +STACK CFI f362a .cfa: $rsp -128 + +STACK CFI INIT f3350 d5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3354 .cfa: $rsp 80 + +STACK CFI INIT f3430 a0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3434 .cfa: $rsp 16 + +STACK CFI INIT f34d0 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f34d4 .cfa: $rsp 32 + +STACK CFI INIT f3755 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f3763 .cfa: $rsp 0 + +STACK CFI f3767 .cfa: $rsp 128 + +STACK CFI f376f .cfa: $rsp -128 + +STACK CFI INIT f3774 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f3782 .cfa: $rsp 0 + +STACK CFI f3786 .cfa: $rsp 128 + +STACK CFI f378e .cfa: $rsp -128 + +STACK CFI INIT f3630 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3631 .cfa: $rsp 16 + +STACK CFI f3639 .cfa: $rsp 24 + +STACK CFI f363c $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI f3640 .cfa: $rsp 48 + +STACK CFI INIT f3790 1ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3792 .cfa: $rsp 16 + +STACK CFI f3795 $r15: .cfa -16 + ^ +STACK CFI f3797 .cfa: $rsp 24 + +STACK CFI f379a $r14: .cfa -24 + ^ +STACK CFI f379c .cfa: $rsp 32 + +STACK CFI f379f $r13: .cfa -32 + ^ +STACK CFI f37a1 .cfa: $rsp 40 + +STACK CFI f37a4 $r12: .cfa -40 + ^ +STACK CFI f37a5 .cfa: $rsp 48 + +STACK CFI f37a6 .cfa: $rsp 56 + +STACK CFI f37aa .cfa: $rsp 112 + +STACK CFI f37bc $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f3abd 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f3acb .cfa: $rsp 0 + +STACK CFI f3acf .cfa: $rsp 128 + +STACK CFI f3ad7 .cfa: $rsp -128 + +STACK CFI INIT f3adc 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f3aea .cfa: $rsp 0 + +STACK CFI f3aee .cfa: $rsp 128 + +STACK CFI f3af6 .cfa: $rsp -128 + +STACK CFI INIT f3980 13d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3982 .cfa: $rsp 16 + +STACK CFI f3987 $r12: .cfa -16 + ^ +STACK CFI f3988 .cfa: $rsp 24 + +STACK CFI f398b $rbp: .cfa -24 + ^ +STACK CFI f3991 .cfa: $rsp 32 + +STACK CFI f3995 .cfa: $rsp 48 + +STACK CFI f39c7 $rbx: .cfa -32 + ^ +STACK CFI INIT f3b00 26d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3b02 .cfa: $rsp 16 + +STACK CFI f3b05 $r15: .cfa -16 + ^ +STACK CFI f3b07 .cfa: $rsp 24 + +STACK CFI f3b0a $r14: .cfa -24 + ^ +STACK CFI f3b0c .cfa: $rsp 32 + +STACK CFI f3b0f $r13: .cfa -32 + ^ +STACK CFI f3b11 .cfa: $rsp 40 + +STACK CFI f3b12 .cfa: $rsp 48 + +STACK CFI f3b15 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI f3b16 .cfa: $rsp 56 + +STACK CFI f3b1a .cfa: $rsp 128 + +STACK CFI f3b33 $rbx: .cfa -56 + ^ +STACK CFI INIT f3ead 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f3ebb .cfa: $rsp 0 + +STACK CFI f3ebf .cfa: $rsp 128 + +STACK CFI f3ec7 .cfa: $rsp -128 + +STACK CFI INIT f3ecc 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f3eda .cfa: $rsp 0 + +STACK CFI f3ede .cfa: $rsp 128 + +STACK CFI f3ee6 .cfa: $rsp -128 + +STACK CFI INIT f3d70 13d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3d72 .cfa: $rsp 16 + +STACK CFI f3d77 $r12: .cfa -16 + ^ +STACK CFI f3d78 .cfa: $rsp 24 + +STACK CFI f3d7b $rbp: .cfa -24 + ^ +STACK CFI f3d81 .cfa: $rsp 32 + +STACK CFI f3d85 .cfa: $rsp 48 + +STACK CFI f3db7 $rbx: .cfa -32 + ^ +STACK CFI INIT f3ef0 26d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3ef2 .cfa: $rsp 16 + +STACK CFI f3ef5 $r15: .cfa -16 + ^ +STACK CFI f3ef7 .cfa: $rsp 24 + +STACK CFI f3efa $r14: .cfa -24 + ^ +STACK CFI f3efc .cfa: $rsp 32 + +STACK CFI f3eff $r13: .cfa -32 + ^ +STACK CFI f3f01 .cfa: $rsp 40 + +STACK CFI f3f02 .cfa: $rsp 48 + +STACK CFI f3f05 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI f3f06 .cfa: $rsp 56 + +STACK CFI f3f0a .cfa: $rsp 128 + +STACK CFI f3f22 $rbx: .cfa -56 + ^ +STACK CFI INIT f41e8 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f41f6 .cfa: $rsp 0 + +STACK CFI f41fa .cfa: $rsp 128 + +STACK CFI f4202 .cfa: $rsp -128 + +STACK CFI INIT f4204 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f4212 .cfa: $rsp 0 + +STACK CFI f4216 .cfa: $rsp 128 + +STACK CFI f421e .cfa: $rsp -128 + +STACK CFI INIT f4160 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4164 .cfa: $rsp 16 + +STACK CFI INIT f4445 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f4453 .cfa: $rsp 0 + +STACK CFI f4457 .cfa: $rsp 128 + +STACK CFI f445f .cfa: $rsp -128 + +STACK CFI INIT f4464 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f4472 .cfa: $rsp 0 + +STACK CFI f4476 .cfa: $rsp 128 + +STACK CFI f447e .cfa: $rsp -128 + +STACK CFI INIT f4483 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f4491 .cfa: $rsp 0 + +STACK CFI f4495 .cfa: $rsp 128 + +STACK CFI f449d .cfa: $rsp -128 + +STACK CFI INIT f44a2 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f44b0 .cfa: $rsp 0 + +STACK CFI f44b4 .cfa: $rsp 128 + +STACK CFI f44bc .cfa: $rsp -128 + +STACK CFI INIT f44c1 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f44cf .cfa: $rsp 0 + +STACK CFI f44d3 .cfa: $rsp 128 + +STACK CFI f44db .cfa: $rsp -128 + +STACK CFI INIT f44e0 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f44ee .cfa: $rsp 0 + +STACK CFI f44f2 .cfa: $rsp 128 + +STACK CFI f44fa .cfa: $rsp -128 + +STACK CFI INIT f4220 d5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4224 .cfa: $rsp 80 + +STACK CFI INIT f4300 a0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4304 .cfa: $rsp 16 + +STACK CFI INIT f43a0 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f43a4 .cfa: $rsp 32 + +STACK CFI INIT f4588 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f4596 .cfa: $rsp 0 + +STACK CFI f459a .cfa: $rsp 128 + +STACK CFI f45a2 .cfa: $rsp -128 + +STACK CFI INIT f45a4 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f45b2 .cfa: $rsp 0 + +STACK CFI f45b6 .cfa: $rsp 128 + +STACK CFI f45be .cfa: $rsp -128 + +STACK CFI INIT f4500 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4504 .cfa: $rsp 16 + +STACK CFI INIT f46e5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f46f3 .cfa: $rsp 0 + +STACK CFI f46f7 .cfa: $rsp 128 + +STACK CFI f46ff .cfa: $rsp -128 + +STACK CFI INIT f4704 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f4712 .cfa: $rsp 0 + +STACK CFI f4716 .cfa: $rsp 128 + +STACK CFI f471e .cfa: $rsp -128 + +STACK CFI INIT f45c0 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f45c1 .cfa: $rsp 16 + +STACK CFI f45c9 .cfa: $rsp 24 + +STACK CFI f45cc $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI f45d0 .cfa: $rsp 48 + +STACK CFI INIT f4845 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f4853 .cfa: $rsp 0 + +STACK CFI f4857 .cfa: $rsp 128 + +STACK CFI f485f .cfa: $rsp -128 + +STACK CFI INIT f4864 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI f4872 .cfa: $rsp 0 + +STACK CFI f4876 .cfa: $rsp 128 + +STACK CFI f487e .cfa: $rsp -128 + +STACK CFI INIT f4720 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4721 .cfa: $rsp 16 + +STACK CFI f4729 .cfa: $rsp 24 + +STACK CFI f472b $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI f472f .cfa: $rsp 48 + +STACK CFI INIT f4aa5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f4ab3 .cfa: $rsp 0 + +STACK CFI f4ab7 .cfa: $rsp 128 + +STACK CFI f4abf .cfa: $rsp -128 + +STACK CFI INIT f4ac4 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f4ad2 .cfa: $rsp 0 + +STACK CFI f4ad6 .cfa: $rsp 128 + +STACK CFI f4ade .cfa: $rsp -128 + +STACK CFI INIT f4ae3 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f4af1 .cfa: $rsp 0 + +STACK CFI f4af5 .cfa: $rsp 128 + +STACK CFI f4afd .cfa: $rsp -128 + +STACK CFI INIT f4b02 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f4b10 .cfa: $rsp 0 + +STACK CFI f4b14 .cfa: $rsp 128 + +STACK CFI f4b1c .cfa: $rsp -128 + +STACK CFI INIT f4b21 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f4b2f .cfa: $rsp 0 + +STACK CFI f4b33 .cfa: $rsp 128 + +STACK CFI f4b3b .cfa: $rsp -128 + +STACK CFI INIT f4b40 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f4b4e .cfa: $rsp 0 + +STACK CFI f4b52 .cfa: $rsp 128 + +STACK CFI f4b5a .cfa: $rsp -128 + +STACK CFI INIT f4880 d5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4884 .cfa: $rsp 80 + +STACK CFI INIT f4960 a0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4964 .cfa: $rsp 16 + +STACK CFI INIT f4a00 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4a04 .cfa: $rsp 32 + +STACK CFI INIT f4b60 1ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4b62 .cfa: $rsp 16 + +STACK CFI f4b65 $r15: .cfa -16 + ^ +STACK CFI f4b67 .cfa: $rsp 24 + +STACK CFI f4b6a $r14: .cfa -24 + ^ +STACK CFI f4b6c .cfa: $rsp 32 + +STACK CFI f4b6f $r13: .cfa -32 + ^ +STACK CFI f4b71 .cfa: $rsp 40 + +STACK CFI f4b74 $r12: .cfa -40 + ^ +STACK CFI f4b75 .cfa: $rsp 48 + +STACK CFI f4b76 .cfa: $rsp 56 + +STACK CFI f4b7a .cfa: $rsp 112 + +STACK CFI f4b8c $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f4d50 1ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4d52 .cfa: $rsp 16 + +STACK CFI f4d55 $r15: .cfa -16 + ^ +STACK CFI f4d57 .cfa: $rsp 24 + +STACK CFI f4d5a $r14: .cfa -24 + ^ +STACK CFI f4d5c .cfa: $rsp 32 + +STACK CFI f4d5f $r13: .cfa -32 + ^ +STACK CFI f4d61 .cfa: $rsp 40 + +STACK CFI f4d64 $r12: .cfa -40 + ^ +STACK CFI f4d65 .cfa: $rsp 48 + +STACK CFI f4d66 .cfa: $rsp 56 + +STACK CFI f4d6a .cfa: $rsp 112 + +STACK CFI f4d7c $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f4f40 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f4f50 16e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4f62 .cfa: $rsp 16 + +STACK CFI f4f63 .cfa: $rsp 24 + +STACK CFI f4f6f $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT f50c0 176 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f50c2 .cfa: $rsp 16 + +STACK CFI f50c4 .cfa: $rsp 24 + +STACK CFI f50c6 .cfa: $rsp 32 + +STACK CFI f50c8 .cfa: $rsp 40 + +STACK CFI f50c9 .cfa: $rsp 48 + +STACK CFI f50cc $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI f50cd .cfa: $rsp 56 + +STACK CFI f50d4 .cfa: $rsp 1136 + +STACK CFI f50e9 $rbx: .cfa -56 + ^ +STACK CFI INIT f5240 270 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5242 .cfa: $rsp 16 + +STACK CFI f524d .cfa: $rsp 24 + +STACK CFI f524e .cfa: $rsp 32 + +STACK CFI f524f .cfa: $rsp 40 + +STACK CFI f5256 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT f54b0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f54c0 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f54c1 .cfa: $rsp 16 + +STACK CFI f54c4 $rbx: .cfa -16 + ^ +STACK CFI f54cf .cfa: $rsp 32 + +STACK CFI INIT f5510 16e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5512 .cfa: $rsp 16 + +STACK CFI f5514 .cfa: $rsp 24 + +STACK CFI f5516 .cfa: $rsp 32 + +STACK CFI f5518 .cfa: $rsp 40 + +STACK CFI f5519 .cfa: $rsp 48 + +STACK CFI f551c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI f551d .cfa: $rsp 56 + +STACK CFI f5524 .cfa: $rsp 1136 + +STACK CFI f5539 $rbx: .cfa -56 + ^ +STACK CFI INIT f6050 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f605e .cfa: $rsp 0 + +STACK CFI f6062 .cfa: $rsp 128 + +STACK CFI f606a .cfa: $rsp -128 + +STACK CFI INIT f606f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f607d .cfa: $rsp 0 + +STACK CFI f6081 .cfa: $rsp 128 + +STACK CFI f6089 .cfa: $rsp -128 + +STACK CFI INIT f608e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f609c .cfa: $rsp 0 + +STACK CFI f60a0 .cfa: $rsp 128 + +STACK CFI f60a8 .cfa: $rsp -128 + +STACK CFI INIT f60ad 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f60bb .cfa: $rsp 0 + +STACK CFI f60bf .cfa: $rsp 128 + +STACK CFI f60c7 .cfa: $rsp -128 + +STACK CFI INIT f60cc 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f60da .cfa: $rsp 0 + +STACK CFI f60de .cfa: $rsp 128 + +STACK CFI f60e6 .cfa: $rsp -128 + +STACK CFI INIT f60eb 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f60f9 .cfa: $rsp 0 + +STACK CFI f60fd .cfa: $rsp 128 + +STACK CFI f6105 .cfa: $rsp -128 + +STACK CFI INIT f5680 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5681 .cfa: $rsp 16 + +STACK CFI f5684 $rbx: .cfa -16 + ^ +STACK CFI INIT f56c0 85 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f56c8 .cfa: $rsp 16 + +STACK CFI f56cb $rbx: .cfa -16 + ^ +STACK CFI INIT f5750 141 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5752 .cfa: $rsp 16 + +STACK CFI f5754 .cfa: $rsp 24 + +STACK CFI f5756 .cfa: $rsp 32 + +STACK CFI f5759 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI f575e .cfa: $rsp 40 + +STACK CFI f575f .cfa: $rsp 48 + +STACK CFI f5764 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI f5765 .cfa: $rsp 56 + +STACK CFI f5768 $rbx: .cfa -56 + ^ +STACK CFI f5770 .cfa: $rsp 96 + +STACK CFI INIT f58a0 1e9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f58a2 .cfa: $rsp 16 + +STACK CFI f58a5 $r15: .cfa -16 + ^ +STACK CFI f58a7 .cfa: $rsp 24 + +STACK CFI f58aa $r14: .cfa -24 + ^ +STACK CFI f58ac .cfa: $rsp 32 + +STACK CFI f58ae .cfa: $rsp 40 + +STACK CFI f58af .cfa: $rsp 48 + +STACK CFI f58b0 .cfa: $rsp 56 + +STACK CFI f58b3 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI f58b7 .cfa: $rsp 112 + +STACK CFI INIT f5a90 97 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5a91 .cfa: $rsp 16 + +STACK CFI f5a97 $rbp: .cfa -16 + ^ +STACK CFI f5a9f .cfa: $rsp 24 + +STACK CFI f5aa2 $rbx: .cfa -24 + ^ +STACK CFI f5aa6 .cfa: $rsp 48 + +STACK CFI INIT f5b30 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5b31 .cfa: $rsp 16 + +STACK CFI f5b34 $rbx: .cfa -16 + ^ +STACK CFI INIT f5b80 374 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5b82 .cfa: $rsp 16 + +STACK CFI f5b87 $r15: .cfa -16 + ^ +STACK CFI f5b89 .cfa: $rsp 24 + +STACK CFI f5b8b .cfa: $rsp 32 + +STACK CFI f5b8d .cfa: $rsp 40 + +STACK CFI f5b8e .cfa: $rsp 48 + +STACK CFI f5b91 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI f5b92 .cfa: $rsp 56 + +STACK CFI f5b99 .cfa: $rsp 1280 + +STACK CFI f5ba1 $rbx: .cfa -56 + ^ +STACK CFI INIT f5f00 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5f01 .cfa: $rsp 16 + +STACK CFI f5f04 $rbx: .cfa -16 + ^ +STACK CFI INIT f5f20 66 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5f24 .cfa: $rsp 16 + +STACK CFI INIT f5f90 45 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5f9d $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI f5fa1 .cfa: $rsp 32 + +STACK CFI INIT f5fe0 70 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f5fe4 .cfa: $rsp 16 + +STACK CFI INIT f6110 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f6114 .cfa: $rsp 16 + +STACK CFI INIT f6130 d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f613e .cfa: $rsp 48 + +STACK CFI f6147 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT f6f63 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f6f71 .cfa: $rsp 0 + +STACK CFI f6f75 .cfa: $rsp 128 + +STACK CFI f6f7d .cfa: $rsp -128 + +STACK CFI INIT f6f82 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI f6f90 .cfa: $rsp 0 + +STACK CFI f6f94 .cfa: $rsp 128 + +STACK CFI f6f9c .cfa: $rsp -128 + +STACK CFI INIT f6210 2fd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f6211 .cfa: $rsp 16 + +STACK CFI f6214 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f6239 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f6510 a53 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f6511 .cfa: $rsp 16 + +STACK CFI f6519 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f6524 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI f652f $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI f654c $r15: .cfa -24 + ^ +STACK CFI INIT f6fb0 8f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f6fbc $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI f6fc5 .cfa: $rsp 80 + +STACK CFI f6fc8 $r12: .cfa -16 + ^ +STACK CFI INIT f7040 9b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f704d $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI f7056 $rbp: .cfa -24 + ^ .cfa: $rsp 80 + +STACK CFI INIT f70e0 36 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f70e1 .cfa: $rsp 16 + +STACK CFI f70e4 $rbp: .cfa -16 + ^ +STACK CFI f70e5 .cfa: $rsp 24 + +STACK CFI f70e8 $rbx: .cfa -24 + ^ +STACK CFI f70ec .cfa: $rsp 32 + +STACK CFI INIT f7120 303 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f7122 .cfa: $rsp 16 + +STACK CFI f7124 .cfa: $rsp 24 + +STACK CFI f7126 .cfa: $rsp 32 + +STACK CFI f7128 .cfa: $rsp 40 + +STACK CFI f7129 .cfa: $rsp 48 + +STACK CFI f712a .cfa: $rsp 56 + +STACK CFI f712e .cfa: $rsp 112 + +STACK CFI f7165 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f7430 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f7440 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f7450 3a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f7452 .cfa: $rsp 16 + +STACK CFI f7453 .cfa: $rsp 24 + +STACK CFI f745a $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI f745b .cfa: $rsp 32 + +STACK CFI f7469 $rbx: .cfa -32 + ^ +STACK CFI INIT f7490 8f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f7491 .cfa: $rsp 16 + +STACK CFI f7499 .cfa: $rsp 24 + +STACK CFI f749c $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI f74a5 .cfa: $rsp 48 + +STACK CFI INIT f7520 377 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f7521 .cfa: $rsp 16 + +STACK CFI f7524 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f752d $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI f7533 $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f78a0 e23 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f78a1 .cfa: $rsp 16 + +STACK CFI f78a4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f78b6 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f86d0 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f86d1 .cfa: $rsp 16 + +STACK CFI f86d4 $rbx: .cfa -16 + ^ +STACK CFI INIT f86f0 15b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f86f1 .cfa: $rsp 16 + +STACK CFI f86f4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f86ff $r13: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI f8715 $r12: .cfa -48 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI INIT f8850 159 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f8851 .cfa: $rsp 16 + +STACK CFI f8854 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f885b $r14: .cfa -24 + ^ +STACK CFI f8867 $r13: .cfa -32 + ^ +STACK CFI f8875 $r12: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT f89b0 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f89c2 .cfa: $rsp 16 + +STACK CFI INIT f8a30 188 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f8a31 .cfa: $rsp 16 + +STACK CFI f8a34 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f8a3f $r12: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI f8a4a $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI f8a7a $r15: .cfa -24 + ^ +STACK CFI INIT f8bc0 168 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f8bc1 .cfa: $rsp 16 + +STACK CFI f8bc4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f8bcb $r13: .cfa -40 + ^ +STACK CFI f8be2 $r12: .cfa -48 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI f8c00 $rbx: .cfa -56 + ^ +STACK CFI INIT f8d30 523 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f8d32 .cfa: $rsp 16 + +STACK CFI f8d34 .cfa: $rsp 24 + +STACK CFI f8d37 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI f8d39 .cfa: $rsp 32 + +STACK CFI f8d3f $r13: .cfa -32 + ^ +STACK CFI f8d41 .cfa: $rsp 40 + +STACK CFI f8d42 .cfa: $rsp 48 + +STACK CFI f8d43 .cfa: $rsp 56 + +STACK CFI f8d4a .cfa: $rsp 288 + +STACK CFI f8dc3 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT f9260 40 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f9264 .cfa: $rsp 32 + +STACK CFI INIT f92a0 1cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f92ad $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI f92b9 .cfa: $rsp 176 + +STACK CFI f92c7 $rbp: .cfa -24 + ^ +STACK CFI INIT f9470 1a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f9471 .cfa: $rsp 16 + +STACK CFI f9474 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI f947f $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI f948a $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI f94a4 $r12: .cfa -48 + ^ +STACK CFI INIT f9620 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f9627 .cfa: $rsp 144 + +STACK CFI INIT f96b0 1d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f96b4 .cfa: $rsp 32 + +STACK CFI INIT f96d0 ba .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f96d2 .cfa: $rsp 16 + +STACK CFI f96de $r15: .cfa -16 + ^ +STACK CFI f96e0 .cfa: $rsp 24 + +STACK CFI f96e3 $r14: .cfa -24 + ^ +STACK CFI f96e7 .cfa: $rsp 32 + +STACK CFI f96ea $r13: .cfa -32 + ^ +STACK CFI f96ec .cfa: $rsp 40 + +STACK CFI f96ef $r12: .cfa -40 + ^ +STACK CFI f96f5 .cfa: $rsp 48 + +STACK CFI f96f8 $rbp: .cfa -48 + ^ +STACK CFI f96f9 .cfa: $rsp 56 + +STACK CFI f96fd .cfa: $rsp 128 + +STACK CFI f9713 $rbx: .cfa -56 + ^ +STACK CFI INIT f9790 b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f97a0 1b9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f97ad $r13: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI f97cb .cfa: $rsp 208 + +STACK CFI f97d1 $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI INIT f9960 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f9970 a47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f9972 .cfa: $rsp 16 + +STACK CFI f9974 .cfa: $rsp 24 + +STACK CFI f9976 .cfa: $rsp 32 + +STACK CFI f9978 .cfa: $rsp 40 + +STACK CFI f997b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI f997c .cfa: $rsp 48 + +STACK CFI f997d .cfa: $rsp 56 + +STACK CFI f9984 .cfa: $rsp 704 + +STACK CFI f998c $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT fa3c0 18 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fa3c4 .cfa: $rsp 32 + +STACK CFI INIT fa3e0 576 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fa3e2 .cfa: $rsp 16 + +STACK CFI fa3e8 $r15: .cfa -16 + ^ +STACK CFI fa3ee .cfa: $rsp 24 + +STACK CFI fa3f0 .cfa: $rsp 32 + +STACK CFI fa3f3 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI fa3f5 .cfa: $rsp 40 + +STACK CFI fa3f8 $r12: .cfa -40 + ^ +STACK CFI fa3f9 .cfa: $rsp 48 + +STACK CFI fa3fa .cfa: $rsp 56 + +STACK CFI fa401 .cfa: $rsp 592 + +STACK CFI fa409 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT fa960 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fa964 .cfa: $rsp 32 + +STACK CFI INIT fa980 215 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fa982 .cfa: $rsp 16 + +STACK CFI fa984 .cfa: $rsp 24 + +STACK CFI fa985 .cfa: $rsp 32 + +STACK CFI fa986 .cfa: $rsp 40 + +STACK CFI fa98a .cfa: $rsp 48 + +STACK CFI fa999 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT faba0 472 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI faba1 .cfa: $rsp 16 + +STACK CFI faba4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI fabab $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI fabb3 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT fb242 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI fb250 .cfa: $rsp 0 + +STACK CFI fb254 .cfa: $rsp 128 + +STACK CFI fb25c .cfa: $rsp -128 + +STACK CFI INIT fb261 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI fb26f .cfa: $rsp 0 + +STACK CFI fb273 .cfa: $rsp 128 + +STACK CFI fb27b .cfa: $rsp -128 + +STACK CFI INIT fb280 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI fb28e .cfa: $rsp 0 + +STACK CFI fb292 .cfa: $rsp 128 + +STACK CFI fb29a .cfa: $rsp -128 + +STACK CFI INIT fb29f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI fb2ad .cfa: $rsp 0 + +STACK CFI fb2b1 .cfa: $rsp 128 + +STACK CFI fb2b9 .cfa: $rsp -128 + +STACK CFI INIT fb2be 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI fb2cc .cfa: $rsp 0 + +STACK CFI fb2d0 .cfa: $rsp 128 + +STACK CFI fb2d8 .cfa: $rsp -128 + +STACK CFI INIT fb2dd 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI fb2eb .cfa: $rsp 0 + +STACK CFI fb2ef .cfa: $rsp 128 + +STACK CFI fb2f7 .cfa: $rsp -128 + +STACK CFI INIT fb020 d2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fb024 .cfa: $rsp 80 + +STACK CFI INIT fb100 a0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fb104 .cfa: $rsp 16 + +STACK CFI INIT fb1a0 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fb1a4 .cfa: $rsp 32 + +STACK CFI INIT fb388 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI fb396 .cfa: $rsp 0 + +STACK CFI fb39a .cfa: $rsp 128 + +STACK CFI fb3a2 .cfa: $rsp -128 + +STACK CFI INIT fb3a4 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI fb3b2 .cfa: $rsp 0 + +STACK CFI fb3b6 .cfa: $rsp 128 + +STACK CFI fb3be .cfa: $rsp -128 + +STACK CFI INIT fb300 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fb304 .cfa: $rsp 16 + +STACK CFI INIT fb4e5 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI fb4f3 .cfa: $rsp 0 + +STACK CFI fb4f7 .cfa: $rsp 128 + +STACK CFI fb4ff .cfa: $rsp -128 + +STACK CFI INIT fb504 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI fb512 .cfa: $rsp 0 + +STACK CFI fb516 .cfa: $rsp 128 + +STACK CFI fb51e .cfa: $rsp -128 + +STACK CFI INIT fb3c0 125 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fb3c1 .cfa: $rsp 16 + +STACK CFI fb3c9 .cfa: $rsp 24 + +STACK CFI fb3cc $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI fb3d0 .cfa: $rsp 48 + +STACK CFI INIT fb520 1ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fb522 .cfa: $rsp 16 + +STACK CFI fb525 $r15: .cfa -16 + ^ +STACK CFI fb527 .cfa: $rsp 24 + +STACK CFI fb52a $r14: .cfa -24 + ^ +STACK CFI fb52c .cfa: $rsp 32 + +STACK CFI fb52f $r13: .cfa -32 + ^ +STACK CFI fb531 .cfa: $rsp 40 + +STACK CFI fb534 $r12: .cfa -40 + ^ +STACK CFI fb535 .cfa: $rsp 48 + +STACK CFI fb536 .cfa: $rsp 56 + +STACK CFI fb53a .cfa: $rsp 112 + +STACK CFI fb54c $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT fb710 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fb720 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fb750 a6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fb800 bc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fb8c0 77 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fb8ce .cfa: $rsp 32 + +STACK CFI fb8d1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT fb940 cb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fb956 .cfa: $rsp 32 + +STACK CFI fb959 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT fba10 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fba20 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fba21 .cfa: $rsp 16 + +STACK CFI fba26 $rbp: .cfa -16 + ^ +STACK CFI fba27 .cfa: $rsp 24 + +STACK CFI fba2a $rbx: .cfa -24 + ^ +STACK CFI fba2e .cfa: $rsp 32 + +STACK CFI INIT fba70 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fbab0 85 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fbb40 8f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fbbd0 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fbbda $rbx: .cfa -24 + ^ +STACK CFI fbbed .cfa: $rsp 32 + +STACK CFI fbbef $rbp: .cfa -16 + ^ +STACK CFI INIT fbc10 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fbc17 $rbx: .cfa -24 + ^ +STACK CFI fbc23 .cfa: $rsp 32 + +STACK CFI fbc25 $rbp: .cfa -16 + ^ +STACK CFI INIT fbc50 71 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fbc54 .cfa: $rsp 16 + +STACK CFI fbc56 $rbx: .cfa -16 + ^ +STACK CFI INIT fbcd0 101 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fbcdc $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI fbce5 .cfa: $rsp 48 + +STACK CFI fbced $r12: .cfa -16 + ^ +STACK CFI INIT fbde0 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fbe00 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fbe20 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fbe50 d3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fbe51 .cfa: $rsp 16 + +STACK CFI fbe59 $rbp: .cfa -16 + ^ +STACK CFI fbe5a .cfa: $rsp 24 + +STACK CFI fbe5d $rbx: .cfa -24 + ^ +STACK CFI fbe61 .cfa: $rsp 48 + +STACK CFI INIT fbf30 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fbf80 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fbf8e .cfa: $rsp 32 + +STACK CFI fbf93 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT fbfe0 546 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fbfe1 .cfa: $rsp 16 + +STACK CFI fbfe4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI fbfee $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI fbff3 $r12: .cfa -48 + ^ +STACK CFI fbff6 $rbx: .cfa -56 + ^ +STACK CFI INIT fc530 f0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fc53d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI fc54a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI fc55b .cfa: $rsp 80 + +STACK CFI fc578 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT fc620 3d0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fc621 .cfa: $rsp 16 + +STACK CFI fc624 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI fc629 $r15: .cfa -24 + ^ +STACK CFI fc633 $r14: .cfa -32 + ^ +STACK CFI fc63d $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ +STACK CFI fc658 $rbx: .cfa -56 + ^ +STACK CFI INIT fc9f0 138 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fc9f2 .cfa: $rsp 16 + +STACK CFI fc9f5 $r14: .cfa -16 + ^ +STACK CFI fc9f7 .cfa: $rsp 24 + +STACK CFI fc9fa $r13: .cfa -24 + ^ +STACK CFI fc9fc .cfa: $rsp 32 + +STACK CFI fc9ff $r12: .cfa -32 + ^ +STACK CFI fca00 .cfa: $rsp 40 + +STACK CFI fca01 .cfa: $rsp 48 + +STACK CFI fca03 $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI fca07 .cfa: $rsp 64 + +STACK CFI INIT fcb30 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fcb60 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fcb70 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fcb80 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fcb90 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fcba0 b0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fcba1 .cfa: $rsp 16 + +STACK CFI fcbac .cfa: $rsp 64 + +STACK CFI fcc03 $rbx: .cfa -16 + ^ +STACK CFI INIT fcc50 66 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fcc54 .cfa: $rsp 16 + +STACK CFI INIT fccc0 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fccd0 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fccf0 13e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fccf1 .cfa: $rsp 16 + +STACK CFI fccf9 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI fcd04 $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI fcd13 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT fce30 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fce3e .cfa: $rsp 32 + +STACK CFI fce42 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT fce90 b5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fcea5 .cfa: $rsp 80 + +STACK CFI fcea9 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI INIT fcf50 225 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fcf5d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI fcf7d .cfa: $rsp 592 + +STACK CFI fcf82 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT fd180 136 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fd18d $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI fd1a6 .cfa: $rsp 160 + +STACK CFI fd1aa $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT fd2c0 db .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fd2cd $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI fd2db .cfa: $rsp 96 + +STACK CFI fd2e0 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT fd3a0 91 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fd3ae .cfa: $rsp 32 + +STACK CFI fd3b1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT fd440 400 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fd442 .cfa: $rsp 16 + +STACK CFI fd444 .cfa: $rsp 24 + +STACK CFI fd446 .cfa: $rsp 32 + +STACK CFI fd448 .cfa: $rsp 40 + +STACK CFI fd449 .cfa: $rsp 48 + +STACK CFI fd44c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI fd44d .cfa: $rsp 56 + +STACK CFI fd44f $rbx: .cfa -56 + ^ +STACK CFI fd453 .cfa: $rsp 144 + +STACK CFI INIT fd840 2b0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fd841 .cfa: $rsp 16 + +STACK CFI fd844 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI fd84f $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI fd887 $rbx: .cfa -56 + ^ +STACK CFI INIT 1366e0 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1366e4 .cfa: $rsp 16 + +STACK CFI INIT fdaf0 66 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fdb60 fa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fdb6d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI fdb7e $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ .cfa: $rsp 1088 + +STACK CFI INIT fdc60 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fdc64 .cfa: $rsp 16 + +STACK CFI INIT fdc80 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fdc84 .cfa: $rsp 16 + +STACK CFI INIT fdca0 29d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fdcad $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI fdcbe .cfa: $rsp 1104 + +STACK CFI fdcca $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT fdf40 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fdf44 .cfa: $rsp 16 + +STACK CFI INIT fdf60 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fdf70 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fdf80 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fdf90 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fdfa0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fdfae .cfa: $rsp 32 + +STACK CFI fdfb1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT fe010 14e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fe027 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI fe033 .cfa: $rsp 144 + +STACK CFI fe036 $r12: .cfa -32 + ^ +STACK CFI INIT fe160 22f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fe162 .cfa: $rsp 16 + +STACK CFI fe164 .cfa: $rsp 24 + +STACK CFI fe166 .cfa: $rsp 32 + +STACK CFI fe168 .cfa: $rsp 40 + +STACK CFI fe169 .cfa: $rsp 48 + +STACK CFI fe16c $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI fe16d .cfa: $rsp 56 + +STACK CFI fe170 $rbx: .cfa -56 + ^ +STACK CFI fe177 .cfa: $rsp 256 + +STACK CFI INIT fe390 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fe391 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI INIT fe3d0 313 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fe3d1 .cfa: $rsp 16 + +STACK CFI fe3d4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI fe3df $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI fe40a $rbx: .cfa -56 + ^ +STACK CFI INIT fe6f0 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fe710 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fe730 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fe740 131 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fe880 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fe88e .cfa: $rsp 32 + +STACK CFI fe892 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT fe8e0 2e0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fe8ed $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI fe90d .cfa: $rsp 176 + +STACK CFI fe910 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT febc0 2f2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI febc2 .cfa: $rsp 16 + +STACK CFI febc4 .cfa: $rsp 24 + +STACK CFI febc6 .cfa: $rsp 32 + +STACK CFI febc8 .cfa: $rsp 40 + +STACK CFI febc9 .cfa: $rsp 48 + +STACK CFI febca .cfa: $rsp 56 + +STACK CFI febcd $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI febd4 .cfa: $rsp 240 + +STACK CFI INIT feec0 69 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI feec2 .cfa: $rsp 16 + +STACK CFI feec5 $r13: .cfa -16 + ^ +STACK CFI feec7 .cfa: $rsp 24 + +STACK CFI feeca $r12: .cfa -24 + ^ +STACK CFI feecb .cfa: $rsp 32 + +STACK CFI feece $rbp: .cfa -32 + ^ +STACK CFI feecf .cfa: $rsp 40 + +STACK CFI feed3 .cfa: $rsp 48 + +STACK CFI feed7 $rbx: .cfa -40 + ^ +STACK CFI INIT fef30 11e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fef3c $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI fef59 .cfa: $rsp 64 + +STACK CFI fef67 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT ff050 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ff054 .cfa: $rsp 64 + +STACK CFI INIT ff080 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ff084 .cfa: $rsp 64 + +STACK CFI INIT ff0b0 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ff0d0 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ff0f0 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ff100 178 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ff280 3e9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ff28d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI ff2ad .cfa: $rsp 240 + +STACK CFI ff2b9 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT ff670 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ff67e .cfa: $rsp 32 + +STACK CFI ff682 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT ff6d0 702 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ff6d1 .cfa: $rsp 16 + +STACK CFI ff6d4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI ff6d9 $r15: .cfa -24 + ^ +STACK CFI ff6eb $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT ffde0 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ffde4 .cfa: $rsp 16 + +STACK CFI INIT ffe00 9f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ffe01 .cfa: $rsp 16 + +STACK CFI ffe04 $rbx: .cfa -16 + ^ +STACK CFI ffe08 .cfa: $rsp 32 + +STACK CFI INIT ffea0 f4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ffea1 .cfa: $rsp 16 + +STACK CFI ffea4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI ffeaa $r15: .cfa -24 + ^ +STACK CFI ffeb0 $r14: .cfa -32 + ^ +STACK CFI ffeb6 $r13: .cfa -40 + ^ +STACK CFI ffebb $r12: .cfa -48 + ^ +STACK CFI ffec1 $rbx: .cfa -56 + ^ +STACK CFI INIT fffa0 a7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fffa1 .cfa: $rsp 16 + +STACK CFI fffa2 .cfa: $rsp 24 + +STACK CFI fffa5 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI fffa9 .cfa: $rsp 48 + +STACK CFI INIT 100050 f8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10005d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 100066 .cfa: $rsp 112 + +STACK CFI 100069 $r12: .cfa -16 + ^ +STACK CFI INIT 100150 145 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10015d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 10016a $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI 100173 .cfa: $rsp 128 + +STACK CFI 10017e $r14: .cfa -16 + ^ +STACK CFI INIT 1002a0 10d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1002ad $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 1002b6 .cfa: $rsp 80 + +STACK CFI 1002c5 $r12: .cfa -16 + ^ +STACK CFI INIT 1003b0 7e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1003b1 .cfa: $rsp 16 + +STACK CFI 1003b9 $rbp: .cfa -16 + ^ +STACK CFI 1003c4 .cfa: $rsp 24 + +STACK CFI 1003c8 $rbx: .cfa -24 + ^ .cfa: $rsp 48 + +STACK CFI INIT 100430 1e3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10043d $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 10044a $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ +STACK CFI 10045b .cfa: $rsp 176 + +STACK CFI 100484 $r14: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 100620 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 100640 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10064e .cfa: $rsp 32 + +STACK CFI 100651 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1006b0 c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1006b2 .cfa: $rsp 16 + +STACK CFI 1006b4 .cfa: $rsp 24 + +STACK CFI 1006b6 .cfa: $rsp 32 + +STACK CFI 1006b9 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 1006ba .cfa: $rsp 40 + +STACK CFI 1006bd $rbp: .cfa -40 + ^ +STACK CFI 1006be .cfa: $rsp 48 + +STACK CFI 1006c1 $rbx: .cfa -48 + ^ +STACK CFI 1006c5 .cfa: $rsp 64 + +STACK CFI INIT 100780 654 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 100782 .cfa: $rsp 16 + +STACK CFI 100785 $r15: .cfa -16 + ^ +STACK CFI 100787 .cfa: $rsp 24 + +STACK CFI 10078a $r14: .cfa -24 + ^ +STACK CFI 10078c .cfa: $rsp 32 + +STACK CFI 10078f $r13: .cfa -32 + ^ +STACK CFI 100791 .cfa: $rsp 40 + +STACK CFI 100792 .cfa: $rsp 48 + +STACK CFI 100793 .cfa: $rsp 56 + +STACK CFI 10079a .cfa: $rsp 10752 + +STACK CFI 1007a9 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 100de0 109 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 100ded $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 100e03 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ .cfa: $rsp 64 + +STACK CFI INIT 100ef0 76 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 100efe .cfa: $rsp 48 + +STACK CFI 100f04 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 100f70 14e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 100f7d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 100f8a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 100f9b .cfa: $rsp 192 + +STACK CFI 100fa3 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 1010c0 117 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1011e0 93 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1011ee .cfa: $rsp 32 + +STACK CFI 1011fb $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 101280 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10128e .cfa: $rsp 32 + +STACK CFI 101291 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 101310 9c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10131e .cfa: $rsp 32 + +STACK CFI 101321 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1013b0 6e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1013be .cfa: $rsp 32 + +STACK CFI 1013c1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 101420 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 101430 53 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10143e .cfa: $rsp 32 + +STACK CFI 101441 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 101490 38b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101491 .cfa: $rsp 16 + +STACK CFI 101494 $rbp: .cfa -16 + ^ +STACK CFI 101495 .cfa: $rsp 24 + +STACK CFI 101498 $rbx: .cfa -24 + ^ +STACK CFI 10149c .cfa: $rsp 32 + +STACK CFI INIT 101820 13 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 101840 9d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101841 .cfa: $rsp 16 + +STACK CFI 101848 $rbx: .cfa -16 + ^ +STACK CFI INIT 1018e0 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1018e4 .cfa: $rsp 16 + +STACK CFI INIT 101910 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101914 .cfa: $rsp 16 + +STACK CFI INIT 101940 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101944 .cfa: $rsp 16 + +STACK CFI INIT 101970 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101974 .cfa: $rsp 16 + +STACK CFI INIT 136a30 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136a31 .cfa: $rsp 16 + +STACK CFI 136a32 .cfa: $rsp 24 + +STACK CFI 136a36 .cfa: $rsp 32 + +STACK CFI 136a3d $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 101990 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101994 .cfa: $rsp 112 + +STACK CFI INIT 1019e0 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1019e4 .cfa: $rsp 112 + +STACK CFI INIT 101a30 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101a34 .cfa: $rsp 112 + +STACK CFI INIT 101a80 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101a84 .cfa: $rsp 112 + +STACK CFI INIT 101ad0 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101ad4 .cfa: $rsp 112 + +STACK CFI INIT 101b00 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 101b10 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101b14 .cfa: $rsp 112 + +STACK CFI INIT 101b60 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101b64 .cfa: $rsp 112 + +STACK CFI INIT 101bb0 2e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101bb7 .cfa: $rsp 144 + +STACK CFI INIT 101be0 21c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101be2 .cfa: $rsp 16 + +STACK CFI 101be4 .cfa: $rsp 24 + +STACK CFI 101be6 .cfa: $rsp 32 + +STACK CFI 101be7 .cfa: $rsp 40 + +STACK CFI 101be8 .cfa: $rsp 48 + +STACK CFI 101bea $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 101bf4 .cfa: $rsp 1408 + +STACK CFI INIT 101e00 92 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101e02 .cfa: $rsp 16 + +STACK CFI 101e05 $r15: .cfa -16 + ^ +STACK CFI 101e07 .cfa: $rsp 24 + +STACK CFI 101e09 .cfa: $rsp 32 + +STACK CFI 101e0b .cfa: $rsp 40 + +STACK CFI 101e0c .cfa: $rsp 48 + +STACK CFI 101e0d .cfa: $rsp 56 + +STACK CFI 101e11 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 80 + +STACK CFI INIT 101ea0 bc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101ea2 .cfa: $rsp 16 + +STACK CFI 101ea3 .cfa: $rsp 24 + +STACK CFI 101ea6 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI 101ea7 .cfa: $rsp 32 + +STACK CFI 101eaa $rbx: .cfa -32 + ^ +STACK CFI INIT 101f60 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101f61 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI INIT 101f90 e6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 101f92 .cfa: $rsp 16 + +STACK CFI 101f95 $r15: .cfa -16 + ^ +STACK CFI 101f97 .cfa: $rsp 24 + +STACK CFI 101f9a $r14: .cfa -24 + ^ +STACK CFI 101f9c .cfa: $rsp 32 + +STACK CFI 101f9f $r13: .cfa -32 + ^ +STACK CFI 101fa1 .cfa: $rsp 40 + +STACK CFI 101fa2 .cfa: $rsp 48 + +STACK CFI 101fa5 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 101fa6 .cfa: $rsp 56 + +STACK CFI 101fa9 $rbx: .cfa -56 + ^ +STACK CFI 101fad .cfa: $rsp 80 + +STACK CFI INIT 102080 e3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10208d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 1020a0 .cfa: $rsp 48 + +STACK CFI 1020a2 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 102170 9f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 102172 .cfa: $rsp 16 + +STACK CFI 102174 .cfa: $rsp 24 + +STACK CFI 102176 .cfa: $rsp 32 + +STACK CFI 102179 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 10217b .cfa: $rsp 40 + +STACK CFI 10217c .cfa: $rsp 48 + +STACK CFI 10217d .cfa: $rsp 56 + +STACK CFI 102180 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 102184 .cfa: $rsp 64 + +STACK CFI INIT 102210 146 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 102212 .cfa: $rsp 16 + +STACK CFI 102214 .cfa: $rsp 24 + +STACK CFI 102217 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI 102218 .cfa: $rsp 32 + +STACK CFI 102219 .cfa: $rsp 40 + +STACK CFI 10221d .cfa: $rsp 48 + +STACK CFI 10221f $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 102360 4f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1023b0 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1023c0 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1023d0 1e9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1023dd $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 1023fa .cfa: $rsp 128 + +STACK CFI 1023fe $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 1025c0 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1025d0 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1025e0 61 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1025ee .cfa: $rsp 32 + +STACK CFI 1025f1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 102650 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10265e .cfa: $rsp 32 + +STACK CFI 102661 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1026b0 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1026b1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI INIT 102740 84 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10274d $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI 102756 $rbp: .cfa -24 + ^ .cfa: $rsp 32 + +STACK CFI INIT 1027d0 66 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1027de .cfa: $rsp 32 + +STACK CFI 1027e1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 102840 139 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 102842 .cfa: $rsp 16 + +STACK CFI 102844 .cfa: $rsp 24 + +STACK CFI 102847 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI 102848 .cfa: $rsp 32 + +STACK CFI 102849 .cfa: $rsp 40 + +STACK CFI 10284b $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 10284f .cfa: $rsp 48 + +STACK CFI INIT 102980 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 102981 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI INIT 1029b0 1e4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1029bd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 1029ca $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 1029d8 .cfa: $rsp 96 + +STACK CFI 1029e1 $r12: .cfa -40 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 102ba0 1ce .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 102ba2 .cfa: $rsp 16 + +STACK CFI 102ba4 .cfa: $rsp 24 + +STACK CFI 102ba7 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI 102ba8 .cfa: $rsp 32 + +STACK CFI 102ba9 .cfa: $rsp 40 + +STACK CFI 102bb0 .cfa: $rsp 8864 + +STACK CFI 102bc9 $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 102d70 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 102d80 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 102da0 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 102dc0 126 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 102dd7 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 102dea .cfa: $rsp 64 + +STACK CFI 102ded $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 102ef0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 102f00 68 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 102f0d $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 102f11 .cfa: $rsp 32 + +STACK CFI INIT 102f70 4c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 102f7e .cfa: $rsp 32 + +STACK CFI 102f86 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 102fc0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 102fc4 .cfa: $rsp 16 + +STACK CFI INIT 102ff0 6f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 102ffd $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI 103006 .cfa: $rsp 32 + +STACK CFI 10300a $rbx: .cfa -32 + ^ +STACK CFI INIT 103060 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 103062 .cfa: $rsp 16 + +STACK CFI 103065 $r13: .cfa -16 + ^ +STACK CFI 103067 .cfa: $rsp 24 + +STACK CFI 10306a $r12: .cfa -24 + ^ +STACK CFI 10306b .cfa: $rsp 32 + +STACK CFI 10306e $rbp: .cfa -32 + ^ +STACK CFI 10306f .cfa: $rsp 40 + +STACK CFI 103073 .cfa: $rsp 48 + +STACK CFI 103077 $rbx: .cfa -40 + ^ +STACK CFI INIT 1030c0 b4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1030cd $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI 1030e3 .cfa: $rsp 64 + +STACK CFI 1030e5 $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 103180 23a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10318c $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 1031a7 .cfa: $rsp 96 + +STACK CFI 1031ad $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 1033c0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1033c4 .cfa: $rsp 16 + +STACK CFI INIT 1033d0 c0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1033d2 .cfa: $rsp 16 + +STACK CFI 1033d4 .cfa: $rsp 24 + +STACK CFI 1033d5 .cfa: $rsp 32 + +STACK CFI 1033d6 .cfa: $rsp 40 + +STACK CFI 1033d9 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 1033dd .cfa: $rsp 96 + +STACK CFI INIT 103490 f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1034a0 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1034b0 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1034d0 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1034f0 124 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1034fd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 103506 .cfa: $rsp 32 + +STACK CFI 103520 $r12: .cfa -16 + ^ +STACK CFI INIT 103620 2ba .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10362d $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI 103647 .cfa: $rsp 96 + +STACK CFI 10364d $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 1038e0 5b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1038ed $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 1038f1 .cfa: $rsp 32 + +STACK CFI INIT 103940 28e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10394d $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 10395a $r13: .cfa -32 + ^ $rbx: .cfa -56 + ^ +STACK CFI 103968 .cfa: $rsp 64 + +STACK CFI 103980 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 103bd0 346 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 103bd2 .cfa: $rsp 16 + +STACK CFI 103bd9 $r15: .cfa -16 + ^ +STACK CFI 103bdb .cfa: $rsp 24 + +STACK CFI 103bdf $r14: .cfa -24 + ^ +STACK CFI 103be1 .cfa: $rsp 32 + +STACK CFI 103be3 .cfa: $rsp 40 + +STACK CFI 103be7 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 103be8 .cfa: $rsp 48 + +STACK CFI 103beb $rbp: .cfa -48 + ^ +STACK CFI 103bec .cfa: $rsp 56 + +STACK CFI 103bf0 $rbx: .cfa -56 + ^ +STACK CFI 103bf4 .cfa: $rsp 112 + +STACK CFI INIT 103f20 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 103f24 .cfa: $rsp 64 + +STACK CFI INIT 103f40 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 103f50 69 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 103f51 .cfa: $rsp 16 + +STACK CFI 103f54 $rbx: .cfa -16 + ^ +STACK CFI 103f58 .cfa: $rsp 32 + +STACK CFI INIT 103fc0 69 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 103fc1 .cfa: $rsp 16 + +STACK CFI 103fc4 $rbx: .cfa -16 + ^ +STACK CFI 103fc8 .cfa: $rsp 32 + +STACK CFI INIT 104030 3a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104070 71 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104071 .cfa: $rsp 16 + +STACK CFI 104074 $rbx: .cfa -16 + ^ +STACK CFI 104078 .cfa: $rsp 32 + +STACK CFI INIT 1040f0 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1040fe .cfa: $rsp 48 + +STACK CFI 104103 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1041c0 c5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1041ce .cfa: $rsp 48 + +STACK CFI 1041d3 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 104290 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1042a0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1042b0 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1042b1 .cfa: $rsp 16 + +STACK CFI 1042b4 $rbx: .cfa -16 + ^ +STACK CFI 1042b8 .cfa: $rsp 32 + +STACK CFI INIT 104320 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104321 .cfa: $rsp 16 + +STACK CFI 104324 $rbx: .cfa -16 + ^ +STACK CFI 104328 .cfa: $rsp 32 + +STACK CFI INIT 104390 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104391 .cfa: $rsp 16 + +STACK CFI 104394 $rbx: .cfa -16 + ^ +STACK CFI 104398 .cfa: $rsp 32 + +STACK CFI INIT 1043d0 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1043d1 .cfa: $rsp 16 + +STACK CFI 1043d4 $rbx: .cfa -16 + ^ +STACK CFI 1043d8 .cfa: $rsp 32 + +STACK CFI INIT 104410 6f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104411 .cfa: $rsp 16 + +STACK CFI 104414 $rbx: .cfa -16 + ^ +STACK CFI 104418 .cfa: $rsp 32 + +STACK CFI INIT 104480 69 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104481 .cfa: $rsp 16 + +STACK CFI 104484 $rbx: .cfa -16 + ^ +STACK CFI 104488 .cfa: $rsp 32 + +STACK CFI INIT 1044f0 bc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1044fe .cfa: $rsp 32 + +STACK CFI 104503 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1045b0 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1045d0 c7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1045dd $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 1045f3 .cfa: $rsp 48 + +STACK CFI 1045f6 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 1046a0 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1046a4 .cfa: $rsp 16 + +STACK CFI INIT 1046c0 13c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1046cd $r12: .cfa -24 + ^ $rbx: .cfa -40 + ^ +STACK CFI 1046db .cfa: $rsp 64 + +STACK CFI 1046e3 $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ +STACK CFI INIT 104800 14a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10480d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 104823 .cfa: $rsp 64 + +STACK CFI 104826 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 104950 74 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104952 .cfa: $rsp 16 + +STACK CFI 104954 .cfa: $rsp 24 + +STACK CFI 104957 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 104959 .cfa: $rsp 32 + +STACK CFI 10495b .cfa: $rsp 40 + +STACK CFI 10495c .cfa: $rsp 48 + +STACK CFI 10495f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI 104960 .cfa: $rsp 56 + +STACK CFI 104962 $rbx: .cfa -56 + ^ +STACK CFI 104966 .cfa: $rsp 64 + +STACK CFI INIT 1049d0 172 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1049dd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 1049f8 .cfa: $rsp 80 + +STACK CFI 1049fb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 104b50 65 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104b51 .cfa: $rsp 16 + +STACK CFI 104b54 $rbx: .cfa -16 + ^ +STACK CFI 104b58 .cfa: $rsp 32 + +STACK CFI INIT 104bc0 b5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104bcd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 104bd6 .cfa: $rsp 48 + +STACK CFI 104be0 $r12: .cfa -16 + ^ +STACK CFI INIT 104c80 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104ca0 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104cb0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104cc0 3d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104d00 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104d20 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104d50 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104d80 27 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104db0 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104de0 45 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104dee .cfa: $rsp 32 + +STACK CFI 104df6 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 104e30 48 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104e38 $rbx: .cfa -24 + ^ +STACK CFI 104e41 .cfa: $rsp 32 + +STACK CFI 104e4d $rbp: .cfa -16 + ^ +STACK CFI INIT 104e80 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 104ee0 87 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104ee2 .cfa: $rsp 16 + +STACK CFI 104ee3 .cfa: $rsp 24 + +STACK CFI 104ee6 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI 104ee7 .cfa: $rsp 32 + +STACK CFI 104eea $rbx: .cfa -32 + ^ +STACK CFI INIT 104f70 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 104f71 .cfa: $rsp 16 + +STACK CFI 104f79 .cfa: $rsp 24 + +STACK CFI 104f7c $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 104f80 .cfa: $rsp 32 + +STACK CFI INIT 104fd0 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 105030 73 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10503e .cfa: $rsp 32 + +STACK CFI 105042 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1050b0 73 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1050be .cfa: $rsp 32 + +STACK CFI 1050c2 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 105130 9b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105132 .cfa: $rsp 16 + +STACK CFI 105134 .cfa: $rsp 24 + +STACK CFI 105137 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 105139 .cfa: $rsp 32 + +STACK CFI 10513a .cfa: $rsp 40 + +STACK CFI 10513c $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ +STACK CFI 10513d .cfa: $rsp 48 + +STACK CFI 105140 $rbx: .cfa -48 + ^ +STACK CFI INIT 1051d0 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1051d1 .cfa: $rsp 16 + +STACK CFI 1051d9 $rbx: .cfa -16 + ^ +STACK CFI 1051dd .cfa: $rsp 32 + +STACK CFI INIT 105220 60 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105221 .cfa: $rsp 16 + +STACK CFI 105225 $rbx: .cfa -16 + ^ +STACK CFI INIT 105280 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105281 .cfa: $rsp 16 + +STACK CFI 105285 $rbx: .cfa -16 + ^ +STACK CFI INIT 1052e0 97 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1052ec $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ +STACK CFI 1052fa .cfa: $rsp 48 + +STACK CFI 1052fe $r13: .cfa -16 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 105380 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105381 .cfa: $rsp 16 + +STACK CFI 105384 $rbx: .cfa -16 + ^ +STACK CFI 105388 .cfa: $rsp 32 + +STACK CFI INIT 1053f0 75 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1053f1 .cfa: $rsp 16 + +STACK CFI 1053f4 $rbx: .cfa -16 + ^ +STACK CFI 1053f8 .cfa: $rsp 32 + +STACK CFI INIT 105470 9e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105472 .cfa: $rsp 16 + +STACK CFI 105477 $r14: .cfa -16 + ^ +STACK CFI 105479 .cfa: $rsp 24 + +STACK CFI 10547b .cfa: $rsp 32 + +STACK CFI 10547c .cfa: $rsp 40 + +STACK CFI 10547e $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $rbp: .cfa -40 + ^ +STACK CFI 10547f .cfa: $rsp 48 + +STACK CFI 105483 $rbx: .cfa -48 + ^ +STACK CFI INIT 105510 1c4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10551d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10553c .cfa: $rsp 96 + +STACK CFI 10553f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 1056e0 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1056e1 .cfa: $rsp 16 + +STACK CFI 1056e5 $rbx: .cfa -16 + ^ +STACK CFI INIT 105700 6d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10570e .cfa: $rsp 32 + +STACK CFI 105712 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 105770 99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10577d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 105786 .cfa: $rsp 32 + +STACK CFI 105789 $r12: .cfa -16 + ^ +STACK CFI INIT 105810 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10582a .cfa: $rsp 64 + +STACK CFI 105831 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 1058a0 e7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1058ad $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 1058b6 .cfa: $rsp 48 + +STACK CFI 1058b9 $r12: .cfa -16 + ^ +STACK CFI INIT 105990 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1059c0 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1059d0 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1059d4 .cfa: $rsp 32 + +STACK CFI INIT 105a10 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105a14 .cfa: $rsp 16 + +STACK CFI INIT 105a50 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105a54 .cfa: $rsp 32 + +STACK CFI INIT 105a90 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105a91 .cfa: $rsp 16 + +STACK CFI 105a99 $rbx: .cfa -16 + ^ +STACK CFI 105aa2 .cfa: $rsp 32 + +STACK CFI INIT 105ad0 3b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105ad4 .cfa: $rsp 16 + +STACK CFI INIT 105b10 41 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105b11 .cfa: $rsp 16 + +STACK CFI 105b19 $rbx: .cfa -16 + ^ +STACK CFI 105b22 .cfa: $rsp 32 + +STACK CFI INIT 105b60 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 105b70 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105b74 .cfa: $rsp 16 + +STACK CFI INIT 105b90 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105b94 .cfa: $rsp 16 + +STACK CFI INIT 105bb0 110 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105bb2 .cfa: $rsp 16 + +STACK CFI 105bb4 .cfa: $rsp 24 + +STACK CFI 105bb6 .cfa: $rsp 32 + +STACK CFI 105bb9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 105bbb .cfa: $rsp 40 + +STACK CFI 105bbe $r12: .cfa -40 + ^ +STACK CFI 105bbf .cfa: $rsp 48 + +STACK CFI 105bc2 $rbp: .cfa -48 + ^ +STACK CFI 105bc3 .cfa: $rsp 56 + +STACK CFI 105bc7 .cfa: $rsp 96 + +STACK CFI 105bd7 $rbx: .cfa -56 + ^ +STACK CFI INIT 105cc0 f4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105cc2 .cfa: $rsp 16 + +STACK CFI 105cc4 .cfa: $rsp 24 + +STACK CFI 105cc6 .cfa: $rsp 32 + +STACK CFI 105cc8 .cfa: $rsp 40 + +STACK CFI 105ccb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 105ccc .cfa: $rsp 48 + +STACK CFI 105ccf $rbp: .cfa -48 + ^ +STACK CFI 105cd0 .cfa: $rsp 56 + +STACK CFI 105cd4 .cfa: $rsp 80 + +STACK CFI 105ce0 $rbx: .cfa -56 + ^ +STACK CFI INIT 105dc0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 105dd0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 105de0 4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 105df0 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 105e00 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 105e10 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 105e20 c0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105e21 .cfa: $rsp 16 + +STACK CFI 105e2f .cfa: $rsp 144 + +STACK CFI 105ebf $rbx: .cfa -16 + ^ +STACK CFI INIT 105ee0 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105ee1 .cfa: $rsp 16 + +STACK CFI 105ee4 $rbx: .cfa -16 + ^ +STACK CFI INIT 105f10 83 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105f1e .cfa: $rsp 48 + +STACK CFI 105f23 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 105fa0 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 105fb0 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105fbe .cfa: $rsp 32 + +STACK CFI 105fc2 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 106000 9f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10600e .cfa: $rsp 48 + +STACK CFI 106016 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1060a0 219 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1060a2 .cfa: $rsp 16 + +STACK CFI 1060a5 $r12: .cfa -16 + ^ +STACK CFI 1060a8 .cfa: $rsp 24 + +STACK CFI 1060ab $rbp: .cfa -24 + ^ +STACK CFI 1060ac .cfa: $rsp 32 + +STACK CFI 1060b0 .cfa: $rsp 80 + +STACK CFI 1060b4 $rbx: .cfa -32 + ^ +STACK CFI INIT 1062c0 e3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1062c1 .cfa: $rsp 16 + +STACK CFI 1062c4 $rbp: .cfa -16 + ^ +STACK CFI 1062c5 .cfa: $rsp 24 + +STACK CFI 1062c9 .cfa: $rsp 80 + +STACK CFI 1062cd $rbx: .cfa -24 + ^ +STACK CFI INIT 1063b0 255 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1063bd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 1063ca $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 1063db .cfa: $rsp 336 + +STACK CFI 1063eb $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 106610 d7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10661c $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 106629 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI 106635 .cfa: $rsp 1088 + +STACK CFI 10663e $r14: .cfa -16 + ^ +STACK CFI INIT 1066f0 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106703 .cfa: $rsp 32 + +STACK CFI 106706 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 106740 9b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10674e .cfa: $rsp 32 + +STACK CFI 106751 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 10702e 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 10703c .cfa: $rsp 0 + +STACK CFI 107040 .cfa: $rsp 128 + +STACK CFI 107048 .cfa: $rsp -128 + +STACK CFI INIT 10704d 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 10705b .cfa: $rsp 0 + +STACK CFI 10705f .cfa: $rsp 128 + +STACK CFI 107067 .cfa: $rsp -128 + +STACK CFI INIT 1067e0 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1067e1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI INIT 106830 23c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106831 .cfa: $rsp 16 + +STACK CFI 106832 .cfa: $rsp 24 + +STACK CFI 106839 .cfa: $rsp 192 + +STACK CFI 10683d $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 106a70 1f9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106a7d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 106a98 .cfa: $rsp 96 + +STACK CFI 106a9f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 106c70 4b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106c71 .cfa: $rsp 16 + +STACK CFI 106c7b $rbx: .cfa -16 + ^ +STACK CFI 106c8e .cfa: $rsp 32 + +STACK CFI INIT 106cc0 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106cc4 .cfa: $rsp 32 + +STACK CFI INIT 106d10 6c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106d11 .cfa: $rsp 16 + +STACK CFI 106d1b $rbx: .cfa -16 + ^ +STACK CFI 106d1f .cfa: $rsp 64 + +STACK CFI INIT 106d80 6c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106d81 .cfa: $rsp 16 + +STACK CFI 106d8b $rbx: .cfa -16 + ^ +STACK CFI 106d8f .cfa: $rsp 64 + +STACK CFI INIT 106df0 5c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106df1 .cfa: $rsp 16 + +STACK CFI 106dfb $rbx: .cfa -16 + ^ +STACK CFI 106dff .cfa: $rsp 48 + +STACK CFI INIT 106e50 5e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106e51 .cfa: $rsp 16 + +STACK CFI 106e5b $rbx: .cfa -16 + ^ +STACK CFI 106e5f .cfa: $rsp 48 + +STACK CFI INIT 106eb0 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106eb4 .cfa: $rsp 32 + +STACK CFI INIT 106f00 d5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106f01 .cfa: $rsp 16 + +STACK CFI 106f04 $rbp: .cfa -16 + ^ +STACK CFI 106f0f .cfa: $rsp 24 + +STACK CFI 106f13 .cfa: $rsp 80 + +STACK CFI 106f61 $rbx: .cfa -24 + ^ +STACK CFI INIT 106fe0 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 106fe4 .cfa: $rsp 128 + +STACK CFI INIT 107070 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10707e .cfa: $rsp 32 + +STACK CFI 107081 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1070d0 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1070de .cfa: $rsp 32 + +STACK CFI 1070e1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 107130 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10713e .cfa: $rsp 32 + +STACK CFI 107141 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 107190 6c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10719e .cfa: $rsp 32 + +STACK CFI 1071a1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 107200 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10720e .cfa: $rsp 32 + +STACK CFI 107211 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 107260 44 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10726e .cfa: $rsp 32 + +STACK CFI 107271 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1072b0 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1072be .cfa: $rsp 32 + +STACK CFI 1072c1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 107310 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 107314 .cfa: $rsp 16 + +STACK CFI INIT 107330 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 107334 .cfa: $rsp 16 + +STACK CFI INIT 107350 16 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 107354 .cfa: $rsp 16 + +STACK CFI INIT 107370 96 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10737d $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI 107389 .cfa: $rsp 288 + +STACK CFI 107394 $rbx: .cfa -32 + ^ +STACK CFI INIT 107410 107 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 107412 .cfa: $rsp 16 + +STACK CFI 107415 $r15: .cfa -16 + ^ +STACK CFI 107417 .cfa: $rsp 24 + +STACK CFI 10741a $r14: .cfa -24 + ^ +STACK CFI 10741c .cfa: $rsp 32 + +STACK CFI 10741f $r13: .cfa -32 + ^ +STACK CFI 107421 .cfa: $rsp 40 + +STACK CFI 107424 $r12: .cfa -40 + ^ +STACK CFI 107425 .cfa: $rsp 48 + +STACK CFI 107428 $rbp: .cfa -48 + ^ +STACK CFI 107429 .cfa: $rsp 56 + +STACK CFI 10742d .cfa: $rsp 96 + +STACK CFI 10743d $rbx: .cfa -56 + ^ +STACK CFI INIT 107520 219 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10752d $r13: .cfa -24 + ^ $rbx: .cfa -48 + ^ +STACK CFI 107546 .cfa: $rsp 208 + +STACK CFI 107552 $r12: .cfa -32 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ +STACK CFI INIT 107740 10c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10774d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 107759 .cfa: $rsp 288 + +STACK CFI 107767 $r12: .cfa -16 + ^ +STACK CFI INIT 107850 2d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 107851 .cfa: $rsp 16 + +STACK CFI 107854 $rbx: .cfa -16 + ^ +STACK CFI INIT 107880 16b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10788d $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 10789b .cfa: $rsp 80 + +STACK CFI 1078a6 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI INIT 1079f0 224 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1079fd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 107a0a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 107a18 .cfa: $rsp 96 + +STACK CFI 107a1f $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 107c20 227 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 107c2d $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI 107c3a $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 107c48 .cfa: $rsp 96 + +STACK CFI 107c4b $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 107e50 78d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 107e5d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 107e6a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 107e7b $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 1232 + +STACK CFI INIT 1085e0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 108610 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 108630 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 108640 30a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10864d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10866d .cfa: $rsp 192 + +STACK CFI 108670 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 108950 61 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10895e .cfa: $rsp 32 + +STACK CFI 108962 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 1089c0 1a4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 108b70 333 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 108b72 .cfa: $rsp 16 + +STACK CFI 108b74 .cfa: $rsp 24 + +STACK CFI 108b76 .cfa: $rsp 32 + +STACK CFI 108b78 .cfa: $rsp 40 + +STACK CFI 108b79 .cfa: $rsp 48 + +STACK CFI 108b7a .cfa: $rsp 56 + +STACK CFI 108b7d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 108b84 .cfa: $rsp 240 + +STACK CFI INIT 108eb0 d8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 108eb1 .cfa: $rsp 16 + +STACK CFI 108eb4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 108eb9 $r14: .cfa -24 + ^ +STACK CFI 108ec0 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 108ec4 $rbx: .cfa -48 + ^ +STACK CFI INIT 108f90 6e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 108f92 .cfa: $rsp 16 + +STACK CFI 108f95 $r13: .cfa -16 + ^ +STACK CFI 108f97 .cfa: $rsp 24 + +STACK CFI 108f9a $r12: .cfa -24 + ^ +STACK CFI 108f9b .cfa: $rsp 32 + +STACK CFI 108f9e $rbp: .cfa -32 + ^ +STACK CFI 108f9f .cfa: $rsp 40 + +STACK CFI 108fa3 .cfa: $rsp 48 + +STACK CFI 108fa7 $rbx: .cfa -40 + ^ +STACK CFI INIT 109000 1ec .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10900d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 10901a $r12: .cfa -32 + ^ $r14: .cfa -16 + ^ +STACK CFI 109026 .cfa: $rsp 144 + +STACK CFI 10905a $r13: .cfa -24 + ^ +STACK CFI INIT 1091f0 6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 109200 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 109220 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 109240 126 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109257 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10926a .cfa: $rsp 64 + +STACK CFI 10926d $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 109370 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 109380 68 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10938d $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI 109391 .cfa: $rsp 32 + +STACK CFI INIT 1093f0 4c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1093fe .cfa: $rsp 32 + +STACK CFI 109406 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 109440 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109444 .cfa: $rsp 16 + +STACK CFI INIT 109470 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10947d $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ +STACK CFI 109486 .cfa: $rsp 32 + +STACK CFI 10948a $rbx: .cfa -32 + ^ +STACK CFI INIT 109500 132 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109502 .cfa: $rsp 16 + +STACK CFI 109504 .cfa: $rsp 24 + +STACK CFI 109507 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 109509 .cfa: $rsp 32 + +STACK CFI 10950c $r13: .cfa -32 + ^ +STACK CFI 10950e .cfa: $rsp 40 + +STACK CFI 10950f .cfa: $rsp 48 + +STACK CFI 109510 .cfa: $rsp 56 + +STACK CFI 109514 .cfa: $rsp 176 + +STACK CFI 109520 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 109640 172 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10964d $r12: .cfa -32 + ^ $rbp: .cfa -40 + ^ +STACK CFI 10965a $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 109666 .cfa: $rsp 144 + +STACK CFI 109668 $rbx: .cfa -48 + ^ +STACK CFI INIT 1097c0 260 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1097cc $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI 1097d9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 1097e6 $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI 1097ed .cfa: $rsp 208 + +STACK CFI INIT 109a20 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109a24 .cfa: $rsp 16 + +STACK CFI INIT 109a30 f6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109a32 .cfa: $rsp 16 + +STACK CFI 109a34 .cfa: $rsp 24 + +STACK CFI 109a35 .cfa: $rsp 32 + +STACK CFI 109a36 .cfa: $rsp 40 + +STACK CFI 109a39 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 109a40 .cfa: $rsp 208 + +STACK CFI INIT 109bcc 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 109bda .cfa: $rsp 0 + +STACK CFI 109bde .cfa: $rsp 128 + +STACK CFI 109be6 .cfa: $rsp -128 + +STACK CFI INIT 109beb 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 109bf9 .cfa: $rsp 0 + +STACK CFI 109bfd .cfa: $rsp 128 + +STACK CFI 109c05 .cfa: $rsp -128 + +STACK CFI INIT 109b30 9c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109b31 .cfa: $rsp 16 + +STACK CFI 109b3c .cfa: $rsp 48 + +STACK CFI 109b5a $rbx: .cfa -16 + ^ +STACK CFI INIT 109c10 be .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109c1e .cfa: $rsp 48 + +STACK CFI 109c23 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 109cd0 bd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109cde .cfa: $rsp 48 + +STACK CFI 109ce3 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 109d90 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 109dd0 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 109e10 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109e11 .cfa: $rsp 16 + +STACK CFI 109e14 $rbx: .cfa -16 + ^ +STACK CFI 109e18 .cfa: $rsp 32 + +STACK CFI INIT 109e80 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109e81 .cfa: $rsp 16 + +STACK CFI 109e84 $rbx: .cfa -16 + ^ +STACK CFI 109e88 .cfa: $rsp 32 + +STACK CFI INIT 109ef0 69 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109ef1 .cfa: $rsp 16 + +STACK CFI 109ef4 $rbx: .cfa -16 + ^ +STACK CFI 109ef8 .cfa: $rsp 32 + +STACK CFI INIT 109f60 69 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 109f61 .cfa: $rsp 16 + +STACK CFI 109f64 $rbx: .cfa -16 + ^ +STACK CFI 109f68 .cfa: $rsp 32 + +STACK CFI INIT 109fd0 e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10a0c0 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10a110 f9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10a112 .cfa: $rsp 16 + +STACK CFI 10a115 $r15: .cfa -16 + ^ +STACK CFI 10a117 .cfa: $rsp 24 + +STACK CFI 10a119 .cfa: $rsp 32 + +STACK CFI 10a11b .cfa: $rsp 40 + +STACK CFI 10a11e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 10a11f .cfa: $rsp 48 + +STACK CFI 10a120 .cfa: $rsp 56 + +STACK CFI 10a124 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 96 + +STACK CFI INIT 10a210 f9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10a212 .cfa: $rsp 16 + +STACK CFI 10a215 $r15: .cfa -16 + ^ +STACK CFI 10a217 .cfa: $rsp 24 + +STACK CFI 10a219 .cfa: $rsp 32 + +STACK CFI 10a21b .cfa: $rsp 40 + +STACK CFI 10a21e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ +STACK CFI 10a21f .cfa: $rsp 48 + +STACK CFI 10a220 .cfa: $rsp 56 + +STACK CFI 10a224 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 96 + +STACK CFI INIT 10a310 87 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10a314 .cfa: $rsp 16 + +STACK CFI 10a319 $rbx: .cfa -16 + ^ +STACK CFI INIT 10a3a0 19 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10a3a4 .cfa: $rsp 64 + +STACK CFI INIT 10a3c0 a4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10a3c1 .cfa: $rsp 16 + +STACK CFI 10a3c4 $rbx: .cfa -16 + ^ +STACK CFI 10a3c8 .cfa: $rsp 64 + +STACK CFI INIT 10a470 43a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10a475 .cfa: $rsp 16 + +STACK CFI 10a478 $rbx: .cfa -16 + ^ +STACK CFI INIT 10a8b0 6f7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10a8b2 .cfa: $rsp 16 + +STACK CFI 10a8b7 $r15: .cfa -16 + ^ +STACK CFI 10a8c0 .cfa: $rsp 24 + +STACK CFI 10a8c4 $r14: .cfa -24 + ^ +STACK CFI 10a8c6 .cfa: $rsp 32 + +STACK CFI 10a8c9 $r13: .cfa -32 + ^ +STACK CFI 10a8cb .cfa: $rsp 40 + +STACK CFI 10a8ce $r12: .cfa -40 + ^ +STACK CFI 10a8cf .cfa: $rsp 48 + +STACK CFI 10a8d0 .cfa: $rsp 56 + +STACK CFI 10a8d7 .cfa: $rsp 384 + +STACK CFI 10a992 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 10afb0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10afe0 117 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 136700 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10b100 39c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10b102 .cfa: $rsp 16 + +STACK CFI 10b104 .cfa: $rsp 24 + +STACK CFI 10b106 .cfa: $rsp 32 + +STACK CFI 10b108 .cfa: $rsp 40 + +STACK CFI 10b10b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 10b10c .cfa: $rsp 48 + +STACK CFI 10b10f $rbp: .cfa -48 + ^ +STACK CFI 10b110 .cfa: $rsp 56 + +STACK CFI 10b114 .cfa: $rsp 176 + +STACK CFI 10b14c $rbx: .cfa -56 + ^ +STACK CFI INIT 10b4a0 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10b4ad $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 10b4c3 .cfa: $rsp 80 + +STACK CFI 10b4c6 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 10b530 74 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10b53d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 10b553 .cfa: $rsp 64 + +STACK CFI 10b559 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 136730 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10b5b0 6ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10b5b1 .cfa: $rsp 16 + +STACK CFI 10b5b4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 10b5b9 $r15: .cfa -24 + ^ +STACK CFI 10b5be $r14: .cfa -32 + ^ +STACK CFI 10b5c3 $r13: .cfa -40 + ^ +STACK CFI 10b5cc $r12: .cfa -48 + ^ +STACK CFI 10b5fc $rbx: .cfa -56 + ^ +STACK CFI INIT 10bc60 86 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10bc6d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 10bc83 .cfa: $rsp 80 + +STACK CFI 10bc86 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 10bcf0 6d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10bcfd $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 10bd13 .cfa: $rsp 64 + +STACK CFI 10bd16 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 136760 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10bd60 8a7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10bd61 .cfa: $rsp 16 + +STACK CFI 10bd64 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 10bdaa $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 10c610 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10c660 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10c66c $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10c679 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 10c687 .cfa: $rsp 80 + +STACK CFI 10c690 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 10c6f0 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10c6fd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10c718 .cfa: $rsp 96 + +STACK CFI 10c722 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 10c7a0 40b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10c7a2 .cfa: $rsp 16 + +STACK CFI 10c7a4 .cfa: $rsp 24 + +STACK CFI 10c7a6 .cfa: $rsp 32 + +STACK CFI 10c7a9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 10c7ab .cfa: $rsp 40 + +STACK CFI 10c7ac .cfa: $rsp 48 + +STACK CFI 10c7ad .cfa: $rsp 56 + +STACK CFI 10c7b1 .cfa: $rsp 144 + +STACK CFI 10c7c8 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 10cbb0 369 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10cbb2 .cfa: $rsp 16 + +STACK CFI 10cbb5 $r15: .cfa -16 + ^ +STACK CFI 10cbb7 .cfa: $rsp 24 + +STACK CFI 10cbba $r14: .cfa -24 + ^ +STACK CFI 10cbbc .cfa: $rsp 32 + +STACK CFI 10cbbf $r13: .cfa -32 + ^ +STACK CFI 10cbc1 .cfa: $rsp 40 + +STACK CFI 10cbc2 .cfa: $rsp 48 + +STACK CFI 10cbc3 .cfa: $rsp 56 + +STACK CFI 10cbc5 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10cbc9 .cfa: $rsp 128 + +STACK CFI INIT 136790 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10cf20 675 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10cf21 .cfa: $rsp 16 + +STACK CFI 10cf24 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 10cf29 $r15: .cfa -24 + ^ +STACK CFI 10cf35 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 10cf41 $r12: .cfa -48 + ^ +STACK CFI 10cf68 $rbx: .cfa -56 + ^ +STACK CFI INIT 10d5a0 99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10d5ad $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10d5c8 .cfa: $rsp 96 + +STACK CFI 10d5cd $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 10d640 7e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10d64d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10d65d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 10d66e .cfa: $rsp 80 + +STACK CFI 10d671 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 10d6c0 11b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10d6da .cfa: $rsp 96 + +STACK CFI 10d6df $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 10d7e0 c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10d7ed $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 10d7fa $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI 10d806 .cfa: $rsp 48 + +STACK CFI 10d812 $r14: .cfa -16 + ^ +STACK CFI INIT 10d8b0 2a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10d8b1 .cfa: $rsp 16 + +STACK CFI 10d8b4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 10d8bf $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 10d8ca $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10d8ee $r12: .cfa -48 + ^ +STACK CFI INIT 10db60 ca .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10db79 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbx: .cfa -48 + ^ +STACK CFI 10db82 .cfa: $rsp 48 + +STACK CFI 10db94 $rbp: .cfa -40 + ^ +STACK CFI INIT 10dc30 146 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10dc32 .cfa: $rsp 16 + +STACK CFI 10dc35 $r15: .cfa -16 + ^ +STACK CFI 10dc37 .cfa: $rsp 24 + +STACK CFI 10dc3a $r14: .cfa -24 + ^ +STACK CFI 10dc3f .cfa: $rsp 32 + +STACK CFI 10dc42 $r13: .cfa -32 + ^ +STACK CFI 10dc47 .cfa: $rsp 40 + +STACK CFI 10dc48 .cfa: $rsp 48 + +STACK CFI 10dc4b $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 10dc4c .cfa: $rsp 56 + +STACK CFI 10dc4f $rbx: .cfa -56 + ^ +STACK CFI 10dc53 .cfa: $rsp 64 + +STACK CFI INIT 10dd80 41 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10dd81 .cfa: $rsp 16 + +STACK CFI 10dd88 $rbx: .cfa -16 + ^ +STACK CFI INIT 10ddd0 37c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10ddd1 .cfa: $rsp 16 + +STACK CFI 10ddd4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 10dddf $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 10e150 115 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10e15d $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 10e172 .cfa: $rsp 64 + +STACK CFI 10e176 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI INIT 10e270 180 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10e271 .cfa: $rsp 16 + +STACK CFI 10e274 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 10e27b $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 10e280 $r13: .cfa -40 + ^ +STACK CFI 10e285 $r12: .cfa -48 + ^ +STACK CFI 10e299 $rbx: .cfa -56 + ^ +STACK CFI INIT 10e3f0 18 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10e3f4 .cfa: $rsp 16 + +STACK CFI INIT 10e410 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10e430 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10e460 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10e480 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10e4b0 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10e4d0 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10e4f0 a5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10e4f2 .cfa: $rsp 16 + +STACK CFI 10e503 $r14: .cfa -16 + ^ +STACK CFI 10e50a .cfa: $rsp 24 + +STACK CFI 10e50c .cfa: $rsp 32 + +STACK CFI 10e50d .cfa: $rsp 40 + +STACK CFI 10e50e .cfa: $rsp 48 + +STACK CFI 10e512 .cfa: $rsp 64 + +STACK CFI 10e517 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI INIT 10e5a0 107 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10e5a1 .cfa: $rsp 16 + +STACK CFI 10e5a2 .cfa: $rsp 24 + +STACK CFI 10e5a9 .cfa: $rsp 160 + +STACK CFI 10e5b7 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 10e6b0 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10e6b4 .cfa: $rsp 16 + +STACK CFI INIT 10e6e0 4c4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10e6e1 .cfa: $rsp 16 + +STACK CFI 10e6e4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 10e6ed $r15: .cfa -24 + ^ +STACK CFI 10e6f5 $r14: .cfa -32 + ^ +STACK CFI 10e6fa $r13: .cfa -40 + ^ +STACK CFI 10e703 $r12: .cfa -48 + ^ +STACK CFI 10e707 $rbx: .cfa -56 + ^ +STACK CFI INIT 10ebb0 62 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10ebbe .cfa: $rsp 48 + +STACK CFI 10ebc5 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 10ec20 2e8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10ec2d $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10ec3a $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 10ec48 .cfa: $rsp 96 + +STACK CFI 10ec55 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 10ef10 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10ef17 .cfa: $rsp 160 + +STACK CFI INIT 10ef30 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10ef3b .cfa: $rsp 16 + +STACK CFI INIT 10ef60 4f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10ef64 .cfa: $rsp 32 + +STACK CFI INIT 10f332 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f340 .cfa: $rsp 0 + +STACK CFI 10f344 .cfa: $rsp 128 + +STACK CFI 10f34c .cfa: $rsp -128 + +STACK CFI INIT 10f351 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f35f .cfa: $rsp 0 + +STACK CFI 10f363 .cfa: $rsp 128 + +STACK CFI 10f36b .cfa: $rsp -128 + +STACK CFI INIT 10f370 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f37e .cfa: $rsp 0 + +STACK CFI 10f382 .cfa: $rsp 128 + +STACK CFI 10f38a .cfa: $rsp -128 + +STACK CFI INIT 10f38f 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f39d .cfa: $rsp 0 + +STACK CFI 10f3a1 .cfa: $rsp 128 + +STACK CFI 10f3a9 .cfa: $rsp -128 + +STACK CFI INIT 10f3ae 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f3bc .cfa: $rsp 0 + +STACK CFI 10f3c0 .cfa: $rsp 128 + +STACK CFI 10f3c8 .cfa: $rsp -128 + +STACK CFI INIT 10f3cd 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f3db .cfa: $rsp 0 + +STACK CFI 10f3df .cfa: $rsp 128 + +STACK CFI 10f3e7 .cfa: $rsp -128 + +STACK CFI INIT 10f3ec 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f3fa .cfa: $rsp 0 + +STACK CFI 10f3fe .cfa: $rsp 128 + +STACK CFI 10f406 .cfa: $rsp -128 + +STACK CFI INIT 10f40b 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f419 .cfa: $rsp 0 + +STACK CFI 10f41d .cfa: $rsp 128 + +STACK CFI 10f425 .cfa: $rsp -128 + +STACK CFI INIT 10efb0 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10efb4 .cfa: $rsp 16 + +STACK CFI INIT 10efe0 5c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10efee .cfa: $rsp 32 + +STACK CFI 10eff1 $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI INIT 10f040 70 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f04d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 10f056 .cfa: $rsp 32 + +STACK CFI 10f05c $r12: .cfa -16 + ^ +STACK CFI INIT 10f0b0 70 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f0bd $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 10f0c6 .cfa: $rsp 32 + +STACK CFI 10f0cc $r12: .cfa -16 + ^ +STACK CFI INIT 10f120 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f121 .cfa: $rsp 16 + +STACK CFI 10f124 $rbx: .cfa -16 + ^ +STACK CFI INIT 10f150 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10f160 63 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f164 .cfa: $rsp 16 + +STACK CFI INIT 10f1d0 74 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f1d4 .cfa: $rsp 16 + +STACK CFI INIT 10f250 70 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f254 .cfa: $rsp 16 + +STACK CFI INIT 10f2c0 72 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f2c4 .cfa: $rsp 16 + +STACK CFI INIT 10f430 51 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f431 .cfa: $rsp 16 + +STACK CFI 10f434 $rbx: .cfa -16 + ^ +STACK CFI 10f438 .cfa: $rsp 32 + +STACK CFI INIT 10f490 51 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f491 .cfa: $rsp 16 + +STACK CFI 10f494 $rbx: .cfa -16 + ^ +STACK CFI 10f498 .cfa: $rsp 32 + +STACK CFI INIT 10f5b4 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f5c2 .cfa: $rsp 0 + +STACK CFI 10f5c6 .cfa: $rsp 128 + +STACK CFI 10f5ce .cfa: $rsp -128 + +STACK CFI INIT 10f5d0 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f5de .cfa: $rsp 0 + +STACK CFI 10f5e2 .cfa: $rsp 128 + +STACK CFI 10f5ea .cfa: $rsp -128 + +STACK CFI INIT 10f4f0 c4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f4f4 .cfa: $rsp 16 + +STACK CFI INIT 10f654 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f662 .cfa: $rsp 0 + +STACK CFI 10f666 .cfa: $rsp 128 + +STACK CFI 10f66e .cfa: $rsp -128 + +STACK CFI INIT 10f670 1c .cfa: $rsp -128 + .ra: $rip +STACK CFI 10f67e .cfa: $rsp 0 + +STACK CFI 10f682 .cfa: $rsp 128 + +STACK CFI 10f68a .cfa: $rsp -128 + +STACK CFI INIT 10f5f0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f5f4 .cfa: $rsp 16 + +STACK CFI INIT 10f690 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10f6a0 202 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f6b9 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10f6cf .cfa: $rsp 432 + +STACK CFI 10f6d4 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 10f8b0 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f8b4 .cfa: $rsp 16 + +STACK CFI INIT 10f900 168 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10f904 .cfa: $rsp 16 + +STACK CFI INIT 10fa70 6f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10fa74 .cfa: $rsp 16 + +STACK CFI INIT 10fae0 1ea .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10fae2 .cfa: $rsp 16 + +STACK CFI 10fae4 .cfa: $rsp 24 + +STACK CFI 10fae6 .cfa: $rsp 32 + +STACK CFI 10fae9 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI 10faeb .cfa: $rsp 40 + +STACK CFI 10faec .cfa: $rsp 48 + +STACK CFI 10faef $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI 10faf2 .cfa: $rsp 56 + +STACK CFI 10faf5 $rbx: .cfa -56 + ^ +STACK CFI 10fafc .cfa: $rsp 416 + +STACK CFI INIT 10fcd0 4f6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10fcdd $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 10fcf8 .cfa: $rsp 816 + +STACK CFI 10fd06 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ +STACK CFI INIT 1101d0 ce .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1101d1 .cfa: $rsp 16 + +STACK CFI 1101d4 $rbp: .cfa -16 + ^ +STACK CFI 1101d5 .cfa: $rsp 24 + +STACK CFI 1101d8 $rbx: .cfa -24 + ^ +STACK CFI 1101dc .cfa: $rsp 48 + +STACK CFI INIT 1102a0 259 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1102a2 .cfa: $rsp 16 + +STACK CFI 1102a5 $r15: .cfa -16 + ^ +STACK CFI 1102a7 .cfa: $rsp 24 + +STACK CFI 1102aa $r14: .cfa -24 + ^ +STACK CFI 1102ac .cfa: $rsp 32 + +STACK CFI 1102ae .cfa: $rsp 40 + +STACK CFI 1102af .cfa: $rsp 48 + +STACK CFI 1102b0 .cfa: $rsp 56 + +STACK CFI 1102b3 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 1102ba .cfa: $rsp 416 + +STACK CFI INIT 110500 23c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11050d $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI 11052b .cfa: $rsp 416 + +STACK CFI 110539 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ +STACK CFI INIT 110841 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 11084f .cfa: $rsp 0 + +STACK CFI 110853 .cfa: $rsp 128 + +STACK CFI 11085b .cfa: $rsp -128 + +STACK CFI INIT 110860 1f .cfa: $rsp -128 + .ra: $rip +STACK CFI 11086e .cfa: $rsp 0 + +STACK CFI 110872 .cfa: $rsp 128 + +STACK CFI 11087a .cfa: $rsp -128 + +STACK CFI INIT 110740 101 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11074d $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 11075b .cfa: $rsp 32 + +STACK CFI 11078a $r12: .cfa -16 + ^ +STACK CFI INIT 110880 fe .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 110881 .cfa: $rsp 16 + +STACK CFI 110889 $rbp: .cfa -16 + ^ +STACK CFI 11088a .cfa: $rsp 24 + +STACK CFI 11088d $rbx: .cfa -24 + ^ +STACK CFI 11089b .cfa: $rsp 32 + +STACK CFI INIT 110980 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 110990 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1109a0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1109b0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1109c0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1109d0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1109e0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1109f0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 110a00 43 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 110a50 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 110a70 1d3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 110a72 .cfa: $rsp 16 + +STACK CFI 110a75 $r15: .cfa -16 + ^ +STACK CFI 110a77 .cfa: $rsp 24 + +STACK CFI 110a7a $r14: .cfa -24 + ^ +STACK CFI 110a7c .cfa: $rsp 32 + +STACK CFI 110a7e .cfa: $rsp 40 + +STACK CFI 110a7f .cfa: $rsp 48 + +STACK CFI 110a80 .cfa: $rsp 56 + +STACK CFI 110a84 .cfa: $rsp 160 + +STACK CFI 110a8b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 110c50 63 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 110cc0 339 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 110cc2 .cfa: $rsp 16 + +STACK CFI 110cc4 .cfa: $rsp 24 + +STACK CFI 110cc6 .cfa: $rsp 32 + +STACK CFI 110cc8 .cfa: $rsp 40 + +STACK CFI 110cc9 .cfa: $rsp 48 + +STACK CFI 110cca .cfa: $rsp 56 + +STACK CFI 110ccd $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 110cd1 .cfa: $rsp 96 + +STACK CFI INIT 111000 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 111040 17 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 111060 4a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 111061 .cfa: $rsp 16 + +STACK CFI 111064 $rbx: .cfa -16 + ^ +STACK CFI 111071 .cfa: $rsp 32 + +STACK CFI INIT 1110b0 4f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1110b1 .cfa: $rsp 16 + +STACK CFI 1110b4 $rbx: .cfa -16 + ^ +STACK CFI 1110c2 .cfa: $rsp 32 + +STACK CFI INIT 111100 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1367c0 74 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1367c1 .cfa: $rsp 16 + +STACK CFI 1367c4 $rbx: .cfa -16 + ^ +STACK CFI INIT 111110 62 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 111114 .cfa: $rsp 64 + +STACK CFI INIT 136840 148 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 136842 .cfa: $rsp 16 + +STACK CFI 136844 .cfa: $rsp 24 + +STACK CFI 136846 .cfa: $rsp 32 + +STACK CFI 136848 .cfa: $rsp 40 + +STACK CFI 136849 .cfa: $rsp 48 + +STACK CFI 13684a .cfa: $rsp 56 + +STACK CFI 13684e .cfa: $rsp 80 + +STACK CFI 136855 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI INIT 111180 21 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1111b0 52 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1111b4 .cfa: $rsp 48 + +STACK CFI INIT 111210 3c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 111214 .cfa: $rsp 48 + +STACK CFI INIT 111250 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 111251 .cfa: $rsp 16 + +STACK CFI 111254 $rbx: .cfa -16 + ^ +STACK CFI 11125b .cfa: $rsp 32 + +STACK CFI INIT 1112a0 4fe .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1112a1 .cfa: $rsp 16 + +STACK CFI 1112a4 $rbp: .cfa -16 + ^ .cfa: $rbp 16 + +STACK CFI 1112ab $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 1112b0 $r13: .cfa -40 + ^ +STACK CFI 1112b5 $r12: .cfa -48 + ^ +STACK CFI 1112e5 $rbx: .cfa -56 + ^ +STACK CFI INIT 1117a0 d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1117b0 ee .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1117b4 .cfa: $rsp 48 + +STACK CFI INIT 1118a0 11 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1118c0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 1118f0 95 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1118f4 .cfa: $rsp 64 + diff --git a/src/processor/testdata/symbols/libgcc_s.so.1/18B180F90887D8F8B5C35D185444AF4C0/libgcc_s.so.1.sym b/src/processor/testdata/symbols/libgcc_s.so.1/18B180F90887D8F8B5C35D185444AF4C0/libgcc_s.so.1.sym new file mode 100644 index 0000000..c53f287 --- /dev/null +++ b/src/processor/testdata/symbols/libgcc_s.so.1/18B180F90887D8F8B5C35D185444AF4C0/libgcc_s.so.1.sym @@ -0,0 +1,897 @@ +MODULE Linux x86_64 18B180F90887D8F8B5C35D185444AF4C0 libgcc_s.so.1 +PUBLIC 2fe0 0 __multi3 +PUBLIC 3030 0 __negti2 +PUBLIC 3060 0 __lshrti3 +PUBLIC 30d0 0 __ashlti3 +PUBLIC 3140 0 __ashrti3 +PUBLIC 31b0 0 __cmpti2 +PUBLIC 31f0 0 __ucmpti2 +PUBLIC 3230 0 __clear_cache +PUBLIC 3240 0 __absvdi2 +PUBLIC 3260 0 __absvsi2 +PUBLIC 3280 0 __absvti2 +PUBLIC 32b0 0 __addvdi3 +PUBLIC 32e0 0 __addvsi3 +PUBLIC 3310 0 __addvti3 +PUBLIC 3360 0 __subvdi3 +PUBLIC 3390 0 __subvsi3 +PUBLIC 33c0 0 __subvti3 +PUBLIC 3420 0 __mulvdi3 +PUBLIC 3440 0 __mulvsi3 +PUBLIC 3470 0 __mulvti3 +PUBLIC 36e0 0 __negvdi2 +PUBLIC 3710 0 __negvsi2 +PUBLIC 3730 0 __negvti2 +PUBLIC 3780 0 __ffsdi2 +PUBLIC 3790 0 __ffsti2 +PUBLIC 37b0 0 __clzdi2 +PUBLIC 37c0 0 __clzti2 +PUBLIC 37e0 0 __ctzdi2 +PUBLIC 37f0 0 __ctzti2 +PUBLIC 3810 0 __popcountdi2 +PUBLIC 3840 0 __popcountti2 +PUBLIC 3890 0 __paritydi2 +PUBLIC 38d0 0 __parityti2 +PUBLIC 3910 0 __powisf2 +PUBLIC 3960 0 __powidf2 +PUBLIC 39c0 0 __powixf2 +PUBLIC 3a20 0 __mulsc3 +PUBLIC 3cd0 0 __muldc3 +PUBLIC 3fc0 0 __mulxc3 +PUBLIC 4420 0 __divsc3 +PUBLIC 46f0 0 __divdc3 +PUBLIC 4a00 0 __divxc3 +PUBLIC 4d00 0 __bswapsi2 +PUBLIC 4d10 0 __bswapdi2 +PUBLIC 4d20 0 __clrsbdi2 +PUBLIC 4d50 0 __clrsbti2 +PUBLIC 4da0 0 __fixunssfdi +PUBLIC 4dd0 0 __fixunsdfdi +PUBLIC 4e00 0 __fixunsxfdi +PUBLIC 4e70 0 __fixsfti +PUBLIC 4eb0 0 __fixdfti +PUBLIC 4ef0 0 __fixxfti +PUBLIC 4f30 0 __fixunssfti +PUBLIC 4fd0 0 __fixunsdfti +PUBLIC 5070 0 __fixunsxfti +PUBLIC 5260 0 __floattisf +PUBLIC 5330 0 __floattidf +PUBLIC 5400 0 __floattixf +PUBLIC 5430 0 __floatuntisf +PUBLIC 5520 0 __floatuntidf +PUBLIC 5610 0 __floatuntixf +PUBLIC 5650 0 __divti3 +PUBLIC 57f0 0 __modti3 +PUBLIC 59e0 0 __udivti3 +PUBLIC 5b10 0 __umodti3 +PUBLIC 5cb0 0 __udivmodti4 +PUBLIC 5f00 0 __addtf3 +PUBLIC 73d0 0 __divtf3 +PUBLIC 7e50 0 __multf3 +PUBLIC 8820 0 __negtf2 +PUBLIC 8b70 0 __subtf3 +PUBLIC a0e0 0 __unordtf2 +PUBLIC a190 0 __fixtfsi +PUBLIC a2a0 0 __fixunstfsi +PUBLIC a380 0 __floatsitf +PUBLIC a470 0 __floatunsitf +PUBLIC a550 0 __fixtfdi +PUBLIC a6d0 0 __fixunstfdi +PUBLIC a800 0 __floatditf +PUBLIC a8f0 0 __floatunditf +PUBLIC a9d0 0 __fixtfti +PUBLIC abb0 0 __fixunstfti +PUBLIC ad40 0 __floattitf +PUBLIC b0d0 0 __floatuntitf +PUBLIC b430 0 __extendsftf2 +PUBLIC b5a0 0 __extenddftf2 +PUBLIC b730 0 __extendxftf2 +PUBLIC b880 0 __trunctfsf2 +PUBLIC bd70 0 __trunctfdf2 +PUBLIC c2a0 0 __trunctfxf2 +PUBLIC c7b0 0 __gttf2 +PUBLIC c9e0 0 __letf2 +PUBLIC cbe0 0 __eqtf2 +PUBLIC cd40 0 __divtc3 +PUBLIC d3c0 0 __multc3 +PUBLIC da30 0 __powitf2 +PUBLIC dad0 0 __enable_execute_stack +PUBLIC de60 0 _Unwind_GetGR +PUBLIC deb0 0 _Unwind_GetCFA +PUBLIC dec0 0 _Unwind_SetGR +PUBLIC df10 0 _Unwind_GetIP +PUBLIC df20 0 _Unwind_GetIPInfo +PUBLIC df40 0 _Unwind_SetIP +PUBLIC df50 0 _Unwind_GetLanguageSpecificData +PUBLIC df60 0 _Unwind_GetRegionStart +PUBLIC df70 0 _Unwind_FindEnclosingFunction +PUBLIC dfa0 0 _Unwind_GetDataRelBase +PUBLIC dfb0 0 _Unwind_GetTextRelBase +PUBLIC fef0 0 _Unwind_RaiseException +PUBLIC 10060 0 _Unwind_ForcedUnwind +PUBLIC 10150 0 _Unwind_Resume +PUBLIC 10230 0 _Unwind_Resume_or_Rethrow +PUBLIC 10330 0 _Unwind_DeleteException +PUBLIC 10350 0 _Unwind_Backtrace +PUBLIC 11ac0 0 __register_frame_info_bases +PUBLIC 11b50 0 __register_frame_info +PUBLIC 11b60 0 __register_frame +PUBLIC 11b90 0 __register_frame_info_table_bases +PUBLIC 11c10 0 __register_frame_info_table +PUBLIC 11c20 0 __register_frame_table +PUBLIC 11c40 0 __deregister_frame_info_bases +PUBLIC 11d60 0 __deregister_frame_info +PUBLIC 11d70 0 __deregister_frame +PUBLIC 11da0 0 _Unwind_Find_FDE +PUBLIC 12160 0 __gcc_personality_v0 +PUBLIC 12420 0 __emutls_get_address +PUBLIC 125a0 0 __emutls_register_common +STACK CFI INIT 2bb0 2c0 .cfa: $rsp 16 + .ra: .cfa -8 + ^ +STACK CFI 2bb6 .cfa: $rsp 24 + +STACK CFI INIT 2fe0 4b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3030 29 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3060 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 30d0 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3140 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31b0 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 31f0 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3230 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3240 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3259 .cfa: $rsp 16 + +STACK CFI INIT 3260 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3277 .cfa: $rsp 16 + +STACK CFI INIT 3280 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32a0 .cfa: $rsp 16 + +STACK CFI INIT 32b0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32d1 .cfa: $rsp 16 + +STACK CFI INIT 32e0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3300 .cfa: $rsp 16 + +STACK CFI INIT 3310 45 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3317 .cfa: $rsp 16 + +STACK CFI 3354 .cfa: $rsp 8 + +STACK CFI INIT 3360 2e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3389 .cfa: $rsp 16 + +STACK CFI INIT 3390 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33b0 .cfa: $rsp 16 + +STACK CFI INIT 33c0 55 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33ca .cfa: $rsp 16 + +STACK CFI 3414 .cfa: $rsp 8 + +STACK CFI INIT 3420 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3435 .cfa: $rsp 16 + +STACK CFI INIT 3440 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 345d .cfa: $rsp 16 + +STACK CFI INIT 3470 26e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3477 .cfa: $rsp 160 + +STACK CFI 34de .cfa: $rsp 8 + +STACK CFI 34df .cfa: $rsp 160 + +STACK CFI INIT 36e0 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36ff .cfa: $rsp 16 + +STACK CFI INIT 3710 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3729 .cfa: $rsp 16 + +STACK CFI INIT 3730 47 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3772 .cfa: $rsp 16 + +STACK CFI INIT 3780 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3790 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37b0 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37c0 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37e0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 37f0 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3810 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3840 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3890 36 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 38d0 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3910 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3960 51 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 39c0 5f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3a20 2a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3cd0 2ea .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3fc0 456 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4420 2cb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 46f0 30a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4a00 2fb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4d00 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4d10 7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4d20 23 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4d50 4d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4da0 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4dd0 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4e00 6a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4e70 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4e84 .cfa: $rsp 16 + +STACK CFI 4e9f .cfa: $rsp 8 + +STACK CFI INIT 4eb0 34 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4ec4 .cfa: $rsp 16 + +STACK CFI 4ee0 .cfa: $rsp 8 + +STACK CFI INIT 4ef0 39 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4ef4 .cfa: $rsp 32 + +STACK CFI 4f06 .cfa: $rsp 8 + +STACK CFI 4f10 .cfa: $rsp 32 + +STACK CFI 4f25 .cfa: $rsp 8 + +STACK CFI INIT 4f30 9f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4fd0 97 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 5070 1e1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5072 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 5074 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 5078 .cfa: $rsp 96 + +STACK CFI 513a .cfa: $rsp 24 + +STACK CFI 513c .cfa: $rsp 16 + +STACK CFI 513e .cfa: $rsp 8 + +STACK CFI 5140 .cfa: $rsp 96 + +STACK CFI 51fe .cfa: $rsp 24 + +STACK CFI 5200 .cfa: $rsp 16 + +STACK CFI 5202 .cfa: $rsp 8 + +STACK CFI 5208 .cfa: $rsp 96 + +STACK CFI 5248 .cfa: $rsp 24 + +STACK CFI 524e .cfa: $rsp 16 + +STACK CFI 5250 .cfa: $rsp 8 + +STACK CFI INIT 5260 ca .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 5330 ca .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 5400 2d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 5430 ee .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 5520 ee .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 5610 3d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 5650 19c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5651 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 56ee .cfa: $rsp 8 + +STACK CFI 56f0 .cfa: $rsp 16 + +STACK CFI INIT 57f0 1eb .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 57f2 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 57fc $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 57fd $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 58a9 .cfa: $rsp 24 + +STACK CFI 58aa .cfa: $rsp 16 + +STACK CFI 58ac .cfa: $rsp 8 + +STACK CFI 58b0 .cfa: $rsp 32 + +STACK CFI INIT 59e0 12b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 5b10 189 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5b11 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 5b1b $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 5b4e .cfa: $rsp 16 + +STACK CFI 5b4f .cfa: $rsp 8 + +STACK CFI 5b50 .cfa: $rsp 24 + +STACK CFI 5b8f .cfa: $rsp 16 + +STACK CFI 5b90 .cfa: $rsp 8 + +STACK CFI 5b98 .cfa: $rsp 24 + +STACK CFI 5bd5 .cfa: $rsp 16 + +STACK CFI 5bd6 .cfa: $rsp 8 + +STACK CFI 5be0 .cfa: $rsp 24 + +STACK CFI 5c69 .cfa: $rsp 16 + +STACK CFI 5c6a .cfa: $rsp 8 + +STACK CFI 5c70 .cfa: $rsp 24 + +STACK CFI INIT 5ca0 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 5cb0 247 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5cd2 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI INIT 5f00 14c4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5f02 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 5f11 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 5f13 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 5f15 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 5f16 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 5f17 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 5f1b .cfa: $rsp 72 + +STACK CFI 6170 .cfa: $rsp 56 + +STACK CFI 6171 .cfa: $rsp 48 + +STACK CFI 6172 .cfa: $rsp 40 + +STACK CFI 6174 .cfa: $rsp 32 + +STACK CFI 6176 .cfa: $rsp 24 + +STACK CFI 6178 .cfa: $rsp 16 + +STACK CFI 617a .cfa: $rsp 8 + +STACK CFI 6180 .cfa: $rsp 72 + +STACK CFI INIT 73d0 a79 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 73d2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 73d4 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 73d6 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 73d8 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 73d9 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 73da $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 73de .cfa: $rsp 88 + +STACK CFI 7790 .cfa: $rsp 56 + +STACK CFI 7791 .cfa: $rsp 48 + +STACK CFI 7792 .cfa: $rsp 40 + +STACK CFI 7794 .cfa: $rsp 32 + +STACK CFI 7796 .cfa: $rsp 24 + +STACK CFI 7798 .cfa: $rsp 16 + +STACK CFI 779a .cfa: $rsp 8 + +STACK CFI 77a0 .cfa: $rsp 88 + +STACK CFI INIT 7e50 9c7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e52 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 7e54 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 7e56 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 7e58 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 7e59 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 7e5a $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 7e5e .cfa: $rsp 72 + +STACK CFI 833b .cfa: $rsp 56 + +STACK CFI 833c .cfa: $rsp 48 + +STACK CFI 833d .cfa: $rsp 40 + +STACK CFI 833f .cfa: $rsp 32 + +STACK CFI 8341 .cfa: $rsp 24 + +STACK CFI 8343 .cfa: $rsp 16 + +STACK CFI 8345 .cfa: $rsp 8 + +STACK CFI 8350 .cfa: $rsp 72 + +STACK CFI INIT 8820 346 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8b70 1561 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8b72 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 8b81 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 8b83 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 8b85 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 8b86 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 8b87 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 8b8b .cfa: $rsp 72 + +STACK CFI 8f48 .cfa: $rsp 56 + +STACK CFI 8f49 .cfa: $rsp 48 + +STACK CFI 8f4a .cfa: $rsp 40 + +STACK CFI 8f4c .cfa: $rsp 32 + +STACK CFI 8f4e .cfa: $rsp 24 + +STACK CFI 8f50 .cfa: $rsp 16 + +STACK CFI 8f52 .cfa: $rsp 8 + +STACK CFI 8f58 .cfa: $rsp 72 + +STACK CFI INIT a0e0 ab .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a190 108 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a2a0 dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a380 ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a470 db .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a550 171 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a6d0 123 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a800 ed .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a8f0 db .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a9d0 1dc .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a9d1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI aa31 .cfa: $rsp 8 + +STACK CFI aa38 .cfa: $rsp 16 + +STACK CFI aa84 .cfa: $rsp 8 + +STACK CFI aa88 .cfa: $rsp 16 + +STACK CFI aa92 .cfa: $rsp 8 + +STACK CFI aa98 .cfa: $rsp 16 + +STACK CFI ab2b .cfa: $rsp 8 + +STACK CFI ab30 .cfa: $rsp 16 + +STACK CFI INIT abb0 18a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ad40 38b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b0d0 35b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b430 16a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b5a0 18a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b730 14b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT b880 4e9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT bd70 528 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c2a0 510 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c2a1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI c457 .cfa: $rsp 8 + +STACK CFI c460 .cfa: $rsp 16 + +STACK CFI INIT c7b0 225 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c7b1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI c8aa .cfa: $rsp 8 + +STACK CFI c8b0 .cfa: $rsp 16 + +STACK CFI c8d6 .cfa: $rsp 8 + +STACK CFI c8e0 .cfa: $rsp 16 + +STACK CFI c91c .cfa: $rsp 8 + +STACK CFI c921 .cfa: $rsp 16 + +STACK CFI c937 .cfa: $rsp 8 + +STACK CFI c940 .cfa: $rsp 16 + +STACK CFI c956 .cfa: $rsp 8 + +STACK CFI c960 .cfa: $rsp 16 + +STACK CFI c9c5 .cfa: $rsp 8 + +STACK CFI c9c6 .cfa: $rsp 16 + +STACK CFI INIT c9e0 1f8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c9e1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI cace .cfa: $rsp 8 + +STACK CFI cad0 .cfa: $rsp 16 + +STACK CFI cae4 .cfa: $rsp 8 + +STACK CFI cae8 .cfa: $rsp 16 + +STACK CFI cb13 .cfa: $rsp 8 + +STACK CFI cb18 .cfa: $rsp 16 + +STACK CFI cb4d .cfa: $rsp 8 + +STACK CFI cb4e .cfa: $rsp 16 + +STACK CFI cb64 .cfa: $rsp 8 + +STACK CFI cb68 .cfa: $rsp 16 + +STACK CFI cbc9 .cfa: $rsp 8 + +STACK CFI cbca .cfa: $rsp 16 + +STACK CFI INIT cbe0 152 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT cd40 679 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cd42 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI cd43 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI cd44 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI cd4b .cfa: $rsp 160 + +STACK CFI ce4e .cfa: $rsp 32 + +STACK CFI ce4f .cfa: $rsp 24 + +STACK CFI ce50 .cfa: $rsp 16 + +STACK CFI ce52 .cfa: $rsp 8 + +STACK CFI ce58 .cfa: $rsp 160 + +STACK CFI INIT d3c0 66a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d3ca $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI d3de $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ .cfa: $rsp 240 + +STACK CFI d4d4 .cfa: $rsp 8 + +STACK CFI d4d5 .cfa: $rsp 240 + +STACK CFI INIT da30 97 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI da31 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI da3d $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI da45 .cfa: $rsp 64 + +STACK CFI dac4 .cfa: $rsp 24 + +STACK CFI dac5 .cfa: $rsp 16 + +STACK CFI dac6 .cfa: $rsp 8 + +STACK CFI INIT dad0 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dae0 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db30 13c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db3a $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI db45 $rbp: .cfa -24 + ^ .cfa: $rsp 64 + +STACK CFI dbbf .cfa: $rsp 8 + +STACK CFI dbc0 .cfa: $rsp 64 + +STACK CFI INIT dc70 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dcf0 162 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dcf2 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI dcf6 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI dcfa $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI dcfe .cfa: $rsp 48 + +STACK CFI ddd6 .cfa: $rsp 32 + +STACK CFI ddd7 .cfa: $rsp 24 + +STACK CFI ddd8 .cfa: $rsp 16 + +STACK CFI ddda .cfa: $rsp 8 + +STACK CFI dde0 .cfa: $rsp 48 + +STACK CFI de07 .cfa: $rsp 32 + +STACK CFI de08 .cfa: $rsp 24 + +STACK CFI de09 .cfa: $rsp 16 + +STACK CFI de0b .cfa: $rsp 8 + +STACK CFI de0c .cfa: $rsp 48 + +STACK CFI de4d .cfa: $rsp 32 + +STACK CFI de4e .cfa: $rsp 24 + +STACK CFI de4f .cfa: $rsp 16 + +STACK CFI de51 .cfa: $rsp 8 + +STACK CFI INIT de60 48 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de64 .cfa: $rsp 16 + +STACK CFI de9e .cfa: $rsp 8 + +STACK CFI dea0 .cfa: $rsp 16 + +STACK CFI dea7 .cfa: $rsp 8 + +STACK CFI INIT deb0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dec0 50 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dec4 .cfa: $rsp 16 + +STACK CFI df02 .cfa: $rsp 8 + +STACK CFI df08 .cfa: $rsp 16 + +STACK CFI df0f .cfa: $rsp 8 + +STACK CFI INIT df10 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT df20 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT df40 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT df50 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT df60 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT df70 24 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI df74 .cfa: $rsp 48 + +STACK CFI df8e .cfa: $rsp 8 + +STACK CFI df90 .cfa: $rsp 48 + +STACK CFI INIT dfa0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dfb0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT dfc0 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI dfc4 .cfa: $rsp 16 + +STACK CFI dffa .cfa: $rsp 8 + +STACK CFI e000 .cfa: $rsp 16 + +STACK CFI e017 .cfa: $rsp 8 + +STACK CFI e020 .cfa: $rsp 16 + +STACK CFI e027 .cfa: $rsp 8 + +STACK CFI e030 .cfa: $rsp 16 + +STACK CFI e037 .cfa: $rsp 8 + +STACK CFI INIT e040 6c6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e042 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e047 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e049 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e04b $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI e04f $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI e050 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI e057 .cfa: $rsp 608 + +STACK CFI e0eb .cfa: $rsp 56 + +STACK CFI e0ef .cfa: $rsp 48 + +STACK CFI e0f0 .cfa: $rsp 40 + +STACK CFI e0f2 .cfa: $rsp 32 + +STACK CFI e0f4 .cfa: $rsp 24 + +STACK CFI e0f6 .cfa: $rsp 16 + +STACK CFI e0f8 .cfa: $rsp 8 + +STACK CFI e100 .cfa: $rsp 608 + +STACK CFI INIT e710 3a6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e712 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e719 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e71e $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e720 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI e721 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI e722 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI e729 .cfa: $rsp 368 + +STACK CFI e8d0 .cfa: $rsp 56 + +STACK CFI e8d1 .cfa: $rsp 48 + +STACK CFI e8d2 .cfa: $rsp 40 + +STACK CFI e8d4 .cfa: $rsp 32 + +STACK CFI e8d6 .cfa: $rsp 24 + +STACK CFI e8d8 .cfa: $rsp 16 + +STACK CFI e8da .cfa: $rsp 8 + +STACK CFI e8e0 .cfa: $rsp 368 + +STACK CFI INIT eac0 a2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eaca $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI ead1 .cfa: $rsp 32 + +STACK CFI eb40 .cfa: $rsp 8 + +STACK CFI eb48 .cfa: $rsp 32 + +STACK CFI eb61 .cfa: $rsp 8 + +STACK CFI INIT eb70 85e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eb71 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI eb77 .cfa: $rbp 16 + +STACK CFI eb79 $r15: .cfa -24 + ^ +STACK CFI eb82 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI eb8a $rbx: .cfa -56 + ^ +STACK CFI ec4c .cfa: $rsp 8 + +STACK CFI ec50 .cfa: $rbp 16 + +STACK CFI INIT f3d0 64f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3d2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI f3d9 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI f3db $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI f3e3 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI f3e4 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI f3e8 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI f3ec .cfa: $rsp 96 + +STACK CFI f619 .cfa: $rsp 56 + +STACK CFI f61a .cfa: $rsp 48 + +STACK CFI f61b .cfa: $rsp 40 + +STACK CFI f61d .cfa: $rsp 32 + +STACK CFI f61f .cfa: $rsp 24 + +STACK CFI f621 .cfa: $rsp 16 + +STACK CFI f623 .cfa: $rsp 8 + +STACK CFI f628 .cfa: $rsp 96 + +STACK CFI f710 .cfa: $rsp 56 + +STACK CFI f713 .cfa: $rsp 48 + +STACK CFI f714 .cfa: $rsp 40 + +STACK CFI f716 .cfa: $rsp 32 + +STACK CFI f718 .cfa: $rsp 24 + +STACK CFI f71a .cfa: $rsp 16 + +STACK CFI f71c .cfa: $rsp 8 + +STACK CFI f71d .cfa: $rsp 96 + +STACK CFI f91d .cfa: $rsp 56 + +STACK CFI f923 .cfa: $rsp 48 + +STACK CFI f924 .cfa: $rsp 40 + +STACK CFI f926 .cfa: $rsp 32 + +STACK CFI f928 .cfa: $rsp 24 + +STACK CFI f92a .cfa: $rsp 16 + +STACK CFI f92c .cfa: $rsp 8 + +STACK CFI f92d .cfa: $rsp 96 + +STACK CFI INIT fa20 20a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fa22 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI fa2c $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI fa30 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI fa3a .cfa: $rsp 432 + +STACK CFI fbde .cfa: $rsp 32 + +STACK CFI fbdf .cfa: $rsp 24 + +STACK CFI fbe0 .cfa: $rsp 16 + +STACK CFI fbe2 .cfa: $rsp 8 + +STACK CFI fbe8 .cfa: $rsp 432 + +STACK CFI INIT fc30 ea .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fc32 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI fc34 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI fc36 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI fc3a $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI fc3e $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI fc45 .cfa: $rsp 432 + +STACK CFI fcfc .cfa: $rsp 48 + +STACK CFI fcff .cfa: $rsp 40 + +STACK CFI fd00 .cfa: $rsp 32 + +STACK CFI fd02 .cfa: $rsp 24 + +STACK CFI fd04 .cfa: $rsp 16 + +STACK CFI fd06 .cfa: $rsp 8 + +STACK CFI fd10 .cfa: $rsp 432 + +STACK CFI INIT fd20 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fd22 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI fd24 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI fd28 $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI fd29 $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI fd33 .cfa: $rsp 432 + +STACK CFI fdb7 .cfa: $rsp 40 + +STACK CFI fdb8 .cfa: $rsp 32 + +STACK CFI fdb9 .cfa: $rsp 24 + +STACK CFI fdbb .cfa: $rsp 16 + +STACK CFI fdbd .cfa: $rsp 8 + +STACK CFI fdbe .cfa: $rsp 432 + +STACK CFI INIT fdd0 110 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fdd1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI fde9 .cfa: $rsp 640 + +STACK CFI fecd .cfa: $rsp 16 + +STACK CFI fed1 .cfa: $rsp 8 + +STACK CFI fed2 .cfa: $rsp 640 + +STACK CFI fedb .cfa: $rsp 16 + +STACK CFI fedf .cfa: $rsp 8 + +STACK CFI INIT fee0 1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fef0 167 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fef1 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI fef4 .cfa: $rbp 16 + +STACK CFI fefe $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI ff07 $r12: .cfa -48 + ^ +STACK CFI ff0e $rbx: .cfa -56 + ^ +STACK CFI ff1e $rax: .cfa -72 + ^ $rdx: .cfa -64 + ^ +STACK CFI ffa5 .cfa: $rsp 8 + +STACK CFI ffb0 .cfa: $rbp 16 + +STACK CFI 10053 $rbp: $rbp .cfa: $rcx 8 + +STACK CFI INIT 10060 e6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10061 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10064 .cfa: $rbp 16 + +STACK CFI 10074 $r12: .cfa -48 + ^ $rax: .cfa -72 + ^ $rbx: .cfa -56 + ^ $rdx: .cfa -64 + ^ +STACK CFI 10083 $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ +STACK CFI 10091 $r15: .cfa -24 + ^ +STACK CFI 100ec .cfa: $rsp 8 + +STACK CFI 100ed .cfa: $rbp 16 + +STACK CFI 10142 $rbp: $rbp .cfa: $rcx 8 + +STACK CFI INIT 10150 d7 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10151 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10154 .cfa: $rbp 16 + +STACK CFI 1015c $rbx: .cfa -56 + ^ $rdx: .cfa -64 + ^ +STACK CFI 10177 $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $rax: .cfa -72 + ^ +STACK CFI 10189 $r15: .cfa -24 + ^ +STACK CFI 10223 $rbp: $rbp .cfa: $rcx 8 + +STACK CFI INIT 10230 f1 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10231 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10234 .cfa: $rbp 16 + +STACK CFI 1023c $rax: .cfa -72 + ^ $rbx: .cfa -56 + ^ +STACK CFI 1025a $r12: .cfa -48 + ^ $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ $rdx: .cfa -64 + ^ +STACK CFI 1027b .cfa: $rsp 8 + +STACK CFI 10280 .cfa: $rbp 16 + +STACK CFI 1031d $rbp: $rbp .cfa: $rcx 8 + +STACK CFI INIT 10330 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10350 99 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10351 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10354 .cfa: $rbp 16 + +STACK CFI 1035a $r13: .cfa -40 + ^ $r14: .cfa -32 + ^ $r15: .cfa -24 + ^ +STACK CFI 10366 $r12: .cfa -48 + ^ +STACK CFI 10375 $rbx: .cfa -56 + ^ +STACK CFI 103e8 .cfa: $rsp 8 + +STACK CFI INIT 103f0 46 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10440 1b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 10460 a3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10462 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10464 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 10469 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 1046e $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 10472 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 10473 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 1047b .cfa: $rsp 80 + +STACK CFI 104cd .cfa: $rsp 56 + +STACK CFI 104ce .cfa: $rsp 48 + +STACK CFI 104cf .cfa: $rsp 40 + +STACK CFI 104d1 .cfa: $rsp 32 + +STACK CFI 104d3 .cfa: $rsp 24 + +STACK CFI 104d5 .cfa: $rsp 16 + +STACK CFI 104d7 .cfa: $rsp 8 + +STACK CFI 104e0 .cfa: $rsp 80 + +STACK CFI INIT 10510 c8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10512 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10518 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 1051a $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 1051f $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 10523 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 10524 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 1052b .cfa: $rsp 80 + +STACK CFI 105cd .cfa: $rsp 56 + +STACK CFI 105ce .cfa: $rsp 48 + +STACK CFI 105cf .cfa: $rsp 40 + +STACK CFI 105d1 .cfa: $rsp 32 + +STACK CFI 105d3 .cfa: $rsp 24 + +STACK CFI 105d5 .cfa: $rsp 16 + +STACK CFI 105d7 .cfa: $rsp 8 + +STACK CFI INIT 105e0 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 105e4 .cfa: $rsp 16 + +STACK CFI 1061e .cfa: $rsp 8 + +STACK CFI 10620 .cfa: $rsp 16 + +STACK CFI 10629 .cfa: $rsp 8 + +STACK CFI 10630 .cfa: $rsp 16 + +STACK CFI 10639 .cfa: $rsp 8 + +STACK CFI 10640 .cfa: $rsp 16 + +STACK CFI 10646 .cfa: $rsp 8 + +STACK CFI INIT 10650 13c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1065a $r12: .cfa -16 + ^ $rbx: .cfa -32 + ^ +STACK CFI 10665 $rbp: .cfa -24 + ^ .cfa: $rsp 64 + +STACK CFI 106df .cfa: $rsp 8 + +STACK CFI 106e0 .cfa: $rsp 64 + +STACK CFI INIT 10790 109 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10791 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10799 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 1079d .cfa: $rsp 48 + +STACK CFI 107c5 .cfa: $rsp 24 + +STACK CFI 107c6 .cfa: $rsp 16 + +STACK CFI 107c7 .cfa: $rsp 8 + +STACK CFI 107d0 .cfa: $rsp 48 + +STACK CFI 10867 .cfa: $rsp 24 + +STACK CFI 10868 .cfa: $rsp 16 + +STACK CFI 10869 .cfa: $rsp 8 + +STACK CFI 10870 .cfa: $rsp 48 + +STACK CFI INIT 108a0 6b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 108a4 .cfa: $rsp 16 + +STACK CFI 108db .cfa: $rsp 8 + +STACK CFI 108e0 .cfa: $rsp 16 + +STACK CFI 108e7 .cfa: $rsp 8 + +STACK CFI 108f0 .cfa: $rsp 16 + +STACK CFI 108f7 .cfa: $rsp 8 + +STACK CFI 10900 .cfa: $rsp 16 + +STACK CFI INIT 10910 178 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10912 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10917 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 10919 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 1091b $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 1091c $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 1091d $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 10921 .cfa: $rsp 112 + +STACK CFI 10a72 .cfa: $rsp 56 + +STACK CFI 10a73 .cfa: $rsp 48 + +STACK CFI 10a74 .cfa: $rsp 40 + +STACK CFI 10a76 .cfa: $rsp 32 + +STACK CFI 10a78 .cfa: $rsp 24 + +STACK CFI 10a7a .cfa: $rsp 16 + +STACK CFI 10a7c .cfa: $rsp 8 + +STACK CFI 10a7d .cfa: $rsp 112 + +STACK CFI INIT 10a90 157 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10a92 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10a9b $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 10a9d $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 10aa5 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 10aaa $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 10aab $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 10ab5 .cfa: $rsp 112 + +STACK CFI 10bdc .cfa: $rsp 56 + +STACK CFI 10bdd .cfa: $rsp 48 + +STACK CFI 10bde .cfa: $rsp 40 + +STACK CFI 10be0 .cfa: $rsp 32 + +STACK CFI 10be2 .cfa: $rsp 24 + +STACK CFI 10be4 .cfa: $rsp 16 + +STACK CFI 10be6 .cfa: $rsp 8 + +STACK CFI INIT 10bf0 b0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10bfa $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 10c07 $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ +STACK CFI 10c13 $r12: .cfa -32 + ^ .cfa: $rsp 64 + +STACK CFI 10c9f .cfa: $rsp 8 + +STACK CFI INIT 10ca0 194 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10ca2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10cac $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 10cb1 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 10cb6 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 10cb7 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 10cbe $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 10cc8 .cfa: $rsp 112 + +STACK CFI 10e1c .cfa: $rsp 56 + +STACK CFI 10e20 .cfa: $rsp 48 + +STACK CFI 10e21 .cfa: $rsp 40 + +STACK CFI 10e23 .cfa: $rsp 32 + +STACK CFI 10e25 .cfa: $rsp 24 + +STACK CFI 10e27 .cfa: $rsp 16 + +STACK CFI 10e29 .cfa: $rsp 8 + +STACK CFI 10e30 .cfa: $rsp 112 + +STACK CFI INIT 10e40 6b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10e44 .cfa: $rsp 16 + +STACK CFI 10e7b .cfa: $rsp 8 + +STACK CFI 10e80 .cfa: $rsp 16 + +STACK CFI 10e87 .cfa: $rsp 8 + +STACK CFI 10e90 .cfa: $rsp 16 + +STACK CFI 10e97 .cfa: $rsp 8 + +STACK CFI 10ea0 .cfa: $rsp 16 + +STACK CFI INIT 10eb0 673 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 10eb2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 10eb4 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 10eb6 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 10eb8 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 10eb9 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 10eba $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 10ec1 .cfa: $rsp 144 + +STACK CFI 10f3e .cfa: $rsp 56 + +STACK CFI 10f42 .cfa: $rsp 48 + +STACK CFI 10f43 .cfa: $rsp 40 + +STACK CFI 10f45 .cfa: $rsp 32 + +STACK CFI 10f47 .cfa: $rsp 24 + +STACK CFI 10f49 .cfa: $rsp 16 + +STACK CFI 10f4b .cfa: $rsp 8 + +STACK CFI 10f50 .cfa: $rsp 144 + +STACK CFI INIT 11530 cf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1153a $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 11547 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI 11553 $r14: .cfa -16 + ^ .cfa: $rsp 64 + +STACK CFI 115fe .cfa: $rsp 8 + +STACK CFI INIT 11600 4b3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11602 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 11604 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 11606 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 11608 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 11609 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 1160a $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 11611 .cfa: $rsp 160 + +STACK CFI 11703 .cfa: $rsp 56 + +STACK CFI 11706 .cfa: $rsp 48 + +STACK CFI 11707 .cfa: $rsp 40 + +STACK CFI 11709 .cfa: $rsp 32 + +STACK CFI 1170b .cfa: $rsp 24 + +STACK CFI 1170d .cfa: $rsp 16 + +STACK CFI 1170f .cfa: $rsp 8 + +STACK CFI 11710 .cfa: $rsp 160 + +STACK CFI INIT 11ac0 8a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11b06 .cfa: $rsp 32 + +STACK CFI 11b32 .cfa: $rsp 8 + +STACK CFI INIT 11b50 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11b60 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11b61 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 11b6b .cfa: $rsp 8 + +STACK CFI 11b70 .cfa: $rsp 16 + +STACK CFI 11b81 .cfa: $rsp 8 + +STACK CFI INIT 11b90 72 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11bab $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 11be9 .cfa: $rsp 8 + +STACK CFI 11bee .cfa: $rsp 16 + +STACK CFI 11bfd .cfa: $rsp 8 + +STACK CFI INIT 11c10 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11c20 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11c21 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 11c35 .cfa: $rsp 8 + +STACK CFI INIT 11c40 113 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11c42 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 11c46 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 11c4a $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 11d03 .cfa: $rsp 24 + +STACK CFI 11d04 .cfa: $rsp 16 + +STACK CFI 11d06 .cfa: $rsp 8 + +STACK CFI 11d10 .cfa: $rsp 32 + +STACK CFI 11d26 .cfa: $rsp 24 + +STACK CFI 11d27 .cfa: $rsp 16 + +STACK CFI 11d29 .cfa: $rsp 8 + +STACK CFI 11d30 .cfa: $rsp 32 + +STACK CFI INIT 11d60 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 11d70 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11d84 .cfa: $rsp 16 + +STACK CFI 11d8d .cfa: $rsp 8 + +STACK CFI INIT 11da0 1f8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11da2 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 11da4 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 11da9 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 11daa $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 11dae $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 11db2 .cfa: $rsp 112 + +STACK CFI 11e7d .cfa: $rsp 48 + +STACK CFI 11e81 .cfa: $rsp 40 + +STACK CFI 11e82 .cfa: $rsp 32 + +STACK CFI 11e84 .cfa: $rsp 24 + +STACK CFI 11e86 .cfa: $rsp 16 + +STACK CFI 11e88 .cfa: $rsp 8 + +STACK CFI 11e89 .cfa: $rsp 112 + +STACK CFI INIT 11fa0 7c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 11fa4 .cfa: $rsp 16 + +STACK CFI 11fda .cfa: $rsp 8 + +STACK CFI 11fe0 .cfa: $rsp 16 + +STACK CFI 11ff7 .cfa: $rsp 8 + +STACK CFI 12000 .cfa: $rsp 16 + +STACK CFI 12007 .cfa: $rsp 8 + +STACK CFI 12010 .cfa: $rsp 16 + +STACK CFI 12017 .cfa: $rsp 8 + +STACK CFI INIT 12020 13c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 12025 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 1207f .cfa: $rsp 8 + +STACK CFI 12080 .cfa: $rsp 16 + +STACK CFI 1215b .cfa: $rsp 8 + +STACK CFI INIT 12160 242 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 12182 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 12187 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 1218c $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 12190 $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 12191 $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 12195 .cfa: $rsp 128 + +STACK CFI 12313 .cfa: $rsp 48 + +STACK CFI 12314 $rbx: $rbx .cfa: $rsp 40 + +STACK CFI 12315 $rbp: $rbp .cfa: $rsp 32 + +STACK CFI 12317 $r12: $r12 .cfa: $rsp 24 + +STACK CFI 12319 $r13: $r13 .cfa: $rsp 16 + +STACK CFI 1231b $r14: $r14 .cfa: $rsp 8 + +STACK CFI 12320 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ .cfa: $rsp 128 + +STACK CFI INIT 123b0 25 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 123c2 .cfa: $rsp 16 + +STACK CFI 123cf .cfa: $rsp 8 + +STACK CFI 123d0 .cfa: $rsp 16 + +STACK CFI INIT 2e70 6e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2e71 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2e72 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 2e76 .cfa: $rsp 32 + +STACK CFI 2edb .cfa: $rsp 24 + +STACK CFI 2edc .cfa: $rsp 16 + +STACK CFI 2edd .cfa: $rsp 8 + +STACK CFI INIT 123e0 40 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 123e2 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 123e3 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 123e7 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 12415 .cfa: $rsp 24 + +STACK CFI 12419 .cfa: $rsp 16 + +STACK CFI 1241b .cfa: $rsp 8 + +STACK CFI INIT 12420 17f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1242a $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI 12440 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ .cfa: $rsp 48 + +STACK CFI 1246f .cfa: $rsp 8 + +STACK CFI 12470 .cfa: $rsp 48 + +STACK CFI INIT 125a0 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ diff --git a/src/processor/testdata/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/linux_inline.new.sym b/src/processor/testdata/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/linux_inline.new.sym new file mode 100644 index 0000000..5cd8320 --- /dev/null +++ b/src/processor/testdata/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/linux_inline.new.sym @@ -0,0 +1,71 @@ +MODULE Linux x86_64 BBA6FA10B8AAB33D00000000000000000 linux_inline +INFO CODE_ID 10FAA6BBAAB83DB3 +FILE 0 linux_inline.cpp +FILE 1 a.cpp +FILE 2 b.cpp +FILE 3 c.cpp +INLINE_ORIGIN 0 bar() +INLINE_ORIGIN 1 foo() +INLINE_ORIGIN 2 func() +FUNC 15b30 6cf 0 main +INLINE 0 42 1 1 15b45 6b1 +INLINE 1 39 2 0 15b72 684 +INLINE 2 32 3 2 15b83 673 +15b30 15 41 0 +15b45 11 36 0 +15b56 a 37 0 +15b60 6 37 0 +15b66 5 38 0 +15b6b 7 0 0 +15b72 11 31 0 +15b83 a 9 0 +15b8d 4 9 0 +15b91 6 9 0 +15b97 7 0 0 +15b9e 11 10 0 +15baf 7 0 0 +15bb6 2e 12 0 +15be4 7 0 0 +15beb 5 12 0 +15bf0 1d 13 0 +15c0d 1d 14 0 +15c2a e 0 0 +15c38 1c 15 0 +15c54 a 16 0 +15c5e 7 0 0 +15c65 2c 16 0 +15c91 15 0 0 +15ca6 a 16 0 +15cb0 87 15 0 +15d37 7 0 0 +15d3e 33 15 0 +15d71 7 0 0 +15d78 24 15 0 +15d9c a 17 0 +15da6 e 0 0 +15db4 a 18 0 +15dbe e 0 0 +15dcc a 19 0 +15dd6 7 0 0 +15ddd a 20 0 +15de7 7 0 0 +15dee 2c 21 0 +15e1a 3c 22 0 +15e56 28 23 0 +15e7e 5a 18 0 +15ed8 d 28 0 +15ee5 11 12 0 +15ef6 67 28 0 +15f5d 2b 15 0 +15f88 7 0 0 +15f8f 8c 15 0 +1601b 7 0 0 +16022 3d 15 0 +1605f 67 28 0 +160c6 54 18 0 +1611a 3c 28 0 +16156 c 12 0 +16162 54 18 0 +161b6 2 27 0 +161b8 3e 28 0 +161f6 9 43 0 \ No newline at end of file diff --git a/src/processor/testdata/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/linux_inline.old.sym b/src/processor/testdata/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/linux_inline.old.sym new file mode 100644 index 0000000..775640f --- /dev/null +++ b/src/processor/testdata/symbols/linux_inline/BBA6FA10B8AAB33D00000000000000000/linux_inline.old.sym @@ -0,0 +1,68 @@ +MODULE Linux x86_64 BBA6FA10B8AAB33D00000000000000000 linux_inline +INFO CODE_ID 10FAA6BBAAB83DB3 +FILE 0 linux_inline.cpp +INLINE_ORIGIN 0 0 bar() +INLINE_ORIGIN 1 0 foo() +INLINE_ORIGIN 2 0 func() +FUNC 15b30 6cf 0 main +INLINE 0 42 1 15b45 6b1 +INLINE 1 39 0 15b72 684 +INLINE 2 32 2 15b83 673 +15b30 15 41 0 +15b45 11 36 0 +15b56 a 37 0 +15b60 6 37 0 +15b66 5 38 0 +15b6b 7 0 0 +15b72 11 31 0 +15b83 a 9 0 +15b8d 4 9 0 +15b91 6 9 0 +15b97 7 0 0 +15b9e 11 10 0 +15baf 7 0 0 +15bb6 2e 12 0 +15be4 7 0 0 +15beb 5 12 0 +15bf0 1d 13 0 +15c0d 1d 14 0 +15c2a e 0 0 +15c38 1c 15 0 +15c54 a 16 0 +15c5e 7 0 0 +15c65 2c 16 0 +15c91 15 0 0 +15ca6 a 16 0 +15cb0 87 15 0 +15d37 7 0 0 +15d3e 33 15 0 +15d71 7 0 0 +15d78 24 15 0 +15d9c a 17 0 +15da6 e 0 0 +15db4 a 18 0 +15dbe e 0 0 +15dcc a 19 0 +15dd6 7 0 0 +15ddd a 20 0 +15de7 7 0 0 +15dee 2c 21 0 +15e1a 3c 22 0 +15e56 28 23 0 +15e7e 5a 18 0 +15ed8 d 28 0 +15ee5 11 12 0 +15ef6 67 28 0 +15f5d 2b 15 0 +15f88 7 0 0 +15f8f 8c 15 0 +1601b 7 0 0 +16022 3d 15 0 +1605f 67 28 0 +160c6 54 18 0 +1611a 3c 28 0 +16156 c 12 0 +16162 54 18 0 +161b6 2 27 0 +161b8 3e 28 0 +161f6 9 43 0 diff --git a/src/processor/testdata/symbols/microdump/breakpad_unittests/D6D1FEC9A15DE7F38A236898871A2E770/breakpad_unittests.sym b/src/processor/testdata/symbols/microdump/breakpad_unittests/D6D1FEC9A15DE7F38A236898871A2E770/breakpad_unittests.sym new file mode 100644 index 0000000..ad38c2e --- /dev/null +++ b/src/processor/testdata/symbols/microdump/breakpad_unittests/D6D1FEC9A15DE7F38A236898871A2E770/breakpad_unittests.sym @@ -0,0 +1,82243 @@ +MODULE Linux arm64 D6D1FEC9A15DE7F38A236898871A2E770 breakpad_unittests +FILE 0 /s/clank/src/out/Release/../../breakpad/src/client/linux/crash_generation/crash_generation_client.cc +FILE 1 /s/clank/src/out/Release/../../breakpad/src/client/linux/dump_writer_common/seccomp_unwinder.cc +FILE 2 /s/clank/src/out/Release/../../breakpad/src/client/linux/dump_writer_common/thread_info.cc +FILE 3 /s/clank/src/out/Release/../../breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc +FILE 4 /s/clank/src/out/Release/../../breakpad/src/client/linux/handler/exception_handler.cc +FILE 5 /s/clank/src/out/Release/../../breakpad/src/client/linux/handler/exception_handler.h +FILE 6 /s/clank/src/out/Release/../../breakpad/src/client/linux/handler/exception_handler_unittest.cc +FILE 7 /s/clank/src/out/Release/../../breakpad/src/client/linux/handler/minidump_descriptor.cc +FILE 8 /s/clank/src/out/Release/../../breakpad/src/client/linux/handler/minidump_descriptor.h +FILE 9 /s/clank/src/out/Release/../../breakpad/src/client/linux/log/log.cc +FILE 10 /s/clank/src/out/Release/../../breakpad/src/client/linux/microdump_writer/microdump_writer.cc +FILE 11 /s/clank/src/out/Release/../../breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc +FILE 12 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/cpu_set.h +FILE 13 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/cpu_set_unittest.cc +FILE 14 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/directory_reader.h +FILE 15 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc +FILE 16 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/line_reader.h +FILE 17 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc +FILE 18 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc +FILE 19 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/linux_core_dumper.h +FILE 20 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc +FILE 21 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/linux_dumper.cc +FILE 22 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/linux_dumper.h +FILE 23 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc +FILE 24 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.h +FILE 25 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc +FILE 26 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/minidump_writer.cc +FILE 27 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc +FILE 28 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc +FILE 29 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader.h +FILE 30 /s/clank/src/out/Release/../../breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc +FILE 31 /s/clank/src/out/Release/../../breakpad/src/client/minidump_file_writer-inl.h +FILE 32 /s/clank/src/out/Release/../../breakpad/src/client/minidump_file_writer.cc +FILE 33 /s/clank/src/out/Release/../../breakpad/src/client/minidump_file_writer.h +FILE 34 /s/clank/src/out/Release/../../breakpad/src/common/android/breakpad_getcontext_unittest.cc +FILE 35 /s/clank/src/out/Release/../../breakpad/src/common/android/testing/mkdtemp.h +FILE 36 /s/clank/src/out/Release/../../breakpad/src/common/android/testing/pthread_fixes.h +FILE 37 /s/clank/src/out/Release/../../breakpad/src/common/convert_UTF.c +FILE 38 /s/clank/src/out/Release/../../breakpad/src/common/linux/elf_core_dump.cc +FILE 39 /s/clank/src/out/Release/../../breakpad/src/common/linux/elf_core_dump_unittest.cc +FILE 40 /s/clank/src/out/Release/../../breakpad/src/common/linux/elfutils-inl.h +FILE 41 /s/clank/src/out/Release/../../breakpad/src/common/linux/elfutils.cc +FILE 42 /s/clank/src/out/Release/../../breakpad/src/common/linux/file_id.cc +FILE 43 /s/clank/src/out/Release/../../breakpad/src/common/linux/file_id_unittest.cc +FILE 44 /s/clank/src/out/Release/../../breakpad/src/common/linux/guid_creator.cc +FILE 45 /s/clank/src/out/Release/../../breakpad/src/common/linux/linux_libc_support.cc +FILE 46 /s/clank/src/out/Release/../../breakpad/src/common/linux/linux_libc_support_unittest.cc +FILE 47 /s/clank/src/out/Release/../../breakpad/src/common/linux/memory_mapped_file.cc +FILE 48 /s/clank/src/out/Release/../../breakpad/src/common/linux/safe_readlink.cc +FILE 49 /s/clank/src/out/Release/../../breakpad/src/common/linux/safe_readlink.h +FILE 50 /s/clank/src/out/Release/../../breakpad/src/common/linux/synth_elf.cc +FILE 51 /s/clank/src/out/Release/../../breakpad/src/common/linux/synth_elf.h +FILE 52 /s/clank/src/out/Release/../../breakpad/src/common/linux/tests/auto_testfile.h +FILE 53 /s/clank/src/out/Release/../../breakpad/src/common/linux/tests/crash_generator.cc +FILE 54 /s/clank/src/out/Release/../../breakpad/src/common/memory.h +FILE 55 /s/clank/src/out/Release/../../breakpad/src/common/memory_range.h +FILE 56 /s/clank/src/out/Release/../../breakpad/src/common/memory_unittest.cc +FILE 57 /s/clank/src/out/Release/../../breakpad/src/common/scoped_ptr.h +FILE 58 /s/clank/src/out/Release/../../breakpad/src/common/simple_string_dictionary.h +FILE 59 /s/clank/src/out/Release/../../breakpad/src/common/simple_string_dictionary_unittest.cc +FILE 60 /s/clank/src/out/Release/../../breakpad/src/common/string_conversion.cc +FILE 61 /s/clank/src/out/Release/../../breakpad/src/common/test_assembler.cc +FILE 62 /s/clank/src/out/Release/../../breakpad/src/common/test_assembler.h +FILE 63 /s/clank/src/out/Release/../../breakpad/src/common/tests/auto_tempdir.h +FILE 64 /s/clank/src/out/Release/../../breakpad/src/common/tests/file_utils.cc +FILE 65 /s/clank/src/out/Release/../../breakpad/src/google_breakpad/processor/minidump.h +FILE 66 /s/clank/src/out/Release/../../breakpad/src/processor/basic_code_module.h +FILE 67 /s/clank/src/out/Release/../../breakpad/src/processor/basic_code_modules.cc +FILE 68 /s/clank/src/out/Release/../../breakpad/src/processor/dump_context.cc +FILE 69 /s/clank/src/out/Release/../../breakpad/src/processor/dump_object.cc +FILE 70 /s/clank/src/out/Release/../../breakpad/src/processor/linked_ptr.h +FILE 71 /s/clank/src/out/Release/../../breakpad/src/processor/logging.cc +FILE 72 /s/clank/src/out/Release/../../breakpad/src/processor/logging.h +FILE 73 /s/clank/src/out/Release/../../breakpad/src/processor/minidump.cc +FILE 74 /s/clank/src/out/Release/../../breakpad/src/processor/pathname_stripper.cc +FILE 75 /s/clank/src/out/Release/../../breakpad/src/processor/range_map-inl.h +FILE 76 /s/clank/src/out/Release/../../breakpad/src/processor/range_map.h +FILE 77 /s/clank/src/out/Release/../../breakpad/src/tools/linux/md2core/minidump_memory_range.h +FILE 78 /s/clank/src/out/Release/../../breakpad/src/tools/linux/md2core/minidump_memory_range_unittest.cc +FILE 79 /s/clank/src/out/Release/../../testing/gtest/include/gtest/gtest-message.h +FILE 80 /s/clank/src/out/Release/../../testing/gtest/include/gtest/gtest-printers.h +FILE 81 /s/clank/src/out/Release/../../testing/gtest/include/gtest/gtest-test-part.h +FILE 82 /s/clank/src/out/Release/../../testing/gtest/include/gtest/gtest.h +FILE 83 /s/clank/src/out/Release/../../testing/gtest/include/gtest/internal/gtest-death-test-internal.h +FILE 84 /s/clank/src/out/Release/../../testing/gtest/include/gtest/internal/gtest-filepath.h +FILE 85 /s/clank/src/out/Release/../../testing/gtest/include/gtest/internal/gtest-internal.h +FILE 86 /s/clank/src/out/Release/../../testing/gtest/include/gtest/internal/gtest-param-util.h +FILE 87 /s/clank/src/out/Release/../../testing/gtest/include/gtest/internal/gtest-port.h +FILE 88 /s/clank/src/out/Release/../../testing/gtest/include/gtest/internal/gtest-type-util.h +FILE 89 /s/clank/src/out/Release/../../testing/gtest/src/gtest-death-test.cc +FILE 90 /s/clank/src/out/Release/../../testing/gtest/src/gtest-filepath.cc +FILE 91 /s/clank/src/out/Release/../../testing/gtest/src/gtest-internal-inl.h +FILE 92 /s/clank/src/out/Release/../../testing/gtest/src/gtest-port.cc +FILE 93 /s/clank/src/out/Release/../../testing/gtest/src/gtest-printers.cc +FILE 94 /s/clank/src/out/Release/../../testing/gtest/src/gtest-test-part.cc +FILE 95 /s/clank/src/out/Release/../../testing/gtest/src/gtest.cc +FILE 96 /s/clank/src/out/Release/../../testing/gtest/src/gtest_main.cc +FILE 97 /s/clank/src/out/Release/../../third_party/lss/linux_syscall_support.h +FILE 98 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_algo.h +FILE 99 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_algobase.c +FILE 100 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_algobase.h +FILE 101 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_alloc.h +FILE 102 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_codecvt.h +FILE 103 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_construct.h +FILE 104 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_fstream.c +FILE 105 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_fstream.h +FILE 106 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_function_base.h +FILE 107 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_iomanip.h +FILE 108 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ios.c +FILE 109 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ios.h +FILE 110 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ios_base.h +FILE 111 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_istream.c +FILE 112 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_istream.h +FILE 113 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_iterator.h +FILE 114 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_iterator_base.h +FILE 115 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_list.c +FILE 116 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_list.h +FILE 117 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_locale.h +FILE 118 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_map.h +FILE 119 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_new.h +FILE 120 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_num_put.h +FILE 121 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ostream.c +FILE 122 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ostream.h +FILE 123 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ostreambuf_iterator.h +FILE 124 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_pair.h +FILE 125 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_relops_cont.h +FILE 126 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_sstream.c +FILE 127 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_sstream.h +FILE 128 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_streambuf.c +FILE 129 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_streambuf.h +FILE 130 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_string.c +FILE 131 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_string.h +FILE 132 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_string_base.h +FILE 133 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_string_io.c +FILE 134 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_string_operators.h +FILE 135 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_tree.c +FILE 136 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_tree.h +FILE 137 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_uninitialized.h +FILE 138 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_vector.c +FILE 139 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_vector.h +FILE 140 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/char_traits.h +FILE 141 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/pointers/_list.h +FILE 142 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/pointers/_set.h +FILE 143 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/pointers/_vector.h +FILE 144 /s/ndk-andrewhsieh/build/toolchain/gcc-4.9/aarch64-linux-android/libgcc/./gthr-default.h +FILE 145 /s/ndk-andrewhsieh/build/toolchain/gcc-4.9/aarch64-linux-android/libgcc/./md-unwind-support.h +FILE 146 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/config/aarch64/sfp-exceptions.c +FILE 147 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/libgcc2.c +FILE 148 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/soft-fp/addtf3.c +FILE 149 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/soft-fp/eqtf2.c +FILE 150 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/soft-fp/floatsitf.c +FILE 151 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/soft-fp/getf2.c +FILE 152 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/soft-fp/multf3.c +FILE 153 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind-dw2-fde-dip.c +FILE 154 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind-dw2-fde.c +FILE 155 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind-dw2-fde.h +FILE 156 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind-dw2.c +FILE 157 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind-pe.h +FILE 158 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind.inc +FILE 159 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/call_unexpected.cc +FILE 160 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/class_type_info.cc +FILE 161 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/cxxabi.cc +FILE 162 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/cxxabi_defines.h +FILE 163 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/delete.cc +FILE 164 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/dwarf_helper.cc +FILE 165 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/dynamic_cast.cc +FILE 166 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/exception.cc +FILE 167 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/fatal_error.cc +FILE 168 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/helper_func_internal.cc +FILE 169 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/new.cc +FILE 170 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/one_time_construction.cc +FILE 171 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/personality.cc +FILE 172 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/si_class_type_info.cc +FILE 173 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/terminate.cc +FILE 174 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/type_info.cc +FILE 175 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/vmi_class_type_info.cc +FILE 176 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/allocators.cpp +FILE 177 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/c_locale_dummy/c_locale_dummy.c +FILE 178 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/codecvt.cpp +FILE 179 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/collate.cpp +FILE 180 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/ctype.cpp +FILE 181 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/details/fstream_unistd.cpp +FILE 182 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/dll_main.cpp +FILE 183 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/fstream.cpp +FILE 184 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/ios.cpp +FILE 185 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/iostream.cpp +FILE 186 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/locale.cpp +FILE 187 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/locale_impl.cpp +FILE 188 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/locale_impl.h +FILE 189 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/messages.cpp +FILE 190 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/monetary.cpp +FILE 191 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/num_get.cpp +FILE 192 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/num_get_float.cpp +FILE 193 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/num_put.cpp +FILE 194 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/num_put_float.cpp +FILE 195 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/numpunct.cpp +FILE 196 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/stdio_streambuf.cpp +FILE 197 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/stdio_streambuf.h +FILE 198 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/time_facets.cpp +FILE 199 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_algo.h +FILE 200 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_algobase.c +FILE 201 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_algobase.h +FILE 202 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_alloc.h +FILE 203 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_auto_ptr.h +FILE 204 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_codecvt.h +FILE 205 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_collate.h +FILE 206 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_construct.h +FILE 207 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ctype.h +FILE 208 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_fstream.c +FILE 209 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_fstream.h +FILE 210 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ios.c +FILE 211 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ios.h +FILE 212 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ios_base.h +FILE 213 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_iostream_string.h +FILE 214 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_istream.h +FILE 215 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_istreambuf_iterator.h +FILE 216 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_iterator.h +FILE 217 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_iterator_base.h +FILE 218 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_limits.c +FILE 219 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_locale.h +FILE 220 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_messages_facets.h +FILE 221 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_monetary.c +FILE 222 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_monetary.h +FILE 223 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_new.h +FILE 224 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_num_get.c +FILE 225 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_num_get.h +FILE 226 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_num_put.c +FILE 227 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_num_put.h +FILE 228 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_numpunct.h +FILE 229 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ostream.c +FILE 230 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ostreambuf_iterator.h +FILE 231 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_pair.h +FILE 232 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_range_errors.c +FILE 233 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_stdexcept.h +FILE 234 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_stdexcept_base.c +FILE 235 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_streambuf.c +FILE 236 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_streambuf.h +FILE 237 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_string.c +FILE 238 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_string.h +FILE 239 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_string_base.h +FILE 240 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_string_operators.h +FILE 241 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_threads.h +FILE 242 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_time_facets.c +FILE 243 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_time_facets.h +FILE 244 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_uninitialized.h +FILE 245 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_vector.c +FILE 246 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_vector.h +FILE 247 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/char_traits.h +FUNC 20570 d8 0 testing::internal::ForkingDeathTest::Wait +20570 4 799 89 +20574 4 806 89 +20578 8 799 89 +20580 10 806 89 +20590 4 806 89 +20594 4 806 89 +20598 10 806 89 +205a8 4 806 89 +205ac 4 806 89 +205b0 10 806 89 +205c0 4 806 89 +205c4 4 806 89 +205c8 10 806 89 +205d8 10 806 89 +205e8 c 806 89 +205f4 4 806 89 +205f8 4 806 89 +205fc 10 806 89 +2060c 4 806 89 +20610 4 806 89 +20614 10 806 89 +20624 4 806 89 +20628 4 806 89 +2062c 14 806 89 +20640 8 806 89 +FUNC 20648 44 0 sys_close +20648 10 2979 97 +20658 14 2979 97 +2066c 4 2979 97 +20670 4 2979 97 +20674 8 2979 97 +2067c 10 2979 97 +FUNC 2068c 16c 0 MinidumpWriter::WriteFile +2068c 10 1101 26 +2069c 4 1102 26 +206a0 c 1101 26 +206ac 4 1101 26 +206b0 8 1102 26 +206b8 4 1103 26 +206bc 8 1104 26 +206c4 4 100 22 +206c8 4 772 26 +206cc 4 1118 26 +206d0 4 1122 26 +206d4 c 772 26 +206e0 4 1115 26 +206e4 8 1116 26 +206ec 18 1122 26 +20704 8 1123 26 +2070c 4 1123 26 +20710 10 1123 26 +20720 8 1125 26 +20728 8 1137 26 +20730 4 1139 26 +20734 4 1142 26 +20738 8 161 33 +20740 4 1143 26 +20744 8 161 33 +2074c 4 1143 26 +20750 4 161 33 +20754 10 1143 26 +20764 8 1150 26 +2076c 10 1155 26 +2077c 8 1156 26 +20784 4 1145 26 +20788 4 1145 26 +2078c 8 176 33 +20794 8 1158 26 +2079c 4 1159 26 +207a0 4 1129 26 +207a4 4 1128 26 +207a8 8 1129 26 +207b0 8 1130 26 +207b8 4 100 22 +207bc c 772 26 +207c8 4 1131 26 +207cc 8 1133 26 +207d4 8 1134 26 +207dc 1c 1160 26 +FUNC 207f8 5c 0 MinidumpWriter::WriteProcFile +207f8 10 1212 26 +20808 8 1212 26 +20810 20 1215 26 +20830 14 1217 26 +20844 10 1218 26 +FUNC 20854 1c 0 std::allocator::deallocate +20854 4 319 202 +20858 4 323 202 +2085c 8 161 202 +20864 4 135 223 +20868 4 161 202 +2086c 4 325 202 +FUNC 20870 14 0 std::priv::_String_base >::_M_throw_length_error +20870 4 599 237 +20874 4 600 237 +20878 4 599 237 +2087c 4 600 237 +20880 4 600 237 +FUNC 20884 14 0 std::priv::_String_base >::_M_throw_length_error +20884 4 599 237 +20888 4 600 237 +2088c 4 599 237 +20890 4 600 237 +20894 4 600 237 +FUNC 20898 1c 0 std::allocator::deallocate +20898 4 319 202 +2089c 4 323 202 +208a0 8 161 202 +208a8 4 135 223 +208ac 4 161 202 +208b0 4 325 202 +FUNC 208b4 28 0 __cxxabiv1::::terminate_helper +208b4 8 116 159 +208bc 4 118 159 +208c0 4 119 159 +208c4 4 120 159 +208c8 8 121 159 +208d0 c 120 159 +FUNC 208dc 18 0 std::allocator::deallocate +208dc 4 319 202 +208e0 8 161 202 +208e8 4 135 223 +208ec 4 161 202 +208f0 4 325 202 +FUNC 208f4 858 0 _GLOBAL__sub_I__ZN40ExceptionHandlerTest_SimpleWithPath_Test10test_info_E +208f4 10 1191 6 +20904 8 160 6 +2090c 4 160 6 +20910 8 160 6 +20918 4 160 6 +2091c 4 160 6 +20920 4 484 85 +20924 14 160 6 +20938 4 484 85 +2093c 4 160 6 +20940 8 160 6 +20948 8 484 85 +20950 14 160 6 +20964 8 160 6 +2096c 8 170 6 +20974 c 170 6 +20980 4 484 85 +20984 14 170 6 +20998 c 484 85 +209a4 10 170 6 +209b4 8 170 6 +209bc 8 253 6 +209c4 c 253 6 +209d0 4 484 85 +209d4 14 253 6 +209e8 c 484 85 +209f4 10 253 6 +20a04 8 253 6 +20a0c 8 257 6 +20a14 c 257 6 +20a20 4 484 85 +20a24 14 257 6 +20a38 c 484 85 +20a44 10 257 6 +20a54 8 257 6 +20a5c 8 315 6 +20a64 c 315 6 +20a70 4 484 85 +20a74 14 315 6 +20a88 c 484 85 +20a94 10 315 6 +20aa4 8 315 6 +20aac 8 327 6 +20ab4 c 327 6 +20ac0 4 484 85 +20ac4 14 327 6 +20ad8 c 484 85 +20ae4 10 327 6 +20af4 8 327 6 +20afc 8 339 6 +20b04 c 339 6 +20b10 4 484 85 +20b14 14 339 6 +20b28 c 484 85 +20b34 10 339 6 +20b44 8 339 6 +20b4c 8 351 6 +20b54 c 351 6 +20b60 4 484 85 +20b64 14 351 6 +20b78 c 484 85 +20b84 10 351 6 +20b94 8 351 6 +20b9c 8 363 6 +20ba4 c 363 6 +20bb0 4 484 85 +20bb4 14 363 6 +20bc8 c 484 85 +20bd4 10 363 6 +20be4 8 363 6 +20bec 8 380 6 +20bf4 c 380 6 +20c00 4 484 85 +20c04 14 380 6 +20c18 c 484 85 +20c24 10 380 6 +20c34 8 380 6 +20c3c 8 409 6 +20c44 c 409 6 +20c50 4 484 85 +20c54 14 409 6 +20c68 c 484 85 +20c74 10 409 6 +20c84 8 409 6 +20c8c 8 425 6 +20c94 c 425 6 +20ca0 4 484 85 +20ca4 14 425 6 +20cb8 c 484 85 +20cc4 10 425 6 +20cd4 8 425 6 +20cdc 8 441 6 +20ce4 c 441 6 +20cf0 4 484 85 +20cf4 14 441 6 +20d08 c 484 85 +20d14 10 441 6 +20d24 8 441 6 +20d2c 8 457 6 +20d34 c 457 6 +20d40 4 484 85 +20d44 14 457 6 +20d58 c 484 85 +20d64 10 457 6 +20d74 8 457 6 +20d7c 8 487 6 +20d84 c 487 6 +20d90 4 484 85 +20d94 14 487 6 +20da8 c 484 85 +20db4 10 487 6 +20dc4 8 487 6 +20dcc 8 579 6 +20dd4 c 579 6 +20de0 4 484 85 +20de4 14 579 6 +20df8 c 484 85 +20e04 10 579 6 +20e14 8 579 6 +20e1c 8 667 6 +20e24 c 667 6 +20e30 4 484 85 +20e34 14 667 6 +20e48 c 484 85 +20e54 10 667 6 +20e64 8 667 6 +20e6c 8 760 6 +20e74 c 760 6 +20e80 4 484 85 +20e84 14 760 6 +20e98 c 484 85 +20ea4 10 760 6 +20eb4 8 760 6 +20ebc 8 806 6 +20ec4 c 806 6 +20ed0 4 484 85 +20ed4 14 806 6 +20ee8 c 484 85 +20ef4 10 806 6 +20f04 8 806 6 +20f0c 8 926 6 +20f14 c 926 6 +20f20 4 484 85 +20f24 14 926 6 +20f38 c 484 85 +20f44 10 926 6 +20f54 8 926 6 +20f5c 8 1000 6 +20f64 c 1000 6 +20f70 4 484 85 +20f74 14 1000 6 +20f88 c 484 85 +20f94 10 1000 6 +20fa4 8 1000 6 +20fac 8 1019 6 +20fb4 c 1019 6 +20fc0 4 484 85 +20fc4 14 1019 6 +20fd8 c 484 85 +20fe4 10 1019 6 +20ff4 8 1019 6 +20ffc 8 1036 6 +21004 c 1036 6 +21010 4 484 85 +21014 14 1036 6 +21028 c 484 85 +21034 10 1036 6 +21044 8 1036 6 +2104c 8 1068 6 +21054 c 1068 6 +21060 4 484 85 +21064 14 1068 6 +21078 c 484 85 +21084 10 1068 6 +21094 8 1068 6 +2109c 8 1112 6 +210a4 c 1112 6 +210b0 4 484 85 +210b4 14 1112 6 +210c8 c 484 85 +210d4 10 1112 6 +210e4 8 1112 6 +210ec 8 1154 6 +210f4 c 1154 6 +21100 4 484 85 +21104 14 1154 6 +21118 c 484 85 +21124 10 1154 6 +21134 4 1191 6 +21138 4 1154 6 +2113c 8 1191 6 +21144 4 1154 6 +21148 4 1191 6 +FUNC 2114c 6c 0 _GLOBAL__sub_I_microdump_writer_unittest.cc +2114c 8 132 11 +21154 8 56 11 +2115c c 56 11 +21168 4 484 85 +2116c 4 56 11 +21170 4 484 85 +21174 4 56 11 +21178 4 484 85 +2117c 4 56 11 +21180 4 484 85 +21184 24 56 11 +211a8 4 56 11 +211ac 4 132 11 +211b0 4 56 11 +211b4 4 132 11 +FUNC 211b8 358 0 _GLOBAL__sub_I__ZN26CpuSetTest_EmptyCount_Test10test_info_E +211b8 10 163 13 +211c8 8 58 13 +211d0 4 58 13 +211d4 8 58 13 +211dc 4 58 13 +211e0 4 58 13 +211e4 4 484 85 +211e8 14 58 13 +211fc 4 484 85 +21200 4 58 13 +21204 8 58 13 +2120c 8 484 85 +21214 14 58 13 +21228 8 58 13 +21230 8 63 13 +21238 c 63 13 +21244 4 484 85 +21248 14 63 13 +2125c c 484 85 +21268 10 63 13 +21278 8 63 13 +21280 8 72 13 +21288 c 72 13 +21294 4 484 85 +21298 14 72 13 +212ac c 484 85 +212b8 10 72 13 +212c8 8 72 13 +212d0 8 81 13 +212d8 c 81 13 +212e4 4 484 85 +212e8 14 81 13 +212fc c 484 85 +21308 10 81 13 +21318 8 81 13 +21320 8 90 13 +21328 c 90 13 +21334 4 484 85 +21338 14 90 13 +2134c c 484 85 +21358 10 90 13 +21368 8 90 13 +21370 8 99 13 +21378 c 99 13 +21384 4 484 85 +21388 14 99 13 +2139c c 484 85 +213a8 10 99 13 +213b8 8 99 13 +213c0 8 108 13 +213c8 c 108 13 +213d4 4 484 85 +213d8 14 108 13 +213ec c 484 85 +213f8 10 108 13 +21408 8 108 13 +21410 8 117 13 +21418 c 117 13 +21424 4 484 85 +21428 14 117 13 +2143c c 484 85 +21448 10 117 13 +21458 8 117 13 +21460 8 135 13 +21468 c 135 13 +21474 4 484 85 +21478 14 135 13 +2148c c 484 85 +21498 10 135 13 +214a8 8 135 13 +214b0 8 146 13 +214b8 c 146 13 +214c4 4 484 85 +214c8 14 146 13 +214dc c 484 85 +214e8 10 146 13 +214f8 4 163 13 +214fc 4 146 13 +21500 8 163 13 +21508 4 146 13 +2150c 4 163 13 +FUNC 21510 6c 0 _GLOBAL__sub_I__ZN39DirectoryReaderTest_CompareResults_Test10test_info_E +21510 8 78 15 +21518 8 47 15 +21520 c 47 15 +2152c 4 484 85 +21530 14 47 15 +21544 4 484 85 +21548 8 47 15 +21550 8 484 85 +21558 14 47 15 +2156c 4 47 15 +21570 4 78 15 +21574 4 47 15 +21578 4 78 15 +FUNC 2157c 268 0 _GLOBAL__sub_I__ZN29LineReaderTest_EmptyFile_Test10test_info_E +2157c 10 169 17 +2158c 8 57 17 +21594 4 57 17 +21598 8 57 17 +215a0 4 57 17 +215a4 4 57 17 +215a8 4 484 85 +215ac 14 57 17 +215c0 4 484 85 +215c4 4 57 17 +215c8 8 57 17 +215d0 8 484 85 +215d8 14 57 17 +215ec 8 57 17 +215f4 8 67 17 +215fc c 67 17 +21608 4 484 85 +2160c 14 67 17 +21620 c 484 85 +2162c 10 67 17 +2163c 8 67 17 +21644 8 83 17 +2164c c 83 17 +21658 4 484 85 +2165c 14 83 17 +21670 c 484 85 +2167c 10 83 17 +2168c 8 83 17 +21694 8 99 17 +2169c c 99 17 +216a8 4 484 85 +216ac 14 99 17 +216c0 c 484 85 +216cc 10 99 17 +216dc 8 99 17 +216e4 8 121 17 +216ec c 121 17 +216f8 4 484 85 +216fc 14 121 17 +21710 c 484 85 +2171c 10 121 17 +2172c 8 121 17 +21734 8 143 17 +2173c c 143 17 +21748 4 484 85 +2174c 14 143 17 +21760 c 484 85 +2176c 10 143 17 +2177c 8 143 17 +21784 8 158 17 +2178c c 158 17 +21798 4 484 85 +2179c 14 158 17 +217b0 c 484 85 +217bc 10 158 17 +217cc 4 169 17 +217d0 4 158 17 +217d4 8 169 17 +217dc 4 158 17 +217e0 4 169 17 +FUNC 217e4 d8 0 _GLOBAL__sub_I__ZN38LinuxCoreDumperTest_BuildProcPath_Test10test_info_E +217e4 10 118 20 +217f4 8 42 20 +217fc 4 42 20 +21800 8 42 20 +21808 4 42 20 +2180c 4 42 20 +21810 4 484 85 +21814 14 42 20 +21828 4 484 85 +2182c 4 42 20 +21830 8 42 20 +21838 8 484 85 +21840 14 42 20 +21854 8 42 20 +2185c 8 65 20 +21864 c 65 20 +21870 4 484 85 +21874 14 65 20 +21888 c 484 85 +21894 10 65 20 +218a4 4 118 20 +218a8 4 65 20 +218ac 8 118 20 +218b4 4 65 20 +218b8 4 118 20 +FUNC 218bc 2dc 0 _GLOBAL__sub_I__ZN37LinuxPtraceDumperChildTest_Setup_Test10test_info_E +218bc 4 463 25 +218c0 4 121 25 +218c4 c 463 25 +218d0 4 121 25 +218d4 4 121 25 +218d8 4 484 85 +218dc 14 121 25 +218f0 4 484 85 +218f4 c 121 25 +21900 8 484 85 +21908 4 121 25 +2190c 4 121 25 +21910 1c 121 25 +2192c 8 121 25 +21934 c 125 25 +21940 4 484 85 +21944 14 125 25 +21958 c 484 85 +21964 10 125 25 +21974 8 125 25 +2197c c 134 25 +21988 4 484 85 +2198c 14 134 25 +219a0 c 484 85 +219ac 10 134 25 +219bc 8 134 25 +219c4 c 226 25 +219d0 4 484 85 +219d4 14 226 25 +219e8 c 484 85 +219f4 18 226 25 +21a0c 8 226 25 +21a14 c 246 25 +21a20 4 484 85 +21a24 14 246 25 +21a38 c 484 85 +21a44 10 246 25 +21a54 8 246 25 +21a5c c 271 25 +21a68 4 484 85 +21a6c 14 271 25 +21a80 c 484 85 +21a8c 10 271 25 +21a9c 8 271 25 +21aa4 c 295 25 +21ab0 4 484 85 +21ab4 14 295 25 +21ac8 c 484 85 +21ad4 10 295 25 +21ae4 8 295 25 +21aec c 325 25 +21af8 4 484 85 +21afc 14 325 25 +21b10 c 484 85 +21b1c 10 325 25 +21b2c 8 325 25 +21b34 8 364 25 +21b3c c 364 25 +21b48 4 484 85 +21b4c 14 364 25 +21b60 c 484 85 +21b6c 14 364 25 +21b80 4 364 25 +21b84 8 463 25 +21b8c 4 364 25 +21b90 8 463 25 +FUNC 21b98 2b8 0 _GLOBAL__sub_I_minidump_writer_unittest.cc +21b98 10 756 27 +21ba8 8 67 27 +21bb0 4 67 27 +21bb4 8 67 27 +21bbc 4 67 27 +21bc0 4 67 27 +21bc4 4 484 85 +21bc8 4 67 27 +21bcc 4 484 85 +21bd0 4 67 27 +21bd4 4 484 85 +21bd8 c 67 27 +21be4 4 484 85 +21be8 4 67 27 +21bec 4 67 27 +21bf0 18 67 27 +21c08 8 67 27 +21c10 8 96 27 +21c18 c 96 27 +21c24 4 484 85 +21c28 4 96 27 +21c2c 4 484 85 +21c30 4 96 27 +21c34 8 484 85 +21c3c 1c 96 27 +21c58 8 96 27 +21c60 8 128 27 +21c68 c 128 27 +21c74 4 484 85 +21c78 4 128 27 +21c7c 4 484 85 +21c80 4 128 27 +21c84 8 484 85 +21c8c 1c 128 27 +21ca8 8 128 27 +21cb0 8 236 27 +21cb8 c 236 27 +21cc4 4 484 85 +21cc8 4 236 27 +21ccc 4 484 85 +21cd0 4 236 27 +21cd4 8 484 85 +21cdc 1c 236 27 +21cf8 8 236 27 +21d00 8 338 27 +21d08 c 338 27 +21d14 4 484 85 +21d18 4 338 27 +21d1c 4 484 85 +21d20 4 338 27 +21d24 8 484 85 +21d2c 1c 338 27 +21d48 8 338 27 +21d50 8 432 27 +21d58 c 432 27 +21d64 4 484 85 +21d68 4 432 27 +21d6c 4 484 85 +21d70 4 432 27 +21d74 8 484 85 +21d7c 1c 432 27 +21d98 8 432 27 +21da0 8 504 27 +21da8 c 504 27 +21db4 4 484 85 +21db8 4 504 27 +21dbc 4 484 85 +21dc0 4 504 27 +21dc4 8 484 85 +21dcc 1c 504 27 +21de8 8 504 27 +21df0 8 583 27 +21df8 c 583 27 +21e04 4 484 85 +21e08 4 583 27 +21e0c 4 484 85 +21e10 4 583 27 +21e14 8 484 85 +21e1c 1c 583 27 +21e38 4 756 27 +21e3c 4 583 27 +21e40 8 756 27 +21e48 4 583 27 +21e4c 4 756 27 +FUNC 21e50 358 0 _GLOBAL__sub_I__ZN36ProcCpuInfoReaderTest_EmptyFile_Test10test_info_E +21e50 10 199 30 +21e60 8 63 30 +21e68 4 63 30 +21e6c 8 63 30 +21e74 4 63 30 +21e78 4 63 30 +21e7c 4 484 85 +21e80 14 63 30 +21e94 4 484 85 +21e98 4 63 30 +21e9c 8 63 30 +21ea4 8 484 85 +21eac 14 63 30 +21ec0 8 63 30 +21ec8 8 72 30 +21ed0 c 72 30 +21edc 4 484 85 +21ee0 14 72 30 +21ef4 c 484 85 +21f00 10 72 30 +21f10 8 72 30 +21f18 8 85 30 +21f20 c 85 30 +21f2c 4 484 85 +21f30 14 85 30 +21f44 c 484 85 +21f50 10 85 30 +21f60 8 85 30 +21f68 8 100 30 +21f70 c 100 30 +21f7c 4 484 85 +21f80 14 100 30 +21f94 c 484 85 +21fa0 10 100 30 +21fb0 8 100 30 +21fb8 8 117 30 +21fc0 c 117 30 +21fcc 4 484 85 +21fd0 14 117 30 +21fe4 c 484 85 +21ff0 10 117 30 +22000 8 117 30 +22008 8 130 30 +22010 c 130 30 +2201c 4 484 85 +22020 14 130 30 +22034 c 484 85 +22040 10 130 30 +22050 8 130 30 +22058 8 143 30 +22060 c 143 30 +2206c 4 484 85 +22070 14 143 30 +22084 c 484 85 +22090 10 143 30 +220a0 8 143 30 +220a8 8 156 30 +220b0 c 156 30 +220bc 4 484 85 +220c0 14 156 30 +220d4 c 484 85 +220e0 10 156 30 +220f0 8 156 30 +220f8 8 173 30 +22100 c 173 30 +2210c 4 484 85 +22110 14 173 30 +22124 c 484 85 +22130 10 173 30 +22140 8 173 30 +22148 8 186 30 +22150 c 186 30 +2215c 4 484 85 +22160 14 186 30 +22174 c 484 85 +22180 10 186 30 +22190 4 199 30 +22194 4 186 30 +22198 8 199 30 +221a0 4 186 30 +221a4 4 199 30 +FUNC 221a8 128 0 _GLOBAL__sub_I__ZN39ElfCoreDumpTest_DefaultConstructor_Test10test_info_E +221a8 10 256 39 +221b8 8 52 39 +221c0 4 52 39 +221c4 8 52 39 +221cc 4 52 39 +221d0 4 52 39 +221d4 4 484 85 +221d8 14 52 39 +221ec 4 484 85 +221f0 4 52 39 +221f4 8 52 39 +221fc 8 484 85 +22204 14 52 39 +22218 8 52 39 +22220 8 62 39 +22228 c 62 39 +22234 4 484 85 +22238 14 62 39 +2224c c 484 85 +22258 10 62 39 +22268 8 62 39 +22270 8 130 39 +22278 c 130 39 +22284 4 484 85 +22288 14 130 39 +2229c c 484 85 +222a8 10 130 39 +222b8 4 256 39 +222bc 4 130 39 +222c0 8 256 39 +222c8 4 130 39 +222cc 4 256 39 +FUNC 222d0 a8 0 _GLOBAL__sub_I_gtest_FileIDTest_ElfClass_registered_ +222d0 4 263 43 +222d4 8 127 43 +222dc 8 263 43 +222e4 24 127 43 +22308 c 151 43 +22314 4 127 43 +22318 10 151 43 +22328 c 183 43 +22334 4 151 43 +22338 10 183 43 +22348 c 220 43 +22354 4 183 43 +22358 10 220 43 +22368 8 263 43 +22370 4 220 43 +22374 4 263 43 +FUNC 22378 358 0 _GLOBAL__sub_I__ZN32LinuxLibcSupportTest_strlen_Test10test_info_E +22378 10 213 46 +22388 8 37 46 +22390 4 37 46 +22394 8 37 46 +2239c 4 37 46 +223a0 4 37 46 +223a4 4 484 85 +223a8 14 37 46 +223bc 4 484 85 +223c0 4 37 46 +223c4 8 37 46 +223cc 8 484 85 +223d4 14 37 46 +223e8 8 37 46 +223f0 8 46 46 +223f8 c 46 46 +22404 4 484 85 +22408 14 46 46 +2241c c 484 85 +22428 10 46 46 +22438 8 46 46 +22440 8 71 46 +22448 c 71 46 +22454 4 484 85 +22458 14 71 46 +2246c c 484 85 +22478 10 71 46 +22488 8 71 46 +22490 8 92 46 +22498 c 92 46 +224a4 4 484 85 +224a8 14 92 46 +224bc c 484 85 +224c8 10 92 46 +224d8 8 92 46 +224e0 8 106 46 +224e8 c 106 46 +224f4 4 484 85 +224f8 14 106 46 +2250c c 484 85 +22518 10 106 46 +22528 8 106 46 +22530 8 129 46 +22538 c 129 46 +22544 4 484 85 +22548 14 129 46 +2255c c 484 85 +22568 10 129 46 +22578 8 129 46 +22580 8 143 46 +22588 c 143 46 +22594 4 484 85 +22598 14 143 46 +225ac c 484 85 +225b8 10 143 46 +225c8 8 143 46 +225d0 8 157 46 +225d8 c 157 46 +225e4 4 484 85 +225e8 14 157 46 +225fc c 484 85 +22608 10 157 46 +22618 8 157 46 +22620 8 169 46 +22628 c 169 46 +22634 4 484 85 +22638 14 169 46 +2264c c 484 85 +22658 10 169 46 +22668 8 169 46 +22670 8 194 46 +22678 c 194 46 +22684 4 484 85 +22688 14 194 46 +2269c c 484 85 +226a8 10 194 46 +226b8 4 213 46 +226bc 4 194 46 +226c0 8 213 46 +226c8 4 194 46 +226cc 4 213 46 +FUNC 226d0 220 0 _GLOBAL__sub_I__ZN28PageAllocatorTest_Setup_Test10test_info_E +226d0 10 97 56 +226e0 8 39 56 +226e8 4 39 56 +226ec c 39 56 +226f8 4 39 56 +226fc 4 39 56 +22700 4 484 85 +22704 14 39 56 +22718 4 484 85 +2271c 4 39 56 +22720 4 39 56 +22724 4 39 56 +22728 4 484 85 +2272c 8 39 56 +22734 4 484 85 +22738 c 39 56 +22744 8 39 56 +2274c 8 43 56 +22754 c 43 56 +22760 4 484 85 +22764 14 43 56 +22778 c 484 85 +22784 10 43 56 +22794 8 43 56 +2279c 8 53 56 +227a4 c 53 56 +227b0 4 484 85 +227b4 14 53 56 +227c8 c 484 85 +227d4 c 53 56 +227e0 8 69 56 +227e8 4 53 56 +227ec 8 53 56 +227f4 8 69 56 +227fc c 69 56 +22808 4 484 85 +2280c 10 69 56 +2281c c 484 85 +22828 10 69 56 +22838 8 69 56 +22840 8 76 56 +22848 c 76 56 +22854 4 484 85 +22858 14 76 56 +2286c c 484 85 +22878 10 76 56 +22888 8 76 56 +22890 8 91 56 +22898 c 91 56 +228a4 4 484 85 +228a8 14 91 56 +228bc c 484 85 +228c8 10 91 56 +228d8 4 91 56 +228dc 8 97 56 +228e4 4 91 56 +228e8 8 97 56 +FUNC 228f0 268 0 _GLOBAL__sub_I__ZN15google_breakpad31NonAllocatingMapTest_Entry_Test10test_info_E +228f0 10 308 59 +22900 8 35 59 +22908 4 35 59 +2290c 8 35 59 +22914 4 35 59 +22918 4 35 59 +2291c 4 484 85 +22920 14 35 59 +22934 4 484 85 +22938 4 35 59 +2293c 8 35 59 +22944 8 484 85 +2294c 14 35 59 +22960 8 35 59 +22968 8 63 59 +22970 c 63 59 +2297c 4 484 85 +22980 14 63 59 +22994 c 484 85 +229a0 10 63 59 +229b0 8 63 59 +229b8 8 92 59 +229c0 c 92 59 +229cc 4 484 85 +229d0 14 92 59 +229e4 c 484 85 +229f0 10 92 59 +22a00 8 92 59 +22a08 8 127 59 +22a10 c 127 59 +22a1c 4 484 85 +22a20 14 127 59 +22a34 c 484 85 +22a40 10 127 59 +22a50 8 127 59 +22a58 8 228 59 +22a60 c 228 59 +22a6c 4 484 85 +22a70 14 228 59 +22a84 c 484 85 +22a90 10 228 59 +22aa0 8 228 59 +22aa8 8 253 59 +22ab0 c 253 59 +22abc 4 484 85 +22ac0 14 253 59 +22ad4 c 484 85 +22ae0 10 253 59 +22af0 8 253 59 +22af8 8 282 59 +22b00 c 282 59 +22b0c 4 484 85 +22b10 14 282 59 +22b24 c 484 85 +22b30 10 282 59 +22b40 4 308 59 +22b44 4 282 59 +22b48 8 308 59 +22b50 4 282 59 +22b54 4 308 59 +FUNC 22b58 3e8 0 _GLOBAL__sub_I__ZN47MinidumpMemoryRangeTest_DefaultConstructor_Test10test_info_E +22b58 4 90 78 +22b5c 8 258 78 +22b64 c 90 78 +22b70 8 258 78 +22b78 4 78 78 +22b7c 4 80 78 +22b80 4 90 78 +22b84 4 95 78 +22b88 4 90 78 +22b8c 4 79 78 +22b90 4 90 78 +22b94 4 81 78 +22b98 4 90 78 +22b9c 4 82 78 +22ba0 4 90 78 +22ba4 4 95 78 +22ba8 4 90 78 +22bac 4 95 78 +22bb0 4 90 78 +22bb4 c 95 78 +22bc0 8 95 78 +22bc8 c 95 78 +22bd4 4 484 85 +22bd8 14 95 78 +22bec c 484 85 +22bf8 10 95 78 +22c08 8 95 78 +22c10 8 101 78 +22c18 c 101 78 +22c24 4 484 85 +22c28 14 101 78 +22c3c c 484 85 +22c48 10 101 78 +22c58 8 101 78 +22c60 8 107 78 +22c68 c 107 78 +22c74 4 484 85 +22c78 14 107 78 +22c8c c 484 85 +22c98 10 107 78 +22ca8 8 107 78 +22cb0 8 122 78 +22cb8 c 122 78 +22cc4 4 484 85 +22cc8 14 122 78 +22cdc c 484 85 +22ce8 10 122 78 +22cf8 8 122 78 +22d00 8 133 78 +22d08 c 133 78 +22d14 4 484 85 +22d18 14 133 78 +22d2c c 484 85 +22d38 10 133 78 +22d48 8 133 78 +22d50 8 140 78 +22d58 c 140 78 +22d64 4 484 85 +22d68 14 140 78 +22d7c c 484 85 +22d88 10 140 78 +22d98 8 140 78 +22da0 8 165 78 +22da8 c 165 78 +22db4 4 484 85 +22db8 14 165 78 +22dcc c 484 85 +22dd8 10 165 78 +22de8 8 165 78 +22df0 8 193 78 +22df8 c 193 78 +22e04 4 484 85 +22e08 14 193 78 +22e1c c 484 85 +22e28 10 193 78 +22e38 8 193 78 +22e40 8 201 78 +22e48 c 201 78 +22e54 4 484 85 +22e58 14 201 78 +22e6c c 484 85 +22e78 10 201 78 +22e88 8 201 78 +22e90 8 216 78 +22e98 c 216 78 +22ea4 4 484 85 +22ea8 14 216 78 +22ebc c 484 85 +22ec8 10 216 78 +22ed8 8 216 78 +22ee0 8 224 78 +22ee8 c 224 78 +22ef4 4 484 85 +22ef8 14 224 78 +22f0c c 484 85 +22f18 10 224 78 +22f28 4 258 78 +22f2c 4 224 78 +22f30 8 258 78 +22f38 4 224 78 +22f3c 4 258 78 +FUNC 22f40 d8 0 _GLOBAL__sub_I__ZN32AndroidUContext_GRegsOffset_Test10test_info_E +22f40 10 186 34 +22f50 8 50 34 +22f58 4 50 34 +22f5c 8 50 34 +22f64 4 50 34 +22f68 4 50 34 +22f6c 4 484 85 +22f70 14 50 34 +22f84 4 484 85 +22f88 4 50 34 +22f8c 8 50 34 +22f94 8 484 85 +22f9c 14 50 34 +22fb0 8 50 34 +22fb8 8 183 34 +22fc0 c 183 34 +22fcc 4 484 85 +22fd0 14 183 34 +22fe4 c 484 85 +22ff0 10 183 34 +23000 4 186 34 +23004 4 183 34 +23008 8 186 34 +23010 4 183 34 +23014 4 186 34 +FUNC 23018 238 0 _GLOBAL__sub_I_gtest.cc +23018 4 5291 95 +2301c 8 193 95 +23024 4 5291 95 +23028 4 193 95 +2302c c 5291 95 +23038 8 193 95 +23040 c 209 95 +2304c 8 209 95 +23054 4 193 95 +23058 c 198 95 +23064 8 209 95 +2306c 4 198 95 +23070 4 229 95 +23074 4 198 95 +23078 4 229 95 +2307c 4 198 95 +23080 18 203 95 +23098 18 209 95 +230b0 c 209 95 +230bc c 209 95 +230c8 8 217 95 +230d0 4 209 95 +230d4 18 217 95 +230ec c 217 95 +230f8 c 217 95 +23104 8 229 95 +2310c 4 217 95 +23110 14 229 95 +23124 c 229 95 +23130 10 229 95 +23140 18 241 95 +23158 18 247 95 +23170 18 253 95 +23188 18 264 95 +231a0 18 270 95 +231b8 c 276 95 +231c4 4 276 95 +231c8 4 276 95 +231cc 4 276 95 +231d0 4 276 95 +231d4 c 276 95 +231e0 c 276 95 +231ec 8 377 95 +231f4 4 276 95 +231f8 18 283 95 +23210 c 377 95 +2321c 10 377 95 +2322c 4 5291 95 +23230 c 608 95 +2323c 8 5291 95 +23244 4 608 95 +23248 8 5291 95 +FUNC 23250 e8 0 _GLOBAL__sub_I_gtest_death_test.cc +23250 4 1346 89 +23254 8 85 89 +2325c 4 1346 89 +23260 4 85 89 +23264 4 85 89 +23268 4 1346 89 +2326c 4 85 89 +23270 4 85 89 +23274 4 1346 89 +23278 4 85 89 +2327c 4 85 89 +23280 4 85 89 +23284 4 85 89 +23288 8 85 89 +23290 8 85 89 +23298 4 85 89 +2329c 10 85 89 +232ac 8 107 89 +232b4 4 85 89 +232b8 14 94 89 +232cc 4 107 89 +232d0 4 94 89 +232d4 10 107 89 +232e4 4 107 89 +232e8 8 120 132 +232f0 c 107 89 +232fc 4 120 132 +23300 4 124 132 +23304 4 481 101 +23308 c 124 132 +23314 8 359 89 +2331c 4 101 103 +23320 8 359 89 +23328 10 1346 89 +FUNC 23338 28 0 _GLOBAL__sub_I_gtest_port.cc +23338 4 67 139 +2333c 4 1057 92 +23340 4 67 139 +23344 4 1057 92 +23348 4 67 139 +2334c 4 1057 92 +23350 4 67 139 +23354 4 1057 92 +23358 4 481 101 +2335c 4 1057 92 +FUNC 23360 44 0 main +23360 c 34 96 +2336c c 34 96 +23378 c 35 96 +23384 c 36 96 +23390 4 2326 82 +23394 4 2326 82 +23398 c 38 96 +FUNC 233a4 88 0 _GLOBAL__sub_I_cxxabi.cc +233a4 4 463 161 +233a8 8 210 161 +233b0 4 463 161 +233b4 8 210 161 +233bc 4 463 161 +233c0 8 210 161 +233c8 c 104 161 +233d4 8 108 161 +233dc 4 104 161 +233e0 8 105 161 +233e8 8 106 161 +233f0 4 108 161 +233f4 4 109 161 +233f8 4 110 161 +233fc 4 260 161 +23400 4 463 161 +23404 c 260 161 +23410 4 463 161 +23414 c 260 161 +23420 c 211 161 +FUNC 2342c 38 0 _GLOBAL__sub_I_locale_impl.cpp +2342c 4 764 187 +23430 4 621 187 +23434 4 764 187 +23438 8 621 187 +23440 8 621 187 +23448 c 621 187 +23454 4 764 187 +23458 c 621 187 +FUNC 23464 40 0 _GLOBAL__sub_I_allocators.cpp +23464 4 1119 176 +23468 4 340 241 +2346c 8 1119 176 +23474 10 340 241 +23484 8 128 176 +2348c 4 1119 176 +23490 4 128 176 +23494 4 1119 176 +23498 c 128 176 +FUNC 2351c 4 0 testing::Test::SetUpTestCase +2351c 4 389 82 +FUNC 23520 4 0 testing::Test::TearDownTestCase +23520 4 397 82 +FUNC 23524 8 0 testing::Test::Setup +23524 8 475 82 +FUNC 2352c 8 0 DoneCallbackReturnFalse +2352c 8 267 6 +FUNC 23534 8 0 DoneCallbackReturnTrue +23534 8 273 6 +FUNC 2353c 8 0 FilterCallbackReturnFalse +2353c 8 284 6 +FUNC 23544 8 0 FilterCallbackReturnTrue +23544 8 288 6 +FUNC 2354c 8 0 std::basic_streambuf >::overflow +2354c 8 158 128 +FUNC 23554 4 0 std::basic_streambuf >::imbue +23554 4 180 128 +FUNC 23558 8 0 std::basic_streambuf >::sync +23558 8 184 128 +FUNC 23560 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23560 4 484 85 +FUNC 23564 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23564 4 484 85 +FUNC 23568 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23568 4 484 85 +FUNC 2356c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2356c 4 484 85 +FUNC 23570 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23570 4 484 85 +FUNC 23574 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23574 4 484 85 +FUNC 23578 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23578 4 484 85 +FUNC 2357c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2357c 4 484 85 +FUNC 23580 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23580 4 484 85 +FUNC 23584 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23584 4 484 85 +FUNC 23588 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23588 4 484 85 +FUNC 2358c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2358c 4 484 85 +FUNC 23590 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23590 4 484 85 +FUNC 23594 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23594 4 484 85 +FUNC 23598 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23598 4 484 85 +FUNC 2359c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2359c 4 484 85 +FUNC 235a0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +235a0 4 484 85 +FUNC 235a4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +235a4 4 484 85 +FUNC 235a8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +235a8 4 484 85 +FUNC 235ac 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +235ac 4 484 85 +FUNC 235b0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +235b0 4 484 85 +FUNC 235b4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +235b4 4 484 85 +FUNC 235b8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +235b8 4 484 85 +FUNC 235bc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +235bc 4 484 85 +FUNC 235c0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +235c0 4 484 85 +FUNC 235c4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +235c4 4 484 85 +FUNC 235c8 8 0 std::basic_streambuf >::showmanyc +235c8 8 176 128 +FUNC 235d0 1c 0 std::basic_stringbuf, std::allocator >::underflow +235d0 4 96 126 +235d4 4 99 126 +235d8 4 99 126 +235dc 8 99 126 +235e4 4 223 140 +235e8 4 100 126 +FUNC 235ec 24 0 std::basic_stringbuf, std::allocator >::uflow +235ec 4 105 126 +235f0 4 112 126 +235f4 c 106 126 +23600 4 223 140 +23604 4 91 129 +23608 8 113 126 +FUNC 23610 6c 0 std::basic_stringbuf, std::allocator >::pbackfail +23610 4 117 126 +23614 4 138 126 +23618 c 118 126 +23624 8 119 126 +2362c 4 120 126 +23630 4 220 140 +23634 8 120 126 +2363c c 91 129 +23648 4 124 126 +2364c 4 138 126 +23650 4 124 126 +23654 8 91 129 +2365c 4 126 126 +23660 8 127 126 +23668 4 91 129 +2366c 4 182 140 +23670 4 91 129 +23674 8 139 126 +FUNC 2367c 4 0 std::basic_streambuf >::setbuf +2367c 4 200 128 +FUNC 23680 8 0 std::basic_streambuf >::underflow +23680 8 171 128 +FUNC 23688 40 0 std::basic_streambuf >::uflow +23688 c 162 128 +23694 4 162 128 +23698 c 163 128 +236a4 8 165 128 +236ac c 165 128 +236b8 4 223 140 +236bc c 166 128 +FUNC 236c8 8 0 std::basic_streambuf >::pbackfail +236c8 8 152 128 +FUNC 236d0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236d0 4 484 85 +FUNC 236d4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236d4 4 484 85 +FUNC 236d8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236d8 4 484 85 +FUNC 236dc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236dc 4 484 85 +FUNC 236e0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236e0 4 484 85 +FUNC 236e4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236e4 4 484 85 +FUNC 236e8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236e8 4 484 85 +FUNC 236ec 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236ec 4 484 85 +FUNC 236f0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236f0 4 484 85 +FUNC 236f4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236f4 4 484 85 +FUNC 236f8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236f8 4 484 85 +FUNC 236fc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +236fc 4 484 85 +FUNC 23700 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23700 4 484 85 +FUNC 23704 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23704 4 484 85 +FUNC 23708 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23708 4 484 85 +FUNC 2370c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2370c 4 484 85 +FUNC 23710 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23710 4 484 85 +FUNC 23714 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23714 4 484 85 +FUNC 23718 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23718 4 484 85 +FUNC 2371c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2371c 4 484 85 +FUNC 23720 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23720 4 484 85 +FUNC 23724 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23724 4 484 85 +FUNC 23728 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23728 4 484 85 +FUNC 2372c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2372c 4 484 85 +FUNC 23730 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23730 4 484 85 +FUNC 23734 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +23734 4 484 85 +FUNC 23738 b4 0 std::basic_streambuf >::xsputn +23738 14 84 128 +2374c c 84 128 +23758 4 86 128 +2375c 8 89 128 +23764 10 90 128 +23774 10 92 128 +23784 4 172 140 +23788 c 172 140 +23794 4 96 128 +23798 4 94 128 +2379c 4 95 128 +237a0 c 96 128 +237ac 4 100 128 +237b0 10 100 128 +237c0 8 99 128 +237c8 4 101 128 +237cc 8 102 128 +237d4 18 108 128 +FUNC 237ec a8 0 std::basic_streambuf >::_M_xsputnc +237ec 14 112 128 +23800 c 112 128 +2380c 4 114 128 +23810 8 117 128 +23818 10 118 128 +23828 c 120 128 +23834 c 235 140 +23840 4 122 128 +23844 4 235 140 +23848 10 123 128 +23858 4 127 128 +2385c 10 127 128 +2386c 8 126 128 +23874 8 128 128 +2387c 18 133 128 +FUNC 23894 14 0 std::basic_streambuf >::~basic_streambuf +23894 14 41 128 +FUNC 238a8 24 0 std::basic_streambuf >::~basic_streambuf +238a8 c 40 128 +238b4 4 40 128 +238b8 4 41 128 +238bc 4 41 128 +238c0 8 41 128 +238c8 4 41 128 +FUNC 238cc 14 0 std::basic_ios >::~basic_ios +238cc 14 59 109 +FUNC 238e0 24 0 std::basic_ios >::~basic_ios +238e0 c 59 109 +238ec 8 59 109 +238f4 4 59 109 +238f8 8 59 109 +23900 4 59 109 +FUNC 23904 3c 0 InstallRaiseSIGKILL +23904 4 297 6 +23908 4 300 6 +2390c 4 301 6 +23910 4 297 6 +23914 4 300 6 +23918 4 301 6 +2391c 4 299 6 +23920 4 300 6 +23924 4 301 6 +23928 4 299 6 +2392c 8 301 6 +23934 c 302 6 +FUNC 23940 8 0 RaiseSIGKILL +23940 8 294 6 +FUNC 23948 1c 0 DoneCallbackRaiseSIGKILL +23948 4 277 6 +2394c 4 278 6 +23950 4 277 6 +23954 4 278 6 +23958 c 280 6 +FUNC 23964 14 0 ExceptionHandlerTest_WriteMinidumpForChild_Test::~ExceptionHandlerTest_WriteMinidumpForChild_Test +23964 14 1154 6 +FUNC 23978 24 0 ExceptionHandlerTest_WriteMinidumpForChild_Test::~ExceptionHandlerTest_WriteMinidumpForChild_Test +23978 c 1154 6 +23984 8 1154 6 +2398c 4 1154 6 +23990 8 1154 6 +23998 4 1154 6 +FUNC 2399c 14 0 ExceptionHandlerTest_AdditionalMemoryRemove_Test::~ExceptionHandlerTest_AdditionalMemoryRemove_Test +2399c 14 1112 6 +FUNC 239b0 24 0 ExceptionHandlerTest_AdditionalMemoryRemove_Test::~ExceptionHandlerTest_AdditionalMemoryRemove_Test +239b0 c 1112 6 +239bc 8 1112 6 +239c4 4 1112 6 +239c8 8 1112 6 +239d0 4 1112 6 +FUNC 239d4 14 0 ExceptionHandlerTest_AdditionalMemory_Test::~ExceptionHandlerTest_AdditionalMemory_Test +239d4 14 1068 6 +FUNC 239e8 24 0 ExceptionHandlerTest_AdditionalMemory_Test::~ExceptionHandlerTest_AdditionalMemory_Test +239e8 c 1068 6 +239f4 8 1068 6 +239fc 4 1068 6 +23a00 8 1068 6 +23a08 4 1068 6 +FUNC 23a0c 14 0 ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test::~ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test +23a0c 14 1036 6 +FUNC 23a20 24 0 ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test::~ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test +23a20 c 1036 6 +23a2c 8 1036 6 +23a34 4 1036 6 +23a38 8 1036 6 +23a40 4 1036 6 +FUNC 23a44 14 0 ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test::~ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test +23a44 14 1019 6 +FUNC 23a58 24 0 ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test::~ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test +23a58 c 1019 6 +23a64 8 1019 6 +23a6c 4 1019 6 +23a70 8 1019 6 +23a78 4 1019 6 +FUNC 23a7c 14 0 ExceptionHandlerTest_WriteMinidumpExceptionStream_Test::~ExceptionHandlerTest_WriteMinidumpExceptionStream_Test +23a7c 14 1000 6 +FUNC 23a90 24 0 ExceptionHandlerTest_WriteMinidumpExceptionStream_Test::~ExceptionHandlerTest_WriteMinidumpExceptionStream_Test +23a90 c 1000 6 +23a9c 8 1000 6 +23aa4 4 1000 6 +23aa8 8 1000 6 +23ab0 4 1000 6 +FUNC 23ab4 14 0 ExceptionHandlerTest_ExternalDumper_Test::~ExceptionHandlerTest_ExternalDumper_Test +23ab4 14 926 6 +FUNC 23ac8 24 0 ExceptionHandlerTest_ExternalDumper_Test::~ExceptionHandlerTest_ExternalDumper_Test +23ac8 c 926 6 +23ad4 8 926 6 +23adc 4 926 6 +23ae0 8 926 6 +23ae8 4 926 6 +FUNC 23aec 14 0 ExceptionHandlerTest_ModuleInfo_Test::~ExceptionHandlerTest_ModuleInfo_Test +23aec 14 806 6 +FUNC 23b00 24 0 ExceptionHandlerTest_ModuleInfo_Test::~ExceptionHandlerTest_ModuleInfo_Test +23b00 c 806 6 +23b0c 8 806 6 +23b14 4 806 6 +23b18 8 806 6 +23b20 4 806 6 +FUNC 23b24 14 0 ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test::~ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test +23b24 14 760 6 +FUNC 23b38 24 0 ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test::~ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test +23b38 c 760 6 +23b44 8 760 6 +23b4c 4 760 6 +23b50 8 760 6 +23b58 4 760 6 +FUNC 23b5c 14 0 ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test::~ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test +23b5c 14 667 6 +FUNC 23b70 24 0 ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test::~ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test +23b70 c 667 6 +23b7c 8 667 6 +23b84 4 667 6 +23b88 8 667 6 +23b90 4 667 6 +FUNC 23b94 14 0 ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test::~ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test +23b94 14 579 6 +FUNC 23ba8 24 0 ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test::~ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test +23ba8 c 579 6 +23bb4 8 579 6 +23bbc 4 579 6 +23bc0 8 579 6 +23bc8 4 579 6 +FUNC 23bcc 14 0 ExceptionHandlerTest_InstructionPointerMemory_Test::~ExceptionHandlerTest_InstructionPointerMemory_Test +23bcc 14 487 6 +FUNC 23be0 24 0 ExceptionHandlerTest_InstructionPointerMemory_Test::~ExceptionHandlerTest_InstructionPointerMemory_Test +23be0 c 487 6 +23bec 8 487 6 +23bf4 4 487 6 +23bf8 8 487 6 +23c00 4 487 6 +FUNC 23c04 14 0 ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test::~ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test +23c04 14 457 6 +FUNC 23c18 24 0 ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test::~ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test +23c18 c 457 6 +23c24 8 457 6 +23c2c 4 457 6 +23c30 8 457 6 +23c38 4 457 6 +FUNC 23c3c 14 0 ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test::~ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test +23c3c 14 441 6 +FUNC 23c50 24 0 ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test::~ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test +23c50 c 441 6 +23c5c 8 441 6 +23c64 4 441 6 +23c68 8 441 6 +23c70 4 441 6 +FUNC 23c74 14 0 ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test::~ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test +23c74 14 425 6 +FUNC 23c88 24 0 ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test::~ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test +23c88 c 425 6 +23c94 8 425 6 +23c9c 4 425 6 +23ca0 8 425 6 +23ca8 4 425 6 +FUNC 23cac 14 0 ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test::~ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test +23cac 14 409 6 +FUNC 23cc0 24 0 ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test::~ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test +23cc0 c 409 6 +23ccc 8 409 6 +23cd4 4 409 6 +23cd8 8 409 6 +23ce0 4 409 6 +FUNC 23ce4 14 0 ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test::~ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test +23ce4 14 380 6 +FUNC 23cf8 24 0 ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test::~ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test +23cf8 c 380 6 +23d04 8 380 6 +23d0c 4 380 6 +23d10 8 380 6 +23d18 4 380 6 +FUNC 23d1c 14 0 ExceptionHandlerTest_RedeliveryToDefaultHandler_Test::~ExceptionHandlerTest_RedeliveryToDefaultHandler_Test +23d1c 14 363 6 +FUNC 23d30 24 0 ExceptionHandlerTest_RedeliveryToDefaultHandler_Test::~ExceptionHandlerTest_RedeliveryToDefaultHandler_Test +23d30 c 363 6 +23d3c 8 363 6 +23d44 4 363 6 +23d48 8 363 6 +23d50 4 363 6 +FUNC 23d54 14 0 ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test::~ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test +23d54 14 351 6 +FUNC 23d68 24 0 ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test::~ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test +23d68 c 351 6 +23d74 8 351 6 +23d7c 4 351 6 +23d80 8 351 6 +23d88 4 351 6 +FUNC 23d8c 14 0 ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test::~ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test +23d8c 14 339 6 +FUNC 23da0 24 0 ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test::~ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test +23da0 c 339 6 +23dac 8 339 6 +23db4 4 339 6 +23db8 8 339 6 +23dc0 4 339 6 +FUNC 23dc4 14 0 ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test::~ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test +23dc4 14 327 6 +FUNC 23dd8 24 0 ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test::~ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test +23dd8 c 327 6 +23de4 8 327 6 +23dec 4 327 6 +23df0 8 327 6 +23df8 4 327 6 +FUNC 23dfc 14 0 ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test::~ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test +23dfc 14 315 6 +FUNC 23e10 24 0 ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test::~ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test +23e10 c 315 6 +23e1c 8 315 6 +23e24 4 315 6 +23e28 8 315 6 +23e30 4 315 6 +FUNC 23e34 14 0 ExceptionHandlerTest_ChildCrashWithFD_Test::~ExceptionHandlerTest_ChildCrashWithFD_Test +23e34 14 257 6 +FUNC 23e48 24 0 ExceptionHandlerTest_ChildCrashWithFD_Test::~ExceptionHandlerTest_ChildCrashWithFD_Test +23e48 c 257 6 +23e54 8 257 6 +23e5c 4 257 6 +23e60 8 257 6 +23e68 4 257 6 +FUNC 23e6c 14 0 ExceptionHandlerTest_ChildCrashWithPath_Test::~ExceptionHandlerTest_ChildCrashWithPath_Test +23e6c 14 253 6 +FUNC 23e80 24 0 ExceptionHandlerTest_ChildCrashWithPath_Test::~ExceptionHandlerTest_ChildCrashWithPath_Test +23e80 c 253 6 +23e8c 8 253 6 +23e94 4 253 6 +23e98 8 253 6 +23ea0 4 253 6 +FUNC 23ea4 14 0 ExceptionHandlerTest_SimpleWithFD_Test::~ExceptionHandlerTest_SimpleWithFD_Test +23ea4 14 170 6 +FUNC 23eb8 24 0 ExceptionHandlerTest_SimpleWithFD_Test::~ExceptionHandlerTest_SimpleWithFD_Test +23eb8 c 170 6 +23ec4 8 170 6 +23ecc 4 170 6 +23ed0 8 170 6 +23ed8 4 170 6 +FUNC 23edc 14 0 ExceptionHandlerTest_SimpleWithPath_Test::~ExceptionHandlerTest_SimpleWithPath_Test +23edc 14 160 6 +FUNC 23ef0 24 0 ExceptionHandlerTest_SimpleWithPath_Test::~ExceptionHandlerTest_SimpleWithPath_Test +23ef0 c 160 6 +23efc 8 160 6 +23f04 4 160 6 +23f08 8 160 6 +23f10 4 160 6 +FUNC 23f14 194 0 CrashHandler +23f14 10 877 6 +23f24 4 880 6 +23f28 4 877 6 +23f2c 4 877 6 +23f30 4 878 6 +23f34 10 880 6 +23f44 4 885 6 +23f48 4 886 6 +23f4c 4 891 6 +23f50 4 892 6 +23f54 4 895 6 +23f58 4 892 6 +23f5c 8 897 6 +23f64 4 902 6 +23f68 4 888 6 +23f6c 4 895 6 +23f70 4 902 6 +23f74 4 893 6 +23f78 4 903 6 +23f7c 4 895 6 +23f80 4 903 6 +23f84 4 904 6 +23f88 4 896 6 +23f8c 4 890 6 +23f90 4 893 6 +23f94 4 900 6 +23f98 4 901 6 +23f9c 8 888 6 +23fa4 4 895 6 +23fa8 8 904 6 +23fb0 4 905 6 +23fb4 4 907 6 +23fb8 8 906 6 +23fc0 8 907 6 +23fc8 8 909 6 +23fd0 8 910 6 +23fd8 8 911 6 +23fe0 24 3671 97 +24004 4 3671 97 +24008 8 3671 97 +24010 c 913 6 +2401c 4 3671 97 +24020 18 2979 97 +24038 4 2979 97 +2403c 8 2979 97 +24044 4 915 6 +24048 4 916 6 +2404c 4 915 6 +24050 24 3104 97 +24074 8 921 6 +2407c 4 3104 97 +24080 8 3104 97 +24088 10 919 6 +24098 10 922 6 +FUNC 240a8 d4 0 DoneCallback +240a8 14 180 6 +240bc 4 180 6 +240c0 4 182 6 +240c4 4 181 6 +240c8 4 184 6 +240cc 4 191 6 +240d0 8 184 6 +240d8 4 187 6 +240dc 4 187 6 +240e0 4 185 6 +240e4 4 186 6 +240e8 4 187 6 +240ec 4 187 6 +240f0 20 3162 97 +24110 4 3162 97 +24114 8 3162 97 +2411c c 188 6 +24128 28 3162 97 +24150 4 3162 97 +24154 8 3162 97 +2415c 10 189 6 +2416c 10 192 6 +FUNC 2417c 3c 0 testing::internal::TestFactoryImpl::CreateTest +2417c 10 486 85 +2418c 8 486 85 +24194 8 1154 6 +2419c 4 486 85 +241a0 c 1154 6 +241ac c 486 85 +FUNC 241b8 3c 0 testing::internal::TestFactoryImpl::CreateTest +241b8 10 486 85 +241c8 8 486 85 +241d0 8 1112 6 +241d8 4 486 85 +241dc c 1112 6 +241e8 c 486 85 +FUNC 241f4 3c 0 testing::internal::TestFactoryImpl::CreateTest +241f4 10 486 85 +24204 8 486 85 +2420c 8 1068 6 +24214 4 486 85 +24218 c 1068 6 +24224 c 486 85 +FUNC 24230 3c 0 testing::internal::TestFactoryImpl::CreateTest +24230 10 486 85 +24240 8 486 85 +24248 8 339 6 +24250 4 486 85 +24254 c 339 6 +24260 c 486 85 +FUNC 2426c 3c 0 testing::internal::TestFactoryImpl::CreateTest +2426c 10 486 85 +2427c 8 486 85 +24284 8 327 6 +2428c 4 486 85 +24290 c 327 6 +2429c c 486 85 +FUNC 242a8 3c 0 testing::internal::TestFactoryImpl::CreateTest +242a8 10 486 85 +242b8 8 486 85 +242c0 8 315 6 +242c8 4 486 85 +242cc c 315 6 +242d8 c 486 85 +FUNC 242e4 3c 0 testing::internal::TestFactoryImpl::CreateTest +242e4 10 486 85 +242f4 8 486 85 +242fc 8 257 6 +24304 4 486 85 +24308 c 257 6 +24314 c 486 85 +FUNC 24320 3c 0 testing::internal::TestFactoryImpl::CreateTest +24320 10 486 85 +24330 8 486 85 +24338 8 253 6 +24340 4 486 85 +24344 c 253 6 +24350 c 486 85 +FUNC 2435c 3c 0 testing::internal::TestFactoryImpl::CreateTest +2435c 10 486 85 +2436c 8 486 85 +24374 8 170 6 +2437c 4 486 85 +24380 c 170 6 +2438c c 486 85 +FUNC 24398 3c 0 testing::internal::TestFactoryImpl::CreateTest +24398 10 486 85 +243a8 8 486 85 +243b0 8 160 6 +243b8 4 486 85 +243bc c 160 6 +243c8 c 486 85 +FUNC 243d4 3c 0 testing::internal::TestFactoryImpl::CreateTest +243d4 10 486 85 +243e4 8 486 85 +243ec 8 1036 6 +243f4 4 486 85 +243f8 c 1036 6 +24404 c 486 85 +FUNC 24410 3c 0 testing::internal::TestFactoryImpl::CreateTest +24410 10 486 85 +24420 8 486 85 +24428 8 1019 6 +24430 4 486 85 +24434 c 1019 6 +24440 c 486 85 +FUNC 2444c 3c 0 testing::internal::TestFactoryImpl::CreateTest +2444c 10 486 85 +2445c 8 486 85 +24464 8 1000 6 +2446c 4 486 85 +24470 c 1000 6 +2447c c 486 85 +FUNC 24488 3c 0 testing::internal::TestFactoryImpl::CreateTest +24488 10 486 85 +24498 8 486 85 +244a0 8 926 6 +244a8 4 486 85 +244ac c 926 6 +244b8 c 486 85 +FUNC 244c4 3c 0 testing::internal::TestFactoryImpl::CreateTest +244c4 10 486 85 +244d4 8 486 85 +244dc 8 806 6 +244e4 4 486 85 +244e8 c 806 6 +244f4 c 486 85 +FUNC 24500 3c 0 testing::internal::TestFactoryImpl::CreateTest +24500 10 486 85 +24510 8 486 85 +24518 8 760 6 +24520 4 486 85 +24524 c 760 6 +24530 c 486 85 +FUNC 2453c 3c 0 testing::internal::TestFactoryImpl::CreateTest +2453c 10 486 85 +2454c 8 486 85 +24554 8 667 6 +2455c 4 486 85 +24560 c 667 6 +2456c c 486 85 +FUNC 24578 3c 0 testing::internal::TestFactoryImpl::CreateTest +24578 10 486 85 +24588 8 486 85 +24590 8 579 6 +24598 4 486 85 +2459c c 579 6 +245a8 c 486 85 +FUNC 245b4 3c 0 testing::internal::TestFactoryImpl::CreateTest +245b4 10 486 85 +245c4 8 486 85 +245cc 8 487 6 +245d4 4 486 85 +245d8 c 487 6 +245e4 c 486 85 +FUNC 245f0 3c 0 testing::internal::TestFactoryImpl::CreateTest +245f0 10 486 85 +24600 8 486 85 +24608 8 457 6 +24610 4 486 85 +24614 c 457 6 +24620 c 486 85 +FUNC 2462c 3c 0 testing::internal::TestFactoryImpl::CreateTest +2462c 10 486 85 +2463c 8 486 85 +24644 8 441 6 +2464c 4 486 85 +24650 c 441 6 +2465c c 486 85 +FUNC 24668 3c 0 testing::internal::TestFactoryImpl::CreateTest +24668 10 486 85 +24678 8 486 85 +24680 8 425 6 +24688 4 486 85 +2468c c 425 6 +24698 c 486 85 +FUNC 246a4 3c 0 testing::internal::TestFactoryImpl::CreateTest +246a4 10 486 85 +246b4 8 486 85 +246bc 8 409 6 +246c4 4 486 85 +246c8 c 409 6 +246d4 c 486 85 +FUNC 246e0 3c 0 testing::internal::TestFactoryImpl::CreateTest +246e0 10 486 85 +246f0 8 486 85 +246f8 8 380 6 +24700 4 486 85 +24704 c 380 6 +24710 c 486 85 +FUNC 2471c 3c 0 testing::internal::TestFactoryImpl::CreateTest +2471c 10 486 85 +2472c 8 486 85 +24734 8 363 6 +2473c 4 486 85 +24740 c 363 6 +2474c c 486 85 +FUNC 24758 3c 0 testing::internal::TestFactoryImpl::CreateTest +24758 10 486 85 +24768 8 486 85 +24770 8 351 6 +24778 4 486 85 +2477c c 351 6 +24788 c 486 85 +FUNC 24794 b0 0 std::basic_streambuf >::xsgetn +24794 14 54 128 +247a8 c 54 128 +247b4 4 55 128 +247b8 8 58 128 +247c0 10 59 128 +247d0 10 61 128 +247e0 4 172 140 +247e4 c 172 140 +247f0 4 65 128 +247f4 4 63 128 +247f8 4 64 128 +247fc c 65 128 +24808 4 228 129 +2480c c 229 129 +24818 8 69 128 +24820 4 220 140 +24824 8 71 128 +2482c 18 80 128 +FUNC 24844 40 0 std::priv::__ucopy_trivial +24844 14 103 137 +24858 10 107 137 +24868 c 106 137 +24874 4 107 137 +24878 c 108 137 +FUNC 24884 1c 0 testing::AssertionResult::message +24884 4 1144 87 +24888 c 298 82 +24894 8 298 82 +2489c 4 299 82 +FUNC 248a0 48 0 testing::internal::scoped_ptr, std::allocator > >::~scoped_ptr +248a0 c 1140 87 +248ac c 1153 87 +248b8 10 1154 87 +248c8 8 1155 87 +248d0 c 1155 87 +248dc c 1140 87 +FUNC 248e8 30 0 std::priv::_String_base >::_M_deallocate_block +248e8 4 94 132 +248ec 4 64 132 +248f0 c 96 132 +248fc 8 97 132 +24904 8 161 101 +2490c 4 135 119 +24910 4 161 101 +24914 4 102 132 +FUNC 24918 28 0 google_breakpad::MinidumpDescriptor::~MinidumpDescriptor +24918 c 47 8 +24924 4 47 8 +24928 c 156 132 +24934 8 47 8 +2493c 4 156 132 +FUNC 24940 34 0 std::basic_stringbuf, std::allocator >::~basic_stringbuf +24940 4 59 126 +24944 8 58 126 +2494c 4 59 126 +24950 4 58 126 +24954 4 58 126 +24958 8 59 126 +24960 4 156 132 +24964 4 59 126 +24968 8 59 126 +24970 4 59 126 +FUNC 24974 24 0 std::basic_stringbuf, std::allocator >::~basic_stringbuf +24974 c 58 126 +24980 4 58 126 +24984 4 59 126 +24988 4 59 126 +2498c 8 59 126 +24994 4 59 126 +FUNC 24998 60 0 testing::internal::scoped_ptr, std::allocator > >::reset +24998 10 1152 87 +249a8 10 1153 87 +249b8 14 1154 87 +249cc 8 1155 87 +249d4 8 156 132 +249dc 8 1155 87 +249e4 4 1157 87 +249e8 10 1159 87 +FUNC 249f8 8 0 testing::internal::scoped_ptr, std::allocator > >::~scoped_ptr +249f8 8 1140 87 +FUNC 24a00 fc 0 std::basic_ios >::init +24a00 4 97 108 +24a04 4 92 109 +24a08 10 97 108 +24a18 4 50 108 +24a1c 4 92 109 +24a20 4 192 110 +24a24 4 97 108 +24a28 4 188 110 +24a2c 8 192 110 +24a34 4 193 110 +24a38 4 100 108 +24a3c 4 70 108 +24a40 8 100 108 +24a48 10 70 108 +24a58 8 72 108 +24a60 8 46 128 +24a68 4 47 128 +24a6c 8 46 128 +24a74 4 47 128 +24a78 4 46 128 +24a7c c 47 128 +24a88 c 48 128 +24a94 8 73 108 +24a9c 10 351 117 +24aac 4 76 108 +24ab0 8 100 108 +24ab8 8 100 108 +24ac0 4 188 110 +24ac4 8 112 110 +24acc 4 132 110 +24ad0 4 68 109 +24ad4 4 132 110 +24ad8 4 84 109 +24adc 4 190 110 +24ae0 4 139 110 +24ae4 4 84 109 +24ae8 14 110 108 +FUNC 24afc b4 0 std::basic_iostream >::basic_iostream +24afc c 1406 111 +24b08 4 92 108 +24b0c 4 1406 111 +24b10 4 92 108 +24b14 4 1406 111 +24b18 4 1406 111 +24b1c 8 92 108 +24b24 4 87 112 +24b28 4 88 112 +24b2c 8 87 112 +24b34 4 87 112 +24b38 4 92 108 +24b3c 4 87 112 +24b40 4 92 108 +24b44 4 87 112 +24b48 4 88 112 +24b4c 4 87 112 +24b50 4 88 112 +24b54 4 38 121 +24b58 4 39 121 +24b5c 8 38 121 +24b64 c 38 121 +24b70 8 39 121 +24b78 10 1410 111 +24b88 4 1410 111 +24b8c 4 1410 111 +24b90 4 1410 111 +24b94 4 1411 111 +24b98 4 1410 111 +24b9c 4 1411 111 +24ba0 c 1412 111 +24bac 4 1411 111 +FUNC 24bb0 b0 0 std::basic_iostream >::basic_iostream +24bb0 10 1406 111 +24bc0 c 1406 111 +24bcc 4 87 112 +24bd0 4 87 112 +24bd4 4 87 112 +24bd8 4 87 112 +24bdc 4 87 112 +24be0 4 88 112 +24be4 4 87 112 +24be8 4 88 112 +24bec c 88 112 +24bf8 4 38 121 +24bfc 4 1410 111 +24c00 4 38 121 +24c04 4 38 121 +24c08 4 38 121 +24c0c 4 38 121 +24c10 4 39 121 +24c14 10 39 121 +24c24 4 1410 111 +24c28 4 1410 111 +24c2c 4 1410 111 +24c30 4 1410 111 +24c34 4 1410 111 +24c38 4 1411 111 +24c3c 4 1412 111 +24c40 4 1410 111 +24c44 4 1410 111 +24c48 4 1411 111 +24c4c 8 1411 111 +24c54 8 1412 111 +24c5c 4 1411 111 +FUNC 24c60 98 0 std::__stlp_string_fill > +24c60 10 16 133 +24c70 4 16 133 +24c74 4 20 133 +24c78 10 19 133 +24c88 8 20 133 +24c90 10 200 129 +24ca0 14 199 129 +24cb4 14 200 129 +24cc8 c 21 133 +24cd4 8 20 133 +24cdc 8 24 133 +24ce4 4 22 133 +24ce8 10 25 133 +FUNC 24cf8 1c 0 std::basic_streambuf >::sputn +24cf8 8 204 129 +24d00 14 205 129 +FUNC 24d14 3c 0 std::basic_ios >::setstate +24d14 8 95 109 +24d1c 4 95 109 +24d20 4 92 109 +24d24 4 95 109 +24d28 c 92 109 +24d34 4 192 110 +24d38 4 188 110 +24d3c 8 192 110 +24d44 4 193 110 +24d48 8 95 109 +FUNC 24d50 60 0 std::basic_string, std::allocator >::erase +24d50 4 802 131 +24d54 4 803 131 +24d58 c 802 131 +24d64 8 802 131 +24d6c 4 803 131 +24d70 8 805 131 +24d78 8 168 140 +24d80 10 168 140 +24d90 10 806 131 +24da0 10 809 131 +FUNC 24db0 68 0 std::priv::_String_base >::_M_allocate_block +24db0 c 607 130 +24dbc 4 607 130 +24dc0 4 608 130 +24dc4 c 600 130 +24dd0 8 610 130 +24dd8 4 347 101 +24ddc 8 158 101 +24de4 c 134 119 +24df0 8 158 101 +24df8 4 613 130 +24dfc 4 611 130 +24e00 4 612 130 +24e04 8 613 130 +24e0c c 623 130 +FUNC 24e18 34 0 std::basic_string, std::allocator >::basic_string +24e18 4 158 131 +24e1c 4 124 132 +24e20 8 158 131 +24e28 4 158 131 +24e2c 4 120 132 +24e30 4 481 101 +24e34 8 124 132 +24e3c 4 101 103 +24e40 c 166 131 +FUNC 24e4c 50 0 google_breakpad::MinidumpDescriptor::MinidumpDescriptor +24e4c c 65 8 +24e58 4 65 8 +24e5c 4 69 8 +24e60 8 69 8 +24e68 4 69 8 +24e6c 4 69 8 +24e70 8 69 8 +24e78 c 69 8 +24e84 c 69 8 +24e90 c 71 8 +FUNC 24e9c bc 0 std::basic_stringstream, std::allocator >::basic_stringstream +24e9c 10 439 126 +24eac 8 439 126 +24eb4 8 441 126 +24ebc 4 439 126 +24ec0 4 441 126 +24ec4 4 441 126 +24ec8 4 441 126 +24ecc 4 441 126 +24ed0 4 441 126 +24ed4 4 441 126 +24ed8 4 441 126 +24edc 4 34 128 +24ee0 4 441 126 +24ee4 30 34 128 +24f14 4 46 126 +24f18 4 46 126 +24f1c 10 46 126 +24f2c 8 46 126 +24f34 4 442 126 +24f38 10 442 126 +24f48 10 443 126 +FUNC 24f58 e8 0 std::basic_stringstream, std::allocator >::basic_stringstream +24f58 c 439 126 +24f64 4 92 108 +24f68 8 439 126 +24f70 4 439 126 +24f74 4 92 108 +24f78 4 34 128 +24f7c 8 92 108 +24f84 4 441 126 +24f88 18 92 108 +24fa0 14 441 126 +24fb4 10 441 126 +24fc4 8 441 126 +24fcc 4 34 128 +24fd0 8 441 126 +24fd8 2c 34 128 +25004 4 46 126 +25008 4 46 126 +2500c 10 46 126 +2501c 8 46 126 +25024 c 442 126 +25030 10 443 126 +FUNC 25040 64 0 std::basic_string, std::allocator >::basic_string +25040 18 639 130 +25058 4 112 132 +2505c 4 481 101 +25060 c 229 140 +2506c 4 643 130 +25070 c 379 131 +2507c 10 148 137 +2508c 4 380 131 +25090 4 101 103 +25094 10 644 130 +FUNC 250a4 58 0 std::basic_string, std::allocator >::basic_string +250a4 14 647 130 +250b8 4 112 132 +250bc c 481 101 +250c8 4 378 131 +250cc 8 379 131 +250d4 10 148 137 +250e4 4 380 131 +250e8 4 101 103 +250ec 10 649 130 +FUNC 250fc 4c 0 google_breakpad::MinidumpDescriptor::MinidumpDescriptor +250fc c 56 8 +25108 4 56 8 +2510c 18 61 8 +25124 c 61 8 +25130 c 61 8 +2513c c 63 8 +FUNC 25148 7c 0 CrashWithCallbacks +25148 c 308 6 +25154 4 310 6 +25158 4 308 6 +2515c 8 308 6 +25164 8 310 6 +2516c 4 310 6 +25170 4 310 6 +25174 20 310 6 +25194 8 310 6 +2519c 10 207 6 +251ac 8 312 6 +251b4 10 313 6 +FUNC 251c4 2c 0 std::use_facet > > > +251c4 c 292 117 +251d0 4 292 117 +251d4 c 351 117 +251e0 4 351 117 +251e4 8 297 117 +251ec 4 351 117 +FUNC 251f0 8c 0 std::basic_istream >::~basic_istream +251f0 c 90 112 +251fc 8 90 112 +25204 8 90 112 +2520c c 90 112 +25218 4 90 112 +2521c 4 90 112 +25220 4 90 112 +25224 4 90 112 +25228 8 90 112 +25230 8 90 112 +25238 c 90 112 +25244 8 90 112 +2524c 10 90 112 +2525c 4 90 112 +25260 4 90 112 +25264 8 90 112 +2526c 4 90 112 +25270 c 90 112 +FUNC 2527c c 0 std::basic_istream >::~basic_istream +2527c c 90 112 +FUNC 25298 24 0 std::basic_istream >::~basic_istream +25298 c 90 112 +252a4 8 90 112 +252ac 4 90 112 +252b0 8 90 112 +252b8 4 90 112 +FUNC 252cc c 0 std::basic_istream >::~basic_istream +252cc c 90 112 +FUNC 252d8 8c 0 std::basic_ostream >::~basic_ostream +252d8 c 43 121 +252e4 4 43 121 +252e8 4 44 121 +252ec 8 44 121 +252f4 c 44 121 +25300 4 44 121 +25304 4 44 121 +25308 4 44 121 +2530c 4 44 121 +25310 8 44 121 +25318 8 44 121 +25320 c 44 121 +2532c 8 44 121 +25334 10 44 121 +25344 4 44 121 +25348 4 44 121 +2534c 8 44 121 +25354 4 44 121 +25358 c 44 121 +FUNC 25364 c 0 std::basic_ostream >::~basic_ostream +25364 c 44 121 +FUNC 25380 24 0 std::basic_ostream >::~basic_ostream +25380 c 43 121 +2538c 4 43 121 +25390 4 44 121 +25394 4 44 121 +25398 8 44 121 +253a0 4 44 121 +FUNC 253b4 c 0 std::basic_ostream >::~basic_ostream +253b4 4 43 121 +253b8 8 44 121 +FUNC 253c0 e0 0 std::basic_iostream >::~basic_iostream +253c0 c 1415 111 +253cc 8 1415 111 +253d4 4 1416 111 +253d8 8 1416 111 +253e0 c 1416 111 +253ec 4 1416 111 +253f0 4 1416 111 +253f4 4 1416 111 +253f8 4 1416 111 +253fc 8 1416 111 +25404 8 1416 111 +2540c c 1416 111 +25418 8 1416 111 +25420 8 1416 111 +25428 c 1416 111 +25434 8 1416 111 +2543c 4 1416 111 +25440 4 1416 111 +25444 10 1416 111 +25454 c 1416 111 +25460 8 1416 111 +25468 4 1416 111 +2546c 4 1416 111 +25470 4 1416 111 +25474 4 1416 111 +25478 8 1416 111 +25480 4 1416 111 +25484 4 1416 111 +25488 8 1416 111 +25490 4 1416 111 +25494 c 1416 111 +FUNC 254a0 c 0 std::basic_iostream >::~basic_iostream +254a0 4 1415 111 +254a4 8 1416 111 +FUNC 254ac cc 0 std::basic_stringstream, std::allocator >::~basic_stringstream +254ac c 453 126 +254b8 8 453 126 +254c0 4 454 126 +254c4 8 454 126 +254cc c 454 126 +254d8 4 454 126 +254dc 4 454 126 +254e0 4 454 126 +254e4 4 454 126 +254e8 8 454 126 +254f0 8 454 126 +254f8 c 454 126 +25504 8 454 126 +2550c 8 454 126 +25514 c 454 126 +25520 18 454 126 +25538 8 454 126 +25540 4 454 126 +25544 4 454 126 +25548 4 454 126 +2554c 4 454 126 +25550 8 454 126 +25558 4 454 126 +2555c 4 454 126 +25560 8 454 126 +25568 4 454 126 +2556c c 454 126 +FUNC 25578 c 0 std::basic_stringstream, std::allocator >::~basic_stringstream +25578 4 453 126 +2557c 8 454 126 +FUNC 25584 c 0 std::basic_stringstream, std::allocator >::~basic_stringstream +25584 c 454 126 +FUNC 255a8 24 0 std::basic_stringstream, std::allocator >::~basic_stringstream +255a8 c 453 126 +255b4 4 453 126 +255b8 4 454 126 +255bc 4 454 126 +255c0 8 454 126 +255c8 4 454 126 +FUNC 255e4 c 0 std::basic_iostream >::~basic_iostream +255e4 c 1416 111 +FUNC 25608 24 0 std::basic_iostream >::~basic_iostream +25608 c 1415 111 +25614 4 1415 111 +25618 4 1416 111 +2561c 4 1416 111 +25620 8 1416 111 +25628 4 1416 111 +FUNC 25644 5c 0 std::basic_ostream >::flush +25644 c 134 122 +25650 4 134 122 +25654 14 135 122 +25668 c 153 129 +25674 8 136 122 +2567c 14 137 122 +25690 10 139 122 +FUNC 256a0 78 0 std::priv::__init_bostr > +256a0 4 218 122 +256a4 4 228 122 +256a8 8 218 122 +256b0 4 218 122 +256b4 14 219 122 +256c8 8 221 122 +256d0 8 222 122 +256d8 14 223 122 +256ec 4 224 122 +256f0 c 225 122 +256fc c 174 110 +25708 10 229 122 +FUNC 25718 50 0 std::basic_ostream >::sentry::~sentry +25718 c 184 122 +25724 1c 185 122 +25740 c 187 122 +2574c 4 189 122 +25750 8 190 122 +25758 4 189 122 +2575c c 190 122 +FUNC 25768 13c 0 std::basic_ostream >::_M_put_nowiden +25768 10 331 121 +25778 8 331 121 +25780 10 181 122 +25790 4 333 121 +25794 c 229 140 +257a0 18 336 121 +257b8 8 339 121 +257c0 8 340 121 +257c8 c 341 121 +257d4 4 342 121 +257d8 4 341 121 +257dc c 342 121 +257e8 8 343 121 +257f0 8 343 121 +257f8 10 344 121 +25808 14 209 129 +2581c 8 343 121 +25824 14 209 129 +25838 8 348 121 +25840 c 348 121 +2584c 10 348 121 +2585c 8 348 121 +25864 4 351 121 +25868 c 139 110 +25874 4 357 121 +25878 14 358 121 +2588c 8 359 121 +25894 10 360 121 +FUNC 258a4 c0 0 std::priv::__put_num, long int> +258a4 10 194 121 +258b4 8 194 121 +258bc 10 181 122 +258cc 4 199 121 +258d0 18 211 121 +258e8 4 202 121 +258ec 4 145 110 +258f0 4 202 121 +258f4 4 145 110 +258f8 4 202 121 +258fc 8 145 110 +25904 8 202 121 +2590c 4 67 120 +25910 4 202 121 +25914 8 67 120 +2591c c 202 121 +25928 4 67 120 +2592c 4 57 123 +25930 c 67 120 +2593c 8 202 121 +25944 4 210 121 +25948 8 212 121 +25950 14 213 121 +FUNC 25964 104 0 std::operator<< , std::allocator > +25964 14 30 133 +25978 8 30 133 +25980 10 181 122 +25990 4 41 133 +25994 18 62 133 +259ac c 400 131 +259b8 c 44 133 +259c4 4 138 110 +259c8 4 139 110 +259cc 4 44 133 +259d0 4 50 133 +259d4 4 46 133 +259d8 8 50 133 +259e0 14 52 133 +259f4 10 55 133 +25a04 c 55 133 +25a10 14 53 133 +25a24 8 55 133 +25a2c 4 57 133 +25a30 14 58 133 +25a44 4 58 133 +25a48 8 64 133 +25a50 18 65 133 +FUNC 25a68 c0 0 std::priv::__put_num, void const*> +25a68 10 194 121 +25a78 8 194 121 +25a80 10 181 122 +25a90 4 199 121 +25a94 18 211 121 +25aac 4 202 121 +25ab0 4 145 110 +25ab4 4 202 121 +25ab8 4 145 110 +25abc 4 202 121 +25ac0 8 145 110 +25ac8 8 202 121 +25ad0 4 101 120 +25ad4 4 202 121 +25ad8 8 101 120 +25ae0 c 202 121 +25aec 4 101 120 +25af0 4 57 123 +25af4 c 101 120 +25b00 8 202 121 +25b08 4 210 121 +25b0c 8 212 121 +25b14 14 213 121 +FUNC 25b28 2c 0 std::priv::_String_base >::_M_rest +25b28 4 64 132 +25b2c 8 74 132 +25b34 10 74 132 +25b44 c 74 132 +25b50 4 74 132 +FUNC 25b54 5c 0 std::basic_string, std::allocator >::_M_compute_next_size +25b54 8 302 131 +25b5c c 400 131 +25b68 10 304 131 +25b78 18 600 130 +25b90 4 306 131 +25b94 10 307 131 +25ba4 4 308 131 +25ba8 8 310 131 +FUNC 25bb0 164 0 std::basic_string, std::allocator >::_M_append +25bb0 4 196 130 +25bb4 4 197 130 +25bb8 10 196 130 +25bc8 c 196 130 +25bd4 4 197 130 +25bd8 4 198 130 +25bdc c 199 130 +25be8 10 200 130 +25bf8 4 356 101 +25bfc 4 346 101 +25c00 4 347 101 +25c04 8 158 101 +25c0c 8 134 119 +25c14 8 158 101 +25c1c 4 352 101 +25c20 8 158 101 +25c28 10 86 137 +25c38 c 86 137 +25c44 10 146 103 +25c54 1c 86 137 +25c70 10 146 103 +25c80 8 205 130 +25c88 8 206 130 +25c90 4 101 103 +25c94 4 205 130 +25c98 4 160 132 +25c9c 4 164 132 +25ca0 8 165 132 +25ca8 4 210 130 +25cac 4 211 130 +25cb0 c 86 137 +25cbc 18 86 137 +25cd4 8 146 103 +25cdc 10 101 103 +25cec 4 232 140 +25cf0 c 214 130 +25cfc 18 218 130 +FUNC 25d14 90 0 std::basic_string, std::allocator >::_M_assign +25d14 10 242 130 +25d24 4 243 130 +25d28 4 242 130 +25d2c c 242 130 +25d38 8 400 131 +25d40 8 244 130 +25d48 4 168 140 +25d4c 8 168 140 +25d54 4 246 130 +25d58 14 246 130 +25d6c 4 168 140 +25d70 4 168 140 +25d74 4 400 131 +25d78 4 250 130 +25d7c 8 400 131 +25d84 c 250 130 +25d90 14 253 130 +FUNC 25da4 234 0 google_breakpad::AutoTempDir::AutoTempDir +25da4 c 54 63 +25db0 8 54 63 +25db8 c 54 63 +25dc4 4 63 35 +25dc8 4 54 63 +25dcc 4 54 63 +25dd0 14 55 63 +25de4 8 63 35 +25dec 8 55 63 +25df4 18 63 35 +25e0c c 64 35 +25e18 8 65 35 +25e20 c 67 35 +25e2c 18 68 35 +25e44 4 67 35 +25e48 c 69 35 +25e54 10 75 35 +25e64 4 76 35 +25e68 4 79 35 +25e6c c 80 35 +25e78 8 81 35 +25e80 4 82 35 +25e84 10 84 35 +25e94 10 85 35 +25ea4 4 96 35 +25ea8 4 54 63 +25eac 8 96 35 +25eb4 14 94 35 +25ec8 4 96 35 +25ecc 8 94 35 +25ed4 c 96 35 +25ee0 10 97 35 +25ef0 10 100 35 +25f00 c 93 35 +25f0c 8 98 35 +25f14 4 101 35 +25f18 4 56 63 +25f1c 4 1139 87 +25f20 4 56 63 +25f24 4 277 82 +25f28 4 56 63 +25f2c 20 56 63 +25f4c 4 56 63 +25f50 4 56 63 +25f54 4 56 63 +25f58 1c 56 63 +25f74 8 56 63 +25f7c c 56 63 +25f88 8 85 79 +25f90 8 56 63 +25f98 8 156 132 +25fa0 8 256 82 +25fa8 8 229 140 +25fb0 4 563 131 +25fb4 c 563 131 +25fc0 18 58 63 +FUNC 25fd8 34 0 std::basic_string, std::allocator >::operator= +25fd8 c 353 131 +25fe4 4 353 131 +25fe8 c 229 140 +25ff4 8 355 131 +25ffc 4 355 131 +26000 8 356 131 +26008 4 355 131 +FUNC 2600c 24 0 SimpleCallback +2600c 4 1148 6 +26010 4 1150 6 +26014 8 1148 6 +2601c 8 1150 6 +26024 c 1152 6 +FUNC 26030 98 0 testing::AssertionResult::AppendMessage +26030 14 320 82 +26044 4 320 82 +26048 4 1144 87 +2604c 4 320 82 +26050 c 321 82 +2605c c 322 82 +26068 8 322 82 +26070 c 322 82 +2607c 8 323 82 +26084 4 1143 87 +26088 8 323 82 +26090 c 229 140 +2609c 8 530 131 +260a4 8 530 131 +260ac 8 156 132 +260b4 14 324 82 +FUNC 260c8 c0 0 std::priv::__put_num, long unsigned int> +260c8 10 194 121 +260d8 8 194 121 +260e0 10 181 122 +260f0 4 199 121 +260f4 18 211 121 +2610c 4 202 121 +26110 4 145 110 +26114 4 202 121 +26118 4 145 110 +2611c 4 202 121 +26120 8 145 110 +26128 8 202 121 +26130 4 72 120 +26134 4 202 121 +26138 8 72 120 +26140 c 202 121 +2614c 4 72 120 +26150 4 57 123 +26154 c 72 120 +26160 8 202 121 +26168 4 210 121 +2616c 8 212 121 +26174 14 213 121 +FUNC 26188 54 0 testing::AssertionResult::operator<< +26188 c 305 82 +26194 4 306 82 +26198 4 305 82 +2619c 4 306 82 +261a0 4 305 82 +261a4 4 306 82 +261a8 10 333 122 +261b8 c 306 82 +261c4 8 85 79 +261cc 10 308 82 +FUNC 261dc 64 0 testing::AssertionResult::operator<< +261dc c 305 82 +261e8 4 306 82 +261ec 4 305 82 +261f0 4 306 82 +261f4 4 305 82 +261f8 10 306 82 +26208 4 333 122 +2620c 4 150 79 +26210 c 333 122 +2621c c 306 82 +26228 8 85 79 +26230 10 308 82 +FUNC 26240 54 0 testing::AssertionResult::operator<< +26240 c 305 82 +2624c 4 306 82 +26250 4 305 82 +26254 4 306 82 +26258 4 305 82 +2625c 4 306 82 +26260 10 333 122 +26270 c 306 82 +2627c 8 85 79 +26284 10 308 82 +FUNC 26294 54 0 testing::AssertionResult::operator<< , std::allocator > > +26294 c 305 82 +262a0 4 306 82 +262a4 4 305 82 +262a8 4 306 82 +262ac 4 305 82 +262b0 4 306 82 +262b4 10 131 79 +262c4 c 306 82 +262d0 8 85 79 +262d8 10 308 82 +FUNC 262e8 54 0 testing::AssertionResult::operator<< +262e8 c 305 82 +262f4 4 306 82 +262f8 4 305 82 +262fc 4 306 82 +26300 4 305 82 +26304 4 306 82 +26308 10 333 122 +26318 c 306 82 +26324 8 85 79 +2632c 10 308 82 +FUNC 2633c 104 0 std::basic_string, std::allocator >::_M_appendT +2633c 4 468 131 +26340 4 470 131 +26344 14 468 131 +26358 8 468 131 +26360 4 470 131 +26364 4 355 114 +26368 c 472 131 +26374 10 473 131 +26384 4 356 101 +26388 4 346 101 +2638c 4 347 101 +26390 8 158 101 +26398 8 134 119 +263a0 8 158 101 +263a8 4 352 101 +263ac 4 353 101 +263b0 c 120 137 +263bc 4 479 131 +263c0 8 120 137 +263c8 10 148 137 +263d8 4 101 103 +263dc 8 478 131 +263e4 4 160 132 +263e8 4 164 132 +263ec c 165 132 +263f8 8 482 131 +26400 4 232 140 +26404 4 148 137 +26408 4 483 131 +2640c 8 148 137 +26414 8 101 103 +2641c c 485 131 +26428 18 489 131 +FUNC 26440 8c 0 std::operator+, std::allocator > +26440 10 80 134 +26450 4 229 140 +26454 8 80 134 +2645c 4 80 134 +26460 4 229 140 +26464 4 400 131 +26468 4 229 140 +2646c 4 400 131 +26470 4 124 132 +26474 4 120 132 +26478 4 400 131 +2647c 8 481 101 +26484 c 124 132 +26490 4 101 103 +26494 10 517 131 +264a4 14 497 131 +264b8 14 94 134 +FUNC 264cc 370 0 google_breakpad::AutoTempDir::DeleteRecursively +264cc 1c 69 63 +264e8 8 69 63 +264f0 c 71 63 +264fc 4 72 63 +26500 4 77 63 +26504 4 277 82 +26508 4 77 63 +2650c 4 79 63 +26510 4 256 82 +26514 10 76 63 +26524 14 77 63 +26538 10 77 63 +26548 4 77 63 +2654c 10 79 63 +2655c 4 79 63 +26560 4 79 63 +26564 10 79 63 +26574 8 156 132 +2657c c 81 63 +26588 8 81 63 +26590 4 1139 87 +26594 4 277 82 +26598 4 81 63 +2659c 24 81 63 +265c0 4 81 63 +265c4 4 81 63 +265c8 4 81 63 +265cc 1c 81 63 +265e8 8 81 63 +265f0 c 81 63 +265fc 8 85 79 +26604 8 81 63 +2660c 8 156 132 +26614 8 256 82 +2661c 10 82 63 +2662c 10 83 63 +2663c 8 85 63 +26644 8 85 63 +2664c 4 1139 87 +26650 4 277 82 +26654 4 85 63 +26658 24 85 63 +2667c 4 85 63 +26680 4 85 63 +26684 4 85 63 +26688 1c 85 63 +266a4 8 85 63 +266ac c 85 63 +266b8 8 85 79 +266c0 8 85 63 +266c8 8 156 132 +266d0 8 256 82 +266d8 c 156 132 +266e4 4 87 63 +266e8 4 277 82 +266ec c 87 63 +266f8 4 1139 87 +266fc 4 277 82 +26700 4 87 63 +26704 24 87 63 +26728 4 87 63 +2672c 4 87 63 +26730 4 87 63 +26734 1c 87 63 +26750 8 87 63 +26758 c 87 63 +26764 8 85 79 +2676c 8 87 63 +26774 8 156 132 +2677c 8 256 82 +26784 8 88 63 +2678c 8 88 63 +26794 4 1139 87 +26798 4 277 82 +2679c 4 88 63 +267a0 24 88 63 +267c4 4 88 63 +267c8 4 88 63 +267cc 4 88 63 +267d0 1c 88 63 +267ec 8 88 63 +267f4 c 88 63 +26800 8 85 79 +26808 8 88 63 +26810 8 156 132 +26818 8 256 82 +26820 1c 89 63 +FUNC 2683c 28 0 google_breakpad::AutoTempDir::~AutoTempDir +2683c 4 60 63 +26840 4 61 63 +26844 8 60 63 +2684c 4 60 63 +26850 4 61 63 +26854 4 156 132 +26858 8 62 63 +26860 4 156 132 +FUNC 26864 70 0 CreateTMPFile +26864 10 99 6 +26874 4 100 6 +26878 4 99 6 +2687c 10 100 6 +2688c c 103 6 +26898 8 104 6 +268a0 4 105 6 +268a4 c 106 6 +268b0 8 107 6 +268b8 8 156 132 +268c0 14 109 6 +FUNC 268d4 b0 0 ExceptionHandlerTest_SimpleWithFD_Test::TestBody +268d4 c 170 6 +268e0 4 171 6 +268e4 4 170 6 +268e8 4 171 6 +268ec 4 174 6 +268f0 4 170 6 +268f4 4 171 6 +268f8 14 172 6 +2690c 10 173 6 +2691c c 174 6 +26928 20 174 6 +26948 8 174 6 +26950 8 175 6 +26958 8 174 6 +26960 8 156 132 +26968 8 175 6 +26970 14 176 6 +FUNC 26984 124 0 std::basic_stringbuf, std::allocator >::xsputn +26984 4 170 126 +26988 4 174 126 +2698c 10 170 126 +2699c c 170 126 +269a8 4 174 126 +269ac 4 174 126 +269b0 c 174 126 +269bc 8 177 126 +269c4 c 177 126 +269d0 4 172 126 +269d4 14 193 126 +269e8 c 194 126 +269f4 10 497 131 +26a04 4 197 126 +26a08 4 93 129 +26a0c 4 94 129 +26a10 8 95 129 +26a18 10 497 131 +26a28 4 400 131 +26a2c 4 117 129 +26a30 4 400 131 +26a34 4 115 129 +26a38 4 119 129 +26a3c 4 115 129 +26a40 8 205 126 +26a48 c 172 126 +26a54 4 178 126 +26a58 8 179 126 +26a60 4 172 140 +26a64 4 172 140 +26a68 c 115 129 +26a74 8 182 126 +26a7c 4 172 140 +26a80 8 172 140 +26a88 4 186 126 +26a8c 8 187 126 +26a94 14 209 126 +FUNC 26aa8 88 0 testing::PrintToString +26aa8 4 883 80 +26aac 4 884 80 +26ab0 8 883 80 +26ab8 4 884 80 +26abc 4 883 80 +26ac0 4 883 80 +26ac4 4 884 80 +26ac8 4 883 80 +26acc 4 884 80 +26ad0 18 238 121 +26ae8 4 240 121 +26aec 4 239 121 +26af0 8 239 121 +26af8 4 239 121 +26afc 4 239 121 +26b00 8 240 121 +26b08 c 75 127 +26b14 8 886 80 +26b1c 14 887 80 +FUNC 26b30 114 0 testing::internal::CmpHelperOpFailure +26b30 c 1579 82 +26b3c 4 1583 82 +26b40 8 1579 82 +26b48 4 1579 82 +26b4c 4 1583 82 +26b50 4 1579 82 +26b54 4 1382 82 +26b58 10 1579 82 +26b68 4 1583 82 +26b6c 10 1583 82 +26b7c 8 1583 82 +26b84 c 1583 82 +26b90 8 1583 82 +26b98 c 1583 82 +26ba4 8 1583 82 +26bac 10 1584 82 +26bbc 10 1382 82 +26bcc 8 1584 82 +26bd4 4 1382 82 +26bd8 4 1584 82 +26bdc 10 1585 82 +26bec 10 1382 82 +26bfc 10 1585 82 +26c0c 8 1585 82 +26c14 10 156 132 +26c24 8 256 82 +26c2c 18 1586 82 +FUNC 26c44 44 0 testing::internal::CmpHelperNE +26c44 14 1615 82 +26c58 c 1615 82 +26c64 4 1615 82 +26c68 4 1615 82 +26c6c c 1615 82 +26c78 10 1615 82 +FUNC 26c88 9c 0 testing::internal::CmpHelperEQ +26c88 10 1476 82 +26c98 8 1476 82 +26ca0 10 1481 82 +26cb0 8 1482 82 +26cb8 2c 1382 82 +26ce4 1c 1471 82 +26d00 10 156 132 +26d10 14 1488 82 +FUNC 26d24 1f8 0 WaitForProcessToTerminate +26d24 14 129 6 +26d38 8 129 6 +26d40 20 131 6 +26d60 4 131 6 +26d64 c 131 6 +26d70 c 131 6 +26d7c 30 131 6 +26dac 8 131 6 +26db4 c 302 82 +26dc0 18 131 6 +26dd8 c 256 82 +26de4 4 1139 87 +26de8 14 132 6 +26dfc 4 277 82 +26e00 4 132 6 +26e04 20 132 6 +26e24 4 132 6 +26e28 4 132 6 +26e2c 1c 132 6 +26e48 8 132 6 +26e50 c 132 6 +26e5c 8 85 79 +26e64 8 132 6 +26e6c 8 156 132 +26e74 10 256 82 +26e84 4 133 6 +26e88 c 1512 82 +26e94 8 133 6 +26e9c 14 1512 82 +26eb0 8 133 6 +26eb8 c 302 82 +26ec4 18 133 6 +26edc 8 133 6 +26ee4 c 133 6 +26ef0 8 85 79 +26ef8 8 133 6 +26f00 8 256 82 +26f08 14 134 6 +FUNC 26f1c 5c 0 testing::PrintToString +26f1c 4 883 80 +26f20 4 884 80 +26f24 8 883 80 +26f2c 4 884 80 +26f30 4 883 80 +26f34 4 883 80 +26f38 4 884 80 +26f3c 4 883 80 +26f40 4 884 80 +26f44 c 259 121 +26f50 c 75 127 +26f5c 8 886 80 +26f64 14 887 80 +FUNC 26f78 9c 0 testing::internal::CmpHelperEQ +26f78 10 1476 82 +26f88 8 1476 82 +26f90 10 1481 82 +26fa0 8 1482 82 +26fa8 2c 1382 82 +26fd4 1c 1471 82 +26ff0 10 156 132 +27000 14 1488 82 +FUNC 27014 9c 0 testing::internal::CmpHelperEQ +27014 10 1476 82 +27024 8 1476 82 +2702c 10 1481 82 +2703c 8 1482 82 +27044 2c 1382 82 +27070 1c 1471 82 +2708c 10 156 132 +2709c 14 1488 82 +FUNC 270b0 39c 0 ReadMinidumpPathFromPipe +270b0 10 137 6 +270c0 4 139 6 +270c4 8 137 6 +270cc 4 140 6 +270d0 4 137 6 +270d4 4 141 6 +270d8 4 143 6 +270dc 4 137 6 +270e0 4 141 6 +270e4 1c 143 6 +27100 4 143 6 +27104 c 143 6 +27110 4 144 6 +27114 4 143 6 +27118 4 144 6 +2711c 30 1512 82 +2714c 8 144 6 +27154 c 302 82 +27160 18 144 6 +27178 10 256 82 +27188 4 1139 87 +2718c 8 145 6 +27194 4 277 82 +27198 4 145 6 +2719c 24 145 6 +271c0 1c 145 6 +271dc 8 145 6 +271e4 c 145 6 +271f0 8 85 79 +271f8 8 145 6 +27200 c 156 132 +2720c 8 256 82 +27214 18 148 6 +2722c 20 1512 82 +2724c 8 148 6 +27254 c 302 82 +27260 18 148 6 +27278 8 148 6 +27280 c 148 6 +2728c 8 85 79 +27294 8 148 6 +2729c 10 256 82 +272ac 8 149 6 +272b4 4 1619 82 +272b8 4 1619 82 +272bc 8 1619 82 +272c4 8 1619 82 +272cc 24 1619 82 +272f0 8 149 6 +272f8 c 302 82 +27304 18 149 6 +2731c 8 149 6 +27324 c 149 6 +27330 8 85 79 +27338 8 149 6 +27340 14 256 82 +27354 14 150 6 +27368 14 151 6 +2737c 20 1512 82 +2739c 8 151 6 +273a4 c 302 82 +273b0 18 151 6 +273c8 8 151 6 +273d0 c 151 6 +273dc 8 85 79 +273e4 8 151 6 +273ec 8 256 82 +273f4 18 156 6 +2740c 8 256 82 +27414 8 152 6 +2741c 8 153 6 +27424 c 154 6 +27430 4 155 6 +27434 14 156 6 +27448 4 155 6 +FUNC 2744c 134 0 testing::internal::CmpHelperGT +2744c 14 1623 82 +27460 14 1623 82 +27474 4 1623 82 +27478 4 1623 82 +2747c 1c 1583 82 +27498 c 1382 82 +274a4 4 1583 82 +274a8 10 1583 82 +274b8 8 1583 82 +274c0 c 1583 82 +274cc 8 1583 82 +274d4 c 1583 82 +274e0 8 1583 82 +274e8 10 1584 82 +274f8 10 1382 82 +27508 8 1584 82 +27510 4 1382 82 +27514 4 1584 82 +27518 10 1585 82 +27528 10 1382 82 +27538 10 1585 82 +27548 8 1585 82 +27550 10 156 132 +27560 8 256 82 +27568 18 1623 82 +FUNC 27580 2d0 0 ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test::TestBody +27580 10 1019 6 +27590 8 1020 6 +27598 c 1019 6 +275a4 8 1021 6 +275ac 4 1019 6 +275b0 4 1020 6 +275b4 4 1023 6 +275b8 8 1021 6 +275c0 4 277 82 +275c4 4 1021 6 +275c8 4 1139 87 +275cc 10 1022 6 +275dc c 1023 6 +275e8 20 1023 6 +27608 8 1023 6 +27610 8 1024 6 +27618 4 277 82 +2761c 4 1024 6 +27620 4 1139 87 +27624 4 1024 6 +27628 20 1024 6 +27648 4 1024 6 +2764c 4 1024 6 +27650 18 1024 6 +27668 4 256 82 +2766c 4 1027 6 +27670 8 1028 6 +27678 4 256 82 +2767c 4 1028 6 +27680 c 1027 6 +2768c 8 1028 6 +27694 8 1027 6 +2769c 24 1028 6 +276c0 4 302 82 +276c4 4 1028 6 +276c8 8 302 82 +276d0 18 1028 6 +276e8 8 256 82 +276f0 8 1031 6 +276f8 4 1139 87 +276fc 4 1031 6 +27700 4 277 82 +27704 4 1031 6 +27708 20 1031 6 +27728 4 1031 6 +2772c 4 1031 6 +27730 18 1031 6 +27748 4 1031 6 +2774c 4 1031 6 +27750 8 1031 6 +27758 c 1031 6 +27764 8 85 79 +2776c 8 1031 6 +27774 8 156 132 +2777c 10 256 82 +2778c 14 1032 6 +277a0 24 1033 6 +277c4 4 302 82 +277c8 4 1033 6 +277cc 8 302 82 +277d4 18 1033 6 +277ec 8 1033 6 +277f4 c 1033 6 +27800 8 85 79 +27808 8 1033 6 +27810 10 256 82 +27820 10 156 132 +27830 20 1034 6 +FUNC 27850 88 0 testing::PrintToString +27850 4 883 80 +27854 4 884 80 +27858 8 883 80 +27860 4 884 80 +27864 4 883 80 +27868 4 884 80 +2786c 4 883 80 +27870 4 883 80 +27874 c 884 80 +27880 4 310 80 +27884 14 333 122 +27898 10 318 80 +278a8 8 291 121 +278b0 c 75 127 +278bc 8 886 80 +278c4 14 887 80 +FUNC 278d8 114 0 testing::internal::CmpHelperOpFailure +278d8 c 1579 82 +278e4 4 1583 82 +278e8 8 1579 82 +278f0 4 1579 82 +278f4 4 1583 82 +278f8 4 1579 82 +278fc 4 1382 82 +27900 10 1579 82 +27910 4 1583 82 +27914 10 1583 82 +27924 8 1583 82 +2792c c 1583 82 +27938 8 1583 82 +27940 c 1583 82 +2794c 8 1583 82 +27954 10 1584 82 +27964 10 1382 82 +27974 8 1584 82 +2797c 4 1382 82 +27980 4 1584 82 +27984 10 1585 82 +27994 10 1382 82 +279a4 10 1585 82 +279b4 8 1585 82 +279bc 10 156 132 +279cc 8 256 82 +279d4 18 1586 82 +FUNC 279ec 5c 0 testing::PrintToString +279ec 4 883 80 +279f0 4 884 80 +279f4 8 883 80 +279fc 4 884 80 +27a00 4 883 80 +27a04 4 883 80 +27a08 4 884 80 +27a0c 4 883 80 +27a10 4 884 80 +27a14 c 254 121 +27a20 c 75 127 +27a2c 8 886 80 +27a34 14 887 80 +FUNC 27a48 134 0 testing::internal::CmpHelperLT +27a48 14 1619 82 +27a5c 14 1619 82 +27a70 4 1619 82 +27a74 4 1619 82 +27a78 1c 1583 82 +27a94 c 1382 82 +27aa0 4 1583 82 +27aa4 10 1583 82 +27ab4 8 1583 82 +27abc c 1583 82 +27ac8 8 1583 82 +27ad0 c 1583 82 +27adc 8 1583 82 +27ae4 10 1584 82 +27af4 10 1382 82 +27b04 8 1584 82 +27b0c 4 1382 82 +27b10 4 1584 82 +27b14 10 1585 82 +27b24 10 1382 82 +27b34 10 1585 82 +27b44 8 1585 82 +27b4c 10 156 132 +27b5c 8 256 82 +27b64 18 1619 82 +FUNC 27b7c 9c 0 testing::internal::CmpHelperEQ +27b7c 10 1476 82 +27b8c 8 1476 82 +27b94 10 1481 82 +27ba4 8 1482 82 +27bac 2c 1382 82 +27bd8 1c 1471 82 +27bf4 10 156 132 +27c04 14 1488 82 +FUNC 27c18 158 0 testing::internal::CmpHelperEQFailure +27c18 c 1464 82 +27c24 4 884 80 +27c28 14 1464 82 +27c3c 8 884 80 +27c44 4 1464 82 +27c48 c 1464 82 +27c54 8 884 80 +27c5c 20 181 122 +27c7c 4 199 121 +27c80 1c 211 121 +27c9c 4 202 121 +27ca0 4 145 110 +27ca4 4 202 121 +27ca8 4 145 110 +27cac 4 202 121 +27cb0 8 145 110 +27cb8 8 202 121 +27cc0 4 202 121 +27cc4 4 78 120 +27cc8 8 202 121 +27cd0 c 78 120 +27cdc 4 57 123 +27ce0 10 78 120 +27cf0 8 202 121 +27cf8 4 210 121 +27cfc 8 212 121 +27d04 c 75 127 +27d10 8 886 80 +27d18 c 1382 82 +27d24 1c 1471 82 +27d40 10 156 132 +27d50 20 1472 82 +FUNC 27d70 5c 0 testing::PrintToString, std::allocator > > +27d70 4 883 80 +27d74 4 884 80 +27d78 8 883 80 +27d80 4 884 80 +27d84 4 883 80 +27d88 4 883 80 +27d8c 4 884 80 +27d90 4 883 80 +27d94 4 884 80 +27d98 c 469 80 +27da4 c 75 127 +27db0 8 886 80 +27db8 14 887 80 +FUNC 27dcc c0 0 testing::internal::CmpHelperEQ, std::allocator >, std::basic_string, std::allocator > > +27dcc 14 1476 82 +27de0 18 1476 82 +27df8 4 400 131 +27dfc 4 1476 82 +27e00 c 400 131 +27e0c 8 289 134 +27e14 4 226 140 +27e18 4 289 134 +27e1c 20 1382 82 +27e3c 1c 1471 82 +27e58 14 156 132 +27e6c 8 1482 82 +27e74 18 1488 82 +FUNC 27e8c 1e8 0 ExceptionHandlerTest_SimpleWithPath_Test::TestBody +27e8c 10 160 6 +27e9c 4 161 6 +27ea0 4 1512 82 +27ea4 4 161 6 +27ea8 8 160 6 +27eb0 4 163 6 +27eb4 4 161 6 +27eb8 8 163 6 +27ec0 4 163 6 +27ec4 4 1512 82 +27ec8 8 163 6 +27ed0 20 163 6 +27ef0 8 163 6 +27ef8 c 87 8 +27f04 20 1512 82 +27f24 8 156 132 +27f2c 8 164 6 +27f34 c 302 82 +27f40 18 164 6 +27f58 8 164 6 +27f60 c 164 6 +27f6c 8 85 79 +27f74 8 164 6 +27f7c 8 256 82 +27f84 14 165 6 +27f98 c 166 6 +27fa4 c 140 5 +27fb0 8 166 6 +27fb8 c 87 8 +27fc4 1c 1512 82 +27fe0 8 156 132 +27fe8 8 167 6 +27ff0 4 302 82 +27ff4 4 167 6 +27ff8 8 302 82 +28000 18 167 6 +28018 8 167 6 +28020 c 167 6 +2802c 8 85 79 +28034 8 167 6 +2803c 8 256 82 +28044 8 156 132 +2804c 8 163 6 +28054 8 167 6 +2805c 18 168 6 +FUNC 28074 5c 0 testing::PrintToString +28074 4 883 80 +28078 4 884 80 +2807c 8 883 80 +28084 4 884 80 +28088 4 883 80 +2808c 4 883 80 +28090 4 884 80 +28094 4 883 80 +28098 4 884 80 +2809c c 263 121 +280a8 c 75 127 +280b4 8 886 80 +280bc 14 887 80 +FUNC 280d0 9c 0 testing::internal::CmpHelperEQ +280d0 10 1476 82 +280e0 8 1476 82 +280e8 10 1481 82 +280f8 8 1482 82 +28100 2c 1382 82 +2812c 1c 1471 82 +28148 10 156 132 +28158 14 1488 82 +FUNC 2816c 9c 0 testing::internal::CmpHelperEQ +2816c 10 1476 82 +2817c 8 1476 82 +28184 10 1481 82 +28194 8 1482 82 +2819c 2c 1382 82 +281c8 1c 1471 82 +281e4 10 156 132 +281f4 14 1488 82 +FUNC 28208 9c 0 testing::internal::CmpHelperEQ +28208 10 1476 82 +28218 8 1476 82 +28220 10 1481 82 +28230 8 1482 82 +28238 2c 1382 82 +28264 1c 1471 82 +28280 10 156 132 +28290 14 1488 82 +FUNC 282a4 28 0 std::fpos::fpos +282a4 4 89 140 +282a8 10 89 140 +282b8 10 89 140 +282c8 4 89 140 +FUNC 282cc 20 0 std::basic_streambuf >::seekpos +282cc 4 188 128 +282d0 4 189 128 +282d4 4 188 128 +282d8 14 189 128 +FUNC 282ec 20 0 std::basic_streambuf >::seekoff +282ec 4 193 128 +282f0 4 195 128 +282f4 4 193 128 +282f8 14 195 128 +FUNC 2830c 110 0 std::basic_stringbuf, std::allocator >::seekoff +2830c 10 299 126 +2831c 8 303 126 +28324 4 305 126 +28328 4 306 126 +2832c 10 308 126 +2833c 4 311 126 +28340 8 311 126 +28348 4 311 126 +2834c 8 311 126 +28354 8 315 126 +2835c 4 323 126 +28360 c 323 126 +2836c 4 332 126 +28370 8 324 126 +28378 8 335 126 +28380 8 337 126 +28388 c 312 126 +28394 8 353 126 +2839c c 323 126 +283a8 4 332 126 +283ac 8 324 126 +283b4 4 337 126 +283b8 4 339 126 +283bc 4 94 129 +283c0 8 343 126 +283c8 8 344 126 +283d0 c 346 126 +283dc 8 115 129 +283e4 8 352 126 +283ec 8 315 126 +283f4 c 400 131 +28400 4 321 126 +28404 8 315 126 +2840c 4 317 126 +28410 4 332 126 +28414 8 334 126 +FUNC 2841c 124 0 std::basic_stringbuf, std::allocator >::seekpos +2841c 14 357 126 +28430 8 357 126 +28438 4 359 126 +2843c 8 357 126 +28444 4 359 126 +28448 4 362 126 +2844c 4 361 126 +28450 c 364 126 +2845c 4 367 126 +28460 c 367 126 +2846c 4 367 126 +28470 8 367 126 +28478 c 370 126 +28484 8 104 140 +2848c 4 372 126 +28490 8 373 126 +28498 14 373 126 +284ac 4 378 126 +284b0 c 379 126 +284bc 4 400 131 +284c0 c 379 126 +284cc 4 375 126 +284d0 4 94 129 +284d4 4 378 126 +284d8 c 386 126 +284e4 18 380 126 +284fc 4 115 129 +28500 4 117 129 +28504 4 119 129 +28508 8 115 129 +28510 4 367 126 +28514 c 370 126 +28520 c 104 140 +2852c 14 387 126 +FUNC 28540 b0 0 std::basic_string, std::allocator >::_M_reserve +28540 10 170 130 +28550 4 170 130 +28554 4 356 101 +28558 4 346 101 +2855c 4 347 101 +28560 8 158 101 +28568 c 134 119 +28574 8 158 101 +2857c 4 352 101 +28580 8 158 101 +28588 10 86 137 +28598 c 86 137 +285a4 10 146 103 +285b4 10 174 130 +285c4 4 101 103 +285c8 4 174 130 +285cc 4 164 132 +285d0 4 175 130 +285d4 4 165 132 +285d8 4 175 130 +285dc 4 176 130 +285e0 4 160 132 +285e4 c 176 130 +FUNC 285f0 60 0 std::basic_string, std::allocator >::push_back +285f0 c 534 131 +285fc 8 534 131 +28604 10 535 131 +28614 c 536 131 +28620 c 536 131 +2862c 8 101 103 +28634 4 232 140 +28638 c 539 131 +28644 c 540 131 +FUNC 28650 c4 0 std::basic_stringbuf, std::allocator >::overflow +28650 4 142 126 +28654 4 144 126 +28658 c 142 126 +28664 8 142 126 +2866c 4 182 140 +28670 4 144 126 +28674 4 145 126 +28678 4 163 126 +2867c 4 145 126 +28680 14 146 126 +28694 8 147 126 +2869c c 115 129 +286a8 4 149 126 +286ac c 150 126 +286b8 10 151 126 +286c8 4 153 126 +286cc 4 93 129 +286d0 4 94 129 +286d4 8 95 129 +286dc 10 157 126 +286ec 4 117 129 +286f0 4 119 129 +286f4 4 400 131 +286f8 c 115 129 +28704 10 166 126 +FUNC 28714 b8 0 std::basic_string, std::allocator >::append +28714 10 180 130 +28724 c 180 130 +28730 4 181 130 +28734 8 400 131 +2873c 10 182 130 +2874c c 600 130 +28758 c 184 130 +28764 10 185 130 +28774 8 185 130 +2877c c 186 130 +28788 8 249 137 +28790 4 146 103 +28794 8 249 137 +2879c c 101 103 +287a8 4 232 140 +287ac c 189 130 +287b8 14 192 130 +FUNC 287cc 10c 0 std::basic_stringbuf, std::allocator >::_M_xsputnc +287cc 4 213 126 +287d0 4 217 126 +287d4 14 213 126 +287e8 8 213 126 +287f0 4 217 126 +287f4 4 217 126 +287f8 4 217 126 +287fc 4 220 126 +28800 4 215 126 +28804 10 220 126 +28814 4 235 140 +28818 8 221 126 +28820 8 222 126 +28828 4 235 140 +2882c c 115 129 +28838 8 225 126 +28840 4 235 140 +28844 4 230 126 +28848 4 235 140 +2884c c 238 126 +28858 4 239 126 +2885c 4 240 126 +28860 4 239 126 +28864 4 240 126 +28868 4 239 126 +2886c c 240 126 +28878 4 242 126 +2887c 4 93 129 +28880 4 94 129 +28884 8 95 129 +2888c 14 244 126 +288a0 4 400 131 +288a4 4 117 129 +288a8 4 400 131 +288ac 4 115 129 +288b0 4 119 129 +288b4 4 115 129 +288b8 8 250 126 +288c0 4 215 126 +288c4 14 254 126 +FUNC 288d8 f0 0 std::basic_stringbuf, std::allocator >::setbuf +288d8 4 262 126 +288dc 4 263 126 +288e0 10 262 126 +288f0 4 262 126 +288f4 c 263 126 +28900 8 269 126 +28908 4 271 126 +2890c 4 270 126 +28910 8 271 126 +28918 4 267 126 +2891c 8 265 126 +28924 8 274 126 +2892c 4 276 126 +28930 4 275 126 +28934 8 276 126 +2893c 4 266 126 +28940 4 264 126 +28944 4 400 131 +28948 4 279 126 +2894c c 400 131 +28958 4 72 132 +2895c 4 162 130 +28960 4 72 132 +28964 4 72 132 +28968 8 72 132 +28970 8 163 130 +28978 8 166 130 +28980 8 284 126 +28988 4 285 126 +2898c 4 93 129 +28990 4 94 129 +28994 4 95 129 +28998 8 288 126 +289a0 4 115 129 +289a4 4 117 129 +289a8 4 119 129 +289ac 4 115 129 +289b0 18 295 126 +FUNC 289c8 3e4 0 ChildCrash +289c8 c 210 6 +289d4 4 211 6 +289d8 c 210 6 +289e4 4 211 6 +289e8 8 210 6 +289f0 4 214 6 +289f4 4 211 6 +289f8 4 212 6 +289fc c 214 6 +28a08 8 212 6 +28a10 4 214 6 +28a14 4 215 6 +28a18 14 216 6 +28a2c 4 218 6 +28a30 4 218 6 +28a34 10 218 6 +28a44 1c 218 6 +28a60 4 218 6 +28a64 4 218 6 +28a68 8 218 6 +28a70 c 302 82 +28a7c 18 218 6 +28a94 8 218 6 +28a9c c 218 6 +28aa8 8 85 79 +28ab0 8 218 6 +28ab8 10 256 82 +28ac8 8 221 6 +28ad0 4 222 6 +28ad4 4 225 6 +28ad8 c 227 6 +28ae4 c 227 6 +28af0 14 227 6 +28b04 8 229 6 +28b0c 4 230 6 +28b10 8 233 6 +28b18 4 230 6 +28b1c 4 233 6 +28b20 c 233 6 +28b2c 20 233 6 +28b4c 8 233 6 +28b54 10 207 6 +28b64 8 98 57 +28b6c 8 98 57 +28b74 4 239 6 +28b78 8 240 6 +28b80 c 242 6 +28b8c 8 242 6 +28b94 8 242 6 +28b9c 4 242 6 +28ba0 c 242 6 +28bac 8 242 6 +28bb4 8 242 6 +28bbc 10 244 6 +28bcc 20 242 6 +28bec c 245 6 +28bf8 8 245 6 +28c00 8 245 6 +28c08 4 245 6 +28c0c c 245 6 +28c18 8 245 6 +28c20 14 245 6 +28c34 20 245 6 +28c54 8 245 6 +28c5c c 245 6 +28c68 8 85 79 +28c70 8 245 6 +28c78 4 245 6 +28c7c 8 248 6 +28c84 4 248 6 +28c88 c 1552 82 +28c94 4 248 6 +28c98 8 1552 82 +28ca0 4 248 6 +28ca4 1c 1552 82 +28cc0 8 248 6 +28cc8 c 302 82 +28cd4 18 248 6 +28cec 8 256 82 +28cf4 28 249 6 +28d1c c 302 82 +28d28 18 249 6 +28d40 8 249 6 +28d48 c 249 6 +28d54 8 85 79 +28d5c 8 249 6 +28d64 14 256 82 +28d78 8 250 6 +28d80 10 156 132 +28d90 1c 251 6 +FUNC 28dac a8 0 ExceptionHandlerTest_ChildCrashWithPath_Test::TestBody +28dac c 253 6 +28db8 10 254 6 +28dc8 8 254 6 +28dd0 8 254 6 +28dd8 4 254 6 +28ddc 8 254 6 +28de4 8 254 6 +28dec 14 254 6 +28e00 24 254 6 +28e24 8 254 6 +28e2c c 254 6 +28e38 8 85 79 +28e40 8 254 6 +28e48 c 255 6 +FUNC 28e54 a8 0 ExceptionHandlerTest_ChildCrashWithFD_Test::TestBody +28e54 c 257 6 +28e60 10 258 6 +28e70 8 258 6 +28e78 8 258 6 +28e80 4 258 6 +28e84 8 258 6 +28e8c 8 258 6 +28e94 14 258 6 +28ea8 24 258 6 +28ecc 8 258 6 +28ed4 c 258 6 +28ee0 8 85 79 +28ee8 8 258 6 +28ef0 c 259 6 +FUNC 28efc 1a4 0 ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test::TestBody +28efc c 315 6 +28f08 4 316 6 +28f0c 4 315 6 +28f10 8 316 6 +28f18 4 315 6 +28f1c 4 316 6 +28f20 8 318 6 +28f28 4 319 6 +28f2c 4 320 6 +28f30 4 1139 87 +28f34 4 320 6 +28f38 c 277 82 +28f44 4 320 6 +28f48 1c 320 6 +28f64 4 320 6 +28f68 4 320 6 +28f6c 4 320 6 +28f70 1c 320 6 +28f8c 8 320 6 +28f94 c 320 6 +28fa0 8 85 79 +28fa8 8 320 6 +28fb0 8 156 132 +28fb8 14 256 82 +28fcc c 321 6 +28fd8 14 321 6 +28fec 8 156 132 +28ff4 c 324 6 +29000 8 324 6 +29008 8 324 6 +29010 4 324 6 +29014 c 324 6 +29020 8 324 6 +29028 14 324 6 +2903c 24 324 6 +29060 8 324 6 +29068 c 324 6 +29074 8 85 79 +2907c 10 324 6 +2908c 14 325 6 +FUNC 290a0 1a4 0 ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test::TestBody +290a0 c 327 6 +290ac 4 328 6 +290b0 4 327 6 +290b4 8 328 6 +290bc 4 327 6 +290c0 4 328 6 +290c4 8 330 6 +290cc 4 331 6 +290d0 4 332 6 +290d4 4 1139 87 +290d8 4 332 6 +290dc c 277 82 +290e8 4 332 6 +290ec 1c 332 6 +29108 4 332 6 +2910c 4 332 6 +29110 4 332 6 +29114 1c 332 6 +29130 8 332 6 +29138 c 332 6 +29144 8 85 79 +2914c 8 332 6 +29154 8 156 132 +2915c 14 256 82 +29170 c 333 6 +2917c 14 333 6 +29190 8 156 132 +29198 c 336 6 +291a4 8 336 6 +291ac 8 336 6 +291b4 4 336 6 +291b8 c 336 6 +291c4 8 336 6 +291cc 14 336 6 +291e0 24 336 6 +29204 8 336 6 +2920c c 336 6 +29218 8 85 79 +29220 10 336 6 +29230 14 337 6 +FUNC 29244 1a4 0 ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test::TestBody +29244 c 339 6 +29250 4 340 6 +29254 4 339 6 +29258 8 340 6 +29260 4 339 6 +29264 4 340 6 +29268 8 342 6 +29270 4 343 6 +29274 4 344 6 +29278 4 1139 87 +2927c 4 344 6 +29280 c 277 82 +2928c 4 344 6 +29290 1c 344 6 +292ac 4 344 6 +292b0 4 344 6 +292b4 4 344 6 +292b8 1c 344 6 +292d4 8 344 6 +292dc c 344 6 +292e8 8 85 79 +292f0 8 344 6 +292f8 8 156 132 +29300 14 256 82 +29314 c 345 6 +29320 14 345 6 +29334 8 156 132 +2933c c 348 6 +29348 8 348 6 +29350 8 348 6 +29358 4 348 6 +2935c c 348 6 +29368 8 348 6 +29370 14 348 6 +29384 24 348 6 +293a8 8 348 6 +293b0 c 348 6 +293bc 8 85 79 +293c4 10 348 6 +293d4 14 349 6 +FUNC 293e8 1a4 0 ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test::TestBody +293e8 c 351 6 +293f4 4 352 6 +293f8 4 351 6 +293fc 8 352 6 +29404 4 351 6 +29408 4 352 6 +2940c 8 354 6 +29414 4 355 6 +29418 4 356 6 +2941c 4 1139 87 +29420 4 356 6 +29424 c 277 82 +29430 4 356 6 +29434 1c 356 6 +29450 4 356 6 +29454 4 356 6 +29458 4 356 6 +2945c 1c 356 6 +29478 8 356 6 +29480 c 356 6 +2948c 8 85 79 +29494 8 356 6 +2949c 8 156 132 +294a4 14 256 82 +294b8 c 357 6 +294c4 14 357 6 +294d8 8 156 132 +294e0 c 360 6 +294ec 8 360 6 +294f4 8 360 6 +294fc 4 360 6 +29500 c 360 6 +2950c 8 360 6 +29514 14 360 6 +29528 24 360 6 +2954c 8 360 6 +29554 c 360 6 +29560 8 85 79 +29568 10 360 6 +29578 14 361 6 +FUNC 2958c fc 0 ExceptionHandlerTest_RedeliveryToDefaultHandler_Test::TestBody +2958c c 363 6 +29598 4 364 6 +2959c 4 363 6 +295a0 c 364 6 +295ac 8 366 6 +295b4 4 367 6 +295b8 c 368 6 +295c4 14 368 6 +295d8 8 156 132 +295e0 c 373 6 +295ec 8 373 6 +295f4 8 373 6 +295fc 4 373 6 +29600 c 373 6 +2960c 8 373 6 +29614 14 373 6 +29628 24 373 6 +2964c 8 373 6 +29654 c 373 6 +29660 8 85 79 +29668 8 373 6 +29670 8 373 6 +29678 10 374 6 +FUNC 29688 324 0 ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test::TestBody +29688 c 380 6 +29694 8 381 6 +2969c c 380 6 +296a8 8 381 6 +296b0 8 382 6 +296b8 4 383 6 +296bc 4 277 82 +296c0 4 385 6 +296c4 4 1139 87 +296c8 c 385 6 +296d4 4 277 82 +296d8 4 1139 87 +296dc 4 385 6 +296e0 24 385 6 +29704 1c 385 6 +29720 8 385 6 +29728 c 385 6 +29734 8 85 79 +2973c 8 385 6 +29744 8 156 132 +2974c 14 256 82 +29760 c 391 6 +2976c 24 391 6 +29790 8 391 6 +29798 10 396 6 +297a8 8 397 6 +297b0 4 1615 82 +297b4 4 397 6 +297b8 4 1615 82 +297bc 4 1615 82 +297c0 8 1615 82 +297c8 24 1615 82 +297ec c 397 6 +297f8 c 302 82 +29804 18 397 6 +2981c 8 256 82 +29824 18 399 6 +2983c 4 1615 82 +29840 4 1615 82 +29844 4 1615 82 +29848 8 1615 82 +29850 24 1615 82 +29874 c 399 6 +29880 c 302 82 +2988c 18 399 6 +298a4 8 399 6 +298ac c 399 6 +298b8 8 85 79 +298c0 8 399 6 +298c8 1c 256 82 +298e4 10 207 6 +298f4 8 403 6 +298fc c 406 6 +29908 8 406 6 +29910 8 406 6 +29918 4 406 6 +2991c c 406 6 +29928 8 406 6 +29930 14 406 6 +29944 24 406 6 +29968 8 406 6 +29970 c 406 6 +2997c 8 85 79 +29984 10 406 6 +29994 18 407 6 +FUNC 299ac 13c 0 ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test::TestBody +299ac c 409 6 +299b8 8 410 6 +299c0 4 409 6 +299c4 8 410 6 +299cc 8 412 6 +299d4 4 413 6 +299d8 10 419 6 +299e8 20 419 6 +29a08 8 419 6 +29a10 c 420 6 +29a1c 14 420 6 +29a30 8 156 132 +29a38 8 420 6 +29a40 c 422 6 +29a4c 8 422 6 +29a54 8 422 6 +29a5c 4 422 6 +29a60 c 422 6 +29a6c 8 422 6 +29a74 14 422 6 +29a88 24 422 6 +29aac 8 422 6 +29ab4 c 422 6 +29ac0 8 85 79 +29ac8 8 422 6 +29ad0 8 422 6 +29ad8 10 423 6 +FUNC 29ae8 13c 0 ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test::TestBody +29ae8 c 425 6 +29af4 8 426 6 +29afc 4 425 6 +29b00 8 426 6 +29b08 8 428 6 +29b10 4 429 6 +29b14 10 435 6 +29b24 24 435 6 +29b48 8 435 6 +29b50 c 436 6 +29b5c 10 436 6 +29b6c 8 156 132 +29b74 8 436 6 +29b7c c 438 6 +29b88 8 438 6 +29b90 8 438 6 +29b98 4 438 6 +29b9c c 438 6 +29ba8 8 438 6 +29bb0 14 438 6 +29bc4 24 438 6 +29be8 8 438 6 +29bf0 c 438 6 +29bfc 8 85 79 +29c04 8 438 6 +29c0c 8 438 6 +29c14 10 439 6 +FUNC 29c24 140 0 ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test::TestBody +29c24 c 441 6 +29c30 8 442 6 +29c38 4 441 6 +29c3c 8 442 6 +29c44 8 444 6 +29c4c 4 445 6 +29c50 10 451 6 +29c60 24 451 6 +29c84 8 451 6 +29c8c c 452 6 +29c98 14 452 6 +29cac 8 156 132 +29cb4 8 452 6 +29cbc c 454 6 +29cc8 8 454 6 +29cd0 8 454 6 +29cd8 4 454 6 +29cdc c 454 6 +29ce8 8 454 6 +29cf0 14 454 6 +29d04 24 454 6 +29d28 8 454 6 +29d30 c 454 6 +29d3c 8 85 79 +29d44 8 454 6 +29d4c 8 454 6 +29d54 10 455 6 +FUNC 29d64 140 0 ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test::TestBody +29d64 c 457 6 +29d70 8 458 6 +29d78 4 457 6 +29d7c 8 458 6 +29d84 8 460 6 +29d8c 4 461 6 +29d90 10 467 6 +29da0 24 467 6 +29dc4 8 467 6 +29dcc c 468 6 +29dd8 14 468 6 +29dec 8 156 132 +29df4 8 468 6 +29dfc c 470 6 +29e08 8 470 6 +29e10 8 470 6 +29e18 4 470 6 +29e1c c 470 6 +29e28 8 470 6 +29e30 14 470 6 +29e44 24 470 6 +29e68 8 470 6 +29e70 c 470 6 +29e7c 8 85 79 +29e84 8 470 6 +29e8c 8 470 6 +29e94 10 471 6 +FUNC 29ea4 9c4 0 ExceptionHandlerTest_ExternalDumper_Test::TestBody +29ea4 4 926 6 +29ea8 4 928 6 +29eac 4 926 6 +29eb0 8 928 6 +29eb8 c 926 6 +29ec4 4 928 6 +29ec8 4 926 6 +29ecc c 928 6 +29ed8 10 926 6 +29ee8 c 928 6 +29ef4 20 928 6 +29f14 c 928 6 +29f20 4 928 6 +29f24 8 928 6 +29f2c c 302 82 +29f38 18 928 6 +29f50 8 928 6 +29f58 c 928 6 +29f64 8 85 79 +29f6c 8 928 6 +29f74 c 256 82 +29f80 8 930 6 +29f88 4 256 82 +29f8c 18 930 6 +29fa4 18 931 6 +29fbc 8 933 6 +29fc4 4 934 6 +29fc8 8 935 6 +29fd0 14 937 6 +29fe4 c 937 6 +29ff0 28 937 6 +2a018 8 156 132 +2a020 4 144 5 +2a024 4 207 6 +2a028 8 144 5 +2a030 c 207 6 +2a03c 8 939 6 +2a044 4 941 6 +2a048 4 955 6 +2a04c 8 941 6 +2a054 4 942 6 +2a058 8 948 6 +2a060 4 955 6 +2a064 4 948 6 +2a068 4 949 6 +2a06c 4 950 6 +2a070 4 949 6 +2a074 8 951 6 +2a07c 4 952 6 +2a080 4 942 6 +2a084 4 952 6 +2a088 4 953 6 +2a08c 4 942 6 +2a090 4 953 6 +2a094 1c 955 6 +2a0b0 4 955 6 +2a0b4 c 955 6 +2a0c0 8 956 6 +2a0c8 4 955 6 +2a0cc c 1512 82 +2a0d8 4 956 6 +2a0dc 10 1512 82 +2a0ec 4 956 6 +2a0f0 8 955 6 +2a0f8 4 1512 82 +2a0fc 8 956 6 +2a104 c 302 82 +2a110 14 956 6 +2a124 4 959 6 +2a128 8 959 6 +2a130 c 959 6 +2a13c 8 85 79 +2a144 8 959 6 +2a14c 10 256 82 +2a15c 4 1512 82 +2a160 4 256 82 +2a164 24 1512 82 +2a188 8 957 6 +2a190 c 302 82 +2a19c 18 957 6 +2a1b4 8 256 82 +2a1bc 4 958 6 +2a1c0 20 1552 82 +2a1e0 8 958 6 +2a1e8 c 302 82 +2a1f4 18 958 6 +2a20c 4 256 82 +2a210 4 1552 82 +2a214 4 256 82 +2a218 14 959 6 +2a22c 1c 1552 82 +2a248 8 959 6 +2a250 c 302 82 +2a25c 18 959 6 +2a274 4 256 82 +2a278 4 963 6 +2a27c 4 256 82 +2a280 c 961 6 +2a28c 8 962 6 +2a294 c 963 6 +2a2a0 4 963 6 +2a2a4 18 1512 82 +2a2bc 4 963 6 +2a2c0 c 965 6 +2a2cc c 967 6 +2a2d8 8 969 6 +2a2e0 8 970 6 +2a2e8 4 969 6 +2a2ec 4 1512 82 +2a2f0 4 969 6 +2a2f4 4 1512 82 +2a2f8 4 970 6 +2a2fc c 1512 82 +2a308 8 970 6 +2a310 4 302 82 +2a314 4 970 6 +2a318 8 302 82 +2a320 18 970 6 +2a338 8 970 6 +2a340 c 970 6 +2a34c 8 85 79 +2a354 8 970 6 +2a35c 10 256 82 +2a36c 8 971 6 +2a374 8 972 6 +2a37c c 975 6 +2a388 14 963 6 +2a39c 48 979 6 +2a3e4 c 302 82 +2a3f0 18 979 6 +2a408 8 256 82 +2a410 2c 980 6 +2a43c c 302 82 +2a448 18 980 6 +2a460 8 980 6 +2a468 c 980 6 +2a474 8 85 79 +2a47c 8 980 6 +2a484 10 256 82 +2a494 8 982 6 +2a49c 14 983 6 +2a4b0 1c 984 6 +2a4cc 4 277 82 +2a4d0 4 1139 87 +2a4d4 4 277 82 +2a4d8 4 1139 87 +2a4dc 4 984 6 +2a4e0 1c 984 6 +2a4fc 4 984 6 +2a500 4 984 6 +2a504 1c 984 6 +2a520 8 984 6 +2a528 c 984 6 +2a534 8 85 79 +2a53c 8 984 6 +2a544 c 156 132 +2a550 8 256 82 +2a558 8 987 6 +2a560 24 987 6 +2a584 4 987 6 +2a588 c 987 6 +2a594 4 987 6 +2a598 14 1512 82 +2a5ac 4 987 6 +2a5b0 10 1512 82 +2a5c0 4 987 6 +2a5c4 4 1512 82 +2a5c8 8 987 6 +2a5d0 c 302 82 +2a5dc 18 987 6 +2a5f4 8 987 6 +2a5fc c 987 6 +2a608 8 85 79 +2a610 8 987 6 +2a618 10 256 82 +2a628 c 990 6 +2a634 8 990 6 +2a63c 8 990 6 +2a644 4 990 6 +2a648 14 990 6 +2a65c c 990 6 +2a668 4 990 6 +2a66c 4 993 6 +2a670 4 993 6 +2a674 4 993 6 +2a678 4 1552 82 +2a67c 4 993 6 +2a680 4 1552 82 +2a684 8 993 6 +2a68c 4 993 6 +2a690 4 993 6 +2a694 1c 1552 82 +2a6b0 8 993 6 +2a6b8 c 302 82 +2a6c4 14 993 6 +2a6d8 4 994 6 +2a6dc 8 994 6 +2a6e4 c 994 6 +2a6f0 8 85 79 +2a6f8 8 994 6 +2a700 10 256 82 +2a710 20 990 6 +2a730 4 990 6 +2a734 4 990 6 +2a738 8 990 6 +2a740 c 990 6 +2a74c 8 85 79 +2a754 8 990 6 +2a75c 14 156 132 +2a770 8 256 82 +2a778 14 988 6 +2a78c 1c 1552 82 +2a7a8 8 988 6 +2a7b0 c 302 82 +2a7bc 18 988 6 +2a7d4 8 256 82 +2a7dc 28 994 6 +2a804 c 302 82 +2a810 18 994 6 +2a828 8 256 82 +2a830 8 995 6 +2a838 8 156 132 +2a840 28 996 6 +FUNC 2a868 aa4 0 ExceptionHandlerTest_InstructionPointerMemory_Test::TestBody +2a868 10 487 6 +2a878 8 488 6 +2a880 10 487 6 +2a890 4 490 6 +2a894 4 487 6 +2a898 4 488 6 +2a89c c 490 6 +2a8a8 4 490 6 +2a8ac c 490 6 +2a8b8 1c 490 6 +2a8d4 8 490 6 +2a8dc 4 490 6 +2a8e0 8 490 6 +2a8e8 c 302 82 +2a8f4 18 490 6 +2a90c 8 490 6 +2a914 c 490 6 +2a920 8 85 79 +2a928 8 490 6 +2a930 10 256 82 +2a940 4 494 6 +2a944 4 256 82 +2a948 8 494 6 +2a950 8 497 6 +2a958 4 498 6 +2a95c 8 499 6 +2a964 c 502 6 +2a970 24 502 6 +2a994 8 502 6 +2a99c 1c 510 6 +2a9b8 4 511 6 +2a9bc 4 512 6 +2a9c0 10 517 6 +2a9d0 4 524 6 +2a9d4 8 524 6 +2a9dc 8 526 6 +2a9e4 c 528 6 +2a9f0 8 528 6 +2a9f8 8 528 6 +2aa00 4 528 6 +2aa04 c 528 6 +2aa10 8 528 6 +2aa18 4 528 6 +2aa1c 4 530 6 +2aa20 4 528 6 +2aa24 c 530 6 +2aa30 18 531 6 +2aa48 20 528 6 +2aa68 8 528 6 +2aa70 c 528 6 +2aa7c 8 85 79 +2aa84 8 528 6 +2aa8c 4 528 6 +2aa90 8 531 6 +2aa98 8 531 6 +2aaa0 4 531 6 +2aaa4 c 531 6 +2aab0 c 531 6 +2aabc 4 531 6 +2aac0 4 534 6 +2aac4 8 534 6 +2aacc 4 534 6 +2aad0 c 1552 82 +2aadc 4 534 6 +2aae0 4 534 6 +2aae4 1c 1552 82 +2ab00 8 534 6 +2ab08 c 302 82 +2ab14 1c 534 6 +2ab30 20 531 6 +2ab50 8 531 6 +2ab58 c 531 6 +2ab64 8 85 79 +2ab6c 8 531 6 +2ab74 4 531 6 +2ab78 8 256 82 +2ab80 28 535 6 +2aba8 c 302 82 +2abb4 18 535 6 +2abcc 8 535 6 +2abd4 c 535 6 +2abe0 8 85 79 +2abe8 8 535 6 +2abf0 10 256 82 +2ac00 8 1139 87 +2ac08 4 256 82 +2ac0c c 541 6 +2ac18 8 542 6 +2ac20 4 277 82 +2ac24 4 542 6 +2ac28 4 1139 87 +2ac2c 4 542 6 +2ac30 20 542 6 +2ac50 4 542 6 +2ac54 4 542 6 +2ac58 18 542 6 +2ac70 8 256 82 +2ac78 c 544 6 +2ac84 c 545 6 +2ac90 4 277 82 +2ac94 4 1139 87 +2ac98 c 277 82 +2aca4 4 546 6 +2aca8 20 546 6 +2acc8 4 546 6 +2accc 4 546 6 +2acd0 1c 546 6 +2acec 8 546 6 +2acf4 c 546 6 +2ad00 8 85 79 +2ad08 8 546 6 +2ad10 8 256 82 +2ad18 4 1139 87 +2ad1c c 277 82 +2ad28 4 547 6 +2ad2c 20 547 6 +2ad4c 4 547 6 +2ad50 4 547 6 +2ad54 18 547 6 +2ad6c 8 256 82 +2ad74 4 548 6 +2ad78 8 545 65 +2ad80 4 545 65 +2ad84 1c 548 6 +2ada0 8 548 6 +2ada8 4 548 6 +2adac 8 548 6 +2adb4 c 302 82 +2adc0 18 548 6 +2add8 8 548 6 +2ade0 c 548 6 +2adec 8 85 79 +2adf4 8 548 6 +2adfc c 256 82 +2ae08 8 1139 87 +2ae10 4 256 82 +2ae14 8 550 6 +2ae1c 4 277 82 +2ae20 4 550 6 +2ae24 8 277 82 +2ae2c 4 1139 87 +2ae30 4 551 6 +2ae34 24 551 6 +2ae58 18 551 6 +2ae70 c 256 82 +2ae7c 18 554 6 +2ae94 4 1139 87 +2ae98 4 554 6 +2ae9c 4 277 82 +2aea0 4 554 6 +2aea4 24 554 6 +2aec8 18 554 6 +2aee0 8 256 82 +2aee8 18 557 6 +2af00 4 277 82 +2af04 4 557 6 +2af08 4 1139 87 +2af0c 8 277 82 +2af14 4 558 6 +2af18 24 558 6 +2af3c 1c 558 6 +2af58 8 558 6 +2af60 c 558 6 +2af6c 8 85 79 +2af74 8 558 6 +2af7c 8 156 132 +2af84 10 256 82 +2af94 14 560 6 +2afa8 20 1512 82 +2afc8 8 560 6 +2afd0 c 302 82 +2afdc 18 560 6 +2aff4 8 560 6 +2affc c 560 6 +2b008 8 85 79 +2b010 8 560 6 +2b018 8 256 82 +2b020 4 561 6 +2b024 4 1139 87 +2b028 4 561 6 +2b02c 4 277 82 +2b030 4 561 6 +2b034 8 277 82 +2b03c 4 1139 87 +2b040 4 562 6 +2b044 24 562 6 +2b068 1c 562 6 +2b084 8 562 6 +2b08c c 562 6 +2b098 8 85 79 +2b0a0 8 562 6 +2b0a8 8 156 132 +2b0b0 14 256 82 +2b0c4 10 566 6 +2b0d4 10 567 6 +2b0e4 18 568 6 +2b0fc 4 1139 87 +2b100 4 277 82 +2b104 4 568 6 +2b108 20 568 6 +2b128 4 568 6 +2b12c 4 568 6 +2b130 4 568 6 +2b134 1c 568 6 +2b150 8 568 6 +2b158 c 568 6 +2b164 8 85 79 +2b16c 8 568 6 +2b174 8 156 132 +2b17c 8 256 82 +2b184 1c 569 6 +2b1a0 4 1139 87 +2b1a4 4 277 82 +2b1a8 4 569 6 +2b1ac 20 569 6 +2b1cc 4 569 6 +2b1d0 4 569 6 +2b1d4 4 569 6 +2b1d8 1c 569 6 +2b1f4 8 569 6 +2b1fc c 570 6 +2b208 8 85 79 +2b210 8 569 6 +2b218 8 156 132 +2b220 8 256 82 +2b228 18 571 6 +2b240 4 1139 87 +2b244 4 277 82 +2b248 4 571 6 +2b24c 20 571 6 +2b26c 4 571 6 +2b270 4 571 6 +2b274 4 571 6 +2b278 1c 571 6 +2b294 8 571 6 +2b29c c 572 6 +2b2a8 8 85 79 +2b2b0 8 571 6 +2b2b8 8 156 132 +2b2c0 8 256 82 +2b2c8 10 574 6 +2b2d8 10 156 132 +2b2e8 24 575 6 +FUNC 2b30c 9b4 0 ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test::TestBody +2b30c 10 579 6 +2b31c 8 580 6 +2b324 10 579 6 +2b334 4 582 6 +2b338 4 580 6 +2b33c c 582 6 +2b348 4 582 6 +2b34c c 582 6 +2b358 1c 582 6 +2b374 8 582 6 +2b37c 4 582 6 +2b380 8 582 6 +2b388 c 302 82 +2b394 18 582 6 +2b3ac 8 582 6 +2b3b4 c 582 6 +2b3c0 8 85 79 +2b3c8 8 582 6 +2b3d0 14 256 82 +2b3e4 8 589 6 +2b3ec 4 590 6 +2b3f0 8 591 6 +2b3f8 c 594 6 +2b404 24 594 6 +2b428 8 594 6 +2b430 20 602 6 +2b450 4 603 6 +2b454 4 604 6 +2b458 c 609 6 +2b464 4 616 6 +2b468 8 616 6 +2b470 8 618 6 +2b478 c 620 6 +2b484 8 620 6 +2b48c 8 620 6 +2b494 4 620 6 +2b498 c 620 6 +2b4a4 8 620 6 +2b4ac 4 620 6 +2b4b0 4 622 6 +2b4b4 4 620 6 +2b4b8 c 622 6 +2b4c4 18 623 6 +2b4dc 20 620 6 +2b4fc 8 620 6 +2b504 c 620 6 +2b510 8 85 79 +2b518 8 620 6 +2b520 4 620 6 +2b524 8 623 6 +2b52c 8 623 6 +2b534 4 623 6 +2b538 c 623 6 +2b544 c 623 6 +2b550 4 623 6 +2b554 4 626 6 +2b558 8 626 6 +2b560 4 626 6 +2b564 8 1552 82 +2b56c 4 626 6 +2b570 4 626 6 +2b574 4 626 6 +2b578 1c 1552 82 +2b594 8 626 6 +2b59c c 302 82 +2b5a8 1c 626 6 +2b5c4 20 623 6 +2b5e4 8 623 6 +2b5ec c 623 6 +2b5f8 8 85 79 +2b600 8 623 6 +2b608 4 623 6 +2b60c 8 256 82 +2b614 28 627 6 +2b63c c 302 82 +2b648 18 627 6 +2b660 8 627 6 +2b668 c 627 6 +2b674 8 85 79 +2b67c 8 627 6 +2b684 10 256 82 +2b694 8 1139 87 +2b69c 4 256 82 +2b6a0 c 633 6 +2b6ac 8 634 6 +2b6b4 4 277 82 +2b6b8 4 634 6 +2b6bc 4 1139 87 +2b6c0 4 634 6 +2b6c4 20 634 6 +2b6e4 4 634 6 +2b6e8 4 634 6 +2b6ec 18 634 6 +2b704 8 256 82 +2b70c c 636 6 +2b718 8 637 6 +2b720 4 1139 87 +2b724 4 277 82 +2b728 4 637 6 +2b72c 8 277 82 +2b734 4 638 6 +2b738 20 638 6 +2b758 4 638 6 +2b75c 4 638 6 +2b760 18 638 6 +2b778 8 256 82 +2b780 4 1139 87 +2b784 c 277 82 +2b790 4 639 6 +2b794 20 639 6 +2b7b4 4 639 6 +2b7b8 4 639 6 +2b7bc 1c 639 6 +2b7d8 8 639 6 +2b7e0 c 639 6 +2b7ec 8 85 79 +2b7f4 8 639 6 +2b7fc 8 156 132 +2b804 10 256 82 +2b814 4 640 6 +2b818 8 545 65 +2b820 4 545 65 +2b824 8 640 6 +2b82c 4 640 6 +2b830 14 640 6 +2b844 4 640 6 +2b848 4 640 6 +2b84c 8 640 6 +2b854 c 302 82 +2b860 18 640 6 +2b878 8 640 6 +2b880 c 640 6 +2b88c 8 85 79 +2b894 c 640 6 +2b8a0 4 256 82 +2b8a4 4 1139 87 +2b8a8 4 256 82 +2b8ac 8 642 6 +2b8b4 4 277 82 +2b8b8 4 642 6 +2b8bc 8 277 82 +2b8c4 4 1139 87 +2b8c8 4 643 6 +2b8cc 20 643 6 +2b8ec 4 643 6 +2b8f0 4 643 6 +2b8f4 18 643 6 +2b90c 4 256 82 +2b910 4 646 6 +2b914 4 256 82 +2b918 c 646 6 +2b924 4 1139 87 +2b928 4 646 6 +2b92c 4 277 82 +2b930 4 646 6 +2b934 20 646 6 +2b954 4 646 6 +2b958 4 646 6 +2b95c 18 646 6 +2b974 8 256 82 +2b97c 14 649 6 +2b990 4 277 82 +2b994 4 649 6 +2b998 4 1139 87 +2b99c 8 277 82 +2b9a4 4 650 6 +2b9a8 20 650 6 +2b9c8 4 650 6 +2b9cc 4 650 6 +2b9d0 18 650 6 +2b9e8 8 256 82 +2b9f0 1c 652 6 +2ba0c 20 1512 82 +2ba2c 8 652 6 +2ba34 c 302 82 +2ba40 18 652 6 +2ba58 8 652 6 +2ba60 c 652 6 +2ba6c 8 85 79 +2ba74 8 652 6 +2ba7c 4 256 82 +2ba80 4 1139 87 +2ba84 4 256 82 +2ba88 8 653 6 +2ba90 4 277 82 +2ba94 4 653 6 +2ba98 8 277 82 +2baa0 4 1139 87 +2baa4 4 654 6 +2baa8 20 654 6 +2bac8 4 654 6 +2bacc 4 654 6 +2bad0 1c 654 6 +2baec 8 654 6 +2baf4 c 654 6 +2bb00 8 85 79 +2bb08 8 654 6 +2bb10 8 156 132 +2bb18 14 256 82 +2bb2c 10 657 6 +2bb3c 1c 658 6 +2bb58 4 1139 87 +2bb5c 4 277 82 +2bb60 4 658 6 +2bb64 20 658 6 +2bb84 4 658 6 +2bb88 4 658 6 +2bb8c 4 658 6 +2bb90 1c 658 6 +2bbac 8 658 6 +2bbb4 c 659 6 +2bbc0 8 85 79 +2bbc8 8 658 6 +2bbd0 8 156 132 +2bbd8 8 256 82 +2bbe0 18 660 6 +2bbf8 4 1139 87 +2bbfc 4 277 82 +2bc00 4 660 6 +2bc04 20 660 6 +2bc24 4 660 6 +2bc28 4 660 6 +2bc2c 4 660 6 +2bc30 1c 660 6 +2bc4c 8 660 6 +2bc54 c 661 6 +2bc60 8 85 79 +2bc68 8 660 6 +2bc70 8 156 132 +2bc78 8 256 82 +2bc80 10 662 6 +2bc90 10 156 132 +2bca0 20 663 6 +FUNC 2bcc0 9b8 0 ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test::TestBody +2bcc0 10 667 6 +2bcd0 8 668 6 +2bcd8 10 667 6 +2bce8 4 670 6 +2bcec 4 668 6 +2bcf0 c 670 6 +2bcfc 4 670 6 +2bd00 c 670 6 +2bd0c 1c 670 6 +2bd28 8 670 6 +2bd30 4 670 6 +2bd34 8 670 6 +2bd3c c 302 82 +2bd48 18 670 6 +2bd60 8 670 6 +2bd68 c 670 6 +2bd74 8 85 79 +2bd7c 8 670 6 +2bd84 14 256 82 +2bd98 8 680 6 +2bda0 4 681 6 +2bda4 8 682 6 +2bdac c 685 6 +2bdb8 24 685 6 +2bddc 8 685 6 +2bde4 20 693 6 +2be04 4 694 6 +2be08 4 695 6 +2be0c 4 700 6 +2be10 4 706 6 +2be14 8 700 6 +2be1c 4 707 6 +2be20 8 707 6 +2be28 8 709 6 +2be30 c 711 6 +2be3c 8 711 6 +2be44 8 711 6 +2be4c 4 711 6 +2be50 c 711 6 +2be5c 8 711 6 +2be64 4 711 6 +2be68 4 713 6 +2be6c 4 711 6 +2be70 c 713 6 +2be7c 18 714 6 +2be94 20 711 6 +2beb4 8 711 6 +2bebc c 711 6 +2bec8 8 85 79 +2bed0 8 711 6 +2bed8 4 711 6 +2bedc 8 714 6 +2bee4 8 714 6 +2beec 4 714 6 +2bef0 c 714 6 +2befc c 714 6 +2bf08 4 714 6 +2bf0c 4 717 6 +2bf10 8 717 6 +2bf18 4 717 6 +2bf1c c 1552 82 +2bf28 4 717 6 +2bf2c 4 717 6 +2bf30 1c 1552 82 +2bf4c 8 717 6 +2bf54 c 302 82 +2bf60 1c 717 6 +2bf7c 20 714 6 +2bf9c 8 714 6 +2bfa4 c 714 6 +2bfb0 8 85 79 +2bfb8 8 714 6 +2bfc0 4 714 6 +2bfc4 8 256 82 +2bfcc 28 718 6 +2bff4 c 302 82 +2c000 18 718 6 +2c018 8 718 6 +2c020 c 718 6 +2c02c 8 85 79 +2c034 8 718 6 +2c03c 10 256 82 +2c04c 8 1139 87 +2c054 4 256 82 +2c058 c 723 6 +2c064 8 724 6 +2c06c 4 277 82 +2c070 4 724 6 +2c074 4 1139 87 +2c078 4 724 6 +2c07c 20 724 6 +2c09c 4 724 6 +2c0a0 4 724 6 +2c0a4 18 724 6 +2c0bc 8 256 82 +2c0c4 c 726 6 +2c0d0 8 727 6 +2c0d8 4 1139 87 +2c0dc 4 277 82 +2c0e0 4 727 6 +2c0e4 8 277 82 +2c0ec 4 728 6 +2c0f0 20 728 6 +2c110 4 728 6 +2c114 4 728 6 +2c118 18 728 6 +2c130 8 256 82 +2c138 4 1139 87 +2c13c c 277 82 +2c148 4 729 6 +2c14c 20 729 6 +2c16c 4 729 6 +2c170 4 729 6 +2c174 1c 729 6 +2c190 8 729 6 +2c198 c 729 6 +2c1a4 8 85 79 +2c1ac 8 729 6 +2c1b4 8 156 132 +2c1bc 10 256 82 +2c1cc 4 730 6 +2c1d0 8 545 65 +2c1d8 4 545 65 +2c1dc 1c 730 6 +2c1f8 8 730 6 +2c200 4 730 6 +2c204 8 730 6 +2c20c c 302 82 +2c218 18 730 6 +2c230 8 730 6 +2c238 c 730 6 +2c244 8 85 79 +2c24c c 730 6 +2c258 4 256 82 +2c25c 4 1139 87 +2c260 4 256 82 +2c264 8 732 6 +2c26c 4 277 82 +2c270 4 732 6 +2c274 8 277 82 +2c27c 4 1139 87 +2c280 4 733 6 +2c284 20 733 6 +2c2a4 4 733 6 +2c2a8 4 733 6 +2c2ac 18 733 6 +2c2c4 4 256 82 +2c2c8 4 736 6 +2c2cc 4 256 82 +2c2d0 c 736 6 +2c2dc 4 1139 87 +2c2e0 4 736 6 +2c2e4 4 277 82 +2c2e8 4 736 6 +2c2ec 20 736 6 +2c30c 4 736 6 +2c310 4 736 6 +2c314 18 736 6 +2c32c 8 256 82 +2c334 14 739 6 +2c348 4 277 82 +2c34c 4 739 6 +2c350 4 1139 87 +2c354 8 277 82 +2c35c 4 740 6 +2c360 20 740 6 +2c380 4 740 6 +2c384 4 740 6 +2c388 18 740 6 +2c3a0 8 256 82 +2c3a8 1c 743 6 +2c3c4 20 1512 82 +2c3e4 8 743 6 +2c3ec c 302 82 +2c3f8 18 743 6 +2c410 8 743 6 +2c418 c 743 6 +2c424 8 85 79 +2c42c 8 743 6 +2c434 4 256 82 +2c438 4 1139 87 +2c43c 4 256 82 +2c440 8 744 6 +2c448 4 277 82 +2c44c 4 744 6 +2c450 8 277 82 +2c458 4 1139 87 +2c45c 4 745 6 +2c460 20 745 6 +2c480 4 745 6 +2c484 4 745 6 +2c488 1c 745 6 +2c4a4 8 745 6 +2c4ac c 745 6 +2c4b8 8 85 79 +2c4c0 8 745 6 +2c4c8 8 156 132 +2c4d0 14 256 82 +2c4e4 10 748 6 +2c4f4 18 749 6 +2c50c 4 1139 87 +2c510 4 277 82 +2c514 4 749 6 +2c518 20 749 6 +2c538 4 749 6 +2c53c 4 749 6 +2c540 4 749 6 +2c544 1c 749 6 +2c560 8 749 6 +2c568 c 749 6 +2c574 8 85 79 +2c57c 8 749 6 +2c584 8 156 132 +2c58c 8 256 82 +2c594 1c 750 6 +2c5b0 4 1139 87 +2c5b4 4 277 82 +2c5b8 4 750 6 +2c5bc 20 750 6 +2c5dc 4 750 6 +2c5e0 4 750 6 +2c5e4 4 750 6 +2c5e8 1c 750 6 +2c604 8 750 6 +2c60c c 751 6 +2c618 8 85 79 +2c620 8 750 6 +2c628 8 156 132 +2c630 8 256 82 +2c638 10 753 6 +2c648 10 156 132 +2c658 20 754 6 +FUNC 2c678 5b4 0 ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test::TestBody +2c678 10 760 6 +2c688 8 761 6 +2c690 10 760 6 +2c6a0 4 763 6 +2c6a4 4 761 6 +2c6a8 c 763 6 +2c6b4 4 763 6 +2c6b8 c 763 6 +2c6c4 1c 763 6 +2c6e0 8 763 6 +2c6e8 4 763 6 +2c6ec 8 763 6 +2c6f4 c 302 82 +2c700 18 763 6 +2c718 8 763 6 +2c720 c 763 6 +2c72c 8 85 79 +2c734 8 763 6 +2c73c 14 256 82 +2c750 8 765 6 +2c758 4 766 6 +2c75c 8 767 6 +2c764 c 770 6 +2c770 24 770 6 +2c794 8 770 6 +2c79c 8 774 6 +2c7a4 8 774 6 +2c7ac 8 776 6 +2c7b4 c 778 6 +2c7c0 8 778 6 +2c7c8 8 778 6 +2c7d0 4 778 6 +2c7d4 c 778 6 +2c7e0 8 778 6 +2c7e8 4 778 6 +2c7ec 4 780 6 +2c7f0 4 778 6 +2c7f4 c 780 6 +2c800 18 781 6 +2c818 20 778 6 +2c838 8 778 6 +2c840 c 778 6 +2c84c 8 85 79 +2c854 8 778 6 +2c85c 4 778 6 +2c860 8 781 6 +2c868 8 781 6 +2c870 4 781 6 +2c874 c 781 6 +2c880 c 781 6 +2c88c 4 781 6 +2c890 4 784 6 +2c894 8 784 6 +2c89c 4 784 6 +2c8a0 8 1552 82 +2c8a8 4 784 6 +2c8ac 4 784 6 +2c8b0 4 784 6 +2c8b4 1c 1552 82 +2c8d0 8 784 6 +2c8d8 c 302 82 +2c8e4 1c 784 6 +2c900 20 781 6 +2c920 8 781 6 +2c928 c 781 6 +2c934 8 85 79 +2c93c 8 781 6 +2c944 4 781 6 +2c948 8 256 82 +2c950 28 785 6 +2c978 c 302 82 +2c984 18 785 6 +2c99c 8 785 6 +2c9a4 c 785 6 +2c9b0 8 85 79 +2c9b8 8 785 6 +2c9c0 10 256 82 +2c9d0 8 1139 87 +2c9d8 4 256 82 +2c9dc c 791 6 +2c9e8 8 792 6 +2c9f0 4 277 82 +2c9f4 4 792 6 +2c9f8 4 1139 87 +2c9fc 4 792 6 +2ca00 20 792 6 +2ca20 4 792 6 +2ca24 4 792 6 +2ca28 18 792 6 +2ca40 8 256 82 +2ca48 c 794 6 +2ca54 8 795 6 +2ca5c 4 1139 87 +2ca60 4 277 82 +2ca64 4 795 6 +2ca68 8 277 82 +2ca70 4 796 6 +2ca74 20 796 6 +2ca94 4 796 6 +2ca98 4 796 6 +2ca9c 18 796 6 +2cab4 8 256 82 +2cabc 4 1139 87 +2cac0 c 277 82 +2cacc 4 797 6 +2cad0 20 797 6 +2caf0 4 797 6 +2caf4 4 797 6 +2caf8 1c 797 6 +2cb14 8 797 6 +2cb1c c 797 6 +2cb28 8 85 79 +2cb30 8 797 6 +2cb38 c 156 132 +2cb44 8 256 82 +2cb4c 8 798 6 +2cb54 8 545 65 +2cb5c 4 545 65 +2cb60 1c 1512 82 +2cb7c 8 798 6 +2cb84 4 1512 82 +2cb88 8 798 6 +2cb90 c 302 82 +2cb9c 18 798 6 +2cbb4 8 798 6 +2cbbc c 798 6 +2cbc8 8 85 79 +2cbd0 8 798 6 +2cbd8 14 256 82 +2cbec 10 800 6 +2cbfc 10 156 132 +2cc0c 20 801 6 +FUNC 2cc2c 8d8 0 ExceptionHandlerTest_ModuleInfo_Test::TestBody +2cc2c 4 806 6 +2cc30 4 809 6 +2cc34 10 806 6 +2cc44 4 814 6 +2cc48 c 806 6 +2cc54 4 818 6 +2cc58 8 806 6 +2cc60 8 809 6 +2cc68 54 814 6 +2ccbc 4 809 6 +2ccc0 10 814 6 +2ccd0 4 809 6 +2ccd4 10 814 6 +2cce4 4 818 6 +2cce8 4 814 6 +2ccec 8 818 6 +2ccf4 4 814 6 +2ccf8 8 819 6 +2cd00 4 818 6 +2cd04 18 819 6 +2cd1c 8 440 130 +2cd24 c 162 99 +2cd30 8 164 99 +2cd38 c 165 99 +2cd44 c 168 99 +2cd50 8 166 99 +2cd58 c 171 99 +2cd64 8 169 99 +2cd6c c 174 99 +2cd78 c 172 99 +2cd84 8 164 99 +2cd8c 20 178 99 +2cdac 10 180 99 +2cdbc 4 181 99 +2cdc0 10 183 99 +2cdd0 4 184 99 +2cdd4 10 186 99 +2cde4 8 165 99 +2cdec 4 190 99 +2cdf0 8 447 130 +2cdf8 8 447 130 +2ce00 8 822 6 +2ce08 8 400 131 +2ce10 8 789 131 +2ce18 c 604 130 +2ce24 4 139 100 +2ce28 4 791 131 +2ce2c 4 791 131 +2ce30 10 791 131 +2ce40 14 530 131 +2ce54 4 277 82 +2ce58 8 1139 87 +2ce60 8 530 131 +2ce68 20 836 6 +2ce88 4 277 82 +2ce8c 4 837 6 +2ce90 8 277 82 +2ce98 4 837 6 +2ce9c 4 1139 87 +2cea0 4 837 6 +2cea4 4 838 6 +2cea8 24 838 6 +2cecc 1c 838 6 +2cee8 8 838 6 +2cef0 c 838 6 +2cefc 8 85 79 +2cf04 8 838 6 +2cf0c 8 156 132 +2cf14 10 256 82 +2cf24 4 849 6 +2cf28 4 1139 87 +2cf2c 4 256 82 +2cf30 c 840 6 +2cf3c c 842 6 +2cf48 20 842 6 +2cf68 8 842 6 +2cf70 10 849 6 +2cf80 28 849 6 +2cfa8 8 156 132 +2cfb0 8 850 6 +2cfb8 4 277 82 +2cfbc 4 850 6 +2cfc0 4 1139 87 +2cfc4 4 850 6 +2cfc8 24 850 6 +2cfec 1c 850 6 +2d008 8 850 6 +2d010 c 850 6 +2d01c 8 85 79 +2d024 8 850 6 +2d02c 8 156 132 +2d034 10 256 82 +2d044 8 1139 87 +2d04c 4 256 82 +2d050 10 855 6 +2d060 c 855 6 +2d06c 8 156 132 +2d074 8 856 6 +2d07c 4 277 82 +2d080 4 856 6 +2d084 4 1139 87 +2d088 4 856 6 +2d08c 24 856 6 +2d0b0 18 856 6 +2d0c8 8 256 82 +2d0d0 8 858 6 +2d0d8 4 277 82 +2d0dc 4 858 6 +2d0e0 4 1139 87 +2d0e4 8 277 82 +2d0ec 4 859 6 +2d0f0 24 859 6 +2d114 18 859 6 +2d12c 8 256 82 +2d134 18 861 6 +2d14c 4 277 82 +2d150 4 861 6 +2d154 4 1139 87 +2d158 8 277 82 +2d160 4 862 6 +2d164 24 862 6 +2d188 1c 862 6 +2d1a4 8 862 6 +2d1ac c 862 6 +2d1b8 8 85 79 +2d1c0 8 862 6 +2d1c8 8 156 132 +2d1d0 14 256 82 +2d1e4 14 864 6 +2d1f8 20 1512 82 +2d218 8 864 6 +2d220 c 302 82 +2d22c 18 864 6 +2d244 8 864 6 +2d24c c 864 6 +2d258 8 85 79 +2d260 8 864 6 +2d268 8 256 82 +2d270 14 865 6 +2d284 20 1512 82 +2d2a4 8 865 6 +2d2ac c 302 82 +2d2b8 18 865 6 +2d2d0 8 865 6 +2d2d8 c 865 6 +2d2e4 8 85 79 +2d2ec 8 865 6 +2d2f4 8 256 82 +2d2fc 18 866 6 +2d314 8 400 131 +2d31c 8 315 134 +2d324 8 226 140 +2d32c 4 315 134 +2d330 8 1482 82 +2d338 8 156 132 +2d340 8 866 6 +2d348 c 302 82 +2d354 18 866 6 +2d36c 8 866 6 +2d374 c 866 6 +2d380 8 85 79 +2d388 8 866 6 +2d390 8 256 82 +2d398 14 867 6 +2d3ac 20 1512 82 +2d3cc 8 156 132 +2d3d4 8 867 6 +2d3dc c 302 82 +2d3e8 18 867 6 +2d400 8 867 6 +2d408 c 867 6 +2d414 8 85 79 +2d41c 8 867 6 +2d424 8 256 82 +2d42c 20 869 6 +2d44c 8 156 132 +2d454 28 870 6 +2d47c c 884 80 +2d488 10 711 80 +2d498 c 469 80 +2d4a4 8 156 132 +2d4ac c 75 127 +2d4b8 8 886 80 +2d4c0 c 1382 82 +2d4cc 24 1471 82 +2d4f0 14 156 132 +FUNC 2d504 370 0 ExceptionHandlerTest_WriteMinidumpExceptionStream_Test::TestBody +2d504 10 1000 6 +2d514 4 1001 6 +2d518 4 1003 6 +2d51c 4 1001 6 +2d520 c 1000 6 +2d52c 4 1003 6 +2d530 4 1001 6 +2d534 8 1003 6 +2d53c 8 277 82 +2d544 4 1003 6 +2d548 4 1139 87 +2d54c 24 1003 6 +2d570 8 1003 6 +2d578 8 1004 6 +2d580 4 277 82 +2d584 4 1004 6 +2d588 4 1139 87 +2d58c 4 1004 6 +2d590 24 1004 6 +2d5b4 1c 1004 6 +2d5d0 8 1004 6 +2d5d8 c 1004 6 +2d5e4 8 85 79 +2d5ec 8 1004 6 +2d5f4 8 156 132 +2d5fc 10 256 82 +2d60c 4 1139 87 +2d610 4 256 82 +2d614 10 1006 6 +2d624 c 1009 6 +2d630 8 1010 6 +2d638 4 277 82 +2d63c 4 1010 6 +2d640 4 1139 87 +2d644 4 1010 6 +2d648 20 1010 6 +2d668 4 1010 6 +2d66c 4 1010 6 +2d670 18 1010 6 +2d688 8 256 82 +2d690 8 1011 6 +2d698 4 277 82 +2d69c 4 1011 6 +2d6a0 4 1139 87 +2d6a4 8 277 82 +2d6ac 4 1012 6 +2d6b0 20 1012 6 +2d6d0 4 1012 6 +2d6d4 4 1012 6 +2d6d8 18 1012 6 +2d6f0 4 256 82 +2d6f4 4 600 65 +2d6f8 4 256 82 +2d6fc 4 600 65 +2d700 4 1139 87 +2d704 8 600 65 +2d70c c 277 82 +2d718 4 1014 6 +2d71c 20 1014 6 +2d73c 4 1014 6 +2d740 4 1014 6 +2d744 18 1014 6 +2d75c 4 1014 6 +2d760 4 1014 6 +2d764 8 1014 6 +2d76c c 1014 6 +2d778 8 85 79 +2d780 8 1014 6 +2d788 8 156 132 +2d790 10 256 82 +2d7a0 c 1015 6 +2d7ac 4 1482 82 +2d7b0 c 1481 82 +2d7bc 8 1482 82 +2d7c4 18 1487 82 +2d7dc 8 1015 6 +2d7e4 4 302 82 +2d7e8 4 1015 6 +2d7ec 8 302 82 +2d7f4 18 1015 6 +2d80c 8 1015 6 +2d814 c 1016 6 +2d820 8 85 79 +2d828 8 1015 6 +2d830 10 256 82 +2d840 18 156 132 +2d858 1c 1017 6 +FUNC 2d874 5b8 0 ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test::TestBody +2d874 c 1036 6 +2d880 4 1037 6 +2d884 8 1036 6 +2d88c 4 1037 6 +2d890 14 1036 6 +2d8a4 4 1037 6 +2d8a8 c 1039 6 +2d8b4 4 1039 6 +2d8b8 4 277 82 +2d8bc c 1139 87 +2d8c8 4 1039 6 +2d8cc 20 1039 6 +2d8ec 8 1039 6 +2d8f4 8 1040 6 +2d8fc 4 277 82 +2d900 4 1040 6 +2d904 4 1139 87 +2d908 4 1040 6 +2d90c 24 1040 6 +2d930 1c 1040 6 +2d94c 8 1040 6 +2d954 c 1040 6 +2d960 8 85 79 +2d968 8 1040 6 +2d970 c 156 132 +2d97c 4 256 82 +2d980 8 1552 82 +2d988 4 256 82 +2d98c 4 1044 6 +2d990 c 1044 6 +2d99c 4 1044 6 +2d9a0 1c 1552 82 +2d9bc 8 1044 6 +2d9c4 c 302 82 +2d9d0 18 1044 6 +2d9e8 8 1044 6 +2d9f0 c 1044 6 +2d9fc 8 85 79 +2da04 8 1044 6 +2da0c 14 256 82 +2da20 38 1045 6 +2da58 c 302 82 +2da64 18 1045 6 +2da7c 4 256 82 +2da80 4 1046 6 +2da84 8 1139 87 +2da8c 4 256 82 +2da90 10 1046 6 +2daa0 c 1048 6 +2daac 8 1049 6 +2dab4 4 277 82 +2dab8 4 1049 6 +2dabc 4 1139 87 +2dac0 4 1049 6 +2dac4 20 1049 6 +2dae4 4 1049 6 +2dae8 4 1049 6 +2daec 18 1049 6 +2db04 8 256 82 +2db0c 8 1050 6 +2db14 8 1053 6 +2db1c 4 1139 87 +2db20 4 1053 6 +2db24 4 277 82 +2db28 4 1053 6 +2db2c 20 1053 6 +2db4c 4 1053 6 +2db50 4 1053 6 +2db54 1c 1053 6 +2db70 8 1053 6 +2db78 c 1053 6 +2db84 8 85 79 +2db8c 8 1053 6 +2db94 8 156 132 +2db9c 14 256 82 +2dbb0 4 1055 6 +2dbb4 c 1055 6 +2dbc0 4 1055 6 +2dbc4 1c 1552 82 +2dbe0 8 1055 6 +2dbe8 c 302 82 +2dbf4 18 1055 6 +2dc0c 8 256 82 +2dc14 24 1056 6 +2dc38 c 302 82 +2dc44 18 1056 6 +2dc5c 8 1056 6 +2dc64 c 1056 6 +2dc70 8 85 79 +2dc78 8 1056 6 +2dc80 c 256 82 +2dc8c 4 277 82 +2dc90 4 1139 87 +2dc94 4 256 82 +2dc98 10 1057 6 +2dca8 c 1059 6 +2dcb4 8 1060 6 +2dcbc 4 277 82 +2dcc0 4 1060 6 +2dcc4 4 1139 87 +2dcc8 4 1060 6 +2dccc 20 1060 6 +2dcec 4 1060 6 +2dcf0 4 1060 6 +2dcf4 4 1060 6 +2dcf8 1c 1060 6 +2dd14 8 1060 6 +2dd1c c 1060 6 +2dd28 8 85 79 +2dd30 8 1060 6 +2dd38 8 156 132 +2dd40 10 256 82 +2dd50 8 1061 6 +2dd58 20 1064 6 +2dd78 8 1064 6 +2dd80 4 302 82 +2dd84 4 1064 6 +2dd88 8 302 82 +2dd90 18 1064 6 +2dda8 8 1064 6 +2ddb0 c 1064 6 +2ddbc 8 85 79 +2ddc4 8 1064 6 +2ddcc 10 256 82 +2dddc 28 156 132 +2de04 28 1065 6 +FUNC 2de2c 488 0 ExceptionHandlerTest_AdditionalMemory_Test::TestBody +2de2c 4 1068 6 +2de30 4 1069 6 +2de34 c 1068 6 +2de40 4 1069 6 +2de44 14 1068 6 +2de58 8 1069 6 +2de60 4 1072 6 +2de64 4 277 82 +2de68 8 1072 6 +2de70 8 1073 6 +2de78 4 1139 87 +2de7c 4 1073 6 +2de80 8 277 82 +2de88 8 256 82 +2de90 4 1077 6 +2de94 4 1078 6 +2de98 c 1077 6 +2dea4 c 1078 6 +2deb0 8 1077 6 +2deb8 4 1081 6 +2debc 4 1083 6 +2dec0 4 1081 6 +2dec4 c 1092 6 +2ded0 4 1081 6 +2ded4 4 1139 87 +2ded8 c 1083 6 +2dee4 20 1083 6 +2df04 8 1083 6 +2df0c 10 1086 6 +2df1c 8 1087 6 +2df24 10 1092 6 +2df34 c 1092 6 +2df40 8 156 132 +2df48 8 1093 6 +2df50 4 277 82 +2df54 4 1093 6 +2df58 4 1139 87 +2df5c 4 1093 6 +2df60 20 1093 6 +2df80 4 1093 6 +2df84 4 1093 6 +2df88 18 1093 6 +2dfa0 8 256 82 +2dfa8 8 1095 6 +2dfb0 4 277 82 +2dfb4 4 1095 6 +2dfb8 4 1139 87 +2dfbc 8 277 82 +2dfc4 4 1096 6 +2dfc8 20 1096 6 +2dfe8 4 1096 6 +2dfec 4 1096 6 +2dff0 18 1096 6 +2e008 8 256 82 +2e010 18 1098 6 +2e028 4 277 82 +2e02c 4 1098 6 +2e030 4 1139 87 +2e034 8 277 82 +2e03c 4 1099 6 +2e040 20 1099 6 +2e060 4 1099 6 +2e064 4 1099 6 +2e068 1c 1099 6 +2e084 8 1099 6 +2e08c c 1099 6 +2e098 8 85 79 +2e0a0 8 1099 6 +2e0a8 8 156 132 +2e0b0 14 256 82 +2e0c4 14 1101 6 +2e0d8 20 1512 82 +2e0f8 8 1101 6 +2e100 c 302 82 +2e10c 18 1101 6 +2e124 8 1101 6 +2e12c c 1101 6 +2e138 8 85 79 +2e140 8 1101 6 +2e148 8 256 82 +2e150 14 1102 6 +2e164 20 1512 82 +2e184 8 1102 6 +2e18c c 302 82 +2e198 18 1102 6 +2e1b0 8 1102 6 +2e1b8 c 1102 6 +2e1c4 8 85 79 +2e1cc 8 1102 6 +2e1d4 8 256 82 +2e1dc c 1105 6 +2e1e8 c 1105 6 +2e1f4 4 1105 6 +2e1f8 20 1552 82 +2e218 8 1105 6 +2e220 c 302 82 +2e22c 18 1105 6 +2e244 8 1105 6 +2e24c c 1105 6 +2e258 8 85 79 +2e260 8 1105 6 +2e268 8 256 82 +2e270 20 1107 6 +2e290 24 1108 6 +FUNC 2e2b4 2d0 0 ExceptionHandlerTest_AdditionalMemoryRemove_Test::TestBody +2e2b4 4 1112 6 +2e2b8 4 1113 6 +2e2bc 18 1112 6 +2e2d4 4 1113 6 +2e2d8 8 1116 6 +2e2e0 4 277 82 +2e2e4 4 1120 6 +2e2e8 4 1122 6 +2e2ec 8 1116 6 +2e2f4 4 277 82 +2e2f8 4 256 82 +2e2fc 4 277 82 +2e300 4 1134 6 +2e304 4 277 82 +2e308 8 1139 87 +2e310 4 256 82 +2e314 8 1120 6 +2e31c c 1122 6 +2e328 20 1122 6 +2e348 8 1122 6 +2e350 c 1125 6 +2e35c 4 1134 6 +2e360 4 1125 6 +2e364 c 1128 6 +2e370 8 1129 6 +2e378 10 1134 6 +2e388 c 1134 6 +2e394 8 156 132 +2e39c 8 1135 6 +2e3a4 4 277 82 +2e3a8 4 1135 6 +2e3ac 4 1139 87 +2e3b0 4 1135 6 +2e3b4 20 1135 6 +2e3d4 4 1135 6 +2e3d8 4 1135 6 +2e3dc 18 1135 6 +2e3f4 8 256 82 +2e3fc 8 1137 6 +2e404 4 277 82 +2e408 4 1137 6 +2e40c 4 1139 87 +2e410 8 277 82 +2e418 4 1138 6 +2e41c 20 1138 6 +2e43c 4 1138 6 +2e440 4 1138 6 +2e444 18 1138 6 +2e45c 4 1138 6 +2e460 4 1138 6 +2e464 8 1138 6 +2e46c c 1138 6 +2e478 8 85 79 +2e480 8 1138 6 +2e488 8 156 132 +2e490 14 256 82 +2e4a4 14 1140 6 +2e4b8 8 1141 6 +2e4c0 4 1139 87 +2e4c4 4 277 82 +2e4c8 4 1141 6 +2e4cc 20 1141 6 +2e4ec 4 1141 6 +2e4f0 4 1141 6 +2e4f4 4 1141 6 +2e4f8 1c 1141 6 +2e514 8 1141 6 +2e51c c 1141 6 +2e528 8 85 79 +2e530 8 1141 6 +2e538 8 156 132 +2e540 8 256 82 +2e548 20 1143 6 +2e568 1c 1144 6 +FUNC 2e584 540 0 ExceptionHandlerTest_WriteMinidumpForChild_Test::TestBody +2e584 4 1154 6 +2e588 4 1156 6 +2e58c 8 1154 6 +2e594 c 1156 6 +2e5a0 10 1154 6 +2e5b0 4 1156 6 +2e5b4 4 1156 6 +2e5b8 4 1156 6 +2e5bc 2c 1156 6 +2e5e8 8 1156 6 +2e5f0 c 302 82 +2e5fc 18 1156 6 +2e614 8 1156 6 +2e61c c 1156 6 +2e628 8 85 79 +2e630 8 1156 6 +2e638 10 256 82 +2e648 4 1158 6 +2e64c 4 256 82 +2e650 8 1158 6 +2e658 4 1159 6 +2e65c 8 1160 6 +2e664 18 1162 6 +2e67c 4 1162 6 +2e680 c 1162 6 +2e68c 8 1163 6 +2e694 8 1164 6 +2e69c 4 1166 6 +2e6a0 c 1168 6 +2e6ac 4 1166 6 +2e6b0 8 1168 6 +2e6b8 c 1169 6 +2e6c4 1c 1170 6 +2e6e0 4 1139 87 +2e6e4 4 1170 6 +2e6e8 4 277 82 +2e6ec 4 1170 6 +2e6f0 20 1170 6 +2e710 4 1170 6 +2e714 4 1170 6 +2e718 1c 1170 6 +2e734 8 1170 6 +2e73c c 1170 6 +2e748 8 85 79 +2e750 8 1170 6 +2e758 8 156 132 +2e760 10 256 82 +2e770 4 1139 87 +2e774 4 256 82 +2e778 c 1175 6 +2e784 8 1176 6 +2e78c 4 277 82 +2e790 4 1176 6 +2e794 4 1139 87 +2e798 4 1176 6 +2e79c 20 1176 6 +2e7bc 4 1176 6 +2e7c0 4 1176 6 +2e7c4 18 1176 6 +2e7dc 8 256 82 +2e7e4 8 1178 6 +2e7ec 4 277 82 +2e7f0 4 1178 6 +2e7f4 4 1139 87 +2e7f8 8 277 82 +2e800 4 1179 6 +2e804 20 1179 6 +2e824 4 1179 6 +2e828 4 1179 6 +2e82c 18 1179 6 +2e844 4 256 82 +2e848 4 1181 6 +2e84c 4 256 82 +2e850 c 1181 6 +2e85c 4 1139 87 +2e860 4 1181 6 +2e864 4 277 82 +2e868 4 1181 6 +2e86c 20 1181 6 +2e88c 4 1181 6 +2e890 4 1181 6 +2e894 18 1181 6 +2e8ac 8 256 82 +2e8b4 4 1182 6 +2e8b8 4 1512 82 +2e8bc 4 1182 6 +2e8c0 1c 1512 82 +2e8dc 8 1182 6 +2e8e4 4 302 82 +2e8e8 4 1182 6 +2e8ec 8 302 82 +2e8f4 18 1182 6 +2e90c 8 1182 6 +2e914 c 1182 6 +2e920 8 85 79 +2e928 8 1182 6 +2e930 4 256 82 +2e934 4 600 65 +2e938 4 1139 87 +2e93c 4 256 82 +2e940 4 600 65 +2e944 8 600 65 +2e94c c 277 82 +2e958 4 1139 87 +2e95c 4 1185 6 +2e960 20 1185 6 +2e980 4 1185 6 +2e984 4 1185 6 +2e988 18 1185 6 +2e9a0 4 1185 6 +2e9a4 4 1185 6 +2e9a8 8 1185 6 +2e9b0 c 1185 6 +2e9bc 8 85 79 +2e9c4 8 1185 6 +2e9cc 8 156 132 +2e9d4 14 256 82 +2e9e8 c 1186 6 +2e9f4 4 1482 82 +2e9f8 c 1481 82 +2ea04 8 1482 82 +2ea0c 18 1487 82 +2ea24 8 1186 6 +2ea2c 4 302 82 +2ea30 4 1186 6 +2ea34 8 302 82 +2ea3c 18 1186 6 +2ea54 8 1186 6 +2ea5c c 1187 6 +2ea68 8 85 79 +2ea70 8 1186 6 +2ea78 8 256 82 +2ea80 8 1189 6 +2ea88 10 1190 6 +2ea98 10 156 132 +2eaa8 1c 1191 6 +FUNC 2eac4 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MicrodumpWriterTest_Setup_Test>::~TestFactoryImpl +2eac4 4 484 85 +FUNC 2eac8 3c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MicrodumpWriterTest_Setup_Test>::CreateTest +2eac8 10 486 85 +2ead8 8 486 85 +2eae0 8 56 11 +2eae8 4 486 85 +2eaec c 56 11 +2eaf8 c 486 85 +FUNC 2eb04 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MicrodumpWriterTest_Setup_Test>::~TestFactoryImpl +2eb04 4 484 85 +FUNC 2eb08 14 0 MicrodumpWriterTest_Setup_Test::~MicrodumpWriterTest_Setup_Test +2eb08 14 56 11 +FUNC 2eb1c 24 0 MicrodumpWriterTest_Setup_Test::~MicrodumpWriterTest_Setup_Test +2eb1c c 56 11 +2eb28 8 56 11 +2eb30 4 56 11 +2eb34 8 56 11 +2eb3c 4 56 11 +FUNC 2eb40 18 0 std::__node_alloc::allocate +2eb40 c 158 101 +2eb4c 8 134 119 +2eb54 4 158 101 +FUNC 2eb58 88 0 testing::PrintToString +2eb58 4 883 80 +2eb5c 4 884 80 +2eb60 8 883 80 +2eb68 4 884 80 +2eb6c 4 883 80 +2eb70 4 884 80 +2eb74 4 883 80 +2eb78 4 883 80 +2eb7c c 884 80 +2eb88 4 310 80 +2eb8c 14 333 122 +2eba0 10 318 80 +2ebb0 8 291 121 +2ebb8 c 75 127 +2ebc4 8 886 80 +2ebcc 14 887 80 +FUNC 2ebe0 148 0 testing::internal::CmpHelperNE +2ebe0 14 1615 82 +2ebf4 14 1615 82 +2ec08 4 1615 82 +2ec0c 4 1615 82 +2ec10 1c 1583 82 +2ec2c 10 1407 82 +2ec3c 4 1583 82 +2ec40 10 1583 82 +2ec50 8 1583 82 +2ec58 c 1583 82 +2ec64 8 1583 82 +2ec6c c 1583 82 +2ec78 8 1583 82 +2ec80 10 1584 82 +2ec90 18 1407 82 +2eca8 c 1584 82 +2ecb4 10 1585 82 +2ecc4 1c 1407 82 +2ece0 10 1585 82 +2ecf0 8 1585 82 +2ecf8 10 156 132 +2ed08 8 256 82 +2ed10 18 1615 82 +FUNC 2ed28 a7c 0 MicrodumpWriterTest_Setup_Test::TestBody +2ed28 14 56 11 +2ed3c 4 58 11 +2ed40 4 56 11 +2ed44 10 58 11 +2ed54 c 56 11 +2ed60 8 58 11 +2ed68 4 58 11 +2ed6c 8 58 11 +2ed74 14 58 11 +2ed88 4 58 11 +2ed8c 10 58 11 +2ed9c 8 58 11 +2eda4 4 1144 87 +2eda8 c 298 82 +2edb4 8 298 82 +2edbc 18 58 11 +2edd4 4 58 11 +2edd8 4 58 11 +2eddc 8 58 11 +2ede4 c 58 11 +2edf0 8 85 79 +2edf8 8 58 11 +2ee00 10 256 82 +2ee10 4 60 11 +2ee14 4 256 82 +2ee18 4 61 11 +2ee1c 4 256 82 +2ee20 8 60 11 +2ee28 14 61 11 +2ee3c 10 62 11 +2ee4c 4 63 11 +2ee50 4 62 11 +2ee54 10 63 11 +2ee64 4 62 11 +2ee68 10 63 11 +2ee78 4 1144 87 +2ee7c c 298 82 +2ee88 8 298 82 +2ee90 18 63 11 +2eea8 4 63 11 +2eeac 4 63 11 +2eeb0 8 63 11 +2eeb8 c 63 11 +2eec4 8 85 79 +2eecc 8 63 11 +2eed4 10 256 82 +2eee4 8 65 11 +2eeec 4 66 11 +2eef0 8 67 11 +2eef8 18 69 11 +2ef10 4 69 11 +2ef14 c 69 11 +2ef20 c 70 11 +2ef2c 8 71 11 +2ef34 4 73 11 +2ef38 4 76 11 +2ef3c c 77 11 +2ef48 8 73 11 +2ef50 10 76 11 +2ef60 10 77 11 +2ef70 c 1481 82 +2ef7c c 1482 82 +2ef88 20 1382 82 +2efa8 24 1471 82 +2efcc 14 156 132 +2efe0 8 77 11 +2efe8 4 1144 87 +2efec c 298 82 +2eff8 8 298 82 +2f000 18 77 11 +2f018 4 77 11 +2f01c 4 77 11 +2f020 8 77 11 +2f028 c 77 11 +2f034 8 85 79 +2f03c 8 77 11 +2f044 10 256 82 +2f054 4 98 11 +2f058 4 256 82 +2f05c 8 80 11 +2f064 8 83 11 +2f06c 4 91 11 +2f070 4 94 11 +2f074 4 91 11 +2f078 4 92 11 +2f07c 4 93 11 +2f080 4 94 11 +2f084 4 93 11 +2f088 8 94 11 +2f090 4 211 116 +2f094 8 98 11 +2f09c 4 211 116 +2f0a0 4 212 116 +2f0a4 8 98 11 +2f0ac c 306 101 +2f0b8 c 307 101 +2f0c4 8 119 103 +2f0cc 88 119 103 +2f154 4 427 116 +2f158 4 103 11 +2f15c c 104 11 +2f168 4 427 116 +2f16c 4 429 116 +2f170 4 428 116 +2f174 4 430 116 +2f178 4 103 11 +2f17c 4 431 116 +2f180 4 104 11 +2f184 8 103 11 +2f18c 28 104 11 +2f1b4 4 1144 87 +2f1b8 c 298 82 +2f1c4 8 298 82 +2f1cc 1c 104 11 +2f1e8 4 105 11 +2f1ec c 256 82 +2f1f8 18 105 11 +2f210 1c 105 11 +2f22c 8 105 11 +2f234 4 1144 87 +2f238 c 298 82 +2f244 8 298 82 +2f24c 1c 105 11 +2f268 c 105 11 +2f274 c 105 11 +2f280 8 85 79 +2f288 8 105 11 +2f290 14 256 82 +2f2a4 10 107 11 +2f2b4 8 1139 87 +2f2bc 4 107 11 +2f2c0 4 277 82 +2f2c4 4 107 11 +2f2c8 4 1139 87 +2f2cc 4 107 11 +2f2d0 24 107 11 +2f2f4 1c 107 11 +2f310 8 107 11 +2f318 c 107 11 +2f324 8 85 79 +2f32c 8 107 11 +2f334 8 156 132 +2f33c c 256 82 +2f348 4 118 11 +2f34c 4 256 82 +2f350 c 110 11 +2f35c 8 111 11 +2f364 8 114 11 +2f36c 10 115 11 +2f37c c 117 11 +2f388 10 118 11 +2f398 4 118 11 +2f39c 8 1623 82 +2f3a4 20 1623 82 +2f3c4 28 1583 82 +2f3ec 10 1583 82 +2f3fc 8 1583 82 +2f404 c 1583 82 +2f410 8 1583 82 +2f418 c 1583 82 +2f424 8 1583 82 +2f42c 10 1584 82 +2f43c c 884 80 +2f448 10 259 121 +2f458 c 75 127 +2f464 8 886 80 +2f46c c 1584 82 +2f478 10 1585 82 +2f488 c 1382 82 +2f494 10 1585 82 +2f4a4 8 1585 82 +2f4ac 10 156 132 +2f4bc c 256 82 +2f4c8 8 118 11 +2f4d0 4 1144 87 +2f4d4 c 298 82 +2f4e0 8 298 82 +2f4e8 18 118 11 +2f500 4 118 11 +2f504 4 118 11 +2f508 8 118 11 +2f510 c 118 11 +2f51c 8 85 79 +2f524 8 118 11 +2f52c c 256 82 +2f538 8 120 11 +2f540 4 120 11 +2f544 4 256 82 +2f548 4 120 11 +2f54c c 120 11 +2f558 4 120 11 +2f55c 4 120 11 +2f560 4 120 11 +2f564 4 120 11 +2f568 1c 120 11 +2f584 8 120 11 +2f58c 4 1144 87 +2f590 c 298 82 +2f59c 8 298 82 +2f5a4 1c 120 11 +2f5c0 c 256 82 +2f5cc 4 122 11 +2f5d0 10 122 11 +2f5e0 4 122 11 +2f5e4 1c 122 11 +2f600 8 122 11 +2f608 4 1144 87 +2f60c c 298 82 +2f618 8 298 82 +2f620 1c 122 11 +2f63c 8 256 82 +2f644 4 124 11 +2f648 10 124 11 +2f658 4 124 11 +2f65c 1c 124 11 +2f678 8 124 11 +2f680 4 1144 87 +2f684 c 298 82 +2f690 8 298 82 +2f698 1c 124 11 +2f6b4 c 124 11 +2f6c0 c 124 11 +2f6cc 8 85 79 +2f6d4 8 124 11 +2f6dc 8 256 82 +2f6e4 c 203 57 +2f6f0 8 256 82 +2f6f8 c 128 11 +2f704 c 129 11 +2f710 8 203 57 +2f718 4 67 115 +2f71c 4 68 115 +2f720 4 67 115 +2f724 8 68 115 +2f72c 4 74 115 +2f730 c 135 119 +2f73c 4 67 115 +2f740 4 68 115 +2f744 4 67 115 +2f748 8 68 115 +2f750 4 74 115 +2f754 c 135 119 +2f760 4 156 132 +2f764 4 61 63 +2f768 4 156 132 +2f76c c 61 63 +2f778 8 156 132 +2f780 24 130 11 +FUNC 2f7a4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7a4 4 484 85 +FUNC 2f7a8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7a8 4 484 85 +FUNC 2f7ac 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7ac 4 484 85 +FUNC 2f7b0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7b0 4 484 85 +FUNC 2f7b4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7b4 4 484 85 +FUNC 2f7b8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7b8 4 484 85 +FUNC 2f7bc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7bc 4 484 85 +FUNC 2f7c0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7c0 4 484 85 +FUNC 2f7c4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7c4 4 484 85 +FUNC 2f7c8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7c8 4 484 85 +FUNC 2f7cc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7cc 4 484 85 +FUNC 2f7d0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7d0 4 484 85 +FUNC 2f7d4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7d4 4 484 85 +FUNC 2f7d8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7d8 4 484 85 +FUNC 2f7dc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7dc 4 484 85 +FUNC 2f7e0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7e0 4 484 85 +FUNC 2f7e4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7e4 4 484 85 +FUNC 2f7e8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7e8 4 484 85 +FUNC 2f7ec 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7ec 4 484 85 +FUNC 2f7f0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +2f7f0 4 484 85 +FUNC 2f7f4 14 0 CpuSetTest_EmptyIntersection_Test::~CpuSetTest_EmptyIntersection_Test +2f7f4 14 146 13 +FUNC 2f808 24 0 CpuSetTest_EmptyIntersection_Test::~CpuSetTest_EmptyIntersection_Test +2f808 c 146 13 +2f814 8 146 13 +2f81c 4 146 13 +2f820 8 146 13 +2f828 4 146 13 +FUNC 2f82c 14 0 CpuSetTest_SelfIntersection_Test::~CpuSetTest_SelfIntersection_Test +2f82c 14 135 13 +FUNC 2f840 24 0 CpuSetTest_SelfIntersection_Test::~CpuSetTest_SelfIntersection_Test +2f840 c 135 13 +2f84c 8 135 13 +2f854 4 135 13 +2f858 8 135 13 +2f860 4 135 13 +FUNC 2f864 14 0 CpuSetTest_IntersectWith_Test::~CpuSetTest_IntersectWith_Test +2f864 14 117 13 +FUNC 2f878 24 0 CpuSetTest_IntersectWith_Test::~CpuSetTest_IntersectWith_Test +2f878 c 117 13 +2f884 8 117 13 +2f88c 4 117 13 +2f890 8 117 13 +2f898 4 117 13 +FUNC 2f89c 14 0 CpuSetTest_MultiItems_Test::~CpuSetTest_MultiItems_Test +2f89c 14 108 13 +FUNC 2f8b0 24 0 CpuSetTest_MultiItems_Test::~CpuSetTest_MultiItems_Test +2f8b0 c 108 13 +2f8bc 8 108 13 +2f8c4 4 108 13 +2f8c8 8 108 13 +2f8d0 4 108 13 +FUNC 2f8d4 14 0 CpuSetTest_TenCpusWithRange_Test::~CpuSetTest_TenCpusWithRange_Test +2f8d4 14 99 13 +FUNC 2f8e8 24 0 CpuSetTest_TenCpusWithRange_Test::~CpuSetTest_TenCpusWithRange_Test +2f8e8 c 99 13 +2f8f4 8 99 13 +2f8fc 4 99 13 +2f900 8 99 13 +2f908 4 99 13 +FUNC 2f90c 14 0 CpuSetTest_TwoCpusWithRange_Test::~CpuSetTest_TwoCpusWithRange_Test +2f90c 14 90 13 +FUNC 2f920 24 0 CpuSetTest_TwoCpusWithRange_Test::~CpuSetTest_TwoCpusWithRange_Test +2f920 c 90 13 +2f92c 8 90 13 +2f934 4 90 13 +2f938 8 90 13 +2f940 4 90 13 +FUNC 2f944 14 0 CpuSetTest_TwoCpusWithComma_Test::~CpuSetTest_TwoCpusWithComma_Test +2f944 14 81 13 +FUNC 2f958 24 0 CpuSetTest_TwoCpusWithComma_Test::~CpuSetTest_TwoCpusWithComma_Test +2f958 c 81 13 +2f964 8 81 13 +2f96c 4 81 13 +2f970 8 81 13 +2f978 4 81 13 +FUNC 2f97c 14 0 CpuSetTest_OneCpuTerminated_Test::~CpuSetTest_OneCpuTerminated_Test +2f97c 14 72 13 +FUNC 2f990 24 0 CpuSetTest_OneCpuTerminated_Test::~CpuSetTest_OneCpuTerminated_Test +2f990 c 72 13 +2f99c 8 72 13 +2f9a4 4 72 13 +2f9a8 8 72 13 +2f9b0 4 72 13 +FUNC 2f9b4 14 0 CpuSetTest_OneCpu_Test::~CpuSetTest_OneCpu_Test +2f9b4 14 63 13 +FUNC 2f9c8 24 0 CpuSetTest_OneCpu_Test::~CpuSetTest_OneCpu_Test +2f9c8 c 63 13 +2f9d4 8 63 13 +2f9dc 4 63 13 +2f9e0 8 63 13 +2f9e8 4 63 13 +FUNC 2f9ec 14 0 CpuSetTest_EmptyCount_Test::~CpuSetTest_EmptyCount_Test +2f9ec 14 58 13 +FUNC 2fa00 24 0 CpuSetTest_EmptyCount_Test::~CpuSetTest_EmptyCount_Test +2fa00 c 58 13 +2fa0c 8 58 13 +2fa14 4 58 13 +2fa18 8 58 13 +2fa20 4 58 13 +FUNC 2fa24 3c 0 testing::internal::TestFactoryImpl::CreateTest +2fa24 10 486 85 +2fa34 8 486 85 +2fa3c 8 146 13 +2fa44 4 486 85 +2fa48 c 146 13 +2fa54 c 486 85 +FUNC 2fa60 3c 0 testing::internal::TestFactoryImpl::CreateTest +2fa60 10 486 85 +2fa70 8 486 85 +2fa78 8 135 13 +2fa80 4 486 85 +2fa84 c 135 13 +2fa90 c 486 85 +FUNC 2fa9c 3c 0 testing::internal::TestFactoryImpl::CreateTest +2fa9c 10 486 85 +2faac 8 486 85 +2fab4 8 117 13 +2fabc 4 486 85 +2fac0 c 117 13 +2facc c 486 85 +FUNC 2fad8 3c 0 testing::internal::TestFactoryImpl::CreateTest +2fad8 10 486 85 +2fae8 8 486 85 +2faf0 8 108 13 +2faf8 4 486 85 +2fafc c 108 13 +2fb08 c 486 85 +FUNC 2fb14 3c 0 testing::internal::TestFactoryImpl::CreateTest +2fb14 10 486 85 +2fb24 8 486 85 +2fb2c 8 99 13 +2fb34 4 486 85 +2fb38 c 99 13 +2fb44 c 486 85 +FUNC 2fb50 3c 0 testing::internal::TestFactoryImpl::CreateTest +2fb50 10 486 85 +2fb60 8 486 85 +2fb68 8 90 13 +2fb70 4 486 85 +2fb74 c 90 13 +2fb80 c 486 85 +FUNC 2fb8c 3c 0 testing::internal::TestFactoryImpl::CreateTest +2fb8c 10 486 85 +2fb9c 8 486 85 +2fba4 8 81 13 +2fbac 4 486 85 +2fbb0 c 81 13 +2fbbc c 486 85 +FUNC 2fbc8 3c 0 testing::internal::TestFactoryImpl::CreateTest +2fbc8 10 486 85 +2fbd8 8 486 85 +2fbe0 8 72 13 +2fbe8 4 486 85 +2fbec c 72 13 +2fbf8 c 486 85 +FUNC 2fc04 3c 0 testing::internal::TestFactoryImpl::CreateTest +2fc04 10 486 85 +2fc14 8 486 85 +2fc1c 8 63 13 +2fc24 4 486 85 +2fc28 c 63 13 +2fc34 c 486 85 +FUNC 2fc40 3c 0 testing::internal::TestFactoryImpl::CreateTest +2fc40 10 486 85 +2fc50 8 486 85 +2fc58 8 58 13 +2fc60 4 486 85 +2fc64 c 58 13 +2fc70 c 486 85 +FUNC 2fc7c c 0 google_breakpad::CpuSet::CpuSet +2fc7c c 51 12 +FUNC 2fc88 184 0 google_breakpad::CpuSet::ParseSysFile +2fc88 4 55 12 +2fc8c 4 3104 97 +2fc90 14 55 12 +2fca4 4 3104 97 +2fca8 8 55 12 +2fcb0 18 3104 97 +2fcc8 4 3104 97 +2fccc c 3104 97 +2fcd8 4 58 12 +2fcdc 4 61 12 +2fce0 4 71 12 +2fce4 4 100 12 +2fce8 4 102 12 +2fcec 4 131 12 +2fcf0 4 61 12 +2fcf4 4 72 12 +2fcf8 c 73 12 +2fd04 8 75 12 +2fd0c 4 75 12 +2fd10 4 76 12 +2fd14 c 75 12 +2fd20 8 109 12 +2fd28 8 59 12 +2fd30 14 82 12 +2fd44 4 84 12 +2fd48 4 83 12 +2fd4c 8 92 12 +2fd54 8 92 12 +2fd5c 4 92 12 +2fd60 14 93 12 +2fd74 8 96 12 +2fd7c 8 101 12 +2fd84 4 100 12 +2fd88 8 101 12 +2fd90 8 102 12 +2fd98 c 103 12 +2fda4 c 104 12 +2fdb0 10 106 12 +2fdc0 4 130 12 +2fdc4 4 107 12 +2fdc8 4 130 12 +2fdcc 1c 131 12 +2fde8 8 130 12 +2fdf0 1c 110 12 +FUNC 2fe0c 48 0 google_breakpad::CpuSet::GetCount +2fe0c c 119 12 +2fe18 4 121 12 +2fe1c 4 119 12 +2fe20 4 120 12 +2fe24 4 119 12 +2fe28 4 122 12 +2fe2c 4 121 12 +2fe30 8 122 12 +2fe38 8 121 12 +2fe40 14 125 12 +FUNC 2fe54 10 0 google_breakpad::AutoTestFile::~AutoTestFile +2fe54 8 73 52 +2fe5c 4 74 52 +2fe60 4 77 52 +FUNC 2fe64 68 0 google_breakpad::AutoTestFile::Init +2fe64 4 92 52 +2fe68 4 97 52 +2fe6c 4 92 52 +2fe70 8 97 52 +2fe78 c 92 52 +2fe84 4 92 52 +2fe88 4 97 52 +2fe8c 8 93 52 +2fe94 8 97 52 +2fe9c 8 98 52 +2fea4 c 101 52 +2feb0 4 102 52 +2feb4 8 105 52 +2febc 10 106 52 +FUNC 2fecc ac 0 ScopedTestFile::ScopedTestFile +2fecc 10 51 13 +2fedc 4 60 52 +2fee0 4 51 13 +2fee4 4 60 52 +2fee8 4 51 13 +2feec 4 60 52 +2fef0 8 61 52 +2fef8 c 62 52 +2ff04 1c 109 52 +2ff20 4 109 52 +2ff24 c 109 52 +2ff30 8 110 52 +2ff38 8 111 52 +2ff40 c 112 52 +2ff4c 8 116 52 +2ff54 c 53 13 +2ff60 8 116 52 +2ff68 10 53 13 +FUNC 2ff78 c4 0 CpuSetTest_EmptyCount_Test::TestBody +2ff78 c 58 13 +2ff84 4 59 13 +2ff88 4 1552 82 +2ff8c 4 59 13 +2ff90 4 58 13 +2ff94 4 59 13 +2ff98 8 60 13 +2ffa0 c 1552 82 +2ffac 8 60 13 +2ffb4 20 1552 82 +2ffd4 8 60 13 +2ffdc c 302 82 +2ffe8 18 60 13 +30000 8 60 13 +30008 c 60 13 +30014 8 85 79 +3001c 8 60 13 +30024 8 256 82 +3002c 10 61 13 +FUNC 3003c 224 0 CpuSetTest_OneCpu_Test::TestBody +3003c 4 63 13 +30040 4 64 13 +30044 8 63 13 +3004c c 64 13 +30058 c 63 13 +30064 4 64 13 +30068 4 1139 87 +3006c 4 82 52 +30070 c 277 82 +3007c c 82 52 +30088 8 277 82 +30090 4 65 13 +30094 24 65 13 +300b8 1c 65 13 +300d4 8 65 13 +300dc c 65 13 +300e8 8 85 79 +300f0 8 65 13 +300f8 c 156 132 +30104 c 256 82 +30110 8 67 13 +30118 c 68 13 +30124 4 1139 87 +30128 4 68 13 +3012c 4 277 82 +30130 4 68 13 +30134 20 68 13 +30154 4 68 13 +30158 4 68 13 +3015c 1c 68 13 +30178 8 68 13 +30180 c 68 13 +3018c 8 85 79 +30194 8 68 13 +3019c 8 156 132 +301a4 10 256 82 +301b4 14 69 13 +301c8 20 1512 82 +301e8 8 69 13 +301f0 c 302 82 +301fc 18 69 13 +30214 8 69 13 +3021c c 69 13 +30228 8 85 79 +30230 8 69 13 +30238 8 256 82 +30240 8 49 13 +30248 18 70 13 +FUNC 30260 224 0 CpuSetTest_OneCpuTerminated_Test::TestBody +30260 4 72 13 +30264 4 73 13 +30268 8 72 13 +30270 c 73 13 +3027c c 72 13 +30288 4 73 13 +3028c 4 1139 87 +30290 4 82 52 +30294 c 277 82 +302a0 c 82 52 +302ac 8 277 82 +302b4 4 74 13 +302b8 24 74 13 +302dc 1c 74 13 +302f8 8 74 13 +30300 c 74 13 +3030c 8 85 79 +30314 8 74 13 +3031c c 156 132 +30328 c 256 82 +30334 8 76 13 +3033c c 77 13 +30348 4 1139 87 +3034c 4 77 13 +30350 4 277 82 +30354 4 77 13 +30358 20 77 13 +30378 4 77 13 +3037c 4 77 13 +30380 1c 77 13 +3039c 8 77 13 +303a4 c 77 13 +303b0 8 85 79 +303b8 8 77 13 +303c0 8 156 132 +303c8 10 256 82 +303d8 14 78 13 +303ec 20 1512 82 +3040c 8 78 13 +30414 c 302 82 +30420 18 78 13 +30438 8 78 13 +30440 c 78 13 +3044c 8 85 79 +30454 8 78 13 +3045c 8 256 82 +30464 8 49 13 +3046c 18 79 13 +FUNC 30484 224 0 CpuSetTest_TwoCpusWithComma_Test::TestBody +30484 4 81 13 +30488 4 82 13 +3048c 8 81 13 +30494 c 82 13 +304a0 c 81 13 +304ac 4 82 13 +304b0 4 1139 87 +304b4 4 82 52 +304b8 c 277 82 +304c4 c 82 52 +304d0 8 277 82 +304d8 4 83 13 +304dc 24 83 13 +30500 1c 83 13 +3051c 8 83 13 +30524 c 83 13 +30530 8 85 79 +30538 8 83 13 +30540 c 156 132 +3054c c 256 82 +30558 8 85 13 +30560 c 86 13 +3056c 4 1139 87 +30570 4 86 13 +30574 4 277 82 +30578 4 86 13 +3057c 20 86 13 +3059c 4 86 13 +305a0 4 86 13 +305a4 1c 86 13 +305c0 8 86 13 +305c8 c 86 13 +305d4 8 85 79 +305dc 8 86 13 +305e4 8 156 132 +305ec c 256 82 +305f8 4 87 13 +305fc 4 256 82 +30600 10 87 13 +30610 20 1512 82 +30630 8 87 13 +30638 c 302 82 +30644 18 87 13 +3065c 8 87 13 +30664 c 87 13 +30670 8 85 79 +30678 8 87 13 +30680 8 256 82 +30688 8 49 13 +30690 18 88 13 +FUNC 306a8 224 0 CpuSetTest_TwoCpusWithRange_Test::TestBody +306a8 4 90 13 +306ac 4 91 13 +306b0 8 90 13 +306b8 c 91 13 +306c4 c 90 13 +306d0 4 91 13 +306d4 4 1139 87 +306d8 4 82 52 +306dc c 277 82 +306e8 c 82 52 +306f4 8 277 82 +306fc 4 92 13 +30700 24 92 13 +30724 1c 92 13 +30740 8 92 13 +30748 c 92 13 +30754 8 85 79 +3075c 8 92 13 +30764 c 156 132 +30770 c 256 82 +3077c 8 94 13 +30784 c 95 13 +30790 4 1139 87 +30794 4 95 13 +30798 4 277 82 +3079c 4 95 13 +307a0 20 95 13 +307c0 4 95 13 +307c4 4 95 13 +307c8 1c 95 13 +307e4 8 95 13 +307ec c 95 13 +307f8 8 85 79 +30800 8 95 13 +30808 8 156 132 +30810 c 256 82 +3081c 4 96 13 +30820 4 256 82 +30824 10 96 13 +30834 20 1512 82 +30854 8 96 13 +3085c c 302 82 +30868 18 96 13 +30880 8 96 13 +30888 c 96 13 +30894 8 85 79 +3089c 8 96 13 +308a4 8 256 82 +308ac 8 49 13 +308b4 18 97 13 +FUNC 308cc 224 0 CpuSetTest_TenCpusWithRange_Test::TestBody +308cc 4 99 13 +308d0 4 100 13 +308d4 8 99 13 +308dc c 100 13 +308e8 c 99 13 +308f4 4 100 13 +308f8 4 1139 87 +308fc 4 82 52 +30900 c 277 82 +3090c c 82 52 +30918 8 277 82 +30920 4 101 13 +30924 24 101 13 +30948 1c 101 13 +30964 8 101 13 +3096c c 101 13 +30978 8 85 79 +30980 8 101 13 +30988 c 156 132 +30994 c 256 82 +309a0 8 103 13 +309a8 c 104 13 +309b4 4 1139 87 +309b8 4 104 13 +309bc 4 277 82 +309c0 4 104 13 +309c4 20 104 13 +309e4 4 104 13 +309e8 4 104 13 +309ec 1c 104 13 +30a08 8 104 13 +30a10 c 104 13 +30a1c 8 85 79 +30a24 8 104 13 +30a2c 8 156 132 +30a34 10 256 82 +30a44 14 105 13 +30a58 20 1512 82 +30a78 8 105 13 +30a80 c 302 82 +30a8c 18 105 13 +30aa4 8 105 13 +30aac c 105 13 +30ab8 8 85 79 +30ac0 8 105 13 +30ac8 8 256 82 +30ad0 8 49 13 +30ad8 18 106 13 +FUNC 30af0 224 0 CpuSetTest_MultiItems_Test::TestBody +30af0 4 108 13 +30af4 4 109 13 +30af8 8 108 13 +30b00 c 109 13 +30b0c c 108 13 +30b18 4 109 13 +30b1c 4 1139 87 +30b20 4 82 52 +30b24 c 277 82 +30b30 c 82 52 +30b3c 8 277 82 +30b44 4 110 13 +30b48 24 110 13 +30b6c 1c 110 13 +30b88 8 110 13 +30b90 c 110 13 +30b9c 8 85 79 +30ba4 8 110 13 +30bac c 156 132 +30bb8 c 256 82 +30bc4 8 112 13 +30bcc c 113 13 +30bd8 4 1139 87 +30bdc 4 113 13 +30be0 4 277 82 +30be4 4 113 13 +30be8 20 113 13 +30c08 4 113 13 +30c0c 4 113 13 +30c10 1c 113 13 +30c2c 8 113 13 +30c34 c 113 13 +30c40 8 85 79 +30c48 8 113 13 +30c50 8 156 132 +30c58 10 256 82 +30c68 14 114 13 +30c7c 20 1512 82 +30c9c 8 114 13 +30ca4 c 302 82 +30cb0 18 114 13 +30cc8 8 114 13 +30cd0 c 114 13 +30cdc 8 85 79 +30ce4 8 114 13 +30cec 8 256 82 +30cf4 8 49 13 +30cfc 18 115 13 +FUNC 30d14 54c 0 CpuSetTest_IntersectWith_Test::TestBody +30d14 4 117 13 +30d18 4 118 13 +30d1c 8 117 13 +30d24 c 118 13 +30d30 14 117 13 +30d44 4 118 13 +30d48 4 82 52 +30d4c 4 277 82 +30d50 8 1139 87 +30d58 c 82 52 +30d64 c 277 82 +30d70 4 119 13 +30d74 24 119 13 +30d98 1c 119 13 +30db4 8 119 13 +30dbc c 119 13 +30dc8 8 85 79 +30dd0 8 119 13 +30dd8 c 156 132 +30de4 4 256 82 +30de8 4 1139 87 +30dec 4 256 82 +30df0 8 120 13 +30df8 c 121 13 +30e04 4 277 82 +30e08 4 121 13 +30e0c 4 1139 87 +30e10 4 121 13 +30e14 20 121 13 +30e34 4 121 13 +30e38 4 121 13 +30e3c 1c 121 13 +30e58 8 121 13 +30e60 c 121 13 +30e6c 8 85 79 +30e74 8 121 13 +30e7c 8 156 132 +30e84 10 256 82 +30e94 8 1512 82 +30e9c 4 256 82 +30ea0 14 122 13 +30eb4 1c 1512 82 +30ed0 8 122 13 +30ed8 c 302 82 +30ee4 18 122 13 +30efc 8 122 13 +30f04 c 122 13 +30f10 8 85 79 +30f18 8 122 13 +30f20 c 256 82 +30f2c 8 124 13 +30f34 4 256 82 +30f38 10 124 13 +30f48 4 1139 87 +30f4c c 82 52 +30f58 4 277 82 +30f5c 4 125 13 +30f60 24 125 13 +30f84 1c 125 13 +30fa0 8 125 13 +30fa8 c 125 13 +30fb4 8 85 79 +30fbc 8 125 13 +30fc4 c 156 132 +30fd0 4 256 82 +30fd4 4 1139 87 +30fd8 4 256 82 +30fdc 8 126 13 +30fe4 c 127 13 +30ff0 4 277 82 +30ff4 4 127 13 +30ff8 4 1139 87 +30ffc 4 127 13 +31000 20 127 13 +31020 4 127 13 +31024 4 127 13 +31028 1c 127 13 +31044 8 127 13 +3104c c 127 13 +31058 8 85 79 +31060 8 127 13 +31068 8 156 132 +31070 c 256 82 +3107c 4 1512 82 +31080 4 256 82 +31084 14 128 13 +31098 24 1512 82 +310bc c 128 13 +310c8 c 302 82 +310d4 18 128 13 +310ec 8 128 13 +310f4 c 128 13 +31100 8 85 79 +31108 8 128 13 +31110 10 256 82 +31120 4 114 12 +31124 10 115 12 +31134 4 114 12 +31138 8 114 12 +31140 18 131 13 +31158 1c 1512 82 +31174 8 131 13 +3117c c 302 82 +31188 18 131 13 +311a0 8 256 82 +311a8 14 132 13 +311bc 1c 1512 82 +311d8 8 132 13 +311e0 c 302 82 +311ec 18 132 13 +31204 8 132 13 +3120c c 132 13 +31218 8 85 79 +31220 8 132 13 +31228 8 256 82 +31230 10 49 13 +31240 20 133 13 +FUNC 31260 290 0 CpuSetTest_SelfIntersection_Test::TestBody +31260 4 135 13 +31264 4 136 13 +31268 8 135 13 +31270 c 136 13 +3127c 10 135 13 +3128c 4 136 13 +31290 4 1139 87 +31294 4 82 52 +31298 c 277 82 +312a4 c 82 52 +312b0 8 277 82 +312b8 4 137 13 +312bc 24 137 13 +312e0 1c 137 13 +312fc 8 137 13 +31304 c 137 13 +31310 8 85 79 +31318 8 137 13 +31320 c 156 132 +3132c c 256 82 +31338 8 138 13 +31340 c 139 13 +3134c 4 1139 87 +31350 4 139 13 +31354 4 277 82 +31358 4 139 13 +3135c 20 139 13 +3137c 4 139 13 +31380 4 139 13 +31384 1c 139 13 +313a0 8 139 13 +313a8 c 139 13 +313b4 8 85 79 +313bc 8 139 13 +313c4 8 156 132 +313cc c 256 82 +313d8 8 1512 82 +313e0 4 140 13 +313e4 4 256 82 +313e8 4 1512 82 +313ec 8 140 13 +313f4 4 1512 82 +313f8 8 140 13 +31400 18 1512 82 +31418 8 140 13 +31420 c 302 82 +3142c 18 140 13 +31444 8 256 82 +3144c 10 143 13 +3145c 18 1512 82 +31474 8 143 13 +3147c c 302 82 +31488 18 143 13 +314a0 8 143 13 +314a8 c 143 13 +314b4 8 85 79 +314bc 8 143 13 +314c4 8 256 82 +314cc 8 49 13 +314d4 1c 144 13 +FUNC 314f0 540 0 CpuSetTest_EmptyIntersection_Test::TestBody +314f0 4 146 13 +314f4 4 147 13 +314f8 c 146 13 +31504 c 147 13 +31510 10 146 13 +31520 4 147 13 +31524 4 1139 87 +31528 4 82 52 +3152c c 277 82 +31538 c 82 52 +31544 8 277 82 +3154c 4 148 13 +31550 24 148 13 +31574 1c 148 13 +31590 8 148 13 +31598 c 148 13 +315a4 8 85 79 +315ac 8 148 13 +315b4 c 156 132 +315c0 4 256 82 +315c4 4 1139 87 +315c8 4 256 82 +315cc 8 149 13 +315d4 c 150 13 +315e0 4 277 82 +315e4 4 150 13 +315e8 4 1139 87 +315ec 4 150 13 +315f0 20 150 13 +31610 4 150 13 +31614 4 150 13 +31618 1c 150 13 +31634 8 150 13 +3163c c 150 13 +31648 8 85 79 +31650 8 150 13 +31658 8 156 132 +31660 10 256 82 +31670 8 1512 82 +31678 4 256 82 +3167c 14 151 13 +31690 1c 1512 82 +316ac 10 151 13 +316bc c 302 82 +316c8 18 151 13 +316e0 8 151 13 +316e8 c 151 13 +316f4 8 85 79 +316fc 8 151 13 +31704 c 256 82 +31710 8 153 13 +31718 4 256 82 +3171c 10 153 13 +3172c 4 1139 87 +31730 c 82 52 +3173c 4 277 82 +31740 4 154 13 +31744 24 154 13 +31768 1c 154 13 +31784 8 154 13 +3178c c 154 13 +31798 8 85 79 +317a0 8 154 13 +317a8 c 156 132 +317b4 4 256 82 +317b8 4 1139 87 +317bc 4 256 82 +317c0 8 155 13 +317c8 c 156 13 +317d4 4 277 82 +317d8 4 156 13 +317dc 4 1139 87 +317e0 4 156 13 +317e4 20 156 13 +31804 4 156 13 +31808 4 156 13 +3180c 1c 156 13 +31828 8 156 13 +31830 c 156 13 +3183c 8 85 79 +31844 8 156 13 +3184c 8 156 132 +31854 c 256 82 +31860 4 1512 82 +31864 4 256 82 +31868 14 157 13 +3187c 18 1512 82 +31894 8 157 13 +3189c c 302 82 +318a8 18 157 13 +318c0 8 157 13 +318c8 c 157 13 +318d4 8 85 79 +318dc 8 157 13 +318e4 10 256 82 +318f4 4 114 12 +318f8 10 115 12 +31908 4 114 12 +3190c 8 114 12 +31914 14 160 13 +31928 20 1552 82 +31948 8 160 13 +31950 c 302 82 +3195c 18 160 13 +31974 8 256 82 +3197c 14 162 13 +31990 18 1512 82 +319a8 8 162 13 +319b0 c 302 82 +319bc 18 162 13 +319d4 8 162 13 +319dc c 162 13 +319e8 8 85 79 +319f0 8 162 13 +319f8 8 256 82 +31a00 10 49 13 +31a10 20 163 13 +FUNC 31a30 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +31a30 4 484 85 +FUNC 31a34 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +31a34 4 484 85 +FUNC 31a38 14 0 DirectoryReaderTest_CompareResults_Test::~DirectoryReaderTest_CompareResults_Test +31a38 14 47 15 +FUNC 31a4c 24 0 DirectoryReaderTest_CompareResults_Test::~DirectoryReaderTest_CompareResults_Test +31a4c c 47 15 +31a58 8 47 15 +31a60 4 47 15 +31a64 8 47 15 +31a6c 4 47 15 +FUNC 31a70 3c 0 testing::internal::TestFactoryImpl::CreateTest +31a70 10 486 85 +31a80 8 486 85 +31a88 8 47 15 +31a90 4 486 85 +31a94 c 47 15 +31aa0 c 486 85 +FUNC 31aac 4c 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::basic_string, std::allocator >, std::priv::_Identity, std::allocator > >, std::priv::_SetTraitsT, std::allocator > >, std::allocator, std::allocator > > >::_M_create_node +31aac 4 315 136 +31ab0 4 306 101 +31ab4 8 315 136 +31abc 4 315 136 +31ac0 8 306 101 +31ac8 8 307 101 +31ad0 8 119 103 +31ad8 8 119 103 +31ae0 4 321 136 +31ae4 4 324 136 +31ae8 4 322 136 +31aec c 324 136 +FUNC 31af8 58 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::basic_string, std::allocator >, std::priv::_Identity, std::allocator > >, std::priv::_SetTraitsT, std::allocator > >, std::allocator, std::allocator > > >::_M_erase +31af8 18 655 135 +31b10 4 657 135 +31b14 c 658 135 +31b20 4 659 135 +31b24 8 156 132 +31b2c 14 161 101 +31b40 10 664 135 +FUNC 31b50 60 0 std::operator< , std::allocator > +31b50 14 351 134 +31b64 4 1073 131 +31b68 c 1074 131 +31b74 4 1073 131 +31b78 8 1074 131 +31b80 8 226 140 +31b88 4 1076 131 +31b8c 4 1076 131 +31b90 4 1076 131 +31b94 c 1076 131 +31ba0 10 355 134 +FUNC 31bb0 5c 0 std::priv::_Rb_global::_Rotate_left +31bb0 4 62 135 +31bb4 8 63 135 +31bbc 8 64 135 +31bc4 4 65 135 +31bc8 8 66 135 +31bd0 c 68 135 +31bdc 8 69 135 +31be4 10 70 135 +31bf4 8 71 135 +31bfc 4 73 135 +31c00 4 74 135 +31c04 4 75 135 +31c08 4 76 135 +FUNC 31c0c 5c 0 std::priv::_Rb_global::_Rotate_right +31c0c 4 81 135 +31c10 8 82 135 +31c18 8 83 135 +31c20 4 84 135 +31c24 8 85 135 +31c2c c 87 135 +31c38 8 88 135 +31c40 10 89 135 +31c50 8 90 135 +31c58 4 92 135 +31c5c 4 93 135 +31c60 4 94 135 +31c64 4 95 135 +FUNC 31c68 124 0 std::priv::_Rb_global::_Rebalance +31c68 10 98 135 +31c78 8 98 135 +31c80 4 100 135 +31c84 4 133 135 +31c88 c 101 135 +31c94 8 139 135 +31c9c 10 140 135 +31cac c 101 135 +31cb8 10 102 135 +31cc8 4 103 135 +31ccc 4 104 135 +31cd0 8 104 135 +31cd8 c 111 135 +31ce4 10 113 135 +31cf4 4 115 135 +31cf8 4 117 135 +31cfc 4 115 135 +31d00 c 116 135 +31d0c 10 117 135 +31d1c 4 122 135 +31d20 8 122 135 +31d28 4 123 135 +31d2c 4 124 135 +31d30 c 125 135 +31d3c c 126 135 +31d48 c 129 135 +31d54 10 131 135 +31d64 4 133 135 +31d68 4 135 135 +31d6c 4 133 135 +31d70 c 134 135 +31d7c 10 135 135 +FUNC 31d8c dc 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::basic_string, std::allocator >, std::priv::_Identity, std::allocator > >, std::priv::_SetTraitsT, std::allocator > >, std::allocator, std::allocator > > >::_M_insert +31d8c 4 350 135 +31d90 4 358 135 +31d94 c 350 135 +31da0 c 350 135 +31dac 4 358 135 +31db0 c 359 135 +31dbc 4 360 135 +31dc0 4 361 135 +31dc4 8 362 135 +31dcc 4 364 135 +31dd0 4 364 135 +31dd4 14 79 106 +31de8 8 364 135 +31df0 8 367 135 +31df8 4 368 135 +31dfc 4 367 135 +31e00 c 369 135 +31e0c 8 370 135 +31e14 8 373 135 +31e1c 4 374 135 +31e20 4 373 135 +31e24 c 375 135 +31e30 4 376 135 +31e34 8 379 135 +31e3c 4 378 135 +31e40 4 379 135 +31e44 4 380 135 +31e48 4 382 135 +31e4c 8 380 135 +31e54 4 142 136 +31e58 10 382 135 +FUNC 31e68 950 0 DirectoryReaderTest_CompareResults_Test::TestBody +31e68 14 47 15 +31e7c 4 481 101 +31e80 8 50 15 +31e88 4 277 82 +31e8c 4 47 15 +31e90 4 1139 87 +31e94 4 481 101 +31e98 c 47 15 +31ea4 4 263 136 +31ea8 8 266 136 +31eb0 8 267 136 +31eb8 4 391 136 +31ebc 4 50 15 +31ec0 4 51 15 +31ec4 4 50 15 +31ec8 4 51 15 +31ecc 4 277 82 +31ed0 8 1139 87 +31ed8 4 51 15 +31edc 20 51 15 +31efc 4 51 15 +31f00 4 51 15 +31f04 1c 51 15 +31f20 8 51 15 +31f28 c 51 15 +31f34 8 85 79 +31f3c 8 51 15 +31f44 8 156 132 +31f4c 10 256 82 +31f5c 10 54 15 +31f6c c 55 15 +31f78 4 406 135 +31f7c 4 55 15 +31f80 4 407 135 +31f84 4 408 135 +31f88 4 409 135 +31f8c 14 79 106 +31fa0 8 412 135 +31fa8 8 412 135 +31fb0 4 412 135 +31fb4 c 47 15 +31fc0 4 409 135 +31fc4 4 415 135 +31fc8 c 416 135 +31fd4 18 417 135 +31fec 8 279 135 +31ff4 10 279 135 +32004 8 280 135 +3200c 8 281 135 +32014 10 99 136 +32024 4 285 135 +32028 c 286 135 +32034 c 288 135 +32040 4 187 136 +32044 10 79 106 +32054 4 421 135 +32058 1c 422 135 +32074 c 156 132 +32080 4 57 15 +32084 4 59 15 +32088 4 57 15 +3208c c 59 15 +32098 4 60 15 +3209c 4 59 15 +320a0 4 1621 82 +320a4 4 1621 82 +320a8 8 1621 82 +320b0 24 1621 82 +320d4 8 60 15 +320dc 4 1144 87 +320e0 c 298 82 +320ec 8 298 82 +320f4 18 60 15 +3210c 8 60 15 +32114 c 60 15 +32120 8 85 79 +32128 8 60 15 +32130 c 256 82 +3213c 4 63 15 +32140 8 3016 97 +32148 4 256 82 +3214c c 51 14 +32158 8 553 136 +32160 8 65 14 +32168 20 3016 97 +32188 4 3016 97 +3218c c 3016 97 +32198 8 68 14 +321a0 4 70 14 +321a4 c 71 14 +321b0 c 73 14 +321bc 8 77 14 +321c4 c 77 14 +321d0 10 553 136 +321e0 10 79 106 +321f0 4 156 132 +321f4 4 79 106 +321f8 4 156 132 +321fc 8 553 136 +32204 4 554 136 +32208 8 556 136 +32210 4 552 136 +32214 8 558 136 +3221c 10 559 136 +3222c 10 79 106 +3223c 8 156 132 +32244 8 560 136 +3224c 4 200 136 +32250 4 1139 87 +32254 4 200 136 +32258 4 277 82 +3225c 4 67 15 +32260 20 67 15 +32280 4 67 15 +32284 4 67 15 +32288 4 67 15 +3228c 1c 67 15 +322a8 8 67 15 +322b0 c 67 15 +322bc 8 85 79 +322c4 8 67 15 +322cc 8 156 132 +322d4 18 256 82 +322ec 8 1481 82 +322f4 8 1482 82 +322fc 8 76 15 +32304 8 256 82 +3230c 8 77 15 +32314 8 531 136 +3231c 10 532 136 +3232c 8 553 136 +32334 4 549 136 +32338 4 553 136 +3233c 4 552 136 +32340 10 553 136 +32350 10 79 106 +32360 8 156 132 +32368 4 553 136 +3236c 8 554 136 +32374 14 556 136 +32388 8 558 136 +32390 14 559 136 +323a4 10 79 106 +323b4 8 156 132 +323bc 8 560 136 +323c4 4 200 136 +323c8 4 1139 87 +323cc 4 200 136 +323d0 4 277 82 +323d4 4 1139 87 +323d8 4 72 15 +323dc 20 72 15 +323fc 4 72 15 +32400 4 72 15 +32404 18 72 15 +3241c 4 256 82 +32420 4 553 136 +32424 4 549 136 +32428 4 553 136 +3242c 8 256 82 +32434 4 552 136 +32438 10 553 136 +32448 10 79 106 +32458 8 156 132 +32460 4 553 136 +32464 8 554 136 +3246c 14 556 136 +32480 8 558 136 +32488 14 559 136 +3249c 10 79 106 +324ac 8 156 132 +324b4 8 560 136 +324bc 4 200 136 +324c0 4 1139 87 +324c4 4 200 136 +324c8 4 277 82 +324cc 4 1139 87 +324d0 4 73 15 +324d4 20 73 15 +324f4 4 73 15 +324f8 4 73 15 +324fc 18 73 15 +32514 4 256 82 +32518 4 553 136 +3251c 4 549 136 +32520 4 553 136 +32524 8 256 82 +3252c 4 552 136 +32530 10 553 136 +32540 10 79 106 +32550 8 156 132 +32558 4 553 136 +3255c 8 554 136 +32564 14 556 136 +32578 8 558 136 +32580 14 559 136 +32594 10 79 106 +325a4 8 156 132 +325ac 8 560 136 +325b4 4 200 136 +325b8 4 1139 87 +325bc 4 200 136 +325c0 4 277 82 +325c4 4 1139 87 +325c8 4 74 15 +325cc 20 74 15 +325ec 4 74 15 +325f0 4 74 15 +325f4 18 74 15 +3260c 4 74 15 +32610 4 74 15 +32614 8 74 15 +3261c c 74 15 +32628 8 85 79 +32630 8 74 15 +32638 8 156 132 +32640 8 256 82 +32648 8 884 80 +32650 4 263 121 +32654 4 884 80 +32658 8 263 121 +32660 4 75 127 +32664 4 263 121 +32668 c 75 127 +32674 8 886 80 +3267c c 884 80 +32688 8 254 121 +32690 4 75 127 +32694 4 254 121 +32698 c 75 127 +326a4 8 886 80 +326ac 24 1471 82 +326d0 14 156 132 +326e4 4 1144 87 +326e8 c 298 82 +326f4 8 298 82 +326fc 1c 76 15 +32718 8 76 15 +32720 c 76 15 +3272c 8 85 79 +32734 8 76 15 +3273c c 256 82 +32748 8 549 136 +32750 c 556 136 +3275c 4 256 82 +32760 4 68 15 +32764 4 256 82 +32768 8 87 14 +32770 4 93 14 +32774 c 94 14 +32780 8 93 14 +32788 c 94 14 +32794 24 78 15 +FUNC 327b8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327b8 4 484 85 +FUNC 327bc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327bc 4 484 85 +FUNC 327c0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327c0 4 484 85 +FUNC 327c4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327c4 4 484 85 +FUNC 327c8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327c8 4 484 85 +FUNC 327cc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327cc 4 484 85 +FUNC 327d0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327d0 4 484 85 +FUNC 327d4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327d4 4 484 85 +FUNC 327d8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327d8 4 484 85 +FUNC 327dc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327dc 4 484 85 +FUNC 327e0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327e0 4 484 85 +FUNC 327e4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327e4 4 484 85 +FUNC 327e8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327e8 4 484 85 +FUNC 327ec 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +327ec 4 484 85 +FUNC 327f0 14 0 LineReaderTest_TooLong_Test::~LineReaderTest_TooLong_Test +327f0 14 158 17 +FUNC 32804 24 0 LineReaderTest_TooLong_Test::~LineReaderTest_TooLong_Test +32804 c 158 17 +32810 8 158 17 +32818 4 158 17 +3281c 8 158 17 +32824 4 158 17 +FUNC 32828 14 0 LineReaderTest_MaxLength_Test::~LineReaderTest_MaxLength_Test +32828 14 143 17 +FUNC 3283c 24 0 LineReaderTest_MaxLength_Test::~LineReaderTest_MaxLength_Test +3283c c 143 17 +32848 8 143 17 +32850 4 143 17 +32854 8 143 17 +3285c 4 143 17 +FUNC 32860 14 0 LineReaderTest_TwoLines_Test::~LineReaderTest_TwoLines_Test +32860 14 121 17 +FUNC 32874 24 0 LineReaderTest_TwoLines_Test::~LineReaderTest_TwoLines_Test +32874 c 121 17 +32880 8 121 17 +32888 4 121 17 +3288c 8 121 17 +32894 4 121 17 +FUNC 32898 14 0 LineReaderTest_TwoLinesTerminated_Test::~LineReaderTest_TwoLinesTerminated_Test +32898 14 99 17 +FUNC 328ac 24 0 LineReaderTest_TwoLinesTerminated_Test::~LineReaderTest_TwoLinesTerminated_Test +328ac c 99 17 +328b8 8 99 17 +328c0 4 99 17 +328c4 8 99 17 +328cc 4 99 17 +FUNC 328d0 14 0 LineReaderTest_OneLine_Test::~LineReaderTest_OneLine_Test +328d0 14 83 17 +FUNC 328e4 24 0 LineReaderTest_OneLine_Test::~LineReaderTest_OneLine_Test +328e4 c 83 17 +328f0 8 83 17 +328f8 4 83 17 +328fc 8 83 17 +32904 4 83 17 +FUNC 32908 14 0 LineReaderTest_OneLineTerminated_Test::~LineReaderTest_OneLineTerminated_Test +32908 14 67 17 +FUNC 3291c 24 0 LineReaderTest_OneLineTerminated_Test::~LineReaderTest_OneLineTerminated_Test +3291c c 67 17 +32928 8 67 17 +32930 4 67 17 +32934 8 67 17 +3293c 4 67 17 +FUNC 32940 14 0 LineReaderTest_EmptyFile_Test::~LineReaderTest_EmptyFile_Test +32940 14 57 17 +FUNC 32954 24 0 LineReaderTest_EmptyFile_Test::~LineReaderTest_EmptyFile_Test +32954 c 57 17 +32960 8 57 17 +32968 4 57 17 +3296c 8 57 17 +32974 4 57 17 +FUNC 32978 3c 0 testing::internal::TestFactoryImpl::CreateTest +32978 10 486 85 +32988 8 486 85 +32990 8 158 17 +32998 4 486 85 +3299c c 158 17 +329a8 c 486 85 +FUNC 329b4 3c 0 testing::internal::TestFactoryImpl::CreateTest +329b4 10 486 85 +329c4 8 486 85 +329cc 8 83 17 +329d4 4 486 85 +329d8 c 83 17 +329e4 c 486 85 +FUNC 329f0 3c 0 testing::internal::TestFactoryImpl::CreateTest +329f0 10 486 85 +32a00 8 486 85 +32a08 8 67 17 +32a10 4 486 85 +32a14 c 67 17 +32a20 c 486 85 +FUNC 32a2c 3c 0 testing::internal::TestFactoryImpl::CreateTest +32a2c 10 486 85 +32a3c 8 486 85 +32a44 8 57 17 +32a4c 4 486 85 +32a50 c 57 17 +32a5c c 486 85 +FUNC 32a68 3c 0 testing::internal::TestFactoryImpl::CreateTest +32a68 10 486 85 +32a78 8 486 85 +32a80 8 121 17 +32a88 4 486 85 +32a8c c 121 17 +32a98 c 486 85 +FUNC 32aa4 3c 0 testing::internal::TestFactoryImpl::CreateTest +32aa4 10 486 85 +32ab4 8 486 85 +32abc 8 99 17 +32ac4 4 486 85 +32ac8 c 99 17 +32ad4 c 486 85 +FUNC 32ae0 3c 0 testing::internal::TestFactoryImpl::CreateTest +32ae0 10 486 85 +32af0 8 486 85 +32af8 8 143 17 +32b00 4 486 85 +32b04 c 143 17 +32b10 c 486 85 +FUNC 32b1c 118 0 google_breakpad::LineReader::GetNextLine +32b1c 14 64 16 +32b30 4 64 16 +32b34 4 99 16 +32b38 4 103 16 +32b3c 8 66 16 +32b44 c 66 16 +32b50 14 69 16 +32b64 1c 70 16 +32b80 8 71 16 +32b88 8 72 16 +32b90 8 78 16 +32b98 c 86 16 +32ba4 8 90 16 +32bac 4 91 16 +32bb0 c 92 16 +32bbc 8 93 16 +32bc4 4 94 16 +32bc8 4 98 16 +32bcc 4 3104 97 +32bd0 4 98 16 +32bd4 4 99 16 +32bd8 14 3104 97 +32bec 4 3104 97 +32bf0 c 3104 97 +32bfc 8 100 16 +32c04 4 102 16 +32c08 8 103 16 +32c10 10 105 16 +32c20 4 67 16 +32c24 10 111 16 +FUNC 32c34 20 0 google_breakpad::LineReader::PopLine +32c34 8 113 16 +32c3c 4 117 16 +32c40 4 118 16 +32c44 4 117 16 +32c48 c 118 16 +FUNC 32c54 8c 0 google_breakpad::AutoTestFile::WriteText +32c54 1c 108 52 +32c70 1c 109 52 +32c8c 4 109 52 +32c90 c 109 52 +32c9c 8 110 52 +32ca4 8 111 52 +32cac 8 112 52 +32cb4 10 117 52 +32cc4 8 116 52 +32ccc c 117 52 +32cd8 8 116 52 +FUNC 32ce0 54 0 ScopedTestFile::ScopedTestFile +32ce0 c 46 17 +32cec 4 46 17 +32cf0 4 60 52 +32cf4 4 46 17 +32cf8 8 60 52 +32d00 8 61 52 +32d08 c 62 52 +32d14 8 62 52 +32d1c 8 48 17 +32d24 4 62 52 +32d28 c 48 17 +FUNC 32d34 1a8 0 LineReaderTest_EmptyFile_Test::TestBody +32d34 4 57 17 +32d38 8 58 17 +32d40 c 57 17 +32d4c 4 58 17 +32d50 4 57 17 +32d54 8 58 17 +32d5c 4 57 17 +32d60 4 58 17 +32d64 4 277 82 +32d68 4 82 52 +32d6c 8 1139 87 +32d74 8 82 52 +32d7c 4 277 82 +32d80 4 1139 87 +32d84 4 59 17 +32d88 20 59 17 +32da8 4 59 17 +32dac 4 59 17 +32db0 1c 59 17 +32dcc 8 59 17 +32dd4 c 59 17 +32de0 8 85 79 +32de8 8 59 17 +32df0 8 156 132 +32df8 10 256 82 +32e08 8 49 16 +32e10 4 64 17 +32e14 4 49 16 +32e18 8 64 17 +32e20 4 49 16 +32e24 4 1139 87 +32e28 c 64 17 +32e34 4 277 82 +32e38 4 1139 87 +32e3c 4 64 17 +32e40 20 64 17 +32e60 4 64 17 +32e64 4 64 17 +32e68 4 64 17 +32e6c 1c 64 17 +32e88 8 64 17 +32e90 c 64 17 +32e9c 8 85 79 +32ea4 8 64 17 +32eac 8 156 132 +32eb4 8 256 82 +32ebc 8 44 17 +32ec4 18 65 17 +FUNC 32edc 1d4 0 LineReaderTest_TooLong_Test::TestBody +32edc 4 158 17 +32ee0 8 161 17 +32ee8 c 158 17 +32ef4 4 161 17 +32ef8 4 158 17 +32efc 4 161 17 +32f00 4 66 52 +32f04 4 158 17 +32f08 4 161 17 +32f0c 10 66 52 +32f1c 8 67 52 +32f24 10 68 52 +32f34 4 277 82 +32f38 4 82 52 +32f3c 8 1139 87 +32f44 c 82 52 +32f50 4 277 82 +32f54 4 1139 87 +32f58 4 163 17 +32f5c 20 163 17 +32f7c 4 163 17 +32f80 4 163 17 +32f84 1c 163 17 +32fa0 8 163 17 +32fa8 c 163 17 +32fb4 8 85 79 +32fbc 8 163 17 +32fc4 8 156 132 +32fcc 10 256 82 +32fdc 8 49 16 +32fe4 4 168 17 +32fe8 4 49 16 +32fec 8 168 17 +32ff4 4 49 16 +32ff8 4 1139 87 +32ffc c 168 17 +33008 4 277 82 +3300c 4 1139 87 +33010 4 168 17 +33014 20 168 17 +33034 4 168 17 +33038 4 168 17 +3303c 4 168 17 +33040 1c 168 17 +3305c 8 168 17 +33064 c 168 17 +33070 8 85 79 +33078 8 168 17 +33080 8 156 132 +33088 8 256 82 +33090 8 44 17 +33098 18 169 17 +FUNC 330b0 e8 0 testing::internal::CmpHelperEQFailure +330b0 c 1464 82 +330bc 4 884 80 +330c0 10 1464 82 +330d0 8 884 80 +330d8 4 1464 82 +330dc 4 75 127 +330e0 4 1464 82 +330e4 8 1464 82 +330ec 4 884 80 +330f0 c 394 80 +330fc 4 75 127 +33100 8 394 80 +33108 c 75 127 +33114 8 886 80 +3311c c 884 80 +33128 8 394 80 +33130 4 75 127 +33134 8 394 80 +3313c c 75 127 +33148 8 886 80 +33150 1c 1471 82 +3316c 10 156 132 +3317c 1c 1472 82 +FUNC 33198 3c 0 testing::internal::CmpHelperEQ +33198 8 1476 82 +331a0 8 1481 82 +331a8 4 1476 82 +331ac 4 1476 82 +331b0 8 1481 82 +331b8 8 1482 82 +331c0 4 1487 82 +331c4 10 1488 82 +FUNC 331d4 374 0 LineReaderTest_OneLineTerminated_Test::TestBody +331d4 4 67 17 +331d8 8 68 17 +331e0 c 67 17 +331ec 8 68 17 +331f4 c 67 17 +33200 4 68 17 +33204 4 277 82 +33208 4 82 52 +3320c c 1139 87 +33218 8 82 52 +33220 4 277 82 +33224 4 1139 87 +33228 4 69 17 +3322c 20 69 17 +3324c 4 69 17 +33250 4 69 17 +33254 1c 69 17 +33270 8 69 17 +33278 c 69 17 +33284 8 85 79 +3328c 8 69 17 +33294 c 156 132 +332a0 4 256 82 +332a4 8 74 17 +332ac 4 1139 87 +332b0 4 256 82 +332b4 8 49 16 +332bc 4 74 17 +332c0 4 49 16 +332c4 8 74 17 +332cc 4 49 16 +332d0 4 74 17 +332d4 4 277 82 +332d8 4 74 17 +332dc 4 1139 87 +332e0 4 74 17 +332e4 20 74 17 +33304 4 74 17 +33308 4 74 17 +3330c 18 74 17 +33324 8 256 82 +3332c 4 75 17 +33330 4 1512 82 +33334 4 75 17 +33338 1c 1512 82 +33354 8 75 17 +3335c 4 302 82 +33360 4 75 17 +33364 8 302 82 +3336c 18 75 17 +33384 8 256 82 +3338c 4 76 17 +33390 4 1512 82 +33394 4 76 17 +33398 1c 1512 82 +333b4 8 76 17 +333bc 4 302 82 +333c0 4 76 17 +333c4 8 302 82 +333cc 18 76 17 +333e4 8 256 82 +333ec 8 77 17 +333f4 20 1552 82 +33414 8 77 17 +3341c 4 302 82 +33420 4 77 17 +33424 8 302 82 +3342c 18 77 17 +33444 8 77 17 +3344c c 77 17 +33458 8 85 79 +33460 8 77 17 +33468 10 256 82 +33478 c 78 17 +33484 18 80 17 +3349c 4 1139 87 +334a0 4 277 82 +334a4 4 80 17 +334a8 20 80 17 +334c8 4 80 17 +334cc 4 80 17 +334d0 18 80 17 +334e8 4 80 17 +334ec 4 80 17 +334f0 8 80 17 +334f8 c 80 17 +33504 8 85 79 +3350c 8 80 17 +33514 8 156 132 +3351c 8 256 82 +33524 8 44 17 +3352c 1c 81 17 +FUNC 33548 374 0 LineReaderTest_OneLine_Test::TestBody +33548 4 83 17 +3354c 8 84 17 +33554 c 83 17 +33560 8 84 17 +33568 c 83 17 +33574 4 84 17 +33578 4 277 82 +3357c 4 82 52 +33580 c 1139 87 +3358c 8 82 52 +33594 4 277 82 +33598 4 1139 87 +3359c 4 85 17 +335a0 20 85 17 +335c0 4 85 17 +335c4 4 85 17 +335c8 1c 85 17 +335e4 8 85 17 +335ec c 85 17 +335f8 8 85 79 +33600 8 85 17 +33608 c 156 132 +33614 4 256 82 +33618 8 90 17 +33620 4 1139 87 +33624 4 256 82 +33628 8 49 16 +33630 4 90 17 +33634 4 49 16 +33638 8 90 17 +33640 4 49 16 +33644 4 90 17 +33648 4 277 82 +3364c 4 90 17 +33650 4 1139 87 +33654 4 90 17 +33658 20 90 17 +33678 4 90 17 +3367c 4 90 17 +33680 18 90 17 +33698 8 256 82 +336a0 4 91 17 +336a4 4 1512 82 +336a8 4 91 17 +336ac 1c 1512 82 +336c8 8 91 17 +336d0 4 302 82 +336d4 4 91 17 +336d8 8 302 82 +336e0 18 91 17 +336f8 8 256 82 +33700 4 92 17 +33704 4 1512 82 +33708 4 92 17 +3370c 1c 1512 82 +33728 8 92 17 +33730 4 302 82 +33734 4 92 17 +33738 8 302 82 +33740 18 92 17 +33758 8 256 82 +33760 8 93 17 +33768 20 1552 82 +33788 8 93 17 +33790 4 302 82 +33794 4 93 17 +33798 8 302 82 +337a0 18 93 17 +337b8 8 93 17 +337c0 c 93 17 +337cc 8 85 79 +337d4 8 93 17 +337dc 10 256 82 +337ec c 94 17 +337f8 18 96 17 +33810 4 1139 87 +33814 4 277 82 +33818 4 96 17 +3381c 20 96 17 +3383c 4 96 17 +33840 4 96 17 +33844 18 96 17 +3385c 4 96 17 +33860 4 96 17 +33864 8 96 17 +3386c c 96 17 +33878 8 85 79 +33880 8 96 17 +33888 8 156 132 +33890 8 256 82 +33898 8 44 17 +338a0 1c 97 17 +FUNC 338bc 568 0 LineReaderTest_TwoLinesTerminated_Test::TestBody +338bc 4 99 17 +338c0 8 100 17 +338c8 10 99 17 +338d8 8 100 17 +338e0 14 99 17 +338f4 4 100 17 +338f8 4 277 82 +338fc 4 82 52 +33900 8 1139 87 +33908 c 82 52 +33914 4 277 82 +33918 4 1139 87 +3391c 4 101 17 +33920 20 101 17 +33940 4 101 17 +33944 4 101 17 +33948 1c 101 17 +33964 8 101 17 +3396c c 101 17 +33978 8 85 79 +33980 8 101 17 +33988 c 156 132 +33994 4 256 82 +33998 8 106 17 +339a0 4 1139 87 +339a4 4 256 82 +339a8 8 49 16 +339b0 4 106 17 +339b4 4 49 16 +339b8 8 106 17 +339c0 4 49 16 +339c4 4 106 17 +339c8 4 277 82 +339cc 4 106 17 +339d0 4 1139 87 +339d4 4 106 17 +339d8 20 106 17 +339f8 4 106 17 +339fc 4 106 17 +33a00 18 106 17 +33a18 8 256 82 +33a20 8 107 17 +33a28 30 1512 82 +33a58 8 107 17 +33a60 4 302 82 +33a64 4 107 17 +33a68 8 302 82 +33a70 18 107 17 +33a88 8 256 82 +33a90 8 108 17 +33a98 28 1512 82 +33ac0 8 108 17 +33ac8 4 302 82 +33acc 4 108 17 +33ad0 8 302 82 +33ad8 18 108 17 +33af0 4 256 82 +33af4 c 1552 82 +33b00 4 256 82 +33b04 4 1552 82 +33b08 4 109 17 +33b0c 14 1552 82 +33b20 4 109 17 +33b24 4 1552 82 +33b28 8 109 17 +33b30 4 302 82 +33b34 4 109 17 +33b38 8 302 82 +33b40 18 109 17 +33b58 8 256 82 +33b60 c 110 17 +33b6c 10 112 17 +33b7c 4 1139 87 +33b80 4 112 17 +33b84 4 277 82 +33b88 4 112 17 +33b8c 20 112 17 +33bac 4 112 17 +33bb0 4 112 17 +33bb4 18 112 17 +33bcc 4 112 17 +33bd0 4 112 17 +33bd4 8 112 17 +33bdc c 112 17 +33be8 8 85 79 +33bf0 8 112 17 +33bf8 8 156 132 +33c00 10 256 82 +33c10 8 113 17 +33c18 18 1512 82 +33c30 8 113 17 +33c38 4 302 82 +33c3c 4 113 17 +33c40 8 302 82 +33c48 18 113 17 +33c60 8 256 82 +33c68 4 114 17 +33c6c 8 1512 82 +33c74 4 114 17 +33c78 14 1512 82 +33c8c 8 114 17 +33c94 4 302 82 +33c98 4 114 17 +33c9c 8 302 82 +33ca4 18 114 17 +33cbc 8 256 82 +33cc4 8 115 17 +33ccc 18 1552 82 +33ce4 8 115 17 +33cec 4 302 82 +33cf0 4 115 17 +33cf4 8 302 82 +33cfc 18 115 17 +33d14 8 115 17 +33d1c c 115 17 +33d28 8 85 79 +33d30 8 115 17 +33d38 10 256 82 +33d48 c 116 17 +33d54 18 118 17 +33d6c 4 1139 87 +33d70 4 277 82 +33d74 4 118 17 +33d78 20 118 17 +33d98 4 118 17 +33d9c 4 118 17 +33da0 4 118 17 +33da4 1c 118 17 +33dc0 8 118 17 +33dc8 c 118 17 +33dd4 8 85 79 +33ddc 8 118 17 +33de4 8 156 132 +33dec 8 256 82 +33df4 8 44 17 +33dfc 28 119 17 +FUNC 33e24 568 0 LineReaderTest_TwoLines_Test::TestBody +33e24 4 121 17 +33e28 8 122 17 +33e30 10 121 17 +33e40 8 122 17 +33e48 14 121 17 +33e5c 4 122 17 +33e60 4 277 82 +33e64 4 82 52 +33e68 8 1139 87 +33e70 c 82 52 +33e7c 4 277 82 +33e80 4 1139 87 +33e84 4 123 17 +33e88 20 123 17 +33ea8 4 123 17 +33eac 4 123 17 +33eb0 1c 123 17 +33ecc 8 123 17 +33ed4 c 123 17 +33ee0 8 85 79 +33ee8 8 123 17 +33ef0 c 156 132 +33efc 4 256 82 +33f00 8 128 17 +33f08 4 1139 87 +33f0c 4 256 82 +33f10 8 49 16 +33f18 4 128 17 +33f1c 4 49 16 +33f20 8 128 17 +33f28 4 49 16 +33f2c 4 128 17 +33f30 4 277 82 +33f34 4 128 17 +33f38 4 1139 87 +33f3c 4 128 17 +33f40 20 128 17 +33f60 4 128 17 +33f64 4 128 17 +33f68 18 128 17 +33f80 8 256 82 +33f88 8 129 17 +33f90 30 1512 82 +33fc0 8 129 17 +33fc8 4 302 82 +33fcc 4 129 17 +33fd0 8 302 82 +33fd8 18 129 17 +33ff0 8 256 82 +33ff8 8 130 17 +34000 28 1512 82 +34028 8 130 17 +34030 4 302 82 +34034 4 130 17 +34038 8 302 82 +34040 18 130 17 +34058 4 256 82 +3405c c 1552 82 +34068 4 256 82 +3406c 4 1552 82 +34070 4 131 17 +34074 14 1552 82 +34088 4 131 17 +3408c 4 1552 82 +34090 8 131 17 +34098 4 302 82 +3409c 4 131 17 +340a0 8 302 82 +340a8 18 131 17 +340c0 8 256 82 +340c8 c 132 17 +340d4 10 134 17 +340e4 4 1139 87 +340e8 4 134 17 +340ec 4 277 82 +340f0 4 134 17 +340f4 20 134 17 +34114 4 134 17 +34118 4 134 17 +3411c 18 134 17 +34134 4 134 17 +34138 4 134 17 +3413c 8 134 17 +34144 c 134 17 +34150 8 85 79 +34158 8 134 17 +34160 8 156 132 +34168 10 256 82 +34178 8 135 17 +34180 18 1512 82 +34198 8 135 17 +341a0 4 302 82 +341a4 4 135 17 +341a8 8 302 82 +341b0 18 135 17 +341c8 8 256 82 +341d0 4 136 17 +341d4 8 1512 82 +341dc 4 136 17 +341e0 14 1512 82 +341f4 8 136 17 +341fc 4 302 82 +34200 4 136 17 +34204 8 302 82 +3420c 18 136 17 +34224 8 256 82 +3422c 8 137 17 +34234 18 1552 82 +3424c 8 137 17 +34254 4 302 82 +34258 4 137 17 +3425c 8 302 82 +34264 18 137 17 +3427c 8 137 17 +34284 c 137 17 +34290 8 85 79 +34298 8 137 17 +342a0 10 256 82 +342b0 c 138 17 +342bc 18 140 17 +342d4 4 1139 87 +342d8 4 277 82 +342dc 4 140 17 +342e0 20 140 17 +34300 4 140 17 +34304 4 140 17 +34308 4 140 17 +3430c 1c 140 17 +34328 8 140 17 +34330 c 140 17 +3433c 8 85 79 +34344 8 140 17 +3434c 8 156 132 +34354 8 256 82 +3435c 8 44 17 +34364 28 141 17 +FUNC 3438c 3b8 0 LineReaderTest_MaxLength_Test::TestBody +3438c 4 143 17 +34390 8 145 17 +34398 c 143 17 +343a4 8 145 17 +343ac c 143 17 +343b8 4 145 17 +343bc 14 66 52 +343d0 8 67 52 +343d8 10 68 52 +343e8 4 277 82 +343ec 4 82 52 +343f0 8 1139 87 +343f8 c 82 52 +34404 4 277 82 +34408 8 1139 87 +34410 4 147 17 +34414 24 147 17 +34438 1c 147 17 +34454 8 147 17 +3445c c 147 17 +34468 8 85 79 +34470 8 147 17 +34478 8 156 132 +34480 c 256 82 +3448c 8 152 17 +34494 4 256 82 +34498 8 49 16 +344a0 4 152 17 +344a4 4 49 16 +344a8 4 152 17 +344ac 4 49 16 +344b0 4 152 17 +344b4 4 1139 87 +344b8 4 152 17 +344bc 4 277 82 +344c0 4 152 17 +344c4 4 1139 87 +344c8 4 152 17 +344cc 20 152 17 +344ec 4 152 17 +344f0 4 152 17 +344f4 18 152 17 +3450c 8 256 82 +34514 c 1481 82 +34520 c 1482 82 +3452c c 884 80 +34538 c 263 121 +34544 c 75 127 +34550 8 886 80 +34558 c 1382 82 +34564 24 1471 82 +34588 10 156 132 +34598 c 153 17 +345a4 c 302 82 +345b0 18 153 17 +345c8 8 153 17 +345d0 c 153 17 +345dc 8 85 79 +345e4 8 153 17 +345ec 4 256 82 +345f0 4 1139 87 +345f4 4 256 82 +345f8 18 154 17 +34610 4 277 82 +34614 4 1139 87 +34618 4 154 17 +3461c 20 154 17 +3463c 4 154 17 +34640 4 154 17 +34644 1c 154 17 +34660 8 154 17 +34668 c 154 17 +34674 8 85 79 +3467c 8 154 17 +34684 c 156 132 +34690 4 256 82 +34694 4 155 17 +34698 4 256 82 +3469c 8 155 17 +346a4 4 1552 82 +346a8 4 155 17 +346ac 1c 1552 82 +346c8 8 155 17 +346d0 c 302 82 +346dc 18 155 17 +346f4 8 155 17 +346fc c 155 17 +34708 8 85 79 +34710 8 155 17 +34718 8 256 82 +34720 8 44 17 +34728 1c 156 17 +FUNC 34744 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +34744 4 484 85 +FUNC 34748 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +34748 4 484 85 +FUNC 3474c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3474c 4 484 85 +FUNC 34750 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +34750 4 484 85 +FUNC 34754 14 0 LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test::~LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test +34754 14 65 20 +FUNC 34768 24 0 LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test::~LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test +34768 c 65 20 +34774 8 65 20 +3477c 4 65 20 +34780 8 65 20 +34788 4 65 20 +FUNC 3478c 14 0 LinuxCoreDumperTest_BuildProcPath_Test::~LinuxCoreDumperTest_BuildProcPath_Test +3478c 14 42 20 +FUNC 347a0 24 0 LinuxCoreDumperTest_BuildProcPath_Test::~LinuxCoreDumperTest_BuildProcPath_Test +347a0 c 42 20 +347ac 8 42 20 +347b4 4 42 20 +347b8 8 42 20 +347c0 4 42 20 +FUNC 347c4 3c 0 testing::internal::TestFactoryImpl::CreateTest +347c4 10 486 85 +347d4 8 486 85 +347dc 8 65 20 +347e4 4 486 85 +347e8 c 65 20 +347f4 c 486 85 +FUNC 34800 3c 0 testing::internal::TestFactoryImpl::CreateTest +34800 10 486 85 +34810 8 486 85 +34818 8 42 20 +34820 4 486 85 +34824 c 42 20 +34830 c 486 85 +FUNC 3483c e8 0 testing::internal::CmpHelperEQFailure +3483c c 1464 82 +34848 4 884 80 +3484c 10 1464 82 +3485c 8 884 80 +34864 4 1464 82 +34868 4 75 127 +3486c 4 1464 82 +34870 8 1464 82 +34878 4 884 80 +3487c c 254 121 +34888 4 75 127 +3488c 8 254 121 +34894 c 75 127 +348a0 8 886 80 +348a8 c 884 80 +348b4 8 263 121 +348bc 4 75 127 +348c0 8 263 121 +348c8 c 75 127 +348d4 8 886 80 +348dc 1c 1471 82 +348f8 10 156 132 +34908 1c 1472 82 +FUNC 34924 34 0 google_breakpad::LinuxCoreDumper::~LinuxCoreDumper +34924 14 43 19 +34938 c 43 19 +34944 4 43 19 +34948 4 43 19 +3494c 8 43 19 +34954 4 43 19 +FUNC 34958 4a8 0 LinuxCoreDumperTest_BuildProcPath_Test::TestBody +34958 20 42 20 +34978 8 43 20 +34980 c 44 20 +3498c 4 45 20 +34990 4 47 20 +34994 4 50 20 +34998 4 51 20 +3499c 4 277 82 +349a0 20 44 20 +349c0 8 45 20 +349c8 14 45 20 +349dc 1c 47 20 +349f8 18 50 20 +34a10 18 51 20 +34a28 4 1139 87 +34a2c 4 51 20 +34a30 4 277 82 +34a34 4 51 20 +34a38 20 51 20 +34a58 4 51 20 +34a5c 4 51 20 +34a60 1c 51 20 +34a7c 8 51 20 +34a84 c 51 20 +34a90 8 85 79 +34a98 8 51 20 +34aa0 8 156 132 +34aa8 8 256 82 +34ab0 2c 52 20 +34adc 4 1144 87 +34ae0 4 298 82 +34ae4 8 298 82 +34aec 18 52 20 +34b04 8 52 20 +34b0c c 52 20 +34b18 8 85 79 +34b20 8 52 20 +34b28 8 256 82 +34b30 1c 54 20 +34b4c 4 1139 87 +34b50 4 277 82 +34b54 4 54 20 +34b58 20 54 20 +34b78 4 54 20 +34b7c 4 54 20 +34b80 1c 54 20 +34b9c 8 54 20 +34ba4 c 54 20 +34bb0 8 85 79 +34bb8 8 54 20 +34bc0 8 156 132 +34bc8 8 256 82 +34bd0 1c 55 20 +34bec 4 1139 87 +34bf0 4 277 82 +34bf4 4 55 20 +34bf8 20 55 20 +34c18 4 55 20 +34c1c 4 55 20 +34c20 1c 55 20 +34c3c 8 55 20 +34c44 c 55 20 +34c50 8 85 79 +34c58 8 55 20 +34c60 8 156 132 +34c68 8 256 82 +34c70 1c 56 20 +34c8c 4 1139 87 +34c90 4 277 82 +34c94 4 56 20 +34c98 20 56 20 +34cb8 4 56 20 +34cbc 4 56 20 +34cc0 1c 56 20 +34cdc 8 56 20 +34ce4 c 56 20 +34cf0 8 85 79 +34cf8 8 56 20 +34d00 8 156 132 +34d08 8 256 82 +34d10 10 59 20 +34d20 10 60 20 +34d30 4 61 20 +34d34 1c 62 20 +34d50 4 1139 87 +34d54 4 277 82 +34d58 4 62 20 +34d5c 20 62 20 +34d7c 4 62 20 +34d80 4 62 20 +34d84 4 62 20 +34d88 1c 62 20 +34da4 8 62 20 +34dac c 62 20 +34db8 8 85 79 +34dc0 8 62 20 +34dc8 8 156 132 +34dd0 8 256 82 +34dd8 8 62 20 +34de0 20 63 20 +FUNC 34e00 880 0 LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test::TestBody +34e00 14 65 20 +34e14 8 66 20 +34e1c 14 65 20 +34e30 4 66 20 +34e34 10 67 20 +34e44 18 69 20 +34e5c 4 70 20 +34e60 4 277 82 +34e64 4 73 20 +34e68 4 75 20 +34e6c 4 77 20 +34e70 4 73 20 +34e74 4 75 20 +34e78 c 77 20 +34e84 4 1139 87 +34e88 8 73 20 +34e90 4 75 20 +34e94 4 77 20 +34e98 4 277 82 +34e9c 4 77 20 +34ea0 4 1139 87 +34ea4 4 77 20 +34ea8 24 77 20 +34ecc 4 77 20 +34ed0 4 77 20 +34ed4 1c 77 20 +34ef0 8 77 20 +34ef8 c 77 20 +34f04 8 85 79 +34f0c 8 77 20 +34f14 8 156 132 +34f1c 10 256 82 +34f2c 4 80 20 +34f30 4 81 20 +34f34 4 256 82 +34f38 c 80 20 +34f44 c 81 20 +34f50 c 85 20 +34f5c 4 85 20 +34f60 1c 87 20 +34f7c c 92 20 +34f88 4 277 82 +34f8c 10 92 20 +34f9c 8 94 20 +34fa4 4 1139 87 +34fa8 4 94 20 +34fac 4 277 82 +34fb0 4 94 20 +34fb4 20 94 20 +34fd4 4 94 20 +34fd8 4 94 20 +34fdc 1c 94 20 +34ff8 8 94 20 +35000 c 94 20 +3500c 8 85 79 +35014 8 94 20 +3501c 8 156 132 +35024 8 256 82 +3502c 8 96 20 +35034 4 1139 87 +35038 4 96 20 +3503c 4 277 82 +35040 4 96 20 +35044 20 96 20 +35064 4 96 20 +35068 4 96 20 +3506c 1c 96 20 +35088 8 96 20 +35090 c 96 20 +3509c 8 85 79 +350a4 8 96 20 +350ac 8 156 132 +350b4 8 256 82 +350bc 8 99 20 +350c4 4 1139 87 +350c8 4 99 20 +350cc 4 277 82 +350d0 4 99 20 +350d4 20 99 20 +350f4 4 99 20 +350f8 4 99 20 +350fc 1c 99 20 +35118 8 99 20 +35120 c 99 20 +3512c 8 85 79 +35134 8 99 20 +3513c 8 156 132 +35144 8 256 82 +3514c 8 100 20 +35154 4 1139 87 +35158 4 100 20 +3515c 4 277 82 +35160 4 100 20 +35164 20 100 20 +35184 4 100 20 +35188 4 100 20 +3518c 1c 100 20 +351a8 8 100 20 +351b0 c 100 20 +351bc 8 85 79 +351c4 8 100 20 +351cc 8 156 132 +351d4 8 256 82 +351dc 8 104 20 +351e4 4 1482 82 +351e8 4 104 20 +351ec 4 1481 82 +351f0 8 1482 82 +351f8 1c 1487 82 +35214 8 104 20 +3521c 4 1144 87 +35220 c 298 82 +3522c 8 298 82 +35234 18 104 20 +3524c 8 104 20 +35254 c 104 20 +35260 8 85 79 +35268 8 104 20 +35270 8 256 82 +35278 4 105 20 +3527c 4 1512 82 +35280 4 105 20 +35284 1c 1512 82 +352a0 8 105 20 +352a8 4 1144 87 +352ac c 298 82 +352b8 8 298 82 +352c0 18 105 20 +352d8 8 105 20 +352e0 c 105 20 +352ec 8 85 79 +352f4 8 105 20 +352fc 8 256 82 +35304 14 106 20 +35318 4 1512 82 +3531c 4 106 20 +35320 1c 1512 82 +3533c 8 106 20 +35344 4 1144 87 +35348 c 298 82 +35354 8 298 82 +3535c 18 106 20 +35374 8 106 20 +3537c c 107 20 +35388 8 85 79 +35390 8 106 20 +35398 8 256 82 +353a0 4 192 139 +353a4 4 1482 82 +353a8 c 192 139 +353b4 4 1481 82 +353b8 4 109 20 +353bc 8 1481 82 +353c4 8 1482 82 +353cc 1c 1487 82 +353e8 8 109 20 +353f0 4 1144 87 +353f4 c 298 82 +35400 8 298 82 +35408 18 109 20 +35420 8 109 20 +35428 c 109 20 +35434 8 85 79 +3543c 8 109 20 +35444 4 256 82 +35448 c 112 20 +35454 4 256 82 +35458 1c 112 20 +35474 10 112 20 +35484 4 1139 87 +35488 4 112 20 +3548c 4 277 82 +35490 4 112 20 +35494 14 112 20 +354a8 4 112 20 +354ac 4 112 20 +354b0 4 112 20 +354b4 1c 112 20 +354d0 8 112 20 +354d8 c 112 20 +354e4 8 85 79 +354ec 8 112 20 +354f4 8 156 132 +354fc 8 256 82 +35504 14 115 20 +35518 4 1139 87 +3551c 4 115 20 +35520 4 277 82 +35524 4 115 20 +35528 18 115 20 +35540 4 115 20 +35544 4 115 20 +35548 4 115 20 +3554c 1c 115 20 +35568 8 115 20 +35570 c 115 20 +3557c 8 85 79 +35584 8 115 20 +3558c 8 156 132 +35594 8 256 82 +3559c 8 116 20 +355a4 20 1512 82 +355c4 8 116 20 +355cc 4 1144 87 +355d0 c 298 82 +355dc 8 298 82 +355e4 1c 116 20 +35600 8 116 20 +35608 c 116 20 +35614 8 85 79 +3561c 8 116 20 +35624 c 256 82 +35630 8 110 20 +35638 8 92 20 +35640 10 156 132 +35650 8 70 20 +35658 28 118 20 +FUNC 35680 24 0 google_breakpad::LinuxCoreDumper::~LinuxCoreDumper +35680 c 43 19 +3568c 8 43 19 +35694 4 43 19 +35698 8 43 19 +356a0 4 43 19 +FUNC 356a4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356a4 4 484 85 +FUNC 356a8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356a8 4 484 85 +FUNC 356ac 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356ac 4 484 85 +FUNC 356b0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356b0 4 484 85 +FUNC 356b4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356b4 4 484 85 +FUNC 356b8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356b8 4 484 85 +FUNC 356bc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356bc 4 484 85 +FUNC 356c0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356c0 4 484 85 +FUNC 356c4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356c4 4 484 85 +FUNC 356c8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356c8 4 484 85 +FUNC 356cc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356cc 4 484 85 +FUNC 356d0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356d0 4 484 85 +FUNC 356d4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356d4 4 484 85 +FUNC 356d8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356d8 4 484 85 +FUNC 356dc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356dc 4 484 85 +FUNC 356e0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356e0 4 484 85 +FUNC 356e4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356e4 4 484 85 +FUNC 356e8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +356e8 4 484 85 +FUNC 356ec 24 0 LinuxPtraceDumperChildTest::SetUp +356ec c 74 25 +356f8 4 74 25 +356fc 8 75 25 +35704 c 79 25 +FUNC 35710 14 0 LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test::~LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test +35710 14 364 25 +FUNC 35724 24 0 LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test::~LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test +35724 c 364 25 +35730 8 364 25 +35738 4 364 25 +3573c 8 364 25 +35744 4 364 25 +FUNC 35748 14 0 LinuxPtraceDumperChildTest_ThreadList_Test::~LinuxPtraceDumperChildTest_ThreadList_Test +35748 14 72 25 +FUNC 3575c 24 0 LinuxPtraceDumperChildTest_ThreadList_Test::~LinuxPtraceDumperChildTest_ThreadList_Test +3575c c 134 25 +35768 8 134 25 +35770 4 134 25 +35774 8 134 25 +3577c 4 134 25 +FUNC 35780 14 0 LinuxPtraceDumperChildTest_FileIDsMatch_Test::~LinuxPtraceDumperChildTest_FileIDsMatch_Test +35780 14 72 25 +FUNC 35794 24 0 LinuxPtraceDumperChildTest_FileIDsMatch_Test::~LinuxPtraceDumperChildTest_FileIDsMatch_Test +35794 c 325 25 +357a0 8 325 25 +357a8 4 325 25 +357ac 8 325 25 +357b4 4 325 25 +FUNC 357b8 14 0 LinuxPtraceDumperChildTest_LinuxGateMappingID_Test::~LinuxPtraceDumperChildTest_LinuxGateMappingID_Test +357b8 14 72 25 +FUNC 357cc 24 0 LinuxPtraceDumperChildTest_LinuxGateMappingID_Test::~LinuxPtraceDumperChildTest_LinuxGateMappingID_Test +357cc c 295 25 +357d8 8 295 25 +357e0 4 295 25 +357e4 8 295 25 +357ec 4 295 25 +FUNC 357f0 14 0 LinuxPtraceDumperChildTest_FindMappings_Test::~LinuxPtraceDumperChildTest_FindMappings_Test +357f0 14 72 25 +FUNC 35804 24 0 LinuxPtraceDumperChildTest_FindMappings_Test::~LinuxPtraceDumperChildTest_FindMappings_Test +35804 c 125 25 +35810 8 125 25 +35818 4 125 25 +3581c 8 125 25 +35824 4 125 25 +FUNC 35828 14 0 LinuxPtraceDumperChildTest_Setup_Test::~LinuxPtraceDumperChildTest_Setup_Test +35828 14 72 25 +FUNC 3583c 24 0 LinuxPtraceDumperChildTest_Setup_Test::~LinuxPtraceDumperChildTest_Setup_Test +3583c c 121 25 +35848 8 121 25 +35850 4 121 25 +35854 8 121 25 +3585c 4 121 25 +FUNC 35860 14 0 LinuxPtraceDumperChildTest_MappingsIncludeLinuxGate_Test::~LinuxPtraceDumperChildTest_MappingsIncludeLinuxGate_Test +35860 14 72 25 +FUNC 35874 24 0 LinuxPtraceDumperChildTest_MappingsIncludeLinuxGate_Test::~LinuxPtraceDumperChildTest_MappingsIncludeLinuxGate_Test +35874 c 271 25 +35880 8 271 25 +35888 4 271 25 +3588c 8 271 25 +35894 4 271 25 +FUNC 35898 14 0 LinuxPtraceDumperChildTest_BuildProcPath_Test::~LinuxPtraceDumperChildTest_BuildProcPath_Test +35898 14 72 25 +FUNC 358ac 24 0 LinuxPtraceDumperChildTest_BuildProcPath_Test::~LinuxPtraceDumperChildTest_BuildProcPath_Test +358ac c 246 25 +358b8 8 246 25 +358c0 4 246 25 +358c4 8 246 25 +358cc 4 246 25 +FUNC 358d0 3c 0 testing::internal::TestFactoryImpl::CreateTest +358d0 10 486 85 +358e0 8 486 85 +358e8 4 72 25 +358ec 4 271 25 +358f0 4 486 85 +358f4 c 271 25 +35900 c 486 85 +FUNC 3590c 3c 0 testing::internal::TestFactoryImpl::CreateTest +3590c 10 486 85 +3591c 8 486 85 +35924 4 72 25 +35928 4 246 25 +3592c 4 486 85 +35930 c 246 25 +3593c c 486 85 +FUNC 35948 3c 0 testing::internal::TestFactoryImpl::CreateTest +35948 10 486 85 +35958 8 486 85 +35960 4 72 25 +35964 4 125 25 +35968 4 486 85 +3596c c 125 25 +35978 c 486 85 +FUNC 35984 3c 0 testing::internal::TestFactoryImpl::CreateTest +35984 10 486 85 +35994 8 486 85 +3599c 4 72 25 +359a0 4 134 25 +359a4 4 486 85 +359a8 c 134 25 +359b4 c 486 85 +FUNC 359c0 3c 0 testing::internal::TestFactoryImpl::CreateTest +359c0 10 486 85 +359d0 8 486 85 +359d8 4 72 25 +359dc 4 325 25 +359e0 4 486 85 +359e4 c 325 25 +359f0 c 486 85 +FUNC 359fc 3c 0 testing::internal::TestFactoryImpl::CreateTest +359fc 10 486 85 +35a0c 8 486 85 +35a14 4 72 25 +35a18 4 295 25 +35a1c 4 486 85 +35a20 c 295 25 +35a2c c 486 85 +FUNC 35a38 3c 0 testing::internal::TestFactoryImpl::CreateTest +35a38 10 486 85 +35a48 8 486 85 +35a50 4 72 25 +35a54 4 121 25 +35a58 4 486 85 +35a5c c 121 25 +35a68 c 486 85 +FUNC 35a74 3c 0 testing::internal::TestFactoryImpl::CreateTest +35a74 10 486 85 +35a84 8 486 85 +35a8c 8 364 25 +35a94 4 486 85 +35a98 c 364 25 +35aa4 c 486 85 +FUNC 35ab0 190 0 LinuxPtraceDumperChildTest::TestBody +35ab0 10 85 25 +35ac0 4 85 25 +35ac4 c 86 25 +35ad0 c 88 25 +35adc 8 89 25 +35ae4 4 90 25 +35ae8 4 90 25 +35aec 8 90 25 +35af4 c 90 25 +35b00 8 90 25 +35b08 4 93 25 +35b0c 4 1139 87 +35b10 10 277 82 +35b20 4 93 25 +35b24 24 93 25 +35b48 4 93 25 +35b4c 4 93 25 +35b50 1c 93 25 +35b6c 8 93 25 +35b74 c 93 25 +35b80 8 85 79 +35b88 8 93 25 +35b90 8 156 132 +35b98 14 256 82 +35bac 10 95 25 +35bbc c 96 25 +35bc8 18 97 25 +35be0 8 98 25 +35be8 18 99 25 +35c00 4 99 25 +35c04 8 99 25 +35c0c 8 99 25 +35c14 c 99 25 +35c20 8 85 79 +35c28 8 99 25 +35c30 10 101 25 +FUNC 35c40 68 0 LinuxPtraceDumperMappingsTest_MergedMappings_Test::~LinuxPtraceDumperMappingsTest_MergedMappings_Test +35c40 c 226 25 +35c4c 4 226 25 +35c50 14 176 25 +35c64 8 156 25 +35c6c 8 157 25 +35c74 8 158 25 +35c7c 4 159 25 +35c80 8 156 132 +35c88 14 72 25 +35c9c 8 226 25 +35ca4 4 72 25 +FUNC 35ca8 24 0 LinuxPtraceDumperMappingsTest_MergedMappings_Test::~LinuxPtraceDumperMappingsTest_MergedMappings_Test +35ca8 c 226 25 +35cb4 8 226 25 +35cbc 4 226 25 +35cc0 8 226 25 +35cc8 4 226 25 +FUNC 35ccc 144 0 std::priv::_Impl_vector >::_Impl_vector +35ccc 10 246 139 +35cdc 8 246 139 +35ce4 8 192 139 +35cec 8 163 54 +35cf4 4 75 54 +35cf8 8 70 139 +35d00 4 481 101 +35d04 4 75 54 +35d08 8 76 54 +35d10 c 78 54 +35d1c 10 78 54 +35d2c 4 79 54 +35d30 4 80 54 +35d34 8 81 54 +35d3c 8 80 54 +35d44 4 82 54 +35d48 8 83 54 +35d50 c 90 54 +35d5c c 3940 97 +35d68 4 90 54 +35d6c 8 3940 97 +35d74 4 119 54 +35d78 14 3940 97 +35d8c 4 3940 97 +35d90 c 3940 97 +35d9c 8 124 54 +35da4 8 134 54 +35dac 4 135 54 +35db0 4 136 54 +35db4 14 96 54 +35dc8 4 97 54 +35dcc 4 98 54 +35dd0 8 98 54 +35dd8 4 98 54 +35ddc 4 100 54 +35de0 4 71 139 +35de4 4 73 139 +35de8 4 72 139 +35dec 4 73 139 +35df0 c 120 137 +35dfc 4 249 139 +35e00 10 250 139 +FUNC 35e10 78 0 testing::internal::TestFactoryImpl::CreateTest +35e10 10 486 85 +35e20 8 486 85 +35e28 4 72 25 +35e2c 14 176 25 +35e40 4 124 132 +35e44 4 120 132 +35e48 4 481 101 +35e4c 8 124 132 +35e54 4 154 25 +35e58 4 101 103 +35e5c 4 226 25 +35e60 c 154 25 +35e6c c 226 25 +35e78 10 486 85 +FUNC 35e88 50 0 testing::internal::DefaultPrintTo +35e88 14 307 80 +35e9c 4 310 80 +35ea0 4 334 80 +35ea4 4 333 122 +35ea8 4 334 80 +35eac 8 333 122 +35eb4 10 318 80 +35ec4 8 291 121 +35ecc 8 334 80 +35ed4 4 291 121 +FUNC 35ed8 3a8 0 LinuxPtraceDumperMappingsTest::SetUp +35ed8 c 185 25 +35ee4 4 186 25 +35ee8 4 185 25 +35eec 4 186 25 +35ef0 8 185 25 +35ef8 8 186 25 +35f00 14 348 131 +35f14 4 400 131 +35f18 4 243 130 +35f1c 4 400 131 +35f20 8 244 130 +35f28 4 168 140 +35f2c c 168 140 +35f38 c 246 130 +35f44 8 803 131 +35f4c 4 168 140 +35f50 4 806 131 +35f54 4 168 140 +35f58 10 806 131 +35f68 4 168 140 +35f6c 8 168 140 +35f74 4 400 131 +35f78 4 250 130 +35f7c 8 400 131 +35f84 c 250 130 +35f90 c 156 132 +35f9c 10 187 25 +35fac 20 188 25 +35fcc 8 188 25 +35fd4 14 333 122 +35fe8 c 188 25 +35ff4 8 85 79 +35ffc 8 188 25 +36004 4 188 25 +36008 14 194 25 +3601c c 196 25 +36028 4 196 25 +3602c 30 197 25 +3605c 4 302 82 +36060 4 197 25 +36064 8 302 82 +3606c 18 197 25 +36084 8 197 25 +3608c 14 333 122 +360a0 10 131 79 +360b0 14 333 122 +360c4 4 198 25 +360c8 4 198 25 +360cc c 198 25 +360d8 4 333 122 +360dc 4 150 79 +360e0 c 333 122 +360ec c 198 25 +360f8 8 85 79 +36100 8 197 25 +36108 8 256 82 +36110 c 195 25 +3611c 8 256 82 +36124 1c 205 25 +36140 4 277 82 +36144 4 205 25 +36148 4 1139 87 +3614c 8 277 82 +36154 4 206 25 +36158 20 206 25 +36178 4 206 25 +3617c 4 206 25 +36180 18 206 25 +36198 8 256 82 +361a0 4 163 25 +361a4 8 220 25 +361ac 4 209 25 +361b0 4 220 25 +361b4 4 162 25 +361b8 4 220 25 +361bc 4 164 25 +361c0 8 220 25 +361c8 8 277 82 +361d0 4 1139 87 +361d4 4 277 82 +361d8 4 221 25 +361dc 20 221 25 +361fc 4 221 25 +36200 4 221 25 +36204 18 221 25 +3621c 4 221 25 +36220 4 221 25 +36224 8 221 25 +3622c c 221 25 +36238 8 85 79 +36240 8 221 25 +36248 8 156 132 +36250 14 256 82 +36264 8 223 25 +3626c 14 224 25 +FUNC 36280 14 0 google_breakpad::LinuxPtraceDumper::~LinuxPtraceDumper +36280 14 42 24 +FUNC 36294 34 0 LinuxPtraceDumperChildTest_Setup_Test::RealTestBody +36294 c 121 25 +362a0 4 122 25 +362a4 8 122 25 +362ac 8 122 25 +362b4 8 122 25 +362bc c 123 25 +FUNC 362c8 230 0 LinuxPtraceDumperChildTest_FindMappings_Test::RealTestBody +362c8 14 125 25 +362dc 4 126 25 +362e0 8 126 25 +362e8 4 126 25 +362ec 8 277 82 +362f4 4 126 25 +362f8 8 127 25 +36300 4 1139 87 +36304 4 127 25 +36308 4 277 82 +3630c 4 127 25 +36310 24 127 25 +36334 4 127 25 +36338 4 127 25 +3633c 18 127 25 +36354 8 256 82 +3635c 10 129 25 +3636c 8 277 82 +36374 4 1139 87 +36378 4 277 82 +3637c 4 129 25 +36380 24 129 25 +363a4 4 129 25 +363a8 4 129 25 +363ac 18 129 25 +363c4 8 256 82 +363cc 10 130 25 +363dc 8 277 82 +363e4 4 1139 87 +363e8 4 277 82 +363ec 4 130 25 +363f0 24 130 25 +36414 4 130 25 +36418 4 130 25 +3641c 18 130 25 +36434 8 256 82 +3643c 14 131 25 +36450 4 1139 87 +36454 4 277 82 +36458 4 131 25 +3645c 24 131 25 +36480 4 131 25 +36484 4 131 25 +36488 18 131 25 +364a0 4 131 25 +364a4 4 131 25 +364a8 8 131 25 +364b0 c 131 25 +364bc 8 85 79 +364c4 8 131 25 +364cc 8 156 132 +364d4 10 256 82 +364e4 14 132 25 +FUNC 364f8 4fc 0 LinuxPtraceDumperChildTest_BuildProcPath_Test::RealTestBody +364f8 20 246 25 +36518 4 248 25 +3651c 8 247 25 +36524 8 248 25 +3652c 4 250 25 +36530 4 253 25 +36534 4 248 25 +36538 4 277 82 +3653c c 250 25 +36548 c 254 25 +36554 10 250 25 +36564 18 253 25 +3657c 14 254 25 +36590 4 1139 87 +36594 4 254 25 +36598 4 277 82 +3659c 4 254 25 +365a0 20 254 25 +365c0 4 254 25 +365c4 4 254 25 +365c8 1c 254 25 +365e4 8 254 25 +365ec c 254 25 +365f8 8 85 79 +36600 8 254 25 +36608 8 156 132 +36610 8 256 82 +36618 28 255 25 +36640 c 302 82 +3664c 18 255 25 +36664 8 255 25 +3666c c 255 25 +36678 8 85 79 +36680 8 255 25 +36688 8 256 82 +36690 1c 257 25 +366ac 4 1139 87 +366b0 4 277 82 +366b4 4 257 25 +366b8 20 257 25 +366d8 4 257 25 +366dc 4 257 25 +366e0 1c 257 25 +366fc 8 257 25 +36704 c 257 25 +36710 8 85 79 +36718 8 257 25 +36720 8 156 132 +36728 8 256 82 +36730 1c 258 25 +3674c 4 1139 87 +36750 4 277 82 +36754 4 258 25 +36758 20 258 25 +36778 4 258 25 +3677c 4 258 25 +36780 1c 258 25 +3679c 8 258 25 +367a4 c 258 25 +367b0 8 85 79 +367b8 8 258 25 +367c0 8 156 132 +367c8 8 256 82 +367d0 20 259 25 +367f0 4 1139 87 +367f4 4 277 82 +367f8 4 259 25 +367fc 20 259 25 +3681c 4 259 25 +36820 4 259 25 +36824 1c 259 25 +36840 8 259 25 +36848 c 259 25 +36854 8 85 79 +3685c 8 259 25 +36864 8 156 132 +3686c 8 256 82 +36874 1c 260 25 +36890 4 1139 87 +36894 4 277 82 +36898 4 260 25 +3689c 20 260 25 +368bc 4 260 25 +368c0 4 260 25 +368c4 1c 260 25 +368e0 8 260 25 +368e8 c 260 25 +368f4 8 85 79 +368fc 8 260 25 +36904 8 156 132 +3690c 8 256 82 +36914 10 264 25 +36924 4 265 25 +36928 1c 266 25 +36944 4 1139 87 +36948 4 277 82 +3694c 4 266 25 +36950 20 266 25 +36970 4 266 25 +36974 4 266 25 +36978 4 266 25 +3697c 1c 266 25 +36998 8 266 25 +369a0 c 266 25 +369ac 8 85 79 +369b4 8 266 25 +369bc 8 156 132 +369c4 8 256 82 +369cc 8 266 25 +369d4 20 267 25 +FUNC 369f4 4b8 0 LinuxPtraceDumperChildTest_FileIDsMatch_Test::RealTestBody +369f4 4 325 25 +369f8 4 60 49 +369fc 4 325 25 +36a00 8 60 49 +36a08 c 325 25 +36a14 8 60 49 +36a1c 8 325 25 +36a24 4 60 49 +36a28 4 1139 87 +36a2c 4 60 49 +36a30 14 277 82 +36a44 4 330 25 +36a48 20 330 25 +36a68 4 330 25 +36a6c 4 330 25 +36a70 1c 330 25 +36a8c 8 330 25 +36a94 c 330 25 +36aa0 8 85 79 +36aa8 8 330 25 +36ab0 8 156 132 +36ab8 10 256 82 +36ac8 8 277 82 +36ad0 4 256 82 +36ad4 8 332 25 +36adc 8 332 25 +36ae4 8 333 25 +36aec 4 277 82 +36af0 4 333 25 +36af4 4 1139 87 +36af8 4 333 25 +36afc 20 333 25 +36b1c 4 333 25 +36b20 4 333 25 +36b24 1c 333 25 +36b40 8 333 25 +36b48 c 333 25 +36b54 8 85 79 +36b5c 8 333 25 +36b64 8 156 132 +36b6c 10 256 82 +36b7c 8 124 143 +36b84 4 337 25 +36b88 4 124 143 +36b8c 10 192 139 +36b9c c 337 25 +36ba8 14 339 25 +36bbc 8 337 25 +36bc4 8 335 25 +36bcc 4 340 25 +36bd0 c 277 82 +36bdc 4 1139 87 +36be0 4 344 25 +36be4 24 344 25 +36c08 4 344 25 +36c0c 4 344 25 +36c10 4 344 25 +36c14 1c 344 25 +36c30 8 344 25 +36c38 c 344 25 +36c44 8 85 79 +36c4c 8 344 25 +36c54 8 156 132 +36c5c 18 256 82 +36c74 c 348 25 +36c80 4 348 25 +36c84 c 348 25 +36c90 4 277 82 +36c94 4 348 25 +36c98 4 1139 87 +36c9c 4 348 25 +36ca0 24 348 25 +36cc4 4 348 25 +36cc8 4 348 25 +36ccc 4 348 25 +36cd0 1c 348 25 +36cec 8 348 25 +36cf4 c 349 25 +36d00 8 85 79 +36d08 8 348 25 +36d10 8 156 132 +36d18 c 256 82 +36d24 c 350 25 +36d30 10 351 25 +36d40 8 277 82 +36d48 4 1139 87 +36d4c 4 351 25 +36d50 24 351 25 +36d74 4 351 25 +36d78 4 351 25 +36d7c 4 351 25 +36d80 1c 351 25 +36d9c 8 351 25 +36da4 c 351 25 +36db0 8 85 79 +36db8 8 351 25 +36dc0 8 156 132 +36dc8 4 256 82 +36dcc 4 358 25 +36dd0 8 256 82 +36dd8 10 355 25 +36de8 18 357 25 +36e00 28 358 25 +36e28 4 302 82 +36e2c 4 358 25 +36e30 4 358 25 +36e34 8 302 82 +36e3c 18 358 25 +36e54 8 358 25 +36e5c c 358 25 +36e68 8 85 79 +36e70 8 358 25 +36e78 8 256 82 +36e80 10 156 132 +36e90 1c 359 25 +FUNC 36eac 408 0 LinuxPtraceDumperChildTest_ThreadList_Test::RealTestBody +36eac 14 134 25 +36ec0 4 135 25 +36ec4 8 134 25 +36ecc 8 135 25 +36ed4 4 135 25 +36ed8 c 277 82 +36ee4 4 135 25 +36ee8 8 136 25 +36ef0 4 277 82 +36ef4 4 136 25 +36ef8 4 1139 87 +36efc 4 136 25 +36f00 24 136 25 +36f24 4 136 25 +36f28 4 136 25 +36f2c 1c 136 25 +36f48 8 136 25 +36f50 c 136 25 +36f5c 8 85 79 +36f64 8 136 25 +36f6c c 156 132 +36f78 4 256 82 +36f7c 8 138 25 +36f84 4 256 82 +36f88 10 192 139 +36f98 c 138 25 +36fa4 4 1621 82 +36fa8 10 1621 82 +36fb8 38 1583 82 +36ff0 10 1583 82 +37000 8 1583 82 +37008 c 1583 82 +37014 8 1583 82 +3701c c 1583 82 +37028 4 1583 82 +3702c 4 1382 82 +37030 4 1583 82 +37034 10 1584 82 +37044 c 1382 82 +37050 10 1584 82 +37060 8 306 82 +37068 4 131 79 +3706c 10 333 122 +3707c c 306 82 +37088 8 85 79 +37090 c 1382 82 +3709c 10 1585 82 +370ac 8 1585 82 +370b4 10 156 132 +370c4 8 256 82 +370cc c 138 25 +370d8 4 302 82 +370dc 4 138 25 +370e0 8 302 82 +370e8 18 138 25 +37100 8 138 25 +37108 c 138 25 +37114 8 85 79 +3711c 8 138 25 +37124 c 256 82 +37130 4 140 25 +37134 8 139 25 +3713c 4 256 82 +37140 c 192 139 +3714c 8 140 25 +37154 4 141 25 +37158 4 141 25 +3715c 8 141 25 +37164 4 142 25 +37168 4 1139 87 +3716c 4 277 82 +37170 4 142 25 +37174 24 142 25 +37198 4 142 25 +3719c 4 142 25 +371a0 1c 142 25 +371bc 8 142 25 +371c4 c 142 25 +371d0 8 85 79 +371d8 8 142 25 +371e0 8 156 132 +371e8 c 256 82 +371f4 4 143 25 +371f8 4 256 82 +371fc 8 140 25 +37204 8 277 82 +3720c 4 1139 87 +37210 4 146 25 +37214 24 146 25 +37238 4 146 25 +3723c 4 146 25 +37240 1c 146 25 +3725c 8 146 25 +37264 c 146 25 +37270 8 85 79 +37278 8 146 25 +37280 8 156 132 +37288 10 256 82 +37298 1c 147 25 +FUNC 372b4 40c 0 LinuxPtraceDumperChildTest_LinuxGateMappingID_Test::RealTestBody +372b4 18 295 25 +372cc 4 296 25 +372d0 8 296 25 +372d8 4 296 25 +372dc 8 277 82 +372e4 4 296 25 +372e8 8 297 25 +372f0 4 1139 87 +372f4 4 297 25 +372f8 4 277 82 +372fc 4 297 25 +37300 24 297 25 +37324 4 297 25 +37328 4 297 25 +3732c 4 297 25 +37330 1c 297 25 +3734c 8 297 25 +37354 c 297 25 +37360 8 85 79 +37368 8 297 25 +37370 8 156 132 +37378 c 256 82 +37384 4 302 25 +37388 4 256 82 +3738c 8 124 143 +37394 4 303 25 +37398 4 124 143 +3739c 8 192 139 +373a4 4 303 25 +373a8 8 192 139 +373b0 c 302 25 +373bc 10 303 25 +373cc 4 303 25 +373d0 8 302 25 +373d8 4 299 25 +373dc 8 301 25 +373e4 4 304 25 +373e8 18 277 82 +37400 4 1139 87 +37404 4 309 25 +37408 24 309 25 +3742c 18 309 25 +37444 8 256 82 +3744c 8 312 25 +37454 4 277 82 +37458 4 312 25 +3745c 4 1139 87 +37460 4 312 25 +37464 24 312 25 +37488 1c 312 25 +374a4 8 312 25 +374ac c 312 25 +374b8 8 85 79 +374c0 8 312 25 +374c8 8 156 132 +374d0 10 256 82 +374e0 20 314 25 +37500 4 1139 87 +37504 4 314 25 +37508 4 277 82 +3750c 4 314 25 +37510 24 314 25 +37534 1c 314 25 +37550 8 314 25 +37558 c 314 25 +37564 8 85 79 +3756c 8 314 25 +37574 8 256 82 +3757c c 320 25 +37588 4 319 25 +3758c c 320 25 +37598 20 320 25 +375b8 8 320 25 +375c0 c 302 82 +375cc 18 320 25 +375e4 8 320 25 +375ec c 320 25 +375f8 8 85 79 +37600 8 320 25 +37608 8 256 82 +37610 8 321 25 +37618 4 277 82 +3761c 4 321 25 +37620 4 1139 87 +37624 4 321 25 +37628 20 321 25 +37648 4 321 25 +3764c 4 321 25 +37650 1c 321 25 +3766c 8 321 25 +37674 c 321 25 +37680 8 85 79 +37688 8 321 25 +37690 8 156 132 +37698 10 256 82 +376a8 18 322 25 +FUNC 376c0 3e0 0 LinuxPtraceDumperChildTest_MappingsIncludeLinuxGate_Test::RealTestBody +376c0 18 271 25 +376d8 4 272 25 +376dc 4 277 82 +376e0 4 271 25 +376e4 8 272 25 +376ec 4 272 25 +376f0 8 1139 87 +376f8 4 272 25 +376fc 8 273 25 +37704 4 277 82 +37708 4 273 25 +3770c 4 1139 87 +37710 4 273 25 +37714 28 273 25 +3773c 18 273 25 +37754 8 256 82 +3775c 8 276 25 +37764 4 1139 87 +37768 c 277 82 +37774 4 277 25 +37778 28 277 25 +377a0 18 277 25 +377b8 4 277 25 +377bc 4 277 25 +377c0 8 277 25 +377c8 c 277 25 +377d4 8 85 79 +377dc 8 277 25 +377e4 8 156 132 +377ec c 256 82 +377f8 8 284 25 +37800 4 256 82 +37804 c 124 143 +37810 8 192 139 +37818 4 282 25 +3781c 8 192 139 +37824 c 282 25 +37830 4 283 25 +37834 10 284 25 +37844 8 282 25 +3784c 8 278 25 +37854 4 285 25 +37858 8 277 82 +37860 8 1139 87 +37868 4 289 25 +3786c 20 289 25 +3788c 4 289 25 +37890 4 289 25 +37894 1c 289 25 +378b0 8 289 25 +378b8 c 289 25 +378c4 8 85 79 +378cc 8 289 25 +378d4 8 156 132 +378dc 8 256 82 +378e4 4 290 25 +378e8 8 1481 82 +378f0 c 1482 82 +378fc 8 884 80 +37904 4 380 80 +37908 4 75 127 +3790c 4 884 80 +37910 c 380 80 +3791c c 75 127 +37928 8 886 80 +37930 c 884 80 +3793c c 380 80 +37948 c 75 127 +37954 8 886 80 +3795c 24 1471 82 +37980 10 156 132 +37990 8 290 25 +37998 c 302 82 +379a4 18 290 25 +379bc 8 290 25 +379c4 c 290 25 +379d0 8 85 79 +379d8 8 290 25 +379e0 8 256 82 +379e8 1c 291 25 +37a04 20 1552 82 +37a24 8 291 25 +37a2c c 302 82 +37a38 18 291 25 +37a50 8 291 25 +37a58 c 291 25 +37a64 8 85 79 +37a6c 8 291 25 +37a74 10 256 82 +37a84 1c 292 25 +FUNC 37aa0 3d8 0 LinuxPtraceDumperMappingsTest_MergedMappings_Test::RealTestBody +37aa0 14 226 25 +37ab4 4 277 82 +37ab8 c 226 25 +37ac4 4 228 25 +37ac8 8 226 25 +37ad0 8 228 25 +37ad8 4 228 25 +37adc 8 1139 87 +37ae4 4 228 25 +37ae8 8 229 25 +37af0 4 277 82 +37af4 4 229 25 +37af8 4 1139 87 +37afc 4 229 25 +37b00 24 229 25 +37b24 4 229 25 +37b28 4 229 25 +37b2c 1c 229 25 +37b48 8 229 25 +37b50 c 229 25 +37b5c 8 85 79 +37b64 8 229 25 +37b6c 8 156 132 +37b74 10 256 82 +37b84 4 1512 82 +37b88 4 231 25 +37b8c 4 256 82 +37b90 4 1512 82 +37b94 4 256 82 +37b98 4 230 25 +37b9c 8 256 82 +37ba4 4 192 139 +37ba8 4 231 25 +37bac 8 192 139 +37bb4 8 231 25 +37bbc 4 232 25 +37bc0 c 233 25 +37bcc 4 233 25 +37bd0 4 236 25 +37bd4 4 1512 82 +37bd8 4 236 25 +37bdc 18 1512 82 +37bf4 8 236 25 +37bfc c 302 82 +37c08 18 236 25 +37c20 8 236 25 +37c28 c 237 25 +37c34 8 85 79 +37c3c 8 236 25 +37c44 8 256 82 +37c4c 4 238 25 +37c50 4 1512 82 +37c54 4 238 25 +37c58 1c 1512 82 +37c74 8 238 25 +37c7c c 302 82 +37c88 18 238 25 +37ca0 8 238 25 +37ca8 c 238 25 +37cb4 8 85 79 +37cbc 8 238 25 +37cc4 8 256 82 +37ccc 4 1481 82 +37cd0 4 239 25 +37cd4 4 1481 82 +37cd8 c 1482 82 +37ce4 10 884 80 +37cf4 c 254 121 +37d00 c 75 127 +37d0c 8 886 80 +37d14 10 1382 82 +37d24 24 1471 82 +37d48 10 156 132 +37d58 8 239 25 +37d60 c 302 82 +37d6c 18 239 25 +37d84 8 239 25 +37d8c c 239 25 +37d98 8 85 79 +37da0 8 239 25 +37da8 8 256 82 +37db0 c 240 25 +37dbc 8 231 25 +37dc4 20 1512 82 +37de4 8 243 25 +37dec 4 1512 82 +37df0 8 243 25 +37df8 4 302 82 +37dfc 4 243 25 +37e00 8 302 82 +37e08 18 243 25 +37e20 8 243 25 +37e28 c 243 25 +37e34 8 85 79 +37e3c 8 243 25 +37e44 8 256 82 +37e4c 8 243 25 +37e54 24 244 25 +FUNC 37e78 b58 0 LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test::TestBody +37e78 4 364 25 +37e7c 4 367 25 +37e80 10 364 25 +37e90 4 367 25 +37e94 8 364 25 +37e9c 10 367 25 +37eac 4 364 25 +37eb0 8 370 25 +37eb8 8 364 25 +37ec0 4 367 25 +37ec4 10 370 25 +37ed4 8 370 25 +37edc c 370 25 +37ee8 1c 370 25 +37f04 c 370 25 +37f10 c 302 82 +37f1c 18 370 25 +37f34 8 370 25 +37f3c c 370 25 +37f48 8 85 79 +37f50 8 370 25 +37f58 10 256 82 +37f68 8 372 25 +37f70 4 373 25 +37f74 10 375 25 +37f84 8 377 25 +37f8c 10 378 25 +37f9c 18 379 25 +37fb4 8 379 25 +37fbc 4 131 79 +37fc0 10 333 122 +37fd0 14 385 25 +37fe4 1c 390 25 +38000 c 392 25 +3800c c 392 25 +38018 18 393 25 +38030 8 393 25 +38038 4 131 79 +3803c 10 333 122 +3804c 4 131 79 +38050 c 131 79 +3805c 4 131 79 +38060 10 333 122 +38070 4 393 25 +38074 c 393 25 +38080 4 333 122 +38084 4 150 79 +38088 c 333 122 +38094 c 393 25 +380a0 8 85 79 +380a8 8 393 25 +380b0 c 156 132 +380bc 8 396 25 +380c4 4 401 25 +380c8 4 396 25 +380cc 18 1512 82 +380e4 c 1471 82 +380f0 4 401 25 +380f4 8 402 25 +380fc 8 403 25 +38104 1c 405 25 +38120 4 405 25 +38124 c 405 25 +38130 4 405 25 +38134 4 406 25 +38138 4 1512 82 +3813c 4 406 25 +38140 4 1512 82 +38144 4 405 25 +38148 c 1512 82 +38154 4 406 25 +38158 4 1512 82 +3815c 8 406 25 +38164 c 302 82 +38170 18 406 25 +38188 8 406 25 +38190 c 406 25 +3819c 8 85 79 +381a4 8 406 25 +381ac 10 256 82 +381bc 8 1139 87 +381c4 4 256 82 +381c8 8 407 25 +381d0 4 277 82 +381d4 4 1139 87 +381d8 4 407 25 +381dc 24 407 25 +38200 1c 407 25 +3821c 8 407 25 +38224 c 407 25 +38230 8 85 79 +38238 8 407 25 +38240 c 156 132 +3824c 8 256 82 +38254 10 409 25 +38264 4 1481 82 +38268 4 409 25 +3826c 4 1481 82 +38270 c 1482 82 +3827c c 884 80 +38288 10 259 121 +38298 4 75 127 +3829c 4 259 121 +382a0 c 75 127 +382ac 8 886 80 +382b4 c 884 80 +382c0 10 259 121 +382d0 c 75 127 +382dc 8 886 80 +382e4 20 1471 82 +38304 10 156 132 +38314 c 409 25 +38320 c 302 82 +3832c 18 409 25 +38344 8 409 25 +3834c c 409 25 +38358 8 85 79 +38360 8 409 25 +38368 10 256 82 +38378 8 399 25 +38380 4 412 25 +38384 4 1139 87 +38388 4 412 25 +3838c c 417 25 +38398 c 420 25 +383a4 8 421 25 +383ac 4 277 82 +383b0 4 421 25 +383b4 4 1139 87 +383b8 4 421 25 +383bc 24 421 25 +383e0 1c 421 25 +383fc 8 421 25 +38404 c 421 25 +38410 8 85 79 +38418 8 421 25 +38420 8 156 132 +38428 8 256 82 +38430 4 422 25 +38434 4 192 139 +38438 4 422 25 +3843c 4 1512 82 +38440 4 192 139 +38444 8 1512 82 +3844c 8 192 139 +38454 4 1512 82 +38458 4 422 25 +3845c 10 1512 82 +3846c 8 422 25 +38474 c 302 82 +38480 18 422 25 +38498 8 422 25 +384a0 c 422 25 +384ac 8 85 79 +384b4 8 422 25 +384bc 8 256 82 +384c4 8 423 25 +384cc 4 1139 87 +384d0 4 423 25 +384d4 4 277 82 +384d8 4 423 25 +384dc 24 423 25 +38500 1c 423 25 +3851c 8 423 25 +38524 c 423 25 +38530 8 85 79 +38538 8 423 25 +38540 8 156 132 +38548 4 256 82 +3854c 4 426 25 +38550 4 256 82 +38554 20 427 25 +38574 10 192 139 +38584 4 426 25 +38588 4 427 25 +3858c 4 426 25 +38590 c 427 25 +3859c 4 1139 87 +385a0 4 427 25 +385a4 4 277 82 +385a8 4 427 25 +385ac 18 427 25 +385c4 1c 427 25 +385e0 8 427 25 +385e8 c 427 25 +385f4 8 85 79 +385fc 8 427 25 +38604 8 156 132 +3860c 8 256 82 +38614 14 430 25 +38628 4 1139 87 +3862c 4 430 25 +38630 4 277 82 +38634 4 430 25 +38638 1c 430 25 +38654 1c 430 25 +38670 8 430 25 +38678 c 431 25 +38684 8 85 79 +3868c 8 430 25 +38694 8 156 132 +3869c c 256 82 +386a8 1c 452 25 +386c4 4 203 139 +386c8 20 1512 82 +386e8 8 453 25 +386f0 c 302 82 +386fc 18 453 25 +38714 8 453 25 +3871c c 453 25 +38728 8 85 79 +38730 8 453 25 +38738 4 256 82 +3873c 4 426 25 +38740 8 256 82 +38748 4 455 25 +3874c 4 1139 87 +38750 4 455 25 +38754 4 277 82 +38758 4 455 25 +3875c 24 455 25 +38780 1c 455 25 +3879c 8 455 25 +387a4 c 455 25 +387b0 8 85 79 +387b8 8 455 25 +387c0 8 156 132 +387c8 8 256 82 +387d0 c 456 25 +387dc 8 460 25 +387e4 1c 460 25 +38800 4 460 25 +38804 10 460 25 +38814 4 256 82 +38818 4 1139 87 +3881c 4 256 82 +38820 14 461 25 +38834 4 277 82 +38838 4 1139 87 +3883c 4 461 25 +38840 24 461 25 +38864 1c 461 25 +38880 8 461 25 +38888 c 461 25 +38894 8 85 79 +3889c 8 461 25 +388a4 8 156 132 +388ac 8 256 82 +388b4 8 460 25 +388bc 4 460 25 +388c0 10 460 25 +388d0 4 460 25 +388d4 8 460 25 +388dc 8 460 25 +388e4 c 302 82 +388f0 14 460 25 +38904 4 462 25 +38908 8 462 25 +38910 c 462 25 +3891c 8 85 79 +38924 8 462 25 +3892c 1c 256 82 +38948 c 462 25 +38954 c 1512 82 +38960 8 462 25 +38968 14 1512 82 +3897c 8 462 25 +38984 c 302 82 +38990 18 462 25 +389a8 28 463 25 +FUNC 389d0 24 0 google_breakpad::LinuxPtraceDumper::~LinuxPtraceDumper +389d0 c 42 24 +389dc 8 42 24 +389e4 4 42 24 +389e8 8 42 24 +389f0 4 42 24 +FUNC 389f4 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MinidumpSizeLimit_Test>::~TestFactoryImpl +389f4 4 484 85 +FUNC 389f8 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_InvalidStackPointer_Test>::~TestFactoryImpl +389f8 4 484 85 +FUNC 389fc 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_AdditionalMemory_Test>::~TestFactoryImpl +389fc 4 484 85 +FUNC 38a00 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_DeletedBinary_Test>::~TestFactoryImpl +38a00 4 484 85 +FUNC 38a04 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfoContained_Test>::~TestFactoryImpl +38a04 4 484 85 +FUNC 38a08 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfo_Test>::~TestFactoryImpl +38a08 4 484 85 +FUNC 38a0c 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithFD_Test>::~TestFactoryImpl +38a0c 4 484 85 +FUNC 38a10 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithPath_Test>::~TestFactoryImpl +38a10 4 484 85 +FUNC 38a14 3c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithPath_Test>::CreateTest +38a14 10 486 85 +38a24 8 486 85 +38a2c 8 67 27 +38a34 4 486 85 +38a38 c 67 27 +38a44 c 486 85 +FUNC 38a50 3c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithFD_Test>::CreateTest +38a50 10 486 85 +38a60 8 486 85 +38a68 8 96 27 +38a70 4 486 85 +38a74 c 96 27 +38a80 c 486 85 +FUNC 38a8c 3c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfo_Test>::CreateTest +38a8c 10 486 85 +38a9c 8 486 85 +38aa4 8 128 27 +38aac 4 486 85 +38ab0 c 128 27 +38abc c 486 85 +FUNC 38ac8 3c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfoContained_Test>::CreateTest +38ac8 10 486 85 +38ad8 8 486 85 +38ae0 8 236 27 +38ae8 4 486 85 +38aec c 236 27 +38af8 c 486 85 +FUNC 38b04 3c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_DeletedBinary_Test>::CreateTest +38b04 10 486 85 +38b14 8 486 85 +38b1c 8 338 27 +38b24 4 486 85 +38b28 c 338 27 +38b34 c 486 85 +FUNC 38b40 3c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_AdditionalMemory_Test>::CreateTest +38b40 10 486 85 +38b50 8 486 85 +38b58 8 432 27 +38b60 4 486 85 +38b64 c 432 27 +38b70 c 486 85 +FUNC 38b7c 3c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_InvalidStackPointer_Test>::CreateTest +38b7c 10 486 85 +38b8c 8 486 85 +38b94 8 504 27 +38b9c 4 486 85 +38ba0 c 504 27 +38bac c 486 85 +FUNC 38bb8 3c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MinidumpSizeLimit_Test>::CreateTest +38bb8 10 486 85 +38bc8 8 486 85 +38bd0 8 583 27 +38bd8 4 486 85 +38bdc c 583 27 +38be8 c 486 85 +FUNC 38bf4 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithPath_Test>::~TestFactoryImpl +38bf4 4 484 85 +FUNC 38bf8 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithFD_Test>::~TestFactoryImpl +38bf8 4 484 85 +FUNC 38bfc 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfo_Test>::~TestFactoryImpl +38bfc 4 484 85 +FUNC 38c00 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfoContained_Test>::~TestFactoryImpl +38c00 4 484 85 +FUNC 38c04 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_DeletedBinary_Test>::~TestFactoryImpl +38c04 4 484 85 +FUNC 38c08 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_AdditionalMemory_Test>::~TestFactoryImpl +38c08 4 484 85 +FUNC 38c0c 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_InvalidStackPointer_Test>::~TestFactoryImpl +38c0c 4 484 85 +FUNC 38c10 4 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MinidumpSizeLimit_Test>::~TestFactoryImpl +38c10 4 484 85 +FUNC 38c14 14 0 MinidumpWriterTest_SetupWithPath_Test::~MinidumpWriterTest_SetupWithPath_Test +38c14 14 67 27 +FUNC 38c28 24 0 MinidumpWriterTest_SetupWithPath_Test::~MinidumpWriterTest_SetupWithPath_Test +38c28 c 67 27 +38c34 8 67 27 +38c3c 4 67 27 +38c40 8 67 27 +38c48 4 67 27 +FUNC 38c4c 14 0 MinidumpWriterTest_SetupWithFD_Test::~MinidumpWriterTest_SetupWithFD_Test +38c4c 14 96 27 +FUNC 38c60 24 0 MinidumpWriterTest_SetupWithFD_Test::~MinidumpWriterTest_SetupWithFD_Test +38c60 c 96 27 +38c6c 8 96 27 +38c74 4 96 27 +38c78 8 96 27 +38c80 4 96 27 +FUNC 38c84 14 0 MinidumpWriterTest_MappingInfo_Test::~MinidumpWriterTest_MappingInfo_Test +38c84 14 128 27 +FUNC 38c98 24 0 MinidumpWriterTest_MappingInfo_Test::~MinidumpWriterTest_MappingInfo_Test +38c98 c 128 27 +38ca4 8 128 27 +38cac 4 128 27 +38cb0 8 128 27 +38cb8 4 128 27 +FUNC 38cbc 14 0 MinidumpWriterTest_MappingInfoContained_Test::~MinidumpWriterTest_MappingInfoContained_Test +38cbc 14 236 27 +FUNC 38cd0 24 0 MinidumpWriterTest_MappingInfoContained_Test::~MinidumpWriterTest_MappingInfoContained_Test +38cd0 c 236 27 +38cdc 8 236 27 +38ce4 4 236 27 +38ce8 8 236 27 +38cf0 4 236 27 +FUNC 38cf4 14 0 MinidumpWriterTest_DeletedBinary_Test::~MinidumpWriterTest_DeletedBinary_Test +38cf4 14 338 27 +FUNC 38d08 24 0 MinidumpWriterTest_DeletedBinary_Test::~MinidumpWriterTest_DeletedBinary_Test +38d08 c 338 27 +38d14 8 338 27 +38d1c 4 338 27 +38d20 8 338 27 +38d28 4 338 27 +FUNC 38d2c 14 0 MinidumpWriterTest_AdditionalMemory_Test::~MinidumpWriterTest_AdditionalMemory_Test +38d2c 14 432 27 +FUNC 38d40 24 0 MinidumpWriterTest_AdditionalMemory_Test::~MinidumpWriterTest_AdditionalMemory_Test +38d40 c 432 27 +38d4c 8 432 27 +38d54 4 432 27 +38d58 8 432 27 +38d60 4 432 27 +FUNC 38d64 14 0 MinidumpWriterTest_InvalidStackPointer_Test::~MinidumpWriterTest_InvalidStackPointer_Test +38d64 14 504 27 +FUNC 38d78 24 0 MinidumpWriterTest_InvalidStackPointer_Test::~MinidumpWriterTest_InvalidStackPointer_Test +38d78 c 504 27 +38d84 8 504 27 +38d8c 4 504 27 +38d90 8 504 27 +38d98 4 504 27 +FUNC 38d9c 14 0 MinidumpWriterTest_MinidumpSizeLimit_Test::~MinidumpWriterTest_MinidumpSizeLimit_Test +38d9c 14 583 27 +FUNC 38db0 24 0 MinidumpWriterTest_MinidumpSizeLimit_Test::~MinidumpWriterTest_MinidumpSizeLimit_Test +38db0 c 583 27 +38dbc 8 583 27 +38dc4 4 583 27 +38dc8 8 583 27 +38dd0 4 583 27 +FUNC 38dd4 fc 0 std::basic_string, std::allocator >::find +38dd4 4 438 130 +38dd8 8 438 130 +38de0 4 400 131 +38de4 8 440 130 +38dec 8 441 130 +38df4 4 446 130 +38df8 8 162 99 +38e00 8 164 99 +38e08 c 165 99 +38e14 c 168 99 +38e20 8 166 99 +38e28 c 171 99 +38e34 8 169 99 +38e3c c 174 99 +38e48 c 172 99 +38e54 8 164 99 +38e5c 20 178 99 +38e7c 10 180 99 +38e8c 4 181 99 +38e90 10 183 99 +38ea0 4 184 99 +38ea4 10 186 99 +38eb4 8 165 99 +38ebc 4 190 99 +38ec0 8 447 130 +38ec8 4 447 130 +38ecc 4 448 130 +FUNC 38ed0 5c 0 std::basic_string, std::allocator >::erase +38ed0 c 788 131 +38edc 8 788 131 +38ee4 8 400 131 +38eec 8 789 131 +38ef4 c 604 130 +38f00 10 791 131 +38f10 c 791 131 +38f1c 10 793 131 +FUNC 38f2c 5c 0 std::priv::_Impl_list >::push_back +38f2c 4 509 116 +38f30 4 306 101 +38f34 8 509 116 +38f3c 4 509 116 +38f40 4 306 101 +38f44 4 509 116 +38f48 4 306 101 +38f4c 8 307 101 +38f54 8 119 103 +38f5c c 119 103 +38f68 4 427 116 +38f6c 4 429 116 +38f70 4 428 116 +38f74 4 430 116 +38f78 4 431 116 +38f7c c 509 116 +FUNC 38f88 34 0 std::basic_string, std::allocator >::append +38f88 c 529 131 +38f94 4 529 131 +38f98 c 229 140 +38fa4 8 530 131 +38fac 4 530 131 +38fb0 8 530 131 +38fb8 4 530 131 +FUNC 38fbc 40 0 std::priv::_List_base >::clear +38fbc c 66 115 +38fc8 4 66 115 +38fcc 4 67 115 +38fd0 8 68 115 +38fd8 4 74 115 +38fdc c 135 119 +38fe8 4 78 115 +38fec 4 79 115 +38ff0 c 80 115 +FUNC 38ffc 44 0 std::priv::_List_base >::clear +38ffc c 66 115 +39008 4 66 115 +3900c 4 67 115 +39010 8 68 115 +39018 4 161 101 +3901c 4 74 115 +39020 c 161 101 +3902c 4 78 115 +39030 4 79 115 +39034 c 80 115 +FUNC 39040 354 0 MinidumpWriterTest_SetupWithPath_Test::TestBody +39040 4 67 27 +39044 4 69 27 +39048 10 67 27 +39058 4 69 27 +3905c 4 67 27 +39060 8 69 27 +39068 c 67 27 +39074 c 69 27 +39080 4 69 27 +39084 c 69 27 +39090 20 69 27 +390b0 8 69 27 +390b8 c 302 82 +390c4 18 69 27 +390dc 8 69 27 +390e4 c 69 27 +390f0 8 85 79 +390f8 8 69 27 +39100 14 256 82 +39114 8 71 27 +3911c 4 72 27 +39120 8 73 27 +39128 18 75 27 +39140 4 75 27 +39144 c 75 27 +39150 c 76 27 +3915c 8 77 27 +39164 4 79 27 +39168 4 82 27 +3916c 4 84 27 +39170 c 85 27 +3917c 8 79 27 +39184 10 82 27 +39194 8 84 27 +3919c 14 85 27 +391b0 4 87 27 +391b4 8 88 27 +391bc 4 277 82 +391c0 8 88 27 +391c8 8 1139 87 +391d0 4 88 27 +391d4 4 277 82 +391d8 4 88 27 +391dc 4 1139 87 +391e0 4 88 27 +391e4 24 88 27 +39208 1c 88 27 +39224 8 88 27 +3922c c 88 27 +39238 8 85 79 +39240 8 88 27 +39248 c 156 132 +39254 4 256 82 +39258 8 1552 82 +39260 4 256 82 +39264 4 90 27 +39268 c 90 27 +39274 4 90 27 +39278 1c 1552 82 +39294 8 90 27 +3929c c 302 82 +392a8 18 90 27 +392c0 8 256 82 +392c8 28 91 27 +392f0 c 302 82 +392fc 18 91 27 +39314 8 91 27 +3931c c 91 27 +39328 8 85 79 +39330 8 91 27 +39338 8 256 82 +39340 10 156 132 +39350 8 256 82 +39358 8 93 27 +39360 8 156 132 +39368 8 93 27 +39370 24 94 27 +FUNC 39394 360 0 MinidumpWriterTest_SetupWithFD_Test::TestBody +39394 4 96 27 +39398 4 98 27 +3939c 10 96 27 +393ac 4 98 27 +393b0 4 96 27 +393b4 8 98 27 +393bc c 96 27 +393c8 c 98 27 +393d4 4 98 27 +393d8 c 98 27 +393e4 20 98 27 +39404 8 98 27 +3940c c 302 82 +39418 18 98 27 +39430 8 98 27 +39438 c 98 27 +39444 8 85 79 +3944c 8 98 27 +39454 14 256 82 +39468 8 100 27 +39470 4 101 27 +39474 8 102 27 +3947c 18 104 27 +39494 4 104 27 +39498 c 104 27 +394a4 c 105 27 +394b0 8 106 27 +394b8 4 108 27 +394bc 4 111 27 +394c0 4 113 27 +394c4 c 114 27 +394d0 8 108 27 +394d8 10 111 27 +394e8 8 113 27 +394f0 14 114 27 +39504 10 115 27 +39514 4 117 27 +39518 4 118 27 +3951c 4 277 82 +39520 8 118 27 +39528 8 1139 87 +39530 4 118 27 +39534 4 277 82 +39538 4 118 27 +3953c 4 1139 87 +39540 4 118 27 +39544 24 118 27 +39568 1c 118 27 +39584 8 118 27 +3958c c 118 27 +39598 8 85 79 +395a0 8 118 27 +395a8 c 156 132 +395b4 4 256 82 +395b8 8 1552 82 +395c0 4 256 82 +395c4 4 120 27 +395c8 c 120 27 +395d4 4 120 27 +395d8 1c 1552 82 +395f4 8 120 27 +395fc c 302 82 +39608 18 120 27 +39620 8 256 82 +39628 28 121 27 +39650 c 302 82 +3965c 18 121 27 +39674 8 121 27 +3967c c 121 27 +39688 8 85 79 +39690 8 121 27 +39698 8 256 82 +396a0 10 156 132 +396b0 8 256 82 +396b8 8 123 27 +396c0 8 156 132 +396c8 8 123 27 +396d0 24 124 27 +FUNC 396f4 f0 0 testing::internal::CmpHelperEQ, std::allocator > > +396f4 18 1476 82 +3970c c 1476 82 +39718 8 400 131 +39720 8 315 134 +39728 8 226 140 +39730 4 315 134 +39734 c 884 80 +39740 4 711 80 +39744 4 884 80 +39748 10 711 80 +39758 c 469 80 +39764 8 156 132 +3976c c 75 127 +39778 8 886 80 +39780 c 1382 82 +3978c 24 1471 82 +397b0 14 156 132 +397c4 8 1482 82 +397cc 18 1488 82 +FUNC 397e4 10b4 0 MinidumpWriterTest_MappingInfo_Test::TestBody +397e4 14 128 27 +397f8 4 130 27 +397fc 4 128 27 +39800 8 130 27 +39808 4 128 27 +3980c 4 130 27 +39810 4 130 27 +39814 8 128 27 +3981c 10 130 27 +3982c 1c 130 27 +39848 4 130 27 +3984c 4 130 27 +39850 8 130 27 +39858 c 302 82 +39864 18 130 27 +3987c 8 130 27 +39884 c 130 27 +39890 8 85 79 +39898 8 130 27 +398a0 10 256 82 +398b0 4 143 27 +398b4 4 144 27 +398b8 4 256 82 +398bc c 134 27 +398c8 4 143 27 +398cc 4 134 27 +398d0 74 139 27 +39944 4 143 27 +39948 8 139 27 +39950 4 143 27 +39954 10 144 27 +39964 10 962 131 +39974 4 147 27 +39978 4 962 131 +3997c 4 147 27 +39980 14 148 27 +39994 10 452 131 +399a4 20 161 27 +399c4 4 277 82 +399c8 8 162 27 +399d0 4 277 82 +399d4 4 1139 87 +399d8 8 277 82 +399e0 4 1139 87 +399e4 4 163 27 +399e8 20 163 27 +39a08 4 163 27 +39a0c 4 163 27 +39a10 4 163 27 +39a14 1c 163 27 +39a30 8 163 27 +39a38 c 163 27 +39a44 8 85 79 +39a4c 8 163 27 +39a54 8 156 132 +39a5c 10 256 82 +39a6c 8 165 27 +39a74 4 166 27 +39a78 4 167 27 +39a7c 4 169 27 +39a80 8 167 27 +39a88 18 169 27 +39aa0 4 169 27 +39aa4 c 169 27 +39ab0 c 170 27 +39abc 8 171 27 +39ac4 4 173 27 +39ac8 4 176 27 +39acc 8 177 27 +39ad4 4 1552 82 +39ad8 8 173 27 +39ae0 10 176 27 +39af0 10 177 27 +39b00 18 1552 82 +39b18 4 177 27 +39b1c 4 1552 82 +39b20 8 177 27 +39b28 c 302 82 +39b34 18 177 27 +39b4c 8 177 27 +39b54 c 177 27 +39b60 8 85 79 +39b68 8 177 27 +39b70 10 256 82 +39b80 4 180 27 +39b84 4 181 27 +39b88 4 185 27 +39b8c 4 256 82 +39b90 4 178 27 +39b94 8 180 27 +39b9c 10 181 27 +39bac 4 211 116 +39bb0 4 181 27 +39bb4 4 187 27 +39bb8 4 185 27 +39bbc 4 188 27 +39bc0 4 185 27 +39bc4 4 186 27 +39bc8 4 188 27 +39bcc 8 186 27 +39bd4 8 188 27 +39bdc 8 211 116 +39be4 4 193 27 +39be8 4 212 116 +39bec 8 193 27 +39bf4 4 212 116 +39bf8 8 211 116 +39c00 4 212 116 +39c04 4 193 27 +39c08 10 194 27 +39c18 c 229 141 +39c24 8 196 27 +39c2c 4 277 82 +39c30 10 196 27 +39c40 4 1139 87 +39c44 4 196 27 +39c48 4 277 82 +39c4c 4 196 27 +39c50 4 1139 87 +39c54 4 196 27 +39c58 20 196 27 +39c78 4 196 27 +39c7c 4 196 27 +39c80 1c 196 27 +39c9c 8 196 27 +39ca4 c 196 27 +39cb0 8 85 79 +39cb8 8 196 27 +39cc0 8 156 132 +39cc8 10 256 82 +39cd8 4 1139 87 +39cdc 4 256 82 +39ce0 c 202 27 +39cec 8 203 27 +39cf4 4 277 82 +39cf8 4 203 27 +39cfc 4 1139 87 +39d00 4 203 27 +39d04 20 203 27 +39d24 4 203 27 +39d28 4 203 27 +39d2c 18 203 27 +39d44 8 256 82 +39d4c 8 205 27 +39d54 4 277 82 +39d58 4 205 27 +39d5c 4 1139 87 +39d60 8 277 82 +39d68 4 206 27 +39d6c 20 206 27 +39d8c 4 206 27 +39d90 4 206 27 +39d94 18 206 27 +39dac 8 256 82 +39db4 14 208 27 +39dc8 4 277 82 +39dcc 4 208 27 +39dd0 4 1139 87 +39dd4 8 277 82 +39ddc 4 209 27 +39de0 20 209 27 +39e00 4 209 27 +39e04 4 209 27 +39e08 18 209 27 +39e20 4 209 27 +39e24 4 209 27 +39e28 8 209 27 +39e30 c 209 27 +39e3c 8 85 79 +39e44 8 209 27 +39e4c 8 156 132 +39e54 14 256 82 +39e68 14 211 27 +39e7c 20 1512 82 +39e9c 8 211 27 +39ea4 4 302 82 +39ea8 4 211 27 +39eac 8 302 82 +39eb4 18 211 27 +39ecc 8 211 27 +39ed4 c 211 27 +39ee0 8 85 79 +39ee8 8 211 27 +39ef0 4 256 82 +39ef4 4 212 27 +39ef8 c 256 82 +39f04 18 212 27 +39f1c 10 1481 82 +39f2c c 1482 82 +39f38 18 1382 82 +39f50 24 1471 82 +39f74 14 156 132 +39f88 8 212 27 +39f90 4 302 82 +39f94 8 212 27 +39f9c 4 302 82 +39fa0 10 212 27 +39fb0 4 212 27 +39fb4 4 212 27 +39fb8 8 212 27 +39fc0 c 212 27 +39fcc 8 85 79 +39fd4 8 212 27 +39fdc 4 256 82 +39fe0 4 213 27 +39fe4 4 256 82 +39fe8 4 1512 82 +39fec 4 256 82 +39ff0 14 213 27 +3a004 c 1512 82 +3a010 8 156 132 +3a018 8 213 27 +3a020 c 302 82 +3a02c 18 213 27 +3a044 8 213 27 +3a04c c 213 27 +3a058 8 85 79 +3a060 8 213 27 +3a068 4 256 82 +3a06c 4 214 27 +3a070 8 256 82 +3a078 14 214 27 +3a08c 20 1512 82 +3a0ac 8 156 132 +3a0b4 8 214 27 +3a0bc 4 302 82 +3a0c0 4 214 27 +3a0c4 8 302 82 +3a0cc 18 214 27 +3a0e4 8 214 27 +3a0ec c 214 27 +3a0f8 8 85 79 +3a100 8 214 27 +3a108 c 256 82 +3a114 10 218 27 +3a124 4 1139 87 +3a128 4 218 27 +3a12c 4 277 82 +3a130 4 218 27 +3a134 24 218 27 +3a158 4 218 27 +3a15c 4 218 27 +3a160 4 218 27 +3a164 1c 218 27 +3a180 8 218 27 +3a188 c 218 27 +3a194 8 85 79 +3a19c 8 218 27 +3a1a4 8 156 132 +3a1ac c 256 82 +3a1b8 10 219 27 +3a1c8 4 1139 87 +3a1cc 4 219 27 +3a1d0 4 277 82 +3a1d4 4 219 27 +3a1d8 24 219 27 +3a1fc 4 219 27 +3a200 4 219 27 +3a204 4 219 27 +3a208 1c 219 27 +3a224 8 219 27 +3a22c c 219 27 +3a238 8 85 79 +3a240 8 219 27 +3a248 8 156 132 +3a250 c 256 82 +3a25c 10 220 27 +3a26c 4 1139 87 +3a270 4 220 27 +3a274 4 277 82 +3a278 4 220 27 +3a27c 24 220 27 +3a2a0 4 220 27 +3a2a4 4 220 27 +3a2a8 4 220 27 +3a2ac 1c 220 27 +3a2c8 8 220 27 +3a2d0 c 220 27 +3a2dc 8 85 79 +3a2e4 8 220 27 +3a2ec 8 156 132 +3a2f4 c 256 82 +3a300 10 221 27 +3a310 4 1139 87 +3a314 4 221 27 +3a318 4 277 82 +3a31c 4 221 27 +3a320 24 221 27 +3a344 4 221 27 +3a348 4 221 27 +3a34c 4 221 27 +3a350 1c 221 27 +3a36c 8 221 27 +3a374 c 221 27 +3a380 8 85 79 +3a388 8 221 27 +3a390 8 156 132 +3a398 c 256 82 +3a3a4 14 222 27 +3a3b8 4 1139 87 +3a3bc 4 222 27 +3a3c0 4 277 82 +3a3c4 4 222 27 +3a3c8 24 222 27 +3a3ec 4 222 27 +3a3f0 4 222 27 +3a3f4 4 222 27 +3a3f8 1c 222 27 +3a414 8 222 27 +3a41c c 222 27 +3a428 8 85 79 +3a430 8 222 27 +3a438 8 156 132 +3a440 c 256 82 +3a44c 14 223 27 +3a460 4 1139 87 +3a464 4 223 27 +3a468 4 277 82 +3a46c 4 223 27 +3a470 24 223 27 +3a494 4 223 27 +3a498 4 223 27 +3a49c 4 223 27 +3a4a0 1c 223 27 +3a4bc 8 223 27 +3a4c4 c 223 27 +3a4d0 8 85 79 +3a4d8 8 223 27 +3a4e0 8 156 132 +3a4e8 c 256 82 +3a4f4 14 224 27 +3a508 4 1139 87 +3a50c 4 224 27 +3a510 4 277 82 +3a514 4 224 27 +3a518 24 224 27 +3a53c 4 224 27 +3a540 4 224 27 +3a544 4 224 27 +3a548 1c 224 27 +3a564 8 224 27 +3a56c c 224 27 +3a578 8 85 79 +3a580 8 224 27 +3a588 8 156 132 +3a590 c 256 82 +3a59c 14 225 27 +3a5b0 4 1139 87 +3a5b4 4 225 27 +3a5b8 4 277 82 +3a5bc 4 225 27 +3a5c0 24 225 27 +3a5e4 4 225 27 +3a5e8 4 225 27 +3a5ec 4 225 27 +3a5f0 1c 225 27 +3a60c 8 225 27 +3a614 c 225 27 +3a620 8 85 79 +3a628 8 225 27 +3a630 8 156 132 +3a638 c 256 82 +3a644 14 226 27 +3a658 4 1139 87 +3a65c 4 226 27 +3a660 4 277 82 +3a664 4 226 27 +3a668 24 226 27 +3a68c 4 226 27 +3a690 4 226 27 +3a694 4 226 27 +3a698 1c 226 27 +3a6b4 8 226 27 +3a6bc c 226 27 +3a6c8 8 85 79 +3a6d0 8 226 27 +3a6d8 8 156 132 +3a6e0 c 256 82 +3a6ec 14 227 27 +3a700 4 1139 87 +3a704 4 227 27 +3a708 4 277 82 +3a70c 4 227 27 +3a710 24 227 27 +3a734 4 227 27 +3a738 4 227 27 +3a73c 4 227 27 +3a740 1c 227 27 +3a75c 8 227 27 +3a764 c 227 27 +3a770 8 85 79 +3a778 8 227 27 +3a780 8 156 132 +3a788 c 256 82 +3a794 14 228 27 +3a7a8 4 1139 87 +3a7ac 4 228 27 +3a7b0 4 277 82 +3a7b4 4 228 27 +3a7b8 24 228 27 +3a7dc 4 228 27 +3a7e0 4 228 27 +3a7e4 4 228 27 +3a7e8 1c 228 27 +3a804 8 228 27 +3a80c c 228 27 +3a818 8 85 79 +3a820 8 228 27 +3a828 8 156 132 +3a830 8 256 82 +3a838 14 230 27 +3a84c 10 205 116 +3a85c 18 156 132 +3a874 24 231 27 +FUNC 3a898 aac 0 MinidumpWriterTest_MappingInfoContained_Test::TestBody +3a898 14 236 27 +3a8ac c 238 27 +3a8b8 10 236 27 +3a8c8 10 238 27 +3a8d8 c 238 27 +3a8e4 4 238 27 +3a8e8 14 238 27 +3a8fc 8 238 27 +3a904 4 238 27 +3a908 8 238 27 +3a910 c 302 82 +3a91c 18 238 27 +3a934 8 238 27 +3a93c c 238 27 +3a948 8 85 79 +3a950 8 238 27 +3a958 10 256 82 +3a968 4 251 27 +3a96c 4 252 27 +3a970 4 256 82 +3a974 c 242 27 +3a980 4 247 27 +3a984 4 251 27 +3a988 4 242 27 +3a98c 6c 247 27 +3a9f8 4 251 27 +3a9fc 4 247 27 +3aa00 4 251 27 +3aa04 8 247 27 +3aa0c 4 251 27 +3aa10 10 252 27 +3aa20 14 962 131 +3aa34 4 255 27 +3aa38 4 256 27 +3aa3c 4 255 27 +3aa40 10 256 27 +3aa50 4 452 131 +3aa54 4 263 27 +3aa58 4 452 131 +3aa5c 4 264 27 +3aa60 8 265 27 +3aa68 4 452 131 +3aa6c 8 263 27 +3aa74 10 264 27 +3aa84 4 266 27 +3aa88 4 264 27 +3aa8c 10 265 27 +3aa9c c 266 27 +3aaa8 4 265 27 +3aaac 24 266 27 +3aad0 c 302 82 +3aadc 18 266 27 +3aaf4 8 266 27 +3aafc c 266 27 +3ab08 8 85 79 +3ab10 8 266 27 +3ab18 10 256 82 +3ab28 4 269 27 +3ab2c 4 256 82 +3ab30 8 267 27 +3ab38 c 269 27 +3ab44 c 270 27 +3ab50 c 271 27 +3ab5c 4 271 27 +3ab60 4 271 27 +3ab64 4 271 27 +3ab68 c 1481 82 +3ab74 c 1482 82 +3ab80 18 1382 82 +3ab98 24 1471 82 +3abbc 18 156 132 +3abd4 c 271 27 +3abe0 4 302 82 +3abe4 4 271 27 +3abe8 8 302 82 +3abf0 18 271 27 +3ac08 8 271 27 +3ac10 c 271 27 +3ac1c 8 85 79 +3ac24 c 271 27 +3ac30 4 256 82 +3ac34 4 272 27 +3ac38 4 1139 87 +3ac3c 4 256 82 +3ac40 10 272 27 +3ac50 20 280 27 +3ac70 4 277 82 +3ac74 4 280 27 +3ac78 8 277 82 +3ac80 4 1139 87 +3ac84 4 282 27 +3ac88 24 282 27 +3acac 4 282 27 +3acb0 4 282 27 +3acb4 1c 282 27 +3acd0 8 282 27 +3acd8 c 282 27 +3ace4 8 85 79 +3acec 8 282 27 +3acf4 8 156 132 +3acfc 14 256 82 +3ad10 8 283 27 +3ad18 8 285 27 +3ad20 4 286 27 +3ad24 4 287 27 +3ad28 4 289 27 +3ad2c 8 287 27 +3ad34 18 289 27 +3ad4c 4 289 27 +3ad50 c 289 27 +3ad5c c 290 27 +3ad68 8 291 27 +3ad70 4 293 27 +3ad74 4 296 27 +3ad78 4 299 27 +3ad7c 4 297 27 +3ad80 4 304 27 +3ad84 4 211 116 +3ad88 8 293 27 +3ad90 10 296 27 +3ada0 4 297 27 +3ada4 14 299 27 +3adb8 4 306 27 +3adbc 4 304 27 +3adc0 8 307 27 +3adc8 c 304 27 +3add4 4 307 27 +3add8 c 305 27 +3ade4 4 307 27 +3ade8 8 211 116 +3adf0 4 312 27 +3adf4 4 212 116 +3adf8 c 312 27 +3ae04 4 211 116 +3ae08 8 212 116 +3ae10 8 312 27 +3ae18 10 313 27 +3ae28 c 229 141 +3ae34 8 315 27 +3ae3c 4 277 82 +3ae40 10 315 27 +3ae50 c 1139 87 +3ae5c 4 315 27 +3ae60 4 277 82 +3ae64 4 315 27 +3ae68 4 1139 87 +3ae6c 4 315 27 +3ae70 20 315 27 +3ae90 4 315 27 +3ae94 4 315 27 +3ae98 1c 315 27 +3aeb4 8 315 27 +3aebc c 315 27 +3aec8 8 85 79 +3aed0 8 315 27 +3aed8 8 156 132 +3aee0 10 256 82 +3aef0 4 1139 87 +3aef4 4 256 82 +3aef8 c 321 27 +3af04 8 322 27 +3af0c 4 277 82 +3af10 4 322 27 +3af14 4 1139 87 +3af18 4 322 27 +3af1c 20 322 27 +3af3c 4 322 27 +3af40 4 322 27 +3af44 18 322 27 +3af5c 8 256 82 +3af64 8 324 27 +3af6c 4 277 82 +3af70 4 324 27 +3af74 4 1139 87 +3af78 8 277 82 +3af80 4 325 27 +3af84 20 325 27 +3afa4 4 325 27 +3afa8 4 325 27 +3afac 18 325 27 +3afc4 8 256 82 +3afcc 14 327 27 +3afe0 4 277 82 +3afe4 4 327 27 +3afe8 4 1139 87 +3afec 8 277 82 +3aff4 4 328 27 +3aff8 20 328 27 +3b018 4 328 27 +3b01c 4 328 27 +3b020 18 328 27 +3b038 4 328 27 +3b03c 4 328 27 +3b040 8 328 27 +3b048 c 328 27 +3b054 8 85 79 +3b05c 8 328 27 +3b064 8 156 132 +3b06c 14 256 82 +3b080 14 330 27 +3b094 20 1512 82 +3b0b4 8 330 27 +3b0bc 4 302 82 +3b0c0 4 330 27 +3b0c4 8 302 82 +3b0cc 18 330 27 +3b0e4 8 330 27 +3b0ec c 330 27 +3b0f8 8 85 79 +3b100 8 330 27 +3b108 4 256 82 +3b10c 4 331 27 +3b110 8 256 82 +3b118 14 331 27 +3b12c 20 1512 82 +3b14c 8 331 27 +3b154 4 302 82 +3b158 4 331 27 +3b15c 8 302 82 +3b164 18 331 27 +3b17c 8 331 27 +3b184 c 331 27 +3b190 8 85 79 +3b198 8 331 27 +3b1a0 4 256 82 +3b1a4 4 1512 82 +3b1a8 8 256 82 +3b1b0 14 332 27 +3b1c4 c 1512 82 +3b1d0 8 156 132 +3b1d8 8 332 27 +3b1e0 4 302 82 +3b1e4 4 332 27 +3b1e8 8 302 82 +3b1f0 18 332 27 +3b208 8 332 27 +3b210 c 332 27 +3b21c 8 85 79 +3b224 8 332 27 +3b22c 4 256 82 +3b230 4 333 27 +3b234 8 256 82 +3b23c 14 333 27 +3b250 20 1512 82 +3b270 8 156 132 +3b278 8 333 27 +3b280 4 302 82 +3b284 4 333 27 +3b288 8 302 82 +3b290 18 333 27 +3b2a8 8 333 27 +3b2b0 c 333 27 +3b2bc 8 85 79 +3b2c4 8 333 27 +3b2cc 8 256 82 +3b2d4 14 335 27 +3b2e8 10 205 116 +3b2f8 8 156 132 +3b300 8 203 57 +3b308 18 156 132 +3b320 24 336 27 +FUNC 3b344 b84 0 MinidumpWriterTest_DeletedBinary_Test::TestBody +3b344 14 338 27 +3b358 8 339 27 +3b360 4 338 27 +3b364 4 339 27 +3b368 8 338 27 +3b370 10 339 27 +3b380 8 338 27 +3b388 4 340 27 +3b38c 4 339 27 +3b390 c 340 27 +3b39c 10 341 27 +3b3ac 20 342 27 +3b3cc 8 342 27 +3b3d4 4 131 79 +3b3d8 10 333 122 +3b3e8 c 342 27 +3b3f4 8 85 79 +3b3fc 8 342 27 +3b404 4 342 27 +3b408 4 347 27 +3b40c 4 348 27 +3b410 4 347 27 +3b414 4 1139 87 +3b418 4 347 27 +3b41c 18 348 27 +3b434 c 349 27 +3b440 4 277 82 +3b444 4 349 27 +3b448 4 1139 87 +3b44c 4 349 27 +3b450 20 349 27 +3b470 4 349 27 +3b474 4 349 27 +3b478 1c 349 27 +3b494 8 350 27 +3b49c 4 131 79 +3b4a0 10 333 122 +3b4b0 4 131 79 +3b4b4 c 131 79 +3b4c0 4 131 79 +3b4c4 10 333 122 +3b4d4 4 131 79 +3b4d8 c 131 79 +3b4e4 c 350 27 +3b4f0 8 85 79 +3b4f8 8 349 27 +3b500 8 156 132 +3b508 c 256 82 +3b514 4 1552 82 +3b518 4 351 27 +3b51c 4 256 82 +3b520 4 351 27 +3b524 c 351 27 +3b530 4 351 27 +3b534 1c 1552 82 +3b550 8 351 27 +3b558 c 302 82 +3b564 18 351 27 +3b57c 8 351 27 +3b584 c 351 27 +3b590 8 85 79 +3b598 8 351 27 +3b5a0 10 256 82 +3b5b0 4 354 27 +3b5b4 4 256 82 +3b5b8 14 354 27 +3b5cc 20 354 27 +3b5ec 8 354 27 +3b5f4 c 302 82 +3b600 18 354 27 +3b618 8 256 82 +3b620 8 356 27 +3b628 4 357 27 +3b62c 8 359 27 +3b634 14 363 27 +3b648 1c 368 27 +3b664 c 370 27 +3b670 4 373 27 +3b674 4 374 27 +3b678 4 377 27 +3b67c 4 373 27 +3b680 4 374 27 +3b684 8 375 27 +3b68c 1c 377 27 +3b6a8 4 377 27 +3b6ac 10 377 27 +3b6bc 8 256 82 +3b6c4 8 392 27 +3b6cc 4 256 82 +3b6d0 c 383 27 +3b6dc 8 387 27 +3b6e4 10 390 27 +3b6f4 14 392 27 +3b708 4 394 27 +3b70c 18 395 27 +3b724 4 1139 87 +3b728 4 395 27 +3b72c 4 277 82 +3b730 4 395 27 +3b734 24 395 27 +3b758 1c 395 27 +3b774 8 395 27 +3b77c c 395 27 +3b788 8 85 79 +3b790 8 395 27 +3b798 8 156 132 +3b7a0 8 256 82 +3b7a8 28 156 132 +3b7d0 28 429 27 +3b7f8 4 377 27 +3b7fc 8 378 27 +3b804 c 1512 82 +3b810 4 377 27 +3b814 4 1512 82 +3b818 4 378 27 +3b81c 8 1512 82 +3b824 4 378 27 +3b828 4 1512 82 +3b82c 8 378 27 +3b834 4 302 82 +3b838 4 378 27 +3b83c 8 302 82 +3b844 18 378 27 +3b85c 8 378 27 +3b864 c 378 27 +3b870 8 85 79 +3b878 c 378 27 +3b884 4 256 82 +3b888 4 1139 87 +3b88c 4 256 82 +3b890 c 379 27 +3b89c 4 277 82 +3b8a0 4 1139 87 +3b8a4 4 379 27 +3b8a8 20 379 27 +3b8c8 4 379 27 +3b8cc 4 379 27 +3b8d0 4 379 27 +3b8d4 1c 379 27 +3b8f0 8 379 27 +3b8f8 c 379 27 +3b904 8 85 79 +3b90c 8 379 27 +3b914 8 156 132 +3b91c c 256 82 +3b928 8 381 27 +3b930 4 256 82 +3b934 1c 381 27 +3b950 4 381 27 +3b954 c 381 27 +3b960 4 381 27 +3b964 8 382 27 +3b96c 8 1481 82 +3b974 4 381 27 +3b978 4 382 27 +3b97c 4 1481 82 +3b980 c 1482 82 +3b98c 1c 1382 82 +3b9a8 24 1471 82 +3b9cc 18 156 132 +3b9e4 10 382 27 +3b9f4 c 302 82 +3ba00 18 382 27 +3ba18 8 382 27 +3ba20 c 382 27 +3ba2c 8 85 79 +3ba34 8 382 27 +3ba3c 8 256 82 +3ba44 8 397 27 +3ba4c 4 1552 82 +3ba50 4 397 27 +3ba54 4 400 27 +3ba58 c 400 27 +3ba64 4 400 27 +3ba68 1c 1552 82 +3ba84 8 400 27 +3ba8c c 302 82 +3ba98 18 400 27 +3bab0 8 400 27 +3bab8 c 400 27 +3bac4 8 85 79 +3bacc c 400 27 +3bad8 8 256 82 +3bae0 28 401 27 +3bb08 c 302 82 +3bb14 18 401 27 +3bb2c 4 256 82 +3bb30 4 1139 87 +3bb34 4 256 82 +3bb38 c 403 27 +3bb44 8 404 27 +3bb4c 4 277 82 +3bb50 4 404 27 +3bb54 4 1139 87 +3bb58 4 404 27 +3bb5c 20 404 27 +3bb7c 4 404 27 +3bb80 4 404 27 +3bb84 18 404 27 +3bb9c 8 256 82 +3bba4 8 407 27 +3bbac 4 277 82 +3bbb0 4 407 27 +3bbb4 4 1139 87 +3bbb8 8 277 82 +3bbc0 4 408 27 +3bbc4 20 408 27 +3bbe4 4 408 27 +3bbe8 4 408 27 +3bbec 18 408 27 +3bc04 4 408 27 +3bc08 4 408 27 +3bc0c 8 408 27 +3bc14 c 408 27 +3bc20 8 85 79 +3bc28 8 408 27 +3bc30 8 156 132 +3bc38 14 256 82 +3bc4c 10 409 27 +3bc5c 8 410 27 +3bc64 8 410 27 +3bc6c 4 409 27 +3bc70 8 410 27 +3bc78 20 410 27 +3bc98 8 156 132 +3bca0 8 410 27 +3bca8 4 302 82 +3bcac 4 410 27 +3bcb0 8 302 82 +3bcb8 18 410 27 +3bcd0 8 410 27 +3bcd8 c 410 27 +3bce4 8 85 79 +3bcec 8 410 27 +3bcf4 4 256 82 +3bcf8 4 412 27 +3bcfc c 256 82 +3bd08 c 412 27 +3bd14 c 414 27 +3bd20 4 1139 87 +3bd24 4 414 27 +3bd28 4 277 82 +3bd2c 4 414 27 +3bd30 24 414 27 +3bd54 4 414 27 +3bd58 4 414 27 +3bd5c 4 414 27 +3bd60 1c 414 27 +3bd7c 8 414 27 +3bd84 c 414 27 +3bd90 8 85 79 +3bd98 8 414 27 +3bda0 8 156 132 +3bda8 4 256 82 +3bdac 4 418 27 +3bdb0 8 256 82 +3bdb8 10 418 27 +3bdc8 10 419 27 +3bdd8 14 962 131 +3bdec 4 422 27 +3bdf0 4 423 27 +3bdf4 4 422 27 +3bdf8 c 423 27 +3be04 4 452 131 +3be08 4 428 27 +3be0c 4 452 131 +3be10 10 428 27 +3be20 4 1512 82 +3be24 4 428 27 +3be28 20 1512 82 +3be48 8 156 132 +3be50 8 428 27 +3be58 4 302 82 +3be5c 4 428 27 +3be60 8 302 82 +3be68 18 428 27 +3be80 8 428 27 +3be88 c 428 27 +3be94 8 85 79 +3be9c 8 428 27 +3bea4 8 256 82 +3beac 1c 156 132 +FUNC 3bec8 3ac 0 MinidumpWriterTest_InvalidStackPointer_Test::TestBody +3bec8 4 504 27 +3becc 4 506 27 +3bed0 10 504 27 +3bee0 4 506 27 +3bee4 8 504 27 +3beec 8 506 27 +3bef4 8 504 27 +3befc c 506 27 +3bf08 4 506 27 +3bf0c c 506 27 +3bf18 20 506 27 +3bf38 8 506 27 +3bf40 c 302 82 +3bf4c 18 506 27 +3bf64 8 506 27 +3bf6c c 506 27 +3bf78 8 85 79 +3bf80 8 256 82 +3bf88 8 508 27 +3bf90 4 509 27 +3bf94 8 510 27 +3bf9c 18 512 27 +3bfb4 4 512 27 +3bfb8 c 512 27 +3bfc4 c 513 27 +3bfd0 8 514 27 +3bfd8 4 516 27 +3bfdc c 523 27 +3bfe8 4 1552 82 +3bfec 4 516 27 +3bff0 4 523 27 +3bff4 4 516 27 +3bff8 10 523 27 +3c008 20 1552 82 +3c028 8 523 27 +3c030 c 302 82 +3c03c 18 523 27 +3c054 8 523 27 +3c05c c 523 27 +3c068 8 85 79 +3c070 8 523 27 +3c078 10 256 82 +3c088 4 546 27 +3c08c 4 1139 87 +3c090 4 256 82 +3c094 4 524 27 +3c098 4 530 27 +3c09c 4 538 27 +3c0a0 8 546 27 +3c0a8 14 547 27 +3c0bc 18 550 27 +3c0d4 4 277 82 +3c0d8 4 550 27 +3c0dc 4 1139 87 +3c0e0 4 550 27 +3c0e4 20 550 27 +3c104 4 550 27 +3c108 4 550 27 +3c10c 1c 550 27 +3c128 8 550 27 +3c130 c 550 27 +3c13c 8 85 79 +3c144 8 550 27 +3c14c 8 156 132 +3c154 10 256 82 +3c164 4 1139 87 +3c168 4 256 82 +3c16c c 553 27 +3c178 8 554 27 +3c180 4 277 82 +3c184 4 554 27 +3c188 4 1139 87 +3c18c 4 554 27 +3c190 20 554 27 +3c1b0 4 554 27 +3c1b4 4 554 27 +3c1b8 4 554 27 +3c1bc 1c 554 27 +3c1d8 8 554 27 +3c1e0 c 554 27 +3c1ec 8 85 79 +3c1f4 8 554 27 +3c1fc 8 156 132 +3c204 1c 256 82 +3c220 8 579 27 +3c228 8 579 27 +3c230 8 156 132 +3c238 8 579 27 +3c240 10 156 132 +3c250 24 580 27 +FUNC 3c274 790 0 MinidumpWriterTest_AdditionalMemory_Test::TestBody +3c274 4 432 27 +3c278 4 434 27 +3c27c 10 432 27 +3c28c 4 434 27 +3c290 8 432 27 +3c298 4 434 27 +3c29c 4 434 27 +3c2a0 8 432 27 +3c2a8 18 434 27 +3c2c0 20 434 27 +3c2e0 8 434 27 +3c2e8 c 302 82 +3c2f4 18 434 27 +3c30c 8 434 27 +3c314 c 434 27 +3c320 8 85 79 +3c328 8 434 27 +3c330 c 256 82 +3c33c 4 438 27 +3c340 4 256 82 +3c344 c 438 27 +3c350 c 441 27 +3c35c 4 442 27 +3c360 4 1139 87 +3c364 4 442 27 +3c368 8 277 82 +3c370 8 256 82 +3c378 4 446 27 +3c37c 4 447 27 +3c380 c 446 27 +3c38c c 447 27 +3c398 8 446 27 +3c3a0 8 450 27 +3c3a8 4 451 27 +3c3ac 4 452 27 +3c3b0 4 454 27 +3c3b4 8 452 27 +3c3bc 18 454 27 +3c3d4 4 454 27 +3c3d8 c 454 27 +3c3e4 c 455 27 +3c3f0 8 456 27 +3c3f8 4 458 27 +3c3fc c 465 27 +3c408 8 1552 82 +3c410 4 458 27 +3c414 4 465 27 +3c418 4 458 27 +3c41c 10 465 27 +3c42c 1c 1552 82 +3c448 8 465 27 +3c450 c 302 82 +3c45c 18 465 27 +3c474 8 465 27 +3c47c c 465 27 +3c488 8 85 79 +3c490 8 465 27 +3c498 10 256 82 +3c4a8 4 468 27 +3c4ac 4 469 27 +3c4b0 4 256 82 +3c4b4 4 466 27 +3c4b8 8 468 27 +3c4c0 14 469 27 +3c4d4 8 470 27 +3c4dc 4 211 116 +3c4e0 4 478 27 +3c4e4 4 211 116 +3c4e8 4 212 116 +3c4ec 4 211 116 +3c4f0 4 478 27 +3c4f4 8 306 101 +3c4fc 4 307 101 +3c500 4 211 116 +3c504 4 212 116 +3c508 4 307 101 +3c50c 4 119 103 +3c510 4 307 101 +3c514 4 119 103 +3c518 8 119 103 +3c520 8 427 116 +3c528 4 277 82 +3c52c c 480 27 +3c538 4 427 116 +3c53c 4 1139 87 +3c540 8 428 116 +3c548 8 429 116 +3c550 4 430 116 +3c554 4 431 116 +3c558 c 480 27 +3c564 4 277 82 +3c568 4 480 27 +3c56c 4 1139 87 +3c570 4 480 27 +3c574 20 480 27 +3c594 4 480 27 +3c598 4 480 27 +3c59c 1c 480 27 +3c5b8 8 480 27 +3c5c0 c 480 27 +3c5cc 8 85 79 +3c5d4 8 480 27 +3c5dc 8 156 132 +3c5e4 10 256 82 +3c5f4 4 1139 87 +3c5f8 4 256 82 +3c5fc c 484 27 +3c608 8 485 27 +3c610 4 277 82 +3c614 4 485 27 +3c618 4 1139 87 +3c61c 4 485 27 +3c620 20 485 27 +3c640 4 485 27 +3c644 4 485 27 +3c648 18 485 27 +3c660 8 256 82 +3c668 8 487 27 +3c670 4 277 82 +3c674 4 487 27 +3c678 4 1139 87 +3c67c 8 277 82 +3c684 4 488 27 +3c688 20 488 27 +3c6a8 4 488 27 +3c6ac 4 488 27 +3c6b0 18 488 27 +3c6c8 4 256 82 +3c6cc 4 490 27 +3c6d0 4 256 82 +3c6d4 14 490 27 +3c6e8 4 277 82 +3c6ec 4 490 27 +3c6f0 4 1139 87 +3c6f4 8 277 82 +3c6fc 4 491 27 +3c700 20 491 27 +3c720 4 491 27 +3c724 4 491 27 +3c728 18 491 27 +3c740 4 491 27 +3c744 4 491 27 +3c748 8 491 27 +3c750 c 491 27 +3c75c 8 85 79 +3c764 8 491 27 +3c76c 8 156 132 +3c774 14 256 82 +3c788 14 493 27 +3c79c 20 1512 82 +3c7bc 8 493 27 +3c7c4 4 302 82 +3c7c8 4 493 27 +3c7cc 8 302 82 +3c7d4 18 493 27 +3c7ec 8 493 27 +3c7f4 c 493 27 +3c800 8 85 79 +3c808 8 493 27 +3c810 4 256 82 +3c814 4 494 27 +3c818 c 256 82 +3c824 18 494 27 +3c83c 10 1481 82 +3c84c c 1482 82 +3c858 18 1382 82 +3c870 24 1471 82 +3c894 14 156 132 +3c8a8 8 494 27 +3c8b0 4 302 82 +3c8b4 8 494 27 +3c8bc 4 302 82 +3c8c0 10 494 27 +3c8d0 4 494 27 +3c8d4 4 494 27 +3c8d8 8 494 27 +3c8e0 c 494 27 +3c8ec 8 85 79 +3c8f4 8 494 27 +3c8fc 4 256 82 +3c900 4 497 27 +3c904 4 256 82 +3c908 4 1552 82 +3c90c 4 256 82 +3c910 10 497 27 +3c920 c 497 27 +3c92c 4 497 27 +3c930 1c 1552 82 +3c94c 8 497 27 +3c954 c 302 82 +3c960 18 497 27 +3c978 8 497 27 +3c980 c 497 27 +3c98c 8 85 79 +3c994 8 497 27 +3c99c 8 256 82 +3c9a4 8 499 27 +3c9ac 14 500 27 +3c9c0 10 205 116 +3c9d0 10 156 132 +3c9e0 24 501 27 +FUNC 3ca04 113c 0 MinidumpWriterTest_MinidumpSizeLimit_Test::TestBody +3ca04 4 583 27 +3ca08 4 587 27 +3ca0c 10 583 27 +3ca1c 4 587 27 +3ca20 c 583 27 +3ca2c 10 587 27 +3ca3c 8 583 27 +3ca44 8 589 27 +3ca4c 4 583 27 +3ca50 8 587 27 +3ca58 8 589 27 +3ca60 10 590 27 +3ca70 20 591 27 +3ca90 8 591 27 +3ca98 14 333 122 +3caac c 591 27 +3cab8 8 85 79 +3cac0 8 591 27 +3cac8 4 591 27 +3cacc 20 596 27 +3caec 20 596 27 +3cb0c 8 596 27 +3cb14 c 302 82 +3cb20 18 596 27 +3cb38 8 596 27 +3cb40 c 596 27 +3cb4c 8 85 79 +3cb54 8 596 27 +3cb5c 10 256 82 +3cb6c 8 598 27 +3cb74 4 599 27 +3cb78 8 601 27 +3cb80 10 605 27 +3cb90 18 610 27 +3cba8 8 612 27 +3cbb0 4 617 27 +3cbb4 4 612 27 +3cbb8 24 1512 82 +3cbdc 4 617 27 +3cbe0 8 618 27 +3cbe8 8 619 27 +3cbf0 1c 621 27 +3cc0c 4 621 27 +3cc10 10 621 27 +3cc20 4 256 82 +3cc24 8 1139 87 +3cc2c 4 256 82 +3cc30 8 623 27 +3cc38 4 277 82 +3cc3c 4 1139 87 +3cc40 4 623 27 +3cc44 24 623 27 +3cc68 1c 623 27 +3cc84 8 623 27 +3cc8c c 623 27 +3cc98 8 85 79 +3cca0 8 623 27 +3cca8 8 156 132 +3ccb0 14 256 82 +3ccc4 4 639 27 +3ccc8 8 658 27 +3ccd0 c 658 27 +3ccdc 8 658 27 +3cce4 8 665 27 +3ccec 8 156 132 +3ccf4 4 673 27 +3ccf8 8 676 27 +3cd00 4 673 27 +3cd04 c 676 27 +3cd10 4 211 116 +3cd14 1c 677 27 +3cd30 4 212 116 +3cd34 4 211 116 +3cd38 4 677 27 +3cd3c 4 212 116 +3cd40 4 677 27 +3cd44 4 1139 87 +3cd48 4 277 82 +3cd4c 10 205 116 +3cd5c 8 677 27 +3cd64 24 677 27 +3cd88 1c 677 27 +3cda4 8 677 27 +3cdac c 677 27 +3cdb8 8 85 79 +3cdc0 8 677 27 +3cdc8 8 156 132 +3cdd0 8 256 82 +3cdd8 18 156 132 +3cdf0 2c 754 27 +3ce1c 8 622 27 +3ce24 4 1512 82 +3ce28 4 621 27 +3ce2c 10 1512 82 +3ce3c 4 621 27 +3ce40 4 1512 82 +3ce44 10 622 27 +3ce54 c 302 82 +3ce60 18 622 27 +3ce78 8 256 82 +3ce80 1c 625 27 +3ce9c 1c 1512 82 +3ceb8 8 625 27 +3cec0 c 302 82 +3cecc 18 625 27 +3cee4 8 625 27 +3ceec c 625 27 +3cef8 8 85 79 +3cf00 8 625 27 +3cf08 10 256 82 +3cf18 8 615 27 +3cf20 4 628 27 +3cf24 4 646 27 +3cf28 4 628 27 +3cf2c 10 633 27 +3cf3c 8 640 27 +3cf44 14 645 27 +3cf58 4 211 116 +3cf5c 1c 646 27 +3cf78 4 212 116 +3cf7c 4 211 116 +3cf80 4 212 116 +3cf84 4 646 27 +3cf88 4 277 82 +3cf8c 4 205 116 +3cf90 4 1139 87 +3cf94 c 205 116 +3cfa0 8 646 27 +3cfa8 24 646 27 +3cfcc 1c 646 27 +3cfe8 8 646 27 +3cff0 c 646 27 +3cffc 8 85 79 +3d004 8 646 27 +3d00c 8 156 132 +3d014 c 256 82 +3d020 4 1552 82 +3d024 4 256 82 +3d028 4 650 27 +3d02c c 650 27 +3d038 4 650 27 +3d03c 20 1552 82 +3d05c c 650 27 +3d068 c 302 82 +3d074 18 650 27 +3d08c 8 650 27 +3d094 c 650 27 +3d0a0 8 85 79 +3d0a8 8 650 27 +3d0b0 c 256 82 +3d0bc 4 651 27 +3d0c0 4 256 82 +3d0c4 28 651 27 +3d0ec c 302 82 +3d0f8 18 651 27 +3d110 4 256 82 +3d114 4 652 27 +3d118 4 1139 87 +3d11c 4 256 82 +3d120 4 652 27 +3d124 4 654 27 +3d128 4 652 27 +3d12c 8 654 27 +3d134 8 655 27 +3d13c 4 277 82 +3d140 4 655 27 +3d144 4 1139 87 +3d148 4 655 27 +3d14c 20 655 27 +3d16c 4 655 27 +3d170 4 655 27 +3d174 18 655 27 +3d18c 8 256 82 +3d194 8 656 27 +3d19c 4 277 82 +3d1a0 4 656 27 +3d1a4 4 1139 87 +3d1a8 8 277 82 +3d1b0 4 657 27 +3d1b4 20 657 27 +3d1d4 4 657 27 +3d1d8 4 657 27 +3d1dc 1c 657 27 +3d1f8 18 659 27 +3d210 4 271 65 +3d214 4 659 27 +3d218 8 271 65 +3d220 4 1139 87 +3d224 4 271 65 +3d228 8 660 27 +3d230 4 277 82 +3d234 4 660 27 +3d238 20 660 27 +3d258 4 660 27 +3d25c 4 660 27 +3d260 14 660 27 +3d274 8 663 27 +3d27c c 663 27 +3d288 c 663 27 +3d294 8 85 79 +3d29c 8 663 27 +3d2a4 8 156 132 +3d2ac 14 256 82 +3d2c0 14 662 27 +3d2d4 4 663 27 +3d2d8 4 662 27 +3d2dc 4 1139 87 +3d2e0 4 663 27 +3d2e4 4 277 82 +3d2e8 4 663 27 +3d2ec 20 663 27 +3d30c 4 663 27 +3d310 4 663 27 +3d314 18 663 27 +3d32c 8 256 82 +3d334 4 658 27 +3d338 4 256 82 +3d33c 24 664 27 +3d360 4 256 82 +3d364 4 681 27 +3d368 4 256 82 +3d36c 4 681 27 +3d370 c 681 27 +3d37c 4 681 27 +3d380 24 1552 82 +3d3a4 8 681 27 +3d3ac c 302 82 +3d3b8 18 681 27 +3d3d0 4 256 82 +3d3d4 4 1512 82 +3d3d8 4 256 82 +3d3dc 30 1512 82 +3d40c 8 686 27 +3d414 c 302 82 +3d420 18 686 27 +3d438 8 686 27 +3d440 c 686 27 +3d44c 8 85 79 +3d454 c 686 27 +3d460 8 256 82 +3d468 8 156 132 +3d470 c 705 27 +3d47c 4 709 27 +3d480 c 699 27 +3d48c c 709 27 +3d498 8 699 27 +3d4a0 4 709 27 +3d4a4 20 710 27 +3d4c4 4 211 116 +3d4c8 4 212 116 +3d4cc 4 211 116 +3d4d0 4 212 116 +3d4d4 4 710 27 +3d4d8 4 277 82 +3d4dc 4 205 116 +3d4e0 4 1139 87 +3d4e4 c 205 116 +3d4f0 8 710 27 +3d4f8 24 710 27 +3d51c 1c 710 27 +3d538 8 710 27 +3d540 c 710 27 +3d54c 8 85 79 +3d554 8 710 27 +3d55c 8 156 132 +3d564 10 256 82 +3d574 4 714 27 +3d578 10 714 27 +3d588 4 714 27 +3d58c 1c 1552 82 +3d5a8 8 714 27 +3d5b0 c 302 82 +3d5bc 18 714 27 +3d5d4 8 714 27 +3d5dc c 714 27 +3d5e8 8 85 79 +3d5f0 8 714 27 +3d5f8 14 256 82 +3d60c 24 715 27 +3d630 c 302 82 +3d63c 18 715 27 +3d654 c 256 82 +3d660 10 1619 82 +3d670 10 1619 82 +3d680 2c 1583 82 +3d6ac 10 1583 82 +3d6bc c 1583 82 +3d6c8 c 1583 82 +3d6d4 8 1583 82 +3d6dc c 1583 82 +3d6e8 c 1583 82 +3d6f4 10 1584 82 +3d704 c 1382 82 +3d710 c 1584 82 +3d71c 10 1585 82 +3d72c c 1382 82 +3d738 10 1585 82 +3d748 8 1585 82 +3d750 10 156 132 +3d760 8 256 82 +3d768 8 719 27 +3d770 c 302 82 +3d77c 18 719 27 +3d794 8 719 27 +3d79c c 719 27 +3d7a8 8 85 79 +3d7b0 8 719 27 +3d7b8 4 256 82 +3d7bc 4 1139 87 +3d7c0 4 256 82 +3d7c4 c 721 27 +3d7d0 8 722 27 +3d7d8 4 277 82 +3d7dc 4 722 27 +3d7e0 4 1139 87 +3d7e4 4 722 27 +3d7e8 20 722 27 +3d808 4 722 27 +3d80c 4 722 27 +3d810 18 722 27 +3d828 8 256 82 +3d830 8 723 27 +3d838 4 277 82 +3d83c 4 723 27 +3d840 4 1139 87 +3d844 8 277 82 +3d84c 4 724 27 +3d850 20 724 27 +3d870 4 724 27 +3d874 4 724 27 +3d878 1c 724 27 +3d894 8 724 27 +3d89c c 724 27 +3d8a8 8 85 79 +3d8b0 8 724 27 +3d8b8 8 156 132 +3d8c0 4 256 82 +3d8c4 4 725 27 +3d8c8 4 256 82 +3d8cc 4 726 27 +3d8d0 4 725 27 +3d8d4 4 726 27 +3d8d8 c 256 82 +3d8e4 20 732 27 +3d904 c 726 27 +3d910 4 726 27 +3d914 c 726 27 +3d920 c 726 27 +3d92c 14 727 27 +3d940 4 271 65 +3d944 4 727 27 +3d948 8 271 65 +3d950 4 1139 87 +3d954 4 271 65 +3d958 8 728 27 +3d960 4 277 82 +3d964 4 728 27 +3d968 24 728 27 +3d98c 4 728 27 +3d990 4 728 27 +3d994 14 728 27 +3d9a8 8 731 27 +3d9b0 8 731 27 +3d9b8 c 731 27 +3d9c4 8 85 79 +3d9cc 8 731 27 +3d9d4 8 156 132 +3d9dc 20 256 82 +3d9fc 14 730 27 +3da10 4 731 27 +3da14 4 730 27 +3da18 4 1139 87 +3da1c 4 731 27 +3da20 4 277 82 +3da24 4 731 27 +3da28 24 731 27 +3da4c 4 731 27 +3da50 4 731 27 +3da54 18 731 27 +3da6c 4 748 27 +3da70 4 1619 82 +3da74 4 748 27 +3da78 4 1619 82 +3da7c 4 748 27 +3da80 8 1619 82 +3da88 8 1619 82 +3da90 24 1619 82 +3dab4 8 748 27 +3dabc c 302 82 +3dac8 18 748 27 +3dae0 8 748 27 +3dae8 c 749 27 +3daf4 8 85 79 +3dafc 8 748 27 +3db04 8 256 82 +3db0c 8 749 27 +3db14 8 156 132 +3db1c c 753 27 +3db28 8 753 27 +3db30 10 156 132 +FUNC 3db40 390 0 google_breakpad::GetHelperBinary +3db40 4 42 28 +3db44 4 124 132 +3db48 10 42 28 +3db58 4 120 132 +3db5c 8 42 28 +3db64 4 120 132 +3db68 4 42 28 +3db6c 4 124 132 +3db70 4 120 132 +3db74 8 481 101 +3db7c 8 124 132 +3db84 4 101 103 +3db88 10 44 28 +3db98 4 45 28 +3db9c c 46 28 +3dba8 4 120 132 +3dbac 8 400 131 +3dbb4 4 481 101 +3dbb8 4 400 131 +3dbbc 10 124 132 +3dbcc 4 101 103 +3dbd0 10 517 131 +3dbe0 c 74 132 +3dbec 10 74 132 +3dbfc c 74 132 +3dc08 c 472 131 +3dc14 10 473 131 +3dc24 4 356 101 +3dc28 4 346 101 +3dc2c 4 347 101 +3dc30 8 348 101 +3dc38 4 352 101 +3dc3c 4 353 101 +3dc40 c 120 137 +3dc4c 4 479 131 +3dc50 8 120 137 +3dc58 14 148 137 +3dc6c 4 101 103 +3dc70 8 478 131 +3dc78 4 160 132 +3dc7c 4 164 132 +3dc80 8 165 132 +3dc88 4 482 131 +3dc8c 8 232 140 +3dc94 8 148 137 +3dc9c 4 483 131 +3dca0 c 148 137 +3dcac 4 101 103 +3dcb0 c 485 131 +3dcbc 10 349 131 +3dccc 14 156 132 +3dce0 18 60 49 +3dcf8 4 50 28 +3dcfc 14 51 28 +3dd10 10 53 28 +3dd20 10 349 131 +3dd30 10 156 132 +3dd40 8 471 130 +3dd48 8 162 99 +3dd50 c 164 99 +3dd5c c 165 99 +3dd68 c 168 99 +3dd74 8 81 113 +3dd7c c 171 99 +3dd88 8 81 113 +3dd90 c 174 99 +3dd9c 8 81 113 +3dda4 c 164 99 +3ddb0 4 152 113 +3ddb4 1c 178 99 +3ddd0 c 180 99 +3dddc 4 81 113 +3dde0 c 183 99 +3ddec 4 81 113 +3ddf0 10 186 99 +3de00 4 178 99 +3de04 8 478 130 +3de0c 8 478 130 +3de14 8 55 28 +3de1c 18 56 28 +3de34 4 58 28 +3de38 8 789 131 +3de40 c 604 130 +3de4c c 791 131 +3de58 20 530 131 +3de78 4 379 131 +3de7c 4 112 132 +3de80 4 378 131 +3de84 4 481 101 +3de88 8 379 131 +3de90 10 148 137 +3dea0 4 380 131 +3dea4 4 101 103 +3dea8 8 156 132 +3deb0 20 64 28 +FUNC 3ded0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3ded0 4 484 85 +FUNC 3ded4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3ded4 4 484 85 +FUNC 3ded8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3ded8 4 484 85 +FUNC 3dedc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3dedc 4 484 85 +FUNC 3dee0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3dee0 4 484 85 +FUNC 3dee4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3dee4 4 484 85 +FUNC 3dee8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3dee8 4 484 85 +FUNC 3deec 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3deec 4 484 85 +FUNC 3def0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3def0 4 484 85 +FUNC 3def4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3def4 4 484 85 +FUNC 3def8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3def8 4 484 85 +FUNC 3defc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3defc 4 484 85 +FUNC 3df00 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3df00 4 484 85 +FUNC 3df04 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3df04 4 484 85 +FUNC 3df08 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3df08 4 484 85 +FUNC 3df0c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3df0c 4 484 85 +FUNC 3df10 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3df10 4 484 85 +FUNC 3df14 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3df14 4 484 85 +FUNC 3df18 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3df18 4 484 85 +FUNC 3df1c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +3df1c 4 484 85 +FUNC 3df20 14 0 ProcCpuInfoReaderTest_EmptyValue_Test::~ProcCpuInfoReaderTest_EmptyValue_Test +3df20 14 186 30 +FUNC 3df34 24 0 ProcCpuInfoReaderTest_EmptyValue_Test::~ProcCpuInfoReaderTest_EmptyValue_Test +3df34 c 186 30 +3df40 8 186 30 +3df48 4 186 30 +3df4c 8 186 30 +3df54 4 186 30 +FUNC 3df58 14 0 ProcCpuInfoReaderTest_FieldWithSpaces_Test::~ProcCpuInfoReaderTest_FieldWithSpaces_Test +3df58 14 173 30 +FUNC 3df6c 24 0 ProcCpuInfoReaderTest_FieldWithSpaces_Test::~ProcCpuInfoReaderTest_FieldWithSpaces_Test +3df6c c 173 30 +3df78 8 173 30 +3df80 4 173 30 +3df84 8 173 30 +3df8c 4 173 30 +FUNC 3df90 14 0 ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test::~ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test +3df90 14 156 30 +FUNC 3dfa4 24 0 ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test::~ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test +3dfa4 c 156 30 +3dfb0 8 156 30 +3dfb8 4 156 30 +3dfbc 8 156 30 +3dfc4 4 156 30 +FUNC 3dfc8 14 0 ProcCpuInfoReaderTest_SkipEmptyField_Test::~ProcCpuInfoReaderTest_SkipEmptyField_Test +3dfc8 14 143 30 +FUNC 3dfdc 24 0 ProcCpuInfoReaderTest_SkipEmptyField_Test::~ProcCpuInfoReaderTest_SkipEmptyField_Test +3dfdc c 143 30 +3dfe8 8 143 30 +3dff0 4 143 30 +3dff4 8 143 30 +3dffc 4 143 30 +FUNC 3e000 14 0 ProcCpuInfoReaderTest_SkipOneEmptyLine_Test::~ProcCpuInfoReaderTest_SkipOneEmptyLine_Test +3e000 14 130 30 +FUNC 3e014 24 0 ProcCpuInfoReaderTest_SkipOneEmptyLine_Test::~ProcCpuInfoReaderTest_SkipOneEmptyLine_Test +3e014 c 130 30 +3e020 8 130 30 +3e028 4 130 30 +3e02c 8 130 30 +3e034 4 130 30 +FUNC 3e038 14 0 ProcCpuInfoReaderTest_SkipMalformedLine_Test::~ProcCpuInfoReaderTest_SkipMalformedLine_Test +3e038 14 117 30 +FUNC 3e04c 24 0 ProcCpuInfoReaderTest_SkipMalformedLine_Test::~ProcCpuInfoReaderTest_SkipMalformedLine_Test +3e04c c 117 30 +3e058 8 117 30 +3e060 4 117 30 +3e064 8 117 30 +3e06c 4 117 30 +FUNC 3e070 14 0 ProcCpuInfoReaderTest_TwoLinesTerminated_Test::~ProcCpuInfoReaderTest_TwoLinesTerminated_Test +3e070 14 100 30 +FUNC 3e084 24 0 ProcCpuInfoReaderTest_TwoLinesTerminated_Test::~ProcCpuInfoReaderTest_TwoLinesTerminated_Test +3e084 c 100 30 +3e090 8 100 30 +3e098 4 100 30 +3e09c 8 100 30 +3e0a4 4 100 30 +FUNC 3e0a8 14 0 ProcCpuInfoReaderTest_OneLine_Test::~ProcCpuInfoReaderTest_OneLine_Test +3e0a8 14 85 30 +FUNC 3e0bc 24 0 ProcCpuInfoReaderTest_OneLine_Test::~ProcCpuInfoReaderTest_OneLine_Test +3e0bc c 85 30 +3e0c8 8 85 30 +3e0d0 4 85 30 +3e0d4 8 85 30 +3e0dc 4 85 30 +FUNC 3e0e0 14 0 ProcCpuInfoReaderTest_OneLineTerminated_Test::~ProcCpuInfoReaderTest_OneLineTerminated_Test +3e0e0 14 72 30 +FUNC 3e0f4 24 0 ProcCpuInfoReaderTest_OneLineTerminated_Test::~ProcCpuInfoReaderTest_OneLineTerminated_Test +3e0f4 c 72 30 +3e100 8 72 30 +3e108 4 72 30 +3e10c 8 72 30 +3e114 4 72 30 +FUNC 3e118 14 0 ProcCpuInfoReaderTest_EmptyFile_Test::~ProcCpuInfoReaderTest_EmptyFile_Test +3e118 14 63 30 +FUNC 3e12c 24 0 ProcCpuInfoReaderTest_EmptyFile_Test::~ProcCpuInfoReaderTest_EmptyFile_Test +3e12c c 63 30 +3e138 8 63 30 +3e140 4 63 30 +3e144 8 63 30 +3e14c 4 63 30 +FUNC 3e150 3c 0 testing::internal::TestFactoryImpl::CreateTest +3e150 10 486 85 +3e160 8 486 85 +3e168 8 186 30 +3e170 4 486 85 +3e174 c 186 30 +3e180 c 486 85 +FUNC 3e18c 3c 0 testing::internal::TestFactoryImpl::CreateTest +3e18c 10 486 85 +3e19c 8 486 85 +3e1a4 8 173 30 +3e1ac 4 486 85 +3e1b0 c 173 30 +3e1bc c 486 85 +FUNC 3e1c8 3c 0 testing::internal::TestFactoryImpl::CreateTest +3e1c8 10 486 85 +3e1d8 8 486 85 +3e1e0 8 156 30 +3e1e8 4 486 85 +3e1ec c 156 30 +3e1f8 c 486 85 +FUNC 3e204 3c 0 testing::internal::TestFactoryImpl::CreateTest +3e204 10 486 85 +3e214 8 486 85 +3e21c 8 143 30 +3e224 4 486 85 +3e228 c 143 30 +3e234 c 486 85 +FUNC 3e240 3c 0 testing::internal::TestFactoryImpl::CreateTest +3e240 10 486 85 +3e250 8 486 85 +3e258 8 130 30 +3e260 4 486 85 +3e264 c 130 30 +3e270 c 486 85 +FUNC 3e27c 3c 0 testing::internal::TestFactoryImpl::CreateTest +3e27c 10 486 85 +3e28c 8 486 85 +3e294 8 117 30 +3e29c 4 486 85 +3e2a0 c 117 30 +3e2ac c 486 85 +FUNC 3e2b8 3c 0 testing::internal::TestFactoryImpl::CreateTest +3e2b8 10 486 85 +3e2c8 8 486 85 +3e2d0 8 100 30 +3e2d8 4 486 85 +3e2dc c 100 30 +3e2e8 c 486 85 +FUNC 3e2f4 3c 0 testing::internal::TestFactoryImpl::CreateTest +3e2f4 10 486 85 +3e304 8 486 85 +3e30c 8 85 30 +3e314 4 486 85 +3e318 c 85 30 +3e324 c 486 85 +FUNC 3e330 3c 0 testing::internal::TestFactoryImpl::CreateTest +3e330 10 486 85 +3e340 8 486 85 +3e348 8 72 30 +3e350 4 486 85 +3e354 c 72 30 +3e360 c 486 85 +FUNC 3e36c 3c 0 testing::internal::TestFactoryImpl::CreateTest +3e36c 10 486 85 +3e37c 8 486 85 +3e384 8 63 30 +3e38c 4 486 85 +3e390 c 63 30 +3e39c c 486 85 +FUNC 3e3a8 1cc 0 google_breakpad::ProcCpuInfoReader::GetNextField +3e3a8 1c 54 29 +3e3c4 8 54 29 +3e3cc 4 118 16 +3e3d0 4 62 29 +3e3d4 4 99 16 +3e3d8 4 103 16 +3e3dc c 60 29 +3e3e8 8 118 16 +3e3f0 4 117 16 +3e3f4 4 118 16 +3e3f8 4 117 16 +3e3fc 8 118 16 +3e404 4 62 29 +3e408 8 66 16 +3e410 8 66 16 +3e418 4 66 16 +3e41c 14 69 16 +3e430 10 70 16 +3e440 c 71 16 +3e44c 8 78 16 +3e454 c 86 16 +3e460 4 90 16 +3e464 4 92 16 +3e468 4 86 16 +3e46c 4 90 16 +3e470 8 92 16 +3e478 4 98 16 +3e47c 4 3104 97 +3e480 4 98 16 +3e484 4 99 16 +3e488 14 3104 97 +3e49c 4 3104 97 +3e4a0 c 3104 97 +3e4ac 8 100 16 +3e4b4 4 102 16 +3e4b8 8 103 16 +3e4c0 10 105 16 +3e4d0 4 70 29 +3e4d4 4 68 29 +3e4d8 8 77 29 +3e4e0 4 70 29 +3e4e4 8 77 29 +3e4ec 4 83 29 +3e4f0 4 78 29 +3e4f4 8 84 29 +3e4fc 8 84 29 +3e504 4 84 29 +3e508 8 85 29 +3e510 8 66 29 +3e518 4 87 29 +3e51c 8 88 29 +3e524 8 92 29 +3e52c 8 92 29 +3e534 4 92 29 +3e538 8 93 29 +3e540 8 95 29 +3e548 4 99 29 +3e54c 4 102 29 +3e550 4 101 29 +3e554 20 104 29 +FUNC 3e574 ac 0 ScopedTestFile::ScopedTestFile +3e574 10 56 30 +3e584 4 60 52 +3e588 4 56 30 +3e58c 4 60 52 +3e590 4 56 30 +3e594 4 60 52 +3e598 8 61 52 +3e5a0 c 62 52 +3e5ac 1c 109 52 +3e5c8 4 109 52 +3e5cc c 109 52 +3e5d8 8 110 52 +3e5e0 8 111 52 +3e5e8 c 112 52 +3e5f4 8 116 52 +3e5fc c 58 30 +3e608 8 116 52 +3e610 10 58 30 +FUNC 3e620 1ac 0 ProcCpuInfoReaderTest_EmptyFile_Test::TestBody +3e620 4 63 30 +3e624 8 64 30 +3e62c c 63 30 +3e638 4 64 30 +3e63c 4 63 30 +3e640 8 64 30 +3e648 4 63 30 +3e64c 4 64 30 +3e650 4 277 82 +3e654 4 82 52 +3e658 8 1139 87 +3e660 8 82 52 +3e668 4 277 82 +3e66c 4 1139 87 +3e670 4 65 30 +3e674 20 65 30 +3e694 4 65 30 +3e698 4 65 30 +3e69c 1c 65 30 +3e6b8 8 65 30 +3e6c0 c 65 30 +3e6cc 8 85 79 +3e6d4 8 65 30 +3e6dc 8 156 132 +3e6e4 10 256 82 +3e6f4 8 49 16 +3e6fc 4 69 30 +3e700 4 49 16 +3e704 4 48 29 +3e708 4 49 16 +3e70c 4 48 29 +3e710 4 69 30 +3e714 4 1139 87 +3e718 c 69 30 +3e724 4 277 82 +3e728 4 1139 87 +3e72c 4 69 30 +3e730 20 69 30 +3e750 4 69 30 +3e754 4 69 30 +3e758 4 69 30 +3e75c 1c 69 30 +3e778 8 69 30 +3e780 c 69 30 +3e78c 8 85 79 +3e794 8 69 30 +3e79c 8 156 132 +3e7a4 8 256 82 +3e7ac 8 54 30 +3e7b4 18 70 30 +FUNC 3e7cc 2fc 0 ProcCpuInfoReaderTest_OneLineTerminated_Test::TestBody +3e7cc 4 72 30 +3e7d0 8 73 30 +3e7d8 c 72 30 +3e7e4 4 73 30 +3e7e8 4 72 30 +3e7ec 4 73 30 +3e7f0 8 72 30 +3e7f8 4 73 30 +3e7fc 4 277 82 +3e800 4 82 52 +3e804 c 1139 87 +3e810 8 82 52 +3e818 4 277 82 +3e81c 4 1139 87 +3e820 4 74 30 +3e824 20 74 30 +3e844 4 74 30 +3e848 4 74 30 +3e84c 1c 74 30 +3e868 8 74 30 +3e870 c 74 30 +3e87c 8 85 79 +3e884 8 74 30 +3e88c c 156 132 +3e898 4 256 82 +3e89c 4 78 30 +3e8a0 4 1139 87 +3e8a4 4 256 82 +3e8a8 8 49 16 +3e8b0 4 78 30 +3e8b4 4 49 16 +3e8b8 4 48 29 +3e8bc 4 49 16 +3e8c0 4 48 29 +3e8c4 8 78 30 +3e8cc 4 277 82 +3e8d0 4 78 30 +3e8d4 4 1139 87 +3e8d8 4 78 30 +3e8dc 20 78 30 +3e8fc 4 78 30 +3e900 4 78 30 +3e904 18 78 30 +3e91c 8 256 82 +3e924 2c 79 30 +3e950 4 302 82 +3e954 4 79 30 +3e958 8 302 82 +3e960 18 79 30 +3e978 8 256 82 +3e980 24 80 30 +3e9a4 8 80 30 +3e9ac 4 302 82 +3e9b0 4 80 30 +3e9b4 8 302 82 +3e9bc 18 80 30 +3e9d4 8 80 30 +3e9dc c 80 30 +3e9e8 8 85 79 +3e9f0 8 80 30 +3e9f8 10 256 82 +3ea08 14 82 30 +3ea1c 4 1139 87 +3ea20 4 277 82 +3ea24 4 82 30 +3ea28 20 82 30 +3ea48 4 82 30 +3ea4c 4 82 30 +3ea50 18 82 30 +3ea68 4 82 30 +3ea6c 4 82 30 +3ea70 8 82 30 +3ea78 c 82 30 +3ea84 8 85 79 +3ea8c 8 82 30 +3ea94 8 156 132 +3ea9c 8 256 82 +3eaa4 8 54 30 +3eaac 1c 83 30 +FUNC 3eac8 420 0 ProcCpuInfoReaderTest_TwoLinesTerminated_Test::TestBody +3eac8 4 100 30 +3eacc 8 101 30 +3ead4 c 100 30 +3eae0 4 101 30 +3eae4 4 100 30 +3eae8 4 101 30 +3eaec c 100 30 +3eaf8 4 101 30 +3eafc 4 277 82 +3eb00 4 82 52 +3eb04 c 1139 87 +3eb10 8 82 52 +3eb18 4 277 82 +3eb1c 4 1139 87 +3eb20 4 102 30 +3eb24 20 102 30 +3eb44 4 102 30 +3eb48 4 102 30 +3eb4c 1c 102 30 +3eb68 8 102 30 +3eb70 c 102 30 +3eb7c 8 85 79 +3eb84 8 102 30 +3eb8c c 156 132 +3eb98 4 256 82 +3eb9c 4 106 30 +3eba0 4 1139 87 +3eba4 4 256 82 +3eba8 8 49 16 +3ebb0 4 106 30 +3ebb4 4 49 16 +3ebb8 4 48 29 +3ebbc 4 49 16 +3ebc0 4 48 29 +3ebc4 8 106 30 +3ebcc 4 277 82 +3ebd0 4 106 30 +3ebd4 4 1139 87 +3ebd8 4 106 30 +3ebdc 20 106 30 +3ebfc 4 106 30 +3ec00 4 106 30 +3ec04 18 106 30 +3ec1c 4 256 82 +3ec20 8 107 30 +3ec28 4 256 82 +3ec2c 28 107 30 +3ec54 4 302 82 +3ec58 4 107 30 +3ec5c 8 302 82 +3ec64 18 107 30 +3ec7c 4 256 82 +3ec80 8 108 30 +3ec88 4 256 82 +3ec8c 20 108 30 +3ecac 8 108 30 +3ecb4 4 302 82 +3ecb8 4 108 30 +3ecbc 8 302 82 +3ecc4 18 108 30 +3ecdc 8 256 82 +3ece4 c 110 30 +3ecf0 4 1139 87 +3ecf4 4 110 30 +3ecf8 4 277 82 +3ecfc 4 110 30 +3ed00 20 110 30 +3ed20 4 110 30 +3ed24 4 110 30 +3ed28 18 110 30 +3ed40 8 256 82 +3ed48 28 111 30 +3ed70 4 302 82 +3ed74 4 111 30 +3ed78 8 302 82 +3ed80 18 111 30 +3ed98 8 256 82 +3eda0 20 112 30 +3edc0 8 112 30 +3edc8 4 302 82 +3edcc 4 112 30 +3edd0 8 302 82 +3edd8 18 112 30 +3edf0 8 112 30 +3edf8 c 112 30 +3ee04 8 85 79 +3ee0c 8 112 30 +3ee14 10 256 82 +3ee24 14 114 30 +3ee38 4 1139 87 +3ee3c 4 277 82 +3ee40 4 114 30 +3ee44 20 114 30 +3ee64 4 114 30 +3ee68 4 114 30 +3ee6c 18 114 30 +3ee84 4 114 30 +3ee88 4 114 30 +3ee8c 8 114 30 +3ee94 c 114 30 +3eea0 8 85 79 +3eea8 8 114 30 +3eeb0 8 156 132 +3eeb8 8 256 82 +3eec0 8 54 30 +3eec8 20 115 30 +FUNC 3eee8 2fc 0 ProcCpuInfoReaderTest_SkipMalformedLine_Test::TestBody +3eee8 4 117 30 +3eeec 8 118 30 +3eef4 c 117 30 +3ef00 4 118 30 +3ef04 4 117 30 +3ef08 4 118 30 +3ef0c 8 117 30 +3ef14 4 118 30 +3ef18 4 277 82 +3ef1c 4 82 52 +3ef20 c 1139 87 +3ef2c 8 82 52 +3ef34 4 277 82 +3ef38 4 1139 87 +3ef3c 4 119 30 +3ef40 20 119 30 +3ef60 4 119 30 +3ef64 4 119 30 +3ef68 1c 119 30 +3ef84 8 119 30 +3ef8c c 119 30 +3ef98 8 85 79 +3efa0 8 119 30 +3efa8 c 156 132 +3efb4 4 256 82 +3efb8 4 123 30 +3efbc 4 1139 87 +3efc0 4 256 82 +3efc4 8 49 16 +3efcc 4 123 30 +3efd0 4 49 16 +3efd4 4 48 29 +3efd8 4 49 16 +3efdc 4 48 29 +3efe0 8 123 30 +3efe8 4 277 82 +3efec 4 123 30 +3eff0 4 1139 87 +3eff4 4 123 30 +3eff8 20 123 30 +3f018 4 123 30 +3f01c 4 123 30 +3f020 18 123 30 +3f038 8 256 82 +3f040 2c 124 30 +3f06c 4 302 82 +3f070 4 124 30 +3f074 8 302 82 +3f07c 18 124 30 +3f094 8 256 82 +3f09c 24 125 30 +3f0c0 8 125 30 +3f0c8 4 302 82 +3f0cc 4 125 30 +3f0d0 8 302 82 +3f0d8 18 125 30 +3f0f0 8 125 30 +3f0f8 c 125 30 +3f104 8 85 79 +3f10c 8 125 30 +3f114 10 256 82 +3f124 14 127 30 +3f138 4 1139 87 +3f13c 4 277 82 +3f140 4 127 30 +3f144 20 127 30 +3f164 4 127 30 +3f168 4 127 30 +3f16c 18 127 30 +3f184 4 127 30 +3f188 4 127 30 +3f18c 8 127 30 +3f194 c 127 30 +3f1a0 8 85 79 +3f1a8 8 127 30 +3f1b0 8 156 132 +3f1b8 8 256 82 +3f1c0 8 54 30 +3f1c8 1c 128 30 +FUNC 3f1e4 2fc 0 ProcCpuInfoReaderTest_SkipOneEmptyLine_Test::TestBody +3f1e4 4 130 30 +3f1e8 8 131 30 +3f1f0 c 130 30 +3f1fc 4 131 30 +3f200 4 130 30 +3f204 4 131 30 +3f208 8 130 30 +3f210 4 131 30 +3f214 4 277 82 +3f218 4 82 52 +3f21c c 1139 87 +3f228 8 82 52 +3f230 4 277 82 +3f234 4 1139 87 +3f238 4 132 30 +3f23c 20 132 30 +3f25c 4 132 30 +3f260 4 132 30 +3f264 1c 132 30 +3f280 8 132 30 +3f288 c 132 30 +3f294 8 85 79 +3f29c 8 132 30 +3f2a4 c 156 132 +3f2b0 4 256 82 +3f2b4 4 136 30 +3f2b8 4 1139 87 +3f2bc 4 256 82 +3f2c0 8 49 16 +3f2c8 4 136 30 +3f2cc 4 49 16 +3f2d0 4 48 29 +3f2d4 4 49 16 +3f2d8 4 48 29 +3f2dc 8 136 30 +3f2e4 4 277 82 +3f2e8 4 136 30 +3f2ec 4 1139 87 +3f2f0 4 136 30 +3f2f4 20 136 30 +3f314 4 136 30 +3f318 4 136 30 +3f31c 18 136 30 +3f334 8 256 82 +3f33c 2c 137 30 +3f368 4 302 82 +3f36c 4 137 30 +3f370 8 302 82 +3f378 18 137 30 +3f390 8 256 82 +3f398 24 138 30 +3f3bc 8 138 30 +3f3c4 4 302 82 +3f3c8 4 138 30 +3f3cc 8 302 82 +3f3d4 18 138 30 +3f3ec 8 138 30 +3f3f4 c 138 30 +3f400 8 85 79 +3f408 8 138 30 +3f410 10 256 82 +3f420 14 140 30 +3f434 4 1139 87 +3f438 4 277 82 +3f43c 4 140 30 +3f440 20 140 30 +3f460 4 140 30 +3f464 4 140 30 +3f468 18 140 30 +3f480 4 140 30 +3f484 4 140 30 +3f488 8 140 30 +3f490 c 140 30 +3f49c 8 85 79 +3f4a4 8 140 30 +3f4ac 8 156 132 +3f4b4 8 256 82 +3f4bc 8 54 30 +3f4c4 1c 141 30 +FUNC 3f4e0 2fc 0 ProcCpuInfoReaderTest_SkipEmptyField_Test::TestBody +3f4e0 4 143 30 +3f4e4 8 144 30 +3f4ec c 143 30 +3f4f8 4 144 30 +3f4fc 4 143 30 +3f500 4 144 30 +3f504 8 143 30 +3f50c 4 144 30 +3f510 4 277 82 +3f514 4 82 52 +3f518 c 1139 87 +3f524 8 82 52 +3f52c 4 277 82 +3f530 4 1139 87 +3f534 4 145 30 +3f538 20 145 30 +3f558 4 145 30 +3f55c 4 145 30 +3f560 1c 145 30 +3f57c 8 145 30 +3f584 c 145 30 +3f590 8 85 79 +3f598 8 145 30 +3f5a0 c 156 132 +3f5ac 4 256 82 +3f5b0 4 149 30 +3f5b4 4 1139 87 +3f5b8 4 256 82 +3f5bc 8 49 16 +3f5c4 4 149 30 +3f5c8 4 49 16 +3f5cc 4 48 29 +3f5d0 4 49 16 +3f5d4 4 48 29 +3f5d8 8 149 30 +3f5e0 4 277 82 +3f5e4 4 149 30 +3f5e8 4 1139 87 +3f5ec 4 149 30 +3f5f0 20 149 30 +3f610 4 149 30 +3f614 4 149 30 +3f618 18 149 30 +3f630 8 256 82 +3f638 2c 150 30 +3f664 4 302 82 +3f668 4 150 30 +3f66c 8 302 82 +3f674 18 150 30 +3f68c 8 256 82 +3f694 24 151 30 +3f6b8 8 151 30 +3f6c0 4 302 82 +3f6c4 4 151 30 +3f6c8 8 302 82 +3f6d0 18 151 30 +3f6e8 8 151 30 +3f6f0 c 151 30 +3f6fc 8 85 79 +3f704 8 151 30 +3f70c 10 256 82 +3f71c 14 153 30 +3f730 4 1139 87 +3f734 4 277 82 +3f738 4 153 30 +3f73c 20 153 30 +3f75c 4 153 30 +3f760 4 153 30 +3f764 18 153 30 +3f77c 4 153 30 +3f780 4 153 30 +3f784 8 153 30 +3f78c c 153 30 +3f798 8 85 79 +3f7a0 8 153 30 +3f7a8 8 156 132 +3f7b0 8 256 82 +3f7b8 8 54 30 +3f7c0 1c 154 30 +FUNC 3f7dc 43c 0 ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test::TestBody +3f7dc 4 156 30 +3f7e0 8 157 30 +3f7e8 10 156 30 +3f7f8 8 157 30 +3f800 14 156 30 +3f814 4 157 30 +3f818 4 277 82 +3f81c 4 82 52 +3f820 8 1139 87 +3f828 c 82 52 +3f834 4 277 82 +3f838 4 1139 87 +3f83c 4 158 30 +3f840 20 158 30 +3f860 4 158 30 +3f864 4 158 30 +3f868 1c 158 30 +3f884 8 158 30 +3f88c c 158 30 +3f898 8 85 79 +3f8a0 8 158 30 +3f8a8 c 156 132 +3f8b4 4 256 82 +3f8b8 4 162 30 +3f8bc 4 1139 87 +3f8c0 4 256 82 +3f8c4 8 49 16 +3f8cc 4 162 30 +3f8d0 4 49 16 +3f8d4 4 48 29 +3f8d8 4 49 16 +3f8dc 4 48 29 +3f8e0 8 162 30 +3f8e8 4 277 82 +3f8ec 4 162 30 +3f8f0 4 1139 87 +3f8f4 4 162 30 +3f8f8 20 162 30 +3f918 4 162 30 +3f91c 4 162 30 +3f920 18 162 30 +3f938 8 256 82 +3f940 44 163 30 +3f984 4 302 82 +3f988 4 163 30 +3f98c 8 302 82 +3f994 18 163 30 +3f9ac 4 256 82 +3f9b0 c 164 30 +3f9bc 4 256 82 +3f9c0 24 164 30 +3f9e4 8 164 30 +3f9ec 4 302 82 +3f9f0 4 164 30 +3f9f4 8 302 82 +3f9fc 18 164 30 +3fa14 8 256 82 +3fa1c c 166 30 +3fa28 4 1139 87 +3fa2c 4 166 30 +3fa30 4 277 82 +3fa34 4 166 30 +3fa38 20 166 30 +3fa58 4 166 30 +3fa5c 4 166 30 +3fa60 18 166 30 +3fa78 8 256 82 +3fa80 20 167 30 +3faa0 4 302 82 +3faa4 4 167 30 +3faa8 8 302 82 +3fab0 18 167 30 +3fac8 8 256 82 +3fad0 18 168 30 +3fae8 8 168 30 +3faf0 4 302 82 +3faf4 4 168 30 +3faf8 8 302 82 +3fb00 18 168 30 +3fb18 8 168 30 +3fb20 c 168 30 +3fb2c 8 85 79 +3fb34 8 168 30 +3fb3c 10 256 82 +3fb4c 14 170 30 +3fb60 4 1139 87 +3fb64 4 277 82 +3fb68 4 170 30 +3fb6c 20 170 30 +3fb8c 4 170 30 +3fb90 4 170 30 +3fb94 18 170 30 +3fbac 4 170 30 +3fbb0 4 170 30 +3fbb4 8 170 30 +3fbbc c 170 30 +3fbc8 8 85 79 +3fbd0 8 170 30 +3fbd8 8 156 132 +3fbe0 8 256 82 +3fbe8 8 54 30 +3fbf0 28 171 30 +FUNC 3fc18 2fc 0 ProcCpuInfoReaderTest_FieldWithSpaces_Test::TestBody +3fc18 4 173 30 +3fc1c 8 174 30 +3fc24 c 173 30 +3fc30 4 174 30 +3fc34 4 173 30 +3fc38 4 174 30 +3fc3c 8 173 30 +3fc44 4 174 30 +3fc48 4 277 82 +3fc4c 4 82 52 +3fc50 c 1139 87 +3fc5c 8 82 52 +3fc64 4 277 82 +3fc68 4 1139 87 +3fc6c 4 175 30 +3fc70 20 175 30 +3fc90 4 175 30 +3fc94 4 175 30 +3fc98 1c 175 30 +3fcb4 8 175 30 +3fcbc c 175 30 +3fcc8 8 85 79 +3fcd0 8 175 30 +3fcd8 c 156 132 +3fce4 4 256 82 +3fce8 4 179 30 +3fcec 4 1139 87 +3fcf0 4 256 82 +3fcf4 8 49 16 +3fcfc 4 179 30 +3fd00 4 49 16 +3fd04 4 48 29 +3fd08 4 49 16 +3fd0c 4 48 29 +3fd10 8 179 30 +3fd18 4 277 82 +3fd1c 4 179 30 +3fd20 4 1139 87 +3fd24 4 179 30 +3fd28 20 179 30 +3fd48 4 179 30 +3fd4c 4 179 30 +3fd50 18 179 30 +3fd68 8 256 82 +3fd70 2c 180 30 +3fd9c 4 302 82 +3fda0 4 180 30 +3fda4 8 302 82 +3fdac 18 180 30 +3fdc4 8 256 82 +3fdcc 24 181 30 +3fdf0 8 181 30 +3fdf8 4 302 82 +3fdfc 4 181 30 +3fe00 8 302 82 +3fe08 18 181 30 +3fe20 8 181 30 +3fe28 c 181 30 +3fe34 8 85 79 +3fe3c 8 181 30 +3fe44 10 256 82 +3fe54 14 183 30 +3fe68 4 1139 87 +3fe6c 4 277 82 +3fe70 4 183 30 +3fe74 20 183 30 +3fe94 4 183 30 +3fe98 4 183 30 +3fe9c 18 183 30 +3feb4 4 183 30 +3feb8 4 183 30 +3febc 8 183 30 +3fec4 c 183 30 +3fed0 8 85 79 +3fed8 8 183 30 +3fee0 8 156 132 +3fee8 8 256 82 +3fef0 8 54 30 +3fef8 1c 184 30 +FUNC 3ff14 3b8 0 ProcCpuInfoReaderTest_EmptyValue_Test::TestBody +3ff14 4 186 30 +3ff18 8 187 30 +3ff20 c 186 30 +3ff2c 4 187 30 +3ff30 4 186 30 +3ff34 4 187 30 +3ff38 8 186 30 +3ff40 4 187 30 +3ff44 4 277 82 +3ff48 4 82 52 +3ff4c c 1139 87 +3ff58 8 82 52 +3ff60 4 277 82 +3ff64 4 1139 87 +3ff68 4 188 30 +3ff6c 20 188 30 +3ff8c 4 188 30 +3ff90 4 188 30 +3ff94 1c 188 30 +3ffb0 8 188 30 +3ffb8 c 188 30 +3ffc4 8 85 79 +3ffcc 8 188 30 +3ffd4 c 156 132 +3ffe0 4 256 82 +3ffe4 4 192 30 +3ffe8 4 1139 87 +3ffec 4 256 82 +3fff0 8 49 16 +3fff8 4 192 30 +3fffc 4 49 16 +40000 4 48 29 +40004 4 49 16 +40008 4 48 29 +4000c 8 192 30 +40014 4 277 82 +40018 4 192 30 +4001c 4 1139 87 +40020 4 192 30 +40024 20 192 30 +40044 4 192 30 +40048 4 192 30 +4004c 4 192 30 +40050 1c 192 30 +4006c 8 192 30 +40074 c 192 30 +40080 8 85 79 +40088 8 192 30 +40090 8 156 132 +40098 10 256 82 +400a8 2c 193 30 +400d4 4 302 82 +400d8 4 193 30 +400dc 8 302 82 +400e4 18 193 30 +400fc 4 256 82 +40100 4 117 29 +40104 4 256 82 +40108 4 117 29 +4010c 4 195 30 +40110 4 117 29 +40114 20 195 30 +40134 8 195 30 +4013c 4 302 82 +40140 4 195 30 +40144 8 302 82 +4014c 18 195 30 +40164 8 256 82 +4016c 4 196 30 +40170 4 1481 82 +40174 4 1482 82 +40178 4 1481 82 +4017c 8 1482 82 +40184 1c 1487 82 +401a0 c 196 30 +401ac 4 302 82 +401b0 4 196 30 +401b4 8 302 82 +401bc 18 196 30 +401d4 8 196 30 +401dc c 196 30 +401e8 8 85 79 +401f0 8 196 30 +401f8 10 256 82 +40208 8 198 30 +40210 4 1139 87 +40214 c 198 30 +40220 4 277 82 +40224 4 1139 87 +40228 4 198 30 +4022c 20 198 30 +4024c 4 198 30 +40250 4 198 30 +40254 4 198 30 +40258 1c 198 30 +40274 8 198 30 +4027c c 198 30 +40288 8 85 79 +40290 8 198 30 +40298 8 156 132 +402a0 8 256 82 +402a8 8 54 30 +402b0 1c 199 30 +FUNC 402cc 3c0 0 ProcCpuInfoReaderTest_OneLine_Test::TestBody +402cc 4 85 30 +402d0 8 86 30 +402d8 c 85 30 +402e4 4 86 30 +402e8 4 85 30 +402ec 4 86 30 +402f0 8 85 30 +402f8 4 86 30 +402fc 4 277 82 +40300 4 82 52 +40304 c 1139 87 +40310 8 82 52 +40318 4 277 82 +4031c 4 1139 87 +40320 4 87 30 +40324 20 87 30 +40344 4 87 30 +40348 4 87 30 +4034c 1c 87 30 +40368 8 87 30 +40370 c 87 30 +4037c 8 85 79 +40384 8 87 30 +4038c c 156 132 +40398 4 256 82 +4039c 4 92 30 +403a0 4 1139 87 +403a4 4 256 82 +403a8 8 49 16 +403b0 4 92 30 +403b4 4 49 16 +403b8 4 48 29 +403bc 4 49 16 +403c0 4 48 29 +403c4 8 92 30 +403cc 4 277 82 +403d0 4 92 30 +403d4 4 1139 87 +403d8 4 92 30 +403dc 20 92 30 +403fc 4 92 30 +40400 4 92 30 +40404 4 92 30 +40408 1c 92 30 +40424 8 92 30 +4042c c 92 30 +40438 8 85 79 +40440 8 92 30 +40448 8 156 132 +40450 10 256 82 +40460 2c 93 30 +4048c 4 302 82 +40490 4 93 30 +40494 8 302 82 +4049c 18 93 30 +404b4 4 256 82 +404b8 4 117 29 +404bc 4 256 82 +404c0 4 117 29 +404c4 4 94 30 +404c8 4 117 29 +404cc 20 94 30 +404ec 8 94 30 +404f4 4 302 82 +404f8 4 94 30 +404fc 8 302 82 +40504 18 94 30 +4051c 8 256 82 +40524 8 95 30 +4052c 4 1481 82 +40530 4 1482 82 +40534 8 1481 82 +4053c 8 1482 82 +40544 1c 1487 82 +40560 c 95 30 +4056c 4 302 82 +40570 4 95 30 +40574 8 302 82 +4057c 18 95 30 +40594 8 95 30 +4059c c 95 30 +405a8 8 85 79 +405b0 8 95 30 +405b8 10 256 82 +405c8 8 97 30 +405d0 4 1139 87 +405d4 c 97 30 +405e0 4 277 82 +405e4 4 1139 87 +405e8 4 97 30 +405ec 20 97 30 +4060c 4 97 30 +40610 4 97 30 +40614 4 97 30 +40618 1c 97 30 +40634 8 97 30 +4063c c 97 30 +40648 8 85 79 +40650 8 97 30 +40658 8 156 132 +40660 8 256 82 +40668 8 54 30 +40670 1c 98 30 +FUNC 4068c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4068c 4 484 85 +FUNC 40690 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +40690 4 484 85 +FUNC 40694 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +40694 4 484 85 +FUNC 40698 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +40698 4 484 85 +FUNC 4069c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4069c 4 484 85 +FUNC 406a0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +406a0 4 484 85 +FUNC 406a4 14 0 ElfCoreDumpTest_ValidCoreFile_Test::~ElfCoreDumpTest_ValidCoreFile_Test +406a4 14 130 39 +FUNC 406b8 24 0 ElfCoreDumpTest_ValidCoreFile_Test::~ElfCoreDumpTest_ValidCoreFile_Test +406b8 c 130 39 +406c4 8 130 39 +406cc 4 130 39 +406d0 8 130 39 +406d8 4 130 39 +FUNC 406dc 14 0 ElfCoreDumpTest_TestElfHeader_Test::~ElfCoreDumpTest_TestElfHeader_Test +406dc 14 62 39 +FUNC 406f0 24 0 ElfCoreDumpTest_TestElfHeader_Test::~ElfCoreDumpTest_TestElfHeader_Test +406f0 c 62 39 +406fc 8 62 39 +40704 4 62 39 +40708 8 62 39 +40710 4 62 39 +FUNC 40714 14 0 ElfCoreDumpTest_DefaultConstructor_Test::~ElfCoreDumpTest_DefaultConstructor_Test +40714 14 52 39 +FUNC 40728 24 0 ElfCoreDumpTest_DefaultConstructor_Test::~ElfCoreDumpTest_DefaultConstructor_Test +40728 c 52 39 +40734 8 52 39 +4073c 4 52 39 +40740 8 52 39 +40748 4 52 39 +FUNC 4074c 3c 0 testing::internal::TestFactoryImpl::CreateTest +4074c 10 486 85 +4075c 8 486 85 +40764 8 62 39 +4076c 4 486 85 +40770 c 62 39 +4077c c 486 85 +FUNC 40788 3c 0 testing::internal::TestFactoryImpl::CreateTest +40788 10 486 85 +40798 8 486 85 +407a0 8 52 39 +407a8 4 486 85 +407ac c 52 39 +407b8 c 486 85 +FUNC 407c4 3c 0 testing::internal::TestFactoryImpl::CreateTest +407c4 10 486 85 +407d4 8 486 85 +407dc 8 130 39 +407e4 4 486 85 +407e8 c 130 39 +407f4 c 486 85 +FUNC 40800 50 0 testing::internal::DefaultPrintTo +40800 14 307 80 +40814 4 310 80 +40818 4 334 80 +4081c 4 333 122 +40820 4 334 80 +40824 8 333 122 +4082c 10 318 80 +4083c 8 291 121 +40844 8 334 80 +4084c 4 291 121 +FUNC 40850 50 0 testing::internal::DefaultPrintTo +40850 14 307 80 +40864 4 310 80 +40868 4 334 80 +4086c 4 333 122 +40870 4 334 80 +40874 8 333 122 +4087c 10 318 80 +4088c 8 291 121 +40894 8 334 80 +4089c 4 291 121 +FUNC 408a0 e8 0 testing::internal::CmpHelperEQFailure +408a0 c 1464 82 +408ac 4 884 80 +408b0 10 1464 82 +408c0 8 884 80 +408c8 4 1464 82 +408cc 4 75 127 +408d0 4 1464 82 +408d4 8 1464 82 +408dc 4 884 80 +408e0 c 380 80 +408ec 4 75 127 +408f0 8 380 80 +408f8 c 75 127 +40904 8 886 80 +4090c c 884 80 +40918 8 380 80 +40920 4 75 127 +40924 8 380 80 +4092c c 75 127 +40938 8 886 80 +40940 1c 1471 82 +4095c 10 156 132 +4096c 1c 1472 82 +FUNC 40988 e8 0 testing::internal::CmpHelperEQFailure +40988 c 1464 82 +40994 4 884 80 +40998 10 1464 82 +409a8 8 884 80 +409b0 4 1464 82 +409b4 4 75 127 +409b8 4 1464 82 +409bc 8 1464 82 +409c4 4 884 80 +409c8 c 380 80 +409d4 4 75 127 +409d8 8 380 80 +409e0 c 75 127 +409ec 8 886 80 +409f4 c 884 80 +40a00 8 380 80 +40a08 4 75 127 +40a0c 8 380 80 +40a14 c 75 127 +40a20 8 886 80 +40a28 1c 1471 82 +40a44 10 156 132 +40a54 1c 1472 82 +FUNC 40a70 50 0 std::priv::_Rb_tree, int, std::priv::_Identity, std::priv::_SetTraitsT, std::allocator >::_M_erase +40a70 18 655 135 +40a88 4 657 135 +40a8c c 658 135 +40a98 4 659 135 +40a9c 14 161 101 +40ab0 10 664 135 +FUNC 40ac0 3c 0 std::priv::_Rb_tree, int, std::priv::_Identity, std::priv::_SetTraitsT, std::allocator >::clear +40ac0 8 530 136 +40ac8 4 531 136 +40acc 4 530 136 +40ad0 4 530 136 +40ad4 4 531 136 +40ad8 8 532 136 +40ae0 4 533 136 +40ae4 4 534 136 +40ae8 4 535 136 +40aec 4 536 136 +40af0 c 538 136 +FUNC 40afc 11c 0 std::priv::_Rb_tree, int, std::priv::_Identity, std::priv::_SetTraitsT, std::allocator >::_M_insert +40afc 4 350 135 +40b00 4 358 135 +40b04 10 350 135 +40b14 14 350 135 +40b28 4 358 135 +40b2c 8 306 101 +40b34 c 307 101 +40b40 4 126 103 +40b44 4 321 136 +40b48 4 322 136 +40b4c 4 360 135 +40b50 4 361 135 +40b54 8 362 135 +40b5c 4 364 135 +40b60 4 364 135 +40b64 10 364 135 +40b74 8 306 101 +40b7c c 307 101 +40b88 4 126 103 +40b8c 4 321 136 +40b90 4 322 136 +40b94 4 368 135 +40b98 c 369 135 +40ba4 8 370 135 +40bac 8 306 101 +40bb4 c 307 101 +40bc0 4 126 103 +40bc4 4 321 136 +40bc8 4 322 136 +40bcc 4 374 135 +40bd0 c 375 135 +40bdc 4 376 135 +40be0 8 379 135 +40be8 4 378 135 +40bec 4 379 135 +40bf0 4 380 135 +40bf4 4 382 135 +40bf8 8 380 135 +40c00 4 142 136 +40c04 14 382 135 +FUNC 40c18 118 0 std::priv::_Rb_tree, int, std::priv::_Identity, std::priv::_SetTraitsT, std::allocator >::insert_unique +40c18 8 405 135 +40c20 4 408 135 +40c24 8 405 135 +40c2c 4 406 135 +40c30 4 405 135 +40c34 4 407 135 +40c38 4 409 135 +40c3c 10 412 135 +40c4c c 412 135 +40c58 18 412 135 +40c70 4 415 135 +40c74 c 416 135 +40c80 c 417 135 +40c8c 8 279 135 +40c94 10 279 135 +40ca4 8 280 135 +40cac 8 281 135 +40cb4 10 99 136 +40cc4 4 285 135 +40cc8 c 286 135 +40cd4 c 288 135 +40ce0 4 187 136 +40ce4 10 421 135 +40cf4 10 422 135 +40d04 8 142 136 +40d0c c 62 124 +40d18 4 142 136 +40d1c 4 62 124 +40d20 10 425 135 +FUNC 40d30 3c8 0 ElfCoreDumpTest_DefaultConstructor_Test::TestBody +40d30 c 52 39 +40d3c 4 53 39 +40d40 4 52 39 +40d44 8 53 39 +40d4c 4 52 39 +40d50 4 53 39 +40d54 4 277 82 +40d58 14 54 39 +40d6c 4 1139 87 +40d70 4 277 82 +40d74 4 54 39 +40d78 20 54 39 +40d98 4 54 39 +40d9c 4 54 39 +40da0 1c 54 39 +40dbc 8 54 39 +40dc4 c 54 39 +40dd0 8 85 79 +40dd8 8 54 39 +40de0 8 156 132 +40de8 8 256 82 +40df0 8 55 39 +40df8 8 1571 82 +40e00 4 1482 82 +40e04 4 1481 82 +40e08 8 1482 82 +40e10 1c 1487 82 +40e2c 8 55 39 +40e34 c 302 82 +40e40 18 55 39 +40e58 8 55 39 +40e60 c 55 39 +40e6c 8 85 79 +40e74 8 55 39 +40e7c 8 256 82 +40e84 10 56 39 +40e94 20 1552 82 +40eb4 8 56 39 +40ebc c 302 82 +40ec8 18 56 39 +40ee0 8 56 39 +40ee8 c 56 39 +40ef4 8 85 79 +40efc 8 56 39 +40f04 8 256 82 +40f0c c 57 39 +40f18 8 1571 82 +40f20 4 1482 82 +40f24 4 1481 82 +40f28 8 1482 82 +40f30 1c 1487 82 +40f4c 8 57 39 +40f54 c 302 82 +40f60 18 57 39 +40f78 8 57 39 +40f80 c 57 39 +40f8c 8 85 79 +40f94 8 57 39 +40f9c 8 256 82 +40fa4 c 58 39 +40fb0 8 1571 82 +40fb8 4 1482 82 +40fbc 4 1481 82 +40fc0 8 1482 82 +40fc8 1c 1487 82 +40fe4 8 58 39 +40fec 4 302 82 +40ff0 4 58 39 +40ff4 8 302 82 +40ffc 18 58 39 +41014 8 58 39 +4101c c 58 39 +41028 8 85 79 +41030 8 58 39 +41038 8 256 82 +41040 c 59 39 +4104c c 59 39 +41058 4 59 39 +4105c 4 1139 87 +41060 4 277 82 +41064 4 59 39 +41068 20 59 39 +41088 4 59 39 +4108c 4 59 39 +41090 4 59 39 +41094 1c 59 39 +410b0 8 59 39 +410b8 c 59 39 +410c4 8 85 79 +410cc 8 59 39 +410d4 8 156 132 +410dc 8 256 82 +410e4 14 60 39 +FUNC 410f8 1258 0 ElfCoreDumpTest_TestElfHeader_Test::TestBody +410f8 c 62 39 +41104 8 64 39 +4110c 14 62 39 +41120 4 66 39 +41124 c 64 39 +41130 4 69 39 +41134 4 70 39 +41138 c 277 82 +41144 14 64 39 +41158 8 66 39 +41160 20 67 39 +41180 8 69 39 +41188 8 70 39 +41190 10 72 39 +411a0 4 1139 87 +411a4 4 72 39 +411a8 4 277 82 +411ac 4 72 39 +411b0 24 72 39 +411d4 18 72 39 +411ec 8 256 82 +411f4 10 73 39 +41204 4 1139 87 +41208 4 73 39 +4120c 4 277 82 +41210 4 73 39 +41214 24 73 39 +41238 1c 73 39 +41254 8 73 39 +4125c c 73 39 +41268 8 85 79 +41270 8 73 39 +41278 8 156 132 +41280 10 256 82 +41290 c 74 39 +4129c 10 75 39 +412ac 4 1139 87 +412b0 4 277 82 +412b4 4 75 39 +412b8 24 75 39 +412dc 1c 75 39 +412f8 8 75 39 +41300 c 75 39 +4130c 8 85 79 +41314 8 75 39 +4131c 8 156 132 +41324 8 256 82 +4132c 8 76 39 +41334 c 1571 82 +41340 4 1482 82 +41344 4 1481 82 +41348 8 1482 82 +41350 18 1487 82 +41368 8 76 39 +41370 c 302 82 +4137c 18 76 39 +41394 8 76 39 +4139c c 76 39 +413a8 8 85 79 +413b0 8 76 39 +413b8 8 256 82 +413c0 10 77 39 +413d0 20 1552 82 +413f0 8 77 39 +413f8 c 302 82 +41404 18 77 39 +4141c 8 77 39 +41424 c 77 39 +41430 8 85 79 +41438 8 77 39 +41440 8 256 82 +41448 c 78 39 +41454 8 1571 82 +4145c 4 1482 82 +41460 4 1481 82 +41464 8 1482 82 +4146c 1c 1487 82 +41488 8 78 39 +41490 c 302 82 +4149c 18 78 39 +414b4 8 78 39 +414bc c 78 39 +414c8 8 85 79 +414d0 8 78 39 +414d8 8 256 82 +414e0 c 79 39 +414ec 8 1571 82 +414f4 4 1482 82 +414f8 4 1481 82 +414fc 8 1482 82 +41504 1c 1487 82 +41520 8 79 39 +41528 4 302 82 +4152c 4 79 39 +41530 8 302 82 +41538 18 79 39 +41550 8 79 39 +41558 c 79 39 +41564 8 85 79 +4156c 8 79 39 +41574 8 256 82 +4157c 10 80 39 +4158c c 80 39 +41598 4 80 39 +4159c 4 1139 87 +415a0 4 277 82 +415a4 4 80 39 +415a8 20 80 39 +415c8 4 80 39 +415cc 4 80 39 +415d0 4 80 39 +415d4 1c 80 39 +415f0 8 80 39 +415f8 c 80 39 +41604 8 85 79 +4160c 8 80 39 +41614 8 156 132 +4161c c 256 82 +41628 10 82 39 +41638 4 1139 87 +4163c 4 82 39 +41640 4 277 82 +41644 4 82 39 +41648 20 82 39 +41668 4 82 39 +4166c 4 82 39 +41670 18 82 39 +41688 8 256 82 +41690 10 83 39 +416a0 4 1139 87 +416a4 4 83 39 +416a8 4 277 82 +416ac 4 83 39 +416b0 20 83 39 +416d0 4 83 39 +416d4 4 83 39 +416d8 18 83 39 +416f0 8 256 82 +416f8 c 84 39 +41704 10 85 39 +41714 4 1139 87 +41718 4 277 82 +4171c 4 85 39 +41720 20 85 39 +41740 4 85 39 +41744 4 85 39 +41748 4 85 39 +4174c 1c 85 39 +41768 8 85 39 +41770 c 85 39 +4177c 8 85 79 +41784 8 85 39 +4178c 8 156 132 +41794 c 256 82 +417a0 4 87 39 +417a4 4 88 39 +417a8 4 87 39 +417ac c 88 39 +417b8 4 1139 87 +417bc 4 88 39 +417c0 4 277 82 +417c4 4 88 39 +417c8 20 88 39 +417e8 4 88 39 +417ec 4 88 39 +417f0 18 88 39 +41808 8 256 82 +41810 10 89 39 +41820 4 1139 87 +41824 4 89 39 +41828 4 277 82 +4182c 4 89 39 +41830 20 89 39 +41850 4 89 39 +41854 4 89 39 +41858 18 89 39 +41870 8 256 82 +41878 c 90 39 +41884 10 91 39 +41894 4 1139 87 +41898 4 277 82 +4189c 4 91 39 +418a0 20 91 39 +418c0 4 91 39 +418c4 4 91 39 +418c8 4 91 39 +418cc 1c 91 39 +418e8 8 91 39 +418f0 c 91 39 +418fc 8 85 79 +41904 8 91 39 +4190c 8 156 132 +41914 c 256 82 +41920 4 93 39 +41924 4 94 39 +41928 4 93 39 +4192c c 94 39 +41938 4 1139 87 +4193c 4 94 39 +41940 4 277 82 +41944 4 94 39 +41948 20 94 39 +41968 4 94 39 +4196c 4 94 39 +41970 18 94 39 +41988 8 256 82 +41990 10 95 39 +419a0 4 1139 87 +419a4 4 95 39 +419a8 4 277 82 +419ac 4 95 39 +419b0 20 95 39 +419d0 4 95 39 +419d4 4 95 39 +419d8 18 95 39 +419f0 8 256 82 +419f8 c 96 39 +41a04 10 97 39 +41a14 4 1139 87 +41a18 4 277 82 +41a1c 4 97 39 +41a20 20 97 39 +41a40 4 97 39 +41a44 4 97 39 +41a48 4 97 39 +41a4c 1c 97 39 +41a68 8 97 39 +41a70 c 97 39 +41a7c 8 85 79 +41a84 8 97 39 +41a8c 8 156 132 +41a94 c 256 82 +41aa0 4 99 39 +41aa4 4 100 39 +41aa8 4 99 39 +41aac c 100 39 +41ab8 4 1139 87 +41abc 4 100 39 +41ac0 4 277 82 +41ac4 4 100 39 +41ac8 20 100 39 +41ae8 4 100 39 +41aec 4 100 39 +41af0 18 100 39 +41b08 8 256 82 +41b10 10 101 39 +41b20 4 1139 87 +41b24 4 101 39 +41b28 4 277 82 +41b2c 4 101 39 +41b30 20 101 39 +41b50 4 101 39 +41b54 4 101 39 +41b58 18 101 39 +41b70 8 256 82 +41b78 c 102 39 +41b84 10 103 39 +41b94 4 1139 87 +41b98 4 277 82 +41b9c 4 103 39 +41ba0 20 103 39 +41bc0 4 103 39 +41bc4 4 103 39 +41bc8 4 103 39 +41bcc 1c 103 39 +41be8 8 103 39 +41bf0 c 103 39 +41bfc 8 85 79 +41c04 8 103 39 +41c0c 8 156 132 +41c14 c 256 82 +41c20 4 105 39 +41c24 4 106 39 +41c28 4 105 39 +41c2c c 106 39 +41c38 4 1139 87 +41c3c 4 106 39 +41c40 4 277 82 +41c44 4 106 39 +41c48 20 106 39 +41c68 4 106 39 +41c6c 4 106 39 +41c70 18 106 39 +41c88 8 256 82 +41c90 10 107 39 +41ca0 4 1139 87 +41ca4 4 107 39 +41ca8 4 277 82 +41cac 4 107 39 +41cb0 20 107 39 +41cd0 4 107 39 +41cd4 4 107 39 +41cd8 18 107 39 +41cf0 8 256 82 +41cf8 c 108 39 +41d04 10 109 39 +41d14 4 1139 87 +41d18 4 277 82 +41d1c 4 109 39 +41d20 20 109 39 +41d40 4 109 39 +41d44 4 109 39 +41d48 4 109 39 +41d4c 1c 109 39 +41d68 8 109 39 +41d70 c 109 39 +41d7c 8 85 79 +41d84 8 109 39 +41d8c 8 156 132 +41d94 c 256 82 +41da0 4 111 39 +41da4 4 112 39 +41da8 4 111 39 +41dac c 112 39 +41db8 4 1139 87 +41dbc 4 112 39 +41dc0 4 277 82 +41dc4 4 112 39 +41dc8 20 112 39 +41de8 4 112 39 +41dec 4 112 39 +41df0 18 112 39 +41e08 8 256 82 +41e10 10 113 39 +41e20 4 1139 87 +41e24 4 113 39 +41e28 4 277 82 +41e2c 4 113 39 +41e30 20 113 39 +41e50 4 113 39 +41e54 4 113 39 +41e58 18 113 39 +41e70 8 256 82 +41e78 c 114 39 +41e84 10 115 39 +41e94 4 1139 87 +41e98 4 277 82 +41e9c 4 115 39 +41ea0 20 115 39 +41ec0 4 115 39 +41ec4 4 115 39 +41ec8 4 115 39 +41ecc 1c 115 39 +41ee8 8 115 39 +41ef0 c 115 39 +41efc 8 85 79 +41f04 8 115 39 +41f0c 8 156 132 +41f14 4 256 82 +41f18 4 117 39 +41f1c 8 256 82 +41f24 4 117 39 +41f28 10 118 39 +41f38 4 1139 87 +41f3c 4 118 39 +41f40 4 277 82 +41f44 4 118 39 +41f48 20 118 39 +41f68 4 118 39 +41f6c 4 118 39 +41f70 18 118 39 +41f88 4 118 39 +41f8c 4 118 39 +41f90 8 118 39 +41f98 c 118 39 +41fa4 8 85 79 +41fac 8 118 39 +41fb4 8 156 132 +41fbc 8 256 82 +41fc4 10 119 39 +41fd4 4 1139 87 +41fd8 4 119 39 +41fdc 4 277 82 +41fe0 4 119 39 +41fe4 24 119 39 +42008 4 119 39 +4200c 4 119 39 +42010 4 119 39 +42014 1c 119 39 +42030 8 119 39 +42038 c 119 39 +42044 8 85 79 +4204c 8 119 39 +42054 8 156 132 +4205c c 256 82 +42068 4 120 39 +4206c 4 256 82 +42070 c 120 39 +4207c 10 121 39 +4208c 4 1139 87 +42090 4 277 82 +42094 4 121 39 +42098 24 121 39 +420bc 4 121 39 +420c0 4 121 39 +420c4 4 121 39 +420c8 1c 121 39 +420e4 8 121 39 +420ec c 121 39 +420f8 8 85 79 +42100 8 121 39 +42108 8 156 132 +42110 10 256 82 +42120 4 123 39 +42124 4 124 39 +42128 4 123 39 +4212c c 124 39 +42138 4 1139 87 +4213c 4 124 39 +42140 4 277 82 +42144 4 124 39 +42148 24 124 39 +4216c 4 124 39 +42170 4 124 39 +42174 18 124 39 +4218c 4 256 82 +42190 4 125 39 +42194 4 256 82 +42198 10 125 39 +421a8 4 1139 87 +421ac 4 125 39 +421b0 4 277 82 +421b4 4 125 39 +421b8 24 125 39 +421dc 4 125 39 +421e0 4 125 39 +421e4 18 125 39 +421fc 4 125 39 +42200 4 125 39 +42204 8 125 39 +4220c c 125 39 +42218 8 85 79 +42220 8 125 39 +42228 8 156 132 +42230 10 256 82 +42240 8 156 132 +42248 c 61 63 +42254 8 156 132 +4225c 8 256 82 +42264 c 126 39 +42270 8 127 39 +42278 4 1139 87 +4227c 4 127 39 +42280 4 277 82 +42284 4 127 39 +42288 24 127 39 +422ac 4 127 39 +422b0 4 127 39 +422b4 4 127 39 +422b8 1c 127 39 +422d4 8 127 39 +422dc c 127 39 +422e8 8 85 79 +422f0 8 127 39 +422f8 8 156 132 +42300 4 256 82 +42304 4 61 63 +42308 4 256 82 +4230c 8 69 39 +42314 8 156 132 +4231c c 61 63 +42328 8 156 132 +42330 20 128 39 +FUNC 42350 b1c 0 ElfCoreDumpTest_ValidCoreFile_Test::TestBody +42350 14 130 39 +42364 4 131 39 +42368 4 130 39 +4236c 4 131 39 +42370 18 130 39 +42388 4 131 39 +4238c 10 132 39 +4239c 18 134 39 +423b4 4 135 39 +423b8 8 138 39 +423c0 4 140 39 +423c4 4 141 39 +423c8 4 138 39 +423cc 4 140 39 +423d0 4 141 39 +423d4 4 138 39 +423d8 4 140 39 +423dc 4 141 39 +423e0 4 140 39 +423e4 10 277 82 +423f4 4 141 39 +423f8 4 1139 87 +423fc 4 141 39 +42400 4 277 82 +42404 8 141 39 +4240c 20 141 39 +4242c 4 141 39 +42430 4 141 39 +42434 1c 141 39 +42450 8 141 39 +42458 c 141 39 +42464 8 85 79 +4246c 8 141 39 +42474 8 156 132 +4247c 10 256 82 +4248c 4 145 39 +42490 4 256 82 +42494 c 143 39 +424a0 4 481 101 +424a4 8 143 39 +424ac 4 263 136 +424b0 4 143 39 +424b4 4 266 136 +424b8 4 267 136 +424bc 4 391 136 +424c0 8 146 39 +424c8 4 145 39 +424cc 8 146 39 +424d4 10 229 142 +424e4 8 145 39 +424ec c 151 39 +424f8 10 151 39 +42508 8 156 132 +42510 4 151 39 +42514 18 153 39 +4252c 4 154 39 +42530 4 158 39 +42534 4 277 82 +42538 8 159 39 +42540 8 158 39 +42548 c 159 39 +42554 10 159 39 +42564 4 1139 87 +42568 4 277 82 +4256c 8 156 132 +42574 8 159 39 +4257c 20 159 39 +4259c 4 159 39 +425a0 4 159 39 +425a4 1c 159 39 +425c0 8 159 39 +425c8 c 159 39 +425d4 8 85 79 +425dc 8 159 39 +425e4 8 156 132 +425ec 10 256 82 +425fc 4 162 39 +42600 4 256 82 +42604 8 162 39 +4260c c 163 39 +42618 8 164 39 +42620 4 1139 87 +42624 4 164 39 +42628 4 277 82 +4262c 4 164 39 +42630 20 164 39 +42650 4 164 39 +42654 4 164 39 +42658 1c 164 39 +42674 8 164 39 +4267c c 164 39 +42688 8 85 79 +42690 8 164 39 +42698 8 156 132 +426a0 4 256 82 +426a4 4 188 39 +426a8 4 201 39 +426ac 4 256 82 +426b0 4 481 101 +426b4 4 187 39 +426b8 4 263 136 +426bc 4 266 136 +426c0 4 187 39 +426c4 4 267 136 +426c8 4 197 39 +426cc 4 187 39 +426d0 4 188 39 +426d4 4 277 82 +426d8 4 391 136 +426dc 8 197 39 +426e4 c 201 39 +426f0 8 256 82 +426f8 10 198 39 +42708 c 199 39 +42714 8 200 39 +4271c 4 1139 87 +42720 4 201 39 +42724 8 200 39 +4272c 4 201 39 +42730 4 277 82 +42734 4 201 39 +42738 1c 201 39 +42754 4 201 39 +42758 4 201 39 +4275c 1c 201 39 +42778 8 201 39 +42780 c 201 39 +4278c 8 85 79 +42794 8 201 39 +4279c 8 156 132 +427a4 8 256 82 +427ac 4 1139 87 +427b0 8 202 39 +427b8 4 277 82 +427bc 4 202 39 +427c0 20 202 39 +427e0 4 202 39 +427e4 4 202 39 +427e8 1c 202 39 +42804 8 202 39 +4280c c 202 39 +42818 8 85 79 +42820 8 202 39 +42828 8 156 132 +42830 8 256 82 +42838 1c 204 39 +42854 4 206 39 +42858 8 1139 87 +42860 8 206 39 +42868 4 277 82 +4286c 4 206 39 +42870 24 206 39 +42894 1c 206 39 +428b0 8 206 39 +428b8 c 206 39 +428c4 8 85 79 +428cc 8 206 39 +428d4 8 156 132 +428dc 8 256 82 +428e4 8 207 39 +428ec 4 1512 82 +428f0 4 207 39 +428f4 1c 1512 82 +42910 8 207 39 +42918 c 302 82 +42924 18 207 39 +4293c 8 207 39 +42944 c 207 39 +42950 8 85 79 +42958 8 207 39 +42960 8 256 82 +42968 14 208 39 +4297c 4 209 39 +42980 4 212 39 +42984 8 1139 87 +4298c 8 212 39 +42994 4 277 82 +42998 4 212 39 +4299c 28 212 39 +429c4 20 212 39 +429e4 8 212 39 +429ec c 212 39 +429f8 8 85 79 +42a00 8 212 39 +42a08 8 156 132 +42a10 8 256 82 +42a18 8 213 39 +42a20 4 1512 82 +42a24 4 213 39 +42a28 1c 1512 82 +42a44 8 213 39 +42a4c c 302 82 +42a58 18 213 39 +42a70 8 213 39 +42a78 c 213 39 +42a84 8 85 79 +42a8c 8 213 39 +42a94 8 256 82 +42a9c 8 91 55 +42aa4 4 229 142 +42aa8 4 91 55 +42aac 4 229 142 +42ab0 4 215 39 +42ab4 c 229 142 +42ac0 c 216 39 +42acc 1c 1512 82 +42ae8 8 217 39 +42af0 c 302 82 +42afc 18 217 39 +42b14 8 217 39 +42b1c c 217 39 +42b28 8 85 79 +42b30 8 217 39 +42b38 8 256 82 +42b40 20 1512 82 +42b60 8 218 39 +42b68 c 302 82 +42b74 18 218 39 +42b8c 8 218 39 +42b94 c 218 39 +42ba0 8 85 79 +42ba8 8 218 39 +42bb0 8 256 82 +42bb8 c 220 39 +42bc4 10 244 39 +42bd4 18 10 125 +42bec 8 555 100 +42bf4 10 556 100 +42c04 8 297 135 +42c0c 10 94 136 +42c1c 4 301 135 +42c20 c 302 135 +42c2c c 304 135 +42c38 c 309 135 +42c44 8 297 135 +42c4c 10 94 136 +42c5c 4 301 135 +42c60 c 302 135 +42c6c c 304 135 +42c78 c 309 135 +42c84 8 177 136 +42c8c 4 10 125 +42c90 8 277 82 +42c98 4 1139 87 +42c9c 4 247 39 +42ca0 20 247 39 +42cc0 4 247 39 +42cc4 4 247 39 +42cc8 4 247 39 +42ccc 1c 247 39 +42ce8 8 247 39 +42cf0 c 247 39 +42cfc 8 85 79 +42d04 8 247 39 +42d0c 8 156 132 +42d14 4 256 82 +42d18 4 248 39 +42d1c 4 256 82 +42d20 4 248 39 +42d24 20 1512 82 +42d44 8 248 39 +42d4c 4 302 82 +42d50 4 248 39 +42d54 8 302 82 +42d5c 18 248 39 +42d74 8 248 39 +42d7c c 248 39 +42d88 8 85 79 +42d90 8 248 39 +42d98 8 256 82 +42da0 20 1512 82 +42dc0 8 249 39 +42dc8 4 302 82 +42dcc 4 249 39 +42dd0 8 302 82 +42dd8 18 249 39 +42df0 8 249 39 +42df8 c 249 39 +42e04 8 85 79 +42e0c 8 249 39 +42e14 8 256 82 +42e1c 8 414 136 +42e24 8 158 39 +42e2c 8 414 136 +42e34 8 135 39 +42e3c 30 256 39 +FUNC 42e6c 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e6c 4 484 85 +FUNC 42e70 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e70 4 484 85 +FUNC 42e74 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e74 4 484 85 +FUNC 42e78 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e78 4 484 85 +FUNC 42e7c 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e7c 4 484 85 +FUNC 42e80 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e80 4 484 85 +FUNC 42e84 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e84 4 484 85 +FUNC 42e88 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e88 4 484 85 +FUNC 42e8c 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e8c 4 484 85 +FUNC 42e90 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e90 4 484 85 +FUNC 42e94 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e94 4 484 85 +FUNC 42e98 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e98 4 484 85 +FUNC 42e9c 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42e9c 4 484 85 +FUNC 42ea0 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42ea0 4 484 85 +FUNC 42ea4 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42ea4 4 484 85 +FUNC 42ea8 4 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +42ea8 4 484 85 +FUNC 42eac 48 0 testing::internal::TestFactoryImpl >::CreateTest +42eac 10 486 85 +42ebc 8 486 85 +42ec4 4 107 43 +42ec8 4 127 43 +42ecc 8 67 139 +42ed4 4 481 101 +42ed8 c 127 43 +42ee4 10 486 85 +FUNC 42ef4 48 0 testing::internal::TestFactoryImpl >::CreateTest +42ef4 10 486 85 +42f04 8 486 85 +42f0c 4 107 43 +42f10 4 183 43 +42f14 8 67 139 +42f1c 4 481 101 +42f20 c 183 43 +42f2c 10 486 85 +FUNC 42f3c 48 0 testing::internal::TestFactoryImpl >::CreateTest +42f3c 10 486 85 +42f4c 8 486 85 +42f54 4 107 43 +42f58 4 151 43 +42f5c 8 67 139 +42f64 4 481 101 +42f68 c 151 43 +42f74 10 486 85 +FUNC 42f84 48 0 testing::internal::TestFactoryImpl >::CreateTest +42f84 10 486 85 +42f94 8 486 85 +42f9c 4 107 43 +42fa0 4 220 43 +42fa4 8 67 139 +42fac 4 481 101 +42fb0 c 220 43 +42fbc 10 486 85 +FUNC 42fcc 48 0 testing::internal::TestFactoryImpl >::CreateTest +42fcc 10 486 85 +42fdc 8 486 85 +42fe4 4 107 43 +42fe8 4 127 43 +42fec 8 67 139 +42ff4 4 481 101 +42ff8 c 127 43 +43004 10 486 85 +FUNC 43014 48 0 testing::internal::TestFactoryImpl >::CreateTest +43014 10 486 85 +43024 8 486 85 +4302c 4 107 43 +43030 4 220 43 +43034 8 67 139 +4303c 4 481 101 +43040 c 220 43 +4304c 10 486 85 +FUNC 4305c 48 0 testing::internal::TestFactoryImpl >::CreateTest +4305c 10 486 85 +4306c 8 486 85 +43074 4 107 43 +43078 4 151 43 +4307c 8 67 139 +43084 4 481 101 +43088 c 151 43 +43094 10 486 85 +FUNC 430a4 48 0 testing::internal::TestFactoryImpl >::CreateTest +430a4 10 486 85 +430b4 8 486 85 +430bc 4 107 43 +430c0 4 183 43 +430c4 8 67 139 +430cc 4 481 101 +430d0 c 183 43 +430dc 10 486 85 +FUNC 430ec 38 0 std::priv::__copy_trivial +430ec 14 222 100 +43100 8 224 100 +43108 c 224 100 +43114 4 224 100 +43118 c 225 100 +FUNC 43124 10 0 std::__node_alloc::deallocate +43124 8 161 101 +4312c 4 135 119 +43130 4 161 101 +FUNC 43134 1b0 0 std::priv::_Impl_vector >::_M_range_insert +43134 4 532 139 +43138 4 546 139 +4313c 14 532 139 +43150 4 546 139 +43154 c 549 139 +43160 c 355 114 +4316c 10 549 139 +4317c 4 476 139 +43180 8 478 139 +43188 4 479 139 +4318c 10 120 137 +4319c 8 480 139 +431a4 4 255 100 +431a8 4 480 139 +431ac 8 256 100 +431b4 c 256 100 +431c0 c 269 100 +431cc 4 510 114 +431d0 c 120 137 +431dc 4 492 139 +431e0 4 120 137 +431e4 4 492 139 +431e8 8 120 137 +431f0 8 492 139 +431f8 4 120 137 +431fc 4 494 139 +43200 4 269 100 +43204 4 494 139 +43208 4 269 100 +4320c 4 494 139 +43210 c 269 100 +4321c 8 192 139 +43224 c 173 139 +43230 14 41 138 +43244 4 175 139 +43248 8 176 139 +43250 4 356 101 +43254 8 346 101 +4325c 4 177 139 +43260 8 347 101 +43268 4 348 101 +4326c 4 352 101 +43270 4 353 101 +43274 38 120 137 +432ac 8 662 139 +432b4 4 319 101 +432b8 4 323 101 +432bc 4 443 139 +432c0 4 666 139 +432c4 4 667 139 +432c8 4 668 139 +432cc 18 556 139 +FUNC 432e4 70 0 google_breakpad::test_assembler::Section::~Section +432e4 18 277 62 +432fc 18 277 62 +43314 8 191 103 +4331c 10 449 62 +4332c 8 87 139 +43334 4 88 139 +43338 8 323 101 +43340 4 156 132 +43344 c 277 62 +43350 4 156 132 +FUNC 43354 24 0 google_breakpad::test_assembler::Section::~Section +43354 c 277 62 +43360 8 277 62 +43368 4 277 62 +4336c 8 277 62 +43374 4 277 62 +FUNC 43378 14 0 google_breakpad::synth_elf::Notes::~Notes +43378 14 181 51 +FUNC 4338c 24 0 google_breakpad::synth_elf::Notes::~Notes +4338c c 181 51 +43398 8 181 51 +433a0 4 181 51 +433a4 8 181 51 +433ac 4 181 51 +FUNC 433b0 68 0 PopulateSection +433b0 10 62 43 +433c0 8 62 43 +433c8 4 63 43 +433cc 4 303 62 +433d0 8 63 43 +433d8 1c 64 43 +433f4 8 303 62 +433fc 4 63 43 +43400 8 303 62 +43408 10 65 43 +FUNC 43418 50 0 google_breakpad::test_assembler::Section::Section +43418 c 272 62 +43424 4 272 62 +43428 c 273 62 +43434 4 273 62 +43438 8 273 62 +43440 8 273 62 +43448 4 67 139 +4344c 4 273 62 +43450 4 67 139 +43454 4 481 101 +43458 4 273 62 +4345c c 273 62 +FUNC 43468 80 0 testing::internal::GetPrefixUntilComma +43468 4 585 85 +4346c 4 586 85 +43470 c 585 85 +4347c 8 585 85 +43484 8 586 85 +4348c 4 587 85 +43490 14 587 85 +434a4 4 355 114 +434a8 4 112 132 +434ac 8 324 131 +434b4 4 481 101 +434b8 4 324 131 +434bc 10 148 137 +434cc 4 325 131 +434d0 4 101 103 +434d4 14 588 85 +FUNC 434e8 88 0 testing::internal::StripTrailingSpaces +434e8 10 2214 87 +434f8 c 2214 87 +43504 c 2216 87 +43510 4 2194 87 +43514 4 2216 87 +43518 8 2194 87 +43520 8 2216 87 +43528 4 797 131 +4352c 8 168 140 +43534 8 168 140 +4353c 14 798 131 +43550 c 2218 87 +4355c 14 2219 87 +FUNC 43570 88 0 std::operator+, std::allocator > +43570 10 29 134 +43580 c 29 134 +4358c 18 400 131 +435a4 4 120 132 +435a8 4 400 131 +435ac 4 481 101 +435b0 10 124 132 +435c0 4 101 103 +435c4 20 517 131 +435e4 14 42 134 +FUNC 435f8 64 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, google_breakpad::test_assembler::Label>, std::priv::_Select1st, std::allocator >, google_breakpad::test_assembler::Label> >, std::priv::_MapTraitsT, std::allocator >, google_breakpad::test_assembler::Label> >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::_M_erase +435f8 18 655 135 +43610 4 657 135 +43614 8 658 135 +4361c 4 51 124 +43620 4 658 135 +43624 4 659 135 +43628 8 51 124 +43630 8 156 132 +43638 14 161 101 +4364c 10 664 135 +FUNC 4365c 48 0 google_breakpad::synth_elf::StringTable::~StringTable +4365c 14 64 51 +43670 c 64 51 +4367c 8 531 136 +43684 8 532 136 +4368c 8 64 51 +43694 4 64 51 +43698 8 64 51 +436a0 4 64 51 +FUNC 436a4 24 0 google_breakpad::synth_elf::StringTable::~StringTable +436a4 c 64 51 +436b0 8 64 51 +436b8 4 64 51 +436bc 8 64 51 +436c4 4 64 51 +FUNC 436c8 b8 0 google_breakpad::synth_elf::ELF::~ELF +436c8 18 94 51 +436e0 14 94 51 +436f4 8 191 103 +436fc 4 57 103 +43700 4 77 113 +43704 14 57 103 +43718 8 87 139 +43720 4 88 139 +43724 8 323 101 +4372c 8 94 51 +43734 8 94 51 +4373c 8 94 51 +43744 8 94 51 +4374c 8 94 51 +43754 8 94 51 +4375c 8 94 51 +43764 8 94 51 +4376c 4 94 51 +43770 4 94 51 +43774 8 94 51 +4377c 4 94 51 +FUNC 43780 24 0 google_breakpad::synth_elf::ELF::~ELF +43780 c 94 51 +4378c 8 94 51 +43794 4 94 51 +43798 8 94 51 +437a0 4 94 51 +FUNC 437a4 128 0 testing::internal::StreamableToString +437a4 c 243 79 +437b0 4 244 79 +437b4 c 243 79 +437c0 4 244 79 +437c4 4 243 79 +437c8 4 244 79 +437cc 8 1142 87 +437d4 4 131 79 +437d8 4 238 121 +437dc c 239 121 +437e8 c 181 122 +437f4 8 239 121 +437fc 8 239 121 +43804 c 181 122 +43810 4 199 121 +43814 18 211 121 +4382c 4 202 121 +43830 4 145 110 +43834 4 202 121 +43838 4 145 110 +4383c 4 202 121 +43840 8 145 110 +43848 c 351 117 +43854 8 351 117 +4385c 4 67 120 +43860 4 202 121 +43864 8 67 120 +4386c c 202 121 +43878 4 67 120 +4387c 4 57 123 +43880 c 67 120 +4388c 8 202 121 +43894 4 210 121 +43898 8 212 121 +438a0 c 244 79 +438ac 8 85 79 +438b4 18 245 79 +FUNC 438cc 1c0 0 testing::internal::TypeParameterizedTest, testing::internal::Types1 >::Register +438cc 1c 604 85 +438e8 4 621 85 +438ec c 604 85 +438f8 4 621 85 +438fc 8 604 85 +43904 c 621 85 +43910 4 604 85 +43914 4 621 85 +43918 4 621 85 +4391c 4 621 85 +43920 4 621 85 +43924 8 621 85 +4392c c 621 85 +43938 4 621 85 +4393c 4 621 85 +43940 4 85 88 +43944 4 621 85 +43948 c 621 85 +43954 4 621 85 +43958 4 621 85 +4395c c 621 85 +43968 4 621 85 +4396c 4 621 85 +43970 8 621 85 +43978 4 621 85 +4397c 4 621 85 +43980 14 621 85 +43994 c 621 85 +439a0 4 621 85 +439a4 4 621 85 +439a8 10 621 85 +439b8 18 85 88 +439d0 10 621 85 +439e0 4 484 85 +439e4 14 612 85 +439f8 4 484 85 +439fc 8 612 85 +43a04 8 484 85 +43a0c 14 612 85 +43a20 48 156 132 +43a68 24 626 85 +FUNC 43a8c 1f4 0 testing::internal::TypeParameterizedTest, testing::internal::Types2 >::Register +43a8c 1c 604 85 +43aa8 4 621 85 +43aac 8 604 85 +43ab4 4 621 85 +43ab8 8 604 85 +43ac0 8 621 85 +43ac8 8 604 85 +43ad0 8 621 85 +43ad8 4 621 85 +43adc 4 621 85 +43ae0 4 621 85 +43ae4 8 621 85 +43aec c 621 85 +43af8 4 621 85 +43afc 4 621 85 +43b00 4 621 85 +43b04 4 621 85 +43b08 10 621 85 +43b18 c 621 85 +43b24 4 621 85 +43b28 4 621 85 +43b2c c 621 85 +43b38 1c 621 85 +43b54 10 621 85 +43b64 14 621 85 +43b78 28 85 88 +43ba0 10 621 85 +43bb0 4 484 85 +43bb4 14 612 85 +43bc8 4 484 85 +43bcc 8 612 85 +43bd4 8 484 85 +43bdc 18 612 85 +43bf4 54 156 132 +43c48 18 625 85 +43c60 20 626 85 +FUNC 43c80 1c0 0 testing::internal::TypeParameterizedTest, testing::internal::Types1 >::Register +43c80 1c 604 85 +43c9c 4 621 85 +43ca0 c 604 85 +43cac 4 621 85 +43cb0 8 604 85 +43cb8 c 621 85 +43cc4 4 604 85 +43cc8 4 621 85 +43ccc 4 621 85 +43cd0 4 621 85 +43cd4 4 621 85 +43cd8 8 621 85 +43ce0 c 621 85 +43cec 4 621 85 +43cf0 4 621 85 +43cf4 4 85 88 +43cf8 4 621 85 +43cfc c 621 85 +43d08 4 621 85 +43d0c 4 621 85 +43d10 c 621 85 +43d1c 4 621 85 +43d20 4 621 85 +43d24 8 621 85 +43d2c 4 621 85 +43d30 4 621 85 +43d34 14 621 85 +43d48 c 621 85 +43d54 4 621 85 +43d58 4 621 85 +43d5c 10 621 85 +43d6c 18 85 88 +43d84 10 621 85 +43d94 4 484 85 +43d98 14 612 85 +43dac 4 484 85 +43db0 8 612 85 +43db8 8 484 85 +43dc0 14 612 85 +43dd4 48 156 132 +43e1c 24 626 85 +FUNC 43e40 1f4 0 testing::internal::TypeParameterizedTest, testing::internal::Types2 >::Register +43e40 1c 604 85 +43e5c 4 621 85 +43e60 8 604 85 +43e68 4 621 85 +43e6c 8 604 85 +43e74 8 621 85 +43e7c 8 604 85 +43e84 8 621 85 +43e8c 4 621 85 +43e90 4 621 85 +43e94 4 621 85 +43e98 8 621 85 +43ea0 c 621 85 +43eac 4 621 85 +43eb0 4 621 85 +43eb4 4 621 85 +43eb8 4 621 85 +43ebc 10 621 85 +43ecc c 621 85 +43ed8 4 621 85 +43edc 4 621 85 +43ee0 c 621 85 +43eec 1c 621 85 +43f08 10 621 85 +43f18 14 621 85 +43f2c 28 85 88 +43f54 10 621 85 +43f64 4 484 85 +43f68 14 612 85 +43f7c 4 484 85 +43f80 8 612 85 +43f88 8 484 85 +43f90 18 612 85 +43fa8 54 156 132 +43ffc 18 625 85 +44014 20 626 85 +FUNC 44034 1c0 0 testing::internal::TypeParameterizedTest, testing::internal::Types1 >::Register +44034 1c 604 85 +44050 4 621 85 +44054 c 604 85 +44060 4 621 85 +44064 8 604 85 +4406c c 621 85 +44078 4 604 85 +4407c 4 621 85 +44080 4 621 85 +44084 4 621 85 +44088 4 621 85 +4408c 8 621 85 +44094 c 621 85 +440a0 4 621 85 +440a4 4 621 85 +440a8 4 85 88 +440ac 4 621 85 +440b0 c 621 85 +440bc 4 621 85 +440c0 4 621 85 +440c4 c 621 85 +440d0 4 621 85 +440d4 4 621 85 +440d8 8 621 85 +440e0 4 621 85 +440e4 4 621 85 +440e8 14 621 85 +440fc c 621 85 +44108 4 621 85 +4410c 4 621 85 +44110 10 621 85 +44120 18 85 88 +44138 10 621 85 +44148 4 484 85 +4414c 14 612 85 +44160 4 484 85 +44164 8 612 85 +4416c 8 484 85 +44174 14 612 85 +44188 48 156 132 +441d0 24 626 85 +FUNC 441f4 1f4 0 testing::internal::TypeParameterizedTest, testing::internal::Types2 >::Register +441f4 1c 604 85 +44210 4 621 85 +44214 8 604 85 +4421c 4 621 85 +44220 8 604 85 +44228 8 621 85 +44230 8 604 85 +44238 8 621 85 +44240 4 621 85 +44244 4 621 85 +44248 4 621 85 +4424c 8 621 85 +44254 c 621 85 +44260 4 621 85 +44264 4 621 85 +44268 4 621 85 +4426c 4 621 85 +44270 10 621 85 +44280 c 621 85 +4428c 4 621 85 +44290 4 621 85 +44294 c 621 85 +442a0 1c 621 85 +442bc 10 621 85 +442cc 14 621 85 +442e0 28 85 88 +44308 10 621 85 +44318 4 484 85 +4431c 14 612 85 +44330 4 484 85 +44334 8 612 85 +4433c 8 484 85 +44344 18 612 85 +4435c 54 156 132 +443b0 18 625 85 +443c8 20 626 85 +FUNC 443e8 1c0 0 testing::internal::TypeParameterizedTest, testing::internal::Types1 >::Register +443e8 1c 604 85 +44404 4 621 85 +44408 c 604 85 +44414 4 621 85 +44418 8 604 85 +44420 c 621 85 +4442c 4 604 85 +44430 4 621 85 +44434 4 621 85 +44438 4 621 85 +4443c 4 621 85 +44440 8 621 85 +44448 c 621 85 +44454 4 621 85 +44458 4 621 85 +4445c 4 85 88 +44460 4 621 85 +44464 c 621 85 +44470 4 621 85 +44474 4 621 85 +44478 c 621 85 +44484 4 621 85 +44488 4 621 85 +4448c 8 621 85 +44494 4 621 85 +44498 4 621 85 +4449c 14 621 85 +444b0 c 621 85 +444bc 4 621 85 +444c0 4 621 85 +444c4 10 621 85 +444d4 18 85 88 +444ec 10 621 85 +444fc 4 484 85 +44500 14 612 85 +44514 4 484 85 +44518 8 612 85 +44520 8 484 85 +44528 14 612 85 +4453c 48 156 132 +44584 24 626 85 +FUNC 445a8 1f4 0 testing::internal::TypeParameterizedTest, testing::internal::Types2 >::Register +445a8 1c 604 85 +445c4 4 621 85 +445c8 8 604 85 +445d0 4 621 85 +445d4 8 604 85 +445dc 8 621 85 +445e4 8 604 85 +445ec 8 621 85 +445f4 4 621 85 +445f8 4 621 85 +445fc 4 621 85 +44600 8 621 85 +44608 c 621 85 +44614 4 621 85 +44618 4 621 85 +4461c 4 621 85 +44620 4 621 85 +44624 10 621 85 +44634 c 621 85 +44640 4 621 85 +44644 4 621 85 +44648 c 621 85 +44654 1c 621 85 +44670 10 621 85 +44680 14 621 85 +44694 28 85 88 +446bc 10 621 85 +446cc 4 484 85 +446d0 14 612 85 +446e4 4 484 85 +446e8 8 612 85 +446f0 8 484 85 +446f8 18 612 85 +44710 54 156 132 +44764 18 625 85 +4477c 20 626 85 +FUNC 4479c 48 0 FileIDTest::~FileIDTest +4479c 18 107 43 +447b4 c 107 43 +447c0 8 87 139 +447c8 4 88 139 +447cc 8 323 101 +447d4 4 107 43 +447d8 8 107 43 +447e0 4 107 43 +FUNC 447e4 14 0 FileIDTest_ElfClass_Test::~FileIDTest_ElfClass_Test +447e4 14 127 43 +FUNC 447f8 24 0 FileIDTest_ElfClass_Test::~FileIDTest_ElfClass_Test +447f8 c 127 43 +44804 8 127 43 +4480c 4 127 43 +44810 8 127 43 +44818 4 127 43 +FUNC 4481c 14 0 FileIDTest_BuildID_Test::~FileIDTest_BuildID_Test +4481c 14 151 43 +FUNC 44830 24 0 FileIDTest_BuildID_Test::~FileIDTest_BuildID_Test +44830 c 151 43 +4483c 8 151 43 +44844 4 151 43 +44848 8 151 43 +44850 4 151 43 +FUNC 44854 14 0 FileIDTest_BuildIDPH_Test::~FileIDTest_BuildIDPH_Test +44854 14 183 43 +FUNC 44868 24 0 FileIDTest_BuildIDPH_Test::~FileIDTest_BuildIDPH_Test +44868 c 183 43 +44874 8 183 43 +4487c 4 183 43 +44880 8 183 43 +44888 4 183 43 +FUNC 4488c 14 0 FileIDTest_UniqueHashes_Test::~FileIDTest_UniqueHashes_Test +4488c 14 220 43 +FUNC 448a0 24 0 FileIDTest_UniqueHashes_Test::~FileIDTest_UniqueHashes_Test +448a0 c 220 43 +448ac 8 220 43 +448b4 4 220 43 +448b8 8 220 43 +448c0 4 220 43 +FUNC 448c4 24 0 FileIDTest::~FileIDTest +448c4 c 107 43 +448d0 8 107 43 +448d8 4 107 43 +448dc 8 107 43 +448e4 4 107 43 +FUNC 448e8 48 0 FileIDTest::~FileIDTest +448e8 18 107 43 +44900 c 107 43 +4490c 8 87 139 +44914 4 88 139 +44918 8 323 101 +44920 4 107 43 +44924 8 107 43 +4492c 4 107 43 +FUNC 44930 14 0 FileIDTest_ElfClass_Test::~FileIDTest_ElfClass_Test +44930 14 127 43 +FUNC 44944 24 0 FileIDTest_ElfClass_Test::~FileIDTest_ElfClass_Test +44944 c 127 43 +44950 8 127 43 +44958 4 127 43 +4495c 8 127 43 +44964 4 127 43 +FUNC 44968 14 0 FileIDTest_BuildID_Test::~FileIDTest_BuildID_Test +44968 14 151 43 +FUNC 4497c 24 0 FileIDTest_BuildID_Test::~FileIDTest_BuildID_Test +4497c c 151 43 +44988 8 151 43 +44990 4 151 43 +44994 8 151 43 +4499c 4 151 43 +FUNC 449a0 14 0 FileIDTest_BuildIDPH_Test::~FileIDTest_BuildIDPH_Test +449a0 14 183 43 +FUNC 449b4 24 0 FileIDTest_BuildIDPH_Test::~FileIDTest_BuildIDPH_Test +449b4 c 183 43 +449c0 8 183 43 +449c8 4 183 43 +449cc 8 183 43 +449d4 4 183 43 +FUNC 449d8 14 0 FileIDTest_UniqueHashes_Test::~FileIDTest_UniqueHashes_Test +449d8 14 220 43 +FUNC 449ec 24 0 FileIDTest_UniqueHashes_Test::~FileIDTest_UniqueHashes_Test +449ec c 220 43 +449f8 8 220 43 +44a00 4 220 43 +44a04 8 220 43 +44a0c 4 220 43 +FUNC 44a10 24 0 FileIDTest::~FileIDTest +44a10 c 107 43 +44a1c 8 107 43 +44a24 4 107 43 +44a28 8 107 43 +44a30 4 107 43 +FUNC 44a34 27c 0 testing::internal::CmpHelperOpFailure +44a34 10 1579 82 +44a44 4 1583 82 +44a48 c 1579 82 +44a54 4 1583 82 +44a58 18 1579 82 +44a70 4 1579 82 +44a74 4 306 82 +44a78 4 1579 82 +44a7c 4 1583 82 +44a80 4 306 82 +44a84 4 1579 82 +44a88 4 75 127 +44a8c 4 306 82 +44a90 4 131 79 +44a94 10 333 122 +44aa4 c 306 82 +44ab0 8 85 79 +44ab8 10 1583 82 +44ac8 8 306 82 +44ad0 4 131 79 +44ad4 10 333 122 +44ae4 c 306 82 +44af0 8 85 79 +44af8 8 1583 82 +44b00 4 254 121 +44b04 8 1583 82 +44b0c 8 306 82 +44b14 4 131 79 +44b18 10 333 122 +44b28 c 306 82 +44b34 8 85 79 +44b3c 8 1583 82 +44b44 4 75 127 +44b48 8 1583 82 +44b50 8 306 82 +44b58 4 131 79 +44b5c 10 333 122 +44b6c c 306 82 +44b78 8 85 79 +44b80 c 884 80 +44b8c 10 254 121 +44b9c c 75 127 +44ba8 8 886 80 +44bb0 8 306 82 +44bb8 4 131 79 +44bbc c 131 79 +44bc8 c 306 82 +44bd4 8 85 79 +44bdc 8 306 82 +44be4 4 131 79 +44be8 10 333 122 +44bf8 c 306 82 +44c04 8 85 79 +44c0c c 884 80 +44c18 8 263 121 +44c20 4 75 127 +44c24 8 263 121 +44c2c c 75 127 +44c38 8 886 80 +44c40 8 306 82 +44c48 4 131 79 +44c4c c 131 79 +44c58 c 306 82 +44c64 8 85 79 +44c6c c 1585 82 +44c78 10 156 132 +44c88 8 256 82 +44c90 20 1586 82 +FUNC 44cb0 1ec 0 FileIDTest::GetElfContents +44cb0 10 109 43 +44cc0 8 110 43 +44cc8 8 109 43 +44cd0 8 110 43 +44cd8 4 109 43 +44cdc 4 110 43 +44ce0 8 111 43 +44ce8 4 277 82 +44cec 4 111 43 +44cf0 4 1139 87 +44cf4 4 111 43 +44cf8 8 277 82 +44d00 4 111 43 +44d04 20 111 43 +44d24 4 111 43 +44d28 4 111 43 +44d2c 4 111 43 +44d30 1c 111 43 +44d4c 8 111 43 +44d54 c 111 43 +44d60 8 85 79 +44d68 8 111 43 +44d70 8 156 132 +44d78 10 256 82 +44d88 4 112 43 +44d8c 4 400 131 +44d90 4 1619 82 +44d94 8 400 131 +44d9c 4 112 43 +44da0 4 1619 82 +44da4 8 1619 82 +44dac 24 1619 82 +44dd0 8 112 43 +44dd8 4 1144 87 +44ddc c 298 82 +44de8 8 298 82 +44df0 14 112 43 +44e04 4 112 43 +44e08 4 112 43 +44e0c 8 112 43 +44e14 c 112 43 +44e20 8 85 79 +44e28 8 112 43 +44e30 10 256 82 +44e40 4 228 143 +44e44 c 256 82 +44e50 8 630 139 +44e58 8 269 100 +44e60 4 615 139 +44e64 14 510 139 +44e78 8 116 43 +44e80 8 156 132 +44e88 14 117 43 +FUNC 44e9c 250 0 FileIDTest_ElfClass_Test::TestBody +44e9c 4 127 43 +44ea0 c 130 43 +44eac c 127 43 +44eb8 4 130 43 +44ebc 10 127 43 +44ecc 4 127 43 +44ed0 4 130 43 +44ed4 4 134 43 +44ed8 8 135 43 +44ee0 4 130 43 +44ee4 4 453 131 +44ee8 14 134 43 +44efc c 135 43 +44f08 14 453 131 +44f1c 8 136 43 +44f24 18 139 43 +44f3c 4 143 43 +44f40 4 139 43 +44f44 28 139 43 +44f6c 8 156 132 +44f74 8 140 43 +44f7c c 141 43 +44f88 c 143 43 +44f94 4 1139 87 +44f98 4 143 43 +44f9c 4 277 82 +44fa0 4 143 43 +44fa4 20 143 43 +44fc4 4 143 43 +44fc8 4 143 43 +44fcc 4 143 43 +44fd0 1c 143 43 +44fec 8 143 43 +44ff4 c 143 43 +45000 8 85 79 +45008 8 143 43 +45010 8 156 132 +45018 8 256 82 +45020 10 146 43 +45030 28 148 43 +45058 4 1144 87 +4505c c 298 82 +45068 8 298 82 +45070 18 148 43 +45088 4 148 43 +4508c 4 148 43 +45090 8 148 43 +45098 c 148 43 +450a4 8 85 79 +450ac 8 148 43 +450b4 8 256 82 +450bc 8 135 43 +450c4 8 148 43 +450cc 20 149 43 +FUNC 450ec 374 0 FileIDTest_BuildID_Test::TestBody +450ec 4 151 43 +450f0 c 156 43 +450fc c 151 43 +45108 4 154 43 +4510c c 151 43 +45118 64 154 43 +4517c 4 156 43 +45180 c 154 43 +4518c 8 151 43 +45194 4 156 43 +45198 4 151 43 +4519c c 154 43 +451a8 4 156 43 +451ac c 157 43 +451b8 4 164 43 +451bc 4 165 43 +451c0 4 167 43 +451c4 4 157 43 +451c8 4 170 43 +451cc 10 164 43 +451dc 4 167 43 +451e0 4 175 43 +451e4 4 164 43 +451e8 c 165 43 +451f4 10 303 62 +45204 14 167 43 +45218 28 167 43 +45240 8 156 132 +45248 10 184 51 +45258 10 170 43 +45268 c 184 51 +45274 4 170 43 +45278 18 169 43 +45290 8 156 132 +45298 14 171 43 +452ac 28 171 43 +452d4 8 156 132 +452dc 8 172 43 +452e4 c 173 43 +452f0 c 175 43 +452fc 4 1139 87 +45300 4 175 43 +45304 4 277 82 +45308 4 175 43 +4530c 20 175 43 +4532c 4 175 43 +45330 4 175 43 +45334 4 175 43 +45338 1c 175 43 +45354 8 175 43 +4535c c 175 43 +45368 8 85 79 +45370 8 175 43 +45378 8 156 132 +45380 8 256 82 +45388 10 178 43 +45398 28 180 43 +453c0 4 1144 87 +453c4 c 298 82 +453d0 8 298 82 +453d8 18 180 43 +453f0 4 180 43 +453f4 4 180 43 +453f8 8 180 43 +45400 c 180 43 +4540c 8 85 79 +45414 8 180 43 +4541c 8 256 82 +45424 8 168 43 +4542c 8 165 43 +45434 8 180 43 +4543c 24 181 43 +FUNC 45460 3cc 0 FileIDTest_BuildIDPH_Test::TestBody +45460 4 183 43 +45464 c 188 43 +45470 c 183 43 +4547c 4 186 43 +45480 c 183 43 +4548c 64 186 43 +454f0 4 188 43 +454f4 c 186 43 +45500 8 183 43 +45508 4 188 43 +4550c 4 183 43 +45510 c 186 43 +4551c 4 188 43 +45520 c 189 43 +4552c 4 196 43 +45530 4 197 43 +45534 4 199 43 +45538 4 189 43 +4553c 4 202 43 +45540 10 196 43 +45550 4 199 43 +45554 4 210 43 +45558 4 196 43 +4555c c 197 43 +45568 10 303 62 +45578 14 199 43 +4558c 28 199 43 +455b4 8 156 132 +455bc 10 184 51 +455cc 10 202 43 +455dc c 184 51 +455e8 4 202 43 +455ec 1c 201 43 +45608 8 156 132 +45610 14 204 43 +45624 18 203 43 +4563c 8 156 132 +45644 14 205 43 +45658 2c 205 43 +45684 4 156 132 +45688 4 205 43 +4568c 4 156 132 +45690 18 206 43 +456a8 8 207 43 +456b0 c 208 43 +456bc c 210 43 +456c8 4 1139 87 +456cc 4 210 43 +456d0 4 277 82 +456d4 4 210 43 +456d8 20 210 43 +456f8 4 210 43 +456fc 4 210 43 +45700 4 210 43 +45704 1c 210 43 +45720 8 210 43 +45728 c 210 43 +45734 8 85 79 +4573c 8 210 43 +45744 8 156 132 +4574c 8 256 82 +45754 10 213 43 +45764 28 215 43 +4578c 4 1144 87 +45790 c 298 82 +4579c 8 298 82 +457a4 18 215 43 +457bc 4 215 43 +457c0 4 215 43 +457c4 8 215 43 +457cc c 215 43 +457d8 8 85 79 +457e0 8 215 43 +457e8 8 256 82 +457f0 8 200 43 +457f8 8 197 43 +45800 8 215 43 +45808 24 216 43 +FUNC 4582c 464 0 FileIDTest_UniqueHashes_Test::TestBody +4582c 4 220 43 +45830 4 222 43 +45834 c 220 43 +45840 4 222 43 +45844 4 232 43 +45848 4 220 43 +4584c 8 222 43 +45854 4 220 43 +45858 4 222 43 +4585c 14 220 43 +45870 4 222 43 +45874 4 224 43 +45878 4 230 43 +4587c 4 232 43 +45880 4 222 43 +45884 4 232 43 +45888 c 224 43 +45894 4 229 43 +45898 8 235 43 +458a0 4 224 43 +458a4 14 229 43 +458b8 c 230 43 +458c4 10 231 43 +458d4 10 232 43 +458e4 28 232 43 +4590c 8 156 132 +45914 c 233 43 +45920 10 234 43 +45930 10 235 43 +45940 28 235 43 +45968 8 156 132 +45970 8 236 43 +45978 c 237 43 +45984 8 233 43 +4598c 8 230 43 +45994 8 237 43 +4599c c 240 43 +459a8 4 1139 87 +459ac 4 240 43 +459b0 c 277 82 +459bc 4 240 43 +459c0 24 240 43 +459e4 1c 240 43 +45a00 8 240 43 +45a08 c 240 43 +45a14 8 85 79 +45a1c 8 240 43 +45a24 8 156 132 +45a2c 4 256 82 +45a30 4 250 43 +45a34 4 256 82 +45a38 10 242 43 +45a48 14 246 43 +45a5c c 247 43 +45a68 c 248 43 +45a74 10 249 43 +45a84 14 250 43 +45a98 28 250 43 +45ac0 8 156 132 +45ac8 10 251 43 +45ad8 10 252 43 +45ae8 28 252 43 +45b10 8 156 132 +45b18 8 253 43 +45b20 c 254 43 +45b2c 8 248 43 +45b34 8 247 43 +45b3c 8 254 43 +45b44 c 257 43 +45b50 4 1139 87 +45b54 4 257 43 +45b58 4 277 82 +45b5c 4 257 43 +45b60 24 257 43 +45b84 1c 257 43 +45ba0 8 257 43 +45ba8 c 257 43 +45bb4 8 85 79 +45bbc 8 257 43 +45bc4 8 156 132 +45bcc 8 256 82 +45bd4 10 259 43 +45be4 28 262 43 +45c0c 4 1144 87 +45c10 c 298 82 +45c1c 8 298 82 +45c24 18 262 43 +45c3c 8 262 43 +45c44 c 262 43 +45c50 8 85 79 +45c58 8 262 43 +45c60 8 256 82 +45c68 28 263 43 +FUNC 45c90 1ec 0 FileIDTest::GetElfContents +45c90 10 109 43 +45ca0 8 110 43 +45ca8 8 109 43 +45cb0 8 110 43 +45cb8 4 109 43 +45cbc 4 110 43 +45cc0 8 111 43 +45cc8 4 277 82 +45ccc 4 111 43 +45cd0 4 1139 87 +45cd4 4 111 43 +45cd8 8 277 82 +45ce0 4 111 43 +45ce4 20 111 43 +45d04 4 111 43 +45d08 4 111 43 +45d0c 4 111 43 +45d10 1c 111 43 +45d2c 8 111 43 +45d34 c 111 43 +45d40 8 85 79 +45d48 8 111 43 +45d50 8 156 132 +45d58 10 256 82 +45d68 4 112 43 +45d6c 4 400 131 +45d70 4 1619 82 +45d74 8 400 131 +45d7c 4 112 43 +45d80 4 1619 82 +45d84 8 1619 82 +45d8c 24 1619 82 +45db0 8 112 43 +45db8 4 1144 87 +45dbc c 298 82 +45dc8 8 298 82 +45dd0 14 112 43 +45de4 4 112 43 +45de8 4 112 43 +45dec 8 112 43 +45df4 c 112 43 +45e00 8 85 79 +45e08 8 112 43 +45e10 10 256 82 +45e20 4 228 143 +45e24 c 256 82 +45e30 8 630 139 +45e38 8 269 100 +45e40 4 615 139 +45e44 14 510 139 +45e58 8 116 43 +45e60 8 156 132 +45e68 14 117 43 +FUNC 45e7c 250 0 FileIDTest_ElfClass_Test::TestBody +45e7c 4 127 43 +45e80 c 130 43 +45e8c c 127 43 +45e98 4 130 43 +45e9c 10 127 43 +45eac 4 127 43 +45eb0 4 130 43 +45eb4 4 134 43 +45eb8 8 135 43 +45ec0 4 130 43 +45ec4 4 453 131 +45ec8 14 134 43 +45edc c 135 43 +45ee8 14 453 131 +45efc 8 136 43 +45f04 18 139 43 +45f1c 4 143 43 +45f20 4 139 43 +45f24 28 139 43 +45f4c 8 156 132 +45f54 8 140 43 +45f5c c 141 43 +45f68 c 143 43 +45f74 4 1139 87 +45f78 4 143 43 +45f7c 4 277 82 +45f80 4 143 43 +45f84 20 143 43 +45fa4 4 143 43 +45fa8 4 143 43 +45fac 4 143 43 +45fb0 1c 143 43 +45fcc 8 143 43 +45fd4 c 143 43 +45fe0 8 85 79 +45fe8 8 143 43 +45ff0 8 156 132 +45ff8 8 256 82 +46000 10 146 43 +46010 28 148 43 +46038 4 1144 87 +4603c c 298 82 +46048 8 298 82 +46050 18 148 43 +46068 4 148 43 +4606c 4 148 43 +46070 8 148 43 +46078 c 148 43 +46084 8 85 79 +4608c 8 148 43 +46094 8 256 82 +4609c 8 135 43 +460a4 8 148 43 +460ac 20 149 43 +FUNC 460cc 374 0 FileIDTest_BuildID_Test::TestBody +460cc 4 151 43 +460d0 c 156 43 +460dc c 151 43 +460e8 4 154 43 +460ec c 151 43 +460f8 64 154 43 +4615c 4 156 43 +46160 c 154 43 +4616c 8 151 43 +46174 4 156 43 +46178 4 151 43 +4617c c 154 43 +46188 4 156 43 +4618c c 157 43 +46198 4 164 43 +4619c 4 165 43 +461a0 4 167 43 +461a4 4 157 43 +461a8 4 170 43 +461ac 10 164 43 +461bc 4 167 43 +461c0 4 175 43 +461c4 4 164 43 +461c8 c 165 43 +461d4 10 303 62 +461e4 14 167 43 +461f8 28 167 43 +46220 8 156 132 +46228 10 184 51 +46238 10 170 43 +46248 c 184 51 +46254 4 170 43 +46258 18 169 43 +46270 8 156 132 +46278 14 171 43 +4628c 28 171 43 +462b4 8 156 132 +462bc 8 172 43 +462c4 c 173 43 +462d0 c 175 43 +462dc 4 1139 87 +462e0 4 175 43 +462e4 4 277 82 +462e8 4 175 43 +462ec 20 175 43 +4630c 4 175 43 +46310 4 175 43 +46314 4 175 43 +46318 1c 175 43 +46334 8 175 43 +4633c c 175 43 +46348 8 85 79 +46350 8 175 43 +46358 8 156 132 +46360 8 256 82 +46368 10 178 43 +46378 28 180 43 +463a0 4 1144 87 +463a4 c 298 82 +463b0 8 298 82 +463b8 18 180 43 +463d0 4 180 43 +463d4 4 180 43 +463d8 8 180 43 +463e0 c 180 43 +463ec 8 85 79 +463f4 8 180 43 +463fc 8 256 82 +46404 8 168 43 +4640c 8 165 43 +46414 8 180 43 +4641c 24 181 43 +FUNC 46440 3cc 0 FileIDTest_BuildIDPH_Test::TestBody +46440 4 183 43 +46444 c 188 43 +46450 c 183 43 +4645c 4 186 43 +46460 c 183 43 +4646c 64 186 43 +464d0 4 188 43 +464d4 c 186 43 +464e0 8 183 43 +464e8 4 188 43 +464ec 4 183 43 +464f0 c 186 43 +464fc 4 188 43 +46500 c 189 43 +4650c 4 196 43 +46510 4 197 43 +46514 4 199 43 +46518 4 189 43 +4651c 4 202 43 +46520 10 196 43 +46530 4 199 43 +46534 4 210 43 +46538 4 196 43 +4653c c 197 43 +46548 10 303 62 +46558 14 199 43 +4656c 28 199 43 +46594 8 156 132 +4659c 10 184 51 +465ac 10 202 43 +465bc c 184 51 +465c8 4 202 43 +465cc 1c 201 43 +465e8 8 156 132 +465f0 14 204 43 +46604 18 203 43 +4661c 8 156 132 +46624 14 205 43 +46638 2c 205 43 +46664 4 156 132 +46668 4 205 43 +4666c 4 156 132 +46670 18 206 43 +46688 8 207 43 +46690 c 208 43 +4669c c 210 43 +466a8 4 1139 87 +466ac 4 210 43 +466b0 4 277 82 +466b4 4 210 43 +466b8 20 210 43 +466d8 4 210 43 +466dc 4 210 43 +466e0 4 210 43 +466e4 1c 210 43 +46700 8 210 43 +46708 c 210 43 +46714 8 85 79 +4671c 8 210 43 +46724 8 156 132 +4672c 8 256 82 +46734 10 213 43 +46744 28 215 43 +4676c 4 1144 87 +46770 c 298 82 +4677c 8 298 82 +46784 18 215 43 +4679c 4 215 43 +467a0 4 215 43 +467a4 8 215 43 +467ac c 215 43 +467b8 8 85 79 +467c0 8 215 43 +467c8 8 256 82 +467d0 8 200 43 +467d8 8 197 43 +467e0 8 215 43 +467e8 24 216 43 +FUNC 4680c 464 0 FileIDTest_UniqueHashes_Test::TestBody +4680c 4 220 43 +46810 4 222 43 +46814 c 220 43 +46820 4 222 43 +46824 4 232 43 +46828 4 220 43 +4682c 8 222 43 +46834 4 220 43 +46838 4 222 43 +4683c 14 220 43 +46850 4 222 43 +46854 4 224 43 +46858 4 230 43 +4685c 4 232 43 +46860 4 222 43 +46864 4 232 43 +46868 c 224 43 +46874 4 229 43 +46878 8 235 43 +46880 4 224 43 +46884 14 229 43 +46898 c 230 43 +468a4 10 231 43 +468b4 10 232 43 +468c4 28 232 43 +468ec 8 156 132 +468f4 c 233 43 +46900 10 234 43 +46910 10 235 43 +46920 28 235 43 +46948 8 156 132 +46950 8 236 43 +46958 c 237 43 +46964 8 233 43 +4696c 8 230 43 +46974 8 237 43 +4697c c 240 43 +46988 4 1139 87 +4698c 4 240 43 +46990 c 277 82 +4699c 4 240 43 +469a0 24 240 43 +469c4 1c 240 43 +469e0 8 240 43 +469e8 c 240 43 +469f4 8 85 79 +469fc 8 240 43 +46a04 8 156 132 +46a0c 4 256 82 +46a10 4 250 43 +46a14 4 256 82 +46a18 10 242 43 +46a28 14 246 43 +46a3c c 247 43 +46a48 c 248 43 +46a54 10 249 43 +46a64 14 250 43 +46a78 28 250 43 +46aa0 8 156 132 +46aa8 10 251 43 +46ab8 10 252 43 +46ac8 28 252 43 +46af0 8 156 132 +46af8 8 253 43 +46b00 c 254 43 +46b0c 8 248 43 +46b14 8 247 43 +46b1c 8 254 43 +46b24 c 257 43 +46b30 4 1139 87 +46b34 4 257 43 +46b38 4 277 82 +46b3c 4 257 43 +46b40 24 257 43 +46b64 1c 257 43 +46b80 8 257 43 +46b88 c 257 43 +46b94 8 85 79 +46b9c 8 257 43 +46ba4 8 156 132 +46bac 8 256 82 +46bb4 10 259 43 +46bc4 28 262 43 +46bec 4 1144 87 +46bf0 c 298 82 +46bfc 8 298 82 +46c04 18 262 43 +46c1c 8 262 43 +46c24 c 262 43 +46c30 8 85 79 +46c38 8 262 43 +46c40 8 256 82 +46c48 28 263 43 +FUNC 46c70 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c70 4 484 85 +FUNC 46c74 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c74 4 484 85 +FUNC 46c78 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c78 4 484 85 +FUNC 46c7c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c7c 4 484 85 +FUNC 46c80 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c80 4 484 85 +FUNC 46c84 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c84 4 484 85 +FUNC 46c88 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c88 4 484 85 +FUNC 46c8c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c8c 4 484 85 +FUNC 46c90 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c90 4 484 85 +FUNC 46c94 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c94 4 484 85 +FUNC 46c98 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c98 4 484 85 +FUNC 46c9c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46c9c 4 484 85 +FUNC 46ca0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46ca0 4 484 85 +FUNC 46ca4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46ca4 4 484 85 +FUNC 46ca8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46ca8 4 484 85 +FUNC 46cac 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46cac 4 484 85 +FUNC 46cb0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46cb0 4 484 85 +FUNC 46cb4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46cb4 4 484 85 +FUNC 46cb8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46cb8 4 484 85 +FUNC 46cbc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +46cbc 4 484 85 +FUNC 46cc0 14 0 LinuxLibcSupportTest_read_decimal_ptr_Test::~LinuxLibcSupportTest_read_decimal_ptr_Test +46cc0 14 194 46 +FUNC 46cd4 24 0 LinuxLibcSupportTest_read_decimal_ptr_Test::~LinuxLibcSupportTest_read_decimal_ptr_Test +46cd4 c 194 46 +46ce0 8 194 46 +46ce8 4 194 46 +46cec 8 194 46 +46cf4 4 194 46 +FUNC 46cf8 14 0 LinuxLibcSupportTest_read_hex_ptr_Test::~LinuxLibcSupportTest_read_hex_ptr_Test +46cf8 14 169 46 +FUNC 46d0c 24 0 LinuxLibcSupportTest_read_hex_ptr_Test::~LinuxLibcSupportTest_read_hex_ptr_Test +46d0c c 169 46 +46d18 8 169 46 +46d20 4 169 46 +46d24 8 169 46 +46d2c 4 169 46 +FUNC 46d30 14 0 LinuxLibcSupportTest_memchr_Test::~LinuxLibcSupportTest_memchr_Test +46d30 14 157 46 +FUNC 46d44 24 0 LinuxLibcSupportTest_memchr_Test::~LinuxLibcSupportTest_memchr_Test +46d44 c 157 46 +46d50 8 157 46 +46d58 4 157 46 +46d5c 8 157 46 +46d64 4 157 46 +FUNC 46d68 14 0 LinuxLibcSupportTest_strrchr_Test::~LinuxLibcSupportTest_strrchr_Test +46d68 14 143 46 +FUNC 46d7c 24 0 LinuxLibcSupportTest_strrchr_Test::~LinuxLibcSupportTest_strrchr_Test +46d7c c 143 46 +46d88 8 143 46 +46d90 4 143 46 +46d94 8 143 46 +46d9c 4 143 46 +FUNC 46da0 14 0 LinuxLibcSupportTest_strchr_Test::~LinuxLibcSupportTest_strchr_Test +46da0 14 129 46 +FUNC 46db4 24 0 LinuxLibcSupportTest_strchr_Test::~LinuxLibcSupportTest_strchr_Test +46db4 c 129 46 +46dc0 8 129 46 +46dc8 4 129 46 +46dcc 8 129 46 +46dd4 4 129 46 +FUNC 46dd8 14 0 LinuxLibcSupportTest_uitos_Test::~LinuxLibcSupportTest_uitos_Test +46dd8 14 106 46 +FUNC 46dec 24 0 LinuxLibcSupportTest_uitos_Test::~LinuxLibcSupportTest_uitos_Test +46dec c 106 46 +46df8 8 106 46 +46e00 4 106 46 +46e04 8 106 46 +46e0c 4 106 46 +FUNC 46e10 14 0 LinuxLibcSupportTest_uint_len_Test::~LinuxLibcSupportTest_uint_len_Test +46e10 14 92 46 +FUNC 46e24 24 0 LinuxLibcSupportTest_uint_len_Test::~LinuxLibcSupportTest_uint_len_Test +46e24 c 92 46 +46e30 8 92 46 +46e38 4 92 46 +46e3c 8 92 46 +46e44 4 92 46 +FUNC 46e48 14 0 LinuxLibcSupportTest_strtoui_Test::~LinuxLibcSupportTest_strtoui_Test +46e48 14 71 46 +FUNC 46e5c 24 0 LinuxLibcSupportTest_strtoui_Test::~LinuxLibcSupportTest_strtoui_Test +46e5c c 71 46 +46e68 8 71 46 +46e70 4 71 46 +46e74 8 71 46 +46e7c 4 71 46 +FUNC 46e80 14 0 LinuxLibcSupportTest_strcmp_Test::~LinuxLibcSupportTest_strcmp_Test +46e80 14 46 46 +FUNC 46e94 24 0 LinuxLibcSupportTest_strcmp_Test::~LinuxLibcSupportTest_strcmp_Test +46e94 c 46 46 +46ea0 8 46 46 +46ea8 4 46 46 +46eac 8 46 46 +46eb4 4 46 46 +FUNC 46eb8 14 0 LinuxLibcSupportTest_strlen_Test::~LinuxLibcSupportTest_strlen_Test +46eb8 14 37 46 +FUNC 46ecc 24 0 LinuxLibcSupportTest_strlen_Test::~LinuxLibcSupportTest_strlen_Test +46ecc c 37 46 +46ed8 8 37 46 +46ee0 4 37 46 +46ee4 8 37 46 +46eec 4 37 46 +FUNC 46ef0 3c 0 testing::internal::TestFactoryImpl::CreateTest +46ef0 10 486 85 +46f00 8 486 85 +46f08 8 194 46 +46f10 4 486 85 +46f14 c 194 46 +46f20 c 486 85 +FUNC 46f2c 3c 0 testing::internal::TestFactoryImpl::CreateTest +46f2c 10 486 85 +46f3c 8 486 85 +46f44 8 169 46 +46f4c 4 486 85 +46f50 c 169 46 +46f5c c 486 85 +FUNC 46f68 3c 0 testing::internal::TestFactoryImpl::CreateTest +46f68 10 486 85 +46f78 8 486 85 +46f80 8 157 46 +46f88 4 486 85 +46f8c c 157 46 +46f98 c 486 85 +FUNC 46fa4 3c 0 testing::internal::TestFactoryImpl::CreateTest +46fa4 10 486 85 +46fb4 8 486 85 +46fbc 8 143 46 +46fc4 4 486 85 +46fc8 c 143 46 +46fd4 c 486 85 +FUNC 46fe0 3c 0 testing::internal::TestFactoryImpl::CreateTest +46fe0 10 486 85 +46ff0 8 486 85 +46ff8 8 129 46 +47000 4 486 85 +47004 c 129 46 +47010 c 486 85 +FUNC 4701c 3c 0 testing::internal::TestFactoryImpl::CreateTest +4701c 10 486 85 +4702c 8 486 85 +47034 8 106 46 +4703c 4 486 85 +47040 c 106 46 +4704c c 486 85 +FUNC 47058 3c 0 testing::internal::TestFactoryImpl::CreateTest +47058 10 486 85 +47068 8 486 85 +47070 8 92 46 +47078 4 486 85 +4707c c 92 46 +47088 c 486 85 +FUNC 47094 3c 0 testing::internal::TestFactoryImpl::CreateTest +47094 10 486 85 +470a4 8 486 85 +470ac 8 71 46 +470b4 4 486 85 +470b8 c 71 46 +470c4 c 486 85 +FUNC 470d0 3c 0 testing::internal::TestFactoryImpl::CreateTest +470d0 10 486 85 +470e0 8 486 85 +470e8 8 46 46 +470f0 4 486 85 +470f4 c 46 46 +47100 c 486 85 +FUNC 4710c 3c 0 testing::internal::TestFactoryImpl::CreateTest +4710c 10 486 85 +4711c 8 486 85 +47124 8 37 46 +4712c 4 486 85 +47130 c 37 46 +4713c c 486 85 +FUNC 47148 148 0 LinuxLibcSupportTest_strlen_Test::TestBody +47148 18 37 46 +47160 8 1471 82 +47168 c 37 46 +47174 8 1471 82 +4717c 4 256 82 +47180 8 40 46 +47188 c 42 46 +47194 8 42 46 +4719c 4 42 46 +471a0 c 1481 82 +471ac c 1482 82 +471b8 20 1382 82 +471d8 1c 1471 82 +471f4 10 156 132 +47204 8 42 46 +4720c 4 302 82 +47210 4 42 46 +47214 4 42 46 +47218 8 302 82 +47220 18 42 46 +47238 8 42 46 +47240 c 42 46 +4724c 8 85 79 +47254 8 42 46 +4725c 18 256 82 +47274 4 43 46 +47278 18 44 46 +FUNC 47290 124 0 LinuxLibcSupportTest_strcmp_Test::TestBody +47290 14 46 46 +472a4 10 1512 82 +472b4 8 46 46 +472bc c 1512 82 +472c8 8 60 46 +472d0 10 62 46 +472e0 8 63 46 +472e8 8 64 46 +472f0 8 65 46 +472f8 8 66 46 +47300 14 67 46 +47314 18 1512 82 +4732c 8 67 46 +47334 4 302 82 +47338 4 67 46 +4733c 8 302 82 +47344 18 67 46 +4735c 8 67 46 +47364 c 67 46 +47370 8 85 79 +47378 8 67 46 +47380 18 256 82 +47398 4 68 46 +4739c 18 69 46 +FUNC 473b4 73c 0 LinuxLibcSupportTest_strtoui_Test::TestBody +473b4 4 71 46 +473b8 4 74 46 +473bc 8 71 46 +473c4 c 74 46 +473d0 c 71 46 +473dc c 74 46 +473e8 4 1139 87 +473ec 10 277 82 +473fc 4 74 46 +47400 20 74 46 +47420 4 74 46 +47424 4 74 46 +47428 18 74 46 +47440 8 256 82 +47448 18 75 46 +47460 4 1139 87 +47464 4 277 82 +47468 4 75 46 +4746c 20 75 46 +4748c 4 75 46 +47490 4 75 46 +47494 18 75 46 +474ac 8 256 82 +474b4 18 76 46 +474cc 4 1139 87 +474d0 4 277 82 +474d4 4 76 46 +474d8 20 76 46 +474f8 4 76 46 +474fc 4 76 46 +47500 18 76 46 +47518 8 256 82 +47520 18 77 46 +47538 4 1139 87 +4753c 4 277 82 +47540 4 77 46 +47544 20 77 46 +47564 4 77 46 +47568 4 77 46 +4756c 18 77 46 +47584 8 256 82 +4758c 18 78 46 +475a4 4 1139 87 +475a8 4 277 82 +475ac 4 78 46 +475b0 20 78 46 +475d0 4 78 46 +475d4 4 78 46 +475d8 18 78 46 +475f0 4 256 82 +475f4 8 80 46 +475fc 4 256 82 +47600 c 80 46 +4760c 4 1139 87 +47610 4 80 46 +47614 4 277 82 +47618 4 80 46 +4761c 20 80 46 +4763c 4 80 46 +47640 4 80 46 +47644 18 80 46 +4765c 4 256 82 +47660 8 1512 82 +47668 4 256 82 +4766c 4 81 46 +47670 1c 1512 82 +4768c 8 81 46 +47694 4 302 82 +47698 4 81 46 +4769c 8 302 82 +476a4 18 81 46 +476bc 4 256 82 +476c0 8 82 46 +476c8 4 256 82 +476cc c 82 46 +476d8 4 1139 87 +476dc 4 82 46 +476e0 4 277 82 +476e4 4 82 46 +476e8 20 82 46 +47708 4 82 46 +4770c 4 82 46 +47710 18 82 46 +47728 4 82 46 +4772c 4 82 46 +47730 8 82 46 +47738 c 82 46 +47744 8 85 79 +4774c 8 82 46 +47754 8 156 132 +4775c 10 256 82 +4776c 4 83 46 +47770 4 1512 82 +47774 4 83 46 +47778 14 1512 82 +4778c 8 83 46 +47794 4 302 82 +47798 4 83 46 +4779c 8 302 82 +477a4 18 83 46 +477bc 8 83 46 +477c4 c 83 46 +477d0 8 85 79 +477d8 8 83 46 +477e0 c 256 82 +477ec 4 84 46 +477f0 4 256 82 +477f4 c 84 46 +47800 4 1139 87 +47804 4 84 46 +47808 4 277 82 +4780c 4 84 46 +47810 20 84 46 +47830 4 84 46 +47834 4 84 46 +47838 4 84 46 +4783c 1c 84 46 +47858 8 84 46 +47860 c 84 46 +4786c 8 85 79 +47874 8 84 46 +4787c 8 156 132 +47884 c 256 82 +47890 4 1512 82 +47894 c 256 82 +478a0 4 85 46 +478a4 4 1512 82 +478a8 4 85 46 +478ac 14 1512 82 +478c0 8 85 46 +478c8 4 302 82 +478cc 4 85 46 +478d0 8 302 82 +478d8 18 85 46 +478f0 4 256 82 +478f4 8 86 46 +478fc 4 256 82 +47900 c 86 46 +4790c 4 1139 87 +47910 4 86 46 +47914 4 277 82 +47918 4 86 46 +4791c 20 86 46 +4793c 4 86 46 +47940 4 86 46 +47944 18 86 46 +4795c 4 256 82 +47960 4 87 46 +47964 4 256 82 +47968 4 87 46 +4796c 18 1512 82 +47984 8 87 46 +4798c 4 302 82 +47990 4 87 46 +47994 8 302 82 +4799c 18 87 46 +479b4 8 256 82 +479bc 10 88 46 +479cc 4 1139 87 +479d0 4 88 46 +479d4 4 277 82 +479d8 4 88 46 +479dc 20 88 46 +479fc 4 88 46 +47a00 4 88 46 +47a04 18 88 46 +47a1c 4 88 46 +47a20 4 88 46 +47a24 8 88 46 +47a2c c 88 46 +47a38 8 85 79 +47a40 8 88 46 +47a48 8 156 132 +47a50 10 256 82 +47a60 4 89 46 +47a64 18 1512 82 +47a7c 8 89 46 +47a84 4 302 82 +47a88 4 89 46 +47a8c 8 302 82 +47a94 18 89 46 +47aac 8 89 46 +47ab4 c 89 46 +47ac0 8 85 79 +47ac8 8 89 46 +47ad0 8 256 82 +47ad8 18 90 46 +FUNC 47af0 338 0 LinuxLibcSupportTest_uitos_Test::TestBody +47af0 4 106 46 +47af4 8 109 46 +47afc 8 106 46 +47b04 4 109 46 +47b08 4 1552 82 +47b0c 4 109 46 +47b10 4 1552 82 +47b14 8 106 46 +47b1c 4 109 46 +47b20 4 1552 82 +47b24 4 110 46 +47b28 c 1552 82 +47b34 4 110 46 +47b38 4 1552 82 +47b3c 4 110 46 +47b40 10 1552 82 +47b50 8 110 46 +47b58 4 1552 82 +47b5c 8 110 46 +47b64 c 302 82 +47b70 18 110 46 +47b88 8 256 82 +47b90 10 112 46 +47ba0 8 113 46 +47ba8 c 1552 82 +47bb4 4 113 46 +47bb8 4 1552 82 +47bbc 4 113 46 +47bc0 c 1552 82 +47bcc 8 113 46 +47bd4 c 302 82 +47be0 18 113 46 +47bf8 8 256 82 +47c00 10 115 46 +47c10 1c 116 46 +47c2c 1c 1552 82 +47c48 8 116 46 +47c50 c 302 82 +47c5c 18 116 46 +47c74 8 256 82 +47c7c 10 118 46 +47c8c 1c 119 46 +47ca8 1c 1552 82 +47cc4 8 119 46 +47ccc c 302 82 +47cd8 18 119 46 +47cf0 8 256 82 +47cf8 10 121 46 +47d08 1c 122 46 +47d24 1c 1552 82 +47d40 8 122 46 +47d48 c 302 82 +47d54 18 122 46 +47d6c 8 256 82 +47d74 10 125 46 +47d84 1c 126 46 +47da0 1c 1552 82 +47dbc 8 126 46 +47dc4 c 302 82 +47dd0 18 126 46 +47de8 8 126 46 +47df0 c 126 46 +47dfc 8 85 79 +47e04 8 126 46 +47e0c 8 256 82 +47e14 14 127 46 +FUNC 47e28 484 0 LinuxLibcSupportTest_uint_len_Test::TestBody +47e28 4 92 46 +47e2c 4 93 46 +47e30 14 92 46 +47e44 4 1512 82 +47e48 4 93 46 +47e4c 4 1512 82 +47e50 4 93 46 +47e54 24 1512 82 +47e78 8 93 46 +47e80 8 1512 82 +47e88 8 93 46 +47e90 c 302 82 +47e9c 18 93 46 +47eb4 8 256 82 +47ebc c 94 46 +47ec8 18 1512 82 +47ee0 4 94 46 +47ee4 4 1512 82 +47ee8 8 94 46 +47ef0 c 302 82 +47efc 18 94 46 +47f14 8 256 82 +47f1c c 95 46 +47f28 18 1512 82 +47f40 4 95 46 +47f44 4 1512 82 +47f48 8 95 46 +47f50 c 302 82 +47f5c 18 95 46 +47f74 8 256 82 +47f7c c 96 46 +47f88 18 1512 82 +47fa0 4 96 46 +47fa4 4 1512 82 +47fa8 8 96 46 +47fb0 c 302 82 +47fbc 18 96 46 +47fd4 4 256 82 +47fd8 8 1512 82 +47fe0 4 97 46 +47fe4 4 256 82 +47fe8 c 97 46 +47ff4 18 1512 82 +4800c 4 97 46 +48010 4 1512 82 +48014 8 97 46 +4801c c 302 82 +48028 18 97 46 +48040 8 256 82 +48048 c 98 46 +48054 18 1512 82 +4806c 4 98 46 +48070 4 1512 82 +48074 8 98 46 +4807c c 302 82 +48088 18 98 46 +480a0 4 256 82 +480a4 8 1512 82 +480ac 4 99 46 +480b0 4 256 82 +480b4 c 99 46 +480c0 18 1512 82 +480d8 4 99 46 +480dc 4 1512 82 +480e0 8 99 46 +480e8 c 302 82 +480f4 18 99 46 +4810c 8 256 82 +48114 c 100 46 +48120 18 1512 82 +48138 4 100 46 +4813c 4 1512 82 +48140 8 100 46 +48148 c 302 82 +48154 18 100 46 +4816c 8 256 82 +48174 10 101 46 +48184 4 1512 82 +48188 4 101 46 +4818c 1c 1512 82 +481a8 8 101 46 +481b0 c 302 82 +481bc 18 101 46 +481d4 8 101 46 +481dc c 101 46 +481e8 8 85 79 +481f0 8 101 46 +481f8 10 256 82 +48208 10 103 46 +48218 4 1512 82 +4821c 4 103 46 +48220 1c 1512 82 +4823c 8 103 46 +48244 c 302 82 +48250 18 103 46 +48268 8 103 46 +48270 c 103 46 +4827c 8 85 79 +48284 8 103 46 +4828c 8 256 82 +48294 18 104 46 +FUNC 482ac a8 0 testing::internal::CmpHelperEQ +482ac 10 1476 82 +482bc 8 1476 82 +482c4 c 1481 82 +482d0 8 1482 82 +482d8 3c 1408 82 +48314 1c 1471 82 +48330 10 156 132 +48340 14 1488 82 +FUNC 48354 458 0 LinuxLibcSupportTest_strchr_Test::TestBody +48354 4 129 46 +48358 4 130 46 +4835c 8 129 46 +48364 4 130 46 +48368 4 1571 82 +4836c 4 130 46 +48370 4 1571 82 +48374 4 130 46 +48378 8 129 46 +48380 4 130 46 +48384 30 1571 82 +483b4 8 130 46 +483bc c 302 82 +483c8 18 130 46 +483e0 8 256 82 +483e8 14 131 46 +483fc 1c 1571 82 +48418 8 131 46 +48420 c 302 82 +4842c 18 131 46 +48444 8 131 46 +4844c c 131 46 +48458 8 85 79 +48460 c 131 46 +4846c 8 256 82 +48474 14 132 46 +48488 1c 1571 82 +484a4 8 132 46 +484ac c 302 82 +484b8 18 132 46 +484d0 c 256 82 +484dc 10 134 46 +484ec 8 277 82 +484f4 4 1139 87 +484f8 4 277 82 +484fc 4 134 46 +48500 20 134 46 +48520 4 134 46 +48524 4 134 46 +48528 18 134 46 +48540 8 256 82 +48548 c 135 46 +48554 8 277 82 +4855c 4 1139 87 +48560 4 277 82 +48564 4 135 46 +48568 20 135 46 +48588 4 135 46 +4858c 4 135 46 +48590 18 135 46 +485a8 8 256 82 +485b0 10 136 46 +485c0 8 277 82 +485c8 4 1139 87 +485cc 4 277 82 +485d0 4 136 46 +485d4 20 136 46 +485f4 4 136 46 +485f8 4 136 46 +485fc 18 136 46 +48614 8 256 82 +4861c 10 137 46 +4862c 8 277 82 +48634 4 1139 87 +48638 4 277 82 +4863c 4 137 46 +48640 20 137 46 +48660 4 137 46 +48664 4 137 46 +48668 1c 137 46 +48684 8 137 46 +4868c c 137 46 +48698 8 85 79 +486a0 8 137 46 +486a8 8 156 132 +486b0 c 256 82 +486bc 8 140 46 +486c4 4 256 82 +486c8 c 140 46 +486d4 4 1481 82 +486d8 4 140 46 +486dc 4 1481 82 +486e0 c 1482 82 +486ec 20 1408 82 +4870c 24 1471 82 +48730 10 156 132 +48740 8 140 46 +48748 c 302 82 +48754 18 140 46 +4876c 8 140 46 +48774 c 140 46 +48780 8 85 79 +48788 8 140 46 +48790 8 256 82 +48798 14 141 46 +FUNC 487ac 418 0 LinuxLibcSupportTest_strrchr_Test::TestBody +487ac 4 143 46 +487b0 4 144 46 +487b4 8 143 46 +487bc 4 144 46 +487c0 4 1571 82 +487c4 4 144 46 +487c8 4 1571 82 +487cc 4 144 46 +487d0 8 143 46 +487d8 4 144 46 +487dc 30 1571 82 +4880c 8 144 46 +48814 c 302 82 +48820 18 144 46 +48838 8 256 82 +48840 14 145 46 +48854 1c 1571 82 +48870 8 145 46 +48878 c 302 82 +48884 18 145 46 +4889c 8 145 46 +488a4 c 145 46 +488b0 8 85 79 +488b8 8 145 46 +488c0 8 256 82 +488c8 14 146 46 +488dc 1c 1571 82 +488f8 8 146 46 +48900 4 302 82 +48904 4 146 46 +48908 8 302 82 +48910 18 146 46 +48928 c 256 82 +48934 10 148 46 +48944 8 277 82 +4894c 4 1139 87 +48950 4 277 82 +48954 4 148 46 +48958 20 148 46 +48978 4 148 46 +4897c 4 148 46 +48980 18 148 46 +48998 8 256 82 +489a0 c 149 46 +489ac 8 277 82 +489b4 4 1139 87 +489b8 4 277 82 +489bc 4 149 46 +489c0 20 149 46 +489e0 4 149 46 +489e4 4 149 46 +489e8 18 149 46 +48a00 8 256 82 +48a08 10 150 46 +48a18 8 277 82 +48a20 4 1139 87 +48a24 4 277 82 +48a28 4 150 46 +48a2c 20 150 46 +48a4c 4 150 46 +48a50 4 150 46 +48a54 18 150 46 +48a6c 8 256 82 +48a74 10 151 46 +48a84 8 277 82 +48a8c 4 1139 87 +48a90 4 277 82 +48a94 4 151 46 +48a98 20 151 46 +48ab8 4 151 46 +48abc 4 151 46 +48ac0 18 151 46 +48ad8 4 151 46 +48adc 4 151 46 +48ae0 8 151 46 +48ae8 c 151 46 +48af4 8 85 79 +48afc 8 151 46 +48b04 8 156 132 +48b0c c 256 82 +48b18 8 154 46 +48b20 4 256 82 +48b24 10 154 46 +48b34 20 1512 82 +48b54 8 154 46 +48b5c 4 302 82 +48b60 4 154 46 +48b64 8 302 82 +48b6c 18 154 46 +48b84 8 154 46 +48b8c c 154 46 +48b98 8 85 79 +48ba0 8 154 46 +48ba8 8 256 82 +48bb0 14 155 46 +FUNC 48bc4 84 0 testing::internal::CmpHelperEQFailure +48bc4 c 1464 82 +48bd0 8 1382 82 +48bd8 4 1464 82 +48bdc 8 1464 82 +48be4 8 1382 82 +48bec 8 1464 82 +48bf4 14 1382 82 +48c08 1c 1471 82 +48c24 10 156 132 +48c34 14 1472 82 +FUNC 48c48 9c 0 testing::internal::CmpHelperEQ +48c48 10 1476 82 +48c58 8 1476 82 +48c60 c 1481 82 +48c6c 8 1482 82 +48c74 20 1408 82 +48c94 10 1382 82 +48ca4 1c 1471 82 +48cc0 10 156 132 +48cd0 14 1488 82 +FUNC 48ce4 9c 0 testing::internal::CmpHelperEQ +48ce4 10 1476 82 +48cf4 8 1476 82 +48cfc c 1481 82 +48d08 8 1482 82 +48d10 20 1408 82 +48d30 10 1382 82 +48d40 1c 1471 82 +48d5c 10 156 132 +48d6c 14 1488 82 +FUNC 48d80 3bc 0 LinuxLibcSupportTest_memchr_Test::TestBody +48d80 4 157 46 +48d84 8 158 46 +48d8c 4 157 46 +48d90 8 158 46 +48d98 c 157 46 +48da4 4 158 46 +48da8 10 1571 82 +48db8 4 1482 82 +48dbc 4 1481 82 +48dc0 8 1482 82 +48dc8 1c 1487 82 +48de4 8 158 46 +48dec 4 302 82 +48df0 4 158 46 +48df4 8 302 82 +48dfc 18 158 46 +48e14 8 256 82 +48e1c 14 159 46 +48e30 8 1571 82 +48e38 4 1482 82 +48e3c 4 1481 82 +48e40 8 1482 82 +48e48 1c 1487 82 +48e64 8 159 46 +48e6c 4 302 82 +48e70 4 159 46 +48e74 8 302 82 +48e7c 18 159 46 +48e94 8 256 82 +48e9c 14 160 46 +48eb0 8 1571 82 +48eb8 4 1482 82 +48ebc 4 1481 82 +48ec0 8 1482 82 +48ec8 1c 1487 82 +48ee4 8 160 46 +48eec 4 302 82 +48ef0 4 160 46 +48ef4 8 302 82 +48efc 18 160 46 +48f14 8 160 46 +48f1c c 160 46 +48f28 8 85 79 +48f30 8 160 46 +48f38 c 256 82 +48f44 4 163 46 +48f48 4 256 82 +48f4c 4 163 46 +48f50 4 1512 82 +48f54 4 256 82 +48f58 4 1512 82 +48f5c 14 163 46 +48f70 1c 1512 82 +48f8c 8 163 46 +48f94 4 302 82 +48f98 4 163 46 +48f9c 8 302 82 +48fa4 18 163 46 +48fbc 8 256 82 +48fc4 14 164 46 +48fd8 1c 1512 82 +48ff4 8 164 46 +48ffc 4 302 82 +49000 4 164 46 +49004 8 302 82 +4900c 18 164 46 +49024 8 256 82 +4902c 14 165 46 +49040 20 1512 82 +49060 8 165 46 +49068 4 302 82 +4906c 4 165 46 +49070 8 302 82 +49078 18 165 46 +49090 8 256 82 +49098 14 166 46 +490ac 20 1512 82 +490cc 8 166 46 +490d4 4 302 82 +490d8 4 166 46 +490dc 8 302 82 +490e4 18 166 46 +490fc 8 166 46 +49104 c 166 46 +49110 8 85 79 +49118 8 166 46 +49120 8 256 82 +49128 14 167 46 +FUNC 4913c 5c 0 testing::PrintToString +4913c 4 883 80 +49140 4 884 80 +49144 8 883 80 +4914c 4 884 80 +49150 4 883 80 +49154 4 883 80 +49158 4 884 80 +4915c 4 883 80 +49160 4 884 80 +49164 c 394 80 +49170 c 75 127 +4917c 8 886 80 +49184 14 887 80 +FUNC 49198 9c 0 testing::internal::CmpHelperEQ +49198 10 1476 82 +491a8 8 1476 82 +491b0 10 1481 82 +491c0 8 1482 82 +491c8 2c 1382 82 +491f4 1c 1471 82 +49210 10 156 132 +49220 14 1488 82 +FUNC 49234 47c 0 LinuxLibcSupportTest_read_hex_ptr_Test::TestBody +49234 4 169 46 +49238 4 173 46 +4923c 8 169 46 +49244 c 173 46 +49250 8 169 46 +49258 8 1512 82 +49260 8 169 46 +49268 4 1512 82 +4926c 4 173 46 +49270 c 1512 82 +4927c 4 173 46 +49280 14 1512 82 +49294 8 174 46 +4929c 4 1512 82 +492a0 8 174 46 +492a8 4 302 82 +492ac 4 174 46 +492b0 8 302 82 +492b8 18 174 46 +492d0 4 256 82 +492d4 c 1512 82 +492e0 4 256 82 +492e4 18 1512 82 +492fc 4 175 46 +49300 4 1512 82 +49304 8 175 46 +4930c 4 302 82 +49310 4 175 46 +49314 8 302 82 +4931c 18 175 46 +49334 8 256 82 +4933c 10 177 46 +4934c 14 1512 82 +49360 4 178 46 +49364 4 1512 82 +49368 8 178 46 +49370 4 302 82 +49374 4 178 46 +49378 8 302 82 +49380 18 178 46 +49398 8 256 82 +493a0 4 179 46 +493a4 18 1512 82 +493bc 8 179 46 +493c4 4 302 82 +493c8 4 179 46 +493cc 8 302 82 +493d4 18 179 46 +493ec 8 256 82 +493f4 14 181 46 +49408 4 1512 82 +4940c 4 182 46 +49410 4 1512 82 +49414 4 182 46 +49418 14 1512 82 +4942c 8 182 46 +49434 4 302 82 +49438 4 182 46 +4943c 8 302 82 +49444 18 182 46 +4945c 8 256 82 +49464 4 183 46 +49468 18 1512 82 +49480 8 183 46 +49488 4 302 82 +4948c 4 183 46 +49490 8 302 82 +49498 18 183 46 +494b0 4 256 82 +494b4 8 1512 82 +494bc 4 186 46 +494c0 4 256 82 +494c4 14 185 46 +494d8 14 1512 82 +494ec 4 186 46 +494f0 4 1512 82 +494f4 8 186 46 +494fc 4 302 82 +49500 4 186 46 +49504 8 302 82 +4950c 18 186 46 +49524 8 256 82 +4952c 4 187 46 +49530 18 1512 82 +49548 8 187 46 +49550 4 302 82 +49554 4 187 46 +49558 8 302 82 +49560 18 187 46 +49578 8 256 82 +49580 14 189 46 +49594 14 1512 82 +495a8 4 190 46 +495ac 4 1512 82 +495b0 8 190 46 +495b8 4 302 82 +495bc 4 190 46 +495c0 8 302 82 +495c8 18 190 46 +495e0 8 190 46 +495e8 c 190 46 +495f4 8 85 79 +495fc 8 190 46 +49604 10 256 82 +49614 4 191 46 +49618 4 1512 82 +4961c 4 191 46 +49620 18 1512 82 +49638 8 191 46 +49640 4 302 82 +49644 4 191 46 +49648 8 302 82 +49650 18 191 46 +49668 8 191 46 +49670 c 191 46 +4967c 8 85 79 +49684 8 191 46 +4968c 8 256 82 +49694 1c 192 46 +FUNC 496b0 390 0 LinuxLibcSupportTest_read_decimal_ptr_Test::TestBody +496b0 c 194 46 +496bc 4 198 46 +496c0 4 194 46 +496c4 10 198 46 +496d4 c 194 46 +496e0 4 1512 82 +496e4 4 198 46 +496e8 10 1512 82 +496f8 4 198 46 +496fc 14 1512 82 +49710 8 199 46 +49718 4 1512 82 +4971c 8 199 46 +49724 4 302 82 +49728 4 199 46 +4972c 8 302 82 +49734 18 199 46 +4974c 4 256 82 +49750 8 1512 82 +49758 4 256 82 +4975c 4 200 46 +49760 18 1512 82 +49778 8 200 46 +49780 4 302 82 +49784 4 200 46 +49788 8 302 82 +49790 18 200 46 +497a8 8 256 82 +497b0 14 202 46 +497c4 4 1512 82 +497c8 4 203 46 +497cc 4 1512 82 +497d0 4 203 46 +497d4 14 1512 82 +497e8 8 203 46 +497f0 4 302 82 +497f4 4 203 46 +497f8 8 302 82 +49800 18 203 46 +49818 8 256 82 +49820 4 204 46 +49824 18 1512 82 +4983c 8 204 46 +49844 4 302 82 +49848 4 204 46 +4984c 8 302 82 +49854 18 204 46 +4986c 4 256 82 +49870 8 1512 82 +49878 4 207 46 +4987c 4 256 82 +49880 14 206 46 +49894 14 1512 82 +498a8 4 207 46 +498ac 4 1512 82 +498b0 8 207 46 +498b8 4 302 82 +498bc 4 207 46 +498c0 8 302 82 +498c8 18 207 46 +498e0 8 256 82 +498e8 4 208 46 +498ec 18 1512 82 +49904 8 208 46 +4990c 4 302 82 +49910 4 208 46 +49914 8 302 82 +4991c 18 208 46 +49934 8 256 82 +4993c 14 210 46 +49950 14 1512 82 +49964 4 211 46 +49968 4 1512 82 +4996c 8 211 46 +49974 4 302 82 +49978 4 211 46 +4997c 8 302 82 +49984 18 211 46 +4999c 8 256 82 +499a4 4 212 46 +499a8 4 1512 82 +499ac 4 212 46 +499b0 18 1512 82 +499c8 8 212 46 +499d0 4 302 82 +499d4 4 212 46 +499d8 8 302 82 +499e0 18 212 46 +499f8 8 212 46 +49a00 c 212 46 +49a0c 8 85 79 +49a14 8 212 46 +49a1c 8 256 82 +49a24 1c 213 46 +FUNC 49a40 5c 0 google_breakpad::test_assembler::Section::Mark +49a40 10 439 62 +49a50 4 439 62 +49a54 4 436 62 +49a58 4 439 62 +49a5c 4 400 131 +49a60 4 436 62 +49a64 4 400 131 +49a68 c 436 62 +49a74 c 439 62 +49a80 8 439 62 +49a88 14 439 62 +FUNC 49a9c 74 0 google_breakpad::synth_elf::ELF::AppendSection +49a9c 10 121 50 +49aac 4 121 50 +49ab0 8 124 50 +49ab8 c 125 50 +49ac4 8 126 50 +49acc 8 127 50 +49ad4 8 133 50 +49adc 8 127 50 +49ae4 8 129 50 +49aec c 130 50 +49af8 8 131 50 +49b00 8 133 50 +49b08 8 131 50 +FUNC 49b10 150 0 google_breakpad::synth_elf::ELF::AddSegment +49b10 18 135 50 +49b28 8 135 50 +49b30 4 140 50 +49b34 8 143 50 +49b3c 4 135 50 +49b40 8 140 50 +49b48 4 143 50 +49b4c 4 135 50 +49b50 4 143 50 +49b54 c 145 50 +49b60 10 147 50 +49b70 4 151 50 +49b74 4 153 50 +49b78 4 150 50 +49b7c c 153 50 +49b88 4 202 139 +49b8c 4 155 50 +49b90 4 154 50 +49b94 8 155 50 +49b9c 8 158 50 +49ba4 4 159 50 +49ba8 4 163 50 +49bac c 153 50 +49bb8 4 202 139 +49bbc 14 168 50 +49bd0 4 170 50 +49bd4 4 170 50 +49bd8 4 170 50 +49bdc c 170 50 +49be8 4 172 50 +49bec 4 172 50 +49bf0 4 172 50 +49bf4 c 172 50 +49c00 10 174 50 +49c10 10 176 50 +49c20 c 178 50 +49c2c c 180 50 +49c38 10 184 50 +49c48 14 185 50 +49c5c 4 184 50 +FUNC 49c60 34 0 google_breakpad::synth_elf::ELF::ElfSection::~ElfSection +49c60 14 141 51 +49c74 10 141 51 +49c84 4 141 51 +49c88 8 141 51 +49c90 4 141 51 +FUNC 49c94 24 0 google_breakpad::synth_elf::ELF::ElfSection::~ElfSection +49c94 c 141 51 +49ca0 8 141 51 +49ca8 4 141 51 +49cac 8 141 51 +49cb4 4 141 51 +FUNC 49cb8 14 0 google_breakpad::synth_elf::SymbolTable::~SymbolTable +49cb8 14 161 51 +FUNC 49ccc 24 0 google_breakpad::synth_elf::SymbolTable::~SymbolTable +49ccc c 161 51 +49cd8 8 161 51 +49ce0 4 161 51 +49ce4 8 161 51 +49cec 4 161 51 +FUNC 49cf0 b4 0 google_breakpad::synth_elf::Notes::AddNote +49cf0 10 244 50 +49d00 4 244 50 +49d04 4 292 62 +49d08 4 250 50 +49d0c 4 400 131 +49d10 4 528 131 +49d14 4 400 131 +49d18 4 244 50 +49d1c 4 528 131 +49d20 4 244 50 +49d24 4 400 131 +49d28 4 528 131 +49d2c 4 248 50 +49d30 4 249 50 +49d34 4 248 50 +49d38 4 249 50 +49d3c 4 528 131 +49d40 10 517 131 +49d50 c 453 131 +49d5c 10 255 50 +49d6c 18 528 131 +49d84 10 257 50 +49d94 10 258 50 +FUNC 49da4 108 0 std::priv::_Impl_vector >::_Impl_vector +49da4 14 246 139 +49db8 4 246 139 +49dbc 8 192 139 +49dc4 4 70 139 +49dc8 4 192 139 +49dcc 4 342 101 +49dd0 4 192 139 +49dd4 4 70 139 +49dd8 4 481 101 +49ddc 8 342 101 +49de4 c 343 101 +49df0 4 343 101 +49df4 4 356 101 +49df8 4 346 101 +49dfc c 347 101 +49e08 8 348 101 +49e10 c 352 101 +49e1c 4 71 139 +49e20 4 73 139 +49e24 4 72 139 +49e28 4 84 137 +49e2c 8 73 139 +49e34 14 86 137 +49e48 8 86 137 +49e50 4 139 103 +49e54 24 449 62 +49e78 4 89 137 +49e7c 18 86 137 +49e94 4 249 139 +49e98 14 250 139 +FUNC 49eac 58 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, google_breakpad::test_assembler::Label>, std::priv::_Select1st, std::allocator >, google_breakpad::test_assembler::Label> >, std::priv::_MapTraitsT, std::allocator >, google_breakpad::test_assembler::Label> >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::_M_create_node +49eac 4 315 136 +49eb0 4 306 101 +49eb4 8 315 136 +49ebc 4 315 136 +49ec0 8 306 101 +49ec8 8 307 101 +49ed0 8 119 103 +49ed8 8 68 124 +49ee0 c 68 124 +49eec 4 321 136 +49ef0 4 324 136 +49ef4 4 322 136 +49ef8 c 324 136 +FUNC 49f04 48 0 google_breakpad::synth_elf::SymbolTable::SymbolTable +49f04 c 213 50 +49f10 c 213 50 +49f1c 24 217 50 +49f40 c 219 50 +FUNC 49f4c 98 0 google_breakpad::synth_elf::ELF::ElfSection::ElfSection +49f4c c 141 51 +49f58 4 141 51 +49f5c 4 270 62 +49f60 4 141 51 +49f64 20 270 62 +49f84 c 124 143 +49f90 c 270 62 +49f9c 4 141 51 +49fa0 4 141 51 +49fa4 24 141 51 +49fc8 8 141 51 +49fd0 14 141 51 +FUNC 49fe4 204 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +49fe4 24 81 138 +4a008 8 192 139 +4a010 8 81 138 +4a018 4 192 139 +4a01c 4 81 138 +4a020 4 192 139 +4a024 8 173 139 +4a02c 8 81 138 +4a034 8 173 139 +4a03c 14 41 138 +4a050 4 175 139 +4a054 10 176 139 +4a064 4 356 101 +4a068 8 346 101 +4a070 4 177 139 +4a074 c 347 101 +4a080 4 348 101 +4a084 4 352 101 +4a088 4 348 101 +4a08c 4 352 101 +4a090 4 91 138 +4a094 4 84 137 +4a098 c 86 137 +4a0a4 8 86 137 +4a0ac 4 139 103 +4a0b0 c 139 103 +4a0bc 4 88 137 +4a0c0 4 89 137 +4a0c4 10 86 137 +4a0d4 c 93 138 +4a0e0 4 119 103 +4a0e4 c 119 103 +4a0f0 8 95 138 +4a0f8 8 314 137 +4a100 4 249 137 +4a104 8 249 137 +4a10c 4 139 103 +4a110 c 139 103 +4a11c c 249 137 +4a128 8 98 138 +4a130 4 86 137 +4a134 4 84 137 +4a138 c 86 137 +4a144 8 86 137 +4a14c 4 139 103 +4a150 c 139 103 +4a15c 4 88 137 +4a160 4 89 137 +4a164 1c 86 137 +4a180 8 191 103 +4a188 4 57 103 +4a18c 4 77 113 +4a190 14 57 103 +4a1a4 c 662 139 +4a1b0 4 319 101 +4a1b4 4 323 101 +4a1b8 4 104 138 +4a1bc 4 666 139 +4a1c0 4 667 139 +4a1c4 4 668 139 +4a1c8 20 105 138 +FUNC 4a1e8 5c 0 std::priv::_Rb_global::_M_decrement +4a1e8 4 278 135 +4a1ec 8 279 135 +4a1f4 10 279 135 +4a204 8 280 135 +4a20c 8 281 135 +4a214 10 99 136 +4a224 4 285 135 +4a228 c 286 135 +4a234 c 288 135 +4a240 4 293 135 +FUNC 4a244 dc 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, google_breakpad::test_assembler::Label>, std::priv::_Select1st, std::allocator >, google_breakpad::test_assembler::Label> >, std::priv::_MapTraitsT, std::allocator >, google_breakpad::test_assembler::Label> >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::_M_insert +4a244 4 350 135 +4a248 4 358 135 +4a24c c 350 135 +4a258 c 350 135 +4a264 4 358 135 +4a268 c 359 135 +4a274 4 360 135 +4a278 4 361 135 +4a27c 8 362 135 +4a284 4 364 135 +4a288 4 364 135 +4a28c 14 79 106 +4a2a0 8 364 135 +4a2a8 8 367 135 +4a2b0 4 368 135 +4a2b4 4 367 135 +4a2b8 c 369 135 +4a2c4 8 370 135 +4a2cc 8 373 135 +4a2d4 4 374 135 +4a2d8 4 373 135 +4a2dc c 375 135 +4a2e8 4 376 135 +4a2ec 8 379 135 +4a2f4 4 378 135 +4a2f8 4 379 135 +4a2fc 4 380 135 +4a300 4 382 135 +4a304 8 380 135 +4a30c 4 142 136 +4a310 10 382 135 +FUNC 4a320 fc 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, google_breakpad::test_assembler::Label>, std::priv::_Select1st, std::allocator >, google_breakpad::test_assembler::Label> >, std::priv::_MapTraitsT, std::allocator >, google_breakpad::test_assembler::Label> >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::insert_unique +4a320 14 405 135 +4a334 4 405 135 +4a338 4 406 135 +4a33c 4 405 135 +4a340 4 407 135 +4a344 4 405 135 +4a348 4 408 135 +4a34c 4 409 135 +4a350 14 79 106 +4a364 8 412 135 +4a36c 8 412 135 +4a374 4 412 135 +4a378 10 405 135 +4a388 4 415 135 +4a38c c 416 135 +4a398 18 417 135 +4a3b0 c 187 136 +4a3bc 10 79 106 +4a3cc 4 421 135 +4a3d0 1c 422 135 +4a3ec 8 142 136 +4a3f4 8 62 124 +4a3fc 4 142 136 +4a400 4 62 124 +4a404 18 425 135 +FUNC 4a41c 2d4 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, google_breakpad::test_assembler::Label>, std::priv::_Select1st, std::allocator >, google_breakpad::test_assembler::Label> >, std::priv::_MapTraitsT, std::allocator >, google_breakpad::test_assembler::Label> >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::insert_unique +4a41c 18 432 135 +4a434 8 432 135 +4a43c 10 434 135 +4a44c 4 437 135 +4a450 4 438 135 +4a454 4 437 135 +4a458 4 143 106 +4a45c 14 79 106 +4a470 8 440 135 +4a478 14 79 106 +4a48c 8 447 135 +4a494 c 297 135 +4a4a0 10 94 136 +4a4b0 8 301 135 +4a4b8 c 302 135 +4a4c4 c 304 135 +4a4d0 c 309 135 +4a4dc 8 458 135 +4a4e4 14 462 135 +4a4f8 18 79 106 +4a510 8 468 135 +4a518 4 469 135 +4a51c c 470 135 +4a528 8 469 135 +4a530 c 309 135 +4a53c 4 513 135 +4a540 10 475 135 +4a550 c 142 136 +4a55c 8 479 135 +4a564 4 480 135 +4a568 14 79 106 +4a57c 8 480 135 +4a584 18 483 135 +4a59c c 486 135 +4a5a8 8 187 136 +4a5b0 4 143 106 +4a5b4 8 187 136 +4a5bc 14 79 106 +4a5d0 8 494 135 +4a5d8 10 79 106 +4a5e8 c 494 135 +4a5f4 10 500 135 +4a604 8 497 135 +4a60c c 498 135 +4a618 8 522 135 +4a620 1c 524 135 +4a63c 14 79 106 +4a650 4 517 135 +4a654 8 142 136 +4a65c c 297 135 +4a668 10 94 136 +4a678 8 301 135 +4a680 c 302 135 +4a68c c 304 135 +4a698 c 517 135 +4a6a4 10 79 106 +4a6b4 8 517 135 +4a6bc 4 521 135 +4a6c0 14 522 135 +4a6d4 1c 534 135 +FUNC 4a6f0 ec 0 std::map, std::allocator >, google_breakpad::test_assembler::Label, std::less, std::allocator > >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::operator[], std::allocator > > +4a6f0 14 175 118 +4a704 8 175 118 +4a70c 8 568 136 +4a714 4 571 136 +4a718 10 79 106 +4a728 4 572 136 +4a72c 8 573 136 +4a734 14 575 136 +4a748 8 178 118 +4a750 10 79 106 +4a760 4 178 118 +4a764 4 179 118 +4a768 4 62 124 +4a76c 8 179 118 +4a774 8 62 124 +4a77c 4 62 124 +4a780 4 62 124 +4a784 c 62 124 +4a790 4 142 136 +4a794 14 191 118 +4a7a8 4 179 118 +4a7ac 8 51 124 +4a7b4 8 156 132 +4a7bc 8 179 118 +4a7c4 4 180 118 +4a7c8 14 181 118 +FUNC 4a7dc 120 0 google_breakpad::synth_elf::StringTable::Add +4a7dc 14 75 51 +4a7f0 4 549 136 +4a7f4 10 75 51 +4a804 4 549 136 +4a808 4 552 136 +4a80c 10 79 106 +4a81c 4 553 136 +4a820 8 554 136 +4a828 14 556 136 +4a83c 8 558 136 +4a844 10 79 106 +4a854 8 559 136 +4a85c 8 76 51 +4a864 10 77 51 +4a874 8 77 51 +4a87c 4 77 51 +4a880 4 400 131 +4a884 4 436 62 +4a888 4 400 131 +4a88c 8 436 62 +4a894 4 296 62 +4a898 8 436 62 +4a8a0 10 517 131 +4a8b0 c 453 131 +4a8bc c 81 51 +4a8c8 8 81 51 +4a8d0 c 82 51 +4a8dc 8 82 51 +4a8e4 18 83 51 +FUNC 4a8fc a4 0 google_breakpad::synth_elf::SymbolTable::AddSymbol +4a8fc 10 222 50 +4a90c 4 222 50 +4a910 4 224 50 +4a914 4 222 50 +4a918 8 224 50 +4a920 c 222 50 +4a92c 4 224 50 +4a930 c 224 50 +4a93c 4 224 50 +4a940 4 357 62 +4a944 4 224 50 +4a948 10 225 50 +4a958 10 226 50 +4a968 1c 453 131 +4a984 c 229 50 +4a990 10 230 50 +FUNC 4a9a0 a4 0 google_breakpad::synth_elf::SymbolTable::AddSymbol +4a9a0 10 233 50 +4a9b0 4 233 50 +4a9b4 4 235 50 +4a9b8 4 233 50 +4a9bc 8 235 50 +4a9c4 c 233 50 +4a9d0 4 235 50 +4a9d4 c 235 50 +4a9e0 4 235 50 +4a9e4 4 357 62 +4a9e8 4 235 50 +4a9ec 1c 453 131 +4aa08 c 238 50 +4aa14 10 239 50 +4aa24 10 240 50 +4aa34 10 241 50 +FUNC 4aa44 210 0 google_breakpad::synth_elf::ELF::AddSection +4aa44 c 86 50 +4aa50 4 87 50 +4aa54 c 86 50 +4aa60 4 87 50 +4aa64 4 86 50 +4aa68 4 270 62 +4aa6c 14 86 50 +4aa80 c 86 50 +4aa8c 4 87 50 +4aa90 10 88 50 +4aaa0 4 117 50 +4aaa4 4 88 50 +4aaa8 4 91 50 +4aaac 4 400 131 +4aab0 4 96 50 +4aab4 8 400 131 +4aabc 8 92 50 +4aac4 8 96 50 +4aacc 8 98 50 +4aad4 14 100 50 +4aae8 10 102 50 +4aaf8 10 104 50 +4ab08 10 106 50 +4ab18 c 108 50 +4ab24 8 110 50 +4ab2c 10 112 50 +4ab3c 10 114 50 +4ab4c 4 380 139 +4ab50 4 114 50 +4ab54 c 117 50 +4ab60 24 270 62 +4ab84 c 124 143 +4ab90 c 270 62 +4ab9c 8 145 51 +4aba4 8 117 50 +4abac 8 145 51 +4abb4 4 117 50 +4abb8 c 145 51 +4abc4 4 145 51 +4abc8 4 117 50 +4abcc 10 380 139 +4abdc 4 119 103 +4abe0 c 119 103 +4abec 10 382 139 +4abfc 18 162 139 +4ac14 8 117 50 +4ac1c 8 117 50 +4ac24 8 88 50 +4ac2c 8 118 50 +4ac34 20 119 50 +FUNC 4ac54 100 0 google_breakpad::synth_elf::ELF::Finish +4ac54 10 187 50 +4ac64 4 187 50 +4ac68 4 189 50 +4ac6c 4 191 50 +4ac70 8 189 50 +4ac78 14 191 50 +4ac8c 28 191 50 +4acb4 8 156 132 +4acbc c 194 50 +4acc8 8 195 50 +4acd0 10 196 50 +4ace0 10 198 50 +4acf0 c 201 50 +4acfc 8 203 50 +4ad04 4 201 50 +4ad08 8 203 50 +4ad10 c 205 50 +4ad1c c 206 50 +4ad28 c 209 50 +4ad34 c 210 50 +4ad40 14 211 50 +FUNC 4ad54 438 0 google_breakpad::synth_elf::ELF::ELF +4ad54 28 14 50 +4ad7c 4 23 50 +4ad80 10 14 50 +4ad90 4 23 50 +4ad94 8 14 50 +4ad9c 4 23 50 +4ada0 4 23 50 +4ada4 4 23 50 +4ada8 4 23 50 +4adac 8 23 50 +4adb4 4 67 51 +4adb8 4 432 62 +4adbc 4 23 50 +4adc0 4 69 51 +4adc4 4 69 51 +4adc8 8 23 50 +4add0 10 23 50 +4ade0 c 23 50 +4adec 4 23 50 +4adf0 4 23 50 +4adf4 8 23 50 +4adfc c 23 50 +4ae08 8 23 50 +4ae10 4 23 50 +4ae14 8 23 50 +4ae1c c 23 50 +4ae28 8 23 50 +4ae30 4 23 50 +4ae34 14 67 51 +4ae48 4 67 51 +4ae4c c 67 51 +4ae58 4 67 51 +4ae5c 4 481 101 +4ae60 8 263 136 +4ae68 8 432 62 +4ae70 4 266 136 +4ae74 4 267 136 +4ae78 4 391 136 +4ae7c 4 432 62 +4ae80 c 68 51 +4ae8c 8 68 51 +4ae94 18 69 51 +4aeac 14 69 51 +4aec0 8 69 51 +4aec8 4 357 62 +4aecc 4 69 51 +4aed0 8 69 51 +4aed8 8 156 132 +4aee0 4 67 139 +4aee4 8 432 62 +4aeec 4 67 139 +4aef0 4 481 101 +4aef4 4 432 62 +4aef8 c 30 50 +4af04 8 30 50 +4af0c 40 453 131 +4af4c 4 41 50 +4af50 38 453 131 +4af88 8 400 131 +4af90 10 182 130 +4afa0 c 600 130 +4afac 8 74 132 +4afb4 c 74 132 +4afc0 8 74 132 +4afc8 8 184 130 +4afd0 10 185 130 +4afe0 8 185 130 +4afe8 8 186 130 +4aff0 c 314 137 +4affc 8 249 137 +4b004 8 146 103 +4b00c 4 187 130 +4b010 4 53 50 +4b014 8 101 103 +4b01c 4 232 140 +4b020 c 189 130 +4b02c 4 53 50 +4b030 4 67 50 +4b034 4 53 50 +4b038 c 55 50 +4b044 c 57 50 +4b050 14 59 50 +4b064 14 61 50 +4b078 14 63 50 +4b08c c 65 50 +4b098 4 67 50 +4b09c 4 67 50 +4b0a0 4 67 50 +4b0a4 c 67 50 +4b0b0 4 69 50 +4b0b4 8 69 50 +4b0bc 4 69 50 +4b0c0 c 69 50 +4b0cc c 71 50 +4b0d8 4 73 50 +4b0dc 4 73 50 +4b0e0 4 73 50 +4b0e4 c 73 50 +4b0f0 c 75 50 +4b0fc c 77 50 +4b108 c 80 50 +4b114 14 81 50 +4b128 28 81 50 +4b150 8 156 132 +4b158 8 81 50 +4b160 2c 82 50 +FUNC 4b18c 78 0 pthread_barrier_wait +4b18c 14 62 36 +4b1a0 8 64 36 +4b1a8 10 67 36 +4b1b8 8 69 36 +4b1c0 8 70 36 +4b1c8 c 71 36 +4b1d4 c 76 36 +4b1e0 8 75 36 +4b1e8 8 79 36 +4b1f0 4 80 36 +4b1f4 10 81 36 +FUNC 4b204 60 0 thread_function +4b204 c 81 53 +4b210 4 81 53 +4b214 8 70 53 +4b21c 4 83 53 +4b220 c 84 53 +4b22c 8 85 53 +4b234 14 86 53 +4b248 c 87 53 +4b254 8 88 53 +4b25c 8 93 36 +FUNC 4b264 6c 0 google_breakpad::CrashGenerator::HasDefaultCorePattern +4b264 4 108 53 +4b268 4 110 53 +4b26c 8 108 53 +4b274 c 111 53 +4b280 4 110 53 +4b284 10 111 53 +4b294 4 112 53 +4b298 4 111 53 +4b29c 4 112 53 +4b2a0 8 111 53 +4b2a8 1c 112 53 +4b2c4 c 113 53 +FUNC 4b2d0 c 0 google_breakpad::CrashGenerator::GetThreadId +4b2d0 4 124 53 +4b2d4 8 125 53 +FUNC 4b2dc c 0 google_breakpad::CrashGenerator::GetThreadIdPointer +4b2dc 4 128 53 +4b2e0 8 129 53 +FUNC 4b2e8 58 0 google_breakpad::CrashGenerator::UnmapSharedMemory +4b2e8 4 148 53 +4b2ec 4 150 53 +4b2f0 8 148 53 +4b2f8 4 148 53 +4b2fc 8 149 53 +4b304 c 152 53 +4b310 4 153 53 +4b314 4 155 53 +4b318 4 154 53 +4b31c 4 155 53 +4b320 c 158 53 +4b32c 4 159 53 +4b330 10 160 53 +FUNC 4b340 88 0 google_breakpad::CrashGenerator::MapSharedMemory +4b340 10 131 53 +4b350 8 131 53 +4b358 c 132 53 +4b364 1c 136 53 +4b380 4 137 53 +4b384 4 136 53 +4b388 4 137 53 +4b38c 4 138 53 +4b390 4 139 53 +4b394 c 138 53 +4b3a0 c 142 53 +4b3ac 4 143 53 +4b3b0 4 144 53 +4b3b4 14 146 53 +FUNC 4b3c8 44 0 google_breakpad::CrashGenerator::SetCoreFileSizeLimit +4b3c8 4 162 53 +4b3cc 4 164 53 +4b3d0 4 162 53 +4b3d4 8 163 53 +4b3dc c 164 53 +4b3e8 4 168 53 +4b3ec 4 164 53 +4b3f0 c 165 53 +4b3fc 4 166 53 +4b400 c 169 53 +FUNC 4b40c dc 0 google_breakpad::CrashGenerator::CopyProcFiles +4b40c 4 256 53 +4b410 4 265 53 +4b414 10 256 53 +4b424 4 260 53 +4b428 4 265 53 +4b42c c 256 53 +4b438 8 256 53 +4b440 4 258 53 +4b444 c 260 53 +4b450 8 265 53 +4b458 20 260 53 +4b478 8 261 53 +4b480 8 262 53 +4b488 18 265 53 +4b4a0 8 266 53 +4b4a8 14 269 53 +4b4bc 4 258 53 +4b4c0 8 258 53 +4b4c8 20 273 53 +FUNC 4b4e8 188 0 google_breakpad::CrashGenerator::CreateThreadsInChildProcess +4b4e8 20 275 53 +4b508 4 275 53 +4b50c 4 128 53 +4b510 4 276 53 +4b514 4 278 53 +4b518 4 276 53 +4b51c 4 278 53 +4b520 4 283 53 +4b524 4 288 53 +4b528 4 283 53 +4b52c 8 283 53 +4b534 c 288 53 +4b540 c 290 53 +4b54c 4 288 53 +4b550 10 291 53 +4b560 8 313 53 +4b568 8 314 53 +4b570 4 56 36 +4b574 8 57 36 +4b57c 4 56 36 +4b580 8 305 53 +4b588 4 57 36 +4b58c 10 58 36 +4b59c 4 305 53 +4b5a0 4 58 36 +4b5a4 4 302 53 +4b5a8 c 305 53 +4b5b4 8 128 53 +4b5bc 4 303 53 +4b5c0 8 305 53 +4b5c8 4 304 53 +4b5cc 20 306 53 +4b5ec 8 301 53 +4b5f4 c 301 53 +4b600 8 311 53 +4b608 14 312 53 +4b61c 14 313 53 +4b630 4 85 36 +4b634 4 84 36 +4b638 4 85 36 +4b63c 8 86 36 +4b644 8 318 53 +4b64c 8 319 53 +4b654 1c 320 53 +FUNC 4b670 54 0 testing::internal::scoped_ptr, std::allocator > >::reset +4b670 c 1152 87 +4b67c 10 1153 87 +4b68c 14 1154 87 +4b6a0 8 1155 87 +4b6a8 c 1155 87 +4b6b4 4 1157 87 +4b6b8 c 1159 87 +FUNC 4b6c4 28 0 google_breakpad::CrashGenerator::CrashGenerator +4b6c4 c 99 53 +4b6d0 4 99 53 +4b6d4 c 101 53 +4b6e0 c 102 53 +FUNC 4b6ec 30 0 google_breakpad::CrashGenerator::~CrashGenerator +4b6ec c 104 53 +4b6f8 4 104 53 +4b6fc 4 105 53 +4b700 c 61 63 +4b70c 4 156 132 +4b710 8 106 53 +4b718 4 156 132 +FUNC 4b71c 2c 0 google_breakpad::CrashGenerator::GetCoreFilePath +4b71c 4 115 53 +4b720 4 116 53 +4b724 4 115 53 +4b728 4 116 53 +4b72c 4 115 53 +4b730 4 115 53 +4b734 4 116 53 +4b738 10 117 53 +FUNC 4b748 2c 0 google_breakpad::CrashGenerator::GetDirectoryOfProcFilesCopy +4b748 4 119 53 +4b74c 4 120 53 +4b750 4 119 53 +4b754 4 120 53 +4b758 4 119 53 +4b75c 4 119 53 +4b760 4 120 53 +4b764 10 121 53 +FUNC 4b774 27c 0 google_breakpad::CrashGenerator::CreateChildCrash +4b774 4 173 53 +4b778 4 174 53 +4b77c 8 173 53 +4b784 8 174 53 +4b78c 4 173 53 +4b790 4 174 53 +4b794 c 173 53 +4b7a0 4 174 53 +4b7a4 10 173 53 +4b7b4 4 174 53 +4b7b8 24 176 53 +4b7dc 10 180 53 +4b7ec c 181 53 +4b7f8 4 182 53 +4b7fc 8 185 53 +4b804 4 186 53 +4b808 8 187 53 +4b810 8 187 53 +4b818 c 188 53 +4b824 14 191 53 +4b838 8 192 53 +4b840 4 193 53 +4b844 4 192 53 +4b848 c 193 53 +4b854 c 194 53 +4b860 8 194 53 +4b868 c 195 53 +4b874 8 198 53 +4b87c 10 198 53 +4b88c 4 198 53 +4b890 1c 199 53 +4b8ac 4 215 53 +4b8b0 8 128 53 +4b8b8 4 215 53 +4b8bc 4 214 53 +4b8c0 10 75 53 +4b8d0 8 214 53 +4b8d8 c 215 53 +4b8e4 8 226 53 +4b8ec 8 213 53 +4b8f4 c 156 132 +4b900 c 230 53 +4b90c 8 232 53 +4b914 4 233 53 +4b918 4 239 53 +4b91c 4 233 53 +4b920 4 234 53 +4b924 4 235 53 +4b928 8 234 53 +4b930 4 235 53 +4b934 18 239 53 +4b94c 4 239 53 +4b950 c 239 53 +4b95c 10 240 53 +4b96c 18 243 53 +4b984 8 243 53 +4b98c c 247 53 +4b998 8 247 53 +4b9a0 24 247 53 +4b9c4 4 251 53 +4b9c8 8 252 53 +4b9d0 4 241 53 +4b9d4 1c 254 53 +FUNC 4b9f0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4b9f0 4 484 85 +FUNC 4b9f4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4b9f4 4 484 85 +FUNC 4b9f8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4b9f8 4 484 85 +FUNC 4b9fc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4b9fc 4 484 85 +FUNC 4ba00 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4ba00 4 484 85 +FUNC 4ba04 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4ba04 4 484 85 +FUNC 4ba08 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4ba08 4 484 85 +FUNC 4ba0c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4ba0c 4 484 85 +FUNC 4ba10 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4ba10 4 484 85 +FUNC 4ba14 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4ba14 4 484 85 +FUNC 4ba18 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4ba18 4 484 85 +FUNC 4ba1c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4ba1c 4 484 85 +FUNC 4ba20 14 0 WastefulVectorTest_UsesPageAllocator_Test::~WastefulVectorTest_UsesPageAllocator_Test +4ba20 14 91 56 +FUNC 4ba34 24 0 WastefulVectorTest_UsesPageAllocator_Test::~WastefulVectorTest_UsesPageAllocator_Test +4ba34 c 91 56 +4ba40 8 91 56 +4ba48 4 91 56 +4ba4c 8 91 56 +4ba54 4 91 56 +FUNC 4ba58 14 0 WastefulVectorTest_Simple_Test::~WastefulVectorTest_Simple_Test +4ba58 14 76 56 +FUNC 4ba6c 24 0 WastefulVectorTest_Simple_Test::~WastefulVectorTest_Simple_Test +4ba6c c 76 56 +4ba78 8 76 56 +4ba80 4 76 56 +4ba84 8 76 56 +4ba8c 4 76 56 +FUNC 4ba90 14 0 WastefulVectorTest_Setup_Test::~WastefulVectorTest_Setup_Test +4ba90 14 69 56 +FUNC 4baa4 24 0 WastefulVectorTest_Setup_Test::~WastefulVectorTest_Setup_Test +4baa4 c 69 56 +4bab0 8 69 56 +4bab8 4 69 56 +4babc 8 69 56 +4bac4 4 69 56 +FUNC 4bac8 14 0 PageAllocatorTest_LargeObject_Test::~PageAllocatorTest_LargeObject_Test +4bac8 14 53 56 +FUNC 4badc 24 0 PageAllocatorTest_LargeObject_Test::~PageAllocatorTest_LargeObject_Test +4badc c 53 56 +4bae8 8 53 56 +4baf0 4 53 56 +4baf4 8 53 56 +4bafc 4 53 56 +FUNC 4bb00 14 0 PageAllocatorTest_SmallObjects_Test::~PageAllocatorTest_SmallObjects_Test +4bb00 14 43 56 +FUNC 4bb14 24 0 PageAllocatorTest_SmallObjects_Test::~PageAllocatorTest_SmallObjects_Test +4bb14 c 43 56 +4bb20 8 43 56 +4bb28 4 43 56 +4bb2c 8 43 56 +4bb34 4 43 56 +FUNC 4bb38 14 0 PageAllocatorTest_Setup_Test::~PageAllocatorTest_Setup_Test +4bb38 14 39 56 +FUNC 4bb4c 24 0 PageAllocatorTest_Setup_Test::~PageAllocatorTest_Setup_Test +4bb4c c 39 56 +4bb58 8 39 56 +4bb60 4 39 56 +4bb64 8 39 56 +4bb6c 4 39 56 +FUNC 4bb70 3c 0 testing::internal::TestFactoryImpl::CreateTest +4bb70 10 486 85 +4bb80 8 486 85 +4bb88 8 91 56 +4bb90 4 486 85 +4bb94 c 91 56 +4bba0 c 486 85 +FUNC 4bbac 3c 0 testing::internal::TestFactoryImpl::CreateTest +4bbac 10 486 85 +4bbbc 8 486 85 +4bbc4 8 76 56 +4bbcc 4 486 85 +4bbd0 c 76 56 +4bbdc c 486 85 +FUNC 4bbe8 3c 0 testing::internal::TestFactoryImpl::CreateTest +4bbe8 10 486 85 +4bbf8 8 486 85 +4bc00 8 69 56 +4bc08 4 486 85 +4bc0c c 69 56 +4bc18 c 486 85 +FUNC 4bc24 3c 0 testing::internal::TestFactoryImpl::CreateTest +4bc24 10 486 85 +4bc34 8 486 85 +4bc3c 8 53 56 +4bc44 4 486 85 +4bc48 c 53 56 +4bc54 c 486 85 +FUNC 4bc60 3c 0 testing::internal::TestFactoryImpl::CreateTest +4bc60 10 486 85 +4bc70 8 486 85 +4bc78 8 43 56 +4bc80 4 486 85 +4bc84 c 43 56 +4bc90 c 486 85 +FUNC 4bc9c 3c 0 testing::internal::TestFactoryImpl::CreateTest +4bc9c 10 486 85 +4bcac 8 486 85 +4bcb4 8 39 56 +4bcbc 4 486 85 +4bcc0 c 39 56 +4bccc c 486 85 +FUNC 4bcd8 34 0 google_breakpad::PageAllocator::PageAllocator +4bcd8 c 63 54 +4bce4 4 63 54 +4bce8 4 64 54 +4bcec 14 67 54 +4bd00 c 68 54 +FUNC 4bd0c fc 0 google_breakpad::PageAllocator::Alloc +4bd0c 10 74 54 +4bd1c 4 75 54 +4bd20 8 76 54 +4bd28 c 78 54 +4bd34 10 78 54 +4bd44 4 79 54 +4bd48 4 80 54 +4bd4c 8 81 54 +4bd54 8 80 54 +4bd5c 4 82 54 +4bd60 4 83 54 +4bd64 8 86 54 +4bd6c c 90 54 +4bd78 c 3940 97 +4bd84 4 90 54 +4bd88 4 3940 97 +4bd8c 4 119 54 +4bd90 18 3940 97 +4bda8 4 3940 97 +4bdac c 3940 97 +4bdb8 8 124 54 +4bdc0 8 134 54 +4bdc8 4 135 54 +4bdcc 4 136 54 +4bdd0 14 96 54 +4bde4 4 97 54 +4bde8 4 98 54 +4bdec 8 98 54 +4bdf4 4 98 54 +4bdf8 4 100 54 +4bdfc c 101 54 +FUNC 4be08 64 0 google_breakpad::PageAllocator::FreeAll +4be08 10 141 54 +4be18 4 141 54 +4be1c 4 144 54 +4be20 4 144 54 +4be24 8 146 54 +4be2c 4 145 54 +4be30 18 3074 97 +4be48 4 3074 97 +4be4c 8 3074 97 +4be54 8 141 54 +4be5c 10 148 54 +FUNC 4be6c 2c 0 PageAllocatorTest_Setup_Test::TestBody +4be6c c 39 56 +4be78 c 40 56 +4be84 8 71 54 +4be8c c 41 56 +FUNC 4be98 114 0 PageAllocatorTest_SmallObjects_Test::TestBody +4be98 10 43 56 +4bea8 4 44 56 +4beac 4 277 82 +4beb0 4 43 56 +4beb4 10 44 56 +4bec4 c 47 56 +4bed0 4 48 56 +4bed4 4 47 56 +4bed8 4 1139 87 +4bedc 4 48 56 +4bee0 4 277 82 +4bee4 4 48 56 +4bee8 24 48 56 +4bf0c 4 48 56 +4bf10 4 48 56 +4bf14 4 48 56 +4bf18 1c 48 56 +4bf34 8 48 56 +4bf3c c 48 56 +4bf48 8 85 79 +4bf50 8 48 56 +4bf58 8 156 132 +4bf60 14 256 82 +4bf74 14 49 56 +4bf88 8 46 56 +4bf90 8 71 54 +4bf98 14 51 56 +FUNC 4bfac 180 0 PageAllocatorTest_LargeObject_Test::TestBody +4bfac c 53 56 +4bfb8 4 54 56 +4bfbc 4 53 56 +4bfc0 4 54 56 +4bfc4 4 53 56 +4bfc8 4 54 56 +4bfcc 4 277 82 +4bfd0 10 56 56 +4bfe0 8 57 56 +4bfe8 4 1139 87 +4bfec 4 277 82 +4bff0 4 57 56 +4bff4 24 57 56 +4c018 4 57 56 +4c01c 4 57 56 +4c020 18 57 56 +4c038 c 256 82 +4c044 c 59 56 +4c050 4 60 56 +4c054 4 59 56 +4c058 4 1139 87 +4c05c 4 60 56 +4c060 4 277 82 +4c064 4 60 56 +4c068 24 60 56 +4c08c 4 60 56 +4c090 4 60 56 +4c094 18 60 56 +4c0ac 4 60 56 +4c0b0 4 60 56 +4c0b4 8 60 56 +4c0bc c 60 56 +4c0c8 8 85 79 +4c0d0 8 60 56 +4c0d8 8 156 132 +4c0e0 14 256 82 +4c0f4 14 61 56 +4c108 8 58 56 +4c110 8 71 54 +4c118 14 63 56 +FUNC 4c12c d4 0 std::priv::_Impl_vector >::push_back +4c12c 14 376 139 +4c140 14 380 139 +4c154 4 126 103 +4c158 10 382 139 +4c168 4 192 139 +4c16c 4 176 139 +4c170 10 192 139 +4c180 4 175 139 +4c184 10 176 139 +4c194 8 177 139 +4c19c 18 172 54 +4c1b4 4 112 138 +4c1b8 4 172 54 +4c1bc 8 224 100 +4c1c4 8 224 100 +4c1cc 4 224 100 +4c1d0 8 481 100 +4c1d8 4 118 138 +4c1dc 4 481 100 +4c1e0 4 666 139 +4c1e4 4 667 139 +4c1e8 4 668 139 +4c1ec 14 388 139 +FUNC 4c200 50 0 testing::internal::DefaultPrintTo +4c200 14 307 80 +4c214 4 310 80 +4c218 4 334 80 +4c21c 4 333 122 +4c220 4 334 80 +4c224 8 333 122 +4c22c 10 318 80 +4c23c 8 291 121 +4c244 8 334 80 +4c24c 4 291 121 +FUNC 4c250 a8 0 std::priv::_Impl_vector >::reserve +4c250 14 62 138 +4c264 4 62 138 +4c268 c 199 139 +4c274 8 63 138 +4c27c c 64 138 +4c288 c 41 138 +4c294 8 192 139 +4c29c 8 172 54 +4c2a4 4 192 139 +4c2a8 4 70 138 +4c2ac 8 172 54 +4c2b4 14 120 137 +4c2c8 8 172 54 +4c2d0 8 76 138 +4c2d8 4 666 139 +4c2dc 4 667 139 +4c2e0 4 668 139 +4c2e4 14 78 138 +FUNC 4c2f8 134 0 WastefulVectorTest_UsesPageAllocator_Test::TestBody +4c2f8 c 91 56 +4c304 4 92 56 +4c308 4 91 56 +4c30c 4 92 56 +4c310 4 95 56 +4c314 4 91 56 +4c318 4 92 56 +4c31c 4 67 139 +4c320 8 153 143 +4c328 8 67 139 +4c330 4 163 54 +4c334 4 481 101 +4c338 4 153 143 +4c33c 8 95 56 +4c344 10 173 143 +4c354 4 106 54 +4c358 4 108 54 +4c35c 4 106 54 +4c360 8 108 54 +4c368 10 108 54 +4c378 8 106 54 +4c380 4 109 54 +4c384 8 277 82 +4c38c 8 1139 87 +4c394 4 96 56 +4c398 1c 96 56 +4c3b4 4 96 56 +4c3b8 4 96 56 +4c3bc 4 96 56 +4c3c0 1c 96 56 +4c3dc 8 96 56 +4c3e4 c 96 56 +4c3f0 8 85 79 +4c3f8 8 96 56 +4c400 8 156 132 +4c408 8 256 82 +4c410 8 71 54 +4c418 14 97 56 +FUNC 4c42c b4 0 testing::internal::CmpHelperEQFailure +4c42c c 1464 82 +4c438 4 884 80 +4c43c 8 1464 82 +4c444 8 1464 82 +4c44c 8 884 80 +4c454 c 1464 82 +4c460 4 884 80 +4c464 8 263 121 +4c46c 4 75 127 +4c470 8 263 121 +4c478 c 75 127 +4c484 8 886 80 +4c48c 10 1382 82 +4c49c 1c 1471 82 +4c4b8 10 156 132 +4c4c8 18 1472 82 +FUNC 4c4e0 d8 0 WastefulVectorTest_Setup_Test::TestBody +4c4e0 c 69 56 +4c4ec 4 70 56 +4c4f0 4 277 82 +4c4f4 4 70 56 +4c4f8 4 69 56 +4c4fc 4 70 56 +4c500 4 256 82 +4c504 c 172 54 +4c510 4 1139 87 +4c514 8 277 82 +4c51c 8 256 82 +4c524 8 1482 82 +4c52c 8 73 56 +4c534 4 1144 87 +4c538 c 298 82 +4c544 8 298 82 +4c54c 18 73 56 +4c564 4 73 56 +4c568 4 73 56 +4c56c 8 73 56 +4c574 c 73 56 +4c580 8 85 79 +4c588 8 73 56 +4c590 10 256 82 +4c5a0 8 71 54 +4c5a8 10 74 56 +FUNC 4c5b8 84 0 testing::internal::CmpHelperEQFailure +4c5b8 c 1464 82 +4c5c4 8 1382 82 +4c5cc 4 1464 82 +4c5d0 8 1464 82 +4c5d8 8 1382 82 +4c5e0 8 1464 82 +4c5e8 14 1382 82 +4c5fc 1c 1471 82 +4c618 10 156 132 +4c628 14 1472 82 +FUNC 4c63c 478 0 WastefulVectorTest_Simple_Test::TestBody +4c63c 10 76 56 +4c64c 8 77 56 +4c654 8 76 56 +4c65c 4 67 139 +4c660 4 80 56 +4c664 8 76 56 +4c66c 4 1487 82 +4c670 4 76 56 +4c674 4 77 56 +4c678 4 67 139 +4c67c 8 153 143 +4c684 8 67 139 +4c68c 4 163 54 +4c690 4 1487 82 +4c694 4 481 101 +4c698 4 153 143 +4c69c 4 1487 82 +4c6a0 4 80 56 +4c6a4 4 1487 82 +4c6a8 4 256 82 +4c6ac 4 1487 82 +4c6b0 c 80 56 +4c6bc 10 173 143 +4c6cc 4 1482 82 +4c6d0 4 1481 82 +4c6d4 4 207 139 +4c6d8 c 1481 82 +4c6e4 8 1482 82 +4c6ec 10 1487 82 +4c6fc 8 82 56 +4c704 4 1144 87 +4c708 c 298 82 +4c714 8 298 82 +4c71c 1c 82 56 +4c738 8 256 82 +4c740 4 207 139 +4c744 8 202 139 +4c74c 4 207 139 +4c750 4 202 139 +4c754 8 1481 82 +4c75c c 1482 82 +4c768 8 884 80 +4c770 4 380 80 +4c774 4 75 127 +4c778 4 884 80 +4c77c 8 380 80 +4c784 4 75 127 +4c788 4 380 80 +4c78c c 75 127 +4c798 8 886 80 +4c7a0 c 884 80 +4c7ac 8 380 80 +4c7b4 4 75 127 +4c7b8 4 380 80 +4c7bc c 75 127 +4c7c8 8 886 80 +4c7d0 24 1471 82 +4c7f4 10 156 132 +4c804 8 83 56 +4c80c 4 1144 87 +4c810 c 298 82 +4c81c 8 298 82 +4c824 1c 83 56 +4c840 c 83 56 +4c84c c 83 56 +4c858 8 85 79 +4c860 8 83 56 +4c868 14 256 82 +4c87c 10 80 56 +4c88c 4 85 56 +4c890 4 277 82 +4c894 4 85 56 +4c898 8 1139 87 +4c8a0 8 85 56 +4c8a8 4 277 82 +4c8ac 4 1139 87 +4c8b0 4 85 56 +4c8b4 24 85 56 +4c8d8 1c 85 56 +4c8f4 8 85 56 +4c8fc c 85 56 +4c908 8 85 79 +4c910 8 85 56 +4c918 8 156 132 +4c920 10 256 82 +4c930 4 192 139 +4c934 4 1482 82 +4c938 c 192 139 +4c944 8 86 56 +4c94c 4 1481 82 +4c950 4 86 56 +4c954 4 1481 82 +4c958 8 1482 82 +4c960 1c 1487 82 +4c97c 8 86 56 +4c984 4 1144 87 +4c988 c 298 82 +4c994 8 298 82 +4c99c 18 86 56 +4c9b4 4 256 82 +4c9b8 4 1487 82 +4c9bc 4 256 82 +4c9c0 c 1487 82 +4c9cc 4 256 82 +4c9d0 8 87 56 +4c9d8 8 256 82 +4c9e0 c 87 56 +4c9ec c 87 56 +4c9f8 8 202 139 +4ca00 4 1482 82 +4ca04 4 202 139 +4ca08 c 1481 82 +4ca14 4 1482 82 +4ca18 8 88 56 +4ca20 4 1144 87 +4ca24 8 298 82 +4ca2c 18 88 56 +4ca44 8 88 56 +4ca4c c 88 56 +4ca58 8 85 79 +4ca60 8 88 56 +4ca68 14 1487 82 +4ca7c c 298 82 +4ca88 8 71 54 +4ca90 24 89 56 +FUNC 4cab4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cab4 4 484 85 +FUNC 4cab8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cab8 4 484 85 +FUNC 4cabc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cabc 4 484 85 +FUNC 4cac0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cac0 4 484 85 +FUNC 4cac4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cac4 4 484 85 +FUNC 4cac8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cac8 4 484 85 +FUNC 4cacc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cacc 4 484 85 +FUNC 4cad0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cad0 4 484 85 +FUNC 4cad4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cad4 4 484 85 +FUNC 4cad8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cad8 4 484 85 +FUNC 4cadc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cadc 4 484 85 +FUNC 4cae0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cae0 4 484 85 +FUNC 4cae4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cae4 4 484 85 +FUNC 4cae8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +4cae8 4 484 85 +FUNC 4caec 14 0 google_breakpad::NonAllocatingMapTest_OutOfSpace_Test::~NonAllocatingMapTest_OutOfSpace_Test +4caec 14 282 59 +FUNC 4cb00 24 0 google_breakpad::NonAllocatingMapTest_OutOfSpace_Test::~NonAllocatingMapTest_OutOfSpace_Test +4cb00 c 282 59 +4cb0c 8 282 59 +4cb14 4 282 59 +4cb18 8 282 59 +4cb20 4 282 59 +FUNC 4cb24 14 0 google_breakpad::NonAllocatingMapTest_Serialize_Test::~NonAllocatingMapTest_Serialize_Test +4cb24 14 253 59 +FUNC 4cb38 24 0 google_breakpad::NonAllocatingMapTest_Serialize_Test::~NonAllocatingMapTest_Serialize_Test +4cb38 c 253 59 +4cb44 8 253 59 +4cb4c 4 253 59 +4cb50 8 253 59 +4cb58 4 253 59 +FUNC 4cb5c 14 0 google_breakpad::NonAllocatingMapTest_AddRemove_Test::~NonAllocatingMapTest_AddRemove_Test +4cb5c 14 228 59 +FUNC 4cb70 24 0 google_breakpad::NonAllocatingMapTest_AddRemove_Test::~NonAllocatingMapTest_AddRemove_Test +4cb70 c 228 59 +4cb7c 8 228 59 +4cb84 4 228 59 +4cb88 8 228 59 +4cb90 4 228 59 +FUNC 4cb94 14 0 google_breakpad::NonAllocatingMapTest_Iterator_Test::~NonAllocatingMapTest_Iterator_Test +4cb94 14 127 59 +FUNC 4cba8 24 0 google_breakpad::NonAllocatingMapTest_Iterator_Test::~NonAllocatingMapTest_Iterator_Test +4cba8 c 127 59 +4cbb4 8 127 59 +4cbbc 4 127 59 +4cbc0 8 127 59 +4cbc8 4 127 59 +FUNC 4cbcc 14 0 google_breakpad::NonAllocatingMapTest_CopyAndAssign_Test::~NonAllocatingMapTest_CopyAndAssign_Test +4cbcc 14 92 59 +FUNC 4cbe0 24 0 google_breakpad::NonAllocatingMapTest_CopyAndAssign_Test::~NonAllocatingMapTest_CopyAndAssign_Test +4cbe0 c 92 59 +4cbec 8 92 59 +4cbf4 4 92 59 +4cbf8 8 92 59 +4cc00 4 92 59 +FUNC 4cc04 14 0 google_breakpad::NonAllocatingMapTest_SimpleStringDictionary_Test::~NonAllocatingMapTest_SimpleStringDictionary_Test +4cc04 14 63 59 +FUNC 4cc18 24 0 google_breakpad::NonAllocatingMapTest_SimpleStringDictionary_Test::~NonAllocatingMapTest_SimpleStringDictionary_Test +4cc18 c 63 59 +4cc24 8 63 59 +4cc2c 4 63 59 +4cc30 8 63 59 +4cc38 4 63 59 +FUNC 4cc3c 14 0 google_breakpad::NonAllocatingMapTest_Entry_Test::~NonAllocatingMapTest_Entry_Test +4cc3c 14 35 59 +FUNC 4cc50 24 0 google_breakpad::NonAllocatingMapTest_Entry_Test::~NonAllocatingMapTest_Entry_Test +4cc50 c 35 59 +4cc5c 8 35 59 +4cc64 4 35 59 +4cc68 8 35 59 +4cc70 4 35 59 +FUNC 4cc74 cc 0 google_breakpad::NonAllocatingMap<3ul, 2ul, 2ul>::SetKeyValue +4cc74 18 161 58 +4cc8c 8 161 58 +4cc94 28 240 58 +4ccbc 4 239 58 +4ccc0 8 240 58 +4ccc8 4 239 58 +4cccc 4 241 58 +4ccd0 8 179 58 +4ccd8 14 181 58 +4ccec 8 180 58 +4ccf4 4 181 58 +4ccf8 14 184 58 +4cd0c 4 182 58 +4cd10 4 184 58 +4cd14 4 185 58 +4cd18 10 206 58 +4cd28 4 207 58 +4cd2c 14 208 58 +FUNC 4cd40 b8 0 google_breakpad::NonAllocatingMap<5ul, 9ul, 15ul>::SetKeyValue +4cd40 14 161 58 +4cd54 14 161 58 +4cd68 18 240 58 +4cd80 10 239 58 +4cd90 c 181 58 +4cd9c 10 184 58 +4cdac 10 185 58 +4cdbc 8 180 58 +4cdc4 c 180 58 +4cdd0 10 206 58 +4cde0 4 207 58 +4cde4 14 208 58 +FUNC 4cdf8 3c 0 testing::internal::TestFactoryImpl::CreateTest +4cdf8 10 486 85 +4ce08 8 486 85 +4ce10 8 282 59 +4ce18 4 486 85 +4ce1c c 282 59 +4ce28 c 486 85 +FUNC 4ce34 3c 0 testing::internal::TestFactoryImpl::CreateTest +4ce34 10 486 85 +4ce44 8 486 85 +4ce4c 8 63 59 +4ce54 4 486 85 +4ce58 c 63 59 +4ce64 c 486 85 +FUNC 4ce70 3c 0 testing::internal::TestFactoryImpl::CreateTest +4ce70 10 486 85 +4ce80 8 486 85 +4ce88 8 35 59 +4ce90 4 486 85 +4ce94 c 35 59 +4cea0 c 486 85 +FUNC 4ceac 3c 0 testing::internal::TestFactoryImpl::CreateTest +4ceac 10 486 85 +4cebc 8 486 85 +4cec4 8 253 59 +4cecc 4 486 85 +4ced0 c 253 59 +4cedc c 486 85 +FUNC 4cee8 3c 0 testing::internal::TestFactoryImpl::CreateTest +4cee8 10 486 85 +4cef8 8 486 85 +4cf00 8 228 59 +4cf08 4 486 85 +4cf0c c 228 59 +4cf18 c 486 85 +FUNC 4cf24 3c 0 testing::internal::TestFactoryImpl::CreateTest +4cf24 10 486 85 +4cf34 8 486 85 +4cf3c 8 127 59 +4cf44 4 486 85 +4cf48 c 127 59 +4cf54 c 486 85 +FUNC 4cf60 3c 0 testing::internal::TestFactoryImpl::CreateTest +4cf60 10 486 85 +4cf70 8 486 85 +4cf78 8 92 59 +4cf80 4 486 85 +4cf84 c 92 59 +4cf90 c 486 85 +FUNC 4cf9c 28 0 google_breakpad::NonAllocatingMap<5ul, 7ul, 6ul>::GetCount +4cf9c 8 133 58 +4cfa4 14 134 58 +4cfb8 8 135 58 +4cfc0 4 141 58 +FUNC 4cfc4 5c 0 google_breakpad::NonAllocatingMap<256ul, 256ul, 64ul>::GetConstEntryForKey +4cfc4 10 238 58 +4cfd4 10 238 58 +4cfe4 18 240 58 +4cffc 8 239 58 +4d004 c 244 58 +4d010 10 245 58 +FUNC 4d020 24 0 google_breakpad::NonAllocatingMap<256ul, 256ul, 64ul>::RemoveKey +4d020 8 212 58 +4d028 4 214 58 +4d02c 4 248 58 +4d030 4 218 58 +4d034 4 219 58 +4d038 4 220 58 +4d03c 8 226 58 +FUNC 4d044 c0 0 google_breakpad::NonAllocatingMap<256ul, 256ul, 64ul>::SetKeyValue +4d044 14 161 58 +4d058 4 161 58 +4d05c 4 162 58 +4d060 10 208 58 +4d070 4 163 58 +4d074 4 168 58 +4d078 14 173 58 +4d08c 8 248 58 +4d094 c 179 58 +4d0a0 8 181 58 +4d0a8 4 185 58 +4d0ac 4 184 58 +4d0b0 4 181 58 +4d0b4 c 184 58 +4d0c0 8 185 58 +4d0c8 8 180 58 +4d0d0 c 180 58 +4d0dc 10 206 58 +4d0ec 4 207 58 +4d0f0 14 208 58 +FUNC 4d104 5c 0 google_breakpad::NonAllocatingMap<10ul, 10ul, 10ul>::GetConstEntryForKey +4d104 10 238 58 +4d114 10 238 58 +4d124 18 240 58 +4d13c 8 239 58 +4d144 c 244 58 +4d150 10 245 58 +FUNC 4d160 24 0 google_breakpad::NonAllocatingMap<10ul, 10ul, 10ul>::RemoveKey +4d160 8 212 58 +4d168 4 214 58 +4d16c 4 248 58 +4d170 4 218 58 +4d174 4 219 58 +4d178 4 220 58 +4d17c 8 226 58 +FUNC 4d184 c4 0 google_breakpad::NonAllocatingMap<10ul, 10ul, 10ul>::SetKeyValue +4d184 14 161 58 +4d198 4 161 58 +4d19c 4 162 58 +4d1a0 10 208 58 +4d1b0 4 163 58 +4d1b4 4 168 58 +4d1b8 14 173 58 +4d1cc 8 248 58 +4d1d4 c 179 58 +4d1e0 8 181 58 +4d1e8 4 184 58 +4d1ec 4 181 58 +4d1f0 c 184 58 +4d1fc 10 185 58 +4d20c 8 180 58 +4d214 c 180 58 +4d220 10 206 58 +4d230 4 207 58 +4d234 14 208 58 +FUNC 4d248 2c 0 google_breakpad::NonAllocatingMap<10ul, 10ul, 10ul>::GetValueForKey +4d248 4 145 58 +4d24c 4 148 58 +4d250 4 145 58 +4d254 4 147 58 +4d258 4 150 58 +4d25c c 154 58 +4d268 c 155 58 +FUNC 4d274 5c 0 google_breakpad::NonAllocatingMap<5ul, 7ul, 6ul>::GetConstEntryForKey +4d274 10 238 58 +4d284 10 238 58 +4d294 18 240 58 +4d2ac 8 239 58 +4d2b4 c 244 58 +4d2c0 10 245 58 +FUNC 4d2d0 24 0 google_breakpad::NonAllocatingMap<5ul, 7ul, 6ul>::RemoveKey +4d2d0 8 212 58 +4d2d8 4 214 58 +4d2dc 4 248 58 +4d2e0 4 218 58 +4d2e4 4 219 58 +4d2e8 4 220 58 +4d2ec 8 226 58 +FUNC 4d2f4 c4 0 google_breakpad::NonAllocatingMap<5ul, 7ul, 6ul>::SetKeyValue +4d2f4 14 161 58 +4d308 4 161 58 +4d30c 4 162 58 +4d310 10 208 58 +4d320 4 163 58 +4d324 4 168 58 +4d328 14 173 58 +4d33c 8 248 58 +4d344 c 179 58 +4d350 8 181 58 +4d358 4 184 58 +4d35c 4 181 58 +4d360 c 184 58 +4d36c 10 185 58 +4d37c 8 180 58 +4d384 c 180 58 +4d390 10 206 58 +4d3a0 4 207 58 +4d3a4 14 208 58 +FUNC 4d3b8 5c 0 google_breakpad::NonAllocatingMap<4ul, 5ul, 7ul>::GetConstEntryForKey +4d3b8 10 238 58 +4d3c8 10 238 58 +4d3d8 18 240 58 +4d3f0 8 239 58 +4d3f8 c 244 58 +4d404 10 245 58 +FUNC 4d414 9c 0 google_breakpad::NonAllocatingMap<4ul, 5ul, 7ul>::SetKeyValue +4d414 14 161 58 +4d428 c 161 58 +4d434 8 248 58 +4d43c c 179 58 +4d448 8 181 58 +4d450 4 185 58 +4d454 4 184 58 +4d458 4 185 58 +4d45c 8 184 58 +4d464 4 181 58 +4d468 4 184 58 +4d46c 8 185 58 +4d474 8 180 58 +4d47c c 180 58 +4d488 10 206 58 +4d498 4 207 58 +4d49c 14 208 58 +FUNC 4d4b0 600 0 google_breakpad::NonAllocatingMapTest_Entry_Test::TestBody +4d4b0 20 35 59 +4d4d0 10 104 58 +4d4e0 4 104 58 +4d4e4 8 104 58 +4d4ec 14 104 58 +4d500 8 90 58 +4d508 8 88 58 +4d510 8 94 58 +4d518 4 91 58 +4d51c 4 277 82 +4d520 8 40 59 +4d528 4 1139 87 +4d52c 4 277 82 +4d530 4 40 59 +4d534 24 40 59 +4d558 4 40 59 +4d55c 4 40 59 +4d560 4 40 59 +4d564 1c 40 59 +4d580 8 40 59 +4d588 c 40 59 +4d594 8 85 79 +4d59c 8 40 59 +4d5a4 8 156 132 +4d5ac 34 256 82 +4d5e0 8 90 58 +4d5e8 8 88 58 +4d5f0 4 94 58 +4d5f4 4 1139 87 +4d5f8 10 277 82 +4d608 4 1139 87 +4d60c 4 45 59 +4d610 20 45 59 +4d630 4 45 59 +4d634 4 45 59 +4d638 4 45 59 +4d63c 1c 45 59 +4d658 8 45 59 +4d660 c 45 59 +4d66c 8 85 79 +4d674 8 45 59 +4d67c 8 156 132 +4d684 c 256 82 +4d690 c 46 59 +4d69c 8 256 82 +4d6a4 20 46 59 +4d6c4 4 302 82 +4d6c8 4 46 59 +4d6cc 8 302 82 +4d6d4 18 46 59 +4d6ec 8 46 59 +4d6f4 c 46 59 +4d700 8 85 79 +4d708 8 46 59 +4d710 4 256 82 +4d714 8 47 59 +4d71c 4 256 82 +4d720 24 47 59 +4d744 4 302 82 +4d748 4 47 59 +4d74c 8 302 82 +4d754 18 47 59 +4d76c 8 47 59 +4d774 c 47 59 +4d780 8 85 79 +4d788 8 47 59 +4d790 24 256 82 +4d7b4 24 51 59 +4d7d8 4 302 82 +4d7dc 4 51 59 +4d7e0 8 302 82 +4d7e8 18 51 59 +4d800 8 51 59 +4d808 c 51 59 +4d814 8 85 79 +4d81c 8 51 59 +4d824 8 256 82 +4d82c 20 54 59 +4d84c 4 302 82 +4d850 4 54 59 +4d854 8 302 82 +4d85c 18 54 59 +4d874 8 54 59 +4d87c c 54 59 +4d888 8 85 79 +4d890 8 54 59 +4d898 8 256 82 +4d8a0 4 240 58 +4d8a4 8 256 82 +4d8ac 14 240 58 +4d8c0 4 219 58 +4d8c4 c 220 58 +4d8d0 8 239 58 +4d8d8 8 58 59 +4d8e0 4 1139 87 +4d8e4 8 58 59 +4d8ec 4 277 82 +4d8f0 4 58 59 +4d8f4 20 58 59 +4d914 4 58 59 +4d918 4 58 59 +4d91c 1c 58 59 +4d938 8 58 59 +4d940 c 58 59 +4d94c 8 85 79 +4d954 8 58 59 +4d95c 8 156 132 +4d964 8 256 82 +4d96c 10 59 59 +4d97c 4 1482 82 +4d980 4 1481 82 +4d984 8 1482 82 +4d98c 1c 1487 82 +4d9a8 8 59 59 +4d9b0 c 302 82 +4d9bc 18 59 59 +4d9d4 8 59 59 +4d9dc c 59 59 +4d9e8 8 85 79 +4d9f0 8 59 59 +4d9f8 8 256 82 +4da00 10 60 59 +4da10 4 1482 82 +4da14 4 1481 82 +4da18 8 1482 82 +4da20 1c 1487 82 +4da3c 8 60 59 +4da44 c 302 82 +4da50 18 60 59 +4da68 8 60 59 +4da70 c 60 59 +4da7c 8 85 79 +4da84 8 60 59 +4da8c 8 256 82 +4da94 1c 61 59 +FUNC 4dab0 990 0 google_breakpad::NonAllocatingMapTest_CopyAndAssign_Test::TestBody +4dab0 30 92 59 +4dae0 4 104 58 +4dae4 4 92 59 +4dae8 8 104 58 +4daf0 4 104 58 +4daf4 8 104 58 +4dafc 4 104 58 +4db00 14 94 59 +4db14 8 95 59 +4db1c 4 96 59 +4db20 4 94 59 +4db24 4 96 59 +4db28 14 95 59 +4db3c 10 96 59 +4db4c 8 97 59 +4db54 4 98 59 +4db58 4 97 59 +4db5c 14 98 59 +4db70 14 134 58 +4db84 8 135 58 +4db8c 4 98 59 +4db90 4 1512 82 +4db94 4 98 59 +4db98 20 1512 82 +4dbb8 c 98 59 +4dbc4 c 302 82 +4dbd0 18 98 59 +4dbe8 8 98 59 +4dbf0 c 98 59 +4dbfc 8 85 79 +4dc04 8 98 59 +4dc0c 4 256 82 +4dc10 4 102 59 +4dc14 4 256 82 +4dc18 10 117 58 +4dc28 c 102 59 +4dc34 14 134 58 +4dc48 8 135 58 +4dc50 4 1512 82 +4dc54 4 102 59 +4dc58 1c 1512 82 +4dc74 8 102 59 +4dc7c c 302 82 +4dc88 18 102 59 +4dca0 8 102 59 +4dca8 c 102 59 +4dcb4 8 85 79 +4dcbc 8 102 59 +4dcc4 4 256 82 +4dcc8 8 103 59 +4dcd0 4 256 82 +4dcd4 10 103 59 +4dce4 14 103 59 +4dcf8 c 103 59 +4dd04 c 302 82 +4dd10 18 103 59 +4dd28 8 103 59 +4dd30 c 103 59 +4dd3c 8 85 79 +4dd44 8 103 59 +4dd4c 4 256 82 +4dd50 4 104 59 +4dd54 4 256 82 +4dd58 14 104 59 +4dd6c 1c 104 59 +4dd88 c 104 59 +4dd94 c 302 82 +4dda0 18 104 59 +4ddb8 8 104 59 +4ddc0 c 104 59 +4ddcc 8 85 79 +4ddd4 8 104 59 +4dddc 4 256 82 +4dde0 4 105 59 +4dde4 4 256 82 +4dde8 24 105 59 +4de0c 8 106 59 +4de14 4 106 59 +4de18 8 106 59 +4de20 20 106 59 +4de40 10 106 59 +4de50 c 302 82 +4de5c 18 106 59 +4de74 8 106 59 +4de7c c 106 59 +4de88 8 85 79 +4de90 8 106 59 +4de98 8 256 82 +4dea0 18 107 59 +4deb8 4 1139 87 +4debc 4 277 82 +4dec0 4 107 59 +4dec4 20 107 59 +4dee4 4 107 59 +4dee8 4 107 59 +4deec 1c 107 59 +4df08 8 107 59 +4df10 c 107 59 +4df1c 8 85 79 +4df24 8 107 59 +4df2c 8 156 132 +4df34 c 256 82 +4df40 8 104 58 +4df48 4 104 58 +4df4c 8 104 58 +4df54 4 104 58 +4df58 8 117 58 +4df60 4 112 59 +4df64 4 117 58 +4df68 c 112 59 +4df74 14 134 58 +4df88 8 135 58 +4df90 4 112 59 +4df94 20 1512 82 +4dfb4 8 112 59 +4dfbc c 302 82 +4dfc8 18 112 59 +4dfe0 8 112 59 +4dfe8 c 112 59 +4dff4 8 85 79 +4dffc 8 112 59 +4e004 8 256 82 +4e00c 10 113 59 +4e01c 20 113 59 +4e03c c 113 59 +4e048 c 302 82 +4e054 18 113 59 +4e06c 8 113 59 +4e074 c 113 59 +4e080 8 85 79 +4e088 8 113 59 +4e090 8 256 82 +4e098 14 114 59 +4e0ac 20 114 59 +4e0cc 8 114 59 +4e0d4 c 302 82 +4e0e0 18 114 59 +4e0f8 8 114 59 +4e100 c 114 59 +4e10c 8 85 79 +4e114 8 114 59 +4e11c 4 256 82 +4e120 4 115 59 +4e124 4 256 82 +4e128 1c 115 59 +4e144 14 116 59 +4e158 1c 116 59 +4e174 8 116 59 +4e17c c 302 82 +4e188 18 116 59 +4e1a0 8 116 59 +4e1a8 c 116 59 +4e1b4 8 85 79 +4e1bc 8 116 59 +4e1c4 8 256 82 +4e1cc 18 117 59 +4e1e4 4 1139 87 +4e1e8 4 277 82 +4e1ec 4 117 59 +4e1f0 20 117 59 +4e210 4 117 59 +4e214 4 117 59 +4e218 1c 117 59 +4e234 8 117 59 +4e23c c 117 59 +4e248 8 85 79 +4e250 8 117 59 +4e258 8 156 132 +4e260 4 256 82 +4e264 4 119 59 +4e268 4 256 82 +4e26c c 119 59 +4e278 14 120 59 +4e28c 4 1139 87 +4e290 4 277 82 +4e294 4 120 59 +4e298 20 120 59 +4e2b8 4 120 59 +4e2bc 4 120 59 +4e2c0 1c 120 59 +4e2dc 8 120 59 +4e2e4 c 120 59 +4e2f0 8 85 79 +4e2f8 8 120 59 +4e300 8 156 132 +4e308 8 256 82 +4e310 10 121 59 +4e320 18 121 59 +4e338 8 121 59 +4e340 c 302 82 +4e34c 18 121 59 +4e364 8 121 59 +4e36c c 121 59 +4e378 8 85 79 +4e380 8 121 59 +4e388 8 256 82 +4e390 10 122 59 +4e3a0 18 122 59 +4e3b8 8 122 59 +4e3c0 c 302 82 +4e3cc 18 122 59 +4e3e4 8 122 59 +4e3ec c 122 59 +4e3f8 8 85 79 +4e400 8 122 59 +4e408 8 256 82 +4e410 30 123 59 +FUNC 4e440 6a8 0 google_breakpad::NonAllocatingMapTest_AddRemove_Test::TestBody +4e440 4 228 59 +4e444 4 230 59 +4e448 c 228 59 +4e454 c 104 58 +4e460 4 230 59 +4e464 4 228 59 +4e468 4 104 58 +4e46c 4 1512 82 +4e470 4 104 58 +4e474 4 1512 82 +4e478 4 104 58 +4e47c 4 1512 82 +4e480 c 104 58 +4e48c c 228 59 +4e498 4 104 58 +4e49c 4 230 59 +4e4a0 4 104 58 +4e4a4 c 230 59 +4e4b0 4 231 59 +4e4b4 8 104 58 +4e4bc 4 231 59 +4e4c0 4 104 58 +4e4c4 4 230 59 +4e4c8 c 231 59 +4e4d4 8 232 59 +4e4dc 4 1512 82 +4e4e0 4 231 59 +4e4e4 10 232 59 +4e4f4 14 234 59 +4e508 20 1512 82 +4e528 18 234 59 +4e540 c 302 82 +4e54c 18 234 59 +4e564 8 234 59 +4e56c c 234 59 +4e578 8 85 79 +4e580 8 234 59 +4e588 8 256 82 +4e590 10 150 58 +4e5a0 4 154 58 +4e5a4 4 235 59 +4e5a8 4 154 58 +4e5ac 20 235 59 +4e5cc 8 235 59 +4e5d4 c 302 82 +4e5e0 18 235 59 +4e5f8 8 235 59 +4e600 c 235 59 +4e60c 8 85 79 +4e614 8 235 59 +4e61c 4 256 82 +4e620 4 236 59 +4e624 4 256 82 +4e628 c 150 58 +4e634 8 154 58 +4e63c 20 236 59 +4e65c 8 236 59 +4e664 c 302 82 +4e670 18 236 59 +4e688 8 236 59 +4e690 c 236 59 +4e69c 8 85 79 +4e6a4 8 236 59 +4e6ac 4 256 82 +4e6b0 4 237 59 +4e6b4 4 256 82 +4e6b8 c 150 58 +4e6c4 8 154 58 +4e6cc 1c 237 59 +4e6e8 8 237 59 +4e6f0 c 302 82 +4e6fc 18 237 59 +4e714 8 237 59 +4e71c c 237 59 +4e728 8 85 79 +4e730 8 237 59 +4e738 4 256 82 +4e73c 4 1512 82 +4e740 4 256 82 +4e744 c 239 59 +4e750 14 241 59 +4e764 18 1512 82 +4e77c 8 241 59 +4e784 c 302 82 +4e790 18 241 59 +4e7a8 8 241 59 +4e7b0 c 241 59 +4e7bc 8 85 79 +4e7c4 8 241 59 +4e7cc 8 256 82 +4e7d4 c 150 58 +4e7e0 8 154 58 +4e7e8 4 1139 87 +4e7ec 4 154 58 +4e7f0 8 242 59 +4e7f8 4 277 82 +4e7fc 4 242 59 +4e800 1c 242 59 +4e81c 4 242 59 +4e820 4 242 59 +4e824 1c 242 59 +4e840 8 242 59 +4e848 c 242 59 +4e854 8 85 79 +4e85c 8 242 59 +4e864 8 156 132 +4e86c 4 256 82 +4e870 4 244 59 +4e874 4 256 82 +4e878 10 244 59 +4e888 14 245 59 +4e89c 18 1512 82 +4e8b4 8 245 59 +4e8bc c 302 82 +4e8c8 18 245 59 +4e8e0 8 245 59 +4e8e8 c 245 59 +4e8f4 8 85 79 +4e8fc 8 245 59 +4e904 8 256 82 +4e90c c 150 58 +4e918 8 154 58 +4e920 1c 246 59 +4e93c 8 246 59 +4e944 c 302 82 +4e950 18 246 59 +4e968 8 246 59 +4e970 c 246 59 +4e97c 8 85 79 +4e984 8 246 59 +4e98c 4 256 82 +4e990 4 249 59 +4e994 4 256 82 +4e998 c 248 59 +4e9a4 10 249 59 +4e9b4 1c 1512 82 +4e9d0 8 249 59 +4e9d8 c 302 82 +4e9e4 18 249 59 +4e9fc 8 249 59 +4ea04 c 249 59 +4ea10 8 85 79 +4ea18 8 249 59 +4ea20 8 256 82 +4ea28 c 150 58 +4ea34 8 154 58 +4ea3c 4 1139 87 +4ea40 4 154 58 +4ea44 8 250 59 +4ea4c 4 277 82 +4ea50 4 250 59 +4ea54 1c 250 59 +4ea70 4 250 59 +4ea74 4 250 59 +4ea78 1c 250 59 +4ea94 8 250 59 +4ea9c c 250 59 +4eaa8 8 85 79 +4eab0 8 250 59 +4eab8 8 156 132 +4eac0 8 256 82 +4eac8 20 251 59 +FUNC 4eae8 5a4 0 google_breakpad::NonAllocatingMapTest_Serialize_Test::TestBody +4eae8 24 253 59 +4eb0c 4 104 58 +4eb10 4 253 59 +4eb14 c 104 58 +4eb20 4 104 58 +4eb24 4 104 58 +4eb28 54 104 58 +4eb7c c 150 58 +4eb88 10 154 58 +4eb98 24 260 59 +4ebbc 10 260 59 +4ebcc 4 302 82 +4ebd0 4 260 59 +4ebd4 8 302 82 +4ebdc 18 260 59 +4ebf4 8 260 59 +4ebfc c 260 59 +4ec08 8 85 79 +4ec10 8 260 59 +4ec18 4 256 82 +4ec1c 4 261 59 +4ec20 4 256 82 +4ec24 c 150 58 +4ec30 8 154 58 +4ec38 1c 261 59 +4ec54 8 261 59 +4ec5c 4 302 82 +4ec60 4 261 59 +4ec64 8 302 82 +4ec6c 18 261 59 +4ec84 8 261 59 +4ec8c c 261 59 +4ec98 8 85 79 +4eca0 8 261 59 +4eca8 4 256 82 +4ecac 4 262 59 +4ecb0 4 256 82 +4ecb4 c 150 58 +4ecc0 8 154 58 +4ecc8 1c 262 59 +4ece4 8 262 59 +4ecec 4 302 82 +4ecf0 4 262 59 +4ecf4 8 302 82 +4ecfc 18 262 59 +4ed14 8 262 59 +4ed1c c 262 59 +4ed28 8 85 79 +4ed30 8 262 59 +4ed38 8 256 82 +4ed40 8 268 59 +4ed48 4 277 82 +4ed4c 4 268 59 +4ed50 4 1139 87 +4ed54 c 277 82 +4ed60 4 269 59 +4ed64 24 269 59 +4ed88 4 269 59 +4ed8c 4 269 59 +4ed90 4 269 59 +4ed94 1c 269 59 +4edb0 8 269 59 +4edb8 c 269 59 +4edc4 8 85 79 +4edcc 8 269 59 +4edd4 8 156 132 +4eddc 14 256 82 +4edf0 10 270 59 +4ee00 10 127 58 +4ee10 8 273 59 +4ee18 c 275 59 +4ee24 14 134 58 +4ee38 8 135 58 +4ee40 4 275 59 +4ee44 28 1512 82 +4ee6c 8 275 59 +4ee74 c 302 82 +4ee80 18 275 59 +4ee98 8 275 59 +4eea0 c 275 59 +4eeac 8 85 79 +4eeb4 8 275 59 +4eebc 8 256 82 +4eec4 10 150 58 +4eed4 8 154 58 +4eedc 24 276 59 +4ef00 8 276 59 +4ef08 c 302 82 +4ef14 18 276 59 +4ef2c 8 276 59 +4ef34 c 276 59 +4ef40 8 85 79 +4ef48 8 276 59 +4ef50 8 256 82 +4ef58 c 150 58 +4ef64 8 154 58 +4ef6c 1c 277 59 +4ef88 8 277 59 +4ef90 c 302 82 +4ef9c 18 277 59 +4efb4 8 277 59 +4efbc c 277 59 +4efc8 8 85 79 +4efd0 8 277 59 +4efd8 8 256 82 +4efe0 c 150 58 +4efec 8 154 58 +4eff4 1c 278 59 +4f010 8 278 59 +4f018 c 302 82 +4f024 18 278 59 +4f03c 8 278 59 +4f044 c 278 59 +4f050 8 85 79 +4f058 8 278 59 +4f060 8 256 82 +4f068 24 279 59 +FUNC 4f08c 218 0 google_breakpad::NonAllocatingMapTest_OutOfSpace_Test::TestBody +4f08c 14 282 59 +4f0a0 10 104 58 +4f0b0 c 282 59 +4f0bc 4 104 58 +4f0c0 4 1512 82 +4f0c4 4 104 58 +4f0c8 4 1512 82 +4f0cc 4 104 58 +4f0d0 4 1512 82 +4f0d4 8 104 58 +4f0dc c 104 58 +4f0e8 38 104 58 +4f120 8 287 59 +4f128 4 136 58 +4f12c 4 1512 82 +4f130 4 136 58 +4f134 4 1512 82 +4f138 4 136 58 +4f13c 4 1512 82 +4f140 4 136 58 +4f144 8 137 58 +4f14c 4 1512 82 +4f150 4 287 59 +4f154 10 1512 82 +4f164 8 287 59 +4f16c c 302 82 +4f178 18 287 59 +4f190 8 287 59 +4f198 c 287 59 +4f1a4 8 85 79 +4f1ac 8 287 59 +4f1b4 4 256 82 +4f1b8 4 240 58 +4f1bc 4 256 82 +4f1c0 24 240 58 +4f1e4 4 152 58 +4f1e8 4 240 58 +4f1ec 8 239 58 +4f1f4 4 239 58 +4f1f8 c 154 58 +4f204 4 288 59 +4f208 4 1139 87 +4f20c 4 288 59 +4f210 4 277 82 +4f214 4 288 59 +4f218 20 288 59 +4f238 4 288 59 +4f23c 4 288 59 +4f240 1c 288 59 +4f25c 8 288 59 +4f264 c 288 59 +4f270 8 85 79 +4f278 8 288 59 +4f280 8 156 132 +4f288 8 256 82 +4f290 14 289 59 +FUNC 4f2a4 144 0 testing::internal::CmpHelperOpFailure +4f2a4 c 1579 82 +4f2b0 4 1583 82 +4f2b4 4 1579 82 +4f2b8 4 1583 82 +4f2bc 14 1579 82 +4f2d0 4 1408 82 +4f2d4 4 1579 82 +4f2d8 4 1408 82 +4f2dc 4 1579 82 +4f2e0 4 1583 82 +4f2e4 10 1583 82 +4f2f4 8 1583 82 +4f2fc c 1583 82 +4f308 8 1583 82 +4f310 c 1583 82 +4f31c 8 1583 82 +4f324 10 1584 82 +4f334 18 1408 82 +4f34c 10 1584 82 +4f35c 8 306 82 +4f364 14 333 122 +4f378 c 306 82 +4f384 8 85 79 +4f38c 14 1408 82 +4f3a0 10 1585 82 +4f3b0 8 1585 82 +4f3b8 10 156 132 +4f3c8 8 256 82 +4f3d0 18 1586 82 +FUNC 4f3e8 40 0 testing::internal::CmpHelperNE +4f3e8 10 1615 82 +4f3f8 c 1615 82 +4f404 4 1615 82 +4f408 4 1615 82 +4f40c c 1615 82 +4f418 10 1615 82 +FUNC 4f428 57c 0 google_breakpad::NonAllocatingMapTest_SimpleStringDictionary_Test::TestBody +4f428 20 63 59 +4f448 4 63 59 +4f44c 18 104 58 +4f464 8 104 58 +4f46c 20 68 59 +4f48c 8 69 59 +4f494 4 68 59 +4f498 4 70 59 +4f49c c 69 59 +4f4a8 4 70 59 +4f4ac 4 72 59 +4f4b0 4 69 59 +4f4b4 10 70 59 +4f4c4 8 150 58 +4f4cc 4 72 59 +4f4d0 4 150 58 +4f4d4 8 154 58 +4f4dc 4 72 59 +4f4e0 4 154 58 +4f4e4 4 72 59 +4f4e8 4 72 59 +4f4ec 18 72 59 +4f504 8 72 59 +4f50c 4 302 82 +4f510 4 72 59 +4f514 8 302 82 +4f51c 18 72 59 +4f534 8 72 59 +4f53c c 72 59 +4f548 8 85 79 +4f550 8 72 59 +4f558 4 256 82 +4f55c 4 73 59 +4f560 4 256 82 +4f564 4 73 59 +4f568 4 256 82 +4f56c c 150 58 +4f578 8 154 58 +4f580 4 73 59 +4f584 4 154 58 +4f588 4 73 59 +4f58c 4 73 59 +4f590 14 73 59 +4f5a4 8 73 59 +4f5ac 4 302 82 +4f5b0 4 73 59 +4f5b4 8 302 82 +4f5bc 18 73 59 +4f5d4 8 73 59 +4f5dc c 73 59 +4f5e8 8 85 79 +4f5f0 8 73 59 +4f5f8 4 256 82 +4f5fc 4 74 59 +4f600 4 256 82 +4f604 4 74 59 +4f608 4 256 82 +4f60c c 150 58 +4f618 8 154 58 +4f620 4 74 59 +4f624 4 154 58 +4f628 4 74 59 +4f62c 4 74 59 +4f630 14 74 59 +4f644 8 74 59 +4f64c 4 302 82 +4f650 4 74 59 +4f654 8 302 82 +4f65c 18 74 59 +4f674 8 74 59 +4f67c c 74 59 +4f688 8 85 79 +4f690 8 74 59 +4f698 c 256 82 +4f6a4 14 134 58 +4f6b8 8 135 58 +4f6c0 c 75 59 +4f6cc 4 1481 82 +4f6d0 c 75 59 +4f6dc 4 1481 82 +4f6e0 8 1482 82 +4f6e8 14 1487 82 +4f6fc c 75 59 +4f708 4 302 82 +4f70c 8 75 59 +4f714 4 302 82 +4f718 10 75 59 +4f728 4 75 59 +4f72c 4 75 59 +4f730 8 75 59 +4f738 c 75 59 +4f744 8 85 79 +4f74c 8 75 59 +4f754 c 256 82 +4f760 10 150 58 +4f770 8 154 58 +4f778 4 1139 87 +4f77c 4 154 58 +4f780 4 77 59 +4f784 4 277 82 +4f788 4 77 59 +4f78c 4 277 82 +4f790 4 77 59 +4f794 1c 77 59 +4f7b0 4 77 59 +4f7b4 4 77 59 +4f7b8 4 77 59 +4f7bc 1c 77 59 +4f7d8 8 77 59 +4f7e0 c 77 59 +4f7ec 8 85 79 +4f7f4 8 77 59 +4f7fc 8 156 132 +4f804 4 256 82 +4f808 4 80 59 +4f80c 8 256 82 +4f814 c 80 59 +4f820 c 150 58 +4f82c 8 154 58 +4f834 4 1139 87 +4f838 4 154 58 +4f83c 8 83 59 +4f844 4 277 82 +4f848 4 83 59 +4f84c 20 83 59 +4f86c 4 83 59 +4f870 4 83 59 +4f874 4 83 59 +4f878 1c 83 59 +4f894 8 83 59 +4f89c c 83 59 +4f8a8 8 85 79 +4f8b0 8 83 59 +4f8b8 8 156 132 +4f8c0 4 256 82 +4f8c4 4 163 58 +4f8c8 8 256 82 +4f8d0 c 163 58 +4f8dc c 150 58 +4f8e8 8 154 58 +4f8f0 4 1139 87 +4f8f4 4 154 58 +4f8f8 8 89 59 +4f900 4 277 82 +4f904 4 89 59 +4f908 20 89 59 +4f928 4 89 59 +4f92c 4 89 59 +4f930 4 89 59 +4f934 1c 89 59 +4f950 8 89 59 +4f958 c 89 59 +4f964 8 85 79 +4f96c 8 89 59 +4f974 8 156 132 +4f97c 8 256 82 +4f984 20 90 59 +FUNC 4f9a4 60c 0 google_breakpad::NonAllocatingMapTest_Iterator_Test::TestBody +4f9a4 4 127 59 +4f9a8 4 128 59 +4f9ac 20 127 59 +4f9cc 10 128 59 +4f9dc 14 104 58 +4f9f0 8 104 58 +4f9f8 8 277 82 +4fa00 4 256 82 +4fa04 4 277 82 +4fa08 4 256 82 +4fa0c c 1139 87 +4fa18 4 256 82 +4fa1c 8 1621 82 +4fa24 8 138 59 +4fa2c c 302 82 +4fa38 18 138 59 +4fa50 8 138 59 +4fa58 c 138 59 +4fa64 8 85 79 +4fa6c 8 138 59 +4fa74 8 256 82 +4fa7c 4 142 59 +4fa80 4 256 82 +4fa84 4 146 59 +4fa88 4 147 59 +4fa8c 4 256 82 +4fa90 4 145 59 +4fa94 4 142 59 +4fa98 4 146 59 +4fa9c 4 147 59 +4faa0 10 146 59 +4fab0 c 147 59 +4fabc 4 145 59 +4fac0 4 147 59 +4fac4 10 148 59 +4fad4 8 145 59 +4fadc 14 153 59 +4faf0 4 150 59 +4faf4 4 153 59 +4faf8 18 154 59 +4fb10 18 155 59 +4fb28 10 158 59 +4fb38 10 159 59 +4fb48 10 160 59 +4fb58 10 161 59 +4fb68 c 162 59 +4fb74 10 166 59 +4fb84 c 167 59 +4fb90 4 165 59 +4fb94 4 167 59 +4fb98 10 168 59 +4fba8 8 165 59 +4fbb0 4 170 59 +4fbb4 8 181 59 +4fbbc 4 1512 82 +4fbc0 8 170 59 +4fbc8 8 181 59 +4fbd0 4 183 59 +4fbd4 4 82 58 +4fbd8 4 181 59 +4fbdc 4 191 59 +4fbe0 4 256 82 +4fbe4 4 183 59 +4fbe8 10 256 82 +4fbf8 8 88 58 +4fc00 10 89 58 +4fc10 8 90 58 +4fc18 4 187 59 +4fc1c c 191 59 +4fc28 8 187 59 +4fc30 4 191 59 +4fc34 4 195 59 +4fc38 8 191 59 +4fc40 18 195 59 +4fc58 20 1512 82 +4fc78 8 198 59 +4fc80 4 302 82 +4fc84 4 198 59 +4fc88 8 302 82 +4fc90 18 198 59 +4fca8 8 198 59 +4fcb0 c 198 59 +4fcbc 8 85 79 +4fcc4 8 198 59 +4fccc 8 256 82 +4fcd4 4 1139 87 +4fcd8 8 203 59 +4fce0 4 205 59 +4fce4 4 203 59 +4fce8 4 277 82 +4fcec 8 205 59 +4fcf4 4 206 59 +4fcf8 24 206 59 +4fd1c 24 206 59 +4fd40 10 206 59 +4fd50 14 206 59 +4fd64 c 85 79 +4fd70 c 206 59 +4fd7c 8 156 132 +4fd84 8 256 82 +4fd8c 4 277 82 +4fd90 4 1139 87 +4fd94 4 207 59 +4fd98 24 207 59 +4fdbc 24 207 59 +4fde0 10 207 59 +4fdf0 14 207 59 +4fe04 c 85 79 +4fe10 c 207 59 +4fe1c 8 156 132 +4fe24 8 256 82 +4fe2c 8 209 59 +4fe34 14 210 59 +4fe48 8 1512 82 +4fe50 4 88 58 +4fe54 4 219 59 +4fe58 4 1512 82 +4fe5c 4 256 82 +4fe60 14 218 59 +4fe74 8 218 59 +4fe7c 18 1512 82 +4fe94 8 219 59 +4fe9c 4 1512 82 +4fea0 8 219 59 +4fea8 4 302 82 +4feac 4 219 59 +4feb0 8 302 82 +4feb8 18 219 59 +4fed0 8 219 59 +4fed8 c 219 59 +4fee4 8 85 79 +4feec 8 219 59 +4fef4 8 256 82 +4fefc 4 216 59 +4ff00 8 216 59 +4ff08 24 1512 82 +4ff2c 8 224 59 +4ff34 4 302 82 +4ff38 4 224 59 +4ff3c 4 224 59 +4ff40 8 302 82 +4ff48 18 224 59 +4ff60 8 224 59 +4ff68 c 224 59 +4ff74 8 85 79 +4ff7c 8 224 59 +4ff84 8 256 82 +4ff8c 24 225 59 +FUNC 4ffb0 38 0 google_breakpad::test_assembler::Label::Label +4ffb0 c 47 61 +4ffbc c 47 61 +4ffc8 10 127 61 +4ffd8 10 47 61 +FUNC 4ffe8 40 0 google_breakpad::test_assembler::Label::Label +4ffe8 c 48 61 +4fff4 10 48 61 +50004 14 130 61 +50018 10 48 61 +FUNC 50028 18 0 google_breakpad::test_assembler::Label::Label +50028 8 50 61 +50030 c 180 62 +5003c 4 52 61 +FUNC 50040 14 0 google_breakpad::test_assembler::Label::Binding::Binding +50040 14 127 61 +FUNC 50054 14 0 google_breakpad::test_assembler::Label::Binding::Binding +50054 14 130 61 +FUNC 50068 58 0 google_breakpad::test_assembler::Label::Binding::~Binding +50068 c 132 61 +50074 4 134 61 +50078 c 134 61 +50084 c 182 62 +50090 4 134 61 +50094 8 135 61 +5009c 8 135 61 +500a4 4 135 61 +500a8 8 136 61 +500b0 4 135 61 +500b4 c 136 61 +FUNC 500c0 4c 0 google_breakpad::test_assembler::Label::~Label +500c0 c 53 61 +500cc 4 54 61 +500d0 c 182 62 +500dc 4 54 61 +500e0 8 54 61 +500e8 8 54 61 +500f0 4 54 61 +500f4 8 55 61 +500fc 4 54 61 +50100 c 55 61 +FUNC 5010c b0 0 google_breakpad::test_assembler::Label::Binding::Get +5010c 10 186 61 +5011c 8 186 61 +50124 4 187 61 +50128 4 186 61 +5012c c 187 61 +50138 c 194 61 +50144 8 195 61 +5014c c 180 62 +50158 4 196 61 +5015c c 182 62 +50168 4 196 61 +5016c 8 196 61 +50174 8 196 61 +5017c 8 196 61 +50184 4 197 61 +50188 4 198 61 +5018c 4 197 61 +50190 c 198 61 +5019c 8 200 61 +501a4 8 201 61 +501ac 10 202 61 +FUNC 501bc 4c 0 google_breakpad::test_assembler::Label::IsKnownConstant +501bc c 104 61 +501c8 4 107 61 +501cc 4 104 61 +501d0 c 107 61 +501dc 4 108 61 +501e0 4 108 61 +501e4 4 108 61 +501e8 4 110 61 +501ec 4 109 61 +501f0 8 109 61 +501f8 4 110 61 +501fc c 111 61 +FUNC 50208 20 0 google_breakpad::test_assembler::Label::Value +50208 8 98 61 +50210 8 99 61 +50218 4 100 61 +5021c c 102 61 +FUNC 50228 70 0 google_breakpad::test_assembler::Label::IsKnownOffsetFrom +50228 c 114 61 +50234 8 114 61 +5023c 10 117 61 +5024c 10 118 61 +5025c 4 122 61 +50260 4 122 61 +50264 c 122 61 +50270 4 124 61 +50274 4 123 61 +50278 10 123 61 +50288 4 124 61 +5028c c 125 61 +FUNC 50298 1c 0 google_breakpad::test_assembler::Label::operator- +50298 8 92 61 +502a0 8 94 61 +502a8 c 96 61 +FUNC 502b4 cc 0 google_breakpad::test_assembler::Label::Binding::Set +502b4 10 138 61 +502c4 c 138 61 +502d0 4 139 61 +502d4 4 139 61 +502d8 4 139 61 +502dc 4 139 61 +502e0 14 145 61 +502f4 4 147 61 +502f8 c 154 61 +50304 8 155 61 +5030c c 163 61 +50318 10 169 61 +50328 4 171 61 +5032c c 182 62 +50338 4 171 61 +5033c 8 171 61 +50344 8 171 61 +5034c 8 171 61 +50354 8 180 61 +5035c c 180 62 +50368 4 181 61 +5036c 4 182 61 +50370 10 184 61 +FUNC 50380 30 0 google_breakpad::test_assembler::Label::operator= +50380 8 57 61 +50388 4 58 61 +5038c 8 57 61 +50394 4 57 61 +50398 8 58 61 +503a0 10 60 61 +FUNC 503b0 30 0 google_breakpad::test_assembler::Label::operator= +503b0 4 62 61 +503b4 4 63 61 +503b8 8 62 61 +503c0 4 62 61 +503c4 c 63 61 +503d0 10 65 61 +FUNC 503e0 40 0 google_breakpad::test_assembler::Label::operator+ +503e0 c 67 61 +503ec 8 67 61 +503f4 4 68 61 +503f8 4 67 61 +503fc 4 68 61 +50400 10 69 61 +50410 10 71 61 +FUNC 50420 48 0 google_breakpad::test_assembler::Label::operator- +50420 10 73 61 +50430 8 73 61 +50438 4 74 61 +5043c 4 73 61 +50440 4 74 61 +50444 10 75 61 +50454 14 77 61 +FUNC 50468 48 0 google_breakpad::test_assembler::Section::Align +50468 c 324 61 +50474 4 324 61 +50478 10 400 131 +50488 c 327 61 +50494 c 328 61 +504a0 10 331 61 +FUNC 504b0 58 0 google_breakpad::test_assembler::Section::LEB128 +504b0 10 303 61 +504c0 c 303 61 +504cc 8 304 61 +504d4 4 453 131 +504d8 4 304 61 +504dc 18 453 131 +504f4 14 313 61 +FUNC 50508 54 0 google_breakpad::test_assembler::Section::ULEB128 +50508 10 315 61 +50518 c 315 61 +50524 4 316 61 +50528 4 453 131 +5052c 4 316 61 +50530 4 453 131 +50534 4 318 61 +50538 10 453 131 +50548 14 322 61 +FUNC 5055c 7c 0 google_breakpad::test_assembler::InsertEndian, std::allocator > > > +5055c 4 205 61 +50560 4 208 61 +50564 c 205 61 +50570 c 205 61 +5057c 8 208 61 +50584 8 209 61 +5058c 8 178 113 +50594 4 211 61 +50598 4 209 61 +5059c 8 178 113 +505a4 4 216 61 +505a8 c 216 61 +505b4 8 178 113 +505bc 4 216 61 +505c0 8 178 113 +505c8 10 219 61 +FUNC 505d8 34 0 google_breakpad::test_assembler::Section::Append +505d8 c 221 61 +505e4 4 221 61 +505e8 14 223 61 +505fc 10 225 61 +FUNC 5060c 34 0 google_breakpad::test_assembler::Section::L16 +5060c 8 267 61 +50614 4 267 61 +50618 8 267 61 +50620 4 267 61 +50624 c 267 61 +50630 10 267 61 +FUNC 50640 34 0 google_breakpad::test_assembler::Section::L32 +50640 8 268 61 +50648 4 268 61 +5064c 8 268 61 +50654 4 268 61 +50658 c 268 61 +50664 10 268 61 +FUNC 50674 34 0 google_breakpad::test_assembler::Section::L64 +50674 8 269 61 +5067c 4 269 61 +50680 8 269 61 +50688 4 269 61 +5068c c 269 61 +50698 10 269 61 +FUNC 506a8 34 0 google_breakpad::test_assembler::Section::B16 +506a8 8 270 61 +506b0 4 270 61 +506b4 8 270 61 +506bc 4 270 61 +506c0 c 270 61 +506cc 10 270 61 +FUNC 506dc 34 0 google_breakpad::test_assembler::Section::B32 +506dc 8 271 61 +506e4 4 271 61 +506e8 8 271 61 +506f0 4 271 61 +506f4 c 271 61 +50700 10 271 61 +FUNC 50710 34 0 google_breakpad::test_assembler::Section::B64 +50710 8 272 61 +50718 4 272 61 +5071c 8 272 61 +50724 4 272 61 +50728 c 272 61 +50734 10 272 61 +FUNC 50744 34 0 google_breakpad::test_assembler::Section::D16 +50744 8 289 61 +5074c 4 289 61 +50750 8 289 61 +50758 4 289 61 +5075c c 289 61 +50768 10 289 61 +FUNC 50778 34 0 google_breakpad::test_assembler::Section::D32 +50778 8 290 61 +50780 4 290 61 +50784 8 290 61 +5078c 4 290 61 +50790 c 290 61 +5079c 10 290 61 +FUNC 507ac 34 0 google_breakpad::test_assembler::Section::D64 +507ac 8 291 61 +507b4 4 291 61 +507b8 8 291 61 +507c0 4 291 61 +507c4 c 291 61 +507d0 10 291 61 +FUNC 507e0 50 0 std::priv::_Impl_vector >::clear +507e0 18 650 139 +507f8 10 630 139 +50808 4 449 62 +5080c 4 191 103 +50810 4 449 62 +50814 8 191 103 +5081c 4 615 139 +50820 10 652 139 +FUNC 50830 24 0 google_breakpad::test_assembler::Section::Clear +50830 4 333 61 +50834 c 422 131 +50840 4 232 140 +50844 8 424 131 +5084c 8 228 143 +FUNC 50854 108 0 std::priv::_String_base >::_M_swap +50854 4 168 132 +50858 4 64 132 +5085c 8 170 132 +50864 4 171 132 +50868 4 64 132 +5086c 14 171 132 +50880 4 92 100 +50884 4 91 100 +50888 4 92 100 +5088c 4 91 100 +50890 8 92 100 +50898 8 93 100 +508a0 8 91 100 +508a8 c 174 132 +508b4 4 173 132 +508b8 c 174 132 +508c4 c 175 132 +508d0 4 178 132 +508d4 8 179 132 +508dc 4 64 132 +508e0 8 185 132 +508e8 4 189 132 +508ec 4 188 132 +508f0 4 189 132 +508f4 4 187 132 +508f8 8 189 132 +50900 4 192 132 +50904 10 193 132 +50914 4 194 132 +50918 4 195 132 +5091c 8 196 132 +50924 4 92 100 +50928 4 91 100 +5092c 4 92 100 +50930 4 93 100 +50934 4 92 100 +50938 4 91 100 +5093c 4 92 100 +50940 4 93 100 +50944 4 92 100 +50948 4 91 100 +5094c 4 92 100 +50950 4 93 100 +50954 8 208 132 +FUNC 5095c 140 0 google_breakpad::test_assembler::Section::GetContents +5095c 4 338 61 +50960 4 341 61 +50964 14 338 61 +50978 8 338 61 +50980 4 192 139 +50984 4 344 61 +50988 c 192 139 +50994 c 341 61 +509a0 4 344 61 +509a4 8 202 139 +509ac 14 344 61 +509c0 20 345 61 +509e0 4 208 61 +509e4 8 350 61 +509ec 4 208 61 +509f0 c 350 61 +509fc 8 208 61 +50a04 8 209 61 +50a0c 4 210 61 +50a10 4 211 61 +50a14 8 209 61 +50a1c 4 216 61 +50a20 14 216 61 +50a34 4 217 61 +50a38 4 216 61 +50a3c 8 217 61 +50a44 c 341 61 +50a50 c 422 131 +50a5c 4 232 140 +50a60 8 424 131 +50a68 8 942 131 +50a70 4 355 61 +50a74 4 942 131 +50a78 8 228 143 +50a80 1c 356 61 +FUNC 50a9c 274 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +50a9c 20 81 138 +50abc 8 192 139 +50ac4 4 81 138 +50ac8 4 192 139 +50acc 4 81 138 +50ad0 4 192 139 +50ad4 8 173 139 +50adc c 81 138 +50ae8 4 173 139 +50aec 4 81 138 +50af0 4 173 139 +50af4 14 41 138 +50b08 4 175 139 +50b0c 10 176 139 +50b1c 4 356 101 +50b20 8 346 101 +50b28 4 177 139 +50b2c c 347 101 +50b38 4 348 101 +50b3c 4 352 101 +50b40 4 348 101 +50b44 4 352 101 +50b48 4 91 138 +50b4c 4 84 137 +50b50 10 86 137 +50b60 8 86 137 +50b68 4 139 103 +50b6c 24 449 62 +50b90 4 89 137 +50b94 14 86 137 +50ba8 c 93 138 +50bb4 4 119 103 +50bb8 24 449 62 +50bdc 8 95 138 +50be4 8 314 137 +50bec 4 249 137 +50bf0 4 449 62 +50bf4 8 249 137 +50bfc 4 139 103 +50c00 24 449 62 +50c24 c 249 137 +50c30 8 98 138 +50c38 c 86 137 +50c44 4 84 137 +50c48 8 86 137 +50c50 8 86 137 +50c58 4 139 103 +50c5c 24 449 62 +50c80 4 89 137 +50c84 20 86 137 +50ca4 8 191 103 +50cac 10 449 62 +50cbc c 662 139 +50cc8 4 319 101 +50ccc 8 161 101 +50cd4 8 135 119 +50cdc 4 161 101 +50ce0 4 104 138 +50ce4 4 666 139 +50ce8 4 667 139 +50cec 4 668 139 +50cf0 20 105 138 +FUNC 50d10 78 0 std::priv::_Impl_vector >::push_back +50d10 10 376 139 +50d20 4 376 139 +50d24 10 380 139 +50d34 4 119 103 +50d38 24 449 62 +50d5c 10 382 139 +50d6c 10 162 139 +50d7c c 388 139 +FUNC 50d88 c0 0 google_breakpad::test_assembler::Section::Append +50d88 18 228 61 +50da0 8 232 61 +50da8 4 228 61 +50dac 4 232 61 +50db0 4 228 61 +50db4 14 232 61 +50dc8 14 223 61 +50ddc 4 233 61 +50de0 4 400 131 +50de4 4 453 62 +50de8 4 400 131 +50dec c 453 62 +50df8 4 400 131 +50dfc 10 453 62 +50e0c c 173 143 +50e18 8 449 62 +50e20 10 240 61 +50e30 18 242 61 +FUNC 50e48 10 0 google_breakpad::test_assembler::Section::L8 +50e48 10 265 61 +FUNC 50e58 10 0 google_breakpad::test_assembler::Section::B8 +50e58 10 266 61 +FUNC 50e68 10 0 google_breakpad::test_assembler::Section::L16 +50e68 10 267 61 +FUNC 50e78 10 0 google_breakpad::test_assembler::Section::L32 +50e78 10 268 61 +FUNC 50e88 10 0 google_breakpad::test_assembler::Section::L64 +50e88 10 269 61 +FUNC 50e98 10 0 google_breakpad::test_assembler::Section::B16 +50e98 10 270 61 +FUNC 50ea8 10 0 google_breakpad::test_assembler::Section::B32 +50ea8 10 271 61 +FUNC 50eb8 10 0 google_breakpad::test_assembler::Section::B64 +50eb8 10 272 61 +FUNC 50ec8 10 0 google_breakpad::test_assembler::Section::D8 +50ec8 10 288 61 +FUNC 50ed8 10 0 google_breakpad::test_assembler::Section::D16 +50ed8 10 289 61 +FUNC 50ee8 10 0 google_breakpad::test_assembler::Section::D32 +50ee8 10 290 61 +FUNC 50ef8 10 0 google_breakpad::test_assembler::Section::D64 +50ef8 10 291 61 +FUNC 50f08 1e4 0 google_breakpad::test_assembler::Section::Append +50f08 20 293 61 +50f28 8 293 61 +50f30 8 295 61 +50f38 8 197 130 +50f40 4 400 131 +50f44 4 197 130 +50f48 4 74 132 +50f4c 4 198 130 +50f50 4 74 132 +50f54 c 74 132 +50f60 8 74 132 +50f68 8 199 130 +50f70 10 200 130 +50f80 4 356 101 +50f84 4 346 101 +50f88 8 347 101 +50f90 4 348 101 +50f94 4 352 101 +50f98 8 348 101 +50fa0 10 86 137 +50fb0 c 86 137 +50fbc 10 146 103 +50fcc 1c 86 137 +50fe8 10 146 103 +50ff8 8 205 130 +51000 8 206 130 +51008 4 101 103 +5100c 4 205 130 +51010 4 160 132 +51014 4 164 132 +51018 8 165 132 +51020 4 210 130 +51024 c 86 137 +51030 18 86 137 +51048 8 146 103 +51050 10 101 103 +51060 4 232 140 +51064 c 214 130 +51070 c 453 62 +5107c 4 173 143 +51080 c 296 61 +5108c c 299 61 +51098 4 296 61 +5109c 4 299 61 +510a0 8 453 62 +510a8 4 299 61 +510ac c 453 62 +510b8 c 173 143 +510c4 c 449 62 +510d0 1c 301 61 +FUNC 510ec 1e4 0 google_breakpad::CopyFile +510ec 20 44 64 +5110c 18 45 64 +51124 4 45 64 +51128 c 45 64 +51134 c 47 64 +51140 4 57 64 +51144 4 54 64 +51148 c 55 64 +51154 8 57 64 +5115c 4 46 64 +51160 18 51 64 +51178 4 51 64 +5117c c 51 64 +51188 c 53 64 +51194 10 54 64 +511a4 4 54 64 +511a8 4 57 64 +511ac 8 54 64 +511b4 8 65 64 +511bc 8 70 64 +511c4 18 74 64 +511dc 4 78 64 +511e0 4 83 64 +511e4 8 73 64 +511ec 1c 64 64 +51208 4 64 64 +5120c c 64 64 +51218 8 66 64 +51220 8 79 64 +51228 10 87 64 +51238 10 91 64 +51248 4 91 64 +5124c 10 91 64 +5125c 4 64 64 +51260 8 52 64 +51268 4 87 64 +5126c 10 87 64 +5127c 4 74 64 +51280 c 74 64 +5128c 14 79 64 +512a0 4 88 64 +512a4 4 89 64 +512a8 c 88 64 +512b4 1c 97 64 +FUNC 512d0 104 0 google_breakpad::ReadFile +512d0 1c 99 64 +512ec 18 100 64 +51304 4 100 64 +51308 c 100 64 +51314 c 102 64 +51320 4 107 64 +51324 8 106 64 +5132c 4 107 64 +51330 c 107 64 +5133c 4 108 64 +51340 1c 109 64 +5135c 4 109 64 +51360 8 110 64 +51368 4 111 64 +5136c 4 112 64 +51370 8 111 64 +51378 10 115 64 +51388 4 115 64 +5138c c 115 64 +51398 c 116 64 +513a4 4 109 64 +513a8 10 109 64 +513b8 4 103 64 +513bc 4 102 64 +513c0 14 120 64 +FUNC 513d4 104 0 google_breakpad::WriteFile +513d4 20 122 64 +513f4 1c 123 64 +51410 4 123 64 +51414 c 123 64 +51420 10 125 64 +51430 4 130 64 +51434 8 129 64 +5143c 4 136 64 +51440 c 136 64 +5144c 18 136 64 +51464 4 138 64 +51468 4 143 64 +5146c 8 134 64 +51474 c 136 64 +51480 4 139 64 +51484 4 140 64 +51488 8 139 64 +51490 10 146 64 +514a0 4 146 64 +514a4 c 146 64 +514b0 8 147 64 +514b8 4 126 64 +514bc 4 125 64 +514c0 18 151 64 +FUNC 514d8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +514d8 4 484 85 +FUNC 514dc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +514dc 4 484 85 +FUNC 514e0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +514e0 4 484 85 +FUNC 514e4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +514e4 4 484 85 +FUNC 514e8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +514e8 4 484 85 +FUNC 514ec 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +514ec 4 484 85 +FUNC 514f0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +514f0 4 484 85 +FUNC 514f4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +514f4 4 484 85 +FUNC 514f8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +514f8 4 484 85 +FUNC 514fc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +514fc 4 484 85 +FUNC 51500 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +51500 4 484 85 +FUNC 51504 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +51504 4 484 85 +FUNC 51508 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +51508 4 484 85 +FUNC 5150c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +5150c 4 484 85 +FUNC 51510 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +51510 4 484 85 +FUNC 51514 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +51514 4 484 85 +FUNC 51518 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +51518 4 484 85 +FUNC 5151c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +5151c 4 484 85 +FUNC 51520 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +51520 4 484 85 +FUNC 51524 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +51524 4 484 85 +FUNC 51528 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +51528 4 484 85 +FUNC 5152c 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +5152c 4 484 85 +FUNC 51530 14 0 MinidumpMemoryRangeTest_GetAsciiMDString_Test::~MinidumpMemoryRangeTest_GetAsciiMDString_Test +51530 14 224 78 +FUNC 51544 24 0 MinidumpMemoryRangeTest_GetAsciiMDString_Test::~MinidumpMemoryRangeTest_GetAsciiMDString_Test +51544 c 224 78 +51550 8 224 78 +51558 4 224 78 +5155c 8 224 78 +51564 4 224 78 +FUNC 51568 14 0 MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test::~MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test +51568 14 216 78 +FUNC 5157c 24 0 MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test::~MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test +5157c c 216 78 +51588 8 216 78 +51590 4 216 78 +51594 8 216 78 +5159c 4 216 78 +FUNC 515a0 14 0 MinidumpMemoryRangeTest_GetArrayElement_Test::~MinidumpMemoryRangeTest_GetArrayElement_Test +515a0 14 201 78 +FUNC 515b4 24 0 MinidumpMemoryRangeTest_GetArrayElement_Test::~MinidumpMemoryRangeTest_GetArrayElement_Test +515b4 c 201 78 +515c0 8 201 78 +515c8 4 201 78 +515cc 8 201 78 +515d4 4 201 78 +FUNC 515d8 14 0 MinidumpMemoryRangeTest_GetDataWithTemplateType_Test::~MinidumpMemoryRangeTest_GetDataWithTemplateType_Test +515d8 14 193 78 +FUNC 515ec 24 0 MinidumpMemoryRangeTest_GetDataWithTemplateType_Test::~MinidumpMemoryRangeTest_GetDataWithTemplateType_Test +515ec c 193 78 +515f8 8 193 78 +51600 4 193 78 +51604 8 193 78 +5160c 4 193 78 +FUNC 51610 14 0 MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test::~MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test +51610 14 165 78 +FUNC 51624 24 0 MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test::~MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test +51624 c 165 78 +51630 8 165 78 +51638 4 165 78 +5163c 8 165 78 +51644 4 165 78 +FUNC 51648 14 0 MinidumpMemoryRangeTest_SubrangeAndGetData_Test::~MinidumpMemoryRangeTest_SubrangeAndGetData_Test +51648 14 140 78 +FUNC 5165c 24 0 MinidumpMemoryRangeTest_SubrangeAndGetData_Test::~MinidumpMemoryRangeTest_SubrangeAndGetData_Test +5165c c 140 78 +51668 8 140 78 +51670 4 140 78 +51674 8 140 78 +5167c 4 140 78 +FUNC 51680 14 0 MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test::~MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test +51680 14 133 78 +FUNC 51694 24 0 MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test::~MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test +51694 c 133 78 +516a0 8 133 78 +516a8 4 133 78 +516ac 8 133 78 +516b4 4 133 78 +FUNC 516b8 14 0 MinidumpMemoryRangeTest_Set_Test::~MinidumpMemoryRangeTest_Set_Test +516b8 14 122 78 +FUNC 516cc 24 0 MinidumpMemoryRangeTest_Set_Test::~MinidumpMemoryRangeTest_Set_Test +516cc c 122 78 +516d8 8 122 78 +516e0 4 122 78 +516e4 8 122 78 +516ec 4 122 78 +FUNC 516f0 14 0 MinidumpMemoryRangeTest_Reset_Test::~MinidumpMemoryRangeTest_Reset_Test +516f0 14 107 78 +FUNC 51704 24 0 MinidumpMemoryRangeTest_Reset_Test::~MinidumpMemoryRangeTest_Reset_Test +51704 c 107 78 +51710 8 107 78 +51718 4 107 78 +5171c 8 107 78 +51724 4 107 78 +FUNC 51728 14 0 MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test::~MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test +51728 14 101 78 +FUNC 5173c 24 0 MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test::~MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test +5173c c 101 78 +51748 8 101 78 +51750 4 101 78 +51754 8 101 78 +5175c 4 101 78 +FUNC 51760 14 0 MinidumpMemoryRangeTest_DefaultConstructor_Test::~MinidumpMemoryRangeTest_DefaultConstructor_Test +51760 14 95 78 +FUNC 51774 24 0 MinidumpMemoryRangeTest_DefaultConstructor_Test::~MinidumpMemoryRangeTest_DefaultConstructor_Test +51774 c 95 78 +51780 8 95 78 +51788 4 95 78 +5178c 8 95 78 +51794 4 95 78 +FUNC 51798 3c 0 testing::internal::TestFactoryImpl::CreateTest +51798 10 486 85 +517a8 8 486 85 +517b0 8 224 78 +517b8 4 486 85 +517bc c 224 78 +517c8 c 486 85 +FUNC 517d4 3c 0 testing::internal::TestFactoryImpl::CreateTest +517d4 10 486 85 +517e4 8 486 85 +517ec 8 216 78 +517f4 4 486 85 +517f8 c 216 78 +51804 c 486 85 +FUNC 51810 3c 0 testing::internal::TestFactoryImpl::CreateTest +51810 10 486 85 +51820 8 486 85 +51828 8 201 78 +51830 4 486 85 +51834 c 201 78 +51840 c 486 85 +FUNC 5184c 3c 0 testing::internal::TestFactoryImpl::CreateTest +5184c 10 486 85 +5185c 8 486 85 +51864 8 193 78 +5186c 4 486 85 +51870 c 193 78 +5187c c 486 85 +FUNC 51888 3c 0 testing::internal::TestFactoryImpl::CreateTest +51888 10 486 85 +51898 8 486 85 +518a0 8 165 78 +518a8 4 486 85 +518ac c 165 78 +518b8 c 486 85 +FUNC 518c4 3c 0 testing::internal::TestFactoryImpl::CreateTest +518c4 10 486 85 +518d4 8 486 85 +518dc 8 140 78 +518e4 4 486 85 +518e8 c 140 78 +518f4 c 486 85 +FUNC 51900 3c 0 testing::internal::TestFactoryImpl::CreateTest +51900 10 486 85 +51910 8 486 85 +51918 8 133 78 +51920 4 486 85 +51924 c 133 78 +51930 c 486 85 +FUNC 5193c 3c 0 testing::internal::TestFactoryImpl::CreateTest +5193c 10 486 85 +5194c 8 486 85 +51954 8 122 78 +5195c 4 486 85 +51960 c 122 78 +5196c c 486 85 +FUNC 51978 3c 0 testing::internal::TestFactoryImpl::CreateTest +51978 10 486 85 +51988 8 486 85 +51990 8 107 78 +51998 4 486 85 +5199c c 107 78 +519a8 c 486 85 +FUNC 519b4 3c 0 testing::internal::TestFactoryImpl::CreateTest +519b4 10 486 85 +519c4 8 486 85 +519cc 8 101 78 +519d4 4 486 85 +519d8 c 101 78 +519e4 c 486 85 +FUNC 519f0 3c 0 testing::internal::TestFactoryImpl::CreateTest +519f0 10 486 85 +51a00 8 486 85 +51a08 8 95 78 +51a10 4 486 85 +51a14 c 95 78 +51a20 c 486 85 +FUNC 51a2c 3c 0 google_breakpad::MemoryRange::GetData +51a2c 4 90 55 +51a30 4 90 55 +51a34 4 91 55 +51a38 8 83 55 +51a40 4 83 55 +51a44 10 83 55 +51a54 8 91 55 +51a5c 8 91 55 +51a64 4 92 55 +FUNC 51a68 3c 0 google_breakpad::MinidumpMemoryRange::Subrange +51a68 4 59 77 +51a6c 8 83 55 +51a74 4 83 55 +51a78 10 83 55 +51a88 4 61 77 +51a8c c 72 55 +51a98 8 62 77 +51aa0 4 63 77 +FUNC 51aa4 90 0 google_breakpad::MinidumpMemoryRange::GetAsciiMDString +51aa4 18 74 77 +51abc 4 124 132 +51ac0 4 74 77 +51ac4 4 120 132 +51ac8 4 124 132 +51acc 4 481 101 +51ad0 8 124 132 +51ad8 8 99 55 +51ae0 4 79 77 +51ae4 4 101 103 +51ae8 c 99 55 +51af4 4 78 77 +51af8 4 77 77 +51afc c 79 77 +51b08 8 79 77 +51b10 4 80 77 +51b14 4 79 77 +51b18 8 80 77 +51b20 14 84 77 +FUNC 51b34 cc 0 testing::PrintToString +51b34 4 883 80 +51b38 4 884 80 +51b3c c 883 80 +51b48 8 884 80 +51b50 8 883 80 +51b58 4 883 80 +51b5c 4 884 80 +51b60 8 885 80 +51b68 4 708 80 +51b6c 14 333 122 +51b80 4 112 132 +51b84 4 229 140 +51b88 4 112 132 +51b8c 4 481 101 +51b90 8 229 140 +51b98 4 643 130 +51b9c c 379 131 +51ba8 10 148 137 +51bb8 4 380 131 +51bbc 4 101 103 +51bc0 c 469 80 +51bcc 8 156 132 +51bd4 c 75 127 +51be0 8 886 80 +51be8 18 887 80 +FUNC 51c00 50 0 testing::internal::DefaultPrintTo +51c00 14 307 80 +51c14 4 310 80 +51c18 4 334 80 +51c1c 4 333 122 +51c20 4 334 80 +51c24 8 333 122 +51c2c 10 318 80 +51c3c 8 291 121 +51c44 8 334 80 +51c4c 4 291 121 +FUNC 51c50 50 0 testing::internal::DefaultPrintTo +51c50 14 307 80 +51c64 4 310 80 +51c68 4 334 80 +51c6c 4 333 122 +51c70 4 334 80 +51c74 8 333 122 +51c7c 10 318 80 +51c8c 8 291 121 +51c94 8 334 80 +51c9c 4 291 121 +FUNC 51ca0 11c 0 testing::operator<< +51ca0 c 232 79 +51cac 4 233 79 +51cb0 4 232 79 +51cb4 4 233 79 +51cb8 4 232 79 +51cbc 4 233 79 +51cc0 4 232 79 +51cc4 4 233 79 +51cc8 14 181 122 +51cdc 4 41 133 +51ce0 18 62 133 +51cf8 4 44 133 +51cfc c 400 131 +51d08 8 44 133 +51d10 4 138 110 +51d14 4 139 110 +51d18 4 44 133 +51d1c 4 50 133 +51d20 4 46 133 +51d24 8 50 133 +51d2c 14 52 133 +51d40 10 55 133 +51d50 c 55 133 +51d5c 14 53 133 +51d70 8 55 133 +51d78 4 57 133 +51d7c 14 58 133 +51d90 4 58 133 +51d94 8 64 133 +51d9c 8 156 132 +51da4 18 234 79 +FUNC 51dbc e8 0 testing::internal::CmpHelperEQFailure +51dbc c 1464 82 +51dc8 4 884 80 +51dcc 10 1464 82 +51ddc 8 884 80 +51de4 4 1464 82 +51de8 4 75 127 +51dec 4 1464 82 +51df0 8 1464 82 +51df8 4 884 80 +51dfc c 380 80 +51e08 4 75 127 +51e0c 8 380 80 +51e14 c 75 127 +51e20 8 886 80 +51e28 c 884 80 +51e34 8 380 80 +51e3c 4 75 127 +51e40 8 380 80 +51e48 c 75 127 +51e54 8 886 80 +51e5c 1c 1471 82 +51e78 10 156 132 +51e88 1c 1472 82 +FUNC 51ea4 50 0 std::operator==, std::allocator > +51ea4 c 311 134 +51eb0 8 311 134 +51eb8 8 229 140 +51ec0 8 315 134 +51ec8 8 400 131 +51ed0 8 315 134 +51ed8 8 226 140 +51ee0 8 315 134 +51ee8 c 316 134 +FUNC 51ef4 5c 0 testing::PrintToString +51ef4 4 883 80 +51ef8 4 884 80 +51efc 8 883 80 +51f04 4 884 80 +51f08 4 883 80 +51f0c 4 883 80 +51f10 4 884 80 +51f14 4 883 80 +51f18 4 884 80 +51f1c c 380 80 +51f28 c 75 127 +51f34 8 886 80 +51f3c 14 887 80 +FUNC 51f50 9c 0 testing::internal::CmpHelperEQ +51f50 10 1476 82 +51f60 8 1476 82 +51f68 10 1481 82 +51f78 8 1482 82 +51f80 2c 1382 82 +51fac 1c 1471 82 +51fc8 10 156 132 +51fd8 14 1488 82 +FUNC 51fec 12c 0 MinidumpMemoryRangeTest_DefaultConstructor_Test::TestBody +51fec 4 95 78 +51ff0 8 1571 82 +51ff8 c 95 78 +52004 2c 1571 82 +52030 8 97 78 +52038 c 302 82 +52044 18 97 78 +5205c 8 97 78 +52064 c 97 78 +52070 8 85 79 +52078 8 97 78 +52080 8 256 82 +52088 4 98 78 +5208c 1c 1552 82 +520a8 4 98 78 +520ac 4 1552 82 +520b0 8 98 78 +520b8 c 302 82 +520c4 18 98 78 +520dc 8 98 78 +520e4 c 98 78 +520f0 8 85 79 +520f8 8 98 78 +52100 8 256 82 +52108 10 99 78 +FUNC 52118 148 0 MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test::TestBody +52118 4 133 78 +5211c 8 135 78 +52124 4 133 78 +52128 4 135 78 +5212c 8 133 78 +52134 4 50 55 +52138 4 1571 82 +5213c 4 50 55 +52140 4 135 78 +52144 8 1571 82 +5214c 4 135 78 +52150 28 1571 82 +52178 8 136 78 +52180 c 302 82 +5218c 18 136 78 +521a4 8 136 78 +521ac c 136 78 +521b8 8 85 79 +521c0 8 136 78 +521c8 8 256 82 +521d0 4 137 78 +521d4 1c 1552 82 +521f0 4 137 78 +521f4 4 1552 82 +521f8 8 137 78 +52200 c 302 82 +5220c 18 137 78 +52224 8 137 78 +5222c c 137 78 +52238 8 85 79 +52240 8 137 78 +52248 8 256 82 +52250 10 138 78 +FUNC 52260 13c 0 MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test::TestBody +52260 4 101 78 +52264 4 103 78 +52268 4 1512 82 +5226c 4 101 78 +52270 4 103 78 +52274 4 1512 82 +52278 4 101 78 +5227c 4 103 78 +52280 20 1512 82 +522a0 4 101 78 +522a4 4 1512 82 +522a8 8 103 78 +522b0 4 302 82 +522b4 4 103 78 +522b8 8 302 82 +522c0 18 103 78 +522d8 8 103 78 +522e0 c 103 78 +522ec 8 85 79 +522f4 8 103 78 +522fc 8 256 82 +52304 4 104 78 +52308 4 1512 82 +5230c 4 104 78 +52310 20 1512 82 +52330 8 104 78 +52338 4 302 82 +5233c 4 104 78 +52340 8 302 82 +52348 18 104 78 +52360 8 104 78 +52368 c 104 78 +52374 8 85 79 +5237c 8 104 78 +52384 8 256 82 +5238c 10 105 78 +FUNC 5239c 338 0 MinidumpMemoryRangeTest_Reset_Test::TestBody +5239c 14 107 78 +523b0 24 1571 82 +523d4 c 107 78 +523e0 8 1571 82 +523e8 c 110 78 +523f4 c 302 82 +52400 18 110 78 +52418 8 110 78 +52420 c 110 78 +5242c 8 85 79 +52434 8 110 78 +5243c 4 256 82 +52440 8 1552 82 +52448 4 256 82 +5244c 4 111 78 +52450 14 1552 82 +52464 4 111 78 +52468 4 1552 82 +5246c 8 111 78 +52474 c 302 82 +52480 18 111 78 +52498 8 111 78 +524a0 c 111 78 +524ac 8 85 79 +524b4 8 111 78 +524bc 8 256 82 +524c4 4 114 78 +524c8 4 1512 82 +524cc 4 114 78 +524d0 4 1512 82 +524d4 4 114 78 +524d8 18 1512 82 +524f0 8 114 78 +524f8 c 302 82 +52504 18 114 78 +5251c 8 114 78 +52524 c 114 78 +52530 8 85 79 +52538 8 114 78 +52540 8 256 82 +52548 4 115 78 +5254c 4 1512 82 +52550 4 115 78 +52554 1c 1512 82 +52570 8 115 78 +52578 c 302 82 +52584 18 115 78 +5259c 8 115 78 +525a4 c 115 78 +525b0 8 85 79 +525b8 8 115 78 +525c0 c 256 82 +525cc 20 1571 82 +525ec 8 118 78 +525f4 c 302 82 +52600 18 118 78 +52618 8 118 78 +52620 c 118 78 +5262c 8 85 79 +52634 8 118 78 +5263c 8 256 82 +52644 4 119 78 +52648 14 1552 82 +5265c 4 119 78 +52660 4 1552 82 +52664 8 119 78 +5266c c 302 82 +52678 18 119 78 +52690 8 119 78 +52698 c 119 78 +526a4 8 85 79 +526ac 8 119 78 +526b4 8 256 82 +526bc 18 120 78 +FUNC 526d4 240 0 MinidumpMemoryRangeTest_Set_Test::TestBody +526d4 4 122 78 +526d8 4 125 78 +526dc 4 1512 82 +526e0 4 122 78 +526e4 4 125 78 +526e8 4 1512 82 +526ec 8 122 78 +526f4 4 125 78 +526f8 20 1512 82 +52718 c 122 78 +52724 4 1512 82 +52728 8 125 78 +52730 c 302 82 +5273c 18 125 78 +52754 8 125 78 +5275c c 125 78 +52768 8 85 79 +52770 8 125 78 +52778 4 256 82 +5277c 4 1512 82 +52780 4 256 82 +52784 4 126 78 +52788 4 1512 82 +5278c 4 126 78 +52790 1c 1512 82 +527ac 8 126 78 +527b4 c 302 82 +527c0 18 126 78 +527d8 8 126 78 +527e0 c 126 78 +527ec 8 85 79 +527f4 8 126 78 +527fc c 256 82 +52808 24 1571 82 +5282c 8 129 78 +52834 c 302 82 +52840 18 129 78 +52858 8 129 78 +52860 c 129 78 +5286c 8 85 79 +52874 8 129 78 +5287c 8 256 82 +52884 4 130 78 +52888 18 1552 82 +528a0 4 130 78 +528a4 4 1552 82 +528a8 8 130 78 +528b0 c 302 82 +528bc 18 130 78 +528d4 8 130 78 +528dc c 130 78 +528e8 8 85 79 +528f0 8 130 78 +528f8 8 256 82 +52900 14 131 78 +FUNC 52914 9c 0 testing::internal::CmpHelperEQ +52914 10 1476 82 +52924 8 1476 82 +5292c 10 1481 82 +5293c 8 1482 82 +52944 2c 1382 82 +52970 1c 1471 82 +5298c 10 156 132 +5299c 14 1488 82 +FUNC 529b0 84 0 testing::internal::CmpHelperEQFailure +529b0 c 1464 82 +529bc 8 1382 82 +529c4 4 1464 82 +529c8 8 1464 82 +529d0 8 1382 82 +529d8 8 1464 82 +529e0 14 1382 82 +529f4 1c 1471 82 +52a10 10 156 132 +52a20 14 1472 82 +FUNC 52a34 5ac 0 MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test::TestBody +52a34 4 165 78 +52a38 4 70 55 +52a3c c 165 78 +52a48 10 70 55 +52a58 c 72 55 +52a64 8 165 78 +52a6c 8 171 78 +52a74 4 256 82 +52a78 4 165 78 +52a7c 4 256 82 +52a80 4 171 78 +52a84 8 165 78 +52a8c 4 256 82 +52a90 4 170 78 +52a94 4 171 78 +52a98 4 170 78 +52a9c 4 171 78 +52aa0 4 169 78 +52aa4 4 171 78 +52aa8 4 168 78 +52aac 4 171 78 +52ab0 4 171 78 +52ab4 8 68 77 +52abc 4 171 78 +52ac0 4 131 79 +52ac4 10 333 122 +52ad4 4 131 79 +52ad8 c 263 121 +52ae4 4 131 79 +52ae8 10 333 122 +52af8 4 131 79 +52afc c 263 121 +52b08 4 131 79 +52b0c c 131 79 +52b18 14 171 78 +52b2c 10 85 79 +52b3c 20 68 77 +52b5c 4 178 78 +52b60 4 83 55 +52b64 4 83 55 +52b68 4 83 55 +52b6c 4 83 55 +52b70 8 82 55 +52b78 c 83 55 +52b84 4 277 82 +52b88 4 1139 87 +52b8c 4 179 78 +52b90 20 179 78 +52bb0 4 179 78 +52bb4 4 179 78 +52bb8 18 179 78 +52bd0 8 179 78 +52bd8 c 179 78 +52be4 8 85 79 +52bec 8 179 78 +52bf4 8 156 132 +52bfc 4 256 82 +52c00 4 1512 82 +52c04 4 256 82 +52c08 28 180 78 +52c30 1c 1512 82 +52c4c 10 180 78 +52c5c c 302 82 +52c68 14 180 78 +52c7c 8 180 78 +52c84 c 181 78 +52c90 8 85 79 +52c98 8 180 78 +52ca0 8 256 82 +52ca8 8 182 78 +52cb0 c 1512 82 +52cbc 4 182 78 +52cc0 c 1512 82 +52ccc 4 182 78 +52cd0 4 1512 82 +52cd4 8 182 78 +52cdc c 302 82 +52ce8 14 182 78 +52cfc 8 182 78 +52d04 c 182 78 +52d10 8 85 79 +52d18 8 182 78 +52d20 8 256 82 +52d28 4 183 78 +52d2c 20 1512 82 +52d4c 8 183 78 +52d54 c 302 82 +52d60 14 183 78 +52d74 8 83 55 +52d7c 4 83 55 +52d80 8 82 55 +52d88 c 83 55 +52d94 4 185 78 +52d98 4 1139 87 +52d9c 4 277 82 +52da0 4 185 78 +52da4 20 185 78 +52dc4 4 185 78 +52dc8 4 185 78 +52dcc 18 185 78 +52de4 8 185 78 +52dec c 185 78 +52df8 8 85 79 +52e00 8 185 78 +52e08 8 156 132 +52e10 8 256 82 +52e18 14 186 78 +52e2c 8 1571 82 +52e34 4 1482 82 +52e38 4 1481 82 +52e3c 8 1482 82 +52e44 18 1487 82 +52e5c 8 186 78 +52e64 c 302 82 +52e70 14 186 78 +52e84 8 186 78 +52e8c c 186 78 +52e98 8 85 79 +52ea0 8 186 78 +52ea8 8 256 82 +52eb0 24 1571 82 +52ed4 8 187 78 +52edc c 302 82 +52ee8 14 187 78 +52efc 8 187 78 +52f04 c 187 78 +52f10 8 85 79 +52f18 8 187 78 +52f20 8 256 82 +52f28 4 188 78 +52f2c 1c 1552 82 +52f48 4 188 78 +52f4c 4 1552 82 +52f50 8 188 78 +52f58 c 302 82 +52f64 14 188 78 +52f78 8 188 78 +52f80 c 188 78 +52f8c 8 85 79 +52f94 8 188 78 +52f9c c 256 82 +52fa8 8 190 78 +52fb0 c 167 78 +52fbc 24 191 78 +FUNC 52fe0 204 0 MinidumpMemoryRangeTest_GetArrayElement_Test::TestBody +52fe0 4 201 78 +52fe4 4 70 55 +52fe8 4 201 78 +52fec 4 70 55 +52ff0 8 201 78 +52ff8 4 70 55 +52ffc 4 208 78 +53000 8 72 55 +53008 4 211 78 +5300c 4 201 78 +53010 8 208 78 +53018 4 211 78 +5301c 4 256 82 +53020 4 201 78 +53024 8 256 82 +5302c 4 333 122 +53030 c 201 78 +5303c 4 333 122 +53040 4 207 78 +53044 4 208 78 +53048 4 207 78 +5304c 4 208 78 +53050 4 205 78 +53054 4 208 78 +53058 4 204 78 +5305c 4 206 78 +53060 4 208 78 +53064 4 208 78 +53068 4 254 121 +5306c 4 208 78 +53070 4 131 79 +53074 c 333 122 +53080 4 131 79 +53084 c 263 121 +53090 4 131 79 +53094 10 333 122 +530a4 4 131 79 +530a8 c 263 121 +530b4 4 131 79 +530b8 10 333 122 +530c8 4 131 79 +530cc c 254 121 +530d8 10 131 79 +530e8 14 208 78 +530fc 10 85 79 +5310c 14 109 55 +53120 4 211 78 +53124 4 1481 82 +53128 4 1482 82 +5312c 8 1481 82 +53134 8 1482 82 +5313c 1c 1487 82 +53158 8 211 78 +53160 4 302 82 +53164 4 211 78 +53168 8 302 82 +53170 14 211 78 +53184 8 211 78 +5318c c 212 78 +53198 8 85 79 +531a0 8 211 78 +531a8 c 256 82 +531b4 8 213 78 +531bc 8 203 78 +531c4 20 214 78 +FUNC 531e4 5ac 0 MinidumpMemoryRangeTest_SubrangeAndGetData_Test::TestBody +531e4 4 140 78 +531e8 4 70 55 +531ec c 140 78 +531f8 10 70 55 +53208 c 72 55 +53214 8 140 78 +5321c 8 146 78 +53224 4 256 82 +53228 4 140 78 +5322c 4 256 82 +53230 4 146 78 +53234 8 140 78 +5323c 4 256 82 +53240 4 145 78 +53244 4 146 78 +53248 4 145 78 +5324c 4 146 78 +53250 4 144 78 +53254 4 146 78 +53258 4 143 78 +5325c 4 146 78 +53260 4 146 78 +53264 8 149 78 +5326c 4 146 78 +53270 4 131 79 +53274 10 333 122 +53284 4 131 79 +53288 c 263 121 +53294 4 131 79 +53298 10 333 122 +532a8 4 131 79 +532ac c 263 121 +532b8 4 131 79 +532bc c 131 79 +532c8 14 146 78 +532dc 10 85 79 +532ec 20 149 78 +5330c 4 150 78 +53310 4 83 55 +53314 4 83 55 +53318 4 83 55 +5331c 4 83 55 +53320 8 82 55 +53328 c 83 55 +53334 4 277 82 +53338 4 1139 87 +5333c 4 151 78 +53340 20 151 78 +53360 4 151 78 +53364 4 151 78 +53368 18 151 78 +53380 8 151 78 +53388 c 151 78 +53394 8 85 79 +5339c 8 151 78 +533a4 8 156 132 +533ac 4 256 82 +533b0 4 1512 82 +533b4 4 256 82 +533b8 28 152 78 +533e0 1c 1512 82 +533fc 10 152 78 +5340c c 302 82 +53418 14 152 78 +5342c 8 152 78 +53434 c 153 78 +53440 8 85 79 +53448 8 152 78 +53450 8 256 82 +53458 8 154 78 +53460 c 1512 82 +5346c 4 154 78 +53470 c 1512 82 +5347c 4 154 78 +53480 4 1512 82 +53484 8 154 78 +5348c c 302 82 +53498 14 154 78 +534ac 8 154 78 +534b4 c 154 78 +534c0 8 85 79 +534c8 8 154 78 +534d0 8 256 82 +534d8 4 155 78 +534dc 20 1512 82 +534fc 8 155 78 +53504 c 302 82 +53510 14 155 78 +53524 8 83 55 +5352c 4 83 55 +53530 8 82 55 +53538 c 83 55 +53544 4 157 78 +53548 4 1139 87 +5354c 4 277 82 +53550 4 157 78 +53554 20 157 78 +53574 4 157 78 +53578 4 157 78 +5357c 18 157 78 +53594 8 157 78 +5359c c 157 78 +535a8 8 85 79 +535b0 8 157 78 +535b8 8 156 132 +535c0 8 256 82 +535c8 14 158 78 +535dc 8 1571 82 +535e4 4 1482 82 +535e8 4 1481 82 +535ec 8 1482 82 +535f4 18 1487 82 +5360c 8 158 78 +53614 c 302 82 +53620 14 158 78 +53634 8 158 78 +5363c c 158 78 +53648 8 85 79 +53650 8 158 78 +53658 8 256 82 +53660 24 1571 82 +53684 8 159 78 +5368c c 302 82 +53698 14 159 78 +536ac 8 159 78 +536b4 c 159 78 +536c0 8 85 79 +536c8 8 159 78 +536d0 8 256 82 +536d8 4 160 78 +536dc 1c 1552 82 +536f8 4 160 78 +536fc 4 1552 82 +53700 8 160 78 +53708 c 302 82 +53714 14 160 78 +53728 8 160 78 +53730 c 160 78 +5373c 8 85 79 +53744 8 160 78 +5374c c 256 82 +53758 8 162 78 +53760 c 142 78 +5376c 24 163 78 +FUNC 53790 90 0 testing::internal::CmpHelperEQFailure +53790 c 1464 82 +5379c 8 1408 82 +537a4 4 1464 82 +537a8 4 1464 82 +537ac c 1408 82 +537b8 4 1464 82 +537bc 1c 1408 82 +537d8 24 1471 82 +537fc 10 156 132 +5380c 14 1472 82 +FUNC 53820 190 0 MinidumpMemoryRangeTest_GetDataWithTemplateType_Test::TestBody +53820 4 193 78 +53824 4 70 55 +53828 4 99 55 +5382c 4 193 78 +53830 4 70 55 +53834 4 99 55 +53838 4 193 78 +5383c 4 99 55 +53840 4 70 55 +53844 8 72 55 +5384c 4 99 55 +53850 8 193 78 +53858 8 99 55 +53860 4 196 78 +53864 c 195 78 +53870 4 1482 82 +53874 4 196 78 +53878 8 1481 82 +53880 8 1482 82 +53888 8 1487 82 +53890 8 196 78 +53898 4 302 82 +5389c 4 196 78 +538a0 4 196 78 +538a4 8 302 82 +538ac 18 196 78 +538c4 8 196 78 +538cc c 196 78 +538d8 8 85 79 +538e0 8 196 78 +538e8 8 256 82 +538f0 10 99 55 +53900 4 197 78 +53904 4 198 78 +53908 4 1482 82 +5390c 4 198 78 +53910 8 1481 82 +53918 8 1482 82 +53920 1c 1487 82 +5393c 8 198 78 +53944 4 302 82 +53948 4 198 78 +5394c 4 198 78 +53950 8 302 82 +53958 18 198 78 +53970 8 198 78 +53978 c 198 78 +53984 8 85 79 +5398c 8 198 78 +53994 8 256 82 +5399c 14 199 78 +FUNC 539b0 190 0 MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test::TestBody +539b0 4 216 78 +539b4 4 70 55 +539b8 4 109 55 +539bc 4 216 78 +539c0 4 70 55 +539c4 4 109 55 +539c8 4 216 78 +539cc 4 109 55 +539d0 4 70 55 +539d4 8 72 55 +539dc 4 109 55 +539e0 8 216 78 +539e8 8 109 55 +539f0 4 219 78 +539f4 c 218 78 +53a00 4 1482 82 +53a04 4 219 78 +53a08 8 1481 82 +53a10 8 1482 82 +53a18 8 1487 82 +53a20 8 219 78 +53a28 4 302 82 +53a2c 4 219 78 +53a30 4 219 78 +53a34 8 302 82 +53a3c 18 219 78 +53a54 8 219 78 +53a5c c 219 78 +53a68 8 85 79 +53a70 8 219 78 +53a78 8 256 82 +53a80 10 109 55 +53a90 4 220 78 +53a94 4 221 78 +53a98 4 1482 82 +53a9c 4 221 78 +53aa0 8 1481 82 +53aa8 8 1482 82 +53ab0 1c 1487 82 +53acc 8 221 78 +53ad4 4 302 82 +53ad8 4 221 78 +53adc 4 221 78 +53ae0 8 302 82 +53ae8 18 221 78 +53b00 8 221 78 +53b08 c 221 78 +53b14 8 85 79 +53b1c 8 221 78 +53b24 8 256 82 +53b2c 14 222 78 +FUNC 53b40 bc 0 testing::internal::CmpHelperEQ, std::allocator > > +53b40 18 1476 82 +53b58 c 1481 82 +53b64 8 1476 82 +53b6c 8 1476 82 +53b74 10 1481 82 +53b84 c 1482 82 +53b90 10 1427 82 +53ba0 4 1382 82 +53ba4 4 1427 82 +53ba8 c 1382 82 +53bb4 1c 1471 82 +53bd0 10 156 132 +53be0 1c 1488 82 +FUNC 53bfc 3d0 0 MinidumpMemoryRangeTest_GetAsciiMDString_Test::TestBody +53bfc 4 224 78 +53c00 4 228 78 +53c04 4 239 78 +53c08 4 224 78 +53c0c 4 225 78 +53c10 10 224 78 +53c20 4 225 78 +53c24 4 228 78 +53c28 8 229 78 +53c30 8 230 78 +53c38 4 231 78 +53c3c 4 225 78 +53c40 4 231 78 +53c44 8 232 78 +53c4c 4 239 78 +53c50 4 241 78 +53c54 8 242 78 +53c5c 8 243 78 +53c64 4 244 78 +53c68 4 225 78 +53c6c 4 244 78 +53c70 4 245 78 +53c74 4 70 55 +53c78 4 245 78 +53c7c 8 247 78 +53c84 4 248 78 +53c88 4 251 78 +53c8c 4 248 78 +53c90 4 72 55 +53c94 4 239 78 +53c98 4 251 78 +53c9c 4 240 78 +53ca0 4 70 55 +53ca4 c 225 78 +53cb0 4 72 55 +53cb4 8 251 78 +53cbc 4 1481 82 +53cc0 4 240 78 +53cc4 4 1481 82 +53cc8 4 225 78 +53ccc 4 251 78 +53cd0 20 1481 82 +53cf0 10 1482 82 +53d00 c 1427 82 +53d0c c 1382 82 +53d18 24 1471 82 +53d3c 18 156 132 +53d54 8 251 78 +53d5c c 302 82 +53d68 18 251 78 +53d80 8 251 78 +53d88 c 251 78 +53d94 8 85 79 +53d9c 8 251 78 +53da4 4 256 82 +53da8 8 1481 82 +53db0 4 256 82 +53db4 10 252 78 +53dc4 14 1481 82 +53dd8 10 1482 82 +53de8 c 1427 82 +53df4 c 1382 82 +53e00 24 1471 82 +53e24 18 156 132 +53e3c 8 252 78 +53e44 c 302 82 +53e50 18 252 78 +53e68 8 252 78 +53e70 c 252 78 +53e7c 8 85 79 +53e84 8 252 78 +53e8c 4 256 82 +53e90 8 1512 82 +53e98 4 256 82 +53e9c 10 255 78 +53eac 1c 1512 82 +53ec8 8 156 132 +53ed0 8 255 78 +53ed8 c 302 82 +53ee4 18 255 78 +53efc 8 255 78 +53f04 c 256 78 +53f10 8 85 79 +53f18 8 255 78 +53f20 8 256 82 +53f28 10 257 78 +53f38 1c 1512 82 +53f54 8 156 132 +53f5c 8 257 78 +53f64 c 302 82 +53f70 18 257 78 +53f88 8 257 78 +53f90 c 257 78 +53f9c 8 85 79 +53fa4 8 257 78 +53fac 8 256 82 +53fb4 18 258 78 +FUNC 53fcc 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +53fcc 4 484 85 +FUNC 53fd0 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +53fd0 4 484 85 +FUNC 53fd4 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +53fd4 4 484 85 +FUNC 53fd8 4 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +53fd8 4 484 85 +FUNC 53fdc 14 0 AndroidUContext_SigmakOffset_Test::~AndroidUContext_SigmakOffset_Test +53fdc 14 183 34 +FUNC 53ff0 24 0 AndroidUContext_SigmakOffset_Test::~AndroidUContext_SigmakOffset_Test +53ff0 c 183 34 +53ffc 8 183 34 +54004 4 183 34 +54008 8 183 34 +54010 4 183 34 +FUNC 54014 14 0 AndroidUContext_GRegsOffset_Test::~AndroidUContext_GRegsOffset_Test +54014 14 50 34 +FUNC 54028 24 0 AndroidUContext_GRegsOffset_Test::~AndroidUContext_GRegsOffset_Test +54028 c 50 34 +54034 8 50 34 +5403c 4 50 34 +54040 8 50 34 +54048 4 50 34 +FUNC 5404c 3c 0 testing::internal::TestFactoryImpl::CreateTest +5404c 10 486 85 +5405c 8 486 85 +54064 8 183 34 +5406c 4 486 85 +54070 c 183 34 +5407c c 486 85 +FUNC 54088 3c 0 testing::internal::TestFactoryImpl::CreateTest +54088 10 486 85 +54098 8 486 85 +540a0 8 50 34 +540a8 4 486 85 +540ac c 50 34 +540b8 c 486 85 +FUNC 540c4 13c 0 testing::internal::CmpHelperEQFailure +540c4 c 1464 82 +540d0 4 884 80 +540d4 10 1464 82 +540e4 8 884 80 +540ec c 1464 82 +540f8 4 1464 82 +540fc 4 884 80 +54100 c 263 121 +5410c 4 112 132 +54110 10 263 121 +54120 4 379 131 +54124 4 112 132 +54128 4 378 131 +5412c 4 481 101 +54130 8 379 131 +54138 10 148 137 +54148 4 380 131 +5414c 4 101 103 +54150 8 886 80 +54158 c 884 80 +54164 8 263 121 +5416c 4 112 132 +54170 10 263 121 +54180 4 379 131 +54184 4 112 132 +54188 4 378 131 +5418c 4 481 101 +54190 8 379 131 +54198 10 148 137 +541a8 4 380 131 +541ac 4 101 103 +541b0 8 886 80 +541b8 1c 1471 82 +541d4 10 156 132 +541e4 1c 1472 82 +FUNC 54200 9c 0 AndroidUContext_SigmakOffset_Test::TestBody +54200 c 183 34 +5420c 4 1482 82 +54210 4 183 34 +54214 8 1482 82 +5421c 8 184 34 +54224 4 1144 87 +54228 c 298 82 +54234 8 298 82 +5423c 18 184 34 +54254 4 184 34 +54258 4 184 34 +5425c 8 184 34 +54264 c 184 34 +54270 c 1140 87 +5427c 8 184 34 +54284 8 256 82 +5428c 10 186 34 +FUNC 5429c 1d8 0 AndroidUContext_GRegsOffset_Test::TestBody +5429c c 50 34 +542a8 4 1482 82 +542ac 4 50 34 +542b0 8 1482 82 +542b8 8 59 34 +542c0 4 1144 87 +542c4 c 298 82 +542d0 8 298 82 +542d8 1c 59 34 +542f4 c 256 82 +54300 8 1482 82 +54308 8 61 34 +54310 4 1144 87 +54314 c 298 82 +54320 8 298 82 +54328 1c 61 34 +54344 8 256 82 +5434c 8 1482 82 +54354 8 63 34 +5435c 4 1144 87 +54360 c 298 82 +5436c 8 298 82 +54374 1c 63 34 +54390 8 256 82 +54398 8 1482 82 +543a0 8 65 34 +543a8 4 1144 87 +543ac c 298 82 +543b8 8 298 82 +543c0 1c 65 34 +543dc 8 256 82 +543e4 8 1482 82 +543ec 8 67 34 +543f4 4 1144 87 +543f8 c 298 82 +54404 8 298 82 +5440c 1c 67 34 +54428 c 67 34 +54434 c 67 34 +54440 c 1140 87 +5444c 8 67 34 +54454 10 256 82 +54464 10 181 34 +FUNC 54474 1c 0 std::basic_streambuf >::_M_sputnc +54474 8 208 129 +5447c 14 209 129 +FUNC 54490 ec 0 std::basic_ostream >::operator<< +54490 10 236 121 +544a0 8 239 121 +544a8 4 236 121 +544ac 8 238 121 +544b4 8 181 122 +544bc 8 239 121 +544c4 8 239 121 +544cc c 181 122 +544d8 4 199 121 +544dc 18 211 121 +544f4 4 202 121 +544f8 4 145 110 +544fc 4 202 121 +54500 4 145 110 +54504 4 202 121 +54508 8 145 110 +54510 c 351 117 +5451c 8 351 117 +54524 4 67 120 +54528 4 202 121 +5452c 8 67 120 +54534 c 202 121 +54540 4 67 120 +54544 4 57 123 +54548 c 67 120 +54554 8 202 121 +5455c 4 210 121 +54560 8 212 121 +54568 14 241 121 +FUNC 5457c 48 0 std::basic_streambuf >::sputc +5457c 10 198 129 +5458c 10 200 129 +5459c c 199 129 +545a8 8 223 140 +545b0 4 199 129 +545b4 8 200 129 +545bc 8 201 129 +FUNC 545c4 11c 0 std::basic_ostream >::_M_put_char +545c4 10 300 121 +545d4 8 300 121 +545dc 10 181 122 +545ec 4 302 121 +545f0 18 305 121 +54608 8 307 121 +54610 8 308 121 +54618 c 309 121 +54624 4 310 121 +54628 4 309 121 +5462c 8 310 121 +54634 8 311 121 +5463c 8 311 121 +54644 4 312 121 +54648 4 312 121 +5464c 8 312 121 +54654 c 312 121 +54660 c 311 121 +5466c c 315 121 +54678 8 316 121 +54680 c 316 121 +5468c c 316 121 +54698 8 316 121 +546a0 4 319 121 +546a4 c 139 110 +546b0 4 325 121 +546b4 14 326 121 +546c8 8 327 121 +546d0 10 328 121 +FUNC 546e0 2dc 0 std::operator+, std::allocator > +546e0 24 46 134 +54704 8 229 140 +5470c 8 400 131 +54714 4 120 132 +54718 4 400 131 +5471c 8 481 101 +54724 8 608 130 +5472c c 600 130 +54738 8 610 130 +54740 8 347 101 +54748 4 348 101 +5474c 4 611 130 +54750 4 613 130 +54754 4 612 130 +54758 c 613 130 +54764 4 57 134 +54768 4 470 131 +5476c 4 101 103 +54770 4 470 131 +54774 4 64 132 +54778 c 74 132 +54784 c 74 132 +54790 8 74 132 +54798 8 472 131 +547a0 10 473 131 +547b0 4 356 101 +547b4 4 346 101 +547b8 8 347 101 +547c0 4 348 101 +547c4 4 352 101 +547c8 8 353 101 +547d0 10 107 137 +547e0 c 106 137 +547ec 4 107 137 +547f0 8 106 137 +547f8 4 479 131 +547fc 4 106 137 +54800 4 107 137 +54804 4 101 103 +54808 8 478 131 +54810 4 160 132 +54814 4 164 132 +54818 8 165 132 +54820 c 482 131 +5482c 4 107 137 +54830 4 232 140 +54834 8 483 131 +5483c 4 107 137 +54840 8 106 137 +54848 8 101 103 +54850 14 485 131 +54864 8 197 130 +5486c 4 64 132 +54870 4 198 130 +54874 c 74 132 +54880 c 74 132 +5488c 8 74 132 +54894 8 199 130 +5489c 10 200 130 +548ac 4 356 101 +548b0 4 346 101 +548b4 8 347 101 +548bc 4 348 101 +548c0 4 352 101 +548c4 8 348 101 +548cc 10 86 137 +548dc c 86 137 +548e8 10 146 103 +548f8 1c 86 137 +54914 10 146 103 +54924 8 205 130 +5492c 8 206 130 +54934 4 101 103 +54938 4 205 130 +5493c 4 160 132 +54940 4 164 132 +54944 8 165 132 +5494c 4 210 130 +54950 4 211 130 +54954 c 86 137 +54960 18 86 137 +54978 8 146 103 +54980 10 101 103 +54990 4 232 140 +54994 c 214 130 +549a0 1c 60 134 +FUNC 549bc 234 0 testing::internal::PrintCharAndCodeTo +549bc c 217 93 +549c8 4 333 122 +549cc 8 217 93 +549d4 8 217 93 +549dc 10 333 122 +549ec 1c 147 93 +54a08 10 333 122 +54a18 10 147 93 +54a28 10 333 122 +54a38 1c 147 93 +54a54 10 333 122 +54a64 10 147 93 +54a74 20 333 122 +54a94 8 187 93 +54a9c 50 333 122 +54aec 4 138 93 +54af0 8 179 93 +54af8 8 305 122 +54b00 4 181 93 +54b04 8 305 122 +54b0c c 183 93 +54b18 4 183 93 +54b1c 4 183 93 +54b20 14 183 93 +54b34 c 183 93 +54b40 c 156 132 +54b4c 4 184 93 +54b50 4 156 132 +54b54 c 333 122 +54b60 4 226 93 +54b64 10 333 122 +54b74 c 228 93 +54b80 8 233 93 +54b88 10 233 93 +54b98 c 333 122 +54ba4 4 236 93 +54ba8 4 333 122 +54bac c 236 93 +54bb8 c 236 93 +54bc4 8 156 132 +54bcc 10 333 122 +54bdc 14 239 93 +FUNC 54bf0 4 0 testing::internal::PrintTo +54bf0 4 242 93 +FUNC 54bf4 190 0 testing::internal::PrintAsCharLiteralTo +54bf4 4 146 93 +54bf8 4 147 93 +54bfc 10 146 93 +54c0c 4 146 93 +54c10 18 147 93 +54c28 10 333 122 +54c38 10 147 93 +54c48 10 333 122 +54c58 1c 147 93 +54c74 10 333 122 +54c84 10 147 93 +54c94 70 333 122 +54d04 8 187 93 +54d0c 4 138 93 +54d10 8 179 93 +54d18 c 305 122 +54d24 8 181 93 +54d2c c 183 93 +54d38 4 183 93 +54d3c 4 183 93 +54d40 14 183 93 +54d54 c 183 93 +54d60 10 156 132 +54d70 4 184 93 +54d74 10 188 93 +FUNC 54d84 100 0 testing::internal::PrintCharsAsStringTo +54d84 c 262 93 +54d90 4 333 122 +54d94 10 262 93 +54da4 8 333 122 +54dac 4 262 93 +54db0 4 262 93 +54db4 14 333 122 +54dc8 4 266 93 +54dcc c 333 122 +54dd8 8 267 93 +54de0 4 268 93 +54de4 4 269 93 +54de8 8 2200 87 +54df0 4 269 93 +54df4 10 193 93 +54e04 c 333 122 +54e10 8 196 93 +54e18 c 333 122 +54e24 8 199 93 +54e2c c 201 93 +54e38 10 275 93 +54e48 8 333 122 +54e50 14 278 93 +54e64 20 333 122 +FUNC 54e84 18 0 testing::internal::PrintStringTo +54e84 4 354 93 +54e88 4 354 93 +54e8c 4 400 131 +54e90 c 355 93 +FUNC 54e9c 34 0 testing::internal::HasNewFatalFailureHelper::ReportTestPartResult +54e9c 8 102 94 +54ea4 c 103 94 +54eb0 8 104 94 +54eb8 10 105 94 +54ec8 8 106 94 +FUNC 54ed0 34 0 testing::internal::HasNewFatalFailureHelper::~HasNewFatalFailureHelper +54ed0 10 96 94 +54ee0 c 96 94 +54eec 4 937 91 +54ef0 8 98 94 +54ef8 8 99 94 +54f00 4 98 94 +FUNC 54f04 24 0 testing::internal::HasNewFatalFailureHelper::~HasNewFatalFailureHelper +54f04 c 96 94 +54f10 4 96 94 +54f14 4 99 94 +54f18 4 99 94 +54f1c 8 99 94 +54f24 4 99 94 +FUNC 54f28 48 0 testing::internal::HasNewFatalFailureHelper::HasNewFatalFailureHelper +54f28 c 89 94 +54f34 4 89 94 +54f38 10 92 94 +54f48 4 937 91 +54f4c 8 92 94 +54f54 4 92 94 +54f58 4 937 91 +54f5c 8 93 94 +54f64 8 94 94 +54f6c 4 93 94 +FUNC 54f70 a8 0 testing::TestPartResult::ExtractSummary +54f70 4 51 94 +54f74 4 52 94 +54f78 8 51 94 +54f80 4 52 94 +54f84 8 51 94 +54f8c 4 51 94 +54f90 4 52 94 +54f94 4 112 132 +54f98 4 481 101 +54f9c 4 52 94 +54fa0 4 54 94 +54fa4 c 229 140 +54fb0 10 379 131 +54fc0 c 107 137 +54fcc 4 355 114 +54fd0 10 324 131 +54fe0 c 107 137 +54fec c 106 137 +54ff8 4 107 137 +54ffc 4 325 131 +55000 4 55 94 +55004 4 101 103 +55008 10 55 94 +FUNC 55018 48 0 testing::TestPartResult::TestPartResult +55018 c 47 81 +55024 18 47 81 +5503c 4 47 81 +55040 4 47 81 +55044 8 47 81 +5504c 8 47 81 +55054 8 47 81 +5505c 4 47 81 +FUNC 55060 268 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +55060 24 81 138 +55084 4 81 138 +55088 8 192 139 +55090 8 81 138 +55098 10 192 139 +550a8 14 173 139 +550bc 10 41 138 +550cc c 176 139 +550d8 4 175 139 +550dc 10 176 139 +550ec 4 356 101 +550f0 8 346 101 +550f8 8 177 139 +55100 c 347 101 +5510c 8 158 101 +55114 8 134 119 +5511c 8 158 101 +55124 4 352 101 +55128 4 158 101 +5512c 8 352 101 +55134 4 91 138 +55138 4 84 137 +5513c 14 86 137 +55150 8 86 137 +55158 4 139 103 +5515c 14 139 103 +55170 4 88 137 +55174 4 89 137 +55178 14 86 137 +5518c c 93 138 +55198 4 119 103 +5519c c 119 103 +551a8 8 95 138 +551b0 4 314 137 +551b4 4 249 137 +551b8 4 314 137 +551bc 8 249 137 +551c4 8 249 137 +551cc 4 139 103 +551d0 c 139 103 +551dc c 249 137 +551e8 4 98 138 +551ec 4 86 137 +551f0 4 84 137 +551f4 14 86 137 +55208 8 86 137 +55210 4 139 103 +55214 c 139 103 +55220 4 88 137 +55224 4 89 137 +55228 20 86 137 +55248 8 191 103 +55250 20 156 132 +55270 c 662 139 +5527c 4 319 101 +55280 8 161 101 +55288 8 135 119 +55290 4 161 101 +55294 4 104 138 +55298 4 666 139 +5529c 4 667 139 +552a0 8 104 138 +552a8 4 668 139 +552ac 1c 105 138 +FUNC 552c8 10 0 std::ios_base::precision +552c8 4 131 110 +552cc 4 132 110 +552d0 8 134 110 +FUNC 552d8 10 0 std::ios_base::width +552d8 4 138 110 +552dc 4 139 110 +552e0 8 141 110 +FUNC 552e8 20 0 testing::internal::DeleteThreadLocalValue +552e8 8 1988 87 +552f0 4 1989 87 +552f4 c 1989 87 +55300 8 1990 87 +FUNC 55308 20 0 testing::Test::DeleteSelf_ +55308 8 453 82 +55310 4 453 82 +55314 4 453 82 +55318 8 453 82 +55320 8 453 82 +FUNC 55328 18 0 testing::TestCase::RunSetUpTestCase +55328 8 879 82 +55330 10 879 82 +FUNC 55340 18 0 testing::TestCase::RunTearDownTestCase +55340 8 883 82 +55348 10 883 82 +FUNC 55358 14 0 testing::TestCase::TestReportableDisabled +55358 4 696 82 +5535c 4 898 82 +55360 4 898 82 +55364 8 899 82 +FUNC 5536c 8 0 testing::TestCase::TestReportable +5536c 8 909 82 +FUNC 55374 8 0 testing::TestCase::ShouldRunTest +55374 8 914 82 +FUNC 5537c 4 0 testing::EmptyTestEventListener::OnTestProgramStart +5537c 4 1038 82 +FUNC 55380 4 0 testing::EmptyTestEventListener::OnTestIterationStart +55380 4 1040 82 +FUNC 55384 4 0 testing::EmptyTestEventListener::OnEnvironmentsSetUpStart +55384 4 1041 82 +FUNC 55388 4 0 testing::EmptyTestEventListener::OnEnvironmentsSetUpEnd +55388 4 1042 82 +FUNC 5538c 4 0 testing::EmptyTestEventListener::OnTestCaseStart +5538c 4 1043 82 +FUNC 55390 4 0 testing::EmptyTestEventListener::OnTestStart +55390 4 1044 82 +FUNC 55394 4 0 testing::EmptyTestEventListener::OnTestPartResult +55394 4 1045 82 +FUNC 55398 4 0 testing::EmptyTestEventListener::OnTestEnd +55398 4 1046 82 +FUNC 5539c 4 0 testing::EmptyTestEventListener::OnTestCaseEnd +5539c 4 1047 82 +FUNC 553a0 4 0 testing::EmptyTestEventListener::OnEnvironmentsTearDownStart +553a0 4 1048 82 +FUNC 553a4 4 0 testing::EmptyTestEventListener::OnEnvironmentsTearDownEnd +553a4 4 1049 82 +FUNC 553a8 4 0 testing::EmptyTestEventListener::OnTestProgramEnd +553a8 4 1052 82 +FUNC 553ac 8 0 testing::internal::ShouldRunTestCase +553ac 8 348 95 +FUNC 553b4 4 0 testing::Test::SetUp +553b4 4 2188 95 +FUNC 553b8 4 0 testing::Test::TearDown +553b8 4 2194 95 +FUNC 553bc 4 0 testing::internal::PrettyUnitTestResultPrinter::OnTestProgramStart +553bc 4 2987 95 +FUNC 553c0 4 0 testing::internal::PrettyUnitTestResultPrinter::OnEnvironmentsSetUpEnd +553c0 4 2990 95 +FUNC 553c4 4 0 testing::internal::PrettyUnitTestResultPrinter::OnEnvironmentsTearDownEnd +553c4 4 2997 95 +FUNC 553c8 4 0 testing::internal::PrettyUnitTestResultPrinter::OnTestProgramEnd +553c8 4 2999 95 +FUNC 553cc 4 0 testing::internal::OsStackTraceGetter::UponLeavingGTest +553cc 4 3803 95 +FUNC 553d0 1c 0 testing::internal::SetUpEnvironment +553d0 8 4486 95 +553d8 14 4486 95 +FUNC 553ec 1c 0 testing::internal::TearDownEnvironment +553ec 8 4487 95 +553f4 14 4487 95 +FUNC 55408 20 0 testing::internal::Delete +55408 8 339 91 +55410 4 340 91 +55414 c 340 91 +55420 8 341 91 +FUNC 55428 20 0 testing::internal::Delete +55428 8 339 91 +55430 4 340 91 +55434 c 340 91 +55440 8 341 91 +FUNC 55448 20 0 testing::internal::Delete +55448 8 339 91 +55450 4 340 91 +55454 c 340 91 +55460 8 341 91 +FUNC 55468 4 0 testing::internal::ThreadLocal::ValueHolder::~ValueHolder +55468 4 2017 87 +FUNC 5546c 4 0 testing::internal::PrettyUnitTestResultPrinter::~PrettyUnitTestResultPrinter +5546c 4 2979 95 +FUNC 55470 4 0 testing::internal::DefaultPerThreadTestPartResultReporter::~DefaultPerThreadTestPartResultReporter +55470 4 490 91 +FUNC 55474 4 0 testing::internal::DefaultGlobalTestPartResultReporter::~DefaultGlobalTestPartResultReporter +55474 4 474 91 +FUNC 55478 4 0 testing::internal::ThreadLocal::ValueHolder::~ValueHolder +55478 4 2017 87 +FUNC 5547c 4 0 testing::internal::DefaultPerThreadTestPartResultReporter::~DefaultPerThreadTestPartResultReporter +5547c 4 490 91 +FUNC 55480 4 0 testing::internal::DefaultGlobalTestPartResultReporter::~DefaultGlobalTestPartResultReporter +55480 4 474 91 +FUNC 55484 4 0 testing::internal::PrettyUnitTestResultPrinter::~PrettyUnitTestResultPrinter +55484 4 2979 95 +FUNC 55488 64 0 testing::internal::TestEventRepeater::OnTestProgramStart +55488 10 3263 95 +55498 14 3263 95 +554ac c 192 139 +554b8 8 3263 95 +554c0 1c 3263 95 +554dc 10 3263 95 +FUNC 554ec 64 0 testing::internal::TestEventRepeater::OnEnvironmentsSetUpStart +554ec 10 3264 95 +554fc 14 3264 95 +55510 c 192 139 +5551c 8 3264 95 +55524 1c 3264 95 +55540 10 3264 95 +FUNC 55550 64 0 testing::internal::TestEventRepeater::OnTestCaseStart +55550 10 3265 95 +55560 14 3265 95 +55574 c 192 139 +55580 8 3265 95 +55588 1c 3265 95 +555a4 10 3265 95 +FUNC 555b4 64 0 testing::internal::TestEventRepeater::OnTestStart +555b4 10 3266 95 +555c4 14 3266 95 +555d8 c 192 139 +555e4 8 3266 95 +555ec 1c 3266 95 +55608 10 3266 95 +FUNC 55618 64 0 testing::internal::TestEventRepeater::OnTestPartResult +55618 10 3267 95 +55628 14 3267 95 +5563c c 192 139 +55648 8 3267 95 +55650 1c 3267 95 +5566c 10 3267 95 +FUNC 5567c 64 0 testing::internal::TestEventRepeater::OnEnvironmentsTearDownStart +5567c 10 3268 95 +5568c 14 3268 95 +556a0 c 192 139 +556ac 8 3268 95 +556b4 1c 3268 95 +556d0 10 3268 95 +FUNC 556e0 80 0 testing::internal::TestEventRepeater::OnEnvironmentsSetUpEnd +556e0 14 3269 95 +556f4 10 3269 95 +55704 4 192 139 +55708 4 3269 95 +5570c c 192 139 +55718 8 3269 95 +55720 4 3269 95 +55724 8 202 139 +5572c 20 3269 95 +5574c 14 3269 95 +FUNC 55760 80 0 testing::internal::TestEventRepeater::OnEnvironmentsTearDownEnd +55760 14 3270 95 +55774 10 3270 95 +55784 4 192 139 +55788 4 3270 95 +5578c c 192 139 +55798 8 3270 95 +557a0 4 3270 95 +557a4 8 202 139 +557ac 20 3270 95 +557cc 14 3270 95 +FUNC 557e0 80 0 testing::internal::TestEventRepeater::OnTestEnd +557e0 14 3271 95 +557f4 10 3271 95 +55804 4 192 139 +55808 4 3271 95 +5580c c 192 139 +55818 8 3271 95 +55820 4 3271 95 +55824 8 202 139 +5582c 20 3271 95 +5584c 14 3271 95 +FUNC 55860 80 0 testing::internal::TestEventRepeater::OnTestCaseEnd +55860 14 3272 95 +55874 10 3272 95 +55884 4 192 139 +55888 4 3272 95 +5588c c 192 139 +55898 8 3272 95 +558a0 4 3272 95 +558a4 8 202 139 +558ac 20 3272 95 +558cc 14 3272 95 +FUNC 558e0 80 0 testing::internal::TestEventRepeater::OnTestProgramEnd +558e0 14 3273 95 +558f4 10 3273 95 +55904 4 192 139 +55908 4 3273 95 +5590c c 192 139 +55918 8 3273 95 +55920 4 3273 95 +55924 8 202 139 +5592c 20 3273 95 +5594c 14 3273 95 +FUNC 55960 6c 0 testing::internal::TestEventRepeater::OnTestIterationStart +55960 10 3279 95 +55970 8 3279 95 +55978 4 3280 95 +5597c 8 3279 95 +55984 4 3280 95 +55988 c 192 139 +55994 8 3281 95 +5599c 4 3282 95 +559a0 4 3282 95 +559a4 4 3281 95 +559a8 4 3282 95 +559ac 10 3282 95 +559bc 10 3285 95 +FUNC 559cc 88 0 testing::internal::TestEventRepeater::OnTestIterationEnd +559cc 14 3288 95 +559e0 10 3289 95 +559f0 8 192 139 +559f8 4 3290 95 +559fc c 192 139 +55a08 8 3290 95 +55a10 4 3290 95 +55a14 8 202 139 +55a1c 4 3291 95 +55a20 8 3290 95 +55a28 8 3291 95 +55a30 10 3291 95 +55a40 14 3294 95 +FUNC 55a54 84 0 testing::internal::PrintOnOneLine +55a54 10 4788 95 +55a64 4 4788 95 +55a68 4 4789 95 +55a6c 4 4796 95 +55a70 4 4789 95 +55a74 4 4796 95 +55a78 8 4790 95 +55a80 8 4791 95 +55a88 8 4804 95 +55a90 4 4792 95 +55a94 4 4804 95 +55a98 8 4792 95 +55aa0 8 4795 95 +55aa8 4 4796 95 +55aac 4 4797 95 +55ab0 8 4796 95 +55ab8 4 4800 95 +55abc 4 4799 95 +55ac0 8 4790 95 +55ac8 10 4804 95 +FUNC 55ad8 60 0 testing::internal::SumOverTestCaseList +55ad8 c 325 95 +55ae4 4 328 95 +55ae8 4 325 95 +55aec 4 327 95 +55af0 4 325 95 +55af4 c 192 139 +55b00 8 328 95 +55b08 4 329 95 +55b0c 4 328 95 +55b10 8 329 95 +55b18 4 329 95 +55b1c 8 328 95 +55b24 14 332 95 +FUNC 55b38 30 0 testing::internal::StreamingListener::~StreamingListener +55b38 c 1044 91 +55b44 8 1044 91 +55b4c 8 1153 87 +55b54 c 1155 87 +55b60 8 1044 91 +FUNC 55b68 24 0 testing::internal::StreamingListener::~StreamingListener +55b68 c 1044 91 +55b74 8 1044 91 +55b7c 4 1044 91 +55b80 8 1044 91 +55b88 4 1044 91 +FUNC 55b8c 5c 0 std::allocator::_M_allocate +55b8c 8 341 101 +55b94 8 342 101 +55b9c 4 341 101 +55ba0 4 342 101 +55ba4 c 343 101 +55bb0 8 343 101 +55bb8 4 356 101 +55bbc 4 346 101 +55bc0 c 347 101 +55bcc 4 348 101 +55bd0 10 352 101 +55be0 8 357 101 +FUNC 55be8 a8 0 testing::internal::UnitTestOptions::PatternMatchesString +55be8 c 445 95 +55bf4 8 445 95 +55bfc 30 446 95 +55c2c 10 449 95 +55c3c c 451 95 +55c48 10 453 95 +55c58 c 453 95 +55c64 8 453 95 +55c6c c 456 95 +55c78 8 457 95 +55c80 4 451 95 +55c84 c 459 95 +FUNC 55c90 58 0 testing::internal::UnitTestOptions::MatchesFilter +55c90 10 462 95 +55ca0 8 462 95 +55ca8 10 465 95 +55cb8 4 465 95 +55cbc c 470 95 +55cc8 4 473 95 +55ccc 4 478 95 +55cd0 4 479 95 +55cd4 14 480 95 +FUNC 55ce8 c 0 testing::internal::GetTestTypeId +55ce8 c 604 95 +FUNC 55cf4 24 0 testing::internal::UnitTestImpl::successful_test_count +55cf4 4 733 95 +55cf8 8 734 95 +55d00 4 733 95 +55d04 8 734 95 +55d0c 4 734 95 +55d10 8 735 95 +FUNC 55d18 24 0 testing::internal::UnitTestImpl::failed_test_count +55d18 4 738 95 +55d1c 8 739 95 +55d24 4 738 95 +55d28 8 739 95 +55d30 4 739 95 +55d34 8 740 95 +FUNC 55d3c 24 0 testing::internal::UnitTestImpl::reportable_disabled_test_count +55d3c 4 743 95 +55d40 8 745 95 +55d48 4 743 95 +55d4c 8 745 95 +55d54 4 745 95 +55d58 8 746 95 +FUNC 55d60 24 0 testing::internal::UnitTestImpl::reportable_test_count +55d60 4 754 95 +55d64 8 755 95 +55d6c 4 754 95 +55d70 8 755 95 +55d78 4 755 95 +55d7c 8 756 95 +FUNC 55d84 24 0 testing::internal::UnitTestImpl::test_to_run_count +55d84 4 764 95 +55d88 8 765 95 +55d90 4 764 95 +55d94 8 765 95 +55d9c 4 765 95 +55da0 8 766 95 +FUNC 55da8 30 0 testing::internal::GetTimeInMillis +55da8 4 784 95 +55dac 4 820 95 +55db0 4 784 95 +55db4 8 820 95 +55dbc 8 821 95 +55dc4 8 825 95 +55dcc 4 821 95 +55dd0 8 825 95 +FUNC 55dd8 30 0 testing::internal::String::CStringEquals +55dd8 4 872 95 +55ddc 4 873 95 +55de0 4 872 95 +55de4 4 873 95 +55de8 4 875 95 +55dec 4 875 95 +55df0 c 877 95 +55dfc c 878 95 +FUNC 55e08 14 0 testing::AssertionSuccess +55e08 4 277 82 +55e0c 4 971 95 +55e10 4 277 82 +55e14 4 1139 87 +55e18 4 973 95 +FUNC 55e1c 10 0 testing::AssertionFailure +55e1c 4 976 95 +55e20 4 277 82 +55e24 4 1139 87 +55e28 4 978 95 +FUNC 55e2c 30 0 testing::internal::String::CaseInsensitiveCStringEquals +55e2c 4 1866 95 +55e30 4 1868 95 +55e34 4 1866 95 +55e38 4 1867 95 +55e3c 4 1870 95 +55e40 4 1869 95 +55e44 4 2274 87 +55e48 8 1871 95 +55e50 c 1872 95 +FUNC 55e5c 58 0 testing::TestResult::GetTestPartResult +55e5c 8 1990 95 +55e64 4 1991 95 +55e68 18 192 139 +55e80 8 1991 95 +55e88 8 167 139 +55e90 c 45 138 +55e9c 4 2340 87 +55ea0 4 203 139 +55ea4 4 1994 95 +55ea8 8 203 139 +55eb0 4 1994 95 +FUNC 55eb4 58 0 testing::TestResult::GetTestProperty +55eb4 8 1999 95 +55ebc 4 2000 95 +55ec0 18 192 139 +55ed8 8 2000 95 +55ee0 8 167 139 +55ee8 c 45 138 +55ef4 4 2340 87 +55ef8 4 203 139 +55efc 4 2003 95 +55f00 8 203 139 +55f08 4 2003 95 +FUNC 55f0c 70 0 testing::TestResult::Failed +55f0c 14 2131 95 +55f20 4 2162 95 +55f24 4 2132 95 +55f28 10 192 139 +55f38 4 2162 95 +55f3c 8 2132 95 +55f44 14 2133 95 +55f58 8 2132 95 +55f60 8 2136 95 +55f68 4 2134 95 +55f6c 10 2137 95 +FUNC 55f7c 18 0 testing::TestCase::TestFailed +55f7c 4 689 82 +55f80 4 892 82 +55f84 8 892 82 +55f8c 8 893 82 +FUNC 55f94 2c 0 testing::TestCase::TestPassed +55f94 8 886 82 +55f9c 4 689 82 +55fa0 4 887 82 +55fa4 c 540 82 +55fb0 4 887 82 +55fb4 c 888 82 +FUNC 55fc0 30 0 testing::TestResult::HasFatalFailure +55fc0 8 2145 95 +55fc8 4 285 91 +55fcc 8 286 91 +55fd4 4 287 91 +55fd8 c 288 91 +55fe4 4 2146 95 +55fe8 8 2147 95 +FUNC 55ff0 30 0 testing::TestResult::HasNonfatalFailure +55ff0 8 2155 95 +55ff8 4 285 91 +55ffc 8 286 91 +56004 4 287 91 +56008 c 288 91 +56014 4 2156 95 +56018 8 2157 95 +FUNC 56020 50 0 testing::internal::UnitTestImpl::RegisterParameterizedTests +56020 c 2571 95 +5602c 10 2573 95 +5603c c 600 86 +56048 14 602 86 +5605c 8 2575 95 +56064 c 2578 95 +FUNC 56070 28 0 testing::TestCase::UnshuffleTests +56070 4 2753 95 +56074 c 192 139 +56080 8 2753 95 +56088 4 2754 95 +5608c 8 2753 95 +56094 4 2756 95 +FUNC 56098 44 0 testing::internal::GetAnsiColorCode +56098 18 2859 95 +560b0 8 2863 95 +560b8 c 2861 95 +560c4 c 2862 95 +560d0 8 2860 95 +560d8 4 2865 95 +FUNC 560dc 154 0 testing::internal::ShouldUseColor +560dc 4 2870 95 +560e0 4 2873 95 +560e4 8 2870 95 +560ec 8 2870 95 +560f4 18 2873 95 +5610c 10 2328 87 +5611c 10 2882 95 +5612c 4 2887 95 +56130 14 2883 95 +56144 4 2882 95 +56148 14 2884 95 +5615c 4 2883 95 +56160 14 2885 95 +56174 4 2884 95 +56178 14 2886 95 +5618c 4 2885 95 +56190 14 2887 95 +561a4 4 2886 95 +561a8 14 2888 95 +561bc 8 2889 95 +561c4 14 2893 95 +561d8 4 2895 95 +561dc 14 2894 95 +561f0 4 2893 95 +561f4 14 2895 95 +56208 4 2894 95 +5620c 8 2896 95 +56214 8 2900 95 +5621c 8 2896 95 +56224 c 2900 95 +FUNC 56230 134 0 testing::internal::ColoredPrintf +56230 10 2906 95 +56240 4 2908 95 +56244 4 2906 95 +56248 4 2908 95 +5624c 4 2915 95 +56250 1c 2908 95 +5626c 4 2906 95 +56270 4 2915 95 +56274 38 2906 95 +562ac 4 2915 95 +562b0 10 2270 87 +562c0 4 2271 87 +562c4 4 2915 95 +562c8 8 2915 95 +562d0 14 2915 95 +562e4 4 2916 95 +562e8 4 2916 95 +562ec 8 2916 95 +562f4 20 2921 95 +56314 c 2947 95 +56320 c 2947 95 +5632c 1c 2948 95 +56348 c 2949 95 +56354 10 2952 95 +FUNC 56364 38 0 testing::internal::PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart +56364 4 3042 95 +56368 8 3043 95 +56370 4 3042 95 +56374 4 3043 95 +56378 4 3043 95 +5637c c 3044 95 +56388 4 3045 95 +5638c 4 3046 95 +56390 c 3045 95 +FUNC 5639c 54 0 testing::internal::PrettyUnitTestResultPrinter::OnTestStart +5639c 4 3061 95 +563a0 4 3062 95 +563a4 8 3061 95 +563ac 4 3061 95 +563b0 c 3062 95 +563bc 14 2983 95 +563d0 8 3064 95 +563d8 4 3066 95 +563dc 4 3065 95 +563e0 4 3066 95 +563e4 c 3065 95 +FUNC 563f0 38 0 testing::internal::PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart +563f0 4 3112 95 +563f4 8 3113 95 +563fc 4 3112 95 +56400 4 3113 95 +56404 4 3113 95 +56408 c 3114 95 +56414 4 3115 95 +56418 4 3116 95 +5641c c 3115 95 +FUNC 56428 c0 0 testing::internal::PrintFullTestCommentIfPresent +56428 10 2959 95 +56438 4 1144 87 +5643c 4 662 82 +56440 8 660 82 +56448 4 1144 87 +5644c 4 670 82 +56450 8 668 82 +56458 18 2963 95 +56470 10 2964 95 +56480 4 2965 95 +56484 18 2966 95 +5649c 4 2967 95 +564a0 10 2968 95 +564b0 4 2970 95 +564b4 4 2971 95 +564b8 8 2974 95 +564c0 8 2971 95 +564c8 4 2974 95 +564cc c 2971 95 +564d8 10 2974 95 +FUNC 564e8 7c 0 testing::internal::TestEventRepeater::Release +564e8 10 3231 95 +564f8 14 192 139 +5650c 4 3232 95 +56510 8 3232 95 +56518 4 202 139 +5651c c 3233 95 +56528 c 580 139 +56534 4 269 100 +56538 10 584 139 +56548 8 3232 95 +56550 4 3239 95 +56554 10 3240 95 +FUNC 56564 50 0 testing::TestEventListeners::TestEventListeners +56564 c 3842 95 +56570 4 3842 95 +56574 8 3845 95 +5657c 4 67 139 +56580 4 3188 95 +56584 4 67 139 +56588 4 3188 95 +5658c 4 481 101 +56590 c 3188 95 +5659c c 3845 95 +565a8 c 3846 95 +FUNC 565b4 24 0 testing::TestEventListeners::~TestEventListeners +565b4 8 3848 95 +565bc 8 3848 95 +565c4 4 3848 95 +565c8 8 3848 95 +565d0 8 3848 95 +FUNC 565d8 2c 0 testing::TestEventListeners::Release +565d8 c 3862 95 +565e4 8 3863 95 +565ec c 3864 95 +565f8 4 3865 95 +565fc 8 3866 95 +FUNC 56604 c 0 testing::TestEventListeners::SuppressEventForwarding +56604 4 3912 95 +56608 4 3196 95 +5660c 4 3913 95 +FUNC 56610 18 0 testing::UnitTest::total_test_case_count +56610 4 1280 82 +56614 c 192 139 +56620 8 3958 95 +FUNC 56628 8 0 testing::UnitTest::successful_test_count +56628 8 3968 95 +FUNC 56630 8 0 testing::UnitTest::failed_test_count +56630 8 3972 95 +FUNC 56638 8 0 testing::UnitTest::reportable_disabled_test_count +56638 8 3976 95 +FUNC 56640 8 0 testing::UnitTest::reportable_test_count +56640 8 3986 95 +FUNC 56648 8 0 testing::UnitTest::test_to_run_count +56648 8 3993 95 +FUNC 56650 c 0 testing::UnitTest::original_working_dir +56650 4 4217 95 +56654 8 4219 95 +FUNC 5665c 14 0 testing::internal::UnitTestImpl::SuppressTestEventsIfInSubprocess +5665c 8 4345 95 +56664 4 3912 95 +56668 4 3196 95 +5666c 4 4347 95 +FUNC 56670 30 0 testing::internal::TestCaseNameIs::operator() +56670 8 4429 95 +56678 4 4430 95 +5667c 4 4429 95 +56680 4 4430 95 +56684 c 4430 95 +56690 8 4430 95 +56698 8 4431 95 +FUNC 566a0 7c 0 testing::internal::WriteToShardStatusFileIfNeeded +566a0 c 4635 95 +566ac 10 2328 87 +566bc 8 4637 95 +566c4 c 2298 87 +566d0 8 4639 95 +566d8 14 4643 95 +566ec 10 4644 95 +566fc 8 4645 95 +56704 8 4649 95 +5670c 4 4647 95 +56710 c 4649 95 +FUNC 5671c 144 0 testing::internal::UnitTestImpl::ListTestsMatchingFilter +5671c 14 4807 95 +56730 4 4832 95 +56734 4 4830 95 +56738 4 4832 95 +5673c 8 4807 95 +56744 4 4811 95 +56748 4 4830 95 +5674c 8 4832 95 +56754 c 192 139 +56760 8 4811 95 +56768 4 4815 95 +5676c 4 4812 95 +56770 4 4813 95 +56774 c 192 139 +56780 8 4815 95 +56788 4 4817 95 +5678c 8 4818 95 +56794 4 4819 95 +56798 10 4821 95 +567a8 4 1144 87 +567ac 4 797 82 +567b0 8 4822 95 +567b8 10 4823 95 +567c8 4 1144 87 +567cc 4 799 82 +567d0 8 797 82 +567d8 4 4826 95 +567dc 8 4828 95 +567e4 c 4830 95 +567f0 4 1144 87 +567f4 4 668 82 +567f8 8 4831 95 +56800 c 4832 95 +5680c 4 1144 87 +56810 4 670 82 +56814 8 668 82 +5681c 4 4835 95 +56820 c 4837 95 +5682c 8 4815 95 +56834 8 4811 95 +5683c 4 4841 95 +56840 8 4842 95 +56848 4 4841 95 +5684c c 4842 95 +56858 8 4841 95 +FUNC 56860 4c 0 testing::internal::UnitTestImpl::UnshuffleTests +56860 c 4892 95 +5686c 4 4892 95 +56870 4 4893 95 +56874 c 192 139 +56880 8 4893 95 +56888 8 4895 95 +56890 4 202 139 +56894 4 4897 95 +56898 8 4893 95 +568a0 c 4899 95 +FUNC 568ac 4 0 testing::internal::IsTrue +568ac 4 4924 95 +FUNC 568b0 8 0 testing::internal::AlwaysTrue +568b0 8 4934 95 +FUNC 568b8 5c 0 testing::internal::SkipPrefix +568b8 14 4939 95 +568cc 4 4939 95 +568d0 4 4940 95 +568d4 4 4941 95 +568d8 4 4940 95 +568dc 10 4941 95 +568ec 4 4945 95 +568f0 4 4941 95 +568f4 4 4942 95 +568f8 4 4943 95 +568fc 4 4942 95 +56900 14 4946 95 +FUNC 56914 b8 0 testing::internal::HasGoogleTestFlagPrefix +56914 c 5043 95 +56920 8 5043 95 +56928 14 5044 95 +5693c 4 5047 95 +56940 14 5047 95 +56954 8 5046 95 +5695c 14 5045 95 +56970 4 5044 95 +56974 14 5046 95 +56988 4 5045 95 +5698c 8 5047 95 +56994 14 5048 95 +569a8 4 5047 95 +569ac 14 5049 95 +569c0 c 5050 95 +FUNC 569cc 30 0 testing::internal::GetElementOr +569cc 4 302 91 +569d0 4 303 91 +569d4 4 303 91 +569d8 10 192 139 +569e8 4 303 91 +569ec 8 303 91 +569f4 4 303 91 +569f8 4 304 91 +FUNC 569fc 3c 0 testing::TestCase::GetTestInfo +569fc 4 2693 95 +56a00 4 2694 95 +56a04 8 2693 95 +56a0c 4 2693 95 +56a10 8 2694 95 +56a18 4 2695 95 +56a1c 4 2695 95 +56a20 8 2695 95 +56a28 10 2696 95 +FUNC 56a38 3c 0 testing::TestCase::GetMutableTestInfo +56a38 4 2700 95 +56a3c 4 2701 95 +56a40 8 2700 95 +56a48 4 2700 95 +56a4c 8 2701 95 +56a54 4 2702 95 +56a58 4 2702 95 +56a5c 8 2702 95 +56a64 10 2703 95 +FUNC 56a74 40 0 testing::UnitTest::GetTestCase +56a74 4 4015 95 +56a78 4 587 91 +56a7c 8 4015 95 +56a84 4 4015 95 +56a88 4 1280 82 +56a8c 8 587 91 +56a94 4 588 91 +56a98 4 588 91 +56a9c 8 588 91 +56aa4 10 4017 95 +FUNC 56ab4 5c 0 testing::internal::CountIf, bool (*)(const testing::TestCase*)> +56ab4 10 282 91 +56ac4 4 285 91 +56ac8 8 282 91 +56ad0 c 286 91 +56adc 10 287 91 +56aec 10 288 91 +56afc 14 291 91 +FUNC 56b10 10 0 testing::internal::UnitTestImpl::failed_test_case_count +56b10 10 718 95 +FUNC 56b20 3c 0 testing::internal::UnitTestImpl::Failed +56b20 c 580 91 +56b2c 4 580 91 +56b30 c 581 91 +56b3c 4 581 91 +56b40 8 582 91 +56b48 4 581 91 +56b4c 10 582 91 +FUNC 56b5c 20 0 testing::UnitTest::Passed +56b5c 8 4007 95 +56b64 c 576 91 +56b70 c 4007 95 +FUNC 56b7c 10 0 testing::internal::UnitTestImpl::test_case_to_run_count +56b7c 10 729 95 +FUNC 56b8c 8 0 testing::UnitTest::test_case_to_run_count +56b8c 8 3963 95 +FUNC 56b94 50 0 std::operator<< , long int> +56b94 c 80 107 +56ba0 4 80 107 +56ba4 4 82 107 +56ba8 8 42 107 +56bb0 c 82 107 +56bbc 4 42 107 +56bc0 8 42 107 +56bc8 c 42 107 +56bd4 10 84 107 +FUNC 56be4 1c 0 std::priv::_Impl_vector >::~_Impl_vector +56be4 8 304 139 +56bec 4 87 139 +56bf0 4 88 139 +56bf4 8 323 101 +56bfc 4 304 139 +FUNC 56c00 58 0 std::operator==, std::allocator > +56c00 c 320 134 +56c0c 4 320 134 +56c10 10 229 140 +56c20 4 324 134 +56c24 4 400 131 +56c28 4 324 134 +56c2c 4 400 131 +56c30 8 324 134 +56c38 8 226 140 +56c40 8 324 134 +56c48 10 325 134 +FUNC 56c58 5c 0 testing::internal::CountIf, bool (*)(const testing::TestInfo*)> +56c58 10 282 91 +56c68 4 285 91 +56c6c 8 282 91 +56c74 c 286 91 +56c80 10 287 91 +56c90 10 288 91 +56ca0 14 291 91 +FUNC 56cb4 10 0 testing::TestCase::successful_test_count +56cb4 10 2632 95 +FUNC 56cc4 10 0 testing::TestCase::failed_test_count +56cc4 10 2637 95 +FUNC 56cd4 28 0 testing::internal::TestCaseFailed +56cd4 8 340 95 +56cdc 4 803 82 +56ce0 4 341 95 +56ce4 4 830 82 +56ce8 8 341 95 +56cf0 c 342 95 +FUNC 56cfc 104 0 testing::internal::PrettyUnitTestResultPrinter::PrintFailedTests +56cfc 1c 3119 95 +56d18 4 3119 95 +56d1c 4 3120 95 +56d20 4 3121 95 +56d24 4 3135 95 +56d28 4 3136 95 +56d2c 4 3135 95 +56d30 4 3136 95 +56d34 8 3125 95 +56d3c 8 3125 95 +56d44 c 3126 95 +56d50 4 3127 95 +56d54 4 3126 95 +56d58 4 3127 95 +56d5c 4 3127 95 +56d60 8 3127 95 +56d68 10 192 139 +56d78 8 3130 95 +56d80 10 3131 95 +56d90 8 3132 95 +56d98 c 540 82 +56da4 4 3132 95 +56da8 8 3130 95 +56db0 8 3125 95 +56db8 c 3135 95 +56dc4 10 3136 95 +56dd4 8 3137 95 +56ddc c 3138 95 +56de8 18 3141 95 +FUNC 56e00 10 0 testing::TestCase::reportable_disabled_test_count +56e00 10 2642 95 +FUNC 56e10 10 0 testing::TestCase::reportable_test_count +56e10 10 2652 95 +FUNC 56e20 10 0 testing::TestCase::test_to_run_count +56e20 10 2657 95 +FUNC 56e30 4 0 std::basic_string, std::allocator >::~basic_string +56e30 4 156 132 +FUNC 56e34 3c 0 testing::internal::AssertHelper::~AssertHelper +56e34 c 358 95 +56e40 c 359 95 +56e4c 8 156 132 +56e54 4 359 95 +56e58 8 360 95 +56e60 4 359 95 +56e64 c 360 95 +FUNC 56e70 30 0 testing::TestPartResult::~TestPartResult +56e70 c 47 81 +56e7c 4 47 81 +56e80 14 156 132 +56e94 8 47 81 +56e9c 4 156 132 +FUNC 56ea0 10 0 testing::internal::XmlUnitTestResultPrinter::~XmlUnitTestResultPrinter +56ea0 c 3299 95 +56eac 4 156 132 +FUNC 56eb0 24 0 testing::internal::XmlUnitTestResultPrinter::~XmlUnitTestResultPrinter +56eb0 c 3299 95 +56ebc 8 3299 95 +56ec4 4 3299 95 +56ec8 8 3299 95 +56ed0 4 3299 95 +FUNC 56ed4 68 0 std::priv::_Impl_vector, std::allocator >, std::allocator, std::allocator > > >::~_Impl_vector +56ed4 10 304 139 +56ee4 c 304 139 +56ef0 c 191 103 +56efc 10 156 132 +56f0c 8 87 139 +56f14 4 88 139 +56f18 c 304 139 +56f24 8 323 101 +56f2c 10 304 139 +FUNC 56f3c 58 0 testing::internal::scoped_ptr::reset +56f3c 10 1152 87 +56f4c 14 1153 87 +56f60 4 1155 87 +56f64 8 244 83 +56f6c 4 2314 87 +56f70 8 156 132 +56f78 8 1155 87 +56f80 4 1157 87 +56f84 10 1159 87 +FUNC 56f94 1c 0 std::priv::_Vector_base >::~_Vector_base +56f94 4 86 139 +56f98 8 87 139 +56fa0 4 88 139 +56fa4 8 323 101 +56fac 4 89 139 +FUNC 56fb0 50 0 testing::internal::TestEventRepeater::~TestEventRepeater +56fb0 14 3222 95 +56fc4 14 3222 95 +56fd8 8 60 98 +56fe0 c 61 98 +56fec 4 304 139 +56ff0 c 3224 95 +56ffc 4 304 139 +FUNC 57000 24 0 testing::internal::TestEventRepeater::~TestEventRepeater +57000 c 3222 95 +5700c 4 3222 95 +57010 4 3224 95 +57014 4 3224 95 +57018 8 3224 95 +57020 4 3224 95 +FUNC 57024 1c 0 std::priv::_Vector_base >::~_Vector_base +57024 4 86 139 +57028 8 87 139 +57030 4 88 139 +57034 8 323 101 +5703c 4 89 139 +FUNC 57040 1c 0 std::priv::_Vector_base >::~_Vector_base +57040 4 86 139 +57044 8 87 139 +5704c 4 88 139 +57050 8 323 101 +57058 4 89 139 +FUNC 5705c f0 0 std::priv::_Impl_vector >::push_back +5705c 14 376 139 +57070 14 380 139 +57084 4 126 103 +57088 14 382 139 +5709c 10 192 139 +570ac c 176 139 +570b8 4 175 139 +570bc 10 176 139 +570cc 4 356 101 +570d0 8 346 101 +570d8 4 177 139 +570dc c 347 101 +570e8 4 348 101 +570ec 4 352 101 +570f0 4 353 101 +570f4 4 352 101 +570f8 10 112 138 +57108 10 481 100 +57118 8 657 139 +57120 4 319 101 +57124 4 323 101 +57128 4 118 138 +5712c 4 666 139 +57130 4 667 139 +57134 4 668 139 +57138 14 388 139 +FUNC 5714c 60 0 std::basic_string, std::allocator >::reserve +5714c 4 158 130 +57150 4 159 130 +57154 4 158 130 +57158 4 159 130 +5715c 10 600 130 +5716c 10 400 131 +5717c 4 72 132 +57180 4 162 130 +57184 4 72 132 +57188 4 72 132 +5718c 8 72 132 +57194 8 163 130 +5719c 4 167 130 +571a0 4 166 130 +571a4 8 167 130 +FUNC 571ac f0 0 std::priv::_Impl_vector >::push_back +571ac 14 376 139 +571c0 14 380 139 +571d4 4 126 103 +571d8 14 382 139 +571ec 10 192 139 +571fc c 176 139 +57208 4 175 139 +5720c 10 176 139 +5721c 4 356 101 +57220 8 346 101 +57228 4 177 139 +5722c c 347 101 +57238 4 348 101 +5723c 4 352 101 +57240 4 353 101 +57244 4 352 101 +57248 10 112 138 +57258 10 481 100 +57268 8 657 139 +57270 4 319 101 +57274 4 323 101 +57278 4 118 138 +5727c 4 666 139 +57280 4 667 139 +57284 4 668 139 +57288 14 388 139 +FUNC 5729c 38 0 std::basic_string, std::allocator >::operator= +5729c 4 347 131 +572a0 4 348 131 +572a4 c 347 131 +572b0 4 347 131 +572b4 4 348 131 +572b8 c 349 131 +572c4 10 351 131 +FUNC 572d4 50 0 std::priv::_Impl_vector >::clear +572d4 18 650 139 +572ec 10 630 139 +572fc 4 57 103 +57300 4 191 103 +57304 4 57 103 +57308 8 191 103 +57310 4 615 139 +57314 10 652 139 +FUNC 57324 68 0 testing::TestResult::Clear +57324 10 2123 95 +57334 4 228 143 +57338 4 2123 95 +5733c c 228 143 +57348 c 630 139 +57354 c 156 132 +57360 4 191 103 +57364 4 156 132 +57368 8 191 103 +57370 4 615 139 +57374 4 2126 95 +57378 4 2127 95 +5737c 10 2128 95 +FUNC 5738c 44 0 testing::TestCase::ClearResult +5738c c 2741 95 +57398 4 2741 95 +5739c 10 2742 95 +573ac 8 60 98 +573b4 10 740 82 +573c4 c 2744 95 +FUNC 573d0 194 0 testing::Test::~Test +573d0 1c 2180 95 +573ec 8 2180 95 +573f4 c 2181 95 +57400 8 186 91 +57408 4 189 91 +5740c 4 190 91 +57410 4 192 91 +57414 4 186 91 +57418 8 187 91 +57420 4 193 91 +57424 4 195 91 +57428 4 201 91 +5742c 4 187 91 +57430 c 188 91 +5743c 10 189 91 +5744c 10 190 91 +5745c 8 191 91 +57464 4 192 91 +57468 8 191 91 +57470 c 192 91 +5747c 10 193 91 +5748c c 194 91 +57498 10 195 91 +574a8 c 196 91 +574b4 c 197 91 +574c0 c 198 91 +574cc c 199 91 +574d8 c 200 91 +574e4 10 201 91 +574f4 c 202 91 +57500 30 156 132 +57530 4 2181 95 +57534 14 2182 95 +57548 4 2181 95 +5754c 18 2182 95 +FUNC 57564 10 0 std::basic_string, std::allocator >::append +57564 4 516 131 +57568 c 517 131 +FUNC 57574 12c 0 std::priv::__find_if +57574 10 159 99 +57584 4 162 99 +57588 4 159 99 +5758c 4 162 99 +57590 8 159 99 +57598 8 164 99 +575a0 14 165 99 +575b4 14 168 99 +575c8 4 166 99 +575cc 4 168 99 +575d0 14 171 99 +575e4 4 169 99 +575e8 4 171 99 +575ec 14 174 99 +57600 4 172 99 +57604 8 174 99 +5760c 8 164 99 +57614 20 178 99 +57634 4 190 99 +57638 8 178 99 +57640 14 180 99 +57654 4 181 99 +57658 18 183 99 +57670 4 184 99 +57674 18 186 99 +5768c 14 192 99 +FUNC 576a0 4c 0 std::basic_string, std::allocator >::_M_range_initialize +576a0 c 376 131 +576ac 4 376 131 +576b0 4 378 131 +576b4 4 379 131 +576b8 4 376 131 +576bc 4 378 131 +576c0 4 379 131 +576c4 14 148 137 +576d8 4 380 131 +576dc 4 101 103 +576e0 c 382 131 +FUNC 576ec 68 0 testing::internal::AssertHelper::AssertHelper +576ec c 351 95 +576f8 4 351 95 +576fc 4 355 95 +57700 10 351 95 +57710 4 355 95 +57714 4 1784 82 +57718 4 355 95 +5771c 4 1784 82 +57720 4 1784 82 +57724 c 1784 82 +57730 4 1784 82 +57734 4 1784 82 +57738 4 1784 82 +5773c 4 1784 82 +57740 4 1784 82 +57744 4 355 95 +57748 c 356 95 +FUNC 57754 30 0 testing::internal::UnitTestImpl::CurrentOsStackTraceExceptTop +57754 4 778 95 +57758 8 780 95 +57760 4 778 95 +57764 8 780 95 +5776c 8 780 95 +57774 10 781 95 +FUNC 57784 70 0 testing::internal::XmlUnitTestResultPrinter::XmlUnitTestResultPrinter +57784 4 3372 95 +57788 4 3373 95 +5778c 8 3372 95 +57794 4 3373 95 +57798 4 3372 95 +5779c 4 3373 95 +577a0 c 3373 95 +577ac 4 3374 95 +577b0 c 3374 95 +577bc 1c 3375 95 +577d8 8 3376 95 +577e0 8 3377 95 +577e8 c 3379 95 +FUNC 577f4 30 0 testing::internal::OsStackTraceGetter::CurrentStackTrace +577f4 4 3797 95 +577f8 8 3798 95 +57800 4 3797 95 +57804 8 3798 95 +5780c 8 3798 95 +57814 10 3799 95 +FUNC 57824 e4 0 std::priv::_Impl_vector, std::allocator >, std::allocator, std::allocator > > >::_M_range_initialize +57824 4 699 139 +57828 4 355 114 +5782c c 699 139 +57838 4 342 101 +5783c 4 699 139 +57840 4 342 101 +57844 4 355 114 +57848 8 699 139 +57850 4 342 101 +57854 4 699 139 +57858 4 342 101 +5785c c 343 101 +57868 4 343 101 +5786c 4 346 101 +57870 10 347 101 +57880 8 348 101 +57888 c 352 101 +57894 4 346 101 +57898 4 356 101 +5789c 4 703 139 +578a0 4 702 139 +578a4 4 84 137 +578a8 c 703 139 +578b4 4 139 103 +578b8 8 86 137 +578c0 4 139 103 +578c4 10 139 103 +578d4 10 89 137 +578e4 c 705 139 +578f0 4 704 139 +578f4 14 705 139 +FUNC 57908 24 0 testing::internal::FilePath::FilePath +57908 c 64 84 +57914 8 64 84 +5791c 4 65 84 +57920 8 66 84 +57928 4 65 84 +FUNC 5792c 7c 0 testing::internal::GetCurrentExecutableName +5792c 4 381 95 +57930 4 61 84 +57934 8 381 95 +5793c 14 61 84 +57950 4 381 95 +57954 4 381 95 +57958 4 61 84 +5795c 10 387 95 +5796c c 74 84 +57978 8 156 132 +57980 c 390 95 +5798c 8 156 132 +57994 14 391 95 +FUNC 579a8 4c 0 testing::AssertionResult::AssertionResult +579a8 c 948 95 +579b4 4 948 95 +579b8 8 952 95 +579c0 4 1144 87 +579c4 4 952 95 +579c8 10 952 95 +579d8 8 951 95 +579e0 4 952 95 +579e4 4 1139 87 +579e8 c 953 95 +FUNC 579f4 60 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, long unsigned int>, std::priv::_Select1st, std::allocator >, long unsigned int> >, std::priv::_MapTraitsT, std::allocator >, long unsigned int> >, std::allocator, std::allocator >, long unsigned int> > >::_M_create_node +579f4 4 315 136 +579f8 4 306 101 +579fc c 315 136 +57a08 4 306 101 +57a0c 4 315 136 +57a10 4 306 101 +57a14 4 307 101 +57a18 4 119 103 +57a1c 4 307 101 +57a20 4 119 103 +57a24 14 68 124 +57a38 4 321 136 +57a3c 4 324 136 +57a40 4 322 136 +57a44 10 324 136 +FUNC 57a54 54 0 std::basic_string, std::allocator >::basic_string +57a54 c 183 131 +57a60 4 112 132 +57a64 8 481 101 +57a6c 8 400 131 +57a74 8 205 131 +57a7c c 604 130 +57a88 4 209 131 +57a8c c 208 131 +57a98 4 209 131 +57a9c 4 210 131 +57aa0 8 208 131 +FUNC 57aa8 78 0 testing::internal::UnitTestOptions::GetOutputFormat +57aa8 14 396 95 +57abc 4 396 95 +57ac0 4 398 95 +57ac4 10 398 95 +57ad4 10 400 95 +57ae4 4 403 95 +57ae8 14 403 95 +57afc 4 112 132 +57b00 4 225 131 +57b04 4 481 101 +57b08 8 225 131 +57b10 10 404 95 +FUNC 57b20 9c 0 testing::internal::XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters +57b20 c 3473 95 +57b2c 4 3474 95 +57b30 4 3473 95 +57b34 4 3474 95 +57b38 4 3473 95 +57b3c 4 3473 95 +57b40 4 3474 95 +57b44 4 400 131 +57b48 4 3475 95 +57b4c 4 400 131 +57b50 c 3475 95 +57b5c c 3476 95 +57b68 4 3477 95 +57b6c 8 3314 95 +57b74 8 3309 95 +57b7c 8 3314 95 +57b84 8 3309 95 +57b8c 8 3314 95 +57b94 8 3476 95 +57b9c c 3478 95 +57ba8 14 3481 95 +FUNC 57bbc ac 0 testing::internal::StringStreamToString +57bbc 4 1943 95 +57bc0 4 75 127 +57bc4 8 1943 95 +57bcc 8 75 127 +57bd4 8 1943 95 +57bdc 4 1943 95 +57be0 4 75 127 +57be4 10 1948 95 +57bf4 4 530 131 +57bf8 4 1948 95 +57bfc 4 400 131 +57c00 4 1949 95 +57c04 4 530 131 +57c08 4 1949 95 +57c0c 8 530 131 +57c14 4 1949 95 +57c18 8 1950 95 +57c20 4 1951 95 +57c24 4 530 131 +57c28 4 1951 95 +57c2c 10 530 131 +57c3c 4 453 131 +57c40 8 1950 95 +57c48 8 156 132 +57c50 18 1959 95 +FUNC 57c68 28 0 testing::Message::GetString +57c68 c 942 95 +57c74 4 942 95 +57c78 8 943 95 +57c80 10 944 95 +FUNC 57c90 58 0 testing::Message::Message +57c90 c 907 95 +57c9c 10 907 95 +57cac 8 907 95 +57cb4 4 1139 87 +57cb8 14 39 107 +57ccc 8 910 95 +57cd4 4 39 107 +57cd8 4 910 95 +57cdc c 911 95 +FUNC 57ce8 1a4 0 testing::Test::Test +57ce8 4 2175 95 +57cec 4 2176 95 +57cf0 18 2175 95 +57d08 4 2175 95 +57d0c c 2176 95 +57d18 4 164 91 +57d1c 4 2176 95 +57d20 4 164 91 +57d24 4 2176 95 +57d28 8 164 91 +57d30 c 164 91 +57d3c 4 164 91 +57d40 4 164 91 +57d44 8 164 91 +57d4c 4 164 91 +57d50 4 164 91 +57d54 c 164 91 +57d60 c 164 91 +57d6c c 164 91 +57d78 c 164 91 +57d84 4 165 91 +57d88 8 168 91 +57d90 8 165 91 +57d98 c 166 91 +57da4 c 167 91 +57db0 8 168 91 +57db8 10 169 91 +57dc8 c 170 91 +57dd4 4 171 91 +57dd8 4 170 91 +57ddc c 171 91 +57de8 10 172 91 +57df8 4 173 91 +57dfc 8 174 91 +57e04 8 173 91 +57e0c 8 174 91 +57e14 4 175 91 +57e18 8 180 91 +57e20 8 175 91 +57e28 c 176 91 +57e34 c 177 91 +57e40 c 178 91 +57e4c c 179 91 +57e58 8 180 91 +57e60 c 181 91 +57e6c 4 2176 95 +57e70 1c 2177 95 +FUNC 57e8c 120 0 testing::internal::PrintColorEncoded +57e8c 10 5063 95 +57e9c 4 5064 95 +57ea0 4 5077 95 +57ea4 4 5082 95 +57ea8 4 5064 95 +57eac 4 5063 95 +57eb0 4 5064 95 +57eb4 4 112 132 +57eb8 4 5077 95 +57ebc 4 5082 95 +57ec0 10 5071 95 +57ed0 4 5072 95 +57ed4 14 5073 95 +57ee8 14 5095 95 +57efc 4 355 114 +57f00 8 324 131 +57f08 4 112 132 +57f0c 4 481 101 +57f10 4 324 131 +57f14 c 148 137 +57f20 4 5080 95 +57f24 4 148 137 +57f28 4 325 131 +57f2c 4 101 103 +57f30 10 5077 95 +57f40 8 156 132 +57f48 4 5079 95 +57f4c 8 5081 95 +57f54 10 5082 95 +57f64 8 5083 95 +57f6c 8 5084 95 +57f74 8 5085 95 +57f7c 8 5086 95 +57f84 8 5087 95 +57f8c 8 5088 95 +57f94 8 5089 95 +57f9c 8 5090 95 +57fa4 8 5092 95 +FUNC 57fac cc 0 testing::internal::String::FormatByte +57fac 4 1934 95 +57fb0 4 1935 95 +57fb4 8 1934 95 +57fbc 4 1935 95 +57fc0 4 1934 95 +57fc4 4 1934 95 +57fc8 4 1935 95 +57fcc 4 1934 95 +57fd0 4 1935 95 +57fd4 4 147 107 +57fd8 4 39 107 +57fdc 4 147 107 +57fe0 8 84 109 +57fe8 4 39 107 +57fec c 84 109 +57ff8 10 39 107 +58008 4 1936 95 +5800c 4 39 107 +58010 4 1936 95 +58014 c 79 122 +58020 8 123 110 +58028 8 124 110 +58030 8 79 122 +58038 4 254 121 +5803c 4 79 122 +58040 c 118 110 +5804c 4 254 121 +58050 c 75 127 +5805c 8 1938 95 +58064 14 1939 95 +FUNC 58078 138 0 testing::internal::Random::Generate +58078 10 295 95 +58088 8 295 95 +58090 20 297 95 +580b0 4 299 95 +580b4 8 299 95 +580bc 4 333 122 +580c0 14 299 95 +580d4 24 333 122 +580f8 c 301 95 +58104 8 301 95 +5810c 4 333 122 +58110 14 301 95 +58124 24 333 122 +58148 10 254 121 +58158 1c 333 122 +58174 c 254 121 +58180 c 333 122 +5818c 8 301 95 +58194 4 308 95 +58198 4 309 95 +5819c 4 308 95 +581a0 10 309 95 +FUNC 581b0 38 0 testing::Message::operator<< +581b0 c 149 79 +581bc 8 149 79 +581c4 4 333 122 +581c8 4 150 79 +581cc c 333 122 +581d8 10 156 79 +FUNC 581e8 8c 0 testing::internal::StreamingListener::SocketWriter::CloseConnection +581e8 10 1094 91 +581f8 4 1094 91 +581fc c 1095 91 +58208 8 1095 91 +58210 4 333 122 +58214 14 1095 91 +58228 24 333 122 +5824c 8 1095 91 +58254 8 1098 91 +5825c 4 1100 91 +58260 8 1099 91 +58268 c 1100 91 +FUNC 58274 44 0 testing::internal::StreamingListener::SocketWriter::~SocketWriter +58274 10 1071 91 +58284 c 1071 91 +58290 c 1072 91 +5829c 4 1073 91 +582a0 c 156 132 +582ac 8 1074 91 +582b4 4 156 132 +FUNC 582b8 24 0 testing::internal::StreamingListener::SocketWriter::~SocketWriter +582b8 c 1071 91 +582c4 4 1071 91 +582c8 4 1074 91 +582cc 4 1074 91 +582d0 8 1074 91 +582d8 4 1074 91 +FUNC 582dc 68 0 testing::internal::StreamableToString +582dc c 243 79 +582e8 4 244 79 +582ec 4 243 79 +582f0 4 243 79 +582f4 4 244 79 +582f8 4 243 79 +582fc c 244 79 +58308 4 333 122 +5830c 4 150 79 +58310 c 333 122 +5831c c 244 79 +58328 8 85 79 +58330 14 245 79 +FUNC 58344 8c 0 testing::internal::Int32FromEnvOrDie +58344 10 4702 95 +58354 8 4702 95 +5835c 8 2328 87 +58364 4 4704 95 +58368 c 4709 95 +58374 14 333 122 +58388 c 4709 95 +58394 10 4710 95 +583a4 8 85 79 +583ac 4 4713 95 +583b0 4 4709 95 +583b4 8 4711 95 +583bc 4 4705 95 +583c0 10 4714 95 +FUNC 583d0 54 0 testing::AssertionResult::operator<< +583d0 c 305 82 +583dc 4 306 82 +583e0 4 305 82 +583e4 4 306 82 +583e8 4 305 82 +583ec 4 306 82 +583f0 10 333 122 +58400 c 306 82 +5840c 8 85 79 +58414 10 308 82 +FUNC 58424 54 0 testing::AssertionResult::operator<< +58424 c 305 82 +58430 4 306 82 +58434 4 305 82 +58438 4 306 82 +5843c 4 305 82 +58440 4 306 82 +58444 10 333 122 +58454 c 306 82 +58460 8 85 79 +58468 10 308 82 +FUNC 58478 10c 0 testing::internal::CmpHelperSTRNE +58478 10 1483 95 +58488 4 1483 95 +5848c 4 1484 95 +58490 4 1483 95 +58494 4 1484 95 +58498 c 1483 95 +584a4 c 1484 95 +584b0 4 277 82 +584b4 4 1139 87 +584b8 c 277 82 +584c4 c 1487 95 +584d0 4 277 82 +584d4 4 306 82 +584d8 4 1139 87 +584dc 4 1487 95 +584e0 8 1487 95 +584e8 c 1487 95 +584f4 c 1488 95 +58500 8 306 82 +58508 14 333 122 +5851c c 306 82 +58528 8 85 79 +58530 c 1489 95 +5853c c 1489 95 +58548 8 1489 95 +58550 10 1489 95 +58560 8 1489 95 +58568 8 256 82 +58570 14 1491 95 +FUNC 58584 118 0 testing::internal::GetBoolAssertionFailureMessage +58584 18 1311 95 +5859c 8 1311 95 +585a4 4 1144 87 +585a8 c 298 82 +585b4 8 298 82 +585bc 10 1313 95 +585cc 14 333 122 +585e0 10 1314 95 +585f0 4 131 79 +585f4 10 333 122 +58604 10 1315 95 +58614 8 1316 95 +5861c 14 333 122 +58630 c 1317 95 +5863c 4 131 79 +58640 24 333 122 +58664 c 1318 95 +58670 c 1319 95 +5867c 8 85 79 +58684 18 1320 95 +FUNC 5869c 98 0 testing::internal::MutexBase::Lock +5869c 10 1886 87 +586ac 4 1886 87 +586b0 c 1887 87 +586bc 8 1887 87 +586c4 4 333 122 +586c8 14 1887 87 +586dc 24 333 122 +58700 c 1887 87 +5870c 8 1887 87 +58714 8 1888 87 +5871c 4 1890 87 +58720 8 1889 87 +58728 c 1890 87 +FUNC 58734 8c 0 testing::internal::GTestMutexLock::~GTestMutexLock +58734 10 1965 87 +58744 4 1965 87 +58748 4 1898 87 +5874c c 1899 87 +58758 8 1899 87 +58760 4 333 122 +58764 14 1899 87 +58778 24 333 122 +5879c c 1899 87 +587a8 8 1899 87 +587b0 10 1965 87 +FUNC 587c0 38 0 testing::internal::UnitTestImpl::GetGlobalTestPartResultReporter +587c0 c 687 95 +587cc 4 687 95 +587d0 4 688 95 +587d4 8 1963 87 +587dc 4 689 95 +587e0 8 689 95 +587e8 10 690 95 +FUNC 587f8 2c 0 testing::internal::DefaultPerThreadTestPartResultReporter::ReportTestPartResult +587f8 8 681 95 +58800 4 682 95 +58804 4 681 95 +58808 8 682 95 +58810 c 682 95 +5881c 8 683 95 +FUNC 58824 90 0 testing::internal::Mutex::Mutex +58824 4 1943 87 +58828 4 1944 87 +5882c c 1943 87 +58838 4 1943 87 +5883c c 1944 87 +58848 8 1944 87 +58850 4 333 122 +58854 14 1944 87 +58868 24 333 122 +5888c c 1944 87 +58898 8 1944 87 +588a0 4 1945 87 +588a4 10 1946 87 +FUNC 588b4 40 0 testing::TestResult::TestResult +588b4 c 1978 95 +588c0 4 1978 95 +588c4 4 1980 95 +588c8 8 67 139 +588d0 4 481 101 +588d4 8 67 139 +588dc 4 481 101 +588e0 8 1980 95 +588e8 c 1981 95 +FUNC 588f4 c0 0 testing::TestInfo::TestInfo +588f4 1c 2461 95 +58910 10 2461 95 +58920 4 2476 95 +58924 10 2476 95 +58934 4 2476 95 +58938 4 2476 95 +5893c c 2476 95 +58948 c 2469 95 +58954 4 2476 95 +58958 4 1139 87 +5895c 4 2476 95 +58960 4 2476 95 +58964 c 2476 95 +58970 c 2470 95 +5897c 4 2476 95 +58980 4 1139 87 +58984 4 2476 95 +58988 14 2476 95 +5899c 4 2476 95 +589a0 14 2476 95 +FUNC 589b4 a8 0 testing::TestCase::TestCase +589b4 10 2674 95 +589c4 4 2682 95 +589c8 8 2674 95 +589d0 4 2682 95 +589d4 4 2682 95 +589d8 4 2674 95 +589dc 4 2682 95 +589e0 4 2682 95 +589e4 8 2674 95 +589ec 4 2682 95 +589f0 4 2682 95 +589f4 4 2682 95 +589f8 c 2682 95 +58a04 c 2678 95 +58a10 4 2682 95 +58a14 4 1139 87 +58a18 4 2682 95 +58a1c 8 2682 95 +58a24 8 67 139 +58a2c 4 481 101 +58a30 8 67 139 +58a38 4 481 101 +58a3c 8 2682 95 +58a44 4 2682 95 +58a48 14 2683 95 +FUNC 58a5c 54 0 testing::internal::UnitTestImpl::os_stack_trace_getter +58a5c 10 4860 95 +58a6c 4 4860 95 +58a70 8 4861 95 +58a78 c 4862 95 +58a84 c 442 91 +58a90 4 442 91 +58a94 4 442 91 +58a98 4 4862 95 +58a9c 14 4866 95 +FUNC 58ab0 84 0 testing::internal::Mutex::~Mutex +58ab0 10 1947 87 +58ac0 c 1948 87 +58acc 8 1948 87 +58ad4 4 333 122 +58ad8 14 1948 87 +58aec 24 333 122 +58b10 c 1948 87 +58b1c 8 1948 87 +58b24 10 1949 87 +FUNC 58b34 40 0 testing::UnitTest::~UnitTest +58b34 c 4256 95 +58b40 10 4256 95 +58b50 8 4257 95 +58b58 c 4257 95 +58b64 4 4256 95 +58b68 8 4258 95 +58b70 4 4256 95 +FUNC 58b74 24 0 testing::UnitTest::~UnitTest +58b74 c 4256 95 +58b80 4 4256 95 +58b84 4 4258 95 +58b88 4 4258 95 +58b8c 8 4258 95 +58b94 4 4258 95 +FUNC 58b98 10 0 testing::internal::OsStackTraceGetter::~OsStackTraceGetter +58b98 10 440 91 +FUNC 58ba8 24 0 testing::internal::OsStackTraceGetter::~OsStackTraceGetter +58ba8 c 440 91 +58bb4 8 440 91 +58bbc 4 440 91 +58bc0 8 440 91 +58bc8 4 440 91 +FUNC 58bcc 9c 0 testing::TestResult::~TestResult +58bcc 10 1984 95 +58bdc c 1984 95 +58be8 8 191 103 +58bf0 18 156 132 +58c08 8 87 139 +58c10 4 88 139 +58c14 10 323 101 +58c24 8 191 103 +58c2c 4 77 113 +58c30 8 57 103 +58c38 8 81 113 +58c40 8 87 139 +58c48 4 88 139 +58c4c 8 323 101 +58c54 4 1984 95 +58c58 c 1985 95 +58c64 4 1984 95 +FUNC 58c68 74 0 testing::TestInfo::~TestInfo +58c68 c 2479 95 +58c74 c 2479 95 +58c80 4 2479 95 +58c84 8 2479 95 +58c8c 8 2479 95 +58c94 8 1153 87 +58c9c 8 156 132 +58ca4 8 1155 87 +58cac 8 1153 87 +58cb4 8 156 132 +58cbc 8 1155 87 +58cc4 c 156 132 +58cd0 8 2479 95 +58cd8 4 156 132 +FUNC 58cdc 34 0 testing::internal::Delete +58cdc c 339 91 +58ce8 8 340 91 +58cf0 4 340 91 +58cf4 4 340 91 +58cf8 8 341 91 +58d00 4 340 91 +58d04 c 341 91 +FUNC 58d10 8c 0 testing::TestCase::~TestCase +58d10 14 2686 95 +58d24 14 2686 95 +58d38 8 60 98 +58d40 c 61 98 +58d4c 8 2686 95 +58d54 8 87 139 +58d5c 4 88 139 +58d60 8 323 101 +58d68 8 304 139 +58d70 8 1153 87 +58d78 8 156 132 +58d80 8 1155 87 +58d88 4 156 132 +58d8c c 2689 95 +58d98 4 156 132 +FUNC 58d9c 24 0 testing::TestCase::~TestCase +58d9c c 2686 95 +58da8 4 2686 95 +58dac 4 2689 95 +58db0 4 2689 95 +58db4 8 2689 95 +58dbc 4 2689 95 +FUNC 58dc0 1d0 0 testing::internal::ShuffleRange +58dc0 18 311 91 +58dd8 c 311 91 +58de4 4 192 139 +58de8 4 311 91 +58dec c 192 139 +58df8 c 314 91 +58e04 8 314 91 +58e0c 4 333 122 +58e10 14 314 91 +58e24 24 333 122 +58e48 10 315 91 +58e58 c 333 122 +58e64 c 316 91 +58e70 c 333 122 +58e7c 8 314 91 +58e84 10 317 91 +58e94 8 317 91 +58e9c 4 333 122 +58ea0 14 317 91 +58eb4 24 333 122 +58ed8 10 318 91 +58ee8 c 333 122 +58ef4 10 319 91 +58f04 c 333 122 +58f10 c 319 91 +58f1c c 333 122 +58f28 8 317 91 +58f30 c 323 91 +58f3c 8 323 91 +58f44 8 325 91 +58f4c 4 323 91 +58f50 c 325 91 +58f5c 4 202 139 +58f60 4 92 100 +58f64 4 91 100 +58f68 4 92 100 +58f6c c 93 100 +58f78 18 328 91 +FUNC 58f90 b0 0 testing::internal::UnitTestImpl::ShuffleTests +58f90 4 4877 95 +58f94 4 4879 95 +58f98 c 4877 95 +58fa4 4 4877 95 +58fa8 8 4879 95 +58fb0 4 801 91 +58fb4 c 4879 95 +58fc0 4 192 139 +58fc4 4 4879 95 +58fc8 4 192 139 +58fcc 4 4883 95 +58fd0 4 192 139 +58fd4 4 4883 95 +58fd8 4 4886 95 +58fdc 4 192 139 +58fe0 10 4883 95 +58ff0 c 192 139 +58ffc 8 4886 95 +59004 4 4887 95 +59008 4 4886 95 +5900c 8 192 139 +59014 4 333 91 +59018 8 192 139 +59020 10 333 91 +59030 10 4889 95 +FUNC 59040 9c 0 testing::internal::String::FormatIntWidth2 +59040 4 1920 95 +59044 4 1921 95 +59048 8 1920 95 +59050 4 1921 95 +59054 4 1920 95 +59058 4 1920 95 +5905c 4 1921 95 +59060 4 1920 95 +59064 4 1921 95 +59068 4 147 107 +5906c 8 39 107 +59074 4 147 107 +59078 14 84 109 +5908c 14 39 107 +590a0 4 1922 95 +590a4 4 39 107 +590a8 4 1922 95 +590ac 8 1922 95 +590b4 c 75 127 +590c0 8 1923 95 +590c8 14 1924 95 +FUNC 590dc 90 0 testing::internal::String::FormatHexInt +590dc 4 1927 95 +590e0 4 1928 95 +590e4 8 1927 95 +590ec 4 1928 95 +590f0 4 1927 95 +590f4 4 1927 95 +590f8 4 1928 95 +590fc 4 1927 95 +59100 4 1928 95 +59104 10 79 122 +59114 8 123 110 +5911c 8 124 110 +59124 8 79 122 +5912c 4 1929 95 +59130 4 79 122 +59134 c 118 110 +59140 4 1929 95 +59144 c 75 127 +59150 8 1930 95 +59158 14 1931 95 +FUNC 5916c 1a0 0 testing::internal::ThreadLocal > >::GetOrCreateValue +5916c 18 2037 87 +59184 4 2037 87 +59188 c 2039 87 +59194 4 2021 87 +59198 4 2040 87 +5919c 8 2044 87 +591a4 4 2019 87 +591a8 4 2044 87 +591ac c 2019 87 +591b8 8 192 139 +591c0 4 70 139 +591c4 4 192 139 +591c8 4 70 139 +591cc 4 192 139 +591d0 4 342 101 +591d4 4 481 101 +591d8 8 342 101 +591e0 c 343 101 +591ec 4 343 101 +591f0 4 356 101 +591f4 4 346 101 +591f8 8 347 101 +59200 8 348 101 +59208 8 352 101 +59210 4 71 139 +59214 4 73 139 +59218 4 72 139 +5921c 4 84 137 +59220 8 73 139 +59228 14 86 137 +5923c 8 86 137 +59244 4 139 103 +59248 1c 466 91 +59264 4 89 137 +59268 10 86 137 +59278 c 2046 87 +59284 4 249 139 +59288 10 2046 87 +59298 8 2046 87 +592a0 4 333 122 +592a4 14 2046 87 +592b8 24 333 122 +592dc c 2046 87 +592e8 8 2046 87 +592f0 4 2021 87 +592f4 18 2048 87 +FUNC 5930c 50 0 testing::UnitTest::PopGTestTrace +5930c c 4270 95 +59318 4 4270 95 +5931c 4 4271 95 +59320 8 1963 87 +59328 4 752 91 +5932c 8 2010 87 +59334 c 563 139 +59340 8 156 132 +59348 8 4272 95 +59350 c 4273 95 +FUNC 5935c c8 0 std::priv::__put_num, double> +5935c 14 194 121 +59370 4 194 121 +59374 10 181 122 +59384 8 199 121 +5938c 18 211 121 +593a4 4 202 121 +593a8 8 145 110 +593b0 4 202 121 +593b4 4 145 110 +593b8 4 202 121 +593bc 8 145 110 +593c4 8 202 121 +593cc 4 89 120 +593d0 4 202 121 +593d4 8 89 120 +593dc c 202 121 +593e8 4 89 120 +593ec 4 57 123 +593f0 c 89 120 +593fc 8 202 121 +59404 4 210 121 +59408 8 212 121 +59410 14 213 121 +FUNC 59428 64 0 testing::internal::FormatTimeInMillisAsSeconds +59428 4 3500 95 +5942c 4 3501 95 +59430 8 3500 95 +59438 4 3501 95 +5943c 4 3500 95 +59440 4 3501 95 +59444 4 3500 95 +59448 4 3500 95 +5944c 4 3501 95 +59450 4 3502 95 +59454 10 281 121 +59464 c 75 127 +59470 8 3503 95 +59478 14 3504 95 +FUNC 59498 f8 0 testing::internal::XmlUnitTestResultPrinter::OutputXmlCDataSection +59498 18 3530 95 +594b0 4 3534 95 +594b4 c 333 122 +594c0 4 3534 95 +594c4 4 181 122 +594c8 4 333 122 +594cc 4 3530 95 +594d0 4 3530 95 +594d4 4 333 122 +594d8 10 3534 95 +594e8 4 3535 95 +594ec 14 181 122 +59500 4 434 121 +59504 18 444 121 +5951c 4 436 121 +59520 4 3537 95 +59524 18 436 121 +5953c 8 443 121 +59544 4 446 121 +59548 4 3539 95 +5954c 4 446 121 +59550 c 333 122 +5955c 4 3544 95 +59560 18 333 122 +59578 18 3546 95 +FUNC 59590 108 0 testing::internal::StreamingListener::SocketWriter::Send +59590 10 1077 91 +595a0 8 1077 91 +595a8 c 1078 91 +595b4 8 1078 91 +595bc 4 333 122 +595c0 14 1078 91 +595d4 24 333 122 +595f8 c 1078 91 +59604 4 400 131 +59608 4 1082 91 +5960c 4 400 131 +59610 4 1082 91 +59614 8 1082 91 +5961c 8 1082 91 +59624 8 1083 91 +5962c 4 333 122 +59630 14 1083 91 +59644 14 333 122 +59658 10 1085 91 +59668 c 333 122 +59674 c 1085 91 +59680 8 1083 91 +59688 10 1087 91 +FUNC 59698 1d4 0 testing::internal::StreamingListener::SocketWriter::MakeConnection +59698 10 3721 95 +596a8 8 3721 95 +596b0 c 3722 95 +596bc 4 3722 95 +596c0 4 333 122 +596c4 14 3722 95 +596d8 24 333 122 +596fc 8 3722 95 +59704 4 3729 95 +59708 c 3734 95 +59714 4 3726 95 +59718 4 3729 95 +5971c 4 3728 95 +59720 8 3726 95 +59728 4 3728 95 +5972c 8 3734 95 +59734 4 3735 95 +59738 c 3736 95 +59744 4 333 122 +59748 10 3736 95 +59758 14 333 122 +5976c c 3737 95 +59778 8 333 122 +59780 8 3736 95 +59788 4 3741 95 +5978c 4 3741 95 +59790 4 3741 95 +59794 8 3741 95 +5979c 14 3744 95 +597b0 8 3745 95 +597b8 18 3747 95 +597d0 8 3748 95 +597d8 4 3749 95 +597dc 8 3741 95 +597e4 8 3754 95 +597ec c 3756 95 +597f8 8 3757 95 +59800 4 333 122 +59804 14 3757 95 +59818 14 333 122 +5982c 10 3758 95 +5983c c 333 122 +59848 c 3758 95 +59854 8 3757 95 +5985c 10 3760 95 +FUNC 5986c 7c 0 testing::AssertionResult::operator<< +5986c c 305 82 +59878 4 306 82 +5987c 4 233 79 +59880 4 305 82 +59884 4 305 82 +59888 4 306 82 +5988c 4 305 82 +59890 4 306 82 +59894 8 233 79 +5989c 4 131 79 +598a0 4 233 79 +598a4 4 131 79 +598a8 4 233 79 +598ac c 233 79 +598b8 8 156 132 +598c0 c 306 82 +598cc 8 85 79 +598d4 14 308 82 +FUNC 598e8 104 0 testing::internal::PrettyUnitTestResultPrinter::OnTestPartResult +598e8 10 3070 95 +598f8 8 3072 95 +59900 c 2808 95 +5990c 4 2808 95 +59910 8 2808 95 +59918 4 2808 95 +5991c 8 77 81 +59924 c 2808 95 +59930 10 131 79 +59940 14 333 122 +59954 10 2785 95 +59964 c 2794 95 +59970 c 2797 95 +5997c 8 2787 95 +59984 4 2809 95 +59988 4 2810 95 +5998c 4 2809 95 +59990 4 2810 95 +59994 4 2818 95 +59998 4 2810 95 +5999c 8 2810 95 +599a4 8 156 132 +599ac 8 85 79 +599b4 8 2817 95 +599bc 10 2818 95 +599cc 8 156 132 +599d4 8 3077 95 +599dc 10 3078 95 +FUNC 599ec 1c8 0 testing::internal::XmlUnitTestResultPrinter::EscapeXml +599ec 14 3427 95 +59a00 4 3428 95 +59a04 c 333 122 +59a10 8 3427 95 +59a18 4 3430 95 +59a1c 4 3427 95 +59a20 4 333 122 +59a24 4 3428 95 +59a28 8 333 122 +59a30 8 3427 95 +59a38 8 3428 95 +59a40 8 400 131 +59a48 8 3430 95 +59a50 4 3431 95 +59a54 1c 3432 95 +59a70 4 131 79 +59a74 10 333 122 +59a84 10 3432 95 +59a94 4 131 79 +59a98 10 333 122 +59aa8 4 131 79 +59aac 10 333 122 +59abc 4 131 79 +59ac0 8 333 122 +59ac8 4 3443 95 +59acc 8 333 122 +59ad4 4 131 79 +59ad8 4 333 122 +59adc 4 3449 95 +59ae0 c 333 122 +59aec 1c 3309 95 +59b08 10 3314 95 +59b18 4 3456 95 +59b1c 4 131 79 +59b20 4 333 122 +59b24 4 3457 95 +59b28 8 333 122 +59b30 c 3457 95 +59b3c 4 131 79 +59b40 c 131 79 +59b4c 4 131 79 +59b50 c 333 122 +59b5c 8 156 132 +59b64 8 3430 95 +59b6c 4 131 79 +59b70 10 305 122 +59b80 c 3466 95 +59b8c 8 85 79 +59b94 20 3467 95 +FUNC 59bb4 154 0 testing::internal::XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes +59bb4 14 3683 95 +59bc8 4 3684 95 +59bcc 4 192 139 +59bd0 8 333 122 +59bd8 8 3683 95 +59be0 4 3685 95 +59be4 4 3684 95 +59be8 4 192 139 +59bec 8 333 122 +59bf4 4 3688 95 +59bf8 8 3683 95 +59c00 4 3684 95 +59c04 14 192 139 +59c18 8 3685 95 +59c20 8 3686 95 +59c28 4 333 122 +59c2c 4 3685 95 +59c30 8 3686 95 +59c38 4 131 79 +59c3c 10 333 122 +59c4c 10 3687 95 +59c5c 4 131 79 +59c60 c 333 122 +59c6c 4 131 79 +59c70 c 333 122 +59c7c c 3688 95 +59c88 4 3328 95 +59c8c 4 3688 95 +59c90 10 3328 95 +59ca0 4 131 79 +59ca4 c 131 79 +59cb0 4 131 79 +59cb4 c 333 122 +59cc0 14 156 132 +59cd4 c 3690 95 +59ce0 8 85 79 +59ce8 20 3691 95 +FUNC 59d08 64 0 testing::Message::Message +59d08 18 96 79 +59d20 c 96 79 +59d2c 8 96 79 +59d34 4 1139 87 +59d38 10 97 79 +59d48 c 97 79 +59d54 8 156 132 +59d5c 10 98 79 +FUNC 59d6c 380 0 testing::internal::ShouldShard +59d6c 10 4657 95 +59d7c 4 4664 95 +59d80 8 4657 95 +59d88 4 4664 95 +59d8c 4 4665 95 +59d90 4 4664 95 +59d94 c 4665 95 +59da0 14 4667 95 +59db4 4 4668 95 +59db8 4 4667 95 +59dbc c 4669 95 +59dc8 c 4671 95 +59dd4 3c 333 122 +59e10 8 131 79 +59e18 4 4673 95 +59e1c 8 131 79 +59e24 3c 333 122 +59e60 c 4673 95 +59e6c 8 85 79 +59e74 c 4674 95 +59e80 c 4674 95 +59e8c 8 156 132 +59e94 c 4677 95 +59ea0 c 4679 95 +59eac 3c 333 122 +59ee8 8 131 79 +59ef0 4 4681 95 +59ef4 8 131 79 +59efc 3c 333 122 +59f38 c 4681 95 +59f44 8 85 79 +59f4c c 4682 95 +59f58 c 4682 95 +59f64 8 156 132 +59f6c 10 4683 95 +59f7c 8 4684 95 +59f84 c 4685 95 +59f90 4 4687 95 +59f94 4 333 122 +59f98 4 4687 95 +59f9c 8 333 122 +59fa4 4 4687 95 +59fa8 88 333 122 +5a030 10 131 79 +5a040 34 333 122 +5a074 8 131 79 +5a07c 4 4690 95 +5a080 8 131 79 +5a088 14 333 122 +5a09c c 4690 95 +5a0a8 8 85 79 +5a0b0 c 4691 95 +5a0bc c 4691 95 +5a0c8 8 156 132 +5a0d0 8 4696 95 +5a0d8 14 4697 95 +FUNC 5a0ec 14 0 testing::internal::ShouldShard +5a0ec 4 4659 95 +5a0f0 8 4660 95 +5a0f8 8 4697 95 +FUNC 5a100 134 0 testing::GetReservedAttributesForElement +5a100 4 2074 95 +5a104 4 2075 95 +5a108 4 2074 95 +5a10c 4 2075 95 +5a110 8 2074 95 +5a118 8 2074 95 +5a120 c 2075 95 +5a12c 4 272 139 +5a130 4 67 139 +5a134 4 272 139 +5a138 4 67 139 +5a13c 4 481 101 +5a140 c 272 139 +5a14c 18 2077 95 +5a164 4 272 139 +5a168 8 67 139 +5a170 4 272 139 +5a174 4 481 101 +5a178 8 272 139 +5a180 18 2079 95 +5a198 4 272 139 +5a19c 8 67 139 +5a1a4 4 272 139 +5a1a8 4 481 101 +5a1ac 10 272 139 +5a1bc 8 2082 95 +5a1c4 4 333 122 +5a1c8 14 2082 95 +5a1dc 24 333 122 +5a200 c 2082 95 +5a20c 8 2082 95 +5a214 8 67 139 +5a21c 4 481 101 +5a220 14 2086 95 +FUNC 5a234 c8 0 testing::internal::ThreadLocal::GetOrCreateValue +5a234 10 2037 87 +5a244 4 2037 87 +5a248 8 2039 87 +5a250 4 2040 87 +5a254 4 2021 87 +5a258 4 2041 87 +5a25c c 2044 87 +5a268 4 2019 87 +5a26c 4 2046 87 +5a270 10 2019 87 +5a280 10 2046 87 +5a290 8 2046 87 +5a298 4 333 122 +5a29c 14 2046 87 +5a2b0 24 333 122 +5a2d4 c 2046 87 +5a2e0 8 2046 87 +5a2e8 4 2021 87 +5a2ec 10 2048 87 +FUNC 5a2fc 1c 0 testing::internal::UnitTestImpl::GetTestPartResultReporterForCurrentThread +5a2fc 4 701 95 +5a300 4 2011 87 +5a304 4 701 95 +5a308 4 2011 87 +5a30c c 703 95 +FUNC 5a318 2a4 0 testing::UnitTest::AddTestPartResult +5a318 14 4065 95 +5a32c 4 4066 95 +5a330 c 4065 95 +5a33c 4 4066 95 +5a340 14 4065 95 +5a354 4 4065 95 +5a358 4 4066 95 +5a35c 14 131 79 +5a370 4 4069 95 +5a374 8 1963 87 +5a37c 4 752 91 +5a380 8 2010 87 +5a388 10 192 139 +5a398 8 4070 95 +5a3a0 8 4081 95 +5a3a8 4c 333 122 +5a3f4 4 752 91 +5a3f8 8 2010 87 +5a400 8 192 139 +5a408 4 333 122 +5a40c c 192 139 +5a418 8 4073 95 +5a420 8 4073 95 +5a428 4 752 91 +5a42c 4 4075 95 +5a430 8 2010 87 +5a438 4 202 139 +5a43c 4 333 122 +5a440 4 131 79 +5a444 8 202 139 +5a44c 8 333 122 +5a454 18 4076 95 +5a46c 4 131 79 +5a470 c 131 79 +5a47c 4 131 79 +5a480 c 333 122 +5a48c 4 131 79 +5a490 c 131 79 +5a49c c 156 132 +5a4a8 c 4081 95 +5a4b4 10 4087 95 +5a4c4 10 68 81 +5a4d4 8 68 81 +5a4dc 10 68 81 +5a4ec 4 68 81 +5a4f0 c 68 81 +5a4fc 10 68 81 +5a50c 8 156 132 +5a514 8 4088 95 +5a51c 10 4089 95 +5a52c 4 4091 95 +5a530 c 4097 95 +5a53c c 4108 95 +5a548 c 4110 95 +5a554 8 4116 95 +5a55c 8 4087 95 +5a564 8 4069 95 +5a56c 8 85 79 +5a574 20 4120 95 +5a594 14 333 122 +5a5a8 14 131 79 +FUNC 5a5bc 24 0 testing::internal::UnitTestImpl::SetTestPartResultReporterForCurrentThread +5a5bc 4 707 95 +5a5c0 4 2010 87 +5a5c4 4 707 95 +5a5c8 4 707 95 +5a5cc 4 2010 87 +5a5d0 8 2013 87 +5a5d8 8 709 95 +FUNC 5a5e0 8c 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, long unsigned int>, std::priv::_Select1st, std::allocator >, long unsigned int> >, std::priv::_MapTraitsT, std::allocator >, long unsigned int> >, std::allocator, std::allocator >, long unsigned int> > >::_M_find, std::allocator > > +5a5e0 14 548 136 +5a5f4 8 548 136 +5a5fc c 549 136 +5a608 4 552 136 +5a60c 10 79 106 +5a61c 8 553 136 +5a624 8 554 136 +5a62c 8 556 136 +5a634 8 558 136 +5a63c 18 79 106 +5a654 18 564 136 +FUNC 5a66c 58 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, long unsigned int>, std::priv::_Select1st, std::allocator >, long unsigned int> >, std::priv::_MapTraitsT, std::allocator >, long unsigned int> >, std::allocator, std::allocator >, long unsigned int> > >::_M_erase +5a66c 18 655 135 +5a684 4 657 135 +5a688 c 658 135 +5a694 4 659 135 +5a698 8 156 132 +5a6a0 14 161 101 +5a6b4 10 664 135 +FUNC 5a6c4 44 0 std::priv::_List_base, std::allocator > >::clear +5a6c4 c 66 115 +5a6d0 4 66 115 +5a6d4 4 67 115 +5a6d8 8 68 115 +5a6e0 4 161 101 +5a6e4 4 74 115 +5a6e8 c 161 101 +5a6f4 4 78 115 +5a6f8 4 79 115 +5a6fc c 80 115 +FUNC 5a708 3c 0 std::priv::_List_global::_Transfer +5a708 8 50 115 +5a710 8 52 115 +5a718 8 53 115 +5a720 8 54 115 +5a728 4 58 115 +5a72c 4 57 115 +5a730 4 58 115 +5a734 8 59 115 +5a73c 4 60 115 +5a740 4 62 115 +FUNC 5a744 9c 0 testing::internal::edit_distance::::Hunk::PushLine +5a744 14 1096 95 +5a758 4 1096 95 +5a75c 4 208 116 +5a760 4 1099 95 +5a764 4 370 116 +5a768 4 208 116 +5a76c 8 1099 95 +5a774 8 600 116 +5a77c 8 602 116 +5a784 8 208 116 +5a78c 8 600 116 +5a794 8 602 116 +5a79c c 306 101 +5a7a8 4 307 101 +5a7ac 8 119 103 +5a7b4 8 68 124 +5a7bc 4 427 116 +5a7c0 4 429 116 +5a7c4 4 428 116 +5a7c8 4 430 116 +5a7cc 4 431 116 +5a7d0 10 1112 95 +FUNC 5a7e0 4c 0 std::operator==, std::allocator > +5a7e0 c 287 134 +5a7ec 4 289 134 +5a7f0 8 287 134 +5a7f8 14 400 131 +5a80c 8 289 134 +5a814 4 226 140 +5a818 8 289 134 +5a820 c 290 134 +FUNC 5a82c 144 0 std::priv::__find, std::allocator >*, std::basic_string, std::allocator > > +5a82c 10 112 99 +5a83c 4 115 99 +5a840 8 112 99 +5a848 8 115 99 +5a850 4 112 99 +5a854 4 112 99 +5a858 8 115 99 +5a860 8 117 99 +5a868 14 118 99 +5a87c 4 119 99 +5a880 18 121 99 +5a898 18 124 99 +5a8b0 18 127 99 +5a8c8 8 117 99 +5a8d0 24 131 99 +5a8f4 4 143 99 +5a8f8 8 131 99 +5a900 18 133 99 +5a918 4 134 99 +5a91c 8 136 99 +5a924 4 136 99 +5a928 c 136 99 +5a934 4 137 99 +5a938 10 139 99 +5a948 10 139 99 +5a958 18 145 99 +FUNC 5a970 154 0 testing::internal::XmlUnitTestResultPrinter::OutputXmlAttribute +5a970 c 3552 95 +5a97c 4 3554 95 +5a980 8 3552 95 +5a988 4 3554 95 +5a98c 4 3552 95 +5a990 4 3554 95 +5a994 8 3552 95 +5a99c 8 3552 95 +5a9a4 8 3554 95 +5a9ac 18 223 99 +5a9c4 8 3556 95 +5a9cc 4 3556 95 +5a9d0 4 333 122 +5a9d4 14 3556 95 +5a9e8 24 333 122 +5aa0c 10 3558 95 +5aa1c c 333 122 +5aa28 c 3558 95 +5aa34 c 333 122 +5aa40 8 3556 95 +5aa48 10 333 122 +5aa58 10 3561 95 +5aa68 c 333 122 +5aa74 10 3328 95 +5aa84 c 3561 95 +5aa90 c 333 122 +5aa9c 8 156 132 +5aaa4 8 42 143 +5aaac 18 3562 95 +FUNC 5aac4 124 0 std::priv::_Impl_vector >::_M_insert_overflow +5aac4 18 108 138 +5aadc c 108 138 +5aae8 4 192 139 +5aaec 4 108 138 +5aaf0 4 192 139 +5aaf4 4 173 139 +5aaf8 4 108 138 +5aafc 8 192 139 +5ab04 c 173 139 +5ab10 14 41 138 +5ab24 4 175 139 +5ab28 10 176 139 +5ab38 4 356 101 +5ab3c 8 346 101 +5ab44 4 177 139 +5ab48 c 347 101 +5ab54 4 348 101 +5ab58 4 352 101 +5ab5c 4 353 101 +5ab60 4 352 101 +5ab64 14 112 138 +5ab78 8 480 100 +5ab80 14 481 100 +5ab94 4 115 138 +5ab98 18 116 138 +5abb0 8 657 139 +5abb8 4 319 101 +5abbc 4 323 101 +5abc0 4 118 138 +5abc4 4 666 139 +5abc8 4 667 139 +5abcc 4 668 139 +5abd0 18 119 138 +FUNC 5abe8 50 0 std::priv::_Impl_vector >::push_back +5abe8 10 376 139 +5abf8 14 380 139 +5ac0c 4 126 103 +5ac10 10 382 139 +5ac20 10 386 139 +5ac30 8 388 139 +FUNC 5ac38 28 0 testing::TestEventListeners::Append +5ac38 c 3854 95 +5ac44 4 3855 95 +5ac48 10 173 143 +5ac58 8 3856 95 +FUNC 5ac60 5c 0 testing::TestEventListeners::SetDefaultResultPrinter +5ac60 c 3878 95 +5ac6c 8 3878 95 +5ac74 c 3879 95 +5ac80 8 3882 95 +5ac88 4 3882 95 +5ac8c 8 3882 95 +5ac94 4 3883 95 +5ac98 4 3884 95 +5ac9c 8 3885 95 +5aca4 8 3887 95 +5acac 4 3885 95 +5acb0 c 3887 95 +FUNC 5acbc 244 0 testing::internal::UnitTestImpl::UnitTestImpl +5acbc 10 4277 95 +5accc 4 4305 95 +5acd0 4 4277 95 +5acd4 4 4305 95 +5acd8 4 61 84 +5acdc 4 4305 95 +5ace0 8 61 84 +5ace8 4 4305 95 +5acec 8 61 84 +5acf4 8 4277 95 +5acfc 4 61 84 +5ad00 4 669 95 +5ad04 4 678 95 +5ad08 8 669 95 +5ad10 4 678 95 +5ad14 4 669 95 +5ad18 c 678 95 +5ad24 4 669 95 +5ad28 4 4305 95 +5ad2c 4 4305 95 +5ad30 4 2032 87 +5ad34 8 4305 95 +5ad3c 14 2032 87 +5ad50 8 2032 87 +5ad58 4 333 122 +5ad5c 14 2032 87 +5ad70 24 333 122 +5ad94 c 2032 87 +5ada0 8 2032 87 +5ada8 8 1999 87 +5adb0 4 4305 95 +5adb4 4 1999 87 +5adb8 8 4305 95 +5adc0 4 4305 95 +5adc4 8 67 139 +5adcc 4 481 101 +5add0 8 67 139 +5add8 4 481 101 +5addc 8 67 139 +5ade4 4 481 101 +5ade8 8 67 139 +5adf0 4 481 101 +5adf4 c 4305 95 +5ae00 4 4305 95 +5ae04 8 4305 95 +5ae0c 8 4305 95 +5ae14 4 4305 95 +5ae18 4 4305 95 +5ae1c 4 712 85 +5ae20 8 4305 95 +5ae28 4 1139 87 +5ae2c 4 4305 95 +5ae30 4 148 83 +5ae34 4 2032 87 +5ae38 c 148 83 +5ae44 4 1139 87 +5ae48 10 2032 87 +5ae58 8 2032 87 +5ae60 4 333 122 +5ae64 14 2032 87 +5ae78 24 333 122 +5ae9c c 2032 87 +5aea8 8 2032 87 +5aeb0 4 2034 87 +5aeb4 4 1997 87 +5aeb8 4 4306 95 +5aebc 8 67 139 +5aec4 4 481 101 +5aec8 4 4305 95 +5aecc 8 4306 95 +5aed4 c 2981 95 +5aee0 8 4306 95 +5aee8 18 4307 95 +FUNC 5af00 44 0 testing::UnitTest::UnitTest +5af00 10 4251 95 +5af10 10 4251 95 +5af20 c 4252 95 +5af2c 8 4252 95 +5af34 4 4252 95 +5af38 c 4253 95 +FUNC 5af44 5c 0 testing::UnitTest::GetInstance +5af44 c 3924 95 +5af50 10 3940 95 +5af60 14 3940 95 +5af74 4 3940 95 +5af78 4 3940 95 +5af7c 14 3940 95 +5af90 10 3943 95 +FUNC 5afa0 244 0 testing::internal::UnitTestOptions::GetAbsolutePathToOutputFile +5afa0 20 408 95 +5afc0 8 408 95 +5afc8 4 410 95 +5afcc 18 411 95 +5afe4 10 413 95 +5aff4 4 414 95 +5aff8 8 418 95 +5b000 c 418 95 +5b00c 4 418 95 +5b010 4 418 95 +5b014 4 418 95 +5b018 4 418 95 +5b01c c 418 95 +5b028 14 418 95 +5b03c c 418 95 +5b048 10 418 95 +5b058 c 418 95 +5b064 28 156 132 +5b08c 4 420 95 +5b090 10 420 95 +5b0a0 c 420 95 +5b0ac 8 156 132 +5b0b4 10 421 95 +5b0c4 8 426 95 +5b0cc c 426 95 +5b0d8 4 426 95 +5b0dc 4 426 95 +5b0e0 4 426 95 +5b0e4 4 426 95 +5b0e8 c 426 95 +5b0f4 10 426 95 +5b104 c 426 95 +5b110 10 426 95 +5b120 c 74 84 +5b12c 28 156 132 +5b154 10 430 95 +5b164 c 431 95 +5b170 4 431 95 +5b174 4 435 95 +5b178 4 435 95 +5b17c 4 435 95 +5b180 8 435 95 +5b188 14 435 95 +5b19c 10 156 132 +5b1ac c 436 95 +5b1b8 10 156 132 +5b1c8 1c 437 95 +FUNC 5b1e4 18 0 testing::internal::GetUnitTestImpl +5b1e4 8 936 91 +5b1ec 4 937 91 +5b1f0 c 938 91 +FUNC 5b1fc 4c 0 testing::internal::HandleExceptionsInMethodIfSupported +5b1fc c 2370 95 +5b208 c 2370 95 +5b214 14 2395 95 +5b228 4 2418 95 +5b22c 8 2418 95 +5b234 8 2418 95 +5b23c c 2420 95 +FUNC 5b248 28 0 testing::Test::HasFatalFailure +5b248 8 2447 95 +5b250 4 2448 95 +5b254 4 4872 95 +5b258 4 2449 95 +5b25c c 4872 95 +5b268 8 2448 95 +FUNC 5b270 28 0 testing::Test::HasNonfatalFailure +5b270 8 2452 95 +5b278 4 2454 95 +5b27c 4 4872 95 +5b280 4 2455 95 +5b284 c 4872 95 +5b290 8 2454 95 +FUNC 5b298 14 0 testing::internal::ScopedTrace::~ScopedTrace +5b298 8 3780 95 +5b2a0 4 3782 95 +5b2a4 4 3783 95 +5b2a8 4 3782 95 +FUNC 5b2ac 5c 0 testing::TestEventListeners::SetDefaultXmlGenerator +5b2ac c 3894 95 +5b2b8 8 3894 95 +5b2c0 c 3895 95 +5b2cc 8 3898 95 +5b2d4 4 3898 95 +5b2d8 8 3898 95 +5b2e0 4 3899 95 +5b2e4 4 3900 95 +5b2e8 8 3901 95 +5b2f0 8 3903 95 +5b2f8 4 3901 95 +5b2fc c 3903 95 +FUNC 5b308 c8 0 testing::internal::UnitTestImpl::ConfigureXmlOutput +5b308 c 4352 95 +5b314 8 4353 95 +5b31c 4 4352 95 +5b320 4 4352 95 +5b324 4 4353 95 +5b328 18 4354 95 +5b340 10 4356 95 +5b350 10 4356 95 +5b360 8 4356 95 +5b368 c 4356 95 +5b374 c 156 132 +5b380 14 476 134 +5b394 4 4357 95 +5b398 10 4359 95 +5b3a8 10 4360 95 +5b3b8 8 156 132 +5b3c0 10 4362 95 +FUNC 5b3d0 50 0 testing::TestCase::AddTestInfo +5b3d0 10 2707 95 +5b3e0 4 2707 95 +5b3e4 4 173 143 +5b3e8 4 2707 95 +5b3ec 8 173 143 +5b3f4 14 192 139 +5b408 8 2709 95 +5b410 4 173 143 +5b414 c 2710 95 +FUNC 5b420 38 0 std::_Destroy_Range > +5b420 c 219 103 +5b42c 8 65 113 +5b434 8 191 103 +5b43c 10 156 132 +5b44c c 221 103 +FUNC 5b458 5c 0 testing::internal::ThreadLocal > >::ValueHolder::~ValueHolder +5b458 c 2017 87 +5b464 8 2017 87 +5b46c 4 64 113 +5b470 4 2017 87 +5b474 4 304 139 +5b478 4 2017 87 +5b47c 10 64 113 +5b48c 8 304 139 +5b494 8 87 139 +5b49c 4 88 139 +5b4a0 8 323 101 +5b4a8 c 2017 87 +FUNC 5b4b4 24 0 testing::internal::ThreadLocal > >::ValueHolder::~ValueHolder +5b4b4 c 2017 87 +5b4c0 8 2017 87 +5b4c8 4 2017 87 +5b4cc 8 2017 87 +5b4d4 4 2017 87 +FUNC 5b4d8 228 0 testing::internal::UnitTestImpl::~UnitTestImpl +5b4d8 18 4309 95 +5b4f0 10 4309 95 +5b500 8 60 98 +5b508 14 61 98 +5b51c 8 60 98 +5b524 c 61 98 +5b530 8 4316 95 +5b538 c 4316 95 +5b544 c 2003 87 +5b550 4 2003 87 +5b554 10 2007 87 +5b564 4 2007 87 +5b568 4 333 122 +5b56c 14 2007 87 +5b580 24 333 122 +5b5a4 c 2007 87 +5b5b0 8 2007 87 +5b5b8 4 64 113 +5b5bc 4 304 139 +5b5c0 c 64 113 +5b5cc 8 304 139 +5b5d4 8 87 139 +5b5dc 4 88 139 +5b5e0 8 323 101 +5b5e8 8 1153 87 +5b5f0 c 1155 87 +5b5fc c 1140 87 +5b608 8 4309 95 +5b610 c 4309 95 +5b61c c 560 86 +5b628 8 562 86 +5b630 c 562 86 +5b63c 8 560 86 +5b644 8 304 139 +5b64c 8 87 139 +5b654 4 88 139 +5b658 8 323 101 +5b660 10 304 139 +5b670 8 2003 87 +5b678 4 2003 87 +5b67c 10 2007 87 +5b68c 4 2007 87 +5b690 4 333 122 +5b694 14 2007 87 +5b6a8 24 333 122 +5b6cc c 2007 87 +5b6d8 8 2007 87 +5b6e0 8 4309 95 +5b6e8 8 156 132 +5b6f0 10 4317 95 +FUNC 5b700 24 0 testing::internal::UnitTestImpl::~UnitTestImpl +5b700 c 4309 95 +5b70c 4 4309 95 +5b710 4 4317 95 +5b714 4 4317 95 +5b718 8 4317 95 +5b720 4 4317 95 +FUNC 5b724 e4 0 testing::internal::StreamingListener::UrlEncode +5b724 c 3702 95 +5b730 4 3703 95 +5b734 4 3711 95 +5b738 4 3702 95 +5b73c 4 3703 95 +5b740 4 3702 95 +5b744 4 3703 95 +5b748 8 3702 95 +5b750 4 3703 95 +5b754 4 3711 95 +5b758 8 3704 95 +5b760 4 3711 95 +5b764 8 3704 95 +5b76c 8 3704 95 +5b774 4 3705 95 +5b778 2c 3705 95 +5b7a4 c 3711 95 +5b7b0 10 3711 95 +5b7c0 c 3711 95 +5b7cc 10 156 132 +5b7dc 4 3712 95 +5b7e0 8 3714 95 +5b7e8 8 3705 95 +5b7f0 18 3719 95 +FUNC 5b808 18c 0 testing::internal::UnitTestOptions::FilterMatchesTest +5b808 c 485 95 +5b814 4 486 95 +5b818 4 485 95 +5b81c c 486 95 +5b828 c 485 95 +5b834 4 486 95 +5b838 18 486 95 +5b850 4 492 95 +5b854 4 486 95 +5b858 4 493 95 +5b85c c 156 132 +5b868 10 491 95 +5b878 c 492 95 +5b884 c 493 95 +5b890 4 494 95 +5b894 c 495 95 +5b8a0 10 496 95 +5b8b0 4 355 114 +5b8b4 8 324 131 +5b8bc 4 112 132 +5b8c0 4 481 101 +5b8c4 4 324 131 +5b8c8 10 148 137 +5b8d8 4 325 131 +5b8dc 4 498 95 +5b8e0 4 101 103 +5b8e4 8 498 95 +5b8ec 8 156 132 +5b8f4 10 499 95 +5b904 c 499 95 +5b910 8 156 132 +5b918 10 500 95 +5b928 10 502 95 +5b938 10 508 95 +5b948 4 508 95 +5b94c 10 509 95 +5b95c 4 508 95 +5b960 18 156 132 +5b978 1c 510 95 +FUNC 5b994 1f8 0 testing::internal::UnitTestImpl::FilterTests +5b994 28 4731 95 +5b9bc 8 4731 95 +5b9c4 4 4733 95 +5b9c8 14 4733 95 +5b9dc 18 4735 95 +5b9f4 4 4733 95 +5b9f8 4 4735 95 +5b9fc 4 4766 95 +5ba00 4 4743 95 +5ba04 4 4766 95 +5ba08 4 4755 95 +5ba0c 4 4742 95 +5ba10 4 4741 95 +5ba14 4 4766 95 +5ba18 8 4745 95 +5ba20 4 4755 95 +5ba24 10 192 139 +5ba34 8 4743 95 +5ba3c 4 4744 95 +5ba40 8 4745 95 +5ba48 4 4748 95 +5ba4c 8 4745 95 +5ba54 4 860 82 +5ba58 8 4750 95 +5ba60 c 192 139 +5ba6c 8 4748 95 +5ba74 4 4749 95 +5ba78 10 4750 95 +5ba88 14 4755 95 +5ba9c 10 4757 95 +5baac 4 4758 95 +5bab0 8 4762 95 +5bab8 4 4758 95 +5babc 8 4762 95 +5bac4 4 4763 95 +5bac8 14 4766 95 +5badc c 4766 95 +5bae8 8 4769 95 +5baf0 8 4769 95 +5baf8 4 4721 95 +5bafc 4 4766 95 +5bb00 4 4770 95 +5bb04 4 4769 95 +5bb08 4 4721 95 +5bb0c 8 4770 95 +5bb14 4 4775 95 +5bb18 4 4777 95 +5bb1c 4 4774 95 +5bb20 4 4748 95 +5bb24 10 4775 95 +5bb34 4 156 132 +5bb38 4 860 82 +5bb3c c 156 132 +5bb48 4 4743 95 +5bb4c 8 156 132 +5bb54 4 4766 95 +5bb58 8 4769 95 +5bb60 2c 4782 95 +FUNC 5bb8c 58 0 testing::internal::StreamingListener::SendLn +5bb8c 10 1174 91 +5bb9c 8 1059 91 +5bba4 4 1143 87 +5bba8 18 1059 91 +5bbc0 c 1059 91 +5bbcc 8 156 132 +5bbd4 10 1174 91 +FUNC 5bbe4 48 0 testing::internal::StreamingListener::OnTestProgramStart +5bbe4 4 1118 91 +5bbe8 4 1119 91 +5bbec 8 1118 91 +5bbf4 8 1119 91 +5bbfc 4 1118 91 +5bc00 c 1119 91 +5bc0c c 1119 91 +5bc18 8 156 132 +5bc20 c 1120 91 +FUNC 5bc2c 9c 0 testing::internal::StreamingListener::OnTestProgramEnd +5bc2c 10 1122 91 +5bc3c 4 1125 91 +5bc40 4 1122 91 +5bc44 8 1125 91 +5bc4c 4 1180 91 +5bc50 c 1180 91 +5bc5c 8 1180 91 +5bc64 14 1180 91 +5bc78 14 1125 91 +5bc8c c 1125 91 +5bc98 10 156 132 +5bca8 4 1143 87 +5bcac 4 1128 91 +5bcb0 8 1128 91 +5bcb8 10 1129 91 +FUNC 5bcc8 6c 0 testing::internal::StreamingListener::OnTestIterationStart +5bcc8 c 1131 91 +5bcd4 4 1132 91 +5bcd8 4 1131 91 +5bcdc 4 1132 91 +5bce0 4 1131 91 +5bce4 4 1132 91 +5bce8 4 1131 91 +5bcec 4 1132 91 +5bcf0 4 1132 91 +5bcf4 14 1132 91 +5bd08 c 1133 91 +5bd14 10 156 132 +5bd24 10 1134 91 +FUNC 5bd34 228 0 testing::internal::UnitTestImpl::ConfigureStreamingOutput +5bd34 24 4367 95 +5bd58 8 4369 95 +5bd60 c 440 130 +5bd6c c 162 99 +5bd78 8 164 99 +5bd80 c 165 99 +5bd8c c 168 99 +5bd98 8 166 99 +5bda0 c 171 99 +5bdac 8 169 99 +5bdb4 c 174 99 +5bdc0 c 172 99 +5bdcc 8 164 99 +5bdd4 24 178 99 +5bdf8 10 180 99 +5be08 4 181 99 +5be0c 10 183 99 +5be1c 4 184 99 +5be20 10 186 99 +5be30 4 165 99 +5be34 8 447 130 +5be3c 4 447 130 +5be40 8 4371 95 +5be48 40 1023 131 +5be88 c 4373 95 +5be94 c 1113 91 +5bea0 c 1113 91 +5beac 4 1067 91 +5beb0 4 1067 91 +5beb4 10 1067 91 +5bec4 8 1067 91 +5becc c 1067 91 +5bed8 8 1068 91 +5bee0 4 1139 87 +5bee4 14 1178 91 +5bef8 c 1178 91 +5bf04 8 156 132 +5bf0c c 4373 95 +5bf18 14 156 132 +5bf2c c 4376 95 +5bf38 10 4377 95 +5bf48 14 4380 95 +FUNC 5bf5c 64 0 testing::internal::UnitTestImpl::PostFlagParsingInit +5bf5c c 4388 95 +5bf68 c 4390 95 +5bf74 8 4391 95 +5bf7c 8 760 91 +5bf84 8 760 91 +5bf8c 8 4395 95 +5bf94 8 4401 95 +5bf9c 8 4405 95 +5bfa4 4 4409 95 +5bfa8 8 4412 95 +5bfb0 4 4409 95 +5bfb4 c 4412 95 +FUNC 5bfc0 94 0 testing::internal::AppendUserMessage +5bfc0 c 1963 95 +5bfcc 4 1965 95 +5bfd0 8 1963 95 +5bfd8 4 1965 95 +5bfdc 4 1963 95 +5bfe0 8 1965 95 +5bfe8 10 1966 95 +5bff8 10 1967 95 +5c008 18 1970 95 +5c020 10 1970 95 +5c030 10 156 132 +5c040 14 1971 95 +FUNC 5c054 a0 0 testing::internal::AssertHelper::operator= +5c054 10 363 95 +5c064 4 370 95 +5c068 4 363 95 +5c06c 4 363 95 +5c070 c 370 95 +5c07c 10 370 95 +5c08c 14 370 95 +5c0a0 4 370 95 +5c0a4 4 370 95 +5c0a8 10 370 95 +5c0b8 1c 370 95 +5c0d4 10 156 132 +5c0e4 10 371 95 +FUNC 5c0f4 314 0 testing::Test::HasSameFixtureClass +5c0f4 1c 2229 95 +5c110 8 2230 95 +5c118 4 2287 95 +5c11c 4 743 91 +5c120 c 2234 95 +5c12c 8 2235 95 +5c134 4 2240 95 +5c138 8 2243 95 +5c140 1c 2245 95 +5c15c c 2247 95 +5c168 10 2249 95 +5c178 4 2257 95 +5c17c 4 2257 95 +5c180 4 2257 95 +5c184 4 2259 95 +5c188 14 2261 95 +5c19c 8 333 122 +5c1a4 4 2261 95 +5c1a8 8 2262 95 +5c1b0 38 333 122 +5c1e8 10 2264 95 +5c1f8 4 131 79 +5c1fc c 333 122 +5c208 4 131 79 +5c20c c 333 122 +5c218 10 2266 95 +5c228 4 131 79 +5c22c 10 333 122 +5c23c 4 131 79 +5c240 c 333 122 +5c24c 10 2267 95 +5c25c 4 131 79 +5c260 10 333 122 +5c270 4 131 79 +5c274 10 333 122 +5c284 4 131 79 +5c288 10 333 122 +5c298 8 2269 95 +5c2a0 4 2284 95 +5c2a4 4 2269 95 +5c2a8 8 85 79 +5c2b0 c 2261 95 +5c2bc 18 2273 95 +5c2d4 8 2274 95 +5c2dc 24 333 122 +5c300 10 2276 95 +5c310 4 131 79 +5c314 c 333 122 +5c320 4 131 79 +5c324 10 333 122 +5c334 10 2277 95 +5c344 4 131 79 +5c348 10 333 122 +5c358 10 2278 95 +5c368 4 131 79 +5c36c 10 333 122 +5c37c 4 131 79 +5c380 10 333 122 +5c390 4 131 79 +5c394 10 333 122 +5c3a4 4 131 79 +5c3a8 10 333 122 +5c3b8 4 131 79 +5c3bc 10 333 122 +5c3cc c 2282 95 +5c3d8 8 85 79 +5c3e0 8 2273 95 +5c3e8 20 2288 95 +FUNC 5c408 bc 0 testing::Test::Run +5c408 c 2425 95 +5c414 4 2425 95 +5c418 c 2426 95 +5c424 8 2428 95 +5c42c 8 2429 95 +5c434 8 2429 95 +5c43c 18 2430 95 +5c454 c 2432 95 +5c460 c 2433 95 +5c46c 8 2433 95 +5c474 18 2435 95 +5c48c c 2441 95 +5c498 8 2441 95 +5c4a0 18 2443 95 +5c4b8 c 2444 95 +FUNC 5c4c4 10c 0 testing::TestInfo::Run +5c4c4 14 2584 95 +5c4d8 c 2585 95 +5c4e4 4 2588 95 +5c4e8 4 693 91 +5c4ec 4 2588 95 +5c4f0 4 2591 95 +5c4f4 4 3871 95 +5c4f8 4 2594 95 +5c4fc 4 3871 95 +5c500 10 2594 95 +5c510 8 2596 95 +5c518 c 2598 95 +5c524 8 2598 95 +5c52c 4 2603 95 +5c530 8 2395 95 +5c538 10 2418 95 +5c548 4 2607 95 +5c54c 8 2607 95 +5c554 4 2607 95 +5c558 c 2614 95 +5c564 8 2614 95 +5c56c 1c 2616 95 +5c588 8 2618 95 +5c590 4 585 82 +5c594 14 2621 95 +5c5a8 8 693 91 +5c5b0 c 2610 95 +5c5bc 14 2626 95 +FUNC 5c5d0 100 0 testing::TestCase::Run +5c5d0 14 2713 95 +5c5e4 c 2714 95 +5c5f0 4 2716 95 +5c5f4 4 686 91 +5c5f8 4 2716 95 +5c5fc 4 2727 95 +5c600 4 2719 95 +5c604 4 3871 95 +5c608 4 2721 95 +5c60c 4 3871 95 +5c610 10 2721 95 +5c620 c 2722 95 +5c62c 8 2722 95 +5c634 4 2395 95 +5c638 8 2362 95 +5c640 8 2726 95 +5c648 10 192 139 +5c658 8 2727 95 +5c660 8 2728 95 +5c668 4 2727 95 +5c66c 4 2728 95 +5c670 8 2728 95 +5c678 c 2730 95 +5c684 c 2732 95 +5c690 8 2732 95 +5c698 4 2395 95 +5c69c 8 2362 95 +5c6a4 14 2736 95 +5c6b8 4 686 91 +5c6bc 14 2738 95 +FUNC 5c6d0 3fc 0 testing::internal::UnitTestImpl::RunAllTests +5c6d0 4 4498 95 +5c6d4 4 320 95 +5c6d8 10 4498 95 +5c6e8 4 4500 95 +5c6ec 10 4498 95 +5c6fc 4 4498 95 +5c700 4 4500 95 +5c704 c 4503 95 +5c710 4 4504 95 +5c714 c 4508 95 +5c720 4 4513 95 +5c724 4 4518 95 +5c728 4 4525 95 +5c72c 8 4529 95 +5c734 4 4525 95 +5c738 4 4529 95 +5c73c 4 4525 95 +5c740 10 4529 95 +5c750 10 4535 95 +5c760 4 4538 95 +5c764 4 4535 95 +5c768 8 4538 95 +5c770 c 4540 95 +5c77c c 4545 95 +5c788 8 4545 95 +5c790 4 138 91 +5c794 4 137 91 +5c798 1c 143 91 +5c7b4 4 144 91 +5c7b8 4 4545 95 +5c7bc 4 4557 95 +5c7c0 4 3871 95 +5c7c4 8 4552 95 +5c7cc 14 4553 95 +5c7e0 4 4557 95 +5c7e4 8 4557 95 +5c7ec 4 4559 95 +5c7f0 4 4560 95 +5c7f4 4 152 91 +5c7f8 4 4548 95 +5c7fc 4 4559 95 +5c800 8 333 122 +5c808 4 152 91 +5c80c 10 333 122 +5c81c 10 4560 95 +5c82c 8 60 98 +5c834 c 871 82 +5c840 8 4565 95 +5c848 4 4568 95 +5c84c 8 4568 95 +5c854 8 714 85 +5c85c 8 4573 95 +5c864 18 4577 95 +5c87c 4 4580 95 +5c880 1c 4582 95 +5c89c 8 60 98 +5c8a4 14 61 98 +5c8b8 14 4584 95 +5c8cc c 4588 95 +5c8d8 20 4596 95 +5c8f8 4 4588 95 +5c8fc 8 594 91 +5c904 10 192 139 +5c914 8 4589 95 +5c91c 14 594 91 +5c930 4 595 91 +5c934 4 595 91 +5c938 8 595 91 +5c940 4 4591 95 +5c944 4 4589 95 +5c948 8 4591 95 +5c950 8 60 98 +5c958 14 61 98 +5c96c 14 4599 95 +5c980 c 4602 95 +5c98c 18 4605 95 +5c9a4 c 576 91 +5c9b0 4 4609 95 +5c9b4 4 4618 95 +5c9b8 4 4609 95 +5c9bc 4 4618 95 +5c9c0 8 4620 95 +5c9c8 4 4622 95 +5c9cc 14 152 91 +5c9e0 4 152 91 +5c9e4 4 333 122 +5c9e8 18 152 91 +5ca00 1c 333 122 +5ca1c 10 153 91 +5ca2c c 333 122 +5ca38 10 154 91 +5ca48 c 333 122 +5ca54 c 152 91 +5ca60 4 156 91 +5ca64 4 155 91 +5ca68 c 156 91 +5ca74 4 4622 95 +5ca78 8 4560 95 +5ca80 8 4560 95 +5ca88 4 4626 95 +5ca8c 4 4628 95 +5ca90 4 4626 95 +5ca94 4 4628 95 +5ca98 c 4626 95 +5caa4 28 4629 95 +FUNC 5cacc cc 0 testing::UnitTest::Run +5cacc 18 4137 95 +5cae4 4 4137 95 +5cae8 4 4164 95 +5caec 10 4164 95 +5cafc 10 2328 87 +5cb0c 4 3816 95 +5cb10 8 3816 95 +5cb18 10 2298 87 +5cb28 18 3821 95 +5cb40 8 3822 95 +5cb48 4 4168 95 +5cb4c 4 1279 82 +5cb50 8 819 91 +5cb58 4 1279 82 +5cb5c 4 2395 95 +5cb60 c 2418 95 +5cb6c 4 4212 95 +5cb70 4 3827 95 +5cb74 8 3827 95 +5cb7c 8 3828 95 +5cb84 14 4213 95 +FUNC 5cb98 70 0 testing::internal::StreamingListener::OnTestStart +5cb98 10 1152 91 +5cba8 4 1153 91 +5cbac 4 1152 91 +5cbb0 8 1153 91 +5cbb8 4 1152 91 +5cbbc 8 1153 91 +5cbc4 4 1153 91 +5cbc8 4 1153 91 +5cbcc 10 1153 91 +5cbdc c 1153 91 +5cbe8 10 156 132 +5cbf8 10 1154 91 +FUNC 5cc08 70 0 testing::internal::StreamingListener::OnTestCaseStart +5cc08 10 1142 91 +5cc18 4 1143 91 +5cc1c 4 1142 91 +5cc20 8 1143 91 +5cc28 4 1142 91 +5cc2c 8 1143 91 +5cc34 4 1143 91 +5cc38 4 1143 91 +5cc3c 10 1143 91 +5cc4c c 1143 91 +5cc58 10 156 132 +5cc68 10 1144 91 +FUNC 5cc78 88 0 testing::FormatCountableNoun +5cc78 c 2765 95 +5cc84 4 2766 95 +5cc88 4 2766 95 +5cc8c 4 2765 95 +5cc90 8 2765 95 +5cc98 8 2766 95 +5cca0 8 2765 95 +5cca8 4 2766 95 +5ccac 14 2766 95 +5ccc0 4 2767 95 +5ccc4 8 2767 95 +5cccc 4 2767 95 +5ccd0 c 2767 95 +5ccdc 10 156 132 +5ccec 14 2768 95 +FUNC 5cd00 ac 0 testing::internal::PrettyUnitTestResultPrinter::OnTestCaseStart +5cd00 4 3048 95 +5cd04 4 3050 95 +5cd08 8 3048 95 +5cd10 4 3048 95 +5cd14 4 3050 95 +5cd18 1c 3050 95 +5cd34 10 3051 95 +5cd44 14 3052 95 +5cd58 4 1144 87 +5cd5c 8 797 82 +5cd64 4 3053 95 +5cd68 c 3054 95 +5cd74 14 3056 95 +5cd88 10 3058 95 +5cd98 8 156 132 +5cda0 c 3059 95 +FUNC 5cdac 18c 0 testing::internal::PrettyUnitTestResultPrinter::OnTestIterationStart +5cdac 4 3008 95 +5cdb0 8 3007 95 +5cdb8 4 3008 95 +5cdbc 8 3007 95 +5cdc4 4 3008 95 +5cdc8 4 3007 95 +5cdcc 4 3008 95 +5cdd0 14 3009 95 +5cde4 24 3015 95 +5ce08 38 3017 95 +5ce40 4 3020 95 +5ce44 10 3021 95 +5ce54 c 2328 87 +5ce60 14 3025 95 +5ce74 c 3028 95 +5ce80 4 798 91 +5ce84 14 3031 95 +5ce98 c 3034 95 +5cea4 4 2772 95 +5cea8 4 2777 95 +5ceac 4 3034 95 +5ceb0 8 3037 95 +5ceb8 1c 2772 95 +5ced4 8 3037 95 +5cedc 18 2777 95 +5cef4 14 3037 95 +5cf08 10 156 132 +5cf18 10 3038 95 +5cf28 10 3039 95 +FUNC 5cf38 2a0 0 testing::internal::FormatEpochTimeInMillisAsIso8601 +5cf38 4 3509 95 +5cf3c 4 3508 95 +5cf40 4 3509 95 +5cf44 8 3508 95 +5cf4c 4 3509 95 +5cf50 4 3515 95 +5cf54 4 3508 95 +5cf58 8 3509 95 +5cf60 4 3515 95 +5cf64 10 3508 95 +5cf74 4 3508 95 +5cf78 8 3515 95 +5cf80 18 3516 95 +5cf98 c 3520 95 +5cfa4 4 3520 95 +5cfa8 c 3520 95 +5cfb4 4 3520 95 +5cfb8 4 3520 95 +5cfbc 10 3520 95 +5cfcc 4 3520 95 +5cfd0 4 3520 95 +5cfd4 4 3521 95 +5cfd8 4 3520 95 +5cfdc 4 3521 95 +5cfe0 8 3520 95 +5cfe8 4 3523 95 +5cfec 8 3520 95 +5cff4 10 3520 95 +5d004 c 3521 95 +5d010 4 3523 95 +5d014 4 3521 95 +5d018 c 3521 95 +5d024 18 3521 95 +5d03c 24 3522 95 +5d060 14 3522 95 +5d074 28 3522 95 +5d09c 1c 3523 95 +5d0b8 4 3523 95 +5d0bc 4 3523 95 +5d0c0 c 3523 95 +5d0cc 18 3523 95 +5d0e4 20 3524 95 +5d104 c 3525 95 +5d110 14 3525 95 +5d124 90 156 132 +5d1b4 24 3526 95 +FUNC 5d1d8 e0 0 testing::internal::ParseFlagValue +5d1d8 14 4955 95 +5d1ec 4 4955 95 +5d1f0 8 4957 95 +5d1f8 1c 4960 95 +5d214 4 4960 95 +5d218 4 4960 95 +5d21c 4 4960 95 +5d220 14 4960 95 +5d234 10 4960 95 +5d244 c 156 132 +5d250 4 4962 95 +5d254 4 156 132 +5d258 8 400 131 +5d260 4 4962 95 +5d264 4 400 131 +5d268 8 4962 95 +5d270 4 4962 95 +5d274 8 4965 95 +5d27c 8 4968 95 +5d284 4 4968 95 +5d288 8 4978 95 +5d290 c 156 132 +5d29c 4 4957 95 +5d2a0 18 4979 95 +FUNC 5d2b8 54 0 testing::internal::ParseBoolFlag +5d2b8 c 4991 95 +5d2c4 4 4991 95 +5d2c8 8 4993 95 +5d2d0 4 4996 95 +5d2d4 4 4996 95 +5d2d8 4 4999 95 +5d2dc c 4999 95 +5d2e8 8 4999 95 +5d2f0 4 5000 95 +5d2f4 4 4999 95 +5d2f8 4 4999 95 +5d2fc 10 5001 95 +FUNC 5d30c 8c 0 testing::internal::ParseInt32Flag +5d30c 10 5008 95 +5d31c 4 5010 95 +5d320 8 5008 95 +5d328 4 5008 95 +5d32c 8 5010 95 +5d334 4 5013 95 +5d338 4 5013 95 +5d33c c 5016 95 +5d348 14 333 122 +5d35c c 5016 95 +5d368 10 5017 95 +5d378 8 85 79 +5d380 18 5018 95 +FUNC 5d398 38 0 testing::internal::ParseStringFlag +5d398 c 5025 95 +5d3a4 4 5025 95 +5d3a8 c 5027 95 +5d3b4 4 5030 95 +5d3b8 8 5033 95 +5d3c0 4 5034 95 +5d3c4 c 5035 95 +FUNC 5d3d0 374 0 testing::internal::ParseGoogleTestFlagsOnlyImpl +5d3d0 10 5165 95 +5d3e0 8 5176 95 +5d3e8 4 5178 95 +5d3ec c 5165 95 +5d3f8 8 5165 95 +5d400 4 5166 95 +5d404 8 5176 95 +5d40c 4 5178 95 +5d410 c 5166 95 +5d41c 18 5167 95 +5d434 14 5176 95 +5d448 4 5175 95 +5d44c 18 5178 95 +5d464 4 5175 95 +5d468 1c 5180 95 +5d484 4 5175 95 +5d488 1c 5181 95 +5d4a4 4 5175 95 +5d4a8 1c 5183 95 +5d4c4 4 5175 95 +5d4c8 1c 5185 95 +5d4e4 4 5175 95 +5d4e8 1c 5186 95 +5d504 4 5175 95 +5d508 1c 5188 95 +5d524 4 5175 95 +5d528 1c 5189 95 +5d544 4 5175 95 +5d548 1c 5190 95 +5d564 4 5175 95 +5d568 1c 5191 95 +5d584 4 5175 95 +5d588 1c 5192 95 +5d5a4 4 5175 95 +5d5a8 1c 5193 95 +5d5c4 4 5175 95 +5d5c8 1c 5194 95 +5d5e4 4 5175 95 +5d5e8 1c 5196 95 +5d604 4 5175 95 +5d608 1c 5198 95 +5d624 4 5175 95 +5d628 1c 5200 95 +5d644 8 5175 95 +5d64c c 5225 95 +5d658 c 5229 95 +5d664 4 5165 95 +5d668 10 5206 95 +5d678 4 5207 95 +5d67c 4 5206 95 +5d680 8 5207 95 +5d688 4 5211 95 +5d68c 4 5215 95 +5d690 8 5211 95 +5d698 18 5216 95 +5d6b0 14 5216 95 +5d6c4 4 5216 95 +5d6c8 c 5221 95 +5d6d4 4 156 132 +5d6d8 4 5166 95 +5d6dc 8 156 132 +5d6e4 14 5217 95 +5d6f8 4 5216 95 +5d6fc 14 5217 95 +5d710 4 5216 95 +5d714 c 5218 95 +5d720 8 5216 95 +5d728 1c 5231 95 +FUNC 5d744 150 0 testing::internal::StreamingListener::OnTestPartResult +5d744 20 1163 91 +5d764 8 1163 91 +5d76c 4 77 81 +5d770 c 1165 91 +5d77c 8 1166 91 +5d784 4 1167 91 +5d788 4 1167 91 +5d78c 4 1167 91 +5d790 4 1167 91 +5d794 4 1168 91 +5d798 4 1168 91 +5d79c 4 1167 91 +5d7a0 4 1168 91 +5d7a4 10 1167 91 +5d7b4 4 1169 91 +5d7b8 4 1167 91 +5d7bc 14 1167 91 +5d7d0 c 1168 91 +5d7dc 4 1168 91 +5d7e0 4 1168 91 +5d7e4 4 1168 91 +5d7e8 10 1168 91 +5d7f8 14 1168 91 +5d80c 8 1169 91 +5d814 4 1169 91 +5d818 4 1169 91 +5d81c 10 1169 91 +5d82c c 1169 91 +5d838 40 156 132 +5d878 1c 1170 91 +FUNC 5d894 47c 0 testing::internal::XmlUnitTestResultPrinter::OutputXmlTestInfo +5d894 14 3568 95 +5d8a8 4 700 82 +5d8ac 8 3568 95 +5d8b4 4 700 82 +5d8b8 4 3570 95 +5d8bc 8 3568 95 +5d8c4 4 3570 95 +5d8c8 4 3568 95 +5d8cc 4 3570 95 +5d8d0 4 3568 95 +5d8d4 c 3570 95 +5d8e0 4 3573 95 +5d8e4 4 3568 95 +5d8e8 4 3573 95 +5d8ec 4 3568 95 +5d8f0 4 3570 95 +5d8f4 4 3573 95 +5d8f8 10 333 122 +5d908 14 3573 95 +5d91c 10 3573 95 +5d92c 14 3573 95 +5d940 10 156 132 +5d950 4 1144 87 +5d954 4 668 82 +5d958 8 3575 95 +5d960 14 3577 95 +5d974 4 1144 87 +5d978 4 670 82 +5d97c 8 668 82 +5d984 c 3577 95 +5d990 14 3577 95 +5d9a4 10 156 132 +5d9b4 4 1144 87 +5d9b8 4 660 82 +5d9bc 8 3579 95 +5d9c4 14 3580 95 +5d9d8 4 1144 87 +5d9dc 4 662 82 +5d9e0 8 660 82 +5d9e8 c 3580 95 +5d9f4 14 3580 95 +5da08 10 156 132 +5da18 14 3584 95 +5da2c 8 3584 95 +5da34 c 3584 95 +5da40 8 3584 95 +5da48 8 3584 95 +5da50 4 3591 95 +5da54 4 3584 95 +5da58 4 3590 95 +5da5c 14 3584 95 +5da70 10 156 132 +5da80 14 3586 95 +5da94 10 3586 95 +5daa4 14 3586 95 +5dab8 10 156 132 +5dac8 14 3587 95 +5dadc 10 3587 95 +5daec 14 3587 95 +5db00 10 156 132 +5db10 c 3588 95 +5db1c c 3588 95 +5db28 8 156 132 +5db30 c 192 139 +5db3c c 3599 95 +5db48 c 333 122 +5db54 8 3601 95 +5db5c 18 192 139 +5db74 8 3591 95 +5db7c 10 3592 95 +5db8c 8 3593 95 +5db94 c 3594 95 +5dba0 14 333 122 +5dbb4 4 3598 95 +5dbb8 8 77 81 +5dbc0 c 3598 95 +5dbcc 10 3599 95 +5dbdc 10 3599 95 +5dbec 8 156 132 +5dbf4 c 333 122 +5dc00 10 3601 95 +5dc10 10 3328 95 +5dc20 c 3601 95 +5dc2c c 333 122 +5dc38 10 156 132 +5dc48 10 3603 95 +5dc58 10 3603 95 +5dc68 8 156 132 +5dc70 c 3604 95 +5dc7c c 3604 95 +5dc88 8 156 132 +5dc90 10 333 122 +5dca0 18 156 132 +5dcb8 8 3591 95 +5dcc0 4 333 122 +5dcc4 4 3609 95 +5dcc8 18 333 122 +5dce0 8 156 132 +5dce8 28 3613 95 +FUNC 5dd10 2e4 0 testing::internal::XmlUnitTestResultPrinter::PrintXmlTestCase +5dd10 10 3617 95 +5dd20 8 3618 95 +5dd28 8 3617 95 +5dd30 4 3618 95 +5dd34 4 3617 95 +5dd38 c 3618 95 +5dd44 4 3617 95 +5dd48 4 3620 95 +5dd4c 4 3618 95 +5dd50 4 3620 95 +5dd54 c 333 122 +5dd60 4 3620 95 +5dd64 4 333 122 +5dd68 c 3619 95 +5dd74 14 3620 95 +5dd88 10 3620 95 +5dd98 14 3620 95 +5ddac 10 156 132 +5ddbc 14 3622 95 +5ddd0 8 3622 95 +5ddd8 4 3622 95 +5dddc c 3622 95 +5dde8 14 3622 95 +5ddfc 10 156 132 +5de0c 14 3624 95 +5de20 8 3624 95 +5de28 4 3624 95 +5de2c c 3624 95 +5de38 14 3624 95 +5de4c 10 156 132 +5de5c 14 3627 95 +5de70 8 3627 95 +5de78 4 3627 95 +5de7c c 3627 95 +5de88 14 3627 95 +5de9c 10 156 132 +5deac 14 3628 95 +5dec0 14 3628 95 +5ded4 14 3628 95 +5dee8 10 156 132 +5def8 14 3630 95 +5df0c c 3630 95 +5df18 14 3630 95 +5df2c 4 156 132 +5df30 4 333 122 +5df34 c 156 132 +5df40 c 3631 95 +5df4c c 3631 95 +5df58 8 333 122 +5df60 4 156 132 +5df64 4 3634 95 +5df68 4 156 132 +5df6c 10 192 139 +5df7c 8 3634 95 +5df84 18 3635 95 +5df9c c 3636 95 +5dfa8 8 3634 95 +5dfb0 10 333 122 +5dfc0 c 3638 95 +5dfcc 8 333 122 +5dfd4 8 156 132 +5dfdc 18 3639 95 +FUNC 5dff4 3ac 0 testing::internal::XmlUnitTestResultPrinter::PrintXmlUnitTest +5dff4 10 3643 95 +5e004 8 3644 95 +5e00c 8 3643 95 +5e014 4 3644 95 +5e018 4 3643 95 +5e01c c 3644 95 +5e028 4 3643 95 +5e02c 4 3650 95 +5e030 4 3644 95 +5e034 4 3650 95 +5e038 c 333 122 +5e044 4 3650 95 +5e048 14 333 122 +5e05c c 3647 95 +5e068 14 3650 95 +5e07c 8 3650 95 +5e084 4 3650 95 +5e088 c 3650 95 +5e094 14 3650 95 +5e0a8 10 156 132 +5e0b8 14 3652 95 +5e0cc 8 3652 95 +5e0d4 4 3652 95 +5e0d8 c 3652 95 +5e0e4 14 3652 95 +5e0f8 10 156 132 +5e108 14 3655 95 +5e11c 8 3655 95 +5e124 4 3655 95 +5e128 c 3655 95 +5e134 14 3655 95 +5e148 10 156 132 +5e158 14 3656 95 +5e16c 14 3656 95 +5e180 14 3656 95 +5e194 10 156 132 +5e1a4 14 3659 95 +5e1b8 4 570 91 +5e1bc c 3659 95 +5e1c8 14 3659 95 +5e1dc 10 156 132 +5e1ec 14 3661 95 +5e200 4 573 91 +5e204 c 3661 95 +5e210 14 3661 95 +5e224 10 156 132 +5e234 c 3663 95 +5e240 14 3665 95 +5e254 4 798 91 +5e258 4 3665 95 +5e25c 8 3665 95 +5e264 8 3665 95 +5e26c 14 3665 95 +5e280 10 156 132 +5e290 4 606 91 +5e294 c 3668 95 +5e2a0 c 3668 95 +5e2ac 8 156 132 +5e2b4 14 3670 95 +5e2c8 14 3670 95 +5e2dc 14 3670 95 +5e2f0 4 156 132 +5e2f4 4 3673 95 +5e2f8 8 156 132 +5e300 4 333 122 +5e304 4 156 132 +5e308 c 333 122 +5e314 8 3673 95 +5e31c 8 3673 95 +5e324 c 3674 95 +5e330 4 3674 95 +5e334 8 3674 95 +5e33c 10 3675 95 +5e34c 8 3675 95 +5e354 8 3673 95 +5e35c 10 333 122 +5e36c c 3677 95 +5e378 8 333 122 +5e380 8 156 132 +5e388 18 3678 95 +FUNC 5e3a0 108 0 testing::internal::XmlUnitTestResultPrinter::OnTestIterationEnd +5e3a0 14 3383 95 +5e3b4 8 3385 95 +5e3bc 4 3383 95 +5e3c0 4 3385 95 +5e3c4 4 3383 95 +5e3c8 4 3385 95 +5e3cc 10 3386 95 +5e3dc 10 3388 95 +5e3ec 20 3404 95 +5e40c 8 3405 95 +5e414 8 3406 95 +5e41c 14 2298 87 +5e430 4 3391 95 +5e434 c 3408 95 +5e440 4 3410 95 +5e444 4 3408 95 +5e448 c 3409 95 +5e454 c 3410 95 +5e460 c 3410 95 +5e46c 8 156 132 +5e474 8 3411 95 +5e47c 8 3408 95 +5e484 10 156 132 +5e494 14 3412 95 +FUNC 5e4a8 c0 0 std::priv::__put_num, long long int> +5e4a8 10 194 121 +5e4b8 8 194 121 +5e4c0 10 181 122 +5e4d0 4 199 121 +5e4d4 18 211 121 +5e4ec 4 202 121 +5e4f0 4 145 110 +5e4f4 4 202 121 +5e4f8 4 145 110 +5e4fc 4 202 121 +5e500 8 145 110 +5e508 8 202 121 +5e510 4 78 120 +5e514 4 202 121 +5e518 8 78 120 +5e520 c 202 121 +5e52c 4 78 120 +5e530 4 57 123 +5e534 c 78 120 +5e540 8 202 121 +5e548 4 210 121 +5e54c 8 212 121 +5e554 14 213 121 +FUNC 5e568 5c 0 testing::internal::StreamableToString +5e568 c 243 79 +5e574 4 244 79 +5e578 4 243 79 +5e57c 4 243 79 +5e580 4 244 79 +5e584 4 243 79 +5e588 4 244 79 +5e58c 10 268 121 +5e59c c 244 79 +5e5a8 8 85 79 +5e5b0 14 245 79 +FUNC 5e5c4 d4 0 testing::internal::PrettyUnitTestResultPrinter::OnTestEnd +5e5c4 c 3080 95 +5e5d0 4 700 82 +5e5d4 4 3080 95 +5e5d8 c 540 82 +5e5e4 4 3081 95 +5e5e8 10 3082 95 +5e5f8 10 3084 95 +5e608 14 2983 95 +5e61c c 3087 95 +5e628 4 3087 95 +5e62c 8 3088 95 +5e634 c 3090 95 +5e640 4 3092 95 +5e644 4 3092 95 +5e648 4 3092 95 +5e64c c 3092 95 +5e658 10 3092 95 +5e668 c 156 132 +5e674 8 3094 95 +5e67c 10 3096 95 +5e68c c 3097 95 +FUNC 5e698 23c 0 testing::internal::PrettyUnitTestResultPrinter::OnTestIterationEnd +5e698 4 3144 95 +5e69c 4 3145 95 +5e6a0 c 3144 95 +5e6ac 8 3145 95 +5e6b4 4 2777 95 +5e6b8 8 3144 95 +5e6c0 4 3145 95 +5e6c4 4 2772 95 +5e6c8 4 3148 95 +5e6cc 8 2772 95 +5e6d4 4 3148 95 +5e6d8 14 2772 95 +5e6ec 8 3148 95 +5e6f4 18 2777 95 +5e70c 14 3148 95 +5e720 10 156 132 +5e730 c 3149 95 +5e73c 4 573 91 +5e740 4 3151 95 +5e744 8 3151 95 +5e74c 8 3151 95 +5e754 10 3151 95 +5e764 8 156 132 +5e76c 4 3153 95 +5e770 8 2772 95 +5e778 4 3153 95 +5e77c 10 3154 95 +5e78c 8 3155 95 +5e794 10 2772 95 +5e7a4 10 3155 95 +5e7b4 8 156 132 +5e7bc c 3157 95 +5e7c8 10 3158 95 +5e7d8 c 3159 95 +5e7e4 10 3160 95 +5e7f4 14 2772 95 +5e808 10 3161 95 +5e818 8 156 132 +5e820 8 3162 95 +5e828 8 3164 95 +5e830 c 3164 95 +5e83c 8 3164 95 +5e844 10 3164 95 +5e854 c 3167 95 +5e860 4 3168 95 +5e864 c 3168 95 +5e870 4 3169 95 +5e874 10 3170 95 +5e884 8 3175 95 +5e88c c 3175 95 +5e898 8 3175 95 +5e8a0 10 3175 95 +5e8b0 10 3178 95 +5e8c0 14 3179 95 +FUNC 5e8d4 bc 0 testing::internal::PrettyUnitTestResultPrinter::OnTestCaseEnd +5e8d4 4 3100 95 +5e8d8 8 3099 95 +5e8e0 4 3100 95 +5e8e4 4 3099 95 +5e8e8 4 3100 95 +5e8ec 8 3103 95 +5e8f4 4 3103 95 +5e8f8 4 3103 95 +5e8fc 18 3103 95 +5e914 14 3104 95 +5e928 4 3107 95 +5e92c c 3107 95 +5e938 4 3107 95 +5e93c 10 3107 95 +5e94c 18 3107 95 +5e964 8 156 132 +5e96c 10 3108 95 +5e97c 8 156 132 +5e984 c 3109 95 +FUNC 5e990 11c 0 testing::internal::StreamingListener::OnTestEnd +5e990 c 1156 91 +5e99c 4 700 82 +5e9a0 8 1156 91 +5e9a8 4 540 82 +5e9ac 8 1156 91 +5e9b4 8 540 82 +5e9bc 4 1180 91 +5e9c0 c 1180 91 +5e9cc 8 1180 91 +5e9d4 10 1180 91 +5e9e4 4 1157 91 +5e9e8 4 1158 91 +5e9ec 4 1180 91 +5e9f0 4 1159 91 +5e9f4 14 1157 91 +5ea08 14 1158 91 +5ea1c 18 1159 91 +5ea34 10 1159 91 +5ea44 14 1160 91 +5ea58 c 1160 91 +5ea64 30 156 132 +5ea94 18 1161 91 +FUNC 5eaac 11c 0 testing::internal::StreamingListener::OnTestCaseEnd +5eaac 10 1146 91 +5eabc 4 830 82 +5eac0 c 1146 91 +5eacc 4 1146 91 +5ead0 4 830 82 +5ead4 8 1180 91 +5eadc c 1180 91 +5eae8 8 1180 91 +5eaf0 10 1180 91 +5eb00 4 1147 91 +5eb04 4 1148 91 +5eb08 4 1180 91 +5eb0c 4 1148 91 +5eb10 14 1147 91 +5eb24 1c 1148 91 +5eb40 8 1148 91 +5eb48 4 1148 91 +5eb4c 4 1148 91 +5eb50 10 1148 91 +5eb60 14 1149 91 +5eb74 c 1149 91 +5eb80 30 156 132 +5ebb0 18 1150 91 +FUNC 5ebc8 124 0 testing::internal::StreamingListener::OnTestIterationEnd +5ebc8 10 1136 91 +5ebd8 4 1137 91 +5ebdc c 1136 91 +5ebe8 4 1136 91 +5ebec 8 1137 91 +5ebf4 4 1180 91 +5ebf8 c 1180 91 +5ec04 8 1180 91 +5ec0c 10 1180 91 +5ec1c 4 1137 91 +5ec20 4 1138 91 +5ec24 4 1180 91 +5ec28 4 1138 91 +5ec2c 14 1137 91 +5ec40 14 1138 91 +5ec54 4 573 91 +5ec58 4 1138 91 +5ec5c 8 1138 91 +5ec64 8 1138 91 +5ec6c 8 1138 91 +5ec74 10 1138 91 +5ec84 14 1139 91 +5ec98 c 1139 91 +5eca4 30 156 132 +5ecd4 18 1140 91 +FUNC 5ecec 1a0 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +5ecec 18 81 138 +5ed04 8 81 138 +5ed0c c 192 139 +5ed18 4 173 139 +5ed1c 4 192 139 +5ed20 c 173 139 +5ed2c 14 41 138 +5ed40 4 175 139 +5ed44 10 176 139 +5ed54 4 177 139 +5ed58 10 87 138 +5ed68 8 551 101 +5ed70 8 91 138 +5ed78 14 86 137 +5ed8c 8 86 137 +5ed94 8 139 103 +5ed9c 8 139 103 +5eda4 14 86 137 +5edb8 10 93 138 +5edc8 4 119 103 +5edcc 8 119 103 +5edd4 8 95 138 +5eddc 8 314 137 +5ede4 4 249 137 +5ede8 8 249 137 +5edf0 4 139 103 +5edf4 8 139 103 +5edfc c 249 137 +5ee08 4 98 138 +5ee0c 14 86 137 +5ee20 8 86 137 +5ee28 8 139 103 +5ee30 8 139 103 +5ee38 1c 86 137 +5ee54 8 662 139 +5ee5c 4 319 101 +5ee60 4 323 101 +5ee64 4 104 138 +5ee68 4 666 139 +5ee6c 4 667 139 +5ee70 4 104 138 +5ee74 4 105 138 +5ee78 4 668 139 +5ee7c 10 105 138 +FUNC 5ee90 63c 0 testing::internal::edit_distance::CalculateOptimalEdits +5ee90 28 990 95 +5eeb8 4 70 139 +5eebc 4 990 95 +5eec0 8 192 139 +5eec8 4 70 139 +5eecc 10 192 139 +5eedc 4 481 101 +5eee0 4 992 95 +5eee4 8 192 139 +5eeec 4 342 101 +5eef0 4 992 95 +5eef4 8 342 101 +5eefc c 343 101 +5ef08 8 343 101 +5ef10 4 356 101 +5ef14 4 346 101 +5ef18 8 347 101 +5ef20 4 348 101 +5ef24 8 352 101 +5ef2c 4 146 103 +5ef30 4 73 139 +5ef34 4 71 139 +5ef38 4 249 137 +5ef3c 4 73 139 +5ef40 4 249 137 +5ef44 8 314 137 +5ef4c 8 249 137 +5ef54 c 146 103 +5ef60 4 342 101 +5ef64 4 244 139 +5ef68 c 342 101 +5ef74 4 346 101 +5ef78 10 347 101 +5ef88 8 348 101 +5ef90 c 352 101 +5ef9c 4 346 101 +5efa0 4 356 101 +5efa4 4 73 139 +5efa8 4 342 101 +5efac 4 314 137 +5efb0 4 73 139 +5efb4 8 249 137 +5efbc 4 314 137 +5efc0 4 348 101 +5efc4 4 249 137 +5efc8 4 73 139 +5efcc 8 249 137 +5efd4 8 249 137 +5efdc 4 139 103 +5efe0 8 192 139 +5efe8 4 70 139 +5efec 4 192 139 +5eff0 4 70 139 +5eff4 4 192 139 +5eff8 4 481 101 +5effc 8 342 101 +5f004 4 356 101 +5f008 4 346 101 +5f00c 4 348 101 +5f010 4 347 101 +5f014 4 348 101 +5f018 4 353 101 +5f01c 8 352 101 +5f024 4 71 139 +5f028 4 73 139 +5f02c 4 72 139 +5f030 4 73 139 +5f034 c 120 137 +5f040 4 249 139 +5f044 c 249 137 +5f050 c 304 139 +5f05c 4 70 139 +5f060 8 192 139 +5f068 4 70 139 +5f06c 10 192 139 +5f07c 4 481 101 +5f080 4 994 95 +5f084 4 192 139 +5f088 4 551 101 +5f08c 4 192 139 +5f090 8 994 95 +5f098 4 551 101 +5f09c 4 314 137 +5f0a0 4 551 101 +5f0a4 4 71 139 +5f0a8 4 73 139 +5f0ac 4 314 137 +5f0b0 8 73 139 +5f0b8 4 249 137 +5f0bc 8 249 137 +5f0c4 4 139 103 +5f0c8 4 139 103 +5f0cc c 249 137 +5f0d8 4 342 101 +5f0dc 4 244 139 +5f0e0 c 342 101 +5f0ec 4 346 101 +5f0f0 c 347 101 +5f0fc c 348 101 +5f108 c 352 101 +5f114 4 346 101 +5f118 4 356 101 +5f11c 8 73 139 +5f124 4 314 137 +5f128 4 73 139 +5f12c 8 249 137 +5f134 4 314 137 +5f138 8 249 137 +5f140 8 249 137 +5f148 4 139 103 +5f14c 18 192 139 +5f164 4 70 139 +5f168 4 551 101 +5f16c 4 70 139 +5f170 4 481 101 +5f174 8 551 101 +5f17c 4 71 139 +5f180 8 72 139 +5f188 c 73 139 +5f194 18 86 137 +5f1ac 8 86 137 +5f1b4 8 139 103 +5f1bc 8 139 103 +5f1c4 18 86 137 +5f1dc 4 249 139 +5f1e0 c 249 137 +5f1ec c 42 143 +5f1f8 8 997 95 +5f200 4 999 95 +5f204 c 997 95 +5f210 4 998 95 +5f214 8 997 95 +5f21c 8 998 95 +5f224 c 999 95 +5f230 4 1004 95 +5f234 c 192 139 +5f240 8 1002 95 +5f248 8 1003 95 +5f250 4 202 139 +5f254 4 1004 95 +5f258 8 1002 95 +5f260 c 1028 95 +5f26c 4 1002 95 +5f270 4 1029 95 +5f274 4 1024 95 +5f278 4 1023 95 +5f27c 4 1021 95 +5f280 c 192 139 +5f28c 14 1007 95 +5f2a0 c 192 139 +5f2ac 8 1008 95 +5f2b4 1c 1009 95 +5f2d0 10 1011 95 +5f2e0 8 1012 95 +5f2e8 c 1013 95 +5f2f4 4 1017 95 +5f2f8 4 1016 95 +5f2fc 4 1018 95 +5f300 10 1019 95 +5f310 8 1020 95 +5f318 c 1021 95 +5f324 10 1022 95 +5f334 8 1023 95 +5f33c c 1024 95 +5f348 8 1028 95 +5f350 8 1029 95 +5f358 c 1008 95 +5f364 10 1007 95 +5f374 c 67 139 +5f380 4 162 139 +5f384 4 481 101 +5f388 20 192 139 +5f3a8 c 1036 95 +5f3b4 8 380 139 +5f3bc 4 1037 95 +5f3c0 4 380 139 +5f3c4 8 1037 95 +5f3cc 4 380 139 +5f3d0 4 119 103 +5f3d4 4 119 103 +5f3d8 10 382 139 +5f3e8 20 162 139 +5f408 c 1039 95 +5f414 8 1040 95 +5f41c 4 1039 95 +5f420 10 1040 95 +5f430 8 324 98 +5f438 4 92 100 +5f43c 4 91 100 +5f440 4 92 100 +5f444 c 93 100 +5f450 c 191 103 +5f45c 10 42 143 +5f46c 4 87 139 +5f470 10 323 101 +5f480 c 191 103 +5f48c 10 304 139 +5f49c c 323 101 +5f4a8 24 1044 95 +FUNC 5f4d8 60 0 std::priv::_Impl_vector >::push_back +5f4d8 10 376 139 +5f4e8 4 376 139 +5f4ec 10 380 139 +5f4fc 4 119 103 +5f500 8 119 103 +5f508 10 382 139 +5f518 14 162 139 +5f52c c 388 139 +FUNC 5f538 58 0 testing::internal::DefaultGlobalTestPartResultReporter::ReportTestPartResult +5f538 c 672 95 +5f544 8 672 95 +5f54c 4 673 95 +5f550 4 4872 95 +5f554 4 4872 95 +5f558 c 4872 95 +5f564 8 173 143 +5f56c 8 3871 95 +5f574 4 674 95 +5f578 c 674 95 +5f584 c 675 95 +FUNC 5f590 244 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +5f590 20 81 138 +5f5b0 8 192 139 +5f5b8 4 81 138 +5f5bc 4 192 139 +5f5c0 4 81 138 +5f5c4 4 192 139 +5f5c8 8 173 139 +5f5d0 c 81 138 +5f5dc 4 173 139 +5f5e0 4 81 138 +5f5e4 4 173 139 +5f5e8 14 41 138 +5f5fc 4 175 139 +5f600 10 176 139 +5f610 4 356 101 +5f614 8 346 101 +5f61c 4 177 139 +5f620 c 347 101 +5f62c 4 348 101 +5f630 4 352 101 +5f634 4 348 101 +5f638 4 352 101 +5f63c 4 91 138 +5f640 4 84 137 +5f644 10 86 137 +5f654 8 86 137 +5f65c 4 139 103 +5f660 1c 466 91 +5f67c 4 89 137 +5f680 14 86 137 +5f694 c 93 138 +5f6a0 4 119 103 +5f6a4 1c 466 91 +5f6c0 8 95 138 +5f6c8 8 314 137 +5f6d0 4 249 137 +5f6d4 4 466 91 +5f6d8 8 249 137 +5f6e0 4 139 103 +5f6e4 1c 466 91 +5f700 c 249 137 +5f70c 8 98 138 +5f714 c 86 137 +5f720 4 84 137 +5f724 8 86 137 +5f72c 8 86 137 +5f734 4 139 103 +5f738 1c 466 91 +5f754 4 89 137 +5f758 20 86 137 +5f778 8 191 103 +5f780 10 156 132 +5f790 c 662 139 +5f79c 4 319 101 +5f7a0 4 323 101 +5f7a4 4 104 138 +5f7a8 4 666 139 +5f7ac 4 667 139 +5f7b0 4 668 139 +5f7b4 20 105 138 +FUNC 5f7d4 98 0 testing::UnitTest::PushGTestTrace +5f7d4 c 4263 95 +5f7e0 4 4263 95 +5f7e4 4 4264 95 +5f7e8 4 4263 95 +5f7ec 8 1963 87 +5f7f4 4 752 91 +5f7f8 8 2010 87 +5f800 8 380 139 +5f808 4 2010 87 +5f80c c 380 139 +5f818 4 119 103 +5f81c 1c 466 91 +5f838 10 382 139 +5f848 10 162 139 +5f858 8 4265 95 +5f860 c 4266 95 +FUNC 5f86c 88 0 testing::internal::ScopedTrace::ScopedTrace +5f86c c 3769 95 +5f878 8 466 91 +5f880 4 3769 95 +5f884 4 466 91 +5f888 4 3769 95 +5f88c 4 466 91 +5f890 8 3769 95 +5f898 8 466 91 +5f8a0 4 3772 95 +5f8a4 8 3774 95 +5f8ac 4 3773 95 +5f8b0 4 3774 95 +5f8b4 4 3773 95 +5f8b8 4 3774 95 +5f8bc c 3774 95 +5f8c8 8 156 132 +5f8d0 4 3776 95 +5f8d4 8 3776 95 +5f8dc 8 156 132 +5f8e4 10 3777 95 +FUNC 5f8f4 148 0 std::priv::_Impl_vector >::_M_fill_insert_aux +5f8f4 18 140 138 +5f90c c 140 138 +5f918 4 416 139 +5f91c 8 140 138 +5f924 8 416 139 +5f92c 8 416 139 +5f934 8 150 138 +5f93c 8 152 138 +5f944 4 153 138 +5f948 4 120 137 +5f94c 4 153 138 +5f950 c 120 137 +5f95c 4 154 138 +5f960 4 255 100 +5f964 4 256 100 +5f968 8 154 138 +5f970 4 256 100 +5f974 c 256 100 +5f980 c 442 100 +5f98c 8 442 100 +5f994 10 443 100 +5f9a4 4 158 138 +5f9a8 4 249 137 +5f9ac 8 314 137 +5f9b4 8 249 137 +5f9bc c 249 137 +5f9c8 c 146 103 +5f9d4 4 158 138 +5f9d8 c 120 137 +5f9e4 14 160 138 +5f9f8 8 442 100 +5fa00 10 443 100 +5fa10 c 146 138 +5fa1c 8 147 138 +5fa24 18 163 138 +FUNC 5fa3c 1a4 0 testing::internal::UnitTestImpl::GetTestCase +5fa3c 1c 4452 95 +5fa58 4 4456 95 +5fa5c c 4452 95 +5fa68 c 4456 95 +5fa74 8 4452 95 +5fa7c 4 4426 95 +5fa80 4 4452 95 +5fa84 4 4456 95 +5fa88 4 4422 95 +5fa8c c 4426 95 +5fa98 c 4422 95 +5faa4 18 217 99 +5fabc 18 156 132 +5fad4 10 4458 95 +5fae4 8 4459 95 +5faec 10 4463 95 +5fafc 14 4463 95 +5fb10 4 4463 95 +5fb14 10 4467 95 +5fb24 14 4466 95 +5fb38 c 156 132 +5fb44 4 4466 95 +5fb48 4 4472 95 +5fb4c 4 4474 95 +5fb50 8 4472 95 +5fb58 4 4474 95 +5fb5c 14 172 138 +5fb70 14 173 138 +5fb84 14 176 138 +5fb98 8 173 143 +5fba0 14 192 139 +5fbb4 4 173 143 +5fbb8 4 4480 95 +5fbbc 4 173 143 +5fbc0 4 4481 95 +5fbc4 1c 4482 95 +FUNC 5fbe0 16c 0 testing::internal::MakeAndRegisterTestInfo +5fbe0 10 2508 95 +5fbf0 4 2511 95 +5fbf4 4 2511 95 +5fbf8 c 2508 95 +5fc04 8 2511 95 +5fc0c 4 2508 95 +5fc10 4 2511 95 +5fc14 10 2508 95 +5fc24 8 2508 95 +5fc2c 4 2511 95 +5fc30 10 2511 95 +5fc40 c 2511 95 +5fc4c 1c 2511 95 +5fc68 10 156 132 +5fc78 4 2512 95 +5fc7c 4 664 91 +5fc80 4 2512 95 +5fc84 c 664 91 +5fc90 8 665 91 +5fc98 c 74 84 +5fca4 8 156 132 +5fcac 10 666 91 +5fcbc 4 666 91 +5fcc0 4 333 122 +5fcc4 14 666 91 +5fcd8 24 333 122 +5fcfc 8 666 91 +5fd04 8 1144 87 +5fd0c 4 662 82 +5fd10 8 660 82 +5fd18 10 673 91 +5fd28 8 673 91 +5fd30 1c 2514 95 +FUNC 5fd4c dc 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, long unsigned int>, std::priv::_Select1st, std::allocator >, long unsigned int> >, std::priv::_MapTraitsT, std::allocator >, long unsigned int> >, std::allocator, std::allocator >, long unsigned int> > >::_M_insert +5fd4c 4 350 135 +5fd50 4 358 135 +5fd54 c 350 135 +5fd60 c 350 135 +5fd6c 4 358 135 +5fd70 c 359 135 +5fd7c 4 360 135 +5fd80 4 361 135 +5fd84 8 362 135 +5fd8c 4 364 135 +5fd90 4 364 135 +5fd94 14 79 106 +5fda8 8 364 135 +5fdb0 8 367 135 +5fdb8 4 368 135 +5fdbc 4 367 135 +5fdc0 c 369 135 +5fdcc 8 370 135 +5fdd4 8 373 135 +5fddc 4 374 135 +5fde0 4 373 135 +5fde4 c 375 135 +5fdf0 4 376 135 +5fdf4 8 379 135 +5fdfc 4 378 135 +5fe00 4 379 135 +5fe04 4 380 135 +5fe08 4 382 135 +5fe0c 8 380 135 +5fe14 4 142 136 +5fe18 10 382 135 +FUNC 5fe28 fc 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, long unsigned int>, std::priv::_Select1st, std::allocator >, long unsigned int> >, std::priv::_MapTraitsT, std::allocator >, long unsigned int> >, std::allocator, std::allocator >, long unsigned int> > >::insert_unique +5fe28 14 405 135 +5fe3c 4 405 135 +5fe40 4 406 135 +5fe44 4 405 135 +5fe48 4 407 135 +5fe4c 4 405 135 +5fe50 4 408 135 +5fe54 4 409 135 +5fe58 14 79 106 +5fe6c 8 412 135 +5fe74 8 412 135 +5fe7c 4 412 135 +5fe80 10 405 135 +5fe90 4 415 135 +5fe94 c 416 135 +5fea0 18 417 135 +5feb8 c 187 136 +5fec4 10 79 106 +5fed4 4 421 135 +5fed8 1c 422 135 +5fef4 8 142 136 +5fefc 8 62 124 +5ff04 4 142 136 +5ff08 4 62 124 +5ff0c 18 425 135 +FUNC 5ff24 2d4 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, long unsigned int>, std::priv::_Select1st, std::allocator >, long unsigned int> >, std::priv::_MapTraitsT, std::allocator >, long unsigned int> >, std::allocator, std::allocator >, long unsigned int> > >::insert_unique +5ff24 18 432 135 +5ff3c 8 432 135 +5ff44 10 434 135 +5ff54 4 437 135 +5ff58 4 438 135 +5ff5c 4 437 135 +5ff60 4 143 106 +5ff64 14 79 106 +5ff78 8 440 135 +5ff80 14 79 106 +5ff94 8 447 135 +5ff9c c 297 135 +5ffa8 10 94 136 +5ffb8 8 301 135 +5ffc0 c 302 135 +5ffcc c 304 135 +5ffd8 c 309 135 +5ffe4 8 458 135 +5ffec 14 462 135 +60000 18 79 106 +60018 8 468 135 +60020 4 469 135 +60024 c 470 135 +60030 8 469 135 +60038 c 309 135 +60044 4 513 135 +60048 10 475 135 +60058 c 142 136 +60064 8 479 135 +6006c 4 480 135 +60070 14 79 106 +60084 8 480 135 +6008c 18 483 135 +600a4 c 486 135 +600b0 8 187 136 +600b8 4 143 106 +600bc 8 187 136 +600c4 14 79 106 +600d8 8 494 135 +600e0 10 79 106 +600f0 c 494 135 +600fc 10 500 135 +6010c 8 497 135 +60114 c 498 135 +60120 8 522 135 +60128 1c 524 135 +60144 14 79 106 +60158 4 517 135 +6015c 8 142 136 +60164 c 297 135 +60170 10 94 136 +60180 8 301 135 +60188 c 302 135 +60194 c 304 135 +601a0 c 517 135 +601ac 10 79 106 +601bc 8 517 135 +601c4 4 521 135 +601c8 14 522 135 +601dc 1c 534 135 +FUNC 601f8 c8 0 std::map, std::allocator >, long unsigned int, std::less, std::allocator > >, std::allocator, std::allocator >, long unsigned int> > >::operator[], std::allocator > > +601f8 14 175 118 +6020c 8 175 118 +60214 8 568 136 +6021c 4 571 136 +60220 10 79 106 +60230 4 572 136 +60234 8 573 136 +6023c 14 575 136 +60250 4 178 118 +60254 4 571 136 +60258 4 178 118 +6025c 10 79 106 +6026c 4 178 118 +60270 14 62 124 +60284 10 191 118 +60294 4 142 136 +60298 4 191 118 +6029c 4 179 118 +602a0 8 156 132 +602a8 4 180 118 +602ac 14 181 118 +FUNC 602c0 1b4 0 testing::internal::edit_distance::CalculateOptimalEdits +602c0 10 1067 95 +602d0 4 173 143 +602d4 4 1067 95 +602d8 4 192 139 +602dc 4 173 143 +602e0 4 67 139 +602e4 10 1067 95 +602f4 4 263 136 +602f8 8 1067 95 +60300 4 67 139 +60304 4 481 101 +60308 4 1071 95 +6030c 4 67 139 +60310 4 192 139 +60314 8 67 139 +6031c 4 481 101 +60320 4 173 143 +60324 4 481 101 +60328 4 263 136 +6032c 4 266 136 +60330 4 267 136 +60334 4 391 136 +60338 14 192 139 +6034c 8 1071 95 +60354 4 203 139 +60358 c 543 136 +60364 8 1053 95 +6036c 8 1053 95 +60374 10 1055 95 +60384 8 173 143 +6038c 4 1072 95 +60390 4 1071 95 +60394 8 173 143 +6039c 14 192 139 +603b0 4 173 143 +603b4 14 192 139 +603c8 8 1074 95 +603d0 4 203 139 +603d4 c 543 136 +603e0 8 1053 95 +603e8 8 1053 95 +603f0 10 1055 95 +60400 8 173 143 +60408 4 1075 95 +6040c 4 1074 95 +60410 8 173 143 +60418 8 531 136 +60420 c 532 136 +6042c 14 1078 95 +60440 10 304 139 +60450 24 1079 95 +FUNC 60474 554 0 testing::internal::edit_distance::CreateUnifiedDiff +60474 30 1166 95 +604a4 8 1167 95 +604ac 10 1166 95 +604bc 4 1170 95 +604c0 4 1167 95 +604c4 8 1170 95 +604cc 4 1169 95 +604d0 4 1094 95 +604d4 4 1170 95 +604d8 4 1169 95 +604dc 4 333 122 +604e0 4 1169 95 +604e4 4 333 122 +604e8 4 306 101 +604ec 4 428 116 +604f0 4 333 122 +604f4 10 192 139 +60504 8 1171 95 +6050c 8 1173 95 +60514 4 1176 95 +60518 4 1174 95 +6051c 4 1173 95 +60520 4 1175 95 +60524 8 1173 95 +6052c 8 1094 95 +60534 4 212 116 +60538 14 1094 95 +6054c 4 1181 95 +60550 c 1094 95 +6055c 4 1181 95 +60560 4 1094 95 +60564 8 211 116 +6056c 4 212 116 +60570 8 211 116 +60578 4 212 116 +6057c 8 211 116 +60584 4 212 116 +60588 3c 1182 95 +605c4 8 428 116 +605cc 4 1182 95 +605d0 4 428 116 +605d4 c 192 139 +605e0 8 1189 95 +605e8 10 1190 95 +605f8 4 1192 95 +605fc 8 1193 95 +60604 c 1124 95 +60610 8 1193 95 +60618 8 1193 95 +60620 18 1194 95 +60638 4 1202 95 +6063c 4 1200 95 +60640 c 1202 95 +6064c c 1204 95 +60658 8 1204 95 +60660 20 1205 95 +60680 30 1097 95 +606b0 10 1104 95 +606c0 8 306 101 +606c8 c 307 101 +606d4 8 119 103 +606dc 10 68 124 +606ec 4 427 116 +606f0 4 429 116 +606f4 4 428 116 +606f8 4 430 116 +606fc 8 431 116 +60704 10 1108 95 +60714 8 306 101 +6071c c 307 101 +60728 8 119 103 +60730 10 68 124 +60740 4 427 116 +60744 4 429 116 +60748 4 428 116 +6074c 4 430 116 +60750 4 431 116 +60754 20 1207 95 +60774 10 1108 95 +60784 8 306 101 +6078c 8 307 101 +60794 8 119 103 +6079c 10 68 124 +607ac 4 427 116 +607b0 4 429 116 +607b4 4 428 116 +607b8 4 430 116 +607bc 4 431 116 +607c0 4 1212 95 +607c4 4 1189 95 +607c8 4 1212 95 +607cc 10 1213 95 +607dc 8 1124 95 +607e4 10 333 122 +607f4 8 1138 95 +607fc 10 333 122 +6080c 10 263 121 +6081c c 333 122 +60828 4 1139 95 +6082c 4 263 121 +60830 4 1139 95 +60834 8 263 121 +6083c 8 1141 95 +60844 8 1141 95 +6084c 10 333 122 +6085c 8 1144 95 +60864 14 333 122 +60878 10 263 121 +60888 c 333 122 +60894 4 1145 95 +60898 4 263 121 +6089c 4 1145 95 +608a0 8 263 121 +608a8 10 333 122 +608b8 8 208 116 +608c0 8 600 116 +608c8 8 602 116 +608d0 4 208 116 +608d4 8 600 116 +608dc c 602 116 +608e8 c 305 122 +608f4 10 333 122 +60904 8 1117 95 +6090c 8 305 122 +60914 8 1120 95 +6091c 4 305 122 +60920 1c 333 122 +6093c 8 91 116 +60944 34 205 116 +60978 c 75 127 +60984 8 1170 95 +6098c 8 42 143 +60994 34 1224 95 +FUNC 609c8 54 0 std::priv::_String_base >::_M_move_src +609c8 4 64 132 +609cc 8 129 132 +609d4 10 130 132 +609e4 8 131 132 +609ec 4 132 132 +609f0 10 131 132 +60a00 4 135 132 +60a04 8 136 132 +60a0c 8 137 132 +60a14 4 138 132 +60a18 4 140 132 +FUNC 60a1c d4 0 std::priv::_Impl_vector, std::allocator >, std::allocator, std::allocator > > >::_M_erase +60a1c 18 588 139 +60a34 10 588 139 +60a44 4 591 139 +60a48 4 589 139 +60a4c 10 591 139 +60a5c 8 156 132 +60a64 4 486 101 +60a68 4 147 132 +60a6c 4 486 101 +60a70 4 147 132 +60a74 8 591 139 +60a7c 8 147 132 +60a84 c 595 139 +60a90 4 156 132 +60a94 4 191 103 +60a98 4 156 132 +60a9c c 191 103 +60aa8 4 160 103 +60aac 4 486 101 +60ab0 4 147 132 +60ab4 4 486 101 +60ab8 8 147 132 +60ac0 8 602 139 +60ac8 8 602 139 +60ad0 4 608 139 +60ad4 1c 610 139 +FUNC 60af0 224 0 std::priv::_Impl_vector, std::allocator >, std::allocator, std::allocator > > >::_M_insert_overflow_aux +60af0 24 81 138 +60b14 4 81 138 +60b18 8 192 139 +60b20 8 81 138 +60b28 10 192 139 +60b38 14 173 139 +60b4c 10 41 138 +60b5c c 176 139 +60b68 4 175 139 +60b6c 10 176 139 +60b7c 4 356 101 +60b80 8 346 101 +60b88 8 177 139 +60b90 10 347 101 +60ba0 4 348 101 +60ba4 4 352 101 +60ba8 4 348 101 +60bac 4 352 101 +60bb0 4 91 138 +60bb4 18 428 137 +60bcc 8 428 137 +60bd4 4 160 103 +60bd8 4 486 101 +60bdc 4 147 132 +60be0 4 486 101 +60be4 10 147 132 +60bf4 8 430 137 +60bfc 14 428 137 +60c10 c 93 138 +60c1c 4 119 103 +60c20 c 119 103 +60c2c 8 95 138 +60c34 4 314 137 +60c38 4 249 137 +60c3c 4 314 137 +60c40 8 249 137 +60c48 8 249 137 +60c50 4 139 103 +60c54 c 139 103 +60c60 c 249 137 +60c6c 4 98 138 +60c70 1c 428 137 +60c8c 8 428 137 +60c94 4 160 103 +60c98 4 486 101 +60c9c 4 147 132 +60ca0 4 486 101 +60ca4 8 147 132 +60cac 8 430 137 +60cb4 1c 428 137 +60cd0 8 662 139 +60cd8 4 319 101 +60cdc 4 323 101 +60ce0 4 104 138 +60ce4 4 666 139 +60ce8 4 667 139 +60cec 8 104 138 +60cf4 4 668 139 +60cf8 1c 105 138 +FUNC 60d14 b4 0 std::priv::_Impl_vector, std::allocator >, std::allocator, std::allocator > > >::push_back +60d14 14 376 139 +60d28 4 376 139 +60d2c 10 380 139 +60d3c 4 119 103 +60d40 8 119 103 +60d48 10 382 139 +60d58 8 416 139 +60d60 10 416 139 +60d70 8 150 139 +60d78 1c 151 139 +60d94 c 156 132 +60da0 18 154 139 +60db8 10 388 139 +FUNC 60dc8 128 0 testing::internal::::SplitEscapedString +60dc8 4 1233 95 +60dcc 4 1235 95 +60dd0 14 1233 95 +60de4 4 1233 95 +60de8 4 67 139 +60dec 4 1233 95 +60df0 4 67 139 +60df4 8 481 101 +60dfc 8 400 131 +60e04 8 1236 95 +60e0c c 1236 95 +60e18 8 1236 95 +60e20 10 1238 95 +60e30 4 1241 95 +60e34 4 1240 95 +60e38 8 1023 131 +60e40 10 1241 95 +60e50 4 1244 95 +60e54 4 1242 95 +60e58 4 1244 95 +60e5c 4 1243 95 +60e60 8 1244 95 +60e68 14 1023 131 +60e7c c 173 143 +60e88 10 156 132 +60e98 8 1249 95 +60ea0 8 1243 95 +60ea8 18 1023 131 +60ec0 c 173 143 +60ecc 8 156 132 +60ed4 1c 1254 95 +FUNC 60ef0 22c 0 testing::internal::EqFailure +60ef0 c 1277 95 +60efc 4 1278 95 +60f00 4 1277 95 +60f04 4 1278 95 +60f08 18 1277 95 +60f20 8 1277 95 +60f28 4 1278 95 +60f2c 14 333 122 +60f40 c 1279 95 +60f4c 10 476 134 +60f5c 4 1280 95 +60f60 14 333 122 +60f74 10 131 79 +60f84 14 333 122 +60f98 c 1284 95 +60fa4 4 1285 95 +60fa8 14 333 122 +60fbc 10 476 134 +60fcc 4 1288 95 +60fd0 14 333 122 +60fe4 10 131 79 +60ff4 14 1292 95 +61008 10 1292 95 +61018 c 1294 95 +61024 4 1296 95 +61028 4 1294 95 +6102c c 1296 95 +61038 1c 192 139 +61054 8 1297 95 +6105c 14 192 139 +61070 8 1297 95 +61078 14 42 143 +6108c 14 333 122 +610a0 14 1299 95 +610b4 10 131 79 +610c4 c 156 132 +610d0 8 1303 95 +610d8 4 277 82 +610dc 4 1139 87 +610e0 8 1303 95 +610e8 8 1303 95 +610f0 8 256 82 +610f8 8 85 79 +61100 1c 1304 95 +FUNC 6111c b0 0 testing::internal::CmpHelperSTREQ +6111c 14 1451 95 +61130 8 1452 95 +61138 8 1451 95 +61140 c 1451 95 +6114c c 1452 95 +61158 4 277 82 +6115c 4 1139 87 +61160 8 277 82 +61168 c 1460 95 +61174 4 1460 95 +61178 4 1460 95 +6117c c 1460 95 +61188 1c 1460 95 +611a4 10 156 132 +611b4 18 1461 95 +FUNC 611cc f4 0 testing::InitGoogleTest +611cc 4 5248 95 +611d0 8 5281 95 +611d8 4 5248 95 +611dc 4 5281 95 +611e0 8 5248 95 +611e8 8 5281 95 +611f0 8 5251 95 +611f8 c 5253 95 +61204 18 5255 95 +6121c 10 5255 95 +6122c 1c 156 132 +61248 8 630 139 +61250 c 632 139 +6125c 4 5281 95 +61260 c 5260 95 +6126c 8 5261 95 +61274 8 5260 95 +6127c 4 5261 95 +61280 c 173 143 +6128c c 156 132 +61298 c 5236 95 +612a4 4 5267 95 +612a8 4 5267 95 +612ac 14 5283 95 +FUNC 612c0 4 0 testing::internal::DefaultDeathTestFactory::~DefaultDeathTestFactory +612c0 4 148 83 +FUNC 612c4 4 0 testing::internal::DefaultDeathTestFactory::~DefaultDeathTestFactory +612c4 4 148 83 +FUNC 612c8 1c 0 testing::internal::AlwaysFalse +612c8 8 692 85 +612d0 14 692 85 +FUNC 612e4 80 0 testing::internal::DeathTestAbort +612e4 c 251 89 +612f0 4 251 89 +612f4 4 937 91 +612f8 8 1144 87 +61300 4 257 89 +61304 14 2304 87 +61318 c 259 89 +61324 c 260 89 +61330 8 261 89 +61338 8 262 89 +61340 18 264 89 +61358 8 265 89 +61360 4 2340 87 +FUNC 61364 50 0 testing::internal::GetLastErrnoDescription +61364 c 304 89 +61370 4 304 89 +61374 c 305 89 +61380 4 305 89 +61384 c 2315 87 +61390 8 305 89 +61398 c 305 89 +613a4 10 306 89 +FUNC 613b4 54 0 testing::internal::DeathTest::DeathTest +613b4 10 335 89 +613c4 8 335 89 +613cc 4 937 91 +613d0 4 743 91 +613d4 8 337 89 +613dc 18 339 89 +613f4 8 339 89 +613fc c 341 89 +FUNC 61408 60 0 testing::internal::ForkingDeathTest::ForkingDeathTest +61408 c 792 89 +61414 c 792 89 +61420 10 371 89 +61430 4 794 89 +61434 4 371 89 +61438 4 794 89 +6143c 18 371 89 +61454 14 794 89 +FUNC 61468 e8 0 testing::internal::ParseNaturalNumber +61468 10 976 91 +61478 8 981 91 +61480 c 980 91 +6148c 8 2188 87 +61494 10 980 91 +614a4 c 983 91 +614b0 14 998 91 +614c4 c 1002 91 +614d0 c 1002 91 +614dc 10 1006 91 +614ec 1c 1006 91 +61508 14 333 122 +6151c 8 1006 91 +61524 4 1009 91 +61528 8 1009 91 +61530 8 1010 91 +61538 4 1013 91 +6153c 14 1014 91 +FUNC 61550 c8 0 testing::internal::DeathTest::set_last_death_test_message +61550 c 355 89 +6155c 8 348 131 +61564 4 355 89 +61568 10 348 131 +61578 8 400 131 +61580 4 243 130 +61584 4 400 131 +61588 8 244 130 +61590 4 168 140 +61594 10 168 140 +615a4 c 246 130 +615b0 8 803 131 +615b8 4 168 140 +615bc 4 806 131 +615c0 4 168 140 +615c4 10 806 131 +615d4 4 168 140 +615d8 8 168 140 +615e0 4 250 130 +615e4 4 357 89 +615e8 c 400 131 +615f4 8 250 130 +615fc 8 357 89 +61604 4 250 130 +61608 10 357 89 +FUNC 61618 104 0 testing::internal::FormatDeathTestOutput +61618 4 493 89 +6161c 4 124 132 +61620 18 493 89 +61638 4 493 89 +6163c 4 120 132 +61640 4 124 132 +61644 4 481 101 +61648 8 530 131 +61650 4 124 132 +61654 8 495 89 +6165c 10 530 131 +6166c 4 101 103 +61670 14 496 89 +61684 10 530 131 +61694 10 498 89 +616a4 14 1023 131 +616b8 4 503 89 +616bc 4 1023 131 +616c0 c 451 131 +616cc 8 156 132 +616d4 4 504 89 +616d8 14 1023 131 +616ec c 451 131 +616f8 8 156 132 +61700 1c 506 89 +FUNC 6171c 348 0 testing::internal::DeathTestImpl::Passed +6171c c 530 89 +61728 4 534 89 +6172c 4 530 89 +61730 4 534 89 +61734 8 530 89 +6173c 8 530 89 +61744 4 537 89 +61748 4 534 89 +6174c 8 537 89 +61754 20 333 122 +61774 4 150 79 +61778 24 333 122 +6179c 28 540 89 +617c4 3c 333 122 +61800 c 547 89 +6180c 14 131 79 +61820 14 333 122 +61834 4 554 89 +61838 4 555 89 +6183c 4 557 89 +61840 c 555 89 +6184c 4 556 89 +61850 38 333 122 +61888 4 150 79 +6188c 3c 333 122 +618c8 4 183 89 +618cc 20 333 122 +618ec 8 183 89 +618f4 8 191 89 +618fc 14 333 122 +61910 10 131 79 +61920 10 193 89 +61930 4 131 79 +61934 10 333 122 +61944 4 131 79 +61948 c 131 79 +61954 4 197 89 +61958 14 333 122 +6196c c 203 89 +61978 8 85 79 +61980 10 131 79 +61990 24 333 122 +619b4 c 566 89 +619c0 10 131 79 +619d0 14 156 132 +619e4 18 571 89 +619fc 14 333 122 +61a10 8 571 89 +61a18 4 536 89 +61a1c c 575 89 +61a28 8 575 89 +61a30 8 156 132 +61a38 8 85 79 +61a40 8 156 132 +61a48 1c 577 89 +FUNC 61a64 18 0 testing::internal::DeathTestImpl::Passed +61a64 4 531 89 +61a68 4 530 89 +61a6c 8 531 89 +61a74 8 577 89 +FUNC 61a7c 3c0 0 testing::internal::DeathTestImpl::ReadAndInterpretStatusByte +61a7c 18 425 89 +61a94 4 425 89 +61a98 14 2309 87 +61aac 4 435 89 +61ab0 4 2309 87 +61ab4 4 435 89 +61ab8 4 435 89 +61abc 10 435 89 +61acc 8 439 89 +61ad4 8 459 89 +61adc 4 333 122 +61ae0 10 459 89 +61af0 4 460 89 +61af4 4 459 89 +61af8 14 333 122 +61b0c 8 460 89 +61b14 c 460 89 +61b20 8 156 132 +61b28 8 459 89 +61b30 8 2314 87 +61b38 8 462 89 +61b40 4 462 89 +61b44 c 462 89 +61b50 14 462 89 +61b64 4 462 89 +61b68 4 462 89 +61b6c 10 462 89 +61b7c 4 462 89 +61b80 4 462 89 +61b84 10 462 89 +61b94 4 462 89 +61b98 4 462 89 +61b9c 10 462 89 +61bac 10 462 89 +61bbc c 462 89 +61bc8 4 462 89 +61bcc 4 462 89 +61bd0 10 462 89 +61be0 4 462 89 +61be4 4 462 89 +61be8 10 462 89 +61bf8 4 462 89 +61bfc 4 462 89 +61c00 14 462 89 +61c14 8 462 89 +61c1c 8 462 89 +61c24 4 462 89 +61c28 8 388 89 +61c30 18 464 89 +61c48 4 437 89 +61c4c 8 386 89 +61c54 28 440 89 +61c7c 1c 386 89 +61c98 4 313 89 +61c9c 4 2309 87 +61ca0 c 313 89 +61cac 10 2309 87 +61cbc 8 318 89 +61cc4 4 319 89 +61cc8 4 333 122 +61ccc 4 131 79 +61cd0 c 333 122 +61cdc 8 322 89 +61ce4 4 322 89 +61ce8 c 322 89 +61cf4 4 327 89 +61cf8 8 328 89 +61d00 4 333 122 +61d04 8 328 89 +61d0c 4 327 89 +61d10 8 328 89 +61d18 4 329 89 +61d1c 4 328 89 +61d20 14 333 122 +61d34 8 329 89 +61d3c 10 329 89 +61d4c c 333 122 +61d58 c 329 89 +61d64 c 333 122 +61d70 8 156 132 +61d78 8 328 89 +61d80 c 85 79 +61d8c 8 454 89 +61d94 4 333 122 +61d98 14 454 89 +61dac 24 333 122 +61dd0 c 254 121 +61ddc 10 333 122 +61dec 4 324 89 +61df0 18 325 89 +61e08 4 325 89 +61e0c 4 325 89 +61e10 c 325 89 +61e1c 10 325 89 +61e2c 8 156 132 +61e34 8 325 89 +FUNC 61e3c 13c 0 testing::internal::DeathTestImpl::Abort +61e3c 4 470 89 +61e40 4 476 89 +61e44 4 476 89 +61e48 8 470 89 +61e50 4 470 89 +61e54 4 476 89 +61e58 10 476 89 +61e68 8 476 89 +61e70 10 2312 87 +61e80 8 478 89 +61e88 4 478 89 +61e8c c 478 89 +61e98 14 478 89 +61eac 4 478 89 +61eb0 4 478 89 +61eb4 10 478 89 +61ec4 4 478 89 +61ec8 4 478 89 +61ecc 10 478 89 +61edc 4 478 89 +61ee0 4 478 89 +61ee4 10 478 89 +61ef4 10 478 89 +61f04 c 478 89 +61f10 4 478 89 +61f14 4 478 89 +61f18 10 478 89 +61f28 4 478 89 +61f2c 4 478 89 +61f30 10 478 89 +61f40 4 478 89 +61f44 4 478 89 +61f48 14 478 89 +61f5c 8 478 89 +61f64 8 478 89 +61f6c 4 478 89 +61f70 8 487 89 +FUNC 61f78 74 0 testing::internal::ForkingDeathTest::Wait +61f78 4 799 89 +61f7c 4 801 89 +61f80 8 799 89 +61f88 4 799 89 +61f8c 8 800 89 +61f94 4 806 89 +61f98 4 803 89 +61f9c 18 806 89 +61fb4 4 806 89 +61fb8 10 806 89 +61fc8 8 806 89 +61fd0 4 806 89 +61fd4 4 807 89 +61fd8 4 384 89 +61fdc 10 809 89 +FUNC 61fec 51c 0 testing::internal::NoExecDeathTest::AssumeRole +61fec 14 822 89 +62000 4 822 89 +62004 4 823 89 +62008 4 824 89 +6200c 4 823 89 +62010 4 824 89 +62014 18 825 89 +6202c 4 218 89 +62030 4 825 89 +62034 8 218 89 +6203c 58 333 122 +62094 4 221 89 +62098 18 333 122 +620b0 10 263 121 +620c0 14 333 122 +620d4 10 225 89 +620e4 8 85 79 +620ec 10 825 89 +620fc 8 156 132 +62104 8 825 89 +6210c 20 829 89 +6212c 14 829 89 +62140 4 829 89 +62144 4 829 89 +62148 10 829 89 +62158 4 829 89 +6215c 4 829 89 +62160 10 829 89 +62170 4 829 89 +62174 4 829 89 +62178 10 829 89 +62188 10 829 89 +62198 c 829 89 +621a4 4 829 89 +621a8 4 829 89 +621ac 10 829 89 +621bc 4 829 89 +621c0 4 829 89 +621c4 14 829 89 +621d8 8 829 89 +621e0 4 829 89 +621e4 1c 831 89 +62200 8 831 89 +62208 8 156 132 +62210 4 832 89 +62214 8 1294 87 +6221c 8 842 89 +62224 14 843 89 +62238 14 843 89 +6224c 4 843 89 +62250 4 843 89 +62254 10 843 89 +62264 4 843 89 +62268 4 843 89 +6226c 10 843 89 +6227c 4 843 89 +62280 4 843 89 +62284 10 843 89 +62294 10 843 89 +622a4 10 843 89 +622b4 14 843 89 +622c8 14 843 89 +622dc 8 843 89 +622e4 8 843 89 +622ec 4 843 89 +622f0 4 784 89 +622f4 4 845 89 +622f8 10 846 89 +62308 4 846 89 +6230c c 846 89 +62318 14 846 89 +6232c 4 846 89 +62330 4 846 89 +62334 10 846 89 +62344 4 846 89 +62348 4 846 89 +6234c 10 846 89 +6235c 4 846 89 +62360 4 846 89 +62364 10 846 89 +62374 10 846 89 +62384 c 846 89 +62390 4 846 89 +62394 4 846 89 +62398 14 846 89 +623ac 14 846 89 +623c0 8 846 89 +623c8 4 846 89 +623cc 8 390 89 +623d4 4 937 91 +623d8 4 599 91 +623dc 8 854 89 +623e4 c 855 89 +623f0 8 856 89 +623f8 10 858 89 +62408 4 858 89 +6240c c 858 89 +62418 14 858 89 +6242c 4 858 89 +62430 4 858 89 +62434 10 858 89 +62444 4 858 89 +62448 4 858 89 +6244c 10 858 89 +6245c 4 858 89 +62460 4 858 89 +62464 10 858 89 +62474 10 858 89 +62484 c 858 89 +62490 4 858 89 +62494 4 858 89 +62498 14 858 89 +624ac 14 858 89 +624c0 14 858 89 +624d4 8 858 89 +624dc 4 858 89 +624e0 8 388 89 +624e8 8 382 89 +624f0 4 861 89 +624f4 14 863 89 +FUNC 62508 c0 0 testing::internal::DeathTestImpl::~DeathTestImpl +62508 4 374 89 +6250c 4 374 89 +62510 8 374 89 +62518 10 374 89 +62528 4 374 89 +6252c 4 374 89 +62530 10 374 89 +62540 4 374 89 +62544 4 374 89 +62548 10 374 89 +62558 4 374 89 +6255c 4 374 89 +62560 10 374 89 +62570 10 374 89 +62580 c 374 89 +6258c 4 374 89 +62590 4 374 89 +62594 10 374 89 +625a4 4 374 89 +625a8 4 374 89 +625ac 14 374 89 +625c0 8 374 89 +FUNC 625c8 50 0 testing::internal::DeathTestImpl::~DeathTestImpl +625c8 10 374 89 +625d8 c 374 89 +625e4 1c 374 89 +62600 8 374 89 +62608 4 374 89 +6260c c 374 89 +FUNC 62618 24 0 testing::internal::DeathTestImpl::~DeathTestImpl +62618 c 374 89 +62624 8 374 89 +6262c 4 374 89 +62630 8 374 89 +62638 4 374 89 +FUNC 6263c 10 0 testing::internal::ExecDeathTest::~ExecDeathTest +6263c 10 776 89 +FUNC 6264c 24 0 testing::internal::ExecDeathTest::~ExecDeathTest +6264c c 868 89 +62658 8 868 89 +62660 4 868 89 +62664 8 868 89 +6266c 4 868 89 +FUNC 62670 10 0 testing::internal::NoExecDeathTest::~NoExecDeathTest +62670 10 776 89 +FUNC 62680 24 0 testing::internal::NoExecDeathTest::~NoExecDeathTest +62680 c 813 89 +6268c 8 813 89 +62694 4 813 89 +62698 8 813 89 +626a0 4 813 89 +FUNC 626a4 24c 0 testing::internal::DefaultDeathTestFactory::Create +626a4 18 1157 89 +626bc 14 1157 89 +626d0 4 937 91 +626d4 4 1279 82 +626d8 4 1144 87 +626dc 4 743 91 +626e0 c 609 82 +626ec 8 1162 89 +626f4 8 1164 89 +626fc 8 1165 89 +62704 4 1167 89 +62708 4 1167 89 +6270c 4 1167 89 +62710 4 1168 89 +62714 4 1169 89 +62718 4 1169 89 +6271c 4 1167 89 +62720 14 1167 89 +62734 14 1168 89 +62748 8 1169 89 +62750 4 1169 89 +62754 4 1169 89 +62758 8 1169 89 +62760 10 1169 89 +62770 14 1169 89 +62784 8 1169 89 +6278c 2c 156 132 +627b8 4 1170 89 +627bc 4 156 132 +627c0 4 1170 89 +627c4 10 1173 89 +627d4 4 1174 89 +627d8 4 1173 89 +627dc 10 1174 89 +627ec 20 1189 89 +6280c c 1190 89 +62818 24 872 89 +6283c 18 1191 89 +62854 c 1192 89 +62860 18 816 89 +62878 8 1192 89 +62880 14 1199 89 +62894 4 1200 89 +62898 4 1199 89 +6289c 14 1200 89 +628b0 8 1200 89 +628b8 10 156 132 +628c8 4 1201 89 +628cc 4 1175 89 +628d0 4 1176 89 +628d4 1c 1205 89 +FUNC 628f0 4c 0 std::priv::_Impl_vector >::_M_fill_insert +628f0 c 166 138 +628fc 4 171 138 +62900 18 172 138 +62918 c 173 138 +62924 10 176 138 +62934 8 179 138 +FUNC 6293c 44 0 testing::internal::Arguments::AddArgument +6293c c 899 89 +62948 4 899 89 +6294c 4 900 89 +62950 4 2276 87 +62954 4 900 89 +62958 4 2276 87 +6295c 4 900 89 +62960 8 225 138 +62968 4 900 89 +6296c 8 225 138 +62974 c 901 89 +FUNC 62980 c0c 0 testing::internal::ExecDeathTest::AssumeRole +62980 34 1102 89 +629b4 4 937 91 +629b8 4 1279 82 +629bc 4 1144 87 +629c0 8 744 91 +629c8 18 1107 89 +629e0 4 1109 89 +629e4 c 1115 89 +629f0 c 390 89 +629fc 8 1111 89 +62a04 8 1115 89 +62a0c 4 1115 89 +62a10 1c 1115 89 +62a2c 14 1115 89 +62a40 4 1115 89 +62a44 4 1115 89 +62a48 10 1115 89 +62a58 4 1115 89 +62a5c 4 1115 89 +62a60 10 1115 89 +62a70 4 1115 89 +62a74 4 1115 89 +62a78 10 1115 89 +62a88 10 1115 89 +62a98 c 1115 89 +62aa4 4 1115 89 +62aa8 4 1115 89 +62aac 10 1115 89 +62abc 4 1115 89 +62ac0 4 1115 89 +62ac4 14 1115 89 +62ad8 8 1118 89 +62ae0 4 1118 89 +62ae4 28 1118 89 +62b0c 14 1118 89 +62b20 4 1118 89 +62b24 4 1118 89 +62b28 10 1118 89 +62b38 4 1118 89 +62b3c 4 1118 89 +62b40 10 1118 89 +62b50 4 1118 89 +62b54 4 1118 89 +62b58 10 1118 89 +62b68 10 1118 89 +62b78 c 1118 89 +62b84 4 1118 89 +62b88 4 1118 89 +62b8c 10 1118 89 +62b9c 4 1118 89 +62ba0 4 1118 89 +62ba4 14 1118 89 +62bb8 8 1118 89 +62bc0 1c 1121 89 +62bdc c 1121 89 +62be8 4 1121 89 +62bec 4 1121 89 +62bf0 c 1121 89 +62bfc c 1121 89 +62c08 4 1121 89 +62c0c 4 1122 89 +62c10 10 1121 89 +62c20 4 1122 89 +62c24 4 1121 89 +62c28 10 1121 89 +62c38 14 1122 89 +62c4c 14 1122 89 +62c60 1c 1122 89 +62c7c 30 156 132 +62cac c 1124 89 +62cb8 4 1124 89 +62cbc 8 1124 89 +62cc4 c 1124 89 +62cd0 4 1124 89 +62cd4 4 1124 89 +62cd8 14 1124 89 +62cec c 1124 89 +62cf8 4 1125 89 +62cfc c 1124 89 +62d08 1c 1125 89 +62d24 1c 1125 89 +62d40 10 1125 89 +62d50 10 1125 89 +62d60 14 1125 89 +62d74 c 1126 89 +62d80 10 1126 89 +62d90 14 1126 89 +62da4 10 1127 89 +62db4 18 1127 89 +62dcc 68 156 132 +62e34 4 67 139 +62e38 18 386 139 +62e50 4 67 139 +62e54 4 481 101 +62e58 4 890 89 +62e5c 4 386 139 +62e60 8 877 89 +62e68 c 192 139 +62e74 4 70 139 +62e78 4 192 139 +62e7c 4 70 139 +62e80 4 192 139 +62e84 4 481 101 +62e88 8 192 139 +62e90 10 342 101 +62ea0 c 343 101 +62eac 4 343 101 +62eb0 4 356 101 +62eb4 4 346 101 +62eb8 4 347 101 +62ebc 10 348 101 +62ecc 10 352 101 +62edc 4 73 139 +62ee0 4 71 139 +62ee4 4 72 139 +62ee8 4 84 137 +62eec c 73 139 +62ef8 18 86 137 +62f10 8 86 137 +62f18 4 139 103 +62f1c 34 139 103 +62f50 4 88 137 +62f54 4 89 137 +62f58 1c 86 137 +62f74 4 249 139 +62f78 c 905 89 +62f84 4 908 89 +62f88 4 2276 87 +62f8c 4 908 89 +62f90 4 2276 87 +62f94 4 908 89 +62f98 4 2276 87 +62f9c 4 908 89 +62fa0 14 225 138 +62fb4 c 905 89 +62fc0 8 42 143 +62fc8 10 1130 89 +62fd8 10 1131 89 +62fe8 14 1133 89 +62ffc 8 1133 89 +63004 8 156 132 +6300c 4 1135 89 +63010 10 1294 87 +63020 c 1140 89 +6302c c 1045 89 +63038 4 1046 89 +6303c c 1047 89 +63048 18 1048 89 +63060 4 1048 89 +63064 c 1048 89 +63070 14 1048 89 +63084 14 1048 89 +63098 14 1048 89 +630ac 4 1048 89 +630b0 4 1048 89 +630b4 4 1048 89 +630b8 8 1048 89 +630c0 10 1048 89 +630d0 14 1048 89 +630e4 14 1048 89 +630f8 8 1048 89 +63100 4 1048 89 +63104 c 1084 89 +63110 10 946 89 +63120 4 946 89 +63124 c 946 89 +63130 14 946 89 +63144 14 946 89 +63158 14 946 89 +6316c 4 946 89 +63170 4 946 89 +63174 4 946 89 +63178 8 946 89 +63180 10 946 89 +63190 14 946 89 +631a4 14 946 89 +631b8 8 946 89 +631c0 4 946 89 +631c4 4 952 89 +631c8 8 952 89 +631d0 8 954 89 +631d8 14 955 89 +631ec 10 955 89 +631fc 14 955 89 +63210 8 955 89 +63218 10 955 89 +63228 4 937 89 +6322c 8 965 89 +63234 4 937 89 +63238 c 965 89 +63244 14 966 89 +63258 14 966 89 +6326c 14 966 89 +63280 10 966 89 +63290 14 967 89 +632a4 8 967 89 +632ac 14 967 89 +632c0 8 1090 89 +632c8 4 1090 89 +632cc 18 1090 89 +632e4 4 1090 89 +632e8 c 1090 89 +632f4 14 1090 89 +63308 14 1090 89 +6331c 14 1090 89 +63330 4 1090 89 +63334 4 1090 89 +63338 4 1090 89 +6333c 8 1090 89 +63344 10 1090 89 +63354 14 1090 89 +63368 14 1090 89 +6337c 8 1094 89 +63384 4 1094 89 +63388 18 1094 89 +633a0 14 1094 89 +633b4 14 1094 89 +633c8 14 1094 89 +633dc 4 1094 89 +633e0 4 1094 89 +633e4 4 1094 89 +633e8 8 1094 89 +633f0 10 1094 89 +63400 14 1094 89 +63414 14 1094 89 +63428 14 1141 89 +6343c 4 1141 89 +63440 c 1141 89 +6344c 14 1141 89 +63460 14 1141 89 +63474 14 1141 89 +63488 8 1141 89 +63490 4 1141 89 +63494 4 1141 89 +63498 8 1141 89 +634a0 10 1141 89 +634b0 14 1141 89 +634c4 14 1141 89 +634d8 14 1141 89 +634ec 8 1141 89 +634f4 4 1141 89 +634f8 8 784 89 +63500 4 388 89 +63504 4 784 89 +63508 c 388 89 +63514 8 382 89 +6351c c 894 89 +63528 c 896 89 +63534 8 87 139 +6353c 4 88 139 +63540 8 323 101 +63548 10 156 132 +63558 4 1145 89 +6355c 30 1146 89 +FUNC 6358c 234 0 testing::internal::ParseInternalRunDeathTestFlag +6358c 4 1298 89 +63590 4 1299 89 +63594 8 1298 89 +6359c c 1299 89 +635a8 4 1298 89 +635ac 8 1299 89 +635b4 8 1298 89 +635bc c 1299 89 +635c8 4 1303 89 +635cc 8 1306 89 +635d4 4 1303 89 +635d8 4 1304 89 +635dc 8 1306 89 +635e4 8 67 139 +635ec 4 1213 89 +635f0 8 481 101 +635f8 8 1306 89 +63600 c 67 139 +6360c 4 481 101 +63610 c 1214 89 +6361c 14 1215 89 +63630 4 1216 89 +63634 c 1023 131 +63640 4 1216 89 +63644 c 1023 131 +63650 c 173 143 +6365c c 156 132 +63668 8 1023 131 +63670 4 1221 89 +63674 4 1023 131 +63678 c 173 143 +63684 c 156 132 +63690 4 91 100 +63694 8 92 100 +6369c 4 93 100 +636a0 4 92 100 +636a4 4 91 100 +636a8 4 93 100 +636ac 4 92 100 +636b0 4 91 100 +636b4 4 92 100 +636b8 4 93 100 +636bc 4 42 143 +636c0 4 92 100 +636c4 4 42 143 +636c8 8 156 132 +636d0 4 1307 89 +636d4 4 192 139 +636d8 4 1307 89 +636dc 14 192 139 +636f0 8 1332 89 +636f8 10 1330 89 +63708 4 1330 89 +6370c 14 1331 89 +63720 4 1331 89 +63724 1c 1332 89 +63740 8 1299 89 +63748 18 1334 89 +63760 c 1334 89 +6376c 10 1339 89 +6377c 4 241 83 +63780 c 1339 89 +6378c 4 241 83 +63790 4 42 143 +63794 c 241 83 +637a0 8 42 143 +637a8 18 1340 89 +FUNC 637c0 c 0 testing::internal::FilePath::FindLastPathSeparator +637c0 c 137 90 +FUNC 637cc 24 0 testing::internal::FilePath::FileOrDirectoryExists +637cc 8 209 90 +637d4 c 2272 87 +637e0 4 217 90 +637e4 c 219 90 +FUNC 637f0 38 0 testing::internal::FilePath::DirectoryExists +637f0 8 223 90 +637f8 c 2272 87 +63804 4 244 90 +63808 4 244 90 +6380c 8 2278 87 +63814 8 244 90 +6381c c 249 90 +FUNC 63828 14 0 testing::internal::FilePath::IsAbsolutePath +63828 4 274 90 +6382c 8 94 90 +63834 8 276 90 +FUNC 6383c 24 0 testing::internal::FilePath::IsDirectory +6383c 8 300 90 +63844 4 301 90 +63848 8 301 90 +63850 c 301 90 +6385c 4 303 90 +FUNC 63860 44 0 testing::internal::FilePath::CreateFolder +63860 4 325 90 +63864 4 334 90 +63868 8 325 90 +63870 4 325 90 +63874 8 334 90 +6387c 8 337 90 +63884 4 338 90 +63888 8 341 90 +63890 4 338 90 +63894 10 341 90 +FUNC 638a4 c0 0 testing::internal::FilePath::Normalize +638a4 10 356 90 +638b4 8 356 90 +638bc 4 357 90 +638c0 8 384 90 +638c8 4 358 90 +638cc 4 384 90 +638d0 8 358 90 +638d8 8 400 131 +638e0 c 362 90 +638ec c 400 131 +638f8 c 364 90 +63904 8 366 90 +6390c 4 367 90 +63910 4 366 90 +63914 c 368 90 +63920 8 369 90 +63928 c 376 90 +63934 8 377 90 +6393c 8 379 90 +63944 c 382 90 +63950 4 383 90 +63954 c 384 90 +63960 4 383 90 +FUNC 63964 90 0 testing::internal::FilePath::GetCurrentDir +63964 4 99 90 +63968 4 108 90 +6396c 4 99 90 +63970 4 108 90 +63974 c 99 90 +63980 4 108 90 +63984 4 99 90 +63988 4 108 90 +6398c 4 99 90 +63990 8 108 90 +63998 c 109 90 +639a4 4 116 90 +639a8 4 116 90 +639ac 8 116 90 +639b4 10 116 90 +639c4 c 116 90 +639d0 8 156 132 +639d8 1c 118 90 +FUNC 639f4 68 0 testing::internal::FilePath::RemoveDirectoryName +639f4 c 155 90 +63a00 8 155 90 +63a08 4 156 90 +63a0c 4 157 90 +63a10 4 156 90 +63a14 4 157 90 +63a18 14 157 90 +63a2c c 157 90 +63a38 c 156 132 +63a44 8 62 84 +63a4c 10 158 90 +FUNC 63a5c 78 0 testing::internal::FilePath::RemoveTrailingPathSeparator +63a5c c 346 90 +63a68 8 346 90 +63a70 8 347 90 +63a78 8 349 90 +63a80 4 400 131 +63a84 4 1023 131 +63a88 4 400 131 +63a8c 8 1023 131 +63a94 4 400 131 +63a98 c 1023 131 +63aa4 c 349 90 +63ab0 c 156 132 +63abc 8 62 84 +63ac4 10 350 90 +FUNC 63ad4 1ec 0 testing::internal::FilePath::ConcatPaths +63ad4 18 200 90 +63aec 8 200 90 +63af4 10 201 90 +63b04 c 62 84 +63b10 4 203 90 +63b14 4 120 132 +63b18 8 203 90 +63b20 4 120 132 +63b24 8 400 131 +63b2c 4 481 101 +63b30 4 400 131 +63b34 10 124 132 +63b44 4 107 134 +63b48 4 101 103 +63b4c 8 107 134 +63b54 c 74 132 +63b60 10 74 132 +63b70 c 74 132 +63b7c 8 535 131 +63b84 c 536 131 +63b90 4 356 101 +63b94 4 346 101 +63b98 4 347 101 +63b9c 8 158 101 +63ba4 8 134 119 +63bac 8 158 101 +63bb4 4 352 101 +63bb8 8 158 101 +63bc0 10 86 137 +63bd0 c 86 137 +63bdc 10 146 103 +63bec 8 174 130 +63bf4 8 175 130 +63bfc 4 101 103 +63c00 4 174 130 +63c04 4 160 132 +63c08 4 164 132 +63c0c 8 165 132 +63c14 4 232 140 +63c18 4 120 132 +63c1c 4 101 103 +63c20 8 232 140 +63c28 4 120 132 +63c2c 4 539 131 +63c30 4 400 131 +63c34 4 539 131 +63c38 4 400 131 +63c3c 4 539 131 +63c40 c 400 131 +63c4c 4 481 101 +63c50 4 400 131 +63c54 10 124 132 +63c64 4 39 134 +63c68 4 101 103 +63c6c 8 39 134 +63c74 c 40 134 +63c80 c 204 90 +63c8c 18 156 132 +63ca4 1c 205 90 +FUNC 63cc0 b4 0 testing::internal::FilePath::RemoveFileName +63cc0 10 166 90 +63cd0 4 120 132 +63cd4 8 166 90 +63cdc 4 167 90 +63ce0 4 124 132 +63ce4 4 167 90 +63ce8 4 124 132 +63cec 4 120 132 +63cf0 4 481 101 +63cf4 8 124 132 +63cfc 4 101 103 +63d00 8 169 90 +63d08 4 112 132 +63d0c 8 225 131 +63d14 4 112 132 +63d18 4 481 101 +63d1c 4 225 131 +63d20 10 349 131 +63d30 c 156 132 +63d3c 10 172 90 +63d4c c 174 90 +63d58 8 156 132 +63d60 14 175 90 +FUNC 63d74 a0 0 testing::internal::FilePath::CreateDirectoriesRecursively +63d74 10 308 90 +63d84 4 308 90 +63d88 c 309 90 +63d94 10 313 90 +63da4 c 313 90 +63db0 4 313 90 +63db4 c 317 90 +63dc0 4 317 90 +63dc4 4 317 90 +63dc8 c 317 90 +63dd4 8 156 132 +63ddc 10 318 90 +63dec c 318 90 +63df8 8 156 132 +63e00 14 319 90 +FUNC 63e14 224 0 testing::internal::FilePath::MakeFileName +63e14 c 186 90 +63e20 8 120 132 +63e28 10 186 90 +63e38 8 124 132 +63e40 8 186 90 +63e48 c 186 90 +63e54 4 120 132 +63e58 4 481 101 +63e5c 10 124 132 +63e6c 4 101 103 +63e70 4 188 90 +63e74 10 189 90 +63e84 10 189 90 +63e94 10 349 131 +63ea4 10 156 132 +63eb4 14 191 90 +63ec8 4 244 79 +63ecc 4 191 90 +63ed0 8 244 79 +63ed8 4 1142 87 +63edc 4 131 79 +63ee0 c 238 121 +63eec 4 239 121 +63ef0 8 239 121 +63ef8 4 239 121 +63efc 4 239 121 +63f00 8 240 121 +63f08 c 244 79 +63f14 8 1153 87 +63f1c 10 1154 87 +63f2c 8 1155 87 +63f34 c 1155 87 +63f40 4 400 131 +63f44 4 120 132 +63f48 4 400 131 +63f4c 4 124 132 +63f50 c 400 131 +63f5c 4 120 132 +63f60 4 400 131 +63f64 4 481 101 +63f68 4 35 134 +63f6c c 124 132 +63f78 4 39 134 +63f7c 4 101 103 +63f80 8 39 134 +63f88 c 40 134 +63f94 10 192 90 +63fa4 10 192 90 +63fb4 10 349 131 +63fc4 28 156 132 +63fec c 194 90 +63ff8 10 194 90 +64008 10 156 132 +64018 20 195 90 +FUNC 64038 a4 0 testing::internal::FilePath::GenerateUniqueFileName +64038 10 288 90 +64048 4 61 84 +6404c 4 288 90 +64050 4 61 84 +64054 8 288 90 +6405c 4 61 84 +64060 4 288 90 +64064 8 61 84 +6406c 4 288 90 +64070 4 61 84 +64074 4 290 90 +64078 18 292 90 +64090 8 348 131 +64098 10 349 131 +640a8 8 156 132 +640b0 c 291 90 +640bc 4 292 90 +640c0 4 291 90 +640c4 18 295 90 +FUNC 640dc 8 0 testing::internal::GetThreadCount +640dc 8 133 92 +FUNC 640e4 30 0 testing::internal::IsInSet +640e4 8 587 92 +640ec 4 588 92 +640f0 4 587 92 +640f4 8 588 92 +640fc 8 588 92 +64104 8 588 92 +6410c 8 589 92 +FUNC 64114 c 0 testing::internal::IsAsciiPunct +64114 c 596 92 +FUNC 64120 c 0 testing::internal::IsRepeat +64120 c 598 92 +FUNC 6412c c 0 testing::internal::IsAsciiWhiteSpace +6412c c 599 92 +FUNC 64138 3c 0 testing::internal::IsAsciiWordChar +64138 4 600 92 +6413c 4 602 92 +64140 8 601 92 +64148 c 602 92 +64154 4 602 92 +64158 c 601 92 +64164 c 602 92 +64170 4 603 92 +FUNC 64174 158 0 testing::internal::AtomMatchesChar +64174 10 612 92 +64184 8 612 92 +6418c 4 613 92 +64190 28 614 92 +641b8 c 621 92 +641c4 10 614 92 +641d4 8 617 92 +641dc 1c 614 92 +641f8 4 620 92 +641fc 8 631 92 +64204 4 620 92 +64208 10 614 92 +64218 4 624 92 +6421c 8 631 92 +64224 4 624 92 +64228 18 594 92 +64240 10 616 92 +64250 8 618 92 +64258 8 619 92 +64260 8 622 92 +64268 c 623 92 +64274 14 625 92 +64288 8 627 92 +64290 10 627 92 +642a0 10 630 92 +642b0 4 630 92 +642b4 4 630 92 +642b8 8 630 92 +642c0 c 631 92 +FUNC 642cc bc 0 testing::internal::MatchRegexAtHead +642cc 18 731 92 +642e4 8 732 92 +642ec 8 737 92 +642f4 10 738 92 +64304 8 741 92 +6430c 8 743 92 +64314 14 744 92 +64328 14 749 92 +6433c c 757 92 +64348 4 749 92 +6434c 8 754 92 +64354 10 754 92 +64364 4 754 92 +64368 c 755 92 +64374 4 733 92 +64378 10 757 92 +FUNC 64388 c0 0 testing::internal::MatchRepetitionAndRegexAtHead +64388 18 706 92 +643a0 4 707 92 +643a4 4 706 92 +643a8 10 706 92 +643b8 4 707 92 +643bc 14 707 92 +643d0 4 707 92 +643d4 4 709 92 +643d8 4 713 92 +643dc 8 715 92 +643e4 10 715 92 +643f4 4 715 92 +643f8 8 722 92 +64400 18 722 92 +64418 8 723 92 +64420 4 713 92 +64424 8 713 92 +6442c 4 723 92 +64430 18 726 92 +FUNC 64448 68 0 testing::internal::MatchRegexAnywhere +64448 c 767 92 +64454 8 767 92 +6445c 8 768 92 +64464 c 771 92 +64470 4 772 92 +64474 8 780 92 +6447c 4 772 92 +64480 8 775 92 +64488 18 776 92 +644a0 4 769 92 +644a4 c 780 92 +FUNC 644b0 1c 0 testing::internal::RE::PartialMatch +644b0 4 796 92 +644b4 8 797 92 +644bc c 797 92 +644c8 4 798 92 +FUNC 644cc 2c 0 testing::internal::CapturedStream::GetFileSize +644cc 4 980 92 +644d0 8 981 92 +644d8 8 980 92 +644e0 4 980 92 +644e4 4 981 92 +644e8 4 982 92 +644ec 8 983 92 +644f4 4 982 92 +FUNC 644f8 18 0 testing::internal::GetInjectableArgvs +644f8 c 1069 92 +64504 8 1072 92 +6450c 4 1073 92 +FUNC 64510 3c 0 std::_Destroy_Range, std::allocator >*> > +64510 c 219 103 +6451c 8 65 113 +64524 c 191 103 +64530 10 156 132 +64540 c 221 103 +FUNC 6454c 5c 0 std::vector, std::allocator >, std::allocator, std::allocator > > >::~vector +6454c c 42 143 +64558 4 42 143 +6455c 4 304 139 +64560 10 64 113 +64570 8 304 139 +64578 8 87 139 +64580 8 88 139 +64588 8 161 101 +64590 8 135 119 +64598 4 161 101 +6459c c 42 143 +FUNC 645a8 9c 0 testing::internal::CapturedStream::ReadEntireFile +645a8 18 986 92 +645c0 4 986 92 +645c4 8 987 92 +645cc 4 988 92 +645d0 4 993 92 +645d4 4 988 92 +645d8 8 993 92 +645e0 4 991 92 +645e4 4 993 92 +645e8 14 998 92 +645fc 4 999 92 +64600 c 997 92 +6460c c 225 131 +64618 4 112 132 +6461c 4 481 101 +64620 4 225 131 +64624 8 1003 92 +6462c 18 1006 92 +FUNC 64644 a8 0 testing::internal::GetCapturedStream +64644 10 1023 92 +64654 8 1023 92 +6465c 4 1024 92 +64660 c 950 92 +6466c 8 952 92 +64674 c 953 92 +64680 8 954 92 +64688 8 955 92 +64690 14 2298 87 +646a4 8 959 92 +646ac 8 2306 87 +646b4 8 1026 92 +646bc 8 946 92 +646c4 8 156 132 +646cc 8 1026 92 +646d4 4 1030 92 +646d8 4 1027 92 +646dc 10 1030 92 +FUNC 646ec 2c 0 testing::internal::GetCapturedStderr +646ec 4 1048 92 +646f0 4 1049 92 +646f4 4 1048 92 +646f8 4 1049 92 +646fc 4 1048 92 +64700 4 1048 92 +64704 4 1049 92 +64708 10 1050 92 +FUNC 64718 38 0 testing::Message::operator<< +64718 c 149 79 +64724 8 149 79 +6472c 4 333 122 +64730 4 150 79 +64734 c 333 122 +64740 10 156 79 +FUNC 64750 7c 0 std::endl > +64750 c 357 122 +6475c 4 357 122 +64760 10 181 122 +64770 4 412 121 +64774 18 422 121 +6478c 4 414 121 +64790 14 414 121 +647a4 8 421 121 +647ac 8 424 121 +647b4 8 359 122 +647bc 10 361 122 +FUNC 647cc 48 0 testing::internal::GTestLog::~GTestLog +647cc c 880 92 +647d8 4 880 92 +647dc c 78 122 +647e8 c 882 92 +647f4 10 883 92 +64804 4 2340 87 +64808 c 886 92 +FUNC 64814 1a8 0 testing::internal::ParseInt32 +64814 10 1103 92 +64824 4 1105 92 +64828 4 1103 92 +6482c 8 1103 92 +64834 4 1106 92 +64838 4 1105 92 +6483c 8 1106 92 +64844 c 1109 92 +64850 c 1111 92 +6485c 14 333 122 +64870 10 131 79 +64880 28 333 122 +648a8 c 1114 92 +648b4 4 131 79 +648b8 10 333 122 +648c8 10 1122 92 +648d8 4 1125 92 +648dc 8 1122 92 +648e4 c 1128 92 +648f0 14 333 122 +64904 10 131 79 +64914 28 333 122 +6493c c 1131 92 +64948 4 131 79 +6494c 10 333 122 +6495c 10 1132 92 +6496c 10 1132 92 +6497c 8 156 132 +64984 10 1133 92 +64994 8 85 79 +6499c 8 1134 92 +649a4 4 1137 92 +649a8 4 1138 92 +649ac 10 1139 92 +FUNC 649bc 150 0 testing::internal::FormatFileLocation +649bc 14 840 92 +649d0 8 840 92 +649d8 8 841 92 +649e0 8 841 92 +649e8 4 229 140 +649ec 8 112 132 +649f4 4 481 101 +649f8 4 229 140 +649fc 4 643 130 +64a00 4 643 130 +64a04 c 643 130 +64a10 4 843 92 +64a14 14 844 92 +64a28 14 849 92 +64a3c 4 244 79 +64a40 4 849 92 +64a44 8 244 79 +64a4c 8 131 79 +64a54 4 244 79 +64a58 8 131 79 +64a60 c 244 79 +64a6c 8 85 79 +64a74 4 120 132 +64a78 14 400 131 +64a8c 4 481 101 +64a90 4 400 131 +64a94 4 35 134 +64a98 10 124 132 +64aa8 4 39 134 +64aac 4 101 103 +64ab0 8 39 134 +64ab8 c 40 134 +64ac4 10 849 92 +64ad4 20 156 132 +64af4 18 851 92 +FUNC 64b0c cc 0 testing::internal::GTestLog::GTestLog +64b0c c 869 92 +64b18 4 870 92 +64b1c 4 874 92 +64b20 8 874 92 +64b28 8 874 92 +64b30 c 874 92 +64b3c c 874 92 +64b48 c 874 92 +64b54 8 874 92 +64b5c 18 78 122 +64b74 4 333 122 +64b78 4 876 92 +64b7c 14 333 122 +64b90 18 876 92 +64ba8 1c 333 122 +64bc4 8 156 132 +64bcc c 877 92 +FUNC 64bd8 1a4 0 testing::internal::CaptureStream +64bd8 18 1014 92 +64bf0 c 1014 92 +64bfc c 1015 92 +64c08 4 1016 92 +64c0c 4 333 122 +64c10 14 1016 92 +64c24 30 333 122 +64c54 8 1016 92 +64c5c c 1019 92 +64c68 14 897 92 +64c7c 8 124 132 +64c84 4 120 132 +64c88 4 481 101 +64c8c 8 124 132 +64c94 c 933 92 +64ca0 4 101 103 +64ca4 8 933 92 +64cac c 937 92 +64cb8 8 229 140 +64cc0 4 355 131 +64cc4 4 400 131 +64cc8 8 243 130 +64cd0 4 400 131 +64cd4 8 244 130 +64cdc 4 168 140 +64ce0 c 168 140 +64cec c 246 130 +64cf8 8 803 131 +64d00 4 168 140 +64d04 4 806 131 +64d08 4 168 140 +64d0c 10 806 131 +64d1c 4 168 140 +64d20 8 168 140 +64d28 4 400 131 +64d2c 4 250 130 +64d30 8 400 131 +64d38 c 250 130 +64d44 8 940 92 +64d4c c 941 92 +64d58 8 942 92 +64d60 4 1019 92 +64d64 18 1020 92 +FUNC 64d7c 18 0 testing::internal::CaptureStderr +64d7c 18 1039 92 +FUNC 64d94 13c 0 testing::internal::FormatCompilerIndependentFileLocation +64d94 14 859 92 +64da8 8 859 92 +64db0 8 860 92 +64db8 8 860 92 +64dc0 4 229 140 +64dc4 8 112 132 +64dcc 4 481 101 +64dd0 4 229 140 +64dd4 4 643 130 +64dd8 4 643 130 +64ddc 8 643 130 +64de4 4 862 92 +64de8 c 649 130 +64df4 4 112 132 +64df8 4 481 101 +64dfc 8 649 130 +64e04 14 865 92 +64e18 4 244 79 +64e1c 4 865 92 +64e20 8 244 79 +64e28 8 131 79 +64e30 4 244 79 +64e34 8 131 79 +64e3c c 244 79 +64e48 8 85 79 +64e50 4 120 132 +64e54 14 400 131 +64e68 4 481 101 +64e6c 4 400 131 +64e70 4 35 134 +64e74 10 124 132 +64e84 4 39 134 +64e88 4 101 103 +64e8c 8 39 134 +64e94 c 40 134 +64ea0 18 156 132 +64eb8 18 866 92 +FUNC 64ed0 c8 0 testing::internal::FlagToEnvVar +64ed0 c 1088 92 +64edc 4 1090 92 +64ee0 4 1088 92 +64ee4 4 1090 92 +64ee8 4 1088 92 +64eec 4 1088 92 +64ef0 4 1090 92 +64ef4 c 333 122 +64f00 4 1090 92 +64f04 8 333 122 +64f0c 8 1090 92 +64f14 4 1093 92 +64f18 4 1090 92 +64f1c 8 1090 92 +64f24 8 85 79 +64f2c c 1092 92 +64f38 8 400 131 +64f40 8 1093 92 +64f48 4 2211 87 +64f4c 4 1093 92 +64f50 8 2211 87 +64f58 4 131 79 +64f5c c 305 122 +64f68 c 1097 92 +64f74 8 85 79 +64f7c 8 156 132 +64f84 14 1098 92 +FUNC 64f98 54 0 testing::internal::BoolFromGTestEnv +64f98 c 1145 92 +64fa4 4 1146 92 +64fa8 4 1145 92 +64fac 8 1146 92 +64fb4 8 2328 87 +64fbc 4 1149 92 +64fc0 c 1149 92 +64fcc 8 1149 92 +64fd4 8 156 132 +64fdc 10 1150 92 +FUNC 64fec 10c 0 testing::internal::Int32FromGTestEnv +64fec c 1155 92 +64ff8 4 1156 92 +64ffc 4 1155 92 +65000 4 1156 92 +65004 4 1155 92 +65008 4 1155 92 +6500c 4 1156 92 +65010 4 2328 87 +65014 4 1160 92 +65018 8 2328 87 +65020 4 1158 92 +65024 4 1164 92 +65028 4 1163 92 +6502c 8 1164 92 +65034 14 333 122 +65048 10 131 79 +65058 14 1165 92 +6506c 8 85 79 +65074 4 1172 92 +65078 4 1164 92 +6507c c 1167 92 +65088 10 131 79 +65098 c 1167 92 +650a4 10 1167 92 +650b4 8 156 132 +650bc 4 85 79 +650c0 4 1169 92 +650c4 4 85 79 +650c8 10 1168 92 +650d8 8 156 132 +650e0 18 1173 92 +FUNC 650f8 48 0 testing::internal::StringFromGTestEnv +650f8 c 1177 92 +65104 8 1178 92 +6510c 4 1177 92 +65110 4 1178 92 +65114 8 2328 87 +6511c c 1180 92 +65128 8 156 132 +65130 10 1181 92 +FUNC 65140 40 0 sys_sigaltstack +65140 c 3142 97 +6514c 14 3142 97 +65160 4 3142 97 +65164 4 3142 97 +65168 8 3142 97 +65170 10 3142 97 +FUNC 65180 44 0 sys_close +65180 10 2979 97 +65190 14 2979 97 +651a4 4 2979 97 +651a8 4 2979 97 +651ac 8 2979 97 +651b4 10 2979 97 +FUNC 651c4 50 0 sys_prctl +651c4 14 3092 97 +651d8 1c 3092 97 +651f4 4 3092 97 +651f8 4 3092 97 +651fc 8 3092 97 +65204 10 3092 97 +FUNC 65214 fc 0 google_breakpad::ExceptionHandler::InstallHandlersLocked +65214 4 247 4 +65218 8 246 4 +65220 4 247 4 +65224 14 246 4 +65238 4 247 4 +6523c c 248 4 +65248 2c 252 4 +65274 8 251 4 +6527c 4 257 4 +65280 c 258 4 +6528c 8 257 4 +65294 4 258 4 +65298 14 262 4 +652ac 8 261 4 +652b4 4 264 4 +652b8 4 265 4 +652bc 8 264 4 +652c4 c 265 4 +652d0 18 268 4 +652e8 8 267 4 +652f0 c 273 4 +652fc 14 275 4 +FUNC 65310 2b0 0 google_breakpad::ExceptionHandler::ExceptionHandler +65310 18 200 4 +65328 4 210 4 +6532c 4 200 4 +65330 8 210 4 +65338 4 200 4 +6533c 4 210 4 +65340 4 92 57 +65344 4 210 4 +65348 4 200 4 +6534c 4 210 4 +65350 4 210 4 +65354 8 211 116 +6535c 4 211 4 +65360 4 212 116 +65364 8 211 116 +6536c 4 212 116 +65370 4 211 4 +65374 c 212 4 +65380 c 105 57 +6538c 4 107 57 +65390 c 107 57 +6539c 4 108 57 +653a0 8 214 4 +653a8 10 214 4 +653b8 4 218 4 +653bc 4 219 4 +653c0 8 218 4 +653c8 8 219 4 +653d0 8 220 4 +653d8 8 67 139 +653e0 4 481 101 +653e4 4 220 4 +653e8 4 221 4 +653ec 10 138 4 +653fc 4 141 4 +65400 4 142 4 +65404 10 141 4 +65414 c 142 4 +65420 c 147 4 +6542c 10 147 4 +6543c 18 151 4 +65454 c 151 4 +65460 4 152 4 +65464 c 151 4 +65470 18 153 4 +65488 8 156 4 +65490 4 154 4 +65494 c 156 4 +654a0 c 157 4 +654ac 4 223 4 +654b0 4 225 4 +654b4 10 380 139 +654c4 4 126 103 +654c8 10 382 139 +654d8 c 192 139 +654e4 c 176 139 +654f0 4 175 139 +654f4 10 176 139 +65504 4 356 101 +65508 8 346 101 +65510 4 177 139 +65514 c 347 101 +65520 4 348 101 +65524 4 352 101 +65528 4 353 101 +6552c 4 352 101 +65530 4 112 138 +65534 c 224 100 +65540 8 224 100 +65548 4 224 100 +6554c c 481 100 +65558 8 657 139 +65560 4 319 101 +65564 8 161 101 +6556c 8 135 119 +65574 4 161 101 +65578 4 118 138 +6557c 4 666 139 +65580 4 667 139 +65584 4 668 139 +65588 8 226 4 +65590 18 227 4 +655a8 c 216 4 +655b4 c 160 4 +FUNC 655c0 84 0 google_breakpad::ExceptionHandler::RestoreHandlersLocked +655c0 4 281 4 +655c4 8 280 4 +655cc 4 281 4 +655d0 10 280 4 +655e0 c 281 4 +655ec 28 285 4 +65614 10 286 4 +65624 8 284 4 +6562c 4 289 4 +65630 14 290 4 +FUNC 65644 c4 0 google_breakpad::ExceptionHandler::SendContinueSignalToChild +65644 c 521 4 +65650 4 3162 97 +65654 4 521 4 +65658 4 3162 97 +6565c 4 521 4 +65660 20 3162 97 +65680 4 3162 97 +65684 8 3162 97 +6568c c 524 4 +65698 10 528 4 +656a8 c 529 4 +656b4 8 529 4 +656bc 4 529 4 +656c0 4 529 4 +656c4 8 529 4 +656cc 8 529 4 +656d4 8 532 4 +656dc 8 530 4 +656e4 4 532 4 +656e8 8 530 4 +656f0 8 525 4 +656f8 10 532 4 +FUNC 65708 368 0 google_breakpad::ExceptionHandler::GenerateDump +65708 18 449 4 +65720 8 449 4 +65728 4 122 57 +6572c 4 450 4 +65730 4 451 4 +65734 14 451 4 +65748 4 451 4 +6574c 4 64 54 +65750 4 67 54 +65754 4 90 54 +65758 4 3940 97 +6575c 4 90 54 +65760 c 3940 97 +6576c 4 90 54 +65770 4 3940 97 +65774 4 119 54 +65778 14 3940 97 +6578c 4 3940 97 +65790 4 3940 97 +65794 8 3940 97 +6579c 8 124 54 +657a4 4 135 54 +657a8 4 458 4 +657ac 4 134 54 +657b0 4 458 4 +657b4 4 461 4 +657b8 8 462 4 +657c0 4 461 4 +657c4 4 462 4 +657c8 4 466 4 +657cc 4 462 4 +657d0 4 465 4 +657d4 4 466 4 +657d8 8 467 4 +657e0 4 469 4 +657e4 4 468 4 +657e8 4 3944 97 +657ec 4 469 4 +657f0 4 475 4 +657f4 14 3944 97 +65808 4 3944 97 +6580c 4 3944 97 +65810 c 3944 97 +6581c 8 475 4 +65824 10 481 4 +65834 c 482 4 +65840 8 482 4 +65848 4 482 4 +6584c 4 482 4 +65850 8 482 4 +65858 8 482 4 +65860 10 483 4 +65870 8 486 4 +65878 4 2523 97 +6587c 4 2521 97 +65880 4 2560 97 +65884 4 2521 97 +65888 4 2522 97 +6588c 4 2524 97 +65890 4 2525 97 +65894 2c 2560 97 +658c0 8 2562 97 +658c8 4 2562 97 +658cc 4 2562 97 +658d0 8 2562 97 +658d8 4 492 4 +658dc 4 2562 97 +658e0 4 492 4 +658e4 4 493 4 +658e8 4 495 4 +658ec 4 493 4 +658f0 c 494 4 +658fc c 499 4 +65908 4 3272 97 +6590c 4 499 4 +65910 8 500 4 +65918 24 3272 97 +6593c 4 3272 97 +65940 4 3272 97 +65944 8 3272 97 +6594c 4 502 4 +65950 4 3272 97 +65954 4 502 4 +65958 4 502 4 +6595c 10 502 4 +6596c 4 67 54 +65970 8 459 4 +65978 c 514 4 +65984 c 514 4 +65990 4 515 4 +65994 4 514 4 +65998 4 515 4 +6599c 10 516 4 +659ac 4 144 54 +659b0 4 146 54 +659b4 4 3074 97 +659b8 4 145 54 +659bc 18 3074 97 +659d4 4 3074 97 +659d8 8 3074 97 +659e0 8 459 4 +659e8 8 504 4 +659f0 8 505 4 +659f8 8 507 4 +65a00 10 509 4 +65a10 c 510 4 +65a1c 8 510 4 +65a24 4 510 4 +65a28 4 510 4 +65a2c 8 510 4 +65a34 8 510 4 +65a3c 10 511 4 +65a4c 8 514 4 +65a54 1c 518 4 +FUNC 65a70 128 0 google_breakpad::ExceptionHandler::HandleSignal +65a70 1c 392 4 +65a8c c 392 4 +65a98 4 397 4 +65a9c 8 400 4 +65aa4 c 400 4 +65ab0 4 400 4 +65ab4 4 400 4 +65ab8 8 400 4 +65ac0 18 405 4 +65ad8 10 406 4 +65ae8 10 407 4 +65af8 18 412 4 +65b10 10 413 4 +65b20 10 426 4 +65b30 8 427 4 +65b38 14 432 4 +65b4c 20 428 4 +65b6c 10 401 4 +65b7c 1c 433 4 +FUNC 65b98 5c 0 google_breakpad::ExceptionHandler::HandleSignal +65b98 10 392 4 +65ba8 4 392 4 +65bac 8 393 4 +65bb4 14 393 4 +65bc8 10 393 4 +65bd8 1c 433 4 +FUNC 65bf4 190 0 google_breakpad::ExceptionHandler::SignalHandler +65bf4 c 299 4 +65c00 4 301 4 +65c04 4 299 4 +65c08 4 301 4 +65c0c c 299 4 +65c18 8 299 4 +65c20 4 314 4 +65c24 4 301 4 +65c28 14 314 4 +65c3c 4 315 4 +65c40 4 314 4 +65c44 10 333 4 +65c54 10 192 139 +65c64 4 332 4 +65c68 c 333 4 +65c74 14 333 4 +65c88 c 334 4 +65c94 4 202 139 +65c98 14 334 4 +65cac 4 342 4 +65cb0 10 343 4 +65cc0 4 345 4 +65cc4 8 348 4 +65ccc 8 350 4 +65cd4 4 350 4 +65cd8 4 350 4 +65cdc 8 355 4 +65ce4 4 355 4 +65ce8 4 355 4 +65cec 8 355 4 +65cf4 10 110 4 +65d04 4 355 4 +65d08 8 359 4 +65d10 c 317 4 +65d1c c 318 4 +65d28 4 320 4 +65d2c 4 323 4 +65d30 8 320 4 +65d38 4 321 4 +65d3c 4 323 4 +65d40 8 321 4 +65d48 10 323 4 +65d58 c 326 4 +65d64 8 328 4 +65d6c 18 366 4 +FUNC 65d84 b8 0 google_breakpad::ExceptionHandler::WaitForContinueSignal +65d84 10 536 4 +65d94 4 536 4 +65d98 24 3104 97 +65dbc 4 3104 97 +65dc0 8 3104 97 +65dc8 c 539 4 +65dd4 10 543 4 +65de4 c 544 4 +65df0 8 544 4 +65df8 4 544 4 +65dfc 4 544 4 +65e00 8 544 4 +65e08 8 544 4 +65e10 14 545 4 +65e24 8 540 4 +65e2c 10 547 4 +FUNC 65e3c 68 0 google_breakpad::ExceptionHandler::DoDump +65e3c 10 552 4 +65e4c 4 553 4 +65e50 8 552 4 +65e58 4 553 4 +65e5c 14 557 4 +65e70 c 559 4 +65e7c 14 566 4 +65e90 14 574 4 +FUNC 65ea4 40 0 google_breakpad::ExceptionHandler::ThreadEntry +65ea4 c 379 4 +65eb0 4 379 4 +65eb4 8 384 4 +65ebc 18 387 4 +65ed4 10 388 4 +FUNC 65ee4 130 0 google_breakpad::ExceptionHandler::WriteMinidump +65ee4 18 593 4 +65efc 4 593 4 +65f00 c 594 4 +65f0c c 594 4 +65f18 8 600 4 +65f20 8 609 4 +65f28 4 612 4 +65f2c 4 609 4 +65f30 8 612 4 +65f38 4 614 4 +65f3c 4 613 4 +65f40 14 3039 97 +65f54 4 3039 97 +65f58 4 3039 97 +65f5c 8 3039 97 +65f64 4 3789 97 +65f68 4 3039 97 +65f6c 4 3789 97 +65f70 14 3026 97 +65f84 4 3026 97 +65f88 4 3026 97 +65f8c 8 3026 97 +65f94 4 643 4 +65f98 c 646 4 +65fa4 4 643 4 +65fa8 4 646 4 +65fac 8 647 4 +65fb4 4 659 4 +65fb8 4 667 4 +65fbc 4 659 4 +65fc0 10 667 4 +65fd0 8 601 4 +65fd8 10 604 4 +65fe8 10 605 4 +65ff8 1c 668 4 +FUNC 66014 b4 0 google_breakpad::ExceptionHandler::AddMappingInfo +66014 14 674 4 +66028 8 674 4 +66030 c 679 4 +6603c 8 676 4 +66044 4 683 4 +66048 4 677 4 +6604c 4 370 116 +66050 4 678 4 +66054 4 679 4 +66058 c 683 4 +66064 4 680 4 +66068 4 683 4 +6606c 4 684 4 +66070 4 306 101 +66074 8 684 4 +6607c 8 306 101 +66084 8 307 101 +6608c 8 119 103 +66094 c 119 103 +660a0 4 427 116 +660a4 4 429 116 +660a8 4 428 116 +660ac 4 430 116 +660b0 4 431 116 +660b4 14 686 4 +FUNC 660c8 84 0 google_breakpad::ExceptionHandler::RegisterAppMemory +660c8 10 688 4 +660d8 8 198 99 +660e0 c 198 99 +660ec 8 91 116 +660f4 8 691 4 +660fc 14 306 101 +66110 4 307 101 +66114 8 119 103 +6611c 10 119 103 +6612c 4 427 116 +66130 4 429 116 +66134 4 428 116 +66138 4 430 116 +6613c 4 431 116 +66140 c 700 4 +FUNC 6614c 48 0 google_breakpad::ExceptionHandler::UnregisterAppMemory +6614c 8 702 4 +66154 8 198 99 +6615c c 198 99 +66168 8 91 116 +66170 8 705 4 +66178 4 520 116 +6617c 4 519 116 +66180 4 522 116 +66184 4 523 116 +66188 8 161 101 +66190 4 708 4 +FUNC 66194 258 0 google_breakpad::ExceptionHandler::~ExceptionHandler +66194 c 230 4 +661a0 4 231 4 +661a4 4 230 4 +661a8 4 230 4 +661ac 8 231 4 +661b4 14 233 4 +661c8 8 115 99 +661d0 8 117 99 +661d8 c 118 99 +661e4 c 121 99 +661f0 8 119 99 +661f8 c 124 99 +66204 8 122 99 +6620c c 127 99 +66218 c 125 99 +66224 8 117 99 +6622c 24 131 99 +66250 10 133 99 +66260 4 134 99 +66264 10 136 99 +66274 4 137 99 +66278 10 139 99 +66288 8 118 99 +66290 4 143 99 +66294 c 580 139 +662a0 8 224 100 +662a8 4 224 100 +662ac 4 584 139 +662b0 4 200 139 +662b4 8 584 139 +662bc 8 235 4 +662c4 4 87 139 +662c8 8 88 139 +662d0 8 161 101 +662d8 8 135 119 +662e0 4 161 101 +662e4 8 236 4 +662ec 4 237 4 +662f0 10 166 4 +66300 14 170 4 +66314 18 175 4 +6632c 10 176 4 +6633c 8 177 4 +66344 8 181 4 +6634c 10 182 4 +6635c 8 187 4 +66364 4 188 4 +66368 4 239 4 +6636c 4 241 4 +66370 4 67 115 +66374 4 241 4 +66378 4 67 115 +6637c 8 68 115 +66384 4 161 101 +66388 4 74 115 +6638c c 161 101 +66398 8 67 115 +663a0 8 68 115 +663a8 4 74 115 +663ac c 135 119 +663b8 10 156 132 +663c8 8 98 57 +663d0 c 98 57 +663dc 10 242 4 +FUNC 663ec cc 0 google_breakpad::ExceptionHandler::WriteMinidumpForChild +663ec 10 715 4 +663fc 4 61 8 +66400 4 715 4 +66404 4 61 8 +66408 4 715 4 +6640c c 61 8 +66418 8 715 4 +66420 c 61 8 +6642c 4 120 132 +66430 4 124 132 +66434 4 120 132 +66438 4 481 101 +6643c 8 124 132 +66444 4 101 103 +66448 8 61 8 +66450 4 718 4 +66454 4 61 8 +66458 4 718 4 +6645c 14 721 4 +66470 4 719 4 +66474 8 724 4 +6647c 18 724 4 +66494 10 156 132 +664a4 14 725 4 +FUNC 664b8 a4 0 google_breakpad::MinidumpDescriptor::MinidumpDescriptor +664b8 18 41 7 +664d0 4 112 132 +664d4 4 41 7 +664d8 10 46 7 +664e8 4 379 131 +664ec 4 112 132 +664f0 c 481 101 +664fc 4 378 131 +66500 8 379 131 +66508 10 148 137 +66518 4 380 131 +6651c 4 101 103 +66520 4 165 131 +66524 4 124 132 +66528 4 120 132 +6652c 4 481 101 +66530 8 124 132 +66538 4 101 103 +6653c 4 46 7 +66540 4 51 7 +66544 8 46 7 +6654c 10 51 7 +FUNC 6655c f0 0 google_breakpad::MinidumpDescriptor::UpdatePath +6655c c 70 7 +66568 4 75 7 +6656c 4 70 7 +66570 4 75 7 +66574 8 70 7 +6657c 10 75 7 +6658c 14 75 7 +665a0 4 79 7 +665a4 c 422 131 +665b0 4 232 140 +665b4 8 424 131 +665bc 14 80 7 +665d0 4 80 7 +665d4 4 80 7 +665d8 c 80 7 +665e4 4 80 7 +665e8 4 80 7 +665ec 14 80 7 +66600 8 348 131 +66608 10 349 131 +66618 18 156 132 +66630 4 82 7 +66634 8 81 7 +6663c 10 82 7 +FUNC 6664c 88 0 google_breakpad::MinidumpDescriptor::operator= +6664c c 54 7 +66658 8 54 7 +66660 4 57 7 +66664 4 59 7 +66668 4 57 7 +6666c 8 58 7 +66674 4 59 7 +66678 8 348 131 +66680 10 349 131 +66690 c 422 131 +6669c 4 232 140 +666a0 8 424 131 +666a8 8 61 7 +666b0 4 63 7 +666b4 8 64 7 +666bc 8 66 7 +666c4 10 68 7 +FUNC 666d4 14 0 logger::write +666d4 4 42 9 +666d8 4 40 9 +666dc c 42 9 +FUNC 666e8 c 0 MicrodumpWriter::LogAppend +666e8 c 108 10 +FUNC 666f4 40 0 MicrodumpWriter::LogAppend +666f4 8 118 10 +666fc c 124 10 +66708 4 123 10 +6670c 4 118 10 +66710 c 124 10 +6671c 4 113 10 +66720 4 124 10 +66724 4 125 10 +66728 4 113 10 +6672c 8 127 10 +FUNC 66734 4c 0 MicrodumpWriter::LogAppend +66734 10 118 10 +66744 8 124 10 +6674c 10 124 10 +6675c 4 123 10 +66760 4 123 10 +66764 8 124 10 +6676c 4 123 10 +66770 4 125 10 +66774 4 113 10 +66778 8 127 10 +FUNC 66780 44 0 MicrodumpWriter::LogCommitLine +66780 c 137 10 +6678c 4 137 10 +66790 4 228 57 +66794 c 100 10 +667a0 8 100 10 +667a8 8 139 10 +667b0 8 140 10 +667b8 c 139 10 +FUNC 667c4 220 0 MicrodumpWriter::DumpModule +667c4 1c 291 10 +667e0 c 291 10 +667ec 4 296 10 +667f0 c 298 10 +667fc c 304 10 +66808 18 310 10 +66820 4 314 10 +66824 4 310 10 +66828 4 314 10 +6682c 10 312 10 +6683c c 313 10 +66848 c 314 10 +66854 c 315 10 +66860 c 316 10 +6686c c 317 10 +66878 10 318 10 +66888 8 319 10 +66890 14 124 10 +668a4 4 123 10 +668a8 4 123 10 +668ac 8 124 10 +668b4 4 123 10 +668b8 8 113 10 +668c0 4 125 10 +668c4 4 113 10 +668c8 8 320 10 +668d0 14 124 10 +668e4 4 123 10 +668e8 4 123 10 +668ec c 124 10 +668f8 4 123 10 +668fc 8 113 10 +66904 4 125 10 +66908 4 113 10 +6690c 8 321 10 +66914 10 124 10 +66924 4 123 10 +66928 4 123 10 +6692c 8 124 10 +66934 4 123 10 +66938 8 113 10 +66940 4 125 10 +66944 4 113 10 +66948 c 322 10 +66954 c 323 10 +66960 c 324 10 +6696c c 325 10 +66978 c 326 10 +66984 c 327 10 +66990 c 328 10 +6699c c 329 10 +669a8 10 330 10 +669b8 c 113 10 +669c4 8 332 10 +669cc 18 333 10 +FUNC 669e4 678 0 google_breakpad::WriteMicrodump +669e4 18 375 10 +669fc 4 376 10 +66a00 4 375 10 +66a04 4 376 10 +66a08 4 375 10 +66a0c 4 376 10 +66a10 14 375 10 +66a24 4 375 10 +66a28 4 376 10 +66a2c 8 378 10 +66a34 8 379 10 +66a3c 4 380 10 +66a40 8 379 10 +66a48 8 123 22 +66a50 8 127 22 +66a58 8 130 22 +66a60 8 72 10 +66a68 4 72 10 +66a6c 8 72 10 +66a74 4 72 10 +66a78 4 72 10 +66a7c 8 72 10 +66a84 14 72 10 +66a98 4 197 57 +66a9c 4 73 10 +66aa0 18 79 10 +66ab8 8 389 10 +66ac0 14 81 10 +66ad4 4 388 10 +66ad8 4 100 10 +66adc 4 144 10 +66ae0 10 100 10 +66af0 4 100 10 +66af4 4 88 10 +66af8 4 100 10 +66afc c 144 10 +66b08 4 146 10 +66b0c 4 149 10 +66b10 4 157 10 +66b14 4 172 10 +66b18 8 146 10 +66b20 4 149 10 +66b24 4 170 10 +66b28 4 149 10 +66b2c 4 170 10 +66b30 4 172 10 +66b34 4 267 10 +66b38 4 233 10 +66b3c 4 267 10 +66b40 4 149 10 +66b44 8 157 10 +66b4c 4 149 10 +66b50 10 157 10 +66b60 8 170 10 +66b68 c 171 10 +66b74 c 172 10 +66b80 c 173 10 +66b8c c 174 10 +66b98 c 175 10 +66ba4 c 176 10 +66bb0 c 113 10 +66bbc c 178 10 +66bc8 c 113 10 +66bd4 c 180 10 +66be0 c 113 10 +66bec 8 182 10 +66bf4 4 233 10 +66bf8 c 192 139 +66c04 8 233 10 +66c0c c 200 10 +66c18 c 221 10 +66c24 c 235 10 +66c30 10 237 10 +66c40 10 238 10 +66c50 c 241 10 +66c5c 4 248 10 +66c60 4 190 10 +66c64 8 248 10 +66c6c 4 249 10 +66c70 c 194 10 +66c7c 4 249 10 +66c80 10 194 10 +66c90 8 200 10 +66c98 4 202 10 +66c9c 4 200 10 +66ca0 c 201 10 +66cac c 202 10 +66cb8 c 203 10 +66cc4 c 204 10 +66cd0 c 205 10 +66cdc 8 206 10 +66ce4 8 358 10 +66cec 4 75 54 +66cf0 8 76 54 +66cf8 c 78 54 +66d04 14 78 54 +66d18 4 80 54 +66d1c 4 79 54 +66d20 8 81 54 +66d28 8 80 54 +66d30 4 82 54 +66d34 8 83 54 +66d3c 8 90 54 +66d44 10 3940 97 +66d54 4 90 54 +66d58 8 3940 97 +66d60 4 90 54 +66d64 4 119 54 +66d68 14 3940 97 +66d7c 4 3940 97 +66d80 c 3940 97 +66d8c 8 124 54 +66d94 8 134 54 +66d9c 4 135 54 +66da0 4 136 54 +66da4 14 96 54 +66db8 4 97 54 +66dbc 4 98 54 +66dc0 8 98 54 +66dc8 4 98 54 +66dcc 4 100 54 +66dd0 4 214 10 +66dd4 4 219 10 +66dd8 1c 214 10 +66df4 8 223 10 +66dfc c 219 10 +66e08 c 221 10 +66e14 10 222 10 +66e24 c 223 10 +66e30 4 225 10 +66e34 8 139 100 +66e3c 4 132 10 +66e40 4 225 10 +66e44 8 139 100 +66e4c 8 132 10 +66e54 18 133 10 +66e6c 14 132 10 +66e80 4 226 10 +66e84 4 219 10 +66e88 8 226 10 +66e90 10 253 10 +66ea0 10 255 10 +66eb0 4 259 10 +66eb4 10 260 10 +66ec4 10 267 10 +66ed4 10 133 10 +66ee4 8 132 10 +66eec 10 269 10 +66efc 4 235 10 +66f00 8 338 10 +66f08 c 192 139 +66f14 8 338 10 +66f1c 4 339 10 +66f20 8 342 10 +66f28 8 340 10 +66f30 4 342 10 +66f34 10 341 10 +66f44 8 275 10 +66f4c 10 280 10 +66f5c 4 282 10 +66f60 4 281 10 +66f64 4 282 10 +66f68 8 280 10 +66f70 8 91 116 +66f78 14 347 10 +66f8c 10 338 10 +66f9c c 350 10 +66fa8 18 353 10 +66fc0 8 91 116 +66fc8 4 91 10 +66fcc 14 100 10 +66fe0 4 100 10 +66fe4 4 390 10 +66fe8 4 100 10 +66fec 10 93 10 +66ffc 10 76 10 +6700c 8 203 57 +67014 4 203 57 +67018 18 42 24 +67030 2c 391 10 +FUNC 6705c 8 0 google_breakpad::LinuxCoreDumper::IsPostMortem +6705c 8 116 18 +FUNC 67064 8 0 google_breakpad::LinuxCoreDumper::ThreadsSuspend +67064 8 120 18 +FUNC 6706c 8 0 google_breakpad::LinuxCoreDumper::ThreadsResume +6706c 8 124 18 +FUNC 67074 64 0 google_breakpad::LinuxCoreDumper::GetThreadInfoByIndex +67074 8 90 18 +6707c 24 192 139 +670a0 4 92 18 +670a4 c 91 18 +670b0 14 94 18 +670c4 4 103 18 +670c8 4 110 18 +670cc 4 111 18 +670d0 8 112 18 +FUNC 670d8 54 0 google_breakpad::LinuxCoreDumper::CopyFromProcess +670d8 4 78 18 +670dc 8 83 18 +670e4 4 78 18 +670e8 4 83 18 +670ec 4 78 18 +670f0 4 78 18 +670f4 14 83 18 +67108 4 86 18 +6710c 8 88 18 +67114 c 86 18 +67120 c 88 18 +FUNC 6712c b4 0 google_breakpad::LinuxCoreDumper::BuildProcPath +6712c 18 57 18 +67144 10 58 18 +67154 c 59 18 +67160 14 61 18 +67174 4 62 18 +67178 c 65 18 +67184 4 66 18 +67188 4 67 18 +6718c 4 65 18 +67190 4 67 18 +67194 10 70 18 +671a4 8 71 18 +671ac 14 72 18 +671c0 4 73 18 +671c4 4 74 18 +671c8 18 75 18 +FUNC 671e0 90 0 std::priv::__ucopy +671e0 4 82 137 +671e4 4 86 137 +671e8 8 82 137 +671f0 c 86 137 +671fc 4 82 137 +67200 4 86 137 +67204 4 82 137 +67208 8 86 137 +67210 4 82 137 +67214 4 86 137 +67218 4 82 137 +6721c 4 86 137 +67220 8 86 137 +67228 8 139 103 +67230 c 139 103 +6723c 10 86 137 +6724c 24 95 137 +FUNC 67270 84 0 google_breakpad::LinuxCoreDumper::LinuxCoreDumper +67270 c 46 18 +6727c c 46 18 +67288 20 52 18 +672a8 8 52 18 +672b0 8 52 18 +672b8 4 67 139 +672bc 4 52 18 +672c0 4 67 139 +672c4 4 163 54 +672c8 4 172 54 +672cc 4 481 101 +672d0 4 172 54 +672d4 4 666 139 +672d8 4 667 139 +672dc 8 76 138 +672e4 4 668 139 +672e8 c 54 18 +FUNC 672f4 190 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +672f4 20 81 138 +67314 8 81 138 +6731c 14 192 139 +67330 4 81 138 +67334 c 192 139 +67340 4 81 138 +67344 4 192 139 +67348 1c 173 139 +67364 c 41 138 +67370 14 176 139 +67384 4 175 139 +67388 4 176 139 +6738c 10 176 139 +6739c 10 177 139 +673ac 18 172 54 +673c4 14 113 137 +673d8 8 93 138 +673e0 4 119 103 +673e4 c 119 103 +673f0 8 95 138 +673f8 4 314 137 +673fc 4 249 137 +67400 4 314 137 +67404 14 249 137 +67418 8 249 137 +67420 4 139 103 +67424 10 139 103 +67434 c 249 137 +67440 4 98 138 +67444 14 113 137 +67458 4 104 138 +6745c 4 666 139 +67460 4 667 139 +67464 4 668 139 +67468 1c 105 138 +FUNC 67484 2b4 0 google_breakpad::LinuxCoreDumper::EnumerateThreads +67484 14 126 18 +67498 4 132 18 +6749c 4 126 18 +674a0 8 132 18 +674a8 10 126 18 +674b8 4 132 18 +674bc 10 133 18 +674cc 14 134 18 +674e0 8 138 18 +674e8 4 139 18 +674ec 8 138 18 +674f4 10 139 18 +67504 1c 140 18 +67520 4 188 18 +67524 4 380 139 +67528 4 202 18 +6752c 4 380 139 +67530 4 162 139 +67534 4 202 18 +67538 c 146 18 +67544 4 147 18 +67548 4 146 18 +6754c 8 147 18 +67554 c 148 18 +67560 4 150 18 +67564 4 148 18 +67568 4 150 18 +6756c 4 150 18 +67570 4 150 18 +67574 8 150 18 +6757c 14 151 18 +67590 4 152 18 +67594 8 151 18 +6759c 8 177 18 +675a4 8 179 18 +675ac 14 180 18 +675c0 8 188 18 +675c8 4 186 18 +675cc 4 188 18 +675d0 4 189 18 +675d4 4 202 18 +675d8 4 189 18 +675dc 4 202 18 +675e0 8 190 18 +675e8 8 202 18 +675f0 4 204 18 +675f4 4 205 18 +675f8 8 206 18 +67600 10 380 139 +67610 4 126 103 +67614 10 382 139 +67624 c 192 139 +67630 c 176 139 +6763c 4 175 139 +67640 10 176 139 +67650 4 177 139 +67654 14 172 54 +67668 4 112 138 +6766c 4 172 54 +67670 8 224 100 +67678 c 224 100 +67684 8 224 100 +6768c 8 481 100 +67694 4 666 139 +67698 4 118 138 +6769c 4 667 139 +676a0 4 668 139 +676a4 10 380 139 +676b4 4 119 103 +676b8 10 119 103 +676c8 10 382 139 +676d8 18 162 139 +676f0 4 208 18 +676f4 c 244 18 +67700 10 145 18 +67710 28 248 18 +FUNC 67738 60 0 google_breakpad::LinuxCoreDumper::EnumerateThreads +67738 4 126 18 +6773c 4 127 18 +67740 8 126 18 +67748 4 126 18 +6774c 18 127 18 +67764 c 248 18 +67770 18 128 18 +67788 10 248 18 +FUNC 67798 1ac 0 google_breakpad::::ElfFileSoName +67798 10 193 21 +677a8 4 67 21 +677ac 4 193 21 +677b0 4 67 21 +677b4 c 193 21 +677c0 8 193 21 +677c8 10 67 21 +677d8 4 194 21 +677dc 8 196 21 +677e4 8 200 21 +677ec 4 201 21 +677f0 4 200 21 +677f4 4 201 21 +677f8 10 207 21 +67808 4 210 21 +6780c 8 207 21 +67814 8 210 21 +6781c 4 208 21 +67820 c 210 21 +6782c 4 213 21 +67830 4 211 21 +67834 4 211 21 +67838 4 213 21 +6783c 8 211 21 +67844 10 146 21 +67854 30 155 21 +67884 4 154 21 +67888 4 157 21 +6788c c 216 21 +67898 2c 163 21 +678c4 4 162 21 +678c8 4 169 21 +678cc 4 168 21 +678d0 10 170 21 +678e0 c 171 21 +678ec 8 173 21 +678f4 4 172 21 +678f8 8 173 21 +67900 4 178 21 +67904 18 179 21 +6791c 8 170 21 +67924 20 217 21 +FUNC 67944 120 0 google_breakpad::LinuxDumper::HandleDeletedFileInMapping +67944 4 438 21 +67948 8 454 21 +67950 18 438 21 +67968 20 454 21 +67988 8 455 21 +67990 18 60 49 +679a8 4 456 21 +679ac 10 458 21 +679bc 24 3942 97 +679e0 4 466 21 +679e4 20 3942 97 +67a04 4 3942 97 +67a08 c 3942 97 +67a14 4 464 21 +67a18 10 465 21 +67a28 10 466 21 +67a38 10 471 21 +67a48 1c 473 21 +FUNC 67a64 70 0 google_breakpad::LinuxDumper::~LinuxDumper +67a64 14 88 21 +67a78 c 88 21 +67a84 4 144 54 +67a88 4 144 54 +67a8c 8 146 54 +67a94 4 145 54 +67a98 18 3074 97 +67ab0 4 3074 97 +67ab4 8 3074 97 +67abc 8 88 21 +67ac4 10 89 21 +FUNC 67ad4 fc 0 google_breakpad::LinuxDumper::GetMappingEffectiveNameAndPath +67ad4 14 227 21 +67ae8 8 228 21 +67af0 8 227 21 +67af8 c 227 21 +67b04 4 228 21 +67b08 8 235 21 +67b10 8 235 21 +67b18 14 236 21 +67b2c 4 238 21 +67b30 c 243 21 +67b3c 8 243 21 +67b44 10 243 21 +67b54 14 244 21 +67b68 4 255 21 +67b6c c 245 21 +67b78 c 255 21 +67b84 4 245 21 +67b88 c 251 21 +67b94 4 252 21 +67b98 4 251 21 +67b9c c 253 21 +67ba8 10 255 21 +67bb8 4 253 21 +67bbc 14 255 21 +FUNC 67bd0 11c 0 google_breakpad::LinuxDumper::ReadAuxv +67bd0 4 257 21 +67bd4 4 259 21 +67bd8 c 257 21 +67be4 c 259 21 +67bf0 4 257 21 +67bf4 18 259 21 +67c0c 8 260 21 +67c14 24 3281 97 +67c38 4 3281 97 +67c3c 4 3281 97 +67c40 8 3281 97 +67c48 4 3281 97 +67c4c 8 264 21 +67c54 24 3104 97 +67c78 4 3104 97 +67c7c c 3104 97 +67c88 8 272 21 +67c90 4 273 21 +67c94 4 272 21 +67c98 8 274 21 +67ca0 4 275 21 +67ca4 4 276 21 +67ca8 c 275 21 +67cb4 18 2979 97 +67ccc 4 2979 97 +67cd0 8 2979 97 +67cd8 4 280 21 +67cdc 10 281 21 +FUNC 67cec 5c 0 google_breakpad::LinuxDumper::Init +67cec c 91 21 +67cf8 4 91 21 +67cfc c 92 21 +67d08 8 92 21 +67d10 4 92 21 +67d14 10 92 21 +67d24 4 92 21 +67d28 4 92 21 +67d2c 10 92 21 +67d3c c 93 21 +FUNC 67d48 4c 0 google_breakpad::LinuxDumper::FindMapping +67d48 4 192 139 +67d4c 4 429 21 +67d50 c 192 139 +67d5c 8 429 21 +67d64 8 430 21 +67d6c 8 431 21 +67d74 10 431 21 +67d84 8 429 21 +67d8c 4 435 21 +67d90 4 436 21 +FUNC 67d94 84 0 google_breakpad::LinuxDumper::GetStackInfo +67d94 10 402 21 +67da4 10 402 21 +67db4 8 404 21 +67dbc 4 407 21 +67dc0 4 412 21 +67dc4 4 407 21 +67dc8 8 412 21 +67dd0 4 414 21 +67dd4 4 413 21 +67dd8 4 416 21 +67ddc 4 422 21 +67de0 4 418 21 +67de4 4 420 21 +67de8 4 416 21 +67dec 4 420 21 +67df0 4 418 21 +67df4 8 420 21 +67dfc 4 420 21 +67e00 4 421 21 +67e04 14 423 21 +FUNC 67e18 64 0 google_breakpad::LinuxDumper::HandleDeletedFileInMapping +67e18 c 438 21 +67e24 4 438 21 +67e28 4 443 21 +67e2c 4 438 21 +67e30 4 443 21 +67e34 8 444 21 +67e3c 4 446 21 +67e40 14 447 21 +67e54 c 446 21 +67e60 1c 473 21 +FUNC 67e7c 1bc 0 google_breakpad::LinuxDumper::ElfFileIdentifierForMapping +67e7c 1c 99 21 +67e98 8 101 21 +67ea0 4 99 21 +67ea4 4 101 21 +67ea8 8 99 21 +67eb0 8 99 21 +67eb8 4 101 21 +67ebc 18 67 21 +67ed4 4 102 21 +67ed8 8 103 21 +67ee0 14 106 21 +67ef4 4 108 21 +67ef8 14 3026 97 +67f0c 4 3026 97 +67f10 4 3026 97 +67f14 8 3026 97 +67f1c 8 108 21 +67f24 8 109 21 +67f2c 10 111 21 +67f3c 20 114 21 +67f5c 14 116 21 +67f70 8 120 21 +67f78 4 121 21 +67f7c 4 120 21 +67f80 4 121 21 +67f84 10 125 21 +67f94 4 129 21 +67f98 4 125 21 +67f9c 4 126 21 +67fa0 10 127 21 +67fb0 14 129 21 +67fc4 4 131 21 +67fc8 4 130 21 +67fcc 4 130 21 +67fd0 4 131 21 +67fd4 8 130 21 +67fdc c 134 21 +67fe8 8 135 21 +67ff0 4 135 21 +67ff4 10 137 21 +68004 c 140 21 +68010 8 134 21 +68018 20 141 21 +FUNC 68038 f4 0 std::priv::_Impl_vector >::_M_insert_overflow +68038 14 108 138 +6804c 8 108 138 +68054 4 192 139 +68058 4 108 138 +6805c 4 192 139 +68060 4 108 138 +68064 4 192 139 +68068 4 173 139 +6806c 4 192 139 +68070 c 173 139 +6807c 14 41 138 +68090 4 175 139 +68094 10 176 139 +680a4 4 177 139 +680a8 18 172 54 +680c0 18 112 138 +680d8 8 480 100 +680e0 14 481 100 +680f4 4 115 138 +680f8 10 116 138 +68108 4 118 138 +6810c 4 666 139 +68110 4 667 139 +68114 4 668 139 +68118 14 119 138 +FUNC 6812c 148 0 std::priv::_Impl_vector >::_M_fill_insert_aux +6812c 18 140 138 +68144 c 140 138 +68150 4 416 139 +68154 8 140 138 +6815c 8 416 139 +68164 8 416 139 +6816c 8 150 138 +68174 8 152 138 +6817c 4 153 138 +68180 4 120 137 +68184 4 153 138 +68188 c 120 137 +68194 4 154 138 +68198 4 255 100 +6819c 4 256 100 +681a0 8 154 138 +681a8 4 256 100 +681ac c 256 100 +681b8 c 442 100 +681c4 8 442 100 +681cc 10 443 100 +681dc 4 158 138 +681e0 4 249 137 +681e4 8 314 137 +681ec 8 249 137 +681f4 c 249 137 +68200 c 146 103 +6820c 4 158 138 +68210 c 120 137 +6821c 14 160 138 +68230 8 442 100 +68238 10 443 100 +68248 c 146 138 +68254 8 147 138 +6825c 18 163 138 +FUNC 68274 100 0 google_breakpad::LinuxDumper::LinuxDumper +68274 10 75 21 +68284 c 82 21 +68290 4 75 21 +68294 4 67 139 +68298 14 82 21 +682ac 4 64 54 +682b0 8 67 54 +682b8 4 172 54 +682bc 4 67 54 +682c0 4 172 54 +682c4 8 67 54 +682cc 8 67 139 +682d4 4 163 54 +682d8 4 481 101 +682dc 4 172 54 +682e0 4 666 139 +682e4 4 667 139 +682e8 4 76 138 +682ec 4 67 139 +682f0 4 172 54 +682f4 4 668 139 +682f8 4 172 54 +682fc 4 67 139 +68300 4 163 54 +68304 4 481 101 +68308 4 172 54 +6830c 4 666 139 +68310 4 667 139 +68314 4 76 138 +68318 4 67 139 +6831c 4 172 54 +68320 4 668 139 +68324 4 172 54 +68328 4 67 139 +6832c 4 163 54 +68330 4 481 101 +68334 8 172 54 +6833c 4 85 21 +68340 4 76 138 +68344 4 666 139 +68348 4 173 138 +6834c 4 667 139 +68350 4 173 138 +68354 4 668 139 +68358 4 173 138 +6835c 4 85 21 +68360 4 173 138 +68364 10 86 21 +FUNC 68374 148 0 std::priv::_Impl_vector >::_M_fill_insert_aux +68374 18 140 138 +6838c c 140 138 +68398 4 416 139 +6839c 8 140 138 +683a4 8 416 139 +683ac 8 416 139 +683b4 8 150 138 +683bc 8 152 138 +683c4 4 153 138 +683c8 4 120 137 +683cc 4 153 138 +683d0 c 120 137 +683dc 4 154 138 +683e0 4 255 100 +683e4 4 256 100 +683e8 8 154 138 +683f0 4 256 100 +683f4 c 256 100 +68400 c 442 100 +6840c 8 442 100 +68414 10 443 100 +68424 4 158 138 +68428 4 249 137 +6842c 8 314 137 +68434 8 249 137 +6843c c 249 137 +68448 c 146 103 +68454 4 158 138 +68458 c 120 137 +68464 14 160 138 +68478 8 442 100 +68480 10 443 100 +68490 c 146 138 +6849c 8 147 138 +684a4 18 163 138 +FUNC 684bc 58c 0 google_breakpad::LinuxDumper::EnumerateMappings +684bc 4 283 21 +684c0 4 285 21 +684c4 24 283 21 +684e8 c 285 21 +684f4 4 283 21 +684f8 18 285 21 +68510 c 286 21 +6851c 8 3281 97 +68524 4 296 21 +68528 4 300 21 +6852c 4 296 21 +68530 4 3281 97 +68534 4 300 21 +68538 18 3281 97 +68550 4 3281 97 +68554 4 3281 97 +68558 8 3281 97 +68560 4 3281 97 +68564 4 303 21 +68568 4 305 21 +6856c 4 208 54 +68570 4 312 21 +68574 4 314 21 +68578 4 305 21 +6857c 4 357 21 +68580 8 208 54 +68588 c 49 16 +68594 c 351 21 +685a0 4 99 16 +685a4 4 103 16 +685a8 8 66 16 +685b0 8 66 16 +685b8 4 66 16 +685bc 14 69 16 +685d0 10 70 16 +685e0 4 71 16 +685e4 4 73 16 +685e8 8 71 16 +685f0 8 78 16 +685f8 c 86 16 +68604 4 90 16 +68608 4 92 16 +6860c 4 93 16 +68610 4 66 16 +68614 4 90 16 +68618 8 92 16 +68620 4 98 16 +68624 4 3104 97 +68628 4 98 16 +6862c 4 99 16 +68630 14 3104 97 +68644 4 3104 97 +68648 c 3104 97 +68654 8 100 16 +6865c 4 102 16 +68660 8 103 16 +68668 10 105 16 +68678 1c 2979 97 +68694 4 2979 97 +68698 8 2979 97 +686a0 14 395 21 +686b4 10 312 21 +686c4 c 313 21 +686d0 10 314 21 +686e0 c 315 21 +686ec 4 316 21 +686f0 8 317 21 +686f8 4 316 21 +686fc 8 317 21 +68704 c 318 21 +68710 14 323 21 +68724 c 322 21 +68730 14 323 21 +68744 4 330 21 +68748 4 200 139 +6874c c 330 21 +68758 4 344 21 +6875c 4 200 139 +68760 10 344 21 +68770 4 331 21 +68774 c 332 21 +68780 c 333 21 +6878c c 333 21 +68798 4 333 21 +6879c c 333 21 +687a8 c 332 21 +687b4 c 208 54 +687c0 4 357 21 +687c4 c 358 21 +687d0 c 359 21 +687dc 14 360 21 +687f0 8 361 21 +687f8 10 316 21 +68808 4 363 21 +6880c 8 364 21 +68814 c 365 21 +68820 10 366 21 +68830 8 377 21 +68838 4 374 21 +6883c 4 373 21 +68840 4 374 21 +68844 8 373 21 +6884c 8 377 21 +68854 8 375 21 +6885c 8 200 139 +68864 c 377 21 +68870 8 383 21 +68878 10 390 21 +68888 4 325 21 +6888c 4 326 21 +68890 8 325 21 +68898 c 334 21 +688a4 c 334 21 +688b0 4 333 21 +688b4 14 335 21 +688c8 4 345 21 +688cc c 346 21 +688d8 c 349 21 +688e4 8 346 21 +688ec c 347 21 +688f8 8 348 21 +68900 14 351 21 +68914 8 349 21 +6891c 14 352 21 +68930 14 380 139 +68944 4 126 103 +68948 10 382 139 +68958 1c 386 139 +68974 4 192 139 +68978 4 380 21 +6897c 4 192 139 +68980 8 380 21 +68988 8 640 139 +68990 4 641 139 +68994 8 630 139 +6899c c 269 100 +689a8 8 615 139 +689b0 8 172 138 +689b8 4 173 138 +689bc 8 172 138 +689c4 4 173 138 +689c8 4 172 138 +689cc c 173 138 +689d8 10 176 138 +689e8 14 192 139 +689fc 8 381 21 +68a04 4 381 21 +68a08 4 202 139 +68a0c 14 382 21 +68a20 28 396 21 +FUNC 68a48 8 0 google_breakpad::LinuxPtraceDumper::IsPostMortem +68a48 8 275 23 +FUNC 68a50 48 0 sys_ptrace +68a50 14 3097 97 +68a64 14 3097 97 +68a78 4 3097 97 +68a7c 4 3097 97 +68a80 8 3097 97 +68a88 10 3097 97 +FUNC 68a98 a0 0 google_breakpad::LinuxPtraceDumper::CopyFromProcess +68a98 4 134 23 +68a9c 4 135 23 +68aa0 8 134 23 +68aa8 4 135 23 +68aac 10 134 23 +68abc c 134 23 +68ac8 4 135 23 +68acc 4 136 23 +68ad0 4 142 23 +68ad4 8 141 23 +68adc 4 142 23 +68ae0 4 143 23 +68ae4 4 142 23 +68ae8 c 143 23 +68af4 4 142 23 +68af8 c 143 23 +68b04 4 144 23 +68b08 c 146 23 +68b14 4 147 23 +68b18 8 146 23 +68b20 18 149 23 +FUNC 68b38 e4 0 google_breakpad::LinuxPtraceDumper::BuildProcPath +68b38 4 112 23 +68b3c 4 113 23 +68b40 c 112 23 +68b4c 4 113 23 +68b50 4 113 23 +68b54 4 112 23 +68b58 4 113 23 +68b5c 8 112 23 +68b64 8 113 23 +68b6c 4 113 23 +68b70 8 113 23 +68b78 8 114 23 +68b80 14 116 23 +68b94 4 117 23 +68b98 c 120 23 +68ba4 8 121 23 +68bac 8 122 23 +68bb4 4 125 23 +68bb8 4 126 23 +68bbc 10 125 23 +68bcc 4 126 23 +68bd0 4 125 23 +68bd4 8 126 23 +68bdc 8 127 23 +68be4 4 128 23 +68be8 4 127 23 +68bec 10 128 23 +68bfc 4 129 23 +68c00 4 130 23 +68c04 18 131 23 +FUNC 68c1c 78 0 google_breakpad::LinuxPtraceDumper::ThreadsResume +68c1c 10 295 23 +68c2c 14 296 23 +68c40 c 192 139 +68c4c 8 299 23 +68c54 10 101 23 +68c64 4 299 23 +68c68 c 101 23 +68c74 8 300 23 +68c7c 4 301 23 +68c80 14 303 23 +FUNC 68c94 2dc 0 google_breakpad::LinuxPtraceDumper::GetThreadInfoByIndex +68c94 1c 155 23 +68cb0 c 192 139 +68cbc 8 156 23 +68cc4 8 157 23 +68ccc 4 159 23 +68cd0 30 163 23 +68d00 24 3281 97 +68d24 4 3281 97 +68d28 4 3281 97 +68d2c 8 3281 97 +68d34 4 3281 97 +68d38 4 167 23 +68d3c 8 208 54 +68d44 4 177 23 +68d48 4 179 23 +68d4c 4 208 54 +68d50 8 49 16 +68d58 4 208 54 +68d5c 4 49 16 +68d60 4 99 16 +68d64 4 174 23 +68d68 4 177 23 +68d6c 4 174 23 +68d70 4 179 23 +68d74 4 174 23 +68d78 4 103 16 +68d7c 8 66 16 +68d84 8 66 16 +68d8c 4 66 16 +68d90 14 69 16 +68da4 10 70 16 +68db4 4 71 16 +68db8 4 73 16 +68dbc 8 71 16 +68dc4 8 78 16 +68dcc c 86 16 +68dd8 4 90 16 +68ddc 4 92 16 +68de0 4 93 16 +68de4 4 66 16 +68de8 4 90 16 +68dec 8 92 16 +68df4 4 98 16 +68df8 4 3104 97 +68dfc 4 98 16 +68e00 4 99 16 +68e04 14 3104 97 +68e18 4 3104 97 +68e1c c 3104 97 +68e28 8 100 16 +68e30 4 102 16 +68e34 8 103 16 +68e3c 10 105 16 +68e4c 18 2979 97 +68e64 4 2979 97 +68e68 8 2979 97 +68e70 c 187 23 +68e7c c 187 23 +68e88 c 192 23 +68e94 4 193 23 +68e98 4 194 23 +68e9c 4 193 23 +68ea0 18 194 23 +68eb8 8 198 23 +68ec0 4 199 23 +68ec4 4 200 23 +68ec8 4 199 23 +68ecc 18 200 23 +68ee4 4 261 23 +68ee8 4 268 23 +68eec 4 270 23 +68ef0 14 177 23 +68f04 8 178 23 +68f0c 14 179 23 +68f20 10 180 23 +68f30 10 118 16 +68f40 8 117 16 +68f48 8 118 16 +68f50 20 271 23 +FUNC 68f70 30 0 google_breakpad::LinuxPtraceDumper::LinuxPtraceDumper +68f70 c 106 23 +68f7c 4 106 23 +68f80 14 108 23 +68f94 c 109 23 +FUNC 68fa0 110 0 std::priv::_Impl_vector >::_M_insert_overflow +68fa0 1c 108 138 +68fbc 4 108 138 +68fc0 8 192 139 +68fc8 c 108 138 +68fd4 8 192 139 +68fdc 10 173 139 +68fec 14 41 138 +69000 4 175 139 +69004 10 176 139 +69014 4 177 139 +69018 14 172 54 +6902c 4 112 138 +69030 4 172 54 +69034 8 224 100 +6903c 8 224 100 +69044 4 224 100 +69048 4 172 54 +6904c 8 480 100 +69054 14 481 100 +69068 4 115 138 +6906c 4 223 100 +69070 8 224 100 +69078 c 224 100 +69084 4 224 100 +69088 4 118 138 +6908c 4 666 139 +69090 4 667 139 +69094 4 668 139 +69098 18 119 138 +FUNC 690b0 240 0 google_breakpad::LinuxPtraceDumper::EnumerateThreads +690b0 4 307 23 +690b4 4 309 23 +690b8 1c 307 23 +690d4 10 309 23 +690e4 4 307 23 +690e8 14 309 23 +690fc 8 310 23 +69104 24 3281 97 +69128 4 3281 97 +6912c 4 3281 97 +69130 8 3281 97 +69138 4 3281 97 +6913c 4 313 23 +69140 8 208 54 +69148 4 322 23 +6914c 4 323 23 +69150 4 208 54 +69154 4 319 23 +69158 4 208 54 +6915c 8 51 14 +69164 4 322 23 +69168 4 323 23 +6916c 4 324 23 +69170 4 386 139 +69174 4 65 14 +69178 4 63 14 +6917c 4 65 14 +69180 20 3016 97 +691a0 4 3016 97 +691a4 c 3016 97 +691b0 8 68 14 +691b8 4 70 14 +691bc c 71 14 +691c8 c 73 14 +691d4 8 77 14 +691dc 8 77 14 +691e4 4 82 14 +691e8 10 322 23 +691f8 c 323 23 +69204 4 322 23 +69208 8 325 23 +69210 8 324 23 +69218 c 325 23 +69224 4 326 23 +69228 c 325 23 +69234 8 87 14 +6923c 4 93 14 +69240 c 94 14 +6924c 8 93 14 +69254 c 94 14 +69260 14 380 139 +69274 4 126 103 +69278 10 382 139 +69288 1c 386 139 +692a4 1c 2979 97 +692c0 4 2979 97 +692c4 8 2979 97 +692cc 24 336 23 +FUNC 692f0 154 0 std::priv::_Impl_vector >::_M_fill_insert_aux +692f0 14 140 138 +69304 8 140 138 +6930c 4 416 139 +69310 c 140 138 +6931c 8 416 139 +69324 8 416 139 +6932c 8 150 138 +69334 8 152 138 +6933c 8 153 138 +69344 8 107 137 +6934c 14 106 137 +69360 4 154 138 +69364 4 255 100 +69368 4 256 100 +6936c 8 154 138 +69374 4 256 100 +69378 c 256 100 +69384 c 442 100 +69390 8 442 100 +69398 10 443 100 +693a8 4 158 138 +693ac 4 249 137 +693b0 8 314 137 +693b8 8 249 137 +693c0 c 249 137 +693cc c 146 103 +693d8 4 158 138 +693dc 8 107 137 +693e4 c 106 137 +693f0 14 160 138 +69404 8 442 100 +6940c 10 443 100 +6941c c 146 138 +69428 8 147 138 +69430 14 163 138 +FUNC 69444 1a4 0 google_breakpad::LinuxPtraceDumper::ThreadsSuspend +69444 18 277 23 +6945c 10 278 23 +6946c 1c 192 139 +69488 8 280 23 +69490 4 202 139 +69494 4 281 23 +69498 4 65 23 +6949c 4 66 23 +694a0 8 65 23 +694a8 14 66 23 +694bc 4 67 23 +694c0 4 66 23 +694c4 24 3272 97 +694e8 8 3272 97 +694f0 c 71 23 +694fc 18 72 23 +69514 10 70 23 +69524 4 192 139 +69528 4 202 139 +6952c 4 286 23 +69530 4 192 139 +69534 4 286 23 +69538 4 286 23 +6953c 8 286 23 +69544 4 287 23 +69548 10 192 139 +69558 8 640 139 +69560 4 641 139 +69564 8 630 139 +6956c 8 615 139 +69574 c 172 138 +69580 4 173 138 +69584 8 172 138 +6958c 10 173 138 +6959c 14 176 138 +695b0 4 288 23 +695b4 8 280 23 +695bc 4 292 23 +695c0 4 291 23 +695c4 4 292 23 +695c8 4 291 23 +695cc 1c 293 23 +FUNC 695e8 44 0 sys_read +695e8 10 3104 97 +695f8 14 3104 97 +6960c 4 3104 97 +69610 4 3104 97 +69614 8 3104 97 +6961c 10 3104 97 +FUNC 6962c 78 0 MinidumpWriter::Init +6962c c 144 26 +69638 4 144 26 +6963c 18 145 26 +69654 8 146 26 +6965c 10 148 26 +6966c 8 149 26 +69674 10 150 26 +69684 14 153 26 +69698 c 154 26 +FUNC 696a4 50 0 sys_open +696a4 4 3961 97 +696a8 4 3281 97 +696ac c 3961 97 +696b8 1c 3281 97 +696d4 4 3281 97 +696d8 4 3281 97 +696dc 8 3281 97 +696e4 10 3963 97 +FUNC 696f4 184 0 MinidumpWriter::FillRawModule +696f4 20 534 26 +69714 4 539 26 +69718 4 534 26 +6971c 8 539 26 +69724 c 534 26 +69730 4 548 26 +69734 4 534 26 +69738 4 539 26 +6973c 4 541 26 +69740 4 548 26 +69744 4 541 26 +69748 4 552 26 +6974c 8 542 26 +69754 c 548 26 +69760 8 552 26 +69768 c 554 26 +69774 10 558 26 +69784 c 560 26 +69790 8 566 26 +69798 4 569 26 +6979c 4 560 26 +697a0 14 566 26 +697b4 4 161 33 +697b8 4 566 26 +697bc c 568 26 +697c8 4 161 33 +697cc 4 570 26 +697d0 4 161 33 +697d4 8 570 26 +697dc 8 161 33 +697e4 c 570 26 +697f0 8 571 26 +697f8 10 574 26 +69808 14 186 33 +6981c 8 176 33 +69824 4 580 26 +69828 4 176 33 +6982c 4 577 26 +69830 c 580 26 +6983c 14 580 26 +69850 4 580 26 +69854 8 582 26 +6985c 1c 584 26 +FUNC 69878 48 0 MinidumpWriter::~MinidumpWriter +69878 c 156 26 +69884 4 159 26 +69888 4 156 26 +6988c c 159 26 +69898 8 160 26 +698a0 10 161 26 +698b0 4 156 26 +698b4 8 162 26 +698bc 4 156 26 +FUNC 698c0 ec 0 MinidumpWriter::WriteExceptionStream +698c0 4 611 26 +698c4 4 212 33 +698c8 c 611 26 +698d4 4 161 33 +698d8 4 612 26 +698dc 4 611 26 +698e0 4 161 33 +698e4 4 212 33 +698e8 4 161 33 +698ec 4 611 26 +698f0 4 161 33 +698f4 4 611 26 +698f8 8 212 33 +69900 4 161 33 +69904 4 212 33 +69908 4 46 31 +6990c 4 47 31 +69910 4 46 31 +69914 10 47 31 +69924 4 613 26 +69928 10 615 26 +69938 8 617 26 +69940 8 176 33 +69948 c 618 26 +69954 8 620 26 +6995c c 621 26 +69968 4 622 26 +6996c 8 623 26 +69974 c 216 33 +69980 14 92 31 +69994 18 626 26 +FUNC 699ac 18 0 google_breakpad::TypedMDRVA::CopyIndex +699ac 4 76 31 +699b0 14 76 31 +FUNC 699c4 28 0 google_breakpad::TypedMDRVA::~TypedMDRVA +699c4 4 214 33 +699c8 c 216 33 +699d4 14 92 31 +699e8 4 218 33 +FUNC 699ec 14 0 google_breakpad::TypedMDRVA::CopyIndexAfterObject +699ec 14 87 31 +FUNC 69a00 120 0 MinidumpWriter::WriteMemoryListStream +69a00 10 586 26 +69a10 4 587 26 +69a14 4 586 26 +69a18 4 192 139 +69a1c 8 161 33 +69a24 4 586 26 +69a28 8 161 33 +69a30 8 192 139 +69a38 4 161 33 +69a3c 4 192 139 +69a40 4 212 33 +69a44 4 192 139 +69a48 4 588 26 +69a4c 4 67 31 +69a50 4 68 31 +69a54 4 67 31 +69a58 c 68 31 +69a64 4 589 26 +69a68 8 599 26 +69a70 8 176 33 +69a78 8 600 26 +69a80 4 192 139 +69a84 4 604 26 +69a88 c 192 139 +69a94 4 602 26 +69a98 4 604 26 +69a9c 8 591 26 +69aa4 4 46 31 +69aa8 4 47 31 +69aac 4 46 31 +69ab0 8 47 31 +69ab8 c 192 139 +69ac4 8 604 26 +69acc 10 606 26 +69adc 4 604 26 +69ae0 8 606 26 +69ae8 4 608 26 +69aec c 216 33 +69af8 14 92 31 +69b0c 14 609 26 +FUNC 69b20 2c8 0 MinidumpWriter::WriteMappings +69b20 18 481 26 +69b38 8 481 26 +69b40 4 317 114 +69b44 4 482 26 +69b48 4 483 26 +69b4c 14 192 139 +69b60 4 318 114 +69b64 8 319 114 +69b6c 4 91 116 +69b70 8 320 114 +69b78 4 485 26 +69b7c c 485 26 +69b88 4 486 26 +69b8c 8 449 26 +69b94 8 449 26 +69b9c 8 452 26 +69ba4 4 453 26 +69ba8 c 452 26 +69bb4 8 463 26 +69bbc 10 468 26 +69bcc 4 470 26 +69bd0 4 469 26 +69bd4 4 470 26 +69bd8 8 468 26 +69be0 8 91 116 +69be8 4 488 26 +69bec 8 485 26 +69bf4 4 491 26 +69bf8 14 161 33 +69c0c 4 212 33 +69c10 4 492 26 +69c14 4 67 31 +69c18 4 68 31 +69c1c 4 67 31 +69c20 8 68 31 +69c28 c 68 31 +69c34 4 493 26 +69c38 8 502 26 +69c40 4 176 33 +69c44 4 508 26 +69c48 4 176 33 +69c4c 4 514 26 +69c50 8 503 26 +69c58 4 507 26 +69c5c 4 504 26 +69c60 4 508 26 +69c64 8 494 26 +69c6c 4 46 31 +69c70 4 47 31 +69c74 4 46 31 +69c78 c 47 31 +69c84 8 509 26 +69c8c c 449 26 +69c98 10 508 26 +69ca8 8 449 26 +69cb0 8 452 26 +69cb8 4 453 26 +69cbc 10 452 26 +69ccc 8 523 26 +69cd4 c 519 26 +69ce0 20 523 26 +69d00 4 523 26 +69d04 1c 525 26 +69d20 8 91 116 +69d28 4 528 26 +69d2c c 216 33 +69d38 20 92 31 +69d58 8 463 26 +69d60 10 468 26 +69d70 4 470 26 +69d74 4 469 26 +69d78 4 470 26 +69d7c 8 468 26 +69d84 8 91 116 +69d8c 20 514 26 +69dac 20 516 26 +69dcc 1c 529 26 +FUNC 69de8 28 0 google_breakpad::TypedMDRVA::~TypedMDRVA +69de8 4 214 33 +69dec c 216 33 +69df8 14 92 31 +69e0c 4 218 33 +FUNC 69e10 b8 0 std::priv::_Impl_vector >::reserve +69e10 14 62 138 +69e24 c 199 139 +69e30 c 63 138 +69e3c c 64 138 +69e48 c 41 138 +69e54 8 192 139 +69e5c 8 172 54 +69e64 8 192 139 +69e6c 4 70 138 +69e70 4 172 54 +69e74 4 84 137 +69e78 8 86 137 +69e80 4 139 103 +69e84 8 139 103 +69e8c 4 88 137 +69e90 4 89 137 +69e94 8 86 137 +69e9c 4 172 54 +69ea0 8 76 138 +69ea8 4 666 139 +69eac 4 667 139 +69eb0 4 668 139 +69eb4 14 78 138 +FUNC 69ec8 17c 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +69ec8 14 81 138 +69edc 8 81 138 +69ee4 10 192 139 +69ef4 10 173 139 +69f04 14 41 138 +69f18 4 175 139 +69f1c 10 176 139 +69f2c 4 177 139 +69f30 18 172 54 +69f48 4 84 137 +69f4c 8 91 138 +69f54 10 86 137 +69f64 8 86 137 +69f6c 4 139 103 +69f70 8 139 103 +69f78 4 88 137 +69f7c 4 89 137 +69f80 10 86 137 +69f90 c 93 138 +69f9c 4 119 103 +69fa0 8 119 103 +69fa8 8 95 138 +69fb0 8 314 137 +69fb8 4 249 137 +69fbc 8 249 137 +69fc4 4 139 103 +69fc8 8 139 103 +69fd0 c 249 137 +69fdc 4 98 138 +69fe0 c 86 137 +69fec 4 84 137 +69ff0 4 86 137 +69ff4 8 86 137 +69ffc 4 139 103 +6a000 8 139 103 +6a008 4 88 137 +6a00c 4 89 137 +6a010 14 86 137 +6a024 4 104 138 +6a028 4 666 139 +6a02c 4 667 139 +6a030 4 668 139 +6a034 10 105 138 +FUNC 6a044 54 0 std::priv::_Impl_vector >::push_back +6a044 10 376 139 +6a054 10 380 139 +6a064 4 119 103 +6a068 8 119 103 +6a070 10 382 139 +6a080 10 162 139 +6a090 8 388 139 +FUNC 6a098 124 0 MinidumpWriter::FillThreadStack +6a098 14 256 26 +6a0ac 4 256 26 +6a0b0 4 258 26 +6a0b4 c 256 26 +6a0c0 10 261 26 +6a0d0 4 256 26 +6a0d4 c 261 26 +6a0e0 4 262 26 +6a0e4 10 161 33 +6a0f4 4 263 26 +6a0f8 c 263 26 +6a104 4 265 26 +6a108 18 267 26 +6a120 4 100 22 +6a124 c 772 26 +6a130 4 269 26 +6a134 4 772 26 +6a138 1c 271 26 +6a154 14 186 33 +6a168 4 274 26 +6a16c 4 173 143 +6a170 4 274 26 +6a174 8 176 33 +6a17c 8 275 26 +6a184 c 173 143 +6a190 4 278 26 +6a194 4 282 26 +6a198 8 279 26 +6a1a0 4 280 26 +6a1a4 18 283 26 +FUNC 6a1bc 4c8 0 MinidumpWriter::WriteThreadListStream +6a1bc 2c 286 26 +6a1e8 4 286 26 +6a1ec 4 287 26 +6a1f0 4 286 26 +6a1f4 4 161 33 +6a1f8 4 289 26 +6a1fc 4 161 33 +6a200 4 67 31 +6a204 8 192 139 +6a20c 4 161 33 +6a210 4 192 139 +6a214 4 68 31 +6a218 4 192 139 +6a21c 8 161 33 +6a224 4 290 26 +6a228 4 212 33 +6a22c 4 68 31 +6a230 4 68 31 +6a234 4 67 31 +6a238 c 68 31 +6a244 4 290 26 +6a248 c 176 33 +6a254 4 303 26 +6a258 4 293 26 +6a25c 4 294 26 +6a260 4 296 26 +6a264 4 304 26 +6a268 4 287 26 +6a26c 4 303 26 +6a270 8 304 26 +6a278 8 308 26 +6a280 10 310 26 +6a290 4 161 33 +6a294 4 313 26 +6a298 4 315 26 +6a29c 4 388 26 +6a2a0 4 396 26 +6a2a4 4 212 33 +6a2a8 10 313 26 +6a2b8 14 315 26 +6a2cc 14 316 26 +6a2e0 4 323 26 +6a2e4 4 316 26 +6a2e8 8 323 26 +6a2f0 8 322 26 +6a2f8 14 324 26 +6a30c 4 323 26 +6a310 20 388 26 +6a330 c 393 26 +6a33c 4 393 26 +6a340 4 394 26 +6a344 4 393 26 +6a348 18 396 26 +6a360 8 395 26 +6a368 c 216 33 +6a374 18 92 31 +6a38c 8 392 26 +6a394 4 161 33 +6a398 4 212 33 +6a39c 4 161 33 +6a3a0 4 212 33 +6a3a4 4 161 33 +6a3a8 4 212 33 +6a3ac 4 161 33 +6a3b0 4 212 33 +6a3b4 4 46 31 +6a3b8 4 47 31 +6a3bc 4 46 31 +6a3c0 c 47 31 +6a3cc 4 400 26 +6a3d0 c 401 26 +6a3dc 10 402 26 +6a3ec c 403 26 +6a3f8 8 404 26 +6a400 c 405 26 +6a40c 8 407 26 +6a414 8 176 33 +6a41c 4 407 26 +6a420 8 406 26 +6a428 10 407 26 +6a438 8 408 26 +6a440 14 409 26 +6a454 10 413 26 +6a464 8 123 22 +6a46c c 415 26 +6a478 18 418 26 +6a490 c 326 26 +6a49c 1c 327 26 +6a4b8 8 332 26 +6a4c0 4 338 26 +6a4c4 4 338 26 +6a4c8 10 192 139 +6a4d8 c 338 26 +6a4e4 4 339 26 +6a4e8 c 340 26 +6a4f4 8 341 26 +6a4fc 8 340 26 +6a504 4 347 26 +6a508 c 349 26 +6a514 4 347 26 +6a518 4 350 26 +6a51c 4 161 33 +6a520 4 350 26 +6a524 10 161 33 +6a534 4 352 26 +6a538 4 161 33 +6a53c 4 359 26 +6a540 4 352 26 +6a544 c 359 26 +6a550 4 100 22 +6a554 10 772 26 +6a564 24 367 26 +6a588 18 186 33 +6a5a0 c 176 33 +6a5ac 4 173 143 +6a5b0 4 369 26 +6a5b4 c 173 143 +6a5c0 8 338 26 +6a5c8 4 161 33 +6a5cc 4 212 33 +6a5d0 4 161 33 +6a5d4 4 212 33 +6a5d8 4 161 33 +6a5dc 4 212 33 +6a5e0 4 161 33 +6a5e4 4 212 33 +6a5e8 4 46 31 +6a5ec 4 47 31 +6a5f0 4 46 31 +6a5f4 c 47 31 +6a600 4 374 26 +6a604 10 376 26 +6a614 10 378 26 +6a624 8 382 26 +6a62c c 383 26 +6a638 8 176 33 +6a640 8 384 26 +6a648 c 385 26 +6a654 30 422 26 +FUNC 6a684 f4 0 MinidumpWriter::WriteAppMemory +6a684 18 425 26 +6a69c 4 425 26 +6a6a0 4 161 33 +6a6a4 8 434 26 +6a6ac 4 440 26 +6a6b0 8 173 143 +6a6b8 c 426 26 +6a6c4 4 100 22 +6a6c8 10 430 26 +6a6d8 4 432 26 +6a6dc 8 432 26 +6a6e4 4 432 26 +6a6e8 10 432 26 +6a6f8 8 161 33 +6a700 4 435 26 +6a704 4 161 33 +6a708 4 435 26 +6a70c 4 161 33 +6a710 8 435 26 +6a718 4 435 26 +6a71c 14 186 33 +6a730 4 440 26 +6a734 4 176 33 +6a738 4 440 26 +6a73c 8 176 33 +6a744 4 173 143 +6a748 4 441 26 +6a74c 8 173 143 +6a754 8 91 116 +6a75c 4 445 26 +6a760 18 446 26 +FUNC 6a778 130 0 std::priv::_Impl_vector >::_M_fill_insert_aux +6a778 14 140 138 +6a78c c 140 138 +6a798 4 416 139 +6a79c 8 140 138 +6a7a4 8 416 139 +6a7ac 8 416 139 +6a7b4 4 150 138 +6a7b8 8 152 138 +6a7c0 4 153 138 +6a7c4 8 107 137 +6a7cc 14 106 137 +6a7e0 4 154 138 +6a7e4 4 255 100 +6a7e8 4 256 100 +6a7ec 8 154 138 +6a7f4 4 256 100 +6a7f8 c 256 100 +6a804 10 471 100 +6a814 4 158 138 +6a818 c 314 137 +6a824 c 249 137 +6a830 c 146 103 +6a83c 4 158 138 +6a840 8 107 137 +6a848 c 106 137 +6a854 4 160 138 +6a858 4 471 100 +6a85c 8 160 138 +6a864 8 471 100 +6a86c 10 163 138 +6a87c 4 471 100 +6a880 c 146 138 +6a88c 8 147 138 +6a894 14 163 138 +FUNC 6a8a8 130 0 std::priv::_Impl_vector >::resize +6a8a8 18 636 139 +6a8c0 8 636 139 +6a8c8 c 192 139 +6a8d4 8 640 139 +6a8dc 4 641 139 +6a8e0 8 630 139 +6a8e8 8 615 139 +6a8f0 8 171 138 +6a8f8 14 172 138 +6a90c 18 173 138 +6a924 c 173 139 +6a930 10 41 138 +6a940 8 172 54 +6a948 4 175 139 +6a94c 8 177 139 +6a954 c 172 54 +6a960 4 112 138 +6a964 4 172 54 +6a968 8 224 100 +6a970 8 224 100 +6a978 4 224 100 +6a97c c 471 100 +6a988 4 503 100 +6a98c 4 471 100 +6a990 4 223 100 +6a994 4 503 100 +6a998 8 224 100 +6a9a0 c 224 100 +6a9ac 4 224 100 +6a9b0 4 118 138 +6a9b4 4 666 139 +6a9b8 4 667 139 +6a9bc 4 668 139 +6a9c0 18 644 139 +FUNC 6a9d8 d08 0 MinidumpWriter::Dump +6a9d8 4 164 26 +6a9dc 4 47 31 +6a9e0 14 164 26 +6a9f4 4 169 26 +6a9f8 8 164 26 +6aa00 8 161 33 +6aa08 4 169 26 +6aa0c 8 164 26 +6aa14 8 161 33 +6aa1c 4 164 26 +6aa20 4 161 33 +6aa24 4 46 31 +6aa28 4 161 33 +6aa2c 8 164 26 +6aa34 4 161 33 +6aa38 1c 212 33 +6aa54 4 161 33 +6aa58 4 47 31 +6aa5c 4 161 33 +6aa60 10 212 33 +6aa70 4 46 31 +6aa74 8 47 31 +6aa7c 4 171 26 +6aa80 8 172 26 +6aa88 8 60 31 +6aa90 8 59 31 +6aa98 8 60 31 +6aaa0 4 173 26 +6aaa4 c 175 26 +6aab0 4 186 26 +6aab4 4 175 26 +6aab8 c 177 26 +6aac4 8 178 26 +6aacc 8 179 26 +6aad4 4 179 26 +6aad8 8 180 26 +6aae0 4 181 26 +6aae4 4 186 26 +6aae8 4 181 26 +6aaec 10 186 26 +6aafc 10 188 26 +6ab0c 14 190 26 +6ab20 10 192 26 +6ab30 10 194 26 +6ab40 14 197 26 +6ab54 10 199 26 +6ab64 14 201 26 +6ab78 c 203 26 +6ab84 4 161 33 +6ab88 4 212 33 +6ab8c 4 203 26 +6ab90 4 161 33 +6ab94 4 47 31 +6ab98 4 161 33 +6ab9c 4 47 31 +6aba0 8 161 33 +6aba8 10 212 33 +6abb8 4 46 31 +6abbc c 47 31 +6abc8 4 630 26 +6abcc c 632 26 +6abd8 4 896 26 +6abdc 4 51 12 +6abe0 4 632 26 +6abe4 4 176 33 +6abe8 4 634 26 +6abec 4 176 33 +6abf0 4 896 26 +6abf4 4 634 26 +6abf8 4 896 26 +6abfc 4 176 33 +6ac00 4 896 26 +6ac04 4 635 26 +6ac08 8 896 26 +6ac10 4 946 26 +6ac14 8 933 26 +6ac1c 4 947 26 +6ac20 4 51 12 +6ac24 4 947 26 +6ac28 8 51 12 +6ac30 4 945 26 +6ac34 4 948 26 +6ac38 4 51 12 +6ac3c 4 949 26 +6ac40 14 51 12 +6ac54 10 959 26 +6ac64 4 960 26 +6ac68 c 961 26 +6ac74 8 962 26 +6ac7c 10 964 26 +6ac8c 4 965 26 +6ac90 c 966 26 +6ac9c 8 967 26 +6aca4 4 114 12 +6aca8 10 115 12 +6acb8 4 114 12 +6acbc 10 114 12 +6accc 4 122 12 +6acd0 4 121 12 +6acd4 8 122 12 +6acdc 14 121 12 +6acf0 4 973 26 +6acf4 10 983 26 +6ad04 4 984 26 +6ad08 4 64 54 +6ad0c 4 67 54 +6ad10 4 208 54 +6ad14 4 67 54 +6ad18 4 208 54 +6ad1c c 67 54 +6ad28 8 208 54 +6ad30 8 48 29 +6ad38 4 995 26 +6ad3c 4 49 16 +6ad40 8 995 26 +6ad48 8 49 16 +6ad50 8 1050 26 +6ad58 4 49 16 +6ad5c 4 1050 26 +6ad60 c 1061 26 +6ad6c 18 995 26 +6ad84 14 1000 26 +6ad98 8 1002 26 +6ada0 c 1005 26 +6adac c 1005 26 +6adb8 10 1006 26 +6adc8 4 1007 26 +6adcc 8 1008 26 +6add4 4 1007 26 +6add8 4 1008 26 +6addc 4 1007 26 +6ade0 8 1008 26 +6ade8 8 1010 26 +6adf0 8 1012 26 +6adf8 18 1015 26 +6ae10 8 1016 26 +6ae18 c 1018 26 +6ae24 10 996 26 +6ae34 14 1050 26 +6ae48 4 1051 26 +6ae4c 10 1054 26 +6ae5c 8 1055 26 +6ae64 8 1057 26 +6ae6c 14 1061 26 +6ae80 4 117 29 +6ae84 4 118 29 +6ae88 4 1066 26 +6ae8c 10 1069 26 +6ae9c 4 1070 26 +6aea0 c 1071 26 +6aeac 4 1072 26 +6aeb0 4 1073 26 +6aeb4 8 1072 26 +6aebc 8 1092 26 +6aec4 4 144 54 +6aec8 4 144 54 +6aecc 8 146 54 +6aed4 4 145 54 +6aed8 18 3074 97 +6aef0 4 3074 97 +6aef4 8 3074 97 +6aefc 8 1076 26 +6af04 8 1164 26 +6af0c 10 1170 26 +6af1c 8 1174 26 +6af24 4 1183 26 +6af28 4 1174 26 +6af2c 14 1182 26 +6af40 4 1195 26 +6af44 4 1182 26 +6af48 4 1195 26 +6af4c 8 1182 26 +6af54 4 1175 26 +6af58 4 1195 26 +6af5c 8 1184 26 +6af64 c 1187 26 +6af70 4 1188 26 +6af74 4 1191 26 +6af78 4 1191 26 +6af7c c 1191 26 +6af88 20 1205 26 +6afa8 c 1207 26 +6afb4 4 1194 26 +6afb8 10 1195 26 +6afc8 4 1196 26 +6afcc 4 1195 26 +6afd0 4 1196 26 +6afd4 10 1200 26 +6afe4 4 1199 26 +6afe8 4 1200 26 +6afec 8 1201 26 +6aff4 8 1184 26 +6affc c 216 33 +6b008 14 92 31 +6b01c 8 205 26 +6b024 10 207 26 +6b034 c 209 26 +6b040 8 210 26 +6b048 4 209 26 +6b04c 10 210 26 +6b05c 4 780 26 +6b060 4 781 26 +6b064 4 782 26 +6b068 14 212 26 +6b07c 8 214 26 +6b084 4 215 26 +6b088 4 214 26 +6b08c 8 215 26 +6b094 4 214 26 +6b098 c 215 26 +6b0a4 4 215 26 +6b0a8 4 780 26 +6b0ac 4 781 26 +6b0b0 4 782 26 +6b0b4 10 217 26 +6b0c4 c 219 26 +6b0d0 8 220 26 +6b0d8 4 219 26 +6b0dc 10 220 26 +6b0ec 4 780 26 +6b0f0 4 781 26 +6b0f4 4 782 26 +6b0f8 14 222 26 +6b10c 8 224 26 +6b114 4 225 26 +6b118 4 224 26 +6b11c 8 225 26 +6b124 4 224 26 +6b128 c 225 26 +6b134 4 225 26 +6b138 4 780 26 +6b13c 4 781 26 +6b140 4 782 26 +6b144 14 227 26 +6b158 8 229 26 +6b160 4 230 26 +6b164 4 229 26 +6b168 8 230 26 +6b170 4 229 26 +6b174 c 230 26 +6b180 4 230 26 +6b184 4 780 26 +6b188 4 781 26 +6b18c 4 782 26 +6b190 14 232 26 +6b1a4 8 234 26 +6b1ac 4 235 26 +6b1b0 4 234 26 +6b1b4 8 235 26 +6b1bc 4 234 26 +6b1c0 c 235 26 +6b1cc 4 235 26 +6b1d0 4 780 26 +6b1d4 4 781 26 +6b1d8 4 782 26 +6b1dc 14 237 26 +6b1f0 8 239 26 +6b1f8 4 240 26 +6b1fc 4 239 26 +6b200 8 240 26 +6b208 4 239 26 +6b20c c 240 26 +6b218 4 240 26 +6b21c 4 780 26 +6b220 4 781 26 +6b224 4 782 26 +6b228 10 242 26 +6b238 14 244 26 +6b24c 4 644 26 +6b250 4 646 26 +6b254 c 647 26 +6b260 4 646 26 +6b264 c 647 26 +6b270 4 651 26 +6b274 4 654 26 +6b278 4 657 26 +6b27c 4 655 26 +6b280 4 657 26 +6b284 8 657 26 +6b28c 4 657 26 +6b290 10 657 26 +6b2a0 c 660 26 +6b2ac 8 660 26 +6b2b4 c 661 26 +6b2c0 8 663 26 +6b2c8 4 664 26 +6b2cc c 655 26 +6b2d8 4 667 26 +6b2dc c 670 26 +6b2e8 4 675 26 +6b2ec 8 670 26 +6b2f4 18 682 26 +6b30c 8 682 26 +6b314 10 682 26 +6b324 10 683 26 +6b334 c 684 26 +6b340 4 686 26 +6b344 4 703 26 +6b348 c 703 26 +6b354 4 703 26 +6b358 10 703 26 +6b368 4 704 26 +6b36c 4 704 26 +6b370 4 706 26 +6b374 8 706 26 +6b37c 4 708 26 +6b380 4 706 26 +6b384 4 706 26 +6b388 4 706 26 +6b38c 8 706 26 +6b394 8 707 26 +6b39c 10 711 26 +6b3ac 4 712 26 +6b3b0 4 161 33 +6b3b4 4 60 31 +6b3b8 4 161 33 +6b3bc 4 60 31 +6b3c0 4 161 33 +6b3c4 4 59 31 +6b3c8 4 161 33 +6b3cc 4 59 31 +6b3d0 4 60 31 +6b3d4 4 161 33 +6b3d8 c 212 33 +6b3e4 8 60 31 +6b3ec 4 716 26 +6b3f0 4 176 33 +6b3f4 4 722 26 +6b3f8 4 735 26 +6b3fc 4 176 33 +6b400 8 722 26 +6b408 8 732 26 +6b410 8 722 26 +6b418 4 724 26 +6b41c 8 724 26 +6b424 4 724 26 +6b428 10 724 26 +6b438 4 725 26 +6b43c 8 726 26 +6b444 4 725 26 +6b448 8 726 26 +6b450 8 727 26 +6b458 4 729 26 +6b45c 4 729 26 +6b460 4 729 26 +6b464 10 729 26 +6b474 1c 732 26 +6b490 4 735 26 +6b494 4 76 31 +6b498 8 76 31 +6b4a0 8 735 26 +6b4a8 4 76 31 +6b4ac 4 736 26 +6b4b0 4 76 31 +6b4b4 4 736 26 +6b4b8 8 737 26 +6b4c0 18 76 31 +6b4d8 c 739 26 +6b4e4 c 717 26 +6b4f0 8 161 33 +6b4f8 4 744 26 +6b4fc 8 161 33 +6b504 8 212 33 +6b50c 4 744 26 +6b510 4 67 31 +6b514 4 68 31 +6b518 4 67 31 +6b51c 4 68 31 +6b520 10 212 33 +6b530 c 68 31 +6b53c 4 744 26 +6b540 c 746 26 +6b54c 4 67 139 +6b550 4 746 26 +6b554 4 752 26 +6b558 4 747 26 +6b55c 4 176 33 +6b560 8 747 26 +6b568 4 176 33 +6b56c 4 748 26 +6b570 8 750 26 +6b578 8 753 26 +6b580 4 754 26 +6b584 4 176 33 +6b588 4 754 26 +6b58c 4 63 138 +6b590 4 100 22 +6b594 4 751 26 +6b598 4 100 22 +6b59c 4 755 26 +6b5a0 8 67 139 +6b5a8 4 163 54 +6b5ac 4 481 101 +6b5b0 4 63 138 +6b5b4 8 172 54 +6b5bc 4 666 139 +6b5c0 4 667 139 +6b5c4 4 76 138 +6b5c8 4 668 139 +6b5cc c 222 143 +6b5d8 4 760 26 +6b5dc 4 222 143 +6b5e0 4 762 26 +6b5e4 8 762 26 +6b5ec 4 762 26 +6b5f0 10 762 26 +6b600 18 87 31 +6b618 c 216 33 +6b624 14 92 31 +6b638 8 245 26 +6b640 4 780 26 +6b644 4 781 26 +6b648 4 782 26 +6b64c 10 247 26 +6b65c 10 252 26 +6b66c c 216 33 +6b678 14 92 31 +6b68c c 216 33 +6b698 14 92 31 +6b6ac 34 254 26 +FUNC 6b6e0 148 0 WriteMinidumpImpl +6b6e0 c 1250 26 +6b6ec 4 1251 26 +6b6f0 18 1250 26 +6b708 8 1251 26 +6b710 8 1250 26 +6b718 c 1250 26 +6b724 4 1251 26 +6b728 4 1253 26 +6b72c 8 1254 26 +6b734 4 1255 26 +6b738 8 1254 26 +6b740 8 123 22 +6b748 8 127 22 +6b750 8 130 22 +6b758 4 138 26 +6b75c 8 138 26 +6b764 4 138 26 +6b768 4 138 26 +6b76c 4 138 26 +6b770 4 138 26 +6b774 4 138 26 +6b778 4 138 26 +6b77c 8 138 26 +6b784 10 138 26 +6b794 4 67 139 +6b798 8 138 26 +6b7a0 4 100 22 +6b7a4 4 153 143 +6b7a8 4 67 139 +6b7ac 4 100 22 +6b7b0 4 163 54 +6b7b4 4 153 143 +6b7b8 4 481 101 +6b7bc 4 153 143 +6b7c0 4 138 26 +6b7c4 4 1266 26 +6b7c8 4 138 26 +6b7cc 4 768 26 +6b7d0 c 1266 26 +6b7dc c 1268 26 +6b7e8 8 1263 26 +6b7f0 18 42 24 +6b808 20 1269 26 +FUNC 6b828 74 0 google_breakpad::WriteMinidump +6b828 14 1276 26 +6b83c 8 211 116 +6b844 4 1276 26 +6b848 14 1279 26 +6b85c 4 1276 26 +6b860 4 211 116 +6b864 4 212 116 +6b868 4 211 116 +6b86c 4 212 116 +6b870 8 1279 26 +6b878 10 205 116 +6b888 14 1280 26 +FUNC 6b89c 7c 0 google_breakpad::WriteMinidump +6b89c 14 1283 26 +6b8b0 8 211 116 +6b8b8 8 1283 26 +6b8c0 18 1286 26 +6b8d8 4 1283 26 +6b8dc 4 211 116 +6b8e0 4 212 116 +6b8e4 4 211 116 +6b8e8 4 212 116 +6b8ec 8 1286 26 +6b8f4 10 205 116 +6b904 14 1287 26 +FUNC 6b918 2c 0 google_breakpad::WriteMinidump +6b918 14 1305 26 +6b92c 18 1308 26 +FUNC 6b944 34 0 google_breakpad::WriteMinidump +6b944 18 1324 26 +6b95c 1c 1327 26 +FUNC 6b978 3c 0 google_breakpad::WriteMinidump +6b978 1c 1334 26 +6b994 20 1337 26 +FUNC 6b9b4 108 0 google_breakpad::WriteMinidump +6b9b4 c 1290 26 +6b9c0 4 1291 26 +6b9c4 8 1290 26 +6b9cc 4 1291 26 +6b9d0 4 1290 26 +6b9d4 4 211 116 +6b9d8 4 1290 26 +6b9dc 4 1291 26 +6b9e0 4 138 26 +6b9e4 4 130 22 +6b9e8 4 211 116 +6b9ec 4 127 22 +6b9f0 4 211 116 +6b9f4 4 212 116 +6b9f8 4 138 26 +6b9fc 4 130 22 +6ba00 4 127 22 +6ba04 4 138 26 +6ba08 4 211 116 +6ba0c 4 212 116 +6ba10 4 138 26 +6ba14 4 138 26 +6ba18 14 138 26 +6ba2c 4 100 22 +6ba30 4 153 143 +6ba34 4 67 139 +6ba38 4 100 22 +6ba3c 4 163 54 +6ba40 4 153 143 +6ba44 4 67 139 +6ba48 4 481 101 +6ba4c 4 153 143 +6ba50 4 138 26 +6ba54 4 205 116 +6ba58 4 138 26 +6ba5c c 205 116 +6ba68 10 1297 26 +6ba78 c 1299 26 +6ba84 8 1296 26 +6ba8c 18 42 24 +6baa4 18 1300 26 +FUNC 6babc 1c 0 google_breakpad::MinidumpFileWriter::MinidumpFileWriter +6babc 18 55 32 +6bad4 4 56 32 +FUNC 6bad8 58 0 google_breakpad::MinidumpFileWriter::Open +6bad8 4 63 32 +6badc 8 3281 97 +6bae4 8 63 32 +6baec 4 63 32 +6baf0 18 3281 97 +6bb08 4 3281 97 +6bb0c 4 3281 97 +6bb10 8 3281 97 +6bb18 4 71 32 +6bb1c 4 66 32 +6bb20 10 72 32 +FUNC 6bb30 c 0 google_breakpad::MinidumpFileWriter::SetFile +6bb30 4 76 32 +6bb34 4 77 32 +6bb38 4 78 32 +FUNC 6bb3c 7c 0 google_breakpad::MinidumpFileWriter::Close +6bb3c 4 80 32 +6bb40 4 81 32 +6bb44 8 80 32 +6bb4c 4 80 32 +6bb50 c 83 32 +6bb5c c 84 32 +6bb68 4 85 32 +6bb6c 4 84 32 +6bb70 18 2979 97 +6bb88 4 2979 97 +6bb8c 4 2979 97 +6bb90 8 2979 97 +6bb98 4 88 32 +6bb9c 4 92 32 +6bba0 4 88 32 +6bba4 4 92 32 +6bba8 10 96 32 +FUNC 6bbb8 10 0 google_breakpad::MinidumpFileWriter::~MinidumpFileWriter +6bbb8 8 59 32 +6bbc0 4 60 32 +6bbc4 4 61 32 +FUNC 6bbc8 80 0 google_breakpad::MinidumpFileWriter::Allocate +6bbc8 4 220 32 +6bbcc 4 223 32 +6bbd0 c 220 32 +6bbdc 4 220 32 +6bbe0 4 223 32 +6bbe4 14 225 32 +6bbf8 8 227 32 +6bc00 10 233 32 +6bc10 c 234 32 +6bc1c 4 235 32 +6bc20 4 234 32 +6bc24 4 237 32 +6bc28 4 240 32 +6bc2c 8 241 32 +6bc34 14 244 32 +FUNC 6bc48 ac 0 google_breakpad::MinidumpFileWriter::Copy +6bc48 4 246 32 +6bc4c 4 252 32 +6bc50 8 246 32 +6bc58 1c 252 32 +6bc74 20 3071 97 +6bc94 4 3071 97 +6bc98 8 3071 97 +6bca0 8 267 32 +6bca8 8 257 32 +6bcb0 20 3162 97 +6bcd0 4 3162 97 +6bcd4 4 3162 97 +6bcd8 8 3162 97 +6bce0 8 258 32 +6bce8 c 268 32 +FUNC 6bcf4 34 0 google_breakpad::UntypedMDRVA::Allocate +6bcf4 c 270 32 +6bd00 4 270 32 +6bd04 4 272 32 +6bd08 8 273 32 +6bd10 4 274 32 +6bd14 4 273 32 +6bd18 10 275 32 +FUNC 6bd28 8 0 google_breakpad::UntypedMDRVA::Copy +6bd28 8 281 32 +FUNC 6bd30 14 0 google_breakpad::TypedMDRVA::CopyIndexAfterObject +6bd30 14 87 31 +FUNC 6bd44 9c 0 google_breakpad::MinidumpFileWriter::CopyStringToMDString +6bd44 4 133 32 +6bd48 4 134 32 +6bd4c 14 133 32 +6bd60 c 133 32 +6bd6c 4 136 32 +6bd70 4 140 32 +6bd74 4 149 32 +6bd78 8 139 32 +6bd80 10 140 32 +6bd90 4 141 32 +6bd94 4 145 32 +6bd98 4 146 32 +6bd9c 4 149 32 +6bda0 8 151 32 +6bda8 4 149 32 +6bdac 4 151 32 +6bdb0 4 149 32 +6bdb4 4 151 32 +6bdb8 4 152 32 +6bdbc c 151 32 +6bdc8 18 155 32 +FUNC 6bde0 12c 0 google_breakpad::MinidumpFileWriter::WriteString +6bde0 4 199 32 +6bde4 8 167 32 +6bdec c 199 32 +6bdf8 4 167 32 +6bdfc c 199 32 +6be08 4 199 32 +6be0c 4 167 32 +6be10 c 168 32 +6be1c c 161 33 +6be28 4 67 31 +6be2c 4 173 32 +6be30 4 67 31 +6be34 4 68 31 +6be38 8 161 33 +6be40 4 68 31 +6be44 4 212 33 +6be48 4 68 31 +6be4c 4 212 33 +6be50 8 68 31 +6be58 10 173 32 +6be68 c 168 32 +6be74 4 177 32 +6be78 4 179 32 +6be7c 4 177 32 +6be80 14 179 32 +6be94 4 182 32 +6be98 8 174 32 +6bea0 4 183 32 +6bea4 c 184 32 +6beb0 4 183 32 +6beb4 8 184 32 +6bebc 4 186 32 +6bec0 c 176 33 +6becc 4 187 32 +6bed0 4 184 32 +6bed4 c 216 33 +6bee0 14 92 31 +6bef4 18 201 32 +FUNC 6bf0c 3c 0 google_breakpad::MemoryRange::Subrange +6bf0c 4 124 55 +6bf10 8 83 55 +6bf18 4 83 55 +6bf1c 10 83 55 +6bf2c 4 126 55 +6bf30 c 72 55 +6bf3c 8 50 55 +6bf44 4 127 55 +FUNC 6bf48 c 0 google_breakpad::ElfCoreDump::Note::GetHeader +6bf48 c 99 55 +FUNC 6bf54 1c 0 google_breakpad::ElfCoreDump::Note::IsValid +6bf54 8 46 38 +6bf5c 8 47 38 +6bf64 c 48 38 +FUNC 6bf70 24 0 google_breakpad::ElfCoreDump::Note::GetType +6bf70 8 54 38 +6bf78 4 55 38 +6bf7c 4 57 38 +6bf80 4 57 38 +6bf84 4 57 38 +6bf88 c 58 38 +FUNC 6bf94 40 0 google_breakpad::ElfCoreDump::Note::GetName +6bf94 c 60 38 +6bfa0 4 60 38 +6bfa4 8 61 38 +6bfac 4 62 38 +6bfb0 14 63 38 +6bfc4 4 65 38 +6bfc8 c 66 38 +FUNC 6bfd4 48 0 google_breakpad::ElfCoreDump::Note::GetDescription +6bfd4 c 68 38 +6bfe0 4 68 38 +6bfe4 8 69 38 +6bfec 4 70 38 +6bff0 4 72 38 +6bff4 8 72 38 +6bffc 4 92 38 +6c000 8 72 38 +6c008 4 72 38 +6c00c 4 74 38 +6c010 c 75 38 +FUNC 6c01c 58 0 google_breakpad::ElfCoreDump::Note::GetNextNote +6c01c c 77 38 +6c028 4 77 38 +6c02c 4 79 38 +6c030 4 80 38 +6c034 4 81 38 +6c038 4 82 38 +6c03c 4 84 38 +6c040 10 92 38 +6c050 4 84 38 +6c054 4 92 38 +6c058 c 84 38 +6c064 4 50 55 +6c068 c 87 38 +FUNC 6c074 c 0 google_breakpad::ElfCoreDump::ElfCoreDump +6c074 8 50 55 +6c07c 4 98 38 +FUNC 6c080 c 0 google_breakpad::ElfCoreDump::SetContent +6c080 8 105 38 +6c088 4 106 38 +FUNC 6c08c c 0 google_breakpad::ElfCoreDump::GetHeader +6c08c c 99 55 +FUNC 6c098 58 0 google_breakpad::ElfCoreDump::IsValid +6c098 8 108 38 +6c0a0 4 109 38 +6c0a4 4 116 38 +6c0a8 4 116 38 +6c0ac 18 114 38 +6c0c4 4 116 38 +6c0c8 4 114 38 +6c0cc 18 116 38 +6c0e4 c 118 38 +FUNC 6c0f0 48 0 google_breakpad::ElfCoreDump::GetProgramHeader +6c0f0 c 124 38 +6c0fc 8 124 38 +6c104 4 125 38 +6c108 4 126 38 +6c10c 4 128 38 +6c110 4 108 55 +6c114 4 109 55 +6c118 4 108 55 +6c11c 8 131 38 +6c124 8 109 55 +6c12c c 131 38 +FUNC 6c138 24 0 google_breakpad::ElfCoreDump::GetProgramHeaderCount +6c138 8 144 38 +6c140 4 145 38 +6c144 4 146 38 +6c148 4 146 38 +6c14c 4 146 38 +6c150 c 147 38 +FUNC 6c15c 60 0 google_breakpad::ElfCoreDump::GetFirstProgramHeaderOfType +6c15c 10 134 38 +6c16c 4 135 38 +6c170 8 134 38 +6c178 8 135 38 +6c180 8 135 38 +6c188 c 136 38 +6c194 c 137 38 +6c1a0 8 135 38 +6c1a8 4 141 38 +6c1ac 10 142 38 +FUNC 6c1bc c4 0 google_breakpad::ElfCoreDump::CopyData +6c1bc 18 149 38 +6c1d4 10 149 38 +6c1e4 c 150 38 +6c1f0 8 150 38 +6c1f8 c 151 38 +6c204 c 152 38 +6c210 4 155 38 +6c214 8 156 38 +6c21c 4 156 38 +6c220 4 155 38 +6c224 8 156 38 +6c22c 18 159 38 +6c244 4 160 38 +6c248 c 161 38 +6c254 8 162 38 +6c25c 8 150 38 +6c264 4 166 38 +6c268 18 167 38 +FUNC 6c280 44 0 google_breakpad::ElfCoreDump::GetFirstNote +6c280 4 169 38 +6c284 4 171 38 +6c288 8 169 38 +6c290 4 169 38 +6c294 8 171 38 +6c29c 4 172 38 +6c2a0 14 174 38 +6c2b4 4 50 55 +6c2b8 c 177 38 +FUNC 6c2c4 28 0 google_breakpad::IsValidElf +6c2c4 4 109 41 +6c2c8 8 111 41 +6c2d0 4 109 41 +6c2d4 4 111 41 +6c2d8 8 111 41 +6c2e0 c 112 41 +FUNC 6c2ec 1e8 0 google_breakpad::FindElfSection +6c2ec 8 126 41 +6c2f4 4 131 41 +6c2f8 4 132 41 +6c2fc 20 126 41 +6c31c 10 126 41 +6c32c 10 134 41 +6c33c 8 135 41 +6c344 4 118 41 +6c348 4 138 41 +6c34c 4 139 41 +6c350 8 145 41 +6c358 8 62 41 +6c360 4 42 40 +6c364 4 62 41 +6c368 4 42 40 +6c36c 4 70 41 +6c370 4 62 41 +6c374 4 70 41 +6c378 4 57 40 +6c37c 4 42 40 +6c380 4 65 41 +6c384 4 42 40 +6c388 4 65 41 +6c38c 4 57 40 +6c390 4 58 40 +6c394 4 63 40 +6c398 4 58 40 +6c39c 4 63 40 +6c3a0 c 61 40 +6c3ac 4 63 40 +6c3b0 4 62 40 +6c3b4 8 63 40 +6c3bc 4 62 40 +6c3c0 c 63 40 +6c3cc 8 65 40 +6c3d4 4 63 40 +6c3d8 c 61 40 +6c3e4 8 149 41 +6c3ec 4 42 40 +6c3f0 4 62 41 +6c3f4 4 42 40 +6c3f8 4 70 41 +6c3fc 4 62 41 +6c400 4 42 40 +6c404 4 65 41 +6c408 4 57 40 +6c40c 4 42 40 +6c410 4 57 40 +6c414 4 65 41 +6c418 4 57 40 +6c41c 8 58 40 +6c424 c 63 40 +6c430 8 61 40 +6c438 4 63 40 +6c43c 4 62 40 +6c440 8 63 40 +6c448 4 62 40 +6c44c c 63 40 +6c458 8 65 40 +6c460 c 63 40 +6c46c 8 72 41 +6c474 c 73 41 +6c480 8 74 41 +6c488 10 152 41 +6c498 8 72 41 +6c4a0 c 73 41 +6c4ac 8 74 41 +6c4b4 20 156 41 +FUNC 6c4d4 104 0 google_breakpad::FindElfSegment +6c4d4 c 162 41 +6c4e0 4 162 41 +6c4e4 4 167 41 +6c4e8 4 168 41 +6c4ec 8 162 41 +6c4f4 4 167 41 +6c4f8 4 168 41 +6c4fc 1c 170 41 +6c518 8 171 41 +6c520 4 118 41 +6c524 4 174 41 +6c528 4 175 41 +6c52c 8 181 41 +6c534 8 42 40 +6c53c 4 98 41 +6c540 8 42 40 +6c548 8 98 41 +6c550 10 99 41 +6c560 c 100 41 +6c56c 8 101 41 +6c574 8 185 41 +6c57c 4 42 40 +6c580 4 98 41 +6c584 c 98 41 +6c590 4 98 41 +6c594 8 98 41 +6c59c 10 99 41 +6c5ac c 100 41 +6c5b8 8 101 41 +6c5c0 c 188 41 +6c5cc c 192 41 +FUNC 6c5d8 ac 0 google_breakpad::FileID::FileID +6c5d8 14 51 42 +6c5ec 4 51 42 +6c5f0 4 112 132 +6c5f4 4 481 101 +6c5f8 c 229 140 +6c604 8 608 130 +6c60c c 600 130 +6c618 8 610 130 +6c620 4 347 101 +6c624 8 158 101 +6c62c 8 134 119 +6c634 8 158 101 +6c63c 4 613 130 +6c640 4 611 130 +6c644 4 613 130 +6c648 4 612 130 +6c64c 8 613 130 +6c654 8 107 137 +6c65c c 106 137 +6c668 4 107 137 +6c66c 4 380 131 +6c670 4 101 103 +6c674 10 51 42 +FUNC 6c684 220 0 google_breakpad::FileID::ElfFileIdentifierFromMappedFile +6c684 8 142 42 +6c68c 4 98 42 +6c690 8 142 42 +6c698 c 98 42 +6c6a4 4 142 42 +6c6a8 10 98 42 +6c6b8 4 142 42 +6c6bc 4 142 42 +6c6c0 8 98 42 +6c6c8 8 99 42 +6c6d0 8 98 42 +6c6d8 20 101 42 +6c6f8 4 99 42 +6c6fc 2c 124 42 +6c728 c 101 42 +6c734 8 124 42 +6c73c 4 126 42 +6c740 8 148 42 +6c748 c 106 42 +6c754 4 108 42 +6c758 8 64 42 +6c760 8 66 42 +6c768 c 67 42 +6c774 c 70 42 +6c780 14 71 42 +6c794 8 69 42 +6c79c 8 109 42 +6c7a4 4 111 42 +6c7a8 8 64 42 +6c7b0 8 66 42 +6c7b8 c 67 42 +6c7c4 c 70 42 +6c7d0 14 71 42 +6c7e4 8 69 42 +6c7ec 18 129 42 +6c804 c 130 42 +6c810 4 131 42 +6c814 c 132 42 +6c820 14 134 42 +6c834 8 133 42 +6c83c 8 135 42 +6c844 8 74 42 +6c84c 4 80 42 +6c850 8 83 42 +6c858 8 80 42 +6c860 4 83 42 +6c864 4 80 42 +6c868 4 83 42 +6c86c 4 80 42 +6c870 4 85 42 +6c874 c 84 42 +6c880 4 139 100 +6c884 8 84 42 +6c88c 4 87 42 +6c890 14 149 42 +FUNC 6c8a4 60 0 google_breakpad::FileID::ElfFileIdentifier +6c8a4 14 151 42 +6c8b8 4 152 42 +6c8bc 4 151 42 +6c8c0 14 152 42 +6c8d4 4 154 42 +6c8d8 4 153 42 +6c8dc c 156 42 +6c8e8 8 156 42 +6c8f0 14 157 42 +FUNC 6c904 d4 0 google_breakpad::FileID::ConvertIdentifierToString +6c904 4 161 42 +6c908 10 165 42 +6c918 4 167 42 +6c91c 4 169 42 +6c920 4 167 42 +6c924 4 169 42 +6c928 4 169 42 +6c92c 4 171 42 +6c930 4 174 42 +6c934 4 171 42 +6c938 4 181 42 +6c93c 4 173 42 +6c940 14 174 42 +6c954 4 177 42 +6c958 c 180 42 +6c964 8 177 42 +6c96c 4 178 42 +6c970 4 180 42 +6c974 8 181 42 +6c97c 8 183 42 +6c984 c 183 42 +6c990 4 184 42 +6c994 4 183 42 +6c998 4 184 42 +6c99c 4 183 42 +6c9a0 8 184 42 +6c9a8 4 184 42 +6c9ac 8 184 42 +6c9b4 8 184 42 +6c9bc 8 188 42 +6c9c4 8 188 42 +6c9cc 4 189 42 +6c9d0 4 188 42 +6c9d4 4 189 42 +FUNC 6c9d8 18 0 GUIDGenerator::InitOnceImpl +6c9d8 4 78 44 +6c9dc 4 79 44 +6c9e0 4 78 44 +6c9e4 4 79 44 +6c9e8 4 80 44 +6c9ec 4 79 44 +FUNC 6c9f0 8c 0 CreateGUID +6c9f0 4 87 44 +6c9f4 4 75 44 +6c9f8 8 87 44 +6ca00 4 87 44 +6ca04 10 75 44 +6ca14 8 65 44 +6ca1c 8 66 44 +6ca24 8 67 44 +6ca2c 4 68 44 +6ca30 4 58 44 +6ca34 4 57 44 +6ca38 4 58 44 +6ca3c 4 59 44 +6ca40 4 60 44 +6ca44 4 59 44 +6ca48 4 60 44 +6ca4c 4 69 44 +6ca50 4 58 44 +6ca54 4 57 44 +6ca58 4 58 44 +6ca5c 4 59 44 +6ca60 4 60 44 +6ca64 4 59 44 +6ca68 4 60 44 +6ca6c 10 89 44 +FUNC 6ca7c 98 0 GUIDToString +6ca7c 10 92 44 +6ca8c 4 92 44 +6ca90 4 51 44 +6ca94 c 52 44 +6caa0 8 53 44 +6caa8 4 51 44 +6caac 4 52 44 +6cab0 4 53 44 +6cab4 4 52 44 +6cab8 4 51 44 +6cabc c 98 44 +6cac8 4 51 44 +6cacc 8 98 44 +6cad4 4 52 44 +6cad8 18 98 44 +6caf0 4 99 44 +6caf4 4 100 44 +6caf8 4 99 44 +6cafc 4 102 44 +6cb00 4 103 44 +6cb04 10 104 44 +FUNC 6cb14 1c 0 my_strlen +6cb14 4 40 45 +6cb18 4 41 45 +6cb1c 8 42 45 +6cb24 8 42 45 +6cb2c 4 44 45 +FUNC 6cb30 38 0 my_strcmp +6cb30 4 46 45 +6cb34 10 48 45 +6cb44 8 50 45 +6cb4c 4 52 45 +6cb50 8 53 45 +6cb58 8 49 45 +6cb60 4 51 45 +6cb64 4 57 45 +FUNC 6cb68 4c 0 my_strncmp +6cb68 4 60 45 +6cb6c 8 60 45 +6cb74 10 61 45 +6cb84 4 63 45 +6cb88 4 65 45 +6cb8c 8 60 45 +6cb94 8 66 45 +6cb9c 8 62 45 +6cba4 8 64 45 +6cbac 4 66 45 +6cbb0 4 72 45 +FUNC 6cbb4 5c 0 my_strtoui +6cbb4 4 79 45 +6cbb8 4 80 45 +6cbbc 4 79 45 +6cbc0 4 86 45 +6cbc4 8 83 45 +6cbcc 4 87 45 +6cbd0 4 86 45 +6cbd4 c 87 45 +6cbe0 4 89 45 +6cbe4 8 90 45 +6cbec 4 82 45 +6cbf0 8 92 45 +6cbf8 4 94 45 +6cbfc 8 95 45 +6cc04 4 80 45 +6cc08 8 96 45 +FUNC 6cc10 24 0 my_uint_len +6cc10 4 101 45 +6cc14 8 100 45 +6cc1c 8 106 45 +6cc24 4 105 45 +6cc28 4 104 45 +6cc2c 8 110 45 +FUNC 6cc34 28 0 my_uitos +6cc34 4 120 45 +6cc38 4 119 45 +6cc3c 14 120 45 +6cc50 8 119 45 +6cc58 4 121 45 +FUNC 6cc5c 28 0 my_strchr +6cc5c 4 123 45 +6cc60 8 124 45 +6cc68 8 124 45 +6cc70 8 125 45 +6cc78 8 126 45 +6cc80 4 129 45 +FUNC 6cc84 28 0 my_strrchr +6cc84 4 131 45 +6cc88 4 132 45 +6cc8c 8 133 45 +6cc94 8 134 45 +6cc9c 8 136 45 +6cca4 8 139 45 +FUNC 6ccac 28 0 my_memchr +6ccac 4 143 45 +6ccb0 8 144 45 +6ccb8 c 145 45 +6ccc4 8 144 45 +6cccc 4 148 45 +6ccd0 4 149 45 +FUNC 6ccd4 6c 0 my_read_hex_ptr +6ccd4 4 156 45 +6ccd8 14 159 45 +6ccec c 161 45 +6ccf8 10 162 45 +6cd08 8 164 45 +6cd10 10 165 45 +6cd20 c 167 45 +6cd2c 4 158 45 +6cd30 4 174 45 +6cd34 4 173 45 +6cd38 8 175 45 +FUNC 6cd40 38 0 my_read_decimal_ptr +6cd40 4 178 45 +6cd44 4 182 45 +6cd48 14 181 45 +6cd5c 4 183 45 +6cd60 4 180 45 +6cd64 4 183 45 +6cd68 4 189 45 +6cd6c 4 188 45 +6cd70 8 190 45 +FUNC 6cd78 20 0 my_memset +6cd78 4 192 45 +6cd7c c 194 45 +6cd88 c 195 45 +6cd94 4 196 45 +FUNC 6cd98 3c 0 my_strlcpy +6cd98 4 198 45 +6cd9c 4 200 45 +6cda0 4 199 45 +6cda4 8 202 45 +6cdac c 203 45 +6cdb8 8 204 45 +6cdc0 8 207 45 +6cdc8 4 209 45 +6cdcc 4 210 45 +6cdd0 4 213 45 +FUNC 6cdd4 4c 0 my_strlcat +6cdd4 c 215 45 +6cde0 4 216 45 +6cde4 8 218 45 +6cdec 8 218 45 +6cdf4 10 219 45 +6ce04 10 224 45 +6ce14 c 225 45 +FUNC 6ce20 48 0 my_isspace +6ce20 4 229 45 +6ce24 4 227 45 +6ce28 c 229 45 +6ce34 4 230 45 +6ce38 10 231 45 +6ce48 4 230 45 +6ce4c 8 230 45 +6ce54 8 234 45 +6ce5c 4 232 45 +6ce60 8 235 45 +FUNC 6ce68 44 0 sys_close +6ce68 10 2979 97 +6ce78 14 2979 97 +6ce8c 4 2979 97 +6ce90 4 2979 97 +6ce94 8 2979 97 +6ce9c 10 2979 97 +FUNC 6ceac c 0 google_breakpad::MemoryMappedFile::MemoryMappedFile +6ceac 8 50 55 +6ceb4 4 47 47 +FUNC 6ceb8 50 0 google_breakpad::MemoryMappedFile::Unmap +6ceb8 c 106 47 +6cec4 8 106 47 +6cecc 4 107 47 +6ced0 18 3074 97 +6cee8 4 3074 97 +6ceec 8 3074 97 +6cef4 4 70 55 +6cef8 4 72 55 +6cefc c 111 47 +FUNC 6cf08 4 0 google_breakpad::MemoryMappedFile::~MemoryMappedFile +6cf08 4 54 47 +FUNC 6cf0c 13c 0 google_breakpad::MemoryMappedFile::Map +6cf0c 20 57 47 +6cf2c 4 58 47 +6cf30 24 3281 97 +6cf54 4 3281 97 +6cf58 4 3281 97 +6cf5c 8 3281 97 +6cf64 4 61 47 +6cf68 4 3281 97 +6cf6c 4 61 47 +6cf70 20 3000 97 +6cf90 4 3000 97 +6cf94 c 3000 97 +6cfa0 8 67 47 +6cfa8 8 67 47 +6cfb0 8 72 47 +6cfb8 8 73 47 +6cfc0 8 81 47 +6cfc8 c 82 47 +6cfd4 28 3940 97 +6cffc 4 3940 97 +6d000 4 3940 97 +6d004 8 3940 97 +6d00c 8 97 47 +6d014 8 98 47 +6d01c 4 102 47 +6d020 8 72 55 +6d028 4 70 55 +6d02c 4 72 55 +6d030 4 103 47 +6d034 14 104 47 +FUNC 6d048 c 0 google_breakpad::MemoryMappedFile::MemoryMappedFile +6d048 8 50 55 +6d050 4 50 47 +FUNC 6d054 7c 0 google_breakpad::SafeReadLink +6d054 8 39 48 +6d05c 4 3948 97 +6d060 c 39 48 +6d06c 8 39 48 +6d074 20 3948 97 +6d094 4 3948 97 +6d098 4 3948 97 +6d09c 8 3948 97 +6d0a4 18 46 48 +6d0bc 4 47 48 +6d0c0 10 51 48 +FUNC 6d0d0 8c 0 google_breakpad::UTF8ToUTF16Char +6d0d0 10 58 60 +6d0e0 4 78 60 +6d0e4 4 58 60 +6d0e8 4 58 60 +6d0ec 4 59 60 +6d0f0 4 60 60 +6d0f4 4 61 60 +6d0f8 4 62 60 +6d0fc 8 63 60 +6d104 20 69 60 +6d124 4 71 60 +6d128 c 72 60 +6d134 4 76 60 +6d138 4 75 60 +6d13c 8 78 60 +6d144 4 82 60 +6d148 14 83 60 +FUNC 6d200 4 0 google_breakpad::::CrashGenerationClientImpl::~CrashGenerationClientImpl +6d200 4 49 0 +FUNC 6d204 44 0 sys_close +6d204 10 2979 97 +6d214 14 2979 97 +6d228 4 2979 97 +6d22c 4 2979 97 +6d230 8 2979 97 +6d238 10 2979 97 +FUNC 6d248 4 0 google_breakpad::::CrashGenerationClientImpl::~CrashGenerationClientImpl +6d248 4 49 0 +FUNC 6d24c 158 0 google_breakpad::::CrashGenerationClientImpl::RequestDump +6d24c 8 51 0 +6d254 4 3944 97 +6d258 10 51 0 +6d268 18 3944 97 +6d280 4 3944 97 +6d284 c 3944 97 +6d290 4 53 0 +6d294 4 64 0 +6d298 4 58 0 +6d29c 4 63 0 +6d2a0 4 62 0 +6d2a4 4 64 0 +6d2a8 4 59 0 +6d2ac 4 62 0 +6d2b0 4 61 0 +6d2b4 8 66 0 +6d2bc 4 71 0 +6d2c0 4 64 0 +6d2c4 4 71 0 +6d2c8 4 3671 97 +6d2cc 4 73 0 +6d2d0 8 61 0 +6d2d8 4 63 0 +6d2dc 8 64 0 +6d2e4 4 65 0 +6d2e8 4 69 0 +6d2ec 4 70 0 +6d2f0 4 73 0 +6d2f4 20 3671 97 +6d314 4 3671 97 +6d318 8 3671 97 +6d320 c 75 0 +6d32c 4 3671 97 +6d330 4 76 0 +6d334 4 3104 97 +6d338 4 76 0 +6d33c 4 77 0 +6d340 8 78 0 +6d348 8 54 0 +6d350 4 3104 97 +6d354 8 3104 97 +6d35c c 84 0 +6d368 20 3104 97 +6d388 8 85 0 +6d390 4 87 0 +6d394 10 88 0 +FUNC 6d3a4 44 0 google_breakpad::CrashGenerationClient::TryCreate +6d3a4 8 99 0 +6d3ac 4 101 0 +6d3b0 8 99 0 +6d3b8 4 100 0 +6d3bc c 102 0 +6d3c8 14 48 0 +6d3dc c 103 0 +FUNC 6d3e8 4 0 google_breakpad::SeccompUnwinder::PopSeccompStackFrame +6d3e8 4 152 1 +FUNC 6d3ec 8 0 google_breakpad::ThreadInfo::GetInstructionPointer +6d3ec 8 217 2 +FUNC 6d3f4 68 0 google_breakpad::ThreadInfo::FillCPUContext +6d3f4 4 219 2 +6d3f8 c 220 2 +6d404 10 222 2 +6d414 c 224 2 +6d420 4 223 2 +6d424 4 224 2 +6d428 4 223 2 +6d42c 8 225 2 +6d434 8 226 2 +6d43c 8 228 2 +6d444 8 229 2 +6d44c 10 231 2 +FUNC 6d45c 8 0 google_breakpad::UContextReader::GetStackPointer +6d45c 8 189 3 +FUNC 6d464 8 0 google_breakpad::UContextReader::GetInstructionPointer +6d464 8 193 3 +FUNC 6d46c 64 0 google_breakpad::UContextReader::FillCPUContext +6d46c c 197 3 +6d478 10 199 3 +6d488 c 201 3 +6d494 4 200 3 +6d498 4 201 3 +6d49c 4 200 3 +6d4a0 4 202 3 +6d4a4 4 208 3 +6d4a8 4 202 3 +6d4ac 8 203 3 +6d4b4 8 205 3 +6d4bc 8 206 3 +6d4c4 c 208 3 +FUNC 6d4d0 fc 0 isLegalUTF8 +6d4d0 4 299 37 +6d4d4 8 300 37 +6d4dc 4 301 37 +6d4e0 1c 300 37 +6d4fc 4 303 37 +6d500 4 303 37 +6d504 4 303 37 +6d508 c 303 37 +6d514 4 303 37 +6d518 4 304 37 +6d51c 4 303 37 +6d520 4 304 37 +6d524 c 304 37 +6d530 4 304 37 +6d534 4 305 37 +6d538 4 303 37 +6d53c 8 305 37 +6d544 18 307 37 +6d55c 8 309 37 +6d564 10 307 37 +6d574 8 312 37 +6d57c 8 310 37 +6d584 c 311 37 +6d590 8 312 37 +6d598 4 303 37 +6d59c 4 313 37 +6d5a0 14 316 37 +6d5b4 c 318 37 +6d5c0 4 301 37 +6d5c4 8 320 37 +FUNC 6d5cc 220 0 ConvertUTF8toUTF16 +6d5cc 4 339 37 +6d5d0 4 371 37 +6d5d4 18 339 37 +6d5ec 4 357 37 +6d5f0 4 339 37 +6d5f4 4 341 37 +6d5f8 4 339 37 +6d5fc 4 342 37 +6d600 4 345 37 +6d604 4 357 37 +6d608 4 365 37 +6d60c 4 390 37 +6d610 8 343 37 +6d618 1c 345 37 +6d634 10 346 37 +6d644 1c 350 37 +6d660 4 357 37 +6d664 4 344 37 +6d668 24 357 37 +6d68c c 358 37 +6d698 4 344 37 +6d69c 14 359 37 +6d6b0 4 344 37 +6d6b4 14 360 37 +6d6c8 4 344 37 +6d6cc 14 361 37 +6d6e0 4 344 37 +6d6e4 14 362 37 +6d6f8 4 344 37 +6d6fc c 363 37 +6d708 4 365 37 +6d70c 4 367 37 +6d710 8 365 37 +6d718 4 367 37 +6d71c 8 371 37 +6d724 10 373 37 +6d734 8 382 37 +6d73c 10 384 37 +6d74c 4 385 37 +6d750 c 387 37 +6d75c c 390 37 +6d768 c 394 37 +6d774 4 395 37 +6d778 4 396 37 +6d77c 4 395 37 +6d780 4 396 37 +6d784 4 398 37 +6d788 8 399 37 +6d790 4 400 37 +6d794 4 399 37 +6d798 4 400 37 +6d79c 8 399 37 +6d7a4 10 400 37 +6d7b4 8 340 37 +6d7bc 8 347 37 +6d7c4 4 351 37 +6d7c8 4 403 37 +6d7cc 4 404 37 +6d7d0 1c 406 37 +FUNC 6d7ec 38 0 google_breakpad::DumpContext::DumpContext +6d7ec c 53 68 +6d7f8 4 53 68 +6d7fc 28 54 68 +FUNC 6d824 1c 0 google_breakpad::DumpContext::GetContextCPU +6d824 4 61 68 +6d828 4 60 68 +6d82c 4 64 68 +6d830 4 61 68 +6d834 8 67 68 +6d83c 4 68 68 +FUNC 6d840 8 0 google_breakpad::DumpContext::GetContextFlags +6d840 8 72 68 +FUNC 6d848 8 0 google_breakpad::DumpContext::SetContextFlags +6d848 4 190 68 +6d84c 4 191 68 +FUNC 6d850 8 0 google_breakpad::DumpContext::SetContextX86 +6d850 4 194 68 +6d854 4 195 68 +FUNC 6d858 8 0 google_breakpad::DumpContext::SetContextPPC +6d858 4 198 68 +6d85c 4 199 68 +FUNC 6d860 8 0 google_breakpad::DumpContext::SetContextPPC64 +6d860 4 202 68 +6d864 4 203 68 +FUNC 6d868 8 0 google_breakpad::DumpContext::SetContextAMD64 +6d868 4 206 68 +6d86c 4 207 68 +FUNC 6d870 8 0 google_breakpad::DumpContext::SetContextSPARC +6d870 4 210 68 +6d874 4 211 68 +FUNC 6d878 8 0 google_breakpad::DumpContext::SetContextARM +6d878 4 214 68 +6d87c 4 215 68 +FUNC 6d880 8 0 google_breakpad::DumpContext::SetContextARM64 +6d880 4 218 68 +6d884 4 219 68 +FUNC 6d888 8 0 google_breakpad::DumpContext::SetContextMIPS +6d888 4 222 68 +6d88c 4 223 68 +FUNC 6d890 88 0 google_breakpad::DumpContext::FreeContext +6d890 c 225 68 +6d89c 4 225 68 +6d8a0 5c 226 68 +6d8fc 8 256 68 +6d904 4 266 68 +6d908 4 267 68 +6d90c c 268 68 +FUNC 6d918 10 0 google_breakpad::DumpContext::~DumpContext +6d918 c 56 68 +6d924 4 57 68 +FUNC 6d928 24 0 google_breakpad::DumpContext::~DumpContext +6d928 c 56 68 +6d934 4 56 68 +6d938 4 58 68 +6d93c 4 58 68 +6d940 8 58 68 +6d948 4 58 68 +FUNC 6d94c 70 0 google_breakpad::DumpContext::GetContextX86 +6d94c c 74 68 +6d958 4 74 68 +6d95c c 75 68 +6d968 24 76 68 +6d98c 10 333 122 +6d99c 8 76 68 +6d9a4 8 76 68 +6d9ac 4 80 68 +6d9b0 c 81 68 +FUNC 6d9bc 74 0 google_breakpad::DumpContext::GetContextPPC +6d9bc c 83 68 +6d9c8 4 83 68 +6d9cc 10 84 68 +6d9dc 24 85 68 +6da00 10 333 122 +6da10 8 85 68 +6da18 8 85 68 +6da20 4 89 68 +6da24 c 90 68 +FUNC 6da30 74 0 google_breakpad::DumpContext::GetContextARM +6da30 c 119 68 +6da3c 4 119 68 +6da40 10 120 68 +6da50 24 121 68 +6da74 10 333 122 +6da84 8 121 68 +6da8c 8 121 68 +6da94 4 125 68 +6da98 c 126 68 +FUNC 6daa4 74 0 google_breakpad::DumpContext::GetContextPPC64 +6daa4 c 92 68 +6dab0 4 92 68 +6dab4 10 93 68 +6dac4 24 94 68 +6dae8 10 333 122 +6daf8 8 94 68 +6db00 8 94 68 +6db08 4 98 68 +6db0c c 99 68 +FUNC 6db18 70 0 google_breakpad::DumpContext::GetContextAMD64 +6db18 c 101 68 +6db24 4 101 68 +6db28 c 102 68 +6db34 24 103 68 +6db58 10 333 122 +6db68 8 103 68 +6db70 8 103 68 +6db78 4 107 68 +6db7c c 108 68 +FUNC 6db88 74 0 google_breakpad::DumpContext::GetContextSPARC +6db88 c 110 68 +6db94 4 110 68 +6db98 10 111 68 +6dba8 24 112 68 +6dbcc 10 333 122 +6dbdc 8 112 68 +6dbe4 8 112 68 +6dbec 4 116 68 +6dbf0 c 117 68 +FUNC 6dbfc 74 0 google_breakpad::DumpContext::GetContextARM64 +6dbfc c 128 68 +6dc08 4 128 68 +6dc0c 10 129 68 +6dc1c 24 130 68 +6dc40 10 333 122 +6dc50 8 130 68 +6dc58 8 130 68 +6dc60 4 134 68 +6dc64 c 135 68 +FUNC 6dc70 70 0 google_breakpad::DumpContext::GetContextMIPS +6dc70 c 137 68 +6dc7c 4 137 68 +6dc80 c 138 68 +6dc8c 24 139 68 +6dcb0 10 333 122 +6dcc0 8 139 68 +6dcc8 8 139 68 +6dcd0 4 143 68 +6dcd4 c 144 68 +FUNC 6dce0 1e0 0 google_breakpad::DumpContext::GetInstructionPointer +6dce0 10 146 68 +6dcf0 8 146 68 +6dcf8 4 147 68 +6dcfc 24 147 68 +6dd20 10 333 122 +6dd30 8 147 68 +6dd38 4 149 68 +6dd3c 8 151 68 +6dd44 24 152 68 +6dd68 10 333 122 +6dd78 8 152 68 +6dd80 4 153 68 +6dd84 30 156 68 +6ddb4 10 176 68 +6ddc4 1c 156 68 +6dde0 10 173 68 +6ddf0 18 156 68 +6de08 10 164 68 +6de18 10 158 68 +6de28 10 161 68 +6de38 10 167 68 +6de48 10 170 68 +6de58 c 179 68 +6de64 4 176 68 +6de68 4 177 68 +6de6c 20 183 68 +6de8c 4 184 68 +6de90 4 183 68 +6de94 10 333 122 +6dea4 8 183 68 +6deac 14 187 68 +FUNC 6dec0 8 0 google_breakpad::DumpObject::DumpObject +6dec0 4 36 69 +6dec4 4 37 69 +FUNC 6dec8 4c 0 google_breakpad::HexString +6dec8 4 86 71 +6decc 4 88 71 +6ded0 c 86 71 +6dedc 10 88 71 +6deec 4 86 71 +6def0 4 88 71 +6def4 10 89 71 +6df04 10 90 71 +FUNC 6df14 4c 0 google_breakpad::HexString +6df14 4 92 71 +6df18 4 94 71 +6df1c c 92 71 +6df28 10 94 71 +6df38 4 92 71 +6df3c 4 94 71 +6df40 10 95 71 +6df50 10 96 71 +FUNC 6df60 4c 0 google_breakpad::HexString +6df60 4 98 71 +6df64 4 100 71 +6df68 c 98 71 +6df74 10 100 71 +6df84 4 98 71 +6df88 4 100 71 +6df8c 10 101 71 +6df9c 10 102 71 +FUNC 6dfac 7c 0 google_breakpad::LogStream::~LogStream +6dfac c 82 71 +6dfb8 4 83 71 +6dfbc 14 181 122 +6dfd0 4 412 121 +6dfd4 18 422 121 +6dfec 4 414 121 +6dff0 14 414 121 +6e004 8 421 121 +6e00c 8 424 121 +6e014 8 359 122 +6e01c c 84 71 +FUNC 6e028 20c 0 google_breakpad::LogStream::LogStream +6e028 18 54 71 +6e040 4 58 71 +6e044 4 56 71 +6e048 4 54 71 +6e04c 4 58 71 +6e050 c 54 71 +6e05c 4 63 71 +6e060 4 58 71 +6e064 8 63 71 +6e06c 4 66 71 +6e070 4 63 71 +6e074 18 66 71 +6e08c c 69 71 +6e098 8 74 71 +6e0a0 4 75 71 +6e0a4 c 71 71 +6e0b0 8 68 71 +6e0b8 4 78 71 +6e0bc 8 333 122 +6e0c4 4 78 71 +6e0c8 18 333 122 +6e0e0 c 78 71 +6e0ec 4 78 71 +6e0f0 4 78 71 +6e0f4 c 78 71 +6e100 10 78 71 +6e110 c 333 122 +6e11c 4 238 121 +6e120 c 239 121 +6e12c 8 181 122 +6e134 8 239 121 +6e13c 4 239 121 +6e140 4 181 122 +6e144 4 239 121 +6e148 c 181 122 +6e154 4 199 121 +6e158 18 211 121 +6e170 4 202 121 +6e174 4 145 110 +6e178 4 202 121 +6e17c 4 145 110 +6e180 4 202 121 +6e184 8 145 110 +6e18c c 351 117 +6e198 8 351 117 +6e1a0 4 67 120 +6e1a4 4 202 121 +6e1a8 8 67 120 +6e1b0 c 202 121 +6e1bc 4 67 120 +6e1c0 4 57 123 +6e1c4 c 67 120 +6e1d0 8 202 121 +6e1d8 4 210 121 +6e1dc 4 212 121 +6e1e0 4 333 122 +6e1e4 4 212 121 +6e1e8 24 333 122 +6e20c 10 156 132 +6e21c 18 80 71 +FUNC 6e234 c0 0 google_breakpad::ErrnoString +6e234 10 104 71 +6e244 4 104 71 +6e248 c 111 71 +6e254 8 111 71 +6e25c 8 229 140 +6e264 c 400 131 +6e270 8 244 130 +6e278 4 168 140 +6e27c c 168 140 +6e288 c 246 130 +6e294 8 803 131 +6e29c 4 168 140 +6e2a0 4 806 131 +6e2a4 4 168 140 +6e2a8 10 806 131 +6e2b8 4 168 140 +6e2bc 8 168 140 +6e2c4 4 400 131 +6e2c8 4 250 130 +6e2cc 8 400 131 +6e2d4 c 250 130 +6e2e0 4 112 71 +6e2e4 10 113 71 +FUNC 6e2f4 4 0 google_breakpad::MinidumpObject::~MinidumpObject +6e2f4 4 114 65 +FUNC 6e2f8 18 0 google_breakpad::MinidumpThreadList::thread_count +6e2f8 4 322 65 +6e2fc 4 321 65 +6e300 4 322 65 +6e304 4 322 65 +6e308 4 322 65 +6e30c 4 323 65 +FUNC 6e310 18 0 google_breakpad::MinidumpModule::base_address +6e310 4 383 65 +6e314 4 382 65 +6e318 4 383 65 +6e31c 4 383 65 +6e320 4 383 65 +6e324 4 384 65 +FUNC 6e330 18 0 google_breakpad::MinidumpModule::size +6e330 8 385 65 +6e338 4 385 65 +6e33c 4 385 65 +6e340 4 385 65 +6e344 4 385 65 +FUNC 6e350 18 0 google_breakpad::MinidumpModuleList::module_count +6e350 4 491 65 +6e354 4 490 65 +6e358 4 491 65 +6e35c 4 491 65 +6e360 4 491 65 +6e364 4 492 65 +FUNC 6e370 14 0 google_breakpad::Minidump::header +6e370 4 882 65 +6e374 8 882 65 +6e37c 8 882 65 +FUNC 6e384 8 0 google_breakpad::BasicCodeModule::base_address +6e384 8 84 66 +FUNC 6e38c 8 0 google_breakpad::BasicCodeModule::size +6e38c 8 85 66 +FUNC 6e394 18 0 google_breakpad::Swap +6e394 10 125 73 +6e3a4 4 127 73 +6e3a8 4 128 73 +FUNC 6e3ac 10 0 google_breakpad::Swap +6e3ac 8 131 73 +6e3b4 4 135 73 +6e3b8 4 136 73 +FUNC 6e3bc 38 0 google_breakpad::Swap +6e3bc c 139 73 +6e3c8 4 139 73 +6e3cc 4 141 73 +6e3d0 8 142 73 +6e3d8 4 143 73 +6e3dc 8 144 73 +6e3e4 4 145 73 +6e3e8 c 146 73 +FUNC 6e3f4 24 0 google_breakpad::Swap +6e3f4 c 182 73 +6e400 4 182 73 +6e404 4 183 73 +6e408 4 184 73 +6e40c 8 185 73 +6e414 4 184 73 +FUNC 6e418 50 0 google_breakpad::MinidumpThread::~MinidumpThread +6e418 c 1380 73 +6e424 10 1380 73 +6e434 8 1381 73 +6e43c c 1381 73 +6e448 8 1382 73 +6e450 c 1382 73 +6e45c c 1383 73 +FUNC 6e468 30 0 google_breakpad::MinidumpException::~MinidumpException +6e468 c 2883 73 +6e474 8 2883 73 +6e47c 8 2884 73 +6e484 c 2884 73 +6e490 8 2885 73 +FUNC 6e498 d4 0 std::basic_filebuf >::pbackfail +6e498 4 161 104 +6e49c 4 157 104 +6e4a0 4 162 104 +6e4a4 c 161 104 +6e4b0 8 166 104 +6e4b8 8 166 104 +6e4c0 c 166 104 +6e4cc c 166 104 +6e4d8 8 175 104 +6e4e0 4 178 104 +6e4e4 4 177 104 +6e4e8 4 178 104 +6e4ec 4 180 104 +6e4f0 4 162 104 +6e4f4 8 180 104 +6e4fc 4 181 104 +6e500 4 95 129 +6e504 4 181 104 +6e508 4 93 129 +6e50c 8 94 129 +6e514 4 187 104 +6e518 8 188 104 +6e520 4 189 104 +6e524 4 186 104 +6e528 4 93 129 +6e52c 4 94 129 +6e530 4 190 104 +6e534 4 95 129 +6e538 8 190 104 +6e540 4 220 140 +6e544 8 162 104 +6e54c 4 91 129 +6e550 4 171 104 +6e554 8 91 129 +6e55c 4 171 104 +6e560 8 171 104 +6e568 4 199 104 +FUNC 6e56c 4 0 google_breakpad::MinidumpObject::~MinidumpObject +6e56c 4 114 65 +FUNC 6e570 24 0 google_breakpad::MinidumpThread::~MinidumpThread +6e570 c 1380 73 +6e57c 4 1380 73 +6e580 4 1383 73 +6e584 4 1383 73 +6e588 8 1383 73 +6e590 4 1383 73 +FUNC 6e594 24 0 google_breakpad::MinidumpException::~MinidumpException +6e594 c 2883 73 +6e5a0 4 2883 73 +6e5a4 4 2885 73 +6e5a8 4 2885 73 +6e5ac 8 2885 73 +6e5b4 4 2885 73 +FUNC 6e5b8 10 0 google_breakpad::MinidumpContext::~MinidumpContext +6e5b8 10 420 73 +FUNC 6e5c8 24 0 google_breakpad::MinidumpContext::~MinidumpContext +6e5c8 c 420 73 +6e5d4 4 420 73 +6e5d8 4 421 73 +6e5dc 4 421 73 +6e5e0 8 421 73 +6e5e8 4 421 73 +FUNC 6e5ec 34 0 google_breakpad::MinidumpModuleList::Copy +6e5ec c 2640 73 +6e5f8 4 2640 73 +6e5fc c 2641 73 +6e608 8 2641 73 +6e610 10 2642 73 +FUNC 6e628 4 0 std::basic_filebuf >::underflow +6e628 4 76 104 +FUNC 6e62c 38 0 std::basic_filebuf >::sync +6e62c 4 402 104 +6e630 4 406 104 +6e634 4 402 104 +6e638 8 403 104 +6e640 4 405 104 +6e644 c 405 104 +6e650 8 405 104 +6e658 c 407 104 +FUNC 6e664 88 0 std::basic_filebuf >::showmanyc +6e664 10 132 104 +6e674 4 134 104 +6e678 4 135 104 +6e67c 4 134 104 +6e680 8 134 104 +6e688 8 136 104 +6e690 10 137 104 +6e6a0 8 138 104 +6e6a8 8 144 104 +6e6b0 18 139 104 +6e6c8 8 140 104 +6e6d0 8 141 104 +6e6d8 4 141 104 +6e6dc 4 141 104 +6e6e0 c 145 104 +FUNC 6e6ec b8 0 std::basic_filebuf >::_M_unshift +6e6ec 14 593 104 +6e700 4 593 104 +6e704 4 598 104 +6e708 4 199 102 +6e70c 4 322 105 +6e710 4 597 104 +6e714 4 199 102 +6e718 4 598 104 +6e71c 4 597 104 +6e720 14 199 102 +6e734 4 600 104 +6e738 4 199 102 +6e73c 4 600 104 +6e740 4 600 104 +6e744 4 600 104 +6e748 4 600 104 +6e74c 4 600 104 +6e750 8 600 104 +6e758 8 600 104 +6e760 8 603 104 +6e768 10 322 105 +6e778 4 605 104 +6e77c c 596 104 +6e788 4 602 104 +6e78c 4 602 104 +6e790 14 611 104 +FUNC 6e7a4 80 0 std::basic_filebuf >::_M_setup_codecvt +6e7a4 c 735 104 +6e7b0 4 735 104 +6e7b4 10 351 117 +6e7c4 4 737 104 +6e7c8 c 216 102 +6e7d4 4 141 100 +6e7d8 4 216 102 +6e7dc 4 141 100 +6e7e0 4 740 104 +6e7e4 4 741 104 +6e7e8 c 227 102 +6e7f4 4 741 104 +6e7f8 c 742 104 +6e804 4 743 104 +6e808 c 218 102 +6e814 4 743 104 +6e818 c 754 104 +FUNC 6e824 98 0 std::basic_filebuf >::imbue +6e824 10 413 104 +6e834 4 413 104 +6e838 8 414 104 +6e840 8 414 104 +6e848 18 347 117 +6e860 c 736 104 +6e86c 10 417 104 +6e87c 4 746 104 +6e880 4 747 104 +6e884 4 748 104 +6e888 4 351 117 +6e88c 8 747 104 +6e894 4 351 117 +6e898 4 748 104 +6e89c c 417 104 +6e8a8 4 351 117 +6e8ac 10 417 104 +FUNC 6e8bc 54 0 std::priv::_Rb_tree, std::pair::Range>, std::priv::_Select1st::Range> >, std::priv::_MapTraitsT::Range> >, std::allocator::Range> > >::_M_create_node +6e8bc 4 315 136 +6e8c0 4 306 101 +6e8c4 8 315 136 +6e8cc 4 315 136 +6e8d0 8 306 101 +6e8d8 4 307 101 +6e8dc 8 119 103 +6e8e4 18 68 124 +6e8fc 4 321 136 +6e900 4 322 136 +6e904 c 324 136 +FUNC 6e910 4c 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_create_node +6e910 4 315 136 +6e914 4 306 101 +6e918 8 315 136 +6e920 4 315 136 +6e924 8 306 101 +6e92c 4 307 101 +6e930 8 119 103 +6e938 10 68 124 +6e948 4 321 136 +6e94c 4 322 136 +6e950 c 324 136 +FUNC 6e95c 54 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_create_node +6e95c 4 315 136 +6e960 4 306 101 +6e964 8 315 136 +6e96c 4 315 136 +6e970 8 306 101 +6e978 4 307 101 +6e97c 8 119 103 +6e984 18 68 124 +6e99c 4 321 136 +6e9a0 4 322 136 +6e9a4 c 324 136 +FUNC 6e9b0 24 0 google_breakpad::Minidump::MinidumpStreamInfo::~MinidumpStreamInfo +6e9b0 8 969 65 +6e9b8 8 969 65 +6e9c0 4 969 65 +6e9c4 8 969 65 +6e9cc 8 969 65 +FUNC 6e9d4 b8 0 google_breakpad::BasicCodeModule::BasicCodeModule +6e9d4 c 57 66 +6e9e0 4 57 66 +6e9e4 8 64 66 +6e9ec 4 57 66 +6e9f0 4 64 66 +6e9f4 10 58 66 +6ea04 4 64 66 +6ea08 10 59 66 +6ea18 4 64 66 +6ea1c 4 64 66 +6ea20 4 60 66 +6ea24 c 64 66 +6ea30 4 61 66 +6ea34 10 64 66 +6ea44 4 62 66 +6ea48 10 64 66 +6ea58 4 63 66 +6ea5c 10 64 66 +6ea6c 4 64 66 +6ea70 10 64 66 +6ea80 c 64 66 +FUNC 6ea8c 34 0 google_breakpad::MinidumpModule::Copy +6ea8c c 2071 73 +6ea98 4 2071 73 +6ea9c c 2072 73 +6eaa8 8 2072 73 +6eab0 10 2073 73 +FUNC 6eac8 34 0 google_breakpad::BasicCodeModule::Copy +6eac8 c 91 66 +6ead4 10 91 66 +6eae4 8 91 66 +6eaec 10 91 66 +FUNC 6eafc 3c 0 google_breakpad::MinidumpStream::MinidumpStream +6eafc c 405 73 +6eb08 4 405 73 +6eb0c 4 396 73 +6eb10 4 405 73 +6eb14 8 396 73 +6eb1c 4 406 73 +6eb20 4 396 73 +6eb24 8 406 73 +6eb2c c 407 73 +FUNC 6eb38 50 0 google_breakpad::MinidumpMemoryRegion::MinidumpMemoryRegion +6eb38 c 1192 73 +6eb44 4 1192 73 +6eb48 4 396 73 +6eb4c 4 1192 73 +6eb50 4 396 73 +6eb54 8 1195 73 +6eb5c 4 396 73 +6eb60 c 1195 73 +6eb6c 4 396 73 +6eb70 c 1195 73 +6eb7c c 1196 73 +FUNC 6eb88 28 0 google_breakpad::MinidumpMemoryRegion::SetDescriptor +6eb88 4 1205 73 +6eb8c 4 1206 73 +6eb90 4 1206 73 +6eb94 4 1207 73 +6eb98 8 1208 73 +6eba0 8 1206 73 +6eba8 4 1209 73 +6ebac 4 1210 73 +FUNC 6ebb0 54 0 google_breakpad::MinidumpThread::MinidumpThread +6ebb0 c 1372 73 +6ebbc 4 1372 73 +6ebc0 4 396 73 +6ebc4 4 1372 73 +6ebc8 4 396 73 +6ebcc 4 1376 73 +6ebd0 8 396 73 +6ebd8 20 1376 73 +6ebf8 c 1377 73 +FUNC 6ec04 4c 0 google_breakpad::MinidumpThreadList::MinidumpThreadList +6ec04 c 1540 73 +6ec10 4 1540 73 +6ec14 10 1544 73 +6ec24 4 263 136 +6ec28 4 481 101 +6ec2c 4 263 136 +6ec30 4 266 136 +6ec34 4 267 136 +6ec38 4 391 136 +6ec3c 8 1544 73 +6ec44 c 1545 73 +FUNC 6ec50 84 0 google_breakpad::MinidumpModule::MinidumpModule +6ec50 c 1704 73 +6ec5c 4 1704 73 +6ec60 4 396 73 +6ec64 4 1704 73 +6ec68 4 396 73 +6ec6c 8 1712 73 +6ec74 4 396 73 +6ec78 c 1712 73 +6ec84 4 396 73 +6ec88 40 1712 73 +6ecc8 c 1713 73 +FUNC 6ecd4 60 0 google_breakpad::MinidumpModuleList::MinidumpModuleList +6ecd4 c 2431 73 +6ece0 4 2431 73 +6ece4 1c 2435 73 +6ed00 8 2435 73 +6ed08 4 481 101 +6ed0c 4 263 136 +6ed10 4 266 136 +6ed14 4 267 136 +6ed18 4 391 136 +6ed1c c 2435 73 +6ed28 c 2436 73 +FUNC 6ed34 58 0 google_breakpad::MinidumpMemoryList::MinidumpMemoryList +6ed34 c 2673 73 +6ed40 4 2673 73 +6ed44 10 2678 73 +6ed54 8 2678 73 +6ed5c 4 481 101 +6ed60 4 263 136 +6ed64 4 266 136 +6ed68 4 267 136 +6ed6c 4 391 136 +6ed70 10 2678 73 +6ed80 c 2679 73 +FUNC 6ed8c 40 0 google_breakpad::MinidumpException::MinidumpException +6ed8c c 2876 73 +6ed98 4 2876 73 +6ed9c 24 2879 73 +6edc0 c 2880 73 +FUNC 6edcc 48 0 google_breakpad::MinidumpSystemInfo::MinidumpSystemInfo +6edcc c 3092 73 +6edd8 4 3092 73 +6eddc 2c 3096 73 +6ee08 c 3097 73 +FUNC 6ee14 24 0 google_breakpad::scoped_ptr::~scoped_ptr +6ee14 8 96 57 +6ee1c 8 98 57 +6ee24 c 98 57 +6ee30 8 99 57 +FUNC 6ee38 70 0 std::priv::_Impl_vector >::~_Impl_vector +6ee38 10 304 139 +6ee48 c 304 139 +6ee54 8 191 103 +6ee5c 4 57 103 +6ee60 4 77 113 +6ee64 14 57 103 +6ee78 8 87 139 +6ee80 4 88 139 +6ee84 c 304 139 +6ee90 8 323 101 +6ee98 10 304 139 +FUNC 6eea8 70 0 std::priv::_Impl_vector >::~_Impl_vector +6eea8 10 304 139 +6eeb8 c 304 139 +6eec4 8 191 103 +6eecc 4 57 103 +6eed0 4 77 113 +6eed4 14 57 103 +6eee8 8 87 139 +6eef0 4 88 139 +6eef4 c 304 139 +6ef00 8 323 101 +6ef08 10 304 139 +FUNC 6ef18 1c 0 std::priv::_Impl_vector >::~_Impl_vector +6ef18 8 304 139 +6ef20 4 87 139 +6ef24 4 88 139 +6ef28 8 323 101 +6ef30 4 304 139 +FUNC 6ef34 70 0 std::priv::_Impl_vector >::~_Impl_vector +6ef34 10 304 139 +6ef44 c 304 139 +6ef50 8 191 103 +6ef58 4 57 103 +6ef5c 4 77 113 +6ef60 14 57 103 +6ef74 8 87 139 +6ef7c 4 88 139 +6ef80 c 304 139 +6ef8c 8 323 101 +6ef94 10 304 139 +FUNC 6efa4 1c 0 std::priv::_Impl_vector >::~_Impl_vector +6efa4 8 304 139 +6efac 4 87 139 +6efb0 4 88 139 +6efb4 8 323 101 +6efbc 4 304 139 +FUNC 6efc0 38 0 google_breakpad::scoped_ptr, std::allocator > >::~scoped_ptr +6efc0 c 96 57 +6efcc 8 98 57 +6efd4 8 156 132 +6efdc 4 98 57 +6efe0 8 99 57 +6efe8 4 98 57 +6efec c 99 57 +FUNC 6eff8 48 0 google_breakpad::BasicCodeModule::~BasicCodeModule +6eff8 10 80 66 +6f008 c 80 66 +6f014 20 156 132 +6f034 8 80 66 +6f03c 4 156 132 +FUNC 6f040 24 0 google_breakpad::BasicCodeModule::~BasicCodeModule +6f040 c 80 66 +6f04c 8 80 66 +6f054 4 80 66 +6f058 8 80 66 +6f060 4 80 66 +FUNC 6f064 60 0 google_breakpad::MinidumpSystemInfo::~MinidumpSystemInfo +6f064 c 3100 73 +6f070 c 3100 73 +6f07c 4 3101 73 +6f080 4 3100 73 +6f084 4 3101 73 +6f088 8 156 132 +6f090 8 3101 73 +6f098 8 3102 73 +6f0a0 8 156 132 +6f0a8 4 3102 73 +6f0ac 8 3103 73 +6f0b4 4 3102 73 +6f0b8 c 3103 73 +FUNC 6f0c4 24 0 google_breakpad::MinidumpSystemInfo::~MinidumpSystemInfo +6f0c4 c 3100 73 +6f0d0 4 3100 73 +6f0d4 4 3103 73 +6f0d8 4 3103 73 +6f0dc 8 3103 73 +6f0e4 4 3103 73 +FUNC 6f0e8 a0 0 std::priv::_Impl_vector >::_Impl_vector +6f0e8 c 233 139 +6f0f4 4 70 139 +6f0f8 4 233 139 +6f0fc 4 70 139 +6f100 4 481 101 +6f104 4 342 101 +6f108 c 343 101 +6f114 8 343 101 +6f11c 4 356 101 +6f120 4 346 101 +6f124 c 347 101 +6f130 4 348 101 +6f134 c 352 101 +6f140 4 73 139 +6f144 4 71 139 +6f148 4 73 139 +6f14c 4 314 137 +6f150 4 72 139 +6f154 c 249 137 +6f160 c 249 137 +6f16c c 146 103 +6f178 10 244 139 +FUNC 6f188 1c 0 std::priv::_Vector_base >::~_Vector_base +6f188 4 86 139 +6f18c 8 87 139 +6f194 4 88 139 +6f198 8 323 101 +6f1a0 4 89 139 +FUNC 6f1a4 1c 0 std::priv::_Vector_base >::~_Vector_base +6f1a4 4 86 139 +6f1a8 8 87 139 +6f1b0 4 88 139 +6f1b4 8 323 101 +6f1bc 4 89 139 +FUNC 6f1c0 50 0 google_breakpad::MinidumpMemoryRegion::~MinidumpMemoryRegion +6f1c0 10 1199 73 +6f1d0 c 1199 73 +6f1dc 4 1200 73 +6f1e0 8 1199 73 +6f1e8 4 1200 73 +6f1ec 8 304 139 +6f1f4 4 1200 73 +6f1f8 8 1201 73 +6f200 4 1200 73 +6f204 c 1201 73 +FUNC 6f218 24 0 google_breakpad::MinidumpMemoryRegion::~MinidumpMemoryRegion +6f218 c 1199 73 +6f224 4 1199 73 +6f228 4 1201 73 +6f22c 4 1201 73 +6f230 8 1201 73 +6f238 4 1201 73 +FUNC 6f244 38 0 google_breakpad::scoped_ptr > >::~scoped_ptr +6f244 c 96 57 +6f250 8 98 57 +6f258 8 304 139 +6f260 4 98 57 +6f264 8 99 57 +6f26c 4 98 57 +6f270 c 99 57 +FUNC 6f27c 84 0 google_breakpad::MinidumpModule::~MinidumpModule +6f27c c 1716 73 +6f288 c 1716 73 +6f294 4 1717 73 +6f298 10 1716 73 +6f2a8 4 1717 73 +6f2ac 8 156 132 +6f2b4 8 1717 73 +6f2bc 8 1718 73 +6f2c4 8 304 139 +6f2cc 8 1718 73 +6f2d4 8 1719 73 +6f2dc 8 304 139 +6f2e4 4 1719 73 +6f2e8 8 1720 73 +6f2f0 4 1719 73 +6f2f4 c 1720 73 +FUNC 6f308 24 0 google_breakpad::MinidumpModule::~MinidumpModule +6f308 c 1716 73 +6f314 4 1716 73 +6f318 4 1720 73 +6f31c 4 1720 73 +6f320 8 1720 73 +6f328 4 1720 73 +FUNC 6f334 90 0 std::priv::_Impl_vector >::_Impl_vector +6f334 c 233 139 +6f340 4 233 139 +6f344 8 70 139 +6f34c 4 481 101 +6f350 4 346 101 +6f354 10 347 101 +6f364 4 348 101 +6f368 10 352 101 +6f378 4 346 101 +6f37c 4 356 101 +6f380 4 73 139 +6f384 4 71 139 +6f388 4 73 139 +6f38c 4 314 137 +6f390 4 72 139 +6f394 8 314 137 +6f39c c 249 137 +6f3a8 c 146 103 +6f3b4 10 244 139 +FUNC 6f3c4 60 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::find +6f3c4 4 543 136 +6f3c8 8 549 136 +6f3d0 4 552 136 +6f3d4 10 553 136 +6f3e4 8 554 136 +6f3ec 14 556 136 +6f400 8 558 136 +6f408 10 559 136 +6f418 4 142 136 +6f41c 8 543 136 +FUNC 6f424 44 0 std::priv::_Rb_global::_M_increment +6f424 8 297 135 +6f42c 10 94 136 +6f43c 4 301 135 +6f440 c 302 135 +6f44c c 304 135 +6f458 c 309 135 +6f464 4 313 135 +FUNC 6f468 170 0 std::priv::__read_unbuffered, std::priv::_Constant_unary_fun > +6f468 1c 579 111 +6f484 20 579 111 +6f4a4 4 603 111 +6f4a8 c 592 111 +6f4b4 8 593 111 +6f4bc 10 229 129 +6f4cc 8 228 129 +6f4d4 8 223 140 +6f4dc 8 228 129 +6f4e4 c 229 129 +6f4f0 4 599 111 +6f4f4 4 229 129 +6f4f8 8 599 111 +6f500 18 600 111 +6f518 c 603 111 +6f524 4 604 111 +6f528 8 605 111 +6f530 10 244 129 +6f540 c 244 129 +6f54c 4 243 129 +6f550 8 244 129 +6f558 4 243 129 +6f55c 10 244 129 +6f56c c 606 111 +6f578 4 612 111 +6f57c 4 591 111 +6f580 8 594 111 +6f588 4 601 111 +6f58c 4 622 111 +6f590 4 623 111 +6f594 4 624 111 +6f598 14 625 111 +6f5ac c 622 111 +6f5b8 20 627 111 +FUNC 6f5d8 28 0 google_breakpad::BasicCodeModule::code_file +6f5d8 10 86 66 +6f5e8 18 86 66 +FUNC 6f600 28 0 google_breakpad::BasicCodeModule::code_identifier +6f600 10 87 66 +6f610 18 87 66 +FUNC 6f628 28 0 google_breakpad::BasicCodeModule::debug_file +6f628 10 88 66 +6f638 18 88 66 +FUNC 6f650 28 0 google_breakpad::BasicCodeModule::debug_identifier +6f650 10 89 66 +6f660 18 89 66 +FUNC 6f678 28 0 google_breakpad::BasicCodeModule::version +6f678 10 90 66 +6f688 18 90 66 +FUNC 6f6a0 28 0 google_breakpad::Minidump::path +6f6a0 4 869 65 +6f6a4 8 870 65 +6f6ac 4 869 65 +6f6b0 8 870 65 +6f6b8 10 871 65 +FUNC 6f6c8 84 0 google_breakpad::Minidump::Minidump +6f6c8 c 3972 73 +6f6d4 4 3972 73 +6f6d8 8 3979 73 +6f6e0 4 3972 73 +6f6e4 2c 3979 73 +6f710 4 481 101 +6f714 4 263 136 +6f718 4 266 136 +6f71c 4 267 136 +6f720 4 391 136 +6f724 4 3979 73 +6f728 4 3979 73 +6f72c 8 3979 73 +6f734 c 3979 73 +6f740 c 3980 73 +FUNC 6f74c 74 0 google_breakpad::MinidumpModuleList::GetMainModule +6f74c c 2588 73 +6f758 8 2589 73 +6f760 24 2590 73 +6f784 10 333 122 +6f794 8 2590 73 +6f79c 8 2590 73 +6f7a4 10 2596 73 +6f7b4 c 2597 73 +FUNC 6f7e8 68 0 google_breakpad::MinidumpThread::GetMemory +6f7e8 c 1438 73 +6f7f4 8 1439 73 +6f7fc 24 1440 73 +6f820 10 333 122 +6f830 8 1440 73 +6f838 8 1440 73 +6f840 4 1444 73 +6f844 c 1445 73 +FUNC 6f850 6c 0 google_breakpad::MinidumpMemoryRegion::GetBase +6f850 c 1252 73 +6f85c 8 1253 73 +6f864 24 1254 73 +6f888 10 333 122 +6f898 8 1254 73 +6f8a0 8 1254 73 +6f8a8 8 1258 73 +6f8b0 c 1259 73 +FUNC 6f8c4 6c 0 google_breakpad::MinidumpMemoryRegion::GetSize +6f8c4 c 1262 73 +6f8d0 8 1263 73 +6f8d8 24 1264 73 +6f8fc 10 333 122 +6f90c 8 1264 73 +6f914 8 1264 73 +6f91c 8 1268 73 +6f924 c 1269 73 +FUNC 6f938 68 0 google_breakpad::MinidumpThread::GetStartOfStackMemoryRange +6f938 c 1429 73 +6f944 8 1430 73 +6f94c 24 1431 73 +6f970 10 333 122 +6f980 8 1431 73 +6f988 8 1431 73 +6f990 4 1435 73 +6f994 c 1436 73 +FUNC 6f9a0 c0 0 google_breakpad::MinidumpThread::GetThreadID +6f9a0 10 1474 73 +6f9b0 8 1474 73 +6f9b8 4 1476 73 +6f9bc 24 1476 73 +6f9e0 10 333 122 +6f9f0 8 1476 73 +6f9f8 4 1478 73 +6f9fc 8 1480 73 +6fa04 24 1481 73 +6fa28 10 333 122 +6fa38 c 1481 73 +6fa44 8 1485 73 +6fa4c 14 1487 73 +FUNC 6fa60 c0 0 google_breakpad::MinidumpException::GetThreadID +6fa60 10 2930 73 +6fa70 8 2930 73 +6fa78 4 2932 73 +6fa7c 24 2932 73 +6faa0 10 333 122 +6fab0 8 2932 73 +6fab8 4 2934 73 +6fabc 8 2936 73 +6fac4 24 2937 73 +6fae8 10 333 122 +6faf8 8 2937 73 +6fb00 4 2938 73 +6fb04 8 2941 73 +6fb0c 14 2943 73 +FUNC 6fb20 8c 0 google_breakpad::MinidumpModule::code_file +6fb20 10 1817 73 +6fb30 4 1817 73 +6fb34 8 1818 73 +6fb3c 24 1819 73 +6fb60 10 333 122 +6fb70 8 1819 73 +6fb78 18 1820 73 +6fb90 c 1823 73 +6fb9c 10 1824 73 +FUNC 6fbb4 104 0 google_breakpad::RangeMap::RetrieveRange +6fbb4 14 118 75 +6fbc8 14 118 75 +6fbdc 4 121 75 +6fbe0 24 121 75 +6fc04 10 333 122 +6fc14 c 121 75 +6fc20 4 568 136 +6fc24 4 571 136 +6fc28 10 572 136 +6fc38 8 573 136 +6fc40 14 575 136 +6fc54 4 125 75 +6fc58 4 126 75 +6fc5c 4 125 75 +6fc60 14 133 75 +6fc74 4 136 75 +6fc78 8 137 75 +6fc80 4 138 75 +6fc84 4 142 75 +6fc88 8 139 75 +6fc90 10 140 75 +6fca0 4 142 75 +6fca4 14 143 75 +FUNC 6fcb8 238 0 google_breakpad::MinidumpContext::CheckAgainstSystemInfo +6fcb8 14 1106 73 +6fccc 4 1106 73 +6fcd0 14 1109 73 +6fce4 4 1110 73 +6fce8 1c 1112 73 +6fd04 4 1113 73 +6fd08 4 1112 73 +6fd0c 10 333 122 +6fd1c 8 1112 73 +6fd24 4 1113 73 +6fd28 8 675 65 +6fd30 4 1125 73 +6fd34 48 1130 73 +6fd7c 8 1155 73 +6fd84 18 1130 73 +6fd9c 8 1165 73 +6fda4 10 1133 73 +6fdb4 c 1132 73 +6fdc0 8 1133 73 +6fdc8 8 1140 73 +6fdd0 8 1145 73 +6fdd8 8 1150 73 +6fde0 8 1155 73 +6fde8 8 1160 73 +6fdf0 c 1170 73 +6fdfc 24 1120 73 +6fe20 10 333 122 +6fe30 8 1120 73 +6fe38 4 1121 73 +6fe3c 20 1175 73 +6fe5c 4 1176 73 +6fe60 4 1175 73 +6fe64 4 110 72 +6fe68 10 333 122 +6fe78 8 1176 73 +6fe80 4 1178 73 +6fe84 4 1176 73 +6fe88 10 1176 73 +6fe98 c 333 122 +6fea4 c 1178 73 +6feb0 c 1178 73 +6febc c 156 132 +6fec8 4 1175 73 +6fecc 4 156 132 +6fed0 8 1175 73 +6fed8 18 1181 73 +FUNC 6fef0 108 0 google_breakpad::MinidumpModuleList::GetModuleForAddress +6fef0 10 2571 73 +6ff00 8 2571 73 +6ff08 8 2572 73 +6ff10 24 2573 73 +6ff34 10 333 122 +6ff44 8 2573 73 +6ff4c 20 2578 73 +6ff6c 1c 2579 73 +6ff88 4 2580 73 +6ff8c 4 2579 73 +6ff90 4 110 72 +6ff94 10 333 122 +6ffa4 c 2580 73 +6ffb0 c 2580 73 +6ffbc 8 156 132 +6ffc4 8 2579 73 +6ffcc 8 2581 73 +6ffd4 14 2584 73 +6ffe8 10 2585 73 +FUNC 70020 fc 0 google_breakpad::MinidumpThreadList::GetThreadAtIndex +70020 10 1652 73 +70030 8 1652 73 +70038 8 1653 73 +70040 24 1654 73 +70064 10 333 122 +70074 8 1654 73 +7007c c 1658 73 +70088 24 1659 73 +700ac 4 110 72 +700b0 10 333 122 +700c0 10 254 121 +700d0 c 333 122 +700dc c 254 121 +700e8 8 1659 73 +700f0 c 1659 73 +700fc 10 202 139 +7010c 10 1665 73 +FUNC 7011c fc 0 google_breakpad::MinidumpModuleList::GetModuleAtIndex +7011c 10 2624 73 +7012c 8 2624 73 +70134 8 2625 73 +7013c 24 2626 73 +70160 10 333 122 +70170 8 2626 73 +70178 c 2630 73 +70184 24 2631 73 +701a8 4 110 72 +701ac 10 333 122 +701bc 10 254 121 +701cc c 333 122 +701d8 c 254 121 +701e4 8 2631 73 +701ec c 2631 73 +701f8 10 202 139 +70208 10 2637 73 +FUNC 70240 fc 0 google_breakpad::MinidumpMemoryList::GetMemoryRegionAtIndex +70240 10 2805 73 +70250 8 2805 73 +70258 8 2806 73 +70260 24 2807 73 +70284 10 333 122 +70294 8 2807 73 +7029c c 2811 73 +702a8 24 2812 73 +702cc 4 110 72 +702d0 10 333 122 +702e0 10 254 121 +702f0 c 333 122 +702fc c 254 121 +70308 8 2812 73 +70310 c 2812 73 +7031c 10 202 139 +7032c 10 2818 73 +FUNC 7033c 100 0 google_breakpad::MinidumpMemoryList::GetMemoryRegionForAddress +7033c 10 2822 73 +7034c 8 2822 73 +70354 8 2823 73 +7035c 24 2824 73 +70380 10 333 122 +70390 8 2824 73 +70398 20 2829 73 +703b8 1c 2830 73 +703d4 4 2831 73 +703d8 4 2830 73 +703dc 4 110 72 +703e0 10 333 122 +703f0 c 2831 73 +703fc c 2831 73 +70408 8 156 132 +70410 8 2830 73 +70418 8 2832 73 +70420 c 2835 73 +7042c 10 2836 73 +FUNC 7043c 1e4 0 google_breakpad::MinidumpModuleList::GetModuleAtSequence +7043c 14 2601 73 +70450 8 2601 73 +70458 8 2602 73 +70460 24 2603 73 +70484 14 333 122 +70498 c 2607 73 +704a4 24 2608 73 +704c8 4 110 72 +704cc 10 333 122 +704dc 10 254 121 +704ec c 333 122 +704f8 c 254 121 +70504 8 2608 73 +7050c 8 2610 73 +70514 4 2614 73 +70518 4 207 75 +7051c 8 184 75 +70524 28 185 75 +7054c 4 110 72 +70550 10 333 122 +70560 10 185 75 +70570 c 333 122 +7057c c 185 75 +70588 8 185 75 +70590 1c 2615 73 +705ac 4 110 72 +705b0 10 333 122 +705c0 c 254 121 +705cc c 2615 73 +705d8 4 192 75 +705dc 8 192 75 +705e4 4 177 136 +705e8 4 192 75 +705ec c 177 136 +705f8 14 2619 73 +7060c 14 2620 73 +FUNC 70648 378 0 google_breakpad::UTF16ToUTF8 +70648 10 234 73 +70658 4 235 73 +7065c c 234 73 +70668 4 235 73 +7066c 8 234 73 +70674 8 235 73 +7067c 8 235 73 +70684 4 92 57 +70688 10 192 139 +70698 8 159 130 +706a0 10 600 130 +706b0 4 72 132 +706b4 10 400 131 +706c4 4 72 132 +706c8 4 162 130 +706cc 4 72 132 +706d0 8 72 132 +706d8 8 163 130 +706e0 c 166 130 +706ec 4 248 73 +706f0 4 286 73 +706f4 10 242 73 +70704 8 246 73 +7070c 4 247 73 +70710 8 248 73 +70718 18 252 73 +70730 24 253 73 +70754 4 110 72 +70758 10 333 122 +70768 c 254 73 +70774 c 254 73 +70780 c 333 122 +7078c 10 256 73 +7079c 8 259 73 +707a4 4 258 73 +707a8 4 259 73 +707ac 8 258 73 +707b4 4 259 73 +707b8 24 260 73 +707dc 4 110 72 +707e0 10 333 122 +707f0 c 261 73 +707fc c 261 73 +70808 c 333 122 +70814 8 156 132 +7081c 8 260 73 +70824 8 265 73 +7082c 14 266 73 +70840 20 267 73 +70860 4 268 73 +70864 4 267 73 +70868 4 110 72 +7086c 10 333 122 +7087c c 268 73 +70888 10 268 73 +70898 c 333 122 +708a4 c 269 73 +708b0 c 269 73 +708bc 10 156 132 +708cc 8 267 73 +708d4 8 255 73 +708dc 10 272 73 +708ec 4 281 73 +708f0 4 276 73 +708f4 4 281 73 +708f8 c 453 131 +70904 8 283 73 +7090c 4 453 131 +70910 4 284 73 +70914 8 453 131 +7091c 4 285 73 +70920 c 453 131 +7092c 14 286 73 +70940 c 453 131 +7094c 4 291 73 +70950 c 453 131 +7095c 4 292 73 +70960 10 453 131 +70970 4 293 73 +70974 14 453 131 +70988 8 242 73 +70990 4 143 57 +70994 4 144 57 +70998 8 302 73 +709a0 20 303 73 +FUNC 709c0 214 0 google_breakpad::MinidumpModule::code_identifier +709c0 14 1827 73 +709d4 8 1827 73 +709dc c 1828 73 +709e8 20 1829 73 +70a08 10 333 122 +70a18 8 1833 73 +70a20 14 1836 73 +70a34 4 1837 73 +70a38 20 1839 73 +70a58 10 333 122 +70a68 8 675 65 +70a70 c 1849 73 +70a7c 4 1851 73 +70a80 4 1849 73 +70a84 28 1851 73 +70aac 1c 1858 73 +70ac8 c 1859 73 +70ad4 10 1851 73 +70ae4 10 1873 73 +70af4 4 1874 73 +70af8 24 1881 73 +70b1c 4 110 72 +70b20 10 333 122 +70b30 c 1881 73 +70b3c c 1881 73 +70b48 8 156 132 +70b50 8 1881 73 +70b58 c 1886 73 +70b64 c 156 132 +70b70 20 1845 73 +70b90 10 333 122 +70ba0 8 1845 73 +70ba8 14 1846 73 +70bbc 18 1887 73 +FUNC 70bdc 1e4 0 google_breakpad::MinidumpModule::debug_identifier +70bdc 18 1970 73 +70bf4 c 1970 73 +70c00 8 1971 73 +70c08 20 1972 73 +70c28 10 333 122 +70c38 c 1972 73 +70c44 8 1976 73 +70c4c 18 1977 73 +70c64 10 1979 73 +70c74 8 1982 73 +70c7c 18 1983 73 +70c94 64 2005 73 +70cf8 14 2007 73 +70d0c 1c 2017 73 +70d28 c 2018 73 +70d34 10 2033 73 +70d44 20 2033 73 +70d64 4 110 72 +70d68 10 333 122 +70d78 c 2033 73 +70d84 8 2033 73 +70d8c c 2035 73 +70d98 8 156 132 +70da0 20 2036 73 +FUNC 70dc8 168 0 google_breakpad::MinidumpModule::version +70dc8 14 2039 73 +70ddc c 2039 73 +70de8 8 2040 73 +70df0 20 2041 73 +70e10 10 333 122 +70e20 8 2041 73 +70e28 18 2042 73 +70e40 10 2045 73 +70e50 24 2047 73 +70e74 2c 2054 73 +70ea0 c 2055 73 +70eac 10 2065 73 +70ebc 20 2065 73 +70edc 4 110 72 +70ee0 10 333 122 +70ef0 c 2065 73 +70efc 8 2065 73 +70f04 c 2067 73 +70f10 8 156 132 +70f18 18 2068 73 +FUNC 70f38 248 0 google_breakpad::MinidumpModule::debug_file +70f38 18 1890 73 +70f50 8 1890 73 +70f58 c 1891 73 +70f64 20 1892 73 +70f84 10 333 122 +70f94 c 1892 73 +70fa0 8 1896 73 +70fa8 18 1897 73 +70fc0 10 1899 73 +70fd0 8 1901 73 +70fd8 14 1902 73 +70fec 10 1909 73 +70ffc 10 1910 73 +7100c 10 1917 73 +7101c 10 1924 73 +7102c c 1926 73 +71038 8 1929 73 +71040 4 1932 73 +71044 8 225 131 +7104c 4 112 132 +71050 4 225 131 +71054 4 481 101 +71058 4 225 131 +7105c 10 349 131 +7106c c 156 132 +71078 8 1943 73 +71080 8 1944 73 +71088 4 1949 73 +7108c 4 1945 73 +71090 8 116 143 +71098 4 1949 73 +7109c c 116 143 +710a8 4 1950 73 +710ac 10 1951 73 +710bc c 1955 73 +710c8 4 92 57 +710cc 4 348 131 +710d0 4 1955 73 +710d4 4 348 131 +710d8 10 349 131 +710e8 8 1955 73 +710f0 8 304 139 +710f8 10 1964 73 +71108 20 1964 73 +71128 4 110 72 +7112c 10 333 122 +7113c c 1964 73 +71148 8 1964 73 +71150 c 1966 73 +7115c 8 156 132 +71164 1c 1967 73 +FUNC 71188 50 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_erase +71188 18 655 135 +711a0 4 657 135 +711a4 c 658 135 +711b0 4 659 135 +711b4 14 161 101 +711c8 10 664 135 +FUNC 711d8 5c 0 google_breakpad::MinidumpThreadList::~MinidumpThreadList +711d8 c 1548 73 +711e4 c 1548 73 +711f0 4 1549 73 +711f4 4 1548 73 +711f8 4 1549 73 +711fc 8 42 143 +71204 8 1549 73 +7120c c 531 136 +71218 4 532 136 +7121c 8 1550 73 +71224 4 532 136 +71228 c 1550 73 +FUNC 71234 24 0 google_breakpad::MinidumpThreadList::~MinidumpThreadList +71234 c 1548 73 +71240 4 1548 73 +71244 4 1550 73 +71248 4 1550 73 +7124c 8 1550 73 +71254 4 1550 73 +FUNC 71258 50 0 std::priv::_Rb_tree, std::pair::Range>, std::priv::_Select1st::Range> >, std::priv::_MapTraitsT::Range> >, std::allocator::Range> > >::_M_erase +71258 18 655 135 +71270 4 657 135 +71274 c 658 135 +71280 4 659 135 +71284 14 161 101 +71298 10 664 135 +FUNC 712a8 3c 0 std::priv::_Rb_tree, std::pair::Range>, std::priv::_Select1st::Range> >, std::priv::_MapTraitsT::Range> >, std::allocator::Range> > >::clear +712a8 8 530 136 +712b0 4 531 136 +712b4 4 530 136 +712b8 4 530 136 +712bc 4 531 136 +712c0 8 532 136 +712c8 4 533 136 +712cc 4 534 136 +712d0 4 535 136 +712d4 4 536 136 +712d8 c 538 136 +FUNC 712e4 6c 0 google_breakpad::MinidumpModuleList::~MinidumpModuleList +712e4 c 2439 73 +712f0 c 2439 73 +712fc 4 2440 73 +71300 10 2439 73 +71310 4 2440 73 +71314 8 414 136 +7131c 8 2440 73 +71324 8 2441 73 +7132c 8 42 143 +71334 4 2441 73 +71338 8 2442 73 +71340 4 2441 73 +71344 c 2442 73 +FUNC 71358 24 0 google_breakpad::MinidumpModuleList::~MinidumpModuleList +71358 c 2439 73 +71364 4 2439 73 +71368 4 2442 73 +7136c 4 2442 73 +71370 8 2442 73 +71378 4 2442 73 +FUNC 71384 78 0 google_breakpad::MinidumpMemoryList::~MinidumpMemoryList +71384 c 2682 73 +71390 c 2682 73 +7139c 4 2683 73 +713a0 4 2682 73 +713a4 4 2683 73 +713a8 8 414 136 +713b0 8 2683 73 +713b8 8 2684 73 +713c0 8 42 143 +713c8 8 2684 73 +713d0 8 2685 73 +713d8 8 42 143 +713e0 4 2685 73 +713e4 8 2686 73 +713ec 4 2685 73 +713f0 c 2686 73 +FUNC 713fc 24 0 google_breakpad::MinidumpMemoryList::~MinidumpMemoryList +713fc c 2682 73 +71408 4 2682 73 +7140c 4 2686 73 +71410 4 2686 73 +71414 8 2686 73 +7141c 4 2686 73 +FUNC 71420 58 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_erase +71420 18 655 135 +71438 4 657 135 +7143c c 658 135 +71448 4 659 135 +7144c 8 51 124 +71454 14 161 101 +71468 10 664 135 +FUNC 71478 d4 0 google_breakpad::Minidump::~Minidump +71478 c 3992 73 +71484 10 3992 73 +71494 8 3993 73 +7149c 24 3994 73 +714c0 10 333 122 +714d0 8 3994 73 +714d8 10 3996 73 +714e8 8 3997 73 +714f0 c 3997 73 +714fc 8 3999 73 +71504 8 42 143 +7150c 8 3999 73 +71514 8 4000 73 +7151c 8 531 136 +71524 c 532 136 +71530 8 4000 73 +71538 8 156 132 +71540 c 4001 73 +FUNC 7154c 24 0 google_breakpad::Minidump::~Minidump +7154c c 3992 73 +71558 4 3992 73 +7155c 4 4001 73 +71560 4 4001 73 +71564 8 4001 73 +7156c 4 4001 73 +FUNC 71570 78 0 std::_M_init_noskip > +71570 c 310 112 +7157c 4 310 112 +71580 18 311 112 +71598 4 312 112 +7159c 4 313 112 +715a0 14 315 112 +715b4 8 316 112 +715bc 8 319 112 +715c4 c 320 112 +715d0 4 174 110 +715d4 4 321 112 +715d8 4 174 110 +715dc c 321 112 +FUNC 715e8 134 0 google_breakpad::Minidump::SeekSet +715e8 10 4445 73 +715f8 4 4448 73 +715fc 4 4449 73 +71600 8 4448 73 +71608 c 207 112 +71614 4 521 111 +71618 4 522 111 +7161c 8 521 111 +71624 8 176 110 +7162c 10 522 111 +7163c 4 4452 73 +71640 4 4458 73 +71644 14 4452 73 +71658 18 4453 73 +71670 c 4454 73 +7167c 20 4455 73 +7169c 4 110 72 +716a0 10 333 122 +716b0 10 4455 73 +716c0 c 333 122 +716cc c 4455 73 +716d8 8 4455 73 +716e0 10 156 132 +716f0 18 147 129 +71708 14 4459 73 +FUNC 7171c 270 0 google_breakpad::Minidump::SeekToStreamType +7171c 14 4526 73 +71730 10 4526 73 +71740 4 4528 73 +71744 20 4528 73 +71764 10 333 122 +71774 8 4528 73 +7177c 4 4530 73 +71780 8 4532 73 +71788 20 4533 73 +717a8 10 333 122 +717b8 8 4533 73 +717c0 4 4534 73 +717c4 10 210 118 +717d4 4 168 136 +717d8 c 4538 73 +717e4 1c 4540 73 +71800 4 4541 73 +71804 4 4540 73 +71808 4 110 72 +7180c 10 333 122 +7181c c 254 121 +71828 c 333 122 +71834 8 4540 73 +7183c 4 4541 73 +71840 10 4544 73 +71850 4 4545 73 +71854 4 4544 73 +71858 8 4545 73 +71860 24 4546 73 +71884 4 110 72 +71888 10 333 122 +71898 10 254 121 +718a8 c 333 122 +718b4 10 254 121 +718c4 c 333 122 +718d0 8 254 121 +718d8 4 4549 73 +718dc 4 254 121 +718e0 8 4546 73 +718e8 8 4549 73 +718f0 10 202 139 +71900 14 4553 73 +71914 24 4554 73 +71938 4 110 72 +7193c 10 333 122 +7194c c 254 121 +71958 8 4554 73 +71960 4 4556 73 +71964 8 4559 73 +7196c 8 4561 73 +71974 18 4562 73 +FUNC 7198c 280 0 google_breakpad::Minidump::GetStream +7198c 18 4566 73 +719a4 8 4570 73 +719ac 4 4566 73 +719b0 4 4572 73 +719b4 24 4572 73 +719d8 4 110 72 +719dc 10 333 122 +719ec c 254 121 +719f8 c 333 122 +71a04 8 4572 73 +71a0c 4 4575 73 +71a10 8 4577 73 +71a18 24 4578 73 +71a3c 4 110 72 +71a40 10 333 122 +71a50 c 254 121 +71a5c 8 4578 73 +71a64 8 4579 73 +71a6c 10 210 118 +71a7c 4 197 136 +71a80 c 4583 73 +71a8c 24 4585 73 +71ab0 4 110 72 +71ab4 10 333 122 +71ac4 c 254 121 +71ad0 10 333 122 +71ae0 c 4592 73 +71aec 4 4595 73 +71af0 8 4596 73 +71af8 18 4600 73 +71b10 24 4601 73 +71b34 4 110 72 +71b38 10 333 122 +71b48 c 254 121 +71b54 8 4601 73 +71b5c c 4605 73 +71b68 8 4605 73 +71b70 4 4607 73 +71b74 14 4607 73 +71b88 4 4607 73 +71b8c 24 4608 73 +71bb0 4 110 72 +71bb4 10 333 122 +71bc4 c 254 121 +71bd0 8 4608 73 +71bd8 14 98 57 +71bec 4 4612 73 +71bf0 4 4613 73 +71bf4 4 4614 73 +71bf8 14 4615 73 +FUNC 71c0c 18 0 google_breakpad::Minidump::GetException +71c0c 8 4249 73 +71c14 8 4251 73 +71c1c 8 4252 73 +FUNC 71c24 280 0 google_breakpad::Minidump::GetStream +71c24 18 4566 73 +71c3c 8 4570 73 +71c44 4 4566 73 +71c48 4 4572 73 +71c4c 24 4572 73 +71c70 4 110 72 +71c74 10 333 122 +71c84 c 254 121 +71c90 c 333 122 +71c9c 8 4572 73 +71ca4 4 4575 73 +71ca8 8 4577 73 +71cb0 24 4578 73 +71cd4 4 110 72 +71cd8 10 333 122 +71ce8 c 254 121 +71cf4 8 4578 73 +71cfc 8 4579 73 +71d04 10 210 118 +71d14 4 197 136 +71d18 c 4583 73 +71d24 24 4585 73 +71d48 4 110 72 +71d4c 10 333 122 +71d5c c 254 121 +71d68 10 333 122 +71d78 c 4592 73 +71d84 4 4595 73 +71d88 8 4596 73 +71d90 18 4600 73 +71da8 24 4601 73 +71dcc 4 110 72 +71dd0 10 333 122 +71de0 c 254 121 +71dec 8 4601 73 +71df4 c 4605 73 +71e00 8 4605 73 +71e08 4 4607 73 +71e0c 14 4607 73 +71e20 4 4607 73 +71e24 24 4608 73 +71e48 4 110 72 +71e4c 10 333 122 +71e5c c 254 121 +71e68 8 4608 73 +71e70 14 98 57 +71e84 4 4612 73 +71e88 4 4613 73 +71e8c 4 4614 73 +71e90 14 4615 73 +FUNC 71ea4 18 0 google_breakpad::Minidump::GetSystemInfo +71ea4 8 4260 73 +71eac 8 4262 73 +71eb4 8 4263 73 +FUNC 71ebc 280 0 google_breakpad::Minidump::GetStream +71ebc 18 4566 73 +71ed4 8 4570 73 +71edc 4 4566 73 +71ee0 4 4572 73 +71ee4 24 4572 73 +71f08 4 110 72 +71f0c 10 333 122 +71f1c c 254 121 +71f28 c 333 122 +71f34 8 4572 73 +71f3c 4 4575 73 +71f40 8 4577 73 +71f48 24 4578 73 +71f6c 4 110 72 +71f70 10 333 122 +71f80 c 254 121 +71f8c 8 4578 73 +71f94 8 4579 73 +71f9c 10 210 118 +71fac 4 197 136 +71fb0 c 4583 73 +71fbc 24 4585 73 +71fe0 4 110 72 +71fe4 10 333 122 +71ff4 c 254 121 +72000 10 333 122 +72010 c 4592 73 +7201c 4 4595 73 +72020 8 4596 73 +72028 18 4600 73 +72040 24 4601 73 +72064 4 110 72 +72068 10 333 122 +72078 c 254 121 +72084 8 4601 73 +7208c c 4605 73 +72098 8 4605 73 +720a0 4 4607 73 +720a4 14 4607 73 +720b8 4 4607 73 +720bc 24 4608 73 +720e0 4 110 72 +720e4 10 333 122 +720f4 c 254 121 +72100 8 4608 73 +72108 14 98 57 +7211c 4 4612 73 +72120 4 4613 73 +72124 4 4614 73 +72128 14 4615 73 +FUNC 7213c 18 0 google_breakpad::Minidump::GetThreadList +7213c 8 4231 73 +72144 8 4233 73 +7214c 8 4234 73 +FUNC 72154 280 0 google_breakpad::Minidump::GetStream +72154 18 4566 73 +7216c 8 4570 73 +72174 4 4566 73 +72178 4 4572 73 +7217c 24 4572 73 +721a0 4 110 72 +721a4 10 333 122 +721b4 c 254 121 +721c0 c 333 122 +721cc 8 4572 73 +721d4 4 4575 73 +721d8 8 4577 73 +721e0 24 4578 73 +72204 4 110 72 +72208 10 333 122 +72218 c 254 121 +72224 8 4578 73 +7222c 8 4579 73 +72234 10 210 118 +72244 4 197 136 +72248 c 4583 73 +72254 24 4585 73 +72278 4 110 72 +7227c 10 333 122 +7228c c 254 121 +72298 10 333 122 +722a8 c 4592 73 +722b4 4 4595 73 +722b8 8 4596 73 +722c0 18 4600 73 +722d8 24 4601 73 +722fc 4 110 72 +72300 10 333 122 +72310 c 254 121 +7231c 8 4601 73 +72324 c 4605 73 +72330 8 4605 73 +72338 4 4607 73 +7233c 14 4607 73 +72350 4 4607 73 +72354 24 4608 73 +72378 4 110 72 +7237c 10 333 122 +7238c c 254 121 +72398 8 4608 73 +723a0 14 98 57 +723b4 4 4612 73 +723b8 4 4613 73 +723bc 4 4614 73 +723c0 14 4615 73 +FUNC 723d4 18 0 google_breakpad::Minidump::GetModuleList +723d4 8 4237 73 +723dc 8 4239 73 +723e4 8 4240 73 +FUNC 723ec 280 0 google_breakpad::Minidump::GetStream +723ec 18 4566 73 +72404 8 4570 73 +7240c 4 4566 73 +72410 4 4572 73 +72414 24 4572 73 +72438 4 110 72 +7243c 10 333 122 +7244c c 254 121 +72458 c 333 122 +72464 8 4572 73 +7246c 4 4575 73 +72470 8 4577 73 +72478 24 4578 73 +7249c 4 110 72 +724a0 10 333 122 +724b0 c 254 121 +724bc 8 4578 73 +724c4 8 4579 73 +724cc 10 210 118 +724dc 4 197 136 +724e0 c 4583 73 +724ec 24 4585 73 +72510 4 110 72 +72514 10 333 122 +72524 c 254 121 +72530 10 333 122 +72540 c 4592 73 +7254c 4 4595 73 +72550 8 4596 73 +72558 18 4600 73 +72570 24 4601 73 +72594 4 110 72 +72598 10 333 122 +725a8 c 254 121 +725b4 8 4601 73 +725bc c 4605 73 +725c8 8 4605 73 +725d0 4 4607 73 +725d4 14 4607 73 +725e8 4 4607 73 +725ec 24 4608 73 +72610 4 110 72 +72614 10 333 122 +72624 c 254 121 +72630 8 4608 73 +72638 14 98 57 +7264c 4 4612 73 +72650 4 4613 73 +72654 4 4614 73 +72658 14 4615 73 +FUNC 7266c 18 0 google_breakpad::Minidump::GetMemoryList +7266c 8 4243 73 +72674 8 4245 73 +7267c 8 4246 73 +FUNC 72684 370 0 google_breakpad::Minidump::Open +72684 1c 4004 73 +726a0 8 4004 73 +726a8 10 4005 73 +726b8 1c 4006 73 +726d4 4 110 72 +726d8 10 333 122 +726e8 c 4006 73 +726f4 8 4006 73 +726fc 18 4010 73 +72714 8 4013 73 +7271c 4 92 108 +72720 4 4013 73 +72724 4 92 108 +72728 4 464 105 +7272c 4 61 104 +72730 8 92 108 +72738 4 87 112 +7273c 8 92 108 +72744 8 87 112 +7274c 8 87 112 +72754 4 88 112 +72758 4 87 112 +7275c 4 88 112 +72760 4 87 112 +72764 4 88 112 +72768 c 464 105 +72774 c 464 105 +72780 2c 34 128 +727ac c 61 104 +727b8 8 61 104 +727c0 8 61 104 +727c8 4 63 104 +727cc 2c 61 104 +727f8 10 61 104 +72808 10 61 104 +72818 10 61 104 +72828 10 61 104 +72838 24 61 104 +7285c 4 63 104 +72860 10 347 117 +72870 14 736 104 +72884 4 746 104 +72888 8 747 104 +72890 8 748 104 +72898 8 63 104 +728a0 c 465 105 +728ac 18 169 105 +728c4 4 4013 73 +728c8 14 4014 73 +728dc 10 4015 73 +728ec c 4016 73 +728f8 1c 4017 73 +72914 4 110 72 +72918 10 333 122 +72928 10 4017 73 +72938 c 333 122 +72944 10 4018 73 +72954 c 333 122 +72960 c 4018 73 +7296c 8 4017 73 +72974 8 156 132 +7297c 8 4019 73 +72984 10 467 105 +72994 18 4022 73 +729ac 4 110 72 +729b0 10 333 122 +729c0 c 4022 73 +729cc 8 4022 73 +729d4 4 4023 73 +729d8 1c 4024 73 +FUNC 729f4 8c 0 google_breakpad::Minidump::Tell +729f4 10 4461 73 +72a04 4 4462 73 +72a08 4 4463 73 +72a0c 4 4462 73 +72a10 8 4462 73 +72a18 8 207 112 +72a20 10 497 111 +72a30 4 499 111 +72a34 4 176 110 +72a38 c 499 111 +72a44 18 147 129 +72a5c 8 499 111 +72a64 10 499 111 +72a74 c 4475 73 +FUNC 72a80 134 0 google_breakpad::Minidump::GetContextCPUFlagsFromSystemInfo +72a80 10 4026 73 +72a90 4 4026 73 +72a94 4 4028 73 +72a98 4 4026 73 +72a9c 4 4031 73 +72aa0 4 4032 73 +72aa4 4 4031 73 +72aa8 4 4032 73 +72aac 14 4039 73 +72ac0 4 4039 73 +72ac4 c 4039 73 +72ad0 8 675 65 +72ad8 14 4042 73 +72aec 4 4053 73 +72af0 c 4042 73 +72afc 4 4047 73 +72b00 8 4042 73 +72b08 8 4044 73 +72b10 4 4042 73 +72b14 4 4062 73 +72b18 8 4042 73 +72b20 8 4059 73 +72b28 18 4042 73 +72b40 8 4077 73 +72b48 10 4042 73 +72b58 8 4056 73 +72b60 8 4050 73 +72b68 8 4065 73 +72b70 8 4068 73 +72b78 8 4083 73 +72b80 4 4084 73 +72b84 4 4089 73 +72b88 8 4095 73 +72b90 c 4096 73 +72b9c 4 4095 73 +72ba0 14 4096 73 +FUNC 72bb4 1b0 0 std::basic_istream >::read +72bb4 24 783 111 +72bd8 4 207 112 +72bdc 4 785 111 +72be0 8 207 112 +72be8 4 787 111 +72bec 8 787 111 +72bf4 4 175 110 +72bf8 8 787 111 +72c00 10 802 111 +72c10 c 804 111 +72c1c 4 175 110 +72c20 4 804 111 +72c24 10 805 111 +72c34 10 789 111 +72c44 4 641 111 +72c48 4 640 111 +72c4c c 690 111 +72c58 c 645 111 +72c64 28 714 111 +72c8c 4 703 111 +72c90 14 704 111 +72ca4 8 640 111 +72cac 20 799 111 +72ccc 8 796 111 +72cd4 4 652 111 +72cd8 c 655 111 +72ce4 4 172 140 +72ce8 c 172 140 +72cf4 4 658 111 +72cf8 4 91 129 +72cfc 4 657 111 +72d00 4 671 111 +72d04 8 91 129 +72d0c 4 682 111 +72d10 4 671 111 +72d14 10 235 129 +72d24 4 234 129 +72d28 c 235 129 +72d34 14 690 111 +72d48 1c 808 111 +FUNC 72d64 158 0 google_breakpad::Minidump::ReadBytes +72d64 10 4413 73 +72d74 4 4413 73 +72d78 4 4416 73 +72d7c 4 4417 73 +72d80 8 4416 73 +72d88 10 4419 73 +72d98 8 4421 73 +72da0 14 4422 73 +72db4 c 4423 73 +72dc0 20 4424 73 +72de0 4 110 72 +72de4 10 333 122 +72df4 10 4424 73 +72e04 c 333 122 +72e10 c 4424 73 +72e1c 8 4424 73 +72e24 c 156 132 +72e30 4 4436 73 +72e34 4 4441 73 +72e38 4 4436 73 +72e3c 24 4437 73 +72e60 4 110 72 +72e64 10 333 122 +72e74 10 263 121 +72e84 c 333 122 +72e90 c 263 121 +72e9c 8 4437 73 +72ea4 4 4438 73 +72ea8 14 4442 73 +FUNC 72ebc 14f4 0 google_breakpad::MinidumpContext::Read +72ebc 14 423 73 +72ed0 4 424 73 +72ed4 8 423 73 +72edc 4 443 73 +72ee0 8 448 73 +72ee8 28 449 73 +72f10 10 333 122 +72f20 8 449 73 +72f28 18 451 73 +72f40 14 453 73 +72f54 4 452 73 +72f58 1c 454 73 +72f74 10 333 122 +72f84 14 458 73 +72f98 8 459 73 +72fa0 c 461 73 +72fac 4 462 73 +72fb0 14 463 73 +72fc4 14 464 73 +72fd8 1c 466 73 +72ff4 10 333 122 +73004 c 471 73 +73010 1c 474 73 +7302c 10 333 122 +7303c 10 480 73 +7304c 1c 481 73 +73068 10 333 122 +73078 10 481 73 +73088 4 480 73 +7308c 8 155 73 +73094 8 156 73 +7309c 4 157 73 +730a0 8 487 73 +730a8 14 492 73 +730bc 8 493 73 +730c4 8 494 73 +730cc 8 495 73 +730d4 8 496 73 +730dc 8 497 73 +730e4 8 498 73 +730ec 8 500 73 +730f4 8 501 73 +730fc 8 502 73 +73104 8 503 73 +7310c 8 504 73 +73114 8 505 73 +7311c 8 506 73 +73124 8 507 73 +7312c 8 508 73 +73134 8 509 73 +7313c 8 510 73 +73144 8 511 73 +7314c 8 512 73 +73154 8 513 73 +7315c 8 514 73 +73164 8 515 73 +7316c 8 516 73 +73174 8 517 73 +7317c 8 518 73 +73184 8 519 73 +7318c 8 520 73 +73194 8 521 73 +7319c 8 522 73 +731a4 8 523 73 +731ac 8 524 73 +731b4 8 525 73 +731bc 8 526 73 +731c4 8 527 73 +731cc 8 528 73 +731d4 8 529 73 +731dc 8 164 73 +731e4 c 165 73 +731f0 8 535 73 +731f8 8 539 73 +73200 8 540 73 +73208 8 541 73 +73210 8 542 73 +73218 8 543 73 +73220 8 544 73 +73228 c 547 73 +73234 10 549 73 +73244 8 550 73 +7324c 1c 554 73 +73268 24 555 73 +7328c 14 558 73 +732a0 8 559 73 +732a8 c 561 73 +732b4 18 562 73 +732cc 8 564 73 +732d4 14 565 73 +732e8 14 566 73 +732fc 24 568 73 +73320 10 333 122 +73330 10 573 73 +73340 24 576 73 +73364 10 333 122 +73374 8 583 73 +7337c 4 589 73 +73380 4 583 73 +73384 10 589 73 +73394 4 588 73 +73398 24 590 73 +733bc 10 333 122 +733cc 14 596 73 +733e0 24 597 73 +73404 10 333 122 +73414 14 600 73 +73428 10 602 73 +73438 8 603 73 +73440 c 607 73 +7344c 8 604 73 +73454 10 609 73 +73464 8 610 73 +7346c 8 611 73 +73474 8 612 73 +7347c 8 613 73 +73484 c 617 73 +73490 8 614 73 +73498 10 621 73 +734a8 8 164 73 +734b0 c 165 73 +734bc 8 622 73 +734c4 c 164 73 +734d0 8 165 73 +734d8 8 630 73 +734e0 c 633 73 +734ec 14 637 73 +73500 24 639 73 +73524 10 333 122 +73534 10 643 73 +73544 8 644 73 +7354c 24 649 73 +73570 4 651 73 +73574 4 649 73 +73578 10 333 122 +73588 8 649 73 +73590 18 651 73 +735a8 1c 652 73 +735c4 14 333 122 +735d8 14 655 73 +735ec 8 656 73 +735f4 18 658 73 +7360c c 660 73 +73618 4 661 73 +7361c 14 662 73 +73630 14 663 73 +73644 1c 665 73 +73660 10 333 122 +73670 10 670 73 +73680 1c 673 73 +7369c 10 333 122 +736ac 8 680 73 +736b4 4 686 73 +736b8 4 680 73 +736bc 10 686 73 +736cc 4 685 73 +736d0 1c 687 73 +736ec 10 333 122 +736fc 14 693 73 +73710 1c 694 73 +7372c 10 333 122 +7373c 18 698 73 +73754 c 718 73 +73760 14 722 73 +73774 1c 724 73 +73790 10 333 122 +737a0 c 703 73 +737ac 8 700 73 +737b4 10 705 73 +737c4 8 706 73 +737cc 8 707 73 +737d4 4 155 73 +737d8 8 156 73 +737e0 4 157 73 +737e4 8 164 73 +737ec c 165 73 +737f8 c 708 73 +73804 4 333 122 +73808 8 724 73 +73810 c 728 73 +7381c c 98 57 +73828 1c 731 73 +73844 24 732 73 +73868 10 333 122 +73878 14 735 73 +7388c 8 736 73 +73894 c 738 73 +738a0 4 739 73 +738a4 4 744 73 +738a8 c 746 73 +738b4 8 747 73 +738bc 8 751 73 +738c4 14 752 73 +738d8 14 753 73 +738ec 24 755 73 +73910 14 333 122 +73924 44 764 73 +73968 8 766 73 +73970 24 767 73 +73994 4 110 72 +73998 10 333 122 +739a8 10 254 121 +739b8 c 333 122 +739c4 c 263 121 +739d0 14 772 73 +739e4 4 777 73 +739e8 4 772 73 +739ec 4 777 73 +739f0 4 783 73 +739f4 4 777 73 +739f8 10 783 73 +73a08 4 782 73 +73a0c 24 784 73 +73a30 10 333 122 +73a40 14 790 73 +73a54 24 791 73 +73a78 10 333 122 +73a88 14 795 73 +73a9c 8 797 73 +73aa4 8 798 73 +73aac 8 799 73 +73ab4 8 800 73 +73abc 8 801 73 +73ac4 8 802 73 +73acc 8 803 73 +73ad4 8 804 73 +73adc 8 805 73 +73ae4 8 806 73 +73aec 8 807 73 +73af4 8 808 73 +73afc 8 809 73 +73b04 8 812 73 +73b0c 8 813 73 +73b14 8 814 73 +73b1c 8 815 73 +73b24 8 816 73 +73b2c 8 817 73 +73b34 8 818 73 +73b3c 8 819 73 +73b44 8 820 73 +73b4c 8 821 73 +73b54 8 822 73 +73b5c 8 823 73 +73b64 8 824 73 +73b6c 8 825 73 +73b74 8 826 73 +73b7c 8 827 73 +73b84 8 828 73 +73b8c 10 833 73 +73b9c 8 839 73 +73ba4 24 840 73 +73bc8 4 110 72 +73bcc 10 333 122 +73bdc 10 254 121 +73bec c 333 122 +73bf8 c 263 121 +73c04 14 845 73 +73c18 4 850 73 +73c1c 4 845 73 +73c20 4 850 73 +73c24 4 856 73 +73c28 4 850 73 +73c2c 10 856 73 +73c3c 4 855 73 +73c40 24 857 73 +73c64 10 333 122 +73c74 14 863 73 +73c88 24 864 73 +73cac 10 333 122 +73cbc 14 876 73 +73cd0 10 878 73 +73ce0 8 879 73 +73ce8 c 883 73 +73cf4 8 880 73 +73cfc 10 885 73 +73d0c 8 886 73 +73d14 8 887 73 +73d1c 8 888 73 +73d24 8 889 73 +73d2c 8 890 73 +73d34 c 894 73 +73d40 8 891 73 +73d48 10 898 73 +73d58 8 164 73 +73d60 c 165 73 +73d6c 8 899 73 +73d74 c 164 73 +73d80 8 165 73 +73d88 8 906 73 +73d90 10 909 73 +73da0 8 915 73 +73da8 24 916 73 +73dcc 4 110 72 +73dd0 10 333 122 +73de0 10 254 121 +73df0 c 333 122 +73dfc c 263 121 +73e08 18 921 73 +73e20 8 926 73 +73e28 4 932 73 +73e2c 4 926 73 +73e30 c 932 73 +73e3c 4 931 73 +73e40 24 933 73 +73e64 10 333 122 +73e74 14 939 73 +73e88 24 940 73 +73eac 10 333 122 +73ebc 1c 944 73 +73ed8 c 949 73 +73ee4 8 946 73 +73eec 10 951 73 +73efc 8 952 73 +73f04 8 953 73 +73f0c 8 954 73 +73f14 8 955 73 +73f1c 8 956 73 +73f24 c 960 73 +73f30 8 957 73 +73f38 8 962 73 +73f40 8 963 73 +73f48 10 965 73 +73f58 8 971 73 +73f60 24 972 73 +73f84 4 110 72 +73f88 10 333 122 +73f98 10 254 121 +73fa8 c 333 122 +73fb4 c 263 121 +73fc0 14 977 73 +73fd4 4 982 73 +73fd8 4 977 73 +73fdc 4 982 73 +73fe0 4 988 73 +73fe4 4 982 73 +73fe8 10 988 73 +73ff8 4 987 73 +73ffc 24 989 73 +74020 10 333 122 +74030 14 995 73 +74044 24 996 73 +74068 10 333 122 +74078 8 996 73 +74080 8 98 57 +74088 18 1000 73 +740a0 10 1020 73 +740b0 c 1005 73 +740bc 8 1002 73 +740c4 10 1007 73 +740d4 8 1008 73 +740dc c 1012 73 +740e8 c 1009 73 +740f4 c 1017 73 +74100 c 1014 73 +7410c 8 1026 73 +74114 24 1027 73 +74138 4 110 72 +7413c 10 333 122 +7414c 10 254 121 +7415c c 333 122 +74168 c 263 121 +74174 8 1027 73 +7417c 18 1034 73 +74194 8 1039 73 +7419c 4 1045 73 +741a0 4 1039 73 +741a4 c 1045 73 +741b0 4 1044 73 +741b4 24 1046 73 +741d8 10 333 122 +741e8 14 1052 73 +741fc 24 1053 73 +74220 10 333 122 +74230 8 1053 73 +74238 8 98 57 +74240 1c 1057 73 +7425c c 1062 73 +74268 8 1059 73 +74270 10 1064 73 +74280 8 1065 73 +74288 8 1069 73 +74290 c 1070 73 +7429c 8 1066 73 +742a4 10 1072 73 +742b4 8 1073 73 +742bc 8 1074 73 +742c4 8 1075 73 +742cc 8 1076 73 +742d4 c 1080 73 +742e0 8 1077 73 +742e8 8 1082 73 +742f0 8 1083 73 +742f8 c 1085 73 +74304 8 98 57 +7430c 10 1099 73 +7431c 8 98 57 +74324 20 1093 73 +74344 4 1094 73 +74348 4 1093 73 +7434c 4 110 72 +74350 10 333 122 +74360 c 1094 73 +7436c c 1094 73 +74378 8 156 132 +74380 8 1093 73 +74388 8 733 73 +74390 8 1102 73 +74398 4 1103 73 +7439c 14 1104 73 +FUNC 743b0 170 0 google_breakpad::MinidumpThread::GetContext +743b0 10 1448 73 +743c0 4 1448 73 +743c4 8 1449 73 +743cc 20 1450 73 +743ec 4 1451 73 +743f0 4 1450 73 +743f4 10 333 122 +74404 8 1450 73 +7440c 4 1451 73 +74410 8 1454 73 +74418 14 1455 73 +7442c 24 1456 73 +74450 10 333 122 +74460 8 1456 73 +74468 4 1457 73 +7446c 10 1460 73 +7447c 14 417 73 +74490 4 1462 73 +74494 8 92 57 +7449c c 1462 73 +744a8 4 1462 73 +744ac 24 1463 73 +744d0 10 333 122 +744e0 8 1463 73 +744e8 c 1464 73 +744f4 4 143 57 +744f8 4 1467 73 +744fc 4 1467 73 +74500 4 144 57 +74504 4 1467 73 +74508 4 1470 73 +7450c 14 1471 73 +FUNC 74520 170 0 google_breakpad::MinidumpException::GetContext +74520 10 2946 73 +74530 4 2946 73 +74534 8 2947 73 +7453c 20 2948 73 +7455c 4 2949 73 +74560 4 2948 73 +74564 10 333 122 +74574 8 2948 73 +7457c 4 2949 73 +74580 8 2952 73 +74588 14 2953 73 +7459c 24 2954 73 +745c0 10 333 122 +745d0 8 2954 73 +745d8 4 2955 73 +745dc 10 2958 73 +745ec 14 417 73 +74600 4 2962 73 +74604 8 92 57 +7460c c 2962 73 +74618 4 2962 73 +7461c 24 2963 73 +74640 10 333 122 +74650 8 2963 73 +74658 c 2964 73 +74664 4 143 57 +74668 4 2967 73 +7466c 4 2967 73 +74670 4 144 57 +74674 4 2967 73 +74678 4 2970 73 +7467c 14 2971 73 +FUNC 74690 240 0 google_breakpad::MinidumpThread::Read +74690 18 1386 73 +746a8 4 1386 73 +746ac 8 1388 73 +746b4 c 1388 73 +746c0 4 1390 73 +746c4 4 1389 73 +746c8 4 1390 73 +746cc c 1390 73 +746d8 8 1395 73 +746e0 4 1391 73 +746e4 4 1395 73 +746e8 4 1393 73 +746ec 14 1395 73 +74700 24 1396 73 +74724 10 333 122 +74734 8 1396 73 +7473c 4 1397 73 +74740 14 1400 73 +74754 8 1401 73 +7475c 8 1402 73 +74764 8 1403 73 +7476c 8 1404 73 +74774 8 1405 73 +7477c 8 189 73 +74784 8 190 73 +7478c 8 1407 73 +74794 8 1412 73 +7479c 4 1412 73 +747a0 4 1411 73 +747a4 8 1413 73 +747ac 8 1412 73 +747b4 20 1416 73 +747d4 4 1417 73 +747d8 4 1416 73 +747dc 4 110 72 +747e0 10 333 122 +747f0 c 1417 73 +747fc 8 1417 73 +74804 4 1418 73 +74808 8 1417 73 +74810 c 333 122 +7481c c 1418 73 +74828 8 1418 73 +74830 4 1419 73 +74834 8 1418 73 +7483c c 333 122 +74848 c 1419 73 +74854 c 1419 73 +74860 18 156 132 +74878 8 1416 73 +74880 8 1425 73 +74888 4 1426 73 +7488c c 1421 73 +74898 8 1421 73 +748a0 4 1421 73 +748a4 10 1422 73 +748b4 1c 1427 73 +FUNC 748d0 268 0 google_breakpad::MinidumpModule::Read +748d0 14 1723 73 +748e4 4 1723 73 +748e8 8 1725 73 +748f0 8 156 132 +748f8 8 1725 73 +74900 4 1727 73 +74904 4 1726 73 +74908 4 1727 73 +7490c 8 304 139 +74914 8 1727 73 +7491c 4 1730 73 +74920 4 1729 73 +74924 4 1728 73 +74928 4 1729 73 +7492c 4 1730 73 +74930 8 304 139 +74938 8 1730 73 +74940 8 1737 73 +74948 4 1731 73 +7494c 4 1737 73 +74950 4 1733 73 +74954 4 1737 73 +74958 4 1734 73 +7495c 4 1735 73 +74960 c 1737 73 +7496c 24 1738 73 +74990 10 333 122 +749a0 8 1738 73 +749a8 4 1739 73 +749ac 14 1742 73 +749c0 8 1743 73 +749c8 8 1744 73 +749d0 8 1745 73 +749d8 8 1746 73 +749e0 8 1747 73 +749e8 8 1748 73 +749f0 8 1749 73 +749f8 8 1750 73 +74a00 8 1751 73 +74a08 8 1752 73 +74a10 8 1753 73 +74a18 8 1754 73 +74a20 8 1755 73 +74a28 8 1756 73 +74a30 8 1757 73 +74a38 8 1758 73 +74a40 8 1759 73 +74a48 8 1760 73 +74a50 8 1761 73 +74a58 8 1762 73 +74a60 8 1768 73 +74a68 8 1770 73 +74a70 8 1768 73 +74a78 20 1771 73 +74a98 4 1772 73 +74a9c 4 1771 73 +74aa0 4 110 72 +74aa4 10 333 122 +74ab4 c 1772 73 +74ac0 8 1772 73 +74ac8 4 1773 73 +74acc 8 1772 73 +74ad4 c 333 122 +74ae0 c 1773 73 +74aec c 1773 73 +74af8 c 156 132 +74b04 4 1774 73 +74b08 4 156 132 +74b0c 8 1771 73 +74b14 4 1774 73 +74b18 8 1777 73 +74b20 18 1779 73 +FUNC 74b38 18c 0 google_breakpad::MinidumpException::Read +74b38 10 2888 73 +74b48 8 2888 73 +74b50 8 2890 73 +74b58 c 2890 73 +74b64 4 2891 73 +74b68 4 2895 73 +74b6c 4 2893 73 +74b70 4 2895 73 +74b74 24 2896 73 +74b98 4 110 72 +74b9c 10 333 122 +74bac 8 254 121 +74bb4 4 2898 73 +74bb8 8 254 121 +74bc0 c 333 122 +74bcc c 263 121 +74bd8 8 2896 73 +74be0 4 2898 73 +74be4 1c 2901 73 +74c00 24 2902 73 +74c24 10 333 122 +74c34 8 2902 73 +74c3c 4 2903 73 +74c40 14 2906 73 +74c54 10 2907 73 +74c64 8 2910 73 +74c6c 8 2911 73 +74c74 8 2912 73 +74c7c 8 2913 73 +74c84 8 2914 73 +74c8c c 2920 73 +74c98 8 2917 73 +74ca0 8 2922 73 +74ca8 8 2925 73 +74cb0 14 2927 73 +FUNC 74cc4 1f4 0 google_breakpad::MinidumpSystemInfo::Read +74cc4 10 3106 73 +74cd4 8 3106 73 +74cdc 8 3108 73 +74ce4 8 156 132 +74cec 8 3108 73 +74cf4 4 3110 73 +74cf8 4 3109 73 +74cfc 4 3110 73 +74d00 8 156 132 +74d08 8 3110 73 +74d10 4 3111 73 +74d14 4 3115 73 +74d18 4 3113 73 +74d1c 4 3115 73 +74d20 24 3116 73 +74d44 4 110 72 +74d48 10 333 122 +74d58 10 254 121 +74d68 c 333 122 +74d74 8 263 121 +74d7c 4 3118 73 +74d80 4 263 121 +74d84 8 3116 73 +74d8c 4 3118 73 +74d90 1c 3121 73 +74dac 24 3122 73 +74dd0 10 333 122 +74de0 8 3122 73 +74de8 4 3123 73 +74dec 14 3126 73 +74e00 c 3127 73 +74e0c 8 3128 73 +74e14 8 3129 73 +74e1c 8 3132 73 +74e24 8 3133 73 +74e2c 8 3134 73 +74e34 8 3135 73 +74e3c 8 3136 73 +74e44 8 3137 73 +74e4c 14 3140 73 +74e60 10 3149 73 +74e70 14 3143 73 +74e84 8 3144 73 +74e8c 8 3145 73 +74e94 8 3146 73 +74e9c 8 3153 73 +74ea4 14 3155 73 +FUNC 74eb8 2c8 0 google_breakpad::Minidump::ReadString +74eb8 14 4478 73 +74ecc 8 4478 73 +74ed4 c 4479 73 +74ee0 20 4480 73 +74f00 14 333 122 +74f14 c 4483 73 +74f20 20 4484 73 +74f40 4 110 72 +74f44 10 333 122 +74f54 c 259 121 +74f60 4 4484 73 +74f64 4 4485 73 +74f68 4 4484 73 +74f6c 4 4485 73 +74f70 1c 4489 73 +74f8c 20 4490 73 +74fac 4 110 72 +74fb0 10 333 122 +74fc0 8 4494 73 +74fc8 8 4495 73 +74fd0 c 4497 73 +74fdc 20 4498 73 +74ffc 4 110 72 +75000 10 333 122 +75010 10 254 121 +75020 c 333 122 +7502c 4 4504 73 +75030 4 4502 73 +75034 c 4504 73 +75040 20 4505 73 +75060 4 110 72 +75064 10 333 122 +75074 10 254 121 +75084 c 333 122 +75090 10 254 121 +750a0 c 333 122 +750ac 4 4511 73 +750b0 8 116 143 +750b8 4 4511 73 +750bc c 116 143 +750c8 4 4513 73 +750cc 14 4514 73 +750e0 4 4514 73 +750e4 20 4515 73 +75104 4 110 72 +75108 10 333 122 +75118 10 254 121 +75128 c 333 122 +75134 8 259 121 +7513c 4 4517 73 +75140 4 259 121 +75144 8 4515 73 +7514c 4 4517 73 +75150 10 4521 73 +75160 8 304 139 +75168 18 4522 73 +FUNC 75180 238 0 google_breakpad::MinidumpMemoryRegion::GetMemory +75180 14 1213 73 +75194 4 1213 73 +75198 8 1214 73 +751a0 24 1215 73 +751c4 10 333 122 +751d4 8 1215 73 +751dc 8 1219 73 +751e4 10 1220 73 +751f4 20 1221 73 +75214 10 333 122 +75224 14 1225 73 +75238 20 1226 73 +75258 14 333 122 +7526c 18 1230 73 +75284 20 1231 73 +752a4 4 110 72 +752a8 10 333 122 +752b8 4 1232 73 +752bc 10 254 121 +752cc c 333 122 +752d8 c 254 121 +752e4 8 1231 73 +752ec 4 1234 73 +752f0 4 1238 73 +752f4 4 1238 73 +752f8 4 92 57 +752fc 8 1238 73 +75304 4 1238 73 +75308 10 116 143 +75318 4 92 57 +7531c 4 1240 73 +75320 14 1240 73 +75334 4 1240 73 +75338 20 1241 73 +75358 10 333 122 +75368 8 1241 73 +75370 c 1242 73 +7537c 4 143 57 +75380 4 1245 73 +75384 4 1245 73 +75388 4 144 57 +7538c 8 1245 73 +75394 10 1222 73 +753a4 14 1249 73 +FUNC 753b8 21c 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddressInternal +753b8 14 1279 73 +753cc c 1279 73 +753d8 4 1281 73 +753dc 24 1281 73 +75400 10 333 122 +75410 8 1281 73 +75418 4 1284 73 +7541c 8 1286 73 +75424 24 1287 73 +75448 10 333 122 +75458 8 1287 73 +75460 4 1289 73 +75464 10 1293 73 +75474 10 1293 73 +75484 14 1293 73 +75498 8 1304 73 +754a0 4 1305 73 +754a4 18 1312 73 +754bc 8 1307 73 +754c4 20 1297 73 +754e4 4 1297 73 +754e8 4 1297 73 +754ec 4 110 72 +754f0 10 333 122 +75500 c 1297 73 +7550c 8 1297 73 +75514 4 333 122 +75518 4 1297 73 +7551c 8 333 122 +75524 4 1297 73 +75528 4 333 122 +7552c 8 263 121 +75534 4 1298 73 +75538 8 263 121 +75540 c 333 122 +7554c 4 1298 73 +75550 c 1298 73 +7555c 10 1298 73 +7556c 4 333 122 +75570 4 1301 73 +75574 4 333 122 +75578 4 1299 73 +7557c 14 1299 73 +75590 c 1299 73 +7559c 18 156 132 +755b4 8 1297 73 +755bc 18 1319 73 +FUNC 755d4 4 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddress +755d4 4 1324 73 +FUNC 755e0 240 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddressInternal +755e0 14 1279 73 +755f4 c 1279 73 +75600 4 1281 73 +75604 24 1281 73 +75628 10 333 122 +75638 8 1281 73 +75640 4 1284 73 +75644 8 1286 73 +7564c 24 1287 73 +75670 10 333 122 +75680 8 1287 73 +75688 4 1289 73 +7568c 10 1293 73 +7569c 10 1293 73 +756ac 14 1293 73 +756c0 8 1304 73 +756c8 4 1305 73 +756cc 14 1312 73 +756e0 18 1315 73 +756f8 4 1316 73 +756fc 4 1318 73 +75700 8 1316 73 +75708 8 1307 73 +75710 20 1297 73 +75730 4 1297 73 +75734 4 1297 73 +75738 4 110 72 +7573c 10 333 122 +7574c c 1297 73 +75758 8 1297 73 +75760 4 333 122 +75764 4 1297 73 +75768 8 333 122 +75770 4 1297 73 +75774 4 333 122 +75778 8 263 121 +75780 4 1298 73 +75784 8 263 121 +7578c c 333 122 +75798 4 1298 73 +7579c c 1298 73 +757a8 10 1298 73 +757b8 4 333 122 +757bc 4 1301 73 +757c0 4 333 122 +757c4 4 1299 73 +757c8 14 1299 73 +757dc c 1299 73 +757e8 18 156 132 +75800 8 1297 73 +75808 18 1319 73 +FUNC 75820 4 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddress +75820 4 1330 73 +FUNC 7582c 240 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddressInternal +7582c 14 1279 73 +75840 c 1279 73 +7584c 4 1281 73 +75850 24 1281 73 +75874 10 333 122 +75884 8 1281 73 +7588c 4 1284 73 +75890 8 1286 73 +75898 24 1287 73 +758bc 10 333 122 +758cc 8 1287 73 +758d4 4 1289 73 +758d8 10 1293 73 +758e8 10 1293 73 +758f8 14 1293 73 +7590c 8 1304 73 +75914 4 1305 73 +75918 14 1312 73 +7592c 18 1315 73 +75944 4 1316 73 +75948 4 1318 73 +7594c 8 1316 73 +75954 8 1307 73 +7595c 20 1297 73 +7597c 4 1297 73 +75980 4 1297 73 +75984 4 110 72 +75988 10 333 122 +75998 c 1297 73 +759a4 8 1297 73 +759ac 4 333 122 +759b0 4 1297 73 +759b4 8 333 122 +759bc 4 1297 73 +759c0 4 333 122 +759c4 8 263 121 +759cc 4 1298 73 +759d0 8 263 121 +759d8 c 333 122 +759e4 4 1298 73 +759e8 c 1298 73 +759f4 10 1298 73 +75a04 4 333 122 +75a08 4 1301 73 +75a0c 4 333 122 +75a10 4 1299 73 +75a14 14 1299 73 +75a28 c 1299 73 +75a34 18 156 132 +75a4c 8 1297 73 +75a54 18 1319 73 +FUNC 75a6c 4 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddress +75a6c 4 1336 73 +FUNC 75a78 240 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddressInternal +75a78 14 1279 73 +75a8c c 1279 73 +75a98 4 1281 73 +75a9c 24 1281 73 +75ac0 10 333 122 +75ad0 8 1281 73 +75ad8 4 1284 73 +75adc 8 1286 73 +75ae4 24 1287 73 +75b08 10 333 122 +75b18 8 1287 73 +75b20 4 1289 73 +75b24 10 1293 73 +75b34 10 1293 73 +75b44 14 1293 73 +75b58 8 1304 73 +75b60 4 1305 73 +75b64 14 1312 73 +75b78 18 1315 73 +75b90 4 1316 73 +75b94 4 1318 73 +75b98 8 1316 73 +75ba0 8 1307 73 +75ba8 20 1297 73 +75bc8 4 1297 73 +75bcc 4 1297 73 +75bd0 4 110 72 +75bd4 10 333 122 +75be4 c 1297 73 +75bf0 8 1297 73 +75bf8 4 333 122 +75bfc 4 1297 73 +75c00 8 333 122 +75c08 4 1297 73 +75c0c 4 333 122 +75c10 8 263 121 +75c18 4 1298 73 +75c1c 8 263 121 +75c24 c 333 122 +75c30 4 1298 73 +75c34 c 1298 73 +75c40 10 1298 73 +75c50 4 333 122 +75c54 4 1301 73 +75c58 4 333 122 +75c5c 4 1299 73 +75c60 14 1299 73 +75c74 c 1299 73 +75c80 18 156 132 +75c98 8 1297 73 +75ca0 18 1319 73 +FUNC 75cb8 4 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddress +75cb8 4 1342 73 +FUNC 75cc4 cc 0 google_breakpad::MinidumpMemoryRegion::Print +75cc4 10 1346 73 +75cd4 4 1346 73 +75cd8 8 1347 73 +75ce0 24 1348 73 +75d04 10 333 122 +75d14 c 1348 73 +75d20 8 1352 73 +75d28 4 1353 73 +75d2c 4 1354 73 +75d30 4 1358 73 +75d34 4 1354 73 +75d38 4 1355 73 +75d3c 4 1358 73 +75d40 4 1354 73 +75d44 4 1356 73 +75d48 c 1355 73 +75d54 8 1358 73 +75d5c 4 1355 73 +75d60 8 1358 73 +75d68 c 1360 73 +75d74 c 1362 73 +75d80 10 1364 73 +FUNC 75d98 440 0 google_breakpad::MinidumpModule::GetCVRecord +75d98 14 2076 73 +75dac 8 2076 73 +75db4 8 2077 73 +75dbc 24 2078 73 +75de0 10 333 122 +75df0 8 2078 73 +75df8 8 2082 73 +75e00 8 2085 73 +75e08 18 2089 73 +75e20 20 2090 73 +75e40 14 333 122 +75e54 14 2094 73 +75e68 20 2095 73 +75e88 4 110 72 +75e8c 10 333 122 +75e9c 10 254 121 +75eac c 333 122 +75eb8 c 254 121 +75ec4 8 2095 73 +75ecc 4 2098 73 +75ed0 4 2109 73 +75ed4 4 2109 73 +75ed8 4 116 143 +75edc 4 92 57 +75ee0 8 2109 73 +75ee8 10 116 143 +75ef8 4 92 57 +75efc 14 2111 73 +75f10 4 2111 73 +75f14 20 2112 73 +75f34 10 333 122 +75f44 8 2116 73 +75f4c 10 2117 73 +75f5c c 2120 73 +75f68 14 2121 73 +75f7c 8 2122 73 +75f84 14 2125 73 +75f98 c 2127 73 +75fa4 20 2128 73 +75fc4 4 110 72 +75fc8 10 333 122 +75fd8 c 263 121 +75fe4 1c 2134 73 +76000 4 2137 73 +76004 4 195 73 +76008 4 2137 73 +7600c 8 195 73 +76014 8 196 73 +7601c 8 197 73 +76024 8 2139 73 +7602c 18 2146 73 +76044 20 2148 73 +76064 10 333 122 +76074 10 2151 73 +76084 c 2153 73 +76090 20 2154 73 +760b0 4 110 72 +760b4 10 333 122 +760c4 10 263 121 +760d4 c 333 122 +760e0 10 254 121 +760f0 1c 2159 73 +7610c 8 2162 73 +76114 8 2163 73 +7611c 8 2164 73 +76124 8 2165 73 +7612c 18 2172 73 +76144 20 2174 73 +76164 10 333 122 +76174 8 2174 73 +7617c c 2113 73 +76188 4 143 57 +7618c 4 2187 73 +76190 c 2188 73 +7619c 4 144 57 +761a0 8 2188 73 +761a8 8 2086 73 +761b0 4 2191 73 +761b4 10 2192 73 +761c4 14 2195 73 +FUNC 761d8 334 0 google_breakpad::MinidumpModule::GetMiscRecord +761d8 14 2198 73 +761ec 8 2198 73 +761f4 8 2199 73 +761fc 24 2200 73 +76220 10 333 122 +76230 8 2200 73 +76238 8 2204 73 +76240 8 2205 73 +76248 c 2209 73 +76254 20 2211 73 +76274 4 110 72 +76278 10 333 122 +76288 10 263 121 +76298 c 333 122 +762a4 c 254 121 +762b0 14 2216 73 +762c4 20 2218 73 +762e4 10 333 122 +762f4 8 2218 73 +762fc 4 2219 73 +76300 14 2222 73 +76314 20 2223 73 +76334 4 110 72 +76338 10 333 122 +76348 10 254 121 +76358 c 333 122 +76364 10 254 121 +76374 4 2236 73 +76378 4 2236 73 +7637c 8 2236 73 +76384 10 116 143 +76394 4 92 57 +76398 1c 2240 73 +763b4 20 2242 73 +763d4 14 333 122 +763e8 14 2246 73 +763fc 10 2262 73 +7640c 20 2264 73 +7642c 4 110 72 +76430 10 333 122 +76440 10 254 121 +76450 c 333 122 +7645c 10 254 121 +7646c 8 2247 73 +76474 8 2248 73 +7647c 8 2252 73 +76484 4 2257 73 +76488 4 2255 73 +7648c c 2258 73 +76498 8 214 73 +764a0 10 215 73 +764b0 8 2264 73 +764b8 c 2243 73 +764c4 4 143 57 +764c8 4 2271 73 +764cc 4 2271 73 +764d0 4 144 57 +764d4 8 2271 73 +764dc 8 2206 73 +764e4 4 2274 73 +764e8 10 2275 73 +764f8 14 2278 73 +FUNC 7650c 17c 0 google_breakpad::MinidumpModule::ReadAuxiliaryData +7650c 10 1782 73 +7651c 4 1782 73 +76520 8 1783 73 +76528 24 1784 73 +7654c 10 333 122 +7655c 8 1784 73 +76564 4 1785 73 +76568 14 1789 73 +7657c 4 1790 73 +76580 24 1791 73 +765a4 10 333 122 +765b4 8 1796 73 +765bc 8 1800 73 +765c4 10 1800 73 +765d4 4 1800 73 +765d8 24 1802 73 +765fc 10 333 122 +7660c 8 1806 73 +76614 10 1806 73 +76624 4 1806 73 +76628 24 1808 73 +7664c 10 333 122 +7665c 4 1809 73 +76660 c 1808 73 +7666c 8 1812 73 +76674 14 1814 73 +FUNC 76688 c8 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_insert +76688 18 350 135 +766a0 4 358 135 +766a4 8 350 135 +766ac 4 358 135 +766b0 8 359 135 +766b8 4 360 135 +766bc 4 361 135 +766c0 8 362 135 +766c8 4 364 135 +766cc 4 364 135 +766d0 10 364 135 +766e0 4 367 135 +766e4 4 368 135 +766e8 4 367 135 +766ec c 369 135 +766f8 8 370 135 +76700 4 373 135 +76704 4 374 135 +76708 4 373 135 +7670c c 375 135 +76718 4 376 135 +7671c 8 379 135 +76724 4 378 135 +76728 4 379 135 +7672c 4 380 135 +76730 4 382 135 +76734 8 380 135 +7673c 4 142 136 +76740 10 382 135 +FUNC 76750 e4 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::insert_unique +76750 8 405 135 +76758 4 408 135 +7675c 8 405 135 +76764 4 406 135 +76768 4 405 135 +7676c 4 407 135 +76770 4 405 135 +76774 4 409 135 +76778 10 412 135 +76788 c 412 135 +76794 18 412 135 +767ac 4 415 135 +767b0 c 416 135 +767bc 10 417 135 +767cc 18 187 136 +767e4 10 421 135 +767f4 14 422 135 +76808 8 142 136 +76810 c 62 124 +7681c 4 142 136 +76820 4 62 124 +76824 10 425 135 +FUNC 76834 1cc 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::insert_unique +76834 18 432 135 +7684c c 432 135 +76858 10 434 135 +76868 10 437 135 +76878 8 440 135 +76880 8 441 135 +76888 8 447 135 +76890 8 177 136 +76898 4 458 135 +7689c 4 177 136 +768a0 4 458 135 +768a4 14 462 135 +768b8 c 468 135 +768c4 4 469 135 +768c8 8 470 135 +768d0 8 469 135 +768d8 c 479 135 +768e4 10 187 136 +768f4 8 79 106 +768fc 4 494 135 +76900 c 177 136 +7690c 4 513 135 +76910 8 517 135 +76918 8 517 135 +76920 c 517 135 +7692c 10 475 135 +7693c c 142 136 +76948 10 480 135 +76958 c 483 135 +76964 8 486 135 +7696c 10 494 135 +7697c 8 521 135 +76984 18 522 135 +7699c c 500 135 +769a8 14 524 135 +769bc 8 142 136 +769c4 8 497 135 +769cc c 498 135 +769d8 c 524 135 +769e4 1c 534 135 +FUNC 76a00 84 0 std::map, std::allocator > >::operator[] +76a00 4 175 118 +76a04 4 568 136 +76a08 c 175 118 +76a14 4 571 136 +76a18 c 572 136 +76a24 8 573 136 +76a2c 14 575 136 +76a40 4 178 118 +76a44 4 571 136 +76a48 4 178 118 +76a4c c 178 118 +76a58 c 191 118 +76a64 8 62 124 +76a6c 4 142 136 +76a70 4 191 118 +76a74 4 179 118 +76a78 4 180 118 +76a7c 8 181 118 +FUNC 76a84 28 0 google_breakpad::MinidumpThreadList::GetThreadByID +76a84 4 1668 73 +76a88 4 1671 73 +76a8c 4 1668 73 +76a90 8 1668 73 +76a98 8 1671 73 +76aa0 c 1672 73 +FUNC 76aac 624 0 google_breakpad::MinidumpThreadList::Read +76aac c 1553 73 +76ab8 4 206 118 +76abc 10 1553 73 +76acc 8 1553 73 +76ad4 8 531 136 +76adc c 532 136 +76ae8 4 533 136 +76aec 4 534 136 +76af0 4 535 136 +76af4 4 536 136 +76af8 8 1556 73 +76b00 8 42 143 +76b08 8 1556 73 +76b10 4 1557 73 +76b14 4 1563 73 +76b18 4 1558 73 +76b1c 4 1560 73 +76b20 4 1563 73 +76b24 24 1564 73 +76b48 4 110 72 +76b4c 10 333 122 +76b5c 10 254 121 +76b6c c 333 122 +76b78 c 263 121 +76b84 1c 1568 73 +76ba0 24 1569 73 +76bc4 10 333 122 +76bd4 8 1569 73 +76bdc 4 1570 73 +76be0 14 1573 73 +76bf4 8 1574 73 +76bfc 14 1576 73 +76c10 24 1577 73 +76c34 4 110 72 +76c38 10 333 122 +76c48 c 254 121 +76c54 c 333 122 +76c60 8 1577 73 +76c68 8 1579 73 +76c70 8 1583 73 +76c78 c 1582 73 +76c84 c 1585 73 +76c90 18 1588 73 +76ca8 20 1590 73 +76cc8 4 1591 73 +76ccc 4 1590 73 +76cd0 10 333 122 +76ce0 c 1590 73 +76cec 24 1594 73 +76d10 4 110 72 +76d14 10 333 122 +76d24 10 254 121 +76d34 c 333 122 +76d40 8 1596 73 +76d48 4 263 121 +76d4c 8 1596 73 +76d54 14 1602 73 +76d68 24 1603 73 +76d8c 4 110 72 +76d90 10 333 122 +76da0 10 254 121 +76db0 c 333 122 +76dbc 10 254 121 +76dcc 4 1608 73 +76dd0 10 1610 73 +76de0 8 1610 73 +76de8 4 1610 73 +76dec 4 70 139 +76df0 4 1610 73 +76df4 4 70 139 +76df8 4 1610 73 +76dfc 4 481 101 +76e00 4 356 101 +76e04 4 346 101 +76e08 10 347 101 +76e18 8 348 101 +76e20 c 352 101 +76e2c 4 73 139 +76e30 4 267 65 +76e34 4 71 139 +76e38 4 267 65 +76e3c 4 314 137 +76e40 8 73 139 +76e48 4 314 137 +76e4c c 249 137 +76e58 4 72 139 +76e5c c 249 137 +76e68 8 112 65 +76e70 4 249 137 +76e74 4 139 103 +76e78 4 112 65 +76e7c 4 267 65 +76e80 10 112 65 +76e90 30 267 65 +76ec0 c 249 137 +76ecc 4 244 139 +76ed0 4 1610 73 +76ed4 4 1625 73 +76ed8 4 1610 73 +76edc c 1612 73 +76ee8 c 202 139 +76ef4 4 1615 73 +76ef8 8 202 139 +76f00 14 1618 73 +76f14 20 1619 73 +76f34 4 110 72 +76f38 10 333 122 +76f48 1c 1625 73 +76f64 20 1626 73 +76f84 4 110 72 +76f88 10 333 122 +76f98 10 254 121 +76fa8 c 333 122 +76fb4 c 254 121 +76fc0 8 1626 73 +76fc8 10 1631 73 +76fd8 24 1633 73 +76ffc 4 110 72 +77000 10 333 122 +77010 c 1634 73 +7701c 10 1634 73 +7702c c 333 122 +77038 10 254 121 +77048 c 333 122 +77054 c 254 121 +77060 8 156 132 +77068 8 1633 73 +77070 8 42 143 +77078 c 98 57 +77084 8 1638 73 +7708c 4 1612 73 +77090 c 1638 73 +7709c 4 1641 73 +770a0 8 1644 73 +770a8 8 1646 73 +770b0 20 1648 73 +FUNC 770d0 c8 0 std::priv::_Rb_tree, std::pair::Range>, std::priv::_Select1st::Range> >, std::priv::_MapTraitsT::Range> >, std::allocator::Range> > >::_M_insert +770d0 18 350 135 +770e8 4 358 135 +770ec 8 350 135 +770f4 4 358 135 +770f8 8 359 135 +77100 4 360 135 +77104 4 361 135 +77108 8 362 135 +77110 4 364 135 +77114 4 364 135 +77118 10 364 135 +77128 4 367 135 +7712c 4 368 135 +77130 4 367 135 +77134 c 369 135 +77140 8 370 135 +77148 4 373 135 +7714c 4 374 135 +77150 4 373 135 +77154 c 375 135 +77160 4 376 135 +77164 8 379 135 +7716c 4 378 135 +77170 4 379 135 +77174 4 380 135 +77178 4 382 135 +7717c 8 380 135 +77184 4 142 136 +77188 10 382 135 +FUNC 77198 254 0 google_breakpad::RangeMap::StoreRange +77198 14 50 75 +771ac 8 53 75 +771b4 c 56 75 +771c0 8 53 75 +771c8 c 56 75 +771d4 20 60 75 +771f4 4 60 75 +771f8 4 60 75 +771fc 4 110 72 +77200 10 333 122 +77210 8 60 75 +77218 4 61 75 +7721c 4 60 75 +77220 10 60 75 +77230 c 333 122 +7723c 8 61 75 +77244 4 61 75 +77248 4 61 75 +7724c 10 61 75 +7725c c 333 122 +77268 c 61 75 +77274 c 61 75 +77280 18 156 132 +77298 8 60 75 +772a0 c 63 75 +772ac 4 568 136 +772b0 4 569 136 +772b4 4 571 136 +772b8 c 572 136 +772c4 8 573 136 +772cc 14 575 136 +772e0 4 569 136 +772e4 4 568 136 +772e8 4 571 136 +772ec c 572 136 +772f8 8 573 136 +77300 14 575 136 +77314 8 71 75 +7731c 8 90 75 +77324 c 91 75 +77330 4 105 76 +77334 4 568 136 +77338 4 62 124 +7733c 4 408 135 +77340 8 62 124 +77348 4 409 135 +7734c c 412 135 +77358 c 412 135 +77364 14 412 135 +77378 4 409 135 +7737c 4 415 135 +77380 c 416 135 +7738c 14 417 135 +773a0 c 187 136 +773ac c 421 135 +773b8 1c 422 135 +773d4 4 113 75 +773d8 14 114 75 +FUNC 773ec 7c8 0 google_breakpad::MinidumpModuleList::Read +773ec 1c 2445 73 +77408 8 2445 73 +77410 8 206 118 +77418 8 2448 73 +77420 8 42 143 +77428 8 2448 73 +77430 4 2449 73 +77434 4 2455 73 +77438 4 2450 73 +7743c 4 2452 73 +77440 4 2455 73 +77444 24 2456 73 +77468 4 110 72 +7746c 10 333 122 +7747c 10 254 121 +7748c c 333 122 +77498 c 263 121 +774a4 1c 2460 73 +774c0 24 2461 73 +774e4 10 333 122 +774f4 8 2461 73 +774fc 4 2462 73 +77500 14 2465 73 +77514 8 2466 73 +7751c 14 2468 73 +77530 24 2469 73 +77554 4 110 72 +77558 10 333 122 +77568 c 254 121 +77574 10 333 122 +77584 8 2475 73 +7758c c 2474 73 +77598 c 2477 73 +775a4 18 2480 73 +775bc 20 2482 73 +775dc 4 2483 73 +775e0 4 2482 73 +775e4 10 333 122 +775f4 c 2482 73 +77600 24 2486 73 +77624 4 110 72 +77628 10 333 122 +77638 10 254 121 +77648 c 333 122 +77654 4 2488 73 +77658 4 263 121 +7765c 4 2488 73 +77660 8 263 121 +77668 8 2486 73 +77670 14 2493 73 +77684 24 2494 73 +776a8 4 110 72 +776ac 10 333 122 +776bc 10 254 121 +776cc c 333 122 +776d8 c 254 121 +776e4 c 2494 73 +776f0 4 2499 73 +776f4 10 2501 73 +77704 8 2501 73 +7770c 4 2501 73 +77710 4 2501 73 +77714 4 2501 73 +77718 4 70 139 +7771c 4 356 101 +77720 4 70 139 +77724 4 481 101 +77728 4 346 101 +7772c 10 347 101 +7773c 8 348 101 +77744 c 352 101 +77750 4 73 139 +77754 4 112 65 +77758 8 364 65 +77760 4 314 137 +77764 4 73 139 +77768 4 314 137 +7776c 8 249 137 +77774 4 71 139 +77778 4 249 137 +7777c 4 72 139 +77780 4 249 137 +77784 4 73 139 +77788 4 249 137 +7778c 4 112 65 +77790 8 364 65 +77798 4 249 137 +7779c 4 249 137 +777a0 4 139 103 +777a4 4 112 65 +777a8 4 364 65 +777ac 4 112 65 +777b0 4 364 65 +777b4 10 112 65 +777c4 44 364 65 +77808 c 249 137 +77814 4 244 139 +77818 4 2501 73 +7781c 4 2503 73 +77820 4 202 139 +77824 4 2501 73 +77828 c 2503 73 +77834 4 202 139 +77838 4 2506 73 +7783c 4 202 139 +77840 10 2509 73 +77850 20 2510 73 +77870 4 110 72 +77874 10 333 122 +77884 c 254 121 +77890 8 2503 73 +77898 4 2521 73 +7789c 4 2541 73 +778a0 4 2521 73 +778a4 4 2542 73 +778a8 4 2522 73 +778ac c 2521 73 +778b8 14 202 139 +778cc 14 2531 73 +778e0 8 2531 73 +778e8 20 2533 73 +77908 4 110 72 +7790c 10 333 122 +7791c c 254 121 +77928 8 2560 73 +77930 18 2541 73 +77948 18 2542 73 +77960 c 2543 73 +7796c 24 2545 73 +77990 4 110 72 +77994 10 333 122 +779a4 10 254 121 +779b4 c 333 122 +779c0 10 254 121 +779d0 c 333 122 +779dc 4 2546 73 +779e0 10 2546 73 +779f0 c 2546 73 +779fc 8 156 132 +77a04 4 2545 73 +77a08 4 2551 73 +77a0c 8 42 143 +77a14 10 98 57 +77a24 8 2563 73 +77a2c 8 2565 73 +77a34 4 2566 73 +77a38 8 254 121 +77a40 c 333 122 +77a4c c 254 121 +77a58 8 2533 73 +77a60 1c 2550 73 +77a7c 24 2551 73 +77aa0 4 110 72 +77aa4 10 333 122 +77ab4 10 254 121 +77ac4 c 333 122 +77ad0 8 254 121 +77ad8 4 333 122 +77adc 4 2553 73 +77ae0 4 333 122 +77ae4 8 254 121 +77aec 8 333 122 +77af4 10 2553 73 +77b04 4 2554 73 +77b08 4 2553 73 +77b0c 10 2553 73 +77b1c 8 333 122 +77b24 c 2554 73 +77b30 10 2554 73 +77b40 c 333 122 +77b4c c 2555 73 +77b58 c 2555 73 +77b64 18 156 132 +77b7c 8 2551 73 +77b84 10 2521 73 +77b94 20 2567 73 +FUNC 77bb4 70c 0 google_breakpad::MinidumpMemoryList::Read +77bb4 1c 2689 73 +77bd0 8 2689 73 +77bd8 8 2691 73 +77be0 8 42 143 +77be8 8 2691 73 +77bf0 4 2693 73 +77bf4 4 2692 73 +77bf8 4 2693 73 +77bfc 8 42 143 +77c04 8 2693 73 +77c0c 4 206 118 +77c10 4 2694 73 +77c14 4 206 118 +77c18 4 2696 73 +77c1c 4 2698 73 +77c20 8 2701 73 +77c28 24 2702 73 +77c4c 4 110 72 +77c50 10 333 122 +77c60 10 254 121 +77c70 c 333 122 +77c7c c 263 121 +77c88 1c 2706 73 +77ca4 24 2707 73 +77cc8 10 333 122 +77cd8 8 2707 73 +77ce0 4 2708 73 +77ce4 14 2711 73 +77cf8 8 2712 73 +77d00 10 2714 73 +77d10 24 2716 73 +77d34 4 110 72 +77d38 10 333 122 +77d48 c 254 121 +77d54 10 333 122 +77d64 4 2722 73 +77d68 c 2721 73 +77d74 c 2724 73 +77d80 18 2727 73 +77d98 20 2729 73 +77db8 4 2730 73 +77dbc 4 2729 73 +77dc0 10 333 122 +77dd0 c 2729 73 +77ddc 24 2733 73 +77e00 4 110 72 +77e04 10 333 122 +77e14 10 254 121 +77e24 c 333 122 +77e30 c 2735 73 +77e3c 8 263 121 +77e44 14 2740 73 +77e58 24 2741 73 +77e7c 4 110 72 +77e80 10 333 122 +77e90 10 254 121 +77ea0 c 333 122 +77eac c 254 121 +77eb8 c 2741 73 +77ec4 4 2746 73 +77ec8 8 2748 73 +77ed0 4 70 139 +77ed4 4 2748 73 +77ed8 4 2748 73 +77edc 4 70 139 +77ee0 8 481 101 +77ee8 4 356 101 +77eec 4 346 101 +77ef0 c 347 101 +77efc 4 348 101 +77f00 8 352 101 +77f08 4 73 139 +77f0c 4 71 139 +77f10 4 72 139 +77f14 4 314 137 +77f18 4 73 139 +77f1c 8 249 137 +77f24 4 139 103 +77f28 c 139 103 +77f34 8 249 137 +77f3c 8 244 139 +77f44 18 2753 73 +77f5c 4 2752 73 +77f60 20 2754 73 +77f80 10 333 122 +77f90 8 2754 73 +77f98 4 2755 73 +77f9c c 2759 73 +77fa8 8 2759 73 +77fb0 4 2759 73 +77fb4 4 2759 73 +77fb8 4 2759 73 +77fbc 4 70 139 +77fc0 4 356 101 +77fc4 4 70 139 +77fc8 4 481 101 +77fcc 4 346 101 +77fd0 10 347 101 +77fe0 8 348 101 +77fe8 c 352 101 +77ff4 4 73 139 +77ff8 4 201 65 +77ffc 4 71 139 +78000 4 201 65 +78004 8 73 139 +7800c 4 314 137 +78010 4 201 65 +78014 4 72 139 +78018 4 249 137 +7801c 4 314 137 +78020 4 249 137 +78024 4 201 65 +78028 4 249 137 +7802c 8 112 65 +78034 4 249 137 +78038 4 139 103 +7803c 14 112 65 +78050 18 201 65 +78068 c 249 137 +78074 4 244 139 +78078 4 2759 73 +7807c 8 2782 73 +78084 4 2759 73 +78088 4 202 139 +7808c 4 2761 73 +78090 4 2762 73 +78094 c 2761 73 +780a0 4 202 139 +780a4 4 2766 73 +780a8 4 202 139 +780ac 4 2766 73 +780b0 4 202 139 +780b4 c 2766 73 +780c0 c 189 73 +780cc c 190 73 +780d8 4 2769 73 +780dc 4 2770 73 +780e0 4 2769 73 +780e4 4 2773 73 +780e8 8 2774 73 +780f0 c 2773 73 +780fc 4 2793 73 +78100 8 2794 73 +78108 20 2782 73 +78128 24 2783 73 +7814c 4 110 72 +78150 10 333 122 +78160 10 254 121 +78170 c 333 122 +7817c 8 254 121 +78184 4 2777 73 +78188 8 254 121 +78190 c 333 122 +7819c c 2777 73 +781a8 10 2777 73 +781b8 c 333 122 +781c4 c 2778 73 +781d0 c 2778 73 +781dc 10 156 132 +781ec 8 2775 73 +781f4 8 42 143 +781fc 8 98 57 +78204 8 42 143 +7820c 10 98 57 +7821c 8 2797 73 +78224 8 2799 73 +7822c 4 2800 73 +78230 24 2775 73 +78254 4 110 72 +78258 20 333 122 +78278 4 2790 73 +7827c 8 202 139 +78284 c 2790 73 +78290 10 2761 73 +782a0 20 2801 73 +FUNC 782c0 c8 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_insert +782c0 18 350 135 +782d8 4 358 135 +782dc 8 350 135 +782e4 4 358 135 +782e8 8 359 135 +782f0 4 360 135 +782f4 4 361 135 +782f8 8 362 135 +78300 4 364 135 +78304 4 364 135 +78308 10 364 135 +78318 4 367 135 +7831c 4 368 135 +78320 4 367 135 +78324 c 369 135 +78330 8 370 135 +78338 4 373 135 +7833c 4 374 135 +78340 4 373 135 +78344 c 375 135 +78350 4 376 135 +78354 8 379 135 +7835c 4 378 135 +78360 4 379 135 +78364 4 380 135 +78368 4 382 135 +7836c 8 380 135 +78374 4 142 136 +78378 10 382 135 +FUNC 78388 e4 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::insert_unique +78388 8 405 135 +78390 4 408 135 +78394 8 405 135 +7839c 4 406 135 +783a0 4 405 135 +783a4 4 407 135 +783a8 4 405 135 +783ac 4 409 135 +783b0 10 412 135 +783c0 c 412 135 +783cc 18 412 135 +783e4 4 415 135 +783e8 c 416 135 +783f4 10 417 135 +78404 18 187 136 +7841c 10 421 135 +7842c 14 422 135 +78440 8 142 136 +78448 c 62 124 +78454 4 142 136 +78458 4 62 124 +7845c 10 425 135 +FUNC 7846c 1cc 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::insert_unique +7846c 18 432 135 +78484 c 432 135 +78490 10 434 135 +784a0 10 437 135 +784b0 8 440 135 +784b8 8 441 135 +784c0 8 447 135 +784c8 8 177 136 +784d0 4 458 135 +784d4 4 177 136 +784d8 4 458 135 +784dc 14 462 135 +784f0 c 468 135 +784fc 4 469 135 +78500 8 470 135 +78508 8 469 135 +78510 c 479 135 +7851c 10 187 136 +7852c 8 79 106 +78534 4 494 135 +78538 c 177 136 +78544 4 513 135 +78548 8 517 135 +78550 8 517 135 +78558 c 517 135 +78564 10 475 135 +78574 c 142 136 +78580 10 480 135 +78590 c 483 135 +7859c 8 486 135 +785a4 10 494 135 +785b4 8 521 135 +785bc 18 522 135 +785d4 c 500 135 +785e0 14 524 135 +785f4 8 142 136 +785fc 8 497 135 +78604 c 498 135 +78610 c 524 135 +7861c 1c 534 135 +FUNC 78638 6e4 0 google_breakpad::Minidump::Read +78638 24 4099 73 +7865c 4 4099 73 +78660 8 4101 73 +78668 8 42 143 +78670 8 4101 73 +78678 4 4103 73 +7867c 4 4102 73 +78680 8 531 136 +78688 c 532 136 +78694 4 533 136 +78698 4 534 136 +7869c 4 535 136 +786a0 4 536 136 +786a4 4 4105 73 +786a8 18 4107 73 +786c0 1c 4108 73 +786dc 10 333 122 +786ec 1c 4112 73 +78708 1c 4113 73 +78724 10 333 122 +78734 8 4113 73 +7873c 4 4114 73 +78740 14 4117 73 +78754 8 4122 73 +7875c 4 4123 73 +78760 14 4124 73 +78774 1c 4126 73 +78790 4 4127 73 +78794 4 4126 73 +78798 4 110 72 +7879c 10 333 122 +787ac 8 4127 73 +787b4 4 4128 73 +787b8 4 4127 73 +787bc 10 4127 73 +787cc c 333 122 +787d8 c 4128 73 +787e4 10 4128 73 +787f4 c 333 122 +78800 10 4129 73 +78810 c 4129 73 +7881c 10 156 132 +7882c c 4132 73 +78838 4 4136 73 +7883c 1c 4139 73 +78858 4 110 72 +7885c 10 333 122 +7886c 8 4139 73 +78874 c 4139 73 +78880 8 4139 73 +78888 18 333 122 +788a0 8 4139 73 +788a8 8 4142 73 +788b0 8 4143 73 +788b8 8 4144 73 +788c0 8 4145 73 +788c8 8 4146 73 +788d0 8 4147 73 +788d8 8 4148 73 +788e0 8 4149 73 +788e8 10 4154 73 +788f8 1c 4155 73 +78914 4 4156 73 +78918 4 4155 73 +7891c 4 110 72 +78920 10 333 122 +78930 c 4156 73 +7893c 10 4156 73 +7894c c 333 122 +78958 c 4157 73 +78964 c 4157 73 +78970 10 156 132 +78980 8 4155 73 +78988 14 4161 73 +7899c 1c 4162 73 +789b8 10 333 122 +789c8 14 4166 73 +789dc 1c 4167 73 +789f8 4 110 72 +789fc 10 333 122 +78a0c 10 254 121 +78a1c c 333 122 +78a28 c 254 121 +78a34 c 4167 73 +78a40 4 4172 73 +78a44 8 4174 73 +78a4c 4 4174 73 +78a50 4 70 139 +78a54 4 4174 73 +78a58 4 70 139 +78a5c 4 4174 73 +78a60 4 481 101 +78a64 4 356 101 +78a68 4 346 101 +78a6c c 347 101 +78a78 8 348 101 +78a80 c 352 101 +78a8c 4 73 139 +78a90 4 71 139 +78a94 4 72 139 +78a98 c 73 139 +78aa4 4 314 137 +78aa8 4 249 137 +78aac 4 314 137 +78ab0 8 249 137 +78ab8 4 249 137 +78abc 4 139 103 +78ac0 c 139 103 +78acc c 249 137 +78ad8 4 244 139 +78adc 1c 4179 73 +78af8 4 4178 73 +78afc 1c 4180 73 +78b18 10 333 122 +78b28 10 4197 73 +78b38 8 4218 73 +78b40 8 568 136 +78b48 4 571 136 +78b4c 8 178 118 +78b54 c 178 118 +78b60 4 4218 73 +78b64 4 4184 73 +78b68 c 4184 73 +78b74 c 202 139 +78b80 4 4189 73 +78b84 4 202 139 +78b88 4 4189 73 +78b8c c 4190 73 +78b98 c 4191 73 +78ba4 8 4196 73 +78bac 8 4197 73 +78bb4 10 210 118 +78bc4 4 423 136 +78bc8 4 200 136 +78bcc 8 4205 73 +78bd4 1c 4208 73 +78bf0 4 110 72 +78bf4 10 333 122 +78c04 c 254 121 +78c10 c 333 122 +78c1c 8 4208 73 +78c24 8 42 143 +78c2c c 98 57 +78c38 4 210 118 +78c3c 4 968 65 +78c40 4 202 139 +78c44 4 142 136 +78c48 4 210 118 +78c4c c 191 118 +78c58 14 4197 73 +78c6c c 572 136 +78c78 8 573 136 +78c80 14 575 136 +78c94 8 4223 73 +78c9c 8 98 57 +78ca4 8 4226 73 +78cac 4 4227 73 +78cb0 4 62 124 +78cb4 8 968 65 +78cbc 8 191 118 +78cc4 4 142 136 +78cc8 c 62 124 +78cd4 8 191 118 +78cdc 4 179 118 +78ce0 8 51 124 +78ce8 c 179 118 +78cf4 28 4228 73 +FUNC 78d1c d4 0 std::basic_filebuf >::_M_allocate_buffers +78d1c 10 630 104 +78d2c 8 630 104 +78d34 4 637 104 +78d38 c 644 104 +78d44 4 646 104 +78d48 4 645 104 +78d4c c 647 104 +78d58 4 650 104 +78d5c 4 651 104 +78d60 8 655 104 +78d68 4 227 102 +78d6c 4 655 104 +78d70 8 227 102 +78d78 c 655 104 +78d84 c 661 104 +78d90 4 664 104 +78d94 8 686 104 +78d9c 8 687 104 +78da4 8 688 104 +78dac 4 689 104 +78db0 4 690 104 +78db4 4 666 104 +78db8 4 691 104 +78dbc 8 692 104 +78dc4 4 669 104 +78dc8 4 670 104 +78dcc 4 671 104 +78dd0 4 670 104 +78dd4 8 669 104 +78ddc 14 672 104 +FUNC 78df0 60 0 std::basic_filebuf >::setbuf +78df0 c 268 104 +78dfc 4 268 104 +78e00 8 269 104 +78e08 8 269 104 +78e10 8 269 104 +78e18 8 271 104 +78e20 c 272 104 +78e2c c 273 104 +78e38 8 274 104 +78e40 10 277 104 +FUNC 78e50 1f8 0 std::basic_filebuf >::overflow +78e50 18 208 104 +78e68 8 208 104 +78e70 8 210 104 +78e78 8 453 104 +78e80 8 453 104 +78e88 8 453 104 +78e90 8 453 104 +78e98 8 456 104 +78ea0 c 128 105 +78eac 8 680 104 +78eb4 c 681 104 +78ec0 4 456 104 +78ec4 8 462 104 +78ecc 10 463 104 +78edc 10 463 104 +78eec 8 118 129 +78ef4 8 466 104 +78efc 4 216 104 +78f00 4 219 104 +78f04 8 214 104 +78f0c 4 216 104 +78f10 4 117 129 +78f14 4 118 129 +78f18 4 119 129 +78f1c 4 219 104 +78f20 4 220 140 +78f24 4 220 104 +78f28 4 228 104 +78f2c 8 193 102 +78f34 4 322 105 +78f38 8 223 104 +78f40 4 225 104 +78f44 4 193 102 +78f48 4 228 104 +78f4c 4 193 102 +78f50 4 224 104 +78f54 4 193 102 +78f58 4 225 104 +78f5c 18 193 102 +78f74 8 229 104 +78f7c 14 322 105 +78f90 8 232 104 +78f98 8 240 104 +78fa0 4 582 104 +78fa4 4 580 104 +78fa8 4 581 104 +78fac 4 582 104 +78fb0 4 117 129 +78fb4 4 118 129 +78fb8 8 119 129 +78fc0 c 240 104 +78fcc 20 240 104 +78fec 8 240 104 +78ff4 4 240 104 +78ff8 4 240 104 +78ffc 18 322 105 +79014 4 246 104 +79018 8 247 104 +79020 c 182 140 +7902c 4 212 104 +79030 18 256 104 +FUNC 79048 130 0 std::basic_filebuf >::~basic_filebuf +79048 4 67 104 +7904c 4 70 104 +79050 8 67 104 +79058 8 70 104 +79060 4 67 104 +79064 c 84 104 +79070 4 85 104 +79074 8 86 104 +7907c c 85 104 +79088 8 89 104 +79090 8 119 104 +79098 c 120 104 +790a4 4 121 104 +790a8 4 122 104 +790ac 4 124 104 +790b0 8 93 104 +790b8 10 97 104 +790c8 10 97 104 +790d8 4 98 104 +790dc 8 97 104 +790e4 4 686 104 +790e8 4 98 104 +790ec 4 100 104 +790f0 4 101 104 +790f4 4 93 129 +790f8 4 94 129 +790fc 4 95 129 +79100 4 117 129 +79104 4 118 129 +79108 4 119 129 +7910c c 106 104 +79118 10 108 104 +79128 4 686 104 +7912c 8 687 104 +79134 8 688 104 +7913c 4 689 104 +79140 4 690 104 +79144 4 70 104 +79148 4 691 104 +7914c 4 692 104 +79150 c 70 104 +7915c 8 594 104 +79164 14 594 104 +FUNC 79178 24 0 std::basic_filebuf >::~basic_filebuf +79178 c 67 104 +79184 4 67 104 +79188 4 70 104 +7918c 4 70 104 +79190 8 70 104 +79198 4 70 104 +FUNC 7919c a8 0 std::basic_ifstream >::~basic_ifstream +7919c c 495 105 +791a8 c 495 105 +791b4 8 495 105 +791bc 8 495 105 +791c4 4 495 105 +791c8 4 495 105 +791cc 4 495 105 +791d0 4 495 105 +791d4 8 495 105 +791dc 8 495 105 +791e4 8 495 105 +791ec 14 495 105 +79200 4 495 105 +79204 4 495 105 +79208 8 495 105 +79210 8 495 105 +79218 4 495 105 +7921c 8 495 105 +79224 4 495 105 +79228 4 495 105 +7922c 8 495 105 +79234 4 495 105 +79238 c 495 105 +FUNC 79244 c 0 std::basic_ifstream >::~basic_ifstream +79244 c 495 105 +FUNC 79260 24 0 std::basic_ifstream >::~basic_ifstream +79260 c 495 105 +7926c 8 495 105 +79274 4 495 105 +79278 8 495 105 +79280 4 495 105 +FUNC 79294 c 0 std::basic_ifstream >::~basic_ifstream +79294 c 495 105 +FUNC 792a0 bc 0 std::basic_filebuf >::_M_seek_init +792a0 c 700 104 +792ac 4 700 104 +792b0 4 702 104 +792b4 4 706 104 +792b8 4 700 104 +792bc 4 706 104 +792c0 4 708 104 +792c4 c 708 104 +792d0 8 708 104 +792d8 4 709 104 +792dc 4 710 104 +792e0 8 594 104 +792e8 14 594 104 +792fc 4 711 104 +79300 4 713 104 +79304 4 712 104 +79308 4 713 104 +7930c 4 715 104 +79310 4 117 129 +79314 4 118 129 +79318 4 119 129 +7931c 4 715 104 +79320 4 720 104 +79324 4 723 104 +79328 4 720 104 +7932c 8 720 104 +79334 8 220 105 +7933c 8 93 129 +79344 4 94 129 +79348 4 95 129 +7934c 4 221 105 +79350 c 724 104 +FUNC 7935c 94 0 std::basic_filebuf >::_M_seek_return +7935c 4 238 105 +79360 4 239 105 +79364 c 238 105 +79370 c 238 105 +7937c 4 239 105 +79380 8 240 105 +79388 8 119 104 +79390 c 120 104 +7939c 4 121 104 +793a0 4 122 104 +793a4 4 242 105 +793a8 4 243 105 +793ac 4 244 105 +793b0 4 245 105 +793b4 4 93 129 +793b8 4 94 129 +793bc 4 95 129 +793c0 4 117 129 +793c4 4 118 129 +793c8 4 119 129 +793cc c 250 105 +793d8 4 121 140 +793dc 14 253 105 +FUNC 793f0 8c 0 std::basic_filebuf >::seekpos +793f0 10 384 104 +79400 c 384 104 +7940c 8 386 104 +79414 10 387 104 +79424 8 391 104 +7942c 10 391 104 +7943c 8 391 104 +79444 14 397 104 +79458 4 392 104 +7945c 10 393 104 +7946c 10 398 104 +FUNC 7947c 1f4 0 std::basic_filebuf >::seekoff +7947c 10 291 104 +7948c 8 291 104 +79494 8 294 104 +7949c c 297 104 +794a8 4 297 104 +794ac 4 297 104 +794b0 14 298 104 +794c4 24 300 104 +794e8 10 304 104 +794f8 8 310 104 +79500 10 312 104 +79510 c 314 104 +7951c 10 317 104 +7952c 4 321 104 +79530 c 320 104 +7953c 8 321 104 +79544 10 321 104 +79554 c 321 104 +79560 c 324 104 +7956c 8 325 104 +79574 4 332 104 +79578 4 325 104 +7957c 10 332 104 +7958c 4 333 104 +79590 8 87 105 +79598 4 336 104 +7959c c 335 104 +795a8 8 336 104 +795b0 10 336 104 +795c0 c 336 104 +795cc 8 344 104 +795d4 8 224 102 +795dc 4 344 104 +795e0 4 346 104 +795e4 14 224 102 +795f8 10 370 104 +79608 4 373 104 +7960c 4 371 104 +79610 4 372 104 +79614 4 373 104 +79618 4 87 105 +7961c 4 372 104 +79620 8 373 104 +79628 4 375 104 +7962c c 375 104 +79638 10 375 104 +79648 18 378 104 +79660 10 379 104 +FUNC 79670 fc 0 std::basic_string, std::allocator >::rfind +79670 4 468 130 +79674 4 468 130 +79678 4 400 131 +7967c 8 471 130 +79684 8 472 130 +7968c 10 474 130 +7969c 4 162 99 +796a0 4 474 130 +796a4 c 164 99 +796b0 c 165 99 +796bc c 168 99 +796c8 8 81 113 +796d0 c 171 99 +796dc 8 81 113 +796e4 c 174 99 +796f0 8 81 113 +796f8 c 164 99 +79704 4 152 113 +79708 1c 178 99 +79724 c 180 99 +79730 4 81 113 +79734 c 183 99 +79740 4 81 113 +79744 4 186 99 +79748 10 65 113 +79758 8 478 130 +79760 8 478 130 +79768 4 479 130 +FUNC 7976c 124 0 google_breakpad::PathnameStripper::File +7976c 4 41 74 +79770 8 42 74 +79778 c 41 74 +79784 8 41 74 +7978c 8 42 74 +79794 10 43 74 +797a4 8 46 74 +797ac 10 46 74 +797bc 8 48 74 +797c4 4 49 74 +797c8 4 45 74 +797cc 4 49 74 +797d0 4 50 74 +797d4 4 112 132 +797d8 c 481 101 +797e4 4 400 131 +797e8 8 205 131 +797f0 c 604 130 +797fc 4 209 131 +79800 4 378 131 +79804 8 608 130 +7980c 8 610 130 +79814 4 347 101 +79818 8 158 101 +79820 8 134 119 +79828 8 158 101 +79830 4 613 130 +79834 4 611 130 +79838 4 612 130 +7983c c 613 130 +79848 c 107 137 +79854 c 106 137 +79860 8 107 137 +79868 c 600 130 +79874 4 380 131 +79878 4 54 74 +7987c 4 101 103 +79880 10 54 74 +FUNC 79890 c 0 google_breakpad::BasicCodeModules::module_count +79890 4 85 67 +79894 8 87 67 +FUNC 7989c 20 0 google_breakpad::BasicCodeModules::GetMainModule +7989c 8 100 67 +798a4 10 101 67 +798b4 8 102 67 +FUNC 798bc 1c 0 google_breakpad::BasicCodeModules::GetModuleAtIndex +798bc 8 116 67 +798c4 c 121 67 +798d0 8 122 67 +FUNC 798d8 54 0 google_breakpad::linked_ptr::depart +798d8 4 155 70 +798dc 4 156 70 +798e0 4 155 70 +798e4 10 83 70 +798f4 14 85 70 +79908 8 86 70 +79910 8 156 70 +79918 4 156 70 +7991c 8 156 70 +79924 8 157 70 +FUNC 7992c 58 0 std::priv::_Rb_tree, std::pair >::Range>, std::priv::_Select1st >::Range> >, std::priv::_MapTraitsT >::Range> >, std::allocator >::Range> > >::_M_erase +7992c 18 655 135 +79944 4 657 135 +79948 c 658 135 +79954 4 659 135 +79958 8 102 70 +79960 14 161 101 +79974 10 664 135 +FUNC 79984 50 0 google_breakpad::BasicCodeModules::~BasicCodeModules +79984 10 81 67 +79994 8 81 67 +7999c 8 82 67 +799a4 8 531 136 +799ac c 532 136 +799b8 4 82 67 +799bc 8 83 67 +799c4 4 82 67 +799c8 c 83 67 +FUNC 799d4 24 0 google_breakpad::BasicCodeModules::~BasicCodeModules +799d4 c 81 67 +799e0 4 81 67 +799e4 4 83 67 +799e8 4 83 67 +799ec 8 83 67 +799f4 4 83 67 +FUNC 799f8 40 0 google_breakpad::linked_ptr::copy +799f8 c 165 70 +79a04 4 166 70 +79a08 8 167 70 +79a10 14 75 70 +79a24 4 76 70 +79a28 8 77 70 +79a30 4 69 70 +79a34 4 170 70 +FUNC 79a38 12c 0 google_breakpad::BasicCodeModules::GetModuleForAddress +79a38 14 90 67 +79a4c 4 160 70 +79a50 4 90 67 +79a54 4 69 70 +79a58 4 92 67 +79a5c 4 69 70 +79a60 4 160 70 +79a64 8 568 136 +79a6c 4 571 136 +79a70 c 572 136 +79a7c 8 573 136 +79a84 14 575 136 +79a98 c 125 75 +79aa4 c 133 75 +79ab0 c 106 70 +79abc 8 117 70 +79ac4 c 118 70 +79ad0 c 102 70 +79adc 4 97 67 +79ae0 24 93 67 +79b04 4 110 72 +79b08 10 333 122 +79b18 c 93 67 +79b24 c 93 67 +79b30 4 156 132 +79b34 4 94 67 +79b38 4 156 132 +79b3c 8 93 67 +79b44 8 102 70 +79b4c 18 98 67 +FUNC 79b64 234 0 google_breakpad::BasicCodeModules::GetModuleAtSequence +79b64 14 105 67 +79b78 4 105 67 +79b7c 4 160 70 +79b80 4 107 67 +79b84 4 69 70 +79b88 4 160 70 +79b8c 4 69 70 +79b90 4 207 75 +79b94 8 184 75 +79b9c 28 185 75 +79bc4 4 110 72 +79bc8 10 333 122 +79bd8 10 185 75 +79be8 c 333 122 +79bf4 8 185 75 +79bfc 4 108 67 +79c00 4 185 75 +79c04 8 185 75 +79c0c 1c 108 67 +79c28 4 110 72 +79c2c 10 333 122 +79c3c 14 181 122 +79c50 4 199 121 +79c54 1c 211 121 +79c70 4 192 75 +79c74 8 192 75 +79c7c 8 297 135 +79c84 10 94 136 +79c94 4 301 135 +79c98 c 302 135 +79ca4 c 304 135 +79cb0 c 309 135 +79cbc 8 192 75 +79cc4 10 106 70 +79cd4 8 117 70 +79cdc c 118 70 +79ce8 c 102 70 +79cf4 4 112 67 +79cf8 4 202 121 +79cfc 4 145 110 +79d00 4 202 121 +79d04 4 145 110 +79d08 4 202 121 +79d0c 8 145 110 +79d14 c 351 117 +79d20 8 351 117 +79d28 4 72 120 +79d2c 4 202 121 +79d30 8 72 120 +79d38 c 202 121 +79d44 4 72 120 +79d48 4 57 123 +79d4c c 72 120 +79d58 8 202 121 +79d60 4 210 121 +79d64 4 212 121 +79d68 4 109 67 +79d6c 4 212 121 +79d70 8 108 67 +79d78 8 102 70 +79d80 18 113 67 +FUNC 79d98 64 0 std::priv::_Rb_tree, std::pair >::Range>, std::priv::_Select1st >::Range> >, std::priv::_MapTraitsT >::Range> >, std::allocator >::Range> > >::_M_create_node +79d98 4 315 136 +79d9c 4 306 101 +79da0 8 315 136 +79da8 4 315 136 +79dac 8 306 101 +79db4 4 158 101 +79db8 4 119 103 +79dbc 4 158 101 +79dc0 4 119 103 +79dc4 c 68 124 +79dd0 4 106 70 +79dd4 8 102 76 +79ddc 8 106 70 +79de4 4 321 136 +79de8 4 324 136 +79dec 4 322 136 +79df0 c 324 136 +FUNC 79dfc c8 0 std::priv::_Rb_tree, std::pair >::Range>, std::priv::_Select1st >::Range> >, std::priv::_MapTraitsT >::Range> >, std::allocator >::Range> > >::_M_insert +79dfc 18 350 135 +79e14 4 358 135 +79e18 8 350 135 +79e20 4 358 135 +79e24 8 359 135 +79e2c 4 360 135 +79e30 4 361 135 +79e34 8 362 135 +79e3c 4 364 135 +79e40 4 364 135 +79e44 10 364 135 +79e54 4 367 135 +79e58 4 368 135 +79e5c 4 367 135 +79e60 c 369 135 +79e6c 8 370 135 +79e74 4 373 135 +79e78 4 374 135 +79e7c 4 373 135 +79e80 c 375 135 +79e8c 4 376 135 +79e90 8 379 135 +79e98 4 378 135 +79e9c 4 379 135 +79ea0 4 380 135 +79ea4 4 382 135 +79ea8 8 380 135 +79eb0 4 142 136 +79eb4 10 382 135 +FUNC 79ec4 2d8 0 google_breakpad::RangeMap >::StoreRange +79ec4 14 50 75 +79ed8 8 53 75 +79ee0 c 56 75 +79eec 8 53 75 +79ef4 c 56 75 +79f00 20 60 75 +79f20 4 60 75 +79f24 4 60 75 +79f28 4 110 72 +79f2c 10 333 122 +79f3c 8 60 75 +79f44 4 61 75 +79f48 4 60 75 +79f4c 10 60 75 +79f5c c 333 122 +79f68 8 61 75 +79f70 4 61 75 +79f74 4 61 75 +79f78 10 61 75 +79f88 c 333 122 +79f94 c 61 75 +79fa0 c 61 75 +79fac 18 156 132 +79fc4 8 60 75 +79fcc c 63 75 +79fd8 4 568 136 +79fdc 4 569 136 +79fe0 4 571 136 +79fe4 c 572 136 +79ff0 8 573 136 +79ff8 14 575 136 +7a00c 4 568 136 +7a010 4 571 136 +7a014 c 572 136 +7a020 8 573 136 +7a028 14 575 136 +7a03c 8 71 75 +7a044 8 90 75 +7a04c c 91 75 +7a058 4 105 76 +7a05c 8 106 70 +7a064 4 105 76 +7a068 4 106 70 +7a06c 4 62 124 +7a070 4 106 70 +7a074 4 62 124 +7a078 4 102 76 +7a07c 4 106 70 +7a080 4 102 76 +7a084 8 106 70 +7a08c 4 407 135 +7a090 8 568 136 +7a098 4 408 135 +7a09c 4 409 135 +7a0a0 c 412 135 +7a0ac c 412 135 +7a0b8 14 412 135 +7a0cc 4 409 135 +7a0d0 4 415 135 +7a0d4 c 416 135 +7a0e0 14 417 135 +7a0f4 8 279 135 +7a0fc 10 279 135 +7a10c 8 280 135 +7a114 8 281 135 +7a11c 10 99 136 +7a12c 4 285 135 +7a130 c 286 135 +7a13c c 288 135 +7a148 4 187 136 +7a14c c 421 135 +7a158 1c 422 135 +7a174 10 102 70 +7a184 4 113 75 +7a188 14 114 75 +FUNC 7a19c 204 0 google_breakpad::BasicCodeModules::BasicCodeModules +7a19c 10 48 67 +7a1ac 8 50 67 +7a1b4 8 48 67 +7a1bc 4 50 67 +7a1c0 4 50 67 +7a1c4 4 50 67 +7a1c8 10 48 67 +7a1d8 4 50 67 +7a1dc 4 481 101 +7a1e0 4 263 136 +7a1e4 4 266 136 +7a1e8 4 267 136 +7a1ec 4 391 136 +7a1f0 4 50 67 +7a1f4 4 52 67 +7a1f8 24 52 67 +7a21c 10 333 122 +7a22c 8 52 67 +7a234 10 55 67 +7a244 4 56 67 +7a248 10 57 67 +7a258 4 59 67 +7a25c 4 160 70 +7a260 4 70 67 +7a264 4 333 122 +7a268 4 60 67 +7a26c 4 70 67 +7a270 8 59 67 +7a278 4 333 122 +7a27c 8 59 67 +7a284 8 69 70 +7a28c 8 60 67 +7a294 8 68 67 +7a29c 8 69 67 +7a2a4 10 68 67 +7a2b4 8 68 67 +7a2bc 4 69 70 +7a2c0 4 160 70 +7a2c4 8 69 67 +7a2cc 8 69 67 +7a2d4 c 69 67 +7a2e0 8 69 67 +7a2e8 4 69 67 +7a2ec 18 69 67 +7a304 4 69 67 +7a308 1c 70 67 +7a324 4 110 72 +7a328 10 333 122 +7a338 4 70 67 +7a33c 4 70 67 +7a340 8 70 67 +7a348 c 70 67 +7a354 c 333 122 +7a360 8 156 132 +7a368 8 70 67 +7a370 4 102 70 +7a374 4 60 67 +7a378 8 102 70 +7a380 20 74 67 +FUNC 7a3a0 34 0 google_breakpad::BasicCodeModules::Copy +7a3a0 c 124 67 +7a3ac 4 124 67 +7a3b0 c 125 67 +7a3bc 8 125 67 +7a3c4 10 126 67 +FUNC 7a3d4 5c 0 CxaThreadKey::freeObject +7a3d4 10 251 161 +7a3e4 4 141 161 +7a3e8 18 68 161 +7a400 8 146 161 +7a408 4 72 161 +7a40c 4 147 161 +7a410 c 253 161 +7a41c 4 72 161 +7a420 10 253 161 +FUNC 7a430 74 0 CxaThreadKey::~CxaThreadKey +7a430 c 217 161 +7a43c 10 116 161 +7a44c 8 117 161 +7a454 4 119 161 +7a458 8 121 161 +7a460 8 119 161 +7a468 4 120 161 +7a46c 4 121 161 +7a470 8 117 161 +7a478 10 123 161 +7a488 8 124 161 +7a490 4 219 161 +7a494 8 220 161 +7a49c 8 219 161 +FUNC 7a4a4 10 0 __cxxabiv1::__shim_type_info::~__shim_type_info +7a4a4 10 278 161 +FUNC 7a4b4 14 0 __cxxabiv1::__cxa_pure_virtual +7a4b4 4 281 161 +7a4b8 4 282 161 +7a4bc 4 281 161 +7a4c0 4 282 161 +7a4c4 4 282 161 +FUNC 7a4c8 168 0 __cxxabiv1::__cxa_get_globals +7a4c8 c 289 161 +7a4d4 4 228 161 +7a4d8 4 289 161 +7a4dc c 228 161 +7a4e8 4 229 161 +7a4ec 14 291 161 +7a500 10 68 161 +7a510 14 131 161 +7a524 8 135 161 +7a52c 8 136 161 +7a534 4 135 161 +7a538 4 136 161 +7a53c c 72 161 +7a548 4 239 161 +7a54c c 244 161 +7a558 14 291 161 +7a56c 18 156 161 +7a584 8 157 161 +7a58c 10 161 161 +7a59c 4 167 161 +7a5a0 4 161 161 +7a5a4 8 162 161 +7a5ac 10 167 161 +7a5bc 4 167 161 +7a5c0 4 168 161 +7a5c4 4 167 161 +7a5c8 4 169 161 +7a5cc 4 170 161 +7a5d0 10 167 161 +7a5e0 c 172 161 +7a5ec 8 165 161 +7a5f4 2c 72 161 +7a620 c 242 161 +7a62c 4 289 161 +FUNC 7a630 4c 0 throwException +7a630 14 262 161 +7a644 8 263 161 +7a64c 4 264 161 +7a650 4 268 161 +7a654 4 264 161 +7a658 4 265 161 +7a65c 4 266 161 +7a660 4 265 161 +7a664 4 268 161 +7a668 8 266 161 +7a670 4 268 161 +7a674 8 271 161 +FUNC 7a67c 2c 0 __cxxabiv1::__cxa_get_globals_fast +7a67c 4 223 161 +7a680 8 293 161 +7a688 8 223 161 +7a690 14 295 161 +7a6a4 4 293 161 +FUNC 7a6a8 5c 0 __cxxabiv1::__cxa_allocate_exception +7a6a8 4 297 161 +7a6ac 4 299 161 +7a6b0 4 297 161 +7a6b4 4 299 161 +7a6b8 4 300 161 +7a6bc 20 307 161 +7a6dc 4 308 161 +7a6e0 8 309 161 +7a6e8 18 304 161 +7a700 4 297 161 +FUNC 7a704 60 0 __cxxabiv1::__cxa_free_exception +7a704 8 311 161 +7a70c 4 314 161 +7a710 4 311 161 +7a714 4 312 161 +7a718 4 314 161 +7a71c 4 316 161 +7a720 4 322 161 +7a724 8 323 161 +7a72c 4 322 161 +7a730 4 317 161 +7a734 14 318 161 +7a748 18 317 161 +7a760 4 311 161 +FUNC 7a764 8 0 defaultExceptionCleanupFunc +7a764 8 51 161 +FUNC 7a76c 3c 0 __cxxabiv1::__cxa_throw +7a76c 8 327 161 +7a774 4 332 161 +7a778 4 327 161 +7a77c 4 332 161 +7a780 4 332 161 +7a784 4 329 161 +7a788 4 333 161 +7a78c 4 330 161 +7a790 4 332 161 +7a794 4 333 161 +7a798 4 335 161 +7a79c 4 332 161 +7a7a0 4 333 161 +7a7a4 4 335 161 +FUNC 7a7a8 58 0 __cxxabiv1::__cxa_rethrow +7a7a8 8 338 161 +7a7b0 4 339 161 +7a7b4 4 340 161 +7a7b8 4 342 161 +7a7bc 1c 347 161 +7a7d8 4 350 161 +7a7dc 8 353 161 +7a7e4 10 348 161 +7a7f4 c 344 161 +FUNC 7a800 a4 0 __cxxabiv1::__cxa_begin_catch +7a800 c 356 161 +7a80c 4 356 161 +7a810 4 359 161 +7a814 4 361 161 +7a818 4 358 161 +7a81c 14 361 161 +7a830 4 362 161 +7a834 4 361 161 +7a838 4 362 161 +7a83c 4 368 161 +7a840 4 369 161 +7a844 4 369 161 +7a848 4 369 161 +7a84c 8 371 161 +7a854 4 372 161 +7a858 4 373 161 +7a85c 4 375 161 +7a860 4 377 161 +7a864 8 375 161 +7a86c 10 378 161 +7a87c c 369 161 +7a888 18 363 161 +7a8a0 4 356 161 +FUNC 7a8a4 b4 0 __cxxabiv1::__cxa_end_catch +7a8a4 8 380 161 +7a8ac 4 381 161 +7a8b0 4 382 161 +7a8b4 4 381 161 +7a8b8 4 385 161 +7a8bc 20 389 161 +7a8dc 4 390 161 +7a8e0 4 391 161 +7a8e4 8 409 161 +7a8ec 4 395 161 +7a8f0 4 396 161 +7a8f4 8 400 161 +7a8fc 8 404 161 +7a904 4 408 161 +7a908 8 409 161 +7a910 8 397 161 +7a918 8 398 161 +7a920 8 408 161 +7a928 4 401 161 +7a92c 4 402 161 +7a930 4 401 161 +7a934 4 409 161 +7a938 4 402 161 +7a93c 18 405 161 +7a954 4 380 161 +FUNC 7a958 c 0 operator delete +7a958 4 37 163 +7a95c 4 38 163 +7a960 4 39 163 +FUNC 7a964 4 0 operator delete [] +7a964 4 44 163 +FUNC 7a968 4 0 std::exception::~exception +7a968 4 41 166 +FUNC 7a96c c 0 std::exception::what +7a96c 4 44 166 +7a970 8 45 166 +FUNC 7a978 4 0 std::bad_exception::~bad_exception +7a978 4 53 166 +FUNC 7a97c c 0 std::bad_exception::what +7a97c 4 56 166 +7a980 8 57 166 +FUNC 7a988 4 0 std::exception::~exception +7a988 4 41 166 +FUNC 7a98c 4 0 std::bad_exception::~bad_exception +7a98c 4 53 166 +FUNC 7a990 10 0 std::exception::exception +7a990 c 36 166 +7a99c 4 37 166 +FUNC 7a9a0 10 0 std::bad_exception::bad_exception +7a9a0 c 48 166 +7a9ac 4 49 166 +FUNC 7a9b0 20 0 std::uncaught_exception +7a9b0 8 60 166 +7a9b8 4 63 166 +7a9bc 4 64 166 +7a9c0 4 65 166 +7a9c4 4 64 166 +7a9c8 8 65 166 +FUNC 7a9d0 78 0 __gabixx::__fatal_error +7a9d0 4 36 167 +7a9d4 8 41 167 +7a9dc 8 36 167 +7a9e4 4 36 167 +7a9e8 14 41 167 +7a9fc 14 65 167 +7aa10 4 67 167 +7aa14 10 68 167 +7aa24 4 69 167 +7aa28 14 70 167 +7aa3c 8 72 167 +7aa44 4 75 167 +FUNC 7aa48 10 0 __cxxabiv1::call_terminate +7aa48 8 52 168 +7aa50 4 53 168 +7aa54 4 54 168 +FUNC 7aa58 a0 0 __cxxabiv1::getTypePtr +7aa58 c 418 168 +7aa64 4 418 168 +7aa68 4 419 168 +7aa6c c 423 168 +7aa78 8 441 168 +7aa80 18 423 168 +7aa98 4 437 168 +7aa9c 8 443 168 +7aaa4 4 444 168 +7aaa8 4 443 168 +7aaac 4 444 168 +7aab0 8 445 168 +7aab8 4 433 168 +7aabc 8 443 168 +7aac4 4 444 168 +7aac8 4 443 168 +7aacc 4 444 168 +7aad0 8 445 168 +7aad8 4 429 168 +7aadc 8 443 168 +7aae4 4 444 168 +7aae8 4 443 168 +7aaec 4 444 168 +7aaf0 8 445 168 +FUNC 7aaf8 c4 0 __cxxabiv1::canExceptionSpecCatch +7aaf8 18 452 168 +7ab10 14 452 168 +7ab24 4 453 168 +7ab28 4 459 168 +7ab2c 4 458 168 +7ab30 4 459 168 +7ab34 4 471 168 +7ab38 8 459 168 +7ab40 10 469 168 +7ab50 4 472 168 +7ab54 4 471 168 +7ab58 4 470 168 +7ab5c 10 471 168 +7ab6c 4 471 168 +7ab70 8 462 168 +7ab78 4 463 168 +7ab7c 4 476 168 +7ab80 18 477 168 +7ab98 4 473 168 +7ab9c 18 477 168 +7abb4 8 454 168 +FUNC 7abbc 3d4 0 __cxxabiv1::scanEHTable +7abbc 28 62 168 +7abe4 4 72 168 +7abe8 14 62 168 +7abfc 4 62 168 +7ac00 4 72 168 +7ac04 4 64 168 +7ac08 4 69 168 +7ac0c 4 65 168 +7ac10 4 66 168 +7ac14 4 67 168 +7ac18 4 68 168 +7ac1c 4 69 168 +7ac20 4 72 168 +7ac24 8 73 168 +7ac2c c 89 168 +7ac38 4 89 168 +7ac3c 8 90 168 +7ac44 4 99 168 +7ac48 4 95 168 +7ac4c 8 96 168 +7ac54 4 100 168 +7ac58 8 96 168 +7ac60 4 97 168 +7ac64 4 96 168 +7ac68 c 97 168 +7ac74 4 100 168 +7ac78 4 98 168 +7ac7c 8 100 168 +7ac84 c 101 168 +7ac90 4 103 168 +7ac94 4 105 168 +7ac98 4 103 168 +7ac9c 8 105 168 +7aca4 4 103 168 +7aca8 4 105 168 +7acac 4 106 168 +7acb0 4 105 168 +7acb4 4 106 168 +7acb8 8 107 168 +7acc0 c 108 168 +7accc 4 110 168 +7acd0 4 111 168 +7acd4 4 110 168 +7acd8 4 115 168 +7acdc 4 110 168 +7ace0 4 111 168 +7ace4 4 112 168 +7ace8 4 113 168 +7acec 4 115 168 +7acf0 8 118 168 +7acf8 10 119 168 +7ad08 10 120 168 +7ad18 10 121 168 +7ad28 8 122 168 +7ad30 8 123 168 +7ad38 8 275 168 +7ad40 8 206 168 +7ad48 4 209 168 +7ad4c 8 210 168 +7ad54 18 216 168 +7ad6c 4 216 168 +7ad70 8 219 168 +7ad78 4 225 168 +7ad7c 4 221 168 +7ad80 4 222 168 +7ad84 4 223 168 +7ad88 4 224 168 +7ad8c 4 225 168 +7ad90 2c 280 168 +7adbc 4 77 168 +7adc0 c 78 168 +7adcc 8 79 168 +7add4 4 80 168 +7add8 4 124 168 +7addc c 130 168 +7ade8 4 131 168 +7adec c 132 168 +7adf8 8 266 168 +7ae00 4 267 168 +7ae04 14 123 168 +7ae18 4 144 168 +7ae1c 8 235 168 +7ae24 8 144 168 +7ae2c 4 251 168 +7ae30 4 235 168 +7ae34 4 243 168 +7ae38 8 144 168 +7ae40 4 243 168 +7ae44 8 208 168 +7ae4c 14 153 168 +7ae60 4 154 168 +7ae64 8 172 168 +7ae6c 4 174 168 +7ae70 4 176 168 +7ae74 8 177 168 +7ae7c 1c 183 168 +7ae98 4 183 168 +7ae9c 8 184 168 +7aea4 20 188 168 +7aec4 4 188 168 +7aec8 8 189 168 +7aed0 8 197 168 +7aed8 4 262 168 +7aedc 4 263 168 +7aee0 4 262 168 +7aee4 4 263 168 +7aee8 4 264 168 +7aeec 10 271 168 +7aefc 8 147 168 +7af04 4 148 168 +7af08 4 147 168 +7af0c 4 148 168 +7af10 4 204 168 +7af14 10 251 168 +7af24 8 235 168 +7af2c 10 243 168 +7af3c 4 134 168 +7af40 4 136 168 +7af44 4 135 168 +7af48 4 136 168 +7af4c 4 137 168 +7af50 4 255 168 +7af54 4 256 168 +7af58 4 252 168 +7af5c 4 253 168 +7af60 4 254 168 +7af64 4 255 168 +7af68 4 256 168 +7af6c 4 257 168 +7af70 8 194 168 +7af78 4 195 168 +7af7c 4 191 168 +7af80 4 192 168 +7af84 4 193 168 +7af88 8 195 168 +FUNC 7af90 48 0 __cxxabiv1::setRegisters +7af90 c 481 168 +7af9c 8 481 168 +7afa4 10 483 168 +7afb4 10 485 168 +7afc4 8 486 168 +7afcc 8 487 168 +7afd4 4 486 168 +FUNC 7afd8 8 0 __cxxabiv1::continueUnwinding +7afd8 8 492 168 +FUNC 7afe0 4 0 __cxxabiv1::saveDataToBarrierCache +7afe0 4 498 168 +FUNC 7afe4 4 0 __cxxabiv1::loadDataFromBarrierCache +7afe4 4 501 168 +FUNC 7afe8 4 0 __cxxabiv1::prepareBeginCleanup +7afe8 4 503 168 +FUNC 7afec 4 0 __cxxabiv1::saveUnexpectedDataToBarrierCache +7afec 4 507 168 +FUNC 7aff0 c 0 std::bad_alloc::what +7aff0 4 51 169 +7aff4 8 52 169 +FUNC 7affc 10 0 std::bad_alloc::~bad_alloc +7affc 10 47 169 +FUNC 7b00c 30 0 std::bad_alloc::~bad_alloc +7b00c 10 47 169 +7b01c 10 47 169 +7b02c 4 48 169 +7b030 8 48 169 +7b038 4 48 169 +FUNC 7b03c 2c 0 std::bad_alloc::bad_alloc +7b03c c 44 169 +7b048 14 44 169 +7b05c c 45 169 +FUNC 7b068 90 0 operator new +7b068 c 96 169 +7b074 4 96 169 +7b078 1c 90 169 +7b094 4 104 169 +7b098 4 107 169 +7b09c 8 99 169 +7b0a4 4 100 169 +7b0a8 c 110 169 +7b0b4 c 105 169 +7b0c0 4 44 169 +7b0c4 8 105 169 +7b0cc 4 44 169 +7b0d0 4 105 169 +7b0d4 4 44 169 +7b0d8 8 105 169 +7b0e0 4 44 169 +7b0e4 10 105 169 +7b0f4 4 96 169 +FUNC 7b0f8 24 0 operator new [] +7b0f8 8 123 169 +7b100 4 124 169 +7b104 14 125 169 +7b118 4 123 169 +FUNC 7b11c 1b4 0 __cxxabiv1::__gxx_personality_v0 +7b11c 4 56 171 +7b120 4 57 171 +7b124 4 56 171 +7b128 4 57 171 +7b12c 4 57 171 +7b130 4 56 171 +7b134 4 57 171 +7b138 4 57 171 +7b13c c 56 171 +7b148 8 56 171 +7b150 c 57 171 +7b15c 18 61 171 +7b174 4 67 171 +7b178 4 58 171 +7b17c 4 88 171 +7b180 4 89 171 +7b184 4 93 171 +7b188 4 90 171 +7b18c 4 93 171 +7b190 4 98 171 +7b194 4 94 171 +7b198 4 98 171 +7b19c 4 95 171 +7b1a0 4 97 171 +7b1a4 4 96 171 +7b1a8 4 93 171 +7b1ac 4 94 171 +7b1b0 4 95 171 +7b1b4 4 96 171 +7b1b8 4 97 171 +7b1bc 4 98 171 +7b1c0 c 106 171 +7b1cc 4 110 171 +7b1d0 4 106 171 +7b1d4 14 109 171 +7b1e8 4 58 171 +7b1ec 18 126 171 +7b204 10 68 171 +7b214 c 69 171 +7b220 4 71 171 +7b224 4 73 171 +7b228 4 78 171 +7b22c 4 74 171 +7b230 4 78 171 +7b234 4 75 171 +7b238 4 78 171 +7b23c 4 76 171 +7b240 4 77 171 +7b244 4 73 171 +7b248 4 74 171 +7b24c 4 75 171 +7b250 4 76 171 +7b254 4 77 171 +7b258 8 78 171 +7b260 14 121 171 +7b274 10 114 171 +7b284 c 115 171 +7b290 c 117 171 +7b29c 4 119 171 +7b2a0 4 117 171 +7b2a4 c 118 171 +7b2b0 c 100 171 +7b2bc c 102 171 +7b2c8 8 103 171 +FUNC 7b2d0 8 0 __cxxabiv1::__si_class_type_info::code +7b2d0 8 174 162 +FUNC 7b2d8 10 0 __cxxabiv1::__si_class_type_info::~__si_class_type_info +7b2d8 10 34 172 +FUNC 7b2e8 30 0 __cxxabiv1::__si_class_type_info::~__si_class_type_info +7b2e8 10 34 172 +7b2f8 10 34 172 +7b308 4 36 172 +7b30c 8 36 172 +7b314 4 36 172 +FUNC 7b318 60 0 __cxxabiv1::__si_class_type_info::walk_to +7b318 10 40 172 +7b328 10 40 172 +7b338 c 41 172 +7b344 24 45 172 +7b368 10 46 172 +FUNC 7b378 18 0 __gabixx::__default_terminate +7b378 4 72 173 +7b37c 4 68 173 +7b380 4 72 173 +7b384 4 68 173 +7b388 4 72 173 +7b38c 4 75 173 +FUNC 7b390 30 0 __gabixx::__terminate +7b390 8 78 173 +7b398 4 79 173 +7b39c 4 84 173 +7b3a0 4 91 173 +7b3a4 8 80 173 +7b3ac 8 84 173 +7b3b4 4 85 173 +7b3b8 4 85 173 +7b3bc 4 91 173 +FUNC 7b3c0 1c 0 std::get_terminate +7b3c0 18 99 173 +7b3d8 4 100 173 +FUNC 7b3dc 24 0 std::terminate +7b3dc 4 99 173 +7b3e0 4 109 173 +7b3e4 4 99 173 +7b3e8 4 109 173 +7b3ec 10 99 173 +7b3fc 4 110 173 +FUNC 7b400 c 0 __gabixx::__default_unexpected +7b400 8 46 173 +7b408 4 47 173 +FUNC 7b40c 1c 0 std::get_unexpected +7b40c 18 114 173 +7b424 4 115 173 +FUNC 7b428 4 0 std::type_info::~type_info +7b428 4 44 174 +FUNC 7b42c c 0 std::bad_cast::what +7b42c 4 85 174 +7b430 8 86 174 +FUNC 7b438 10 0 std::bad_cast::~bad_cast +7b438 10 81 174 +FUNC 7b448 30 0 std::bad_cast::~bad_cast +7b448 10 81 174 +7b458 10 81 174 +7b468 4 82 174 +7b46c 8 82 174 +7b474 4 82 174 +FUNC 7b478 c 0 std::type_info::operator== +7b478 4 55 174 +7b47c 8 57 174 +FUNC 7b484 c 0 std::type_info::operator!= +7b484 4 62 174 +7b488 8 63 174 +FUNC 7b490 2c 0 std::bad_cast::bad_cast +7b490 c 78 174 +7b49c 14 78 174 +7b4b0 c 79 174 +FUNC 7b4bc 8 0 std::__Named_exception::what +7b4bc 8 95 234 +FUNC 7b4c4 44 0 std::__Named_exception::~__Named_exception +7b4c4 8 89 234 +7b4cc 4 90 234 +7b4d0 8 89 234 +7b4d8 8 89 234 +7b4e0 4 90 234 +7b4e4 8 89 234 +7b4ec 8 90 234 +7b4f4 4 91 234 +7b4f8 4 89 234 +7b4fc 8 92 234 +7b504 4 89 234 +FUNC 7b508 24 0 std::__Named_exception::~__Named_exception +7b508 c 89 234 +7b514 4 89 234 +7b518 4 92 234 +7b51c 4 92 234 +7b520 8 92 234 +7b528 4 92 234 +FUNC 7b52c 14 0 std::logic_error::~logic_error +7b52c 14 76 182 +FUNC 7b540 24 0 std::logic_error::~logic_error +7b540 c 76 182 +7b54c 8 76 182 +7b554 4 76 182 +7b558 8 76 182 +7b560 4 76 182 +FUNC 7b564 14 0 std::length_error::~length_error +7b564 14 80 182 +FUNC 7b578 24 0 std::length_error::~length_error +7b578 c 80 182 +7b584 8 80 182 +7b58c 4 80 182 +7b590 8 80 182 +7b598 4 80 182 +FUNC 7b59c 14 0 std::out_of_range::~out_of_range +7b59c 14 81 182 +FUNC 7b5b0 24 0 std::out_of_range::~out_of_range +7b5b0 c 81 182 +7b5bc 8 81 182 +7b5c4 4 81 182 +7b5c8 8 81 182 +7b5d0 4 81 182 +FUNC 7b5d4 18 0 std::allocator::deallocate +7b5d4 4 319 202 +7b5d8 8 161 202 +7b5e0 4 161 202 +7b5e4 4 135 223 +7b5e8 4 325 202 +FUNC 7b5ec a0 0 std::__Named_exception::__Named_exception +7b5ec 10 19 234 +7b5fc 1c 19 234 +7b618 8 20 234 +7b620 4 20 234 +7b624 4 21 234 +7b628 4 20 234 +7b62c 4 21 234 +7b630 c 32 234 +7b63c c 35 234 +7b648 8 36 234 +7b650 10 40 234 +7b660 c 22 234 +7b66c 4 23 234 +7b670 8 28 234 +7b678 14 25 234 +FUNC 7b68c c4 0 std::__stl_throw_out_of_range +7b68c 10 70 232 +7b69c 4 70 232 +7b6a0 10 70 232 +7b6b0 10 70 232 +7b6c0 c 34 233 +7b6cc 4 74 233 +7b6d0 4 64 239 +7b6d4 4 96 239 +7b6d8 c 74 233 +7b6e4 8 96 239 +7b6ec c 97 239 +7b6f8 1c 70 232 +7b714 10 70 232 +7b724 8 64 239 +7b72c c 96 239 +7b738 18 97 239 +FUNC 7b750 c4 0 std::__stl_throw_length_error +7b750 10 73 232 +7b760 4 73 232 +7b764 10 73 232 +7b774 10 73 232 +7b784 c 34 233 +7b790 4 66 233 +7b794 4 64 239 +7b798 4 96 239 +7b79c c 66 233 +7b7a8 8 96 239 +7b7b0 c 97 239 +7b7bc 1c 73 232 +7b7d8 10 73 232 +7b7e8 8 64 239 +7b7f0 c 96 239 +7b7fc 18 97 239 +FUNC 7b814 18 0 std::_Filebuf_base::_Filebuf_base +7b814 14 128 181 +7b828 4 129 181 +FUNC 7b82c 28 0 std::_Filebuf_base::_S_initialize +7b82c 4 132 181 +7b830 4 144 181 +7b834 4 132 181 +7b838 14 144 181 +7b84c 8 146 181 +FUNC 7b854 60 0 std::_Filebuf_base::_M_file_size +7b854 c 151 181 +7b860 10 114 181 +7b870 4 111 181 +7b874 4 114 181 +7b878 10 114 181 +7b888 10 153 181 +7b898 4 115 181 +7b89c 4 153 181 +7b8a0 8 115 181 +7b8a8 c 153 181 +FUNC 7b8b4 140 0 std::_Filebuf_base::_M_open +7b8b4 18 157 181 +7b8cc 4 157 181 +7b8d0 8 160 181 +7b8d8 10 166 181 +7b8e8 4 190 181 +7b8ec 10 212 181 +7b8fc 18 166 181 +7b914 4 169 181 +7b918 c 193 181 +7b924 4 195 181 +7b928 4 198 181 +7b92c 4 200 181 +7b930 4 198 181 +7b934 4 200 181 +7b938 4 204 181 +7b93c 4 205 181 +7b940 4 206 181 +7b944 c 106 181 +7b950 4 106 181 +7b954 10 106 181 +7b964 8 209 181 +7b96c 8 211 181 +7b974 10 212 181 +7b984 8 187 181 +7b98c 4 176 181 +7b990 8 177 181 +7b998 8 173 181 +7b9a0 8 183 181 +7b9a8 8 180 181 +7b9b0 c 200 181 +7b9bc c 200 181 +7b9c8 4 204 181 +7b9cc 4 205 181 +7b9d0 4 206 181 +7b9d4 c 208 181 +7b9e0 4 201 181 +7b9e4 4 204 181 +7b9e8 4 205 181 +7b9ec 8 206 181 +FUNC 7b9f4 8 0 std::_Filebuf_base::_M_open +7b9f4 8 221 181 +FUNC 7b9fc d4 0 std::_Filebuf_base::_M_open +7b9fc 10 228 181 +7ba0c 4 229 181 +7ba10 8 229 181 +7ba18 10 229 181 +7ba28 c 232 181 +7ba34 8 234 181 +7ba3c c 82 181 +7ba48 4 94 181 +7ba4c 8 95 181 +7ba54 4 238 181 +7ba58 4 95 181 +7ba5c 4 240 181 +7ba60 4 237 181 +7ba64 4 106 181 +7ba68 4 240 181 +7ba6c 4 106 181 +7ba70 4 241 181 +7ba74 4 106 181 +7ba78 8 106 181 +7ba80 4 242 181 +7ba84 4 243 181 +7ba88 10 244 181 +7ba98 4 230 181 +7ba9c 10 244 181 +7baac 24 106 181 +FUNC 7bad0 58 0 std::_Filebuf_base::_M_close +7bad0 4 247 181 +7bad4 4 249 181 +7bad8 8 247 181 +7bae0 c 248 181 +7baec 4 251 181 +7baf0 4 251 181 +7baf4 4 251 181 +7baf8 8 253 181 +7bb00 4 254 181 +7bb04 10 256 181 +7bb14 14 251 181 +FUNC 7bb28 8 0 std::_Filebuf_base::_M_read +7bb28 8 262 181 +FUNC 7bb30 68 0 std::_Filebuf_base::_M_write +7bb30 10 268 181 +7bb40 10 268 181 +7bb50 10 276 181 +7bb60 10 270 181 +7bb70 4 272 181 +7bb74 4 278 181 +7bb78 4 276 181 +7bb7c 4 277 181 +7bb80 4 272 181 +7bb84 4 273 181 +7bb88 10 283 181 +FUNC 7bb98 90 0 std::_Filebuf_base::_M_seek +7bb98 4 287 181 +7bb9c 4 290 181 +7bba0 8 287 181 +7bba8 4 287 181 +7bbac 14 290 181 +7bbc0 10 309 181 +7bbd0 4 294 181 +7bbd4 4 292 181 +7bbd8 4 308 181 +7bbdc 8 309 181 +7bbe4 8 308 181 +7bbec 14 300 181 +7bc00 4 308 181 +7bc04 4 302 181 +7bc08 8 309 181 +7bc10 8 308 181 +7bc18 4 297 181 +7bc1c 8 309 181 +7bc24 4 308 181 +FUNC 7bc28 c 0 std::_Filebuf_base::_M_unmap +7bc28 c 340 181 +FUNC 7bc34 8c 0 std::_Filebuf_base::_M_mmap +7bc34 4 317 181 +7bc38 4 320 181 +7bc3c 14 317 181 +7bc50 4 320 181 +7bc54 4 317 181 +7bc58 14 320 181 +7bc6c 4 321 181 +7bc70 4 320 181 +7bc74 4 321 181 +7bc78 14 322 181 +7bc8c 14 334 181 +7bca0 8 327 181 +7bca8 c 323 181 +7bcb4 4 324 181 +7bcb8 8 323 181 +FUNC 7bcc0 424 0 std::_Underflow >::_M_doit +7bcc0 14 38 183 +7bcd4 4 38 183 +7bcd8 8 42 183 +7bce0 8 46 183 +7bce8 8 220 209 +7bcf0 8 93 236 +7bcf8 4 48 183 +7bcfc 4 94 236 +7bd00 4 95 236 +7bd04 4 221 209 +7bd08 4 48 183 +7bd0c 4 223 247 +7bd10 14 93 183 +7bd24 4 430 208 +7bd28 4 44 183 +7bd2c 4 430 208 +7bd30 8 430 208 +7bd38 8 430 208 +7bd40 c 432 208 +7bd4c 8 438 208 +7bd54 4 440 208 +7bd58 4 435 208 +7bd5c 4 436 208 +7bd60 4 440 208 +7bd64 c 59 183 +7bd70 8 502 208 +7bd78 8 498 208 +7bd80 8 502 208 +7bd88 8 509 208 +7bd90 4 537 208 +7bd94 8 213 204 +7bd9c 14 515 208 +7bdb0 4 516 208 +7bdb4 4 522 208 +7bdb8 4 525 208 +7bdbc 8 522 208 +7bdc4 8 525 208 +7bdcc 4 537 208 +7bdd0 24 213 204 +7bdf4 8 547 208 +7bdfc 8 549 208 +7be04 10 549 208 +7be14 10 549 208 +7be24 8 549 208 +7be2c 4 555 208 +7be30 4 93 236 +7be34 4 94 236 +7be38 4 95 236 +7be3c 8 223 247 +7be44 8 58 183 +7be4c 4 61 183 +7be50 4 62 183 +7be54 4 61 183 +7be58 c 62 183 +7be64 14 66 183 +7be78 8 67 183 +7be80 8 68 183 +7be88 4 67 183 +7be8c 8 68 183 +7be94 10 68 183 +7bea4 c 128 209 +7beb0 8 69 183 +7beb8 4 72 183 +7bebc 4 70 183 +7bec0 8 74 183 +7bec8 4 75 183 +7becc 10 77 183 +7bedc 8 80 183 +7bee4 4 93 236 +7bee8 4 80 183 +7beec 4 94 236 +7bef0 4 95 236 +7bef4 4 223 247 +7bef8 4 81 183 +7befc 4 224 201 +7bf00 4 504 208 +7bf04 4 224 201 +7bf08 c 504 208 +7bf14 18 549 208 +7bf2c 8 119 208 +7bf34 c 120 208 +7bf40 4 121 208 +7bf44 4 122 208 +7bf48 4 124 208 +7bf4c 4 488 208 +7bf50 4 487 208 +7bf54 4 553 208 +7bf58 4 488 208 +7bf5c 4 93 236 +7bf60 4 94 236 +7bf64 4 95 236 +7bf68 14 93 183 +7bf7c 14 549 208 +7bf90 c 549 208 +7bf9c c 563 208 +7bfa8 4 87 183 +7bfac 8 88 183 +7bfb4 18 549 208 +7bfcc 4 93 236 +7bfd0 4 519 208 +7bfd4 4 94 236 +7bfd8 4 95 236 +7bfdc 14 93 183 +7bff0 8 75 183 +7bff8 8 224 201 +7c000 8 224 201 +7c008 4 328 209 +7c00c 8 327 209 +7c014 4 93 236 +7c018 4 94 236 +7c01c 8 95 236 +7c024 8 84 183 +7c02c c 128 209 +7c038 c 680 208 +7c044 c 644 208 +7c050 4 645 208 +7c054 4 655 208 +7c058 8 647 208 +7c060 4 227 204 +7c064 4 655 208 +7c068 4 227 204 +7c06c 4 655 208 +7c070 8 227 204 +7c078 c 655 208 +7c084 c 661 208 +7c090 4 664 208 +7c094 4 669 208 +7c098 c 670 208 +7c0a4 c 669 208 +7c0b0 8 686 208 +7c0b8 c 687 208 +7c0c4 8 688 208 +7c0cc 4 689 208 +7c0d0 4 690 208 +7c0d4 4 691 208 +7c0d8 4 692 208 +7c0dc 8 44 183 +FUNC 7c0e4 14 0 std::ios_base::failure::~failure +7c0e4 14 41 184 +FUNC 7c0f8 24 0 std::ios_base::failure::~failure +7c0f8 c 41 184 +7c104 8 41 184 +7c10c 4 41 184 +7c110 8 41 184 +7c118 4 41 184 +FUNC 7c11c 18 0 std::allocator::deallocate +7c11c 4 319 202 +7c120 8 161 202 +7c128 4 161 202 +7c12c 4 135 223 +7c130 4 325 202 +FUNC 7c134 30 0 std::ios_base::failure::failure +7c134 c 37 184 +7c140 4 37 184 +7c144 14 38 184 +7c158 c 39 184 +FUNC 7c164 60 0 std::ios_base::_M_invoke_callbacks +7c164 c 199 184 +7c170 4 200 184 +7c174 4 199 184 +7c178 14 200 184 +7c18c 4 201 184 +7c190 8 203 184 +7c198 4 201 184 +7c19c 10 203 184 +7c1ac 8 200 184 +7c1b4 10 205 184 +FUNC 7c1c4 d0 0 std::ios_base::imbue +7c1c4 c 124 184 +7c1d0 4 125 184 +7c1d4 8 124 184 +7c1dc 8 124 184 +7c1e4 8 125 184 +7c1ec 4 124 184 +7c1f0 c 125 184 +7c1fc 10 126 184 +7c20c c 127 184 +7c218 c 128 184 +7c224 c 129 184 +7c230 8 129 184 +7c238 18 135 184 +7c250 c 132 184 +7c25c c 133 184 +7c268 1c 135 184 +7c284 10 129 184 +FUNC 7c294 64 0 std::ios_base::~ios_base +7c294 4 299 184 +7c298 4 300 184 +7c29c 10 299 184 +7c2ac c 299 184 +7c2b8 4 300 184 +7c2bc 8 301 184 +7c2c4 8 302 184 +7c2cc 8 303 184 +7c2d4 4 299 184 +7c2d8 8 304 184 +7c2e0 8 299 184 +7c2e8 10 299 184 +FUNC 7c2f8 24 0 std::ios_base::~ios_base +7c2f8 c 299 184 +7c304 4 299 184 +7c308 4 304 184 +7c30c 4 304 184 +7c310 8 304 184 +7c318 4 304 184 +FUNC 7c31c c0 0 std::ios_base::_M_throw_failure +7c31c 4 209 184 +7c320 4 227 184 +7c324 c 209 184 +7c330 4 227 184 +7c334 4 106 244 +7c338 4 481 202 +7c33c 4 106 244 +7c340 4 107 244 +7c344 4 380 238 +7c348 4 227 184 +7c34c 4 227 184 +7c350 4 481 202 +7c354 18 106 244 +7c36c 4 101 206 +7c370 4 227 184 +7c374 4 64 239 +7c378 c 96 239 +7c384 c 97 239 +7c390 18 227 184 +7c3a8 8 64 239 +7c3b0 c 96 239 +7c3bc 10 97 239 +7c3cc 10 227 184 +FUNC 7c3dc 6c 0 std::ios_base::ios_base +7c3dc 4 287 184 +7c3e0 4 295 184 +7c3e4 8 287 184 +7c3ec 4 287 184 +7c3f0 4c 295 184 +7c43c c 296 184 +FUNC 7c448 4 0 std::basic_streambuf >::imbue +7c448 4 180 235 +FUNC 7c44c 4 0 std::basic_streambuf >::setbuf +7c44c 4 200 235 +FUNC 7c450 c 0 std::basic_streambuf >::seekoff +7c450 c 195 235 +FUNC 7c45c c 0 std::basic_streambuf >::seekpos +7c45c c 189 235 +FUNC 7c468 8 0 std::basic_streambuf >::sync +7c468 8 184 235 +FUNC 7c470 8 0 std::basic_streambuf >::showmanyc +7c470 8 176 235 +FUNC 7c478 8 0 std::basic_streambuf >::underflow +7c478 8 171 235 +FUNC 7c480 8 0 std::basic_streambuf >::pbackfail +7c480 8 152 235 +FUNC 7c488 8 0 std::basic_streambuf >::overflow +7c488 8 158 235 +FUNC 7c490 10 0 std::basic_streambuf >::~basic_streambuf +7c490 10 41 235 +FUNC 7c4a0 30 0 std::basic_streambuf >::~basic_streambuf +7c4a0 4 40 235 +7c4a4 4 41 235 +7c4a8 8 40 235 +7c4b0 4 41 235 +7c4b4 4 40 235 +7c4b8 8 41 235 +7c4c0 4 41 235 +7c4c4 8 41 235 +7c4cc 4 41 235 +FUNC 7c4d0 10 0 std::basic_ios >::~basic_ios +7c4d0 10 59 211 +FUNC 7c4e0 30 0 std::basic_ios >::~basic_ios +7c4e0 10 59 211 +7c4f0 10 59 211 +7c500 4 59 211 +7c504 8 59 211 +7c50c 4 59 211 +FUNC 7c510 20 0 std::basic_istream >::~basic_istream +7c510 4 90 214 +7c514 c 90 214 +7c520 10 59 211 +FUNC 7c540 3c 0 std::basic_istream >::~basic_istream +7c540 4 90 214 +7c544 4 90 214 +7c548 8 90 214 +7c550 4 90 214 +7c554 8 90 214 +7c55c 10 59 211 +7c56c 4 90 214 +7c570 8 90 214 +7c578 4 90 214 +FUNC 7c58c 20 0 std::basic_ostream >::~basic_ostream +7c58c 4 43 229 +7c590 c 44 229 +7c59c 10 59 211 +FUNC 7c5bc 3c 0 std::basic_ostream >::~basic_ostream +7c5bc 4 43 229 +7c5c0 4 44 229 +7c5c4 8 43 229 +7c5cc 4 43 229 +7c5d0 8 44 229 +7c5d8 10 59 211 +7c5e8 4 44 229 +7c5ec 8 44 229 +7c5f4 4 44 229 +FUNC 7c608 c4 0 std::basic_streambuf >::_M_xsputnc +7c608 4 112 235 +7c60c 4 117 235 +7c610 10 112 235 +7c620 20 117 235 +7c640 4 261 247 +7c644 4 122 235 +7c648 4 261 247 +7c64c 4 123 235 +7c650 4 117 235 +7c654 8 123 235 +7c65c 4 117 235 +7c660 4 118 235 +7c664 4 120 235 +7c668 4 118 235 +7c66c 8 261 247 +7c674 4 118 235 +7c678 8 120 235 +7c680 4 118 235 +7c684 4 127 235 +7c688 10 127 235 +7c698 8 126 235 +7c6a0 4 128 235 +7c6a4 8 117 235 +7c6ac 18 133 235 +7c6c4 8 114 235 +FUNC 7c6cc c8 0 std::basic_streambuf >::xsputn +7c6cc 4 84 235 +7c6d0 4 89 235 +7c6d4 10 84 235 +7c6e4 8 84 235 +7c6ec 4 89 235 +7c6f0 4 84 235 +7c6f4 10 89 235 +7c704 4 253 247 +7c708 4 94 235 +7c70c 4 95 235 +7c710 4 253 247 +7c714 4 95 235 +7c718 4 96 235 +7c71c 4 89 235 +7c720 8 96 235 +7c728 4 89 235 +7c72c 4 90 235 +7c730 4 92 235 +7c734 4 90 235 +7c738 8 253 247 +7c740 4 90 235 +7c744 8 92 235 +7c74c 4 90 235 +7c750 4 100 235 +7c754 8 100 235 +7c75c 4 102 235 +7c760 8 100 235 +7c768 8 99 235 +7c770 4 101 235 +7c774 8 89 235 +7c77c 18 108 235 +FUNC 7c794 38 0 std::basic_filebuf >::sync +7c794 4 402 208 +7c798 4 406 208 +7c79c 4 402 208 +7c7a0 8 403 208 +7c7a8 4 405 208 +7c7ac c 405 208 +7c7b8 8 405 208 +7c7c0 c 407 208 +FUNC 7c7cc dc 0 std::basic_filebuf >::_M_unshift +7c7cc 14 593 208 +7c7e0 c 593 208 +7c7ec 8 322 209 +7c7f4 4 600 208 +7c7f8 4 600 208 +7c7fc 4 322 209 +7c800 4 600 208 +7c804 4 600 208 +7c808 4 322 209 +7c80c 4 600 208 +7c810 8 600 208 +7c818 8 603 208 +7c820 8 322 209 +7c828 4 596 208 +7c82c 4 605 208 +7c830 4 596 208 +7c834 4 598 208 +7c838 4 296 204 +7c83c 4 597 208 +7c840 14 296 204 +7c854 4 597 208 +7c858 c 296 204 +7c864 4 600 208 +7c868 4 322 209 +7c86c 4 600 208 +7c870 4 602 208 +7c874 18 611 208 +7c88c 4 610 208 +7c890 18 611 208 +FUNC 7c8a8 a4 0 std::basic_filebuf >::showmanyc +7c8a8 4 132 208 +7c8ac 4 135 208 +7c8b0 8 132 208 +7c8b8 8 134 208 +7c8c0 8 134 208 +7c8c8 8 136 208 +7c8d0 8 138 208 +7c8d8 4 144 208 +7c8dc 10 145 208 +7c8ec 18 139 208 +7c904 8 140 208 +7c90c c 141 208 +7c918 4 141 208 +7c91c 10 145 208 +7c92c 8 137 208 +7c934 4 145 208 +7c938 8 137 208 +7c940 c 145 208 +FUNC 7c94c 40 0 std::basic_streambuf >::uflow +7c94c 8 162 235 +7c954 4 163 235 +7c958 4 162 235 +7c95c 4 162 235 +7c960 8 163 235 +7c968 8 165 235 +7c970 10 165 235 +7c980 c 166 235 +FUNC 7c98c c4 0 std::basic_streambuf >::xsgetn +7c98c 4 54 235 +7c990 4 58 235 +7c994 10 54 235 +7c9a4 8 54 235 +7c9ac 4 58 235 +7c9b0 4 54 235 +7c9b4 10 58 235 +7c9c4 4 253 247 +7c9c8 4 63 235 +7c9cc 4 253 247 +7c9d0 4 64 235 +7c9d4 4 65 235 +7c9d8 4 64 235 +7c9dc 4 58 235 +7c9e0 8 65 235 +7c9e8 4 58 235 +7c9ec 4 59 235 +7c9f0 4 61 235 +7c9f4 4 59 235 +7c9f8 8 253 247 +7ca00 4 59 235 +7ca04 8 61 235 +7ca0c 4 59 235 +7ca10 4 228 236 +7ca14 c 229 236 +7ca20 8 69 235 +7ca28 4 71 235 +7ca2c 4 70 235 +7ca30 8 58 235 +7ca38 18 80 235 +FUNC 7ca50 e4 0 std::basic_filebuf >::pbackfail +7ca50 4 157 208 +7ca54 4 162 208 +7ca58 8 161 208 +7ca60 c 199 208 +7ca6c 8 166 208 +7ca74 c 166 208 +7ca80 8 166 208 +7ca88 8 166 208 +7ca90 4 178 208 +7ca94 4 177 208 +7ca98 4 178 208 +7ca9c c 180 208 +7caa8 4 181 208 +7caac 4 95 236 +7cab0 4 181 208 +7cab4 4 93 236 +7cab8 8 94 236 +7cac0 8 91 236 +7cac8 4 199 208 +7cacc 8 91 236 +7cad4 8 197 208 +7cadc 4 199 208 +7cae0 c 91 236 +7caec 4 199 208 +7caf0 4 189 208 +7caf4 4 188 208 +7caf8 4 187 208 +7cafc 4 190 208 +7cb00 4 93 236 +7cb04 4 94 236 +7cb08 4 190 208 +7cb0c 4 186 208 +7cb10 4 188 208 +7cb14 4 95 236 +7cb18 8 190 208 +7cb20 8 175 208 +7cb28 4 199 208 +7cb2c 4 162 208 +7cb30 4 199 208 +FUNC 7cb34 544 0 std::ios_base::_S_uninitialize +7cb34 c 248 185 +7cb40 4 256 185 +7cb44 4 258 185 +7cb48 8 248 185 +7cb50 4 256 185 +7cb54 4 257 185 +7cb58 4 188 212 +7cb5c 4 259 185 +7cb60 c 256 185 +7cb6c 8 190 212 +7cb74 18 257 185 +7cb8c 4 92 211 +7cb90 4 190 212 +7cb94 8 92 211 +7cb9c 4 188 212 +7cba0 14 258 185 +7cbb4 4 92 211 +7cbb8 4 92 211 +7cbbc 4 190 212 +7cbc0 8 92 211 +7cbc8 4 188 212 +7cbcc c 259 185 +7cbd8 4 50 210 +7cbdc 4 259 185 +7cbe0 8 188 212 +7cbe8 4 92 211 +7cbec 4 92 211 +7cbf0 4 190 212 +7cbf4 8 92 211 +7cbfc 4 188 212 +7cc00 4 261 185 +7cc04 4 261 185 +7cc08 1c 261 185 +7cc24 4 188 212 +7cc28 4 50 210 +7cc2c 4 192 212 +7cc30 4 262 185 +7cc34 4 262 185 +7cc38 8 262 185 +7cc40 4 263 185 +7cc44 4 188 212 +7cc48 c 263 185 +7cc54 4 192 212 +7cc58 4 49 210 +7cc5c 4 188 212 +7cc60 4 50 210 +7cc64 4 192 212 +7cc68 4 263 185 +7cc6c 4 263 185 +7cc70 8 263 185 +7cc78 4 264 185 +7cc7c 4 188 212 +7cc80 c 264 185 +7cc8c 4 192 212 +7cc90 4 49 210 +7cc94 4 188 212 +7cc98 4 50 210 +7cc9c 4 192 212 +7cca0 4 264 185 +7cca4 4 264 185 +7cca8 8 264 185 +7ccb0 14 57 206 +7ccc4 c 59 211 +7ccd0 c 90 214 +7ccdc 10 59 211 +7ccec 18 57 206 +7cd04 8 59 211 +7cd0c c 44 229 +7cd18 10 59 211 +7cd28 10 57 206 +7cd38 c 59 211 +7cd44 c 44 229 +7cd50 10 59 211 +7cd60 10 57 206 +7cd70 c 59 211 +7cd7c c 44 229 +7cd88 10 59 211 +7cd98 4 278 185 +7cd9c 4 279 185 +7cda0 4 188 212 +7cda4 4 280 185 +7cda8 4 281 185 +7cdac 10 278 185 +7cdbc 8 190 212 +7cdc4 18 279 185 +7cddc 4 92 211 +7cde0 4 190 212 +7cde4 8 92 211 +7cdec 4 188 212 +7cdf0 14 280 185 +7ce04 4 92 211 +7ce08 4 92 211 +7ce0c 4 190 212 +7ce10 8 92 211 +7ce18 4 188 212 +7ce1c c 281 185 +7ce28 4 50 210 +7ce2c 4 281 185 +7ce30 8 188 212 +7ce38 4 92 211 +7ce3c 4 92 211 +7ce40 4 190 212 +7ce44 8 92 211 +7ce4c 4 188 212 +7ce50 4 283 185 +7ce54 4 283 185 +7ce58 1c 283 185 +7ce74 4 188 212 +7ce78 4 50 210 +7ce7c 4 192 212 +7ce80 4 284 185 +7ce84 4 284 185 +7ce88 8 284 185 +7ce90 4 285 185 +7ce94 4 188 212 +7ce98 c 285 185 +7cea4 4 192 212 +7cea8 4 49 210 +7ceac 4 188 212 +7ceb0 4 50 210 +7ceb4 4 192 212 +7ceb8 4 285 185 +7cebc 4 285 185 +7cec0 8 285 185 +7cec8 4 286 185 +7cecc 4 188 212 +7ced0 c 286 185 +7cedc 4 192 212 +7cee0 4 49 210 +7cee4 4 188 212 +7cee8 4 50 210 +7ceec 4 192 212 +7cef0 4 286 185 +7cef4 4 286 185 +7cef8 8 286 185 +7cf00 14 57 206 +7cf14 c 59 211 +7cf20 c 90 214 +7cf2c 10 59 211 +7cf3c 18 57 206 +7cf54 8 59 211 +7cf5c c 44 229 +7cf68 10 59 211 +7cf78 10 57 206 +7cf88 c 59 211 +7cf94 c 44 229 +7cfa0 10 59 211 +7cfb0 10 57 206 +7cfc0 c 59 211 +7cfcc c 44 229 +7cfd8 c 59 211 +7cfe4 10 293 185 +7cff4 4 59 211 +7cff8 4 50 210 +7cffc c 188 212 +7d008 4 50 210 +7d00c c 188 212 +7d018 24 57 206 +7d03c 14 293 185 +7d050 18 57 206 +7d068 10 193 212 +FUNC 7d078 34 0 std::ios_base::Init::~Init +7d078 4 152 185 +7d07c 8 151 185 +7d084 14 152 185 +7d098 8 156 185 +7d0a0 4 153 185 +7d0a4 4 156 185 +7d0a8 4 154 185 +FUNC 7d0ac 34 0 std::auto_ptr > >::~auto_ptr +7d0ac 8 107 203 +7d0b4 4 68 203 +7d0b8 4 107 203 +7d0bc 4 107 203 +7d0c0 8 107 203 +7d0c8 14 107 203 +7d0dc 4 107 203 +FUNC 7d0e0 100 0 std::basic_filebuf >::_M_setup_codecvt +7d0e0 c 735 208 +7d0ec 4 347 219 +7d0f0 8 735 208 +7d0f8 8 735 208 +7d100 10 347 219 +7d110 4 736 208 +7d114 4 747 208 +7d118 4 746 208 +7d11c 8 747 208 +7d124 8 748 208 +7d12c 4 749 208 +7d130 10 754 208 +7d140 8 351 219 +7d148 c 754 208 +7d154 10 351 219 +7d164 4 313 204 +7d168 4 737 208 +7d16c 8 313 204 +7d174 4 141 201 +7d178 4 741 208 +7d17c 4 313 204 +7d180 4 141 201 +7d184 4 740 208 +7d188 10 324 204 +7d198 4 741 208 +7d19c 4 743 208 +7d1a0 c 742 208 +7d1ac 10 315 204 +7d1bc 4 743 208 +7d1c0 1c 754 208 +7d1dc 4 346 219 +FUNC 7d1e0 1c 0 std::basic_filebuf >::imbue +7d1e0 8 414 208 +7d1e8 8 414 208 +7d1f0 4 417 208 +7d1f4 8 415 208 +FUNC 7d1fc 194 0 std::basic_ios >::init +7d1fc 18 97 210 +7d214 4 50 210 +7d218 4 97 210 +7d21c 4 92 211 +7d220 4 188 212 +7d224 4 100 210 +7d228 4 70 210 +7d22c 8 100 210 +7d234 10 70 210 +7d244 8 72 210 +7d24c 14 46 235 +7d260 14 47 235 +7d274 c 48 235 +7d280 8 73 210 +7d288 10 351 219 +7d298 4 76 210 +7d29c 8 100 210 +7d2a4 8 100 210 +7d2ac 8 68 211 +7d2b4 8 103 210 +7d2bc 4 132 212 +7d2c0 4 190 212 +7d2c4 4 206 207 +7d2c8 4 188 212 +7d2cc 8 112 212 +7d2d4 8 206 207 +7d2dc 4 132 212 +7d2e0 4 139 212 +7d2e4 4 206 207 +7d2e8 4 84 211 +7d2ec 14 110 210 +7d300 4 192 212 +7d304 8 188 212 +7d30c 4 192 212 +7d310 4 193 212 +7d314 4 78 210 +7d318 14 79 210 +7d32c c 79 210 +7d338 8 79 210 +7d340 4 187 212 +7d344 4 117 210 +7d348 8 187 212 +7d350 4 117 210 +7d354 c 78 210 +7d360 20 100 210 +7d380 8 118 210 +7d388 8 78 210 +FUNC 7d390 100 0 std::basic_filebuf >::_M_setup_codecvt +7d390 c 735 208 +7d39c 4 347 219 +7d3a0 8 735 208 +7d3a8 8 735 208 +7d3b0 10 347 219 +7d3c0 4 736 208 +7d3c4 4 747 208 +7d3c8 4 746 208 +7d3cc 8 747 208 +7d3d4 8 748 208 +7d3dc 4 749 208 +7d3e0 10 754 208 +7d3f0 8 351 219 +7d3f8 c 754 208 +7d404 10 351 219 +7d414 4 216 204 +7d418 4 737 208 +7d41c 8 216 204 +7d424 4 141 201 +7d428 4 741 208 +7d42c 4 216 204 +7d430 4 141 201 +7d434 4 740 208 +7d438 10 227 204 +7d448 4 741 208 +7d44c 4 743 208 +7d450 c 742 208 +7d45c 10 218 204 +7d46c 4 743 208 +7d470 1c 754 208 +7d48c 4 346 219 +FUNC 7d490 dc 0 std::basic_filebuf >::_M_allocate_buffers +7d490 10 630 208 +7d4a0 8 630 208 +7d4a8 4 637 208 +7d4ac 4 650 208 +7d4b0 4 651 208 +7d4b4 8 655 208 +7d4bc 8 324 204 +7d4c4 4 655 208 +7d4c8 8 324 204 +7d4d0 c 655 208 +7d4dc c 661 208 +7d4e8 4 664 208 +7d4ec 4 669 208 +7d4f0 4 670 208 +7d4f4 4 671 208 +7d4f8 4 670 208 +7d4fc 8 669 208 +7d504 10 672 208 +7d514 8 686 208 +7d51c c 687 208 +7d528 4 688 208 +7d52c 4 689 208 +7d530 4 690 208 +7d534 4 666 208 +7d538 4 691 208 +7d53c 4 692 208 +7d540 10 672 208 +7d550 c 644 208 +7d55c 4 645 208 +7d560 c 647 208 +FUNC 7d56c 68 0 std::basic_filebuf >::setbuf +7d56c c 268 208 +7d578 4 268 208 +7d57c 8 269 208 +7d584 8 269 208 +7d58c 8 269 208 +7d594 10 277 208 +7d5a4 8 271 208 +7d5ac 10 272 208 +7d5bc c 273 208 +7d5c8 c 274 208 +FUNC 7d5d4 2b8 0 std::basic_filebuf >::underflow +7d5d4 14 75 208 +7d5e8 4 75 208 +7d5ec 8 408 209 +7d5f4 8 412 209 +7d5fc 8 220 209 +7d604 8 93 236 +7d60c 4 414 209 +7d610 4 94 236 +7d614 4 95 236 +7d618 4 221 209 +7d61c 8 414 209 +7d624 1c 77 208 +7d640 4 498 208 +7d644 4 502 208 +7d648 8 498 208 +7d650 4 502 208 +7d654 c 224 201 +7d660 c 504 208 +7d66c 4 537 208 +7d670 8 310 204 +7d678 14 515 208 +7d68c 4 516 208 +7d690 4 522 208 +7d694 4 525 208 +7d698 8 522 208 +7d6a0 8 525 208 +7d6a8 4 537 208 +7d6ac 24 310 204 +7d6d0 8 547 208 +7d6d8 8 549 208 +7d6e0 10 549 208 +7d6f0 10 549 208 +7d700 8 549 208 +7d708 4 555 208 +7d70c 4 93 236 +7d710 4 94 236 +7d714 c 95 236 +7d720 1c 549 208 +7d73c 8 119 208 +7d744 c 120 208 +7d750 4 121 208 +7d754 4 122 208 +7d758 4 124 208 +7d75c 4 488 208 +7d760 4 487 208 +7d764 4 553 208 +7d768 4 488 208 +7d76c 4 93 236 +7d770 4 94 236 +7d774 4 95 236 +7d778 14 77 208 +7d78c 14 549 208 +7d7a0 c 549 208 +7d7ac c 563 208 +7d7b8 8 430 208 +7d7c0 8 430 208 +7d7c8 8 430 208 +7d7d0 4 410 209 +7d7d4 14 77 208 +7d7e8 8 432 208 +7d7f0 4 438 208 +7d7f4 4 440 208 +7d7f8 8 435 208 +7d800 4 438 208 +7d804 4 440 208 +7d808 8 509 208 +7d810 18 549 208 +7d828 4 93 236 +7d82c 4 519 208 +7d830 4 94 236 +7d834 4 95 236 +7d838 14 77 208 +7d84c c 224 201 +7d858 8 224 201 +7d860 c 128 209 +7d86c 8 680 208 +7d874 c 681 208 +7d880 4 432 208 +7d884 8 410 209 +FUNC 7d88c 2b4 0 std::basic_filebuf >::overflow +7d88c 18 208 208 +7d8a4 8 208 208 +7d8ac 8 210 208 +7d8b4 4 216 208 +7d8b8 c 219 208 +7d8c4 4 216 208 +7d8c8 4 117 236 +7d8cc 8 118 236 +7d8d4 4 119 236 +7d8d8 4 219 208 +7d8dc 8 220 208 +7d8e4 c 223 208 +7d8f0 8 228 208 +7d8f8 4 225 208 +7d8fc 14 290 204 +7d910 4 224 208 +7d914 4 290 204 +7d918 4 225 208 +7d91c c 290 204 +7d928 4 322 209 +7d92c c 290 204 +7d938 8 240 208 +7d940 4 240 208 +7d944 10 240 208 +7d954 8 322 209 +7d95c 10 290 204 +7d96c 4 246 208 +7d970 4 247 208 +7d974 4 223 208 +7d978 4 290 204 +7d97c 4 223 208 +7d980 4 228 208 +7d984 4 225 208 +7d988 10 290 204 +7d998 4 225 208 +7d99c 4 224 208 +7d9a0 c 290 204 +7d9ac 4 240 208 +7d9b0 4 322 209 +7d9b4 8 240 208 +7d9bc c 240 208 +7d9c8 24 240 208 +7d9ec 8 322 209 +7d9f4 10 290 204 +7da04 4 246 208 +7da08 4 582 208 +7da0c 4 580 208 +7da10 4 581 208 +7da14 4 232 208 +7da18 4 582 208 +7da1c 4 117 236 +7da20 4 118 236 +7da24 4 119 236 +7da28 18 256 208 +7da40 c 453 208 +7da4c 4 453 208 +7da50 8 453 208 +7da58 8 453 208 +7da60 8 456 208 +7da68 4 462 208 +7da6c 10 463 208 +7da7c 10 463 208 +7da8c 4 216 208 +7da90 4 466 208 +7da94 4 117 236 +7da98 4 219 208 +7da9c 4 216 208 +7daa0 4 466 208 +7daa4 4 118 236 +7daa8 4 119 236 +7daac c 219 208 +7dab8 4 212 208 +7dabc 18 256 208 +7dad4 c 223 208 +7dae0 8 182 247 +7dae8 8 182 247 +7daf0 4 232 208 +7daf4 18 256 208 +7db0c 4 681 208 +7db10 c 128 209 +7db1c 8 680 208 +7db24 c 681 208 +7db30 10 456 208 +FUNC 7db40 164 0 std::basic_filebuf >::~basic_filebuf +7db40 4 67 208 +7db44 4 70 208 +7db48 8 67 208 +7db50 8 70 208 +7db58 4 84 208 +7db5c 8 67 208 +7db64 4 84 208 +7db68 8 85 208 +7db70 8 93 208 +7db78 10 97 208 +7db88 10 97 208 +7db98 4 686 208 +7db9c 8 97 208 +7dba4 8 98 208 +7dbac 4 100 208 +7dbb0 4 101 208 +7dbb4 4 93 236 +7dbb8 4 94 236 +7dbbc 4 95 236 +7dbc0 4 117 236 +7dbc4 4 118 236 +7dbc8 4 119 236 +7dbcc c 106 208 +7dbd8 10 108 208 +7dbe8 4 686 208 +7dbec 8 687 208 +7dbf4 8 688 208 +7dbfc 4 689 208 +7dc00 4 41 235 +7dc04 4 690 208 +7dc08 4 691 208 +7dc0c 4 41 235 +7dc10 4 692 208 +7dc14 8 41 235 +7dc1c 8 70 208 +7dc24 4 41 235 +7dc28 8 89 208 +7dc30 4 119 208 +7dc34 4 120 208 +7dc38 4 119 208 +7dc3c c 120 208 +7dc48 4 121 208 +7dc4c 4 122 208 +7dc50 8 124 208 +7dc58 8 86 208 +7dc60 8 85 208 +7dc68 8 594 208 +7dc70 14 594 208 +7dc84 20 41 235 +FUNC 7dca4 24 0 std::basic_filebuf >::~basic_filebuf +7dca4 c 67 208 +7dcb0 4 67 208 +7dcb4 4 70 208 +7dcb8 4 70 208 +7dcbc 8 70 208 +7dcc4 4 70 208 +FUNC 7dcc8 64 0 std::auto_ptr > >::~auto_ptr +7dcc8 c 107 203 +7dcd4 4 68 203 +7dcd8 4 107 203 +7dcdc 14 107 203 +7dcf0 c 70 208 +7dcfc 4 70 208 +7dd00 8 107 203 +7dd08 4 70 208 +7dd0c 4 107 203 +7dd10 18 107 203 +7dd28 4 107 203 +FUNC 7dd2c 230 0 std::_Stl_create_wfilebuf +7dd2c 10 180 185 +7dd3c 4 181 185 +7dd40 c 180 185 +7dd4c 4 180 185 +7dd50 8 181 185 +7dd58 8 34 235 +7dd60 4 61 208 +7dd64 28 34 235 +7dd8c c 61 208 +7dd98 8 61 208 +7dda0 4 63 208 +7dda4 8 61 208 +7ddac 4 61 208 +7ddb0 4 61 208 +7ddb4 4 63 208 +7ddb8 28 61 208 +7dde0 10 61 208 +7ddf0 10 61 208 +7de00 10 61 208 +7de10 10 61 208 +7de20 20 61 208 +7de40 4 63 208 +7de44 10 63 208 +7de54 8 63 208 +7de5c 4 28 203 +7de60 10 194 209 +7de70 4 68 203 +7de74 8 184 185 +7de7c 1c 188 185 +7de98 14 107 203 +7deac c 70 208 +7deb8 4 70 208 +7debc 4 187 185 +7dec0 4 70 208 +7dec4 1c 188 185 +7dee0 4 107 203 +7dee4 4 187 185 +7dee8 2c 188 185 +7df14 10 187 185 +7df24 8 107 203 +7df2c 8 63 208 +7df34 10 41 235 +7df44 18 181 185 +FUNC 7df5c 22c 0 std::_Stl_create_filebuf<__sFILE*> +7df5c 10 168 185 +7df6c 4 169 185 +7df70 c 168 185 +7df7c 4 168 185 +7df80 8 169 185 +7df88 8 34 235 +7df90 4 61 208 +7df94 28 34 235 +7dfbc c 61 208 +7dfc8 8 61 208 +7dfd0 4 63 208 +7dfd4 8 61 208 +7dfdc 4 61 208 +7dfe0 4 61 208 +7dfe4 4 63 208 +7dfe8 28 61 208 +7e010 10 61 208 +7e020 10 61 208 +7e030 10 61 208 +7e040 10 61 208 +7e050 20 61 208 +7e070 4 63 208 +7e074 10 63 208 +7e084 8 63 208 +7e08c 10 194 209 +7e09c c 172 185 +7e0a8 18 176 185 +7e0c0 14 107 203 +7e0d4 c 70 208 +7e0e0 8 70 208 +7e0e8 4 176 185 +7e0ec 4 175 185 +7e0f0 14 176 185 +7e104 4 107 203 +7e108 4 175 185 +7e10c 24 176 185 +7e130 8 107 203 +7e138 14 107 203 +7e14c c 107 203 +7e158 8 63 208 +7e160 10 41 235 +7e170 18 169 185 +FUNC 7e188 80c 0 std::ios_base::_S_initialize +7e188 c 191 185 +7e194 4 202 185 +7e198 8 191 185 +7e1a0 4 202 185 +7e1a4 4 191 185 +7e1a8 4 28 203 +7e1ac 4 202 185 +7e1b0 c 28 203 +7e1bc 4 202 185 +7e1c0 8 203 185 +7e1c8 4 75 197 +7e1cc 4 203 185 +7e1d0 c 75 197 +7e1dc 4 68 203 +7e1e0 4 62 203 +7e1e4 c 75 197 +7e1f0 8 62 203 +7e1f8 c 62 203 +7e204 4 207 185 +7e208 4 28 203 +7e20c 8 207 185 +7e214 8 213 185 +7e21c 4 87 197 +7e220 4 213 185 +7e224 c 87 197 +7e230 4 68 203 +7e234 4 62 203 +7e238 c 87 197 +7e244 8 62 203 +7e24c c 62 203 +7e258 4 214 185 +7e25c 4 28 203 +7e260 4 214 185 +7e264 4 87 197 +7e268 4 214 185 +7e26c c 87 197 +7e278 4 68 203 +7e27c 8 87 197 +7e284 c 62 203 +7e290 c 62 203 +7e29c 4 215 185 +7e2a0 4 28 203 +7e2a4 4 215 185 +7e2a8 4 87 197 +7e2ac 4 215 185 +7e2b0 c 87 197 +7e2bc 4 68 203 +7e2c0 8 87 197 +7e2c8 c 62 203 +7e2d4 c 62 203 +7e2e0 4 28 203 +7e2e4 4 92 210 +7e2e8 4 68 203 +7e2ec 10 92 210 +7e2fc 8 87 214 +7e304 8 88 214 +7e30c 4 87 214 +7e310 8 87 214 +7e318 c 92 210 +7e324 8 87 214 +7e32c 4 88 214 +7e330 4 92 210 +7e334 4 55 203 +7e338 4 68 203 +7e33c 10 92 210 +7e34c 4 38 229 +7e350 4 38 229 +7e354 8 38 229 +7e35c 4 38 229 +7e360 4 39 229 +7e364 8 92 210 +7e36c 4 38 229 +7e370 4 92 210 +7e374 4 38 229 +7e378 4 39 229 +7e37c 4 92 210 +7e380 4 55 203 +7e384 4 68 203 +7e388 10 92 210 +7e398 4 38 229 +7e39c 4 38 229 +7e3a0 4 39 229 +7e3a4 4 38 229 +7e3a8 8 92 210 +7e3b0 4 38 229 +7e3b4 4 92 210 +7e3b8 4 38 229 +7e3bc 4 39 229 +7e3c0 4 92 210 +7e3c4 4 55 203 +7e3c8 4 68 203 +7e3cc 10 92 210 +7e3dc 4 38 229 +7e3e0 4 38 229 +7e3e4 4 39 229 +7e3e8 4 38 229 +7e3ec 8 92 210 +7e3f4 4 38 229 +7e3f8 4 92 210 +7e3fc 4 38 229 +7e400 4 39 229 +7e404 4 228 185 +7e408 4 232 185 +7e40c 4 68 211 +7e410 4 55 203 +7e414 4 228 185 +7e418 c 68 211 +7e424 10 229 185 +7e434 c 118 212 +7e440 8 232 185 +7e448 8 233 185 +7e450 4 28 203 +7e454 8 233 185 +7e45c 8 234 185 +7e464 4 28 203 +7e468 8 234 185 +7e470 8 235 185 +7e478 4 28 203 +7e47c 8 235 185 +7e484 4 92 210 +7e488 4 28 203 +7e48c 4 68 203 +7e490 10 92 210 +7e4a0 8 87 214 +7e4a8 8 88 214 +7e4b0 4 87 214 +7e4b4 8 87 214 +7e4bc c 92 210 +7e4c8 8 87 214 +7e4d0 4 88 214 +7e4d4 4 92 210 +7e4d8 4 55 203 +7e4dc 4 68 203 +7e4e0 10 92 210 +7e4f0 4 38 229 +7e4f4 4 38 229 +7e4f8 8 38 229 +7e500 4 38 229 +7e504 4 39 229 +7e508 8 92 210 +7e510 4 38 229 +7e514 4 92 210 +7e518 4 38 229 +7e51c 4 39 229 +7e520 4 92 210 +7e524 4 55 203 +7e528 4 68 203 +7e52c 10 92 210 +7e53c 4 38 229 +7e540 4 38 229 +7e544 4 39 229 +7e548 4 38 229 +7e54c 8 92 210 +7e554 4 38 229 +7e558 4 92 210 +7e55c 4 38 229 +7e560 4 39 229 +7e564 4 92 210 +7e568 4 55 203 +7e56c 4 68 203 +7e570 10 92 210 +7e580 4 38 229 +7e584 4 38 229 +7e588 4 39 229 +7e58c 4 38 229 +7e590 8 92 210 +7e598 4 38 229 +7e59c 4 92 210 +7e5a0 4 38 229 +7e5a4 4 39 229 +7e5a8 4 243 185 +7e5ac 4 68 211 +7e5b0 4 68 203 +7e5b4 4 243 185 +7e5b8 c 68 211 +7e5c4 10 244 185 +7e5d4 c 118 212 +7e5e0 4 107 203 +7e5e4 14 107 203 +7e5f8 c 70 208 +7e604 8 70 208 +7e60c 4 68 203 +7e610 4 107 203 +7e614 14 107 203 +7e628 c 70 208 +7e634 8 70 208 +7e63c 4 68 203 +7e640 4 107 203 +7e644 14 107 203 +7e658 c 70 208 +7e664 8 70 208 +7e66c 4 68 203 +7e670 4 107 203 +7e674 4 107 203 +7e678 8 107 203 +7e680 4 68 203 +7e684 4 107 203 +7e688 4 107 203 +7e68c 8 107 203 +7e694 4 68 203 +7e698 4 107 203 +7e69c 4 107 203 +7e6a0 8 107 203 +7e6a8 4 68 203 +7e6ac 4 107 203 +7e6b0 4 107 203 +7e6b4 8 107 203 +7e6bc 18 246 185 +7e6d4 14 219 185 +7e6e8 4 68 203 +7e6ec c 62 203 +7e6f8 c 62 203 +7e704 8 220 185 +7e70c 4 28 203 +7e710 c 220 185 +7e71c 4 68 203 +7e720 c 62 203 +7e72c c 62 203 +7e738 8 221 185 +7e740 4 28 203 +7e744 c 221 185 +7e750 4 68 203 +7e754 c 62 203 +7e760 c 62 203 +7e76c 8 28 203 +7e774 14 205 185 +7e788 4 68 203 +7e78c c 62 203 +7e798 10 62 203 +7e7a8 28 107 203 +7e7d0 c 107 203 +7e7dc 1c 59 211 +7e7f8 8 200 185 +7e800 8 199 185 +7e808 8 198 185 +7e810 10 244 185 +7e820 44 59 211 +7e864 8 234 185 +7e86c 8 233 185 +7e874 1c 232 185 +7e890 54 59 211 +7e8e4 18 235 185 +7e8fc 30 59 211 +7e92c 18 215 185 +7e944 50 59 211 +FUNC 7e994 38 0 std::ios_base::Init::Init +7e994 4 144 185 +7e998 8 143 185 +7e9a0 14 144 185 +7e9b4 8 149 185 +7e9bc 4 145 185 +7e9c0 4 146 185 +7e9c4 4 149 185 +7e9c8 4 147 185 +FUNC 7e9cc cc 0 std::basic_filebuf >::_M_seek_init +7e9cc c 700 208 +7e9d8 4 702 208 +7e9dc 4 700 208 +7e9e0 4 706 208 +7e9e4 4 700 208 +7e9e8 4 706 208 +7e9ec 4 720 208 +7e9f0 4 723 208 +7e9f4 4 720 208 +7e9f8 8 720 208 +7ea00 8 220 209 +7ea08 8 93 236 +7ea10 4 94 236 +7ea14 4 95 236 +7ea18 4 221 209 +7ea1c c 724 208 +7ea28 4 708 208 +7ea2c c 708 208 +7ea38 8 708 208 +7ea40 4 709 208 +7ea44 4 710 208 +7ea48 8 594 208 +7ea50 14 594 208 +7ea64 4 710 208 +7ea68 4 712 208 +7ea6c 4 713 208 +7ea70 4 117 236 +7ea74 4 713 208 +7ea78 4 715 208 +7ea7c 4 118 236 +7ea80 4 119 236 +7ea84 c 724 208 +7ea90 8 711 208 +FUNC 7ea98 10c 0 std::basic_filebuf >::seekpos +7ea98 10 384 208 +7eaa8 8 384 208 +7eab0 4 386 208 +7eab4 4 384 208 +7eab8 4 386 208 +7eabc 8 388 208 +7eac4 10 398 208 +7ead4 10 387 208 +7eae4 8 391 208 +7eaec 4 391 208 +7eaf0 10 391 208 +7eb00 8 391 208 +7eb08 4 240 209 +7eb0c 4 392 208 +7eb10 4 240 209 +7eb14 8 119 208 +7eb1c c 120 208 +7eb28 4 121 208 +7eb2c 4 122 208 +7eb30 3c 121 247 +7eb6c 8 242 209 +7eb74 4 243 209 +7eb78 8 244 209 +7eb80 8 245 209 +7eb88 4 93 236 +7eb8c 4 94 236 +7eb90 4 95 236 +7eb94 4 117 236 +7eb98 4 118 236 +7eb9c 8 119 236 +FUNC 7eba4 c8 0 std::basic_filebuf >::_M_seek_return +7eba4 4 238 209 +7eba8 4 239 209 +7ebac c 238 209 +7ebb8 c 238 209 +7ebc4 4 239 209 +7ebc8 8 240 209 +7ebd0 8 119 208 +7ebd8 c 120 208 +7ebe4 4 121 208 +7ebe8 4 122 208 +7ebec 4 242 209 +7ebf0 4 243 209 +7ebf4 4 244 209 +7ebf8 4 245 209 +7ebfc 4 93 236 +7ec00 4 94 236 +7ec04 4 95 236 +7ec08 4 117 236 +7ec0c 4 118 236 +7ec10 4 119 236 +7ec14 4 121 247 +7ec18 38 252 209 +7ec50 4 253 209 +7ec54 4 252 209 +7ec58 4 253 209 +7ec5c 4 252 209 +7ec60 c 253 209 +FUNC 7ec6c 3ec 0 std::basic_filebuf >::seekoff +7ec6c 14 291 208 +7ec80 8 291 208 +7ec88 8 294 208 +7ec90 c 297 208 +7ec9c 4 297 208 +7eca0 4 297 208 +7eca4 8 295 208 +7ecac 14 379 208 +7ecc0 24 300 208 +7ece4 10 304 208 +7ecf4 8 310 208 +7ecfc 8 314 208 +7ed04 10 317 208 +7ed14 4 321 208 +7ed18 4 321 208 +7ed1c 10 321 208 +7ed2c 4 239 209 +7ed30 4 321 208 +7ed34 4 239 209 +7ed38 8 240 209 +7ed40 8 119 208 +7ed48 c 120 208 +7ed54 4 121 208 +7ed58 4 122 208 +7ed5c 4 242 209 +7ed60 4 243 209 +7ed64 4 244 209 +7ed68 4 245 209 +7ed6c 4 93 236 +7ed70 4 94 236 +7ed74 4 95 236 +7ed78 4 117 236 +7ed7c 4 118 236 +7ed80 4 119 236 +7ed84 c 321 208 +7ed90 3c 301 208 +7edcc 24 379 208 +7edf0 10 320 208 +7ee00 4 321 208 +7ee04 8 89 247 +7ee0c 14 306 208 +7ee20 4 239 209 +7ee24 4 306 208 +7ee28 4 239 209 +7ee2c 8 240 209 +7ee34 8 119 208 +7ee3c c 120 208 +7ee48 4 121 208 +7ee4c 4 122 208 +7ee50 4 242 209 +7ee54 4 243 209 +7ee58 4 244 209 +7ee5c 4 245 209 +7ee60 4 93 236 +7ee64 4 94 236 +7ee68 4 95 236 +7ee6c 4 117 236 +7ee70 4 118 236 +7ee74 4 119 236 +7ee78 c 306 208 +7ee84 14 312 208 +7ee98 4 239 209 +7ee9c 4 312 208 +7eea0 4 239 209 +7eea4 8 240 209 +7eeac 8 119 208 +7eeb4 c 120 208 +7eec0 4 121 208 +7eec4 4 122 208 +7eec8 4 242 209 +7eecc 4 243 209 +7eed0 4 244 209 +7eed4 4 245 209 +7eed8 4 93 236 +7eedc 4 94 236 +7eee0 4 95 236 +7eee4 4 117 236 +7eee8 4 118 236 +7eeec 4 119 236 +7eef0 4 306 208 +7eef4 4 312 208 +7eef8 8 306 208 +7ef00 14 312 208 +7ef14 8 324 208 +7ef1c 10 325 208 +7ef2c 4 332 208 +7ef30 4 325 208 +7ef34 4 332 208 +7ef38 4 325 208 +7ef3c c 332 208 +7ef48 4 333 208 +7ef4c 4 87 209 +7ef50 4 335 208 +7ef54 4 336 208 +7ef58 c 335 208 +7ef64 4 336 208 +7ef68 8 89 247 +7ef70 8 378 208 +7ef78 4 346 208 +7ef7c 4 344 208 +7ef80 8 341 208 +7ef88 8 321 204 +7ef90 4 344 208 +7ef94 4 341 208 +7ef98 4 344 208 +7ef9c 18 321 204 +7efb4 10 370 208 +7efc4 4 373 208 +7efc8 4 371 208 +7efcc 4 372 208 +7efd0 4 373 208 +7efd4 4 87 209 +7efd8 4 372 208 +7efdc 8 373 208 +7efe4 4 375 208 +7efe8 8 89 247 +7eff0 14 89 247 +7f004 10 336 208 +7f014 8 336 208 +7f01c 3c 375 208 +FUNC 7f058 14 0 std::locale::facet::~facet +7f058 10 43 186 +7f068 4 342 241 +FUNC 7f06c 24 0 std::locale::facet::~facet +7f06c c 43 186 +7f078 8 43 186 +7f080 4 43 186 +7f084 8 43 186 +7f08c 4 43 186 +FUNC 7f090 18 0 std::allocator::deallocate +7f090 4 319 202 +7f094 8 161 202 +7f09c 4 161 202 +7f0a0 4 135 223 +7f0a4 4 325 202 +FUNC 7f0a8 3c 0 std::locale::locale +7f0a8 c 119 186 +7f0b4 4 119 186 +7f0b8 4 120 186 +7f0bc 8 120 186 +7f0c4 4 120 186 +7f0c8 18 121 186 +7f0e0 4 119 186 +FUNC 7f0e4 38 0 std::locale::locale +7f0e4 c 124 186 +7f0f0 4 124 186 +7f0f4 8 125 186 +7f0fc 4 125 186 +7f100 18 126 186 +7f118 4 124 186 +FUNC 7f11c 28 0 std::locale::locale +7f11c c 133 186 +7f128 4 133 186 +7f12c c 134 186 +7f138 c 135 186 +FUNC 7f144 2c 0 std::locale::~locale +7f144 8 362 186 +7f14c 8 363 186 +7f154 4 364 186 +7f158 14 365 186 +7f16c 4 362 186 +FUNC 7f170 60 0 std::locale::operator= +7f170 8 369 186 +7f178 8 370 186 +7f180 4 369 186 +7f184 4 370 186 +7f188 8 369 186 +7f190 4 370 186 +7f194 4 371 186 +7f198 8 372 186 +7f1a0 4 373 186 +7f1a4 4 373 186 +7f1a8 24 376 186 +7f1cc 4 369 186 +FUNC 7f1d0 2c 0 std::locale::_M_get_facet +7f1d0 c 379 186 +7f1dc 8 192 246 +7f1e4 8 379 186 +7f1ec 4 379 186 +7f1f0 4 380 186 +7f1f4 4 379 186 +7f1f8 4 380 186 +FUNC 7f1fc 38 0 std::locale::_M_use_facet +7f1fc 8 382 186 +7f204 c 383 186 +7f210 8 192 246 +7f218 8 383 186 +7f220 4 383 186 +7f224 4 384 186 +7f228 8 387 186 +7f230 4 385 186 +FUNC 7f234 9c 0 std::locale::name +7f234 10 389 186 +7f244 4 390 186 +7f248 4 389 186 +7f24c 4 379 238 +7f250 4 112 239 +7f254 c 481 202 +7f260 4 378 238 +7f264 8 379 238 +7f26c c 107 244 +7f278 c 106 244 +7f284 4 107 244 +7f288 4 380 238 +7f28c 4 101 206 +7f290 14 391 186 +7f2a4 8 64 239 +7f2ac c 96 239 +7f2b8 18 97 239 +FUNC 7f2d0 1d0 0 std::locale::operator== +7f2d0 8 394 186 +7f2d8 8 395 186 +7f2e0 c 394 186 +7f2ec 8 395 186 +7f2f4 14 396 186 +7f308 14 396 186 +7f31c 8 289 240 +7f324 10 400 238 +7f334 8 289 240 +7f33c c 96 239 +7f348 8 97 239 +7f350 8 161 202 +7f358 8 161 202 +7f360 4 64 239 +7f364 c 96 239 +7f370 8 97 239 +7f378 8 161 202 +7f380 8 161 202 +7f388 4 395 186 +7f38c 18 397 186 +7f3a4 14 135 223 +7f3b8 8 226 247 +7f3c0 4 289 240 +7f3c4 14 396 186 +7f3d8 4 395 186 +7f3dc 8 400 238 +7f3e4 8 324 240 +7f3ec c 96 239 +7f3f8 8 97 239 +7f400 8 161 202 +7f408 c 161 202 +7f414 10 324 240 +7f424 10 135 223 +7f434 4 64 239 +7f438 c 96 239 +7f444 18 97 239 +7f45c 4 395 186 +7f460 c 396 186 +7f46c 8 395 186 +7f474 8 64 239 +7f47c c 96 239 +7f488 10 97 239 +7f498 8 396 186 +FUNC 7f4a0 1c 0 std::locale::operator!= +7f4a0 8 399 186 +7f4a8 8 400 186 +7f4b0 c 401 186 +FUNC 7f4bc 8 0 std::time_get > >::do_date_order +7f4bc 8 168 243 +FUNC 7f4c4 8 0 std::time_get > >::do_date_order +7f4c4 8 168 243 +FUNC 7f4cc 10 0 std::money_put > >::~money_put +7f4cc 10 406 222 +FUNC 7f4dc 30 0 std::money_put > >::~money_put +7f4dc 10 406 222 +7f4ec 10 406 222 +7f4fc 4 406 222 +7f500 8 406 222 +7f508 4 406 222 +FUNC 7f50c 10 0 std::money_get > >::~money_get +7f50c 10 73 222 +FUNC 7f51c 30 0 std::money_get > >::~money_get +7f51c 10 73 222 +7f52c 10 73 222 +7f53c 4 73 222 +7f540 8 73 222 +7f548 4 73 222 +FUNC 7f54c 10 0 std::money_put > >::~money_put +7f54c 10 406 222 +FUNC 7f55c 30 0 std::money_put > >::~money_put +7f55c 10 406 222 +7f56c 10 406 222 +7f57c 4 406 222 +7f580 8 406 222 +7f588 4 406 222 +FUNC 7f58c 10 0 std::money_get > >::~money_get +7f58c 10 73 222 +FUNC 7f59c 30 0 std::money_get > >::~money_get +7f59c 10 73 222 +7f5ac 10 73 222 +7f5bc 4 73 222 +7f5c0 8 73 222 +7f5c8 4 73 222 +FUNC 7f5cc 10 0 std::num_put > >::~num_put +7f5cc 10 107 227 +FUNC 7f5dc 30 0 std::num_put > >::~num_put +7f5dc 10 107 227 +7f5ec 10 107 227 +7f5fc 4 107 227 +7f600 8 107 227 +7f608 4 107 227 +FUNC 7f60c 10 0 std::num_get > >::~num_get +7f60c 10 126 225 +FUNC 7f61c 30 0 std::num_get > >::~num_get +7f61c 10 126 225 +7f62c 10 126 225 +7f63c 4 126 225 +7f640 8 126 225 +7f648 4 126 225 +FUNC 7f64c 10 0 std::num_get > >::~num_get +7f64c 10 126 225 +FUNC 7f65c 30 0 std::num_get > >::~num_get +7f65c 10 126 225 +7f66c 10 126 225 +7f67c 4 126 225 +7f680 8 126 225 +7f688 4 126 225 +FUNC 7f68c 10 0 std::num_put > >::~num_put +7f68c 10 107 227 +FUNC 7f69c 30 0 std::num_put > >::~num_put +7f69c 10 107 227 +7f6ac 10 107 227 +7f6bc 4 107 227 +7f6c0 8 107 227 +7f6c8 4 107 227 +FUNC 7f6cc 8 0 std::_Refcount_Base::~_Refcount_Base +7f6cc 8 342 241 +FUNC 7f6d4 18 0 std::allocator::deallocate +7f6d4 4 319 202 +7f6d8 8 161 202 +7f6e0 4 161 202 +7f6e4 4 135 223 +7f6e8 4 325 202 +FUNC 7f6ec 1c 0 std::allocator::deallocate +7f6ec 4 319 202 +7f6f0 4 323 202 +7f6f4 8 161 202 +7f6fc 4 161 202 +7f700 4 135 223 +7f704 4 325 202 +FUNC 7f708 1c 0 std::basic_streambuf >::sbumpc +7f708 8 227 236 +7f710 4 228 236 +7f714 8 229 236 +7f71c 8 230 236 +FUNC 7f724 110 0 std::priv::__write_integer_backward +7f724 c 304 226 +7f730 4 304 226 +7f734 14 314 226 +7f748 4 322 226 +7f74c 4 323 226 +7f750 4 322 226 +7f754 8 323 226 +7f75c 4 322 226 +7f760 4 326 226 +7f764 c 327 226 +7f770 10 368 226 +7f780 8 295 226 +7f788 4 294 226 +7f78c 10 295 226 +7f79c 4 294 226 +7f7a0 8 295 226 +7f7a8 4 294 226 +7f7ac 4 297 226 +7f7b0 c 298 226 +7f7bc 18 368 226 +7f7d4 4 333 226 +7f7d8 c 333 226 +7f7e4 4 339 226 +7f7e8 4 340 226 +7f7ec 4 339 226 +7f7f0 8 340 226 +7f7f8 4 339 226 +7f7fc 4 342 226 +7f800 4 343 226 +7f804 4 344 226 +7f808 4 343 226 +7f80c 8 344 226 +7f814 10 368 226 +7f824 10 333 226 +FUNC 7f834 110 0 std::priv::__write_integer_backward +7f834 c 304 226 +7f840 4 304 226 +7f844 14 314 226 +7f858 4 322 226 +7f85c 4 323 226 +7f860 4 322 226 +7f864 8 323 226 +7f86c 4 322 226 +7f870 4 326 226 +7f874 c 327 226 +7f880 10 368 226 +7f890 8 295 226 +7f898 4 294 226 +7f89c 10 295 226 +7f8ac 4 294 226 +7f8b0 8 295 226 +7f8b8 4 294 226 +7f8bc 4 297 226 +7f8c0 c 298 226 +7f8cc 18 368 226 +7f8e4 4 333 226 +7f8e8 c 333 226 +7f8f4 4 339 226 +7f8f8 4 340 226 +7f8fc 4 339 226 +7f900 8 340 226 +7f908 4 339 226 +7f90c 4 342 226 +7f910 4 343 226 +7f914 4 344 226 +7f918 4 343 226 +7f91c 8 344 226 +7f924 10 368 226 +7f934 10 333 226 +FUNC 7f944 1c 0 std::basic_streambuf >::sbumpc +7f944 8 227 236 +7f94c 4 228 236 +7f950 8 229 236 +7f958 8 230 236 +FUNC 7f960 98 0 std::istreambuf_iterator >::_M_getc +7f960 c 89 215 +7f96c 4 89 215 +7f970 4 92 215 +7f974 1c 235 236 +7f990 4 93 215 +7f994 4 95 215 +7f998 4 94 215 +7f99c 4 95 215 +7f9a0 c 96 215 +7f9ac 20 234 236 +7f9cc 4 93 215 +7f9d0 4 95 215 +7f9d4 4 94 215 +7f9d8 4 95 215 +7f9dc c 96 215 +7f9e8 10 235 236 +FUNC 7f9f8 98 0 std::istreambuf_iterator >::_M_getc +7f9f8 c 89 215 +7fa04 4 89 215 +7fa08 4 92 215 +7fa0c 18 235 236 +7fa24 4 93 215 +7fa28 4 95 215 +7fa2c 4 94 215 +7fa30 4 95 215 +7fa34 c 96 215 +7fa40 20 234 236 +7fa60 4 93 215 +7fa64 4 95 215 +7fa68 4 94 215 +7fa6c 4 95 215 +7fa70 c 96 215 +7fa7c 14 235 236 +FUNC 7fa90 c4 0 std::priv::__copy >, long int> +7fa90 10 211 201 +7faa0 4 213 201 +7faa4 8 211 201 +7faac 4 213 201 +7fab0 10 211 201 +7fac0 10 213 201 +7fad0 8 199 236 +7fad8 4 215 201 +7fadc 8 213 201 +7fae4 4 214 201 +7fae8 4 62 230 +7faec 4 200 236 +7faf0 4 199 236 +7faf4 4 200 236 +7faf8 4 199 236 +7fafc 8 200 236 +7fb04 4 199 236 +7fb08 4 223 247 +7fb0c c 199 236 +7fb18 4 200 236 +7fb1c 4 215 201 +7fb20 4 200 236 +7fb24 8 62 230 +7fb2c 8 213 201 +7fb34 4 218 201 +7fb38 1c 219 201 +FUNC 7fb54 bc 0 std::priv::__copy >, long int> +7fb54 10 211 201 +7fb64 4 213 201 +7fb68 4 213 201 +7fb6c 4 211 201 +7fb70 8 211 201 +7fb78 10 213 201 +7fb88 8 199 236 +7fb90 8 62 230 +7fb98 4 215 201 +7fb9c 8 213 201 +7fba4 4 214 201 +7fba8 4 62 230 +7fbac 4 200 236 +7fbb0 4 200 236 +7fbb4 4 200 236 +7fbb8 4 199 236 +7fbbc 8 200 236 +7fbc4 18 199 236 +7fbdc 18 200 236 +7fbf4 4 218 201 +7fbf8 18 219 201 +FUNC 7fc10 bc 0 std::priv::__copy >, long int> +7fc10 10 211 201 +7fc20 4 213 201 +7fc24 4 213 201 +7fc28 4 211 201 +7fc2c 8 211 201 +7fc34 10 213 201 +7fc44 8 199 236 +7fc4c 8 62 230 +7fc54 4 215 201 +7fc58 8 213 201 +7fc60 4 214 201 +7fc64 4 62 230 +7fc68 4 200 236 +7fc6c 4 200 236 +7fc70 4 200 236 +7fc74 4 199 236 +7fc78 8 200 236 +7fc80 18 199 236 +7fc98 18 200 236 +7fcb0 4 218 201 +7fcb4 18 219 201 +FUNC 7fccc 100 0 std::istreambuf_iterator >::operator++ +7fccc 10 144 215 +7fcdc 4 90 215 +7fce0 c 144 215 +7fcec 10 90 215 +7fcfc 4 229 236 +7fd00 8 148 215 +7fd08 4 229 236 +7fd0c 8 228 236 +7fd14 4 151 215 +7fd18 4 150 215 +7fd1c 4 151 215 +7fd20 4 152 215 +7fd24 4 151 215 +7fd28 4 152 215 +7fd2c 4 151 215 +7fd30 10 152 215 +7fd40 4 228 236 +7fd44 10 229 236 +7fd54 1c 235 236 +7fd70 4 94 215 +7fd74 4 95 215 +7fd78 4 93 215 +7fd7c 8 95 215 +7fd84 24 234 236 +7fda8 24 235 236 +FUNC 7fdcc f4 0 std::istreambuf_iterator >::operator++ +7fdcc 8 144 215 +7fdd4 4 90 215 +7fdd8 c 144 215 +7fde4 4 144 215 +7fde8 c 90 215 +7fdf4 8 229 236 +7fdfc 4 148 215 +7fe00 4 229 236 +7fe04 4 148 215 +7fe08 4 229 236 +7fe0c 8 228 236 +7fe14 4 151 215 +7fe18 4 150 215 +7fe1c 4 151 215 +7fe20 4 152 215 +7fe24 4 151 215 +7fe28 4 152 215 +7fe2c 4 151 215 +7fe30 10 152 215 +7fe40 4 228 236 +7fe44 10 229 236 +7fe54 4 92 215 +7fe58 14 235 236 +7fe6c 4 95 215 +7fe70 4 93 215 +7fe74 4 94 215 +7fe78 8 95 215 +7fe80 24 234 236 +7fea4 1c 235 236 +FUNC 7fec0 1fc 0 std::time_put > >::do_put +7fec0 10 425 242 +7fed0 4 145 212 +7fed4 14 425 242 +7fee8 8 145 212 +7fef0 8 425 242 +7fef8 c 425 242 +7ff04 4 145 212 +7ff08 14 351 219 +7ff1c 4 428 242 +7ff20 4 108 213 +7ff24 4 41 213 +7ff28 4 428 242 +7ff2c 10 108 213 +7ff3c 14 41 213 +7ff50 4 613 237 +7ff54 18 430 242 +7ff6c 4 611 237 +7ff70 4 612 237 +7ff74 4 613 237 +7ff78 4 101 206 +7ff7c 10 430 242 +7ff8c 4 213 201 +7ff90 14 213 201 +7ffa4 10 199 236 +7ffb4 4 215 201 +7ffb8 8 213 201 +7ffc0 4 214 201 +7ffc4 4 62 230 +7ffc8 10 200 236 +7ffd8 14 199 236 +7ffec 8 200 236 +7fff4 4 62 230 +7fff8 8 215 201 +80000 c 213 201 +8000c 14 96 239 +80020 4 97 239 +80024 8 319 202 +8002c 4 97 239 +80030 8 161 202 +80038 4 161 202 +8003c 28 432 242 +80064 8 135 223 +8006c c 213 201 +80078 10 428 242 +80088 8 64 239 +80090 c 96 239 +8009c 4 97 239 +800a0 4 70 213 +800a4 4 97 239 +800a8 4 70 213 +800ac 10 70 213 +FUNC 800bc 49c 0 std::priv::__copy_digits >, char> +800bc 2c 314 224 +800e8 c 314 224 +800f4 4 316 224 +800f8 8 95 215 +80100 4 75 215 +80104 8 90 215 +8010c 4 77 215 +80110 8 90 215 +80118 10 318 224 +80128 14 90 215 +8013c 8 320 224 +80144 4 64 239 +80148 8 74 239 +80150 10 74 239 +80160 c 535 238 +8016c 8 101 206 +80174 4 232 247 +80178 4 68 215 +8017c 4 539 238 +80180 4 229 236 +80184 4 539 238 +80188 4 229 236 +8018c 4 539 238 +80190 8 229 236 +80198 8 228 236 +801a0 4 69 215 +801a4 8 322 224 +801ac 14 235 236 +801c0 4 95 215 +801c4 c 318 224 +801d0 20 328 224 +801f0 14 235 236 +80204 4 93 215 +80208 4 94 215 +8020c 8 95 215 +80214 14 234 236 +80228 4 95 215 +8022c 8 234 236 +80234 4 92 215 +80238 1c 235 236 +80254 4 93 215 +80258 4 94 215 +8025c 8 95 215 +80264 4 228 236 +80268 10 229 236 +80278 4 400 238 +8027c 14 304 238 +80290 4 306 238 +80294 10 307 238 +802a4 4 64 213 +802a8 4 67 213 +802ac 4 64 213 +802b0 58 86 244 +80308 20 146 206 +80328 4 86 244 +8032c 4 146 206 +80330 10 86 244 +80340 4 146 206 +80344 c 86 244 +80350 4 146 206 +80354 c 86 244 +80360 4 146 206 +80364 c 86 244 +80370 4 146 206 +80374 c 86 244 +80380 4 146 206 +80384 c 86 244 +80390 4 146 206 +80394 c 86 244 +803a0 4 146 206 +803a4 c 86 244 +803b0 4 146 206 +803b4 c 86 244 +803c0 4 146 206 +803c4 c 86 244 +803d0 4 146 206 +803d4 c 86 244 +803e0 4 146 206 +803e4 c 86 244 +803f0 4 146 206 +803f4 c 86 244 +80400 4 146 206 +80404 8 86 244 +8040c 8 146 206 +80414 4 101 206 +80418 4 64 239 +8041c c 96 239 +80428 8 97 239 +80430 8 319 202 +80438 8 97 239 +80440 8 161 202 +80448 8 161 202 +80450 4 175 237 +80454 4 164 239 +80458 4 160 239 +8045c 8 165 239 +80464 14 74 239 +80478 4 308 238 +8047c 18 134 223 +80494 10 86 244 +804a4 3c 234 236 +804e0 8 86 244 +804e8 8 146 206 +804f0 c 86 244 +804fc c 135 223 +80508 4 235 236 +8050c 4 95 215 +80510 44 235 236 +80554 4 305 238 +FUNC 80558 68 0 std::_release_facet +80558 c 44 187 +80564 4 45 187 +80568 4 44 187 +8056c 4 45 187 +80570 10 347 241 +80580 4 475 241 +80584 4 349 241 +80588 8 475 241 +80590 4 349 241 +80594 4 45 187 +80598 8 46 187 +805a0 c 46 187 +805ac 4 47 187 +805b0 10 49 187 +FUNC 805c0 a0 0 std::_Locale_impl::Init::_M_count +805c0 c 69 187 +805cc 4 70 187 +805d0 4 69 187 +805d4 14 70 187 +805e8 4 71 187 +805ec 10 72 187 +805fc 8 70 187 +80604 4 457 241 +80608 8 340 241 +80610 4 457 241 +80614 4 340 241 +80618 8 70 187 +80620 18 70 187 +80638 4 72 187 +8063c 4 71 187 +80640 10 72 187 +80650 10 70 187 +FUNC 80660 4 0 std::_Locale_impl::_S_uninitialize +80660 4 113 187 +FUNC 80664 5c 0 std::_Locale_impl::Init::~Init +80664 10 63 187 +80674 8 64 187 +8067c c 347 241 +80688 4 475 241 +8068c 4 349 241 +80690 8 475 241 +80698 4 349 241 +8069c 4 64 187 +806a0 1c 67 187 +806bc 4 65 187 +FUNC 806c0 120 0 std::_Locale_impl::~_Locale_impl +806c0 10 92 187 +806d0 8 93 187 +806d8 4 92 187 +806dc c 93 187 +806e8 8 60 199 +806f0 8 61 199 +806f8 4 60 199 +806fc c 60 199 +80708 4 87 246 +8070c 4 88 246 +80710 4 135 223 +80714 4 88 246 +80718 8 161 202 +80720 4 161 202 +80724 8 64 239 +8072c c 96 239 +80738 8 97 239 +80740 8 161 202 +80748 4 161 202 +8074c 4 342 241 +80750 c 95 187 +8075c 4 342 241 +80760 4 135 223 +80764 4 342 241 +80768 c 95 187 +80774 4 342 241 +80778 c 135 223 +80784 14 342 241 +80798 8 64 239 +807a0 c 96 239 +807ac 18 97 239 +807c4 4 87 246 +807c8 18 88 246 +FUNC 807e0 34 0 std::_Locale_impl::_M_throw_bad_cast +807e0 4 116 187 +807e4 4 117 187 +807e8 8 116 187 +807f0 8 117 187 +807f8 4 117 187 +807fc 18 117 187 +FUNC 80814 40 0 std::_get_Locale_impl +80814 c 696 187 +80820 4 347 241 +80824 4 696 187 +80828 8 347 241 +80830 4 471 241 +80834 4 349 241 +80838 8 471 241 +80840 4 349 241 +80844 10 700 187 +FUNC 80854 84 0 std::_release_Locale_impl +80854 c 703 187 +80860 4 705 187 +80864 4 703 187 +80868 4 347 241 +8086c 4 703 187 +80870 8 347 241 +80878 4 475 241 +8087c 4 349 241 +80880 8 475 241 +80888 4 349 241 +8088c 4 705 187 +80890 4 109 188 +80894 4 706 187 +80898 8 109 188 +808a0 8 706 187 +808a8 4 707 187 +808ac 8 707 187 +808b4 8 707 187 +808bc 4 710 187 +808c0 10 712 187 +808d0 8 709 187 +FUNC 808d8 c 0 std::priv::_GetFacetId +808d8 4 745 187 +808dc 8 745 187 +FUNC 808e4 158 0 std::vector >::reserve +808e4 c 62 245 +808f0 8 199 246 +808f8 4 62 245 +808fc 4 199 246 +80900 4 62 245 +80904 c 63 245 +80910 14 64 245 +80924 4 192 246 +80928 4 70 245 +8092c 4 346 202 +80930 8 347 202 +80938 8 158 202 +80940 8 134 223 +80948 4 352 202 +8094c 4 107 244 +80950 8 352 202 +80958 4 107 244 +8095c 14 106 244 +80970 8 657 246 +80978 4 319 202 +8097c 8 161 202 +80984 8 161 202 +8098c 4 76 245 +80990 4 666 246 +80994 4 667 246 +80998 4 668 246 +8099c 14 78 245 +809b0 10 158 202 +809c0 c 107 244 +809cc 8 356 202 +809d4 8 135 223 +809dc 4 346 202 +809e0 4 356 202 +809e4 4 346 202 +809e8 8 347 202 +809f0 8 158 202 +809f8 c 158 202 +80a04 10 352 202 +80a14 c 134 223 +80a20 8 107 244 +80a28 8 356 202 +80a30 c 41 245 +FUNC 80a3c 1b8 0 std::priv::_Time_Info_Base::~_Time_Info_Base +80a3c 4 63 243 +80a40 4 64 239 +80a44 8 63 243 +80a4c 4 63 243 +80a50 4 64 239 +80a54 c 96 239 +80a60 8 97 239 +80a68 8 161 202 +80a70 4 161 202 +80a74 8 64 239 +80a7c c 96 239 +80a88 8 97 239 +80a90 8 161 202 +80a98 4 161 202 +80a9c 8 64 239 +80aa4 c 96 239 +80ab0 8 97 239 +80ab8 8 161 202 +80ac0 4 161 202 +80ac4 8 64 239 +80acc c 96 239 +80ad8 8 97 239 +80ae0 8 161 202 +80ae8 4 161 202 +80aec 4 64 239 +80af0 c 96 239 +80afc 8 97 239 +80b04 8 161 202 +80b0c 8 63 243 +80b14 4 161 202 +80b18 c 63 243 +80b24 20 135 223 +80b44 8 63 243 +80b4c 4 135 223 +80b50 c 64 239 +80b5c c 96 239 +80b68 10 97 239 +80b78 8 64 239 +80b80 c 96 239 +80b8c c 97 239 +80b98 8 64 239 +80ba0 c 96 239 +80bac c 97 239 +80bb8 4 64 239 +80bbc c 96 239 +80bc8 2c 97 239 +FUNC 80bf4 18c 0 std::priv::_Time_Info::~_Time_Info +80bf4 10 72 243 +80c04 8 72 243 +80c0c 4 72 243 +80c10 8 72 243 +80c18 4 161 202 +80c1c 8 72 243 +80c24 4 72 243 +80c28 4 64 239 +80c2c c 96 239 +80c38 8 97 239 +80c40 8 161 202 +80c48 4 135 223 +80c4c 8 72 243 +80c54 c 72 243 +80c60 4 161 202 +80c64 8 72 243 +80c6c 4 72 243 +80c70 4 64 239 +80c74 c 96 239 +80c80 8 97 239 +80c88 8 161 202 +80c90 4 135 223 +80c94 8 72 243 +80c9c c 72 243 +80ca8 4 161 202 +80cac 8 72 243 +80cb4 4 72 243 +80cb8 4 64 239 +80cbc c 96 239 +80cc8 8 97 239 +80cd0 8 161 202 +80cd8 4 135 223 +80cdc 8 72 243 +80ce4 4 72 243 +80ce8 c 72 243 +80cf4 4 72 243 +80cf8 c 72 243 +80d04 4 72 243 +80d08 4 64 239 +80d0c c 96 239 +80d18 c 97 239 +80d24 c 72 243 +80d30 8 72 243 +80d38 4 72 243 +80d3c 4 64 239 +80d40 c 96 239 +80d4c c 97 239 +80d58 8 72 243 +80d60 20 72 243 +FUNC 80d80 44 0 std::time_put > >::~time_put +80d80 10 273 243 +80d90 c 273 243 +80d9c 4 101 243 +80da0 4 273 243 +80da4 8 273 243 +80dac 8 273 243 +80db4 10 273 243 +FUNC 80dc4 4c 0 std::time_put > >::~time_put +80dc4 10 273 243 +80dd4 c 273 243 +80de0 4 101 243 +80de4 8 273 243 +80dec 4 273 243 +80df0 8 273 243 +80df8 8 273 243 +80e00 10 273 243 +FUNC 80e10 44 0 std::time_get > >::~time_get +80e10 10 166 243 +80e20 c 166 243 +80e2c 4 101 243 +80e30 4 166 243 +80e34 8 166 243 +80e3c 8 166 243 +80e44 10 166 243 +FUNC 80e54 4c 0 std::time_get > >::~time_get +80e54 10 166 243 +80e64 c 166 243 +80e70 4 101 243 +80e74 8 166 243 +80e7c 4 166 243 +80e80 8 166 243 +80e88 8 166 243 +80e90 10 166 243 +FUNC 80ea0 1a0 0 std::priv::_WTime_Info::~_WTime_Info +80ea0 14 80 243 +80eb4 8 80 243 +80ebc 4 80 243 +80ec0 8 80 243 +80ec8 4 161 202 +80ecc 8 80 243 +80ed4 4 80 243 +80ed8 4 64 239 +80edc c 96 239 +80ee8 8 97 239 +80ef0 8 161 202 +80ef8 4 135 223 +80efc 8 80 243 +80f04 c 80 243 +80f10 4 161 202 +80f14 8 80 243 +80f1c 4 80 243 +80f20 4 64 239 +80f24 c 96 239 +80f30 8 97 239 +80f38 8 161 202 +80f40 4 135 223 +80f44 8 80 243 +80f4c c 80 243 +80f58 4 161 202 +80f5c 8 80 243 +80f64 4 80 243 +80f68 4 64 239 +80f6c c 96 239 +80f78 8 97 239 +80f80 8 161 202 +80f88 4 135 223 +80f8c 8 80 243 +80f94 4 80 243 +80f98 c 80 243 +80fa4 4 80 243 +80fa8 c 80 243 +80fb4 4 80 243 +80fb8 4 64 239 +80fbc c 96 239 +80fc8 14 97 239 +80fdc c 80 243 +80fe8 8 80 243 +80ff0 4 80 243 +80ff4 4 64 239 +80ff8 c 96 239 +81004 14 97 239 +81018 8 80 243 +81020 20 80 243 +FUNC 81040 44 0 std::time_put > >::~time_put +81040 10 273 243 +81050 c 273 243 +8105c 4 115 243 +81060 4 273 243 +81064 8 273 243 +8106c 8 273 243 +81074 10 273 243 +FUNC 81084 4c 0 std::time_put > >::~time_put +81084 10 273 243 +81094 c 273 243 +810a0 4 115 243 +810a4 8 273 243 +810ac 4 273 243 +810b0 8 273 243 +810b8 8 273 243 +810c0 10 273 243 +FUNC 810d0 44 0 std::time_get > >::~time_get +810d0 10 166 243 +810e0 c 166 243 +810ec 4 115 243 +810f0 4 166 243 +810f4 8 166 243 +810fc 8 166 243 +81104 10 166 243 +FUNC 81114 4c 0 std::time_get > >::~time_get +81114 10 166 243 +81124 c 166 243 +81130 4 115 243 +81134 8 166 243 +8113c 4 166 243 +81140 8 166 243 +81148 8 166 243 +81150 10 166 243 +FUNC 81160 e0 0 std::_Locale_impl::_Locale_impl +81160 c 74 187 +8116c 4 457 241 +81170 8 74 187 +81178 4 74 187 +8117c 4 340 241 +81180 4 457 241 +81184 4 75 187 +81188 4 74 187 +8118c 8 340 241 +81194 10 75 187 +811a4 8 67 246 +811ac 8 76 187 +811b4 4 67 246 +811b8 4 481 202 +811bc 18 76 187 +811d4 18 78 187 +811ec 18 342 241 +81204 4 87 246 +81208 14 88 246 +8121c 4 64 239 +81220 c 96 239 +8122c 14 97 239 +FUNC 81240 810 0 std::_Locale_impl::make_classic_locale +81240 4 623 187 +81244 4 628 187 +81248 8 623 187 +81250 c 628 187 +8125c 8 623 187 +81264 4 628 187 +81268 54 661 187 +812bc 4 457 241 +812c0 8 340 241 +812c8 4 457 241 +812cc 4 340 241 +812d0 4 48 205 +812d4 4 661 187 +812d8 4 661 187 +812dc c 48 205 +812e8 8 661 187 +812f0 10 633 187 +81300 4 661 187 +81304 4 661 187 +81308 8 661 187 +81310 4 457 241 +81314 8 340 241 +8131c 4 457 241 +81320 4 340 241 +81324 4 180 204 +81328 4 661 187 +8132c 4 661 187 +81330 c 180 204 +8133c 8 661 187 +81344 8 635 187 +8134c 4 661 187 +81350 4 661 187 +81354 8 661 187 +8135c 8 636 187 +81364 4 661 187 +81368 4 661 187 +8136c 8 661 187 +81374 4 457 241 +81378 8 340 241 +81380 4 457 241 +81384 4 340 241 +81388 4 54 228 +8138c 4 661 187 +81390 4 661 187 +81394 c 54 228 +813a0 8 661 187 +813a8 8 638 187 +813b0 4 661 187 +813b4 4 661 187 +813b8 8 661 187 +813c0 4 457 241 +813c4 8 340 241 +813cc 4 457 241 +813d0 4 340 241 +813d4 4 60 222 +813d8 4 661 187 +813dc 8 60 222 +813e4 4 661 187 +813e8 8 661 187 +813f0 4 457 241 +813f4 8 340 241 +813fc 4 457 241 +81400 4 340 241 +81404 4 394 222 +81408 4 661 187 +8140c 8 394 222 +81414 4 661 187 +81418 8 661 187 +81420 4 457 241 +81424 8 340 241 +8142c 4 457 241 +81430 4 340 241 +81434 4 61 225 +81438 4 661 187 +8143c 8 61 225 +81444 4 661 187 +81448 8 661 187 +81450 4 457 241 +81454 8 340 241 +8145c 4 457 241 +81460 4 340 241 +81464 4 57 227 +81468 4 661 187 +8146c 8 57 227 +81474 4 661 187 +81478 8 661 187 +81480 4 457 241 +81484 8 340 241 +8148c 4 457 241 +81490 4 340 241 +81494 14 86 219 +814a8 4 136 243 +814ac 4 136 243 +814b0 4 661 187 +814b4 8 136 243 +814bc 4 661 187 +814c0 8 661 187 +814c8 4 457 241 +814cc 8 340 241 +814d4 4 457 241 +814d8 4 340 241 +814dc 10 86 219 +814ec 4 253 243 +814f0 4 253 243 +814f4 4 661 187 +814f8 8 253 243 +81500 4 661 187 +81504 8 661 187 +8150c 4 457 241 +81510 8 340 241 +81518 4 457 241 +8151c 4 340 241 +81520 4 84 205 +81524 4 661 187 +81528 4 661 187 +8152c c 84 205 +81538 8 661 187 +81540 4 457 241 +81544 8 340 241 +8154c 4 457 241 +81550 4 340 241 +81554 4 181 207 +81558 4 661 187 +8155c 4 661 187 +81560 c 181 207 +8156c 8 661 187 +81574 4 457 241 +81578 8 340 241 +81580 4 457 241 +81584 4 340 241 +81588 4 277 204 +8158c 4 661 187 +81590 4 661 187 +81594 c 277 204 +815a0 8 661 187 +815a8 8 649 187 +815b0 4 661 187 +815b4 4 661 187 +815b8 8 661 187 +815c0 8 650 187 +815c8 4 661 187 +815cc 4 661 187 +815d0 8 661 187 +815d8 4 457 241 +815dc 8 340 241 +815e4 4 457 241 +815e8 4 340 241 +815ec 4 83 228 +815f0 4 661 187 +815f4 4 661 187 +815f8 c 83 228 +81604 8 661 187 +8160c 8 652 187 +81614 4 661 187 +81618 4 661 187 +8161c 8 661 187 +81624 4 457 241 +81628 8 340 241 +81630 4 457 241 +81634 4 340 241 +81638 4 60 222 +8163c 4 661 187 +81640 8 60 222 +81648 4 661 187 +8164c 8 661 187 +81654 4 457 241 +81658 8 340 241 +81660 4 457 241 +81664 4 340 241 +81668 4 394 222 +8166c 4 661 187 +81670 8 394 222 +81678 4 661 187 +8167c 8 661 187 +81684 4 457 241 +81688 8 340 241 +81690 4 457 241 +81694 4 340 241 +81698 4 61 225 +8169c 4 661 187 +816a0 8 61 225 +816a8 4 661 187 +816ac 8 661 187 +816b4 4 457 241 +816b8 8 340 241 +816c0 4 457 241 +816c4 4 340 241 +816c8 4 57 227 +816cc 4 661 187 +816d0 8 57 227 +816d8 4 661 187 +816dc 8 661 187 +816e4 4 457 241 +816e8 8 340 241 +816f0 4 457 241 +816f4 4 340 241 +816f8 10 86 219 +81708 4 136 243 +8170c 4 136 243 +81710 4 661 187 +81714 8 136 243 +8171c 4 661 187 +81720 8 661 187 +81728 4 457 241 +8172c 8 340 241 +81734 4 457 241 +81738 4 340 241 +8173c 10 86 219 +8174c 4 253 243 +81750 4 253 243 +81754 4 664 187 +81758 4 253 243 +8175c 4 664 187 +81760 4 253 243 +81764 4 664 187 +81768 8 661 187 +81770 8 664 187 +81778 8 199 246 +81780 c 326 246 +8178c 4 192 246 +81790 8 332 246 +81798 4 510 217 +8179c c 224 201 +817a8 c 107 244 +817b4 14 106 244 +817c8 4 107 244 +817cc 8 341 246 +817d4 14 667 187 +817e8 4 670 187 +817ec 8 668 187 +817f4 8 670 187 +817fc 8 668 187 +81804 4 670 187 +81808 8 671 187 +81810 8 672 187 +81818 4 671 187 +8181c c 672 187 +81828 4 224 201 +8182c 4 667 187 +81830 8 224 201 +81838 4 224 201 +8183c 4 667 187 +81840 4 335 246 +81844 c 667 187 +81850 8 667 187 +81858 c 667 187 +81864 8 667 187 +8186c 1c 667 187 +81888 8 670 187 +81890 c 670 187 +8189c 8 670 187 +818a4 10 670 187 +818b4 4 671 187 +818b8 8 670 187 +818c0 4 672 187 +818c4 4 671 187 +818c8 4 672 187 +818cc 4 671 187 +818d0 c 672 187 +818dc 10 347 202 +818ec 4 158 202 +818f0 4 352 202 +818f4 8 106 244 +818fc 4 158 202 +81900 4 352 202 +81904 8 106 244 +8190c 8 657 246 +81914 4 319 202 +81918 8 161 202 +81920 4 161 202 +81924 4 666 246 +81928 8 330 246 +81930 4 666 246 +81934 4 667 246 +81938 8 668 246 +81940 8 107 244 +81948 10 224 201 +81958 c 135 223 +81964 14 670 187 +81978 8 253 243 +81980 1c 658 187 +8199c 40 136 243 +819dc 14 253 243 +819f0 14 136 243 +81a04 3c 633 187 +81a40 10 667 187 +FUNC 81a50 94 0 std::_Locale_impl::_S_initialize +81a50 c 575 187 +81a5c c 576 187 +81a68 c 577 187 +81a74 c 578 187 +81a80 c 579 187 +81a8c c 580 187 +81a98 c 583 187 +81aa4 c 584 187 +81ab0 c 585 187 +81abc c 586 187 +81ac8 c 587 187 +81ad4 c 588 187 +81ae0 4 102 187 +FUNC 81ae4 60 0 std::_Locale_impl::Init::Init +81ae4 10 57 187 +81af4 8 58 187 +81afc c 347 241 +81b08 4 471 241 +81b0c 4 349 241 +81b10 8 471 241 +81b18 4 349 241 +81b1c 8 58 187 +81b24 1c 61 187 +81b40 4 59 187 +FUNC 81b44 8c 0 std::_Stl_get_global_locale +81b44 c 603 187 +81b50 10 604 187 +81b60 4 605 187 +81b64 8 606 187 +81b6c 4 605 187 +81b70 4 606 187 +81b74 8 604 187 +81b7c c 604 187 +81b88 8 604 187 +81b90 18 604 187 +81ba8 4 605 187 +81bac 8 606 187 +81bb4 4 605 187 +81bb8 8 606 187 +81bc0 10 604 187 +FUNC 81bd0 214 0 std::priv::__get_decimal_integer +81bd0 c 239 224 +81bdc 4 190 224 +81be0 4 239 224 +81be4 4 190 224 +81be8 8 239 224 +81bf0 4 120 239 +81bf4 8 239 224 +81bfc 4 101 206 +81c00 4 190 224 +81c04 4 120 239 +81c08 4 481 202 +81c0c 4 190 224 +81c10 4 192 224 +81c14 8 52 224 +81c1c 4 223 224 +81c20 20 243 224 +81c40 1c 52 224 +81c5c 8 52 224 +81c64 8 202 224 +81c6c 4 208 224 +81c70 4 205 224 +81c74 14 208 224 +81c88 38 211 224 +81cc0 18 212 224 +81cd8 4 213 224 +81cdc 8 213 224 +81ce4 4 214 224 +81ce8 4 213 224 +81cec 4 214 224 +81cf0 c 213 224 +81cfc c 190 224 +81d08 c 190 224 +81d14 4 192 224 +81d18 8 52 224 +81d20 c 224 224 +81d2c c 224 224 +81d38 18 224 224 +81d50 4 96 239 +81d54 4 97 239 +81d58 4 319 202 +81d5c 4 97 239 +81d60 8 161 202 +81d68 4 161 202 +81d6c 20 243 224 +81d8c 8 209 224 +81d94 c 214 224 +81da0 8 135 223 +81da8 10 223 224 +81db8 8 64 239 +81dc0 c 96 239 +81dcc 18 97 239 +FUNC 81e30 214 0 std::priv::__get_decimal_integer +81e30 c 239 224 +81e3c 4 190 224 +81e40 4 239 224 +81e44 4 190 224 +81e48 8 239 224 +81e50 4 120 239 +81e54 8 239 224 +81e5c 4 101 206 +81e60 4 190 224 +81e64 4 120 239 +81e68 4 481 202 +81e6c 4 190 224 +81e70 4 200 224 +81e74 8 52 224 +81e7c 4 223 224 +81e80 20 243 224 +81ea0 1c 52 224 +81ebc 8 52 224 +81ec4 8 202 224 +81ecc 4 208 224 +81ed0 4 205 224 +81ed4 14 208 224 +81ee8 38 211 224 +81f20 18 212 224 +81f38 4 213 224 +81f3c 8 213 224 +81f44 4 214 224 +81f48 4 213 224 +81f4c 4 214 224 +81f50 c 213 224 +81f5c c 190 224 +81f68 c 190 224 +81f74 4 200 224 +81f78 8 52 224 +81f80 c 224 224 +81f8c c 224 224 +81f98 18 224 224 +81fb0 4 96 239 +81fb4 4 97 239 +81fb8 4 319 202 +81fbc 4 97 239 +81fc0 8 161 202 +81fc8 4 161 202 +81fcc 20 243 224 +81fec 8 209 224 +81ff4 c 214 224 +82000 8 135 223 +82008 10 223 224 +82018 8 64 239 +82020 c 96 239 +8202c 18 97 239 +FUNC 82090 2c0 0 std::priv::__get_decimal_integer >, int, wchar_t> +82090 14 239 224 +820a4 4 182 224 +820a8 10 239 224 +820b8 4 120 239 +820bc 4 239 224 +820c0 8 239 224 +820c8 4 120 239 +820cc 4 181 224 +820d0 4 481 202 +820d4 8 101 206 +820dc 8 95 215 +820e4 4 75 215 +820e8 8 90 215 +820f0 8 77 215 +820f8 c 90 215 +82104 c 190 224 +82110 c 90 215 +8211c 8 52 224 +82124 4 223 224 +82128 c 224 224 +82134 4 224 224 +82138 4 233 224 +8213c 4 64 239 +82140 c 233 224 +8214c c 96 239 +82158 c 97 239 +82164 20 243 224 +82184 1c 235 236 +821a0 4 93 215 +821a4 4 94 215 +821a8 8 95 215 +821b0 8 52 224 +821b8 8 202 224 +821c0 4 208 224 +821c4 4 205 224 +821c8 c 208 224 +821d4 8 211 224 +821dc 4 212 224 +821e0 4 213 224 +821e4 4 214 224 +821e8 8 213 224 +821f0 4 68 215 +821f4 10 229 236 +82204 c 228 236 +82210 8 69 215 +82218 4 92 215 +8221c 1c 235 236 +82238 4 93 215 +8223c 4 94 215 +82240 8 95 215 +82248 4 228 236 +8224c c 229 236 +82258 8 69 215 +82260 1c 235 236 +8227c 4 93 215 +82280 4 94 215 +82284 8 95 215 +8228c 8 209 224 +82294 8 214 224 +8229c 54 234 236 +822f0 34 235 236 +82324 8 64 239 +8232c c 96 239 +82338 18 97 239 +FUNC 82350 290 0 std::time_get > >::do_get_year +82350 8 348 242 +82358 8 348 242 +82360 4 75 215 +82364 8 90 215 +8236c 8 77 215 +82374 c 90 215 +82380 c 351 242 +8238c 8 352 242 +82394 4 353 242 +82398 8 363 242 +823a0 1c 235 236 +823bc 4 93 215 +823c0 8 95 215 +823c8 4 351 242 +823cc 4 94 215 +823d0 8 351 242 +823d8 1c 356 242 +823f4 4 357 242 +823f8 4 356 242 +823fc 4 358 242 +82400 4 358 242 +82404 4 75 215 +82408 c 357 242 +82414 8 358 242 +8241c 4 358 242 +82420 4 75 215 +82424 8 90 215 +8242c 8 77 215 +82434 c 90 215 +82440 c 359 242 +8244c c 360 242 +82458 4 362 242 +8245c 8 363 242 +82464 1c 235 236 +82480 4 93 215 +82484 4 95 215 +82488 4 94 215 +8248c 8 95 215 +82494 20 235 236 +824b4 48 234 236 +824fc 1c 235 236 +82518 4 93 215 +8251c 4 95 215 +82520 4 94 215 +82524 8 95 215 +8252c 20 234 236 +8254c 14 235 236 +82560 2c 234 236 +8258c 54 235 236 +FUNC 825e0 2bc 0 std::priv::__get_decimal_integer >, int, char> +825e0 14 239 224 +825f4 4 182 224 +825f8 18 239 224 +82610 4 181 224 +82614 4 120 239 +82618 4 239 224 +8261c 4 120 239 +82620 4 481 202 +82624 8 101 206 +8262c 8 95 215 +82634 4 75 215 +82638 8 90 215 +82640 8 77 215 +82648 c 90 215 +82654 c 190 224 +82660 c 90 215 +8266c 8 52 224 +82674 4 223 224 +82678 c 224 224 +82684 4 224 224 +82688 4 233 224 +8268c 4 64 239 +82690 c 233 224 +8269c c 96 239 +826a8 c 97 239 +826b4 20 243 224 +826d4 14 235 236 +826e8 4 93 215 +826ec 4 94 215 +826f0 8 95 215 +826f8 8 52 224 +82700 8 202 224 +82708 4 208 224 +8270c 4 205 224 +82710 c 208 224 +8271c 8 211 224 +82724 4 212 224 +82728 4 213 224 +8272c 4 214 224 +82730 8 213 224 +82738 4 68 215 +8273c 10 229 236 +8274c 8 228 236 +82754 8 69 215 +8275c 4 92 215 +82760 18 235 236 +82778 4 93 215 +8277c 4 94 215 +82780 8 95 215 +82788 4 228 236 +8278c c 229 236 +82798 8 69 215 +827a0 14 235 236 +827b4 4 93 215 +827b8 4 94 215 +827bc 8 95 215 +827c4 8 209 224 +827cc 8 214 224 +827d4 58 234 236 +8282c 44 235 236 +82870 8 64 239 +82878 c 96 239 +82884 18 97 239 +FUNC 8289c 274 0 std::time_get > >::do_get_year +8289c 8 348 242 +828a4 8 348 242 +828ac 4 75 215 +828b0 8 90 215 +828b8 8 77 215 +828c0 c 90 215 +828cc c 351 242 +828d8 8 352 242 +828e0 4 353 242 +828e4 8 363 242 +828ec 14 235 236 +82900 4 93 215 +82904 8 95 215 +8290c 4 351 242 +82910 4 94 215 +82914 8 351 242 +8291c 1c 356 242 +82938 4 357 242 +8293c 4 356 242 +82940 4 358 242 +82944 4 358 242 +82948 4 75 215 +8294c c 357 242 +82958 8 358 242 +82960 4 358 242 +82964 4 75 215 +82968 8 90 215 +82970 8 77 215 +82978 c 90 215 +82984 c 359 242 +82990 c 360 242 +8299c 4 362 242 +829a0 8 363 242 +829a8 14 235 236 +829bc 4 93 215 +829c0 4 95 215 +829c4 4 94 215 +829c8 8 95 215 +829d0 10 235 236 +829e0 20 234 236 +82a00 14 235 236 +82a14 48 234 236 +82a5c 14 235 236 +82a70 4 93 215 +82a74 4 95 215 +82a78 4 94 215 +82a7c 8 95 215 +82a84 2c 234 236 +82ab0 60 235 236 +FUNC 82b10 3e0 0 std::priv::__do_put_bool > > +82b10 c 386 226 +82b1c 4 145 212 +82b20 14 386 226 +82b34 8 145 212 +82b3c 4 386 226 +82b40 8 386 226 +82b48 4 145 212 +82b4c 14 351 219 +82b60 8 387 226 +82b68 c 88 228 +82b74 4 389 226 +82b78 10 88 228 +82b88 4 138 212 +82b8c 4 400 238 +82b90 4 139 212 +82b94 4 400 238 +82b98 8 392 226 +82ba0 4 396 226 +82ba4 4 395 226 +82ba8 4 396 226 +82bac 8 398 226 +82bb4 10 480 201 +82bc4 4 62 230 +82bc8 10 200 236 +82bd8 c 199 236 +82be4 4 200 236 +82be8 8 62 230 +82bf0 1c 480 201 +82c0c 18 213 201 +82c24 c 199 236 +82c30 4 200 236 +82c34 8 62 230 +82c3c 4 215 201 +82c40 8 213 201 +82c48 4 214 201 +82c4c 4 62 230 +82c50 10 200 236 +82c60 14 199 236 +82c74 c 200 236 +82c80 14 199 236 +82c94 1c 200 236 +82cb0 c 96 239 +82cbc 8 97 239 +82cc4 8 161 202 +82ccc 4 161 202 +82cd0 20 407 226 +82cf0 10 89 228 +82d00 4 138 212 +82d04 4 400 238 +82d08 4 139 212 +82d0c 4 400 238 +82d10 8 392 226 +82d18 14 213 201 +82d2c c 199 236 +82d38 4 200 236 +82d3c 8 62 230 +82d44 4 215 201 +82d48 8 213 201 +82d50 4 214 201 +82d54 4 62 230 +82d58 10 200 236 +82d68 14 199 236 +82d7c c 200 236 +82d88 4 135 223 +82d8c 20 407 226 +82dac 14 213 201 +82dc0 c 199 236 +82dcc 4 200 236 +82dd0 8 62 230 +82dd8 4 215 201 +82ddc 8 213 201 +82de4 4 214 201 +82de8 4 62 230 +82dec 10 200 236 +82dfc 14 199 236 +82e10 c 200 236 +82e1c 10 480 201 +82e2c 4 62 230 +82e30 10 200 236 +82e40 c 199 236 +82e4c 4 200 236 +82e50 8 62 230 +82e58 18 480 201 +82e70 14 199 236 +82e84 10 200 236 +82e94 8 213 201 +82e9c 8 480 201 +82ea4 8 213 201 +82eac 8 64 239 +82eb4 c 96 239 +82ec0 20 97 239 +82ee0 10 387 226 +FUNC 82ef0 4c 0 std::num_put > >::do_put +82ef0 c 420 226 +82efc 8 422 226 +82f04 18 426 226 +82f1c 8 427 226 +82f24 10 424 226 +82f34 8 427 226 +FUNC 82f3c 80 0 std::ostreambuf_iterator >::operator= +82f3c c 61 230 +82f48 8 61 230 +82f50 8 62 230 +82f58 4 63 230 +82f5c 10 200 236 +82f6c c 199 236 +82f78 8 62 230 +82f80 4 62 230 +82f84 10 65 230 +82f94 4 199 236 +82f98 4 62 230 +82f9c 14 199 236 +82fb0 c 200 236 +FUNC 82fbc 3d8 0 std::priv::__do_put_bool > > +82fbc c 386 226 +82fc8 4 145 212 +82fcc 14 386 226 +82fe0 8 145 212 +82fe8 4 386 226 +82fec 8 386 226 +82ff4 4 145 212 +82ff8 14 351 219 +8300c 8 387 226 +83014 c 59 228 +83020 4 389 226 +83024 10 59 228 +83034 4 138 212 +83038 4 400 238 +8303c 4 139 212 +83040 8 392 226 +83048 4 396 226 +8304c 4 395 226 +83050 4 396 226 +83054 8 398 226 +8305c 10 480 201 +8306c 4 62 230 +83070 10 200 236 +83080 10 199 236 +83090 18 480 201 +830a8 18 213 201 +830c0 10 199 236 +830d0 4 215 201 +830d4 8 213 201 +830dc 4 214 201 +830e0 4 62 230 +830e4 10 200 236 +830f4 14 199 236 +83108 8 200 236 +83110 4 62 230 +83114 8 215 201 +8311c 14 213 201 +83130 c 96 239 +8313c 8 97 239 +83144 8 161 202 +8314c 4 161 202 +83150 20 407 226 +83170 14 199 236 +83184 c 200 236 +83190 c 62 230 +8319c 10 60 228 +831ac 4 138 212 +831b0 4 400 238 +831b4 4 139 212 +831b8 8 392 226 +831c0 14 213 201 +831d4 10 199 236 +831e4 4 215 201 +831e8 8 213 201 +831f0 4 214 201 +831f4 4 62 230 +831f8 10 200 236 +83208 14 199 236 +8321c 8 200 236 +83224 c 62 230 +83230 4 135 223 +83234 20 407 226 +83254 14 213 201 +83268 10 199 236 +83278 4 215 201 +8327c 8 213 201 +83284 4 214 201 +83288 4 62 230 +8328c 10 200 236 +8329c 14 199 236 +832b0 8 200 236 +832b8 c 62 230 +832c4 10 480 201 +832d4 4 62 230 +832d8 10 200 236 +832e8 10 199 236 +832f8 18 480 201 +83310 14 199 236 +83324 c 200 236 +83330 c 62 230 +8333c 8 213 201 +83344 8 480 201 +8334c 8 213 201 +83354 8 64 239 +8335c c 96 239 +83368 1c 97 239 +83384 10 387 226 +FUNC 83394 50 0 std::num_put > >::do_put +83394 10 420 226 +833a4 8 422 226 +833ac 18 426 226 +833c4 8 427 226 +833cc 10 424 226 +833dc 8 427 226 +FUNC 833e4 8c 0 std::ostreambuf_iterator >::operator= +833e4 c 61 230 +833f0 4 62 230 +833f4 4 61 230 +833f8 4 61 230 +833fc 4 62 230 +83400 4 63 230 +83404 10 200 236 +83414 c 199 236 +83420 4 62 230 +83424 10 65 230 +83434 4 199 236 +83438 4 62 230 +8343c 14 199 236 +83450 4 200 236 +83454 8 62 230 +8345c 4 62 230 +83460 10 65 230 +FUNC 83470 c6c 0 std::priv::__money_do_put >, std::basic_string, std::allocator >, std::basic_string, std::allocator > > +83470 10 316 221 +83480 4 145 212 +83484 1c 316 221 +834a0 4 145 212 +834a4 18 316 221 +834bc 4 316 221 +834c0 c 145 212 +834cc c 316 221 +834d8 4 145 212 +834dc 38 351 219 +83514 4 101 207 +83518 4 351 219 +8351c 68 101 207 +83584 4 336 221 +83588 10 92 222 +83598 4 93 222 +8359c 8 92 222 +835a4 c 93 222 +835b0 8 94 222 +835b8 4 93 222 +835bc 8 94 222 +835c4 4 93 222 +835c8 c 94 222 +835d4 10 98 222 +835e4 4 95 222 +835e8 4 98 222 +835ec 4 95 222 +835f0 1c 135 222 +8360c 8 354 221 +83614 10 360 221 +83624 4 361 221 +83628 4 368 221 +8362c 4 362 221 +83630 4 368 221 +83634 18 97 222 +8364c 4 385 221 +83650 8 387 221 +83658 c 79 207 +83664 4 387 221 +83668 4 390 221 +8366c 4 64 239 +83670 c 96 239 +8367c c 97 239 +83688 8 64 239 +83690 c 96 239 +8369c 10 97 239 +836ac 8 64 239 +836b4 c 96 239 +836c0 10 97 239 +836d0 8 498 221 +836d8 38 499 221 +83710 10 132 222 +83720 4 133 222 +83724 8 132 222 +8372c c 133 222 +83738 8 134 222 +83740 4 133 222 +83744 8 134 222 +8374c 4 133 222 +83750 c 134 222 +8375c 14 138 222 +83770 c 135 222 +8377c 8 368 221 +83784 18 96 222 +8379c 4 385 221 +837a0 c 79 207 +837ac 8 387 221 +837b4 4 388 221 +837b8 8 387 221 +837c0 8 79 207 +837c8 4 387 221 +837cc c 389 221 +837d8 c 108 213 +837e4 4 41 213 +837e8 c 108 213 +837f4 18 41 213 +8380c 4 397 221 +83810 4 611 237 +83814 4 612 237 +83818 4 101 206 +8381c 8 397 221 +83824 8 613 237 +8382c 8 397 221 +83834 8 579 238 +8383c 4 355 217 +83840 4 74 239 +83844 8 472 238 +8384c 8 482 238 +83854 4 232 247 +83858 8 107 244 +83860 10 106 244 +83870 4 101 206 +83874 10 485 238 +83884 1c 399 221 +838a0 4 400 238 +838a4 10 399 221 +838b4 c 413 221 +838c0 4 400 238 +838c4 4 419 221 +838c8 4 400 238 +838cc 4 421 221 +838d0 4 400 238 +838d4 4 416 221 +838d8 4 419 221 +838dc 4 421 221 +838e0 c 419 221 +838ec 10 421 221 +838fc 4 422 221 +83900 10 400 238 +83910 8 423 221 +83918 8 427 221 +83920 4 427 221 +83924 4 100 222 +83928 4 427 221 +8392c c 100 222 +83938 8 427 221 +83940 10 437 221 +83950 8 439 221 +83958 c 443 221 +83964 c 444 221 +83970 10 446 221 +83980 8 579 238 +83988 4 427 221 +8398c 4 140 222 +83990 4 427 221 +83994 c 139 222 +839a0 8 427 221 +839a8 10 437 221 +839b8 c 437 221 +839c4 c 443 221 +839d0 c 448 221 +839dc 8 446 221 +839e4 4 448 221 +839e8 10 448 221 +839f8 1c 480 201 +83a14 4 62 230 +83a18 10 200 236 +83a28 10 199 236 +83a38 8 480 201 +83a40 8 450 221 +83a48 4 480 221 +83a4c 4 444 221 +83a50 c 480 221 +83a5c c 454 221 +83a68 14 480 221 +83a7c 24 454 221 +83aa0 18 136 222 +83ab8 8 385 221 +83ac0 1c 137 222 +83adc 10 140 222 +83aec 10 99 222 +83afc c 456 221 +83b08 10 458 221 +83b18 14 480 201 +83b2c 4 62 230 +83b30 10 200 236 +83b40 10 199 236 +83b50 8 480 201 +83b58 c 459 221 +83b64 8 452 221 +83b6c c 400 238 +83b78 8 492 221 +83b80 8 493 221 +83b88 8 213 201 +83b90 1c 213 201 +83bac 10 199 236 +83bbc 4 215 201 +83bc0 8 213 201 +83bc8 4 214 201 +83bcc 4 62 230 +83bd0 10 200 236 +83be0 14 199 236 +83bf4 8 200 236 +83bfc 4 62 230 +83c00 8 215 201 +83c08 8 213 201 +83c10 8 493 221 +83c18 4 494 221 +83c1c c 494 221 +83c28 18 480 201 +83c40 4 62 230 +83c44 10 200 236 +83c54 10 199 236 +83c64 8 480 201 +83c6c 8 496 221 +83c74 4 64 239 +83c78 4 498 221 +83c7c c 96 239 +83c88 4 97 239 +83c8c 8 70 213 +83c94 10 70 213 +83ca4 c 466 221 +83cb0 10 467 221 +83cc0 8 470 221 +83cc8 10 473 221 +83cd8 c 475 221 +83ce4 c 476 221 +83cf0 18 480 201 +83d08 4 62 230 +83d0c 10 200 236 +83d1c 10 199 236 +83d2c c 480 201 +83d38 8 285 201 +83d40 14 477 221 +83d54 8 285 201 +83d5c c 483 221 +83d68 1c 462 221 +83d84 8 213 201 +83d8c 10 213 201 +83d9c 10 199 236 +83dac 4 215 201 +83db0 8 213 201 +83db8 4 214 201 +83dbc 4 62 230 +83dc0 14 200 236 +83dd4 1c 199 236 +83df0 8 200 236 +83df8 c 62 230 +83e04 18 199 236 +83e1c c 200 236 +83e28 c 62 230 +83e34 14 199 236 +83e48 c 200 236 +83e54 c 62 230 +83e60 14 199 236 +83e74 c 200 236 +83e80 c 62 230 +83e8c 18 199 236 +83ea4 c 200 236 +83eb0 10 62 230 +83ec0 24 285 201 +83ee4 4 480 221 +83ee8 4 482 221 +83eec 4 480 221 +83ef0 c 482 221 +83efc 24 285 201 +83f20 c 355 221 +83f2c 24 285 201 +83f50 10 463 221 +83f60 8 304 238 +83f68 8 306 238 +83f70 8 307 238 +83f78 8 308 238 +83f80 14 134 223 +83f94 8 107 244 +83f9c c 106 244 +83fa8 4 107 244 +83fac c 106 244 +83fb8 4 101 206 +83fbc 4 107 244 +83fc0 4 64 239 +83fc4 c 96 239 +83fd0 8 97 239 +83fd8 8 70 213 +83fe0 8 70 213 +83fe8 4 479 238 +83fec 4 165 239 +83ff0 4 164 239 +83ff4 4 479 238 +83ff8 4 165 239 +83ffc 8 160 239 +84004 4 64 213 +84008 8 67 213 +84010 c 64 213 +8401c 4 64 239 +84020 c 96 239 +8402c c 97 239 +84038 8 64 239 +84040 c 96 239 +8404c 10 97 239 +8405c 8 64 239 +84064 c 96 239 +84070 10 97 239 +84080 18 498 221 +84098 14 305 238 +840ac 8 64 239 +840b4 c 96 239 +840c0 4 97 239 +840c4 4 70 213 +840c8 4 97 239 +840cc 4 70 213 +840d0 c 70 213 +FUNC 840dc 34 0 std::money_put > >::do_put +840dc 4 515 221 +840e0 8 518 221 +840e8 4 515 221 +840ec 18 518 221 +84104 4 518 221 +84108 8 519 221 +FUNC 84110 c6c 0 std::priv::__money_do_put >, std::basic_string, std::allocator >, std::priv::__basic_iostring > +84110 10 316 221 +84120 4 145 212 +84124 1c 316 221 +84140 4 145 212 +84144 18 316 221 +8415c 4 316 221 +84160 c 145 212 +8416c c 316 221 +84178 4 145 212 +8417c 38 351 219 +841b4 4 101 207 +841b8 4 351 219 +841bc 68 101 207 +84224 4 336 221 +84228 10 92 222 +84238 4 93 222 +8423c 8 92 222 +84244 c 93 222 +84250 8 94 222 +84258 4 93 222 +8425c 8 94 222 +84264 4 93 222 +84268 c 94 222 +84274 10 98 222 +84284 4 95 222 +84288 4 98 222 +8428c 4 95 222 +84290 1c 135 222 +842ac 8 354 221 +842b4 10 360 221 +842c4 4 361 221 +842c8 4 368 221 +842cc 4 362 221 +842d0 4 368 221 +842d4 18 97 222 +842ec 4 385 221 +842f0 8 387 221 +842f8 c 79 207 +84304 4 387 221 +84308 4 390 221 +8430c 4 64 239 +84310 c 96 239 +8431c c 97 239 +84328 8 64 239 +84330 c 96 239 +8433c 10 97 239 +8434c 8 64 239 +84354 c 96 239 +84360 10 97 239 +84370 8 498 221 +84378 38 499 221 +843b0 10 132 222 +843c0 4 133 222 +843c4 8 132 222 +843cc c 133 222 +843d8 8 134 222 +843e0 4 133 222 +843e4 8 134 222 +843ec 4 133 222 +843f0 c 134 222 +843fc 14 138 222 +84410 c 135 222 +8441c 8 368 221 +84424 18 96 222 +8443c 4 385 221 +84440 c 79 207 +8444c 8 387 221 +84454 4 388 221 +84458 8 387 221 +84460 8 79 207 +84468 4 387 221 +8446c c 389 221 +84478 c 108 213 +84484 4 41 213 +84488 c 108 213 +84494 18 41 213 +844ac 4 397 221 +844b0 4 611 237 +844b4 4 612 237 +844b8 4 101 206 +844bc 8 397 221 +844c4 8 613 237 +844cc 8 397 221 +844d4 8 579 238 +844dc 4 355 217 +844e0 4 74 239 +844e4 8 472 238 +844ec 8 482 238 +844f4 4 232 247 +844f8 8 107 244 +84500 10 106 244 +84510 4 101 206 +84514 10 485 238 +84524 1c 399 221 +84540 4 400 238 +84544 10 399 221 +84554 c 413 221 +84560 4 400 238 +84564 4 419 221 +84568 4 400 238 +8456c 4 421 221 +84570 4 400 238 +84574 4 416 221 +84578 4 419 221 +8457c 4 421 221 +84580 c 419 221 +8458c 10 421 221 +8459c 4 422 221 +845a0 10 400 238 +845b0 8 423 221 +845b8 8 427 221 +845c0 4 427 221 +845c4 4 100 222 +845c8 4 427 221 +845cc c 100 222 +845d8 8 427 221 +845e0 10 437 221 +845f0 8 439 221 +845f8 c 443 221 +84604 c 444 221 +84610 10 446 221 +84620 8 579 238 +84628 4 427 221 +8462c 4 140 222 +84630 4 427 221 +84634 c 139 222 +84640 8 427 221 +84648 10 437 221 +84658 c 437 221 +84664 c 443 221 +84670 c 448 221 +8467c 8 446 221 +84684 4 448 221 +84688 10 448 221 +84698 1c 480 201 +846b4 4 62 230 +846b8 10 200 236 +846c8 10 199 236 +846d8 8 480 201 +846e0 8 450 221 +846e8 4 480 221 +846ec 4 444 221 +846f0 c 480 221 +846fc c 454 221 +84708 14 480 221 +8471c 24 454 221 +84740 18 136 222 +84758 8 385 221 +84760 1c 137 222 +8477c 10 140 222 +8478c 10 99 222 +8479c c 456 221 +847a8 10 458 221 +847b8 14 480 201 +847cc 4 62 230 +847d0 10 200 236 +847e0 10 199 236 +847f0 8 480 201 +847f8 c 459 221 +84804 8 452 221 +8480c c 400 238 +84818 8 492 221 +84820 8 493 221 +84828 8 213 201 +84830 1c 213 201 +8484c 10 199 236 +8485c 4 215 201 +84860 8 213 201 +84868 4 214 201 +8486c 4 62 230 +84870 10 200 236 +84880 14 199 236 +84894 8 200 236 +8489c 4 62 230 +848a0 8 215 201 +848a8 8 213 201 +848b0 8 493 221 +848b8 4 494 221 +848bc c 494 221 +848c8 18 480 201 +848e0 4 62 230 +848e4 10 200 236 +848f4 10 199 236 +84904 8 480 201 +8490c 8 496 221 +84914 4 64 239 +84918 4 498 221 +8491c c 96 239 +84928 4 97 239 +8492c 8 70 213 +84934 10 70 213 +84944 c 466 221 +84950 10 467 221 +84960 8 470 221 +84968 10 473 221 +84978 c 475 221 +84984 c 476 221 +84990 18 480 201 +849a8 4 62 230 +849ac 10 200 236 +849bc 10 199 236 +849cc c 480 201 +849d8 8 285 201 +849e0 14 477 221 +849f4 8 285 201 +849fc c 483 221 +84a08 1c 462 221 +84a24 8 213 201 +84a2c 10 213 201 +84a3c 10 199 236 +84a4c 4 215 201 +84a50 8 213 201 +84a58 4 214 201 +84a5c 4 62 230 +84a60 14 200 236 +84a74 1c 199 236 +84a90 8 200 236 +84a98 c 62 230 +84aa4 18 199 236 +84abc c 200 236 +84ac8 c 62 230 +84ad4 14 199 236 +84ae8 c 200 236 +84af4 c 62 230 +84b00 14 199 236 +84b14 c 200 236 +84b20 c 62 230 +84b2c 18 199 236 +84b44 c 200 236 +84b50 10 62 230 +84b60 24 285 201 +84b84 4 480 221 +84b88 4 482 221 +84b8c 4 480 221 +84b90 c 482 221 +84b9c 24 285 201 +84bc0 c 355 221 +84bcc 24 285 201 +84bf0 10 463 221 +84c00 8 304 238 +84c08 8 306 238 +84c10 8 307 238 +84c18 8 308 238 +84c20 14 134 223 +84c34 8 107 244 +84c3c c 106 244 +84c48 4 107 244 +84c4c c 106 244 +84c58 4 101 206 +84c5c 4 107 244 +84c60 4 64 239 +84c64 c 96 239 +84c70 8 97 239 +84c78 8 70 213 +84c80 8 70 213 +84c88 4 479 238 +84c8c 4 165 239 +84c90 4 164 239 +84c94 4 479 238 +84c98 4 165 239 +84c9c 8 160 239 +84ca4 4 64 213 +84ca8 8 67 213 +84cb0 c 64 213 +84cbc 4 64 239 +84cc0 c 96 239 +84ccc c 97 239 +84cd8 8 64 239 +84ce0 c 96 239 +84cec 10 97 239 +84cfc 8 64 239 +84d04 c 96 239 +84d10 10 97 239 +84d20 18 498 221 +84d38 14 305 238 +84d4c 8 64 239 +84d54 c 96 239 +84d60 4 97 239 +84d64 4 70 213 +84d68 4 97 239 +84d6c 4 70 213 +84d70 c 70 213 +FUNC 84d7c 138 0 std::money_put > >::do_put +84d7c 10 505 221 +84d8c 4 108 213 +84d90 4 41 213 +84d94 10 505 221 +84da4 c 108 213 +84db0 4 41 213 +84db4 4 505 221 +84db8 10 505 221 +84dc8 4 108 213 +84dcc 10 41 213 +84ddc 4 611 237 +84de0 4 128 226 +84de4 4 613 237 +84de8 4 128 226 +84dec 4 612 237 +84df0 4 613 237 +84df4 4 101 206 +84df8 4 128 226 +84dfc 28 510 221 +84e24 4 64 239 +84e28 4 510 221 +84e2c c 96 239 +84e38 4 97 239 +84e3c 8 319 202 +84e44 4 97 239 +84e48 8 161 202 +84e50 4 161 202 +84e54 24 511 221 +84e78 8 135 223 +84e80 8 64 239 +84e88 c 96 239 +84e94 4 97 239 +84e98 4 70 213 +84e9c 4 97 239 +84ea0 4 70 213 +84ea4 10 70 213 +FUNC 84eb4 38 0 std::priv::_String_base >::_M_deallocate_block +84eb4 4 64 239 +84eb8 c 96 239 +84ec4 4 97 239 +84ec8 8 319 202 +84ed0 4 97 239 +84ed4 4 135 223 +84ed8 8 161 202 +84ee0 4 161 202 +84ee4 4 102 239 +84ee8 4 135 223 +FUNC 84eec 1d4 0 std::time_put > >::do_put +84eec 10 425 242 +84efc 4 145 212 +84f00 8 425 242 +84f08 4 145 212 +84f0c 4 425 242 +84f10 4 145 212 +84f14 10 425 242 +84f24 c 425 242 +84f30 4 145 212 +84f34 14 351 219 +84f48 4 428 242 +84f4c 4 108 213 +84f50 4 41 213 +84f54 4 428 242 +84f58 10 108 213 +84f68 14 41 213 +84f7c 4 613 237 +84f80 18 430 242 +84f98 4 611 237 +84f9c 4 612 237 +84fa0 4 613 237 +84fa4 4 101 206 +84fa8 10 430 242 +84fb8 4 213 201 +84fbc 14 213 201 +84fd0 c 199 236 +84fdc 4 200 236 +84fe0 8 62 230 +84fe8 4 215 201 +84fec 8 213 201 +84ff4 4 214 201 +84ff8 4 62 230 +84ffc 10 200 236 +8500c 14 199 236 +85020 10 200 236 +85030 14 96 239 +85044 4 97 239 +85048 8 319 202 +85050 4 97 239 +85054 8 161 202 +8505c 4 161 202 +85060 28 432 242 +85088 8 135 223 +85090 c 213 201 +8509c 14 428 242 +850b0 10 156 239 +FUNC 850c0 c68 0 std::priv::__money_do_put >, std::basic_string, std::allocator >, std::basic_string, std::allocator > > +850c0 24 316 221 +850e4 4 145 212 +850e8 18 316 221 +85100 8 145 212 +85108 c 316 221 +85114 8 145 212 +8511c 4 316 221 +85120 c 316 221 +8512c 4 145 212 +85130 38 351 219 +85168 4 206 207 +8516c 4 351 219 +85170 5c 206 207 +851cc 4 336 221 +851d0 10 173 222 +851e0 4 174 222 +851e4 4 173 222 +851e8 c 174 222 +851f4 8 175 222 +851fc 4 174 222 +85200 10 175 222 +85210 10 179 222 +85220 4 176 222 +85224 4 179 222 +85228 4 176 222 +8522c 1c 215 222 +85248 8 354 221 +85250 14 360 221 +85264 4 361 221 +85268 8 368 221 +85270 1c 177 222 +8528c 8 385 221 +85294 1c 184 207 +852b0 4 387 221 +852b4 c 389 221 +852c0 c 108 213 +852cc 4 41 213 +852d0 c 108 213 +852dc 14 41 213 +852f0 4 101 206 +852f4 4 397 221 +852f8 4 41 213 +852fc 4 397 221 +85300 4 613 237 +85304 4 611 237 +85308 4 612 237 +8530c 4 397 221 +85310 4 613 237 +85314 4 397 221 +85318 4 355 217 +8531c 4 74 239 +85320 8 355 217 +85328 8 472 238 +85330 8 482 238 +85338 4 267 247 +8533c 8 107 244 +85344 c 106 244 +85350 10 484 238 +85360 4 101 206 +85364 8 485 238 +8536c 2c 399 221 +85398 4 400 238 +8539c 4 413 221 +853a0 4 419 221 +853a4 4 421 221 +853a8 8 400 238 +853b0 4 419 221 +853b4 4 413 221 +853b8 4 421 221 +853bc 8 400 238 +853c4 8 421 221 +853cc 8 416 221 +853d4 4 419 221 +853d8 4 413 221 +853dc 4 419 221 +853e0 4 422 221 +853e4 10 400 238 +853f4 8 423 221 +853fc 8 427 221 +85404 4 427 221 +85408 4 181 222 +8540c 4 427 221 +85410 c 181 222 +8541c 8 427 221 +85424 10 437 221 +85434 8 439 221 +8543c c 443 221 +85448 c 444 221 +85454 c 446 221 +85460 10 212 222 +85470 4 213 222 +85474 4 212 222 +85478 c 213 222 +85484 8 214 222 +8548c 4 213 222 +85490 10 214 222 +854a0 14 218 222 +854b4 c 215 222 +854c0 4 368 221 +854c4 4 362 221 +854c8 4 368 221 +854cc 1c 178 222 +854e8 4 385 221 +854ec c 387 221 +854f8 4 390 221 +854fc 8 64 239 +85504 c 96 239 +85510 18 97 239 +85528 8 64 239 +85530 c 96 239 +8553c 18 97 239 +85554 4 64 239 +85558 c 96 239 +85564 c 97 239 +85570 8 498 221 +85578 38 499 221 +855b0 4 388 221 +855b4 c 387 221 +855c0 c 108 213 +855cc 4 41 213 +855d0 c 108 213 +855dc 14 41 213 +855f0 4 101 206 +855f4 4 397 221 +855f8 4 41 213 +855fc 4 397 221 +85600 4 613 237 +85604 4 611 237 +85608 4 612 237 +8560c 4 397 221 +85610 4 613 237 +85614 4 397 221 +85618 10 584 238 +85628 4 427 221 +8562c 4 220 222 +85630 4 427 221 +85634 c 219 222 +85640 8 427 221 +85648 10 437 221 +85658 c 437 221 +85664 c 443 221 +85670 c 448 221 +8567c 8 446 221 +85684 4 448 221 +85688 10 448 221 +85698 1c 480 201 +856b4 4 62 230 +856b8 10 200 236 +856c8 c 199 236 +856d4 4 200 236 +856d8 8 62 230 +856e0 8 480 201 +856e8 8 450 221 +856f0 14 480 221 +85704 c 454 221 +85710 18 477 221 +85728 24 454 221 +8574c 20 216 222 +8576c 20 217 222 +8578c 10 220 222 +8579c 10 180 222 +857ac c 456 221 +857b8 10 458 221 +857c8 14 480 201 +857dc 4 62 230 +857e0 10 200 236 +857f0 c 199 236 +857fc 4 200 236 +85800 8 62 230 +85808 8 480 201 +85810 c 459 221 +8581c 8 452 221 +85824 10 400 238 +85834 8 492 221 +8583c 8 493 221 +85844 c 213 201 +85850 1c 213 201 +8586c c 199 236 +85878 4 200 236 +8587c 8 62 230 +85884 4 215 201 +85888 8 213 201 +85890 4 214 201 +85894 4 62 230 +85898 10 200 236 +858a8 14 199 236 +858bc c 200 236 +858c8 8 470 221 +858d0 10 473 221 +858e0 c 475 221 +858ec c 476 221 +858f8 10 477 221 +85908 4 480 201 +8590c 4 62 230 +85910 10 200 236 +85920 c 199 236 +8592c 4 200 236 +85930 8 62 230 +85938 c 480 201 +85944 8 285 201 +8594c 10 477 221 +8595c 4 285 201 +85960 4 477 221 +85964 10 285 201 +85974 c 466 221 +85980 10 467 221 +85990 8 462 221 +85998 28 285 201 +859c0 c 483 221 +859cc 18 199 236 +859e4 10 200 236 +859f4 8 493 221 +859fc 4 494 221 +85a00 c 494 221 +85a0c 18 480 201 +85a24 4 62 230 +85a28 10 200 236 +85a38 c 199 236 +85a44 4 200 236 +85a48 8 62 230 +85a50 8 480 201 +85a58 8 496 221 +85a60 4 64 239 +85a64 4 498 221 +85a68 c 96 239 +85a74 4 97 239 +85a78 8 319 202 +85a80 4 97 239 +85a84 8 161 202 +85a8c 8 161 202 +85a94 14 199 236 +85aa8 10 200 236 +85ab8 14 199 236 +85acc 10 200 236 +85adc 18 199 236 +85af4 14 200 236 +85b08 24 285 201 +85b2c 4 480 221 +85b30 4 482 221 +85b34 4 480 221 +85b38 c 482 221 +85b44 24 285 201 +85b68 c 355 221 +85b74 24 285 201 +85b98 8 135 223 +85ba0 c 304 238 +85bac 8 307 238 +85bb4 4 64 213 +85bb8 4 67 213 +85bbc 8 64 213 +85bc4 10 107 244 +85bd4 10 106 244 +85be4 4 107 244 +85be8 c 106 244 +85bf4 4 107 244 +85bf8 4 64 239 +85bfc 4 101 206 +85c00 c 96 239 +85c0c 8 97 239 +85c14 8 319 202 +85c1c 4 97 239 +85c20 4 135 223 +85c24 8 161 202 +85c2c 4 161 202 +85c30 8 479 238 +85c38 4 164 239 +85c3c 4 165 239 +85c40 4 479 238 +85c44 c 160 239 +85c50 c 135 223 +85c5c c 134 223 +85c68 10 600 237 +85c78 14 498 221 +85c8c 8 64 239 +85c94 c 96 239 +85ca0 18 97 239 +85cb8 4 64 239 +85cbc c 96 239 +85cc8 1c 97 239 +85ce4 c 156 239 +85cf0 8 64 239 +85cf8 c 96 239 +85d04 24 97 239 +FUNC 85d28 34 0 std::money_put > >::do_put +85d28 4 515 221 +85d2c 8 518 221 +85d34 4 515 221 +85d38 18 518 221 +85d50 4 518 221 +85d54 8 519 221 +FUNC 85d5c c68 0 std::priv::__money_do_put >, std::basic_string, std::allocator >, std::priv::__basic_iostring > +85d5c 24 316 221 +85d80 4 145 212 +85d84 18 316 221 +85d9c 8 145 212 +85da4 c 316 221 +85db0 8 145 212 +85db8 4 316 221 +85dbc c 316 221 +85dc8 4 145 212 +85dcc 38 351 219 +85e04 4 206 207 +85e08 4 351 219 +85e0c 5c 206 207 +85e68 4 336 221 +85e6c 10 173 222 +85e7c 4 174 222 +85e80 4 173 222 +85e84 c 174 222 +85e90 8 175 222 +85e98 4 174 222 +85e9c 10 175 222 +85eac 10 179 222 +85ebc 4 176 222 +85ec0 4 179 222 +85ec4 4 176 222 +85ec8 1c 215 222 +85ee4 8 354 221 +85eec 14 360 221 +85f00 4 361 221 +85f04 8 368 221 +85f0c 1c 177 222 +85f28 8 385 221 +85f30 1c 184 207 +85f4c 4 387 221 +85f50 c 389 221 +85f5c c 108 213 +85f68 4 41 213 +85f6c c 108 213 +85f78 14 41 213 +85f8c 4 101 206 +85f90 4 397 221 +85f94 4 41 213 +85f98 4 397 221 +85f9c 4 613 237 +85fa0 4 611 237 +85fa4 4 612 237 +85fa8 4 397 221 +85fac 4 613 237 +85fb0 4 397 221 +85fb4 4 355 217 +85fb8 4 74 239 +85fbc 8 355 217 +85fc4 8 472 238 +85fcc 8 482 238 +85fd4 4 267 247 +85fd8 8 107 244 +85fe0 c 106 244 +85fec 10 484 238 +85ffc 4 101 206 +86000 8 485 238 +86008 2c 399 221 +86034 4 400 238 +86038 4 413 221 +8603c 4 419 221 +86040 4 421 221 +86044 8 400 238 +8604c 4 419 221 +86050 4 413 221 +86054 4 421 221 +86058 8 400 238 +86060 8 421 221 +86068 8 416 221 +86070 4 419 221 +86074 4 413 221 +86078 4 419 221 +8607c 4 422 221 +86080 10 400 238 +86090 8 423 221 +86098 8 427 221 +860a0 4 427 221 +860a4 4 181 222 +860a8 4 427 221 +860ac c 181 222 +860b8 8 427 221 +860c0 10 437 221 +860d0 8 439 221 +860d8 c 443 221 +860e4 c 444 221 +860f0 c 446 221 +860fc 10 212 222 +8610c 4 213 222 +86110 4 212 222 +86114 c 213 222 +86120 8 214 222 +86128 4 213 222 +8612c 10 214 222 +8613c 14 218 222 +86150 c 215 222 +8615c 4 368 221 +86160 4 362 221 +86164 4 368 221 +86168 1c 178 222 +86184 4 385 221 +86188 c 387 221 +86194 4 390 221 +86198 8 64 239 +861a0 c 96 239 +861ac 18 97 239 +861c4 8 64 239 +861cc c 96 239 +861d8 18 97 239 +861f0 4 64 239 +861f4 c 96 239 +86200 c 97 239 +8620c 8 498 221 +86214 38 499 221 +8624c 4 388 221 +86250 c 387 221 +8625c c 108 213 +86268 4 41 213 +8626c c 108 213 +86278 14 41 213 +8628c 4 101 206 +86290 4 397 221 +86294 4 41 213 +86298 4 397 221 +8629c 4 613 237 +862a0 4 611 237 +862a4 4 612 237 +862a8 4 397 221 +862ac 4 613 237 +862b0 4 397 221 +862b4 10 584 238 +862c4 4 427 221 +862c8 4 220 222 +862cc 4 427 221 +862d0 c 219 222 +862dc 8 427 221 +862e4 10 437 221 +862f4 c 437 221 +86300 c 443 221 +8630c c 448 221 +86318 8 446 221 +86320 4 448 221 +86324 10 448 221 +86334 1c 480 201 +86350 4 62 230 +86354 10 200 236 +86364 c 199 236 +86370 4 200 236 +86374 8 62 230 +8637c 8 480 201 +86384 8 450 221 +8638c 14 480 221 +863a0 c 454 221 +863ac 18 477 221 +863c4 24 454 221 +863e8 20 216 222 +86408 20 217 222 +86428 10 220 222 +86438 10 180 222 +86448 c 456 221 +86454 10 458 221 +86464 14 480 201 +86478 4 62 230 +8647c 10 200 236 +8648c c 199 236 +86498 4 200 236 +8649c 8 62 230 +864a4 8 480 201 +864ac c 459 221 +864b8 8 452 221 +864c0 10 400 238 +864d0 8 492 221 +864d8 8 493 221 +864e0 c 213 201 +864ec 1c 213 201 +86508 c 199 236 +86514 4 200 236 +86518 8 62 230 +86520 4 215 201 +86524 8 213 201 +8652c 4 214 201 +86530 4 62 230 +86534 10 200 236 +86544 14 199 236 +86558 c 200 236 +86564 8 470 221 +8656c 10 473 221 +8657c c 475 221 +86588 c 476 221 +86594 10 477 221 +865a4 4 480 201 +865a8 4 62 230 +865ac 10 200 236 +865bc c 199 236 +865c8 4 200 236 +865cc 8 62 230 +865d4 c 480 201 +865e0 8 285 201 +865e8 10 477 221 +865f8 4 285 201 +865fc 4 477 221 +86600 10 285 201 +86610 c 466 221 +8661c 10 467 221 +8662c 8 462 221 +86634 28 285 201 +8665c c 483 221 +86668 18 199 236 +86680 10 200 236 +86690 8 493 221 +86698 4 494 221 +8669c c 494 221 +866a8 18 480 201 +866c0 4 62 230 +866c4 10 200 236 +866d4 c 199 236 +866e0 4 200 236 +866e4 8 62 230 +866ec 8 480 201 +866f4 8 496 221 +866fc 4 64 239 +86700 4 498 221 +86704 c 96 239 +86710 4 97 239 +86714 8 319 202 +8671c 4 97 239 +86720 8 161 202 +86728 8 161 202 +86730 14 199 236 +86744 10 200 236 +86754 14 199 236 +86768 10 200 236 +86778 18 199 236 +86790 14 200 236 +867a4 24 285 201 +867c8 4 480 221 +867cc 4 482 221 +867d0 4 480 221 +867d4 c 482 221 +867e0 24 285 201 +86804 c 355 221 +86810 24 285 201 +86834 8 135 223 +8683c c 304 238 +86848 8 307 238 +86850 4 64 213 +86854 4 67 213 +86858 8 64 213 +86860 10 107 244 +86870 10 106 244 +86880 4 107 244 +86884 c 106 244 +86890 4 107 244 +86894 4 64 239 +86898 4 101 206 +8689c c 96 239 +868a8 8 97 239 +868b0 8 319 202 +868b8 4 97 239 +868bc 4 135 223 +868c0 8 161 202 +868c8 4 161 202 +868cc 8 479 238 +868d4 4 164 239 +868d8 4 165 239 +868dc 4 479 238 +868e0 c 160 239 +868ec c 135 223 +868f8 c 134 223 +86904 10 600 237 +86914 14 498 221 +86928 8 64 239 +86930 c 96 239 +8693c 18 97 239 +86954 4 64 239 +86958 c 96 239 +86964 1c 97 239 +86980 c 156 239 +8698c 8 64 239 +86994 c 96 239 +869a0 24 97 239 +FUNC 869c4 214 0 std::money_put > >::do_put +869c4 10 505 221 +869d4 8 108 213 +869dc 10 505 221 +869ec c 108 213 +869f8 4 41 213 +869fc 4 505 221 +86a00 4 41 213 +86a04 8 505 221 +86a0c 4 41 213 +86a10 4 505 221 +86a14 8 505 221 +86a1c 4 108 213 +86a20 10 41 213 +86a30 4 611 237 +86a34 4 108 213 +86a38 4 613 237 +86a3c 8 108 213 +86a44 4 101 206 +86a48 4 613 237 +86a4c 4 612 237 +86a50 4 108 213 +86a54 10 41 213 +86a64 4 611 237 +86a68 4 133 226 +86a6c 4 613 237 +86a70 4 133 226 +86a74 4 612 237 +86a78 4 613 237 +86a7c 4 101 206 +86a80 4 133 226 +86a84 c 145 212 +86a90 14 351 219 +86aa4 8 135 226 +86aac 18 136 226 +86ac4 4 64 239 +86ac8 c 96 239 +86ad4 4 97 239 +86ad8 8 319 202 +86ae0 4 97 239 +86ae4 8 161 202 +86aec 4 161 202 +86af0 28 510 221 +86b18 4 64 239 +86b1c 4 510 221 +86b20 c 96 239 +86b2c 8 97 239 +86b34 8 319 202 +86b3c 4 97 239 +86b40 8 161 202 +86b48 4 161 202 +86b4c 28 511 221 +86b74 14 135 223 +86b88 14 156 239 +86b9c c 135 226 +86ba8 4 64 239 +86bac c 96 239 +86bb8 4 97 239 +86bbc 4 70 213 +86bc0 4 97 239 +86bc4 4 70 213 +86bc8 10 70 213 +FUNC 86bd8 278 0 std::priv::__get_string >, wchar_t*> +86bd8 34 51 221 +86c0c 20 51 221 +86c2c 4 75 215 +86c30 c 90 215 +86c3c 4 77 215 +86c40 8 90 215 +86c48 4 53 221 +86c4c 10 53 221 +86c5c 4 90 215 +86c60 c 53 221 +86c6c 4 57 221 +86c70 8 62 231 +86c78 4 57 221 +86c7c 4 62 231 +86c80 4 57 221 +86c84 4 58 221 +86c88 4 62 231 +86c8c 20 58 221 +86cac 14 235 236 +86cc0 c 95 215 +86ccc 8 235 236 +86cd4 10 229 236 +86ce4 8 228 236 +86cec 4 55 221 +86cf0 8 69 215 +86cf8 4 228 236 +86cfc 20 229 236 +86d1c 14 235 236 +86d30 c 95 215 +86d3c 1c 235 236 +86d58 10 95 215 +86d68 18 234 236 +86d80 4 95 215 +86d84 28 234 236 +86dac 8 95 215 +86db4 1c 234 236 +86dd0 8 95 215 +86dd8 10 235 236 +86de8 4 95 215 +86dec 14 235 236 +86e00 4 95 215 +86e04 2c 235 236 +86e30 4 95 215 +86e34 1c 235 236 +FUNC 86e50 26c 0 std::priv::__get_string >, char*> +86e50 3c 51 221 +86e8c 14 51 221 +86ea0 4 75 215 +86ea4 10 90 215 +86eb4 4 77 215 +86eb8 c 90 215 +86ec4 4 53 221 +86ec8 10 53 221 +86ed8 4 90 215 +86edc c 53 221 +86ee8 4 57 221 +86eec 8 62 231 +86ef4 4 57 221 +86ef8 8 62 231 +86f00 4 57 221 +86f04 24 58 221 +86f28 14 235 236 +86f3c 8 95 215 +86f44 18 234 236 +86f5c 4 95 215 +86f60 8 234 236 +86f68 10 229 236 +86f78 8 228 236 +86f80 4 55 221 +86f84 8 69 215 +86f8c 4 228 236 +86f90 20 229 236 +86fb0 18 235 236 +86fc8 8 95 215 +86fd0 18 235 236 +86fe8 8 95 215 +86ff0 20 234 236 +87010 8 95 215 +87018 1c 234 236 +87034 8 95 215 +8703c 8 235 236 +87044 4 95 215 +87048 24 235 236 +8706c 4 95 215 +87070 2c 235 236 +8709c 4 95 215 +870a0 1c 235 236 +FUNC 870bc 138 0 std::istreambuf_iterator >::equal +870bc c 74 215 +870c8 4 74 215 +870cc 8 75 215 +870d4 8 90 215 +870dc 8 77 215 +870e4 8 90 215 +870ec 8 79 215 +870f4 4 80 215 +870f8 4 79 215 +870fc c 80 215 +87108 1c 235 236 +87124 4 94 215 +87128 4 93 215 +8712c 8 95 215 +87134 4 79 215 +87138 4 80 215 +8713c 4 79 215 +87140 c 80 215 +8714c 1c 235 236 +87168 4 93 215 +8716c 4 95 215 +87170 4 94 215 +87174 8 95 215 +8717c 4c 234 236 +871c8 2c 235 236 +FUNC 871f4 290 0 std::priv::__match >, const std::basic_string, std::allocator >*> +871f4 14 78 242 +87208 14 80 242 +8721c 4 78 242 +87220 4 80 242 +87224 14 78 242 +87238 8 80 242 +87240 4 87 242 +87244 4 120 215 +87248 8 83 242 +87250 4 120 215 +87254 4 85 242 +87258 4 87 242 +8725c 8 78 242 +87264 4 82 242 +87268 4 87 242 +8726c 4 78 242 +87270 8 120 215 +87278 4 81 242 +8727c 4 107 242 +87280 4 89 242 +87284 28 91 242 +872ac 8 92 242 +872b4 10 90 215 +872c4 c 93 242 +872d0 4 108 242 +872d4 4 107 242 +872d8 4 108 242 +872dc c 110 242 +872e8 14 91 242 +872fc 4 68 215 +87300 10 229 236 +87310 8 228 236 +87318 4 120 215 +8731c 4 69 215 +87320 4 120 215 +87324 4 119 242 +87328 4 120 242 +8732c 8 120 215 +87334 4 89 242 +87338 28 124 242 +87360 8 115 242 +87368 8 115 242 +87370 4 92 215 +87374 1c 235 236 +87390 8 94 215 +87398 4 93 215 +8739c 4 95 215 +873a0 c 93 242 +873ac c 400 238 +873b8 c 94 242 +873c4 c 104 242 +873d0 20 234 236 +873f0 4 97 242 +873f4 4 96 242 +873f8 4 97 242 +873fc 8 99 242 +87404 8 93 242 +8740c 8 228 236 +87414 18 229 236 +8742c 1c 235 236 +87448 8 91 242 +87450 4 68 215 +87454 4 93 242 +87458 10 229 236 +87468 8 228 236 +87470 4 69 215 +87474 8 101 242 +8747c 8 69 215 +FUNC 87484 178 0 std::time_get > >::do_get_monthname +87484 c 384 242 +87490 4 292 242 +87494 4 384 242 +87498 8 384 242 +874a0 4 292 242 +874a4 8 384 242 +874ac 10 292 242 +874bc 8 293 242 +874c4 20 294 242 +874e4 4 390 242 +874e8 4 396 242 +874ec c 397 242 +874f8 4 75 215 +874fc 8 392 242 +87504 4 75 215 +87508 8 90 215 +87510 8 77 215 +87518 c 90 215 +87524 c 393 242 +87530 c 394 242 +8753c 4 396 242 +87540 c 397 242 +8754c 3c 235 236 +87588 4 93 215 +8758c 4 95 215 +87590 4 94 215 +87594 8 95 215 +8759c 1c 234 236 +875b8 10 235 236 +875c8 24 234 236 +875ec 10 235 236 +FUNC 875fc 188 0 std::time_get > >::do_get_weekday +875fc c 367 242 +87608 4 281 242 +8760c 4 367 242 +87610 c 367 242 +8761c c 281 242 +87628 4 367 242 +8762c 4 281 242 +87630 8 282 242 +87638 34 283 242 +8766c 4 373 242 +87670 4 379 242 +87674 c 380 242 +87680 4 75 215 +87684 8 375 242 +8768c 4 75 215 +87690 8 90 215 +87698 8 77 215 +876a0 c 90 215 +876ac c 376 242 +876b8 c 377 242 +876c4 4 379 242 +876c8 c 380 242 +876d4 3c 235 236 +87710 4 93 215 +87714 4 95 215 +87718 4 94 215 +8771c 8 95 215 +87724 1c 234 236 +87740 10 235 236 +87750 24 234 236 +87774 10 235 236 +FUNC 87784 4c4 0 std::priv::__get_formatted_time >, wchar_t, std::priv::_WTime_Info> +87784 c 149 242 +87790 4 145 212 +87794 8 149 242 +8779c 8 145 212 +877a4 4 149 242 +877a8 4 145 212 +877ac 10 149 242 +877bc c 149 242 +877c8 4 145 212 +877cc 10 351 219 +877dc 8 231 242 +877e4 4 166 242 +877e8 8 351 219 +877f0 4 153 242 +877f4 4 166 242 +877f8 4 231 242 +877fc 4 153 242 +87800 8 75 215 +87808 8 90 215 +87810 8 77 215 +87818 c 90 215 +87824 4 156 242 +87828 10 156 242 +87838 c 158 242 +87844 4 160 242 +87848 8 161 242 +87850 4 159 242 +87854 1c 166 242 +87870 1c 235 236 +8788c 4 156 242 +87890 4 93 215 +87894 4 95 215 +87898 4 94 215 +8789c 4 156 242 +878a0 4 95 215 +878a4 4 156 242 +878a8 20 276 242 +878c8 4 166 242 +878cc 4 157 242 +878d0 24 182 242 +878f4 8 183 242 +878fc 4 185 242 +87900 8 272 242 +87908 4 166 242 +8790c 4 157 242 +87910 24 171 242 +87934 8 172 242 +8793c 4 174 242 +87940 8 272 242 +87948 18 250 242 +87960 4 251 242 +87964 8 272 242 +8796c 18 257 242 +87984 c 258 242 +87990 4 259 242 +87994 8 272 242 +8799c 18 243 242 +879b4 4 244 242 +879b8 8 272 242 +879c0 14 231 242 +879d4 8 232 242 +879dc 8 235 242 +879e4 4 237 242 +879e8 c 237 242 +879f4 4 238 242 +879f8 8 272 242 +87a00 14 213 242 +87a14 c 214 242 +87a20 10 215 242 +87a30 14 216 242 +87a44 4 217 242 +87a48 18 206 242 +87a60 4 207 242 +87a64 8 272 242 +87a6c 18 190 242 +87a84 4 191 242 +87a88 10 191 242 +87a98 8 272 242 +87aa0 18 223 242 +87ab8 4 224 242 +87abc 8 272 242 +87ac4 18 199 242 +87adc 4 200 242 +87ae0 8 272 242 +87ae8 4 166 242 +87aec 8 179 242 +87af4 4 166 242 +87af8 8 168 242 +87b00 8 269 242 +87b08 4 90 215 +87b0c 8 269 242 +87b14 4 90 215 +87b18 14 206 207 +87b2c 8 269 242 +87b34 8 272 242 +87b3c 1c 235 236 +87b58 4 93 215 +87b5c 4 95 215 +87b60 4 94 215 +87b64 8 95 215 +87b6c 14 235 236 +87b80 8 93 215 +87b88 4 163 242 +87b8c 8 162 242 +87b94 4c 234 236 +87be0 8 235 236 +87be8 8 93 215 +87bf0 28 235 236 +87c18 c 235 242 +87c24 4 236 242 +87c28 4 272 242 +87c2c c 236 242 +87c38 10 153 242 +FUNC 87c48 1c0 0 std::time_get > >::do_get_date +87c48 24 304 242 +87c6c 4 315 242 +87c70 4 304 242 +87c74 4 315 242 +87c78 4 304 242 +87c7c 4 315 242 +87c80 4 304 242 +87c84 10 315 242 +87c94 4 304 242 +87c98 10 315 242 +87ca8 8 304 242 +87cb0 4 315 242 +87cb4 18 316 242 +87ccc 8 319 242 +87cd4 4 75 215 +87cd8 8 90 215 +87ce0 4 77 215 +87ce4 c 90 215 +87cf0 8 320 242 +87cf8 c 321 242 +87d04 4 324 242 +87d08 8 323 242 +87d10 4 324 242 +87d14 4 323 242 +87d18 24 324 242 +87d3c 20 235 236 +87d5c 8 317 242 +87d64 14 235 236 +87d78 c 95 215 +87d84 8 235 236 +87d8c 1c 234 236 +87da8 14 235 236 +87dbc 24 234 236 +87de0 8 95 215 +87de8 4 235 236 +87dec 4 95 215 +87df0 18 235 236 +FUNC 87e08 1b8 0 std::time_get > >::do_get_time +87e08 24 328 242 +87e2c 4 338 242 +87e30 4 328 242 +87e34 4 338 242 +87e38 4 328 242 +87e3c 4 338 242 +87e40 4 328 242 +87e44 c 338 242 +87e50 4 328 242 +87e54 14 338 242 +87e68 8 328 242 +87e70 4 338 242 +87e74 10 339 242 +87e84 10 339 242 +87e94 4 75 215 +87e98 8 90 215 +87ea0 4 77 215 +87ea4 c 90 215 +87eb0 8 341 242 +87eb8 c 342 242 +87ec4 4 344 242 +87ec8 8 343 242 +87ed0 4 344 242 +87ed4 4 343 242 +87ed8 24 344 242 +87efc 34 235 236 +87f30 c 95 215 +87f3c 8 235 236 +87f44 24 234 236 +87f68 8 95 215 +87f70 1c 234 236 +87f8c 18 235 236 +87fa4 4 95 215 +87fa8 18 235 236 +FUNC 87fc0 498 0 std::priv::__do_get_alphabool >, wchar_t> +87fc0 8 449 224 +87fc8 4 145 212 +87fcc 8 449 224 +87fd4 4 145 212 +87fd8 18 449 224 +87ff0 c 145 212 +87ffc c 449 224 +88008 4 145 212 +8800c 14 351 219 +88020 4 451 224 +88024 4 88 228 +88028 4 451 224 +8802c 14 88 228 +88040 2c 89 228 +8806c c 95 215 +88078 4 75 215 +8807c 8 90 215 +88084 8 77 215 +8808c c 90 215 +88098 c 458 224 +880a4 18 90 215 +880bc 4 460 224 +880c0 4 461 224 +880c4 4 462 224 +880c8 8 229 236 +880d0 8 228 236 +880d8 8 69 215 +880e0 4 471 224 +880e4 c 400 238 +880f0 8 471 224 +880f8 4 472 224 +880fc 4 400 238 +88100 4 472 224 +88104 8 400 238 +8810c 8 472 224 +88114 c 479 224 +88120 10 112 215 +88130 4 481 224 +88134 10 482 224 +88144 4 96 239 +88148 4 64 239 +8814c 4 484 224 +88150 c 96 239 +8815c 18 97 239 +88174 4 64 239 +88178 c 96 239 +88184 14 97 239 +88198 2c 485 224 +881c4 1c 235 236 +881e0 4 93 215 +881e4 4 94 215 +881e8 8 95 215 +881f0 10 460 224 +88200 8 461 224 +88208 c 461 224 +88214 4 464 224 +88218 c 400 238 +88224 8 464 224 +8822c 4 229 236 +88230 8 464 224 +88238 4 229 236 +8823c c 228 236 +88248 10 69 215 +88258 4 464 224 +8825c 8 400 238 +88264 c 464 224 +88270 c 400 238 +8827c 8 464 224 +88284 8 229 236 +8828c 4 228 236 +88290 10 229 236 +882a0 4 92 215 +882a4 1c 235 236 +882c0 4 93 215 +882c4 4 94 215 +882c8 8 95 215 +882d0 1c 235 236 +882ec 4 93 215 +882f0 4 94 215 +882f4 c 95 215 +88300 c 461 224 +8830c 4 464 224 +88310 c 229 236 +8831c c 69 215 +88328 54 234 236 +8837c 8 475 224 +88384 c 476 224 +88390 48 235 236 +883d8 4 64 239 +883dc c 96 239 +883e8 20 97 239 +88408 14 451 224 +8841c 4 64 239 +88420 10 96 239 +88430 1c 97 239 +8844c 4 464 224 +88450 8 464 224 +FUNC 88458 130 0 std::istreambuf_iterator >::equal +88458 c 74 215 +88464 4 74 215 +88468 8 75 215 +88470 8 90 215 +88478 8 77 215 +88480 8 90 215 +88488 8 79 215 +88490 4 80 215 +88494 4 79 215 +88498 c 80 215 +884a4 14 235 236 +884b8 4 93 215 +884bc 4 95 215 +884c0 4 94 215 +884c4 4 95 215 +884c8 4 79 215 +884cc 4 80 215 +884d0 4 79 215 +884d4 c 80 215 +884e0 14 235 236 +884f4 4 93 215 +884f8 4 95 215 +884fc 4 94 215 +88500 8 95 215 +88508 4c 234 236 +88554 34 235 236 +FUNC 88588 268 0 std::priv::__match >, const std::basic_string, std::allocator >*> +88588 4 78 242 +8858c 4 80 242 +88590 24 78 242 +885b4 8 80 242 +885bc 4 87 242 +885c0 4 78 242 +885c4 4 80 242 +885c8 4 78 242 +885cc 4 120 215 +885d0 4 87 242 +885d4 4 85 242 +885d8 4 83 242 +885dc 4 120 215 +885e0 8 78 242 +885e8 4 82 242 +885ec 4 87 242 +885f0 4 78 242 +885f4 8 120 215 +885fc 4 81 242 +88600 4 107 242 +88604 4 89 242 +88608 24 91 242 +8862c 8 92 242 +88634 10 90 215 +88644 c 93 242 +88650 4 108 242 +88654 4 107 242 +88658 4 108 242 +8865c c 110 242 +88668 14 91 242 +8867c 4 68 215 +88680 10 229 236 +88690 8 228 236 +88698 4 120 215 +8869c 4 69 215 +886a0 4 120 215 +886a4 4 119 242 +886a8 4 120 242 +886ac 8 120 215 +886b4 4 89 242 +886b8 28 124 242 +886e0 8 115 242 +886e8 8 115 242 +886f0 4 92 215 +886f4 14 235 236 +88708 4 93 215 +8870c 8 94 215 +88714 4 95 215 +88718 c 93 242 +88724 8 400 238 +8872c c 94 242 +88738 c 104 242 +88744 20 234 236 +88764 4 97 242 +88768 4 96 242 +8876c 4 97 242 +88770 8 99 242 +88778 8 93 242 +88780 8 228 236 +88788 14 229 236 +8879c 18 235 236 +887b4 8 91 242 +887bc 4 68 215 +887c0 4 93 242 +887c4 10 229 236 +887d4 8 228 236 +887dc 4 69 215 +887e0 8 101 242 +887e8 8 69 215 +FUNC 887f0 160 0 std::time_get > >::do_get_monthname +887f0 c 384 242 +887fc 4 292 242 +88800 4 384 242 +88804 c 384 242 +88810 c 292 242 +8881c 4 384 242 +88820 4 292 242 +88824 8 293 242 +8882c 20 294 242 +8884c 4 390 242 +88850 4 396 242 +88854 c 397 242 +88860 4 75 215 +88864 8 392 242 +8886c 4 75 215 +88870 8 90 215 +88878 8 77 215 +88880 c 90 215 +8888c c 393 242 +88898 c 394 242 +888a4 4 396 242 +888a8 c 397 242 +888b4 10 235 236 +888c4 1c 234 236 +888e0 10 235 236 +888f0 14 235 236 +88904 4 93 215 +88908 4 95 215 +8890c 4 94 215 +88910 8 95 215 +88918 24 234 236 +8893c 14 235 236 +FUNC 88950 174 0 std::time_get > >::do_get_weekday +88950 c 367 242 +8895c 4 281 242 +88960 4 367 242 +88964 c 367 242 +88970 c 281 242 +8897c 4 367 242 +88980 4 281 242 +88984 8 282 242 +8898c 34 283 242 +889c0 4 373 242 +889c4 4 379 242 +889c8 c 380 242 +889d4 4 75 215 +889d8 8 375 242 +889e0 4 75 215 +889e4 8 90 215 +889ec 8 77 215 +889f4 c 90 215 +88a00 c 376 242 +88a0c c 377 242 +88a18 4 379 242 +88a1c c 380 242 +88a28 10 235 236 +88a38 1c 234 236 +88a54 10 235 236 +88a64 14 235 236 +88a78 4 93 215 +88a7c 4 95 215 +88a80 4 94 215 +88a84 8 95 215 +88a8c 24 234 236 +88ab0 14 235 236 +FUNC 88ac4 4b4 0 std::priv::__get_formatted_time >, char, std::priv::_Time_Info> +88ac4 c 149 242 +88ad0 4 145 212 +88ad4 8 149 242 +88adc 8 145 212 +88ae4 4 149 242 +88ae8 4 145 212 +88aec 10 149 242 +88afc c 149 242 +88b08 4 145 212 +88b0c 14 351 219 +88b20 4 166 242 +88b24 4 351 219 +88b28 4 269 242 +88b2c 4 153 242 +88b30 8 257 242 +88b38 4 166 242 +88b3c 4 153 242 +88b40 8 75 215 +88b48 8 90 215 +88b50 8 77 215 +88b58 c 90 215 +88b64 4 156 242 +88b68 10 156 242 +88b78 c 158 242 +88b84 4 160 242 +88b88 8 161 242 +88b90 4 159 242 +88b94 1c 166 242 +88bb0 14 235 236 +88bc4 4 156 242 +88bc8 4 93 215 +88bcc 4 95 215 +88bd0 4 94 215 +88bd4 4 156 242 +88bd8 4 95 215 +88bdc 4 156 242 +88be0 20 276 242 +88c00 4 166 242 +88c04 4 157 242 +88c08 24 182 242 +88c2c 8 183 242 +88c34 4 185 242 +88c38 8 272 242 +88c40 4 166 242 +88c44 4 157 242 +88c48 24 171 242 +88c6c 8 172 242 +88c74 4 174 242 +88c78 8 272 242 +88c80 18 250 242 +88c98 4 251 242 +88c9c 8 272 242 +88ca4 18 257 242 +88cbc c 258 242 +88cc8 4 259 242 +88ccc 8 272 242 +88cd4 18 243 242 +88cec 4 244 242 +88cf0 8 272 242 +88cf8 14 231 242 +88d0c 8 232 242 +88d14 8 235 242 +88d1c 4 237 242 +88d20 c 237 242 +88d2c 4 238 242 +88d30 8 272 242 +88d38 14 213 242 +88d4c c 214 242 +88d58 10 215 242 +88d68 14 216 242 +88d7c 4 217 242 +88d80 18 206 242 +88d98 4 207 242 +88d9c 8 272 242 +88da4 18 190 242 +88dbc 4 191 242 +88dc0 10 191 242 +88dd0 8 272 242 +88dd8 18 223 242 +88df0 4 224 242 +88df4 8 272 242 +88dfc 18 199 242 +88e14 4 200 242 +88e18 8 272 242 +88e20 4 166 242 +88e24 8 179 242 +88e2c 4 166 242 +88e30 8 168 242 +88e38 8 269 242 +88e40 4 90 215 +88e44 8 269 242 +88e4c 4 90 215 +88e50 14 101 207 +88e64 8 269 242 +88e6c 8 272 242 +88e74 14 235 236 +88e88 4 93 215 +88e8c 4 95 215 +88e90 4 94 215 +88e94 8 95 215 +88e9c 18 235 236 +88eb4 4 163 242 +88eb8 8 162 242 +88ec0 4c 234 236 +88f0c 3c 235 236 +88f48 c 235 242 +88f54 4 236 242 +88f58 4 272 242 +88f5c c 236 242 +88f68 10 153 242 +FUNC 88f78 1ac 0 std::time_get > >::do_get_date +88f78 18 304 242 +88f90 4 315 242 +88f94 8 304 242 +88f9c 4 315 242 +88fa0 4 304 242 +88fa4 4 315 242 +88fa8 8 304 242 +88fb0 4 315 242 +88fb4 4 304 242 +88fb8 8 315 242 +88fc0 4 304 242 +88fc4 4 315 242 +88fc8 4 304 242 +88fcc 14 315 242 +88fe0 4 304 242 +88fe4 4 315 242 +88fe8 14 316 242 +88ffc 8 319 242 +89004 4 75 215 +89008 c 90 215 +89014 4 77 215 +89018 c 90 215 +89024 8 320 242 +8902c c 321 242 +89038 4 324 242 +8903c 8 323 242 +89044 4 324 242 +89048 4 323 242 +8904c 24 324 242 +89070 10 235 236 +89080 1c 234 236 +8909c 14 235 236 +890b0 8 317 242 +890b8 18 235 236 +890d0 8 95 215 +890d8 24 234 236 +890fc 8 95 215 +89104 4 235 236 +89108 4 95 215 +8910c 18 235 236 +FUNC 89124 1a4 0 std::time_get > >::do_get_time +89124 18 328 242 +8913c 4 338 242 +89140 8 328 242 +89148 4 338 242 +8914c 4 328 242 +89150 4 338 242 +89154 c 328 242 +89160 8 338 242 +89168 8 328 242 +89170 1c 338 242 +8918c 4 328 242 +89190 4 338 242 +89194 10 339 242 +891a4 c 339 242 +891b0 4 75 215 +891b4 c 90 215 +891c0 4 77 215 +891c4 c 90 215 +891d0 8 341 242 +891d8 c 342 242 +891e4 4 344 242 +891e8 8 343 242 +891f0 4 344 242 +891f4 4 343 242 +891f8 24 344 242 +8921c 10 235 236 +8922c 1c 234 236 +89248 14 235 236 +8925c 18 235 236 +89274 8 95 215 +8927c 24 234 236 +892a0 8 95 215 +892a8 4 235 236 +892ac 4 95 215 +892b0 18 235 236 +FUNC 892c8 450 0 std::priv::__do_get_alphabool >, char> +892c8 18 449 224 +892e0 4 145 212 +892e4 10 449 224 +892f4 8 145 212 +892fc 8 449 224 +89304 4 145 212 +89308 14 351 219 +8931c 4 451 224 +89320 4 59 228 +89324 4 451 224 +89328 14 59 228 +8933c 28 60 228 +89364 c 95 215 +89370 4 75 215 +89374 8 90 215 +8937c 8 77 215 +89384 c 90 215 +89390 c 458 224 +8939c 10 90 215 +893ac 4 460 224 +893b0 4 461 224 +893b4 4 462 224 +893b8 10 229 236 +893c8 8 228 236 +893d0 8 69 215 +893d8 4 471 224 +893dc c 400 238 +893e8 8 471 224 +893f0 4 472 224 +893f4 4 400 238 +893f8 4 472 224 +893fc 8 400 238 +89404 8 472 224 +8940c c 479 224 +89418 10 112 215 +89428 4 481 224 +8942c 10 482 224 +8943c 4 64 239 +89440 4 484 224 +89444 c 96 239 +89450 c 97 239 +8945c 4 64 239 +89460 c 96 239 +8946c c 97 239 +89478 28 485 224 +894a0 14 235 236 +894b4 4 93 215 +894b8 4 94 215 +894bc 8 95 215 +894c4 10 460 224 +894d4 8 461 224 +894dc c 461 224 +894e8 4 464 224 +894ec 8 400 238 +894f4 c 464 224 +89500 8 229 236 +89508 4 464 224 +8950c 8 229 236 +89514 8 228 236 +8951c c 69 215 +89528 4 464 224 +8952c 8 400 238 +89534 c 464 224 +89540 c 400 238 +8954c 8 464 224 +89554 10 229 236 +89564 4 228 236 +89568 10 229 236 +89578 4 92 215 +8957c 14 235 236 +89590 4 93 215 +89594 4 94 215 +89598 8 95 215 +895a0 14 235 236 +895b4 4 93 215 +895b8 4 94 215 +895bc c 95 215 +895c8 c 461 224 +895d4 4 464 224 +895d8 14 229 236 +895ec c 69 215 +895f8 54 234 236 +8964c 8 475 224 +89654 c 476 224 +89660 4c 235 236 +896ac 4 64 239 +896b0 c 96 239 +896bc 18 97 239 +896d4 10 451 224 +896e4 8 64 239 +896ec c 96 239 +896f8 14 97 239 +8970c 4 464 224 +89710 8 464 224 +FUNC 89718 15c 0 std::priv::__write_integer_backward +89718 c 304 226 +89724 4 304 226 +89728 4 307 226 +8972c 8 309 226 +89734 4 308 226 +89738 4 309 226 +8973c 4 308 226 +89740 4 309 226 +89744 4 287 226 +89748 10 368 226 +89758 14 314 226 +8976c 4 277 226 +89770 4 279 226 +89774 8 281 226 +8977c 18 282 226 +89794 4 281 226 +89798 8 282 226 +897a0 4 281 226 +897a4 4 284 226 +897a8 4 286 226 +897ac c 287 226 +897b8 4 323 226 +897bc 4 322 226 +897c0 8 323 226 +897c8 8 322 226 +897d0 4 326 226 +897d4 18 327 226 +897ec 4 333 226 +897f0 c 333 226 +897fc 4 340 226 +89800 4 339 226 +89804 8 340 226 +8980c 8 339 226 +89814 4 342 226 +89818 4 343 226 +8981c 4 344 226 +89820 4 343 226 +89824 c 344 226 +89830 c 310 226 +8983c 10 368 226 +8984c 10 333 226 +8985c 8 279 226 +89864 10 285 226 +FUNC 89874 4e0 0 std::priv::__put_float > > +89874 18 74 226 +8988c 4 145 212 +89890 10 74 226 +898a0 8 145 212 +898a8 10 74 226 +898b8 c 74 226 +898c4 4 145 212 +898c8 14 351 219 +898dc 4 78 226 +898e0 4 108 213 +898e4 4 41 213 +898e8 4 78 226 +898ec 10 108 213 +898fc 14 41 213 +89910 4 613 237 +89914 14 81 226 +89928 4 611 237 +8992c 4 612 237 +89930 4 613 237 +89934 4 101 206 +89938 4 81 226 +8993c 10 83 226 +8994c 2c 206 207 +89978 4 84 226 +8997c 4 206 207 +89980 18 84 226 +89998 18 206 207 +899b0 4 138 212 +899b4 4 400 238 +899b8 4 139 212 +899bc 8 400 238 +899c4 20 206 207 +899e4 c 47 226 +899f0 4 51 226 +899f4 4 50 226 +899f8 8 53 226 +89a00 10 57 226 +89a10 4 57 226 +89a14 10 57 226 +89a24 18 480 201 +89a3c 4 62 230 +89a40 10 200 236 +89a50 c 199 236 +89a5c 4 200 236 +89a60 8 62 230 +89a68 8 480 201 +89a70 4 64 226 +89a74 4 213 201 +89a78 4 64 226 +89a7c 10 213 201 +89a8c c 199 236 +89a98 4 200 236 +89a9c 8 62 230 +89aa4 4 215 201 +89aa8 8 213 201 +89ab0 4 214 201 +89ab4 4 62 230 +89ab8 10 200 236 +89ac8 14 199 236 +89adc 10 200 236 +89aec 14 199 236 +89b00 10 200 236 +89b10 10 213 201 +89b20 4 62 230 +89b24 c 64 239 +89b30 c 96 239 +89b3c 4 97 239 +89b40 8 319 202 +89b48 4 97 239 +89b4c 8 161 202 +89b54 4 161 202 +89b58 38 90 226 +89b90 c 199 236 +89b9c 4 200 236 +89ba0 8 62 230 +89ba8 4 215 201 +89bac 8 213 201 +89bb4 4 214 201 +89bb8 4 62 230 +89bbc 10 200 236 +89bcc 14 199 236 +89be0 c 200 236 +89bec 8 135 223 +89bf4 4 59 226 +89bf8 4 59 226 +89bfc 4 59 226 +89c00 18 480 201 +89c18 4 62 230 +89c1c 10 200 236 +89c2c c 199 236 +89c38 4 200 236 +89c3c 8 62 230 +89c44 8 480 201 +89c4c 10 285 201 +89c5c 8 60 226 +89c64 10 285 201 +89c74 14 199 236 +89c88 10 200 236 +89c98 18 285 201 +89cb0 4 54 226 +89cb4 4 480 201 +89cb8 4 54 226 +89cbc 8 285 201 +89cc4 c 480 201 +89cd0 4 62 230 +89cd4 10 200 236 +89ce4 c 199 236 +89cf0 4 200 236 +89cf4 8 62 230 +89cfc c 480 201 +89d08 14 199 236 +89d1c 14 200 236 +89d30 14 156 239 +89d44 10 78 226 +FUNC 89d54 220 0 std::priv::__do_put_float >, long double> +89d54 10 115 226 +89d64 4 108 213 +89d68 4 41 213 +89d6c 18 115 226 +89d84 4 108 213 +89d88 4 115 226 +89d8c 4 115 226 +89d90 8 108 213 +89d98 4 41 213 +89d9c 8 115 226 +89da4 4 108 213 +89da8 10 41 213 +89db8 4 611 237 +89dbc c 119 226 +89dc8 4 613 237 +89dcc 4 119 226 +89dd0 4 612 237 +89dd4 4 613 237 +89dd8 4 101 206 +89ddc 4 119 226 +89de0 4 145 212 +89de4 4 119 226 +89de8 8 145 212 +89df0 14 351 219 +89e04 8 121 226 +89e0c 10 85 228 +89e1c 4 86 228 +89e20 4 85 228 +89e24 c 86 228 +89e30 4 87 228 +89e34 4 86 228 +89e38 10 87 228 +89e48 2c 124 226 +89e74 4 64 239 +89e78 4 124 226 +89e7c c 96 239 +89e88 8 97 239 +89e90 8 161 202 +89e98 4 161 202 +89e9c 4 64 239 +89ea0 c 96 239 +89eac 4 97 239 +89eb0 8 319 202 +89eb8 4 97 239 +89ebc 8 161 202 +89ec4 4 161 202 +89ec8 2c 125 226 +89ef4 14 135 223 +89f08 4 64 239 +89f0c c 96 239 +89f18 4 97 239 +89f1c 4 70 213 +89f20 4 97 239 +89f24 4 70 213 +89f28 c 70 213 +89f34 8 64 239 +89f3c c 96 239 +89f48 1c 97 239 +89f64 10 121 226 +FUNC 89f74 24 0 std::num_put > >::do_put +89f74 4 451 226 +89f78 8 453 226 +89f80 4 451 226 +89f84 8 453 226 +89f8c c 453 226 +FUNC 89f98 220 0 std::priv::__do_put_float >, double> +89f98 10 115 226 +89fa8 4 108 213 +89fac 4 41 213 +89fb0 18 115 226 +89fc8 4 108 213 +89fcc 4 115 226 +89fd0 4 115 226 +89fd4 8 108 213 +89fdc 4 41 213 +89fe0 8 115 226 +89fe8 4 108 213 +89fec 10 41 213 +89ffc 4 611 237 +8a000 c 119 226 +8a00c 4 613 237 +8a010 4 119 226 +8a014 4 612 237 +8a018 4 613 237 +8a01c 4 101 206 +8a020 4 119 226 +8a024 4 145 212 +8a028 4 119 226 +8a02c 8 145 212 +8a034 14 351 219 +8a048 8 121 226 +8a050 10 85 228 +8a060 4 86 228 +8a064 4 85 228 +8a068 c 86 228 +8a074 4 87 228 +8a078 4 86 228 +8a07c 10 87 228 +8a08c 2c 124 226 +8a0b8 4 64 239 +8a0bc 4 124 226 +8a0c0 c 96 239 +8a0cc 8 97 239 +8a0d4 8 161 202 +8a0dc 4 161 202 +8a0e0 4 64 239 +8a0e4 c 96 239 +8a0f0 4 97 239 +8a0f4 8 319 202 +8a0fc 4 97 239 +8a100 8 161 202 +8a108 4 161 202 +8a10c 2c 125 226 +8a138 14 135 223 +8a14c 4 64 239 +8a150 c 96 239 +8a15c 4 97 239 +8a160 4 70 213 +8a164 4 97 239 +8a168 4 70 213 +8a16c c 70 213 +8a178 8 64 239 +8a180 c 96 239 +8a18c 1c 97 239 +8a1a8 10 121 226 +FUNC 8a1b8 24 0 std::num_put > >::do_put +8a1b8 4 444 226 +8a1bc 8 446 226 +8a1c4 4 444 226 +8a1c8 8 446 226 +8a1d0 c 446 226 +FUNC 8a1dc 15c 0 std::priv::__write_integer_backward +8a1dc c 304 226 +8a1e8 4 304 226 +8a1ec 4 307 226 +8a1f0 8 309 226 +8a1f8 4 308 226 +8a1fc 4 309 226 +8a200 4 308 226 +8a204 4 309 226 +8a208 4 287 226 +8a20c 10 368 226 +8a21c 14 314 226 +8a230 4 277 226 +8a234 4 279 226 +8a238 8 281 226 +8a240 18 282 226 +8a258 4 281 226 +8a25c 8 282 226 +8a264 4 281 226 +8a268 4 284 226 +8a26c 4 286 226 +8a270 c 287 226 +8a27c 4 323 226 +8a280 4 322 226 +8a284 8 323 226 +8a28c 8 322 226 +8a294 4 326 226 +8a298 18 327 226 +8a2b0 4 333 226 +8a2b4 c 333 226 +8a2c0 4 340 226 +8a2c4 4 339 226 +8a2c8 8 340 226 +8a2d0 8 339 226 +8a2d8 4 342 226 +8a2dc 4 343 226 +8a2e0 4 344 226 +8a2e4 4 343 226 +8a2e8 c 344 226 +8a2f4 c 310 226 +8a300 10 368 226 +8a310 10 333 226 +8a320 8 279 226 +8a328 10 285 226 +FUNC 8a338 3e8 0 std::priv::__get_base_or_zero >, wchar_t> +8a338 10 56 224 +8a348 10 56 224 +8a358 8 59 224 +8a360 4 59 224 +8a364 4 59 224 +8a368 1c 209 207 +8a384 c 90 215 +8a390 c 64 224 +8a39c 10 68 224 +8a3ac 4 74 224 +8a3b0 18 76 224 +8a3c8 10 120 215 +8a3d8 4 95 224 +8a3dc 8 90 215 +8a3e4 10 95 224 +8a3f4 4 91 224 +8a3f8 8 72 224 +8a400 4 112 224 +8a404 10 113 224 +8a414 4 92 215 +8a418 1c 235 236 +8a434 4 64 224 +8a438 4 94 215 +8a43c 4 95 215 +8a440 4 93 215 +8a444 4 64 224 +8a448 4 95 215 +8a44c 4 64 224 +8a450 4 68 215 +8a454 10 229 236 +8a464 8 228 236 +8a46c 4 74 224 +8a470 4 69 215 +8a474 4 76 224 +8a478 4 69 215 +8a47c 4 76 224 +8a480 10 120 215 +8a490 4 85 224 +8a494 8 90 215 +8a49c 10 85 224 +8a4ac c 72 224 +8a4b8 4 112 224 +8a4bc 10 113 224 +8a4cc 4 68 215 +8a4d0 10 229 236 +8a4e0 8 228 236 +8a4e8 c 69 215 +8a4f4 4 228 236 +8a4f8 c 229 236 +8a504 4 228 236 +8a508 c 229 236 +8a514 4 68 215 +8a518 10 229 236 +8a528 8 228 236 +8a530 4 69 215 +8a534 10 120 215 +8a544 4 97 224 +8a548 8 90 215 +8a550 4 66 215 +8a554 c 97 224 +8a560 c 97 224 +8a56c 4 105 224 +8a570 8 72 224 +8a578 4 112 224 +8a57c 10 113 224 +8a58c 4 68 215 +8a590 10 229 236 +8a5a0 8 228 236 +8a5a8 4 69 215 +8a5ac 10 120 215 +8a5bc 4 87 224 +8a5c0 8 90 215 +8a5c8 4 66 215 +8a5cc c 87 224 +8a5d8 c 87 224 +8a5e4 4 91 224 +8a5e8 8 72 224 +8a5f0 4 112 224 +8a5f4 10 113 224 +8a604 4 68 215 +8a608 10 229 236 +8a618 8 228 236 +8a620 4 69 215 +8a624 4 72 224 +8a628 8 69 215 +8a630 4 112 224 +8a634 10 113 224 +8a644 2c 234 236 +8a670 4 66 215 +8a674 c 97 224 +8a680 20 90 215 +8a6a0 4 66 215 +8a6a4 c 87 224 +8a6b0 18 90 215 +8a6c8 4 228 236 +8a6cc c 229 236 +8a6d8 4 228 236 +8a6dc c 229 236 +8a6e8 4 228 236 +8a6ec 24 229 236 +8a710 10 235 236 +FUNC 8a720 5e0 0 std::priv::__do_get_integer >, long long unsigned int, wchar_t> +8a720 20 247 224 +8a740 4 145 212 +8a744 10 247 224 +8a754 8 145 212 +8a75c c 247 224 +8a768 8 247 224 +8a770 4 145 212 +8a774 10 351 219 +8a784 4 258 224 +8a788 4 351 219 +8a78c 14 258 224 +8a7a0 8 112 215 +8a7a8 4 259 224 +8a7ac c 112 215 +8a7b8 4 263 224 +8a7bc 4 265 224 +8a7c0 4 266 224 +8a7c4 4 287 224 +8a7c8 4 287 224 +8a7cc 4 75 215 +8a7d0 4 287 224 +8a7d4 4 75 215 +8a7d8 8 90 215 +8a7e0 8 77 215 +8a7e8 c 90 215 +8a7f4 c 289 224 +8a800 10 290 224 +8a810 4 291 224 +8a814 4 291 224 +8a818 4 291 224 +8a81c 34 292 224 +8a850 1c 235 236 +8a86c 4 93 215 +8a870 4 95 215 +8a874 4 94 215 +8a878 8 95 215 +8a880 10 351 219 +8a890 4 275 224 +8a894 4 351 219 +8a898 4 86 228 +8a89c 4 275 224 +8a8a0 4 86 228 +8a8a4 8 275 224 +8a8ac 4 86 228 +8a8b0 8 87 228 +8a8b8 4 86 228 +8a8bc 14 87 228 +8a8d0 4 188 224 +8a8d4 4 183 224 +8a8d8 8 182 224 +8a8e0 4 185 224 +8a8e4 4 95 215 +8a8e8 4 181 224 +8a8ec c 188 224 +8a8f8 c 186 224 +8a904 8 183 224 +8a90c 4 188 224 +8a910 4 183 224 +8a914 14 188 224 +8a928 4 75 215 +8a92c 8 90 215 +8a934 8 77 215 +8a93c c 90 215 +8a948 c 190 224 +8a954 c 90 215 +8a960 c 194 224 +8a96c 8 195 224 +8a974 4 196 224 +8a978 4 68 215 +8a97c 10 229 236 +8a98c c 228 236 +8a998 8 69 215 +8a9a0 1c 235 236 +8a9bc 4 94 215 +8a9c0 4 93 215 +8a9c4 4 190 224 +8a9c8 4 95 215 +8a9cc c 190 224 +8a9d8 4 218 224 +8a9dc c 218 224 +8a9e8 8 219 224 +8a9f0 4 223 224 +8a9f4 10 224 224 +8aa04 14 233 224 +8aa18 8 224 224 +8aa20 4 233 224 +8aa24 18 233 224 +8aa3c 4 64 239 +8aa40 10 96 239 +8aa50 10 97 239 +8aa60 14 287 224 +8aa74 4 52 224 +8aa78 4 52 224 +8aa7c 4 52 224 +8aa80 c 202 224 +8aa8c 4 208 224 +8aa90 4 206 224 +8aa94 4 205 224 +8aa98 4 206 224 +8aa9c 8 208 224 +8aaa4 8 211 224 +8aaac 4 212 224 +8aab0 4 213 224 +8aab4 4 214 224 +8aab8 10 213 224 +8aac8 4 68 215 +8aacc 10 229 236 +8aadc 4 228 236 +8aae0 c 229 236 +8aaec 8 69 215 +8aaf4 4 92 215 +8aaf8 1c 235 236 +8ab14 4 93 215 +8ab18 4 94 215 +8ab1c 8 95 215 +8ab24 1c 235 236 +8ab40 4 93 215 +8ab44 4 94 215 +8ab48 8 95 215 +8ab50 c 209 224 +8ab5c c 52 224 +8ab68 8 214 224 +8ab70 60 234 236 +8abd0 1c 235 236 +8abec 4 93 215 +8abf0 4 95 215 +8abf4 4 94 215 +8abf8 8 95 215 +8ac00 10 224 224 +8ac10 24 234 236 +8ac34 8 287 224 +8ac3c 24 234 236 +8ac60 34 235 236 +8ac94 8 218 224 +8ac9c 20 235 236 +8acbc 8 64 239 +8acc4 10 96 239 +8acd4 14 97 239 +8ace8 18 291 224 +FUNC 8ad00 34 0 std::num_get > >::do_get +8ad00 8 611 224 +8ad08 4 614 224 +8ad0c 8 611 224 +8ad14 20 614 224 +FUNC 8ad34 54 0 std::num_get > >::do_get +8ad34 8 587 224 +8ad3c 4 595 224 +8ad40 8 587 224 +8ad48 18 595 224 +8ad60 4 587 224 +8ad64 4 595 224 +8ad68 c 596 224 +8ad74 c 597 224 +8ad80 8 599 224 +FUNC 8ad88 5f8 0 std::priv::__do_get_integer >, long long int, wchar_t> +8ad88 20 247 224 +8ada8 4 145 212 +8adac 10 247 224 +8adbc 8 145 212 +8adc4 c 247 224 +8add0 4 247 224 +8add4 4 145 212 +8add8 10 351 219 +8ade8 4 258 224 +8adec 4 351 219 +8adf0 14 258 224 +8ae04 4 75 215 +8ae08 4 259 224 +8ae0c 4 75 215 +8ae10 8 90 215 +8ae18 8 77 215 +8ae20 c 90 215 +8ae2c c 263 224 +8ae38 8 265 224 +8ae40 8 266 224 +8ae48 4 287 224 +8ae4c 4 287 224 +8ae50 4 112 215 +8ae54 4 287 224 +8ae58 c 112 215 +8ae64 4 289 224 +8ae68 c 290 224 +8ae74 4 291 224 +8ae78 4 291 224 +8ae7c 4 291 224 +8ae80 34 292 224 +8aeb4 1c 235 236 +8aed0 4 94 215 +8aed4 4 93 215 +8aed8 8 95 215 +8aee0 c 263 224 +8aeec 10 351 219 +8aefc 4 275 224 +8af00 4 351 219 +8af04 4 275 224 +8af08 c 86 228 +8af14 8 87 228 +8af1c 4 86 228 +8af20 14 87 228 +8af34 4 128 224 +8af38 4 123 224 +8af3c 4 128 224 +8af40 4 122 224 +8af44 4 128 224 +8af48 c 126 224 +8af54 4 123 224 +8af58 4 125 224 +8af5c 8 121 224 +8af64 4 123 224 +8af68 4 95 215 +8af6c 8 123 224 +8af74 18 128 224 +8af8c 4 75 215 +8af90 8 90 215 +8af98 8 77 215 +8afa0 c 90 215 +8afac c 130 224 +8afb8 c 90 215 +8afc4 10 134 224 +8afd4 8 135 224 +8afdc 4 136 224 +8afe0 4 68 215 +8afe4 10 229 236 +8aff4 c 228 236 +8b000 8 69 215 +8b008 1c 235 236 +8b024 4 94 215 +8b028 4 93 215 +8b02c 4 130 224 +8b030 4 95 215 +8b034 8 130 224 +8b03c 4 158 224 +8b040 4 130 224 +8b044 4 158 224 +8b048 c 158 224 +8b054 8 159 224 +8b05c 4 163 224 +8b060 8 274 224 +8b068 c 164 224 +8b074 10 173 224 +8b084 c 164 224 +8b090 8 173 224 +8b098 4 96 239 +8b09c 4 64 239 +8b0a0 c 96 239 +8b0ac 10 97 239 +8b0bc 10 287 224 +8b0cc 4 52 224 +8b0d0 4 52 224 +8b0d4 4 52 224 +8b0d8 8 142 224 +8b0e0 4 148 224 +8b0e4 4 146 224 +8b0e8 4 145 224 +8b0ec 4 146 224 +8b0f0 8 148 224 +8b0f8 c 151 224 +8b104 4 152 224 +8b108 4 153 224 +8b10c 4 154 224 +8b110 10 153 224 +8b120 4 68 215 +8b124 10 229 236 +8b134 4 228 236 +8b138 c 229 236 +8b144 8 69 215 +8b14c 4 92 215 +8b150 1c 235 236 +8b16c 4 93 215 +8b170 4 94 215 +8b174 8 95 215 +8b17c 1c 235 236 +8b198 4 93 215 +8b19c 4 94 215 +8b1a0 8 95 215 +8b1a8 c 149 224 +8b1b4 c 52 224 +8b1c0 8 154 224 +8b1c8 60 234 236 +8b228 1c 235 236 +8b244 4 93 215 +8b248 4 95 215 +8b24c 4 94 215 +8b250 8 95 215 +8b258 10 164 224 +8b268 8 164 224 +8b270 8 173 224 +8b278 24 234 236 +8b29c 8 287 224 +8b2a4 24 234 236 +8b2c8 20 235 236 +8b2e8 18 173 224 +8b300 14 235 236 +8b314 8 158 224 +8b31c 24 235 236 +8b340 4 64 239 +8b344 10 96 239 +8b354 14 97 239 +8b368 18 291 224 +FUNC 8b380 34 0 std::num_get > >::do_get +8b380 8 604 224 +8b388 4 607 224 +8b38c 8 604 224 +8b394 20 607 224 +FUNC 8b3b4 5e0 0 std::priv::__do_get_integer >, long unsigned int, wchar_t> +8b3b4 20 247 224 +8b3d4 4 145 212 +8b3d8 10 247 224 +8b3e8 8 145 212 +8b3f0 c 247 224 +8b3fc 8 247 224 +8b404 4 145 212 +8b408 10 351 219 +8b418 4 258 224 +8b41c 4 351 219 +8b420 14 258 224 +8b434 8 112 215 +8b43c 4 259 224 +8b440 c 112 215 +8b44c 4 263 224 +8b450 4 265 224 +8b454 4 266 224 +8b458 4 287 224 +8b45c 4 287 224 +8b460 4 75 215 +8b464 4 287 224 +8b468 4 75 215 +8b46c 8 90 215 +8b474 8 77 215 +8b47c c 90 215 +8b488 c 289 224 +8b494 10 290 224 +8b4a4 4 291 224 +8b4a8 4 291 224 +8b4ac 4 291 224 +8b4b0 34 292 224 +8b4e4 1c 235 236 +8b500 4 93 215 +8b504 4 95 215 +8b508 4 94 215 +8b50c 8 95 215 +8b514 10 351 219 +8b524 4 275 224 +8b528 4 351 219 +8b52c 4 86 228 +8b530 4 275 224 +8b534 4 86 228 +8b538 8 275 224 +8b540 4 86 228 +8b544 8 87 228 +8b54c 4 86 228 +8b550 14 87 228 +8b564 4 188 224 +8b568 4 183 224 +8b56c 8 182 224 +8b574 4 185 224 +8b578 4 95 215 +8b57c 4 181 224 +8b580 c 188 224 +8b58c c 186 224 +8b598 8 183 224 +8b5a0 4 188 224 +8b5a4 4 183 224 +8b5a8 14 188 224 +8b5bc 4 75 215 +8b5c0 8 90 215 +8b5c8 8 77 215 +8b5d0 c 90 215 +8b5dc c 190 224 +8b5e8 c 90 215 +8b5f4 c 194 224 +8b600 8 195 224 +8b608 4 196 224 +8b60c 4 68 215 +8b610 10 229 236 +8b620 c 228 236 +8b62c 8 69 215 +8b634 1c 235 236 +8b650 4 94 215 +8b654 4 93 215 +8b658 4 190 224 +8b65c 4 95 215 +8b660 c 190 224 +8b66c 4 218 224 +8b670 c 218 224 +8b67c 8 219 224 +8b684 4 223 224 +8b688 10 224 224 +8b698 14 233 224 +8b6ac 8 224 224 +8b6b4 4 233 224 +8b6b8 18 233 224 +8b6d0 4 64 239 +8b6d4 10 96 239 +8b6e4 10 97 239 +8b6f4 14 287 224 +8b708 4 52 224 +8b70c 4 52 224 +8b710 4 52 224 +8b714 c 202 224 +8b720 4 208 224 +8b724 4 206 224 +8b728 4 205 224 +8b72c 4 206 224 +8b730 8 208 224 +8b738 8 211 224 +8b740 4 212 224 +8b744 4 213 224 +8b748 4 214 224 +8b74c 10 213 224 +8b75c 4 68 215 +8b760 10 229 236 +8b770 4 228 236 +8b774 c 229 236 +8b780 8 69 215 +8b788 4 92 215 +8b78c 1c 235 236 +8b7a8 4 93 215 +8b7ac 4 94 215 +8b7b0 8 95 215 +8b7b8 1c 235 236 +8b7d4 4 93 215 +8b7d8 4 94 215 +8b7dc 8 95 215 +8b7e4 c 209 224 +8b7f0 c 52 224 +8b7fc 8 214 224 +8b804 60 234 236 +8b864 1c 235 236 +8b880 4 93 215 +8b884 4 95 215 +8b888 4 94 215 +8b88c 8 95 215 +8b894 10 224 224 +8b8a4 24 234 236 +8b8c8 8 287 224 +8b8d0 24 234 236 +8b8f4 34 235 236 +8b928 8 218 224 +8b930 20 235 236 +8b950 8 64 239 +8b958 10 96 239 +8b968 14 97 239 +8b97c 18 291 224 +FUNC 8b994 34 0 std::num_get > >::do_get +8b994 8 557 224 +8b99c 4 560 224 +8b9a0 8 557 224 +8b9a8 20 560 224 +FUNC 8b9c8 5d0 0 std::priv::__do_get_integer >, unsigned int, wchar_t> +8b9c8 20 247 224 +8b9e8 4 145 212 +8b9ec 10 247 224 +8b9fc 8 145 212 +8ba04 c 247 224 +8ba10 4 247 224 +8ba14 4 145 212 +8ba18 10 351 219 +8ba28 4 258 224 +8ba2c 4 351 219 +8ba30 14 258 224 +8ba44 4 75 215 +8ba48 4 259 224 +8ba4c 4 75 215 +8ba50 8 90 215 +8ba58 8 77 215 +8ba60 c 90 215 +8ba6c c 263 224 +8ba78 8 265 224 +8ba80 8 266 224 +8ba88 4 287 224 +8ba8c 4 287 224 +8ba90 4 112 215 +8ba94 4 287 224 +8ba98 c 112 215 +8baa4 4 289 224 +8baa8 c 290 224 +8bab4 4 291 224 +8bab8 4 291 224 +8babc 4 291 224 +8bac0 34 292 224 +8baf4 1c 235 236 +8bb10 4 94 215 +8bb14 4 93 215 +8bb18 8 95 215 +8bb20 c 263 224 +8bb2c 10 351 219 +8bb3c 4 275 224 +8bb40 4 351 219 +8bb44 4 86 228 +8bb48 4 275 224 +8bb4c 4 86 228 +8bb50 4 275 224 +8bb54 4 86 228 +8bb58 8 87 228 +8bb60 4 86 228 +8bb64 14 87 228 +8bb78 4 186 224 +8bb7c 4 183 224 +8bb80 4 186 224 +8bb84 4 185 224 +8bb88 4 186 224 +8bb8c 4 183 224 +8bb90 8 181 224 +8bb98 4 183 224 +8bb9c 8 188 224 +8bba4 4 183 224 +8bba8 4 182 224 +8bbac 4 95 215 +8bbb0 14 188 224 +8bbc4 4 75 215 +8bbc8 8 90 215 +8bbd0 8 77 215 +8bbd8 c 90 215 +8bbe4 c 190 224 +8bbf0 c 90 215 +8bbfc c 194 224 +8bc08 8 195 224 +8bc10 4 196 224 +8bc14 4 68 215 +8bc18 10 229 236 +8bc28 c 228 236 +8bc34 8 69 215 +8bc3c 1c 235 236 +8bc58 4 94 215 +8bc5c 4 93 215 +8bc60 4 190 224 +8bc64 4 95 215 +8bc68 c 190 224 +8bc74 4 218 224 +8bc78 c 218 224 +8bc84 8 219 224 +8bc8c 4 223 224 +8bc90 c 224 224 +8bc9c 14 233 224 +8bcb0 8 224 224 +8bcb8 4 233 224 +8bcbc 4 96 239 +8bcc0 4 64 239 +8bcc4 c 96 239 +8bcd0 10 97 239 +8bce0 10 287 224 +8bcf0 4 52 224 +8bcf4 4 52 224 +8bcf8 4 52 224 +8bcfc c 202 224 +8bd08 4 208 224 +8bd0c 4 206 224 +8bd10 4 205 224 +8bd14 4 206 224 +8bd18 8 208 224 +8bd20 8 211 224 +8bd28 4 212 224 +8bd2c 4 213 224 +8bd30 4 214 224 +8bd34 10 213 224 +8bd44 4 68 215 +8bd48 10 229 236 +8bd58 4 228 236 +8bd5c c 229 236 +8bd68 8 69 215 +8bd70 4 92 215 +8bd74 1c 235 236 +8bd90 4 93 215 +8bd94 4 94 215 +8bd98 8 95 215 +8bda0 1c 235 236 +8bdbc 4 93 215 +8bdc0 4 94 215 +8bdc4 8 95 215 +8bdcc c 209 224 +8bdd8 c 52 224 +8bde4 8 214 224 +8bdec 60 234 236 +8be4c 1c 235 236 +8be68 4 93 215 +8be6c 4 95 215 +8be70 4 94 215 +8be74 8 95 215 +8be7c c 224 224 +8be88 8 233 224 +8be90 24 234 236 +8beb4 8 287 224 +8bebc 24 234 236 +8bee0 20 235 236 +8bf00 18 233 224 +8bf18 14 235 236 +8bf2c 8 218 224 +8bf34 24 235 236 +8bf58 4 64 239 +8bf5c 10 96 239 +8bf6c 14 97 239 +8bf80 18 291 224 +FUNC 8bf98 34 0 std::num_get > >::do_get +8bf98 8 550 224 +8bfa0 4 553 224 +8bfa4 8 550 224 +8bfac 20 553 224 +FUNC 8bfcc 4f4 0 std::priv::__do_get_integer >, short unsigned int, wchar_t> +8bfcc 20 247 224 +8bfec 4 145 212 +8bff0 10 247 224 +8c000 8 145 212 +8c008 c 247 224 +8c014 8 247 224 +8c01c 4 145 212 +8c020 10 351 219 +8c030 4 258 224 +8c034 4 351 219 +8c038 14 258 224 +8c04c 8 112 215 +8c054 4 259 224 +8c058 c 112 215 +8c064 4 263 224 +8c068 4 265 224 +8c06c 4 266 224 +8c070 4 287 224 +8c074 4 287 224 +8c078 4 112 215 +8c07c 4 287 224 +8c080 c 112 215 +8c08c 4 289 224 +8c090 c 290 224 +8c09c 4 291 224 +8c0a0 4 291 224 +8c0a4 4 291 224 +8c0a8 34 292 224 +8c0dc 10 351 219 +8c0ec 4 275 224 +8c0f0 4 351 219 +8c0f4 4 86 228 +8c0f8 4 275 224 +8c0fc 4 86 228 +8c100 4 275 224 +8c104 4 86 228 +8c108 8 87 228 +8c110 4 86 228 +8c114 14 87 228 +8c128 4 188 224 +8c12c 4 186 224 +8c130 4 183 224 +8c134 8 186 224 +8c13c 4 185 224 +8c140 4 183 224 +8c144 4 182 224 +8c148 4 188 224 +8c14c 4 95 215 +8c150 4 183 224 +8c154 4 188 224 +8c158 8 181 224 +8c160 4 188 224 +8c164 4 183 224 +8c168 10 188 224 +8c178 4 75 215 +8c17c 8 90 215 +8c184 8 77 215 +8c18c c 90 215 +8c198 c 190 224 +8c1a4 c 90 215 +8c1b0 c 194 224 +8c1bc 8 195 224 +8c1c4 4 196 224 +8c1c8 4 68 215 +8c1cc 10 229 236 +8c1dc c 228 236 +8c1e8 8 69 215 +8c1f0 1c 235 236 +8c20c 4 94 215 +8c210 4 93 215 +8c214 4 190 224 +8c218 4 95 215 +8c21c c 190 224 +8c228 4 218 224 +8c22c c 218 224 +8c238 8 219 224 +8c240 4 223 224 +8c244 10 224 224 +8c254 14 233 224 +8c268 8 224 224 +8c270 4 233 224 +8c274 18 233 224 +8c28c 4 96 239 +8c290 4 64 239 +8c294 c 96 239 +8c2a0 10 97 239 +8c2b0 14 287 224 +8c2c4 4 52 224 +8c2c8 4 52 224 +8c2cc 4 52 224 +8c2d0 c 202 224 +8c2dc 4 208 224 +8c2e0 4 206 224 +8c2e4 4 205 224 +8c2e8 4 206 224 +8c2ec 8 208 224 +8c2f4 10 211 224 +8c304 4 212 224 +8c308 8 213 224 +8c310 4 214 224 +8c314 c 213 224 +8c320 4 68 215 +8c324 10 229 236 +8c334 4 228 236 +8c338 c 229 236 +8c344 8 69 215 +8c34c 4 92 215 +8c350 1c 235 236 +8c36c 4 93 215 +8c370 4 94 215 +8c374 8 95 215 +8c37c 1c 235 236 +8c398 4 93 215 +8c39c 4 94 215 +8c3a0 8 95 215 +8c3a8 c 209 224 +8c3b4 c 52 224 +8c3c0 8 214 224 +8c3c8 60 234 236 +8c428 10 224 224 +8c438 8 287 224 +8c440 34 235 236 +8c474 c 218 224 +8c480 4 64 239 +8c484 10 96 239 +8c494 14 97 239 +8c4a8 18 291 224 +FUNC 8c4c0 34 0 std::num_get > >::do_get +8c4c0 8 543 224 +8c4c8 4 546 224 +8c4cc 8 543 224 +8c4d4 20 546 224 +FUNC 8c4f4 5f8 0 std::priv::__do_get_integer >, long int, wchar_t> +8c4f4 20 247 224 +8c514 4 145 212 +8c518 10 247 224 +8c528 8 145 212 +8c530 c 247 224 +8c53c 8 247 224 +8c544 4 145 212 +8c548 10 351 219 +8c558 4 258 224 +8c55c 4 351 219 +8c560 14 258 224 +8c574 8 112 215 +8c57c 4 259 224 +8c580 c 112 215 +8c58c 4 263 224 +8c590 4 265 224 +8c594 4 266 224 +8c598 4 287 224 +8c59c 4 287 224 +8c5a0 4 75 215 +8c5a4 4 287 224 +8c5a8 4 75 215 +8c5ac 8 90 215 +8c5b4 8 77 215 +8c5bc c 90 215 +8c5c8 c 289 224 +8c5d4 10 290 224 +8c5e4 4 291 224 +8c5e8 4 291 224 +8c5ec 4 291 224 +8c5f0 34 292 224 +8c624 1c 235 236 +8c640 4 93 215 +8c644 4 95 215 +8c648 4 94 215 +8c64c 8 95 215 +8c654 10 351 219 +8c664 4 275 224 +8c668 4 351 219 +8c66c 4 275 224 +8c670 c 86 228 +8c67c 8 87 228 +8c684 4 86 228 +8c688 14 87 228 +8c69c 4 128 224 +8c6a0 4 123 224 +8c6a4 4 128 224 +8c6a8 4 122 224 +8c6ac 4 128 224 +8c6b0 c 126 224 +8c6bc 4 123 224 +8c6c0 4 125 224 +8c6c4 8 121 224 +8c6cc 4 123 224 +8c6d0 4 95 215 +8c6d4 8 123 224 +8c6dc 18 128 224 +8c6f4 4 75 215 +8c6f8 8 90 215 +8c700 8 77 215 +8c708 c 90 215 +8c714 c 130 224 +8c720 c 90 215 +8c72c 10 134 224 +8c73c 8 135 224 +8c744 4 136 224 +8c748 4 68 215 +8c74c 10 229 236 +8c75c c 228 236 +8c768 8 69 215 +8c770 1c 235 236 +8c78c 4 94 215 +8c790 4 93 215 +8c794 4 130 224 +8c798 4 95 215 +8c79c 8 130 224 +8c7a4 4 158 224 +8c7a8 4 130 224 +8c7ac 4 158 224 +8c7b0 c 158 224 +8c7bc 8 159 224 +8c7c4 4 163 224 +8c7c8 8 274 224 +8c7d0 c 164 224 +8c7dc 14 173 224 +8c7f0 c 164 224 +8c7fc 8 173 224 +8c804 18 173 224 +8c81c 4 64 239 +8c820 10 96 239 +8c830 10 97 239 +8c840 14 287 224 +8c854 4 52 224 +8c858 4 52 224 +8c85c 4 52 224 +8c860 8 142 224 +8c868 4 148 224 +8c86c 4 146 224 +8c870 4 145 224 +8c874 4 146 224 +8c878 8 148 224 +8c880 c 151 224 +8c88c 4 152 224 +8c890 4 153 224 +8c894 4 154 224 +8c898 10 153 224 +8c8a8 4 68 215 +8c8ac 10 229 236 +8c8bc 4 228 236 +8c8c0 c 229 236 +8c8cc 8 69 215 +8c8d4 4 92 215 +8c8d8 1c 235 236 +8c8f4 4 93 215 +8c8f8 4 94 215 +8c8fc 8 95 215 +8c904 1c 235 236 +8c920 4 93 215 +8c924 4 94 215 +8c928 8 95 215 +8c930 c 149 224 +8c93c c 52 224 +8c948 8 154 224 +8c950 60 234 236 +8c9b0 1c 235 236 +8c9cc 4 93 215 +8c9d0 4 95 215 +8c9d4 4 94 215 +8c9d8 8 95 215 +8c9e0 10 164 224 +8c9f0 c 164 224 +8c9fc 24 234 236 +8ca20 8 287 224 +8ca28 24 234 236 +8ca4c 34 235 236 +8ca80 8 158 224 +8ca88 20 235 236 +8caa8 8 64 239 +8cab0 10 96 239 +8cac0 14 97 239 +8cad4 18 291 224 +FUNC 8caec 34 0 std::num_get > >::do_get +8caec 8 537 224 +8caf4 4 539 224 +8caf8 8 537 224 +8cb00 20 539 224 +FUNC 8cb20 a8 0 std::num_get > >::do_get +8cb20 8 499 224 +8cb28 4 501 224 +8cb2c 8 499 224 +8cb34 4 501 224 +8cb38 24 506 224 +8cb5c 14 507 224 +8cb70 8 508 224 +8cb78 8 510 224 +8cb80 8 513 224 +8cb88 8 517 224 +8cb90 1c 502 224 +8cbac 8 517 224 +8cbb4 4 509 224 +8cbb8 8 517 224 +8cbc0 8 511 224 +FUNC 8cbc8 3e4 0 std::priv::__get_base_or_zero >, char> +8cbc8 10 56 224 +8cbd8 10 56 224 +8cbe8 8 59 224 +8cbf0 4 59 224 +8cbf4 4 59 224 +8cbf8 1c 103 207 +8cc14 c 90 215 +8cc20 c 64 224 +8cc2c 10 68 224 +8cc3c 4 74 224 +8cc40 18 76 224 +8cc58 10 120 215 +8cc68 4 95 224 +8cc6c 8 90 215 +8cc74 10 95 224 +8cc84 4 91 224 +8cc88 8 72 224 +8cc90 4 112 224 +8cc94 10 113 224 +8cca4 4 92 215 +8cca8 14 235 236 +8ccbc 4 94 215 +8ccc0 4 95 215 +8ccc4 4 64 224 +8ccc8 4 93 215 +8cccc 4 95 215 +8ccd0 8 64 224 +8ccd8 4 68 215 +8ccdc 10 229 236 +8ccec 8 228 236 +8ccf4 4 74 224 +8ccf8 4 69 215 +8ccfc 4 76 224 +8cd00 4 69 215 +8cd04 4 76 224 +8cd08 10 120 215 +8cd18 4 85 224 +8cd1c 8 90 215 +8cd24 10 85 224 +8cd34 c 72 224 +8cd40 4 112 224 +8cd44 10 113 224 +8cd54 4 68 215 +8cd58 10 229 236 +8cd68 8 228 236 +8cd70 c 69 215 +8cd7c 4 228 236 +8cd80 c 229 236 +8cd8c 4 228 236 +8cd90 c 229 236 +8cd9c 4 68 215 +8cda0 10 229 236 +8cdb0 8 228 236 +8cdb8 4 69 215 +8cdbc 10 120 215 +8cdcc 4 97 224 +8cdd0 8 90 215 +8cdd8 4 66 215 +8cddc c 97 224 +8cde8 c 97 224 +8cdf4 4 105 224 +8cdf8 8 72 224 +8ce00 4 112 224 +8ce04 10 113 224 +8ce14 4 68 215 +8ce18 10 229 236 +8ce28 8 228 236 +8ce30 4 69 215 +8ce34 10 120 215 +8ce44 4 87 224 +8ce48 8 90 215 +8ce50 4 66 215 +8ce54 c 87 224 +8ce60 c 87 224 +8ce6c 4 91 224 +8ce70 8 72 224 +8ce78 4 112 224 +8ce7c 10 113 224 +8ce8c 4 68 215 +8ce90 10 229 236 +8cea0 8 228 236 +8cea8 4 69 215 +8ceac 4 72 224 +8ceb0 8 69 215 +8ceb8 4 112 224 +8cebc 10 113 224 +8cecc 2c 234 236 +8cef8 4 66 215 +8cefc c 97 224 +8cf08 20 90 215 +8cf28 4 66 215 +8cf2c c 87 224 +8cf38 18 90 215 +8cf50 4 228 236 +8cf54 c 229 236 +8cf60 4 228 236 +8cf64 c 229 236 +8cf70 4 228 236 +8cf74 24 229 236 +8cf98 14 235 236 +FUNC 8cfac 5c4 0 std::priv::__do_get_integer >, long long unsigned int, char> +8cfac 20 247 224 +8cfcc 4 145 212 +8cfd0 10 247 224 +8cfe0 8 145 212 +8cfe8 c 247 224 +8cff4 8 247 224 +8cffc 4 145 212 +8d000 10 351 219 +8d010 4 258 224 +8d014 4 351 219 +8d018 14 258 224 +8d02c 8 112 215 +8d034 4 259 224 +8d038 c 112 215 +8d044 4 263 224 +8d048 4 265 224 +8d04c 4 266 224 +8d050 4 287 224 +8d054 4 287 224 +8d058 4 75 215 +8d05c 4 287 224 +8d060 4 75 215 +8d064 8 90 215 +8d06c 8 77 215 +8d074 c 90 215 +8d080 c 289 224 +8d08c 10 290 224 +8d09c 4 291 224 +8d0a0 4 291 224 +8d0a4 4 291 224 +8d0a8 34 292 224 +8d0dc 14 235 236 +8d0f0 4 93 215 +8d0f4 4 95 215 +8d0f8 4 94 215 +8d0fc 8 95 215 +8d104 10 351 219 +8d114 4 275 224 +8d118 4 351 219 +8d11c 4 57 228 +8d120 4 275 224 +8d124 4 57 228 +8d128 8 275 224 +8d130 4 57 228 +8d134 8 58 228 +8d13c 4 57 228 +8d140 14 58 228 +8d154 4 188 224 +8d158 4 183 224 +8d15c 4 182 224 +8d160 4 185 224 +8d164 4 95 215 +8d168 4 181 224 +8d16c c 188 224 +8d178 c 186 224 +8d184 8 183 224 +8d18c 8 188 224 +8d194 4 183 224 +8d198 14 188 224 +8d1ac 4 75 215 +8d1b0 8 90 215 +8d1b8 8 77 215 +8d1c0 c 90 215 +8d1cc c 190 224 +8d1d8 c 90 215 +8d1e4 c 194 224 +8d1f0 8 195 224 +8d1f8 4 196 224 +8d1fc 4 68 215 +8d200 10 229 236 +8d210 8 228 236 +8d218 8 69 215 +8d220 14 235 236 +8d234 4 93 215 +8d238 4 94 215 +8d23c 4 95 215 +8d240 10 190 224 +8d250 4 218 224 +8d254 c 218 224 +8d260 8 219 224 +8d268 4 223 224 +8d26c 10 224 224 +8d27c 14 233 224 +8d290 8 224 224 +8d298 4 233 224 +8d29c 18 233 224 +8d2b4 4 64 239 +8d2b8 10 96 239 +8d2c8 10 97 239 +8d2d8 14 287 224 +8d2ec 4 52 224 +8d2f0 4 52 224 +8d2f4 4 52 224 +8d2f8 c 202 224 +8d304 4 208 224 +8d308 4 206 224 +8d30c 4 205 224 +8d310 4 206 224 +8d314 8 208 224 +8d31c 8 211 224 +8d324 4 212 224 +8d328 4 213 224 +8d32c 4 214 224 +8d330 10 213 224 +8d340 4 68 215 +8d344 10 229 236 +8d354 4 228 236 +8d358 c 229 236 +8d364 8 69 215 +8d36c 4 92 215 +8d370 14 235 236 +8d384 4 93 215 +8d388 4 94 215 +8d38c 8 95 215 +8d394 14 235 236 +8d3a8 4 93 215 +8d3ac 4 94 215 +8d3b0 8 95 215 +8d3b8 c 209 224 +8d3c4 c 52 224 +8d3d0 8 214 224 +8d3d8 60 234 236 +8d438 14 235 236 +8d44c 4 93 215 +8d450 4 95 215 +8d454 4 94 215 +8d458 8 95 215 +8d460 10 224 224 +8d470 24 234 236 +8d494 8 287 224 +8d49c 24 234 236 +8d4c0 3c 235 236 +8d4fc 8 218 224 +8d504 28 235 236 +8d52c 8 64 239 +8d534 10 96 239 +8d544 14 97 239 +8d558 18 291 224 +FUNC 8d570 34 0 std::num_get > >::do_get +8d570 8 611 224 +8d578 4 614 224 +8d57c 8 611 224 +8d584 20 614 224 +FUNC 8d5a4 54 0 std::num_get > >::do_get +8d5a4 8 587 224 +8d5ac 4 595 224 +8d5b0 8 587 224 +8d5b8 18 595 224 +8d5d0 4 587 224 +8d5d4 4 595 224 +8d5d8 c 596 224 +8d5e4 c 597 224 +8d5f0 8 599 224 +FUNC 8d5f8 5dc 0 std::priv::__do_get_integer >, long long int, char> +8d5f8 20 247 224 +8d618 4 145 212 +8d61c 10 247 224 +8d62c 8 145 212 +8d634 c 247 224 +8d640 8 247 224 +8d648 4 145 212 +8d64c 10 351 219 +8d65c 4 258 224 +8d660 4 351 219 +8d664 14 258 224 +8d678 8 112 215 +8d680 4 259 224 +8d684 c 112 215 +8d690 4 263 224 +8d694 4 265 224 +8d698 4 266 224 +8d69c 4 287 224 +8d6a0 4 287 224 +8d6a4 4 75 215 +8d6a8 4 287 224 +8d6ac 4 75 215 +8d6b0 8 90 215 +8d6b8 8 77 215 +8d6c0 c 90 215 +8d6cc c 289 224 +8d6d8 10 290 224 +8d6e8 4 291 224 +8d6ec 4 291 224 +8d6f0 4 291 224 +8d6f4 34 292 224 +8d728 14 235 236 +8d73c 4 93 215 +8d740 4 95 215 +8d744 4 94 215 +8d748 8 95 215 +8d750 10 351 219 +8d760 4 275 224 +8d764 4 351 219 +8d768 4 275 224 +8d76c c 57 228 +8d778 8 58 228 +8d780 4 57 228 +8d784 14 58 228 +8d798 4 128 224 +8d79c 4 123 224 +8d7a0 4 128 224 +8d7a4 4 122 224 +8d7a8 4 128 224 +8d7ac c 126 224 +8d7b8 4 123 224 +8d7bc 4 125 224 +8d7c0 4 121 224 +8d7c4 4 95 215 +8d7c8 14 123 224 +8d7dc 14 128 224 +8d7f0 4 75 215 +8d7f4 8 90 215 +8d7fc 8 77 215 +8d804 c 90 215 +8d810 c 130 224 +8d81c c 90 215 +8d828 10 134 224 +8d838 8 135 224 +8d840 4 136 224 +8d844 4 68 215 +8d848 10 229 236 +8d858 8 228 236 +8d860 8 69 215 +8d868 14 235 236 +8d87c 4 93 215 +8d880 4 94 215 +8d884 4 95 215 +8d888 c 130 224 +8d894 4 158 224 +8d898 4 130 224 +8d89c 4 158 224 +8d8a0 c 158 224 +8d8ac 8 159 224 +8d8b4 4 163 224 +8d8b8 8 274 224 +8d8c0 c 164 224 +8d8cc 14 173 224 +8d8e0 c 164 224 +8d8ec 8 173 224 +8d8f4 18 173 224 +8d90c 4 64 239 +8d910 10 96 239 +8d920 10 97 239 +8d930 14 287 224 +8d944 4 52 224 +8d948 4 52 224 +8d94c 4 52 224 +8d950 8 142 224 +8d958 4 148 224 +8d95c 4 146 224 +8d960 4 145 224 +8d964 4 146 224 +8d968 8 148 224 +8d970 c 151 224 +8d97c 4 152 224 +8d980 4 153 224 +8d984 4 154 224 +8d988 10 153 224 +8d998 4 68 215 +8d99c 10 229 236 +8d9ac 4 228 236 +8d9b0 c 229 236 +8d9bc 8 69 215 +8d9c4 4 92 215 +8d9c8 14 235 236 +8d9dc 4 93 215 +8d9e0 4 94 215 +8d9e4 8 95 215 +8d9ec 14 235 236 +8da00 4 93 215 +8da04 4 94 215 +8da08 8 95 215 +8da10 c 149 224 +8da1c c 52 224 +8da28 8 154 224 +8da30 60 234 236 +8da90 14 235 236 +8daa4 4 93 215 +8daa8 4 95 215 +8daac 4 94 215 +8dab0 8 95 215 +8dab8 10 164 224 +8dac8 c 164 224 +8dad4 24 234 236 +8daf8 8 287 224 +8db00 24 234 236 +8db24 3c 235 236 +8db60 8 158 224 +8db68 28 235 236 +8db90 8 64 239 +8db98 10 96 239 +8dba8 14 97 239 +8dbbc 18 291 224 +FUNC 8dbd4 34 0 std::num_get > >::do_get +8dbd4 8 604 224 +8dbdc 4 607 224 +8dbe0 8 604 224 +8dbe8 20 607 224 +FUNC 8dc08 5c4 0 std::priv::__do_get_integer >, long unsigned int, char> +8dc08 20 247 224 +8dc28 4 145 212 +8dc2c 10 247 224 +8dc3c 8 145 212 +8dc44 c 247 224 +8dc50 8 247 224 +8dc58 4 145 212 +8dc5c 10 351 219 +8dc6c 4 258 224 +8dc70 4 351 219 +8dc74 14 258 224 +8dc88 8 112 215 +8dc90 4 259 224 +8dc94 c 112 215 +8dca0 4 263 224 +8dca4 4 265 224 +8dca8 4 266 224 +8dcac 4 287 224 +8dcb0 4 287 224 +8dcb4 4 75 215 +8dcb8 4 287 224 +8dcbc 4 75 215 +8dcc0 8 90 215 +8dcc8 8 77 215 +8dcd0 c 90 215 +8dcdc c 289 224 +8dce8 10 290 224 +8dcf8 4 291 224 +8dcfc 4 291 224 +8dd00 4 291 224 +8dd04 34 292 224 +8dd38 14 235 236 +8dd4c 4 93 215 +8dd50 4 95 215 +8dd54 4 94 215 +8dd58 8 95 215 +8dd60 10 351 219 +8dd70 4 275 224 +8dd74 4 351 219 +8dd78 4 57 228 +8dd7c 4 275 224 +8dd80 4 57 228 +8dd84 8 275 224 +8dd8c 4 57 228 +8dd90 8 58 228 +8dd98 4 57 228 +8dd9c 14 58 228 +8ddb0 4 188 224 +8ddb4 4 183 224 +8ddb8 4 182 224 +8ddbc 4 185 224 +8ddc0 4 95 215 +8ddc4 4 181 224 +8ddc8 c 188 224 +8ddd4 c 186 224 +8dde0 8 183 224 +8dde8 8 188 224 +8ddf0 4 183 224 +8ddf4 14 188 224 +8de08 4 75 215 +8de0c 8 90 215 +8de14 8 77 215 +8de1c c 90 215 +8de28 c 190 224 +8de34 c 90 215 +8de40 c 194 224 +8de4c 8 195 224 +8de54 4 196 224 +8de58 4 68 215 +8de5c 10 229 236 +8de6c 8 228 236 +8de74 8 69 215 +8de7c 14 235 236 +8de90 4 93 215 +8de94 4 94 215 +8de98 4 95 215 +8de9c 10 190 224 +8deac 4 218 224 +8deb0 c 218 224 +8debc 8 219 224 +8dec4 4 223 224 +8dec8 10 224 224 +8ded8 14 233 224 +8deec 8 224 224 +8def4 4 233 224 +8def8 18 233 224 +8df10 4 64 239 +8df14 10 96 239 +8df24 10 97 239 +8df34 14 287 224 +8df48 4 52 224 +8df4c 4 52 224 +8df50 4 52 224 +8df54 c 202 224 +8df60 4 208 224 +8df64 4 206 224 +8df68 4 205 224 +8df6c 4 206 224 +8df70 8 208 224 +8df78 8 211 224 +8df80 4 212 224 +8df84 4 213 224 +8df88 4 214 224 +8df8c 10 213 224 +8df9c 4 68 215 +8dfa0 10 229 236 +8dfb0 4 228 236 +8dfb4 c 229 236 +8dfc0 8 69 215 +8dfc8 4 92 215 +8dfcc 14 235 236 +8dfe0 4 93 215 +8dfe4 4 94 215 +8dfe8 8 95 215 +8dff0 14 235 236 +8e004 4 93 215 +8e008 4 94 215 +8e00c 8 95 215 +8e014 c 209 224 +8e020 c 52 224 +8e02c 8 214 224 +8e034 60 234 236 +8e094 14 235 236 +8e0a8 4 93 215 +8e0ac 4 95 215 +8e0b0 4 94 215 +8e0b4 8 95 215 +8e0bc 10 224 224 +8e0cc 24 234 236 +8e0f0 8 287 224 +8e0f8 24 234 236 +8e11c 3c 235 236 +8e158 8 218 224 +8e160 28 235 236 +8e188 8 64 239 +8e190 10 96 239 +8e1a0 14 97 239 +8e1b4 18 291 224 +FUNC 8e1cc 34 0 std::num_get > >::do_get +8e1cc 8 557 224 +8e1d4 4 560 224 +8e1d8 8 557 224 +8e1e0 20 560 224 +FUNC 8e200 4d4 0 std::priv::__do_get_integer >, unsigned int, char> +8e200 20 247 224 +8e220 4 145 212 +8e224 10 247 224 +8e234 8 145 212 +8e23c c 247 224 +8e248 8 247 224 +8e250 4 145 212 +8e254 10 351 219 +8e264 4 258 224 +8e268 4 351 219 +8e26c 14 258 224 +8e280 8 112 215 +8e288 4 259 224 +8e28c c 112 215 +8e298 4 263 224 +8e29c 4 265 224 +8e2a0 4 266 224 +8e2a4 4 287 224 +8e2a8 4 287 224 +8e2ac 4 112 215 +8e2b0 4 287 224 +8e2b4 c 112 215 +8e2c0 4 289 224 +8e2c4 c 290 224 +8e2d0 4 291 224 +8e2d4 4 291 224 +8e2d8 4 291 224 +8e2dc 34 292 224 +8e310 10 351 219 +8e320 4 275 224 +8e324 4 351 219 +8e328 4 57 228 +8e32c 4 275 224 +8e330 4 57 228 +8e334 4 275 224 +8e338 4 57 228 +8e33c 8 58 228 +8e344 4 57 228 +8e348 14 58 228 +8e35c 4 186 224 +8e360 4 183 224 +8e364 8 186 224 +8e36c 4 183 224 +8e370 4 185 224 +8e374 4 182 224 +8e378 4 95 215 +8e37c 4 183 224 +8e380 8 188 224 +8e388 4 183 224 +8e38c 4 181 224 +8e390 18 188 224 +8e3a8 4 75 215 +8e3ac 8 90 215 +8e3b4 8 77 215 +8e3bc c 90 215 +8e3c8 c 190 224 +8e3d4 c 90 215 +8e3e0 c 194 224 +8e3ec 8 195 224 +8e3f4 4 196 224 +8e3f8 4 68 215 +8e3fc 10 229 236 +8e40c 8 228 236 +8e414 8 69 215 +8e41c 14 235 236 +8e430 4 93 215 +8e434 4 94 215 +8e438 4 95 215 +8e43c 10 190 224 +8e44c 4 218 224 +8e450 c 218 224 +8e45c 8 219 224 +8e464 4 223 224 +8e468 10 224 224 +8e478 14 233 224 +8e48c 8 224 224 +8e494 4 233 224 +8e498 18 233 224 +8e4b0 4 96 239 +8e4b4 4 64 239 +8e4b8 c 96 239 +8e4c4 10 97 239 +8e4d4 14 287 224 +8e4e8 4 52 224 +8e4ec 4 52 224 +8e4f0 4 52 224 +8e4f4 c 202 224 +8e500 4 208 224 +8e504 4 206 224 +8e508 4 205 224 +8e50c 4 206 224 +8e510 8 208 224 +8e518 8 211 224 +8e520 4 212 224 +8e524 4 213 224 +8e528 4 214 224 +8e52c 10 213 224 +8e53c 4 68 215 +8e540 10 229 236 +8e550 4 228 236 +8e554 c 229 236 +8e560 8 69 215 +8e568 4 92 215 +8e56c 14 235 236 +8e580 4 93 215 +8e584 4 94 215 +8e588 8 95 215 +8e590 14 235 236 +8e5a4 4 93 215 +8e5a8 4 94 215 +8e5ac 8 95 215 +8e5b4 c 209 224 +8e5c0 c 52 224 +8e5cc 8 214 224 +8e5d4 60 234 236 +8e634 10 224 224 +8e644 8 287 224 +8e64c 3c 235 236 +8e688 c 218 224 +8e694 4 64 239 +8e698 10 96 239 +8e6a8 14 97 239 +8e6bc 18 291 224 +FUNC 8e6d4 34 0 std::num_get > >::do_get +8e6d4 8 550 224 +8e6dc 4 553 224 +8e6e0 8 550 224 +8e6e8 20 553 224 +FUNC 8e708 5c0 0 std::priv::__do_get_integer >, short unsigned int, char> +8e708 20 247 224 +8e728 4 145 212 +8e72c 10 247 224 +8e73c 8 145 212 +8e744 c 247 224 +8e750 4 247 224 +8e754 4 145 212 +8e758 10 351 219 +8e768 4 258 224 +8e76c 4 351 219 +8e770 14 258 224 +8e784 4 75 215 +8e788 4 259 224 +8e78c 4 75 215 +8e790 8 90 215 +8e798 8 77 215 +8e7a0 c 90 215 +8e7ac c 263 224 +8e7b8 8 265 224 +8e7c0 8 266 224 +8e7c8 4 287 224 +8e7cc 4 287 224 +8e7d0 4 112 215 +8e7d4 4 287 224 +8e7d8 c 112 215 +8e7e4 4 289 224 +8e7e8 c 290 224 +8e7f4 4 291 224 +8e7f8 4 291 224 +8e7fc 4 291 224 +8e800 34 292 224 +8e834 14 235 236 +8e848 4 93 215 +8e84c 4 95 215 +8e850 4 94 215 +8e854 4 95 215 +8e858 c 263 224 +8e864 10 351 219 +8e874 4 275 224 +8e878 4 351 219 +8e87c 4 57 228 +8e880 4 275 224 +8e884 4 57 228 +8e888 4 275 224 +8e88c 4 57 228 +8e890 8 58 228 +8e898 4 57 228 +8e89c 14 58 228 +8e8b0 4 186 224 +8e8b4 4 188 224 +8e8b8 4 186 224 +8e8bc 4 183 224 +8e8c0 4 186 224 +8e8c4 4 183 224 +8e8c8 4 185 224 +8e8cc 4 95 215 +8e8d0 4 183 224 +8e8d4 8 188 224 +8e8dc 4 183 224 +8e8e0 4 181 224 +8e8e4 4 182 224 +8e8e8 18 188 224 +8e900 4 75 215 +8e904 8 90 215 +8e90c 8 77 215 +8e914 c 90 215 +8e920 c 190 224 +8e92c c 90 215 +8e938 c 194 224 +8e944 8 195 224 +8e94c 4 196 224 +8e950 4 68 215 +8e954 10 229 236 +8e964 8 228 236 +8e96c 8 69 215 +8e974 14 235 236 +8e988 4 93 215 +8e98c 4 94 215 +8e990 4 95 215 +8e994 10 190 224 +8e9a4 4 218 224 +8e9a8 c 218 224 +8e9b4 8 219 224 +8e9bc 4 223 224 +8e9c0 c 224 224 +8e9cc 10 233 224 +8e9dc c 224 224 +8e9e8 4 233 224 +8e9ec 4 96 239 +8e9f0 4 64 239 +8e9f4 c 96 239 +8ea00 10 97 239 +8ea10 10 287 224 +8ea20 4 52 224 +8ea24 4 52 224 +8ea28 4 52 224 +8ea2c c 202 224 +8ea38 4 208 224 +8ea3c 4 206 224 +8ea40 4 205 224 +8ea44 4 206 224 +8ea48 8 208 224 +8ea50 10 211 224 +8ea60 4 212 224 +8ea64 8 213 224 +8ea6c 4 214 224 +8ea70 c 213 224 +8ea7c 4 68 215 +8ea80 10 229 236 +8ea90 4 228 236 +8ea94 c 229 236 +8eaa0 8 69 215 +8eaa8 4 92 215 +8eaac 14 235 236 +8eac0 4 93 215 +8eac4 4 94 215 +8eac8 8 95 215 +8ead0 14 235 236 +8eae4 4 93 215 +8eae8 4 94 215 +8eaec 8 95 215 +8eaf4 c 209 224 +8eb00 c 52 224 +8eb0c 8 214 224 +8eb14 60 234 236 +8eb74 14 235 236 +8eb88 4 93 215 +8eb8c 4 95 215 +8eb90 4 94 215 +8eb94 8 95 215 +8eb9c c 224 224 +8eba8 8 233 224 +8ebb0 24 234 236 +8ebd4 8 287 224 +8ebdc 24 234 236 +8ec00 28 235 236 +8ec28 18 233 224 +8ec40 14 235 236 +8ec54 8 218 224 +8ec5c 2c 235 236 +8ec88 4 64 239 +8ec8c 10 96 239 +8ec9c 14 97 239 +8ecb0 18 291 224 +FUNC 8ecc8 34 0 std::num_get > >::do_get +8ecc8 8 543 224 +8ecd0 4 546 224 +8ecd4 8 543 224 +8ecdc 20 546 224 +FUNC 8ecfc 4fc 0 std::priv::__do_get_integer >, long int, char> +8ecfc 20 247 224 +8ed1c 4 145 212 +8ed20 10 247 224 +8ed30 8 145 212 +8ed38 c 247 224 +8ed44 8 247 224 +8ed4c 4 145 212 +8ed50 10 351 219 +8ed60 4 258 224 +8ed64 4 351 219 +8ed68 14 258 224 +8ed7c 8 112 215 +8ed84 4 259 224 +8ed88 c 112 215 +8ed94 4 263 224 +8ed98 4 265 224 +8ed9c 4 266 224 +8eda0 4 287 224 +8eda4 4 287 224 +8eda8 4 112 215 +8edac 4 287 224 +8edb0 c 112 215 +8edbc 4 289 224 +8edc0 c 290 224 +8edcc 4 291 224 +8edd0 4 291 224 +8edd4 4 291 224 +8edd8 34 292 224 +8ee0c 10 351 219 +8ee1c 4 275 224 +8ee20 4 351 219 +8ee24 4 275 224 +8ee28 c 57 228 +8ee34 8 58 228 +8ee3c 4 57 228 +8ee40 14 58 228 +8ee54 4 128 224 +8ee58 4 123 224 +8ee5c 4 128 224 +8ee60 4 122 224 +8ee64 4 128 224 +8ee68 c 126 224 +8ee74 4 123 224 +8ee78 4 125 224 +8ee7c 4 121 224 +8ee80 4 95 215 +8ee84 14 123 224 +8ee98 14 128 224 +8eeac 4 75 215 +8eeb0 8 90 215 +8eeb8 8 77 215 +8eec0 c 90 215 +8eecc c 130 224 +8eed8 c 90 215 +8eee4 10 134 224 +8eef4 8 135 224 +8eefc 4 136 224 +8ef00 4 68 215 +8ef04 10 229 236 +8ef14 8 228 236 +8ef1c 8 69 215 +8ef24 14 235 236 +8ef38 4 93 215 +8ef3c 4 94 215 +8ef40 4 95 215 +8ef44 c 130 224 +8ef50 4 158 224 +8ef54 4 130 224 +8ef58 4 158 224 +8ef5c c 158 224 +8ef68 8 159 224 +8ef70 4 163 224 +8ef74 8 274 224 +8ef7c c 164 224 +8ef88 14 173 224 +8ef9c c 164 224 +8efa8 8 173 224 +8efb0 18 173 224 +8efc8 4 64 239 +8efcc 10 96 239 +8efdc 10 97 239 +8efec 14 287 224 +8f000 4 52 224 +8f004 4 52 224 +8f008 4 52 224 +8f00c 8 142 224 +8f014 4 148 224 +8f018 4 146 224 +8f01c 4 145 224 +8f020 4 146 224 +8f024 8 148 224 +8f02c c 151 224 +8f038 4 152 224 +8f03c 4 153 224 +8f040 4 154 224 +8f044 10 153 224 +8f054 4 68 215 +8f058 10 229 236 +8f068 4 228 236 +8f06c c 229 236 +8f078 8 69 215 +8f080 4 92 215 +8f084 14 235 236 +8f098 4 93 215 +8f09c 4 94 215 +8f0a0 8 95 215 +8f0a8 14 235 236 +8f0bc 4 93 215 +8f0c0 4 94 215 +8f0c4 8 95 215 +8f0cc c 149 224 +8f0d8 c 52 224 +8f0e4 8 154 224 +8f0ec 60 234 236 +8f14c 10 164 224 +8f15c c 164 224 +8f168 8 287 224 +8f170 3c 235 236 +8f1ac 8 158 224 +8f1b4 8 64 239 +8f1bc 10 96 239 +8f1cc 14 97 239 +8f1e0 18 291 224 +FUNC 8f1f8 34 0 std::num_get > >::do_get +8f1f8 8 537 224 +8f200 4 539 224 +8f204 8 537 224 +8f20c 20 539 224 +FUNC 8f22c a8 0 std::num_get > >::do_get +8f22c 8 499 224 +8f234 4 501 224 +8f238 8 499 224 +8f240 4 501 224 +8f244 24 506 224 +8f268 14 507 224 +8f27c 8 508 224 +8f284 8 510 224 +8f28c 8 513 224 +8f294 8 517 224 +8f29c 1c 502 224 +8f2b8 8 517 224 +8f2c0 4 509 224 +8f2c4 8 517 224 +8f2cc 8 511 224 +FUNC 8f2d4 468 0 std::priv::__put_float > > +8f2d4 20 96 226 +8f2f4 4 400 238 +8f2f8 4 96 226 +8f2fc 4 400 238 +8f300 8 96 226 +8f308 4 100 226 +8f30c 14 96 226 +8f320 4 100 226 +8f324 c 100 226 +8f330 10 104 226 +8f340 20 105 226 +8f360 4 138 212 +8f364 4 400 238 +8f368 8 139 212 +8f370 c 47 226 +8f37c 4 51 226 +8f380 4 50 226 +8f384 4 53 226 +8f388 4 50 226 +8f38c 4 53 226 +8f390 10 57 226 +8f3a0 c 57 226 +8f3ac 8 57 226 +8f3b4 18 480 201 +8f3cc 4 62 230 +8f3d0 4 200 236 +8f3d4 4 199 236 +8f3d8 4 200 236 +8f3dc 4 199 236 +8f3e0 8 200 236 +8f3e8 8 199 236 +8f3f0 8 480 201 +8f3f8 4 64 226 +8f3fc 4 213 201 +8f400 4 64 226 +8f404 10 213 201 +8f414 8 199 236 +8f41c 4 215 201 +8f420 8 213 201 +8f428 4 214 201 +8f42c 4 62 230 +8f430 4 200 236 +8f434 4 199 236 +8f438 4 200 236 +8f43c 4 199 236 +8f440 8 200 236 +8f448 4 199 236 +8f44c 4 223 247 +8f450 c 199 236 +8f45c 4 200 236 +8f460 4 215 201 +8f464 4 200 236 +8f468 8 62 230 +8f470 8 213 201 +8f478 10 62 230 +8f488 1c 111 226 +8f4a4 8 101 226 +8f4ac 4 199 236 +8f4b0 4 223 247 +8f4b4 c 199 236 +8f4c0 c 200 236 +8f4cc c 62 230 +8f4d8 1c 213 201 +8f4f4 8 199 236 +8f4fc 4 215 201 +8f500 8 213 201 +8f508 4 214 201 +8f50c 4 62 230 +8f510 4 200 236 +8f514 4 199 236 +8f518 4 200 236 +8f51c 4 199 236 +8f520 8 200 236 +8f528 4 199 236 +8f52c 4 223 247 +8f530 c 199 236 +8f53c 8 200 236 +8f544 c 62 230 +8f550 4 59 226 +8f554 4 59 226 +8f558 8 59 226 +8f560 14 480 201 +8f574 4 62 230 +8f578 4 200 236 +8f57c 4 199 236 +8f580 4 200 236 +8f584 4 199 236 +8f588 8 200 236 +8f590 8 199 236 +8f598 8 480 201 +8f5a0 4 213 201 +8f5a4 8 60 226 +8f5ac 1c 213 201 +8f5c8 8 199 236 +8f5d0 4 215 201 +8f5d4 8 213 201 +8f5dc 4 214 201 +8f5e0 4 62 230 +8f5e4 4 200 236 +8f5e8 4 199 236 +8f5ec 4 200 236 +8f5f0 4 199 236 +8f5f4 8 200 236 +8f5fc 4 199 236 +8f600 4 223 247 +8f604 c 199 236 +8f610 8 200 236 +8f618 c 62 230 +8f624 4 199 236 +8f628 4 223 247 +8f62c c 199 236 +8f638 c 200 236 +8f644 c 62 230 +8f650 1c 213 201 +8f66c 8 199 236 +8f674 4 215 201 +8f678 8 213 201 +8f680 4 214 201 +8f684 4 62 230 +8f688 4 200 236 +8f68c 4 199 236 +8f690 4 200 236 +8f694 4 199 236 +8f698 8 200 236 +8f6a0 4 199 236 +8f6a4 4 223 247 +8f6a8 c 199 236 +8f6b4 8 200 236 +8f6bc c 62 230 +8f6c8 4 54 226 +8f6cc 4 480 201 +8f6d0 4 54 226 +8f6d4 c 480 201 +8f6e0 4 62 230 +8f6e4 4 200 236 +8f6e8 4 199 236 +8f6ec 4 200 236 +8f6f0 4 199 236 +8f6f4 8 200 236 +8f6fc 8 199 236 +8f704 c 480 201 +8f710 4 199 236 +8f714 4 223 247 +8f718 c 199 236 +8f724 c 200 236 +8f730 c 62 230 +FUNC 8f73c 220 0 std::priv::__do_put_float >, long double> +8f73c 10 115 226 +8f74c 4 108 213 +8f750 4 41 213 +8f754 18 115 226 +8f76c 4 108 213 +8f770 4 115 226 +8f774 4 115 226 +8f778 8 108 213 +8f780 4 41 213 +8f784 8 115 226 +8f78c 4 108 213 +8f790 10 41 213 +8f7a0 4 611 237 +8f7a4 c 119 226 +8f7b0 4 613 237 +8f7b4 4 119 226 +8f7b8 4 612 237 +8f7bc 4 613 237 +8f7c0 4 101 206 +8f7c4 4 119 226 +8f7c8 4 145 212 +8f7cc 4 119 226 +8f7d0 8 145 212 +8f7d8 14 351 219 +8f7ec 8 121 226 +8f7f4 10 56 228 +8f804 4 57 228 +8f808 4 56 228 +8f80c c 57 228 +8f818 4 58 228 +8f81c 4 57 228 +8f820 10 58 228 +8f830 2c 124 226 +8f85c 4 64 239 +8f860 4 124 226 +8f864 c 96 239 +8f870 8 97 239 +8f878 8 161 202 +8f880 4 161 202 +8f884 4 64 239 +8f888 c 96 239 +8f894 4 97 239 +8f898 8 319 202 +8f8a0 4 97 239 +8f8a4 8 161 202 +8f8ac 4 161 202 +8f8b0 2c 125 226 +8f8dc 14 135 223 +8f8f0 4 64 239 +8f8f4 c 96 239 +8f900 4 97 239 +8f904 4 70 213 +8f908 4 97 239 +8f90c 4 70 213 +8f910 c 70 213 +8f91c 8 64 239 +8f924 c 96 239 +8f930 1c 97 239 +8f94c 10 121 226 +FUNC 8f95c 24 0 std::num_put > >::do_put +8f95c 4 451 226 +8f960 8 453 226 +8f968 4 451 226 +8f96c 8 453 226 +8f974 c 453 226 +FUNC 8f980 220 0 std::priv::__do_put_float >, double> +8f980 10 115 226 +8f990 4 108 213 +8f994 4 41 213 +8f998 18 115 226 +8f9b0 4 108 213 +8f9b4 4 115 226 +8f9b8 4 115 226 +8f9bc 8 108 213 +8f9c4 4 41 213 +8f9c8 8 115 226 +8f9d0 4 108 213 +8f9d4 10 41 213 +8f9e4 4 611 237 +8f9e8 c 119 226 +8f9f4 4 613 237 +8f9f8 4 119 226 +8f9fc 4 612 237 +8fa00 4 613 237 +8fa04 4 101 206 +8fa08 4 119 226 +8fa0c 4 145 212 +8fa10 4 119 226 +8fa14 8 145 212 +8fa1c 14 351 219 +8fa30 8 121 226 +8fa38 10 56 228 +8fa48 4 57 228 +8fa4c 4 56 228 +8fa50 c 57 228 +8fa5c 4 58 228 +8fa60 4 57 228 +8fa64 10 58 228 +8fa74 2c 124 226 +8faa0 4 64 239 +8faa4 4 124 226 +8faa8 c 96 239 +8fab4 8 97 239 +8fabc 8 161 202 +8fac4 4 161 202 +8fac8 4 64 239 +8facc c 96 239 +8fad8 4 97 239 +8fadc 8 319 202 +8fae4 4 97 239 +8fae8 8 161 202 +8faf0 4 161 202 +8faf4 2c 125 226 +8fb20 14 135 223 +8fb34 4 64 239 +8fb38 c 96 239 +8fb44 4 97 239 +8fb48 4 70 213 +8fb4c 4 97 239 +8fb50 4 70 213 +8fb54 c 70 213 +8fb60 8 64 239 +8fb68 c 96 239 +8fb74 1c 97 239 +8fb90 10 121 226 +FUNC 8fba0 24 0 std::num_put > >::do_put +8fba0 4 444 226 +8fba4 8 446 226 +8fbac 4 444 226 +8fbb0 8 446 226 +8fbb8 c 446 226 +FUNC 8fbc4 4b4 0 std::priv::__copy_integer_and_fill > > +8fbc4 4 148 226 +8fbc8 4 152 226 +8fbcc 10 148 226 +8fbdc c 148 226 +8fbe8 4 152 226 +8fbec 4 161 226 +8fbf0 4 159 226 +8fbf4 8 163 226 +8fbfc 10 167 226 +8fc0c 4 167 226 +8fc10 14 167 226 +8fc24 c 173 226 +8fc30 10 173 226 +8fc40 18 480 201 +8fc58 4 62 230 +8fc5c 4 200 236 +8fc60 4 200 236 +8fc64 4 200 236 +8fc68 4 199 236 +8fc6c 8 200 236 +8fc74 8 199 236 +8fc7c 8 62 230 +8fc84 8 480 201 +8fc8c 4 183 226 +8fc90 8 182 226 +8fc98 18 213 201 +8fcb0 8 199 236 +8fcb8 8 62 230 +8fcc0 4 215 201 +8fcc4 8 213 201 +8fccc 4 214 201 +8fcd0 4 62 230 +8fcd4 4 200 236 +8fcd8 4 200 236 +8fcdc 4 200 236 +8fce0 4 199 236 +8fce4 8 200 236 +8fcec 14 199 236 +8fd00 c 200 236 +8fd0c 8 153 226 +8fd14 18 213 201 +8fd2c 18 186 226 +8fd44 14 199 236 +8fd58 28 200 236 +8fd80 8 199 236 +8fd88 8 62 230 +8fd90 4 215 201 +8fd94 8 213 201 +8fd9c 4 214 201 +8fda0 4 62 230 +8fda4 4 200 236 +8fda8 4 200 236 +8fdac 4 200 236 +8fdb0 4 199 236 +8fdb4 8 200 236 +8fdbc 14 199 236 +8fdd0 c 200 236 +8fddc 10 169 226 +8fdec 18 480 201 +8fe04 4 62 230 +8fe08 4 200 236 +8fe0c 4 200 236 +8fe10 4 200 236 +8fe14 4 199 236 +8fe18 8 200 236 +8fe20 8 199 236 +8fe28 8 62 230 +8fe30 8 480 201 +8fe38 8 171 226 +8fe40 4 213 201 +8fe44 4 170 226 +8fe48 4 213 201 +8fe4c 4 170 226 +8fe50 1c 213 201 +8fe6c 8 199 236 +8fe74 8 62 230 +8fe7c 4 215 201 +8fe80 8 213 201 +8fe88 4 214 201 +8fe8c 4 62 230 +8fe90 4 200 236 +8fe94 4 200 236 +8fe98 4 200 236 +8fe9c 4 199 236 +8fea0 8 200 236 +8fea8 14 199 236 +8febc c 200 236 +8fec8 14 199 236 +8fedc 18 200 236 +8fef4 1c 285 201 +8ff10 8 164 226 +8ff18 14 480 201 +8ff2c 4 62 230 +8ff30 4 200 236 +8ff34 4 200 236 +8ff38 4 200 236 +8ff3c 4 199 236 +8ff40 8 200 236 +8ff48 8 199 236 +8ff50 8 62 230 +8ff58 14 480 201 +8ff6c 18 186 226 +8ff84 14 199 236 +8ff98 18 200 236 +8ffb0 14 176 226 +8ffc4 10 177 226 +8ffd4 18 480 201 +8ffec 4 62 230 +8fff0 4 200 236 +8fff4 4 200 236 +8fff8 4 200 236 +8fffc 4 199 236 +90000 8 200 236 +90008 8 199 236 +90010 8 62 230 +90018 8 480 201 +90020 10 285 201 +90030 8 178 226 +90038 14 285 201 +9004c 14 199 236 +90060 18 200 236 +FUNC 90078 21c 0 std::priv::__put_integer > > +90078 18 192 226 +90090 4 145 212 +90094 10 192 226 +900a4 8 145 212 +900ac 8 192 226 +900b4 c 192 226 +900c0 4 145 212 +900c4 10 351 219 +900d4 8 206 207 +900dc 4 351 219 +900e0 20 206 207 +90100 8 209 207 +90108 4 206 207 +9010c 18 209 207 +90124 4 351 219 +90128 4 203 226 +9012c 4 351 219 +90130 4 204 226 +90134 8 351 219 +9013c c 87 228 +90148 4 351 219 +9014c 8 87 228 +90154 10 209 226 +90164 4 218 226 +90168 4 211 226 +9016c 14 86 228 +90180 20 220 226 +901a0 4 225 226 +901a4 4 138 212 +901a8 4 225 226 +901ac 4 139 212 +901b0 1c 225 226 +901cc 4 64 239 +901d0 4 225 226 +901d4 c 96 239 +901e0 8 97 239 +901e8 8 161 202 +901f0 4 161 202 +901f4 8 225 226 +901fc 30 226 226 +9022c c 212 226 +90238 c 215 226 +90244 8 135 223 +9024c 8 213 226 +90254 8 64 239 +9025c c 96 239 +90268 14 97 239 +9027c 18 225 226 +FUNC 90294 a4 0 std::priv::__do_put_integer >, long unsigned int> +90294 14 372 226 +902a8 10 372 226 +902b8 4 307 226 +902bc 4 309 226 +902c0 4 308 226 +902c4 4 309 226 +902c8 4 308 226 +902cc 4 309 226 +902d0 4 310 226 +902d4 4 308 226 +902d8 4 309 226 +902dc 14 381 226 +902f0 38 382 226 +90328 10 310 226 +FUNC 90338 1e8 0 std::num_put > >::do_put +90338 c 475 226 +90344 4 145 212 +90348 8 475 226 +90350 4 145 212 +90354 4 475 226 +90358 4 145 212 +9035c c 475 226 +90368 4 475 226 +9036c 4 145 212 +90370 18 351 219 +90388 c 477 226 +90394 4 124 212 +90398 4 139 212 +9039c 4 123 212 +903a0 4 139 212 +903a4 8 124 212 +903ac 4 484 226 +903b0 c 206 207 +903bc 4 506 226 +903c0 c 206 207 +903cc 14 506 226 +903e0 4 112 212 +903e4 18 514 226 +903fc 4 488 226 +90400 8 488 226 +90408 18 206 207 +90420 4 62 230 +90424 10 200 236 +90434 c 199 236 +90440 4 200 236 +90444 8 62 230 +9044c 18 206 207 +90464 10 200 236 +90474 10 199 236 +90484 8 62 230 +9048c c 139 212 +90498 c 488 226 +904a4 1c 206 207 +904c0 18 199 236 +904d8 c 200 236 +904e4 1c 199 236 +90500 10 200 236 +90510 10 477 226 +FUNC 90520 28 0 std::num_put > >::do_put +90520 4 438 226 +90524 8 440 226 +9052c 4 438 226 +90530 c 440 226 +9053c c 440 226 +FUNC 90548 a8 0 std::num_put > >::do_put +90548 18 465 226 +90560 10 465 226 +90570 4 307 226 +90574 4 309 226 +90578 4 308 226 +9057c 4 309 226 +90580 4 308 226 +90584 4 309 226 +90588 4 310 226 +9058c 4 309 226 +90590 4 308 226 +90594 18 381 226 +905ac 34 467 226 +905e0 10 310 226 +FUNC 905f0 6c 0 std::num_put > >::do_put +905f0 14 459 226 +90604 8 380 226 +9060c 8 459 226 +90614 c 380 226 +90620 8 459 226 +90628 8 380 226 +90630 1c 381 226 +9064c 10 461 226 +FUNC 9065c 6c 0 std::num_put > >::do_put +9065c 14 432 226 +90670 8 380 226 +90678 8 432 226 +90680 c 380 226 +9068c 8 432 226 +90694 8 380 226 +9069c 1c 381 226 +906b8 10 434 226 +FUNC 906c8 550 0 std::priv::__copy_sign >, wchar_t> +906c8 18 297 224 +906e0 18 297 224 +906f8 4 75 215 +906fc 8 90 215 +90704 4 77 215 +90708 c 90 215 +90714 8 299 224 +9071c 4 90 215 +90720 8 301 224 +90728 8 303 224 +90730 4 308 224 +90734 4 309 224 +90738 4 308 224 +9073c 4 309 224 +90740 4 308 224 +90744 18 309 224 +9075c 34 235 236 +90790 c 95 215 +9079c 1c 235 236 +907b8 c 95 215 +907c4 8 301 224 +907cc 10 229 236 +907dc 8 228 236 +907e4 4 165 239 +907e8 8 69 215 +907f0 4 64 239 +907f4 8 74 239 +907fc 10 74 239 +9080c c 535 238 +90818 4 101 206 +9081c c 232 247 +90828 4 539 238 +9082c 8 229 236 +90834 8 539 238 +9083c 8 229 236 +90844 8 228 236 +9084c c 69 215 +90858 24 234 236 +9087c 8 95 215 +90884 20 234 236 +908a4 28 235 236 +908cc 20 234 236 +908ec c 95 215 +908f8 8 235 236 +90900 8 95 215 +90908 20 235 236 +90928 4 228 236 +9092c 18 229 236 +90944 4 228 236 +90948 18 229 236 +90960 4 400 238 +90964 14 304 238 +90978 4 306 238 +9097c 10 307 238 +9098c 4 64 213 +90990 4 67 213 +90994 4 64 213 +90998 58 86 244 +909f0 20 146 206 +90a10 4 86 244 +90a14 4 146 206 +90a18 10 86 244 +90a28 4 146 206 +90a2c c 86 244 +90a38 4 146 206 +90a3c c 86 244 +90a48 4 146 206 +90a4c c 86 244 +90a58 4 146 206 +90a5c c 86 244 +90a68 4 146 206 +90a6c c 86 244 +90a78 4 146 206 +90a7c c 86 244 +90a88 4 146 206 +90a8c c 86 244 +90a98 4 146 206 +90a9c c 86 244 +90aa8 4 146 206 +90aac c 86 244 +90ab8 4 146 206 +90abc c 86 244 +90ac8 4 146 206 +90acc c 86 244 +90ad8 4 146 206 +90adc c 86 244 +90ae8 4 146 206 +90aec 8 86 244 +90af4 8 146 206 +90afc 4 101 206 +90b00 4 64 239 +90b04 c 96 239 +90b10 8 97 239 +90b18 8 319 202 +90b20 c 97 239 +90b2c 8 161 202 +90b34 c 161 202 +90b40 4 175 237 +90b44 4 164 239 +90b48 4 160 239 +90b4c 10 165 239 +90b5c 14 95 215 +90b70 2c 235 236 +90b9c 14 74 239 +90bb0 4 308 238 +90bb4 2c 134 223 +90be0 8 86 244 +90be8 8 146 206 +90bf0 c 86 244 +90bfc 10 135 223 +90c0c 8 86 244 +90c14 4 305 238 +FUNC 90c18 4d8 0 std::priv::__copy_digits >, wchar_t> +90c18 2c 314 224 +90c44 10 314 224 +90c54 4 316 224 +90c58 8 95 215 +90c60 4 320 224 +90c64 4 75 215 +90c68 8 90 215 +90c70 4 77 215 +90c74 4 90 215 +90c78 10 318 224 +90c88 c 90 215 +90c94 8 320 224 +90c9c 4 319 224 +90ca0 8 320 224 +90ca8 4 320 224 +90cac 4 64 239 +90cb0 4 321 224 +90cb4 8 74 239 +90cbc 10 74 239 +90ccc c 535 238 +90cd8 8 101 206 +90ce0 4 232 247 +90ce4 4 68 215 +90ce8 4 539 238 +90cec 4 229 236 +90cf0 4 539 238 +90cf4 4 229 236 +90cf8 4 539 238 +90cfc 8 229 236 +90d04 8 228 236 +90d0c 4 69 215 +90d10 8 322 224 +90d18 14 235 236 +90d2c c 95 215 +90d38 4 235 236 +90d3c c 318 224 +90d48 20 328 224 +90d68 1c 235 236 +90d84 4 93 215 +90d88 4 94 215 +90d8c 8 95 215 +90d94 4 92 215 +90d98 1c 235 236 +90db4 4 93 215 +90db8 4 94 215 +90dbc 8 95 215 +90dc4 4 228 236 +90dc8 14 229 236 +90ddc 4 400 238 +90de0 14 304 238 +90df4 4 306 238 +90df8 10 307 238 +90e08 4 64 213 +90e0c 4 67 213 +90e10 4 64 213 +90e14 58 86 244 +90e6c 20 146 206 +90e8c 4 86 244 +90e90 4 146 206 +90e94 10 86 244 +90ea4 4 146 206 +90ea8 c 86 244 +90eb4 4 146 206 +90eb8 c 86 244 +90ec4 4 146 206 +90ec8 c 86 244 +90ed4 4 146 206 +90ed8 c 86 244 +90ee4 4 146 206 +90ee8 c 86 244 +90ef4 4 146 206 +90ef8 c 86 244 +90f04 4 146 206 +90f08 c 86 244 +90f14 4 146 206 +90f18 c 86 244 +90f24 4 146 206 +90f28 c 86 244 +90f34 4 146 206 +90f38 c 86 244 +90f44 4 146 206 +90f48 c 86 244 +90f54 4 146 206 +90f58 c 86 244 +90f64 4 146 206 +90f68 8 86 244 +90f70 8 146 206 +90f78 4 101 206 +90f7c 4 64 239 +90f80 c 96 239 +90f8c 8 97 239 +90f94 8 319 202 +90f9c c 97 239 +90fa8 c 161 202 +90fb4 10 161 202 +90fc4 4 175 237 +90fc8 4 164 239 +90fcc 4 160 239 +90fd0 8 165 239 +90fd8 14 74 239 +90fec 14 234 236 +91000 4 95 215 +91004 8 234 236 +9100c 4 308 238 +91010 20 134 223 +91030 10 86 244 +91040 38 234 236 +91078 8 86 244 +91080 8 146 206 +91088 c 86 244 +91094 14 135 223 +910a8 4 235 236 +910ac 4 95 215 +910b0 3c 235 236 +910ec 4 305 238 +FUNC 910f0 2bc 0 std::basic_string, std::priv::__iostring_allocator >::push_back +910f0 8 534 238 +910f8 4 64 239 +910fc c 534 238 +91108 4 74 239 +9110c 8 534 238 +91114 4 74 239 +91118 10 74 239 +91128 c 535 238 +91134 8 101 206 +9113c 4 232 247 +91140 4 539 238 +91144 4 540 238 +91148 8 539 238 +91150 10 540 238 +91160 4 400 238 +91164 14 304 238 +91178 4 306 238 +9117c 10 307 238 +9118c 4 64 213 +91190 4 67 213 +91194 4 64 213 +91198 58 86 244 +911f0 20 146 206 +91210 4 86 244 +91214 4 146 206 +91218 10 86 244 +91228 4 146 206 +9122c c 86 244 +91238 4 146 206 +9123c c 86 244 +91248 4 146 206 +9124c c 86 244 +91258 4 146 206 +9125c c 86 244 +91268 4 146 206 +9126c c 86 244 +91278 4 146 206 +9127c c 86 244 +91288 4 146 206 +9128c c 86 244 +91298 4 146 206 +9129c c 86 244 +912a8 4 146 206 +912ac c 86 244 +912b8 4 146 206 +912bc c 86 244 +912c8 4 146 206 +912cc c 86 244 +912d8 4 146 206 +912dc c 86 244 +912e8 4 146 206 +912ec 8 86 244 +912f4 8 146 206 +912fc 4 101 206 +91300 4 64 239 +91304 c 96 239 +91310 8 97 239 +91318 8 319 202 +91320 4 97 239 +91324 8 161 202 +9132c 4 161 202 +91330 4 175 237 +91334 4 164 239 +91338 4 160 239 +9133c c 165 239 +91348 14 74 239 +9135c 4 308 238 +91360 1c 134 223 +9137c 8 86 244 +91384 8 146 206 +9138c c 86 244 +91398 8 135 223 +913a0 8 86 244 +913a8 4 305 238 +FUNC 913ac 844 0 std::priv::__read_float >, wchar_t> +913ac 14 368 224 +913c0 4 87 228 +913c4 10 368 224 +913d4 4 87 228 +913d8 4 368 224 +913dc 4 87 228 +913e0 8 368 224 +913e8 c 87 228 +913f4 c 368 224 +91400 8 368 224 +91408 4 87 228 +9140c 10 85 228 +9141c 4 86 228 +91420 4 85 228 +91424 10 86 228 +91434 20 390 224 +91454 18 393 224 +9146c 8 393 224 +91474 8 396 224 +9147c 8 393 224 +91484 4 396 224 +91488 10 393 224 +91498 4 396 224 +9149c 4 338 224 +914a0 4 339 224 +914a4 4 338 224 +914a8 4 336 224 +914ac 20 338 224 +914cc 8 343 224 +914d4 4 75 215 +914d8 8 90 215 +914e0 4 77 215 +914e4 4 90 215 +914e8 10 341 224 +914f8 c 90 215 +91504 c 343 224 +91510 4 342 224 +91514 8 343 224 +9151c 4 344 224 +91520 c 345 224 +9152c 4 68 215 +91530 8 346 224 +91538 4 347 224 +9153c 10 229 236 +9154c c 228 236 +91558 8 69 215 +91560 14 235 236 +91574 c 95 215 +91580 4 235 236 +91584 c 341 224 +91590 c 359 224 +9159c 8 360 224 +915a4 10 361 224 +915b4 10 120 215 +915c4 4 403 224 +915c8 8 90 215 +915d0 10 403 224 +915e0 4 375 224 +915e4 4 410 224 +915e8 4 413 224 +915ec 4 96 239 +915f0 4 64 239 +915f4 c 96 239 +91600 10 97 239 +91610 30 423 224 +91640 1c 235 236 +9165c 4 93 215 +91660 4 95 215 +91664 4 94 215 +91668 8 95 215 +91670 4 64 239 +91674 4 351 224 +91678 8 74 239 +91680 10 74 239 +91690 c 535 238 +9169c 4 101 206 +916a0 4 352 224 +916a4 8 350 224 +916ac 4 352 224 +916b0 4 232 247 +916b4 c 539 238 +916c0 4 68 215 +916c4 10 229 236 +916d4 4 228 236 +916d8 c 229 236 +916e4 8 69 215 +916ec 4 92 215 +916f0 1c 235 236 +9170c 4 94 215 +91710 4 95 215 +91714 4 93 215 +91718 8 95 215 +91720 18 234 236 +91738 4 95 215 +9173c 8 234 236 +91744 4 400 238 +91748 14 304 238 +9175c 4 306 238 +91760 4 307 238 +91764 4 306 238 +91768 c 307 238 +91774 4 64 213 +91778 8 67 213 +91780 8 64 213 +91788 40 234 236 +917c8 14 74 239 +917dc 8 308 238 +917e4 18 134 223 +917fc 58 86 244 +91854 24 146 206 +91878 4 86 244 +9187c 4 146 206 +91880 10 86 244 +91890 4 146 206 +91894 c 86 244 +918a0 4 146 206 +918a4 c 86 244 +918b0 4 146 206 +918b4 c 86 244 +918c0 4 146 206 +918c4 c 86 244 +918d0 4 146 206 +918d4 c 86 244 +918e0 4 146 206 +918e4 c 86 244 +918f0 4 146 206 +918f4 c 86 244 +91900 4 146 206 +91904 c 86 244 +91910 4 146 206 +91914 c 86 244 +91920 4 146 206 +91924 c 86 244 +91930 4 146 206 +91934 c 86 244 +91940 4 146 206 +91944 c 86 244 +91950 4 146 206 +91954 8 86 244 +9195c c 146 206 +91968 4 101 206 +9196c 4 64 239 +91970 c 96 239 +9197c 8 97 239 +91984 8 319 202 +9198c 4 97 239 +91990 8 161 202 +91998 4 161 202 +9199c 4 175 237 +919a0 4 164 239 +919a4 4 175 237 +919a8 4 165 239 +919ac 4 175 237 +919b0 8 160 239 +919b8 c 404 224 +919c4 4 68 215 +919c8 10 229 236 +919d8 8 228 236 +919e0 4 406 224 +919e4 4 69 215 +919e8 18 406 224 +91a00 4 410 224 +91a04 4 413 224 +91a08 10 120 215 +91a18 4 413 224 +91a1c 8 90 215 +91a24 4 66 215 +91a28 c 413 224 +91a34 c 413 224 +91a40 c 414 224 +91a4c 4 68 215 +91a50 10 229 236 +91a60 8 228 236 +91a68 4 416 224 +91a6c 4 69 215 +91a70 18 416 224 +91a88 4 416 224 +91a8c 4 416 224 +91a90 4 416 224 +91a94 c 417 224 +91aa0 14 416 224 +91ab4 18 417 224 +91acc 14 403 224 +91ae0 c 235 236 +91aec 8 95 215 +91af4 8 235 236 +91afc 4 86 244 +91b00 10 146 206 +91b10 c 86 244 +91b1c 14 235 236 +91b30 8 135 223 +91b38 1c 400 224 +91b54 14 235 236 +91b68 18 359 224 +91b80 10 86 244 +91b90 4 66 215 +91b94 c 413 224 +91ba0 18 90 215 +91bb8 8 305 238 +91bc0 4 64 239 +91bc4 10 96 239 +91bd4 1c 97 239 +FUNC 91bf0 2a0 0 std::priv::__do_get_float >, long double, wchar_t> +91bf0 10 427 224 +91c00 4 145 212 +91c04 14 427 224 +91c18 8 145 212 +91c20 4 427 224 +91c24 8 427 224 +91c2c 4 145 212 +91c30 24 351 219 +91c54 4 108 213 +91c58 4 351 219 +91c5c c 108 213 +91c68 4 41 213 +91c6c 4 108 213 +91c70 14 41 213 +91c84 4 101 206 +91c88 4 41 213 +91c8c 4 613 237 +91c90 14 434 224 +91ca4 4 612 237 +91ca8 4 613 237 +91cac 4 611 237 +91cb0 8 434 224 +91cb8 4 435 224 +91cbc 8 440 224 +91cc4 8 75 215 +91ccc 8 90 215 +91cd4 8 77 215 +91cdc c 90 215 +91ce8 c 442 224 +91cf4 4 64 239 +91cf8 4 444 224 +91cfc c 96 239 +91d08 4 97 239 +91d0c 8 319 202 +91d14 4 97 239 +91d18 8 161 202 +91d20 4 161 202 +91d24 8 444 224 +91d2c 28 445 224 +91d54 10 443 224 +91d64 1c 235 236 +91d80 4 93 215 +91d84 4 95 215 +91d88 4 94 215 +91d8c 8 95 215 +91d94 8 135 223 +91d9c c 436 224 +91da8 8 437 224 +91db0 1c 235 236 +91dcc 4 93 215 +91dd0 4 95 215 +91dd4 4 94 215 +91dd8 8 95 215 +91de0 48 234 236 +91e28 24 235 236 +91e4c 10 444 224 +91e5c 8 64 239 +91e64 c 96 239 +91e70 4 97 239 +91e74 4 70 213 +91e78 4 97 239 +91e7c 4 70 213 +91e80 10 70 213 +FUNC 91e90 34 0 std::num_get > >::do_get +91e90 8 579 224 +91e98 4 582 224 +91e9c 8 579 224 +91ea4 20 582 224 +FUNC 91ec4 2a0 0 std::priv::__do_get_float >, double, wchar_t> +91ec4 10 427 224 +91ed4 4 145 212 +91ed8 14 427 224 +91eec 8 145 212 +91ef4 4 427 224 +91ef8 8 427 224 +91f00 4 145 212 +91f04 24 351 219 +91f28 4 108 213 +91f2c 4 351 219 +91f30 c 108 213 +91f3c 4 41 213 +91f40 4 108 213 +91f44 14 41 213 +91f58 4 101 206 +91f5c 4 41 213 +91f60 4 613 237 +91f64 14 434 224 +91f78 4 612 237 +91f7c 4 613 237 +91f80 4 611 237 +91f84 8 434 224 +91f8c 4 435 224 +91f90 8 440 224 +91f98 8 75 215 +91fa0 8 90 215 +91fa8 8 77 215 +91fb0 c 90 215 +91fbc c 442 224 +91fc8 4 64 239 +91fcc 4 444 224 +91fd0 c 96 239 +91fdc 4 97 239 +91fe0 8 319 202 +91fe8 4 97 239 +91fec 8 161 202 +91ff4 4 161 202 +91ff8 8 444 224 +92000 28 445 224 +92028 10 443 224 +92038 1c 235 236 +92054 4 93 215 +92058 4 95 215 +9205c 4 94 215 +92060 8 95 215 +92068 8 135 223 +92070 c 436 224 +9207c 8 437 224 +92084 1c 235 236 +920a0 4 93 215 +920a4 4 95 215 +920a8 4 94 215 +920ac 8 95 215 +920b4 48 234 236 +920fc 24 235 236 +92120 10 444 224 +92130 8 64 239 +92138 c 96 239 +92144 4 97 239 +92148 4 70 213 +9214c 4 97 239 +92150 4 70 213 +92154 10 70 213 +FUNC 92164 34 0 std::num_get > >::do_get +92164 8 571 224 +9216c 4 574 224 +92170 8 571 224 +92178 20 574 224 +FUNC 92198 2a0 0 std::priv::__do_get_float >, float, wchar_t> +92198 10 427 224 +921a8 4 145 212 +921ac 14 427 224 +921c0 8 145 212 +921c8 4 427 224 +921cc 8 427 224 +921d4 4 145 212 +921d8 24 351 219 +921fc 4 108 213 +92200 4 351 219 +92204 c 108 213 +92210 4 41 213 +92214 4 108 213 +92218 14 41 213 +9222c 4 101 206 +92230 4 41 213 +92234 4 613 237 +92238 14 434 224 +9224c 4 612 237 +92250 4 613 237 +92254 4 611 237 +92258 8 434 224 +92260 4 435 224 +92264 8 440 224 +9226c 8 75 215 +92274 8 90 215 +9227c 8 77 215 +92284 c 90 215 +92290 c 442 224 +9229c 4 64 239 +922a0 4 444 224 +922a4 c 96 239 +922b0 4 97 239 +922b4 8 319 202 +922bc 4 97 239 +922c0 8 161 202 +922c8 4 161 202 +922cc 8 444 224 +922d4 28 445 224 +922fc 10 443 224 +9230c 1c 235 236 +92328 4 93 215 +9232c 4 95 215 +92330 4 94 215 +92334 8 95 215 +9233c 8 135 223 +92344 c 436 224 +92350 8 437 224 +92358 1c 235 236 +92374 4 93 215 +92378 4 95 215 +9237c 4 94 215 +92380 8 95 215 +92388 48 234 236 +923d0 24 235 236 +923f4 10 444 224 +92404 8 64 239 +9240c c 96 239 +92418 4 97 239 +9241c 4 70 213 +92420 4 97 239 +92424 4 70 213 +92428 10 70 213 +FUNC 92438 34 0 std::num_get > >::do_get +92438 8 564 224 +92440 4 567 224 +92444 8 564 224 +9244c 20 567 224 +FUNC 9246c 4f4 0 std::priv::__copy_sign >, char> +9246c 1c 297 224 +92488 20 297 224 +924a8 4 75 215 +924ac c 90 215 +924b8 4 77 215 +924bc c 90 215 +924c8 8 299 224 +924d0 4 90 215 +924d4 8 301 224 +924dc 8 303 224 +924e4 4 308 224 +924e8 4 309 224 +924ec 4 308 224 +924f0 4 309 224 +924f4 4 308 224 +924f8 1c 309 224 +92514 10 235 236 +92524 20 234 236 +92544 18 235 236 +9255c 18 235 236 +92574 8 95 215 +9257c 18 235 236 +92594 4 95 215 +92598 8 301 224 +925a0 10 229 236 +925b0 8 228 236 +925b8 4 165 239 +925bc 8 69 215 +925c4 4 64 239 +925c8 8 74 239 +925d0 10 74 239 +925e0 c 535 238 +925ec 4 101 206 +925f0 c 232 247 +925fc 4 539 238 +92600 8 229 236 +92608 8 539 238 +92610 8 229 236 +92618 8 228 236 +92620 c 69 215 +9262c 24 234 236 +92650 8 95 215 +92658 20 234 236 +92678 c 95 215 +92684 4 235 236 +92688 4 95 215 +9268c 18 235 236 +926a4 4 228 236 +926a8 10 229 236 +926b8 4 228 236 +926bc 10 229 236 +926cc 4 400 238 +926d0 14 304 238 +926e4 4 306 238 +926e8 10 307 238 +926f8 4 64 213 +926fc 4 67 213 +92700 4 64 213 +92704 58 86 244 +9275c 20 146 206 +9277c 4 86 244 +92780 4 146 206 +92784 10 86 244 +92794 4 146 206 +92798 c 86 244 +927a4 4 146 206 +927a8 c 86 244 +927b4 4 146 206 +927b8 c 86 244 +927c4 4 146 206 +927c8 c 86 244 +927d4 4 146 206 +927d8 c 86 244 +927e4 4 146 206 +927e8 c 86 244 +927f4 4 146 206 +927f8 c 86 244 +92804 4 146 206 +92808 c 86 244 +92814 4 146 206 +92818 c 86 244 +92824 4 146 206 +92828 c 86 244 +92834 4 146 206 +92838 c 86 244 +92844 4 146 206 +92848 c 86 244 +92854 4 146 206 +92858 8 86 244 +92860 8 146 206 +92868 4 101 206 +9286c 4 64 239 +92870 c 96 239 +9287c 8 97 239 +92884 8 319 202 +9288c 8 97 239 +92894 8 161 202 +9289c 8 161 202 +928a4 4 175 237 +928a8 4 164 239 +928ac 4 160 239 +928b0 10 165 239 +928c0 c 95 215 +928cc 24 235 236 +928f0 14 74 239 +92904 4 308 238 +92908 24 134 223 +9292c 8 86 244 +92934 8 146 206 +9293c c 86 244 +92948 c 135 223 +92954 8 86 244 +9295c 4 305 238 +FUNC 92960 7b8 0 std::priv::__read_float >, char> +92960 10 368 224 +92970 4 58 228 +92974 4 368 224 +92978 4 58 228 +9297c 8 368 224 +92984 4 58 228 +92988 8 368 224 +92990 8 58 228 +92998 c 368 224 +929a4 4 58 228 +929a8 c 368 224 +929b4 4 368 224 +929b8 4 58 228 +929bc 14 56 228 +929d0 8 57 228 +929d8 4 56 228 +929dc c 57 228 +929e8 18 393 224 +92a00 8 393 224 +92a08 8 396 224 +92a10 8 393 224 +92a18 4 396 224 +92a1c 10 393 224 +92a2c 8 396 224 +92a34 8 338 224 +92a3c 8 339 224 +92a44 10 338 224 +92a54 4 336 224 +92a58 8 338 224 +92a60 4 75 215 +92a64 8 90 215 +92a6c 4 77 215 +92a70 8 90 215 +92a78 10 341 224 +92a88 c 90 215 +92a94 8 42 224 +92a9c 4 39 224 +92aa0 c 344 224 +92aac 4 64 239 +92ab0 8 74 239 +92ab8 10 74 239 +92ac8 c 535 238 +92ad4 4 101 206 +92ad8 4 352 224 +92adc 8 350 224 +92ae4 4 352 224 +92ae8 4 232 247 +92aec c 539 238 +92af8 4 68 215 +92afc 10 229 236 +92b0c 8 228 236 +92b14 8 69 215 +92b1c 14 235 236 +92b30 4 95 215 +92b34 c 341 224 +92b40 10 359 224 +92b50 8 360 224 +92b58 10 361 224 +92b68 10 120 215 +92b78 4 403 224 +92b7c 8 90 215 +92b84 10 403 224 +92b94 4 375 224 +92b98 4 410 224 +92b9c 4 413 224 +92ba0 4 96 239 +92ba4 4 64 239 +92ba8 c 96 239 +92bb4 10 97 239 +92bc4 30 423 224 +92bf4 14 235 236 +92c08 4 93 215 +92c0c 4 95 215 +92c10 4 94 215 +92c14 8 95 215 +92c1c 18 234 236 +92c34 4 95 215 +92c38 8 234 236 +92c40 4 68 215 +92c44 8 346 224 +92c4c 4 347 224 +92c50 10 229 236 +92c60 4 228 236 +92c64 c 229 236 +92c70 8 69 215 +92c78 4 92 215 +92c7c 14 235 236 +92c90 4 95 215 +92c94 4 93 215 +92c98 4 94 215 +92c9c 8 95 215 +92ca4 4 400 238 +92ca8 14 304 238 +92cbc 4 306 238 +92cc0 4 307 238 +92cc4 4 306 238 +92cc8 c 307 238 +92cd4 4 64 213 +92cd8 4 67 213 +92cdc 8 64 213 +92ce4 40 234 236 +92d24 14 74 239 +92d38 8 308 238 +92d40 18 134 223 +92d58 58 86 244 +92db0 20 146 206 +92dd0 4 86 244 +92dd4 4 146 206 +92dd8 10 86 244 +92de8 4 146 206 +92dec c 86 244 +92df8 4 146 206 +92dfc c 86 244 +92e08 4 146 206 +92e0c c 86 244 +92e18 4 146 206 +92e1c c 86 244 +92e28 4 146 206 +92e2c c 86 244 +92e38 4 146 206 +92e3c c 86 244 +92e48 4 146 206 +92e4c c 86 244 +92e58 4 146 206 +92e5c c 86 244 +92e68 4 146 206 +92e6c c 86 244 +92e78 4 146 206 +92e7c c 86 244 +92e88 4 146 206 +92e8c c 86 244 +92e98 4 146 206 +92e9c c 86 244 +92ea8 4 146 206 +92eac 8 86 244 +92eb4 c 146 206 +92ec0 8 101 206 +92ec8 4 64 239 +92ecc c 96 239 +92ed8 8 97 239 +92ee0 8 70 213 +92ee8 8 70 213 +92ef0 4 175 237 +92ef4 8 164 239 +92efc 4 165 239 +92f00 4 175 237 +92f04 8 160 239 +92f0c c 404 224 +92f18 4 68 215 +92f1c 10 229 236 +92f2c 8 228 236 +92f34 4 406 224 +92f38 4 69 215 +92f3c 14 406 224 +92f50 4 410 224 +92f54 4 413 224 +92f58 10 120 215 +92f68 4 413 224 +92f6c 8 90 215 +92f74 4 66 215 +92f78 8 413 224 +92f80 8 413 224 +92f88 c 414 224 +92f94 4 68 215 +92f98 10 229 236 +92fa8 8 228 236 +92fb0 4 416 224 +92fb4 4 69 215 +92fb8 18 416 224 +92fd0 4 416 224 +92fd4 4 416 224 +92fd8 4 416 224 +92fdc 8 417 224 +92fe4 14 416 224 +92ff8 18 417 224 +93010 14 403 224 +93024 c 235 236 +93030 8 95 215 +93038 8 235 236 +93040 8 86 244 +93048 8 146 206 +93050 c 86 244 +9305c 14 235 236 +93070 18 400 224 +93088 24 235 236 +930ac 10 86 244 +930bc 4 66 215 +930c0 8 413 224 +930c8 1c 90 215 +930e4 4 64 239 +930e8 10 96 239 +930f8 1c 97 239 +93114 4 305 238 +FUNC 93118 298 0 std::priv::__do_get_float >, long double, char> +93118 10 427 224 +93128 4 145 212 +9312c 14 427 224 +93140 8 145 212 +93148 4 427 224 +9314c 8 427 224 +93154 4 145 212 +93158 24 351 219 +9317c 4 108 213 +93180 4 351 219 +93184 c 108 213 +93190 4 41 213 +93194 4 108 213 +93198 14 41 213 +931ac 4 101 206 +931b0 4 41 213 +931b4 4 613 237 +931b8 14 434 224 +931cc 4 612 237 +931d0 4 613 237 +931d4 4 611 237 +931d8 8 434 224 +931e0 4 435 224 +931e4 8 440 224 +931ec 8 75 215 +931f4 8 90 215 +931fc 8 77 215 +93204 c 90 215 +93210 c 442 224 +9321c 4 64 239 +93220 4 444 224 +93224 c 96 239 +93230 4 97 239 +93234 8 319 202 +9323c 4 97 239 +93240 8 161 202 +93248 4 161 202 +9324c 8 444 224 +93254 28 445 224 +9327c 10 443 224 +9328c 14 235 236 +932a0 4 93 215 +932a4 4 95 215 +932a8 4 94 215 +932ac 8 95 215 +932b4 8 135 223 +932bc c 436 224 +932c8 8 437 224 +932d0 14 235 236 +932e4 4 93 215 +932e8 4 95 215 +932ec 4 94 215 +932f0 8 95 215 +932f8 48 234 236 +93340 2c 235 236 +9336c 10 444 224 +9337c 8 64 239 +93384 c 96 239 +93390 4 97 239 +93394 4 70 213 +93398 4 97 239 +9339c 4 70 213 +933a0 10 70 213 +FUNC 933b0 34 0 std::num_get > >::do_get +933b0 8 579 224 +933b8 4 582 224 +933bc 8 579 224 +933c4 20 582 224 +FUNC 933e4 298 0 std::priv::__do_get_float >, double, char> +933e4 10 427 224 +933f4 4 145 212 +933f8 14 427 224 +9340c 8 145 212 +93414 4 427 224 +93418 8 427 224 +93420 4 145 212 +93424 24 351 219 +93448 4 108 213 +9344c 4 351 219 +93450 c 108 213 +9345c 4 41 213 +93460 4 108 213 +93464 14 41 213 +93478 4 101 206 +9347c 4 41 213 +93480 4 613 237 +93484 14 434 224 +93498 4 612 237 +9349c 4 613 237 +934a0 4 611 237 +934a4 8 434 224 +934ac 4 435 224 +934b0 8 440 224 +934b8 8 75 215 +934c0 8 90 215 +934c8 8 77 215 +934d0 c 90 215 +934dc c 442 224 +934e8 4 64 239 +934ec 4 444 224 +934f0 c 96 239 +934fc 4 97 239 +93500 8 319 202 +93508 4 97 239 +9350c 8 161 202 +93514 4 161 202 +93518 8 444 224 +93520 28 445 224 +93548 10 443 224 +93558 14 235 236 +9356c 4 93 215 +93570 4 95 215 +93574 4 94 215 +93578 8 95 215 +93580 8 135 223 +93588 c 436 224 +93594 8 437 224 +9359c 14 235 236 +935b0 4 93 215 +935b4 4 95 215 +935b8 4 94 215 +935bc 8 95 215 +935c4 48 234 236 +9360c 2c 235 236 +93638 10 444 224 +93648 8 64 239 +93650 c 96 239 +9365c 4 97 239 +93660 4 70 213 +93664 4 97 239 +93668 4 70 213 +9366c 10 70 213 +FUNC 9367c 34 0 std::num_get > >::do_get +9367c 8 571 224 +93684 4 574 224 +93688 8 571 224 +93690 20 574 224 +FUNC 936b0 298 0 std::priv::__do_get_float >, float, char> +936b0 10 427 224 +936c0 4 145 212 +936c4 14 427 224 +936d8 8 145 212 +936e0 4 427 224 +936e4 8 427 224 +936ec 4 145 212 +936f0 24 351 219 +93714 4 108 213 +93718 4 351 219 +9371c c 108 213 +93728 4 41 213 +9372c 4 108 213 +93730 14 41 213 +93744 4 101 206 +93748 4 41 213 +9374c 4 613 237 +93750 14 434 224 +93764 4 612 237 +93768 4 613 237 +9376c 4 611 237 +93770 8 434 224 +93778 4 435 224 +9377c 8 440 224 +93784 8 75 215 +9378c 8 90 215 +93794 8 77 215 +9379c c 90 215 +937a8 c 442 224 +937b4 4 64 239 +937b8 4 444 224 +937bc c 96 239 +937c8 4 97 239 +937cc 8 319 202 +937d4 4 97 239 +937d8 8 161 202 +937e0 4 161 202 +937e4 8 444 224 +937ec 28 445 224 +93814 10 443 224 +93824 14 235 236 +93838 4 93 215 +9383c 4 95 215 +93840 4 94 215 +93844 8 95 215 +9384c 8 135 223 +93854 c 436 224 +93860 8 437 224 +93868 14 235 236 +9387c 4 93 215 +93880 4 95 215 +93884 4 94 215 +93888 8 95 215 +93890 48 234 236 +938d8 2c 235 236 +93904 10 444 224 +93914 8 64 239 +9391c c 96 239 +93928 4 97 239 +9392c 4 70 213 +93930 4 97 239 +93934 4 70 213 +93938 10 70 213 +FUNC 93948 34 0 std::num_get > >::do_get +93948 8 564 224 +93950 4 567 224 +93954 8 564 224 +9395c 20 567 224 +FUNC 9397c 4c8 0 std::priv::__copy_integer_and_fill > > +9397c 4 148 226 +93980 4 152 226 +93984 14 148 226 +93998 10 148 226 +939a8 4 152 226 +939ac 4 161 226 +939b0 4 159 226 +939b4 8 163 226 +939bc 10 167 226 +939cc 4 167 226 +939d0 14 167 226 +939e4 c 173 226 +939f0 10 173 226 +93a00 18 480 201 +93a18 4 62 230 +93a1c 4 200 236 +93a20 4 199 236 +93a24 4 200 236 +93a28 4 199 236 +93a2c 8 200 236 +93a34 8 199 236 +93a3c 8 480 201 +93a44 4 182 226 +93a48 4 213 201 +93a4c 4 182 226 +93a50 14 213 201 +93a64 8 199 236 +93a6c 4 215 201 +93a70 8 213 201 +93a78 4 214 201 +93a7c 4 62 230 +93a80 4 200 236 +93a84 4 199 236 +93a88 4 200 236 +93a8c 4 199 236 +93a90 8 200 236 +93a98 4 199 236 +93a9c 4 223 247 +93aa0 c 199 236 +93aac 4 200 236 +93ab0 4 215 201 +93ab4 4 200 236 +93ab8 8 62 230 +93ac0 14 213 201 +93ad4 18 186 226 +93aec 4 199 236 +93af0 4 223 247 +93af4 c 199 236 +93b00 c 200 236 +93b0c c 62 230 +93b18 20 213 201 +93b38 8 199 236 +93b40 4 215 201 +93b44 8 213 201 +93b4c 4 214 201 +93b50 4 62 230 +93b54 4 200 236 +93b58 4 199 236 +93b5c 4 200 236 +93b60 4 199 236 +93b64 8 200 236 +93b6c 4 199 236 +93b70 4 223 247 +93b74 c 199 236 +93b80 8 200 236 +93b88 c 62 230 +93b94 c 169 226 +93ba0 14 480 201 +93bb4 4 62 230 +93bb8 4 200 236 +93bbc 4 199 236 +93bc0 4 200 236 +93bc4 4 199 236 +93bc8 8 200 236 +93bd0 8 199 236 +93bd8 8 480 201 +93be0 8 171 226 +93be8 4 213 201 +93bec 8 170 226 +93bf4 1c 213 201 +93c10 8 199 236 +93c18 4 215 201 +93c1c 8 213 201 +93c24 4 214 201 +93c28 4 62 230 +93c2c 4 200 236 +93c30 4 199 236 +93c34 4 200 236 +93c38 4 199 236 +93c3c 8 200 236 +93c44 4 199 236 +93c48 4 223 247 +93c4c c 199 236 +93c58 8 200 236 +93c60 c 62 230 +93c6c 4 199 236 +93c70 4 223 247 +93c74 c 199 236 +93c80 c 200 236 +93c8c c 62 230 +93c98 20 213 201 +93cb8 8 199 236 +93cc0 4 215 201 +93cc4 8 213 201 +93ccc 4 214 201 +93cd0 4 62 230 +93cd4 4 200 236 +93cd8 4 199 236 +93cdc 4 200 236 +93ce0 4 199 236 +93ce4 8 200 236 +93cec 4 199 236 +93cf0 4 223 247 +93cf4 c 199 236 +93d00 c 200 236 +93d0c c 62 230 +93d18 4 164 226 +93d1c 4 480 201 +93d20 4 164 226 +93d24 c 480 201 +93d30 4 62 230 +93d34 4 200 236 +93d38 4 199 236 +93d3c 4 200 236 +93d40 4 199 236 +93d44 8 200 236 +93d4c 8 199 236 +93d54 c 480 201 +93d60 4 199 236 +93d64 4 223 247 +93d68 c 199 236 +93d74 c 200 236 +93d80 c 62 230 +93d8c 10 176 226 +93d9c 10 177 226 +93dac 14 480 201 +93dc0 4 62 230 +93dc4 4 200 236 +93dc8 4 199 236 +93dcc 4 200 236 +93dd0 4 199 236 +93dd4 8 200 236 +93ddc 8 199 236 +93de4 8 480 201 +93dec 10 285 201 +93dfc 8 178 226 +93e04 14 285 201 +93e18 4 199 236 +93e1c 4 223 247 +93e20 c 199 236 +93e2c c 200 236 +93e38 c 62 230 +FUNC 93e44 1e8 0 std::priv::__put_integer > > +93e44 28 232 226 +93e6c 4 145 212 +93e70 4 235 226 +93e74 8 145 212 +93e7c c 232 226 +93e88 c 232 226 +93e94 4 145 212 +93e98 14 351 219 +93eac 4 237 226 +93eb0 4 58 228 +93eb4 4 237 226 +93eb8 14 58 228 +93ecc 10 240 226 +93edc 4 249 226 +93ee0 4 242 226 +93ee4 4 224 201 +93ee8 8 57 228 +93ef0 4 255 226 +93ef4 c 57 228 +93f00 20 256 226 +93f20 4 254 226 +93f24 4 260 226 +93f28 4 138 212 +93f2c 4 260 226 +93f30 4 139 212 +93f34 24 260 226 +93f58 4 64 239 +93f5c 4 260 226 +93f60 c 96 239 +93f6c 8 97 239 +93f74 8 161 202 +93f7c 4 161 202 +93f80 30 261 226 +93fb0 c 243 226 +93fbc 8 246 226 +93fc4 4 224 201 +93fc8 14 224 201 +93fdc 8 135 223 +93fe4 8 244 226 +93fec 8 64 239 +93ff4 c 96 239 +94000 1c 97 239 +9401c 10 237 226 +FUNC 9402c a4 0 std::priv::__do_put_integer >, long unsigned int> +9402c 14 372 226 +94040 10 372 226 +94050 4 307 226 +94054 4 309 226 +94058 4 308 226 +9405c 4 309 226 +94060 4 308 226 +94064 4 309 226 +94068 4 310 226 +9406c 4 308 226 +94070 4 309 226 +94074 14 381 226 +94088 38 382 226 +940c0 10 310 226 +FUNC 940d0 1fc 0 std::num_put > >::do_put +940d0 c 475 226 +940dc 4 145 212 +940e0 8 475 226 +940e8 4 145 212 +940ec 4 475 226 +940f0 4 145 212 +940f4 c 475 226 +94100 4 475 226 +94104 4 145 212 +94108 18 351 219 +94120 c 477 226 +9412c 4 124 212 +94130 4 139 212 +94134 4 123 212 +94138 4 139 212 +9413c 8 124 212 +94144 4 484 226 +94148 c 101 207 +94154 4 506 226 +94158 c 101 207 +94164 14 506 226 +94178 4 112 212 +9417c 18 514 226 +94194 4 488 226 +94198 8 488 226 +941a0 18 101 207 +941b8 4 62 230 +941bc 10 200 236 +941cc c 199 236 +941d8 18 101 207 +941f0 10 200 236 +94200 10 199 236 +94210 c 139 212 +9421c c 488 226 +94228 1c 101 207 +94244 18 199 236 +9425c 8 200 236 +94264 8 62 230 +9426c 1c 101 207 +94288 4 199 236 +9428c 4 223 247 +94290 14 199 236 +942a4 8 200 236 +942ac 10 62 230 +942bc 10 477 226 +FUNC 942cc 28 0 std::num_put > >::do_put +942cc 4 438 226 +942d0 8 440 226 +942d8 4 438 226 +942dc c 440 226 +942e8 c 440 226 +FUNC 942f4 a8 0 std::num_put > >::do_put +942f4 18 465 226 +9430c 10 465 226 +9431c 4 307 226 +94320 4 309 226 +94324 4 308 226 +94328 4 309 226 +9432c 4 308 226 +94330 4 309 226 +94334 4 310 226 +94338 4 309 226 +9433c 4 308 226 +94340 18 381 226 +94358 34 467 226 +9438c 10 310 226 +FUNC 9439c 70 0 std::num_put > >::do_put +9439c 10 459 226 +943ac 8 380 226 +943b4 4 459 226 +943b8 4 380 226 +943bc 8 459 226 +943c4 4 380 226 +943c8 4 459 226 +943cc 4 380 226 +943d0 4 459 226 +943d4 8 380 226 +943dc 1c 381 226 +943f8 14 461 226 +FUNC 9440c 70 0 std::num_put > >::do_put +9440c 10 432 226 +9441c 8 380 226 +94424 4 432 226 +94428 4 380 226 +9442c 8 432 226 +94434 4 380 226 +94438 4 432 226 +9443c 4 380 226 +94440 4 432 226 +94444 8 380 226 +9444c 1c 381 226 +94468 14 434 226 +FUNC 9447c 420 0 std::basic_string, std::allocator >::_M_append +9447c 4 196 237 +94480 4 197 237 +94484 10 196 237 +94494 4 196 237 +94498 4 197 237 +9449c 4 64 239 +944a0 8 198 237 +944a8 8 74 239 +944b0 10 74 239 +944c0 8 199 237 +944c8 4 210 237 +944cc 4 211 237 +944d0 8 86 244 +944d8 58 86 244 +94530 24 146 206 +94554 4 86 244 +94558 4 146 206 +9455c 10 86 244 +9456c 4 146 206 +94570 8 86 244 +94578 4 146 206 +9457c 4 101 206 +94580 8 212 237 +94588 4 267 247 +9458c 4 214 237 +94590 18 218 237 +945a8 4 400 238 +945ac 4 304 238 +945b0 4 400 238 +945b4 18 304 238 +945cc 4 306 238 +945d0 10 307 238 +945e0 8 346 202 +945e8 4 347 202 +945ec 8 158 202 +945f4 30 158 202 +94624 58 86 244 +9467c 24 146 206 +946a0 4 86 244 +946a4 4 146 206 +946a8 10 86 244 +946b8 4 146 206 +946bc c 86 244 +946c8 8 146 206 +946d0 58 86 244 +94728 24 146 206 +9474c 4 86 244 +94750 4 146 206 +94754 10 86 244 +94764 4 146 206 +94768 8 86 244 +94770 8 146 206 +94778 4 101 206 +9477c c 96 239 +94788 8 97 239 +94790 8 161 202 +94798 8 161 202 +947a0 4 160 239 +947a4 4 218 237 +947a8 4 165 239 +947ac 4 164 239 +947b0 14 218 237 +947c4 c 347 202 +947d0 1c 134 223 +947ec 4 146 206 +947f0 8 86 244 +947f8 4 101 206 +947fc 8 212 237 +94804 4 267 247 +94808 8 214 237 +94810 20 74 239 +94830 8 86 244 +94838 8 146 206 +94840 14 86 244 +94854 8 146 206 +9485c 14 86 244 +94870 c 135 223 +9487c 4 346 202 +94880 8 356 202 +94888 8 86 244 +94890 c 600 237 +FUNC 9489c 1d0 0 std::basic_string, std::allocator >::_M_reserve +9489c 4 170 237 +948a0 4 342 202 +948a4 c 170 237 +948b0 4 342 202 +948b4 4 170 237 +948b8 4 342 202 +948bc 4 346 202 +948c0 8 347 202 +948c8 8 158 202 +948d0 c 158 202 +948dc 10 352 202 +948ec c 86 244 +948f8 58 86 244 +94950 24 146 206 +94974 4 86 244 +94978 4 146 206 +9497c 10 86 244 +9498c 4 146 206 +94990 8 86 244 +94998 8 146 206 +949a0 4 101 206 +949a4 c 96 239 +949b0 8 97 239 +949b8 8 161 202 +949c0 8 161 202 +949c8 4 160 239 +949cc 4 164 239 +949d0 4 165 239 +949d4 10 176 237 +949e4 c 134 223 +949f0 8 86 244 +949f8 8 146 206 +94a00 c 86 244 +94a0c 8 135 223 +94a14 4 160 239 +94a18 4 164 239 +94a1c 4 165 239 +94a20 10 176 237 +94a30 4 346 202 +94a34 8 356 202 +94a3c 8 86 244 +94a44 c 343 202 +94a50 4 343 202 +94a54 18 343 202 +FUNC 94a6c 4c4 0 std::basic_string, std::allocator >::assign +94a6c 18 222 237 +94a84 4 400 238 +94a88 8 222 237 +94a90 4 400 238 +94a94 4 222 237 +94a98 4 400 238 +94a9c 8 222 237 +94aa4 8 223 237 +94aac 4 72 239 +94ab0 4 64 239 +94ab4 4 72 239 +94ab8 10 72 239 +94ac8 8 228 237 +94ad0 14 261 247 +94ae4 8 400 238 +94aec 8 181 237 +94af4 20 238 237 +94b14 4 608 237 +94b18 4 120 239 +94b1c 4 608 237 +94b20 4 120 239 +94b24 4 481 202 +94b28 4 247 238 +94b2c 4 608 237 +94b30 c 610 237 +94b3c 4 314 244 +94b40 4 249 244 +94b44 4 314 244 +94b48 30 249 244 +94b78 20 146 206 +94b98 4 249 244 +94b9c 4 146 206 +94ba0 8 249 244 +94ba8 4 146 206 +94bac 8 249 244 +94bb4 4 146 206 +94bb8 4 248 238 +94bbc 4 64 239 +94bc0 10 101 206 +94bd0 28 171 239 +94bf8 8 170 239 +94c00 8 185 239 +94c08 4 92 201 +94c0c 4 91 201 +94c10 4 92 201 +94c14 4 93 201 +94c18 4 92 201 +94c1c 4 91 201 +94c20 4 92 201 +94c24 4 93 201 +94c28 4 92 201 +94c2c 4 91 201 +94c30 4 92 201 +94c34 4 93 201 +94c38 4 64 239 +94c3c c 96 239 +94c48 8 97 239 +94c50 8 161 202 +94c58 8 161 202 +94c60 c 600 237 +94c6c 14 261 247 +94c80 8 225 237 +94c88 8 803 238 +94c90 c 249 247 +94c9c 4 806 238 +94ca0 4 249 247 +94ca4 4 238 237 +94ca8 4 806 238 +94cac 4 238 237 +94cb0 8 806 238 +94cb8 18 238 237 +94cd0 14 91 201 +94ce4 10 92 201 +94cf4 10 93 201 +94d04 4 174 239 +94d08 4 173 239 +94d0c 8 174 239 +94d14 4 175 239 +94d18 4 174 239 +94d1c 8 175 239 +94d24 4 178 239 +94d28 8 179 239 +94d30 4 249 244 +94d34 4 249 244 +94d38 4 249 244 +94d3c 4 146 206 +94d40 8 249 244 +94d48 8 72 239 +94d50 c 342 202 +94d5c 8 347 202 +94d64 4 158 202 +94d68 4 347 202 +94d6c 4 158 202 +94d70 8 158 202 +94d78 4 352 202 +94d7c 4 613 237 +94d80 4 611 237 +94d84 14 613 237 +94d98 10 182 237 +94da8 8 74 239 +94db0 c 74 239 +94dbc 8 184 237 +94dc4 8 186 237 +94dcc 4 249 244 +94dd0 30 249 244 +94e00 20 146 206 +94e20 4 249 244 +94e24 4 146 206 +94e28 8 249 244 +94e30 4 146 206 +94e34 8 249 244 +94e3c 4 146 206 +94e40 4 187 237 +94e44 8 238 237 +94e4c 4 101 206 +94e50 4 187 237 +94e54 4 267 247 +94e58 4 238 237 +94e5c 4 189 237 +94e60 14 238 237 +94e74 8 134 223 +94e7c 14 135 223 +94e90 4 306 238 +94e94 14 307 238 +94ea8 10 185 237 +94eb8 c 189 239 +94ec4 4 187 239 +94ec8 4 188 239 +94ecc 4 189 239 +94ed0 4 193 239 +94ed4 4 192 239 +94ed8 c 193 239 +94ee4 4 194 239 +94ee8 4 195 239 +94eec 8 196 239 +94ef4 c 74 239 +94f00 8 308 238 +94f08 c 343 202 +94f14 4 343 202 +94f18 18 343 202 +FUNC 94f30 7f4 0 std::priv::__get_monetary_value >, std::back_insert_iterator, std::allocator > >, wchar_t> +94f30 20 62 221 +94f50 4 112 215 +94f54 14 62 221 +94f68 18 62 221 +94f80 8 112 215 +94f88 4 66 221 +94f8c 8 90 215 +94f94 1c 184 207 +94fb0 4 66 221 +94fb4 4 67 221 +94fb8 28 118 221 +94fe0 4 70 221 +94fe4 4 70 221 +94fe8 1c 70 221 +95004 4 81 221 +95008 10 95 215 +95018 4 75 215 +9501c 8 90 215 +95024 8 77 215 +9502c c 90 215 +95038 c 73 221 +95044 c 90 215 +95050 18 184 207 +95068 4 74 221 +9506c 4 78 221 +95070 c 90 215 +9507c 8 79 221 +95084 4 68 215 +95088 8 80 221 +95090 10 229 236 +950a0 c 228 236 +950ac 4 69 215 +950b0 4 80 221 +950b4 8 81 221 +950bc 1c 235 236 +950d8 4 93 215 +950dc 4 73 221 +950e0 4 94 215 +950e4 4 95 215 +950e8 14 73 221 +950fc 8 90 221 +95104 c 93 221 +95110 8 94 221 +95118 4 97 221 +9511c 4 96 221 +95120 10 112 215 +95130 4 99 221 +95134 8 90 215 +9513c 10 99 221 +9514c 14 100 221 +95160 4 307 238 +95164 8 267 247 +9516c 4 535 238 +95170 4 267 247 +95174 8 101 206 +9517c 4 100 221 +95180 4 267 247 +95184 4 539 238 +95188 4 100 221 +9518c 4 64 239 +95190 8 74 239 +95198 c 74 239 +951a4 8 535 238 +951ac 14 400 238 +951c0 4 306 238 +951c4 10 307 238 +951d4 10 536 238 +951e4 4 76 221 +951e8 4 75 221 +951ec 4 76 221 +951f0 4 75 221 +951f4 4 76 221 +951f8 8 90 215 +95200 4 64 239 +95204 4 66 215 +95208 8 74 239 +95210 14 74 239 +95224 8 535 238 +9522c 4 267 247 +95230 8 101 206 +95238 4 267 247 +9523c 8 539 238 +95244 4 92 215 +95248 1c 235 236 +95264 4 93 215 +95268 4 94 215 +9526c 8 95 215 +95274 1c 235 236 +95290 4 93 215 +95294 4 94 215 +95298 8 95 215 +952a0 4 92 215 +952a4 1c 235 236 +952c0 4 93 215 +952c4 4 94 215 +952c8 8 95 215 +952d0 4 228 236 +952d4 1c 229 236 +952f0 48 234 236 +95338 4 64 239 +9533c 4 66 215 +95340 8 74 239 +95348 10 74 239 +95358 8 535 238 +95360 14 400 238 +95374 4 306 238 +95378 14 307 238 +9538c 18 536 238 +953a4 20 234 236 +953c4 8 91 221 +953cc 4 68 215 +953d0 10 229 236 +953e0 10 228 236 +953f0 4 69 215 +953f4 4 108 221 +953f8 8 95 215 +95400 4 75 215 +95404 8 90 215 +9540c 8 77 215 +95414 c 90 215 +95420 c 110 221 +9542c 8 90 215 +95434 1c 184 207 +95450 4 110 221 +95454 10 115 221 +95464 4 115 221 +95468 4 117 221 +9546c 1c 235 236 +95488 4 93 215 +9548c 4 94 215 +95490 8 95 215 +95498 8 111 221 +954a0 4 90 215 +954a4 8 111 221 +954ac 4 90 215 +954b0 4 64 239 +954b4 8 74 239 +954bc 14 74 239 +954d0 8 535 238 +954d8 4 267 247 +954dc 8 101 206 +954e4 4 112 221 +954e8 4 267 247 +954ec 8 539 238 +954f4 14 235 236 +95508 4 93 215 +9550c 4 64 239 +95510 8 74 239 +95518 10 74 239 +95528 8 535 238 +95530 14 400 238 +95544 4 306 238 +95548 14 307 238 +9555c 10 536 238 +9556c 1c 235 236 +95588 4 93 215 +9558c 4 94 215 +95590 14 95 215 +955a4 3c 234 236 +955e0 10 74 239 +955f0 8 308 238 +955f8 14 234 236 +9560c 8 235 236 +95614 8 93 215 +9561c 1c 234 236 +95638 18 308 238 +95650 1c 184 207 +9566c 8 66 221 +95674 28 235 236 +9569c 14 90 221 +956b0 8 94 221 +956b8 40 235 236 +956f8 8 70 221 +95700 24 235 236 +FUNC 95724 b48 0 std::priv::__money_do_get >, std::basic_string, std::allocator > > +95724 48 122 221 +9576c c 122 221 +95778 8 112 215 +95780 4 122 221 +95784 8 112 215 +9578c 4 125 221 +95790 4 126 221 +95794 4 127 221 +95798 8 126 221 +957a0 3c 272 221 +957dc 14 145 212 +957f0 3c 351 219 +9582c 8 143 221 +95834 10 220 222 +95844 4 143 221 +95848 c 217 222 +95854 8 143 221 +9585c 10 217 222 +9586c 18 216 222 +95884 c 120 239 +95890 4 171 216 +95894 4 120 239 +95898 4 149 221 +9589c 8 120 239 +958a4 8 149 221 +958ac 4 154 221 +958b0 4 481 202 +958b4 4 154 221 +958b8 4 101 206 +958bc 4 154 221 +958c0 8 220 221 +958c8 8 214 222 +958d0 24 154 221 +958f4 10 181 222 +95904 4 143 221 +95908 c 178 222 +95914 8 143 221 +9591c 10 178 222 +9592c 1c 177 222 +95948 10 112 215 +95958 4 176 221 +9595c 10 177 221 +9596c 14 179 221 +95980 c 192 221 +9598c 8 153 221 +95994 14 244 221 +959a8 4 400 238 +959ac 8 245 221 +959b4 14 247 221 +959c8 10 248 221 +959d8 4 249 221 +959dc 8 248 221 +959e4 4 249 221 +959e8 c 250 221 +959f4 4 252 221 +959f8 10 112 215 +95a08 4 268 221 +95a0c c 269 221 +95a18 4 271 221 +95a1c 4 96 239 +95a20 4 64 239 +95a24 c 96 239 +95a30 18 97 239 +95a48 4 64 239 +95a4c c 96 239 +95a58 14 97 239 +95a6c 8 64 239 +95a74 c 96 239 +95a80 18 97 239 +95a98 c 271 221 +95aa4 8 167 221 +95aac 14 176 222 +95ac0 18 169 221 +95ad8 1c 170 221 +95af4 8 171 221 +95afc 4 64 239 +95b00 8 172 221 +95b08 4 64 239 +95b0c 8 172 221 +95b14 4 96 239 +95b18 c 172 221 +95b24 8 96 239 +95b2c 18 97 239 +95b44 10 90 215 +95b54 1c 184 207 +95b70 4 156 221 +95b74 4 68 215 +95b78 10 229 236 +95b88 c 228 236 +95b94 4 69 215 +95b98 4 95 215 +95b9c 4 75 215 +95ba0 8 90 215 +95ba8 8 77 215 +95bb0 c 90 215 +95bbc c 162 221 +95bc8 c 90 215 +95bd4 18 184 207 +95bec 4 162 221 +95bf0 4 68 215 +95bf4 10 229 236 +95c04 c 228 236 +95c10 8 69 215 +95c18 1c 235 236 +95c34 4 93 215 +95c38 4 94 215 +95c3c 8 95 215 +95c44 8 215 221 +95c4c 10 173 222 +95c5c 4 179 222 +95c60 4 173 222 +95c64 c 179 222 +95c70 4 175 222 +95c74 4 179 222 +95c78 10 175 222 +95c88 c 220 221 +95c94 10 225 221 +95ca4 8 225 221 +95cac 10 174 222 +95cbc 4 213 222 +95cc0 28 227 221 +95ce8 4 232 221 +95cec 4 227 221 +95cf0 8 232 221 +95cf8 c 233 221 +95d04 4 234 221 +95d08 8 64 239 +95d10 c 96 239 +95d1c 18 97 239 +95d34 10 95 215 +95d44 4 92 215 +95d48 1c 235 236 +95d64 4 93 215 +95d68 4 94 215 +95d6c 8 95 215 +95d74 4 228 236 +95d78 c 229 236 +95d84 8 69 215 +95d8c 1c 235 236 +95da8 4 93 215 +95dac 4 94 215 +95db0 8 95 215 +95db8 54 234 236 +95e0c 44 235 236 +95e50 4 400 238 +95e54 8 256 221 +95e5c 14 258 221 +95e70 10 259 221 +95e80 4 260 221 +95e84 8 259 221 +95e8c 4 260 221 +95e90 c 261 221 +95e9c 4 263 221 +95ea0 18 206 207 +95eb8 c 359 238 +95ec4 18 517 238 +95edc 8 263 221 +95ee4 10 212 222 +95ef4 4 218 222 +95ef8 4 212 222 +95efc c 218 222 +95f08 4 214 222 +95f0c 4 218 222 +95f10 14 214 222 +95f24 1c 215 222 +95f40 c 187 221 +95f4c 8 90 215 +95f54 4 66 215 +95f58 14 197 221 +95f6c c 201 221 +95f78 8 90 215 +95f80 c 203 221 +95f8c 4 68 215 +95f90 10 229 236 +95fa0 8 228 236 +95fa8 8 69 215 +95fb0 1c 213 222 +95fcc 14 69 215 +95fe0 c 243 237 +95fec 4 400 238 +95ff0 4 249 247 +95ff4 8 400 238 +95ffc 8 244 237 +96004 8 249 247 +9600c 10 246 237 +9601c 8 803 238 +96024 c 249 247 +96030 4 806 238 +96034 4 249 247 +96038 10 806 238 +96048 4 68 215 +9604c 10 229 236 +9605c 4 228 236 +96060 4 69 215 +96064 18 228 236 +9607c 4 249 247 +96080 4 400 238 +96084 4 250 237 +96088 c 400 238 +96094 14 250 237 +960a8 c 188 221 +960b4 8 90 215 +960bc 18 190 221 +960d4 20 69 215 +960f4 8 225 221 +960fc 8 157 221 +96104 c 158 221 +96110 8 69 215 +96118 8 235 221 +96120 4 96 239 +96124 4 64 239 +96128 4 236 221 +9612c c 96 239 +96138 2c 97 239 +96164 4 64 239 +96168 10 96 239 +96178 18 97 239 +96190 4 96 239 +96194 4 64 239 +96198 c 96 239 +961a4 18 97 239 +961bc 4 64 239 +961c0 c 96 239 +961cc 14 97 239 +961e0 8 64 239 +961e8 c 96 239 +961f4 18 97 239 +9620c 24 271 221 +96230 4 64 239 +96234 10 96 239 +96244 28 97 239 +FUNC 9626c 54 0 std::money_get > >::do_get +9626c 4 304 221 +96270 14 308 221 +96284 8 304 221 +9628c 4 308 221 +96290 4 307 221 +96294 4 307 221 +96298 4 308 221 +9629c 4 307 221 +962a0 10 308 221 +962b0 10 309 221 +FUNC 962c0 154 0 std::money_get > >::do_get +962c0 4 279 221 +962c4 4 284 221 +962c8 4 283 221 +962cc 8 279 221 +962d4 4 283 221 +962d8 4 279 221 +962dc 4 120 239 +962e0 4 279 221 +962e4 4 283 221 +962e8 4 284 221 +962ec 4 279 221 +962f0 4 284 221 +962f4 4 279 221 +962f8 1c 284 221 +96314 4 120 239 +96318 4 481 202 +9631c 4 101 206 +96320 4 284 221 +96324 4 286 221 +96328 10 284 221 +96338 c 286 221 +96344 4 287 221 +96348 4 289 221 +9634c 8 287 221 +96354 4 289 221 +96358 14 292 221 +9636c 8 294 221 +96374 4 64 239 +96378 c 96 239 +96384 8 97 239 +9638c 8 161 202 +96394 4 161 202 +96398 20 300 221 +963b8 18 295 221 +963d0 c 289 221 +963dc 8 135 223 +963e4 8 64 239 +963ec c 96 239 +963f8 1c 97 239 +FUNC 96414 504 0 std::basic_string, std::allocator >::assign +96414 20 222 237 +96434 4 400 238 +96438 4 222 237 +9643c 4 400 238 +96440 8 223 237 +96448 4 72 239 +9644c 4 64 239 +96450 4 72 239 +96454 c 72 239 +96460 8 228 237 +96468 4 120 239 +9646c 8 124 239 +96474 4 120 239 +96478 4 481 202 +9647c 8 124 239 +96484 4 249 244 +96488 4 249 244 +9648c 4 314 244 +96490 28 249 244 +964b8 20 146 206 +964d8 4 249 244 +964dc 4 146 206 +964e0 8 249 244 +964e8 4 146 206 +964ec 8 249 244 +964f4 4 146 206 +964f8 8 249 244 +96500 4 146 206 +96504 8 249 244 +9650c 4 146 206 +96510 8 249 244 +96518 4 146 206 +9651c 8 249 244 +96524 4 146 206 +96528 8 249 244 +96530 4 146 206 +96534 8 249 244 +9653c 4 146 206 +96540 8 249 244 +96548 4 146 206 +9654c 8 249 244 +96554 4 146 206 +96558 8 249 244 +96560 4 146 206 +96564 8 249 244 +9656c 4 146 206 +96570 8 249 244 +96578 4 146 206 +9657c 8 249 244 +96584 4 146 206 +96588 4 248 238 +9658c 4 64 239 +96590 18 101 206 +965a8 28 171 239 +965d0 8 170 239 +965d8 8 185 239 +965e0 4 92 201 +965e4 4 91 201 +965e8 4 92 201 +965ec 4 93 201 +965f0 4 92 201 +965f4 4 91 201 +965f8 4 92 201 +965fc 4 93 201 +96600 4 92 201 +96604 4 91 201 +96608 4 92 201 +9660c 4 93 201 +96610 4 64 239 +96614 c 96 239 +96620 8 97 239 +96628 8 161 202 +96630 8 161 202 +96638 10 235 247 +96648 4 400 238 +9664c 8 181 237 +96654 18 238 237 +9666c c 235 247 +96678 c 225 237 +96684 8 803 238 +9668c 4 168 247 +96690 4 806 238 +96694 4 168 247 +96698 4 806 238 +9669c 4 238 237 +966a0 8 806 238 +966a8 14 238 237 +966bc 4 92 201 +966c0 4 91 201 +966c4 4 92 201 +966c8 4 91 201 +966cc 8 92 201 +966d4 8 93 201 +966dc c 174 239 +966e8 4 173 239 +966ec c 174 239 +966f8 c 175 239 +96704 4 178 239 +96708 8 91 201 +96710 8 179 239 +96718 8 72 239 +96720 10 182 237 +96730 8 74 239 +96738 8 74 239 +96740 c 184 237 +9674c 8 186 237 +96754 4 249 244 +96758 4 249 244 +9675c 2c 249 244 +96788 20 146 206 +967a8 4 249 244 +967ac 4 146 206 +967b0 8 249 244 +967b8 4 146 206 +967bc 8 249 244 +967c4 4 146 206 +967c8 8 249 244 +967d0 4 146 206 +967d4 8 249 244 +967dc 4 146 206 +967e0 8 249 244 +967e8 4 146 206 +967ec 8 249 244 +967f4 4 146 206 +967f8 8 249 244 +96800 4 146 206 +96804 8 249 244 +9680c 4 146 206 +96810 8 249 244 +96818 4 146 206 +9681c 8 249 244 +96824 4 146 206 +96828 8 249 244 +96830 4 146 206 +96834 8 249 244 +9683c 4 146 206 +96840 8 249 244 +96848 4 146 206 +9684c 8 249 244 +96854 8 146 206 +9685c 8 101 206 +96864 4 232 247 +96868 4 189 237 +9686c 4 238 237 +96870 8 189 237 +96878 14 238 237 +9688c 14 135 223 +968a0 4 306 238 +968a4 10 307 238 +968b4 10 185 237 +968c4 4 189 239 +968c8 4 188 239 +968cc 4 189 239 +968d0 4 187 239 +968d4 8 189 239 +968dc 4 192 239 +968e0 10 193 239 +968f0 4 194 239 +968f4 4 195 239 +968f8 8 196 239 +96900 c 74 239 +9690c 8 308 238 +96914 4 183 237 +FUNC 96918 7cc 0 std::priv::__get_monetary_value >, std::back_insert_iterator, std::allocator > >, char> +96918 1c 62 221 +96934 4 112 215 +96938 20 62 221 +96958 10 62 221 +96968 8 112 215 +96970 4 66 221 +96974 8 90 215 +9697c c 79 207 +96988 4 66 221 +9698c 4 67 221 +96990 20 118 221 +969b0 4 70 221 +969b4 4 70 221 +969b8 18 70 221 +969d0 4 81 221 +969d4 8 95 215 +969dc 4 75 215 +969e0 8 90 215 +969e8 8 77 215 +969f0 c 90 215 +969fc c 73 221 +96a08 10 90 215 +96a18 8 79 207 +96a20 8 74 221 +96a28 4 78 221 +96a2c 8 90 215 +96a34 8 79 221 +96a3c 4 68 215 +96a40 8 80 221 +96a48 10 229 236 +96a58 8 228 236 +96a60 4 69 215 +96a64 4 80 221 +96a68 8 81 221 +96a70 14 235 236 +96a84 4 93 215 +96a88 4 73 221 +96a8c 4 94 215 +96a90 4 95 215 +96a94 14 73 221 +96aa8 8 90 221 +96ab0 c 93 221 +96abc 8 94 221 +96ac4 4 97 221 +96ac8 4 96 221 +96acc 10 112 215 +96adc 4 99 221 +96ae0 8 90 215 +96ae8 10 99 221 +96af8 14 100 221 +96b0c 8 232 247 +96b14 8 101 206 +96b1c 8 100 221 +96b24 4 232 247 +96b28 c 539 238 +96b34 4 100 221 +96b38 4 64 239 +96b3c 8 74 239 +96b44 8 74 239 +96b4c c 535 238 +96b58 4 400 238 +96b5c 14 304 238 +96b70 4 306 238 +96b74 10 307 238 +96b84 10 536 238 +96b94 4 75 221 +96b98 4 76 221 +96b9c 4 75 221 +96ba0 4 76 221 +96ba4 4 90 215 +96ba8 8 76 221 +96bb0 4 90 215 +96bb4 4 64 239 +96bb8 8 74 239 +96bc0 10 74 239 +96bd0 c 535 238 +96bdc 8 101 206 +96be4 4 232 247 +96be8 14 539 238 +96bfc 4 92 215 +96c00 18 235 236 +96c18 4 93 215 +96c1c 4 94 215 +96c20 8 95 215 +96c28 14 235 236 +96c3c 4 93 215 +96c40 4 94 215 +96c44 8 95 215 +96c4c 4 92 215 +96c50 14 235 236 +96c64 4 93 215 +96c68 4 94 215 +96c6c 8 95 215 +96c74 8 228 236 +96c7c 14 229 236 +96c90 3c 234 236 +96ccc 10 235 236 +96cdc 8 64 239 +96ce4 8 74 239 +96cec 8 74 239 +96cf4 4 535 238 +96cf8 4 74 239 +96cfc 8 535 238 +96d04 4 400 238 +96d08 14 304 238 +96d1c 4 306 238 +96d20 10 307 238 +96d30 18 536 238 +96d48 1c 234 236 +96d64 8 91 221 +96d6c 4 68 215 +96d70 10 229 236 +96d80 c 228 236 +96d8c 4 69 215 +96d90 4 108 221 +96d94 8 95 215 +96d9c 4 75 215 +96da0 8 90 215 +96da8 8 77 215 +96db0 c 90 215 +96dbc c 110 221 +96dc8 8 90 215 +96dd0 c 79 207 +96ddc 4 110 221 +96de0 c 115 221 +96dec 4 117 221 +96df0 4 115 221 +96df4 4 115 221 +96df8 20 118 221 +96e18 14 235 236 +96e2c 4 93 215 +96e30 4 94 215 +96e34 8 95 215 +96e3c 8 111 221 +96e44 4 90 215 +96e48 8 111 221 +96e50 4 90 215 +96e54 4 64 239 +96e58 8 74 239 +96e60 10 74 239 +96e70 c 535 238 +96e7c 4 101 206 +96e80 8 112 221 +96e88 4 232 247 +96e8c 14 539 238 +96ea0 10 235 236 +96eb0 8 64 239 +96eb8 8 74 239 +96ec0 8 74 239 +96ec8 4 535 238 +96ecc 4 74 239 +96ed0 8 535 238 +96ed8 4 400 238 +96edc 14 304 238 +96ef0 4 306 238 +96ef4 10 307 238 +96f04 10 536 238 +96f14 14 235 236 +96f28 4 93 215 +96f2c 4 94 215 +96f30 14 95 215 +96f44 38 234 236 +96f7c c 74 239 +96f88 8 308 238 +96f90 14 234 236 +96fa4 c 235 236 +96fb0 1c 234 236 +96fcc 8 102 221 +96fd4 10 308 238 +96fe4 14 234 236 +96ff8 14 235 236 +9700c c 79 207 +97018 8 66 221 +97020 28 235 236 +97048 14 90 221 +9705c 8 94 221 +97064 4c 235 236 +970b0 8 70 221 +970b8 28 235 236 +970e0 4 305 238 +FUNC 970e4 a44 0 std::priv::__money_do_get >, std::basic_string, std::allocator > > +970e4 34 122 221 +97118 8 122 221 +97120 4 112 215 +97124 14 122 221 +97138 10 112 215 +97148 4 125 221 +9714c 4 126 221 +97150 4 127 221 +97154 8 126 221 +9715c 3c 272 221 +97198 10 145 212 +971a8 3c 351 219 +971e4 8 143 221 +971ec 10 140 222 +971fc 8 137 222 +97204 4 143 221 +97208 14 137 222 +9721c 1c 136 222 +97238 4 149 221 +9723c c 120 239 +97248 c 149 221 +97254 4 481 202 +97258 4 120 239 +9725c 8 171 216 +97264 8 154 221 +9726c 8 101 206 +97274 4 154 221 +97278 8 227 221 +97280 8 134 222 +97288 24 154 221 +972ac 10 100 222 +972bc 8 97 222 +972c4 4 143 221 +972c8 14 97 222 +972dc 20 96 222 +972fc 10 112 215 +9730c 4 176 221 +97310 10 177 221 +97320 10 179 221 +97330 c 192 221 +9733c 8 153 221 +97344 14 244 221 +97358 4 400 238 +9735c 8 245 221 +97364 14 247 221 +97378 10 248 221 +97388 4 249 221 +9738c 8 248 221 +97394 4 249 221 +97398 c 250 221 +973a4 4 252 221 +973a8 10 112 215 +973b8 4 268 221 +973bc c 269 221 +973c8 4 271 221 +973cc 4 96 239 +973d0 4 64 239 +973d4 c 96 239 +973e0 10 97 239 +973f0 4 64 239 +973f4 10 96 239 +97404 10 97 239 +97414 4 96 239 +97418 4 64 239 +9741c c 96 239 +97428 10 97 239 +97438 c 271 221 +97444 8 167 221 +9744c 14 95 222 +97460 18 169 221 +97478 1c 170 221 +97494 8 171 221 +9749c 4 64 239 +974a0 4 172 221 +974a4 4 64 239 +974a8 8 172 221 +974b0 4 96 239 +974b4 10 172 221 +974c4 8 96 239 +974cc 14 97 239 +974e0 8 90 215 +974e8 c 79 207 +974f4 4 156 221 +974f8 4 68 215 +974fc 10 229 236 +9750c c 228 236 +97518 4 69 215 +9751c 4 95 215 +97520 4 75 215 +97524 8 90 215 +9752c 8 77 215 +97534 c 90 215 +97540 c 162 221 +9754c 10 90 215 +9755c 8 79 207 +97564 4 162 221 +97568 4 68 215 +9756c 10 229 236 +9757c c 228 236 +97588 8 69 215 +97590 14 235 236 +975a4 4 93 215 +975a8 4 94 215 +975ac 8 95 215 +975b4 8 215 221 +975bc 10 92 222 +975cc 4 98 222 +975d0 8 92 222 +975d8 c 98 222 +975e4 4 94 222 +975e8 4 98 222 +975ec 10 94 222 +975fc 4 220 221 +97600 4 225 221 +97604 4 220 221 +97608 c 225 221 +97614 8 225 221 +9761c 10 93 222 +9762c 4 133 222 +97630 24 227 221 +97654 4 232 221 +97658 4 227 221 +9765c 4 232 221 +97660 c 233 221 +9766c 4 234 221 +97670 8 64 239 +97678 10 96 239 +97688 10 95 215 +97698 4 228 236 +9769c c 229 236 +976a8 8 69 215 +976b0 4 92 215 +976b4 18 235 236 +976cc 4 93 215 +976d0 4 94 215 +976d4 8 95 215 +976dc 14 235 236 +976f0 4 93 215 +976f4 4 94 215 +976f8 8 95 215 +97700 58 234 236 +97758 4c 235 236 +977a4 4 400 238 +977a8 8 256 221 +977b0 14 258 221 +977c4 10 259 221 +977d4 4 260 221 +977d8 8 259 221 +977e0 4 260 221 +977e4 c 261 221 +977f0 4 263 221 +977f4 18 101 207 +9780c c 359 238 +97818 18 517 238 +97830 8 263 221 +97838 1c 135 222 +97854 c 187 221 +97860 8 90 215 +97868 4 66 215 +9786c 10 197 221 +9787c c 201 221 +97888 8 90 215 +97890 c 203 221 +9789c 4 68 215 +978a0 10 229 236 +978b0 8 228 236 +978b8 8 69 215 +978c0 10 132 222 +978d0 4 138 222 +978d4 8 132 222 +978dc c 138 222 +978e8 4 134 222 +978ec 4 138 222 +978f0 14 134 222 +97904 28 133 222 +9792c 8 69 215 +97934 14 349 238 +97948 4 68 215 +9794c 10 229 236 +9795c 4 228 236 +97960 4 69 215 +97964 1c 228 236 +97980 c 188 221 +9798c 8 90 215 +97994 18 190 221 +979ac 1c 69 215 +979c8 c 225 221 +979d4 8 69 215 +979dc 8 157 221 +979e4 8 158 221 +979ec 8 235 221 +979f4 4 96 239 +979f8 4 64 239 +979fc 4 236 221 +97a00 c 96 239 +97a0c 28 97 239 +97a34 4 96 239 +97a38 4 64 239 +97a3c c 96 239 +97a48 10 97 239 +97a58 1c 271 221 +97a74 4 96 239 +97a78 4 64 239 +97a7c c 96 239 +97a88 10 97 239 +97a98 4 64 239 +97a9c 10 96 239 +97aac 18 97 239 +97ac4 4 64 239 +97ac8 10 96 239 +97ad8 1c 97 239 +97af4 4 64 239 +97af8 10 96 239 +97b08 20 97 239 +FUNC 97b28 54 0 std::money_get > >::do_get +97b28 4 304 221 +97b2c 14 308 221 +97b40 8 304 221 +97b48 4 308 221 +97b4c 4 307 221 +97b50 4 307 221 +97b54 4 308 221 +97b58 4 307 221 +97b5c 10 308 221 +97b6c 10 309 221 +FUNC 97b7c 154 0 std::money_get > >::do_get +97b7c 4 279 221 +97b80 4 284 221 +97b84 4 283 221 +97b88 8 279 221 +97b90 4 283 221 +97b94 4 279 221 +97b98 4 120 239 +97b9c 4 279 221 +97ba0 4 283 221 +97ba4 4 284 221 +97ba8 4 279 221 +97bac 4 284 221 +97bb0 4 279 221 +97bb4 1c 284 221 +97bd0 4 120 239 +97bd4 4 481 202 +97bd8 4 101 206 +97bdc 4 284 221 +97be0 4 286 221 +97be4 c 284 221 +97bf0 4 286 221 +97bf4 8 284 221 +97bfc 8 286 221 +97c04 4 287 221 +97c08 4 289 221 +97c0c 4 287 221 +97c10 4 287 221 +97c14 4 289 221 +97c18 14 292 221 +97c2c 8 294 221 +97c34 4 64 239 +97c38 c 96 239 +97c44 8 97 239 +97c4c 8 161 202 +97c54 4 161 202 +97c58 20 300 221 +97c78 18 295 221 +97c90 c 289 221 +97c9c 8 135 223 +97ca4 8 64 239 +97cac c 96 239 +97cb8 18 97 239 +FUNC 97cd0 84 0 std::priv::_String_base >::_M_allocate_block +97cd0 4 607 237 +97cd4 8 608 237 +97cdc 8 607 237 +97ce4 4 608 237 +97ce8 4 607 237 +97cec 4 608 237 +97cf0 c 600 237 +97cfc 8 610 237 +97d04 c 623 237 +97d10 8 347 202 +97d18 8 158 202 +97d20 8 158 202 +97d28 4 613 237 +97d2c 4 611 237 +97d30 4 613 237 +97d34 4 612 237 +97d38 8 613 237 +97d40 c 623 237 +97d4c 8 134 223 +FUNC 97d54 9c 0 std::basic_string, std::allocator >::basic_string +97d54 14 639 237 +97d68 4 264 247 +97d6c 4 639 237 +97d70 4 112 239 +97d74 4 481 202 +97d78 4 264 247 +97d7c 4 643 237 +97d80 4 378 238 +97d84 10 379 238 +97d94 4 107 244 +97d98 c 106 244 +97da4 4 107 244 +97da8 4 380 238 +97dac 4 101 206 +97db0 10 644 237 +97dc0 8 64 239 +97dc8 c 96 239 +97dd4 1c 97 239 +FUNC 97df0 4 0 std::_STLP_mutex::~_STLP_mutex +97df0 4 342 241 +FUNC 97df4 58 0 std::__node_alloc_impl::_M_deallocate +97df4 4 340 176 +97df8 4 341 176 +97dfc 8 340 176 +97e04 4 347 241 +97e08 8 340 176 +97e10 4 347 241 +97e14 10 341 176 +97e24 8 347 241 +97e2c 4 346 176 +97e30 4 349 241 +97e34 4 346 176 +97e38 4 347 176 +97e3c c 353 176 +97e48 4 349 241 +FUNC 97e4c 1d0 0 std::__node_alloc_impl::_S_chunk_alloc +97e4c 18 365 176 +97e64 8 405 176 +97e6c 4 365 176 +97e70 c 405 176 +97e7c c 365 176 +97e88 8 386 176 +97e90 8 392 176 +97e98 8 405 176 +97ea0 8 377 176 +97ea8 c 386 176 +97eb4 8 387 176 +97ebc 4 389 176 +97ec0 8 388 176 +97ec8 4 389 176 +97ecc c 248 176 +97ed8 4 392 176 +97edc 8 134 223 +97ee4 4 395 176 +97ee8 4 421 176 +97eec 8 426 176 +97ef4 8 421 176 +97efc 4 367 176 +97f00 4 370 176 +97f04 4 367 176 +97f08 4 370 176 +97f0c 8 371 176 +97f14 8 373 176 +97f1c 1c 429 176 +97f38 4 378 176 +97f3c 4 429 176 +97f40 4 378 176 +97f44 c 429 176 +97f50 4 379 176 +97f54 8 381 176 +97f5c 18 429 176 +97f74 4 398 176 +97f78 8 404 176 +97f80 4 406 176 +97f84 8 407 176 +97f8c 4 404 176 +97f90 10 404 176 +97fa0 8 405 176 +97fa8 4 406 176 +97fac 4 405 176 +97fb0 4 407 176 +97fb4 4 408 176 +97fb8 4 410 176 +97fbc 8 411 176 +97fc4 4 408 176 +97fc8 4 409 176 +97fcc 4 410 176 +97fd0 8 411 176 +97fd8 c 398 176 +97fe4 8 134 223 +97fec 4 417 176 +97ff0 4 398 176 +97ff4 c 367 176 +98000 10 407 176 +98010 c 398 176 +FUNC 9801c 84 0 std::__node_alloc_impl::_S_refill +9801c 4 434 176 +98020 4 435 176 +98024 4 434 176 +98028 4 435 176 +9802c 4 434 176 +98030 4 434 176 +98034 4 435 176 +98038 4 436 176 +9803c c 438 176 +98048 4 440 176 +9804c 4 447 176 +98050 4 440 176 +98054 4 447 176 +98058 4 440 176 +9805c 4 447 176 +98060 4 448 176 +98064 4 447 176 +98068 c 448 176 +98074 4 450 176 +98078 4 448 176 +9807c 4 451 176 +98080 10 448 176 +98090 4 453 176 +98094 c 455 176 +FUNC 980a0 b4 0 std::__node_alloc_impl::_M_allocate +980a0 18 318 176 +980b8 4 320 176 +980bc 4 347 241 +980c0 4 248 176 +980c4 4 320 176 +980c8 4 347 241 +980cc 8 248 176 +980d4 4 319 176 +980d8 8 320 176 +980e0 4 347 241 +980e4 8 328 176 +980ec 8 329 176 +980f4 8 349 241 +980fc 18 338 176 +98114 c 331 176 +98120 8 349 241 +98128 1c 338 176 +98144 10 349 241 +FUNC 98154 4 0 std::__node_alloc::_M_allocate +98154 4 743 176 +FUNC 98158 4 0 std::__node_alloc::_M_deallocate +98158 4 746 176 +FUNC 9815c 124 0 _Locale_init +9815c 14 58 177 +98170 8 58 177 +98178 c 63 177 +98184 c 63 177 +98190 c 64 177 +9819c 10 64 177 +981ac 8 65 177 +981b4 c 65 177 +981c0 c 66 177 +981cc c 66 177 +981d8 c 67 177 +981e4 c 67 177 +981f0 c 68 177 +981fc c 68 177 +98208 c 69 177 +98214 c 69 177 +98220 c 70 177 +9822c c 70 177 +98238 c 71 177 +98244 14 71 177 +98258 8 72 177 +98260 4 76 177 +98264 c 77 177 +98270 10 76 177 +FUNC 98280 4 0 _Locale_final +98280 4 80 177 +FUNC 98284 1d0 0 __cxxabiv1::__cxa_call_unexpected +98284 18 250 159 +9829c 4 250 159 +982a0 4 252 159 +982a4 4 255 159 +982a8 1c 257 159 +982c4 4 263 159 +982c8 4 270 159 +982cc 4 264 159 +982d0 4 265 159 +982d4 4 266 159 +982d8 4 269 159 +982dc 4 270 159 +982e0 4 126 159 +982e4 4 127 159 +982e8 4 272 159 +982ec 4 260 159 +982f0 4 272 159 +982f4 8 273 159 +982fc 4 253 159 +98300 4 278 159 +98304 4 281 159 +98308 4 282 159 +9830c 10 284 159 +9831c c 285 159 +98328 10 286 159 +98338 8 287 159 +98340 8 290 159 +98348 8 291 159 +98350 4 292 159 +98354 4 293 159 +98358 4 292 159 +9835c 4 294 159 +98360 8 300 159 +98368 14 298 159 +9837c 8 300 159 +98384 20 303 159 +983a4 4 302 159 +983a8 24 321 159 +983cc 4 320 159 +983d0 4 322 159 +983d4 4 323 159 +983d8 c 324 159 +983e4 4 324 159 +983e8 14 324 159 +983fc c 295 159 +98408 c 278 159 +98414 4 310 159 +98418 4 311 159 +9841c 8 310 159 +98424 8 311 159 +9842c 4 312 159 +98430 4 313 159 +98434 8 314 159 +9843c 4 315 159 +98440 8 288 159 +98448 4 278 159 +9844c 8 329 159 +FUNC 98454 8 0 __cxxabiv1::__class_type_info::code +98454 8 153 162 +FUNC 9845c 10 0 __cxxabiv1::__class_type_info::~__class_type_info +9845c 10 34 160 +FUNC 9846c 30 0 __cxxabiv1::__class_type_info::~__class_type_info +9846c 10 34 160 +9847c 10 34 160 +9848c 4 36 160 +98490 8 36 160 +98498 4 36 160 +FUNC 9849c 50 0 __cxxabiv1::__class_type_info::walk_to +9849c c 63 160 +984a8 c 63 160 +984b4 c 70 160 +984c0 4 72 160 +984c4 4 71 160 +984c8 4 73 160 +984cc 4 72 160 +984d0 4 71 160 +984d4 8 73 160 +984dc 4 74 160 +984e0 c 65 160 +FUNC 984ec 50 0 __cxxabiv1::__class_type_info::self_class_type_match +984ec c 69 160 +984f8 c 69 160 +98504 c 70 160 +98510 4 72 160 +98514 4 71 160 +98518 4 73 160 +9851c 4 72 160 +98520 4 71 160 +98524 8 73 160 +9852c 4 74 160 +98530 c 79 160 +FUNC 9853c 64 0 __cxxabiv1::__UpcastInfo::__UpcastInfo +9853c 10 82 160 +9854c 18 84 160 +98564 8 87 160 +9856c 1c 87 160 +98588 4 86 160 +9858c 8 88 160 +98594 c 90 160 +FUNC 985a0 c0 0 __cxxabiv1::__class_type_info::can_catch +985a0 10 39 160 +985b0 c 39 160 +985bc 8 40 160 +985c4 4 40 160 +985c8 4 45 160 +985cc 20 45 160 +985ec 4 46 160 +985f0 14 50 160 +98604 1c 51 160 +98620 c 53 160 +9862c 14 59 160 +98640 4 58 160 +98644 8 57 160 +9864c 14 59 160 +FUNC 98660 30 0 __cxxabiv1::readULEB128 +98660 4 56 164 +98664 4 58 164 +98668 4 57 164 +9866c 4 60 164 +98670 4 62 164 +98674 10 63 164 +98684 4 61 164 +98688 4 66 164 +9868c 4 68 164 +FUNC 98690 48 0 __cxxabiv1::readSLEB128 +98690 4 70 164 +98694 4 72 164 +98698 4 71 164 +9869c 4 74 164 +986a0 4 76 164 +986a4 10 77 164 +986b4 4 75 164 +986b8 4 80 164 +986bc c 81 164 +986c8 c 82 164 +986d4 4 85 164 +FUNC 986d8 1b8 0 __cxxabiv1::readEncodedPointer +986d8 c 144 164 +986e4 4 144 164 +986e8 8 146 164 +986f0 8 149 164 +986f8 4 151 164 +986fc 4 149 164 +98700 8 151 164 +98708 4 193 164 +9870c 18 151 164 +98724 4 115 164 +98728 4 187 164 +9872c 4 114 164 +98730 4 113 164 +98734 4 115 164 +98738 4 116 164 +9873c 8 117 164 +98744 4 118 164 +98748 4 114 164 +9874c 4 119 164 +98750 4 115 164 +98754 4 120 164 +98758 4 116 164 +9875c 4 117 164 +98760 4 187 164 +98764 4 118 164 +98768 4 120 164 +9876c 10 191 164 +9877c 4 198 164 +98780 4 208 164 +98784 4 209 164 +98788 4 208 164 +9878c c 210 164 +98798 8 199 164 +987a0 c 205 164 +987ac 8 206 164 +987b4 c 90 164 +987c0 4 179 164 +987c4 4 90 164 +987c8 4 178 164 +987cc 4 180 164 +987d0 c 163 164 +987dc 4 164 164 +987e0 4 101 164 +987e4 4 183 164 +987e8 4 100 164 +987ec 4 99 164 +987f0 4 101 164 +987f4 8 102 164 +987fc 4 183 164 +98800 4 100 164 +98804 4 102 164 +98808 4 182 164 +9880c 4 184 164 +98810 4 101 164 +98814 4 171 164 +98818 4 100 164 +9881c 4 99 164 +98820 4 101 164 +98824 8 102 164 +9882c 4 171 164 +98830 4 100 164 +98834 4 170 164 +98838 4 172 164 +9883c c 90 164 +98848 4 167 164 +9884c 4 90 164 +98850 4 166 164 +98854 4 168 164 +98858 8 151 164 +98860 4 62 164 +98864 10 63 164 +98874 4 61 164 +98878 4 66 164 +9887c 4 161 164 +98880 4 147 164 +98884 c 210 164 +FUNC 98890 184 0 base_to_derived_cast +98890 18 203 165 +988a8 8 205 165 +988b0 4 203 165 +988b4 4 203 165 +988b8 4 204 165 +988bc 8 205 165 +988c4 4 206 165 +988c8 4 207 165 +988cc c 211 165 +988d8 24 221 165 +988fc 4 243 165 +98900 4 57 165 +98904 8 243 165 +9890c 10 245 165 +9891c 4 113 162 +98920 4 103 165 +98924 4 107 165 +98928 14 251 165 +9893c 10 254 165 +9894c 4 243 165 +98950 8 243 165 +98958 4 263 165 +9895c 14 264 165 +98970 8 210 165 +98978 14 211 165 +9898c 8 213 165 +98994 c 215 165 +989a0 4 263 165 +989a4 8 216 165 +989ac 14 264 165 +989c0 8 214 165 +989c8 4 263 165 +989cc 14 264 165 +989e0 20 261 165 +98a00 10 232 165 +98a10 4 233 165 +FUNC 98a14 158 0 walk_object +98a14 28 119 165 +98a3c 14 120 165 +98a50 24 123 165 +98a74 8 146 165 +98a7c 4 57 165 +98a80 4 146 165 +98a84 10 148 165 +98a94 4 113 162 +98a98 4 103 165 +98a9c 4 107 165 +98aa0 18 155 165 +98ab8 8 157 165 +98ac0 4 159 165 +98ac4 4 161 165 +98ac8 c 165 165 +98ad4 4 146 165 +98ad8 8 146 165 +98ae0 4 169 165 +98ae4 18 176 165 +98afc 2c 173 165 +98b28 4 127 165 +98b2c 18 176 165 +98b44 8 135 165 +98b4c 8 158 165 +98b54 8 121 165 +98b5c 4 121 165 +98b60 c 121 165 +FUNC 98b6c 124 0 __cxxabiv1::__dynamic_cast +98b6c 10 293 165 +98b7c 4 77 165 +98b80 8 293 165 +98b88 4 48 165 +98b8c 8 293 165 +98b94 4 293 165 +98b98 4 48 165 +98b9c 4 293 165 +98ba0 4 66 165 +98ba4 c 303 165 +98bb0 4 66 165 +98bb4 c 303 165 +98bc0 4 304 165 +98bc4 8 318 165 +98bcc 10 322 165 +98bdc 4 48 165 +98be0 18 355 165 +98bf8 1c 193 165 +98c14 4 329 165 +98c18 c 330 165 +98c24 8 335 165 +98c2c 4 336 165 +98c30 8 335 165 +98c38 8 348 165 +98c40 14 353 165 +98c54 8 354 165 +98c5c 4 305 165 +98c60 20 355 165 +98c80 10 333 165 +FUNC 98c90 94 0 __cxa_guard_acquire +98c90 c 60 170 +98c9c 4 61 170 +98ca0 4 60 170 +98ca4 4 61 170 +98ca8 4 60 170 +98cac 8 61 170 +98cb4 4 66 170 +98cb8 4 67 170 +98cbc 8 88 170 +98cc4 4 76 170 +98cc8 4 87 170 +98ccc 4 88 170 +98cd0 4 87 170 +98cd4 8 88 170 +98cdc 4 66 170 +98ce0 4 67 170 +98ce4 8 69 170 +98cec 4 70 170 +98cf0 10 90 170 +98d00 4 79 170 +98d04 4 80 170 +98d08 4 79 170 +98d0c 4 80 170 +98d10 4 81 170 +98d14 10 90 170 +FUNC 98d24 48 0 __cxa_guard_release +98d24 c 93 170 +98d30 4 94 170 +98d34 4 93 170 +98d38 8 94 170 +98d40 4 96 170 +98d44 8 98 170 +98d4c 4 99 170 +98d50 c 100 170 +98d5c 4 102 170 +98d60 8 103 170 +98d68 4 102 170 +FUNC 98d6c 44 0 __cxa_guard_abort +98d6c c 106 170 +98d78 4 107 170 +98d7c 4 106 170 +98d80 8 107 170 +98d88 4 109 170 +98d8c 4 110 170 +98d90 4 111 170 +98d94 c 112 170 +98da0 4 114 170 +98da4 8 115 170 +98dac 4 114 170 +FUNC 98db0 8 0 __cxxabiv1::__vmi_class_type_info::code +98db0 8 198 162 +FUNC 98db8 10 0 __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info +98db8 10 35 175 +FUNC 98dc8 30 0 __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info +98dc8 10 35 175 +98dd8 10 35 175 +98de8 4 37 175 +98dec 8 37 175 +98df4 4 37 175 +FUNC 98df8 270 0 __cxxabiv1::__vmi_class_type_info::walk_to +98df8 1c 41 175 +98e14 10 41 175 +98e24 c 42 175 +98e30 4 46 175 +98e34 10 46 175 +98e44 4 74 175 +98e48 c 47 175 +98e54 c 48 175 +98e60 4 103 162 +98e64 4 113 162 +98e68 4 49 175 +98e6c 4 107 162 +98e70 4 55 175 +98e74 4 56 175 +98e78 8 59 175 +98e80 8 61 175 +98e88 4 65 175 +98e8c 4 66 175 +98e90 4 65 175 +98e94 1c 74 175 +98eb0 4 74 175 +98eb4 8 83 175 +98ebc 4 86 175 +98ec0 4 88 175 +98ec4 4 92 175 +98ec8 4 92 175 +98ecc 4 92 175 +98ed0 4 111 175 +98ed4 8 114 175 +98edc 4 114 175 +98ee0 8 120 175 +98ee8 10 138 175 +98ef8 4 138 175 +98efc 8 143 175 +98f04 8 143 175 +98f0c 8 146 175 +98f14 8 46 175 +98f1c 8 46 175 +98f24 c 156 175 +98f30 1c 157 175 +98f4c 1c 74 175 +98f68 8 74 175 +98f70 8 120 175 +98f78 8 121 175 +98f80 8 121 175 +98f88 10 126 175 +98f98 4 126 175 +98f9c 8 115 175 +98fa4 4 106 175 +98fa8 1c 157 175 +98fc4 4 92 175 +98fc8 c 93 175 +98fd4 4 94 175 +98fd8 1c 93 175 +98ff4 4 94 175 +98ff8 4 95 175 +98ffc 4 94 175 +99000 8 106 175 +99008 20 111 175 +99028 20 143 175 +99048 20 138 175 +FUNC 99068 8 0 std::priv::stdio_istreambuf::showmanyc +99068 8 154 196 +FUNC 99070 8 0 std::priv::stdio_ostreambuf::showmanyc +99070 8 201 196 +FUNC 99078 60 0 std::priv::stdio_streambuf_base::~stdio_streambuf_base +99078 10 60 196 +99088 4 60 196 +9908c 4 61 196 +99090 8 60 196 +99098 4 61 196 +9909c c 41 235 +990a8 4 62 196 +990ac 4 41 235 +990b0 4 62 196 +990b4 24 41 235 +FUNC 990d8 10 0 std::priv::stdio_istreambuf::~stdio_istreambuf +990d8 10 151 196 +FUNC 990e8 30 0 std::priv::stdio_istreambuf::~stdio_istreambuf +990e8 10 151 196 +990f8 10 151 196 +99108 4 151 196 +9910c 8 151 196 +99114 4 151 196 +FUNC 99118 10 0 std::priv::stdio_ostreambuf::~stdio_ostreambuf +99118 10 198 196 +FUNC 99128 30 0 std::priv::stdio_ostreambuf::~stdio_ostreambuf +99128 10 198 196 +99138 10 198 196 +99148 4 198 196 +9914c 8 198 196 +99154 4 198 196 +FUNC 99158 24 0 std::priv::stdio_streambuf_base::~stdio_streambuf_base +99158 c 60 196 +99164 4 60 196 +99168 4 62 196 +9916c 4 62 196 +99170 8 62 196 +99178 4 62 196 +FUNC 9917c 20 0 std::priv::stdio_streambuf_base::sync +9917c 8 144 196 +99184 c 145 196 +99190 c 146 196 +FUNC 9919c 50 0 std::priv::stdio_streambuf_base::setbuf +9919c 10 64 196 +991ac 4 64 196 +991b0 4 70 196 +991b4 4 70 196 +991b8 4 70 196 +991bc 4 70 196 +991c0 4 70 196 +991c4 10 73 196 +991d4 4 70 196 +991d8 4 70 196 +991dc 10 73 196 +FUNC 991ec 7c 0 std::priv::stdio_streambuf_base::seekoff +991ec 4 77 196 +991f0 4 79 196 +991f4 8 77 196 +991fc 14 79 196 +99210 8 109 196 +99218 c 110 196 +99224 8 81 196 +9922c 8 93 196 +99234 4 93 196 +99238 c 95 196 +99244 4 110 196 +99248 8 105 196 +99250 8 110 196 +99258 4 87 196 +9925c 4 88 196 +99260 8 84 196 +FUNC 99268 8 0 std::priv::stdio_istreambuf::uflow +99268 8 175 196 +FUNC 99270 3c 0 std::priv::stdio_istreambuf::underflow +99270 c 157 196 +9927c 4 157 196 +99280 8 161 196 +99288 4 163 196 +9928c 4 161 196 +99290 4 163 196 +99294 8 164 196 +9929c 10 169 196 +FUNC 992ac 4c 0 std::priv::stdio_streambuf_base::seekpos +992ac 8 114 196 +992b4 4 138 196 +992b8 4 114 196 +992bc 4 141 196 +992c0 8 114 196 +992c8 4 138 196 +992cc 8 141 196 +992d4 10 141 196 +992e4 4 142 196 +992e8 4 141 196 +992ec c 142 196 +FUNC 992f8 3c 0 std::priv::stdio_istreambuf::pbackfail +992f8 4 181 196 +992fc 4 180 196 +99300 4 181 196 +99304 10 182 196 +99314 c 186 196 +99320 4 91 236 +99324 4 182 247 +99328 4 91 236 +9932c 8 193 196 +FUNC 99334 80 0 std::priv::stdio_ostreambuf::overflow +99334 4 203 196 +99338 4 205 196 +9933c c 203 196 +99348 4 205 196 +9934c 8 227 196 +99354 8 231 196 +9935c 4 227 196 +99360 4 207 196 +99364 4 182 247 +99368 4 207 196 +9936c 8 208 196 +99374 14 231 196 +99388 8 209 196 +99390 14 211 196 +993a4 10 231 196 +FUNC 993b4 60 0 std::priv::stdio_streambuf_base::stdio_streambuf_base +993b4 4 55 196 +993b8 4 34 235 +993bc 8 55 196 +993c4 4 55 196 +993c8 8 34 235 +993d0 4 55 196 +993d4 20 34 235 +993f4 14 57 196 +99408 c 58 196 +FUNC 99414 10 0 std::codecvt::do_length +99414 10 34 178 +FUNC 99424 8 0 std::codecvt::do_max_length +99424 8 37 178 +FUNC 9942c 8 0 std::codecvt::do_always_noconv +9942c 8 41 178 +FUNC 99434 8 0 std::codecvt::do_encoding +99434 8 45 178 +FUNC 9943c c 0 std::codecvt::do_unshift +9943c c 52 178 +FUNC 99448 10 0 std::codecvt::do_in +99448 10 62 178 +FUNC 99458 10 0 std::codecvt::do_out +99458 10 72 178 +FUNC 99468 1f4 0 std::codecvt::do_out +99468 14 90 178 +9947c 4 91 178 +99480 4 213 201 +99484 4 91 178 +99488 48 213 201 +994d0 64 214 201 +99534 4 213 201 +99538 4 214 201 +9953c 8 213 201 +99544 4 214 201 +99548 4 213 201 +9954c 4 214 201 +99550 4 213 201 +99554 4 214 201 +99558 4 213 201 +9955c 4 214 201 +99560 4 213 201 +99564 4 214 201 +99568 4 213 201 +9956c 4 214 201 +99570 4 213 201 +99574 4 214 201 +99578 4 213 201 +9957c 4 214 201 +99580 4 213 201 +99584 4 214 201 +99588 4 213 201 +9958c 4 214 201 +99590 4 213 201 +99594 4 214 201 +99598 4 213 201 +9959c 4 214 201 +995a0 4 213 201 +995a4 4 214 201 +995a8 4 213 201 +995ac 4 214 201 +995b0 4 213 201 +995b4 4 214 201 +995b8 4 213 201 +995bc 4 214 201 +995c0 4 213 201 +995c4 4 214 201 +995c8 4 213 201 +995cc 4 214 201 +995d0 4 213 201 +995d4 4 214 201 +995d8 4 213 201 +995dc 4 214 201 +995e0 4 213 201 +995e4 4 214 201 +995e8 4 213 201 +995ec 4 214 201 +995f0 4 213 201 +995f4 4 214 201 +995f8 4 213 201 +995fc 4 214 201 +99600 4 213 201 +99604 4 214 201 +99608 4 213 201 +9960c 4 214 201 +99610 4 213 201 +99614 8 214 201 +9961c 4 92 178 +99620 4 93 178 +99624 4 95 178 +99628 4 93 178 +9962c 4 95 178 +99630 4 213 201 +99634 c 214 201 +99640 8 213 201 +99648 4 92 178 +9964c 4 93 178 +99650 4 95 178 +99654 4 93 178 +99658 4 95 178 +FUNC 9965c 1f0 0 std::codecvt::do_in +9965c 14 105 178 +99670 8 213 201 +99678 4 107 178 +9967c 44 213 201 +996c0 64 214 201 +99724 4 213 201 +99728 4 214 201 +9972c 8 213 201 +99734 4 214 201 +99738 4 213 201 +9973c 4 214 201 +99740 4 213 201 +99744 4 214 201 +99748 4 213 201 +9974c 4 214 201 +99750 4 213 201 +99754 4 214 201 +99758 4 213 201 +9975c 4 214 201 +99760 4 213 201 +99764 4 214 201 +99768 4 213 201 +9976c 4 214 201 +99770 4 213 201 +99774 4 214 201 +99778 4 213 201 +9977c 4 214 201 +99780 4 213 201 +99784 4 214 201 +99788 4 213 201 +9978c 4 214 201 +99790 4 213 201 +99794 4 214 201 +99798 4 213 201 +9979c 4 214 201 +997a0 4 213 201 +997a4 4 214 201 +997a8 4 213 201 +997ac 4 214 201 +997b0 4 213 201 +997b4 4 214 201 +997b8 4 213 201 +997bc 4 214 201 +997c0 4 213 201 +997c4 4 214 201 +997c8 4 213 201 +997cc 4 214 201 +997d0 4 213 201 +997d4 4 214 201 +997d8 4 213 201 +997dc 4 214 201 +997e0 4 213 201 +997e4 4 214 201 +997e8 4 213 201 +997ec 4 214 201 +997f0 4 213 201 +997f4 4 214 201 +997f8 4 213 201 +997fc 4 214 201 +99800 4 213 201 +99804 8 214 201 +9980c 4 108 178 +99810 4 109 178 +99814 4 111 178 +99818 4 109 178 +9981c 4 111 178 +99820 4 213 201 +99824 c 214 201 +99830 8 213 201 +99838 4 108 178 +9983c 4 109 178 +99840 4 111 178 +99844 4 109 178 +99848 4 111 178 +FUNC 9984c c 0 std::codecvt::do_unshift +9984c 4 118 178 +99850 8 120 178 +FUNC 99858 8 0 std::codecvt::do_encoding +99858 8 123 178 +FUNC 99860 8 0 std::codecvt::do_always_noconv +99860 8 126 178 +FUNC 99868 10 0 std::codecvt::do_length +99868 10 132 178 +FUNC 99878 8 0 std::codecvt::do_max_length +99878 8 135 178 +FUNC 99880 14 0 std::codecvt::~codecvt +99880 14 28 178 +FUNC 99894 14 0 std::codecvt::~codecvt +99894 14 79 178 +FUNC 998a8 24 0 std::codecvt::~codecvt +998a8 c 28 178 +998b4 8 28 178 +998bc 4 28 178 +998c0 8 28 178 +998c8 4 28 178 +FUNC 998cc 24 0 std::codecvt::~codecvt +998cc c 79 178 +998d8 8 79 178 +998e0 4 79 178 +998e4 8 79 178 +998ec 4 79 178 +FUNC 998f0 24 0 std::collate::do_hash +998f0 c 37 179 +998fc 8 38 179 +99904 4 37 179 +99908 4 38 179 +9990c 4 37 179 +99910 4 40 179 +FUNC 99914 5c 0 std::collate::do_compare +99914 14 80 200 +99928 10 81 200 +99938 4 85 200 +9993c 4 87 200 +99940 4 88 200 +99944 10 80 200 +99954 8 91 200 +9995c 4 50 179 +99960 4 83 200 +99964 4 50 179 +99968 4 86 200 +9996c 4 50 179 +FUNC 99970 24 0 std::collate::do_hash +99970 c 57 179 +9997c 8 58 179 +99984 4 57 179 +99988 4 58 179 +9998c 4 57 179 +99990 4 60 179 +FUNC 99994 14 0 std::collate::~collate +99994 14 26 179 +FUNC 999a8 14 0 std::collate::~collate +999a8 14 45 179 +FUNC 999bc 24 0 std::collate::~collate +999bc c 26 179 +999c8 8 26 179 +999d0 4 26 179 +999d4 8 26 179 +999dc 4 26 179 +FUNC 999e0 24 0 std::collate::~collate +999e0 c 45 179 +999ec 8 45 179 +999f4 4 45 179 +999f8 8 45 179 +99a00 4 45 179 +FUNC 99a04 48 0 std::collate::do_compare +99a04 10 30 179 +99a14 4 625 201 +99a18 8 626 201 +99a20 c 627 201 +99a2c 4 629 201 +99a30 8 629 201 +99a38 8 629 201 +99a40 c 30 179 +FUNC 99a4c f4 0 std::collate::do_transform +99a4c 10 33 179 +99a5c 4 355 217 +99a60 4 33 179 +99a64 4 608 237 +99a68 4 33 179 +99a6c 4 112 239 +99a70 4 33 179 +99a74 4 481 202 +99a78 4 608 237 +99a7c c 600 237 +99a88 c 610 237 +99a94 8 107 244 +99a9c c 106 244 +99aa8 4 107 244 +99aac 4 325 238 +99ab0 4 101 206 +99ab4 14 33 179 +99ac8 4 347 202 +99acc 8 158 202 +99ad4 8 158 202 +99adc 4 613 237 +99ae0 4 158 202 +99ae4 4 611 237 +99ae8 4 613 237 +99aec 4 612 237 +99af0 8 613 237 +99af8 8 134 223 +99b00 8 64 239 +99b08 c 96 239 +99b14 8 97 239 +99b1c 8 161 202 +99b24 10 161 202 +99b34 c 135 223 +FUNC 99b40 108 0 std::collate::do_transform +99b40 4 53 179 +99b44 4 608 237 +99b48 14 53 179 +99b5c 4 355 217 +99b60 4 53 179 +99b64 4 355 217 +99b68 4 112 239 +99b6c 4 608 237 +99b70 4 481 202 +99b74 4 324 238 +99b78 4 608 237 +99b7c c 600 237 +99b88 c 610 237 +99b94 8 107 244 +99b9c c 106 244 +99ba8 4 107 244 +99bac 4 325 238 +99bb0 4 101 206 +99bb4 14 53 179 +99bc8 8 347 202 +99bd0 8 158 202 +99bd8 8 158 202 +99be0 4 613 237 +99be4 4 158 202 +99be8 4 611 237 +99bec 4 613 237 +99bf0 4 612 237 +99bf4 c 613 237 +99c00 8 134 223 +99c08 8 64 239 +99c10 c 96 239 +99c1c 8 97 239 +99c24 8 161 202 +99c2c 10 161 202 +99c3c c 135 223 +FUNC 99c48 14 0 std::ctype::do_toupper +99c48 14 342 180 +FUNC 99c5c 14 0 std::ctype::do_tolower +99c5c 14 344 180 +FUNC 99c70 2c 0 std::ctype::do_toupper +99c70 4 347 180 +99c74 8 346 180 +99c7c 4 347 180 +99c80 10 348 180 +99c90 8 347 180 +99c98 4 350 180 +FUNC 99c9c 2c 0 std::ctype::do_tolower +99c9c 4 352 180 +99ca0 8 351 180 +99ca8 4 352 180 +99cac 10 353 180 +99cbc 8 352 180 +99cc4 4 355 180 +FUNC 99cc8 8 0 std::ctype::do_widen +99cc8 8 358 180 +FUNC 99cd0 8 0 std::ctype::do_narrow +99cd0 8 367 180 +FUNC 99cd8 1c 0 std::ctype::do_toupper +99cd8 4 426 180 +99cdc 4 424 180 +99ce0 4 426 180 +99ce4 8 425 180 +99cec 4 426 180 +99cf0 4 427 180 +FUNC 99cf4 34 0 std::ctype::do_toupper +99cf4 4 431 180 +99cf8 4 430 180 +99cfc 4 433 180 +99d00 4 431 180 +99d04 4 432 180 +99d08 8 434 180 +99d10 8 434 180 +99d18 4 434 180 +99d1c 8 431 180 +99d24 4 437 180 +FUNC 99d28 1c 0 std::ctype::do_tolower +99d28 4 441 180 +99d2c 4 439 180 +99d30 4 441 180 +99d34 8 440 180 +99d3c 4 441 180 +99d40 4 442 180 +FUNC 99d44 34 0 std::ctype::do_tolower +99d44 4 446 180 +99d48 4 445 180 +99d4c 4 448 180 +99d50 4 446 180 +99d54 4 447 180 +99d58 8 449 180 +99d60 8 449 180 +99d68 4 449 180 +99d6c 8 446 180 +99d74 4 452 180 +FUNC 99d78 8 0 std::ctype::do_widen +99d78 8 456 180 +FUNC 99d80 208 0 std::ctype::do_widen +99d80 4 461 180 +99d84 4 460 180 +99d88 5c 461 180 +99de4 68 462 180 +99e4c 8 461 180 +99e54 c 462 180 +99e60 8 461 180 +99e68 c 462 180 +99e74 8 461 180 +99e7c c 462 180 +99e88 8 461 180 +99e90 c 462 180 +99e9c 8 461 180 +99ea4 c 462 180 +99eb0 8 461 180 +99eb8 c 462 180 +99ec4 8 461 180 +99ecc c 462 180 +99ed8 8 461 180 +99ee0 c 462 180 +99eec 8 461 180 +99ef4 c 462 180 +99f00 8 461 180 +99f08 c 462 180 +99f14 8 461 180 +99f1c c 462 180 +99f28 8 461 180 +99f30 c 462 180 +99f3c 8 461 180 +99f44 c 462 180 +99f50 8 461 180 +99f58 8 462 180 +99f60 8 464 180 +99f68 8 461 180 +99f70 c 462 180 +99f7c 8 461 180 +99f84 4 464 180 +FUNC 99f88 14 0 std::ctype::do_narrow +99f88 8 467 180 +99f90 4 467 180 +99f94 8 467 180 +FUNC 99f9c 30 0 std::ctype::do_narrow +99f9c 4 472 180 +99fa0 8 471 180 +99fa8 4 472 180 +99fac 4 473 180 +99fb0 c 474 180 +99fbc 4 472 180 +99fc0 4 474 180 +99fc4 4 472 180 +99fc8 4 478 180 +FUNC 99fcc 44 0 std::ctype::~ctype +99fcc 10 322 180 +99fdc 8 322 180 +99fe4 4 323 180 +99fe8 8 322 180 +99ff0 4 323 180 +99ff4 8 324 180 +99ffc 4 324 180 +9a000 4 322 180 +9a004 8 325 180 +9a00c 4 322 180 +FUNC 9a010 14 0 std::ctype::~ctype +9a010 14 391 180 +FUNC 9a024 24 0 std::ctype::~ctype +9a024 c 322 180 +9a030 4 322 180 +9a034 4 325 180 +9a038 4 325 180 +9a03c 8 325 180 +9a044 4 325 180 +FUNC 9a048 24 0 std::ctype::~ctype +9a048 c 391 180 +9a054 8 391 180 +9a05c 4 391 180 +9a060 8 391 180 +9a068 4 391 180 +FUNC 9a06c 30 0 std::ctype::do_widen +9a06c c 362 180 +9a078 4 362 180 +9a07c 8 224 201 +9a084 8 224 201 +9a08c 10 365 180 +FUNC 9a09c 30 0 std::ctype::do_narrow +9a09c c 370 180 +9a0a8 4 370 180 +9a0ac 8 224 201 +9a0b4 8 224 201 +9a0bc 10 373 180 +FUNC 9a0cc c 0 std::ctype::classic_table +9a0cc 4 192 180 +9a0d0 8 193 180 +FUNC 9a0d8 40 0 std::ctype::do_is +9a0d8 8 394 180 +9a0e0 8 394 180 +9a0e8 4 395 180 +9a0ec 4 396 180 +9a0f0 4 396 180 +9a0f4 c 396 180 +9a100 c 396 180 +9a10c c 397 180 +FUNC 9a118 5c 0 std::ctype::do_is +9a118 8 400 180 +9a120 c 400 180 +9a12c 4 402 180 +9a130 14 404 180 +9a144 4 405 180 +9a148 4 406 180 +9a14c 4 404 180 +9a150 8 406 180 +9a158 4 406 180 +9a15c 4 406 180 +9a160 8 404 180 +9a168 c 409 180 +FUNC 9a174 184 0 std::ctype::do_scan_is +9a174 8 413 180 +9a17c c 413 180 +9a188 4 414 180 +9a18c 8 162 200 +9a194 4 164 200 +9a198 c 162 200 +9a1a4 10 164 200 +9a1b4 4 168 200 +9a1b8 8 385 180 +9a1c0 c 385 180 +9a1cc 4 171 200 +9a1d0 8 385 180 +9a1d8 c 385 180 +9a1e4 4 174 200 +9a1e8 8 385 180 +9a1f0 10 385 180 +9a200 8 164 200 +9a208 4 165 200 +9a20c 8 385 180 +9a214 10 385 180 +9a224 c 415 180 +9a230 4 166 200 +9a234 c 415 180 +9a240 4 169 200 +9a244 c 415 180 +9a250 4 172 200 +9a254 10 415 180 +9a264 8 164 200 +9a26c 14 178 200 +9a280 4 190 200 +9a284 4 178 200 +9a288 4 186 200 +9a28c 4 190 200 +9a290 8 385 180 +9a298 10 385 180 +9a2a8 4 180 200 +9a2ac 8 385 180 +9a2b4 4 181 200 +9a2b8 4 183 200 +9a2bc 8 385 180 +9a2c4 10 385 180 +9a2d4 8 184 200 +9a2dc 14 385 180 +9a2f0 8 164 200 +FUNC 9a2f8 188 0 std::ctype::do_scan_not +9a2f8 8 420 180 +9a300 c 420 180 +9a30c 4 421 180 +9a310 4 162 200 +9a314 4 421 180 +9a318 4 162 200 +9a31c 4 164 200 +9a320 c 162 200 +9a32c c 164 200 +9a338 8 385 180 +9a340 10 385 180 +9a350 4 166 200 +9a354 c 385 180 +9a360 14 385 180 +9a374 8 385 180 +9a37c 14 385 180 +9a390 8 385 180 +9a398 10 385 180 +9a3a8 c 164 200 +9a3b4 8 385 180 +9a3bc 10 385 180 +9a3cc 8 385 180 +9a3d4 4 168 200 +9a3d8 8 422 180 +9a3e0 4 165 200 +9a3e4 c 422 180 +9a3f0 8 164 200 +9a3f8 14 178 200 +9a40c 4 190 200 +9a410 8 178 200 +9a418 c 385 180 +9a424 4 385 180 +9a428 10 190 200 +9a438 c 385 180 +9a444 c 385 180 +9a450 8 181 200 +9a458 c 385 180 +9a464 c 385 180 +9a470 8 184 200 +9a478 8 164 200 +FUNC 9a480 78 0 std::ctype::ctype +9a480 4 316 180 +9a484 4 86 219 +9a488 10 316 180 +9a498 4 86 219 +9a49c 4 316 180 +9a4a0 8 340 241 +9a4a8 4 457 241 +9a4ac 4 316 180 +9a4b0 4 340 241 +9a4b4 18 319 180 +9a4cc 14 319 180 +9a4e0 10 320 180 +9a4f0 8 319 180 +FUNC 9a4f8 8 0 std::moneypunct::do_decimal_point +9a4f8 8 52 190 +FUNC 9a500 8 0 std::moneypunct::do_thousands_sep +9a500 8 53 190 +FUNC 9a508 8 0 std::moneypunct::do_pos_format +9a508 8 58 190 +FUNC 9a510 8 0 std::moneypunct::do_neg_format +9a510 8 59 190 +FUNC 9a518 8 0 std::moneypunct::do_frac_digits +9a518 8 60 190 +FUNC 9a520 8 0 std::moneypunct::do_decimal_point +9a520 8 66 190 +FUNC 9a528 8 0 std::moneypunct::do_thousands_sep +9a528 8 67 190 +FUNC 9a530 8 0 std::moneypunct::do_pos_format +9a530 8 73 190 +FUNC 9a538 8 0 std::moneypunct::do_neg_format +9a538 8 74 190 +FUNC 9a540 8 0 std::moneypunct::do_frac_digits +9a540 8 75 190 +FUNC 9a548 8 0 std::moneypunct::do_decimal_point +9a548 8 82 190 +FUNC 9a550 8 0 std::moneypunct::do_thousands_sep +9a550 8 83 190 +FUNC 9a558 8 0 std::moneypunct::do_frac_digits +9a558 8 92 190 +FUNC 9a560 8 0 std::moneypunct::do_pos_format +9a560 8 94 190 +FUNC 9a568 8 0 std::moneypunct::do_neg_format +9a568 8 96 190 +FUNC 9a570 8 0 std::moneypunct::do_decimal_point +9a570 8 102 190 +FUNC 9a578 8 0 std::moneypunct::do_thousands_sep +9a578 8 103 190 +FUNC 9a580 8 0 std::moneypunct::do_frac_digits +9a580 8 111 190 +FUNC 9a588 8 0 std::moneypunct::do_pos_format +9a588 8 114 190 +FUNC 9a590 8 0 std::moneypunct::do_neg_format +9a590 8 116 190 +FUNC 9a598 14 0 std::moneypunct::~moneypunct +9a598 14 50 190 +FUNC 9a5ac 14 0 std::moneypunct::~moneypunct +9a5ac 14 64 190 +FUNC 9a5c0 14 0 std::moneypunct::~moneypunct +9a5c0 14 80 190 +FUNC 9a5d4 14 0 std::moneypunct::~moneypunct +9a5d4 14 100 190 +FUNC 9a5e8 24 0 std::moneypunct::~moneypunct +9a5e8 c 50 190 +9a5f4 8 50 190 +9a5fc 4 50 190 +9a600 8 50 190 +9a608 4 50 190 +FUNC 9a60c 24 0 std::moneypunct::~moneypunct +9a60c c 64 190 +9a618 8 64 190 +9a620 4 64 190 +9a624 8 64 190 +9a62c 4 64 190 +FUNC 9a630 24 0 std::moneypunct::~moneypunct +9a630 c 80 190 +9a63c 8 80 190 +9a644 4 80 190 +9a648 8 80 190 +9a650 4 80 190 +FUNC 9a654 24 0 std::moneypunct::~moneypunct +9a654 c 100 190 +9a660 8 100 190 +9a668 4 100 190 +9a66c 8 100 190 +9a674 4 100 190 +FUNC 9a678 70 0 std::moneypunct::moneypunct +9a678 4 48 190 +9a67c 4 86 219 +9a680 4 340 241 +9a684 8 48 190 +9a68c 4 48 190 +9a690 4 86 219 +9a694 4 340 241 +9a698 4 457 241 +9a69c 4 340 241 +9a6a0 4 48 190 +9a6a4 4 27 190 +9a6a8 4 28 190 +9a6ac 4 30 190 +9a6b0 4 48 190 +9a6b4 4 27 190 +9a6b8 4 28 190 +9a6bc 4 48 190 +9a6c0 4 29 190 +9a6c4 4 48 190 +9a6c8 4 30 190 +9a6cc 4 32 190 +9a6d0 4 33 190 +9a6d4 4 34 190 +9a6d8 4 35 190 +9a6dc c 49 190 +FUNC 9a6e8 70 0 std::moneypunct::moneypunct +9a6e8 4 62 190 +9a6ec 4 86 219 +9a6f0 4 340 241 +9a6f4 8 62 190 +9a6fc 4 62 190 +9a700 4 86 219 +9a704 4 340 241 +9a708 4 457 241 +9a70c 4 340 241 +9a710 4 62 190 +9a714 4 27 190 +9a718 4 28 190 +9a71c 4 30 190 +9a720 4 62 190 +9a724 4 27 190 +9a728 4 28 190 +9a72c 4 62 190 +9a730 4 29 190 +9a734 4 62 190 +9a738 4 30 190 +9a73c 4 32 190 +9a740 4 33 190 +9a744 4 34 190 +9a748 4 35 190 +9a74c c 63 190 +FUNC 9a758 70 0 std::moneypunct::moneypunct +9a758 4 78 190 +9a75c 4 86 219 +9a760 4 340 241 +9a764 8 78 190 +9a76c 4 78 190 +9a770 4 86 219 +9a774 4 340 241 +9a778 4 457 241 +9a77c 4 340 241 +9a780 4 78 190 +9a784 4 27 190 +9a788 4 28 190 +9a78c 4 30 190 +9a790 4 78 190 +9a794 4 27 190 +9a798 4 28 190 +9a79c 4 78 190 +9a7a0 4 29 190 +9a7a4 4 78 190 +9a7a8 4 30 190 +9a7ac 4 32 190 +9a7b0 4 33 190 +9a7b4 4 34 190 +9a7b8 4 35 190 +9a7bc c 79 190 +FUNC 9a7c8 70 0 std::moneypunct::moneypunct +9a7c8 4 98 190 +9a7cc 4 86 219 +9a7d0 4 340 241 +9a7d4 8 98 190 +9a7dc 4 98 190 +9a7e0 4 86 219 +9a7e4 4 340 241 +9a7e8 4 457 241 +9a7ec 4 340 241 +9a7f0 4 98 190 +9a7f4 4 27 190 +9a7f8 4 28 190 +9a7fc 4 30 190 +9a800 4 98 190 +9a804 4 27 190 +9a808 4 28 190 +9a80c 4 98 190 +9a810 4 29 190 +9a814 4 98 190 +9a818 4 30 190 +9a81c 4 32 190 +9a820 4 33 190 +9a824 4 34 190 +9a828 4 35 190 +9a82c c 99 190 +FUNC 9a838 30 0 std::moneypunct::do_grouping +9a838 4 54 190 +9a83c 8 54 190 +9a844 4 54 190 +9a848 8 54 190 +9a850 8 54 190 +9a858 10 54 190 +FUNC 9a868 30 0 std::moneypunct::do_curr_symbol +9a868 4 55 190 +9a86c 8 55 190 +9a874 4 55 190 +9a878 8 55 190 +9a880 8 55 190 +9a888 10 55 190 +FUNC 9a898 30 0 std::moneypunct::do_positive_sign +9a898 4 56 190 +9a89c 8 56 190 +9a8a4 4 56 190 +9a8a8 8 56 190 +9a8b0 8 56 190 +9a8b8 10 56 190 +FUNC 9a8c8 30 0 std::moneypunct::do_negative_sign +9a8c8 4 57 190 +9a8cc 8 57 190 +9a8d4 4 57 190 +9a8d8 8 57 190 +9a8e0 8 57 190 +9a8e8 10 57 190 +FUNC 9a8f8 30 0 std::moneypunct::do_grouping +9a8f8 4 69 190 +9a8fc 8 69 190 +9a904 4 69 190 +9a908 8 69 190 +9a910 8 69 190 +9a918 10 69 190 +FUNC 9a928 30 0 std::moneypunct::do_curr_symbol +9a928 4 70 190 +9a92c 8 70 190 +9a934 4 70 190 +9a938 8 70 190 +9a940 8 70 190 +9a948 10 70 190 +FUNC 9a958 30 0 std::moneypunct::do_positive_sign +9a958 4 71 190 +9a95c 8 71 190 +9a964 4 71 190 +9a968 8 71 190 +9a970 8 71 190 +9a978 10 71 190 +FUNC 9a988 30 0 std::moneypunct::do_negative_sign +9a988 4 72 190 +9a98c 8 72 190 +9a994 4 72 190 +9a998 8 72 190 +9a9a0 8 72 190 +9a9a8 10 72 190 +FUNC 9a9b8 30 0 std::moneypunct::do_grouping +9a9b8 4 84 190 +9a9bc 8 84 190 +9a9c4 4 84 190 +9a9c8 8 84 190 +9a9d0 8 84 190 +9a9d8 10 84 190 +FUNC 9a9e8 30 0 std::moneypunct::do_grouping +9a9e8 4 104 190 +9a9ec 8 104 190 +9a9f4 4 104 190 +9a9f8 8 104 190 +9aa00 8 104 190 +9aa08 10 104 190 +FUNC 9aa18 30 0 std::moneypunct::do_curr_symbol +9aa18 4 87 190 +9aa1c 8 87 190 +9aa24 4 87 190 +9aa28 8 87 190 +9aa30 8 87 190 +9aa38 10 87 190 +FUNC 9aa48 30 0 std::moneypunct::do_positive_sign +9aa48 4 89 190 +9aa4c 8 89 190 +9aa54 4 89 190 +9aa58 8 89 190 +9aa60 8 89 190 +9aa68 10 89 190 +FUNC 9aa78 30 0 std::moneypunct::do_negative_sign +9aa78 4 91 190 +9aa7c 8 91 190 +9aa84 4 91 190 +9aa88 8 91 190 +9aa90 8 91 190 +9aa98 10 91 190 +FUNC 9aaa8 30 0 std::moneypunct::do_curr_symbol +9aaa8 4 106 190 +9aaac 8 106 190 +9aab4 4 106 190 +9aab8 8 106 190 +9aac0 8 106 190 +9aac8 10 106 190 +FUNC 9aad8 30 0 std::moneypunct::do_positive_sign +9aad8 4 108 190 +9aadc 8 108 190 +9aae4 4 108 190 +9aae8 8 108 190 +9aaf0 8 108 190 +9aaf8 10 108 190 +FUNC 9ab08 30 0 std::moneypunct::do_negative_sign +9ab08 4 110 190 +9ab0c 8 110 190 +9ab14 4 110 190 +9ab18 8 110 190 +9ab20 8 110 190 +9ab28 10 110 190 +FUNC 9ab38 78 0 std::priv::__valid_grouping +9ab38 18 40 191 +9ab50 8 42 191 +9ab58 8 44 191 +9ab60 24 45 191 +9ab84 4 48 191 +9ab88 4 47 191 +9ab8c 4 48 191 +9ab90 8 44 191 +9ab98 10 51 191 +9aba8 8 52 191 +FUNC 9abb0 10 0 std::priv::__digit_val_table +9abb0 8 66 191 +9abb8 8 67 191 +FUNC 9abc0 c 0 std::priv::__narrow_atoms +9abc0 4 70 191 +9abc4 8 70 191 +FUNC 9abcc 12c 0 std::priv::__get_fdigit +9abcc 4 78 191 +9abd0 4 79 191 +9abd4 c 118 200 +9abe0 c 121 200 +9abec c 124 200 +9abf8 c 127 200 +9ac04 4 118 200 +9ac08 4 128 200 +9ac0c 8 118 200 +9ac14 c 121 200 +9ac20 c 124 200 +9ac2c c 127 200 +9ac38 4 128 200 +9ac3c 20 131 200 +9ac5c 4 85 191 +9ac60 8 86 191 +9ac68 4 118 200 +9ac6c 4 136 200 +9ac70 4 80 191 +9ac74 4 85 191 +9ac78 4 80 191 +9ac7c 4 81 191 +9ac80 4 82 191 +9ac84 10 81 191 +9ac94 8 86 191 +9ac9c 4 121 200 +9aca0 8 119 200 +9aca8 c 133 200 +9acb4 4 134 200 +9acb8 c 136 200 +9acc4 4 137 200 +9acc8 4 139 200 +9accc 4 85 191 +9acd0 8 139 200 +9acd8 8 86 191 +9ace0 4 124 200 +9ace4 8 122 200 +9acec 4 127 200 +9acf0 8 125 200 +FUNC 9acf8 28 0 std::priv::__get_fdigit_or_sep +9acf8 4 90 191 +9acfc 4 89 191 +9ad00 8 90 191 +9ad08 8 95 191 +9ad10 8 91 191 +9ad18 8 96 191 +FUNC 9ad20 c 0 std::priv::__hex_char_table_lo +9ad20 4 119 193 +9ad24 8 119 193 +FUNC 9ad2c c 0 std::priv::__hex_char_table_hi +9ad2c 4 122 193 +9ad30 8 122 193 +FUNC 9ad38 180 0 std::priv::__write_integer +9ad38 c 125 193 +9ad44 4 125 193 +9ad48 4 307 226 +9ad4c 4 309 226 +9ad50 4 308 226 +9ad54 4 309 226 +9ad58 4 308 226 +9ad5c 4 309 226 +9ad60 4 308 226 +9ad64 4 309 226 +9ad68 10 224 201 +9ad78 c 224 201 +9ad84 4 224 201 +9ad88 c 130 193 +9ad94 14 314 226 +9ada8 4 277 226 +9adac 4 279 226 +9adb0 c 281 226 +9adbc 4 282 226 +9adc0 4 339 226 +9adc4 14 282 226 +9add8 4 281 226 +9addc 8 282 226 +9ade4 4 281 226 +9ade8 4 284 226 +9adec 4 286 226 +9adf0 10 287 226 +9ae00 4 305 226 +9ae04 4 323 226 +9ae08 4 322 226 +9ae0c 8 323 226 +9ae14 8 322 226 +9ae1c 4 326 226 +9ae20 18 327 226 +9ae38 4 333 226 +9ae3c c 333 226 +9ae48 4 305 226 +9ae4c 4 340 226 +9ae50 4 339 226 +9ae54 8 340 226 +9ae5c 8 339 226 +9ae64 4 342 226 +9ae68 4 343 226 +9ae6c 4 344 226 +9ae70 4 343 226 +9ae74 c 344 226 +9ae80 10 310 226 +9ae90 10 333 226 +9aea0 8 279 226 +9aea8 10 285 226 +FUNC 9aeb8 120 0 std::priv::__insert_grouping +9aeb8 4 136 193 +9aebc 4 36 193 +9aec0 1c 136 193 +9aedc 10 136 193 +9aeec 4 36 193 +9aef0 4 41 193 +9aef4 14 41 193 +9af08 4 46 193 +9af0c 4 52 193 +9af10 8 46 193 +9af18 c 49 193 +9af24 4 57 193 +9af28 8 400 238 +9af30 8 53 193 +9af38 8 54 193 +9af40 4 57 193 +9af44 4 57 193 +9af48 4 57 193 +9af4c 4 62 193 +9af50 4 256 201 +9af54 c 57 193 +9af60 4 63 193 +9af64 4 255 201 +9af68 8 256 201 +9af70 4 256 201 +9af74 4 256 201 +9af78 4 256 201 +9af7c 8 65 193 +9af84 c 68 193 +9af90 1c 139 193 +9afac c 43 193 +9afb8 4 37 193 +9afbc 1c 139 193 +FUNC 9afd8 7b4 0 std::priv::__insert_grouping +9afd8 14 143 193 +9afec 8 400 238 +9aff4 4 143 193 +9aff8 4 400 238 +9affc 10 143 193 +9b00c c 80 193 +9b018 8 84 193 +9b020 4 70 213 +9b024 4 86 193 +9b028 4 97 193 +9b02c c 86 193 +9b038 4 92 193 +9b03c 4 83 193 +9b040 4 94 193 +9b044 4 90 193 +9b048 8 102 193 +9b050 8 400 238 +9b058 8 98 193 +9b060 8 99 193 +9b068 8 102 193 +9b070 c 102 193 +9b07c 14 102 193 +9b090 4 108 193 +9b094 8 660 238 +9b09c 8 74 239 +9b0a4 8 74 239 +9b0ac 8 259 237 +9b0b4 4 101 206 +9b0b8 4 261 237 +9b0bc 8 168 247 +9b0c4 c 168 247 +9b0d0 4 232 247 +9b0d4 14 263 237 +9b0e8 1c 145 193 +9b104 8 74 239 +9b10c 8 74 239 +9b114 c 535 238 +9b120 8 101 206 +9b128 4 232 247 +9b12c 10 539 238 +9b13c 8 74 239 +9b144 8 259 237 +9b14c 4 400 238 +9b150 14 304 238 +9b164 4 306 238 +9b168 10 307 238 +9b178 4 64 213 +9b17c 4 67 213 +9b180 4 64 213 +9b184 4 86 244 +9b188 58 86 244 +9b1e0 20 146 206 +9b200 4 86 244 +9b204 4 146 206 +9b208 10 86 244 +9b218 4 146 206 +9b21c c 86 244 +9b228 4 146 206 +9b22c c 86 244 +9b238 4 146 206 +9b23c c 86 244 +9b248 4 146 206 +9b24c c 86 244 +9b258 4 146 206 +9b25c c 86 244 +9b268 4 146 206 +9b26c c 86 244 +9b278 4 146 206 +9b27c c 86 244 +9b288 4 146 206 +9b28c c 86 244 +9b298 4 146 206 +9b29c c 86 244 +9b2a8 4 146 206 +9b2ac c 86 244 +9b2b8 4 146 206 +9b2bc c 86 244 +9b2c8 4 146 206 +9b2cc c 86 244 +9b2d8 4 146 206 +9b2dc 8 86 244 +9b2e4 8 146 206 +9b2ec 8 232 247 +9b2f4 4 271 237 +9b2f8 4 86 244 +9b2fc 60 86 244 +9b35c 20 146 206 +9b37c 4 86 244 +9b380 4 146 206 +9b384 10 86 244 +9b394 4 146 206 +9b398 c 86 244 +9b3a4 4 146 206 +9b3a8 c 86 244 +9b3b4 4 146 206 +9b3b8 c 86 244 +9b3c4 4 146 206 +9b3c8 c 86 244 +9b3d4 4 146 206 +9b3d8 c 86 244 +9b3e4 4 146 206 +9b3e8 c 86 244 +9b3f4 4 146 206 +9b3f8 c 86 244 +9b404 4 146 206 +9b408 c 86 244 +9b414 4 146 206 +9b418 c 86 244 +9b424 4 146 206 +9b428 c 86 244 +9b434 4 146 206 +9b438 c 86 244 +9b444 4 146 206 +9b448 c 86 244 +9b454 4 146 206 +9b458 8 86 244 +9b460 8 146 206 +9b468 4 101 206 +9b46c 4 64 239 +9b470 c 96 239 +9b47c 4 319 202 +9b480 4 97 239 +9b484 4 319 202 +9b488 c 97 239 +9b494 10 161 202 +9b4a4 14 161 202 +9b4b8 4 274 237 +9b4bc 4 164 239 +9b4c0 4 160 239 +9b4c4 c 165 239 +9b4d0 4 308 238 +9b4d4 1c 134 223 +9b4f0 18 135 223 +9b508 4 400 238 +9b50c 14 304 238 +9b520 4 306 238 +9b524 10 307 238 +9b534 4 64 213 +9b538 4 67 213 +9b53c 4 64 213 +9b540 4 86 244 +9b544 58 86 244 +9b59c 20 146 206 +9b5bc 4 86 244 +9b5c0 4 146 206 +9b5c4 10 86 244 +9b5d4 4 146 206 +9b5d8 c 86 244 +9b5e4 4 146 206 +9b5e8 c 86 244 +9b5f4 4 146 206 +9b5f8 c 86 244 +9b604 4 146 206 +9b608 c 86 244 +9b614 4 146 206 +9b618 c 86 244 +9b624 4 146 206 +9b628 c 86 244 +9b634 4 146 206 +9b638 c 86 244 +9b644 4 146 206 +9b648 c 86 244 +9b654 4 146 206 +9b658 c 86 244 +9b664 4 146 206 +9b668 c 86 244 +9b674 4 146 206 +9b678 c 86 244 +9b684 4 146 206 +9b688 c 86 244 +9b694 4 146 206 +9b698 8 86 244 +9b6a0 8 146 206 +9b6a8 4 101 206 +9b6ac 4 64 239 +9b6b0 c 96 239 +9b6bc 4 319 202 +9b6c0 4 97 239 +9b6c4 4 319 202 +9b6c8 4 97 239 +9b6cc 8 161 202 +9b6d4 4 161 202 +9b6d8 4 175 237 +9b6dc 4 164 239 +9b6e0 4 160 239 +9b6e4 c 165 239 +9b6f0 c 74 239 +9b6fc 8 86 244 +9b704 4 146 206 +9b708 14 86 244 +9b71c 8 146 206 +9b724 c 86 244 +9b730 4 308 238 +9b734 18 134 223 +9b74c 8 86 244 +9b754 8 135 223 +9b75c 8 86 244 +9b764 8 146 206 +9b76c 14 86 244 +9b780 c 600 237 +FUNC 9b78c 128 0 std::priv::__insert_grouping +9b78c 4 151 193 +9b790 4 36 193 +9b794 18 151 193 +9b7ac c 151 193 +9b7b8 4 36 193 +9b7bc 4 41 193 +9b7c0 14 41 193 +9b7d4 c 46 193 +9b7e0 4 52 193 +9b7e4 8 46 193 +9b7ec c 49 193 +9b7f8 4 53 193 +9b7fc 4 57 193 +9b800 4 53 193 +9b804 8 54 193 +9b80c 4 57 193 +9b810 4 57 193 +9b814 4 57 193 +9b818 4 62 193 +9b81c 4 256 201 +9b820 c 57 193 +9b82c 4 63 193 +9b830 4 255 201 +9b834 8 256 201 +9b83c 8 256 201 +9b844 4 256 201 +9b848 10 256 201 +9b858 8 65 193 +9b860 4 68 193 +9b864 4 154 193 +9b868 8 68 193 +9b870 18 154 193 +9b888 c 43 193 +9b894 4 37 193 +9b898 1c 154 193 +FUNC 9b8b4 1c0 0 std::basic_string, std::priv::__iostring_allocator >::_M_reserve +9b8b4 4 170 237 +9b8b8 4 64 213 +9b8bc c 170 237 +9b8c8 4 170 237 +9b8cc 8 64 213 +9b8d4 8 67 213 +9b8dc c 86 244 +9b8e8 58 86 244 +9b940 24 146 206 +9b964 4 86 244 +9b968 4 146 206 +9b96c 10 86 244 +9b97c 4 146 206 +9b980 8 86 244 +9b988 8 146 206 +9b990 4 101 206 +9b994 c 96 239 +9b9a0 8 97 239 +9b9a8 8 319 202 +9b9b0 4 97 239 +9b9b4 4 135 223 +9b9b8 8 161 202 +9b9c0 4 161 202 +9b9c4 4 175 237 +9b9c8 4 164 239 +9b9cc 4 160 239 +9b9d0 4 165 239 +9b9d4 10 176 237 +9b9e4 c 302 202 +9b9f0 4 306 202 +9b9f4 10 134 223 +9ba04 8 86 244 +9ba0c 8 146 206 +9ba14 c 86 244 +9ba20 4 135 223 +9ba24 4 164 239 +9ba28 4 175 237 +9ba2c 4 165 239 +9ba30 4 160 239 +9ba34 10 176 237 +9ba44 8 86 244 +9ba4c c 303 202 +9ba58 4 303 202 +9ba5c 18 303 202 +FUNC 9ba74 46c 0 std::priv::__insert_grouping +9ba74 c 159 193 +9ba80 8 400 238 +9ba88 4 159 193 +9ba8c 4 400 238 +9ba90 c 159 193 +9ba9c 4 80 193 +9baa0 4 159 193 +9baa4 8 80 193 +9baac 8 84 193 +9bab4 4 92 193 +9bab8 4 86 193 +9babc 4 70 213 +9bac0 c 86 193 +9bacc 4 97 193 +9bad0 8 83 193 +9bad8 4 90 193 +9badc 4 94 193 +9bae0 4 70 213 +9bae4 8 102 193 +9baec 8 400 238 +9baf4 8 98 193 +9bafc 8 99 193 +9bb04 8 102 193 +9bb0c 14 102 193 +9bb20 10 102 193 +9bb30 c 108 193 +9bb3c 8 660 238 +9bb44 8 74 239 +9bb4c 10 74 239 +9bb5c 8 259 237 +9bb64 4 261 237 +9bb68 4 101 206 +9bb6c c 249 247 +9bb78 4 263 237 +9bb7c 4 249 247 +9bb80 4 263 237 +9bb84 4 267 247 +9bb88 c 263 237 +9bb94 4 400 238 +9bb98 4 307 238 +9bb9c 10 400 238 +9bbac 4 306 238 +9bbb0 10 307 238 +9bbc0 8 64 213 +9bbc8 4 67 213 +9bbcc 4 64 213 +9bbd0 8 86 244 +9bbd8 58 86 244 +9bc30 24 146 206 +9bc54 4 86 244 +9bc58 4 146 206 +9bc5c 10 86 244 +9bc6c 4 146 206 +9bc70 8 86 244 +9bc78 8 146 206 +9bc80 4 267 247 +9bc84 8 86 244 +9bc8c 4 86 244 +9bc90 4 267 247 +9bc94 5c 86 244 +9bcf0 24 146 206 +9bd14 4 86 244 +9bd18 4 146 206 +9bd1c 10 86 244 +9bd2c 4 146 206 +9bd30 8 86 244 +9bd38 8 146 206 +9bd40 4 101 206 +9bd44 c 96 239 +9bd50 8 319 202 +9bd58 4 97 239 +9bd5c 4 319 202 +9bd60 c 97 239 +9bd6c c 161 202 +9bd78 10 161 202 +9bd88 4 274 237 +9bd8c 4 164 239 +9bd90 4 160 239 +9bd94 c 165 239 +9bda0 20 161 193 +9bdc0 4 307 238 +9bdc4 20 134 223 +9bde4 8 86 244 +9bdec 10 86 244 +9bdfc 8 74 239 +9be04 c 74 239 +9be10 8 535 238 +9be18 4 101 206 +9be1c 4 539 238 +9be20 4 267 247 +9be24 8 539 238 +9be2c 14 74 239 +9be40 8 86 244 +9be48 8 146 206 +9be50 18 86 244 +9be68 4 146 206 +9be6c c 86 244 +9be78 14 135 223 +9be8c 14 400 238 +9bea0 4 306 238 +9bea4 14 307 238 +9beb8 10 536 238 +9bec8 10 74 239 +9bed8 8 308 238 +FUNC 9bee0 44 0 std::priv::_Stl_mult64 +9bee0 4 122 192 +9bee4 4 124 192 +9bee8 4 123 192 +9beec 4 125 192 +9bef0 4 127 192 +9bef4 4 130 192 +9bef8 4 136 192 +9befc 4 130 192 +9bf00 4 128 192 +9bf04 8 134 192 +9bf0c 4 136 192 +9bf10 8 135 192 +9bf18 8 136 192 +9bf20 4 137 192 +FUNC 9bf24 84 0 std::priv::_Stl_norm_and_round +9bf24 4 233 192 +9bf28 4 234 192 +9bf2c c 238 192 +9bf38 8 246 192 +9bf40 4 248 192 +9bf44 8 247 192 +9bf4c 4 254 192 +9bf50 4 263 192 +9bf54 4 255 192 +9bf58 4 255 192 +9bf5c c 255 192 +9bf68 8 259 192 +9bf70 8 260 192 +9bf78 4 263 192 +9bf7c 4 251 192 +9bf80 8 254 192 +9bf88 4 239 192 +9bf8c 8 238 192 +9bf94 8 243 192 +9bf9c 4 263 192 +9bfa0 4 258 192 +9bfa4 4 263 192 +FUNC 9bfa8 17c 0 std::priv::_Stl_tenscale +9bfa8 4 269 192 +9bfac 4 280 192 +9bfb0 1c 269 192 +9bfcc c 269 192 +9bfd8 4 280 192 +9bfdc 4 281 192 +9bfe0 4 276 192 +9bfe4 4 281 192 +9bfe8 4 282 192 +9bfec 4 285 192 +9bff0 4 284 192 +9bff4 8 283 192 +9bffc 4 289 192 +9c000 4 288 192 +9c004 20 303 192 +9c024 c 307 192 +9c030 4 306 192 +9c034 c 307 192 +9c040 4 305 192 +9c044 8 307 192 +9c04c 14 308 192 +9c060 20 309 192 +9c080 4 303 192 +9c084 4 312 192 +9c088 4 314 192 +9c08c 4 313 192 +9c090 18 314 192 +9c0a8 14 315 192 +9c0bc 20 316 192 +9c0dc 20 320 192 +9c0fc c 291 192 +9c108 4 292 192 +9c10c 4 291 192 +9c110 4 296 192 +9c114 8 295 192 +9c11c 8 276 192 +FUNC 9c124 3a8 0 std::priv::_Stl_string_to_double +9c124 10 645 192 +9c134 4 655 192 +9c138 8 659 192 +9c140 8 661 192 +9c148 4 655 192 +9c14c 4 658 192 +9c150 4 672 192 +9c154 4 666 192 +9c158 4 673 192 +9c15c 4 669 192 +9c160 4 666 192 +9c164 4 668 192 +9c168 4 674 192 +9c16c 4 673 192 +9c170 8 674 192 +9c178 c 678 192 +9c184 4 681 192 +9c188 4 683 192 +9c18c 4 681 192 +9c190 4 690 192 +9c194 4 672 192 +9c198 8 673 192 +9c1a0 c 685 192 +9c1ac 4 686 192 +9c1b0 8 690 192 +9c1b8 8 676 192 +9c1c0 8 690 192 +9c1c8 c 694 192 +9c1d4 c 698 192 +9c1e0 4 701 192 +9c1e4 14 702 192 +9c1f8 8 704 192 +9c200 4 701 192 +9c204 c 708 192 +9c210 4 722 192 +9c214 8 723 192 +9c21c 4 724 192 +9c220 4 723 192 +9c224 8 726 192 +9c22c 4 166 218 +9c230 4 167 218 +9c234 4 736 192 +9c238 4 737 192 +9c23c 10 741 192 +9c24c 8 683 192 +9c254 8 660 192 +9c25c 8 658 192 +9c264 8 703 192 +9c26c 4 699 192 +9c270 10 708 192 +9c280 4 710 192 +9c284 4 711 192 +9c288 4 710 192 +9c28c 10 709 192 +9c29c c 722 192 +9c2a8 4 717 192 +9c2ac 8 723 192 +9c2b4 4 724 192 +9c2b8 8 723 192 +9c2c0 8 663 192 +9c2c8 8 662 192 +9c2d0 8 706 192 +9c2d8 8 705 192 +9c2e0 4 354 192 +9c2e4 4 355 192 +9c2e8 c 357 192 +9c2f4 4 359 192 +9c2f8 4 358 192 +9c2fc 4 357 192 +9c300 4 359 192 +9c304 4 357 192 +9c308 4 363 192 +9c30c 1c 372 192 +9c328 4 373 192 +9c32c 4 372 192 +9c330 8 373 192 +9c338 8 374 192 +9c340 8 374 192 +9c348 8 375 192 +9c350 8 375 192 +9c358 c 376 192 +9c364 24 377 192 +9c388 c 378 192 +9c394 4 381 192 +9c398 4 270 192 +9c39c 4 381 192 +9c3a0 4 390 192 +9c3a4 8 381 192 +9c3ac 4 272 192 +9c3b0 4 429 192 +9c3b4 8 432 192 +9c3bc 4 441 192 +9c3c0 4 442 192 +9c3c4 4 429 192 +9c3c8 8 442 192 +9c3d0 4 443 192 +9c3d4 8 444 192 +9c3dc 4 445 192 +9c3e0 4 446 192 +9c3e4 4 445 192 +9c3e8 8 464 192 +9c3f0 4 150 192 +9c3f4 4 469 192 +9c3f8 c 150 192 +9c404 4 474 192 +9c408 8 736 192 +9c410 4 695 192 +9c414 c 741 192 +9c420 4 364 192 +9c424 14 736 192 +9c438 8 390 192 +9c440 8 392 192 +9c448 8 394 192 +9c450 8 398 192 +9c458 8 401 192 +9c460 8 406 192 +9c468 c 412 192 +9c474 4 413 192 +9c478 4 412 192 +9c47c 4 413 192 +9c480 4 412 192 +9c484 8 413 192 +9c48c 4 418 192 +9c490 c 418 192 +9c49c 4 419 192 +9c4a0 4 150 192 +9c4a4 8 474 192 +9c4ac 4 395 192 +9c4b0 8 474 192 +9c4b8 4 407 192 +9c4bc 4 409 192 +9c4c0 4 407 192 +9c4c4 8 408 192 +FUNC 9c4cc d8 0 std::priv::_Initialize_get_float +9c4cc 4 86 192 +9c4d0 4 87 192 +9c4d4 4 86 192 +9c4d8 4 87 192 +9c4dc 4 206 207 +9c4e0 4 86 192 +9c4e4 4 87 192 +9c4e8 4 86 192 +9c4ec 4 87 192 +9c4f0 4 86 192 +9c4f4 4 87 192 +9c4f8 8 206 207 +9c500 c 87 192 +9c50c 10 86 192 +9c51c c 206 207 +9c528 4 88 192 +9c52c 14 206 207 +9c540 8 89 192 +9c548 14 206 207 +9c55c 4 90 192 +9c560 4 206 207 +9c564 4 90 192 +9c568 8 206 207 +9c570 8 209 207 +9c578 4 91 192 +9c57c 8 209 207 +9c584 4 91 192 +9c588 10 209 207 +9c598 c 93 192 +FUNC 9c5a4 28 0 std::priv::__string_to_float +9c5a4 8 847 192 +9c5ac 4 849 192 +9c5b0 4 847 192 +9c5b4 4 849 192 +9c5b8 c 849 192 +9c5c4 8 853 192 +FUNC 9c5cc 24 0 std::priv::__string_to_float +9c5cc 8 857 192 +9c5d4 4 859 192 +9c5d8 4 857 192 +9c5dc 4 859 192 +9c5e0 8 859 192 +9c5e8 8 863 192 +FUNC 9c5f0 27c 0 std::priv::_Stl_atodT +9c5f0 4 483 192 +9c5f4 4 488 192 +9c5f8 4 492 192 +9c5fc 8 483 192 +9c604 8 492 192 +9c60c 4 494 192 +9c610 4 493 192 +9c614 4 492 192 +9c618 4 494 192 +9c61c 4 492 192 +9c620 4 497 192 +9c624 18 507 192 +9c63c 4 508 192 +9c640 8 507 192 +9c648 8 508 192 +9c650 8 509 192 +9c658 8 509 192 +9c660 8 510 192 +9c668 8 510 192 +9c670 c 511 192 +9c67c 14 512 192 +9c690 8 516 192 +9c698 4 270 192 +9c69c 8 517 192 +9c6a4 4 527 192 +9c6a8 14 272 192 +9c6bc 4 527 192 +9c6c0 4 529 192 +9c6c4 4 527 192 +9c6c8 8 529 192 +9c6d0 c 589 192 +9c6dc 8 598 192 +9c6e4 8 604 192 +9c6ec 4 608 192 +9c6f0 c 613 192 +9c6fc 4 614 192 +9c700 4 613 192 +9c704 4 614 192 +9c708 4 613 192 +9c70c 8 614 192 +9c714 4 619 192 +9c718 c 619 192 +9c724 8 620 192 +9c72c 4 621 192 +9c730 4 626 192 +9c734 4 624 192 +9c738 8 626 192 +9c740 4 625 192 +9c744 10 627 192 +9c754 8 628 192 +9c75c c 512 192 +9c768 c 513 192 +9c774 4 516 192 +9c778 4 270 192 +9c77c 4 516 192 +9c780 4 527 192 +9c784 8 517 192 +9c78c 4 272 192 +9c790 8 571 192 +9c798 c 197 218 +9c7a4 4 641 192 +9c7a8 8 197 218 +9c7b0 4 198 218 +9c7b4 4 197 218 +9c7b8 4 200 218 +9c7bc 4 199 218 +9c7c0 4 641 192 +9c7c4 4 200 218 +9c7c8 4 641 192 +9c7cc 4 498 192 +9c7d0 c 641 192 +9c7dc 4 581 192 +9c7e0 4 582 192 +9c7e4 4 579 192 +9c7e8 4 582 192 +9c7ec 8 581 192 +9c7f4 4 579 192 +9c7f8 4 582 192 +9c7fc 8 580 192 +9c804 8 582 192 +9c80c 4 641 192 +9c810 4 584 192 +9c814 8 641 192 +9c81c 4 590 192 +9c820 4 637 192 +9c824 4 635 192 +9c828 8 637 192 +9c830 4 635 192 +9c834 4 638 192 +9c838 8 636 192 +9c840 8 638 192 +9c848 4 641 192 +9c84c 4 640 192 +9c850 8 641 192 +9c858 4 609 192 +9c85c 4 611 192 +9c860 4 609 192 +9c864 8 610 192 +FUNC 9c880 1f0 0 std::priv::_Stl_string_to_doubleT +9c880 c 749 192 +9c88c 4 761 192 +9c890 8 765 192 +9c898 8 767 192 +9c8a0 4 761 192 +9c8a4 4 764 192 +9c8a8 4 778 192 +9c8ac 4 772 192 +9c8b0 4 779 192 +9c8b4 4 775 192 +9c8b8 4 772 192 +9c8bc 4 774 192 +9c8c0 4 780 192 +9c8c4 4 779 192 +9c8c8 8 780 192 +9c8d0 c 784 192 +9c8dc 4 787 192 +9c8e0 4 789 192 +9c8e4 4 787 192 +9c8e8 4 796 192 +9c8ec 4 778 192 +9c8f0 8 779 192 +9c8f8 c 791 192 +9c904 4 792 192 +9c908 8 796 192 +9c910 8 782 192 +9c918 8 796 192 +9c920 8 799 192 +9c928 c 803 192 +9c934 4 806 192 +9c938 14 807 192 +9c94c 8 809 192 +9c954 4 806 192 +9c958 c 813 192 +9c964 4 827 192 +9c968 4 826 192 +9c96c c 827 192 +9c978 c 829 192 +9c984 c 197 218 +9c990 4 198 218 +9c994 8 199 218 +9c99c 4 840 192 +9c9a0 4 840 192 +9c9a4 18 841 192 +9c9bc 8 789 192 +9c9c4 4 800 192 +9c9c8 4 841 192 +9c9cc 4 800 192 +9c9d0 10 841 192 +9c9e0 8 766 192 +9c9e8 8 764 192 +9c9f0 8 808 192 +9c9f8 4 804 192 +9c9fc 10 813 192 +9ca0c 4 815 192 +9ca10 4 816 192 +9ca14 4 815 192 +9ca18 18 814 192 +9ca30 8 822 192 +9ca38 8 769 192 +9ca40 8 768 192 +9ca48 18 837 192 +9ca60 8 811 192 +9ca68 8 810 192 +FUNC 9ca70 24 0 std::priv::__string_to_float +9ca70 8 867 192 +9ca78 4 874 192 +9ca7c 4 867 192 +9ca80 4 874 192 +9ca84 8 874 192 +9ca8c 8 876 192 +FUNC 9ca94 f0 0 std::priv::__fill_fmtbuf +9ca94 8 711 194 +9ca9c 4 710 194 +9caa0 4 714 194 +9caa4 18 715 194 +9cabc 8 717 194 +9cac4 14 718 194 +9cad8 8 720 194 +9cae0 c 721 194 +9caec 4 723 194 +9caf0 8 724 194 +9caf8 4 726 194 +9cafc 4 735 194 +9cb00 10 726 194 +9cb10 10 739 194 +9cb20 4 739 194 +9cb24 4 739 194 +9cb28 4 743 194 +9cb2c 10 744 194 +9cb3c 8 712 194 +9cb44 10 729 194 +9cb54 4 729 194 +9cb58 4 729 194 +9cb5c 4 743 194 +9cb60 4 744 194 +9cb64 10 735 194 +9cb74 4 735 194 +9cb78 4 735 194 +9cb7c 4 743 194 +9cb80 4 744 194 +FUNC 9cb84 5f8 0 std::basic_string, std::priv::__iostring_allocator >::_M_append +9cb84 4 196 237 +9cb88 4 197 237 +9cb8c 10 196 237 +9cb9c 4 196 237 +9cba0 4 197 237 +9cba4 4 64 239 +9cba8 4 198 237 +9cbac 8 74 239 +9cbb4 c 74 239 +9cbc0 8 199 237 +9cbc8 4 210 237 +9cbcc 4 211 237 +9cbd0 4 86 244 +9cbd4 58 86 244 +9cc2c 20 146 206 +9cc4c 4 86 244 +9cc50 4 146 206 +9cc54 10 86 244 +9cc64 4 146 206 +9cc68 c 86 244 +9cc74 4 146 206 +9cc78 c 86 244 +9cc84 4 146 206 +9cc88 c 86 244 +9cc94 4 146 206 +9cc98 c 86 244 +9cca4 4 146 206 +9cca8 c 86 244 +9ccb4 4 146 206 +9ccb8 c 86 244 +9ccc4 4 146 206 +9ccc8 c 86 244 +9ccd4 4 146 206 +9ccd8 c 86 244 +9cce4 4 146 206 +9cce8 c 86 244 +9ccf4 4 146 206 +9ccf8 c 86 244 +9cd04 4 146 206 +9cd08 c 86 244 +9cd14 4 146 206 +9cd18 c 86 244 +9cd24 4 146 206 +9cd28 8 86 244 +9cd30 8 146 206 +9cd38 c 101 206 +9cd44 4 232 247 +9cd48 c 214 237 +9cd54 18 218 237 +9cd6c 4 400 238 +9cd70 1c 304 238 +9cd8c 4 306 238 +9cd90 10 307 238 +9cda0 4 64 213 +9cda4 4 67 213 +9cda8 8 64 213 +9cdb0 4 308 238 +9cdb4 20 134 223 +9cdd4 58 86 244 +9ce2c 20 146 206 +9ce4c 4 86 244 +9ce50 4 146 206 +9ce54 10 86 244 +9ce64 4 146 206 +9ce68 c 86 244 +9ce74 4 146 206 +9ce78 c 86 244 +9ce84 4 146 206 +9ce88 c 86 244 +9ce94 4 146 206 +9ce98 c 86 244 +9cea4 4 146 206 +9cea8 c 86 244 +9ceb4 4 146 206 +9ceb8 c 86 244 +9cec4 4 146 206 +9cec8 c 86 244 +9ced4 4 146 206 +9ced8 c 86 244 +9cee4 4 146 206 +9cee8 c 86 244 +9cef4 4 146 206 +9cef8 c 86 244 +9cf04 4 146 206 +9cf08 c 86 244 +9cf14 4 146 206 +9cf18 c 86 244 +9cf24 4 146 206 +9cf28 8 86 244 +9cf30 8 146 206 +9cf38 58 86 244 +9cf90 20 146 206 +9cfb0 4 86 244 +9cfb4 4 146 206 +9cfb8 10 86 244 +9cfc8 4 146 206 +9cfcc c 86 244 +9cfd8 4 146 206 +9cfdc c 86 244 +9cfe8 4 146 206 +9cfec c 86 244 +9cff8 4 146 206 +9cffc c 86 244 +9d008 4 146 206 +9d00c c 86 244 +9d018 4 146 206 +9d01c c 86 244 +9d028 4 146 206 +9d02c c 86 244 +9d038 4 146 206 +9d03c c 86 244 +9d048 4 146 206 +9d04c c 86 244 +9d058 4 146 206 +9d05c c 86 244 +9d068 4 146 206 +9d06c c 86 244 +9d078 4 146 206 +9d07c c 86 244 +9d088 4 146 206 +9d08c 8 86 244 +9d094 8 146 206 +9d09c 4 101 206 +9d0a0 4 64 239 +9d0a4 c 96 239 +9d0b0 8 97 239 +9d0b8 8 319 202 +9d0c0 4 97 239 +9d0c4 8 161 202 +9d0cc 4 161 202 +9d0d0 4 165 239 +9d0d4 4 206 237 +9d0d8 4 164 239 +9d0dc 4 218 237 +9d0e0 4 160 239 +9d0e4 20 218 237 +9d104 4 146 206 +9d108 10 86 244 +9d118 10 74 239 +9d128 8 86 244 +9d130 8 146 206 +9d138 14 86 244 +9d14c 8 146 206 +9d154 c 86 244 +9d160 8 135 223 +9d168 8 86 244 +9d170 c 600 237 +FUNC 9d17c 220 0 std::priv::__get_floor_digits +9d17c 4 844 194 +9d180 4 849 194 +9d184 4 844 194 +9d188 8 849 194 +9d190 c 844 194 +9d19c 4 849 194 +9d1a0 4 844 194 +9d1a4 4 849 194 +9d1a8 4 844 194 +9d1ac 4 849 194 +9d1b0 4 844 194 +9d1b4 4 849 194 +9d1b8 10 853 194 +9d1c8 4 854 194 +9d1cc 8 470 238 +9d1d4 4 64 239 +9d1d8 4 355 217 +9d1dc 8 74 239 +9d1e4 10 74 239 +9d1f4 10 472 238 +9d204 4 232 247 +9d208 c 107 244 +9d214 10 106 244 +9d224 4 101 206 +9d228 c 485 238 +9d234 1c 870 194 +9d250 4 400 238 +9d254 1c 304 238 +9d270 4 306 238 +9d274 10 307 238 +9d284 4 64 213 +9d288 8 67 213 +9d290 8 64 213 +9d298 4 308 238 +9d29c 10 134 223 +9d2ac 4 311 202 +9d2b0 c 107 244 +9d2bc 10 106 244 +9d2cc 4 107 244 +9d2d0 c 106 244 +9d2dc 4 101 206 +9d2e0 4 107 244 +9d2e4 4 64 239 +9d2e8 c 96 239 +9d2f4 8 97 239 +9d2fc 8 319 202 +9d304 4 97 239 +9d308 4 135 223 +9d30c 8 161 202 +9d314 4 161 202 +9d318 4 164 239 +9d31c 4 479 238 +9d320 4 165 239 +9d324 4 160 239 +9d328 1c 870 194 +9d344 10 74 239 +9d354 8 229 247 +9d35c 4 530 238 +9d360 c 530 238 +9d36c 1c 870 194 +9d388 8 135 223 +9d390 c 600 237 +FUNC 9d39c 334 0 std::priv::__convert_float_buffer +9d39c 2c 875 194 +9d3c8 4 875 194 +9d3cc 4 880 194 +9d3d0 4 879 194 +9d3d4 4 880 194 +9d3d8 4 881 194 +9d3dc 4 307 238 +9d3e0 c 881 194 +9d3ec 4 267 247 +9d3f0 4 101 206 +9d3f4 4 880 194 +9d3f8 4 267 247 +9d3fc 4 539 238 +9d400 4 880 194 +9d404 c 881 194 +9d410 8 206 207 +9d418 4 882 194 +9d41c c 206 207 +9d428 4 64 239 +9d42c 8 74 239 +9d434 14 74 239 +9d448 8 535 238 +9d450 14 400 238 +9d464 4 306 238 +9d468 10 307 238 +9d478 c 536 238 +9d484 4 880 194 +9d488 4 267 247 +9d48c 4 101 206 +9d490 4 267 247 +9d494 4 539 238 +9d498 4 880 194 +9d49c 18 900 194 +9d4b4 4 889 194 +9d4b8 18 206 207 +9d4d0 4 64 239 +9d4d4 8 74 239 +9d4dc 14 74 239 +9d4f0 8 535 238 +9d4f8 4 267 247 +9d4fc 4 101 206 +9d500 4 267 247 +9d504 4 539 238 +9d508 c 896 194 +9d514 8 307 238 +9d51c 4 267 247 +9d520 4 101 206 +9d524 8 896 194 +9d52c 4 267 247 +9d530 4 539 238 +9d534 4 896 194 +9d538 18 206 207 +9d550 4 64 239 +9d554 8 74 239 +9d55c 14 74 239 +9d570 c 535 238 +9d57c 14 400 238 +9d590 4 306 238 +9d594 10 307 238 +9d5a4 10 536 238 +9d5b4 14 74 239 +9d5c8 8 308 238 +9d5d0 14 74 239 +9d5e4 c 308 238 +9d5f0 4 64 239 +9d5f4 8 74 239 +9d5fc c 74 239 +9d608 8 535 238 +9d610 4 267 247 +9d614 4 101 206 +9d618 4 267 247 +9d61c 8 539 238 +9d624 14 400 238 +9d638 4 306 238 +9d63c 14 307 238 +9d650 10 536 238 +9d660 14 74 239 +9d674 14 400 238 +9d688 4 306 238 +9d68c 14 307 238 +9d6a0 10 536 238 +9d6b0 8 308 238 +9d6b8 10 74 239 +9d6c8 8 308 238 +FUNC 9d6d0 dc 0 std::basic_string, std::priv::__iostring_allocator >::_M_assign +9d6d0 18 242 237 +9d6e8 4 243 237 +9d6ec 4 242 237 +9d6f0 4 242 237 +9d6f4 4 400 238 +9d6f8 4 244 237 +9d6fc 4 242 237 +9d700 4 244 237 +9d704 4 168 247 +9d708 4 246 237 +9d70c 8 803 238 +9d714 4 168 247 +9d718 4 806 238 +9d71c 4 168 247 +9d720 c 806 238 +9d72c 14 253 237 +9d740 4 168 247 +9d744 10 250 237 +9d754 14 253 237 +9d768 10 168 247 +9d778 4 246 237 +9d77c c 803 238 +9d788 10 168 247 +9d798 14 250 237 +FUNC 9d7ac 230 0 std::priv::__write_floatT +9d7ac c 749 194 +9d7b8 4 760 194 +9d7bc c 749 194 +9d7c8 4 760 194 +9d7cc 4 749 194 +9d7d0 4 749 194 +9d7d4 4 760 194 +9d7d8 4 749 194 +9d7dc 4 761 194 +9d7e0 4 749 194 +9d7e4 4 760 194 +9d7e8 18 761 194 +9d800 8 229 247 +9d808 4 355 238 +9d80c 10 355 238 +9d81c 10 162 200 +9d82c 8 164 200 +9d834 4 165 200 +9d838 14 705 194 +9d84c 4 168 200 +9d850 20 705 194 +9d870 4 174 200 +9d874 14 705 194 +9d888 8 164 200 +9d890 4 165 200 +9d894 14 705 194 +9d8a8 4 168 200 +9d8ac 18 705 194 +9d8c4 8 171 200 +9d8cc c 705 194 +9d8d8 8 169 200 +9d8e0 20 820 194 +9d900 4 172 200 +9d904 30 820 194 +9d934 8 166 200 +9d93c c 164 200 +9d948 18 178 200 +9d960 4 186 200 +9d964 20 705 194 +9d984 8 166 200 +9d98c 4 180 200 +9d990 10 705 194 +9d9a0 4 181 200 +9d9a4 4 705 194 +9d9a8 4 183 200 +9d9ac 14 705 194 +9d9c0 10 184 200 +9d9d0 c 164 200 +FUNC 9d9dc 4 0 std::priv::__write_float +9d9dc 4 840 194 +FUNC 9d9e0 210 0 std::priv::__write_floatT +9d9e0 8 749 194 +9d9e8 4 760 194 +9d9ec 8 749 194 +9d9f4 4 760 194 +9d9f8 4 749 194 +9d9fc 4 749 194 +9da00 4 760 194 +9da04 4 749 194 +9da08 4 761 194 +9da0c 4 749 194 +9da10 4 760 194 +9da14 18 761 194 +9da2c 8 229 247 +9da34 4 355 238 +9da38 10 355 238 +9da48 10 162 200 +9da58 8 164 200 +9da60 4 165 200 +9da64 14 705 194 +9da78 4 168 200 +9da7c 20 705 194 +9da9c 4 174 200 +9daa0 14 705 194 +9dab4 8 164 200 +9dabc 4 165 200 +9dac0 14 705 194 +9dad4 4 168 200 +9dad8 18 705 194 +9daf0 8 171 200 +9daf8 c 705 194 +9db04 8 169 200 +9db0c 10 820 194 +9db1c 4 172 200 +9db20 28 820 194 +9db48 8 166 200 +9db50 c 164 200 +9db5c 18 178 200 +9db74 4 186 200 +9db78 20 705 194 +9db98 8 166 200 +9dba0 4 180 200 +9dba4 10 705 194 +9dbb4 4 181 200 +9dbb8 4 705 194 +9dbbc 4 183 200 +9dbc0 14 705 194 +9dbd4 10 184 200 +9dbe4 c 164 200 +FUNC 9dbf0 4 0 std::priv::__write_float +9dbf0 4 829 194 +FUNC 9dbf4 8 0 std::numpunct::do_decimal_point +9dbf4 8 26 195 +FUNC 9dbfc 8 0 std::numpunct::do_thousands_sep +9dbfc 8 27 195 +FUNC 9dc04 8 0 std::numpunct::do_decimal_point +9dc04 8 34 195 +FUNC 9dc0c 8 0 std::numpunct::do_thousands_sep +9dc0c 8 35 195 +FUNC 9dc14 14 0 std::numpunct::~numpunct +9dc14 14 31 195 +FUNC 9dc28 24 0 std::numpunct::~numpunct +9dc28 c 31 195 +9dc34 8 31 195 +9dc3c 4 31 195 +9dc40 8 31 195 +9dc48 4 31 195 +FUNC 9dc4c 14 0 std::numpunct::~numpunct +9dc4c 14 39 195 +FUNC 9dc60 24 0 std::numpunct::~numpunct +9dc60 c 39 195 +9dc6c 8 39 195 +9dc74 4 39 195 +9dc78 8 39 195 +9dc80 4 39 195 +FUNC 9dc84 14 0 std::numpunct::do_grouping +9dc84 4 36 195 +9dc88 4 120 239 +9dc8c 4 481 202 +9dc90 4 101 206 +9dc94 4 36 195 +FUNC 9dc98 14 0 std::numpunct::do_grouping +9dc98 4 28 195 +9dc9c 4 120 239 +9dca0 4 481 202 +9dca4 4 101 206 +9dca8 4 28 195 +FUNC 9dcac 30 0 std::numpunct::do_truename +9dcac 4 29 195 +9dcb0 8 29 195 +9dcb8 4 29 195 +9dcbc 8 29 195 +9dcc4 8 29 195 +9dccc 10 29 195 +FUNC 9dcdc 30 0 std::numpunct::do_falsename +9dcdc 4 30 195 +9dce0 8 30 195 +9dce8 4 30 195 +9dcec 8 30 195 +9dcf4 8 30 195 +9dcfc 10 30 195 +FUNC 9dd0c 30 0 std::numpunct::do_truename +9dd0c 4 37 195 +9dd10 8 37 195 +9dd18 4 37 195 +9dd1c 8 37 195 +9dd24 8 37 195 +9dd2c 10 37 195 +FUNC 9dd3c 30 0 std::numpunct::do_falsename +9dd3c 4 38 195 +9dd40 8 38 195 +9dd48 4 38 195 +9dd4c 8 38 195 +9dd54 8 38 195 +9dd5c 10 38 195 +FUNC 9dd6c 1dc 0 std::priv::__append +9dd6c c 174 198 +9dd78 4 209 207 +9dd7c 4 174 198 +9dd80 4 209 207 +9dd84 4 174 198 +9dd88 8 209 207 +9dd90 8 174 198 +9dd98 4 174 198 +9dd9c 4 209 207 +9dda0 4 174 198 +9dda4 4 209 207 +9dda8 8 177 198 +9ddb0 8 470 238 +9ddb8 4 64 239 +9ddbc 8 355 217 +9ddc4 8 74 239 +9ddcc 14 74 239 +9dde0 8 472 238 +9dde8 4 107 244 +9ddec 8 267 247 +9ddf4 8 107 244 +9ddfc 10 106 244 +9de0c 4 101 206 +9de10 4 484 238 +9de14 4 485 238 +9de18 14 178 198 +9de2c 4 400 238 +9de30 4 304 238 +9de34 4 400 238 +9de38 18 304 238 +9de50 4 306 238 +9de54 10 307 238 +9de64 c 64 213 +9de70 8 67 213 +9de78 c 107 244 +9de84 10 106 244 +9de94 4 107 244 +9de98 c 106 244 +9dea4 4 107 244 +9dea8 4 64 239 +9deac 4 101 206 +9deb0 c 96 239 +9debc 8 97 239 +9dec4 8 319 202 +9decc 4 97 239 +9ded0 4 135 223 +9ded4 8 161 202 +9dedc 4 161 202 +9dee0 4 479 238 +9dee4 4 164 239 +9dee8 4 160 239 +9deec 4 165 239 +9def0 14 178 198 +9df04 4 307 238 +9df08 8 134 223 +9df10 10 311 202 +9df20 14 74 239 +9df34 8 135 223 +9df3c c 600 237 +FUNC 9df48 1b8 0 std::priv::__append +9df48 1c 169 198 +9df64 4 470 238 +9df68 8 400 238 +9df70 4 470 238 +9df74 4 64 239 +9df78 8 74 239 +9df80 14 74 239 +9df94 c 472 238 +9dfa0 8 482 238 +9dfa8 4 267 247 +9dfac 8 107 244 +9dfb4 10 106 244 +9dfc4 4 101 206 +9dfc8 4 484 238 +9dfcc 4 485 238 +9dfd0 14 169 198 +9dfe4 4 400 238 +9dfe8 4 304 238 +9dfec 4 400 238 +9dff0 18 304 238 +9e008 4 306 238 +9e00c 10 307 238 +9e01c c 64 213 +9e028 8 67 213 +9e030 c 107 244 +9e03c 10 106 244 +9e04c 4 107 244 +9e050 c 106 244 +9e05c 4 107 244 +9e060 4 64 239 +9e064 4 101 206 +9e068 c 96 239 +9e074 8 97 239 +9e07c 8 319 202 +9e084 4 97 239 +9e088 4 135 223 +9e08c 8 161 202 +9e094 4 161 202 +9e098 4 479 238 +9e09c 4 165 239 +9e0a0 4 160 239 +9e0a4 4 164 239 +9e0a8 14 169 198 +9e0bc 4 307 238 +9e0c0 8 134 223 +9e0c8 10 311 202 +9e0d8 14 74 239 +9e0ec 8 135 223 +9e0f4 c 600 237 +FUNC 9e100 208 0 std::basic_string, std::priv::__iostring_allocator >::append +9e100 1c 180 237 +9e11c 4 74 239 +9e120 8 180 237 +9e128 4 74 239 +9e12c c 74 239 +9e138 8 184 237 +9e140 4 267 247 +9e144 4 101 206 +9e148 c 192 237 +9e154 4 267 247 +9e158 4 189 237 +9e15c c 192 237 +9e168 14 400 238 +9e17c 4 306 238 +9e180 14 307 238 +9e194 c 64 213 +9e1a0 8 67 213 +9e1a8 58 86 244 +9e200 24 146 206 +9e224 4 86 244 +9e228 4 146 206 +9e22c 10 86 244 +9e23c 4 146 206 +9e240 c 86 244 +9e24c 8 146 206 +9e254 4 101 206 +9e258 c 96 239 +9e264 8 97 239 +9e26c 8 319 202 +9e274 4 97 239 +9e278 8 161 202 +9e280 4 161 202 +9e284 4 175 237 +9e288 4 165 239 +9e28c 4 160 239 +9e290 8 165 239 +9e298 4 307 238 +9e29c 24 134 223 +9e2c0 1c 74 239 +9e2dc 8 86 244 +9e2e4 8 146 206 +9e2ec c 86 244 +9e2f8 8 135 223 +9e300 8 86 244 +FUNC 9e308 2b8 0 std::basic_string, std::priv::__iostring_allocator >::append +9e308 18 180 237 +9e320 4 400 238 +9e324 8 180 237 +9e32c 4 182 237 +9e330 4 180 237 +9e334 4 182 237 +9e338 8 74 239 +9e340 8 74 239 +9e348 8 184 237 +9e350 8 101 206 +9e358 4 232 247 +9e35c 4 192 237 +9e360 4 189 237 +9e364 4 192 237 +9e368 8 189 237 +9e370 1c 192 237 +9e38c 4 306 238 +9e390 10 307 238 +9e3a0 4 64 213 +9e3a4 4 67 213 +9e3a8 8 64 213 +9e3b0 4 308 238 +9e3b4 18 134 223 +9e3cc 58 86 244 +9e424 20 146 206 +9e444 4 86 244 +9e448 4 146 206 +9e44c 10 86 244 +9e45c 4 146 206 +9e460 c 86 244 +9e46c 4 146 206 +9e470 c 86 244 +9e47c 4 146 206 +9e480 c 86 244 +9e48c 4 146 206 +9e490 c 86 244 +9e49c 4 146 206 +9e4a0 c 86 244 +9e4ac 4 146 206 +9e4b0 c 86 244 +9e4bc 4 146 206 +9e4c0 c 86 244 +9e4cc 4 146 206 +9e4d0 c 86 244 +9e4dc 4 146 206 +9e4e0 c 86 244 +9e4ec 4 146 206 +9e4f0 c 86 244 +9e4fc 4 146 206 +9e500 c 86 244 +9e50c 4 146 206 +9e510 c 86 244 +9e51c 4 146 206 +9e520 8 86 244 +9e528 8 146 206 +9e530 4 101 206 +9e534 4 64 239 +9e538 c 96 239 +9e544 8 97 239 +9e54c 8 319 202 +9e554 4 97 239 +9e558 8 161 202 +9e560 4 161 202 +9e564 4 175 237 +9e568 4 164 239 +9e56c 4 160 239 +9e570 c 165 239 +9e57c c 74 239 +9e588 8 86 244 +9e590 8 146 206 +9e598 c 86 244 +9e5a4 8 135 223 +9e5ac 8 86 244 +9e5b4 c 600 237 +FUNC 9e5c0 a8 0 std::priv::__subformat +9e5c0 24 148 198 +9e5e4 8 148 198 +9e5ec 8 152 198 +9e5f4 10 153 198 +9e604 4 156 198 +9e608 4 155 198 +9e60c 4 156 198 +9e610 4 155 198 +9e614 4 156 198 +9e618 4 154 198 +9e61c 18 159 198 +9e634 8 152 198 +9e63c 14 163 198 +9e650 10 161 198 +9e660 8 157 198 +FUNC 9e668 8b4 0 std::priv::__write_formatted_timeT +9e668 10 213 198 +9e678 4 220 198 +9e67c 4 220 198 +9e680 c 213 198 +9e68c 2c 220 198 +9e6b8 18 374 198 +9e6d0 18 374 198 +9e6e8 4 64 239 +9e6ec c 96 239 +9e6f8 8 97 239 +9e700 8 161 202 +9e708 4 161 202 +9e70c 14 452 198 +9e720 1c 338 198 +9e73c 14 342 198 +9e750 4 357 198 +9e754 14 358 198 +9e768 14 452 198 +9e77c 20 206 207 +9e79c 30 381 198 +9e7cc 8 420 198 +9e7d4 10 421 198 +9e7e4 14 452 198 +9e7f8 24 226 198 +9e81c c 305 198 +9e828 1c 304 198 +9e844 4 243 198 +9e848 c 243 198 +9e854 4 243 198 +9e858 c 282 198 +9e864 4 283 198 +9e868 10 283 198 +9e878 14 452 198 +9e88c c 239 198 +9e898 28 313 198 +9e8c0 1c 222 198 +9e8dc 18 318 198 +9e8f4 1c 309 198 +9e910 4 299 198 +9e914 c 299 198 +9e920 4 299 198 +9e924 4 299 198 +9e928 4 299 198 +9e92c 4 420 198 +9e930 14 299 198 +9e944 c 420 198 +9e950 40 287 198 +9e990 4 282 198 +9e994 c 282 198 +9e9a0 4 282 198 +9e9a4 c 282 198 +9e9b0 4 283 198 +9e9b4 10 283 198 +9e9c4 18 366 198 +9e9dc 1c 366 198 +9e9f8 4 273 198 +9e9fc c 273 198 +9ea08 4 273 198 +9ea0c c 273 198 +9ea18 4 274 198 +9ea1c 10 274 198 +9ea2c 8 258 198 +9ea34 18 258 198 +9ea4c 18 258 198 +9ea64 8 259 198 +9ea6c 4 253 198 +9ea70 c 253 198 +9ea7c 4 253 198 +9ea80 c 253 198 +9ea8c 4 254 198 +9ea90 10 254 198 +9eaa0 4 394 198 +9eaa4 4 194 198 +9eaa8 4 394 198 +9eaac 4 393 198 +9eab0 1c 194 198 +9eacc 8 395 198 +9ead4 8 393 198 +9eadc 8 401 198 +9eae4 14 401 198 +9eaf8 18 401 198 +9eb10 4 401 198 +9eb14 20 194 198 +9eb34 8 402 198 +9eb3c 4 404 198 +9eb40 10 409 198 +9eb50 4 411 198 +9eb54 4 420 198 +9eb58 1c 411 198 +9eb74 4 386 198 +9eb78 4 387 198 +9eb7c 4 386 198 +9eb80 4 387 198 +9eb84 8 420 198 +9eb8c 2c 357 198 +9ebb8 18 352 198 +9ebd0 18 263 198 +9ebe8 1c 348 198 +9ec04 24 206 207 +9ec28 8 292 198 +9ec30 4 420 198 +9ec34 8 292 198 +9ec3c 24 234 198 +9ec60 18 370 198 +9ec78 1c 370 198 +9ec94 40 278 198 +9ecd4 10 206 207 +9ece4 4 268 198 +9ece8 c 268 198 +9ecf4 4 268 198 +9ecf8 10 268 198 +9ed08 8 269 198 +9ed10 18 258 198 +9ed28 8 258 198 +9ed30 4 258 198 +9ed34 10 258 198 +9ed44 24 259 198 +9ed68 14 259 198 +9ed7c 8 259 198 +9ed84 10 268 198 +9ed94 4 269 198 +9ed98 10 269 198 +9eda8 c 243 198 +9edb4 4 244 198 +9edb8 10 244 198 +9edc8 c 299 198 +9edd4 4 258 198 +9edd8 4 258 198 +9eddc 8 258 198 +9ede4 8 135 223 +9edec c 258 198 +9edf8 4 417 198 +9edfc 4 420 198 +9ee00 24 417 198 +9ee24 4 414 198 +9ee28 8 420 198 +9ee30 8 397 198 +9ee38 8 398 198 +9ee40 14 398 198 +9ee54 18 398 198 +9ee6c 4 398 198 +9ee70 20 194 198 +9ee90 10 195 198 +9eea0 8 64 239 +9eea8 c 96 239 +9eeb4 18 97 239 +9eecc 8 64 239 +9eed4 c 96 239 +9eee0 14 97 239 +9eef4 8 64 239 +9eefc c 96 239 +9ef08 14 97 239 +FUNC 9ef1c 4 0 std::priv::__write_formatted_time +9ef1c 4 462 198 +FUNC 9ef20 294 0 std::priv::time_init::time_init +9ef20 10 502 198 +9ef30 4 101 206 +9ef34 10 502 198 +9ef44 c 120 239 +9ef50 4 481 202 +9ef54 4 120 239 +9ef58 4 101 206 +9ef5c 14 120 239 +9ef70 4 481 202 +9ef74 4 120 239 +9ef78 4 101 206 +9ef7c c 120 239 +9ef88 4 481 202 +9ef8c 4 120 239 +9ef90 4 101 206 +9ef94 c 120 239 +9efa0 4 481 202 +9efa4 4 120 239 +9efa8 4 101 206 +9efac c 120 239 +9efb8 4 481 202 +9efbc 4 120 239 +9efc0 4 101 206 +9efc4 4 72 243 +9efc8 4 120 239 +9efcc 4 72 243 +9efd0 8 481 202 +9efd8 4 101 206 +9efdc 4 120 239 +9efe0 4 481 202 +9efe4 4 101 206 +9efe8 4 120 239 +9efec 4 481 202 +9eff0 4 101 206 +9eff4 4 120 239 +9eff8 4 481 202 +9effc 4 101 206 +9f000 4 120 239 +9f004 4 481 202 +9f008 4 101 206 +9f00c 4 120 239 +9f010 4 481 202 +9f014 4 101 206 +9f018 4 120 239 +9f01c 4 481 202 +9f020 4 101 206 +9f024 4 120 239 +9f028 4 481 202 +9f02c 4 101 206 +9f030 4 120 239 +9f034 4 481 202 +9f038 4 101 206 +9f03c 4 120 239 +9f040 4 481 202 +9f044 4 101 206 +9f048 4 120 239 +9f04c 4 481 202 +9f050 4 101 206 +9f054 4 120 239 +9f058 4 481 202 +9f05c 4 101 206 +9f060 4 120 239 +9f064 4 481 202 +9f068 4 101 206 +9f06c 4 120 239 +9f070 4 481 202 +9f074 4 101 206 +9f078 4 120 239 +9f07c 4 481 202 +9f080 4 101 206 +9f084 8 72 243 +9f08c 8 120 239 +9f094 8 481 202 +9f09c 8 101 206 +9f0a4 8 120 239 +9f0ac 8 481 202 +9f0b4 4 101 206 +9f0b8 4 503 198 +9f0bc 8 229 247 +9f0c4 4 355 238 +9f0c8 14 355 238 +9f0dc 10 77 198 +9f0ec 8 229 247 +9f0f4 4 355 238 +9f0f8 14 355 238 +9f10c 8 79 198 +9f114 70 355 238 +9f184 20 504 198 +9f1a4 10 503 198 +FUNC 9f1b4 c0 0 std::basic_string, std::allocator >::_M_assign +9f1b4 14 242 237 +9f1c8 4 243 237 +9f1cc 4 242 237 +9f1d0 4 400 238 +9f1d4 4 242 237 +9f1d8 4 243 237 +9f1dc 4 242 237 +9f1e0 8 400 238 +9f1e8 8 244 237 +9f1f0 c 249 247 +9f1fc 8 246 237 +9f204 8 803 238 +9f20c c 249 247 +9f218 4 806 238 +9f21c 4 249 247 +9f220 c 806 238 +9f22c 14 253 237 +9f240 4 249 247 +9f244 4 400 238 +9f248 4 250 237 +9f24c 4 400 238 +9f250 4 250 237 +9f254 4 400 238 +9f258 8 250 237 +9f260 14 253 237 +FUNC 9f274 2bc 0 std::priv::time_init::time_init +9f274 4 527 198 +9f278 8 120 239 +9f280 c 527 198 +9f28c 4 101 206 +9f290 10 527 198 +9f2a0 c 120 239 +9f2ac 4 481 202 +9f2b0 4 120 239 +9f2b4 4 101 206 +9f2b8 14 120 239 +9f2cc 4 481 202 +9f2d0 4 120 239 +9f2d4 4 101 206 +9f2d8 c 120 239 +9f2e4 4 481 202 +9f2e8 4 120 239 +9f2ec 4 101 206 +9f2f0 c 120 239 +9f2fc 4 481 202 +9f300 4 120 239 +9f304 4 101 206 +9f308 8 120 239 +9f310 4 80 243 +9f314 8 481 202 +9f31c 4 101 206 +9f320 4 80 243 +9f324 8 120 239 +9f32c 4 481 202 +9f330 4 101 206 +9f334 4 120 239 +9f338 4 481 202 +9f33c 4 101 206 +9f340 4 120 239 +9f344 4 481 202 +9f348 4 101 206 +9f34c 4 120 239 +9f350 4 481 202 +9f354 4 101 206 +9f358 4 120 239 +9f35c 4 481 202 +9f360 4 101 206 +9f364 4 120 239 +9f368 4 481 202 +9f36c 4 101 206 +9f370 4 120 239 +9f374 4 481 202 +9f378 4 101 206 +9f37c 4 120 239 +9f380 4 481 202 +9f384 4 101 206 +9f388 4 120 239 +9f38c 4 481 202 +9f390 4 101 206 +9f394 4 120 239 +9f398 4 481 202 +9f39c 4 101 206 +9f3a0 4 120 239 +9f3a4 4 481 202 +9f3a8 4 101 206 +9f3ac 4 120 239 +9f3b0 4 481 202 +9f3b4 4 101 206 +9f3b8 4 120 239 +9f3bc 4 481 202 +9f3c0 4 101 206 +9f3c4 4 120 239 +9f3c8 4 481 202 +9f3cc 4 101 206 +9f3d0 4 120 239 +9f3d4 4 481 202 +9f3d8 4 101 206 +9f3dc 8 80 243 +9f3e4 4 80 243 +9f3e8 1c 120 239 +9f404 4 481 202 +9f408 4 101 206 +9f40c 4 120 239 +9f410 4 481 202 +9f414 4 101 206 +9f418 4 528 198 +9f41c 8 264 247 +9f424 4 355 238 +9f428 14 355 238 +9f43c 14 89 198 +9f450 8 264 247 +9f458 4 355 238 +9f45c 14 355 238 +9f470 8 91 198 +9f478 14 264 247 +9f48c 8 355 238 +9f494 8 355 238 +9f49c 14 264 247 +9f4b0 8 355 238 +9f4b8 48 355 238 +9f500 20 529 198 +9f520 10 528 198 +FUNC 9f530 1a8 0 std::basic_string, std::priv::__iostring_allocator >::_M_appendT +9f530 4 468 238 +9f534 4 470 238 +9f538 10 468 238 +9f548 8 468 238 +9f550 4 470 238 +9f554 4 64 239 +9f558 4 355 217 +9f55c 8 74 239 +9f564 c 74 239 +9f570 c 472 238 +9f57c 4 482 238 +9f580 4 232 247 +9f584 c 107 244 +9f590 10 106 244 +9f5a0 4 101 206 +9f5a4 c 485 238 +9f5b0 18 489 238 +9f5c8 4 400 238 +9f5cc 1c 304 238 +9f5e8 4 306 238 +9f5ec 10 307 238 +9f5fc 4 64 213 +9f600 4 67 213 +9f604 8 64 213 +9f60c 4 308 238 +9f610 8 134 223 +9f618 c 311 202 +9f624 c 107 244 +9f630 10 106 244 +9f640 4 107 244 +9f644 c 106 244 +9f650 4 101 206 +9f654 4 107 244 +9f658 4 64 239 +9f65c c 96 239 +9f668 8 97 239 +9f670 8 319 202 +9f678 4 97 239 +9f67c 4 135 223 +9f680 8 161 202 +9f688 4 161 202 +9f68c 4 164 239 +9f690 4 479 238 +9f694 4 165 239 +9f698 4 489 238 +9f69c 4 160 239 +9f6a0 14 489 238 +9f6b4 10 74 239 +9f6c4 8 135 223 +9f6cc c 600 237 +FUNC 9f6d8 1a8 0 std::basic_string, std::priv::__iostring_allocator >::_M_appendT +9f6d8 4 468 238 +9f6dc 4 470 238 +9f6e0 10 468 238 +9f6f0 8 468 238 +9f6f8 4 470 238 +9f6fc 4 64 239 +9f700 4 355 217 +9f704 8 74 239 +9f70c c 74 239 +9f718 c 472 238 +9f724 4 482 238 +9f728 4 232 247 +9f72c c 107 244 +9f738 10 106 244 +9f748 4 101 206 +9f74c c 485 238 +9f758 18 489 238 +9f770 4 400 238 +9f774 1c 304 238 +9f790 4 306 238 +9f794 10 307 238 +9f7a4 4 64 213 +9f7a8 4 67 213 +9f7ac 8 64 213 +9f7b4 4 308 238 +9f7b8 8 134 223 +9f7c0 c 311 202 +9f7cc c 107 244 +9f7d8 10 106 244 +9f7e8 4 107 244 +9f7ec c 106 244 +9f7f8 4 101 206 +9f7fc 4 107 244 +9f800 4 64 239 +9f804 c 96 239 +9f810 8 97 239 +9f818 8 319 202 +9f820 4 97 239 +9f824 4 135 223 +9f828 8 161 202 +9f830 4 161 202 +9f834 4 164 239 +9f838 4 479 238 +9f83c 4 165 239 +9f840 4 489 238 +9f844 4 160 239 +9f848 14 489 238 +9f85c 10 74 239 +9f86c 8 135 223 +9f874 c 600 237 +FUNC 9f880 11f8 0 std::priv::__write_formatted_timeT +9f880 10 213 198 +9f890 4 220 198 +9f894 4 220 198 +9f898 c 213 198 +9f8a4 2c 220 198 +9f8d0 4 222 198 +9f8d4 10 226 198 +9f8e4 8 470 238 +9f8ec 4 64 239 +9f8f0 4 355 217 +9f8f4 8 74 239 +9f8fc 10 74 239 +9f90c 8 472 238 +9f914 4 400 238 +9f918 1c 304 238 +9f934 4 306 238 +9f938 10 307 238 +9f948 4 64 213 +9f94c 4 67 213 +9f950 4 64 213 +9f954 8 107 244 +9f95c 10 106 244 +9f96c 4 107 244 +9f970 c 106 244 +9f97c 4 101 206 +9f980 4 107 244 +9f984 4 64 239 +9f988 c 96 239 +9f994 8 97 239 +9f99c 8 319 202 +9f9a4 4 97 239 +9f9a8 4 135 223 +9f9ac 8 161 202 +9f9b4 4 161 202 +9f9b8 4 479 238 +9f9bc 4 164 239 +9f9c0 4 160 239 +9f9c4 4 165 239 +9f9c8 14 452 198 +9f9dc 8 342 198 +9f9e4 10 352 198 +9f9f4 18 497 238 +9fa0c 20 101 207 +9fa2c 34 381 198 +9fa60 4 470 238 +9fa64 4 381 198 +9fa68 4 470 238 +9fa6c 4 64 239 +9fa70 4 355 217 +9fa74 8 74 239 +9fa7c 10 74 239 +9fa8c c 472 238 +9fa98 4 107 244 +9fa9c 4 232 247 +9faa0 c 107 244 +9faac 10 106 244 +9fabc 4 101 206 +9fac0 4 485 238 +9fac4 4 452 198 +9fac8 8 485 238 +9fad0 10 452 198 +9fae0 1c 348 198 +9fafc 28 313 198 +9fb24 4 470 238 +9fb28 4 313 198 +9fb2c 4 470 238 +9fb30 4 64 239 +9fb34 4 355 217 +9fb38 8 74 239 +9fb40 10 74 239 +9fb50 8 472 238 +9fb58 4 400 238 +9fb5c 1c 304 238 +9fb78 4 306 238 +9fb7c 10 307 238 +9fb8c 4 64 213 +9fb90 4 67 213 +9fb94 4 64 213 +9fb98 8 107 244 +9fba0 10 106 244 +9fbb0 4 107 244 +9fbb4 c 106 244 +9fbc0 4 101 206 +9fbc4 4 107 244 +9fbc8 4 64 239 +9fbcc c 96 239 +9fbd8 8 97 239 +9fbe0 8 319 202 +9fbe8 4 97 239 +9fbec 4 135 223 +9fbf0 8 161 202 +9fbf8 4 161 202 +9fbfc 4 165 239 +9fc00 4 479 238 +9fc04 4 164 239 +9fc08 4 160 239 +9fc0c 14 452 198 +9fc20 8 243 198 +9fc28 18 243 198 +9fc40 4 244 198 +9fc44 4 244 198 +9fc48 8 244 198 +9fc50 4 64 239 +9fc54 4 355 217 +9fc58 8 74 239 +9fc60 10 74 239 +9fc70 c 472 238 +9fc7c 4 107 244 +9fc80 4 232 247 +9fc84 c 107 244 +9fc90 10 106 244 +9fca0 4 485 238 +9fca4 4 101 206 +9fca8 c 485 238 +9fcb4 8 239 198 +9fcbc 4 305 198 +9fcc0 1c 304 198 +9fcdc 4 230 198 +9fce0 10 234 198 +9fcf0 8 470 238 +9fcf8 4 64 239 +9fcfc 4 355 217 +9fd00 8 74 239 +9fd08 10 74 239 +9fd18 c 472 238 +9fd24 4 482 238 +9fd28 4 232 247 +9fd2c c 107 244 +9fd38 10 106 244 +9fd48 4 101 206 +9fd4c 10 485 238 +9fd5c 18 318 198 +9fd74 4 470 238 +9fd78 4 318 198 +9fd7c 4 470 238 +9fd80 4 64 239 +9fd84 4 355 217 +9fd88 8 74 239 +9fd90 10 74 239 +9fda0 8 472 238 +9fda8 4 400 238 +9fdac 1c 304 238 +9fdc8 4 306 238 +9fdcc 10 307 238 +9fddc 4 64 213 +9fde0 4 67 213 +9fde4 4 64 213 +9fde8 8 134 223 +9fdf0 10 311 202 +9fe00 1c 309 198 +9fe1c 4 299 198 +9fe20 c 299 198 +9fe2c 4 299 198 +9fe30 4 299 198 +9fe34 4 299 198 +9fe38 4 297 198 +9fe3c c 299 198 +9fe48 4 297 198 +9fe4c 4 299 198 +9fe50 4 297 198 +9fe54 4 299 198 +9fe58 4 297 198 +9fe5c 4 470 238 +9fe60 4 297 198 +9fe64 8 470 238 +9fe6c 40 287 198 +9feac 4 470 238 +9feb0 4 287 198 +9feb4 8 470 238 +9febc 18 374 198 +9fed4 18 374 198 +9feec 4 64 239 +9fef0 c 96 239 +9fefc 8 97 239 +9ff04 8 161 202 +9ff0c 4 161 202 +9ff10 4 375 198 +9ff14 8 282 198 +9ff1c 18 282 198 +9ff34 4 283 198 +9ff38 4 283 198 +9ff3c 8 283 198 +9ff44 4 64 239 +9ff48 4 355 217 +9ff4c 8 74 239 +9ff54 10 74 239 +9ff64 8 472 238 +9ff6c 4 400 238 +9ff70 1c 304 238 +9ff8c 4 306 238 +9ff90 10 307 238 +9ffa0 4 64 213 +9ffa4 4 67 213 +9ffa8 4 64 213 +9ffac 8 107 244 +9ffb4 10 106 244 +9ffc4 4 107 244 +9ffc8 c 106 244 +9ffd4 4 107 244 +9ffd8 4 64 239 +9ffdc 4 101 206 +9ffe0 c 96 239 +9ffec 18 366 198 +a0004 1c 366 198 +a0020 8 258 198 +a0028 8 258 198 +a0030 8 258 198 +a0038 c 258 198 +a0044 c 258 198 +a0050 4 258 198 +a0054 8 258 198 +a005c 8 258 198 +a0064 20 259 198 +a0084 10 259 198 +a0094 8 253 198 +a009c 18 253 198 +a00b4 4 254 198 +a00b8 4 254 198 +a00bc 8 254 198 +a00c4 8 274 198 +a00cc 8 394 198 +a00d4 4 393 198 +a00d8 20 194 198 +a00f8 8 395 198 +a0100 8 393 198 +a0108 8 401 198 +a0110 14 401 198 +a0124 18 401 198 +a013c 4 401 198 +a0140 20 194 198 +a0160 8 402 198 +a0168 4 404 198 +a016c 10 409 198 +a017c 4 411 198 +a0180 4 420 198 +a0184 1c 411 198 +a01a0 8 273 198 +a01a8 18 273 198 +a01c0 4 274 198 +a01c4 4 274 198 +a01c8 8 274 198 +a01d0 8 274 198 +a01d8 4 338 198 +a01dc 8 497 238 +a01e4 8 338 198 +a01ec 10 497 238 +a01fc 8 268 198 +a0204 1c 268 198 +a0220 4 269 198 +a0224 4 269 198 +a0228 8 269 198 +a0230 8 274 198 +a0238 28 357 198 +a0260 4 64 239 +a0264 8 74 239 +a026c 10 74 239 +a027c c 472 238 +a0288 4 232 247 +a028c 4 483 238 +a0290 c 106 244 +a029c 4 101 206 +a02a0 10 485 238 +a02b0 c 352 198 +a02bc 14 263 198 +a02d0 c 305 198 +a02dc 4 386 198 +a02e0 4 387 198 +a02e4 8 386 198 +a02ec c 420 198 +a02f8 4 470 238 +a02fc 4 420 198 +a0300 4 470 238 +a0304 4 64 239 +a0308 4 355 217 +a030c 8 74 239 +a0314 10 74 239 +a0324 8 472 238 +a032c 4 400 238 +a0330 1c 304 238 +a034c 4 306 238 +a0350 10 307 238 +a0360 4 64 213 +a0364 4 67 213 +a0368 4 64 213 +a036c 10 107 244 +a037c 10 234 198 +a038c 10 226 198 +a039c 24 101 207 +a03c0 18 370 198 +a03d8 1c 370 198 +a03f4 30 278 198 +a0424 8 470 238 +a042c 4 64 239 +a0430 4 355 217 +a0434 8 74 239 +a043c 10 74 239 +a044c 8 472 238 +a0454 4 400 238 +a0458 1c 304 238 +a0474 4 306 238 +a0478 10 307 238 +a0488 4 64 213 +a048c 4 67 213 +a0490 4 64 213 +a0494 10 107 244 +a04a4 14 292 198 +a04b8 4 470 238 +a04bc 4 292 198 +a04c0 8 470 238 +a04c8 10 101 207 +a04d8 18 282 198 +a04f0 4 283 198 +a04f4 4 283 198 +a04f8 8 283 198 +a0500 8 283 198 +a0508 4 400 238 +a050c 1c 304 238 +a0528 4 306 238 +a052c 10 307 238 +a053c 4 64 213 +a0540 4 67 213 +a0544 4 64 213 +a0548 8 134 223 +a0550 10 311 202 +a0560 4 400 238 +a0564 1c 304 238 +a0580 4 306 238 +a0584 10 307 238 +a0594 4 64 213 +a0598 4 67 213 +a059c 4 64 213 +a05a0 10 107 244 +a05b0 8 135 223 +a05b8 10 74 239 +a05c8 8 308 238 +a05d0 10 74 239 +a05e0 4 308 238 +a05e4 8 134 223 +a05ec 10 311 202 +a05fc 4 400 238 +a0600 1c 304 238 +a061c 4 306 238 +a0620 10 307 238 +a0630 4 64 213 +a0634 4 67 213 +a0638 4 64 213 +a063c 8 134 223 +a0644 10 311 202 +a0654 c 299 198 +a0660 8 259 198 +a0668 8 135 223 +a0670 10 74 239 +a0680 4 308 238 +a0684 8 134 223 +a068c 10 311 202 +a069c 4 417 198 +a06a0 4 420 198 +a06a4 24 417 198 +a06c8 4 414 198 +a06cc 8 420 198 +a06d4 4 400 238 +a06d8 20 304 238 +a06f8 4 306 238 +a06fc 10 307 238 +a070c 4 64 213 +a0710 4 67 213 +a0714 4 64 213 +a0718 8 107 244 +a0720 10 106 244 +a0730 4 107 244 +a0734 c 106 244 +a0740 4 101 206 +a0744 4 64 239 +a0748 c 96 239 +a0754 8 97 239 +a075c 8 319 202 +a0764 4 97 239 +a0768 4 135 223 +a076c 8 161 202 +a0774 4 161 202 +a0778 4 479 238 +a077c 4 164 239 +a0780 4 160 239 +a0784 8 165 239 +a078c c 258 198 +a0798 1c 268 198 +a07b4 4 269 198 +a07b8 4 269 198 +a07bc 8 269 198 +a07c4 8 274 198 +a07cc 18 273 198 +a07e4 4 274 198 +a07e8 4 274 198 +a07ec 8 274 198 +a07f4 8 274 198 +a07fc 18 253 198 +a0814 4 254 198 +a0818 4 254 198 +a081c 8 254 198 +a0824 8 274 198 +a082c 18 243 198 +a0844 4 244 198 +a0848 4 244 198 +a084c 8 244 198 +a0854 8 274 198 +a085c 8 397 198 +a0864 8 398 198 +a086c 14 398 198 +a0880 18 398 198 +a0898 4 398 198 +a089c 20 194 198 +a08bc 8 195 198 +a08c4 30 74 239 +a08f4 4 308 238 +a08f8 8 134 223 +a0900 10 311 202 +a0910 c 308 238 +a091c 8 134 223 +a0924 10 311 202 +a0934 10 135 223 +a0944 10 74 239 +a0954 4 308 238 +a0958 8 134 223 +a0960 10 311 202 +a0970 30 74 239 +a09a0 4 308 238 +a09a4 8 134 223 +a09ac 10 311 202 +a09bc c 308 238 +a09c8 8 134 223 +a09d0 10 311 202 +a09e0 8 107 244 +a09e8 8 135 223 +a09f0 c 600 237 +a09fc 8 64 239 +a0a04 c 96 239 +a0a10 18 97 239 +a0a28 8 64 239 +a0a30 c 96 239 +a0a3c 14 97 239 +a0a50 8 64 239 +a0a58 c 96 239 +a0a64 14 97 239 +FUNC a0a78 4 0 std::priv::__write_formatted_time +a0a78 4 457 198 +FUNC a0a7c a8 0 std::priv::__subformat +a0a7c 24 148 198 +a0aa0 8 148 198 +a0aa8 8 152 198 +a0ab0 10 153 198 +a0ac0 4 156 198 +a0ac4 4 155 198 +a0ac8 4 156 198 +a0acc 4 155 198 +a0ad0 4 156 198 +a0ad4 4 154 198 +a0ad8 18 159 198 +a0af0 8 152 198 +a0af8 14 163 198 +a0b0c 10 161 198 +a0b1c 8 157 198 +FUNC a0b24 8 0 std::messages::do_open +a0b24 8 77 220 +FUNC a0b2c 4 0 std::messages::do_close +a0b2c 4 82 220 +FUNC a0b30 8 0 std::messages::do_open +a0b30 8 110 220 +FUNC a0b38 4 0 std::messages::do_close +a0b38 4 115 220 +FUNC a0b3c 14 0 std::messages::~messages +a0b3c 14 74 220 +FUNC a0b50 34 0 std::messages::~messages +a0b50 14 74 220 +a0b64 10 74 220 +a0b74 4 74 220 +a0b78 8 74 220 +a0b80 4 74 220 +FUNC a0b84 14 0 std::messages::~messages +a0b84 14 107 220 +FUNC a0b98 34 0 std::messages::~messages +a0b98 14 107 220 +a0bac 10 107 220 +a0bbc 4 107 220 +a0bc0 8 107 220 +a0bc8 4 107 220 +FUNC a0bcc 44 0 std::messages::messages +a0bcc 4 188 189 +a0bd0 4 86 219 +a0bd4 4 340 241 +a0bd8 8 188 189 +a0be0 4 188 189 +a0be4 4 86 219 +a0be8 4 340 241 +a0bec 4 457 241 +a0bf0 4 340 241 +a0bf4 1c 189 189 +FUNC a0c10 44 0 std::messages::messages +a0c10 4 217 189 +a0c14 4 86 219 +a0c18 4 340 241 +a0c1c 8 217 189 +a0c24 4 217 189 +a0c28 4 86 219 +a0c2c 4 340 241 +a0c30 4 457 241 +a0c34 4 340 241 +a0c38 1c 218 189 +FUNC a0c54 28 0 std::messages::do_get +a0c54 4 78 220 +a0c58 8 80 220 +a0c60 4 78 220 +a0c64 18 80 220 +FUNC a0c7c a8 0 std::basic_string, std::allocator >::basic_string +a0c7c 14 647 237 +a0c90 4 112 239 +a0c94 c 481 202 +a0ca0 8 378 238 +a0ca8 8 379 238 +a0cb0 c 107 244 +a0cbc c 106 244 +a0cc8 4 107 244 +a0ccc 4 380 238 +a0cd0 4 101 206 +a0cd4 10 649 237 +a0ce4 8 64 239 +a0cec c 96 239 +a0cf8 8 97 239 +a0d00 8 161 202 +a0d08 10 161 202 +a0d18 c 135 223 +FUNC a0d24 28 0 std::messages::do_get +a0d24 4 111 220 +a0d28 8 113 220 +a0d30 4 111 220 +a0d34 18 113 220 +FUNC a0d4c 34 0 __popcountdi2 +a0d4c c 846 147 +a0d58 10 847 147 +a0d68 4 849 147 +a0d6c 8 848 147 +a0d74 4 849 147 +a0d78 8 858 147 +FUNC a0d80 aa4 0 __addtf3 +a0d80 1c 36 148 +a0d9c 8 36 148 +a0da4 4 43 148 +a0da8 8 44 148 +a0db0 8 45 148 +a0db8 8 44 148 +a0dc0 4 44 148 +a0dc4 4 46 148 +a0dc8 4 44 148 +a0dcc 4 44 148 +a0dd0 4 45 148 +a0dd4 4 45 148 +a0dd8 4 45 148 +a0ddc 4 44 148 +a0de0 4 44 148 +a0de4 4 45 148 +a0de8 8 45 148 +a0df0 4 46 148 +a0df4 10 46 148 +a0e04 4 46 148 +a0e08 8 46 148 +a0e10 8 46 148 +a0e18 14 46 148 +a0e2c 4 46 148 +a0e30 4 46 148 +a0e34 8 46 148 +a0e3c 8 46 148 +a0e44 8 46 148 +a0e4c c 46 148 +a0e58 4 46 148 +a0e5c 4 46 148 +a0e60 4 46 148 +a0e64 4 46 148 +a0e68 4 46 148 +a0e6c 4 46 148 +a0e70 8 46 148 +a0e78 c 46 148 +a0e84 4 46 148 +a0e88 4 46 148 +a0e8c c 46 148 +a0e98 14 46 148 +a0eac 8 46 148 +a0eb4 4 46 148 +a0eb8 4 46 148 +a0ebc 18 46 148 +a0ed4 8 46 148 +a0edc 4 46 148 +a0ee0 8 46 148 +a0ee8 c 46 148 +a0ef4 8 46 148 +a0efc c 46 148 +a0f08 c 46 148 +a0f14 8 46 148 +a0f1c 8 46 148 +a0f24 14 46 148 +a0f38 4 46 148 +a0f3c 4 46 148 +a0f40 8 46 148 +a0f48 8 46 148 +a0f50 c 46 148 +a0f5c 4 46 148 +a0f60 4 46 148 +a0f64 8 46 148 +a0f6c 4 46 148 +a0f70 4 46 148 +a0f74 8 46 148 +a0f7c c 46 148 +a0f88 4 46 148 +a0f8c 4 46 148 +a0f90 c 46 148 +a0f9c 14 46 148 +a0fb0 8 46 148 +a0fb8 4 46 148 +a0fbc 4 46 148 +a0fc0 c 46 148 +a0fcc 4 45 148 +a0fd0 8 46 148 +a0fd8 18 46 148 +a0ff0 4 46 148 +a0ff4 4 46 148 +a0ff8 8 46 148 +a1000 14 46 148 +a1014 c 46 148 +a1020 8 46 148 +a1028 4 46 148 +a102c 4 46 148 +a1030 4 46 148 +a1034 8 46 148 +a103c c 46 148 +a1048 4 37 148 +a104c 4 46 148 +a1050 8 46 148 +a1058 4 46 148 +a105c 8 46 148 +a1064 8 46 148 +a106c 8 46 148 +a1074 10 46 148 +a1084 4 46 148 +a1088 c 46 148 +a1094 24 46 148 +a10b8 8 37 148 +a10c0 8 46 148 +a10c8 8 46 148 +a10d0 1c 46 148 +a10ec 8 46 148 +a10f4 4 46 148 +a10f8 8 46 148 +a1100 4 46 148 +a1104 2c 46 148 +a1130 8 46 148 +a1138 8 46 148 +a1140 1c 46 148 +a115c c 46 148 +a1168 10 46 148 +a1178 10 46 148 +a1188 4 46 148 +a118c 8 46 148 +a1194 c 46 148 +a11a0 8 46 148 +a11a8 18 46 148 +a11c0 4 46 148 +a11c4 4 46 148 +a11c8 8 46 148 +a11d0 8 46 148 +a11d8 4 46 148 +a11dc 4 44 148 +a11e0 4 46 148 +a11e4 4 44 148 +a11e8 8 46 148 +a11f0 8 46 148 +a11f8 8 46 148 +a1200 c 46 148 +a120c 4 46 148 +a1210 4 46 148 +a1214 4 46 148 +a1218 4 46 148 +a121c 4 46 148 +a1220 4 46 148 +a1224 8 46 148 +a122c c 46 148 +a1238 4 46 148 +a123c 4 46 148 +a1240 c 46 148 +a124c 14 46 148 +a1260 8 46 148 +a1268 4 46 148 +a126c 4 46 148 +a1270 1c 46 148 +a128c 8 46 148 +a1294 4 46 148 +a1298 8 46 148 +a12a0 c 46 148 +a12ac 8 46 148 +a12b4 18 46 148 +a12cc c 46 148 +a12d8 8 46 148 +a12e0 8 46 148 +a12e8 18 46 148 +a1300 4 46 148 +a1304 4 46 148 +a1308 8 46 148 +a1310 8 46 148 +a1318 c 46 148 +a1324 4 46 148 +a1328 4 46 148 +a132c 8 46 148 +a1334 4 46 148 +a1338 4 46 148 +a133c 8 46 148 +a1344 c 46 148 +a1350 4 46 148 +a1354 4 46 148 +a1358 c 46 148 +a1364 14 46 148 +a1378 8 46 148 +a1380 4 46 148 +a1384 4 46 148 +a1388 14 46 148 +a139c c 45 148 +a13a8 18 46 148 +a13c0 4 46 148 +a13c4 4 46 148 +a13c8 4 46 148 +a13cc 14 46 148 +a13e0 4 46 148 +a13e4 18 46 148 +a13fc 18 46 148 +a1414 8 46 148 +a141c 18 46 148 +a1434 c 46 148 +a1440 4 46 148 +a1444 4 46 148 +a1448 4 46 148 +a144c 8 46 148 +a1454 c 46 148 +a1460 4 37 148 +a1464 4 46 148 +a1468 4 46 148 +a146c 4 46 148 +a1470 8 46 148 +a1478 4 46 148 +a147c 30 46 148 +a14ac 4 46 148 +a14b0 10 46 148 +a14c0 4 46 148 +a14c4 c 46 148 +a14d0 c 46 148 +a14dc 18 46 148 +a14f4 1c 46 148 +a1510 c 46 148 +a151c 4 46 148 +a1520 8 46 148 +a1528 4 46 148 +a152c 4 46 148 +a1530 4 46 148 +a1534 4 46 148 +a1538 c 46 148 +a1544 1c 46 148 +a1560 c 46 148 +a156c 10 46 148 +a157c c 46 148 +a1588 c 46 148 +a1594 4 46 148 +a1598 4 46 148 +a159c 8 46 148 +a15a4 4 46 148 +a15a8 4 46 148 +a15ac 8 46 148 +a15b4 c 46 148 +a15c0 4 46 148 +a15c4 4 46 148 +a15c8 c 46 148 +a15d4 18 46 148 +a15ec c 46 148 +a15f8 20 45 148 +a1618 4 47 148 +a161c 1c 47 148 +a1638 4 47 148 +a163c 8 47 148 +a1644 1c 47 148 +a1660 c 47 148 +a166c 8 47 148 +a1674 8 47 148 +a167c 4 47 148 +a1680 14 47 148 +a1694 4 47 148 +a1698 4 47 148 +a169c 4 47 148 +a16a0 4 47 148 +a16a4 4 47 148 +a16a8 14 47 148 +a16bc 4 47 148 +a16c0 4 47 148 +a16c4 4 47 148 +a16c8 8 47 148 +a16d0 18 47 148 +a16e8 c 47 148 +a16f4 8 47 148 +a16fc c 47 148 +a1708 14 47 148 +a171c 4 47 148 +a1720 c 47 148 +a172c 18 47 148 +a1744 8 48 148 +a174c c 48 148 +a1758 4 45 148 +a175c 8 46 148 +a1764 14 45 148 +a1778 10 46 148 +a1788 10 46 148 +a1798 8 46 148 +a17a0 18 46 148 +a17b8 18 46 148 +a17d0 8 37 148 +a17d8 8 44 148 +a17e0 4 46 148 +a17e4 10 47 148 +a17f4 8 47 148 +a17fc 4 46 148 +a1800 4 37 148 +a1804 8 46 148 +a180c 4 46 148 +a1810 4 37 148 +a1814 8 46 148 +a181c 8 51 148 +FUNC a1824 100 0 __eqtf2 +a1824 1c 36 149 +a1840 c 36 149 +a184c 4 42 149 +a1850 c 43 149 +a185c c 44 149 +a1868 c 45 149 +a1874 8 45 149 +a187c 8 45 149 +a1884 8 45 149 +a188c 8 45 149 +a1894 14 45 149 +a18a8 8 45 149 +a18b0 4 45 149 +a18b4 10 45 149 +a18c4 c 46 149 +a18d0 8 46 149 +a18d8 8 46 149 +a18e0 c 46 149 +a18ec c 46 149 +a18f8 4 46 149 +a18fc 4 48 149 +a1900 10 48 149 +a1910 c 46 149 +a191c 8 51 149 +FUNC a1924 13c 0 __getf2 +a1924 18 36 151 +a193c c 36 151 +a1948 4 42 151 +a194c c 43 151 +a1958 8 45 151 +a1960 c 44 151 +a196c 4 45 151 +a1970 c 45 151 +a197c 8 45 151 +a1984 8 45 151 +a198c 4 45 151 +a1990 4 45 151 +a1994 c 45 151 +a19a0 4 45 151 +a19a4 4 45 151 +a19a8 c 45 151 +a19b4 4 45 151 +a19b8 4 45 151 +a19bc 4 45 151 +a19c0 4 44 151 +a19c4 4 45 151 +a19c8 4 45 151 +a19cc 4 43 151 +a19d0 4 45 151 +a19d4 8 45 151 +a19dc 8 45 151 +a19e4 4 45 151 +a19e8 8 45 151 +a19f0 10 45 151 +a1a00 10 45 151 +a1a10 8 45 151 +a1a18 c 45 151 +a1a24 10 45 151 +a1a34 8 45 151 +a1a3c 10 48 151 +a1a4c c 45 151 +a1a58 8 51 151 +FUNC a1a60 6bc 0 __multf3 +a1a60 14 36 152 +a1a74 c 36 152 +a1a80 4 43 152 +a1a84 30 44 152 +a1ab4 4 44 152 +a1ab8 4 44 152 +a1abc 4 44 152 +a1ac0 4 44 152 +a1ac4 8 44 152 +a1acc 8 44 152 +a1ad4 4 44 152 +a1ad8 4 44 152 +a1adc 4 44 152 +a1ae0 4 44 152 +a1ae4 c 44 152 +a1af0 20 44 152 +a1b10 c 44 152 +a1b1c 18 44 152 +a1b34 8 44 152 +a1b3c 18 44 152 +a1b54 10 44 152 +a1b64 4 44 152 +a1b68 4 37 152 +a1b6c 30 45 152 +a1b9c 4 45 152 +a1ba0 4 45 152 +a1ba4 4 45 152 +a1ba8 4 45 152 +a1bac 8 45 152 +a1bb4 8 45 152 +a1bbc 4 45 152 +a1bc0 4 45 152 +a1bc4 4 45 152 +a1bc8 4 45 152 +a1bcc c 45 152 +a1bd8 20 45 152 +a1bf8 c 45 152 +a1c04 14 45 152 +a1c18 8 45 152 +a1c20 18 45 152 +a1c38 10 45 152 +a1c48 4 45 152 +a1c4c 4c 46 152 +a1c98 4 46 152 +a1c9c 8 46 152 +a1ca4 2c 46 152 +a1cd0 8 46 152 +a1cd8 30 46 152 +a1d08 8 46 152 +a1d10 34 46 152 +a1d44 8 46 152 +a1d4c 28 46 152 +a1d74 8 46 152 +a1d7c 54 46 152 +a1dd0 8 46 152 +a1dd8 8 46 152 +a1de0 8 46 152 +a1de8 c 46 152 +a1df4 4 46 152 +a1df8 4 46 152 +a1dfc 4 46 152 +a1e00 4 46 152 +a1e04 4 46 152 +a1e08 8 46 152 +a1e10 c 46 152 +a1e1c 4 46 152 +a1e20 20 46 152 +a1e40 4 46 152 +a1e44 8 46 152 +a1e4c 1c 47 152 +a1e68 14 47 152 +a1e7c 10 47 152 +a1e8c 8 47 152 +a1e94 1c 47 152 +a1eb0 c 47 152 +a1ebc 8 47 152 +a1ec4 8 47 152 +a1ecc 4 47 152 +a1ed0 10 47 152 +a1ee0 4 47 152 +a1ee4 8 47 152 +a1eec 18 47 152 +a1f04 14 47 152 +a1f18 3c 47 152 +a1f54 10 47 152 +a1f64 10 47 152 +a1f74 8 47 152 +a1f7c 10 47 152 +a1f8c 8 47 152 +a1f94 4 47 152 +a1f98 4 47 152 +a1f9c c 47 152 +a1fa8 c 47 152 +a1fb4 4 47 152 +a1fb8 4 47 152 +a1fbc c 47 152 +a1fc8 14 47 152 +a1fdc 8 47 152 +a1fe4 1c 47 152 +a2000 c 47 152 +a200c 8 47 152 +a2014 8 47 152 +a201c 4 47 152 +a2020 10 47 152 +a2030 8 47 152 +a2038 14 47 152 +a204c 8 47 152 +a2054 4 47 152 +a2058 4 47 152 +a205c 8 47 152 +a2064 c 47 152 +a2070 18 47 152 +a2088 28 47 152 +a20b0 4 47 152 +a20b4 8 47 152 +a20bc 8 47 152 +a20c4 10 46 152 +a20d4 4 47 152 +a20d8 8 47 152 +a20e0 c 47 152 +a20ec 18 47 152 +a2104 8 48 152 +a210c 8 48 152 +a2114 8 51 152 +FUNC a211c 64 0 __floatsitf +a211c 4 41 150 +a2120 4 41 150 +a2124 8 41 150 +a212c 4 41 150 +a2130 4 41 150 +a2134 4 41 150 +a2138 4 41 150 +a213c 4 41 150 +a2140 4 41 150 +a2144 4 41 150 +a2148 c 41 150 +a2154 c 41 150 +a2160 1c 42 150 +a217c 4 45 150 +FUNC a2180 28 0 read_uleb128 +a2180 4 137 157 +a2184 4 133 157 +a2188 4 140 157 +a218c 8 141 157 +a2194 4 142 157 +a2198 4 141 157 +a219c 4 144 157 +a21a0 4 146 157 +a21a4 4 148 157 +FUNC a21a8 40 0 read_sleb128 +a21a8 4 159 157 +a21ac 4 155 157 +a21b0 4 162 157 +a21b4 8 163 157 +a21bc 4 164 157 +a21c0 4 163 157 +a21c4 4 166 157 +a21c8 8 169 157 +a21d0 4 169 157 +a21d4 c 170 157 +a21e0 4 172 157 +a21e4 4 174 157 +FUNC a21e8 f0 0 read_encoded_value_with_base +a21e8 18 183 157 +a2200 4 198 157 +a2204 8 183 157 +a220c 4 198 157 +a2210 4 201 157 +a2214 c 202 157 +a2220 24 207 157 +a2244 10 217 157 +a2254 c 225 157 +a2260 4 226 157 +a2264 4 228 157 +a2268 8 231 157 +a2270 4 233 157 +a2274 8 235 157 +a227c 4 237 157 +a2280 8 244 157 +a2288 4 246 157 +a228c 8 248 157 +a2294 4 250 157 +a2298 8 252 157 +a22a0 4 254 157 +a22a4 4 257 157 +a22a8 4 260 157 +a22ac 4 263 157 +a22b0 8 263 157 +a22b8 4 262 157 +a22bc 4 264 157 +a22c0 4 265 157 +a22c4 4 269 157 +a22c8 10 271 157 +FUNC a22d8 114 0 init_dwarf_reg_size_table +a22d8 110 1549 156 +a23e8 4 1550 156 +FUNC a23ec 3c 0 _Unwind_SetSpColumn +a23ec 4 1368 156 +a23f0 8 1367 156 +a23f8 c 1370 156 +a2404 4 1371 156 +a2408 4 218 156 +a240c 4 312 156 +a2410 8 313 156 +a2418 4 1374 156 +a241c 4 314 156 +a2420 8 1378 156 +FUNC a2428 58 0 _Unwind_GetGR +a2428 4 225 156 +a242c 4 235 156 +a2430 4 225 156 +a2434 4 235 156 +a2438 4 235 156 +a243c c 236 156 +a2448 4 218 156 +a244c 4 237 156 +a2450 4 236 156 +a2454 4 239 156 +a2458 c 239 156 +a2464 4 115 156 +a2468 4 240 156 +a246c 8 243 156 +a2474 4 244 156 +a2478 8 250 156 +FUNC a2480 10c 0 uw_install_context_1 +a2480 10 1632 156 +a2490 4 218 156 +a2494 4 1632 156 +a2498 4 1632 156 +a249c 4 301 156 +a24a0 8 301 156 +a24a8 8 1638 156 +a24b0 10 1639 156 +a24c0 4 1632 156 +a24c4 8 1664 156 +a24cc 4 1643 156 +a24d0 4 1644 156 +a24d4 8 1646 156 +a24dc 8 1646 156 +a24e4 8 1647 156 +a24ec 4 1647 156 +a24f0 8 1647 156 +a24f8 10 1651 156 +a2508 8 1654 156 +a2510 8 1663 156 +a2518 10 1663 156 +a2528 c 1664 156 +a2534 4 1641 156 +a2538 8 1641 156 +a2540 4 218 156 +a2544 4 301 156 +a2548 4 301 156 +a254c 4 1682 156 +a2550 4 301 156 +a2554 4 1670 156 +a2558 4 1682 156 +a255c 4 1670 156 +a2560 c 255 156 +a256c 10 1678 156 +a257c 10 1683 156 +FUNC a258c 8 0 _Unwind_GetCFA +a258c 8 264 156 +FUNC a2594 58 0 _Unwind_SetGR +a2594 4 270 156 +a2598 4 275 156 +a259c 4 270 156 +a25a0 4 275 156 +a25a4 4 275 156 +a25a8 c 276 156 +a25b4 4 218 156 +a25b8 4 276 156 +a25bc 4 278 156 +a25c0 c 278 156 +a25cc 4 280 156 +a25d0 4 281 156 +a25d4 4 286 156 +a25d8 4 284 156 +a25dc 4 286 156 +a25e0 4 287 156 +a25e4 8 293 156 +FUNC a25ec 8 0 _Unwind_GetIP +a25ec 8 348 156 +FUNC a25f4 14 0 _Unwind_GetIPInfo +a25f4 4 202 156 +a25f8 4 358 156 +a25fc 4 202 156 +a2600 4 356 156 +a2604 4 358 156 +FUNC a2608 8 0 _Unwind_SetIP +a2608 4 365 156 +a260c 4 366 156 +FUNC a2610 8 0 _Unwind_GetLanguageSpecificData +a2610 8 372 156 +FUNC a2618 8 0 _Unwind_GetRegionStart +a2618 8 378 156 +FUNC a2620 28 0 _Unwind_FindEnclosingFunction +a2620 4 382 156 +a2624 4 384 156 +a2628 4 382 156 +a262c 8 384 156 +a2634 4 386 156 +a2638 10 389 156 +FUNC a2648 8 0 _Unwind_GetDataRelBase +a2648 8 396 156 +FUNC a2650 8 0 _Unwind_GetTextRelBase +a2650 8 402 156 +FUNC a2658 78 0 base_of_encoded_value +a2658 c 102 157 +a2664 4 103 157 +a2668 4 102 157 +a266c 4 103 157 +a2670 38 106 157 +a26a8 4 121 157 +a26ac 4 116 157 +a26b0 4 121 157 +a26b4 4 114 157 +a26b8 4 121 157 +a26bc 4 118 157 +a26c0 4 120 157 +a26c4 c 121 157 +FUNC a26d0 4f8 0 execute_cfa_program +a26d0 1c 942 156 +a26ec 4 985 156 +a26f0 c 942 156 +a26fc 4 946 156 +a2700 4 943 156 +a2704 4 985 156 +a2708 4 1209 156 +a270c 4 1210 156 +a2710 4 1215 156 +a2714 4 1169 156 +a2718 8 957 156 +a2720 4 202 156 +a2724 14 958 156 +a2738 8 960 156 +a2740 c 964 156 +a274c 14 965 156 +a2760 8 966 156 +a2768 4 968 156 +a276c 4 969 156 +a2770 8 968 156 +a2778 8 978 156 +a2780 10 983 156 +a2790 18 985 156 +a27a8 4 991 156 +a27ac 14 282 157 +a27c0 18 282 157 +a27d8 8 993 156 +a27e0 4 995 156 +a27e4 4 998 156 +a27e8 4 999 156 +a27ec c 998 156 +a27f8 4 1000 156 +a27fc 4 1002 156 +a2800 4 1003 156 +a2804 c 1002 156 +a2810 4 1004 156 +a2814 4 1006 156 +a2818 4 1007 156 +a281c c 1006 156 +a2828 4 1008 156 +a282c c 1011 156 +a2838 c 1012 156 +a2844 c 1013 156 +a2850 10 1032 156 +a2860 4 1033 156 +a2864 8 1034 156 +a286c c 1035 156 +a2878 10 1039 156 +a2888 4 1040 156 +a288c 8 1041 156 +a2894 10 1042 156 +a28a4 c 1051 156 +a28b0 c 1052 156 +a28bc 4 1053 156 +a28c0 c 1054 156 +a28cc c 1056 156 +a28d8 8 1057 156 +a28e0 8 1065 156 +a28e8 8 1068 156 +a28f0 8 1071 156 +a28f8 10 1073 156 +a2908 4 1074 156 +a290c 4 1076 156 +a2910 4 1080 156 +a2914 14 1081 156 +a2928 8 1082 156 +a2930 8 1085 156 +a2938 c 1088 156 +a2944 8 1089 156 +a294c c 1090 156 +a2958 c 1091 156 +a2964 10 1096 156 +a2974 8 1097 156 +a297c 4 1098 156 +a2980 4 1099 156 +a2984 10 1102 156 +a2994 8 1103 156 +a299c 4 1109 156 +a29a0 4 1108 156 +a29a4 4 1109 156 +a29a8 8 1110 156 +a29b0 c 1115 156 +a29bc 4 1116 156 +a29c0 c 1117 156 +a29cc c 1119 156 +a29d8 c 1128 156 +a29e4 c 1129 156 +a29f0 c 1130 156 +a29fc 4 1131 156 +a2a00 10 1132 156 +a2a10 8 1134 156 +a2a18 c 1140 156 +a2a24 8 1141 156 +a2a2c 8 1142 156 +a2a34 4 1144 156 +a2a38 4 1142 156 +a2a3c 10 1145 156 +a2a4c 4 1146 156 +a2a50 14 1149 156 +a2a64 c 1156 156 +a2a70 c 1157 156 +a2a7c c 1158 156 +a2a88 c 1168 156 +a2a94 c 1169 156 +a2aa0 c 1170 156 +a2aac 4 1171 156 +a2ab0 c 1172 156 +a2abc 10 1174 156 +a2acc c 1180 156 +a2ad8 4 1181 156 +a2adc c 1182 156 +a2ae8 c 1184 156 +a2af4 4 1185 156 +a2af8 8 1187 156 +a2b00 8 1188 156 +a2b08 4 1189 156 +a2b0c 10 1194 156 +a2b1c 4 1196 156 +a2b20 4 1194 156 +a2b24 4 1197 156 +a2b28 10 1194 156 +a2b38 10 1202 156 +a2b48 8 1203 156 +a2b50 4 1204 156 +a2b54 c 1209 156 +a2b60 c 1210 156 +a2b6c c 1211 156 +a2b78 4 1212 156 +a2b7c c 1213 156 +a2b88 8 1216 156 +a2b90 4 1215 156 +a2b94 8 1216 156 +a2b9c c 1221 156 +a2ba8 20 1224 156 +FUNC a2bc8 41c 0 uw_frame_state_for +a2bc8 4 1233 156 +a2bcc 4 1238 156 +a2bd0 14 1233 156 +a2be4 8 1238 156 +a2bec c 1233 156 +a2bf8 4 1238 156 +a2bfc 4 1239 156 +a2c00 4 1242 156 +a2c04 4 1240 156 +a2c08 4 1242 156 +a2c0c 8 1243 156 +a2c14 8 202 156 +a2c1c 4 1245 156 +a2c20 10 1245 156 +a2c30 4 1247 156 +a2c34 4 60 145 +a2c38 14 71 145 +a2c4c 18 71 145 +a2c64 4 76 145 +a2c68 8 84 145 +a2c70 c 85 145 +a2c7c c 83 145 +a2c88 4 85 145 +a2c8c 4 89 145 +a2c90 8 90 145 +a2c98 c 87 145 +a2ca4 c 100 145 +a2cb0 8 115 145 +a2cb8 4 101 145 +a2cbc 4 100 145 +a2cc0 18 105 145 +a2cd8 c 115 145 +a2ce4 4 133 145 +a2ce8 8 111 145 +a2cf0 c 102 145 +a2cfc 4 143 145 +a2d00 4 142 145 +a2d04 4 143 145 +a2d08 4 145 145 +a2d0c 4 143 145 +a2d10 8 147 145 +a2d18 4 149 145 +a2d1c 4 142 145 +a2d20 4 149 145 +a2d24 4 151 145 +a2d28 4 148 145 +a2d2c 8 151 145 +a2d34 4 1259 156 +a2d38 4 157 155 +a2d3c 4 1259 156 +a2d40 8 157 155 +a2d48 4 415 156 +a2d4c c 416 156 +a2d58 4 423 156 +a2d5c 4 416 156 +a2d60 8 423 156 +a2d68 c 423 156 +a2d74 4 173 156 +a2d78 4 427 156 +a2d7c 4 425 156 +a2d80 c 433 156 +a2d8c c 435 156 +a2d98 8 435 156 +a2da0 4 437 156 +a2da4 c 441 156 +a2db0 8 442 156 +a2db8 c 443 156 +a2dc4 8 444 156 +a2dcc c 445 156 +a2dd8 c 446 156 +a2de4 8 449 156 +a2dec 8 450 156 +a2df4 8 452 156 +a2dfc 4 417 156 +a2e00 c 457 156 +a2e0c 4 459 156 +a2e10 4 463 156 +a2e14 4 459 156 +a2e18 4 460 156 +a2e1c 8 462 156 +a2e24 8 460 156 +a2e2c 4 496 156 +a2e30 4 282 157 +a2e34 8 467 156 +a2e3c 8 470 156 +a2e44 c 472 156 +a2e50 8 477 156 +a2e58 10 479 156 +a2e68 8 484 156 +a2e70 4 488 156 +a2e74 4 282 157 +a2e78 4 488 156 +a2e7c c 282 157 +a2e88 10 282 157 +a2e98 c 489 156 +a2ea4 8 494 156 +a2eac c 496 156 +a2eb8 c 506 156 +a2ec4 4 494 156 +a2ec8 4 1263 156 +a2ecc 4 163 155 +a2ed0 8 1269 156 +a2ed8 4 163 155 +a2edc 8 1269 156 +a2ee4 4 1273 156 +a2ee8 8 74 157 +a2ef0 24 77 157 +a2f14 8 82 157 +a2f1c 8 84 157 +a2f24 4 88 157 +a2f28 8 75 157 +a2f30 4 80 157 +a2f34 4 1275 156 +a2f38 8 1273 156 +a2f40 4 1274 156 +a2f44 4 1273 156 +a2f48 4 1275 156 +a2f4c c 1278 156 +a2f58 4 1279 156 +a2f5c 4 1278 156 +a2f60 4 1279 156 +a2f64 c 1281 156 +a2f70 10 282 157 +a2f80 14 282 157 +a2f94 8 1286 156 +a2f9c 4 163 155 +a2fa0 4 1291 156 +a2fa4 8 1293 156 +a2fac 4 163 155 +a2fb0 c 1293 156 +a2fbc 8 1295 156 +a2fc4 4 1265 156 +a2fc8 1c 1296 156 +FUNC a2fe4 598 0 execute_stack_op +a2fe4 14 516 156 +a2ff8 4 520 156 +a2ffc 8 516 156 +a3004 4 520 156 +a3008 8 516 156 +a3010 4 836 156 +a3014 4 770 156 +a3018 c 516 156 +a3024 4 521 156 +a3028 4 836 156 +a302c 4 801 156 +a3030 4 770 156 +a3034 4 656 156 +a3038 c 523 156 +a3044 8 525 156 +a304c 3c 530 156 +a3088 4 568 156 +a308c 4 569 156 +a3090 4 570 156 +a3094 14 530 156 +a30a8 4 585 156 +a30ac 4 587 156 +a30b0 1c 530 156 +a30cc 8 597 156 +a30d4 c0 530 156 +a3194 c 653 156 +a31a0 14 530 156 +a31b4 8 696 156 +a31bc 4 697 156 +a31c0 4 696 156 +a31c4 c 697 156 +a31d0 c 698 156 +a31dc 10 530 156 +a31ec 4 575 156 +a31f0 4 282 157 +a31f4 4 575 156 +a31f8 c 282 157 +a3204 18 282 157 +a321c 4 564 156 +a3220 4 565 156 +a3224 4 581 156 +a3228 4 583 156 +a322c 8 589 156 +a3234 4 593 156 +a3238 4 594 156 +a323c 4 595 156 +a3240 4 601 156 +a3244 4 602 156 +a3248 4 603 156 +a324c 4 197 156 +a3250 4 611 156 +a3254 10 613 156 +a3264 4 614 156 +a3268 4 615 156 +a326c 14 617 156 +a3280 4 618 156 +a3284 4 619 156 +a3288 10 656 156 +a3298 c 657 156 +a32a4 4 658 156 +a32a8 14 692 156 +a32bc 8 693 156 +a32c4 4 698 156 +a32c8 8 698 156 +a32d0 4 699 156 +a32d4 4 702 156 +a32d8 8 703 156 +a32e0 4 707 156 +a32e4 4 708 156 +a32e8 4 709 156 +a32ec 4 713 156 +a32f0 c 712 156 +a32fc c 713 156 +a3308 8 714 156 +a3310 4 715 156 +a3314 8 718 156 +a331c 8 719 156 +a3324 4 720 156 +a3328 8 725 156 +a3330 4 727 156 +a3334 4 726 156 +a3338 4 727 156 +a333c 4 728 156 +a3340 4 729 156 +a3344 8 736 156 +a334c 4 739 156 +a3350 4 738 156 +a3354 4 737 156 +a3358 4 739 156 +a335c 4 740 156 +a3360 4 741 156 +a3364 4 742 156 +a3368 4 743 156 +a336c 4 753 156 +a3370 4 754 156 +a3374 4 758 156 +a3378 4 756 156 +a337c 3c 758 156 +a33b8 4 798 156 +a33bc 4 799 156 +a33c0 24 770 156 +a33e4 4 773 156 +a33e8 4 774 156 +a33ec 4 776 156 +a33f0 4 777 156 +a33f4 4 779 156 +a33f8 4 780 156 +a33fc 4 795 156 +a3400 4 796 156 +a3404 10 801 156 +a3414 8 802 156 +a341c 4 803 156 +a3420 8 830 156 +a3428 4 831 156 +a342c 4 836 156 +a3430 4 834 156 +a3434 4 836 156 +a3438 4 833 156 +a343c 4 834 156 +a3440 14 836 156 +a3454 8 839 156 +a345c 8 842 156 +a3464 8 845 156 +a346c c 848 156 +a3478 8 851 156 +a3480 8 854 156 +a3488 8 857 156 +a3490 8 860 156 +a3498 8 863 156 +a34a0 8 866 156 +a34a8 8 869 156 +a34b0 c 872 156 +a34bc c 875 156 +a34c8 c 878 156 +a34d4 c 881 156 +a34e0 8 884 156 +a34e8 4 831 156 +a34ec 4 885 156 +a34f0 c 887 156 +a34fc 4 899 156 +a3500 4 898 156 +a3504 4 899 156 +a3508 4 900 156 +a350c 4 903 156 +a3510 4 904 156 +a3514 4 907 156 +a3518 4 185 156 +a351c 4 909 156 +a3520 4 908 156 +a3524 c 909 156 +a3530 4 916 156 +a3534 8 920 156 +a353c 10 921 156 +a354c 4 927 156 +a3550 4 928 156 +a3554 28 930 156 +FUNC a357c 224 0 uw_update_context_1 +a357c 4 1382 156 +a3580 4 1383 156 +a3584 14 1382 156 +a3598 4 1383 156 +a359c 4 1382 156 +a35a0 4 1383 156 +a35a4 4 1382 156 +a35a8 4 1383 156 +a35ac c 1382 156 +a35b8 4 1383 156 +a35bc 8 301 156 +a35c4 8 301 156 +a35cc 8 1405 156 +a35d4 10 1406 156 +a35e4 4 218 156 +a35e8 4 312 156 +a35ec 4 313 156 +a35f0 4 1411 156 +a35f4 4 314 156 +a35f8 10 1411 156 +a3608 10 1423 156 +a3618 1c 1424 156 +a3634 c 255 156 +a3640 8 1415 156 +a3648 4 1436 156 +a364c 4 1432 156 +a3650 c 1436 156 +a365c 4 1435 156 +a3660 4 1436 156 +a3664 4 1483 156 +a3668 4 326 156 +a366c 4 328 156 +a3670 24 1436 156 +a3694 c 1443 156 +a36a0 4 1448 156 +a36a4 4 339 156 +a36a8 8 1448 156 +a36b0 8 1449 156 +a36b8 10 326 156 +a36c8 4 326 156 +a36cc 4 218 156 +a36d0 4 303 156 +a36d4 4 312 156 +a36d8 4 313 156 +a36dc 8 314 156 +a36e4 c 1464 156 +a36f0 14 1465 156 +a3704 4 218 156 +a3708 4 312 156 +a370c 8 313 156 +a3714 c 1474 156 +a3720 c 1483 156 +a372c 18 1484 156 +a3744 4 328 156 +a3748 4 329 156 +a374c 8 1435 156 +a3754 10 1435 156 +a3764 4 208 156 +a3768 14 209 156 +a377c 24 1496 156 +FUNC a37a0 cc 0 uw_init_context_1 +a37a0 1c 1555 156 +a37bc 8 1555 156 +a37c4 10 1561 156 +a37d4 4 1562 156 +a37d8 4 1564 156 +a37dc 4 1566 156 +a37e0 4 1564 156 +a37e4 c 1566 156 +a37f0 4 1567 156 +a37f4 4 1567 156 +a37f8 18 712 144 +a3810 4 1572 156 +a3814 8 1573 156 +a381c 4 1574 156 +a3820 10 1582 156 +a3830 4 1585 156 +a3834 8 1583 156 +a383c 4 1584 156 +a3840 4 1587 156 +a3844 4 1584 156 +a3848 8 1587 156 +a3850 4 1592 156 +a3854 18 1593 156 +FUNC a386c 4c 0 uw_update_context +a386c c 1505 156 +a3878 8 1505 156 +a3880 4 1506 156 +a3884 14 1514 156 +a3898 8 1518 156 +a38a0 8 255 156 +a38a8 4 1522 156 +a38ac c 1524 156 +FUNC a38b8 c0 0 _Unwind_RaiseException_Phase2 +a38b8 18 40 158 +a38d0 8 40 158 +a38d8 4 48 158 +a38dc 4 52 158 +a38e0 10 48 158 +a38f0 8 1692 156 +a38f8 4 202 156 +a38fc 4 1692 156 +a3900 4 52 158 +a3904 8 52 158 +a390c 4 54 158 +a3910 8 60 158 +a3918 4 71 158 +a391c 4 71 158 +a3920 18 62 158 +a3938 8 64 158 +a3940 c 66 158 +a394c c 73 158 +a3958 4 74 158 +a395c 4 57 158 +a3960 18 77 158 +FUNC a3978 ec 0 _Unwind_ForcedUnwind_Phase2 +a3978 10 144 158 +a3988 4 145 158 +a398c 4 146 158 +a3990 c 144 158 +a399c 8 144 158 +a39a4 4 155 158 +a39a8 8 162 158 +a39b0 c 155 158 +a39bc 4 156 158 +a39c0 4 155 158 +a39c4 8 156 158 +a39cc 4 162 158 +a39d0 1c 163 158 +a39ec 4 165 158 +a39f0 8 170 158 +a39f8 8 173 158 +a3a00 c 1529 156 +a3a0c 4 186 158 +a3a10 18 175 158 +a3a28 4 177 158 +a3a2c 4 175 158 +a3a30 4 177 158 +a3a34 8 179 158 +a3a3c 8 157 158 +a3a44 4 188 158 +a3a48 1c 189 158 +FUNC a3a64 f4 0 __frame_state_for +a3a64 4 1318 156 +a3a68 4 1323 156 +a3a6c c 1318 156 +a3a78 4 1323 156 +a3a7c 4 1318 156 +a3a80 8 1318 156 +a3a88 8 1323 156 +a3a90 4 1326 156 +a3a94 4 1323 156 +a3a98 4 1326 156 +a3a9c 4 1325 156 +a3aa0 4 1328 156 +a3aa4 4 1325 156 +a3aa8 c 1328 156 +a3ab4 4 1329 156 +a3ab8 4 1328 156 +a3abc 1c 1333 156 +a3ad8 8 1338 156 +a3ae0 10 1339 156 +a3af0 8 1345 156 +a3af8 4 1346 156 +a3afc c 1348 156 +a3b08 c 1336 156 +a3b14 4 1353 156 +a3b18 4 1359 156 +a3b1c 4 1353 156 +a3b20 8 1354 156 +a3b28 8 1355 156 +a3b30 8 1356 156 +a3b38 8 1357 156 +a3b40 18 1360 156 +FUNC a3b58 4 0 _Unwind_DebugHook +a3b58 4 1613 156 +FUNC a3b5c 188 0 _Unwind_RaiseException +a3b5c 14 83 158 +a3b70 4 88 158 +a3b74 18 83 158 +a3b8c 8 88 158 +a3b94 4 83 158 +a3b98 4 88 158 +a3b9c c 83 158 +a3ba8 4 89 158 +a3bac 4 88 158 +a3bb0 c 89 158 +a3bbc 4 99 158 +a3bc0 4 89 158 +a3bc4 c 99 158 +a3bd0 8 101 158 +a3bd8 4 105 158 +a3bdc 8 108 158 +a3be4 8 111 158 +a3bec c 122 158 +a3bf8 4 123 158 +a3bfc 18 113 158 +a3c14 8 115 158 +a3c1c c 117 158 +a3c28 8 103 158 +a3c30 4 127 158 +a3c34 8 1692 156 +a3c3c 4 202 156 +a3c40 4 130 158 +a3c44 4 1692 156 +a3c48 4 130 158 +a3c4c 4 128 158 +a3c50 8 130 158 +a3c58 c 131 158 +a3c64 c 132 158 +a3c70 c 135 158 +a3c7c 4 135 158 +a3c80 4 135 158 +a3c84 c 135 158 +a3c90 54 136 158 +FUNC a3ce4 f4 0 _Unwind_ForcedUnwind +a3ce4 14 197 158 +a3cf8 4 201 158 +a3cfc 28 197 158 +a3d24 c 201 158 +a3d30 4 202 158 +a3d34 8 197 158 +a3d3c 4 201 158 +a3d40 10 202 158 +a3d50 4 204 158 +a3d54 4 205 158 +a3d58 c 207 158 +a3d64 4 208 158 +a3d68 4 212 158 +a3d6c 4 208 158 +a3d70 c 211 158 +a3d7c 4 211 158 +a3d80 4 211 158 +a3d84 c 211 158 +a3d90 48 212 158 +FUNC a3dd8 fc 0 _Unwind_Resume +a3dd8 14 220 158 +a3dec 4 224 158 +a3df0 14 220 158 +a3e04 8 224 158 +a3e0c 8 220 158 +a3e14 4 224 158 +a3e18 c 220 158 +a3e24 4 225 158 +a3e28 4 224 158 +a3e2c 10 225 158 +a3e3c 8 229 158 +a3e44 10 230 158 +a3e54 c 232 158 +a3e60 8 234 158 +a3e68 4 234 158 +a3e6c c 236 158 +a3e78 4 236 158 +a3e7c 4 236 158 +a3e80 c 236 158 +a3e8c 48 237 158 +FUNC a3ed4 fc 0 _Unwind_Resume_or_Rethrow +a3ed4 10 245 158 +a3ee4 4 251 158 +a3ee8 2c 245 158 +a3f14 4 245 158 +a3f18 8 251 158 +a3f20 4 252 158 +a3f24 8 262 158 +a3f2c c 254 158 +a3f38 4 255 158 +a3f3c 4 254 158 +a3f40 10 255 158 +a3f50 c 257 158 +a3f5c 8 259 158 +a3f64 4 259 158 +a3f68 c 261 158 +a3f74 4 261 158 +a3f78 4 261 158 +a3f7c c 261 158 +a3f88 48 262 158 +FUNC a3fd0 24 0 _Unwind_DeleteException +a3fd0 8 269 158 +a3fd8 c 270 158 +a3fe4 8 271 158 +a3fec 8 272 158 +FUNC a3ff4 d0 0 _Unwind_Backtrace +a3ff4 4 279 158 +a3ff8 4 283 158 +a3ffc 10 279 158 +a400c 4 283 158 +a4010 1c 279 158 +a402c 8 283 158 +a4034 4 290 158 +a4038 8 279 158 +a4040 4 283 158 +a4044 c 290 158 +a4050 4 291 158 +a4054 4 290 158 +a4058 8 291 158 +a4060 c 295 158 +a406c 4 295 158 +a4070 8 299 158 +a4078 c 303 158 +a4084 4 304 158 +a4088 8 292 158 +a4090 4 306 158 +a4094 30 307 158 +FUNC a40c4 28 0 read_uleb128 +a40c4 4 137 157 +a40c8 4 133 157 +a40cc 4 140 157 +a40d0 8 141 157 +a40d8 4 142 157 +a40dc 4 141 157 +a40e0 4 144 157 +a40e4 4 146 157 +a40e8 4 148 157 +FUNC a40ec 40 0 read_sleb128 +a40ec 4 159 157 +a40f0 4 155 157 +a40f4 4 162 157 +a40f8 8 163 157 +a4100 4 164 157 +a4104 4 163 157 +a4108 4 166 157 +a410c 8 169 157 +a4114 4 169 157 +a4118 c 170 157 +a4124 4 172 157 +a4128 4 174 157 +FUNC a412c 1c 0 fde_unencoded_compare +a412c 4 334 154 +a4130 4 338 154 +a4134 4 335 154 +a4138 8 337 154 +a4140 4 339 154 +a4144 4 342 154 +FUNC a4148 c0 0 frame_downheap +a4148 c 488 154 +a4154 4 491 154 +a4158 c 488 154 +a4164 10 488 154 +a4174 4 491 154 +a4178 8 491 154 +a4180 c 495 154 +a418c 28 495 154 +a41b4 1c 498 154 +a41d0 4 500 154 +a41d4 4 501 154 +a41d8 c 500 154 +a41e4 c 493 154 +a41f0 18 506 154 +FUNC a4208 b4 0 frame_heapsort +a4208 c 514 154 +a4214 4 522 154 +a4218 c 514 154 +a4224 c 514 154 +a4230 4 518 154 +a4234 4 528 154 +a4238 4 528 154 +a423c 4 528 154 +a4240 1c 529 154 +a425c c 534 154 +a4268 8 534 154 +a4270 4 536 154 +a4274 4 537 154 +a4278 4 536 154 +a427c 4 537 154 +a4280 4 536 154 +a4284 4 537 154 +a4288 4 536 154 +a428c 8 537 154 +a4294 8 534 154 +a429c 8 537 154 +a42a4 18 540 154 +FUNC a42bc 60 0 size_of_encoded_value +a42bc 8 73 157 +a42c4 4 74 157 +a42c8 4 73 157 +a42cc 4 74 157 +a42d0 24 77 157 +a42f4 8 82 157 +a42fc 8 84 157 +a4304 4 88 157 +a4308 8 75 157 +a4310 4 80 157 +a4314 8 89 157 +FUNC a431c 60 0 base_from_object +a431c 8 240 154 +a4324 4 241 154 +a4328 4 240 154 +a432c 4 241 154 +a4330 2c 244 154 +a435c 4 256 154 +a4360 8 252 154 +a4368 8 254 154 +a4370 4 249 154 +a4374 8 258 154 +FUNC a437c 60 0 base_from_cb_data +a437c 8 133 153 +a4384 4 134 153 +a4388 4 133 153 +a438c 4 134 153 +a4390 2c 137 153 +a43bc 4 149 153 +a43c0 8 145 153 +a43c8 8 147 153 +a43d0 4 142 153 +a43d4 8 151 153 +FUNC a43dc f0 0 read_encoded_value_with_base +a43dc 18 183 157 +a43f4 4 198 157 +a43f8 8 183 157 +a4400 4 198 157 +a4404 4 201 157 +a4408 c 202 157 +a4414 24 207 157 +a4438 10 217 157 +a4448 c 225 157 +a4454 4 226 157 +a4458 4 228 157 +a445c 8 231 157 +a4464 4 233 157 +a4468 8 235 157 +a4470 4 237 157 +a4474 8 244 157 +a447c 4 246 157 +a4480 8 248 157 +a4488 4 250 157 +a448c 8 252 157 +a4494 4 254 157 +a4498 4 257 157 +a449c 4 260 157 +a44a0 4 263 157 +a44a4 8 263 157 +a44ac 4 262 157 +a44b0 4 264 157 +a44b4 4 265 157 +a44b8 4 269 157 +a44bc 10 271 157 +FUNC a44cc 90 0 fde_single_encoding_compare +a44cc c 346 154 +a44d8 4 349 154 +a44dc c 346 154 +a44e8 c 349 154 +a44f4 4 346 154 +a44f8 4 346 154 +a44fc 8 349 154 +a4504 14 350 154 +a4518 18 351 154 +a4530 4 353 154 +a4534 4 354 154 +a4538 c 353 154 +a4544 4 355 154 +a4548 14 358 154 +FUNC a455c fc 0 get_cie_encoding +a455c c 265 154 +a4568 4 271 154 +a456c 4 265 154 +a4570 c 272 154 +a457c 4 273 154 +a4580 4 272 154 +a4584 8 273 154 +a458c 4 275 154 +a4590 4 276 154 +a4594 8 275 154 +a459c 8 275 154 +a45a4 4 278 154 +a45a8 c 281 154 +a45b4 8 282 154 +a45bc 10 284 154 +a45cc 8 285 154 +a45d4 c 286 154 +a45e0 8 287 154 +a45e8 8 289 154 +a45f0 4 292 154 +a45f4 4 291 154 +a45f8 4 304 154 +a45fc 4 292 154 +a4600 c 296 154 +a460c 8 297 154 +a4614 8 299 154 +a461c 1c 304 154 +a4638 8 307 154 +a4640 4 308 154 +a4644 4 312 154 +a4648 4 313 154 +a464c c 314 154 +FUNC a4658 160 0 linear_search_fdes +a4658 10 799 154 +a4668 4 801 154 +a466c 4 799 154 +a4670 4 801 154 +a4674 4 799 154 +a4678 4 802 154 +a467c c 799 154 +a4688 4 799 154 +a468c 4 801 154 +a4690 4 802 154 +a4694 4 839 154 +a4698 4 802 154 +a469c 4 800 154 +a46a0 4 841 154 +a46a4 4 849 154 +a46a8 8 804 154 +a46b0 8 810 154 +a46b8 c 813 154 +a46c4 8 157 155 +a46cc 8 818 154 +a46d4 c 821 154 +a46e0 c 822 154 +a46ec 4 826 154 +a46f0 4 829 154 +a46f4 4 830 154 +a46f8 4 829 154 +a46fc 4 830 154 +a4700 4 831 154 +a4704 14 857 154 +a4718 8 858 154 +a4720 1c 839 154 +a473c 10 841 154 +a474c 8 847 154 +a4754 4 847 154 +a4758 4 848 154 +a475c 4 851 154 +a4760 4 848 154 +a4764 c 849 154 +a4770 14 853 154 +a4784 14 163 155 +a4798 4 861 154 +a479c 1c 862 154 +FUNC a47b8 10 0 get_fde_encoding +a47b8 8 157 155 +a47c0 8 319 154 +FUNC a47c8 414 0 _Unwind_IteratePhdrCallback +a47c8 4 155 153 +a47cc 4 189 153 +a47d0 10 155 153 +a47e0 4 189 153 +a47e4 4 181 153 +a47e8 4 182 153 +a47ec 4 189 153 +a47f0 4 189 153 +a47f4 4 189 153 +a47f8 1c 198 153 +a4814 10 198 153 +a4824 4 207 153 +a4828 4 187 153 +a482c 4 186 153 +a4830 4 207 153 +a4834 4 207 153 +a4838 14 211 153 +a484c 8 212 153 +a4854 4 219 153 +a4858 4 214 153 +a485c 4 215 153 +a4860 4 219 153 +a4864 4 223 153 +a4868 8 221 153 +a4870 4 222 153 +a4874 8 223 153 +a487c 8 230 153 +a4884 18 232 153 +a489c 4 238 153 +a48a0 14 239 153 +a48b4 4 245 153 +a48b8 8 246 153 +a48c0 4 243 153 +a48c4 4 247 153 +a48c8 4 243 153 +a48cc c 249 153 +a48d8 4 250 153 +a48dc 8 251 153 +a48e4 10 256 153 +a48f4 4 262 153 +a48f8 8 168 153 +a4900 4 180 153 +a4904 4 184 153 +a4908 4 183 153 +a490c c 262 153 +a4918 c 264 153 +a4924 4 266 153 +a4928 4 268 153 +a492c 4 266 153 +a4930 8 268 153 +a4938 24 268 153 +a495c 10 275 153 +a496c 10 283 153 +a497c c 262 153 +a4988 4 287 153 +a498c 8 288 153 +a4994 8 290 153 +a499c 8 295 153 +a49a4 8 297 153 +a49ac c 298 153 +a49b8 4 299 153 +a49bc c 302 153 +a49c8 4 303 153 +a49cc 4 304 153 +a49d0 4 305 153 +a49d4 4 306 153 +a49d8 4 311 153 +a49dc 8 316 153 +a49e4 c 317 153 +a49f0 18 353 153 +a4a08 10 353 153 +a4a18 4 362 153 +a4a1c 4 353 153 +a4a20 8 362 153 +a4a28 c 363 153 +a4a34 14 367 153 +a4a48 14 367 153 +a4a5c 8 372 153 +a4a64 8 374 153 +a4a6c 14 388 153 +a4a80 4 387 153 +a4a84 14 390 153 +a4a98 4 397 153 +a4a9c 8 395 153 +a4aa4 8 397 153 +a4aac 14 398 153 +a4ac0 18 400 153 +a4ad8 10 409 153 +a4ae8 8 410 153 +a4af0 c 411 153 +a4afc 4 413 153 +a4b00 14 412 153 +a4b14 1c 414 153 +a4b30 4 415 153 +a4b34 4 416 153 +a4b38 4 417 153 +a4b3c 8 425 153 +a4b44 8 426 153 +a4b4c 4 429 153 +a4b50 4 427 153 +a4b54 4 428 153 +a4b58 4 430 153 +a4b5c 4 429 153 +a4b60 4 430 153 +a4b64 4 424 153 +a4b68 4 427 153 +a4b6c 4 430 153 +a4b70 4 430 153 +a4b74 4 431 153 +a4b78 4 434 153 +a4b7c 14 436 153 +a4b90 4 438 153 +a4b94 10 436 153 +a4ba4 8 439 153 +a4bac 8 441 153 +a4bb4 10 258 153 +a4bc4 4 406 153 +a4bc8 14 442 153 +FUNC a4bdc 9c 0 fde_mixed_encoding_compare +a4bdc 10 362 154 +a4bec 4 366 154 +a4bf0 4 362 154 +a4bf4 8 362 154 +a4bfc 4 366 154 +a4c00 14 367 154 +a4c14 10 367 154 +a4c24 8 370 154 +a4c2c 14 371 154 +a4c40 10 371 154 +a4c50 4 374 154 +a4c54 4 375 154 +a4c58 c 374 154 +a4c64 4 376 154 +a4c68 10 379 154 +FUNC a4c78 160 0 classify_object_over_fdes +a4c78 c 607 154 +a4c84 4 611 154 +a4c88 10 607 154 +a4c98 8 607 154 +a4ca0 4 610 154 +a4ca4 4 609 154 +a4ca8 4 608 154 +a4cac 4 638 154 +a4cb0 4 647 154 +a4cb4 8 613 154 +a4cbc 8 619 154 +a4cc4 8 157 155 +a4ccc 8 625 154 +a4cd4 8 628 154 +a4cdc 4 629 154 +a4ce0 4 628 154 +a4ce4 4 629 154 +a4ce8 8 630 154 +a4cf0 14 631 154 +a4d04 10 632 154 +a4d14 c 633 154 +a4d20 c 634 154 +a4d2c 14 635 154 +a4d40 18 638 154 +a4d58 8 645 154 +a4d60 4 645 154 +a4d64 4 646 154 +a4d68 4 649 154 +a4d6c 4 646 154 +a4d70 c 647 154 +a4d7c c 651 154 +a4d88 4 655 154 +a4d8c 4 654 154 +a4d90 8 655 154 +a4d98 c 656 154 +a4da4 14 163 155 +a4db8 4 659 154 +a4dbc 1c 660 154 +FUNC a4dd8 134 0 add_fdes +a4dd8 10 664 154 +a4de8 4 666 154 +a4dec 4 664 154 +a4df0 4 666 154 +a4df4 4 664 154 +a4df8 4 667 154 +a4dfc c 664 154 +a4e08 4 666 154 +a4e0c 4 664 154 +a4e10 4 667 154 +a4e14 4 701 154 +a4e18 4 667 154 +a4e1c 4 665 154 +a4e20 4 710 154 +a4e24 8 669 154 +a4e2c c 674 154 +a4e38 8 677 154 +a4e40 8 157 155 +a4e48 8 682 154 +a4e50 c 685 154 +a4e5c c 686 154 +a4e68 4 690 154 +a4e6c c 694 154 +a4e78 18 701 154 +a4e90 8 708 154 +a4e98 4 708 154 +a4e9c 4 709 154 +a4ea0 4 712 154 +a4ea4 4 709 154 +a4ea8 c 710 154 +a4eb4 10 714 154 +a4ec4 4 423 154 +a4ec8 14 424 154 +a4edc 14 163 155 +a4ef0 1c 720 154 +FUNC a4f0c 578 0 search_object +a4f0c 10 956 154 +a4f1c 4 959 154 +a4f20 14 956 154 +a4f34 4 956 154 +a4f38 4 959 154 +a4f3c c 970 154 +a4f48 8 733 154 +a4f50 4 734 154 +a4f54 4 736 154 +a4f58 4 738 154 +a4f5c 8 739 154 +a4f64 8 741 154 +a4f6c 8 742 154 +a4f74 4 755 154 +a4f78 4 754 154 +a4f7c 4 755 154 +a4f80 14 756 154 +a4f94 4 744 154 +a4f98 8 739 154 +a4fa0 8 749 154 +a4fa8 4 750 154 +a4fac 4 749 154 +a4fb0 4 750 154 +a4fb4 4 766 154 +a4fb8 4 767 154 +a4fbc 8 766 154 +a4fc4 4 767 154 +a4fc8 8 766 154 +a4fd0 8 768 154 +a4fd8 4 405 154 +a4fdc 8 408 154 +a4fe4 10 409 154 +a4ff4 4 411 154 +a4ff8 10 412 154 +a5008 c 413 154 +a5014 4 473 154 +a5018 8 472 154 +a5020 c 473 154 +a502c 8 471 154 +a5034 8 471 154 +a503c 4 476 154 +a5040 4 477 154 +a5044 1c 587 154 +a5060 c 588 154 +a506c 8 589 154 +a5074 4 550 154 +a5078 4 551 154 +a507c c 553 154 +a5088 8 556 154 +a5090 4 557 154 +a5094 4 558 154 +a5098 10 563 154 +a50a8 4 565 154 +a50ac 10 566 154 +a50bc 8 590 154 +a50c4 c 787 154 +a50d0 4 788 154 +a50d4 c 790 154 +a50e0 c 966 154 +a50ec 8 967 154 +a50f4 4 972 154 +a50f8 4 926 154 +a50fc 4 941 154 +a5100 4 929 154 +a5104 4 938 154 +a5108 4 941 154 +a510c 4 929 154 +a5110 8 929 154 +a5118 8 931 154 +a5120 8 932 154 +a5128 8 937 154 +a5130 4 938 154 +a5134 4 937 154 +a5138 10 938 154 +a5148 14 938 154 +a515c 10 941 154 +a516c c 943 154 +a5178 10 945 154 +a5188 c 946 154 +a5194 10 932 154 +a51a4 10 974 154 +a51b4 8 873 154 +a51bc 8 873 154 +a51c4 8 875 154 +a51cc 8 876 154 +a51d4 4 879 154 +a51d8 4 880 154 +a51dc 8 882 154 +a51e4 c 884 154 +a51f0 8 885 154 +a51f8 8 875 154 +a5200 4 897 154 +a5204 4 898 154 +a5208 4 896 154 +a520c 4 901 154 +a5210 4 897 154 +a5214 8 898 154 +a521c 4 910 154 +a5220 4 901 154 +a5224 4 908 154 +a5228 8 910 154 +a5230 8 901 154 +a5238 4 903 154 +a523c 4 908 154 +a5240 4 903 154 +a5244 4 908 154 +a5248 8 904 154 +a5250 10 908 154 +a5260 10 910 154 +a5270 c 912 154 +a527c 10 914 154 +a528c c 915 154 +a5298 10 904 154 +a52a8 4 982 154 +a52ac 4 985 154 +a52b0 8 985 154 +a52b8 c 987 154 +a52c4 4 988 154 +a52c8 8 985 154 +a52d0 14 994 154 +a52e4 8 774 154 +a52ec 4 777 154 +a52f0 4 778 154 +a52f4 8 777 154 +a52fc 8 778 154 +a5304 4 777 154 +a5308 8 778 154 +a5310 10 781 154 +a5320 8 575 154 +a5328 c 575 154 +a5334 4 575 154 +a5338 8 577 154 +a5340 c 579 154 +a534c c 582 154 +a5358 c 578 154 +a5364 8 580 154 +a536c 8 584 154 +a5374 c 445 154 +a5380 4 444 154 +a5384 4 445 154 +a5388 4 444 154 +a538c 4 453 154 +a5390 4 457 154 +a5394 8 453 154 +a539c 8 457 154 +a53a4 24 458 154 +a53c8 c 461 154 +a53d4 c 462 154 +a53e0 4 453 154 +a53e4 4 464 154 +a53e8 c 465 154 +a53f4 10 453 154 +a5404 10 475 154 +a5414 2c 558 154 +a5440 4 560 154 +a5444 4 561 154 +a5448 8 560 154 +a5450 14 596 154 +a5464 20 996 154 +FUNC a5484 84 0 __register_frame_info_bases +a5484 10 79 154 +a5494 4 81 154 +a5498 c 81 154 +a54a4 8 761 144 +a54ac 4 84 154 +a54b0 4 761 144 +a54b4 4 87 154 +a54b8 4 89 154 +a54bc 4 88 154 +a54c0 4 84 154 +a54c4 4 85 154 +a54c8 4 86 154 +a54cc 4 89 154 +a54d0 8 761 144 +a54d8 8 97 154 +a54e0 4 791 144 +a54e4 4 98 154 +a54e8 c 101 154 +a54f4 4 791 144 +a54f8 10 101 154 +FUNC a5508 c 0 __register_frame_info +a5508 c 106 154 +FUNC a5514 40 0 __register_frame +a5514 8 111 154 +a551c 4 115 154 +a5520 4 111 154 +a5524 8 115 154 +a552c c 118 154 +a5538 4 119 154 +a553c 8 120 154 +a5544 4 119 154 +a5548 c 120 154 +FUNC a5554 70 0 __register_frame_info_table_bases +a5554 4 129 154 +a5558 4 130 154 +a555c 8 129 154 +a5564 4 134 154 +a5568 4 761 144 +a556c 4 133 154 +a5570 8 135 154 +a5578 8 761 144 +a5580 4 130 154 +a5584 4 136 154 +a5588 4 131 154 +a558c 4 136 154 +a5590 4 132 154 +a5594 4 136 154 +a5598 4 761 144 +a559c 4 136 154 +a55a0 4 761 144 +a55a4 8 141 154 +a55ac 4 142 154 +a55b0 4 141 154 +a55b4 4 791 144 +a55b8 8 145 154 +a55c0 4 791 144 +FUNC a55c4 c 0 __register_frame_info_table +a55c4 c 150 154 +FUNC a55d0 2c 0 __register_frame_table +a55d0 c 155 154 +a55dc 4 155 154 +a55e0 c 156 154 +a55ec 4 157 154 +a55f0 8 158 154 +a55f8 4 157 154 +FUNC a55fc f0 0 __deregister_frame_info_bases +a55fc 10 174 154 +a560c 4 179 154 +a5610 8 179 154 +a5618 10 761 144 +a5628 4 185 154 +a562c 4 761 144 +a5630 4 185 154 +a5634 4 185 154 +a5638 c 186 154 +a5644 c 189 154 +a5650 c 185 154 +a565c 8 185 154 +a5664 8 193 154 +a566c 8 194 154 +a5674 10 196 154 +a5684 8 199 154 +a568c c 200 154 +a5698 c 206 154 +a56a4 c 209 154 +a56b0 8 193 154 +a56b8 c 791 144 +a56c4 4 216 154 +a56c8 4 216 154 +a56cc c 180 154 +a56d8 14 218 154 +FUNC a56ec 4 0 __deregister_frame_info +a56ec 4 223 154 +FUNC a56f0 24 0 __deregister_frame +a56f0 8 228 154 +a56f8 8 230 154 +a5700 4 231 154 +a5704 4 232 154 +a5708 4 231 154 +a570c 8 232 154 +FUNC a5714 190 0 _Unwind_Find_FDE +a5714 c 446 153 +a5720 4 761 144 +a5724 8 446 153 +a572c 4 761 144 +a5730 4 446 153 +a5734 4 446 153 +a5738 8 761 144 +a5740 4 1010 154 +a5744 4 1010 154 +a5748 c 1011 154 +a5754 10 1013 154 +a5764 8 1014 154 +a576c 8 1010 154 +a5774 c 1020 154 +a5780 4 1024 154 +a5784 4 1025 154 +a5788 4 1024 154 +a578c c 1025 154 +a5798 8 1028 154 +a57a0 4 1028 154 +a57a4 10 1029 154 +a57b4 c 1028 154 +a57c0 4 1031 154 +a57c4 4 1032 154 +a57c8 8 1034 154 +a57d0 4 1020 154 +a57d4 10 791 144 +a57e4 4 1041 154 +a57e8 8 1046 154 +a57f0 4 1050 154 +a57f4 8 1047 154 +a57fc 8 1049 154 +a5804 4 1050 154 +a5808 8 1051 154 +a5810 14 1052 154 +a5824 10 1052 154 +a5834 8 1054 154 +a583c 8 459 153 +a5844 c 461 153 +a5850 4 454 153 +a5854 4 455 153 +a5858 4 456 153 +a585c 4 457 153 +a5860 4 458 153 +a5864 4 461 153 +a5868 4 461 153 +a586c 8 464 153 +a5874 8 466 153 +a587c 8 467 153 +a5884 8 468 153 +a588c 18 471 153 +FUNC a58a4 60 0 __sfp_handle_exceptions +a58a4 4 36 146 +a58a8 8 38 146 +a58b0 4 42 146 +a58b4 4 44 146 +a58b8 c 46 146 +a58c4 4 50 146 +a58c8 4 52 146 +a58cc c 54 146 +a58d8 4 58 146 +a58dc 4 60 146 +a58e0 8 62 146 +a58e8 4 66 146 +a58ec 4 68 146 +a58f0 c 70 146 +a58fc 4 74 146 +a5900 4 76 146 +PUBLIC 268d4 0 _ZN38ExceptionHandlerTest_SimpleWithFD_Test8TestBodyEv +PUBLIC 26aa8 0 _ZN7testing13PrintToStringIiEESsRKT_ +PUBLIC 26b30 0 _ZN7testing8internal18CmpHelperOpFailureIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_S4_ +PUBLIC 26c44 0 _ZN7testing8internal11CmpHelperNEIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 26c88 0 _ZN7testing8internal11CmpHelperEQIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 26f1c 0 _ZN7testing13PrintToStringIlEESsRKT_ +PUBLIC 26f78 0 _ZN7testing8internal11CmpHelperEQIllEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 27014 0 _ZN7testing8internal11CmpHelperEQIilEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 2744c 0 _ZN7testing8internal11CmpHelperGTIliEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 27580 0 _ZN53ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test8TestBodyEv +PUBLIC 27850 0 _ZN7testing13PrintToStringIPvEESsRKT_ +PUBLIC 278d8 0 _ZN7testing8internal18CmpHelperOpFailureIPvS2_EENS_15AssertionResultEPKcS5_RKT_RKT0_S5_ +PUBLIC 279ec 0 _ZN7testing13PrintToStringIjEESsRKT_ +PUBLIC 27a48 0 _ZN7testing8internal11CmpHelperLTIjjEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 27b7c 0 _ZN7testing8internal11CmpHelperEQIjjEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 27c18 0 _ZN7testing8internal18CmpHelperEQFailureI20MDExceptionCodeLinuxjEENS_15AssertionResultEPKcS5_RKT_RKT0_ +PUBLIC 27d70 0 _ZN7testing13PrintToStringISsEESsRKT_ +PUBLIC 27dcc 0 _ZN7testing8internal11CmpHelperEQISsSsEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 27e8c 0 _ZN40ExceptionHandlerTest_SimpleWithPath_Test8TestBodyEv +PUBLIC 28074 0 _ZN7testing13PrintToStringImEESsRKT_ +PUBLIC 280d0 0 _ZN7testing8internal11CmpHelperEQImjEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 2816c 0 _ZN7testing8internal11CmpHelperEQIjmEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 28208 0 _ZN7testing8internal11CmpHelperEQImmEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 289c8 0 _Z10ChildCrashb +PUBLIC 28dac 0 _ZN44ExceptionHandlerTest_ChildCrashWithPath_Test8TestBodyEv +PUBLIC 28e54 0 _ZN42ExceptionHandlerTest_ChildCrashWithFD_Test8TestBodyEv +PUBLIC 28efc 0 _ZN57ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test8TestBodyEv +PUBLIC 290a0 0 _ZN55ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test8TestBodyEv +PUBLIC 29244 0 _ZN56ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test8TestBodyEv +PUBLIC 293e8 0 _ZN58ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test8TestBodyEv +PUBLIC 2958c 0 _ZN52ExceptionHandlerTest_RedeliveryToDefaultHandler_Test8TestBodyEv +PUBLIC 29688 0 _ZN58ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test8TestBodyEv +PUBLIC 299ac 0 _ZN55ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test8TestBodyEv +PUBLIC 29ae8 0 _ZN61ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test8TestBodyEv +PUBLIC 29c24 0 _ZN57ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test8TestBodyEv +PUBLIC 29d64 0 _ZN58ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test8TestBodyEv +PUBLIC 29ea4 0 _ZN40ExceptionHandlerTest_ExternalDumper_Test8TestBodyEv +PUBLIC 2a868 0 _ZN50ExceptionHandlerTest_InstructionPointerMemory_Test8TestBodyEv +PUBLIC 2b30c 0 _ZN58ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test8TestBodyEv +PUBLIC 2bcc0 0 _ZN58ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test8TestBodyEv +PUBLIC 2c678 0 _ZN61ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test8TestBodyEv +PUBLIC 2cc2c 0 _ZN36ExceptionHandlerTest_ModuleInfo_Test8TestBodyEv +PUBLIC 2d504 0 _ZN54ExceptionHandlerTest_WriteMinidumpExceptionStream_Test8TestBodyEv +PUBLIC 2d874 0 _ZN55ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test8TestBodyEv +PUBLIC 2de2c 0 _ZN42ExceptionHandlerTest_AdditionalMemory_Test8TestBodyEv +PUBLIC 2e2b4 0 _ZN48ExceptionHandlerTest_AdditionalMemoryRemove_Test8TestBodyEv +PUBLIC 2e584 0 _ZN47ExceptionHandlerTest_WriteMinidumpForChild_Test8TestBodyEv +PUBLIC 2eb58 0 _ZN7testing13PrintToStringIPKvEESsRKT_ +PUBLIC 2ebe0 0 _ZN7testing8internal11CmpHelperNEIPcS2_EENS_15AssertionResultEPKcS5_RKT_RKT0_ +PUBLIC 2ff78 0 _ZN26CpuSetTest_EmptyCount_Test8TestBodyEv +PUBLIC 3003c 0 _ZN22CpuSetTest_OneCpu_Test8TestBodyEv +PUBLIC 30260 0 _ZN32CpuSetTest_OneCpuTerminated_Test8TestBodyEv +PUBLIC 30484 0 _ZN32CpuSetTest_TwoCpusWithComma_Test8TestBodyEv +PUBLIC 306a8 0 _ZN32CpuSetTest_TwoCpusWithRange_Test8TestBodyEv +PUBLIC 308cc 0 _ZN32CpuSetTest_TenCpusWithRange_Test8TestBodyEv +PUBLIC 30af0 0 _ZN26CpuSetTest_MultiItems_Test8TestBodyEv +PUBLIC 30d14 0 _ZN29CpuSetTest_IntersectWith_Test8TestBodyEv +PUBLIC 31260 0 _ZN32CpuSetTest_SelfIntersection_Test8TestBodyEv +PUBLIC 314f0 0 _ZN33CpuSetTest_EmptyIntersection_Test8TestBodyEv +PUBLIC 31af8 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESsNS_9_IdentityISsEENS_11_SetTraitsTISsEESaISsEE8_M_eraseEPNS_18_Rb_tree_node_baseE +PUBLIC 31d8c 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESsNS_9_IdentityISsEENS_11_SetTraitsTISsEESaISsEE9_M_insertEPNS_18_Rb_tree_node_baseERKSsSA_SA_ +PUBLIC 31e68 0 _ZN39DirectoryReaderTest_CompareResults_Test8TestBodyEv +PUBLIC 32d34 0 _ZN29LineReaderTest_EmptyFile_Test8TestBodyEv +PUBLIC 32edc 0 _ZN27LineReaderTest_TooLong_Test8TestBodyEv +PUBLIC 330b0 0 _ZN7testing8internal18CmpHelperEQFailureIccEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 33198 0 _ZN7testing8internal11CmpHelperEQIccEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 331d4 0 _ZN37LineReaderTest_OneLineTerminated_Test8TestBodyEv +PUBLIC 33548 0 _ZN27LineReaderTest_OneLine_Test8TestBodyEv +PUBLIC 338bc 0 _ZN38LineReaderTest_TwoLinesTerminated_Test8TestBodyEv +PUBLIC 33e24 0 _ZN28LineReaderTest_TwoLines_Test8TestBodyEv +PUBLIC 3438c 0 _ZN29LineReaderTest_MaxLength_Test8TestBodyEv +PUBLIC 3483c 0 _ZN7testing8internal18CmpHelperEQFailureIjmEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 34958 0 _ZN38LinuxCoreDumperTest_BuildProcPath_Test8TestBodyEv +PUBLIC 34e00 0 _ZN54LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test8TestBodyEv +PUBLIC 35ed8 0 _ZN29LinuxPtraceDumperMappingsTest5SetUpEv +PUBLIC 36294 0 _ZN37LinuxPtraceDumperChildTest_Setup_Test12RealTestBodyEv +PUBLIC 362c8 0 _ZN44LinuxPtraceDumperChildTest_FindMappings_Test12RealTestBodyEv +PUBLIC 364f8 0 _ZN45LinuxPtraceDumperChildTest_BuildProcPath_Test12RealTestBodyEv +PUBLIC 369f4 0 _ZN44LinuxPtraceDumperChildTest_FileIDsMatch_Test12RealTestBodyEv +PUBLIC 36eac 0 _ZN42LinuxPtraceDumperChildTest_ThreadList_Test12RealTestBodyEv +PUBLIC 372b4 0 _ZN50LinuxPtraceDumperChildTest_LinuxGateMappingID_Test12RealTestBodyEv +PUBLIC 376c0 0 _ZN56LinuxPtraceDumperChildTest_MappingsIncludeLinuxGate_Test12RealTestBodyEv +PUBLIC 37aa0 0 _ZN49LinuxPtraceDumperMappingsTest_MergedMappings_Test12RealTestBodyEv +PUBLIC 37e78 0 _ZN61LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test8TestBodyEv +PUBLIC 3db40 0 _ZN15google_breakpad15GetHelperBinaryEv +PUBLIC 3e620 0 _ZN36ProcCpuInfoReaderTest_EmptyFile_Test8TestBodyEv +PUBLIC 3e7cc 0 _ZN44ProcCpuInfoReaderTest_OneLineTerminated_Test8TestBodyEv +PUBLIC 3eac8 0 _ZN45ProcCpuInfoReaderTest_TwoLinesTerminated_Test8TestBodyEv +PUBLIC 3eee8 0 _ZN44ProcCpuInfoReaderTest_SkipMalformedLine_Test8TestBodyEv +PUBLIC 3f1e4 0 _ZN43ProcCpuInfoReaderTest_SkipOneEmptyLine_Test8TestBodyEv +PUBLIC 3f4e0 0 _ZN41ProcCpuInfoReaderTest_SkipEmptyField_Test8TestBodyEv +PUBLIC 3f7dc 0 _ZN44ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test8TestBodyEv +PUBLIC 3fc18 0 _ZN42ProcCpuInfoReaderTest_FieldWithSpaces_Test8TestBodyEv +PUBLIC 3ff14 0 _ZN37ProcCpuInfoReaderTest_EmptyValue_Test8TestBodyEv +PUBLIC 402cc 0 _ZN34ProcCpuInfoReaderTest_OneLine_Test8TestBodyEv +PUBLIC 408a0 0 _ZN7testing8internal18CmpHelperEQFailureIPK9elf64_hdrS4_EENS_15AssertionResultEPKcS7_RKT_RKT0_ +PUBLIC 40988 0 _ZN7testing8internal18CmpHelperEQFailureIPK10elf64_phdrS4_EENS_15AssertionResultEPKcS7_RKT_RKT0_ +PUBLIC 40a70 0 _ZNSt4priv8_Rb_treeIiSt4lessIiEiNS_9_IdentityIiEENS_11_SetTraitsTIiEESaIiEE8_M_eraseEPNS_18_Rb_tree_node_baseE +PUBLIC 40afc 0 _ZNSt4priv8_Rb_treeIiSt4lessIiEiNS_9_IdentityIiEENS_11_SetTraitsTIiEESaIiEE9_M_insertEPNS_18_Rb_tree_node_baseERKiSA_SA_ +PUBLIC 40c18 0 _ZNSt4priv8_Rb_treeIiSt4lessIiEiNS_9_IdentityIiEENS_11_SetTraitsTIiEESaIiEE13insert_uniqueERKi +PUBLIC 40d30 0 _ZN39ElfCoreDumpTest_DefaultConstructor_Test8TestBodyEv +PUBLIC 410f8 0 _ZN34ElfCoreDumpTest_TestElfHeader_Test8TestBodyEv +PUBLIC 42350 0 _ZN34ElfCoreDumpTest_ValidCoreFile_Test8TestBodyEv +PUBLIC 435f8 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESt4pairIKSsN15google_breakpad14test_assembler5LabelEENS_10_Select1stIS8_EENS_11_MapTraitsTIS8_EESaIS8_EE8_M_eraseEPNS_18_Rb_tree_node_baseE +PUBLIC 44a34 0 _ZN7testing8internal18CmpHelperOpFailureIjmEENS_15AssertionResultEPKcS4_RKT_RKT0_S4_ +PUBLIC 44e9c 0 _ZN24FileIDTest_ElfClass_TestIN15google_breakpad10ElfClass64EE8TestBodyEv +PUBLIC 450ec 0 _ZN23FileIDTest_BuildID_TestIN15google_breakpad10ElfClass64EE8TestBodyEv +PUBLIC 45460 0 _ZN25FileIDTest_BuildIDPH_TestIN15google_breakpad10ElfClass64EE8TestBodyEv +PUBLIC 4582c 0 _ZN28FileIDTest_UniqueHashes_TestIN15google_breakpad10ElfClass64EE8TestBodyEv +PUBLIC 45e7c 0 _ZN24FileIDTest_ElfClass_TestIN15google_breakpad10ElfClass32EE8TestBodyEv +PUBLIC 460cc 0 _ZN23FileIDTest_BuildID_TestIN15google_breakpad10ElfClass32EE8TestBodyEv +PUBLIC 46440 0 _ZN25FileIDTest_BuildIDPH_TestIN15google_breakpad10ElfClass32EE8TestBodyEv +PUBLIC 4680c 0 _ZN28FileIDTest_UniqueHashes_TestIN15google_breakpad10ElfClass32EE8TestBodyEv +PUBLIC 47148 0 _ZN32LinuxLibcSupportTest_strlen_Test8TestBodyEv +PUBLIC 47290 0 _ZN32LinuxLibcSupportTest_strcmp_Test8TestBodyEv +PUBLIC 473b4 0 _ZN33LinuxLibcSupportTest_strtoui_Test8TestBodyEv +PUBLIC 47af0 0 _ZN31LinuxLibcSupportTest_uitos_Test8TestBodyEv +PUBLIC 47e28 0 _ZN34LinuxLibcSupportTest_uint_len_Test8TestBodyEv +PUBLIC 48354 0 _ZN32LinuxLibcSupportTest_strchr_Test8TestBodyEv +PUBLIC 487ac 0 _ZN33LinuxLibcSupportTest_strrchr_Test8TestBodyEv +PUBLIC 48bc4 0 _ZN7testing8internal18CmpHelperEQFailureIPvS2_EENS_15AssertionResultEPKcS5_RKT_RKT0_ +PUBLIC 48c48 0 _ZN7testing8internal11CmpHelperEQIA10_cPvEENS_15AssertionResultEPKcS6_RKT_RKT0_ +PUBLIC 48d80 0 _ZN32LinuxLibcSupportTest_memchr_Test8TestBodyEv +PUBLIC 4913c 0 _ZN7testing13PrintToStringIcEESsRKT_ +PUBLIC 49198 0 _ZN7testing8internal11CmpHelperEQIciEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 49234 0 _ZN38LinuxLibcSupportTest_read_hex_ptr_Test8TestBodyEv +PUBLIC 496b0 0 _ZN42LinuxLibcSupportTest_read_decimal_ptr_Test8TestBodyEv +PUBLIC 49a9c 0 _ZN15google_breakpad9synth_elf3ELF13AppendSectionERNS1_10ElfSectionE +PUBLIC 49b10 0 _ZN15google_breakpad9synth_elf3ELF10AddSegmentEiijj +PUBLIC 49cf0 0 _ZN15google_breakpad9synth_elf5Notes7AddNoteEiRKSsPKhm +PUBLIC 49f04 0 _ZN15google_breakpad9synth_elf11SymbolTableC2ENS_14test_assembler10EndiannessEmRNS0_11StringTableE +PUBLIC 49fe4 0 _ZNSt4priv12_Impl_vectorIN15google_breakpad9synth_elf3ELF10ElfSectionESaIS4_EE22_M_insert_overflow_auxEPS4_RKS4_RKSt12__false_typemb +PUBLIC 4a244 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESt4pairIKSsN15google_breakpad14test_assembler5LabelEENS_10_Select1stIS8_EENS_11_MapTraitsTIS8_EESaIS8_EE9_M_insertEPNS_18_Rb_tree_node_baseERKS8_SG_SG_ +PUBLIC 4a320 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESt4pairIKSsN15google_breakpad14test_assembler5LabelEENS_10_Select1stIS8_EENS_11_MapTraitsTIS8_EESaIS8_EE13insert_uniqueERKS8_ +PUBLIC 4a41c 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESt4pairIKSsN15google_breakpad14test_assembler5LabelEENS_10_Select1stIS8_EENS_11_MapTraitsTIS8_EESaIS8_EE13insert_uniqueENS_17_Rb_tree_iteratorIS8_SC_EERKS8_ +PUBLIC 4a8fc 0 _ZN15google_breakpad9synth_elf11SymbolTable9AddSymbolERKSsjjjt +PUBLIC 4a9a0 0 _ZN15google_breakpad9synth_elf11SymbolTable9AddSymbolERKSsmmjt +PUBLIC 4aa44 0 _ZN15google_breakpad9synth_elf3ELF10AddSectionERKSsRKNS_14test_assembler7SectionEjjmjmm +PUBLIC 4ac54 0 _ZN15google_breakpad9synth_elf3ELF6FinishEv +PUBLIC 4ad54 0 _ZN15google_breakpad9synth_elf3ELFC1EthNS_14test_assembler10EndiannessE +PUBLIC 4b264 0 _ZNK15google_breakpad14CrashGenerator21HasDefaultCorePatternEv +PUBLIC 4b2d0 0 _ZNK15google_breakpad14CrashGenerator11GetThreadIdEj +PUBLIC 4b2dc 0 _ZN15google_breakpad14CrashGenerator18GetThreadIdPointerEj +PUBLIC 4b2e8 0 _ZN15google_breakpad14CrashGenerator17UnmapSharedMemoryEv +PUBLIC 4b340 0 _ZN15google_breakpad14CrashGenerator15MapSharedMemoryEm +PUBLIC 4b3c8 0 _ZNK15google_breakpad14CrashGenerator20SetCoreFileSizeLimitEm +PUBLIC 4b40c 0 _ZNK15google_breakpad14CrashGenerator13CopyProcFilesEiPKc +PUBLIC 4b4e8 0 _ZN15google_breakpad14CrashGenerator27CreateThreadsInChildProcessEj +PUBLIC 4b6c4 0 _ZN15google_breakpad14CrashGeneratorC1Ev +PUBLIC 4b6ec 0 _ZN15google_breakpad14CrashGeneratorD2Ev +PUBLIC 4b71c 0 _ZNK15google_breakpad14CrashGenerator15GetCoreFilePathEv +PUBLIC 4b748 0 _ZNK15google_breakpad14CrashGenerator27GetDirectoryOfProcFilesCopyEv +PUBLIC 4b774 0 _ZN15google_breakpad14CrashGenerator16CreateChildCrashEjjiPi +PUBLIC 4be6c 0 _ZN28PageAllocatorTest_Setup_Test8TestBodyEv +PUBLIC 4be98 0 _ZN35PageAllocatorTest_SmallObjects_Test8TestBodyEv +PUBLIC 4bfac 0 _ZN34PageAllocatorTest_LargeObject_Test8TestBodyEv +PUBLIC 4c250 0 _ZNSt4priv12_Impl_vectorIjN15google_breakpad16PageStdAllocatorIjEEE7reserveEm +PUBLIC 4c2f8 0 _ZN41WastefulVectorTest_UsesPageAllocator_Test8TestBodyEv +PUBLIC 4c42c 0 _ZN7testing8internal18CmpHelperEQFailureImjEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 4c4e0 0 _ZN29WastefulVectorTest_Setup_Test8TestBodyEv +PUBLIC 4c5b8 0 _ZN7testing8internal18CmpHelperEQFailureIjjEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 4c63c 0 _ZN30WastefulVectorTest_Simple_Test8TestBodyEv +PUBLIC 4d4b0 0 _ZN15google_breakpad31NonAllocatingMapTest_Entry_Test8TestBodyEv +PUBLIC 4dab0 0 _ZN15google_breakpad39NonAllocatingMapTest_CopyAndAssign_Test8TestBodyEv +PUBLIC 4e440 0 _ZN15google_breakpad35NonAllocatingMapTest_AddRemove_Test8TestBodyEv +PUBLIC 4eae8 0 _ZN15google_breakpad35NonAllocatingMapTest_Serialize_Test8TestBodyEv +PUBLIC 4f08c 0 _ZN15google_breakpad36NonAllocatingMapTest_OutOfSpace_Test8TestBodyEv +PUBLIC 4f2a4 0 _ZN7testing8internal18CmpHelperOpFailureIPKcA7_cEENS_15AssertionResultES3_S3_RKT_RKT0_S3_ +PUBLIC 4f3e8 0 _ZN7testing8internal11CmpHelperNEIPKcA7_cEENS_15AssertionResultES3_S3_RKT_RKT0_ +PUBLIC 4f428 0 _ZN15google_breakpad48NonAllocatingMapTest_SimpleStringDictionary_Test8TestBodyEv +PUBLIC 4f9a4 0 _ZN15google_breakpad34NonAllocatingMapTest_Iterator_Test8TestBodyEv +PUBLIC 4ffb0 0 _ZN15google_breakpad14test_assembler5LabelC1Ev +PUBLIC 4ffe8 0 _ZN15google_breakpad14test_assembler5LabelC1Em +PUBLIC 50028 0 _ZN15google_breakpad14test_assembler5LabelC2ERKS1_ +PUBLIC 50040 0 _ZN15google_breakpad14test_assembler5Label7BindingC2Ev +PUBLIC 50054 0 _ZN15google_breakpad14test_assembler5Label7BindingC2Em +PUBLIC 50068 0 _ZN15google_breakpad14test_assembler5Label7BindingD1Ev +PUBLIC 500c0 0 _ZN15google_breakpad14test_assembler5LabelD2Ev +PUBLIC 5010c 0 _ZN15google_breakpad14test_assembler5Label7Binding3GetEPPS2_Pm +PUBLIC 501bc 0 _ZNK15google_breakpad14test_assembler5Label15IsKnownConstantEPm +PUBLIC 50208 0 _ZNK15google_breakpad14test_assembler5Label5ValueEv +PUBLIC 50228 0 _ZNK15google_breakpad14test_assembler5Label17IsKnownOffsetFromERKS1_Pm +PUBLIC 50298 0 _ZNK15google_breakpad14test_assembler5LabelmiERKS1_ +PUBLIC 502b4 0 _ZN15google_breakpad14test_assembler5Label7Binding3SetEPS2_m +PUBLIC 50380 0 _ZN15google_breakpad14test_assembler5LabelaSEm +PUBLIC 503b0 0 _ZN15google_breakpad14test_assembler5LabelaSERKS1_ +PUBLIC 503e0 0 _ZNK15google_breakpad14test_assembler5LabelplEm +PUBLIC 50420 0 _ZNK15google_breakpad14test_assembler5LabelmiEm +PUBLIC 50468 0 _ZN15google_breakpad14test_assembler7Section5AlignEmh +PUBLIC 504b0 0 _ZN15google_breakpad14test_assembler7Section6LEB128Ex +PUBLIC 50508 0 _ZN15google_breakpad14test_assembler7Section7ULEB128Em +PUBLIC 505d8 0 _ZN15google_breakpad14test_assembler7Section6AppendENS0_10EndiannessEmm +PUBLIC 5060c 0 _ZN15google_breakpad14test_assembler7Section3L16Et +PUBLIC 50640 0 _ZN15google_breakpad14test_assembler7Section3L32Ej +PUBLIC 50674 0 _ZN15google_breakpad14test_assembler7Section3L64Em +PUBLIC 506a8 0 _ZN15google_breakpad14test_assembler7Section3B16Et +PUBLIC 506dc 0 _ZN15google_breakpad14test_assembler7Section3B32Ej +PUBLIC 50710 0 _ZN15google_breakpad14test_assembler7Section3B64Em +PUBLIC 50744 0 _ZN15google_breakpad14test_assembler7Section3D16Et +PUBLIC 50778 0 _ZN15google_breakpad14test_assembler7Section3D32Ej +PUBLIC 507ac 0 _ZN15google_breakpad14test_assembler7Section3D64Em +PUBLIC 50830 0 _ZN15google_breakpad14test_assembler7Section5ClearEv +PUBLIC 5095c 0 _ZN15google_breakpad14test_assembler7Section11GetContentsEPSs +PUBLIC 50a9c 0 _ZNSt4priv12_Impl_vectorIN15google_breakpad14test_assembler7Section9ReferenceESaIS4_EE22_M_insert_overflow_auxEPS4_RKS4_RKSt12__false_typemb +PUBLIC 50d88 0 _ZN15google_breakpad14test_assembler7Section6AppendENS0_10EndiannessEmRKNS0_5LabelE +PUBLIC 50e48 0 _ZN15google_breakpad14test_assembler7Section2L8ERKNS0_5LabelE +PUBLIC 50e58 0 _ZN15google_breakpad14test_assembler7Section2B8ERKNS0_5LabelE +PUBLIC 50e68 0 _ZN15google_breakpad14test_assembler7Section3L16ERKNS0_5LabelE +PUBLIC 50e78 0 _ZN15google_breakpad14test_assembler7Section3L32ERKNS0_5LabelE +PUBLIC 50e88 0 _ZN15google_breakpad14test_assembler7Section3L64ERKNS0_5LabelE +PUBLIC 50e98 0 _ZN15google_breakpad14test_assembler7Section3B16ERKNS0_5LabelE +PUBLIC 50ea8 0 _ZN15google_breakpad14test_assembler7Section3B32ERKNS0_5LabelE +PUBLIC 50eb8 0 _ZN15google_breakpad14test_assembler7Section3B64ERKNS0_5LabelE +PUBLIC 50ec8 0 _ZN15google_breakpad14test_assembler7Section2D8ERKNS0_5LabelE +PUBLIC 50ed8 0 _ZN15google_breakpad14test_assembler7Section3D16ERKNS0_5LabelE +PUBLIC 50ee8 0 _ZN15google_breakpad14test_assembler7Section3D32ERKNS0_5LabelE +PUBLIC 50ef8 0 _ZN15google_breakpad14test_assembler7Section3D64ERKNS0_5LabelE +PUBLIC 50f08 0 _ZN15google_breakpad14test_assembler7Section6AppendERKS1_ +PUBLIC 510ec 0 _ZN15google_breakpad8CopyFileEPKcS1_ +PUBLIC 512d0 0 _ZN15google_breakpad8ReadFileEPKcPvPl +PUBLIC 513d4 0 _ZN15google_breakpad9WriteFileEPKcPKvm +PUBLIC 51dbc 0 _ZN7testing8internal18CmpHelperEQFailureIPKiS3_EENS_15AssertionResultEPKcS6_RKT_RKT0_ +PUBLIC 51ef4 0 _ZN7testing13PrintToStringIPKhEESsRKT_ +PUBLIC 51f50 0 _ZN7testing8internal11CmpHelperEQIPKhS3_EENS_15AssertionResultEPKcS6_RKT_RKT0_ +PUBLIC 51fec 0 _ZN47MinidumpMemoryRangeTest_DefaultConstructor_Test8TestBodyEv +PUBLIC 52118 0 _ZN55MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test8TestBodyEv +PUBLIC 52260 0 _ZN57MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test8TestBodyEv +PUBLIC 5239c 0 _ZN34MinidumpMemoryRangeTest_Reset_Test8TestBodyEv +PUBLIC 526d4 0 _ZN32MinidumpMemoryRangeTest_Set_Test8TestBodyEv +PUBLIC 52914 0 _ZN7testing8internal11CmpHelperEQIPKhPKvEENS_15AssertionResultEPKcS8_RKT_RKT0_ +PUBLIC 529b0 0 _ZN7testing8internal18CmpHelperEQFailureIPKvS3_EENS_15AssertionResultEPKcS6_RKT_RKT0_ +PUBLIC 52a34 0 _ZN61MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test8TestBodyEv +PUBLIC 52fe0 0 _ZN44MinidumpMemoryRangeTest_GetArrayElement_Test8TestBodyEv +PUBLIC 531e4 0 _ZN47MinidumpMemoryRangeTest_SubrangeAndGetData_Test8TestBodyEv +PUBLIC 53820 0 _ZN52MinidumpMemoryRangeTest_GetDataWithTemplateType_Test8TestBodyEv +PUBLIC 539b0 0 _ZN59MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test8TestBodyEv +PUBLIC 53b40 0 _ZN7testing8internal11CmpHelperEQIA1_cSsEENS_15AssertionResultEPKcS5_RKT_RKT0_ +PUBLIC 53bfc 0 _ZN45MinidumpMemoryRangeTest_GetAsciiMDString_Test8TestBodyEv +PUBLIC 540c4 0 _ZN7testing8internal18CmpHelperEQFailureImmEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 54200 0 _ZN33AndroidUContext_SigmakOffset_Test8TestBodyEv +PUBLIC 5429c 0 _ZN32AndroidUContext_GRegsOffset_Test8TestBodyEv +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2352c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23534 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2353c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23544 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23560 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23564 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23568 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2356c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23570 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23574 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23578 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2357c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23580 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23584 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23588 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2358c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23590 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23594 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23598 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2359c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235a0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235a4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235a8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ac 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235b0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235b4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235b8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235bc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236d0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236d4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236d8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236dc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236e0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236e4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236e8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236ec 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236f0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236f4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236f8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 236fc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23700 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23704 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23708 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2370c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23710 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23714 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23718 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2371c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23720 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23724 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23728 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2372c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23730 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23734 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23904 3c .cfa: sp 0 + .ra: x30 +STACK CFI 23908 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 23914 .cfa: x29 48 + +STACK CFI 2393c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23940 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23948 1c .cfa: sp 0 + .ra: x30 +STACK CFI 2394c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 23954 .cfa: x29 16 + +STACK CFI 23960 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23964 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23978 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2397c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23980 .cfa: x29 32 + +STACK CFI 23984 x19: .cfa -16 + ^ +STACK CFI 23994 x19: x19 +STACK CFI 23998 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2399c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 239b0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 239b4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 239b8 .cfa: x29 32 + +STACK CFI 239bc x19: .cfa -16 + ^ +STACK CFI 239cc x19: x19 +STACK CFI 239d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 239d4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 239e8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 239ec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 239f0 .cfa: x29 32 + +STACK CFI 239f4 x19: .cfa -16 + ^ +STACK CFI 23a04 x19: x19 +STACK CFI 23a08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23a0c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23a20 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23a24 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23a28 .cfa: x29 32 + +STACK CFI 23a2c x19: .cfa -16 + ^ +STACK CFI 23a3c x19: x19 +STACK CFI 23a40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23a44 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23a58 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23a5c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23a60 .cfa: x29 32 + +STACK CFI 23a64 x19: .cfa -16 + ^ +STACK CFI 23a74 x19: x19 +STACK CFI 23a78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23a7c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23a90 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23a94 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23a98 .cfa: x29 32 + +STACK CFI 23a9c x19: .cfa -16 + ^ +STACK CFI 23aac x19: x19 +STACK CFI 23ab0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23ab4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23ac8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23acc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23ad0 .cfa: x29 32 + +STACK CFI 23ad4 x19: .cfa -16 + ^ +STACK CFI 23ae4 x19: x19 +STACK CFI 23ae8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23aec 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23b00 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23b04 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23b08 .cfa: x29 32 + +STACK CFI 23b0c x19: .cfa -16 + ^ +STACK CFI 23b1c x19: x19 +STACK CFI 23b20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23b24 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23b38 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23b3c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23b40 .cfa: x29 32 + +STACK CFI 23b44 x19: .cfa -16 + ^ +STACK CFI 23b54 x19: x19 +STACK CFI 23b58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23b5c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23b70 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23b74 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23b78 .cfa: x29 32 + +STACK CFI 23b7c x19: .cfa -16 + ^ +STACK CFI 23b8c x19: x19 +STACK CFI 23b90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23b94 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23ba8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23bac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23bb0 .cfa: x29 32 + +STACK CFI 23bb4 x19: .cfa -16 + ^ +STACK CFI 23bc4 x19: x19 +STACK CFI 23bc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23bcc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23be0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23be4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23be8 .cfa: x29 32 + +STACK CFI 23bec x19: .cfa -16 + ^ +STACK CFI 23bfc x19: x19 +STACK CFI 23c00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23c04 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23c18 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23c1c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23c20 .cfa: x29 32 + +STACK CFI 23c24 x19: .cfa -16 + ^ +STACK CFI 23c34 x19: x19 +STACK CFI 23c38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23c3c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23c50 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23c54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23c58 .cfa: x29 32 + +STACK CFI 23c5c x19: .cfa -16 + ^ +STACK CFI 23c6c x19: x19 +STACK CFI 23c70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23c74 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23c88 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23c8c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23c90 .cfa: x29 32 + +STACK CFI 23c94 x19: .cfa -16 + ^ +STACK CFI 23ca4 x19: x19 +STACK CFI 23ca8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23cac 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23cc0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23cc4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23cc8 .cfa: x29 32 + +STACK CFI 23ccc x19: .cfa -16 + ^ +STACK CFI 23cdc x19: x19 +STACK CFI 23ce0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23ce4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23cf8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23cfc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23d00 .cfa: x29 32 + +STACK CFI 23d04 x19: .cfa -16 + ^ +STACK CFI 23d14 x19: x19 +STACK CFI 23d18 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23d1c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23d30 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23d34 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23d38 .cfa: x29 32 + +STACK CFI 23d3c x19: .cfa -16 + ^ +STACK CFI 23d4c x19: x19 +STACK CFI 23d50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23d54 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23d68 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23d6c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23d70 .cfa: x29 32 + +STACK CFI 23d74 x19: .cfa -16 + ^ +STACK CFI 23d84 x19: x19 +STACK CFI 23d88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23d8c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23da0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23da4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23da8 .cfa: x29 32 + +STACK CFI 23dac x19: .cfa -16 + ^ +STACK CFI 23dbc x19: x19 +STACK CFI 23dc0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23dc4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23dd8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23ddc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23de0 .cfa: x29 32 + +STACK CFI 23de4 x19: .cfa -16 + ^ +STACK CFI 23df4 x19: x19 +STACK CFI 23df8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23dfc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23e10 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23e14 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23e18 .cfa: x29 32 + +STACK CFI 23e1c x19: .cfa -16 + ^ +STACK CFI 23e2c x19: x19 +STACK CFI 23e30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23e34 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23e48 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23e4c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23e50 .cfa: x29 32 + +STACK CFI 23e54 x19: .cfa -16 + ^ +STACK CFI 23e64 x19: x19 +STACK CFI 23e68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23e6c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23e80 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23e84 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23e88 .cfa: x29 32 + +STACK CFI 23e8c x19: .cfa -16 + ^ +STACK CFI 23e9c x19: x19 +STACK CFI 23ea0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23ea4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23eb8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23ebc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23ec0 .cfa: x29 32 + +STACK CFI 23ec4 x19: .cfa -16 + ^ +STACK CFI 23ed4 x19: x19 +STACK CFI 23ed8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23edc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23ef0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 23ef4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23ef8 .cfa: x29 32 + +STACK CFI 23efc x19: .cfa -16 + ^ +STACK CFI 23f0c x19: x19 +STACK CFI 23f10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23f14 194 .cfa: sp 0 + .ra: x30 +STACK CFI 23f18 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 23f1c .cfa: x29 208 + +STACK CFI 23f20 x19: .cfa -192 + ^ x20: .cfa -184 + ^ +STACK CFI 23f2c x21: .cfa -176 + ^ x22: .cfa -168 + ^ +STACK CFI 2409c x19: x19 x20: x20 +STACK CFI 240a0 x21: x21 x22: x22 +STACK CFI 240a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 240a8 d4 .cfa: sp 0 + .ra: x30 +STACK CFI 240ac .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 240b4 .cfa: x29 64 + +STACK CFI 240bc x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 24170 x19: x19 x20: x20 +STACK CFI 24174 x21: x21 x22: x22 +STACK CFI 24178 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2417c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24180 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24188 .cfa: x29 32 + +STACK CFI 2418c x19: .cfa -16 + ^ +STACK CFI 241b0 x19: x19 +STACK CFI 241b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 241b8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 241bc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 241c4 .cfa: x29 32 + +STACK CFI 241c8 x19: .cfa -16 + ^ +STACK CFI 241ec x19: x19 +STACK CFI 241f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 241f4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 241f8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24200 .cfa: x29 32 + +STACK CFI 24204 x19: .cfa -16 + ^ +STACK CFI 24228 x19: x19 +STACK CFI 2422c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24230 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24234 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2423c .cfa: x29 32 + +STACK CFI 24240 x19: .cfa -16 + ^ +STACK CFI 24264 x19: x19 +STACK CFI 24268 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2426c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24270 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24278 .cfa: x29 32 + +STACK CFI 2427c x19: .cfa -16 + ^ +STACK CFI 242a0 x19: x19 +STACK CFI 242a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 242a8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 242ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 242b4 .cfa: x29 32 + +STACK CFI 242b8 x19: .cfa -16 + ^ +STACK CFI 242dc x19: x19 +STACK CFI 242e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 242e4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 242e8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 242f0 .cfa: x29 32 + +STACK CFI 242f4 x19: .cfa -16 + ^ +STACK CFI 24318 x19: x19 +STACK CFI 2431c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24320 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24324 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2432c .cfa: x29 32 + +STACK CFI 24330 x19: .cfa -16 + ^ +STACK CFI 24354 x19: x19 +STACK CFI 24358 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2435c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24360 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24368 .cfa: x29 32 + +STACK CFI 2436c x19: .cfa -16 + ^ +STACK CFI 24390 x19: x19 +STACK CFI 24394 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24398 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2439c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 243a4 .cfa: x29 32 + +STACK CFI 243a8 x19: .cfa -16 + ^ +STACK CFI 243cc x19: x19 +STACK CFI 243d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 243d4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 243d8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 243e0 .cfa: x29 32 + +STACK CFI 243e4 x19: .cfa -16 + ^ +STACK CFI 24408 x19: x19 +STACK CFI 2440c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24410 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24414 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2441c .cfa: x29 32 + +STACK CFI 24420 x19: .cfa -16 + ^ +STACK CFI 24444 x19: x19 +STACK CFI 24448 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2444c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24450 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24458 .cfa: x29 32 + +STACK CFI 2445c x19: .cfa -16 + ^ +STACK CFI 24480 x19: x19 +STACK CFI 24484 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24488 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2448c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24494 .cfa: x29 32 + +STACK CFI 24498 x19: .cfa -16 + ^ +STACK CFI 244bc x19: x19 +STACK CFI 244c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 244c4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 244c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 244d0 .cfa: x29 32 + +STACK CFI 244d4 x19: .cfa -16 + ^ +STACK CFI 244f8 x19: x19 +STACK CFI 244fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24500 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24504 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2450c .cfa: x29 32 + +STACK CFI 24510 x19: .cfa -16 + ^ +STACK CFI 24534 x19: x19 +STACK CFI 24538 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2453c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24540 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24548 .cfa: x29 32 + +STACK CFI 2454c x19: .cfa -16 + ^ +STACK CFI 24570 x19: x19 +STACK CFI 24574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24578 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2457c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24584 .cfa: x29 32 + +STACK CFI 24588 x19: .cfa -16 + ^ +STACK CFI 245ac x19: x19 +STACK CFI 245b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 245b4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 245b8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 245c0 .cfa: x29 32 + +STACK CFI 245c4 x19: .cfa -16 + ^ +STACK CFI 245e8 x19: x19 +STACK CFI 245ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 245f0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 245f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 245fc .cfa: x29 32 + +STACK CFI 24600 x19: .cfa -16 + ^ +STACK CFI 24624 x19: x19 +STACK CFI 24628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2462c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24630 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24638 .cfa: x29 32 + +STACK CFI 2463c x19: .cfa -16 + ^ +STACK CFI 24660 x19: x19 +STACK CFI 24664 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24668 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2466c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24674 .cfa: x29 32 + +STACK CFI 24678 x19: .cfa -16 + ^ +STACK CFI 2469c x19: x19 +STACK CFI 246a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 246a4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 246a8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 246b0 .cfa: x29 32 + +STACK CFI 246b4 x19: .cfa -16 + ^ +STACK CFI 246d8 x19: x19 +STACK CFI 246dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 246e0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 246e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 246ec .cfa: x29 32 + +STACK CFI 246f0 x19: .cfa -16 + ^ +STACK CFI 24714 x19: x19 +STACK CFI 24718 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2471c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24720 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24728 .cfa: x29 32 + +STACK CFI 2472c x19: .cfa -16 + ^ +STACK CFI 24750 x19: x19 +STACK CFI 24754 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24758 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2475c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24764 .cfa: x29 32 + +STACK CFI 24768 x19: .cfa -16 + ^ +STACK CFI 2478c x19: x19 +STACK CFI 24790 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24884 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24918 28 .cfa: sp 0 + .ra: x30 +STACK CFI 2491c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24920 .cfa: x29 32 + +STACK CFI 24924 x19: .cfa -16 + ^ +STACK CFI 24938 x19: x19 +STACK CFI 2493c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24998 60 .cfa: sp 0 + .ra: x30 +STACK CFI 2499c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 249a0 .cfa: x29 48 + +STACK CFI 249a8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 249ec x19: x19 x20: x20 +STACK CFI 249f0 x21: x21 +STACK CFI 249f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 249f8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24c60 98 .cfa: sp 0 + .ra: x30 +STACK CFI 24c64 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24c68 .cfa: x29 64 + +STACK CFI 24c70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24cec x19: x19 x20: x20 +STACK CFI 24cf0 x21: x21 +STACK CFI 24cf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d50 60 .cfa: sp 0 + .ra: x30 +STACK CFI 24d54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24d60 .cfa: x29 32 + +STACK CFI 24d64 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 24da8 x19: x19 x20: x20 +STACK CFI 24dac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24db0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 24db4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24db8 .cfa: x29 48 + +STACK CFI 24dbc x19: .cfa -32 + ^ +STACK CFI 24e10 x19: x19 +STACK CFI 24e14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24e18 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24e1c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24e24 .cfa: x29 32 + +STACK CFI 24e28 x19: .cfa -16 + ^ +STACK CFI 24e44 x19: x19 +STACK CFI 24e48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24e4c 50 .cfa: sp 0 + .ra: x30 +STACK CFI 24e50 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24e54 .cfa: x29 48 + +STACK CFI 24e58 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24e94 x19: x19 x20: x20 +STACK CFI 24e98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24e9c bc .cfa: sp 0 + .ra: x30 +STACK CFI 24ea0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24ea4 .cfa: x29 64 + +STACK CFI 24eac x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24f4c x21: x21 +STACK CFI 24f50 x19: x19 x20: x20 +STACK CFI 24f54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24f58 e8 .cfa: sp 0 + .ra: x30 +STACK CFI 24f5c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24f60 .cfa: x29 64 + +STACK CFI 24f64 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 24f70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 25034 x19: x19 x20: x20 +STACK CFI 25038 x21: x21 x22: x22 +STACK CFI 2503c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25040 64 .cfa: sp 0 + .ra: x30 +STACK CFI 25044 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25048 .cfa: x29 48 + +STACK CFI 2504c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25058 x21: .cfa -16 + ^ +STACK CFI 25098 x19: x19 x20: x20 +STACK CFI 2509c x21: x21 +STACK CFI 250a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250fc 4c .cfa: sp 0 + .ra: x30 +STACK CFI 25100 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25104 .cfa: x29 48 + +STACK CFI 25108 x19: .cfa -32 + ^ +STACK CFI 25140 x19: x19 +STACK CFI 25144 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25148 7c .cfa: sp 0 + .ra: x30 +STACK CFI 2514c .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 25150 .cfa: x29 384 + +STACK CFI 25154 x19: .cfa -368 + ^ x20: .cfa -360 + ^ +STACK CFI 2515c x21: .cfa -352 + ^ +STACK CFI 251b8 x21: x21 +STACK CFI 251bc x19: x19 x20: x20 +STACK CFI 251c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251c4 2c .cfa: sp 0 + .ra: x30 +STACK CFI 251c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 251cc .cfa: x29 32 + +STACK CFI 251d0 x19: .cfa -16 + ^ +STACK CFI 251e8 x19: x19 +STACK CFI 251ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25768 13c .cfa: sp 0 + .ra: x30 +STACK CFI 2576c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 25770 .cfa: x29 64 + +STACK CFI 25778 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 25898 x19: x19 x20: x20 +STACK CFI 2589c x21: x21 x22: x22 +STACK CFI 258a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 258a4 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 258a8 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 258ac .cfa: x29 80 + +STACK CFI 258b4 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 25954 x21: x21 +STACK CFI 2595c x19: x19 x20: x20 +STACK CFI 25960 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25964 104 .cfa: sp 0 + .ra: x30 +STACK CFI 25968 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 2596c .cfa: x29 80 + +STACK CFI 25978 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 25a58 x19: x19 x20: x20 +STACK CFI 25a5c x21: x21 x22: x22 +STACK CFI 25a60 x23: x23 x24: x24 +STACK CFI 25a64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25a68 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 25a6c .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 25a70 .cfa: x29 80 + +STACK CFI 25a78 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 25b18 x21: x21 +STACK CFI 25b20 x19: x19 x20: x20 +STACK CFI 25b24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b28 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25bb0 164 .cfa: sp 0 + .ra: x30 +STACK CFI 25bb4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 25bbc .cfa: x29 80 + +STACK CFI 25bc8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 25d04 x23: x23 +STACK CFI 25d08 x19: x19 x20: x20 +STACK CFI 25d0c x21: x21 x22: x22 +STACK CFI 25d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25d14 90 .cfa: sp 0 + .ra: x30 +STACK CFI 25d18 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25d1c .cfa: x29 48 + +STACK CFI 25d20 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25d2c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 25d98 x19: x19 x20: x20 +STACK CFI 25d9c x21: x21 x22: x22 +STACK CFI 25da0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25da4 234 .cfa: sp 0 + .ra: x30 +STACK CFI 25da8 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI 25dac .cfa: x29 272 + +STACK CFI 25db0 x21: .cfa -240 + ^ x22: .cfa -232 + ^ +STACK CFI 25dc0 x19: .cfa -256 + ^ x20: .cfa -248 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ +STACK CFI 25dcc x25: .cfa -208 + ^ x26: .cfa -200 + ^ +STACK CFI 25fc4 x19: x19 x20: x20 +STACK CFI 25fc8 x21: x21 x22: x22 +STACK CFI 25fcc x23: x23 x24: x24 +STACK CFI 25fd0 x25: x25 x26: x26 +STACK CFI 25fd4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25fd8 34 .cfa: sp 0 + .ra: x30 +STACK CFI 25fdc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25fe0 .cfa: x29 48 + +STACK CFI 25fe4 x19: .cfa -32 + ^ +STACK CFI 26004 x19: x19 +STACK CFI 26008 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2600c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 26018 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 2601c .cfa: x29 16 + +STACK CFI 2602c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26030 98 .cfa: sp 0 + .ra: x30 +STACK CFI 26034 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 26038 .cfa: x29 128 + +STACK CFI 26044 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ +STACK CFI 260b8 x23: x23 +STACK CFI 260bc x19: x19 x20: x20 +STACK CFI 260c0 x21: x21 x22: x22 +STACK CFI 260c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 260c8 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 260cc .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 260d0 .cfa: x29 80 + +STACK CFI 260d8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 26178 x21: x21 +STACK CFI 26180 x19: x19 x20: x20 +STACK CFI 26184 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26188 54 .cfa: sp 0 + .ra: x30 +STACK CFI 2618c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26190 .cfa: x29 64 + +STACK CFI 26194 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 261d4 x19: x19 x20: x20 +STACK CFI 261d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 261dc 64 .cfa: sp 0 + .ra: x30 +STACK CFI 261e0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 261e4 .cfa: x29 64 + +STACK CFI 261e8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26238 x19: x19 x20: x20 +STACK CFI 2623c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26240 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26244 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26248 .cfa: x29 64 + +STACK CFI 2624c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2628c x19: x19 x20: x20 +STACK CFI 26290 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26294 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26298 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2629c .cfa: x29 64 + +STACK CFI 262a0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 262e0 x19: x19 x20: x20 +STACK CFI 262e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 262e8 54 .cfa: sp 0 + .ra: x30 +STACK CFI 262ec .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 262f0 .cfa: x29 64 + +STACK CFI 262f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26334 x19: x19 x20: x20 +STACK CFI 26338 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2633c 104 .cfa: sp 0 + .ra: x30 +STACK CFI 26340 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26348 .cfa: x29 80 + +STACK CFI 26350 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ +STACK CFI 26358 x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 26430 x23: x23 +STACK CFI 26434 x19: x19 x20: x20 +STACK CFI 26438 x21: x21 x22: x22 +STACK CFI 2643c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26440 8c .cfa: sp 0 + .ra: x30 +STACK CFI 26444 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26448 .cfa: x29 64 + +STACK CFI 2644c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2645c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 264c0 x19: x19 x20: x20 +STACK CFI 264c4 x21: x21 x22: x22 +STACK CFI 264c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 264cc 370 .cfa: sp 0 + .ra: x30 +STACK CFI 264d0 .cfa: sp 368 + .ra: .cfa -360 + ^ x29: .cfa -368 + ^ +STACK CFI 264d4 .cfa: x29 368 + +STACK CFI 264e8 x19: .cfa -352 + ^ x20: .cfa -344 + ^ x21: .cfa -336 + ^ x22: .cfa -328 + ^ x23: .cfa -320 + ^ x24: .cfa -312 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ x27: .cfa -288 + ^ x28: .cfa -280 + ^ +STACK CFI 26824 x19: x19 x20: x20 +STACK CFI 26828 x21: x21 x22: x22 +STACK CFI 2682c x23: x23 x24: x24 +STACK CFI 26830 x25: x25 x26: x26 +STACK CFI 26834 x27: x27 x28: x28 +STACK CFI 26838 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2683c 28 .cfa: sp 0 + .ra: x30 +STACK CFI 26840 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 26848 .cfa: x29 32 + +STACK CFI 2684c x19: .cfa -16 + ^ +STACK CFI 2685c x19: x19 +STACK CFI 26860 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26864 70 .cfa: sp 0 + .ra: x30 +STACK CFI 26868 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 2686c .cfa: x29 96 + +STACK CFI 26874 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 268c8 x19: x19 x20: x20 +STACK CFI 268cc x21: x21 x22: x22 +STACK CFI 268d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 268d4 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 268d8 .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 268dc .cfa: x29 480 + +STACK CFI 268e0 x21: .cfa -448 + ^ x22: .cfa -440 + ^ +STACK CFI 268f4 x19: .cfa -464 + ^ x20: .cfa -456 + ^ x23: .cfa -432 + ^ +STACK CFI 26974 x23: x23 +STACK CFI 26978 x19: x19 x20: x20 +STACK CFI 2697c x21: x21 x22: x22 +STACK CFI 26980 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26aa8 88 .cfa: sp 0 + .ra: x30 +STACK CFI 26aac .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 26ab4 .cfa: x29 336 + +STACK CFI 26ab8 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 26ac0 x21: .cfa -304 + ^ +STACK CFI 26b20 x21: x21 +STACK CFI 26b28 x19: x19 x20: x20 +STACK CFI 26b2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26b30 114 .cfa: sp 0 + .ra: x30 +STACK CFI 26b34 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 26b38 .cfa: x29 224 + +STACK CFI 26b3c x19: .cfa -208 + ^ x20: .cfa -200 + ^ +STACK CFI 26b48 x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ +STACK CFI 26c30 x23: x23 +STACK CFI 26c38 x19: x19 x20: x20 +STACK CFI 26c3c x21: x21 x22: x22 +STACK CFI 26c40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26c44 44 .cfa: sp 0 + .ra: x30 +STACK CFI 26c48 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 26c4c .cfa: x29 32 + +STACK CFI 26c58 x19: .cfa -16 + ^ +STACK CFI 26c80 x19: x19 +STACK CFI 26c84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26c88 9c .cfa: sp 0 + .ra: x30 +STACK CFI 26c8c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 26c90 .cfa: x29 160 + +STACK CFI 26c98 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 26d18 x19: x19 x20: x20 +STACK CFI 26d1c x21: x21 x22: x22 +STACK CFI 26d20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26d24 1f8 .cfa: sp 0 + .ra: x30 +STACK CFI 26d28 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 26d2c .cfa: x29 176 + +STACK CFI 26d38 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ +STACK CFI 26f0c x23: x23 +STACK CFI 26f10 x19: x19 x20: x20 +STACK CFI 26f14 x21: x21 x22: x22 +STACK CFI 26f18 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26f1c 5c .cfa: sp 0 + .ra: x30 +STACK CFI 26f20 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 26f28 .cfa: x29 336 + +STACK CFI 26f2c x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 26f34 x21: .cfa -304 + ^ +STACK CFI 26f68 x21: x21 +STACK CFI 26f70 x19: x19 x20: x20 +STACK CFI 26f74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26f78 9c .cfa: sp 0 + .ra: x30 +STACK CFI 26f7c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 26f80 .cfa: x29 160 + +STACK CFI 26f88 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 27008 x19: x19 x20: x20 +STACK CFI 2700c x21: x21 x22: x22 +STACK CFI 27010 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27014 9c .cfa: sp 0 + .ra: x30 +STACK CFI 27018 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 2701c .cfa: x29 160 + +STACK CFI 27024 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 270a4 x19: x19 x20: x20 +STACK CFI 270a8 x21: x21 x22: x22 +STACK CFI 270ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 270b0 39c .cfa: sp 0 + .ra: x30 +STACK CFI 270b4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 270b8 .cfa: x29 176 + +STACK CFI 270c4 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x23: .cfa -128 + ^ x24: .cfa -120 + ^ +STACK CFI 270d0 x25: .cfa -112 + ^ x26: .cfa -104 + ^ +STACK CFI 270e0 x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 273f8 x19: x19 x20: x20 +STACK CFI 273fc x21: x21 x22: x22 +STACK CFI 27400 x23: x23 x24: x24 +STACK CFI 27404 x25: x25 x26: x26 +STACK CFI 27408 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2740c .cfa: x29 176 + .ra: .cfa -168 + ^ x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ x24: .cfa -120 + ^ x25: .cfa -112 + ^ x26: .cfa -104 + ^ x29: .cfa -176 + ^ +STACK CFI 27438 x19: x19 x20: x20 +STACK CFI 2743c x21: x21 x22: x22 +STACK CFI 27440 x23: x23 x24: x24 +STACK CFI 27444 x25: x25 x26: x26 +STACK CFI 27448 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2744c 134 .cfa: sp 0 + .ra: x30 +STACK CFI 27450 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 27454 .cfa: x29 224 + +STACK CFI 27460 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ +STACK CFI 27570 x23: x23 +STACK CFI 27574 x19: x19 x20: x20 +STACK CFI 27578 x21: x21 x22: x22 +STACK CFI 2757c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27580 2d0 .cfa: sp 0 + .ra: x30 +STACK CFI 27584 .cfa: sp 480 + +STACK CFI 27588 .cfa: sp 576 + .ra: .cfa -568 + ^ x29: .cfa -576 + ^ +STACK CFI 2758c .cfa: x29 576 + +STACK CFI 27590 x23: .cfa -528 + ^ x24: .cfa -520 + ^ +STACK CFI 275a4 x19: .cfa -560 + ^ x20: .cfa -552 + ^ x21: .cfa -544 + ^ x22: .cfa -536 + ^ x25: .cfa -512 + ^ x26: .cfa -504 + ^ +STACK CFI 275b0 x27: .cfa -496 + ^ x28: .cfa -488 + ^ +STACK CFI 27834 x19: x19 x20: x20 +STACK CFI 27838 x21: x21 x22: x22 +STACK CFI 2783c x23: x23 x24: x24 +STACK CFI 27840 x25: x25 x26: x26 +STACK CFI 27844 x27: x27 x28: x28 +STACK CFI 27848 .cfa: sp 480 + .ra: .ra x29: x29 +STACK CFI 2784c .cfa: sp 384 + +STACK CFI INIT 27850 88 .cfa: sp 0 + .ra: x30 +STACK CFI 27854 .cfa: sp 352 + .ra: .cfa -344 + ^ x29: .cfa -352 + ^ +STACK CFI 2785c .cfa: x29 352 + +STACK CFI 27860 x19: .cfa -336 + ^ x20: .cfa -328 + ^ +STACK CFI 27870 x21: .cfa -320 + ^ +STACK CFI 278cc x21: x21 +STACK CFI 278d0 x19: x19 x20: x20 +STACK CFI 278d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 278d8 114 .cfa: sp 0 + .ra: x30 +STACK CFI 278dc .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 278e0 .cfa: x29 224 + +STACK CFI 278e4 x19: .cfa -208 + ^ x20: .cfa -200 + ^ +STACK CFI 278f0 x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ +STACK CFI 279d8 x23: x23 +STACK CFI 279e0 x19: x19 x20: x20 +STACK CFI 279e4 x21: x21 x22: x22 +STACK CFI 279e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 279ec 5c .cfa: sp 0 + .ra: x30 +STACK CFI 279f0 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 279f8 .cfa: x29 336 + +STACK CFI 279fc x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 27a04 x21: .cfa -304 + ^ +STACK CFI 27a38 x21: x21 +STACK CFI 27a40 x19: x19 x20: x20 +STACK CFI 27a44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27a48 134 .cfa: sp 0 + .ra: x30 +STACK CFI 27a4c .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 27a50 .cfa: x29 224 + +STACK CFI 27a5c x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ +STACK CFI 27b6c x23: x23 +STACK CFI 27b70 x19: x19 x20: x20 +STACK CFI 27b74 x21: x21 x22: x22 +STACK CFI 27b78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27b7c 9c .cfa: sp 0 + .ra: x30 +STACK CFI 27b80 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 27b84 .cfa: x29 160 + +STACK CFI 27b8c x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 27c0c x19: x19 x20: x20 +STACK CFI 27c10 x21: x21 x22: x22 +STACK CFI 27c14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27c18 158 .cfa: sp 0 + .ra: x30 +STACK CFI 27c1c .cfa: sp 464 + .ra: .cfa -456 + ^ x29: .cfa -464 + ^ +STACK CFI 27c20 .cfa: x29 464 + +STACK CFI 27c24 x19: .cfa -448 + ^ x20: .cfa -440 + ^ +STACK CFI 27c34 x23: .cfa -416 + ^ x24: .cfa -408 + ^ x25: .cfa -400 + ^ x26: .cfa -392 + ^ x27: .cfa -384 + ^ +STACK CFI 27c48 x21: .cfa -432 + ^ x22: .cfa -424 + ^ +STACK CFI 27d54 x27: x27 +STACK CFI 27d5c x19: x19 x20: x20 +STACK CFI 27d60 x21: x21 x22: x22 +STACK CFI 27d64 x23: x23 x24: x24 +STACK CFI 27d68 x25: x25 x26: x26 +STACK CFI 27d6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27d70 5c .cfa: sp 0 + .ra: x30 +STACK CFI 27d74 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 27d7c .cfa: x29 336 + +STACK CFI 27d80 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 27d88 x21: .cfa -304 + ^ +STACK CFI 27dbc x21: x21 +STACK CFI 27dc4 x19: x19 x20: x20 +STACK CFI 27dc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27dcc c0 .cfa: sp 0 + .ra: x30 +STACK CFI 27dd0 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 27dd4 .cfa: x29 160 + +STACK CFI 27de0 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ +STACK CFI 27e7c x19: x19 x20: x20 +STACK CFI 27e80 x21: x21 x22: x22 +STACK CFI 27e84 x23: x23 x24: x24 +STACK CFI 27e88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27e8c 1e8 .cfa: sp 0 + .ra: x30 +STACK CFI 27e90 .cfa: sp 448 + +STACK CFI 27e94 .cfa: sp 512 + .ra: .cfa -504 + ^ x29: .cfa -512 + ^ +STACK CFI 27e98 .cfa: x29 512 + +STACK CFI 27e9c x21: .cfa -480 + ^ x22: .cfa -472 + ^ +STACK CFI 27eb0 x19: .cfa -496 + ^ x20: .cfa -488 + ^ x23: .cfa -464 + ^ x24: .cfa -456 + ^ +STACK CFI 28060 x19: x19 x20: x20 +STACK CFI 28064 x21: x21 x22: x22 +STACK CFI 28068 x23: x23 x24: x24 +STACK CFI 2806c .cfa: sp 448 + .ra: .ra x29: x29 +STACK CFI 28070 .cfa: sp 384 + +STACK CFI INIT 28074 5c .cfa: sp 0 + .ra: x30 +STACK CFI 28078 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 28080 .cfa: x29 336 + +STACK CFI 28084 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 2808c x21: .cfa -304 + ^ +STACK CFI 280c0 x21: x21 +STACK CFI 280c8 x19: x19 x20: x20 +STACK CFI 280cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 280d0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 280d4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 280d8 .cfa: x29 160 + +STACK CFI 280e0 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 28160 x19: x19 x20: x20 +STACK CFI 28164 x21: x21 x22: x22 +STACK CFI 28168 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2816c 9c .cfa: sp 0 + .ra: x30 +STACK CFI 28170 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 28174 .cfa: x29 160 + +STACK CFI 2817c x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 281fc x19: x19 x20: x20 +STACK CFI 28200 x21: x21 x22: x22 +STACK CFI 28204 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28208 9c .cfa: sp 0 + .ra: x30 +STACK CFI 2820c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 28210 .cfa: x29 160 + +STACK CFI 28218 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 28298 x19: x19 x20: x20 +STACK CFI 2829c x21: x21 x22: x22 +STACK CFI 282a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28540 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 28544 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28548 .cfa: x29 80 + +STACK CFI 28550 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 285e0 x21: x21 +STACK CFI 285e8 x19: x19 x20: x20 +STACK CFI 285ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 285f0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 285f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 285f8 .cfa: x29 32 + +STACK CFI 285fc x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 28648 x19: x19 x20: x20 +STACK CFI 2864c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28714 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 28718 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2871c .cfa: x29 48 + +STACK CFI 28724 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 287c0 x21: x21 +STACK CFI 287c4 x19: x19 x20: x20 +STACK CFI 287c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 208f4 858 .cfa: sp 0 + .ra: x30 +STACK CFI 208f8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 208fc .cfa: x29 64 + +STACK CFI 20904 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 21138 x21: x21 +STACK CFI 21140 x19: x19 x20: x20 +STACK CFI 21144 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 289c8 3e4 .cfa: sp 0 + .ra: x30 +STACK CFI 289cc .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 289d0 .cfa: x29 384 + +STACK CFI 289d4 x23: .cfa -336 + ^ x24: .cfa -328 + ^ +STACK CFI 289e0 x25: .cfa -320 + ^ x26: .cfa -312 + ^ x27: .cfa -304 + ^ +STACK CFI 289f0 x19: .cfa -368 + ^ x20: .cfa -360 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ +STACK CFI 28d94 x27: x27 +STACK CFI 28d98 x19: x19 x20: x20 +STACK CFI 28d9c x21: x21 x22: x22 +STACK CFI 28da0 x23: x23 x24: x24 +STACK CFI 28da4 x25: x25 x26: x26 +STACK CFI 28da8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28dac a8 .cfa: sp 0 + .ra: x30 +STACK CFI 28db0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 28db4 .cfa: x29 64 + +STACK CFI 28db8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 28e4c x19: x19 x20: x20 +STACK CFI 28e50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28e54 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 28e58 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 28e5c .cfa: x29 64 + +STACK CFI 28e60 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 28ef4 x19: x19 x20: x20 +STACK CFI 28ef8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28efc 1a4 .cfa: sp 0 + .ra: x30 +STACK CFI 28f00 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 28f04 .cfa: x29 192 + +STACK CFI 28f08 x19: .cfa -176 + ^ x20: .cfa -168 + ^ +STACK CFI 28f1c x21: .cfa -160 + ^ x22: .cfa -152 + ^ x23: .cfa -144 + ^ +STACK CFI 29090 x23: x23 +STACK CFI 29094 x19: x19 x20: x20 +STACK CFI 29098 x21: x21 x22: x22 +STACK CFI 2909c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 290a0 1a4 .cfa: sp 0 + .ra: x30 +STACK CFI 290a4 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 290a8 .cfa: x29 192 + +STACK CFI 290ac x19: .cfa -176 + ^ x20: .cfa -168 + ^ +STACK CFI 290c0 x21: .cfa -160 + ^ x22: .cfa -152 + ^ x23: .cfa -144 + ^ +STACK CFI 29234 x23: x23 +STACK CFI 29238 x19: x19 x20: x20 +STACK CFI 2923c x21: x21 x22: x22 +STACK CFI 29240 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 29244 1a4 .cfa: sp 0 + .ra: x30 +STACK CFI 29248 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 2924c .cfa: x29 192 + +STACK CFI 29250 x19: .cfa -176 + ^ x20: .cfa -168 + ^ +STACK CFI 29264 x21: .cfa -160 + ^ x22: .cfa -152 + ^ x23: .cfa -144 + ^ +STACK CFI 293d8 x23: x23 +STACK CFI 293dc x19: x19 x20: x20 +STACK CFI 293e0 x21: x21 x22: x22 +STACK CFI 293e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 293e8 1a4 .cfa: sp 0 + .ra: x30 +STACK CFI 293ec .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 293f0 .cfa: x29 192 + +STACK CFI 293f4 x19: .cfa -176 + ^ x20: .cfa -168 + ^ +STACK CFI 29408 x21: .cfa -160 + ^ x22: .cfa -152 + ^ x23: .cfa -144 + ^ +STACK CFI 2957c x23: x23 +STACK CFI 29580 x19: x19 x20: x20 +STACK CFI 29584 x21: x21 x22: x22 +STACK CFI 29588 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2958c fc .cfa: sp 0 + .ra: x30 +STACK CFI 29590 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 29594 .cfa: x29 160 + +STACK CFI 29598 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 295a0 x21: .cfa -128 + ^ +STACK CFI 2967c x21: x21 +STACK CFI 29680 x19: x19 x20: x20 +STACK CFI 29684 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 29688 324 .cfa: sp 0 + .ra: x30 +STACK CFI 2968c .cfa: sp 464 + .ra: .cfa -456 + ^ x29: .cfa -464 + ^ +STACK CFI 29690 .cfa: x29 464 + +STACK CFI 29694 x23: .cfa -416 + ^ x24: .cfa -408 + ^ +STACK CFI 296a8 x19: .cfa -448 + ^ x20: .cfa -440 + ^ x21: .cfa -432 + ^ x22: .cfa -424 + ^ x25: .cfa -400 + ^ x26: .cfa -392 + ^ +STACK CFI 29998 x19: x19 x20: x20 +STACK CFI 2999c x21: x21 x22: x22 +STACK CFI 299a0 x23: x23 x24: x24 +STACK CFI 299a4 x25: x25 x26: x26 +STACK CFI 299a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 299ac 13c .cfa: sp 0 + .ra: x30 +STACK CFI 299b0 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 299b4 .cfa: x29 416 + +STACK CFI 299b8 x21: .cfa -384 + ^ x22: .cfa -376 + ^ +STACK CFI 299c4 x19: .cfa -400 + ^ x20: .cfa -392 + ^ +STACK CFI 29adc x19: x19 x20: x20 +STACK CFI 29ae0 x21: x21 x22: x22 +STACK CFI 29ae4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 29ae8 13c .cfa: sp 0 + .ra: x30 +STACK CFI 29aec .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 29af0 .cfa: x29 416 + +STACK CFI 29af4 x21: .cfa -384 + ^ x22: .cfa -376 + ^ +STACK CFI 29b00 x19: .cfa -400 + ^ x20: .cfa -392 + ^ +STACK CFI 29c18 x19: x19 x20: x20 +STACK CFI 29c1c x21: x21 x22: x22 +STACK CFI 29c20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 29c24 140 .cfa: sp 0 + .ra: x30 +STACK CFI 29c28 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 29c2c .cfa: x29 416 + +STACK CFI 29c30 x21: .cfa -384 + ^ x22: .cfa -376 + ^ +STACK CFI 29c3c x19: .cfa -400 + ^ x20: .cfa -392 + ^ +STACK CFI 29d58 x19: x19 x20: x20 +STACK CFI 29d5c x21: x21 x22: x22 +STACK CFI 29d60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 29d64 140 .cfa: sp 0 + .ra: x30 +STACK CFI 29d68 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 29d6c .cfa: x29 416 + +STACK CFI 29d70 x21: .cfa -384 + ^ x22: .cfa -376 + ^ +STACK CFI 29d7c x19: .cfa -400 + ^ x20: .cfa -392 + ^ +STACK CFI 29e98 x19: x19 x20: x20 +STACK CFI 29e9c x21: x21 x22: x22 +STACK CFI 29ea0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 29ea4 9c4 .cfa: sp 0 + .ra: x30 +STACK CFI 29ea8 .cfa: sp 4096 + +STACK CFI 29eb0 .cfa: sp 5648 + +STACK CFI 29ebc .cfa: sp 5760 + .ra: .cfa -5752 + ^ x29: .cfa -5760 + ^ +STACK CFI 29ec0 .cfa: x29 5760 + +STACK CFI 29ec4 x19: .cfa -5744 + ^ x20: .cfa -5736 + ^ +STACK CFI 29ecc x23: .cfa -5712 + ^ x24: .cfa -5704 + ^ +STACK CFI 29ee8 v8: .cfa -5664 + ^ x21: .cfa -5728 + ^ x22: .cfa -5720 + ^ x25: .cfa -5696 + ^ x26: .cfa -5688 + ^ x27: .cfa -5680 + ^ x28: .cfa -5672 + ^ +STACK CFI 2a844 x19: x19 x20: x20 +STACK CFI 2a848 x21: x21 x22: x22 +STACK CFI 2a84c x23: x23 x24: x24 +STACK CFI 2a850 x25: x25 x26: x26 +STACK CFI 2a854 x27: x27 x28: x28 +STACK CFI 2a858 v8: v8 +STACK CFI 2a85c .cfa: sp 5648 + .ra: .ra x29: x29 +STACK CFI 2a860 .cfa: sp 4096 + +STACK CFI 2a864 .cfa: sp 3984 + +STACK CFI INIT 2a868 aa4 .cfa: sp 0 + .ra: x30 +STACK CFI 2a86c .cfa: sp 800 + +STACK CFI 2a870 .cfa: sp 912 + .ra: .cfa -904 + ^ x29: .cfa -912 + ^ +STACK CFI 2a874 .cfa: x29 912 + +STACK CFI 2a878 x27: .cfa -832 + ^ x28: .cfa -824 + ^ +STACK CFI 2a890 v8: .cfa -816 + ^ x19: .cfa -896 + ^ x20: .cfa -888 + ^ x21: .cfa -880 + ^ x22: .cfa -872 + ^ x23: .cfa -864 + ^ x24: .cfa -856 + ^ +STACK CFI 2a898 x25: .cfa -848 + ^ x26: .cfa -840 + ^ +STACK CFI 2b2ec v8: v8 +STACK CFI 2b2f0 x19: x19 x20: x20 +STACK CFI 2b2f4 x21: x21 x22: x22 +STACK CFI 2b2f8 x23: x23 x24: x24 +STACK CFI 2b2fc x25: x25 x26: x26 +STACK CFI 2b300 x27: x27 x28: x28 +STACK CFI 2b304 .cfa: sp 800 + .ra: .ra x29: x29 +STACK CFI 2b308 .cfa: sp 688 + +STACK CFI INIT 2b30c 9b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2b310 .cfa: sp 640 + +STACK CFI 2b314 .cfa: sp 736 + .ra: .cfa -728 + ^ x29: .cfa -736 + ^ +STACK CFI 2b318 .cfa: x29 736 + +STACK CFI 2b31c x27: .cfa -656 + ^ x28: .cfa -648 + ^ +STACK CFI 2b334 x19: .cfa -720 + ^ x20: .cfa -712 + ^ x21: .cfa -704 + ^ x22: .cfa -696 + ^ x23: .cfa -688 + ^ x24: .cfa -680 + ^ x25: .cfa -672 + ^ x26: .cfa -664 + ^ +STACK CFI 2bca4 x19: x19 x20: x20 +STACK CFI 2bca8 x21: x21 x22: x22 +STACK CFI 2bcac x23: x23 x24: x24 +STACK CFI 2bcb0 x25: x25 x26: x26 +STACK CFI 2bcb4 x27: x27 x28: x28 +STACK CFI 2bcb8 .cfa: sp 640 + .ra: .ra x29: x29 +STACK CFI 2bcbc .cfa: sp 544 + +STACK CFI INIT 2bcc0 9b8 .cfa: sp 0 + .ra: x30 +STACK CFI 2bcc4 .cfa: sp 640 + +STACK CFI 2bcc8 .cfa: sp 736 + .ra: .cfa -728 + ^ x29: .cfa -736 + ^ +STACK CFI 2bccc .cfa: x29 736 + +STACK CFI 2bcd0 x27: .cfa -656 + ^ x28: .cfa -648 + ^ +STACK CFI 2bce8 x19: .cfa -720 + ^ x20: .cfa -712 + ^ x21: .cfa -704 + ^ x22: .cfa -696 + ^ x23: .cfa -688 + ^ x24: .cfa -680 + ^ x25: .cfa -672 + ^ x26: .cfa -664 + ^ +STACK CFI 2c65c x19: x19 x20: x20 +STACK CFI 2c660 x21: x21 x22: x22 +STACK CFI 2c664 x23: x23 x24: x24 +STACK CFI 2c668 x25: x25 x26: x26 +STACK CFI 2c66c x27: x27 x28: x28 +STACK CFI 2c670 .cfa: sp 640 + .ra: .ra x29: x29 +STACK CFI 2c674 .cfa: sp 544 + +STACK CFI INIT 2c678 5b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2c67c .cfa: sp 512 + +STACK CFI 2c680 .cfa: sp 608 + .ra: .cfa -600 + ^ x29: .cfa -608 + ^ +STACK CFI 2c684 .cfa: x29 608 + +STACK CFI 2c688 x25: .cfa -544 + ^ x26: .cfa -536 + ^ +STACK CFI 2c6a0 x19: .cfa -592 + ^ x20: .cfa -584 + ^ x21: .cfa -576 + ^ x22: .cfa -568 + ^ x23: .cfa -560 + ^ x24: .cfa -552 + ^ x27: .cfa -528 + ^ x28: .cfa -520 + ^ +STACK CFI 2cc10 x19: x19 x20: x20 +STACK CFI 2cc14 x21: x21 x22: x22 +STACK CFI 2cc18 x23: x23 x24: x24 +STACK CFI 2cc1c x25: x25 x26: x26 +STACK CFI 2cc20 x27: x27 x28: x28 +STACK CFI 2cc24 .cfa: sp 512 + .ra: .ra x29: x29 +STACK CFI 2cc28 .cfa: sp 416 + +STACK CFI INIT 2cc2c 8d8 .cfa: sp 0 + .ra: x30 +STACK CFI 2cc30 .cfa: sp 896 + +STACK CFI 2cc38 .cfa: sp 1024 + .ra: .cfa -1016 + ^ x29: .cfa -1024 + ^ +STACK CFI 2cc3c .cfa: x29 1024 + +STACK CFI 2cc44 v8: .cfa -928 + ^ v9: .cfa -920 + ^ x21: .cfa -992 + ^ x22: .cfa -984 + ^ +STACK CFI 2cc54 v10: .cfa -912 + ^ x19: .cfa -1008 + ^ x20: .cfa -1000 + ^ x23: .cfa -976 + ^ x24: .cfa -968 + ^ +STACK CFI 2cc60 x25: .cfa -960 + ^ x26: .cfa -952 + ^ x27: .cfa -944 + ^ x28: .cfa -936 + ^ +STACK CFI 2d458 v8: v8 v9: v9 +STACK CFI 2d45c x19: x19 x20: x20 +STACK CFI 2d460 x21: x21 x22: x22 +STACK CFI 2d464 x23: x23 x24: x24 +STACK CFI 2d468 x25: x25 x26: x26 +STACK CFI 2d46c x27: x27 x28: x28 +STACK CFI 2d470 v10: v10 +STACK CFI 2d474 .cfa: sp 896 + .ra: .ra x29: x29 +STACK CFI 2d478 .cfa: sp 768 + +STACK CFI 2d47c .cfa: x29 1024 + .ra: .cfa -1016 + ^ v10: .cfa -912 + ^ v8: .cfa -928 + ^ v9: .cfa -920 + ^ x19: .cfa -1008 + ^ x20: .cfa -1000 + ^ x21: .cfa -992 + ^ x22: .cfa -984 + ^ x23: .cfa -976 + ^ x24: .cfa -968 + ^ x25: .cfa -960 + ^ x26: .cfa -952 + ^ x27: .cfa -944 + ^ x28: .cfa -936 + ^ x29: .cfa -1024 + ^ +STACK CFI INIT 2d504 370 .cfa: sp 0 + .ra: x30 +STACK CFI 2d508 .cfa: sp 496 + +STACK CFI 2d50c .cfa: sp 576 + .ra: .cfa -568 + ^ x29: .cfa -576 + ^ +STACK CFI 2d510 .cfa: x29 576 + +STACK CFI 2d514 x25: .cfa -512 + ^ x26: .cfa -504 + ^ +STACK CFI 2d52c x19: .cfa -560 + ^ x20: .cfa -552 + ^ x21: .cfa -544 + ^ x22: .cfa -536 + ^ x23: .cfa -528 + ^ x24: .cfa -520 + ^ +STACK CFI 2d85c x19: x19 x20: x20 +STACK CFI 2d860 x21: x21 x22: x22 +STACK CFI 2d864 x23: x23 x24: x24 +STACK CFI 2d868 x25: x25 x26: x26 +STACK CFI 2d86c .cfa: sp 496 + .ra: .ra x29: x29 +STACK CFI 2d870 .cfa: sp 416 + +STACK CFI INIT 2d874 5b8 .cfa: sp 0 + .ra: x30 +STACK CFI 2d878 .cfa: sp 800 + +STACK CFI 2d87c .cfa: sp 928 + .ra: .cfa -920 + ^ x29: .cfa -928 + ^ +STACK CFI 2d880 .cfa: x29 928 + +STACK CFI 2d88c v10: .cfa -816 + ^ v8: .cfa -832 + ^ v9: .cfa -824 + ^ +STACK CFI 2d8a4 x19: .cfa -912 + ^ x20: .cfa -904 + ^ x21: .cfa -896 + ^ x22: .cfa -888 + ^ x23: .cfa -880 + ^ x24: .cfa -872 + ^ x25: .cfa -864 + ^ x26: .cfa -856 + ^ x27: .cfa -848 + ^ x28: .cfa -840 + ^ +STACK CFI 2de08 v8: v8 v9: v9 +STACK CFI 2de0c x19: x19 x20: x20 +STACK CFI 2de10 x21: x21 x22: x22 +STACK CFI 2de14 x23: x23 x24: x24 +STACK CFI 2de18 x25: x25 x26: x26 +STACK CFI 2de1c x27: x27 x28: x28 +STACK CFI 2de20 v10: v10 +STACK CFI 2de24 .cfa: sp 800 + .ra: .ra x29: x29 +STACK CFI 2de28 .cfa: sp 672 + +STACK CFI INIT 2de2c 488 .cfa: sp 0 + .ra: x30 +STACK CFI 2de30 .cfa: sp 464 + +STACK CFI 2de38 .cfa: sp 576 + .ra: .cfa -568 + ^ x29: .cfa -576 + ^ +STACK CFI 2de3c .cfa: x29 576 + +STACK CFI 2de40 x27: .cfa -496 + ^ x28: .cfa -488 + ^ +STACK CFI 2de58 v8: .cfa -480 + ^ x19: .cfa -560 + ^ x20: .cfa -552 + ^ x21: .cfa -544 + ^ x22: .cfa -536 + ^ x23: .cfa -528 + ^ x24: .cfa -520 + ^ x25: .cfa -512 + ^ x26: .cfa -504 + ^ +STACK CFI 2e294 v8: v8 +STACK CFI 2e298 x19: x19 x20: x20 +STACK CFI 2e29c x21: x21 x22: x22 +STACK CFI 2e2a0 x23: x23 x24: x24 +STACK CFI 2e2a4 x25: x25 x26: x26 +STACK CFI 2e2a8 x27: x27 x28: x28 +STACK CFI 2e2ac .cfa: sp 464 + .ra: .ra x29: x29 +STACK CFI 2e2b0 .cfa: sp 352 + +STACK CFI INIT 2e2b4 2d0 .cfa: sp 0 + .ra: x30 +STACK CFI 2e2b8 .cfa: sp 464 + +STACK CFI 2e2c0 .cfa: sp 544 + .ra: .cfa -536 + ^ x29: .cfa -544 + ^ +STACK CFI 2e2c4 .cfa: x29 544 + +STACK CFI 2e2d4 x19: .cfa -528 + ^ x20: .cfa -520 + ^ x21: .cfa -512 + ^ x22: .cfa -504 + ^ x23: .cfa -496 + ^ x24: .cfa -488 + ^ x25: .cfa -480 + ^ x26: .cfa -472 + ^ +STACK CFI 2e56c x19: x19 x20: x20 +STACK CFI 2e570 x21: x21 x22: x22 +STACK CFI 2e574 x23: x23 x24: x24 +STACK CFI 2e578 x25: x25 x26: x26 +STACK CFI 2e57c .cfa: sp 464 + .ra: .ra x29: x29 +STACK CFI 2e580 .cfa: sp 384 + +STACK CFI INIT 2e584 540 .cfa: sp 0 + .ra: x30 +STACK CFI 2e588 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 2e590 .cfa: x29 416 + +STACK CFI 2e594 x25: .cfa -352 + ^ x26: .cfa -344 + ^ +STACK CFI 2e5b0 x19: .cfa -400 + ^ x20: .cfa -392 + ^ x21: .cfa -384 + ^ x22: .cfa -376 + ^ x23: .cfa -368 + ^ x24: .cfa -360 + ^ x27: .cfa -336 + ^ x28: .cfa -328 + ^ +STACK CFI 2eaac x19: x19 x20: x20 +STACK CFI 2eab0 x21: x21 x22: x22 +STACK CFI 2eab4 x23: x23 x24: x24 +STACK CFI 2eab8 x25: x25 x26: x26 +STACK CFI 2eabc x27: x27 x28: x28 +STACK CFI 2eac0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2eac4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2eac8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2eacc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2ead4 .cfa: x29 32 + +STACK CFI 2ead8 x19: .cfa -16 + ^ +STACK CFI 2eafc x19: x19 +STACK CFI 2eb00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb04 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb08 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2eb1c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2eb20 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2eb24 .cfa: x29 32 + +STACK CFI 2eb28 x19: .cfa -16 + ^ +STACK CFI 2eb38 x19: x19 +STACK CFI 2eb3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24998 60 .cfa: sp 0 + .ra: x30 +STACK CFI 2499c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 249a0 .cfa: x29 48 + +STACK CFI 249a8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 249ec x19: x19 x20: x20 +STACK CFI 249f0 x21: x21 +STACK CFI 249f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 249f8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24c60 98 .cfa: sp 0 + .ra: x30 +STACK CFI 24c64 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24c68 .cfa: x29 64 + +STACK CFI 24c70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24cec x19: x19 x20: x20 +STACK CFI 24cf0 x21: x21 +STACK CFI 24cf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25768 13c .cfa: sp 0 + .ra: x30 +STACK CFI 2576c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 25770 .cfa: x29 64 + +STACK CFI 25778 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 25898 x19: x19 x20: x20 +STACK CFI 2589c x21: x21 x22: x22 +STACK CFI 258a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25964 104 .cfa: sp 0 + .ra: x30 +STACK CFI 25968 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 2596c .cfa: x29 80 + +STACK CFI 25978 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 25a58 x19: x19 x20: x20 +STACK CFI 25a5c x21: x21 x22: x22 +STACK CFI 25a60 x23: x23 x24: x24 +STACK CFI 25a64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b28 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 154 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 144 x23: x23 +STACK CFI 148 x19: x19 x20: x20 +STACK CFI 14c x21: x21 x22: x22 +STACK CFI 150 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 2ac .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI c .cfa: x29 272 + +STACK CFI 10 x19: .cfa -256 + ^ x20: .cfa -248 + ^ +STACK CFI 20 x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ x25: .cfa -208 + ^ +STACK CFI 298 x19: x19 x20: x20 +STACK CFI 29c x21: x21 x22: x22 +STACK CFI 2a0 x23: x23 x24: x24 +STACK CFI 2a4 x25: x25 +STACK CFI 2a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI 14 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ +STACK CFI 98 x23: x23 +STACK CFI 9c x19: x19 x20: x20 +STACK CFI a0 x21: x21 x22: x22 +STACK CFI a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26188 54 .cfa: sp 0 + .ra: x30 +STACK CFI 2618c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26190 .cfa: x29 64 + +STACK CFI 26194 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 261d4 x19: x19 x20: x20 +STACK CFI 261d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 261dc 64 .cfa: sp 0 + .ra: x30 +STACK CFI 261e0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 261e4 .cfa: x29 64 + +STACK CFI 261e8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26238 x19: x19 x20: x20 +STACK CFI 2623c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26240 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26244 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26248 .cfa: x29 64 + +STACK CFI 2624c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2628c x19: x19 x20: x20 +STACK CFI 26290 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26294 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26298 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2629c .cfa: x29 64 + +STACK CFI 262a0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 262e0 x19: x19 x20: x20 +STACK CFI 262e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 262e8 54 .cfa: sp 0 + .ra: x30 +STACK CFI 262ec .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 262f0 .cfa: x29 64 + +STACK CFI 262f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26334 x19: x19 x20: x20 +STACK CFI 26338 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI e4 x23: x23 +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26440 8c .cfa: sp 0 + .ra: x30 +STACK CFI 26444 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26448 .cfa: x29 64 + +STACK CFI 2644c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2645c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 264c0 x19: x19 x20: x20 +STACK CFI 264c4 x21: x21 x22: x22 +STACK CFI 264c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 264cc 370 .cfa: sp 0 + .ra: x30 +STACK CFI 264d0 .cfa: sp 368 + .ra: .cfa -360 + ^ x29: .cfa -368 + ^ +STACK CFI 264d4 .cfa: x29 368 + +STACK CFI 264e8 x19: .cfa -352 + ^ x20: .cfa -344 + ^ x21: .cfa -336 + ^ x22: .cfa -328 + ^ x23: .cfa -320 + ^ x24: .cfa -312 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ x27: .cfa -288 + ^ x28: .cfa -280 + ^ +STACK CFI 26824 x19: x19 x20: x20 +STACK CFI 26828 x21: x21 x22: x22 +STACK CFI 2682c x23: x23 x24: x24 +STACK CFI 26830 x25: x25 x26: x26 +STACK CFI 26834 x27: x27 x28: x28 +STACK CFI 26838 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26aa8 88 .cfa: sp 0 + .ra: x30 +STACK CFI 26aac .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 26ab4 .cfa: x29 336 + +STACK CFI 26ab8 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 26ac0 x21: .cfa -304 + ^ +STACK CFI 26b20 x21: x21 +STACK CFI 26b28 x19: x19 x20: x20 +STACK CFI 26b2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 8 .cfa: x29 224 + +STACK CFI 14 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ +STACK CFI 124 x23: x23 +STACK CFI 128 x19: x19 x20: x20 +STACK CFI 12c x21: x21 x22: x22 +STACK CFI 130 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb58 88 .cfa: sp 0 + .ra: x30 +STACK CFI 2eb5c .cfa: sp 352 + .ra: .cfa -344 + ^ x29: .cfa -352 + ^ +STACK CFI 2eb64 .cfa: x29 352 + +STACK CFI 2eb68 x19: .cfa -336 + ^ x20: .cfa -328 + ^ +STACK CFI 2eb78 x21: .cfa -320 + ^ +STACK CFI 2ebd4 x21: x21 +STACK CFI 2ebd8 x19: x19 x20: x20 +STACK CFI 2ebdc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2ebe0 148 .cfa: sp 0 + .ra: x30 +STACK CFI 2ebe4 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 2ebe8 .cfa: x29 224 + +STACK CFI 2ebf4 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ +STACK CFI 2ed18 x23: x23 +STACK CFI 2ed1c x19: x19 x20: x20 +STACK CFI 2ed20 x21: x21 x22: x22 +STACK CFI 2ed24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2ed28 a7c .cfa: sp 0 + .ra: x30 +STACK CFI 2ed2c .cfa: sp 4096 + +STACK CFI 2ed30 .cfa: sp 6352 + +STACK CFI 2ed34 .cfa: sp 6448 + .ra: .cfa -6440 + ^ x29: .cfa -6448 + ^ +STACK CFI 2ed38 .cfa: x29 6448 + +STACK CFI 2ed3c x19: .cfa -6432 + ^ x20: .cfa -6424 + ^ +STACK CFI 2ed48 x21: .cfa -6416 + ^ x22: .cfa -6408 + ^ +STACK CFI 2ed60 x23: .cfa -6400 + ^ x24: .cfa -6392 + ^ x25: .cfa -6384 + ^ x26: .cfa -6376 + ^ x27: .cfa -6368 + ^ x28: .cfa -6360 + ^ +STACK CFI 2f784 x19: x19 x20: x20 +STACK CFI 2f788 x21: x21 x22: x22 +STACK CFI 2f78c x23: x23 x24: x24 +STACK CFI 2f790 x25: x25 x26: x26 +STACK CFI 2f794 x27: x27 x28: x28 +STACK CFI 2f798 .cfa: sp 6352 + .ra: .ra x29: x29 +STACK CFI 2f79c .cfa: sp 4096 + +STACK CFI 2f7a0 .cfa: sp 4000 + +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 285f0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 285f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 285f8 .cfa: x29 32 + +STACK CFI 285fc x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 28648 x19: x19 x20: x20 +STACK CFI 2864c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28714 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 28718 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2871c .cfa: x29 48 + +STACK CFI 28724 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 287c0 x21: x21 +STACK CFI 287c4 x19: x19 x20: x20 +STACK CFI 287c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2114c 6c .cfa: sp 0 + .ra: x30 +STACK CFI 21150 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 21154 .cfa: x29 32 + +STACK CFI 211b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7a4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7a8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7ac 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7b0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7b4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7b8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7bc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7c0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7c4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7c8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7cc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7d0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7d4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7d8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7dc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7e0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7e4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7e8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7ec 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f7f0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2f7f4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f808 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2f80c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2f810 .cfa: x29 32 + +STACK CFI 2f814 x19: .cfa -16 + ^ +STACK CFI 2f824 x19: x19 +STACK CFI 2f828 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2f82c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f840 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2f844 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2f848 .cfa: x29 32 + +STACK CFI 2f84c x19: .cfa -16 + ^ +STACK CFI 2f85c x19: x19 +STACK CFI 2f860 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2f864 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f878 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2f87c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2f880 .cfa: x29 32 + +STACK CFI 2f884 x19: .cfa -16 + ^ +STACK CFI 2f894 x19: x19 +STACK CFI 2f898 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2f89c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f8b0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2f8b4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2f8b8 .cfa: x29 32 + +STACK CFI 2f8bc x19: .cfa -16 + ^ +STACK CFI 2f8cc x19: x19 +STACK CFI 2f8d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2f8d4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f8e8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2f8ec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2f8f0 .cfa: x29 32 + +STACK CFI 2f8f4 x19: .cfa -16 + ^ +STACK CFI 2f904 x19: x19 +STACK CFI 2f908 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2f90c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f920 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2f924 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2f928 .cfa: x29 32 + +STACK CFI 2f92c x19: .cfa -16 + ^ +STACK CFI 2f93c x19: x19 +STACK CFI 2f940 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2f944 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f958 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2f95c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2f960 .cfa: x29 32 + +STACK CFI 2f964 x19: .cfa -16 + ^ +STACK CFI 2f974 x19: x19 +STACK CFI 2f978 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2f97c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f990 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2f994 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2f998 .cfa: x29 32 + +STACK CFI 2f99c x19: .cfa -16 + ^ +STACK CFI 2f9ac x19: x19 +STACK CFI 2f9b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2f9b4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2f9c8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2f9cc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2f9d0 .cfa: x29 32 + +STACK CFI 2f9d4 x19: .cfa -16 + ^ +STACK CFI 2f9e4 x19: x19 +STACK CFI 2f9e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2f9ec 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2fa00 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2fa04 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2fa08 .cfa: x29 32 + +STACK CFI 2fa0c x19: .cfa -16 + ^ +STACK CFI 2fa1c x19: x19 +STACK CFI 2fa20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fa24 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2fa28 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2fa30 .cfa: x29 32 + +STACK CFI 2fa34 x19: .cfa -16 + ^ +STACK CFI 2fa58 x19: x19 +STACK CFI 2fa5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fa60 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2fa64 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2fa6c .cfa: x29 32 + +STACK CFI 2fa70 x19: .cfa -16 + ^ +STACK CFI 2fa94 x19: x19 +STACK CFI 2fa98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fa9c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2faa0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2faa8 .cfa: x29 32 + +STACK CFI 2faac x19: .cfa -16 + ^ +STACK CFI 2fad0 x19: x19 +STACK CFI 2fad4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fad8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2fadc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2fae4 .cfa: x29 32 + +STACK CFI 2fae8 x19: .cfa -16 + ^ +STACK CFI 2fb0c x19: x19 +STACK CFI 2fb10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fb14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2fb18 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2fb20 .cfa: x29 32 + +STACK CFI 2fb24 x19: .cfa -16 + ^ +STACK CFI 2fb48 x19: x19 +STACK CFI 2fb4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fb50 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2fb54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2fb5c .cfa: x29 32 + +STACK CFI 2fb60 x19: .cfa -16 + ^ +STACK CFI 2fb84 x19: x19 +STACK CFI 2fb88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fb8c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2fb90 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2fb98 .cfa: x29 32 + +STACK CFI 2fb9c x19: .cfa -16 + ^ +STACK CFI 2fbc0 x19: x19 +STACK CFI 2fbc4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fbc8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2fbcc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2fbd4 .cfa: x29 32 + +STACK CFI 2fbd8 x19: .cfa -16 + ^ +STACK CFI 2fbfc x19: x19 +STACK CFI 2fc00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fc04 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2fc08 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2fc10 .cfa: x29 32 + +STACK CFI 2fc14 x19: .cfa -16 + ^ +STACK CFI 2fc38 x19: x19 +STACK CFI 2fc3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fc40 3c .cfa: sp 0 + .ra: x30 +STACK CFI 2fc44 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2fc4c .cfa: x29 32 + +STACK CFI 2fc50 x19: .cfa -16 + ^ +STACK CFI 2fc74 x19: x19 +STACK CFI 2fc78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24884 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2fc7c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2fc88 184 .cfa: sp 0 + .ra: x30 +STACK CFI 2fc8c .cfa: sp 528 + +STACK CFI 2fc94 .cfa: sp 608 + .ra: .cfa -600 + ^ x29: .cfa -608 + ^ +STACK CFI 2fc98 .cfa: x29 608 + +STACK CFI 2fca0 x19: .cfa -592 + ^ x20: .cfa -584 + ^ x25: .cfa -544 + ^ x26: .cfa -536 + ^ +STACK CFI 2fcb0 x21: .cfa -576 + ^ x22: .cfa -568 + ^ x23: .cfa -560 + ^ x24: .cfa -552 + ^ +STACK CFI 2fdf4 x19: x19 x20: x20 +STACK CFI 2fdf8 x21: x21 x22: x22 +STACK CFI 2fdfc x23: x23 x24: x24 +STACK CFI 2fe00 x25: x25 x26: x26 +STACK CFI 2fe04 .cfa: sp 528 + .ra: .ra x29: x29 +STACK CFI 2fe08 .cfa: sp 448 + +STACK CFI INIT 2fe0c 48 .cfa: sp 0 + .ra: x30 +STACK CFI 2fe10 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2fe14 .cfa: x29 48 + +STACK CFI 2fe18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2fe20 x21: .cfa -16 + ^ +STACK CFI 2fe48 x21: x21 +STACK CFI 2fe4c x19: x19 x20: x20 +STACK CFI 2fe50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2fe54 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2fe64 68 .cfa: sp 0 + .ra: x30 +STACK CFI 2fe68 .cfa: sp 4096 + +STACK CFI 2fe7c .cfa: sp 4128 + .ra: .cfa -4120 + ^ x29: .cfa -4128 + ^ +STACK CFI 2fe80 .cfa: x29 4128 + +STACK CFI 2fe84 x19: .cfa -4112 + ^ x20: .cfa -4104 + ^ +STACK CFI 2fec0 x19: x19 x20: x20 +STACK CFI 2fec4 .cfa: sp 4096 + .ra: .ra x29: x29 +STACK CFI 2fec8 .cfa: sp 4064 + +STACK CFI INIT 2fecc ac .cfa: sp 0 + .ra: x30 +STACK CFI 2fed0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2fed4 .cfa: x29 48 + +STACK CFI 2fed8 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 2fee4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2ff58 x19: x19 x20: x20 +STACK CFI 2ff5c x21: x21 x22: x22 +STACK CFI 2ff60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2ff68 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 2ff6c x19: x19 x20: x20 +STACK CFI 2ff70 x21: x21 x22: x22 +STACK CFI 2ff74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 48 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 6c x19: x19 +STACK CFI 70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 130 x21: x21 +STACK CFI 134 x19: x19 x20: x20 +STACK CFI 138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 104 x23: x23 +STACK CFI 108 x19: x19 x20: x20 +STACK CFI 10c x21: x21 x22: x22 +STACK CFI 110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 8 .cfa: x29 336 + +STACK CFI c x21: .cfa -304 + ^ x22: .cfa -296 + ^ +STACK CFI 1c x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 1bc x19: x19 x20: x20 +STACK CFI 1c0 x21: x21 x22: x22 +STACK CFI 1c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26c88 9c .cfa: sp 0 + .ra: x30 +STACK CFI 26c8c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 26c90 .cfa: x29 160 + +STACK CFI 26c98 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 26d18 x19: x19 x20: x20 +STACK CFI 26d1c x21: x21 x22: x22 +STACK CFI 26d20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2ff78 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 2ff7c .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 2ff80 .cfa: x29 208 + +STACK CFI 2ff84 x19: .cfa -192 + ^ x20: .cfa -184 + ^ +STACK CFI 2ff94 x21: .cfa -176 + ^ x22: .cfa -168 + ^ +STACK CFI 30030 x19: x19 x20: x20 +STACK CFI 30034 x21: x21 x22: x22 +STACK CFI 30038 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3003c 224 .cfa: sp 0 + .ra: x30 +STACK CFI 30040 .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 30048 .cfa: x29 304 + +STACK CFI 3004c x23: .cfa -256 + ^ x24: .cfa -248 + ^ +STACK CFI 30064 x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x25: .cfa -240 + ^ +STACK CFI 3024c x25: x25 +STACK CFI 30250 x19: x19 x20: x20 +STACK CFI 30254 x21: x21 x22: x22 +STACK CFI 30258 x23: x23 x24: x24 +STACK CFI 3025c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 30260 224 .cfa: sp 0 + .ra: x30 +STACK CFI 30264 .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 3026c .cfa: x29 304 + +STACK CFI 30270 x23: .cfa -256 + ^ x24: .cfa -248 + ^ +STACK CFI 30288 x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x25: .cfa -240 + ^ +STACK CFI 30470 x25: x25 +STACK CFI 30474 x19: x19 x20: x20 +STACK CFI 30478 x21: x21 x22: x22 +STACK CFI 3047c x23: x23 x24: x24 +STACK CFI 30480 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 30484 224 .cfa: sp 0 + .ra: x30 +STACK CFI 30488 .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 30490 .cfa: x29 304 + +STACK CFI 30494 x23: .cfa -256 + ^ x24: .cfa -248 + ^ +STACK CFI 304ac x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x25: .cfa -240 + ^ +STACK CFI 30694 x25: x25 +STACK CFI 30698 x19: x19 x20: x20 +STACK CFI 3069c x21: x21 x22: x22 +STACK CFI 306a0 x23: x23 x24: x24 +STACK CFI 306a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 306a8 224 .cfa: sp 0 + .ra: x30 +STACK CFI 306ac .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 306b4 .cfa: x29 304 + +STACK CFI 306b8 x23: .cfa -256 + ^ x24: .cfa -248 + ^ +STACK CFI 306d0 x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x25: .cfa -240 + ^ +STACK CFI 308b8 x25: x25 +STACK CFI 308bc x19: x19 x20: x20 +STACK CFI 308c0 x21: x21 x22: x22 +STACK CFI 308c4 x23: x23 x24: x24 +STACK CFI 308c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 308cc 224 .cfa: sp 0 + .ra: x30 +STACK CFI 308d0 .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 308d8 .cfa: x29 304 + +STACK CFI 308dc x23: .cfa -256 + ^ x24: .cfa -248 + ^ +STACK CFI 308f4 x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x25: .cfa -240 + ^ +STACK CFI 30adc x25: x25 +STACK CFI 30ae0 x19: x19 x20: x20 +STACK CFI 30ae4 x21: x21 x22: x22 +STACK CFI 30ae8 x23: x23 x24: x24 +STACK CFI 30aec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 30af0 224 .cfa: sp 0 + .ra: x30 +STACK CFI 30af4 .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 30afc .cfa: x29 304 + +STACK CFI 30b00 x23: .cfa -256 + ^ x24: .cfa -248 + ^ +STACK CFI 30b18 x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x25: .cfa -240 + ^ +STACK CFI 30d00 x25: x25 +STACK CFI 30d04 x19: x19 x20: x20 +STACK CFI 30d08 x21: x21 x22: x22 +STACK CFI 30d0c x23: x23 x24: x24 +STACK CFI 30d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 30d14 54c .cfa: sp 0 + .ra: x30 +STACK CFI 30d18 .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 30d20 .cfa: x29 480 + +STACK CFI 30d24 x25: .cfa -416 + ^ x26: .cfa -408 + ^ +STACK CFI 30d44 v8: .cfa -384 + ^ x19: .cfa -464 + ^ x20: .cfa -456 + ^ x21: .cfa -448 + ^ x22: .cfa -440 + ^ x23: .cfa -432 + ^ x24: .cfa -424 + ^ x27: .cfa -400 + ^ x28: .cfa -392 + ^ +STACK CFI 31244 v8: v8 +STACK CFI 31248 x19: x19 x20: x20 +STACK CFI 3124c x21: x21 x22: x22 +STACK CFI 31250 x23: x23 x24: x24 +STACK CFI 31254 x25: x25 x26: x26 +STACK CFI 31258 x27: x27 x28: x28 +STACK CFI 3125c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31260 290 .cfa: sp 0 + .ra: x30 +STACK CFI 31264 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 3126c .cfa: x29 320 + +STACK CFI 31270 x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 3128c x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ +STACK CFI 314d8 x27: x27 +STACK CFI 314dc x19: x19 x20: x20 +STACK CFI 314e0 x21: x21 x22: x22 +STACK CFI 314e4 x23: x23 x24: x24 +STACK CFI 314e8 x25: x25 x26: x26 +STACK CFI 314ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 314f0 540 .cfa: sp 0 + .ra: x30 +STACK CFI 314f4 .cfa: sp 464 + .ra: .cfa -456 + ^ x29: .cfa -464 + ^ +STACK CFI 314fc .cfa: x29 464 + +STACK CFI 31504 v8: .cfa -368 + ^ v9: .cfa -360 + ^ x25: .cfa -400 + ^ x26: .cfa -392 + ^ +STACK CFI 31520 x19: .cfa -448 + ^ x20: .cfa -440 + ^ x21: .cfa -432 + ^ x22: .cfa -424 + ^ x23: .cfa -416 + ^ x24: .cfa -408 + ^ x27: .cfa -384 + ^ x28: .cfa -376 + ^ +STACK CFI 31a14 v8: v8 v9: v9 +STACK CFI 31a18 x19: x19 x20: x20 +STACK CFI 31a1c x21: x21 x22: x22 +STACK CFI 31a20 x23: x23 x24: x24 +STACK CFI 31a24 x25: x25 x26: x26 +STACK CFI 31a28 x27: x27 x28: x28 +STACK CFI 31a2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI c4 x21: x21 +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 211b8 358 .cfa: sp 0 + .ra: x30 +STACK CFI 211bc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 211c0 .cfa: x29 64 + +STACK CFI 211c8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 214fc x21: x21 +STACK CFI 21504 x19: x19 x20: x20 +STACK CFI 21508 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 31a30 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31a34 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31a38 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 31a4c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 31a50 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 31a54 .cfa: x29 32 + +STACK CFI 31a58 x19: .cfa -16 + ^ +STACK CFI 31a68 x19: x19 +STACK CFI 31a6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31a70 3c .cfa: sp 0 + .ra: x30 +STACK CFI 31a74 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 31a7c .cfa: x29 32 + +STACK CFI 31a80 x19: .cfa -16 + ^ +STACK CFI 31aa4 x19: x19 +STACK CFI 31aa8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24998 60 .cfa: sp 0 + .ra: x30 +STACK CFI 2499c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 249a0 .cfa: x29 48 + +STACK CFI 249a8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 249ec x19: x19 x20: x20 +STACK CFI 249f0 x21: x21 +STACK CFI 249f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 249f8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24c60 98 .cfa: sp 0 + .ra: x30 +STACK CFI 24c64 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24c68 .cfa: x29 64 + +STACK CFI 24c70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24cec x19: x19 x20: x20 +STACK CFI 24cf0 x21: x21 +STACK CFI 24cf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25040 64 .cfa: sp 0 + .ra: x30 +STACK CFI 25044 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25048 .cfa: x29 48 + +STACK CFI 2504c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25058 x21: .cfa -16 + ^ +STACK CFI 25098 x19: x19 x20: x20 +STACK CFI 2509c x21: x21 +STACK CFI 250a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31aac 4c .cfa: sp 0 + .ra: x30 +STACK CFI 31ab0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 31ab8 .cfa: x29 64 + +STACK CFI 31abc x19: .cfa -48 + ^ +STACK CFI 31af0 x19: x19 +STACK CFI 31af4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25768 13c .cfa: sp 0 + .ra: x30 +STACK CFI 2576c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 25770 .cfa: x29 64 + +STACK CFI 25778 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 25898 x19: x19 x20: x20 +STACK CFI 2589c x21: x21 x22: x22 +STACK CFI 258a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25964 104 .cfa: sp 0 + .ra: x30 +STACK CFI 25968 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 2596c .cfa: x29 80 + +STACK CFI 25978 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 25a58 x19: x19 x20: x20 +STACK CFI 25a5c x21: x21 x22: x22 +STACK CFI 25a60 x23: x23 x24: x24 +STACK CFI 25a64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b28 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1b8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI 14 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 1a8 x19: x19 x20: x20 +STACK CFI 1ac x21: x21 x22: x22 +STACK CFI 1b0 x23: x23 x24: x24 +STACK CFI 1b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31af8 58 .cfa: sp 0 + .ra: x30 +STACK CFI 31afc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 31b00 .cfa: x29 48 + +STACK CFI 31b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 31b44 x19: x19 x20: x20 +STACK CFI 31b48 x21: x21 +STACK CFI 31b4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 261dc 64 .cfa: sp 0 + .ra: x30 +STACK CFI 261e0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 261e4 .cfa: x29 64 + +STACK CFI 261e8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26238 x19: x19 x20: x20 +STACK CFI 2623c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31b50 60 .cfa: sp 0 + .ra: x30 +STACK CFI 31b54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 31b60 .cfa: x29 32 + +STACK CFI 31b64 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 31ba8 x19: x19 x20: x20 +STACK CFI 31bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31bb0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 31c0c 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 31c68 124 .cfa: sp 0 + .ra: x30 +STACK CFI 31c6c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 31c70 .cfa: x29 48 + +STACK CFI 31c78 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 31ca0 x19: x19 x20: x20 +STACK CFI 31ca4 x21: x21 x22: x22 +STACK CFI 31ca8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 31cac .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 31d8c dc .cfa: sp 0 + .ra: x30 +STACK CFI 31d90 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 31d98 .cfa: x29 64 + +STACK CFI 31da0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 31e5c x19: x19 x20: x20 +STACK CFI 31e60 x21: x21 x22: x22 +STACK CFI 31e64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI c .cfa: x29 384 + +STACK CFI 10 x19: .cfa -368 + ^ x20: .cfa -360 + ^ +STACK CFI 20 x21: .cfa -352 + ^ x22: .cfa -344 + ^ +STACK CFI 28 x23: .cfa -336 + ^ x24: .cfa -328 + ^ +STACK CFI 124 x19: x19 x20: x20 +STACK CFI 128 x21: x21 x22: x22 +STACK CFI 12c x23: x23 x24: x24 +STACK CFI 130 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 218 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 240 + .ra: .cfa -232 + ^ x29: .cfa -240 + ^ +STACK CFI 8 .cfa: x29 240 + +STACK CFI c x21: .cfa -208 + ^ x22: .cfa -200 + ^ +STACK CFI 14 x23: .cfa -192 + ^ x24: .cfa -184 + ^ +STACK CFI 30 x19: .cfa -224 + ^ x20: .cfa -216 + ^ +STACK CFI 208 x19: x19 x20: x20 +STACK CFI 20c x21: x21 x22: x22 +STACK CFI 210 x23: x23 x24: x24 +STACK CFI 214 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31e68 950 .cfa: sp 0 + .ra: x30 +STACK CFI 31e6c .cfa: sp 1024 + +STACK CFI 31e70 .cfa: sp 1136 + .ra: .cfa -1128 + ^ x29: .cfa -1136 + ^ +STACK CFI 31e74 .cfa: x29 1136 + +STACK CFI 31e7c x19: .cfa -1120 + ^ x20: .cfa -1112 + ^ x21: .cfa -1104 + ^ x22: .cfa -1096 + ^ +STACK CFI 31e90 x23: .cfa -1088 + ^ x24: .cfa -1080 + ^ +STACK CFI 31ea4 v8: .cfa -1040 + ^ x25: .cfa -1072 + ^ x26: .cfa -1064 + ^ x27: .cfa -1056 + ^ x28: .cfa -1048 + ^ +STACK CFI 32798 x19: x19 x20: x20 +STACK CFI 3279c x21: x21 x22: x22 +STACK CFI 327a0 x23: x23 x24: x24 +STACK CFI 327a4 x25: x25 x26: x26 +STACK CFI 327a8 x27: x27 x28: x28 +STACK CFI 327ac v8: v8 +STACK CFI 327b0 .cfa: sp 1024 + .ra: .ra x29: x29 +STACK CFI 327b4 .cfa: sp 912 + +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28714 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 28718 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2871c .cfa: x29 48 + +STACK CFI 28724 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 287c0 x21: x21 +STACK CFI 287c4 x19: x19 x20: x20 +STACK CFI 287c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 285f0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 285f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 285f8 .cfa: x29 32 + +STACK CFI 285fc x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 28648 x19: x19 x20: x20 +STACK CFI 2864c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI e4 x23: x23 +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 21510 6c .cfa: sp 0 + .ra: x30 +STACK CFI 21514 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 21518 .cfa: x29 32 + +STACK CFI 21574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327b8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327bc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327c0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327c4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327c8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327cc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327d0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327d4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327d8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327dc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327e0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327e4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327e8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 327ec 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 327f0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 32804 24 .cfa: sp 0 + .ra: x30 +STACK CFI 32808 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3280c .cfa: x29 32 + +STACK CFI 32810 x19: .cfa -16 + ^ +STACK CFI 32820 x19: x19 +STACK CFI 32824 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32828 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3283c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 32840 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 32844 .cfa: x29 32 + +STACK CFI 32848 x19: .cfa -16 + ^ +STACK CFI 32858 x19: x19 +STACK CFI 3285c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32860 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 32874 24 .cfa: sp 0 + .ra: x30 +STACK CFI 32878 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3287c .cfa: x29 32 + +STACK CFI 32880 x19: .cfa -16 + ^ +STACK CFI 32890 x19: x19 +STACK CFI 32894 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32898 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 328ac 24 .cfa: sp 0 + .ra: x30 +STACK CFI 328b0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 328b4 .cfa: x29 32 + +STACK CFI 328b8 x19: .cfa -16 + ^ +STACK CFI 328c8 x19: x19 +STACK CFI 328cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 328d0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 328e4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 328e8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 328ec .cfa: x29 32 + +STACK CFI 328f0 x19: .cfa -16 + ^ +STACK CFI 32900 x19: x19 +STACK CFI 32904 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32908 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3291c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 32920 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 32924 .cfa: x29 32 + +STACK CFI 32928 x19: .cfa -16 + ^ +STACK CFI 32938 x19: x19 +STACK CFI 3293c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32940 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 32954 24 .cfa: sp 0 + .ra: x30 +STACK CFI 32958 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3295c .cfa: x29 32 + +STACK CFI 32960 x19: .cfa -16 + ^ +STACK CFI 32970 x19: x19 +STACK CFI 32974 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32978 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3297c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 32984 .cfa: x29 32 + +STACK CFI 32988 x19: .cfa -16 + ^ +STACK CFI 329ac x19: x19 +STACK CFI 329b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 329b4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 329b8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 329c0 .cfa: x29 32 + +STACK CFI 329c4 x19: .cfa -16 + ^ +STACK CFI 329e8 x19: x19 +STACK CFI 329ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 329f0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 329f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 329fc .cfa: x29 32 + +STACK CFI 32a00 x19: .cfa -16 + ^ +STACK CFI 32a24 x19: x19 +STACK CFI 32a28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32a2c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 32a30 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 32a38 .cfa: x29 32 + +STACK CFI 32a3c x19: .cfa -16 + ^ +STACK CFI 32a60 x19: x19 +STACK CFI 32a64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32a68 3c .cfa: sp 0 + .ra: x30 +STACK CFI 32a6c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 32a74 .cfa: x29 32 + +STACK CFI 32a78 x19: .cfa -16 + ^ +STACK CFI 32a9c x19: x19 +STACK CFI 32aa0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32aa4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 32aa8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 32ab0 .cfa: x29 32 + +STACK CFI 32ab4 x19: .cfa -16 + ^ +STACK CFI 32ad8 x19: x19 +STACK CFI 32adc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32ae0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 32ae4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 32aec .cfa: x29 32 + +STACK CFI 32af0 x19: .cfa -16 + ^ +STACK CFI 32b14 x19: x19 +STACK CFI 32b18 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32b1c 118 .cfa: sp 0 + .ra: x30 +STACK CFI 32b20 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 32b2c .cfa: x29 32 + +STACK CFI 32b30 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 32c2c x19: x19 x20: x20 +STACK CFI 32c30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32c34 20 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24884 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2fe54 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2fe64 68 .cfa: sp 0 + .ra: x30 +STACK CFI 2fe68 .cfa: sp 4096 + +STACK CFI 2fe7c .cfa: sp 4128 + .ra: .cfa -4120 + ^ x29: .cfa -4128 + ^ +STACK CFI 2fe80 .cfa: x29 4128 + +STACK CFI 2fe84 x19: .cfa -4112 + ^ x20: .cfa -4104 + ^ +STACK CFI 2fec0 x19: x19 x20: x20 +STACK CFI 2fec4 .cfa: sp 4096 + .ra: .ra x29: x29 +STACK CFI 2fec8 .cfa: sp 4064 + +STACK CFI INIT 32c54 8c .cfa: sp 0 + .ra: x30 +STACK CFI 32c58 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 32c5c .cfa: x29 48 + +STACK CFI 32c64 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 32cb8 x21: x21 x22: x22 +STACK CFI 32cbc x19: x19 x20: x20 +STACK CFI 32cc0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 32cc4 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 32cd0 x19: x19 x20: x20 +STACK CFI 32cd4 x21: x21 x22: x22 +STACK CFI 32cd8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32ce0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 32ce4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 32ce8 .cfa: x29 32 + +STACK CFI 32cec x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 32d20 x19: x19 x20: x20 +STACK CFI 32d24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 32d28 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 32d2c x19: x19 x20: x20 +STACK CFI 32d30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 48 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32d34 1a8 .cfa: sp 0 + .ra: x30 +STACK CFI 32d38 .cfa: sp 624 + +STACK CFI 32d44 .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 32d48 .cfa: x29 688 + +STACK CFI 32d4c x21: .cfa -656 + ^ x22: .cfa -648 + ^ +STACK CFI 32d60 x19: .cfa -672 + ^ x20: .cfa -664 + ^ x23: .cfa -640 + ^ +STACK CFI 32ec8 x23: x23 +STACK CFI 32ecc x19: x19 x20: x20 +STACK CFI 32ed0 x21: x21 x22: x22 +STACK CFI 32ed4 .cfa: sp 624 + .ra: .ra x29: x29 +STACK CFI 32ed8 .cfa: sp 560 + +STACK CFI INIT 32edc 1d4 .cfa: sp 0 + .ra: x30 +STACK CFI 32ee0 .cfa: sp 1136 + +STACK CFI 32eec .cfa: sp 1200 + .ra: .cfa -1192 + ^ x29: .cfa -1200 + ^ +STACK CFI 32ef0 .cfa: x29 1200 + +STACK CFI 32ef4 x19: .cfa -1184 + ^ x20: .cfa -1176 + ^ +STACK CFI 32f08 x21: .cfa -1168 + ^ x22: .cfa -1160 + ^ x23: .cfa -1152 + ^ +STACK CFI 3309c x23: x23 +STACK CFI 330a0 x19: x19 x20: x20 +STACK CFI 330a4 x21: x21 x22: x22 +STACK CFI 330a8 .cfa: sp 1136 + .ra: .ra x29: x29 +STACK CFI 330ac .cfa: sp 1072 + +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 6c x19: x19 +STACK CFI 70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 130 x21: x21 +STACK CFI 134 x19: x19 x20: x20 +STACK CFI 138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 330b0 e8 .cfa: sp 0 + .ra: x30 +STACK CFI 330b4 .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 330b8 .cfa: x29 480 + +STACK CFI 330bc x19: .cfa -464 + ^ x20: .cfa -456 + ^ +STACK CFI 330c8 x23: .cfa -432 + ^ x24: .cfa -424 + ^ x25: .cfa -416 + ^ +STACK CFI 330e4 x21: .cfa -448 + ^ x22: .cfa -440 + ^ +STACK CFI 33180 x25: x25 +STACK CFI 33188 x19: x19 x20: x20 +STACK CFI 3318c x21: x21 x22: x22 +STACK CFI 33190 x23: x23 x24: x24 +STACK CFI 33194 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 33198 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3319c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 331a0 .cfa: x29 32 + +STACK CFI 331ac x19: .cfa -16 + ^ +STACK CFI 331cc x19: x19 +STACK CFI 331d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 104 x23: x23 +STACK CFI 108 x19: x19 x20: x20 +STACK CFI 10c x21: x21 x22: x22 +STACK CFI 110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 279ec 5c .cfa: sp 0 + .ra: x30 +STACK CFI 279f0 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 279f8 .cfa: x29 336 + +STACK CFI 279fc x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 27a04 x21: .cfa -304 + ^ +STACK CFI 27a38 x21: x21 +STACK CFI 27a40 x19: x19 x20: x20 +STACK CFI 27a44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27b7c 9c .cfa: sp 0 + .ra: x30 +STACK CFI 27b80 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 27b84 .cfa: x29 160 + +STACK CFI 27b8c x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 27c0c x19: x19 x20: x20 +STACK CFI 27c10 x21: x21 x22: x22 +STACK CFI 27c14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 331d4 374 .cfa: sp 0 + .ra: x30 +STACK CFI 331d8 .cfa: sp 624 + +STACK CFI 331e4 .cfa: sp 704 + .ra: .cfa -696 + ^ x29: .cfa -704 + ^ +STACK CFI 331e8 .cfa: x29 704 + +STACK CFI 331ec x23: .cfa -656 + ^ x24: .cfa -648 + ^ +STACK CFI 33200 x19: .cfa -688 + ^ x20: .cfa -680 + ^ x21: .cfa -672 + ^ x22: .cfa -664 + ^ x25: .cfa -640 + ^ x26: .cfa -632 + ^ +STACK CFI 33530 x19: x19 x20: x20 +STACK CFI 33534 x21: x21 x22: x22 +STACK CFI 33538 x23: x23 x24: x24 +STACK CFI 3353c x25: x25 x26: x26 +STACK CFI 33540 .cfa: sp 624 + .ra: .ra x29: x29 +STACK CFI 33544 .cfa: sp 544 + +STACK CFI INIT 33548 374 .cfa: sp 0 + .ra: x30 +STACK CFI 3354c .cfa: sp 624 + +STACK CFI 33558 .cfa: sp 704 + .ra: .cfa -696 + ^ x29: .cfa -704 + ^ +STACK CFI 3355c .cfa: x29 704 + +STACK CFI 33560 x23: .cfa -656 + ^ x24: .cfa -648 + ^ +STACK CFI 33574 x19: .cfa -688 + ^ x20: .cfa -680 + ^ x21: .cfa -672 + ^ x22: .cfa -664 + ^ x25: .cfa -640 + ^ x26: .cfa -632 + ^ +STACK CFI 338a4 x19: x19 x20: x20 +STACK CFI 338a8 x21: x21 x22: x22 +STACK CFI 338ac x23: x23 x24: x24 +STACK CFI 338b0 x25: x25 x26: x26 +STACK CFI 338b4 .cfa: sp 624 + .ra: .ra x29: x29 +STACK CFI 338b8 .cfa: sp 544 + +STACK CFI INIT 338bc 568 .cfa: sp 0 + .ra: x30 +STACK CFI 338c0 .cfa: sp 624 + +STACK CFI 338cc .cfa: sp 752 + .ra: .cfa -744 + ^ x29: .cfa -752 + ^ +STACK CFI 338d0 .cfa: x29 752 + +STACK CFI 338d8 v8: .cfa -656 + ^ v9: .cfa -648 + ^ x25: .cfa -688 + ^ x26: .cfa -680 + ^ +STACK CFI 338f4 v10: .cfa -640 + ^ x19: .cfa -736 + ^ x20: .cfa -728 + ^ x21: .cfa -720 + ^ x22: .cfa -712 + ^ x23: .cfa -704 + ^ x24: .cfa -696 + ^ x27: .cfa -672 + ^ x28: .cfa -664 + ^ +STACK CFI 33e00 v8: v8 v9: v9 +STACK CFI 33e04 x19: x19 x20: x20 +STACK CFI 33e08 x21: x21 x22: x22 +STACK CFI 33e0c x23: x23 x24: x24 +STACK CFI 33e10 x25: x25 x26: x26 +STACK CFI 33e14 x27: x27 x28: x28 +STACK CFI 33e18 v10: v10 +STACK CFI 33e1c .cfa: sp 624 + .ra: .ra x29: x29 +STACK CFI 33e20 .cfa: sp 496 + +STACK CFI INIT 33e24 568 .cfa: sp 0 + .ra: x30 +STACK CFI 33e28 .cfa: sp 624 + +STACK CFI 33e34 .cfa: sp 752 + .ra: .cfa -744 + ^ x29: .cfa -752 + ^ +STACK CFI 33e38 .cfa: x29 752 + +STACK CFI 33e40 v8: .cfa -656 + ^ v9: .cfa -648 + ^ x25: .cfa -688 + ^ x26: .cfa -680 + ^ +STACK CFI 33e5c v10: .cfa -640 + ^ x19: .cfa -736 + ^ x20: .cfa -728 + ^ x21: .cfa -720 + ^ x22: .cfa -712 + ^ x23: .cfa -704 + ^ x24: .cfa -696 + ^ x27: .cfa -672 + ^ x28: .cfa -664 + ^ +STACK CFI 34368 v8: v8 v9: v9 +STACK CFI 3436c x19: x19 x20: x20 +STACK CFI 34370 x21: x21 x22: x22 +STACK CFI 34374 x23: x23 x24: x24 +STACK CFI 34378 x25: x25 x26: x26 +STACK CFI 3437c x27: x27 x28: x28 +STACK CFI 34380 v10: v10 +STACK CFI 34384 .cfa: sp 624 + .ra: .ra x29: x29 +STACK CFI 34388 .cfa: sp 496 + +STACK CFI INIT 3438c 3b8 .cfa: sp 0 + .ra: x30 +STACK CFI 34390 .cfa: sp 1424 + +STACK CFI 3439c .cfa: sp 1504 + .ra: .cfa -1496 + ^ x29: .cfa -1504 + ^ +STACK CFI 343a0 .cfa: x29 1504 + +STACK CFI 343a4 x25: .cfa -1440 + ^ x26: .cfa -1432 + ^ +STACK CFI 343b8 x19: .cfa -1488 + ^ x20: .cfa -1480 + ^ x21: .cfa -1472 + ^ x22: .cfa -1464 + ^ x23: .cfa -1456 + ^ x24: .cfa -1448 + ^ +STACK CFI 3472c x19: x19 x20: x20 +STACK CFI 34730 x21: x21 x22: x22 +STACK CFI 34734 x23: x23 x24: x24 +STACK CFI 34738 x25: x25 x26: x26 +STACK CFI 3473c .cfa: sp 1424 + .ra: .ra x29: x29 +STACK CFI 34740 .cfa: sp 1344 + +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI c4 x21: x21 +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2157c 268 .cfa: sp 0 + .ra: x30 +STACK CFI 21580 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 21584 .cfa: x29 64 + +STACK CFI 2158c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 217d0 x21: x21 +STACK CFI 217d8 x19: x19 x20: x20 +STACK CFI 217dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 34744 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 34748 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3474c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 34750 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 34754 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 34768 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3476c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 34770 .cfa: x29 32 + +STACK CFI 34774 x19: .cfa -16 + ^ +STACK CFI 34784 x19: x19 +STACK CFI 34788 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3478c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 347a0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 347a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 347a8 .cfa: x29 32 + +STACK CFI 347ac x19: .cfa -16 + ^ +STACK CFI 347bc x19: x19 +STACK CFI 347c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 347c4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 347c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 347d0 .cfa: x29 32 + +STACK CFI 347d4 x19: .cfa -16 + ^ +STACK CFI 347f8 x19: x19 +STACK CFI 347fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 34800 3c .cfa: sp 0 + .ra: x30 +STACK CFI 34804 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3480c .cfa: x29 32 + +STACK CFI 34810 x19: .cfa -16 + ^ +STACK CFI 34834 x19: x19 +STACK CFI 34838 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 48 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 6c x19: x19 +STACK CFI 70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 7c x19: x19 +STACK CFI 80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI cc x21: x21 +STACK CFI d4 x19: x19 x20: x20 +STACK CFI d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI cc x21: x21 +STACK CFI d4 x19: x19 x20: x20 +STACK CFI d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3483c e8 .cfa: sp 0 + .ra: x30 +STACK CFI 34840 .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 34844 .cfa: x29 480 + +STACK CFI 34848 x19: .cfa -464 + ^ x20: .cfa -456 + ^ +STACK CFI 34854 x23: .cfa -432 + ^ x24: .cfa -424 + ^ x25: .cfa -416 + ^ +STACK CFI 34870 x21: .cfa -448 + ^ x22: .cfa -440 + ^ +STACK CFI 3490c x25: x25 +STACK CFI 34914 x19: x19 x20: x20 +STACK CFI 34918 x21: x21 x22: x22 +STACK CFI 3491c x23: x23 x24: x24 +STACK CFI 34920 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 104 x23: x23 +STACK CFI 108 x19: x19 x20: x20 +STACK CFI 10c x21: x21 x22: x22 +STACK CFI 110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26aa8 88 .cfa: sp 0 + .ra: x30 +STACK CFI 26aac .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 26ab4 .cfa: x29 336 + +STACK CFI 26ab8 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 26ac0 x21: .cfa -304 + ^ +STACK CFI 26b20 x21: x21 +STACK CFI 26b28 x19: x19 x20: x20 +STACK CFI 26b2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26c88 9c .cfa: sp 0 + .ra: x30 +STACK CFI 26c8c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 26c90 .cfa: x29 160 + +STACK CFI 26c98 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 26d18 x19: x19 x20: x20 +STACK CFI 26d1c x21: x21 x22: x22 +STACK CFI 26d20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 34924 34 .cfa: sp 0 + .ra: x30 +STACK CFI 3492c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 34930 .cfa: x29 32 + +STACK CFI 34938 x19: .cfa -16 + ^ +STACK CFI 34950 x19: x19 +STACK CFI 34954 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 34958 4a8 .cfa: sp 0 + .ra: x30 +STACK CFI 3495c .cfa: sp 1104 + +STACK CFI 34960 .cfa: sp 1200 + .ra: .cfa -1192 + ^ x29: .cfa -1200 + ^ +STACK CFI 34964 .cfa: x29 1200 + +STACK CFI 34978 x19: .cfa -1184 + ^ x20: .cfa -1176 + ^ x21: .cfa -1168 + ^ x22: .cfa -1160 + ^ x23: .cfa -1152 + ^ x24: .cfa -1144 + ^ x25: .cfa -1136 + ^ x26: .cfa -1128 + ^ x27: .cfa -1120 + ^ x28: .cfa -1112 + ^ +STACK CFI 34de4 x19: x19 x20: x20 +STACK CFI 34de8 x21: x21 x22: x22 +STACK CFI 34dec x23: x23 x24: x24 +STACK CFI 34df0 x25: x25 x26: x26 +STACK CFI 34df4 x27: x27 x28: x28 +STACK CFI 34df8 .cfa: sp 1104 + .ra: .ra x29: x29 +STACK CFI 34dfc .cfa: sp 1008 + +STACK CFI INIT 34e00 880 .cfa: sp 0 + .ra: x30 +STACK CFI 34e04 .cfa: sp 1456 + +STACK CFI 34e08 .cfa: sp 1584 + .ra: .cfa -1576 + ^ x29: .cfa -1584 + ^ +STACK CFI 34e0c .cfa: x29 1584 + +STACK CFI 34e14 v8: .cfa -1488 + ^ v9: .cfa -1480 + ^ x23: .cfa -1536 + ^ x24: .cfa -1528 + ^ +STACK CFI 34e30 v10: .cfa -1472 + ^ x19: .cfa -1568 + ^ x20: .cfa -1560 + ^ x21: .cfa -1552 + ^ x22: .cfa -1544 + ^ x25: .cfa -1520 + ^ x26: .cfa -1512 + ^ x27: .cfa -1504 + ^ x28: .cfa -1496 + ^ +STACK CFI 3565c v8: v8 v9: v9 +STACK CFI 35660 x19: x19 x20: x20 +STACK CFI 35664 x21: x21 x22: x22 +STACK CFI 35668 x23: x23 x24: x24 +STACK CFI 3566c x25: x25 x26: x26 +STACK CFI 35670 x27: x27 x28: x28 +STACK CFI 35674 v10: v10 +STACK CFI 35678 .cfa: sp 1456 + .ra: .ra x29: x29 +STACK CFI 3567c .cfa: sp 1328 + +STACK CFI INIT 35680 24 .cfa: sp 0 + .ra: x30 +STACK CFI 35684 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35688 .cfa: x29 32 + +STACK CFI 3568c x19: .cfa -16 + ^ +STACK CFI 3569c x19: x19 +STACK CFI 356a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI c4 x21: x21 +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 217e4 d8 .cfa: sp 0 + .ra: x30 +STACK CFI 217e8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 217ec .cfa: x29 64 + +STACK CFI 217f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 218a8 x21: x21 +STACK CFI 218b0 x19: x19 x20: x20 +STACK CFI 218b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356a4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356a8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356ac 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356b0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356b4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356b8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356bc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356c0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356c4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356c8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356cc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356d0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356d4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356d8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356dc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356e0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356e4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 356e8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 356ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI 356f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 356f4 .cfa: x29 32 + +STACK CFI 356f8 x19: .cfa -16 + ^ +STACK CFI 35708 x19: x19 +STACK CFI 3570c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35710 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 35724 24 .cfa: sp 0 + .ra: x30 +STACK CFI 35728 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3572c .cfa: x29 32 + +STACK CFI 35730 x19: .cfa -16 + ^ +STACK CFI 35740 x19: x19 +STACK CFI 35744 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35748 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3575c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 35760 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35764 .cfa: x29 32 + +STACK CFI 35768 x19: .cfa -16 + ^ +STACK CFI 35778 x19: x19 +STACK CFI 3577c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35780 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 35794 24 .cfa: sp 0 + .ra: x30 +STACK CFI 35798 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3579c .cfa: x29 32 + +STACK CFI 357a0 x19: .cfa -16 + ^ +STACK CFI 357b0 x19: x19 +STACK CFI 357b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 357b8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 357cc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 357d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 357d4 .cfa: x29 32 + +STACK CFI 357d8 x19: .cfa -16 + ^ +STACK CFI 357e8 x19: x19 +STACK CFI 357ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 357f0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 35804 24 .cfa: sp 0 + .ra: x30 +STACK CFI 35808 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3580c .cfa: x29 32 + +STACK CFI 35810 x19: .cfa -16 + ^ +STACK CFI 35820 x19: x19 +STACK CFI 35824 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35828 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3583c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 35840 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35844 .cfa: x29 32 + +STACK CFI 35848 x19: .cfa -16 + ^ +STACK CFI 35858 x19: x19 +STACK CFI 3585c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35860 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 35874 24 .cfa: sp 0 + .ra: x30 +STACK CFI 35878 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3587c .cfa: x29 32 + +STACK CFI 35880 x19: .cfa -16 + ^ +STACK CFI 35890 x19: x19 +STACK CFI 35894 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35898 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 358ac 24 .cfa: sp 0 + .ra: x30 +STACK CFI 358b0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 358b4 .cfa: x29 32 + +STACK CFI 358b8 x19: .cfa -16 + ^ +STACK CFI 358c8 x19: x19 +STACK CFI 358cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 358d0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 358d4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 358dc .cfa: x29 32 + +STACK CFI 358e0 x19: .cfa -16 + ^ +STACK CFI 35904 x19: x19 +STACK CFI 35908 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3590c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 35910 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35918 .cfa: x29 32 + +STACK CFI 3591c x19: .cfa -16 + ^ +STACK CFI 35940 x19: x19 +STACK CFI 35944 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35948 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3594c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35954 .cfa: x29 32 + +STACK CFI 35958 x19: .cfa -16 + ^ +STACK CFI 3597c x19: x19 +STACK CFI 35980 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35984 3c .cfa: sp 0 + .ra: x30 +STACK CFI 35988 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35990 .cfa: x29 32 + +STACK CFI 35994 x19: .cfa -16 + ^ +STACK CFI 359b8 x19: x19 +STACK CFI 359bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 359c0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 359c4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 359cc .cfa: x29 32 + +STACK CFI 359d0 x19: .cfa -16 + ^ +STACK CFI 359f4 x19: x19 +STACK CFI 359f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 359fc 3c .cfa: sp 0 + .ra: x30 +STACK CFI 35a00 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35a08 .cfa: x29 32 + +STACK CFI 35a0c x19: .cfa -16 + ^ +STACK CFI 35a30 x19: x19 +STACK CFI 35a34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35a38 3c .cfa: sp 0 + .ra: x30 +STACK CFI 35a3c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35a44 .cfa: x29 32 + +STACK CFI 35a48 x19: .cfa -16 + ^ +STACK CFI 35a6c x19: x19 +STACK CFI 35a70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35a74 3c .cfa: sp 0 + .ra: x30 +STACK CFI 35a78 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35a80 .cfa: x29 32 + +STACK CFI 35a84 x19: .cfa -16 + ^ +STACK CFI 35aa8 x19: x19 +STACK CFI 35aac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24884 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24998 60 .cfa: sp 0 + .ra: x30 +STACK CFI 2499c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 249a0 .cfa: x29 48 + +STACK CFI 249a8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 249ec x19: x19 x20: x20 +STACK CFI 249f0 x21: x21 +STACK CFI 249f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 249f8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 35ab0 190 .cfa: sp 0 + .ra: x30 +STACK CFI 35ab4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 35ab8 .cfa: x29 128 + +STACK CFI 35ac0 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 35c34 x19: x19 x20: x20 +STACK CFI 35c38 x21: x21 x22: x22 +STACK CFI 35c3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35c40 68 .cfa: sp 0 + .ra: x30 +STACK CFI 35c44 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35c48 .cfa: x29 32 + +STACK CFI 35c4c x19: .cfa -16 + ^ +STACK CFI 35ca0 x19: x19 +STACK CFI 35ca4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35ca8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 35cac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35cb0 .cfa: x29 32 + +STACK CFI 35cb4 x19: .cfa -16 + ^ +STACK CFI 35cc4 x19: x19 +STACK CFI 35cc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24c60 98 .cfa: sp 0 + .ra: x30 +STACK CFI 24c64 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24c68 .cfa: x29 64 + +STACK CFI 24c70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24cec x19: x19 x20: x20 +STACK CFI 24cf0 x21: x21 +STACK CFI 24cf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35ccc 144 .cfa: sp 0 + .ra: x30 +STACK CFI 35cd0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 35cd4 .cfa: x29 48 + +STACK CFI 35cdc x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 35e04 x19: x19 x20: x20 +STACK CFI 35e08 x21: x21 x22: x22 +STACK CFI 35e0c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24db0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 24db4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24db8 .cfa: x29 48 + +STACK CFI 24dbc x19: .cfa -32 + ^ +STACK CFI 24e10 x19: x19 +STACK CFI 24e14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35e10 78 .cfa: sp 0 + .ra: x30 +STACK CFI 35e14 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35e1c .cfa: x29 32 + +STACK CFI 35e20 x19: .cfa -16 + ^ +STACK CFI 35e80 x19: x19 +STACK CFI 35e84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25768 13c .cfa: sp 0 + .ra: x30 +STACK CFI 2576c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 25770 .cfa: x29 64 + +STACK CFI 25778 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 25898 x19: x19 x20: x20 +STACK CFI 2589c x21: x21 x22: x22 +STACK CFI 258a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25964 104 .cfa: sp 0 + .ra: x30 +STACK CFI 25968 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 2596c .cfa: x29 80 + +STACK CFI 25978 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 25a58 x19: x19 x20: x20 +STACK CFI 25a5c x21: x21 x22: x22 +STACK CFI 25a60 x23: x23 x24: x24 +STACK CFI 25a64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35e88 50 .cfa: sp 0 + .ra: x30 +STACK CFI 35e8c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35e98 .cfa: x29 32 + +STACK CFI 35e9c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 35ea4 x19: x19 x20: x20 +STACK CFI 35eac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 35eb4 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 35ed0 x19: x19 x20: x20 +STACK CFI 35ed4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b28 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25bb0 164 .cfa: sp 0 + .ra: x30 +STACK CFI 25bb4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 25bbc .cfa: x29 80 + +STACK CFI 25bc8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 25d04 x23: x23 +STACK CFI 25d08 x19: x19 x20: x20 +STACK CFI 25d0c x21: x21 x22: x22 +STACK CFI 25d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI 14 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ +STACK CFI 98 x23: x23 +STACK CFI 9c x19: x19 x20: x20 +STACK CFI a0 x21: x21 x22: x22 +STACK CFI a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26188 54 .cfa: sp 0 + .ra: x30 +STACK CFI 2618c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26190 .cfa: x29 64 + +STACK CFI 26194 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 261d4 x19: x19 x20: x20 +STACK CFI 261d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 261dc 64 .cfa: sp 0 + .ra: x30 +STACK CFI 261e0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 261e4 .cfa: x29 64 + +STACK CFI 261e8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26238 x19: x19 x20: x20 +STACK CFI 2623c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26240 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26244 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26248 .cfa: x29 64 + +STACK CFI 2624c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2628c x19: x19 x20: x20 +STACK CFI 26290 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26294 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26298 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2629c .cfa: x29 64 + +STACK CFI 262a0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 262e0 x19: x19 x20: x20 +STACK CFI 262e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28074 5c .cfa: sp 0 + .ra: x30 +STACK CFI 28078 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 28080 .cfa: x29 336 + +STACK CFI 28084 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 2808c x21: .cfa -304 + ^ +STACK CFI 280c0 x21: x21 +STACK CFI 280c8 x19: x19 x20: x20 +STACK CFI 280cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28208 9c .cfa: sp 0 + .ra: x30 +STACK CFI 2820c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 28210 .cfa: x29 160 + +STACK CFI 28218 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 28298 x19: x19 x20: x20 +STACK CFI 2829c x21: x21 x22: x22 +STACK CFI 282a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26aa8 88 .cfa: sp 0 + .ra: x30 +STACK CFI 26aac .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 26ab4 .cfa: x29 336 + +STACK CFI 26ab8 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 26ac0 x21: .cfa -304 + ^ +STACK CFI 26b20 x21: x21 +STACK CFI 26b28 x19: x19 x20: x20 +STACK CFI 26b2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 158 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 8 .cfa: x29 224 + +STACK CFI 14 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ +STACK CFI 148 x23: x23 +STACK CFI 14c x19: x19 x20: x20 +STACK CFI 150 x21: x21 x22: x22 +STACK CFI 154 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35ed8 3a8 .cfa: sp 0 + .ra: x30 +STACK CFI 35edc .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 35ee0 .cfa: x29 160 + +STACK CFI 35ee4 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 35ef8 x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ +STACK CFI 36270 x19: x19 x20: x20 +STACK CFI 36274 x21: x21 x22: x22 +STACK CFI 36278 x23: x23 x24: x24 +STACK CFI 3627c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26c88 9c .cfa: sp 0 + .ra: x30 +STACK CFI 26c8c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 26c90 .cfa: x29 160 + +STACK CFI 26c98 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 26d18 x19: x19 x20: x20 +STACK CFI 26d1c x21: x21 x22: x22 +STACK CFI 26d20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 36280 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 36294 34 .cfa: sp 0 + .ra: x30 +STACK CFI 36298 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 3629c .cfa: x29 208 + +STACK CFI 362a0 x19: .cfa -192 + ^ +STACK CFI 362c0 x19: x19 +STACK CFI 362c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 362c8 230 .cfa: sp 0 + .ra: x30 +STACK CFI 362cc .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 362d0 .cfa: x29 320 + +STACK CFI 362dc x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ +STACK CFI 364e8 x23: x23 +STACK CFI 364ec x19: x19 x20: x20 +STACK CFI 364f0 x21: x21 x22: x22 +STACK CFI 364f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 364f8 4fc .cfa: sp 0 + .ra: x30 +STACK CFI 364fc .cfa: sp 1024 + +STACK CFI 36500 .cfa: sp 1120 + .ra: .cfa -1112 + ^ x29: .cfa -1120 + ^ +STACK CFI 36504 .cfa: x29 1120 + +STACK CFI 36518 x19: .cfa -1104 + ^ x20: .cfa -1096 + ^ x21: .cfa -1088 + ^ x22: .cfa -1080 + ^ x23: .cfa -1072 + ^ x24: .cfa -1064 + ^ x25: .cfa -1056 + ^ x26: .cfa -1048 + ^ x27: .cfa -1040 + ^ +STACK CFI 369d8 x27: x27 +STACK CFI 369dc x19: x19 x20: x20 +STACK CFI 369e0 x21: x21 x22: x22 +STACK CFI 369e4 x23: x23 x24: x24 +STACK CFI 369e8 x25: x25 x26: x26 +STACK CFI 369ec .cfa: sp 1024 + .ra: .ra x29: x29 +STACK CFI 369f0 .cfa: sp 928 + +STACK CFI INIT 369f4 4b8 .cfa: sp 0 + .ra: x30 +STACK CFI 369f8 .cfa: sp 4096 + +STACK CFI 36a00 .cfa: sp 4512 + +STACK CFI 36a0c .cfa: sp 4576 + .ra: .cfa -4568 + ^ x29: .cfa -4576 + ^ +STACK CFI 36a10 .cfa: x29 4576 + +STACK CFI 36a14 x19: .cfa -4560 + ^ x20: .cfa -4552 + ^ +STACK CFI 36a24 x21: .cfa -4544 + ^ x22: .cfa -4536 + ^ x23: .cfa -4528 + ^ x24: .cfa -4520 + ^ +STACK CFI 36e94 x19: x19 x20: x20 +STACK CFI 36e98 x21: x21 x22: x22 +STACK CFI 36e9c x23: x23 x24: x24 +STACK CFI 36ea0 .cfa: sp 4512 + .ra: .ra x29: x29 +STACK CFI 36ea4 .cfa: sp 4096 + +STACK CFI 36ea8 .cfa: sp 4032 + +STACK CFI INIT 36eac 408 .cfa: sp 0 + .ra: x30 +STACK CFI 36eb0 .cfa: sp 432 + .ra: .cfa -424 + ^ x29: .cfa -432 + ^ +STACK CFI 36eb4 .cfa: x29 432 + +STACK CFI 36ec0 x19: .cfa -416 + ^ x20: .cfa -408 + ^ x21: .cfa -400 + ^ x22: .cfa -392 + ^ x23: .cfa -384 + ^ x24: .cfa -376 + ^ +STACK CFI 36ecc x25: .cfa -368 + ^ x26: .cfa -360 + ^ x27: .cfa -352 + ^ +STACK CFI 3729c x27: x27 +STACK CFI 372a0 x19: x19 x20: x20 +STACK CFI 372a4 x21: x21 x22: x22 +STACK CFI 372a8 x23: x23 x24: x24 +STACK CFI 372ac x25: x25 x26: x26 +STACK CFI 372b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 372b4 40c .cfa: sp 0 + .ra: x30 +STACK CFI 372b8 .cfa: sp 400 + .ra: .cfa -392 + ^ x29: .cfa -400 + ^ +STACK CFI 372bc .cfa: x29 400 + +STACK CFI 372cc x19: .cfa -384 + ^ x20: .cfa -376 + ^ x21: .cfa -368 + ^ x22: .cfa -360 + ^ x23: .cfa -352 + ^ x24: .cfa -344 + ^ x25: .cfa -336 + ^ +STACK CFI 376ac x25: x25 +STACK CFI 376b0 x19: x19 x20: x20 +STACK CFI 376b4 x21: x21 x22: x22 +STACK CFI 376b8 x23: x23 x24: x24 +STACK CFI 376bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 376c0 3e0 .cfa: sp 0 + .ra: x30 +STACK CFI 376c4 .cfa: sp 592 + +STACK CFI 376c8 .cfa: sp 672 + .ra: .cfa -664 + ^ x29: .cfa -672 + ^ +STACK CFI 376cc .cfa: x29 672 + +STACK CFI 376d8 x19: .cfa -656 + ^ x20: .cfa -648 + ^ x21: .cfa -640 + ^ x22: .cfa -632 + ^ x23: .cfa -624 + ^ x24: .cfa -616 + ^ +STACK CFI 376e4 x25: .cfa -608 + ^ x26: .cfa -600 + ^ +STACK CFI 37a88 x19: x19 x20: x20 +STACK CFI 37a8c x21: x21 x22: x22 +STACK CFI 37a90 x23: x23 x24: x24 +STACK CFI 37a94 x25: x25 x26: x26 +STACK CFI 37a98 .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 37a9c .cfa: sp 512 + +STACK CFI INIT 37aa0 3d8 .cfa: sp 0 + .ra: x30 +STACK CFI 37aa4 .cfa: sp 544 + +STACK CFI 37aa8 .cfa: sp 656 + .ra: .cfa -648 + ^ x29: .cfa -656 + ^ +STACK CFI 37aac .cfa: x29 656 + +STACK CFI 37ab4 v8: .cfa -560 + ^ x19: .cfa -640 + ^ x20: .cfa -632 + ^ +STACK CFI 37ac4 x21: .cfa -624 + ^ x22: .cfa -616 + ^ x23: .cfa -608 + ^ x24: .cfa -600 + ^ x25: .cfa -592 + ^ x26: .cfa -584 + ^ +STACK CFI 37ad0 x27: .cfa -576 + ^ x28: .cfa -568 + ^ +STACK CFI 37e58 v8: v8 +STACK CFI 37e5c x19: x19 x20: x20 +STACK CFI 37e60 x21: x21 x22: x22 +STACK CFI 37e64 x23: x23 x24: x24 +STACK CFI 37e68 x25: x25 x26: x26 +STACK CFI 37e6c x27: x27 x28: x28 +STACK CFI 37e70 .cfa: sp 544 + .ra: .ra x29: x29 +STACK CFI 37e74 .cfa: sp 432 + +STACK CFI INIT 37e78 b58 .cfa: sp 0 + .ra: x30 +STACK CFI 37e7c .cfa: sp 1120 + +STACK CFI 37e84 .cfa: sp 1248 + .ra: .cfa -1240 + ^ x29: .cfa -1248 + ^ +STACK CFI 37e88 .cfa: x29 1248 + +STACK CFI 37e90 v8: .cfa -1152 + ^ v9: .cfa -1144 + ^ x21: .cfa -1216 + ^ x22: .cfa -1208 + ^ +STACK CFI 37ea0 v10: .cfa -1136 + ^ v11: .cfa -1128 + ^ x27: .cfa -1168 + ^ x28: .cfa -1160 + ^ +STACK CFI 37eb0 x19: .cfa -1232 + ^ x20: .cfa -1224 + ^ +STACK CFI 37ec0 x23: .cfa -1200 + ^ x24: .cfa -1192 + ^ x25: .cfa -1184 + ^ x26: .cfa -1176 + ^ +STACK CFI 389ac x19: x19 x20: x20 +STACK CFI 389b0 v8: v8 v9: v9 +STACK CFI 389b4 x21: x21 x22: x22 +STACK CFI 389b8 v10: v10 v11: v11 +STACK CFI 389bc x23: x23 x24: x24 +STACK CFI 389c0 x25: x25 x26: x26 +STACK CFI 389c4 x27: x27 x28: x28 +STACK CFI 389c8 .cfa: sp 1120 + .ra: .ra x29: x29 +STACK CFI 389cc .cfa: sp 992 + +STACK CFI INIT 389d0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 389d4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 389d8 .cfa: x29 32 + +STACK CFI 389dc x19: .cfa -16 + ^ +STACK CFI 389ec x19: x19 +STACK CFI 389f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28540 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 28544 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28548 .cfa: x29 80 + +STACK CFI 28550 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 285e0 x21: x21 +STACK CFI 285e8 x19: x19 x20: x20 +STACK CFI 285ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 285f0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 285f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 285f8 .cfa: x29 32 + +STACK CFI 285fc x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 28648 x19: x19 x20: x20 +STACK CFI 2864c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28714 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 28718 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2871c .cfa: x29 48 + +STACK CFI 28724 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 287c0 x21: x21 +STACK CFI 287c4 x19: x19 x20: x20 +STACK CFI 287c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2633c 104 .cfa: sp 0 + .ra: x30 +STACK CFI 26340 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26348 .cfa: x29 80 + +STACK CFI 26350 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ +STACK CFI 26358 x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 26430 x23: x23 +STACK CFI 26434 x19: x19 x20: x20 +STACK CFI 26438 x21: x21 x22: x22 +STACK CFI 2643c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 218bc 2dc .cfa: sp 0 + .ra: x30 +STACK CFI 218c0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 218c8 .cfa: x29 64 + +STACK CFI 218d0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 21b88 x19: x19 x20: x20 +STACK CFI 21b8c x21: x21 x22: x22 +STACK CFI 21b94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 389f4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 389f8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 389fc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38a00 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38a04 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38a08 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38a0c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38a10 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38a14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 38a18 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38a20 .cfa: x29 32 + +STACK CFI 38a24 x19: .cfa -16 + ^ +STACK CFI 38a48 x19: x19 +STACK CFI 38a4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38a50 3c .cfa: sp 0 + .ra: x30 +STACK CFI 38a54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38a5c .cfa: x29 32 + +STACK CFI 38a60 x19: .cfa -16 + ^ +STACK CFI 38a84 x19: x19 +STACK CFI 38a88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38a8c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 38a90 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38a98 .cfa: x29 32 + +STACK CFI 38a9c x19: .cfa -16 + ^ +STACK CFI 38ac0 x19: x19 +STACK CFI 38ac4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38ac8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 38acc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38ad4 .cfa: x29 32 + +STACK CFI 38ad8 x19: .cfa -16 + ^ +STACK CFI 38afc x19: x19 +STACK CFI 38b00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38b04 3c .cfa: sp 0 + .ra: x30 +STACK CFI 38b08 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38b10 .cfa: x29 32 + +STACK CFI 38b14 x19: .cfa -16 + ^ +STACK CFI 38b38 x19: x19 +STACK CFI 38b3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38b40 3c .cfa: sp 0 + .ra: x30 +STACK CFI 38b44 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38b4c .cfa: x29 32 + +STACK CFI 38b50 x19: .cfa -16 + ^ +STACK CFI 38b74 x19: x19 +STACK CFI 38b78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38b7c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 38b80 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38b88 .cfa: x29 32 + +STACK CFI 38b8c x19: .cfa -16 + ^ +STACK CFI 38bb0 x19: x19 +STACK CFI 38bb4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38bb8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 38bbc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38bc4 .cfa: x29 32 + +STACK CFI 38bc8 x19: .cfa -16 + ^ +STACK CFI 38bec x19: x19 +STACK CFI 38bf0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38bf4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38bf8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38bfc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38c00 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38c04 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38c08 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38c0c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38c10 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38c14 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38c28 24 .cfa: sp 0 + .ra: x30 +STACK CFI 38c2c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38c30 .cfa: x29 32 + +STACK CFI 38c34 x19: .cfa -16 + ^ +STACK CFI 38c44 x19: x19 +STACK CFI 38c48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38c4c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38c60 24 .cfa: sp 0 + .ra: x30 +STACK CFI 38c64 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38c68 .cfa: x29 32 + +STACK CFI 38c6c x19: .cfa -16 + ^ +STACK CFI 38c7c x19: x19 +STACK CFI 38c80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38c84 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38c98 24 .cfa: sp 0 + .ra: x30 +STACK CFI 38c9c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38ca0 .cfa: x29 32 + +STACK CFI 38ca4 x19: .cfa -16 + ^ +STACK CFI 38cb4 x19: x19 +STACK CFI 38cb8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38cbc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38cd0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 38cd4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38cd8 .cfa: x29 32 + +STACK CFI 38cdc x19: .cfa -16 + ^ +STACK CFI 38cec x19: x19 +STACK CFI 38cf0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38cf4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38d08 24 .cfa: sp 0 + .ra: x30 +STACK CFI 38d0c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38d10 .cfa: x29 32 + +STACK CFI 38d14 x19: .cfa -16 + ^ +STACK CFI 38d24 x19: x19 +STACK CFI 38d28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38d2c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38d40 24 .cfa: sp 0 + .ra: x30 +STACK CFI 38d44 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38d48 .cfa: x29 32 + +STACK CFI 38d4c x19: .cfa -16 + ^ +STACK CFI 38d5c x19: x19 +STACK CFI 38d60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38d64 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38d78 24 .cfa: sp 0 + .ra: x30 +STACK CFI 38d7c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38d80 .cfa: x29 32 + +STACK CFI 38d84 x19: .cfa -16 + ^ +STACK CFI 38d94 x19: x19 +STACK CFI 38d98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38d9c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 38db0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 38db4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38db8 .cfa: x29 32 + +STACK CFI 38dbc x19: .cfa -16 + ^ +STACK CFI 38dcc x19: x19 +STACK CFI 38dd0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24884 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24998 60 .cfa: sp 0 + .ra: x30 +STACK CFI 2499c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 249a0 .cfa: x29 48 + +STACK CFI 249a8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 249ec x19: x19 x20: x20 +STACK CFI 249f0 x21: x21 +STACK CFI 249f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 249f8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24c60 98 .cfa: sp 0 + .ra: x30 +STACK CFI 24c64 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24c68 .cfa: x29 64 + +STACK CFI 24c70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24cec x19: x19 x20: x20 +STACK CFI 24cf0 x21: x21 +STACK CFI 24cf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38dd4 fc .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24d50 60 .cfa: sp 0 + .ra: x30 +STACK CFI 24d54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24d60 .cfa: x29 32 + +STACK CFI 24d64 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 24da8 x19: x19 x20: x20 +STACK CFI 24dac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38ed0 5c .cfa: sp 0 + .ra: x30 +STACK CFI 38ed4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38ed8 .cfa: x29 32 + +STACK CFI 38edc x19: .cfa -16 + ^ +STACK CFI 38f24 x19: x19 +STACK CFI 38f28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38f2c 5c .cfa: sp 0 + .ra: x30 +STACK CFI 38f30 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 38f38 .cfa: x29 64 + +STACK CFI 38f3c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 38f80 x19: x19 x20: x20 +STACK CFI 38f84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25040 64 .cfa: sp 0 + .ra: x30 +STACK CFI 25044 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25048 .cfa: x29 48 + +STACK CFI 2504c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25058 x21: .cfa -16 + ^ +STACK CFI 25098 x19: x19 x20: x20 +STACK CFI 2509c x21: x21 +STACK CFI 250a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25768 13c .cfa: sp 0 + .ra: x30 +STACK CFI 2576c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 25770 .cfa: x29 64 + +STACK CFI 25778 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 25898 x19: x19 x20: x20 +STACK CFI 2589c x21: x21 x22: x22 +STACK CFI 258a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25964 104 .cfa: sp 0 + .ra: x30 +STACK CFI 25968 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 2596c .cfa: x29 80 + +STACK CFI 25978 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 25a58 x19: x19 x20: x20 +STACK CFI 25a5c x21: x21 x22: x22 +STACK CFI 25a60 x23: x23 x24: x24 +STACK CFI 25a64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b28 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 154 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 144 x23: x23 +STACK CFI 148 x19: x19 x20: x20 +STACK CFI 14c x21: x21 x22: x22 +STACK CFI 150 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38f88 34 .cfa: sp 0 + .ra: x30 +STACK CFI 38f8c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 38f90 .cfa: x29 48 + +STACK CFI 38f94 x19: .cfa -32 + ^ +STACK CFI 38fb4 x19: x19 +STACK CFI 38fb8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 2a0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI c .cfa: x29 272 + +STACK CFI 10 x19: .cfa -256 + ^ x20: .cfa -248 + ^ +STACK CFI 20 x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ x25: .cfa -208 + ^ +STACK CFI 28c x19: x19 x20: x20 +STACK CFI 290 x21: x21 x22: x22 +STACK CFI 294 x23: x23 x24: x24 +STACK CFI 298 x25: x25 +STACK CFI 29c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI 14 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ +STACK CFI 98 x23: x23 +STACK CFI 9c x19: x19 x20: x20 +STACK CFI a0 x21: x21 x22: x22 +STACK CFI a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26188 54 .cfa: sp 0 + .ra: x30 +STACK CFI 2618c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26190 .cfa: x29 64 + +STACK CFI 26194 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 261d4 x19: x19 x20: x20 +STACK CFI 261d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 261dc 64 .cfa: sp 0 + .ra: x30 +STACK CFI 261e0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 261e4 .cfa: x29 64 + +STACK CFI 261e8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26238 x19: x19 x20: x20 +STACK CFI 2623c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26240 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26244 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26248 .cfa: x29 64 + +STACK CFI 2624c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2628c x19: x19 x20: x20 +STACK CFI 26290 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26294 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26298 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2629c .cfa: x29 64 + +STACK CFI 262a0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 262e0 x19: x19 x20: x20 +STACK CFI 262e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 262e8 54 .cfa: sp 0 + .ra: x30 +STACK CFI 262ec .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 262f0 .cfa: x29 64 + +STACK CFI 262f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26334 x19: x19 x20: x20 +STACK CFI 26338 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38fbc 40 .cfa: sp 0 + .ra: x30 +STACK CFI 38fc0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 38fc4 .cfa: x29 32 + +STACK CFI 38fc8 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 38ff4 x19: x19 x20: x20 +STACK CFI 38ff8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 38ffc 44 .cfa: sp 0 + .ra: x30 +STACK CFI 39000 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 39004 .cfa: x29 32 + +STACK CFI 39008 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 39038 x19: x19 x20: x20 +STACK CFI 3903c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI e4 x23: x23 +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26440 8c .cfa: sp 0 + .ra: x30 +STACK CFI 26444 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26448 .cfa: x29 64 + +STACK CFI 2644c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2645c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 264c0 x19: x19 x20: x20 +STACK CFI 264c4 x21: x21 x22: x22 +STACK CFI 264c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 264cc 370 .cfa: sp 0 + .ra: x30 +STACK CFI 264d0 .cfa: sp 368 + .ra: .cfa -360 + ^ x29: .cfa -368 + ^ +STACK CFI 264d4 .cfa: x29 368 + +STACK CFI 264e8 x19: .cfa -352 + ^ x20: .cfa -344 + ^ x21: .cfa -336 + ^ x22: .cfa -328 + ^ x23: .cfa -320 + ^ x24: .cfa -312 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ x27: .cfa -288 + ^ x28: .cfa -280 + ^ +STACK CFI 26824 x19: x19 x20: x20 +STACK CFI 26828 x21: x21 x22: x22 +STACK CFI 2682c x23: x23 x24: x24 +STACK CFI 26830 x25: x25 x26: x26 +STACK CFI 26834 x27: x27 x28: x28 +STACK CFI 26838 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2683c 28 .cfa: sp 0 + .ra: x30 +STACK CFI 26840 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 26848 .cfa: x29 32 + +STACK CFI 2684c x19: .cfa -16 + ^ +STACK CFI 2685c x19: x19 +STACK CFI 26860 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26aa8 88 .cfa: sp 0 + .ra: x30 +STACK CFI 26aac .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 26ab4 .cfa: x29 336 + +STACK CFI 26ab8 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 26ac0 x21: .cfa -304 + ^ +STACK CFI 26b20 x21: x21 +STACK CFI 26b28 x19: x19 x20: x20 +STACK CFI 26b2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26b30 114 .cfa: sp 0 + .ra: x30 +STACK CFI 26b34 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 26b38 .cfa: x29 224 + +STACK CFI 26b3c x19: .cfa -208 + ^ x20: .cfa -200 + ^ +STACK CFI 26b48 x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ +STACK CFI 26c30 x23: x23 +STACK CFI 26c38 x19: x19 x20: x20 +STACK CFI 26c3c x21: x21 x22: x22 +STACK CFI 26c40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26c44 44 .cfa: sp 0 + .ra: x30 +STACK CFI 26c48 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 26c4c .cfa: x29 32 + +STACK CFI 26c58 x19: .cfa -16 + ^ +STACK CFI 26c80 x19: x19 +STACK CFI 26c84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26c88 9c .cfa: sp 0 + .ra: x30 +STACK CFI 26c8c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 26c90 .cfa: x29 160 + +STACK CFI 26c98 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 26d18 x19: x19 x20: x20 +STACK CFI 26d1c x21: x21 x22: x22 +STACK CFI 26d20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26f1c 5c .cfa: sp 0 + .ra: x30 +STACK CFI 26f20 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 26f28 .cfa: x29 336 + +STACK CFI 26f2c x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 26f34 x21: .cfa -304 + ^ +STACK CFI 26f68 x21: x21 +STACK CFI 26f70 x19: x19 x20: x20 +STACK CFI 26f74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2744c 134 .cfa: sp 0 + .ra: x30 +STACK CFI 27450 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 27454 .cfa: x29 224 + +STACK CFI 27460 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ +STACK CFI 27570 x23: x23 +STACK CFI 27574 x19: x19 x20: x20 +STACK CFI 27578 x21: x21 x22: x22 +STACK CFI 2757c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 39040 354 .cfa: sp 0 + .ra: x30 +STACK CFI 39044 .cfa: sp 4096 + +STACK CFI 3904c .cfa: sp 5504 + +STACK CFI 39050 .cfa: sp 5600 + .ra: .cfa -5592 + ^ x29: .cfa -5600 + ^ +STACK CFI 39054 .cfa: x29 5600 + +STACK CFI 39058 x19: .cfa -5584 + ^ x20: .cfa -5576 + ^ +STACK CFI 39060 x21: .cfa -5568 + ^ x22: .cfa -5560 + ^ +STACK CFI 39074 x23: .cfa -5552 + ^ x24: .cfa -5544 + ^ x25: .cfa -5536 + ^ x26: .cfa -5528 + ^ x27: .cfa -5520 + ^ x28: .cfa -5512 + ^ +STACK CFI 39374 x19: x19 x20: x20 +STACK CFI 39378 x21: x21 x22: x22 +STACK CFI 3937c x23: x23 x24: x24 +STACK CFI 39380 x25: x25 x26: x26 +STACK CFI 39384 x27: x27 x28: x28 +STACK CFI 39388 .cfa: sp 5504 + .ra: .ra x29: x29 +STACK CFI 3938c .cfa: sp 4096 + +STACK CFI 39390 .cfa: sp 4000 + +STACK CFI INIT 39394 360 .cfa: sp 0 + .ra: x30 +STACK CFI 39398 .cfa: sp 4096 + +STACK CFI 393a0 .cfa: sp 5504 + +STACK CFI 393a4 .cfa: sp 5600 + .ra: .cfa -5592 + ^ x29: .cfa -5600 + ^ +STACK CFI 393a8 .cfa: x29 5600 + +STACK CFI 393ac x19: .cfa -5584 + ^ x20: .cfa -5576 + ^ +STACK CFI 393b4 x21: .cfa -5568 + ^ x22: .cfa -5560 + ^ +STACK CFI 393c8 x23: .cfa -5552 + ^ x24: .cfa -5544 + ^ x25: .cfa -5536 + ^ x26: .cfa -5528 + ^ x27: .cfa -5520 + ^ x28: .cfa -5512 + ^ +STACK CFI 396d4 x19: x19 x20: x20 +STACK CFI 396d8 x21: x21 x22: x22 +STACK CFI 396dc x23: x23 x24: x24 +STACK CFI 396e0 x25: x25 x26: x26 +STACK CFI 396e4 x27: x27 x28: x28 +STACK CFI 396e8 .cfa: sp 5504 + .ra: .ra x29: x29 +STACK CFI 396ec .cfa: sp 4096 + +STACK CFI 396f0 .cfa: sp 4000 + +STACK CFI INIT 26f78 9c .cfa: sp 0 + .ra: x30 +STACK CFI 26f7c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 26f80 .cfa: x29 160 + +STACK CFI 26f88 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 27008 x19: x19 x20: x20 +STACK CFI 2700c x21: x21 x22: x22 +STACK CFI 27010 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28074 5c .cfa: sp 0 + .ra: x30 +STACK CFI 28078 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 28080 .cfa: x29 336 + +STACK CFI 28084 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 2808c x21: .cfa -304 + ^ +STACK CFI 280c0 x21: x21 +STACK CFI 280c8 x19: x19 x20: x20 +STACK CFI 280cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28208 9c .cfa: sp 0 + .ra: x30 +STACK CFI 2820c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 28210 .cfa: x29 160 + +STACK CFI 28218 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 28298 x19: x19 x20: x20 +STACK CFI 2829c x21: x21 x22: x22 +STACK CFI 282a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 279ec 5c .cfa: sp 0 + .ra: x30 +STACK CFI 279f0 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 279f8 .cfa: x29 336 + +STACK CFI 279fc x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 27a04 x21: .cfa -304 + ^ +STACK CFI 27a38 x21: x21 +STACK CFI 27a40 x19: x19 x20: x20 +STACK CFI 27a44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27d70 5c .cfa: sp 0 + .ra: x30 +STACK CFI 27d74 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 27d7c .cfa: x29 336 + +STACK CFI 27d80 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 27d88 x21: .cfa -304 + ^ +STACK CFI 27dbc x21: x21 +STACK CFI 27dc4 x19: x19 x20: x20 +STACK CFI 27dc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27dcc c0 .cfa: sp 0 + .ra: x30 +STACK CFI 27dd0 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 27dd4 .cfa: x29 160 + +STACK CFI 27de0 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ +STACK CFI 27e7c x19: x19 x20: x20 +STACK CFI 27e80 x21: x21 x22: x22 +STACK CFI 27e84 x23: x23 x24: x24 +STACK CFI 27e88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 396f4 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 396f8 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 396fc .cfa: x29 416 + +STACK CFI 39704 x21: .cfa -384 + ^ x22: .cfa -376 + ^ x23: .cfa -368 + ^ +STACK CFI 3970c x19: .cfa -400 + ^ x20: .cfa -392 + ^ +STACK CFI 397d4 x23: x23 +STACK CFI 397d8 x19: x19 x20: x20 +STACK CFI 397dc x21: x21 x22: x22 +STACK CFI 397e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28714 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 28718 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2871c .cfa: x29 48 + +STACK CFI 28724 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 287c0 x21: x21 +STACK CFI 287c4 x19: x19 x20: x20 +STACK CFI 287c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 285f0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 285f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 285f8 .cfa: x29 32 + +STACK CFI 285fc x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 28648 x19: x19 x20: x20 +STACK CFI 2864c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 21b98 2b8 .cfa: sp 0 + .ra: x30 +STACK CFI 21b9c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 21ba0 .cfa: x29 64 + +STACK CFI 21ba8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 21e3c x21: x21 +STACK CFI 21e44 x19: x19 x20: x20 +STACK CFI 21e48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 397e4 10b4 .cfa: sp 0 + .ra: x30 +STACK CFI 397e8 .cfa: sp 4096 + +STACK CFI 397ec .cfa: sp 6320 + +STACK CFI 397f0 .cfa: sp 6416 + .ra: .cfa -6408 + ^ x29: .cfa -6416 + ^ +STACK CFI 397f4 .cfa: x29 6416 + +STACK CFI 397f8 x19: .cfa -6400 + ^ x20: .cfa -6392 + ^ +STACK CFI 3980c x21: .cfa -6384 + ^ x22: .cfa -6376 + ^ x27: .cfa -6336 + ^ +STACK CFI 3981c x23: .cfa -6368 + ^ x24: .cfa -6360 + ^ x25: .cfa -6352 + ^ x26: .cfa -6344 + ^ +STACK CFI 3a878 x19: x19 x20: x20 +STACK CFI 3a87c x21: x21 x22: x22 +STACK CFI 3a880 x23: x23 x24: x24 +STACK CFI 3a884 x25: x25 x26: x26 +STACK CFI 3a888 x27: x27 +STACK CFI 3a88c .cfa: sp 6320 + .ra: .ra x29: x29 +STACK CFI 3a890 .cfa: sp 4096 + +STACK CFI 3a894 .cfa: sp 4000 + +STACK CFI INIT 3a898 aac .cfa: sp 0 + .ra: x30 +STACK CFI 3a89c .cfa: sp 4096 + +STACK CFI 3a8a0 .cfa: sp 6320 + +STACK CFI 3a8a4 .cfa: sp 6416 + .ra: .cfa -6408 + ^ x29: .cfa -6416 + ^ +STACK CFI 3a8a8 .cfa: x29 6416 + +STACK CFI 3a8ac x19: .cfa -6400 + ^ x20: .cfa -6392 + ^ +STACK CFI 3a8c8 x21: .cfa -6384 + ^ x22: .cfa -6376 + ^ x23: .cfa -6368 + ^ x24: .cfa -6360 + ^ x25: .cfa -6352 + ^ x26: .cfa -6344 + ^ x27: .cfa -6336 + ^ x28: .cfa -6328 + ^ +STACK CFI 3b324 x19: x19 x20: x20 +STACK CFI 3b328 x21: x21 x22: x22 +STACK CFI 3b32c x23: x23 x24: x24 +STACK CFI 3b330 x25: x25 x26: x26 +STACK CFI 3b334 x27: x27 x28: x28 +STACK CFI 3b338 .cfa: sp 6320 + .ra: .ra x29: x29 +STACK CFI 3b33c .cfa: sp 4096 + +STACK CFI 3b340 .cfa: sp 4000 + +STACK CFI INIT 3b344 b84 .cfa: sp 0 + .ra: x30 +STACK CFI 3b348 .cfa: sp 4096 + +STACK CFI 3b34c .cfa: sp 6000 + +STACK CFI 3b350 .cfa: sp 6112 + .ra: .cfa -6104 + ^ x29: .cfa -6112 + ^ +STACK CFI 3b354 .cfa: x29 6112 + +STACK CFI 3b358 x19: .cfa -6096 + ^ x20: .cfa -6088 + ^ +STACK CFI 3b364 v8: .cfa -6016 + ^ +STACK CFI 3b370 x21: .cfa -6080 + ^ x22: .cfa -6072 + ^ x27: .cfa -6032 + ^ x28: .cfa -6024 + ^ +STACK CFI 3b388 x23: .cfa -6064 + ^ x24: .cfa -6056 + ^ x25: .cfa -6048 + ^ x26: .cfa -6040 + ^ +STACK CFI 3b7d4 v8: v8 +STACK CFI 3b7d8 x19: x19 x20: x20 +STACK CFI 3b7dc x21: x21 x22: x22 +STACK CFI 3b7e0 x23: x23 x24: x24 +STACK CFI 3b7e4 x25: x25 x26: x26 +STACK CFI 3b7e8 x27: x27 x28: x28 +STACK CFI 3b7ec .cfa: sp 6000 + .ra: .ra x29: x29 +STACK CFI 3b7f0 .cfa: sp 4096 + +STACK CFI 3b7f4 .cfa: sp 3984 + +STACK CFI 3b7f8 .cfa: x29 6112 + .ra: .cfa -6104 + ^ v8: .cfa -6016 + ^ x19: .cfa -6096 + ^ x20: .cfa -6088 + ^ x21: .cfa -6080 + ^ x22: .cfa -6072 + ^ x23: .cfa -6064 + ^ x24: .cfa -6056 + ^ x25: .cfa -6048 + ^ x26: .cfa -6040 + ^ x27: .cfa -6032 + ^ x28: .cfa -6024 + ^ x29: .cfa -6112 + ^ +STACK CFI INIT 3bec8 3ac .cfa: sp 0 + .ra: x30 +STACK CFI 3becc .cfa: sp 4096 + +STACK CFI 3bed4 .cfa: sp 5536 + +STACK CFI 3bed8 .cfa: sp 5632 + .ra: .cfa -5624 + ^ x29: .cfa -5632 + ^ +STACK CFI 3bedc .cfa: x29 5632 + +STACK CFI 3bee0 x19: .cfa -5616 + ^ x20: .cfa -5608 + ^ +STACK CFI 3beec x21: .cfa -5600 + ^ x22: .cfa -5592 + ^ x27: .cfa -5552 + ^ +STACK CFI 3befc x23: .cfa -5584 + ^ x24: .cfa -5576 + ^ x25: .cfa -5568 + ^ x26: .cfa -5560 + ^ +STACK CFI 3c254 x19: x19 x20: x20 +STACK CFI 3c258 x21: x21 x22: x22 +STACK CFI 3c25c x23: x23 x24: x24 +STACK CFI 3c260 x25: x25 x26: x26 +STACK CFI 3c264 x27: x27 +STACK CFI 3c268 .cfa: sp 5536 + .ra: .ra x29: x29 +STACK CFI 3c26c .cfa: sp 4096 + +STACK CFI 3c270 .cfa: sp 4000 + +STACK CFI INIT 3c274 790 .cfa: sp 0 + .ra: x30 +STACK CFI 3c278 .cfa: sp 4096 + +STACK CFI 3c280 .cfa: sp 5632 + +STACK CFI 3c284 .cfa: sp 5728 + .ra: .cfa -5720 + ^ x29: .cfa -5728 + ^ +STACK CFI 3c288 .cfa: x29 5728 + +STACK CFI 3c28c x19: .cfa -5712 + ^ x20: .cfa -5704 + ^ +STACK CFI 3c298 x21: .cfa -5696 + ^ x22: .cfa -5688 + ^ x27: .cfa -5648 + ^ +STACK CFI 3c2a8 x23: .cfa -5680 + ^ x24: .cfa -5672 + ^ x25: .cfa -5664 + ^ x26: .cfa -5656 + ^ +STACK CFI 3c9e4 x19: x19 x20: x20 +STACK CFI 3c9e8 x21: x21 x22: x22 +STACK CFI 3c9ec x23: x23 x24: x24 +STACK CFI 3c9f0 x25: x25 x26: x26 +STACK CFI 3c9f4 x27: x27 +STACK CFI 3c9f8 .cfa: sp 5632 + .ra: .ra x29: x29 +STACK CFI 3c9fc .cfa: sp 4096 + +STACK CFI 3ca00 .cfa: sp 4000 + +STACK CFI INIT 3ca04 113c .cfa: sp 0 + .ra: x30 +STACK CFI 3ca08 .cfa: sp 544 + +STACK CFI 3ca10 .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 3ca14 .cfa: x29 688 + +STACK CFI 3ca1c v8: .cfa -592 + ^ v9: .cfa -584 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ +STACK CFI 3ca2c v10: .cfa -576 + ^ v11: .cfa -568 + ^ v12: .cfa -560 + ^ v13: .cfa -552 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ +STACK CFI 3ca44 x21: .cfa -656 + ^ x22: .cfa -648 + ^ x27: .cfa -608 + ^ x28: .cfa -600 + ^ +STACK CFI 3ca50 x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 3cdf4 v8: v8 v9: v9 +STACK CFI 3cdf8 x19: x19 x20: x20 +STACK CFI 3cdfc x21: x21 x22: x22 +STACK CFI 3ce00 v10: v10 v11: v11 +STACK CFI 3ce04 x23: x23 x24: x24 +STACK CFI 3ce08 v12: v12 v13: v13 +STACK CFI 3ce0c x25: x25 x26: x26 +STACK CFI 3ce10 x27: x27 x28: x28 +STACK CFI 3ce14 .cfa: sp 544 + .ra: .ra x29: x29 +STACK CFI 3ce18 .cfa: sp 400 + +STACK CFI 3ce1c .cfa: x29 688 + .ra: .cfa -680 + ^ v10: .cfa -576 + ^ v11: .cfa -568 + ^ v12: .cfa -560 + ^ v13: .cfa -552 + ^ v8: .cfa -592 + ^ v9: .cfa -584 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x28: .cfa -600 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24d50 60 .cfa: sp 0 + .ra: x30 +STACK CFI 24d54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24d60 .cfa: x29 32 + +STACK CFI 24d64 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 24da8 x19: x19 x20: x20 +STACK CFI 24dac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25040 64 .cfa: sp 0 + .ra: x30 +STACK CFI 25044 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25048 .cfa: x29 48 + +STACK CFI 2504c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25058 x21: .cfa -16 + ^ +STACK CFI 25098 x19: x19 x20: x20 +STACK CFI 2509c x21: x21 +STACK CFI 250a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 170 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 160 x23: x23 +STACK CFI 164 x19: x19 x20: x20 +STACK CFI 168 x21: x21 x22: x22 +STACK CFI 16c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25d14 90 .cfa: sp 0 + .ra: x30 +STACK CFI 25d18 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25d1c .cfa: x29 48 + +STACK CFI 25d20 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25d2c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 25d98 x19: x19 x20: x20 +STACK CFI 25d9c x21: x21 x22: x22 +STACK CFI 25da0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3db40 390 .cfa: sp 0 + .ra: x30 +STACK CFI 3db44 .cfa: sp 4096 + +STACK CFI 3db4c .cfa: sp 4208 + +STACK CFI 3db50 .cfa: sp 4272 + .ra: .cfa -4264 + ^ x29: .cfa -4272 + ^ +STACK CFI 3db54 .cfa: x29 4272 + +STACK CFI 3db58 x19: .cfa -4256 + ^ x20: .cfa -4248 + ^ +STACK CFI 3db64 x21: .cfa -4240 + ^ x22: .cfa -4232 + ^ +STACK CFI 3db6c x23: .cfa -4224 + ^ +STACK CFI 3deb4 x23: x23 +STACK CFI 3debc x19: x19 x20: x20 +STACK CFI 3dec0 x21: x21 x22: x22 +STACK CFI 3dec4 .cfa: sp 4208 + .ra: .ra x29: x29 +STACK CFI 3dec8 .cfa: sp 4096 + +STACK CFI 3decc .cfa: sp 4032 + +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3ded0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3ded4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3ded8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3dedc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3dee0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3dee4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3dee8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3deec 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3def0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3def4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3def8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3defc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3df00 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3df04 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3df08 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3df0c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3df10 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3df14 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3df18 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3df1c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3df20 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3df34 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3df38 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3df3c .cfa: x29 32 + +STACK CFI 3df40 x19: .cfa -16 + ^ +STACK CFI 3df50 x19: x19 +STACK CFI 3df54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3df58 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3df6c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3df70 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3df74 .cfa: x29 32 + +STACK CFI 3df78 x19: .cfa -16 + ^ +STACK CFI 3df88 x19: x19 +STACK CFI 3df8c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3df90 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3dfa4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3dfa8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3dfac .cfa: x29 32 + +STACK CFI 3dfb0 x19: .cfa -16 + ^ +STACK CFI 3dfc0 x19: x19 +STACK CFI 3dfc4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3dfc8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3dfdc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3dfe0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3dfe4 .cfa: x29 32 + +STACK CFI 3dfe8 x19: .cfa -16 + ^ +STACK CFI 3dff8 x19: x19 +STACK CFI 3dffc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e000 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3e014 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3e018 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e01c .cfa: x29 32 + +STACK CFI 3e020 x19: .cfa -16 + ^ +STACK CFI 3e030 x19: x19 +STACK CFI 3e034 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e038 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3e04c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3e050 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e054 .cfa: x29 32 + +STACK CFI 3e058 x19: .cfa -16 + ^ +STACK CFI 3e068 x19: x19 +STACK CFI 3e06c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e070 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3e084 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3e088 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e08c .cfa: x29 32 + +STACK CFI 3e090 x19: .cfa -16 + ^ +STACK CFI 3e0a0 x19: x19 +STACK CFI 3e0a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e0a8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3e0bc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3e0c0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e0c4 .cfa: x29 32 + +STACK CFI 3e0c8 x19: .cfa -16 + ^ +STACK CFI 3e0d8 x19: x19 +STACK CFI 3e0dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e0e0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3e0f4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3e0f8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e0fc .cfa: x29 32 + +STACK CFI 3e100 x19: .cfa -16 + ^ +STACK CFI 3e110 x19: x19 +STACK CFI 3e114 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e118 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 3e12c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 3e130 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e134 .cfa: x29 32 + +STACK CFI 3e138 x19: .cfa -16 + ^ +STACK CFI 3e148 x19: x19 +STACK CFI 3e14c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e150 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3e154 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e15c .cfa: x29 32 + +STACK CFI 3e160 x19: .cfa -16 + ^ +STACK CFI 3e184 x19: x19 +STACK CFI 3e188 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e18c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3e190 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e198 .cfa: x29 32 + +STACK CFI 3e19c x19: .cfa -16 + ^ +STACK CFI 3e1c0 x19: x19 +STACK CFI 3e1c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e1c8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3e1cc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e1d4 .cfa: x29 32 + +STACK CFI 3e1d8 x19: .cfa -16 + ^ +STACK CFI 3e1fc x19: x19 +STACK CFI 3e200 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e204 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3e208 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e210 .cfa: x29 32 + +STACK CFI 3e214 x19: .cfa -16 + ^ +STACK CFI 3e238 x19: x19 +STACK CFI 3e23c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e240 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3e244 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e24c .cfa: x29 32 + +STACK CFI 3e250 x19: .cfa -16 + ^ +STACK CFI 3e274 x19: x19 +STACK CFI 3e278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e27c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3e280 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e288 .cfa: x29 32 + +STACK CFI 3e28c x19: .cfa -16 + ^ +STACK CFI 3e2b0 x19: x19 +STACK CFI 3e2b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e2b8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3e2bc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e2c4 .cfa: x29 32 + +STACK CFI 3e2c8 x19: .cfa -16 + ^ +STACK CFI 3e2ec x19: x19 +STACK CFI 3e2f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e2f4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3e2f8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e300 .cfa: x29 32 + +STACK CFI 3e304 x19: .cfa -16 + ^ +STACK CFI 3e328 x19: x19 +STACK CFI 3e32c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e330 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3e334 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e33c .cfa: x29 32 + +STACK CFI 3e340 x19: .cfa -16 + ^ +STACK CFI 3e364 x19: x19 +STACK CFI 3e368 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e36c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 3e370 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 3e378 .cfa: x29 32 + +STACK CFI 3e37c x19: .cfa -16 + ^ +STACK CFI 3e3a0 x19: x19 +STACK CFI 3e3a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e3a8 1cc .cfa: sp 0 + .ra: x30 +STACK CFI 3e3ac .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 3e3b0 .cfa: x29 96 + +STACK CFI 3e3c4 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ +STACK CFI 3e55c x27: x27 +STACK CFI 3e560 x19: x19 x20: x20 +STACK CFI 3e564 x21: x21 x22: x22 +STACK CFI 3e568 x23: x23 x24: x24 +STACK CFI 3e56c x25: x25 x26: x26 +STACK CFI 3e570 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24884 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2fe54 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2fe64 68 .cfa: sp 0 + .ra: x30 +STACK CFI 2fe68 .cfa: sp 4096 + +STACK CFI 2fe7c .cfa: sp 4128 + .ra: .cfa -4120 + ^ x29: .cfa -4128 + ^ +STACK CFI 2fe80 .cfa: x29 4128 + +STACK CFI 2fe84 x19: .cfa -4112 + ^ x20: .cfa -4104 + ^ +STACK CFI 2fec0 x19: x19 x20: x20 +STACK CFI 2fec4 .cfa: sp 4096 + .ra: .ra x29: x29 +STACK CFI 2fec8 .cfa: sp 4064 + +STACK CFI INIT 3e574 ac .cfa: sp 0 + .ra: x30 +STACK CFI 3e578 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 3e57c .cfa: x29 48 + +STACK CFI 3e580 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 3e58c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 3e600 x19: x19 x20: x20 +STACK CFI 3e604 x21: x21 x22: x22 +STACK CFI 3e608 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 3e610 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 3e614 x19: x19 x20: x20 +STACK CFI 3e618 x21: x21 x22: x22 +STACK CFI 3e61c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 48 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3e620 1ac .cfa: sp 0 + .ra: x30 +STACK CFI 3e624 .cfa: sp 640 + +STACK CFI 3e630 .cfa: sp 704 + .ra: .cfa -696 + ^ x29: .cfa -704 + ^ +STACK CFI 3e634 .cfa: x29 704 + +STACK CFI 3e638 x21: .cfa -672 + ^ x22: .cfa -664 + ^ +STACK CFI 3e64c x19: .cfa -688 + ^ x20: .cfa -680 + ^ x23: .cfa -656 + ^ +STACK CFI 3e7b8 x23: x23 +STACK CFI 3e7bc x19: x19 x20: x20 +STACK CFI 3e7c0 x21: x21 x22: x22 +STACK CFI 3e7c4 .cfa: sp 640 + .ra: .ra x29: x29 +STACK CFI 3e7c8 .cfa: sp 576 + +STACK CFI INIT 3e7cc 2fc .cfa: sp 0 + .ra: x30 +STACK CFI 3e7d0 .cfa: sp 640 + +STACK CFI 3e7dc .cfa: sp 720 + .ra: .cfa -712 + ^ x29: .cfa -720 + ^ +STACK CFI 3e7e0 .cfa: x29 720 + +STACK CFI 3e7e4 x23: .cfa -672 + ^ x24: .cfa -664 + ^ +STACK CFI 3e7f8 x19: .cfa -704 + ^ x20: .cfa -696 + ^ x21: .cfa -688 + ^ x22: .cfa -680 + ^ x25: .cfa -656 + ^ +STACK CFI 3eab0 x25: x25 +STACK CFI 3eab4 x19: x19 x20: x20 +STACK CFI 3eab8 x21: x21 x22: x22 +STACK CFI 3eabc x23: x23 x24: x24 +STACK CFI 3eac0 .cfa: sp 640 + .ra: .ra x29: x29 +STACK CFI 3eac4 .cfa: sp 560 + +STACK CFI INIT 3eac8 420 .cfa: sp 0 + .ra: x30 +STACK CFI 3eacc .cfa: sp 640 + +STACK CFI 3ead8 .cfa: sp 736 + .ra: .cfa -728 + ^ x29: .cfa -736 + ^ +STACK CFI 3eadc .cfa: x29 736 + +STACK CFI 3eae0 x23: .cfa -688 + ^ x24: .cfa -680 + ^ +STACK CFI 3eaf8 x19: .cfa -720 + ^ x20: .cfa -712 + ^ x21: .cfa -704 + ^ x22: .cfa -696 + ^ x25: .cfa -672 + ^ x26: .cfa -664 + ^ x27: .cfa -656 + ^ +STACK CFI 3eecc x27: x27 +STACK CFI 3eed0 x19: x19 x20: x20 +STACK CFI 3eed4 x21: x21 x22: x22 +STACK CFI 3eed8 x23: x23 x24: x24 +STACK CFI 3eedc x25: x25 x26: x26 +STACK CFI 3eee0 .cfa: sp 640 + .ra: .ra x29: x29 +STACK CFI 3eee4 .cfa: sp 544 + +STACK CFI INIT 3eee8 2fc .cfa: sp 0 + .ra: x30 +STACK CFI 3eeec .cfa: sp 640 + +STACK CFI 3eef8 .cfa: sp 720 + .ra: .cfa -712 + ^ x29: .cfa -720 + ^ +STACK CFI 3eefc .cfa: x29 720 + +STACK CFI 3ef00 x23: .cfa -672 + ^ x24: .cfa -664 + ^ +STACK CFI 3ef14 x19: .cfa -704 + ^ x20: .cfa -696 + ^ x21: .cfa -688 + ^ x22: .cfa -680 + ^ x25: .cfa -656 + ^ +STACK CFI 3f1cc x25: x25 +STACK CFI 3f1d0 x19: x19 x20: x20 +STACK CFI 3f1d4 x21: x21 x22: x22 +STACK CFI 3f1d8 x23: x23 x24: x24 +STACK CFI 3f1dc .cfa: sp 640 + .ra: .ra x29: x29 +STACK CFI 3f1e0 .cfa: sp 560 + +STACK CFI INIT 3f1e4 2fc .cfa: sp 0 + .ra: x30 +STACK CFI 3f1e8 .cfa: sp 640 + +STACK CFI 3f1f4 .cfa: sp 720 + .ra: .cfa -712 + ^ x29: .cfa -720 + ^ +STACK CFI 3f1f8 .cfa: x29 720 + +STACK CFI 3f1fc x23: .cfa -672 + ^ x24: .cfa -664 + ^ +STACK CFI 3f210 x19: .cfa -704 + ^ x20: .cfa -696 + ^ x21: .cfa -688 + ^ x22: .cfa -680 + ^ x25: .cfa -656 + ^ +STACK CFI 3f4c8 x25: x25 +STACK CFI 3f4cc x19: x19 x20: x20 +STACK CFI 3f4d0 x21: x21 x22: x22 +STACK CFI 3f4d4 x23: x23 x24: x24 +STACK CFI 3f4d8 .cfa: sp 640 + .ra: .ra x29: x29 +STACK CFI 3f4dc .cfa: sp 560 + +STACK CFI INIT 3f4e0 2fc .cfa: sp 0 + .ra: x30 +STACK CFI 3f4e4 .cfa: sp 640 + +STACK CFI 3f4f0 .cfa: sp 720 + .ra: .cfa -712 + ^ x29: .cfa -720 + ^ +STACK CFI 3f4f4 .cfa: x29 720 + +STACK CFI 3f4f8 x23: .cfa -672 + ^ x24: .cfa -664 + ^ +STACK CFI 3f50c x19: .cfa -704 + ^ x20: .cfa -696 + ^ x21: .cfa -688 + ^ x22: .cfa -680 + ^ x25: .cfa -656 + ^ +STACK CFI 3f7c4 x25: x25 +STACK CFI 3f7c8 x19: x19 x20: x20 +STACK CFI 3f7cc x21: x21 x22: x22 +STACK CFI 3f7d0 x23: x23 x24: x24 +STACK CFI 3f7d4 .cfa: sp 640 + .ra: .ra x29: x29 +STACK CFI 3f7d8 .cfa: sp 560 + +STACK CFI INIT 3f7dc 43c .cfa: sp 0 + .ra: x30 +STACK CFI 3f7e0 .cfa: sp 640 + +STACK CFI 3f7ec .cfa: sp 768 + .ra: .cfa -760 + ^ x29: .cfa -768 + ^ +STACK CFI 3f7f0 .cfa: x29 768 + +STACK CFI 3f7f8 v8: .cfa -672 + ^ v9: .cfa -664 + ^ x23: .cfa -720 + ^ x24: .cfa -712 + ^ +STACK CFI 3f814 v10: .cfa -656 + ^ x19: .cfa -752 + ^ x20: .cfa -744 + ^ x21: .cfa -736 + ^ x22: .cfa -728 + ^ x25: .cfa -704 + ^ x26: .cfa -696 + ^ x27: .cfa -688 + ^ x28: .cfa -680 + ^ +STACK CFI 3fbf4 v8: v8 v9: v9 +STACK CFI 3fbf8 x19: x19 x20: x20 +STACK CFI 3fbfc x21: x21 x22: x22 +STACK CFI 3fc00 x23: x23 x24: x24 +STACK CFI 3fc04 x25: x25 x26: x26 +STACK CFI 3fc08 x27: x27 x28: x28 +STACK CFI 3fc0c v10: v10 +STACK CFI 3fc10 .cfa: sp 640 + .ra: .ra x29: x29 +STACK CFI 3fc14 .cfa: sp 512 + +STACK CFI INIT 3fc18 2fc .cfa: sp 0 + .ra: x30 +STACK CFI 3fc1c .cfa: sp 640 + +STACK CFI 3fc28 .cfa: sp 720 + .ra: .cfa -712 + ^ x29: .cfa -720 + ^ +STACK CFI 3fc2c .cfa: x29 720 + +STACK CFI 3fc30 x23: .cfa -672 + ^ x24: .cfa -664 + ^ +STACK CFI 3fc44 x19: .cfa -704 + ^ x20: .cfa -696 + ^ x21: .cfa -688 + ^ x22: .cfa -680 + ^ x25: .cfa -656 + ^ +STACK CFI 3fefc x25: x25 +STACK CFI 3ff00 x19: x19 x20: x20 +STACK CFI 3ff04 x21: x21 x22: x22 +STACK CFI 3ff08 x23: x23 x24: x24 +STACK CFI 3ff0c .cfa: sp 640 + .ra: .ra x29: x29 +STACK CFI 3ff10 .cfa: sp 560 + +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 6c x19: x19 +STACK CFI 70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 130 x21: x21 +STACK CFI 134 x19: x19 x20: x20 +STACK CFI 138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3483c e8 .cfa: sp 0 + .ra: x30 +STACK CFI 34840 .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 34844 .cfa: x29 480 + +STACK CFI 34848 x19: .cfa -464 + ^ x20: .cfa -456 + ^ +STACK CFI 34854 x23: .cfa -432 + ^ x24: .cfa -424 + ^ x25: .cfa -416 + ^ +STACK CFI 34870 x21: .cfa -448 + ^ x22: .cfa -440 + ^ +STACK CFI 3490c x25: x25 +STACK CFI 34914 x19: x19 x20: x20 +STACK CFI 34918 x21: x21 x22: x22 +STACK CFI 3491c x23: x23 x24: x24 +STACK CFI 34920 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3ff14 3b8 .cfa: sp 0 + .ra: x30 +STACK CFI 3ff18 .cfa: sp 656 + +STACK CFI 3ff24 .cfa: sp 736 + .ra: .cfa -728 + ^ x29: .cfa -736 + ^ +STACK CFI 3ff28 .cfa: x29 736 + +STACK CFI 3ff2c x23: .cfa -688 + ^ x24: .cfa -680 + ^ +STACK CFI 3ff40 x19: .cfa -720 + ^ x20: .cfa -712 + ^ x21: .cfa -704 + ^ x22: .cfa -696 + ^ x25: .cfa -672 + ^ +STACK CFI 402b4 x25: x25 +STACK CFI 402b8 x19: x19 x20: x20 +STACK CFI 402bc x21: x21 x22: x22 +STACK CFI 402c0 x23: x23 x24: x24 +STACK CFI 402c4 .cfa: sp 656 + .ra: .ra x29: x29 +STACK CFI 402c8 .cfa: sp 576 + +STACK CFI INIT 402cc 3c0 .cfa: sp 0 + .ra: x30 +STACK CFI 402d0 .cfa: sp 656 + +STACK CFI 402dc .cfa: sp 736 + .ra: .cfa -728 + ^ x29: .cfa -736 + ^ +STACK CFI 402e0 .cfa: x29 736 + +STACK CFI 402e4 x23: .cfa -688 + ^ x24: .cfa -680 + ^ +STACK CFI 402f8 x19: .cfa -720 + ^ x20: .cfa -712 + ^ x21: .cfa -704 + ^ x22: .cfa -696 + ^ x25: .cfa -672 + ^ +STACK CFI 40674 x25: x25 +STACK CFI 40678 x19: x19 x20: x20 +STACK CFI 4067c x21: x21 x22: x22 +STACK CFI 40680 x23: x23 x24: x24 +STACK CFI 40684 .cfa: sp 656 + .ra: .ra x29: x29 +STACK CFI 40688 .cfa: sp 576 + +STACK CFI INIT 0 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 104 x23: x23 +STACK CFI 108 x19: x19 x20: x20 +STACK CFI 10c x21: x21 x22: x22 +STACK CFI 110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI c4 x21: x21 +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 21e50 358 .cfa: sp 0 + .ra: x30 +STACK CFI 21e54 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 21e58 .cfa: x29 64 + +STACK CFI 21e60 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 22194 x21: x21 +STACK CFI 2219c x19: x19 x20: x20 +STACK CFI 221a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4068c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 40690 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 40694 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 40698 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4069c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 406a0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 406a4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 406b8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 406bc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 406c0 .cfa: x29 32 + +STACK CFI 406c4 x19: .cfa -16 + ^ +STACK CFI 406d4 x19: x19 +STACK CFI 406d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 406dc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 406f0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 406f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 406f8 .cfa: x29 32 + +STACK CFI 406fc x19: .cfa -16 + ^ +STACK CFI 4070c x19: x19 +STACK CFI 40710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 40714 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 40728 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4072c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 40730 .cfa: x29 32 + +STACK CFI 40734 x19: .cfa -16 + ^ +STACK CFI 40744 x19: x19 +STACK CFI 40748 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4074c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 40750 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 40758 .cfa: x29 32 + +STACK CFI 4075c x19: .cfa -16 + ^ +STACK CFI 40780 x19: x19 +STACK CFI 40784 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 40788 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4078c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 40794 .cfa: x29 32 + +STACK CFI 40798 x19: .cfa -16 + ^ +STACK CFI 407bc x19: x19 +STACK CFI 407c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 407c4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 407c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 407d0 .cfa: x29 32 + +STACK CFI 407d4 x19: .cfa -16 + ^ +STACK CFI 407f8 x19: x19 +STACK CFI 407fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24884 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 48 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 140 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 134 x19: x19 x20: x20 +STACK CFI 138 x21: x21 x22: x22 +STACK CFI 13c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 40800 50 .cfa: sp 0 + .ra: x30 +STACK CFI 40804 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 40810 .cfa: x29 32 + +STACK CFI 40814 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 4081c x19: x19 x20: x20 +STACK CFI 40824 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 4082c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 40848 x19: x19 x20: x20 +STACK CFI 4084c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 40850 50 .cfa: sp 0 + .ra: x30 +STACK CFI 40854 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 40860 .cfa: x29 32 + +STACK CFI 40864 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 4086c x19: x19 x20: x20 +STACK CFI 40874 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 4087c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 40898 x19: x19 x20: x20 +STACK CFI 4089c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b28 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 154 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 144 x23: x23 +STACK CFI 148 x19: x19 x20: x20 +STACK CFI 14c x21: x21 x22: x22 +STACK CFI 150 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 2ac .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI c .cfa: x29 272 + +STACK CFI 10 x19: .cfa -256 + ^ x20: .cfa -248 + ^ +STACK CFI 20 x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ x25: .cfa -208 + ^ +STACK CFI 298 x19: x19 x20: x20 +STACK CFI 29c x21: x21 x22: x22 +STACK CFI 2a0 x23: x23 x24: x24 +STACK CFI 2a4 x25: x25 +STACK CFI 2a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 408a0 e8 .cfa: sp 0 + .ra: x30 +STACK CFI 408a4 .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 408a8 .cfa: x29 480 + +STACK CFI 408ac x19: .cfa -464 + ^ x20: .cfa -456 + ^ +STACK CFI 408b8 x23: .cfa -432 + ^ x24: .cfa -424 + ^ x25: .cfa -416 + ^ +STACK CFI 408d4 x21: .cfa -448 + ^ x22: .cfa -440 + ^ +STACK CFI 40970 x25: x25 +STACK CFI 40978 x19: x19 x20: x20 +STACK CFI 4097c x21: x21 x22: x22 +STACK CFI 40980 x23: x23 x24: x24 +STACK CFI 40984 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 40988 e8 .cfa: sp 0 + .ra: x30 +STACK CFI 4098c .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 40990 .cfa: x29 480 + +STACK CFI 40994 x19: .cfa -464 + ^ x20: .cfa -456 + ^ +STACK CFI 409a0 x23: .cfa -432 + ^ x24: .cfa -424 + ^ x25: .cfa -416 + ^ +STACK CFI 409bc x21: .cfa -448 + ^ x22: .cfa -440 + ^ +STACK CFI 40a58 x25: x25 +STACK CFI 40a60 x19: x19 x20: x20 +STACK CFI 40a64 x21: x21 x22: x22 +STACK CFI 40a68 x23: x23 x24: x24 +STACK CFI 40a6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 40a70 50 .cfa: sp 0 + .ra: x30 +STACK CFI 40a74 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 40a78 .cfa: x29 48 + +STACK CFI 40a80 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 40ab4 x19: x19 x20: x20 +STACK CFI 40ab8 x21: x21 +STACK CFI 40abc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 40ac0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 40ac4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 40ac8 .cfa: x29 32 + +STACK CFI 40ad0 x19: .cfa -16 + ^ +STACK CFI 40af4 x19: x19 +STACK CFI 40af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI e4 x23: x23 +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26440 8c .cfa: sp 0 + .ra: x30 +STACK CFI 26444 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26448 .cfa: x29 64 + +STACK CFI 2644c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2645c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 264c0 x19: x19 x20: x20 +STACK CFI 264c4 x21: x21 x22: x22 +STACK CFI 264c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 264cc 370 .cfa: sp 0 + .ra: x30 +STACK CFI 264d0 .cfa: sp 368 + .ra: .cfa -360 + ^ x29: .cfa -368 + ^ +STACK CFI 264d4 .cfa: x29 368 + +STACK CFI 264e8 x19: .cfa -352 + ^ x20: .cfa -344 + ^ x21: .cfa -336 + ^ x22: .cfa -328 + ^ x23: .cfa -320 + ^ x24: .cfa -312 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ x27: .cfa -288 + ^ x28: .cfa -280 + ^ +STACK CFI 26824 x19: x19 x20: x20 +STACK CFI 26828 x21: x21 x22: x22 +STACK CFI 2682c x23: x23 x24: x24 +STACK CFI 26830 x25: x25 x26: x26 +STACK CFI 26834 x27: x27 x28: x28 +STACK CFI 26838 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31bb0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 31c0c 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 31c68 124 .cfa: sp 0 + .ra: x30 +STACK CFI 31c6c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 31c70 .cfa: x29 48 + +STACK CFI 31c78 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 31ca0 x19: x19 x20: x20 +STACK CFI 31ca4 x21: x21 x22: x22 +STACK CFI 31ca8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 31cac .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 40afc 11c .cfa: sp 0 + .ra: x30 +STACK CFI 40b00 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 40b08 .cfa: x29 80 + +STACK CFI 40b14 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 40c08 x19: x19 x20: x20 +STACK CFI 40c0c x21: x21 x22: x22 +STACK CFI 40c10 x23: x23 +STACK CFI 40c14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 40c18 118 .cfa: sp 0 + .ra: x30 +STACK CFI 40c1c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 40c28 .cfa: x29 48 + +STACK CFI 40c2c x19: .cfa -32 + ^ +STACK CFI 40d28 x19: x19 +STACK CFI 40d2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 279ec 5c .cfa: sp 0 + .ra: x30 +STACK CFI 279f0 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 279f8 .cfa: x29 336 + +STACK CFI 279fc x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 27a04 x21: .cfa -304 + ^ +STACK CFI 27a38 x21: x21 +STACK CFI 27a40 x19: x19 x20: x20 +STACK CFI 27a44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27b7c 9c .cfa: sp 0 + .ra: x30 +STACK CFI 27b80 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 27b84 .cfa: x29 160 + +STACK CFI 27b8c x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 27c0c x19: x19 x20: x20 +STACK CFI 27c10 x21: x21 x22: x22 +STACK CFI 27c14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 40d30 3c8 .cfa: sp 0 + .ra: x30 +STACK CFI 40d34 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 40d38 .cfa: x29 192 + +STACK CFI 40d3c x21: .cfa -160 + ^ x22: .cfa -152 + ^ +STACK CFI 40d50 x19: .cfa -176 + ^ x20: .cfa -168 + ^ x23: .cfa -144 + ^ +STACK CFI 410e8 x23: x23 +STACK CFI 410ec x19: x19 x20: x20 +STACK CFI 410f0 x21: x21 x22: x22 +STACK CFI 410f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 410f8 1258 .cfa: sp 0 + .ra: x30 +STACK CFI 410fc .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 41100 .cfa: x29 416 + +STACK CFI 41104 x25: .cfa -352 + ^ x26: .cfa -344 + ^ +STACK CFI 41120 v8: .cfa -320 + ^ x19: .cfa -400 + ^ x20: .cfa -392 + ^ x21: .cfa -384 + ^ x22: .cfa -376 + ^ x23: .cfa -368 + ^ x24: .cfa -360 + ^ x27: .cfa -336 + ^ x28: .cfa -328 + ^ +STACK CFI 42334 v8: v8 +STACK CFI 42338 x19: x19 x20: x20 +STACK CFI 4233c x21: x21 x22: x22 +STACK CFI 42340 x23: x23 x24: x24 +STACK CFI 42344 x25: x25 x26: x26 +STACK CFI 42348 x27: x27 x28: x28 +STACK CFI 4234c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28074 5c .cfa: sp 0 + .ra: x30 +STACK CFI 28078 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 28080 .cfa: x29 336 + +STACK CFI 28084 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 2808c x21: .cfa -304 + ^ +STACK CFI 280c0 x21: x21 +STACK CFI 280c8 x19: x19 x20: x20 +STACK CFI 280cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28208 9c .cfa: sp 0 + .ra: x30 +STACK CFI 2820c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 28210 .cfa: x29 160 + +STACK CFI 28218 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 28298 x19: x19 x20: x20 +STACK CFI 2829c x21: x21 x22: x22 +STACK CFI 282a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2816c 9c .cfa: sp 0 + .ra: x30 +STACK CFI 28170 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 28174 .cfa: x29 160 + +STACK CFI 2817c x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 281fc x19: x19 x20: x20 +STACK CFI 28200 x21: x21 x22: x22 +STACK CFI 28204 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI c .cfa: x29 384 + +STACK CFI 10 x19: .cfa -368 + ^ x20: .cfa -360 + ^ +STACK CFI 20 x21: .cfa -352 + ^ x22: .cfa -344 + ^ +STACK CFI 28 x23: .cfa -336 + ^ x24: .cfa -328 + ^ +STACK CFI 124 x19: x19 x20: x20 +STACK CFI 128 x21: x21 x22: x22 +STACK CFI 12c x23: x23 x24: x24 +STACK CFI 130 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26c88 9c .cfa: sp 0 + .ra: x30 +STACK CFI 26c8c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 26c90 .cfa: x29 160 + +STACK CFI 26c98 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 26d18 x19: x19 x20: x20 +STACK CFI 26d1c x21: x21 x22: x22 +STACK CFI 26d20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 42350 b1c .cfa: sp 0 + .ra: x30 +STACK CFI 42354 .cfa: sp 464 + +STACK CFI 42358 .cfa: sp 624 + .ra: .cfa -616 + ^ x29: .cfa -624 + ^ +STACK CFI 4235c .cfa: x29 624 + +STACK CFI 42364 v8: .cfa -528 + ^ v9: .cfa -520 + ^ x25: .cfa -560 + ^ x26: .cfa -552 + ^ +STACK CFI 42388 v10: .cfa -512 + ^ v11: .cfa -504 + ^ v12: .cfa -496 + ^ v13: .cfa -488 + ^ v14: .cfa -480 + ^ v15: .cfa -472 + ^ x19: .cfa -608 + ^ x20: .cfa -600 + ^ x21: .cfa -592 + ^ x22: .cfa -584 + ^ x23: .cfa -576 + ^ x24: .cfa -568 + ^ x27: .cfa -544 + ^ x28: .cfa -536 + ^ +STACK CFI 42e40 v8: v8 v9: v9 +STACK CFI 42e44 x19: x19 x20: x20 +STACK CFI 42e48 x21: x21 x22: x22 +STACK CFI 42e4c v10: v10 v11: v11 +STACK CFI 42e50 x23: x23 x24: x24 +STACK CFI 42e54 v12: v12 v13: v13 +STACK CFI 42e58 x25: x25 x26: x26 +STACK CFI 42e5c v14: v14 v15: v15 +STACK CFI 42e60 x27: x27 x28: x28 +STACK CFI 42e64 .cfa: sp 464 + .ra: .ra x29: x29 +STACK CFI 42e68 .cfa: sp 304 + +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 285f0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 285f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 285f8 .cfa: x29 32 + +STACK CFI 285fc x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 28648 x19: x19 x20: x20 +STACK CFI 2864c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28714 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 28718 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2871c .cfa: x29 48 + +STACK CFI 28724 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 287c0 x21: x21 +STACK CFI 287c4 x19: x19 x20: x20 +STACK CFI 287c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 221a8 128 .cfa: sp 0 + .ra: x30 +STACK CFI 221ac .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 221b0 .cfa: x29 64 + +STACK CFI 221b8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 222bc x21: x21 +STACK CFI 222c4 x19: x19 x20: x20 +STACK CFI 222c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e6c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e70 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e74 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e78 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e7c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e80 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e84 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e88 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 42e8c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e90 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e94 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e98 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42e9c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42ea0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42ea4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 42ea8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 42eac 48 .cfa: sp 0 + .ra: x30 +STACK CFI 42eb0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 42eb8 .cfa: x29 32 + +STACK CFI 42ebc x19: .cfa -16 + ^ +STACK CFI 42eec x19: x19 +STACK CFI 42ef0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 42ef4 48 .cfa: sp 0 + .ra: x30 +STACK CFI 42ef8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 42f00 .cfa: x29 32 + +STACK CFI 42f04 x19: .cfa -16 + ^ +STACK CFI 42f34 x19: x19 +STACK CFI 42f38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 42f3c 48 .cfa: sp 0 + .ra: x30 +STACK CFI 42f40 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 42f48 .cfa: x29 32 + +STACK CFI 42f4c x19: .cfa -16 + ^ +STACK CFI 42f7c x19: x19 +STACK CFI 42f80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 42f84 48 .cfa: sp 0 + .ra: x30 +STACK CFI 42f88 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 42f90 .cfa: x29 32 + +STACK CFI 42f94 x19: .cfa -16 + ^ +STACK CFI 42fc4 x19: x19 +STACK CFI 42fc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 42fcc 48 .cfa: sp 0 + .ra: x30 +STACK CFI 42fd0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 42fd8 .cfa: x29 32 + +STACK CFI 42fdc x19: .cfa -16 + ^ +STACK CFI 4300c x19: x19 +STACK CFI 43010 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43014 48 .cfa: sp 0 + .ra: x30 +STACK CFI 43018 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 43020 .cfa: x29 32 + +STACK CFI 43024 x19: .cfa -16 + ^ +STACK CFI 43054 x19: x19 +STACK CFI 43058 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4305c 48 .cfa: sp 0 + .ra: x30 +STACK CFI 43060 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 43068 .cfa: x29 32 + +STACK CFI 4306c x19: .cfa -16 + ^ +STACK CFI 4309c x19: x19 +STACK CFI 430a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 430a4 48 .cfa: sp 0 + .ra: x30 +STACK CFI 430a8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 430b0 .cfa: x29 32 + +STACK CFI 430b4 x19: .cfa -16 + ^ +STACK CFI 430e4 x19: x19 +STACK CFI 430e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 430ec 38 .cfa: sp 0 + .ra: x30 +STACK CFI 430f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 430fc .cfa: x29 32 + +STACK CFI 43100 x19: .cfa -16 + ^ +STACK CFI 4311c x19: x19 +STACK CFI 43120 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 43124 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43134 1b0 .cfa: sp 0 + .ra: x30 +STACK CFI 43138 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 43140 .cfa: x29 96 + +STACK CFI 43150 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 432d0 x19: x19 x20: x20 +STACK CFI 432d4 x21: x21 x22: x22 +STACK CFI 432d8 x23: x23 x24: x24 +STACK CFI 432dc x25: x25 x26: x26 +STACK CFI 432e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24998 60 .cfa: sp 0 + .ra: x30 +STACK CFI 2499c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 249a0 .cfa: x29 48 + +STACK CFI 249a8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 249ec x19: x19 x20: x20 +STACK CFI 249f0 x21: x21 +STACK CFI 249f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 249f8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 432e4 70 .cfa: sp 0 + .ra: x30 +STACK CFI 432ec .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 432f0 .cfa: x29 48 + +STACK CFI 432fc x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 43348 x21: x21 +STACK CFI 4334c x19: x19 x20: x20 +STACK CFI 43350 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43354 24 .cfa: sp 0 + .ra: x30 +STACK CFI 43358 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4335c .cfa: x29 32 + +STACK CFI 43360 x19: .cfa -16 + ^ +STACK CFI 43370 x19: x19 +STACK CFI 43374 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43378 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4338c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 43390 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 43394 .cfa: x29 32 + +STACK CFI 43398 x19: .cfa -16 + ^ +STACK CFI 433a8 x19: x19 +STACK CFI 433ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b28 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 154 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 144 x23: x23 +STACK CFI 148 x19: x19 x20: x20 +STACK CFI 14c x21: x21 x22: x22 +STACK CFI 150 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28714 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 28718 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2871c .cfa: x29 48 + +STACK CFI 28724 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 287c0 x21: x21 +STACK CFI 287c4 x19: x19 x20: x20 +STACK CFI 287c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 433b0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 433b4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 433b8 .cfa: x29 48 + +STACK CFI 433c0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 4340c x19: x19 x20: x20 +STACK CFI 43410 x21: x21 x22: x22 +STACK CFI 43414 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 285f0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 285f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 285f8 .cfa: x29 32 + +STACK CFI 285fc x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 28648 x19: x19 x20: x20 +STACK CFI 2864c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24c60 98 .cfa: sp 0 + .ra: x30 +STACK CFI 24c64 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24c68 .cfa: x29 64 + +STACK CFI 24c70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24cec x19: x19 x20: x20 +STACK CFI 24cf0 x21: x21 +STACK CFI 24cf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25040 64 .cfa: sp 0 + .ra: x30 +STACK CFI 25044 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25048 .cfa: x29 48 + +STACK CFI 2504c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25058 x21: .cfa -16 + ^ +STACK CFI 25098 x19: x19 x20: x20 +STACK CFI 2509c x21: x21 +STACK CFI 250a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24e18 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24e1c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24e24 .cfa: x29 32 + +STACK CFI 24e28 x19: .cfa -16 + ^ +STACK CFI 24e44 x19: x19 +STACK CFI 24e48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43418 50 .cfa: sp 0 + .ra: x30 +STACK CFI 4341c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 43420 .cfa: x29 48 + +STACK CFI 43424 x19: .cfa -32 + ^ +STACK CFI 43460 x19: x19 +STACK CFI 43464 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26030 98 .cfa: sp 0 + .ra: x30 +STACK CFI 26034 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 26038 .cfa: x29 128 + +STACK CFI 26044 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ +STACK CFI 260b8 x23: x23 +STACK CFI 260bc x19: x19 x20: x20 +STACK CFI 260c0 x21: x21 x22: x22 +STACK CFI 260c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24f58 e8 .cfa: sp 0 + .ra: x30 +STACK CFI 24f5c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24f60 .cfa: x29 64 + +STACK CFI 24f64 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 24f70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 25034 x19: x19 x20: x20 +STACK CFI 25038 x21: x21 x22: x22 +STACK CFI 2503c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24e9c bc .cfa: sp 0 + .ra: x30 +STACK CFI 24ea0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24ea4 .cfa: x29 64 + +STACK CFI 24eac x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24f4c x21: x21 +STACK CFI 24f50 x19: x19 x20: x20 +STACK CFI 24f54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43468 80 .cfa: sp 0 + .ra: x30 +STACK CFI 4346c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 43474 .cfa: x29 64 + +STACK CFI 4347c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 434dc x21: x21 +STACK CFI 434e0 x19: x19 x20: x20 +STACK CFI 434e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 434e8 88 .cfa: sp 0 + .ra: x30 +STACK CFI 434ec .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 434f0 .cfa: x29 64 + +STACK CFI 434f8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 43564 x21: x21 +STACK CFI 43568 x19: x19 x20: x20 +STACK CFI 4356c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43570 88 .cfa: sp 0 + .ra: x30 +STACK CFI 43574 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 43578 .cfa: x29 48 + +STACK CFI 43580 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 435e8 x21: x21 +STACK CFI 435f0 x19: x19 x20: x20 +STACK CFI 435f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 435f8 64 .cfa: sp 0 + .ra: x30 +STACK CFI 435fc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 43600 .cfa: x29 48 + +STACK CFI 43608 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 43650 x19: x19 x20: x20 +STACK CFI 43654 x21: x21 x22: x22 +STACK CFI 43658 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4365c 48 .cfa: sp 0 + .ra: x30 +STACK CFI 43664 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 43668 .cfa: x29 32 + +STACK CFI 43670 x19: .cfa -16 + ^ +STACK CFI 4369c x19: x19 +STACK CFI 436a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 436a4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 436a8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 436ac .cfa: x29 32 + +STACK CFI 436b0 x19: .cfa -16 + ^ +STACK CFI 436c0 x19: x19 +STACK CFI 436c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 436c8 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 436cc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 436d0 .cfa: x29 48 + +STACK CFI 436d4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 436e0 x21: .cfa -16 + ^ +STACK CFI 43770 x21: x21 +STACK CFI 43778 x19: x19 x20: x20 +STACK CFI 4377c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43780 24 .cfa: sp 0 + .ra: x30 +STACK CFI 43784 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 43788 .cfa: x29 32 + +STACK CFI 4378c x19: .cfa -16 + ^ +STACK CFI 4379c x19: x19 +STACK CFI 437a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 437a4 128 .cfa: sp 0 + .ra: x30 +STACK CFI 437a8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 437ac .cfa: x29 96 + +STACK CFI 437b0 x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 437bc x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 437c8 x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 438bc x19: x19 x20: x20 +STACK CFI 438c0 x21: x21 x22: x22 +STACK CFI 438c4 x23: x23 x24: x24 +STACK CFI 438c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25768 13c .cfa: sp 0 + .ra: x30 +STACK CFI 2576c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 25770 .cfa: x29 64 + +STACK CFI 25778 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 25898 x19: x19 x20: x20 +STACK CFI 2589c x21: x21 x22: x22 +STACK CFI 258a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25964 104 .cfa: sp 0 + .ra: x30 +STACK CFI 25968 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 2596c .cfa: x29 80 + +STACK CFI 25978 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 25a58 x19: x19 x20: x20 +STACK CFI 25a5c x21: x21 x22: x22 +STACK CFI 25a60 x23: x23 x24: x24 +STACK CFI 25a64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI e4 x23: x23 +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26440 8c .cfa: sp 0 + .ra: x30 +STACK CFI 26444 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26448 .cfa: x29 64 + +STACK CFI 2644c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2645c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 264c0 x19: x19 x20: x20 +STACK CFI 264c4 x21: x21 x22: x22 +STACK CFI 264c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 438cc 1c0 .cfa: sp 0 + .ra: x30 +STACK CFI 438d0 .cfa: sp 480 + +STACK CFI 438d4 .cfa: sp 576 + .ra: .cfa -568 + ^ x29: .cfa -576 + ^ +STACK CFI 438d8 .cfa: x29 576 + +STACK CFI 438e0 x19: .cfa -560 + ^ x20: .cfa -552 + ^ x23: .cfa -528 + ^ x24: .cfa -520 + ^ +STACK CFI 438fc x21: .cfa -544 + ^ x22: .cfa -536 + ^ x25: .cfa -512 + ^ x26: .cfa -504 + ^ +STACK CFI 43914 x27: .cfa -496 + ^ x28: .cfa -488 + ^ +STACK CFI 43a6c x19: x19 x20: x20 +STACK CFI 43a70 x21: x21 x22: x22 +STACK CFI 43a74 x23: x23 x24: x24 +STACK CFI 43a78 x25: x25 x26: x26 +STACK CFI 43a7c x27: x27 x28: x28 +STACK CFI 43a80 .cfa: sp 480 + .ra: .ra x29: x29 +STACK CFI 43a88 .cfa: sp 384 + +STACK CFI INIT 43a8c 1f4 .cfa: sp 0 + .ra: x30 +STACK CFI 43a90 .cfa: sp 512 + +STACK CFI 43a94 .cfa: sp 608 + .ra: .cfa -600 + ^ x29: .cfa -608 + ^ +STACK CFI 43a98 .cfa: x29 608 + +STACK CFI 43aa0 x19: .cfa -592 + ^ x20: .cfa -584 + ^ x21: .cfa -576 + ^ x22: .cfa -568 + ^ +STACK CFI 43ab8 x27: .cfa -528 + ^ x28: .cfa -520 + ^ +STACK CFI 43ad0 x23: .cfa -560 + ^ x24: .cfa -552 + ^ x25: .cfa -544 + ^ x26: .cfa -536 + ^ +STACK CFI 43c64 x19: x19 x20: x20 +STACK CFI 43c68 x21: x21 x22: x22 +STACK CFI 43c6c x23: x23 x24: x24 +STACK CFI 43c70 x25: x25 x26: x26 +STACK CFI 43c74 x27: x27 x28: x28 +STACK CFI 43c78 .cfa: sp 512 + .ra: .ra x29: x29 +STACK CFI 43c7c .cfa: sp 416 + +STACK CFI INIT 43c80 1c0 .cfa: sp 0 + .ra: x30 +STACK CFI 43c84 .cfa: sp 480 + +STACK CFI 43c88 .cfa: sp 576 + .ra: .cfa -568 + ^ x29: .cfa -576 + ^ +STACK CFI 43c8c .cfa: x29 576 + +STACK CFI 43c94 x19: .cfa -560 + ^ x20: .cfa -552 + ^ x23: .cfa -528 + ^ x24: .cfa -520 + ^ +STACK CFI 43cb0 x21: .cfa -544 + ^ x22: .cfa -536 + ^ x25: .cfa -512 + ^ x26: .cfa -504 + ^ +STACK CFI 43cc8 x27: .cfa -496 + ^ x28: .cfa -488 + ^ +STACK CFI 43e20 x19: x19 x20: x20 +STACK CFI 43e24 x21: x21 x22: x22 +STACK CFI 43e28 x23: x23 x24: x24 +STACK CFI 43e2c x25: x25 x26: x26 +STACK CFI 43e30 x27: x27 x28: x28 +STACK CFI 43e34 .cfa: sp 480 + .ra: .ra x29: x29 +STACK CFI 43e3c .cfa: sp 384 + +STACK CFI INIT 43e40 1f4 .cfa: sp 0 + .ra: x30 +STACK CFI 43e44 .cfa: sp 512 + +STACK CFI 43e48 .cfa: sp 608 + .ra: .cfa -600 + ^ x29: .cfa -608 + ^ +STACK CFI 43e4c .cfa: x29 608 + +STACK CFI 43e54 x19: .cfa -592 + ^ x20: .cfa -584 + ^ x21: .cfa -576 + ^ x22: .cfa -568 + ^ +STACK CFI 43e6c x27: .cfa -528 + ^ x28: .cfa -520 + ^ +STACK CFI 43e84 x23: .cfa -560 + ^ x24: .cfa -552 + ^ x25: .cfa -544 + ^ x26: .cfa -536 + ^ +STACK CFI 44018 x19: x19 x20: x20 +STACK CFI 4401c x21: x21 x22: x22 +STACK CFI 44020 x23: x23 x24: x24 +STACK CFI 44024 x25: x25 x26: x26 +STACK CFI 44028 x27: x27 x28: x28 +STACK CFI 4402c .cfa: sp 512 + .ra: .ra x29: x29 +STACK CFI 44030 .cfa: sp 416 + +STACK CFI INIT 44034 1c0 .cfa: sp 0 + .ra: x30 +STACK CFI 44038 .cfa: sp 480 + +STACK CFI 4403c .cfa: sp 576 + .ra: .cfa -568 + ^ x29: .cfa -576 + ^ +STACK CFI 44040 .cfa: x29 576 + +STACK CFI 44048 x19: .cfa -560 + ^ x20: .cfa -552 + ^ x23: .cfa -528 + ^ x24: .cfa -520 + ^ +STACK CFI 44064 x21: .cfa -544 + ^ x22: .cfa -536 + ^ x25: .cfa -512 + ^ x26: .cfa -504 + ^ +STACK CFI 4407c x27: .cfa -496 + ^ x28: .cfa -488 + ^ +STACK CFI 441d4 x19: x19 x20: x20 +STACK CFI 441d8 x21: x21 x22: x22 +STACK CFI 441dc x23: x23 x24: x24 +STACK CFI 441e0 x25: x25 x26: x26 +STACK CFI 441e4 x27: x27 x28: x28 +STACK CFI 441e8 .cfa: sp 480 + .ra: .ra x29: x29 +STACK CFI 441f0 .cfa: sp 384 + +STACK CFI INIT 441f4 1f4 .cfa: sp 0 + .ra: x30 +STACK CFI 441f8 .cfa: sp 512 + +STACK CFI 441fc .cfa: sp 608 + .ra: .cfa -600 + ^ x29: .cfa -608 + ^ +STACK CFI 44200 .cfa: x29 608 + +STACK CFI 44208 x19: .cfa -592 + ^ x20: .cfa -584 + ^ x21: .cfa -576 + ^ x22: .cfa -568 + ^ +STACK CFI 44220 x27: .cfa -528 + ^ x28: .cfa -520 + ^ +STACK CFI 44238 x23: .cfa -560 + ^ x24: .cfa -552 + ^ x25: .cfa -544 + ^ x26: .cfa -536 + ^ +STACK CFI 443cc x19: x19 x20: x20 +STACK CFI 443d0 x21: x21 x22: x22 +STACK CFI 443d4 x23: x23 x24: x24 +STACK CFI 443d8 x25: x25 x26: x26 +STACK CFI 443dc x27: x27 x28: x28 +STACK CFI 443e0 .cfa: sp 512 + .ra: .ra x29: x29 +STACK CFI 443e4 .cfa: sp 416 + +STACK CFI INIT 443e8 1c0 .cfa: sp 0 + .ra: x30 +STACK CFI 443ec .cfa: sp 480 + +STACK CFI 443f0 .cfa: sp 576 + .ra: .cfa -568 + ^ x29: .cfa -576 + ^ +STACK CFI 443f4 .cfa: x29 576 + +STACK CFI 443fc x19: .cfa -560 + ^ x20: .cfa -552 + ^ x23: .cfa -528 + ^ x24: .cfa -520 + ^ +STACK CFI 44418 x21: .cfa -544 + ^ x22: .cfa -536 + ^ x25: .cfa -512 + ^ x26: .cfa -504 + ^ +STACK CFI 44430 x27: .cfa -496 + ^ x28: .cfa -488 + ^ +STACK CFI 44588 x19: x19 x20: x20 +STACK CFI 4458c x21: x21 x22: x22 +STACK CFI 44590 x23: x23 x24: x24 +STACK CFI 44594 x25: x25 x26: x26 +STACK CFI 44598 x27: x27 x28: x28 +STACK CFI 4459c .cfa: sp 480 + .ra: .ra x29: x29 +STACK CFI 445a4 .cfa: sp 384 + +STACK CFI INIT 445a8 1f4 .cfa: sp 0 + .ra: x30 +STACK CFI 445ac .cfa: sp 512 + +STACK CFI 445b0 .cfa: sp 608 + .ra: .cfa -600 + ^ x29: .cfa -608 + ^ +STACK CFI 445b4 .cfa: x29 608 + +STACK CFI 445bc x19: .cfa -592 + ^ x20: .cfa -584 + ^ x21: .cfa -576 + ^ x22: .cfa -568 + ^ +STACK CFI 445d4 x27: .cfa -528 + ^ x28: .cfa -520 + ^ +STACK CFI 445ec x23: .cfa -560 + ^ x24: .cfa -552 + ^ x25: .cfa -544 + ^ x26: .cfa -536 + ^ +STACK CFI 44780 x19: x19 x20: x20 +STACK CFI 44784 x21: x21 x22: x22 +STACK CFI 44788 x23: x23 x24: x24 +STACK CFI 4478c x25: x25 x26: x26 +STACK CFI 44790 x27: x27 x28: x28 +STACK CFI 44794 .cfa: sp 512 + .ra: .ra x29: x29 +STACK CFI 44798 .cfa: sp 416 + +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4479c 48 .cfa: sp 0 + .ra: x30 +STACK CFI 447a8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 447ac .cfa: x29 32 + +STACK CFI 447b4 x19: .cfa -16 + ^ +STACK CFI 447dc x19: x19 +STACK CFI 447e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 447e4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 447f8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 447fc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 44800 .cfa: x29 32 + +STACK CFI 44804 x19: .cfa -16 + ^ +STACK CFI 44814 x19: x19 +STACK CFI 44818 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4481c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 44830 24 .cfa: sp 0 + .ra: x30 +STACK CFI 44834 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 44838 .cfa: x29 32 + +STACK CFI 4483c x19: .cfa -16 + ^ +STACK CFI 4484c x19: x19 +STACK CFI 44850 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 44854 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 44868 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4486c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 44870 .cfa: x29 32 + +STACK CFI 44874 x19: .cfa -16 + ^ +STACK CFI 44884 x19: x19 +STACK CFI 44888 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4488c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 448a0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 448a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 448a8 .cfa: x29 32 + +STACK CFI 448ac x19: .cfa -16 + ^ +STACK CFI 448bc x19: x19 +STACK CFI 448c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 448c4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 448c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 448cc .cfa: x29 32 + +STACK CFI 448d0 x19: .cfa -16 + ^ +STACK CFI 448e0 x19: x19 +STACK CFI 448e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 448e8 48 .cfa: sp 0 + .ra: x30 +STACK CFI 448f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 448f8 .cfa: x29 32 + +STACK CFI 44900 x19: .cfa -16 + ^ +STACK CFI 44928 x19: x19 +STACK CFI 4492c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 44930 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 44944 24 .cfa: sp 0 + .ra: x30 +STACK CFI 44948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4494c .cfa: x29 32 + +STACK CFI 44950 x19: .cfa -16 + ^ +STACK CFI 44960 x19: x19 +STACK CFI 44964 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 44968 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4497c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 44980 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 44984 .cfa: x29 32 + +STACK CFI 44988 x19: .cfa -16 + ^ +STACK CFI 44998 x19: x19 +STACK CFI 4499c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 449a0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 449b4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 449b8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 449bc .cfa: x29 32 + +STACK CFI 449c0 x19: .cfa -16 + ^ +STACK CFI 449d0 x19: x19 +STACK CFI 449d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 449d8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 449ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI 449f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 449f4 .cfa: x29 32 + +STACK CFI 449f8 x19: .cfa -16 + ^ +STACK CFI 44a08 x19: x19 +STACK CFI 44a0c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 44a10 24 .cfa: sp 0 + .ra: x30 +STACK CFI 44a14 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 44a18 .cfa: x29 32 + +STACK CFI 44a1c x19: .cfa -16 + ^ +STACK CFI 44a2c x19: x19 +STACK CFI 44a30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 261dc 64 .cfa: sp 0 + .ra: x30 +STACK CFI 261e0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 261e4 .cfa: x29 64 + +STACK CFI 261e8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26238 x19: x19 x20: x20 +STACK CFI 2623c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 44a34 27c .cfa: sp 0 + .ra: x30 +STACK CFI 44a38 .cfa: sp 448 + +STACK CFI 44a3c .cfa: sp 528 + .ra: .cfa -520 + ^ x29: .cfa -528 + ^ +STACK CFI 44a40 .cfa: x29 528 + +STACK CFI 44a44 x21: .cfa -496 + ^ x22: .cfa -488 + ^ +STACK CFI 44a50 x23: .cfa -480 + ^ x24: .cfa -472 + ^ x25: .cfa -464 + ^ +STACK CFI 44a70 x19: .cfa -512 + ^ x20: .cfa -504 + ^ +STACK CFI 44c94 x25: x25 +STACK CFI 44c9c x19: x19 x20: x20 +STACK CFI 44ca0 x21: x21 x22: x22 +STACK CFI 44ca4 x23: x23 x24: x24 +STACK CFI 44ca8 .cfa: sp 448 + .ra: .ra x29: x29 +STACK CFI 44cac .cfa: sp 368 + +STACK CFI INIT 44cb0 1ec .cfa: sp 0 + .ra: x30 +STACK CFI 44cb4 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 44cb8 .cfa: x29 192 + +STACK CFI 44cc0 x19: .cfa -176 + ^ x20: .cfa -168 + ^ x21: .cfa -160 + ^ x22: .cfa -152 + ^ +STACK CFI 44cdc x23: .cfa -144 + ^ +STACK CFI 44e8c x23: x23 +STACK CFI 44e90 x19: x19 x20: x20 +STACK CFI 44e94 x21: x21 x22: x22 +STACK CFI 44e98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 44e9c 250 .cfa: sp 0 + .ra: x30 +STACK CFI 44ea0 .cfa: sp 768 + +STACK CFI 44eb0 .cfa: sp 848 + .ra: .cfa -840 + ^ x29: .cfa -848 + ^ +STACK CFI 44eb4 .cfa: x29 848 + +STACK CFI 44eb8 x25: .cfa -784 + ^ x26: .cfa -776 + ^ +STACK CFI 44ecc x19: .cfa -832 + ^ x20: .cfa -824 + ^ x21: .cfa -816 + ^ x22: .cfa -808 + ^ x23: .cfa -800 + ^ x24: .cfa -792 + ^ +STACK CFI 450d0 .cfa: sp 848 + +STACK CFI 450d4 x19: x19 x20: x20 +STACK CFI 450d8 x21: x21 x22: x22 +STACK CFI 450dc x23: x23 x24: x24 +STACK CFI 450e0 x25: x25 x26: x26 +STACK CFI 450e4 .cfa: sp 768 + .ra: .ra x29: x29 +STACK CFI 450e8 .cfa: sp 688 + +STACK CFI INIT 450ec 374 .cfa: sp 0 + .ra: x30 +STACK CFI 450f0 .cfa: sp 880 + +STACK CFI 45100 .cfa: sp 976 + .ra: .cfa -968 + ^ x29: .cfa -976 + ^ +STACK CFI 45104 .cfa: x29 976 + +STACK CFI 45108 x19: .cfa -960 + ^ x20: .cfa -952 + ^ +STACK CFI 45114 x25: .cfa -912 + ^ x26: .cfa -904 + ^ x27: .cfa -896 + ^ +STACK CFI 4519c x21: .cfa -944 + ^ x22: .cfa -936 + ^ x23: .cfa -928 + ^ x24: .cfa -920 + ^ +STACK CFI 45440 .cfa: sp 976 + +STACK CFI 45444 x19: x19 x20: x20 +STACK CFI 45448 x21: x21 x22: x22 +STACK CFI 4544c x23: x23 x24: x24 +STACK CFI 45450 x25: x25 x26: x26 +STACK CFI 45454 x27: x27 +STACK CFI 45458 .cfa: sp 880 + .ra: .ra x29: x29 +STACK CFI 4545c .cfa: sp 784 + +STACK CFI INIT 45460 3cc .cfa: sp 0 + .ra: x30 +STACK CFI 45464 .cfa: sp 896 + +STACK CFI 45474 .cfa: sp 992 + .ra: .cfa -984 + ^ x29: .cfa -992 + ^ +STACK CFI 45478 .cfa: x29 992 + +STACK CFI 4547c x19: .cfa -976 + ^ x20: .cfa -968 + ^ +STACK CFI 45488 x25: .cfa -928 + ^ x26: .cfa -920 + ^ x27: .cfa -912 + ^ +STACK CFI 45510 x21: .cfa -960 + ^ x22: .cfa -952 + ^ x23: .cfa -944 + ^ x24: .cfa -936 + ^ +STACK CFI 4580c .cfa: sp 992 + +STACK CFI 45810 x19: x19 x20: x20 +STACK CFI 45814 x21: x21 x22: x22 +STACK CFI 45818 x23: x23 x24: x24 +STACK CFI 4581c x25: x25 x26: x26 +STACK CFI 45820 x27: x27 +STACK CFI 45824 .cfa: sp 896 + .ra: .ra x29: x29 +STACK CFI 45828 .cfa: sp 800 + +STACK CFI INIT 4582c 464 .cfa: sp 0 + .ra: x30 +STACK CFI 45830 .cfa: sp 880 + +STACK CFI 45838 .cfa: sp 992 + .ra: .cfa -984 + ^ x29: .cfa -992 + ^ +STACK CFI 4583c .cfa: x29 992 + +STACK CFI 45840 x19: .cfa -976 + ^ x20: .cfa -968 + ^ +STACK CFI 45850 x27: .cfa -912 + ^ x28: .cfa -904 + ^ +STACK CFI 45868 v8: .cfa -896 + ^ x21: .cfa -960 + ^ x22: .cfa -952 + ^ x23: .cfa -944 + ^ x24: .cfa -936 + ^ x25: .cfa -928 + ^ x26: .cfa -920 + ^ +STACK CFI 45c6c .cfa: sp 992 + +STACK CFI 45c70 v8: v8 +STACK CFI 45c74 x19: x19 x20: x20 +STACK CFI 45c78 x21: x21 x22: x22 +STACK CFI 45c7c x23: x23 x24: x24 +STACK CFI 45c80 x25: x25 x26: x26 +STACK CFI 45c84 x27: x27 x28: x28 +STACK CFI 45c88 .cfa: sp 880 + .ra: .ra x29: x29 +STACK CFI 45c8c .cfa: sp 768 + +STACK CFI INIT 45c90 1ec .cfa: sp 0 + .ra: x30 +STACK CFI 45c94 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 45c98 .cfa: x29 192 + +STACK CFI 45ca0 x19: .cfa -176 + ^ x20: .cfa -168 + ^ x21: .cfa -160 + ^ x22: .cfa -152 + ^ +STACK CFI 45cbc x23: .cfa -144 + ^ +STACK CFI 45e6c x23: x23 +STACK CFI 45e70 x19: x19 x20: x20 +STACK CFI 45e74 x21: x21 x22: x22 +STACK CFI 45e78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 45e7c 250 .cfa: sp 0 + .ra: x30 +STACK CFI 45e80 .cfa: sp 768 + +STACK CFI 45e90 .cfa: sp 848 + .ra: .cfa -840 + ^ x29: .cfa -848 + ^ +STACK CFI 45e94 .cfa: x29 848 + +STACK CFI 45e98 x25: .cfa -784 + ^ x26: .cfa -776 + ^ +STACK CFI 45eac x19: .cfa -832 + ^ x20: .cfa -824 + ^ x21: .cfa -816 + ^ x22: .cfa -808 + ^ x23: .cfa -800 + ^ x24: .cfa -792 + ^ +STACK CFI 460b0 .cfa: sp 848 + +STACK CFI 460b4 x19: x19 x20: x20 +STACK CFI 460b8 x21: x21 x22: x22 +STACK CFI 460bc x23: x23 x24: x24 +STACK CFI 460c0 x25: x25 x26: x26 +STACK CFI 460c4 .cfa: sp 768 + .ra: .ra x29: x29 +STACK CFI 460c8 .cfa: sp 688 + +STACK CFI INIT 460cc 374 .cfa: sp 0 + .ra: x30 +STACK CFI 460d0 .cfa: sp 880 + +STACK CFI 460e0 .cfa: sp 976 + .ra: .cfa -968 + ^ x29: .cfa -976 + ^ +STACK CFI 460e4 .cfa: x29 976 + +STACK CFI 460e8 x19: .cfa -960 + ^ x20: .cfa -952 + ^ +STACK CFI 460f4 x25: .cfa -912 + ^ x26: .cfa -904 + ^ x27: .cfa -896 + ^ +STACK CFI 4617c x21: .cfa -944 + ^ x22: .cfa -936 + ^ x23: .cfa -928 + ^ x24: .cfa -920 + ^ +STACK CFI 46420 .cfa: sp 976 + +STACK CFI 46424 x19: x19 x20: x20 +STACK CFI 46428 x21: x21 x22: x22 +STACK CFI 4642c x23: x23 x24: x24 +STACK CFI 46430 x25: x25 x26: x26 +STACK CFI 46434 x27: x27 +STACK CFI 46438 .cfa: sp 880 + .ra: .ra x29: x29 +STACK CFI 4643c .cfa: sp 784 + +STACK CFI INIT 46440 3cc .cfa: sp 0 + .ra: x30 +STACK CFI 46444 .cfa: sp 896 + +STACK CFI 46454 .cfa: sp 992 + .ra: .cfa -984 + ^ x29: .cfa -992 + ^ +STACK CFI 46458 .cfa: x29 992 + +STACK CFI 4645c x19: .cfa -976 + ^ x20: .cfa -968 + ^ +STACK CFI 46468 x25: .cfa -928 + ^ x26: .cfa -920 + ^ x27: .cfa -912 + ^ +STACK CFI 464f0 x21: .cfa -960 + ^ x22: .cfa -952 + ^ x23: .cfa -944 + ^ x24: .cfa -936 + ^ +STACK CFI 467ec .cfa: sp 992 + +STACK CFI 467f0 x19: x19 x20: x20 +STACK CFI 467f4 x21: x21 x22: x22 +STACK CFI 467f8 x23: x23 x24: x24 +STACK CFI 467fc x25: x25 x26: x26 +STACK CFI 46800 x27: x27 +STACK CFI 46804 .cfa: sp 896 + .ra: .ra x29: x29 +STACK CFI 46808 .cfa: sp 800 + +STACK CFI INIT 4680c 464 .cfa: sp 0 + .ra: x30 +STACK CFI 46810 .cfa: sp 880 + +STACK CFI 46818 .cfa: sp 992 + .ra: .cfa -984 + ^ x29: .cfa -992 + ^ +STACK CFI 4681c .cfa: x29 992 + +STACK CFI 46820 x19: .cfa -976 + ^ x20: .cfa -968 + ^ +STACK CFI 46830 x27: .cfa -912 + ^ x28: .cfa -904 + ^ +STACK CFI 46848 v8: .cfa -896 + ^ x21: .cfa -960 + ^ x22: .cfa -952 + ^ x23: .cfa -944 + ^ x24: .cfa -936 + ^ x25: .cfa -928 + ^ x26: .cfa -920 + ^ +STACK CFI 46c4c .cfa: sp 992 + +STACK CFI 46c50 v8: v8 +STACK CFI 46c54 x19: x19 x20: x20 +STACK CFI 46c58 x21: x21 x22: x22 +STACK CFI 46c5c x23: x23 x24: x24 +STACK CFI 46c60 x25: x25 x26: x26 +STACK CFI 46c64 x27: x27 x28: x28 +STACK CFI 46c68 .cfa: sp 880 + .ra: .ra x29: x29 +STACK CFI 46c6c .cfa: sp 768 + +STACK CFI INIT 222d0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 222d4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 222e0 .cfa: x29 32 + +STACK CFI 222e4 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 2236c x19: x19 x20: x20 +STACK CFI 22370 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c70 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c74 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c78 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c7c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c80 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c84 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c88 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c8c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c90 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c94 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c98 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46c9c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46ca0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46ca4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46ca8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46cac 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46cb0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46cb4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46cb8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46cbc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46cc0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46cd4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 46cd8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46cdc .cfa: x29 32 + +STACK CFI 46ce0 x19: .cfa -16 + ^ +STACK CFI 46cf0 x19: x19 +STACK CFI 46cf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46cf8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46d0c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 46d10 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46d14 .cfa: x29 32 + +STACK CFI 46d18 x19: .cfa -16 + ^ +STACK CFI 46d28 x19: x19 +STACK CFI 46d2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46d30 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46d44 24 .cfa: sp 0 + .ra: x30 +STACK CFI 46d48 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46d4c .cfa: x29 32 + +STACK CFI 46d50 x19: .cfa -16 + ^ +STACK CFI 46d60 x19: x19 +STACK CFI 46d64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46d68 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46d7c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 46d80 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46d84 .cfa: x29 32 + +STACK CFI 46d88 x19: .cfa -16 + ^ +STACK CFI 46d98 x19: x19 +STACK CFI 46d9c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46da0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46db4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 46db8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46dbc .cfa: x29 32 + +STACK CFI 46dc0 x19: .cfa -16 + ^ +STACK CFI 46dd0 x19: x19 +STACK CFI 46dd4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46dd8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46dec 24 .cfa: sp 0 + .ra: x30 +STACK CFI 46df0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46df4 .cfa: x29 32 + +STACK CFI 46df8 x19: .cfa -16 + ^ +STACK CFI 46e08 x19: x19 +STACK CFI 46e0c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46e10 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46e24 24 .cfa: sp 0 + .ra: x30 +STACK CFI 46e28 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46e2c .cfa: x29 32 + +STACK CFI 46e30 x19: .cfa -16 + ^ +STACK CFI 46e40 x19: x19 +STACK CFI 46e44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46e48 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46e5c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 46e60 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46e64 .cfa: x29 32 + +STACK CFI 46e68 x19: .cfa -16 + ^ +STACK CFI 46e78 x19: x19 +STACK CFI 46e7c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46e80 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46e94 24 .cfa: sp 0 + .ra: x30 +STACK CFI 46e98 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46e9c .cfa: x29 32 + +STACK CFI 46ea0 x19: .cfa -16 + ^ +STACK CFI 46eb0 x19: x19 +STACK CFI 46eb4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46eb8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 46ecc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 46ed0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46ed4 .cfa: x29 32 + +STACK CFI 46ed8 x19: .cfa -16 + ^ +STACK CFI 46ee8 x19: x19 +STACK CFI 46eec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46ef0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 46ef4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46efc .cfa: x29 32 + +STACK CFI 46f00 x19: .cfa -16 + ^ +STACK CFI 46f24 x19: x19 +STACK CFI 46f28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46f2c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 46f30 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46f38 .cfa: x29 32 + +STACK CFI 46f3c x19: .cfa -16 + ^ +STACK CFI 46f60 x19: x19 +STACK CFI 46f64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46f68 3c .cfa: sp 0 + .ra: x30 +STACK CFI 46f6c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46f74 .cfa: x29 32 + +STACK CFI 46f78 x19: .cfa -16 + ^ +STACK CFI 46f9c x19: x19 +STACK CFI 46fa0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46fa4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 46fa8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46fb0 .cfa: x29 32 + +STACK CFI 46fb4 x19: .cfa -16 + ^ +STACK CFI 46fd8 x19: x19 +STACK CFI 46fdc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 46fe0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 46fe4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 46fec .cfa: x29 32 + +STACK CFI 46ff0 x19: .cfa -16 + ^ +STACK CFI 47014 x19: x19 +STACK CFI 47018 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4701c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 47020 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 47028 .cfa: x29 32 + +STACK CFI 4702c x19: .cfa -16 + ^ +STACK CFI 47050 x19: x19 +STACK CFI 47054 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 47058 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4705c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 47064 .cfa: x29 32 + +STACK CFI 47068 x19: .cfa -16 + ^ +STACK CFI 4708c x19: x19 +STACK CFI 47090 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 47094 3c .cfa: sp 0 + .ra: x30 +STACK CFI 47098 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 470a0 .cfa: x29 32 + +STACK CFI 470a4 x19: .cfa -16 + ^ +STACK CFI 470c8 x19: x19 +STACK CFI 470cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 470d0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 470d4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 470dc .cfa: x29 32 + +STACK CFI 470e0 x19: .cfa -16 + ^ +STACK CFI 47104 x19: x19 +STACK CFI 47108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4710c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 47110 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 47118 .cfa: x29 32 + +STACK CFI 4711c x19: .cfa -16 + ^ +STACK CFI 47140 x19: x19 +STACK CFI 47144 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24884 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 48 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 140 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 134 x19: x19 x20: x20 +STACK CFI 138 x21: x21 x22: x22 +STACK CFI 13c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28074 5c .cfa: sp 0 + .ra: x30 +STACK CFI 28078 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 28080 .cfa: x29 336 + +STACK CFI 28084 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 2808c x21: .cfa -304 + ^ +STACK CFI 280c0 x21: x21 +STACK CFI 280c8 x19: x19 x20: x20 +STACK CFI 280cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 47148 148 .cfa: sp 0 + .ra: x30 +STACK CFI 4714c .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 47150 .cfa: x29 208 + +STACK CFI 47158 x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ +STACK CFI 47174 x23: .cfa -160 + ^ x24: .cfa -152 + ^ x25: .cfa -144 + ^ +STACK CFI 4727c x19: x19 x20: x20 +STACK CFI 47280 x21: x21 x22: x22 +STACK CFI 47284 x23: x23 x24: x24 +STACK CFI 47288 x25: x25 +STACK CFI 4728c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI c .cfa: x29 384 + +STACK CFI 10 x19: .cfa -368 + ^ x20: .cfa -360 + ^ +STACK CFI 20 x21: .cfa -352 + ^ x22: .cfa -344 + ^ +STACK CFI 28 x23: .cfa -336 + ^ x24: .cfa -328 + ^ +STACK CFI 124 x19: x19 x20: x20 +STACK CFI 128 x21: x21 x22: x22 +STACK CFI 12c x23: x23 x24: x24 +STACK CFI 130 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26c88 9c .cfa: sp 0 + .ra: x30 +STACK CFI 26c8c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 26c90 .cfa: x29 160 + +STACK CFI 26c98 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 26d18 x19: x19 x20: x20 +STACK CFI 26d1c x21: x21 x22: x22 +STACK CFI 26d20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 47290 124 .cfa: sp 0 + .ra: x30 +STACK CFI 47294 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 47298 .cfa: x29 128 + +STACK CFI 472a4 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 472b8 x25: .cfa -64 + ^ +STACK CFI 473a0 x19: x19 x20: x20 +STACK CFI 473a4 x21: x21 x22: x22 +STACK CFI 473a8 x23: x23 x24: x24 +STACK CFI 473ac x25: x25 +STACK CFI 473b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 473b4 73c .cfa: sp 0 + .ra: x30 +STACK CFI 473b8 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 473c0 .cfa: x29 176 + +STACK CFI 473c4 x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 473dc x19: .cfa -160 + ^ x20: .cfa -152 + ^ x23: .cfa -128 + ^ x24: .cfa -120 + ^ x25: .cfa -112 + ^ x26: .cfa -104 + ^ +STACK CFI 47adc x19: x19 x20: x20 +STACK CFI 47ae0 x21: x21 x22: x22 +STACK CFI 47ae4 x23: x23 x24: x24 +STACK CFI 47ae8 x25: x25 x26: x26 +STACK CFI 47aec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 47af0 338 .cfa: sp 0 + .ra: x30 +STACK CFI 47af4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 47b00 .cfa: x29 128 + +STACK CFI 47b04 x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 47b1c x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 47e18 x19: x19 x20: x20 +STACK CFI 47e1c x21: x21 x22: x22 +STACK CFI 47e20 x23: x23 x24: x24 +STACK CFI 47e24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 279ec 5c .cfa: sp 0 + .ra: x30 +STACK CFI 279f0 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 279f8 .cfa: x29 336 + +STACK CFI 279fc x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 27a04 x21: .cfa -304 + ^ +STACK CFI 27a38 x21: x21 +STACK CFI 27a40 x19: x19 x20: x20 +STACK CFI 27a44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27b7c 9c .cfa: sp 0 + .ra: x30 +STACK CFI 27b80 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 27b84 .cfa: x29 160 + +STACK CFI 27b8c x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 27c0c x19: x19 x20: x20 +STACK CFI 27c10 x21: x21 x22: x22 +STACK CFI 27c14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 47e28 484 .cfa: sp 0 + .ra: x30 +STACK CFI 47e2c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 47e34 .cfa: x29 112 + +STACK CFI 47e44 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ +STACK CFI 48298 x25: x25 +STACK CFI 4829c x19: x19 x20: x20 +STACK CFI 482a0 x21: x21 x22: x22 +STACK CFI 482a4 x23: x23 x24: x24 +STACK CFI 482a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 280d0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 280d4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 280d8 .cfa: x29 160 + +STACK CFI 280e0 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 28160 x19: x19 x20: x20 +STACK CFI 28164 x21: x21 x22: x22 +STACK CFI 28168 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb58 88 .cfa: sp 0 + .ra: x30 +STACK CFI 2eb5c .cfa: sp 352 + .ra: .cfa -344 + ^ x29: .cfa -352 + ^ +STACK CFI 2eb64 .cfa: x29 352 + +STACK CFI 2eb68 x19: .cfa -336 + ^ x20: .cfa -328 + ^ +STACK CFI 2eb78 x21: .cfa -320 + ^ +STACK CFI 2ebd4 x21: x21 +STACK CFI 2ebd8 x19: x19 x20: x20 +STACK CFI 2ebdc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 482ac a8 .cfa: sp 0 + .ra: x30 +STACK CFI 482b0 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 482b4 .cfa: x29 176 + +STACK CFI 482bc x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 48348 x19: x19 x20: x20 +STACK CFI 4834c x21: x21 x22: x22 +STACK CFI 48350 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 48354 458 .cfa: sp 0 + .ra: x30 +STACK CFI 48358 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 48360 .cfa: x29 208 + +STACK CFI 48364 x23: .cfa -160 + ^ x24: .cfa -152 + ^ +STACK CFI 48380 x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ +STACK CFI 4879c x19: x19 x20: x20 +STACK CFI 487a0 x21: x21 x22: x22 +STACK CFI 487a4 x23: x23 x24: x24 +STACK CFI 487a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 487ac 418 .cfa: sp 0 + .ra: x30 +STACK CFI 487b0 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 487b8 .cfa: x29 176 + +STACK CFI 487bc x23: .cfa -128 + ^ x24: .cfa -120 + ^ +STACK CFI 487d8 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 48bb4 x19: x19 x20: x20 +STACK CFI 48bb8 x21: x21 x22: x22 +STACK CFI 48bbc x23: x23 x24: x24 +STACK CFI 48bc0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27850 88 .cfa: sp 0 + .ra: x30 +STACK CFI 27854 .cfa: sp 352 + .ra: .cfa -344 + ^ x29: .cfa -352 + ^ +STACK CFI 2785c .cfa: x29 352 + +STACK CFI 27860 x19: .cfa -336 + ^ x20: .cfa -328 + ^ +STACK CFI 27870 x21: .cfa -320 + ^ +STACK CFI 278cc x21: x21 +STACK CFI 278d0 x19: x19 x20: x20 +STACK CFI 278d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 48bc4 84 .cfa: sp 0 + .ra: x30 +STACK CFI 48bc8 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 48bcc .cfa: x29 160 + +STACK CFI 48bd0 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 48bdc x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 48c3c x19: x19 x20: x20 +STACK CFI 48c40 x21: x21 x22: x22 +STACK CFI 48c44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 48c48 9c .cfa: sp 0 + .ra: x30 +STACK CFI 48c4c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 48c50 .cfa: x29 160 + +STACK CFI 48c58 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 48cd8 x19: x19 x20: x20 +STACK CFI 48cdc x21: x21 x22: x22 +STACK CFI 48ce0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 48ce4 9c .cfa: sp 0 + .ra: x30 +STACK CFI 48ce8 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 48cec .cfa: x29 160 + +STACK CFI 48cf4 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 48d74 x19: x19 x20: x20 +STACK CFI 48d78 x21: x21 x22: x22 +STACK CFI 48d7c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 48d80 3bc .cfa: sp 0 + .ra: x30 +STACK CFI 48d84 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 48d90 .cfa: x29 128 + +STACK CFI 48da4 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ +STACK CFI 4912c x23: x23 +STACK CFI 49130 x19: x19 x20: x20 +STACK CFI 49134 x21: x21 x22: x22 +STACK CFI 49138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4913c 5c .cfa: sp 0 + .ra: x30 +STACK CFI 49140 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 49148 .cfa: x29 336 + +STACK CFI 4914c x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 49154 x21: .cfa -304 + ^ +STACK CFI 49188 x21: x21 +STACK CFI 49190 x19: x19 x20: x20 +STACK CFI 49194 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 8 .cfa: x29 160 + +STACK CFI 10 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 90 x19: x19 x20: x20 +STACK CFI 94 x21: x21 x22: x22 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49198 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4919c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 491a0 .cfa: x29 160 + +STACK CFI 491a8 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 49228 x19: x19 x20: x20 +STACK CFI 4922c x21: x21 x22: x22 +STACK CFI 49230 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49234 47c .cfa: sp 0 + .ra: x30 +STACK CFI 49238 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 49240 .cfa: x29 144 + +STACK CFI 49244 x21: .cfa -112 + ^ x22: .cfa -104 + ^ +STACK CFI 49258 x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ +STACK CFI 49268 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI 49698 x19: x19 x20: x20 +STACK CFI 4969c x21: x21 x22: x22 +STACK CFI 496a0 x23: x23 x24: x24 +STACK CFI 496a4 x25: x25 x26: x26 +STACK CFI 496a8 x27: x27 x28: x28 +STACK CFI 496ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 496b0 390 .cfa: sp 0 + .ra: x30 +STACK CFI 496b4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 496b8 .cfa: x29 144 + +STACK CFI 496bc x25: .cfa -80 + ^ x26: .cfa -72 + ^ +STACK CFI 496c8 x21: .cfa -112 + ^ x22: .cfa -104 + ^ +STACK CFI 496e0 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI 49a28 x19: x19 x20: x20 +STACK CFI 49a2c x21: x21 x22: x22 +STACK CFI 49a30 x23: x23 x24: x24 +STACK CFI 49a34 x25: x25 x26: x26 +STACK CFI 49a38 x27: x27 x28: x28 +STACK CFI 49a3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI c4 x21: x21 +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 104 x23: x23 +STACK CFI 108 x19: x19 x20: x20 +STACK CFI 10c x21: x21 x22: x22 +STACK CFI 110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 22378 358 .cfa: sp 0 + .ra: x30 +STACK CFI 2237c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 22380 .cfa: x29 64 + +STACK CFI 22388 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 226bc x21: x21 +STACK CFI 226c4 x19: x19 x20: x20 +STACK CFI 226c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 43124 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 49a40 5c .cfa: sp 0 + .ra: x30 +STACK CFI 49a44 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 49a48 .cfa: x29 64 + +STACK CFI 49a50 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 49a8c x21: x21 +STACK CFI 49a94 x19: x19 x20: x20 +STACK CFI 49a98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49a9c 74 .cfa: sp 0 + .ra: x30 +STACK CFI 49aa0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 49aa8 .cfa: x29 32 + +STACK CFI 49aac x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 49ad8 x19: x19 x20: x20 +STACK CFI 49adc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 49ae0 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 49b04 x19: x19 x20: x20 +STACK CFI 49b08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49b10 150 .cfa: sp 0 + .ra: x30 +STACK CFI 49b14 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 49b18 .cfa: x29 80 + +STACK CFI 49b28 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ x26: .cfa -8 + ^ +STACK CFI 49c4c x19: x19 x20: x20 +STACK CFI 49c50 x21: x21 x22: x22 +STACK CFI 49c54 x23: x23 x24: x24 +STACK CFI 49c58 x25: x25 x26: x26 +STACK CFI 49c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 432e4 70 .cfa: sp 0 + .ra: x30 +STACK CFI 432ec .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 432f0 .cfa: x29 48 + +STACK CFI 432fc x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 43348 x21: x21 +STACK CFI 4334c x19: x19 x20: x20 +STACK CFI 43350 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43354 24 .cfa: sp 0 + .ra: x30 +STACK CFI 43358 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4335c .cfa: x29 32 + +STACK CFI 43360 x19: .cfa -16 + ^ +STACK CFI 43370 x19: x19 +STACK CFI 43374 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49c60 34 .cfa: sp 0 + .ra: x30 +STACK CFI 49c68 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 49c6c .cfa: x29 32 + +STACK CFI 49c74 x19: .cfa -16 + ^ +STACK CFI 49c8c x19: x19 +STACK CFI 49c90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49c94 24 .cfa: sp 0 + .ra: x30 +STACK CFI 49c98 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 49c9c .cfa: x29 32 + +STACK CFI 49ca0 x19: .cfa -16 + ^ +STACK CFI 49cb0 x19: x19 +STACK CFI 49cb4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49cb8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 49ccc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 49cd0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 49cd4 .cfa: x29 32 + +STACK CFI 49cd8 x19: .cfa -16 + ^ +STACK CFI 49ce8 x19: x19 +STACK CFI 49cec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 170 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 160 x23: x23 +STACK CFI 164 x19: x19 x20: x20 +STACK CFI 168 x21: x21 x22: x22 +STACK CFI 16c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49cf0 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 49cf4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 49cf8 .cfa: x29 80 + +STACK CFI 49d00 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 49d98 x21: x21 +STACK CFI 49d9c x19: x19 x20: x20 +STACK CFI 49da0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49da4 108 .cfa: sp 0 + .ra: x30 +STACK CFI 49da8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 49dac .cfa: x29 96 + +STACK CFI 49db8 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 49e9c x23: x23 x24: x24 +STACK CFI 49ea0 x19: x19 x20: x20 +STACK CFI 49ea4 x21: x21 x22: x22 +STACK CFI 49ea8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 14 x21: .cfa -16 + ^ +STACK CFI 60 x19: x19 x20: x20 +STACK CFI 64 x21: x21 +STACK CFI 68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 14 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 5c x19: x19 x20: x20 +STACK CFI 60 x21: x21 x22: x22 +STACK CFI 64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49eac 58 .cfa: sp 0 + .ra: x30 +STACK CFI 49eb0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 49eb8 .cfa: x29 48 + +STACK CFI 49ebc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 49efc x19: x19 x20: x20 +STACK CFI 49f00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 54 x19: x19 +STACK CFI 58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49f04 48 .cfa: sp 0 + .ra: x30 +STACK CFI 49f08 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 49f0c .cfa: x29 48 + +STACK CFI 49f10 x19: .cfa -32 + ^ +STACK CFI 49f44 x19: x19 +STACK CFI 49f48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 435f8 64 .cfa: sp 0 + .ra: x30 +STACK CFI 435fc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 43600 .cfa: x29 48 + +STACK CFI 43608 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 43650 x19: x19 x20: x20 +STACK CFI 43654 x21: x21 x22: x22 +STACK CFI 43658 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4365c 48 .cfa: sp 0 + .ra: x30 +STACK CFI 43664 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 43668 .cfa: x29 32 + +STACK CFI 43670 x19: .cfa -16 + ^ +STACK CFI 4369c x19: x19 +STACK CFI 436a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 436a4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 436a8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 436ac .cfa: x29 32 + +STACK CFI 436b0 x19: .cfa -16 + ^ +STACK CFI 436c0 x19: x19 +STACK CFI 436c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 436c8 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 436cc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 436d0 .cfa: x29 48 + +STACK CFI 436d4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 436e0 x21: .cfa -16 + ^ +STACK CFI 43770 x21: x21 +STACK CFI 43778 x19: x19 x20: x20 +STACK CFI 4377c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43780 24 .cfa: sp 0 + .ra: x30 +STACK CFI 43784 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 43788 .cfa: x29 32 + +STACK CFI 4378c x19: .cfa -16 + ^ +STACK CFI 4379c x19: x19 +STACK CFI 437a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31b50 60 .cfa: sp 0 + .ra: x30 +STACK CFI 31b54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 31b60 .cfa: x29 32 + +STACK CFI 31b64 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 31ba8 x19: x19 x20: x20 +STACK CFI 31bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49f4c 98 .cfa: sp 0 + .ra: x30 +STACK CFI 49f50 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 49f54 .cfa: x29 32 + +STACK CFI 49f58 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 49fdc x19: x19 x20: x20 +STACK CFI 49fe0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 49fe4 204 .cfa: sp 0 + .ra: x30 +STACK CFI 49fe8 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 49fec .cfa: x29 128 + +STACK CFI 49ff0 x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 4a000 v8: .cfa -32 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ +STACK CFI 4a01c x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 4a034 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 4a1cc x23: x23 x24: x24 +STACK CFI 4a1d0 x19: x19 x20: x20 +STACK CFI 4a1d4 x21: x21 x22: x22 +STACK CFI 4a1d8 x25: x25 x26: x26 +STACK CFI 4a1dc x27: x27 x28: x28 +STACK CFI 4a1e0 v8: v8 +STACK CFI 4a1e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4a1e8 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 31bb0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 31c0c 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 31c68 124 .cfa: sp 0 + .ra: x30 +STACK CFI 31c6c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 31c70 .cfa: x29 48 + +STACK CFI 31c78 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 31ca0 x19: x19 x20: x20 +STACK CFI 31ca4 x21: x21 x22: x22 +STACK CFI 31ca8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 31cac .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 4a244 dc .cfa: sp 0 + .ra: x30 +STACK CFI 4a248 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 4a250 .cfa: x29 64 + +STACK CFI 4a258 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 4a314 x19: x19 x20: x20 +STACK CFI 4a318 x21: x21 x22: x22 +STACK CFI 4a31c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4a320 fc .cfa: sp 0 + .ra: x30 +STACK CFI 4a324 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 4a328 .cfa: x29 96 + +STACK CFI 4a334 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 4a40c x19: x19 x20: x20 +STACK CFI 4a410 x21: x21 x22: x22 +STACK CFI 4a414 x23: x23 +STACK CFI 4a418 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4a41c 2d4 .cfa: sp 0 + .ra: x30 +STACK CFI 4a420 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 4a424 .cfa: x29 112 + +STACK CFI 4a434 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ +STACK CFI 4a6dc x25: x25 +STACK CFI 4a6e0 x19: x19 x20: x20 +STACK CFI 4a6e4 x21: x21 x22: x22 +STACK CFI 4a6e8 x23: x23 x24: x24 +STACK CFI 4a6ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4a6f0 ec .cfa: sp 0 + .ra: x30 +STACK CFI 4a6f4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 4a6f8 .cfa: x29 144 + +STACK CFI 4a704 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ +STACK CFI 4a7cc x23: x23 +STACK CFI 4a7d0 x19: x19 x20: x20 +STACK CFI 4a7d4 x21: x21 x22: x22 +STACK CFI 4a7d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4a7dc 120 .cfa: sp 0 + .ra: x30 +STACK CFI 4a7e0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 4a7e4 .cfa: x29 80 + +STACK CFI 4a7f0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 4a8ec x19: x19 x20: x20 +STACK CFI 4a8f0 x21: x21 x22: x22 +STACK CFI 4a8f4 x23: x23 x24: x24 +STACK CFI 4a8f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4a8fc a4 .cfa: sp 0 + .ra: x30 +STACK CFI 4a900 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 4a904 .cfa: x29 96 + +STACK CFI 4a90c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ +STACK CFI 4a994 x21: x21 +STACK CFI 4a998 x19: x19 x20: x20 +STACK CFI 4a99c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4a9a0 a4 .cfa: sp 0 + .ra: x30 +STACK CFI 4a9a4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 4a9a8 .cfa: x29 96 + +STACK CFI 4a9b0 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ +STACK CFI 4aa38 x21: x21 +STACK CFI 4aa3c x19: x19 x20: x20 +STACK CFI 4aa40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4aa44 210 .cfa: sp 0 + .ra: x30 +STACK CFI 4aa48 .cfa: sp 288 + .ra: .cfa -280 + ^ x29: .cfa -288 + ^ +STACK CFI 4aa4c .cfa: x29 288 + +STACK CFI 4aa50 x21: .cfa -256 + ^ x22: .cfa -248 + ^ +STACK CFI 4aa5c x19: .cfa -272 + ^ x20: .cfa -264 + ^ +STACK CFI 4aa80 x23: .cfa -240 + ^ x24: .cfa -232 + ^ x25: .cfa -224 + ^ x26: .cfa -216 + ^ x27: .cfa -208 + ^ x28: .cfa -200 + ^ +STACK CFI 4ac3c x19: x19 x20: x20 +STACK CFI 4ac40 x21: x21 x22: x22 +STACK CFI 4ac44 x23: x23 x24: x24 +STACK CFI 4ac48 x25: x25 x26: x26 +STACK CFI 4ac4c x27: x27 x28: x28 +STACK CFI 4ac50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4ac54 100 .cfa: sp 0 + .ra: x30 +STACK CFI 4ac58 .cfa: sp 112 + +STACK CFI 4ac5c .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 4ac60 .cfa: x29 96 + +STACK CFI 4ac64 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 4ad44 .cfa: sp 112 + +STACK CFI 4ad48 x19: x19 x20: x20 +STACK CFI 4ad4c .ra: .ra x29: x29 +STACK CFI 4ad50 .cfa: sp 0 + +STACK CFI INIT 4ad54 438 .cfa: sp 0 + .ra: x30 +STACK CFI 4ad58 .cfa: sp 320 + +STACK CFI 4ad60 .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 4ad64 .cfa: x29 304 + +STACK CFI 4ad6c v10: .cfa -192 + ^ v8: .cfa -208 + ^ v9: .cfa -200 + ^ +STACK CFI 4ad80 x19: .cfa -288 + ^ x20: .cfa -280 + ^ +STACK CFI 4ad8c x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ +STACK CFI 4ad9c x25: .cfa -240 + ^ x26: .cfa -232 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ +STACK CFI 4b164 .cfa: sp 320 + +STACK CFI 4b168 v8: v8 v9: v9 +STACK CFI 4b16c v10: v10 +STACK CFI 4b170 x19: x19 x20: x20 +STACK CFI 4b174 x21: x21 x22: x22 +STACK CFI 4b178 x23: x23 x24: x24 +STACK CFI 4b17c x25: x25 x26: x26 +STACK CFI 4b180 x27: x27 x28: x28 +STACK CFI 4b184 .ra: .ra x29: x29 +STACK CFI 4b188 .cfa: sp 0 + +STACK CFI INIT 4b18c 78 .cfa: sp 0 + .ra: x30 +STACK CFI 4b190 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 4b194 .cfa: x29 48 + +STACK CFI 4b198 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 4b1a0 x21: .cfa -16 + ^ +STACK CFI 4b1f8 x19: x19 x20: x20 +STACK CFI 4b1fc x21: x21 +STACK CFI 4b200 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b204 60 .cfa: sp 0 + .ra: x30 +STACK CFI 4b208 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 4b20c .cfa: x29 48 + +STACK CFI 4b210 x19: .cfa -32 + ^ +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4b264 6c .cfa: sp 0 + .ra: x30 +STACK CFI 4b268 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 4b270 .cfa: x29 48 + +STACK CFI 4b274 x19: .cfa -32 + ^ +STACK CFI 4b2c8 x19: x19 +STACK CFI 4b2cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b2d0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4b2dc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4b2e8 58 .cfa: sp 0 + .ra: x30 +STACK CFI 4b2ec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4b2f4 .cfa: x29 32 + +STACK CFI 4b2f8 x19: .cfa -16 + ^ +STACK CFI 4b338 x19: x19 +STACK CFI 4b33c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b340 88 .cfa: sp 0 + .ra: x30 +STACK CFI 4b344 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 4b348 .cfa: x29 48 + +STACK CFI 4b350 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 4b3bc x19: x19 x20: x20 +STACK CFI 4b3c0 x21: x21 x22: x22 +STACK CFI 4b3c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b3c8 44 .cfa: sp 0 + .ra: x30 +STACK CFI 4b3cc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4b3d4 .cfa: x29 32 + +STACK CFI 4b408 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b40c dc .cfa: sp 0 + .ra: x30 +STACK CFI 4b410 .cfa: sp 8192 + +STACK CFI 4b418 .cfa: sp 8288 + .ra: .cfa -8280 + ^ x29: .cfa -8288 + ^ +STACK CFI 4b41c .cfa: x29 8288 + +STACK CFI 4b424 x19: .cfa -8272 + ^ x20: .cfa -8264 + ^ x21: .cfa -8256 + ^ x22: .cfa -8248 + ^ +STACK CFI 4b438 x23: .cfa -8240 + ^ x24: .cfa -8232 + ^ x25: .cfa -8224 + ^ x26: .cfa -8216 + ^ x27: .cfa -8208 + ^ +STACK CFI 4b4cc x19: x19 x20: x20 +STACK CFI 4b4d0 x21: x21 x22: x22 +STACK CFI 4b4d4 x23: x23 x24: x24 +STACK CFI 4b4d8 x25: x25 x26: x26 +STACK CFI 4b4dc x27: x27 +STACK CFI 4b4e0 .cfa: sp 8192 + .ra: .ra x29: x29 +STACK CFI 4b4e4 .cfa: sp 8096 + +STACK CFI INIT 4b4e8 188 .cfa: sp 0 + .ra: x30 +STACK CFI 4b4ec .cfa: sp 256 + .ra: .cfa -248 + ^ x29: .cfa -256 + ^ +STACK CFI 4b4f0 .cfa: x29 256 + +STACK CFI 4b4f8 x21: .cfa -224 + ^ x22: .cfa -216 + ^ x27: .cfa -176 + ^ +STACK CFI 4b508 x19: .cfa -240 + ^ x20: .cfa -232 + ^ x23: .cfa -208 + ^ x24: .cfa -200 + ^ x25: .cfa -192 + ^ x26: .cfa -184 + ^ +STACK CFI 4b658 x19: x19 x20: x20 +STACK CFI 4b65c x21: x21 x22: x22 +STACK CFI 4b660 x23: x23 x24: x24 +STACK CFI 4b664 x25: x25 x26: x26 +STACK CFI 4b668 x27: x27 +STACK CFI 4b66c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 48 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b670 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4b674 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4b678 .cfa: x29 32 + +STACK CFI 4b67c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 4b6bc x19: x19 x20: x20 +STACK CFI 4b6c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 170 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 160 x23: x23 +STACK CFI 164 x19: x19 x20: x20 +STACK CFI 168 x21: x21 x22: x22 +STACK CFI 16c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 2b0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI c .cfa: x29 272 + +STACK CFI 10 x19: .cfa -256 + ^ x20: .cfa -248 + ^ +STACK CFI 20 x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ x25: .cfa -208 + ^ +STACK CFI 29c x19: x19 x20: x20 +STACK CFI 2a0 x21: x21 x22: x22 +STACK CFI 2a4 x23: x23 x24: x24 +STACK CFI 2a8 x25: x25 +STACK CFI 2ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b6c4 28 .cfa: sp 0 + .ra: x30 +STACK CFI 4b6c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4b6cc .cfa: x29 32 + +STACK CFI 4b6d0 x19: .cfa -16 + ^ +STACK CFI 4b6e4 x19: x19 +STACK CFI 4b6e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 174 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 20 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 164 x19: x19 x20: x20 +STACK CFI 168 x21: x21 x22: x22 +STACK CFI 16c x23: x23 x24: x24 +STACK CFI 170 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 380 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 368 + .ra: .cfa -360 + ^ x29: .cfa -368 + ^ +STACK CFI 8 .cfa: x29 368 + +STACK CFI 1c x19: .cfa -352 + ^ x20: .cfa -344 + ^ x21: .cfa -336 + ^ x22: .cfa -328 + ^ x23: .cfa -320 + ^ x24: .cfa -312 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ x27: .cfa -288 + ^ x28: .cfa -280 + ^ +STACK CFI 368 x19: x19 x20: x20 +STACK CFI 36c x21: x21 x22: x22 +STACK CFI 370 x23: x23 x24: x24 +STACK CFI 374 x25: x25 x26: x26 +STACK CFI 378 x27: x27 x28: x28 +STACK CFI 37c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b6ec 30 .cfa: sp 0 + .ra: x30 +STACK CFI 4b6f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4b6f4 .cfa: x29 32 + +STACK CFI 4b6f8 x19: .cfa -16 + ^ +STACK CFI 4b714 x19: x19 +STACK CFI 4b718 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b71c 2c .cfa: sp 0 + .ra: x30 +STACK CFI 4b720 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4b728 .cfa: x29 32 + +STACK CFI 4b730 x19: .cfa -16 + ^ +STACK CFI 4b740 x19: x19 +STACK CFI 4b744 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b748 2c .cfa: sp 0 + .ra: x30 +STACK CFI 4b74c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4b754 .cfa: x29 32 + +STACK CFI 4b75c x19: .cfa -16 + ^ +STACK CFI 4b76c x19: x19 +STACK CFI 4b770 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b774 27c .cfa: sp 0 + .ra: x30 +STACK CFI 4b778 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 4b780 .cfa: x29 128 + +STACK CFI 4b784 x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 4b7a0 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ +STACK CFI 4b9dc x19: x19 x20: x20 +STACK CFI 4b9e0 x21: x21 x22: x22 +STACK CFI 4b9e4 x23: x23 x24: x24 +STACK CFI 4b9e8 x25: x25 x26: x26 +STACK CFI 4b9ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4b9f0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4b9f4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4b9f8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4b9fc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4ba00 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4ba04 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4ba08 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4ba0c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4ba10 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4ba14 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4ba18 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4ba1c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4ba20 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4ba34 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4ba38 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4ba3c .cfa: x29 32 + +STACK CFI 4ba40 x19: .cfa -16 + ^ +STACK CFI 4ba50 x19: x19 +STACK CFI 4ba54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4ba58 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4ba6c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4ba70 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4ba74 .cfa: x29 32 + +STACK CFI 4ba78 x19: .cfa -16 + ^ +STACK CFI 4ba88 x19: x19 +STACK CFI 4ba8c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4ba90 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4baa4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4baa8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4baac .cfa: x29 32 + +STACK CFI 4bab0 x19: .cfa -16 + ^ +STACK CFI 4bac0 x19: x19 +STACK CFI 4bac4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bac8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4badc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4bae0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bae4 .cfa: x29 32 + +STACK CFI 4bae8 x19: .cfa -16 + ^ +STACK CFI 4baf8 x19: x19 +STACK CFI 4bafc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bb00 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4bb14 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4bb18 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bb1c .cfa: x29 32 + +STACK CFI 4bb20 x19: .cfa -16 + ^ +STACK CFI 4bb30 x19: x19 +STACK CFI 4bb34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bb38 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4bb4c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4bb50 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bb54 .cfa: x29 32 + +STACK CFI 4bb58 x19: .cfa -16 + ^ +STACK CFI 4bb68 x19: x19 +STACK CFI 4bb6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bb70 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4bb74 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bb7c .cfa: x29 32 + +STACK CFI 4bb80 x19: .cfa -16 + ^ +STACK CFI 4bba4 x19: x19 +STACK CFI 4bba8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bbac 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4bbb0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bbb8 .cfa: x29 32 + +STACK CFI 4bbbc x19: .cfa -16 + ^ +STACK CFI 4bbe0 x19: x19 +STACK CFI 4bbe4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bbe8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4bbec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bbf4 .cfa: x29 32 + +STACK CFI 4bbf8 x19: .cfa -16 + ^ +STACK CFI 4bc1c x19: x19 +STACK CFI 4bc20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bc24 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4bc28 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bc30 .cfa: x29 32 + +STACK CFI 4bc34 x19: .cfa -16 + ^ +STACK CFI 4bc58 x19: x19 +STACK CFI 4bc5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bc60 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4bc64 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bc6c .cfa: x29 32 + +STACK CFI 4bc70 x19: .cfa -16 + ^ +STACK CFI 4bc94 x19: x19 +STACK CFI 4bc98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bc9c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4bca0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bca8 .cfa: x29 32 + +STACK CFI 4bcac x19: .cfa -16 + ^ +STACK CFI 4bcd0 x19: x19 +STACK CFI 4bcd4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bcd8 34 .cfa: sp 0 + .ra: x30 +STACK CFI 4bcdc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bce0 .cfa: x29 32 + +STACK CFI 4bce4 x19: .cfa -16 + ^ +STACK CFI 4bd04 x19: x19 +STACK CFI 4bd08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bd0c fc .cfa: sp 0 + .ra: x30 +STACK CFI 4bd10 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bd18 .cfa: x29 32 + +STACK CFI 4bd1c x19: .cfa -16 + ^ +STACK CFI 4be00 x19: x19 +STACK CFI 4be04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4be08 64 .cfa: sp 0 + .ra: x30 +STACK CFI 4be0c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 4be10 .cfa: x29 48 + +STACK CFI 4be18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 4be60 x19: x19 x20: x20 +STACK CFI 4be64 x21: x21 +STACK CFI 4be68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4be6c 2c .cfa: sp 0 + .ra: x30 +STACK CFI 4be70 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 4be74 .cfa: x29 64 + +STACK CFI 4be78 x19: .cfa -48 + ^ +STACK CFI 4be90 x19: x19 +STACK CFI 4be94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 48 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4be98 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4be9c .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 4bea0 .cfa: x29 176 + +STACK CFI 4bea8 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 4beb4 x23: .cfa -128 + ^ +STACK CFI 4bf9c x23: x23 +STACK CFI 4bfa0 x19: x19 x20: x20 +STACK CFI 4bfa4 x21: x21 x22: x22 +STACK CFI 4bfa8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bfac 180 .cfa: sp 0 + .ra: x30 +STACK CFI 4bfb0 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 4bfb4 .cfa: x29 176 + +STACK CFI 4bfb8 x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 4bfc8 x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ +STACK CFI 4c11c x23: x23 +STACK CFI 4c120 x19: x19 x20: x20 +STACK CFI 4c124 x21: x21 x22: x22 +STACK CFI 4c128 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4c12c d4 .cfa: sp 0 + .ra: x30 +STACK CFI 4c130 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 4c134 .cfa: x29 64 + +STACK CFI 4c140 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 4c1f0 x19: x19 x20: x20 +STACK CFI 4c1f4 x21: x21 x22: x22 +STACK CFI 4c1f8 x23: x23 +STACK CFI 4c1fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 140 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 134 x19: x19 x20: x20 +STACK CFI 138 x21: x21 x22: x22 +STACK CFI 13c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4c200 50 .cfa: sp 0 + .ra: x30 +STACK CFI 4c204 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4c210 .cfa: x29 32 + +STACK CFI 4c214 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 4c21c x19: x19 x20: x20 +STACK CFI 4c224 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 4c22c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 4c248 x19: x19 x20: x20 +STACK CFI 4c24c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4c250 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4c254 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 4c258 .cfa: x29 64 + +STACK CFI 4c264 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 4c2e8 x19: x19 x20: x20 +STACK CFI 4c2ec x21: x21 x22: x22 +STACK CFI 4c2f0 x23: x23 x24: x24 +STACK CFI 4c2f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4c2f8 134 .cfa: sp 0 + .ra: x30 +STACK CFI 4c2fc .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 4c300 .cfa: x29 208 + +STACK CFI 4c304 x19: .cfa -192 + ^ x20: .cfa -184 + ^ +STACK CFI 4c318 x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ +STACK CFI 4c41c x23: x23 +STACK CFI 4c420 x19: x19 x20: x20 +STACK CFI 4c424 x21: x21 x22: x22 +STACK CFI 4c428 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 279ec 5c .cfa: sp 0 + .ra: x30 +STACK CFI 279f0 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 279f8 .cfa: x29 336 + +STACK CFI 279fc x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 27a04 x21: .cfa -304 + ^ +STACK CFI 27a38 x21: x21 +STACK CFI 27a40 x19: x19 x20: x20 +STACK CFI 27a44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4c42c b4 .cfa: sp 0 + .ra: x30 +STACK CFI 4c430 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 4c434 .cfa: x29 416 + +STACK CFI 4c438 x19: .cfa -400 + ^ x20: .cfa -392 + ^ +STACK CFI 4c444 x21: .cfa -384 + ^ x22: .cfa -376 + ^ x23: .cfa -368 + ^ +STACK CFI 4c4cc x23: x23 +STACK CFI 4c4d4 x19: x19 x20: x20 +STACK CFI 4c4d8 x21: x21 x22: x22 +STACK CFI 4c4dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4c4e0 d8 .cfa: sp 0 + .ra: x30 +STACK CFI 4c4e4 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 4c4e8 .cfa: x29 112 + +STACK CFI 4c4ec x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 4c4fc x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 4c5ac x19: x19 x20: x20 +STACK CFI 4c5b0 x21: x21 x22: x22 +STACK CFI 4c5b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4c5b8 84 .cfa: sp 0 + .ra: x30 +STACK CFI 4c5bc .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 4c5c0 .cfa: x29 160 + +STACK CFI 4c5c4 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 4c5d0 x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 4c630 x19: x19 x20: x20 +STACK CFI 4c634 x21: x21 x22: x22 +STACK CFI 4c638 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4c63c 478 .cfa: sp 0 + .ra: x30 +STACK CFI 4c640 .cfa: sp 464 + +STACK CFI 4c644 .cfa: sp 576 + .ra: .cfa -568 + ^ x29: .cfa -576 + ^ +STACK CFI 4c648 .cfa: x29 576 + +STACK CFI 4c64c x23: .cfa -528 + ^ x24: .cfa -520 + ^ +STACK CFI 4c65c x19: .cfa -560 + ^ x20: .cfa -552 + ^ x21: .cfa -544 + ^ x22: .cfa -536 + ^ +STACK CFI 4c66c v8: .cfa -480 + ^ x27: .cfa -496 + ^ x28: .cfa -488 + ^ +STACK CFI 4c674 x25: .cfa -512 + ^ x26: .cfa -504 + ^ +STACK CFI 4ca94 v8: v8 +STACK CFI 4ca98 x19: x19 x20: x20 +STACK CFI 4ca9c x21: x21 x22: x22 +STACK CFI 4caa0 x23: x23 x24: x24 +STACK CFI 4caa4 x25: x25 x26: x26 +STACK CFI 4caa8 x27: x27 x28: x28 +STACK CFI 4caac .cfa: sp 464 + .ra: .ra x29: x29 +STACK CFI 4cab0 .cfa: sp 352 + +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI c4 x21: x21 +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 104 x23: x23 +STACK CFI 108 x19: x19 x20: x20 +STACK CFI 10c x21: x21 x22: x22 +STACK CFI 110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 226d0 220 .cfa: sp 0 + .ra: x30 +STACK CFI 226d4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 226d8 .cfa: x29 64 + +STACK CFI 226e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 228e0 x19: x19 x20: x20 +STACK CFI 228e4 x21: x21 x22: x22 +STACK CFI 228ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cab4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cab8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cabc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cac0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cac4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cac8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cacc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cad0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cad4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cad8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cadc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cae0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cae4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cae8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4caec 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cb00 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4cb04 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4cb08 .cfa: x29 32 + +STACK CFI 4cb0c x19: .cfa -16 + ^ +STACK CFI 4cb1c x19: x19 +STACK CFI 4cb20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cb24 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cb38 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4cb3c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4cb40 .cfa: x29 32 + +STACK CFI 4cb44 x19: .cfa -16 + ^ +STACK CFI 4cb54 x19: x19 +STACK CFI 4cb58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cb5c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cb70 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4cb74 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4cb78 .cfa: x29 32 + +STACK CFI 4cb7c x19: .cfa -16 + ^ +STACK CFI 4cb8c x19: x19 +STACK CFI 4cb90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cb94 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cba8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4cbac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4cbb0 .cfa: x29 32 + +STACK CFI 4cbb4 x19: .cfa -16 + ^ +STACK CFI 4cbc4 x19: x19 +STACK CFI 4cbc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cbcc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cbe0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4cbe4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4cbe8 .cfa: x29 32 + +STACK CFI 4cbec x19: .cfa -16 + ^ +STACK CFI 4cbfc x19: x19 +STACK CFI 4cc00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cc04 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cc18 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4cc1c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4cc20 .cfa: x29 32 + +STACK CFI 4cc24 x19: .cfa -16 + ^ +STACK CFI 4cc34 x19: x19 +STACK CFI 4cc38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cc3c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4cc50 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4cc54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4cc58 .cfa: x29 32 + +STACK CFI 4cc5c x19: .cfa -16 + ^ +STACK CFI 4cc6c x19: x19 +STACK CFI 4cc70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cc74 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4cc78 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 4cc7c .cfa: x29 64 + +STACK CFI 4cc80 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 4cc8c x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 4cd30 x19: x19 x20: x20 +STACK CFI 4cd34 x21: x21 x22: x22 +STACK CFI 4cd38 x23: x23 +STACK CFI 4cd3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cd40 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 4cd44 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 4cd48 .cfa: x29 64 + +STACK CFI 4cd54 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 4cde8 x19: x19 x20: x20 +STACK CFI 4cdec x21: x21 x22: x22 +STACK CFI 4cdf0 x23: x23 x24: x24 +STACK CFI 4cdf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cdf8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4cdfc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4ce04 .cfa: x29 32 + +STACK CFI 4ce08 x19: .cfa -16 + ^ +STACK CFI 4ce2c x19: x19 +STACK CFI 4ce30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4ce34 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4ce38 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4ce40 .cfa: x29 32 + +STACK CFI 4ce44 x19: .cfa -16 + ^ +STACK CFI 4ce68 x19: x19 +STACK CFI 4ce6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4ce70 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4ce74 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4ce7c .cfa: x29 32 + +STACK CFI 4ce80 x19: .cfa -16 + ^ +STACK CFI 4cea4 x19: x19 +STACK CFI 4cea8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4ceac 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4ceb0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4ceb8 .cfa: x29 32 + +STACK CFI 4cebc x19: .cfa -16 + ^ +STACK CFI 4cee0 x19: x19 +STACK CFI 4cee4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cee8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4ceec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4cef4 .cfa: x29 32 + +STACK CFI 4cef8 x19: .cfa -16 + ^ +STACK CFI 4cf1c x19: x19 +STACK CFI 4cf20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cf24 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4cf28 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4cf30 .cfa: x29 32 + +STACK CFI 4cf34 x19: .cfa -16 + ^ +STACK CFI 4cf58 x19: x19 +STACK CFI 4cf5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cf60 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4cf64 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4cf6c .cfa: x29 32 + +STACK CFI 4cf70 x19: .cfa -16 + ^ +STACK CFI 4cf94 x19: x19 +STACK CFI 4cf98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24884 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cf9c 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24998 60 .cfa: sp 0 + .ra: x30 +STACK CFI 2499c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 249a0 .cfa: x29 48 + +STACK CFI 249a8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 249ec x19: x19 x20: x20 +STACK CFI 249f0 x21: x21 +STACK CFI 249f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 249f8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24c60 98 .cfa: sp 0 + .ra: x30 +STACK CFI 24c64 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24c68 .cfa: x29 64 + +STACK CFI 24c70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24cec x19: x19 x20: x20 +STACK CFI 24cf0 x21: x21 +STACK CFI 24cf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4cfc4 5c .cfa: sp 0 + .ra: x30 +STACK CFI 4cfc8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 4cfcc .cfa: x29 48 + +STACK CFI 4cfd4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 4d014 x19: x19 x20: x20 +STACK CFI 4d018 x21: x21 x22: x22 +STACK CFI 4d01c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d020 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4d024 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 4d028 .cfa: x29 16 + +STACK CFI 4d040 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d044 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 4d048 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 4d04c .cfa: x29 64 + +STACK CFI 4d058 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 4d064 x19: x19 x20: x20 +STACK CFI 4d068 x21: x21 x22: x22 +STACK CFI 4d06c x23: x23 x24: x24 +STACK CFI 4d070 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 4d074 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI 4d0f4 x19: x19 x20: x20 +STACK CFI 4d0f8 x21: x21 x22: x22 +STACK CFI 4d0fc x23: x23 x24: x24 +STACK CFI 4d100 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d104 5c .cfa: sp 0 + .ra: x30 +STACK CFI 4d108 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 4d10c .cfa: x29 48 + +STACK CFI 4d114 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 4d154 x19: x19 x20: x20 +STACK CFI 4d158 x21: x21 x22: x22 +STACK CFI 4d15c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d160 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4d164 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 4d168 .cfa: x29 16 + +STACK CFI 4d180 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d184 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 4d188 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 4d18c .cfa: x29 64 + +STACK CFI 4d198 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 4d1a4 x19: x19 x20: x20 +STACK CFI 4d1a8 x21: x21 x22: x22 +STACK CFI 4d1ac x23: x23 x24: x24 +STACK CFI 4d1b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 4d1b4 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI 4d238 x19: x19 x20: x20 +STACK CFI 4d23c x21: x21 x22: x22 +STACK CFI 4d240 x23: x23 x24: x24 +STACK CFI 4d244 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d248 2c .cfa: sp 0 + .ra: x30 +STACK CFI 4d24c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 4d254 .cfa: x29 16 + +STACK CFI 4d270 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d274 5c .cfa: sp 0 + .ra: x30 +STACK CFI 4d278 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 4d27c .cfa: x29 48 + +STACK CFI 4d284 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 4d2c4 x19: x19 x20: x20 +STACK CFI 4d2c8 x21: x21 x22: x22 +STACK CFI 4d2cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d2d0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4d2d4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 4d2d8 .cfa: x29 16 + +STACK CFI 4d2f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d2f4 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 4d2f8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 4d2fc .cfa: x29 64 + +STACK CFI 4d308 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 4d314 x19: x19 x20: x20 +STACK CFI 4d318 x21: x21 x22: x22 +STACK CFI 4d31c x23: x23 x24: x24 +STACK CFI 4d320 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 4d324 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI 4d3a8 x19: x19 x20: x20 +STACK CFI 4d3ac x21: x21 x22: x22 +STACK CFI 4d3b0 x23: x23 x24: x24 +STACK CFI 4d3b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d3b8 5c .cfa: sp 0 + .ra: x30 +STACK CFI 4d3bc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 4d3c0 .cfa: x29 48 + +STACK CFI 4d3c8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 4d408 x19: x19 x20: x20 +STACK CFI 4d40c x21: x21 x22: x22 +STACK CFI 4d410 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d414 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4d418 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 4d41c .cfa: x29 64 + +STACK CFI 4d428 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 4d4a0 x19: x19 x20: x20 +STACK CFI 4d4a4 x21: x21 x22: x22 +STACK CFI 4d4a8 x23: x23 x24: x24 +STACK CFI 4d4ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24db0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 24db4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24db8 .cfa: x29 48 + +STACK CFI 24dbc x19: .cfa -32 + ^ +STACK CFI 24e10 x19: x19 +STACK CFI 24e14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25768 13c .cfa: sp 0 + .ra: x30 +STACK CFI 2576c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 25770 .cfa: x29 64 + +STACK CFI 25778 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 25898 x19: x19 x20: x20 +STACK CFI 2589c x21: x21 x22: x22 +STACK CFI 258a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25964 104 .cfa: sp 0 + .ra: x30 +STACK CFI 25968 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 2596c .cfa: x29 80 + +STACK CFI 25978 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 25a58 x19: x19 x20: x20 +STACK CFI 25a5c x21: x21 x22: x22 +STACK CFI 25a60 x23: x23 x24: x24 +STACK CFI 25a64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b28 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI 14 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 1b8 x19: x19 x20: x20 +STACK CFI 1bc x21: x21 x22: x22 +STACK CFI 1c0 x23: x23 x24: x24 +STACK CFI 1c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 e8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 8 .cfa: x29 480 + +STACK CFI c x19: .cfa -464 + ^ x20: .cfa -456 + ^ +STACK CFI 18 x23: .cfa -432 + ^ x24: .cfa -424 + ^ x25: .cfa -416 + ^ +STACK CFI 34 x21: .cfa -448 + ^ x22: .cfa -440 + ^ +STACK CFI d0 x25: x25 +STACK CFI d8 x19: x19 x20: x20 +STACK CFI dc x21: x21 x22: x22 +STACK CFI e0 x23: x23 x24: x24 +STACK CFI e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4d4b0 600 .cfa: sp 0 + .ra: x30 +STACK CFI 4d4b4 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 4d4bc .cfa: x29 416 + +STACK CFI 4d4d0 x19: .cfa -400 + ^ x20: .cfa -392 + ^ x21: .cfa -384 + ^ x22: .cfa -376 + ^ x23: .cfa -368 + ^ x24: .cfa -360 + ^ x25: .cfa -352 + ^ x26: .cfa -344 + ^ x27: .cfa -336 + ^ x28: .cfa -328 + ^ +STACK CFI 4da98 x19: x19 x20: x20 +STACK CFI 4da9c x21: x21 x22: x22 +STACK CFI 4daa0 x23: x23 x24: x24 +STACK CFI 4daa4 x25: x25 x26: x26 +STACK CFI 4daa8 x27: x27 x28: x28 +STACK CFI 4daac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26188 54 .cfa: sp 0 + .ra: x30 +STACK CFI 2618c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26190 .cfa: x29 64 + +STACK CFI 26194 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 261d4 x19: x19 x20: x20 +STACK CFI 261d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 261dc 64 .cfa: sp 0 + .ra: x30 +STACK CFI 261e0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 261e4 .cfa: x29 64 + +STACK CFI 261e8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26238 x19: x19 x20: x20 +STACK CFI 2623c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26240 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26244 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26248 .cfa: x29 64 + +STACK CFI 2624c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2628c x19: x19 x20: x20 +STACK CFI 26290 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26294 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26298 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2629c .cfa: x29 64 + +STACK CFI 262a0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 262e0 x19: x19 x20: x20 +STACK CFI 262e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 3483c e8 .cfa: sp 0 + .ra: x30 +STACK CFI 34840 .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 34844 .cfa: x29 480 + +STACK CFI 34848 x19: .cfa -464 + ^ x20: .cfa -456 + ^ +STACK CFI 34854 x23: .cfa -432 + ^ x24: .cfa -424 + ^ x25: .cfa -416 + ^ +STACK CFI 34870 x21: .cfa -448 + ^ x22: .cfa -440 + ^ +STACK CFI 3490c x25: x25 +STACK CFI 34914 x19: x19 x20: x20 +STACK CFI 34918 x21: x21 x22: x22 +STACK CFI 3491c x23: x23 x24: x24 +STACK CFI 34920 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI 14 x19: .cfa -16 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4dab0 990 .cfa: sp 0 + .ra: x30 +STACK CFI 4dab4 .cfa: sp 704 + +STACK CFI 4dabc .cfa: sp 864 + .ra: .cfa -856 + ^ x29: .cfa -864 + ^ +STACK CFI 4dac0 .cfa: x29 864 + +STACK CFI 4dae0 v10: .cfa -752 + ^ v11: .cfa -744 + ^ v12: .cfa -736 + ^ v13: .cfa -728 + ^ v8: .cfa -768 + ^ v9: .cfa -760 + ^ x19: .cfa -848 + ^ x20: .cfa -840 + ^ x21: .cfa -832 + ^ x22: .cfa -824 + ^ x23: .cfa -816 + ^ x24: .cfa -808 + ^ x25: .cfa -800 + ^ x26: .cfa -792 + ^ x27: .cfa -784 + ^ x28: .cfa -776 + ^ +STACK CFI 4dae8 v14: .cfa -720 + ^ +STACK CFI 4e414 v8: v8 v9: v9 +STACK CFI 4e418 x19: x19 x20: x20 +STACK CFI 4e41c x21: x21 x22: x22 +STACK CFI 4e420 v10: v10 v11: v11 +STACK CFI 4e424 x23: x23 x24: x24 +STACK CFI 4e428 v12: v12 v13: v13 +STACK CFI 4e42c x25: x25 x26: x26 +STACK CFI 4e430 x27: x27 x28: x28 +STACK CFI 4e434 v14: v14 +STACK CFI 4e438 .cfa: sp 704 + .ra: .ra x29: x29 +STACK CFI 4e43c .cfa: sp 544 + +STACK CFI INIT 4e440 6a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4e444 .cfa: sp 288 + .ra: .cfa -280 + ^ x29: .cfa -288 + ^ +STACK CFI 4e44c .cfa: x29 288 + +STACK CFI 4e454 v8: .cfa -192 + ^ v9: .cfa -184 + ^ x21: .cfa -256 + ^ x22: .cfa -248 + ^ +STACK CFI 4e474 x19: .cfa -272 + ^ x20: .cfa -264 + ^ +STACK CFI 4e498 x23: .cfa -240 + ^ x24: .cfa -232 + ^ x25: .cfa -224 + ^ x26: .cfa -216 + ^ x27: .cfa -208 + ^ x28: .cfa -200 + ^ +STACK CFI 4eacc v8: v8 v9: v9 +STACK CFI 4ead0 x19: x19 x20: x20 +STACK CFI 4ead4 x21: x21 x22: x22 +STACK CFI 4ead8 x23: x23 x24: x24 +STACK CFI 4eadc x25: x25 x26: x26 +STACK CFI 4eae0 x27: x27 x28: x28 +STACK CFI 4eae4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4eae8 5a4 .cfa: sp 0 + .ra: x30 +STACK CFI 4eaec .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 4eaf4 .cfa: x29 304 + +STACK CFI 4eb0c v8: .cfa -208 + ^ v9: .cfa -200 + ^ x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ x25: .cfa -240 + ^ x26: .cfa -232 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ +STACK CFI 4eb14 v10: .cfa -192 + ^ +STACK CFI 4f06c v8: v8 v9: v9 +STACK CFI 4f070 x19: x19 x20: x20 +STACK CFI 4f074 x21: x21 x22: x22 +STACK CFI 4f078 x23: x23 x24: x24 +STACK CFI 4f07c x25: x25 x26: x26 +STACK CFI 4f080 x27: x27 x28: x28 +STACK CFI 4f084 v10: v10 +STACK CFI 4f088 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4f08c 218 .cfa: sp 0 + .ra: x30 +STACK CFI 4f090 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 4f09c .cfa: x29 160 + +STACK CFI 4f0a0 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 4f0b8 x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ +STACK CFI 4f294 x23: x23 +STACK CFI 4f298 x19: x19 x20: x20 +STACK CFI 4f29c x21: x21 x22: x22 +STACK CFI 4f2a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb58 88 .cfa: sp 0 + .ra: x30 +STACK CFI 2eb5c .cfa: sp 352 + .ra: .cfa -344 + ^ x29: .cfa -352 + ^ +STACK CFI 2eb64 .cfa: x29 352 + +STACK CFI 2eb68 x19: .cfa -336 + ^ x20: .cfa -328 + ^ +STACK CFI 2eb78 x21: .cfa -320 + ^ +STACK CFI 2ebd4 x21: x21 +STACK CFI 2ebd8 x19: x19 x20: x20 +STACK CFI 2ebdc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4f2a4 144 .cfa: sp 0 + .ra: x30 +STACK CFI 4f2a8 .cfa: sp 240 + .ra: .cfa -232 + ^ x29: .cfa -240 + ^ +STACK CFI 4f2ac .cfa: x29 240 + +STACK CFI 4f2b0 x21: .cfa -208 + ^ x22: .cfa -200 + ^ +STACK CFI 4f2d0 x19: .cfa -224 + ^ x20: .cfa -216 + ^ x23: .cfa -192 + ^ +STACK CFI 4f3d4 x23: x23 +STACK CFI 4f3dc x19: x19 x20: x20 +STACK CFI 4f3e0 x21: x21 x22: x22 +STACK CFI 4f3e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4f3e8 40 .cfa: sp 0 + .ra: x30 +STACK CFI 4f3ec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4f3f0 .cfa: x29 32 + +STACK CFI 4f3f8 x19: .cfa -16 + ^ +STACK CFI 4f420 x19: x19 +STACK CFI 4f424 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4f428 57c .cfa: sp 0 + .ra: x30 +STACK CFI 4f42c .cfa: sp 32768 + +STACK CFI 4f430 .cfa: sp 32864 + +STACK CFI 4f434 .cfa: sp 32944 + .ra: .cfa -32936 + ^ x29: .cfa -32944 + ^ +STACK CFI 4f438 .cfa: x29 32944 + +STACK CFI 4f448 x19: .cfa -32928 + ^ x20: .cfa -32920 + ^ x21: .cfa -32912 + ^ x22: .cfa -32904 + ^ x23: .cfa -32896 + ^ x24: .cfa -32888 + ^ x25: .cfa -32880 + ^ x26: .cfa -32872 + ^ +STACK CFI 4f988 x19: x19 x20: x20 +STACK CFI 4f98c x21: x21 x22: x22 +STACK CFI 4f990 x23: x23 x24: x24 +STACK CFI 4f994 x25: x25 x26: x26 +STACK CFI 4f998 .cfa: sp 32864 + .ra: .ra x29: x29 +STACK CFI 4f99c .cfa: sp 32768 + +STACK CFI 4f9a0 .cfa: sp 32688 + +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI c .cfa: x29 384 + +STACK CFI 10 x19: .cfa -368 + ^ x20: .cfa -360 + ^ +STACK CFI 20 x21: .cfa -352 + ^ x22: .cfa -344 + ^ +STACK CFI 28 x23: .cfa -336 + ^ x24: .cfa -328 + ^ +STACK CFI 124 x19: x19 x20: x20 +STACK CFI 128 x21: x21 x22: x22 +STACK CFI 12c x23: x23 x24: x24 +STACK CFI 130 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26c88 9c .cfa: sp 0 + .ra: x30 +STACK CFI 26c8c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 26c90 .cfa: x29 160 + +STACK CFI 26c98 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 26d18 x19: x19 x20: x20 +STACK CFI 26d1c x21: x21 x22: x22 +STACK CFI 26d20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4f9a4 60c .cfa: sp 0 + .ra: x30 +STACK CFI 4f9a8 .cfa: sp 880 + +STACK CFI 4f9b0 .cfa: sp 992 + .ra: .cfa -984 + ^ x29: .cfa -992 + ^ +STACK CFI 4f9b4 .cfa: x29 992 + +STACK CFI 4f9cc v8: .cfa -896 + ^ v9: .cfa -888 + ^ x19: .cfa -976 + ^ x20: .cfa -968 + ^ x21: .cfa -960 + ^ x22: .cfa -952 + ^ x23: .cfa -944 + ^ x24: .cfa -936 + ^ x25: .cfa -928 + ^ x26: .cfa -920 + ^ x27: .cfa -912 + ^ x28: .cfa -904 + ^ +STACK CFI 4ff90 v8: v8 v9: v9 +STACK CFI 4ff94 x19: x19 x20: x20 +STACK CFI 4ff98 x21: x21 x22: x22 +STACK CFI 4ff9c x23: x23 x24: x24 +STACK CFI 4ffa0 x25: x25 x26: x26 +STACK CFI 4ffa4 x27: x27 x28: x28 +STACK CFI 4ffa8 .cfa: sp 880 + .ra: .ra x29: x29 +STACK CFI 4ffac .cfa: sp 768 + +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28540 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 28544 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28548 .cfa: x29 80 + +STACK CFI 28550 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 285e0 x21: x21 +STACK CFI 285e8 x19: x19 x20: x20 +STACK CFI 285ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 285f0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 285f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 285f8 .cfa: x29 32 + +STACK CFI 285fc x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 28648 x19: x19 x20: x20 +STACK CFI 2864c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28714 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 28718 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2871c .cfa: x29 48 + +STACK CFI 28724 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 287c0 x21: x21 +STACK CFI 287c4 x19: x19 x20: x20 +STACK CFI 287c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2633c 104 .cfa: sp 0 + .ra: x30 +STACK CFI 26340 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26348 .cfa: x29 80 + +STACK CFI 26350 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ +STACK CFI 26358 x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 26430 x23: x23 +STACK CFI 26434 x19: x19 x20: x20 +STACK CFI 26438 x21: x21 x22: x22 +STACK CFI 2643c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 228f0 268 .cfa: sp 0 + .ra: x30 +STACK CFI 228f4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 228f8 .cfa: x29 64 + +STACK CFI 22900 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 22b44 x21: x21 +STACK CFI 22b4c x19: x19 x20: x20 +STACK CFI 22b50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 4ffb0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 4ffb4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4ffb8 .cfa: x29 32 + +STACK CFI 4ffbc x19: .cfa -16 + ^ +STACK CFI 4ffe0 x19: x19 +STACK CFI 4ffe4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4ffe8 40 .cfa: sp 0 + .ra: x30 +STACK CFI 4ffec .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 4fff0 .cfa: x29 48 + +STACK CFI 4fff4 x19: .cfa -32 + ^ +STACK CFI 50020 x19: x19 +STACK CFI 50024 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50028 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50040 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50054 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50068 58 .cfa: sp 0 + .ra: x30 +STACK CFI 5006c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 50070 .cfa: x29 32 + +STACK CFI 50074 x19: .cfa -16 + ^ +STACK CFI 500ac x19: x19 +STACK CFI 500b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 500b4 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 500b8 x19: x19 +STACK CFI 500bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 500c0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 500c4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 500c8 .cfa: x29 32 + +STACK CFI 500cc x19: .cfa -16 + ^ +STACK CFI 500f8 x19: x19 +STACK CFI 500fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 50100 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 50104 x19: x19 +STACK CFI 50108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5010c b0 .cfa: sp 0 + .ra: x30 +STACK CFI 50110 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 50114 .cfa: x29 64 + +STACK CFI 5011c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 501b0 x19: x19 x20: x20 +STACK CFI 501b4 x21: x21 x22: x22 +STACK CFI 501b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 501bc 4c .cfa: sp 0 + .ra: x30 +STACK CFI 501c0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 501c4 .cfa: x29 48 + +STACK CFI 501c8 x19: .cfa -32 + ^ +STACK CFI 50200 x19: x19 +STACK CFI 50204 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50208 20 .cfa: sp 0 + .ra: x30 +STACK CFI 5020c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 50210 .cfa: x29 32 + +STACK CFI 50224 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50228 70 .cfa: sp 0 + .ra: x30 +STACK CFI 5022c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 50230 .cfa: x29 64 + +STACK CFI 50234 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 50290 x19: x19 x20: x20 +STACK CFI 50294 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50298 1c .cfa: sp 0 + .ra: x30 +STACK CFI 5029c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 502a0 .cfa: x29 32 + +STACK CFI 502b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 502b4 cc .cfa: sp 0 + .ra: x30 +STACK CFI 502b8 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 502bc .cfa: x29 80 + +STACK CFI 502c4 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 50374 x19: x19 x20: x20 +STACK CFI 50378 x21: x21 +STACK CFI 5037c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50380 30 .cfa: sp 0 + .ra: x30 +STACK CFI 50384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 50390 .cfa: x29 32 + +STACK CFI 50394 x19: .cfa -16 + ^ +STACK CFI 503a8 x19: x19 +STACK CFI 503ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 503b0 30 .cfa: sp 0 + .ra: x30 +STACK CFI 503b4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 503bc .cfa: x29 32 + +STACK CFI 503c0 x19: .cfa -16 + ^ +STACK CFI 503d8 x19: x19 +STACK CFI 503dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 503e0 40 .cfa: sp 0 + .ra: x30 +STACK CFI 503e4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 503e8 .cfa: x29 48 + +STACK CFI 503ec x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 50418 x19: x19 x20: x20 +STACK CFI 5041c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50420 48 .cfa: sp 0 + .ra: x30 +STACK CFI 50424 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 50428 .cfa: x29 48 + +STACK CFI 50430 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 50458 x21: x21 +STACK CFI 50460 x19: x19 x20: x20 +STACK CFI 50464 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI c4 x21: x21 +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50468 48 .cfa: sp 0 + .ra: x30 +STACK CFI 5046c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 50470 .cfa: x29 32 + +STACK CFI 50474 x19: .cfa -16 + ^ +STACK CFI 504a8 x19: x19 +STACK CFI 504ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 504b0 58 .cfa: sp 0 + .ra: x30 +STACK CFI 504b4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 504b8 .cfa: x29 48 + +STACK CFI 504c0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 504f8 x21: x21 +STACK CFI 50500 x19: x19 x20: x20 +STACK CFI 50504 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50508 54 .cfa: sp 0 + .ra: x30 +STACK CFI 5050c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 50510 .cfa: x29 48 + +STACK CFI 50518 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 5054c x21: x21 +STACK CFI 50554 x19: x19 x20: x20 +STACK CFI 50558 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5055c 7c .cfa: sp 0 + .ra: x30 +STACK CFI 50560 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 50568 .cfa: x29 48 + +STACK CFI 50570 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 505cc x19: x19 x20: x20 +STACK CFI 505d0 x21: x21 x22: x22 +STACK CFI 505d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 505d8 34 .cfa: sp 0 + .ra: x30 +STACK CFI 505dc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 505e0 .cfa: x29 32 + +STACK CFI 505e4 x19: .cfa -16 + ^ +STACK CFI 50604 x19: x19 +STACK CFI 50608 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5060c 34 .cfa: sp 0 + .ra: x30 +STACK CFI 50610 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5061c .cfa: x29 32 + +STACK CFI 50620 x19: .cfa -16 + ^ +STACK CFI 50638 x19: x19 +STACK CFI 5063c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50640 34 .cfa: sp 0 + .ra: x30 +STACK CFI 50644 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 50650 .cfa: x29 32 + +STACK CFI 50654 x19: .cfa -16 + ^ +STACK CFI 5066c x19: x19 +STACK CFI 50670 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50674 34 .cfa: sp 0 + .ra: x30 +STACK CFI 50678 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 50684 .cfa: x29 32 + +STACK CFI 50688 x19: .cfa -16 + ^ +STACK CFI 506a0 x19: x19 +STACK CFI 506a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 506a8 34 .cfa: sp 0 + .ra: x30 +STACK CFI 506ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 506b8 .cfa: x29 32 + +STACK CFI 506bc x19: .cfa -16 + ^ +STACK CFI 506d4 x19: x19 +STACK CFI 506d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 506dc 34 .cfa: sp 0 + .ra: x30 +STACK CFI 506e0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 506ec .cfa: x29 32 + +STACK CFI 506f0 x19: .cfa -16 + ^ +STACK CFI 50708 x19: x19 +STACK CFI 5070c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50710 34 .cfa: sp 0 + .ra: x30 +STACK CFI 50714 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 50720 .cfa: x29 32 + +STACK CFI 50724 x19: .cfa -16 + ^ +STACK CFI 5073c x19: x19 +STACK CFI 50740 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50744 34 .cfa: sp 0 + .ra: x30 +STACK CFI 50748 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 50754 .cfa: x29 32 + +STACK CFI 50758 x19: .cfa -16 + ^ +STACK CFI 50770 x19: x19 +STACK CFI 50774 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50778 34 .cfa: sp 0 + .ra: x30 +STACK CFI 5077c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 50788 .cfa: x29 32 + +STACK CFI 5078c x19: .cfa -16 + ^ +STACK CFI 507a4 x19: x19 +STACK CFI 507a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 507ac 34 .cfa: sp 0 + .ra: x30 +STACK CFI 507b0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 507bc .cfa: x29 32 + +STACK CFI 507c0 x19: .cfa -16 + ^ +STACK CFI 507d8 x19: x19 +STACK CFI 507dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 507e0 50 .cfa: sp 0 + .ra: x30 +STACK CFI 507e4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 507e8 .cfa: x29 48 + +STACK CFI 507f0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 50824 x19: x19 x20: x20 +STACK CFI 50828 x21: x21 x22: x22 +STACK CFI 5082c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50830 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50854 108 .cfa: sp 0 + .ra: x30 +STACK CFI 50858 .cfa: sp 32 + +STACK CFI 50958 .cfa: sp 0 + +STACK CFI INIT 5095c 140 .cfa: sp 0 + .ra: x30 +STACK CFI 50960 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 50968 .cfa: x29 112 + +STACK CFI 50978 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ +STACK CFI 50a88 x19: x19 x20: x20 +STACK CFI 50a8c x21: x21 x22: x22 +STACK CFI 50a90 x23: x23 x24: x24 +STACK CFI 50a94 x25: x25 x26: x26 +STACK CFI 50a98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50a9c 274 .cfa: sp 0 + .ra: x30 +STACK CFI 50aa0 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 50aa4 .cfa: x29 128 + +STACK CFI 50aa8 x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 50ab8 v8: .cfa -32 + ^ +STACK CFI 50acc x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 50ae8 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 50cf4 x23: x23 x24: x24 +STACK CFI 50cf8 x19: x19 x20: x20 +STACK CFI 50cfc x21: x21 x22: x22 +STACK CFI 50d00 x25: x25 x26: x26 +STACK CFI 50d04 x27: x27 x28: x28 +STACK CFI 50d08 v8: v8 +STACK CFI 50d0c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50d10 78 .cfa: sp 0 + .ra: x30 +STACK CFI 50d14 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 50d1c .cfa: x29 48 + +STACK CFI 50d20 x19: .cfa -32 + ^ +STACK CFI 50d80 x19: x19 +STACK CFI 50d84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50d88 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 50d8c .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 50d90 .cfa: x29 128 + +STACK CFI 50d98 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 50dac x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 50e38 x19: x19 x20: x20 +STACK CFI 50e3c x21: x21 x22: x22 +STACK CFI 50e40 x23: x23 x24: x24 +STACK CFI 50e44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 50e48 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50e58 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50e68 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50e78 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50e88 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50e98 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50ea8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50eb8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50ec8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50ed8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50ee8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50ef8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 50f08 1e4 .cfa: sp 0 + .ra: x30 +STACK CFI 50f0c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 50f10 .cfa: x29 112 + +STACK CFI 50f14 x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 50f24 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ +STACK CFI 510d8 x19: x19 x20: x20 +STACK CFI 510dc x21: x21 x22: x22 +STACK CFI 510e0 x23: x23 x24: x24 +STACK CFI 510e4 x25: x25 x26: x26 +STACK CFI 510e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 510ec 1e4 .cfa: sp 0 + .ra: x30 +STACK CFI 510f0 .cfa: sp 1024 + +STACK CFI 510f4 .cfa: sp 1088 + .ra: .cfa -1080 + ^ x29: .cfa -1088 + ^ +STACK CFI 510f8 .cfa: x29 1088 + +STACK CFI 51104 x19: .cfa -1072 + ^ x20: .cfa -1064 + ^ x21: .cfa -1056 + ^ x22: .cfa -1048 + ^ x23: .cfa -1040 + ^ +STACK CFI 512bc x23: x23 +STACK CFI 512c0 x19: x19 x20: x20 +STACK CFI 512c4 x21: x21 x22: x22 +STACK CFI 512c8 .cfa: sp 1024 + .ra: .ra x29: x29 +STACK CFI 512cc .cfa: sp 960 + +STACK CFI INIT 512d0 104 .cfa: sp 0 + .ra: x30 +STACK CFI 512d4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 512d8 .cfa: x29 48 + +STACK CFI 512e0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 513c8 x19: x19 x20: x20 +STACK CFI 513cc x21: x21 x22: x22 +STACK CFI 513d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 513d4 104 .cfa: sp 0 + .ra: x30 +STACK CFI 513d8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 513dc .cfa: x29 64 + +STACK CFI 513e8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 514c8 x19: x19 x20: x20 +STACK CFI 514cc x21: x21 x22: x22 +STACK CFI 514d0 x23: x23 x24: x24 +STACK CFI 514d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 514d8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 514dc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 514e0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 514e4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 514e8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 514ec 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 514f0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 514f4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 514f8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 514fc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51500 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51504 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51508 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5150c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51510 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51514 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51518 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5151c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51524 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51528 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5152c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51530 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51544 24 .cfa: sp 0 + .ra: x30 +STACK CFI 51548 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5154c .cfa: x29 32 + +STACK CFI 51550 x19: .cfa -16 + ^ +STACK CFI 51560 x19: x19 +STACK CFI 51564 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51568 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5157c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 51580 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 51584 .cfa: x29 32 + +STACK CFI 51588 x19: .cfa -16 + ^ +STACK CFI 51598 x19: x19 +STACK CFI 5159c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 515a0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 515b4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 515b8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 515bc .cfa: x29 32 + +STACK CFI 515c0 x19: .cfa -16 + ^ +STACK CFI 515d0 x19: x19 +STACK CFI 515d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 515d8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 515ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI 515f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 515f4 .cfa: x29 32 + +STACK CFI 515f8 x19: .cfa -16 + ^ +STACK CFI 51608 x19: x19 +STACK CFI 5160c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51610 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51624 24 .cfa: sp 0 + .ra: x30 +STACK CFI 51628 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5162c .cfa: x29 32 + +STACK CFI 51630 x19: .cfa -16 + ^ +STACK CFI 51640 x19: x19 +STACK CFI 51644 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51648 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5165c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 51660 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 51664 .cfa: x29 32 + +STACK CFI 51668 x19: .cfa -16 + ^ +STACK CFI 51678 x19: x19 +STACK CFI 5167c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51680 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51694 24 .cfa: sp 0 + .ra: x30 +STACK CFI 51698 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5169c .cfa: x29 32 + +STACK CFI 516a0 x19: .cfa -16 + ^ +STACK CFI 516b0 x19: x19 +STACK CFI 516b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 516b8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 516cc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 516d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 516d4 .cfa: x29 32 + +STACK CFI 516d8 x19: .cfa -16 + ^ +STACK CFI 516e8 x19: x19 +STACK CFI 516ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 516f0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51704 24 .cfa: sp 0 + .ra: x30 +STACK CFI 51708 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5170c .cfa: x29 32 + +STACK CFI 51710 x19: .cfa -16 + ^ +STACK CFI 51720 x19: x19 +STACK CFI 51724 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51728 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5173c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 51740 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 51744 .cfa: x29 32 + +STACK CFI 51748 x19: .cfa -16 + ^ +STACK CFI 51758 x19: x19 +STACK CFI 5175c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51760 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51774 24 .cfa: sp 0 + .ra: x30 +STACK CFI 51778 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5177c .cfa: x29 32 + +STACK CFI 51780 x19: .cfa -16 + ^ +STACK CFI 51790 x19: x19 +STACK CFI 51794 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51798 3c .cfa: sp 0 + .ra: x30 +STACK CFI 5179c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 517a4 .cfa: x29 32 + +STACK CFI 517a8 x19: .cfa -16 + ^ +STACK CFI 517cc x19: x19 +STACK CFI 517d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 517d4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 517d8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 517e0 .cfa: x29 32 + +STACK CFI 517e4 x19: .cfa -16 + ^ +STACK CFI 51808 x19: x19 +STACK CFI 5180c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51810 3c .cfa: sp 0 + .ra: x30 +STACK CFI 51814 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5181c .cfa: x29 32 + +STACK CFI 51820 x19: .cfa -16 + ^ +STACK CFI 51844 x19: x19 +STACK CFI 51848 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5184c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 51850 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 51858 .cfa: x29 32 + +STACK CFI 5185c x19: .cfa -16 + ^ +STACK CFI 51880 x19: x19 +STACK CFI 51884 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51888 3c .cfa: sp 0 + .ra: x30 +STACK CFI 5188c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 51894 .cfa: x29 32 + +STACK CFI 51898 x19: .cfa -16 + ^ +STACK CFI 518bc x19: x19 +STACK CFI 518c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 518c4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 518c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 518d0 .cfa: x29 32 + +STACK CFI 518d4 x19: .cfa -16 + ^ +STACK CFI 518f8 x19: x19 +STACK CFI 518fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51900 3c .cfa: sp 0 + .ra: x30 +STACK CFI 51904 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5190c .cfa: x29 32 + +STACK CFI 51910 x19: .cfa -16 + ^ +STACK CFI 51934 x19: x19 +STACK CFI 51938 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5193c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 51940 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 51948 .cfa: x29 32 + +STACK CFI 5194c x19: .cfa -16 + ^ +STACK CFI 51970 x19: x19 +STACK CFI 51974 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51978 3c .cfa: sp 0 + .ra: x30 +STACK CFI 5197c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 51984 .cfa: x29 32 + +STACK CFI 51988 x19: .cfa -16 + ^ +STACK CFI 519ac x19: x19 +STACK CFI 519b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 519b4 3c .cfa: sp 0 + .ra: x30 +STACK CFI 519b8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 519c0 .cfa: x29 32 + +STACK CFI 519c4 x19: .cfa -16 + ^ +STACK CFI 519e8 x19: x19 +STACK CFI 519ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 519f0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 519f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 519fc .cfa: x29 32 + +STACK CFI 51a00 x19: .cfa -16 + ^ +STACK CFI 51a24 x19: x19 +STACK CFI 51a28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24884 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51a2c 3c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 51a68 3c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 48 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24c60 98 .cfa: sp 0 + .ra: x30 +STACK CFI 24c64 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 24c68 .cfa: x29 64 + +STACK CFI 24c70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24cec x19: x19 x20: x20 +STACK CFI 24cf0 x21: x21 +STACK CFI 24cf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 250a4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 250a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 250ac .cfa: x29 48 + +STACK CFI 250b0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 250b8 x21: .cfa -16 + ^ +STACK CFI 250f0 x19: x19 x20: x20 +STACK CFI 250f4 x21: x21 +STACK CFI 250f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51aa4 90 .cfa: sp 0 + .ra: x30 +STACK CFI 51aa8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 51aac .cfa: x29 48 + +STACK CFI 51ab0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 51abc x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 51b28 x19: x19 x20: x20 +STACK CFI 51b2c x21: x21 x22: x22 +STACK CFI 51b30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 256a0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 256a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 256ac .cfa: x29 32 + +STACK CFI 256b0 x19: .cfa -16 + ^ +STACK CFI 25710 x19: x19 +STACK CFI 25714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25768 13c .cfa: sp 0 + .ra: x30 +STACK CFI 2576c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 25770 .cfa: x29 64 + +STACK CFI 25778 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 25898 x19: x19 x20: x20 +STACK CFI 2589c x21: x21 x22: x22 +STACK CFI 258a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51b34 cc .cfa: sp 0 + .ra: x30 +STACK CFI 51b38 .cfa: sp 400 + .ra: .cfa -392 + ^ x29: .cfa -400 + ^ +STACK CFI 51b40 .cfa: x29 400 + +STACK CFI 51b44 x19: .cfa -384 + ^ x20: .cfa -376 + ^ +STACK CFI 51b58 x21: .cfa -368 + ^ x22: .cfa -360 + ^ x23: .cfa -352 + ^ x24: .cfa -344 + ^ +STACK CFI 51bf0 x19: x19 x20: x20 +STACK CFI 51bf4 x21: x21 x22: x22 +STACK CFI 51bf8 x23: x23 x24: x24 +STACK CFI 51bfc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51c00 50 .cfa: sp 0 + .ra: x30 +STACK CFI 51c04 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 51c10 .cfa: x29 32 + +STACK CFI 51c14 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 51c1c x19: x19 x20: x20 +STACK CFI 51c24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 51c2c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 51c48 x19: x19 x20: x20 +STACK CFI 51c4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51c50 50 .cfa: sp 0 + .ra: x30 +STACK CFI 51c54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 51c60 .cfa: x29 32 + +STACK CFI 51c64 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 51c6c x19: x19 x20: x20 +STACK CFI 51c74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 51c7c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 51c98 x19: x19 x20: x20 +STACK CFI 51c9c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51ca0 11c .cfa: sp 0 + .ra: x30 +STACK CFI 51ca4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 51ca8 .cfa: x29 128 + +STACK CFI 51cac x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 51cb8 x19: .cfa -112 + ^ x20: .cfa -104 + ^ +STACK CFI 51cc4 x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 51dac x19: x19 x20: x20 +STACK CFI 51db0 x21: x21 x22: x22 +STACK CFI 51db4 x23: x23 x24: x24 +STACK CFI 51db8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51dbc e8 .cfa: sp 0 + .ra: x30 +STACK CFI 51dc0 .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 51dc4 .cfa: x29 480 + +STACK CFI 51dc8 x19: .cfa -464 + ^ x20: .cfa -456 + ^ +STACK CFI 51dd4 x23: .cfa -432 + ^ x24: .cfa -424 + ^ x25: .cfa -416 + ^ +STACK CFI 51df0 x21: .cfa -448 + ^ x22: .cfa -440 + ^ +STACK CFI 51e8c x25: x25 +STACK CFI 51e94 x19: x19 x20: x20 +STACK CFI 51e98 x21: x21 x22: x22 +STACK CFI 51e9c x23: x23 x24: x24 +STACK CFI 51ea0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51ea4 50 .cfa: sp 0 + .ra: x30 +STACK CFI 51ea8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 51eac .cfa: x29 32 + +STACK CFI 51eb0 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 51eec x19: x19 x20: x20 +STACK CFI 51ef0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51ef4 5c .cfa: sp 0 + .ra: x30 +STACK CFI 51ef8 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 51f00 .cfa: x29 336 + +STACK CFI 51f04 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 51f0c x21: .cfa -304 + ^ +STACK CFI 51f40 x21: x21 +STACK CFI 51f48 x19: x19 x20: x20 +STACK CFI 51f4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51f50 9c .cfa: sp 0 + .ra: x30 +STACK CFI 51f54 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 51f58 .cfa: x29 160 + +STACK CFI 51f60 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 51fe0 x19: x19 x20: x20 +STACK CFI 51fe4 x21: x21 x22: x22 +STACK CFI 51fe8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28074 5c .cfa: sp 0 + .ra: x30 +STACK CFI 28078 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 28080 .cfa: x29 336 + +STACK CFI 28084 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 2808c x21: .cfa -304 + ^ +STACK CFI 280c0 x21: x21 +STACK CFI 280c8 x19: x19 x20: x20 +STACK CFI 280cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 8 .cfa: x29 416 + +STACK CFI c x19: .cfa -400 + ^ x20: .cfa -392 + ^ +STACK CFI 18 x21: .cfa -384 + ^ x22: .cfa -376 + ^ x23: .cfa -368 + ^ +STACK CFI a0 x23: x23 +STACK CFI a8 x19: x19 x20: x20 +STACK CFI ac x21: x21 x22: x22 +STACK CFI b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI 14 x19: .cfa -16 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51fec 12c .cfa: sp 0 + .ra: x30 +STACK CFI 51ff0 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 51ffc .cfa: x29 96 + +STACK CFI 52004 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ +STACK CFI 5210c x21: x21 +STACK CFI 52110 x19: x19 x20: x20 +STACK CFI 52114 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 52118 148 .cfa: sp 0 + .ra: x30 +STACK CFI 5211c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 52128 .cfa: x29 112 + +STACK CFI 52134 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 52254 x19: x19 x20: x20 +STACK CFI 52258 x21: x21 x22: x22 +STACK CFI 5225c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28208 9c .cfa: sp 0 + .ra: x30 +STACK CFI 2820c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 28210 .cfa: x29 160 + +STACK CFI 28218 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 28298 x19: x19 x20: x20 +STACK CFI 2829c x21: x21 x22: x22 +STACK CFI 282a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 52260 13c .cfa: sp 0 + .ra: x30 +STACK CFI 52264 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 52270 .cfa: x29 80 + +STACK CFI 52280 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 522a4 x21: .cfa -48 + ^ +STACK CFI 52390 x21: x21 +STACK CFI 52394 x19: x19 x20: x20 +STACK CFI 52398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5239c 338 .cfa: sp 0 + .ra: x30 +STACK CFI 523a0 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 523a4 .cfa: x29 128 + +STACK CFI 523b0 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 523d8 x25: .cfa -64 + ^ +STACK CFI 526c0 x25: x25 +STACK CFI 526c4 x19: x19 x20: x20 +STACK CFI 526c8 x21: x21 x22: x22 +STACK CFI 526cc x23: x23 x24: x24 +STACK CFI 526d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 526d4 240 .cfa: sp 0 + .ra: x30 +STACK CFI 526d8 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 526e4 .cfa: x29 112 + +STACK CFI 526f8 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 5271c x23: .cfa -64 + ^ +STACK CFI 52904 x23: x23 +STACK CFI 52908 x19: x19 x20: x20 +STACK CFI 5290c x21: x21 x22: x22 +STACK CFI 52910 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI c .cfa: x29 336 + +STACK CFI 10 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 18 x21: .cfa -304 + ^ +STACK CFI 4c x21: x21 +STACK CFI 54 x19: x19 x20: x20 +STACK CFI 58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 52914 9c .cfa: sp 0 + .ra: x30 +STACK CFI 52918 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5291c .cfa: x29 160 + +STACK CFI 52924 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 529a4 x19: x19 x20: x20 +STACK CFI 529a8 x21: x21 x22: x22 +STACK CFI 529ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 529b0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 529b4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 529b8 .cfa: x29 160 + +STACK CFI 529bc x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 529c8 x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 52a28 x19: x19 x20: x20 +STACK CFI 52a2c x21: x21 x22: x22 +STACK CFI 52a30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 52a34 5ac .cfa: sp 0 + .ra: x30 +STACK CFI 52a38 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI 52a40 .cfa: x29 272 + +STACK CFI 52a4c v10: .cfa -160 + ^ v11: .cfa -152 + ^ x25: .cfa -208 + ^ x26: .cfa -200 + ^ +STACK CFI 52a6c v8: .cfa -176 + ^ v9: .cfa -168 + ^ x19: .cfa -256 + ^ x20: .cfa -248 + ^ +STACK CFI 52a80 x21: .cfa -240 + ^ x22: .cfa -232 + ^ +STACK CFI 52a8c x23: .cfa -224 + ^ x24: .cfa -216 + ^ x27: .cfa -192 + ^ x28: .cfa -184 + ^ +STACK CFI 52fc0 x19: x19 x20: x20 +STACK CFI 52fc4 v8: v8 v9: v9 +STACK CFI 52fc8 x21: x21 x22: x22 +STACK CFI 52fcc v10: v10 v11: v11 +STACK CFI 52fd0 x23: x23 x24: x24 +STACK CFI 52fd4 x25: x25 x26: x26 +STACK CFI 52fd8 x27: x27 x28: x28 +STACK CFI 52fdc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 52fe0 204 .cfa: sp 0 + .ra: x30 +STACK CFI 52fe4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 52fec .cfa: x29 176 + +STACK CFI 52ffc v8: .cfa -80 + ^ v9: .cfa -72 + ^ x25: .cfa -112 + ^ x26: .cfa -104 + ^ +STACK CFI 53010 x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 5302c x23: .cfa -128 + ^ x24: .cfa -120 + ^ +STACK CFI 53038 x21: .cfa -144 + ^ x22: .cfa -136 + ^ x27: .cfa -96 + ^ x28: .cfa -88 + ^ +STACK CFI 531c8 x19: x19 x20: x20 +STACK CFI 531cc v8: v8 v9: v9 +STACK CFI 531d0 x21: x21 x22: x22 +STACK CFI 531d4 x23: x23 x24: x24 +STACK CFI 531d8 x25: x25 x26: x26 +STACK CFI 531dc x27: x27 x28: x28 +STACK CFI 531e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 531e4 5ac .cfa: sp 0 + .ra: x30 +STACK CFI 531e8 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI 531f0 .cfa: x29 272 + +STACK CFI 531fc v10: .cfa -160 + ^ v11: .cfa -152 + ^ x25: .cfa -208 + ^ x26: .cfa -200 + ^ +STACK CFI 5321c v8: .cfa -176 + ^ v9: .cfa -168 + ^ x19: .cfa -256 + ^ x20: .cfa -248 + ^ +STACK CFI 53230 x21: .cfa -240 + ^ x22: .cfa -232 + ^ +STACK CFI 5323c x23: .cfa -224 + ^ x24: .cfa -216 + ^ x27: .cfa -192 + ^ x28: .cfa -184 + ^ +STACK CFI 53770 x19: x19 x20: x20 +STACK CFI 53774 v8: v8 v9: v9 +STACK CFI 53778 x21: x21 x22: x22 +STACK CFI 5377c v10: v10 v11: v11 +STACK CFI 53780 x23: x23 x24: x24 +STACK CFI 53784 x25: x25 x26: x26 +STACK CFI 53788 x27: x27 x28: x28 +STACK CFI 5378c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 53790 90 .cfa: sp 0 + .ra: x30 +STACK CFI 53794 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 53798 .cfa: x29 176 + +STACK CFI 5379c x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 537a8 x21: .cfa -144 + ^ +STACK CFI 53814 x21: x21 +STACK CFI 53818 x19: x19 x20: x20 +STACK CFI 5381c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 53820 190 .cfa: sp 0 + .ra: x30 +STACK CFI 53824 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 53830 .cfa: x29 128 + +STACK CFI 5383c x23: .cfa -80 + ^ +STACK CFI 53858 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 539a0 x23: x23 +STACK CFI 539a4 x19: x19 x20: x20 +STACK CFI 539a8 x21: x21 x22: x22 +STACK CFI 539ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 539b0 190 .cfa: sp 0 + .ra: x30 +STACK CFI 539b4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 539c0 .cfa: x29 128 + +STACK CFI 539cc x23: .cfa -80 + ^ +STACK CFI 539e8 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 53b30 x23: x23 +STACK CFI 53b34 x19: x19 x20: x20 +STACK CFI 53b38 x21: x21 x22: x22 +STACK CFI 53b3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 27d70 5c .cfa: sp 0 + .ra: x30 +STACK CFI 27d74 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 27d7c .cfa: x29 336 + +STACK CFI 27d80 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 27d88 x21: .cfa -304 + ^ +STACK CFI 27dbc x21: x21 +STACK CFI 27dc4 x19: x19 x20: x20 +STACK CFI 27dc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 53b40 bc .cfa: sp 0 + .ra: x30 +STACK CFI 53b44 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 53b48 .cfa: x29 208 + +STACK CFI 53b50 x23: .cfa -160 + ^ x24: .cfa -152 + ^ x25: .cfa -144 + ^ +STACK CFI 53b6c x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ +STACK CFI 53be8 x25: x25 +STACK CFI 53bec x19: x19 x20: x20 +STACK CFI 53bf0 x21: x21 x22: x22 +STACK CFI 53bf4 x23: x23 x24: x24 +STACK CFI 53bf8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 53bfc 3d0 .cfa: sp 0 + .ra: x30 +STACK CFI 53c00 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 53c0c .cfa: x29 384 + +STACK CFI 53c20 x19: .cfa -368 + ^ x20: .cfa -360 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ x23: .cfa -336 + ^ x24: .cfa -328 + ^ x25: .cfa -320 + ^ +STACK CFI 53fb8 x25: x25 +STACK CFI 53fbc x19: x19 x20: x20 +STACK CFI 53fc0 x21: x21 x22: x22 +STACK CFI 53fc4 x23: x23 x24: x24 +STACK CFI 53fc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI c4 x21: x21 +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 104 x23: x23 +STACK CFI 108 x19: x19 x20: x20 +STACK CFI 10c x21: x21 x22: x22 +STACK CFI 110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 22b58 3e8 .cfa: sp 0 + .ra: x30 +STACK CFI 22b60 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 22b64 .cfa: x29 64 + +STACK CFI 22b78 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 22f2c x21: x21 +STACK CFI 22f34 x19: x19 x20: x20 +STACK CFI 22f38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2351c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23520 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2354c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23554 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 53fcc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 53fd0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 235ec 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23610 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 2367c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23680 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23688 40 .cfa: sp 0 + .ra: x30 +STACK CFI 2368c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23690 .cfa: x29 32 + +STACK CFI 23694 x19: .cfa -16 + ^ +STACK CFI 236c0 x19: x19 +STACK CFI 236c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 236c8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 53fd4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 53fd8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 237ec a8 .cfa: sp 0 + .ra: x30 +STACK CFI 237f0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 237f4 .cfa: x29 64 + +STACK CFI 23800 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 23884 x23: x23 +STACK CFI 23888 x19: x19 x20: x20 +STACK CFI 2388c x21: x21 x22: x22 +STACK CFI 23890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23738 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 2373c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23740 .cfa: x29 64 + +STACK CFI 2374c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 237dc x23: x23 +STACK CFI 237e0 x19: x19 x20: x20 +STACK CFI 237e4 x21: x21 x22: x22 +STACK CFI 237e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238b0 .cfa: x29 32 + +STACK CFI 238b4 x19: .cfa -16 + ^ +STACK CFI 238c4 x19: x19 +STACK CFI 238c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 238cc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 53fdc 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 53ff0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 53ff4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 53ff8 .cfa: x29 32 + +STACK CFI 53ffc x19: .cfa -16 + ^ +STACK CFI 5400c x19: x19 +STACK CFI 54010 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54014 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 54028 24 .cfa: sp 0 + .ra: x30 +STACK CFI 5402c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 54030 .cfa: x29 32 + +STACK CFI 54034 x19: .cfa -16 + ^ +STACK CFI 54044 x19: x19 +STACK CFI 54048 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5404c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 54050 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 54058 .cfa: x29 32 + +STACK CFI 5405c x19: .cfa -16 + ^ +STACK CFI 54080 x19: x19 +STACK CFI 54084 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54088 3c .cfa: sp 0 + .ra: x30 +STACK CFI 5408c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 54094 .cfa: x29 32 + +STACK CFI 54098 x19: .cfa -16 + ^ +STACK CFI 540bc x19: x19 +STACK CFI 540c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24794 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24798 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2479c .cfa: x29 64 + +STACK CFI 247a8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 24834 x23: x23 +STACK CFI 24838 x19: x19 x20: x20 +STACK CFI 2483c x21: x21 x22: x22 +STACK CFI 24840 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24940 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24948 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2494c .cfa: x29 32 + +STACK CFI 24954 x19: .cfa -16 + ^ +STACK CFI 2496c x19: x19 +STACK CFI 24970 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24974 24 .cfa: sp 0 + .ra: x30 +STACK CFI 24978 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2497c .cfa: x29 32 + +STACK CFI 24980 x19: .cfa -16 + ^ +STACK CFI 24990 x19: x19 +STACK CFI 24994 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 48 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24a00 fc .cfa: sp 0 + .ra: x30 +STACK CFI 24a04 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 24a0c .cfa: x29 96 + +STACK CFI 24a18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 24aec x21: x21 x22: x22 +STACK CFI 24af0 x19: x19 x20: x20 +STACK CFI 24af4 x23: x23 x24: x24 +STACK CFI 24af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24afc b4 .cfa: sp 0 + .ra: x30 +STACK CFI 24b00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24b04 .cfa: x29 48 + +STACK CFI 24b08 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 24b18 x21: .cfa -16 + ^ +STACK CFI 24ba4 x21: x21 +STACK CFI 24ba8 x19: x19 x20: x20 +STACK CFI 24bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24bb0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 24bb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 24bb8 .cfa: x29 48 + +STACK CFI 24bc0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 24c40 x21: x21 +STACK CFI 24c58 x19: x19 x20: x20 +STACK CFI 24c5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4b670 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4b674 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4b678 .cfa: x29 32 + +STACK CFI 4b67c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 4b6bc x19: x19 x20: x20 +STACK CFI 4b6c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 18 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x21: x21 +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 251f4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 251f8 .cfa: x29 48 + +STACK CFI 251fc x19: .cfa -32 + ^ +STACK CFI 25268 x19: x19 +STACK CFI 2526c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25270 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 25274 x19: x19 +STACK CFI 25278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252d8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 252dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 252e0 .cfa: x29 48 + +STACK CFI 252e4 x19: .cfa -32 + ^ +STACK CFI 25350 x19: x19 +STACK CFI 25354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25358 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 2535c x19: x19 +STACK CFI 25360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25364 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25370 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25380 24 .cfa: sp 0 + .ra: x30 +STACK CFI 25384 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25388 .cfa: x29 32 + +STACK CFI 2538c x19: .cfa -16 + ^ +STACK CFI 2539c x19: x19 +STACK CFI 253a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 253a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253b4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 253c0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 253c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 253c8 .cfa: x29 48 + +STACK CFI 253cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 2548c x19: x19 x20: x20 +STACK CFI 25490 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 25494 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25498 x19: x19 x20: x20 +STACK CFI 2549c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 254a0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 254ac cc .cfa: sp 0 + .ra: x30 +STACK CFI 254b0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 254b4 .cfa: x29 48 + +STACK CFI 254b8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 25564 x19: x19 x20: x20 +STACK CFI 25568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2556c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 25570 x19: x19 x20: x20 +STACK CFI 25574 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25578 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25584 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25598 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 255ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 255b0 .cfa: x29 32 + +STACK CFI 255b4 x19: .cfa -16 + ^ +STACK CFI 255c4 x19: x19 +STACK CFI 255c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 255cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255d4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255e4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 255f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25608 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2560c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25610 .cfa: x29 32 + +STACK CFI 25614 x19: .cfa -16 + ^ +STACK CFI 25624 x19: x19 +STACK CFI 25628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2562c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25634 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 6c x19: x19 +STACK CFI 70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 130 x21: x21 +STACK CFI 134 x19: x19 x20: x20 +STACK CFI 138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 540c4 13c .cfa: sp 0 + .ra: x30 +STACK CFI 540c8 .cfa: sp 480 + .ra: .cfa -472 + ^ x29: .cfa -480 + ^ +STACK CFI 540cc .cfa: x29 480 + +STACK CFI 540d0 x21: .cfa -448 + ^ x22: .cfa -440 + ^ +STACK CFI 540dc x25: .cfa -416 + ^ x26: .cfa -408 + ^ +STACK CFI 540f8 x19: .cfa -464 + ^ x20: .cfa -456 + ^ x23: .cfa -432 + ^ x24: .cfa -424 + ^ +STACK CFI 541ec x19: x19 x20: x20 +STACK CFI 541f0 x21: x21 x22: x22 +STACK CFI 541f4 x23: x23 x24: x24 +STACK CFI 541f8 x25: x25 x26: x26 +STACK CFI 541fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54200 9c .cfa: sp 0 + .ra: x30 +STACK CFI 54204 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 54208 .cfa: x29 80 + +STACK CFI 5420c x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 54214 x21: .cfa -48 + ^ +STACK CFI 54290 x21: x21 +STACK CFI 54294 x19: x19 x20: x20 +STACK CFI 54298 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5429c 1d8 .cfa: sp 0 + .ra: x30 +STACK CFI 542a0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 542a4 .cfa: x29 80 + +STACK CFI 542a8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 542b0 x21: .cfa -48 + ^ +STACK CFI 54468 x21: x21 +STACK CFI 5446c x19: x19 x20: x20 +STACK CFI 54470 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 282cc 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282d8 .cfa: x29 32 + +STACK CFI 282e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282ec 20 .cfa: sp 0 + .ra: x30 +STACK CFI 282f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 282f8 .cfa: x29 32 + +STACK CFI 28308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2830c 110 .cfa: sp 0 + .ra: x30 +STACK CFI 28310 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2831c .cfa: x29 32 + +STACK CFI 28398 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2839c .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 2841c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 28420 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 28424 .cfa: x29 80 + +STACK CFI 28430 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 28530 x19: x19 x20: x20 +STACK CFI 28534 x21: x21 x22: x22 +STACK CFI 28538 x23: x23 x24: x24 +STACK CFI 2853c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 28650 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 28654 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 2865c .cfa: x29 48 + +STACK CFI 28664 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 28708 x19: x19 x20: x20 +STACK CFI 2870c x21: x21 +STACK CFI 28710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI c4 x21: x21 +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 287cc 10c .cfa: sp 0 + .ra: x30 +STACK CFI 287d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 287d8 .cfa: x29 64 + +STACK CFI 287e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 287e8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 288c8 x19: x19 x20: x20 +STACK CFI 288cc x21: x21 x22: x22 +STACK CFI 288d0 x23: x23 +STACK CFI 288d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 288d8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI 288dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 288e4 .cfa: x29 64 + +STACK CFI 288f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 289b8 x23: x23 +STACK CFI 289bc x19: x19 x20: x20 +STACK CFI 289c0 x21: x21 x22: x22 +STACK CFI 289c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 104 x23: x23 +STACK CFI 108 x19: x19 x20: x20 +STACK CFI 10c x21: x21 x22: x22 +STACK CFI 110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26984 124 .cfa: sp 0 + .ra: x30 +STACK CFI 26988 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 26990 .cfa: x29 80 + +STACK CFI 2699c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 26a98 x19: x19 x20: x20 +STACK CFI 26a9c x21: x21 x22: x22 +STACK CFI 26aa0 x23: x23 +STACK CFI 26aa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 22f40 d8 .cfa: sp 0 + .ra: x30 +STACK CFI 22f44 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 22f48 .cfa: x29 64 + +STACK CFI 22f50 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 23004 x21: x21 +STACK CFI 2300c x19: x19 x20: x20 +STACK CFI 23010 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54474 1c .cfa: sp 0 + .ra: x30 +STACK CFI 54478 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5447c .cfa: x29 16 + +STACK CFI 5448c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 12c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 120 x19: x19 x20: x20 +STACK CFI 124 x21: x21 x22: x22 +STACK CFI 128 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54490 ec .cfa: sp 0 + .ra: x30 +STACK CFI 54494 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 54498 .cfa: x29 80 + +STACK CFI 544a0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 5456c x21: x21 +STACK CFI 54574 x19: x19 x20: x20 +STACK CFI 54578 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5457c 48 .cfa: sp 0 + .ra: x30 +STACK CFI 54580 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5458c .cfa: x29 16 + +STACK CFI 545c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 545c4 11c .cfa: sp 0 + .ra: x30 +STACK CFI 545c8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 545cc .cfa: x29 64 + +STACK CFI 545d4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 546d4 x21: x21 +STACK CFI 546d8 x19: x19 x20: x20 +STACK CFI 546dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI c x25: .cfa -32 + ^ +STACK CFI 18 x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 30 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI a4 x19: x19 x20: x20 +STACK CFI a8 x21: x21 x22: x22 +STACK CFI ac x23: x23 x24: x24 +STACK CFI b0 x25: x25 +STACK CFI b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 140 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI c x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 1c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x23: .cfa -48 + ^ +STACK CFI 130 x23: x23 +STACK CFI 134 x19: x19 x20: x20 +STACK CFI 138 x21: x21 x22: x22 +STACK CFI 13c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI 14 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 20 x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 120 x19: x19 x20: x20 +STACK CFI 124 x21: x21 x22: x22 +STACK CFI 128 x23: x23 x24: x24 +STACK CFI 12c x25: x25 x26: x26 +STACK CFI 130 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 546e0 2dc .cfa: sp 0 + .ra: x30 +STACK CFI 546e4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 546e8 .cfa: x29 96 + +STACK CFI 546ec x25: .cfa -32 + ^ +STACK CFI 546f8 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 54704 x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 549a8 x25: x25 +STACK CFI 549ac x19: x19 x20: x20 +STACK CFI 549b0 x21: x21 x22: x22 +STACK CFI 549b4 x23: x23 x24: x24 +STACK CFI 549b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 549bc 234 .cfa: sp 0 + .ra: x30 +STACK CFI 549c0 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 549c4 .cfa: x29 160 + +STACK CFI 549c8 x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 549d4 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x23: .cfa -112 + ^ +STACK CFI 54be0 x19: x19 x20: x20 +STACK CFI 54be4 x21: x21 x22: x22 +STACK CFI 54be8 x23: x23 +STACK CFI 54bec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54bf0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 238 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 8 .cfa: x29 160 + +STACK CFI c x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 18 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x23: .cfa -112 + ^ +STACK CFI 228 x19: x19 x20: x20 +STACK CFI 22c x21: x21 x22: x22 +STACK CFI 230 x23: x23 +STACK CFI 234 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 54bf4 190 .cfa: sp 0 + .ra: x30 +STACK CFI 54bf8 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 54c04 .cfa: x29 144 + +STACK CFI 54c0c x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ +STACK CFI 54d78 x19: x19 x20: x20 +STACK CFI 54d7c x21: x21 +STACK CFI 54d80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI c x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 24 x21: .cfa -64 + ^ +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 x21: x21 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54d84 100 .cfa: sp 0 + .ra: x30 +STACK CFI 54d88 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 54d8c .cfa: x29 80 + +STACK CFI 54d90 x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 54d9c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 54db0 x25: .cfa -16 + ^ x26: .cfa -8 + ^ +STACK CFI 54e54 x19: x19 x20: x20 +STACK CFI 54e58 x21: x21 x22: x22 +STACK CFI 54e5c x23: x23 x24: x24 +STACK CFI 54e60 x25: x25 x26: x26 +STACK CFI 54e64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 54e68 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ x26: .cfa -8 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 28 x19: x19 +STACK CFI 30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 34 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 1c x19: x19 +STACK CFI 24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 60 x19: x19 +STACK CFI 64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54e84 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI c x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 18 x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ +STACK CFI 30 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI f4 x27: x27 +STACK CFI f8 x19: x19 x20: x20 +STACK CFI fc x21: x21 x22: x22 +STACK CFI 100 x23: x23 x24: x24 +STACK CFI 104 x25: x25 x26: x26 +STACK CFI 10c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 28 x19: x19 +STACK CFI 30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 34 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 1c x19: x19 +STACK CFI 24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 60 x19: x19 +STACK CFI 64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54e9c 34 .cfa: sp 0 + .ra: x30 +STACK CFI 54ea0 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 54ea4 .cfa: x29 16 + +STACK CFI 54ecc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54ed0 34 .cfa: sp 0 + .ra: x30 +STACK CFI 54ed4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 54edc .cfa: x29 32 + +STACK CFI 54ee0 x19: .cfa -16 + ^ +STACK CFI 54efc x19: x19 +STACK CFI 54f00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54f04 24 .cfa: sp 0 + .ra: x30 +STACK CFI 54f08 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 54f0c .cfa: x29 32 + +STACK CFI 54f10 x19: .cfa -16 + ^ +STACK CFI 54f20 x19: x19 +STACK CFI 54f24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 50 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 8 .cfa: x29 16 + +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 54f28 48 .cfa: sp 0 + .ra: x30 +STACK CFI 54f2c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 54f30 .cfa: x29 32 + +STACK CFI 54f34 x19: .cfa -16 + ^ +STACK CFI 54f68 x19: x19 +STACK CFI 54f6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 60 x19: x19 +STACK CFI 64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 14 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 5c x19: x19 x20: x20 +STACK CFI 60 x21: x21 x22: x22 +STACK CFI 64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54f70 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 54f74 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 54f7c .cfa: x29 48 + +STACK CFI 54f84 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 54f8c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 5500c x19: x19 x20: x20 +STACK CFI 55010 x21: x21 x22: x22 +STACK CFI 55014 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 140 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 134 x19: x19 x20: x20 +STACK CFI 138 x21: x21 x22: x22 +STACK CFI 13c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 210 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 14 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 204 x19: x19 x20: x20 +STACK CFI 208 x21: x21 x22: x22 +STACK CFI 20c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55018 48 .cfa: sp 0 + .ra: x30 +STACK CFI 5501c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 55020 .cfa: x29 32 + +STACK CFI 55024 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 55058 x19: x19 x20: x20 +STACK CFI 5505c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55060 268 .cfa: sp 0 + .ra: x30 +STACK CFI 55064 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 55068 .cfa: x29 128 + +STACK CFI 5506c x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 55084 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 552b0 x23: x23 x24: x24 +STACK CFI 552b4 x19: x19 x20: x20 +STACK CFI 552b8 x21: x21 x22: x22 +STACK CFI 552bc x25: x25 x26: x26 +STACK CFI 552c0 x27: x27 x28: x28 +STACK CFI 552c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI c .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ +STACK CFI 58 x19: x19 +STACK CFI 5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 552c8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 552d8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 552e8 20 .cfa: sp 0 + .ra: x30 +STACK CFI 552ec .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 552f0 .cfa: x29 16 + +STACK CFI 55304 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55308 20 .cfa: sp 0 + .ra: x30 +STACK CFI 5530c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55310 .cfa: x29 16 + +STACK CFI 55324 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23524 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55328 18 .cfa: sp 0 + .ra: x30 +STACK CFI 5532c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55330 .cfa: x29 16 + +STACK CFI 5533c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55340 18 .cfa: sp 0 + .ra: x30 +STACK CFI 55344 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55348 .cfa: x29 16 + +STACK CFI 55354 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55358 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5536c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55374 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5537c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55380 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55384 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55388 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5538c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55390 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55394 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55398 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5539c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553a0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553a4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553a8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553ac 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553b4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553b8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553bc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553c0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553c4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553c8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553cc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 553d0 1c .cfa: sp 0 + .ra: x30 +STACK CFI 553d4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 553d8 .cfa: x29 16 + +STACK CFI 553e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 553ec 1c .cfa: sp 0 + .ra: x30 +STACK CFI 553f0 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 553f4 .cfa: x29 16 + +STACK CFI 55404 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55408 20 .cfa: sp 0 + .ra: x30 +STACK CFI 5540c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55410 .cfa: x29 16 + +STACK CFI 55424 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55428 20 .cfa: sp 0 + .ra: x30 +STACK CFI 5542c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55430 .cfa: x29 16 + +STACK CFI 55444 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55448 20 .cfa: sp 0 + .ra: x30 +STACK CFI 5544c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55450 .cfa: x29 16 + +STACK CFI 55464 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55468 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5546c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55470 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55474 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 38 x19: x19 +STACK CFI 3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55478 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5547c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55480 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55484 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 14 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 98 x23: x23 +STACK CFI 9c x19: x19 x20: x20 +STACK CFI a0 x21: x21 x22: x22 +STACK CFI a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 14 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI a4 x23: x23 +STACK CFI a8 x19: x19 x20: x20 +STACK CFI ac x21: x21 x22: x22 +STACK CFI b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55488 64 .cfa: sp 0 + .ra: x30 +STACK CFI 5548c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 55490 .cfa: x29 48 + +STACK CFI 55498 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 554e0 x19: x19 x20: x20 +STACK CFI 554e4 x21: x21 +STACK CFI 554e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 554ec 64 .cfa: sp 0 + .ra: x30 +STACK CFI 554f0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 554f4 .cfa: x29 48 + +STACK CFI 554fc x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 55544 x19: x19 x20: x20 +STACK CFI 55548 x21: x21 +STACK CFI 5554c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55550 64 .cfa: sp 0 + .ra: x30 +STACK CFI 55554 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 55558 .cfa: x29 48 + +STACK CFI 55560 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 555a8 x19: x19 x20: x20 +STACK CFI 555ac x21: x21 +STACK CFI 555b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 555b4 64 .cfa: sp 0 + .ra: x30 +STACK CFI 555b8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 555bc .cfa: x29 48 + +STACK CFI 555c4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 5560c x19: x19 x20: x20 +STACK CFI 55610 x21: x21 +STACK CFI 55614 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55618 64 .cfa: sp 0 + .ra: x30 +STACK CFI 5561c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 55620 .cfa: x29 48 + +STACK CFI 55628 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 55670 x19: x19 x20: x20 +STACK CFI 55674 x21: x21 +STACK CFI 55678 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5567c 64 .cfa: sp 0 + .ra: x30 +STACK CFI 55680 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 55684 .cfa: x29 48 + +STACK CFI 5568c x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 556d4 x19: x19 x20: x20 +STACK CFI 556d8 x21: x21 +STACK CFI 556dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 556e0 80 .cfa: sp 0 + .ra: x30 +STACK CFI 556e4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 556e8 .cfa: x29 64 + +STACK CFI 556f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 55750 x19: x19 x20: x20 +STACK CFI 55754 x21: x21 x22: x22 +STACK CFI 55758 x23: x23 +STACK CFI 5575c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55760 80 .cfa: sp 0 + .ra: x30 +STACK CFI 55764 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 55768 .cfa: x29 64 + +STACK CFI 55774 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 557d0 x19: x19 x20: x20 +STACK CFI 557d4 x21: x21 x22: x22 +STACK CFI 557d8 x23: x23 +STACK CFI 557dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 557e0 80 .cfa: sp 0 + .ra: x30 +STACK CFI 557e4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 557e8 .cfa: x29 64 + +STACK CFI 557f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 55850 x19: x19 x20: x20 +STACK CFI 55854 x21: x21 x22: x22 +STACK CFI 55858 x23: x23 +STACK CFI 5585c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55860 80 .cfa: sp 0 + .ra: x30 +STACK CFI 55864 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 55868 .cfa: x29 64 + +STACK CFI 55874 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 558d0 x19: x19 x20: x20 +STACK CFI 558d4 x21: x21 x22: x22 +STACK CFI 558d8 x23: x23 +STACK CFI 558dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 558e0 80 .cfa: sp 0 + .ra: x30 +STACK CFI 558e4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 558e8 .cfa: x29 64 + +STACK CFI 558f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 55950 x19: x19 x20: x20 +STACK CFI 55954 x21: x21 x22: x22 +STACK CFI 55958 x23: x23 +STACK CFI 5595c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55960 6c .cfa: sp 0 + .ra: x30 +STACK CFI 55964 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 55968 .cfa: x29 48 + +STACK CFI 55970 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 559c0 x19: x19 x20: x20 +STACK CFI 559c4 x21: x21 x22: x22 +STACK CFI 559c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 559cc 88 .cfa: sp 0 + .ra: x30 +STACK CFI 559d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 559d4 .cfa: x29 64 + +STACK CFI 559e0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 55a44 x19: x19 x20: x20 +STACK CFI 55a48 x21: x21 x22: x22 +STACK CFI 55a4c x23: x23 x24: x24 +STACK CFI 55a50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55a54 84 .cfa: sp 0 + .ra: x30 +STACK CFI 55a58 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 55a5c .cfa: x29 48 + +STACK CFI 55a64 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 55a8c x19: x19 x20: x20 +STACK CFI 55a90 x21: x21 +STACK CFI 55a98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 55aa0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 55acc x19: x19 x20: x20 +STACK CFI 55ad0 x21: x21 +STACK CFI 55ad4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55ad8 60 .cfa: sp 0 + .ra: x30 +STACK CFI 55adc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 55ae0 .cfa: x29 64 + +STACK CFI 55ae4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 55aec x21: .cfa -32 + ^ +STACK CFI 55b2c x21: x21 +STACK CFI 55b30 x19: x19 x20: x20 +STACK CFI 55b34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55b38 30 .cfa: sp 0 + .ra: x30 +STACK CFI 55b3c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55b44 .cfa: x29 16 + +STACK CFI 55b64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55b68 24 .cfa: sp 0 + .ra: x30 +STACK CFI 55b6c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 55b70 .cfa: x29 32 + +STACK CFI 55b74 x19: .cfa -16 + ^ +STACK CFI 55b84 x19: x19 +STACK CFI 55b88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 14 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI a0 x23: x23 +STACK CFI a4 x19: x19 x20: x20 +STACK CFI a8 x21: x21 x22: x22 +STACK CFI ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 430ec 38 .cfa: sp 0 + .ra: x30 +STACK CFI 430f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 430fc .cfa: x29 32 + +STACK CFI 43100 x19: .cfa -16 + ^ +STACK CFI 4311c x19: x19 +STACK CFI 43120 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55b8c 5c .cfa: sp 0 + .ra: x30 +STACK CFI 55b90 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 55ba0 .cfa: x29 48 + +STACK CFI 55be4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43124 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 4c x19: x19 x20: x20 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55be8 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 55bec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 55bf0 .cfa: x29 32 + +STACK CFI 55bf4 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 55c88 x19: x19 x20: x20 +STACK CFI 55c8c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55c90 58 .cfa: sp 0 + .ra: x30 +STACK CFI 55c94 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 55c98 .cfa: x29 48 + +STACK CFI 55ca0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 55cdc x21: x21 +STACK CFI 55ce0 x19: x19 x20: x20 +STACK CFI 55ce4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55ce8 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55cf4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 55cf8 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55d04 .cfa: x29 16 + +STACK CFI 55d14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55d18 24 .cfa: sp 0 + .ra: x30 +STACK CFI 55d1c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55d28 .cfa: x29 16 + +STACK CFI 55d38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55d3c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 55d40 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55d4c .cfa: x29 16 + +STACK CFI 55d5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 10 .cfa: x29 16 + +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55d60 24 .cfa: sp 0 + .ra: x30 +STACK CFI 55d64 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55d70 .cfa: x29 16 + +STACK CFI 55d80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 10 .cfa: x29 16 + +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55d84 24 .cfa: sp 0 + .ra: x30 +STACK CFI 55d88 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55d94 .cfa: x29 16 + +STACK CFI 55da4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55da8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 55dac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 55db4 .cfa: x29 32 + +STACK CFI 55dcc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55dd8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 55ddc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55de4 .cfa: x29 16 + +STACK CFI 55e04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55e08 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55e1c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI c .cfa: x29 16 + +STACK CFI 2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55e2c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 55e30 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55e38 .cfa: x29 16 + +STACK CFI 55e58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 60 x19: x19 x20: x20 +STACK CFI 64 x21: x21 x22: x22 +STACK CFI 68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55e5c 58 .cfa: sp 0 + .ra: x30 +STACK CFI 55e60 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55e64 .cfa: x29 16 + +STACK CFI 55ea8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55eb4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 55eb8 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55ebc .cfa: x29 16 + +STACK CFI 55f00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55f0c 70 .cfa: sp 0 + .ra: x30 +STACK CFI 55f10 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 55f14 .cfa: x29 48 + +STACK CFI 55f18 x21: .cfa -16 + ^ +STACK CFI 55f20 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 55f70 x19: x19 x20: x20 +STACK CFI 55f74 x21: x21 +STACK CFI 55f78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55f7c 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55f94 2c .cfa: sp 0 + .ra: x30 +STACK CFI 55f98 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 55f9c .cfa: x29 16 + +STACK CFI 55fbc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55fc0 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 55ff0 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56020 50 .cfa: sp 0 + .ra: x30 +STACK CFI 56024 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 56028 .cfa: x29 32 + +STACK CFI 5602c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 56068 x19: x19 x20: x20 +STACK CFI 5606c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56070 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56098 44 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 560dc 154 .cfa: sp 0 + .ra: x30 +STACK CFI 560e0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 560e8 .cfa: x29 32 + +STACK CFI 560ec x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 56218 x19: x19 x20: x20 +STACK CFI 5621c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 56224 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 56228 x19: x19 x20: x20 +STACK CFI 5622c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56230 134 .cfa: sp 0 + .ra: x30 +STACK CFI 56234 .cfa: sp 288 + .ra: .cfa -280 + ^ x29: .cfa -288 + ^ +STACK CFI 56238 .cfa: x29 288 + +STACK CFI 5623c x21: .cfa -256 + ^ +STACK CFI 56248 x19: .cfa -272 + ^ x20: .cfa -264 + ^ +STACK CFI 56358 x19: x19 x20: x20 +STACK CFI 5635c x21: x21 +STACK CFI 56360 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56364 38 .cfa: sp 0 + .ra: x30 +STACK CFI 56368 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 56374 .cfa: x29 16 + +STACK CFI 56390 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5639c 54 .cfa: sp 0 + .ra: x30 +STACK CFI 563a0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 563a8 .cfa: x29 32 + +STACK CFI 563ac x19: .cfa -16 + ^ +STACK CFI 563dc x19: x19 +STACK CFI 563e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 563f0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 563f4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 56400 .cfa: x29 16 + +STACK CFI 5641c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56428 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 5642c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 56430 .cfa: x29 64 + +STACK CFI 56438 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 564bc x21: x21 +STACK CFI 564c0 x19: x19 x20: x20 +STACK CFI 564cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 564d8 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x29: .cfa -64 + ^ +STACK CFI 564dc x19: x19 x20: x20 +STACK CFI 564e0 x21: x21 +STACK CFI 564e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 564e8 7c .cfa: sp 0 + .ra: x30 +STACK CFI 564ec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 564f4 .cfa: x29 32 + +STACK CFI 564f8 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 5655c x19: x19 x20: x20 +STACK CFI 56560 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56564 50 .cfa: sp 0 + .ra: x30 +STACK CFI 56568 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5656c .cfa: x29 32 + +STACK CFI 56570 x19: .cfa -16 + ^ +STACK CFI 565ac x19: x19 +STACK CFI 565b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 565b4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 565b8 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 565bc .cfa: x29 16 + +STACK CFI 565d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 565d8 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56604 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56610 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56628 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56630 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56638 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56640 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56648 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56650 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5665c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56670 30 .cfa: sp 0 + .ra: x30 +STACK CFI 56674 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 56680 .cfa: x29 16 + +STACK CFI 5669c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 566a0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 566a4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 566a8 .cfa: x29 48 + +STACK CFI 566ac x19: .cfa -32 + ^ +STACK CFI 56708 x19: x19 +STACK CFI 5670c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 56710 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 56714 x19: x19 +STACK CFI 56718 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5671c 144 .cfa: sp 0 + .ra: x30 +STACK CFI 56720 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 56724 .cfa: x29 80 + +STACK CFI 56730 x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ x26: .cfa -8 + ^ +STACK CFI 56744 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 56844 x19: x19 x20: x20 +STACK CFI 56848 x21: x21 x22: x22 +STACK CFI 56850 x23: x23 x24: x24 +STACK CFI 56854 x25: x25 x26: x26 +STACK CFI 56858 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 3c x19: x19 x20: x20 +STACK CFI 40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56860 4c .cfa: sp 0 + .ra: x30 +STACK CFI 56864 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 56868 .cfa: x29 32 + +STACK CFI 5686c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 568a4 x19: x19 x20: x20 +STACK CFI 568a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 568ac 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 568b0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 568b8 5c .cfa: sp 0 + .ra: x30 +STACK CFI 568bc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 568c0 .cfa: x29 48 + +STACK CFI 568c4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 568cc x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 56908 x19: x19 x20: x20 +STACK CFI 5690c x21: x21 x22: x22 +STACK CFI 56910 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56914 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 56918 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 5691c .cfa: x29 48 + +STACK CFI 56920 x19: .cfa -32 + ^ +STACK CFI 569c4 x19: x19 +STACK CFI 569c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 8 .cfa: x29 16 + +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 569cc 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 569fc 3c .cfa: sp 0 + .ra: x30 +STACK CFI 56a00 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 56a08 .cfa: x29 32 + +STACK CFI 56a0c x19: .cfa -16 + ^ +STACK CFI 56a30 x19: x19 +STACK CFI 56a34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56a38 3c .cfa: sp 0 + .ra: x30 +STACK CFI 56a3c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 56a44 .cfa: x29 32 + +STACK CFI 56a48 x19: .cfa -16 + ^ +STACK CFI 56a6c x19: x19 +STACK CFI 56a70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56a74 40 .cfa: sp 0 + .ra: x30 +STACK CFI 56a78 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 56a80 .cfa: x29 32 + +STACK CFI 56a84 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 56aac x19: x19 x20: x20 +STACK CFI 56ab0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56ab4 5c .cfa: sp 0 + .ra: x30 +STACK CFI 56ab8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 56abc .cfa: x29 64 + +STACK CFI 56ac4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 56b04 x21: x21 +STACK CFI 56b08 x19: x19 x20: x20 +STACK CFI 56b0c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56b10 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56b20 3c .cfa: sp 0 + .ra: x30 +STACK CFI 56b24 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 56b28 .cfa: x29 32 + +STACK CFI 56b2c x19: .cfa -16 + ^ +STACK CFI 56b44 x19: x19 +STACK CFI 56b48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 56b4c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 56b54 x19: x19 +STACK CFI 56b58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56b5c 20 .cfa: sp 0 + .ra: x30 +STACK CFI 56b60 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 56b64 .cfa: x29 16 + +STACK CFI 56b78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56b7c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56b8c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56b94 50 .cfa: sp 0 + .ra: x30 +STACK CFI 56b98 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 56b9c .cfa: x29 32 + +STACK CFI 56ba0 x19: .cfa -16 + ^ +STACK CFI 56bdc x19: x19 +STACK CFI 56be0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56be4 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56c00 58 .cfa: sp 0 + .ra: x30 +STACK CFI 56c04 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 56c08 .cfa: x29 48 + +STACK CFI 56c0c x19: .cfa -32 + ^ +STACK CFI 56c50 x19: x19 +STACK CFI 56c54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56c58 5c .cfa: sp 0 + .ra: x30 +STACK CFI 56c5c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 56c60 .cfa: x29 64 + +STACK CFI 56c68 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 56ca8 x21: x21 +STACK CFI 56cac x19: x19 x20: x20 +STACK CFI 56cb0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56cb4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56cc4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56cd4 28 .cfa: sp 0 + .ra: x30 +STACK CFI 56cd8 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 56cdc .cfa: x29 16 + +STACK CFI 56cf8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56cfc 104 .cfa: sp 0 + .ra: x30 +STACK CFI 56d00 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 56d04 .cfa: x29 80 + +STACK CFI 56d0c x21: .cfa -48 + ^ x22: .cfa -40 + ^ x25: .cfa -16 + ^ +STACK CFI 56d18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 56dec x19: x19 x20: x20 +STACK CFI 56df0 x21: x21 x22: x22 +STACK CFI 56df4 x23: x23 x24: x24 +STACK CFI 56df8 x25: x25 +STACK CFI 56dfc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 8 .cfa: x29 16 + +STACK CFI 24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56e00 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56e10 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56e20 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56e30 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56e34 3c .cfa: sp 0 + .ra: x30 +STACK CFI 56e38 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 56e3c .cfa: x29 32 + +STACK CFI 56e40 x19: .cfa -16 + ^ +STACK CFI 56e5c x19: x19 +STACK CFI 56e60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 56e64 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 56e68 x19: x19 +STACK CFI 56e6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 28 x19: x19 +STACK CFI 2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56e70 30 .cfa: sp 0 + .ra: x30 +STACK CFI 56e74 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 56e78 .cfa: x29 32 + +STACK CFI 56e7c x19: .cfa -16 + ^ +STACK CFI 56e98 x19: x19 +STACK CFI 56e9c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56ea0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56eb0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 56eb4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 56eb8 .cfa: x29 32 + +STACK CFI 56ebc x19: .cfa -16 + ^ +STACK CFI 56ecc x19: x19 +STACK CFI 56ed0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56ed4 68 .cfa: sp 0 + .ra: x30 +STACK CFI 56ed8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 56edc .cfa: x29 48 + +STACK CFI 56ee4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 56f1c x21: x21 +STACK CFI 56f20 x19: x19 x20: x20 +STACK CFI 56f24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 56f2c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 56f30 x19: x19 x20: x20 +STACK CFI 56f34 x21: x21 +STACK CFI 56f38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56f3c 58 .cfa: sp 0 + .ra: x30 +STACK CFI 56f40 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 56f44 .cfa: x29 48 + +STACK CFI 56f4c x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 56f88 x19: x19 x20: x20 +STACK CFI 56f8c x21: x21 +STACK CFI 56f90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 24 x19: x19 +STACK CFI 28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 30 x19: x19 +STACK CFI 34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 fc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI c .cfa: x29 96 + +STACK CFI 18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 x19: x19 x20: x20 +STACK CFI f4 x23: x23 x24: x24 +STACK CFI f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 1c x21: .cfa -16 + ^ +STACK CFI 94 x21: x21 +STACK CFI b0 x19: x19 x20: x20 +STACK CFI b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 90 x21: x21 +STACK CFI a8 x19: x19 x20: x20 +STACK CFI ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56f94 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56fb0 50 .cfa: sp 0 + .ra: x30 +STACK CFI 56fb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 56fb8 .cfa: x29 48 + +STACK CFI 56fbc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 56fc4 x21: .cfa -16 + ^ +STACK CFI 56ff4 x21: x21 +STACK CFI 56ff8 x19: x19 x20: x20 +STACK CFI 56ffc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57000 24 .cfa: sp 0 + .ra: x30 +STACK CFI 57004 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 57008 .cfa: x29 32 + +STACK CFI 5700c x19: .cfa -16 + ^ +STACK CFI 5701c x19: x19 +STACK CFI 57020 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57024 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 57040 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5705c f0 .cfa: sp 0 + .ra: x30 +STACK CFI 57060 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 57064 .cfa: x29 80 + +STACK CFI 57070 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 5713c x19: x19 x20: x20 +STACK CFI 57140 x21: x21 x22: x22 +STACK CFI 57144 x23: x23 +STACK CFI 57148 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5714c 60 .cfa: sp 0 + .ra: x30 +STACK CFI 57150 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 57158 .cfa: x29 16 + +STACK CFI 571a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 571a4 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 571a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 10 .cfa: x29 64 + +STACK CFI 1c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI b4 x23: x23 +STACK CFI b8 x19: x19 x20: x20 +STACK CFI bc x21: x21 x22: x22 +STACK CFI c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 571ac f0 .cfa: sp 0 + .ra: x30 +STACK CFI 571b0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 571b4 .cfa: x29 80 + +STACK CFI 571c0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 5728c x19: x19 x20: x20 +STACK CFI 57290 x21: x21 x22: x22 +STACK CFI 57294 x23: x23 +STACK CFI 57298 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b28 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 285f0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 285f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 285f8 .cfa: x29 32 + +STACK CFI 285fc x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 28648 x19: x19 x20: x20 +STACK CFI 2864c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI c .cfa: x29 48 + +STACK CFI 14 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b8 x19: x19 x20: x20 +STACK CFI bc x21: x21 +STACK CFI c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 154 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 144 x23: x23 +STACK CFI 148 x19: x19 x20: x20 +STACK CFI 14c x21: x21 x22: x22 +STACK CFI 150 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 18 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 9c x19: x19 x20: x20 +STACK CFI a0 x21: x21 x22: x22 +STACK CFI a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5729c 38 .cfa: sp 0 + .ra: x30 +STACK CFI 572a0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 572ac .cfa: x29 32 + +STACK CFI 572b0 x19: .cfa -16 + ^ +STACK CFI 572cc x19: x19 +STACK CFI 572d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 572d4 50 .cfa: sp 0 + .ra: x30 +STACK CFI 572d8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 572dc .cfa: x29 48 + +STACK CFI 572e4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 57318 x19: x19 x20: x20 +STACK CFI 5731c x21: x21 x22: x22 +STACK CFI 57320 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 57324 68 .cfa: sp 0 + .ra: x30 +STACK CFI 57328 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 5732c .cfa: x29 48 + +STACK CFI 57330 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 5733c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 57380 x21: x21 x22: x22 +STACK CFI 57384 x19: x19 x20: x20 +STACK CFI 57388 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5738c 44 .cfa: sp 0 + .ra: x30 +STACK CFI 57390 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 57394 .cfa: x29 32 + +STACK CFI 57398 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 573c8 x19: x19 x20: x20 +STACK CFI 573cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 573d0 194 .cfa: sp 0 + .ra: x30 +STACK CFI 573d4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 573dc .cfa: x29 80 + +STACK CFI 573ec x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ x26: .cfa -8 + ^ +STACK CFI 57538 x21: x21 x22: x22 +STACK CFI 5753c x19: x19 x20: x20 +STACK CFI 57540 x23: x23 x24: x24 +STACK CFI 57544 x25: x25 x26: x26 +STACK CFI 57548 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 5754c .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ x26: .cfa -8 + ^ x29: .cfa -80 + ^ +STACK CFI 57550 x19: x19 x20: x20 +STACK CFI 57554 x21: x21 x22: x22 +STACK CFI 57558 x23: x23 x24: x24 +STACK CFI 5755c x25: x25 x26: x26 +STACK CFI 57560 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25fd8 34 .cfa: sp 0 + .ra: x30 +STACK CFI 25fdc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25fe0 .cfa: x29 48 + +STACK CFI 25fe4 x19: .cfa -32 + ^ +STACK CFI 26004 x19: x19 +STACK CFI 26008 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57564 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 57574 12c .cfa: sp 0 + .ra: x30 +STACK CFI 57578 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 5757c .cfa: x29 48 + +STACK CFI 57580 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 5758c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 57694 x19: x19 x20: x20 +STACK CFI 57698 x21: x21 x22: x22 +STACK CFI 5769c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 576a0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 576a4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 576a8 .cfa: x29 48 + +STACK CFI 576ac x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 576e4 x19: x19 x20: x20 +STACK CFI 576e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 576ec 68 .cfa: sp 0 + .ra: x30 +STACK CFI 576f0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 576f4 .cfa: x29 80 + +STACK CFI 576f8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 5774c x19: x19 x20: x20 +STACK CFI 57750 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57754 30 .cfa: sp 0 + .ra: x30 +STACK CFI 57758 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 57764 .cfa: x29 48 + +STACK CFI 5777c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57784 70 .cfa: sp 0 + .ra: x30 +STACK CFI 57788 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 57790 .cfa: x29 48 + +STACK CFI 57794 x19: .cfa -32 + ^ +STACK CFI 577ec x19: x19 +STACK CFI 577f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 577f4 30 .cfa: sp 0 + .ra: x30 +STACK CFI 577f8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 57804 .cfa: x29 48 + +STACK CFI 5781c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57824 e4 .cfa: sp 0 + .ra: x30 +STACK CFI 57828 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 57830 .cfa: x29 96 + +STACK CFI 57834 x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 57844 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 57850 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x25: .cfa -32 + ^ +STACK CFI 578e8 x25: x25 +STACK CFI 578f8 x21: x21 x22: x22 +STACK CFI 578fc x19: x19 x20: x20 +STACK CFI 57900 x23: x23 x24: x24 +STACK CFI 57904 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 57908 24 .cfa: sp 0 + .ra: x30 +STACK CFI 5790c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 57910 .cfa: x29 32 + +STACK CFI 57914 x19: .cfa -16 + ^ +STACK CFI 57924 x19: x19 +STACK CFI 57928 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5792c 7c .cfa: sp 0 + .ra: x30 +STACK CFI 57930 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 57938 .cfa: x29 144 + +STACK CFI 5793c x19: .cfa -128 + ^ x20: .cfa -120 + ^ +STACK CFI 57954 x21: .cfa -112 + ^ +STACK CFI 5799c x21: x21 +STACK CFI 579a0 x19: x19 x20: x20 +STACK CFI 579a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 579a8 4c .cfa: sp 0 + .ra: x30 +STACK CFI 579ac .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 579b0 .cfa: x29 48 + +STACK CFI 579b4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 579ec x19: x19 x20: x20 +STACK CFI 579f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 579f4 60 .cfa: sp 0 + .ra: x30 +STACK CFI 579f8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 57a00 .cfa: x29 64 + +STACK CFI 57a04 x21: .cfa -32 + ^ +STACK CFI 57a10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 57a48 x19: x19 x20: x20 +STACK CFI 57a4c x21: x21 +STACK CFI 57a50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57a54 54 .cfa: sp 0 + .ra: x30 +STACK CFI 57a58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 57a60 .cfa: x29 16 + +STACK CFI 57aa0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57aa8 78 .cfa: sp 0 + .ra: x30 +STACK CFI 57aac .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 57ab4 .cfa: x29 48 + +STACK CFI 57ab8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 57b18 x19: x19 x20: x20 +STACK CFI 57b1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24e18 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24e1c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24e24 .cfa: x29 32 + +STACK CFI 24e28 x19: .cfa -16 + ^ +STACK CFI 24e44 x19: x19 +STACK CFI 24e48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57b20 9c .cfa: sp 0 + .ra: x30 +STACK CFI 57b24 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 57b28 .cfa: x29 64 + +STACK CFI 57b30 x21: .cfa -32 + ^ +STACK CFI 57b3c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 57bb0 x21: x21 +STACK CFI 57bb4 x19: x19 x20: x20 +STACK CFI 57bb8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57bbc ac .cfa: sp 0 + .ra: x30 +STACK CFI 57bc0 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 57bc8 .cfa: x29 128 + +STACK CFI 57bcc x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 57bdc x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 57c58 x19: x19 x20: x20 +STACK CFI 57c5c x21: x21 x22: x22 +STACK CFI 57c60 x23: x23 x24: x24 +STACK CFI 57c64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57c68 28 .cfa: sp 0 + .ra: x30 +STACK CFI 57c6c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 57c70 .cfa: x29 32 + +STACK CFI 57c74 x19: .cfa -16 + ^ +STACK CFI 57c88 x19: x19 +STACK CFI 57c8c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 ac .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI 14 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ +STACK CFI 9c x23: x23 +STACK CFI a0 x19: x19 x20: x20 +STACK CFI a4 x21: x21 x22: x22 +STACK CFI a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 18 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI d0 x19: x19 x20: x20 +STACK CFI d4 x21: x21 x22: x22 +STACK CFI d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57c90 58 .cfa: sp 0 + .ra: x30 +STACK CFI 57c94 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 57c98 .cfa: x29 64 + +STACK CFI 57c9c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 57ce0 x19: x19 x20: x20 +STACK CFI 57ce4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI a8 x21: x21 +STACK CFI ac x19: x19 x20: x20 +STACK CFI b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57ce8 1a4 .cfa: sp 0 + .ra: x30 +STACK CFI 57cec .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 57cf4 .cfa: x29 112 + +STACK CFI 57d08 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ +STACK CFI 57e74 x23: x23 x24: x24 +STACK CFI 57e78 x19: x19 x20: x20 +STACK CFI 57e7c x21: x21 x22: x22 +STACK CFI 57e80 x25: x25 x26: x26 +STACK CFI 57e84 x27: x27 +STACK CFI 57e88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57e8c 120 .cfa: sp 0 + .ra: x30 +STACK CFI 57e90 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 57e94 .cfa: x29 112 + +STACK CFI 57e9c x19: .cfa -96 + ^ x20: .cfa -88 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI 57eb0 x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 57eec x19: x19 x20: x20 +STACK CFI 57ef0 x21: x21 x22: x22 +STACK CFI 57ef4 x23: x23 x24: x24 +STACK CFI 57ef8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 57efc .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x29: .cfa -112 + ^ +STACK CFI INIT 0 80 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 70 x21: x21 +STACK CFI 78 x19: x19 x20: x20 +STACK CFI 7c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54474 1c .cfa: sp 0 + .ra: x30 +STACK CFI 54478 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5447c .cfa: x29 16 + +STACK CFI 5448c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 251c4 2c .cfa: sp 0 + .ra: x30 +STACK CFI 251c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 251cc .cfa: x29 32 + +STACK CFI 251d0 x19: .cfa -16 + ^ +STACK CFI 251e8 x19: x19 +STACK CFI 251ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 78 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 7c x19: x19 +STACK CFI 80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 78 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 7c x19: x19 +STACK CFI 80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI bc x19: x19 x20: x20 +STACK CFI c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI c4 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI ac x19: x19 x20: x20 +STACK CFI b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI b4 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI b8 x19: x19 x20: x20 +STACK CFI bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI c .cfa: x29 336 + +STACK CFI 10 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 18 x21: .cfa -304 + ^ +STACK CFI 4c x21: x21 +STACK CFI 54 x19: x19 x20: x20 +STACK CFI 58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI b0 x21: x21 +STACK CFI b8 x19: x19 x20: x20 +STACK CFI bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57fac cc .cfa: sp 0 + .ra: x30 +STACK CFI 57fb0 .cfa: sp 368 + .ra: .cfa -360 + ^ x29: .cfa -368 + ^ +STACK CFI 57fb8 .cfa: x29 368 + +STACK CFI 57fbc x19: .cfa -352 + ^ x20: .cfa -344 + ^ +STACK CFI 57fc4 x21: .cfa -336 + ^ +STACK CFI 58068 x21: x21 +STACK CFI 58070 x19: x19 x20: x20 +STACK CFI 58074 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 12c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 120 x19: x19 x20: x20 +STACK CFI 124 x21: x21 x22: x22 +STACK CFI 128 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58078 138 .cfa: sp 0 + .ra: x30 +STACK CFI 5807c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 58080 .cfa: x29 64 + +STACK CFI 58088 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 5819c x21: x21 x22: x22 +STACK CFI 581a8 x19: x19 x20: x20 +STACK CFI 581ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 581b0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 581b4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 581b8 .cfa: x29 32 + +STACK CFI 581bc x19: .cfa -16 + ^ +STACK CFI 581e0 x19: x19 +STACK CFI 581e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 4c x19: x19 x20: x20 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 581e8 8c .cfa: sp 0 + .ra: x30 +STACK CFI 581ec .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 581f0 .cfa: x29 64 + +STACK CFI 581f8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 58260 x21: x21 +STACK CFI 5826c x19: x19 x20: x20 +STACK CFI 58270 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58274 44 .cfa: sp 0 + .ra: x30 +STACK CFI 58278 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 58280 .cfa: x29 32 + +STACK CFI 58284 x19: .cfa -16 + ^ +STACK CFI 582b0 x19: x19 +STACK CFI 582b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 582b8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 582bc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 582c0 .cfa: x29 32 + +STACK CFI 582c4 x19: .cfa -16 + ^ +STACK CFI 582d4 x19: x19 +STACK CFI 582d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 582dc 68 .cfa: sp 0 + .ra: x30 +STACK CFI 582e0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 582e4 .cfa: x29 64 + +STACK CFI 582e8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 582f0 x21: .cfa -32 + ^ +STACK CFI 58334 x21: x21 +STACK CFI 5833c x19: x19 x20: x20 +STACK CFI 58340 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 400 + .ra: .cfa -392 + ^ x29: .cfa -400 + ^ +STACK CFI c .cfa: x29 400 + +STACK CFI 10 x19: .cfa -384 + ^ x20: .cfa -376 + ^ +STACK CFI 20 x21: .cfa -368 + ^ x22: .cfa -360 + ^ +STACK CFI 88 x19: x19 x20: x20 +STACK CFI 8c x21: x21 x22: x22 +STACK CFI 90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58344 8c .cfa: sp 0 + .ra: x30 +STACK CFI 58348 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5834c .cfa: x29 64 + +STACK CFI 58354 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 583c4 x19: x19 x20: x20 +STACK CFI 583c8 x21: x21 +STACK CFI 583cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 583d0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 583d4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 583d8 .cfa: x29 64 + +STACK CFI 583dc x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 5841c x19: x19 x20: x20 +STACK CFI 58420 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26240 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26244 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26248 .cfa: x29 64 + +STACK CFI 2624c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 2628c x19: x19 x20: x20 +STACK CFI 26290 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 4c x19: x19 x20: x20 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 4c x19: x19 x20: x20 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 262e8 54 .cfa: sp 0 + .ra: x30 +STACK CFI 262ec .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 262f0 .cfa: x29 64 + +STACK CFI 262f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 26334 x19: x19 x20: x20 +STACK CFI 26338 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58424 54 .cfa: sp 0 + .ra: x30 +STACK CFI 58428 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5842c .cfa: x29 64 + +STACK CFI 58430 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 58470 x19: x19 x20: x20 +STACK CFI 58474 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 4c x19: x19 x20: x20 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26188 54 .cfa: sp 0 + .ra: x30 +STACK CFI 2618c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 26190 .cfa: x29 64 + +STACK CFI 26194 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 261d4 x19: x19 x20: x20 +STACK CFI 261d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58478 10c .cfa: sp 0 + .ra: x30 +STACK CFI 5847c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 58480 .cfa: x29 112 + +STACK CFI 58488 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 58578 x19: x19 x20: x20 +STACK CFI 5857c x21: x21 x22: x22 +STACK CFI 58580 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 8 .cfa: x29 112 + +STACK CFI 10 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 100 x19: x19 x20: x20 +STACK CFI 104 x21: x21 x22: x22 +STACK CFI 108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 4c x19: x19 x20: x20 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 178 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI 14 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ +STACK CFI 28 x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 164 x19: x19 x20: x20 +STACK CFI 168 x21: x21 x22: x22 +STACK CFI 16c x23: x23 x24: x24 +STACK CFI 170 x25: x25 x26: x26 +STACK CFI 174 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 10 .cfa: x29 48 + +STACK CFI 1c x19: .cfa -32 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 10 .cfa: x29 48 + +STACK CFI 1c x19: .cfa -32 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 188 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 8 .cfa: x29 176 + +STACK CFI c x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 14 x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 17c x19: x19 x20: x20 +STACK CFI 180 x21: x21 x22: x22 +STACK CFI 184 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58584 118 .cfa: sp 0 + .ra: x30 +STACK CFI 58588 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 5858c .cfa: x29 96 + +STACK CFI 58594 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 5859c x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 58688 x23: x23 +STACK CFI 58690 x19: x19 x20: x20 +STACK CFI 58694 x21: x21 x22: x22 +STACK CFI 58698 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI d0 x21: x21 +STACK CFI d8 x19: x19 x20: x20 +STACK CFI dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5869c 98 .cfa: sp 0 + .ra: x30 +STACK CFI 586a0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 586a4 .cfa: x29 64 + +STACK CFI 586ac x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 58720 x21: x21 x22: x22 +STACK CFI 5872c x19: x19 x20: x20 +STACK CFI 58730 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58734 8c .cfa: sp 0 + .ra: x30 +STACK CFI 58738 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5873c .cfa: x29 64 + +STACK CFI 58744 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 587b4 x19: x19 x20: x20 +STACK CFI 587b8 x21: x21 +STACK CFI 587bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 587c0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 587c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 587c8 .cfa: x29 48 + +STACK CFI 587cc x19: .cfa -32 + ^ +STACK CFI 587f0 x19: x19 +STACK CFI 587f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 587f8 2c .cfa: sp 0 + .ra: x30 +STACK CFI 587fc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 58800 .cfa: x29 32 + +STACK CFI 58820 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58824 90 .cfa: sp 0 + .ra: x30 +STACK CFI 58828 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 58830 .cfa: x29 64 + +STACK CFI 58838 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 588a8 x19: x19 x20: x20 +STACK CFI 588ac x21: x21 x22: x22 +STACK CFI 588b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 588b4 40 .cfa: sp 0 + .ra: x30 +STACK CFI 588b8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 588bc .cfa: x29 32 + +STACK CFI 588c0 x19: .cfa -16 + ^ +STACK CFI 588ec x19: x19 +STACK CFI 588f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 588f4 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 588f8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 588fc .cfa: x29 96 + +STACK CFI 58904 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 58910 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 589a4 x19: x19 x20: x20 +STACK CFI 589a8 x21: x21 x22: x22 +STACK CFI 589ac x23: x23 x24: x24 +STACK CFI 589b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 589b4 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 589b8 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 589bc .cfa: x29 80 + +STACK CFI 589c0 x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 589d0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 58a4c x19: x19 x20: x20 +STACK CFI 58a50 x21: x21 x22: x22 +STACK CFI 58a54 x23: x23 x24: x24 +STACK CFI 58a58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58a5c 54 .cfa: sp 0 + .ra: x30 +STACK CFI 58a60 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 58a64 .cfa: x29 48 + +STACK CFI 58a6c x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 58aa4 x19: x19 x20: x20 +STACK CFI 58aa8 x21: x21 +STACK CFI 58aac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58ab0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 58ab4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 58ab8 .cfa: x29 64 + +STACK CFI 58ac0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 58b28 x19: x19 x20: x20 +STACK CFI 58b2c x21: x21 +STACK CFI 58b30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58b34 40 .cfa: sp 0 + .ra: x30 +STACK CFI 58b38 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 58b3c .cfa: x29 32 + +STACK CFI 58b40 x19: .cfa -16 + ^ +STACK CFI 58b6c x19: x19 +STACK CFI 58b70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58b74 24 .cfa: sp 0 + .ra: x30 +STACK CFI 58b78 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 58b7c .cfa: x29 32 + +STACK CFI 58b80 x19: .cfa -16 + ^ +STACK CFI 58b90 x19: x19 +STACK CFI 58b94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58b98 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 58ba8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 58bac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 58bb0 .cfa: x29 32 + +STACK CFI 58bb4 x19: .cfa -16 + ^ +STACK CFI 58bc4 x19: x19 +STACK CFI 58bc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58bcc 9c .cfa: sp 0 + .ra: x30 +STACK CFI 58bd0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 58bd4 .cfa: x29 48 + +STACK CFI 58bdc x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 58c5c x21: x21 +STACK CFI 58c60 x19: x19 x20: x20 +STACK CFI 58c64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58c68 74 .cfa: sp 0 + .ra: x30 +STACK CFI 58c6c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 58c70 .cfa: x29 32 + +STACK CFI 58c74 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 58cd4 x19: x19 x20: x20 +STACK CFI 58cd8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58cdc 34 .cfa: sp 0 + .ra: x30 +STACK CFI 58ce0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 58ce4 .cfa: x29 32 + +STACK CFI 58ce8 x19: .cfa -16 + ^ +STACK CFI 58cfc x19: x19 +STACK CFI 58d00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 58d04 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 58d08 x19: x19 +STACK CFI 58d0c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58d10 8c .cfa: sp 0 + .ra: x30 +STACK CFI 58d14 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 58d18 .cfa: x29 48 + +STACK CFI 58d1c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 58d24 x21: .cfa -16 + ^ +STACK CFI 58d90 x21: x21 +STACK CFI 58d94 x19: x19 x20: x20 +STACK CFI 58d98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58d9c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 58da0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 58da4 .cfa: x29 32 + +STACK CFI 58da8 x19: .cfa -16 + ^ +STACK CFI 58db8 x19: x19 +STACK CFI 58dbc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58dc0 1d0 .cfa: sp 0 + .ra: x30 +STACK CFI 58dc4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 58dc8 .cfa: x29 96 + +STACK CFI 58dd8 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 58f7c x19: x19 x20: x20 +STACK CFI 58f80 x21: x21 x22: x22 +STACK CFI 58f84 x23: x23 x24: x24 +STACK CFI 58f88 x25: x25 +STACK CFI 58f8c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 58f90 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 58f94 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 58f9c .cfa: x29 48 + +STACK CFI 58fa4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 59034 x19: x19 x20: x20 +STACK CFI 59038 x21: x21 x22: x22 +STACK CFI 5903c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 59040 9c .cfa: sp 0 + .ra: x30 +STACK CFI 59044 .cfa: sp 368 + .ra: .cfa -360 + ^ x29: .cfa -368 + ^ +STACK CFI 5904c .cfa: x29 368 + +STACK CFI 59050 x19: .cfa -352 + ^ x20: .cfa -344 + ^ +STACK CFI 59058 x21: .cfa -336 + ^ +STACK CFI 590cc x21: x21 +STACK CFI 590d4 x19: x19 x20: x20 +STACK CFI 590d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 590dc 90 .cfa: sp 0 + .ra: x30 +STACK CFI 590e0 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 590e8 .cfa: x29 336 + +STACK CFI 590ec x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 590f4 x21: .cfa -304 + ^ +STACK CFI 5915c x21: x21 +STACK CFI 59164 x19: x19 x20: x20 +STACK CFI 59168 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 14 x21: .cfa -32 + ^ +STACK CFI 4c x21: x21 +STACK CFI 54 x19: x19 x20: x20 +STACK CFI 58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5916c 1a0 .cfa: sp 0 + .ra: x30 +STACK CFI 59170 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 59174 .cfa: x29 96 + +STACK CFI 59184 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 592f8 x19: x19 x20: x20 +STACK CFI 592fc x21: x21 x22: x22 +STACK CFI 59300 x23: x23 x24: x24 +STACK CFI 59304 x25: x25 x26: x26 +STACK CFI 59308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5930c 50 .cfa: sp 0 + .ra: x30 +STACK CFI 59310 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 59314 .cfa: x29 48 + +STACK CFI 59318 x19: .cfa -32 + ^ +STACK CFI 59354 x19: x19 +STACK CFI 59358 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5935c c8 .cfa: sp 0 + .ra: x30 +STACK CFI 59360 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 59364 .cfa: x29 96 + +STACK CFI 59370 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ +STACK CFI 59414 x21: x21 +STACK CFI 5941c x19: x19 x20: x20 +STACK CFI 59420 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 50 x19: x19 x20: x20 +STACK CFI 54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1f0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 8 .cfa: x29 160 + +STACK CFI 20 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ +STACK CFI 1dc x25: x25 +STACK CFI 1e0 x19: x19 x20: x20 +STACK CFI 1e4 x21: x21 x22: x22 +STACK CFI 1e8 x23: x23 x24: x24 +STACK CFI 1ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 59428 64 .cfa: sp 0 + .ra: x30 +STACK CFI 5942c .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI 59434 .cfa: x29 336 + +STACK CFI 59438 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 59448 x21: .cfa -304 + ^ +STACK CFI 59480 x21: x21 +STACK CFI 59484 x19: x19 x20: x20 +STACK CFI 59488 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 59498 f8 .cfa: sp 0 + .ra: x30 +STACK CFI 5949c .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 594a0 .cfa: x29 96 + +STACK CFI 594ac x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 594d0 x25: .cfa -32 + ^ +STACK CFI 5957c x25: x25 +STACK CFI 59580 x19: x19 x20: x20 +STACK CFI 59584 x21: x21 x22: x22 +STACK CFI 59588 x23: x23 x24: x24 +STACK CFI 5958c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5457c 48 .cfa: sp 0 + .ra: x30 +STACK CFI 54580 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5458c .cfa: x29 16 + +STACK CFI 545c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 545c4 11c .cfa: sp 0 + .ra: x30 +STACK CFI 545c8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 545cc .cfa: x29 64 + +STACK CFI 545d4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 546d4 x21: x21 +STACK CFI 546d8 x19: x19 x20: x20 +STACK CFI 546dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI 14 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 20 x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 120 x19: x19 x20: x20 +STACK CFI 124 x21: x21 x22: x22 +STACK CFI 128 x23: x23 x24: x24 +STACK CFI 12c x25: x25 x26: x26 +STACK CFI 130 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 59590 108 .cfa: sp 0 + .ra: x30 +STACK CFI 59594 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 59598 .cfa: x29 64 + +STACK CFI 595a0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 5968c x19: x19 x20: x20 +STACK CFI 59690 x21: x21 x22: x22 +STACK CFI 59694 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 59698 1d4 .cfa: sp 0 + .ra: x30 +STACK CFI 5969c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 596a0 .cfa: x29 112 + +STACK CFI 596a8 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 59860 x19: x19 x20: x20 +STACK CFI 59864 x21: x21 x22: x22 +STACK CFI 59868 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5986c 7c .cfa: sp 0 + .ra: x30 +STACK CFI 59870 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 59874 .cfa: x29 128 + +STACK CFI 59878 x19: .cfa -112 + ^ x20: .cfa -104 + ^ +STACK CFI 59884 x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 598dc x19: x19 x20: x20 +STACK CFI 598e0 x21: x21 x22: x22 +STACK CFI 598e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI c .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 44 x19: x19 x20: x20 +STACK CFI 48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 26294 54 .cfa: sp 0 + .ra: x30 +STACK CFI 26298 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 2629c .cfa: x29 64 + +STACK CFI 262a0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 262e0 x19: x19 x20: x20 +STACK CFI 262e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 118 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 8 .cfa: x29 208 + +STACK CFI 24 x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ +STACK CFI 108 x23: x23 +STACK CFI 10c x19: x19 x20: x20 +STACK CFI 110 x21: x21 x22: x22 +STACK CFI 114 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 224 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 736 + +STACK CFI c .cfa: sp 816 + .ra: .cfa -808 + ^ x29: .cfa -816 + ^ +STACK CFI 10 .cfa: x29 816 + +STACK CFI 18 x23: .cfa -768 + ^ x24: .cfa -760 + ^ x25: .cfa -752 + ^ x26: .cfa -744 + ^ +STACK CFI 28 x19: .cfa -800 + ^ x20: .cfa -792 + ^ x21: .cfa -784 + ^ x22: .cfa -776 + ^ +STACK CFI 20c x19: x19 x20: x20 +STACK CFI 210 x21: x21 x22: x22 +STACK CFI 214 x23: x23 x24: x24 +STACK CFI 218 x25: x25 x26: x26 +STACK CFI 21c .cfa: sp 736 + .ra: .ra x29: x29 +STACK CFI 220 .cfa: sp 656 + +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 220 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 736 + +STACK CFI c .cfa: sp 816 + .ra: .cfa -808 + ^ x29: .cfa -816 + ^ +STACK CFI 10 .cfa: x29 816 + +STACK CFI 18 x23: .cfa -768 + ^ x24: .cfa -760 + ^ x25: .cfa -752 + ^ x26: .cfa -744 + ^ +STACK CFI 28 x19: .cfa -800 + ^ x20: .cfa -792 + ^ x21: .cfa -784 + ^ x22: .cfa -776 + ^ +STACK CFI 208 x19: x19 x20: x20 +STACK CFI 20c x21: x21 x22: x22 +STACK CFI 210 x23: x23 x24: x24 +STACK CFI 214 x25: x25 x26: x26 +STACK CFI 218 .cfa: sp 736 + .ra: .ra x29: x29 +STACK CFI 21c .cfa: sp 656 + +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 264 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 8 .cfa: x29 144 + +STACK CFI 18 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ +STACK CFI 250 x25: x25 +STACK CFI 254 x19: x19 x20: x20 +STACK CFI 258 x21: x21 x22: x22 +STACK CFI 25c x23: x23 x24: x24 +STACK CFI 260 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 14 .cfa: x29 32 + +STACK CFI 2c x19: .cfa -16 + ^ +STACK CFI 3c x19: x19 +STACK CFI 40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 14 .cfa: x29 32 + +STACK CFI 2c x19: .cfa -16 + ^ +STACK CFI 3c x19: x19 +STACK CFI 40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 2c4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI c .cfa: x29 160 + +STACK CFI 1c x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ +STACK CFI 2b0 x19: x19 x20: x20 +STACK CFI 2b4 x21: x21 x22: x22 +STACK CFI 2b8 x23: x23 x24: x24 +STACK CFI 2bc x25: x25 x26: x26 +STACK CFI 2c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 598e8 104 .cfa: sp 0 + .ra: x30 +STACK CFI 598ec .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 598f0 .cfa: x29 160 + +STACK CFI 598f8 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 599e0 x19: x19 x20: x20 +STACK CFI 599e4 x21: x21 x22: x22 +STACK CFI 599e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 599ec 1c8 .cfa: sp 0 + .ra: x30 +STACK CFI 599f0 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 599f4 .cfa: x29 160 + +STACK CFI 59a00 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ +STACK CFI 59a18 x21: .cfa -128 + ^ x22: .cfa -120 + ^ x27: .cfa -80 + ^ x28: .cfa -72 + ^ +STACK CFI 59b9c x19: x19 x20: x20 +STACK CFI 59ba0 x21: x21 x22: x22 +STACK CFI 59ba4 x23: x23 x24: x24 +STACK CFI 59ba8 x25: x25 x26: x26 +STACK CFI 59bac x27: x27 x28: x28 +STACK CFI 59bb0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 59bb4 154 .cfa: sp 0 + .ra: x30 +STACK CFI 59bb8 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 59bbc .cfa: x29 224 + +STACK CFI 59bc8 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ x25: .cfa -160 + ^ x26: .cfa -152 + ^ +STACK CFI 59bf4 x27: .cfa -144 + ^ x28: .cfa -136 + ^ +STACK CFI 59c00 x21: .cfa -192 + ^ x22: .cfa -184 + ^ +STACK CFI 59cf0 x19: x19 x20: x20 +STACK CFI 59cf4 x21: x21 x22: x22 +STACK CFI 59cf8 x23: x23 x24: x24 +STACK CFI 59cfc x25: x25 x26: x26 +STACK CFI 59d00 x27: x27 x28: x28 +STACK CFI 59d04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 59d08 64 .cfa: sp 0 + .ra: x30 +STACK CFI 59d0c .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 59d10 .cfa: x29 96 + +STACK CFI 59d14 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 59d20 x21: .cfa -64 + ^ +STACK CFI 59d60 x21: x21 +STACK CFI 59d64 x19: x19 x20: x20 +STACK CFI 59d68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 59d6c 380 .cfa: sp 0 + .ra: x30 +STACK CFI 59d70 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 59d74 .cfa: x29 128 + +STACK CFI 59d78 x19: .cfa -112 + ^ x20: .cfa -104 + ^ +STACK CFI 59d88 x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ +STACK CFI 5a0dc x19: x19 x20: x20 +STACK CFI 5a0e0 x21: x21 x22: x22 +STACK CFI 5a0e4 x23: x23 +STACK CFI 5a0e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a0ec 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5a100 134 .cfa: sp 0 + .ra: x30 +STACK CFI 5a104 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5a10c .cfa: x29 64 + +STACK CFI 5a118 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 5a228 x19: x19 x20: x20 +STACK CFI 5a22c x21: x21 x22: x22 +STACK CFI 5a230 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a234 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 5a238 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5a23c .cfa: x29 64 + +STACK CFI 5a244 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 5a2f0 x19: x19 x20: x20 +STACK CFI 5a2f4 x21: x21 x22: x22 +STACK CFI 5a2f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a2fc 1c .cfa: sp 0 + .ra: x30 +STACK CFI 5a300 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5a308 .cfa: x29 16 + +STACK CFI 5a314 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a318 2a4 .cfa: sp 0 + .ra: x30 +STACK CFI 5a31c .cfa: sp 368 + .ra: .cfa -360 + ^ x29: .cfa -368 + ^ +STACK CFI 5a320 .cfa: x29 368 + +STACK CFI 5a324 v8: .cfa -272 + ^ v9: .cfa -264 + ^ +STACK CFI 5a32c x21: .cfa -336 + ^ x22: .cfa -328 + ^ +STACK CFI 5a338 x23: .cfa -320 + ^ x24: .cfa -312 + ^ +STACK CFI 5a348 x19: .cfa -352 + ^ x20: .cfa -344 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ +STACK CFI 5a354 x27: .cfa -288 + ^ x28: .cfa -280 + ^ +STACK CFI 5a578 v8: v8 v9: v9 +STACK CFI 5a57c x19: x19 x20: x20 +STACK CFI 5a580 x21: x21 x22: x22 +STACK CFI 5a584 x23: x23 x24: x24 +STACK CFI 5a588 x25: x25 x26: x26 +STACK CFI 5a58c x27: x27 x28: x28 +STACK CFI 5a590 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 5a594 .cfa: x29 368 + .ra: .cfa -360 + ^ v8: .cfa -272 + ^ v9: .cfa -264 + ^ x19: .cfa -352 + ^ x20: .cfa -344 + ^ x21: .cfa -336 + ^ x22: .cfa -328 + ^ x23: .cfa -320 + ^ x24: .cfa -312 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ x27: .cfa -288 + ^ x28: .cfa -280 + ^ x29: .cfa -368 + ^ +STACK CFI INIT 5a5bc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 5a5c0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5a5c8 .cfa: x29 32 + +STACK CFI 5a5dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 31b50 60 .cfa: sp 0 + .ra: x30 +STACK CFI 31b54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 31b60 .cfa: x29 32 + +STACK CFI 31b64 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 31ba8 x19: x19 x20: x20 +STACK CFI 31bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a5e0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 5a5e4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5a5e8 .cfa: x29 64 + +STACK CFI 5a5f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 5a65c x23: x23 +STACK CFI 5a660 x19: x19 x20: x20 +STACK CFI 5a664 x21: x21 x22: x22 +STACK CFI 5a668 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a66c 58 .cfa: sp 0 + .ra: x30 +STACK CFI 5a670 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 5a674 .cfa: x29 48 + +STACK CFI 5a67c x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 5a6b8 x19: x19 x20: x20 +STACK CFI 5a6bc x21: x21 +STACK CFI 5a6c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a6c4 44 .cfa: sp 0 + .ra: x30 +STACK CFI 5a6c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5a6cc .cfa: x29 32 + +STACK CFI 5a6d0 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 5a700 x19: x19 x20: x20 +STACK CFI 5a704 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a708 3c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5a744 9c .cfa: sp 0 + .ra: x30 +STACK CFI 5a748 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5a74c .cfa: x29 64 + +STACK CFI 5a750 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 5a758 x21: .cfa -32 + ^ +STACK CFI 5a7d4 x19: x19 x20: x20 +STACK CFI 5a7d8 x21: x21 +STACK CFI 5a7dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a7e0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 5a7ec .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5a7f4 .cfa: x29 16 + +STACK CFI 5a828 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a82c 144 .cfa: sp 0 + .ra: x30 +STACK CFI 5a830 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5a834 .cfa: x29 64 + +STACK CFI 5a838 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 5a844 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 5a854 x23: .cfa -16 + ^ +STACK CFI 5a960 x23: x23 +STACK CFI 5a964 x19: x19 x20: x20 +STACK CFI 5a968 x21: x21 x22: x22 +STACK CFI 5a96c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5a970 154 .cfa: sp 0 + .ra: x30 +STACK CFI 5a974 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5a978 .cfa: x29 160 + +STACK CFI 5a97c x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 5a98c x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ +STACK CFI 5a99c x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 5aab0 x25: x25 +STACK CFI 5aab4 x19: x19 x20: x20 +STACK CFI 5aab8 x21: x21 x22: x22 +STACK CFI 5aabc x23: x23 x24: x24 +STACK CFI 5aac0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5aac4 124 .cfa: sp 0 + .ra: x30 +STACK CFI 5aac8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 5aacc .cfa: x29 96 + +STACK CFI 5aadc x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 5abd4 x21: x21 x22: x22 +STACK CFI 5abd8 x19: x19 x20: x20 +STACK CFI 5abdc x23: x23 x24: x24 +STACK CFI 5abe0 x25: x25 +STACK CFI 5abe4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5abe8 50 .cfa: sp 0 + .ra: x30 +STACK CFI 5abec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5abf8 .cfa: x29 32 + +STACK CFI 5ac34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5ac38 28 .cfa: sp 0 + .ra: x30 +STACK CFI 5ac3c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5ac40 .cfa: x29 32 + +STACK CFI 5ac5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5ac60 5c .cfa: sp 0 + .ra: x30 +STACK CFI 5ac64 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5ac68 .cfa: x29 32 + +STACK CFI 5ac6c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 5aca8 x19: x19 x20: x20 +STACK CFI 5acac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 5acb0 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 5acb4 x19: x19 x20: x20 +STACK CFI 5acb8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5acbc 244 .cfa: sp 0 + .ra: x30 +STACK CFI 5acc0 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 5acc4 .cfa: x29 96 + +STACK CFI 5acc8 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 5acd8 x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 5acfc x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 5aeec x25: x25 +STACK CFI 5aef0 x19: x19 x20: x20 +STACK CFI 5aef4 x21: x21 x22: x22 +STACK CFI 5aef8 x23: x23 x24: x24 +STACK CFI 5aefc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5af00 44 .cfa: sp 0 + .ra: x30 +STACK CFI 5af04 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5af0c .cfa: x29 32 + +STACK CFI 5af10 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 5af3c x19: x19 x20: x20 +STACK CFI 5af40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5af44 5c .cfa: sp 0 + .ra: x30 +STACK CFI 5af48 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 5af4c .cfa: x29 48 + +STACK CFI 5af50 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 5af98 x19: x19 x20: x20 +STACK CFI 5af9c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5afa0 244 .cfa: sp 0 + .ra: x30 +STACK CFI 5afa8 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 5afac .cfa: x29 384 + +STACK CFI 5afc0 x19: .cfa -368 + ^ x20: .cfa -360 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ x23: .cfa -336 + ^ x24: .cfa -328 + ^ x25: .cfa -320 + ^ x26: .cfa -312 + ^ +STACK CFI 5b1d0 x19: x19 x20: x20 +STACK CFI 5b1d4 x21: x21 x22: x22 +STACK CFI 5b1d8 x23: x23 x24: x24 +STACK CFI 5b1dc x25: x25 x26: x26 +STACK CFI 5b1e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b1e4 18 .cfa: sp 0 + .ra: x30 +STACK CFI 5b1e8 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5b1ec .cfa: x29 16 + +STACK CFI 5b1f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 38 x19: x19 x20: x20 +STACK CFI 3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 40 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 58 x19: x19 x20: x20 +STACK CFI 5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 3c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 50 x19: x19 +STACK CFI 54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b1fc 4c .cfa: sp 0 + .ra: x30 +STACK CFI 5b200 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 5b204 .cfa: x29 48 + +STACK CFI 5b208 x19: .cfa -32 + ^ +STACK CFI 5b240 x19: x19 +STACK CFI 5b244 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b248 28 .cfa: sp 0 + .ra: x30 +STACK CFI 5b24c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5b250 .cfa: x29 16 + +STACK CFI 5b25c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b270 28 .cfa: sp 0 + .ra: x30 +STACK CFI 5b274 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5b278 .cfa: x29 16 + +STACK CFI 5b284 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 30 x19: x19 +STACK CFI 34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI 10 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ +STACK CFI 60 x21: x21 +STACK CFI 64 x19: x19 x20: x20 +STACK CFI 68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b298 14 .cfa: sp 0 + .ra: x30 +STACK CFI 5b29c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5b2a0 .cfa: x29 16 + +STACK CFI 5b2a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b2ac 5c .cfa: sp 0 + .ra: x30 +STACK CFI 5b2b0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5b2b4 .cfa: x29 32 + +STACK CFI 5b2b8 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 5b2f4 x19: x19 x20: x20 +STACK CFI 5b2f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 5b2fc .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 5b300 x19: x19 x20: x20 +STACK CFI 5b304 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b308 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 5b30c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5b310 .cfa: x29 160 + +STACK CFI 5b314 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 5b320 x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 5b3c4 x19: x19 x20: x20 +STACK CFI 5b3c8 x21: x21 x22: x22 +STACK CFI 5b3cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI 2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b3d0 50 .cfa: sp 0 + .ra: x30 +STACK CFI 5b3d4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5b3d8 .cfa: x29 64 + +STACK CFI 5b3e0 x19: .cfa -48 + ^ +STACK CFI 5b418 x19: x19 +STACK CFI 5b41c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b420 38 .cfa: sp 0 + .ra: x30 +STACK CFI 5b424 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5b428 .cfa: x29 32 + +STACK CFI 5b42c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 5b450 x19: x19 x20: x20 +STACK CFI 5b454 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b458 5c .cfa: sp 0 + .ra: x30 +STACK CFI 5b45c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 5b460 .cfa: x29 48 + +STACK CFI 5b464 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 5b4ac x19: x19 x20: x20 +STACK CFI 5b4b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b4b4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 5b4b8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5b4bc .cfa: x29 32 + +STACK CFI 5b4c0 x19: .cfa -16 + ^ +STACK CFI 5b4d0 x19: x19 +STACK CFI 5b4d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b4d8 228 .cfa: sp 0 + .ra: x30 +STACK CFI 5b4dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5b4e0 .cfa: x29 64 + +STACK CFI 5b4e4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 5b4f0 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 5b6f4 x19: x19 x20: x20 +STACK CFI 5b6f8 x21: x21 x22: x22 +STACK CFI 5b6fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b700 24 .cfa: sp 0 + .ra: x30 +STACK CFI 5b704 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5b708 .cfa: x29 32 + +STACK CFI 5b70c x19: .cfa -16 + ^ +STACK CFI 5b71c x19: x19 +STACK CFI 5b720 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI e4 x23: x23 +STACK CFI e8 x19: x19 x20: x20 +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 18 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 78 x19: x19 x20: x20 +STACK CFI 7c x21: x21 x22: x22 +STACK CFI 80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b724 e4 .cfa: sp 0 + .ra: x30 +STACK CFI 5b728 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5b72c .cfa: x29 160 + +STACK CFI 5b730 x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 5b740 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 5b750 x23: .cfa -112 + ^ x24: .cfa -104 + ^ +STACK CFI 5b7f8 x19: x19 x20: x20 +STACK CFI 5b7fc x21: x21 x22: x22 +STACK CFI 5b800 x23: x23 x24: x24 +STACK CFI 5b804 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 124 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 114 x19: x19 x20: x20 +STACK CFI 118 x21: x21 x22: x22 +STACK CFI 11c x23: x23 +STACK CFI 120 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 88 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 1c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 7c x19: x19 x20: x20 +STACK CFI 80 x21: x21 x22: x22 +STACK CFI 84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b808 18c .cfa: sp 0 + .ra: x30 +STACK CFI 5b80c .cfa: sp 288 + .ra: .cfa -280 + ^ x29: .cfa -288 + ^ +STACK CFI 5b810 .cfa: x29 288 + +STACK CFI 5b814 x19: .cfa -272 + ^ x20: .cfa -264 + ^ +STACK CFI 5b834 x21: .cfa -256 + ^ x22: .cfa -248 + ^ x23: .cfa -240 + ^ x24: .cfa -232 + ^ x25: .cfa -224 + ^ +STACK CFI 5b97c x25: x25 +STACK CFI 5b984 x19: x19 x20: x20 +STACK CFI 5b988 x21: x21 x22: x22 +STACK CFI 5b98c x23: x23 x24: x24 +STACK CFI 5b990 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5b994 1f8 .cfa: sp 0 + .ra: x30 +STACK CFI 5b998 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI 5b99c .cfa: x29 272 + +STACK CFI 5b9bc v10: .cfa -160 + ^ v11: .cfa -152 + ^ v12: .cfa -144 + ^ v8: .cfa -176 + ^ v9: .cfa -168 + ^ x19: .cfa -256 + ^ x20: .cfa -248 + ^ x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ x25: .cfa -208 + ^ x26: .cfa -200 + ^ x27: .cfa -192 + ^ x28: .cfa -184 + ^ +STACK CFI 5bb68 v10: v10 v11: v11 +STACK CFI 5bb6c x19: x19 x20: x20 +STACK CFI 5bb70 v8: v8 v9: v9 +STACK CFI 5bb74 x21: x21 x22: x22 +STACK CFI 5bb78 x23: x23 x24: x24 +STACK CFI 5bb7c x25: x25 x26: x26 +STACK CFI 5bb80 x27: x27 x28: x28 +STACK CFI 5bb84 v12: v12 +STACK CFI 5bb88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5bb8c 58 .cfa: sp 0 + .ra: x30 +STACK CFI 5bb90 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 5bb94 .cfa: x29 96 + +STACK CFI 5bb9c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ +STACK CFI 5bbd8 x21: x21 +STACK CFI 5bbdc x19: x19 x20: x20 +STACK CFI 5bbe0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5bbe4 48 .cfa: sp 0 + .ra: x30 +STACK CFI 5bbe8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 5bbf0 .cfa: x29 96 + +STACK CFI 5bbf4 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 5bc24 x19: x19 x20: x20 +STACK CFI 5bc28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5bc2c 9c .cfa: sp 0 + .ra: x30 +STACK CFI 5bc30 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 5bc34 .cfa: x29 144 + +STACK CFI 5bc38 x21: .cfa -112 + ^ +STACK CFI 5bc44 x19: .cfa -128 + ^ x20: .cfa -120 + ^ +STACK CFI 5bcbc x21: x21 +STACK CFI 5bcc0 x19: x19 x20: x20 +STACK CFI 5bcc4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5bcc8 6c .cfa: sp 0 + .ra: x30 +STACK CFI 5bccc .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5bcd0 .cfa: x29 160 + +STACK CFI 5bcd4 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 5bcdc x21: .cfa -128 + ^ +STACK CFI 5bd28 x21: x21 +STACK CFI 5bd2c x19: x19 x20: x20 +STACK CFI 5bd30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5bd34 228 .cfa: sp 0 + .ra: x30 +STACK CFI 5bd38 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 5bd3c .cfa: x29 224 + +STACK CFI 5bd40 x21: .cfa -192 + ^ x22: .cfa -184 + ^ +STACK CFI 5bd50 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 5bf4c x19: x19 x20: x20 +STACK CFI 5bf50 x21: x21 x22: x22 +STACK CFI 5bf54 x23: x23 x24: x24 +STACK CFI 5bf58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5bf5c 64 .cfa: sp 0 + .ra: x30 +STACK CFI 5bf60 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5bf64 .cfa: x29 32 + +STACK CFI 5bf68 x19: .cfa -16 + ^ +STACK CFI 5bfac x19: x19 +STACK CFI 5bfb0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 5bfb4 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 5bfb8 x19: x19 +STACK CFI 5bfbc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5bfc0 94 .cfa: sp 0 + .ra: x30 +STACK CFI 5bfc4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 5bfc8 .cfa: x29 144 + +STACK CFI 5bfcc x19: .cfa -128 + ^ x20: .cfa -120 + ^ +STACK CFI 5bfd8 x21: .cfa -112 + ^ x22: .cfa -104 + ^ +STACK CFI 5c048 x19: x19 x20: x20 +STACK CFI 5c04c x21: x21 x22: x22 +STACK CFI 5c050 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5c054 a0 .cfa: sp 0 + .ra: x30 +STACK CFI 5c058 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 5c05c .cfa: x29 176 + +STACK CFI 5c060 x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 5c06c x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 5c0e8 x19: x19 x20: x20 +STACK CFI 5c0ec x21: x21 x22: x22 +STACK CFI 5c0f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 10 .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 x21: x21 x22: x22 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 240 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 8 .cfa: x29 176 + +STACK CFI 1c x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ x24: .cfa -120 + ^ x25: .cfa -112 + ^ x26: .cfa -104 + ^ x27: .cfa -96 + ^ x28: .cfa -88 + ^ +STACK CFI 228 x19: x19 x20: x20 +STACK CFI 22c x21: x21 x22: x22 +STACK CFI 230 x23: x23 x24: x24 +STACK CFI 234 x25: x25 x26: x26 +STACK CFI 238 x27: x27 x28: x28 +STACK CFI 23c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI 10 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ +STACK CFI 60 x21: x21 +STACK CFI 64 x19: x19 x20: x20 +STACK CFI 68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5c0f4 314 .cfa: sp 0 + .ra: x30 +STACK CFI 5c0f8 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 5c0fc .cfa: x29 112 + +STACK CFI 5c110 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ +STACK CFI 5c3f0 x27: x27 +STACK CFI 5c3f4 x19: x19 x20: x20 +STACK CFI 5c3f8 x21: x21 x22: x22 +STACK CFI 5c3fc x23: x23 x24: x24 +STACK CFI 5c400 x25: x25 x26: x26 +STACK CFI 5c404 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5c408 bc .cfa: sp 0 + .ra: x30 +STACK CFI 5c40c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5c410 .cfa: x29 32 + +STACK CFI 5c414 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 5c4bc x19: x19 x20: x20 +STACK CFI 5c4c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5c4c4 10c .cfa: sp 0 + .ra: x30 +STACK CFI 5c4c8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5c4cc .cfa: x29 64 + +STACK CFI 5c4d8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 5c5c0 x19: x19 x20: x20 +STACK CFI 5c5c4 x21: x21 x22: x22 +STACK CFI 5c5c8 x23: x23 +STACK CFI 5c5cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5c5d0 100 .cfa: sp 0 + .ra: x30 +STACK CFI 5c5d4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5c5d8 .cfa: x29 64 + +STACK CFI 5c5e4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 5c6c0 x19: x19 x20: x20 +STACK CFI 5c6c4 x21: x21 x22: x22 +STACK CFI 5c6c8 x23: x23 +STACK CFI 5c6cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5c6d0 3fc .cfa: sp 0 + .ra: x30 +STACK CFI 5c6d4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5c6dc .cfa: x29 160 + +STACK CFI 5c6e8 v10: .cfa -48 + ^ v11: .cfa -40 + ^ v8: .cfa -64 + ^ v9: .cfa -56 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 5c6fc x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ x28: .cfa -72 + ^ +STACK CFI 5caac v8: v8 v9: v9 +STACK CFI 5cab0 x19: x19 x20: x20 +STACK CFI 5cab4 v10: v10 v11: v11 +STACK CFI 5cab8 x21: x21 x22: x22 +STACK CFI 5cabc x23: x23 x24: x24 +STACK CFI 5cac0 x25: x25 x26: x26 +STACK CFI 5cac4 x27: x27 x28: x28 +STACK CFI 5cac8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5cacc cc .cfa: sp 0 + .ra: x30 +STACK CFI 5cad4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 5cad8 .cfa: x29 48 + +STACK CFI 5cae4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 5cb8c x21: x21 +STACK CFI 5cb90 x19: x19 x20: x20 +STACK CFI 5cb94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5cb98 70 .cfa: sp 0 + .ra: x30 +STACK CFI 5cb9c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5cba0 .cfa: x29 160 + +STACK CFI 5cba8 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 5cbfc x19: x19 x20: x20 +STACK CFI 5cc00 x21: x21 x22: x22 +STACK CFI 5cc04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5cc08 70 .cfa: sp 0 + .ra: x30 +STACK CFI 5cc0c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5cc10 .cfa: x29 160 + +STACK CFI 5cc18 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 5cc6c x19: x19 x20: x20 +STACK CFI 5cc70 x21: x21 x22: x22 +STACK CFI 5cc74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5cc78 88 .cfa: sp 0 + .ra: x30 +STACK CFI 5cc7c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5cc80 .cfa: x29 160 + +STACK CFI 5cc84 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 5cc90 x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 5ccf4 x19: x19 x20: x20 +STACK CFI 5ccf8 x21: x21 x22: x22 +STACK CFI 5ccfc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5cd00 ac .cfa: sp 0 + .ra: x30 +STACK CFI 5cd04 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 5cd0c .cfa: x29 80 + +STACK CFI 5cd10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 5cda4 x19: x19 x20: x20 +STACK CFI 5cda8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5cdac 18c .cfa: sp 0 + .ra: x30 +STACK CFI 5cdb4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5cdb8 .cfa: x29 160 + +STACK CFI 5cdc4 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 5cf2c x19: x19 x20: x20 +STACK CFI 5cf30 x21: x21 x22: x22 +STACK CFI 5cf34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5cf38 2a0 .cfa: sp 0 + .ra: x30 +STACK CFI 5cf40 .cfa: sp 864 + +STACK CFI 5cf48 .cfa: sp 960 + .ra: .cfa -952 + ^ x29: .cfa -960 + ^ +STACK CFI 5cf4c .cfa: x29 960 + +STACK CFI 5cf5c x21: .cfa -928 + ^ x22: .cfa -920 + ^ +STACK CFI 5cf74 x19: .cfa -944 + ^ x20: .cfa -936 + ^ x23: .cfa -912 + ^ x24: .cfa -904 + ^ x25: .cfa -896 + ^ x26: .cfa -888 + ^ x27: .cfa -880 + ^ x28: .cfa -872 + ^ +STACK CFI 5d1bc x19: x19 x20: x20 +STACK CFI 5d1c0 x21: x21 x22: x22 +STACK CFI 5d1c4 x23: x23 x24: x24 +STACK CFI 5d1c8 x25: x25 x26: x26 +STACK CFI 5d1cc x27: x27 x28: x28 +STACK CFI 5d1d0 .cfa: sp 864 + .ra: .ra x29: x29 +STACK CFI 5d1d4 .cfa: sp 768 + +STACK CFI INIT 5d1d8 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 5d1dc .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 5d1e0 .cfa: x29 224 + +STACK CFI 5d1ec x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 5d2a8 x19: x19 x20: x20 +STACK CFI 5d2ac x21: x21 x22: x22 +STACK CFI 5d2b0 x23: x23 x24: x24 +STACK CFI 5d2b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5d2b8 54 .cfa: sp 0 + .ra: x30 +STACK CFI 5d2bc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5d2c0 .cfa: x29 32 + +STACK CFI 5d2c4 x19: .cfa -16 + ^ +STACK CFI 5d304 x19: x19 +STACK CFI 5d308 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5d30c 8c .cfa: sp 0 + .ra: x30 +STACK CFI 5d310 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 5d314 .cfa: x29 80 + +STACK CFI 5d318 x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 5d328 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ +STACK CFI 5d388 x23: x23 +STACK CFI 5d38c x19: x19 x20: x20 +STACK CFI 5d390 x21: x21 x22: x22 +STACK CFI 5d394 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5d398 38 .cfa: sp 0 + .ra: x30 +STACK CFI 5d39c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5d3a0 .cfa: x29 32 + +STACK CFI 5d3a4 x19: .cfa -16 + ^ +STACK CFI 5d3c8 x19: x19 +STACK CFI 5d3cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5d3d0 374 .cfa: sp 0 + .ra: x30 +STACK CFI 5d3d4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 5d3d8 .cfa: x29 144 + +STACK CFI 5d3e0 x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ +STACK CFI 5d3f8 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x27: .cfa -64 + ^ +STACK CFI 5d72c x19: x19 x20: x20 +STACK CFI 5d730 x21: x21 x22: x22 +STACK CFI 5d734 x23: x23 x24: x24 +STACK CFI 5d738 x25: x25 x26: x26 +STACK CFI 5d73c x27: x27 +STACK CFI 5d740 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 130 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 10 .cfa: x29 144 + +STACK CFI 18 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ +STACK CFI 124 x21: x21 +STACK CFI 128 x19: x19 x20: x20 +STACK CFI 12c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI c .cfa: x29 416 + +STACK CFI 1c x19: .cfa -400 + ^ x20: .cfa -392 + ^ x21: .cfa -384 + ^ x22: .cfa -376 + ^ x23: .cfa -368 + ^ x24: .cfa -360 + ^ x25: .cfa -352 + ^ +STACK CFI 9c x25: x25 +STACK CFI a4 x19: x19 x20: x20 +STACK CFI a8 x21: x21 x22: x22 +STACK CFI ac x23: x23 x24: x24 +STACK CFI b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 3c x19: x19 +STACK CFI 40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 40 x19: x19 x20: x20 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1d8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 8 .cfa: x29 160 + +STACK CFI 14 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ +STACK CFI 28 x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ +STACK CFI 30 x21: .cfa -128 + ^ x22: .cfa -120 + ^ +STACK CFI 1c0 x27: x27 +STACK CFI 1c4 x19: x19 x20: x20 +STACK CFI 1c8 x21: x21 x22: x22 +STACK CFI 1cc x23: x23 x24: x24 +STACK CFI 1d0 x25: x25 x26: x26 +STACK CFI 1d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 10 .cfa: x29 48 + +STACK CFI 1c x19: .cfa -32 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 10 .cfa: x29 48 + +STACK CFI 1c x19: .cfa -32 + ^ +STACK CFI 40 x19: x19 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 40 x19: x19 x20: x20 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 14 x21: .cfa -32 + ^ +STACK CFI 44 x21: x21 +STACK CFI 4c x19: x19 x20: x20 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 374 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 8 .cfa: x29 144 + +STACK CFI 10 x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ +STACK CFI 28 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x27: .cfa -64 + ^ +STACK CFI 35c x19: x19 x20: x20 +STACK CFI 360 x21: x21 x22: x22 +STACK CFI 364 x23: x23 x24: x24 +STACK CFI 368 x25: x25 x26: x26 +STACK CFI 36c x27: x27 +STACK CFI 370 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5d744 150 .cfa: sp 0 + .ra: x30 +STACK CFI 5d748 .cfa: sp 496 + .ra: .cfa -488 + ^ x29: .cfa -496 + ^ +STACK CFI 5d74c .cfa: x29 496 + +STACK CFI 5d754 x19: .cfa -480 + ^ x20: .cfa -472 + ^ x27: .cfa -416 + ^ +STACK CFI 5d764 x21: .cfa -464 + ^ x22: .cfa -456 + ^ x23: .cfa -448 + ^ x24: .cfa -440 + ^ x25: .cfa -432 + ^ x26: .cfa -424 + ^ +STACK CFI 5d87c x27: x27 +STACK CFI 5d880 x19: x19 x20: x20 +STACK CFI 5d884 x21: x21 x22: x22 +STACK CFI 5d888 x23: x23 x24: x24 +STACK CFI 5d88c x25: x25 x26: x26 +STACK CFI 5d890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5d894 47c .cfa: sp 0 + .ra: x30 +STACK CFI 5d898 .cfa: sp 400 + .ra: .cfa -392 + ^ x29: .cfa -400 + ^ +STACK CFI 5d89c .cfa: x29 400 + +STACK CFI 5d8a4 v8: .cfa -304 + ^ v9: .cfa -296 + ^ x21: .cfa -368 + ^ x22: .cfa -360 + ^ +STACK CFI 5d8b8 v10: .cfa -288 + ^ v11: .cfa -280 + ^ x19: .cfa -384 + ^ x20: .cfa -376 + ^ +STACK CFI 5d8c4 x23: .cfa -352 + ^ x24: .cfa -344 + ^ x25: .cfa -336 + ^ x26: .cfa -328 + ^ +STACK CFI 5d8f0 v12: .cfa -272 + ^ x27: .cfa -320 + ^ x28: .cfa -312 + ^ +STACK CFI 5dcec v8: v8 v9: v9 +STACK CFI 5dcf0 x19: x19 x20: x20 +STACK CFI 5dcf4 x21: x21 x22: x22 +STACK CFI 5dcf8 v10: v10 v11: v11 +STACK CFI 5dcfc x23: x23 x24: x24 +STACK CFI 5dd00 x25: x25 x26: x26 +STACK CFI 5dd04 x27: x27 x28: x28 +STACK CFI 5dd08 v12: v12 +STACK CFI 5dd0c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5dd10 2e4 .cfa: sp 0 + .ra: x30 +STACK CFI 5dd14 .cfa: sp 240 + .ra: .cfa -232 + ^ x29: .cfa -240 + ^ +STACK CFI 5dd18 .cfa: x29 240 + +STACK CFI 5dd20 x19: .cfa -224 + ^ x20: .cfa -216 + ^ x21: .cfa -208 + ^ x22: .cfa -200 + ^ +STACK CFI 5dd2c x23: .cfa -192 + ^ x24: .cfa -184 + ^ +STACK CFI 5dd48 x25: .cfa -176 + ^ +STACK CFI 5dfe0 x25: x25 +STACK CFI 5dfe4 x19: x19 x20: x20 +STACK CFI 5dfe8 x21: x21 x22: x22 +STACK CFI 5dfec x23: x23 x24: x24 +STACK CFI 5dff0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5dff4 3ac .cfa: sp 0 + .ra: x30 +STACK CFI 5dff8 .cfa: sp 240 + .ra: .cfa -232 + ^ x29: .cfa -240 + ^ +STACK CFI 5dffc .cfa: x29 240 + +STACK CFI 5e004 x19: .cfa -224 + ^ x20: .cfa -216 + ^ x21: .cfa -208 + ^ x22: .cfa -200 + ^ +STACK CFI 5e010 x23: .cfa -192 + ^ x24: .cfa -184 + ^ +STACK CFI 5e02c x25: .cfa -176 + ^ +STACK CFI 5e38c x25: x25 +STACK CFI 5e390 x19: x19 x20: x20 +STACK CFI 5e394 x21: x21 x22: x22 +STACK CFI 5e398 x23: x23 x24: x24 +STACK CFI 5e39c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5e3a0 108 .cfa: sp 0 + .ra: x30 +STACK CFI 5e3a4 .cfa: sp 496 + .ra: .cfa -488 + ^ x29: .cfa -496 + ^ +STACK CFI 5e3a8 .cfa: x29 496 + +STACK CFI 5e3b0 x19: .cfa -480 + ^ x20: .cfa -472 + ^ x23: .cfa -448 + ^ x24: .cfa -440 + ^ +STACK CFI 5e3c8 x21: .cfa -464 + ^ x22: .cfa -456 + ^ +STACK CFI 5e498 x19: x19 x20: x20 +STACK CFI 5e49c x21: x21 x22: x22 +STACK CFI 5e4a0 x23: x23 x24: x24 +STACK CFI 5e4a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5e4a8 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 5e4ac .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 5e4b0 .cfa: x29 80 + +STACK CFI 5e4b8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 5e558 x21: x21 +STACK CFI 5e560 x19: x19 x20: x20 +STACK CFI 5e564 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5e568 5c .cfa: sp 0 + .ra: x30 +STACK CFI 5e56c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5e570 .cfa: x29 64 + +STACK CFI 5e574 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 5e57c x21: .cfa -32 + ^ +STACK CFI 5e5b4 x21: x21 +STACK CFI 5e5bc x19: x19 x20: x20 +STACK CFI 5e5c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5e5c4 d4 .cfa: sp 0 + .ra: x30 +STACK CFI 5e5c8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 5e5cc .cfa: x29 96 + +STACK CFI 5e5d0 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 5e690 x19: x19 x20: x20 +STACK CFI 5e694 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5e698 23c .cfa: sp 0 + .ra: x30 +STACK CFI 5e69c .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 5e6a4 .cfa: x29 176 + +STACK CFI 5e6a8 x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 5e6c0 x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ x24: .cfa -120 + ^ +STACK CFI 5e8c4 x19: x19 x20: x20 +STACK CFI 5e8c8 x21: x21 x22: x22 +STACK CFI 5e8cc x23: x23 x24: x24 +STACK CFI 5e8d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5e8d4 bc .cfa: sp 0 + .ra: x30 +STACK CFI 5e8dc .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 5e8e0 .cfa: x29 160 + +STACK CFI 5e8e8 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 5e988 x19: x19 x20: x20 +STACK CFI 5e98c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5e990 11c .cfa: sp 0 + .ra: x30 +STACK CFI 5e994 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 5e998 .cfa: x29 384 + +STACK CFI 5e99c x23: .cfa -336 + ^ x24: .cfa -328 + ^ +STACK CFI 5e9a4 x25: .cfa -320 + ^ +STACK CFI 5e9b4 x19: .cfa -368 + ^ x20: .cfa -360 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ +STACK CFI 5ea98 x25: x25 +STACK CFI 5ea9c x19: x19 x20: x20 +STACK CFI 5eaa0 x21: x21 x22: x22 +STACK CFI 5eaa4 x23: x23 x24: x24 +STACK CFI 5eaa8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5eaac 11c .cfa: sp 0 + .ra: x30 +STACK CFI 5eab0 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 5eab4 .cfa: x29 384 + +STACK CFI 5eab8 x25: .cfa -320 + ^ +STACK CFI 5eacc x19: .cfa -368 + ^ x20: .cfa -360 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ x23: .cfa -336 + ^ x24: .cfa -328 + ^ +STACK CFI 5ebb4 x25: x25 +STACK CFI 5ebb8 x19: x19 x20: x20 +STACK CFI 5ebbc x21: x21 x22: x22 +STACK CFI 5ebc0 x23: x23 x24: x24 +STACK CFI 5ebc4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5ebc8 124 .cfa: sp 0 + .ra: x30 +STACK CFI 5ebcc .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 5ebd0 .cfa: x29 384 + +STACK CFI 5ebd4 x25: .cfa -320 + ^ +STACK CFI 5ebe8 x19: .cfa -368 + ^ x20: .cfa -360 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ x23: .cfa -336 + ^ x24: .cfa -328 + ^ +STACK CFI 5ecd8 x25: x25 +STACK CFI 5ecdc x19: x19 x20: x20 +STACK CFI 5ece0 x21: x21 x22: x22 +STACK CFI 5ece4 x23: x23 x24: x24 +STACK CFI 5ece8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 336 + .ra: .cfa -328 + ^ x29: .cfa -336 + ^ +STACK CFI c .cfa: x29 336 + +STACK CFI 10 x19: .cfa -320 + ^ x20: .cfa -312 + ^ +STACK CFI 18 x21: .cfa -304 + ^ +STACK CFI 4c x21: x21 +STACK CFI 54 x19: x19 x20: x20 +STACK CFI 58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI c .cfa: x29 208 + +STACK CFI 18 x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ +STACK CFI fc x23: x23 +STACK CFI 100 x19: x19 x20: x20 +STACK CFI 104 x21: x21 x22: x22 +STACK CFI 108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI c .cfa: x29 208 + +STACK CFI 18 x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ +STACK CFI fc x23: x23 +STACK CFI 100 x19: x19 x20: x20 +STACK CFI 104 x21: x21 x22: x22 +STACK CFI 108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI c .cfa: x29 208 + +STACK CFI 18 x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ +STACK CFI fc x23: x23 +STACK CFI 100 x19: x19 x20: x20 +STACK CFI 104 x21: x21 x22: x22 +STACK CFI 108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI c .cfa: x29 208 + +STACK CFI 18 x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ +STACK CFI fc x23: x23 +STACK CFI 100 x19: x19 x20: x20 +STACK CFI 104 x21: x21 x22: x22 +STACK CFI 108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI c .cfa: x29 208 + +STACK CFI 18 x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ +STACK CFI fc x23: x23 +STACK CFI 100 x19: x19 x20: x20 +STACK CFI 104 x21: x21 x22: x22 +STACK CFI 108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5ecec 1a0 .cfa: sp 0 + .ra: x30 +STACK CFI 5ecf0 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 5ecf4 .cfa: x29 96 + +STACK CFI 5ecf8 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 5ed04 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 5ee78 x23: x23 +STACK CFI 5ee80 x21: x21 x22: x22 +STACK CFI 5ee84 x19: x19 x20: x20 +STACK CFI 5ee88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5ee90 63c .cfa: sp 0 + .ra: x30 +STACK CFI 5ee94 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 5ee98 .cfa: x29 192 + +STACK CFI 5eea0 v8: .cfa -96 + ^ v9: .cfa -88 + ^ x23: .cfa -144 + ^ x24: .cfa -136 + ^ +STACK CFI 5eeb8 x19: .cfa -176 + ^ x20: .cfa -168 + ^ x21: .cfa -160 + ^ x22: .cfa -152 + ^ x25: .cfa -128 + ^ x26: .cfa -120 + ^ x27: .cfa -112 + ^ x28: .cfa -104 + ^ +STACK CFI 5f4b0 v8: v8 v9: v9 +STACK CFI 5f4b4 x19: x19 x20: x20 +STACK CFI 5f4b8 x21: x21 x22: x22 +STACK CFI 5f4bc x23: x23 x24: x24 +STACK CFI 5f4c0 x25: x25 x26: x26 +STACK CFI 5f4c4 x27: x27 x28: x28 +STACK CFI 5f4c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 55018 48 .cfa: sp 0 + .ra: x30 +STACK CFI 5501c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 55020 .cfa: x29 32 + +STACK CFI 55024 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 55058 x19: x19 x20: x20 +STACK CFI 5505c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 238 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI c x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 24 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 220 x23: x23 x24: x24 +STACK CFI 224 x19: x19 x20: x20 +STACK CFI 228 x21: x21 x22: x22 +STACK CFI 22c x25: x25 x26: x26 +STACK CFI 230 x27: x27 x28: x28 +STACK CFI 234 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5f4d8 60 .cfa: sp 0 + .ra: x30 +STACK CFI 5f4dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 5f4e4 .cfa: x29 48 + +STACK CFI 5f4e8 x19: .cfa -32 + ^ +STACK CFI 5f530 x19: x19 +STACK CFI 5f534 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 5f538 58 .cfa: sp 0 + .ra: x30 +STACK CFI 5f53c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 5f540 .cfa: x29 32 + +STACK CFI 5f544 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 5f588 x19: x19 x20: x20 +STACK CFI 5f58c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 24 x19: x19 x20: x20 +STACK CFI 28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 238 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI c .cfa: x29 128 + +STACK CFI 10 x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 28 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 220 x23: x23 x24: x24 +STACK CFI 224 x19: x19 x20: x20 +STACK CFI 228 x21: x21 x22: x22 +STACK CFI 22c x25: x25 x26: x26 +STACK CFI 230 x27: x27 x28: x28 +STACK CFI 234 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 248 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 256 + .ra: .cfa -248 + ^ x29: .cfa -256 + ^ +STACK CFI 8 .cfa: x29 256 + +STACK CFI c x21: .cfa -224 + ^ x22: .cfa -216 + ^ +STACK CFI 28 x19: .cfa -240 + ^ x20: .cfa -232 + ^ x23: .cfa -208 + ^ x24: .cfa -200 + ^ x25: .cfa -192 + ^ x26: .cfa -184 + ^ x27: .cfa -176 + ^ +STACK CFI 230 x19: x19 x20: x20 +STACK CFI 234 x21: x21 x22: x22 +STACK CFI 238 x23: x23 x24: x24 +STACK CFI 23c x25: x25 x26: x26 +STACK CFI 240 x27: x27 +STACK CFI 244 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 8 .cfa: x29 112 + +STACK CFI c x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 14 x21: .cfa -80 + ^ +STACK CFI 9c x21: x21 +STACK CFI a0 x19: x19 x20: x20 +STACK CFI a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 8 .cfa: x29 160 + +STACK CFI 10 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ +STACK CFI 58 x21: x21 +STACK CFI 5c x19: x19 x20: x20 +STACK CFI 60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 24 x19: x19 +STACK CFI 28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 8 .cfa: x29 176 + +STACK CFI c x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 18 x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 80 x19: x19 x20: x20 +STACK CFI 84 x21: x21 x22: x22 +STACK CFI 88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5f590 244 .cfa: sp 0 + .ra: x30 +STACK CFI 5f594 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 5f598 .cfa: x29 128 + +STACK CFI 5f59c x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 5f5ac v8: .cfa -32 + ^ +STACK CFI 5f5c0 x25: .cfa -64 + ^ x26: .cfa -56 + ^ +STACK CFI 5f5dc x19: .cfa -112 + ^ x20: .cfa -104 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 5f7b8 x23: x23 x24: x24 +STACK CFI 5f7bc x19: x19 x20: x20 +STACK CFI 5f7c0 x21: x21 x22: x22 +STACK CFI 5f7c4 x25: x25 x26: x26 +STACK CFI 5f7c8 x27: x27 x28: x28 +STACK CFI 5f7cc v8: v8 +STACK CFI 5f7d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5f7d4 98 .cfa: sp 0 + .ra: x30 +STACK CFI 5f7d8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5f7dc .cfa: x29 64 + +STACK CFI 5f7e0 x19: .cfa -48 + ^ +STACK CFI 5f864 x19: x19 +STACK CFI 5f868 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5f86c 88 .cfa: sp 0 + .ra: x30 +STACK CFI 5f870 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 5f874 .cfa: x29 176 + +STACK CFI 5f878 x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 5f884 x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 5f8e8 x19: x19 x20: x20 +STACK CFI 5f8ec x21: x21 x22: x22 +STACK CFI 5f8f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5f8f4 148 .cfa: sp 0 + .ra: x30 +STACK CFI 5f8f8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 5f8fc .cfa: x29 96 + +STACK CFI 5f90c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 5fa28 x19: x19 x20: x20 +STACK CFI 5fa2c x21: x21 x22: x22 +STACK CFI 5fa30 x23: x23 x24: x24 +STACK CFI 5fa34 x25: x25 +STACK CFI 5fa38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5fa3c 1a4 .cfa: sp 0 + .ra: x30 +STACK CFI 5fa40 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI 5fa44 .cfa: x29 272 + +STACK CFI 5fa58 x19: .cfa -256 + ^ x20: .cfa -248 + ^ x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ x25: .cfa -208 + ^ x26: .cfa -200 + ^ x27: .cfa -192 + ^ +STACK CFI 5fbc8 x19: x19 x20: x20 +STACK CFI 5fbcc x21: x21 x22: x22 +STACK CFI 5fbd0 x23: x23 x24: x24 +STACK CFI 5fbd4 x25: x25 x26: x26 +STACK CFI 5fbd8 x27: x27 +STACK CFI 5fbdc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5fbe0 16c .cfa: sp 0 + .ra: x30 +STACK CFI 5fbe4 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 5fbec .cfa: x29 208 + +STACK CFI 5fbf0 x19: .cfa -192 + ^ x20: .cfa -184 + ^ +STACK CFI 5fc00 x21: .cfa -176 + ^ x22: .cfa -168 + ^ x25: .cfa -144 + ^ x26: .cfa -136 + ^ +STACK CFI 5fc24 x23: .cfa -160 + ^ x24: .cfa -152 + ^ +STACK CFI 5fd38 x19: x19 x20: x20 +STACK CFI 5fd3c x21: x21 x22: x22 +STACK CFI 5fd40 x23: x23 x24: x24 +STACK CFI 5fd44 x25: x25 x26: x26 +STACK CFI 5fd48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 124 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 38 x19: x19 x20: x20 +STACK CFI 3c x21: x21 x22: x22 +STACK CFI 40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 44 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 5fd4c dc .cfa: sp 0 + .ra: x30 +STACK CFI 5fd50 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 5fd58 .cfa: x29 64 + +STACK CFI 5fd60 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 5fe1c x19: x19 x20: x20 +STACK CFI 5fe20 x21: x21 x22: x22 +STACK CFI 5fe24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5fe28 fc .cfa: sp 0 + .ra: x30 +STACK CFI 5fe2c .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 5fe30 .cfa: x29 96 + +STACK CFI 5fe3c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 5ff14 x19: x19 x20: x20 +STACK CFI 5ff18 x21: x21 x22: x22 +STACK CFI 5ff1c x23: x23 +STACK CFI 5ff20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5ff24 2d4 .cfa: sp 0 + .ra: x30 +STACK CFI 5ff28 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 5ff2c .cfa: x29 112 + +STACK CFI 5ff3c x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ +STACK CFI 601e4 x25: x25 +STACK CFI 601e8 x19: x19 x20: x20 +STACK CFI 601ec x21: x21 x22: x22 +STACK CFI 601f0 x23: x23 x24: x24 +STACK CFI 601f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 601f8 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 601fc .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 60200 .cfa: x29 144 + +STACK CFI 6020c x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ +STACK CFI 602b0 x23: x23 +STACK CFI 602b4 x19: x19 x20: x20 +STACK CFI 602b8 x21: x21 x22: x22 +STACK CFI 602bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 602c0 1b4 .cfa: sp 0 + .ra: x30 +STACK CFI 602c4 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 602c8 .cfa: x29 224 + +STACK CFI 602cc x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 602dc v8: .cfa -128 + ^ +STACK CFI 602f4 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x25: .cfa -160 + ^ x26: .cfa -152 + ^ x27: .cfa -144 + ^ x28: .cfa -136 + ^ +STACK CFI 60458 x19: x19 x20: x20 +STACK CFI 6045c x21: x21 x22: x22 +STACK CFI 60460 x23: x23 x24: x24 +STACK CFI 60464 x25: x25 x26: x26 +STACK CFI 60468 x27: x27 x28: x28 +STACK CFI 6046c v8: v8 +STACK CFI 60470 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 60474 554 .cfa: sp 0 + .ra: x30 +STACK CFI 60478 .cfa: sp 432 + +STACK CFI 6047c .cfa: sp 592 + .ra: .cfa -584 + ^ x29: .cfa -592 + ^ +STACK CFI 60480 .cfa: x29 592 + +STACK CFI 60484 v8: .cfa -496 + ^ v9: .cfa -488 + ^ +STACK CFI 6048c v10: .cfa -480 + ^ v11: .cfa -472 + ^ +STACK CFI 60498 v12: .cfa -464 + ^ v13: .cfa -456 + ^ +STACK CFI 604a4 v14: .cfa -448 + ^ v15: .cfa -440 + ^ x23: .cfa -544 + ^ x24: .cfa -536 + ^ +STACK CFI 604bc x19: .cfa -576 + ^ x20: .cfa -568 + ^ x21: .cfa -560 + ^ x22: .cfa -552 + ^ x25: .cfa -528 + ^ x26: .cfa -520 + ^ x27: .cfa -512 + ^ x28: .cfa -504 + ^ +STACK CFI 60998 v8: v8 v9: v9 +STACK CFI 609a0 x19: x19 x20: x20 +STACK CFI 609a4 v10: v10 v11: v11 +STACK CFI 609a8 x21: x21 x22: x22 +STACK CFI 609ac v12: v12 v13: v13 +STACK CFI 609b0 x23: x23 x24: x24 +STACK CFI 609b4 v14: v14 v15: v15 +STACK CFI 609b8 x25: x25 x26: x26 +STACK CFI 609bc x27: x27 x28: x28 +STACK CFI 609c0 .cfa: sp 432 + .ra: .ra x29: x29 +STACK CFI 609c4 .cfa: sp 272 + +STACK CFI INIT 609c8 54 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 60a1c d4 .cfa: sp 0 + .ra: x30 +STACK CFI 60a20 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 60a24 .cfa: x29 80 + +STACK CFI 60a34 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ +STACK CFI 60adc x19: x19 x20: x20 +STACK CFI 60ae0 x21: x21 x22: x22 +STACK CFI 60ae4 x23: x23 x24: x24 +STACK CFI 60ae8 x25: x25 +STACK CFI 60aec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 60af0 224 .cfa: sp 0 + .ra: x30 +STACK CFI 60af4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 60af8 .cfa: x29 128 + +STACK CFI 60afc x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 60b14 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 60cfc x23: x23 x24: x24 +STACK CFI 60d00 x19: x19 x20: x20 +STACK CFI 60d04 x21: x21 x22: x22 +STACK CFI 60d08 x25: x25 x26: x26 +STACK CFI 60d0c x27: x27 x28: x28 +STACK CFI 60d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 60d14 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 60d18 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 60d20 .cfa: x29 112 + +STACK CFI 60d28 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ +STACK CFI 60dbc x19: x19 x20: x20 +STACK CFI 60dc0 x21: x21 +STACK CFI 60dc4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 60dc8 128 .cfa: sp 0 + .ra: x30 +STACK CFI 60dcc .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 60dd4 .cfa: x29 144 + +STACK CFI 60de4 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ +STACK CFI 60ed8 x25: x25 +STACK CFI 60ee0 x19: x19 x20: x20 +STACK CFI 60ee4 x21: x21 x22: x22 +STACK CFI 60ee8 x23: x23 x24: x24 +STACK CFI 60eec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 60ef0 22c .cfa: sp 0 + .ra: x30 +STACK CFI 60ef4 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 60ef8 .cfa: x29 192 + +STACK CFI 60efc x19: .cfa -176 + ^ x20: .cfa -168 + ^ +STACK CFI 60f10 x21: .cfa -160 + ^ x22: .cfa -152 + ^ x25: .cfa -128 + ^ +STACK CFI 60f20 x23: .cfa -144 + ^ x24: .cfa -136 + ^ +STACK CFI 61104 x25: x25 +STACK CFI 6110c x19: x19 x20: x20 +STACK CFI 61110 x21: x21 x22: x22 +STACK CFI 61114 x23: x23 x24: x24 +STACK CFI 61118 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6111c b0 .cfa: sp 0 + .ra: x30 +STACK CFI 61120 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 61124 .cfa: x29 176 + +STACK CFI 61128 x23: .cfa -128 + ^ x24: .cfa -120 + ^ +STACK CFI 61140 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 611bc x19: x19 x20: x20 +STACK CFI 611c0 x21: x21 x22: x22 +STACK CFI 611c4 x23: x23 x24: x24 +STACK CFI 611c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 8 .cfa: x29 176 + +STACK CFI 10 x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ +STACK CFI 28 x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI a0 x23: x23 +STACK CFI a4 x19: x19 x20: x20 +STACK CFI a8 x21: x21 x22: x22 +STACK CFI ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 8 .cfa: x29 176 + +STACK CFI c x23: .cfa -128 + ^ x24: .cfa -120 + ^ +STACK CFI 24 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI a0 x19: x19 x20: x20 +STACK CFI a4 x21: x21 x22: x22 +STACK CFI a8 x23: x23 x24: x24 +STACK CFI ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI c .cfa: x29 176 + +STACK CFI 14 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 90 x19: x19 x20: x20 +STACK CFI 94 x21: x21 x22: x22 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 611cc f4 .cfa: sp 0 + .ra: x30 +STACK CFI 611d4 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 611d8 .cfa: x29 112 + +STACK CFI 611f0 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI 612b0 x19: x19 x20: x20 +STACK CFI 612b4 x21: x21 x22: x22 +STACK CFI 612b8 x23: x23 x24: x24 +STACK CFI 612bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 8 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI c .cfa: x29 112 + +STACK CFI 24 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI e4 x19: x19 x20: x20 +STACK CFI e8 x21: x21 x22: x22 +STACK CFI ec x23: x23 x24: x24 +STACK CFI f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 110 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 10 .cfa: x29 32 + +STACK CFI 8c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 90 .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 0 124 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 14 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 114 x19: x19 x20: x20 +STACK CFI 118 x21: x21 x22: x22 +STACK CFI 11c x23: x23 x24: x24 +STACK CFI 120 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI ac x21: x21 +STACK CFI b0 x19: x19 x20: x20 +STACK CFI b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI c .cfa: x29 64 + +STACK CFI 14 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 1c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI fc x19: x19 x20: x20 +STACK CFI 100 x21: x21 x22: x22 +STACK CFI 104 x23: x23 +STACK CFI 108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23018 238 .cfa: sp 0 + .ra: x30 +STACK CFI 2301c .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 23028 .cfa: x29 80 + +STACK CFI 23038 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 23230 x23: x23 +STACK CFI 23240 x19: x19 x20: x20 +STACK CFI 23244 x21: x21 x22: x22 +STACK CFI 2324c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 612c0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 612c4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 43124 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 612c8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 612cc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 612d0 .cfa: x29 16 + +STACK CFI 612e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 612e4 80 .cfa: sp 0 + .ra: x30 +STACK CFI 612e8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 612ec .cfa: x29 32 + +STACK CFI 612f0 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 54 x19: x19 x20: x20 +STACK CFI 58 x21: x21 x22: x22 +STACK CFI 5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 16 + +STACK CFI c .cfa: sp 0 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI 1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 56c00 58 .cfa: sp 0 + .ra: x30 +STACK CFI 56c04 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 56c08 .cfa: x29 48 + +STACK CFI 56c0c x19: .cfa -32 + ^ +STACK CFI 56c50 x19: x19 +STACK CFI 56c54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 50 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 10 .cfa: x29 16 + +STACK CFI 4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 fc .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56e30 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 56ed4 68 .cfa: sp 0 + .ra: x30 +STACK CFI 56ed8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 56edc .cfa: x29 48 + +STACK CFI 56ee4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 56f1c x21: x21 +STACK CFI 56f20 x19: x19 x20: x20 +STACK CFI 56f24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 56f2c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 56f30 x19: x19 x20: x20 +STACK CFI 56f34 x21: x21 +STACK CFI 56f38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 8c x19: x19 x20: x20 +STACK CFI 90 x21: x21 +STACK CFI 94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 576a0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 576a4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 576a8 .cfa: x29 48 + +STACK CFI 576ac x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 576e4 x19: x19 x20: x20 +STACK CFI 576e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 61364 50 .cfa: sp 0 + .ra: x30 +STACK CFI 61368 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6136c .cfa: x29 48 + +STACK CFI 61370 x19: .cfa -32 + ^ +STACK CFI 613ac x19: x19 +STACK CFI 613b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 613b4 54 .cfa: sp 0 + .ra: x30 +STACK CFI 613b8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 613c0 .cfa: x29 96 + +STACK CFI 613c4 x19: .cfa -80 + ^ +STACK CFI 61400 x19: x19 +STACK CFI 61404 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 61408 60 .cfa: sp 0 + .ra: x30 +STACK CFI 6140c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 61410 .cfa: x29 48 + +STACK CFI 61414 x19: .cfa -32 + ^ +STACK CFI 61460 x19: x19 +STACK CFI 61464 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57a54 54 .cfa: sp 0 + .ra: x30 +STACK CFI 57a58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 57a60 .cfa: x29 16 + +STACK CFI 57aa0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54490 ec .cfa: sp 0 + .ra: x30 +STACK CFI 54494 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 54498 .cfa: x29 80 + +STACK CFI 544a0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 5456c x21: x21 +STACK CFI 54574 x19: x19 x20: x20 +STACK CFI 54578 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 14 x21: .cfa -32 + ^ +STACK CFI 4c x21: x21 +STACK CFI 54 x19: x19 x20: x20 +STACK CFI 58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 130 x19: x19 x20: x20 +STACK CFI 134 x21: x21 x22: x22 +STACK CFI 138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 61468 e8 .cfa: sp 0 + .ra: x30 +STACK CFI 6146c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 61470 .cfa: x29 64 + +STACK CFI 61478 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 61544 x19: x19 x20: x20 +STACK CFI 61548 x21: x21 x22: x22 +STACK CFI 6154c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 104 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 14 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI f4 x19: x19 x20: x20 +STACK CFI f8 x21: x21 x22: x22 +STACK CFI fc x23: x23 x24: x24 +STACK CFI 100 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 170 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 160 x23: x23 +STACK CFI 164 x19: x19 x20: x20 +STACK CFI 168 x21: x21 x22: x22 +STACK CFI 16c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 61550 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 61554 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 61558 .cfa: x29 48 + +STACK CFI 6155c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 61568 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 615e8 x19: x19 x20: x20 +STACK CFI 61600 x21: x21 x22: x22 +STACK CFI 61604 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 61608 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 6160c x19: x19 x20: x20 +STACK CFI 61610 x21: x21 x22: x22 +STACK CFI 61614 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57564 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 80 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 70 x21: x21 +STACK CFI 78 x19: x19 x20: x20 +STACK CFI 7c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 61618 104 .cfa: sp 0 + .ra: x30 +STACK CFI 6161c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 61624 .cfa: x29 160 + +STACK CFI 61628 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 61638 x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ +STACK CFI 61708 x19: x19 x20: x20 +STACK CFI 6170c x21: x21 x22: x22 +STACK CFI 61710 x23: x23 x24: x24 +STACK CFI 61714 x25: x25 x26: x26 +STACK CFI 61718 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6171c 348 .cfa: sp 0 + .ra: x30 +STACK CFI 61720 .cfa: sp 240 + .ra: .cfa -232 + ^ x29: .cfa -240 + ^ +STACK CFI 61724 .cfa: x29 240 + +STACK CFI 61728 x21: .cfa -208 + ^ x22: .cfa -200 + ^ +STACK CFI 6173c x19: .cfa -224 + ^ x20: .cfa -216 + ^ x23: .cfa -192 + ^ x24: .cfa -184 + ^ x25: .cfa -176 + ^ +STACK CFI 61a4c x25: x25 +STACK CFI 61a54 x19: x19 x20: x20 +STACK CFI 61a58 x21: x21 x22: x22 +STACK CFI 61a5c x23: x23 x24: x24 +STACK CFI 61a60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 61a64 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI c x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 1c x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 128 x21: x21 x22: x22 +STACK CFI 12c x19: x19 x20: x20 +STACK CFI 130 x23: x23 x24: x24 +STACK CFI 134 x25: x25 x26: x26 +STACK CFI 138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 114 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 104 x23: x23 +STACK CFI 108 x19: x19 x20: x20 +STACK CFI 10c x21: x21 x22: x22 +STACK CFI 110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 88 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 1c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 7c x19: x19 x20: x20 +STACK CFI 80 x21: x21 x22: x22 +STACK CFI 84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 61a7c 3c0 .cfa: sp 0 + .ra: x30 +STACK CFI 61a80 .cfa: sp 624 + +STACK CFI 61a84 .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 61a88 .cfa: x29 688 + +STACK CFI 61a94 x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ +STACK CFI 61c34 x19: x19 x20: x20 +STACK CFI 61c38 x21: x21 x22: x22 +STACK CFI 61c3c x23: x23 x24: x24 +STACK CFI 61c40 .cfa: sp 624 + .ra: .ra x29: x29 +STACK CFI 61c44 .cfa: sp 560 + +STACK CFI 61c48 .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 61e3c 13c .cfa: sp 0 + .ra: x30 +STACK CFI 61e40 .cfa: sp 448 + .ra: .cfa -440 + ^ x29: .cfa -448 + ^ +STACK CFI 61e4c .cfa: x29 448 + +STACK CFI 61e50 x19: .cfa -432 + ^ x20: .cfa -424 + ^ +STACK CFI INIT 20570 d8 .cfa: sp 0 + .ra: x30 +STACK CFI 20574 .cfa: sp 448 + .ra: .cfa -440 + ^ x29: .cfa -448 + ^ +STACK CFI 2057c .cfa: x29 448 + +STACK CFI 20580 x19: .cfa -432 + ^ x20: .cfa -424 + ^ +STACK CFI INIT 61f78 74 .cfa: sp 0 + .ra: x30 +STACK CFI 61f7c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 61f84 .cfa: x29 48 + +STACK CFI 61f88 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 61fe4 x19: x19 x20: x20 +STACK CFI 61fe8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 61fec 51c .cfa: sp 0 + .ra: x30 +STACK CFI 61ff0 .cfa: sp 496 + .ra: .cfa -488 + ^ x29: .cfa -496 + ^ +STACK CFI 61ff4 .cfa: x29 496 + +STACK CFI 62000 x19: .cfa -480 + ^ x20: .cfa -472 + ^ x21: .cfa -464 + ^ x22: .cfa -456 + ^ x23: .cfa -448 + ^ +STACK CFI 624f8 x19: x19 x20: x20 +STACK CFI 624fc x21: x21 x22: x22 +STACK CFI 62500 x23: x23 +STACK CFI 62504 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 62508 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 6250c .cfa: sp 400 + .ra: .cfa -392 + ^ x29: .cfa -400 + ^ +STACK CFI 62514 .cfa: x29 400 + +STACK CFI 62518 x19: .cfa -384 + ^ x20: .cfa -376 + ^ +STACK CFI INIT 625c8 50 .cfa: sp 0 + .ra: x30 +STACK CFI 625cc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 625d4 .cfa: x29 32 + +STACK CFI 625d8 x19: .cfa -16 + ^ +STACK CFI 62610 x19: x19 +STACK CFI 62614 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 62618 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6261c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 62620 .cfa: x29 32 + +STACK CFI 62624 x19: .cfa -16 + ^ +STACK CFI 62634 x19: x19 +STACK CFI 62638 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6263c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6264c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 62650 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 62654 .cfa: x29 32 + +STACK CFI 62658 x19: .cfa -16 + ^ +STACK CFI 62668 x19: x19 +STACK CFI 6266c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 62670 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 62680 24 .cfa: sp 0 + .ra: x30 +STACK CFI 62684 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 62688 .cfa: x29 32 + +STACK CFI 6268c x19: .cfa -16 + ^ +STACK CFI 6269c x19: x19 +STACK CFI 626a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 18 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 78 x19: x19 x20: x20 +STACK CFI 7c x21: x21 x22: x22 +STACK CFI 80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 626a4 24c .cfa: sp 0 + .ra: x30 +STACK CFI 626a8 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 626ac .cfa: x29 384 + +STACK CFI 626bc x19: .cfa -368 + ^ x20: .cfa -360 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ x23: .cfa -336 + ^ x24: .cfa -328 + ^ x25: .cfa -320 + ^ x26: .cfa -312 + ^ +STACK CFI 628dc x19: x19 x20: x20 +STACK CFI 628e0 x21: x21 x22: x22 +STACK CFI 628e4 x23: x23 x24: x24 +STACK CFI 628e8 x25: x25 x26: x26 +STACK CFI 628ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5f8f4 148 .cfa: sp 0 + .ra: x30 +STACK CFI 5f8f8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 5f8fc .cfa: x29 96 + +STACK CFI 5f90c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 5fa28 x19: x19 x20: x20 +STACK CFI 5fa2c x21: x21 x22: x22 +STACK CFI 5fa30 x23: x23 x24: x24 +STACK CFI 5fa34 x25: x25 +STACK CFI 5fa38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 628f0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 628f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 628fc .cfa: x29 32 + +STACK CFI 62938 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6293c 44 .cfa: sp 0 + .ra: x30 +STACK CFI 62940 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 62944 .cfa: x29 48 + +STACK CFI 62948 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 62978 x19: x19 x20: x20 +STACK CFI 6297c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 62980 c0c .cfa: sp 0 + .ra: x30 +STACK CFI 62984 .cfa: sp 784 + +STACK CFI 62988 .cfa: sp 944 + .ra: .cfa -936 + ^ x29: .cfa -944 + ^ +STACK CFI 6298c .cfa: x29 944 + +STACK CFI 62990 v8: .cfa -848 + ^ v9: .cfa -840 + ^ +STACK CFI 629b4 v10: .cfa -832 + ^ v11: .cfa -824 + ^ v12: .cfa -816 + ^ v13: .cfa -808 + ^ v14: .cfa -800 + ^ v15: .cfa -792 + ^ x19: .cfa -928 + ^ x20: .cfa -920 + ^ x21: .cfa -912 + ^ x22: .cfa -904 + ^ x23: .cfa -896 + ^ x24: .cfa -888 + ^ x25: .cfa -880 + ^ x26: .cfa -872 + ^ x27: .cfa -864 + ^ x28: .cfa -856 + ^ +STACK CFI 63560 x19: x19 x20: x20 +STACK CFI 63564 v8: v8 v9: v9 +STACK CFI 63568 x21: x21 x22: x22 +STACK CFI 6356c v10: v10 v11: v11 +STACK CFI 63570 x23: x23 x24: x24 +STACK CFI 63574 v12: v12 v13: v13 +STACK CFI 63578 x25: x25 x26: x26 +STACK CFI 6357c v14: v14 v15: v15 +STACK CFI 63580 x27: x27 x28: x28 +STACK CFI 63584 .cfa: sp 784 + .ra: .ra x29: x29 +STACK CFI 63588 .cfa: sp 624 + +STACK CFI INIT 0 2a4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 8 .cfa: x29 112 + +STACK CFI c x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 20 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ +STACK CFI 28c x23: x23 x24: x24 +STACK CFI 290 x19: x19 x20: x20 +STACK CFI 294 x21: x21 x22: x22 +STACK CFI 298 x25: x25 x26: x26 +STACK CFI 29c x27: x27 +STACK CFI 2a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 60d14 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 60d18 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 60d20 .cfa: x29 112 + +STACK CFI 60d28 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ +STACK CFI 60dbc x19: x19 x20: x20 +STACK CFI 60dc0 x21: x21 +STACK CFI 60dc4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6358c 234 .cfa: sp 0 + .ra: x30 +STACK CFI 63590 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI 63598 .cfa: x29 272 + +STACK CFI 6359c x19: .cfa -256 + ^ x20: .cfa -248 + ^ +STACK CFI 635b0 x25: .cfa -208 + ^ +STACK CFI 635bc x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ +STACK CFI 637ac x19: x19 x20: x20 +STACK CFI 637b0 x21: x21 x22: x22 +STACK CFI 637b4 x23: x23 x24: x24 +STACK CFI 637b8 x25: x25 +STACK CFI 637bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23250 e8 .cfa: sp 0 + .ra: x30 +STACK CFI 23254 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 23260 .cfa: x29 64 + +STACK CFI 2326c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 23278 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 2332c x19: x19 x20: x20 +STACK CFI 23330 x21: x21 x22: x22 +STACK CFI 23334 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 637c0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 637cc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 637d0 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 637d4 .cfa: x29 144 + +STACK CFI 637ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 637f0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 637f4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 637f8 .cfa: x29 144 + +STACK CFI 63824 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 63828 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6383c 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 63860 44 .cfa: sp 0 + .ra: x30 +STACK CFI 63864 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6386c .cfa: x29 32 + +STACK CFI 63870 x19: .cfa -16 + ^ +STACK CFI 6388c x19: x19 +STACK CFI 63890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 63894 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 6389c x19: x19 +STACK CFI 638a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 60 x19: x19 +STACK CFI 64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 576a0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 576a4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 576a8 .cfa: x29 48 + +STACK CFI 576ac x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 576e4 x19: x19 x20: x20 +STACK CFI 576e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 57a54 54 .cfa: sp 0 + .ra: x30 +STACK CFI 57a58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 57a60 .cfa: x29 16 + +STACK CFI 57aa0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 6c x19: x19 +STACK CFI 70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 130 x21: x21 +STACK CFI 134 x19: x19 x20: x20 +STACK CFI 138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 180 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 170 x23: x23 +STACK CFI 174 x19: x19 x20: x20 +STACK CFI 178 x21: x21 x22: x22 +STACK CFI 17c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57564 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 18 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 9c x19: x19 x20: x20 +STACK CFI a0 x21: x21 x22: x22 +STACK CFI a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25fd8 34 .cfa: sp 0 + .ra: x30 +STACK CFI 25fdc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25fe0 .cfa: x29 48 + +STACK CFI 25fe4 x19: .cfa -32 + ^ +STACK CFI 26004 x19: x19 +STACK CFI 26008 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 638a4 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 638a8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 638ac .cfa: x29 48 + +STACK CFI 638b4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 638c4 x19: x19 x20: x20 +STACK CFI 638c8 x21: x21 +STACK CFI 638d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 638d8 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 63958 x21: x21 +STACK CFI 6395c x19: x19 x20: x20 +STACK CFI 63960 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57908 24 .cfa: sp 0 + .ra: x30 +STACK CFI 5790c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 57910 .cfa: x29 32 + +STACK CFI 57914 x19: .cfa -16 + ^ +STACK CFI 57924 x19: x19 +STACK CFI 57928 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 63964 90 .cfa: sp 0 + .ra: x30 +STACK CFI 63968 .cfa: sp 4096 + +STACK CFI 63970 .cfa: sp 4160 + +STACK CFI 63978 .cfa: sp 4208 + .ra: .cfa -4200 + ^ x29: .cfa -4208 + ^ +STACK CFI 6397c .cfa: x29 4208 + +STACK CFI 63980 x19: .cfa -4192 + ^ x20: .cfa -4184 + ^ +STACK CFI 63988 x21: .cfa -4176 + ^ +STACK CFI 639e0 x21: x21 +STACK CFI 639e4 x19: x19 x20: x20 +STACK CFI 639e8 .cfa: sp 4160 + .ra: .ra x29: x29 +STACK CFI 639ec .cfa: sp 4096 + +STACK CFI 639f0 .cfa: sp 4048 + +STACK CFI INIT 639f4 68 .cfa: sp 0 + .ra: x30 +STACK CFI 639f8 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 639fc .cfa: x29 112 + +STACK CFI 63a00 x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 63a54 x19: x19 x20: x20 +STACK CFI 63a58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 63a5c 78 .cfa: sp 0 + .ra: x30 +STACK CFI 63a60 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 63a64 .cfa: x29 112 + +STACK CFI 63a68 x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 63acc x19: x19 x20: x20 +STACK CFI 63ad0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 63ad4 1ec .cfa: sp 0 + .ra: x30 +STACK CFI 63ad8 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 63adc .cfa: x29 224 + +STACK CFI 63aec x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ x25: .cfa -160 + ^ +STACK CFI 63cac x25: x25 +STACK CFI 63cb0 x19: x19 x20: x20 +STACK CFI 63cb4 x21: x21 x22: x22 +STACK CFI 63cb8 x23: x23 x24: x24 +STACK CFI 63cbc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 63cc0 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 63cc4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 63cc8 .cfa: x29 144 + +STACK CFI 63cd0 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ +STACK CFI 63d68 x19: x19 x20: x20 +STACK CFI 63d6c x21: x21 x22: x22 +STACK CFI 63d70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 63d74 a0 .cfa: sp 0 + .ra: x30 +STACK CFI 63d78 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 63d7c .cfa: x29 144 + +STACK CFI 63d84 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ +STACK CFI 63e08 x21: x21 +STACK CFI 63e0c x19: x19 x20: x20 +STACK CFI 63e10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 168 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 1c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ +STACK CFI 158 x23: x23 +STACK CFI 15c x19: x19 x20: x20 +STACK CFI 160 x21: x21 x22: x22 +STACK CFI 164 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 e4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 8 .cfa: x29 192 + +STACK CFI 14 x19: .cfa -176 + ^ x20: .cfa -168 + ^ x23: .cfa -144 + ^ +STACK CFI 38 x21: .cfa -160 + ^ x22: .cfa -152 + ^ +STACK CFI d0 x23: x23 +STACK CFI d8 x19: x19 x20: x20 +STACK CFI dc x21: x21 x22: x22 +STACK CFI e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 63e14 224 .cfa: sp 0 + .ra: x30 +STACK CFI 63e18 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 63e1c .cfa: x29 384 + +STACK CFI 63e20 x19: .cfa -368 + ^ x20: .cfa -360 + ^ +STACK CFI 63e30 x23: .cfa -336 + ^ x24: .cfa -328 + ^ x27: .cfa -304 + ^ x28: .cfa -296 + ^ +STACK CFI 63e48 x21: .cfa -352 + ^ x22: .cfa -344 + ^ x25: .cfa -320 + ^ x26: .cfa -312 + ^ +STACK CFI 64020 x19: x19 x20: x20 +STACK CFI 64024 x21: x21 x22: x22 +STACK CFI 64028 x23: x23 x24: x24 +STACK CFI 6402c x25: x25 x26: x26 +STACK CFI 64030 x27: x27 x28: x28 +STACK CFI 64034 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64038 a4 .cfa: sp 0 + .ra: x30 +STACK CFI 6403c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 64040 .cfa: x29 112 + +STACK CFI 64048 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI 6405c x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 640cc x19: x19 x20: x20 +STACK CFI 640d0 x21: x21 x22: x22 +STACK CFI 640d4 x23: x23 x24: x24 +STACK CFI 640d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 640dc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 640e4 30 .cfa: sp 0 + .ra: x30 +STACK CFI 640e8 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 640f4 .cfa: x29 16 + +STACK CFI 64110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 64114 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 64120 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6412c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 64138 3c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 2c x19: x19 +STACK CFI 34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 38 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 3c x19: x19 +STACK CFI 40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64174 158 .cfa: sp 0 + .ra: x30 +STACK CFI 64178 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 64180 .cfa: x29 32 + +STACK CFI 64184 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 64200 x19: x19 x20: x20 +STACK CFI 64204 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 64208 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 64220 x19: x19 x20: x20 +STACK CFI 64224 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 64228 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 642c4 x19: x19 x20: x20 +STACK CFI 642c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 642cc bc .cfa: sp 0 + .ra: x30 +STACK CFI 642d0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 642d4 .cfa: x29 48 + +STACK CFI 642dc x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 64340 x21: x21 x22: x22 +STACK CFI 64344 x19: x19 x20: x20 +STACK CFI 64348 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6434c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 6437c x19: x19 x20: x20 +STACK CFI 64380 x21: x21 x22: x22 +STACK CFI 64384 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64388 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 6438c .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 64394 .cfa: x29 80 + +STACK CFI 643a8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ +STACK CFI 64434 x19: x19 x20: x20 +STACK CFI 64438 x21: x21 x22: x22 +STACK CFI 6443c x23: x23 x24: x24 +STACK CFI 64440 x25: x25 +STACK CFI 64444 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64448 68 .cfa: sp 0 + .ra: x30 +STACK CFI 6444c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 64450 .cfa: x29 32 + +STACK CFI 64454 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 64478 x19: x19 x20: x20 +STACK CFI 6447c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 64480 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 644a8 x19: x19 x20: x20 +STACK CFI 644ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 20 x19: x19 +STACK CFI 24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 644b0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 644cc 2c .cfa: sp 0 + .ra: x30 +STACK CFI 644d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 644dc .cfa: x29 32 + +STACK CFI 644e0 x19: .cfa -16 + ^ +STACK CFI 644f0 x19: x19 +STACK CFI 644f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 644f8 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248a0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 248a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 248a8 .cfa: x29 32 + +STACK CFI 248ac x19: .cfa -16 + ^ +STACK CFI 248e0 x19: x19 +STACK CFI 248e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64510 3c .cfa: sp 0 + .ra: x30 +STACK CFI 64514 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 64518 .cfa: x29 32 + +STACK CFI 6451c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 64544 x19: x19 x20: x20 +STACK CFI 64548 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6454c 5c .cfa: sp 0 + .ra: x30 +STACK CFI 64550 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 64554 .cfa: x29 48 + +STACK CFI 64558 x19: .cfa -32 + ^ +STACK CFI 645a0 x19: x19 +STACK CFI 645a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 88 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI c .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 1c x21: .cfa -32 + ^ +STACK CFI 7c x19: x19 x20: x20 +STACK CFI 80 x21: x21 +STACK CFI 84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 60 x19: x19 +STACK CFI 64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 576a0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 576a4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 576a8 .cfa: x29 48 + +STACK CFI 576ac x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 576e4 x19: x19 x20: x20 +STACK CFI 576e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 645a8 9c .cfa: sp 0 + .ra: x30 +STACK CFI 645ac .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 645b0 .cfa: x29 64 + +STACK CFI 645b8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 645c0 x23: .cfa -16 + ^ +STACK CFI 64630 x23: x23 +STACK CFI 64638 x19: x19 x20: x20 +STACK CFI 6463c x21: x21 x22: x22 +STACK CFI 64640 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64644 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 64648 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6464c .cfa: x29 48 + +STACK CFI 64654 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 646e0 x21: x21 +STACK CFI 646e4 x19: x19 x20: x20 +STACK CFI 646e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 14 x19: .cfa -16 + ^ +STACK CFI 24 x19: x19 +STACK CFI 28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 646ec 2c .cfa: sp 0 + .ra: x30 +STACK CFI 646f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 646f8 .cfa: x29 32 + +STACK CFI 64700 x19: .cfa -16 + ^ +STACK CFI 64710 x19: x19 +STACK CFI 64714 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54474 1c .cfa: sp 0 + .ra: x30 +STACK CFI 54478 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5447c .cfa: x29 16 + +STACK CFI 5448c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54490 ec .cfa: sp 0 + .ra: x30 +STACK CFI 54494 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 54498 .cfa: x29 80 + +STACK CFI 544a0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 5456c x21: x21 +STACK CFI 54574 x19: x19 x20: x20 +STACK CFI 54578 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 12c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 120 x19: x19 x20: x20 +STACK CFI 124 x21: x21 x22: x22 +STACK CFI 128 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64718 38 .cfa: sp 0 + .ra: x30 +STACK CFI 6471c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 64720 .cfa: x29 32 + +STACK CFI 64724 x19: .cfa -16 + ^ +STACK CFI 64748 x19: x19 +STACK CFI 6474c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 ac .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 18 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI a0 x19: x19 x20: x20 +STACK CFI a4 x21: x21 x22: x22 +STACK CFI a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5457c 48 .cfa: sp 0 + .ra: x30 +STACK CFI 54580 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5458c .cfa: x29 16 + +STACK CFI 545c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64750 7c .cfa: sp 0 + .ra: x30 +STACK CFI 64754 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 64758 .cfa: x29 48 + +STACK CFI 6475c x19: .cfa -32 + ^ +STACK CFI 647c4 x19: x19 +STACK CFI 647c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 647cc 48 .cfa: sp 0 + .ra: x30 +STACK CFI 647d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 647d4 .cfa: x29 32 + +STACK CFI 647d8 x19: .cfa -16 + ^ +STACK CFI 6480c x19: x19 +STACK CFI 64810 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI 14 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 20 x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 120 x19: x19 x20: x20 +STACK CFI 124 x21: x21 x22: x22 +STACK CFI 128 x23: x23 x24: x24 +STACK CFI 12c x25: x25 x26: x26 +STACK CFI 130 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 40 x19: x19 x20: x20 +STACK CFI 44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64814 1a8 .cfa: sp 0 + .ra: x30 +STACK CFI 64818 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 6481c .cfa: x29 112 + +STACK CFI 64820 x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 6482c x21: .cfa -80 + ^ +STACK CFI 649b0 x19: x19 x20: x20 +STACK CFI 649b4 x21: x21 +STACK CFI 649b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 180 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 170 x23: x23 +STACK CFI 174 x19: x19 x20: x20 +STACK CFI 178 x21: x21 x22: x22 +STACK CFI 17c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 57564 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 168 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 1c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ +STACK CFI 158 x23: x23 +STACK CFI 15c x19: x19 x20: x20 +STACK CFI 160 x21: x21 x22: x22 +STACK CFI 164 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 649bc 150 .cfa: sp 0 + .ra: x30 +STACK CFI 649c0 .cfa: sp 256 + .ra: .cfa -248 + ^ x29: .cfa -256 + ^ +STACK CFI 649c4 .cfa: x29 256 + +STACK CFI 649d0 x19: .cfa -240 + ^ x20: .cfa -232 + ^ x21: .cfa -224 + ^ x22: .cfa -216 + ^ x23: .cfa -208 + ^ x24: .cfa -200 + ^ +STACK CFI 64afc x19: x19 x20: x20 +STACK CFI 64b00 x21: x21 x22: x22 +STACK CFI 64b04 x23: x23 x24: x24 +STACK CFI 64b08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64b0c cc .cfa: sp 0 + .ra: x30 +STACK CFI 64b10 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 64b14 .cfa: x29 96 + +STACK CFI 64b18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 64bd0 x19: x19 x20: x20 +STACK CFI 64bd4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64bd8 1a4 .cfa: sp 0 + .ra: x30 +STACK CFI 64bdc .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 64be0 .cfa: x29 128 + +STACK CFI 64bf0 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ +STACK CFI 64d68 x21: x21 x22: x22 +STACK CFI 64d6c x19: x19 x20: x20 +STACK CFI 64d70 x23: x23 x24: x24 +STACK CFI 64d74 x25: x25 +STACK CFI 64d78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 64d7c 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 64d94 13c .cfa: sp 0 + .ra: x30 +STACK CFI 64d98 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 64d9c .cfa: x29 224 + +STACK CFI 64da8 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ +STACK CFI 64ebc x23: x23 +STACK CFI 64ec4 x19: x19 x20: x20 +STACK CFI 64ec8 x21: x21 x22: x22 +STACK CFI 64ecc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 545c4 11c .cfa: sp 0 + .ra: x30 +STACK CFI 545c8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 545cc .cfa: x29 64 + +STACK CFI 545d4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 546d4 x21: x21 +STACK CFI 546d8 x19: x19 x20: x20 +STACK CFI 546dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64ed0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 64ed4 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 64ed8 .cfa: x29 112 + +STACK CFI 64edc x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 64eec x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 64f8c x19: x19 x20: x20 +STACK CFI 64f90 x21: x21 x22: x22 +STACK CFI 64f94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64f98 54 .cfa: sp 0 + .ra: x30 +STACK CFI 64f9c .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 64fa0 .cfa: x29 80 + +STACK CFI 64fa4 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 64fe4 x19: x19 x20: x20 +STACK CFI 64fe8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 64fec 10c .cfa: sp 0 + .ra: x30 +STACK CFI 64ff0 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 64ff4 .cfa: x29 176 + +STACK CFI 64ff8 x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 65008 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x23: .cfa -128 + ^ +STACK CFI 650e4 x23: x23 +STACK CFI 650ec x19: x19 x20: x20 +STACK CFI 650f0 x21: x21 x22: x22 +STACK CFI 650f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 650f8 48 .cfa: sp 0 + .ra: x30 +STACK CFI 650fc .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 65100 .cfa: x29 96 + +STACK CFI 65104 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 65138 x19: x19 x20: x20 +STACK CFI 6513c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4d4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 8 .cfa: x29 192 + +STACK CFI 20 v8: .cfa -96 + ^ x19: .cfa -176 + ^ x20: .cfa -168 + ^ x21: .cfa -160 + ^ x22: .cfa -152 + ^ x23: .cfa -144 + ^ x24: .cfa -136 + ^ x25: .cfa -128 + ^ x26: .cfa -120 + ^ x27: .cfa -112 + ^ x28: .cfa -104 + ^ +STACK CFI 4b8 x19: x19 x20: x20 +STACK CFI 4bc x21: x21 x22: x22 +STACK CFI 4c0 x23: x23 x24: x24 +STACK CFI 4c4 x25: x25 x26: x26 +STACK CFI 4c8 x27: x27 x28: x28 +STACK CFI 4cc v8: v8 +STACK CFI 4d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI b4 x19: x19 x20: x20 +STACK CFI b8 x21: x21 +STACK CFI bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 23338 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23360 44 .cfa: sp 0 + .ra: x30 +STACK CFI 23364 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 23368 .cfa: x29 48 + +STACK CFI 2336c x19: .cfa -32 + ^ +STACK CFI 2339c x19: x19 +STACK CFI 233a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 65140 40 .cfa: sp 0 + .ra: x30 +STACK CFI 65144 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 65148 .cfa: x29 32 + +STACK CFI 6514c x19: .cfa -16 + ^ +STACK CFI 65178 x19: x19 +STACK CFI 6517c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 65180 44 .cfa: sp 0 + .ra: x30 +STACK CFI 65184 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6518c .cfa: x29 32 + +STACK CFI 65190 x19: .cfa -16 + ^ +STACK CFI 651bc x19: x19 +STACK CFI 651c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 651c4 50 .cfa: sp 0 + .ra: x30 +STACK CFI 651c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 651d4 .cfa: x29 32 + +STACK CFI 651d8 x19: .cfa -16 + ^ +STACK CFI 6520c x19: x19 +STACK CFI 65210 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 65214 fc .cfa: sp 0 + .ra: x30 +STACK CFI 6521c .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 65220 .cfa: x29 96 + +STACK CFI 6522c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x23: .cfa -48 + ^ +STACK CFI 65234 x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 65300 x19: x19 x20: x20 +STACK CFI 65304 x21: x21 x22: x22 +STACK CFI 65308 x23: x23 +STACK CFI 6530c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 65310 2b0 .cfa: sp 0 + .ra: x30 +STACK CFI 65314 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 65318 .cfa: x29 112 + +STACK CFI 65328 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ +STACK CFI 65594 x25: x25 +STACK CFI 65598 x19: x19 x20: x20 +STACK CFI 6559c x21: x21 x22: x22 +STACK CFI 655a0 x23: x23 x24: x24 +STACK CFI 655a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 655a8 .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x29: .cfa -112 + ^ +STACK CFI INIT 655c0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 655c8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 655cc .cfa: x29 64 + +STACK CFI 655dc x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 65634 x19: x19 x20: x20 +STACK CFI 65638 x21: x21 x22: x22 +STACK CFI 6563c x23: x23 +STACK CFI 65640 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 65644 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 65648 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6564c .cfa: x29 48 + +STACK CFI 65650 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 65658 x21: .cfa -16 + ^ +STACK CFI 656d8 x21: x21 +STACK CFI 656dc x19: x19 x20: x20 +STACK CFI 656e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 656f0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 656fc x19: x19 x20: x20 +STACK CFI 65700 x21: x21 +STACK CFI 65704 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 65708 368 .cfa: sp 0 + .ra: x30 +STACK CFI 6570c .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 65710 .cfa: x29 128 + +STACK CFI 65720 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ +STACK CFI 65a5c x19: x19 x20: x20 +STACK CFI 65a60 x21: x21 x22: x22 +STACK CFI 65a64 x23: x23 x24: x24 +STACK CFI 65a68 x25: x25 x26: x26 +STACK CFI 65a6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 65a70 128 .cfa: sp 0 + .ra: x30 +STACK CFI 65a74 .cfa: sp 4096 + +STACK CFI 65a78 .cfa: sp 5232 + +STACK CFI 65a7c .cfa: sp 5296 + .ra: .cfa -5288 + ^ x29: .cfa -5296 + ^ +STACK CFI 65a80 .cfa: x29 5296 + +STACK CFI 65a8c x19: .cfa -5280 + ^ x20: .cfa -5272 + ^ x21: .cfa -5264 + ^ x22: .cfa -5256 + ^ x23: .cfa -5248 + ^ +STACK CFI 65b80 x19: x19 x20: x20 +STACK CFI 65b84 x21: x21 x22: x22 +STACK CFI 65b88 x23: x23 +STACK CFI 65b8c .cfa: sp 5232 + .ra: .ra x29: x29 +STACK CFI 65b90 .cfa: sp 4096 + +STACK CFI 65b94 .cfa: sp 4032 + +STACK CFI INIT 65b98 5c .cfa: sp 0 + .ra: x30 +STACK CFI 65b9c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 65ba4 .cfa: x29 48 + +STACK CFI 65ba8 x19: .cfa -32 + ^ +STACK CFI 65bdc x19: x19 +STACK CFI 65be0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 65be8 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 65bec x19: x19 +STACK CFI 65bf0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 4096 + +STACK CFI c .cfa: sp 4704 + +STACK CFI 10 .cfa: sp 4752 + .ra: .cfa -4744 + ^ x29: .cfa -4752 + ^ +STACK CFI 14 .cfa: x29 4752 + +STACK CFI 18 x19: .cfa -4736 + ^ x20: .cfa -4728 + ^ +STACK CFI 24 x21: .cfa -4720 + ^ x22: .cfa -4712 + ^ +STACK CFI 68 x19: x19 x20: x20 +STACK CFI 6c x21: x21 x22: x22 +STACK CFI 70 .cfa: sp 4704 + .ra: .ra x29: x29 +STACK CFI 74 .cfa: sp 4096 + +STACK CFI 78 .cfa: sp 4048 + +STACK CFI INIT 65bf4 190 .cfa: sp 0 + .ra: x30 +STACK CFI 65bf8 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 65bfc .cfa: x29 128 + +STACK CFI 65c00 x19: .cfa -112 + ^ x20: .cfa -104 + ^ +STACK CFI 65c18 x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ +STACK CFI 65d70 x19: x19 x20: x20 +STACK CFI 65d74 x21: x21 x22: x22 +STACK CFI 65d78 x23: x23 x24: x24 +STACK CFI 65d7c x25: x25 x26: x26 +STACK CFI 65d80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 65d84 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 65d88 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 65d8c .cfa: x29 64 + +STACK CFI 65d94 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 65e30 x19: x19 x20: x20 +STACK CFI 65e34 x21: x21 +STACK CFI 65e38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 65e3c 68 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 65ea4 40 .cfa: sp 0 + .ra: x30 +STACK CFI 65ea8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 65eac .cfa: x29 32 + +STACK CFI 65eb0 x19: .cfa -16 + ^ +STACK CFI 65edc x19: x19 +STACK CFI 65ee0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 65ee4 130 .cfa: sp 0 + .ra: x30 +STACK CFI 65ee8 .cfa: sp 4096 + +STACK CFI 65eec .cfa: sp 5232 + +STACK CFI 65ef0 .cfa: sp 5280 + .ra: .cfa -5272 + ^ x29: .cfa -5280 + ^ +STACK CFI 65ef4 .cfa: x29 5280 + +STACK CFI 65efc x19: .cfa -5264 + ^ x20: .cfa -5256 + ^ x21: .cfa -5248 + ^ x22: .cfa -5240 + ^ +STACK CFI 65ffc x19: x19 x20: x20 +STACK CFI 66000 x21: x21 x22: x22 +STACK CFI 66004 .cfa: sp 5232 + .ra: .ra x29: x29 +STACK CFI 6600c .cfa: sp 4096 + +STACK CFI 66010 .cfa: sp 4048 + +STACK CFI INIT 66014 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 66018 .cfa: sp 592 + +STACK CFI 6601c .cfa: sp 640 + .ra: .cfa -632 + ^ x29: .cfa -640 + ^ +STACK CFI 66020 .cfa: x29 640 + +STACK CFI 66028 x19: .cfa -624 + ^ x20: .cfa -616 + ^ x21: .cfa -608 + ^ x22: .cfa -600 + ^ +STACK CFI 660b8 x19: x19 x20: x20 +STACK CFI 660bc x21: x21 x22: x22 +STACK CFI 660c0 .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 660c4 .cfa: sp 544 + +STACK CFI INIT 660c8 84 .cfa: sp 0 + .ra: x30 +STACK CFI 660cc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 660d0 .cfa: x29 64 + +STACK CFI 660d4 x19: .cfa -48 + ^ +STACK CFI 66144 x19: x19 +STACK CFI 66148 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6614c 48 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 66194 258 .cfa: sp 0 + .ra: x30 +STACK CFI 66198 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 6619c .cfa: x29 96 + +STACK CFI 661a0 x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 661a8 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 663e0 x19: x19 x20: x20 +STACK CFI 663e4 x21: x21 x22: x22 +STACK CFI 663e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 14 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 5c x19: x19 x20: x20 +STACK CFI 60 x21: x21 x22: x22 +STACK CFI 64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 663ec cc .cfa: sp 0 + .ra: x30 +STACK CFI 663f0 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 663f4 .cfa: x29 192 + +STACK CFI 663fc x19: .cfa -176 + ^ x20: .cfa -168 + ^ x21: .cfa -160 + ^ x22: .cfa -152 + ^ +STACK CFI 664ac x19: x19 x20: x20 +STACK CFI 664b0 x21: x21 x22: x22 +STACK CFI 664b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 10 .cfa: x29 384 + +STACK CFI 14 x21: .cfa -352 + ^ x22: .cfa -344 + ^ +STACK CFI 38 x19: .cfa -368 + ^ x20: .cfa -360 + ^ +STACK CFI b8 x19: x19 x20: x20 +STACK CFI bc x21: x21 x22: x22 +STACK CFI c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 664b8 a4 .cfa: sp 0 + .ra: x30 +STACK CFI 664bc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 664c0 .cfa: x29 64 + +STACK CFI 664c8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 664d0 x23: .cfa -16 + ^ +STACK CFI 66544 x21: x21 x22: x22 +STACK CFI 66550 x23: x23 +STACK CFI 66554 x19: x19 x20: x20 +STACK CFI 66558 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 170 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 160 x23: x23 +STACK CFI 164 x19: x19 x20: x20 +STACK CFI 168 x21: x21 x22: x22 +STACK CFI 16c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 18 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 9c x19: x19 x20: x20 +STACK CFI a0 x21: x21 x22: x22 +STACK CFI a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 15c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 1c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ +STACK CFI 14c x23: x23 +STACK CFI 150 x19: x19 x20: x20 +STACK CFI 154 x21: x21 x22: x22 +STACK CFI 158 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6655c f0 .cfa: sp 0 + .ra: x30 +STACK CFI 66560 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI 66564 .cfa: x29 272 + +STACK CFI 66568 x19: .cfa -256 + ^ x20: .cfa -248 + ^ +STACK CFI 6657c x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ +STACK CFI 66634 x23: x23 +STACK CFI 66640 x21: x21 x22: x22 +STACK CFI 66644 x19: x19 x20: x20 +STACK CFI 66648 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6664c 88 .cfa: sp 0 + .ra: x30 +STACK CFI 66650 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 66654 .cfa: x29 32 + +STACK CFI 66658 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 666cc x19: x19 x20: x20 +STACK CFI 666d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 666d4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 666e8 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 666f4 40 .cfa: sp 0 + .ra: x30 +STACK CFI 666f8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 66710 .cfa: x29 32 + +STACK CFI 66730 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 66734 4c .cfa: sp 0 + .ra: x30 +STACK CFI 66738 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 66744 .cfa: x29 48 + +STACK CFI 6677c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 66780 44 .cfa: sp 0 + .ra: x30 +STACK CFI 66784 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 66788 .cfa: x29 32 + +STACK CFI 6678c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 667b4 x19: x19 x20: x20 +STACK CFI 667b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 667c4 220 .cfa: sp 0 + .ra: x30 +STACK CFI 667c8 .cfa: sp 544 + +STACK CFI 667d0 .cfa: sp 608 + .ra: .cfa -600 + ^ x29: .cfa -608 + ^ +STACK CFI 667d4 .cfa: x29 608 + +STACK CFI 667e0 x19: .cfa -592 + ^ x20: .cfa -584 + ^ x21: .cfa -576 + ^ x22: .cfa -568 + ^ x23: .cfa -560 + ^ +STACK CFI 669d0 x23: x23 +STACK CFI 669d4 x19: x19 x20: x20 +STACK CFI 669d8 x21: x21 x22: x22 +STACK CFI 669dc .cfa: sp 544 + .ra: .ra x29: x29 +STACK CFI 669e0 .cfa: sp 480 + +STACK CFI INIT 669e4 678 .cfa: sp 0 + .ra: x30 +STACK CFI 669e8 .cfa: sp 1120 + +STACK CFI 669f0 .cfa: sp 1248 + .ra: .cfa -1240 + ^ x29: .cfa -1248 + ^ +STACK CFI 669f4 .cfa: x29 1248 + +STACK CFI 669fc v8: .cfa -1152 + ^ v9: .cfa -1144 + ^ x21: .cfa -1216 + ^ x22: .cfa -1208 + ^ +STACK CFI 66a08 x19: .cfa -1232 + ^ x20: .cfa -1224 + ^ +STACK CFI 66a24 v10: .cfa -1136 + ^ x23: .cfa -1200 + ^ x24: .cfa -1192 + ^ x25: .cfa -1184 + ^ x26: .cfa -1176 + ^ x27: .cfa -1168 + ^ x28: .cfa -1160 + ^ +STACK CFI 67038 v8: v8 v9: v9 +STACK CFI 6703c x19: x19 x20: x20 +STACK CFI 67040 x21: x21 x22: x22 +STACK CFI 67044 x23: x23 x24: x24 +STACK CFI 67048 x25: x25 x26: x26 +STACK CFI 6704c x27: x27 x28: x28 +STACK CFI 67050 v10: v10 +STACK CFI 67054 .cfa: sp 1120 + .ra: .ra x29: x29 +STACK CFI 67058 .cfa: sp 992 + +STACK CFI INIT 6705c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 67064 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6706c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 67074 64 .cfa: sp 0 + .ra: x30 +STACK CFI 67078 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6707c .cfa: x29 32 + +STACK CFI 670d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 670d8 54 .cfa: sp 0 + .ra: x30 +STACK CFI 670dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 670e8 .cfa: x29 48 + +STACK CFI 670f0 x19: .cfa -32 + ^ +STACK CFI 67110 x19: x19 +STACK CFI 67114 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 67120 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 67124 x19: x19 +STACK CFI 67128 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6712c b4 .cfa: sp 0 + .ra: x30 +STACK CFI 67130 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 67134 .cfa: x29 80 + +STACK CFI 67144 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ +STACK CFI 671cc x19: x19 x20: x20 +STACK CFI 671d0 x21: x21 x22: x22 +STACK CFI 671d4 x23: x23 x24: x24 +STACK CFI 671d8 x25: x25 +STACK CFI 671dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 671e0 90 .cfa: sp 0 + .ra: x30 +STACK CFI 671e4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 671ec .cfa: x29 64 + +STACK CFI 671f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 67204 x23: .cfa -16 + ^ +STACK CFI 67214 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 67258 x23: x23 +STACK CFI 67264 x19: x19 x20: x20 +STACK CFI 67268 x21: x21 x22: x22 +STACK CFI 6726c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 28 x19: x19 +STACK CFI 2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 35680 24 .cfa: sp 0 + .ra: x30 +STACK CFI 35684 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 35688 .cfa: x29 32 + +STACK CFI 3568c x19: .cfa -16 + ^ +STACK CFI 3569c x19: x19 +STACK CFI 356a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bd0c fc .cfa: sp 0 + .ra: x30 +STACK CFI 4bd10 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bd18 .cfa: x29 32 + +STACK CFI 4bd1c x19: .cfa -16 + ^ +STACK CFI 4be00 x19: x19 +STACK CFI 4be04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 67270 84 .cfa: sp 0 + .ra: x30 +STACK CFI 67274 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 67278 .cfa: x29 48 + +STACK CFI 6727c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 672ec x19: x19 x20: x20 +STACK CFI 672f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 672f4 190 .cfa: sp 0 + .ra: x30 +STACK CFI 672f8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 672fc .cfa: x29 96 + +STACK CFI 67300 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 67314 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ +STACK CFI 6746c x21: x21 x22: x22 +STACK CFI 67470 x19: x19 x20: x20 +STACK CFI 67474 x23: x23 x24: x24 +STACK CFI 67478 x25: x25 x26: x26 +STACK CFI 6747c x27: x27 +STACK CFI 67480 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 67484 2b4 .cfa: sp 0 + .ra: x30 +STACK CFI 67488 .cfa: sp 864 + +STACK CFI 6748c .cfa: sp 976 + .ra: .cfa -968 + ^ x29: .cfa -976 + ^ +STACK CFI 67490 .cfa: x29 976 + +STACK CFI 67498 x19: .cfa -960 + ^ x20: .cfa -952 + ^ x23: .cfa -928 + ^ x24: .cfa -920 + ^ +STACK CFI 674b8 v8: .cfa -880 + ^ x21: .cfa -944 + ^ x22: .cfa -936 + ^ x25: .cfa -912 + ^ x26: .cfa -904 + ^ x27: .cfa -896 + ^ x28: .cfa -888 + ^ +STACK CFI 67718 x19: x19 x20: x20 +STACK CFI 6771c x21: x21 x22: x22 +STACK CFI 67720 x23: x23 x24: x24 +STACK CFI 67724 x25: x25 x26: x26 +STACK CFI 67728 x27: x27 x28: x28 +STACK CFI 6772c v8: v8 +STACK CFI 67730 .cfa: sp 864 + .ra: .ra x29: x29 +STACK CFI 67734 .cfa: sp 752 + +STACK CFI INIT 67738 60 .cfa: sp 0 + .ra: x30 +STACK CFI 6773c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 67744 .cfa: x29 32 + +STACK CFI 67748 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 67768 x19: x19 x20: x20 +STACK CFI 6776c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 67770 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 67790 x19: x19 x20: x20 +STACK CFI 67794 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 67798 1ac .cfa: sp 0 + .ra: x30 +STACK CFI 6779c .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 677a0 .cfa: x29 416 + +STACK CFI 677a8 x19: .cfa -400 + ^ x20: .cfa -392 + ^ x25: .cfa -352 + ^ x26: .cfa -344 + ^ +STACK CFI 677c0 x21: .cfa -384 + ^ x22: .cfa -376 + ^ x23: .cfa -368 + ^ x24: .cfa -360 + ^ x27: .cfa -336 + ^ +STACK CFI 6792c x27: x27 +STACK CFI 67930 x19: x19 x20: x20 +STACK CFI 67934 x21: x21 x22: x22 +STACK CFI 67938 x23: x23 x24: x24 +STACK CFI 6793c x25: x25 x26: x26 +STACK CFI 67940 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 67944 120 .cfa: sp 0 + .ra: x30 +STACK CFI 67948 .cfa: sp 768 + +STACK CFI 67954 .cfa: sp 832 + .ra: .cfa -824 + ^ x29: .cfa -832 + ^ +STACK CFI 67958 .cfa: x29 832 + +STACK CFI 67960 x19: .cfa -816 + ^ x20: .cfa -808 + ^ x23: .cfa -784 + ^ +STACK CFI 67968 x21: .cfa -800 + ^ x22: .cfa -792 + ^ +STACK CFI 67a50 x23: x23 +STACK CFI 67a54 x19: x19 x20: x20 +STACK CFI 67a58 x21: x21 x22: x22 +STACK CFI 67a5c .cfa: sp 768 + .ra: .ra x29: x29 +STACK CFI 67a60 .cfa: sp 704 + +STACK CFI INIT 430ec 38 .cfa: sp 0 + .ra: x30 +STACK CFI 430f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 430fc .cfa: x29 32 + +STACK CFI 43100 x19: .cfa -16 + ^ +STACK CFI 4311c x19: x19 +STACK CFI 43120 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24844 40 .cfa: sp 0 + .ra: x30 +STACK CFI 24848 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24854 .cfa: x29 32 + +STACK CFI 24858 x19: .cfa -16 + ^ +STACK CFI 2487c x19: x19 +STACK CFI 24880 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bd0c fc .cfa: sp 0 + .ra: x30 +STACK CFI 4bd10 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bd18 .cfa: x29 32 + +STACK CFI 4bd1c x19: .cfa -16 + ^ +STACK CFI 4be00 x19: x19 +STACK CFI 4be04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 32c34 20 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 67a64 70 .cfa: sp 0 + .ra: x30 +STACK CFI 67a68 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 67a6c .cfa: x29 48 + +STACK CFI 67a70 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 67a78 x21: .cfa -16 + ^ +STACK CFI 67ac8 x19: x19 x20: x20 +STACK CFI 67acc x21: x21 +STACK CFI 67ad0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 67ad4 fc .cfa: sp 0 + .ra: x30 +STACK CFI 67ad8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 67adc .cfa: x29 64 + +STACK CFI 67ae0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 67af8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 67b6c x23: x23 +STACK CFI 67b7c x19: x19 x20: x20 +STACK CFI 67b80 x21: x21 x22: x22 +STACK CFI 67b84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 67b88 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI 67bac x21: x21 x22: x22 +STACK CFI 67bb0 x19: x19 x20: x20 +STACK CFI 67bb4 x23: x23 +STACK CFI 67bb8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 67bbc .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI 67bc0 x19: x19 x20: x20 +STACK CFI 67bc4 x21: x21 x22: x22 +STACK CFI 67bc8 x23: x23 +STACK CFI 67bcc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 67bd0 11c .cfa: sp 0 + .ra: x30 +STACK CFI 67bd4 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 67bdc .cfa: x29 320 + +STACK CFI 67be4 x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ +STACK CFI 67ce0 x19: x19 x20: x20 +STACK CFI 67ce4 x21: x21 x22: x22 +STACK CFI 67ce8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 67cec 5c .cfa: sp 0 + .ra: x30 +STACK CFI 67cf0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 67cf4 .cfa: x29 32 + +STACK CFI 67cf8 x19: .cfa -16 + ^ +STACK CFI 67d40 x19: x19 +STACK CFI 67d44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 67d48 4c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 67d94 84 .cfa: sp 0 + .ra: x30 +STACK CFI 67d98 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 67d9c .cfa: x29 64 + +STACK CFI 67da4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 67e0c x19: x19 x20: x20 +STACK CFI 67e10 x21: x21 x22: x22 +STACK CFI 67e14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 67e18 64 .cfa: sp 0 + .ra: x30 +STACK CFI 67e1c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 67e20 .cfa: x29 32 + +STACK CFI 67e24 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 67e64 x19: x19 x20: x20 +STACK CFI 67e68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 67e6c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 67e74 x19: x19 x20: x20 +STACK CFI 67e78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 67e7c 1bc .cfa: sp 0 + .ra: x30 +STACK CFI 67e80 .cfa: sp 368 + .ra: .cfa -360 + ^ x29: .cfa -368 + ^ +STACK CFI 67e84 .cfa: x29 368 + +STACK CFI 67e90 x19: .cfa -352 + ^ x20: .cfa -344 + ^ x21: .cfa -336 + ^ x22: .cfa -328 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ +STACK CFI 67eb0 x23: .cfa -320 + ^ x24: .cfa -312 + ^ x27: .cfa -288 + ^ +STACK CFI 68020 x27: x27 +STACK CFI 68024 x19: x19 x20: x20 +STACK CFI 68028 x21: x21 x22: x22 +STACK CFI 6802c x23: x23 x24: x24 +STACK CFI 68030 x25: x25 x26: x26 +STACK CFI 68034 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 68038 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 6803c .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 68040 .cfa: x29 80 + +STACK CFI 6804c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 6811c x21: x21 x22: x22 +STACK CFI 68120 x19: x19 x20: x20 +STACK CFI 68124 x23: x23 x24: x24 +STACK CFI 68128 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6812c 148 .cfa: sp 0 + .ra: x30 +STACK CFI 68130 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 68134 .cfa: x29 96 + +STACK CFI 68144 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 68260 x19: x19 x20: x20 +STACK CFI 68264 x21: x21 x22: x22 +STACK CFI 68268 x23: x23 x24: x24 +STACK CFI 6826c x25: x25 +STACK CFI 68270 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 68274 100 .cfa: sp 0 + .ra: x30 +STACK CFI 68278 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6827c .cfa: x29 64 + +STACK CFI 68280 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 68294 x21: .cfa -32 + ^ +STACK CFI 68368 x21: x21 +STACK CFI 6836c x19: x19 x20: x20 +STACK CFI 68370 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 68374 148 .cfa: sp 0 + .ra: x30 +STACK CFI 68378 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 6837c .cfa: x29 96 + +STACK CFI 6838c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 684a8 x19: x19 x20: x20 +STACK CFI 684ac x21: x21 x22: x22 +STACK CFI 684b0 x23: x23 x24: x24 +STACK CFI 684b4 x25: x25 +STACK CFI 684b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 684bc 58c .cfa: sp 0 + .ra: x30 +STACK CFI 684c0 .cfa: sp 464 + .ra: .cfa -456 + ^ x29: .cfa -464 + ^ +STACK CFI 684c8 .cfa: x29 464 + +STACK CFI 684e8 v10: .cfa -352 + ^ v11: .cfa -344 + ^ v12: .cfa -336 + ^ v13: .cfa -328 + ^ v8: .cfa -368 + ^ v9: .cfa -360 + ^ x19: .cfa -448 + ^ x20: .cfa -440 + ^ x21: .cfa -432 + ^ x22: .cfa -424 + ^ x23: .cfa -416 + ^ x24: .cfa -408 + ^ x25: .cfa -400 + ^ x26: .cfa -392 + ^ x27: .cfa -384 + ^ x28: .cfa -376 + ^ +STACK CFI 68a24 x19: x19 x20: x20 +STACK CFI 68a28 v8: v8 v9: v9 +STACK CFI 68a2c x21: x21 x22: x22 +STACK CFI 68a30 v10: v10 v11: v11 +STACK CFI 68a34 x23: x23 x24: x24 +STACK CFI 68a38 v12: v12 v13: v13 +STACK CFI 68a3c x25: x25 x26: x26 +STACK CFI 68a40 x27: x27 x28: x28 +STACK CFI 68a44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 68a48 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 68a50 48 .cfa: sp 0 + .ra: x30 +STACK CFI 68a54 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 68a60 .cfa: x29 32 + +STACK CFI 68a64 x19: .cfa -16 + ^ +STACK CFI 68a90 x19: x19 +STACK CFI 68a94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 68a98 a0 .cfa: sp 0 + .ra: x30 +STACK CFI 68a9c .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 68aa4 .cfa: x29 96 + +STACK CFI 68aa8 x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 68abc x19: .cfa -80 + ^ x20: .cfa -72 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 68b24 x19: x19 x20: x20 +STACK CFI 68b28 x21: x21 x22: x22 +STACK CFI 68b2c x23: x23 x24: x24 +STACK CFI 68b30 x25: x25 x26: x26 +STACK CFI 68b34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 389d0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 389d4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 389d8 .cfa: x29 32 + +STACK CFI 389dc x19: .cfa -16 + ^ +STACK CFI 389ec x19: x19 +STACK CFI 389f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 68b38 e4 .cfa: sp 0 + .ra: x30 +STACK CFI 68b3c .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 68b44 .cfa: x29 80 + +STACK CFI 68b48 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 68b64 x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ +STACK CFI 68c08 x19: x19 x20: x20 +STACK CFI 68c0c x21: x21 x22: x22 +STACK CFI 68c10 x23: x23 x24: x24 +STACK CFI 68c14 x25: x25 +STACK CFI 68c18 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 68c1c 78 .cfa: sp 0 + .ra: x30 +STACK CFI 68c20 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 68c24 .cfa: x29 48 + +STACK CFI 68c2c x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 68c88 x21: x21 +STACK CFI 68c8c x19: x19 x20: x20 +STACK CFI 68c90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bd0c fc .cfa: sp 0 + .ra: x30 +STACK CFI 4bd10 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bd18 .cfa: x29 32 + +STACK CFI 4bd1c x19: .cfa -16 + ^ +STACK CFI 4be00 x19: x19 +STACK CFI 4be04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 68c94 2dc .cfa: sp 0 + .ra: x30 +STACK CFI 68c98 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 68c9c .cfa: x29 384 + +STACK CFI 68cb0 x19: .cfa -368 + ^ x20: .cfa -360 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ x23: .cfa -336 + ^ x24: .cfa -328 + ^ x25: .cfa -320 + ^ x26: .cfa -312 + ^ x27: .cfa -304 + ^ x28: .cfa -296 + ^ +STACK CFI 68f58 x19: x19 x20: x20 +STACK CFI 68f5c x21: x21 x22: x22 +STACK CFI 68f60 x23: x23 x24: x24 +STACK CFI 68f64 x25: x25 x26: x26 +STACK CFI 68f68 x27: x27 x28: x28 +STACK CFI 68f6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 68f70 30 .cfa: sp 0 + .ra: x30 +STACK CFI 68f74 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 68f78 .cfa: x29 32 + +STACK CFI 68f7c x19: .cfa -16 + ^ +STACK CFI 68f98 x19: x19 +STACK CFI 68f9c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 68fa0 110 .cfa: sp 0 + .ra: x30 +STACK CFI 68fa4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 68fa8 .cfa: x29 80 + +STACK CFI 68fac x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 68fbc x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ x26: .cfa -8 + ^ +STACK CFI 6909c x21: x21 x22: x22 +STACK CFI 690a0 x19: x19 x20: x20 +STACK CFI 690a4 x23: x23 x24: x24 +STACK CFI 690a8 x25: x25 x26: x26 +STACK CFI 690ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 690b0 240 .cfa: sp 0 + .ra: x30 +STACK CFI 690b4 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 690bc .cfa: x29 384 + +STACK CFI 690d4 v8: .cfa -288 + ^ x19: .cfa -368 + ^ x20: .cfa -360 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ x23: .cfa -336 + ^ x24: .cfa -328 + ^ x25: .cfa -320 + ^ x26: .cfa -312 + ^ x27: .cfa -304 + ^ x28: .cfa -296 + ^ +STACK CFI 692d4 x19: x19 x20: x20 +STACK CFI 692d8 x21: x21 x22: x22 +STACK CFI 692dc x23: x23 x24: x24 +STACK CFI 692e0 x25: x25 x26: x26 +STACK CFI 692e4 x27: x27 x28: x28 +STACK CFI 692e8 v8: v8 +STACK CFI 692ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 692f0 154 .cfa: sp 0 + .ra: x30 +STACK CFI 692f4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 692f8 .cfa: x29 80 + +STACK CFI 69304 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 69434 x19: x19 x20: x20 +STACK CFI 69438 x21: x21 x22: x22 +STACK CFI 6943c x23: x23 x24: x24 +STACK CFI 69440 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 69444 1a4 .cfa: sp 0 + .ra: x30 +STACK CFI 69448 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 6944c .cfa: x29 96 + +STACK CFI 6945c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 695d4 x19: x19 x20: x20 +STACK CFI 695d8 x21: x21 x22: x22 +STACK CFI 695dc x23: x23 x24: x24 +STACK CFI 695e0 x25: x25 x26: x26 +STACK CFI 695e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 695e8 44 .cfa: sp 0 + .ra: x30 +STACK CFI 695ec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 695f4 .cfa: x29 32 + +STACK CFI 695f8 x19: .cfa -16 + ^ +STACK CFI 69624 x19: x19 +STACK CFI 69628 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 20648 44 .cfa: sp 0 + .ra: x30 +STACK CFI 2064c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 20654 .cfa: x29 32 + +STACK CFI 20658 x19: .cfa -16 + ^ +STACK CFI 20684 x19: x19 +STACK CFI 20688 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6962c 78 .cfa: sp 0 + .ra: x30 +STACK CFI 69630 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 69634 .cfa: x29 32 + +STACK CFI 69638 x19: .cfa -16 + ^ +STACK CFI 6969c x19: x19 +STACK CFI 696a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 696a4 50 .cfa: sp 0 + .ra: x30 +STACK CFI 696a8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 696b4 .cfa: x29 32 + +STACK CFI 696b8 x19: .cfa -16 + ^ +STACK CFI 696ec x19: x19 +STACK CFI 696f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 696f4 184 .cfa: sp 0 + .ra: x30 +STACK CFI 696f8 .cfa: sp 848 + +STACK CFI 696fc .cfa: sp 928 + .ra: .cfa -920 + ^ x29: .cfa -928 + ^ +STACK CFI 69700 .cfa: x29 928 + +STACK CFI 69708 x19: .cfa -912 + ^ x20: .cfa -904 + ^ x21: .cfa -896 + ^ x22: .cfa -888 + ^ +STACK CFI 69718 x23: .cfa -880 + ^ x24: .cfa -872 + ^ +STACK CFI 69738 x25: .cfa -864 + ^ x26: .cfa -856 + ^ +STACK CFI 69860 x19: x19 x20: x20 +STACK CFI 69864 x21: x21 x22: x22 +STACK CFI 69868 x23: x23 x24: x24 +STACK CFI 6986c x25: x25 x26: x26 +STACK CFI 69870 .cfa: sp 848 + .ra: .ra x29: x29 +STACK CFI 69874 .cfa: sp 768 + +STACK CFI INIT 69878 48 .cfa: sp 0 + .ra: x30 +STACK CFI 6987c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 69880 .cfa: x29 32 + +STACK CFI 69884 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 698b8 x19: x19 x20: x20 +STACK CFI 698bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 698c0 ec .cfa: sp 0 + .ra: x30 +STACK CFI 698c4 .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI 698cc .cfa: x29 272 + +STACK CFI 698d0 x19: .cfa -256 + ^ x20: .cfa -248 + ^ +STACK CFI 698e4 x23: .cfa -224 + ^ +STACK CFI 698f0 x21: .cfa -240 + ^ x22: .cfa -232 + ^ +STACK CFI 6999c x23: x23 +STACK CFI 699a0 x19: x19 x20: x20 +STACK CFI 699a4 x21: x21 x22: x22 +STACK CFI 699a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 4bd0c fc .cfa: sp 0 + .ra: x30 +STACK CFI 4bd10 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 4bd18 .cfa: x29 32 + +STACK CFI 4bd1c x19: .cfa -16 + ^ +STACK CFI 4be00 x19: x19 +STACK CFI 4be04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2068c 16c .cfa: sp 0 + .ra: x30 +STACK CFI 20690 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 20694 .cfa: x29 112 + +STACK CFI 20698 x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 206ac x19: .cfa -96 + ^ x20: .cfa -88 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ +STACK CFI 207e4 x25: x25 +STACK CFI 207e8 x19: x19 x20: x20 +STACK CFI 207ec x21: x21 x22: x22 +STACK CFI 207f0 x23: x23 x24: x24 +STACK CFI 207f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 207f8 5c .cfa: sp 0 + .ra: x30 +STACK CFI 207fc .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 20800 .cfa: x29 304 + +STACK CFI 20808 x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ +STACK CFI 20848 x19: x19 x20: x20 +STACK CFI 2084c x21: x21 +STACK CFI 20850 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 164 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 528 + +STACK CFI c .cfa: sp 608 + .ra: .cfa -600 + ^ x29: .cfa -608 + ^ +STACK CFI 10 .cfa: x29 608 + +STACK CFI 14 x19: .cfa -592 + ^ x20: .cfa -584 + ^ +STACK CFI 1c x25: .cfa -544 + ^ x26: .cfa -536 + ^ +STACK CFI 30 x21: .cfa -576 + ^ x22: .cfa -568 + ^ x23: .cfa -560 + ^ x24: .cfa -552 + ^ +STACK CFI 14c x19: x19 x20: x20 +STACK CFI 150 x21: x21 x22: x22 +STACK CFI 154 x23: x23 x24: x24 +STACK CFI 158 x25: x25 x26: x26 +STACK CFI 15c .cfa: sp 528 + .ra: .ra x29: x29 +STACK CFI 160 .cfa: sp 448 + +STACK CFI INIT 0 1a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI 1c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ +STACK CFI 190 x19: x19 x20: x20 +STACK CFI 194 x21: x21 x22: x22 +STACK CFI 198 x23: x23 x24: x24 +STACK CFI 19c x25: x25 x26: x26 +STACK CFI 1a0 x27: x27 +STACK CFI 1a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 699ac 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 699c4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 699ec 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 69a00 120 .cfa: sp 0 + .ra: x30 +STACK CFI 69a04 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 69a08 .cfa: x29 80 + +STACK CFI 69a0c x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 69a18 x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 69b14 x19: x19 x20: x20 +STACK CFI 69b18 x21: x21 x22: x22 +STACK CFI 69b1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 69b20 2c8 .cfa: sp 0 + .ra: x30 +STACK CFI 69b24 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 69b28 .cfa: x29 224 + +STACK CFI 69b38 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ x25: .cfa -160 + ^ +STACK CFI 69dd4 x25: x25 +STACK CFI 69dd8 x19: x19 x20: x20 +STACK CFI 69ddc x21: x21 x22: x22 +STACK CFI 69de0 x23: x23 x24: x24 +STACK CFI 69de4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 69de8 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 69e10 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 69e14 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 69e18 .cfa: x29 64 + +STACK CFI 69e24 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 69eb8 x19: x19 x20: x20 +STACK CFI 69ebc x21: x21 x22: x22 +STACK CFI 69ec0 x23: x23 +STACK CFI 69ec4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 38 x19: x19 x20: x20 +STACK CFI 3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 3c x19: x19 x20: x20 +STACK CFI 40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 69ec8 17c .cfa: sp 0 + .ra: x30 +STACK CFI 69ecc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 69ed0 .cfa: x29 64 + +STACK CFI 69ed4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 69edc x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 6a038 x21: x21 x22: x22 +STACK CFI 6a03c x19: x19 x20: x20 +STACK CFI 6a040 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6a044 54 .cfa: sp 0 + .ra: x30 +STACK CFI 6a048 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6a054 .cfa: x29 32 + +STACK CFI 6a094 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6a098 124 .cfa: sp 0 + .ra: x30 +STACK CFI 6a09c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 6a0a0 .cfa: x29 112 + +STACK CFI 6a0ac x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ +STACK CFI 6a1ac x23: x23 +STACK CFI 6a1b0 x19: x19 x20: x20 +STACK CFI 6a1b4 x21: x21 x22: x22 +STACK CFI 6a1b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6a1bc 4c8 .cfa: sp 0 + .ra: x30 +STACK CFI 6a1c0 .cfa: sp 1760 + +STACK CFI 6a1c4 .cfa: sp 1904 + .ra: .cfa -1896 + ^ x29: .cfa -1904 + ^ +STACK CFI 6a1c8 .cfa: x29 1904 + +STACK CFI 6a1e8 v10: .cfa -1792 + ^ v11: .cfa -1784 + ^ v12: .cfa -1776 + ^ v8: .cfa -1808 + ^ v9: .cfa -1800 + ^ x19: .cfa -1888 + ^ x20: .cfa -1880 + ^ x21: .cfa -1872 + ^ x22: .cfa -1864 + ^ x23: .cfa -1856 + ^ x24: .cfa -1848 + ^ x25: .cfa -1840 + ^ x26: .cfa -1832 + ^ x27: .cfa -1824 + ^ x28: .cfa -1816 + ^ +STACK CFI 6a65c v8: v8 v9: v9 +STACK CFI 6a660 x19: x19 x20: x20 +STACK CFI 6a664 v10: v10 v11: v11 +STACK CFI 6a668 x21: x21 x22: x22 +STACK CFI 6a66c x23: x23 x24: x24 +STACK CFI 6a670 x25: x25 x26: x26 +STACK CFI 6a674 x27: x27 x28: x28 +STACK CFI 6a678 v12: v12 +STACK CFI 6a67c .cfa: sp 1760 + .ra: .ra x29: x29 +STACK CFI 6a680 .cfa: sp 1616 + +STACK CFI INIT 6a684 f4 .cfa: sp 0 + .ra: x30 +STACK CFI 6a688 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 6a68c .cfa: x29 128 + +STACK CFI 6a69c x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ +STACK CFI 6a764 x19: x19 x20: x20 +STACK CFI 6a768 x21: x21 x22: x22 +STACK CFI 6a76c x23: x23 x24: x24 +STACK CFI 6a770 x25: x25 +STACK CFI 6a774 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6a778 130 .cfa: sp 0 + .ra: x30 +STACK CFI 6a77c .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 6a780 .cfa: x29 80 + +STACK CFI 6a78c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 6a870 x19: x19 x20: x20 +STACK CFI 6a874 x21: x21 x22: x22 +STACK CFI 6a878 x23: x23 +STACK CFI 6a87c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6a880 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x29: .cfa -80 + ^ +STACK CFI 6a898 x23: x23 +STACK CFI 6a89c x19: x19 x20: x20 +STACK CFI 6a8a0 x21: x21 x22: x22 +STACK CFI 6a8a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6a8a8 130 .cfa: sp 0 + .ra: x30 +STACK CFI 6a8ac .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 6a8b0 .cfa: x29 96 + +STACK CFI 6a8c0 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 6a9c4 x19: x19 x20: x20 +STACK CFI 6a9c8 x21: x21 x22: x22 +STACK CFI 6a9cc x23: x23 x24: x24 +STACK CFI 6a9d0 x25: x25 +STACK CFI 6a9d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6a9d8 d08 .cfa: sp 0 + .ra: x30 +STACK CFI 6a9dc .cfa: sp 1232 + +STACK CFI 6a9e4 .cfa: sp 1392 + .ra: .cfa -1384 + ^ x29: .cfa -1392 + ^ +STACK CFI 6a9e8 .cfa: x29 1392 + +STACK CFI 6a9f0 v8: .cfa -1296 + ^ v9: .cfa -1288 + ^ x21: .cfa -1360 + ^ x22: .cfa -1352 + ^ +STACK CFI 6aa00 v10: .cfa -1280 + ^ v11: .cfa -1272 + ^ x23: .cfa -1344 + ^ x24: .cfa -1336 + ^ +STACK CFI 6aa24 v12: .cfa -1264 + ^ v13: .cfa -1256 + ^ v14: .cfa -1248 + ^ v15: .cfa -1240 + ^ x25: .cfa -1328 + ^ x26: .cfa -1320 + ^ +STACK CFI 6aa34 x19: .cfa -1376 + ^ x20: .cfa -1368 + ^ x27: .cfa -1312 + ^ x28: .cfa -1304 + ^ +STACK CFI 6b6b4 x19: x19 x20: x20 +STACK CFI 6b6b8 x21: x21 x22: x22 +STACK CFI 6b6bc v8: v8 v9: v9 +STACK CFI 6b6c0 x23: x23 x24: x24 +STACK CFI 6b6c4 v10: v10 v11: v11 +STACK CFI 6b6c8 x25: x25 x26: x26 +STACK CFI 6b6cc v12: v12 v13: v13 +STACK CFI 6b6d0 x27: x27 x28: x28 +STACK CFI 6b6d4 v14: v14 v15: v15 +STACK CFI 6b6d8 .cfa: sp 1232 + .ra: .ra x29: x29 +STACK CFI 6b6dc .cfa: sp 1072 + +STACK CFI INIT 6b6e0 148 .cfa: sp 0 + .ra: x30 +STACK CFI 6b6e4 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 6b6e8 .cfa: x29 416 + +STACK CFI 6b6ec x21: .cfa -384 + ^ x22: .cfa -376 + ^ +STACK CFI 6b6fc x19: .cfa -400 + ^ x20: .cfa -392 + ^ x25: .cfa -352 + ^ x26: .cfa -344 + ^ x27: .cfa -336 + ^ +STACK CFI 6b718 x23: .cfa -368 + ^ x24: .cfa -360 + ^ +STACK CFI 6b80c x27: x27 +STACK CFI 6b814 x19: x19 x20: x20 +STACK CFI 6b818 x21: x21 x22: x22 +STACK CFI 6b81c x23: x23 x24: x24 +STACK CFI 6b820 x25: x25 x26: x26 +STACK CFI 6b824 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6b828 74 .cfa: sp 0 + .ra: x30 +STACK CFI 6b82c .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 6b838 .cfa: x29 80 + +STACK CFI 6b83c x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 6b860 x21: .cfa -48 + ^ +STACK CFI 6b890 x21: x21 +STACK CFI 6b894 x19: x19 x20: x20 +STACK CFI 6b898 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6b89c 7c .cfa: sp 0 + .ra: x30 +STACK CFI 6b8a0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 6b8ac .cfa: x29 80 + +STACK CFI 6b8b0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 6b8dc x21: .cfa -48 + ^ +STACK CFI 6b90c x21: x21 +STACK CFI 6b910 x19: x19 x20: x20 +STACK CFI 6b914 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6b918 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 34 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6b944 34 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6b978 3c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6b9b4 108 .cfa: sp 0 + .ra: x30 +STACK CFI 6b9b8 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 6b9bc .cfa: x29 416 + +STACK CFI 6b9c0 x21: .cfa -384 + ^ x22: .cfa -376 + ^ +STACK CFI 6b9c8 x23: .cfa -368 + ^ +STACK CFI 6b9d4 x19: .cfa -400 + ^ x20: .cfa -392 + ^ +STACK CFI 6baa8 x23: x23 +STACK CFI 6bab0 x19: x19 x20: x20 +STACK CFI 6bab4 x21: x21 x22: x22 +STACK CFI 6bab8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 a4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 8 .cfa: x29 176 + +STACK CFI c x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 9c x19: x19 x20: x20 +STACK CFI a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6babc 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6bad8 58 .cfa: sp 0 + .ra: x30 +STACK CFI 6badc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6bae8 .cfa: x29 32 + +STACK CFI 6baec x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6bb28 x19: x19 x20: x20 +STACK CFI 6bb2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bb30 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6bb3c 7c .cfa: sp 0 + .ra: x30 +STACK CFI 6bb40 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6bb48 .cfa: x29 32 + +STACK CFI 6bb4c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6bbb0 x19: x19 x20: x20 +STACK CFI 6bbb4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bbb8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6bbc8 80 .cfa: sp 0 + .ra: x30 +STACK CFI 6bbcc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6bbd4 .cfa: x29 48 + +STACK CFI 6bbdc x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 6bc3c x21: x21 +STACK CFI 6bc40 x19: x19 x20: x20 +STACK CFI 6bc44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bc48 ac .cfa: sp 0 + .ra: x30 +STACK CFI 6bc4c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6bc54 .cfa: x29 32 + +STACK CFI 6bc58 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6bcec x19: x19 x20: x20 +STACK CFI 6bcf0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bcf4 34 .cfa: sp 0 + .ra: x30 +STACK CFI 6bcf8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6bcfc .cfa: x29 32 + +STACK CFI 6bd00 x19: .cfa -16 + ^ +STACK CFI 6bd20 x19: x19 +STACK CFI 6bd24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bd28 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 88 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 7c x19: x19 x20: x20 +STACK CFI 80 x21: x21 +STACK CFI 84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bd30 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI c .cfa: x29 96 + +STACK CFI 10 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 20 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 x21: x21 x22: x22 +STACK CFI 9c x23: x23 x24: x24 +STACK CFI a0 x25: x25 x26: x26 +STACK CFI a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bd44 9c .cfa: sp 0 + .ra: x30 +STACK CFI 6bd48 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 6bd50 .cfa: x29 96 + +STACK CFI 6bd60 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 6bdcc x19: x19 x20: x20 +STACK CFI 6bdd0 x21: x21 x22: x22 +STACK CFI 6bdd4 x23: x23 x24: x24 +STACK CFI 6bdd8 x25: x25 +STACK CFI 6bddc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 12c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 10 .cfa: x29 112 + +STACK CFI 14 x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 28 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x23: .cfa -64 + ^ +STACK CFI 11c x23: x23 +STACK CFI 120 x19: x19 x20: x20 +STACK CFI 124 x21: x21 x22: x22 +STACK CFI 128 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bde0 12c .cfa: sp 0 + .ra: x30 +STACK CFI 6bde4 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 6bdf0 .cfa: x29 112 + +STACK CFI 6bdf4 x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 6be08 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x23: .cfa -64 + ^ +STACK CFI 6befc x23: x23 +STACK CFI 6bf00 x19: x19 x20: x20 +STACK CFI 6bf04 x21: x21 x22: x22 +STACK CFI 6bf08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 51a2c 3c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6bf0c 3c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6bf48 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6bf54 1c .cfa: sp 0 + .ra: x30 +STACK CFI 6bf58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6bf5c .cfa: x29 16 + +STACK CFI 6bf6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bf70 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6bf74 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6bf78 .cfa: x29 16 + +STACK CFI 6bf90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bf94 40 .cfa: sp 0 + .ra: x30 +STACK CFI 6bf98 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6bf9c .cfa: x29 32 + +STACK CFI 6bfa0 x19: .cfa -16 + ^ +STACK CFI 6bfcc x19: x19 +STACK CFI 6bfd0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6bfd4 48 .cfa: sp 0 + .ra: x30 +STACK CFI 6bfd8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6bfdc .cfa: x29 32 + +STACK CFI 6bfe0 x19: .cfa -16 + ^ +STACK CFI 6c014 x19: x19 +STACK CFI 6c018 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c01c 58 .cfa: sp 0 + .ra: x30 +STACK CFI 6c020 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6c024 .cfa: x29 32 + +STACK CFI 6c028 x19: .cfa -16 + ^ +STACK CFI 6c06c x19: x19 +STACK CFI 6c070 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6c074 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6c080 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6c08c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6c098 58 .cfa: sp 0 + .ra: x30 +STACK CFI 6c09c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6c0a0 .cfa: x29 16 + +STACK CFI 6c0ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c0f0 48 .cfa: sp 0 + .ra: x30 +STACK CFI 6c0f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6c0f8 .cfa: x29 32 + +STACK CFI 6c0fc x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6c120 x19: x19 x20: x20 +STACK CFI 6c124 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6c12c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 6c130 x19: x19 x20: x20 +STACK CFI 6c134 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c138 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6c13c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6c140 .cfa: x29 16 + +STACK CFI 6c158 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c15c 60 .cfa: sp 0 + .ra: x30 +STACK CFI 6c160 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6c164 .cfa: x29 48 + +STACK CFI 6c16c x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 6c1b0 x19: x19 x20: x20 +STACK CFI 6c1b4 x21: x21 x22: x22 +STACK CFI 6c1b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c1bc c4 .cfa: sp 0 + .ra: x30 +STACK CFI 6c1c0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 6c1c4 .cfa: x29 80 + +STACK CFI 6c1d4 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ +STACK CFI 6c26c x19: x19 x20: x20 +STACK CFI 6c270 x21: x21 x22: x22 +STACK CFI 6c274 x23: x23 x24: x24 +STACK CFI 6c278 x25: x25 +STACK CFI 6c27c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c280 44 .cfa: sp 0 + .ra: x30 +STACK CFI 6c284 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6c28c .cfa: x29 32 + +STACK CFI 6c290 x19: .cfa -16 + ^ +STACK CFI 6c2bc x19: x19 +STACK CFI 6c2c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c2c4 28 .cfa: sp 0 + .ra: x30 +STACK CFI 6c2c8 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6c2d4 .cfa: x29 16 + +STACK CFI 6c2e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6c2ec 1e8 .cfa: sp 0 + .ra: x30 +STACK CFI 6c2f0 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 6c2f4 .cfa: x29 128 + +STACK CFI 6c310 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ +STACK CFI 6c31c v8: .cfa -32 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 6c4b8 x19: x19 x20: x20 +STACK CFI 6c4bc x21: x21 x22: x22 +STACK CFI 6c4c0 x23: x23 x24: x24 +STACK CFI 6c4c4 x25: x25 x26: x26 +STACK CFI 6c4c8 x27: x27 x28: x28 +STACK CFI 6c4cc v8: v8 +STACK CFI 6c4d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c4d4 104 .cfa: sp 0 + .ra: x30 +STACK CFI 6c4d8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6c4dc .cfa: x29 64 + +STACK CFI 6c4e0 x19: .cfa -48 + ^ +STACK CFI 6c5d0 x19: x19 +STACK CFI 6c5d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c5d8 ac .cfa: sp 0 + .ra: x30 +STACK CFI 6c5dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6c5e0 .cfa: x29 64 + +STACK CFI 6c5e4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 6c5ec x21: .cfa -32 + ^ +STACK CFI 6c678 x19: x19 x20: x20 +STACK CFI 6c67c x21: x21 +STACK CFI 6c680 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c684 220 .cfa: sp 0 + .ra: x30 +STACK CFI 6c688 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 6c68c .cfa: x29 112 + +STACK CFI 6c698 x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ +STACK CFI 6c6bc x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 6c894 x19: x19 x20: x20 +STACK CFI 6c898 x21: x21 x22: x22 +STACK CFI 6c89c x23: x23 +STACK CFI 6c8a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c8a4 60 .cfa: sp 0 + .ra: x30 +STACK CFI 6c8a8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6c8b0 .cfa: x29 64 + +STACK CFI 6c8b8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 6c8f4 x21: x21 +STACK CFI 6c8fc x19: x19 x20: x20 +STACK CFI 6c900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c904 d4 .cfa: sp 0 + .ra: x30 +STACK CFI 6c908 .cfa: sp 16 + +STACK CFI 6c9d0 .cfa: sp 0 + +STACK CFI INIT 6c9d8 18 .cfa: sp 0 + .ra: x30 +STACK CFI 6c9dc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6c9e4 .cfa: x29 16 + +STACK CFI 6c9ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6c9f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 6c9f4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6c9fc .cfa: x29 32 + +STACK CFI 6ca00 x19: .cfa -16 + ^ +STACK CFI 6ca74 x19: x19 +STACK CFI 6ca78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ca7c 98 .cfa: sp 0 + .ra: x30 +STACK CFI 6ca80 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6ca88 .cfa: x29 32 + +STACK CFI 6ca8c x19: .cfa -16 + ^ +STACK CFI 6cb0c x19: x19 +STACK CFI 6cb10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6cb14 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cb30 38 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cb68 4c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cbb4 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cc10 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cc34 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cc5c 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cc84 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6ccac 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6ccd4 6c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cd40 38 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cd78 20 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cd98 3c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cdd4 4c .cfa: sp 0 + .ra: x30 +STACK CFI 6cdd8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6cddc .cfa: x29 32 + +STACK CFI 6cde0 x19: .cfa -16 + ^ +STACK CFI 6ce18 x19: x19 +STACK CFI 6ce1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ce20 48 .cfa: sp 0 + .ra: x30 +STACK CFI 6ce28 .cfa: sp 16 + +STACK CFI 6ce64 .cfa: sp 0 + +STACK CFI INIT 6ce68 44 .cfa: sp 0 + .ra: x30 +STACK CFI 6ce6c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6ce74 .cfa: x29 32 + +STACK CFI 6ce78 x19: .cfa -16 + ^ +STACK CFI 6cea4 x19: x19 +STACK CFI 6cea8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ceac c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6ceb8 50 .cfa: sp 0 + .ra: x30 +STACK CFI 6cebc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6cec0 .cfa: x29 32 + +STACK CFI 6cec4 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6cf00 x19: x19 x20: x20 +STACK CFI 6cf04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6cf08 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6cf0c 13c .cfa: sp 0 + .ra: x30 +STACK CFI 6cf10 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 6cf14 .cfa: x29 208 + +STACK CFI 6cf20 x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ x24: .cfa -152 + ^ +STACK CFI 6cf2c x19: .cfa -192 + ^ x20: .cfa -184 + ^ +STACK CFI 6d038 x19: x19 x20: x20 +STACK CFI 6d03c x21: x21 x22: x22 +STACK CFI 6d040 x23: x23 x24: x24 +STACK CFI 6d044 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d048 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d054 7c .cfa: sp 0 + .ra: x30 +STACK CFI 6d058 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6d064 .cfa: x29 48 + +STACK CFI 6d06c x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 6d0c4 x19: x19 x20: x20 +STACK CFI 6d0c8 x21: x21 +STACK CFI 6d0cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d0d0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 6d0d4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 6d0d8 .cfa: x29 80 + +STACK CFI 6d0e0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 6d0e8 x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 6d14c x19: x19 x20: x20 +STACK CFI 6d150 x21: x21 x22: x22 +STACK CFI 6d154 x23: x23 x24: x24 +STACK CFI 6d158 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 10 .cfa: x29 64 + +STACK CFI 18 x19: .cfa -48 + ^ +STACK CFI 50 x19: x19 +STACK CFI 54 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 ac .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 14 x21: .cfa -32 + ^ +STACK CFI a0 x19: x19 x20: x20 +STACK CFI a4 x21: x21 +STACK CFI a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI c .cfa: x29 96 + +STACK CFI 14 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 100 x19: x19 x20: x20 +STACK CFI 104 x21: x21 x22: x22 +STACK CFI 108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 154 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 14 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 144 x19: x19 x20: x20 +STACK CFI 148 x21: x21 x22: x22 +STACK CFI 14c x23: x23 x24: x24 +STACK CFI 150 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 17c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI 18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 168 x19: x19 x20: x20 +STACK CFI 16c x21: x21 x22: x22 +STACK CFI 170 x23: x23 x24: x24 +STACK CFI 174 x25: x25 +STACK CFI 178 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 18 x21: .cfa -48 + ^ +STACK CFI a8 x21: x21 +STACK CFI ac x19: x19 x20: x20 +STACK CFI b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 18 x21: .cfa -48 + ^ +STACK CFI a8 x21: x21 +STACK CFI ac x19: x19 x20: x20 +STACK CFI b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d200 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d204 44 .cfa: sp 0 + .ra: x30 +STACK CFI 6d208 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6d210 .cfa: x29 32 + +STACK CFI 6d214 x19: .cfa -16 + ^ +STACK CFI 6d240 x19: x19 +STACK CFI 6d244 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d248 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d24c 158 .cfa: sp 0 + .ra: x30 +STACK CFI 6d250 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 6d25c .cfa: x29 160 + +STACK CFI 6d260 x21: .cfa -128 + ^ +STACK CFI 6d268 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 6d398 x19: x19 x20: x20 +STACK CFI 6d39c x21: x21 +STACK CFI 6d3a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d3a4 44 .cfa: sp 0 + .ra: x30 +STACK CFI 6d3a8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6d3b4 .cfa: x29 32 + +STACK CFI 6d3b8 x19: .cfa -16 + ^ +STACK CFI 6d3e0 x19: x19 +STACK CFI 6d3e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d3e8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d3ec 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d3f4 68 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d45c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d464 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d46c 64 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d4d0 fc .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 d8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 164 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d5cc 220 .cfa: sp 0 + .ra: x30 +STACK CFI 6d5d0 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 6d5d8 .cfa: x29 144 + +STACK CFI 6d5ec x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI 6d7d4 x19: x19 x20: x20 +STACK CFI 6d7d8 x21: x21 x22: x22 +STACK CFI 6d7dc x23: x23 x24: x24 +STACK CFI 6d7e0 x25: x25 x26: x26 +STACK CFI 6d7e4 x27: x27 x28: x28 +STACK CFI 6d7e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 124 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 1f4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 10 .cfa: x29 144 + +STACK CFI 24 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI 1dc x19: x19 x20: x20 +STACK CFI 1e0 x21: x21 x22: x22 +STACK CFI 1e4 x23: x23 x24: x24 +STACK CFI 1e8 x25: x25 x26: x26 +STACK CFI 1ec x27: x27 x28: x28 +STACK CFI 1f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d7ec 38 .cfa: sp 0 + .ra: x30 +STACK CFI 6d7f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6d7f4 .cfa: x29 32 + +STACK CFI 6d7f8 x19: .cfa -16 + ^ +STACK CFI 6d81c x19: x19 +STACK CFI 6d820 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d824 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d840 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d848 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d850 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d858 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d860 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d868 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d870 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d878 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d880 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d888 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d890 88 .cfa: sp 0 + .ra: x30 +STACK CFI 6d894 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6d898 .cfa: x29 32 + +STACK CFI 6d89c x19: .cfa -16 + ^ +STACK CFI 6d910 x19: x19 +STACK CFI 6d914 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d918 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6d928 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6d92c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6d930 .cfa: x29 32 + +STACK CFI 6d934 x19: .cfa -16 + ^ +STACK CFI 6d944 x19: x19 +STACK CFI 6d948 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 6c x19: x19 +STACK CFI 70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1d4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 18 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 1b0 x23: x23 +STACK CFI 1b4 x19: x19 x20: x20 +STACK CFI 1b8 x21: x21 x22: x22 +STACK CFI 1bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 1c0 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI 1c4 x19: x19 x20: x20 +STACK CFI 1c8 x21: x21 x22: x22 +STACK CFI 1cc x23: x23 +STACK CFI 1d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d94c 70 .cfa: sp 0 + .ra: x30 +STACK CFI 6d950 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6d954 .cfa: x29 48 + +STACK CFI 6d958 x19: .cfa -32 + ^ +STACK CFI 6d9b4 x19: x19 +STACK CFI 6d9b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d9bc 74 .cfa: sp 0 + .ra: x30 +STACK CFI 6d9c0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6d9c4 .cfa: x29 48 + +STACK CFI 6d9c8 x19: .cfa -32 + ^ +STACK CFI 6da28 x19: x19 +STACK CFI 6da2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6da30 74 .cfa: sp 0 + .ra: x30 +STACK CFI 6da34 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6da38 .cfa: x29 48 + +STACK CFI 6da3c x19: .cfa -32 + ^ +STACK CFI 6da9c x19: x19 +STACK CFI 6daa0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6daa4 74 .cfa: sp 0 + .ra: x30 +STACK CFI 6daa8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6daac .cfa: x29 48 + +STACK CFI 6dab0 x19: .cfa -32 + ^ +STACK CFI 6db10 x19: x19 +STACK CFI 6db14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6db18 70 .cfa: sp 0 + .ra: x30 +STACK CFI 6db1c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6db20 .cfa: x29 48 + +STACK CFI 6db24 x19: .cfa -32 + ^ +STACK CFI 6db80 x19: x19 +STACK CFI 6db84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6db88 74 .cfa: sp 0 + .ra: x30 +STACK CFI 6db8c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6db90 .cfa: x29 48 + +STACK CFI 6db94 x19: .cfa -32 + ^ +STACK CFI 6dbf4 x19: x19 +STACK CFI 6dbf8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6dbfc 74 .cfa: sp 0 + .ra: x30 +STACK CFI 6dc00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6dc04 .cfa: x29 48 + +STACK CFI 6dc08 x19: .cfa -32 + ^ +STACK CFI 6dc68 x19: x19 +STACK CFI 6dc6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6dc70 70 .cfa: sp 0 + .ra: x30 +STACK CFI 6dc74 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6dc78 .cfa: x29 48 + +STACK CFI 6dc7c x19: .cfa -32 + ^ +STACK CFI 6dcd8 x19: x19 +STACK CFI 6dcdc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6dce0 1e0 .cfa: sp 0 + .ra: x30 +STACK CFI 6dce4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6dce8 .cfa: x29 64 + +STACK CFI 6dcf0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 6deb4 x21: x21 +STACK CFI 6deb8 x19: x19 x20: x20 +STACK CFI 6debc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c08 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 14 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI bf8 x19: x19 x20: x20 +STACK CFI bfc x21: x21 x22: x22 +STACK CFI c00 x23: x23 +STACK CFI c04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6dec0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 ac .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 14 x21: .cfa -32 + ^ +STACK CFI a0 x19: x19 x20: x20 +STACK CFI a4 x21: x21 +STACK CFI a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6dec8 4c .cfa: sp 0 + .ra: x30 +STACK CFI 6decc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6ded8 .cfa: x29 64 + +STACK CFI 6dedc x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 6df0c x19: x19 x20: x20 +STACK CFI 6df10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6df14 4c .cfa: sp 0 + .ra: x30 +STACK CFI 6df18 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6df24 .cfa: x29 64 + +STACK CFI 6df28 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 6df58 x19: x19 x20: x20 +STACK CFI 6df5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6df60 4c .cfa: sp 0 + .ra: x30 +STACK CFI 6df64 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6df70 .cfa: x29 64 + +STACK CFI 6df74 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 6dfa4 x19: x19 x20: x20 +STACK CFI 6dfa8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 130 x19: x19 x20: x20 +STACK CFI 134 x21: x21 x22: x22 +STACK CFI 138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 5457c 48 .cfa: sp 0 + .ra: x30 +STACK CFI 54580 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 5458c .cfa: x29 16 + +STACK CFI 545c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6dfac 7c .cfa: sp 0 + .ra: x30 +STACK CFI 6dfb0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6dfb4 .cfa: x29 48 + +STACK CFI 6dfb8 x19: .cfa -32 + ^ +STACK CFI 6e020 x19: x19 +STACK CFI 6e024 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI 14 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 20 x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 120 x19: x19 x20: x20 +STACK CFI 124 x21: x21 x22: x22 +STACK CFI 128 x23: x23 x24: x24 +STACK CFI 12c x25: x25 x26: x26 +STACK CFI 130 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e028 20c .cfa: sp 0 + .ra: x30 +STACK CFI 6e02c .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 6e030 .cfa: x29 304 + +STACK CFI 6e040 x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ x25: .cfa -240 + ^ +STACK CFI 6e220 x25: x25 +STACK CFI 6e224 x19: x19 x20: x20 +STACK CFI 6e228 x21: x21 x22: x22 +STACK CFI 6e22c x23: x23 x24: x24 +STACK CFI 6e230 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1c4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 18 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 1b4 x23: x23 +STACK CFI 1b8 x19: x19 x20: x20 +STACK CFI 1bc x21: x21 x22: x22 +STACK CFI 1c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e234 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 6e238 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6e23c .cfa: x29 48 + +STACK CFI 6e244 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 6e2e8 x19: x19 x20: x20 +STACK CFI 6e2ec x21: x21 x22: x22 +STACK CFI 6e2f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e2f4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e2f8 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e310 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e328 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e330 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e348 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e350 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e368 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e370 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e384 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e38c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e394 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e3ac 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e3bc 38 .cfa: sp 0 + .ra: x30 +STACK CFI 6e3c0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6e3c4 .cfa: x29 32 + +STACK CFI 6e3c8 x19: .cfa -16 + ^ +STACK CFI 6e3ec x19: x19 +STACK CFI 6e3f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e3f4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6e3f8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6e3fc .cfa: x29 32 + +STACK CFI 6e400 x19: .cfa -16 + ^ +STACK CFI 6e410 x19: x19 +STACK CFI 6e414 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e418 50 .cfa: sp 0 + .ra: x30 +STACK CFI 6e41c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6e420 .cfa: x29 32 + +STACK CFI 6e424 x19: .cfa -16 + ^ +STACK CFI 6e460 x19: x19 +STACK CFI 6e464 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e468 30 .cfa: sp 0 + .ra: x30 +STACK CFI 6e46c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6e474 .cfa: x29 16 + +STACK CFI 6e494 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 2a0 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 38 x19: x19 +STACK CFI 3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e498 d4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e56c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e570 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6e574 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6e578 .cfa: x29 32 + +STACK CFI 6e57c x19: .cfa -16 + ^ +STACK CFI 6e58c x19: x19 +STACK CFI 6e590 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e594 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6e598 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6e59c .cfa: x29 32 + +STACK CFI 6e5a0 x19: .cfa -16 + ^ +STACK CFI 6e5b0 x19: x19 +STACK CFI 6e5b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e5b8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e5c8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6e5cc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6e5d0 .cfa: x29 32 + +STACK CFI 6e5d4 x19: .cfa -16 + ^ +STACK CFI 6e5e4 x19: x19 +STACK CFI 6e5e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 14 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 98 x23: x23 +STACK CFI 9c x19: x19 x20: x20 +STACK CFI a0 x21: x21 x22: x22 +STACK CFI a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e5ec 34 .cfa: sp 0 + .ra: x30 +STACK CFI 6e5f0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6e5f4 .cfa: x29 32 + +STACK CFI 6e5f8 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6e618 x19: x19 x20: x20 +STACK CFI 6e61c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e620 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e628 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 238e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 238e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 238e8 .cfa: x29 32 + +STACK CFI 238ec x19: .cfa -16 + ^ +STACK CFI 238fc x19: x19 +STACK CFI 23900 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e62c 38 .cfa: sp 0 + .ra: x30 +STACK CFI 6e630 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6e638 .cfa: x29 16 + +STACK CFI 6e660 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e664 88 .cfa: sp 0 + .ra: x30 +STACK CFI 6e668 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6e670 .cfa: x29 32 + +STACK CFI 6e674 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6e6e4 x19: x19 x20: x20 +STACK CFI 6e6e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e6ec b8 .cfa: sp 0 + .ra: x30 +STACK CFI 6e6f0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 6e6f4 .cfa: x29 80 + +STACK CFI 6e700 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 6e794 x19: x19 x20: x20 +STACK CFI 6e798 x21: x21 x22: x22 +STACK CFI 6e79c x23: x23 x24: x24 +STACK CFI 6e7a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e7a4 80 .cfa: sp 0 + .ra: x30 +STACK CFI 6e7a8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6e7ac .cfa: x29 32 + +STACK CFI 6e7b0 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6e81c x19: x19 x20: x20 +STACK CFI 6e820 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 14 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI a0 x23: x23 +STACK CFI a4 x19: x19 x20: x20 +STACK CFI a8 x21: x21 x22: x22 +STACK CFI ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 14 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI a4 x23: x23 +STACK CFI a8 x19: x19 x20: x20 +STACK CFI ac x21: x21 x22: x22 +STACK CFI b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e824 98 .cfa: sp 0 + .ra: x30 +STACK CFI 6e828 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6e82c .cfa: x29 48 + +STACK CFI 6e834 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 6e870 x21: x21 x22: x22 +STACK CFI 6e874 x19: x19 x20: x20 +STACK CFI 6e878 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6e87c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 6e8a0 x19: x19 x20: x20 +STACK CFI 6e8a4 x21: x21 x22: x22 +STACK CFI 6e8a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6e8ac .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 6e8b0 x19: x19 x20: x20 +STACK CFI 6e8b4 x21: x21 x22: x22 +STACK CFI 6e8b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2eb40 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e8bc 54 .cfa: sp 0 + .ra: x30 +STACK CFI 6e8c0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6e8c8 .cfa: x29 48 + +STACK CFI 6e8cc x19: .cfa -32 + ^ +STACK CFI 6e908 x19: x19 +STACK CFI 6e90c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e910 4c .cfa: sp 0 + .ra: x30 +STACK CFI 6e914 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6e91c .cfa: x29 48 + +STACK CFI 6e920 x19: .cfa -32 + ^ +STACK CFI 6e954 x19: x19 +STACK CFI 6e958 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e95c 54 .cfa: sp 0 + .ra: x30 +STACK CFI 6e960 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6e968 .cfa: x29 48 + +STACK CFI 6e96c x19: .cfa -32 + ^ +STACK CFI 6e9a8 x19: x19 +STACK CFI 6e9ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 43124 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6e9b0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6e9b4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6e9b8 .cfa: x29 16 + +STACK CFI 6e9d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6e9d4 b8 .cfa: sp 0 + .ra: x30 +STACK CFI 6e9d8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6e9dc .cfa: x29 32 + +STACK CFI 6e9e0 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6ea84 x19: x19 x20: x20 +STACK CFI 6ea88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ea8c 34 .cfa: sp 0 + .ra: x30 +STACK CFI 6ea90 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6ea94 .cfa: x29 32 + +STACK CFI 6ea98 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6eab8 x19: x19 x20: x20 +STACK CFI 6eabc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6eac0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6eac8 34 .cfa: sp 0 + .ra: x30 +STACK CFI 6eacc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6ead0 .cfa: x29 48 + +STACK CFI 6ead4 x19: .cfa -32 + ^ +STACK CFI 6eaf4 x19: x19 +STACK CFI 6eaf8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6eafc 3c .cfa: sp 0 + .ra: x30 +STACK CFI 6eb00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6eb04 .cfa: x29 48 + +STACK CFI 6eb08 x19: .cfa -32 + ^ +STACK CFI 6eb30 x19: x19 +STACK CFI 6eb34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 30 x19: x19 +STACK CFI 34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6eb38 50 .cfa: sp 0 + .ra: x30 +STACK CFI 6eb3c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6eb40 .cfa: x29 48 + +STACK CFI 6eb44 x19: .cfa -32 + ^ +STACK CFI 6eb80 x19: x19 +STACK CFI 6eb84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6eb88 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6ebb0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 6ebb4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6ebb8 .cfa: x29 48 + +STACK CFI 6ebbc x19: .cfa -32 + ^ +STACK CFI 6ebfc x19: x19 +STACK CFI 6ec00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ec04 4c .cfa: sp 0 + .ra: x30 +STACK CFI 6ec08 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6ec0c .cfa: x29 32 + +STACK CFI 6ec10 x19: .cfa -16 + ^ +STACK CFI 6ec48 x19: x19 +STACK CFI 6ec4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ec50 84 .cfa: sp 0 + .ra: x30 +STACK CFI 6ec54 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6ec58 .cfa: x29 48 + +STACK CFI 6ec5c x19: .cfa -32 + ^ +STACK CFI 6eccc x19: x19 +STACK CFI 6ecd0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ecd4 60 .cfa: sp 0 + .ra: x30 +STACK CFI 6ecd8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6ecdc .cfa: x29 32 + +STACK CFI 6ece0 x19: .cfa -16 + ^ +STACK CFI 6ed2c x19: x19 +STACK CFI 6ed30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ed34 58 .cfa: sp 0 + .ra: x30 +STACK CFI 6ed38 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6ed3c .cfa: x29 32 + +STACK CFI 6ed40 x19: .cfa -16 + ^ +STACK CFI 6ed84 x19: x19 +STACK CFI 6ed88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ed8c 40 .cfa: sp 0 + .ra: x30 +STACK CFI 6ed90 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6ed94 .cfa: x29 32 + +STACK CFI 6ed98 x19: .cfa -16 + ^ +STACK CFI 6edc4 x19: x19 +STACK CFI 6edc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6edcc 48 .cfa: sp 0 + .ra: x30 +STACK CFI 6edd0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6edd4 .cfa: x29 32 + +STACK CFI 6edd8 x19: .cfa -16 + ^ +STACK CFI 6ee0c x19: x19 +STACK CFI 6ee10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 30 x19: x19 +STACK CFI 34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 44 x19: x19 +STACK CFI 48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ee14 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6ee18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6ee1c .cfa: x29 16 + +STACK CFI 6ee34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ee38 70 .cfa: sp 0 + .ra: x30 +STACK CFI 6ee3c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6ee40 .cfa: x29 48 + +STACK CFI 6ee48 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 6ee88 x21: x21 +STACK CFI 6ee8c x19: x19 x20: x20 +STACK CFI 6ee90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6ee98 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 6ee9c x19: x19 x20: x20 +STACK CFI 6eea0 x21: x21 +STACK CFI 6eea4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6eea8 70 .cfa: sp 0 + .ra: x30 +STACK CFI 6eeac .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6eeb0 .cfa: x29 48 + +STACK CFI 6eeb8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 6eef8 x21: x21 +STACK CFI 6eefc x19: x19 x20: x20 +STACK CFI 6ef00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6ef08 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 6ef0c x19: x19 x20: x20 +STACK CFI 6ef10 x21: x21 +STACK CFI 6ef14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6ef18 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6ef34 70 .cfa: sp 0 + .ra: x30 +STACK CFI 6ef38 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6ef3c .cfa: x29 48 + +STACK CFI 6ef44 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 6ef84 x21: x21 +STACK CFI 6ef88 x19: x19 x20: x20 +STACK CFI 6ef8c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6ef94 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 6ef98 x19: x19 x20: x20 +STACK CFI 6ef9c x21: x21 +STACK CFI 6efa0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 70 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 50 x21: x21 +STACK CFI 54 x19: x19 x20: x20 +STACK CFI 58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 60 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 64 x19: x19 x20: x20 +STACK CFI 68 x21: x21 +STACK CFI 6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 78 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 7c x19: x19 +STACK CFI 80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 2527c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25288 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25298 24 .cfa: sp 0 + .ra: x30 +STACK CFI 2529c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 252a0 .cfa: x29 32 + +STACK CFI 252a4 x19: .cfa -16 + ^ +STACK CFI 252b4 x19: x19 +STACK CFI 252b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 252bc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 252cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6efa4 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6efc0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 6efc4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6efc8 .cfa: x29 32 + +STACK CFI 6efcc x19: .cfa -16 + ^ +STACK CFI 6efe4 x19: x19 +STACK CFI 6efe8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6efec .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 6eff0 x19: x19 +STACK CFI 6eff4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6eff8 48 .cfa: sp 0 + .ra: x30 +STACK CFI 6effc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f004 .cfa: x29 32 + +STACK CFI 6f008 x19: .cfa -16 + ^ +STACK CFI 6f038 x19: x19 +STACK CFI 6f03c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f040 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6f044 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f048 .cfa: x29 32 + +STACK CFI 6f04c x19: .cfa -16 + ^ +STACK CFI 6f05c x19: x19 +STACK CFI 6f060 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f064 60 .cfa: sp 0 + .ra: x30 +STACK CFI 6f068 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f06c .cfa: x29 32 + +STACK CFI 6f070 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6f0b0 x19: x19 x20: x20 +STACK CFI 6f0b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6f0b8 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 6f0bc x19: x19 x20: x20 +STACK CFI 6f0c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f0c4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6f0c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f0cc .cfa: x29 32 + +STACK CFI 6f0d0 x19: .cfa -16 + ^ +STACK CFI 6f0e0 x19: x19 +STACK CFI 6f0e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 3c x19: x19 +STACK CFI 40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 9c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 8c x21: x21 +STACK CFI 94 x19: x19 x20: x20 +STACK CFI 98 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 8c x19: x19 x20: x20 +STACK CFI 90 x21: x21 +STACK CFI 94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f0e8 a0 .cfa: sp 0 + .ra: x30 +STACK CFI 6f0ec .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6f0f0 .cfa: x29 64 + +STACK CFI 6f0f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 6f180 x19: x19 x20: x20 +STACK CFI 6f184 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f188 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6f1a4 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6f1c0 50 .cfa: sp 0 + .ra: x30 +STACK CFI 6f1c4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f1cc .cfa: x29 32 + +STACK CFI 6f1d0 x19: .cfa -16 + ^ +STACK CFI 6f1fc x19: x19 +STACK CFI 6f200 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6f204 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 6f208 x19: x19 +STACK CFI 6f20c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f210 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6f218 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6f21c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f220 .cfa: x29 32 + +STACK CFI 6f224 x19: .cfa -16 + ^ +STACK CFI 6f234 x19: x19 +STACK CFI 6f238 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f23c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6f244 38 .cfa: sp 0 + .ra: x30 +STACK CFI 6f248 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f24c .cfa: x29 32 + +STACK CFI 6f250 x19: .cfa -16 + ^ +STACK CFI 6f268 x19: x19 +STACK CFI 6f26c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6f270 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 6f274 x19: x19 +STACK CFI 6f278 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 30 x19: x19 x20: x20 +STACK CFI 34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f27c 84 .cfa: sp 0 + .ra: x30 +STACK CFI 6f280 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f284 .cfa: x29 32 + +STACK CFI 6f288 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 6f2ec x19: x19 x20: x20 +STACK CFI 6f2f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 6f2f4 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 6f2f8 x19: x19 x20: x20 +STACK CFI 6f2fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f300 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6f308 24 .cfa: sp 0 + .ra: x30 +STACK CFI 6f30c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f310 .cfa: x29 32 + +STACK CFI 6f314 x19: .cfa -16 + ^ +STACK CFI 6f324 x19: x19 +STACK CFI 6f328 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f32c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6f334 90 .cfa: sp 0 + .ra: x30 +STACK CFI 6f338 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6f33c .cfa: x29 64 + +STACK CFI 6f340 x19: .cfa -48 + ^ +STACK CFI 6f3bc x19: x19 +STACK CFI 6f3c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 fc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI c .cfa: x29 96 + +STACK CFI 18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI ec x21: x21 x22: x22 +STACK CFI f0 x19: x19 x20: x20 +STACK CFI f4 x23: x23 x24: x24 +STACK CFI f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f3c4 60 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6f424 44 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6f468 170 .cfa: sp 0 + .ra: x30 +STACK CFI 6f46c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 6f470 .cfa: x29 112 + +STACK CFI 6f484 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ x28: .cfa -24 + ^ +STACK CFI 6f5c0 x19: x19 x20: x20 +STACK CFI 6f5c4 x21: x21 x22: x22 +STACK CFI 6f5c8 x23: x23 x24: x24 +STACK CFI 6f5cc x25: x25 x26: x26 +STACK CFI 6f5d0 x27: x27 x28: x28 +STACK CFI 6f5d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 282a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 4c x19: x19 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24e18 34 .cfa: sp 0 + .ra: x30 +STACK CFI 24e1c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 24e24 .cfa: x29 32 + +STACK CFI 24e28 x19: .cfa -16 + ^ +STACK CFI 24e44 x19: x19 +STACK CFI 24e48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 5c x19: x19 x20: x20 +STACK CFI 60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 70 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 68 x19: x19 x20: x20 +STACK CFI 6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 7c x19: x19 x20: x20 +STACK CFI 80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 1c x21: .cfa -32 + ^ +STACK CFI 58 x19: x19 x20: x20 +STACK CFI 5c x21: x21 +STACK CFI 60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 34 x19: x19 +STACK CFI 38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 8 .cfa: x29 144 + +STACK CFI 14 x19: .cfa -128 + ^ x20: .cfa -120 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6f5d8 28 .cfa: sp 0 + .ra: x30 +STACK CFI 6f5dc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f5e8 .cfa: x29 32 + +STACK CFI 6f5f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f600 28 .cfa: sp 0 + .ra: x30 +STACK CFI 6f604 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f610 .cfa: x29 32 + +STACK CFI 6f620 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f628 28 .cfa: sp 0 + .ra: x30 +STACK CFI 6f62c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f638 .cfa: x29 32 + +STACK CFI 6f648 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f650 28 .cfa: sp 0 + .ra: x30 +STACK CFI 6f654 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f660 .cfa: x29 32 + +STACK CFI 6f670 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f678 28 .cfa: sp 0 + .ra: x30 +STACK CFI 6f67c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f688 .cfa: x29 32 + +STACK CFI 6f698 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f6a0 28 .cfa: sp 0 + .ra: x30 +STACK CFI 6f6a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 6f6b0 .cfa: x29 32 + +STACK CFI 6f6c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f6c8 84 .cfa: sp 0 + .ra: x30 +STACK CFI 6f6cc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6f6d0 .cfa: x29 48 + +STACK CFI 6f6d4 x19: .cfa -32 + ^ +STACK CFI 6f744 x19: x19 +STACK CFI 6f748 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 130 x19: x19 x20: x20 +STACK CFI 134 x21: x21 x22: x22 +STACK CFI 138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f74c 74 .cfa: sp 0 + .ra: x30 +STACK CFI 6f750 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6f754 .cfa: x29 48 + +STACK CFI 6f758 x19: .cfa -32 + ^ +STACK CFI 6f7b8 x19: x19 +STACK CFI 6f7bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f7c0 20 .cfa: sp 0 + .ra: x30 +STACK CFI 6f7c4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 6f7c8 .cfa: x29 16 + +STACK CFI 6f7dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f7e0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI d8 x19: x19 +STACK CFI dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI d0 x19: x19 x20: x20 +STACK CFI d4 x21: x21 x22: x22 +STACK CFI d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI c0 x19: x19 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f7e8 68 .cfa: sp 0 + .ra: x30 +STACK CFI 6f7ec .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6f7f0 .cfa: x29 48 + +STACK CFI 6f7f4 x19: .cfa -32 + ^ +STACK CFI 6f848 x19: x19 +STACK CFI 6f84c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI c0 x19: x19 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f850 6c .cfa: sp 0 + .ra: x30 +STACK CFI 6f854 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6f858 .cfa: x29 48 + +STACK CFI 6f85c x19: .cfa -32 + ^ +STACK CFI 6f8b4 x19: x19 +STACK CFI 6f8b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f8bc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6f8c4 6c .cfa: sp 0 + .ra: x30 +STACK CFI 6f8c8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6f8cc .cfa: x29 48 + +STACK CFI 6f8d0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 6f928 x19: x19 x20: x20 +STACK CFI 6f92c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f930 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 19c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 194 x19: x19 x20: x20 +STACK CFI 198 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc x21: x21 x22: x22 +STACK CFI d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f938 68 .cfa: sp 0 + .ra: x30 +STACK CFI 6f93c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6f940 .cfa: x29 48 + +STACK CFI 6f944 x19: .cfa -32 + ^ +STACK CFI 6f998 x19: x19 +STACK CFI 6f99c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6f9a0 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 6f9a4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6f9a8 .cfa: x29 64 + +STACK CFI 6f9b0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 6fa54 x21: x21 +STACK CFI 6fa58 x19: x19 x20: x20 +STACK CFI 6fa5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6fa60 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 6fa64 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 6fa68 .cfa: x29 64 + +STACK CFI 6fa70 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 6fb14 x21: x21 +STACK CFI 6fb18 x19: x19 x20: x20 +STACK CFI 6fb1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 110 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 104 x19: x19 x20: x20 +STACK CFI 108 x21: x21 x22: x22 +STACK CFI 10c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 110 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 104 x19: x19 x20: x20 +STACK CFI 108 x21: x21 x22: x22 +STACK CFI 10c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 3e8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 112 + +STACK CFI 8 .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI c .cfa: x29 96 + +STACK CFI 10 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 3d8 .cfa: sp 112 + +STACK CFI 3dc x19: x19 x20: x20 +STACK CFI 3e0 .ra: .ra x29: x29 +STACK CFI 3e4 .cfa: sp 0 + +STACK CFI INIT 0 24c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 8 .cfa: x29 160 + +STACK CFI 1c x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ +STACK CFI 234 x19: x19 x20: x20 +STACK CFI 238 x21: x21 x22: x22 +STACK CFI 23c x23: x23 x24: x24 +STACK CFI 240 x25: x25 x26: x26 +STACK CFI 244 x27: x27 +STACK CFI 248 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 12c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 144 + +STACK CFI 8 .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI c .cfa: x29 80 + +STACK CFI 14 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 118 .cfa: sp 144 + +STACK CFI 11c x19: x19 x20: x20 +STACK CFI 120 x21: x21 +STACK CFI 124 .ra: .ra x29: x29 +STACK CFI 128 .cfa: sp 0 + +STACK CFI INIT 6fb20 8c .cfa: sp 0 + .ra: x30 +STACK CFI 6fb24 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 6fb2c .cfa: x29 48 + +STACK CFI 6fb30 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 6fba4 x19: x19 x20: x20 +STACK CFI 6fba8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6fbac 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 6fbb4 104 .cfa: sp 0 + .ra: x30 +STACK CFI 6fbb8 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 6fbbc .cfa: x29 80 + +STACK CFI 6fbc8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 6fca8 x19: x19 x20: x20 +STACK CFI 6fcac x21: x21 x22: x22 +STACK CFI 6fcb0 x23: x23 x24: x24 +STACK CFI 6fcb4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 104 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 14 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI f4 x19: x19 x20: x20 +STACK CFI f8 x21: x21 x22: x22 +STACK CFI fc x23: x23 x24: x24 +STACK CFI 100 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6fcb8 238 .cfa: sp 0 + .ra: x30 +STACK CFI 6fcbc .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 6fcc0 .cfa: x29 176 + +STACK CFI 6fccc x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ +STACK CFI 6fee0 x23: x23 +STACK CFI 6fee4 x19: x19 x20: x20 +STACK CFI 6fee8 x21: x21 x22: x22 +STACK CFI 6feec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6fef0 108 .cfa: sp 0 + .ra: x30 +STACK CFI 6fef4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 6fef8 .cfa: x29 128 + +STACK CFI 6ff00 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ +STACK CFI 6ffec x19: x19 x20: x20 +STACK CFI 6fff0 x21: x21 +STACK CFI 6fff4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6fff8 20 .cfa: sp 0 + .ra: x30 +STACK CFI 6fffc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 70000 .cfa: x29 16 + +STACK CFI 70014 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 70018 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 70020 fc .cfa: sp 0 + .ra: x30 +STACK CFI 70024 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 70028 .cfa: x29 64 + +STACK CFI 70030 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 70110 x19: x19 x20: x20 +STACK CFI 70114 x21: x21 x22: x22 +STACK CFI 70118 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7011c fc .cfa: sp 0 + .ra: x30 +STACK CFI 70120 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 70124 .cfa: x29 64 + +STACK CFI 7012c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 7020c x19: x19 x20: x20 +STACK CFI 70210 x21: x21 x22: x22 +STACK CFI 70214 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 70218 20 .cfa: sp 0 + .ra: x30 +STACK CFI 7021c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 70220 .cfa: x29 16 + +STACK CFI 70234 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 70238 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 70240 fc .cfa: sp 0 + .ra: x30 +STACK CFI 70244 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 70248 .cfa: x29 64 + +STACK CFI 70250 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 70330 x19: x19 x20: x20 +STACK CFI 70334 x21: x21 x22: x22 +STACK CFI 70338 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 168 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI 18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 154 x19: x19 x20: x20 +STACK CFI 158 x21: x21 x22: x22 +STACK CFI 15c x23: x23 x24: x24 +STACK CFI 160 x25: x25 x26: x26 +STACK CFI 164 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7033c 100 .cfa: sp 0 + .ra: x30 +STACK CFI 70340 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 70344 .cfa: x29 128 + +STACK CFI 7034c x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ +STACK CFI 70430 x19: x19 x20: x20 +STACK CFI 70434 x21: x21 +STACK CFI 70438 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 fc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI f0 x19: x19 x20: x20 +STACK CFI f4 x21: x21 x22: x22 +STACK CFI f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 100 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI 10 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ +STACK CFI f4 x19: x19 x20: x20 +STACK CFI f8 x21: x21 +STACK CFI fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 fc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI f0 x19: x19 x20: x20 +STACK CFI f4 x21: x21 x22: x22 +STACK CFI f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 10 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI bc x21: x21 +STACK CFI c4 x19: x19 x20: x20 +STACK CFI c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7043c 1e4 .cfa: sp 0 + .ra: x30 +STACK CFI 70440 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 70444 .cfa: x29 80 + +STACK CFI 70450 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 70610 x19: x19 x20: x20 +STACK CFI 70614 x21: x21 x22: x22 +STACK CFI 70618 x23: x23 +STACK CFI 7061c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 70620 20 .cfa: sp 0 + .ra: x30 +STACK CFI 70624 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 70628 .cfa: x29 16 + +STACK CFI 7063c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 70640 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 25b54 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25b58 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 25b5c .cfa: x29 16 + +STACK CFI 25bac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 74 x19: x19 x20: x20 +STACK CFI 78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 70648 378 .cfa: sp 0 + .ra: x30 +STACK CFI 7064c .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 70650 .cfa: x29 224 + +STACK CFI 70654 x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 70668 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ +STACK CFI 70674 x25: .cfa -160 + ^ x26: .cfa -152 + ^ x27: .cfa -144 + ^ x28: .cfa -136 + ^ +STACK CFI 709a8 x19: x19 x20: x20 +STACK CFI 709ac x21: x21 x22: x22 +STACK CFI 709b0 x23: x23 x24: x24 +STACK CFI 709b4 x25: x25 x26: x26 +STACK CFI 709b8 x27: x27 x28: x28 +STACK CFI 709bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1d4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI c x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 18 x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 1c4 x23: x23 +STACK CFI 1c8 x19: x19 x20: x20 +STACK CFI 1cc x21: x21 x22: x22 +STACK CFI 1d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25fd8 34 .cfa: sp 0 + .ra: x30 +STACK CFI 25fdc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 25fe0 .cfa: x29 48 + +STACK CFI 25fe4 x19: .cfa -32 + ^ +STACK CFI 26004 x19: x19 +STACK CFI 26008 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 709c0 214 .cfa: sp 0 + .ra: x30 +STACK CFI 709c4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 709c8 .cfa: x29 176 + +STACK CFI 709d4 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ x24: .cfa -120 + ^ +STACK CFI 70bc4 x19: x19 x20: x20 +STACK CFI 70bc8 x21: x21 x22: x22 +STACK CFI 70bcc x23: x23 x24: x24 +STACK CFI 70bd0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 70bd4 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 70bdc 1e4 .cfa: sp 0 + .ra: x30 +STACK CFI 70be0 .cfa: sp 224 + +STACK CFI 70be4 .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 70be8 .cfa: x29 160 + +STACK CFI 70bf4 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ +STACK CFI 70da4 .cfa: sp 224 + +STACK CFI 70dac x19: x19 x20: x20 +STACK CFI 70db0 x21: x21 x22: x22 +STACK CFI 70db4 x23: x23 +STACK CFI 70db8 .ra: .ra x29: x29 +STACK CFI 70dbc .cfa: sp 0 + +STACK CFI INIT 70dc0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 70dc8 168 .cfa: sp 0 + .ra: x30 +STACK CFI 70dcc .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 70dd0 .cfa: x29 144 + +STACK CFI 70ddc x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ +STACK CFI 70f20 x23: x23 +STACK CFI 70f24 x19: x19 x20: x20 +STACK CFI 70f28 x21: x21 x22: x22 +STACK CFI 70f2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 70f30 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 1cc .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 8 .cfa: x29 128 + +STACK CFI c x19: .cfa -112 + ^ x20: .cfa -104 + ^ +STACK CFI 18 x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ +STACK CFI 1bc x23: x23 +STACK CFI 1c0 x19: x19 x20: x20 +STACK CFI 1c4 x21: x21 x22: x22 +STACK CFI 1c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 1e4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 8 .cfa: x29 176 + +STACK CFI 14 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ x24: .cfa -120 + ^ +STACK CFI 1d4 x19: x19 x20: x20 +STACK CFI 1d8 x21: x21 x22: x22 +STACK CFI 1dc x23: x23 x24: x24 +STACK CFI 1e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 e4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI c .cfa: x29 112 + +STACK CFI 18 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI d4 x19: x19 x20: x20 +STACK CFI d8 x21: x21 x22: x22 +STACK CFI dc x23: x23 x24: x24 +STACK CFI e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 70f38 248 .cfa: sp 0 + .ra: x30 +STACK CFI 70f3c .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 70f40 .cfa: x29 192 + +STACK CFI 70f50 x19: .cfa -176 + ^ x20: .cfa -168 + ^ x21: .cfa -160 + ^ x22: .cfa -152 + ^ x23: .cfa -144 + ^ x24: .cfa -136 + ^ x25: .cfa -128 + ^ x26: .cfa -120 + ^ +STACK CFI 7116c x19: x19 x20: x20 +STACK CFI 71170 x21: x21 x22: x22 +STACK CFI 71174 x23: x23 x24: x24 +STACK CFI 71178 x25: x25 x26: x26 +STACK CFI 7117c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71180 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 71188 50 .cfa: sp 0 + .ra: x30 +STACK CFI 7118c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 71190 .cfa: x29 48 + +STACK CFI 71198 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 711cc x19: x19 x20: x20 +STACK CFI 711d0 x21: x21 +STACK CFI 711d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 711d8 5c .cfa: sp 0 + .ra: x30 +STACK CFI 711dc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 711e0 .cfa: x29 32 + +STACK CFI 711e4 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 71220 x19: x19 x20: x20 +STACK CFI 71224 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 71228 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 7122c x19: x19 x20: x20 +STACK CFI 71230 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71234 24 .cfa: sp 0 + .ra: x30 +STACK CFI 71238 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7123c .cfa: x29 32 + +STACK CFI 71240 x19: .cfa -16 + ^ +STACK CFI 71250 x19: x19 +STACK CFI 71254 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71258 50 .cfa: sp 0 + .ra: x30 +STACK CFI 7125c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 71260 .cfa: x29 48 + +STACK CFI 71268 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 7129c x19: x19 x20: x20 +STACK CFI 712a0 x21: x21 +STACK CFI 712a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 712a8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 712ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 712b0 .cfa: x29 32 + +STACK CFI 712b8 x19: .cfa -16 + ^ +STACK CFI 712dc x19: x19 +STACK CFI 712e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 712e4 6c .cfa: sp 0 + .ra: x30 +STACK CFI 712e8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 712ec .cfa: x29 32 + +STACK CFI 712f0 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 7133c x19: x19 x20: x20 +STACK CFI 71340 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 71344 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 71348 x19: x19 x20: x20 +STACK CFI 7134c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71350 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 71358 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7135c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 71360 .cfa: x29 32 + +STACK CFI 71364 x19: .cfa -16 + ^ +STACK CFI 71374 x19: x19 +STACK CFI 71378 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7137c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 71384 78 .cfa: sp 0 + .ra: x30 +STACK CFI 71388 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7138c .cfa: x29 32 + +STACK CFI 71390 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 713e8 x19: x19 x20: x20 +STACK CFI 713ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 713f0 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 713f4 x19: x19 x20: x20 +STACK CFI 713f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 713fc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 71400 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 71404 .cfa: x29 32 + +STACK CFI 71408 x19: .cfa -16 + ^ +STACK CFI 71418 x19: x19 +STACK CFI 7141c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 4c x19: x19 x20: x20 +STACK CFI 50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 54 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 58 x19: x19 x20: x20 +STACK CFI 5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 1c x19: x19 +STACK CFI 20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71420 58 .cfa: sp 0 + .ra: x30 +STACK CFI 71424 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 71428 .cfa: x29 48 + +STACK CFI 71430 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 7146c x19: x19 x20: x20 +STACK CFI 71470 x21: x21 +STACK CFI 71474 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71478 d4 .cfa: sp 0 + .ra: x30 +STACK CFI 7147c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 71480 .cfa: x29 48 + +STACK CFI 71484 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 71544 x19: x19 x20: x20 +STACK CFI 71548 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7154c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 71550 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 71554 .cfa: x29 32 + +STACK CFI 71558 x19: .cfa -16 + ^ +STACK CFI 71568 x19: x19 +STACK CFI 7156c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71570 78 .cfa: sp 0 + .ra: x30 +STACK CFI 71574 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 71578 .cfa: x29 32 + +STACK CFI 7157c x19: .cfa -16 + ^ +STACK CFI 715d8 x19: x19 +STACK CFI 715e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 715e8 134 .cfa: sp 0 + .ra: x30 +STACK CFI 715ec .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 715f0 .cfa: x29 128 + +STACK CFI 715f8 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 71710 x19: x19 x20: x20 +STACK CFI 71714 x21: x21 x22: x22 +STACK CFI 71718 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7171c 270 .cfa: sp 0 + .ra: x30 +STACK CFI 71720 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 71724 .cfa: x29 112 + +STACK CFI 71730 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ +STACK CFI 7197c x23: x23 +STACK CFI 71980 x19: x19 x20: x20 +STACK CFI 71984 x21: x21 x22: x22 +STACK CFI 71988 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7198c 280 .cfa: sp 0 + .ra: x30 +STACK CFI 71990 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 71994 .cfa: x29 96 + +STACK CFI 7199c x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 719a4 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 71bfc x19: x19 x20: x20 +STACK CFI 71c00 x21: x21 x22: x22 +STACK CFI 71c04 x23: x23 +STACK CFI 71c08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71c0c 18 .cfa: sp 0 + .ra: x30 +STACK CFI 71c10 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 71c14 .cfa: x29 32 + +STACK CFI 71c20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 29c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI c x23: .cfa -48 + ^ +STACK CFI 24 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 28c x19: x19 x20: x20 +STACK CFI 290 x21: x21 x22: x22 +STACK CFI 294 x23: x23 +STACK CFI 298 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI 14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71c24 280 .cfa: sp 0 + .ra: x30 +STACK CFI 71c28 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 71c2c .cfa: x29 96 + +STACK CFI 71c34 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 71c3c x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 71e94 x19: x19 x20: x20 +STACK CFI 71e98 x21: x21 x22: x22 +STACK CFI 71e9c x23: x23 +STACK CFI 71ea0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71ea4 18 .cfa: sp 0 + .ra: x30 +STACK CFI 71ea8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 71eac .cfa: x29 32 + +STACK CFI 71eb8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 280 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI 10 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 270 x19: x19 x20: x20 +STACK CFI 274 x21: x21 x22: x22 +STACK CFI 278 x23: x23 +STACK CFI 27c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI 14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 29c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI c x23: .cfa -48 + ^ +STACK CFI 24 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 28c x19: x19 x20: x20 +STACK CFI 290 x21: x21 x22: x22 +STACK CFI 294 x23: x23 +STACK CFI 298 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI 14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 71ebc 280 .cfa: sp 0 + .ra: x30 +STACK CFI 71ec0 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 71ec4 .cfa: x29 96 + +STACK CFI 71ecc x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 71ed4 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 7212c x19: x19 x20: x20 +STACK CFI 72130 x21: x21 x22: x22 +STACK CFI 72134 x23: x23 +STACK CFI 72138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7213c 18 .cfa: sp 0 + .ra: x30 +STACK CFI 72140 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 72144 .cfa: x29 32 + +STACK CFI 72150 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 72154 280 .cfa: sp 0 + .ra: x30 +STACK CFI 72158 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 7215c .cfa: x29 96 + +STACK CFI 72164 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 7216c x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 723c4 x19: x19 x20: x20 +STACK CFI 723c8 x21: x21 x22: x22 +STACK CFI 723cc x23: x23 +STACK CFI 723d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 723d4 18 .cfa: sp 0 + .ra: x30 +STACK CFI 723d8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 723dc .cfa: x29 32 + +STACK CFI 723e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 723ec 280 .cfa: sp 0 + .ra: x30 +STACK CFI 723f0 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 723f4 .cfa: x29 96 + +STACK CFI 723fc x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 72404 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 7265c x19: x19 x20: x20 +STACK CFI 72660 x21: x21 x22: x22 +STACK CFI 72664 x23: x23 +STACK CFI 72668 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7266c 18 .cfa: sp 0 + .ra: x30 +STACK CFI 72670 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 72674 .cfa: x29 32 + +STACK CFI 72680 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 280 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8 .cfa: x29 96 + +STACK CFI 10 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 18 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 270 x19: x19 x20: x20 +STACK CFI 274 x21: x21 x22: x22 +STACK CFI 278 x23: x23 +STACK CFI 27c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI 14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 72684 370 .cfa: sp 0 + .ra: x30 +STACK CFI 72688 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 7268c .cfa: x29 160 + +STACK CFI 726a0 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ x28: .cfa -72 + ^ +STACK CFI 729dc x19: x19 x20: x20 +STACK CFI 729e0 x21: x21 x22: x22 +STACK CFI 729e4 x23: x23 x24: x24 +STACK CFI 729e8 x25: x25 x26: x26 +STACK CFI 729ec x27: x27 x28: x28 +STACK CFI 729f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 729f4 8c .cfa: sp 0 + .ra: x30 +STACK CFI 729f8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 72a00 .cfa: x29 48 + +STACK CFI 72a04 x19: .cfa -32 + ^ +STACK CFI 72a78 x19: x19 +STACK CFI 72a7c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 72a80 134 .cfa: sp 0 + .ra: x30 +STACK CFI 72a84 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 72a88 .cfa: x29 48 + +STACK CFI 72a90 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 72b94 x19: x19 x20: x20 +STACK CFI 72b98 x21: x21 +STACK CFI 72b9c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 72ba0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 72ba8 x21: x21 +STACK CFI 72bac x19: x19 x20: x20 +STACK CFI 72bb0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 72bb4 1b0 .cfa: sp 0 + .ra: x30 +STACK CFI 72bb8 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 72bbc .cfa: x29 80 + +STACK CFI 72bc0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 72bcc x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ x26: .cfa -8 + ^ +STACK CFI 72bd8 x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 72d50 x19: x19 x20: x20 +STACK CFI 72d54 x21: x21 x22: x22 +STACK CFI 72d58 x23: x23 x24: x24 +STACK CFI 72d5c x25: x25 x26: x26 +STACK CFI 72d60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 72d64 158 .cfa: sp 0 + .ra: x30 +STACK CFI 72d68 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 72d6c .cfa: x29 112 + +STACK CFI 72d74 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 72eb0 x19: x19 x20: x20 +STACK CFI 72eb4 x21: x21 x22: x22 +STACK CFI 72eb8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 72ebc 14f4 .cfa: sp 0 + .ra: x30 +STACK CFI 72ec0 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 72ec4 .cfa: x29 128 + +STACK CFI 72ed0 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 743a0 x19: x19 x20: x20 +STACK CFI 743a4 x21: x21 x22: x22 +STACK CFI 743a8 x23: x23 x24: x24 +STACK CFI 743ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 743b0 170 .cfa: sp 0 + .ra: x30 +STACK CFI 743b4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 743b8 .cfa: x29 64 + +STACK CFI 743c0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 74514 x19: x19 x20: x20 +STACK CFI 74518 x21: x21 x22: x22 +STACK CFI 7451c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 74520 170 .cfa: sp 0 + .ra: x30 +STACK CFI 74524 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 74528 .cfa: x29 64 + +STACK CFI 74530 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 74684 x19: x19 x20: x20 +STACK CFI 74688 x21: x21 x22: x22 +STACK CFI 7468c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 164 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 158 x19: x19 x20: x20 +STACK CFI 15c x21: x21 +STACK CFI 160 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 74690 240 .cfa: sp 0 + .ra: x30 +STACK CFI 74694 .cfa: sp 240 + .ra: .cfa -232 + ^ x29: .cfa -240 + ^ +STACK CFI 74698 .cfa: x29 240 + +STACK CFI 746a8 x19: .cfa -224 + ^ x20: .cfa -216 + ^ x21: .cfa -208 + ^ x22: .cfa -200 + ^ x23: .cfa -192 + ^ x24: .cfa -184 + ^ x25: .cfa -176 + ^ +STACK CFI 748bc x25: x25 +STACK CFI 748c0 x19: x19 x20: x20 +STACK CFI 748c4 x21: x21 x22: x22 +STACK CFI 748c8 x23: x23 x24: x24 +STACK CFI 748cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 748d0 268 .cfa: sp 0 + .ra: x30 +STACK CFI 748d4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 748d8 .cfa: x29 176 + +STACK CFI 748e4 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ +STACK CFI 74b28 x23: x23 +STACK CFI 74b2c x19: x19 x20: x20 +STACK CFI 74b30 x21: x21 x22: x22 +STACK CFI 74b34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 74b38 18c .cfa: sp 0 + .ra: x30 +STACK CFI 74b3c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 74b40 .cfa: x29 64 + +STACK CFI 74b48 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 74cb8 x19: x19 x20: x20 +STACK CFI 74cbc x21: x21 x22: x22 +STACK CFI 74cc0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 74cc4 1f4 .cfa: sp 0 + .ra: x30 +STACK CFI 74cc8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 74ccc .cfa: x29 64 + +STACK CFI 74cd4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 74eac x21: x21 +STACK CFI 74eb0 x19: x19 x20: x20 +STACK CFI 74eb4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 138 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI c .cfa: x29 64 + +STACK CFI 14 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 12c x21: x21 +STACK CFI 130 x19: x19 x20: x20 +STACK CFI 134 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 19c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI c .cfa: x29 176 + +STACK CFI 18 x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ +STACK CFI 18c x23: x23 +STACK CFI 190 x19: x19 x20: x20 +STACK CFI 194 x21: x21 x22: x22 +STACK CFI 198 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 19c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI c .cfa: x29 64 + +STACK CFI 14 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 190 x21: x21 +STACK CFI 194 x19: x19 x20: x20 +STACK CFI 198 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 36c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 14 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 35c x23: x23 +STACK CFI 360 x19: x19 x20: x20 +STACK CFI 364 x21: x21 x22: x22 +STACK CFI 368 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 74eb8 2c8 .cfa: sp 0 + .ra: x30 +STACK CFI 74ebc .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 74ec0 .cfa: x29 112 + +STACK CFI 74ecc x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI 75170 x19: x19 x20: x20 +STACK CFI 75174 x21: x21 x22: x22 +STACK CFI 75178 x23: x23 x24: x24 +STACK CFI 7517c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI c0 x19: x19 x20: x20 +STACK CFI c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 258 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 24c x19: x19 x20: x20 +STACK CFI 250 x21: x21 +STACK CFI 254 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 75180 238 .cfa: sp 0 + .ra: x30 +STACK CFI 75184 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 75188 .cfa: x29 96 + +STACK CFI 75194 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 753a8 x19: x19 x20: x20 +STACK CFI 753ac x21: x21 x22: x22 +STACK CFI 753b0 x23: x23 +STACK CFI 753b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 753b8 21c .cfa: sp 0 + .ra: x30 +STACK CFI 753bc .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 753c0 .cfa: x29 224 + +STACK CFI 753cc x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 755c4 x19: x19 x20: x20 +STACK CFI 755c8 x21: x21 x22: x22 +STACK CFI 755cc x23: x23 x24: x24 +STACK CFI 755d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 755d4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 755d8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 755e0 240 .cfa: sp 0 + .ra: x30 +STACK CFI 755e4 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 755e8 .cfa: x29 224 + +STACK CFI 755f4 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 75810 x19: x19 x20: x20 +STACK CFI 75814 x21: x21 x22: x22 +STACK CFI 75818 x23: x23 x24: x24 +STACK CFI 7581c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 75820 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 75824 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7582c 240 .cfa: sp 0 + .ra: x30 +STACK CFI 75830 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 75834 .cfa: x29 224 + +STACK CFI 75840 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 75a5c x19: x19 x20: x20 +STACK CFI 75a60 x21: x21 x22: x22 +STACK CFI 75a64 x23: x23 x24: x24 +STACK CFI 75a68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 75a6c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 75a70 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 75a78 240 .cfa: sp 0 + .ra: x30 +STACK CFI 75a7c .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 75a80 .cfa: x29 224 + +STACK CFI 75a8c x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 75ca8 x19: x19 x20: x20 +STACK CFI 75cac x21: x21 x22: x22 +STACK CFI 75cb0 x23: x23 x24: x24 +STACK CFI 75cb4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 75cb8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 75cbc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 75cc4 cc .cfa: sp 0 + .ra: x30 +STACK CFI 75cc8 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 75ccc .cfa: x29 64 + +STACK CFI 75cd4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 75d84 x19: x19 x20: x20 +STACK CFI 75d88 x21: x21 x22: x22 +STACK CFI 75d8c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 75d90 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 75d98 440 .cfa: sp 0 + .ra: x30 +STACK CFI 75d9c .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 75da0 .cfa: x29 96 + +STACK CFI 75dac x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 761c8 x19: x19 x20: x20 +STACK CFI 761cc x21: x21 x22: x22 +STACK CFI 761d0 x23: x23 x24: x24 +STACK CFI 761d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 761d8 334 .cfa: sp 0 + .ra: x30 +STACK CFI 761dc .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 761e0 .cfa: x29 96 + +STACK CFI 761ec x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 764fc x19: x19 x20: x20 +STACK CFI 76500 x21: x21 x22: x22 +STACK CFI 76504 x23: x23 x24: x24 +STACK CFI 76508 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7650c 17c .cfa: sp 0 + .ra: x30 +STACK CFI 76510 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 76514 .cfa: x29 64 + +STACK CFI 7651c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 7667c x21: x21 +STACK CFI 76680 x19: x19 x20: x20 +STACK CFI 76684 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4a4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 8 .cfa: x29 144 + +STACK CFI c x19: .cfa -128 + ^ x20: .cfa -120 + ^ +STACK CFI 20 x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ +STACK CFI 494 x23: x23 +STACK CFI 498 x19: x19 x20: x20 +STACK CFI 49c x21: x21 x22: x22 +STACK CFI 4a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI c x19: .cfa -32 + ^ +STACK CFI 5c x19: x19 +STACK CFI 60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 d4 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI c8 x19: x19 x20: x20 +STACK CFI cc x21: x21 x22: x22 +STACK CFI d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 124 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 38 x19: x19 x20: x20 +STACK CFI 3c x21: x21 x22: x22 +STACK CFI 40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 44 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 76688 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 7668c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 76690 .cfa: x29 48 + +STACK CFI 76694 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 766a0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 76744 x19: x19 x20: x20 +STACK CFI 76748 x21: x21 x22: x22 +STACK CFI 7674c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 76750 e4 .cfa: sp 0 + .ra: x30 +STACK CFI 76754 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 76760 .cfa: x29 64 + +STACK CFI 76764 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 7682c x19: x19 x20: x20 +STACK CFI 76830 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 76834 1cc .cfa: sp 0 + .ra: x30 +STACK CFI 76838 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 7683c .cfa: x29 96 + +STACK CFI 7684c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 769ec x25: x25 +STACK CFI 769f0 x19: x19 x20: x20 +STACK CFI 769f4 x21: x21 x22: x22 +STACK CFI 769f8 x23: x23 x24: x24 +STACK CFI 769fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 76a00 84 .cfa: sp 0 + .ra: x30 +STACK CFI 76a04 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 76a0c .cfa: x29 48 + +STACK CFI 76a80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 76a84 28 .cfa: sp 0 + .ra: x30 +STACK CFI 76a88 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 76a90 .cfa: x29 32 + +STACK CFI 76aa8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 76aac 624 .cfa: sp 0 + .ra: x30 +STACK CFI 76ab0 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 76ab4 .cfa: x29 224 + +STACK CFI 76ab8 x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 76acc x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x25: .cfa -160 + ^ x26: .cfa -152 + ^ x27: .cfa -144 + ^ x28: .cfa -136 + ^ +STACK CFI 770b8 x19: x19 x20: x20 +STACK CFI 770bc x21: x21 x22: x22 +STACK CFI 770c0 x23: x23 x24: x24 +STACK CFI 770c4 x25: x25 x26: x26 +STACK CFI 770c8 x27: x27 x28: x28 +STACK CFI 770cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 770d0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 770d4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 770d8 .cfa: x29 48 + +STACK CFI 770dc x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 770e8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 7718c x19: x19 x20: x20 +STACK CFI 77190 x21: x21 x22: x22 +STACK CFI 77194 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 77198 254 .cfa: sp 0 + .ra: x30 +STACK CFI 7719c .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 771a0 .cfa: x29 224 + +STACK CFI 771ac x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 773dc x19: x19 x20: x20 +STACK CFI 773e0 x21: x21 x22: x22 +STACK CFI 773e4 x23: x23 x24: x24 +STACK CFI 773e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 773ec 7c8 .cfa: sp 0 + .ra: x30 +STACK CFI 773f0 .cfa: sp 432 + .ra: .cfa -424 + ^ x29: .cfa -432 + ^ +STACK CFI 773f4 .cfa: x29 432 + +STACK CFI 77408 x19: .cfa -416 + ^ x20: .cfa -408 + ^ x21: .cfa -400 + ^ x22: .cfa -392 + ^ x23: .cfa -384 + ^ x24: .cfa -376 + ^ x25: .cfa -368 + ^ x26: .cfa -360 + ^ x27: .cfa -352 + ^ x28: .cfa -344 + ^ +STACK CFI 77b9c x19: x19 x20: x20 +STACK CFI 77ba0 x21: x21 x22: x22 +STACK CFI 77ba4 x23: x23 x24: x24 +STACK CFI 77ba8 x25: x25 x26: x26 +STACK CFI 77bac x27: x27 x28: x28 +STACK CFI 77bb0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 77bb4 70c .cfa: sp 0 + .ra: x30 +STACK CFI 77bb8 .cfa: sp 240 + .ra: .cfa -232 + ^ x29: .cfa -240 + ^ +STACK CFI 77bbc .cfa: x29 240 + +STACK CFI 77bd0 x19: .cfa -224 + ^ x20: .cfa -216 + ^ x21: .cfa -208 + ^ x22: .cfa -200 + ^ x23: .cfa -192 + ^ x24: .cfa -184 + ^ x25: .cfa -176 + ^ x26: .cfa -168 + ^ x27: .cfa -160 + ^ x28: .cfa -152 + ^ +STACK CFI 782a8 x19: x19 x20: x20 +STACK CFI 782ac x21: x21 x22: x22 +STACK CFI 782b0 x23: x23 x24: x24 +STACK CFI 782b4 x25: x25 x26: x26 +STACK CFI 782b8 x27: x27 x28: x28 +STACK CFI 782bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 5e8 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 288 + .ra: .cfa -280 + ^ x29: .cfa -288 + ^ +STACK CFI 8 .cfa: x29 288 + +STACK CFI 20 v8: .cfa -192 + ^ v9: .cfa -184 + ^ x19: .cfa -272 + ^ x20: .cfa -264 + ^ x21: .cfa -256 + ^ x22: .cfa -248 + ^ x23: .cfa -240 + ^ x24: .cfa -232 + ^ x25: .cfa -224 + ^ x26: .cfa -216 + ^ x27: .cfa -208 + ^ x28: .cfa -200 + ^ +STACK CFI 5cc v8: v8 v9: v9 +STACK CFI 5d0 x19: x19 x20: x20 +STACK CFI 5d4 x21: x21 x22: x22 +STACK CFI 5d8 x23: x23 x24: x24 +STACK CFI 5dc x25: x25 x26: x26 +STACK CFI 5e0 x27: x27 x28: x28 +STACK CFI 5e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 782c0 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 782c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 782c8 .cfa: x29 48 + +STACK CFI 782cc x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 782d8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 7837c x19: x19 x20: x20 +STACK CFI 78380 x21: x21 x22: x22 +STACK CFI 78384 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 78388 e4 .cfa: sp 0 + .ra: x30 +STACK CFI 7838c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 78398 .cfa: x29 64 + +STACK CFI 7839c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 78464 x19: x19 x20: x20 +STACK CFI 78468 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7846c 1cc .cfa: sp 0 + .ra: x30 +STACK CFI 78470 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 78474 .cfa: x29 96 + +STACK CFI 78484 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 78624 x25: x25 +STACK CFI 78628 x19: x19 x20: x20 +STACK CFI 7862c x21: x21 x22: x22 +STACK CFI 78630 x23: x23 x24: x24 +STACK CFI 78634 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 78638 6e4 .cfa: sp 0 + .ra: x30 +STACK CFI 7863c .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 78640 .cfa: x29 304 + +STACK CFI 7865c v10: .cfa -192 + ^ v8: .cfa -208 + ^ v9: .cfa -200 + ^ x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ x25: .cfa -240 + ^ x26: .cfa -232 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ +STACK CFI 78cfc v8: v8 v9: v9 +STACK CFI 78d00 x19: x19 x20: x20 +STACK CFI 78d04 x21: x21 x22: x22 +STACK CFI 78d08 x23: x23 x24: x24 +STACK CFI 78d0c x25: x25 x26: x26 +STACK CFI 78d10 x27: x27 x28: x28 +STACK CFI 78d14 v10: v10 +STACK CFI 78d18 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 78d1c d4 .cfa: sp 0 + .ra: x30 +STACK CFI 78d20 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 78d24 .cfa: x29 48 + +STACK CFI 78d2c x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 78de4 x21: x21 +STACK CFI 78de8 x19: x19 x20: x20 +STACK CFI 78dec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 78df0 60 .cfa: sp 0 + .ra: x30 +STACK CFI 78df4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 78df8 .cfa: x29 32 + +STACK CFI 78dfc x19: .cfa -16 + ^ +STACK CFI 78e48 x19: x19 +STACK CFI 78e4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 78e50 1f8 .cfa: sp 0 + .ra: x30 +STACK CFI 78e54 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 78e58 .cfa: x29 96 + +STACK CFI 78e68 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 79034 x19: x19 x20: x20 +STACK CFI 79038 x21: x21 x22: x22 +STACK CFI 7903c x23: x23 x24: x24 +STACK CFI 79040 x25: x25 x26: x26 +STACK CFI 79044 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 79048 130 .cfa: sp 0 + .ra: x30 +STACK CFI 7904c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 79054 .cfa: x29 32 + +STACK CFI 79058 x19: .cfa -16 + ^ +STACK CFI 79154 x19: x19 +STACK CFI 79158 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7915c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 79178 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7917c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 79180 .cfa: x29 32 + +STACK CFI 79184 x19: .cfa -16 + ^ +STACK CFI 79194 x19: x19 +STACK CFI 79198 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7919c a8 .cfa: sp 0 + .ra: x30 +STACK CFI 791a0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 791a4 .cfa: x29 48 + +STACK CFI 791a8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 79230 x19: x19 x20: x20 +STACK CFI 79234 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 79238 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 7923c x19: x19 x20: x20 +STACK CFI 79240 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 79244 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 79250 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 79260 24 .cfa: sp 0 + .ra: x30 +STACK CFI 79264 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 79268 .cfa: x29 32 + +STACK CFI 7926c x19: .cfa -16 + ^ +STACK CFI 7927c x19: x19 +STACK CFI 79280 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 79284 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 79294 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 792a0 bc .cfa: sp 0 + .ra: x30 +STACK CFI 792a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 792a8 .cfa: x29 32 + +STACK CFI 792ac x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 79354 x19: x19 x20: x20 +STACK CFI 79358 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7935c 94 .cfa: sp 0 + .ra: x30 +STACK CFI 79360 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 79368 .cfa: x29 64 + +STACK CFI 79370 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 793e0 x19: x19 x20: x20 +STACK CFI 793e8 x21: x21 +STACK CFI 793ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 793f0 8c .cfa: sp 0 + .ra: x30 +STACK CFI 793f4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 793f8 .cfa: x29 64 + +STACK CFI 79400 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 79470 x19: x19 x20: x20 +STACK CFI 79474 x21: x21 +STACK CFI 79478 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7947c 1f4 .cfa: sp 0 + .ra: x30 +STACK CFI 79480 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 79484 .cfa: x29 96 + +STACK CFI 7948c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 79664 x19: x19 x20: x20 +STACK CFI 79668 x21: x21 x22: x22 +STACK CFI 7966c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 79670 fc .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7976c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 79770 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7977c .cfa: x29 64 + +STACK CFI 79784 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 79884 x19: x19 x20: x20 +STACK CFI 79888 x21: x21 x22: x22 +STACK CFI 7988c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 79890 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7989c 20 .cfa: sp 0 + .ra: x30 +STACK CFI 798a0 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 798a4 .cfa: x29 16 + +STACK CFI 798b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 798bc 1c .cfa: sp 0 + .ra: x30 +STACK CFI 798c0 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 798c4 .cfa: x29 16 + +STACK CFI 798d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8 .cfa: x29 32 + +STACK CFI c x19: .cfa -16 + ^ +STACK CFI 44 x19: x19 +STACK CFI 48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 248e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 798d8 54 .cfa: sp 0 + .ra: x30 +STACK CFI 798dc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 798e4 .cfa: x29 16 + +STACK CFI 79928 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ +STACK CFI 8c x19: x19 x20: x20 +STACK CFI 90 x21: x21 +STACK CFI 94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24cf8 1c .cfa: sp 0 + .ra: x30 +STACK CFI 24cfc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d00 .cfa: x29 16 + +STACK CFI 24d10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 24d14 3c .cfa: sp 0 + .ra: x30 +STACK CFI 24d18 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 24d1c .cfa: x29 16 + +STACK CFI 24d4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25644 5c .cfa: sp 0 + .ra: x30 +STACK CFI 25648 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 2564c .cfa: x29 32 + +STACK CFI 25650 x19: .cfa -16 + ^ +STACK CFI 25698 x19: x19 +STACK CFI 2569c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI c .cfa: x29 32 + +STACK CFI 10 x19: .cfa -16 + ^ +STACK CFI 70 x19: x19 +STACK CFI 74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 25718 50 .cfa: sp 0 + .ra: x30 +STACK CFI 2571c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 25720 .cfa: x29 32 + +STACK CFI 25724 x19: .cfa -16 + ^ +STACK CFI 25754 x19: x19 +STACK CFI 25758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 2575c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 25760 x19: x19 +STACK CFI 25764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 104 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8 .cfa: x29 80 + +STACK CFI 14 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI f4 x19: x19 x20: x20 +STACK CFI f8 x21: x21 x22: x22 +STACK CFI fc x23: x23 x24: x24 +STACK CFI 100 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 8 .cfa: x29 64 + +STACK CFI 10 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 130 x19: x19 x20: x20 +STACK CFI 134 x21: x21 x22: x22 +STACK CFI 138 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 54490 ec .cfa: sp 0 + .ra: x30 +STACK CFI 54494 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 54498 .cfa: x29 80 + +STACK CFI 544a0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ +STACK CFI 5456c x21: x21 +STACK CFI 54574 x19: x19 x20: x20 +STACK CFI 54578 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7992c 58 .cfa: sp 0 + .ra: x30 +STACK CFI 79930 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 79934 .cfa: x29 48 + +STACK CFI 7993c x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 79978 x19: x19 x20: x20 +STACK CFI 7997c x21: x21 +STACK CFI 79980 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 79984 50 .cfa: sp 0 + .ra: x30 +STACK CFI 79988 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 79990 .cfa: x29 32 + +STACK CFI 79994 x19: .cfa -16 + ^ +STACK CFI 799c0 x19: x19 +STACK CFI 799c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 799c8 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 799cc x19: x19 +STACK CFI 799d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 799d4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 799d8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 799dc .cfa: x29 32 + +STACK CFI 799e0 x19: .cfa -16 + ^ +STACK CFI 799f0 x19: x19 +STACK CFI 799f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 799f8 40 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 79a38 12c .cfa: sp 0 + .ra: x30 +STACK CFI 79a3c .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 79a40 .cfa: x29 144 + +STACK CFI 79a4c x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ +STACK CFI 79b50 x23: x23 +STACK CFI 79b58 x19: x19 x20: x20 +STACK CFI 79b5c x21: x21 x22: x22 +STACK CFI 79b60 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 79b64 234 .cfa: sp 0 + .ra: x30 +STACK CFI 79b68 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 79b6c .cfa: x29 112 + +STACK CFI 79b78 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI 79d88 x19: x19 x20: x20 +STACK CFI 79d8c x21: x21 x22: x22 +STACK CFI 79d90 x23: x23 x24: x24 +STACK CFI 79d94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 79d98 64 .cfa: sp 0 + .ra: x30 +STACK CFI 79d9c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 79da4 .cfa: x29 48 + +STACK CFI 79da8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 79df4 x19: x19 x20: x20 +STACK CFI 79df8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 0 124 .cfa: sp 0 + .ra: x30 +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8 .cfa: x29 48 + +STACK CFI 10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 38 x19: x19 x20: x20 +STACK CFI 3c x21: x21 x22: x22 +STACK CFI 40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 44 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 79dfc c8 .cfa: sp 0 + .ra: x30 +STACK CFI 79e00 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 79e04 .cfa: x29 48 + +STACK CFI 79e08 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 79e14 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 79eb8 x19: x19 x20: x20 +STACK CFI 79ebc x21: x21 x22: x22 +STACK CFI 79ec0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 79ec4 2d8 .cfa: sp 0 + .ra: x30 +STACK CFI 79ec8 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 79ecc .cfa: x29 224 + +STACK CFI 79ed8 x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 7a18c x19: x19 x20: x20 +STACK CFI 7a190 x21: x21 x22: x22 +STACK CFI 7a194 x23: x23 x24: x24 +STACK CFI 7a198 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7a19c 204 .cfa: sp 0 + .ra: x30 +STACK CFI 7a1a0 .cfa: sp 192 + .ra: .cfa -184 + ^ x29: .cfa -192 + ^ +STACK CFI 7a1a4 .cfa: x29 192 + +STACK CFI 7a1a8 x19: .cfa -176 + ^ x20: .cfa -168 + ^ +STACK CFI 7a1d8 v8: .cfa -96 + ^ x21: .cfa -160 + ^ x22: .cfa -152 + ^ x23: .cfa -144 + ^ x24: .cfa -136 + ^ x25: .cfa -128 + ^ x26: .cfa -120 + ^ x27: .cfa -112 + ^ x28: .cfa -104 + ^ +STACK CFI 7a384 x19: x19 x20: x20 +STACK CFI 7a388 x21: x21 x22: x22 +STACK CFI 7a38c x23: x23 x24: x24 +STACK CFI 7a390 x25: x25 x26: x26 +STACK CFI 7a394 x27: x27 x28: x28 +STACK CFI 7a398 v8: v8 +STACK CFI 7a39c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7a3a0 34 .cfa: sp 0 + .ra: x30 +STACK CFI 7a3a4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7a3a8 .cfa: x29 48 + +STACK CFI 7a3ac x19: .cfa -32 + ^ +STACK CFI 7a3cc x19: x19 +STACK CFI 7a3d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 6d160 9c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a3d4 5c .cfa: sp 0 + .ra: x30 +STACK CFI 7a3d8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7a3dc .cfa: x29 48 + +STACK CFI 7a3e4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 7a414 x21: x21 +STACK CFI 7a418 x19: x19 x20: x20 +STACK CFI 7a41c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7a420 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 7a424 x19: x19 x20: x20 +STACK CFI 7a428 x21: x21 +STACK CFI 7a42c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7a430 74 .cfa: sp 0 + .ra: x30 +STACK CFI 7a434 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7a438 .cfa: x29 32 + +STACK CFI 7a43c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 7a498 x19: x19 x20: x20 +STACK CFI 7a49c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7a4a4 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a4b4 14 .cfa: sp 0 + .ra: x30 +STACK CFI 7a4b8 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7a4c0 .cfa: x29 16 + +STACK CFI INIT 7a4c8 168 .cfa: sp 0 + .ra: x30 +STACK CFI 7a4cc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7a4d0 .cfa: x29 64 + +STACK CFI 7a4d4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 7a4dc x21: .cfa -32 + ^ +STACK CFI 7a4f4 x21: x21 +STACK CFI 7a4f8 x19: x19 x20: x20 +STACK CFI 7a4fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7a500 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x29: .cfa -64 + ^ +STACK CFI 7a560 x21: x21 +STACK CFI 7a564 x19: x19 x20: x20 +STACK CFI 7a568 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7a56c .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 7a630 4c .cfa: sp 0 + .ra: x30 +STACK CFI 7a634 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7a638 .cfa: x29 48 + +STACK CFI 7a63c x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 7a644 x21: .cfa -16 + ^ +STACK CFI INIT 7a67c 2c .cfa: sp 0 + .ra: x30 +STACK CFI 7a684 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7a688 .cfa: x29 16 + +STACK CFI 7a694 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7a698 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 7a6a8 5c .cfa: sp 0 + .ra: x30 +STACK CFI 7a6ac .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7a6b4 .cfa: x29 16 + +STACK CFI 7a6e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7a6e8 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 7a704 60 .cfa: sp 0 + .ra: x30 +STACK CFI 7a708 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7a70c .cfa: x29 48 + +STACK CFI 7a714 x19: .cfa -32 + ^ +STACK CFI 7a728 x19: x19 +STACK CFI 7a72c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7a730 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 7a764 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a76c 3c .cfa: sp 0 + .ra: x30 +STACK CFI 7a770 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7a77c .cfa: x29 16 + +STACK CFI INIT 7a7a8 58 .cfa: sp 0 + .ra: x30 +STACK CFI 7a7ac .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7a7b0 .cfa: x29 16 + +STACK CFI INIT 7a800 a4 .cfa: sp 0 + .ra: x30 +STACK CFI 7a804 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7a808 .cfa: x29 32 + +STACK CFI 7a80c x19: .cfa -16 + ^ +STACK CFI 7a870 x19: x19 +STACK CFI 7a878 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7a87c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7a8a4 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 7a8a8 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7a8ac .cfa: x29 16 + +STACK CFI 7a8e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7a8ec .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7a90c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7a910 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7a938 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7a93c .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 233a4 88 .cfa: sp 0 + .ra: x30 +STACK CFI 233a8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 233b4 .cfa: x29 32 + +STACK CFI 233c0 x19: .cfa -16 + ^ +STACK CFI 23404 x19: x19 +STACK CFI 23414 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 23420 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7a958 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a964 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a968 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a96c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a978 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a97c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a988 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a98c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a990 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a9a0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7a9b0 20 .cfa: sp 0 + .ra: x30 +STACK CFI 7a9b4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7a9b8 .cfa: x29 16 + +STACK CFI 7a9c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7a9d0 78 .cfa: sp 0 + .ra: x30 +STACK CFI 7a9d4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7a9e0 .cfa: x29 32 + +STACK CFI 7a9e4 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI INIT 7aa48 10 .cfa: sp 0 + .ra: x30 +STACK CFI 7aa4c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7aa50 .cfa: x29 16 + +STACK CFI INIT 7aa58 a0 .cfa: sp 0 + .ra: x30 +STACK CFI 7aa5c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7aa64 .cfa: x29 32 + +STACK CFI 7aab4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7aab8 .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7aad4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7aad8 .cfa: x29 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7aaf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7aaf8 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 7aafc .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 7ab00 .cfa: x29 96 + +STACK CFI 7ab10 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI 7ab84 x25: x25 +STACK CFI 7ab88 x19: x19 x20: x20 +STACK CFI 7ab8c x21: x21 x22: x22 +STACK CFI 7ab90 x23: x23 x24: x24 +STACK CFI 7ab94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7ab98 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x29: .cfa -96 + ^ +STACK CFI 7aba0 x25: x25 +STACK CFI 7aba4 x19: x19 x20: x20 +STACK CFI 7aba8 x21: x21 x22: x22 +STACK CFI 7abac x23: x23 x24: x24 +STACK CFI 7abb0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7abb4 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 7abbc 3d4 .cfa: sp 0 + .ra: x30 +STACK CFI 7abc0 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 7abc4 .cfa: x29 208 + +STACK CFI 7abcc v8: .cfa -112 + ^ v9: .cfa -104 + ^ x25: .cfa -144 + ^ x26: .cfa -136 + ^ +STACK CFI 7abe8 v10: .cfa -96 + ^ v11: .cfa -88 + ^ v12: .cfa -80 + ^ v13: .cfa -72 + ^ x23: .cfa -160 + ^ x24: .cfa -152 + ^ +STACK CFI 7abfc v14: .cfa -64 + ^ x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x27: .cfa -128 + ^ x28: .cfa -120 + ^ +STACK CFI 7ad94 x19: x19 x20: x20 +STACK CFI 7ad98 v8: v8 v9: v9 +STACK CFI 7ad9c x21: x21 x22: x22 +STACK CFI 7ada0 v10: v10 v11: v11 +STACK CFI 7ada4 x23: x23 x24: x24 +STACK CFI 7ada8 v12: v12 v13: v13 +STACK CFI 7adac x25: x25 x26: x26 +STACK CFI 7adb0 x27: x27 x28: x28 +STACK CFI 7adb4 v14: v14 +STACK CFI 7adb8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7adbc .cfa: x29 208 + .ra: .cfa -200 + ^ v10: .cfa -96 + ^ v11: .cfa -88 + ^ v12: .cfa -80 + ^ v13: .cfa -72 + ^ v14: .cfa -64 + ^ v8: .cfa -112 + ^ v9: .cfa -104 + ^ x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ x24: .cfa -152 + ^ x25: .cfa -144 + ^ x26: .cfa -136 + ^ x27: .cfa -128 + ^ x28: .cfa -120 + ^ x29: .cfa -208 + ^ +STACK CFI INIT 7af90 48 .cfa: sp 0 + .ra: x30 +STACK CFI 7af94 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7af98 .cfa: x29 32 + +STACK CFI 7af9c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 7afd0 x19: x19 x20: x20 +STACK CFI 7afd4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7afd8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7afe0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7afe4 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7afe8 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7afec 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7aff0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7affc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b00c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7b010 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b018 .cfa: x29 32 + +STACK CFI 7b01c x19: .cfa -16 + ^ +STACK CFI 7b034 x19: x19 +STACK CFI 7b038 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b03c 2c .cfa: sp 0 + .ra: x30 +STACK CFI 7b040 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b044 .cfa: x29 32 + +STACK CFI 7b048 x19: .cfa -16 + ^ +STACK CFI 7b060 x19: x19 +STACK CFI 7b064 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b068 90 .cfa: sp 0 + .ra: x30 +STACK CFI 7b06c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b070 .cfa: x29 32 + +STACK CFI 7b074 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 7b0ac x19: x19 x20: x20 +STACK CFI 7b0b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7b0b4 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7b0f8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7b0fc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7b100 .cfa: x29 16 + +STACK CFI 7b108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7b10c .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 7b11c 1b4 .cfa: sp 0 + .ra: x30 +STACK CFI 7b120 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 7b134 .cfa: x29 112 + +STACK CFI 7b148 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ +STACK CFI 7b1f4 x23: x23 +STACK CFI 7b1f8 x19: x19 x20: x20 +STACK CFI 7b1fc x21: x21 x22: x22 +STACK CFI 7b200 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7b204 .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x29: .cfa -112 + ^ +STACK CFI INIT 7b2d0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b2d8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b2e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7b2ec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b2f4 .cfa: x29 32 + +STACK CFI 7b2f8 x19: .cfa -16 + ^ +STACK CFI 7b310 x19: x19 +STACK CFI 7b314 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b318 60 .cfa: sp 0 + .ra: x30 +STACK CFI 7b31c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7b320 .cfa: x29 48 + +STACK CFI 7b328 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 7b36c x19: x19 x20: x20 +STACK CFI 7b370 x21: x21 x22: x22 +STACK CFI 7b374 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b378 18 .cfa: sp 0 + .ra: x30 +STACK CFI 7b380 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7b388 .cfa: x29 16 + +STACK CFI INIT 7b390 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7b394 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7b398 .cfa: x29 16 + +STACK CFI INIT 7b3c0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b3dc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7b3e4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7b3ec .cfa: x29 16 + +STACK CFI INIT 7b400 c .cfa: sp 0 + .ra: x30 +STACK CFI 7b404 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7b408 .cfa: x29 16 + +STACK CFI INIT 7b40c 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b428 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b42c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b438 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b448 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7b44c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b454 .cfa: x29 32 + +STACK CFI 7b458 x19: .cfa -16 + ^ +STACK CFI 7b470 x19: x19 +STACK CFI 7b474 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b478 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b484 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b490 2c .cfa: sp 0 + .ra: x30 +STACK CFI 7b494 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b498 .cfa: x29 32 + +STACK CFI 7b49c x19: .cfa -16 + ^ +STACK CFI 7b4b4 x19: x19 +STACK CFI 7b4b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b4bc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b4c4 44 .cfa: sp 0 + .ra: x30 +STACK CFI 7b4c8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b4d4 .cfa: x29 32 + +STACK CFI 7b4d8 x19: .cfa -16 + ^ +STACK CFI 7b500 x19: x19 +STACK CFI 7b504 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b508 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7b50c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b510 .cfa: x29 32 + +STACK CFI 7b514 x19: .cfa -16 + ^ +STACK CFI 7b524 x19: x19 +STACK CFI 7b528 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b52c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b540 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7b544 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b548 .cfa: x29 32 + +STACK CFI 7b54c x19: .cfa -16 + ^ +STACK CFI 7b55c x19: x19 +STACK CFI 7b560 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b564 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b578 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7b57c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b580 .cfa: x29 32 + +STACK CFI 7b584 x19: .cfa -16 + ^ +STACK CFI 7b594 x19: x19 +STACK CFI 7b598 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b59c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b5b0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7b5b4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7b5b8 .cfa: x29 32 + +STACK CFI 7b5bc x19: .cfa -16 + ^ +STACK CFI 7b5cc x19: x19 +STACK CFI 7b5d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b5d4 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b5ec a0 .cfa: sp 0 + .ra: x30 +STACK CFI 7b5f0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7b5f4 .cfa: x29 48 + +STACK CFI 7b5fc x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 7b654 x19: x19 x20: x20 +STACK CFI 7b658 x21: x21 x22: x22 +STACK CFI 7b65c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7b660 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 7b68c c4 .cfa: sp 0 + .ra: x30 +STACK CFI 7b690 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 7b694 .cfa: x29 128 + +STACK CFI 7b69c x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ +STACK CFI INIT 7b750 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 7b754 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 7b758 .cfa: x29 128 + +STACK CFI 7b760 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ +STACK CFI INIT 7b814 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b82c 28 .cfa: sp 0 + .ra: x30 +STACK CFI 7b830 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7b838 .cfa: x29 16 + +STACK CFI 7b850 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b854 60 .cfa: sp 0 + .ra: x30 +STACK CFI 7b858 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 7b85c .cfa: x29 160 + +STACK CFI 7b860 x19: .cfa -144 + ^ +STACK CFI 7b890 x19: x19 +STACK CFI 7b894 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7b898 .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x29: .cfa -160 + ^ +STACK CFI 7b8a0 x19: x19 +STACK CFI 7b8b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7b8b4 140 .cfa: sp 0 + .ra: x30 +STACK CFI 7b8b8 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 7b8bc .cfa: x29 176 + +STACK CFI 7b8c0 x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 7b8cc x21: .cfa -144 + ^ x22: .cfa -136 + ^ +STACK CFI 7b8f0 x19: x19 x20: x20 +STACK CFI 7b8f4 x21: x21 x22: x22 +STACK CFI 7b8f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7b8fc .cfa: x29 176 + .ra: .cfa -168 + ^ x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x29: .cfa -176 + ^ +STACK CFI 7b978 x19: x19 x20: x20 +STACK CFI 7b97c x21: x21 x22: x22 +STACK CFI 7b980 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7b984 .cfa: x29 176 + .ra: .cfa -168 + ^ x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x29: .cfa -176 + ^ +STACK CFI INIT 7b9f4 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7b9fc d4 .cfa: sp 0 + .ra: x30 +STACK CFI 7ba00 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 7ba04 .cfa: x29 176 + +STACK CFI 7ba0c x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ +STACK CFI 7ba8c x19: x19 x20: x20 +STACK CFI 7ba90 x21: x21 +STACK CFI 7ba94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7ba98 .cfa: x29 176 + .ra: .cfa -168 + ^ x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x29: .cfa -176 + ^ +STACK CFI 7baa0 x21: x21 +STACK CFI 7baa4 x19: x19 x20: x20 +STACK CFI 7baa8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7baac .cfa: x29 176 + .ra: .cfa -168 + ^ x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x29: .cfa -176 + ^ +STACK CFI INIT 7bad0 58 .cfa: sp 0 + .ra: x30 +STACK CFI 7bad4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7badc .cfa: x29 32 + +STACK CFI 7bae0 x19: .cfa -16 + ^ +STACK CFI 7bb0c x19: x19 +STACK CFI 7bb10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7bb14 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7bb28 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7bb30 68 .cfa: sp 0 + .ra: x30 +STACK CFI 7bb34 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7bb38 .cfa: x29 48 + +STACK CFI 7bb40 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 7bb8c x19: x19 x20: x20 +STACK CFI 7bb90 x21: x21 +STACK CFI 7bb94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7bb98 90 .cfa: sp 0 + .ra: x30 +STACK CFI 7bb9c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7bba4 .cfa: x29 48 + +STACK CFI 7bba8 x19: .cfa -32 + ^ +STACK CFI 7bbc8 x19: x19 +STACK CFI 7bbcc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7bbd0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 7bbe0 x19: x19 +STACK CFI 7bbe4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7bbe8 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 7bc0c x19: x19 +STACK CFI 7bc10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7bc14 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 7bc20 x19: x19 +STACK CFI 7bc24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7bc28 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7bc34 8c .cfa: sp 0 + .ra: x30 +STACK CFI 7bc38 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7bc40 .cfa: x29 48 + +STACK CFI 7bc44 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 7bc50 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 7bc94 x19: x19 x20: x20 +STACK CFI 7bc98 x21: x21 x22: x22 +STACK CFI 7bc9c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7bca0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 7bcc0 424 .cfa: sp 0 + .ra: x30 +STACK CFI 7bcc4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 7bcc8 .cfa: x29 80 + +STACK CFI 7bcd4 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 7bd14 x19: x19 x20: x20 +STACK CFI 7bd18 x21: x21 x22: x22 +STACK CFI 7bd1c x23: x23 x24: x24 +STACK CFI 7bd20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7bd24 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x29: .cfa -80 + ^ +STACK CFI 7bf6c x21: x21 x22: x22 +STACK CFI 7bf70 x19: x19 x20: x20 +STACK CFI 7bf74 x23: x23 x24: x24 +STACK CFI 7bf78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7bf7c .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x29: .cfa -80 + ^ +STACK CFI 7bfe0 x21: x21 x22: x22 +STACK CFI 7bfe4 x19: x19 x20: x20 +STACK CFI 7bfe8 x23: x23 x24: x24 +STACK CFI 7bfec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7bff0 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 7c0e4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c0f8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7c0fc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c100 .cfa: x29 32 + +STACK CFI 7c104 x19: .cfa -16 + ^ +STACK CFI 7c114 x19: x19 +STACK CFI 7c118 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c11c 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c134 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7c138 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c13c .cfa: x29 32 + +STACK CFI 7c140 x19: .cfa -16 + ^ +STACK CFI 7c15c x19: x19 +STACK CFI 7c160 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c164 60 .cfa: sp 0 + .ra: x30 +STACK CFI 7c168 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7c16c .cfa: x29 48 + +STACK CFI 7c170 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 7c178 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 7c1b8 x19: x19 x20: x20 +STACK CFI 7c1bc x21: x21 x22: x22 +STACK CFI 7c1c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c1c4 d0 .cfa: sp 0 + .ra: x30 +STACK CFI 7c1c8 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 7c1cc .cfa: x29 80 + +STACK CFI 7c1d0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 7c1dc x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 7c23c x23: x23 +STACK CFI 7c244 x19: x19 x20: x20 +STACK CFI 7c248 x21: x21 x22: x22 +STACK CFI 7c24c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7c250 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x29: .cfa -80 + ^ +STACK CFI 7c26c x23: x23 +STACK CFI 7c274 x19: x19 x20: x20 +STACK CFI 7c278 x21: x21 x22: x22 +STACK CFI 7c27c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7c280 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 7c294 64 .cfa: sp 0 + .ra: x30 +STACK CFI 7c2a0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c2a4 .cfa: x29 32 + +STACK CFI 7c2ac x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 7c2dc x19: x19 x20: x20 +STACK CFI 7c2e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7c2e4 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7c2f8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7c2fc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c300 .cfa: x29 32 + +STACK CFI 7c304 x19: .cfa -16 + ^ +STACK CFI 7c314 x19: x19 +STACK CFI 7c318 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c31c c0 .cfa: sp 0 + .ra: x30 +STACK CFI 7c320 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 7c328 .cfa: x29 96 + +STACK CFI 7c330 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ +STACK CFI INIT 7c3dc 6c .cfa: sp 0 + .ra: x30 +STACK CFI 7c3e0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c3e8 .cfa: x29 32 + +STACK CFI 7c3ec x19: .cfa -16 + ^ +STACK CFI 7c440 x19: x19 +STACK CFI 7c444 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c448 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c44c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c450 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c45c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c468 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c470 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c478 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c480 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c488 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c490 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c4a0 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7c4a4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c4ac .cfa: x29 32 + +STACK CFI 7c4b0 x19: .cfa -16 + ^ +STACK CFI 7c4c8 x19: x19 +STACK CFI 7c4cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c4d0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c4e0 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7c4e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c4ec .cfa: x29 32 + +STACK CFI 7c4f0 x19: .cfa -16 + ^ +STACK CFI 7c508 x19: x19 +STACK CFI 7c50c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c510 20 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c530 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c540 3c .cfa: sp 0 + .ra: x30 +STACK CFI 7c544 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c54c .cfa: x29 32 + +STACK CFI 7c550 x19: .cfa -16 + ^ +STACK CFI 7c574 x19: x19 +STACK CFI 7c578 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c57c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c58c 20 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c5ac 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c5bc 3c .cfa: sp 0 + .ra: x30 +STACK CFI 7c5c0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c5c8 .cfa: x29 32 + +STACK CFI 7c5cc x19: .cfa -16 + ^ +STACK CFI 7c5f0 x19: x19 +STACK CFI 7c5f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c5f8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7c608 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 7c60c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7c614 .cfa: x29 64 + +STACK CFI 7c620 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 7c6b4 x23: x23 +STACK CFI 7c6b8 x19: x19 x20: x20 +STACK CFI 7c6bc x21: x21 x22: x22 +STACK CFI 7c6c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7c6c4 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 7c6cc c8 .cfa: sp 0 + .ra: x30 +STACK CFI 7c6d0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7c6d8 .cfa: x29 64 + +STACK CFI 7c6e4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 7c784 x23: x23 +STACK CFI 7c788 x19: x19 x20: x20 +STACK CFI 7c78c x21: x21 x22: x22 +STACK CFI 7c790 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c794 38 .cfa: sp 0 + .ra: x30 +STACK CFI 7c798 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7c7a0 .cfa: x29 16 + +STACK CFI 7c7c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c7cc dc .cfa: sp 0 + .ra: x30 +STACK CFI 7c7d0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 7c7d4 .cfa: x29 80 + +STACK CFI 7c7e0 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 7c87c x19: x19 x20: x20 +STACK CFI 7c880 x21: x21 x22: x22 +STACK CFI 7c884 x23: x23 x24: x24 +STACK CFI 7c888 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7c88c .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x29: .cfa -80 + ^ +STACK CFI 7c898 x19: x19 x20: x20 +STACK CFI 7c89c x21: x21 x22: x22 +STACK CFI 7c8a0 x23: x23 x24: x24 +STACK CFI 7c8a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c8a8 a4 .cfa: sp 0 + .ra: x30 +STACK CFI 7c8ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c8b4 .cfa: x29 32 + +STACK CFI 7c8b8 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 7c8e4 x19: x19 x20: x20 +STACK CFI 7c8e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7c8ec .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 7c924 x19: x19 x20: x20 +STACK CFI 7c928 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7c92c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 7c938 x19: x19 x20: x20 +STACK CFI 7c948 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c94c 40 .cfa: sp 0 + .ra: x30 +STACK CFI 7c950 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7c954 .cfa: x29 32 + +STACK CFI 7c95c x19: .cfa -16 + ^ +STACK CFI 7c984 x19: x19 +STACK CFI 7c988 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7c98c c4 .cfa: sp 0 + .ra: x30 +STACK CFI 7c990 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7c998 .cfa: x29 64 + +STACK CFI 7c9a4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 7ca40 x23: x23 +STACK CFI 7ca44 x19: x19 x20: x20 +STACK CFI 7ca48 x21: x21 x22: x22 +STACK CFI 7ca4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7ca50 e4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7cb34 544 .cfa: sp 0 + .ra: x30 +STACK CFI 7cb38 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7cb3c .cfa: x29 64 + +STACK CFI 7cb40 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 7cb50 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 7cfe8 x19: x19 x20: x20 +STACK CFI 7cfec x21: x21 x22: x22 +STACK CFI 7cff0 x23: x23 x24: x24 +STACK CFI 7cff4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7cff8 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI 7d040 x19: x19 x20: x20 +STACK CFI 7d044 x21: x21 x22: x22 +STACK CFI 7d048 x23: x23 x24: x24 +STACK CFI 7d04c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d050 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 7d078 34 .cfa: sp 0 + .ra: x30 +STACK CFI 7d080 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7d084 .cfa: x29 16 + +STACK CFI 7d09c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d0a0 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7d0a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7d0ac 34 .cfa: sp 0 + .ra: x30 +STACK CFI 7d0b0 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7d0b4 .cfa: x29 16 + +STACK CFI 7d0cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d0d0 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 7d0e0 100 .cfa: sp 0 + .ra: x30 +STACK CFI 7d0e4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7d0e8 .cfa: x29 48 + +STACK CFI 7d0ec x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 7d0f8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 7d134 x19: x19 x20: x20 +STACK CFI 7d138 x21: x21 x22: x22 +STACK CFI 7d13c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d140 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 7d14c x21: x21 x22: x22 +STACK CFI 7d150 x19: x19 x20: x20 +STACK CFI 7d154 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d158 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 7d1c4 x19: x19 x20: x20 +STACK CFI 7d1c8 x21: x21 x22: x22 +STACK CFI 7d1cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d1d0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 7d1e0 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7d1fc 194 .cfa: sp 0 + .ra: x30 +STACK CFI 7d200 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 7d204 .cfa: x29 96 + +STACK CFI 7d208 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 7d214 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 7d2f0 x21: x21 x22: x22 +STACK CFI 7d2f4 x19: x19 x20: x20 +STACK CFI 7d2f8 x23: x23 x24: x24 +STACK CFI 7d2fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d300 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 7d390 100 .cfa: sp 0 + .ra: x30 +STACK CFI 7d394 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7d398 .cfa: x29 48 + +STACK CFI 7d39c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 7d3a8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 7d3e4 x19: x19 x20: x20 +STACK CFI 7d3e8 x21: x21 x22: x22 +STACK CFI 7d3ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d3f0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 7d3fc x21: x21 x22: x22 +STACK CFI 7d400 x19: x19 x20: x20 +STACK CFI 7d404 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d408 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 7d474 x19: x19 x20: x20 +STACK CFI 7d478 x21: x21 x22: x22 +STACK CFI 7d47c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d480 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 7d490 dc .cfa: sp 0 + .ra: x30 +STACK CFI 7d494 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7d498 .cfa: x29 48 + +STACK CFI 7d4a0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 7d508 x19: x19 x20: x20 +STACK CFI 7d50c x21: x21 +STACK CFI 7d510 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d514 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 7d544 x21: x21 +STACK CFI 7d548 x19: x19 x20: x20 +STACK CFI 7d54c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d550 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 7d56c 68 .cfa: sp 0 + .ra: x30 +STACK CFI 7d570 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7d574 .cfa: x29 32 + +STACK CFI 7d578 x19: .cfa -16 + ^ +STACK CFI 7d59c x19: x19 +STACK CFI 7d5a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d5a4 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7d5d4 2b8 .cfa: sp 0 + .ra: x30 +STACK CFI 7d5d8 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 7d5dc .cfa: x29 80 + +STACK CFI 7d5e8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 7d628 x19: x19 x20: x20 +STACK CFI 7d62c x21: x21 x22: x22 +STACK CFI 7d630 x23: x23 x24: x24 +STACK CFI 7d634 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d638 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x29: .cfa -80 + ^ +STACK CFI 7d77c x21: x21 x22: x22 +STACK CFI 7d780 x19: x19 x20: x20 +STACK CFI 7d784 x23: x23 x24: x24 +STACK CFI 7d788 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d78c .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x29: .cfa -80 + ^ +STACK CFI 7d7d8 x19: x19 x20: x20 +STACK CFI 7d7dc x21: x21 x22: x22 +STACK CFI 7d7e0 x23: x23 x24: x24 +STACK CFI 7d7e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d7e8 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x29: .cfa -80 + ^ +STACK CFI 7d83c x21: x21 x22: x22 +STACK CFI 7d840 x19: x19 x20: x20 +STACK CFI 7d844 x23: x23 x24: x24 +STACK CFI 7d848 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7d84c .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 7d88c 2b4 .cfa: sp 0 + .ra: x30 +STACK CFI 7d890 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 7d894 .cfa: x29 96 + +STACK CFI 7d8a4 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 7da2c x19: x19 x20: x20 +STACK CFI 7da30 x21: x21 x22: x22 +STACK CFI 7da34 x23: x23 x24: x24 +STACK CFI 7da38 x25: x25 x26: x26 +STACK CFI 7da3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7da40 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x29: .cfa -96 + ^ +STACK CFI 7dac0 x19: x19 x20: x20 +STACK CFI 7dac4 x21: x21 x22: x22 +STACK CFI 7dac8 x23: x23 x24: x24 +STACK CFI 7dacc x25: x25 x26: x26 +STACK CFI 7dad0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7dad4 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x29: .cfa -96 + ^ +STACK CFI 7daf8 x19: x19 x20: x20 +STACK CFI 7dafc x21: x21 x22: x22 +STACK CFI 7db00 x23: x23 x24: x24 +STACK CFI 7db04 x25: x25 x26: x26 +STACK CFI 7db08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7db0c .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 7db40 164 .cfa: sp 0 + .ra: x30 +STACK CFI 7db44 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7db4c .cfa: x29 32 + +STACK CFI 7db50 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 7dc20 x19: x19 x20: x20 +STACK CFI 7dc24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7dc28 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7dca4 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7dca8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7dcac .cfa: x29 32 + +STACK CFI 7dcb0 x19: .cfa -16 + ^ +STACK CFI 7dcc0 x19: x19 +STACK CFI 7dcc4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7dcc8 64 .cfa: sp 0 + .ra: x30 +STACK CFI 7dccc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7dcd0 .cfa: x29 32 + +STACK CFI 7dcd4 x19: .cfa -16 + ^ +STACK CFI 7dd04 x19: x19 +STACK CFI 7dd08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7dd0c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 7dd14 x19: x19 +STACK CFI 7dd18 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7dd1c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7dd2c 230 .cfa: sp 0 + .ra: x30 +STACK CFI 7dd30 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 7dd34 .cfa: x29 96 + +STACK CFI 7dd38 x25: .cfa -32 + ^ +STACK CFI 7dd4c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 7de84 x25: x25 +STACK CFI 7de88 x19: x19 x20: x20 +STACK CFI 7de8c x21: x21 x22: x22 +STACK CFI 7de90 x23: x23 x24: x24 +STACK CFI 7de94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7de98 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x29: .cfa -96 + ^ +STACK CFI 7dec8 x25: x25 +STACK CFI 7ded0 x19: x19 x20: x20 +STACK CFI 7ded4 x21: x21 x22: x22 +STACK CFI 7ded8 x23: x23 x24: x24 +STACK CFI 7dedc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7dee0 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x29: .cfa -96 + ^ +STACK CFI 7deec x25: x25 +STACK CFI 7def4 x19: x19 x20: x20 +STACK CFI 7def8 x21: x21 x22: x22 +STACK CFI 7defc x23: x23 x24: x24 +STACK CFI 7df00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7df04 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 7df5c 22c .cfa: sp 0 + .ra: x30 +STACK CFI 7df60 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 7df64 .cfa: x29 96 + +STACK CFI 7df68 x25: .cfa -32 + ^ +STACK CFI 7df7c x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 7e0ac x19: x19 x20: x20 +STACK CFI 7e0b0 x21: x21 x22: x22 +STACK CFI 7e0b4 x23: x23 x24: x24 +STACK CFI 7e0b8 x25: x25 +STACK CFI 7e0bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7e0c0 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x29: .cfa -96 + ^ +STACK CFI 7e0ec x25: x25 +STACK CFI 7e0f4 x19: x19 x20: x20 +STACK CFI 7e0f8 x21: x21 x22: x22 +STACK CFI 7e0fc x23: x23 x24: x24 +STACK CFI 7e100 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7e104 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x29: .cfa -96 + ^ +STACK CFI 7e110 x25: x25 +STACK CFI 7e114 x19: x19 x20: x20 +STACK CFI 7e118 x21: x21 x22: x22 +STACK CFI 7e11c x23: x23 x24: x24 +STACK CFI 7e120 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7e124 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 7e188 80c .cfa: sp 0 + .ra: x30 +STACK CFI 7e18c .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 7e190 .cfa: x29 144 + +STACK CFI 7e194 x19: .cfa -128 + ^ x20: .cfa -120 + ^ +STACK CFI 7e1a8 x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ +STACK CFI 7e6c0 x19: x19 x20: x20 +STACK CFI 7e6c4 x21: x21 x22: x22 +STACK CFI 7e6c8 x23: x23 x24: x24 +STACK CFI 7e6cc x25: x25 x26: x26 +STACK CFI 7e6d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7e6d4 .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 7e994 38 .cfa: sp 0 + .ra: x30 +STACK CFI 7e99c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7e9a0 .cfa: x29 16 + +STACK CFI 7e9b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7e9bc .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7e9c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7e9cc cc .cfa: sp 0 + .ra: x30 +STACK CFI 7e9d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7e9d4 .cfa: x29 32 + +STACK CFI 7e9d8 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 7ea20 x19: x19 x20: x20 +STACK CFI 7ea24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7ea28 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 7ea88 x19: x19 x20: x20 +STACK CFI 7ea8c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7ea90 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7ea98 10c .cfa: sp 0 + .ra: x30 +STACK CFI 7ea9c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7eaa0 .cfa: x29 48 + +STACK CFI 7eaa8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 7eac8 x19: x19 x20: x20 +STACK CFI 7eacc x21: x21 x22: x22 +STACK CFI 7ead0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7ead4 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 7eba4 c8 .cfa: sp 0 + .ra: x30 +STACK CFI 7eba8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7ebb0 .cfa: x29 48 + +STACK CFI 7ebb8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 7ec5c x21: x21 +STACK CFI 7ec64 x19: x19 x20: x20 +STACK CFI 7ec68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7ec6c 3ec .cfa: sp 0 + .ra: x30 +STACK CFI 7ec70 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 7ec74 .cfa: x29 96 + +STACK CFI 7ec80 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 7ecb0 x19: x19 x20: x20 +STACK CFI 7ecb4 x21: x21 x22: x22 +STACK CFI 7ecb8 x23: x23 +STACK CFI 7ecbc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7ecc0 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x29: .cfa -96 + ^ +STACK CFI 7edd0 x23: x23 +STACK CFI 7ede4 x19: x19 x20: x20 +STACK CFI 7ede8 x21: x21 x22: x22 +STACK CFI 7edec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7edf0 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 7f058 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f06c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 7f070 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f074 .cfa: x29 32 + +STACK CFI 7f078 x19: .cfa -16 + ^ +STACK CFI 7f088 x19: x19 +STACK CFI 7f08c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f090 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f0a8 3c .cfa: sp 0 + .ra: x30 +STACK CFI 7f0ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f0b0 .cfa: x29 32 + +STACK CFI 7f0b4 x19: .cfa -16 + ^ +STACK CFI 7f0cc x19: x19 +STACK CFI 7f0d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f0d4 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7f0e4 38 .cfa: sp 0 + .ra: x30 +STACK CFI 7f0e8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f0ec .cfa: x29 32 + +STACK CFI 7f0f0 x19: .cfa -16 + ^ +STACK CFI 7f104 x19: x19 +STACK CFI 7f108 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f10c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7f11c 28 .cfa: sp 0 + .ra: x30 +STACK CFI 7f120 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f124 .cfa: x29 32 + +STACK CFI 7f128 x19: .cfa -16 + ^ +STACK CFI 7f13c x19: x19 +STACK CFI 7f140 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f144 2c .cfa: sp 0 + .ra: x30 +STACK CFI 7f148 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7f14c .cfa: x29 16 + +STACK CFI 7f15c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f160 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 7f170 60 .cfa: sp 0 + .ra: x30 +STACK CFI 7f174 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f178 .cfa: x29 32 + +STACK CFI 7f184 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 7f1b0 x19: x19 x20: x20 +STACK CFI 7f1b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f1b8 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7f1d0 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f1fc 38 .cfa: sp 0 + .ra: x30 +STACK CFI 7f200 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7f204 .cfa: x29 16 + +STACK CFI 7f22c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f230 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI INIT 7f234 9c .cfa: sp 0 + .ra: x30 +STACK CFI 7f238 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7f23c .cfa: x29 48 + +STACK CFI 7f240 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 7f24c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 7f298 x19: x19 x20: x20 +STACK CFI 7f29c x21: x21 x22: x22 +STACK CFI 7f2a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f2a4 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 7f2d0 1d0 .cfa: sp 0 + .ra: x30 +STACK CFI 7f2d4 .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 7f2d8 .cfa: x29 208 + +STACK CFI 7f2ec x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ +STACK CFI 7f394 x23: x23 +STACK CFI 7f398 x19: x19 x20: x20 +STACK CFI 7f39c x21: x21 x22: x22 +STACK CFI 7f3a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f3a4 .cfa: x29 208 + .ra: .cfa -200 + ^ x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ x29: .cfa -208 + ^ +STACK CFI INIT 7f4a0 1c .cfa: sp 0 + .ra: x30 +STACK CFI 7f4a4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7f4a8 .cfa: x29 16 + +STACK CFI 7f4b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f4bc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f4c4 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f4cc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f4dc 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7f4e0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f4e8 .cfa: x29 32 + +STACK CFI 7f4ec x19: .cfa -16 + ^ +STACK CFI 7f504 x19: x19 +STACK CFI 7f508 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f50c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f51c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7f520 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f528 .cfa: x29 32 + +STACK CFI 7f52c x19: .cfa -16 + ^ +STACK CFI 7f544 x19: x19 +STACK CFI 7f548 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f54c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f55c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7f560 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f568 .cfa: x29 32 + +STACK CFI 7f56c x19: .cfa -16 + ^ +STACK CFI 7f584 x19: x19 +STACK CFI 7f588 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f58c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f59c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7f5a0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f5a8 .cfa: x29 32 + +STACK CFI 7f5ac x19: .cfa -16 + ^ +STACK CFI 7f5c4 x19: x19 +STACK CFI 7f5c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f5cc 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f5dc 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7f5e0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f5e8 .cfa: x29 32 + +STACK CFI 7f5ec x19: .cfa -16 + ^ +STACK CFI 7f604 x19: x19 +STACK CFI 7f608 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f60c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f61c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7f620 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f628 .cfa: x29 32 + +STACK CFI 7f62c x19: .cfa -16 + ^ +STACK CFI 7f644 x19: x19 +STACK CFI 7f648 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f64c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f65c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7f660 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f668 .cfa: x29 32 + +STACK CFI 7f66c x19: .cfa -16 + ^ +STACK CFI 7f684 x19: x19 +STACK CFI 7f688 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f68c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f69c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 7f6a0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f6a8 .cfa: x29 32 + +STACK CFI 7f6ac x19: .cfa -16 + ^ +STACK CFI 7f6c4 x19: x19 +STACK CFI 7f6c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f6cc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f6d4 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 7f6ec 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 20854 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 20870 14 .cfa: sp 0 + .ra: x30 +STACK CFI 20874 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 2087c .cfa: x29 16 + +STACK CFI INIT 20884 14 .cfa: sp 0 + .ra: x30 +STACK CFI 20888 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 20890 .cfa: x29 16 + +STACK CFI INIT 7f708 1c .cfa: sp 0 + .ra: x30 +STACK CFI 7f70c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7f710 .cfa: x29 16 + +STACK CFI 7f720 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f724 110 .cfa: sp 0 + .ra: x30 +STACK CFI 7f728 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7f72c .cfa: x29 48 + +STACK CFI 7f730 x19: .cfa -32 + ^ +STACK CFI 7f778 x19: x19 +STACK CFI 7f77c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f780 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 7f7c4 x19: x19 +STACK CFI 7f7c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f7cc .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 7f81c x19: x19 +STACK CFI 7f820 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f824 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 7f834 110 .cfa: sp 0 + .ra: x30 +STACK CFI 7f838 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 7f83c .cfa: x29 48 + +STACK CFI 7f840 x19: .cfa -32 + ^ +STACK CFI 7f888 x19: x19 +STACK CFI 7f88c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f890 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 7f8d4 x19: x19 +STACK CFI 7f8d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f8dc .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 7f92c x19: x19 +STACK CFI 7f930 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f934 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 7f944 1c .cfa: sp 0 + .ra: x30 +STACK CFI 7f948 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 7f94c .cfa: x29 16 + +STACK CFI 7f95c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7f960 98 .cfa: sp 0 + .ra: x30 +STACK CFI 7f964 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7f968 .cfa: x29 32 + +STACK CFI 7f96c x19: .cfa -16 + ^ +STACK CFI 7f9a4 x19: x19 +STACK CFI 7f9a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f9ac .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 7f9e0 x19: x19 +STACK CFI 7f9e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7f9e8 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7f9f8 98 .cfa: sp 0 + .ra: x30 +STACK CFI 7f9fc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 7fa00 .cfa: x29 32 + +STACK CFI 7fa04 x19: .cfa -16 + ^ +STACK CFI 7fa38 x19: x19 +STACK CFI 7fa3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7fa40 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 7fa74 x19: x19 +STACK CFI 7fa78 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7fa7c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 7fa90 c4 .cfa: sp 0 + .ra: x30 +STACK CFI 7fa94 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7fa98 .cfa: x29 64 + +STACK CFI 7fa9c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 7faac x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 7fb44 x23: x23 +STACK CFI 7fb48 x19: x19 x20: x20 +STACK CFI 7fb4c x21: x21 x22: x22 +STACK CFI 7fb50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7fb54 bc .cfa: sp 0 + .ra: x30 +STACK CFI 7fb58 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7fb5c .cfa: x29 64 + +STACK CFI 7fb60 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 7fb70 x21: .cfa -32 + ^ +STACK CFI 7fbfc x21: x21 +STACK CFI 7fc08 x19: x19 x20: x20 +STACK CFI 7fc0c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7fc10 bc .cfa: sp 0 + .ra: x30 +STACK CFI 7fc14 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7fc18 .cfa: x29 64 + +STACK CFI 7fc1c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 7fc2c x21: .cfa -32 + ^ +STACK CFI 7fcb8 x21: x21 +STACK CFI 7fcc4 x19: x19 x20: x20 +STACK CFI 7fcc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 7fccc 100 .cfa: sp 0 + .ra: x30 +STACK CFI 7fcd0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7fcd4 .cfa: x29 64 + +STACK CFI 7fcd8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 7fce8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 7fd2c x23: x23 +STACK CFI 7fd34 x19: x19 x20: x20 +STACK CFI 7fd38 x21: x21 x22: x22 +STACK CFI 7fd3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7fd40 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 7fdcc f4 .cfa: sp 0 + .ra: x30 +STACK CFI 7fdd0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 7fdd4 .cfa: x29 64 + +STACK CFI 7fde4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 7fe2c x23: x23 +STACK CFI 7fe34 x19: x19 x20: x20 +STACK CFI 7fe38 x21: x21 x22: x22 +STACK CFI 7fe3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 7fe40 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 7fec0 1fc .cfa: sp 0 + .ra: x30 +STACK CFI 7fec4 .cfa: sp 576 + +STACK CFI 7fec8 .cfa: sp 672 + .ra: .cfa -664 + ^ x29: .cfa -672 + ^ +STACK CFI 7fecc .cfa: x29 672 + +STACK CFI 7fed0 x21: .cfa -640 + ^ x22: .cfa -632 + ^ +STACK CFI 7fee0 x19: .cfa -656 + ^ x20: .cfa -648 + ^ x25: .cfa -608 + ^ x26: .cfa -600 + ^ +STACK CFI 7fef8 x23: .cfa -624 + ^ x24: .cfa -616 + ^ x27: .cfa -592 + ^ x28: .cfa -584 + ^ +STACK CFI 80048 x19: x19 x20: x20 +STACK CFI 8004c x21: x21 x22: x22 +STACK CFI 80050 x23: x23 x24: x24 +STACK CFI 80054 x25: x25 x26: x26 +STACK CFI 80058 x27: x27 x28: x28 +STACK CFI 8005c .cfa: sp 576 + .ra: .ra x29: x29 +STACK CFI 80060 .cfa: sp 480 + +STACK CFI 80064 .cfa: x29 672 + .ra: .cfa -664 + ^ x19: .cfa -656 + ^ x20: .cfa -648 + ^ x21: .cfa -640 + ^ x22: .cfa -632 + ^ x23: .cfa -624 + ^ x24: .cfa -616 + ^ x25: .cfa -608 + ^ x26: .cfa -600 + ^ x27: .cfa -592 + ^ x28: .cfa -584 + ^ x29: .cfa -672 + ^ +STACK CFI INIT 800bc 49c .cfa: sp 0 + .ra: x30 +STACK CFI 800c0 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 800c4 .cfa: x29 112 + +STACK CFI 800cc x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 800e8 x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ x28: .cfa -24 + ^ +STACK CFI 801d8 x19: x19 x20: x20 +STACK CFI 801dc x21: x21 x22: x22 +STACK CFI 801e0 x23: x23 x24: x24 +STACK CFI 801e4 x25: x25 x26: x26 +STACK CFI 801e8 x27: x27 x28: x28 +STACK CFI 801ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 801f0 .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ x28: .cfa -24 + ^ x29: .cfa -112 + ^ +STACK CFI INIT 80558 68 .cfa: sp 0 + .ra: x30 +STACK CFI 8055c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 80560 .cfa: x29 48 + +STACK CFI 80564 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 8056c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 805b4 x19: x19 x20: x20 +STACK CFI 805b8 x21: x21 x22: x22 +STACK CFI 805bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 805c0 a0 .cfa: sp 0 + .ra: x30 +STACK CFI 805c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 805c8 .cfa: x29 48 + +STACK CFI 805cc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 805d4 x21: .cfa -16 + ^ +STACK CFI 805f0 x21: x21 +STACK CFI 805f4 x19: x19 x20: x20 +STACK CFI 805f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 805fc .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 8063c x21: x21 +STACK CFI 80644 x19: x19 x20: x20 +STACK CFI 80648 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8064c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 80660 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 80664 5c .cfa: sp 0 + .ra: x30 +STACK CFI 80668 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8066c .cfa: x29 48 + +STACK CFI 80674 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 806a4 x19: x19 x20: x20 +STACK CFI 806a8 x21: x21 +STACK CFI 806ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 806b0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 806b4 x19: x19 x20: x20 +STACK CFI 806b8 x21: x21 +STACK CFI 806bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 806c0 120 .cfa: sp 0 + .ra: x30 +STACK CFI 806c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 806c8 .cfa: x29 48 + +STACK CFI 806cc x21: .cfa -16 + ^ +STACK CFI 806dc x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 80754 x21: x21 +STACK CFI 80758 x19: x19 x20: x20 +STACK CFI 8075c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80760 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 8076c x21: x21 +STACK CFI 80770 x19: x19 x20: x20 +STACK CFI 80774 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80778 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 807e0 34 .cfa: sp 0 + .ra: x30 +STACK CFI 807e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 807ec .cfa: x29 32 + +STACK CFI 807f0 x19: .cfa -16 + ^ +STACK CFI INIT 80814 40 .cfa: sp 0 + .ra: x30 +STACK CFI 80818 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8081c .cfa: x29 32 + +STACK CFI 80820 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 8084c x19: x19 x20: x20 +STACK CFI 80850 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 80854 84 .cfa: sp 0 + .ra: x30 +STACK CFI 80858 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8085c .cfa: x29 48 + +STACK CFI 80860 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 80868 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 808c4 x19: x19 x20: x20 +STACK CFI 808c8 x21: x21 x22: x22 +STACK CFI 808cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 808d0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 808d8 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 808e4 158 .cfa: sp 0 + .ra: x30 +STACK CFI 808e8 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 808ec .cfa: x29 80 + +STACK CFI 808f4 x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 80904 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x23: .cfa -32 + ^ +STACK CFI 809a0 x19: x19 x20: x20 +STACK CFI 809a4 x21: x21 x22: x22 +STACK CFI 809a8 x23: x23 +STACK CFI 809ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 809b0 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 80a3c 1b8 .cfa: sp 0 + .ra: x30 +STACK CFI 80a40 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 80a48 .cfa: x29 32 + +STACK CFI 80a4c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 80b10 x19: x19 x20: x20 +STACK CFI 80b14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80b18 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 80b1c x19: x19 x20: x20 +STACK CFI 80b20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80b24 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 80b48 x19: x19 x20: x20 +STACK CFI 80b4c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80b50 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 80bf4 18c .cfa: sp 0 + .ra: x30 +STACK CFI 80bf8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 80bfc .cfa: x29 48 + +STACK CFI 80c04 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 80cec x19: x19 x20: x20 +STACK CFI 80cf0 x21: x21 x22: x22 +STACK CFI 80cf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80cf8 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 80d80 44 .cfa: sp 0 + .ra: x30 +STACK CFI 80d84 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 80d8c .cfa: x29 32 + +STACK CFI 80d90 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 80da8 x19: x19 x20: x20 +STACK CFI 80dac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80db0 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 80dc4 4c .cfa: sp 0 + .ra: x30 +STACK CFI 80dc8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 80dd0 .cfa: x29 32 + +STACK CFI 80dd4 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 80df4 x19: x19 x20: x20 +STACK CFI 80df8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80dfc .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 80e10 44 .cfa: sp 0 + .ra: x30 +STACK CFI 80e14 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 80e1c .cfa: x29 32 + +STACK CFI 80e20 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 80e38 x19: x19 x20: x20 +STACK CFI 80e3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80e40 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 80e54 4c .cfa: sp 0 + .ra: x30 +STACK CFI 80e58 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 80e60 .cfa: x29 32 + +STACK CFI 80e64 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 80e84 x19: x19 x20: x20 +STACK CFI 80e88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80e8c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 80ea0 1a0 .cfa: sp 0 + .ra: x30 +STACK CFI 80ea4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 80ea8 .cfa: x29 48 + +STACK CFI 80eac x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 80eb4 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 80f9c x19: x19 x20: x20 +STACK CFI 80fa0 x21: x21 x22: x22 +STACK CFI 80fa4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 80fa8 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 81040 44 .cfa: sp 0 + .ra: x30 +STACK CFI 81044 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 8104c .cfa: x29 32 + +STACK CFI 81050 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 81068 x19: x19 x20: x20 +STACK CFI 8106c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 81070 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 81084 4c .cfa: sp 0 + .ra: x30 +STACK CFI 81088 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 81090 .cfa: x29 32 + +STACK CFI 81094 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 810b4 x19: x19 x20: x20 +STACK CFI 810b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 810bc .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 810d0 44 .cfa: sp 0 + .ra: x30 +STACK CFI 810d4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 810dc .cfa: x29 32 + +STACK CFI 810e0 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 810f8 x19: x19 x20: x20 +STACK CFI 810fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 81100 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 81114 4c .cfa: sp 0 + .ra: x30 +STACK CFI 81118 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 81120 .cfa: x29 32 + +STACK CFI 81124 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 81144 x19: x19 x20: x20 +STACK CFI 81148 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8114c .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 81160 e0 .cfa: sp 0 + .ra: x30 +STACK CFI 81164 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 81168 .cfa: x29 80 + +STACK CFI 8116c x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 81178 x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 811d8 x19: x19 x20: x20 +STACK CFI 811dc x21: x21 x22: x22 +STACK CFI 811e0 x23: x23 +STACK CFI 811e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 811e8 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 81240 810 .cfa: sp 0 + .ra: x30 +STACK CFI 81244 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8124c .cfa: x29 320 + +STACK CFI 81250 x21: .cfa -288 + ^ x22: .cfa -280 + ^ +STACK CFI 81264 x19: .cfa -304 + ^ x20: .cfa -296 + ^ x23: .cfa -272 + ^ +STACK CFI 81814 x21: x21 x22: x22 +STACK CFI 81818 x23: x23 +STACK CFI 81820 x19: x19 x20: x20 +STACK CFI 81824 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 81828 .cfa: x29 320 + .ra: .cfa -312 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x29: .cfa -320 + ^ +STACK CFI 818c4 x23: x23 +STACK CFI 818cc x21: x21 x22: x22 +STACK CFI 818d4 x19: x19 x20: x20 +STACK CFI 818d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 818dc .cfa: x29 320 + .ra: .cfa -312 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 81a50 94 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 81ae4 60 .cfa: sp 0 + .ra: x30 +STACK CFI 81ae8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 81aec .cfa: x29 48 + +STACK CFI 81af4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI 81b28 x19: x19 x20: x20 +STACK CFI 81b2c x21: x21 +STACK CFI 81b30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 81b34 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI 81b38 x19: x19 x20: x20 +STACK CFI 81b3c x21: x21 +STACK CFI 81b40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 81b44 8c .cfa: sp 0 + .ra: x30 +STACK CFI 81b48 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 81b4c .cfa: x29 32 + +STACK CFI 81b50 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 81b68 x19: x19 x20: x20 +STACK CFI 81b6c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 81b74 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 81bb0 x19: x19 x20: x20 +STACK CFI 81bb4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 81bbc .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 81bd0 214 .cfa: sp 0 + .ra: x30 +STACK CFI 81bd4 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 81bd8 .cfa: x29 160 + +STACK CFI 81be0 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 81bf0 x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ +STACK CFI 81bfc x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ +STACK CFI 81c28 x27: x27 +STACK CFI 81c2c x19: x19 x20: x20 +STACK CFI 81c30 x21: x21 x22: x22 +STACK CFI 81c34 x23: x23 x24: x24 +STACK CFI 81c38 x25: x25 x26: x26 +STACK CFI 81c3c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 81c40 .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ x29: .cfa -160 + ^ +STACK CFI 81d70 x27: x27 +STACK CFI 81d78 x19: x19 x20: x20 +STACK CFI 81d7c x21: x21 x22: x22 +STACK CFI 81d80 x23: x23 x24: x24 +STACK CFI 81d84 x25: x25 x26: x26 +STACK CFI 81d88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 81d8c .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ x29: .cfa -160 + ^ +STACK CFI INIT 81e30 214 .cfa: sp 0 + .ra: x30 +STACK CFI 81e34 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 81e38 .cfa: x29 160 + +STACK CFI 81e40 x19: .cfa -144 + ^ x20: .cfa -136 + ^ +STACK CFI 81e50 x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ +STACK CFI 81e5c x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ +STACK CFI 81e88 x27: x27 +STACK CFI 81e8c x19: x19 x20: x20 +STACK CFI 81e90 x21: x21 x22: x22 +STACK CFI 81e94 x23: x23 x24: x24 +STACK CFI 81e98 x25: x25 x26: x26 +STACK CFI 81e9c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 81ea0 .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ x29: .cfa -160 + ^ +STACK CFI 81fd0 x27: x27 +STACK CFI 81fd8 x19: x19 x20: x20 +STACK CFI 81fdc x21: x21 x22: x22 +STACK CFI 81fe0 x23: x23 x24: x24 +STACK CFI 81fe4 x25: x25 x26: x26 +STACK CFI 81fe8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 81fec .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ x29: .cfa -160 + ^ +STACK CFI INIT 82090 2c0 .cfa: sp 0 + .ra: x30 +STACK CFI 82094 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 82098 .cfa: x29 144 + +STACK CFI 820a4 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ +STACK CFI 820c0 x23: .cfa -96 + ^ x24: .cfa -88 + ^ x27: .cfa -64 + ^ +STACK CFI 8216c x27: x27 +STACK CFI 82170 x19: x19 x20: x20 +STACK CFI 82174 x21: x21 x22: x22 +STACK CFI 82178 x23: x23 x24: x24 +STACK CFI 8217c x25: x25 x26: x26 +STACK CFI 82180 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 82184 .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 82350 290 .cfa: sp 0 + .ra: x30 +STACK CFI 82354 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 82358 .cfa: x29 64 + +STACK CFI 8239c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 823a0 .cfa: x29 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 82460 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 82464 .cfa: x29 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 825e0 2bc .cfa: sp 0 + .ra: x30 +STACK CFI 825e4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 825e8 .cfa: x29 144 + +STACK CFI 825f4 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x27: .cfa -64 + ^ +STACK CFI 82610 x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ +STACK CFI 826bc x27: x27 +STACK CFI 826c0 x19: x19 x20: x20 +STACK CFI 826c4 x21: x21 x22: x22 +STACK CFI 826c8 x23: x23 x24: x24 +STACK CFI 826cc x25: x25 x26: x26 +STACK CFI 826d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 826d4 .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 8289c 274 .cfa: sp 0 + .ra: x30 +STACK CFI 828a0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 828a4 .cfa: x29 64 + +STACK CFI 828e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 828ec .cfa: x29 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 829a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 829a8 .cfa: x29 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 82b10 3e0 .cfa: sp 0 + .ra: x30 +STACK CFI 82b14 .cfa: sp 224 + .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 82b18 .cfa: x29 224 + +STACK CFI 82b1c x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 82b2c x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ +STACK CFI 82b40 x25: .cfa -160 + ^ x26: .cfa -152 + ^ +STACK CFI 82cdc x19: x19 x20: x20 +STACK CFI 82ce0 x21: x21 x22: x22 +STACK CFI 82ce4 x23: x23 x24: x24 +STACK CFI 82ce8 x25: x25 x26: x26 +STACK CFI 82cec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 82cf0 .cfa: x29 224 + .ra: .cfa -216 + ^ x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ x25: .cfa -160 + ^ x26: .cfa -152 + ^ x29: .cfa -224 + ^ +STACK CFI 82d98 x19: x19 x20: x20 +STACK CFI 82d9c x21: x21 x22: x22 +STACK CFI 82da0 x23: x23 x24: x24 +STACK CFI 82da4 x25: x25 x26: x26 +STACK CFI 82da8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 82dac .cfa: x29 224 + .ra: .cfa -216 + ^ x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ x25: .cfa -160 + ^ x26: .cfa -152 + ^ x29: .cfa -224 + ^ +STACK CFI INIT 82ef0 4c .cfa: sp 0 + .ra: x30 +STACK CFI 82ef4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 82efc .cfa: x29 16 + +STACK CFI 82f20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 82f24 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 82f38 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 82f3c 80 .cfa: sp 0 + .ra: x30 +STACK CFI 82f40 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 82f44 .cfa: x29 32 + +STACK CFI 82f48 x19: .cfa -16 + ^ +STACK CFI 82f8c x19: x19 +STACK CFI 82f90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 82f94 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 82fbc 3d8 .cfa: sp 0 + .ra: x30 +STACK CFI 82fc0 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 82fc4 .cfa: x29 128 + +STACK CFI 82fc8 x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 82fd8 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 82fec x25: .cfa -64 + ^ x26: .cfa -56 + ^ +STACK CFI 8315c x19: x19 x20: x20 +STACK CFI 83160 x21: x21 x22: x22 +STACK CFI 83164 x23: x23 x24: x24 +STACK CFI 83168 x25: x25 x26: x26 +STACK CFI 8316c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 83170 .cfa: x29 128 + .ra: .cfa -120 + ^ x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x29: .cfa -128 + ^ +STACK CFI 83240 x19: x19 x20: x20 +STACK CFI 83244 x21: x21 x22: x22 +STACK CFI 83248 x23: x23 x24: x24 +STACK CFI 8324c x25: x25 x26: x26 +STACK CFI 83250 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 83254 .cfa: x29 128 + .ra: .cfa -120 + ^ x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x29: .cfa -128 + ^ +STACK CFI INIT 83394 50 .cfa: sp 0 + .ra: x30 +STACK CFI 83398 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 833a4 .cfa: x29 16 + +STACK CFI 833c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 833cc .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 833e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 833e4 8c .cfa: sp 0 + .ra: x30 +STACK CFI 833e8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 833f0 .cfa: x29 32 + +STACK CFI 833f8 x19: .cfa -16 + ^ +STACK CFI 8342c x19: x19 +STACK CFI 83430 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 83434 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 83468 x19: x19 +STACK CFI 8346c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 83470 c6c .cfa: sp 0 + .ra: x30 +STACK CFI 83474 .cfa: sp 848 + +STACK CFI 8347c .cfa: sp 1008 + .ra: .cfa -1000 + ^ x29: .cfa -1008 + ^ +STACK CFI 83480 .cfa: x29 1008 + +STACK CFI 83490 v10: .cfa -896 + ^ v11: .cfa -888 + ^ v14: .cfa -864 + ^ v15: .cfa -856 + ^ x19: .cfa -992 + ^ x20: .cfa -984 + ^ +STACK CFI 834bc v12: .cfa -880 + ^ v13: .cfa -872 + ^ v8: .cfa -912 + ^ v9: .cfa -904 + ^ x21: .cfa -976 + ^ x22: .cfa -968 + ^ x23: .cfa -960 + ^ x24: .cfa -952 + ^ x25: .cfa -944 + ^ x26: .cfa -936 + ^ x27: .cfa -928 + ^ x28: .cfa -920 + ^ +STACK CFI 836e4 x19: x19 x20: x20 +STACK CFI 836e8 v8: v8 v9: v9 +STACK CFI 836ec x21: x21 x22: x22 +STACK CFI 836f0 v10: v10 v11: v11 +STACK CFI 836f4 x23: x23 x24: x24 +STACK CFI 836f8 v12: v12 v13: v13 +STACK CFI 836fc x25: x25 x26: x26 +STACK CFI 83700 v14: v14 v15: v15 +STACK CFI 83704 x27: x27 x28: x28 +STACK CFI 83708 .cfa: sp 848 + .ra: .ra x29: x29 +STACK CFI 8370c .cfa: sp 688 + +STACK CFI 83710 .cfa: x29 1008 + .ra: .cfa -1000 + ^ v10: .cfa -896 + ^ v11: .cfa -888 + ^ v12: .cfa -880 + ^ v13: .cfa -872 + ^ v14: .cfa -864 + ^ v15: .cfa -856 + ^ v8: .cfa -912 + ^ v9: .cfa -904 + ^ x19: .cfa -992 + ^ x20: .cfa -984 + ^ x21: .cfa -976 + ^ x22: .cfa -968 + ^ x23: .cfa -960 + ^ x24: .cfa -952 + ^ x25: .cfa -944 + ^ x26: .cfa -936 + ^ x27: .cfa -928 + ^ x28: .cfa -920 + ^ x29: .cfa -1008 + ^ +STACK CFI INIT 840dc 34 .cfa: sp 0 + .ra: x30 +STACK CFI 840e0 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 840ec .cfa: x29 16 + +STACK CFI 8410c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 84110 c6c .cfa: sp 0 + .ra: x30 +STACK CFI 84114 .cfa: sp 848 + +STACK CFI 8411c .cfa: sp 1008 + .ra: .cfa -1000 + ^ x29: .cfa -1008 + ^ +STACK CFI 84120 .cfa: x29 1008 + +STACK CFI 84130 v10: .cfa -896 + ^ v11: .cfa -888 + ^ v14: .cfa -864 + ^ v15: .cfa -856 + ^ x19: .cfa -992 + ^ x20: .cfa -984 + ^ +STACK CFI 8415c v12: .cfa -880 + ^ v13: .cfa -872 + ^ v8: .cfa -912 + ^ v9: .cfa -904 + ^ x21: .cfa -976 + ^ x22: .cfa -968 + ^ x23: .cfa -960 + ^ x24: .cfa -952 + ^ x25: .cfa -944 + ^ x26: .cfa -936 + ^ x27: .cfa -928 + ^ x28: .cfa -920 + ^ +STACK CFI 84384 x19: x19 x20: x20 +STACK CFI 84388 v8: v8 v9: v9 +STACK CFI 8438c x21: x21 x22: x22 +STACK CFI 84390 v10: v10 v11: v11 +STACK CFI 84394 x23: x23 x24: x24 +STACK CFI 84398 v12: v12 v13: v13 +STACK CFI 8439c x25: x25 x26: x26 +STACK CFI 843a0 v14: v14 v15: v15 +STACK CFI 843a4 x27: x27 x28: x28 +STACK CFI 843a8 .cfa: sp 848 + .ra: .ra x29: x29 +STACK CFI 843ac .cfa: sp 688 + +STACK CFI 843b0 .cfa: x29 1008 + .ra: .cfa -1000 + ^ v10: .cfa -896 + ^ v11: .cfa -888 + ^ v12: .cfa -880 + ^ v13: .cfa -872 + ^ v14: .cfa -864 + ^ v15: .cfa -856 + ^ v8: .cfa -912 + ^ v9: .cfa -904 + ^ x19: .cfa -992 + ^ x20: .cfa -984 + ^ x21: .cfa -976 + ^ x22: .cfa -968 + ^ x23: .cfa -960 + ^ x24: .cfa -952 + ^ x25: .cfa -944 + ^ x26: .cfa -936 + ^ x27: .cfa -928 + ^ x28: .cfa -920 + ^ x29: .cfa -1008 + ^ +STACK CFI INIT 84d7c 138 .cfa: sp 0 + .ra: x30 +STACK CFI 84d80 .cfa: sp 592 + +STACK CFI 84d84 .cfa: sp 672 + .ra: .cfa -664 + ^ x29: .cfa -672 + ^ +STACK CFI 84d88 .cfa: x29 672 + +STACK CFI 84d8c x19: .cfa -656 + ^ x20: .cfa -648 + ^ +STACK CFI 84d9c x21: .cfa -640 + ^ x22: .cfa -632 + ^ x23: .cfa -624 + ^ x24: .cfa -616 + ^ +STACK CFI 84db8 x25: .cfa -608 + ^ x26: .cfa -600 + ^ +STACK CFI 84e60 x19: x19 x20: x20 +STACK CFI 84e64 x21: x21 x22: x22 +STACK CFI 84e68 x23: x23 x24: x24 +STACK CFI 84e6c x25: x25 x26: x26 +STACK CFI 84e70 .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 84e74 .cfa: sp 512 + +STACK CFI 84e78 .cfa: x29 672 + .ra: .cfa -664 + ^ x19: .cfa -656 + ^ x20: .cfa -648 + ^ x21: .cfa -640 + ^ x22: .cfa -632 + ^ x23: .cfa -624 + ^ x24: .cfa -616 + ^ x25: .cfa -608 + ^ x26: .cfa -600 + ^ x29: .cfa -672 + ^ +STACK CFI INIT 84eb4 38 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 84eec 1d4 .cfa: sp 0 + .ra: x30 +STACK CFI 84ef0 .cfa: sp 2208 + +STACK CFI 84ef4 .cfa: sp 2304 + .ra: .cfa -2296 + ^ x29: .cfa -2304 + ^ +STACK CFI 84ef8 .cfa: x29 2304 + +STACK CFI 84efc x21: .cfa -2272 + ^ x22: .cfa -2264 + ^ +STACK CFI 84f0c x25: .cfa -2240 + ^ x26: .cfa -2232 + ^ +STACK CFI 84f24 x19: .cfa -2288 + ^ x20: .cfa -2280 + ^ x23: .cfa -2256 + ^ x24: .cfa -2248 + ^ x27: .cfa -2224 + ^ x28: .cfa -2216 + ^ +STACK CFI 8506c x21: x21 x22: x22 +STACK CFI 85070 x19: x19 x20: x20 +STACK CFI 85074 x23: x23 x24: x24 +STACK CFI 85078 x25: x25 x26: x26 +STACK CFI 8507c x27: x27 x28: x28 +STACK CFI 85080 .cfa: sp 2208 + .ra: .ra x29: x29 +STACK CFI 85084 .cfa: sp 2112 + +STACK CFI 85088 .cfa: x29 2304 + .ra: .cfa -2296 + ^ x19: .cfa -2288 + ^ x20: .cfa -2280 + ^ x21: .cfa -2272 + ^ x22: .cfa -2264 + ^ x23: .cfa -2256 + ^ x24: .cfa -2248 + ^ x25: .cfa -2240 + ^ x26: .cfa -2232 + ^ x27: .cfa -2224 + ^ x28: .cfa -2216 + ^ x29: .cfa -2304 + ^ +STACK CFI INIT 850c0 c68 .cfa: sp 0 + .ra: x30 +STACK CFI 850c4 .cfa: sp 2672 + +STACK CFI 850cc .cfa: sp 2832 + .ra: .cfa -2824 + ^ x29: .cfa -2832 + ^ +STACK CFI 850d0 .cfa: x29 2832 + +STACK CFI 850d8 v10: .cfa -2720 + ^ v11: .cfa -2712 + ^ x23: .cfa -2784 + ^ x24: .cfa -2776 + ^ +STACK CFI 850e8 v14: .cfa -2688 + ^ v15: .cfa -2680 + ^ +STACK CFI 850fc v12: .cfa -2704 + ^ v13: .cfa -2696 + ^ v8: .cfa -2736 + ^ v9: .cfa -2728 + ^ x19: .cfa -2816 + ^ x20: .cfa -2808 + ^ +STACK CFI 85114 x21: .cfa -2800 + ^ x22: .cfa -2792 + ^ x25: .cfa -2768 + ^ x26: .cfa -2760 + ^ +STACK CFI 85120 x27: .cfa -2752 + ^ x28: .cfa -2744 + ^ +STACK CFI 85584 x19: x19 x20: x20 +STACK CFI 85588 v8: v8 v9: v9 +STACK CFI 8558c x21: x21 x22: x22 +STACK CFI 85590 v10: v10 v11: v11 +STACK CFI 85594 x23: x23 x24: x24 +STACK CFI 85598 v12: v12 v13: v13 +STACK CFI 8559c x25: x25 x26: x26 +STACK CFI 855a0 v14: v14 v15: v15 +STACK CFI 855a4 x27: x27 x28: x28 +STACK CFI 855a8 .cfa: sp 2672 + .ra: .ra x29: x29 +STACK CFI 855ac .cfa: sp 2512 + +STACK CFI 855b0 .cfa: x29 2832 + .ra: .cfa -2824 + ^ v10: .cfa -2720 + ^ v11: .cfa -2712 + ^ v12: .cfa -2704 + ^ v13: .cfa -2696 + ^ v14: .cfa -2688 + ^ v15: .cfa -2680 + ^ v8: .cfa -2736 + ^ v9: .cfa -2728 + ^ x19: .cfa -2816 + ^ x20: .cfa -2808 + ^ x21: .cfa -2800 + ^ x22: .cfa -2792 + ^ x23: .cfa -2784 + ^ x24: .cfa -2776 + ^ x25: .cfa -2768 + ^ x26: .cfa -2760 + ^ x27: .cfa -2752 + ^ x28: .cfa -2744 + ^ x29: .cfa -2832 + ^ +STACK CFI INIT 85d28 34 .cfa: sp 0 + .ra: x30 +STACK CFI 85d2c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 85d38 .cfa: x29 16 + +STACK CFI 85d58 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 85d5c c68 .cfa: sp 0 + .ra: x30 +STACK CFI 85d60 .cfa: sp 2672 + +STACK CFI 85d68 .cfa: sp 2832 + .ra: .cfa -2824 + ^ x29: .cfa -2832 + ^ +STACK CFI 85d6c .cfa: x29 2832 + +STACK CFI 85d74 v10: .cfa -2720 + ^ v11: .cfa -2712 + ^ x23: .cfa -2784 + ^ x24: .cfa -2776 + ^ +STACK CFI 85d84 v14: .cfa -2688 + ^ v15: .cfa -2680 + ^ +STACK CFI 85d98 v12: .cfa -2704 + ^ v13: .cfa -2696 + ^ v8: .cfa -2736 + ^ v9: .cfa -2728 + ^ x19: .cfa -2816 + ^ x20: .cfa -2808 + ^ +STACK CFI 85db0 x21: .cfa -2800 + ^ x22: .cfa -2792 + ^ x25: .cfa -2768 + ^ x26: .cfa -2760 + ^ +STACK CFI 85dbc x27: .cfa -2752 + ^ x28: .cfa -2744 + ^ +STACK CFI 86220 x19: x19 x20: x20 +STACK CFI 86224 v8: v8 v9: v9 +STACK CFI 86228 x21: x21 x22: x22 +STACK CFI 8622c v10: v10 v11: v11 +STACK CFI 86230 x23: x23 x24: x24 +STACK CFI 86234 v12: v12 v13: v13 +STACK CFI 86238 x25: x25 x26: x26 +STACK CFI 8623c v14: v14 v15: v15 +STACK CFI 86240 x27: x27 x28: x28 +STACK CFI 86244 .cfa: sp 2672 + .ra: .ra x29: x29 +STACK CFI 86248 .cfa: sp 2512 + +STACK CFI 8624c .cfa: x29 2832 + .ra: .cfa -2824 + ^ v10: .cfa -2720 + ^ v11: .cfa -2712 + ^ v12: .cfa -2704 + ^ v13: .cfa -2696 + ^ v14: .cfa -2688 + ^ v15: .cfa -2680 + ^ v8: .cfa -2736 + ^ v9: .cfa -2728 + ^ x19: .cfa -2816 + ^ x20: .cfa -2808 + ^ x21: .cfa -2800 + ^ x22: .cfa -2792 + ^ x23: .cfa -2784 + ^ x24: .cfa -2776 + ^ x25: .cfa -2768 + ^ x26: .cfa -2760 + ^ x27: .cfa -2752 + ^ x28: .cfa -2744 + ^ x29: .cfa -2832 + ^ +STACK CFI INIT 869c4 214 .cfa: sp 0 + .ra: x30 +STACK CFI 869c8 .cfa: sp 2496 + +STACK CFI 869cc .cfa: sp 2592 + .ra: .cfa -2584 + ^ x29: .cfa -2592 + ^ +STACK CFI 869d0 .cfa: x29 2592 + +STACK CFI 869d4 x19: .cfa -2576 + ^ x20: .cfa -2568 + ^ +STACK CFI 869e4 x21: .cfa -2560 + ^ x22: .cfa -2552 + ^ x23: .cfa -2544 + ^ x24: .cfa -2536 + ^ +STACK CFI 86a00 x25: .cfa -2528 + ^ x26: .cfa -2520 + ^ +STACK CFI 86a14 x27: .cfa -2512 + ^ x28: .cfa -2504 + ^ +STACK CFI 86b58 x19: x19 x20: x20 +STACK CFI 86b5c x21: x21 x22: x22 +STACK CFI 86b60 x23: x23 x24: x24 +STACK CFI 86b64 x25: x25 x26: x26 +STACK CFI 86b68 x27: x27 x28: x28 +STACK CFI 86b6c .cfa: sp 2496 + .ra: .ra x29: x29 +STACK CFI 86b70 .cfa: sp 2400 + +STACK CFI 86b74 .cfa: x29 2592 + .ra: .cfa -2584 + ^ x19: .cfa -2576 + ^ x20: .cfa -2568 + ^ x21: .cfa -2560 + ^ x22: .cfa -2552 + ^ x23: .cfa -2544 + ^ x24: .cfa -2536 + ^ x25: .cfa -2528 + ^ x26: .cfa -2520 + ^ x27: .cfa -2512 + ^ x28: .cfa -2504 + ^ x29: .cfa -2592 + ^ +STACK CFI INIT 86bd8 278 .cfa: sp 0 + .ra: x30 +STACK CFI 86bdc .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 86be0 .cfa: x29 128 + +STACK CFI 86be4 x19: .cfa -112 + ^ x20: .cfa -104 + ^ +STACK CFI 86bf8 v8: .cfa -32 + ^ +STACK CFI 86c0c x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 86c90 x19: x19 x20: x20 +STACK CFI 86c94 x21: x21 x22: x22 +STACK CFI 86c98 x23: x23 x24: x24 +STACK CFI 86c9c x25: x25 x26: x26 +STACK CFI 86ca0 x27: x27 x28: x28 +STACK CFI 86ca4 v8: v8 +STACK CFI 86ca8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 86cac .cfa: x29 128 + .ra: .cfa -120 + ^ v8: .cfa -32 + ^ x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ x29: .cfa -128 + ^ +STACK CFI INIT 86e50 26c .cfa: sp 0 + .ra: x30 +STACK CFI 86e54 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 86e58 .cfa: x29 128 + +STACK CFI 86e5c x19: .cfa -112 + ^ x20: .cfa -104 + ^ +STACK CFI 86e70 v8: .cfa -32 + ^ +STACK CFI 86e80 x21: .cfa -96 + ^ x22: .cfa -88 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 86e8c x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 86f0c x19: x19 x20: x20 +STACK CFI 86f10 x21: x21 x22: x22 +STACK CFI 86f14 x23: x23 x24: x24 +STACK CFI 86f18 x25: x25 x26: x26 +STACK CFI 86f1c x27: x27 x28: x28 +STACK CFI 86f20 v8: v8 +STACK CFI 86f24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 86f28 .cfa: x29 128 + .ra: .cfa -120 + ^ v8: .cfa -32 + ^ x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ x29: .cfa -128 + ^ +STACK CFI INIT 870bc 138 .cfa: sp 0 + .ra: x30 +STACK CFI 870c0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 870c4 .cfa: x29 48 + +STACK CFI 870c8 x19: .cfa -32 + ^ +STACK CFI 870f8 x19: x19 +STACK CFI 87104 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 87108 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 8713c x19: x19 +STACK CFI 87148 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8714c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 871f4 290 .cfa: sp 0 + .ra: x30 +STACK CFI 871f8 .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 87200 .cfa: x29 176 + +STACK CFI 87204 v10: .cfa -64 + ^ v11: .cfa -56 + ^ +STACK CFI 87224 v8: .cfa -80 + ^ v9: .cfa -72 + ^ +STACK CFI 87230 x23: .cfa -128 + ^ x24: .cfa -120 + ^ x27: .cfa -96 + ^ x28: .cfa -88 + ^ +STACK CFI 87264 x21: .cfa -144 + ^ x22: .cfa -136 + ^ x25: .cfa -112 + ^ x26: .cfa -104 + ^ +STACK CFI 87270 x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 87340 v10: v10 v11: v11 +STACK CFI 87344 x19: x19 x20: x20 +STACK CFI 87348 v8: v8 v9: v9 +STACK CFI 8734c x21: x21 x22: x22 +STACK CFI 87350 x23: x23 x24: x24 +STACK CFI 87354 x25: x25 x26: x26 +STACK CFI 87358 x27: x27 x28: x28 +STACK CFI 8735c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 87360 .cfa: x29 176 + .ra: .cfa -168 + ^ v10: .cfa -64 + ^ v11: .cfa -56 + ^ v8: .cfa -80 + ^ v9: .cfa -72 + ^ x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ x24: .cfa -120 + ^ x25: .cfa -112 + ^ x26: .cfa -104 + ^ x27: .cfa -96 + ^ x28: .cfa -88 + ^ x29: .cfa -176 + ^ +STACK CFI INIT 87484 178 .cfa: sp 0 + .ra: x30 +STACK CFI 87488 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 87490 .cfa: x29 80 + +STACK CFI 87498 x19: .cfa -64 + ^ +STACK CFI 874f0 x19: x19 +STACK CFI 874f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 874f8 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x29: .cfa -80 + ^ +STACK CFI 87544 x19: x19 +STACK CFI 87548 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8754c .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 875fc 188 .cfa: sp 0 + .ra: x30 +STACK CFI 87600 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 87608 .cfa: x29 80 + +STACK CFI 87610 x19: .cfa -64 + ^ +STACK CFI 87678 x19: x19 +STACK CFI 8767c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 87680 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x29: .cfa -80 + ^ +STACK CFI 876cc x19: x19 +STACK CFI 876d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 876d4 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 87784 4c4 .cfa: sp 0 + .ra: x30 +STACK CFI 87788 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 8778c .cfa: x29 144 + +STACK CFI 87790 x19: .cfa -128 + ^ x20: .cfa -120 + ^ +STACK CFI 877ac x21: .cfa -112 + ^ x22: .cfa -104 + ^ +STACK CFI 877bc x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI 878b0 x19: x19 x20: x20 +STACK CFI 878b4 x21: x21 x22: x22 +STACK CFI 878b8 x23: x23 x24: x24 +STACK CFI 878bc x25: x25 x26: x26 +STACK CFI 878c0 x27: x27 x28: x28 +STACK CFI 878c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 878c8 .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 87c48 1c0 .cfa: sp 0 + .ra: x30 +STACK CFI 87c4c .cfa: sp 128 + +STACK CFI 87c54 .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 87c58 .cfa: x29 96 + +STACK CFI 87c5c x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 87c68 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 87c80 x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 87cb0 x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x28: .cfa -8 + ^ +STACK CFI 87d08 .cfa: sp 128 + +STACK CFI 87d20 x19: x19 x20: x20 +STACK CFI 87d24 x21: x21 x22: x22 +STACK CFI 87d28 x23: x23 x24: x24 +STACK CFI 87d2c x25: x25 x26: x26 +STACK CFI 87d30 x27: x27 x28: x28 +STACK CFI 87d34 .ra: .ra x29: x29 +STACK CFI 87d38 .cfa: sp 0 + +STACK CFI 87d3c .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x28: .cfa -8 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 87e08 1b8 .cfa: sp 0 + .ra: x30 +STACK CFI 87e0c .cfa: sp 128 + +STACK CFI 87e14 .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 87e18 .cfa: x29 96 + +STACK CFI 87e1c x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 87e28 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 87e40 x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 87e70 x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x28: .cfa -8 + ^ +STACK CFI 87ec8 .cfa: sp 128 + +STACK CFI 87ee0 x19: x19 x20: x20 +STACK CFI 87ee4 x21: x21 x22: x22 +STACK CFI 87ee8 x23: x23 x24: x24 +STACK CFI 87eec x25: x25 x26: x26 +STACK CFI 87ef0 x27: x27 x28: x28 +STACK CFI 87ef4 .ra: .ra x29: x29 +STACK CFI 87ef8 .cfa: sp 0 + +STACK CFI 87efc .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x28: .cfa -8 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 87fc0 498 .cfa: sp 0 + .ra: x30 +STACK CFI 87fc4 .cfa: sp 416 + .ra: .cfa -408 + ^ x29: .cfa -416 + ^ +STACK CFI 87fc8 .cfa: x29 416 + +STACK CFI 87fd4 v10: .cfa -304 + ^ v8: .cfa -320 + ^ v9: .cfa -312 + ^ +STACK CFI 87fe8 x19: .cfa -400 + ^ x20: .cfa -392 + ^ x21: .cfa -384 + ^ x22: .cfa -376 + ^ +STACK CFI 88008 x23: .cfa -368 + ^ x24: .cfa -360 + ^ x25: .cfa -352 + ^ x26: .cfa -344 + ^ x27: .cfa -336 + ^ x28: .cfa -328 + ^ +STACK CFI 881a4 x19: x19 x20: x20 +STACK CFI 881a8 v8: v8 v9: v9 +STACK CFI 881ac x21: x21 x22: x22 +STACK CFI 881b0 x23: x23 x24: x24 +STACK CFI 881b4 x25: x25 x26: x26 +STACK CFI 881b8 x27: x27 x28: x28 +STACK CFI 881bc v10: v10 +STACK CFI 881c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 881c4 .cfa: x29 416 + .ra: .cfa -408 + ^ v10: .cfa -304 + ^ v8: .cfa -320 + ^ v9: .cfa -312 + ^ x19: .cfa -400 + ^ x20: .cfa -392 + ^ x21: .cfa -384 + ^ x22: .cfa -376 + ^ x23: .cfa -368 + ^ x24: .cfa -360 + ^ x25: .cfa -352 + ^ x26: .cfa -344 + ^ x27: .cfa -336 + ^ x28: .cfa -328 + ^ x29: .cfa -416 + ^ +STACK CFI INIT 88458 130 .cfa: sp 0 + .ra: x30 +STACK CFI 8845c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 88460 .cfa: x29 48 + +STACK CFI 88464 x19: .cfa -32 + ^ +STACK CFI 88494 x19: x19 +STACK CFI 884a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 884a4 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 884d0 x19: x19 +STACK CFI 884dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 884e0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 88588 268 .cfa: sp 0 + .ra: x30 +STACK CFI 8858c .cfa: sp 176 + .ra: .cfa -168 + ^ x29: .cfa -176 + ^ +STACK CFI 88594 .cfa: x29 176 + +STACK CFI 8859c v10: .cfa -64 + ^ v11: .cfa -56 + ^ x23: .cfa -128 + ^ x24: .cfa -120 + ^ +STACK CFI 885b4 v8: .cfa -80 + ^ v9: .cfa -72 + ^ x25: .cfa -112 + ^ x26: .cfa -104 + ^ +STACK CFI 885e8 x21: .cfa -144 + ^ x22: .cfa -136 + ^ x27: .cfa -96 + ^ x28: .cfa -88 + ^ +STACK CFI 885f4 x19: .cfa -160 + ^ x20: .cfa -152 + ^ +STACK CFI 886c0 v10: v10 v11: v11 +STACK CFI 886c4 x19: x19 x20: x20 +STACK CFI 886c8 v8: v8 v9: v9 +STACK CFI 886cc x21: x21 x22: x22 +STACK CFI 886d0 x23: x23 x24: x24 +STACK CFI 886d4 x25: x25 x26: x26 +STACK CFI 886d8 x27: x27 x28: x28 +STACK CFI 886dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 886e0 .cfa: x29 176 + .ra: .cfa -168 + ^ v10: .cfa -64 + ^ v11: .cfa -56 + ^ v8: .cfa -80 + ^ v9: .cfa -72 + ^ x19: .cfa -160 + ^ x20: .cfa -152 + ^ x21: .cfa -144 + ^ x22: .cfa -136 + ^ x23: .cfa -128 + ^ x24: .cfa -120 + ^ x25: .cfa -112 + ^ x26: .cfa -104 + ^ x27: .cfa -96 + ^ x28: .cfa -88 + ^ x29: .cfa -176 + ^ +STACK CFI INIT 887f0 160 .cfa: sp 0 + .ra: x30 +STACK CFI 887f4 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 887fc .cfa: x29 80 + +STACK CFI 88804 x19: .cfa -64 + ^ +STACK CFI 88858 x19: x19 +STACK CFI 8885c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 88860 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x29: .cfa -80 + ^ +STACK CFI 888ac x19: x19 +STACK CFI 888b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 888b4 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 88950 174 .cfa: sp 0 + .ra: x30 +STACK CFI 88954 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8895c .cfa: x29 80 + +STACK CFI 88964 x19: .cfa -64 + ^ +STACK CFI 889cc x19: x19 +STACK CFI 889d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 889d4 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x29: .cfa -80 + ^ +STACK CFI 88a20 x19: x19 +STACK CFI 88a24 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 88a28 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 88ac4 4b4 .cfa: sp 0 + .ra: x30 +STACK CFI 88ac8 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 88acc .cfa: x29 144 + +STACK CFI 88ad0 x19: .cfa -128 + ^ x20: .cfa -120 + ^ +STACK CFI 88aec x21: .cfa -112 + ^ x22: .cfa -104 + ^ +STACK CFI 88afc x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI 88be8 x19: x19 x20: x20 +STACK CFI 88bec x21: x21 x22: x22 +STACK CFI 88bf0 x23: x23 x24: x24 +STACK CFI 88bf4 x25: x25 x26: x26 +STACK CFI 88bf8 x27: x27 x28: x28 +STACK CFI 88bfc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 88c00 .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 88f78 1ac .cfa: sp 0 + .ra: x30 +STACK CFI 88f7c .cfa: sp 128 + +STACK CFI 88f84 .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 88f88 .cfa: x29 96 + +STACK CFI 88f8c x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 88f98 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 88fb4 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 88fe4 x27: .cfa -16 + ^ x28: .cfa -8 + ^ +STACK CFI 8903c .cfa: sp 128 + +STACK CFI 89054 x19: x19 x20: x20 +STACK CFI 89058 x21: x21 x22: x22 +STACK CFI 8905c x23: x23 x24: x24 +STACK CFI 89060 x25: x25 x26: x26 +STACK CFI 89064 x27: x27 x28: x28 +STACK CFI 89068 .ra: .ra x29: x29 +STACK CFI 8906c .cfa: sp 0 + +STACK CFI 89070 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x28: .cfa -8 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 89124 1a4 .cfa: sp 0 + .ra: x30 +STACK CFI 89128 .cfa: sp 128 + +STACK CFI 89130 .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 89134 .cfa: x29 96 + +STACK CFI 89138 x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 89144 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 8915c x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 89190 x27: .cfa -16 + ^ x28: .cfa -8 + ^ +STACK CFI 891e8 .cfa: sp 128 + +STACK CFI 89200 x19: x19 x20: x20 +STACK CFI 89204 x21: x21 x22: x22 +STACK CFI 89208 x23: x23 x24: x24 +STACK CFI 8920c x25: x25 x26: x26 +STACK CFI 89210 x27: x27 x28: x28 +STACK CFI 89214 .ra: .ra x29: x29 +STACK CFI 89218 .cfa: sp 0 + +STACK CFI 8921c .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x28: .cfa -8 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 892c8 450 .cfa: sp 0 + .ra: x30 +STACK CFI 892cc .cfa: sp 208 + .ra: .cfa -200 + ^ x29: .cfa -208 + ^ +STACK CFI 892d0 .cfa: x29 208 + +STACK CFI 892d4 v8: .cfa -112 + ^ v9: .cfa -104 + ^ +STACK CFI 892e0 x25: .cfa -144 + ^ x26: .cfa -136 + ^ +STACK CFI 892ec x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ +STACK CFI 89304 x23: .cfa -160 + ^ x24: .cfa -152 + ^ x27: .cfa -128 + ^ x28: .cfa -120 + ^ +STACK CFI 89484 x19: x19 x20: x20 +STACK CFI 89488 v8: v8 v9: v9 +STACK CFI 8948c x21: x21 x22: x22 +STACK CFI 89490 x23: x23 x24: x24 +STACK CFI 89494 x25: x25 x26: x26 +STACK CFI 89498 x27: x27 x28: x28 +STACK CFI 8949c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 894a0 .cfa: x29 208 + .ra: .cfa -200 + ^ v8: .cfa -112 + ^ v9: .cfa -104 + ^ x19: .cfa -192 + ^ x20: .cfa -184 + ^ x21: .cfa -176 + ^ x22: .cfa -168 + ^ x23: .cfa -160 + ^ x24: .cfa -152 + ^ x25: .cfa -144 + ^ x26: .cfa -136 + ^ x27: .cfa -128 + ^ x28: .cfa -120 + ^ x29: .cfa -208 + ^ +STACK CFI INIT 89718 15c .cfa: sp 0 + .ra: x30 +STACK CFI 8971c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 89720 .cfa: x29 48 + +STACK CFI 89724 x19: .cfa -32 + ^ +STACK CFI 89750 x19: x19 +STACK CFI 89754 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 89758 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 89844 x19: x19 +STACK CFI 89848 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8984c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 89874 4e0 .cfa: sp 0 + .ra: x30 +STACK CFI 89878 .cfa: sp 2224 + +STACK CFI 8987c .cfa: sp 2336 + .ra: .cfa -2328 + ^ x29: .cfa -2336 + ^ +STACK CFI 89880 .cfa: x29 2336 + +STACK CFI 89884 v8: .cfa -2240 + ^ +STACK CFI 8988c x21: .cfa -2304 + ^ x22: .cfa -2296 + ^ +STACK CFI 8989c x23: .cfa -2288 + ^ x24: .cfa -2280 + ^ +STACK CFI 898b8 x19: .cfa -2320 + ^ x20: .cfa -2312 + ^ x25: .cfa -2272 + ^ x26: .cfa -2264 + ^ x27: .cfa -2256 + ^ x28: .cfa -2248 + ^ +STACK CFI 89b64 x21: x21 x22: x22 +STACK CFI 89b68 x19: x19 x20: x20 +STACK CFI 89b6c x23: x23 x24: x24 +STACK CFI 89b70 x25: x25 x26: x26 +STACK CFI 89b74 x27: x27 x28: x28 +STACK CFI 89b78 v8: v8 +STACK CFI 89b7c .cfa: sp 2224 + .ra: .ra x29: x29 +STACK CFI 89b80 .cfa: sp 2112 + +STACK CFI 89b84 .cfa: x29 2336 + .ra: .cfa -2328 + ^ v8: .cfa -2240 + ^ x19: .cfa -2320 + ^ x20: .cfa -2312 + ^ x21: .cfa -2304 + ^ x22: .cfa -2296 + ^ x23: .cfa -2288 + ^ x24: .cfa -2280 + ^ x25: .cfa -2272 + ^ x26: .cfa -2264 + ^ x27: .cfa -2256 + ^ x28: .cfa -2248 + ^ x29: .cfa -2336 + ^ +STACK CFI INIT 89d54 220 .cfa: sp 0 + .ra: x30 +STACK CFI 89d58 .cfa: sp 592 + +STACK CFI 89d5c .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 89d60 .cfa: x29 688 + +STACK CFI 89d64 x19: .cfa -672 + ^ x20: .cfa -664 + ^ +STACK CFI 89d78 x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 89d8c x27: .cfa -608 + ^ x28: .cfa -600 + ^ +STACK CFI 89ecc .cfa: sp 688 + +STACK CFI 89ed8 x19: x19 x20: x20 +STACK CFI 89edc x21: x21 x22: x22 +STACK CFI 89ee0 x23: x23 x24: x24 +STACK CFI 89ee4 x25: x25 x26: x26 +STACK CFI 89ee8 x27: x27 x28: x28 +STACK CFI 89eec .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 89ef0 .cfa: sp 496 + +STACK CFI 89ef4 .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x28: .cfa -600 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 89f74 24 .cfa: sp 0 + .ra: x30 +STACK CFI 89f78 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 89f84 .cfa: x29 16 + +STACK CFI 89f94 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 89f98 220 .cfa: sp 0 + .ra: x30 +STACK CFI 89f9c .cfa: sp 592 + +STACK CFI 89fa0 .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 89fa4 .cfa: x29 688 + +STACK CFI 89fa8 x19: .cfa -672 + ^ x20: .cfa -664 + ^ +STACK CFI 89fbc x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 89fd0 x27: .cfa -608 + ^ x28: .cfa -600 + ^ +STACK CFI 8a110 .cfa: sp 688 + +STACK CFI 8a11c x19: x19 x20: x20 +STACK CFI 8a120 x21: x21 x22: x22 +STACK CFI 8a124 x23: x23 x24: x24 +STACK CFI 8a128 x25: x25 x26: x26 +STACK CFI 8a12c x27: x27 x28: x28 +STACK CFI 8a130 .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 8a134 .cfa: sp 496 + +STACK CFI 8a138 .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x28: .cfa -600 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 8a1b8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 8a1bc .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 8a1c8 .cfa: x29 16 + +STACK CFI 8a1d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8a1dc 15c .cfa: sp 0 + .ra: x30 +STACK CFI 8a1e0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8a1e4 .cfa: x29 48 + +STACK CFI 8a1e8 x19: .cfa -32 + ^ +STACK CFI 8a214 x19: x19 +STACK CFI 8a218 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8a21c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 8a308 x19: x19 +STACK CFI 8a30c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8a310 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 8a338 3e8 .cfa: sp 0 + .ra: x30 +STACK CFI 8a33c .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8a340 .cfa: x29 96 + +STACK CFI 8a348 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 8a408 x19: x19 x20: x20 +STACK CFI 8a40c x21: x21 x22: x22 +STACK CFI 8a410 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8a414 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x29: .cfa -96 + ^ +STACK CFI 8a4c0 x19: x19 x20: x20 +STACK CFI 8a4c4 x21: x21 x22: x22 +STACK CFI 8a4c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8a4cc .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x29: .cfa -96 + ^ +STACK CFI 8a580 x19: x19 x20: x20 +STACK CFI 8a584 x21: x21 x22: x22 +STACK CFI 8a588 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8a58c .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x29: .cfa -96 + ^ +STACK CFI 8a5f8 x19: x19 x20: x20 +STACK CFI 8a5fc x21: x21 x22: x22 +STACK CFI 8a600 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8a604 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x29: .cfa -96 + ^ +STACK CFI 8a638 x19: x19 x20: x20 +STACK CFI 8a63c x21: x21 x22: x22 +STACK CFI 8a640 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8a644 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 8a720 5e0 .cfa: sp 0 + .ra: x30 +STACK CFI 8a724 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8a728 .cfa: x29 320 + +STACK CFI 8a72c v8: .cfa -224 + ^ v9: .cfa -216 + ^ +STACK CFI 8a734 v14: .cfa -176 + ^ v15: .cfa -168 + ^ +STACK CFI 8a740 v10: .cfa -208 + ^ v11: .cfa -200 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 8a74c v12: .cfa -192 + ^ v13: .cfa -184 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 8a768 x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ +STACK CFI 8a828 x19: x19 x20: x20 +STACK CFI 8a82c v8: v8 v9: v9 +STACK CFI 8a830 x21: x21 x22: x22 +STACK CFI 8a834 v10: v10 v11: v11 +STACK CFI 8a838 x23: x23 x24: x24 +STACK CFI 8a83c v12: v12 v13: v13 +STACK CFI 8a840 x25: x25 x26: x26 +STACK CFI 8a844 v14: v14 v15: v15 +STACK CFI 8a848 x27: x27 x28: x28 +STACK CFI 8a84c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8a850 .cfa: x29 320 + .ra: .cfa -312 + ^ v10: .cfa -208 + ^ v11: .cfa -200 + ^ v12: .cfa -192 + ^ v13: .cfa -184 + ^ v14: .cfa -176 + ^ v15: .cfa -168 + ^ v8: .cfa -224 + ^ v9: .cfa -216 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 8ad00 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8ad04 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8ad08 .cfa: x29 48 + +STACK CFI 8ad30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8ad34 54 .cfa: sp 0 + .ra: x30 +STACK CFI 8ad38 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8ad3c .cfa: x29 80 + +STACK CFI 8ad84 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8ad88 5f8 .cfa: sp 0 + .ra: x30 +STACK CFI 8ad8c .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8ad90 .cfa: x29 320 + +STACK CFI 8ad94 v10: .cfa -208 + ^ v11: .cfa -200 + ^ +STACK CFI 8ad9c v12: .cfa -192 + ^ v13: .cfa -184 + ^ +STACK CFI 8ada8 v8: .cfa -224 + ^ v9: .cfa -216 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 8adb4 v14: .cfa -176 + ^ v15: .cfa -168 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 8add0 x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ +STACK CFI 8ae8c x19: x19 x20: x20 +STACK CFI 8ae90 v8: v8 v9: v9 +STACK CFI 8ae94 x21: x21 x22: x22 +STACK CFI 8ae98 v10: v10 v11: v11 +STACK CFI 8ae9c x23: x23 x24: x24 +STACK CFI 8aea0 v12: v12 v13: v13 +STACK CFI 8aea4 x25: x25 x26: x26 +STACK CFI 8aea8 v14: v14 v15: v15 +STACK CFI 8aeac x27: x27 x28: x28 +STACK CFI 8aeb0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8aeb4 .cfa: x29 320 + .ra: .cfa -312 + ^ v10: .cfa -208 + ^ v11: .cfa -200 + ^ v12: .cfa -192 + ^ v13: .cfa -184 + ^ v14: .cfa -176 + ^ v15: .cfa -168 + ^ v8: .cfa -224 + ^ v9: .cfa -216 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 8b380 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8b384 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8b388 .cfa: x29 48 + +STACK CFI 8b3b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8b3b4 5e0 .cfa: sp 0 + .ra: x30 +STACK CFI 8b3b8 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8b3bc .cfa: x29 320 + +STACK CFI 8b3c0 v8: .cfa -224 + ^ v9: .cfa -216 + ^ +STACK CFI 8b3c8 v14: .cfa -176 + ^ v15: .cfa -168 + ^ +STACK CFI 8b3d4 v10: .cfa -208 + ^ v11: .cfa -200 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 8b3e0 v12: .cfa -192 + ^ v13: .cfa -184 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 8b3fc x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ +STACK CFI 8b4bc x19: x19 x20: x20 +STACK CFI 8b4c0 v8: v8 v9: v9 +STACK CFI 8b4c4 x21: x21 x22: x22 +STACK CFI 8b4c8 v10: v10 v11: v11 +STACK CFI 8b4cc x23: x23 x24: x24 +STACK CFI 8b4d0 v12: v12 v13: v13 +STACK CFI 8b4d4 x25: x25 x26: x26 +STACK CFI 8b4d8 v14: v14 v15: v15 +STACK CFI 8b4dc x27: x27 x28: x28 +STACK CFI 8b4e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8b4e4 .cfa: x29 320 + .ra: .cfa -312 + ^ v10: .cfa -208 + ^ v11: .cfa -200 + ^ v12: .cfa -192 + ^ v13: .cfa -184 + ^ v14: .cfa -176 + ^ v15: .cfa -168 + ^ v8: .cfa -224 + ^ v9: .cfa -216 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 8b994 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8b998 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8b99c .cfa: x29 48 + +STACK CFI 8b9c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8b9c8 5d0 .cfa: sp 0 + .ra: x30 +STACK CFI 8b9cc .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 8b9d0 .cfa: x29 304 + +STACK CFI 8b9d4 v10: .cfa -192 + ^ v11: .cfa -184 + ^ +STACK CFI 8b9dc v12: .cfa -176 + ^ v13: .cfa -168 + ^ +STACK CFI 8b9e8 v8: .cfa -208 + ^ v9: .cfa -200 + ^ x25: .cfa -240 + ^ x26: .cfa -232 + ^ +STACK CFI 8b9f4 v14: .cfa -160 + ^ v15: .cfa -152 + ^ x19: .cfa -288 + ^ x20: .cfa -280 + ^ +STACK CFI 8ba10 x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ +STACK CFI 8bacc x19: x19 x20: x20 +STACK CFI 8bad0 v8: v8 v9: v9 +STACK CFI 8bad4 x21: x21 x22: x22 +STACK CFI 8bad8 v10: v10 v11: v11 +STACK CFI 8badc x23: x23 x24: x24 +STACK CFI 8bae0 v12: v12 v13: v13 +STACK CFI 8bae4 x25: x25 x26: x26 +STACK CFI 8bae8 v14: v14 v15: v15 +STACK CFI 8baec x27: x27 x28: x28 +STACK CFI 8baf0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8baf4 .cfa: x29 304 + .ra: .cfa -296 + ^ v10: .cfa -192 + ^ v11: .cfa -184 + ^ v12: .cfa -176 + ^ v13: .cfa -168 + ^ v14: .cfa -160 + ^ v15: .cfa -152 + ^ v8: .cfa -208 + ^ v9: .cfa -200 + ^ x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ x25: .cfa -240 + ^ x26: .cfa -232 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ x29: .cfa -304 + ^ +STACK CFI INIT 8bf98 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8bf9c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8bfa0 .cfa: x29 48 + +STACK CFI 8bfc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8bfcc 4f4 .cfa: sp 0 + .ra: x30 +STACK CFI 8bfd0 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8bfd4 .cfa: x29 320 + +STACK CFI 8bfd8 v10: .cfa -208 + ^ v11: .cfa -200 + ^ +STACK CFI 8bfe0 v14: .cfa -176 + ^ v15: .cfa -168 + ^ +STACK CFI 8bfec v8: .cfa -224 + ^ v9: .cfa -216 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 8bff8 v12: .cfa -192 + ^ v13: .cfa -184 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 8c014 x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ +STACK CFI 8c0b4 x19: x19 x20: x20 +STACK CFI 8c0b8 v8: v8 v9: v9 +STACK CFI 8c0bc x21: x21 x22: x22 +STACK CFI 8c0c0 v10: v10 v11: v11 +STACK CFI 8c0c4 x23: x23 x24: x24 +STACK CFI 8c0c8 v12: v12 v13: v13 +STACK CFI 8c0cc x25: x25 x26: x26 +STACK CFI 8c0d0 v14: v14 v15: v15 +STACK CFI 8c0d4 x27: x27 x28: x28 +STACK CFI 8c0d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8c0dc .cfa: x29 320 + .ra: .cfa -312 + ^ v10: .cfa -208 + ^ v11: .cfa -200 + ^ v12: .cfa -192 + ^ v13: .cfa -184 + ^ v14: .cfa -176 + ^ v15: .cfa -168 + ^ v8: .cfa -224 + ^ v9: .cfa -216 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 8c4c0 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8c4c4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8c4c8 .cfa: x29 48 + +STACK CFI 8c4f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8c4f4 5f8 .cfa: sp 0 + .ra: x30 +STACK CFI 8c4f8 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8c4fc .cfa: x29 320 + +STACK CFI 8c500 v8: .cfa -224 + ^ v9: .cfa -216 + ^ +STACK CFI 8c508 v14: .cfa -176 + ^ v15: .cfa -168 + ^ +STACK CFI 8c514 v10: .cfa -208 + ^ v11: .cfa -200 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 8c520 v12: .cfa -192 + ^ v13: .cfa -184 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 8c53c x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ +STACK CFI 8c5fc x19: x19 x20: x20 +STACK CFI 8c600 v8: v8 v9: v9 +STACK CFI 8c604 x21: x21 x22: x22 +STACK CFI 8c608 v10: v10 v11: v11 +STACK CFI 8c60c x23: x23 x24: x24 +STACK CFI 8c610 v12: v12 v13: v13 +STACK CFI 8c614 x25: x25 x26: x26 +STACK CFI 8c618 v14: v14 v15: v15 +STACK CFI 8c61c x27: x27 x28: x28 +STACK CFI 8c620 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8c624 .cfa: x29 320 + .ra: .cfa -312 + ^ v10: .cfa -208 + ^ v11: .cfa -200 + ^ v12: .cfa -192 + ^ v13: .cfa -184 + ^ v14: .cfa -176 + ^ v15: .cfa -168 + ^ v8: .cfa -224 + ^ v9: .cfa -216 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 8caec 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8caf0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8caf4 .cfa: x29 48 + +STACK CFI 8cb1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8cb20 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 8cb24 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8cb28 .cfa: x29 80 + +STACK CFI 8cb8c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8cb90 .cfa: x29 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8cbb0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8cbb4 .cfa: x29 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8cbbc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8cbc0 .cfa: x29 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 8cbc8 3e4 .cfa: sp 0 + .ra: x30 +STACK CFI 8cbcc .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8cbd0 .cfa: x29 80 + +STACK CFI 8cbd8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI 8cc98 x19: x19 x20: x20 +STACK CFI 8cc9c x21: x21 x22: x22 +STACK CFI 8cca0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8cca4 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x29: .cfa -80 + ^ +STACK CFI 8cd48 x19: x19 x20: x20 +STACK CFI 8cd4c x21: x21 x22: x22 +STACK CFI 8cd50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8cd54 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x29: .cfa -80 + ^ +STACK CFI 8ce08 x19: x19 x20: x20 +STACK CFI 8ce0c x21: x21 x22: x22 +STACK CFI 8ce10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8ce14 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x29: .cfa -80 + ^ +STACK CFI 8ce80 x19: x19 x20: x20 +STACK CFI 8ce84 x21: x21 x22: x22 +STACK CFI 8ce88 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8ce8c .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x29: .cfa -80 + ^ +STACK CFI 8cec0 x19: x19 x20: x20 +STACK CFI 8cec4 x21: x21 x22: x22 +STACK CFI 8cec8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8cecc .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 8cfac 5c4 .cfa: sp 0 + .ra: x30 +STACK CFI 8cfb0 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8cfb4 .cfa: x29 320 + +STACK CFI 8cfb8 v8: .cfa -224 + ^ v9: .cfa -216 + ^ +STACK CFI 8cfc0 v14: .cfa -176 + ^ v15: .cfa -168 + ^ +STACK CFI 8cfcc v10: .cfa -208 + ^ v11: .cfa -200 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 8cfd8 v12: .cfa -192 + ^ v13: .cfa -184 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 8cff4 x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ +STACK CFI 8d0b4 x19: x19 x20: x20 +STACK CFI 8d0b8 v8: v8 v9: v9 +STACK CFI 8d0bc x21: x21 x22: x22 +STACK CFI 8d0c0 v10: v10 v11: v11 +STACK CFI 8d0c4 x23: x23 x24: x24 +STACK CFI 8d0c8 v12: v12 v13: v13 +STACK CFI 8d0cc x25: x25 x26: x26 +STACK CFI 8d0d0 v14: v14 v15: v15 +STACK CFI 8d0d4 x27: x27 x28: x28 +STACK CFI 8d0d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8d0dc .cfa: x29 320 + .ra: .cfa -312 + ^ v10: .cfa -208 + ^ v11: .cfa -200 + ^ v12: .cfa -192 + ^ v13: .cfa -184 + ^ v14: .cfa -176 + ^ v15: .cfa -168 + ^ v8: .cfa -224 + ^ v9: .cfa -216 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 8d570 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8d574 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8d578 .cfa: x29 48 + +STACK CFI 8d5a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8d5a4 54 .cfa: sp 0 + .ra: x30 +STACK CFI 8d5a8 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8d5ac .cfa: x29 80 + +STACK CFI 8d5f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8d5f8 5dc .cfa: sp 0 + .ra: x30 +STACK CFI 8d5fc .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8d600 .cfa: x29 320 + +STACK CFI 8d604 v8: .cfa -224 + ^ v9: .cfa -216 + ^ +STACK CFI 8d60c v14: .cfa -176 + ^ v15: .cfa -168 + ^ +STACK CFI 8d618 v10: .cfa -208 + ^ v11: .cfa -200 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 8d624 v12: .cfa -192 + ^ v13: .cfa -184 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 8d640 x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ +STACK CFI 8d700 x19: x19 x20: x20 +STACK CFI 8d704 v8: v8 v9: v9 +STACK CFI 8d708 x21: x21 x22: x22 +STACK CFI 8d70c v10: v10 v11: v11 +STACK CFI 8d710 x23: x23 x24: x24 +STACK CFI 8d714 v12: v12 v13: v13 +STACK CFI 8d718 x25: x25 x26: x26 +STACK CFI 8d71c v14: v14 v15: v15 +STACK CFI 8d720 x27: x27 x28: x28 +STACK CFI 8d724 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8d728 .cfa: x29 320 + .ra: .cfa -312 + ^ v10: .cfa -208 + ^ v11: .cfa -200 + ^ v12: .cfa -192 + ^ v13: .cfa -184 + ^ v14: .cfa -176 + ^ v15: .cfa -168 + ^ v8: .cfa -224 + ^ v9: .cfa -216 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 8dbd4 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8dbd8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8dbdc .cfa: x29 48 + +STACK CFI 8dc04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8dc08 5c4 .cfa: sp 0 + .ra: x30 +STACK CFI 8dc0c .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8dc10 .cfa: x29 320 + +STACK CFI 8dc14 v8: .cfa -224 + ^ v9: .cfa -216 + ^ +STACK CFI 8dc1c v14: .cfa -176 + ^ v15: .cfa -168 + ^ +STACK CFI 8dc28 v10: .cfa -208 + ^ v11: .cfa -200 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 8dc34 v12: .cfa -192 + ^ v13: .cfa -184 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 8dc50 x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ +STACK CFI 8dd10 x19: x19 x20: x20 +STACK CFI 8dd14 v8: v8 v9: v9 +STACK CFI 8dd18 x21: x21 x22: x22 +STACK CFI 8dd1c v10: v10 v11: v11 +STACK CFI 8dd20 x23: x23 x24: x24 +STACK CFI 8dd24 v12: v12 v13: v13 +STACK CFI 8dd28 x25: x25 x26: x26 +STACK CFI 8dd2c v14: v14 v15: v15 +STACK CFI 8dd30 x27: x27 x28: x28 +STACK CFI 8dd34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8dd38 .cfa: x29 320 + .ra: .cfa -312 + ^ v10: .cfa -208 + ^ v11: .cfa -200 + ^ v12: .cfa -192 + ^ v13: .cfa -184 + ^ v14: .cfa -176 + ^ v15: .cfa -168 + ^ v8: .cfa -224 + ^ v9: .cfa -216 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 8e1cc 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8e1d0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8e1d4 .cfa: x29 48 + +STACK CFI 8e1fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8e200 4d4 .cfa: sp 0 + .ra: x30 +STACK CFI 8e204 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8e208 .cfa: x29 320 + +STACK CFI 8e20c v10: .cfa -208 + ^ v11: .cfa -200 + ^ +STACK CFI 8e214 v14: .cfa -176 + ^ v15: .cfa -168 + ^ +STACK CFI 8e220 v8: .cfa -224 + ^ v9: .cfa -216 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 8e22c v12: .cfa -192 + ^ v13: .cfa -184 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 8e248 x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ +STACK CFI 8e2e8 x19: x19 x20: x20 +STACK CFI 8e2ec v8: v8 v9: v9 +STACK CFI 8e2f0 x21: x21 x22: x22 +STACK CFI 8e2f4 v10: v10 v11: v11 +STACK CFI 8e2f8 x23: x23 x24: x24 +STACK CFI 8e2fc v12: v12 v13: v13 +STACK CFI 8e300 x25: x25 x26: x26 +STACK CFI 8e304 v14: v14 v15: v15 +STACK CFI 8e308 x27: x27 x28: x28 +STACK CFI 8e30c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8e310 .cfa: x29 320 + .ra: .cfa -312 + ^ v10: .cfa -208 + ^ v11: .cfa -200 + ^ v12: .cfa -192 + ^ v13: .cfa -184 + ^ v14: .cfa -176 + ^ v15: .cfa -168 + ^ v8: .cfa -224 + ^ v9: .cfa -216 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 8e6d4 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8e6d8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8e6dc .cfa: x29 48 + +STACK CFI 8e704 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8e708 5c0 .cfa: sp 0 + .ra: x30 +STACK CFI 8e70c .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 8e710 .cfa: x29 304 + +STACK CFI 8e714 v10: .cfa -192 + ^ v11: .cfa -184 + ^ +STACK CFI 8e71c v12: .cfa -176 + ^ v13: .cfa -168 + ^ +STACK CFI 8e728 v8: .cfa -208 + ^ v9: .cfa -200 + ^ x25: .cfa -240 + ^ x26: .cfa -232 + ^ +STACK CFI 8e734 v14: .cfa -160 + ^ v15: .cfa -152 + ^ x19: .cfa -288 + ^ x20: .cfa -280 + ^ +STACK CFI 8e750 x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ +STACK CFI 8e80c x19: x19 x20: x20 +STACK CFI 8e810 v8: v8 v9: v9 +STACK CFI 8e814 x21: x21 x22: x22 +STACK CFI 8e818 v10: v10 v11: v11 +STACK CFI 8e81c x23: x23 x24: x24 +STACK CFI 8e820 v12: v12 v13: v13 +STACK CFI 8e824 x25: x25 x26: x26 +STACK CFI 8e828 v14: v14 v15: v15 +STACK CFI 8e82c x27: x27 x28: x28 +STACK CFI 8e830 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8e834 .cfa: x29 304 + .ra: .cfa -296 + ^ v10: .cfa -192 + ^ v11: .cfa -184 + ^ v12: .cfa -176 + ^ v13: .cfa -168 + ^ v14: .cfa -160 + ^ v15: .cfa -152 + ^ v8: .cfa -208 + ^ v9: .cfa -200 + ^ x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ x25: .cfa -240 + ^ x26: .cfa -232 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ x29: .cfa -304 + ^ +STACK CFI INIT 8ecc8 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8eccc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8ecd0 .cfa: x29 48 + +STACK CFI 8ecf8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8ecfc 4fc .cfa: sp 0 + .ra: x30 +STACK CFI 8ed00 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 8ed04 .cfa: x29 320 + +STACK CFI 8ed08 v10: .cfa -208 + ^ v11: .cfa -200 + ^ +STACK CFI 8ed10 v14: .cfa -176 + ^ v15: .cfa -168 + ^ +STACK CFI 8ed1c v8: .cfa -224 + ^ v9: .cfa -216 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ +STACK CFI 8ed28 v12: .cfa -192 + ^ v13: .cfa -184 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 8ed44 x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ +STACK CFI 8ede4 x19: x19 x20: x20 +STACK CFI 8ede8 v8: v8 v9: v9 +STACK CFI 8edec x21: x21 x22: x22 +STACK CFI 8edf0 v10: v10 v11: v11 +STACK CFI 8edf4 x23: x23 x24: x24 +STACK CFI 8edf8 v12: v12 v13: v13 +STACK CFI 8edfc x25: x25 x26: x26 +STACK CFI 8ee00 v14: v14 v15: v15 +STACK CFI 8ee04 x27: x27 x28: x28 +STACK CFI 8ee08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8ee0c .cfa: x29 320 + .ra: .cfa -312 + ^ v10: .cfa -208 + ^ v11: .cfa -200 + ^ v12: .cfa -192 + ^ v13: .cfa -184 + ^ v14: .cfa -176 + ^ v15: .cfa -168 + ^ v8: .cfa -224 + ^ v9: .cfa -216 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x25: .cfa -256 + ^ x26: .cfa -248 + ^ x27: .cfa -240 + ^ x28: .cfa -232 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 8f1f8 34 .cfa: sp 0 + .ra: x30 +STACK CFI 8f1fc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 8f200 .cfa: x29 48 + +STACK CFI 8f228 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8f22c a8 .cfa: sp 0 + .ra: x30 +STACK CFI 8f230 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8f234 .cfa: x29 80 + +STACK CFI 8f298 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8f29c .cfa: x29 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8f2bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8f2c0 .cfa: x29 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 8f2c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8f2cc .cfa: x29 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 8f2d4 468 .cfa: sp 0 + .ra: x30 +STACK CFI 8f2d8 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 8f2e0 .cfa: x29 112 + +STACK CFI 8f2e8 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI 8f308 x21: .cfa -80 + ^ x22: .cfa -72 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ +STACK CFI 8f48c x19: x19 x20: x20 +STACK CFI 8f490 x21: x21 x22: x22 +STACK CFI 8f494 x23: x23 x24: x24 +STACK CFI 8f498 x25: x25 x26: x26 +STACK CFI 8f49c x27: x27 +STACK CFI 8f4a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8f4a4 .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ x29: .cfa -112 + ^ +STACK CFI INIT 8f73c 220 .cfa: sp 0 + .ra: x30 +STACK CFI 8f740 .cfa: sp 592 + +STACK CFI 8f744 .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 8f748 .cfa: x29 688 + +STACK CFI 8f74c x19: .cfa -672 + ^ x20: .cfa -664 + ^ +STACK CFI 8f760 x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 8f774 x27: .cfa -608 + ^ x28: .cfa -600 + ^ +STACK CFI 8f8b4 .cfa: sp 688 + +STACK CFI 8f8c0 x19: x19 x20: x20 +STACK CFI 8f8c4 x21: x21 x22: x22 +STACK CFI 8f8c8 x23: x23 x24: x24 +STACK CFI 8f8cc x25: x25 x26: x26 +STACK CFI 8f8d0 x27: x27 x28: x28 +STACK CFI 8f8d4 .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 8f8d8 .cfa: sp 496 + +STACK CFI 8f8dc .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x28: .cfa -600 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 8f95c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 8f960 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 8f96c .cfa: x29 16 + +STACK CFI 8f97c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8f980 220 .cfa: sp 0 + .ra: x30 +STACK CFI 8f984 .cfa: sp 592 + +STACK CFI 8f988 .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 8f98c .cfa: x29 688 + +STACK CFI 8f990 x19: .cfa -672 + ^ x20: .cfa -664 + ^ +STACK CFI 8f9a4 x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 8f9b8 x27: .cfa -608 + ^ x28: .cfa -600 + ^ +STACK CFI 8faf8 .cfa: sp 688 + +STACK CFI 8fb04 x19: x19 x20: x20 +STACK CFI 8fb08 x21: x21 x22: x22 +STACK CFI 8fb0c x23: x23 x24: x24 +STACK CFI 8fb10 x25: x25 x26: x26 +STACK CFI 8fb14 x27: x27 x28: x28 +STACK CFI 8fb18 .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 8fb1c .cfa: sp 496 + +STACK CFI 8fb20 .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x28: .cfa -600 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 8fba0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 8fba4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 8fbb0 .cfa: x29 16 + +STACK CFI 8fbc0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 8fbc4 4b4 .cfa: sp 0 + .ra: x30 +STACK CFI 8fbc8 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 8fbd0 .cfa: x29 96 + +STACK CFI 8fbdc x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ +STACK CFI 8fd34 x23: x23 +STACK CFI 8fd38 x19: x19 x20: x20 +STACK CFI 8fd3c x21: x21 x22: x22 +STACK CFI 8fd40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8fd44 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x29: .cfa -96 + ^ +STACK CFI 8ff70 x23: x23 +STACK CFI 8ff78 x19: x19 x20: x20 +STACK CFI 8ff7c x21: x21 x22: x22 +STACK CFI 8ff80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 8ff84 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 90078 21c .cfa: sp 0 + .ra: x30 +STACK CFI 9007c .cfa: sp 464 + +STACK CFI 90080 .ra: .cfa -440 + ^ x29: .cfa -448 + ^ +STACK CFI 90084 .cfa: x29 448 + +STACK CFI 90088 v8: .cfa -352 + ^ +STACK CFI 90090 x23: .cfa -400 + ^ x24: .cfa -392 + ^ +STACK CFI 9009c x19: .cfa -432 + ^ x20: .cfa -424 + ^ x21: .cfa -416 + ^ x22: .cfa -408 + ^ +STACK CFI 900b4 x25: .cfa -384 + ^ x26: .cfa -376 + ^ x27: .cfa -368 + ^ x28: .cfa -360 + ^ +STACK CFI 90200 .cfa: sp 464 + +STACK CFI 9020c v8: v8 +STACK CFI 90210 x19: x19 x20: x20 +STACK CFI 90214 x21: x21 x22: x22 +STACK CFI 90218 x23: x23 x24: x24 +STACK CFI 9021c x25: x25 x26: x26 +STACK CFI 90220 x27: x27 x28: x28 +STACK CFI 90224 .ra: .ra x29: x29 +STACK CFI 90228 .cfa: sp 0 + +STACK CFI 9022c .cfa: x29 448 + .ra: .cfa -440 + ^ v8: .cfa -352 + ^ x19: .cfa -432 + ^ x20: .cfa -424 + ^ x21: .cfa -416 + ^ x22: .cfa -408 + ^ x23: .cfa -400 + ^ x24: .cfa -392 + ^ x25: .cfa -384 + ^ x26: .cfa -376 + ^ x27: .cfa -368 + ^ x28: .cfa -360 + ^ x29: .cfa -448 + ^ +STACK CFI INIT 90294 a4 .cfa: sp 0 + .ra: x30 +STACK CFI 90298 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 902a0 .cfa: x29 96 + +STACK CFI 902a8 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x22: .cfa -64 + ^ x23: .cfa -56 + ^ +STACK CFI 902f4 x19: x19 x20: x20 +STACK CFI 902f8 x22: x22 x23: x23 +STACK CFI 902fc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 90300 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x22: .cfa -64 + ^ x23: .cfa -56 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 90338 1e8 .cfa: sp 0 + .ra: x30 +STACK CFI 9033c .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 90340 .cfa: x29 96 + +STACK CFI 90344 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 90354 x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 90368 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 903e8 x21: x21 x22: x22 +STACK CFI 903ec x19: x19 x20: x20 +STACK CFI 903f0 x23: x23 x24: x24 +STACK CFI 903f4 x25: x25 x26: x26 +STACK CFI 903f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 903fc .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 90520 28 .cfa: sp 0 + .ra: x30 +STACK CFI 90524 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 90530 .cfa: x29 16 + +STACK CFI 90544 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 90548 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 9054c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 90554 .cfa: x29 112 + +STACK CFI 90560 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ +STACK CFI 905b0 x23: x23 +STACK CFI 905b4 x19: x19 x20: x20 +STACK CFI 905b8 x21: x21 x22: x22 +STACK CFI 905bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 905c0 .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x29: .cfa -112 + ^ +STACK CFI INIT 905f0 6c .cfa: sp 0 + .ra: x30 +STACK CFI 905f4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 905fc .cfa: x29 96 + +STACK CFI 90600 x22: .cfa -64 + ^ x23: .cfa -56 + ^ +STACK CFI 90614 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 90650 x19: x19 x20: x20 +STACK CFI 90654 x22: x22 x23: x23 +STACK CFI 90658 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9065c 6c .cfa: sp 0 + .ra: x30 +STACK CFI 90660 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 90668 .cfa: x29 96 + +STACK CFI 9066c x22: .cfa -64 + ^ x23: .cfa -56 + ^ +STACK CFI 90680 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 906bc x19: x19 x20: x20 +STACK CFI 906c0 x22: x22 x23: x23 +STACK CFI 906c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 906c8 550 .cfa: sp 0 + .ra: x30 +STACK CFI 906cc .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 906d0 .cfa: x29 128 + +STACK CFI 906e0 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ +STACK CFI 90740 x25: x25 +STACK CFI 9074c x19: x19 x20: x20 +STACK CFI 90750 x21: x21 x22: x22 +STACK CFI 90754 x23: x23 x24: x24 +STACK CFI 90758 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9075c .cfa: x29 128 + .ra: .cfa -120 + ^ x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x29: .cfa -128 + ^ +STACK CFI INIT 90c18 4d8 .cfa: sp 0 + .ra: x30 +STACK CFI 90c1c .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 90c20 .cfa: x29 144 + +STACK CFI 90c28 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI 90c44 x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ +STACK CFI 90d50 x19: x19 x20: x20 +STACK CFI 90d54 x21: x21 x22: x22 +STACK CFI 90d58 x23: x23 x24: x24 +STACK CFI 90d5c x25: x25 x26: x26 +STACK CFI 90d60 x27: x27 x28: x28 +STACK CFI 90d64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 90d68 .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 910f0 2bc .cfa: sp 0 + .ra: x30 +STACK CFI 910f4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 910f8 .cfa: x29 64 + +STACK CFI 91108 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 91148 x21: x21 x22: x22 +STACK CFI 91154 x23: x23 +STACK CFI 91158 x19: x19 x20: x20 +STACK CFI 9115c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 91160 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 913ac 844 .cfa: sp 0 + .ra: x30 +STACK CFI 913b0 .cfa: sp 384 + .ra: .cfa -376 + ^ x29: .cfa -384 + ^ +STACK CFI 913b4 .cfa: x29 384 + +STACK CFI 913bc v12: .cfa -256 + ^ v13: .cfa -248 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ +STACK CFI 913cc v8: .cfa -288 + ^ v9: .cfa -280 + ^ x19: .cfa -368 + ^ x20: .cfa -360 + ^ +STACK CFI 91400 v10: .cfa -272 + ^ v11: .cfa -264 + ^ v14: .cfa -240 + ^ v15: .cfa -232 + ^ x23: .cfa -336 + ^ x24: .cfa -328 + ^ x25: .cfa -320 + ^ x26: .cfa -312 + ^ x27: .cfa -304 + ^ x28: .cfa -296 + ^ +STACK CFI 91618 v8: v8 v9: v9 +STACK CFI 9161c x19: x19 x20: x20 +STACK CFI 91620 v10: v10 v11: v11 +STACK CFI 91624 x21: x21 x22: x22 +STACK CFI 91628 v12: v12 v13: v13 +STACK CFI 9162c x23: x23 x24: x24 +STACK CFI 91630 v14: v14 v15: v15 +STACK CFI 91634 x25: x25 x26: x26 +STACK CFI 91638 x27: x27 x28: x28 +STACK CFI 9163c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 91640 .cfa: x29 384 + .ra: .cfa -376 + ^ v10: .cfa -272 + ^ v11: .cfa -264 + ^ v12: .cfa -256 + ^ v13: .cfa -248 + ^ v14: .cfa -240 + ^ v15: .cfa -232 + ^ v8: .cfa -288 + ^ v9: .cfa -280 + ^ x19: .cfa -368 + ^ x20: .cfa -360 + ^ x21: .cfa -352 + ^ x22: .cfa -344 + ^ x23: .cfa -336 + ^ x24: .cfa -328 + ^ x25: .cfa -320 + ^ x26: .cfa -312 + ^ x27: .cfa -304 + ^ x28: .cfa -296 + ^ x29: .cfa -384 + ^ +STACK CFI INIT 91bf0 2a0 .cfa: sp 0 + .ra: x30 +STACK CFI 91bf4 .cfa: sp 592 + +STACK CFI 91bf8 .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 91bfc .cfa: x29 688 + +STACK CFI 91c00 x23: .cfa -640 + ^ x24: .cfa -632 + ^ +STACK CFI 91c10 x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x27: .cfa -608 + ^ +STACK CFI 91c24 x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 91d30 x27: x27 +STACK CFI 91d3c x19: x19 x20: x20 +STACK CFI 91d40 x21: x21 x22: x22 +STACK CFI 91d44 x23: x23 x24: x24 +STACK CFI 91d48 x25: x25 x26: x26 +STACK CFI 91d4c .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 91d50 .cfa: sp 496 + +STACK CFI 91d54 .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 91e90 34 .cfa: sp 0 + .ra: x30 +STACK CFI 91e94 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 91e98 .cfa: x29 48 + +STACK CFI 91ec0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 91ec4 2a0 .cfa: sp 0 + .ra: x30 +STACK CFI 91ec8 .cfa: sp 592 + +STACK CFI 91ecc .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 91ed0 .cfa: x29 688 + +STACK CFI 91ed4 x23: .cfa -640 + ^ x24: .cfa -632 + ^ +STACK CFI 91ee4 x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x27: .cfa -608 + ^ +STACK CFI 91ef8 x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 92004 x27: x27 +STACK CFI 92010 x19: x19 x20: x20 +STACK CFI 92014 x21: x21 x22: x22 +STACK CFI 92018 x23: x23 x24: x24 +STACK CFI 9201c x25: x25 x26: x26 +STACK CFI 92020 .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 92024 .cfa: sp 496 + +STACK CFI 92028 .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 92164 34 .cfa: sp 0 + .ra: x30 +STACK CFI 92168 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9216c .cfa: x29 48 + +STACK CFI 92194 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 92198 2a0 .cfa: sp 0 + .ra: x30 +STACK CFI 9219c .cfa: sp 592 + +STACK CFI 921a0 .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 921a4 .cfa: x29 688 + +STACK CFI 921a8 x23: .cfa -640 + ^ x24: .cfa -632 + ^ +STACK CFI 921b8 x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x27: .cfa -608 + ^ +STACK CFI 921cc x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 922d8 x27: x27 +STACK CFI 922e4 x19: x19 x20: x20 +STACK CFI 922e8 x21: x21 x22: x22 +STACK CFI 922ec x23: x23 x24: x24 +STACK CFI 922f0 x25: x25 x26: x26 +STACK CFI 922f4 .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 922f8 .cfa: sp 496 + +STACK CFI 922fc .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 92438 34 .cfa: sp 0 + .ra: x30 +STACK CFI 9243c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 92440 .cfa: x29 48 + +STACK CFI 92468 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9246c 4f4 .cfa: sp 0 + .ra: x30 +STACK CFI 92470 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 92474 .cfa: x29 128 + +STACK CFI 92488 x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ +STACK CFI 924f4 x27: x27 +STACK CFI 92500 x19: x19 x20: x20 +STACK CFI 92504 x21: x21 x22: x22 +STACK CFI 92508 x23: x23 x24: x24 +STACK CFI 9250c x25: x25 x26: x26 +STACK CFI 92510 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 92514 .cfa: x29 128 + .ra: .cfa -120 + ^ x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x29: .cfa -128 + ^ +STACK CFI INIT 92960 7b8 .cfa: sp 0 + .ra: x30 +STACK CFI 92964 .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 92968 .cfa: x29 304 + +STACK CFI 92974 v8: .cfa -208 + ^ v9: .cfa -200 + ^ x19: .cfa -288 + ^ x20: .cfa -280 + ^ +STACK CFI 92984 v10: .cfa -192 + ^ v11: .cfa -184 + ^ v12: .cfa -176 + ^ v13: .cfa -168 + ^ +STACK CFI 929a0 x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ +STACK CFI 929b4 v14: .cfa -160 + ^ x25: .cfa -240 + ^ x26: .cfa -232 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ +STACK CFI 92bcc v8: v8 v9: v9 +STACK CFI 92bd0 x19: x19 x20: x20 +STACK CFI 92bd4 v10: v10 v11: v11 +STACK CFI 92bd8 x21: x21 x22: x22 +STACK CFI 92bdc v12: v12 v13: v13 +STACK CFI 92be0 x23: x23 x24: x24 +STACK CFI 92be4 x25: x25 x26: x26 +STACK CFI 92be8 x27: x27 x28: x28 +STACK CFI 92bec v14: v14 +STACK CFI 92bf0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 92bf4 .cfa: x29 304 + .ra: .cfa -296 + ^ v10: .cfa -192 + ^ v11: .cfa -184 + ^ v12: .cfa -176 + ^ v13: .cfa -168 + ^ v14: .cfa -160 + ^ v8: .cfa -208 + ^ v9: .cfa -200 + ^ x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ x25: .cfa -240 + ^ x26: .cfa -232 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ x29: .cfa -304 + ^ +STACK CFI INIT 93118 298 .cfa: sp 0 + .ra: x30 +STACK CFI 9311c .cfa: sp 592 + +STACK CFI 93120 .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 93124 .cfa: x29 688 + +STACK CFI 93128 x23: .cfa -640 + ^ x24: .cfa -632 + ^ +STACK CFI 93138 x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x27: .cfa -608 + ^ +STACK CFI 9314c x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 93258 x27: x27 +STACK CFI 93264 x19: x19 x20: x20 +STACK CFI 93268 x21: x21 x22: x22 +STACK CFI 9326c x23: x23 x24: x24 +STACK CFI 93270 x25: x25 x26: x26 +STACK CFI 93274 .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 93278 .cfa: sp 496 + +STACK CFI 9327c .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 933b0 34 .cfa: sp 0 + .ra: x30 +STACK CFI 933b4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 933b8 .cfa: x29 48 + +STACK CFI 933e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 933e4 298 .cfa: sp 0 + .ra: x30 +STACK CFI 933e8 .cfa: sp 592 + +STACK CFI 933ec .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 933f0 .cfa: x29 688 + +STACK CFI 933f4 x23: .cfa -640 + ^ x24: .cfa -632 + ^ +STACK CFI 93404 x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x27: .cfa -608 + ^ +STACK CFI 93418 x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 93524 x27: x27 +STACK CFI 93530 x19: x19 x20: x20 +STACK CFI 93534 x21: x21 x22: x22 +STACK CFI 93538 x23: x23 x24: x24 +STACK CFI 9353c x25: x25 x26: x26 +STACK CFI 93540 .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 93544 .cfa: sp 496 + +STACK CFI 93548 .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 9367c 34 .cfa: sp 0 + .ra: x30 +STACK CFI 93680 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 93684 .cfa: x29 48 + +STACK CFI 936ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 936b0 298 .cfa: sp 0 + .ra: x30 +STACK CFI 936b4 .cfa: sp 592 + +STACK CFI 936b8 .cfa: sp 688 + .ra: .cfa -680 + ^ x29: .cfa -688 + ^ +STACK CFI 936bc .cfa: x29 688 + +STACK CFI 936c0 x23: .cfa -640 + ^ x24: .cfa -632 + ^ +STACK CFI 936d0 x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x27: .cfa -608 + ^ +STACK CFI 936e4 x25: .cfa -624 + ^ x26: .cfa -616 + ^ +STACK CFI 937f0 x27: x27 +STACK CFI 937fc x19: x19 x20: x20 +STACK CFI 93800 x21: x21 x22: x22 +STACK CFI 93804 x23: x23 x24: x24 +STACK CFI 93808 x25: x25 x26: x26 +STACK CFI 9380c .cfa: sp 592 + .ra: .ra x29: x29 +STACK CFI 93810 .cfa: sp 496 + +STACK CFI 93814 .cfa: x29 688 + .ra: .cfa -680 + ^ x19: .cfa -672 + ^ x20: .cfa -664 + ^ x21: .cfa -656 + ^ x22: .cfa -648 + ^ x23: .cfa -640 + ^ x24: .cfa -632 + ^ x25: .cfa -624 + ^ x26: .cfa -616 + ^ x27: .cfa -608 + ^ x29: .cfa -688 + ^ +STACK CFI INIT 93948 34 .cfa: sp 0 + .ra: x30 +STACK CFI 9394c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 93950 .cfa: x29 48 + +STACK CFI 93978 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9397c 4c8 .cfa: sp 0 + .ra: x30 +STACK CFI 93980 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 9398c .cfa: x29 80 + +STACK CFI 93998 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 93adc x19: x19 x20: x20 +STACK CFI 93ae0 x21: x21 x22: x22 +STACK CFI 93ae4 x23: x23 x24: x24 +STACK CFI 93ae8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 93aec .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 93e44 1e8 .cfa: sp 0 + .ra: x30 +STACK CFI 93e48 .cfa: sp 240 + +STACK CFI 93e4c .ra: .cfa -216 + ^ x29: .cfa -224 + ^ +STACK CFI 93e50 .cfa: x29 224 + +STACK CFI 93e54 x23: .cfa -176 + ^ x24: .cfa -168 + ^ +STACK CFI 93e64 v8: .cfa -128 + ^ +STACK CFI 93e6c x19: .cfa -208 + ^ x20: .cfa -200 + ^ +STACK CFI 93e88 x21: .cfa -192 + ^ x22: .cfa -184 + ^ x25: .cfa -160 + ^ x26: .cfa -152 + ^ x27: .cfa -144 + ^ x28: .cfa -136 + ^ +STACK CFI 93f84 .cfa: sp 240 + +STACK CFI 93f90 v8: v8 +STACK CFI 93f94 x19: x19 x20: x20 +STACK CFI 93f98 x21: x21 x22: x22 +STACK CFI 93f9c x23: x23 x24: x24 +STACK CFI 93fa0 x25: x25 x26: x26 +STACK CFI 93fa4 x27: x27 x28: x28 +STACK CFI 93fa8 .ra: .ra x29: x29 +STACK CFI 93fac .cfa: sp 0 + +STACK CFI 93fb0 .cfa: x29 224 + .ra: .cfa -216 + ^ v8: .cfa -128 + ^ x19: .cfa -208 + ^ x20: .cfa -200 + ^ x21: .cfa -192 + ^ x22: .cfa -184 + ^ x23: .cfa -176 + ^ x24: .cfa -168 + ^ x25: .cfa -160 + ^ x26: .cfa -152 + ^ x27: .cfa -144 + ^ x28: .cfa -136 + ^ x29: .cfa -224 + ^ +STACK CFI INIT 9402c a4 .cfa: sp 0 + .ra: x30 +STACK CFI 94030 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 94038 .cfa: x29 96 + +STACK CFI 94040 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x22: .cfa -64 + ^ x23: .cfa -56 + ^ +STACK CFI 9408c x19: x19 x20: x20 +STACK CFI 94090 x22: x22 x23: x23 +STACK CFI 94094 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 94098 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x22: .cfa -64 + ^ x23: .cfa -56 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 940d0 1fc .cfa: sp 0 + .ra: x30 +STACK CFI 940d4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 940d8 .cfa: x29 96 + +STACK CFI 940dc x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 940ec x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 94100 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ +STACK CFI 94180 x21: x21 x22: x22 +STACK CFI 94184 x19: x19 x20: x20 +STACK CFI 94188 x23: x23 x24: x24 +STACK CFI 9418c x25: x25 x26: x26 +STACK CFI 94190 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 94194 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 942cc 28 .cfa: sp 0 + .ra: x30 +STACK CFI 942d0 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 942dc .cfa: x29 16 + +STACK CFI 942f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 942f4 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 942f8 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 94300 .cfa: x29 112 + +STACK CFI 9430c x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ +STACK CFI 9435c x23: x23 +STACK CFI 94360 x19: x19 x20: x20 +STACK CFI 94364 x21: x21 x22: x22 +STACK CFI 94368 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9436c .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x29: .cfa -112 + ^ +STACK CFI INIT 9439c 70 .cfa: sp 0 + .ra: x30 +STACK CFI 943a0 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 943a4 .cfa: x29 112 + +STACK CFI 943a8 x23: .cfa -64 + ^ +STACK CFI 943b8 x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 943c4 x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 943fc x23: x23 +STACK CFI 94400 x19: x19 x20: x20 +STACK CFI 94404 x21: x21 x22: x22 +STACK CFI 94408 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9440c 70 .cfa: sp 0 + .ra: x30 +STACK CFI 94410 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 94414 .cfa: x29 112 + +STACK CFI 94418 x23: .cfa -64 + ^ +STACK CFI 94428 x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 94434 x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI 9446c x23: x23 +STACK CFI 94470 x19: x19 x20: x20 +STACK CFI 94474 x21: x21 x22: x22 +STACK CFI 94478 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9447c 420 .cfa: sp 0 + .ra: x30 +STACK CFI 94480 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 94488 .cfa: x29 96 + +STACK CFI 94494 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ +STACK CFI 94598 x19: x19 x20: x20 +STACK CFI 9459c x21: x21 x22: x22 +STACK CFI 945a0 x23: x23 x24: x24 +STACK CFI 945a4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 945a8 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x29: .cfa -96 + ^ +STACK CFI 947b4 x21: x21 x22: x22 +STACK CFI 947b8 x19: x19 x20: x20 +STACK CFI 947bc x23: x23 x24: x24 +STACK CFI 947c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 947c4 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 9489c 1d0 .cfa: sp 0 + .ra: x30 +STACK CFI 948a0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 948a8 .cfa: x29 64 + +STACK CFI 948b0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 949d8 x19: x19 x20: x20 +STACK CFI 949dc x21: x21 x22: x22 +STACK CFI 949e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 949e4 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x29: .cfa -64 + ^ +STACK CFI 94a24 x19: x19 x20: x20 +STACK CFI 94a28 x21: x21 x22: x22 +STACK CFI 94a2c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 94a30 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 94a6c 4c4 .cfa: sp 0 + .ra: x30 +STACK CFI 94a70 .cfa: sp 368 + .ra: .cfa -360 + ^ x29: .cfa -368 + ^ +STACK CFI 94a74 .cfa: x29 368 + +STACK CFI 94a7c x21: .cfa -336 + ^ x22: .cfa -328 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ +STACK CFI 94a94 x23: .cfa -320 + ^ x24: .cfa -312 + ^ +STACK CFI 94aa4 x19: .cfa -352 + ^ x20: .cfa -344 + ^ x27: .cfa -288 + ^ +STACK CFI 94afc x27: x27 +STACK CFI 94b00 x19: x19 x20: x20 +STACK CFI 94b04 x21: x21 x22: x22 +STACK CFI 94b08 x23: x23 x24: x24 +STACK CFI 94b0c x25: x25 x26: x26 +STACK CFI 94b10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 94b14 .cfa: x29 368 + .ra: .cfa -360 + ^ x19: .cfa -352 + ^ x20: .cfa -344 + ^ x21: .cfa -336 + ^ x22: .cfa -328 + ^ x23: .cfa -320 + ^ x24: .cfa -312 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ x27: .cfa -288 + ^ x29: .cfa -368 + ^ +STACK CFI 94ca8 x27: x27 +STACK CFI 94cb0 x19: x19 x20: x20 +STACK CFI 94cc0 x21: x21 x22: x22 +STACK CFI 94cc4 x23: x23 x24: x24 +STACK CFI 94cc8 x25: x25 x26: x26 +STACK CFI 94ccc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 94cd0 .cfa: x29 368 + .ra: .cfa -360 + ^ x19: .cfa -352 + ^ x20: .cfa -344 + ^ x21: .cfa -336 + ^ x22: .cfa -328 + ^ x23: .cfa -320 + ^ x24: .cfa -312 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ x27: .cfa -288 + ^ x29: .cfa -368 + ^ +STACK CFI 94e48 x27: x27 +STACK CFI 94e4c x19: x19 x20: x20 +STACK CFI 94e64 x21: x21 x22: x22 +STACK CFI 94e68 x23: x23 x24: x24 +STACK CFI 94e6c x25: x25 x26: x26 +STACK CFI 94e70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 94e74 .cfa: x29 368 + .ra: .cfa -360 + ^ x19: .cfa -352 + ^ x20: .cfa -344 + ^ x21: .cfa -336 + ^ x22: .cfa -328 + ^ x23: .cfa -320 + ^ x24: .cfa -312 + ^ x25: .cfa -304 + ^ x26: .cfa -296 + ^ x27: .cfa -288 + ^ x29: .cfa -368 + ^ +STACK CFI INIT 94f30 7f4 .cfa: sp 0 + .ra: x30 +STACK CFI 94f34 .cfa: sp 304 + .ra: .cfa -296 + ^ x29: .cfa -304 + ^ +STACK CFI 94f38 .cfa: x29 304 + +STACK CFI 94f44 v10: .cfa -192 + ^ v11: .cfa -184 + ^ v8: .cfa -208 + ^ v9: .cfa -200 + ^ +STACK CFI 94f68 x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ x25: .cfa -240 + ^ x26: .cfa -232 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ +STACK CFI 94fc0 v8: v8 v9: v9 +STACK CFI 94fc4 x19: x19 x20: x20 +STACK CFI 94fc8 v10: v10 v11: v11 +STACK CFI 94fcc x21: x21 x22: x22 +STACK CFI 94fd0 x23: x23 x24: x24 +STACK CFI 94fd4 x25: x25 x26: x26 +STACK CFI 94fd8 x27: x27 x28: x28 +STACK CFI 94fdc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 94fe0 .cfa: x29 304 + .ra: .cfa -296 + ^ v10: .cfa -192 + ^ v11: .cfa -184 + ^ v8: .cfa -208 + ^ v9: .cfa -200 + ^ x19: .cfa -288 + ^ x20: .cfa -280 + ^ x21: .cfa -272 + ^ x22: .cfa -264 + ^ x23: .cfa -256 + ^ x24: .cfa -248 + ^ x25: .cfa -240 + ^ x26: .cfa -232 + ^ x27: .cfa -224 + ^ x28: .cfa -216 + ^ x29: .cfa -304 + ^ +STACK CFI INIT 95724 b48 .cfa: sp 0 + .ra: x30 +STACK CFI 95728 .cfa: sp 672 + +STACK CFI 9572c .cfa: sp 832 + .ra: .cfa -824 + ^ x29: .cfa -832 + ^ +STACK CFI 95730 .cfa: x29 832 + +STACK CFI 95738 v8: .cfa -736 + ^ v9: .cfa -728 + ^ x19: .cfa -816 + ^ x20: .cfa -808 + ^ +STACK CFI 95764 v10: .cfa -720 + ^ v11: .cfa -712 + ^ v12: .cfa -704 + ^ v13: .cfa -696 + ^ v14: .cfa -688 + ^ v15: .cfa -680 + ^ x21: .cfa -800 + ^ x22: .cfa -792 + ^ x23: .cfa -784 + ^ x24: .cfa -776 + ^ x25: .cfa -768 + ^ x26: .cfa -760 + ^ x27: .cfa -752 + ^ x28: .cfa -744 + ^ +STACK CFI 957a4 .cfa: sp 832 + +STACK CFI 957b0 v8: v8 v9: v9 +STACK CFI 957b4 x19: x19 x20: x20 +STACK CFI 957b8 v10: v10 v11: v11 +STACK CFI 957bc x21: x21 x22: x22 +STACK CFI 957c0 v12: v12 v13: v13 +STACK CFI 957c4 x23: x23 x24: x24 +STACK CFI 957c8 v14: v14 v15: v15 +STACK CFI 957cc x25: x25 x26: x26 +STACK CFI 957d0 x27: x27 x28: x28 +STACK CFI 957d4 .cfa: sp 672 + .ra: .ra x29: x29 +STACK CFI 957d8 .cfa: sp 512 + +STACK CFI 957dc .cfa: x29 832 + .ra: .cfa -824 + ^ v10: .cfa -720 + ^ v11: .cfa -712 + ^ v12: .cfa -704 + ^ v13: .cfa -696 + ^ v14: .cfa -688 + ^ v15: .cfa -680 + ^ v8: .cfa -736 + ^ v9: .cfa -728 + ^ x19: .cfa -816 + ^ x20: .cfa -808 + ^ x21: .cfa -800 + ^ x22: .cfa -792 + ^ x23: .cfa -784 + ^ x24: .cfa -776 + ^ x25: .cfa -768 + ^ x26: .cfa -760 + ^ x27: .cfa -752 + ^ x28: .cfa -744 + ^ x29: .cfa -832 + ^ +STACK CFI INIT 9626c 54 .cfa: sp 0 + .ra: x30 +STACK CFI 96270 .cfa: sp 48 + +STACK CFI 96288 .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9628c .cfa: x29 32 + +STACK CFI 962b4 .cfa: sp 48 + +STACK CFI 962b8 .ra: .ra x29: x29 +STACK CFI 962bc .cfa: sp 0 + +STACK CFI INIT 962c0 154 .cfa: sp 0 + .ra: x30 +STACK CFI 962c4 .cfa: sp 256 + +STACK CFI 962d0 .ra: .cfa -232 + ^ x29: .cfa -240 + ^ +STACK CFI 962d4 .cfa: x29 240 + +STACK CFI 962dc x19: .cfa -224 + ^ x20: .cfa -216 + ^ +STACK CFI 962f0 x21: .cfa -208 + ^ +STACK CFI 9639c .cfa: sp 256 + +STACK CFI 963a8 x19: x19 x20: x20 +STACK CFI 963ac x21: x21 +STACK CFI 963b0 .ra: .ra x29: x29 +STACK CFI 963b4 .cfa: sp 0 + +STACK CFI 963b8 .cfa: x29 240 + .ra: .cfa -232 + ^ x19: .cfa -224 + ^ x20: .cfa -216 + ^ x21: .cfa -208 + ^ x29: .cfa -240 + ^ +STACK CFI INIT 96414 504 .cfa: sp 0 + .ra: x30 +STACK CFI 96418 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 9641c .cfa: x29 144 + +STACK CFI 96420 x19: .cfa -128 + ^ x20: .cfa -120 + ^ +STACK CFI 9642c x21: .cfa -112 + ^ x22: .cfa -104 + ^ +STACK CFI 96434 x23: .cfa -96 + ^ +STACK CFI 9665c x23: x23 +STACK CFI 96660 x19: x19 x20: x20 +STACK CFI 96664 x21: x21 x22: x22 +STACK CFI 96668 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9666c .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x29: .cfa -144 + ^ +STACK CFI 966a0 x21: x21 x22: x22 +STACK CFI 966ac x23: x23 +STACK CFI 966b4 x19: x19 x20: x20 +STACK CFI 966b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 966bc .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x29: .cfa -144 + ^ +STACK CFI 96870 x23: x23 +STACK CFI 96880 x19: x19 x20: x20 +STACK CFI 96884 x21: x21 x22: x22 +STACK CFI 96888 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9688c .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 96918 7cc .cfa: sp 0 + .ra: x30 +STACK CFI 9691c .cfa: sp 272 + .ra: .cfa -264 + ^ x29: .cfa -272 + ^ +STACK CFI 96920 .cfa: x29 272 + +STACK CFI 96938 v8: .cfa -176 + ^ v9: .cfa -168 + ^ x19: .cfa -256 + ^ x20: .cfa -248 + ^ +STACK CFI 96958 x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ x25: .cfa -208 + ^ x26: .cfa -200 + ^ x27: .cfa -192 + ^ x28: .cfa -184 + ^ +STACK CFI 96994 x19: x19 x20: x20 +STACK CFI 96998 v8: v8 v9: v9 +STACK CFI 9699c x21: x21 x22: x22 +STACK CFI 969a0 x23: x23 x24: x24 +STACK CFI 969a4 x25: x25 x26: x26 +STACK CFI 969a8 x27: x27 x28: x28 +STACK CFI 969ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 969b0 .cfa: x29 272 + .ra: .cfa -264 + ^ v8: .cfa -176 + ^ v9: .cfa -168 + ^ x19: .cfa -256 + ^ x20: .cfa -248 + ^ x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ x25: .cfa -208 + ^ x26: .cfa -200 + ^ x27: .cfa -192 + ^ x28: .cfa -184 + ^ x29: .cfa -272 + ^ +STACK CFI 96dfc x19: x19 x20: x20 +STACK CFI 96e00 v8: v8 v9: v9 +STACK CFI 96e04 x21: x21 x22: x22 +STACK CFI 96e08 x23: x23 x24: x24 +STACK CFI 96e0c x25: x25 x26: x26 +STACK CFI 96e10 x27: x27 x28: x28 +STACK CFI 96e14 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 96e18 .cfa: x29 272 + .ra: .cfa -264 + ^ v8: .cfa -176 + ^ v9: .cfa -168 + ^ x19: .cfa -256 + ^ x20: .cfa -248 + ^ x21: .cfa -240 + ^ x22: .cfa -232 + ^ x23: .cfa -224 + ^ x24: .cfa -216 + ^ x25: .cfa -208 + ^ x26: .cfa -200 + ^ x27: .cfa -192 + ^ x28: .cfa -184 + ^ x29: .cfa -272 + ^ +STACK CFI INIT 970e4 a44 .cfa: sp 0 + .ra: x30 +STACK CFI 970e8 .cfa: sp 464 + +STACK CFI 970ec .ra: .cfa -440 + ^ x29: .cfa -448 + ^ +STACK CFI 970f0 .cfa: x29 448 + +STACK CFI 970f8 v8: .cfa -352 + ^ v9: .cfa -344 + ^ x19: .cfa -432 + ^ x20: .cfa -424 + ^ +STACK CFI 97118 v10: .cfa -336 + ^ v11: .cfa -328 + ^ v12: .cfa -320 + ^ v13: .cfa -312 + ^ v14: .cfa -304 + ^ v15: .cfa -296 + ^ x21: .cfa -416 + ^ x22: .cfa -408 + ^ x23: .cfa -400 + ^ x24: .cfa -392 + ^ x25: .cfa -384 + ^ x26: .cfa -376 + ^ x27: .cfa -368 + ^ x28: .cfa -360 + ^ +STACK CFI 97160 .cfa: sp 464 + +STACK CFI 9716c v8: v8 v9: v9 +STACK CFI 97170 x19: x19 x20: x20 +STACK CFI 97174 v10: v10 v11: v11 +STACK CFI 97178 x21: x21 x22: x22 +STACK CFI 9717c v12: v12 v13: v13 +STACK CFI 97180 x23: x23 x24: x24 +STACK CFI 97184 v14: v14 v15: v15 +STACK CFI 97188 x25: x25 x26: x26 +STACK CFI 9718c x27: x27 x28: x28 +STACK CFI 97190 .ra: .ra x29: x29 +STACK CFI 97194 .cfa: sp 0 + +STACK CFI 97198 .cfa: x29 448 + .ra: .cfa -440 + ^ v10: .cfa -336 + ^ v11: .cfa -328 + ^ v12: .cfa -320 + ^ v13: .cfa -312 + ^ v14: .cfa -304 + ^ v15: .cfa -296 + ^ v8: .cfa -352 + ^ v9: .cfa -344 + ^ x19: .cfa -432 + ^ x20: .cfa -424 + ^ x21: .cfa -416 + ^ x22: .cfa -408 + ^ x23: .cfa -400 + ^ x24: .cfa -392 + ^ x25: .cfa -384 + ^ x26: .cfa -376 + ^ x27: .cfa -368 + ^ x28: .cfa -360 + ^ x29: .cfa -448 + ^ +STACK CFI INIT 97b28 54 .cfa: sp 0 + .ra: x30 +STACK CFI 97b2c .cfa: sp 48 + +STACK CFI 97b44 .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 97b48 .cfa: x29 32 + +STACK CFI 97b70 .cfa: sp 48 + +STACK CFI 97b74 .ra: .ra x29: x29 +STACK CFI 97b78 .cfa: sp 0 + +STACK CFI INIT 97b7c 154 .cfa: sp 0 + .ra: x30 +STACK CFI 97b80 .cfa: sp 160 + +STACK CFI 97b8c .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 97b90 .cfa: x29 144 + +STACK CFI 97b98 x19: .cfa -128 + ^ x20: .cfa -120 + ^ +STACK CFI 97bac x21: .cfa -112 + ^ +STACK CFI 97c5c .cfa: sp 160 + +STACK CFI 97c68 x19: x19 x20: x20 +STACK CFI 97c6c x21: x21 +STACK CFI 97c70 .ra: .ra x29: x29 +STACK CFI 97c74 .cfa: sp 0 + +STACK CFI 97c78 .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 2342c 38 .cfa: sp 0 + .ra: x30 +STACK CFI 23430 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23438 .cfa: x29 32 + +STACK CFI 23458 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 20898 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 97cd0 84 .cfa: sp 0 + .ra: x30 +STACK CFI 97cd4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 97ce0 .cfa: x29 48 + +STACK CFI 97ce4 x19: .cfa -32 + ^ +STACK CFI 97d08 x19: x19 +STACK CFI 97d0c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 97d10 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 97d44 x19: x19 +STACK CFI 97d48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 97d4c .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 97d54 9c .cfa: sp 0 + .ra: x30 +STACK CFI 97d58 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 97d5c .cfa: x29 48 + +STACK CFI 97d60 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 97d68 x21: .cfa -16 + ^ +STACK CFI 97db4 x19: x19 x20: x20 +STACK CFI 97db8 x21: x21 +STACK CFI 97dbc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 97dc0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 97df0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 97df4 58 .cfa: sp 0 + .ra: x30 +STACK CFI 97df8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 97e00 .cfa: x29 48 + +STACK CFI 97e04 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 97e10 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 97e40 x19: x19 x20: x20 +STACK CFI 97e44 x21: x21 x22: x22 +STACK CFI 97e48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 97e4c 1d0 .cfa: sp 0 + .ra: x30 +STACK CFI 97e50 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 97e54 .cfa: x29 112 + +STACK CFI 97e60 x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ +STACK CFI 97e88 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x27: .cfa -32 + ^ +STACK CFI 97f20 x19: x19 x20: x20 +STACK CFI 97f24 x21: x21 x22: x22 +STACK CFI 97f28 x23: x23 x24: x24 +STACK CFI 97f2c x25: x25 x26: x26 +STACK CFI 97f30 x27: x27 +STACK CFI 97f34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 97f38 .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ x29: .cfa -112 + ^ +STACK CFI 97f40 x27: x27 +STACK CFI 97f48 x19: x19 x20: x20 +STACK CFI 97f4c x23: x23 x24: x24 +STACK CFI 97f50 x25: x25 x26: x26 +STACK CFI 97f60 x21: x21 x22: x22 +STACK CFI 97f64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 97f68 .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ x29: .cfa -112 + ^ +STACK CFI INIT 9801c 84 .cfa: sp 0 + .ra: x30 +STACK CFI 98020 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 98028 .cfa: x29 48 + +STACK CFI 98030 x19: .cfa -32 + ^ +STACK CFI 98098 x19: x19 +STACK CFI 9809c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 980a0 b4 .cfa: sp 0 + .ra: x30 +STACK CFI 980a4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 980a8 .cfa: x29 64 + +STACK CFI 980ac x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 980b8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x23: .cfa -16 + ^ +STACK CFI 98100 x23: x23 +STACK CFI 98108 x19: x19 x20: x20 +STACK CFI 9810c x21: x21 x22: x22 +STACK CFI 98110 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98114 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI 9812c x23: x23 +STACK CFI 98134 x19: x19 x20: x20 +STACK CFI 98138 x21: x21 x22: x22 +STACK CFI 9813c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98140 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 98154 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 98158 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 23464 40 .cfa: sp 0 + .ra: x30 +STACK CFI 23468 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 23470 .cfa: x29 32 + +STACK CFI 23474 x19: .cfa -16 + ^ +STACK CFI 23490 x19: x19 +STACK CFI 23498 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9815c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 98160 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 98164 .cfa: x29 48 + +STACK CFI 98168 x21: .cfa -16 + ^ +STACK CFI 98170 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 98268 x21: x21 +STACK CFI 9826c x19: x19 x20: x20 +STACK CFI 98270 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 98280 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 208b4 28 .cfa: sp 0 + .ra: x30 +STACK CFI 208b8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 208bc .cfa: x29 32 + +STACK CFI INIT 98284 1d0 .cfa: sp 0 + .ra: x30 +STACK CFI 98288 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 9828c .cfa: x29 112 + +STACK CFI 9829c x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ +STACK CFI INIT 98454 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9845c 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9846c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 98470 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 98478 .cfa: x29 32 + +STACK CFI 9847c x19: .cfa -16 + ^ +STACK CFI 98494 x19: x19 +STACK CFI 98498 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9849c 50 .cfa: sp 0 + .ra: x30 +STACK CFI 984a0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 984a4 .cfa: x29 48 + +STACK CFI 984a8 x19: .cfa -32 + ^ +STACK CFI 984e4 x19: x19 +STACK CFI 984e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 984ec 50 .cfa: sp 0 + .ra: x30 +STACK CFI 984f0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 984f4 .cfa: x29 48 + +STACK CFI 984f8 x19: .cfa -32 + ^ +STACK CFI 98534 x19: x19 +STACK CFI 98538 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9853c 64 .cfa: sp 0 + .ra: x30 +STACK CFI 98540 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 98548 .cfa: x29 32 + +STACK CFI 9854c x19: .cfa -16 + ^ +STACK CFI 98598 x19: x19 +STACK CFI 9859c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 985a0 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 985a4 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 985a8 .cfa: x29 96 + +STACK CFI 985b0 x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ +STACK CFI 98634 x19: x19 x20: x20 +STACK CFI 98638 x21: x21 x22: x22 +STACK CFI 9863c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98640 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x29: .cfa -96 + ^ +STACK CFI 98654 x21: x21 x22: x22 +STACK CFI 98658 x19: x19 x20: x20 +STACK CFI 9865c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 98660 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 98690 48 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 986d8 1b8 .cfa: sp 0 + .ra: x30 +STACK CFI 986dc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 986e0 .cfa: x29 48 + +STACK CFI 986e4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 98790 x19: x19 x20: x20 +STACK CFI 98794 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98798 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x29: .cfa -48 + ^ +STACK CFI 98888 x19: x19 x20: x20 +STACK CFI 9888c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 98890 184 .cfa: sp 0 + .ra: x30 +STACK CFI 98894 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 98898 .cfa: x29 64 + +STACK CFI 988a0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 988b4 x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 98960 x21: x21 x22: x22 +STACK CFI 98964 x19: x19 x20: x20 +STACK CFI 98968 x23: x23 x24: x24 +STACK CFI 9896c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98970 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI 989b0 x21: x21 x22: x22 +STACK CFI 989b4 x19: x19 x20: x20 +STACK CFI 989b8 x23: x23 x24: x24 +STACK CFI 989bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 989c0 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI 989d0 x21: x21 x22: x22 +STACK CFI 989d4 x19: x19 x20: x20 +STACK CFI 989d8 x23: x23 x24: x24 +STACK CFI 989dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 989e0 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 98a14 158 .cfa: sp 0 + .ra: x30 +STACK CFI 98a18 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 98a1c .cfa: x29 80 + +STACK CFI 98a2c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ +STACK CFI 98ae8 x19: x19 x20: x20 +STACK CFI 98aec x21: x21 x22: x22 +STACK CFI 98af0 x23: x23 x24: x24 +STACK CFI 98af4 x25: x25 +STACK CFI 98af8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98afc .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ x29: .cfa -80 + ^ +STACK CFI 98b30 x25: x25 +STACK CFI 98b34 x19: x19 x20: x20 +STACK CFI 98b38 x21: x21 x22: x22 +STACK CFI 98b3c x23: x23 x24: x24 +STACK CFI 98b40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98b44 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 98b6c 124 .cfa: sp 0 + .ra: x30 +STACK CFI 98b70 .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 98b74 .cfa: x29 128 + +STACK CFI 98b78 x19: .cfa -112 + ^ x20: .cfa -104 + ^ +STACK CFI 98b8c x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ +STACK CFI 98b94 x25: .cfa -64 + ^ +STACK CFI 98be4 x19: x19 x20: x20 +STACK CFI 98be8 x21: x21 x22: x22 +STACK CFI 98bec x23: x23 x24: x24 +STACK CFI 98bf0 x25: x25 +STACK CFI 98bf4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98bf8 .cfa: x29 128 + .ra: .cfa -120 + ^ x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x29: .cfa -128 + ^ +STACK CFI 98c64 x25: x25 +STACK CFI 98c68 x19: x19 x20: x20 +STACK CFI 98c6c x21: x21 x22: x22 +STACK CFI 98c70 x23: x23 x24: x24 +STACK CFI 98c74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98c78 .cfa: x29 128 + .ra: .cfa -120 + ^ x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x29: .cfa -128 + ^ +STACK CFI INIT 98c90 94 .cfa: sp 0 + .ra: x30 +STACK CFI 98c94 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 98c98 .cfa: x29 48 + +STACK CFI 98c9c x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 98ca4 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 98cf4 x19: x19 x20: x20 +STACK CFI 98cf8 x21: x21 x22: x22 +STACK CFI 98cfc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98d00 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 98d18 x19: x19 x20: x20 +STACK CFI 98d1c x21: x21 x22: x22 +STACK CFI 98d20 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 98d24 48 .cfa: sp 0 + .ra: x30 +STACK CFI 98d28 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 98d2c .cfa: x29 32 + +STACK CFI 98d30 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 98d64 x19: x19 x20: x20 +STACK CFI 98d68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 98d6c 44 .cfa: sp 0 + .ra: x30 +STACK CFI 98d70 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 98d74 .cfa: x29 32 + +STACK CFI 98d78 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 98da8 x19: x19 x20: x20 +STACK CFI 98dac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 98db0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 98db8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 98dc8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 98dcc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 98dd4 .cfa: x29 32 + +STACK CFI 98dd8 x19: .cfa -16 + ^ +STACK CFI 98df0 x19: x19 +STACK CFI 98df4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 98df8 270 .cfa: sp 0 + .ra: x30 +STACK CFI 98dfc .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 98e00 .cfa: x29 144 + +STACK CFI 98e14 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI 98f34 x19: x19 x20: x20 +STACK CFI 98f38 x21: x21 x22: x22 +STACK CFI 98f3c x23: x23 x24: x24 +STACK CFI 98f40 x25: x25 x26: x26 +STACK CFI 98f44 x27: x27 x28: x28 +STACK CFI 98f48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98f4c .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ x29: .cfa -144 + ^ +STACK CFI 98fac x19: x19 x20: x20 +STACK CFI 98fb0 x21: x21 x22: x22 +STACK CFI 98fb4 x23: x23 x24: x24 +STACK CFI 98fb8 x25: x25 x26: x26 +STACK CFI 98fbc x27: x27 x28: x28 +STACK CFI 98fc0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 98fc4 .cfa: x29 144 + .ra: .cfa -136 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 99068 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99070 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99078 60 .cfa: sp 0 + .ra: x30 +STACK CFI 9907c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 99084 .cfa: x29 32 + +STACK CFI 99088 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 990ac x19: x19 x20: x20 +STACK CFI 990b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 990b8 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI INIT 990d8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 990e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 990ec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 990f4 .cfa: x29 32 + +STACK CFI 990f8 x19: .cfa -16 + ^ +STACK CFI 99110 x19: x19 +STACK CFI 99114 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 99118 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99128 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9912c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 99134 .cfa: x29 32 + +STACK CFI 99138 x19: .cfa -16 + ^ +STACK CFI 99150 x19: x19 +STACK CFI 99154 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 99158 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9915c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 99160 .cfa: x29 32 + +STACK CFI 99164 x19: .cfa -16 + ^ +STACK CFI 99174 x19: x19 +STACK CFI 99178 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9917c 20 .cfa: sp 0 + .ra: x30 +STACK CFI 99180 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI 99184 .cfa: x29 16 + +STACK CFI 99198 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9919c 50 .cfa: sp 0 + .ra: x30 +STACK CFI 991a0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 991a8 .cfa: x29 32 + +STACK CFI 991ac x19: .cfa -16 + ^ +STACK CFI 991cc x19: x19 +STACK CFI 991d0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 991d4 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI 991e4 x19: x19 +STACK CFI 991e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 991ec 7c .cfa: sp 0 + .ra: x30 +STACK CFI 991f0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 991f8 .cfa: x29 48 + +STACK CFI 991fc x19: .cfa -32 + ^ +STACK CFI 9921c x19: x19 +STACK CFI 99220 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 99224 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI 99248 x19: x19 +STACK CFI 99254 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 99258 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 99268 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99270 3c .cfa: sp 0 + .ra: x30 +STACK CFI 99274 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 99278 .cfa: x29 32 + +STACK CFI 9927c x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 992a4 x19: x19 x20: x20 +STACK CFI 992a8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 992ac 4c .cfa: sp 0 + .ra: x30 +STACK CFI 992b0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 992b4 .cfa: x29 64 + +STACK CFI 992bc x19: .cfa -48 + ^ +STACK CFI 992f0 x19: x19 +STACK CFI 992f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 992f8 3c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99334 80 .cfa: sp 0 + .ra: x30 +STACK CFI 99338 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 99344 .cfa: x29 32 + +STACK CFI 99348 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 99358 x19: x19 x20: x20 +STACK CFI 9935c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 99360 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 9937c x19: x19 x20: x20 +STACK CFI 99380 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 99384 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x20: .cfa -8 + ^ x29: .cfa -32 + ^ +STACK CFI 993ac x19: x19 x20: x20 +STACK CFI 993b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 993b4 60 .cfa: sp 0 + .ra: x30 +STACK CFI 993b8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 993c0 .cfa: x29 48 + +STACK CFI 993c4 x19: .cfa -32 + ^ +STACK CFI 9940c x19: x19 +STACK CFI 99410 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 99414 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99424 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9942c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99434 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9943c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99448 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99458 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99468 1f4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9965c 1f0 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9984c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99858 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99860 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99868 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99878 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99880 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99894 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 998a8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 998ac .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 998b0 .cfa: x29 32 + +STACK CFI 998b4 x19: .cfa -16 + ^ +STACK CFI 998c4 x19: x19 +STACK CFI 998c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 998cc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 998d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 998d4 .cfa: x29 32 + +STACK CFI 998d8 x19: .cfa -16 + ^ +STACK CFI 998e8 x19: x19 +STACK CFI 998ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 998f0 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99914 5c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99970 24 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99994 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 999a8 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 999bc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 999c0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 999c4 .cfa: x29 32 + +STACK CFI 999c8 x19: .cfa -16 + ^ +STACK CFI 999d8 x19: x19 +STACK CFI 999dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 999e0 24 .cfa: sp 0 + .ra: x30 +STACK CFI 999e4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 999e8 .cfa: x29 32 + +STACK CFI 999ec x19: .cfa -16 + ^ +STACK CFI 999fc x19: x19 +STACK CFI 99a00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 99a04 48 .cfa: sp 0 + .ra: x30 +STACK CFI 99a08 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 99a10 .cfa: x29 32 + +STACK CFI 99a14 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI 99a44 x19: x19 x20: x20 +STACK CFI 99a48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 99a4c f4 .cfa: sp 0 + .ra: x30 +STACK CFI 99a50 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 99a54 .cfa: x29 64 + +STACK CFI 99a58 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 99a64 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 99abc x19: x19 x20: x20 +STACK CFI 99ac0 x21: x21 x22: x22 +STACK CFI 99ac4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 99ac8 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 99b40 108 .cfa: sp 0 + .ra: x30 +STACK CFI 99b44 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 99b4c .cfa: x29 64 + +STACK CFI 99b50 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 99b5c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 99bbc x21: x21 x22: x22 +STACK CFI 99bc0 x19: x19 x20: x20 +STACK CFI 99bc4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 99bc8 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 99c48 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99c5c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99c70 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99c9c 2c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99cc8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99cd0 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99cd8 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99cf4 34 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99d28 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99d44 34 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99d78 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99d80 208 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99f88 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99f9c 30 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 99fcc 44 .cfa: sp 0 + .ra: x30 +STACK CFI 99fd0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 99fd8 .cfa: x29 32 + +STACK CFI 99fdc x19: .cfa -16 + ^ +STACK CFI 9a008 x19: x19 +STACK CFI 9a00c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a010 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a024 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9a028 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a02c .cfa: x29 32 + +STACK CFI 9a030 x19: .cfa -16 + ^ +STACK CFI 9a040 x19: x19 +STACK CFI 9a044 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a048 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9a04c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a050 .cfa: x29 32 + +STACK CFI 9a054 x19: .cfa -16 + ^ +STACK CFI 9a064 x19: x19 +STACK CFI 9a068 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a06c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a070 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a074 .cfa: x29 32 + +STACK CFI 9a078 x19: .cfa -16 + ^ +STACK CFI 9a094 x19: x19 +STACK CFI 9a098 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a09c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a0a0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a0a4 .cfa: x29 32 + +STACK CFI 9a0a8 x19: .cfa -16 + ^ +STACK CFI 9a0c4 x19: x19 +STACK CFI 9a0c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a0cc c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a0d8 40 .cfa: sp 0 + .ra: x30 +STACK CFI 9a0dc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a0e0 .cfa: x29 32 + +STACK CFI 9a114 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a118 5c .cfa: sp 0 + .ra: x30 +STACK CFI 9a11c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a120 .cfa: x29 48 + +STACK CFI 9a170 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a174 184 .cfa: sp 0 + .ra: x30 +STACK CFI 9a178 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a17c .cfa: x29 48 + +STACK CFI 9a22c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9a230 .cfa: x29 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a23c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9a240 .cfa: x29 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a24c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9a250 .cfa: x29 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a25c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9a260 .cfa: x29 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 9a2f8 188 .cfa: sp 0 + .ra: x30 +STACK CFI 9a2fc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a300 .cfa: x29 48 + +STACK CFI 9a3dc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9a3e0 .cfa: x29 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a3e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9a3ec .cfa: x29 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 9a480 78 .cfa: sp 0 + .ra: x30 +STACK CFI 9a484 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a48c .cfa: x29 48 + +STACK CFI 9a490 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 9a498 x21: .cfa -16 + ^ +STACK CFI 9a4e4 x21: x21 +STACK CFI 9a4e8 x19: x19 x20: x20 +STACK CFI 9a4ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9a4f0 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 9a4f8 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a500 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a508 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a510 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a518 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a520 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a528 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a530 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a538 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a540 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a548 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a550 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a558 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a560 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a568 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a570 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a578 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a580 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a588 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a590 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a598 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a5ac 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a5c0 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a5d4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9a5e8 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9a5ec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a5f0 .cfa: x29 32 + +STACK CFI 9a5f4 x19: .cfa -16 + ^ +STACK CFI 9a604 x19: x19 +STACK CFI 9a608 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a60c 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9a610 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a614 .cfa: x29 32 + +STACK CFI 9a618 x19: .cfa -16 + ^ +STACK CFI 9a628 x19: x19 +STACK CFI 9a62c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a630 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9a634 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a638 .cfa: x29 32 + +STACK CFI 9a63c x19: .cfa -16 + ^ +STACK CFI 9a64c x19: x19 +STACK CFI 9a650 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a654 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9a658 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a65c .cfa: x29 32 + +STACK CFI 9a660 x19: .cfa -16 + ^ +STACK CFI 9a670 x19: x19 +STACK CFI 9a674 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a678 70 .cfa: sp 0 + .ra: x30 +STACK CFI 9a67c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a688 .cfa: x29 32 + +STACK CFI 9a68c x19: .cfa -16 + ^ +STACK CFI 9a6e0 x19: x19 +STACK CFI 9a6e4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a6e8 70 .cfa: sp 0 + .ra: x30 +STACK CFI 9a6ec .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a6f8 .cfa: x29 32 + +STACK CFI 9a6fc x19: .cfa -16 + ^ +STACK CFI 9a750 x19: x19 +STACK CFI 9a754 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a758 70 .cfa: sp 0 + .ra: x30 +STACK CFI 9a75c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a768 .cfa: x29 32 + +STACK CFI 9a76c x19: .cfa -16 + ^ +STACK CFI 9a7c0 x19: x19 +STACK CFI 9a7c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a7c8 70 .cfa: sp 0 + .ra: x30 +STACK CFI 9a7cc .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9a7d8 .cfa: x29 32 + +STACK CFI 9a7dc x19: .cfa -16 + ^ +STACK CFI 9a830 x19: x19 +STACK CFI 9a834 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a838 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a83c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a848 .cfa: x29 48 + +STACK CFI 9a860 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a868 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a86c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a878 .cfa: x29 48 + +STACK CFI 9a890 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a898 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a89c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a8a8 .cfa: x29 48 + +STACK CFI 9a8c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a8c8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a8cc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a8d8 .cfa: x29 48 + +STACK CFI 9a8f0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a8f8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a8fc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a908 .cfa: x29 48 + +STACK CFI 9a920 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a928 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a92c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a938 .cfa: x29 48 + +STACK CFI 9a950 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a958 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a95c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a968 .cfa: x29 48 + +STACK CFI 9a980 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a988 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a98c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a998 .cfa: x29 48 + +STACK CFI 9a9b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a9b8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a9bc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a9c8 .cfa: x29 48 + +STACK CFI 9a9e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9a9e8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9a9ec .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9a9f8 .cfa: x29 48 + +STACK CFI 9aa10 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9aa18 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9aa1c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9aa28 .cfa: x29 48 + +STACK CFI 9aa40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9aa48 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9aa4c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9aa58 .cfa: x29 48 + +STACK CFI 9aa70 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9aa78 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9aa7c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9aa88 .cfa: x29 48 + +STACK CFI 9aaa0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9aaa8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9aaac .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9aab8 .cfa: x29 48 + +STACK CFI 9aad0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9aad8 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9aadc .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9aae8 .cfa: x29 48 + +STACK CFI 9ab00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9ab08 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9ab0c .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9ab18 .cfa: x29 48 + +STACK CFI 9ab30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9ab38 78 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9abb0 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9abc0 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9abcc 12c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9acf8 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9ad20 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9ad2c c .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9ad38 180 .cfa: sp 0 + .ra: x30 +STACK CFI 9ad3c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 9ad40 .cfa: x29 112 + +STACK CFI 9ad44 x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 9ad8c x19: x19 x20: x20 +STACK CFI 9ad90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9ad94 .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x29: .cfa -112 + ^ +STACK CFI INIT 9aeb8 120 .cfa: sp 0 + .ra: x30 +STACK CFI 9aebc .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 9aec8 .cfa: x29 96 + +STACK CFI 9aedc x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x28: .cfa -8 + ^ +STACK CFI 9af94 x19: x19 x20: x20 +STACK CFI 9af98 x21: x21 x22: x22 +STACK CFI 9af9c x23: x23 x24: x24 +STACK CFI 9afa0 x25: x25 x26: x26 +STACK CFI 9afa4 x27: x27 x28: x28 +STACK CFI 9afa8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9afac .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x28: .cfa -8 + ^ x29: .cfa -96 + ^ +STACK CFI 9afc0 x19: x19 x20: x20 +STACK CFI 9afc4 x21: x21 x22: x22 +STACK CFI 9afc8 x23: x23 x24: x24 +STACK CFI 9afcc x25: x25 x26: x26 +STACK CFI 9afd0 x27: x27 x28: x28 +STACK CFI 9afd4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9afd8 7b4 .cfa: sp 0 + .ra: x30 +STACK CFI 9afdc .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI 9afe8 .cfa: x29 128 + +STACK CFI 9aff0 x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI 9affc x25: .cfa -64 + ^ x26: .cfa -56 + ^ +STACK CFI 9b00c x19: .cfa -112 + ^ x20: .cfa -104 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI 9b0ec x19: x19 x20: x20 +STACK CFI 9b0f0 x21: x21 x22: x22 +STACK CFI 9b0f4 x23: x23 x24: x24 +STACK CFI 9b0f8 x25: x25 x26: x26 +STACK CFI 9b0fc x27: x27 x28: x28 +STACK CFI 9b100 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9b104 .cfa: x29 128 + .ra: .cfa -120 + ^ x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ x29: .cfa -128 + ^ +STACK CFI INIT 9b78c 128 .cfa: sp 0 + .ra: x30 +STACK CFI 9b790 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 9b798 .cfa: x29 96 + +STACK CFI 9b7ac x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x28: .cfa -8 + ^ +STACK CFI 9b868 x21: x21 x22: x22 +STACK CFI 9b874 x19: x19 x20: x20 +STACK CFI 9b878 x23: x23 x24: x24 +STACK CFI 9b87c x25: x25 x26: x26 +STACK CFI 9b880 x27: x27 x28: x28 +STACK CFI 9b884 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9b888 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x28: .cfa -8 + ^ x29: .cfa -96 + ^ +STACK CFI 9b89c x19: x19 x20: x20 +STACK CFI 9b8a0 x21: x21 x22: x22 +STACK CFI 9b8a4 x23: x23 x24: x24 +STACK CFI 9b8a8 x25: x25 x26: x26 +STACK CFI 9b8ac x27: x27 x28: x28 +STACK CFI 9b8b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9b8b4 1c0 .cfa: sp 0 + .ra: x30 +STACK CFI 9b8b8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9b8c0 .cfa: x29 48 + +STACK CFI 9b8c8 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 9b9d8 x19: x19 x20: x20 +STACK CFI 9b9dc x21: x21 x22: x22 +STACK CFI 9b9e0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9b9e4 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 9ba38 x19: x19 x20: x20 +STACK CFI 9ba3c x21: x21 x22: x22 +STACK CFI 9ba40 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9ba44 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 9ba74 46c .cfa: sp 0 + .ra: x30 +STACK CFI 9ba78 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 9ba7c .cfa: x29 144 + +STACK CFI 9ba84 x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI 9baa4 v8: .cfa -48 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ +STACK CFI 9bda4 x19: x19 x20: x20 +STACK CFI 9bda8 x21: x21 x22: x22 +STACK CFI 9bdac x23: x23 x24: x24 +STACK CFI 9bdb0 x25: x25 x26: x26 +STACK CFI 9bdb4 x27: x27 x28: x28 +STACK CFI 9bdb8 v8: v8 +STACK CFI 9bdbc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9bdc0 .cfa: x29 144 + .ra: .cfa -136 + ^ v8: .cfa -48 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 9bee0 44 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9bf24 84 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9bfa8 17c .cfa: sp 0 + .ra: x30 +STACK CFI 9bfac .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI 9bfb4 .cfa: x29 144 + +STACK CFI 9bfcc v8: .cfa -48 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI 9c0e0 x19: x19 x20: x20 +STACK CFI 9c0e4 x21: x21 x22: x22 +STACK CFI 9c0e8 x23: x23 x24: x24 +STACK CFI 9c0ec x25: x25 x26: x26 +STACK CFI 9c0f0 x27: x27 x28: x28 +STACK CFI 9c0f4 v8: v8 +STACK CFI 9c0f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9c0fc .cfa: x29 144 + .ra: .cfa -136 + ^ v8: .cfa -48 + ^ x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ x29: .cfa -144 + ^ +STACK CFI INIT 9c124 3a8 .cfa: sp 0 + .ra: x30 +STACK CFI 9c128 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 9c130 .cfa: x29 80 + +STACK CFI 9c134 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 9c240 x19: x19 x20: x20 +STACK CFI 9c244 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9c248 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x29: .cfa -80 + ^ +STACK CFI 9c418 x19: x19 x20: x20 +STACK CFI 9c41c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9c420 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 9c4cc d8 .cfa: sp 0 + .ra: x30 +STACK CFI 9c4d0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 9c4d8 .cfa: x29 80 + +STACK CFI 9c4e4 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI 9c59c x19: x19 x20: x20 +STACK CFI 9c5a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9c5a4 28 .cfa: sp 0 + .ra: x30 +STACK CFI 9c5a8 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9c5ac .cfa: x29 32 + +STACK CFI 9c5c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9c5cc 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9c5d0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9c5d4 .cfa: x29 32 + +STACK CFI 9c5ec .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9c5f0 27c .cfa: sp 0 + .ra: x30 +STACK CFI 9c5f4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 9c600 .cfa: x29 64 + +STACK CFI 9c604 x19: .cfa -48 + ^ +STACK CFI 9c7a8 x19: x19 +STACK CFI 9c7c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9c7cc .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x29: .cfa -64 + ^ +STACK CFI 9c7d4 x19: x19 +STACK CFI 9c7d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9c7dc .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x29: .cfa -64 + ^ +STACK CFI 9c810 x19: x19 +STACK CFI 9c818 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9c81c .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x29: .cfa -64 + ^ +STACK CFI 9c84c x19: x19 +STACK CFI 9c854 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9c858 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 9c880 1f0 .cfa: sp 0 + .ra: x30 +STACK CFI 9c884 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 9c888 .cfa: x29 80 + +STACK CFI 9c88c x19: .cfa -64 + ^ +STACK CFI 9c9ac x19: x19 +STACK CFI 9c9b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9c9b8 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x29: .cfa -80 + ^ +STACK CFI 9c9cc x19: x19 +STACK CFI 9c9d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9c9e0 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 9ca70 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9ca74 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9ca78 .cfa: x29 32 + +STACK CFI 9ca90 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9ca94 f0 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9cb84 5f8 .cfa: sp 0 + .ra: x30 +STACK CFI 9cb88 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 9cb90 .cfa: x29 80 + +STACK CFI 9cb9c x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ +STACK CFI 9cd5c x23: x23 +STACK CFI 9cd60 x19: x19 x20: x20 +STACK CFI 9cd64 x21: x21 x22: x22 +STACK CFI 9cd68 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9cd6c .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x29: .cfa -80 + ^ +STACK CFI 9d0e8 x19: x19 x20: x20 +STACK CFI 9d0ec x21: x21 x22: x22 +STACK CFI 9d0f0 x23: x23 +STACK CFI 9d0f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9d0f8 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 9d17c 220 .cfa: sp 0 + .ra: x30 +STACK CFI 9d180 .cfa: sp 4096 + +STACK CFI 9d188 .cfa: sp 4944 + +STACK CFI 9d194 .cfa: sp 5008 + .ra: .cfa -5000 + ^ x29: .cfa -5008 + ^ +STACK CFI 9d198 .cfa: x29 5008 + +STACK CFI 9d19c x21: .cfa -4976 + ^ x22: .cfa -4968 + ^ +STACK CFI 9d1a4 x19: .cfa -4992 + ^ x20: .cfa -4984 + ^ +STACK CFI 9d1b4 x23: .cfa -4960 + ^ x24: .cfa -4952 + ^ +STACK CFI 9d238 x19: x19 x20: x20 +STACK CFI 9d23c x21: x21 x22: x22 +STACK CFI 9d240 x23: x23 x24: x24 +STACK CFI 9d244 .cfa: sp 4944 + .ra: .ra x29: x29 +STACK CFI 9d248 .cfa: sp 4096 + +STACK CFI 9d24c .cfa: sp 4032 + +STACK CFI 9d250 .cfa: x29 5008 + .ra: .cfa -5000 + ^ x19: .cfa -4992 + ^ x20: .cfa -4984 + ^ x21: .cfa -4976 + ^ x22: .cfa -4968 + ^ x23: .cfa -4960 + ^ x24: .cfa -4952 + ^ x29: .cfa -5008 + ^ +STACK CFI 9d32c x19: x19 x20: x20 +STACK CFI 9d330 x21: x21 x22: x22 +STACK CFI 9d334 x23: x23 x24: x24 +STACK CFI 9d338 .cfa: sp 4944 + .ra: .ra x29: x29 +STACK CFI 9d33c .cfa: sp 4096 + +STACK CFI 9d340 .cfa: sp 4032 + +STACK CFI 9d344 .cfa: x29 5008 + .ra: .cfa -5000 + ^ x19: .cfa -4992 + ^ x20: .cfa -4984 + ^ x21: .cfa -4976 + ^ x22: .cfa -4968 + ^ x23: .cfa -4960 + ^ x24: .cfa -4952 + ^ x29: .cfa -5008 + ^ +STACK CFI 9d370 x19: x19 x20: x20 +STACK CFI 9d374 x21: x21 x22: x22 +STACK CFI 9d378 x23: x23 x24: x24 +STACK CFI 9d37c .cfa: sp 4944 + .ra: .ra x29: x29 +STACK CFI 9d380 .cfa: sp 4096 + +STACK CFI 9d384 .cfa: sp 4032 + +STACK CFI 9d388 .cfa: x29 5008 + .ra: .cfa -5000 + ^ x19: .cfa -4992 + ^ x20: .cfa -4984 + ^ x21: .cfa -4976 + ^ x22: .cfa -4968 + ^ x23: .cfa -4960 + ^ x24: .cfa -4952 + ^ x29: .cfa -5008 + ^ +STACK CFI INIT 9d39c 334 .cfa: sp 0 + .ra: x30 +STACK CFI 9d3a0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI 9d3a8 .cfa: x29 80 + +STACK CFI 9d3b4 x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ +STACK CFI 9d3c8 x25: .cfa -16 + ^ +STACK CFI 9d4a0 x19: x19 x20: x20 +STACK CFI 9d4a4 x21: x21 x22: x22 +STACK CFI 9d4a8 x23: x23 x24: x24 +STACK CFI 9d4ac x25: x25 +STACK CFI 9d4b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9d4b4 .cfa: x29 80 + .ra: .cfa -72 + ^ x19: .cfa -64 + ^ x20: .cfa -56 + ^ x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ x29: .cfa -80 + ^ +STACK CFI INIT 9d6d0 dc .cfa: sp 0 + .ra: x30 +STACK CFI 9d6d4 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9d6d8 .cfa: x29 48 + +STACK CFI 9d6e0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 9d6f0 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 9d734 x19: x19 x20: x20 +STACK CFI 9d738 x21: x21 x22: x22 +STACK CFI 9d73c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9d740 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 9d75c x19: x19 x20: x20 +STACK CFI 9d760 x21: x21 x22: x22 +STACK CFI 9d764 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9d768 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT 9d7ac 230 .cfa: sp 0 + .ra: x30 +STACK CFI 9d7b0 .cfa: sp 4096 + +STACK CFI 9d7b8 .cfa: sp 5008 + +STACK CFI 9d7c0 .cfa: sp 5056 + .ra: .cfa -5048 + ^ x29: .cfa -5056 + ^ +STACK CFI 9d7c4 .cfa: x29 5056 + +STACK CFI 9d7c8 x21: .cfa -5024 + ^ +STACK CFI 9d7d0 x19: .cfa -5040 + ^ x20: .cfa -5032 + ^ +STACK CFI 9d8e4 x19: x19 x20: x20 +STACK CFI 9d8e8 x21: x21 +STACK CFI 9d8ec .cfa: sp 5008 + .ra: .ra x29: x29 +STACK CFI 9d8f0 .cfa: sp 4096 + +STACK CFI 9d8f4 .cfa: sp 4048 + +STACK CFI 9d8f8 .cfa: x29 5056 + .ra: .cfa -5048 + ^ x19: .cfa -5040 + ^ x20: .cfa -5032 + ^ x21: .cfa -5024 + ^ x29: .cfa -5056 + ^ +STACK CFI 9d8fc x19: x19 x20: x20 +STACK CFI 9d900 x21: x21 +STACK CFI 9d908 .cfa: sp 5008 + .ra: .ra x29: x29 +STACK CFI 9d910 .cfa: sp 4096 + +STACK CFI 9d914 .cfa: sp 4048 + +STACK CFI 9d918 .cfa: x29 5056 + .ra: .cfa -5048 + ^ x19: .cfa -5040 + ^ x20: .cfa -5032 + ^ x21: .cfa -5024 + ^ x29: .cfa -5056 + ^ +STACK CFI 9d91c x19: x19 x20: x20 +STACK CFI 9d920 x21: x21 +STACK CFI 9d928 .cfa: sp 5008 + .ra: .ra x29: x29 +STACK CFI 9d92c .cfa: sp 4096 + +STACK CFI 9d930 .cfa: sp 4048 + +STACK CFI 9d934 .cfa: x29 5056 + .ra: .cfa -5048 + ^ x19: .cfa -5040 + ^ x20: .cfa -5032 + ^ x21: .cfa -5024 + ^ x29: .cfa -5056 + ^ +STACK CFI INIT 9d9dc 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9d9e0 210 .cfa: sp 0 + .ra: x30 +STACK CFI 9d9e4 .cfa: sp 432 + .ra: .cfa -424 + ^ x29: .cfa -432 + ^ +STACK CFI 9d9f0 .cfa: x29 432 + +STACK CFI 9d9f4 x19: .cfa -416 + ^ x20: .cfa -408 + ^ +STACK CFI 9d9fc x21: .cfa -400 + ^ +STACK CFI 9db10 x19: x19 x20: x20 +STACK CFI 9db14 x21: x21 +STACK CFI 9db18 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9db1c .cfa: x29 432 + .ra: .cfa -424 + ^ x19: .cfa -416 + ^ x20: .cfa -408 + ^ x21: .cfa -400 + ^ x29: .cfa -432 + ^ +STACK CFI 9db24 x21: x21 +STACK CFI 9db2c x19: x19 x20: x20 +STACK CFI 9db30 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9db34 .cfa: x29 432 + .ra: .cfa -424 + ^ x19: .cfa -416 + ^ x20: .cfa -408 + ^ x21: .cfa -400 + ^ x29: .cfa -432 + ^ +STACK CFI 9db3c x21: x21 +STACK CFI 9db40 x19: x19 x20: x20 +STACK CFI 9db44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9db48 .cfa: x29 432 + .ra: .cfa -424 + ^ x19: .cfa -416 + ^ x20: .cfa -408 + ^ x21: .cfa -400 + ^ x29: .cfa -432 + ^ +STACK CFI INIT 9dbf0 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9dbf4 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9dbfc 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9dc04 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9dc0c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9dc14 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9dc28 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9dc2c .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9dc30 .cfa: x29 32 + +STACK CFI 9dc34 x19: .cfa -16 + ^ +STACK CFI 9dc44 x19: x19 +STACK CFI 9dc48 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9dc4c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9dc60 24 .cfa: sp 0 + .ra: x30 +STACK CFI 9dc64 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI 9dc68 .cfa: x29 32 + +STACK CFI 9dc6c x19: .cfa -16 + ^ +STACK CFI 9dc7c x19: x19 +STACK CFI 9dc80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9dc84 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9dc98 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9dcac 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9dcb0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9dcbc .cfa: x29 48 + +STACK CFI 9dcd4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9dcdc 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9dce0 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9dcec .cfa: x29 48 + +STACK CFI 9dd04 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9dd0c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9dd10 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9dd1c .cfa: x29 48 + +STACK CFI 9dd34 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9dd3c 30 .cfa: sp 0 + .ra: x30 +STACK CFI 9dd40 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9dd4c .cfa: x29 48 + +STACK CFI 9dd64 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 208dc 18 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9dd6c 1dc .cfa: sp 0 + .ra: x30 +STACK CFI 9dd74 .cfa: sp 320 + .ra: .cfa -312 + ^ x29: .cfa -320 + ^ +STACK CFI 9dd78 .cfa: x29 320 + +STACK CFI 9dd80 x19: .cfa -304 + ^ x20: .cfa -296 + ^ +STACK CFI 9dd98 x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ +STACK CFI 9de1c x19: x19 x20: x20 +STACK CFI 9de20 x21: x21 x22: x22 +STACK CFI 9de24 x23: x23 x24: x24 +STACK CFI 9de28 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9de2c .cfa: x29 320 + .ra: .cfa -312 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x29: .cfa -320 + ^ +STACK CFI 9def4 x19: x19 x20: x20 +STACK CFI 9def8 x21: x21 x22: x22 +STACK CFI 9defc x23: x23 x24: x24 +STACK CFI 9df00 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9df04 .cfa: x29 320 + .ra: .cfa -312 + ^ x19: .cfa -304 + ^ x20: .cfa -296 + ^ x21: .cfa -288 + ^ x22: .cfa -280 + ^ x23: .cfa -272 + ^ x24: .cfa -264 + ^ x29: .cfa -320 + ^ +STACK CFI INIT 9df48 1b8 .cfa: sp 0 + .ra: x30 +STACK CFI 9df4c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 9df50 .cfa: x29 64 + +STACK CFI 9df58 x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 9df64 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 9dfd4 x19: x19 x20: x20 +STACK CFI 9dfd8 x21: x21 x22: x22 +STACK CFI 9dfdc x23: x23 x24: x24 +STACK CFI 9dfe0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9dfe4 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI 9e0ac x21: x21 x22: x22 +STACK CFI 9e0b0 x19: x19 x20: x20 +STACK CFI 9e0b4 x23: x23 x24: x24 +STACK CFI 9e0b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9e0bc .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 9e100 208 .cfa: sp 0 + .ra: x30 +STACK CFI 9e104 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 9e108 .cfa: x29 64 + +STACK CFI 9e10c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 9e11c x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 9e150 x23: x23 +STACK CFI 9e154 x21: x21 x22: x22 +STACK CFI 9e160 x19: x19 x20: x20 +STACK CFI 9e164 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9e168 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 9e308 2b8 .cfa: sp 0 + .ra: x30 +STACK CFI 9e30c .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 9e310 .cfa: x29 64 + +STACK CFI 9e31c x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI 9e32c x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ +STACK CFI 9e368 x21: x21 x22: x22 +STACK CFI 9e374 x23: x23 +STACK CFI 9e378 x19: x19 x20: x20 +STACK CFI 9e37c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9e380 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 9e5c0 a8 .cfa: sp 0 + .ra: x30 +STACK CFI 9e5c4 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 9e5c8 .cfa: x29 64 + +STACK CFI 9e5d0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI 9e5e4 x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 9e640 x19: x19 x20: x20 +STACK CFI 9e644 x21: x21 x22: x22 +STACK CFI 9e648 x23: x23 x24: x24 +STACK CFI 9e64c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9e650 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 9e668 8b4 .cfa: sp 0 + .ra: x30 +STACK CFI 9e66c .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 9e678 .cfa: x29 160 + +STACK CFI 9e68c x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ +STACK CFI 9e710 x19: x19 x20: x20 +STACK CFI 9e714 x21: x21 x22: x22 +STACK CFI 9e718 x23: x23 +STACK CFI 9e71c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9e720 .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x29: .cfa -160 + ^ +STACK CFI 9e76c x23: x23 +STACK CFI 9e770 x19: x19 x20: x20 +STACK CFI 9e774 x21: x21 x22: x22 +STACK CFI 9e778 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9e77c .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x29: .cfa -160 + ^ +STACK CFI 9e7e8 x23: x23 +STACK CFI 9e7ec x19: x19 x20: x20 +STACK CFI 9e7f0 x21: x21 x22: x22 +STACK CFI 9e7f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9e7f8 .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x29: .cfa -160 + ^ +STACK CFI 9e87c x23: x23 +STACK CFI 9e880 x19: x19 x20: x20 +STACK CFI 9e884 x21: x21 x22: x22 +STACK CFI 9e888 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9e88c .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x29: .cfa -160 + ^ +STACK CFI INIT 9ef1c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT 9ef20 294 .cfa: sp 0 + .ra: x30 +STACK CFI 9ef24 .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI 9ef28 .cfa: x29 96 + +STACK CFI 9ef2c x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI 9ef44 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ +STACK CFI 9f188 x19: x19 x20: x20 +STACK CFI 9f18c x21: x21 x22: x22 +STACK CFI 9f190 x23: x23 x24: x24 +STACK CFI 9f194 x25: x25 x26: x26 +STACK CFI 9f198 x27: x27 +STACK CFI 9f19c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9f1a0 .cfa: x29 96 + .ra: .cfa -88 + ^ x19: .cfa -80 + ^ x20: .cfa -72 + ^ x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ x26: .cfa -24 + ^ x27: .cfa -16 + ^ x29: .cfa -96 + ^ +STACK CFI INIT 9f1b4 c0 .cfa: sp 0 + .ra: x30 +STACK CFI 9f1b8 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI 9f1bc .cfa: x29 48 + +STACK CFI 9f1c0 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI 9f1d0 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI 9f234 x19: x19 x20: x20 +STACK CFI 9f238 x21: x21 x22: x22 +STACK CFI 9f23c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9f240 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI 9f268 x19: x19 x20: x20 +STACK CFI 9f26c x21: x21 x22: x22 +STACK CFI 9f270 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT 9f274 2bc .cfa: sp 0 + .ra: x30 +STACK CFI 9f278 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI 9f284 .cfa: x29 112 + +STACK CFI 9f288 x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI 9f2a0 x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ +STACK CFI 9f504 x19: x19 x20: x20 +STACK CFI 9f508 x21: x21 x22: x22 +STACK CFI 9f50c x23: x23 x24: x24 +STACK CFI 9f510 x25: x25 x26: x26 +STACK CFI 9f514 x27: x27 +STACK CFI 9f518 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9f51c .cfa: x29 112 + .ra: .cfa -104 + ^ x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ x29: .cfa -112 + ^ +STACK CFI INIT 9f530 1a8 .cfa: sp 0 + .ra: x30 +STACK CFI 9f534 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 9f53c .cfa: x29 64 + +STACK CFI 9f548 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 9f5b8 x19: x19 x20: x20 +STACK CFI 9f5bc x21: x21 x22: x22 +STACK CFI 9f5c0 x23: x23 x24: x24 +STACK CFI 9f5c4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9f5c8 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI 9f6a4 x19: x19 x20: x20 +STACK CFI 9f6a8 x21: x21 x22: x22 +STACK CFI 9f6ac x23: x23 x24: x24 +STACK CFI 9f6b0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9f6b4 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 9f6d8 1a8 .cfa: sp 0 + .ra: x30 +STACK CFI 9f6dc .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI 9f6e4 .cfa: x29 64 + +STACK CFI 9f6f0 x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI 9f760 x19: x19 x20: x20 +STACK CFI 9f764 x21: x21 x22: x22 +STACK CFI 9f768 x23: x23 x24: x24 +STACK CFI 9f76c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9f770 .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI 9f84c x19: x19 x20: x20 +STACK CFI 9f850 x21: x21 x22: x22 +STACK CFI 9f854 x23: x23 x24: x24 +STACK CFI 9f858 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9f85c .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI INIT 9f880 11f8 .cfa: sp 0 + .ra: x30 +STACK CFI 9f884 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI 9f890 .cfa: x29 160 + +STACK CFI 9f8a4 x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ +STACK CFI 9f9cc x19: x19 x20: x20 +STACK CFI 9f9d0 x21: x21 x22: x22 +STACK CFI 9f9d4 x23: x23 x24: x24 +STACK CFI 9f9d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9f9dc .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x29: .cfa -160 + ^ +STACK CFI 9fac8 x23: x23 x24: x24 +STACK CFI 9fad4 x19: x19 x20: x20 +STACK CFI 9fad8 x21: x21 x22: x22 +STACK CFI 9fadc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9fae0 .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x29: .cfa -160 + ^ +STACK CFI 9fc10 x19: x19 x20: x20 +STACK CFI 9fc14 x21: x21 x22: x22 +STACK CFI 9fc18 x23: x23 x24: x24 +STACK CFI 9fc1c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI 9fc20 .cfa: x29 160 + .ra: .cfa -152 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x23: .cfa -112 + ^ x24: .cfa -104 + ^ x29: .cfa -160 + ^ +STACK CFI INIT a0a78 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a0a7c a8 .cfa: sp 0 + .ra: x30 +STACK CFI a0a80 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI a0a84 .cfa: x29 64 + +STACK CFI a0a8c x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI a0aa0 x23: .cfa -16 + ^ x24: .cfa -8 + ^ +STACK CFI a0afc x19: x19 x20: x20 +STACK CFI a0b00 x21: x21 x22: x22 +STACK CFI a0b04 x23: x23 x24: x24 +STACK CFI a0b08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI a0b0c .cfa: x29 64 + .ra: .cfa -56 + ^ x19: .cfa -48 + ^ x20: .cfa -40 + ^ x21: .cfa -32 + ^ x22: .cfa -24 + ^ x23: .cfa -16 + ^ x24: .cfa -8 + ^ x29: .cfa -64 + ^ +STACK CFI INIT a0b24 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a0b2c 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a0b30 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a0b38 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a0b3c 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a0b50 34 .cfa: sp 0 + .ra: x30 +STACK CFI a0b58 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a0b5c .cfa: x29 32 + +STACK CFI a0b64 x19: .cfa -16 + ^ +STACK CFI a0b7c x19: x19 +STACK CFI a0b80 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a0b84 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a0b98 34 .cfa: sp 0 + .ra: x30 +STACK CFI a0ba0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a0ba4 .cfa: x29 32 + +STACK CFI a0bac x19: .cfa -16 + ^ +STACK CFI a0bc4 x19: x19 +STACK CFI a0bc8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a0bcc 44 .cfa: sp 0 + .ra: x30 +STACK CFI a0bd0 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a0bdc .cfa: x29 32 + +STACK CFI a0be0 x19: .cfa -16 + ^ +STACK CFI a0c08 x19: x19 +STACK CFI a0c0c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a0c10 44 .cfa: sp 0 + .ra: x30 +STACK CFI a0c14 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a0c20 .cfa: x29 32 + +STACK CFI a0c24 x19: .cfa -16 + ^ +STACK CFI a0c4c x19: x19 +STACK CFI a0c50 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a0c54 28 .cfa: sp 0 + .ra: x30 +STACK CFI a0c58 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a0c64 .cfa: x29 32 + +STACK CFI a0c74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a0c7c a8 .cfa: sp 0 + .ra: x30 +STACK CFI a0c80 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI a0c84 .cfa: x29 48 + +STACK CFI a0c88 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI a0c90 x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI a0cd8 x19: x19 x20: x20 +STACK CFI a0cdc x21: x21 x22: x22 +STACK CFI a0ce0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI a0ce4 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ x29: .cfa -48 + ^ +STACK CFI INIT a0d24 28 .cfa: sp 0 + .ra: x30 +STACK CFI a0d28 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a0d34 .cfa: x29 32 + +STACK CFI a0d44 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a0d4c 34 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a0d80 aa4 .cfa: sp 0 + .ra: x30 +STACK CFI a0d88 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a0d98 .cfa: x29 32 + +STACK CFI a1820 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a1824 100 .cfa: sp 0 + .ra: x30 +STACK CFI a1828 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a1834 .cfa: x29 16 + +STACK CFI a1920 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a1924 13c .cfa: sp 0 + .ra: x30 +STACK CFI a1928 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a1934 .cfa: x29 16 + +STACK CFI a1a5c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a1a60 6bc .cfa: sp 0 + .ra: x30 +STACK CFI a1a64 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a1a70 .cfa: x29 32 + +STACK CFI a2118 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a211c 64 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a2180 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a21a8 40 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a21e8 f0 .cfa: sp 0 + .ra: x30 +STACK CFI a21ec .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI a21f0 .cfa: x29 64 + +STACK CFI a21f4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI a2200 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI a22cc x19: x19 x20: x20 +STACK CFI a22d0 x21: x21 x22: x22 +STACK CFI a22d4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a22d8 114 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a23ec 3c .cfa: sp 0 + .ra: x30 +STACK CFI a23f4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a23f8 .cfa: x29 16 + +STACK CFI a2424 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a2428 58 .cfa: sp 0 + .ra: x30 +STACK CFI a242c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a2434 .cfa: x29 16 + +STACK CFI a247c .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a2480 10c .cfa: sp 0 + .ra: x30 +STACK CFI a2484 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI a2488 .cfa: x29 64 + +STACK CFI a248c x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI a2498 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI a2580 x19: x19 x20: x20 +STACK CFI a2584 x21: x21 x22: x22 +STACK CFI a2588 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a258c 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a2594 58 .cfa: sp 0 + .ra: x30 +STACK CFI a2598 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a25a0 .cfa: x29 16 + +STACK CFI a25e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a25ec 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a25f4 14 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a2608 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a2610 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a2618 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a2620 28 .cfa: sp 0 + .ra: x30 +STACK CFI a2624 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI a262c .cfa: x29 48 + +STACK CFI a2640 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a2648 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a2650 8 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a2658 78 .cfa: sp 0 + .ra: x30 +STACK CFI a265c .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a266c .cfa: x29 16 + +STACK CFI a26ac .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI a26b0 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a26b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI a26b8 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a26bc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI a26c0 .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a26cc .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a26d0 4f8 .cfa: sp 0 + .ra: x30 +STACK CFI a26d4 .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI a26d8 .cfa: x29 144 + +STACK CFI a26ec x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ x25: .cfa -80 + ^ x26: .cfa -72 + ^ x27: .cfa -64 + ^ x28: .cfa -56 + ^ +STACK CFI a2bac .cfa: sp 144 + +STACK CFI a2bb0 x19: x19 x20: x20 +STACK CFI a2bb4 x21: x21 x22: x22 +STACK CFI a2bb8 x23: x23 x24: x24 +STACK CFI a2bbc x25: x25 x26: x26 +STACK CFI a2bc0 x27: x27 x28: x28 +STACK CFI a2bc4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a2bc8 41c .cfa: sp 0 + .ra: x30 +STACK CFI a2bcc .cfa: sp 128 + .ra: .cfa -120 + ^ x29: .cfa -128 + ^ +STACK CFI a2bd4 .cfa: x29 128 + +STACK CFI a2bdc x19: .cfa -112 + ^ x20: .cfa -104 + ^ x21: .cfa -96 + ^ x22: .cfa -88 + ^ +STACK CFI a2bf8 x23: .cfa -80 + ^ x24: .cfa -72 + ^ x25: .cfa -64 + ^ x26: .cfa -56 + ^ x27: .cfa -48 + ^ x28: .cfa -40 + ^ +STACK CFI a2fcc x19: x19 x20: x20 +STACK CFI a2fd0 x21: x21 x22: x22 +STACK CFI a2fd4 x23: x23 x24: x24 +STACK CFI a2fd8 x25: x25 x26: x26 +STACK CFI a2fdc x27: x27 x28: x28 +STACK CFI a2fe0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a2fe4 598 .cfa: sp 0 + .ra: x30 +STACK CFI a2fe8 .cfa: sp 544 + +STACK CFI a2ff0 .cfa: sp 656 + .ra: .cfa -648 + ^ x29: .cfa -656 + ^ +STACK CFI a2ff4 .cfa: x29 656 + +STACK CFI a2ff8 x23: .cfa -608 + ^ x24: .cfa -600 + ^ +STACK CFI a3008 v8: .cfa -560 + ^ +STACK CFI a3010 x27: .cfa -576 + ^ x28: .cfa -568 + ^ +STACK CFI a3024 x19: .cfa -640 + ^ x20: .cfa -632 + ^ x21: .cfa -624 + ^ x22: .cfa -616 + ^ x25: .cfa -592 + ^ x26: .cfa -584 + ^ +STACK CFI a3558 x21: x21 x22: x22 +STACK CFI a355c x25: x25 x26: x26 +STACK CFI a3564 x19: x19 x20: x20 +STACK CFI a3568 x23: x23 x24: x24 +STACK CFI a356c x27: x27 x28: x28 +STACK CFI a3570 v8: v8 +STACK CFI a3574 .cfa: sp 544 + .ra: .ra x29: x29 +STACK CFI a3578 .cfa: sp 432 + +STACK CFI INIT a357c 224 .cfa: sp 0 + .ra: x30 +STACK CFI a3580 .cfa: sp 976 + +STACK CFI a3588 .cfa: sp 1088 + .ra: .cfa -1080 + ^ x29: .cfa -1088 + ^ +STACK CFI a358c .cfa: x29 1088 + +STACK CFI a3594 x19: .cfa -1072 + ^ x20: .cfa -1064 + ^ x21: .cfa -1056 + ^ x22: .cfa -1048 + ^ +STACK CFI a35a4 x25: .cfa -1024 + ^ x26: .cfa -1016 + ^ +STACK CFI a35b8 v8: .cfa -992 + ^ x23: .cfa -1040 + ^ x24: .cfa -1032 + ^ x27: .cfa -1008 + ^ x28: .cfa -1000 + ^ +STACK CFI a3780 x21: x21 x22: x22 +STACK CFI a3784 x19: x19 x20: x20 +STACK CFI a3788 x23: x23 x24: x24 +STACK CFI a378c x25: x25 x26: x26 +STACK CFI a3790 x27: x27 x28: x28 +STACK CFI a3794 v8: v8 +STACK CFI a3798 .cfa: sp 976 + .ra: .ra x29: x29 +STACK CFI a379c .cfa: sp 864 + +STACK CFI INIT a37a0 cc .cfa: sp 0 + .ra: x30 +STACK CFI a37a4 .cfa: sp 1680 + +STACK CFI a37a8 .cfa: sp 1744 + .ra: .cfa -1736 + ^ x29: .cfa -1744 + ^ +STACK CFI a37ac .cfa: x29 1744 + +STACK CFI a37b4 x19: .cfa -1728 + ^ x20: .cfa -1720 + ^ x21: .cfa -1712 + ^ x22: .cfa -1704 + ^ +STACK CFI a37bc x23: .cfa -1696 + ^ +STACK CFI a3858 x23: x23 +STACK CFI a385c x19: x19 x20: x20 +STACK CFI a3860 x21: x21 x22: x22 +STACK CFI a3864 .cfa: sp 1680 + .ra: .ra x29: x29 +STACK CFI a3868 .cfa: sp 1616 + +STACK CFI INIT a386c 4c .cfa: sp 0 + .ra: x30 +STACK CFI a3870 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a3874 .cfa: x29 32 + +STACK CFI a3878 x19: .cfa -16 + ^ x20: .cfa -8 + ^ +STACK CFI a38b0 x19: x19 x20: x20 +STACK CFI a38b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a38b8 c0 .cfa: sp 0 + .ra: x30 +STACK CFI a38bc .cfa: sp 1664 + +STACK CFI a38c0 .cfa: sp 1728 + .ra: .cfa -1720 + ^ x29: .cfa -1728 + ^ +STACK CFI a38c4 .cfa: x29 1728 + +STACK CFI a38d0 x19: .cfa -1712 + ^ x20: .cfa -1704 + ^ x21: .cfa -1696 + ^ x22: .cfa -1688 + ^ x23: .cfa -1680 + ^ x24: .cfa -1672 + ^ +STACK CFI a3964 x19: x19 x20: x20 +STACK CFI a3968 x21: x21 x22: x22 +STACK CFI a396c x23: x23 x24: x24 +STACK CFI a3970 .cfa: sp 1664 + .ra: .ra x29: x29 +STACK CFI a3974 .cfa: sp 1600 + +STACK CFI INIT a3978 ec .cfa: sp 0 + .ra: x30 +STACK CFI a397c .cfa: sp 1664 + +STACK CFI a3980 .cfa: sp 1744 + .ra: .cfa -1736 + ^ x29: .cfa -1744 + ^ +STACK CFI a3984 .cfa: x29 1744 + +STACK CFI a3988 x23: .cfa -1696 + ^ x24: .cfa -1688 + ^ +STACK CFI a399c x19: .cfa -1728 + ^ x20: .cfa -1720 + ^ x21: .cfa -1712 + ^ x22: .cfa -1704 + ^ x25: .cfa -1680 + ^ x26: .cfa -1672 + ^ +STACK CFI a3a4c x19: x19 x20: x20 +STACK CFI a3a50 x21: x21 x22: x22 +STACK CFI a3a54 x23: x23 x24: x24 +STACK CFI a3a58 x25: x25 x26: x26 +STACK CFI a3a5c .cfa: sp 1664 + .ra: .ra x29: x29 +STACK CFI a3a60 .cfa: sp 1584 + +STACK CFI INIT a3a64 f4 .cfa: sp 0 + .ra: x30 +STACK CFI a3a68 .cfa: sp 2624 + +STACK CFI a3a70 .cfa: sp 2672 + .ra: .cfa -2664 + ^ x29: .cfa -2672 + ^ +STACK CFI a3a74 .cfa: x29 2672 + +STACK CFI a3a78 x19: .cfa -2656 + ^ x20: .cfa -2648 + ^ +STACK CFI a3a80 x21: .cfa -2640 + ^ +STACK CFI a3b44 x19: x19 x20: x20 +STACK CFI a3b48 x21: x21 +STACK CFI a3b50 .cfa: sp 2624 + .ra: .ra x29: x29 +STACK CFI a3b54 .cfa: sp 2576 + +STACK CFI INIT a3b58 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a3b5c 188 .cfa: sp 0 + .ra: x30 +STACK CFI a3b60 .cfa: sp 3600 + +STACK CFI a3b64 .cfa: sp 3792 + .ra: .cfa -3784 + ^ x29: .cfa -3792 + ^ +STACK CFI a3b68 .cfa: x29 3792 + +STACK CFI a3b70 v8: .cfa -3664 + ^ v9: .cfa -3656 + ^ x21: .cfa -3728 + ^ x22: .cfa -3720 + ^ +STACK CFI a3b8c v10: .cfa -3648 + ^ v11: .cfa -3640 + ^ v12: .cfa -3632 + ^ v13: .cfa -3624 + ^ v14: .cfa -3616 + ^ v15: .cfa -3608 + ^ x0: .cfa -3776 + ^ x1: .cfa -3768 + ^ x19: .cfa -3744 + ^ x2: .cfa -3760 + ^ x20: .cfa -3736 + ^ x3: .cfa -3752 + ^ +STACK CFI a3ba8 x23: .cfa -3712 + ^ x24: .cfa -3704 + ^ x25: .cfa -3696 + ^ x26: .cfa -3688 + ^ x27: .cfa -3680 + ^ x28: .cfa -3672 + ^ +STACK CFI a3ca8 x2: x2 x3: x3 +STACK CFI a3cac v8: v8 v9: v9 +STACK CFI a3cb0 x19: x19 x20: x20 +STACK CFI a3cb4 v10: v10 v11: v11 +STACK CFI a3cb8 x21: x21 x22: x22 +STACK CFI a3cbc v12: v12 v13: v13 +STACK CFI a3cc0 x23: x23 x24: x24 +STACK CFI a3cc4 v14: v14 v15: v15 +STACK CFI a3cc8 x25: x25 x26: x26 +STACK CFI a3ccc x27: x27 x28: x28 +STACK CFI a3cd0 x0: x0 x1: x1 +STACK CFI a3cd4 .cfa: sp 3600 + .ra: .ra x29: x29 +STACK CFI a3cd8 .cfa: x16 0 + +STACK CFI INIT a3ce4 f4 .cfa: sp 0 + .ra: x30 +STACK CFI a3ce8 .cfa: sp 1936 + +STACK CFI a3cec .cfa: sp 2128 + .ra: .cfa -2120 + ^ x29: .cfa -2128 + ^ +STACK CFI a3cf0 .cfa: x29 2128 + +STACK CFI a3cf8 v8: .cfa -2000 + ^ v9: .cfa -1992 + ^ x19: .cfa -2080 + ^ x20: .cfa -2072 + ^ +STACK CFI a3d18 v10: .cfa -1984 + ^ v11: .cfa -1976 + ^ v12: .cfa -1968 + ^ v13: .cfa -1960 + ^ v14: .cfa -1952 + ^ v15: .cfa -1944 + ^ x0: .cfa -2112 + ^ x1: .cfa -2104 + ^ x2: .cfa -2096 + ^ x21: .cfa -2064 + ^ x22: .cfa -2056 + ^ x23: .cfa -2048 + ^ x24: .cfa -2040 + ^ x3: .cfa -2088 + ^ +STACK CFI a3d3c x25: .cfa -2032 + ^ x26: .cfa -2024 + ^ x27: .cfa -2016 + ^ x28: .cfa -2008 + ^ +STACK CFI a3d9c x2: x2 x3: x3 +STACK CFI a3da0 v8: v8 v9: v9 +STACK CFI a3da4 x19: x19 x20: x20 +STACK CFI a3da8 v10: v10 v11: v11 +STACK CFI a3dac x21: x21 x22: x22 +STACK CFI a3db0 v12: v12 v13: v13 +STACK CFI a3db4 x23: x23 x24: x24 +STACK CFI a3db8 v14: v14 v15: v15 +STACK CFI a3dbc x25: x25 x26: x26 +STACK CFI a3dc0 x27: x27 x28: x28 +STACK CFI a3dc4 x0: x0 x1: x1 +STACK CFI a3dc8 .cfa: sp 1936 + .ra: .ra x29: x29 +STACK CFI a3dcc .cfa: x16 0 + +STACK CFI INIT a3dd8 fc .cfa: sp 0 + .ra: x30 +STACK CFI a3ddc .cfa: sp 1936 + +STACK CFI a3de0 .cfa: sp 2128 + .ra: .cfa -2120 + ^ x29: .cfa -2128 + ^ +STACK CFI a3de4 .cfa: x29 2128 + +STACK CFI a3dec v8: .cfa -2000 + ^ v9: .cfa -1992 + ^ x19: .cfa -2080 + ^ x20: .cfa -2072 + ^ +STACK CFI a3e04 v10: .cfa -1984 + ^ v11: .cfa -1976 + ^ v12: .cfa -1968 + ^ v13: .cfa -1960 + ^ v14: .cfa -1952 + ^ v15: .cfa -1944 + ^ x0: .cfa -2112 + ^ x1: .cfa -2104 + ^ x2: .cfa -2096 + ^ x3: .cfa -2088 + ^ +STACK CFI a3e10 x21: .cfa -2064 + ^ x22: .cfa -2056 + ^ +STACK CFI a3e24 x23: .cfa -2048 + ^ x24: .cfa -2040 + ^ x25: .cfa -2032 + ^ x26: .cfa -2024 + ^ x27: .cfa -2016 + ^ x28: .cfa -2008 + ^ +STACK CFI a3e98 v8: v8 v9: v9 +STACK CFI a3e9c x0: x0 x1: x1 +STACK CFI a3ea0 v10: v10 v11: v11 +STACK CFI a3ea4 x2: x2 x3: x3 +STACK CFI a3ea8 v12: v12 v13: v13 +STACK CFI a3eac x19: x19 x20: x20 +STACK CFI a3eb0 v14: v14 v15: v15 +STACK CFI a3eb4 x21: x21 x22: x22 +STACK CFI a3eb8 x23: x23 x24: x24 +STACK CFI a3ebc x25: x25 x26: x26 +STACK CFI a3ec0 x27: x27 x28: x28 +STACK CFI a3ec4 .cfa: sp 1936 + .ra: .ra x29: x29 +STACK CFI a3ec8 .cfa: x16 0 + +STACK CFI INIT a3ed4 fc .cfa: sp 0 + .ra: x30 +STACK CFI a3ed8 .cfa: sp 1936 + +STACK CFI a3edc .cfa: sp 2128 + .ra: .cfa -2120 + ^ x29: .cfa -2128 + ^ +STACK CFI a3ee0 .cfa: x29 2128 + +STACK CFI a3f10 v10: .cfa -1984 + ^ v11: .cfa -1976 + ^ v12: .cfa -1968 + ^ v13: .cfa -1960 + ^ v14: .cfa -1952 + ^ v15: .cfa -1944 + ^ v8: .cfa -2000 + ^ v9: .cfa -1992 + ^ x0: .cfa -2112 + ^ x1: .cfa -2104 + ^ x19: .cfa -2080 + ^ x2: .cfa -2096 + ^ x20: .cfa -2072 + ^ x21: .cfa -2064 + ^ x22: .cfa -2056 + ^ x23: .cfa -2048 + ^ x24: .cfa -2040 + ^ x25: .cfa -2032 + ^ x26: .cfa -2024 + ^ x27: .cfa -2016 + ^ x28: .cfa -2008 + ^ x3: .cfa -2088 + ^ +STACK CFI a3f94 x2: x2 x3: x3 +STACK CFI a3f98 v8: v8 v9: v9 +STACK CFI a3f9c x19: x19 x20: x20 +STACK CFI a3fa0 v10: v10 v11: v11 +STACK CFI a3fa4 x21: x21 x22: x22 +STACK CFI a3fa8 v12: v12 v13: v13 +STACK CFI a3fac x23: x23 x24: x24 +STACK CFI a3fb0 v14: v14 v15: v15 +STACK CFI a3fb4 x25: x25 x26: x26 +STACK CFI a3fb8 x27: x27 x28: x28 +STACK CFI a3fbc x0: x0 x1: x1 +STACK CFI a3fc0 .cfa: sp 1936 + .ra: .ra x29: x29 +STACK CFI a3fc4 .cfa: x16 0 + +STACK CFI INIT a3fd0 24 .cfa: sp 0 + .ra: x30 +STACK CFI a3fd4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a3fd8 .cfa: x29 16 + +STACK CFI a3ff0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a3ff4 d0 .cfa: sp 0 + .ra: x30 +STACK CFI a3ff8 .cfa: sp 2624 + +STACK CFI a4000 .cfa: sp 2784 + .ra: .cfa -2776 + ^ x29: .cfa -2784 + ^ +STACK CFI a4004 .cfa: x29 2784 + +STACK CFI a400c v8: .cfa -2688 + ^ v9: .cfa -2680 + ^ x19: .cfa -2768 + ^ x20: .cfa -2760 + ^ +STACK CFI a4024 v10: .cfa -2672 + ^ v11: .cfa -2664 + ^ v12: .cfa -2656 + ^ v13: .cfa -2648 + ^ v14: .cfa -2640 + ^ v15: .cfa -2632 + ^ x21: .cfa -2752 + ^ x22: .cfa -2744 + ^ x23: .cfa -2736 + ^ x24: .cfa -2728 + ^ +STACK CFI a4040 x25: .cfa -2720 + ^ x26: .cfa -2712 + ^ x27: .cfa -2704 + ^ x28: .cfa -2696 + ^ +STACK CFI a4098 x19: x19 x20: x20 +STACK CFI a409c v8: v8 v9: v9 +STACK CFI a40a0 x21: x21 x22: x22 +STACK CFI a40a4 v10: v10 v11: v11 +STACK CFI a40a8 x23: x23 x24: x24 +STACK CFI a40ac v12: v12 v13: v13 +STACK CFI a40b0 x25: x25 x26: x26 +STACK CFI a40b4 v14: v14 v15: v15 +STACK CFI a40b8 x27: x27 x28: x28 +STACK CFI a40bc .cfa: sp 2624 + .ra: .ra x29: x29 +STACK CFI a40c0 .cfa: sp 2464 + +STACK CFI INIT a40c4 28 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a40ec 40 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a412c 1c .cfa: sp 0 + .ra: x30 +STACK CFI INIT a4148 c0 .cfa: sp 0 + .ra: x30 +STACK CFI a414c .cfa: sp 96 + .ra: .cfa -88 + ^ x29: .cfa -96 + ^ +STACK CFI a4150 .cfa: x29 96 + +STACK CFI a4154 x19: .cfa -80 + ^ x20: .cfa -72 + ^ +STACK CFI a4164 x21: .cfa -64 + ^ x22: .cfa -56 + ^ x23: .cfa -48 + ^ x24: .cfa -40 + ^ x25: .cfa -32 + ^ +STACK CFI a41f4 x19: x19 x20: x20 +STACK CFI a41f8 x21: x21 x22: x22 +STACK CFI a41fc x23: x23 x24: x24 +STACK CFI a4200 x25: x25 +STACK CFI a4204 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a4208 b4 .cfa: sp 0 + .ra: x30 +STACK CFI a420c .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI a4210 .cfa: x29 80 + +STACK CFI a4214 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI a4224 x21: .cfa -48 + ^ x22: .cfa -40 + ^ x23: .cfa -32 + ^ x24: .cfa -24 + ^ x25: .cfa -16 + ^ +STACK CFI a42a8 x19: x19 x20: x20 +STACK CFI a42ac x21: x21 x22: x22 +STACK CFI a42b0 x23: x23 x24: x24 +STACK CFI a42b4 x25: x25 +STACK CFI a42b8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a42bc 60 .cfa: sp 0 + .ra: x30 +STACK CFI a42c0 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a42cc .cfa: x29 16 + +STACK CFI a4318 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a431c 60 .cfa: sp 0 + .ra: x30 +STACK CFI a4320 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a432c .cfa: x29 16 + +STACK CFI a4378 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a437c 60 .cfa: sp 0 + .ra: x30 +STACK CFI a4380 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a438c .cfa: x29 16 + +STACK CFI a43d8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a43dc f0 .cfa: sp 0 + .ra: x30 +STACK CFI a43e0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI a43e4 .cfa: x29 64 + +STACK CFI a43e8 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI a43f4 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI a44c0 x19: x19 x20: x20 +STACK CFI a44c4 x21: x21 x22: x22 +STACK CFI a44c8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a44cc 90 .cfa: sp 0 + .ra: x30 +STACK CFI a44d0 .cfa: sp 80 + .ra: .cfa -72 + ^ x29: .cfa -80 + ^ +STACK CFI a44d4 .cfa: x29 80 + +STACK CFI a44d8 x19: .cfa -64 + ^ x20: .cfa -56 + ^ +STACK CFI a44e4 x23: .cfa -32 + ^ +STACK CFI a44f8 x21: .cfa -48 + ^ x22: .cfa -40 + ^ +STACK CFI a454c x19: x19 x20: x20 +STACK CFI a4550 x21: x21 x22: x22 +STACK CFI a4554 x23: x23 +STACK CFI a4558 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a455c fc .cfa: sp 0 + .ra: x30 +STACK CFI a4560 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI a4564 .cfa: x29 64 + +STACK CFI a4568 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI a4650 x19: x19 x20: x20 +STACK CFI a4654 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a4658 160 .cfa: sp 0 + .ra: x30 +STACK CFI a465c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI a4660 .cfa: x29 112 + +STACK CFI a4664 x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI a4674 x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI a4688 x23: .cfa -64 + ^ x24: .cfa -56 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ x28: .cfa -24 + ^ +STACK CFI a47a0 x19: x19 x20: x20 +STACK CFI a47a4 x21: x21 x22: x22 +STACK CFI a47a8 x23: x23 x24: x24 +STACK CFI a47ac x25: x25 x26: x26 +STACK CFI a47b0 x27: x27 x28: x28 +STACK CFI a47b4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a47b8 10 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a47c8 414 .cfa: sp 0 + .ra: x30 +STACK CFI a47cc .cfa: sp 144 + .ra: .cfa -136 + ^ x29: .cfa -144 + ^ +STACK CFI a47d4 .cfa: x29 144 + +STACK CFI a47e0 x19: .cfa -128 + ^ x20: .cfa -120 + ^ x21: .cfa -112 + ^ x22: .cfa -104 + ^ x23: .cfa -96 + ^ x24: .cfa -88 + ^ +STACK CFI a4bcc x19: x19 x20: x20 +STACK CFI a4bd0 x21: x21 x22: x22 +STACK CFI a4bd4 x23: x23 x24: x24 +STACK CFI a4bd8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a4bdc 9c .cfa: sp 0 + .ra: x30 +STACK CFI a4be0 .cfa: sp 64 + .ra: .cfa -56 + ^ x29: .cfa -64 + ^ +STACK CFI a4be4 .cfa: x29 64 + +STACK CFI a4be8 x21: .cfa -32 + ^ x22: .cfa -24 + ^ +STACK CFI a4bf4 x19: .cfa -48 + ^ x20: .cfa -40 + ^ +STACK CFI a4c6c x19: x19 x20: x20 +STACK CFI a4c70 x21: x21 x22: x22 +STACK CFI a4c74 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a4c78 160 .cfa: sp 0 + .ra: x30 +STACK CFI a4c7c .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI a4c80 .cfa: x29 112 + +STACK CFI a4c84 x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI a4c98 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x21: .cfa -80 + ^ x22: .cfa -72 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ +STACK CFI a4dc0 x19: x19 x20: x20 +STACK CFI a4dc4 x21: x21 x22: x22 +STACK CFI a4dc8 x23: x23 x24: x24 +STACK CFI a4dcc x25: x25 x26: x26 +STACK CFI a4dd0 x27: x27 +STACK CFI a4dd4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a4dd8 134 .cfa: sp 0 + .ra: x30 +STACK CFI a4ddc .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI a4de0 .cfa: x29 112 + +STACK CFI a4de4 x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI a4df4 x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI a4e08 x19: .cfa -96 + ^ x20: .cfa -88 + ^ x25: .cfa -48 + ^ x26: .cfa -40 + ^ x27: .cfa -32 + ^ +STACK CFI a4ef4 x19: x19 x20: x20 +STACK CFI a4ef8 x21: x21 x22: x22 +STACK CFI a4efc x23: x23 x24: x24 +STACK CFI a4f00 x25: x25 x26: x26 +STACK CFI a4f04 x27: x27 +STACK CFI a4f08 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a4f0c 578 .cfa: sp 0 + .ra: x30 +STACK CFI a4f10 .cfa: sp 160 + .ra: .cfa -152 + ^ x29: .cfa -160 + ^ +STACK CFI a4f14 .cfa: x29 160 + +STACK CFI a4f18 x23: .cfa -112 + ^ x24: .cfa -104 + ^ +STACK CFI a4f34 v8: .cfa -64 + ^ x19: .cfa -144 + ^ x20: .cfa -136 + ^ x21: .cfa -128 + ^ x22: .cfa -120 + ^ x25: .cfa -96 + ^ x26: .cfa -88 + ^ x27: .cfa -80 + ^ x28: .cfa -72 + ^ +STACK CFI a5468 x19: x19 x20: x20 +STACK CFI a546c x21: x21 x22: x22 +STACK CFI a5470 x23: x23 x24: x24 +STACK CFI a5474 x25: x25 x26: x26 +STACK CFI a5478 x27: x27 x28: x28 +STACK CFI a547c v8: v8 +STACK CFI a5480 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a5484 84 .cfa: sp 0 + .ra: x30 +STACK CFI a5488 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI a548c .cfa: x29 48 + +STACK CFI a5494 x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ +STACK CFI a54ec x21: x21 +STACK CFI a54f0 x19: x19 x20: x20 +STACK CFI a54f4 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI a54f8 .cfa: x29 48 + .ra: .cfa -40 + ^ x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x29: .cfa -48 + ^ +STACK CFI a54fc x19: x19 x20: x20 +STACK CFI a5500 x21: x21 +STACK CFI a5504 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a5508 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT a5514 40 .cfa: sp 0 + .ra: x30 +STACK CFI a5518 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a551c .cfa: x29 32 + +STACK CFI a5524 x19: .cfa -16 + ^ +STACK CFI a5540 x19: x19 +STACK CFI a5544 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI a5548 .cfa: x29 32 + .ra: .cfa -24 + ^ x19: .cfa -16 + ^ x29: .cfa -32 + ^ +STACK CFI a554c x19: x19 +STACK CFI a5550 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a5554 70 .cfa: sp 0 + .ra: x30 +STACK CFI a5558 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI a5560 .cfa: x29 48 + +STACK CFI a5564 x19: .cfa -32 + ^ x20: .cfa -24 + ^ +STACK CFI a55bc x19: x19 x20: x20 +STACK CFI a55c0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a55c4 c .cfa: sp 0 + .ra: x30 +STACK CFI INIT a55d0 2c .cfa: sp 0 + .ra: x30 +STACK CFI a55d4 .cfa: sp 32 + .ra: .cfa -24 + ^ x29: .cfa -32 + ^ +STACK CFI a55d8 .cfa: x29 32 + +STACK CFI a55dc x19: .cfa -16 + ^ +STACK CFI a55f4 x19: x19 +STACK CFI a55f8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a55fc f0 .cfa: sp 0 + .ra: x30 +STACK CFI a5600 .cfa: sp 48 + .ra: .cfa -40 + ^ x29: .cfa -48 + ^ +STACK CFI a5604 .cfa: x29 48 + +STACK CFI a560c x19: .cfa -32 + ^ x20: .cfa -24 + ^ x21: .cfa -16 + ^ x22: .cfa -8 + ^ +STACK CFI a56e0 x19: x19 x20: x20 +STACK CFI a56e4 x21: x21 x22: x22 +STACK CFI a56e8 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a56ec 4 .cfa: sp 0 + .ra: x30 +STACK CFI INIT a56f0 24 .cfa: sp 0 + .ra: x30 +STACK CFI a56f4 .cfa: sp 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a56f8 .cfa: x29 16 + +STACK CFI a5708 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI a570c .cfa: x29 16 + .ra: .cfa -8 + ^ x29: .cfa -16 + ^ +STACK CFI a5710 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a5714 190 .cfa: sp 0 + .ra: x30 +STACK CFI a5718 .cfa: sp 112 + .ra: .cfa -104 + ^ x29: .cfa -112 + ^ +STACK CFI a571c .cfa: x29 112 + +STACK CFI a5720 x21: .cfa -80 + ^ x22: .cfa -72 + ^ +STACK CFI a572c x19: .cfa -96 + ^ x20: .cfa -88 + ^ +STACK CFI a5734 x23: .cfa -64 + ^ x24: .cfa -56 + ^ +STACK CFI a5894 x19: x19 x20: x20 +STACK CFI a5898 x21: x21 x22: x22 +STACK CFI a589c x23: x23 x24: x24 +STACK CFI a58a0 .cfa: sp 0 + .ra: .ra x29: x29 +STACK CFI INIT a58a4 60 .cfa: sp 0 + .ra: x30 diff --git a/src/processor/testdata/symbols/microdump/breakpad_unittests/DA7778FB66018A4E9B4110ED06E730D00/breakpad_unittests.sym b/src/processor/testdata/symbols/microdump/breakpad_unittests/DA7778FB66018A4E9B4110ED06E730D00/breakpad_unittests.sym new file mode 100644 index 0000000..2ea3faa --- /dev/null +++ b/src/processor/testdata/symbols/microdump/breakpad_unittests/DA7778FB66018A4E9B4110ED06E730D00/breakpad_unittests.sym @@ -0,0 +1,66343 @@ +MODULE Linux arm DA7778FB66018A4E9B4110ED06E730D00 breakpad_unittests +FILE 0 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/crash_generation/crash_generation_client.cc +FILE 1 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/dump_writer_common/seccomp_unwinder.cc +FILE 2 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/dump_writer_common/thread_info.cc +FILE 3 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/dump_writer_common/ucontext_reader.cc +FILE 4 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/handler/exception_handler.cc +FILE 5 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/handler/exception_handler.h +FILE 6 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/handler/exception_handler_unittest.cc +FILE 7 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/handler/minidump_descriptor.cc +FILE 8 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/handler/minidump_descriptor.h +FILE 9 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/log/log.cc +FILE 10 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/microdump_writer/microdump_writer.cc +FILE 11 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/microdump_writer/microdump_writer_unittest.cc +FILE 12 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/cpu_set.h +FILE 13 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/cpu_set_unittest.cc +FILE 14 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/directory_reader.h +FILE 15 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc +FILE 16 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/line_reader.h +FILE 17 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc +FILE 18 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/linux_core_dumper.cc +FILE 19 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/linux_core_dumper.h +FILE 20 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc +FILE 21 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/linux_dumper.cc +FILE 22 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/linux_dumper.h +FILE 23 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc +FILE 24 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.h +FILE 25 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc +FILE 26 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/minidump_writer.cc +FILE 27 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc +FILE 28 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/minidump_writer_unittest_utils.cc +FILE 29 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader.h +FILE 30 /s/clank/src/out_arm/Release/../../breakpad/src/client/linux/minidump_writer/proc_cpuinfo_reader_unittest.cc +FILE 31 /s/clank/src/out_arm/Release/../../breakpad/src/client/minidump_file_writer-inl.h +FILE 32 /s/clank/src/out_arm/Release/../../breakpad/src/client/minidump_file_writer.cc +FILE 33 /s/clank/src/out_arm/Release/../../breakpad/src/client/minidump_file_writer.h +FILE 34 /s/clank/src/out_arm/Release/../../breakpad/src/common/android/breakpad_getcontext_unittest.cc +FILE 35 /s/clank/src/out_arm/Release/../../breakpad/src/common/android/testing/mkdtemp.h +FILE 36 /s/clank/src/out_arm/Release/../../breakpad/src/common/android/testing/pthread_fixes.h +FILE 37 /s/clank/src/out_arm/Release/../../breakpad/src/common/convert_UTF.c +FILE 38 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/elf_core_dump.cc +FILE 39 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/elf_core_dump_unittest.cc +FILE 40 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/elfutils-inl.h +FILE 41 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/elfutils.cc +FILE 42 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/file_id.cc +FILE 43 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/file_id_unittest.cc +FILE 44 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/guid_creator.cc +FILE 45 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/linux_libc_support.cc +FILE 46 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/linux_libc_support_unittest.cc +FILE 47 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/memory_mapped_file.cc +FILE 48 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/safe_readlink.cc +FILE 49 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/safe_readlink.h +FILE 50 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/synth_elf.cc +FILE 51 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/synth_elf.h +FILE 52 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/tests/auto_testfile.h +FILE 53 /s/clank/src/out_arm/Release/../../breakpad/src/common/linux/tests/crash_generator.cc +FILE 54 /s/clank/src/out_arm/Release/../../breakpad/src/common/memory.h +FILE 55 /s/clank/src/out_arm/Release/../../breakpad/src/common/memory_range.h +FILE 56 /s/clank/src/out_arm/Release/../../breakpad/src/common/memory_unittest.cc +FILE 57 /s/clank/src/out_arm/Release/../../breakpad/src/common/scoped_ptr.h +FILE 58 /s/clank/src/out_arm/Release/../../breakpad/src/common/simple_string_dictionary.h +FILE 59 /s/clank/src/out_arm/Release/../../breakpad/src/common/simple_string_dictionary_unittest.cc +FILE 60 /s/clank/src/out_arm/Release/../../breakpad/src/common/string_conversion.cc +FILE 61 /s/clank/src/out_arm/Release/../../breakpad/src/common/test_assembler.cc +FILE 62 /s/clank/src/out_arm/Release/../../breakpad/src/common/test_assembler.h +FILE 63 /s/clank/src/out_arm/Release/../../breakpad/src/common/tests/auto_tempdir.h +FILE 64 /s/clank/src/out_arm/Release/../../breakpad/src/common/tests/file_utils.cc +FILE 65 /s/clank/src/out_arm/Release/../../breakpad/src/google_breakpad/processor/minidump.h +FILE 66 /s/clank/src/out_arm/Release/../../breakpad/src/processor/basic_code_module.h +FILE 67 /s/clank/src/out_arm/Release/../../breakpad/src/processor/basic_code_modules.cc +FILE 68 /s/clank/src/out_arm/Release/../../breakpad/src/processor/dump_context.cc +FILE 69 /s/clank/src/out_arm/Release/../../breakpad/src/processor/dump_object.cc +FILE 70 /s/clank/src/out_arm/Release/../../breakpad/src/processor/linked_ptr.h +FILE 71 /s/clank/src/out_arm/Release/../../breakpad/src/processor/logging.cc +FILE 72 /s/clank/src/out_arm/Release/../../breakpad/src/processor/logging.h +FILE 73 /s/clank/src/out_arm/Release/../../breakpad/src/processor/minidump.cc +FILE 74 /s/clank/src/out_arm/Release/../../breakpad/src/processor/pathname_stripper.cc +FILE 75 /s/clank/src/out_arm/Release/../../breakpad/src/processor/range_map-inl.h +FILE 76 /s/clank/src/out_arm/Release/../../breakpad/src/processor/range_map.h +FILE 77 /s/clank/src/out_arm/Release/../../breakpad/src/tools/linux/md2core/minidump_memory_range.h +FILE 78 /s/clank/src/out_arm/Release/../../breakpad/src/tools/linux/md2core/minidump_memory_range_unittest.cc +FILE 79 /s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/gtest-message.h +FILE 80 /s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/gtest-printers.h +FILE 81 /s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/gtest-test-part.h +FILE 82 /s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/gtest.h +FILE 83 /s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/internal/gtest-death-test-internal.h +FILE 84 /s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/internal/gtest-filepath.h +FILE 85 /s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/internal/gtest-internal.h +FILE 86 /s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/internal/gtest-param-util.h +FILE 87 /s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/internal/gtest-port.h +FILE 88 /s/clank/src/out_arm/Release/../../testing/gtest/include/gtest/internal/gtest-type-util.h +FILE 89 /s/clank/src/out_arm/Release/../../testing/gtest/src/gtest-death-test.cc +FILE 90 /s/clank/src/out_arm/Release/../../testing/gtest/src/gtest-filepath.cc +FILE 91 /s/clank/src/out_arm/Release/../../testing/gtest/src/gtest-internal-inl.h +FILE 92 /s/clank/src/out_arm/Release/../../testing/gtest/src/gtest-port.cc +FILE 93 /s/clank/src/out_arm/Release/../../testing/gtest/src/gtest-printers.cc +FILE 94 /s/clank/src/out_arm/Release/../../testing/gtest/src/gtest-test-part.cc +FILE 95 /s/clank/src/out_arm/Release/../../testing/gtest/src/gtest.cc +FILE 96 /s/clank/src/out_arm/Release/../../testing/gtest/src/gtest_main.cc +FILE 97 /s/clank/src/out_arm/Release/../../third_party/lss/linux_syscall_support.h +FILE 98 /s/clank/src/third_party/android_tools/ndk/platforms/android-14/arch-arm/usr/include/ctype.h +FILE 99 /s/clank/src/third_party/android_tools/ndk/platforms/android-14/arch-arm/usr/include/linux/socket.h +FILE 100 /s/clank/src/third_party/android_tools/ndk/platforms/android-14/arch-arm/usr/include/signal.h +FILE 101 /s/clank/src/third_party/android_tools/ndk/platforms/android-14/arch-arm/usr/include/stdlib.h +FILE 102 /s/clank/src/third_party/android_tools/ndk/platforms/android-14/arch-arm/usr/include/unistd.h +FILE 103 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_algo.h +FILE 104 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_algobase.c +FILE 105 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_algobase.h +FILE 106 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_alloc.h +FILE 107 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_codecvt.h +FILE 108 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_construct.h +FILE 109 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_fstream.c +FILE 110 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_fstream.h +FILE 111 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_function_base.h +FILE 112 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_iomanip.h +FILE 113 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ios.c +FILE 114 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ios.h +FILE 115 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ios_base.h +FILE 116 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_istream.c +FILE 117 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_istream.h +FILE 118 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_iterator.h +FILE 119 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_iterator_base.h +FILE 120 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_list.c +FILE 121 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_list.h +FILE 122 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_locale.h +FILE 123 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_map.h +FILE 124 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_new.h +FILE 125 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_num_put.h +FILE 126 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ostream.c +FILE 127 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ostream.h +FILE 128 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_ostreambuf_iterator.h +FILE 129 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_pair.h +FILE 130 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_relops_cont.h +FILE 131 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_sstream.c +FILE 132 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_sstream.h +FILE 133 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_streambuf.c +FILE 134 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_streambuf.h +FILE 135 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_string.c +FILE 136 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_string.h +FILE 137 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_string_base.h +FILE 138 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_string_io.c +FILE 139 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_string_operators.h +FILE 140 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_tree.c +FILE 141 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_tree.h +FILE 142 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_uninitialized.h +FILE 143 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_vector.c +FILE 144 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/_vector.h +FILE 145 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/char_traits.h +FILE 146 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/pointers/_list.h +FILE 147 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/pointers/_set.h +FILE 148 /s/clank/src/third_party/android_tools/ndk/sources/cxx-stl/stlport/stlport/stl/pointers/_vector.h +FILE 149 /s/ndk-andrewhsieh/build/toolchain/gcc-4.9/arm-linux-androideabi/thumb/libgcc/./unwind.h +FILE 150 /s/ndk-andrewhsieh/build/toolchain/gcc-4.9/gcc/include/unwind-arm-common.h +FILE 151 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/config/arm/bpabi.c +FILE 152 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/config/arm/pr-support.c +FILE 153 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/config/arm/unwind-arm.c +FILE 154 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/libgcc2.c +FILE 155 /s/ndk-toolchain/src/build/../gcc/gcc-4.9/libgcc/unwind-arm-common.inc +FILE 156 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/include/unwind-arm.h +FILE 157 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/call_unexpected.cc +FILE 158 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/class_type_info.cc +FILE 159 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/cxxabi.cc +FILE 160 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/cxxabi_defines.h +FILE 161 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/delete.cc +FILE 162 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/dwarf_helper.cc +FILE 163 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/dynamic_cast.cc +FILE 164 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/exception.cc +FILE 165 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/fatal_error.cc +FILE 166 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/helper_func_internal.cc +FILE 167 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/new.cc +FILE 168 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/one_time_construction.cc +FILE 169 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/personality.cc +FILE 170 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/si_class_type_info.cc +FILE 171 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/terminate.cc +FILE 172 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/type_info.cc +FILE 173 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/gabi++/src/vmi_class_type_info.cc +FILE 174 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/_stdio_file.h +FILE 175 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/allocators.cpp +FILE 176 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/c_locale_dummy/c_locale_dummy.c +FILE 177 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/codecvt.cpp +FILE 178 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/collate.cpp +FILE 179 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/ctype.cpp +FILE 180 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/details/fstream_unistd.cpp +FILE 181 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/dll_main.cpp +FILE 182 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/fstream.cpp +FILE 183 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/ios.cpp +FILE 184 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/iostream.cpp +FILE 185 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/locale.cpp +FILE 186 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/locale_impl.cpp +FILE 187 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/locale_impl.h +FILE 188 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/messages.cpp +FILE 189 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/monetary.cpp +FILE 190 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/num_get.cpp +FILE 191 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/num_get_float.cpp +FILE 192 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/num_put.cpp +FILE 193 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/num_put_float.cpp +FILE 194 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/numpunct.cpp +FILE 195 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/stdio_streambuf.cpp +FILE 196 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/stdio_streambuf.h +FILE 197 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/src/time_facets.cpp +FILE 198 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_algo.h +FILE 199 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_algobase.c +FILE 200 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_algobase.h +FILE 201 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_alloc.h +FILE 202 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_auto_ptr.h +FILE 203 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_codecvt.h +FILE 204 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_collate.h +FILE 205 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_construct.h +FILE 206 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ctype.h +FILE 207 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_fstream.c +FILE 208 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_fstream.h +FILE 209 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_function.h +FILE 210 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ios.c +FILE 211 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ios.h +FILE 212 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ios_base.h +FILE 213 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_iostream_string.h +FILE 214 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_istream.h +FILE 215 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_istreambuf_iterator.h +FILE 216 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_iterator_base.h +FILE 217 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_limits.c +FILE 218 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_locale.h +FILE 219 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_messages_facets.h +FILE 220 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_monetary.c +FILE 221 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_monetary.h +FILE 222 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_new.h +FILE 223 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_num_get.c +FILE 224 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_num_get.h +FILE 225 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_num_put.c +FILE 226 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_num_put.h +FILE 227 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_numpunct.h +FILE 228 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ostream.c +FILE 229 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_ostreambuf_iterator.h +FILE 230 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_pair.h +FILE 231 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_range_errors.c +FILE 232 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_stdexcept.h +FILE 233 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_stdexcept_base.c +FILE 234 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_streambuf.c +FILE 235 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_streambuf.h +FILE 236 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_string.c +FILE 237 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_string.h +FILE 238 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_string_base.h +FILE 239 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_string_operators.h +FILE 240 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_threads.h +FILE 241 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_time_facets.c +FILE 242 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_time_facets.h +FILE 243 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_uninitialized.h +FILE 244 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_vector.c +FILE 245 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/_vector.h +FILE 246 /tmp/ndk-user/tmp/build-stlport/ndk/sources/cxx-stl/stlport/stlport/stl/char_traits.h +FUNC c 2c 0 std::basic_istream >::~basic_istream +c 2 44 228 +e 2 43 228 +10 2 43 228 +12 2 44 228 +14 2 43 228 +16 4 44 228 +1a 2 59 211 +1c 2 44 228 +1e 8 59 211 +26 e 90 214 +34 4 90 214 +FUNC c 12 0 std::basic_ostream >::~basic_ostream +FUNC 13a40 e0 0 MinidumpWriter::WriteFile +13a40 8 1101 26 +13a48 2 1102 26 +13a4a 2 1101 26 +13a4c 4 1102 26 +13a50 6 1103 26 +13a56 4 1104 26 +13a5a 2 100 22 +13a5c a 772 26 +13a66 2 1115 26 +13a68 2 772 26 +13a6a 2 1116 26 +13a6c 2 1133 26 +13a6e 2 1115 26 +13a70 2 1116 26 +13a72 12 1122 26 +13a84 4 1123 26 +13a88 4 1123 26 +13a8c 8 1123 26 +13a94 4 1125 26 +13a98 6 1137 26 +13a9e 4 1139 26 +13aa2 4 1142 26 +13aa6 4 161 33 +13aaa 2 1143 26 +13aac 4 161 33 +13ab0 4 1143 26 +13ab4 2 161 33 +13ab6 c 1143 26 +13ac2 4 1150 26 +13ac6 c 1155 26 +13ad2 4 1156 26 +13ad6 2 1145 26 +13ad8 4 1145 26 +13adc 8 176 33 +13ae4 a 1158 26 +13aee 2 1159 26 +13af0 2 1129 26 +13af2 2 1128 26 +13af4 2 1129 26 +13af6 4 1130 26 +13afa 2 1129 26 +13afc 2 1130 26 +13afe 2 100 22 +13b00 a 772 26 +13b0a 2 1131 26 +13b0c 4 1133 26 +13b10 8 1134 26 +13b18 8 1160 26 +FUNC 13b20 40 0 MinidumpWriter::WriteProcFile +13b20 c 1212 26 +13b2c 2 1215 26 +13b2e 4 1212 26 +13b32 2 1212 26 +13b34 e 1215 26 +13b42 a 1217 26 +13b4c 14 1218 26 +FUNC 13b60 28 0 std::priv::_STLP_alloc_proxy >::allocate(unsigned int, unsigned int&) +13b60 2 525 201 +13b62 26 343 201 +FUNC 13b88 6ac 0 _GLOBAL__sub_I__ZN40ExceptionHandlerTest_SimpleWithPath_Test10test_info_E +13b88 4 1191 6 +13b8c 6 160 6 +13b92 6 160 6 +13b98 2 160 6 +13b9a 4 1191 6 +13b9e 4 484 85 +13ba2 2 1191 6 +13ba4 2 484 85 +13ba6 4 160 6 +13baa 4 484 85 +13bae 24 160 6 +13bd2 8 160 6 +13bda 6 170 6 +13be0 6 170 6 +13be6 2 170 6 +13be8 4 484 85 +13bec 4 170 6 +13bf0 2 484 85 +13bf2 2 170 6 +13bf4 4 484 85 +13bf8 12 170 6 +13c0a 8 170 6 +13c12 6 253 6 +13c18 6 253 6 +13c1e 2 253 6 +13c20 4 484 85 +13c24 4 253 6 +13c28 2 484 85 +13c2a 2 253 6 +13c2c 4 484 85 +13c30 12 253 6 +13c42 8 253 6 +13c4a 6 257 6 +13c50 6 257 6 +13c56 2 257 6 +13c58 4 484 85 +13c5c 4 257 6 +13c60 2 484 85 +13c62 2 257 6 +13c64 4 484 85 +13c68 12 257 6 +13c7a 8 257 6 +13c82 6 315 6 +13c88 6 315 6 +13c8e 2 315 6 +13c90 4 484 85 +13c94 4 315 6 +13c98 2 484 85 +13c9a 2 315 6 +13c9c 4 484 85 +13ca0 12 315 6 +13cb2 8 315 6 +13cba 6 327 6 +13cc0 6 327 6 +13cc6 2 327 6 +13cc8 4 484 85 +13ccc 4 327 6 +13cd0 2 484 85 +13cd2 2 327 6 +13cd4 4 484 85 +13cd8 12 327 6 +13cea 8 327 6 +13cf2 6 339 6 +13cf8 6 339 6 +13cfe 2 339 6 +13d00 4 484 85 +13d04 4 339 6 +13d08 2 484 85 +13d0a 2 339 6 +13d0c 4 484 85 +13d10 12 339 6 +13d22 8 339 6 +13d2a 6 351 6 +13d30 6 351 6 +13d36 2 351 6 +13d38 4 484 85 +13d3c 4 351 6 +13d40 2 484 85 +13d42 2 351 6 +13d44 4 484 85 +13d48 12 351 6 +13d5a 6 351 6 +13d60 6 363 6 +13d66 6 363 6 +13d6c 2 363 6 +13d6e 2 484 85 +13d70 2 363 6 +13d72 2 484 85 +13d74 2 363 6 +13d76 4 484 85 +13d7a 12 363 6 +13d8c 6 363 6 +13d92 6 380 6 +13d98 6 380 6 +13d9e 2 380 6 +13da0 2 484 85 +13da2 2 380 6 +13da4 2 484 85 +13da6 2 380 6 +13da8 4 484 85 +13dac 12 380 6 +13dbe 6 380 6 +13dc4 6 409 6 +13dca 6 409 6 +13dd0 2 409 6 +13dd2 2 484 85 +13dd4 2 409 6 +13dd6 2 484 85 +13dd8 2 409 6 +13dda 4 484 85 +13dde 12 409 6 +13df0 6 409 6 +13df6 6 425 6 +13dfc 6 425 6 +13e02 2 425 6 +13e04 2 484 85 +13e06 2 425 6 +13e08 2 484 85 +13e0a 2 425 6 +13e0c 4 484 85 +13e10 12 425 6 +13e22 6 425 6 +13e28 6 441 6 +13e2e 6 441 6 +13e34 2 441 6 +13e36 2 484 85 +13e38 2 441 6 +13e3a 2 484 85 +13e3c 2 441 6 +13e3e 4 484 85 +13e42 12 441 6 +13e54 6 441 6 +13e5a 6 457 6 +13e60 6 457 6 +13e66 2 457 6 +13e68 2 484 85 +13e6a 2 457 6 +13e6c 2 484 85 +13e6e 2 457 6 +13e70 4 484 85 +13e74 12 457 6 +13e86 6 457 6 +13e8c 6 487 6 +13e92 6 487 6 +13e98 2 487 6 +13e9a 2 484 85 +13e9c 2 487 6 +13e9e 2 484 85 +13ea0 2 487 6 +13ea2 4 484 85 +13ea6 12 487 6 +13eb8 6 487 6 +13ebe 6 579 6 +13ec4 6 579 6 +13eca 2 579 6 +13ecc 2 484 85 +13ece 2 579 6 +13ed0 2 484 85 +13ed2 2 579 6 +13ed4 4 484 85 +13ed8 12 579 6 +13eea 6 579 6 +13ef0 6 667 6 +13ef6 6 667 6 +13efc 2 667 6 +13efe 2 484 85 +13f00 2 667 6 +13f02 2 484 85 +13f04 2 667 6 +13f06 4 484 85 +13f0a 12 667 6 +13f1c 6 667 6 +13f22 6 760 6 +13f28 6 760 6 +13f2e 2 760 6 +13f30 2 484 85 +13f32 2 760 6 +13f34 2 484 85 +13f36 2 760 6 +13f38 4 484 85 +13f3c 12 760 6 +13f4e 6 760 6 +13f54 6 806 6 +13f5a 6 806 6 +13f60 2 806 6 +13f62 2 484 85 +13f64 2 806 6 +13f66 2 484 85 +13f68 2 806 6 +13f6a 4 484 85 +13f6e 12 806 6 +13f80 6 806 6 +13f86 6 926 6 +13f8c 6 926 6 +13f92 2 926 6 +13f94 2 484 85 +13f96 2 926 6 +13f98 2 484 85 +13f9a 2 926 6 +13f9c 4 484 85 +13fa0 12 926 6 +13fb2 6 926 6 +13fb8 6 1000 6 +13fbe 6 1000 6 +13fc4 2 1000 6 +13fc6 2 484 85 +13fc8 2 1000 6 +13fca 2 484 85 +13fcc 2 1000 6 +13fce 4 484 85 +13fd2 12 1000 6 +13fe4 6 1000 6 +13fea 6 1019 6 +13ff0 6 1019 6 +13ff6 2 1019 6 +13ff8 2 484 85 +13ffa 2 1019 6 +13ffc 2 484 85 +13ffe 2 1019 6 +14000 4 484 85 +14004 12 1019 6 +14016 6 1019 6 +1401c 6 1036 6 +14022 6 1036 6 +14028 2 1036 6 +1402a 2 484 85 +1402c 2 1036 6 +1402e 2 484 85 +14030 2 1036 6 +14032 4 484 85 +14036 12 1036 6 +14048 6 1036 6 +1404e 6 1068 6 +14054 6 1068 6 +1405a 2 1068 6 +1405c 2 484 85 +1405e 2 1068 6 +14060 2 484 85 +14062 2 1068 6 +14064 4 484 85 +14068 12 1068 6 +1407a 6 1068 6 +14080 6 1112 6 +14086 6 1112 6 +1408c 2 1112 6 +1408e 2 484 85 +14090 2 1112 6 +14092 2 484 85 +14094 2 1112 6 +14096 4 484 85 +1409a 12 1112 6 +140ac 6 1112 6 +140b2 6 1154 6 +140b8 6 1154 6 +140be 2 1154 6 +140c0 2 484 85 +140c2 2 1154 6 +140c4 2 484 85 +140c6 2 1154 6 +140c8 4 484 85 +140cc 12 1154 6 +140de 6 1154 6 +140e4 150 1191 6 +FUNC 14234 58 0 _GLOBAL__sub_I_microdump_writer_unittest.cc +14234 2 132 11 +14236 6 56 11 +1423c 6 56 11 +14242 2 56 11 +14244 2 484 85 +14246 2 56 11 +14248 6 484 85 +1424e 1c 56 11 +1426a 6 56 11 +14270 1c 132 11 +FUNC 1428c 294 0 _GLOBAL__sub_I__ZN26CpuSetTest_EmptyCount_Test10test_info_E +1428c 4 163 13 +14290 6 58 13 +14296 6 58 13 +1429c 2 58 13 +1429e 2 163 13 +142a0 2 484 85 +142a2 2 163 13 +142a4 2 484 85 +142a6 2 58 13 +142a8 4 484 85 +142ac 1e 58 13 +142ca 6 58 13 +142d0 6 63 13 +142d6 6 63 13 +142dc 2 63 13 +142de 2 484 85 +142e0 2 63 13 +142e2 2 484 85 +142e4 2 63 13 +142e6 4 484 85 +142ea 12 63 13 +142fc 6 63 13 +14302 6 72 13 +14308 6 72 13 +1430e 2 72 13 +14310 2 484 85 +14312 2 72 13 +14314 2 484 85 +14316 2 72 13 +14318 4 484 85 +1431c 12 72 13 +1432e 6 72 13 +14334 6 81 13 +1433a 6 81 13 +14340 2 81 13 +14342 2 484 85 +14344 2 81 13 +14346 2 484 85 +14348 2 81 13 +1434a 4 484 85 +1434e 12 81 13 +14360 6 81 13 +14366 6 90 13 +1436c 6 90 13 +14372 2 90 13 +14374 2 484 85 +14376 2 90 13 +14378 2 484 85 +1437a 2 90 13 +1437c 4 484 85 +14380 12 90 13 +14392 6 90 13 +14398 6 99 13 +1439e 6 99 13 +143a4 2 99 13 +143a6 2 484 85 +143a8 2 99 13 +143aa 2 484 85 +143ac 2 99 13 +143ae 4 484 85 +143b2 12 99 13 +143c4 6 99 13 +143ca 6 108 13 +143d0 6 108 13 +143d6 2 108 13 +143d8 2 484 85 +143da 2 108 13 +143dc 2 484 85 +143de 2 108 13 +143e0 4 484 85 +143e4 12 108 13 +143f6 6 108 13 +143fc 6 117 13 +14402 6 117 13 +14408 2 117 13 +1440a 2 484 85 +1440c 2 117 13 +1440e 2 484 85 +14410 2 117 13 +14412 4 484 85 +14416 12 117 13 +14428 6 117 13 +1442e 6 135 13 +14434 6 135 13 +1443a 2 135 13 +1443c 2 484 85 +1443e 2 135 13 +14440 2 484 85 +14442 2 135 13 +14444 4 484 85 +14448 12 135 13 +1445a 6 135 13 +14460 6 146 13 +14466 6 146 13 +1446c 2 146 13 +1446e 2 484 85 +14470 2 146 13 +14472 2 484 85 +14474 2 146 13 +14476 4 484 85 +1447a 12 146 13 +1448c 6 146 13 +14492 8e 163 13 +FUNC 14520 5c 0 _GLOBAL__sub_I__ZN39DirectoryReaderTest_CompareResults_Test10test_info_E +14520 2 78 15 +14522 6 47 15 +14528 8 47 15 +14530 2 47 15 +14532 8 484 85 +1453a 1e 47 15 +14558 6 47 15 +1455e 1e 78 15 +FUNC 1457c 1dc 0 _GLOBAL__sub_I__ZN29LineReaderTest_EmptyFile_Test10test_info_E +1457c 4 169 17 +14580 6 57 17 +14586 6 57 17 +1458c 2 57 17 +1458e 2 169 17 +14590 2 484 85 +14592 2 169 17 +14594 2 484 85 +14596 2 57 17 +14598 4 484 85 +1459c 1e 57 17 +145ba 6 57 17 +145c0 6 67 17 +145c6 6 67 17 +145cc 2 67 17 +145ce 2 484 85 +145d0 2 67 17 +145d2 2 484 85 +145d4 2 67 17 +145d6 4 484 85 +145da 12 67 17 +145ec 6 67 17 +145f2 6 83 17 +145f8 6 83 17 +145fe 2 83 17 +14600 2 484 85 +14602 2 83 17 +14604 2 484 85 +14606 2 83 17 +14608 4 484 85 +1460c 12 83 17 +1461e 6 83 17 +14624 6 99 17 +1462a 6 99 17 +14630 2 99 17 +14632 2 484 85 +14634 2 99 17 +14636 2 484 85 +14638 2 99 17 +1463a 4 484 85 +1463e 12 99 17 +14650 6 99 17 +14656 6 121 17 +1465c 6 121 17 +14662 2 121 17 +14664 2 484 85 +14666 2 121 17 +14668 2 484 85 +1466a 2 121 17 +1466c 4 484 85 +14670 12 121 17 +14682 6 121 17 +14688 6 143 17 +1468e 6 143 17 +14694 2 143 17 +14696 2 484 85 +14698 2 143 17 +1469a 2 484 85 +1469c 2 143 17 +1469e 4 484 85 +146a2 12 143 17 +146b4 6 143 17 +146ba 6 158 17 +146c0 6 158 17 +146c6 2 158 17 +146c8 2 484 85 +146ca 2 158 17 +146cc 2 484 85 +146ce 2 158 17 +146d0 4 484 85 +146d4 12 158 17 +146e6 6 158 17 +146ec 6c 169 17 +FUNC 14758 9c 0 _GLOBAL__sub_I__ZN38LinuxCoreDumperTest_BuildProcPath_Test10test_info_E +14758 4 118 20 +1475c 6 42 20 +14762 8 42 20 +1476a 2 42 20 +1476c 8 484 85 +14774 20 42 20 +14794 6 42 20 +1479a 6 65 20 +147a0 8 65 20 +147a8 2 65 20 +147aa 4 484 85 +147ae 2 65 20 +147b0 4 484 85 +147b4 12 65 20 +147c6 6 65 20 +147cc 28 118 20 +FUNC 147f4 1d4 0 _GLOBAL__sub_I__ZN37LinuxPtraceDumperChildTest_Setup_Test10test_info_E +147f4 4 463 25 +147f8 6 121 25 +147fe 2 121 25 +14800 2 463 25 +14802 2 484 85 +14804 2 463 25 +14806 2 484 85 +14808 14 121 25 +1481c 4 484 85 +14820 14 121 25 +14834 6 121 25 +1483a 6 125 25 +14840 2 125 25 +14842 2 484 85 +14844 2 125 25 +14846 2 484 85 +14848 2 125 25 +1484a 4 484 85 +1484e 12 125 25 +14860 6 125 25 +14866 6 134 25 +1486c 2 134 25 +1486e 2 484 85 +14870 2 134 25 +14872 2 484 85 +14874 2 134 25 +14876 4 484 85 +1487a 12 134 25 +1488c 6 134 25 +14892 6 226 25 +14898 2 226 25 +1489a 2 484 85 +1489c 2 226 25 +1489e 2 484 85 +148a0 2 226 25 +148a2 4 484 85 +148a6 16 226 25 +148bc 6 226 25 +148c2 6 246 25 +148c8 2 246 25 +148ca 2 484 85 +148cc 2 246 25 +148ce 2 484 85 +148d0 2 246 25 +148d2 4 484 85 +148d6 12 246 25 +148e8 6 246 25 +148ee 6 325 25 +148f4 2 325 25 +148f6 2 484 85 +148f8 2 325 25 +148fa 2 484 85 +148fc 2 325 25 +148fe 4 484 85 +14902 12 325 25 +14914 6 325 25 +1491a 6 364 25 +14920 6 364 25 +14926 2 364 25 +14928 2 484 85 +1492a 2 364 25 +1492c 2 484 85 +1492e 2 364 25 +14930 4 484 85 +14934 12 364 25 +14946 6 364 25 +1494c 7c 463 25 +FUNC 149c8 200 0 _GLOBAL__sub_I_minidump_writer_unittest.cc +149c8 4 756 27 +149cc 6 67 27 +149d2 6 67 27 +149d8 2 67 27 +149da 2 484 85 +149dc 2 67 27 +149de 6 484 85 +149e4 1e 67 27 +14a02 6 67 27 +14a08 6 96 27 +14a0e 6 96 27 +14a14 2 96 27 +14a16 2 484 85 +14a18 2 96 27 +14a1a 6 484 85 +14a20 12 96 27 +14a32 6 96 27 +14a38 6 128 27 +14a3e 6 128 27 +14a44 2 128 27 +14a46 2 484 85 +14a48 2 128 27 +14a4a 6 484 85 +14a50 12 128 27 +14a62 6 128 27 +14a68 6 236 27 +14a6e 6 236 27 +14a74 2 236 27 +14a76 2 484 85 +14a78 2 236 27 +14a7a 6 484 85 +14a80 12 236 27 +14a92 6 236 27 +14a98 6 338 27 +14a9e 6 338 27 +14aa4 2 338 27 +14aa6 2 484 85 +14aa8 2 338 27 +14aaa 6 484 85 +14ab0 12 338 27 +14ac2 6 338 27 +14ac8 6 432 27 +14ace 6 432 27 +14ad4 2 432 27 +14ad6 2 484 85 +14ad8 2 432 27 +14ada 6 484 85 +14ae0 12 432 27 +14af2 6 432 27 +14af8 6 504 27 +14afe 6 504 27 +14b04 2 504 27 +14b06 2 484 85 +14b08 2 504 27 +14b0a 6 484 85 +14b10 12 504 27 +14b22 6 504 27 +14b28 6 583 27 +14b2e 6 583 27 +14b34 2 583 27 +14b36 2 484 85 +14b38 2 583 27 +14b3a 6 484 85 +14b40 12 583 27 +14b52 6 583 27 +14b58 70 756 27 +FUNC 14bc8 294 0 _GLOBAL__sub_I__ZN36ProcCpuInfoReaderTest_EmptyFile_Test10test_info_E +14bc8 4 199 30 +14bcc 6 63 30 +14bd2 6 63 30 +14bd8 2 63 30 +14bda 2 199 30 +14bdc 2 484 85 +14bde 2 199 30 +14be0 2 484 85 +14be2 2 63 30 +14be4 4 484 85 +14be8 1e 63 30 +14c06 6 63 30 +14c0c 6 72 30 +14c12 6 72 30 +14c18 2 72 30 +14c1a 2 484 85 +14c1c 2 72 30 +14c1e 2 484 85 +14c20 2 72 30 +14c22 4 484 85 +14c26 12 72 30 +14c38 6 72 30 +14c3e 6 85 30 +14c44 6 85 30 +14c4a 2 85 30 +14c4c 2 484 85 +14c4e 2 85 30 +14c50 2 484 85 +14c52 2 85 30 +14c54 4 484 85 +14c58 12 85 30 +14c6a 6 85 30 +14c70 6 100 30 +14c76 6 100 30 +14c7c 2 100 30 +14c7e 2 484 85 +14c80 2 100 30 +14c82 2 484 85 +14c84 2 100 30 +14c86 4 484 85 +14c8a 12 100 30 +14c9c 6 100 30 +14ca2 6 117 30 +14ca8 6 117 30 +14cae 2 117 30 +14cb0 2 484 85 +14cb2 2 117 30 +14cb4 2 484 85 +14cb6 2 117 30 +14cb8 4 484 85 +14cbc 12 117 30 +14cce 6 117 30 +14cd4 6 130 30 +14cda 6 130 30 +14ce0 2 130 30 +14ce2 2 484 85 +14ce4 2 130 30 +14ce6 2 484 85 +14ce8 2 130 30 +14cea 4 484 85 +14cee 12 130 30 +14d00 6 130 30 +14d06 6 143 30 +14d0c 6 143 30 +14d12 2 143 30 +14d14 2 484 85 +14d16 2 143 30 +14d18 2 484 85 +14d1a 2 143 30 +14d1c 4 484 85 +14d20 12 143 30 +14d32 6 143 30 +14d38 6 156 30 +14d3e 6 156 30 +14d44 2 156 30 +14d46 2 484 85 +14d48 2 156 30 +14d4a 2 484 85 +14d4c 2 156 30 +14d4e 4 484 85 +14d52 12 156 30 +14d64 6 156 30 +14d6a 6 173 30 +14d70 6 173 30 +14d76 2 173 30 +14d78 2 484 85 +14d7a 2 173 30 +14d7c 2 484 85 +14d7e 2 173 30 +14d80 4 484 85 +14d84 12 173 30 +14d96 6 173 30 +14d9c 6 186 30 +14da2 6 186 30 +14da8 2 186 30 +14daa 2 484 85 +14dac 2 186 30 +14dae 2 484 85 +14db0 2 186 30 +14db2 4 484 85 +14db6 12 186 30 +14dc8 6 186 30 +14dce 8e 199 30 +FUNC 14e5c dc 0 _GLOBAL__sub_I__ZN39ElfCoreDumpTest_DefaultConstructor_Test10test_info_E +14e5c 4 256 39 +14e60 6 52 39 +14e66 8 52 39 +14e6e 2 52 39 +14e70 8 484 85 +14e78 20 52 39 +14e98 6 52 39 +14e9e 6 62 39 +14ea4 8 62 39 +14eac 2 62 39 +14eae 4 484 85 +14eb2 2 62 39 +14eb4 4 484 85 +14eb8 12 62 39 +14eca 6 62 39 +14ed0 6 130 39 +14ed6 8 130 39 +14ede 2 130 39 +14ee0 4 484 85 +14ee4 2 130 39 +14ee6 4 484 85 +14eea 12 130 39 +14efc 6 130 39 +14f02 36 256 39 +FUNC 14f38 84 0 _GLOBAL__sub_I_gtest_FileIDTest_ElfClass_registered_ +14f38 2 263 43 +14f3a 18 127 43 +14f52 2 151 43 +14f54 4 127 43 +14f58 e 151 43 +14f66 2 183 43 +14f68 4 151 43 +14f6c e 183 43 +14f7a 2 220 43 +14f7c 4 183 43 +14f80 3c 220 43 +FUNC 14fbc 294 0 _GLOBAL__sub_I__ZN32LinuxLibcSupportTest_strlen_Test10test_info_E +14fbc 4 213 46 +14fc0 6 37 46 +14fc6 6 37 46 +14fcc 2 37 46 +14fce 2 213 46 +14fd0 2 484 85 +14fd2 2 213 46 +14fd4 2 484 85 +14fd6 2 37 46 +14fd8 4 484 85 +14fdc 1e 37 46 +14ffa 6 37 46 +15000 6 46 46 +15006 6 46 46 +1500c 2 46 46 +1500e 2 484 85 +15010 2 46 46 +15012 2 484 85 +15014 2 46 46 +15016 4 484 85 +1501a 12 46 46 +1502c 6 46 46 +15032 6 71 46 +15038 6 71 46 +1503e 2 71 46 +15040 2 484 85 +15042 2 71 46 +15044 2 484 85 +15046 2 71 46 +15048 4 484 85 +1504c 12 71 46 +1505e 6 71 46 +15064 6 92 46 +1506a 6 92 46 +15070 2 92 46 +15072 2 484 85 +15074 2 92 46 +15076 2 484 85 +15078 2 92 46 +1507a 4 484 85 +1507e 12 92 46 +15090 6 92 46 +15096 6 106 46 +1509c 6 106 46 +150a2 2 106 46 +150a4 2 484 85 +150a6 2 106 46 +150a8 2 484 85 +150aa 2 106 46 +150ac 4 484 85 +150b0 12 106 46 +150c2 6 106 46 +150c8 6 129 46 +150ce 6 129 46 +150d4 2 129 46 +150d6 2 484 85 +150d8 2 129 46 +150da 2 484 85 +150dc 2 129 46 +150de 4 484 85 +150e2 12 129 46 +150f4 6 129 46 +150fa 6 143 46 +15100 6 143 46 +15106 2 143 46 +15108 2 484 85 +1510a 2 143 46 +1510c 2 484 85 +1510e 2 143 46 +15110 4 484 85 +15114 12 143 46 +15126 6 143 46 +1512c 6 157 46 +15132 6 157 46 +15138 2 157 46 +1513a 2 484 85 +1513c 2 157 46 +1513e 2 484 85 +15140 2 157 46 +15142 4 484 85 +15146 12 157 46 +15158 6 157 46 +1515e 6 169 46 +15164 6 169 46 +1516a 2 169 46 +1516c 2 484 85 +1516e 2 169 46 +15170 2 484 85 +15172 2 169 46 +15174 4 484 85 +15178 12 169 46 +1518a 6 169 46 +15190 6 194 46 +15196 6 194 46 +1519c 2 194 46 +1519e 2 484 85 +151a0 2 194 46 +151a2 2 484 85 +151a4 2 194 46 +151a6 4 484 85 +151aa 12 194 46 +151bc 6 194 46 +151c2 8e 213 46 +FUNC 15250 1a4 0 _GLOBAL__sub_I__ZN28PageAllocatorTest_Setup_Test10test_info_E +15250 6 97 56 +15256 6 39 56 +1525c 6 39 56 +15262 2 39 56 +15264 2 97 56 +15266 2 484 85 +15268 2 97 56 +1526a 2 484 85 +1526c 2 39 56 +1526e 4 484 85 +15272 22 39 56 +15294 6 39 56 +1529a 6 43 56 +152a0 6 43 56 +152a6 2 43 56 +152a8 2 484 85 +152aa 2 43 56 +152ac 2 484 85 +152ae 2 43 56 +152b0 4 484 85 +152b4 12 43 56 +152c6 6 43 56 +152cc 6 53 56 +152d2 6 53 56 +152d8 2 53 56 +152da 2 484 85 +152dc 2 53 56 +152de 2 484 85 +152e0 2 53 56 +152e2 4 484 85 +152e6 12 53 56 +152f8 6 53 56 +152fe 6 69 56 +15304 6 69 56 +1530a 2 69 56 +1530c 2 484 85 +1530e 2 69 56 +15310 6 484 85 +15316 16 69 56 +1532c 6 69 56 +15332 6 76 56 +15338 6 76 56 +1533e 2 76 56 +15340 2 484 85 +15342 2 76 56 +15344 2 484 85 +15346 2 76 56 +15348 4 484 85 +1534c 12 76 56 +1535e 6 76 56 +15364 6 91 56 +1536a 6 91 56 +15370 2 91 56 +15372 2 484 85 +15374 2 91 56 +15376 2 484 85 +15378 2 91 56 +1537a 4 484 85 +1537e 12 91 56 +15390 6 91 56 +15396 5e 97 56 +FUNC 153f4 1dc 0 _GLOBAL__sub_I__ZN15google_breakpad31NonAllocatingMapTest_Entry_Test10test_info_E +153f4 4 308 59 +153f8 6 35 59 +153fe 6 35 59 +15404 2 35 59 +15406 2 308 59 +15408 2 484 85 +1540a 2 308 59 +1540c 2 484 85 +1540e 2 35 59 +15410 4 484 85 +15414 1e 35 59 +15432 6 35 59 +15438 6 63 59 +1543e 6 63 59 +15444 2 63 59 +15446 2 484 85 +15448 2 63 59 +1544a 2 484 85 +1544c 2 63 59 +1544e 4 484 85 +15452 12 63 59 +15464 6 63 59 +1546a 6 92 59 +15470 6 92 59 +15476 2 92 59 +15478 2 484 85 +1547a 2 92 59 +1547c 2 484 85 +1547e 2 92 59 +15480 4 484 85 +15484 12 92 59 +15496 6 92 59 +1549c 6 127 59 +154a2 6 127 59 +154a8 2 127 59 +154aa 2 484 85 +154ac 2 127 59 +154ae 2 484 85 +154b0 2 127 59 +154b2 4 484 85 +154b6 12 127 59 +154c8 6 127 59 +154ce 6 228 59 +154d4 6 228 59 +154da 2 228 59 +154dc 2 484 85 +154de 2 228 59 +154e0 2 484 85 +154e2 2 228 59 +154e4 4 484 85 +154e8 12 228 59 +154fa 6 228 59 +15500 6 253 59 +15506 6 253 59 +1550c 2 253 59 +1550e 2 484 85 +15510 2 253 59 +15512 2 484 85 +15514 2 253 59 +15516 4 484 85 +1551a 12 253 59 +1552c 6 253 59 +15532 6 282 59 +15538 6 282 59 +1553e 2 282 59 +15540 2 484 85 +15542 2 282 59 +15544 2 484 85 +15546 2 282 59 +15548 4 484 85 +1554c 12 282 59 +1555e 6 282 59 +15564 6c 308 59 +FUNC 155d0 300 0 _GLOBAL__sub_I__ZN47MinidumpMemoryRangeTest_DefaultConstructor_Test10test_info_E +155d0 4 258 78 +155d4 a 90 78 +155de 2 78 78 +155e0 2 80 78 +155e2 6 90 78 +155e8 4 79 78 +155ec 4 81 78 +155f0 2 82 78 +155f2 8 90 78 +155fa 6 95 78 +15600 6 95 78 +15606 2 95 78 +15608 2 258 78 +1560a 2 484 85 +1560c 2 258 78 +1560e 2 484 85 +15610 2 95 78 +15612 4 484 85 +15616 1e 95 78 +15634 6 95 78 +1563a 6 101 78 +15640 6 101 78 +15646 2 101 78 +15648 2 484 85 +1564a 2 101 78 +1564c 2 484 85 +1564e 2 101 78 +15650 4 484 85 +15654 12 101 78 +15666 6 101 78 +1566c 6 107 78 +15672 6 107 78 +15678 2 107 78 +1567a 2 484 85 +1567c 2 107 78 +1567e 2 484 85 +15680 2 107 78 +15682 4 484 85 +15686 12 107 78 +15698 6 107 78 +1569e 6 122 78 +156a4 6 122 78 +156aa 2 122 78 +156ac 2 484 85 +156ae 2 122 78 +156b0 2 484 85 +156b2 2 122 78 +156b4 4 484 85 +156b8 12 122 78 +156ca 6 122 78 +156d0 6 133 78 +156d6 6 133 78 +156dc 2 133 78 +156de 2 484 85 +156e0 2 133 78 +156e2 2 484 85 +156e4 2 133 78 +156e6 4 484 85 +156ea 12 133 78 +156fc 6 133 78 +15702 6 140 78 +15708 6 140 78 +1570e 2 140 78 +15710 2 484 85 +15712 2 140 78 +15714 2 484 85 +15716 2 140 78 +15718 4 484 85 +1571c 12 140 78 +1572e 6 140 78 +15734 6 165 78 +1573a 6 165 78 +15740 2 165 78 +15742 2 484 85 +15744 2 165 78 +15746 2 484 85 +15748 2 165 78 +1574a 4 484 85 +1574e 12 165 78 +15760 6 165 78 +15766 6 193 78 +1576c 6 193 78 +15772 2 193 78 +15774 2 484 85 +15776 2 193 78 +15778 2 484 85 +1577a 2 193 78 +1577c 4 484 85 +15780 12 193 78 +15792 6 193 78 +15798 6 201 78 +1579e 6 201 78 +157a4 2 201 78 +157a6 2 484 85 +157a8 2 201 78 +157aa 2 484 85 +157ac 2 201 78 +157ae 4 484 85 +157b2 12 201 78 +157c4 6 201 78 +157ca 6 216 78 +157d0 6 216 78 +157d6 2 216 78 +157d8 2 484 85 +157da 2 216 78 +157dc 2 484 85 +157de 2 216 78 +157e0 4 484 85 +157e4 12 216 78 +157f6 6 216 78 +157fc 6 224 78 +15802 6 224 78 +15808 2 224 78 +1580a 2 484 85 +1580c 2 224 78 +1580e 2 484 85 +15810 2 224 78 +15812 4 484 85 +15816 12 224 78 +15828 6 224 78 +1582e a2 258 78 +FUNC 158d0 9c 0 _GLOBAL__sub_I__ZN32AndroidUContext_GRegsOffset_Test10test_info_E +158d0 4 186 34 +158d4 6 50 34 +158da 8 50 34 +158e2 2 50 34 +158e4 8 484 85 +158ec 20 50 34 +1590c 6 50 34 +15912 6 183 34 +15918 8 183 34 +15920 2 183 34 +15922 4 484 85 +15926 2 183 34 +15928 4 484 85 +1592c 12 183 34 +1593e 6 183 34 +15944 28 186 34 +FUNC 1596c 1e0 0 _GLOBAL__sub_I_gtest.cc +1596c 4 5291 95 +15970 c 193 95 +1597c 2 198 95 +1597e 4 193 95 +15982 2 198 95 +15984 2 209 95 +15986 8 198 95 +1598e 2 203 95 +15990 4 198 95 +15994 2 203 95 +15996 2 209 95 +15998 8 203 95 +159a0 2 209 95 +159a2 4 203 95 +159a6 a 209 95 +159b0 2 209 95 +159b2 4 209 95 +159b6 4 209 95 +159ba 2 209 95 +159bc 8 209 95 +159c4 a 209 95 +159ce c 217 95 +159da 2 217 95 +159dc 2 217 95 +159de a 217 95 +159e8 6 217 95 +159ee 2 229 95 +159f0 4 217 95 +159f4 c 229 95 +15a00 4 229 95 +15a04 2 229 95 +15a06 a 229 95 +15a10 a 229 95 +15a1a c 241 95 +15a26 2 247 95 +15a28 4 241 95 +15a2c a 247 95 +15a36 2 253 95 +15a38 4 247 95 +15a3c a 253 95 +15a46 2 264 95 +15a48 4 253 95 +15a4c a 264 95 +15a56 2 270 95 +15a58 4 264 95 +15a5c a 270 95 +15a66 2 276 95 +15a68 4 270 95 +15a6c 2 276 95 +15a6e 2 276 95 +15a70 6 276 95 +15a76 2 276 95 +15a78 2 276 95 +15a7a 8 276 95 +15a82 a 276 95 +15a8c a 283 95 +15a96 2 377 95 +15a98 2 283 95 +15a9a 2 377 95 +15a9c 4 283 95 +15aa0 8 377 95 +15aa8 a 377 95 +15ab2 a 608 95 +15abc 90 5291 95 +FUNC 15b4c a8 0 _GLOBAL__sub_I_gtest_death_test.cc +15b4c 2 1346 89 +15b4e c 85 89 +15b5a 2 85 89 +15b5c 4 85 89 +15b60 4 85 89 +15b64 4 85 89 +15b68 2 85 89 +15b6a 8 85 89 +15b72 a 85 89 +15b7c a 94 89 +15b86 2 107 89 +15b88 2 94 89 +15b8a 2 107 89 +15b8c 2 94 89 +15b8e 4 107 89 +15b92 2 120 137 +15b94 2 94 89 +15b96 8 107 89 +15b9e 2 120 137 +15ba0 a 107 89 +15baa 2 124 137 +15bac 2 120 137 +15bae 2 481 106 +15bb0 6 124 137 +15bb6 4 101 108 +15bba 2 359 89 +15bbc 2 101 108 +15bbe 8 359 89 +15bc6 2e 1346 89 +FUNC 15bf4 24 0 _GLOBAL__sub_I_gtest_port.cc +15bf4 4 67 144 +15bf8 4 1057 92 +15bfc 6 67 144 +15c02 2 481 106 +15c04 14 1057 92 +FUNC 15c18 2c 0 main +15c18 2 34 96 +15c1a 8 34 96 +15c22 8 35 96 +15c2a 8 36 96 +15c32 4 2326 82 +15c36 4 2326 82 +15c3a a 38 96 +FUNC 15c44 70 0 _GLOBAL__sub_I_cxxabi.cc +15c44 4 210 159 +15c48 2 463 159 +15c4a c 210 159 +15c56 4 104 159 +15c5a 2 108 159 +15c5c 2 104 159 +15c5e 4 108 159 +15c62 2 104 159 +15c64 6 105 159 +15c6a 6 106 159 +15c70 4 108 159 +15c74 a 260 159 +15c7e 2 109 159 +15c80 4 260 159 +15c84 2 110 159 +15c86 4 463 159 +15c8a 4 260 159 +15c8e 26 211 159 +FUNC 15cb4 30 0 _GLOBAL__sub_I_locale_impl.cpp +15cb4 2 764 186 +15cb6 18 621 186 +15cce 4 764 186 +15cd2 12 621 186 +FUNC 15ce4 30 0 _GLOBAL__sub_I_allocators.cpp +15ce4 2 1119 175 +15ce6 c 340 240 +15cf2 c 128 175 +15cfe 4 1119 175 +15d02 12 128 175 +FUNC 15dc4 2 0 testing::Test::SetUpTestCase +15dc4 2 389 82 +FUNC 15dc6 2 0 testing::Test::TearDownTestCase +15dc6 2 397 82 +FUNC 15dc8 4 0 __cxxabiv1::__class_type_info::code() const +15dc8 4 153 160 +FUNC 15dc8 4 0 google_breakpad::LinuxPtraceDumper::IsPostMortem +15dc8 4 275 23 +FUNC 15dc8 4 0 std::basic_streambuf >::showmanyc +15dc8 4 176 133 +FUNC 15dc8 4 0 std::basic_streambuf >::sync +FUNC 15dc8 4 0 std::basic_streambuf >::showmanyc() +FUNC 15dc8 4 0 std::basic_streambuf >::sync() +15dc8 4 184 234 +FUNC 15dc8 4 0 std::moneypunct::do_frac_digits() const +FUNC 15dc8 4 0 std::moneypunct::do_frac_digits() const +FUNC 15dc8 4 0 std::moneypunct::do_frac_digits() const +15dc8 4 111 189 +FUNC 15dc8 4 0 std::moneypunct::do_frac_digits() const +FUNC 15dc8 4 0 std::priv::stdio_istreambuf::showmanyc() +15dc8 4 154 195 +FUNC 15dc8 4 0 testing::Test::Setup +FUNC 15dc8 4 0 testing::internal::GetThreadCount +15dc8 4 133 92 +FUNC 15dcc 4 0 DoneCallbackReturnFalse +15dcc 4 267 6 +FUNC 15dd0 4 0 DoneCallbackReturnTrue +15dd0 4 273 6 +FUNC 15dd4 4 0 FilterCallbackReturnFalse +15dd4 4 284 6 +FUNC 15dd8 4 0 FilterCallbackReturnTrue +15dd8 4 288 6 +FUNC 15ddc 6 0 std::basic_streambuf >::overflow +FUNC 15ddc 6 0 std::basic_streambuf >::pbackfail +15ddc 6 152 133 +FUNC 15ddc 6 0 std::basic_streambuf >::underflow +FUNC 15de2 2 0 google_breakpad::::CrashGenerationClientImpl::~CrashGenerationClientImpl +15de2 2 49 0 +FUNC 15de2 2 0 google_breakpad::MinidumpObject::~MinidumpObject +15de2 2 180 133 +FUNC 15de2 2 0 google_breakpad::SeccompUnwinder::PopSeccompStackFrame +15de2 2 41 1 +FUNC 15de2 2 0 std::basic_streambuf >::imbue +FUNC 15de2 2 0 std::basic_streambuf >::setbuf +FUNC 15de2 2 0 testing::Test::SetUp +FUNC 15de2 2 0 testing::Test::TearDown +FUNC 15de2 2 0 testing::internal::DefaultDeathTestFactory::~DefaultDeathTestFactory +15de2 2 148 83 +FUNC 15de2 2 0 testing::internal::DefaultGlobalTestPartResultReporter::~DefaultGlobalTestPartResultReporter +FUNC 15de2 2 0 testing::internal::DefaultPerThreadTestPartResultReporter::~DefaultPerThreadTestPartResultReporter +FUNC 15de2 2 0 testing::internal::IsTrue +FUNC 15de2 2 0 testing::internal::PrettyUnitTestResultPrinter::OnEnvironmentsSetUpEnd +FUNC 15de2 2 0 testing::internal::PrettyUnitTestResultPrinter::OnEnvironmentsTearDownEnd +FUNC 15de2 2 0 testing::internal::PrettyUnitTestResultPrinter::OnTestProgramEnd +FUNC 15de2 2 0 testing::internal::PrettyUnitTestResultPrinter::OnTestProgramStart +FUNC 15de2 2 0 testing::internal::PrettyUnitTestResultPrinter::~PrettyUnitTestResultPrinter +FUNC 15de2 2 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MicrodumpWriterTest_Setup_Test>::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_AdditionalMemory_Test>::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_DeletedBinary_Test>::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_InvalidStackPointer_Test>::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfoContained_Test>::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfo_Test>::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MinidumpSizeLimit_Test>::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithFD_Test>::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithPath_Test>::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15de2 2 484 85 +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15de2 2 0 testing::internal::ThreadLocal::ValueHolder::~ValueHolder +15de2 2 4924 95 +FUNC 15de4 ac 0 std::basic_stringbuf, std::allocator >::seekoff +15de4 2 299 131 +15de6 6 303 131 +15dec 4 305 131 +15df0 4 306 131 +15df4 2 308 131 +15df6 4 308 131 +15dfa 4 311 131 +15dfe 4 311 131 +15e02 4 311 131 +15e06 8 315 131 +15e0e 6 400 136 +15e14 2 332 131 +15e16 4 334 131 +15e1a 2 335 131 +15e1c 2 337 131 +15e1e 4 335 131 +15e22 2 337 131 +15e24 8 89 145 +15e2c 4 337 131 +15e30 2 339 131 +15e32 2 94 134 +15e34 2 343 131 +15e36 8 89 145 +15e3e 2 323 131 +15e40 6 323 131 +15e46 4 324 131 +15e4a 4 332 131 +15e4e 4 323 131 +15e52 4 324 131 +15e56 2 332 131 +15e58 6 343 131 +15e5e 2 344 131 +15e60 2 346 131 +15e62 4 344 131 +15e66 2 346 131 +15e68 4 346 131 +15e6c 6 115 134 +15e72 4 315 131 +15e76 6 317 131 +15e7c 6 344 131 +15e82 e 315 131 +FUNC 15e90 9e 0 std::basic_stringbuf, std::allocator >::seekpos +15e90 4 357 131 +15e94 2 357 131 +15e96 4 359 131 +15e9a 2 357 131 +15e9c 2 359 131 +15e9e 4 361 131 +15ea2 6 357 131 +15ea8 4 362 131 +15eac 6 364 131 +15eb2 2 364 131 +15eb4 c 89 145 +15ec0 6 367 131 +15ec6 6 367 131 +15ecc a 114 145 +15ed6 2 104 145 +15ed8 6 372 131 +15ede 6 373 131 +15ee4 a 373 131 +15eee 2 378 131 +15ef0 8 379 131 +15ef8 2 400 136 +15efa 4 379 131 +15efe 2 115 134 +15f00 2 117 134 +15f02 2 119 134 +15f04 2 115 134 +15f06 a 386 131 +15f10 2 375 131 +15f12 2 94 134 +15f14 6 378 131 +15f1a 4 367 131 +15f1e 6 114 145 +15f24 4 104 145 +15f28 6 387 131 +FUNC 15f2e 10 0 std::basic_stringbuf, std::allocator >::underflow +15f2e 2 96 131 +15f30 4 99 131 +15f34 4 223 145 +15f38 4 99 131 +15f3c 2 100 131 +FUNC 15f3e 16 0 std::basic_stringbuf, std::allocator >::uflow +15f3e 4 105 131 +15f42 4 106 131 +15f46 6 223 145 +15f4c 4 112 131 +15f50 2 91 134 +15f52 2 113 131 +FUNC 15f54 3e 0 std::basic_stringbuf, std::allocator >::pbackfail +15f54 4 117 131 +15f58 6 118 131 +15f5e 4 119 131 +15f62 4 120 131 +15f66 2 220 145 +15f68 4 120 131 +15f6c 6 91 134 +15f72 6 124 131 +15f78 4 91 134 +15f7c 4 126 131 +15f80 4 127 131 +15f84 4 91 134 +15f88 4 182 145 +15f8c 4 138 131 +15f90 2 139 131 +FUNC 15f92 c 0 std::basic_streambuf >::seekoff +15f92 a 89 145 +15f9c 2 195 133 +FUNC 15f92 c 0 std::basic_streambuf >::seekoff(long, int, int) +15f92 a 89 246 +15f9c 2 195 234 +FUNC 15f9e 1a 0 std::basic_streambuf >::seekpos +15f9e 2 188 133 +15fa0 8 188 133 +15fa8 a 89 145 +15fb2 6 189 133 +FUNC 15fb8 18 0 std::basic_streambuf >::uflow +15fb8 2 162 133 +15fba 2 163 133 +15fbc 2 162 133 +15fbe 4 163 133 +15fc2 2 165 133 +15fc4 8 165 133 +15fcc 2 223 145 +15fce 2 166 133 +FUNC 15fb8 18 0 std::basic_streambuf >::uflow() +15fb8 2 165 234 +15fba 2 162 234 +15fbc 2 162 234 +15fbe 8 165 234 +15fc6 6 165 234 +15fcc 2 223 246 +15fce 2 166 234 +FUNC 15fd0 c 0 google_breakpad::::CrashGenerationClientImpl::~CrashGenerationClientImpl +15fd0 2 49 0 +15fd2 2 49 0 +15fd4 4 49 0 +15fd8 4 49 0 +FUNC 15fd0 c 0 google_breakpad::MinidumpObject::~MinidumpObject +15fd0 2 114 65 +15fd2 2 114 65 +15fd4 4 114 65 +15fd8 4 114 65 +FUNC 15fd0 c 0 testing::internal::DefaultDeathTestFactory::~DefaultDeathTestFactory +15fd0 2 148 83 +15fd2 2 148 83 +15fd4 4 148 83 +15fd8 4 148 83 +FUNC 15fd0 c 0 testing::internal::DefaultGlobalTestPartResultReporter::~DefaultGlobalTestPartResultReporter +FUNC 15fd0 c 0 testing::internal::DefaultPerThreadTestPartResultReporter::~DefaultPerThreadTestPartResultReporter +15fd0 2 2017 87 +15fd2 2 2979 95 +15fd4 4 490 91 +15fd8 4 2979 95 +FUNC 15fd0 c 0 testing::internal::PrettyUnitTestResultPrinter::~PrettyUnitTestResultPrinter +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MicrodumpWriterTest_Setup_Test>::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_AdditionalMemory_Test>::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_DeletedBinary_Test>::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_InvalidStackPointer_Test>::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfoContained_Test>::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfo_Test>::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MinidumpSizeLimit_Test>::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithFD_Test>::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithPath_Test>::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl >::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +FUNC 15fd0 c 0 testing::internal::TestFactoryImpl::~TestFactoryImpl +15fd0 2 484 85 +15fd2 2 484 85 +15fd4 4 484 85 +15fd8 4 484 85 +FUNC 15fd0 c 0 testing::internal::ThreadLocal::ValueHolder::~ValueHolder +FUNC 15fdc 54 0 std::basic_streambuf >::xsputn +15fdc 4 84 133 +15fe0 6 84 133 +15fe6 2 86 133 +15fe8 4 89 133 +15fec 8 90 133 +15ff4 c 92 133 +16000 2 172 145 +16002 8 172 145 +1600a 2 96 133 +1600c 2 94 133 +1600e 2 95 133 +16010 6 96 133 +16016 2 100 133 +16018 8 100 133 +16020 4 99 133 +16024 2 101 133 +16026 4 102 133 +1602a 6 108 133 +FUNC 16030 4c 0 std::basic_streambuf >::_M_xsputnc +16030 4 112 133 +16034 6 112 133 +1603a 2 114 133 +1603c 4 117 133 +16040 8 118 133 +16048 a 120 133 +16052 8 235 145 +1605a 2 123 133 +1605c 2 122 133 +1605e 6 123 133 +16064 2 127 133 +16066 8 127 133 +1606e 4 126 133 +16072 4 128 133 +16076 6 133 133 +FUNC 1607c 1c 0 std::basic_streambuf >::~basic_streambuf +1607c 4 40 133 +16080 4 41 133 +16084 2 40 133 +16086 12 41 133 +FUNC 16098 12 0 std::basic_streambuf >::~basic_streambuf +16098 2 40 133 +1609a 2 40 133 +1609c 4 41 133 +160a0 6 41 133 +160a6 4 41 133 +FUNC 160ac 1c 0 std::basic_ios >::~basic_ios +160ac 4 59 114 +160b0 18 59 114 +FUNC 160c8 12 0 std::basic_ios >::~basic_ios +160c8 2 59 114 +160ca 6 59 114 +160d0 6 59 114 +160d6 4 59 114 +FUNC 160dc 2c 0 InstallRaiseSIGKILL +160dc 2 297 6 +160de a 299 6 +160e8 2 300 6 +160ea 2 301 6 +160ec 2 300 6 +160ee 4 301 6 +160f2 2 300 6 +160f4 4 301 6 +160f8 10 302 6 +FUNC 16108 6 0 RaiseSIGKILL +16108 6 294 6 +FUNC 1610e c 0 DoneCallbackRaiseSIGKILL +1610e 2 277 6 +16110 6 278 6 +16116 4 280 6 +FUNC 1611c 18 0 ExceptionHandlerTest_WriteMinidumpForChild_Test::~ExceptionHandlerTest_WriteMinidumpForChild_Test +1611c 2 1154 6 +1611e 16 1154 6 +FUNC 16134 12 0 ExceptionHandlerTest_WriteMinidumpForChild_Test::~ExceptionHandlerTest_WriteMinidumpForChild_Test +16134 2 1154 6 +16136 6 1154 6 +1613c 6 1154 6 +16142 4 1154 6 +FUNC 16148 18 0 ExceptionHandlerTest_AdditionalMemoryRemove_Test::~ExceptionHandlerTest_AdditionalMemoryRemove_Test +16148 2 1112 6 +1614a 16 1112 6 +FUNC 16160 12 0 ExceptionHandlerTest_AdditionalMemoryRemove_Test::~ExceptionHandlerTest_AdditionalMemoryRemove_Test +16160 2 1112 6 +16162 6 1112 6 +16168 6 1112 6 +1616e 4 1112 6 +FUNC 16174 18 0 ExceptionHandlerTest_AdditionalMemory_Test::~ExceptionHandlerTest_AdditionalMemory_Test +16174 2 1068 6 +16176 16 1068 6 +FUNC 1618c 12 0 ExceptionHandlerTest_AdditionalMemory_Test::~ExceptionHandlerTest_AdditionalMemory_Test +1618c 2 1068 6 +1618e 6 1068 6 +16194 6 1068 6 +1619a 4 1068 6 +FUNC 161a0 18 0 ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test::~ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test +161a0 2 1036 6 +161a2 16 1036 6 +FUNC 161b8 12 0 ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test::~ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test +161b8 2 1036 6 +161ba 6 1036 6 +161c0 6 1036 6 +161c6 4 1036 6 +FUNC 161cc 18 0 ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test::~ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test +161cc 2 1019 6 +161ce 16 1019 6 +FUNC 161e4 12 0 ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test::~ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test +161e4 2 1019 6 +161e6 6 1019 6 +161ec 6 1019 6 +161f2 4 1019 6 +FUNC 161f8 18 0 ExceptionHandlerTest_WriteMinidumpExceptionStream_Test::~ExceptionHandlerTest_WriteMinidumpExceptionStream_Test +161f8 2 1000 6 +161fa 16 1000 6 +FUNC 16210 12 0 ExceptionHandlerTest_WriteMinidumpExceptionStream_Test::~ExceptionHandlerTest_WriteMinidumpExceptionStream_Test +16210 2 1000 6 +16212 6 1000 6 +16218 6 1000 6 +1621e 4 1000 6 +FUNC 16224 18 0 ExceptionHandlerTest_ExternalDumper_Test::~ExceptionHandlerTest_ExternalDumper_Test +16224 2 926 6 +16226 16 926 6 +FUNC 1623c 12 0 ExceptionHandlerTest_ExternalDumper_Test::~ExceptionHandlerTest_ExternalDumper_Test +1623c 2 926 6 +1623e 6 926 6 +16244 6 926 6 +1624a 4 926 6 +FUNC 16250 18 0 ExceptionHandlerTest_ModuleInfo_Test::~ExceptionHandlerTest_ModuleInfo_Test +16250 2 806 6 +16252 16 806 6 +FUNC 16268 12 0 ExceptionHandlerTest_ModuleInfo_Test::~ExceptionHandlerTest_ModuleInfo_Test +16268 2 806 6 +1626a 6 806 6 +16270 6 806 6 +16276 4 806 6 +FUNC 1627c 18 0 ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test::~ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test +1627c 2 760 6 +1627e 16 760 6 +FUNC 16294 12 0 ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test::~ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test +16294 2 760 6 +16296 6 760 6 +1629c 6 760 6 +162a2 4 760 6 +FUNC 162a8 18 0 ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test::~ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test +162a8 2 667 6 +162aa 16 667 6 +FUNC 162c0 12 0 ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test::~ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test +162c0 2 667 6 +162c2 6 667 6 +162c8 6 667 6 +162ce 4 667 6 +FUNC 162d4 18 0 ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test::~ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test +162d4 2 579 6 +162d6 16 579 6 +FUNC 162ec 12 0 ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test::~ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test +162ec 2 579 6 +162ee 6 579 6 +162f4 6 579 6 +162fa 4 579 6 +FUNC 16300 18 0 ExceptionHandlerTest_InstructionPointerMemory_Test::~ExceptionHandlerTest_InstructionPointerMemory_Test +16300 2 487 6 +16302 16 487 6 +FUNC 16318 12 0 ExceptionHandlerTest_InstructionPointerMemory_Test::~ExceptionHandlerTest_InstructionPointerMemory_Test +16318 2 487 6 +1631a 6 487 6 +16320 6 487 6 +16326 4 487 6 +FUNC 1632c 18 0 ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test::~ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test +1632c 2 457 6 +1632e 16 457 6 +FUNC 16344 12 0 ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test::~ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test +16344 2 457 6 +16346 6 457 6 +1634c 6 457 6 +16352 4 457 6 +FUNC 16358 18 0 ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test::~ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test +16358 2 441 6 +1635a 16 441 6 +FUNC 16370 12 0 ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test::~ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test +16370 2 441 6 +16372 6 441 6 +16378 6 441 6 +1637e 4 441 6 +FUNC 16384 18 0 ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test::~ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test +16384 2 425 6 +16386 16 425 6 +FUNC 1639c 12 0 ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test::~ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test +1639c 2 425 6 +1639e 6 425 6 +163a4 6 425 6 +163aa 4 425 6 +FUNC 163b0 18 0 ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test::~ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test +163b0 2 409 6 +163b2 16 409 6 +FUNC 163c8 12 0 ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test::~ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test +163c8 2 409 6 +163ca 6 409 6 +163d0 6 409 6 +163d6 4 409 6 +FUNC 163dc 18 0 ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test::~ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test +163dc 2 380 6 +163de 16 380 6 +FUNC 163f4 12 0 ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test::~ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test +163f4 2 380 6 +163f6 6 380 6 +163fc 6 380 6 +16402 4 380 6 +FUNC 16408 18 0 ExceptionHandlerTest_RedeliveryToDefaultHandler_Test::~ExceptionHandlerTest_RedeliveryToDefaultHandler_Test +16408 2 363 6 +1640a 16 363 6 +FUNC 16420 12 0 ExceptionHandlerTest_RedeliveryToDefaultHandler_Test::~ExceptionHandlerTest_RedeliveryToDefaultHandler_Test +16420 2 363 6 +16422 6 363 6 +16428 6 363 6 +1642e 4 363 6 +FUNC 16434 18 0 ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test::~ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test +16434 2 351 6 +16436 16 351 6 +FUNC 1644c 12 0 ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test::~ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test +1644c 2 351 6 +1644e 6 351 6 +16454 6 351 6 +1645a 4 351 6 +FUNC 16460 18 0 ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test::~ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test +16460 2 339 6 +16462 16 339 6 +FUNC 16478 12 0 ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test::~ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test +16478 2 339 6 +1647a 6 339 6 +16480 6 339 6 +16486 4 339 6 +FUNC 1648c 18 0 ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test::~ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test +1648c 2 327 6 +1648e 16 327 6 +FUNC 164a4 12 0 ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test::~ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test +164a4 2 327 6 +164a6 6 327 6 +164ac 6 327 6 +164b2 4 327 6 +FUNC 164b8 18 0 ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test::~ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test +164b8 2 315 6 +164ba 16 315 6 +FUNC 164d0 12 0 ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test::~ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test +164d0 2 315 6 +164d2 6 315 6 +164d8 6 315 6 +164de 4 315 6 +FUNC 164e4 18 0 ExceptionHandlerTest_ChildCrashWithFD_Test::~ExceptionHandlerTest_ChildCrashWithFD_Test +164e4 2 257 6 +164e6 16 257 6 +FUNC 164fc 12 0 ExceptionHandlerTest_ChildCrashWithFD_Test::~ExceptionHandlerTest_ChildCrashWithFD_Test +164fc 2 257 6 +164fe 6 257 6 +16504 6 257 6 +1650a 4 257 6 +FUNC 16510 18 0 ExceptionHandlerTest_ChildCrashWithPath_Test::~ExceptionHandlerTest_ChildCrashWithPath_Test +16510 2 253 6 +16512 16 253 6 +FUNC 16528 12 0 ExceptionHandlerTest_ChildCrashWithPath_Test::~ExceptionHandlerTest_ChildCrashWithPath_Test +16528 2 253 6 +1652a 6 253 6 +16530 6 253 6 +16536 4 253 6 +FUNC 1653c 18 0 ExceptionHandlerTest_SimpleWithFD_Test::~ExceptionHandlerTest_SimpleWithFD_Test +1653c 2 170 6 +1653e 16 170 6 +FUNC 16554 12 0 ExceptionHandlerTest_SimpleWithFD_Test::~ExceptionHandlerTest_SimpleWithFD_Test +16554 2 170 6 +16556 6 170 6 +1655c 6 170 6 +16562 4 170 6 +FUNC 16568 18 0 ExceptionHandlerTest_SimpleWithPath_Test::~ExceptionHandlerTest_SimpleWithPath_Test +16568 2 160 6 +1656a 16 160 6 +FUNC 16580 12 0 ExceptionHandlerTest_SimpleWithPath_Test::~ExceptionHandlerTest_SimpleWithPath_Test +16580 2 160 6 +16582 6 160 6 +16588 6 160 6 +1658e 4 160 6 +FUNC 16592 80 0 DoneCallback +16592 2 180 6 +16594 4 180 6 +16598 4 181 6 +1659c 6 184 6 +165a2 2 186 6 +165a4 2 187 6 +165a6 2 186 6 +165a8 4 187 6 +165ac 6 187 6 +165b2 18 3162 97 +165ca 4 3162 97 +165ce 4 3162 97 +165d2 4 188 6 +165d6 6 188 6 +165dc 18 3162 97 +165f4 4 3162 97 +165f8 4 3162 97 +165fc 4 189 6 +16600 8 189 6 +16608 4 182 6 +1660c 2 191 6 +1660e 4 192 6 +FUNC 16614 20 0 testing::internal::TestFactoryImpl::CreateTest +16614 2 486 85 +16616 8 486 85 +1661e 6 351 6 +16624 2 486 85 +16626 6 351 6 +1662c 8 486 85 +FUNC 16634 20 0 testing::internal::TestFactoryImpl::CreateTest +16634 2 486 85 +16636 8 486 85 +1663e 6 339 6 +16644 2 486 85 +16646 6 339 6 +1664c 8 486 85 +FUNC 16654 20 0 testing::internal::TestFactoryImpl::CreateTest +16654 2 486 85 +16656 8 486 85 +1665e 6 327 6 +16664 2 486 85 +16666 6 327 6 +1666c 8 486 85 +FUNC 16674 20 0 testing::internal::TestFactoryImpl::CreateTest +16674 2 486 85 +16676 8 486 85 +1667e 6 315 6 +16684 2 486 85 +16686 6 315 6 +1668c 8 486 85 +FUNC 16694 20 0 testing::internal::TestFactoryImpl::CreateTest +16694 2 486 85 +16696 8 486 85 +1669e 6 257 6 +166a4 2 486 85 +166a6 6 257 6 +166ac 8 486 85 +FUNC 166b4 20 0 testing::internal::TestFactoryImpl::CreateTest +166b4 2 486 85 +166b6 8 486 85 +166be 6 253 6 +166c4 2 486 85 +166c6 6 253 6 +166cc 8 486 85 +FUNC 166d4 20 0 testing::internal::TestFactoryImpl::CreateTest +166d4 2 486 85 +166d6 8 486 85 +166de 6 170 6 +166e4 2 486 85 +166e6 6 170 6 +166ec 8 486 85 +FUNC 166f4 20 0 testing::internal::TestFactoryImpl::CreateTest +166f4 2 486 85 +166f6 8 486 85 +166fe 6 160 6 +16704 2 486 85 +16706 6 160 6 +1670c 8 486 85 +FUNC 16714 20 0 testing::internal::TestFactoryImpl::CreateTest +16714 2 486 85 +16716 8 486 85 +1671e 6 1068 6 +16724 2 486 85 +16726 6 1068 6 +1672c 8 486 85 +FUNC 16734 20 0 testing::internal::TestFactoryImpl::CreateTest +16734 2 486 85 +16736 8 486 85 +1673e 6 1036 6 +16744 2 486 85 +16746 6 1036 6 +1674c 8 486 85 +FUNC 16754 20 0 testing::internal::TestFactoryImpl::CreateTest +16754 2 486 85 +16756 8 486 85 +1675e 6 1019 6 +16764 2 486 85 +16766 6 1019 6 +1676c 8 486 85 +FUNC 16774 20 0 testing::internal::TestFactoryImpl::CreateTest +16774 2 486 85 +16776 8 486 85 +1677e 6 1000 6 +16784 2 486 85 +16786 6 1000 6 +1678c 8 486 85 +FUNC 16794 20 0 testing::internal::TestFactoryImpl::CreateTest +16794 2 486 85 +16796 8 486 85 +1679e 6 926 6 +167a4 2 486 85 +167a6 6 926 6 +167ac 8 486 85 +FUNC 167b4 20 0 testing::internal::TestFactoryImpl::CreateTest +167b4 2 486 85 +167b6 8 486 85 +167be 6 806 6 +167c4 2 486 85 +167c6 6 806 6 +167cc 8 486 85 +FUNC 167d4 20 0 testing::internal::TestFactoryImpl::CreateTest +167d4 2 486 85 +167d6 8 486 85 +167de 6 760 6 +167e4 2 486 85 +167e6 6 760 6 +167ec 8 486 85 +FUNC 167f4 20 0 testing::internal::TestFactoryImpl::CreateTest +167f4 2 486 85 +167f6 8 486 85 +167fe 6 667 6 +16804 2 486 85 +16806 6 667 6 +1680c 8 486 85 +FUNC 16814 20 0 testing::internal::TestFactoryImpl::CreateTest +16814 2 486 85 +16816 8 486 85 +1681e 6 579 6 +16824 2 486 85 +16826 6 579 6 +1682c 8 486 85 +FUNC 16834 20 0 testing::internal::TestFactoryImpl::CreateTest +16834 2 486 85 +16836 8 486 85 +1683e 6 487 6 +16844 2 486 85 +16846 6 487 6 +1684c 8 486 85 +FUNC 16854 20 0 testing::internal::TestFactoryImpl::CreateTest +16854 2 486 85 +16856 8 486 85 +1685e 6 457 6 +16864 2 486 85 +16866 6 457 6 +1686c 8 486 85 +FUNC 16874 20 0 testing::internal::TestFactoryImpl::CreateTest +16874 2 486 85 +16876 8 486 85 +1687e 6 441 6 +16884 2 486 85 +16886 6 441 6 +1688c 8 486 85 +FUNC 16894 20 0 testing::internal::TestFactoryImpl::CreateTest +16894 2 486 85 +16896 8 486 85 +1689e 6 425 6 +168a4 2 486 85 +168a6 6 425 6 +168ac 8 486 85 +FUNC 168b4 20 0 testing::internal::TestFactoryImpl::CreateTest +168b4 2 486 85 +168b6 8 486 85 +168be 6 409 6 +168c4 2 486 85 +168c6 6 409 6 +168cc 8 486 85 +FUNC 168d4 20 0 testing::internal::TestFactoryImpl::CreateTest +168d4 2 486 85 +168d6 8 486 85 +168de 6 380 6 +168e4 2 486 85 +168e6 6 380 6 +168ec 8 486 85 +FUNC 168f4 20 0 testing::internal::TestFactoryImpl::CreateTest +168f4 2 486 85 +168f6 8 486 85 +168fe 6 363 6 +16904 2 486 85 +16906 6 363 6 +1690c 8 486 85 +FUNC 16914 20 0 testing::internal::TestFactoryImpl::CreateTest +16914 2 486 85 +16916 8 486 85 +1691e 6 1154 6 +16924 2 486 85 +16926 6 1154 6 +1692c 8 486 85 +FUNC 16934 20 0 testing::internal::TestFactoryImpl::CreateTest +16934 2 486 85 +16936 8 486 85 +1693e 6 1112 6 +16944 2 486 85 +16946 6 1112 6 +1694c 8 486 85 +FUNC 16954 118 0 CrashHandler +16954 8 877 6 +1695c 8 877 6 +16964 2 880 6 +16966 6 877 6 +1696c 4 880 6 +16970 2 888 6 +16972 2 880 6 +16974 4 885 6 +16978 2 886 6 +1697a 4 888 6 +1697e 4 895 6 +16982 6 888 6 +16988 2 891 6 +1698a 2 893 6 +1698c 2 890 6 +1698e 6 895 6 +16994 2 892 6 +16996 2 895 6 +16998 2 892 6 +1699a 2 893 6 +1699c 4 895 6 +169a0 4 902 6 +169a4 2 903 6 +169a6 2 900 6 +169a8 2 903 6 +169aa 4 906 6 +169ae 2 907 6 +169b0 2 901 6 +169b2 2 907 6 +169b4 2 905 6 +169b6 2 896 6 +169b8 4 897 6 +169bc 6 909 6 +169c2 6 910 6 +169c8 4 911 6 +169cc 2 3671 97 +169ce 2 911 6 +169d0 18 3671 97 +169e8 4 3671 97 +169ec 4 3671 97 +169f0 4 913 6 +169f4 6 913 6 +169fa 4 3671 97 +169fe 14 2979 97 +16a12 4 2979 97 +16a16 4 2979 97 +16a1a 4 915 6 +16a1e 1c 3104 97 +16a3a 4 921 6 +16a3e 4 3104 97 +16a42 4 3104 97 +16a46 4 919 6 +16a4a 8 919 6 +16a52 2 916 6 +16a54 18 922 6 +FUNC 16a6c 54 0 std::basic_streambuf >::xsgetn +16a6c 4 54 133 +16a70 6 54 133 +16a76 2 55 133 +16a78 4 58 133 +16a7c 8 59 133 +16a84 c 61 133 +16a90 2 172 145 +16a92 8 172 145 +16a9a 2 65 133 +16a9c 2 63 133 +16a9e 2 64 133 +16aa0 6 65 133 +16aa6 2 228 134 +16aa8 6 229 134 +16aae 4 69 133 +16ab2 4 220 145 +16ab6 4 71 133 +16aba 6 80 133 +FUNC 16ac0 18 0 std::priv::__ucopy_trivial +16ac0 2 103 142 +16ac2 2 107 142 +16ac4 2 103 142 +16ac6 2 103 142 +16ac8 2 107 142 +16aca a 106 142 +16ad4 2 107 142 +16ad6 2 108 142 +FUNC 16ad8 14 0 testing::AssertionResult::message +16ad8 2 1144 87 +16ada 6 298 82 +16ae0 4 298 82 +16ae4 8 299 82 +FUNC 16aec 1e 0 testing::internal::scoped_ptr, std::allocator > >::~scoped_ptr +16aec 2 1140 87 +16aee 2 1153 87 +16af0 2 1140 87 +16af2 2 1153 87 +16af4 8 1154 87 +16afc 4 1155 87 +16b00 6 1155 87 +16b06 4 1140 87 +FUNC 16b0a 1e 0 std::priv::_String_base >::_M_deallocate_block +16b0a 2 94 137 +16b0c 2 64 137 +16b0e 4 96 137 +16b12 4 96 137 +16b16 4 97 137 +16b1a 4 161 106 +16b1e 4 135 124 +16b22 6 161 106 +FUNC 16b28 16 0 google_breakpad::MinidumpDescriptor::~MinidumpDescriptor +16b28 2 47 8 +16b2a 2 47 8 +16b2c e 156 137 +16b3a 4 47 8 +FUNC 16b40 24 0 std::basic_stringbuf, std::allocator >::~basic_stringbuf +16b40 4 58 131 +16b44 4 59 131 +16b48 2 58 131 +16b4a 6 59 131 +16b50 4 156 137 +16b54 6 59 131 +16b5a a 59 131 +FUNC 16b64 12 0 std::basic_stringbuf, std::allocator >::~basic_stringbuf +16b64 2 58 131 +16b66 2 58 131 +16b68 4 59 131 +16b6c 6 59 131 +16b72 4 59 131 +FUNC 16b76 28 0 testing::internal::scoped_ptr, std::allocator > >::reset +16b76 2 1152 87 +16b78 2 1153 87 +16b7a 2 1152 87 +16b7c 2 1153 87 +16b7e 2 1152 87 +16b80 2 1153 87 +16b82 8 1154 87 +16b8a 4 1155 87 +16b8e 6 156 137 +16b94 6 1155 87 +16b9a 4 1157 87 +FUNC 16b9e e 0 testing::internal::scoped_ptr, std::allocator > >::~scoped_ptr +16b9e 2 1140 87 +16ba0 c 1140 87 +FUNC 16bac 9c 0 std::basic_ios >::init +16bac 4 97 113 +16bb0 4 92 114 +16bb4 2 192 115 +16bb6 2 92 114 +16bb8 2 192 115 +16bba 2 97 113 +16bbc 2 97 113 +16bbe 2 50 113 +16bc0 2 188 115 +16bc2 2 192 115 +16bc4 4 193 115 +16bc8 4 100 113 +16bcc 4 70 113 +16bd0 4 100 113 +16bd4 a 70 113 +16bde 4 72 113 +16be2 8 46 133 +16bea 6 47 133 +16bf0 2 46 133 +16bf2 8 47 133 +16bfa 8 48 133 +16c02 6 73 113 +16c08 c 351 122 +16c14 2 76 113 +16c16 6 100 113 +16c1c 6 100 113 +16c22 4 68 114 +16c26 2 190 115 +16c28 2 139 115 +16c2a 2 132 115 +16c2c 4 112 115 +16c30 2 132 115 +16c32 2 84 114 +16c34 2 188 115 +16c36 2 112 115 +16c38 4 84 114 +16c3c c 110 113 +FUNC 16c48 78 0 std::basic_iostream >::basic_iostream +16c48 2 1406 116 +16c4a 4 92 113 +16c4e 2 1406 116 +16c50 2 92 113 +16c52 2 1406 116 +16c54 6 92 113 +16c5a 2 87 117 +16c5c 4 92 113 +16c60 6 87 117 +16c66 2 87 117 +16c68 4 92 113 +16c6c 2 87 117 +16c6e 4 87 117 +16c72 8 88 117 +16c7a 2 38 126 +16c7c 2 39 126 +16c7e 6 38 126 +16c84 2 38 126 +16c86 2 38 126 +16c88 2 38 126 +16c8a 8 39 126 +16c92 2 1411 116 +16c94 a 1410 116 +16c9e 4 1410 116 +16ca2 2 1410 116 +16ca4 2 1410 116 +16ca6 2 1410 116 +16ca8 6 1411 116 +16cae 12 1412 116 +FUNC 16cc0 66 0 std::basic_iostream >::basic_iostream +16cc0 2 1406 116 +16cc2 2 87 117 +16cc4 2 1406 116 +16cc6 2 87 117 +16cc8 2 87 117 +16cca 4 87 117 +16cce 2 1406 116 +16cd0 4 87 117 +16cd4 2 1406 116 +16cd6 2 87 117 +16cd8 2 88 117 +16cda c 88 117 +16ce6 2 38 126 +16ce8 4 1410 116 +16cec 2 38 126 +16cee 2 38 126 +16cf0 6 38 126 +16cf6 2 39 126 +16cf8 c 39 126 +16d04 2 1410 116 +16d06 2 1411 116 +16d08 2 1410 116 +16d0a 2 1410 116 +16d0c 6 1410 116 +16d12 2 1410 116 +16d14 2 1410 116 +16d16 2 1411 116 +16d18 a 1411 116 +16d22 4 1412 116 +FUNC 16d26 42 0 std::__stlp_string_fill > +16d26 2 16 138 +16d28 4 16 138 +16d2c 2 20 138 +16d2e c 19 138 +16d3a 4 20 138 +16d3e 8 200 134 +16d46 a 199 134 +16d50 8 200 134 +16d58 4 21 138 +16d5c 4 20 138 +16d60 4 24 138 +16d64 2 22 138 +16d66 2 25 138 +FUNC 16d68 6 0 std::basic_streambuf >::sputn +16d68 6 205 134 +FUNC 16d6e 1c 0 std::basic_ios >::setstate +16d6e 2 95 114 +16d70 4 95 114 +16d74 4 92 114 +16d78 4 92 114 +16d7c 2 192 115 +16d7e 2 188 115 +16d80 4 192 115 +16d84 6 193 115 +FUNC 16d8a 28 0 std::basic_string, std::allocator >::erase +16d8a 2 803 136 +16d8c 2 802 136 +16d8e 6 802 136 +16d94 2 803 136 +16d96 4 805 136 +16d9a 4 168 145 +16d9e 8 168 145 +16da6 8 806 136 +16dae 4 809 136 +FUNC 16db4 38 0 std::priv::_String_base >::_M_allocate_block +16db4 2 607 135 +16db6 2 607 135 +16db8 2 608 135 +16dba 8 600 135 +16dc2 4 610 135 +16dc6 2 158 106 +16dc8 2 347 106 +16dca 2 158 106 +16dcc 8 134 124 +16dd4 6 158 106 +16dda 2 613 135 +16ddc 2 611 135 +16dde 2 612 135 +16de0 4 613 135 +16de4 8 623 135 +FUNC 16dec 18 0 std::basic_string, std::allocator >::basic_string +16dec 2 158 136 +16dee 2 158 136 +16df0 2 124 137 +16df2 2 120 137 +16df4 2 481 106 +16df6 4 124 137 +16dfa 4 101 108 +16dfe 2 166 136 +16e00 2 101 108 +16e02 2 166 136 +FUNC 16e04 2e 0 google_breakpad::MinidumpDescriptor::MinidumpDescriptor +16e04 2 69 8 +16e06 2 65 8 +16e08 2 65 8 +16e0a 2 69 8 +16e0c 4 69 8 +16e10 8 69 8 +16e18 a 69 8 +16e22 2 69 8 +16e24 2 71 8 +16e26 8 69 8 +16e2e 4 71 8 +FUNC 16e34 ac 0 std::basic_stringstream, std::allocator >::basic_stringstream +16e34 4 439 131 +16e38 2 439 131 +16e3a 2 92 113 +16e3c 2 439 131 +16e3e 6 92 113 +16e44 2 439 131 +16e46 6 92 113 +16e4c 2 439 131 +16e4e a 92 113 +16e58 2 441 131 +16e5a 8 92 113 +16e62 c 441 131 +16e6e 2 441 131 +16e70 4 34 133 +16e74 8 441 131 +16e7c 4 441 131 +16e80 4 441 131 +16e84 2 34 133 +16e86 2 441 131 +16e88 16 34 133 +16e9e 2 46 131 +16ea0 2 46 131 +16ea2 2 46 131 +16ea4 4 34 133 +16ea8 8 46 131 +16eb0 8 46 131 +16eb8 8 442 131 +16ec0 20 443 131 +FUNC 16ee0 78 0 std::basic_stringstream, std::allocator >::basic_stringstream +16ee0 2 439 131 +16ee2 6 439 131 +16ee8 8 441 131 +16ef0 2 441 131 +16ef2 4 34 133 +16ef6 2 441 131 +16ef8 2 441 131 +16efa 6 441 131 +16f00 2 441 131 +16f02 4 34 133 +16f06 4 441 131 +16f0a 1c 34 133 +16f26 2 46 131 +16f28 a 46 131 +16f32 8 46 131 +16f3a 2 442 131 +16f3c c 442 131 +16f48 10 443 131 +FUNC 16f58 30 0 std::basic_string, std::allocator >::basic_string +16f58 2 639 135 +16f5a 2 639 135 +16f5c 2 112 137 +16f5e 2 481 106 +16f60 2 229 145 +16f62 2 639 135 +16f64 6 229 145 +16f6a 2 643 135 +16f6c 8 379 136 +16f74 a 148 142 +16f7e 2 101 108 +16f80 2 380 136 +16f82 2 101 108 +16f84 4 644 135 +FUNC 16f88 28 0 std::basic_string, std::allocator >::basic_string +16f88 2 647 135 +16f8a 2 647 135 +16f8c 2 112 137 +16f8e 6 481 106 +16f94 2 378 136 +16f96 6 379 136 +16f9c a 148 142 +16fa6 2 101 108 +16fa8 2 380 136 +16faa 2 101 108 +16fac 4 649 135 +FUNC 16fb0 2a 0 google_breakpad::MinidumpDescriptor::MinidumpDescriptor +16fb0 2 56 8 +16fb2 6 61 8 +16fb8 2 56 8 +16fba a 61 8 +16fc4 a 61 8 +16fce 2 61 8 +16fd0 2 63 8 +16fd2 4 61 8 +16fd6 4 63 8 +FUNC 16fdc 68 0 CrashWithCallbacks +16fdc 8 308 6 +16fe4 4 308 6 +16fe8 2 310 6 +16fea 6 308 6 +16ff0 4 310 6 +16ff4 2 308 6 +16ff6 2 310 6 +16ff8 4 310 6 +16ffc 1a 310 6 +17016 6 310 6 +1701c 2 207 6 +1701e 2 312 6 +17020 6 207 6 +17026 4 312 6 +1702a 1a 313 6 +FUNC 17044 16 0 std::use_facet > > > +17044 2 292 122 +17046 2 292 122 +17048 8 351 122 +17050 2 351 122 +17052 4 297 122 +17056 4 351 122 +FUNC 1705c 54 0 std::basic_istream >::~basic_istream +1705c 2 90 117 +1705e 6 90 117 +17064 6 90 117 +1706a 6 90 117 +17070 4 90 117 +17074 6 90 117 +1707a 2 90 117 +1707c 4 90 117 +17080 6 90 117 +17086 6 90 117 +1708c 6 90 117 +17092 8 90 117 +1709a 4 90 117 +1709e 6 90 117 +170a4 c 90 117 +FUNC 170b0 8 0 std::basic_istream >::~basic_istream +170b0 8 90 117 +FUNC 170c4 12 0 std::basic_istream >::~basic_istream +170c4 2 90 117 +170c6 6 90 117 +170cc 6 90 117 +170d2 4 90 117 +FUNC 170e2 8 0 std::basic_istream >::~basic_istream +170e2 8 90 117 +FUNC 170ec 54 0 std::basic_ostream >::~basic_ostream +170ec 2 43 126 +170ee 2 43 126 +170f0 4 44 126 +170f4 6 44 126 +170fa 6 44 126 +17100 4 44 126 +17104 6 44 126 +1710a 2 44 126 +1710c 4 44 126 +17110 6 44 126 +17116 6 44 126 +1711c 6 44 126 +17122 6 44 126 +17128 4 44 126 +1712c 6 44 126 +17132 e 44 126 +FUNC 17140 8 0 std::basic_ostream >::~basic_ostream +17140 8 44 126 +FUNC 17154 12 0 std::basic_ostream >::~basic_ostream +17154 2 43 126 +17156 2 43 126 +17158 4 44 126 +1715c 6 44 126 +17162 4 44 126 +FUNC 17172 8 0 std::basic_ostream >::~basic_ostream +17172 2 43 126 +17174 6 44 126 +FUNC 1717c 8c 0 std::basic_iostream >::~basic_iostream +1717c 2 1415 116 +1717e 8 1415 116 +17186 4 1416 116 +1718a 4 1416 116 +1718e 6 1416 116 +17194 4 1416 116 +17198 6 1416 116 +1719e 2 1416 116 +171a0 4 1416 116 +171a4 4 1416 116 +171a8 6 1416 116 +171ae 4 1416 116 +171b2 4 1416 116 +171b6 6 1416 116 +171bc 8 1416 116 +171c4 4 1416 116 +171c8 2 1416 116 +171ca 6 1416 116 +171d0 6 1416 116 +171d6 6 1416 116 +171dc 6 1416 116 +171e2 4 1416 116 +171e6 8 1416 116 +171ee 4 1416 116 +171f2 6 1416 116 +171f8 10 1416 116 +FUNC 17208 8 0 std::basic_iostream >::~basic_iostream +17208 2 1415 116 +1720a 6 1416 116 +FUNC 17210 80 0 std::basic_stringstream, std::allocator >::~basic_stringstream +17210 2 453 131 +17212 8 453 131 +1721a 4 454 131 +1721e 4 454 131 +17222 6 454 131 +17228 4 454 131 +1722c 6 454 131 +17232 2 454 131 +17234 4 454 131 +17238 4 454 131 +1723c 6 454 131 +17242 4 454 131 +17246 4 454 131 +1724a 6 454 131 +17250 c 454 131 +1725c 6 454 131 +17262 6 454 131 +17268 4 454 131 +1726c 8 454 131 +17274 4 454 131 +17278 6 454 131 +1727e 12 454 131 +FUNC 17290 8 0 std::basic_stringstream, std::allocator >::~basic_stringstream +17290 2 453 131 +17292 6 454 131 +FUNC 17298 8 0 std::basic_stringstream, std::allocator >::~basic_stringstream +17298 8 454 131 +FUNC 172b4 12 0 std::basic_stringstream, std::allocator >::~basic_stringstream +172b4 2 453 131 +172b6 2 453 131 +172b8 4 454 131 +172bc 6 454 131 +172c2 4 454 131 +FUNC 172dc c0 0 testing::internal::CmpHelperEQ, std::allocator >, std::basic_string, std::allocator > > +172dc a 1476 82 +172e6 14 1476 82 +172fa e 400 136 +17308 6 289 139 +1730e 4 226 145 +17312 2 289 139 +17314 2 884 80 +17316 2 469 80 +17318 8 884 80 +17320 2 75 132 +17322 4 469 80 +17326 2 75 132 +17328 4 469 80 +1732c 8 75 132 +17334 6 886 80 +1733a 8 884 80 +17342 4 469 80 +17346 2 75 132 +17348 4 469 80 +1734c 8 75 132 +17354 6 886 80 +1735a 12 1471 82 +1736c e 156 137 +1737a 6 1482 82 +17380 1c 1488 82 +FUNC 1739c 8 0 std::basic_iostream >::~basic_iostream +1739c 8 1416 116 +FUNC 173b8 12 0 std::basic_iostream >::~basic_iostream +173b8 2 1415 116 +173ba 2 1415 116 +173bc 4 1416 116 +173c0 6 1416 116 +173c6 4 1416 116 +FUNC 173de 2c 0 std::basic_ostream >::flush +173de 2 134 127 +173e0 2 135 127 +173e2 a 134 127 +173ec 2 135 127 +173ee 6 153 134 +173f4 4 136 127 +173f8 e 137 127 +17406 4 139 127 +FUNC 1740a 40 0 std::priv::__init_bostr > +1740a 2 218 127 +1740c 2 218 127 +1740e c 219 127 +1741a 4 221 127 +1741e 6 222 127 +17424 c 223 127 +17430 4 224 127 +17434 8 225 127 +1743c a 174 115 +17446 2 228 127 +17448 2 229 127 +FUNC 1744a 24 0 std::basic_ostream >::sentry::~sentry +1744a 2 184 127 +1744c 2 185 127 +1744e 2 184 127 +17450 e 185 127 +1745e 6 187 127 +17464 6 189 127 +1746a 4 190 127 +FUNC 1746e b4 0 std::basic_ostream >::_M_put_nowiden +1746e 2 331 126 +17470 4 331 126 +17474 a 181 127 +1747e 4 333 126 +17482 6 229 145 +17488 2 336 126 +1748a 2 229 145 +1748c c 336 126 +17498 4 339 126 +1749c 2 341 126 +1749e 2 342 126 +174a0 8 341 126 +174a8 8 342 126 +174b0 4 343 126 +174b4 4 343 126 +174b8 a 344 126 +174c2 c 209 134 +174ce 4 343 126 +174d2 e 209 134 +174e0 4 348 126 +174e4 8 348 126 +174ec a 348 126 +174f6 6 348 126 +174fc 2 139 115 +174fe 2 351 126 +17500 8 139 115 +17508 2 357 126 +1750a e 358 126 +17518 6 359 126 +1751e 4 360 126 +FUNC 17522 90 0 std::priv::__put_num, long int> +17522 4 194 126 +17526 4 194 126 +1752a a 181 127 +17534 2 199 126 +17536 10 211 126 +17546 2 202 126 +17548 2 145 115 +1754a 4 202 126 +1754e 2 145 115 +17550 2 202 126 +17552 6 145 115 +17558 6 202 126 +1755e 2 202 126 +17560 2 202 126 +17562 c 202 126 +1756e 18 57 128 +17586 16 67 125 +1759c 6 202 126 +175a2 4 210 126 +175a6 6 212 126 +175ac 6 213 126 +FUNC 175b2 98 0 std::operator<< , std::allocator > +175b2 4 30 138 +175b6 4 30 138 +175ba a 181 127 +175c4 2 41 138 +175c6 10 62 138 +175d6 2 139 115 +175d8 a 400 136 +175e2 8 44 138 +175ea 2 138 115 +175ec 2 139 115 +175ee 2 44 138 +175f0 2 46 138 +175f2 6 49 138 +175f8 a 44 138 +17602 2 49 138 +17604 2 52 138 +17606 c 55 138 +17612 6 55 138 +17618 a 53 138 +17622 6 55 138 +17628 4 50 138 +1762c 2 57 138 +1762e a 58 138 +17638 4 58 138 +1763c 6 64 138 +17642 8 65 138 +FUNC 1764a 90 0 std::priv::__put_num, void const*> +1764a 4 194 126 +1764e 4 194 126 +17652 a 181 127 +1765c 2 199 126 +1765e 10 211 126 +1766e 2 202 126 +17670 2 145 115 +17672 4 202 126 +17676 2 145 115 +17678 2 202 126 +1767a 6 145 115 +17680 6 202 126 +17686 2 202 126 +17688 2 202 126 +1768a c 202 126 +17696 18 57 128 +176ae 16 101 125 +176c4 6 202 126 +176ca 4 210 126 +176ce 6 212 126 +176d4 6 213 126 +FUNC 176da 16 0 std::priv::_String_base >::_M_rest +176da 2 64 137 +176dc 2 74 137 +176de 4 74 137 +176e2 2 74 137 +176e4 4 74 137 +176e8 6 74 137 +176ee 2 74 137 +FUNC 176f0 3c 0 std::basic_string, std::allocator >::_M_compute_next_size +176f0 2 302 136 +176f2 6 400 136 +176f8 a 304 136 +17702 a 600 135 +1770c 8 306 136 +17714 4 307 136 +17718 2 307 136 +1771a c 308 136 +17726 6 310 136 +FUNC 1772c d8 0 std::basic_string, std::allocator >::_M_append +1772c 2 197 135 +1772e 4 196 135 +17732 6 196 135 +17738 2 197 135 +1773a 2 198 135 +1773c 8 199 135 +17744 8 200 135 +1774c 4 346 106 +17750 2 158 106 +17752 2 347 106 +17754 2 158 106 +17756 6 134 124 +1775c 8 158 106 +17764 6 352 106 +1776a 4 356 106 +1776e 14 86 142 +17782 8 86 142 +1778a 1c 146 108 +177a6 8 86 142 +177ae 6 146 108 +177b4 8 101 108 +177bc 8 205 135 +177c4 4 206 135 +177c8 2 160 137 +177ca 2 164 137 +177cc 6 165 137 +177d2 4 210 135 +177d6 6 86 142 +177dc 8 86 142 +177e4 6 146 108 +177ea a 101 108 +177f4 2 232 145 +177f6 6 214 135 +177fc 8 218 135 +FUNC 17804 44 0 std::basic_string, std::allocator >::_M_assign +17804 2 242 135 +17806 4 242 135 +1780a 2 400 136 +1780c 2 243 135 +1780e 2 242 135 +17810 2 400 136 +17812 2 244 135 +17814 2 242 135 +17816 2 244 135 +17818 2 168 145 +1781a 6 168 145 +17820 2 246 135 +17822 c 246 135 +1782e 2 168 145 +17830 4 168 145 +17834 4 400 136 +17838 2 250 135 +1783a 2 400 136 +1783c 8 250 135 +17844 4 253 135 +FUNC 17848 1a4 0 google_breakpad::AutoTempDir::AutoTempDir +17848 8 54 63 +17850 4 54 63 +17854 4 54 63 +17858 2 54 63 +1785a 2 54 63 +1785c 4 54 63 +17860 4 54 63 +17864 1c 55 63 +17880 e 63 35 +1788e 2 64 35 +17890 8 63 35 +17898 6 64 35 +1789e 6 65 35 +178a4 8 67 35 +178ac c 68 35 +178b8 4 67 35 +178bc 8 69 35 +178c4 8 75 35 +178cc 4 76 35 +178d0 4 79 35 +178d4 8 80 35 +178dc 2 81 35 +178de 2 82 35 +178e0 2 81 35 +178e2 2 82 35 +178e4 c 84 35 +178f0 a 85 35 +178fa 2 54 63 +178fc a 96 35 +17906 4 121 101 +1790a 6 94 35 +17910 2 96 35 +17912 2 94 35 +17914 8 96 35 +1791c c 97 35 +17928 a 100 35 +17932 6 93 35 +17938 4 98 35 +1793c 2 101 35 +1793e 6 56 63 +17944 2 1139 87 +17946 4 277 82 +1794a 2 1139 87 +1794c 2 56 63 +1794e 18 56 63 +17966 a 56 63 +17970 4 56 63 +17974 a 56 63 +1797e 6 56 63 +17984 8 56 63 +1798c 6 85 79 +17992 6 56 63 +17998 6 156 137 +1799e 6 256 82 +179a4 6 229 145 +179aa 2 563 136 +179ac 2 563 136 +179ae 6 563 136 +179b4 38 58 63 +FUNC 179ec 1a 0 std::basic_string, std::allocator >::operator= +179ec 2 353 136 +179ee 2 353 136 +179f0 2 229 145 +179f2 2 353 136 +179f4 4 229 145 +179f8 2 355 136 +179fa 2 355 136 +179fc 2 355 136 +179fe 4 356 136 +17a02 4 355 136 +FUNC 17a06 10 0 SimpleCallback +17a06 2 1148 6 +17a08 2 1148 6 +17a0a 8 1150 6 +17a12 4 1152 6 +FUNC 17a18 6c 0 testing::AssertionResult::AppendMessage +17a18 e 320 82 +17a26 2 320 82 +17a28 2 321 82 +17a2a 6 320 82 +17a30 2 321 82 +17a32 8 322 82 +17a3a 6 322 82 +17a40 8 322 82 +17a48 6 323 82 +17a4e 2 1143 87 +17a50 6 323 82 +17a56 6 229 145 +17a5c 2 530 136 +17a5e 2 530 136 +17a60 6 530 136 +17a66 6 156 137 +17a6c 18 324 82 +FUNC 17a84 2c 0 testing::AssertionResult::operator<< +17a84 2 305 82 +17a86 4 305 82 +17a8a 8 306 82 +17a92 a 333 127 +17a9c 8 306 82 +17aa4 6 85 79 +17aaa 6 308 82 +FUNC 17a84 2c 0 testing::AssertionResult::operator<< +FUNC 17a84 2c 0 testing::AssertionResult::operator<< +FUNC 17a84 2c 0 testing::AssertionResult::operator<< +FUNC 17a84 2c 0 testing::AssertionResult::operator<< +FUNC 17ab0 38 0 testing::AssertionResult::operator<< +17ab0 2 305 82 +17ab2 2 305 82 +17ab4 2 306 82 +17ab6 2 305 82 +17ab8 a 306 82 +17ac2 2 333 127 +17ac4 2 150 79 +17ac6 8 333 127 +17ace 8 306 82 +17ad6 6 85 79 +17adc c 308 82 +FUNC 17ae8 2c 0 testing::AssertionResult::operator<< , std::allocator > > +17ae8 2 305 82 +17aea 4 305 82 +17aee 8 306 82 +17af6 a 131 79 +17b00 8 306 82 +17b08 6 85 79 +17b0e 6 308 82 +FUNC 17b14 90 0 std::basic_string, std::allocator >::_M_appendT +17b14 2 470 136 +17b16 4 468 136 +17b1a 6 468 136 +17b20 2 470 136 +17b22 2 355 119 +17b24 8 472 136 +17b2c 8 473 136 +17b34 4 346 106 +17b38 2 158 106 +17b3a 2 347 106 +17b3c 2 158 106 +17b3e 6 134 124 +17b44 6 158 106 +17b4a 2 352 106 +17b4c 4 353 106 +17b50 2 356 106 +17b52 a 120 142 +17b5c 2 148 142 +17b5e 2 120 142 +17b60 6 148 142 +17b66 2 101 108 +17b68 2 148 142 +17b6a 2 101 108 +17b6c 6 478 136 +17b72 2 479 136 +17b74 2 160 137 +17b76 2 164 137 +17b78 6 165 137 +17b7e 6 482 136 +17b84 2 148 142 +17b86 2 232 145 +17b88 2 483 136 +17b8a 6 148 142 +17b90 6 101 108 +17b96 6 485 136 +17b9c 8 489 136 +FUNC 17ba4 46 0 std::operator+, std::allocator > +17ba4 2 80 139 +17ba6 2 80 139 +17ba8 2 229 145 +17baa 4 80 139 +17bae 6 229 145 +17bb4 4 400 136 +17bb8 2 124 137 +17bba 4 400 136 +17bbe 2 124 137 +17bc0 2 120 137 +17bc2 2 481 106 +17bc4 4 124 137 +17bc8 4 101 108 +17bcc 2 517 136 +17bce 2 101 108 +17bd0 8 517 136 +17bd8 c 497 136 +17be4 6 94 139 +FUNC 17bec 2c8 0 google_breakpad::AutoTempDir::DeleteRecursively +17bec 8 69 63 +17bf4 8 69 63 +17bfc 2 71 63 +17bfe 4 69 63 +17c02 6 71 63 +17c08 8 72 63 +17c10 6 77 63 +17c16 6 77 63 +17c1c 6 79 63 +17c22 12 85 63 +17c34 e 76 63 +17c42 e 77 63 +17c50 8 77 63 +17c58 4 77 63 +17c5c 8 79 63 +17c64 4 79 63 +17c68 4 79 63 +17c6c a 79 63 +17c76 6 156 137 +17c7c 8 81 63 +17c84 4 81 63 +17c88 2 1139 87 +17c8a 2 81 63 +17c8c 4 277 82 +17c90 6 1139 87 +17c96 2 81 63 +17c98 18 81 63 +17cb0 a 81 63 +17cba 4 81 63 +17cbe a 81 63 +17cc8 6 81 63 +17cce 8 81 63 +17cd6 6 85 79 +17cdc 6 81 63 +17ce2 6 156 137 +17ce8 a 256 82 +17cf2 c 82 63 +17cfe a 83 63 +17d08 6 85 63 +17d0e 4 85 63 +17d12 2 1139 87 +17d14 2 85 63 +17d16 4 277 82 +17d1a 2 1139 87 +17d1c 2 85 63 +17d1e 12 85 63 +17d30 a 85 63 +17d3a 4 85 63 +17d3e a 85 63 +17d48 6 85 63 +17d4e 8 85 63 +17d56 6 85 79 +17d5c 6 85 63 +17d62 6 156 137 +17d68 6 256 82 +17d6e 8 156 137 +17d76 c 87 63 +17d82 4 277 82 +17d86 4 1139 87 +17d8a 2 87 63 +17d8c 18 87 63 +17da4 a 87 63 +17dae 4 87 63 +17db2 a 87 63 +17dbc 6 87 63 +17dc2 8 87 63 +17dca 6 85 79 +17dd0 6 87 63 +17dd6 6 156 137 +17ddc a 256 82 +17de6 6 88 63 +17dec 4 88 63 +17df0 2 1139 87 +17df2 2 88 63 +17df4 4 277 82 +17df8 2 1139 87 +17dfa 2 88 63 +17dfc 18 88 63 +17e14 a 88 63 +17e1e 2 88 63 +17e20 a 88 63 +17e2a 6 88 63 +17e30 8 88 63 +17e38 6 85 79 +17e3e 6 88 63 +17e44 6 156 137 +17e4a 6 256 82 +17e50 64 89 63 +FUNC 17eb4 14 0 google_breakpad::AutoTempDir::~AutoTempDir +17eb4 2 60 63 +17eb6 2 60 63 +17eb8 6 61 63 +17ebe 6 156 137 +17ec4 4 62 63 +FUNC 17ec8 64 0 CreateTMPFile +17ec8 10 99 6 +17ed8 2 99 6 +17eda 8 100 6 +17ee2 2 99 6 +17ee4 6 100 6 +17eea 8 103 6 +17ef2 4 104 6 +17ef6 4 105 6 +17efa 8 106 6 +17f02 6 107 6 +17f08 6 156 137 +17f0e 1e 109 6 +FUNC 17f2c 88 0 ExceptionHandlerTest_SimpleWithFD_Test::TestBody +17f2c 8 170 6 +17f34 4 170 6 +17f38 2 171 6 +17f3a 2 170 6 +17f3c 2 172 6 +17f3e 2 171 6 +17f40 2 170 6 +17f42 4 171 6 +17f46 8 172 6 +17f4e a 173 6 +17f58 c 174 6 +17f64 1a 174 6 +17f7e 6 174 6 +17f84 6 175 6 +17f8a 6 174 6 +17f90 6 156 137 +17f96 6 175 6 +17f9c 18 176 6 +FUNC 17fb4 180 0 ExceptionHandlerTest_SimpleWithPath_Test::TestBody +17fb4 8 160 6 +17fbc 4 160 6 +17fc0 2 161 6 +17fc2 2 160 6 +17fc4 2 163 6 +17fc6 2 161 6 +17fc8 2 160 6 +17fca 4 161 6 +17fce 8 163 6 +17fd6 1e 163 6 +17ff4 4 87 8 +17ff8 6 163 6 +17ffe 8 87 8 +18006 16 1512 82 +1801c 6 156 137 +18022 6 164 6 +18028 6 302 82 +1802e a 164 6 +18038 4 164 6 +1803c 8 164 6 +18044 6 164 6 +1804a 8 164 6 +18052 6 85 79 +18058 6 164 6 +1805e a 256 82 +18068 e 165 6 +18076 8 166 6 +1807e 8 140 5 +18086 6 166 6 +1808c 8 87 8 +18094 12 1512 82 +180a6 6 156 137 +180ac 6 167 6 +180b2 6 302 82 +180b8 a 167 6 +180c2 4 167 6 +180c6 8 167 6 +180ce 6 167 6 +180d4 8 167 6 +180dc 6 85 79 +180e2 6 167 6 +180e8 6 256 82 +180ee 6 156 137 +180f4 6 163 6 +180fa 6 167 6 +18100 34 168 6 +FUNC 18134 a4 0 std::basic_stringbuf, std::allocator >::xsputn +18134 4 170 131 +18138 2 170 131 +1813a 2 174 131 +1813c 2 170 131 +1813e 4 174 131 +18142 2 170 131 +18144 2 174 131 +18146 8 174 131 +1814e 4 177 131 +18152 6 177 131 +18158 2 172 131 +1815a 14 193 131 +1816e 8 194 131 +18176 c 497 136 +18182 4 197 131 +18186 2 93 134 +18188 2 94 134 +1818a 4 95 134 +1818e c 497 136 +1819a 2 400 136 +1819c 2 117 134 +1819e 2 400 136 +181a0 2 115 134 +181a2 2 119 134 +181a4 2 115 134 +181a6 4 205 131 +181aa 6 172 131 +181b0 2 178 131 +181b2 4 179 131 +181b6 4 172 145 +181ba 2 115 134 +181bc 2 182 131 +181be 4 115 134 +181c2 2 182 131 +181c4 2 172 145 +181c6 6 172 145 +181cc 2 186 131 +181ce 4 187 131 +181d2 6 209 131 +FUNC 181d8 48 0 testing::PrintToString +181d8 e 883 80 +181e6 2 883 80 +181e8 6 884 80 +181ee 2 883 80 +181f0 4 884 80 +181f4 8 240 126 +181fc 8 75 132 +18204 6 886 80 +1820a 16 887 80 +FUNC 18220 d4 0 testing::internal::CmpHelperOpFailure +18220 8 1579 82 +18228 8 1579 82 +18230 2 1583 82 +18232 6 1579 82 +18238 2 1583 82 +1823a a 1579 82 +18244 4 1583 82 +18248 a 1583 82 +18252 6 1583 82 +18258 2 1583 82 +1825a 2 1382 82 +1825c 6 1583 82 +18262 6 1583 82 +18268 8 1583 82 +18270 6 1583 82 +18276 a 1584 82 +18280 8 1382 82 +18288 8 1584 82 +18290 2 1585 82 +18292 2 1382 82 +18294 8 1585 82 +1829c 8 1382 82 +182a4 a 1585 82 +182ae 6 1585 82 +182b4 c 156 137 +182c0 6 256 82 +182c6 2e 1586 82 +FUNC 182f4 2c 0 testing::internal::CmpHelperNE +182f4 2 1615 82 +182f6 c 1615 82 +18302 4 1615 82 +18306 2 1615 82 +18308 c 1615 82 +18314 c 1615 82 +FUNC 18320 74 0 testing::internal::CmpHelperEQ +18320 8 1476 82 +18328 c 1476 82 +18334 2 1481 82 +18336 2 1476 82 +18338 4 1481 82 +1833c 2 1476 82 +1833e 2 1481 82 +18340 2 1476 82 +18342 2 1481 82 +18344 6 1482 82 +1834a 14 1382 82 +1835e 12 1471 82 +18370 c 156 137 +1837c 18 1488 82 +FUNC 18394 178 0 WaitForProcessToTerminate +18394 10 129 6 +183a4 4 129 6 +183a8 12 131 6 +183ba 4 131 6 +183be 6 131 6 +183c4 4 131 6 +183c8 4 131 6 +183cc 2 131 6 +183ce 8 131 6 +183d6 2 131 6 +183d8 e 131 6 +183e6 8 131 6 +183ee 6 302 82 +183f4 e 131 6 +18402 6 256 82 +18408 2 132 6 +1840a 2 1139 87 +1840c e 132 6 +1841a 2 1139 87 +1841c 4 277 82 +18420 2 132 6 +18422 1a 132 6 +1843c 12 132 6 +1844e 6 132 6 +18454 8 132 6 +1845c 6 85 79 +18462 6 132 6 +18468 8 156 137 +18470 6 256 82 +18476 2 133 6 +18478 4 1512 82 +1847c 6 133 6 +18482 e 1512 82 +18490 6 133 6 +18496 6 302 82 +1849c 10 133 6 +184ac 6 133 6 +184b2 8 133 6 +184ba 6 85 79 +184c0 6 133 6 +184c6 6 256 82 +184cc 40 134 6 +FUNC 1850c 2ac 0 ReadMinidumpPathFromPipe +1850c a 137 6 +18516 a 137 6 +18520 2 139 6 +18522 2 137 6 +18524 4 139 6 +18528 2 141 6 +1852a 4 137 6 +1852e 2 140 6 +18530 4 141 6 +18534 10 143 6 +18544 4 143 6 +18548 6 143 6 +1854e 2 144 6 +18550 4 1512 82 +18554 2 144 6 +18556 10 1512 82 +18566 2 143 6 +18568 4 1512 82 +1856c a 144 6 +18576 6 302 82 +1857c e 144 6 +1858a 6 256 82 +18590 2 1139 87 +18592 4 145 6 +18596 2 1139 87 +18598 4 145 6 +1859c 4 277 82 +185a0 2 145 6 +185a2 1a 145 6 +185bc 12 145 6 +185ce 6 145 6 +185d4 8 145 6 +185dc 6 85 79 +185e2 6 145 6 +185e8 8 156 137 +185f0 6 256 82 +185f6 10 148 6 +18606 4 1512 82 +1860a 2 148 6 +1860c e 1512 82 +1861a 6 148 6 +18620 6 302 82 +18626 10 148 6 +18636 6 148 6 +1863c 8 148 6 +18644 4 85 79 +18648 6 256 82 +1864e 6 149 6 +18654 8 1619 82 +1865c 8 1619 82 +18664 18 1619 82 +1867c 6 149 6 +18682 6 302 82 +18688 8 149 6 +18690 2 149 6 +18692 8 149 6 +1869a 6 149 6 +186a0 8 149 6 +186a8 6 85 79 +186ae 6 149 6 +186b4 a 256 82 +186be 2 150 6 +186c0 4 1512 82 +186c4 8 150 6 +186cc a 151 6 +186d6 4 1512 82 +186da 2 151 6 +186dc 10 1512 82 +186ec 6 151 6 +186f2 6 302 82 +186f8 10 151 6 +18708 6 151 6 +1870e 8 151 6 +18716 6 85 79 +1871c 6 151 6 +18722 6 256 82 +18728 c 156 6 +18734 6 256 82 +1873a 4 152 6 +1873e 2 153 6 +18740 2 152 6 +18742 4 153 6 +18746 8 154 6 +1874e c 155 6 +1875a 6 156 6 +18760 4 155 6 +18764 54 156 6 +FUNC 187b8 e8 0 testing::internal::CmpHelperOpFailure +187b8 8 1579 82 +187c0 8 1579 82 +187c8 2 1583 82 +187ca 6 1579 82 +187d0 2 1583 82 +187d2 a 1579 82 +187dc 4 1583 82 +187e0 a 1583 82 +187ea 6 1583 82 +187f0 2 1583 82 +187f2 2 884 80 +187f4 6 1583 82 +187fa 6 1583 82 +18800 8 1583 82 +18808 6 1583 82 +1880e a 1584 82 +18818 8 884 80 +18820 4 259 126 +18824 2 75 132 +18826 4 259 126 +1882a 8 75 132 +18832 6 886 80 +18838 8 1584 82 +18840 a 1585 82 +1884a 8 1382 82 +18852 a 1585 82 +1885c 6 1585 82 +18862 c 156 137 +1886e 6 256 82 +18874 2c 1586 82 +FUNC 188a0 244 0 ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test::TestBody +188a0 a 1019 6 +188aa 6 1019 6 +188b0 4 1020 6 +188b4 4 1019 6 +188b8 4 1021 6 +188bc 2 1020 6 +188be 2 1021 6 +188c0 2 1019 6 +188c2 4 1020 6 +188c6 8 1021 6 +188ce 8 1022 6 +188d6 2 1023 6 +188d8 2 1022 6 +188da 8 1023 6 +188e2 1c 1023 6 +188fe 6 1023 6 +18904 6 1024 6 +1890a 2 1139 87 +1890c 4 277 82 +18910 4 1139 87 +18914 2 1024 6 +18916 16 1024 6 +1892c 14 1024 6 +18940 6 256 82 +18946 a 1027 6 +18950 2 1623 82 +18952 2 1027 6 +18954 2 1028 6 +18956 2 1623 82 +18958 8 1623 82 +18960 1a 1623 82 +1897a 6 1028 6 +18980 6 302 82 +18986 12 1028 6 +18998 6 256 82 +1899e 6 1031 6 +189a4 2 1139 87 +189a6 4 277 82 +189aa 2 1139 87 +189ac 2 1031 6 +189ae 16 1031 6 +189c4 12 1031 6 +189d6 2 1031 6 +189d8 4 1031 6 +189dc 6 1031 6 +189e2 8 1031 6 +189ea 6 85 79 +189f0 6 1031 6 +189f6 8 156 137 +189fe 6 256 82 +18a04 a 1032 6 +18a0e 2 1623 82 +18a10 2 1032 6 +18a12 2 1033 6 +18a14 2 1623 82 +18a16 8 1623 82 +18a1e 1a 1623 82 +18a38 6 1033 6 +18a3e 6 302 82 +18a44 10 1033 6 +18a54 2 1033 6 +18a56 4 1033 6 +18a5a 6 1033 6 +18a60 8 1033 6 +18a68 6 85 79 +18a6e 6 1033 6 +18a74 c 256 82 +18a80 c 156 137 +18a8c 58 1034 6 +FUNC 18ae4 6c 0 testing::PrintToString +18ae4 e 883 80 +18af2 2 883 80 +18af4 4 884 80 +18af8 2 883 80 +18afa 4 884 80 +18afe 2 883 80 +18b00 8 884 80 +18b08 2 310 80 +18b0a c 333 127 +18b16 6 318 80 +18b1c 8 291 126 +18b24 8 75 132 +18b2c 6 886 80 +18b32 1e 887 80 +FUNC 18b50 d4 0 testing::internal::CmpHelperOpFailure +18b50 8 1579 82 +18b58 8 1579 82 +18b60 2 1583 82 +18b62 6 1579 82 +18b68 2 1583 82 +18b6a a 1579 82 +18b74 4 1583 82 +18b78 a 1583 82 +18b82 6 1583 82 +18b88 2 1583 82 +18b8a 2 1382 82 +18b8c 6 1583 82 +18b92 6 1583 82 +18b98 8 1583 82 +18ba0 6 1583 82 +18ba6 a 1584 82 +18bb0 8 1382 82 +18bb8 8 1584 82 +18bc0 2 1585 82 +18bc2 2 1382 82 +18bc4 8 1585 82 +18bcc 8 1382 82 +18bd4 a 1585 82 +18bde 6 1585 82 +18be4 c 156 137 +18bf0 6 256 82 +18bf6 2e 1586 82 +FUNC 18c24 d8 0 testing::PrintToString +18c24 e 883 80 +18c32 2 883 80 +18c34 6 884 80 +18c3a 2 181 127 +18c3c 2 883 80 +18c3e 2 884 80 +18c40 2 883 80 +18c42 4 884 80 +18c46 10 181 127 +18c56 2 199 126 +18c58 10 211 126 +18c68 2 202 126 +18c6a 2 145 115 +18c6c 4 202 126 +18c70 2 145 115 +18c72 2 202 126 +18c74 6 145 115 +18c7a 6 202 126 +18c80 2 202 126 +18c82 2 202 126 +18c84 c 202 126 +18c90 18 57 128 +18ca8 1c 72 125 +18cc4 6 202 126 +18cca 6 210 126 +18cd0 6 212 126 +18cd6 8 75 132 +18cde 6 886 80 +18ce4 18 887 80 +FUNC 18cfc e8 0 testing::internal::CmpHelperLT +18cfc e 1619 82 +18d0a 14 1619 82 +18d1e 4 1619 82 +18d22 4 1619 82 +18d26 10 1583 82 +18d36 a 1583 82 +18d40 6 1583 82 +18d46 2 1583 82 +18d48 2 1382 82 +18d4a 6 1583 82 +18d50 6 1583 82 +18d56 8 1583 82 +18d5e 6 1583 82 +18d64 a 1584 82 +18d6e 8 1382 82 +18d76 8 1584 82 +18d7e 2 1585 82 +18d80 2 1382 82 +18d82 8 1585 82 +18d8a 8 1382 82 +18d92 a 1585 82 +18d9c 6 1585 82 +18da2 c 156 137 +18dae 6 256 82 +18db4 30 1619 82 +FUNC 18de4 74 0 testing::internal::CmpHelperEQ +18de4 8 1476 82 +18dec c 1476 82 +18df8 2 1481 82 +18dfa 2 1476 82 +18dfc 4 1481 82 +18e00 2 1476 82 +18e02 2 1481 82 +18e04 2 1476 82 +18e06 2 1481 82 +18e08 6 1482 82 +18e0e 14 1382 82 +18e22 12 1471 82 +18e34 c 156 137 +18e40 18 1488 82 +FUNC 18e58 11c 0 testing::internal::CmpHelperEQ +18e58 e 1476 82 +18e66 2 1481 82 +18e68 2 1476 82 +18e6a 4 1476 82 +18e6e 2 1481 82 +18e70 4 1476 82 +18e74 a 1481 82 +18e7e 2 1476 82 +18e80 2 1481 82 +18e82 6 1482 82 +18e88 6 1382 82 +18e8e 4 181 127 +18e92 c 884 80 +18e9e e 181 127 +18eac 2 199 126 +18eae 12 211 126 +18ec0 2 202 126 +18ec2 2 145 115 +18ec4 4 202 126 +18ec8 2 145 115 +18eca 2 202 126 +18ecc 6 145 115 +18ed2 6 202 126 +18ed8 2 202 126 +18eda 2 202 126 +18edc c 202 126 +18ee8 18 57 128 +18f00 1a 83 125 +18f1a 6 202 126 +18f20 4 210 126 +18f24 2 75 132 +18f26 6 212 126 +18f2c 8 75 132 +18f34 6 886 80 +18f3a 14 1471 82 +18f4e c 156 137 +18f5a 1a 1488 82 +FUNC 18f74 96 0 std::priv::__put_num, long long int> +18f74 4 194 126 +18f78 6 194 126 +18f7e a 181 127 +18f88 2 199 126 +18f8a 10 211 126 +18f9a 2 202 126 +18f9c 2 145 115 +18f9e 4 202 126 +18fa2 2 145 115 +18fa4 2 202 126 +18fa6 6 145 115 +18fac 6 202 126 +18fb2 2 202 126 +18fb4 2 202 126 +18fb6 c 202 126 +18fc2 18 57 128 +18fda 1a 78 125 +18ff4 6 202 126 +18ffa 4 210 126 +18ffe 6 212 126 +19004 6 213 126 +FUNC 1900c 110 0 testing::internal::CmpHelperGT +1900c 12 1623 82 +1901e 1e 1623 82 +1903c 4 1623 82 +19040 4 1623 82 +19044 10 1583 82 +19054 a 1583 82 +1905e 6 1583 82 +19064 2 1583 82 +19066 2 884 80 +19068 6 1583 82 +1906e 6 1583 82 +19074 8 1583 82 +1907c 6 1583 82 +19082 a 1584 82 +1908c 8 884 80 +19094 6 268 126 +1909a 2 75 132 +1909c 4 268 126 +190a0 8 75 132 +190a8 6 886 80 +190ae 8 1584 82 +190b6 a 1585 82 +190c0 8 1382 82 +190c8 a 1585 82 +190d2 6 1585 82 +190d8 c 156 137 +190e4 6 256 82 +190ea 32 1623 82 +FUNC 1911c 94 0 testing::internal::CmpHelperEQ +1911c e 1476 82 +1912a 8 1476 82 +19132 6 1481 82 +19138 2 1476 82 +1913a 2 1481 82 +1913c 2 1476 82 +1913e 2 1481 82 +19140 6 1482 82 +19146 4 173 80 +1914a a 884 80 +19154 6 268 126 +1915a 4 75 132 +1915e 6 268 126 +19164 8 75 132 +1916c 6 886 80 +19172 8 1382 82 +1917a 10 1471 82 +1918a c 156 137 +19196 1a 1488 82 +FUNC 191b0 62 0 std::basic_string, std::allocator >::_M_reserve +191b0 2 170 135 +191b2 2 170 135 +191b4 4 346 106 +191b8 2 158 106 +191ba 2 347 106 +191bc 2 158 106 +191be 8 134 124 +191c6 8 158 106 +191ce 4 352 106 +191d2 4 356 106 +191d6 12 86 142 +191e8 8 86 142 +191f0 6 146 108 +191f6 8 101 108 +191fe 8 174 135 +19206 2 175 135 +19208 2 160 137 +1920a 2 164 137 +1920c 2 165 137 +1920e 4 176 135 +FUNC 19212 30 0 std::basic_string, std::allocator >::push_back +19212 2 534 136 +19214 4 534 136 +19218 a 535 136 +19222 8 536 136 +1922a 6 536 136 +19230 8 101 108 +19238 2 232 145 +1923a 8 539 136 +FUNC 19242 5e 0 std::basic_stringbuf, std::allocator >::overflow +19242 2 142 131 +19244 2 142 131 +19246 2 144 131 +19248 2 142 131 +1924a 2 144 131 +1924c 6 145 131 +19252 c 146 131 +1925e 4 147 131 +19262 6 115 134 +19268 4 149 131 +1926c 6 150 131 +19272 8 151 131 +1927a 2 153 131 +1927c 2 93 134 +1927e 2 94 134 +19280 4 95 134 +19284 6 157 131 +1928a 4 117 134 +1928e 2 119 134 +19290 6 115 134 +19296 4 182 145 +1929a 4 163 131 +1929e 2 166 131 +FUNC 192a0 64 0 std::basic_string, std::allocator >::append +192a0 2 180 135 +192a2 4 180 135 +192a6 4 181 135 +192aa 6 400 136 +192b0 a 182 135 +192ba 8 600 135 +192c2 8 184 135 +192ca a 185 135 +192d4 8 185 135 +192dc 2 186 135 +192de 4 249 142 +192e2 4 146 108 +192e6 4 249 142 +192ea 8 101 108 +192f2 2 232 145 +192f4 6 189 135 +192fa a 192 135 +FUNC 19304 90 0 std::basic_stringbuf, std::allocator >::_M_xsputnc +19304 4 213 131 +19308 2 213 131 +1930a 2 217 131 +1930c 2 213 131 +1930e 4 217 131 +19312 2 213 131 +19314 2 217 131 +19316 4 217 131 +1931a a 220 131 +19324 4 221 131 +19328 4 222 131 +1932c 4 235 145 +19330 2 115 134 +19332 2 225 131 +19334 4 115 134 +19338 4 225 131 +1933c 6 235 145 +19342 4 230 131 +19346 2 215 131 +19348 c 238 131 +19354 4 239 131 +19358 4 240 131 +1935c 2 239 131 +1935e 8 240 131 +19366 2 242 131 +19368 2 93 134 +1936a 2 94 134 +1936c 4 95 134 +19370 c 244 131 +1937c 2 400 136 +1937e 2 117 134 +19380 2 400 136 +19382 2 115 134 +19384 2 119 134 +19386 2 115 134 +19388 6 250 131 +1938e 2 215 131 +19390 4 254 131 +FUNC 19394 84 0 std::basic_stringbuf, std::allocator >::setbuf +19394 2 263 131 +19396 4 262 131 +1939a 2 262 131 +1939c 6 263 131 +193a2 2 279 131 +193a4 2 269 131 +193a6 4 267 131 +193aa c 271 131 +193b6 2 270 131 +193b8 2 265 131 +193ba 2 274 131 +193bc 4 266 131 +193c0 2 400 136 +193c2 6 276 131 +193c8 4 400 136 +193cc 4 276 131 +193d0 4 275 131 +193d4 8 264 131 +193dc 2 72 137 +193de 4 72 137 +193e2 4 162 135 +193e6 6 72 137 +193ec 4 163 135 +193f0 6 166 135 +193f6 8 284 131 +193fe 2 285 131 +19400 2 93 134 +19402 2 94 134 +19404 2 95 134 +19406 4 288 131 +1940a 2 115 134 +1940c 2 117 134 +1940e 2 119 134 +19410 2 115 134 +19412 6 295 131 +FUNC 19418 2f4 0 ChildCrash +19418 8 210 6 +19420 4 210 6 +19424 2 211 6 +19426 4 210 6 +1942a 2 211 6 +1942c 2 210 6 +1942e 4 211 6 +19432 2 212 6 +19434 a 214 6 +1943e 4 212 6 +19442 8 214 6 +1944a 6 215 6 +19450 c 216 6 +1945c a 218 6 +19466 8 218 6 +1946e 2 218 6 +19470 a 218 6 +1947a 2 218 6 +1947c 4 218 6 +19480 a 218 6 +1948a 6 302 82 +19490 10 218 6 +194a0 6 218 6 +194a6 8 218 6 +194ae 6 85 79 +194b4 6 218 6 +194ba a 256 82 +194c4 2 213 6 +194c6 4 221 6 +194ca 8 222 6 +194d2 6 225 6 +194d8 8 227 6 +194e0 6 227 6 +194e6 8 227 6 +194ee 2 227 6 +194f0 e 227 6 +194fe 6 229 6 +19504 2 230 6 +19506 4 233 6 +1950a 2 230 6 +1950c 4 233 6 +19510 6 233 6 +19516 2 233 6 +19518 2 233 6 +1951a 18 233 6 +19532 2 233 6 +19534 4 108 57 +19538 4 233 6 +1953c a 207 6 +19546 4 98 57 +1954a 6 98 57 +19550 6 98 57 +19556 6 239 6 +1955c 6 240 6 +19562 6 242 6 +19568 6 242 6 +1956e 4 242 6 +19572 2 242 6 +19574 8 242 6 +1957c 8 242 6 +19584 4 242 6 +19588 c 244 6 +19594 12 242 6 +195a6 6 245 6 +195ac 6 245 6 +195b2 4 245 6 +195b6 2 245 6 +195b8 8 245 6 +195c0 8 245 6 +195c8 a 245 6 +195d2 14 245 6 +195e6 6 245 6 +195ec 8 245 6 +195f4 6 85 79 +195fa 6 245 6 +19600 2 245 6 +19602 4 248 6 +19606 4 248 6 +1960a 4 248 6 +1960e 4 248 6 +19612 c 1552 82 +1961e 2 248 6 +19620 e 1552 82 +1962e a 248 6 +19638 6 302 82 +1963e e 248 6 +1964c 6 256 82 +19652 1a 249 6 +1966c 6 302 82 +19672 10 249 6 +19682 6 249 6 +19688 8 249 6 +19690 6 85 79 +19696 6 249 6 +1969c e 256 82 +196aa 6 250 6 +196b0 c 156 137 +196bc 50 251 6 +FUNC 1970c 6c 0 ExceptionHandlerTest_ChildCrashWithPath_Test::TestBody +1970c 4 253 6 +19710 8 254 6 +19718 6 254 6 +1971e 4 254 6 +19722 2 254 6 +19724 6 254 6 +1972a 8 254 6 +19732 a 254 6 +1973c 16 254 6 +19752 6 254 6 +19758 8 254 6 +19760 6 85 79 +19766 6 254 6 +1976c c 255 6 +FUNC 19778 70 0 ExceptionHandlerTest_ChildCrashWithFD_Test::TestBody +19778 4 257 6 +1977c 8 258 6 +19784 6 258 6 +1978a 4 258 6 +1978e 2 258 6 +19790 6 258 6 +19796 8 258 6 +1979e a 258 6 +197a8 18 258 6 +197c0 6 258 6 +197c6 8 258 6 +197ce 6 85 79 +197d4 6 258 6 +197da e 259 6 +FUNC 197e8 148 0 ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test::TestBody +197e8 8 315 6 +197f0 4 315 6 +197f4 4 316 6 +197f8 2 315 6 +197fa 2 316 6 +197fc 2 315 6 +197fe 4 316 6 +19802 6 318 6 +19808 8 319 6 +19810 6 320 6 +19816 4 277 82 +1981a 6 1139 87 +19820 2 320 6 +19822 16 320 6 +19838 8 320 6 +19840 2 320 6 +19842 e 320 6 +19850 6 320 6 +19856 8 320 6 +1985e 6 85 79 +19864 6 320 6 +1986a 6 156 137 +19870 e 256 82 +1987e 8 321 6 +19886 c 321 6 +19892 6 156 137 +19898 6 324 6 +1989e 6 324 6 +198a4 4 324 6 +198a8 2 324 6 +198aa 8 324 6 +198b2 8 324 6 +198ba a 324 6 +198c4 18 324 6 +198dc 6 324 6 +198e2 8 324 6 +198ea 6 85 79 +198f0 c 324 6 +198fc 34 325 6 +FUNC 19930 148 0 ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test::TestBody +19930 8 327 6 +19938 4 327 6 +1993c 4 328 6 +19940 2 327 6 +19942 2 328 6 +19944 2 327 6 +19946 4 328 6 +1994a 6 330 6 +19950 8 331 6 +19958 6 332 6 +1995e 4 277 82 +19962 6 1139 87 +19968 2 332 6 +1996a 16 332 6 +19980 8 332 6 +19988 2 332 6 +1998a e 332 6 +19998 6 332 6 +1999e 8 332 6 +199a6 6 85 79 +199ac 6 332 6 +199b2 6 156 137 +199b8 e 256 82 +199c6 8 333 6 +199ce c 333 6 +199da 6 156 137 +199e0 6 336 6 +199e6 6 336 6 +199ec 4 336 6 +199f0 2 336 6 +199f2 8 336 6 +199fa 8 336 6 +19a02 a 336 6 +19a0c 18 336 6 +19a24 6 336 6 +19a2a 8 336 6 +19a32 6 85 79 +19a38 c 336 6 +19a44 34 337 6 +FUNC 19a78 148 0 ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test::TestBody +19a78 8 339 6 +19a80 4 339 6 +19a84 4 340 6 +19a88 2 339 6 +19a8a 2 340 6 +19a8c 2 339 6 +19a8e 4 340 6 +19a92 6 342 6 +19a98 8 343 6 +19aa0 6 344 6 +19aa6 4 277 82 +19aaa 6 1139 87 +19ab0 2 344 6 +19ab2 16 344 6 +19ac8 8 344 6 +19ad0 2 344 6 +19ad2 e 344 6 +19ae0 6 344 6 +19ae6 8 344 6 +19aee 6 85 79 +19af4 6 344 6 +19afa 6 156 137 +19b00 e 256 82 +19b0e 8 345 6 +19b16 c 345 6 +19b22 6 156 137 +19b28 6 348 6 +19b2e 6 348 6 +19b34 4 348 6 +19b38 2 348 6 +19b3a 8 348 6 +19b42 8 348 6 +19b4a a 348 6 +19b54 18 348 6 +19b6c 6 348 6 +19b72 8 348 6 +19b7a 6 85 79 +19b80 c 348 6 +19b8c 34 349 6 +FUNC 19bc0 148 0 ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test::TestBody +19bc0 8 351 6 +19bc8 4 351 6 +19bcc 4 352 6 +19bd0 2 351 6 +19bd2 2 352 6 +19bd4 2 351 6 +19bd6 4 352 6 +19bda 6 354 6 +19be0 8 355 6 +19be8 6 356 6 +19bee 4 277 82 +19bf2 6 1139 87 +19bf8 2 356 6 +19bfa 16 356 6 +19c10 8 356 6 +19c18 2 356 6 +19c1a e 356 6 +19c28 6 356 6 +19c2e 8 356 6 +19c36 6 85 79 +19c3c 6 356 6 +19c42 6 156 137 +19c48 e 256 82 +19c56 8 357 6 +19c5e c 357 6 +19c6a 6 156 137 +19c70 6 360 6 +19c76 6 360 6 +19c7c 4 360 6 +19c80 2 360 6 +19c82 8 360 6 +19c8a 8 360 6 +19c92 a 360 6 +19c9c 18 360 6 +19cb4 6 360 6 +19cba 8 360 6 +19cc2 6 85 79 +19cc8 c 360 6 +19cd4 34 361 6 +FUNC 19d08 c4 0 ExceptionHandlerTest_RedeliveryToDefaultHandler_Test::TestBody +19d08 6 363 6 +19d0e 4 363 6 +19d12 2 364 6 +19d14 2 363 6 +19d16 2 364 6 +19d18 2 363 6 +19d1a 4 364 6 +19d1e 6 366 6 +19d24 4 367 6 +19d28 a 368 6 +19d32 c 368 6 +19d3e 6 156 137 +19d44 8 373 6 +19d4c 6 373 6 +19d52 4 373 6 +19d56 2 373 6 +19d58 8 373 6 +19d60 8 373 6 +19d68 a 373 6 +19d72 18 373 6 +19d8a 6 373 6 +19d90 8 373 6 +19d98 6 85 79 +19d9e 6 373 6 +19da4 6 373 6 +19daa 22 374 6 +FUNC 19dcc 270 0 ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test::TestBody +19dcc 8 380 6 +19dd4 4 380 6 +19dd8 4 381 6 +19ddc 2 380 6 +19dde 2 381 6 +19de0 2 380 6 +19de2 4 381 6 +19de6 6 382 6 +19dec 8 383 6 +19df4 6 385 6 +19dfa 4 277 82 +19dfe 2 1139 87 +19e00 2 385 6 +19e02 16 385 6 +19e18 8 385 6 +19e20 2 385 6 +19e22 e 385 6 +19e30 6 385 6 +19e36 8 385 6 +19e3e 6 85 79 +19e44 6 385 6 +19e4a 6 156 137 +19e50 c 256 82 +19e5c 4 391 6 +19e60 6 256 82 +19e66 8 391 6 +19e6e 1c 391 6 +19e8a 6 391 6 +19e90 8 113 100 +19e98 2 1615 82 +19e9a 2 113 100 +19e9c 6 397 6 +19ea2 2 1615 82 +19ea4 8 1615 82 +19eac 1a 1615 82 +19ec6 6 397 6 +19ecc 6 302 82 +19ed2 12 397 6 +19ee4 6 256 82 +19eea 8 113 100 +19ef2 4 399 6 +19ef6 2 1615 82 +19ef8 4 399 6 +19efc 2 1615 82 +19efe 8 1615 82 +19f06 1a 1615 82 +19f20 6 399 6 +19f26 6 302 82 +19f2c 10 399 6 +19f3c 2 399 6 +19f3e 4 399 6 +19f42 6 399 6 +19f48 8 399 6 +19f50 6 85 79 +19f56 6 399 6 +19f5c 14 256 82 +19f70 4 207 6 +19f74 2 403 6 +19f76 6 207 6 +19f7c 4 403 6 +19f80 6 406 6 +19f86 6 406 6 +19f8c 4 406 6 +19f90 2 406 6 +19f92 8 406 6 +19f9a 8 406 6 +19fa2 a 406 6 +19fac 18 406 6 +19fc4 6 406 6 +19fca 8 406 6 +19fd2 6 85 79 +19fd8 c 406 6 +19fe4 58 407 6 +FUNC 1a03c f8 0 ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test::TestBody +1a03c 8 409 6 +1a044 4 409 6 +1a048 4 410 6 +1a04c 2 409 6 +1a04e 2 410 6 +1a050 2 409 6 +1a052 4 410 6 +1a056 6 412 6 +1a05c 4 413 6 +1a060 a 419 6 +1a06a 1a 419 6 +1a084 6 419 6 +1a08a 8 420 6 +1a092 c 420 6 +1a09e 6 156 137 +1a0a4 6 420 6 +1a0aa 8 422 6 +1a0b2 6 422 6 +1a0b8 4 422 6 +1a0bc 2 422 6 +1a0be 8 422 6 +1a0c6 8 422 6 +1a0ce a 422 6 +1a0d8 18 422 6 +1a0f0 6 422 6 +1a0f6 8 422 6 +1a0fe 6 85 79 +1a104 6 422 6 +1a10a 6 422 6 +1a110 24 423 6 +FUNC 1a134 f8 0 ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test::TestBody +1a134 8 425 6 +1a13c 4 425 6 +1a140 4 426 6 +1a144 2 425 6 +1a146 2 426 6 +1a148 2 425 6 +1a14a 4 426 6 +1a14e 6 428 6 +1a154 4 429 6 +1a158 a 435 6 +1a162 1c 435 6 +1a17e 6 435 6 +1a184 8 436 6 +1a18c a 436 6 +1a196 6 156 137 +1a19c 6 436 6 +1a1a2 8 438 6 +1a1aa 6 438 6 +1a1b0 4 438 6 +1a1b4 2 438 6 +1a1b6 8 438 6 +1a1be 8 438 6 +1a1c6 a 438 6 +1a1d0 18 438 6 +1a1e8 6 438 6 +1a1ee 8 438 6 +1a1f6 6 85 79 +1a1fc 6 438 6 +1a202 6 438 6 +1a208 24 439 6 +FUNC 1a22c fc 0 ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test::TestBody +1a22c 8 441 6 +1a234 4 441 6 +1a238 4 442 6 +1a23c 2 441 6 +1a23e 2 442 6 +1a240 2 441 6 +1a242 4 442 6 +1a246 6 444 6 +1a24c 4 445 6 +1a250 a 451 6 +1a25a 1c 451 6 +1a276 6 451 6 +1a27c 8 452 6 +1a284 c 452 6 +1a290 6 156 137 +1a296 6 452 6 +1a29c 8 454 6 +1a2a4 6 454 6 +1a2aa 4 454 6 +1a2ae 2 454 6 +1a2b0 8 454 6 +1a2b8 8 454 6 +1a2c0 a 454 6 +1a2ca 18 454 6 +1a2e2 6 454 6 +1a2e8 8 454 6 +1a2f0 6 85 79 +1a2f6 6 454 6 +1a2fc 6 454 6 +1a302 26 455 6 +FUNC 1a328 fc 0 ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test::TestBody +1a328 8 457 6 +1a330 4 457 6 +1a334 4 458 6 +1a338 2 457 6 +1a33a 2 458 6 +1a33c 2 457 6 +1a33e 4 458 6 +1a342 6 460 6 +1a348 4 461 6 +1a34c a 467 6 +1a356 1c 467 6 +1a372 6 467 6 +1a378 8 468 6 +1a380 c 468 6 +1a38c 6 156 137 +1a392 6 468 6 +1a398 8 470 6 +1a3a0 6 470 6 +1a3a6 4 470 6 +1a3aa 2 470 6 +1a3ac 8 470 6 +1a3b4 8 470 6 +1a3bc a 470 6 +1a3c6 18 470 6 +1a3de 6 470 6 +1a3e4 8 470 6 +1a3ec 6 85 79 +1a3f2 6 470 6 +1a3f8 6 470 6 +1a3fe 26 471 6 +FUNC 1a424 748 0 ExceptionHandlerTest_ExternalDumper_Test::TestBody +1a424 c 926 6 +1a430 6 926 6 +1a436 4 928 6 +1a43a 4 926 6 +1a43e 10 928 6 +1a44e 8 928 6 +1a456 4 928 6 +1a45a 4 928 6 +1a45e 4 928 6 +1a462 e 928 6 +1a470 a 928 6 +1a47a 6 302 82 +1a480 14 928 6 +1a494 6 928 6 +1a49a 8 928 6 +1a4a2 6 85 79 +1a4a8 4 928 6 +1a4ac 4 930 6 +1a4b0 2 256 82 +1a4b2 4 930 6 +1a4b6 4 256 82 +1a4ba 14 930 6 +1a4ce 12 931 6 +1a4e0 4 933 6 +1a4e4 4 934 6 +1a4e8 4 937 6 +1a4ec 8 935 6 +1a4f4 a 937 6 +1a4fe 4 937 6 +1a502 6 937 6 +1a508 8 937 6 +1a510 20 937 6 +1a530 6 156 137 +1a536 4 144 5 +1a53a 2 939 6 +1a53c 4 144 5 +1a540 c 207 6 +1a54c 4 939 6 +1a550 4 942 6 +1a554 8 941 6 +1a55c a 942 6 +1a566 4 948 6 +1a56a 6 949 6 +1a570 6 951 6 +1a576 6 952 6 +1a57c 2 953 6 +1a57e 4 950 6 +1a582 4 953 6 +1a586 12 955 6 +1a598 4 955 6 +1a59c 6 955 6 +1a5a2 4 956 6 +1a5a6 2 955 6 +1a5a8 4 956 6 +1a5ac 8 1512 82 +1a5b4 2 955 6 +1a5b6 e 1512 82 +1a5c4 a 956 6 +1a5ce 6 302 82 +1a5d4 10 956 6 +1a5e4 4 959 6 +1a5e8 6 959 6 +1a5ee 8 959 6 +1a5f6 6 85 79 +1a5fc 6 959 6 +1a602 a 256 82 +1a60c 4 961 6 +1a610 2 962 6 +1a612 4 961 6 +1a616 2 962 6 +1a618 4 963 6 +1a61c 2 962 6 +1a61e 2 963 6 +1a620 4 1512 82 +1a624 4 963 6 +1a628 6 1512 82 +1a62e 6 963 6 +1a634 4 969 6 +1a638 4 1512 82 +1a63c 6 963 6 +1a642 8 965 6 +1a64a 8 967 6 +1a652 2 968 6 +1a654 2 970 6 +1a656 2 968 6 +1a658 4 969 6 +1a65c 2 970 6 +1a65e 4 1512 82 +1a662 2 970 6 +1a664 c 1512 82 +1a670 a 970 6 +1a67a 6 302 82 +1a680 14 970 6 +1a694 6 970 6 +1a69a 8 970 6 +1a6a2 6 85 79 +1a6a8 6 970 6 +1a6ae e 256 82 +1a6bc 1c 1512 82 +1a6d8 4 957 6 +1a6dc 6 302 82 +1a6e2 12 957 6 +1a6f4 4 958 6 +1a6f8 6 256 82 +1a6fe 6 1552 82 +1a704 4 958 6 +1a708 e 1552 82 +1a716 6 958 6 +1a71c 6 302 82 +1a722 10 958 6 +1a732 6 256 82 +1a738 c 959 6 +1a744 4 1552 82 +1a748 2 959 6 +1a74a e 1552 82 +1a758 8 959 6 +1a760 6 302 82 +1a766 10 959 6 +1a776 6 256 82 +1a77c 8 971 6 +1a784 2 972 6 +1a786 6 975 6 +1a78c 2 89 99 +1a78e 2 90 99 +1a790 8 89 99 +1a798 8 90 99 +1a7a0 8 91 99 +1a7a8 2e 979 6 +1a7d6 6 302 82 +1a7dc 10 979 6 +1a7ec 6 256 82 +1a7f2 1a 980 6 +1a80c 6 302 82 +1a812 12 980 6 +1a824 6 980 6 +1a82a 8 980 6 +1a832 6 85 79 +1a838 6 980 6 +1a83e 4 256 82 +1a842 4 982 6 +1a846 6 256 82 +1a84c 6 982 6 +1a852 10 983 6 +1a862 12 984 6 +1a874 2 1139 87 +1a876 4 277 82 +1a87a 2 984 6 +1a87c 18 984 6 +1a894 14 984 6 +1a8a8 6 984 6 +1a8ae 8 984 6 +1a8b6 6 85 79 +1a8bc 6 984 6 +1a8c2 6 156 137 +1a8c8 a 256 82 +1a8d2 2 987 6 +1a8d4 6 987 6 +1a8da 2 987 6 +1a8dc 12 987 6 +1a8ee 4 987 6 +1a8f2 6 987 6 +1a8f8 4 1512 82 +1a8fc 4 987 6 +1a900 e 1512 82 +1a90e 8 987 6 +1a916 6 302 82 +1a91c e 987 6 +1a92a 4 994 6 +1a92e 6 994 6 +1a934 8 994 6 +1a93c 6 85 79 +1a942 6 994 6 +1a948 e 256 82 +1a956 8 990 6 +1a95e 16 990 6 +1a974 6 990 6 +1a97a 8 990 6 +1a982 6 85 79 +1a988 6 990 6 +1a98e e 156 137 +1a99c 6 256 82 +1a9a2 c 988 6 +1a9ae 4 1552 82 +1a9b2 2 988 6 +1a9b4 e 1552 82 +1a9c2 6 988 6 +1a9c8 6 302 82 +1a9ce 10 988 6 +1a9de 6 990 6 +1a9e4 4 990 6 +1a9e8 2 990 6 +1a9ea 8 990 6 +1a9f2 c 990 6 +1a9fe 4 990 6 +1aa02 6 993 6 +1aa08 4 993 6 +1aa0c 4 993 6 +1aa10 6 1552 82 +1aa16 2 993 6 +1aa18 2 1552 82 +1aa1a 2 993 6 +1aa1c e 1552 82 +1aa2a 6 993 6 +1aa30 6 302 82 +1aa36 16 993 6 +1aa4c 6 256 82 +1aa52 18 994 6 +1aa6a 6 302 82 +1aa70 10 994 6 +1aa80 6 256 82 +1aa86 8 995 6 +1aa8e 4 156 137 +1aa92 da 996 6 +FUNC 1ab6c 884 0 ExceptionHandlerTest_InstructionPointerMemory_Test::TestBody +1ab6c c 487 6 +1ab78 6 487 6 +1ab7e 2 490 6 +1ab80 2 487 6 +1ab82 a 488 6 +1ab8c a 490 6 +1ab96 8 490 6 +1ab9e 4 490 6 +1aba2 4 490 6 +1aba6 6 490 6 +1abac e 490 6 +1abba a 490 6 +1abc4 6 302 82 +1abca 14 490 6 +1abde 6 490 6 +1abe4 8 490 6 +1abec 6 85 79 +1abf2 6 490 6 +1abf8 8 256 82 +1ac00 4 494 6 +1ac04 6 256 82 +1ac0a 4 494 6 +1ac0e 4 497 6 +1ac12 6 498 6 +1ac18 4 502 6 +1ac1c 6 499 6 +1ac22 8 502 6 +1ac2a 20 502 6 +1ac4a 6 502 6 +1ac50 12 510 6 +1ac62 4 511 6 +1ac66 4 512 6 +1ac6a c 517 6 +1ac76 4 68 6 +1ac7a 4 517 6 +1ac7e 8 68 6 +1ac86 2 524 6 +1ac88 6 524 6 +1ac8e 6 526 6 +1ac94 a 528 6 +1ac9e 6 528 6 +1aca4 4 528 6 +1aca8 2 528 6 +1acaa 8 528 6 +1acb2 8 528 6 +1acba 2 530 6 +1acbc 4 528 6 +1acc0 8 530 6 +1acc8 c 531 6 +1acd4 1a 528 6 +1acee 6 528 6 +1acf4 8 528 6 +1acfc 6 85 79 +1ad02 6 528 6 +1ad08 2 528 6 +1ad0a 6 531 6 +1ad10 4 531 6 +1ad14 2 531 6 +1ad16 8 531 6 +1ad1e c 531 6 +1ad2a 4 531 6 +1ad2e 6 534 6 +1ad34 2 534 6 +1ad36 4 534 6 +1ad3a 8 1552 82 +1ad42 2 534 6 +1ad44 2 1552 82 +1ad46 2 534 6 +1ad48 e 1552 82 +1ad56 8 534 6 +1ad5e 6 302 82 +1ad64 16 534 6 +1ad7a 1a 531 6 +1ad94 6 531 6 +1ad9a 8 531 6 +1ada2 6 85 79 +1ada8 6 531 6 +1adae 2 531 6 +1adb0 6 256 82 +1adb6 1a 535 6 +1add0 6 302 82 +1add6 14 535 6 +1adea 6 535 6 +1adf0 8 535 6 +1adf8 6 85 79 +1adfe 6 535 6 +1ae04 8 256 82 +1ae0c 4 541 6 +1ae10 6 256 82 +1ae16 8 541 6 +1ae1e 6 542 6 +1ae24 4 1139 87 +1ae28 4 277 82 +1ae2c 2 542 6 +1ae2e 1e 542 6 +1ae4c 14 542 6 +1ae60 6 256 82 +1ae66 8 544 6 +1ae6e 6 545 6 +1ae74 8 277 82 +1ae7c 2 545 6 +1ae7e 4 277 82 +1ae82 4 1139 87 +1ae86 2 546 6 +1ae88 1e 546 6 +1aea6 14 546 6 +1aeba 6 256 82 +1aec0 8 277 82 +1aec8 4 1139 87 +1aecc 4 277 82 +1aed0 2 547 6 +1aed2 1e 547 6 +1aef0 16 547 6 +1af06 6 547 6 +1af0c 8 547 6 +1af14 6 85 79 +1af1a 6 547 6 +1af20 4 156 137 +1af24 6 256 82 +1af2a 2 548 6 +1af2c 6 545 65 +1af32 4 545 65 +1af36 a 548 6 +1af40 2 548 6 +1af42 e 548 6 +1af50 6 548 6 +1af56 6 302 82 +1af5c 14 548 6 +1af70 6 548 6 +1af76 8 548 6 +1af7e 6 85 79 +1af84 8 548 6 +1af8c 6 256 82 +1af92 6 550 6 +1af98 6 277 82 +1af9e 4 1139 87 +1afa2 4 277 82 +1afa6 8 1139 87 +1afae 2 551 6 +1afb0 16 551 6 +1afc6 14 551 6 +1afda 6 551 6 +1afe0 8 551 6 +1afe8 6 85 79 +1afee 4 551 6 +1aff2 6 256 82 +1aff8 8 554 6 +1b000 4 1139 87 +1b004 2 277 82 +1b006 2 554 6 +1b008 16 554 6 +1b01e 14 554 6 +1b032 6 256 82 +1b038 e 557 6 +1b046 a 277 82 +1b050 4 1139 87 +1b054 2 558 6 +1b056 16 558 6 +1b06c 14 558 6 +1b080 6 256 82 +1b086 8 560 6 +1b08e 4 1512 82 +1b092 2 560 6 +1b094 e 1512 82 +1b0a2 4 560 6 +1b0a6 6 302 82 +1b0ac 16 560 6 +1b0c2 6 560 6 +1b0c8 8 560 6 +1b0d0 6 85 79 +1b0d6 6 560 6 +1b0dc 6 256 82 +1b0e2 6 561 6 +1b0e8 6 277 82 +1b0ee 2 1139 87 +1b0f0 4 277 82 +1b0f4 2 1139 87 +1b0f6 2 562 6 +1b0f8 16 562 6 +1b10e 16 562 6 +1b124 6 562 6 +1b12a 8 562 6 +1b132 6 85 79 +1b138 6 562 6 +1b13e 6 156 137 +1b144 14 256 82 +1b158 4 567 6 +1b15c a 566 6 +1b166 a 567 6 +1b170 10 568 6 +1b180 2 277 82 +1b182 2 1139 87 +1b184 2 568 6 +1b186 1a 568 6 +1b1a0 18 568 6 +1b1b8 6 568 6 +1b1be 8 568 6 +1b1c6 6 85 79 +1b1cc 6 568 6 +1b1d2 6 156 137 +1b1d8 6 256 82 +1b1de 12 569 6 +1b1f0 2 1139 87 +1b1f2 2 569 6 +1b1f4 2 277 82 +1b1f6 2 1139 87 +1b1f8 2 569 6 +1b1fa 1a 569 6 +1b214 18 569 6 +1b22c 6 569 6 +1b232 8 570 6 +1b23a 6 85 79 +1b240 6 569 6 +1b246 6 156 137 +1b24c 6 256 82 +1b252 10 571 6 +1b262 2 1139 87 +1b264 2 571 6 +1b266 2 277 82 +1b268 2 1139 87 +1b26a 2 571 6 +1b26c 1a 571 6 +1b286 18 571 6 +1b29e 6 571 6 +1b2a4 8 572 6 +1b2ac 6 85 79 +1b2b2 6 571 6 +1b2b8 6 156 137 +1b2be 6 256 82 +1b2c4 8 574 6 +1b2cc 6 574 6 +1b2d2 10 156 137 +1b2e2 10e 575 6 +FUNC 1b3f0 7f8 0 ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test::TestBody +1b3f0 a 579 6 +1b3fa 4 579 6 +1b3fe 4 580 6 +1b402 2 579 6 +1b404 2 580 6 +1b406 4 582 6 +1b40a 2 579 6 +1b40c 4 580 6 +1b410 a 582 6 +1b41a 8 582 6 +1b422 4 582 6 +1b426 4 582 6 +1b42a 4 582 6 +1b42e e 582 6 +1b43c a 582 6 +1b446 6 302 82 +1b44c 14 582 6 +1b460 6 582 6 +1b466 8 582 6 +1b46e 6 85 79 +1b474 6 582 6 +1b47a e 256 82 +1b488 4 589 6 +1b48c 4 590 6 +1b490 4 594 6 +1b494 8 591 6 +1b49c 8 594 6 +1b4a4 20 594 6 +1b4c4 6 594 6 +1b4ca 12 602 6 +1b4dc 4 603 6 +1b4e0 4 604 6 +1b4e4 4 609 6 +1b4e8 4 68 6 +1b4ec 4 609 6 +1b4f0 2 68 6 +1b4f2 2 609 6 +1b4f4 6 68 6 +1b4fa 2 616 6 +1b4fc 6 616 6 +1b502 8 618 6 +1b50a 8 620 6 +1b512 6 620 6 +1b518 4 620 6 +1b51c 2 620 6 +1b51e 8 620 6 +1b526 6 620 6 +1b52c 2 622 6 +1b52e 4 620 6 +1b532 8 622 6 +1b53a c 623 6 +1b546 1a 620 6 +1b560 6 620 6 +1b566 8 620 6 +1b56e 6 85 79 +1b574 6 620 6 +1b57a 2 620 6 +1b57c 6 623 6 +1b582 4 623 6 +1b586 2 623 6 +1b588 a 623 6 +1b592 e 623 6 +1b5a0 4 623 6 +1b5a4 4 626 6 +1b5a8 4 626 6 +1b5ac 4 626 6 +1b5b0 8 1552 82 +1b5b8 2 626 6 +1b5ba 2 1552 82 +1b5bc 2 626 6 +1b5be e 1552 82 +1b5cc 8 626 6 +1b5d4 6 302 82 +1b5da 16 626 6 +1b5f0 1a 623 6 +1b60a 6 623 6 +1b610 8 623 6 +1b618 6 85 79 +1b61e 6 623 6 +1b624 2 623 6 +1b626 6 256 82 +1b62c 1a 627 6 +1b646 6 302 82 +1b64c 14 627 6 +1b660 6 627 6 +1b666 8 627 6 +1b66e 6 85 79 +1b674 6 627 6 +1b67a 8 256 82 +1b682 4 633 6 +1b686 6 256 82 +1b68c 8 633 6 +1b694 6 634 6 +1b69a 4 1139 87 +1b69e 2 277 82 +1b6a0 2 634 6 +1b6a2 1e 634 6 +1b6c0 14 634 6 +1b6d4 6 256 82 +1b6da 8 636 6 +1b6e2 6 637 6 +1b6e8 6 277 82 +1b6ee 2 637 6 +1b6f0 2 277 82 +1b6f2 4 1139 87 +1b6f6 2 638 6 +1b6f8 1e 638 6 +1b716 14 638 6 +1b72a 6 256 82 +1b730 8 277 82 +1b738 4 1139 87 +1b73c 2 277 82 +1b73e 2 639 6 +1b740 1e 639 6 +1b75e 14 639 6 +1b772 6 639 6 +1b778 8 639 6 +1b780 6 85 79 +1b786 6 639 6 +1b78c 6 156 137 +1b792 a 256 82 +1b79c 4 640 6 +1b7a0 6 545 65 +1b7a6 4 545 65 +1b7aa 6 640 6 +1b7b0 2 640 6 +1b7b2 e 640 6 +1b7c0 8 640 6 +1b7c8 6 302 82 +1b7ce 12 640 6 +1b7e0 6 640 6 +1b7e6 8 640 6 +1b7ee 6 85 79 +1b7f4 8 640 6 +1b7fc 6 256 82 +1b802 6 642 6 +1b808 6 277 82 +1b80e 2 1139 87 +1b810 4 277 82 +1b814 6 1139 87 +1b81a 2 643 6 +1b81c 16 643 6 +1b832 14 643 6 +1b846 6 643 6 +1b84c 8 643 6 +1b854 6 85 79 +1b85a 4 643 6 +1b85e 6 256 82 +1b864 8 646 6 +1b86c 2 1139 87 +1b86e 2 277 82 +1b870 4 1139 87 +1b874 2 646 6 +1b876 16 646 6 +1b88c 12 646 6 +1b89e 6 256 82 +1b8a4 e 649 6 +1b8b2 6 277 82 +1b8b8 2 1139 87 +1b8ba 4 277 82 +1b8be 2 1139 87 +1b8c0 2 650 6 +1b8c2 16 650 6 +1b8d8 14 650 6 +1b8ec 6 650 6 +1b8f2 8 650 6 +1b8fa 6 85 79 +1b900 6 650 6 +1b906 4 156 137 +1b90a 6 256 82 +1b910 c 652 6 +1b91c 4 1512 82 +1b920 2 652 6 +1b922 e 1512 82 +1b930 4 652 6 +1b934 6 302 82 +1b93a 12 652 6 +1b94c 6 652 6 +1b952 8 652 6 +1b95a 6 85 79 +1b960 6 652 6 +1b966 6 256 82 +1b96c 6 653 6 +1b972 6 277 82 +1b978 4 1139 87 +1b97c 4 277 82 +1b980 8 1139 87 +1b988 2 654 6 +1b98a 16 654 6 +1b9a0 14 654 6 +1b9b4 6 654 6 +1b9ba 8 654 6 +1b9c2 6 85 79 +1b9c8 6 654 6 +1b9ce 6 156 137 +1b9d4 14 256 82 +1b9e8 a 657 6 +1b9f2 12 658 6 +1ba04 2 277 82 +1ba06 4 1139 87 +1ba0a 2 658 6 +1ba0c 1a 658 6 +1ba26 16 658 6 +1ba3c 6 658 6 +1ba42 8 659 6 +1ba4a 6 85 79 +1ba50 6 658 6 +1ba56 6 156 137 +1ba5c 6 256 82 +1ba62 e 660 6 +1ba70 2 1139 87 +1ba72 2 660 6 +1ba74 2 277 82 +1ba76 2 1139 87 +1ba78 2 660 6 +1ba7a 18 660 6 +1ba92 14 660 6 +1baa6 6 660 6 +1baac 8 661 6 +1bab4 6 85 79 +1baba 6 660 6 +1bac0 6 156 137 +1bac6 6 256 82 +1bacc 8 662 6 +1bad4 6 662 6 +1bada 10 156 137 +1baea fe 663 6 +FUNC 1bbe8 7f8 0 ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test::TestBody +1bbe8 a 667 6 +1bbf2 4 667 6 +1bbf6 4 668 6 +1bbfa 2 667 6 +1bbfc 2 668 6 +1bbfe 4 670 6 +1bc02 2 667 6 +1bc04 4 668 6 +1bc08 a 670 6 +1bc12 8 670 6 +1bc1a 4 670 6 +1bc1e 4 670 6 +1bc22 4 670 6 +1bc26 e 670 6 +1bc34 a 670 6 +1bc3e 6 302 82 +1bc44 14 670 6 +1bc58 6 670 6 +1bc5e 8 670 6 +1bc66 6 85 79 +1bc6c 6 670 6 +1bc72 e 256 82 +1bc80 4 680 6 +1bc84 4 681 6 +1bc88 4 685 6 +1bc8c 8 682 6 +1bc94 8 685 6 +1bc9c 20 685 6 +1bcbc 6 685 6 +1bcc2 12 693 6 +1bcd4 4 694 6 +1bcd8 4 695 6 +1bcdc c 700 6 +1bce8 4 68 6 +1bcec 4 700 6 +1bcf0 8 68 6 +1bcf8 2 707 6 +1bcfa 6 707 6 +1bd00 8 709 6 +1bd08 8 711 6 +1bd10 6 711 6 +1bd16 4 711 6 +1bd1a 2 711 6 +1bd1c 8 711 6 +1bd24 6 711 6 +1bd2a 2 713 6 +1bd2c 4 711 6 +1bd30 8 713 6 +1bd38 c 714 6 +1bd44 1a 711 6 +1bd5e 6 711 6 +1bd64 8 711 6 +1bd6c 6 85 79 +1bd72 6 711 6 +1bd78 2 711 6 +1bd7a 6 714 6 +1bd80 4 714 6 +1bd84 2 714 6 +1bd86 a 714 6 +1bd90 e 714 6 +1bd9e 4 714 6 +1bda2 4 717 6 +1bda6 4 717 6 +1bdaa 4 717 6 +1bdae 8 1552 82 +1bdb6 2 717 6 +1bdb8 2 1552 82 +1bdba 2 717 6 +1bdbc e 1552 82 +1bdca 8 717 6 +1bdd2 6 302 82 +1bdd8 16 717 6 +1bdee 1a 714 6 +1be08 6 714 6 +1be0e 8 714 6 +1be16 6 85 79 +1be1c 6 714 6 +1be22 2 714 6 +1be24 6 256 82 +1be2a 1a 718 6 +1be44 6 302 82 +1be4a 14 718 6 +1be5e 6 718 6 +1be64 8 718 6 +1be6c 6 85 79 +1be72 6 718 6 +1be78 8 256 82 +1be80 4 723 6 +1be84 6 256 82 +1be8a 8 723 6 +1be92 6 724 6 +1be98 4 1139 87 +1be9c 2 277 82 +1be9e 2 724 6 +1bea0 1e 724 6 +1bebe 14 724 6 +1bed2 6 256 82 +1bed8 8 726 6 +1bee0 6 727 6 +1bee6 6 277 82 +1beec 2 727 6 +1beee 2 277 82 +1bef0 4 1139 87 +1bef4 2 728 6 +1bef6 1e 728 6 +1bf14 14 728 6 +1bf28 6 256 82 +1bf2e 8 277 82 +1bf36 4 1139 87 +1bf3a 2 277 82 +1bf3c 2 729 6 +1bf3e 1e 729 6 +1bf5c 14 729 6 +1bf70 6 729 6 +1bf76 8 729 6 +1bf7e 6 85 79 +1bf84 6 729 6 +1bf8a 6 156 137 +1bf90 a 256 82 +1bf9a 4 730 6 +1bf9e 6 545 65 +1bfa4 4 545 65 +1bfa8 6 730 6 +1bfae 2 730 6 +1bfb0 e 730 6 +1bfbe 8 730 6 +1bfc6 6 302 82 +1bfcc 12 730 6 +1bfde 6 730 6 +1bfe4 8 730 6 +1bfec 6 85 79 +1bff2 8 730 6 +1bffa 6 256 82 +1c000 6 732 6 +1c006 6 277 82 +1c00c 2 1139 87 +1c00e 4 277 82 +1c012 6 1139 87 +1c018 2 733 6 +1c01a 16 733 6 +1c030 14 733 6 +1c044 6 733 6 +1c04a 8 733 6 +1c052 6 85 79 +1c058 4 733 6 +1c05c 6 256 82 +1c062 8 736 6 +1c06a 2 1139 87 +1c06c 2 277 82 +1c06e 4 1139 87 +1c072 2 736 6 +1c074 16 736 6 +1c08a 12 736 6 +1c09c 6 256 82 +1c0a2 e 739 6 +1c0b0 6 277 82 +1c0b6 2 1139 87 +1c0b8 4 277 82 +1c0bc 2 1139 87 +1c0be 2 740 6 +1c0c0 16 740 6 +1c0d6 14 740 6 +1c0ea 6 740 6 +1c0f0 8 740 6 +1c0f8 6 85 79 +1c0fe 6 740 6 +1c104 4 156 137 +1c108 6 256 82 +1c10e c 743 6 +1c11a 4 1512 82 +1c11e 2 743 6 +1c120 e 1512 82 +1c12e 4 743 6 +1c132 6 302 82 +1c138 12 743 6 +1c14a 6 743 6 +1c150 8 743 6 +1c158 6 85 79 +1c15e 6 743 6 +1c164 6 256 82 +1c16a 6 744 6 +1c170 6 277 82 +1c176 4 1139 87 +1c17a 4 277 82 +1c17e 6 1139 87 +1c184 2 745 6 +1c186 16 745 6 +1c19c 14 745 6 +1c1b0 6 745 6 +1c1b6 8 745 6 +1c1be 6 85 79 +1c1c4 6 745 6 +1c1ca 6 156 137 +1c1d0 14 256 82 +1c1e4 a 748 6 +1c1ee 10 749 6 +1c1fe 2 277 82 +1c200 4 1139 87 +1c204 2 749 6 +1c206 18 749 6 +1c21e 14 749 6 +1c232 6 749 6 +1c238 8 749 6 +1c240 6 85 79 +1c246 6 749 6 +1c24c 6 156 137 +1c252 6 256 82 +1c258 12 750 6 +1c26a 2 1139 87 +1c26c 2 750 6 +1c26e 2 277 82 +1c270 2 1139 87 +1c272 2 750 6 +1c274 18 750 6 +1c28c 14 750 6 +1c2a0 6 750 6 +1c2a6 8 751 6 +1c2ae 6 85 79 +1c2b4 6 750 6 +1c2ba 6 156 137 +1c2c0 6 256 82 +1c2c6 8 753 6 +1c2ce 6 753 6 +1c2d4 10 156 137 +1c2e4 fc 754 6 +FUNC 1c3e0 458 0 ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test::TestBody +1c3e0 a 760 6 +1c3ea 6 760 6 +1c3f0 4 761 6 +1c3f4 4 760 6 +1c3f8 2 761 6 +1c3fa 2 763 6 +1c3fc 2 760 6 +1c3fe 4 761 6 +1c402 a 763 6 +1c40c 4 763 6 +1c410 4 763 6 +1c414 2 763 6 +1c416 6 763 6 +1c41c e 763 6 +1c42a c 763 6 +1c436 6 302 82 +1c43c 12 763 6 +1c44e 6 763 6 +1c454 8 763 6 +1c45c 6 85 79 +1c462 6 763 6 +1c468 e 256 82 +1c476 4 765 6 +1c47a 4 766 6 +1c47e 4 770 6 +1c482 6 767 6 +1c488 8 770 6 +1c490 1e 770 6 +1c4ae 6 770 6 +1c4b4 2 774 6 +1c4b6 6 774 6 +1c4bc 6 776 6 +1c4c2 6 778 6 +1c4c8 6 778 6 +1c4ce 4 778 6 +1c4d2 2 778 6 +1c4d4 8 778 6 +1c4dc 6 778 6 +1c4e2 4 780 6 +1c4e6 4 778 6 +1c4ea 8 780 6 +1c4f2 c 781 6 +1c4fe 16 778 6 +1c514 6 778 6 +1c51a 8 778 6 +1c522 6 85 79 +1c528 6 778 6 +1c52e 2 778 6 +1c530 6 781 6 +1c536 4 781 6 +1c53a 2 781 6 +1c53c 8 781 6 +1c544 c 781 6 +1c550 4 781 6 +1c554 4 784 6 +1c558 4 784 6 +1c55c 4 784 6 +1c560 8 1552 82 +1c568 2 784 6 +1c56a e 1552 82 +1c578 6 784 6 +1c57e 6 302 82 +1c584 14 784 6 +1c598 16 781 6 +1c5ae 6 781 6 +1c5b4 8 781 6 +1c5bc 6 85 79 +1c5c2 6 781 6 +1c5c8 2 781 6 +1c5ca 6 256 82 +1c5d0 18 785 6 +1c5e8 6 302 82 +1c5ee 12 785 6 +1c600 6 785 6 +1c606 8 785 6 +1c60e 6 85 79 +1c614 6 785 6 +1c61a 8 256 82 +1c622 4 791 6 +1c626 6 256 82 +1c62c 8 791 6 +1c634 6 792 6 +1c63a 4 1139 87 +1c63e 2 277 82 +1c640 2 792 6 +1c642 1a 792 6 +1c65c 12 792 6 +1c66e 6 256 82 +1c674 8 794 6 +1c67c 6 795 6 +1c682 2 277 82 +1c684 2 795 6 +1c686 6 277 82 +1c68c 4 1139 87 +1c690 2 277 82 +1c692 2 796 6 +1c694 1a 796 6 +1c6ae 12 796 6 +1c6c0 6 256 82 +1c6c6 8 277 82 +1c6ce 4 1139 87 +1c6d2 2 277 82 +1c6d4 2 797 6 +1c6d6 1a 797 6 +1c6f0 14 797 6 +1c704 6 797 6 +1c70a 8 797 6 +1c712 6 85 79 +1c718 6 797 6 +1c71e 6 156 137 +1c724 a 256 82 +1c72e 4 798 6 +1c732 6 545 65 +1c738 4 545 65 +1c73c 6 1512 82 +1c742 2 798 6 +1c744 e 1512 82 +1c752 4 798 6 +1c756 6 302 82 +1c75c 12 798 6 +1c76e 6 798 6 +1c774 8 798 6 +1c77c 6 85 79 +1c782 6 798 6 +1c788 e 256 82 +1c796 c 800 6 +1c7a2 c 156 137 +1c7ae 8a 801 6 +FUNC 1c838 690 0 ExceptionHandlerTest_ModuleInfo_Test::TestBody +1c838 c 806 6 +1c844 6 806 6 +1c84a 2 809 6 +1c84c 2 806 6 +1c84e 2 814 6 +1c850 4 809 6 +1c854 6 814 6 +1c85a 4 809 6 +1c85e 2 814 6 +1c860 4 809 6 +1c864 16 814 6 +1c87a 8 818 6 +1c882 4 819 6 +1c886 4 818 6 +1c88a e 819 6 +1c898 4 440 135 +1c89c 6 162 104 +1c8a2 4 164 104 +1c8a6 6 165 104 +1c8ac 6 168 104 +1c8b2 4 166 104 +1c8b6 6 171 104 +1c8bc 4 169 104 +1c8c0 6 174 104 +1c8c6 6 172 104 +1c8cc 4 164 104 +1c8d0 4 178 104 +1c8d4 2 164 104 +1c8d6 c 178 104 +1c8e2 6 180 104 +1c8e8 2 181 104 +1c8ea 6 183 104 +1c8f0 2 184 104 +1c8f2 c 186 104 +1c8fe 4 190 104 +1c902 2 183 104 +1c904 4 447 135 +1c908 4 447 135 +1c90c 4 822 6 +1c910 4 400 136 +1c914 4 789 136 +1c918 a 604 135 +1c922 8 791 136 +1c92a c 791 136 +1c936 6 836 6 +1c93c e 530 136 +1c94a 14 836 6 +1c95e 8 837 6 +1c966 6 277 82 +1c96c 2 1139 87 +1c96e 8 277 82 +1c976 2 838 6 +1c978 1c 838 6 +1c994 a 838 6 +1c99e 2 838 6 +1c9a0 e 838 6 +1c9ae 6 838 6 +1c9b4 8 838 6 +1c9bc 6 85 79 +1c9c2 6 838 6 +1c9c8 6 156 137 +1c9ce 8 256 82 +1c9d6 2 840 6 +1c9d8 6 256 82 +1c9de 6 840 6 +1c9e4 a 842 6 +1c9ee 18 842 6 +1ca06 6 842 6 +1ca0c e 849 6 +1ca1a 16 849 6 +1ca30 6 156 137 +1ca36 6 850 6 +1ca3c 2 1139 87 +1ca3e 2 277 82 +1ca40 2 850 6 +1ca42 1c 850 6 +1ca5e 8 850 6 +1ca66 2 850 6 +1ca68 e 850 6 +1ca76 6 850 6 +1ca7c 8 850 6 +1ca84 6 85 79 +1ca8a 6 850 6 +1ca90 6 156 137 +1ca96 e 256 82 +1caa4 4 855 6 +1caa8 a 855 6 +1cab2 8 855 6 +1caba 6 156 137 +1cac0 8 856 6 +1cac8 2 277 82 +1caca 2 1139 87 +1cacc 2 856 6 +1cace 16 856 6 +1cae4 14 856 6 +1caf8 6 256 82 +1cafe 6 858 6 +1cb04 a 277 82 +1cb0e 2 1139 87 +1cb10 2 859 6 +1cb12 16 859 6 +1cb28 14 859 6 +1cb3c 6 256 82 +1cb42 10 861 6 +1cb52 a 277 82 +1cb5c 2 1139 87 +1cb5e 2 862 6 +1cb60 16 862 6 +1cb76 16 862 6 +1cb8c 6 862 6 +1cb92 8 862 6 +1cb9a 6 85 79 +1cba0 6 862 6 +1cba6 6 156 137 +1cbac 14 256 82 +1cbc0 a 864 6 +1cbca 2 1512 82 +1cbcc 4 864 6 +1cbd0 10 1512 82 +1cbe0 4 864 6 +1cbe4 6 302 82 +1cbea 14 864 6 +1cbfe 6 864 6 +1cc04 8 864 6 +1cc0c 6 85 79 +1cc12 6 864 6 +1cc18 a 256 82 +1cc22 a 865 6 +1cc2c 2 1512 82 +1cc2e 4 865 6 +1cc32 2 1512 82 +1cc34 2 256 82 +1cc36 e 1512 82 +1cc44 4 865 6 +1cc48 6 302 82 +1cc4e 16 865 6 +1cc64 6 865 6 +1cc6a 8 865 6 +1cc72 6 85 79 +1cc78 6 865 6 +1cc7e 6 256 82 +1cc84 10 866 6 +1cc94 4 400 136 +1cc98 6 315 139 +1cc9e 8 226 145 +1cca6 4 315 139 +1ccaa 6 1482 82 +1ccb0 6 156 137 +1ccb6 4 866 6 +1ccba 6 302 82 +1ccc0 c 866 6 +1cccc 2 866 6 +1ccce 8 866 6 +1ccd6 6 866 6 +1ccdc 8 866 6 +1cce4 6 85 79 +1ccea 6 866 6 +1ccf0 a 256 82 +1ccfa c 867 6 +1cd06 16 1512 82 +1cd1c 6 156 137 +1cd22 4 867 6 +1cd26 6 302 82 +1cd2c c 867 6 +1cd38 2 867 6 +1cd3a 8 867 6 +1cd42 6 867 6 +1cd48 8 867 6 +1cd50 6 85 79 +1cd56 6 867 6 +1cd5c 6 256 82 +1cd62 8 869 6 +1cd6a 6 869 6 +1cd70 6 842 6 +1cd76 6 869 6 +1cd7c 16 156 137 +1cd92 e 870 6 +1cda0 8 884 80 +1cda8 6 711 80 +1cdae 4 469 80 +1cdb2 8 711 80 +1cdba 8 469 80 +1cdc2 4 75 132 +1cdc6 6 156 137 +1cdcc 8 75 132 +1cdd4 6 886 80 +1cdda 8 884 80 +1cde2 4 469 80 +1cde6 4 75 132 +1cdea 4 469 80 +1cdee 8 75 132 +1cdf6 6 886 80 +1cdfc 18 1471 82 +1ce14 e 156 137 +1ce22 a6 870 6 +FUNC 1cec8 2dc 0 ExceptionHandlerTest_WriteMinidumpExceptionStream_Test::TestBody +1cec8 8 1000 6 +1ced0 4 1000 6 +1ced4 4 1001 6 +1ced8 2 1000 6 +1ceda 2 1003 6 +1cedc 2 1001 6 +1cede 2 1000 6 +1cee0 4 1001 6 +1cee4 8 1003 6 +1ceec 22 1003 6 +1cf0e 6 1003 6 +1cf14 6 1004 6 +1cf1a 6 277 82 +1cf20 8 1139 87 +1cf28 2 1004 6 +1cf2a 16 1004 6 +1cf40 16 1004 6 +1cf56 6 1004 6 +1cf5c 8 1004 6 +1cf64 6 85 79 +1cf6a 6 1004 6 +1cf70 6 156 137 +1cf76 e 256 82 +1cf84 e 1006 6 +1cf92 8 1009 6 +1cf9a 6 1010 6 +1cfa0 4 1139 87 +1cfa4 2 277 82 +1cfa6 2 1010 6 +1cfa8 1a 1010 6 +1cfc2 14 1010 6 +1cfd6 6 256 82 +1cfdc 6 1011 6 +1cfe2 a 277 82 +1cfec 4 1139 87 +1cff0 2 1012 6 +1cff2 1a 1012 6 +1d00c 16 1012 6 +1d022 6 1012 6 +1d028 8 1012 6 +1d030 6 85 79 +1d036 6 1012 6 +1d03c 6 156 137 +1d042 a 256 82 +1d04c 6 600 65 +1d052 6 600 65 +1d058 2 600 65 +1d05a 8 277 82 +1d062 2 1139 87 +1d064 2 277 82 +1d066 2 1139 87 +1d068 2 1014 6 +1d06a 18 1014 6 +1d082 16 1014 6 +1d098 6 1014 6 +1d09e 8 1014 6 +1d0a6 6 85 79 +1d0ac 6 1014 6 +1d0b2 6 156 137 +1d0b8 c 256 82 +1d0c4 4 156 137 +1d0c8 6 256 82 +1d0ce 4 1015 6 +1d0d2 4 1512 82 +1d0d6 6 1015 6 +1d0dc e 1512 82 +1d0ea 4 1015 6 +1d0ee 6 302 82 +1d0f4 14 1015 6 +1d108 6 1015 6 +1d10e 8 1016 6 +1d116 6 85 79 +1d11c 6 1015 6 +1d122 6 256 82 +1d128 6 1009 6 +1d12e 12 156 137 +1d140 64 1017 6 +FUNC 1d1a4 468 0 ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test::TestBody +1d1a4 a 1036 6 +1d1ae 6 1036 6 +1d1b4 4 1039 6 +1d1b8 2 1036 6 +1d1ba a 1037 6 +1d1c4 8 1039 6 +1d1cc 22 1039 6 +1d1ee 6 1039 6 +1d1f4 6 1040 6 +1d1fa 4 277 82 +1d1fe a 1139 87 +1d208 2 1040 6 +1d20a 16 1040 6 +1d220 4 1040 6 +1d224 2 1040 6 +1d226 10 1040 6 +1d236 6 1040 6 +1d23c 8 1040 6 +1d244 6 85 79 +1d24a 6 1040 6 +1d250 8 156 137 +1d258 6 256 82 +1d25e 4 1044 6 +1d262 4 1044 6 +1d266 4 1044 6 +1d26a 6 1552 82 +1d270 2 1044 6 +1d272 2 1552 82 +1d274 2 1044 6 +1d276 e 1552 82 +1d284 4 1044 6 +1d288 6 302 82 +1d28e 12 1044 6 +1d2a0 6 1044 6 +1d2a6 8 1044 6 +1d2ae 6 85 79 +1d2b4 6 1044 6 +1d2ba e 256 82 +1d2c8 1e 1045 6 +1d2e6 6 302 82 +1d2ec 10 1045 6 +1d2fc 4 1046 6 +1d300 6 256 82 +1d306 a 1046 6 +1d310 c 1048 6 +1d31c 6 1049 6 +1d322 4 1139 87 +1d326 2 277 82 +1d328 2 1049 6 +1d32a 1a 1049 6 +1d344 14 1049 6 +1d358 6 256 82 +1d35e 6 1050 6 +1d364 6 1053 6 +1d36a 4 1139 87 +1d36e 2 277 82 +1d370 2 1053 6 +1d372 1a 1053 6 +1d38c 16 1053 6 +1d3a2 6 1053 6 +1d3a8 8 1053 6 +1d3b0 6 85 79 +1d3b6 6 1053 6 +1d3bc 6 156 137 +1d3c2 e 256 82 +1d3d0 4 1055 6 +1d3d4 4 1055 6 +1d3d8 4 1055 6 +1d3dc 2 1552 82 +1d3de 2 1055 6 +1d3e0 e 1552 82 +1d3ee 4 1055 6 +1d3f2 6 302 82 +1d3f8 10 1055 6 +1d408 6 256 82 +1d40e 16 1056 6 +1d424 6 302 82 +1d42a 12 1056 6 +1d43c 6 1056 6 +1d442 8 1056 6 +1d44a 6 85 79 +1d450 8 1056 6 +1d458 4 1057 6 +1d45c 6 256 82 +1d462 4 1059 6 +1d466 a 1057 6 +1d470 8 1059 6 +1d478 6 1060 6 +1d47e 4 1139 87 +1d482 2 277 82 +1d484 2 1060 6 +1d486 1a 1060 6 +1d4a0 16 1060 6 +1d4b6 6 1060 6 +1d4bc 8 1060 6 +1d4c4 6 85 79 +1d4ca 6 1060 6 +1d4d0 8 156 137 +1d4d8 6 256 82 +1d4de 6 1061 6 +1d4e4 18 1064 6 +1d4fc 4 1064 6 +1d500 6 302 82 +1d506 12 1064 6 +1d518 6 1064 6 +1d51e 8 1064 6 +1d526 6 85 79 +1d52c 6 1064 6 +1d532 c 256 82 +1d53e 8 156 137 +1d546 6 256 82 +1d54c 6 1059 6 +1d552 6 156 137 +1d558 6 1048 6 +1d55e 6 156 137 +1d564 6 1039 6 +1d56a a 1064 6 +1d574 12 156 137 +1d586 86 1065 6 +FUNC 1d60c 370 0 ExceptionHandlerTest_AdditionalMemory_Test::TestBody +1d60c 8 1068 6 +1d614 6 1068 6 +1d61a 2 1069 6 +1d61c 2 1068 6 +1d61e c 1069 6 +1d62a 4 1072 6 +1d62e 6 1073 6 +1d634 6 277 82 +1d63a 8 1139 87 +1d642 2 1072 6 +1d644 2 1073 6 +1d646 6 256 82 +1d64c 8 1077 6 +1d654 8 1077 6 +1d65c c 1078 6 +1d668 2 1081 6 +1d66a 4 1083 6 +1d66e 6 1081 6 +1d674 8 1083 6 +1d67c 20 1083 6 +1d69c 6 1083 6 +1d6a2 c 1086 6 +1d6ae 4 1092 6 +1d6b2 2 1087 6 +1d6b4 2 1092 6 +1d6b6 4 1087 6 +1d6ba a 1092 6 +1d6c4 8 1092 6 +1d6cc 6 156 137 +1d6d2 8 1093 6 +1d6da 4 277 82 +1d6de 6 1139 87 +1d6e4 2 1093 6 +1d6e6 16 1093 6 +1d6fc 12 1093 6 +1d70e 6 256 82 +1d714 6 1095 6 +1d71a c 277 82 +1d726 4 1139 87 +1d72a 2 1096 6 +1d72c 16 1096 6 +1d742 12 1096 6 +1d754 6 256 82 +1d75a 10 1098 6 +1d76a c 277 82 +1d776 4 1139 87 +1d77a 2 1099 6 +1d77c 16 1099 6 +1d792 14 1099 6 +1d7a6 6 1099 6 +1d7ac 8 1099 6 +1d7b4 6 85 79 +1d7ba 6 1099 6 +1d7c0 6 156 137 +1d7c6 e 256 82 +1d7d4 a 1101 6 +1d7de 2 1512 82 +1d7e0 4 1101 6 +1d7e4 10 1512 82 +1d7f4 6 1101 6 +1d7fa 6 302 82 +1d800 12 1101 6 +1d812 6 1101 6 +1d818 8 1101 6 +1d820 6 85 79 +1d826 6 1101 6 +1d82c 6 256 82 +1d832 a 1102 6 +1d83c 4 1512 82 +1d840 4 1102 6 +1d844 e 1512 82 +1d852 6 1102 6 +1d858 6 302 82 +1d85e 12 1102 6 +1d870 6 1102 6 +1d876 8 1102 6 +1d87e 6 85 79 +1d884 6 1102 6 +1d88a 6 256 82 +1d890 a 1105 6 +1d89a a 1105 6 +1d8a4 4 1552 82 +1d8a8 4 1105 6 +1d8ac e 1552 82 +1d8ba 6 1105 6 +1d8c0 6 302 82 +1d8c6 12 1105 6 +1d8d8 6 1105 6 +1d8de 8 1105 6 +1d8e6 6 85 79 +1d8ec 6 1105 6 +1d8f2 6 256 82 +1d8f8 18 1107 6 +1d910 6c 1108 6 +FUNC 1d97c 22c 0 ExceptionHandlerTest_AdditionalMemoryRemove_Test::TestBody +1d97c a 1112 6 +1d986 a 1112 6 +1d990 2 1113 6 +1d992 2 1112 6 +1d994 6 1113 6 +1d99a 4 1116 6 +1d99e 2 1139 87 +1d9a0 2 277 82 +1d9a2 4 256 82 +1d9a6 2 1116 6 +1d9a8 4 1120 6 +1d9ac 2 256 82 +1d9ae 2 1122 6 +1d9b0 4 277 82 +1d9b4 2 1139 87 +1d9b6 4 256 82 +1d9ba 6 1120 6 +1d9c0 8 1122 6 +1d9c8 1a 1122 6 +1d9e2 6 1122 6 +1d9e8 a 1125 6 +1d9f2 8 1128 6 +1d9fa 2 1134 6 +1d9fc 4 256 82 +1da00 6 1129 6 +1da06 a 1134 6 +1da10 8 1134 6 +1da18 6 156 137 +1da1e 6 1135 6 +1da24 2 1139 87 +1da26 8 277 82 +1da2e 2 1135 6 +1da30 16 1135 6 +1da46 14 1135 6 +1da5a 6 256 82 +1da60 6 1137 6 +1da66 c 277 82 +1da72 2 1139 87 +1da74 2 1138 6 +1da76 16 1138 6 +1da8c 12 1138 6 +1da9e 4 1138 6 +1daa2 4 1138 6 +1daa6 6 1138 6 +1daac 8 1138 6 +1dab4 6 85 79 +1daba 6 1138 6 +1dac0 6 156 137 +1dac6 e 256 82 +1dad4 e 1140 6 +1dae2 6 1141 6 +1dae8 4 277 82 +1daec 2 1139 87 +1daee 2 1141 6 +1daf0 16 1141 6 +1db06 a 1141 6 +1db10 4 1141 6 +1db14 c 1141 6 +1db20 6 1141 6 +1db26 8 1141 6 +1db2e 6 85 79 +1db34 6 1141 6 +1db3a 6 156 137 +1db40 6 256 82 +1db46 18 1143 6 +1db5e 4a 1144 6 +FUNC 1dba8 41c 0 ExceptionHandlerTest_WriteMinidumpForChild_Test::TestBody +1dba8 8 1154 6 +1dbb0 6 1154 6 +1dbb6 2 1156 6 +1dbb8 2 1154 6 +1dbba a 1156 6 +1dbc4 a 1156 6 +1dbce 2 1156 6 +1dbd0 e 1156 6 +1dbde a 1156 6 +1dbe8 6 302 82 +1dbee 12 1156 6 +1dc00 6 1156 6 +1dc06 8 1156 6 +1dc0e 6 85 79 +1dc14 6 1156 6 +1dc1a e 256 82 +1dc28 6 1158 6 +1dc2e 2 1159 6 +1dc30 6 1160 6 +1dc36 e 1162 6 +1dc44 4 1162 6 +1dc48 6 1162 6 +1dc4e 6 1163 6 +1dc54 6 1164 6 +1dc5a 4 1168 6 +1dc5e 6 1166 6 +1dc64 4 1169 6 +1dc68 6 1168 6 +1dc6e 8 1169 6 +1dc76 12 1170 6 +1dc88 4 1139 87 +1dc8c 4 277 82 +1dc90 8 1139 87 +1dc98 2 1170 6 +1dc9a 16 1170 6 +1dcb0 14 1170 6 +1dcc4 6 1170 6 +1dcca 8 1170 6 +1dcd2 6 85 79 +1dcd8 6 1170 6 +1dcde 6 156 137 +1dce4 e 256 82 +1dcf2 8 1175 6 +1dcfa 6 1176 6 +1dd00 4 1139 87 +1dd04 4 277 82 +1dd08 2 1176 6 +1dd0a 1a 1176 6 +1dd24 12 1176 6 +1dd36 6 256 82 +1dd3c 6 1178 6 +1dd42 c 277 82 +1dd4e 4 1139 87 +1dd52 2 1179 6 +1dd54 18 1179 6 +1dd6c 8 1179 6 +1dd74 2 1179 6 +1dd76 c 1179 6 +1dd82 6 1179 6 +1dd88 8 1179 6 +1dd90 6 85 79 +1dd96 6 1179 6 +1dd9c 4 156 137 +1dda0 6 256 82 +1dda6 8 1181 6 +1ddae 4 1139 87 +1ddb2 4 277 82 +1ddb6 2 1181 6 +1ddb8 1a 1181 6 +1ddd2 12 1181 6 +1dde4 6 256 82 +1ddea 2 1182 6 +1ddec 4 1512 82 +1ddf0 2 1182 6 +1ddf2 e 1512 82 +1de00 6 1182 6 +1de06 6 302 82 +1de0c 12 1182 6 +1de1e 6 1182 6 +1de24 8 1182 6 +1de2c 6 85 79 +1de32 6 1182 6 +1de38 6 256 82 +1de3e 6 600 65 +1de44 6 600 65 +1de4a 2 600 65 +1de4c 8 277 82 +1de54 2 1139 87 +1de56 4 277 82 +1de5a 2 1139 87 +1de5c 2 1185 6 +1de5e 1a 1185 6 +1de78 14 1185 6 +1de8c 6 1185 6 +1de92 8 1185 6 +1de9a 6 85 79 +1dea0 6 1185 6 +1dea6 6 156 137 +1deac e 256 82 +1deba 4 1186 6 +1debe 4 1512 82 +1dec2 6 1186 6 +1dec8 e 1512 82 +1ded6 6 1186 6 +1dedc 6 302 82 +1dee2 12 1186 6 +1def4 6 1186 6 +1defa 8 1187 6 +1df02 6 85 79 +1df08 6 1186 6 +1df0e 6 256 82 +1df14 6 1189 6 +1df1a c 1190 6 +1df26 c 156 137 +1df32 92 1191 6 +FUNC 1dfc4 20 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MicrodumpWriterTest_Setup_Test>::CreateTest +1dfc4 2 486 85 +1dfc6 8 486 85 +1dfce 6 56 11 +1dfd4 2 486 85 +1dfd6 6 56 11 +1dfdc 8 486 85 +FUNC 1dfe4 18 0 MicrodumpWriterTest_Setup_Test::~MicrodumpWriterTest_Setup_Test +1dfe4 2 56 11 +1dfe6 16 56 11 +FUNC 1dffc 12 0 MicrodumpWriterTest_Setup_Test::~MicrodumpWriterTest_Setup_Test +1dffc 2 56 11 +1dffe 6 56 11 +1e004 6 56 11 +1e00a 4 56 11 +FUNC 1e00e 10 0 std::__node_alloc::allocate +1e00e 6 158 106 +1e014 6 134 124 +1e01a 4 158 106 +FUNC 1e020 6c 0 testing::PrintToString +1e020 e 883 80 +1e02e 2 883 80 +1e030 4 884 80 +1e034 2 883 80 +1e036 4 884 80 +1e03a 2 883 80 +1e03c 8 884 80 +1e044 2 310 80 +1e046 c 333 127 +1e052 6 318 80 +1e058 8 291 126 +1e060 8 75 132 +1e068 6 886 80 +1e06e 1e 887 80 +FUNC 1e08c 108 0 testing::internal::CmpHelperNE +1e08c e 1615 82 +1e09a 12 1615 82 +1e0ac 4 1615 82 +1e0b0 4 1615 82 +1e0b4 10 1583 82 +1e0c4 a 1583 82 +1e0ce 6 1583 82 +1e0d4 2 1583 82 +1e0d6 2 1407 82 +1e0d8 6 1583 82 +1e0de 6 1583 82 +1e0e4 8 1583 82 +1e0ec 6 1583 82 +1e0f2 a 1584 82 +1e0fc e 1407 82 +1e10a a 1584 82 +1e114 6 306 82 +1e11a c 333 127 +1e126 8 306 82 +1e12e 6 85 79 +1e134 e 1407 82 +1e142 a 1585 82 +1e14c 6 1585 82 +1e152 c 156 137 +1e15e 6 256 82 +1e164 30 1615 82 +FUNC 1e194 6e4 0 MicrodumpWriterTest_Setup_Test::TestBody +1e194 c 56 11 +1e1a0 6 56 11 +1e1a6 4 58 11 +1e1aa 4 56 11 +1e1ae e 58 11 +1e1bc 8 58 11 +1e1c4 2 58 11 +1e1c6 4 58 11 +1e1ca 2 58 11 +1e1cc e 58 11 +1e1da 8 58 11 +1e1e2 2 1144 87 +1e1e4 6 298 82 +1e1ea 6 298 82 +1e1f0 12 58 11 +1e202 6 58 11 +1e208 8 58 11 +1e210 6 85 79 +1e216 6 58 11 +1e21c 8 256 82 +1e224 4 60 11 +1e228 6 256 82 +1e22e 6 60 11 +1e234 12 61 11 +1e246 e 62 11 +1e254 a 63 11 +1e25e 4 62 11 +1e262 12 63 11 +1e274 2 1144 87 +1e276 6 298 82 +1e27c 6 298 82 +1e282 8 63 11 +1e28a 2 63 11 +1e28c a 63 11 +1e296 6 63 11 +1e29c 8 63 11 +1e2a4 4 85 79 +1e2a8 6 256 82 +1e2ae 6 65 11 +1e2b4 4 66 11 +1e2b8 8 67 11 +1e2c0 10 69 11 +1e2d0 4 69 11 +1e2d4 6 69 11 +1e2da 8 70 11 +1e2e2 6 71 11 +1e2e8 8 73 11 +1e2f0 c 76 11 +1e2fc a 77 11 +1e306 2 1481 82 +1e308 2 77 11 +1e30a 2 1481 82 +1e30c 2 77 11 +1e30e 2 1481 82 +1e310 8 1482 82 +1e318 18 1382 82 +1e330 1c 1471 82 +1e34c c 156 137 +1e358 6 77 11 +1e35e 4 1144 87 +1e362 6 298 82 +1e368 6 298 82 +1e36e 12 77 11 +1e380 6 77 11 +1e386 8 77 11 +1e38e 6 85 79 +1e394 6 77 11 +1e39a e 256 82 +1e3a8 2 83 11 +1e3aa 4 80 11 +1e3ae 4 83 11 +1e3b2 2 88 11 +1e3b4 2 83 11 +1e3b6 1c 88 11 +1e3d2 2 93 11 +1e3d4 a 94 11 +1e3de 4 91 11 +1e3e2 4 92 11 +1e3e6 2 93 11 +1e3e8 4 94 11 +1e3ec a 188 121 +1e3f6 8 481 106 +1e3fe 4 91 11 +1e402 2 98 11 +1e404 4 481 106 +1e408 6 98 11 +1e40e 2 99 11 +1e410 4 211 121 +1e414 4 212 121 +1e418 6 98 11 +1e41e 8 99 11 +1e426 4 306 106 +1e42a 2 307 106 +1e42c 2 306 106 +1e42e 6 307 106 +1e434 4 119 108 +1e438 a 119 108 +1e442 4 427 121 +1e446 2 103 11 +1e448 2 429 121 +1e44a 4 428 121 +1e44e 2 430 121 +1e450 4 431 121 +1e454 4 103 11 +1e458 a 104 11 +1e462 4 103 11 +1e466 2 104 11 +1e468 4 103 11 +1e46c 1e 104 11 +1e48a 2 1144 87 +1e48c 6 298 82 +1e492 4 298 82 +1e496 10 104 11 +1e4a6 6 104 11 +1e4ac 8 104 11 +1e4b4 4 85 79 +1e4b8 6 256 82 +1e4be 12 105 11 +1e4d0 2 105 11 +1e4d2 2 105 11 +1e4d4 e 105 11 +1e4e2 4 105 11 +1e4e6 2 1144 87 +1e4e8 6 298 82 +1e4ee 4 298 82 +1e4f2 6 105 11 +1e4f8 2 105 11 +1e4fa a 105 11 +1e504 6 105 11 +1e50a 8 105 11 +1e512 6 85 79 +1e518 6 105 11 +1e51e e 256 82 +1e52c e 107 11 +1e53a 4 1139 87 +1e53e 2 277 82 +1e540 4 1139 87 +1e544 2 107 11 +1e546 1a 107 11 +1e560 14 107 11 +1e574 6 107 11 +1e57a 8 107 11 +1e582 6 85 79 +1e588 6 107 11 +1e58e 8 156 137 +1e596 6 256 82 +1e59c a 110 11 +1e5a6 8 111 11 +1e5ae 8 114 11 +1e5b6 c 115 11 +1e5c2 a 117 11 +1e5cc e 118 11 +1e5da 2 1623 82 +1e5dc 6 118 11 +1e5e2 2 1623 82 +1e5e4 8 1623 82 +1e5ec 1a 1623 82 +1e606 4 118 11 +1e60a 2 1144 87 +1e60c 6 298 82 +1e612 4 298 82 +1e616 6 118 11 +1e61c 2 118 11 +1e61e a 118 11 +1e628 6 118 11 +1e62e 8 118 11 +1e636 6 85 79 +1e63c 6 118 11 +1e642 4 256 82 +1e646 4 120 11 +1e64a 6 256 82 +1e650 6 120 11 +1e656 4 120 11 +1e65a 4 120 11 +1e65e 6 120 11 +1e664 2 120 11 +1e666 2 120 11 +1e668 2 120 11 +1e66a e 120 11 +1e678 4 120 11 +1e67c 2 1144 87 +1e67e 6 298 82 +1e684 4 298 82 +1e688 10 120 11 +1e698 6 120 11 +1e69e 8 120 11 +1e6a6 4 85 79 +1e6aa 6 256 82 +1e6b0 6 122 11 +1e6b6 4 122 11 +1e6ba 4 122 11 +1e6be 2 122 11 +1e6c0 2 122 11 +1e6c2 e 122 11 +1e6d0 4 122 11 +1e6d4 2 1144 87 +1e6d6 6 298 82 +1e6dc 4 298 82 +1e6e0 e 122 11 +1e6ee 6 256 82 +1e6f4 6 124 11 +1e6fa 4 124 11 +1e6fe 4 124 11 +1e702 2 124 11 +1e704 2 124 11 +1e706 e 124 11 +1e714 4 124 11 +1e718 2 1144 87 +1e71a 6 298 82 +1e720 4 298 82 +1e724 c 124 11 +1e730 2 124 11 +1e732 4 124 11 +1e736 6 124 11 +1e73c 8 124 11 +1e744 6 85 79 +1e74a 6 124 11 +1e750 6 256 82 +1e756 8 203 57 +1e75e 6 256 82 +1e764 6 128 11 +1e76a 6 129 11 +1e770 2 67 120 +1e772 6 203 57 +1e778 2 67 120 +1e77a 4 68 120 +1e77e 2 74 120 +1e780 8 135 124 +1e788 4 67 120 +1e78c 4 68 120 +1e790 2 74 120 +1e792 8 135 124 +1e79a 2 61 63 +1e79c 6 156 137 +1e7a2 8 61 63 +1e7aa 6 156 137 +1e7b0 c8 130 11 +FUNC 1e878 18 0 CpuSetTest_EmptyIntersection_Test::~CpuSetTest_EmptyIntersection_Test +1e878 2 146 13 +1e87a 16 146 13 +FUNC 1e890 12 0 CpuSetTest_EmptyIntersection_Test::~CpuSetTest_EmptyIntersection_Test +1e890 2 146 13 +1e892 6 146 13 +1e898 6 146 13 +1e89e 4 146 13 +FUNC 1e8a4 18 0 CpuSetTest_SelfIntersection_Test::~CpuSetTest_SelfIntersection_Test +1e8a4 2 135 13 +1e8a6 16 135 13 +FUNC 1e8bc 12 0 CpuSetTest_SelfIntersection_Test::~CpuSetTest_SelfIntersection_Test +1e8bc 2 135 13 +1e8be 6 135 13 +1e8c4 6 135 13 +1e8ca 4 135 13 +FUNC 1e8d0 18 0 CpuSetTest_IntersectWith_Test::~CpuSetTest_IntersectWith_Test +1e8d0 2 117 13 +1e8d2 16 117 13 +FUNC 1e8e8 12 0 CpuSetTest_IntersectWith_Test::~CpuSetTest_IntersectWith_Test +1e8e8 2 117 13 +1e8ea 6 117 13 +1e8f0 6 117 13 +1e8f6 4 117 13 +FUNC 1e8fc 18 0 CpuSetTest_MultiItems_Test::~CpuSetTest_MultiItems_Test +1e8fc 2 108 13 +1e8fe 16 108 13 +FUNC 1e914 12 0 CpuSetTest_MultiItems_Test::~CpuSetTest_MultiItems_Test +1e914 2 108 13 +1e916 6 108 13 +1e91c 6 108 13 +1e922 4 108 13 +FUNC 1e928 18 0 CpuSetTest_TenCpusWithRange_Test::~CpuSetTest_TenCpusWithRange_Test +1e928 2 99 13 +1e92a 16 99 13 +FUNC 1e940 12 0 CpuSetTest_TenCpusWithRange_Test::~CpuSetTest_TenCpusWithRange_Test +1e940 2 99 13 +1e942 6 99 13 +1e948 6 99 13 +1e94e 4 99 13 +FUNC 1e954 18 0 CpuSetTest_TwoCpusWithRange_Test::~CpuSetTest_TwoCpusWithRange_Test +1e954 2 90 13 +1e956 16 90 13 +FUNC 1e96c 12 0 CpuSetTest_TwoCpusWithRange_Test::~CpuSetTest_TwoCpusWithRange_Test +1e96c 2 90 13 +1e96e 6 90 13 +1e974 6 90 13 +1e97a 4 90 13 +FUNC 1e980 18 0 CpuSetTest_TwoCpusWithComma_Test::~CpuSetTest_TwoCpusWithComma_Test +1e980 2 81 13 +1e982 16 81 13 +FUNC 1e998 12 0 CpuSetTest_TwoCpusWithComma_Test::~CpuSetTest_TwoCpusWithComma_Test +1e998 2 81 13 +1e99a 6 81 13 +1e9a0 6 81 13 +1e9a6 4 81 13 +FUNC 1e9ac 18 0 CpuSetTest_OneCpuTerminated_Test::~CpuSetTest_OneCpuTerminated_Test +1e9ac 2 72 13 +1e9ae 16 72 13 +FUNC 1e9c4 12 0 CpuSetTest_OneCpuTerminated_Test::~CpuSetTest_OneCpuTerminated_Test +1e9c4 2 72 13 +1e9c6 6 72 13 +1e9cc 6 72 13 +1e9d2 4 72 13 +FUNC 1e9d8 18 0 CpuSetTest_OneCpu_Test::~CpuSetTest_OneCpu_Test +1e9d8 2 63 13 +1e9da 16 63 13 +FUNC 1e9f0 12 0 CpuSetTest_OneCpu_Test::~CpuSetTest_OneCpu_Test +1e9f0 2 63 13 +1e9f2 6 63 13 +1e9f8 6 63 13 +1e9fe 4 63 13 +FUNC 1ea04 18 0 CpuSetTest_EmptyCount_Test::~CpuSetTest_EmptyCount_Test +1ea04 2 58 13 +1ea06 16 58 13 +FUNC 1ea1c 12 0 CpuSetTest_EmptyCount_Test::~CpuSetTest_EmptyCount_Test +1ea1c 2 58 13 +1ea1e 6 58 13 +1ea24 6 58 13 +1ea2a 4 58 13 +FUNC 1ea30 20 0 testing::internal::TestFactoryImpl::CreateTest +1ea30 2 486 85 +1ea32 8 486 85 +1ea3a 6 117 13 +1ea40 2 486 85 +1ea42 6 117 13 +1ea48 8 486 85 +FUNC 1ea50 20 0 testing::internal::TestFactoryImpl::CreateTest +1ea50 2 486 85 +1ea52 8 486 85 +1ea5a 6 146 13 +1ea60 2 486 85 +1ea62 6 146 13 +1ea68 8 486 85 +FUNC 1ea70 20 0 testing::internal::TestFactoryImpl::CreateTest +1ea70 2 486 85 +1ea72 8 486 85 +1ea7a 6 135 13 +1ea80 2 486 85 +1ea82 6 135 13 +1ea88 8 486 85 +FUNC 1ea90 20 0 testing::internal::TestFactoryImpl::CreateTest +1ea90 2 486 85 +1ea92 8 486 85 +1ea9a 6 81 13 +1eaa0 2 486 85 +1eaa2 6 81 13 +1eaa8 8 486 85 +FUNC 1eab0 20 0 testing::internal::TestFactoryImpl::CreateTest +1eab0 2 486 85 +1eab2 8 486 85 +1eaba 6 72 13 +1eac0 2 486 85 +1eac2 6 72 13 +1eac8 8 486 85 +FUNC 1ead0 20 0 testing::internal::TestFactoryImpl::CreateTest +1ead0 2 486 85 +1ead2 8 486 85 +1eada 6 63 13 +1eae0 2 486 85 +1eae2 6 63 13 +1eae8 8 486 85 +FUNC 1eaf0 20 0 testing::internal::TestFactoryImpl::CreateTest +1eaf0 2 486 85 +1eaf2 8 486 85 +1eafa 6 58 13 +1eb00 2 486 85 +1eb02 6 58 13 +1eb08 8 486 85 +FUNC 1eb10 20 0 testing::internal::TestFactoryImpl::CreateTest +1eb10 2 486 85 +1eb12 8 486 85 +1eb1a 6 99 13 +1eb20 2 486 85 +1eb22 6 99 13 +1eb28 8 486 85 +FUNC 1eb30 20 0 testing::internal::TestFactoryImpl::CreateTest +1eb30 2 486 85 +1eb32 8 486 85 +1eb3a 6 90 13 +1eb40 2 486 85 +1eb42 6 90 13 +1eb48 8 486 85 +FUNC 1eb50 20 0 testing::internal::TestFactoryImpl::CreateTest +1eb50 2 486 85 +1eb52 8 486 85 +1eb5a 6 108 13 +1eb60 2 486 85 +1eb62 6 108 13 +1eb68 8 486 85 +FUNC 1eb70 10 0 google_breakpad::CpuSet::CpuSet +1eb70 2 50 12 +1eb72 2 50 12 +1eb74 8 51 12 +1eb7c 4 52 12 +FUNC 1eb80 108 0 google_breakpad::CpuSet::ParseSysFile +1eb80 a 55 12 +1eb8a a 55 12 +1eb94 1a 3104 97 +1ebae 4 3104 97 +1ebb2 4 3104 97 +1ebb6 4 59 12 +1ebba 8 58 12 +1ebc2 2 71 12 +1ebc4 2 61 12 +1ebc6 4 102 12 +1ebca 2 72 12 +1ebcc 6 73 12 +1ebd2 a 75 12 +1ebdc 2 75 12 +1ebde 2 75 12 +1ebe0 2 76 12 +1ebe2 4 75 12 +1ebe6 2 109 12 +1ebe8 c 110 12 +1ebf4 c 82 12 +1ec00 2 83 12 +1ec02 4 84 12 +1ec06 6 92 12 +1ec0c 8 92 12 +1ec14 c 92 12 +1ec20 4 96 12 +1ec24 4 100 12 +1ec28 4 101 12 +1ec2c 2 100 12 +1ec2e 4 101 12 +1ec32 2 102 12 +1ec34 2 101 12 +1ec36 4 102 12 +1ec3a 6 103 12 +1ec40 8 104 12 +1ec48 4 131 12 +1ec4c a 106 12 +1ec56 4 130 12 +1ec5a 4 131 12 +1ec5e 4 107 12 +1ec62 16 131 12 +1ec78 4 130 12 +1ec7c c 110 12 +FUNC 1ec88 1c 0 google_breakpad::CpuSet::GetCount +1ec88 2 119 12 +1ec8a 8 120 12 +1ec92 8 122 12 +1ec9a 2 121 12 +1ec9c 2 122 12 +1ec9e 2 121 12 +1eca0 4 125 12 +FUNC 1eca4 12 0 google_breakpad::AutoTestFile::~AutoTestFile +1eca4 2 72 52 +1eca6 2 72 52 +1eca8 6 73 52 +1ecae 4 74 52 +1ecb2 4 77 52 +FUNC 1ecb8 6c 0 google_breakpad::AutoTestFile::Init +1ecb8 e 92 52 +1ecc6 c 92 52 +1ecd2 6 93 52 +1ecd8 4 97 52 +1ecdc 2 92 52 +1ecde c 97 52 +1ecea 6 98 52 +1ecf0 6 101 52 +1ecf6 2 102 52 +1ecf8 2 101 52 +1ecfa 2 102 52 +1ecfc 6 105 52 +1ed02 22 106 52 +FUNC 1ed24 5c 0 ScopedTestFile::ScopedTestFile +1ed24 2 51 13 +1ed26 4 51 13 +1ed2a 8 60 52 +1ed32 6 61 52 +1ed38 8 62 52 +1ed40 10 109 52 +1ed50 4 109 52 +1ed54 6 109 52 +1ed5a 4 110 52 +1ed5e 6 111 52 +1ed64 8 112 52 +1ed6c a 116 52 +1ed76 a 53 13 +FUNC 1ed80 dc 0 testing::internal::CmpHelperEQFailure +1ed80 e 1464 82 +1ed8e 2 1464 82 +1ed90 2 884 80 +1ed92 2 1464 82 +1ed94 2 240 126 +1ed96 2 1464 82 +1ed98 4 884 80 +1ed9c 8 1464 82 +1eda4 4 884 80 +1eda8 10 240 126 +1edb8 2 112 137 +1edba 4 378 136 +1edbe 4 379 136 +1edc2 2 112 137 +1edc4 2 481 106 +1edc6 4 379 136 +1edca a 148 142 +1edd4 4 101 108 +1edd8 2 380 136 +1edda 4 101 108 +1edde 6 886 80 +1ede4 8 884 80 +1edec 12 240 126 +1edfe 2 112 137 +1ee00 4 378 136 +1ee04 4 379 136 +1ee08 2 112 137 +1ee0a 2 481 106 +1ee0c 4 379 136 +1ee10 a 148 142 +1ee1a 2 380 136 +1ee1c 4 101 108 +1ee20 6 886 80 +1ee26 10 1471 82 +1ee36 c 156 137 +1ee42 1a 1472 82 +FUNC 1ee5c 80 0 CpuSetTest_EmptyCount_Test::TestBody +1ee5c 4 58 13 +1ee60 8 59 13 +1ee68 a 60 13 +1ee72 a 1552 82 +1ee7c 2 60 13 +1ee7e e 1552 82 +1ee8c 8 60 13 +1ee94 6 302 82 +1ee9a 10 60 13 +1eeaa 6 60 13 +1eeb0 8 60 13 +1eeb8 6 85 79 +1eebe 6 60 13 +1eec4 6 256 82 +1eeca 12 61 13 +FUNC 1eedc 1ac 0 CpuSetTest_OneCpu_Test::TestBody +1eedc 8 63 13 +1eee4 4 63 13 +1eee8 2 64 13 +1eeea 2 63 13 +1eeec 8 64 13 +1eef4 2 63 13 +1eef6 4 64 13 +1eefa 2 82 52 +1eefc 4 1139 87 +1ef00 4 82 52 +1ef04 4 277 82 +1ef08 10 1139 87 +1ef18 2 65 13 +1ef1a 18 65 13 +1ef32 12 65 13 +1ef44 6 65 13 +1ef4a 8 65 13 +1ef52 6 85 79 +1ef58 6 65 13 +1ef5e 6 156 137 +1ef64 a 256 82 +1ef6e 6 67 13 +1ef74 8 68 13 +1ef7c 2 1139 87 +1ef7e 4 277 82 +1ef82 4 1139 87 +1ef86 2 68 13 +1ef88 1a 68 13 +1efa2 14 68 13 +1efb6 6 68 13 +1efbc 8 68 13 +1efc4 6 85 79 +1efca 6 68 13 +1efd0 8 156 137 +1efd8 6 256 82 +1efde a 69 13 +1efe8 8 1512 82 +1eff0 2 69 13 +1eff2 e 1512 82 +1f000 6 69 13 +1f006 6 302 82 +1f00c 10 69 13 +1f01c 6 69 13 +1f022 8 69 13 +1f02a 6 85 79 +1f030 6 69 13 +1f036 6 256 82 +1f03c 6 49 13 +1f042 46 70 13 +FUNC 1f088 1ac 0 CpuSetTest_OneCpuTerminated_Test::TestBody +1f088 8 72 13 +1f090 4 72 13 +1f094 2 73 13 +1f096 2 72 13 +1f098 8 73 13 +1f0a0 2 72 13 +1f0a2 4 73 13 +1f0a6 2 82 52 +1f0a8 4 1139 87 +1f0ac 4 82 52 +1f0b0 4 277 82 +1f0b4 10 1139 87 +1f0c4 2 74 13 +1f0c6 18 74 13 +1f0de 12 74 13 +1f0f0 6 74 13 +1f0f6 8 74 13 +1f0fe 6 85 79 +1f104 6 74 13 +1f10a 6 156 137 +1f110 a 256 82 +1f11a 6 76 13 +1f120 8 77 13 +1f128 2 1139 87 +1f12a 4 277 82 +1f12e 4 1139 87 +1f132 2 77 13 +1f134 1a 77 13 +1f14e 14 77 13 +1f162 6 77 13 +1f168 8 77 13 +1f170 6 85 79 +1f176 6 77 13 +1f17c 8 156 137 +1f184 6 256 82 +1f18a a 78 13 +1f194 8 1512 82 +1f19c 2 78 13 +1f19e e 1512 82 +1f1ac 6 78 13 +1f1b2 6 302 82 +1f1b8 10 78 13 +1f1c8 6 78 13 +1f1ce 8 78 13 +1f1d6 6 85 79 +1f1dc 6 78 13 +1f1e2 6 256 82 +1f1e8 6 49 13 +1f1ee 46 79 13 +FUNC 1f234 1b0 0 CpuSetTest_TwoCpusWithComma_Test::TestBody +1f234 8 81 13 +1f23c 4 81 13 +1f240 2 82 13 +1f242 2 81 13 +1f244 8 82 13 +1f24c 2 81 13 +1f24e 4 82 13 +1f252 2 82 52 +1f254 4 1139 87 +1f258 4 82 52 +1f25c 4 277 82 +1f260 10 1139 87 +1f270 2 83 13 +1f272 18 83 13 +1f28a 12 83 13 +1f29c 6 83 13 +1f2a2 8 83 13 +1f2aa 6 85 79 +1f2b0 6 83 13 +1f2b6 6 156 137 +1f2bc a 256 82 +1f2c6 6 85 13 +1f2cc 8 86 13 +1f2d4 2 1139 87 +1f2d6 4 277 82 +1f2da 4 1139 87 +1f2de 2 86 13 +1f2e0 1a 86 13 +1f2fa 14 86 13 +1f30e 6 86 13 +1f314 8 86 13 +1f31c 6 85 79 +1f322 6 86 13 +1f328 8 156 137 +1f330 4 87 13 +1f334 6 256 82 +1f33a a 87 13 +1f344 8 1512 82 +1f34c 2 87 13 +1f34e e 1512 82 +1f35c 6 87 13 +1f362 6 302 82 +1f368 10 87 13 +1f378 6 87 13 +1f37e 8 87 13 +1f386 6 85 79 +1f38c 6 87 13 +1f392 6 256 82 +1f398 6 49 13 +1f39e 46 88 13 +FUNC 1f3e4 1b0 0 CpuSetTest_TwoCpusWithRange_Test::TestBody +1f3e4 8 90 13 +1f3ec 4 90 13 +1f3f0 2 91 13 +1f3f2 2 90 13 +1f3f4 8 91 13 +1f3fc 2 90 13 +1f3fe 4 91 13 +1f402 2 82 52 +1f404 4 1139 87 +1f408 4 82 52 +1f40c 4 277 82 +1f410 10 1139 87 +1f420 2 92 13 +1f422 18 92 13 +1f43a 12 92 13 +1f44c 6 92 13 +1f452 8 92 13 +1f45a 6 85 79 +1f460 6 92 13 +1f466 6 156 137 +1f46c a 256 82 +1f476 6 94 13 +1f47c 8 95 13 +1f484 2 1139 87 +1f486 4 277 82 +1f48a 4 1139 87 +1f48e 2 95 13 +1f490 1a 95 13 +1f4aa 14 95 13 +1f4be 6 95 13 +1f4c4 8 95 13 +1f4cc 6 85 79 +1f4d2 6 95 13 +1f4d8 8 156 137 +1f4e0 4 96 13 +1f4e4 6 256 82 +1f4ea a 96 13 +1f4f4 8 1512 82 +1f4fc 2 96 13 +1f4fe e 1512 82 +1f50c 6 96 13 +1f512 6 302 82 +1f518 10 96 13 +1f528 6 96 13 +1f52e 8 96 13 +1f536 6 85 79 +1f53c 6 96 13 +1f542 6 256 82 +1f548 6 49 13 +1f54e 46 97 13 +FUNC 1f594 1ac 0 CpuSetTest_TenCpusWithRange_Test::TestBody +1f594 8 99 13 +1f59c 4 99 13 +1f5a0 2 100 13 +1f5a2 2 99 13 +1f5a4 8 100 13 +1f5ac 2 99 13 +1f5ae 4 100 13 +1f5b2 2 82 52 +1f5b4 4 1139 87 +1f5b8 4 82 52 +1f5bc 4 277 82 +1f5c0 10 1139 87 +1f5d0 2 101 13 +1f5d2 18 101 13 +1f5ea 12 101 13 +1f5fc 6 101 13 +1f602 8 101 13 +1f60a 6 85 79 +1f610 6 101 13 +1f616 6 156 137 +1f61c a 256 82 +1f626 6 103 13 +1f62c 8 104 13 +1f634 2 1139 87 +1f636 4 277 82 +1f63a 4 1139 87 +1f63e 2 104 13 +1f640 1a 104 13 +1f65a 14 104 13 +1f66e 6 104 13 +1f674 8 104 13 +1f67c 6 85 79 +1f682 6 104 13 +1f688 8 156 137 +1f690 6 256 82 +1f696 a 105 13 +1f6a0 8 1512 82 +1f6a8 2 105 13 +1f6aa e 1512 82 +1f6b8 6 105 13 +1f6be 6 302 82 +1f6c4 10 105 13 +1f6d4 6 105 13 +1f6da 8 105 13 +1f6e2 6 85 79 +1f6e8 6 105 13 +1f6ee 6 256 82 +1f6f4 6 49 13 +1f6fa 46 106 13 +FUNC 1f740 1ac 0 CpuSetTest_MultiItems_Test::TestBody +1f740 8 108 13 +1f748 4 108 13 +1f74c 2 109 13 +1f74e 2 108 13 +1f750 8 109 13 +1f758 2 108 13 +1f75a 4 109 13 +1f75e 2 82 52 +1f760 4 1139 87 +1f764 4 82 52 +1f768 4 277 82 +1f76c 10 1139 87 +1f77c 2 110 13 +1f77e 18 110 13 +1f796 12 110 13 +1f7a8 6 110 13 +1f7ae 8 110 13 +1f7b6 6 85 79 +1f7bc 6 110 13 +1f7c2 6 156 137 +1f7c8 a 256 82 +1f7d2 6 112 13 +1f7d8 8 113 13 +1f7e0 2 1139 87 +1f7e2 4 277 82 +1f7e6 4 1139 87 +1f7ea 2 113 13 +1f7ec 1a 113 13 +1f806 14 113 13 +1f81a 6 113 13 +1f820 8 113 13 +1f828 6 85 79 +1f82e 6 113 13 +1f834 8 156 137 +1f83c 6 256 82 +1f842 a 114 13 +1f84c 8 1512 82 +1f854 2 114 13 +1f856 e 1512 82 +1f864 6 114 13 +1f86a 6 302 82 +1f870 10 114 13 +1f880 6 114 13 +1f886 8 114 13 +1f88e 6 85 79 +1f894 6 114 13 +1f89a 6 256 82 +1f8a0 6 49 13 +1f8a6 46 115 13 +FUNC 1f8ec 3e8 0 CpuSetTest_IntersectWith_Test::TestBody +1f8ec 8 117 13 +1f8f4 4 117 13 +1f8f8 2 118 13 +1f8fa 2 117 13 +1f8fc 8 118 13 +1f904 2 117 13 +1f906 4 118 13 +1f90a 4 82 52 +1f90e 4 1139 87 +1f912 6 82 52 +1f918 4 277 82 +1f91c e 1139 87 +1f92a 2 119 13 +1f92c 18 119 13 +1f944 12 119 13 +1f956 6 119 13 +1f95c 8 119 13 +1f964 6 85 79 +1f96a 6 119 13 +1f970 4 156 137 +1f974 6 256 82 +1f97a 6 120 13 +1f980 c 121 13 +1f98c 4 277 82 +1f990 4 1139 87 +1f994 2 121 13 +1f996 18 121 13 +1f9ae 12 121 13 +1f9c0 6 121 13 +1f9c6 8 121 13 +1f9ce 6 85 79 +1f9d4 6 121 13 +1f9da 6 156 137 +1f9e0 e 256 82 +1f9ee a 122 13 +1f9f8 4 1512 82 +1f9fc 2 122 13 +1f9fe e 1512 82 +1fa0c 6 122 13 +1fa12 6 302 82 +1fa18 10 122 13 +1fa28 6 122 13 +1fa2e 8 122 13 +1fa36 6 85 79 +1fa3c 8 122 13 +1fa44 6 256 82 +1fa4a e 124 13 +1fa58 4 82 52 +1fa5c 4 1139 87 +1fa60 4 82 52 +1fa64 4 277 82 +1fa68 2 125 13 +1fa6a 18 125 13 +1fa82 12 125 13 +1fa94 6 125 13 +1fa9a 8 125 13 +1faa2 6 85 79 +1faa8 6 125 13 +1faae 6 156 137 +1fab4 a 256 82 +1fabe 6 126 13 +1fac4 c 127 13 +1fad0 2 277 82 +1fad2 8 1139 87 +1fada 2 127 13 +1fadc 18 127 13 +1faf4 12 127 13 +1fb06 6 127 13 +1fb0c 8 127 13 +1fb14 6 85 79 +1fb1a 6 127 13 +1fb20 8 156 137 +1fb28 6 256 82 +1fb2e a 128 13 +1fb38 4 1512 82 +1fb3c 2 128 13 +1fb3e e 1512 82 +1fb4c 4 128 13 +1fb50 6 302 82 +1fb56 10 128 13 +1fb66 6 128 13 +1fb6c 8 128 13 +1fb74 6 85 79 +1fb7a 6 128 13 +1fb80 a 256 82 +1fb8a 2 114 12 +1fb8c 10 115 12 +1fb9c 2 114 12 +1fb9e 4 114 12 +1fba2 8 131 13 +1fbaa 4 1512 82 +1fbae 4 131 13 +1fbb2 e 1512 82 +1fbc0 6 131 13 +1fbc6 6 302 82 +1fbcc e 131 13 +1fbda 6 256 82 +1fbe0 a 132 13 +1fbea 4 1512 82 +1fbee 2 132 13 +1fbf0 e 1512 82 +1fbfe 4 132 13 +1fc02 6 302 82 +1fc08 10 132 13 +1fc18 6 132 13 +1fc1e 8 132 13 +1fc26 6 85 79 +1fc2c 6 132 13 +1fc32 6 256 82 +1fc38 c 49 13 +1fc44 90 133 13 +FUNC 1fcd4 1fc 0 CpuSetTest_SelfIntersection_Test::TestBody +1fcd4 8 135 13 +1fcdc 4 135 13 +1fce0 2 136 13 +1fce2 2 135 13 +1fce4 8 136 13 +1fcec 2 135 13 +1fcee 4 136 13 +1fcf2 2 82 52 +1fcf4 2 1139 87 +1fcf6 6 82 52 +1fcfc 4 277 82 +1fd00 e 1139 87 +1fd0e 2 137 13 +1fd10 18 137 13 +1fd28 12 137 13 +1fd3a 6 137 13 +1fd40 8 137 13 +1fd48 6 85 79 +1fd4e 6 137 13 +1fd54 6 156 137 +1fd5a a 256 82 +1fd64 6 138 13 +1fd6a 8 139 13 +1fd72 2 1139 87 +1fd74 4 277 82 +1fd78 4 1139 87 +1fd7c 2 139 13 +1fd7e 1a 139 13 +1fd98 14 139 13 +1fdac 6 139 13 +1fdb2 8 139 13 +1fdba 6 85 79 +1fdc0 6 139 13 +1fdc6 8 156 137 +1fdce 6 256 82 +1fdd4 a 140 13 +1fdde e 1512 82 +1fdec 2 140 13 +1fdee e 1512 82 +1fdfc 6 140 13 +1fe02 6 302 82 +1fe08 e 140 13 +1fe16 6 256 82 +1fe1c a 143 13 +1fe26 2 1512 82 +1fe28 2 143 13 +1fe2a c 1512 82 +1fe36 6 143 13 +1fe3c 6 302 82 +1fe42 10 143 13 +1fe52 6 143 13 +1fe58 8 143 13 +1fe60 6 85 79 +1fe66 6 143 13 +1fe6c 6 256 82 +1fe72 4 49 13 +1fe76 6 256 82 +1fe7c 6 49 13 +1fe82 4e 144 13 +FUNC 1fed0 3ec 0 CpuSetTest_EmptyIntersection_Test::TestBody +1fed0 8 146 13 +1fed8 4 146 13 +1fedc 2 147 13 +1fede 2 146 13 +1fee0 8 147 13 +1fee8 2 146 13 +1feea 4 147 13 +1feee 4 82 52 +1fef2 2 1139 87 +1fef4 6 82 52 +1fefa 4 277 82 +1fefe c 1139 87 +1ff0a 2 148 13 +1ff0c 18 148 13 +1ff24 12 148 13 +1ff36 6 148 13 +1ff3c 8 148 13 +1ff44 6 85 79 +1ff4a 6 148 13 +1ff50 4 156 137 +1ff54 6 256 82 +1ff5a 6 149 13 +1ff60 a 150 13 +1ff6a 2 1139 87 +1ff6c 4 277 82 +1ff70 4 1139 87 +1ff74 2 150 13 +1ff76 18 150 13 +1ff8e 12 150 13 +1ffa0 6 150 13 +1ffa6 8 150 13 +1ffae 6 85 79 +1ffb4 6 150 13 +1ffba 6 156 137 +1ffc0 e 256 82 +1ffce a 151 13 +1ffd8 6 1512 82 +1ffde 2 151 13 +1ffe0 10 1512 82 +1fff0 8 151 13 +1fff8 6 302 82 +1fffe 10 151 13 +2000e 6 151 13 +20014 8 151 13 +2001c 6 85 79 +20022 8 151 13 +2002a 6 256 82 +20030 e 153 13 +2003e 4 82 52 +20042 2 1139 87 +20044 4 82 52 +20048 4 277 82 +2004c 2 1139 87 +2004e 2 154 13 +20050 18 154 13 +20068 12 154 13 +2007a 6 154 13 +20080 8 154 13 +20088 6 85 79 +2008e 6 154 13 +20094 6 156 137 +2009a a 256 82 +200a4 6 155 13 +200aa a 156 13 +200b4 6 1139 87 +200ba 6 277 82 +200c0 2 156 13 +200c2 18 156 13 +200da 12 156 13 +200ec 6 156 13 +200f2 8 156 13 +200fa 6 85 79 +20100 6 156 13 +20106 8 156 137 +2010e 6 256 82 +20114 a 157 13 +2011e 2 1512 82 +20120 2 157 13 +20122 e 1512 82 +20130 4 157 13 +20134 6 302 82 +2013a 10 157 13 +2014a 6 157 13 +20150 8 157 13 +20158 6 85 79 +2015e 6 157 13 +20164 a 256 82 +2016e 2 114 12 +20170 12 115 12 +20182 2 114 12 +20184 4 114 12 +20188 8 160 13 +20190 4 1552 82 +20194 4 160 13 +20198 e 1552 82 +201a6 8 160 13 +201ae 6 302 82 +201b4 e 160 13 +201c2 6 256 82 +201c8 a 162 13 +201d2 4 1512 82 +201d6 2 162 13 +201d8 e 1512 82 +201e6 6 162 13 +201ec 6 302 82 +201f2 10 162 13 +20202 6 162 13 +20208 8 162 13 +20210 6 85 79 +20216 6 162 13 +2021c 6 256 82 +20222 c 49 13 +2022e 8e 163 13 +FUNC 202bc 18 0 DirectoryReaderTest_CompareResults_Test::~DirectoryReaderTest_CompareResults_Test +202bc 2 47 15 +202be 16 47 15 +FUNC 202d4 12 0 DirectoryReaderTest_CompareResults_Test::~DirectoryReaderTest_CompareResults_Test +202d4 2 47 15 +202d6 6 47 15 +202dc 6 47 15 +202e2 4 47 15 +FUNC 202e8 20 0 testing::internal::TestFactoryImpl::CreateTest +202e8 2 486 85 +202ea 8 486 85 +202f2 6 47 15 +202f8 2 486 85 +202fa 6 47 15 +20300 8 486 85 +FUNC 20308 28 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::basic_string, std::allocator >, std::priv::_Identity, std::allocator > >, std::priv::_SetTraitsT, std::allocator > >, std::allocator, std::allocator > > >::_M_create_node +20308 2 315 141 +2030a 2 306 106 +2030c 2 315 141 +2030e 6 306 106 +20314 6 307 106 +2031a 4 119 108 +2031e 6 119 108 +20324 2 321 141 +20326 2 324 141 +20328 2 321 141 +2032a 2 322 141 +2032c 4 324 141 +FUNC 20330 98 0 std::priv::__put_num, long unsigned int> +20330 4 194 126 +20334 4 194 126 +20338 a 181 127 +20342 2 199 126 +20344 10 211 126 +20354 2 202 126 +20356 2 145 115 +20358 4 202 126 +2035c 2 145 115 +2035e 2 202 126 +20360 6 145 115 +20366 8 351 122 +2036e 6 351 122 +20374 2 202 126 +20376 2 351 122 +20378 c 202 126 +20384 18 57 128 +2039c 16 72 125 +203b2 6 202 126 +203b8 4 210 126 +203bc 6 212 126 +203c2 6 213 126 +FUNC 203c8 28 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::basic_string, std::allocator >, std::priv::_Identity, std::allocator > >, std::priv::_SetTraitsT, std::allocator > >, std::allocator, std::allocator > > >::_M_erase +203c8 6 655 140 +203ce 2 657 140 +203d0 8 658 140 +203d8 4 156 137 +203dc 2 659 140 +203de 4 156 137 +203e2 c 161 106 +203ee 2 664 140 +FUNC 203f0 34 0 std::operator< , std::allocator > +203f0 6 351 139 +203f6 2 1073 136 +203f8 2 1074 136 +203fa 2 1073 136 +203fc 2 1074 136 +203fe 10 226 145 +2040e 2 1076 136 +20410 4 1076 136 +20414 8 1076 136 +2041c 4 1076 136 +20420 4 355 139 +FUNC 20424 2c 0 std::priv::_Rb_global::_Rotate_left +20424 2 62 140 +20426 4 63 140 +2042a 4 64 140 +2042e 2 65 140 +20430 4 66 140 +20434 6 68 140 +2043a 4 69 140 +2043e 6 70 140 +20444 4 71 140 +20448 2 73 140 +2044a 2 74 140 +2044c 4 75 140 +FUNC 20450 2c 0 std::priv::_Rb_global::_Rotate_right +20450 2 81 140 +20452 4 82 140 +20456 4 83 140 +2045a 2 84 140 +2045c 4 85 140 +20460 6 87 140 +20466 4 88 140 +2046a 6 89 140 +20470 4 90 140 +20474 2 92 140 +20476 2 93 140 +20478 4 94 140 +FUNC 2047c 9e 0 std::priv::_Rb_global::_Rebalance +2047c 4 98 140 +20480 4 100 140 +20484 4 98 140 +20488 2 133 140 +2048a 4 100 140 +2048e 6 101 140 +20494 8 139 140 +2049c 8 101 140 +204a4 8 102 140 +204ac 2 103 140 +204ae 2 104 140 +204b0 4 104 140 +204b4 6 111 140 +204ba a 113 140 +204c4 2 115 140 +204c6 2 117 140 +204c8 2 115 140 +204ca 8 116 140 +204d2 a 117 140 +204dc 2 122 140 +204de 4 122 140 +204e2 2 123 140 +204e4 2 124 140 +204e6 6 125 140 +204ec 6 126 140 +204f2 6 129 140 +204f8 a 131 140 +20502 2 133 140 +20504 2 135 140 +20506 2 133 140 +20508 8 134 140 +20510 a 135 140 +FUNC 2051a 6e 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::basic_string, std::allocator >, std::priv::_Identity, std::allocator > >, std::priv::_SetTraitsT, std::allocator > >, std::allocator, std::allocator > > >::_M_insert +2051a 2 358 140 +2051c 2 350 140 +2051e 8 350 140 +20526 2 358 140 +20528 8 359 140 +20530 2 360 140 +20532 2 361 140 +20534 4 362 140 +20538 4 364 140 +2053c 4 364 140 +20540 a 79 111 +2054a 2 364 140 +2054c 6 367 140 +20552 2 368 140 +20554 2 369 140 +20556 2 367 140 +20558 4 369 140 +2055c 4 370 140 +20560 6 373 140 +20566 2 374 140 +20568 2 375 140 +2056a 2 373 140 +2056c 4 375 140 +20570 2 376 140 +20572 2 379 140 +20574 2 378 140 +20576 6 379 140 +2057c 2 380 140 +2057e 2 382 140 +20580 4 380 140 +20584 2 142 141 +20586 2 382 140 +FUNC 20588 70c 0 DirectoryReaderTest_CompareResults_Test::TestBody +20588 8 47 15 +20590 2 263 141 +20592 8 47 15 +2059a 2 250 141 +2059c 2 47 15 +2059e 8 250 141 +205a6 2 47 15 +205a8 8 250 141 +205b0 a 481 106 +205ba 4 50 15 +205be 2 263 141 +205c0 2 50 15 +205c2 2 265 141 +205c4 2 391 141 +205c6 2 266 141 +205c8 2 267 141 +205ca 4 50 15 +205ce 6 51 15 +205d4 2 277 82 +205d6 2 1139 87 +205d8 2 51 15 +205da 6 277 82 +205e0 2 51 15 +205e2 1e 51 15 +20600 c 51 15 +2060c 4 51 15 +20610 a 51 15 +2061a 6 51 15 +20620 8 51 15 +20628 6 85 79 +2062e 6 51 15 +20634 4 156 137 +20638 6 256 82 +2063e 4 55 15 +20642 4 142 141 +20646 c 54 15 +20652 c 55 15 +2065e 2 408 140 +20660 2 406 140 +20662 2 407 140 +20664 2 409 140 +20666 a 79 111 +20670 2 412 140 +20672 4 412 140 +20676 2 412 140 +20678 6 47 15 +2067e 2 409 140 +20680 4 142 141 +20684 2 415 140 +20686 6 416 140 +2068c a 417 140 +20696 4 279 140 +2069a 8 279 140 +206a2 4 280 140 +206a6 4 281 140 +206aa 8 99 141 +206b2 2 285 140 +206b4 6 286 140 +206ba 6 288 140 +206c0 4 187 141 +206c4 4 356 141 +206c8 8 79 111 +206d0 2 421 140 +206d2 12 422 140 +206e4 8 156 137 +206ec 6 57 15 +206f2 12 59 15 +20704 2 60 15 +20706 2 1621 82 +20708 4 59 15 +2070c 4 60 15 +20710 2 1621 82 +20712 8 1621 82 +2071a 1e 1621 82 +20738 4 60 15 +2073c 2 1144 87 +2073e 6 298 82 +20744 6 298 82 +2074a 16 60 15 +20760 6 256 82 +20766 12 51 14 +20778 2 63 15 +2077a 4 3016 97 +2077e 4 553 141 +20782 6 65 14 +20788 1c 3016 97 +207a4 4 3016 97 +207a8 8 3016 97 +207b0 4 68 14 +207b4 4 71 14 +207b8 4 73 14 +207bc 4 71 14 +207c0 8 73 14 +207c8 8 77 14 +207d0 2 549 141 +207d2 a 553 141 +207dc 6 552 141 +207e2 a 553 141 +207ec c 79 111 +207f8 6 156 137 +207fe 4 553 141 +20802 6 554 141 +20808 c 556 141 +20814 4 558 141 +20818 c 559 141 +20824 c 79 111 +20830 6 156 137 +20836 8 560 141 +2083e 8 200 141 +20846 2 1139 87 +20848 2 277 82 +2084a 2 1139 87 +2084c 2 67 15 +2084e 1a 67 15 +20868 14 67 15 +2087c 6 256 82 +20882 2 68 15 +20884 4 87 14 +20888 4 68 15 +2088c 6 87 14 +20892 4 93 14 +20896 2 94 14 +20898 2 93 14 +2089a 4 94 14 +2089e 4 93 14 +208a2 6 94 14 +208a8 8 77 14 +208b0 2 549 141 +208b2 e 553 141 +208c0 6 552 141 +208c6 a 553 141 +208d0 c 79 111 +208dc 6 156 137 +208e2 4 553 141 +208e6 6 554 141 +208ec c 556 141 +208f8 4 558 141 +208fc 10 559 141 +2090c c 79 111 +20918 6 156 137 +2091e 8 560 141 +20926 8 200 141 +2092e 2 1139 87 +20930 2 277 82 +20932 2 1139 87 +20934 2 72 15 +20936 1a 72 15 +20950 14 72 15 +20964 2 549 141 +20966 2 256 82 +20968 4 553 141 +2096c 8 256 82 +20974 6 553 141 +2097a 6 552 141 +20980 a 553 141 +2098a c 79 111 +20996 6 156 137 +2099c 4 553 141 +209a0 6 554 141 +209a6 c 556 141 +209b2 4 558 141 +209b6 10 559 141 +209c6 c 79 111 +209d2 6 156 137 +209d8 8 560 141 +209e0 8 200 141 +209e8 2 1139 87 +209ea 2 277 82 +209ec 2 1139 87 +209ee 2 73 15 +209f0 1a 73 15 +20a0a 14 73 15 +20a1e 2 549 141 +20a20 2 256 82 +20a22 4 553 141 +20a26 8 256 82 +20a2e 6 553 141 +20a34 6 552 141 +20a3a a 553 141 +20a44 c 79 111 +20a50 6 156 137 +20a56 4 553 141 +20a5a 6 554 141 +20a60 c 556 141 +20a6c 4 558 141 +20a70 10 559 141 +20a80 c 79 111 +20a8c 6 156 137 +20a92 8 560 141 +20a9a 8 200 141 +20aa2 4 1139 87 +20aa6 2 277 82 +20aa8 4 1139 87 +20aac 2 74 15 +20aae 1a 74 15 +20ac8 16 74 15 +20ade 6 74 15 +20ae4 8 74 15 +20aec 6 85 79 +20af2 6 74 15 +20af8 8 156 137 +20b00 8 256 82 +20b08 6 1481 82 +20b0e 8 1482 82 +20b16 4 884 80 +20b1a 4 254 126 +20b1e 8 884 80 +20b26 4 75 132 +20b2a 4 254 126 +20b2e 2 75 132 +20b30 4 254 126 +20b34 8 75 132 +20b3c 6 886 80 +20b42 8 884 80 +20b4a 4 254 126 +20b4e 4 75 132 +20b52 4 254 126 +20b56 8 75 132 +20b5e 6 886 80 +20b64 18 1471 82 +20b7c c 156 137 +20b88 4 76 15 +20b8c 2 1144 87 +20b8e 6 298 82 +20b94 4 298 82 +20b98 12 76 15 +20baa 8 76 15 +20bb2 8 76 15 +20bba 6 85 79 +20bc0 6 76 15 +20bc6 e 256 82 +20bd4 6 77 15 +20bda 4 531 141 +20bde 8 532 141 +20be6 ae 78 15 +FUNC 20c94 18 0 LineReaderTest_TooLong_Test::~LineReaderTest_TooLong_Test +20c94 2 158 17 +20c96 16 158 17 +FUNC 20cac 12 0 LineReaderTest_TooLong_Test::~LineReaderTest_TooLong_Test +20cac 2 158 17 +20cae 6 158 17 +20cb4 6 158 17 +20cba 4 158 17 +FUNC 20cc0 18 0 LineReaderTest_MaxLength_Test::~LineReaderTest_MaxLength_Test +20cc0 2 143 17 +20cc2 16 143 17 +FUNC 20cd8 12 0 LineReaderTest_MaxLength_Test::~LineReaderTest_MaxLength_Test +20cd8 2 143 17 +20cda 6 143 17 +20ce0 6 143 17 +20ce6 4 143 17 +FUNC 20cec 18 0 LineReaderTest_TwoLines_Test::~LineReaderTest_TwoLines_Test +20cec 2 121 17 +20cee 16 121 17 +FUNC 20d04 12 0 LineReaderTest_TwoLines_Test::~LineReaderTest_TwoLines_Test +20d04 2 121 17 +20d06 6 121 17 +20d0c 6 121 17 +20d12 4 121 17 +FUNC 20d18 18 0 LineReaderTest_TwoLinesTerminated_Test::~LineReaderTest_TwoLinesTerminated_Test +20d18 2 99 17 +20d1a 16 99 17 +FUNC 20d30 12 0 LineReaderTest_TwoLinesTerminated_Test::~LineReaderTest_TwoLinesTerminated_Test +20d30 2 99 17 +20d32 6 99 17 +20d38 6 99 17 +20d3e 4 99 17 +FUNC 20d44 18 0 LineReaderTest_OneLine_Test::~LineReaderTest_OneLine_Test +20d44 2 83 17 +20d46 16 83 17 +FUNC 20d5c 12 0 LineReaderTest_OneLine_Test::~LineReaderTest_OneLine_Test +20d5c 2 83 17 +20d5e 6 83 17 +20d64 6 83 17 +20d6a 4 83 17 +FUNC 20d70 18 0 LineReaderTest_OneLineTerminated_Test::~LineReaderTest_OneLineTerminated_Test +20d70 2 67 17 +20d72 16 67 17 +FUNC 20d88 12 0 LineReaderTest_OneLineTerminated_Test::~LineReaderTest_OneLineTerminated_Test +20d88 2 67 17 +20d8a 6 67 17 +20d90 6 67 17 +20d96 4 67 17 +FUNC 20d9c 18 0 LineReaderTest_EmptyFile_Test::~LineReaderTest_EmptyFile_Test +20d9c 2 57 17 +20d9e 16 57 17 +FUNC 20db4 12 0 LineReaderTest_EmptyFile_Test::~LineReaderTest_EmptyFile_Test +20db4 2 57 17 +20db6 6 57 17 +20dbc 6 57 17 +20dc2 4 57 17 +FUNC 20dc8 20 0 testing::internal::TestFactoryImpl::CreateTest +20dc8 2 486 85 +20dca 8 486 85 +20dd2 6 158 17 +20dd8 2 486 85 +20dda 6 158 17 +20de0 8 486 85 +FUNC 20de8 20 0 testing::internal::TestFactoryImpl::CreateTest +20de8 2 486 85 +20dea 8 486 85 +20df2 6 99 17 +20df8 2 486 85 +20dfa 6 99 17 +20e00 8 486 85 +FUNC 20e08 20 0 testing::internal::TestFactoryImpl::CreateTest +20e08 2 486 85 +20e0a 8 486 85 +20e12 6 83 17 +20e18 2 486 85 +20e1a 6 83 17 +20e20 8 486 85 +FUNC 20e28 20 0 testing::internal::TestFactoryImpl::CreateTest +20e28 2 486 85 +20e2a 8 486 85 +20e32 6 67 17 +20e38 2 486 85 +20e3a 6 67 17 +20e40 8 486 85 +FUNC 20e48 20 0 testing::internal::TestFactoryImpl::CreateTest +20e48 2 486 85 +20e4a 8 486 85 +20e52 6 57 17 +20e58 2 486 85 +20e5a 6 57 17 +20e60 8 486 85 +FUNC 20e68 20 0 testing::internal::TestFactoryImpl::CreateTest +20e68 2 486 85 +20e6a 8 486 85 +20e72 6 143 17 +20e78 2 486 85 +20e7a 6 143 17 +20e80 8 486 85 +FUNC 20e88 20 0 testing::internal::TestFactoryImpl::CreateTest +20e88 2 486 85 +20e8a 8 486 85 +20e92 6 121 17 +20e98 2 486 85 +20e9a 6 121 17 +20ea0 8 486 85 +FUNC 20ea8 9e 0 google_breakpad::LineReader::GetNextLine +20ea8 2 64 16 +20eaa 4 103 16 +20eae 6 64 16 +20eb4 4 66 16 +20eb8 6 66 16 +20ebe 6 64 16 +20ec4 4 69 16 +20ec8 8 70 16 +20ed0 4 71 16 +20ed4 2 73 16 +20ed6 2 71 16 +20ed8 2 74 16 +20eda 2 72 16 +20edc 2 73 16 +20ede 2 74 16 +20ee0 4 70 16 +20ee4 4 69 16 +20ee8 6 78 16 +20eee 4 86 16 +20ef2 6 90 16 +20ef8 2 91 16 +20efa 2 92 16 +20efc 2 93 16 +20efe 6 92 16 +20f04 2 93 16 +20f06 2 94 16 +20f08 2 98 16 +20f0a 2 3104 97 +20f0c 2 98 16 +20f0e 4 99 16 +20f12 12 3104 97 +20f24 4 3104 97 +20f28 6 3104 97 +20f2e 4 100 16 +20f32 4 105 16 +20f36 4 103 16 +20f3a 6 105 16 +20f40 2 67 16 +20f42 4 111 16 +FUNC 20f46 12 0 google_breakpad::LineReader::PopLine +20f46 4 113 16 +20f4a 2 117 16 +20f4c 2 118 16 +20f4e 2 117 16 +20f50 8 118 16 +FUNC 20f58 42 0 google_breakpad::AutoTestFile::WriteText +20f58 8 108 52 +20f60 10 109 52 +20f70 4 109 52 +20f74 6 109 52 +20f7a 4 110 52 +20f7e 6 111 52 +20f84 6 112 52 +20f8a 2 113 52 +20f8c 4 116 52 +20f90 4 117 52 +20f94 6 116 52 +FUNC 20f9c 2c 0 ScopedTestFile::ScopedTestFile +20f9c 2 46 17 +20f9e 4 46 17 +20fa2 8 60 52 +20faa 6 61 52 +20fb0 6 62 52 +20fb6 2 62 52 +20fb8 2 62 52 +20fba 6 62 52 +20fc0 8 48 17 +FUNC 20fc8 148 0 LineReaderTest_EmptyFile_Test::TestBody +20fc8 a 57 17 +20fd2 4 57 17 +20fd6 2 58 17 +20fd8 2 57 17 +20fda 6 58 17 +20fe0 2 57 17 +20fe2 4 58 17 +20fe6 2 82 52 +20fe8 4 1139 87 +20fec 2 82 52 +20fee 2 277 82 +20ff0 2 82 52 +20ff2 2 277 82 +20ff4 a 1139 87 +20ffe 2 59 17 +21000 16 59 17 +21016 a 59 17 +21020 4 59 17 +21024 a 59 17 +2102e 6 59 17 +21034 8 59 17 +2103c 6 85 79 +21042 6 59 17 +21048 4 156 137 +2104c 6 256 82 +21052 2 49 16 +21054 6 64 17 +2105a a 49 16 +21064 a 64 17 +2106e 2 277 82 +21070 4 1139 87 +21074 2 64 17 +21076 1a 64 17 +21090 c 64 17 +2109c 2 64 17 +2109e a 64 17 +210a8 6 64 17 +210ae 8 64 17 +210b6 6 85 79 +210bc 6 64 17 +210c2 6 156 137 +210c8 6 256 82 +210ce 6 44 17 +210d4 3c 65 17 +FUNC 21110 16c 0 LineReaderTest_TooLong_Test::TestBody +21110 a 158 17 +2111a 4 158 17 +2111e 2 161 17 +21120 2 158 17 +21122 8 161 17 +2112a 4 158 17 +2112e 4 161 17 +21132 c 66 52 +2113e 6 67 52 +21144 c 68 52 +21150 2 82 52 +21152 4 1139 87 +21156 2 82 52 +21158 2 277 82 +2115a 2 82 52 +2115c 2 277 82 +2115e a 1139 87 +21168 2 163 17 +2116a 16 163 17 +21180 a 163 17 +2118a 4 163 17 +2118e a 163 17 +21198 6 163 17 +2119e 8 163 17 +211a6 6 85 79 +211ac 6 163 17 +211b2 4 156 137 +211b6 6 256 82 +211bc 2 49 16 +211be 6 168 17 +211c4 a 49 16 +211ce a 168 17 +211d8 2 277 82 +211da 4 1139 87 +211de 2 168 17 +211e0 1a 168 17 +211fa c 168 17 +21206 2 168 17 +21208 a 168 17 +21212 6 168 17 +21218 8 168 17 +21220 6 85 79 +21226 6 168 17 +2122c 6 156 137 +21232 6 256 82 +21238 6 44 17 +2123e 3e 169 17 +FUNC 2127c a0 0 testing::internal::CmpHelperEQFailure +2127c e 1464 82 +2128a 2 1464 82 +2128c 2 884 80 +2128e 6 1464 82 +21294 4 254 126 +21298 2 1464 82 +2129a 4 884 80 +2129e 4 1464 82 +212a2 2 75 132 +212a4 4 884 80 +212a8 4 254 126 +212ac 2 75 132 +212ae 4 254 126 +212b2 8 75 132 +212ba 6 886 80 +212c0 8 884 80 +212c8 6 254 126 +212ce 4 75 132 +212d2 4 254 126 +212d6 8 75 132 +212de 6 886 80 +212e4 14 1471 82 +212f8 c 156 137 +21304 18 1472 82 +FUNC 2131c a0 0 testing::internal::CmpHelperEQFailure +2131c e 1464 82 +2132a 2 1464 82 +2132c 2 884 80 +2132e 6 1464 82 +21334 4 394 80 +21338 2 1464 82 +2133a 4 884 80 +2133e 4 1464 82 +21342 2 75 132 +21344 4 884 80 +21348 4 394 80 +2134c 2 75 132 +2134e 4 394 80 +21352 8 75 132 +2135a 6 886 80 +21360 8 884 80 +21368 6 394 80 +2136e 4 75 132 +21372 4 394 80 +21376 8 75 132 +2137e 6 886 80 +21384 14 1471 82 +21398 c 156 137 +213a4 18 1472 82 +FUNC 213bc 20 0 testing::internal::CmpHelperEQ +213bc 2 1476 82 +213be 2 1476 82 +213c0 4 1481 82 +213c4 2 1476 82 +213c6 4 1481 82 +213ca 6 1482 82 +213d0 6 1487 82 +213d6 6 1488 82 +FUNC 213dc 288 0 LineReaderTest_OneLineTerminated_Test::TestBody +213dc a 67 17 +213e6 4 67 17 +213ea 2 68 17 +213ec 2 67 17 +213ee 8 68 17 +213f6 2 67 17 +213f8 4 68 17 +213fc 4 82 52 +21400 4 1139 87 +21404 2 82 52 +21406 2 277 82 +21408 4 82 52 +2140c 2 277 82 +2140e a 1139 87 +21418 2 69 17 +2141a 16 69 17 +21430 12 69 17 +21442 6 256 82 +21448 4 74 17 +2144c 4 49 16 +21450 a 74 17 +2145a a 49 16 +21464 4 74 17 +21468 4 1139 87 +2146c 2 277 82 +2146e 2 74 17 +21470 18 74 17 +21488 12 74 17 +2149a 6 256 82 +214a0 2 75 17 +214a2 4 1512 82 +214a6 2 75 17 +214a8 10 1512 82 +214b8 4 75 17 +214bc 6 302 82 +214c2 10 75 17 +214d2 6 256 82 +214d8 2 76 17 +214da 2 1512 82 +214dc 2 76 17 +214de 14 1512 82 +214f2 4 76 17 +214f6 6 302 82 +214fc 10 76 17 +2150c 6 256 82 +21512 4 77 17 +21516 4 1552 82 +2151a 6 77 17 +21520 e 1552 82 +2152e 4 77 17 +21532 6 302 82 +21538 12 77 17 +2154a 6 77 17 +21550 8 77 17 +21558 6 85 79 +2155e 8 77 17 +21566 6 256 82 +2156c a 78 17 +21576 10 80 17 +21586 2 277 82 +21588 4 1139 87 +2158c 2 80 17 +2158e 18 80 17 +215a6 14 80 17 +215ba 6 80 17 +215c0 8 80 17 +215c8 6 85 79 +215ce 6 80 17 +215d4 6 156 137 +215da 6 256 82 +215e0 4 44 17 +215e4 6 256 82 +215ea 6 44 17 +215f0 74 81 17 +FUNC 21664 288 0 LineReaderTest_OneLine_Test::TestBody +21664 a 83 17 +2166e 4 83 17 +21672 2 84 17 +21674 2 83 17 +21676 8 84 17 +2167e 2 83 17 +21680 4 84 17 +21684 4 82 52 +21688 4 1139 87 +2168c 2 82 52 +2168e 2 277 82 +21690 4 82 52 +21694 2 277 82 +21696 a 1139 87 +216a0 2 85 17 +216a2 16 85 17 +216b8 12 85 17 +216ca 6 256 82 +216d0 4 90 17 +216d4 4 49 16 +216d8 a 90 17 +216e2 a 49 16 +216ec 4 90 17 +216f0 4 1139 87 +216f4 2 277 82 +216f6 2 90 17 +216f8 18 90 17 +21710 12 90 17 +21722 6 256 82 +21728 2 91 17 +2172a 4 1512 82 +2172e 2 91 17 +21730 10 1512 82 +21740 4 91 17 +21744 6 302 82 +2174a 10 91 17 +2175a 6 256 82 +21760 2 92 17 +21762 2 1512 82 +21764 2 92 17 +21766 14 1512 82 +2177a 4 92 17 +2177e 6 302 82 +21784 10 92 17 +21794 6 256 82 +2179a 4 93 17 +2179e 4 1552 82 +217a2 6 93 17 +217a8 e 1552 82 +217b6 4 93 17 +217ba 6 302 82 +217c0 12 93 17 +217d2 6 93 17 +217d8 8 93 17 +217e0 6 85 79 +217e6 8 93 17 +217ee 6 256 82 +217f4 a 94 17 +217fe 10 96 17 +2180e 2 277 82 +21810 4 1139 87 +21814 2 96 17 +21816 18 96 17 +2182e 14 96 17 +21842 6 96 17 +21848 8 96 17 +21850 6 85 79 +21856 6 96 17 +2185c 6 156 137 +21862 6 256 82 +21868 4 44 17 +2186c 6 256 82 +21872 6 44 17 +21878 74 97 17 +FUNC 218ec 3c4 0 LineReaderTest_TwoLinesTerminated_Test::TestBody +218ec a 99 17 +218f6 4 99 17 +218fa 2 100 17 +218fc 2 99 17 +218fe 8 100 17 +21906 2 99 17 +21908 4 100 17 +2190c 4 82 52 +21910 4 1139 87 +21914 2 82 52 +21916 2 277 82 +21918 4 82 52 +2191c 2 277 82 +2191e a 1139 87 +21928 2 101 17 +2192a 16 101 17 +21940 12 101 17 +21952 6 256 82 +21958 4 106 17 +2195c 4 49 16 +21960 a 106 17 +2196a a 49 16 +21974 4 106 17 +21978 4 1139 87 +2197c 2 277 82 +2197e 2 106 17 +21980 18 106 17 +21998 12 106 17 +219aa 6 256 82 +219b0 4 107 17 +219b4 1c 1512 82 +219d0 4 107 17 +219d4 6 302 82 +219da 10 107 17 +219ea 6 256 82 +219f0 4 108 17 +219f4 1a 1512 82 +21a0e 4 108 17 +21a12 6 302 82 +21a18 10 108 17 +21a28 6 256 82 +21a2e a 1552 82 +21a38 4 109 17 +21a3c 2 1552 82 +21a3e 6 109 17 +21a44 e 1552 82 +21a52 4 109 17 +21a56 6 302 82 +21a5c 10 109 17 +21a6c 6 256 82 +21a72 a 110 17 +21a7c a 112 17 +21a86 4 1139 87 +21a8a 2 277 82 +21a8c 2 112 17 +21a8e 18 112 17 +21aa6 14 112 17 +21aba 6 112 17 +21ac0 8 112 17 +21ac8 6 85 79 +21ace 6 112 17 +21ad4 4 156 137 +21ad8 6 256 82 +21ade 2 113 17 +21ae0 2 1512 82 +21ae2 2 113 17 +21ae4 e 1512 82 +21af2 4 113 17 +21af6 6 302 82 +21afc 10 113 17 +21b0c 6 256 82 +21b12 2 114 17 +21b14 2 1512 82 +21b16 2 114 17 +21b18 12 1512 82 +21b2a 4 114 17 +21b2e 6 302 82 +21b34 10 114 17 +21b44 6 256 82 +21b4a a 115 17 +21b54 e 1552 82 +21b62 4 115 17 +21b66 6 302 82 +21b6c 12 115 17 +21b7e 6 115 17 +21b84 8 115 17 +21b8c 6 85 79 +21b92 8 115 17 +21b9a 6 256 82 +21ba0 a 116 17 +21baa 10 118 17 +21bba 2 277 82 +21bbc 4 1139 87 +21bc0 2 118 17 +21bc2 18 118 17 +21bda a 118 17 +21be4 2 118 17 +21be6 a 118 17 +21bf0 6 118 17 +21bf6 8 118 17 +21bfe 6 85 79 +21c04 6 118 17 +21c0a 6 156 137 +21c10 6 256 82 +21c16 6 44 17 +21c1c 94 119 17 +FUNC 21cb0 3c4 0 LineReaderTest_TwoLines_Test::TestBody +21cb0 a 121 17 +21cba 4 121 17 +21cbe 2 122 17 +21cc0 2 121 17 +21cc2 8 122 17 +21cca 2 121 17 +21ccc 4 122 17 +21cd0 4 82 52 +21cd4 4 1139 87 +21cd8 2 82 52 +21cda 2 277 82 +21cdc 4 82 52 +21ce0 2 277 82 +21ce2 a 1139 87 +21cec 2 123 17 +21cee 16 123 17 +21d04 12 123 17 +21d16 6 256 82 +21d1c 4 128 17 +21d20 4 49 16 +21d24 a 128 17 +21d2e a 49 16 +21d38 4 128 17 +21d3c 4 1139 87 +21d40 2 277 82 +21d42 2 128 17 +21d44 18 128 17 +21d5c 12 128 17 +21d6e 6 256 82 +21d74 4 129 17 +21d78 1c 1512 82 +21d94 4 129 17 +21d98 6 302 82 +21d9e 10 129 17 +21dae 6 256 82 +21db4 4 130 17 +21db8 1a 1512 82 +21dd2 4 130 17 +21dd6 6 302 82 +21ddc 10 130 17 +21dec 6 256 82 +21df2 a 1552 82 +21dfc 4 131 17 +21e00 2 1552 82 +21e02 6 131 17 +21e08 e 1552 82 +21e16 4 131 17 +21e1a 6 302 82 +21e20 10 131 17 +21e30 6 256 82 +21e36 a 132 17 +21e40 a 134 17 +21e4a 4 1139 87 +21e4e 2 277 82 +21e50 2 134 17 +21e52 18 134 17 +21e6a 14 134 17 +21e7e 6 134 17 +21e84 8 134 17 +21e8c 6 85 79 +21e92 6 134 17 +21e98 4 156 137 +21e9c 6 256 82 +21ea2 2 135 17 +21ea4 2 1512 82 +21ea6 2 135 17 +21ea8 e 1512 82 +21eb6 4 135 17 +21eba 6 302 82 +21ec0 10 135 17 +21ed0 6 256 82 +21ed6 2 136 17 +21ed8 2 1512 82 +21eda 2 136 17 +21edc 12 1512 82 +21eee 4 136 17 +21ef2 6 302 82 +21ef8 10 136 17 +21f08 6 256 82 +21f0e a 137 17 +21f18 e 1552 82 +21f26 4 137 17 +21f2a 6 302 82 +21f30 12 137 17 +21f42 6 137 17 +21f48 8 137 17 +21f50 6 85 79 +21f56 8 137 17 +21f5e 6 256 82 +21f64 a 138 17 +21f6e 10 140 17 +21f7e 2 277 82 +21f80 4 1139 87 +21f84 2 140 17 +21f86 18 140 17 +21f9e a 140 17 +21fa8 2 140 17 +21faa a 140 17 +21fb4 6 140 17 +21fba 8 140 17 +21fc2 6 85 79 +21fc8 6 140 17 +21fce 6 156 137 +21fd4 6 256 82 +21fda 6 44 17 +21fe0 94 141 17 +FUNC 22074 268 0 LineReaderTest_MaxLength_Test::TestBody +22074 a 143 17 +2207e 4 143 17 +22082 4 145 17 +22086 2 143 17 +22088 8 145 17 +22090 4 143 17 +22094 4 145 17 +22098 e 66 52 +220a6 a 67 52 +220b0 c 68 52 +220bc 4 82 52 +220c0 4 1139 87 +220c4 2 82 52 +220c6 2 277 82 +220c8 2 82 52 +220ca 2 277 82 +220cc a 1139 87 +220d6 2 147 17 +220d8 16 147 17 +220ee 12 147 17 +22100 6 256 82 +22106 4 49 16 +2210a 4 152 17 +2210e 2 49 16 +22110 8 152 17 +22118 8 49 16 +22120 6 152 17 +22126 4 1139 87 +2212a 2 277 82 +2212c 2 152 17 +2212e 18 152 17 +22146 12 152 17 +22158 4 153 17 +2215c 6 256 82 +22162 6 1512 82 +22168 2 153 17 +2216a e 1512 82 +22178 4 153 17 +2217c 6 302 82 +22182 10 153 17 +22192 6 256 82 +22198 12 154 17 +221aa 2 277 82 +221ac 4 1139 87 +221b0 2 154 17 +221b2 18 154 17 +221ca 14 154 17 +221de 6 154 17 +221e4 8 154 17 +221ec 6 85 79 +221f2 6 154 17 +221f8 8 156 137 +22200 6 256 82 +22206 8 155 17 +2220e 2 1552 82 +22210 2 155 17 +22212 2 1552 82 +22214 4 155 17 +22218 e 1552 82 +22226 4 155 17 +2222a 6 302 82 +22230 12 155 17 +22242 6 155 17 +22248 8 155 17 +22250 6 85 79 +22256 6 155 17 +2225c 6 256 82 +22262 4 44 17 +22266 6 256 82 +2226c 6 44 17 +22272 6a 156 17 +FUNC 222dc 18 0 LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test::~LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test +222dc 2 65 20 +222de 16 65 20 +FUNC 222f4 12 0 LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test::~LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test +222f4 2 65 20 +222f6 6 65 20 +222fc 6 65 20 +22302 4 65 20 +FUNC 22308 18 0 LinuxCoreDumperTest_BuildProcPath_Test::~LinuxCoreDumperTest_BuildProcPath_Test +22308 2 42 20 +2230a 16 42 20 +FUNC 22320 12 0 LinuxCoreDumperTest_BuildProcPath_Test::~LinuxCoreDumperTest_BuildProcPath_Test +22320 2 42 20 +22322 6 42 20 +22328 6 42 20 +2232e 4 42 20 +FUNC 22334 20 0 testing::internal::TestFactoryImpl::CreateTest +22334 2 486 85 +22336 8 486 85 +2233e 6 65 20 +22344 2 486 85 +22346 6 65 20 +2234c 8 486 85 +FUNC 22354 20 0 testing::internal::TestFactoryImpl::CreateTest +22354 2 486 85 +22356 8 486 85 +2235e 6 42 20 +22364 2 486 85 +22366 6 42 20 +2236c 8 486 85 +FUNC 22374 24 0 google_breakpad::LinuxCoreDumper::~LinuxCoreDumper +22374 4 43 19 +22378 c 43 19 +22384 4 43 19 +22388 6 43 19 +2238e a 43 19 +FUNC 22398 3b8 0 LinuxCoreDumperTest_BuildProcPath_Test::TestBody +22398 a 42 20 +223a2 6 42 20 +223a8 4 44 20 +223ac 2 42 20 +223ae 4 43 20 +223b2 2 44 20 +223b4 2 43 20 +223b6 22 44 20 +223d8 4 45 20 +223dc 2 47 20 +223de 4 45 20 +223e2 2 45 20 +223e4 a 45 20 +223ee e 47 20 +223fc 12 50 20 +2240e e 51 20 +2241c 2 277 82 +2241e 2 1139 87 +22420 4 277 82 +22424 2 51 20 +22426 16 51 20 +2243c c 51 20 +22448 4 51 20 +2244c a 51 20 +22456 6 51 20 +2245c 8 51 20 +22464 6 85 79 +2246a 6 51 20 +22470 6 156 137 +22476 a 256 82 +22480 16 52 20 +22496 2 1144 87 +22498 6 298 82 +2249e 4 298 82 +224a2 a 52 20 +224ac 4 52 20 +224b0 a 52 20 +224ba 6 52 20 +224c0 8 52 20 +224c8 6 85 79 +224ce 6 52 20 +224d4 6 256 82 +224da e 54 20 +224e8 2 1139 87 +224ea 6 54 20 +224f0 2 277 82 +224f2 2 1139 87 +224f4 2 54 20 +224f6 16 54 20 +2250c c 54 20 +22518 4 54 20 +2251c a 54 20 +22526 6 54 20 +2252c 8 54 20 +22534 6 85 79 +2253a 6 54 20 +22540 6 156 137 +22546 6 256 82 +2254c e 55 20 +2255a 2 1139 87 +2255c 6 55 20 +22562 2 277 82 +22564 2 1139 87 +22566 2 55 20 +22568 16 55 20 +2257e c 55 20 +2258a 4 55 20 +2258e a 55 20 +22598 6 55 20 +2259e 8 55 20 +225a6 6 85 79 +225ac 6 55 20 +225b2 6 156 137 +225b8 6 256 82 +225be c 56 20 +225ca 2 1139 87 +225cc 6 56 20 +225d2 2 277 82 +225d4 2 1139 87 +225d6 2 56 20 +225d8 16 56 20 +225ee c 56 20 +225fa 4 56 20 +225fe a 56 20 +22608 6 56 20 +2260e 8 56 20 +22616 6 85 79 +2261c 6 56 20 +22622 6 156 137 +22628 6 256 82 +2262e 6 59 20 +22634 2 61 20 +22636 4 59 20 +2263a e 60 20 +22648 8 62 20 +22650 4 61 20 +22654 a 62 20 +2265e 2 277 82 +22660 2 1139 87 +22662 2 62 20 +22664 18 62 20 +2267c a 62 20 +22686 2 62 20 +22688 a 62 20 +22692 6 62 20 +22698 8 62 20 +226a0 6 85 79 +226a6 6 62 20 +226ac 6 156 137 +226b2 6 256 82 +226b8 6 62 20 +226be 92 63 20 +FUNC 22750 70c 0 LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test::TestBody +22750 14 65 20 +22764 2 65 20 +22766 4 66 20 +2276a 2 65 20 +2276c 4 66 20 +22770 a 67 20 +2277a 12 69 20 +2278c 2 70 20 +2278e 2 75 20 +22790 6 73 20 +22796 4 75 20 +2279a 4 77 20 +2279e 4 75 20 +227a2 4 73 20 +227a6 c 77 20 +227b2 2 1139 87 +227b4 4 277 82 +227b8 4 1139 87 +227bc 2 77 20 +227be 20 77 20 +227de a 77 20 +227e8 2 77 20 +227ea c 77 20 +227f6 6 77 20 +227fc 8 77 20 +22804 6 85 79 +2280a 6 77 20 +22810 6 156 137 +22816 e 256 82 +22824 c 80 20 +22830 c 81 20 +2283c a 85 20 +22846 4 85 20 +2284a 14 87 20 +2285e 12 92 20 +22870 6 94 20 +22876 4 277 82 +2287a 2 1139 87 +2287c 2 94 20 +2287e 1c 94 20 +2289a c 94 20 +228a6 4 94 20 +228aa a 94 20 +228b4 6 94 20 +228ba 8 94 20 +228c2 6 85 79 +228c8 6 94 20 +228ce 6 156 137 +228d4 6 256 82 +228da 6 96 20 +228e0 2 1139 87 +228e2 2 256 82 +228e4 2 277 82 +228e6 2 1139 87 +228e8 2 96 20 +228ea 1e 96 20 +22908 c 96 20 +22914 4 96 20 +22918 a 96 20 +22922 6 96 20 +22928 8 96 20 +22930 6 85 79 +22936 6 96 20 +2293c 6 156 137 +22942 6 256 82 +22948 6 99 20 +2294e 2 1139 87 +22950 2 256 82 +22952 2 277 82 +22954 2 1139 87 +22956 2 99 20 +22958 1e 99 20 +22976 c 99 20 +22982 4 99 20 +22986 a 99 20 +22990 6 99 20 +22996 8 99 20 +2299e 6 85 79 +229a4 6 99 20 +229aa 6 156 137 +229b0 6 256 82 +229b6 6 100 20 +229bc 2 1139 87 +229be 2 256 82 +229c0 2 277 82 +229c2 2 1139 87 +229c4 2 100 20 +229c6 1e 100 20 +229e4 c 100 20 +229f0 4 100 20 +229f4 a 100 20 +229fe 6 100 20 +22a04 8 100 20 +22a0c 6 85 79 +22a12 6 100 20 +22a18 6 156 137 +22a1e 6 256 82 +22a24 a 104 20 +22a2e 2 256 82 +22a30 2 104 20 +22a32 2 1481 82 +22a34 8 1482 82 +22a3c 10 1487 82 +22a4c 6 104 20 +22a52 2 1144 87 +22a54 6 298 82 +22a5a 4 298 82 +22a5e a 104 20 +22a68 4 104 20 +22a6c a 104 20 +22a76 6 104 20 +22a7c 8 104 20 +22a84 6 85 79 +22a8a 6 104 20 +22a90 8 256 82 +22a98 4 1481 82 +22a9c 4 256 82 +22aa0 2 1481 82 +22aa2 2 105 20 +22aa4 2 1481 82 +22aa6 8 1482 82 +22aae 12 1487 82 +22ac0 6 105 20 +22ac6 4 1144 87 +22aca 6 298 82 +22ad0 4 298 82 +22ad4 14 105 20 +22ae8 6 105 20 +22aee 8 105 20 +22af6 6 85 79 +22afc 6 105 20 +22b02 6 256 82 +22b08 c 106 20 +22b14 2 1481 82 +22b16 4 106 20 +22b1a 2 1481 82 +22b1c 8 1482 82 +22b24 10 1487 82 +22b34 6 106 20 +22b3a 2 1144 87 +22b3c 6 298 82 +22b42 4 298 82 +22b46 14 106 20 +22b5a 6 106 20 +22b60 8 107 20 +22b68 6 85 79 +22b6e 6 106 20 +22b74 a 256 82 +22b7e 6 192 144 +22b84 4 1481 82 +22b88 2 192 144 +22b8a 2 1481 82 +22b8c 2 109 20 +22b8e 2 1481 82 +22b90 8 1482 82 +22b98 12 1487 82 +22baa 6 109 20 +22bb0 2 1144 87 +22bb2 6 298 82 +22bb8 4 298 82 +22bbc 12 109 20 +22bce 6 109 20 +22bd4 8 109 20 +22bdc 6 85 79 +22be2 6 109 20 +22be8 2 256 82 +22bea 4 110 20 +22bee 4 256 82 +22bf2 2 112 20 +22bf4 4 115 20 +22bf8 6 112 20 +22bfe 4 115 20 +22c02 6 112 20 +22c08 2 115 20 +22c0a 4 112 20 +22c0e 2 112 20 +22c10 2 115 20 +22c12 4 112 20 +22c16 a 112 20 +22c20 2 1139 87 +22c22 4 277 82 +22c26 2 1139 87 +22c28 2 112 20 +22c2a 12 112 20 +22c3c 14 112 20 +22c50 6 112 20 +22c56 8 112 20 +22c5e 6 85 79 +22c64 6 112 20 +22c6a 6 156 137 +22c70 6 256 82 +22c76 c 115 20 +22c82 2 1139 87 +22c84 2 256 82 +22c86 2 277 82 +22c88 2 1139 87 +22c8a 2 115 20 +22c8c 16 115 20 +22ca2 16 115 20 +22cb8 6 115 20 +22cbe 8 115 20 +22cc6 6 85 79 +22ccc 6 115 20 +22cd2 6 156 137 +22cd8 a 256 82 +22ce2 4 116 20 +22ce6 2 1481 82 +22ce8 2 256 82 +22cea 2 1481 82 +22cec 2 116 20 +22cee 2 1481 82 +22cf0 8 1482 82 +22cf8 14 1487 82 +22d0c 4 116 20 +22d10 2 1144 87 +22d12 6 298 82 +22d18 4 298 82 +22d1c 12 116 20 +22d2e 6 116 20 +22d34 8 116 20 +22d3c 6 85 79 +22d42 6 116 20 +22d48 2 256 82 +22d4a 4 110 20 +22d4e 4 256 82 +22d52 8 110 20 +22d5a 6 92 20 +22d60 c 156 137 +22d6c 6 70 20 +22d72 ea 118 20 +FUNC 22e5c 12 0 google_breakpad::LinuxCoreDumper::~LinuxCoreDumper +22e5c 2 43 19 +22e5e 6 43 19 +22e64 6 43 19 +22e6a 4 43 19 +FUNC 22e6e c 0 LinuxPtraceDumperChildTest::SetUp +22e6e 2 74 25 +22e70 2 74 25 +22e72 8 75 25 +FUNC 22e7c 18 0 LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test::~LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test +22e7c 2 364 25 +22e7e 16 364 25 +FUNC 22e94 12 0 LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test::~LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test +22e94 2 364 25 +22e96 6 364 25 +22e9c 6 364 25 +22ea2 4 364 25 +FUNC 22ea8 18 0 LinuxPtraceDumperChildTest_BuildProcPath_Test::~LinuxPtraceDumperChildTest_BuildProcPath_Test +FUNC 22ea8 18 0 LinuxPtraceDumperChildTest_FileIDsMatch_Test::~LinuxPtraceDumperChildTest_FileIDsMatch_Test +FUNC 22ea8 18 0 LinuxPtraceDumperChildTest_FindMappings_Test::~LinuxPtraceDumperChildTest_FindMappings_Test +22ea8 2 125 25 +22eaa 2 125 25 +22eac c 72 25 +22eb8 8 134 25 +FUNC 22ea8 18 0 LinuxPtraceDumperChildTest_Setup_Test::~LinuxPtraceDumperChildTest_Setup_Test +FUNC 22ea8 18 0 LinuxPtraceDumperChildTest_ThreadList_Test::~LinuxPtraceDumperChildTest_ThreadList_Test +FUNC 22ec0 12 0 LinuxPtraceDumperChildTest_BuildProcPath_Test::~LinuxPtraceDumperChildTest_BuildProcPath_Test +FUNC 22ec0 12 0 LinuxPtraceDumperChildTest_FileIDsMatch_Test::~LinuxPtraceDumperChildTest_FileIDsMatch_Test +22ec0 2 246 25 +22ec2 6 125 25 +22ec8 6 125 25 +22ece 4 246 25 +FUNC 22ec0 12 0 LinuxPtraceDumperChildTest_FindMappings_Test::~LinuxPtraceDumperChildTest_FindMappings_Test +FUNC 22ec0 12 0 LinuxPtraceDumperChildTest_Setup_Test::~LinuxPtraceDumperChildTest_Setup_Test +FUNC 22ec0 12 0 LinuxPtraceDumperChildTest_ThreadList_Test::~LinuxPtraceDumperChildTest_ThreadList_Test +FUNC 22ed4 20 0 testing::internal::TestFactoryImpl::CreateTest +22ed4 2 486 85 +22ed6 8 486 85 +22ede 4 72 25 +22ee2 2 325 25 +22ee4 2 486 85 +22ee6 6 325 25 +22eec 8 486 85 +FUNC 22ef4 20 0 testing::internal::TestFactoryImpl::CreateTest +22ef4 2 486 85 +22ef6 8 486 85 +22efe 4 72 25 +22f02 2 134 25 +22f04 2 486 85 +22f06 6 134 25 +22f0c 8 486 85 +FUNC 22f14 20 0 testing::internal::TestFactoryImpl::CreateTest +22f14 2 486 85 +22f16 8 486 85 +22f1e 4 72 25 +22f22 2 125 25 +22f24 2 486 85 +22f26 6 125 25 +22f2c 8 486 85 +FUNC 22f34 20 0 testing::internal::TestFactoryImpl::CreateTest +22f34 2 486 85 +22f36 8 486 85 +22f3e 4 72 25 +22f42 2 246 25 +22f44 2 486 85 +22f46 6 246 25 +22f4c 8 486 85 +FUNC 22f54 20 0 testing::internal::TestFactoryImpl::CreateTest +22f54 2 486 85 +22f56 8 486 85 +22f5e 4 72 25 +22f62 2 121 25 +22f64 2 486 85 +22f66 6 121 25 +22f6c 8 486 85 +FUNC 22f74 20 0 testing::internal::TestFactoryImpl::CreateTest +22f74 2 486 85 +22f76 8 486 85 +22f7e 6 364 25 +22f84 2 486 85 +22f86 6 364 25 +22f8c 8 486 85 +FUNC 22f94 144 0 LinuxPtraceDumperChildTest::TestBody +22f94 e 85 25 +22fa2 2 85 25 +22fa4 2 86 25 +22fa6 2 85 25 +22fa8 6 86 25 +22fae 6 88 25 +22fb4 4 89 25 +22fb8 2 90 25 +22fba 4 90 25 +22fbe a 90 25 +22fc8 2 90 25 +22fca 6 90 25 +22fd0 6 93 25 +22fd6 4 1139 87 +22fda 4 277 82 +22fde c 1139 87 +22fea 2 93 25 +22fec 18 93 25 +23004 4 93 25 +23008 2 93 25 +2300a e 93 25 +23018 6 93 25 +2301e 8 93 25 +23026 6 85 79 +2302c 6 93 25 +23032 6 156 137 +23038 e 256 82 +23046 a 95 25 +23050 8 96 25 +23058 14 97 25 +2306c 4 98 25 +23070 16 99 25 +23086 6 99 25 +2308c 8 99 25 +23094 6 85 79 +2309a 6 99 25 +230a0 38 101 25 +FUNC 230d8 44 0 LinuxPtraceDumperMappingsTest_MergedMappings_Test::~LinuxPtraceDumperMappingsTest_MergedMappings_Test +230d8 2 226 25 +230da 2 176 25 +230dc 2 156 25 +230de 4 176 25 +230e2 2 226 25 +230e4 2 176 25 +230e6 2 156 25 +230e8 6 157 25 +230ee 6 158 25 +230f4 4 159 25 +230f8 8 156 137 +23100 e 72 25 +2310e e 226 25 +FUNC 2311c 12 0 LinuxPtraceDumperMappingsTest_MergedMappings_Test::~LinuxPtraceDumperMappingsTest_MergedMappings_Test +2311c 2 226 25 +2311e 6 226 25 +23124 6 226 25 +2312a 4 226 25 +FUNC 23130 48 0 testing::internal::TestFactoryImpl::CreateTest +23130 2 486 85 +23132 8 486 85 +2313a 4 72 25 +2313e 4 176 25 +23142 2 124 137 +23144 8 176 25 +2314c 2 120 137 +2314e 2 481 106 +23150 4 124 137 +23154 4 101 108 +23158 2 486 85 +2315a 2 101 108 +2315c 8 154 25 +23164 2 226 25 +23166 2 154 25 +23168 6 226 25 +2316e a 486 85 +FUNC 23178 2b8 0 LinuxPtraceDumperMappingsTest::SetUp +23178 8 185 25 +23180 4 185 25 +23184 2 186 25 +23186 2 185 25 +23188 4 186 25 +2318c 2 185 25 +2318e 2 186 25 +23190 2 185 25 +23192 4 186 25 +23196 e 348 136 +231a4 2 400 136 +231a6 4 243 135 +231aa 2 400 136 +231ac 4 244 135 +231b0 2 168 145 +231b2 8 168 145 +231ba 6 246 135 +231c0 4 803 136 +231c4 2 168 145 +231c6 2 806 136 +231c8 2 168 145 +231ca 8 806 136 +231d2 2 168 145 +231d4 6 168 145 +231da 4 400 136 +231de 2 250 135 +231e0 2 400 136 +231e2 8 250 135 +231ea 6 156 137 +231f0 c 187 25 +231fc 14 188 25 +23210 6 188 25 +23216 c 333 127 +23222 8 188 25 +2322a 6 85 79 +23230 6 188 25 +23236 2 188 25 +23238 6 194 25 +2323e 2 196 25 +23240 4 194 25 +23244 6 196 25 +2324a c 197 25 +23256 2 196 25 +23258 1a 197 25 +23272 6 302 82 +23278 12 197 25 +2328a 6 197 25 +23290 c 333 127 +2329c a 131 79 +232a6 c 333 127 +232b2 4 198 25 +232b6 2 198 25 +232b8 4 198 25 +232bc 4 150 79 +232c0 2 333 127 +232c2 2 150 79 +232c4 8 333 127 +232cc 8 198 25 +232d4 6 85 79 +232da 8 197 25 +232e2 6 256 82 +232e8 8 205 25 +232f0 4 195 25 +232f4 10 205 25 +23304 e 277 82 +23312 4 1139 87 +23316 2 206 25 +23318 16 206 25 +2332e 12 206 25 +23340 6 256 82 +23346 2 209 25 +23348 2 220 25 +2334a 2 162 25 +2334c 4 163 25 +23350 4 164 25 +23354 10 220 25 +23364 6 277 82 +2336a 4 1139 87 +2336e 4 277 82 +23372 2 221 25 +23374 16 221 25 +2338a 14 221 25 +2339e 6 221 25 +233a4 8 221 25 +233ac 6 85 79 +233b2 6 221 25 +233b8 6 156 137 +233be e 256 82 +233cc 6 223 25 +233d2 5e 224 25 +FUNC 23430 1c 0 google_breakpad::LinuxPtraceDumper::~LinuxPtraceDumper +23430 4 42 24 +23434 18 42 24 +FUNC 2344c 1a 0 LinuxPtraceDumperChildTest_Setup_Test::RealTestBody +2344c 4 121 25 +23450 6 122 25 +23456 6 122 25 +2345c 6 122 25 +23462 4 123 25 +FUNC 23468 1d0 0 LinuxPtraceDumperChildTest_FindMappings_Test::RealTestBody +23468 8 125 25 +23470 6 125 25 +23476 2 126 25 +23478 2 125 25 +2347a 6 126 25 +23480 6 126 25 +23486 6 127 25 +2348c 2 1139 87 +2348e 4 277 82 +23492 8 1139 87 +2349a 2 127 25 +2349c 1a 127 25 +234b6 12 127 25 +234c8 6 256 82 +234ce c 129 25 +234da 6 277 82 +234e0 2 1139 87 +234e2 4 277 82 +234e6 2 129 25 +234e8 1a 129 25 +23502 12 129 25 +23514 6 256 82 +2351a c 130 25 +23526 6 277 82 +2352c 2 1139 87 +2352e 4 277 82 +23532 2 130 25 +23534 1a 130 25 +2354e 12 130 25 +23560 6 256 82 +23566 e 131 25 +23574 4 277 82 +23578 2 1139 87 +2357a 2 131 25 +2357c 1a 131 25 +23596 10 131 25 +235a6 4 131 25 +235aa 4 131 25 +235ae 6 131 25 +235b4 8 131 25 +235bc 6 85 79 +235c2 6 131 25 +235c8 6 156 137 +235ce c 256 82 +235da 5e 132 25 +FUNC 23638 400 0 LinuxPtraceDumperChildTest_BuildProcPath_Test::RealTestBody +23638 a 246 25 +23642 6 246 25 +23648 2 250 25 +2364a 2 246 25 +2364c 6 247 25 +23652 a 248 25 +2365c 12 250 25 +2366e 12 253 25 +23680 e 254 25 +2368e 6 277 82 +23694 4 1139 87 +23698 2 254 25 +2369a 16 254 25 +236b0 a 254 25 +236ba 4 254 25 +236be a 254 25 +236c8 6 254 25 +236ce 8 254 25 +236d6 6 85 79 +236dc 6 254 25 +236e2 6 156 137 +236e8 8 256 82 +236f0 18 255 25 +23708 6 302 82 +2370e c 255 25 +2371a 4 255 25 +2371e 8 255 25 +23726 6 255 25 +2372c 8 255 25 +23734 6 85 79 +2373a 6 255 25 +23740 6 256 82 +23746 e 257 25 +23754 2 1139 87 +23756 6 257 25 +2375c 2 277 82 +2375e 2 1139 87 +23760 2 257 25 +23762 16 257 25 +23778 c 257 25 +23784 4 257 25 +23788 c 257 25 +23794 6 257 25 +2379a 8 257 25 +237a2 6 85 79 +237a8 6 257 25 +237ae 6 156 137 +237b4 6 256 82 +237ba e 258 25 +237c8 2 1139 87 +237ca 6 258 25 +237d0 2 277 82 +237d2 2 1139 87 +237d4 2 258 25 +237d6 16 258 25 +237ec c 258 25 +237f8 4 258 25 +237fc c 258 25 +23808 6 258 25 +2380e 8 258 25 +23816 6 85 79 +2381c 6 258 25 +23822 6 156 137 +23828 6 256 82 +2382e e 259 25 +2383c 2 1139 87 +2383e 6 259 25 +23844 2 277 82 +23846 2 1139 87 +23848 2 259 25 +2384a 16 259 25 +23860 c 259 25 +2386c 4 259 25 +23870 c 259 25 +2387c 6 259 25 +23882 8 259 25 +2388a 6 85 79 +23890 6 259 25 +23896 6 156 137 +2389c 6 256 82 +238a2 c 260 25 +238ae 2 1139 87 +238b0 6 260 25 +238b6 2 277 82 +238b8 2 1139 87 +238ba 2 260 25 +238bc 16 260 25 +238d2 c 260 25 +238de 4 260 25 +238e2 c 260 25 +238ee 6 260 25 +238f4 8 260 25 +238fc 6 85 79 +23902 6 260 25 +23908 6 156 137 +2390e 4 265 25 +23912 6 256 82 +23918 a 264 25 +23922 8 266 25 +2392a 4 265 25 +2392e a 266 25 +23938 2 277 82 +2393a 4 1139 87 +2393e 2 266 25 +23940 18 266 25 +23958 a 266 25 +23962 4 266 25 +23966 c 266 25 +23972 6 266 25 +23978 8 266 25 +23980 6 85 79 +23986 6 266 25 +2398c 6 156 137 +23992 6 256 82 +23998 6 266 25 +2399e 9a 267 25 +FUNC 23a38 46c 0 LinuxPtraceDumperChildTest_FileIDsMatch_Test::RealTestBody +23a38 12 325 25 +23a4a 8 325 25 +23a52 2 60 49 +23a54 2 325 25 +23a56 2 60 49 +23a58 2 277 82 +23a5a a 60 49 +23a64 2 277 82 +23a66 4 60 49 +23a6a 2 1139 87 +23a6c 6 277 82 +23a72 8 1139 87 +23a7a 2 330 25 +23a7c 18 330 25 +23a94 18 330 25 +23aac 6 330 25 +23ab2 8 330 25 +23aba 6 85 79 +23ac0 6 330 25 +23ac6 6 156 137 +23acc e 256 82 +23ada 6 332 25 +23ae0 6 332 25 +23ae6 a 333 25 +23af0 4 277 82 +23af4 4 1139 87 +23af8 2 333 25 +23afa 18 333 25 +23b12 c 333 25 +23b1e 2 333 25 +23b20 c 333 25 +23b2c 6 333 25 +23b32 8 333 25 +23b3a 6 85 79 +23b40 6 333 25 +23b46 6 156 137 +23b4c a 256 82 +23b56 8 192 144 +23b5e 6 75 54 +23b64 4 76 54 +23b68 a 78 54 +23b72 a 78 54 +23b7c 2 79 54 +23b7e 2 80 54 +23b80 2 81 54 +23b82 6 82 54 +23b88 4 83 54 +23b8c 4 80 54 +23b90 4 86 54 +23b94 10 90 54 +23ba4 2 3454 97 +23ba6 4 122 54 +23baa 1c 3454 97 +23bc6 4 3454 97 +23bca 6 3454 97 +23bd0 4 124 54 +23bd4 4 134 54 +23bd8 4 135 54 +23bdc 4 96 54 +23be0 4 136 54 +23be4 12 96 54 +23bf6 4 97 54 +23bfa 2 98 54 +23bfc 8 98 54 +23c04 4 98 54 +23c08 4 100 54 +23c0c a 120 142 +23c16 4 337 25 +23c1a 4 192 144 +23c1e 4 337 25 +23c22 e 339 25 +23c30 6 337 25 +23c36 4 335 25 +23c3a 2 340 25 +23c3c 4 1139 87 +23c40 6 277 82 +23c46 8 1139 87 +23c4e 2 344 25 +23c50 16 344 25 +23c66 c 344 25 +23c72 2 344 25 +23c74 c 344 25 +23c80 6 344 25 +23c86 8 344 25 +23c8e 6 85 79 +23c94 6 344 25 +23c9a 6 156 137 +23ca0 e 256 82 +23cae 14 348 25 +23cc2 4 277 82 +23cc6 4 1139 87 +23cca 2 348 25 +23ccc 16 348 25 +23ce2 c 348 25 +23cee 4 348 25 +23cf2 c 348 25 +23cfe 6 348 25 +23d04 8 349 25 +23d0c 6 85 79 +23d12 6 348 25 +23d18 6 156 137 +23d1e 4 350 25 +23d22 4 256 82 +23d26 2 350 25 +23d28 4 256 82 +23d2c 4 351 25 +23d30 8 350 25 +23d38 8 351 25 +23d40 2 1139 87 +23d42 4 277 82 +23d46 4 1139 87 +23d4a 2 351 25 +23d4c 16 351 25 +23d62 c 351 25 +23d6e 4 351 25 +23d72 c 351 25 +23d7e 6 351 25 +23d84 8 351 25 +23d8c 6 85 79 +23d92 6 351 25 +23d98 6 156 137 +23d9e 2 355 25 +23da0 8 256 82 +23da8 a 355 25 +23db2 a 357 25 +23dbc 18 358 25 +23dd4 6 302 82 +23dda e 358 25 +23de8 4 358 25 +23dec 8 358 25 +23df4 6 358 25 +23dfa 8 358 25 +23e02 6 85 79 +23e08 6 358 25 +23e0e 8 256 82 +23e16 c 156 137 +23e22 82 359 25 +FUNC 23ea4 2b0 0 LinuxPtraceDumperChildTest_ThreadList_Test::RealTestBody +23ea4 8 134 25 +23eac 6 134 25 +23eb2 4 135 25 +23eb6 2 134 25 +23eb8 6 135 25 +23ebe 6 135 25 +23ec4 6 136 25 +23eca 4 1139 87 +23ece 4 277 82 +23ed2 8 1139 87 +23eda 2 136 25 +23edc 1a 136 25 +23ef6 12 136 25 +23f08 6 256 82 +23f0e 6 192 144 +23f14 2 138 25 +23f16 2 192 144 +23f18 4 138 25 +23f1c 2 1621 82 +23f1e a 1621 82 +23f28 8 1583 82 +23f30 c 1382 82 +23f3c 4 1583 82 +23f40 a 1583 82 +23f4a 6 1583 82 +23f50 8 1583 82 +23f58 6 1583 82 +23f5e 8 1583 82 +23f66 6 1583 82 +23f6c a 1584 82 +23f76 8 1382 82 +23f7e a 1584 82 +23f88 6 306 82 +23f8e c 333 127 +23f9a 8 306 82 +23fa2 4 1382 82 +23fa6 6 85 79 +23fac 8 1382 82 +23fb4 a 1585 82 +23fbe 6 1585 82 +23fc4 c 156 137 +23fd0 6 256 82 +23fd6 8 138 25 +23fde 6 302 82 +23fe4 12 138 25 +23ff6 6 138 25 +23ffc 8 138 25 +24004 6 85 79 +2400a 6 138 25 +24010 6 256 82 +24016 2 139 25 +24018 4 256 82 +2401c 2 140 25 +2401e 2 1139 87 +24020 6 192 144 +24026 6 140 25 +2402c 6 141 25 +24032 4 141 25 +24036 6 141 25 +2403c 4 142 25 +24040 4 277 82 +24044 4 1139 87 +24048 2 142 25 +2404a 1a 142 25 +24064 12 142 25 +24076 6 256 82 +2407c 2 143 25 +2407e 6 140 25 +24084 2 1139 87 +24086 4 277 82 +2408a 2 1139 87 +2408c 2 146 25 +2408e 1a 146 25 +240a8 14 146 25 +240bc 6 146 25 +240c2 8 146 25 +240ca 6 85 79 +240d0 6 146 25 +240d6 6 156 137 +240dc c 256 82 +240e8 6c 147 25 +FUNC 24154 2a8 0 LinuxPtraceDumperMappingsTest_MergedMappings_Test::RealTestBody +24154 8 226 25 +2415c a 226 25 +24166 4 228 25 +2416a 4 228 25 +2416e 2 228 25 +24170 6 228 25 +24176 6 229 25 +2417c 4 1139 87 +24180 6 277 82 +24186 4 1139 87 +2418a 2 229 25 +2418c 18 229 25 +241a4 8 229 25 +241ac 2 229 25 +241ae c 229 25 +241ba 6 229 25 +241c0 8 229 25 +241c8 6 85 79 +241ce 6 229 25 +241d4 8 156 137 +241dc 6 256 82 +241e2 2 1512 82 +241e4 2 230 25 +241e6 16 1512 82 +241fc c 1552 82 +24208 6 192 144 +2420e 8 231 25 +24216 4 232 25 +2421a c 233 25 +24226 6 233 25 +2422c 4 236 25 +24230 6 1512 82 +24236 2 236 25 +24238 e 1512 82 +24246 6 236 25 +2424c 6 302 82 +24252 14 236 25 +24266 6 236 25 +2426c 8 237 25 +24274 6 85 79 +2427a 6 236 25 +24280 6 256 82 +24286 e 238 25 +24294 e 1512 82 +242a2 6 238 25 +242a8 6 302 82 +242ae 14 238 25 +242c2 6 238 25 +242c8 8 238 25 +242d0 6 85 79 +242d6 6 238 25 +242dc 6 256 82 +242e2 c 239 25 +242ee e 1552 82 +242fc 6 239 25 +24302 6 302 82 +24308 12 239 25 +2431a 6 239 25 +24320 8 239 25 +24328 6 85 79 +2432e 6 239 25 +24334 6 256 82 +2433a 6 240 25 +24340 4 231 25 +24344 2 243 25 +24346 14 1512 82 +2435a 2 243 25 +2435c 4 1512 82 +24360 6 243 25 +24366 6 302 82 +2436c 12 243 25 +2437e 6 243 25 +24384 8 243 25 +2438c 6 85 79 +24392 6 243 25 +24398 6 256 82 +2439e 6 243 25 +243a4 58 244 25 +FUNC 243fc 8b4 0 LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test::TestBody +243fc 8 364 25 +24404 4 367 25 +24408 8 364 25 +24410 4 364 25 +24414 c 367 25 +24420 2 364 25 +24422 4 367 25 +24426 e 370 25 +24434 8 370 25 +2443c 2 370 25 +2443e 2 370 25 +24440 4 370 25 +24444 e 370 25 +24452 c 370 25 +2445e 6 302 82 +24464 14 370 25 +24478 6 370 25 +2447e 8 370 25 +24486 6 85 79 +2448c 6 370 25 +24492 a 256 82 +2449c 4 372 25 +244a0 6 373 25 +244a6 2 375 25 +244a8 2 377 25 +244aa 4 375 25 +244ae 6 377 25 +244b4 8 378 25 +244bc 1a 379 25 +244d6 6 379 25 +244dc 2 131 79 +244de a 333 127 +244e8 e 385 25 +244f6 14 390 25 +2450a 6 392 25 +24510 a 392 25 +2451a 1a 393 25 +24534 6 393 25 +2453a 2 131 79 +2453c c 333 127 +24548 2 131 79 +2454a 8 131 79 +24552 2 131 79 +24554 c 333 127 +24560 4 393 25 +24564 2 393 25 +24566 4 393 25 +2456a 4 150 79 +2456e 2 333 127 +24570 2 150 79 +24572 a 333 127 +2457c 8 393 25 +24584 6 85 79 +2458a 6 393 25 +24590 8 156 137 +24598 a 396 25 +245a2 20 1512 82 +245c2 6 401 25 +245c8 8 402 25 +245d0 4 403 25 +245d4 12 405 25 +245e6 4 405 25 +245ea 8 405 25 +245f2 6 256 82 +245f8 2 1139 87 +245fa 8 407 25 +24602 4 1139 87 +24606 4 407 25 +2460a 4 277 82 +2460e 4 407 25 +24612 1e 407 25 +24630 16 407 25 +24646 6 407 25 +2464c 8 407 25 +24654 6 85 79 +2465a 6 407 25 +24660 6 156 137 +24666 8 256 82 +2466e 2 406 25 +24670 2 405 25 +24672 2 406 25 +24674 4 1512 82 +24678 2 406 25 +2467a a 1512 82 +24684 2 405 25 +24686 4 1512 82 +2468a e 406 25 +24698 6 302 82 +2469e 10 406 25 +246ae 6 256 82 +246b4 12 409 25 +246c6 e 1512 82 +246d4 8 409 25 +246dc 6 302 82 +246e2 12 409 25 +246f4 6 409 25 +246fa 8 409 25 +24702 6 85 79 +24708 8 409 25 +24710 6 256 82 +24716 a 399 25 +24720 c 412 25 +2472c 6 417 25 +24732 8 420 25 +2473a 6 421 25 +24740 2 1139 87 +24742 4 277 82 +24746 4 1139 87 +2474a 2 421 25 +2474c 18 421 25 +24764 14 421 25 +24778 6 421 25 +2477e 8 421 25 +24786 6 85 79 +2478c 6 421 25 +24792 6 156 137 +24798 a 256 82 +247a2 2 422 25 +247a4 4 192 144 +247a8 2 422 25 +247aa 4 192 144 +247ae 2 1512 82 +247b0 2 192 144 +247b2 2 1512 82 +247b4 2 192 144 +247b6 2 422 25 +247b8 e 1512 82 +247c6 6 422 25 +247cc 6 302 82 +247d2 12 422 25 +247e4 6 422 25 +247ea 8 422 25 +247f2 6 85 79 +247f8 6 422 25 +247fe 6 256 82 +24804 6 423 25 +2480a 2 1139 87 +2480c 2 256 82 +2480e 2 277 82 +24810 2 1139 87 +24812 2 423 25 +24814 18 423 25 +2482c 8 423 25 +24834 2 423 25 +24836 c 423 25 +24842 6 423 25 +24848 8 423 25 +24850 6 85 79 +24856 6 423 25 +2485c 6 156 137 +24862 4 426 25 +24866 6 256 82 +2486c 12 427 25 +2487e 6 427 25 +24884 c 430 25 +24890 6 192 144 +24896 2 427 25 +24898 2 192 144 +2489a a 426 25 +248a4 8 427 25 +248ac 2 1139 87 +248ae 2 277 82 +248b0 2 1139 87 +248b2 2 427 25 +248b4 14 427 25 +248c8 a 427 25 +248d2 4 427 25 +248d6 c 427 25 +248e2 6 427 25 +248e8 8 427 25 +248f0 6 85 79 +248f6 6 427 25 +248fc 6 156 137 +24902 a 256 82 +2490c c 430 25 +24918 2 1139 87 +2491a 2 277 82 +2491c 2 1139 87 +2491e 2 430 25 +24920 14 430 25 +24934 a 430 25 +2493e 4 430 25 +24942 c 430 25 +2494e 6 430 25 +24954 8 431 25 +2495c 6 85 79 +24962 6 430 25 +24968 6 156 137 +2496e 6 256 82 +24974 1a 452 25 +2498e 16 1512 82 +249a4 4 453 25 +249a8 6 302 82 +249ae c 453 25 +249ba 2 453 25 +249bc 8 453 25 +249c4 6 453 25 +249ca 8 453 25 +249d2 6 85 79 +249d8 6 453 25 +249de 6 256 82 +249e4 c8 426 25 +24aac 4 455 25 +24ab0 2 1139 87 +24ab2 2 277 82 +24ab4 4 1139 87 +24ab8 2 455 25 +24aba 18 455 25 +24ad2 8 455 25 +24ada 4 455 25 +24ade c 455 25 +24aea 6 455 25 +24af0 8 455 25 +24af8 6 85 79 +24afe 6 455 25 +24b04 6 156 137 +24b0a 8 256 82 +24b12 8 456 25 +24b1a 4 460 25 +24b1e 4 460 25 +24b22 2 460 25 +24b24 12 460 25 +24b36 4 460 25 +24b3a 8 460 25 +24b42 6 256 82 +24b48 4 461 25 +24b4c 2 1139 87 +24b4e e 461 25 +24b5c 2 1139 87 +24b5e 2 277 82 +24b60 4 461 25 +24b64 18 461 25 +24b7c 14 461 25 +24b90 6 461 25 +24b96 8 461 25 +24b9e 6 85 79 +24ba4 6 461 25 +24baa 6 156 137 +24bb0 10 256 82 +24bc0 8 462 25 +24bc8 4 460 25 +24bcc 8 460 25 +24bd4 10 460 25 +24be4 6 460 25 +24bea 6 302 82 +24bf0 10 460 25 +24c00 6 256 82 +24c06 8 462 25 +24c0e 4 1512 82 +24c12 8 462 25 +24c1a 10 1512 82 +24c2a 6 462 25 +24c30 6 302 82 +24c36 12 462 25 +24c48 6 462 25 +24c4e 8 462 25 +24c56 6 85 79 +24c5c 8 462 25 +24c64 4c 463 25 +FUNC 24cb0 12 0 google_breakpad::LinuxPtraceDumper::~LinuxPtraceDumper +24cb0 2 42 24 +24cb2 6 42 24 +24cb8 6 42 24 +24cbe 4 42 24 +FUNC 24cc4 20 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithPath_Test>::CreateTest +24cc4 2 486 85 +24cc6 8 486 85 +24cce 6 67 27 +24cd4 2 486 85 +24cd6 6 67 27 +24cdc 8 486 85 +FUNC 24ce4 20 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_SetupWithFD_Test>::CreateTest +24ce4 2 486 85 +24ce6 8 486 85 +24cee 6 96 27 +24cf4 2 486 85 +24cf6 6 96 27 +24cfc 8 486 85 +FUNC 24d04 20 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfo_Test>::CreateTest +24d04 2 486 85 +24d06 8 486 85 +24d0e 6 128 27 +24d14 2 486 85 +24d16 6 128 27 +24d1c 8 486 85 +FUNC 24d24 20 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MappingInfoContained_Test>::CreateTest +24d24 2 486 85 +24d26 8 486 85 +24d2e 6 236 27 +24d34 2 486 85 +24d36 6 236 27 +24d3c 8 486 85 +FUNC 24d44 20 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_DeletedBinary_Test>::CreateTest +24d44 2 486 85 +24d46 8 486 85 +24d4e 6 338 27 +24d54 2 486 85 +24d56 6 338 27 +24d5c 8 486 85 +FUNC 24d64 20 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_AdditionalMemory_Test>::CreateTest +24d64 2 486 85 +24d66 8 486 85 +24d6e 6 432 27 +24d74 2 486 85 +24d76 6 432 27 +24d7c 8 486 85 +FUNC 24d84 20 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_InvalidStackPointer_Test>::CreateTest +24d84 2 486 85 +24d86 8 486 85 +24d8e 6 504 27 +24d94 2 486 85 +24d96 6 504 27 +24d9c 8 486 85 +FUNC 24da4 20 0 testing::internal::TestFactoryImpl<(anonymous namespace)::MinidumpWriterTest_MinidumpSizeLimit_Test>::CreateTest +24da4 2 486 85 +24da6 8 486 85 +24dae 6 583 27 +24db4 2 486 85 +24db6 6 583 27 +24dbc 8 486 85 +FUNC 24dc4 18 0 MinidumpWriterTest_SetupWithPath_Test::~MinidumpWriterTest_SetupWithPath_Test +24dc4 2 67 27 +24dc6 16 67 27 +FUNC 24ddc 12 0 MinidumpWriterTest_SetupWithPath_Test::~MinidumpWriterTest_SetupWithPath_Test +24ddc 2 67 27 +24dde 6 67 27 +24de4 6 67 27 +24dea 4 67 27 +FUNC 24df0 18 0 MinidumpWriterTest_SetupWithFD_Test::~MinidumpWriterTest_SetupWithFD_Test +24df0 2 96 27 +24df2 16 96 27 +FUNC 24e08 12 0 MinidumpWriterTest_SetupWithFD_Test::~MinidumpWriterTest_SetupWithFD_Test +24e08 2 96 27 +24e0a 6 96 27 +24e10 6 96 27 +24e16 4 96 27 +FUNC 24e1c 18 0 MinidumpWriterTest_MappingInfo_Test::~MinidumpWriterTest_MappingInfo_Test +24e1c 2 128 27 +24e1e 16 128 27 +FUNC 24e34 12 0 MinidumpWriterTest_MappingInfo_Test::~MinidumpWriterTest_MappingInfo_Test +24e34 2 128 27 +24e36 6 128 27 +24e3c 6 128 27 +24e42 4 128 27 +FUNC 24e48 18 0 MinidumpWriterTest_MappingInfoContained_Test::~MinidumpWriterTest_MappingInfoContained_Test +24e48 2 236 27 +24e4a 16 236 27 +FUNC 24e60 12 0 MinidumpWriterTest_MappingInfoContained_Test::~MinidumpWriterTest_MappingInfoContained_Test +24e60 2 236 27 +24e62 6 236 27 +24e68 6 236 27 +24e6e 4 236 27 +FUNC 24e74 18 0 MinidumpWriterTest_DeletedBinary_Test::~MinidumpWriterTest_DeletedBinary_Test +24e74 2 338 27 +24e76 16 338 27 +FUNC 24e8c 12 0 MinidumpWriterTest_DeletedBinary_Test::~MinidumpWriterTest_DeletedBinary_Test +24e8c 2 338 27 +24e8e 6 338 27 +24e94 6 338 27 +24e9a 4 338 27 +FUNC 24ea0 18 0 MinidumpWriterTest_AdditionalMemory_Test::~MinidumpWriterTest_AdditionalMemory_Test +24ea0 2 432 27 +24ea2 16 432 27 +FUNC 24eb8 12 0 MinidumpWriterTest_AdditionalMemory_Test::~MinidumpWriterTest_AdditionalMemory_Test +24eb8 2 432 27 +24eba 6 432 27 +24ec0 6 432 27 +24ec6 4 432 27 +FUNC 24ecc 18 0 MinidumpWriterTest_InvalidStackPointer_Test::~MinidumpWriterTest_InvalidStackPointer_Test +24ecc 2 504 27 +24ece 16 504 27 +FUNC 24ee4 12 0 MinidumpWriterTest_InvalidStackPointer_Test::~MinidumpWriterTest_InvalidStackPointer_Test +24ee4 2 504 27 +24ee6 6 504 27 +24eec 6 504 27 +24ef2 4 504 27 +FUNC 24ef8 18 0 MinidumpWriterTest_MinidumpSizeLimit_Test::~MinidumpWriterTest_MinidumpSizeLimit_Test +24ef8 2 583 27 +24efa 16 583 27 +FUNC 24f10 12 0 MinidumpWriterTest_MinidumpSizeLimit_Test::~MinidumpWriterTest_MinidumpSizeLimit_Test +24f10 2 583 27 +24f12 6 583 27 +24f18 6 583 27 +24f1e 4 583 27 +FUNC 24f22 7a 0 std::basic_string, std::allocator >::find +24f22 6 438 135 +24f28 2 400 136 +24f2a 4 440 135 +24f2e 6 441 135 +24f34 2 446 135 +24f36 4 162 104 +24f3a 4 164 104 +24f3e 6 165 104 +24f44 6 168 104 +24f4a 4 166 104 +24f4e 6 171 104 +24f54 4 169 104 +24f58 6 174 104 +24f5e 6 172 104 +24f64 4 164 104 +24f68 10 178 104 +24f78 6 180 104 +24f7e 2 181 104 +24f80 6 183 104 +24f86 2 184 104 +24f88 a 186 104 +24f92 2 190 104 +24f94 4 447 135 +24f98 2 447 135 +24f9a 2 448 135 +FUNC 24f9c 30 0 std::basic_string, std::allocator >::erase +24f9c 4 788 136 +24fa0 2 400 136 +24fa2 2 788 136 +24fa4 2 400 136 +24fa6 4 789 136 +24faa 8 604 135 +24fb2 a 791 136 +24fbc 8 791 136 +24fc4 8 793 136 +FUNC 24fcc 32 0 std::priv::_Impl_list >::push_back +24fcc 4 306 106 +24fd0 2 509 121 +24fd2 2 509 121 +24fd4 6 306 106 +24fda 2 509 121 +24fdc 6 307 106 +24fe2 4 119 108 +24fe6 a 119 108 +24ff0 2 427 121 +24ff2 2 428 121 +24ff4 2 429 121 +24ff6 2 430 121 +24ff8 2 431 121 +24ffa 4 509 121 +FUNC 24ffe 1a 0 std::basic_string, std::allocator >::append +24ffe 2 529 136 +25000 2 529 136 +25002 2 229 145 +25004 2 529 136 +25006 4 229 145 +2500a 2 530 136 +2500c 2 530 136 +2500e 2 530 136 +25010 4 530 136 +25014 4 530 136 +FUNC 25018 22 0 std::priv::_List_base >::_List_base +FUNC 25018 22 0 std::priv::_List_base >::_List_base +25018 6 188 121 +2501e a 188 121 +25028 8 481 106 +25030 2 189 121 +25032 2 211 121 +25034 2 212 121 +25036 4 189 121 +FUNC 25018 22 0 std::priv::_List_base, std::allocator > >::_List_base +25018 6 188 121 +2501e a 188 121 +25028 8 481 106 +25030 2 189 121 +25032 2 211 121 +25034 2 212 121 +25036 4 189 121 +FUNC 2503a 1a 0 std::priv::_List_base >::clear +2503a 2 66 120 +2503c 2 66 120 +2503e 2 67 120 +25040 4 68 120 +25044 2 74 120 +25046 8 135 124 +2504e 2 78 120 +25050 4 79 120 +FUNC 25054 1c 0 std::priv::_List_base >::clear +25054 2 66 120 +25056 2 66 120 +25058 2 67 120 +2505a 4 68 120 +2505e 2 74 120 +25060 a 161 106 +2506a 2 78 120 +2506c 4 79 120 +FUNC 25054 1c 0 std::priv::_List_base, std::allocator > >::clear +25054 2 66 120 +25056 2 66 120 +25058 2 67 120 +2505a 4 68 120 +2505e 2 74 120 +25060 a 161 106 +2506a 2 78 120 +2506c 4 79 120 +FUNC 25070 c0 0 testing::internal::CmpHelperEQFailure, std::allocator > > +25070 8 1464 82 +25078 c 1464 82 +25084 2 884 80 +25086 6 1464 82 +2508c 4 884 80 +25090 6 1464 82 +25096 8 884 80 +2509e 2 708 80 +250a0 c 333 127 +250ac a 711 80 +250b6 8 469 80 +250be 6 156 137 +250c4 c 75 132 +250d0 6 886 80 +250d6 8 884 80 +250de 8 469 80 +250e6 8 75 132 +250ee 6 886 80 +250f4 12 1471 82 +25106 c 156 137 +25112 1e 1472 82 +FUNC 25130 4a 0 testing::internal::CmpHelperEQ, std::allocator > > +25130 4 1476 82 +25134 4 1481 82 +25138 2 1476 82 +2513a 2 229 145 +2513c 6 1476 82 +25142 4 229 145 +25146 2 1476 82 +25148 4 229 145 +2514c 4 400 136 +25150 4 315 139 +25154 6 226 145 +2515a 2 315 139 +2515c 10 1487 82 +2516c 6 1482 82 +25172 8 1488 82 +FUNC 2517c a0 0 testing::internal::CmpHelperEQFailure, std::allocator >, std::basic_string, std::allocator > > +2517c e 1464 82 +2518a 2 1464 82 +2518c 2 884 80 +2518e 6 1464 82 +25194 4 469 80 +25198 2 1464 82 +2519a 4 884 80 +2519e 4 1464 82 +251a2 2 75 132 +251a4 4 884 80 +251a8 4 469 80 +251ac 2 75 132 +251ae 4 469 80 +251b2 8 75 132 +251ba 6 886 80 +251c0 8 884 80 +251c8 4 469 80 +251cc 4 75 132 +251d0 4 469 80 +251d4 8 75 132 +251dc 6 886 80 +251e2 14 1471 82 +251f6 c 156 137 +25202 1a 1472 82 +FUNC 2521c d8 0 testing::PrintToString +2521c e 883 80 +2522a 2 883 80 +2522c 6 884 80 +25232 4 181 127 +25236 2 883 80 +25238 2 884 80 +2523a 2 883 80 +2523c 8 884 80 +25244 e 181 127 +25252 2 199 126 +25254 10 211 126 +25264 2 202 126 +25266 2 145 115 +25268 4 202 126 +2526c 2 145 115 +2526e 2 202 126 +25270 6 145 115 +25276 6 202 126 +2527c 2 202 126 +2527e 2 202 126 +25280 c 202 126 +2528c 18 57 128 +252a4 1a 78 125 +252be 6 202 126 +252c4 4 210 126 +252c8 6 212 126 +252ce 8 75 132 +252d6 6 886 80 +252dc 18 887 80 +FUNC 252f4 26c 0 MinidumpWriterTest_SetupWithPath_Test::TestBody +252f4 c 67 27 +25300 a 67 27 +2530a 2 69 27 +2530c 4 67 27 +25310 e 69 27 +2531e 4 69 27 +25322 2 69 27 +25324 2 69 27 +25326 2 69 27 +25328 e 69 27 +25336 c 69 27 +25342 6 302 82 +25348 10 69 27 +25358 6 69 27 +2535e 8 69 27 +25366 6 85 79 +2536c 6 69 27 +25372 e 256 82 +25380 4 71 27 +25384 4 72 27 +25388 6 73 27 +2538e e 75 27 +2539c 4 75 27 +253a0 6 75 27 +253a6 6 76 27 +253ac 6 77 27 +253b2 4 82 27 +253b6 6 79 27 +253bc 4 84 27 +253c0 c 82 27 +253cc 6 84 27 +253d2 10 85 27 +253e2 c 88 27 +253ee 4 87 27 +253f2 4 88 27 +253f6 4 1139 87 +253fa 2 277 82 +253fc 8 1139 87 +25404 2 88 27 +25406 18 88 27 +2541e 12 88 27 +25430 6 88 27 +25436 8 88 27 +2543e 6 85 79 +25444 6 88 27 +2544a 8 156 137 +25452 6 256 82 +25458 6 90 27 +2545e 4 90 27 +25462 4 90 27 +25466 6 1552 82 +2546c 4 90 27 +25470 10 1552 82 +25480 4 90 27 +25484 6 302 82 +2548a e 90 27 +25498 6 256 82 +2549e 18 91 27 +254b6 6 302 82 +254bc 10 91 27 +254cc 6 91 27 +254d2 8 91 27 +254da 6 85 79 +254e0 6 91 27 +254e6 6 256 82 +254ec a 156 137 +254f6 6 256 82 +254fc 6 93 27 +25502 6 156 137 +25508 6 93 27 +2550e 52 94 27 +FUNC 25560 274 0 MinidumpWriterTest_SetupWithFD_Test::TestBody +25560 c 96 27 +2556c a 96 27 +25576 2 98 27 +25578 4 96 27 +2557c e 98 27 +2558a 4 98 27 +2558e 2 98 27 +25590 2 98 27 +25592 2 98 27 +25594 e 98 27 +255a2 c 98 27 +255ae 6 302 82 +255b4 10 98 27 +255c4 6 98 27 +255ca 8 98 27 +255d2 6 85 79 +255d8 6 98 27 +255de e 256 82 +255ec 4 100 27 +255f0 4 101 27 +255f4 6 102 27 +255fa e 104 27 +25608 4 104 27 +2560c 6 104 27 +25612 6 105 27 +25618 6 106 27 +2561e 4 111 27 +25622 6 108 27 +25628 4 113 27 +2562c c 111 27 +25638 6 113 27 +2563e 10 114 27 +2564e e 115 27 +2565c 8 118 27 +25664 4 117 27 +25668 4 118 27 +2566c 4 1139 87 +25670 2 277 82 +25672 8 1139 87 +2567a 2 118 27 +2567c 18 118 27 +25694 12 118 27 +256a6 6 118 27 +256ac 8 118 27 +256b4 6 85 79 +256ba 6 118 27 +256c0 8 156 137 +256c8 6 256 82 +256ce 6 120 27 +256d4 4 120 27 +256d8 4 120 27 +256dc 6 1552 82 +256e2 4 120 27 +256e6 10 1552 82 +256f6 4 120 27 +256fa 6 302 82 +25700 e 120 27 +2570e 6 256 82 +25714 18 121 27 +2572c 6 302 82 +25732 10 121 27 +25742 6 121 27 +25748 8 121 27 +25750 6 85 79 +25756 6 121 27 +2575c 6 256 82 +25762 a 156 137 +2576c 6 256 82 +25772 6 123 27 +25778 6 156 137 +2577e 6 123 27 +25784 50 124 27 +FUNC 257d4 c70 0 MinidumpWriterTest_MappingInfo_Test::TestBody +257d4 c 128 27 +257e0 a 128 27 +257ea 2 130 27 +257ec 4 128 27 +257f0 e 130 27 +257fe 8 130 27 +25806 2 130 27 +25808 2 130 27 +2580a 2 130 27 +2580c e 130 27 +2581a c 130 27 +25826 6 302 82 +2582c 12 130 27 +2583e 6 130 27 +25844 8 130 27 +2584c 6 85 79 +25852 6 130 27 +25858 10 256 82 +25868 6 134 27 +2586e 6 139 27 +25874 4 135 27 +25878 4 134 27 +2587c 4 135 27 +25880 4 139 27 +25884 4 134 27 +25888 16 139 27 +2589e a 143 27 +258a8 4 144 27 +258ac 4 143 27 +258b0 a 144 27 +258ba c 962 136 +258c6 4 147 27 +258ca 2 148 27 +258cc 2 147 27 +258ce a 148 27 +258d8 4 161 27 +258dc a 452 136 +258e6 16 161 27 +258fc 2 162 27 +258fe 8 277 82 +25906 4 1139 87 +2590a 2 277 82 +2590c 2 163 27 +2590e 1e 163 27 +2592c 14 163 27 +25940 6 163 27 +25946 8 163 27 +2594e 6 85 79 +25954 6 163 27 +2595a 6 156 137 +25960 a 256 82 +2596a 4 165 27 +2596e 4 166 27 +25972 6 167 27 +25978 e 169 27 +25986 4 169 27 +2598a 6 169 27 +25990 6 170 27 +25996 6 171 27 +2599c 4 177 27 +259a0 2 173 27 +259a2 4 176 27 +259a6 4 173 27 +259aa c 176 27 +259b6 a 177 27 +259c0 8 1552 82 +259c8 2 177 27 +259ca 2 1552 82 +259cc 4 177 27 +259d0 e 1552 82 +259de 6 177 27 +259e4 6 302 82 +259ea 12 177 27 +259fc 6 177 27 +25a02 8 177 27 +25a0a 6 85 79 +25a10 6 177 27 +25a16 10 256 82 +25a26 2 180 27 +25a28 2 178 27 +25a2a 2 180 27 +25a2c 4 178 27 +25a30 4 180 27 +25a34 12 181 27 +25a46 6 185 27 +25a4c 4 188 27 +25a50 2 185 27 +25a52 6 186 27 +25a58 4 187 27 +25a5c 2 186 27 +25a5e a 188 27 +25a68 8 353 121 +25a70 4 193 27 +25a74 2 185 27 +25a76 8 353 121 +25a7e c 193 27 +25a8a a 194 27 +25a94 8 229 146 +25a9c 1a 196 27 +25ab6 2 277 82 +25ab8 6 1139 87 +25abe 2 196 27 +25ac0 1c 196 27 +25adc 18 196 27 +25af4 6 196 27 +25afa 8 196 27 +25b02 6 85 79 +25b08 6 196 27 +25b0e 6 156 137 +25b14 e 256 82 +25b22 8 202 27 +25b2a a 203 27 +25b34 2 277 82 +25b36 4 1139 87 +25b3a 2 203 27 +25b3c 1c 203 27 +25b58 16 203 27 +25b6e 6 256 82 +25b74 6 205 27 +25b7a a 277 82 +25b84 4 1139 87 +25b88 2 206 27 +25b8a 1c 206 27 +25ba6 16 206 27 +25bbc 6 256 82 +25bc2 10 208 27 +25bd2 a 277 82 +25bdc 4 1139 87 +25be0 2 209 27 +25be2 1c 209 27 +25bfe 18 209 27 +25c16 6 209 27 +25c1c 8 209 27 +25c24 6 85 79 +25c2a 6 209 27 +25c30 6 156 137 +25c36 10 256 82 +25c46 a 211 27 +25c50 4 1512 82 +25c54 4 211 27 +25c58 12 1512 82 +25c6a 4 211 27 +25c6e 6 302 82 +25c74 14 211 27 +25c88 6 211 27 +25c8e 8 211 27 +25c96 6 85 79 +25c9c 6 211 27 +25ca2 6 256 82 +25ca8 a 212 27 +25cb2 4 1512 82 +25cb6 4 212 27 +25cba 4 1512 82 +25cbe 2 256 82 +25cc0 2 212 27 +25cc2 e 1512 82 +25cd0 4 212 27 +25cd4 6 302 82 +25cda 14 212 27 +25cee 6 212 27 +25cf4 8 212 27 +25cfc 6 85 79 +25d02 6 212 27 +25d08 8 256 82 +25d10 e 213 27 +25d1e 16 1512 82 +25d34 6 156 137 +25d3a 4 213 27 +25d3e 6 302 82 +25d44 e 213 27 +25d52 4 213 27 +25d56 8 213 27 +25d5e 6 213 27 +25d64 8 213 27 +25d6c 6 85 79 +25d72 6 213 27 +25d78 6 256 82 +25d7e c 214 27 +25d8a 16 1512 82 +25da0 6 156 137 +25da6 4 214 27 +25daa 6 302 82 +25db0 e 214 27 +25dbe 4 214 27 +25dc2 8 214 27 +25dca 6 214 27 +25dd0 8 214 27 +25dd8 6 85 79 +25dde 6 214 27 +25de4 6 256 82 +25dea a 218 27 +25df4 2 1139 87 +25df6 2 277 82 +25df8 2 1139 87 +25dfa 2 218 27 +25dfc 1c 218 27 +25e18 e 218 27 +25e26 4 218 27 +25e2a a 218 27 +25e34 6 218 27 +25e3a 8 218 27 +25e42 6 85 79 +25e48 6 218 27 +25e4e 6 156 137 +25e54 6 256 82 +25e5a a 219 27 +25e64 2 1139 87 +25e66 2 277 82 +25e68 2 1139 87 +25e6a 2 219 27 +25e6c 1c 219 27 +25e88 e 219 27 +25e96 4 219 27 +25e9a a 219 27 +25ea4 6 219 27 +25eaa 8 219 27 +25eb2 6 85 79 +25eb8 6 219 27 +25ebe 6 156 137 +25ec4 6 256 82 +25eca a 220 27 +25ed4 2 1139 87 +25ed6 2 277 82 +25ed8 2 1139 87 +25eda 2 220 27 +25edc 1c 220 27 +25ef8 e 220 27 +25f06 4 220 27 +25f0a a 220 27 +25f14 6 220 27 +25f1a 8 220 27 +25f22 6 85 79 +25f28 6 220 27 +25f2e 6 156 137 +25f34 6 256 82 +25f3a a 221 27 +25f44 2 1139 87 +25f46 2 277 82 +25f48 2 1139 87 +25f4a 2 221 27 +25f4c 1c 221 27 +25f68 e 221 27 +25f76 4 221 27 +25f7a a 221 27 +25f84 6 221 27 +25f8a 8 221 27 +25f92 6 85 79 +25f98 6 221 27 +25f9e 6 156 137 +25fa4 6 256 82 +25faa a 222 27 +25fb4 2 1139 87 +25fb6 2 277 82 +25fb8 2 1139 87 +25fba 2 222 27 +25fbc 1c 222 27 +25fd8 e 222 27 +25fe6 4 222 27 +25fea a 222 27 +25ff4 6 222 27 +25ffa 8 222 27 +26002 6 85 79 +26008 6 222 27 +2600e 6 156 137 +26014 6 256 82 +2601a a 223 27 +26024 2 1139 87 +26026 2 277 82 +26028 2 1139 87 +2602a 2 223 27 +2602c 16 223 27 +26042 c 223 27 +2604e 4 223 27 +26052 a 223 27 +2605c 6 223 27 +26062 8 223 27 +2606a 6 85 79 +26070 6 223 27 +26076 6 156 137 +2607c 6 256 82 +26082 a 224 27 +2608c 2 1139 87 +2608e 2 277 82 +26090 2 1139 87 +26092 2 224 27 +26094 16 224 27 +260aa c 224 27 +260b6 4 224 27 +260ba a 224 27 +260c4 6 224 27 +260ca 8 224 27 +260d2 6 85 79 +260d8 6 224 27 +260de 6 156 137 +260e4 6 256 82 +260ea a 225 27 +260f4 2 1139 87 +260f6 2 277 82 +260f8 2 1139 87 +260fa 2 225 27 +260fc 16 225 27 +26112 c 225 27 +2611e 4 225 27 +26122 a 225 27 +2612c 6 225 27 +26132 8 225 27 +2613a 6 85 79 +26140 6 225 27 +26146 6 156 137 +2614c 6 256 82 +26152 a 226 27 +2615c 2 1139 87 +2615e 2 277 82 +26160 2 1139 87 +26162 2 226 27 +26164 16 226 27 +2617a c 226 27 +26186 4 226 27 +2618a a 226 27 +26194 6 226 27 +2619a 8 226 27 +261a2 6 85 79 +261a8 6 226 27 +261ae 6 156 137 +261b4 6 256 82 +261ba a 227 27 +261c4 2 1139 87 +261c6 2 277 82 +261c8 2 1139 87 +261ca 2 227 27 +261cc 16 227 27 +261e2 c 227 27 +261ee 4 227 27 +261f2 a 227 27 +261fc 6 227 27 +26202 8 227 27 +2620a 6 85 79 +26210 6 227 27 +26216 6 156 137 +2621c 6 256 82 +26222 a 228 27 +2622c 2 1139 87 +2622e 2 277 82 +26230 2 1139 87 +26232 2 228 27 +26234 16 228 27 +2624a a 228 27 +26254 4 228 27 +26258 a 228 27 +26262 6 228 27 +26268 8 228 27 +26270 6 85 79 +26276 6 228 27 +2627c 6 156 137 +26282 6 256 82 +26288 6 230 27 +2628e 6 230 27 +26294 c 205 121 +262a0 12 156 137 +262b2 192 231 27 +FUNC 26444 7d0 0 MinidumpWriterTest_MappingInfoContained_Test::TestBody +26444 c 236 27 +26450 6 236 27 +26456 4 238 27 +2645a 4 236 27 +2645e e 238 27 +2646c 8 238 27 +26474 2 238 27 +26476 2 238 27 +26478 2 238 27 +2647a e 238 27 +26488 8 238 27 +26490 6 302 82 +26496 12 238 27 +264a8 6 238 27 +264ae 8 238 27 +264b6 6 85 79 +264bc 6 238 27 +264c2 e 256 82 +264d0 6 242 27 +264d6 6 247 27 +264dc 4 243 27 +264e0 2 242 27 +264e2 4 243 27 +264e6 1a 247 27 +26500 a 251 27 +2650a 2 252 27 +2650c 4 251 27 +26510 a 252 27 +2651a c 962 136 +26526 4 255 27 +2652a 2 256 27 +2652c 2 255 27 +2652e a 256 27 +26538 4 452 136 +2653c 2 263 27 +2653e 6 452 136 +26544 6 263 27 +2654a 12 264 27 +2655c c 265 27 +26568 8 266 27 +26570 4 265 27 +26574 1a 266 27 +2658e 6 302 82 +26594 14 266 27 +265a8 6 266 27 +265ae 8 266 27 +265b6 6 85 79 +265bc 6 266 27 +265c2 e 256 82 +265d0 4 269 27 +265d4 8 267 27 +265dc 8 269 27 +265e4 6 270 27 +265ea 2 269 27 +265ec 2 197 57 +265ee 4 270 27 +265f2 c 271 27 +265fe 8 1512 82 +26606 2 271 27 +26608 e 1512 82 +26616 4 271 27 +2661a 6 302 82 +26620 14 271 27 +26634 6 271 27 +2663a 8 271 27 +26642 6 85 79 +26648 8 271 27 +26650 6 256 82 +26656 2 272 27 +26658 4 280 27 +2665c 8 272 27 +26664 16 280 27 +2667a c 277 82 +26686 4 1139 87 +2668a 2 282 27 +2668c 1e 282 27 +266aa 16 282 27 +266c0 6 282 27 +266c6 8 282 27 +266ce 6 85 79 +266d4 6 282 27 +266da 6 156 137 +266e0 e 256 82 +266ee 6 283 27 +266f4 4 285 27 +266f8 4 286 27 +266fc 8 287 27 +26704 10 289 27 +26714 4 289 27 +26718 6 289 27 +2671e 8 290 27 +26726 6 291 27 +2672c 2 296 27 +2672e 8 293 27 +26736 c 296 27 +26742 2 297 27 +26744 4 306 27 +26748 e 299 27 +26756 4 297 27 +2675a 4 299 27 +2675e a 304 27 +26768 2 353 121 +2676a 4 305 27 +2676e 4 353 121 +26772 6 307 27 +26778 4 304 27 +2677c 4 305 27 +26780 4 306 27 +26784 4 307 27 +26788 c 353 121 +26794 2 312 27 +26796 8 353 121 +2679e c 312 27 +267aa c 313 27 +267b6 8 229 146 +267be 1a 315 27 +267d8 2 277 82 +267da 8 1139 87 +267e2 2 315 27 +267e4 16 315 27 +267fa 16 315 27 +26810 6 315 27 +26816 8 315 27 +2681e 6 85 79 +26824 6 315 27 +2682a 6 156 137 +26830 e 256 82 +2683e 8 321 27 +26846 a 322 27 +26850 2 277 82 +26852 4 1139 87 +26856 2 322 27 +26858 16 322 27 +2686e 16 322 27 +26884 6 256 82 +2688a 6 324 27 +26890 a 277 82 +2689a 4 1139 87 +2689e 2 325 27 +268a0 16 325 27 +268b6 16 325 27 +268cc 6 256 82 +268d2 c 327 27 +268de a 277 82 +268e8 4 1139 87 +268ec 2 328 27 +268ee 16 328 27 +26904 18 328 27 +2691c 6 328 27 +26922 8 328 27 +2692a 6 85 79 +26930 6 328 27 +26936 6 156 137 +2693c 14 256 82 +26950 8 330 27 +26958 2 1512 82 +2695a 4 330 27 +2695e 10 1512 82 +2696e 4 330 27 +26972 6 302 82 +26978 16 330 27 +2698e 6 330 27 +26994 8 330 27 +2699c 6 85 79 +269a2 6 330 27 +269a8 6 256 82 +269ae 8 331 27 +269b6 2 1512 82 +269b8 4 331 27 +269bc 2 1512 82 +269be 4 331 27 +269c2 10 1512 82 +269d2 4 331 27 +269d6 6 302 82 +269dc 14 331 27 +269f0 6 331 27 +269f6 8 331 27 +269fe 6 85 79 +26a04 6 331 27 +26a0a a 256 82 +26a14 c 332 27 +26a20 12 1512 82 +26a32 6 156 137 +26a38 4 332 27 +26a3c 6 302 82 +26a42 c 332 27 +26a4e 4 332 27 +26a52 8 332 27 +26a5a 6 332 27 +26a60 8 332 27 +26a68 6 85 79 +26a6e 6 332 27 +26a74 6 256 82 +26a7a c 333 27 +26a86 14 1512 82 +26a9a 6 156 137 +26aa0 4 333 27 +26aa4 6 302 82 +26aaa c 333 27 +26ab6 2 333 27 +26ab8 8 333 27 +26ac0 6 333 27 +26ac6 8 333 27 +26ace 6 85 79 +26ad4 6 333 27 +26ada 6 256 82 +26ae0 6 335 27 +26ae6 6 335 27 +26aec c 205 121 +26af8 6 156 137 +26afe 6 203 57 +26b04 6 156 137 +26b0a 6 263 27 +26b10 4 156 137 +26b14 c 205 121 +26b20 6 156 137 +26b26 4 203 57 +26b2a 4 203 57 +26b2e 12 156 137 +26b40 d4 336 27 +FUNC 26c14 8a8 0 MinidumpWriterTest_DeletedBinary_Test::TestBody +26c14 c 338 27 +26c20 4 338 27 +26c24 4 339 27 +26c28 2 338 27 +26c2a 8 339 27 +26c32 2 340 27 +26c34 4 339 27 +26c38 4 338 27 +26c3c 4 339 27 +26c40 6 340 27 +26c46 c 341 27 +26c52 1a 342 27 +26c6c 6 342 27 +26c72 2 131 79 +26c74 c 333 127 +26c80 8 342 27 +26c88 6 85 79 +26c8e 6 342 27 +26c94 2 342 27 +26c96 8 347 27 +26c9e 12 348 27 +26cb0 a 349 27 +26cba 4 1139 87 +26cbe 2 277 82 +26cc0 a 1139 87 +26cca 4 349 27 +26cce 20 349 27 +26cee 18 349 27 +26d06 6 350 27 +26d0c 2 131 79 +26d0e c 333 127 +26d1a 2 131 79 +26d1c 8 131 79 +26d24 2 131 79 +26d26 c 333 127 +26d32 2 131 79 +26d34 8 131 79 +26d3c 8 350 27 +26d44 6 85 79 +26d4a 6 349 27 +26d50 8 156 137 +26d58 6 256 82 +26d5e 8 351 27 +26d66 4 351 27 +26d6a 4 351 27 +26d6e 8 1552 82 +26d76 2 351 27 +26d78 e 1552 82 +26d86 4 351 27 +26d8a 6 302 82 +26d90 14 351 27 +26da4 6 351 27 +26daa 8 351 27 +26db2 6 85 79 +26db8 6 351 27 +26dbe e 256 82 +26dcc e 354 27 +26dda 8 354 27 +26de2 2 354 27 +26de4 e 354 27 +26df2 4 354 27 +26df6 6 302 82 +26dfc 14 354 27 +26e10 6 354 27 +26e16 8 354 27 +26e1e 6 85 79 +26e24 4 354 27 +26e28 6 256 82 +26e2e 4 356 27 +26e32 4 357 27 +26e36 6 359 27 +26e3c 14 363 27 +26e50 10 368 27 +26e60 c 370 27 +26e6c 6 373 27 +26e72 6 374 27 +26e78 4 375 27 +26e7c 12 377 27 +26e8e 4 377 27 +26e92 8 377 27 +26e9a 6 256 82 +26ea0 a 383 27 +26eaa 2 387 27 +26eac 6 390 27 +26eb2 4 387 27 +26eb6 c 390 27 +26ec2 12 392 27 +26ed4 c 395 27 +26ee0 4 394 27 +26ee4 4 395 27 +26ee8 4 1139 87 +26eec 2 277 82 +26eee 4 1139 87 +26ef2 6 395 27 +26ef8 20 395 27 +26f18 18 395 27 +26f30 6 395 27 +26f36 8 395 27 +26f3e 6 85 79 +26f44 6 395 27 +26f4a 6 156 137 +26f50 6 256 82 +26f56 1e 156 137 +26f74 12 429 27 +26f86 2 378 27 +26f88 4 1512 82 +26f8c 2 378 27 +26f8e 4 1512 82 +26f92 2 377 27 +26f94 a 1512 82 +26f9e 2 377 27 +26fa0 4 1512 82 +26fa4 6 378 27 +26faa 6 302 82 +26fb0 16 378 27 +26fc6 6 378 27 +26fcc 8 378 27 +26fd4 6 85 79 +26fda 4 378 27 +26fde 6 256 82 +26fe4 2 1139 87 +26fe6 2 379 27 +26fe8 2 1139 87 +26fea 4 379 27 +26fee 2 277 82 +26ff0 2 379 27 +26ff2 1e 379 27 +27010 18 379 27 +27028 6 379 27 +2702e 8 379 27 +27036 6 85 79 +2703c 6 379 27 +27042 8 156 137 +2704a 6 256 82 +27050 16 381 27 +27066 4 381 27 +2706a 6 381 27 +27070 2 382 27 +27072 2 1512 82 +27074 2 382 27 +27076 2 1512 82 +27078 2 381 27 +2707a a 1512 82 +27084 2 381 27 +27086 4 1512 82 +2708a a 382 27 +27094 6 302 82 +2709a 12 382 27 +270ac 6 382 27 +270b2 8 382 27 +270ba 6 85 79 +270c0 6 382 27 +270c6 a 256 82 +270d0 8 397 27 +270d8 6 400 27 +270de 4 400 27 +270e2 4 400 27 +270e6 8 1552 82 +270ee 2 400 27 +270f0 e 1552 82 +270fe 6 400 27 +27104 6 302 82 +2710a 12 400 27 +2711c 6 400 27 +27122 8 400 27 +2712a 6 85 79 +27130 8 400 27 +27138 6 256 82 +2713e 18 401 27 +27156 6 302 82 +2715c 10 401 27 +2716c 4 403 27 +27170 6 256 82 +27176 8 403 27 +2717e a 404 27 +27188 2 277 82 +2718a 4 1139 87 +2718e 2 404 27 +27190 16 404 27 +271a6 14 404 27 +271ba 6 256 82 +271c0 6 407 27 +271c6 a 277 82 +271d0 4 1139 87 +271d4 2 408 27 +271d6 16 408 27 +271ec 16 408 27 +27202 6 408 27 +27208 8 408 27 +27210 6 85 79 +27216 6 408 27 +2721c 6 156 137 +27222 e 256 82 +27230 e 409 27 +2723e 6 410 27 +27244 2 410 27 +27246 6 410 27 +2724c 16 410 27 +27262 6 156 137 +27268 4 410 27 +2726c 6 302 82 +27272 12 410 27 +27284 6 410 27 +2728a 8 410 27 +27292 6 85 79 +27298 6 410 27 +2729e 4 256 82 +272a2 2 412 27 +272a4 6 256 82 +272aa 4 414 27 +272ae 8 412 27 +272b6 8 414 27 +272be 2 1139 87 +272c0 2 256 82 +272c2 2 277 82 +272c4 2 1139 87 +272c6 2 414 27 +272c8 16 414 27 +272de a 414 27 +272e8 2 414 27 +272ea c 414 27 +272f6 6 414 27 +272fc 8 414 27 +27304 6 85 79 +2730a 6 414 27 +27310 6 156 137 +27316 6 256 82 +2731c 2 419 27 +2731e a 418 27 +27328 a 419 27 +27332 c 962 136 +2733e 2 422 27 +27340 2 423 27 +27342 2 422 27 +27344 8 423 27 +2734c 2 452 136 +2734e 2 428 27 +27350 6 452 136 +27356 a 428 27 +27360 12 1512 82 +27372 6 156 137 +27378 4 428 27 +2737c 6 302 82 +27382 a 428 27 +2738c 2 428 27 +2738e 8 428 27 +27396 6 428 27 +2739c 8 428 27 +273a4 6 85 79 +273aa 6 428 27 +273b0 6 256 82 +273b6 14 156 137 +273ca f2 429 27 +FUNC 274bc 298 0 MinidumpWriterTest_InvalidStackPointer_Test::TestBody +274bc c 504 27 +274c8 a 504 27 +274d2 2 506 27 +274d4 4 504 27 +274d8 e 506 27 +274e6 6 506 27 +274ec 4 506 27 +274f0 e 506 27 +274fe c 506 27 +2750a 6 302 82 +27510 10 506 27 +27520 6 256 82 +27526 4 508 27 +2752a 4 509 27 +2752e 6 510 27 +27534 e 512 27 +27542 4 512 27 +27546 6 512 27 +2754c 6 513 27 +27552 6 514 27 +27558 6 516 27 +2755e a 523 27 +27568 4 1552 82 +2756c 2 523 27 +2756e 2 1552 82 +27570 2 523 27 +27572 e 1552 82 +27580 c 523 27 +2758c 6 302 82 +27592 12 523 27 +275a4 6 523 27 +275aa 8 523 27 +275b2 6 85 79 +275b8 6 523 27 +275be e 256 82 +275cc 2 524 27 +275ce 4 546 27 +275d2 4 524 27 +275d6 2 546 27 +275d8 4 530 27 +275dc 4 536 27 +275e0 4 546 27 +275e4 10 547 27 +275f4 10 550 27 +27604 2 1139 87 +27606 2 277 82 +27608 6 1139 87 +2760e 2 550 27 +27610 16 550 27 +27626 16 550 27 +2763c 6 550 27 +27642 8 550 27 +2764a 6 85 79 +27650 6 550 27 +27656 6 156 137 +2765c e 256 82 +2766a 8 553 27 +27672 6 554 27 +27678 2 1139 87 +2767a 2 277 82 +2767c 2 1139 87 +2767e 2 554 27 +27680 18 554 27 +27698 14 554 27 +276ac 6 554 27 +276b2 8 554 27 +276ba 6 85 79 +276c0 6 554 27 +276c6 6 156 137 +276cc 14 256 82 +276e0 6 579 27 +276e6 6 579 27 +276ec 10 156 137 +276fc 58 580 27 +FUNC 27754 5a4 0 MinidumpWriterTest_AdditionalMemory_Test::TestBody +27754 c 432 27 +27760 6 432 27 +27766 2 434 27 +27768 4 432 27 +2776c 10 434 27 +2777c c 434 27 +27788 4 434 27 +2778c e 434 27 +2779a a 434 27 +277a4 6 302 82 +277aa 14 434 27 +277be 6 434 27 +277c4 8 434 27 +277cc 6 85 79 +277d2 6 434 27 +277d8 a 256 82 +277e2 a 438 27 +277ec 4 441 27 +277f0 6 277 82 +277f6 2 1139 87 +277f8 2 441 27 +277fa 2 442 27 +277fc 2 256 82 +277fe 4 1139 87 +27802 4 256 82 +27806 6 446 27 +2780c 6 446 27 +27812 c 447 27 +2781e 4 450 27 +27822 4 451 27 +27826 8 452 27 +2782e 10 454 27 +2783e 4 454 27 +27842 6 454 27 +27848 8 455 27 +27850 6 456 27 +27856 2 458 27 +27858 2 465 27 +2785a 6 458 27 +27860 a 465 27 +2786a a 1552 82 +27874 2 465 27 +27876 e 1552 82 +27884 8 465 27 +2788c 6 302 82 +27892 12 465 27 +278a4 6 465 27 +278aa 8 465 27 +278b2 6 85 79 +278b8 6 465 27 +278be a 256 82 +278c8 4 468 27 +278cc 4 256 82 +278d0 2 468 27 +278d2 2 466 27 +278d4 4 468 27 +278d8 10 469 27 +278e8 4 353 121 +278ec 8 470 27 +278f4 10 353 121 +27904 2 477 27 +27906 2 307 106 +27908 2 477 27 +2790a c 478 27 +27916 4 306 106 +2791a 6 307 106 +27920 4 119 108 +27924 a 119 108 +2792e 2 427 121 +27930 2 428 121 +27932 2 429 121 +27934 2 430 121 +27936 2 431 121 +27938 16 480 27 +2794e 2 1139 87 +27950 4 277 82 +27954 a 1139 87 +2795e 2 480 27 +27960 16 480 27 +27976 16 480 27 +2798c 6 480 27 +27992 8 480 27 +2799a 6 85 79 +279a0 6 480 27 +279a6 6 156 137 +279ac e 256 82 +279ba 8 484 27 +279c2 6 485 27 +279c8 2 1139 87 +279ca 2 277 82 +279cc 2 1139 87 +279ce 2 485 27 +279d0 1a 485 27 +279ea 14 485 27 +279fe 6 256 82 +27a04 6 487 27 +27a0a 6 277 82 +27a10 2 1139 87 +27a12 4 277 82 +27a16 2 1139 87 +27a18 2 488 27 +27a1a 1a 488 27 +27a34 14 488 27 +27a48 6 256 82 +27a4e 14 490 27 +27a62 6 277 82 +27a68 2 1139 87 +27a6a 4 277 82 +27a6e 2 1139 87 +27a70 2 491 27 +27a72 1a 491 27 +27a8c 16 491 27 +27aa2 6 491 27 +27aa8 8 491 27 +27ab0 6 85 79 +27ab6 6 491 27 +27abc 6 156 137 +27ac2 e 256 82 +27ad0 a 493 27 +27ada 2 1512 82 +27adc 4 493 27 +27ae0 10 1512 82 +27af0 4 493 27 +27af4 6 302 82 +27afa 12 493 27 +27b0c 6 493 27 +27b12 8 493 27 +27b1a 6 85 79 +27b20 6 493 27 +27b26 6 256 82 +27b2c a 494 27 +27b36 4 1481 82 +27b3a 4 494 27 +27b3e 2 1481 82 +27b40 2 256 82 +27b42 4 494 27 +27b46 2 1481 82 +27b48 8 1482 82 +27b50 12 1382 82 +27b62 16 1471 82 +27b78 e 156 137 +27b86 4 494 27 +27b8a 4 302 82 +27b8e c 494 27 +27b9a 2 494 27 +27b9c 8 494 27 +27ba4 6 494 27 +27baa 8 494 27 +27bb2 6 85 79 +27bb8 6 494 27 +27bbe 8 256 82 +27bc6 a 497 27 +27bd0 a 497 27 +27bda 4 1552 82 +27bde 6 497 27 +27be4 e 1552 82 +27bf2 6 497 27 +27bf8 6 302 82 +27bfe 12 497 27 +27c10 6 497 27 +27c16 8 497 27 +27c1e 6 85 79 +27c24 6 497 27 +27c2a 6 256 82 +27c30 6 499 27 +27c36 e 500 27 +27c44 c 205 121 +27c50 c 156 137 +27c5c 9c 501 27 +FUNC 27cf8 dec 0 MinidumpWriterTest_MinidumpSizeLimit_Test::TestBody +27cf8 8 583 27 +27d00 4 587 27 +27d04 6 583 27 +27d0a 2 583 27 +27d0c 8 587 27 +27d14 2 589 27 +27d16 4 587 27 +27d1a 2 583 27 +27d1c 4 587 27 +27d20 6 589 27 +27d26 c 590 27 +27d32 c 591 27 +27d3e 2 591 27 +27d40 e 591 27 +27d4e 6 591 27 +27d54 2 131 79 +27d56 c 333 127 +27d62 8 591 27 +27d6a 6 85 79 +27d70 6 591 27 +27d76 2 591 27 +27d78 e 596 27 +27d86 c 596 27 +27d92 4 596 27 +27d96 e 596 27 +27da4 a 596 27 +27dae 6 302 82 +27db4 14 596 27 +27dc8 6 596 27 +27dce 8 596 27 +27dd6 6 85 79 +27ddc 6 596 27 +27de2 a 256 82 +27dec 4 598 27 +27df0 4 599 27 +27df4 2 605 27 +27df6 6 601 27 +27dfc c 605 27 +27e08 e 610 27 +27e16 a 612 27 +27e20 20 1512 82 +27e40 4 617 27 +27e44 4 618 27 +27e48 2 617 27 +27e4a 6 618 27 +27e50 4 619 27 +27e54 14 621 27 +27e68 4 621 27 +27e6c a 621 27 +27e76 6 256 82 +27e7c 2 1139 87 +27e7e 2 623 27 +27e80 2 1139 87 +27e82 4 623 27 +27e86 2 277 82 +27e88 6 623 27 +27e8e 1e 623 27 +27eac 16 623 27 +27ec2 6 623 27 +27ec8 8 623 27 +27ed0 6 85 79 +27ed6 6 623 27 +27edc 6 156 137 +27ee2 a 256 82 +27eec 4 725 27 +27ef0 4 256 82 +27ef4 4 725 27 +27ef8 4 726 27 +27efc 6 726 27 +27f02 6 726 27 +27f08 6 748 27 +27f0e 4 1619 82 +27f12 2 748 27 +27f14 6 1619 82 +27f1a 6 1619 82 +27f20 4 748 27 +27f24 6 302 82 +27f2a 16 748 27 +27f40 6 748 27 +27f46 8 749 27 +27f4e 6 85 79 +27f54 6 748 27 +27f5a 6 256 82 +27f60 6 749 27 +27f66 6 156 137 +27f6c e 753 27 +27f7a 6 156 137 +27f80 10 754 27 +27f90 4 622 27 +27f94 4 621 27 +27f98 2 622 27 +27f9a 2 1512 82 +27f9c 2 621 27 +27f9e 4 622 27 +27fa2 e 1512 82 +27fb0 e 622 27 +27fbe 6 302 82 +27fc4 10 622 27 +27fd4 6 256 82 +27fda 14 625 27 +27fee e 1512 82 +27ffc 4 625 27 +28000 6 302 82 +28006 12 625 27 +28018 6 625 27 +2801e 8 625 27 +28026 6 85 79 +2802c 8 625 27 +28034 6 256 82 +2803a 8 615 27 +28042 8 628 27 +2804a 4 640 27 +2804e 6 633 27 +28054 6 640 27 +2805a 14 645 27 +2806e 10 353 121 +2807e 16 646 27 +28094 4 1139 87 +28098 2 277 82 +2809a c 205 121 +280a6 8 646 27 +280ae 18 646 27 +280c6 14 646 27 +280da 6 646 27 +280e0 8 646 27 +280e8 6 85 79 +280ee 6 646 27 +280f4 6 156 137 +280fa a 256 82 +28104 6 650 27 +2810a 4 650 27 +2810e 4 650 27 +28112 8 1552 82 +2811a 2 650 27 +2811c e 1552 82 +2812a 4 650 27 +2812e 6 302 82 +28134 12 650 27 +28146 6 650 27 +2814c 8 650 27 +28154 6 85 79 +2815a 4 650 27 +2815e 6 256 82 +28164 18 651 27 +2817c 6 302 82 +28182 10 651 27 +28192 4 654 27 +28196 6 256 82 +2819c 4 654 27 +281a0 4 652 27 +281a4 4 654 27 +281a8 6 655 27 +281ae 4 1139 87 +281b2 2 277 82 +281b4 2 655 27 +281b6 1a 655 27 +281d0 14 655 27 +281e4 6 256 82 +281ea 6 656 27 +281f0 a 277 82 +281fa 4 1139 87 +281fe 2 657 27 +28200 1a 657 27 +2821a 16 657 27 +28230 6 657 27 +28236 8 657 27 +2823e 6 85 79 +28244 6 657 27 +2824a 4 156 137 +2824e 6 256 82 +28254 2 271 65 +28256 4 639 27 +2825a 2 658 27 +2825c 6 256 82 +28262 a 664 27 +2826c 4 658 27 +28270 4 664 27 +28274 4 658 27 +28278 6 658 27 +2827e 6 658 27 +28284 c 659 27 +28290 2 271 65 +28292 2 659 27 +28294 2 271 65 +28296 4 271 65 +2829a 6 660 27 +282a0 2 1139 87 +282a2 2 277 82 +282a4 2 660 27 +282a6 18 660 27 +282be 12 660 27 +282d0 2 663 27 +282d2 4 663 27 +282d6 6 663 27 +282dc 8 663 27 +282e4 6 85 79 +282ea 6 663 27 +282f0 6 156 137 +282f6 14 256 82 +2830a 8 662 27 +28312 8 663 27 +2831a 2 277 82 +2831c 2 1139 87 +2831e 4 663 27 +28322 18 663 27 +2833a ce 663 27 +28408 2 677 27 +2840a 4 156 137 +2840e 6 665 27 +28414 6 156 137 +2841a 4 676 27 +2841e 2 353 121 +28420 a 676 27 +2842a 16 353 121 +28440 14 677 27 +28454 4 277 82 +28458 2 1139 87 +2845a c 205 121 +28466 8 677 27 +2846e 1e 677 27 +2848c 16 677 27 +284a2 6 677 27 +284a8 8 677 27 +284b0 6 85 79 +284b6 6 677 27 +284bc 6 156 137 +284c2 a 256 82 +284cc 6 681 27 +284d2 2 681 27 +284d4 4 681 27 +284d8 8 1552 82 +284e0 2 681 27 +284e2 e 1552 82 +284f0 8 681 27 +284f8 6 302 82 +284fe 14 681 27 +28512 6 681 27 +28518 8 681 27 +28520 6 85 79 +28526 6 681 27 +2852c a 256 82 +28536 18 1481 82 +2854e 8 1482 82 +28556 a 884 80 +28560 4 75 132 +28564 8 259 126 +2856c 8 75 132 +28574 6 886 80 +2857a 8 1382 82 +28582 18 1471 82 +2859a e 156 137 +285a8 6 686 27 +285ae 6 302 82 +285b4 c 686 27 +285c0 2 686 27 +285c2 8 686 27 +285ca 6 686 27 +285d0 8 686 27 +285d8 6 85 79 +285de 6 686 27 +285e4 e 256 82 +285f2 a 156 137 +285fc 6 699 27 +28602 4 710 27 +28606 6 699 27 +2860c 12 709 27 +2861e 1e 353 121 +2863c 14 710 27 +28650 4 277 82 +28654 4 1139 87 +28658 c 205 121 +28664 8 710 27 +2866c 18 710 27 +28684 14 710 27 +28698 6 710 27 +2869e 8 710 27 +286a6 6 85 79 +286ac 6 710 27 +286b2 6 156 137 +286b8 4 256 82 +286bc 4 156 137 +286c0 6 256 82 +286c6 a 714 27 +286d0 4 714 27 +286d4 4 714 27 +286d8 8 1552 82 +286e0 2 714 27 +286e2 e 1552 82 +286f0 6 714 27 +286f6 6 302 82 +286fc 12 714 27 +2870e 6 714 27 +28714 8 714 27 +2871c 6 85 79 +28722 6 714 27 +28728 8 256 82 +28730 4 715 27 +28734 6 256 82 +2873a 1c 715 27 +28756 6 302 82 +2875c 10 715 27 +2876c 6 256 82 +28772 10 1619 82 +28782 12 1619 82 +28794 10 1583 82 +287a4 a 1583 82 +287ae 6 1583 82 +287b4 2 1583 82 +287b6 2 1382 82 +287b8 6 1583 82 +287be 6 1583 82 +287c4 8 1583 82 +287cc 6 1583 82 +287d2 a 1584 82 +287dc 8 1382 82 +287e4 8 1584 82 +287ec 2 1585 82 +287ee 2 884 80 +287f0 8 1585 82 +287f8 8 884 80 +28800 8 259 126 +28808 8 75 132 +28810 6 886 80 +28816 a 1585 82 +28820 6 1585 82 +28826 c 156 137 +28832 8 256 82 +2883a 6 719 27 +28840 6 302 82 +28846 14 719 27 +2885a 6 719 27 +28860 8 719 27 +28868 6 85 79 +2886e 6 719 27 +28874 4 721 27 +28878 6 256 82 +2887e 8 721 27 +28886 6 722 27 +2888c 2 1139 87 +2888e 2 277 82 +28890 4 1139 87 +28894 2 722 27 +28896 18 722 27 +288ae 14 722 27 +288c2 6 256 82 +288c8 6 723 27 +288ce a 277 82 +288d8 2 1139 87 +288da 6 724 27 +288e0 18 724 27 +288f8 14 724 27 +2890c c 727 27 +28918 2 271 65 +2891a 2 727 27 +2891c 2 271 65 +2891e 4 271 65 +28922 6 728 27 +28928 2 1139 87 +2892a 2 277 82 +2892c 2 1139 87 +2892e 2 728 27 +28930 18 728 27 +28948 12 728 27 +2895a 4 731 27 +2895e 6 731 27 +28964 8 731 27 +2896c 6 85 79 +28972 6 731 27 +28978 6 156 137 +2897e 14 256 82 +28992 a 730 27 +2899c 6 731 27 +289a2 2 1139 87 +289a4 2 731 27 +289a6 2 277 82 +289a8 2 1139 87 +289aa 2 731 27 +289ac 18 731 27 +289c4 14 731 27 +289d8 6 256 82 +289de e 732 27 +289ec 2 726 27 +289ee a 732 27 +289f8 1a 1619 82 +28a12 a 156 137 +28a1c c8 754 27 +FUNC 28ae4 2a0 0 google_breakpad::GetHelperBinary +28ae4 6 42 28 +28aea 4 101 108 +28aee a 42 28 +28af8 4 120 137 +28afc 2 42 28 +28afe 4 120 137 +28b02 6 42 28 +28b08 2 124 137 +28b0a 2 42 28 +28b0c 2 120 137 +28b0e 2 124 137 +28b10 2 481 106 +28b12 2 42 28 +28b14 6 124 137 +28b1a 2 44 28 +28b1c 4 101 108 +28b20 a 44 28 +28b2a 8 45 28 +28b32 e 46 28 +28b40 8 400 136 +28b48 2 124 137 +28b4a 2 400 136 +28b4c 2 124 137 +28b4e 2 120 137 +28b50 2 481 106 +28b52 6 124 137 +28b58 2 517 136 +28b5a 4 101 108 +28b5e c 517 136 +28b6a 4 74 137 +28b6e 4 74 137 +28b72 6 74 137 +28b78 6 74 137 +28b7e 2 74 137 +28b80 4 472 136 +28b84 8 473 136 +28b8c 4 346 106 +28b90 4 347 106 +28b94 8 348 106 +28b9c 4 352 106 +28ba0 4 353 106 +28ba4 2 356 106 +28ba6 c 120 142 +28bb2 a 148 142 +28bbc 2 101 108 +28bbe 2 148 142 +28bc0 2 101 108 +28bc2 6 478 136 +28bc8 4 479 136 +28bcc 4 160 137 +28bd0 4 164 137 +28bd4 6 165 137 +28bda 2 232 145 +28bdc 2 482 136 +28bde 2 148 142 +28be0 2 232 145 +28be2 2 483 136 +28be4 c 148 142 +28bf0 6 101 108 +28bf6 6 485 136 +28bfc a 349 136 +28c06 e 156 137 +28c14 12 60 49 +28c26 2 50 28 +28c28 8 51 28 +28c30 c 53 28 +28c3c a 349 136 +28c46 a 156 137 +28c50 6 471 135 +28c56 2 162 104 +28c58 4 164 104 +28c5c 8 165 104 +28c64 8 168 104 +28c6c 2 81 118 +28c6e 6 65 118 +28c74 8 171 104 +28c7c 4 81 118 +28c80 8 174 104 +28c88 4 81 118 +28c8c 6 164 104 +28c92 2 152 118 +28c94 12 178 104 +28ca6 8 180 104 +28cae 6 81 118 +28cb4 4 76 118 +28cb8 8 183 104 +28cc0 6 81 118 +28cc6 4 76 118 +28cca 8 186 104 +28cd2 4 65 118 +28cd6 4 74 118 +28cda 4 478 135 +28cde 4 478 135 +28ce2 4 55 28 +28ce6 e 56 28 +28cf4 2 58 28 +28cf6 4 789 136 +28cfa 8 604 135 +28d02 8 791 136 +28d0a 12 530 136 +28d1c 2 379 136 +28d1e 2 378 136 +28d20 2 379 136 +28d22 2 112 137 +28d24 2 481 106 +28d26 4 379 136 +28d2a a 148 142 +28d34 2 101 108 +28d36 2 380 136 +28d38 2 101 108 +28d3a 6 156 137 +28d40 44 64 28 +FUNC 28d84 18 0 ProcCpuInfoReaderTest_EmptyValue_Test::~ProcCpuInfoReaderTest_EmptyValue_Test +28d84 2 186 30 +28d86 16 186 30 +FUNC 28d9c 12 0 ProcCpuInfoReaderTest_EmptyValue_Test::~ProcCpuInfoReaderTest_EmptyValue_Test +28d9c 2 186 30 +28d9e 6 186 30 +28da4 6 186 30 +28daa 4 186 30 +FUNC 28db0 18 0 ProcCpuInfoReaderTest_FieldWithSpaces_Test::~ProcCpuInfoReaderTest_FieldWithSpaces_Test +28db0 2 173 30 +28db2 16 173 30 +FUNC 28dc8 12 0 ProcCpuInfoReaderTest_FieldWithSpaces_Test::~ProcCpuInfoReaderTest_FieldWithSpaces_Test +28dc8 2 173 30 +28dca 6 173 30 +28dd0 6 173 30 +28dd6 4 173 30 +FUNC 28ddc 18 0 ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test::~ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test +28ddc 2 156 30 +28dde 16 156 30 +FUNC 28df4 12 0 ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test::~ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test +28df4 2 156 30 +28df6 6 156 30 +28dfc 6 156 30 +28e02 4 156 30 +FUNC 28e08 18 0 ProcCpuInfoReaderTest_SkipEmptyField_Test::~ProcCpuInfoReaderTest_SkipEmptyField_Test +28e08 2 143 30 +28e0a 16 143 30 +FUNC 28e20 12 0 ProcCpuInfoReaderTest_SkipEmptyField_Test::~ProcCpuInfoReaderTest_SkipEmptyField_Test +28e20 2 143 30 +28e22 6 143 30 +28e28 6 143 30 +28e2e 4 143 30 +FUNC 28e34 18 0 ProcCpuInfoReaderTest_SkipOneEmptyLine_Test::~ProcCpuInfoReaderTest_SkipOneEmptyLine_Test +28e34 2 130 30 +28e36 16 130 30 +FUNC 28e4c 12 0 ProcCpuInfoReaderTest_SkipOneEmptyLine_Test::~ProcCpuInfoReaderTest_SkipOneEmptyLine_Test +28e4c 2 130 30 +28e4e 6 130 30 +28e54 6 130 30 +28e5a 4 130 30 +FUNC 28e60 18 0 ProcCpuInfoReaderTest_SkipMalformedLine_Test::~ProcCpuInfoReaderTest_SkipMalformedLine_Test +28e60 2 117 30 +28e62 16 117 30 +FUNC 28e78 12 0 ProcCpuInfoReaderTest_SkipMalformedLine_Test::~ProcCpuInfoReaderTest_SkipMalformedLine_Test +28e78 2 117 30 +28e7a 6 117 30 +28e80 6 117 30 +28e86 4 117 30 +FUNC 28e8c 18 0 ProcCpuInfoReaderTest_TwoLinesTerminated_Test::~ProcCpuInfoReaderTest_TwoLinesTerminated_Test +28e8c 2 100 30 +28e8e 16 100 30 +FUNC 28ea4 12 0 ProcCpuInfoReaderTest_TwoLinesTerminated_Test::~ProcCpuInfoReaderTest_TwoLinesTerminated_Test +28ea4 2 100 30 +28ea6 6 100 30 +28eac 6 100 30 +28eb2 4 100 30 +FUNC 28eb8 18 0 ProcCpuInfoReaderTest_OneLine_Test::~ProcCpuInfoReaderTest_OneLine_Test +28eb8 2 85 30 +28eba 16 85 30 +FUNC 28ed0 12 0 ProcCpuInfoReaderTest_OneLine_Test::~ProcCpuInfoReaderTest_OneLine_Test +28ed0 2 85 30 +28ed2 6 85 30 +28ed8 6 85 30 +28ede 4 85 30 +FUNC 28ee4 18 0 ProcCpuInfoReaderTest_OneLineTerminated_Test::~ProcCpuInfoReaderTest_OneLineTerminated_Test +28ee4 2 72 30 +28ee6 16 72 30 +FUNC 28efc 12 0 ProcCpuInfoReaderTest_OneLineTerminated_Test::~ProcCpuInfoReaderTest_OneLineTerminated_Test +28efc 2 72 30 +28efe 6 72 30 +28f04 6 72 30 +28f0a 4 72 30 +FUNC 28f10 18 0 ProcCpuInfoReaderTest_EmptyFile_Test::~ProcCpuInfoReaderTest_EmptyFile_Test +28f10 2 63 30 +28f12 16 63 30 +FUNC 28f28 12 0 ProcCpuInfoReaderTest_EmptyFile_Test::~ProcCpuInfoReaderTest_EmptyFile_Test +28f28 2 63 30 +28f2a 6 63 30 +28f30 6 63 30 +28f36 4 63 30 +FUNC 28f3c 20 0 testing::internal::TestFactoryImpl::CreateTest +28f3c 2 486 85 +28f3e 8 486 85 +28f46 6 156 30 +28f4c 2 486 85 +28f4e 6 156 30 +28f54 8 486 85 +FUNC 28f5c 20 0 testing::internal::TestFactoryImpl::CreateTest +28f5c 2 486 85 +28f5e 8 486 85 +28f66 6 186 30 +28f6c 2 486 85 +28f6e 6 186 30 +28f74 8 486 85 +FUNC 28f7c 20 0 testing::internal::TestFactoryImpl::CreateTest +28f7c 2 486 85 +28f7e 8 486 85 +28f86 6 173 30 +28f8c 2 486 85 +28f8e 6 173 30 +28f94 8 486 85 +FUNC 28f9c 20 0 testing::internal::TestFactoryImpl::CreateTest +28f9c 2 486 85 +28f9e 8 486 85 +28fa6 6 100 30 +28fac 2 486 85 +28fae 6 100 30 +28fb4 8 486 85 +FUNC 28fbc 20 0 testing::internal::TestFactoryImpl::CreateTest +28fbc 2 486 85 +28fbe 8 486 85 +28fc6 6 85 30 +28fcc 2 486 85 +28fce 6 85 30 +28fd4 8 486 85 +FUNC 28fdc 20 0 testing::internal::TestFactoryImpl::CreateTest +28fdc 2 486 85 +28fde 8 486 85 +28fe6 6 72 30 +28fec 2 486 85 +28fee 6 72 30 +28ff4 8 486 85 +FUNC 28ffc 20 0 testing::internal::TestFactoryImpl::CreateTest +28ffc 2 486 85 +28ffe 8 486 85 +29006 6 63 30 +2900c 2 486 85 +2900e 6 63 30 +29014 8 486 85 +FUNC 2901c 20 0 testing::internal::TestFactoryImpl::CreateTest +2901c 2 486 85 +2901e 8 486 85 +29026 6 130 30 +2902c 2 486 85 +2902e 6 130 30 +29034 8 486 85 +FUNC 2903c 20 0 testing::internal::TestFactoryImpl::CreateTest +2903c 2 486 85 +2903e 8 486 85 +29046 6 117 30 +2904c 2 486 85 +2904e 6 117 30 +29054 8 486 85 +FUNC 2905c 20 0 testing::internal::TestFactoryImpl::CreateTest +2905c 2 486 85 +2905e 8 486 85 +29066 6 143 30 +2906c 2 486 85 +2906e 6 143 30 +29074 8 486 85 +FUNC 2907c 116 0 google_breakpad::ProcCpuInfoReader::GetNextField +2907c 4 54 29 +29080 4 54 29 +29084 4 70 16 +29088 a 60 29 +29092 6 118 16 +29098 2 117 16 +2909a 2 118 16 +2909c 2 117 16 +2909e 6 118 16 +290a4 8 62 29 +290ac 8 66 16 +290b4 4 70 16 +290b8 8 66 16 +290c0 8 70 16 +290c8 2 70 16 +290ca 2 69 16 +290cc 6 69 16 +290d2 8 71 16 +290da 6 78 16 +290e0 4 86 16 +290e4 6 90 16 +290ea 4 92 16 +290ee 4 93 16 +290f2 4 68 29 +290f6 4 77 29 +290fa 2 70 29 +290fc 4 77 29 +29100 6 78 29 +29106 4 83 29 +2910a 2 84 29 +2910c 2 98 16 +2910e 2 3104 97 +29110 2 98 16 +29112 4 99 16 +29116 12 3104 97 +29128 4 3104 97 +2912c 6 3104 97 +29132 4 100 16 +29136 4 103 16 +2913a 2 105 16 +2913c 2 103 16 +2913e 8 105 16 +29146 c 84 29 +29152 2 84 29 +29154 8 84 29 +2915c 4 66 29 +29160 4 88 29 +29164 4 87 29 +29168 4 88 29 +2916c 6 92 29 +29172 8 92 29 +2917a 4 92 29 +2917e 4 95 29 +29182 4 99 29 +29186 4 101 29 +2918a 2 102 29 +2918c 6 104 29 +FUNC 29194 5c 0 ScopedTestFile::ScopedTestFile +29194 2 56 30 +29196 4 56 30 +2919a 8 60 52 +291a2 6 61 52 +291a8 8 62 52 +291b0 10 109 52 +291c0 4 109 52 +291c4 6 109 52 +291ca 4 110 52 +291ce 6 111 52 +291d4 8 112 52 +291dc a 116 52 +291e6 a 58 30 +FUNC 291f0 150 0 ProcCpuInfoReaderTest_EmptyFile_Test::TestBody +291f0 a 63 30 +291fa 4 63 30 +291fe 2 64 30 +29200 2 63 30 +29202 6 64 30 +29208 2 63 30 +2920a 4 64 30 +2920e 2 82 52 +29210 4 1139 87 +29214 2 82 52 +29216 2 277 82 +29218 2 82 52 +2921a 2 277 82 +2921c a 1139 87 +29226 2 65 30 +29228 16 65 30 +2923e a 65 30 +29248 4 65 30 +2924c a 65 30 +29256 6 65 30 +2925c 8 65 30 +29264 6 85 79 +2926a 6 65 30 +29270 4 156 137 +29274 6 256 82 +2927a 2 49 16 +2927c 2 69 30 +2927e 2 49 16 +29280 4 48 29 +29284 2 69 30 +29286 8 49 16 +2928e 4 48 29 +29292 a 69 30 +2929c 2 277 82 +2929e 4 1139 87 +292a2 2 69 30 +292a4 1a 69 30 +292be c 69 30 +292ca 2 69 30 +292cc a 69 30 +292d6 6 69 30 +292dc 8 69 30 +292e4 6 85 79 +292ea 6 69 30 +292f0 6 156 137 +292f6 6 256 82 +292fc 6 54 30 +29302 3e 70 30 +FUNC 29340 230 0 ProcCpuInfoReaderTest_OneLineTerminated_Test::TestBody +29340 a 72 30 +2934a 4 72 30 +2934e 2 73 30 +29350 2 72 30 +29352 8 73 30 +2935a 2 72 30 +2935c 4 73 30 +29360 4 82 52 +29364 4 1139 87 +29368 2 82 52 +2936a 2 277 82 +2936c 2 82 52 +2936e 2 277 82 +29370 8 1139 87 +29378 2 74 30 +2937a 16 74 30 +29390 12 74 30 +293a2 6 256 82 +293a8 4 49 16 +293ac 4 78 30 +293b0 2 49 16 +293b2 4 48 29 +293b6 4 78 30 +293ba 8 49 16 +293c2 4 48 29 +293c6 4 78 30 +293ca 4 1139 87 +293ce 2 277 82 +293d0 2 78 30 +293d2 18 78 30 +293ea 12 78 30 +293fc 6 256 82 +29402 1c 79 30 +2941e 6 302 82 +29424 10 79 30 +29434 6 256 82 +2943a 18 80 30 +29452 4 80 30 +29456 6 302 82 +2945c e 80 30 +2946a 2 80 30 +2946c 4 80 30 +29470 6 80 30 +29476 8 80 30 +2947e 6 85 79 +29484 8 80 30 +2948c 6 256 82 +29492 e 82 30 +294a0 2 277 82 +294a2 4 1139 87 +294a6 2 82 30 +294a8 18 82 30 +294c0 10 82 30 +294d0 4 82 30 +294d4 4 82 30 +294d8 6 82 30 +294de 8 82 30 +294e6 6 85 79 +294ec 6 82 30 +294f2 6 156 137 +294f8 6 256 82 +294fe 6 54 30 +29504 6c 83 30 +FUNC 29570 30c 0 ProcCpuInfoReaderTest_TwoLinesTerminated_Test::TestBody +29570 a 100 30 +2957a 4 100 30 +2957e 2 101 30 +29580 2 100 30 +29582 8 101 30 +2958a 2 100 30 +2958c 4 101 30 +29590 4 82 52 +29594 2 1139 87 +29596 2 82 52 +29598 2 277 82 +2959a 4 82 52 +2959e 2 277 82 +295a0 6 1139 87 +295a6 2 102 30 +295a8 16 102 30 +295be 12 102 30 +295d0 6 256 82 +295d6 4 49 16 +295da 4 106 30 +295de 2 49 16 +295e0 4 48 29 +295e4 4 106 30 +295e8 4 49 16 +295ec 4 48 29 +295f0 4 106 30 +295f4 2 1139 87 +295f6 2 277 82 +295f8 2 106 30 +295fa 18 106 30 +29612 12 106 30 +29624 6 256 82 +2962a 20 107 30 +2964a 6 302 82 +29650 10 107 30 +29660 6 256 82 +29666 1c 108 30 +29682 4 108 30 +29686 6 302 82 +2968c 10 108 30 +2969c 6 256 82 +296a2 8 110 30 +296aa 2 1139 87 +296ac 2 277 82 +296ae 2 110 30 +296b0 18 110 30 +296c8 12 110 30 +296da 6 256 82 +296e0 1a 111 30 +296fa 6 302 82 +29700 10 111 30 +29710 6 256 82 +29716 16 112 30 +2972c 4 112 30 +29730 6 302 82 +29736 e 112 30 +29744 2 112 30 +29746 4 112 30 +2974a 6 112 30 +29750 8 112 30 +29758 6 85 79 +2975e 8 112 30 +29766 6 256 82 +2976c e 114 30 +2977a 2 277 82 +2977c 2 1139 87 +2977e 2 114 30 +29780 18 114 30 +29798 10 114 30 +297a8 2 114 30 +297aa 4 114 30 +297ae 6 114 30 +297b4 8 114 30 +297bc 6 85 79 +297c2 6 114 30 +297c8 6 156 137 +297ce 6 256 82 +297d4 4 54 30 +297d8 6 256 82 +297de 6 54 30 +297e4 98 115 30 +FUNC 2987c 230 0 ProcCpuInfoReaderTest_SkipMalformedLine_Test::TestBody +2987c a 117 30 +29886 4 117 30 +2988a 2 118 30 +2988c 2 117 30 +2988e 8 118 30 +29896 2 117 30 +29898 4 118 30 +2989c 4 82 52 +298a0 4 1139 87 +298a4 2 82 52 +298a6 2 277 82 +298a8 2 82 52 +298aa 2 277 82 +298ac 8 1139 87 +298b4 2 119 30 +298b6 16 119 30 +298cc 12 119 30 +298de 6 256 82 +298e4 4 49 16 +298e8 4 123 30 +298ec 2 49 16 +298ee 4 48 29 +298f2 4 123 30 +298f6 8 49 16 +298fe 4 48 29 +29902 4 123 30 +29906 4 1139 87 +2990a 2 277 82 +2990c 2 123 30 +2990e 18 123 30 +29926 12 123 30 +29938 6 256 82 +2993e 1c 124 30 +2995a 6 302 82 +29960 10 124 30 +29970 6 256 82 +29976 18 125 30 +2998e 4 125 30 +29992 6 302 82 +29998 e 125 30 +299a6 2 125 30 +299a8 4 125 30 +299ac 6 125 30 +299b2 8 125 30 +299ba 6 85 79 +299c0 8 125 30 +299c8 6 256 82 +299ce e 127 30 +299dc 2 277 82 +299de 4 1139 87 +299e2 2 127 30 +299e4 18 127 30 +299fc 10 127 30 +29a0c 4 127 30 +29a10 4 127 30 +29a14 6 127 30 +29a1a 8 127 30 +29a22 6 85 79 +29a28 6 127 30 +29a2e 6 156 137 +29a34 6 256 82 +29a3a 6 54 30 +29a40 6c 128 30 +FUNC 29aac 230 0 ProcCpuInfoReaderTest_SkipOneEmptyLine_Test::TestBody +29aac a 130 30 +29ab6 4 130 30 +29aba 2 131 30 +29abc 2 130 30 +29abe 8 131 30 +29ac6 2 130 30 +29ac8 4 131 30 +29acc 4 82 52 +29ad0 4 1139 87 +29ad4 2 82 52 +29ad6 2 277 82 +29ad8 2 82 52 +29ada 2 277 82 +29adc 8 1139 87 +29ae4 2 132 30 +29ae6 16 132 30 +29afc 12 132 30 +29b0e 6 256 82 +29b14 4 49 16 +29b18 4 136 30 +29b1c 2 49 16 +29b1e 4 48 29 +29b22 4 136 30 +29b26 8 49 16 +29b2e 4 48 29 +29b32 4 136 30 +29b36 4 1139 87 +29b3a 2 277 82 +29b3c 2 136 30 +29b3e 18 136 30 +29b56 12 136 30 +29b68 6 256 82 +29b6e 1c 137 30 +29b8a 6 302 82 +29b90 10 137 30 +29ba0 6 256 82 +29ba6 18 138 30 +29bbe 4 138 30 +29bc2 6 302 82 +29bc8 e 138 30 +29bd6 2 138 30 +29bd8 4 138 30 +29bdc 6 138 30 +29be2 8 138 30 +29bea 6 85 79 +29bf0 8 138 30 +29bf8 6 256 82 +29bfe e 140 30 +29c0c 2 277 82 +29c0e 4 1139 87 +29c12 2 140 30 +29c14 18 140 30 +29c2c 10 140 30 +29c3c 4 140 30 +29c40 4 140 30 +29c44 6 140 30 +29c4a 8 140 30 +29c52 6 85 79 +29c58 6 140 30 +29c5e 6 156 137 +29c64 6 256 82 +29c6a 6 54 30 +29c70 6c 141 30 +FUNC 29cdc 230 0 ProcCpuInfoReaderTest_SkipEmptyField_Test::TestBody +29cdc a 143 30 +29ce6 4 143 30 +29cea 2 144 30 +29cec 2 143 30 +29cee 8 144 30 +29cf6 2 143 30 +29cf8 4 144 30 +29cfc 4 82 52 +29d00 4 1139 87 +29d04 2 82 52 +29d06 2 277 82 +29d08 2 82 52 +29d0a 2 277 82 +29d0c 8 1139 87 +29d14 2 145 30 +29d16 16 145 30 +29d2c 12 145 30 +29d3e 6 256 82 +29d44 4 49 16 +29d48 4 149 30 +29d4c 2 49 16 +29d4e 4 48 29 +29d52 4 149 30 +29d56 8 49 16 +29d5e 4 48 29 +29d62 4 149 30 +29d66 4 1139 87 +29d6a 2 277 82 +29d6c 2 149 30 +29d6e 18 149 30 +29d86 12 149 30 +29d98 6 256 82 +29d9e 1c 150 30 +29dba 6 302 82 +29dc0 10 150 30 +29dd0 6 256 82 +29dd6 18 151 30 +29dee 4 151 30 +29df2 6 302 82 +29df8 e 151 30 +29e06 2 151 30 +29e08 4 151 30 +29e0c 6 151 30 +29e12 8 151 30 +29e1a 6 85 79 +29e20 8 151 30 +29e28 6 256 82 +29e2e e 153 30 +29e3c 2 277 82 +29e3e 4 1139 87 +29e42 2 153 30 +29e44 18 153 30 +29e5c 10 153 30 +29e6c 4 153 30 +29e70 4 153 30 +29e74 6 153 30 +29e7a 8 153 30 +29e82 6 85 79 +29e88 6 153 30 +29e8e 6 156 137 +29e94 6 256 82 +29e9a 6 54 30 +29ea0 6c 154 30 +FUNC 29f0c 300 0 ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test::TestBody +29f0c a 156 30 +29f16 4 156 30 +29f1a 2 157 30 +29f1c 2 156 30 +29f1e 8 157 30 +29f26 2 156 30 +29f28 4 157 30 +29f2c 4 82 52 +29f30 2 1139 87 +29f32 2 82 52 +29f34 2 277 82 +29f36 4 82 52 +29f3a 2 277 82 +29f3c 6 1139 87 +29f42 2 158 30 +29f44 16 158 30 +29f5a 12 158 30 +29f6c 6 256 82 +29f72 4 49 16 +29f76 4 162 30 +29f7a 2 49 16 +29f7c 4 48 29 +29f80 4 162 30 +29f84 4 49 16 +29f88 4 48 29 +29f8c 4 162 30 +29f90 2 1139 87 +29f92 2 277 82 +29f94 2 162 30 +29f96 18 162 30 +29fae 12 162 30 +29fc0 6 256 82 +29fc6 28 163 30 +29fee 6 302 82 +29ff4 10 163 30 +2a004 6 256 82 +2a00a 22 164 30 +2a02c 4 164 30 +2a030 6 302 82 +2a036 10 164 30 +2a046 6 256 82 +2a04c 8 166 30 +2a054 2 1139 87 +2a056 2 277 82 +2a058 2 166 30 +2a05a 18 166 30 +2a072 12 166 30 +2a084 6 256 82 +2a08a 16 167 30 +2a0a0 6 302 82 +2a0a6 10 167 30 +2a0b6 6 256 82 +2a0bc 10 168 30 +2a0cc 4 168 30 +2a0d0 6 302 82 +2a0d6 e 168 30 +2a0e4 2 168 30 +2a0e6 4 168 30 +2a0ea 6 168 30 +2a0f0 8 168 30 +2a0f8 6 85 79 +2a0fe 8 168 30 +2a106 6 256 82 +2a10c e 170 30 +2a11a 2 277 82 +2a11c 2 1139 87 +2a11e 2 170 30 +2a120 18 170 30 +2a138 10 170 30 +2a148 2 170 30 +2a14a 4 170 30 +2a14e 6 170 30 +2a154 8 170 30 +2a15c 6 85 79 +2a162 6 170 30 +2a168 6 156 137 +2a16e 6 256 82 +2a174 4 54 30 +2a178 6 256 82 +2a17e 6 54 30 +2a184 88 171 30 +FUNC 2a20c 230 0 ProcCpuInfoReaderTest_FieldWithSpaces_Test::TestBody +2a20c a 173 30 +2a216 4 173 30 +2a21a 2 174 30 +2a21c 2 173 30 +2a21e 8 174 30 +2a226 2 173 30 +2a228 4 174 30 +2a22c 4 82 52 +2a230 4 1139 87 +2a234 2 82 52 +2a236 2 277 82 +2a238 2 82 52 +2a23a 2 277 82 +2a23c 8 1139 87 +2a244 2 175 30 +2a246 16 175 30 +2a25c 12 175 30 +2a26e 6 256 82 +2a274 4 49 16 +2a278 4 179 30 +2a27c 2 49 16 +2a27e 4 48 29 +2a282 4 179 30 +2a286 8 49 16 +2a28e 4 48 29 +2a292 4 179 30 +2a296 4 1139 87 +2a29a 2 277 82 +2a29c 2 179 30 +2a29e 18 179 30 +2a2b6 12 179 30 +2a2c8 6 256 82 +2a2ce 1c 180 30 +2a2ea 6 302 82 +2a2f0 10 180 30 +2a300 6 256 82 +2a306 18 181 30 +2a31e 4 181 30 +2a322 6 302 82 +2a328 e 181 30 +2a336 2 181 30 +2a338 4 181 30 +2a33c 6 181 30 +2a342 8 181 30 +2a34a 6 85 79 +2a350 8 181 30 +2a358 6 256 82 +2a35e e 183 30 +2a36c 2 277 82 +2a36e 4 1139 87 +2a372 2 183 30 +2a374 18 183 30 +2a38c 10 183 30 +2a39c 4 183 30 +2a3a0 4 183 30 +2a3a4 6 183 30 +2a3aa 8 183 30 +2a3b2 6 85 79 +2a3b8 6 183 30 +2a3be 6 156 137 +2a3c4 6 256 82 +2a3ca 6 54 30 +2a3d0 6c 184 30 +FUNC 2a43c 294 0 ProcCpuInfoReaderTest_EmptyValue_Test::TestBody +2a43c c 186 30 +2a448 6 186 30 +2a44e 2 187 30 +2a450 4 186 30 +2a454 8 187 30 +2a45c 2 186 30 +2a45e 4 187 30 +2a462 4 82 52 +2a466 4 1139 87 +2a46a 2 82 52 +2a46c 2 277 82 +2a46e 2 82 52 +2a470 2 277 82 +2a472 a 1139 87 +2a47c 2 188 30 +2a47e 16 188 30 +2a494 12 188 30 +2a4a6 6 256 82 +2a4ac 4 49 16 +2a4b0 4 192 30 +2a4b4 2 49 16 +2a4b6 4 48 29 +2a4ba 4 192 30 +2a4be 8 49 16 +2a4c6 4 48 29 +2a4ca 4 192 30 +2a4ce 4 1139 87 +2a4d2 2 277 82 +2a4d4 2 192 30 +2a4d6 18 192 30 +2a4ee 12 192 30 +2a500 6 256 82 +2a506 1c 193 30 +2a522 6 302 82 +2a528 10 193 30 +2a538 6 256 82 +2a53e c 117 29 +2a54a 18 195 30 +2a562 4 195 30 +2a566 6 302 82 +2a56c 10 195 30 +2a57c 6 256 82 +2a582 4 1481 82 +2a586 4 196 30 +2a58a 2 1481 82 +2a58c 8 1482 82 +2a594 14 1487 82 +2a5a8 6 196 30 +2a5ae 6 302 82 +2a5b4 12 196 30 +2a5c6 6 196 30 +2a5cc 8 196 30 +2a5d4 6 85 79 +2a5da 8 196 30 +2a5e2 6 256 82 +2a5e8 8 198 30 +2a5f0 2 1139 87 +2a5f2 6 198 30 +2a5f8 2 277 82 +2a5fa 2 1139 87 +2a5fc 2 198 30 +2a5fe 18 198 30 +2a616 14 198 30 +2a62a 6 198 30 +2a630 8 198 30 +2a638 6 85 79 +2a63e 6 198 30 +2a644 6 156 137 +2a64a 6 256 82 +2a650 6 54 30 +2a656 7a 199 30 +FUNC 2a6d0 294 0 ProcCpuInfoReaderTest_OneLine_Test::TestBody +2a6d0 c 85 30 +2a6dc 6 85 30 +2a6e2 2 86 30 +2a6e4 4 85 30 +2a6e8 8 86 30 +2a6f0 2 85 30 +2a6f2 4 86 30 +2a6f6 4 82 52 +2a6fa 4 1139 87 +2a6fe 2 82 52 +2a700 2 277 82 +2a702 2 82 52 +2a704 2 277 82 +2a706 a 1139 87 +2a710 2 87 30 +2a712 16 87 30 +2a728 12 87 30 +2a73a 6 256 82 +2a740 4 49 16 +2a744 4 92 30 +2a748 2 49 16 +2a74a 4 48 29 +2a74e 8 49 16 +2a756 4 92 30 +2a75a 4 48 29 +2a75e 4 92 30 +2a762 4 1139 87 +2a766 2 277 82 +2a768 2 92 30 +2a76a 18 92 30 +2a782 12 92 30 +2a794 6 256 82 +2a79a 1c 93 30 +2a7b6 6 302 82 +2a7bc 10 93 30 +2a7cc 6 256 82 +2a7d2 c 117 29 +2a7de 18 94 30 +2a7f6 4 94 30 +2a7fa 6 302 82 +2a800 10 94 30 +2a810 6 256 82 +2a816 4 95 30 +2a81a 8 1481 82 +2a822 8 1482 82 +2a82a 14 1487 82 +2a83e 4 95 30 +2a842 6 302 82 +2a848 12 95 30 +2a85a 6 95 30 +2a860 8 95 30 +2a868 6 85 79 +2a86e 8 95 30 +2a876 6 256 82 +2a87c 8 97 30 +2a884 2 1139 87 +2a886 6 97 30 +2a88c 2 277 82 +2a88e 2 1139 87 +2a890 2 97 30 +2a892 18 97 30 +2a8aa 14 97 30 +2a8be 6 97 30 +2a8c4 8 97 30 +2a8cc 6 85 79 +2a8d2 6 97 30 +2a8d8 6 156 137 +2a8de 6 256 82 +2a8e4 6 54 30 +2a8ea 7a 98 30 +FUNC 2a964 18 0 ElfCoreDumpTest_ValidCoreFile_Test::~ElfCoreDumpTest_ValidCoreFile_Test +2a964 2 130 39 +2a966 16 130 39 +FUNC 2a97c 12 0 ElfCoreDumpTest_ValidCoreFile_Test::~ElfCoreDumpTest_ValidCoreFile_Test +2a97c 2 130 39 +2a97e 6 130 39 +2a984 6 130 39 +2a98a 4 130 39 +FUNC 2a990 18 0 ElfCoreDumpTest_TestElfHeader_Test::~ElfCoreDumpTest_TestElfHeader_Test +2a990 2 62 39 +2a992 16 62 39 +FUNC 2a9a8 12 0 ElfCoreDumpTest_TestElfHeader_Test::~ElfCoreDumpTest_TestElfHeader_Test +2a9a8 2 62 39 +2a9aa 6 62 39 +2a9b0 6 62 39 +2a9b6 4 62 39 +FUNC 2a9bc 18 0 ElfCoreDumpTest_DefaultConstructor_Test::~ElfCoreDumpTest_DefaultConstructor_Test +2a9bc 2 52 39 +2a9be 16 52 39 +FUNC 2a9d4 12 0 ElfCoreDumpTest_DefaultConstructor_Test::~ElfCoreDumpTest_DefaultConstructor_Test +2a9d4 2 52 39 +2a9d6 6 52 39 +2a9dc 6 52 39 +2a9e2 4 52 39 +FUNC 2a9e8 20 0 testing::internal::TestFactoryImpl::CreateTest +2a9e8 2 486 85 +2a9ea 8 486 85 +2a9f2 6 52 39 +2a9f8 2 486 85 +2a9fa 6 52 39 +2aa00 8 486 85 +FUNC 2aa08 20 0 testing::internal::TestFactoryImpl::CreateTest +2aa08 2 486 85 +2aa0a 8 486 85 +2aa12 6 130 39 +2aa18 2 486 85 +2aa1a 6 130 39 +2aa20 8 486 85 +FUNC 2aa28 20 0 testing::internal::TestFactoryImpl::CreateTest +2aa28 2 486 85 +2aa2a 8 486 85 +2aa32 6 62 39 +2aa38 2 486 85 +2aa3a 6 62 39 +2aa40 8 486 85 +FUNC 2aa48 30 0 std::map >::Range, std::less, std::allocator >::Range> > >::map +2aa48 6 99 123 +2aa4e 10 250 141 +2aa5e 8 481 106 +2aa66 2 263 141 +2aa68 2 99 123 +2aa6a 2 263 141 +2aa6c 2 265 141 +2aa6e 2 266 141 +2aa70 2 267 141 +2aa72 2 391 141 +2aa74 4 99 123 +FUNC 2aa48 30 0 std::map::Range, std::less, std::allocator::Range> > >::map +2aa48 6 99 123 +2aa4e 10 250 141 +2aa5e 8 481 106 +2aa66 2 263 141 +2aa68 2 99 123 +2aa6a 2 263 141 +2aa6c 2 265 141 +2aa6e 2 266 141 +2aa70 2 267 141 +2aa72 2 391 141 +2aa74 4 99 123 +FUNC 2aa48 30 0 std::map, std::allocator > >::map +FUNC 2aa48 30 0 std::set, std::allocator >::set +2aa48 6 129 147 +2aa4e 10 250 141 +2aa5e 8 481 106 +2aa66 2 263 141 +2aa68 2 129 147 +2aa6a 2 263 141 +2aa6c 2 265 141 +2aa6e 2 266 141 +2aa70 2 267 141 +2aa72 2 391 141 +2aa74 4 129 147 +FUNC 2aa78 74 0 std::operator==, std::allocator > +2aa78 2 7 130 +2aa7a 8 10 130 +2aa82 8 10 130 +2aa8a 2 555 105 +2aa8c 2 200 141 +2aa8e 2 555 105 +2aa90 4 556 105 +2aa94 2 171 141 +2aa96 4 556 105 +2aa9a 4 297 140 +2aa9e a 94 141 +2aaa8 2 301 140 +2aaaa 6 302 140 +2aab0 6 304 140 +2aab6 8 309 140 +2aabe 2 177 141 +2aac0 4 297 140 +2aac4 a 94 141 +2aace 2 301 140 +2aad0 6 302 140 +2aad6 6 304 140 +2aadc 8 309 140 +2aae4 4 177 141 +2aae8 2 10 130 +2aaea 2 11 130 +FUNC 2aaec 2c 0 testing::internal::DefaultPrintTo +2aaec 2 307 80 +2aaee 2 307 80 +2aaf0 4 310 80 +2aaf4 4 334 80 +2aaf8 a 333 127 +2ab02 6 318 80 +2ab08 4 291 126 +2ab0c 4 334 80 +2ab10 8 291 126 +FUNC 2aaec 2c 0 testing::internal::DefaultPrintTo +FUNC 2ab18 a0 0 testing::internal::CmpHelperEQFailure +FUNC 2ab18 a0 0 testing::internal::CmpHelperEQFailure +2ab18 e 1464 82 +2ab26 2 1464 82 +2ab28 2 884 80 +2ab2a 6 1464 82 +2ab30 4 380 80 +2ab34 2 1464 82 +2ab36 4 884 80 +2ab3a 4 1464 82 +2ab3e 2 75 132 +2ab40 4 884 80 +2ab44 4 380 80 +2ab48 2 75 132 +2ab4a 4 380 80 +2ab4e 8 75 132 +2ab56 6 886 80 +2ab5c 8 884 80 +2ab64 6 380 80 +2ab6a 4 75 132 +2ab6e 4 380 80 +2ab72 8 75 132 +2ab7a 6 886 80 +2ab80 14 1471 82 +2ab94 c 156 137 +2aba0 18 1472 82 +FUNC 2abb8 2fc 0 ElfCoreDumpTest_DefaultConstructor_Test::TestBody +2abb8 a 52 39 +2abc2 6 52 39 +2abc8 2 53 39 +2abca 4 52 39 +2abce 2 53 39 +2abd0 2 52 39 +2abd2 4 53 39 +2abd6 6 54 39 +2abdc 2 1139 87 +2abde 6 54 39 +2abe4 4 277 82 +2abe8 6 1139 87 +2abee 2 54 39 +2abf0 1a 54 39 +2ac0a 14 54 39 +2ac1e 6 54 39 +2ac24 8 54 39 +2ac2c 6 85 79 +2ac32 6 54 39 +2ac38 6 156 137 +2ac3e a 256 82 +2ac48 6 55 39 +2ac4e 6 1571 82 +2ac54 2 1481 82 +2ac56 8 1482 82 +2ac5e 14 1487 82 +2ac72 8 55 39 +2ac7a 6 302 82 +2ac80 10 55 39 +2ac90 6 55 39 +2ac96 8 55 39 +2ac9e 6 85 79 +2aca4 6 55 39 +2acaa 6 256 82 +2acb0 a 56 39 +2acba 4 1552 82 +2acbe 2 56 39 +2acc0 e 1552 82 +2acce 6 56 39 +2acd4 6 302 82 +2acda 10 56 39 +2acea 6 56 39 +2acf0 8 56 39 +2acf8 6 85 79 +2acfe 6 56 39 +2ad04 6 256 82 +2ad0a 8 57 39 +2ad12 6 1571 82 +2ad18 2 1481 82 +2ad1a 8 1482 82 +2ad22 14 1487 82 +2ad36 6 57 39 +2ad3c 6 302 82 +2ad42 10 57 39 +2ad52 6 57 39 +2ad58 8 57 39 +2ad60 6 85 79 +2ad66 6 57 39 +2ad6c 6 256 82 +2ad72 8 58 39 +2ad7a 6 1571 82 +2ad80 2 1481 82 +2ad82 8 1482 82 +2ad8a 12 1487 82 +2ad9c 6 58 39 +2ada2 6 302 82 +2ada8 12 58 39 +2adba 6 58 39 +2adc0 8 58 39 +2adc8 6 85 79 +2adce 6 58 39 +2add4 6 256 82 +2adda 8 59 39 +2ade2 6 59 39 +2ade8 2 1139 87 +2adea 6 59 39 +2adf0 4 277 82 +2adf4 2 1139 87 +2adf6 2 59 39 +2adf8 18 59 39 +2ae10 14 59 39 +2ae24 6 59 39 +2ae2a 8 59 39 +2ae32 6 85 79 +2ae38 6 59 39 +2ae3e 6 156 137 +2ae44 6 256 82 +2ae4a 6a 60 39 +FUNC 2aeb4 20 0 std::priv::_Rb_tree, int, std::priv::_Identity, std::priv::_SetTraitsT, std::allocator >::_M_erase +2aeb4 6 655 140 +2aeba 2 657 140 +2aebc 8 658 140 +2aec4 2 659 140 +2aec6 c 161 106 +2aed2 2 664 140 +FUNC 2aed4 1a 0 std::priv::_Rb_tree, int, std::priv::_Identity, std::priv::_SetTraitsT, std::allocator >::clear +2aed4 2 531 141 +2aed6 2 530 141 +2aed8 2 530 141 +2aeda 2 531 141 +2aedc 6 532 141 +2aee2 2 534 141 +2aee4 2 533 141 +2aee6 2 534 141 +2aee8 2 535 141 +2aeea 4 536 141 +FUNC 2aef0 f5c 0 ElfCoreDumpTest_TestElfHeader_Test::TestBody +2aef0 a 62 39 +2aefa 4 62 39 +2aefe 2 64 39 +2af00 2 62 39 +2af02 4 64 39 +2af06 4 66 39 +2af0a 2 64 39 +2af0c 2 62 39 +2af0e 4 64 39 +2af12 6 66 39 +2af18 12 67 39 +2af2a c 69 39 +2af36 a 70 39 +2af40 a 72 39 +2af4a 6 1139 87 +2af50 4 277 82 +2af54 10 1139 87 +2af64 2 72 39 +2af66 1e 72 39 +2af84 12 72 39 +2af96 6 256 82 +2af9c a 73 39 +2afa6 4 1139 87 +2afaa 4 277 82 +2afae 2 73 39 +2afb0 1e 73 39 +2afce 14 73 39 +2afe2 6 73 39 +2afe8 8 73 39 +2aff0 6 85 79 +2aff6 6 73 39 +2affc 6 156 137 +2b002 c 256 82 +2b00e 8 74 39 +2b016 c 75 39 +2b022 4 277 82 +2b026 4 1139 87 +2b02a 2 75 39 +2b02c 20 75 39 +2b04c 14 75 39 +2b060 6 75 39 +2b066 8 75 39 +2b06e 6 85 79 +2b074 6 75 39 +2b07a 6 156 137 +2b080 6 256 82 +2b086 6 76 39 +2b08c 6 1571 82 +2b092 2 1481 82 +2b094 8 1482 82 +2b09c 18 1487 82 +2b0b4 6 76 39 +2b0ba 6 302 82 +2b0c0 a 76 39 +2b0ca 2 76 39 +2b0cc 8 76 39 +2b0d4 6 76 39 +2b0da 8 76 39 +2b0e2 6 85 79 +2b0e8 6 76 39 +2b0ee 6 256 82 +2b0f4 c 77 39 +2b100 8 1552 82 +2b108 4 256 82 +2b10c 6 1552 82 +2b112 2 77 39 +2b114 10 1552 82 +2b124 6 77 39 +2b12a 6 302 82 +2b130 12 77 39 +2b142 6 77 39 +2b148 8 77 39 +2b150 6 85 79 +2b156 6 77 39 +2b15c 6 256 82 +2b162 8 78 39 +2b16a 2 1571 82 +2b16c 4 256 82 +2b170 2 1571 82 +2b172 2 1481 82 +2b174 8 1482 82 +2b17c 18 1487 82 +2b194 6 78 39 +2b19a 6 302 82 +2b1a0 c 78 39 +2b1ac 4 78 39 +2b1b0 8 78 39 +2b1b8 6 78 39 +2b1be 8 78 39 +2b1c6 6 85 79 +2b1cc 6 78 39 +2b1d2 6 256 82 +2b1d8 8 79 39 +2b1e0 2 1571 82 +2b1e2 4 256 82 +2b1e6 2 1571 82 +2b1e8 2 1481 82 +2b1ea 8 1482 82 +2b1f2 18 1487 82 +2b20a 6 79 39 +2b210 6 302 82 +2b216 c 79 39 +2b222 4 79 39 +2b226 8 79 39 +2b22e 6 79 39 +2b234 8 79 39 +2b23c 6 85 79 +2b242 6 79 39 +2b248 6 256 82 +2b24e 8 80 39 +2b256 6 80 39 +2b25c 2 1139 87 +2b25e 6 80 39 +2b264 4 277 82 +2b268 2 1139 87 +2b26a 2 80 39 +2b26c 1e 80 39 +2b28a 16 80 39 +2b2a0 6 80 39 +2b2a6 8 80 39 +2b2ae 6 85 79 +2b2b4 6 80 39 +2b2ba 6 156 137 +2b2c0 6 256 82 +2b2c6 a 82 39 +2b2d0 6 1139 87 +2b2d6 4 277 82 +2b2da 2 256 82 +2b2dc 4 1139 87 +2b2e0 2 82 39 +2b2e2 1e 82 39 +2b300 14 82 39 +2b314 2 256 82 +2b316 4 83 39 +2b31a 4 256 82 +2b31e a 83 39 +2b328 4 256 82 +2b32c 4 277 82 +2b330 4 1139 87 +2b334 2 83 39 +2b336 1e 83 39 +2b354 16 83 39 +2b36a 6 83 39 +2b370 8 83 39 +2b378 6 85 79 +2b37e 6 83 39 +2b384 6 156 137 +2b38a 8 256 82 +2b392 2 84 39 +2b394 4 256 82 +2b398 8 84 39 +2b3a0 c 85 39 +2b3ac 4 277 82 +2b3b0 4 1139 87 +2b3b4 2 85 39 +2b3b6 1e 85 39 +2b3d4 18 85 39 +2b3ec 6 85 39 +2b3f2 8 85 39 +2b3fa 6 85 79 +2b400 6 85 39 +2b406 6 156 137 +2b40c 8 256 82 +2b414 2 87 39 +2b416 6 88 39 +2b41c 4 87 39 +2b420 4 1139 87 +2b424 4 88 39 +2b428 2 256 82 +2b42a 4 277 82 +2b42e 4 1139 87 +2b432 2 88 39 +2b434 1e 88 39 +2b452 14 88 39 +2b466 2 256 82 +2b468 4 89 39 +2b46c 4 256 82 +2b470 a 89 39 +2b47a 4 1139 87 +2b47e 4 277 82 +2b482 2 89 39 +2b484 1e 89 39 +2b4a2 14 89 39 +2b4b6 2 256 82 +2b4b8 2 90 39 +2b4ba 4 256 82 +2b4be 8 90 39 +2b4c6 c 91 39 +2b4d2 4 277 82 +2b4d6 4 1139 87 +2b4da 2 91 39 +2b4dc 20 91 39 +2b4fc c 91 39 +2b508 4 91 39 +2b50c a 91 39 +2b516 6 91 39 +2b51c 8 91 39 +2b524 6 85 79 +2b52a 6 91 39 +2b530 6 156 137 +2b536 8 256 82 +2b53e 2 93 39 +2b540 6 94 39 +2b546 4 93 39 +2b54a 4 1139 87 +2b54e 4 94 39 +2b552 4 1139 87 +2b556 4 277 82 +2b55a 2 94 39 +2b55c 1e 94 39 +2b57a 14 94 39 +2b58e 2 256 82 +2b590 4 95 39 +2b594 4 256 82 +2b598 a 95 39 +2b5a2 4 1139 87 +2b5a6 4 277 82 +2b5aa 2 95 39 +2b5ac 1e 95 39 +2b5ca 14 95 39 +2b5de 4 96 39 +2b5e2 6 256 82 +2b5e8 8 96 39 +2b5f0 c 97 39 +2b5fc 4 277 82 +2b600 4 1139 87 +2b604 2 97 39 +2b606 20 97 39 +2b626 c 97 39 +2b632 4 97 39 +2b636 a 97 39 +2b640 6 97 39 +2b646 8 97 39 +2b64e 6 85 79 +2b654 6 97 39 +2b65a 6 156 137 +2b660 6 256 82 +2b666 2 99 39 +2b668 6 100 39 +2b66e 4 99 39 +2b672 4 1139 87 +2b676 4 100 39 +2b67a 2 256 82 +2b67c 4 277 82 +2b680 4 1139 87 +2b684 2 100 39 +2b686 1e 100 39 +2b6a4 14 100 39 +2b6b8 2 256 82 +2b6ba 4 101 39 +2b6be 4 256 82 +2b6c2 a 101 39 +2b6cc 4 1139 87 +2b6d0 4 277 82 +2b6d4 2 101 39 +2b6d6 1e 101 39 +2b6f4 14 101 39 +2b708 2 256 82 +2b70a 2 102 39 +2b70c 4 256 82 +2b710 8 102 39 +2b718 c 103 39 +2b724 4 277 82 +2b728 4 1139 87 +2b72c 2 103 39 +2b72e 20 103 39 +2b74e c 103 39 +2b75a 4 103 39 +2b75e a 103 39 +2b768 6 103 39 +2b76e 8 103 39 +2b776 6 85 79 +2b77c 6 103 39 +2b782 6 156 137 +2b788 8 256 82 +2b790 2 105 39 +2b792 6 106 39 +2b798 4 105 39 +2b79c 4 1139 87 +2b7a0 4 106 39 +2b7a4 4 1139 87 +2b7a8 4 277 82 +2b7ac 2 106 39 +2b7ae 1e 106 39 +2b7cc 14 106 39 +2b7e0 2 256 82 +2b7e2 4 107 39 +2b7e6 4 256 82 +2b7ea a 107 39 +2b7f4 4 1139 87 +2b7f8 4 277 82 +2b7fc 2 107 39 +2b7fe 1e 107 39 +2b81c 14 107 39 +2b830 4 108 39 +2b834 6 256 82 +2b83a 8 108 39 +2b842 c 109 39 +2b84e 4 277 82 +2b852 4 1139 87 +2b856 2 109 39 +2b858 20 109 39 +2b878 c 109 39 +2b884 4 109 39 +2b888 a 109 39 +2b892 6 109 39 +2b898 8 109 39 +2b8a0 6 85 79 +2b8a6 6 109 39 +2b8ac 6 156 137 +2b8b2 4 111 39 +2b8b6 6 256 82 +2b8bc 6 112 39 +2b8c2 4 111 39 +2b8c6 4 1139 87 +2b8ca 4 112 39 +2b8ce 2 256 82 +2b8d0 4 277 82 +2b8d4 4 1139 87 +2b8d8 2 112 39 +2b8da 1e 112 39 +2b8f8 14 112 39 +2b90c 2 256 82 +2b90e 4 113 39 +2b912 4 256 82 +2b916 a 113 39 +2b920 4 1139 87 +2b924 4 277 82 +2b928 2 113 39 +2b92a 18 113 39 +2b942 12 113 39 +2b954 2 256 82 +2b956 2 114 39 +2b958 4 256 82 +2b95c 8 114 39 +2b964 c 115 39 +2b970 4 277 82 +2b974 4 1139 87 +2b978 2 115 39 +2b97a 1a 115 39 +2b994 c 115 39 +2b9a0 4 115 39 +2b9a4 8 115 39 +2b9ac 6 115 39 +2b9b2 8 115 39 +2b9ba 6 85 79 +2b9c0 6 115 39 +2b9c6 6 156 137 +2b9cc 4 117 39 +2b9d0 8 256 82 +2b9d8 6 118 39 +2b9de 4 117 39 +2b9e2 2 1139 87 +2b9e4 4 118 39 +2b9e8 2 1139 87 +2b9ea 4 277 82 +2b9ee 2 118 39 +2b9f0 18 118 39 +2ba08 12 118 39 +2ba1a 2 256 82 +2ba1c 4 119 39 +2ba20 4 256 82 +2ba24 a 119 39 +2ba2e 2 1139 87 +2ba30 4 277 82 +2ba34 2 119 39 +2ba36 18 119 39 +2ba4e 12 119 39 +2ba60 4 120 39 +2ba64 6 256 82 +2ba6a 8 120 39 +2ba72 c 121 39 +2ba7e 4 277 82 +2ba82 2 1139 87 +2ba84 2 121 39 +2ba86 1a 121 39 +2baa0 c 121 39 +2baac 4 121 39 +2bab0 8 121 39 +2bab8 6 121 39 +2babe 8 121 39 +2bac6 6 85 79 +2bacc 6 121 39 +2bad2 6 156 137 +2bad8 6 256 82 +2bade 2 123 39 +2bae0 6 124 39 +2bae6 4 123 39 +2baea 2 1139 87 +2baec 4 124 39 +2baf0 2 1139 87 +2baf2 4 277 82 +2baf6 2 124 39 +2baf8 18 124 39 +2bb10 12 124 39 +2bb22 2 256 82 +2bb24 4 125 39 +2bb28 4 256 82 +2bb2c a 125 39 +2bb36 2 1139 87 +2bb38 4 277 82 +2bb3c 6 125 39 +2bb42 18 125 39 +2bb5a 10 125 39 +2bb6a 2 125 39 +2bb6c 4 125 39 +2bb70 6 125 39 +2bb76 8 125 39 +2bb7e 6 85 79 +2bb84 6 125 39 +2bb8a 6 156 137 +2bb90 c 256 82 +2bb9c 6 156 137 +2bba2 8 61 63 +2bbaa 1ee 156 137 +2bd98 2 126 39 +2bd9a 6 256 82 +2bda0 8 126 39 +2bda8 6 127 39 +2bdae 2 1139 87 +2bdb0 4 277 82 +2bdb4 2 127 39 +2bdb6 18 127 39 +2bdce a 127 39 +2bdd8 2 127 39 +2bdda a 127 39 +2bde4 6 127 39 +2bdea 8 127 39 +2bdf2 6 85 79 +2bdf8 6 127 39 +2bdfe 6 156 137 +2be04 6 256 82 +2be0a 6 69 39 +2be10 2 61 63 +2be12 6 156 137 +2be18 8 61 63 +2be20 6 156 137 +2be26 26 128 39 +FUNC 2be4c 98 0 std::priv::_Rb_tree, int, std::priv::_Identity, std::priv::_SetTraitsT, std::allocator >::_M_insert +2be4c 4 350 140 +2be50 2 358 140 +2be52 a 350 140 +2be5c 2 358 140 +2be5e 4 306 106 +2be62 8 307 106 +2be6a 2 126 108 +2be6c 4 321 141 +2be70 2 322 141 +2be72 2 360 140 +2be74 2 361 140 +2be76 4 362 140 +2be7a 4 364 140 +2be7e 4 364 140 +2be82 8 364 140 +2be8a 4 306 106 +2be8e 8 307 106 +2be96 2 126 108 +2be98 4 321 141 +2be9c 2 322 141 +2be9e 2 368 140 +2bea0 6 369 140 +2bea6 4 370 140 +2beaa 4 306 106 +2beae 8 307 106 +2beb6 2 126 108 +2beb8 4 321 141 +2bebc 2 322 141 +2bebe 2 374 140 +2bec0 6 375 140 +2bec6 2 376 140 +2bec8 2 379 140 +2beca 2 378 140 +2becc 6 379 140 +2bed2 2 382 140 +2bed4 6 380 140 +2beda 4 142 141 +2bede 6 382 140 +FUNC 2bee4 8e 0 std::priv::_Rb_tree, int, std::priv::_Identity, std::priv::_SetTraitsT, std::allocator >::insert_unique +2bee4 2 405 140 +2bee6 2 405 140 +2bee8 2 408 140 +2beea 2 406 140 +2beec 2 405 140 +2beee 2 407 140 +2bef0 2 409 140 +2bef2 6 412 140 +2bef8 4 412 140 +2befc 10 412 140 +2bf0c 2 142 141 +2bf0e 2 415 140 +2bf10 6 416 140 +2bf16 4 417 140 +2bf1a 4 279 140 +2bf1e 8 279 140 +2bf26 4 280 140 +2bf2a 4 281 140 +2bf2e 8 99 141 +2bf36 2 285 140 +2bf38 6 286 140 +2bf3e 6 288 140 +2bf44 2 187 141 +2bf46 e 421 140 +2bf54 a 422 140 +2bf5e 4 142 141 +2bf62 6 62 129 +2bf68 2 142 141 +2bf6a 2 62 129 +2bf6c 6 425 140 +FUNC 2bf74 858 0 ElfCoreDumpTest_ValidCoreFile_Test::TestBody +2bf74 14 130 39 +2bf88 2 130 39 +2bf8a 4 131 39 +2bf8e 2 130 39 +2bf90 4 131 39 +2bf94 a 132 39 +2bf9e 14 134 39 +2bfb2 2 135 39 +2bfb4 8 138 39 +2bfbc 2 141 39 +2bfbe a 140 39 +2bfc8 e 141 39 +2bfd6 4 277 82 +2bfda a 1139 87 +2bfe4 2 141 39 +2bfe6 1e 141 39 +2c004 14 141 39 +2c018 6 141 39 +2c01e 8 141 39 +2c026 6 85 79 +2c02c 6 141 39 +2c032 6 156 137 +2c038 e 256 82 +2c046 a 143 39 +2c050 6 144 39 +2c056 8 146 39 +2c05e 2 145 39 +2c060 2 146 39 +2c062 a 229 147 +2c06c 4 145 39 +2c070 a 151 39 +2c07a a 151 39 +2c084 6 156 137 +2c08a 2 151 39 +2c08c 14 153 39 +2c0a0 2 154 39 +2c0a2 a 158 39 +2c0ac 8 159 39 +2c0b4 a 159 39 +2c0be 4 277 82 +2c0c2 2 156 137 +2c0c4 2 1139 87 +2c0c6 4 156 137 +2c0ca a 159 39 +2c0d4 1c 159 39 +2c0f0 16 159 39 +2c106 6 159 39 +2c10c 8 159 39 +2c114 6 85 79 +2c11a 6 159 39 +2c120 6 156 137 +2c126 c 256 82 +2c132 4 162 39 +2c136 4 256 82 +2c13a 6 162 39 +2c140 8 163 39 +2c148 6 164 39 +2c14e 2 1139 87 +2c150 4 277 82 +2c154 2 164 39 +2c156 1c 164 39 +2c172 16 164 39 +2c188 6 164 39 +2c18e 8 164 39 +2c196 6 85 79 +2c19c 6 164 39 +2c1a2 6 156 137 +2c1a8 6 256 82 +2c1ae 2 187 39 +2c1b0 2 196 39 +2c1b2 2 187 39 +2c1b4 2 188 39 +2c1b6 4 196 39 +2c1ba 8 197 39 +2c1c2 18 201 39 +2c1da 8 201 39 +2c1e2 10 202 39 +2c1f2 16 198 39 +2c208 8 199 39 +2c210 8 200 39 +2c218 2 201 39 +2c21a 2 1139 87 +2c21c 6 201 39 +2c222 2 1139 87 +2c224 4 277 82 +2c228 2 201 39 +2c22a 14 201 39 +2c23e 8 201 39 +2c246 4 201 39 +2c24a a 201 39 +2c254 6 201 39 +2c25a 8 201 39 +2c262 6 85 79 +2c268 6 201 39 +2c26e 6 156 137 +2c274 a 256 82 +2c27e 2 1139 87 +2c280 8 202 39 +2c288 2 1139 87 +2c28a 4 277 82 +2c28e 2 202 39 +2c290 16 202 39 +2c2a6 c 202 39 +2c2b2 4 202 39 +2c2b6 a 202 39 +2c2c0 6 202 39 +2c2c6 8 202 39 +2c2ce 6 85 79 +2c2d4 6 202 39 +2c2da 6 156 137 +2c2e0 8 256 82 +2c2e8 8 204 39 +2c2f0 2 256 82 +2c2f2 a 204 39 +2c2fc 2 206 39 +2c2fe 2 1139 87 +2c300 6 206 39 +2c306 2 1139 87 +2c308 4 277 82 +2c30c 2 206 39 +2c30e 20 206 39 +2c32e c 206 39 +2c33a 4 206 39 +2c33e a 206 39 +2c348 6 206 39 +2c34e 8 206 39 +2c356 6 85 79 +2c35c 6 206 39 +2c362 6 156 137 +2c368 6 256 82 +2c36e 2 207 39 +2c370 4 1512 82 +2c374 8 207 39 +2c37c c 1512 82 +2c388 4 207 39 +2c38c 4 1512 82 +2c390 6 207 39 +2c396 6 302 82 +2c39c 10 207 39 +2c3ac 6 207 39 +2c3b2 8 207 39 +2c3ba 6 85 79 +2c3c0 6 207 39 +2c3c6 6 256 82 +2c3cc 6 208 39 +2c3d2 4 209 39 +2c3d6 2 1139 87 +2c3d8 6 212 39 +2c3de 2 1139 87 +2c3e0 4 277 82 +2c3e4 2 212 39 +2c3e6 1a 212 39 +2c400 c 212 39 +2c40c 4 212 39 +2c410 8 212 39 +2c418 6 212 39 +2c41e 8 212 39 +2c426 6 85 79 +2c42c 6 212 39 +2c432 6 156 137 +2c438 6 256 82 +2c43e 2 213 39 +2c440 4 1512 82 +2c444 2 213 39 +2c446 4 256 82 +2c44a 6 213 39 +2c450 c 1512 82 +2c45c 4 213 39 +2c460 4 1512 82 +2c464 6 213 39 +2c46a 6 302 82 +2c470 10 213 39 +2c480 6 213 39 +2c486 8 213 39 +2c48e 6 85 79 +2c494 6 213 39 +2c49a 6 256 82 +2c4a0 8 91 55 +2c4a8 4 229 147 +2c4ac 4 215 39 +2c4b0 a 229 147 +2c4ba 6 216 39 +2c4c0 a 1481 82 +2c4ca 8 1482 82 +2c4d2 12 1487 82 +2c4e4 6 217 39 +2c4ea 6 302 82 +2c4f0 8 217 39 +2c4f8 4 217 39 +2c4fc 8 217 39 +2c504 6 217 39 +2c50a 8 217 39 +2c512 6 85 79 +2c518 6 217 39 +2c51e a 256 82 +2c528 6 1481 82 +2c52e 4 256 82 +2c532 4 1481 82 +2c536 8 1482 82 +2c53e 12 1487 82 +2c550 6 218 39 +2c556 6 302 82 +2c55c 8 218 39 +2c564 2 218 39 +2c566 8 218 39 +2c56e 6 218 39 +2c574 8 218 39 +2c57c 6 85 79 +2c582 6 218 39 +2c588 6 256 82 +2c58e 6 220 39 +2c594 16 244 39 +2c5aa c 247 39 +2c5b6 4 1139 87 +2c5ba 4 277 82 +2c5be 2 247 39 +2c5c0 1a 247 39 +2c5da 16 247 39 +2c5f0 6 247 39 +2c5f6 8 247 39 +2c5fe 6 85 79 +2c604 6 247 39 +2c60a 6 156 137 +2c610 4 248 39 +2c614 6 256 82 +2c61a 10 1512 82 +2c62a 4 248 39 +2c62e 4 1512 82 +2c632 6 248 39 +2c638 6 302 82 +2c63e 14 248 39 +2c652 6 248 39 +2c658 8 248 39 +2c660 6 85 79 +2c666 6 248 39 +2c66c 6 256 82 +2c672 14 1512 82 +2c686 6 249 39 +2c68c 6 302 82 +2c692 12 249 39 +2c6a4 6 249 39 +2c6aa 8 249 39 +2c6b2 6 85 79 +2c6b8 6 249 39 +2c6be 6 256 82 +2c6c4 6 414 141 +2c6ca 6 158 39 +2c6d0 6 414 141 +2c6d6 6 135 39 +2c6dc f0 256 39 +FUNC 2c7cc 28 0 testing::internal::TestFactoryImpl >::CreateTest +2c7cc 2 486 85 +2c7ce 8 486 85 +2c7d6 4 107 43 +2c7da 6 67 144 +2c7e0 4 481 106 +2c7e4 2 486 85 +2c7e6 8 151 43 +2c7ee 6 486 85 +FUNC 2c7f4 28 0 testing::internal::TestFactoryImpl >::CreateTest +2c7f4 2 486 85 +2c7f6 8 486 85 +2c7fe 4 107 43 +2c802 6 67 144 +2c808 4 481 106 +2c80c 2 486 85 +2c80e 8 220 43 +2c816 6 486 85 +FUNC 2c81c 28 0 testing::internal::TestFactoryImpl >::CreateTest +2c81c 2 486 85 +2c81e 8 486 85 +2c826 4 107 43 +2c82a 6 67 144 +2c830 4 481 106 +2c834 2 486 85 +2c836 8 183 43 +2c83e 6 486 85 +FUNC 2c844 28 0 testing::internal::TestFactoryImpl >::CreateTest +2c844 2 486 85 +2c846 8 486 85 +2c84e 4 107 43 +2c852 6 67 144 +2c858 4 481 106 +2c85c 2 486 85 +2c85e 8 127 43 +2c866 6 486 85 +FUNC 2c86c 28 0 testing::internal::TestFactoryImpl >::CreateTest +2c86c 2 486 85 +2c86e 8 486 85 +2c876 4 107 43 +2c87a 6 67 144 +2c880 4 481 106 +2c884 2 486 85 +2c886 8 151 43 +2c88e 6 486 85 +FUNC 2c894 28 0 testing::internal::TestFactoryImpl >::CreateTest +2c894 2 486 85 +2c896 8 486 85 +2c89e 4 107 43 +2c8a2 6 67 144 +2c8a8 4 481 106 +2c8ac 2 486 85 +2c8ae 8 183 43 +2c8b6 6 486 85 +FUNC 2c8bc 28 0 testing::internal::TestFactoryImpl >::CreateTest +2c8bc 2 486 85 +2c8be 8 486 85 +2c8c6 4 107 43 +2c8ca 6 67 144 +2c8d0 4 481 106 +2c8d4 2 486 85 +2c8d6 8 127 43 +2c8de 6 486 85 +FUNC 2c8e4 28 0 testing::internal::TestFactoryImpl >::CreateTest +2c8e4 2 486 85 +2c8e6 8 486 85 +2c8ee 4 107 43 +2c8f2 6 67 144 +2c8f8 4 481 106 +2c8fc 2 486 85 +2c8fe 8 220 43 +2c906 6 486 85 +FUNC 2c90c 18 0 std::priv::__copy_trivial +2c90c 4 222 105 +2c910 2 224 105 +2c912 2 224 105 +2c914 2 224 105 +2c916 8 224 105 +2c91e 4 224 105 +2c922 2 225 105 +FUNC 2c924 c 0 std::__node_alloc::deallocate +2c924 4 161 106 +2c928 4 135 124 +2c92c 4 161 106 +FUNC 2c930 f8 0 std::priv::_Impl_vector >::_M_range_insert +2c930 2 546 144 +2c932 4 532 144 +2c936 8 532 144 +2c93e 2 546 144 +2c940 2 355 119 +2c942 a 549 144 +2c94c 4 476 144 +2c950 4 478 144 +2c954 4 479 144 +2c958 a 120 142 +2c962 2 480 144 +2c964 4 255 105 +2c968 2 480 144 +2c96a 2 256 105 +2c96c 2 480 144 +2c96e 2 256 105 +2c970 8 256 105 +2c978 6 269 105 +2c97e 4 510 119 +2c982 a 120 142 +2c98c 8 492 144 +2c994 2 120 142 +2c996 2 492 144 +2c998 6 120 142 +2c99e 4 269 105 +2c9a2 6 494 144 +2c9a8 8 269 105 +2c9b0 4 192 144 +2c9b4 6 173 144 +2c9ba 8 41 143 +2c9c2 8 175 144 +2c9ca 4 176 144 +2c9ce 4 346 106 +2c9d2 4 177 144 +2c9d6 6 347 106 +2c9dc 4 348 106 +2c9e0 2 352 106 +2c9e2 4 353 106 +2c9e6 2 356 106 +2c9e8 1e 120 142 +2ca06 2 662 144 +2ca08 4 120 142 +2ca0c 2 662 144 +2ca0e 2 319 106 +2ca10 4 323 106 +2ca14 4 667 144 +2ca18 2 443 144 +2ca1a 2 668 144 +2ca1c c 556 144 +FUNC 2ca28 4c 0 google_breakpad::test_assembler::Section::~Section +2ca28 4 277 62 +2ca2c 10 277 62 +2ca3c 6 65 118 +2ca42 2 74 118 +2ca44 4 191 108 +2ca48 a 449 62 +2ca52 4 81 118 +2ca56 4 87 144 +2ca5a 2 88 144 +2ca5c 6 323 106 +2ca62 8 156 137 +2ca6a a 277 62 +FUNC 2ca74 12 0 google_breakpad::test_assembler::Section::~Section +2ca74 2 277 62 +2ca76 6 277 62 +2ca7c 6 277 62 +2ca82 4 277 62 +FUNC 2ca88 1c 0 google_breakpad::synth_elf::Notes::~Notes +2ca88 4 181 51 +2ca8c 18 181 51 +FUNC 2caa4 12 0 google_breakpad::synth_elf::Notes::~Notes +2caa4 2 181 51 +2caa6 6 181 51 +2caac 6 181 51 +2cab2 4 181 51 +FUNC 2cab8 40 0 PopulateSection +2cab8 2 62 43 +2caba 4 62 43 +2cabe 2 63 43 +2cac0 4 303 62 +2cac4 4 63 43 +2cac8 a 64 43 +2cad2 2 303 62 +2cad4 10 64 43 +2cae4 8 303 62 +2caec 4 63 43 +2caf0 8 65 43 +FUNC 2caf8 34 0 google_breakpad::test_assembler::Section::Section +2caf8 4 272 62 +2cafc 6 273 62 +2cb02 2 272 62 +2cb04 4 273 62 +2cb08 8 273 62 +2cb10 2 67 144 +2cb12 4 273 62 +2cb16 4 67 144 +2cb1a 2 481 106 +2cb1c 4 273 62 +2cb20 c 273 62 +FUNC 2cb2c 42 0 testing::internal::GetPrefixUntilComma +2cb2c 2 585 85 +2cb2e 4 585 85 +2cb32 8 586 85 +2cb3a 4 587 85 +2cb3e c 587 85 +2cb4a 2 355 119 +2cb4c 4 324 136 +2cb50 2 112 137 +2cb52 2 481 106 +2cb54 4 324 136 +2cb58 a 148 142 +2cb62 2 101 108 +2cb64 2 325 136 +2cb66 2 101 108 +2cb68 6 588 85 +FUNC 2cb70 4c 0 testing::internal::StripTrailingSpaces +2cb70 2 2214 87 +2cb72 6 2214 87 +2cb78 6 2216 87 +2cb7e c 144 98 +2cb8a 2 2216 87 +2cb8c 4 144 98 +2cb90 4 2216 87 +2cb94 2 797 136 +2cb96 4 168 145 +2cb9a 6 168 145 +2cba0 a 798 136 +2cbaa 8 2218 87 +2cbb2 a 2219 87 +FUNC 2cbbc 3e 0 std::operator+, std::allocator > +2cbbc 2 29 139 +2cbbe 4 29 139 +2cbc2 4 400 136 +2cbc6 2 29 139 +2cbc8 a 400 136 +2cbd2 2 120 137 +2cbd4 2 481 106 +2cbd6 6 124 137 +2cbdc 4 101 108 +2cbe0 2 517 136 +2cbe2 2 101 108 +2cbe4 12 517 136 +2cbf6 4 42 139 +FUNC 2cbfa 32 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, google_breakpad::test_assembler::Label>, std::priv::_Select1st, std::allocator >, google_breakpad::test_assembler::Label> >, std::priv::_MapTraitsT, std::allocator >, google_breakpad::test_assembler::Label> >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::_M_erase +2cbfa 6 655 140 +2cc00 2 657 140 +2cc02 8 658 140 +2cc0a 8 51 129 +2cc12 2 659 140 +2cc14 4 51 129 +2cc18 6 156 137 +2cc1e c 161 106 +2cc2a 2 664 140 +FUNC 2cc2c 30 0 google_breakpad::synth_elf::StringTable::~StringTable +2cc2c 4 64 51 +2cc30 8 64 51 +2cc38 2 531 141 +2cc3a 2 64 51 +2cc3c 2 531 141 +2cc3e 8 532 141 +2cc46 8 64 51 +2cc4e 6 64 51 +2cc54 8 64 51 +FUNC 2cc5c 12 0 google_breakpad::synth_elf::StringTable::~StringTable +2cc5c 2 64 51 +2cc5e 6 64 51 +2cc64 6 64 51 +2cc6a 4 64 51 +FUNC 2cc70 90 0 google_breakpad::synth_elf::ELF::~ELF +2cc70 4 94 51 +2cc74 a 94 51 +2cc7e a 65 118 +2cc88 2 74 118 +2cc8a 4 191 108 +2cc8e 4 77 118 +2cc92 a 57 108 +2cc9c 4 81 118 +2cca0 6 87 144 +2cca6 4 88 144 +2ccaa 6 323 106 +2ccb0 8 94 51 +2ccb8 8 94 51 +2ccc0 8 94 51 +2ccc8 8 94 51 +2ccd0 8 94 51 +2ccd8 8 94 51 +2cce0 8 94 51 +2cce8 8 94 51 +2ccf0 6 94 51 +2ccf6 a 94 51 +FUNC 2cd00 12 0 google_breakpad::synth_elf::ELF::~ELF +2cd00 2 94 51 +2cd02 6 94 51 +2cd08 6 94 51 +2cd0e 4 94 51 +FUNC 2cd12 c6 0 testing::internal::StreamableToString +2cd12 8 243 79 +2cd1a 2 244 79 +2cd1c 2 243 79 +2cd1e 6 244 79 +2cd24 6 1142 87 +2cd2a 4 131 79 +2cd2e c 181 127 +2cd3a 2 199 126 +2cd3c 10 211 126 +2cd4c 2 202 126 +2cd4e 2 145 115 +2cd50 4 202 126 +2cd54 2 145 115 +2cd56 2 202 126 +2cd58 6 145 115 +2cd5e 8 351 122 +2cd66 6 351 122 +2cd6c 2 202 126 +2cd6e 2 351 122 +2cd70 c 202 126 +2cd7c 18 57 128 +2cd94 1c 67 125 +2cdb0 6 202 126 +2cdb6 6 210 126 +2cdbc 6 212 126 +2cdc2 8 244 79 +2cdca 6 85 79 +2cdd0 8 245 79 +FUNC 2cdd8 148 0 testing::internal::TypeParameterizedTest, testing::internal::Types1 >::Register +2cdd8 e 604 85 +2cde6 2 604 85 +2cde8 2 621 85 +2cdea 6 604 85 +2cdf0 6 621 85 +2cdf6 2 604 85 +2cdf8 4 621 85 +2cdfc 6 621 85 +2ce02 6 621 85 +2ce08 4 621 85 +2ce0c 2 621 85 +2ce0e 2 621 85 +2ce10 8 621 85 +2ce18 a 621 85 +2ce22 6 621 85 +2ce28 4 621 85 +2ce2c 8 621 85 +2ce34 8 621 85 +2ce3c 8 621 85 +2ce44 4 621 85 +2ce48 8 621 85 +2ce50 4 621 85 +2ce54 6 621 85 +2ce5a 4 621 85 +2ce5e 8 621 85 +2ce66 16 85 88 +2ce7c a 621 85 +2ce86 2 612 85 +2ce88 a 484 85 +2ce92 1e 612 85 +2ceb0 36 156 137 +2cee6 3a 626 85 +FUNC 2cf20 158 0 testing::internal::TypeParameterizedTest, testing::internal::Types2 >::Register +2cf20 e 604 85 +2cf2e 2 604 85 +2cf30 2 621 85 +2cf32 6 604 85 +2cf38 6 621 85 +2cf3e 2 604 85 +2cf40 4 621 85 +2cf44 6 621 85 +2cf4a 6 621 85 +2cf50 4 621 85 +2cf54 2 621 85 +2cf56 2 621 85 +2cf58 8 621 85 +2cf60 a 621 85 +2cf6a 8 621 85 +2cf72 4 621 85 +2cf76 8 621 85 +2cf7e 8 621 85 +2cf86 8 621 85 +2cf8e 4 621 85 +2cf92 8 621 85 +2cf9a a 621 85 +2cfa4 c 621 85 +2cfb0 16 85 88 +2cfc6 a 621 85 +2cfd0 2 612 85 +2cfd2 a 484 85 +2cfdc 1e 612 85 +2cffa 36 156 137 +2d030 e 625 85 +2d03e 3a 626 85 +FUNC 2d078 148 0 testing::internal::TypeParameterizedTest, testing::internal::Types1 >::Register +2d078 e 604 85 +2d086 2 604 85 +2d088 2 621 85 +2d08a 6 604 85 +2d090 6 621 85 +2d096 2 604 85 +2d098 4 621 85 +2d09c 6 621 85 +2d0a2 6 621 85 +2d0a8 4 621 85 +2d0ac 2 621 85 +2d0ae 2 621 85 +2d0b0 8 621 85 +2d0b8 a 621 85 +2d0c2 6 621 85 +2d0c8 4 621 85 +2d0cc 8 621 85 +2d0d4 8 621 85 +2d0dc 8 621 85 +2d0e4 4 621 85 +2d0e8 8 621 85 +2d0f0 4 621 85 +2d0f4 6 621 85 +2d0fa 4 621 85 +2d0fe 8 621 85 +2d106 16 85 88 +2d11c a 621 85 +2d126 2 612 85 +2d128 a 484 85 +2d132 1e 612 85 +2d150 36 156 137 +2d186 3a 626 85 +FUNC 2d1c0 158 0 testing::internal::TypeParameterizedTest, testing::internal::Types2 >::Register +2d1c0 e 604 85 +2d1ce 2 604 85 +2d1d0 2 621 85 +2d1d2 6 604 85 +2d1d8 6 621 85 +2d1de 2 604 85 +2d1e0 4 621 85 +2d1e4 6 621 85 +2d1ea 6 621 85 +2d1f0 4 621 85 +2d1f4 2 621 85 +2d1f6 2 621 85 +2d1f8 8 621 85 +2d200 a 621 85 +2d20a 8 621 85 +2d212 4 621 85 +2d216 8 621 85 +2d21e 8 621 85 +2d226 8 621 85 +2d22e 4 621 85 +2d232 8 621 85 +2d23a a 621 85 +2d244 c 621 85 +2d250 16 85 88 +2d266 a 621 85 +2d270 2 612 85 +2d272 a 484 85 +2d27c 1e 612 85 +2d29a 36 156 137 +2d2d0 e 625 85 +2d2de 3a 626 85 +FUNC 2d318 148 0 testing::internal::TypeParameterizedTest, testing::internal::Types1 >::Register +2d318 e 604 85 +2d326 2 604 85 +2d328 2 621 85 +2d32a 6 604 85 +2d330 6 621 85 +2d336 2 604 85 +2d338 4 621 85 +2d33c 6 621 85 +2d342 6 621 85 +2d348 4 621 85 +2d34c 2 621 85 +2d34e 2 621 85 +2d350 8 621 85 +2d358 a 621 85 +2d362 6 621 85 +2d368 4 621 85 +2d36c 8 621 85 +2d374 8 621 85 +2d37c 8 621 85 +2d384 4 621 85 +2d388 8 621 85 +2d390 4 621 85 +2d394 6 621 85 +2d39a 4 621 85 +2d39e 8 621 85 +2d3a6 16 85 88 +2d3bc a 621 85 +2d3c6 2 612 85 +2d3c8 a 484 85 +2d3d2 1e 612 85 +2d3f0 36 156 137 +2d426 3a 626 85 +FUNC 2d460 158 0 testing::internal::TypeParameterizedTest, testing::internal::Types2 >::Register +2d460 e 604 85 +2d46e 2 604 85 +2d470 2 621 85 +2d472 6 604 85 +2d478 6 621 85 +2d47e 2 604 85 +2d480 4 621 85 +2d484 6 621 85 +2d48a 6 621 85 +2d490 4 621 85 +2d494 2 621 85 +2d496 2 621 85 +2d498 8 621 85 +2d4a0 a 621 85 +2d4aa 8 621 85 +2d4b2 4 621 85 +2d4b6 8 621 85 +2d4be 8 621 85 +2d4c6 8 621 85 +2d4ce 4 621 85 +2d4d2 8 621 85 +2d4da a 621 85 +2d4e4 c 621 85 +2d4f0 16 85 88 +2d506 a 621 85 +2d510 2 612 85 +2d512 a 484 85 +2d51c 1e 612 85 +2d53a 36 156 137 +2d570 e 625 85 +2d57e 3a 626 85 +FUNC 2d5b8 148 0 testing::internal::TypeParameterizedTest, testing::internal::Types1 >::Register +2d5b8 e 604 85 +2d5c6 2 604 85 +2d5c8 2 621 85 +2d5ca 6 604 85 +2d5d0 6 621 85 +2d5d6 2 604 85 +2d5d8 4 621 85 +2d5dc 6 621 85 +2d5e2 6 621 85 +2d5e8 4 621 85 +2d5ec 2 621 85 +2d5ee 2 621 85 +2d5f0 8 621 85 +2d5f8 a 621 85 +2d602 6 621 85 +2d608 4 621 85 +2d60c 8 621 85 +2d614 8 621 85 +2d61c 8 621 85 +2d624 4 621 85 +2d628 8 621 85 +2d630 4 621 85 +2d634 6 621 85 +2d63a 4 621 85 +2d63e 8 621 85 +2d646 16 85 88 +2d65c a 621 85 +2d666 2 612 85 +2d668 a 484 85 +2d672 1e 612 85 +2d690 36 156 137 +2d6c6 3a 626 85 +FUNC 2d700 158 0 testing::internal::TypeParameterizedTest, testing::internal::Types2 >::Register +2d700 e 604 85 +2d70e 2 604 85 +2d710 2 621 85 +2d712 6 604 85 +2d718 6 621 85 +2d71e 2 604 85 +2d720 4 621 85 +2d724 6 621 85 +2d72a 6 621 85 +2d730 4 621 85 +2d734 2 621 85 +2d736 2 621 85 +2d738 8 621 85 +2d740 a 621 85 +2d74a 8 621 85 +2d752 4 621 85 +2d756 8 621 85 +2d75e 8 621 85 +2d766 8 621 85 +2d76e 4 621 85 +2d772 8 621 85 +2d77a a 621 85 +2d784 c 621 85 +2d790 16 85 88 +2d7a6 a 621 85 +2d7b0 2 612 85 +2d7b2 a 484 85 +2d7bc 1e 612 85 +2d7da 36 156 137 +2d810 e 625 85 +2d81e 3a 626 85 +FUNC 2d858 28 0 FileIDTest::~FileIDTest +2d858 4 107 43 +2d85c a 107 43 +2d866 4 87 144 +2d86a 2 88 144 +2d86c 6 323 106 +2d872 6 107 43 +2d878 8 107 43 +FUNC 2d880 1c 0 FileIDTest_ElfClass_Test::~FileIDTest_ElfClass_Test +2d880 4 127 43 +2d884 18 127 43 +FUNC 2d89c 12 0 FileIDTest_ElfClass_Test::~FileIDTest_ElfClass_Test +2d89c 2 127 43 +2d89e 6 127 43 +2d8a4 6 127 43 +2d8aa 4 127 43 +FUNC 2d8b0 1c 0 FileIDTest_BuildID_Test::~FileIDTest_BuildID_Test +2d8b0 4 151 43 +2d8b4 18 151 43 +FUNC 2d8cc 12 0 FileIDTest_BuildID_Test::~FileIDTest_BuildID_Test +2d8cc 2 151 43 +2d8ce 6 151 43 +2d8d4 6 151 43 +2d8da 4 151 43 +FUNC 2d8e0 1c 0 FileIDTest_BuildIDPH_Test::~FileIDTest_BuildIDPH_Test +2d8e0 4 183 43 +2d8e4 18 183 43 +FUNC 2d8fc 12 0 FileIDTest_BuildIDPH_Test::~FileIDTest_BuildIDPH_Test +2d8fc 2 183 43 +2d8fe 6 183 43 +2d904 6 183 43 +2d90a 4 183 43 +FUNC 2d910 1c 0 FileIDTest_UniqueHashes_Test::~FileIDTest_UniqueHashes_Test +2d910 4 220 43 +2d914 18 220 43 +FUNC 2d92c 12 0 FileIDTest_UniqueHashes_Test::~FileIDTest_UniqueHashes_Test +2d92c 2 220 43 +2d92e 6 220 43 +2d934 6 220 43 +2d93a 4 220 43 +FUNC 2d940 28 0 FileIDTest::~FileIDTest +2d940 4 107 43 +2d944 a 107 43 +2d94e 4 87 144 +2d952 2 88 144 +2d954 6 323 106 +2d95a 6 107 43 +2d960 8 107 43 +FUNC 2d968 1c 0 FileIDTest_ElfClass_Test::~FileIDTest_ElfClass_Test +2d968 4 127 43 +2d96c 18 127 43 +FUNC 2d984 12 0 FileIDTest_ElfClass_Test::~FileIDTest_ElfClass_Test +2d984 2 127 43 +2d986 6 127 43 +2d98c 6 127 43 +2d992 4 127 43 +FUNC 2d998 1c 0 FileIDTest_BuildID_Test::~FileIDTest_BuildID_Test +2d998 4 151 43 +2d99c 18 151 43 +FUNC 2d9b4 12 0 FileIDTest_BuildID_Test::~FileIDTest_BuildID_Test +2d9b4 2 151 43 +2d9b6 6 151 43 +2d9bc 6 151 43 +2d9c2 4 151 43 +FUNC 2d9c8 1c 0 FileIDTest_BuildIDPH_Test::~FileIDTest_BuildIDPH_Test +2d9c8 4 183 43 +2d9cc 18 183 43 +FUNC 2d9e4 12 0 FileIDTest_BuildIDPH_Test::~FileIDTest_BuildIDPH_Test +2d9e4 2 183 43 +2d9e6 6 183 43 +2d9ec 6 183 43 +2d9f2 4 183 43 +FUNC 2d9f8 1c 0 FileIDTest_UniqueHashes_Test::~FileIDTest_UniqueHashes_Test +2d9f8 4 220 43 +2d9fc 18 220 43 +FUNC 2da14 12 0 FileIDTest_UniqueHashes_Test::~FileIDTest_UniqueHashes_Test +2da14 2 220 43 +2da16 6 220 43 +2da1c 6 220 43 +2da22 4 220 43 +FUNC 2da28 180 0 testing::internal::CmpHelperOpFailure +2da28 8 1579 82 +2da30 8 1579 82 +2da38 2 1583 82 +2da3a 4 1579 82 +2da3e 2 306 82 +2da40 2 1579 82 +2da42 2 1583 82 +2da44 a 1579 82 +2da4e 4 1583 82 +2da52 6 306 82 +2da58 c 333 127 +2da64 8 306 82 +2da6c 6 85 79 +2da72 a 1583 82 +2da7c 6 306 82 +2da82 c 333 127 +2da8e 8 306 82 +2da96 6 85 79 +2da9c a 1583 82 +2daa6 6 306 82 +2daac c 333 127 +2dab8 8 306 82 +2dac0 6 85 79 +2dac6 a 1583 82 +2dad0 6 306 82 +2dad6 c 333 127 +2dae2 8 306 82 +2daea 2 1382 82 +2daec 6 85 79 +2daf2 8 1382 82 +2dafa 6 306 82 +2db00 a 131 79 +2db0a 8 306 82 +2db12 6 85 79 +2db18 6 306 82 +2db1e c 333 127 +2db2a 8 306 82 +2db32 4 1382 82 +2db36 6 85 79 +2db3c 8 1382 82 +2db44 6 306 82 +2db4a a 131 79 +2db54 8 306 82 +2db5c 6 85 79 +2db62 8 1585 82 +2db6a c 156 137 +2db76 6 256 82 +2db7c 2c 1586 82 +FUNC 2dba8 178 0 FileIDTest::GetElfContents +2dba8 e 109 43 +2dbb6 2 109 43 +2dbb8 8 110 43 +2dbc0 2 109 43 +2dbc2 2 110 43 +2dbc4 2 109 43 +2dbc6 4 110 43 +2dbca 8 111 43 +2dbd2 6 1139 87 +2dbd8 4 277 82 +2dbdc 4 1139 87 +2dbe0 2 111 43 +2dbe2 1a 111 43 +2dbfc 8 111 43 +2dc04 4 111 43 +2dc08 c 111 43 +2dc14 6 111 43 +2dc1a 8 111 43 +2dc22 6 85 79 +2dc28 6 111 43 +2dc2e 8 156 137 +2dc36 6 256 82 +2dc3c 4 400 136 +2dc40 4 112 43 +2dc44 2 400 136 +2dc46 2 112 43 +2dc48 2 1619 82 +2dc4a 8 1619 82 +2dc52 1a 1619 82 +2dc6c 6 112 43 +2dc72 2 1144 87 +2dc74 6 298 82 +2dc7a 4 298 82 +2dc7e 8 112 43 +2dc86 4 112 43 +2dc8a a 112 43 +2dc94 6 112 43 +2dc9a 8 112 43 +2dca2 6 85 79 +2dca8 6 112 43 +2dcae 12 256 82 +2dcc0 4 228 148 +2dcc4 4 630 144 +2dcc8 6 269 105 +2dcce 2 615 144 +2dcd0 c 510 144 +2dcdc 4 116 43 +2dce0 6 156 137 +2dce6 3a 117 43 +FUNC 2dba8 178 0 FileIDTest::GetElfContents +FUNC 2dd20 1c4 0 FileIDTest_ElfClass_Test::TestBody +2dd20 c 127 43 +2dd2c 4 130 43 +2dd30 2 127 43 +2dd32 2 130 43 +2dd34 6 127 43 +2dd3a 18 130 43 +2dd52 2 134 43 +2dd54 4 130 43 +2dd58 2 134 43 +2dd5a 4 130 43 +2dd5e 6 134 43 +2dd64 4 135 43 +2dd68 4 134 43 +2dd6c a 135 43 +2dd76 e 453 136 +2dd84 4 136 43 +2dd88 10 139 43 +2dd98 22 139 43 +2ddba 6 156 137 +2ddc0 6 140 43 +2ddc6 4 143 43 +2ddca 8 141 43 +2ddd2 a 143 43 +2dddc 2 1139 87 +2ddde 2 277 82 +2dde0 2 143 43 +2dde2 16 143 43 +2ddf8 a 143 43 +2de02 4 143 43 +2de06 a 143 43 +2de10 6 143 43 +2de16 8 143 43 +2de1e 6 85 79 +2de24 6 143 43 +2de2a 6 156 137 +2de30 8 256 82 +2de38 a 146 43 +2de42 16 148 43 +2de58 2 1144 87 +2de5a 6 298 82 +2de60 4 298 82 +2de64 8 148 43 +2de6c 2 148 43 +2de6e a 148 43 +2de78 6 148 43 +2de7e 8 148 43 +2de86 6 85 79 +2de8c 6 148 43 +2de92 6 256 82 +2de98 6 135 43 +2de9e 6 148 43 +2dea4 40 149 43 +FUNC 2dee4 274 0 FileIDTest_BuildID_Test::TestBody +2dee4 12 151 43 +2def6 2 151 43 +2def8 1c 154 43 +2df14 1e 156 43 +2df32 4 157 43 +2df36 2 156 43 +2df38 2 157 43 +2df3a 2 156 43 +2df3c c 157 43 +2df48 8 164 43 +2df50 4 165 43 +2df54 6 164 43 +2df5a 8 165 43 +2df62 c 303 62 +2df6e 10 167 43 +2df7e 28 167 43 +2dfa6 6 156 137 +2dfac a 184 51 +2dfb6 2 170 43 +2dfb8 4 184 51 +2dfbc 2 170 43 +2dfbe 2 184 51 +2dfc0 6 170 43 +2dfc6 2 184 51 +2dfc8 4 170 43 +2dfcc 10 169 43 +2dfdc 6 156 137 +2dfe2 c 171 43 +2dfee 24 171 43 +2e012 6 156 137 +2e018 6 172 43 +2e01e 8 173 43 +2e026 a 175 43 +2e030 4 1139 87 +2e034 2 277 82 +2e036 2 175 43 +2e038 16 175 43 +2e04e c 175 43 +2e05a 4 175 43 +2e05e a 175 43 +2e068 6 175 43 +2e06e 8 175 43 +2e076 6 85 79 +2e07c 6 175 43 +2e082 6 156 137 +2e088 a 256 82 +2e092 a 178 43 +2e09c 16 180 43 +2e0b2 2 1144 87 +2e0b4 6 298 82 +2e0ba 4 298 82 +2e0be 8 180 43 +2e0c6 2 180 43 +2e0c8 a 180 43 +2e0d2 6 180 43 +2e0d8 8 180 43 +2e0e0 6 85 79 +2e0e6 6 180 43 +2e0ec 6 256 82 +2e0f2 6 168 43 +2e0f8 6 165 43 +2e0fe 6 180 43 +2e104 54 181 43 +FUNC 2e158 2a8 0 FileIDTest_BuildIDPH_Test::TestBody +2e158 10 183 43 +2e168 2 183 43 +2e16a 2 186 43 +2e16c 2 183 43 +2e16e 1a 186 43 +2e188 1e 188 43 +2e1a6 8 189 43 +2e1ae 4 188 43 +2e1b2 a 189 43 +2e1bc c 196 43 +2e1c8 4 197 43 +2e1cc 4 196 43 +2e1d0 8 197 43 +2e1d8 c 303 62 +2e1e4 10 199 43 +2e1f4 22 199 43 +2e216 6 156 137 +2e21c a 184 51 +2e226 2 202 43 +2e228 4 184 51 +2e22c 2 202 43 +2e22e 2 184 51 +2e230 6 202 43 +2e236 2 184 51 +2e238 4 202 43 +2e23c 14 201 43 +2e250 6 156 137 +2e256 c 204 43 +2e262 10 203 43 +2e272 6 156 137 +2e278 c 205 43 +2e284 22 205 43 +2e2a6 6 156 137 +2e2ac e 206 43 +2e2ba 6 207 43 +2e2c0 8 208 43 +2e2c8 e 210 43 +2e2d6 2 1139 87 +2e2d8 2 277 82 +2e2da 2 210 43 +2e2dc 16 210 43 +2e2f2 a 210 43 +2e2fc 4 210 43 +2e300 a 210 43 +2e30a 6 210 43 +2e310 8 210 43 +2e318 6 85 79 +2e31e 6 210 43 +2e324 6 156 137 +2e32a 8 256 82 +2e332 a 213 43 +2e33c 16 215 43 +2e352 2 1144 87 +2e354 6 298 82 +2e35a 4 298 82 +2e35e 8 215 43 +2e366 2 215 43 +2e368 a 215 43 +2e372 6 215 43 +2e378 8 215 43 +2e380 6 85 79 +2e386 6 215 43 +2e38c 6 256 82 +2e392 6 200 43 +2e398 6 197 43 +2e39e 6 215 43 +2e3a4 5c 216 43 +FUNC 2e400 390 0 FileIDTest_UniqueHashes_Test::TestBody +2e400 10 220 43 +2e410 2 220 43 +2e412 2 222 43 +2e414 2 220 43 +2e416 22 222 43 +2e438 1a 224 43 +2e452 2 229 43 +2e454 a 232 43 +2e45e 4 224 43 +2e462 2 229 43 +2e464 4 224 43 +2e468 4 230 43 +2e46c a 229 43 +2e476 8 230 43 +2e47e a 231 43 +2e488 10 232 43 +2e498 1c 232 43 +2e4b4 6 156 137 +2e4ba 8 233 43 +2e4c2 c 234 43 +2e4ce 10 235 43 +2e4de 1c 235 43 +2e4fa 6 156 137 +2e500 6 236 43 +2e506 8 237 43 +2e50e 6 233 43 +2e514 6 230 43 +2e51a 6 237 43 +2e520 a 240 43 +2e52a 2 1139 87 +2e52c 2 277 82 +2e52e 2 240 43 +2e530 16 240 43 +2e546 a 240 43 +2e550 2 240 43 +2e552 a 240 43 +2e55c 6 240 43 +2e562 8 240 43 +2e56a 6 85 79 +2e570 6 240 43 +2e576 6 156 137 +2e57c 6 256 82 +2e582 4 242 43 +2e586 4 256 82 +2e58a a 242 43 +2e594 6 246 43 +2e59a 4 247 43 +2e59e 8 246 43 +2e5a6 2 248 43 +2e5a8 8 247 43 +2e5b0 8 248 43 +2e5b8 a 249 43 +2e5c2 e 250 43 +2e5d0 28 250 43 +2e5f8 6 156 137 +2e5fe c 251 43 +2e60a c 252 43 +2e616 24 252 43 +2e63a 6 156 137 +2e640 6 253 43 +2e646 8 254 43 +2e64e 6 248 43 +2e654 6 247 43 +2e65a 6 254 43 +2e660 a 257 43 +2e66a 4 1139 87 +2e66e 2 277 82 +2e670 2 257 43 +2e672 16 257 43 +2e688 a 257 43 +2e692 2 257 43 +2e694 c 257 43 +2e6a0 6 257 43 +2e6a6 8 257 43 +2e6ae 6 85 79 +2e6b4 6 257 43 +2e6ba 6 156 137 +2e6c0 2 259 43 +2e6c2 6 256 82 +2e6c8 a 259 43 +2e6d2 4 262 43 +2e6d6 2 256 82 +2e6d8 12 262 43 +2e6ea 2 1144 87 +2e6ec 6 298 82 +2e6f2 4 298 82 +2e6f6 8 262 43 +2e6fe 2 262 43 +2e700 c 262 43 +2e70c 6 262 43 +2e712 8 262 43 +2e71a 6 85 79 +2e720 6 262 43 +2e726 6 256 82 +2e72c 64 263 43 +FUNC 2e790 1c4 0 FileIDTest_ElfClass_Test::TestBody +2e790 c 127 43 +2e79c 4 130 43 +2e7a0 2 127 43 +2e7a2 2 130 43 +2e7a4 6 127 43 +2e7aa 1c 130 43 +2e7c6 2 134 43 +2e7c8 4 130 43 +2e7cc 8 134 43 +2e7d4 4 135 43 +2e7d8 4 134 43 +2e7dc a 135 43 +2e7e6 e 453 136 +2e7f4 4 136 43 +2e7f8 10 139 43 +2e808 22 139 43 +2e82a 6 156 137 +2e830 6 140 43 +2e836 4 143 43 +2e83a 8 141 43 +2e842 a 143 43 +2e84c 2 1139 87 +2e84e 2 277 82 +2e850 2 143 43 +2e852 16 143 43 +2e868 a 143 43 +2e872 4 143 43 +2e876 a 143 43 +2e880 6 143 43 +2e886 8 143 43 +2e88e 6 85 79 +2e894 6 143 43 +2e89a 6 156 137 +2e8a0 8 256 82 +2e8a8 a 146 43 +2e8b2 16 148 43 +2e8c8 2 1144 87 +2e8ca 6 298 82 +2e8d0 4 298 82 +2e8d4 8 148 43 +2e8dc 2 148 43 +2e8de a 148 43 +2e8e8 6 148 43 +2e8ee 8 148 43 +2e8f6 6 85 79 +2e8fc 6 148 43 +2e902 6 256 82 +2e908 6 135 43 +2e90e 6 148 43 +2e914 40 149 43 +FUNC 2e954 274 0 FileIDTest_BuildID_Test::TestBody +2e954 12 151 43 +2e966 2 151 43 +2e968 1c 154 43 +2e984 1e 156 43 +2e9a2 4 157 43 +2e9a6 2 156 43 +2e9a8 2 157 43 +2e9aa 2 164 43 +2e9ac 2 156 43 +2e9ae 8 157 43 +2e9b6 4 165 43 +2e9ba 4 157 43 +2e9be c 164 43 +2e9ca 8 165 43 +2e9d2 c 303 62 +2e9de 10 167 43 +2e9ee 28 167 43 +2ea16 6 156 137 +2ea1c a 184 51 +2ea26 2 170 43 +2ea28 4 184 51 +2ea2c 2 170 43 +2ea2e 2 184 51 +2ea30 6 170 43 +2ea36 2 184 51 +2ea38 4 170 43 +2ea3c 10 169 43 +2ea4c 6 156 137 +2ea52 c 171 43 +2ea5e 24 171 43 +2ea82 6 156 137 +2ea88 6 172 43 +2ea8e 8 173 43 +2ea96 a 175 43 +2eaa0 4 1139 87 +2eaa4 2 277 82 +2eaa6 2 175 43 +2eaa8 16 175 43 +2eabe c 175 43 +2eaca 4 175 43 +2eace a 175 43 +2ead8 6 175 43 +2eade 8 175 43 +2eae6 6 85 79 +2eaec 6 175 43 +2eaf2 6 156 137 +2eaf8 a 256 82 +2eb02 a 178 43 +2eb0c 16 180 43 +2eb22 2 1144 87 +2eb24 6 298 82 +2eb2a 4 298 82 +2eb2e 8 180 43 +2eb36 2 180 43 +2eb38 a 180 43 +2eb42 6 180 43 +2eb48 8 180 43 +2eb50 6 85 79 +2eb56 6 180 43 +2eb5c 6 256 82 +2eb62 6 168 43 +2eb68 6 165 43 +2eb6e 6 180 43 +2eb74 54 181 43 +FUNC 2ebc8 2a8 0 FileIDTest_BuildIDPH_Test::TestBody +2ebc8 10 183 43 +2ebd8 2 183 43 +2ebda 2 186 43 +2ebdc 2 183 43 +2ebde 1a 186 43 +2ebf8 1e 188 43 +2ec16 8 189 43 +2ec1e 4 196 43 +2ec22 4 188 43 +2ec26 a 189 43 +2ec30 4 197 43 +2ec34 c 196 43 +2ec40 8 197 43 +2ec48 c 303 62 +2ec54 10 199 43 +2ec64 22 199 43 +2ec86 6 156 137 +2ec8c a 184 51 +2ec96 2 202 43 +2ec98 4 184 51 +2ec9c 2 202 43 +2ec9e 2 184 51 +2eca0 6 202 43 +2eca6 2 184 51 +2eca8 4 202 43 +2ecac 14 201 43 +2ecc0 6 156 137 +2ecc6 c 204 43 +2ecd2 10 203 43 +2ece2 6 156 137 +2ece8 c 205 43 +2ecf4 22 205 43 +2ed16 6 156 137 +2ed1c e 206 43 +2ed2a 6 207 43 +2ed30 8 208 43 +2ed38 e 210 43 +2ed46 2 1139 87 +2ed48 2 277 82 +2ed4a 2 210 43 +2ed4c 16 210 43 +2ed62 a 210 43 +2ed6c 4 210 43 +2ed70 a 210 43 +2ed7a 6 210 43 +2ed80 8 210 43 +2ed88 6 85 79 +2ed8e 6 210 43 +2ed94 6 156 137 +2ed9a 8 256 82 +2eda2 a 213 43 +2edac 16 215 43 +2edc2 2 1144 87 +2edc4 6 298 82 +2edca 4 298 82 +2edce 8 215 43 +2edd6 2 215 43 +2edd8 a 215 43 +2ede2 6 215 43 +2ede8 8 215 43 +2edf0 6 85 79 +2edf6 6 215 43 +2edfc 6 256 82 +2ee02 6 200 43 +2ee08 6 197 43 +2ee0e 6 215 43 +2ee14 5c 216 43 +FUNC 2ee70 390 0 FileIDTest_UniqueHashes_Test::TestBody +2ee70 10 220 43 +2ee80 2 220 43 +2ee82 2 222 43 +2ee84 2 220 43 +2ee86 22 222 43 +2eea8 1a 224 43 +2eec2 a 232 43 +2eecc 4 224 43 +2eed0 2 229 43 +2eed2 4 224 43 +2eed6 4 230 43 +2eeda c 229 43 +2eee6 8 230 43 +2eeee a 231 43 +2eef8 10 232 43 +2ef08 1c 232 43 +2ef24 6 156 137 +2ef2a 8 233 43 +2ef32 c 234 43 +2ef3e 10 235 43 +2ef4e 1c 235 43 +2ef6a 6 156 137 +2ef70 6 236 43 +2ef76 8 237 43 +2ef7e 6 233 43 +2ef84 6 230 43 +2ef8a 6 237 43 +2ef90 a 240 43 +2ef9a 2 1139 87 +2ef9c 2 277 82 +2ef9e 2 240 43 +2efa0 16 240 43 +2efb6 a 240 43 +2efc0 2 240 43 +2efc2 a 240 43 +2efcc 6 240 43 +2efd2 8 240 43 +2efda 6 85 79 +2efe0 6 240 43 +2efe6 6 156 137 +2efec 6 256 82 +2eff2 4 242 43 +2eff6 2 246 43 +2eff8 4 256 82 +2effc a 242 43 +2f006 4 247 43 +2f00a c 246 43 +2f016 2 248 43 +2f018 8 247 43 +2f020 8 248 43 +2f028 a 249 43 +2f032 e 250 43 +2f040 28 250 43 +2f068 6 156 137 +2f06e c 251 43 +2f07a c 252 43 +2f086 24 252 43 +2f0aa 6 156 137 +2f0b0 6 253 43 +2f0b6 8 254 43 +2f0be 6 248 43 +2f0c4 6 247 43 +2f0ca 6 254 43 +2f0d0 a 257 43 +2f0da 4 1139 87 +2f0de 2 277 82 +2f0e0 2 257 43 +2f0e2 16 257 43 +2f0f8 a 257 43 +2f102 2 257 43 +2f104 c 257 43 +2f110 6 257 43 +2f116 8 257 43 +2f11e 6 85 79 +2f124 6 257 43 +2f12a 6 156 137 +2f130 2 259 43 +2f132 6 256 82 +2f138 a 259 43 +2f142 4 262 43 +2f146 2 256 82 +2f148 12 262 43 +2f15a 2 1144 87 +2f15c 6 298 82 +2f162 4 298 82 +2f166 8 262 43 +2f16e 2 262 43 +2f170 c 262 43 +2f17c 6 262 43 +2f182 8 262 43 +2f18a 6 85 79 +2f190 6 262 43 +2f196 6 256 82 +2f19c 64 263 43 +FUNC 2f200 18 0 LinuxLibcSupportTest_read_decimal_ptr_Test::~LinuxLibcSupportTest_read_decimal_ptr_Test +2f200 2 194 46 +2f202 16 194 46 +FUNC 2f218 12 0 LinuxLibcSupportTest_read_decimal_ptr_Test::~LinuxLibcSupportTest_read_decimal_ptr_Test +2f218 2 194 46 +2f21a 6 194 46 +2f220 6 194 46 +2f226 4 194 46 +FUNC 2f22c 18 0 LinuxLibcSupportTest_read_hex_ptr_Test::~LinuxLibcSupportTest_read_hex_ptr_Test +2f22c 2 169 46 +2f22e 16 169 46 +FUNC 2f244 12 0 LinuxLibcSupportTest_read_hex_ptr_Test::~LinuxLibcSupportTest_read_hex_ptr_Test +2f244 2 169 46 +2f246 6 169 46 +2f24c 6 169 46 +2f252 4 169 46 +FUNC 2f258 18 0 LinuxLibcSupportTest_memchr_Test::~LinuxLibcSupportTest_memchr_Test +2f258 2 157 46 +2f25a 16 157 46 +FUNC 2f270 12 0 LinuxLibcSupportTest_memchr_Test::~LinuxLibcSupportTest_memchr_Test +2f270 2 157 46 +2f272 6 157 46 +2f278 6 157 46 +2f27e 4 157 46 +FUNC 2f284 18 0 LinuxLibcSupportTest_strrchr_Test::~LinuxLibcSupportTest_strrchr_Test +2f284 2 143 46 +2f286 16 143 46 +FUNC 2f29c 12 0 LinuxLibcSupportTest_strrchr_Test::~LinuxLibcSupportTest_strrchr_Test +2f29c 2 143 46 +2f29e 6 143 46 +2f2a4 6 143 46 +2f2aa 4 143 46 +FUNC 2f2b0 18 0 LinuxLibcSupportTest_strchr_Test::~LinuxLibcSupportTest_strchr_Test +2f2b0 2 129 46 +2f2b2 16 129 46 +FUNC 2f2c8 12 0 LinuxLibcSupportTest_strchr_Test::~LinuxLibcSupportTest_strchr_Test +2f2c8 2 129 46 +2f2ca 6 129 46 +2f2d0 6 129 46 +2f2d6 4 129 46 +FUNC 2f2dc 18 0 LinuxLibcSupportTest_uitos_Test::~LinuxLibcSupportTest_uitos_Test +2f2dc 2 106 46 +2f2de 16 106 46 +FUNC 2f2f4 12 0 LinuxLibcSupportTest_uitos_Test::~LinuxLibcSupportTest_uitos_Test +2f2f4 2 106 46 +2f2f6 6 106 46 +2f2fc 6 106 46 +2f302 4 106 46 +FUNC 2f308 18 0 LinuxLibcSupportTest_uint_len_Test::~LinuxLibcSupportTest_uint_len_Test +2f308 2 92 46 +2f30a 16 92 46 +FUNC 2f320 12 0 LinuxLibcSupportTest_uint_len_Test::~LinuxLibcSupportTest_uint_len_Test +2f320 2 92 46 +2f322 6 92 46 +2f328 6 92 46 +2f32e 4 92 46 +FUNC 2f334 18 0 LinuxLibcSupportTest_strtoui_Test::~LinuxLibcSupportTest_strtoui_Test +2f334 2 71 46 +2f336 16 71 46 +FUNC 2f34c 12 0 LinuxLibcSupportTest_strtoui_Test::~LinuxLibcSupportTest_strtoui_Test +2f34c 2 71 46 +2f34e 6 71 46 +2f354 6 71 46 +2f35a 4 71 46 +FUNC 2f360 18 0 LinuxLibcSupportTest_strcmp_Test::~LinuxLibcSupportTest_strcmp_Test +2f360 2 46 46 +2f362 16 46 46 +FUNC 2f378 12 0 LinuxLibcSupportTest_strcmp_Test::~LinuxLibcSupportTest_strcmp_Test +2f378 2 46 46 +2f37a 6 46 46 +2f380 6 46 46 +2f386 4 46 46 +FUNC 2f38c 18 0 LinuxLibcSupportTest_strlen_Test::~LinuxLibcSupportTest_strlen_Test +2f38c 2 37 46 +2f38e 16 37 46 +FUNC 2f3a4 12 0 LinuxLibcSupportTest_strlen_Test::~LinuxLibcSupportTest_strlen_Test +2f3a4 2 37 46 +2f3a6 6 37 46 +2f3ac 6 37 46 +2f3b2 4 37 46 +FUNC 2f3b8 20 0 testing::internal::TestFactoryImpl::CreateTest +2f3b8 2 486 85 +2f3ba 8 486 85 +2f3c2 6 194 46 +2f3c8 2 486 85 +2f3ca 6 194 46 +2f3d0 8 486 85 +FUNC 2f3d8 20 0 testing::internal::TestFactoryImpl::CreateTest +2f3d8 2 486 85 +2f3da 8 486 85 +2f3e2 6 169 46 +2f3e8 2 486 85 +2f3ea 6 169 46 +2f3f0 8 486 85 +FUNC 2f3f8 20 0 testing::internal::TestFactoryImpl::CreateTest +2f3f8 2 486 85 +2f3fa 8 486 85 +2f402 6 157 46 +2f408 2 486 85 +2f40a 6 157 46 +2f410 8 486 85 +FUNC 2f418 20 0 testing::internal::TestFactoryImpl::CreateTest +2f418 2 486 85 +2f41a 8 486 85 +2f422 6 143 46 +2f428 2 486 85 +2f42a 6 143 46 +2f430 8 486 85 +FUNC 2f438 20 0 testing::internal::TestFactoryImpl::CreateTest +2f438 2 486 85 +2f43a 8 486 85 +2f442 6 129 46 +2f448 2 486 85 +2f44a 6 129 46 +2f450 8 486 85 +FUNC 2f458 20 0 testing::internal::TestFactoryImpl::CreateTest +2f458 2 486 85 +2f45a 8 486 85 +2f462 6 106 46 +2f468 2 486 85 +2f46a 6 106 46 +2f470 8 486 85 +FUNC 2f478 20 0 testing::internal::TestFactoryImpl::CreateTest +2f478 2 486 85 +2f47a 8 486 85 +2f482 6 92 46 +2f488 2 486 85 +2f48a 6 92 46 +2f490 8 486 85 +FUNC 2f498 20 0 testing::internal::TestFactoryImpl::CreateTest +2f498 2 486 85 +2f49a 8 486 85 +2f4a2 6 71 46 +2f4a8 2 486 85 +2f4aa 6 71 46 +2f4b0 8 486 85 +FUNC 2f4b8 20 0 testing::internal::TestFactoryImpl::CreateTest +2f4b8 2 486 85 +2f4ba 8 486 85 +2f4c2 6 46 46 +2f4c8 2 486 85 +2f4ca 6 46 46 +2f4d0 8 486 85 +FUNC 2f4d8 20 0 testing::internal::TestFactoryImpl::CreateTest +2f4d8 2 486 85 +2f4da 8 486 85 +2f4e2 6 37 46 +2f4e8 2 486 85 +2f4ea 6 37 46 +2f4f0 8 486 85 +FUNC 2f4f8 a4 0 LinuxLibcSupportTest_strlen_Test::TestBody +2f4f8 6 37 46 +2f4fe 8 1512 82 +2f506 6 37 46 +2f50c 8 1512 82 +2f514 6 40 46 +2f51a 8 42 46 +2f522 6 42 46 +2f528 4 1512 82 +2f52c 2 42 46 +2f52e e 1512 82 +2f53c 8 42 46 +2f544 6 302 82 +2f54a 10 42 46 +2f55a 6 42 46 +2f560 8 42 46 +2f568 6 85 79 +2f56e 6 42 46 +2f574 e 256 82 +2f582 2 43 46 +2f584 18 44 46 +FUNC 2f59c 328 0 LinuxLibcSupportTest_uint_len_Test::TestBody +2f59c 4 92 46 +2f5a0 2 93 46 +2f5a2 2 92 46 +2f5a4 a 93 46 +2f5ae e 1512 82 +2f5bc 2 93 46 +2f5be a 1512 82 +2f5c8 4 93 46 +2f5cc 4 1512 82 +2f5d0 8 93 46 +2f5d8 6 302 82 +2f5de e 93 46 +2f5ec 6 256 82 +2f5f2 8 94 46 +2f5fa 2 1512 82 +2f5fc 2 94 46 +2f5fe a 1512 82 +2f608 4 94 46 +2f60c 4 1512 82 +2f610 6 94 46 +2f616 6 302 82 +2f61c e 94 46 +2f62a 6 256 82 +2f630 8 95 46 +2f638 2 1512 82 +2f63a 2 95 46 +2f63c a 1512 82 +2f646 4 95 46 +2f64a 4 1512 82 +2f64e 6 95 46 +2f654 6 302 82 +2f65a e 95 46 +2f668 6 256 82 +2f66e 8 96 46 +2f676 2 1512 82 +2f678 2 96 46 +2f67a a 1512 82 +2f684 4 96 46 +2f688 4 1512 82 +2f68c 6 96 46 +2f692 6 302 82 +2f698 e 96 46 +2f6a6 6 256 82 +2f6ac c 97 46 +2f6b8 8 1512 82 +2f6c0 2 97 46 +2f6c2 a 1512 82 +2f6cc 4 97 46 +2f6d0 4 1512 82 +2f6d4 6 97 46 +2f6da 6 302 82 +2f6e0 e 97 46 +2f6ee 6 256 82 +2f6f4 8 98 46 +2f6fc 2 1512 82 +2f6fe 2 98 46 +2f700 a 1512 82 +2f70a 4 98 46 +2f70e 4 1512 82 +2f712 6 98 46 +2f718 6 302 82 +2f71e e 98 46 +2f72c 6 256 82 +2f732 c 99 46 +2f73e 8 1512 82 +2f746 2 99 46 +2f748 a 1512 82 +2f752 4 99 46 +2f756 4 1512 82 +2f75a 6 99 46 +2f760 6 302 82 +2f766 e 99 46 +2f774 6 256 82 +2f77a 8 100 46 +2f782 2 1512 82 +2f784 2 100 46 +2f786 a 1512 82 +2f790 4 100 46 +2f794 4 1512 82 +2f798 6 100 46 +2f79e 6 302 82 +2f7a4 e 100 46 +2f7b2 6 256 82 +2f7b8 c 101 46 +2f7c4 4 1512 82 +2f7c8 4 101 46 +2f7cc e 1512 82 +2f7da 6 101 46 +2f7e0 6 302 82 +2f7e6 e 101 46 +2f7f4 6 256 82 +2f7fa e 103 46 +2f808 4 1512 82 +2f80c 4 103 46 +2f810 e 1512 82 +2f81e 6 103 46 +2f824 6 302 82 +2f82a 10 103 46 +2f83a 6 103 46 +2f840 8 103 46 +2f848 6 85 79 +2f84e 6 103 46 +2f854 6 256 82 +2f85a 6a 104 46 +FUNC 2f8c4 c4 0 LinuxLibcSupportTest_strcmp_Test::TestBody +2f8c4 4 46 46 +2f8c8 6 66 46 +2f8ce 8 1512 82 +2f8d6 4 46 46 +2f8da 4 1512 82 +2f8de 8 60 46 +2f8e6 c 62 46 +2f8f2 4 63 46 +2f8f6 4 64 46 +2f8fa 2 65 46 +2f8fc 6 62 46 +2f902 4 67 46 +2f906 2 62 46 +2f908 4 67 46 +2f90c 8 1512 82 +2f914 2 67 46 +2f916 e 1512 82 +2f924 a 67 46 +2f92e 6 302 82 +2f934 12 67 46 +2f946 6 67 46 +2f94c 8 67 46 +2f954 6 85 79 +2f95a 6 67 46 +2f960 10 256 82 +2f970 2 68 46 +2f972 16 69 46 +FUNC 2f988 558 0 LinuxLibcSupportTest_strtoui_Test::TestBody +2f988 a 71 46 +2f992 4 71 46 +2f996 4 74 46 +2f99a 2 71 46 +2f99c 6 74 46 +2f9a2 2 71 46 +2f9a4 4 74 46 +2f9a8 4 1139 87 +2f9ac 8 74 46 +2f9b4 4 277 82 +2f9b8 a 1139 87 +2f9c2 2 74 46 +2f9c4 1e 74 46 +2f9e2 14 74 46 +2f9f6 6 256 82 +2f9fc 12 75 46 +2fa0e 4 277 82 +2fa12 4 1139 87 +2fa16 2 75 46 +2fa18 18 75 46 +2fa30 12 75 46 +2fa42 6 256 82 +2fa48 10 76 46 +2fa58 4 277 82 +2fa5c 4 1139 87 +2fa60 2 76 46 +2fa62 18 76 46 +2fa7a 12 76 46 +2fa8c 6 256 82 +2fa92 10 77 46 +2faa2 4 277 82 +2faa6 4 1139 87 +2faaa 2 77 46 +2faac 18 77 46 +2fac4 12 77 46 +2fad6 6 256 82 +2fadc 10 78 46 +2faec 4 277 82 +2faf0 4 1139 87 +2faf4 2 78 46 +2faf6 18 78 46 +2fb0e 12 78 46 +2fb20 4 80 46 +2fb24 2 256 82 +2fb26 2 80 46 +2fb28 4 256 82 +2fb2c 8 80 46 +2fb34 4 1139 87 +2fb38 4 277 82 +2fb3c 2 80 46 +2fb3e 18 80 46 +2fb56 12 80 46 +2fb68 4 1512 82 +2fb6c 2 256 82 +2fb6e 2 1512 82 +2fb70 4 256 82 +2fb74 a 1512 82 +2fb7e 4 81 46 +2fb82 4 1512 82 +2fb86 6 81 46 +2fb8c 6 302 82 +2fb92 10 81 46 +2fba2 4 82 46 +2fba6 2 256 82 +2fba8 2 82 46 +2fbaa 4 256 82 +2fbae 8 82 46 +2fbb6 4 1139 87 +2fbba 4 277 82 +2fbbe 2 82 46 +2fbc0 18 82 46 +2fbd8 12 82 46 +2fbea 6 256 82 +2fbf0 2 83 46 +2fbf2 2 1512 82 +2fbf4 2 83 46 +2fbf6 c 1512 82 +2fc02 6 83 46 +2fc08 6 302 82 +2fc0e 10 83 46 +2fc1e 6 256 82 +2fc24 a 84 46 +2fc2e 4 1139 87 +2fc32 4 277 82 +2fc36 2 84 46 +2fc38 18 84 46 +2fc50 12 84 46 +2fc62 6 256 82 +2fc68 2 85 46 +2fc6a 8 1512 82 +2fc72 2 85 46 +2fc74 e 1512 82 +2fc82 6 85 46 +2fc88 6 302 82 +2fc8e 10 85 46 +2fc9e 4 86 46 +2fca2 2 256 82 +2fca4 2 86 46 +2fca6 4 256 82 +2fcaa 8 86 46 +2fcb2 4 1139 87 +2fcb6 4 277 82 +2fcba 4 1139 87 +2fcbe 2 86 46 +2fcc0 18 86 46 +2fcd8 12 86 46 +2fcea 4 87 46 +2fcee 6 256 82 +2fcf4 a 1512 82 +2fcfe 4 87 46 +2fd02 4 1512 82 +2fd06 6 87 46 +2fd0c 6 302 82 +2fd12 10 87 46 +2fd22 6 256 82 +2fd28 a 88 46 +2fd32 4 1139 87 +2fd36 4 277 82 +2fd3a 2 88 46 +2fd3c 18 88 46 +2fd54 14 88 46 +2fd68 6 88 46 +2fd6e 8 88 46 +2fd76 6 85 79 +2fd7c 6 88 46 +2fd82 8 156 137 +2fd8a 6 256 82 +2fd90 a 1512 82 +2fd9a 4 89 46 +2fd9e 4 1512 82 +2fda2 6 89 46 +2fda8 6 302 82 +2fdae 12 89 46 +2fdc0 6 89 46 +2fdc6 8 89 46 +2fdce 6 85 79 +2fdd4 6 89 46 +2fdda 6 256 82 +2fde0 100 90 46 +FUNC 2fee0 280 0 LinuxLibcSupportTest_uitos_Test::TestBody +2fee0 6 106 46 +2fee6 4 109 46 +2feea 4 106 46 +2feee 4 110 46 +2fef2 2 106 46 +2fef4 2 106 46 +2fef6 4 109 46 +2fefa 2 106 46 +2fefc e 109 46 +2ff0a 4 1552 82 +2ff0e 4 110 46 +2ff12 2 1552 82 +2ff14 2 110 46 +2ff16 8 1552 82 +2ff1e 2 110 46 +2ff20 a 1552 82 +2ff2a 4 110 46 +2ff2e 4 1552 82 +2ff32 a 110 46 +2ff3c 6 302 82 +2ff42 e 110 46 +2ff50 6 256 82 +2ff56 e 112 46 +2ff64 4 113 46 +2ff68 2 1552 82 +2ff6a 4 113 46 +2ff6e a 1552 82 +2ff78 4 113 46 +2ff7c 4 1552 82 +2ff80 6 113 46 +2ff86 6 302 82 +2ff8c e 113 46 +2ff9a 4 115 46 +2ff9e 6 256 82 +2ffa4 e 115 46 +2ffb2 10 116 46 +2ffc2 2 1552 82 +2ffc4 2 116 46 +2ffc6 e 1552 82 +2ffd4 6 116 46 +2ffda 6 302 82 +2ffe0 e 116 46 +2ffee 6 256 82 +2fff4 e 118 46 +30002 10 119 46 +30012 2 1552 82 +30014 2 119 46 +30016 e 1552 82 +30024 6 119 46 +3002a 6 302 82 +30030 e 119 46 +3003e 6 256 82 +30044 e 121 46 +30052 10 122 46 +30062 2 1552 82 +30064 2 122 46 +30066 e 1552 82 +30074 6 122 46 +3007a 6 302 82 +30080 e 122 46 +3008e 6 256 82 +30094 12 125 46 +300a6 10 126 46 +300b6 2 1552 82 +300b8 2 126 46 +300ba e 1552 82 +300c8 6 126 46 +300ce 6 302 82 +300d4 10 126 46 +300e4 6 126 46 +300ea 8 126 46 +300f2 6 85 79 +300f8 6 126 46 +300fe 6 256 82 +30104 5c 127 46 +FUNC 30160 7c 0 testing::internal::CmpHelperEQ +30160 8 1476 82 +30168 a 1476 82 +30172 2 1481 82 +30174 2 1476 82 +30176 2 1481 82 +30178 2 1476 82 +3017a 2 1481 82 +3017c 4 1476 82 +30180 2 1481 82 +30182 6 1482 82 +30188 1c 1408 82 +301a4 12 1471 82 +301b6 c 156 137 +301c2 1a 1488 82 +FUNC 301dc 338 0 LinuxLibcSupportTest_strrchr_Test::TestBody +301dc 8 143 46 +301e4 4 144 46 +301e8 6 143 46 +301ee 2 144 46 +301f0 6 143 46 +301f6 4 144 46 +301fa 2 143 46 +301fc 4 144 46 +30200 26 1571 82 +30226 a 144 46 +30230 6 302 82 +30236 e 144 46 +30244 6 256 82 +3024a a 145 46 +30254 18 1571 82 +3026c 6 145 46 +30272 6 302 82 +30278 e 145 46 +30286 6 256 82 +3028c a 146 46 +30296 16 1571 82 +302ac 8 146 46 +302b4 6 302 82 +302ba e 146 46 +302c8 6 256 82 +302ce a 148 46 +302d8 6 277 82 +302de 4 1139 87 +302e2 4 277 82 +302e6 2 148 46 +302e8 1a 148 46 +30302 10 148 46 +30312 6 256 82 +30318 8 149 46 +30320 6 277 82 +30326 4 1139 87 +3032a 4 277 82 +3032e 2 149 46 +30330 1a 149 46 +3034a 10 149 46 +3035a 6 256 82 +30360 a 150 46 +3036a 6 277 82 +30370 4 1139 87 +30374 4 277 82 +30378 2 150 46 +3037a 1a 150 46 +30394 10 150 46 +303a4 6 256 82 +303aa a 151 46 +303b4 6 277 82 +303ba 4 1139 87 +303be 4 277 82 +303c2 2 151 46 +303c4 1a 151 46 +303de 12 151 46 +303f0 6 151 46 +303f6 8 151 46 +303fe 6 85 79 +30404 6 151 46 +3040a 8 156 137 +30412 6 256 82 +30418 e 154 46 +30426 4 1512 82 +3042a 2 154 46 +3042c e 1512 82 +3043a 6 154 46 +30440 6 302 82 +30446 10 154 46 +30456 6 154 46 +3045c 8 154 46 +30464 6 85 79 +3046a 6 154 46 +30470 6 256 82 +30476 9e 155 46 +FUNC 30514 380 0 LinuxLibcSupportTest_strchr_Test::TestBody +30514 8 129 46 +3051c 4 130 46 +30520 6 129 46 +30526 2 130 46 +30528 6 129 46 +3052e 4 130 46 +30532 2 129 46 +30534 4 130 46 +30538 22 1571 82 +3055a c 130 46 +30566 6 302 82 +3056c e 130 46 +3057a 6 256 82 +30580 a 131 46 +3058a 16 1571 82 +305a0 6 131 46 +305a6 6 302 82 +305ac 10 131 46 +305bc 6 131 46 +305c2 8 131 46 +305ca 6 85 79 +305d0 4 131 46 +305d4 6 256 82 +305da a 132 46 +305e4 16 1571 82 +305fa 6 132 46 +30600 6 302 82 +30606 10 132 46 +30616 6 256 82 +3061c a 134 46 +30626 6 277 82 +3062c 2 1139 87 +3062e 4 277 82 +30632 2 134 46 +30634 18 134 46 +3064c 12 134 46 +3065e 6 256 82 +30664 8 135 46 +3066c 6 277 82 +30672 2 1139 87 +30674 4 277 82 +30678 2 135 46 +3067a 18 135 46 +30692 12 135 46 +306a4 6 256 82 +306aa a 136 46 +306b4 6 277 82 +306ba 2 1139 87 +306bc 4 277 82 +306c0 2 136 46 +306c2 18 136 46 +306da 12 136 46 +306ec 6 256 82 +306f2 a 137 46 +306fc 6 277 82 +30702 2 1139 87 +30704 4 277 82 +30708 2 137 46 +3070a 18 137 46 +30722 14 137 46 +30736 6 137 46 +3073c 8 137 46 +30744 6 85 79 +3074a 6 137 46 +30750 8 156 137 +30758 2 256 82 +3075a 2 140 46 +3075c 4 256 82 +30760 a 140 46 +3076a 2 1481 82 +3076c 2 140 46 +3076e 2 1481 82 +30770 8 1482 82 +30778 1c 1408 82 +30794 16 1471 82 +307aa c 156 137 +307b6 8 140 46 +307be 6 302 82 +307c4 12 140 46 +307d6 6 140 46 +307dc 8 140 46 +307e4 6 85 79 +307ea 6 140 46 +307f0 6 256 82 +307f6 9e 141 46 +FUNC 30894 64 0 testing::internal::CmpHelperEQFailure +30894 8 1464 82 +3089c 4 1464 82 +308a0 2 1382 82 +308a2 a 1464 82 +308ac 2 1382 82 +308ae 2 1464 82 +308b0 4 1382 82 +308b4 2 1464 82 +308b6 c 1382 82 +308c2 12 1471 82 +308d4 c 156 137 +308e0 18 1472 82 +FUNC 308f8 74 0 testing::internal::CmpHelperEQ +308f8 8 1476 82 +30900 10 1476 82 +30910 4 1481 82 +30914 2 1476 82 +30916 4 1481 82 +3091a 6 1482 82 +30920 2 1408 82 +30922 2 1382 82 +30924 a 1408 82 +3092e 8 1382 82 +30936 12 1471 82 +30948 c 156 137 +30954 18 1488 82 +FUNC 3096c 78 0 testing::internal::CmpHelperEQ +3096c 8 1476 82 +30974 c 1476 82 +30980 2 1481 82 +30982 2 1476 82 +30984 4 1481 82 +30988 2 1476 82 +3098a 2 1481 82 +3098c 2 1476 82 +3098e 2 1481 82 +30990 6 1482 82 +30996 2 1408 82 +30998 2 1382 82 +3099a a 1408 82 +309a4 8 1382 82 +309ac 12 1471 82 +309be c 156 137 +309ca 1a 1488 82 +FUNC 309e4 290 0 LinuxLibcSupportTest_memchr_Test::TestBody +309e4 4 157 46 +309e8 2 158 46 +309ea 2 157 46 +309ec a 158 46 +309f6 a 1571 82 +30a00 2 1481 82 +30a02 8 1482 82 +30a0a 14 1487 82 +30a1e 8 158 46 +30a26 6 302 82 +30a2c 10 158 46 +30a3c 6 256 82 +30a42 c 159 46 +30a4e 6 1571 82 +30a54 2 1481 82 +30a56 8 1482 82 +30a5e 14 1487 82 +30a72 6 159 46 +30a78 6 302 82 +30a7e 10 159 46 +30a8e 6 256 82 +30a94 c 160 46 +30aa0 6 1571 82 +30aa6 2 1481 82 +30aa8 8 1482 82 +30ab0 14 1487 82 +30ac4 8 160 46 +30acc 6 302 82 +30ad2 e 160 46 +30ae0 4 163 46 +30ae4 2 256 82 +30ae6 2 163 46 +30ae8 4 256 82 +30aec a 163 46 +30af6 8 1512 82 +30afe 2 163 46 +30b00 e 1512 82 +30b0e 6 163 46 +30b14 6 302 82 +30b1a e 163 46 +30b28 6 256 82 +30b2e a 164 46 +30b38 2 1512 82 +30b3a 2 164 46 +30b3c e 1512 82 +30b4a 6 164 46 +30b50 6 302 82 +30b56 e 164 46 +30b64 6 256 82 +30b6a 10 165 46 +30b7a 4 1512 82 +30b7e 2 165 46 +30b80 e 1512 82 +30b8e 6 165 46 +30b94 6 302 82 +30b9a e 165 46 +30ba8 6 256 82 +30bae 10 166 46 +30bbe 4 1512 82 +30bc2 2 166 46 +30bc4 e 1512 82 +30bd2 6 166 46 +30bd8 6 302 82 +30bde 10 166 46 +30bee 6 166 46 +30bf4 8 166 46 +30bfc 6 85 79 +30c02 6 166 46 +30c08 6 256 82 +30c0e 66 167 46 +FUNC 30c74 48 0 testing::PrintToString +30c74 e 883 80 +30c82 2 883 80 +30c84 6 884 80 +30c8a 2 883 80 +30c8c 4 884 80 +30c90 8 394 80 +30c98 8 75 132 +30ca0 6 886 80 +30ca6 16 887 80 +FUNC 30cbc 74 0 testing::internal::CmpHelperEQ +30cbc 8 1476 82 +30cc4 10 1476 82 +30cd4 6 1481 82 +30cda 2 1476 82 +30cdc 4 1481 82 +30ce0 6 1482 82 +30ce6 14 1382 82 +30cfa 12 1471 82 +30d0c c 156 137 +30d18 18 1488 82 +FUNC 30d30 30c 0 LinuxLibcSupportTest_read_hex_ptr_Test::TestBody +30d30 4 169 46 +30d34 2 173 46 +30d36 2 169 46 +30d38 a 173 46 +30d42 2 174 46 +30d44 10 1512 82 +30d54 2 174 46 +30d56 2 173 46 +30d58 e 1512 82 +30d66 8 174 46 +30d6e 6 302 82 +30d74 10 174 46 +30d84 6 256 82 +30d8a 2 175 46 +30d8c 4 1512 82 +30d90 2 175 46 +30d92 16 1512 82 +30da8 6 175 46 +30dae 6 302 82 +30db4 10 175 46 +30dc4 6 256 82 +30dca 8 177 46 +30dd2 2 178 46 +30dd4 2 177 46 +30dd6 2 178 46 +30dd8 e 1512 82 +30de6 6 178 46 +30dec 6 302 82 +30df2 10 178 46 +30e02 6 256 82 +30e08 2 179 46 +30e0a 2 1512 82 +30e0c 2 179 46 +30e0e c 1512 82 +30e1a 6 179 46 +30e20 6 302 82 +30e26 10 179 46 +30e36 6 256 82 +30e3c a 181 46 +30e46 4 182 46 +30e4a 2 1512 82 +30e4c 2 182 46 +30e4e 2 181 46 +30e50 e 1512 82 +30e5e 6 182 46 +30e64 6 302 82 +30e6a 10 182 46 +30e7a 6 256 82 +30e80 2 183 46 +30e82 2 1512 82 +30e84 2 183 46 +30e86 c 1512 82 +30e92 6 183 46 +30e98 6 302 82 +30e9e 10 183 46 +30eae 6 256 82 +30eb4 a 185 46 +30ebe 4 186 46 +30ec2 4 1512 82 +30ec6 2 186 46 +30ec8 4 1512 82 +30ecc 2 185 46 +30ece c 1512 82 +30eda 6 186 46 +30ee0 6 302 82 +30ee6 10 186 46 +30ef6 6 256 82 +30efc 2 187 46 +30efe 2 1512 82 +30f00 2 187 46 +30f02 c 1512 82 +30f0e 6 187 46 +30f14 6 302 82 +30f1a 10 187 46 +30f2a 6 256 82 +30f30 a 189 46 +30f3a 4 190 46 +30f3e 2 189 46 +30f40 2 190 46 +30f42 e 1512 82 +30f50 6 190 46 +30f56 6 302 82 +30f5c 12 190 46 +30f6e 6 190 46 +30f74 8 190 46 +30f7c 6 85 79 +30f82 4 190 46 +30f86 6 256 82 +30f8c 2 191 46 +30f8e 2 1512 82 +30f90 4 191 46 +30f94 e 1512 82 +30fa2 6 191 46 +30fa8 6 302 82 +30fae a 191 46 +30fb8 2 191 46 +30fba 8 191 46 +30fc2 6 191 46 +30fc8 8 191 46 +30fd0 6 85 79 +30fd6 6 191 46 +30fdc 6 256 82 +30fe2 5a 192 46 +FUNC 3103c 26c 0 LinuxLibcSupportTest_read_decimal_ptr_Test::TestBody +3103c 4 194 46 +31040 4 198 46 +31044 2 194 46 +31046 c 198 46 +31052 2 199 46 +31054 c 1512 82 +31060 2 199 46 +31062 2 198 46 +31064 e 1512 82 +31072 8 199 46 +3107a 6 302 82 +31080 10 199 46 +31090 6 256 82 +31096 2 200 46 +31098 4 1512 82 +3109c 2 200 46 +3109e 10 1512 82 +310ae 6 200 46 +310b4 6 302 82 +310ba 10 200 46 +310ca 6 256 82 +310d0 a 202 46 +310da 2 203 46 +310dc 2 1512 82 +310de 2 203 46 +310e0 2 202 46 +310e2 e 1512 82 +310f0 6 203 46 +310f6 6 302 82 +310fc 10 203 46 +3110c 6 256 82 +31112 2 204 46 +31114 2 1512 82 +31116 2 204 46 +31118 c 1512 82 +31124 6 204 46 +3112a 6 302 82 +31130 10 204 46 +31140 6 256 82 +31146 a 206 46 +31150 4 207 46 +31154 4 1512 82 +31158 2 206 46 +3115a 2 1512 82 +3115c 2 207 46 +3115e e 1512 82 +3116c 6 207 46 +31172 6 302 82 +31178 10 207 46 +31188 6 256 82 +3118e 2 208 46 +31190 2 1512 82 +31192 2 208 46 +31194 c 1512 82 +311a0 6 208 46 +311a6 6 302 82 +311ac 10 208 46 +311bc 6 256 82 +311c2 a 210 46 +311cc 4 211 46 +311d0 2 210 46 +311d2 2 211 46 +311d4 e 1512 82 +311e2 6 211 46 +311e8 6 302 82 +311ee 10 211 46 +311fe 6 256 82 +31204 2 212 46 +31206 2 1512 82 +31208 4 212 46 +3120c e 1512 82 +3121a 6 212 46 +31220 6 302 82 +31226 12 212 46 +31238 6 212 46 +3123e 8 212 46 +31246 6 85 79 +3124c 6 212 46 +31252 6 256 82 +31258 50 213 46 +FUNC 312a8 2e 0 google_breakpad::test_assembler::Section::Mark +312a8 2 439 62 +312aa 4 439 62 +312ae 4 400 136 +312b2 10 436 62 +312c2 8 439 62 +312ca 6 439 62 +312d0 6 439 62 +FUNC 312d6 3e 0 google_breakpad::synth_elf::ELF::AppendSection +312d6 2 121 50 +312d8 2 124 50 +312da 6 121 50 +312e0 2 124 50 +312e2 6 125 50 +312e8 4 126 50 +312ec 6 127 50 +312f2 4 133 50 +312f6 4 127 50 +312fa 4 129 50 +312fe 8 130 50 +31306 2 131 50 +31308 4 133 50 +3130c 8 131 50 +FUNC 31314 d6 0 google_breakpad::synth_elf::ELF::AddSegment +31314 4 135 50 +31318 4 135 50 +3131c 2 140 50 +3131e 4 143 50 +31322 4 140 50 +31326 2 135 50 +31328 8 143 50 +31330 6 145 50 +31336 a 147 50 +31340 6 151 50 +31346 2 150 50 +31348 2 153 50 +3134a 8 153 50 +31352 2 202 144 +31354 2 154 50 +31356 2 155 50 +31358 4 153 50 +3135c 2 155 50 +3135e 8 158 50 +31366 2 159 50 +31368 6 163 50 +3136e 4 170 50 +31372 2 202 144 +31374 c 168 50 +31380 4 170 50 +31384 2 170 50 +31386 4 170 50 +3138a 2 170 50 +3138c 4 170 50 +31390 4 170 50 +31394 4 172 50 +31398 2 172 50 +3139a 4 172 50 +3139e 2 172 50 +313a0 4 172 50 +313a4 4 172 50 +313a8 4 174 50 +313ac 8 174 50 +313b4 4 174 50 +313b8 4 176 50 +313bc 8 176 50 +313c4 6 178 50 +313ca 8 180 50 +313d2 12 184 50 +313e4 6 185 50 +FUNC 313ec 24 0 google_breakpad::synth_elf::ELF::ElfSection::~ElfSection +313ec 4 141 51 +313f0 10 141 51 +31400 6 141 51 +31406 a 141 51 +FUNC 31410 12 0 google_breakpad::synth_elf::ELF::ElfSection::~ElfSection +31410 2 141 51 +31412 6 141 51 +31418 6 141 51 +3141e 4 141 51 +FUNC 31424 1c 0 google_breakpad::synth_elf::SymbolTable::~SymbolTable +31424 4 161 51 +31428 18 161 51 +FUNC 31440 12 0 google_breakpad::synth_elf::SymbolTable::~SymbolTable +31440 2 161 51 +31442 6 161 51 +31448 6 161 51 +3144e 4 161 51 +FUNC 31452 70 0 google_breakpad::synth_elf::Notes::AddNote +31452 4 244 50 +31456 8 244 50 +3145e a 247 50 +31468 2 244 50 +3146a 4 247 50 +3146e 4 400 136 +31472 2 528 136 +31474 2 400 136 +31476 4 248 50 +3147a 4 292 62 +3147e 4 528 136 +31482 2 249 50 +31484 4 250 50 +31488 4 528 136 +3148c a 517 136 +31496 8 453 136 +3149e a 255 50 +314a8 a 528 136 +314b2 a 257 50 +314bc 6 258 50 +FUNC 314c4 a8 0 std::priv::_Impl_vector >::_Impl_vector +314c4 4 246 144 +314c8 2 246 144 +314ca 4 192 144 +314ce 2 70 144 +314d0 4 192 144 +314d4 4 342 106 +314d8 2 246 144 +314da 4 70 144 +314de 2 481 106 +314e0 2 342 106 +314e2 8 343 106 +314ea 4 343 106 +314ee 2 346 106 +314f0 6 347 106 +314f6 4 348 106 +314fa 2 352 106 +314fc 2 348 106 +314fe 4 352 106 +31502 2 356 106 +31504 4 73 144 +31508 2 71 144 +3150a 2 72 144 +3150c 4 73 144 +31510 10 86 142 +31520 4 86 142 +31524 6 139 108 +3152a 20 449 62 +3154a a 86 142 +31554 a 250 144 +3155e 2 249 144 +31560 c 250 144 +FUNC 3156c 34 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, google_breakpad::test_assembler::Label>, std::priv::_Select1st, std::allocator >, google_breakpad::test_assembler::Label> >, std::priv::_MapTraitsT, std::allocator >, google_breakpad::test_assembler::Label> >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::_M_create_node +3156c 2 315 141 +3156e 2 306 106 +31570 2 315 141 +31572 6 306 106 +31578 6 307 106 +3157e 4 119 108 +31582 6 68 129 +31588 c 68 129 +31594 2 321 141 +31596 2 324 141 +31598 2 321 141 +3159a 2 322 141 +3159c 4 324 141 +FUNC 315a0 24 0 google_breakpad::synth_elf::SymbolTable::SymbolTable +315a0 2 213 50 +315a2 6 213 50 +315a8 12 217 50 +315ba a 219 50 +FUNC 315c4 68 0 google_breakpad::synth_elf::ELF::ElfSection::ElfSection +315c4 4 141 51 +315c8 2 141 51 +315ca 4 270 62 +315ce 2 141 51 +315d0 12 270 62 +315e2 c 124 148 +315ee e 270 62 +315fc 4 141 51 +31600 a 141 51 +3160a 4 141 51 +3160e a 141 51 +31618 4 141 51 +3161c 10 141 51 +FUNC 3162c 170 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +3162c 6 81 143 +31632 4 81 143 +31636 c 192 144 +31642 4 173 144 +31646 2 81 143 +31648 8 173 144 +31650 8 41 143 +31658 a 175 144 +31662 4 176 144 +31666 6 176 144 +3166c 2 176 144 +3166e a 347 106 +31678 6 348 106 +3167e 8 352 106 +31686 4 91 143 +3168a 2 84 142 +3168c e 86 142 +3169a 4 86 142 +3169e 6 139 108 +316a4 8 139 108 +316ac 4 88 142 +316b0 4 89 142 +316b4 e 86 142 +316c2 a 93 143 +316cc 2 119 108 +316ce 8 119 108 +316d6 6 95 143 +316dc a 314 142 +316e6 8 249 142 +316ee 6 249 142 +316f4 2 139 108 +316f6 8 139 108 +316fe 8 249 142 +31706 6 98 143 +3170c 2 86 142 +3170e 2 84 142 +31710 c 86 142 +3171c 6 86 142 +31722 6 139 108 +31728 8 139 108 +31730 4 88 142 +31734 4 89 142 +31738 10 86 142 +31748 8 65 118 +31750 2 74 118 +31752 4 191 108 +31756 4 77 118 +3175a a 57 108 +31764 4 81 118 +31768 6 662 144 +3176e 2 319 106 +31770 4 323 106 +31774 6 104 143 +3177a 4 667 144 +3177e 2 668 144 +31780 6 105 143 +31786 6 346 106 +3178c 10 356 106 +FUNC 3179c 2e 0 std::priv::_Rb_global::_M_decrement +3179c 4 279 140 +317a0 8 279 140 +317a8 4 280 140 +317ac 4 281 140 +317b0 8 99 141 +317b8 2 285 140 +317ba 6 286 140 +317c0 6 288 140 +317c6 4 293 140 +FUNC 317ca 6e 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, google_breakpad::test_assembler::Label>, std::priv::_Select1st, std::allocator >, google_breakpad::test_assembler::Label> >, std::priv::_MapTraitsT, std::allocator >, google_breakpad::test_assembler::Label> >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::_M_insert +317ca 2 358 140 +317cc 2 350 140 +317ce 8 350 140 +317d6 2 358 140 +317d8 8 359 140 +317e0 2 360 140 +317e2 2 361 140 +317e4 4 362 140 +317e8 4 364 140 +317ec 4 364 140 +317f0 a 79 111 +317fa 2 364 140 +317fc 6 367 140 +31802 2 368 140 +31804 2 369 140 +31806 2 367 140 +31808 4 369 140 +3180c 4 370 140 +31810 6 373 140 +31816 2 374 140 +31818 2 375 140 +3181a 2 373 140 +3181c 4 375 140 +31820 2 376 140 +31822 2 379 140 +31824 2 378 140 +31826 6 379 140 +3182c 2 380 140 +3182e 2 382 140 +31830 4 380 140 +31834 2 142 141 +31836 2 382 140 +FUNC 31838 78 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, google_breakpad::test_assembler::Label>, std::priv::_Select1st, std::allocator >, google_breakpad::test_assembler::Label> >, std::priv::_MapTraitsT, std::allocator >, google_breakpad::test_assembler::Label> >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::insert_unique +31838 4 405 140 +3183c 6 405 140 +31842 2 406 140 +31844 2 408 140 +31846 2 407 140 +31848 2 409 140 +3184a a 79 111 +31854 2 412 140 +31856 4 412 140 +3185a 2 412 140 +3185c 6 405 140 +31862 2 142 141 +31864 2 415 140 +31866 6 416 140 +3186c 6 417 140 +31872 8 187 141 +3187a 2 421 140 +3187c a 79 111 +31886 2 421 140 +31888 12 422 140 +3189a 4 142 141 +3189e 6 62 129 +318a4 2 142 141 +318a6 2 62 129 +318a8 8 425 140 +FUNC 318b0 174 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, google_breakpad::test_assembler::Label>, std::priv::_Select1st, std::allocator >, google_breakpad::test_assembler::Label> >, std::priv::_MapTraitsT, std::allocator >, google_breakpad::test_assembler::Label> >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::insert_unique +318b0 6 432 140 +318b6 4 434 140 +318ba 2 432 140 +318bc 2 434 140 +318be 4 432 140 +318c2 2 434 140 +318c4 4 437 140 +318c8 4 438 140 +318cc 4 143 111 +318d0 8 79 111 +318d8 4 440 140 +318dc 8 79 111 +318e4 4 447 140 +318e8 c 297 140 +318f4 a 94 141 +318fe 4 301 140 +31902 6 302 140 +31908 6 304 140 +3190e a 309 140 +31918 4 458 140 +3191c c 462 140 +31928 a 309 140 +31932 6 513 140 +31938 a 475 140 +31942 6 142 141 +31948 4 479 140 +3194c 2 480 140 +3194e a 79 111 +31958 2 480 140 +3195a e 483 140 +31968 6 486 140 +3196e 6 187 141 +31974 4 143 111 +31978 2 187 141 +3197a 8 79 111 +31982 4 494 140 +31986 a 79 111 +31990 4 494 140 +31994 8 500 140 +3199c 8 79 111 +319a4 2 517 140 +319a6 4 517 140 +319aa a 79 111 +319b4 4 517 140 +319b8 6 521 140 +319be e 522 140 +319cc 8 497 140 +319d4 4 498 140 +319d8 e 524 140 +319e6 4 142 141 +319ea c 297 140 +319f6 c 94 141 +31a02 4 301 140 +31a06 6 302 140 +31a0c 6 304 140 +31a12 a 524 140 +31a1c 8 534 140 +FUNC 31a24 ac 0 std::map, std::allocator >, google_breakpad::test_assembler::Label, std::less, std::allocator > >, std::allocator, std::allocator >, google_breakpad::test_assembler::Label> > >::operator[], std::allocator > > +31a24 e 175 123 +31a32 4 568 141 +31a36 6 175 123 +31a3c 2 175 123 +31a3e 2 571 141 +31a40 a 79 111 +31a4a 2 572 141 +31a4c 4 573 141 +31a50 a 575 141 +31a5a 2 178 123 +31a5c 2 142 141 +31a5e 2 178 123 +31a60 a 79 111 +31a6a 2 178 123 +31a6c 12 181 123 +31a7e 2 179 123 +31a80 4 62 129 +31a84 6 179 123 +31a8a 4 62 129 +31a8e 4 62 129 +31a92 4 62 129 +31a96 8 62 129 +31a9e 8 191 123 +31aa6 2 142 141 +31aa8 4 191 123 +31aac 2 179 123 +31aae 2 51 129 +31ab0 2 179 123 +31ab2 4 51 129 +31ab6 6 156 137 +31abc 8 179 123 +31ac4 c 181 123 +FUNC 31ad0 a4 0 google_breakpad::synth_elf::StringTable::Add +31ad0 4 75 51 +31ad4 4 549 141 +31ad8 6 75 51 +31ade 4 549 141 +31ae2 2 552 141 +31ae4 a 79 111 +31aee 2 553 141 +31af0 4 554 141 +31af4 a 556 141 +31afe 4 558 141 +31b02 a 79 111 +31b0c 6 559 141 +31b12 4 76 51 +31b16 a 77 51 +31b20 6 77 51 +31b26 2 77 51 +31b28 4 400 136 +31b2c c 436 62 +31b38 2 296 62 +31b3a 4 436 62 +31b3e a 517 136 +31b48 8 453 136 +31b50 8 81 51 +31b58 6 81 51 +31b5e 8 82 51 +31b66 6 82 51 +31b6c 8 83 51 +FUNC 31b74 58 0 google_breakpad::synth_elf::SymbolTable::AddSymbol +31b74 2 222 50 +31b76 8 222 50 +31b7e c 224 50 +31b8a 8 224 50 +31b92 6 224 50 +31b98 8 225 50 +31ba0 4 357 62 +31ba4 8 226 50 +31bac 12 453 136 +31bbe a 229 50 +31bc8 4 230 50 +FUNC 31bcc 5c 0 google_breakpad::synth_elf::SymbolTable::AddSymbol +31bcc 2 233 50 +31bce 8 233 50 +31bd6 c 235 50 +31be2 8 235 50 +31bea 2 235 50 +31bec 4 357 62 +31bf0 4 235 50 +31bf4 12 453 136 +31c06 a 238 50 +31c10 a 239 50 +31c1a a 240 50 +31c24 4 241 50 +FUNC 31c28 18c 0 google_breakpad::synth_elf::ELF::AddSection +31c28 12 86 50 +31c3a 4 86 50 +31c3e 2 87 50 +31c40 4 86 50 +31c44 2 87 50 +31c46 a 86 50 +31c50 4 87 50 +31c54 2 88 50 +31c56 4 100 50 +31c5a e 88 50 +31c68 4 400 136 +31c6c 2 96 50 +31c6e 4 400 136 +31c72 2 91 50 +31c74 4 96 50 +31c78 2 91 50 +31c7a 4 92 50 +31c7e 4 96 50 +31c82 6 98 50 +31c88 2 100 50 +31c8a 2 100 50 +31c8c 4 100 50 +31c90 6 100 50 +31c96 e 102 50 +31ca4 a 104 50 +31cae 2 106 50 +31cb0 2 106 50 +31cb2 4 106 50 +31cb6 6 106 50 +31cbc 6 108 50 +31cc2 6 110 50 +31cc8 10 112 50 +31cd8 a 114 50 +31ce2 4 117 50 +31ce6 6 114 50 +31cec a 117 50 +31cf6 16 270 62 +31d0c a 124 148 +31d16 c 270 62 +31d22 2 145 51 +31d24 8 145 51 +31d2c 2 117 50 +31d2e 2 145 51 +31d30 4 117 50 +31d34 4 145 51 +31d38 2 117 50 +31d3a 4 145 51 +31d3e 2 145 51 +31d40 4 380 144 +31d44 2 145 51 +31d46 4 380 144 +31d4a 4 270 62 +31d4e 4 380 144 +31d52 2 119 108 +31d54 8 119 108 +31d5c c 382 144 +31d68 12 162 144 +31d7a 6 117 50 +31d80 6 117 50 +31d86 6 88 50 +31d8c 6 118 50 +31d92 22 119 50 +FUNC 31db4 dc 0 google_breakpad::synth_elf::ELF::Finish +31db4 6 187 50 +31dba 2 189 50 +31dbc 8 187 50 +31dc4 4 187 50 +31dc8 8 189 50 +31dd0 e 191 50 +31dde 28 191 50 +31e06 6 156 137 +31e0c a 194 50 +31e16 6 195 50 +31e1c c 196 50 +31e28 e 198 50 +31e36 8 201 50 +31e3e 8 203 50 +31e46 4 201 50 +31e4a c 205 50 +31e56 c 206 50 +31e62 a 209 50 +31e6c a 210 50 +31e76 1a 211 50 +FUNC 31e90 30c 0 google_breakpad::synth_elf::ELF::ELF +31e90 e 14 50 +31e9e 4 14 50 +31ea2 2 23 50 +31ea4 6 14 50 +31eaa 6 23 50 +31eb0 4 23 50 +31eb4 a 23 50 +31ebe 8 23 50 +31ec6 8 23 50 +31ece 2 23 50 +31ed0 2 23 50 +31ed2 4 23 50 +31ed6 4 23 50 +31eda 2 23 50 +31edc 4 23 50 +31ee0 4 23 50 +31ee4 a 23 50 +31eee 4 23 50 +31ef2 2 23 50 +31ef4 2 23 50 +31ef6 4 23 50 +31efa 4 23 50 +31efe 2 23 50 +31f00 4 23 50 +31f04 4 23 50 +31f08 a 23 50 +31f12 4 23 50 +31f16 2 23 50 +31f18 6 23 50 +31f1e 4 23 50 +31f22 18 67 51 +31f3a 2 250 141 +31f3c 6 67 51 +31f42 10 250 141 +31f52 8 481 106 +31f5a 2 432 62 +31f5c 4 481 106 +31f60 4 266 141 +31f64 4 267 141 +31f68 4 432 62 +31f6c 4 263 141 +31f70 4 265 141 +31f74 4 391 141 +31f78 6 432 62 +31f7e a 68 51 +31f88 6 68 51 +31f8e 10 69 51 +31f9e a 69 51 +31fa8 8 69 51 +31fb0 6 69 51 +31fb6 6 156 137 +31fbc 4 432 62 +31fc0 8 67 144 +31fc8 4 481 106 +31fcc 6 432 62 +31fd2 a 30 50 +31fdc 4 357 62 +31fe0 6 30 50 +31fe6 28 453 136 +3200e 2 41 50 +32010 24 453 136 +32034 4 182 135 +32038 6 400 136 +3203e 6 182 135 +32044 8 600 135 +3204c 2 74 137 +3204e 4 74 137 +32052 6 74 137 +32058 2 74 137 +3205a 4 184 135 +3205e a 185 135 +32068 6 185 135 +3206e 2 186 135 +32070 c 249 142 +3207c 8 249 142 +32084 6 146 108 +3208a 8 59 50 +32092 2 187 135 +32094 2 53 50 +32096 4 101 108 +3209a 2 53 50 +3209c 2 232 145 +3209e 6 189 135 +320a4 4 53 50 +320a8 8 55 50 +320b0 8 57 50 +320b8 e 59 50 +320c6 c 61 50 +320d2 c 63 50 +320de 8 65 50 +320e6 2 67 50 +320e8 2 67 50 +320ea 2 67 50 +320ec a 67 50 +320f6 2 69 50 +320f8 2 69 50 +320fa 2 69 50 +320fc a 69 50 +32106 8 71 50 +3210e 2 73 50 +32110 2 73 50 +32112 2 73 50 +32114 a 73 50 +3211e 8 75 50 +32126 8 77 50 +3212e 8 80 50 +32136 e 81 50 +32144 1c 81 50 +32160 6 156 137 +32166 6 81 50 +3216c 30 82 50 +FUNC 3219c 40 0 pthread_barrier_wait +3219c 2 62 36 +3219e 2 62 36 +321a0 4 64 36 +321a4 a 67 36 +321ae 6 69 36 +321b4 6 70 36 +321ba 4 71 36 +321be 8 76 36 +321c6 6 75 36 +321cc 6 79 36 +321d2 2 80 36 +321d4 8 81 36 +FUNC 321dc 3c 0 thread_function +321dc 2 81 53 +321de 2 81 53 +321e0 6 70 53 +321e6 2 83 53 +321e8 6 84 53 +321ee 6 85 53 +321f4 2 86 53 +321f6 6 86 53 +321fc 8 87 53 +32204 6 88 53 +3220a e 93 36 +FUNC 32218 5c 0 google_breakpad::CrashGenerator::HasDefaultCorePattern +32218 6 108 53 +3221e 6 108 53 +32224 2 111 53 +32226 2 108 53 +32228 2 110 53 +3222a 8 111 53 +32232 2 110 53 +32234 4 111 53 +32238 2 112 53 +3223a 6 111 53 +32240 14 112 53 +32254 2 112 53 +32256 1e 113 53 +FUNC 32274 8 0 google_breakpad::CrashGenerator::GetThreadId +32274 2 124 53 +32276 6 125 53 +FUNC 3227c 8 0 google_breakpad::CrashGenerator::GetThreadIdPointer +3227c 2 128 53 +3227e 6 129 53 +FUNC 32284 2c 0 google_breakpad::CrashGenerator::UnmapSharedMemory +32284 2 148 53 +32286 2 148 53 +32288 4 149 53 +3228c 8 152 53 +32294 2 153 53 +32296 4 154 53 +3229a 8 158 53 +322a2 4 159 53 +322a6 2 150 53 +322a8 8 160 53 +FUNC 322b0 54 0 google_breakpad::CrashGenerator::MapSharedMemory +322b0 4 131 53 +322b4 4 131 53 +322b8 8 132 53 +322c0 16 136 53 +322d6 4 137 53 +322da 2 136 53 +322dc 2 137 53 +322de 2 138 53 +322e0 2 139 53 +322e2 8 138 53 +322ea 8 142 53 +322f2 4 143 53 +322f6 2 144 53 +322f8 c 146 53 +FUNC 32304 2c 0 google_breakpad::CrashGenerator::SetCoreFileSizeLimit +32304 2 162 53 +32306 2 164 53 +32308 4 163 53 +3230c a 164 53 +32316 8 165 53 +3231e 4 166 53 +32322 2 168 53 +32324 c 169 53 +FUNC 32330 b4 0 google_breakpad::CrashGenerator::CopyProcFiles +32330 a 256 53 +3233a 2 258 53 +3233c 6 256 53 +32342 6 256 53 +32348 2 260 53 +3234a 2 256 53 +3234c 4 260 53 +32350 4 256 53 +32354 4 265 53 +32358 2 256 53 +3235a 2 260 53 +3235c 2 256 53 +3235e 4 260 53 +32362 2 265 53 +32364 18 260 53 +3237c 6 261 53 +32382 4 262 53 +32386 16 265 53 +3239c 6 266 53 +323a2 c 269 53 +323ae 2 258 53 +323b0 4 258 53 +323b4 30 273 53 +FUNC 323e4 114 0 google_breakpad::CrashGenerator::CreateThreadsInChildProcess +323e4 8 275 53 +323ec 2 128 53 +323ee 2 275 53 +323f0 4 276 53 +323f4 4 275 53 +323f8 2 278 53 +323fa 2 275 53 +323fc 2 276 53 +323fe 2 278 53 +32400 4 283 53 +32404 4 283 53 +32408 4 283 53 +3240c 2 283 53 +3240e 4 283 53 +32412 4 288 53 +32416 2 283 53 +32418 8 288 53 +32420 8 290 53 +32428 4 288 53 +3242c a 291 53 +32436 6 313 53 +3243c 6 314 53 +32442 2 58 36 +32444 6 57 36 +3244a 2 56 36 +3244c 4 57 36 +32450 c 58 36 +3245c a 305 53 +32466 2 302 53 +32468 4 128 53 +3246c 2 305 53 +3246e 4 128 53 +32472 2 303 53 +32474 a 305 53 +3247e 2 304 53 +32480 14 306 53 +32494 2 301 53 +32496 8 301 53 +3249e 6 311 53 +324a4 2 312 53 +324a6 6 312 53 +324ac c 313 53 +324b8 2 84 36 +324ba 2 85 36 +324bc 2 84 36 +324be 4 85 36 +324c2 6 86 36 +324c8 6 318 53 +324ce 6 319 53 +324d4 24 320 53 +FUNC 324f8 22 0 testing::internal::scoped_ptr, std::allocator > >::reset +324f8 2 1152 87 +324fa 2 1153 87 +324fc 2 1152 87 +324fe 2 1153 87 +32500 2 1152 87 +32502 2 1153 87 +32504 8 1154 87 +3250c 4 1155 87 +32510 6 1155 87 +32516 4 1157 87 +FUNC 3251a 12 0 google_breakpad::CrashGenerator::CrashGenerator +3251a 2 99 53 +3251c 2 99 53 +3251e a 101 53 +32528 4 102 53 +FUNC 3252c 1a 0 google_breakpad::CrashGenerator::~CrashGenerator +3252c 2 104 53 +3252e 2 104 53 +32530 4 105 53 +32534 8 61 63 +3253c 6 156 137 +32542 4 106 53 +FUNC 32548 14 0 google_breakpad::CrashGenerator::GetCoreFilePath +32548 2 115 53 +3254a 2 115 53 +3254c 8 116 53 +32554 8 117 53 +FUNC 3255c 14 0 google_breakpad::CrashGenerator::GetDirectoryOfProcFilesCopy +3255c 2 119 53 +3255e 2 119 53 +32560 8 120 53 +32568 8 121 53 +FUNC 32570 1c4 0 google_breakpad::CrashGenerator::CreateChildCrash +32570 14 173 53 +32584 8 173 53 +3258c 6 174 53 +32592 4 174 53 +32596 14 176 53 +325aa a 180 53 +325b4 8 181 53 +325bc 2 182 53 +325be 4 185 53 +325c2 6 186 53 +325c8 6 187 53 +325ce 4 187 53 +325d2 6 188 53 +325d8 e 191 53 +325e6 4 192 53 +325ea 2 193 53 +325ec 4 192 53 +325f0 8 193 53 +325f8 a 194 53 +32602 4 194 53 +32606 8 195 53 +3260e 6 196 53 +32614 4 198 53 +32618 2 198 53 +3261a 2 198 53 +3261c 6 198 53 +32622 2 198 53 +32624 10 199 53 +32634 2 128 53 +32636 2 215 53 +32638 4 128 53 +3263c 2 215 53 +3263e 2 214 53 +32640 c 75 53 +3264c 4 214 53 +32650 8 215 53 +32658 6 226 53 +3265e 4 213 53 +32662 8 156 137 +3266a 6 230 53 +32670 4 233 53 +32674 6 234 53 +3267a 10 239 53 +3268a 4 239 53 +3268e 6 239 53 +32694 6 240 53 +3269a 10 243 53 +326aa 4 243 53 +326ae 4 247 53 +326b2 14 247 53 +326c6 4 248 53 +326ca 6 251 53 +326d0 4 252 53 +326d4 10 254 53 +326e4 6 240 53 +326ea 6 247 53 +326f0 44 254 53 +FUNC 32734 18 0 WastefulVectorTest_UsesPageAllocator_Test::~WastefulVectorTest_UsesPageAllocator_Test +32734 2 91 56 +32736 16 91 56 +FUNC 3274c 12 0 WastefulVectorTest_UsesPageAllocator_Test::~WastefulVectorTest_UsesPageAllocator_Test +3274c 2 91 56 +3274e 6 91 56 +32754 6 91 56 +3275a 4 91 56 +FUNC 32760 18 0 WastefulVectorTest_Simple_Test::~WastefulVectorTest_Simple_Test +32760 2 76 56 +32762 16 76 56 +FUNC 32778 12 0 WastefulVectorTest_Simple_Test::~WastefulVectorTest_Simple_Test +32778 2 76 56 +3277a 6 76 56 +32780 6 76 56 +32786 4 76 56 +FUNC 3278c 18 0 WastefulVectorTest_Setup_Test::~WastefulVectorTest_Setup_Test +3278c 2 69 56 +3278e 16 69 56 +FUNC 327a4 12 0 WastefulVectorTest_Setup_Test::~WastefulVectorTest_Setup_Test +327a4 2 69 56 +327a6 6 69 56 +327ac 6 69 56 +327b2 4 69 56 +FUNC 327b8 18 0 PageAllocatorTest_LargeObject_Test::~PageAllocatorTest_LargeObject_Test +327b8 2 53 56 +327ba 16 53 56 +FUNC 327d0 12 0 PageAllocatorTest_LargeObject_Test::~PageAllocatorTest_LargeObject_Test +327d0 2 53 56 +327d2 6 53 56 +327d8 6 53 56 +327de 4 53 56 +FUNC 327e4 18 0 PageAllocatorTest_SmallObjects_Test::~PageAllocatorTest_SmallObjects_Test +327e4 2 43 56 +327e6 16 43 56 +FUNC 327fc 12 0 PageAllocatorTest_SmallObjects_Test::~PageAllocatorTest_SmallObjects_Test +327fc 2 43 56 +327fe 6 43 56 +32804 6 43 56 +3280a 4 43 56 +FUNC 32810 18 0 PageAllocatorTest_Setup_Test::~PageAllocatorTest_Setup_Test +32810 2 39 56 +32812 16 39 56 +FUNC 32828 12 0 PageAllocatorTest_Setup_Test::~PageAllocatorTest_Setup_Test +32828 2 39 56 +3282a 6 39 56 +32830 6 39 56 +32836 4 39 56 +FUNC 3283c 20 0 testing::internal::TestFactoryImpl::CreateTest +3283c 2 486 85 +3283e 8 486 85 +32846 6 91 56 +3284c 2 486 85 +3284e 6 91 56 +32854 8 486 85 +FUNC 3285c 20 0 testing::internal::TestFactoryImpl::CreateTest +3285c 2 486 85 +3285e 8 486 85 +32866 6 76 56 +3286c 2 486 85 +3286e 6 76 56 +32874 8 486 85 +FUNC 3287c 20 0 testing::internal::TestFactoryImpl::CreateTest +3287c 2 486 85 +3287e 8 486 85 +32886 6 69 56 +3288c 2 486 85 +3288e 6 69 56 +32894 8 486 85 +FUNC 3289c 20 0 testing::internal::TestFactoryImpl::CreateTest +3289c 2 486 85 +3289e 8 486 85 +328a6 6 53 56 +328ac 2 486 85 +328ae 6 53 56 +328b4 8 486 85 +FUNC 328bc 20 0 testing::internal::TestFactoryImpl::CreateTest +328bc 2 486 85 +328be 8 486 85 +328c6 6 43 56 +328cc 2 486 85 +328ce 6 43 56 +328d4 8 486 85 +FUNC 328dc 20 0 testing::internal::TestFactoryImpl::CreateTest +328dc 2 486 85 +328de 8 486 85 +328e6 6 39 56 +328ec 2 486 85 +328ee 6 39 56 +328f4 8 486 85 +FUNC 328fc a2 0 google_breakpad::PageAllocator::Alloc +328fc 4 74 54 +32900 2 74 54 +32902 2 75 54 +32904 6 76 54 +3290a 6 78 54 +32910 8 78 54 +32918 2 79 54 +3291a 2 80 54 +3291c 2 81 54 +3291e 4 82 54 +32922 2 80 54 +32924 2 82 54 +32926 2 83 54 +32928 6 86 54 +3292e 10 90 54 +3293e 2 3454 97 +32940 4 122 54 +32944 1c 3454 97 +32960 4 3454 97 +32964 6 3454 97 +3296a 4 124 54 +3296e 2 134 54 +32970 4 135 54 +32974 2 96 54 +32976 2 136 54 +32978 10 96 54 +32988 2 97 54 +3298a 2 98 54 +3298c 8 98 54 +32994 2 98 54 +32996 4 100 54 +3299a 4 101 54 +FUNC 3299e 30 0 google_breakpad::PageAllocator::FreeAll +3299e 2 141 54 +329a0 2 141 54 +329a2 2 144 54 +329a4 2 144 54 +329a6 4 146 54 +329aa 2 145 54 +329ac 14 3074 97 +329c0 4 3074 97 +329c4 4 3074 97 +329c8 4 141 54 +329cc 2 148 54 +FUNC 329d0 24 0 PageAllocatorTest_Setup_Test::TestBody +329d0 4 39 56 +329d4 2 71 54 +329d6 4 176 102 +329da c 67 54 +329e6 4 71 54 +329ea a 41 56 +FUNC 329f4 e8 0 PageAllocatorTest_SmallObjects_Test::TestBody +329f4 e 43 56 +32a02 4 43 56 +32a06 2 46 56 +32a08 4 176 102 +32a0c 8 67 54 +32a14 2 1139 87 +32a16 6 67 54 +32a1c e 47 56 +32a2a 8 48 56 +32a32 4 277 82 +32a36 2 1139 87 +32a38 2 48 56 +32a3a 18 48 56 +32a52 8 48 56 +32a5a 4 48 56 +32a5e c 48 56 +32a6a 6 48 56 +32a70 8 48 56 +32a78 6 85 79 +32a7e 6 48 56 +32a84 6 156 137 +32a8a e 256 82 +32a98 6 49 56 +32a9e 2 46 56 +32aa0 4 49 56 +32aa4 6 46 56 +32aaa 6 71 54 +32ab0 2c 51 56 +FUNC 32adc 13c 0 PageAllocatorTest_LargeObject_Test::TestBody +32adc 8 53 56 +32ae4 6 53 56 +32aea 2 67 54 +32aec 4 53 56 +32af0 4 56 56 +32af4 4 176 102 +32af8 2 67 54 +32afa 6 56 56 +32b00 8 67 54 +32b08 4 56 56 +32b0c 6 57 56 +32b12 2 1139 87 +32b14 4 277 82 +32b18 4 1139 87 +32b1c 2 57 56 +32b1e 18 57 56 +32b36 12 57 56 +32b48 6 256 82 +32b4e 2 58 56 +32b50 8 59 56 +32b58 8 60 56 +32b60 4 277 82 +32b64 2 1139 87 +32b66 2 60 56 +32b68 18 60 56 +32b80 10 60 56 +32b90 4 60 56 +32b94 4 60 56 +32b98 6 60 56 +32b9e 8 60 56 +32ba6 6 85 79 +32bac 6 60 56 +32bb2 6 156 137 +32bb8 e 256 82 +32bc6 6 61 56 +32bcc 2 58 56 +32bce 4 61 56 +32bd2 4 58 56 +32bd6 6 71 54 +32bdc 3c 63 56 +FUNC 32c18 72 0 std::priv::_Impl_vector >::push_back +32c18 4 376 144 +32c1c 4 380 144 +32c20 2 376 144 +32c22 2 380 144 +32c24 2 376 144 +32c26 4 380 144 +32c2a 2 126 108 +32c2c a 382 144 +32c36 6 192 144 +32c3c 8 175 144 +32c44 6 176 144 +32c4a 2 176 144 +32c4c c 177 144 +32c58 a 172 54 +32c62 2 112 143 +32c64 2 172 54 +32c66 4 224 105 +32c6a 6 224 105 +32c70 2 224 105 +32c72 4 481 105 +32c76 4 118 143 +32c7a 4 481 105 +32c7e 2 667 144 +32c80 4 666 144 +32c84 6 668 144 +FUNC 32c8c 2c 0 testing::internal::DefaultPrintTo +32c8c 2 307 80 +32c8e 2 307 80 +32c90 4 310 80 +32c94 4 334 80 +32c98 a 333 127 +32ca2 6 318 80 +32ca8 4 291 126 +32cac 4 334 80 +32cb0 8 291 126 +FUNC 32cb8 ac 0 WastefulVectorTest_Setup_Test::TestBody +32cb8 4 69 56 +32cbc 4 176 102 +32cc0 2 67 54 +32cc2 2 69 56 +32cc4 2 67 54 +32cc6 6 172 54 +32ccc 8 67 54 +32cd4 4 172 54 +32cd8 2 277 82 +32cda 4 256 82 +32cde 4 277 82 +32ce2 2 1139 87 +32ce4 4 256 82 +32ce8 4 1512 82 +32cec 4 73 56 +32cf0 12 1512 82 +32d02 6 73 56 +32d08 2 1144 87 +32d0a 6 298 82 +32d10 4 298 82 +32d14 10 73 56 +32d24 6 73 56 +32d2a 8 73 56 +32d32 6 85 79 +32d38 6 73 56 +32d3e 6 256 82 +32d44 6 71 54 +32d4a 1a 74 56 +FUNC 32d64 5c 0 std::priv::_Impl_vector >::reserve +32d64 4 62 143 +32d68 4 199 144 +32d6c 2 62 143 +32d6e 2 199 144 +32d70 6 63 143 +32d76 6 64 143 +32d7c 8 41 143 +32d84 a 192 144 +32d8e 4 172 54 +32d92 2 70 143 +32d94 6 172 54 +32d9a c 120 142 +32da6 6 172 54 +32dac 6 76 143 +32db2 2 666 144 +32db4 2 667 144 +32db6 a 668 144 +FUNC 32dc0 32c 0 WastefulVectorTest_Simple_Test::TestBody +32dc0 8 76 56 +32dc8 6 76 56 +32dce 2 67 54 +32dd0 4 76 56 +32dd4 4 153 148 +32dd8 4 176 102 +32ddc 2 67 54 +32dde 4 163 54 +32de2 4 153 148 +32de6 8 67 54 +32dee 4 67 144 +32df2 4 163 54 +32df6 2 481 106 +32df8 4 153 148 +32dfc 2 1512 82 +32dfe 2 80 56 +32e00 6 1512 82 +32e06 2 80 56 +32e08 4 1512 82 +32e0c e 1471 82 +32e1a c 80 56 +32e26 8 173 148 +32e2e 2 207 144 +32e30 2 1512 82 +32e32 2 207 144 +32e34 c 1512 82 +32e40 6 82 56 +32e46 2 1144 87 +32e48 6 298 82 +32e4e 4 298 82 +32e52 10 82 56 +32e62 6 256 82 +32e68 2 207 144 +32e6a 4 202 144 +32e6e 2 207 144 +32e70 4 202 144 +32e74 4 1481 82 +32e78 8 1482 82 +32e80 c 884 80 +32e8c 6 380 80 +32e92 2 75 132 +32e94 6 380 80 +32e9a c 75 132 +32ea6 6 886 80 +32eac 8 884 80 +32eb4 4 380 80 +32eb8 4 75 132 +32ebc 4 380 80 +32ec0 8 75 132 +32ec8 6 886 80 +32ece 14 1471 82 +32ee2 c 156 137 +32eee 6 83 56 +32ef4 2 1144 87 +32ef6 6 298 82 +32efc 4 298 82 +32f00 e 83 56 +32f0e 2 83 56 +32f10 4 83 56 +32f14 6 83 56 +32f1a 8 83 56 +32f22 6 85 79 +32f28 6 83 56 +32f2e e 256 82 +32f3c 8 80 56 +32f44 4 85 56 +32f48 4 1139 87 +32f4c 6 85 56 +32f52 4 1139 87 +32f56 6 277 82 +32f5c 2 85 56 +32f5e 18 85 56 +32f76 4 85 56 +32f7a 2 85 56 +32f7c e 85 56 +32f8a 6 85 56 +32f90 8 85 56 +32f98 6 85 79 +32f9e 6 85 56 +32fa4 8 156 137 +32fac 6 256 82 +32fb2 4 192 144 +32fb6 4 86 56 +32fba 4 192 144 +32fbe 6 86 56 +32fc4 4 1512 82 +32fc8 4 86 56 +32fcc 10 1512 82 +32fdc 6 86 56 +32fe2 2 1144 87 +32fe4 6 298 82 +32fea 4 298 82 +32fee e 86 56 +32ffc 6 256 82 +33002 4 1512 82 +33006 4 87 56 +3300a 8 1512 82 +33012 2 87 56 +33014 6 256 82 +3301a 6 87 56 +33020 a 87 56 +3302a 12 1512 82 +3303c 8 88 56 +33044 2 1144 87 +33046 4 298 82 +3304a 10 88 56 +3305a 6 88 56 +33060 8 88 56 +33068 6 85 79 +3306e 4 88 56 +33072 6 298 82 +33078 6 71 54 +3307e 6e 89 56 +FUNC 330ec fc 0 WastefulVectorTest_UsesPageAllocator_Test::TestBody +330ec 8 91 56 +330f4 6 91 56 +330fa 2 153 148 +330fc 4 91 56 +33100 2 153 148 +33102 4 176 102 +33106 2 67 54 +33108 2 153 148 +3310a 4 67 54 +3310e 2 163 54 +33110 6 67 54 +33116 4 67 144 +3311a 2 481 106 +3311c 2 163 54 +3311e 4 153 148 +33122 a 95 56 +3312c a 173 148 +33136 2 106 54 +33138 2 108 54 +3313a 2 106 54 +3313c 4 108 54 +33140 a 108 54 +3314a 4 106 54 +3314e 2 109 54 +33150 4 1139 87 +33154 4 277 82 +33158 4 1139 87 +3315c 2 96 56 +3315e 18 96 56 +33176 a 96 56 +33180 4 96 56 +33184 a 96 56 +3318e 6 96 56 +33194 8 96 56 +3319c 6 85 79 +331a2 6 96 56 +331a8 6 156 137 +331ae 6 256 82 +331b4 6 71 54 +331ba 2e 97 56 +FUNC 331e8 18 0 google_breakpad::NonAllocatingMapTest_OutOfSpace_Test::~NonAllocatingMapTest_OutOfSpace_Test +331e8 2 282 59 +331ea 16 282 59 +FUNC 33200 12 0 google_breakpad::NonAllocatingMapTest_OutOfSpace_Test::~NonAllocatingMapTest_OutOfSpace_Test +33200 2 282 59 +33202 6 282 59 +33208 6 282 59 +3320e 4 282 59 +FUNC 33214 18 0 google_breakpad::NonAllocatingMapTest_Serialize_Test::~NonAllocatingMapTest_Serialize_Test +33214 2 253 59 +33216 16 253 59 +FUNC 3322c 12 0 google_breakpad::NonAllocatingMapTest_Serialize_Test::~NonAllocatingMapTest_Serialize_Test +3322c 2 253 59 +3322e 6 253 59 +33234 6 253 59 +3323a 4 253 59 +FUNC 33240 18 0 google_breakpad::NonAllocatingMapTest_AddRemove_Test::~NonAllocatingMapTest_AddRemove_Test +33240 2 228 59 +33242 16 228 59 +FUNC 33258 12 0 google_breakpad::NonAllocatingMapTest_AddRemove_Test::~NonAllocatingMapTest_AddRemove_Test +33258 2 228 59 +3325a 6 228 59 +33260 6 228 59 +33266 4 228 59 +FUNC 3326c 18 0 google_breakpad::NonAllocatingMapTest_Iterator_Test::~NonAllocatingMapTest_Iterator_Test +3326c 2 127 59 +3326e 16 127 59 +FUNC 33284 12 0 google_breakpad::NonAllocatingMapTest_Iterator_Test::~NonAllocatingMapTest_Iterator_Test +33284 2 127 59 +33286 6 127 59 +3328c 6 127 59 +33292 4 127 59 +FUNC 33298 18 0 google_breakpad::NonAllocatingMapTest_CopyAndAssign_Test::~NonAllocatingMapTest_CopyAndAssign_Test +33298 2 92 59 +3329a 16 92 59 +FUNC 332b0 12 0 google_breakpad::NonAllocatingMapTest_CopyAndAssign_Test::~NonAllocatingMapTest_CopyAndAssign_Test +332b0 2 92 59 +332b2 6 92 59 +332b8 6 92 59 +332be 4 92 59 +FUNC 332c4 18 0 google_breakpad::NonAllocatingMapTest_SimpleStringDictionary_Test::~NonAllocatingMapTest_SimpleStringDictionary_Test +332c4 2 63 59 +332c6 16 63 59 +FUNC 332dc 12 0 google_breakpad::NonAllocatingMapTest_SimpleStringDictionary_Test::~NonAllocatingMapTest_SimpleStringDictionary_Test +332dc 2 63 59 +332de 6 63 59 +332e4 6 63 59 +332ea 4 63 59 +FUNC 332f0 18 0 google_breakpad::NonAllocatingMapTest_Entry_Test::~NonAllocatingMapTest_Entry_Test +332f0 2 35 59 +332f2 16 35 59 +FUNC 33308 12 0 google_breakpad::NonAllocatingMapTest_Entry_Test::~NonAllocatingMapTest_Entry_Test +33308 2 35 59 +3330a 6 35 59 +33310 6 35 59 +33316 4 35 59 +FUNC 3331a 66 0 google_breakpad::NonAllocatingMap<3u, 2u, 2u>::SetKeyValue +3331a 4 161 58 +3331e 6 161 58 +33324 1a 240 58 +3333e 4 239 58 +33342 2 239 58 +33344 4 241 58 +33348 4 179 58 +3334c 8 181 58 +33354 2 180 58 +33356 2 181 58 +33358 10 184 58 +33368 2 185 58 +3336a 2 182 58 +3336c 2 185 58 +3336e a 206 58 +33378 8 207 58 +FUNC 33380 5e 0 google_breakpad::NonAllocatingMap<5u, 9u, 15u>::SetKeyValue +33380 4 161 58 +33384 a 161 58 +3338e e 240 58 +3339c 8 239 58 +333a4 6 181 58 +333aa a 184 58 +333b4 a 185 58 +333be 2 180 58 +333c0 c 180 58 +333cc a 206 58 +333d6 8 207 58 +FUNC 333e0 20 0 testing::internal::TestFactoryImpl::CreateTest +333e0 2 486 85 +333e2 8 486 85 +333ea 6 282 59 +333f0 2 486 85 +333f2 6 282 59 +333f8 8 486 85 +FUNC 33400 20 0 testing::internal::TestFactoryImpl::CreateTest +33400 2 486 85 +33402 8 486 85 +3340a 6 253 59 +33410 2 486 85 +33412 6 253 59 +33418 8 486 85 +FUNC 33420 20 0 testing::internal::TestFactoryImpl::CreateTest +33420 2 486 85 +33422 8 486 85 +3342a 6 228 59 +33430 2 486 85 +33432 6 228 59 +33438 8 486 85 +FUNC 33440 20 0 testing::internal::TestFactoryImpl::CreateTest +33440 2 486 85 +33442 8 486 85 +3344a 6 127 59 +33450 2 486 85 +33452 6 127 59 +33458 8 486 85 +FUNC 33460 20 0 testing::internal::TestFactoryImpl::CreateTest +33460 2 486 85 +33462 8 486 85 +3346a 6 92 59 +33470 2 486 85 +33472 6 92 59 +33478 8 486 85 +FUNC 33480 20 0 testing::internal::TestFactoryImpl::CreateTest +33480 2 486 85 +33482 8 486 85 +3348a 6 63 59 +33490 2 486 85 +33492 6 63 59 +33498 8 486 85 +FUNC 334a0 20 0 testing::internal::TestFactoryImpl::CreateTest +334a0 2 486 85 +334a2 8 486 85 +334aa 6 35 59 +334b0 2 486 85 +334b2 6 35 59 +334b8 8 486 85 +FUNC 334c0 16 0 google_breakpad::NonAllocatingMap<5u, 7u, 6u>::GetCount +334c0 2 133 58 +334c2 c 134 58 +334ce 4 135 58 +334d2 4 141 58 +FUNC 334d6 2a 0 google_breakpad::NonAllocatingMap<256u, 256u, 64u>::GetConstEntryForKey +334d6 2 238 58 +334d8 8 238 58 +334e0 12 240 58 +334f2 6 239 58 +334f8 6 244 58 +334fe 2 245 58 +FUNC 33500 14 0 google_breakpad::NonAllocatingMap<256u, 256u, 64u>::RemoveKey +33500 2 212 58 +33502 2 214 58 +33504 4 248 58 +33508 2 218 58 +3350a 4 219 58 +3350e 6 220 58 +FUNC 33514 6e 0 google_breakpad::NonAllocatingMap<256u, 256u, 64u>::SetKeyValue +33514 4 161 58 +33518 4 161 58 +3351c 4 162 58 +33520 4 208 58 +33524 4 163 58 +33528 2 168 58 +3352a 4 173 58 +3352e 4 248 58 +33532 8 179 58 +3353a a 181 58 +33544 8 184 58 +3354c 4 185 58 +33550 2 181 58 +33552 4 184 58 +33556 6 185 58 +3355c 2 180 58 +3355e c 180 58 +3356a e 206 58 +33578 a 207 58 +FUNC 33582 24 0 google_breakpad::NonAllocatingMap<10u, 10u, 10u>::GetConstEntryForKey +33582 2 238 58 +33584 8 238 58 +3358c e 240 58 +3359a 4 239 58 +3359e 6 244 58 +335a4 2 245 58 +FUNC 335a6 12 0 google_breakpad::NonAllocatingMap<10u, 10u, 10u>::RemoveKey +335a6 2 212 58 +335a8 2 214 58 +335aa 4 248 58 +335ae 2 218 58 +335b0 4 219 58 +335b4 4 220 58 +FUNC 335b8 6a 0 google_breakpad::NonAllocatingMap<10u, 10u, 10u>::SetKeyValue +335b8 4 161 58 +335bc 4 161 58 +335c0 4 162 58 +335c4 4 208 58 +335c8 4 163 58 +335cc 2 168 58 +335ce 4 173 58 +335d2 4 248 58 +335d6 8 179 58 +335de a 181 58 +335e8 6 184 58 +335ee 2 181 58 +335f0 4 184 58 +335f4 c 185 58 +33600 2 180 58 +33602 c 180 58 +3360e c 206 58 +3361a 8 207 58 +FUNC 33622 12 0 google_breakpad::NonAllocatingMap<10u, 10u, 10u>::GetValueForKey +33622 2 145 58 +33624 2 147 58 +33626 4 150 58 +3362a 2 151 58 +3362c 4 154 58 +33630 2 148 58 +33632 2 155 58 +FUNC 33634 24 0 google_breakpad::NonAllocatingMap<5u, 7u, 6u>::GetConstEntryForKey +33634 2 238 58 +33636 8 238 58 +3363e e 240 58 +3364c 4 239 58 +33650 6 244 58 +33656 2 245 58 +FUNC 33658 12 0 google_breakpad::NonAllocatingMap<5u, 7u, 6u>::RemoveKey +33658 2 212 58 +3365a 2 214 58 +3365c 4 248 58 +33660 2 218 58 +33662 4 219 58 +33666 4 220 58 +FUNC 3366a 68 0 google_breakpad::NonAllocatingMap<5u, 7u, 6u>::SetKeyValue +3366a 4 161 58 +3366e 4 161 58 +33672 4 162 58 +33676 4 208 58 +3367a 4 163 58 +3367e 2 168 58 +33680 4 173 58 +33684 4 248 58 +33688 8 179 58 +33690 a 181 58 +3369a 6 184 58 +336a0 2 181 58 +336a2 4 184 58 +336a6 c 185 58 +336b2 2 180 58 +336b4 c 180 58 +336c0 a 206 58 +336ca 8 207 58 +FUNC 336d2 24 0 google_breakpad::NonAllocatingMap<4u, 5u, 7u>::GetConstEntryForKey +336d2 2 238 58 +336d4 8 238 58 +336dc e 240 58 +336ea 4 239 58 +336ee 6 244 58 +336f4 2 245 58 +FUNC 336f6 50 0 google_breakpad::NonAllocatingMap<4u, 5u, 7u>::SetKeyValue +336f6 4 161 58 +336fa 6 161 58 +33700 4 248 58 +33704 8 179 58 +3370c 4 181 58 +33710 4 185 58 +33714 6 184 58 +3371a 2 185 58 +3371c 2 181 58 +3371e 4 184 58 +33722 4 185 58 +33726 2 180 58 +33728 c 180 58 +33734 a 206 58 +3373e 8 207 58 +FUNC 33748 49c 0 google_breakpad::NonAllocatingMapTest_Entry_Test::TestBody +33748 10 35 59 +33758 4 35 59 +3375c 10 104 58 +3376c c 104 58 +33778 2 89 58 +3377a 8 90 58 +33782 4 88 58 +33786 2 94 58 +33788 4 40 59 +3378c 2 1139 87 +3378e 2 40 59 +33790 4 277 82 +33794 2 1139 87 +33796 2 40 59 +33798 18 40 59 +337b0 a 40 59 +337ba 2 40 59 +337bc a 40 59 +337c6 6 40 59 +337cc 8 40 59 +337d4 6 85 79 +337da 6 40 59 +337e0 6 156 137 +337e6 18 256 82 +337fe 2 89 58 +33800 8 90 58 +33808 6 88 58 +3380e 2 90 58 +33810 6 277 82 +33816 2 1139 87 +33818 4 277 82 +3381c 4 1139 87 +33820 2 45 59 +33822 18 45 59 +3383a 8 45 59 +33842 2 45 59 +33844 c 45 59 +33850 6 45 59 +33856 8 45 59 +3385e 6 85 79 +33864 6 45 59 +3386a 8 156 137 +33872 6 256 82 +33878 1c 46 59 +33894 6 302 82 +3389a a 46 59 +338a4 4 46 59 +338a8 8 46 59 +338b0 6 46 59 +338b6 8 46 59 +338be 6 85 79 +338c4 6 46 59 +338ca 6 256 82 +338d0 20 47 59 +338f0 6 302 82 +338f6 a 47 59 +33900 4 47 59 +33904 8 47 59 +3390c 6 47 59 +33912 8 47 59 +3391a 6 85 79 +33920 6 47 59 +33926 16 256 82 +3393c 18 51 59 +33954 6 302 82 +3395a a 51 59 +33964 4 51 59 +33968 8 51 59 +33970 6 51 59 +33976 8 51 59 +3397e 6 85 79 +33984 6 51 59 +3398a 6 256 82 +33990 1c 54 59 +339ac 6 302 82 +339b2 a 54 59 +339bc 4 54 59 +339c0 8 54 59 +339c8 6 54 59 +339ce 8 54 59 +339d6 6 85 79 +339dc 6 54 59 +339e2 8 256 82 +339ea 16 240 58 +33a00 4 219 58 +33a04 8 220 58 +33a0c 4 239 58 +33a10 2 58 59 +33a12 2 1139 87 +33a14 6 58 59 +33a1a 4 277 82 +33a1e 8 1139 87 +33a26 2 58 59 +33a28 1a 58 59 +33a42 12 58 59 +33a54 6 58 59 +33a5a 8 58 59 +33a62 6 85 79 +33a68 6 58 59 +33a6e 6 156 137 +33a74 6 256 82 +33a7a 8 59 59 +33a82 4 1512 82 +33a86 4 59 59 +33a8a 10 1512 82 +33a9a 6 59 59 +33aa0 6 302 82 +33aa6 10 59 59 +33ab6 6 59 59 +33abc 8 59 59 +33ac4 6 85 79 +33aca 6 59 59 +33ad0 6 256 82 +33ad6 8 60 59 +33ade 4 1512 82 +33ae2 4 60 59 +33ae6 10 1512 82 +33af6 6 60 59 +33afc 6 302 82 +33b02 10 60 59 +33b12 6 60 59 +33b18 8 60 59 +33b20 6 85 79 +33b26 6 60 59 +33b2c 6 256 82 +33b32 b2 61 59 +FUNC 33be4 7a0 0 google_breakpad::NonAllocatingMapTest_CopyAndAssign_Test::TestBody +33be4 14 92 59 +33bf8 4 92 59 +33bfc 12 104 58 +33c0e 4 104 58 +33c12 e 94 59 +33c20 4 95 59 +33c24 4 94 59 +33c28 10 95 59 +33c38 12 96 59 +33c4a 8 97 59 +33c52 8 98 59 +33c5a e 134 58 +33c68 4 135 58 +33c6c 4 98 59 +33c70 18 1512 82 +33c88 6 98 59 +33c8e 6 302 82 +33c94 12 98 59 +33ca6 6 98 59 +33cac 8 98 59 +33cb4 6 85 79 +33cba 6 98 59 +33cc0 a 256 82 +33cca a 117 58 +33cd4 8 102 59 +33cdc c 134 58 +33ce8 4 135 58 +33cec 2 102 59 +33cee 1a 1512 82 +33d08 6 102 59 +33d0e 6 302 82 +33d14 12 102 59 +33d26 6 102 59 +33d2c 8 102 59 +33d34 6 85 79 +33d3a 6 102 59 +33d40 6 256 82 +33d46 c 103 59 +33d52 1a 103 59 +33d6c 6 103 59 +33d72 6 302 82 +33d78 12 103 59 +33d8a 6 103 59 +33d90 8 103 59 +33d98 6 85 79 +33d9e 6 103 59 +33da4 6 256 82 +33daa c 104 59 +33db6 1a 104 59 +33dd0 6 104 59 +33dd6 6 302 82 +33ddc 12 104 59 +33dee 6 104 59 +33df4 8 104 59 +33dfc 6 85 79 +33e02 6 104 59 +33e08 c 105 59 +33e14 6 256 82 +33e1a a 105 59 +33e24 8 106 59 +33e2c 16 106 59 +33e42 6 106 59 +33e48 6 302 82 +33e4e 14 106 59 +33e62 6 106 59 +33e68 8 106 59 +33e70 6 85 79 +33e76 6 106 59 +33e7c 6 256 82 +33e82 10 107 59 +33e92 2 1139 87 +33e94 2 107 59 +33e96 4 277 82 +33e9a 2 1139 87 +33e9c 2 107 59 +33e9e 20 107 59 +33ebe 16 107 59 +33ed4 6 107 59 +33eda 8 107 59 +33ee2 6 85 79 +33ee8 6 107 59 +33eee 6 156 137 +33ef4 8 256 82 +33efc 10 104 58 +33f0c 4 104 58 +33f10 a 117 58 +33f1a 8 112 59 +33f22 c 134 58 +33f2e 4 135 58 +33f32 8 112 59 +33f3a 14 1512 82 +33f4e 4 112 59 +33f52 6 302 82 +33f58 10 112 59 +33f68 6 112 59 +33f6e 8 112 59 +33f76 6 85 79 +33f7c 6 112 59 +33f82 a 256 82 +33f8c a 113 59 +33f96 6 113 59 +33f9c 4 256 82 +33fa0 e 113 59 +33fae 6 113 59 +33fb4 6 302 82 +33fba 10 113 59 +33fca 6 113 59 +33fd0 8 113 59 +33fd8 6 85 79 +33fde 6 113 59 +33fe4 6 256 82 +33fea a 114 59 +33ff4 14 114 59 +34008 4 114 59 +3400c 6 302 82 +34012 10 114 59 +34022 6 114 59 +34028 8 114 59 +34030 6 85 79 +34036 6 114 59 +3403c 2 256 82 +3403e c 115 59 +3404a 4 256 82 +3404e a 115 59 +34058 8 116 59 +34060 12 116 59 +34072 4 116 59 +34076 6 302 82 +3407c 8 116 59 +34084 4 116 59 +34088 8 116 59 +34090 6 116 59 +34096 8 116 59 +3409e 6 85 79 +340a4 6 116 59 +340aa a 256 82 +340b4 e 117 59 +340c2 2 1139 87 +340c4 2 117 59 +340c6 2 277 82 +340c8 2 1139 87 +340ca 2 117 59 +340cc 1a 117 59 +340e6 8 117 59 +340ee 4 117 59 +340f2 a 117 59 +340fc 6 117 59 +34102 8 117 59 +3410a 6 85 79 +34110 6 117 59 +34116 6 156 137 +3411c 4 119 59 +34120 2 256 82 +34122 2 119 59 +34124 4 256 82 +34128 8 119 59 +34130 c 120 59 +3413c 2 1139 87 +3413e 2 120 59 +34140 2 277 82 +34142 2 1139 87 +34144 2 120 59 +34146 1a 120 59 +34160 8 120 59 +34168 4 120 59 +3416c a 120 59 +34176 6 120 59 +3417c 8 120 59 +34184 6 85 79 +3418a 6 120 59 +34190 6 156 137 +34196 6 256 82 +3419c a 121 59 +341a6 14 121 59 +341ba 4 121 59 +341be 6 302 82 +341c4 8 121 59 +341cc 2 121 59 +341ce 8 121 59 +341d6 6 121 59 +341dc 8 121 59 +341e4 6 85 79 +341ea 6 121 59 +341f0 6 256 82 +341f6 a 122 59 +34200 14 122 59 +34214 4 122 59 +34218 6 302 82 +3421e 8 122 59 +34226 2 122 59 +34228 8 122 59 +34230 6 122 59 +34236 8 122 59 +3423e 6 85 79 +34244 6 122 59 +3424a 6 256 82 +34250 134 123 59 +FUNC 34384 544 0 google_breakpad::NonAllocatingMapTest_AddRemove_Test::TestBody +34384 16 228 59 +3439a 2 228 59 +3439c 10 104 58 +343ac 4 104 58 +343b0 14 230 59 +343c4 12 231 59 +343d6 12 232 59 +343e8 a 234 59 +343f2 e 1512 82 +34400 2 234 59 +34402 e 1512 82 +34410 6 234 59 +34416 6 302 82 +3441c 10 234 59 +3442c 6 234 59 +34432 8 234 59 +3443a 6 85 79 +34440 6 234 59 +34446 a 256 82 +34450 a 150 58 +3445a 2 151 58 +3445c 2 154 58 +3445e 14 235 59 +34472 6 235 59 +34478 6 302 82 +3447e 10 235 59 +3448e 6 235 59 +34494 8 235 59 +3449c 6 85 79 +344a2 6 235 59 +344a8 6 256 82 +344ae a 150 58 +344b8 2 151 58 +344ba 2 154 58 +344bc 14 236 59 +344d0 6 236 59 +344d6 6 302 82 +344dc 10 236 59 +344ec 6 236 59 +344f2 8 236 59 +344fa 6 85 79 +34500 6 236 59 +34506 6 256 82 +3450c a 150 58 +34516 2 151 58 +34518 2 154 58 +3451a 14 237 59 +3452e 6 237 59 +34534 6 302 82 +3453a 10 237 59 +3454a 6 237 59 +34550 8 237 59 +34558 6 85 79 +3455e 6 237 59 +34564 6 256 82 +3456a a 239 59 +34574 a 241 59 +3457e 4 1512 82 +34582 2 241 59 +34584 e 1512 82 +34592 6 241 59 +34598 6 302 82 +3459e 10 241 59 +345ae 6 241 59 +345b4 8 241 59 +345bc 6 85 79 +345c2 6 241 59 +345c8 6 256 82 +345ce a 150 58 +345d8 2 151 58 +345da 2 154 58 +345dc 4 242 59 +345e0 2 1139 87 +345e2 2 242 59 +345e4 4 277 82 +345e8 2 1139 87 +345ea 2 242 59 +345ec 1a 242 59 +34606 12 242 59 +34618 6 242 59 +3461e 8 242 59 +34626 6 85 79 +3462c 6 242 59 +34632 6 156 137 +34638 6 256 82 +3463e e 244 59 +3464c a 245 59 +34656 4 1512 82 +3465a 2 245 59 +3465c e 1512 82 +3466a 6 245 59 +34670 6 302 82 +34676 10 245 59 +34686 6 245 59 +3468c 8 245 59 +34694 6 85 79 +3469a 6 245 59 +346a0 6 256 82 +346a6 a 150 58 +346b0 2 151 58 +346b2 2 154 58 +346b4 14 246 59 +346c8 6 246 59 +346ce 6 302 82 +346d4 10 246 59 +346e4 6 246 59 +346ea 8 246 59 +346f2 6 85 79 +346f8 6 246 59 +346fe 4 249 59 +34702 6 256 82 +34708 a 248 59 +34712 a 249 59 +3471c 4 1512 82 +34720 2 249 59 +34722 e 1512 82 +34730 6 249 59 +34736 6 302 82 +3473c 10 249 59 +3474c 6 249 59 +34752 8 249 59 +3475a 6 85 79 +34760 6 249 59 +34766 6 256 82 +3476c a 150 58 +34776 2 151 58 +34778 4 154 58 +3477c 2 152 58 +3477e 4 250 59 +34782 2 1139 87 +34784 2 250 59 +34786 4 277 82 +3478a 2 1139 87 +3478c 2 250 59 +3478e 18 250 59 +347a6 12 250 59 +347b8 6 250 59 +347be 8 250 59 +347c6 6 85 79 +347cc 6 250 59 +347d2 6 156 137 +347d8 6 256 82 +347de ea 251 59 +FUNC 348c8 498 0 google_breakpad::NonAllocatingMapTest_Serialize_Test::TestBody +348c8 16 253 59 +348de 2 253 59 +348e0 10 104 58 +348f0 32 104 58 +34922 8 150 58 +3492a 2 151 58 +3492c 2 154 58 +3492e 16 260 59 +34944 6 260 59 +3494a 6 302 82 +34950 c 260 59 +3495c 2 260 59 +3495e 8 260 59 +34966 6 260 59 +3496c 8 260 59 +34974 6 85 79 +3497a 6 260 59 +34980 8 256 82 +34988 a 150 58 +34992 2 151 58 +34994 2 154 58 +34996 14 261 59 +349aa 6 261 59 +349b0 6 302 82 +349b6 c 261 59 +349c2 4 261 59 +349c6 8 261 59 +349ce 6 261 59 +349d4 8 261 59 +349dc 6 85 79 +349e2 6 261 59 +349e8 6 256 82 +349ee a 150 58 +349f8 2 151 58 +349fa 4 154 58 +349fe 2 152 58 +34a00 14 262 59 +34a14 6 262 59 +34a1a 6 302 82 +34a20 c 262 59 +34a2c 4 262 59 +34a30 8 262 59 +34a38 6 262 59 +34a3e 8 262 59 +34a46 6 85 79 +34a4c 6 262 59 +34a52 6 256 82 +34a58 6 268 59 +34a5e 6 277 82 +34a64 2 1139 87 +34a66 6 277 82 +34a6c 2 1139 87 +34a6e 2 269 59 +34a70 18 269 59 +34a88 a 269 59 +34a92 2 269 59 +34a94 c 269 59 +34aa0 6 269 59 +34aa6 8 269 59 +34aae 6 85 79 +34ab4 6 269 59 +34aba 6 156 137 +34ac0 6 256 82 +34ac6 2 270 59 +34ac8 4 256 82 +34acc 1a 270 59 +34ae6 1e 127 58 +34b04 6 273 59 +34b0a 4 275 59 +34b0e c 134 58 +34b1a 4 135 58 +34b1e a 1512 82 +34b28 2 275 59 +34b2a e 1512 82 +34b38 6 275 59 +34b3e 6 302 82 +34b44 12 275 59 +34b56 6 275 59 +34b5c 8 275 59 +34b64 6 85 79 +34b6a 6 275 59 +34b70 a 256 82 +34b7a a 150 58 +34b84 2 151 58 +34b86 2 154 58 +34b88 14 276 59 +34b9c 6 276 59 +34ba2 6 302 82 +34ba8 12 276 59 +34bba 6 276 59 +34bc0 8 276 59 +34bc8 6 85 79 +34bce 6 276 59 +34bd4 6 256 82 +34bda a 150 58 +34be4 2 151 58 +34be6 2 154 58 +34be8 14 277 59 +34bfc 6 277 59 +34c02 6 302 82 +34c08 12 277 59 +34c1a 6 277 59 +34c20 8 277 59 +34c28 6 85 79 +34c2e 6 277 59 +34c34 6 256 82 +34c3a a 150 58 +34c44 2 151 58 +34c46 4 154 58 +34c4a 2 152 58 +34c4c 14 278 59 +34c60 6 278 59 +34c66 6 302 82 +34c6c 12 278 59 +34c7e 6 278 59 +34c84 8 278 59 +34c8c 6 85 79 +34c92 6 278 59 +34c98 6 256 82 +34c9e c2 279 59 +FUNC 34d60 1a4 0 google_breakpad::NonAllocatingMapTest_OutOfSpace_Test::TestBody +34d60 6 282 59 +34d66 2 104 58 +34d68 6 282 59 +34d6e 2 282 59 +34d70 8 104 58 +34d78 2 282 59 +34d7a 38 104 58 +34db2 4 287 59 +34db6 10 136 58 +34dc6 2 137 58 +34dc8 c 1512 82 +34dd4 2 287 59 +34dd6 e 1512 82 +34de4 6 287 59 +34dea 6 302 82 +34df0 12 287 59 +34e02 6 287 59 +34e08 8 287 59 +34e10 6 85 79 +34e16 6 287 59 +34e1c 2 240 58 +34e1e 6 256 82 +34e24 2 240 58 +34e26 4 256 82 +34e2a 18 240 58 +34e42 4 239 58 +34e46 2 239 58 +34e48 a 154 58 +34e52 2 152 58 +34e54 4 288 59 +34e58 2 1139 87 +34e5a 2 288 59 +34e5c 4 277 82 +34e60 2 1139 87 +34e62 2 288 59 +34e64 18 288 59 +34e7c 14 288 59 +34e90 6 288 59 +34e96 8 288 59 +34e9e 6 85 79 +34ea4 6 288 59 +34eaa 6 156 137 +34eb0 6 256 82 +34eb6 4e 289 59 +FUNC 34f04 104 0 testing::internal::CmpHelperNE +34f04 10 1615 82 +34f14 e 1615 82 +34f22 4 1615 82 +34f26 4 1615 82 +34f2a 10 1583 82 +34f3a a 1583 82 +34f44 6 1583 82 +34f4a 2 1583 82 +34f4c 2 1408 82 +34f4e 6 1583 82 +34f54 6 1583 82 +34f5a 8 1583 82 +34f62 6 1583 82 +34f68 a 1584 82 +34f72 e 1408 82 +34f80 a 1584 82 +34f8a 6 306 82 +34f90 c 333 127 +34f9c 8 306 82 +34fa4 6 85 79 +34faa c 1408 82 +34fb6 a 1585 82 +34fc0 6 1585 82 +34fc6 c 156 137 +34fd2 6 256 82 +34fd8 30 1615 82 +FUNC 35008 478 0 google_breakpad::NonAllocatingMapTest_SimpleStringDictionary_Test::TestBody +35008 16 63 59 +3501e a 63 59 +35028 2 104 58 +3502a 2 63 59 +3502c 16 104 58 +35042 6 104 58 +35048 10 68 59 +35058 e 69 59 +35066 e 70 59 +35074 8 150 58 +3507c 2 151 58 +3507e 4 154 58 +35082 8 72 59 +3508a 4 72 59 +3508e 4 72 59 +35092 4 72 59 +35096 e 72 59 +350a4 6 72 59 +350aa 6 302 82 +350b0 14 72 59 +350c4 6 72 59 +350ca 8 72 59 +350d2 6 85 79 +350d8 6 72 59 +350de 8 256 82 +350e6 a 150 58 +350f0 2 151 58 +350f2 4 154 58 +350f6 8 73 59 +350fe 4 73 59 +35102 e 73 59 +35110 6 73 59 +35116 6 302 82 +3511c 14 73 59 +35130 6 73 59 +35136 8 73 59 +3513e 6 85 79 +35144 6 73 59 +3514a 8 256 82 +35152 a 150 58 +3515c 2 151 58 +3515e 4 154 58 +35162 8 74 59 +3516a 4 74 59 +3516e e 74 59 +3517c 6 74 59 +35182 6 302 82 +35188 14 74 59 +3519c 6 74 59 +351a2 8 74 59 +351aa 6 85 79 +351b0 6 74 59 +351b6 a 256 82 +351c0 10 134 58 +351d0 6 135 58 +351d6 6 75 59 +351dc 4 1512 82 +351e0 8 75 59 +351e8 e 1512 82 +351f6 6 75 59 +351fc 6 302 82 +35202 10 75 59 +35212 6 75 59 +35218 8 75 59 +35220 6 85 79 +35226 6 75 59 +3522c 8 256 82 +35234 a 150 58 +3523e 2 151 58 +35240 4 154 58 +35244 4 77 59 +35248 2 1139 87 +3524a 2 77 59 +3524c 4 277 82 +35250 2 1139 87 +35252 2 77 59 +35254 1e 77 59 +35272 18 77 59 +3528a 6 77 59 +35290 8 77 59 +35298 6 85 79 +3529e 6 77 59 +352a4 6 156 137 +352aa 4 80 59 +352ae 4 256 82 +352b2 2 80 59 +352b4 4 256 82 +352b8 8 80 59 +352c0 8 150 58 +352c8 2 151 58 +352ca 4 154 58 +352ce 4 83 59 +352d2 2 1139 87 +352d4 2 83 59 +352d6 4 277 82 +352da 2 1139 87 +352dc 2 83 59 +352de 1e 83 59 +352fc 18 83 59 +35314 6 83 59 +3531a 8 83 59 +35322 6 85 79 +35328 6 83 59 +3532e 6 156 137 +35334 4 163 58 +35338 4 256 82 +3533c 2 163 58 +3533e 4 256 82 +35342 8 163 58 +3534a 8 150 58 +35352 2 151 58 +35354 4 154 58 +35358 4 89 59 +3535c 2 1139 87 +3535e 2 89 59 +35360 4 277 82 +35364 2 1139 87 +35366 2 89 59 +35368 1e 89 59 +35386 18 89 59 +3539e 6 89 59 +353a4 8 89 59 +353ac 6 85 79 +353b2 6 89 59 +353b8 6 156 137 +353be 8 256 82 +353c6 ba 90 59 +FUNC 35480 4a8 0 google_breakpad::NonAllocatingMapTest_Iterator_Test::TestBody +35480 c 127 59 +3548c 6 127 59 +35492 4 128 59 +35496 2 127 59 +35498 e 128 59 +354a6 10 104 58 +354b6 4 104 58 +354ba 2 1139 87 +354bc 4 277 82 +354c0 2 256 82 +354c2 2 1139 87 +354c4 2 256 82 +354c6 2 277 82 +354c8 4 256 82 +354cc 6 1621 82 +354d2 4 138 59 +354d6 6 302 82 +354dc a 138 59 +354e6 2 138 59 +354e8 8 138 59 +354f0 6 138 59 +354f6 8 138 59 +354fe 6 85 79 +35504 6 138 59 +3550a 4 256 82 +3550e 4 146 59 +35512 4 147 59 +35516 2 256 82 +35518 4 142 59 +3551c 4 256 82 +35520 4 146 59 +35524 4 142 59 +35528 2 146 59 +3552a 2 147 59 +3552c 4 146 59 +35530 2 147 59 +35532 6 146 59 +35538 a 147 59 +35542 2 145 59 +35544 a 148 59 +3554e 4 145 59 +35552 a 153 59 +3555c 4 150 59 +35560 4 153 59 +35564 e 154 59 +35572 e 155 59 +35580 a 158 59 +3558a a 159 59 +35594 a 160 59 +3559e a 161 59 +355a8 a 162 59 +355b2 a 166 59 +355bc a 167 59 +355c6 2 165 59 +355c8 a 168 59 +355d2 4 165 59 +355d6 2 82 58 +355d8 4 170 59 +355dc 2 181 59 +355de 6 170 59 +355e4 2 181 59 +355e6 2 82 58 +355e8 4 181 59 +355ec 4 82 58 +355f0 4 181 59 +355f4 6 183 59 +355fa 6 191 59 +35600 6 195 59 +35606 c 1512 82 +35612 6 198 59 +35618 e 206 59 +35626 6 88 58 +3562c a 89 58 +35636 2 90 58 +35638 2 89 58 +3563a 6 90 58 +35640 4 191 59 +35644 6 187 59 +3564a 2 191 59 +3564c 4 187 59 +35650 8 191 59 +35658 a 195 59 +35662 4 1512 82 +35666 4 195 59 +3566a e 1512 82 +35678 6 198 59 +3567e 6 302 82 +35684 8 198 59 +3568c 4 198 59 +35690 8 198 59 +35698 6 198 59 +3569e 8 198 59 +356a6 6 85 79 +356ac 6 198 59 +356b2 6 256 82 +356b8 2 203 59 +356ba 2 1139 87 +356bc 8 203 59 +356c4 2 205 59 +356c6 4 277 82 +356ca 8 205 59 +356d2 4 1139 87 +356d6 2 206 59 +356d8 18 206 59 +356f0 e 206 59 +356fe 4 206 59 +35702 a 206 59 +3570c 6 206 59 +35712 8 206 59 +3571a 6 85 79 +35720 6 206 59 +35726 6 156 137 +3572c 6 256 82 +35732 2 1139 87 +35734 4 256 82 +35738 4 277 82 +3573c 4 1139 87 +35740 2 207 59 +35742 1a 207 59 +3575c e 207 59 +3576a 4 207 59 +3576e a 207 59 +35778 6 207 59 +3577e 8 207 59 +35786 6 85 79 +3578c 6 207 59 +35792 6 156 137 +35798 6 256 82 +3579e 6 209 59 +357a4 6 209 59 +357aa e 210 59 +357b8 2 88 58 +357ba 2 219 59 +357bc 8 1512 82 +357c4 2 219 59 +357c6 4 1512 82 +357ca 2 219 59 +357cc 8 218 59 +357d4 4 218 59 +357d8 4 218 59 +357dc 6 219 59 +357e2 2 1512 82 +357e4 4 219 59 +357e8 10 1512 82 +357f8 4 219 59 +357fc 6 302 82 +35802 10 219 59 +35812 6 219 59 +35818 8 219 59 +35820 6 85 79 +35826 6 219 59 +3582c 6 256 82 +35832 2 216 59 +35834 4 216 59 +35838 16 1512 82 +3584e 4 224 59 +35852 6 302 82 +35858 a 224 59 +35862 2 224 59 +35864 8 224 59 +3586c 6 224 59 +35872 8 224 59 +3587a 6 85 79 +35880 6 224 59 +35886 6 256 82 +3588c 9c 225 59 +FUNC 35928 20 0 google_breakpad::test_assembler::Label::Label +35928 2 47 61 +3592a a 47 61 +35934 e 127 61 +35942 6 47 61 +FUNC 35948 20 0 google_breakpad::test_assembler::Label::Label +35948 2 48 61 +3594a c 48 61 +35956 c 130 61 +35962 6 48 61 +FUNC 35968 c 0 google_breakpad::test_assembler::Label::Label +35968 4 50 61 +3596c 6 180 62 +35972 2 52 61 +FUNC 35974 14 0 google_breakpad::test_assembler::Label::Binding::Binding +35974 2 127 61 +35976 12 127 61 +FUNC 35988 10 0 google_breakpad::test_assembler::Label::Binding::Binding +35988 2 129 61 +3598a e 130 61 +FUNC 35998 28 0 google_breakpad::test_assembler::Label::Binding::~Binding +35998 2 132 61 +3599a 2 134 61 +3599c 2 132 61 +3599e 2 134 61 +359a0 4 134 61 +359a4 6 182 62 +359aa 2 134 61 +359ac 4 135 61 +359b0 6 135 61 +359b6 6 135 61 +359bc 4 136 61 +FUNC 359c0 22 0 google_breakpad::test_assembler::Label::~Label +359c0 2 53 61 +359c2 2 54 61 +359c4 2 53 61 +359c6 6 182 62 +359cc 2 54 61 +359ce 4 54 61 +359d2 6 54 61 +359d8 6 54 61 +359de 4 55 61 +FUNC 359e2 66 0 google_breakpad::test_assembler::Label::Binding::Get +359e2 4 186 61 +359e6 2 186 61 +359e8 2 187 61 +359ea 4 186 61 +359ee 2 187 61 +359f0 4 187 61 +359f4 8 194 61 +359fc 4 195 61 +35a00 6 180 62 +35a06 2 196 61 +35a08 6 182 62 +35a0e 2 196 61 +35a10 4 196 61 +35a14 6 196 61 +35a1a 6 196 61 +35a20 c 198 61 +35a2c 2 197 61 +35a2e 4 198 61 +35a32 2 197 61 +35a34 6 200 61 +35a3a 8 201 61 +35a42 6 202 61 +FUNC 35a48 28 0 google_breakpad::test_assembler::Label::IsKnownConstant +35a48 2 104 61 +35a4a 2 104 61 +35a4c a 107 61 +35a56 4 108 61 +35a5a 2 109 61 +35a5c a 109 61 +35a66 4 108 61 +35a6a 2 110 61 +35a6c 4 111 61 +FUNC 35a70 1a 0 google_breakpad::test_assembler::Label::Value +35a70 2 98 61 +35a72 a 99 61 +35a7c 4 100 61 +35a80 a 102 61 +FUNC 35a8a 44 0 google_breakpad::test_assembler::Label::IsKnownOffsetFrom +35a8a 6 114 61 +35a90 2 117 61 +35a92 2 114 61 +35a94 8 117 61 +35a9c a 118 61 +35aa6 8 122 61 +35aae 2 123 61 +35ab0 14 123 61 +35ac4 4 122 61 +35ac8 2 124 61 +35aca 4 125 61 +FUNC 35ace 12 0 google_breakpad::test_assembler::Label::operator- +35ace 2 92 61 +35ad0 6 94 61 +35ad6 a 96 61 +FUNC 35ae0 80 0 google_breakpad::test_assembler::Label::Binding::Set +35ae0 4 138 61 +35ae4 2 139 61 +35ae6 2 138 61 +35ae8 6 138 61 +35aee 2 139 61 +35af0 4 139 61 +35af4 14 145 61 +35b08 2 147 61 +35b0a a 154 61 +35b14 8 155 61 +35b1c 6 163 61 +35b22 10 169 61 +35b32 2 171 61 +35b34 6 182 62 +35b3a 2 171 61 +35b3c 4 171 61 +35b40 6 171 61 +35b46 6 171 61 +35b4c 4 180 61 +35b50 6 180 62 +35b56 4 182 61 +35b5a 2 181 61 +35b5c 4 184 61 +FUNC 35b60 10 0 google_breakpad::test_assembler::Label::operator= +35b60 2 57 61 +35b62 2 57 61 +35b64 8 58 61 +35b6c 4 60 61 +FUNC 35b70 14 0 google_breakpad::test_assembler::Label::operator= +35b70 2 62 61 +35b72 2 62 61 +35b74 c 63 61 +35b80 4 65 61 +FUNC 35b84 1e 0 google_breakpad::test_assembler::Label::operator+ +35b84 2 67 61 +35b86 8 67 61 +35b8e 4 68 61 +35b92 c 69 61 +35b9e 4 71 61 +FUNC 35ba2 20 0 google_breakpad::test_assembler::Label::operator- +35ba2 2 73 61 +35ba4 8 73 61 +35bac 4 74 61 +35bb0 e 75 61 +35bbe 4 77 61 +FUNC 35bc2 20 0 google_breakpad::test_assembler::Section::Align +35bc2 2 324 61 +35bc4 2 324 61 +35bc6 8 400 136 +35bce 6 327 61 +35bd4 a 328 61 +35bde 4 331 61 +FUNC 35be2 44 0 google_breakpad::test_assembler::Section::LEB128 +35be2 2 303 61 +35be4 a 303 61 +35bee 10 304 61 +35bfe 4 305 61 +35c02 e 453 136 +35c10 8 307 61 +35c18 a 453 136 +35c22 4 313 61 +FUNC 35c26 3a 0 google_breakpad::test_assembler::Section::ULEB128 +35c26 2 315 61 +35c28 a 315 61 +35c32 8 316 61 +35c3a 4 317 61 +35c3e 8 453 136 +35c46 e 318 61 +35c54 8 453 136 +35c5c 4 322 61 +FUNC 35c60 5a 0 google_breakpad::test_assembler::InsertEndian, std::allocator > > > +35c60 2 208 61 +35c62 4 205 61 +35c66 6 205 61 +35c6c 4 208 61 +35c70 4 209 61 +35c74 4 178 118 +35c78 6 211 61 +35c7e 4 178 118 +35c82 2 211 61 +35c84 e 209 61 +35c92 6 216 61 +35c98 4 216 61 +35c9c a 217 61 +35ca6 8 178 118 +35cae c 216 61 +FUNC 35cba 1c 0 google_breakpad::test_assembler::Section::Append +35cba 2 221 61 +35cbc 2 221 61 +35cbe 4 223 61 +35cc2 e 223 61 +35cd0 6 225 61 +FUNC 35cd6 1a 0 google_breakpad::test_assembler::Section::L16 +35cd6 2 267 61 +35cd8 6 267 61 +35cde 2 267 61 +35ce0 2 267 61 +35ce2 8 267 61 +35cea 6 267 61 +FUNC 35cf0 1c 0 google_breakpad::test_assembler::Section::L32 +35cf0 2 268 61 +35cf2 8 268 61 +35cfa c 268 61 +35d06 6 268 61 +FUNC 35d0c 18 0 google_breakpad::test_assembler::Section::L64 +35d0c 2 269 61 +35d0e 6 269 61 +35d14 a 269 61 +35d1e 6 269 61 +FUNC 35d24 1a 0 google_breakpad::test_assembler::Section::B16 +35d24 2 270 61 +35d26 6 270 61 +35d2c 2 270 61 +35d2e 2 270 61 +35d30 8 270 61 +35d38 6 270 61 +FUNC 35d3e 1c 0 google_breakpad::test_assembler::Section::B32 +35d3e 2 271 61 +35d40 6 271 61 +35d46 2 271 61 +35d48 2 271 61 +35d4a a 271 61 +35d54 6 271 61 +FUNC 35d5a 18 0 google_breakpad::test_assembler::Section::B64 +35d5a 2 272 61 +35d5c 6 272 61 +35d62 a 272 61 +35d6c 6 272 61 +FUNC 35d72 1a 0 google_breakpad::test_assembler::Section::D16 +35d72 2 289 61 +35d74 6 289 61 +35d7a 2 289 61 +35d7c 2 289 61 +35d7e 8 289 61 +35d86 6 289 61 +FUNC 35d8c 1c 0 google_breakpad::test_assembler::Section::D32 +35d8c 2 290 61 +35d8e 6 290 61 +35d94 2 290 61 +35d96 2 290 61 +35d98 a 290 61 +35da2 6 290 61 +FUNC 35da8 18 0 google_breakpad::test_assembler::Section::D64 +35da8 2 291 61 +35daa 6 291 61 +35db0 a 291 61 +35dba 6 291 61 +FUNC 35dc0 20 0 std::priv::_Impl_vector >::clear +35dc0 6 650 144 +35dc6 2 630 144 +35dc8 2 650 144 +35dca 4 630 144 +35dce 4 449 62 +35dd2 2 191 108 +35dd4 4 449 62 +35dd8 4 191 108 +35ddc 4 615 144 +FUNC 35de0 1a 0 google_breakpad::test_assembler::Section::Clear +35de0 2 333 61 +35de2 2 422 136 +35de4 2 228 148 +35de6 2 422 136 +35de8 6 232 145 +35dee 8 424 136 +35df6 4 228 148 +FUNC 35dfc b4 0 std::priv::_String_base >::_M_swap +35dfc 10 168 137 +35e0c 2 168 137 +35e0e 2 64 137 +35e10 4 170 137 +35e14 2 171 137 +35e16 2 64 137 +35e18 a 171 137 +35e22 a 91 105 +35e2c 8 92 105 +35e34 8 93 105 +35e3c 4 174 137 +35e40 2 173 137 +35e42 2 174 137 +35e44 2 175 137 +35e46 4 174 137 +35e4a 2 175 137 +35e4c 2 174 137 +35e4e 2 175 137 +35e50 2 178 137 +35e52 4 179 137 +35e56 2 64 137 +35e58 4 185 137 +35e5c 4 189 137 +35e60 4 188 137 +35e64 4 189 137 +35e68 2 192 137 +35e6a 2 193 137 +35e6c 4 187 137 +35e70 6 193 137 +35e76 4 194 137 +35e7a 2 195 137 +35e7c 6 196 137 +35e82 2 91 105 +35e84 4 92 105 +35e88 2 93 105 +35e8a 2 91 105 +35e8c 4 92 105 +35e90 2 93 105 +35e92 2 91 105 +35e94 4 92 105 +35e98 2 93 105 +35e9a 16 208 137 +FUNC 35eb0 ec 0 google_breakpad::test_assembler::Section::GetContents +35eb0 8 338 61 +35eb8 4 341 61 +35ebc 2 338 61 +35ebe 4 344 61 +35ec2 a 192 144 +35ecc a 341 61 +35ed6 2 202 144 +35ed8 12 344 61 +35eea 14 345 61 +35efe c 350 61 +35f0a 2 208 61 +35f0c 2 350 61 +35f0e 2 208 61 +35f10 4 350 61 +35f14 4 208 61 +35f18 4 209 61 +35f1c 4 210 61 +35f20 10 211 61 +35f30 a 216 61 +35f3a 6 216 61 +35f40 a 217 61 +35f4a 2 216 61 +35f4c 4 217 61 +35f50 8 216 61 +35f58 a 341 61 +35f62 4 422 136 +35f66 4 942 136 +35f6a 2 422 136 +35f6c 6 232 145 +35f72 4 424 136 +35f76 2 942 136 +35f78 6 424 136 +35f7e 4 942 136 +35f82 8 228 148 +35f8a 2 355 61 +35f8c 10 356 61 +FUNC 35f9c 1bc 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +35f9c 6 81 143 +35fa2 6 192 144 +35fa8 4 173 144 +35fac 2 81 143 +35fae 2 81 143 +35fb0 2 192 144 +35fb2 6 173 144 +35fb8 2 81 143 +35fba 2 173 144 +35fbc 8 41 143 +35fc4 a 175 144 +35fce 6 176 144 +35fd4 6 176 144 +35fda 4 176 144 +35fde 8 347 106 +35fe6 6 348 106 +35fec 4 352 106 +35ff0 6 91 143 +35ff6 a 86 142 +36000 6 86 142 +36006 6 139 108 +3600c 20 449 62 +3602c 12 86 142 +3603e a 93 143 +36048 2 119 108 +3604a 1e 449 62 +36068 6 95 143 +3606e 8 314 142 +36076 4 249 142 +3607a 8 449 62 +36082 6 249 142 +36088 4 139 108 +3608c 20 449 62 +360ac 8 249 142 +360b4 6 98 143 +360ba e 86 142 +360c8 6 86 142 +360ce 6 139 108 +360d4 20 449 62 +360f4 14 86 142 +36108 6 65 118 +3610e 2 74 118 +36110 4 191 108 +36114 a 449 62 +3611e 4 81 118 +36122 6 662 144 +36128 2 319 106 +3612a 4 161 106 +3612e 6 135 124 +36134 4 161 106 +36138 4 104 143 +3613c 4 667 144 +36140 2 668 144 +36142 6 105 143 +36148 6 346 106 +3614e a 356 106 +FUNC 36158 42 0 std::priv::_Impl_vector >::push_back +36158 2 376 144 +3615a 2 376 144 +3615c 4 380 144 +36160 2 376 144 +36162 4 380 144 +36166 2 119 108 +36168 18 449 62 +36180 8 382 144 +36188 e 162 144 +36196 4 388 144 +FUNC 3619a 6a 0 google_breakpad::test_assembler::Section::Append +3619a 6 228 61 +361a0 4 228 61 +361a4 4 232 61 +361a8 4 228 61 +361ac c 232 61 +361b8 10 223 61 +361c8 2 233 61 +361ca 4 400 136 +361ce 2 453 62 +361d0 2 400 136 +361d2 10 453 62 +361e2 a 173 148 +361ec 6 449 62 +361f2 a 240 61 +361fc 8 242 61 +FUNC 36204 a 0 google_breakpad::test_assembler::Section::L8 +36204 a 265 61 +FUNC 3620e a 0 google_breakpad::test_assembler::Section::B8 +3620e a 266 61 +FUNC 36218 a 0 google_breakpad::test_assembler::Section::L16 +36218 a 267 61 +FUNC 36222 a 0 google_breakpad::test_assembler::Section::L32 +36222 a 268 61 +FUNC 3622c a 0 google_breakpad::test_assembler::Section::L64 +3622c a 269 61 +FUNC 36236 a 0 google_breakpad::test_assembler::Section::B16 +36236 a 270 61 +FUNC 36240 a 0 google_breakpad::test_assembler::Section::B32 +36240 a 271 61 +FUNC 3624a a 0 google_breakpad::test_assembler::Section::B64 +3624a a 272 61 +FUNC 36254 a 0 google_breakpad::test_assembler::Section::D8 +36254 a 288 61 +FUNC 3625e a 0 google_breakpad::test_assembler::Section::D16 +3625e a 289 61 +FUNC 36268 a 0 google_breakpad::test_assembler::Section::D32 +36268 a 290 61 +FUNC 36272 a 0 google_breakpad::test_assembler::Section::D64 +36272 a 291 61 +FUNC 3627c 130 0 google_breakpad::test_assembler::Section::Append +3627c e 293 61 +3628a 2 197 135 +3628c 2 293 61 +3628e 2 293 61 +36290 4 400 136 +36294 4 295 61 +36298 2 197 135 +3629a 2 74 137 +3629c 4 74 137 +362a0 4 74 137 +362a4 4 198 135 +362a8 4 74 137 +362ac 2 74 137 +362ae 4 199 135 +362b2 8 200 135 +362ba 4 346 106 +362be 6 347 106 +362c4 4 348 106 +362c8 4 352 106 +362cc 4 348 106 +362d0 4 356 106 +362d4 14 86 142 +362e8 8 86 142 +362f0 1e 146 108 +3630e 8 86 142 +36316 6 146 108 +3631c 8 101 108 +36324 8 205 135 +3632c 4 206 135 +36330 2 160 137 +36332 2 164 137 +36334 8 165 137 +3633c 2 210 135 +3633e 6 86 142 +36344 8 86 142 +3634c 6 146 108 +36352 a 101 108 +3635c 2 232 145 +3635e 6 214 135 +36364 8 453 62 +3636c 4 173 148 +36370 a 296 61 +3637a 8 299 61 +36382 2 453 62 +36384 2 299 61 +36386 c 453 62 +36392 8 173 148 +3639a a 449 62 +363a4 8 301 61 +FUNC 363ac 158 0 google_breakpad::CopyFile +363ac 16 44 64 +363c2 4 44 64 +363c6 e 45 64 +363d4 4 45 64 +363d8 6 45 64 +363de 6 47 64 +363e4 4 46 64 +363e8 10 51 64 +363f8 4 51 64 +363fc 6 51 64 +36402 8 53 64 +3640a a 54 64 +36414 4 54 64 +36418 6 54 64 +3641e 8 55 64 +36426 4 57 64 +3642a 4 65 64 +3642e 4 70 64 +36432 10 74 64 +36442 4 78 64 +36446 2 83 64 +36448 4 73 64 +3644c 12 64 64 +3645e 4 64 64 +36462 6 64 64 +36468 4 66 64 +3646c 6 79 64 +36472 a 87 64 +3647c c 91 64 +36488 10 97 64 +36498 4 52 64 +3649c 6 64 64 +364a2 4 87 64 +364a6 8 87 64 +364ae 4 91 64 +364b2 8 91 64 +364ba 6 54 64 +364c0 4 74 64 +364c4 6 74 64 +364ca a 79 64 +364d4 2 88 64 +364d6 2 89 64 +364d8 8 88 64 +364e0 24 97 64 +FUNC 36504 9c 0 google_breakpad::ReadFile +36504 8 99 64 +3650c e 100 64 +3651a 4 100 64 +3651e 6 100 64 +36524 6 102 64 +3652a 2 107 64 +3652c 4 106 64 +36530 4 107 64 +36534 6 107 64 +3653a a 108 64 +36544 10 109 64 +36554 4 109 64 +36558 6 109 64 +3655e 2 109 64 +36560 4 110 64 +36564 2 111 64 +36566 2 112 64 +36568 6 111 64 +3656e a 115 64 +36578 4 115 64 +3657c a 115 64 +36586 8 116 64 +3658e 2 117 64 +36590 10 120 64 +FUNC 365a0 a0 0 google_breakpad::WriteFile +365a0 a 122 64 +365aa 14 123 64 +365be 4 123 64 +365c2 6 123 64 +365c8 6 125 64 +365ce 2 130 64 +365d0 6 129 64 +365d6 4 134 64 +365da 16 136 64 +365f0 4 136 64 +365f4 6 136 64 +365fa 2 139 64 +365fc 2 140 64 +365fe 6 139 64 +36604 a 146 64 +3660e 4 146 64 +36612 c 146 64 +3661e 4 138 64 +36622 4 143 64 +36626 8 147 64 +3662e 2 148 64 +36630 10 151 64 +FUNC 36640 18 0 MinidumpMemoryRangeTest_GetAsciiMDString_Test::~MinidumpMemoryRangeTest_GetAsciiMDString_Test +36640 2 224 78 +36642 16 224 78 +FUNC 36658 12 0 MinidumpMemoryRangeTest_GetAsciiMDString_Test::~MinidumpMemoryRangeTest_GetAsciiMDString_Test +36658 2 224 78 +3665a 6 224 78 +36660 6 224 78 +36666 4 224 78 +FUNC 3666c 18 0 MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test::~MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test +3666c 2 216 78 +3666e 16 216 78 +FUNC 36684 12 0 MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test::~MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test +36684 2 216 78 +36686 6 216 78 +3668c 6 216 78 +36692 4 216 78 +FUNC 36698 18 0 MinidumpMemoryRangeTest_GetArrayElement_Test::~MinidumpMemoryRangeTest_GetArrayElement_Test +36698 2 201 78 +3669a 16 201 78 +FUNC 366b0 12 0 MinidumpMemoryRangeTest_GetArrayElement_Test::~MinidumpMemoryRangeTest_GetArrayElement_Test +366b0 2 201 78 +366b2 6 201 78 +366b8 6 201 78 +366be 4 201 78 +FUNC 366c4 18 0 MinidumpMemoryRangeTest_GetDataWithTemplateType_Test::~MinidumpMemoryRangeTest_GetDataWithTemplateType_Test +366c4 2 193 78 +366c6 16 193 78 +FUNC 366dc 12 0 MinidumpMemoryRangeTest_GetDataWithTemplateType_Test::~MinidumpMemoryRangeTest_GetDataWithTemplateType_Test +366dc 2 193 78 +366de 6 193 78 +366e4 6 193 78 +366ea 4 193 78 +FUNC 366f0 18 0 MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test::~MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test +366f0 2 165 78 +366f2 16 165 78 +FUNC 36708 12 0 MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test::~MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test +36708 2 165 78 +3670a 6 165 78 +36710 6 165 78 +36716 4 165 78 +FUNC 3671c 18 0 MinidumpMemoryRangeTest_SubrangeAndGetData_Test::~MinidumpMemoryRangeTest_SubrangeAndGetData_Test +3671c 2 140 78 +3671e 16 140 78 +FUNC 36734 12 0 MinidumpMemoryRangeTest_SubrangeAndGetData_Test::~MinidumpMemoryRangeTest_SubrangeAndGetData_Test +36734 2 140 78 +36736 6 140 78 +3673c 6 140 78 +36742 4 140 78 +FUNC 36748 18 0 MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test::~MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test +36748 2 133 78 +3674a 16 133 78 +FUNC 36760 12 0 MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test::~MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test +36760 2 133 78 +36762 6 133 78 +36768 6 133 78 +3676e 4 133 78 +FUNC 36774 18 0 MinidumpMemoryRangeTest_Set_Test::~MinidumpMemoryRangeTest_Set_Test +36774 2 122 78 +36776 16 122 78 +FUNC 3678c 12 0 MinidumpMemoryRangeTest_Set_Test::~MinidumpMemoryRangeTest_Set_Test +3678c 2 122 78 +3678e 6 122 78 +36794 6 122 78 +3679a 4 122 78 +FUNC 367a0 18 0 MinidumpMemoryRangeTest_Reset_Test::~MinidumpMemoryRangeTest_Reset_Test +367a0 2 107 78 +367a2 16 107 78 +FUNC 367b8 12 0 MinidumpMemoryRangeTest_Reset_Test::~MinidumpMemoryRangeTest_Reset_Test +367b8 2 107 78 +367ba 6 107 78 +367c0 6 107 78 +367c6 4 107 78 +FUNC 367cc 18 0 MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test::~MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test +367cc 2 101 78 +367ce 16 101 78 +FUNC 367e4 12 0 MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test::~MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test +367e4 2 101 78 +367e6 6 101 78 +367ec 6 101 78 +367f2 4 101 78 +FUNC 367f8 18 0 MinidumpMemoryRangeTest_DefaultConstructor_Test::~MinidumpMemoryRangeTest_DefaultConstructor_Test +367f8 2 95 78 +367fa 16 95 78 +FUNC 36810 12 0 MinidumpMemoryRangeTest_DefaultConstructor_Test::~MinidumpMemoryRangeTest_DefaultConstructor_Test +36810 2 95 78 +36812 6 95 78 +36818 6 95 78 +3681e 4 95 78 +FUNC 36824 20 0 testing::internal::TestFactoryImpl::CreateTest +36824 2 486 85 +36826 8 486 85 +3682e 6 224 78 +36834 2 486 85 +36836 6 224 78 +3683c 8 486 85 +FUNC 36844 20 0 testing::internal::TestFactoryImpl::CreateTest +36844 2 486 85 +36846 8 486 85 +3684e 6 216 78 +36854 2 486 85 +36856 6 216 78 +3685c 8 486 85 +FUNC 36864 20 0 testing::internal::TestFactoryImpl::CreateTest +36864 2 486 85 +36866 8 486 85 +3686e 6 201 78 +36874 2 486 85 +36876 6 201 78 +3687c 8 486 85 +FUNC 36884 20 0 testing::internal::TestFactoryImpl::CreateTest +36884 2 486 85 +36886 8 486 85 +3688e 6 193 78 +36894 2 486 85 +36896 6 193 78 +3689c 8 486 85 +FUNC 368a4 20 0 testing::internal::TestFactoryImpl::CreateTest +368a4 2 486 85 +368a6 8 486 85 +368ae 6 165 78 +368b4 2 486 85 +368b6 6 165 78 +368bc 8 486 85 +FUNC 368c4 20 0 testing::internal::TestFactoryImpl::CreateTest +368c4 2 486 85 +368c6 8 486 85 +368ce 6 140 78 +368d4 2 486 85 +368d6 6 140 78 +368dc 8 486 85 +FUNC 368e4 20 0 testing::internal::TestFactoryImpl::CreateTest +368e4 2 486 85 +368e6 8 486 85 +368ee 6 133 78 +368f4 2 486 85 +368f6 6 133 78 +368fc 8 486 85 +FUNC 36904 20 0 testing::internal::TestFactoryImpl::CreateTest +36904 2 486 85 +36906 8 486 85 +3690e 6 122 78 +36914 2 486 85 +36916 6 122 78 +3691c 8 486 85 +FUNC 36924 20 0 testing::internal::TestFactoryImpl::CreateTest +36924 2 486 85 +36926 8 486 85 +3692e 6 107 78 +36934 2 486 85 +36936 6 107 78 +3693c 8 486 85 +FUNC 36944 20 0 testing::internal::TestFactoryImpl::CreateTest +36944 2 486 85 +36946 8 486 85 +3694e 6 101 78 +36954 2 486 85 +36956 6 101 78 +3695c 8 486 85 +FUNC 36964 20 0 testing::internal::TestFactoryImpl::CreateTest +36964 2 486 85 +36966 8 486 85 +3696e 6 95 78 +36974 2 486 85 +36976 6 95 78 +3697c 8 486 85 +FUNC 36984 18 0 google_breakpad::MemoryRange::GetData +36984 2 90 55 +36986 4 83 55 +3698a 4 82 55 +3698e 4 83 55 +36992 4 91 55 +36996 4 91 55 +3699a 2 92 55 +FUNC 3699c 26 0 google_breakpad::MemoryRange::Subrange +3699c 4 124 55 +369a0 4 83 55 +369a4 4 82 55 +369a8 4 83 55 +369ac 4 126 55 +369b0 2 72 55 +369b2 2 70 55 +369b4 6 72 55 +369ba 6 50 55 +369c0 2 127 55 +FUNC 3699c 26 0 google_breakpad::MinidumpMemoryRange::Subrange +3699c 4 59 77 +369a0 4 83 55 +369a4 4 82 55 +369a8 4 83 55 +369ac 4 61 77 +369b0 2 72 55 +369b2 2 70 55 +369b4 6 72 55 +369ba 6 50 55 +369c0 2 63 77 +FUNC 369c2 44 0 google_breakpad::MinidumpMemoryRange::GetAsciiMDString +369c2 2 74 77 +369c4 6 74 77 +369ca 2 101 108 +369cc 2 120 137 +369ce 2 481 106 +369d0 8 124 137 +369d8 2 99 55 +369da 2 101 108 +369dc 8 99 55 +369e4 4 77 77 +369e8 2 78 77 +369ea 6 79 77 +369f0 6 79 77 +369f6 8 80 77 +369fe 4 79 77 +36a02 4 84 77 +FUNC 36a08 98 0 testing::PrintToString +36a08 e 883 80 +36a16 2 883 80 +36a18 4 884 80 +36a1c 2 883 80 +36a1e 4 884 80 +36a22 2 883 80 +36a24 4 884 80 +36a28 8 885 80 +36a30 2 708 80 +36a32 c 333 127 +36a3e 2 112 137 +36a40 2 229 145 +36a42 2 112 137 +36a44 2 481 106 +36a46 6 229 145 +36a4c 4 643 135 +36a50 8 379 136 +36a58 a 148 142 +36a62 2 101 108 +36a64 2 380 136 +36a66 2 469 80 +36a68 2 101 108 +36a6a 6 469 80 +36a70 6 156 137 +36a76 8 75 132 +36a7e 6 886 80 +36a84 1c 887 80 +FUNC 36aa0 2c 0 testing::internal::DefaultPrintTo +36aa0 2 307 80 +36aa2 2 307 80 +36aa4 4 310 80 +36aa8 4 334 80 +36aac a 333 127 +36ab6 6 318 80 +36abc 4 291 126 +36ac0 4 334 80 +36ac4 8 291 126 +FUNC 36aa0 2c 0 testing::internal::DefaultPrintTo +FUNC 36acc c8 0 testing::operator<< +36acc e 232 79 +36ada 2 232 79 +36adc 6 233 79 +36ae2 2 232 79 +36ae4 4 233 79 +36ae8 c 181 127 +36af4 2 41 138 +36af6 10 62 138 +36b06 2 139 115 +36b08 6 400 136 +36b0e e 44 138 +36b1c 2 138 115 +36b1e 2 139 115 +36b20 2 46 138 +36b22 e 49 138 +36b30 6 52 138 +36b36 a 55 138 +36b40 6 55 138 +36b46 a 53 138 +36b50 6 55 138 +36b56 6 57 138 +36b5c a 58 138 +36b66 4 58 138 +36b6a 6 64 138 +36b70 6 156 137 +36b76 e 234 79 +36b84 4 50 138 +36b88 c 234 79 +FUNC 36b94 a0 0 testing::internal::CmpHelperEQFailure +36b94 e 1464 82 +36ba2 2 1464 82 +36ba4 2 884 80 +36ba6 6 1464 82 +36bac 4 380 80 +36bb0 2 1464 82 +36bb2 4 884 80 +36bb6 4 1464 82 +36bba 2 75 132 +36bbc 4 884 80 +36bc0 4 380 80 +36bc4 2 75 132 +36bc6 4 380 80 +36bca 8 75 132 +36bd2 6 886 80 +36bd8 8 884 80 +36be0 6 380 80 +36be6 4 75 132 +36bea 4 380 80 +36bee 8 75 132 +36bf6 6 886 80 +36bfc 14 1471 82 +36c10 c 156 137 +36c1c 18 1472 82 +FUNC 36c34 28 0 std::operator==, std::allocator > +36c34 2 311 139 +36c36 4 311 139 +36c3a 6 229 145 +36c40 2 400 136 +36c42 2 229 145 +36c44 2 400 136 +36c46 4 315 139 +36c4a 6 226 145 +36c50 8 315 139 +36c58 2 315 139 +36c5a 2 316 139 +FUNC 36c5c 98 0 testing::internal::CmpHelperEQ, std::allocator > > +36c5c e 1476 82 +36c6a a 1476 82 +36c74 4 1481 82 +36c78 4 1476 82 +36c7c 8 1481 82 +36c84 a 1482 82 +36c8e 6 1427 82 +36c94 4 884 80 +36c98 4 1427 82 +36c9c 8 884 80 +36ca4 4 469 80 +36ca8 4 75 132 +36cac 4 469 80 +36cb0 8 75 132 +36cb8 6 886 80 +36cbe 12 1471 82 +36cd0 c 156 137 +36cdc 18 1488 82 +FUNC 36cf4 308 0 MinidumpMemoryRangeTest_GetAsciiMDString_Test::TestBody +36cf4 6 224 78 +36cfa 2 225 78 +36cfc 6 224 78 +36d02 2 225 78 +36d04 2 224 78 +36d06 6 225 78 +36d0c 2 224 78 +36d0e 4 225 78 +36d12 4 228 78 +36d16 4 229 78 +36d1a 4 230 78 +36d1e 4 231 78 +36d22 4 232 78 +36d26 2 241 78 +36d28 4 242 78 +36d2c 4 243 78 +36d30 4 244 78 +36d34 2 245 78 +36d36 2 239 78 +36d38 2 245 78 +36d3a 2 247 78 +36d3c 2 239 78 +36d3e 2 240 78 +36d40 2 239 78 +36d42 2 247 78 +36d44 2 248 78 +36d46 2 70 55 +36d48 4 1481 82 +36d4c 4 72 55 +36d50 2 251 78 +36d52 2 240 78 +36d54 4 251 78 +36d58 2 1481 82 +36d5a 2 239 78 +36d5c 2 248 78 +36d5e 4 251 78 +36d62 12 1481 82 +36d74 e 1482 82 +36d82 a 1427 82 +36d8c 8 884 80 +36d94 4 75 132 +36d98 8 469 80 +36da0 8 75 132 +36da8 6 886 80 +36dae 18 1471 82 +36dc6 12 156 137 +36dd8 4 251 78 +36ddc 6 302 82 +36de2 c 251 78 +36dee 4 251 78 +36df2 8 251 78 +36dfa 6 251 78 +36e00 8 251 78 +36e08 6 85 79 +36e0e 6 251 78 +36e14 4 256 82 +36e18 4 1481 82 +36e1c 6 256 82 +36e22 2 1481 82 +36e24 a 252 78 +36e2e c 1481 82 +36e3a e 1482 82 +36e48 a 1427 82 +36e52 8 884 80 +36e5a 4 75 132 +36e5e 8 469 80 +36e66 8 75 132 +36e6e 6 886 80 +36e74 14 1471 82 +36e88 12 156 137 +36e9a 4 252 78 +36e9e 6 302 82 +36ea4 a 252 78 +36eae 4 252 78 +36eb2 8 252 78 +36eba 6 252 78 +36ec0 8 252 78 +36ec8 6 85 79 +36ece 6 252 78 +36ed4 6 256 82 +36eda a 255 78 +36ee4 14 1512 82 +36ef8 6 156 137 +36efe 4 255 78 +36f02 6 302 82 +36f08 c 255 78 +36f14 4 255 78 +36f18 8 255 78 +36f20 6 255 78 +36f26 8 256 78 +36f2e 6 85 79 +36f34 6 255 78 +36f3a 6 256 82 +36f40 a 257 78 +36f4a 14 1512 82 +36f5e 6 156 137 +36f64 4 257 78 +36f68 6 302 82 +36f6e c 257 78 +36f7a 2 257 78 +36f7c 8 257 78 +36f84 6 257 78 +36f8a 8 257 78 +36f92 6 85 79 +36f98 6 257 78 +36f9e 6 256 82 +36fa4 58 258 78 +FUNC 36ffc 48 0 testing::PrintToString +36ffc e 883 80 +3700a 2 883 80 +3700c 6 884 80 +37012 2 883 80 +37014 4 884 80 +37018 8 380 80 +37020 8 75 132 +37028 6 886 80 +3702e 16 887 80 +FUNC 37044 74 0 testing::internal::CmpHelperEQ +37044 8 1476 82 +3704c c 1476 82 +37058 2 1481 82 +3705a 2 1476 82 +3705c 4 1481 82 +37060 2 1476 82 +37062 2 1481 82 +37064 2 1476 82 +37066 2 1481 82 +37068 6 1482 82 +3706e 14 1382 82 +37082 12 1471 82 +37094 c 156 137 +370a0 18 1488 82 +FUNC 370b8 e0 0 MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test::TestBody +370b8 2 101 78 +370ba 2 103 78 +370bc 2 101 78 +370be 4 103 78 +370c2 18 1512 82 +370da 6 103 78 +370e0 6 302 82 +370e6 12 103 78 +370f8 6 103 78 +370fe 8 103 78 +37106 6 85 79 +3710c 6 103 78 +37112 8 256 82 +3711a 2 104 78 +3711c 2 1512 82 +3711e 2 104 78 +37120 12 1512 82 +37132 6 104 78 +37138 6 302 82 +3713e 12 104 78 +37150 6 104 78 +37156 8 104 78 +3715e 6 85 79 +37164 6 104 78 +3716a 6 256 82 +37170 28 105 78 +FUNC 37198 d4 0 MinidumpMemoryRangeTest_DefaultConstructor_Test::TestBody +37198 4 95 78 +3719c 2 1571 82 +3719e 2 95 78 +371a0 1a 1571 82 +371ba 8 97 78 +371c2 6 302 82 +371c8 10 97 78 +371d8 6 97 78 +371de 8 97 78 +371e6 6 85 79 +371ec 6 97 78 +371f2 8 256 82 +371fa 2 98 78 +371fc 4 1552 82 +37200 4 98 78 +37204 e 1552 82 +37212 6 98 78 +37218 6 302 82 +3721e 10 98 78 +3722e 6 98 78 +37234 8 98 78 +3723c 6 85 79 +37242 6 98 78 +37248 6 256 82 +3724e 1e 99 78 +FUNC 3726c e8 0 MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test::TestBody +3726c 2 133 78 +3726e 2 50 55 +37270 2 133 78 +37272 8 135 78 +3727a 4 50 55 +3727e 6 135 78 +37284 1c 1571 82 +372a0 8 136 78 +372a8 6 302 82 +372ae 10 136 78 +372be 6 136 78 +372c4 8 136 78 +372cc 6 85 79 +372d2 6 136 78 +372d8 8 256 82 +372e0 2 137 78 +372e2 2 1552 82 +372e4 2 137 78 +372e6 2 1552 82 +372e8 2 137 78 +372ea 2 1552 82 +372ec 2 137 78 +372ee c 1552 82 +372fa 6 137 78 +37300 6 302 82 +37306 10 137 78 +37316 6 137 78 +3731c 8 137 78 +37324 6 85 79 +3732a 6 137 78 +37330 6 256 82 +37336 1e 138 78 +FUNC 37354 1a0 0 MinidumpMemoryRangeTest_Set_Test::TestBody +37354 2 122 78 +37356 2 125 78 +37358 2 122 78 +3735a 4 125 78 +3735e 18 1512 82 +37376 8 125 78 +3737e 6 302 82 +37384 10 125 78 +37394 6 125 78 +3739a 8 125 78 +373a2 6 85 79 +373a8 6 125 78 +373ae 8 256 82 +373b6 2 126 78 +373b8 2 1512 82 +373ba 2 126 78 +373bc 12 1512 82 +373ce 6 126 78 +373d4 6 302 82 +373da 10 126 78 +373ea 6 126 78 +373f0 8 126 78 +373f8 6 85 79 +373fe 6 126 78 +37404 8 256 82 +3740c 16 1571 82 +37422 8 129 78 +3742a 6 302 82 +37430 10 129 78 +37440 6 129 78 +37446 8 129 78 +3744e 6 85 79 +37454 6 129 78 +3745a 6 256 82 +37460 2 130 78 +37462 4 1552 82 +37466 4 130 78 +3746a e 1552 82 +37478 6 130 78 +3747e 6 302 82 +37484 10 130 78 +37494 6 130 78 +3749a 8 130 78 +374a2 6 85 79 +374a8 6 130 78 +374ae 6 256 82 +374b4 40 131 78 +FUNC 374f4 264 0 MinidumpMemoryRangeTest_Reset_Test::TestBody +374f4 4 107 78 +374f8 2 1571 82 +374fa 2 107 78 +374fc 1a 1571 82 +37516 8 110 78 +3751e 6 302 82 +37524 10 110 78 +37534 6 110 78 +3753a 8 110 78 +37542 6 85 79 +37548 6 110 78 +3754e 8 256 82 +37556 2 111 78 +37558 4 1552 82 +3755c 4 111 78 +37560 e 1552 82 +3756e 6 111 78 +37574 6 302 82 +3757a 10 111 78 +3758a 6 111 78 +37590 8 111 78 +37598 6 85 79 +3759e 6 111 78 +375a4 6 256 82 +375aa 2 114 78 +375ac 2 1512 82 +375ae 4 114 78 +375b2 12 1512 82 +375c4 6 114 78 +375ca 6 302 82 +375d0 10 114 78 +375e0 6 114 78 +375e6 8 114 78 +375ee 6 85 79 +375f4 6 114 78 +375fa 6 256 82 +37600 2 115 78 +37602 2 1512 82 +37604 2 115 78 +37606 12 1512 82 +37618 6 115 78 +3761e 6 302 82 +37624 10 115 78 +37634 6 115 78 +3763a 8 115 78 +37642 6 85 79 +37648 6 115 78 +3764e 8 256 82 +37656 16 1571 82 +3766c 8 118 78 +37674 6 302 82 +3767a 10 118 78 +3768a 6 118 78 +37690 8 118 78 +37698 6 85 79 +3769e 6 118 78 +376a4 6 256 82 +376aa 2 119 78 +376ac 4 1552 82 +376b0 4 119 78 +376b4 e 1552 82 +376c2 6 119 78 +376c8 6 302 82 +376ce 10 119 78 +376de 6 119 78 +376e4 8 119 78 +376ec 6 85 79 +376f2 6 119 78 +376f8 6 256 82 +376fe 5a 120 78 +FUNC 37758 74 0 testing::internal::CmpHelperEQ +37758 8 1476 82 +37760 c 1476 82 +3776c 2 1481 82 +3776e 2 1476 82 +37770 4 1481 82 +37774 2 1476 82 +37776 2 1481 82 +37778 2 1476 82 +3777a 2 1481 82 +3777c 6 1482 82 +37782 14 1382 82 +37796 12 1471 82 +377a8 c 156 137 +377b4 18 1488 82 +FUNC 377cc 74 0 testing::internal::CmpHelperEQ +377cc 8 1476 82 +377d4 c 1476 82 +377e0 2 1481 82 +377e2 2 1476 82 +377e4 4 1481 82 +377e8 2 1476 82 +377ea 2 1481 82 +377ec 2 1476 82 +377ee 2 1481 82 +377f0 6 1482 82 +377f6 14 1382 82 +3780a 12 1471 82 +3781c c 156 137 +37828 18 1488 82 +FUNC 37840 148 0 MinidumpMemoryRangeTest_GetArrayElement_Test::TestBody +37840 4 201 78 +37844 2 70 55 +37846 2 201 78 +37848 4 70 55 +3784c 6 72 55 +37852 c 208 78 +3785e 2 333 127 +37860 2 208 78 +37862 10 333 127 +37872 c 1512 82 +3787e 2 207 78 +37880 4 206 78 +37884 2 208 78 +37886 2 208 78 +37888 2 208 78 +3788a 2 207 78 +3788c 4 204 78 +37890 4 208 78 +37894 6 208 78 +3789a a 333 127 +378a4 a 254 126 +378ae a 333 127 +378b8 a 254 126 +378c2 a 333 127 +378cc a 254 126 +378d6 6 131 79 +378dc 4 208 78 +378e0 4 131 79 +378e4 c 208 78 +378f0 c 85 79 +378fc c 109 55 +37908 2 1512 82 +3790a 2 211 78 +3790c c 1512 82 +37918 6 211 78 +3791e 6 302 82 +37924 10 211 78 +37934 6 211 78 +3793a 8 212 78 +37942 6 85 79 +37948 6 211 78 +3794e 6 256 82 +37954 6 213 78 +3795a 8 203 78 +37962 26 214 78 +FUNC 37988 490 0 MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test::TestBody +37988 10 165 78 +37998 2 165 78 +3799a 2 70 55 +3799c 2 72 55 +3799e 4 70 55 +379a2 4 72 55 +379a6 2 168 78 +379a8 2 72 55 +379aa 4 168 78 +379ae c 333 127 +379ba 6 171 78 +379c0 c 1571 82 +379cc 2 168 78 +379ce 2 171 78 +379d0 6 168 78 +379d6 2 169 78 +379d8 2 170 78 +379da 2 171 78 +379dc 2 171 78 +379de 2 170 78 +379e0 4 171 78 +379e4 6 171 78 +379ea a 333 127 +379f4 a 254 126 +379fe a 333 127 +37a08 a 254 126 +37a12 6 131 79 +37a18 4 171 78 +37a1c 4 131 79 +37a20 c 171 78 +37a2c 6 85 79 +37a32 4 68 77 +37a36 6 85 79 +37a3c 12 68 77 +37a4e 8 178 78 +37a56 4 83 55 +37a5a 4 82 55 +37a5e a 83 55 +37a68 2 83 55 +37a6a 2 1139 87 +37a6c 4 277 82 +37a70 2 1139 87 +37a72 2 179 78 +37a74 1a 179 78 +37a8e 8 179 78 +37a96 4 179 78 +37a9a a 179 78 +37aa4 6 179 78 +37aaa 8 179 78 +37ab2 6 85 79 +37ab8 6 179 78 +37abe 6 156 137 +37ac4 6 256 82 +37aca 14 180 78 +37ade a 1512 82 +37ae8 2 180 78 +37aea e 1512 82 +37af8 6 180 78 +37afe 6 302 82 +37b04 10 180 78 +37b14 6 180 78 +37b1a 8 181 78 +37b22 6 85 79 +37b28 6 180 78 +37b2e a 256 82 +37b38 2 182 78 +37b3a 2 1512 82 +37b3c 4 182 78 +37b40 2 1512 82 +37b42 4 182 78 +37b46 2 1512 82 +37b48 2 182 78 +37b4a 8 1512 82 +37b52 2 182 78 +37b54 4 1512 82 +37b58 6 182 78 +37b5e 6 302 82 +37b64 10 182 78 +37b74 6 182 78 +37b7a 8 182 78 +37b82 6 85 79 +37b88 6 182 78 +37b8e 6 256 82 +37b94 2 183 78 +37b96 4 1512 82 +37b9a 2 183 78 +37b9c e 1512 82 +37baa 6 183 78 +37bb0 6 302 82 +37bb6 10 183 78 +37bc6 6 183 78 +37bcc 8 183 78 +37bd4 6 85 79 +37bda 6 183 78 +37be0 4 256 82 +37be4 4 83 55 +37be8 4 82 55 +37bec c 83 55 +37bf8 2 1139 87 +37bfa 4 185 78 +37bfe 4 277 82 +37c02 2 1139 87 +37c04 2 185 78 +37c06 1a 185 78 +37c20 8 185 78 +37c28 4 185 78 +37c2c a 185 78 +37c36 6 185 78 +37c3c 8 185 78 +37c44 6 85 79 +37c4a 6 185 78 +37c50 6 156 137 +37c56 a 256 82 +37c60 a 186 78 +37c6a 1a 1571 82 +37c84 6 186 78 +37c8a 6 302 82 +37c90 10 186 78 +37ca0 6 186 78 +37ca6 8 186 78 +37cae 6 85 79 +37cb4 6 186 78 +37cba 8 256 82 +37cc2 1a 1571 82 +37cdc 6 187 78 +37ce2 6 302 82 +37ce8 10 187 78 +37cf8 6 187 78 +37cfe 8 187 78 +37d06 6 85 79 +37d0c 6 187 78 +37d12 6 256 82 +37d18 2 188 78 +37d1a 2 1552 82 +37d1c 2 188 78 +37d1e 2 1552 82 +37d20 2 188 78 +37d22 2 1552 82 +37d24 2 188 78 +37d26 c 1552 82 +37d32 6 188 78 +37d38 6 302 82 +37d3e 10 188 78 +37d4e 6 188 78 +37d54 8 188 78 +37d5c 6 85 79 +37d62 6 188 78 +37d68 8 256 82 +37d70 6 190 78 +37d76 6 167 78 +37d7c 9c 191 78 +FUNC 37e18 490 0 MinidumpMemoryRangeTest_SubrangeAndGetData_Test::TestBody +37e18 10 140 78 +37e28 2 140 78 +37e2a 2 70 55 +37e2c 2 72 55 +37e2e 4 70 55 +37e32 4 72 55 +37e36 2 143 78 +37e38 2 72 55 +37e3a 4 143 78 +37e3e c 333 127 +37e4a 6 146 78 +37e50 c 1571 82 +37e5c 2 143 78 +37e5e 2 146 78 +37e60 6 143 78 +37e66 2 144 78 +37e68 2 145 78 +37e6a 2 146 78 +37e6c 2 146 78 +37e6e 2 145 78 +37e70 4 146 78 +37e74 6 146 78 +37e7a a 333 127 +37e84 a 254 126 +37e8e a 333 127 +37e98 a 254 126 +37ea2 6 131 79 +37ea8 4 146 78 +37eac 4 131 79 +37eb0 c 146 78 +37ebc 6 85 79 +37ec2 4 149 78 +37ec6 6 85 79 +37ecc 12 149 78 +37ede 8 150 78 +37ee6 4 83 55 +37eea 4 82 55 +37eee a 83 55 +37ef8 2 83 55 +37efa 2 1139 87 +37efc 4 277 82 +37f00 2 1139 87 +37f02 2 151 78 +37f04 1a 151 78 +37f1e 8 151 78 +37f26 4 151 78 +37f2a a 151 78 +37f34 6 151 78 +37f3a 8 151 78 +37f42 6 85 79 +37f48 6 151 78 +37f4e 6 156 137 +37f54 6 256 82 +37f5a 14 152 78 +37f6e a 1512 82 +37f78 2 152 78 +37f7a e 1512 82 +37f88 6 152 78 +37f8e 6 302 82 +37f94 10 152 78 +37fa4 6 152 78 +37faa 8 153 78 +37fb2 6 85 79 +37fb8 6 152 78 +37fbe a 256 82 +37fc8 2 154 78 +37fca 2 1512 82 +37fcc 4 154 78 +37fd0 2 1512 82 +37fd2 4 154 78 +37fd6 2 1512 82 +37fd8 2 154 78 +37fda 8 1512 82 +37fe2 2 154 78 +37fe4 4 1512 82 +37fe8 6 154 78 +37fee 6 302 82 +37ff4 10 154 78 +38004 6 154 78 +3800a 8 154 78 +38012 6 85 79 +38018 6 154 78 +3801e 6 256 82 +38024 2 155 78 +38026 4 1512 82 +3802a 2 155 78 +3802c e 1512 82 +3803a 6 155 78 +38040 6 302 82 +38046 10 155 78 +38056 6 155 78 +3805c 8 155 78 +38064 6 85 79 +3806a 6 155 78 +38070 4 256 82 +38074 4 83 55 +38078 4 82 55 +3807c c 83 55 +38088 2 1139 87 +3808a 4 157 78 +3808e 4 277 82 +38092 2 1139 87 +38094 2 157 78 +38096 1a 157 78 +380b0 8 157 78 +380b8 4 157 78 +380bc a 157 78 +380c6 6 157 78 +380cc 8 157 78 +380d4 6 85 79 +380da 6 157 78 +380e0 6 156 137 +380e6 a 256 82 +380f0 a 158 78 +380fa 1a 1571 82 +38114 6 158 78 +3811a 6 302 82 +38120 10 158 78 +38130 6 158 78 +38136 8 158 78 +3813e 6 85 79 +38144 6 158 78 +3814a 8 256 82 +38152 1a 1571 82 +3816c 6 159 78 +38172 6 302 82 +38178 10 159 78 +38188 6 159 78 +3818e 8 159 78 +38196 6 85 79 +3819c 6 159 78 +381a2 6 256 82 +381a8 2 160 78 +381aa 2 1552 82 +381ac 2 160 78 +381ae 2 1552 82 +381b0 2 160 78 +381b2 2 1552 82 +381b4 2 160 78 +381b6 c 1552 82 +381c2 6 160 78 +381c8 6 302 82 +381ce 10 160 78 +381de 6 160 78 +381e4 8 160 78 +381ec 6 85 79 +381f2 6 160 78 +381f8 8 256 82 +38200 6 162 78 +38206 6 142 78 +3820c 9c 163 78 +FUNC 382a8 6c 0 testing::internal::CmpHelperEQFailure +382a8 8 1464 82 +382b0 6 1464 82 +382b6 4 1408 82 +382ba 2 1464 82 +382bc 2 1408 82 +382be 6 1464 82 +382c4 4 1408 82 +382c8 2 1464 82 +382ca 14 1408 82 +382de 12 1471 82 +382f0 c 156 137 +382fc 18 1472 82 +FUNC 38314 124 0 MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test::TestBody +38314 2 216 78 +38316 2 70 55 +38318 2 216 78 +3831a 4 70 55 +3831e 2 72 55 +38320 8 109 55 +38328 2 72 55 +3832a 4 109 55 +3832e 2 219 78 +38330 2 218 78 +38332 6 219 78 +38338 2 1481 82 +3833a 2 219 78 +3833c 2 1481 82 +3833e 8 1482 82 +38346 14 1487 82 +3835a 6 219 78 +38360 6 302 82 +38366 a 219 78 +38370 2 219 78 +38372 8 219 78 +3837a 6 219 78 +38380 8 219 78 +38388 6 85 79 +3838e 6 219 78 +38394 8 256 82 +3839c a 109 55 +383a6 2 221 78 +383a8 2 220 78 +383aa 4 221 78 +383ae 2 1481 82 +383b0 2 221 78 +383b2 2 1481 82 +383b4 8 1482 82 +383bc 14 1487 82 +383d0 6 221 78 +383d6 6 302 82 +383dc a 221 78 +383e6 2 221 78 +383e8 8 221 78 +383f0 6 221 78 +383f6 8 221 78 +383fe 6 85 79 +38404 6 221 78 +3840a 6 256 82 +38410 28 222 78 +FUNC 38438 124 0 MinidumpMemoryRangeTest_GetDataWithTemplateType_Test::TestBody +38438 2 193 78 +3843a 2 70 55 +3843c 2 193 78 +3843e 4 70 55 +38442 2 72 55 +38444 8 99 55 +3844c 2 72 55 +3844e 4 99 55 +38452 2 196 78 +38454 2 195 78 +38456 6 196 78 +3845c 2 1481 82 +3845e 2 196 78 +38460 2 1481 82 +38462 8 1482 82 +3846a 14 1487 82 +3847e 6 196 78 +38484 6 302 82 +3848a a 196 78 +38494 2 196 78 +38496 8 196 78 +3849e 6 196 78 +384a4 8 196 78 +384ac 6 85 79 +384b2 6 196 78 +384b8 8 256 82 +384c0 a 99 55 +384ca 2 198 78 +384cc 2 197 78 +384ce 4 198 78 +384d2 2 1481 82 +384d4 2 198 78 +384d6 2 1481 82 +384d8 8 1482 82 +384e0 14 1487 82 +384f4 6 198 78 +384fa 6 302 82 +38500 a 198 78 +3850a 2 198 78 +3850c 8 198 78 +38514 6 198 78 +3851a 8 198 78 +38522 6 85 79 +38528 6 198 78 +3852e 6 256 82 +38534 28 199 78 +FUNC 3855c 18 0 AndroidUContext_SigmakOffset_Test::~AndroidUContext_SigmakOffset_Test +3855c 2 183 34 +3855e 16 183 34 +FUNC 38574 12 0 AndroidUContext_SigmakOffset_Test::~AndroidUContext_SigmakOffset_Test +38574 2 183 34 +38576 6 183 34 +3857c 6 183 34 +38582 4 183 34 +FUNC 38588 18 0 AndroidUContext_GRegsOffset_Test::~AndroidUContext_GRegsOffset_Test +38588 2 50 34 +3858a 16 50 34 +FUNC 385a0 12 0 AndroidUContext_GRegsOffset_Test::~AndroidUContext_GRegsOffset_Test +385a0 2 50 34 +385a2 6 50 34 +385a8 6 50 34 +385ae 4 50 34 +FUNC 385b4 20 0 testing::internal::TestFactoryImpl::CreateTest +385b4 2 486 85 +385b6 8 486 85 +385be 6 183 34 +385c4 2 486 85 +385c6 6 183 34 +385cc 8 486 85 +FUNC 385d4 20 0 testing::internal::TestFactoryImpl::CreateTest +385d4 2 486 85 +385d6 8 486 85 +385de 6 50 34 +385e4 2 486 85 +385e6 6 50 34 +385ec 8 486 85 +FUNC 385f4 60 0 AndroidUContext_GRegsOffset_Test::TestBody +385f4 4 50 34 +385f8 6 1482 82 +385fe 8 54 34 +38606 2 1144 87 +38608 6 298 82 +3860e 4 298 82 +38612 8 54 34 +3861a 2 54 34 +3861c a 54 34 +38626 6 54 34 +3862c 8 54 34 +38634 6 85 79 +3863a 6 54 34 +38640 6 256 82 +38646 e 181 34 +FUNC 38654 60 0 AndroidUContext_SigmakOffset_Test::TestBody +38654 4 183 34 +38658 6 1482 82 +3865e 8 184 34 +38666 2 1144 87 +38668 6 298 82 +3866e 4 298 82 +38672 8 184 34 +3867a 2 184 34 +3867c a 184 34 +38686 6 184 34 +3868c 8 184 34 +38694 6 85 79 +3869a 6 184 34 +386a0 6 256 82 +386a6 e 186 34 +FUNC 386b4 6 0 std::basic_streambuf >::_M_sputnc +386b4 6 209 134 +FUNC 386ba 20 0 std::basic_streambuf >::sputc +386ba 2 198 134 +386bc 4 200 134 +386c0 2 198 134 +386c2 4 200 134 +386c6 4 201 134 +386ca 2 199 134 +386cc 4 200 134 +386d0 6 199 134 +386d6 4 201 134 +FUNC 386da a6 0 std::basic_ostream >::_M_put_char +386da 2 300 126 +386dc 4 300 126 +386e0 a 181 127 +386ea 4 302 126 +386ee e 305 126 +386fc 4 307 126 +38700 2 309 126 +38702 2 310 126 +38704 8 309 126 +3870c 6 310 126 +38712 4 311 126 +38716 4 311 126 +3871a 2 312 126 +3871c 2 312 126 +3871e 6 312 126 +38724 a 312 126 +3872e 8 311 126 +38736 a 315 126 +38740 4 316 126 +38744 8 316 126 +3874c 8 316 126 +38754 6 316 126 +3875a 2 139 115 +3875c 2 319 126 +3875e 8 139 115 +38766 2 325 126 +38768 e 326 126 +38776 6 327 126 +3877c 4 328 126 +FUNC 38780 1bc 0 std::operator+, std::allocator > +38780 4 46 139 +38784 4 46 139 +38788 2 229 145 +3878a 2 46 139 +3878c 4 229 145 +38790 4 400 136 +38794 2 229 145 +38796 4 400 136 +3879a 2 608 135 +3879c 2 120 137 +3879e 2 481 106 +387a0 2 608 135 +387a2 8 600 135 +387aa 4 610 135 +387ae 6 347 106 +387b4 4 348 106 +387b8 2 613 135 +387ba 2 611 135 +387bc 2 613 135 +387be 2 612 135 +387c0 2 613 135 +387c2 6 101 108 +387c8 2 57 139 +387ca 4 470 136 +387ce 2 64 137 +387d0 4 74 137 +387d4 4 74 137 +387d8 4 74 137 +387dc 2 74 137 +387de 4 472 136 +387e2 8 473 136 +387ea 4 346 106 +387ee 6 347 106 +387f4 4 348 106 +387f8 4 352 106 +387fc 4 353 106 +38800 6 356 106 +38806 4 107 142 +3880a c 106 142 +38816 4 107 142 +3881a 2 107 142 +3881c 8 106 142 +38824 2 101 108 +38826 2 107 142 +38828 2 101 108 +3882a 6 478 136 +38830 4 479 136 +38834 2 160 137 +38836 2 164 137 +38838 8 165 137 +38840 4 482 136 +38844 2 232 145 +38846 2 483 136 +38848 2 107 142 +3884a 4 483 136 +3884e 2 107 142 +38850 6 106 142 +38856 6 101 108 +3885c a 485 136 +38866 4 197 135 +3886a 2 64 137 +3886c 2 198 135 +3886e 4 74 137 +38872 4 74 137 +38876 4 74 137 +3887a 2 74 137 +3887c 4 199 135 +38880 8 200 135 +38888 4 346 106 +3888c 6 347 106 +38892 4 348 106 +38896 4 352 106 +3889a 4 348 106 +3889e 4 356 106 +388a2 14 86 142 +388b6 8 86 142 +388be 1c 146 108 +388da 8 86 142 +388e2 6 146 108 +388e8 8 101 108 +388f0 8 205 135 +388f8 4 206 135 +388fc 2 160 137 +388fe 2 164 137 +38900 6 165 137 +38906 4 210 135 +3890a 6 86 142 +38910 8 86 142 +38918 6 146 108 +3891e a 101 108 +38928 2 232 145 +3892a 6 214 135 +38930 c 60 139 +FUNC 3893c 194 0 testing::internal::PrintCharAndCodeTo +3893c c 217 93 +38948 2 333 127 +3894a 2 217 93 +3894c 2 333 127 +3894e 4 217 93 +38952 2 333 127 +38954 2 217 93 +38956 4 333 127 +3895a 12 147 93 +3896c 8 333 127 +38974 8 147 93 +3897c 8 333 127 +38984 e 147 93 +38992 8 333 127 +3899a 8 147 93 +389a2 12 333 127 +389b4 4 187 93 +389b8 28 333 127 +389e0 4 138 93 +389e4 4 179 93 +389e8 8 305 127 +389f0 4 181 93 +389f4 a 183 93 +389fe 10 183 93 +38a0e 8 183 93 +38a16 c 156 137 +38a22 2 184 93 +38a24 a 333 127 +38a2e 2 226 93 +38a30 a 333 127 +38a3a 8 240 126 +38a42 4 233 93 +38a46 6 233 93 +38a4c 2 333 127 +38a4e 2 236 93 +38a50 8 333 127 +38a58 8 236 93 +38a60 8 236 93 +38a68 6 156 137 +38a6e a 333 127 +38a78 58 239 93 +FUNC 38ad0 4 0 testing::internal::PrintTo +38ad0 4 242 93 +FUNC 38ad4 11c 0 testing::internal::PrintAsCharLiteralTo +38ad4 e 146 93 +38ae2 2 147 93 +38ae4 6 146 93 +38aea e 147 93 +38af8 8 333 127 +38b00 8 147 93 +38b08 8 333 127 +38b10 e 147 93 +38b1e 8 333 127 +38b26 8 147 93 +38b2e 3a 333 127 +38b68 4 187 93 +38b6c 4 138 93 +38b70 4 179 93 +38b74 8 305 127 +38b7c 4 181 93 +38b80 a 183 93 +38b8a e 183 93 +38b98 8 183 93 +38ba0 c 156 137 +38bac 2 184 93 +38bae 42 188 93 +FUNC 38bf0 bc 0 testing::internal::PrintCharsAsStringTo +38bf0 4 262 93 +38bf4 2 262 93 +38bf6 2 333 127 +38bf8 2 262 93 +38bfa 4 333 127 +38bfe 2 262 93 +38c00 4 333 127 +38c04 2 266 93 +38c06 18 333 127 +38c1e 4 267 93 +38c22 4 268 93 +38c26 4 269 93 +38c2a a 154 98 +38c34 6 269 93 +38c3a c 193 93 +38c46 8 333 127 +38c4e 4 196 93 +38c52 8 333 127 +38c5a 4 199 93 +38c5e 8 201 93 +38c66 8 275 93 +38c6e 4 333 127 +38c72 4 278 93 +38c76 36 333 127 +FUNC 38cac e 0 testing::internal::PrintStringTo +38cac 6 354 93 +38cb2 2 400 136 +38cb4 6 355 93 +FUNC 38cba 12 0 testing::internal::HasNewFatalFailureHelper::ReportTestPartResult +38cba 4 103 94 +38cbe 6 104 94 +38cc4 8 105 94 +FUNC 38ccc 20 0 testing::internal::HasNewFatalFailureHelper::~HasNewFatalFailureHelper +38ccc 4 96 94 +38cd0 8 96 94 +38cd8 4 937 91 +38cdc 8 98 94 +38ce4 8 99 94 +FUNC 38cec 12 0 testing::internal::HasNewFatalFailureHelper::~HasNewFatalFailureHelper +38cec 2 96 94 +38cee 2 96 94 +38cf0 4 99 94 +38cf4 6 99 94 +38cfa 4 99 94 +FUNC 38d00 30 0 testing::internal::HasNewFatalFailureHelper::HasNewFatalFailureHelper +38d00 2 92 94 +38d02 2 89 94 +38d04 a 92 94 +38d0e 2 89 94 +38d10 4 937 91 +38d14 6 92 94 +38d1a 2 92 94 +38d1c 4 937 91 +38d20 8 93 94 +38d28 8 94 94 +FUNC 38d30 58 0 testing::TestPartResult::ExtractSummary +38d30 2 51 94 +38d32 4 51 94 +38d36 c 52 94 +38d42 2 112 137 +38d44 2 54 94 +38d46 2 481 106 +38d48 2 54 94 +38d4a 8 229 145 +38d52 a 379 136 +38d5c 4 107 142 +38d60 2 355 119 +38d62 8 324 136 +38d6a 6 107 142 +38d70 8 106 142 +38d78 2 107 142 +38d7a 2 101 108 +38d7c 2 325 136 +38d7e 2 101 108 +38d80 8 55 94 +FUNC 38d88 32 0 testing::TestPartResult::TestPartResult +38d88 2 47 81 +38d8a 12 47 81 +38d9c 4 47 81 +38da0 2 47 81 +38da2 8 47 81 +38daa c 47 81 +38db6 4 47 81 +FUNC 38dbc 190 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +38dbc 6 81 143 +38dc2 4 81 143 +38dc6 c 192 144 +38dd2 4 173 144 +38dd6 2 81 143 +38dd8 8 173 144 +38de0 8 41 143 +38de8 a 175 144 +38df2 4 176 144 +38df6 6 176 144 +38dfc 2 176 144 +38dfe 4 347 106 +38e02 2 158 106 +38e04 2 347 106 +38e06 2 158 106 +38e08 6 134 124 +38e0e 8 158 106 +38e16 8 352 106 +38e1e 4 91 143 +38e22 2 84 142 +38e24 e 86 142 +38e32 4 86 142 +38e36 6 139 108 +38e3c 8 139 108 +38e44 4 88 142 +38e48 4 89 142 +38e4c e 86 142 +38e5a a 93 143 +38e64 2 119 108 +38e66 8 119 108 +38e6e 6 95 143 +38e74 a 314 142 +38e7e 8 249 142 +38e86 6 249 142 +38e8c 2 139 108 +38e8e 8 139 108 +38e96 8 249 142 +38e9e 6 98 143 +38ea4 2 86 142 +38ea6 2 84 142 +38ea8 c 86 142 +38eb4 6 86 142 +38eba 6 139 108 +38ec0 8 139 108 +38ec8 4 88 142 +38ecc 4 89 142 +38ed0 10 86 142 +38ee0 8 65 118 +38ee8 2 74 118 +38eea 4 191 108 +38eee 14 156 137 +38f02 2 81 118 +38f04 4 156 137 +38f08 4 81 118 +38f0c 6 662 144 +38f12 2 319 106 +38f14 4 161 106 +38f18 6 135 124 +38f1e 4 161 106 +38f22 6 104 143 +38f28 4 667 144 +38f2c 2 668 144 +38f2e 6 105 143 +38f34 6 346 106 +38f3a 12 356 106 +FUNC 38f4c 8 0 std::ios_base::precision +38f4c 2 130 115 +38f4e 2 131 115 +38f50 2 132 115 +38f52 2 134 115 +FUNC 38f54 8 0 std::ios_base::width +38f54 2 137 115 +38f56 2 138 115 +38f58 2 139 115 +38f5a 2 141 115 +FUNC 38f5c a 0 testing::internal::DeleteThreadLocalValue +38f5c 2 1989 87 +38f5e 8 1989 87 +FUNC 38f66 a 0 testing::Test::DeleteSelf_ +38f66 2 453 82 +38f68 2 453 82 +38f6a 6 453 82 +FUNC 38f70 4 0 testing::TestCase::RunSetUpTestCase +38f70 4 879 82 +FUNC 38f74 4 0 testing::TestCase::RunTearDownTestCase +38f74 4 883 82 +FUNC 38f78 e 0 testing::TestCase::TestReportableDisabled +38f78 4 696 82 +38f7c 2 898 82 +38f7e 4 898 82 +38f82 4 899 82 +FUNC 38f86 6 0 testing::TestCase::TestReportable +38f86 6 909 82 +FUNC 38f8c 6 0 testing::TestCase::ShouldRunTest +38f8c 6 914 82 +FUNC 38f92 2 0 testing::EmptyTestEventListener::OnTestProgramStart +38f92 2 1038 82 +FUNC 38f94 2 0 testing::EmptyTestEventListener::OnTestIterationStart +38f94 2 1039 82 +FUNC 38f96 2 0 testing::EmptyTestEventListener::OnEnvironmentsSetUpStart +38f96 2 1041 82 +FUNC 38f98 2 0 testing::EmptyTestEventListener::OnEnvironmentsSetUpEnd +38f98 2 1042 82 +FUNC 38f9a 2 0 testing::EmptyTestEventListener::OnTestCaseStart +38f9a 2 1043 82 +FUNC 38f9c 2 0 testing::EmptyTestEventListener::OnTestStart +38f9c 2 1044 82 +FUNC 38f9e 2 0 testing::EmptyTestEventListener::OnTestPartResult +38f9e 2 1045 82 +FUNC 38fa0 2 0 testing::EmptyTestEventListener::OnTestEnd +38fa0 2 1046 82 +FUNC 38fa2 2 0 testing::EmptyTestEventListener::OnTestCaseEnd +38fa2 2 1047 82 +FUNC 38fa4 2 0 testing::EmptyTestEventListener::OnEnvironmentsTearDownStart +38fa4 2 1048 82 +FUNC 38fa6 2 0 testing::EmptyTestEventListener::OnEnvironmentsTearDownEnd +38fa6 2 1049 82 +FUNC 38fa8 2 0 testing::EmptyTestEventListener::OnTestProgramEnd +38fa8 2 1052 82 +FUNC 38faa 6 0 testing::internal::ShouldRunTestCase +38faa 6 348 95 +FUNC 38fb0 2 0 testing::internal::OsStackTraceGetter::UponLeavingGTest +38fb0 2 3802 95 +FUNC 38fb2 6 0 testing::internal::SetUpEnvironment +38fb2 6 4486 95 +FUNC 38fb8 6 0 testing::internal::TearDownEnvironment +38fb8 6 4487 95 +FUNC 38fbe a 0 testing::internal::Delete +FUNC 38fbe a 0 testing::internal::Delete +38fbe 2 340 91 +38fc0 8 340 91 +FUNC 38fbe a 0 testing::internal::Delete +FUNC 38fc8 2c 0 testing::internal::TestEventRepeater::OnTestProgramStart +38fc8 2 3263 95 +38fca c 3263 95 +38fd6 6 192 144 +38fdc 6 3263 95 +38fe2 12 3263 95 +FUNC 38ff4 2c 0 testing::internal::TestEventRepeater::OnEnvironmentsSetUpStart +38ff4 2 3264 95 +38ff6 c 3264 95 +39002 6 192 144 +39008 6 3264 95 +3900e 12 3264 95 +FUNC 39020 2c 0 testing::internal::TestEventRepeater::OnTestCaseStart +39020 2 3265 95 +39022 c 3265 95 +3902e 6 192 144 +39034 6 3265 95 +3903a 12 3265 95 +FUNC 3904c 2c 0 testing::internal::TestEventRepeater::OnTestStart +3904c 2 3266 95 +3904e c 3266 95 +3905a 6 192 144 +39060 6 3266 95 +39066 12 3266 95 +FUNC 39078 2c 0 testing::internal::TestEventRepeater::OnTestPartResult +39078 2 3267 95 +3907a c 3267 95 +39086 6 192 144 +3908c 6 3267 95 +39092 12 3267 95 +FUNC 390a4 2c 0 testing::internal::TestEventRepeater::OnEnvironmentsTearDownStart +390a4 2 3268 95 +390a6 c 3268 95 +390b2 6 192 144 +390b8 6 3268 95 +390be 12 3268 95 +FUNC 390d0 2e 0 testing::internal::TestEventRepeater::OnEnvironmentsSetUpEnd +390d0 2 3269 95 +390d2 8 3269 95 +390da 8 192 144 +390e2 4 3269 95 +390e6 4 3269 95 +390ea 2 202 144 +390ec 12 3269 95 +FUNC 390fe 2e 0 testing::internal::TestEventRepeater::OnEnvironmentsTearDownEnd +390fe 2 3270 95 +39100 8 3270 95 +39108 8 192 144 +39110 4 3270 95 +39114 4 3270 95 +39118 2 202 144 +3911a 12 3270 95 +FUNC 3912c 2e 0 testing::internal::TestEventRepeater::OnTestEnd +3912c 2 3271 95 +3912e 8 3271 95 +39136 8 192 144 +3913e 4 3271 95 +39142 4 3271 95 +39146 2 202 144 +39148 12 3271 95 +FUNC 3915a 2e 0 testing::internal::TestEventRepeater::OnTestCaseEnd +3915a 2 3272 95 +3915c 8 3272 95 +39164 8 192 144 +3916c 4 3272 95 +39170 4 3272 95 +39174 2 202 144 +39176 12 3272 95 +FUNC 39188 2e 0 testing::internal::TestEventRepeater::OnTestProgramEnd +39188 2 3273 95 +3918a 8 3273 95 +39192 8 192 144 +3919a 4 3273 95 +3919e 4 3273 95 +391a2 2 202 144 +391a4 12 3273 95 +FUNC 391b6 30 0 testing::internal::TestEventRepeater::OnTestIterationStart +391b6 2 3279 95 +391b8 2 3280 95 +391ba 6 3279 95 +391c0 6 3280 95 +391c6 6 192 144 +391cc 6 3281 95 +391d2 4 3282 95 +391d6 2 3282 95 +391d8 2 3282 95 +391da 6 3282 95 +391e0 6 3281 95 +FUNC 391e6 36 0 testing::internal::TestEventRepeater::OnTestIterationEnd +391e6 4 3288 95 +391ea 2 3289 95 +391ec 6 3288 95 +391f2 2 3289 95 +391f4 8 192 144 +391fc 4 3290 95 +39200 4 3290 95 +39204 2 202 144 +39206 2 3291 95 +39208 2 3291 95 +3920a 2 3291 95 +3920c 2 3291 95 +3920e 2 3290 95 +39210 c 3291 95 +FUNC 3921c 44 0 testing::internal::PrintOnOneLine +3921c 2 4788 95 +3921e 4 4789 95 +39222 6 4796 95 +39228 6 4790 95 +3922e 4 4791 95 +39232 2 4792 95 +39234 4 4804 95 +39238 6 4792 95 +3923e 4 4795 95 +39242 6 4796 95 +39248 4 4797 95 +3924c 4 4799 95 +39250 10 4800 95 +FUNC 39260 2e 0 testing::internal::SumOverTestCaseList +39260 2 325 95 +39262 2 328 95 +39264 2 325 95 +39266 2 327 95 +39268 6 325 95 +3926e 6 192 144 +39274 6 328 95 +3927a 8 329 95 +39282 2 328 95 +39284 4 329 95 +39288 6 332 95 +FUNC 39290 20 0 testing::internal::StreamingListener::~StreamingListener +39290 2 1044 91 +39292 a 1044 91 +3929c 4 1153 87 +392a0 6 1155 87 +392a6 a 1044 91 +FUNC 392b0 12 0 testing::internal::StreamingListener::~StreamingListener +392b0 2 1044 91 +392b2 6 1044 91 +392b8 6 1044 91 +392be 4 1044 91 +FUNC 392c4 34 0 std::allocator::_M_allocate +392c4 4 342 106 +392c8 2 341 106 +392ca 2 341 106 +392cc 2 342 106 +392ce 8 343 106 +392d6 4 343 106 +392da 2 346 106 +392dc 8 347 106 +392e4 4 348 106 +392e8 6 352 106 +392ee a 357 106 +FUNC 392f8 2c 0 std::setprecision +392f8 2 119 112 +392fa 2 120 112 +392fc 2 119 112 +392fe a 120 112 +39308 a 119 112 +39312 4 39 112 +39316 2 122 112 +39318 2 39 112 +3931a a 122 112 +FUNC 39324 54 0 testing::internal::UnitTestOptions::PatternMatchesString +39324 2 445 95 +39326 6 445 95 +3932c 18 446 95 +39344 a 449 95 +3934e 6 451 95 +39354 6 453 95 +3935a 6 453 95 +39360 6 453 95 +39366 6 456 95 +3936c 4 457 95 +39370 6 451 95 +39376 2 459 95 +FUNC 39378 24 0 testing::internal::UnitTestOptions::MatchesFilter +39378 2 462 95 +3937a 4 462 95 +3937e 8 465 95 +39386 4 465 95 +3938a 8 470 95 +39392 2 473 95 +39394 2 478 95 +39396 2 479 95 +39398 4 480 95 +FUNC 3939c c 0 testing::internal::GetTestTypeId +3939c c 604 95 +FUNC 393a8 24 0 testing::internal::UnitTestImpl::successful_test_count +393a8 2 733 95 +393aa 16 734 95 +393c0 c 735 95 +FUNC 393cc 24 0 testing::internal::UnitTestImpl::failed_test_count +393cc 2 738 95 +393ce 16 739 95 +393e4 c 740 95 +FUNC 393f0 24 0 testing::internal::UnitTestImpl::reportable_disabled_test_count +393f0 2 743 95 +393f2 16 745 95 +39408 c 746 95 +FUNC 39414 24 0 testing::internal::UnitTestImpl::reportable_test_count +39414 2 754 95 +39416 16 755 95 +3942c c 756 95 +FUNC 39438 24 0 testing::internal::UnitTestImpl::test_to_run_count +39438 2 764 95 +3943a 16 765 95 +39450 c 766 95 +FUNC 3945c 24 0 testing::internal::GetTimeInMillis +3945c 2 784 95 +3945e 8 820 95 +39466 16 821 95 +3947c 4 825 95 +FUNC 39480 1c 0 testing::internal::String::CStringEquals +39480 2 872 95 +39482 2 873 95 +39484 6 873 95 +3948a 2 875 95 +3948c c 877 95 +39498 2 875 95 +3949a 2 878 95 +FUNC 3949c a 0 testing::AssertionSuccess +3949c 4 277 82 +394a0 4 1139 87 +394a4 2 973 95 +FUNC 394a6 8 0 testing::AssertionFailure +394a6 4 277 82 +394aa 2 1139 87 +394ac 2 978 95 +FUNC 394ae 1c 0 testing::internal::String::CaseInsensitiveCStringEquals +394ae 2 1866 95 +394b0 2 1867 95 +394b2 6 1868 95 +394b8 2 1869 95 +394ba 4 2274 87 +394be 8 1871 95 +394c6 2 1870 95 +394c8 2 1872 95 +FUNC 394cc 34 0 testing::TestResult::GetTestPartResult +394cc 2 1991 95 +394ce 2 1990 95 +394d0 2 1991 95 +394d2 c 192 144 +394de 4 1991 95 +394e2 2 167 144 +394e4 8 45 143 +394ec 4 2340 87 +394f0 6 203 144 +394f6 a 1994 95 +FUNC 39500 34 0 testing::TestResult::GetTestProperty +39500 2 2000 95 +39502 2 1999 95 +39504 2 2000 95 +39506 c 192 144 +39512 4 2000 95 +39516 2 167 144 +39518 8 45 143 +39520 4 2340 87 +39524 6 203 144 +3952a a 2003 95 +FUNC 39534 34 0 testing::TestResult::Failed +39534 2 2131 95 +39536 2 2131 95 +39538 2 2132 95 +3953a c 192 144 +39546 4 2132 95 +3954a c 2133 95 +39556 4 2132 95 +3955a 4 2136 95 +3955e 2 2134 95 +39560 8 2137 95 +FUNC 39568 10 0 testing::TestCase::TestFailed +39568 4 689 82 +3956c 2 892 82 +3956e 6 892 82 +39574 4 893 82 +FUNC 39578 18 0 testing::TestCase::TestPassed +39578 2 886 82 +3957a 4 689 82 +3957e 2 887 82 +39580 6 540 82 +39586 6 887 82 +3958c 4 888 82 +FUNC 39590 20 0 testing::TestResult::HasFatalFailure +39590 4 2145 95 +39594 2 285 91 +39596 4 286 91 +3959a 2 287 91 +3959c 2 286 91 +3959e 2 287 91 +395a0 6 288 91 +395a6 a 2147 95 +FUNC 395b0 20 0 testing::TestResult::HasNonfatalFailure +395b0 4 2155 95 +395b4 2 285 91 +395b6 4 286 91 +395ba 2 287 91 +395bc 2 286 91 +395be 2 287 91 +395c0 6 288 91 +395c6 a 2157 95 +FUNC 395d0 26 0 testing::internal::UnitTestImpl::RegisterParameterizedTests +395d0 2 2571 95 +395d2 4 2573 95 +395d6 2 2571 95 +395d8 4 2573 95 +395dc 6 600 86 +395e2 c 602 86 +395ee 8 2575 95 +FUNC 395f6 18 0 testing::TestCase::UnshuffleTests +395f6 2 2753 95 +395f8 6 192 144 +395fe 6 2753 95 +39604 4 2754 95 +39608 4 2753 95 +3960c 2 2756 95 +FUNC 39610 30 0 testing::internal::GetAnsiColorCode +39610 c 2859 95 +3961c 4 2863 95 +39620 6 2861 95 +39626 6 2862 95 +3962c 4 2860 95 +39630 10 2865 95 +FUNC 39640 f8 0 testing::internal::ShouldUseColor +39640 4 2870 95 +39644 6 2873 95 +3964a 2 2870 95 +3964c c 2873 95 +39658 8 2328 87 +39660 2 2882 95 +39662 2 2328 87 +39664 6 2882 95 +3966a 4 2887 95 +3966e a 2883 95 +39678 4 2882 95 +3967c a 2884 95 +39686 4 2883 95 +3968a a 2885 95 +39694 2 2884 95 +39696 a 2886 95 +396a0 2 2885 95 +396a2 a 2887 95 +396ac 2 2886 95 +396ae a 2888 95 +396b8 4 2887 95 +396bc a 2893 95 +396c6 2 2895 95 +396c8 4 2895 95 +396cc a 2894 95 +396d6 4 2893 95 +396da a 2895 95 +396e4 4 2894 95 +396e8 4 2896 95 +396ec 4 2900 95 +396f0 6 2896 95 +396f6 4 2889 95 +396fa 2 2889 95 +396fc 3c 2900 95 +FUNC 39738 90 0 testing::internal::ColoredPrintf +39738 4 2906 95 +3973c 2 2915 95 +3973e 6 2906 95 +39744 2 2915 95 +39746 2 2908 95 +39748 2 2915 95 +3974a 2 2906 95 +3974c a 2915 95 +39756 8 2271 87 +3975e a 2915 95 +39768 a 2915 95 +39772 8 2916 95 +3977a 2 2916 95 +3977c a 2921 95 +39786 8 2947 95 +3978e 8 2947 95 +39796 8 2948 95 +3979e 8 2949 95 +397a6 22 2952 95 +FUNC 397c8 30 0 testing::internal::PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart +397c8 2 3043 95 +397ca 2 3042 95 +397cc 8 3043 95 +397d4 8 3044 95 +397dc 4 3046 95 +397e0 2 3044 95 +397e2 16 3045 95 +FUNC 397f8 3c 0 testing::internal::PrettyUnitTestResultPrinter::OnTestStart +397f8 2 3061 95 +397fa 2 3061 95 +397fc a 3062 95 +39806 c 2983 95 +39812 6 3064 95 +39818 4 3066 95 +3981c 2 3064 95 +3981e 16 3065 95 +FUNC 39834 30 0 testing::internal::PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart +39834 2 3113 95 +39836 2 3112 95 +39838 8 3113 95 +39840 8 3114 95 +39848 4 3116 95 +3984c 2 3114 95 +3984e 16 3115 95 +FUNC 39864 68 0 testing::internal::PrintFullTestCommentIfPresent +39864 2 2959 95 +39866 2 1144 87 +39868 4 660 82 +3986c 2 1144 87 +3986e 4 668 82 +39872 2 2963 95 +39874 2 2963 95 +39876 8 2964 95 +3987e 2 2965 95 +39880 e 2966 95 +3988e 2 2967 95 +39890 a 2968 95 +3989a 2 2970 95 +3989c 6 2971 95 +398a2 4 2974 95 +398a6 8 2971 95 +398ae 1e 2963 95 +FUNC 398cc 3a 0 testing::internal::TestEventRepeater::Release +398cc 2 3231 95 +398ce 2 3232 95 +398d0 2 3231 95 +398d2 4 192 144 +398d6 2 3231 95 +398d8 4 192 144 +398dc 4 3232 95 +398e0 2 202 144 +398e2 8 3233 95 +398ea 6 580 144 +398f0 4 269 105 +398f4 8 584 144 +398fc 4 3232 95 +39900 2 3239 95 +39902 4 3240 95 +FUNC 39908 2c 0 testing::TestEventListeners::TestEventListeners +39908 2 3842 95 +3990a 2 3842 95 +3990c 6 3845 95 +39912 c 3188 95 +3991e 6 67 144 +39924 2 481 106 +39926 6 3845 95 +3992c 8 3846 95 +FUNC 39934 12 0 google_breakpad::scoped_ptr::~scoped_ptr +39934 2 96 57 +39936 2 96 57 +39938 4 98 57 +3993c 6 98 57 +39942 4 99 57 +FUNC 39934 12 0 testing::TestEventListeners::~TestEventListeners +39934 2 3848 95 +39936 6 3848 95 +3993c 2 3848 95 +3993e 4 3848 95 +39942 4 3848 95 +FUNC 39946 1c 0 testing::TestEventListeners::Release +39946 6 3862 95 +3994c 6 3863 95 +39952 4 3864 95 +39956 6 3865 95 +3995c 6 3866 95 +FUNC 39962 8 0 testing::TestEventListeners::SuppressEventForwarding +39962 2 3196 95 +39964 2 3912 95 +39966 4 3196 95 +FUNC 3996a c 0 testing::UnitTest::total_test_case_count +3996a 2 1280 82 +3996c 6 192 144 +39972 4 3958 95 +FUNC 39976 6 0 testing::UnitTest::successful_test_count +39976 6 3968 95 +FUNC 3997c 6 0 testing::UnitTest::failed_test_count +3997c 6 3972 95 +FUNC 39982 6 0 testing::UnitTest::reportable_disabled_test_count +39982 6 3976 95 +FUNC 39988 6 0 testing::UnitTest::reportable_test_count +39988 6 3986 95 +FUNC 3998e 6 0 testing::UnitTest::test_to_run_count +3998e 6 3993 95 +FUNC 39994 6 0 testing::UnitTest::original_working_dir +39994 2 4217 95 +39996 4 4219 95 +FUNC 3999a 10 0 testing::internal::UnitTestImpl::SuppressTestEventsIfInSubprocess +3999a 6 4345 95 +399a0 2 3196 95 +399a2 4 3912 95 +399a6 4 3196 95 +FUNC 399aa 1a 0 testing::internal::TestCaseNameIs::operator() +399aa 2 4429 95 +399ac 2 4429 95 +399ae 2 4430 95 +399b0 8 4430 95 +399b8 8 4430 95 +399c0 2 4430 95 +399c2 2 4431 95 +FUNC 399c4 54 0 testing::internal::WriteToShardStatusFileIfNeeded +399c4 2 4635 95 +399c6 a 2328 87 +399d0 4 4637 95 +399d4 8 2298 87 +399dc 2 4639 95 +399de 10 4643 95 +399ee a 4644 95 +399f8 6 4645 95 +399fe 4 4649 95 +39a02 16 4647 95 +FUNC 39a18 f0 0 testing::internal::UnitTestImpl::ListTestsMatchingFilter +39a18 6 4807 95 +39a1e 2 4811 95 +39a20 2 4830 95 +39a22 2 4807 95 +39a24 4 4830 95 +39a28 2 4832 95 +39a2a 4 4823 95 +39a2e 6 4832 95 +39a34 2 4823 95 +39a36 4 4832 95 +39a3a 6 4821 95 +39a40 a 192 144 +39a4a 6 4811 95 +39a50 2 4815 95 +39a52 2 4813 95 +39a54 4 4823 95 +39a58 4 4812 95 +39a5c 2 4823 95 +39a5e 6 192 144 +39a64 6 4815 95 +39a6a 4 4817 95 +39a6e 6 4818 95 +39a74 2 4819 95 +39a76 8 4821 95 +39a7e 2 1144 87 +39a80 2 797 82 +39a82 4 4822 95 +39a86 8 4823 95 +39a8e 2 1144 87 +39a90 6 797 82 +39a96 2 799 82 +39a98 4 4826 95 +39a9c 6 4828 95 +39aa2 a 4830 95 +39aac 4 1144 87 +39ab0 2 668 82 +39ab2 4 4831 95 +39ab6 8 4832 95 +39abe 4 1144 87 +39ac2 4 668 82 +39ac6 4 4835 95 +39aca 8 4837 95 +39ad2 4 4815 95 +39ad6 6 4811 95 +39adc 6 4841 95 +39ae2 6 4842 95 +39ae8 20 4841 95 +FUNC 39b08 26 0 testing::internal::UnitTestImpl::UnshuffleTests +39b08 2 4892 95 +39b0a 2 4892 95 +39b0c 2 4893 95 +39b0e 6 192 144 +39b14 6 4893 95 +39b1a 8 4895 95 +39b22 2 202 144 +39b24 4 4897 95 +39b28 4 4893 95 +39b2c 2 4899 95 +FUNC 39b2e 4 0 __cxxabiv1::__si_class_type_info::code() const +39b2e 4 174 160 +FUNC 39b2e 4 0 google_breakpad::LinuxCoreDumper::IsPostMortem +39b2e 4 116 18 +FUNC 39b2e 4 0 google_breakpad::LinuxCoreDumper::ThreadsResume +FUNC 39b2e 4 0 google_breakpad::LinuxCoreDumper::ThreadsSuspend +FUNC 39b2e 4 0 std::codecvt::do_always_noconv() const +FUNC 39b2e 4 0 std::codecvt::do_encoding() const +FUNC 39b2e 4 0 std::codecvt::do_max_length() const +39b2e 4 37 177 +FUNC 39b2e 4 0 std::codecvt::do_always_noconv() const +FUNC 39b2e 4 0 std::codecvt::do_encoding() const +FUNC 39b2e 4 0 std::codecvt::do_max_length() const +FUNC 39b2e 4 0 testing::internal::AlwaysTrue +39b2e 4 4934 95 +FUNC 39b32 26 0 testing::internal::SkipPrefix +39b32 2 4939 95 +39b34 4 4939 95 +39b38 6 4940 95 +39b3e e 4941 95 +39b4c 4 4942 95 +39b50 4 4943 95 +39b54 2 4945 95 +39b56 2 4946 95 +FUNC 39b58 74 0 testing::internal::HasGoogleTestFlagPrefix +39b58 2 5043 95 +39b5a 6 5043 95 +39b60 a 5044 95 +39b6a 2 5047 95 +39b6c a 5047 95 +39b76 4 5046 95 +39b7a a 5045 95 +39b84 4 5044 95 +39b88 a 5046 95 +39b92 4 5045 95 +39b96 4 5047 95 +39b9a a 5048 95 +39ba4 2 5047 95 +39ba6 a 5049 95 +39bb0 1c 5050 95 +FUNC 39bcc 1c 0 testing::internal::GetElementOr +39bcc 2 303 91 +39bce 2 302 91 +39bd0 2 303 91 +39bd2 6 192 144 +39bd8 6 303 91 +39bde 6 303 91 +39be4 2 303 91 +39be6 2 304 91 +FUNC 39be8 1c 0 testing::TestCase::GetMutableTestInfo +FUNC 39be8 1c 0 testing::TestCase::GetTestInfo +39be8 2 2693 95 +39bea 4 2694 95 +39bee 2 2693 95 +39bf0 6 2701 95 +39bf6 2 2702 95 +39bf8 8 2695 95 +39c00 2 2695 95 +39c02 2 2696 95 +FUNC 39c04 20 0 testing::UnitTest::GetTestCase +39c04 2 4015 95 +39c06 2 1280 82 +39c08 8 587 91 +39c10 2 4015 95 +39c12 4 587 91 +39c16 2 588 91 +39c18 8 588 91 +39c20 2 588 91 +39c22 2 4017 95 +FUNC 39c24 24 0 testing::internal::CountIf, bool (*)(const testing::TestCase*)> +39c24 2 282 91 +39c26 4 282 91 +39c2a 4 285 91 +39c2e 8 286 91 +39c36 a 287 91 +39c40 4 288 91 +39c44 4 291 91 +FUNC 39c24 24 0 testing::internal::CountIf, bool (*)(const testing::TestInfo*)> +FUNC 39c48 10 0 testing::internal::UnitTestImpl::failed_test_case_count +39c48 10 718 95 +FUNC 39c58 1c 0 testing::internal::UnitTestImpl::Failed +39c58 2 580 91 +39c5a 2 580 91 +39c5c 8 581 91 +39c64 4 581 91 +39c68 4 582 91 +39c6c 4 581 91 +39c70 4 582 91 +FUNC 39c74 10 0 testing::UnitTest::Passed +39c74 2 4007 95 +39c76 a 576 91 +39c80 4 4007 95 +FUNC 39c84 10 0 testing::internal::UnitTestImpl::test_case_to_run_count +39c84 10 729 95 +FUNC 39c94 6 0 testing::UnitTest::test_case_to_run_count +39c94 6 3963 95 +FUNC 39c9a 2a 0 std::operator<< , int> +39c9a 2 80 112 +39c9c 2 80 112 +39c9e 2 82 112 +39ca0 2 42 112 +39ca2 4 82 112 +39ca6 4 42 112 +39caa 8 82 112 +39cb2 4 42 112 +39cb6 2 42 112 +39cb8 4 42 112 +39cbc 4 42 112 +39cc0 4 84 112 +FUNC 39cc4 14 0 std::priv::_Impl_vector >::~_Impl_vector +FUNC 39cc4 14 0 std::priv::_Impl_vector >::~_Impl_vector +FUNC 39cc4 14 0 std::priv::_Impl_vector >::~_Impl_vector +FUNC 39cc4 14 0 std::priv::_Vector_base >::~_Vector_base +FUNC 39cc4 14 0 std::priv::_Vector_base >::~_Vector_base +39cc4 2 86 144 +39cc6 4 304 144 +39cca 2 87 144 +39ccc 2 88 144 +39cce 6 323 106 +39cd4 4 304 144 +FUNC 39cc4 14 0 std::priv::_Vector_base >::~_Vector_base +FUNC 39cc4 14 0 std::priv::_Vector_base >::~_Vector_base +FUNC 39cc4 14 0 std::priv::_Vector_base >::~_Vector_base +39cc4 2 86 144 +39cc6 2 86 144 +39cc8 2 304 144 +39cca 2 87 144 +39ccc 2 88 144 +39cce 6 323 106 +39cd4 4 89 144 +FUNC 39cd8 2a 0 std::operator==, std::allocator > +39cd8 2 320 139 +39cda 2 320 139 +39cdc 2 229 145 +39cde 2 320 139 +39ce0 6 229 145 +39ce6 4 400 136 +39cea 4 324 139 +39cee 8 226 145 +39cf6 8 324 139 +39cfe 2 324 139 +39d00 2 325 139 +FUNC 39d04 10 0 testing::TestCase::successful_test_count +39d04 10 2632 95 +FUNC 39d14 10 0 testing::TestCase::failed_test_count +39d14 10 2637 95 +FUNC 39d24 18 0 testing::internal::TestCaseFailed +39d24 2 340 95 +39d26 4 803 82 +39d2a 2 341 95 +39d2c 4 830 82 +39d30 8 341 95 +39d38 4 342 95 +FUNC 39d3c 98 0 testing::internal::PrettyUnitTestResultPrinter::PrintFailedTests +39d3c 4 3119 95 +39d40 2 3119 95 +39d42 4 3120 95 +39d46 8 3121 95 +39d4e 4 3135 95 +39d52 4 3136 95 +39d56 2 3135 95 +39d58 2 3136 95 +39d5a 6 3125 95 +39d60 4 3125 95 +39d64 8 3126 95 +39d6c 4 3127 95 +39d70 2 3126 95 +39d72 2 3127 95 +39d74 4 3127 95 +39d78 4 3127 95 +39d7c 6 192 144 +39d82 6 3130 95 +39d88 8 3131 95 +39d90 4 3132 95 +39d94 2 3131 95 +39d96 2 3132 95 +39d98 6 540 82 +39d9e 2 3132 95 +39da0 4 3130 95 +39da4 8 3125 95 +39dac 8 3135 95 +39db4 a 3136 95 +39dbe 6 3137 95 +39dc4 10 3138 95 +FUNC 39dd4 10 0 testing::TestCase::reportable_disabled_test_count +39dd4 10 2642 95 +FUNC 39de4 10 0 testing::TestCase::reportable_test_count +39de4 10 2652 95 +FUNC 39df4 10 0 testing::TestCase::test_to_run_count +39df4 10 2657 95 +FUNC 39e04 c 0 std::basic_string, std::allocator >::~basic_string +39e04 2 121 136 +39e06 2 121 136 +39e08 4 156 137 +39e0c 4 121 136 +FUNC 39e10 18 0 testing::internal::AssertHelper::~AssertHelper +39e10 2 358 95 +39e12 2 358 95 +39e14 4 359 95 +39e18 6 156 137 +39e1e 6 359 95 +39e24 4 360 95 +FUNC 39e28 1c 0 testing::TestPartResult::~TestPartResult +39e28 2 47 81 +39e2a 2 47 81 +39e2c 14 156 137 +39e40 4 47 81 +FUNC 39e44 1c 0 testing::internal::XmlUnitTestResultPrinter::~XmlUnitTestResultPrinter +39e44 2 3299 95 +39e46 c 3299 95 +39e52 4 156 137 +39e56 a 3299 95 +FUNC 39e60 12 0 testing::internal::XmlUnitTestResultPrinter::~XmlUnitTestResultPrinter +39e60 2 3299 95 +39e62 6 3299 95 +39e68 6 3299 95 +39e6e 4 3299 95 +FUNC 39e72 2e 0 std::priv::_Impl_vector, std::allocator >, std::allocator, std::allocator > > >::~_Impl_vector +39e72 2 304 144 +39e74 2 304 144 +39e76 6 65 118 +39e7c 2 74 118 +39e7e 4 191 108 +39e82 2 121 136 +39e84 6 156 137 +39e8a 4 81 118 +39e8e 4 87 144 +39e92 2 88 144 +39e94 6 323 106 +39e9a 6 304 144 +FUNC 39ea0 28 0 testing::internal::scoped_ptr::reset +39ea0 2 1152 87 +39ea2 2 1153 87 +39ea4 2 1152 87 +39ea6 2 1153 87 +39ea8 2 1152 87 +39eaa 2 1153 87 +39eac 2 1155 87 +39eae 6 244 83 +39eb4 4 2314 87 +39eb8 6 156 137 +39ebe 6 1155 87 +39ec4 4 1157 87 +FUNC 39ec8 30 0 testing::internal::TestEventRepeater::~TestEventRepeater +39ec8 2 3222 95 +39eca e 3222 95 +39ed8 4 60 103 +39edc a 61 103 +39ee6 8 304 144 +39eee a 3224 95 +FUNC 39ef8 12 0 testing::internal::TestEventRepeater::~TestEventRepeater +39ef8 2 3222 95 +39efa 2 3222 95 +39efc 4 3224 95 +39f00 6 3224 95 +39f06 4 3224 95 +FUNC 39f0a 84 0 std::priv::_Impl_vector >::push_back +39f0a 4 376 144 +39f0e 4 380 144 +39f12 2 376 144 +39f14 2 380 144 +39f16 2 376 144 +39f18 4 380 144 +39f1c 2 126 108 +39f1e 8 382 144 +39f26 6 192 144 +39f2c 8 175 144 +39f34 6 176 144 +39f3a 4 176 144 +39f3e 4 176 144 +39f42 8 347 106 +39f4a 4 348 106 +39f4e 2 353 106 +39f50 4 352 106 +39f54 a 112 143 +39f5e c 481 105 +39f6a 4 657 144 +39f6e 2 319 106 +39f70 4 323 106 +39f74 4 118 143 +39f78 4 667 144 +39f7c 4 668 144 +39f80 4 346 106 +39f84 4 356 106 +39f88 6 388 144 +FUNC 39f0a 84 0 std::priv::_Impl_vector >::push_back +FUNC 39f90 3c 0 std::basic_string, std::allocator >::reserve +39f90 2 158 135 +39f92 4 159 135 +39f96 a 600 135 +39fa0 a 400 136 +39faa 2 72 137 +39fac 4 72 137 +39fb0 2 72 137 +39fb2 4 162 135 +39fb6 4 72 137 +39fba 4 163 135 +39fbe 4 167 135 +39fc2 a 166 135 +FUNC 39fcc 16 0 std::basic_string, std::allocator >::operator= +39fcc 2 348 136 +39fce 2 347 136 +39fd0 4 347 136 +39fd4 2 348 136 +39fd6 8 349 136 +39fde 4 351 136 +FUNC 39fe2 1e 0 std::priv::_Impl_vector >::clear +39fe2 6 650 144 +39fe8 2 630 144 +39fea 2 650 144 +39fec 4 630 144 +39ff0 2 57 108 +39ff2 2 191 108 +39ff4 4 57 108 +39ff8 4 191 108 +39ffc 4 615 144 +FUNC 3a000 38 0 testing::TestResult::Clear +3a000 2 2123 95 +3a002 2 2123 95 +3a004 a 228 148 +3a00e 6 630 144 +3a014 a 156 137 +3a01e 2 191 108 +3a020 4 156 137 +3a024 4 191 108 +3a028 2 615 144 +3a02a 2 2126 95 +3a02c 2 2127 95 +3a02e 2 2126 95 +3a030 8 2127 95 +FUNC 3a038 22 0 testing::TestCase::ClearResult +3a038 2 2741 95 +3a03a 2 2741 95 +3a03c a 2742 95 +3a046 6 60 103 +3a04c c 740 82 +3a058 2 2744 95 +FUNC 3a05c 14c 0 testing::Test::~Test +3a05c 4 2180 95 +3a060 2 2180 95 +3a062 2 2181 95 +3a064 8 2180 95 +3a06c 4 2181 95 +3a070 8 186 91 +3a078 8 187 91 +3a080 2 189 91 +3a082 4 188 91 +3a086 2 189 91 +3a088 2 188 91 +3a08a 4 189 91 +3a08e 2 188 91 +3a090 4 189 91 +3a094 12 190 91 +3a0a6 2 192 91 +3a0a8 8 191 91 +3a0b0 8 192 91 +3a0b8 2 191 91 +3a0ba 4 192 91 +3a0be 10 193 91 +3a0ce 2 194 91 +3a0d0 2 195 91 +3a0d2 4 194 91 +3a0d6 4 195 91 +3a0da 2 194 91 +3a0dc 4 195 91 +3a0e0 2 194 91 +3a0e2 4 195 91 +3a0e6 a 196 91 +3a0f0 a 197 91 +3a0fa a 198 91 +3a104 a 199 91 +3a10e 2 201 91 +3a110 6 200 91 +3a116 6 201 91 +3a11c 2 200 91 +3a11e 2 201 91 +3a120 2 200 91 +3a122 4 201 91 +3a126 8 202 91 +3a12e 2 156 137 +3a130 2 202 91 +3a132 22 156 137 +3a154 6 2181 95 +3a15a 4e 2182 95 +FUNC 3a1a8 a 0 std::basic_string, std::allocator >::append +3a1a8 2 516 136 +3a1aa 8 517 136 +FUNC 3a1b2 ac 0 std::priv::__find_if +3a1b2 4 159 104 +3a1b6 6 159 104 +3a1bc 4 162 104 +3a1c0 4 164 104 +3a1c4 c 165 104 +3a1d0 a 168 104 +3a1da 2 166 104 +3a1dc 4 168 104 +3a1e0 a 171 104 +3a1ea 4 169 104 +3a1ee 4 171 104 +3a1f2 a 174 104 +3a1fc 4 172 104 +3a200 6 174 104 +3a206 4 164 104 +3a20a 16 178 104 +3a220 a 180 104 +3a22a 2 181 104 +3a22c a 183 104 +3a236 2 184 104 +3a238 14 186 104 +3a24c e 190 104 +3a25a 4 192 104 +FUNC 3a25e 22 0 std::basic_string, std::allocator >::_M_range_initialize +3a25e 2 376 136 +3a260 6 376 136 +3a266 2 378 136 +3a268 6 379 136 +3a26e a 148 142 +3a278 2 101 108 +3a27a 2 380 136 +3a27c 4 101 108 +FUNC 3a280 30 0 testing::internal::AssertHelper::AssertHelper +3a280 4 351 95 +3a284 2 351 95 +3a286 2 355 95 +3a288 6 351 95 +3a28e 4 355 95 +3a292 2 1784 82 +3a294 2 355 95 +3a296 8 1784 82 +3a29e 8 1784 82 +3a2a6 2 356 95 +3a2a8 2 355 95 +3a2aa 6 356 95 +FUNC 3a2b0 18 0 testing::internal::UnitTestImpl::CurrentOsStackTraceExceptTop +3a2b0 2 778 95 +3a2b2 2 778 95 +3a2b4 a 780 95 +3a2be a 781 95 +FUNC 3a2c8 50 0 testing::internal::XmlUnitTestResultPrinter::XmlUnitTestResultPrinter +3a2c8 2 3372 95 +3a2ca 2 3372 95 +3a2cc 2 3373 95 +3a2ce 2 3373 95 +3a2d0 8 3373 95 +3a2d8 6 3373 95 +3a2de 2 3374 95 +3a2e0 6 3374 95 +3a2e6 14 3375 95 +3a2fa 6 3376 95 +3a300 6 3377 95 +3a306 12 3379 95 +FUNC 3a318 18 0 testing::internal::OsStackTraceGetter::CurrentStackTrace +3a318 2 3797 95 +3a31a 2 3797 95 +3a31c a 3798 95 +3a326 a 3799 95 +FUNC 3a330 88 0 std::priv::_Impl_vector, std::allocator >, std::allocator, std::allocator > > >::_M_range_initialize +3a330 4 699 144 +3a334 2 342 106 +3a336 4 355 119 +3a33a 2 342 106 +3a33c 6 699 144 +3a342 2 342 106 +3a344 8 343 106 +3a34c 4 343 106 +3a350 2 346 106 +3a352 a 347 106 +3a35c 4 348 106 +3a360 4 352 106 +3a364 2 348 106 +3a366 8 352 106 +3a36e 2 346 106 +3a370 2 356 106 +3a372 2 703 144 +3a374 2 84 142 +3a376 4 703 144 +3a37a 4 702 144 +3a37e 4 703 144 +3a382 4 139 108 +3a386 4 86 142 +3a38a 2 139 108 +3a38c a 139 108 +3a396 2 88 142 +3a398 a 89 142 +3a3a2 4 704 144 +3a3a6 12 705 144 +FUNC 3a3b8 12 0 testing::internal::FilePath::FilePath +3a3b8 2 64 84 +3a3ba 6 64 84 +3a3c0 6 65 84 +3a3c6 4 66 84 +FUNC 3a3cc 64 0 testing::internal::GetCurrentExecutableName +3a3cc c 381 95 +3a3d8 2 61 84 +3a3da 2 381 95 +3a3dc 8 61 84 +3a3e4 2 381 95 +3a3e6 4 61 84 +3a3ea c 387 95 +3a3f6 8 74 84 +3a3fe 6 156 137 +3a404 8 390 95 +3a40c 6 156 137 +3a412 1e 391 95 +FUNC 3a430 22 0 testing::AssertionResult::AssertionResult +3a430 2 948 95 +3a432 2 952 95 +3a434 2 948 95 +3a436 2 952 95 +3a438 2 1144 87 +3a43a 2 952 95 +3a43c 8 952 95 +3a444 6 951 95 +3a44a 2 952 95 +3a44c 2 1139 87 +3a44e 4 953 95 +FUNC 3a452 2c 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, unsigned int>, std::priv::_Select1st, std::allocator >, unsigned int> >, std::priv::_MapTraitsT, std::allocator >, unsigned int> >, std::allocator, std::allocator >, unsigned int> > >::_M_create_node +3a452 2 315 141 +3a454 2 306 106 +3a456 2 315 141 +3a458 6 306 106 +3a45e 6 307 106 +3a464 4 119 108 +3a468 a 68 129 +3a472 2 321 141 +3a474 2 324 141 +3a476 2 321 141 +3a478 2 322 141 +3a47a 4 324 141 +FUNC 3a480 34 0 std::basic_string, std::allocator >::basic_string +3a480 2 183 136 +3a482 2 183 136 +3a484 2 112 137 +3a486 4 481 106 +3a48a 4 400 136 +3a48e 4 205 136 +3a492 8 604 135 +3a49a a 209 136 +3a4a4 8 208 136 +3a4ac 8 210 136 +FUNC 3a4b4 44 0 testing::internal::UnitTestOptions::GetOutputFormat +3a4b4 4 396 95 +3a4b8 6 396 95 +3a4be 2 398 95 +3a4c0 6 398 95 +3a4c6 8 400 95 +3a4ce 4 403 95 +3a4d2 c 403 95 +3a4de 2 112 137 +3a4e0 2 481 106 +3a4e2 8 225 136 +3a4ea e 404 95 +FUNC 3a4f8 44 0 testing::internal::XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters +3a4f8 2 3473 95 +3a4fa 4 3473 95 +3a4fe 6 3474 95 +3a504 4 400 136 +3a508 a 3475 95 +3a512 6 3476 95 +3a518 4 3477 95 +3a51c 8 3309 95 +3a524 4 3309 95 +3a528 8 3478 95 +3a530 6 3314 95 +3a536 6 3481 95 +FUNC 3a53c 80 0 testing::internal::StringStreamToString +3a53c e 1943 95 +3a54a 2 1943 95 +3a54c 6 75 132 +3a552 2 1943 95 +3a554 a 75 132 +3a55e 2 1948 95 +3a560 4 400 136 +3a564 6 1948 95 +3a56a a 1949 95 +3a574 a 530 136 +3a57e 4 1950 95 +3a582 4 1951 95 +3a586 2 530 136 +3a588 2 1951 95 +3a58a a 530 136 +3a594 6 453 136 +3a59a 6 156 137 +3a5a0 1c 1959 95 +FUNC 3a5bc e 0 testing::Message::GetString +3a5bc 2 942 95 +3a5be 2 942 95 +3a5c0 6 943 95 +3a5c6 4 944 95 +FUNC 3a5ca 2e 0 testing::Message::Message +3a5ca 2 907 95 +3a5cc a 907 95 +3a5d6 2 910 95 +3a5d8 6 907 95 +3a5de 2 910 95 +3a5e0 2 1139 87 +3a5e2 6 910 95 +3a5e8 a 910 95 +3a5f2 6 911 95 +FUNC 3a5f8 160 0 testing::Test::Test +3a5f8 4 2175 95 +3a5fc 2 2176 95 +3a5fe 2 2175 95 +3a600 6 2176 95 +3a606 2 2175 95 +3a608 8 2176 95 +3a610 2 164 91 +3a612 4 164 91 +3a616 2 164 91 +3a618 4 164 91 +3a61c 6 164 91 +3a622 4 164 91 +3a626 8 164 91 +3a62e 4 164 91 +3a632 8 164 91 +3a63a 4 164 91 +3a63e 8 164 91 +3a646 8 164 91 +3a64e 4 164 91 +3a652 4 164 91 +3a656 2 164 91 +3a658 4 164 91 +3a65c 2 165 91 +3a65e 2 168 91 +3a660 4 165 91 +3a664 2 168 91 +3a666 2 165 91 +3a668 2 166 91 +3a66a 2 168 91 +3a66c 6 166 91 +3a672 8 167 91 +3a67a 4 168 91 +3a67e e 169 91 +3a68c 2 171 91 +3a68e 6 170 91 +3a694 2 171 91 +3a696 4 170 91 +3a69a 6 171 91 +3a6a0 c 172 91 +3a6ac 2 173 91 +3a6ae 2 174 91 +3a6b0 4 173 91 +3a6b4 2 174 91 +3a6b6 4 173 91 +3a6ba 6 174 91 +3a6c0 2 175 91 +3a6c2 2 180 91 +3a6c4 4 175 91 +3a6c8 2 180 91 +3a6ca 4 175 91 +3a6ce 2 176 91 +3a6d0 2 180 91 +3a6d2 8 176 91 +3a6da a 177 91 +3a6e4 a 178 91 +3a6ee a 179 91 +3a6f8 4 180 91 +3a6fc 2 2177 95 +3a6fe a 181 91 +3a708 2 2176 95 +3a70a 4e 2177 95 +FUNC 3a758 d0 0 testing::internal::PrintColorEncoded +3a758 6 5063 95 +3a75e 2 5064 95 +3a760 4 5063 95 +3a764 2 5064 95 +3a766 2 5063 95 +3a768 4 5077 95 +3a76c 4 5082 95 +3a770 2 5063 95 +3a772 2 5063 95 +3a774 2 5064 95 +3a776 2 5077 95 +3a778 2 5082 95 +3a77a 8 5071 95 +3a782 4 5072 95 +3a786 c 5073 95 +3a792 c 5095 95 +3a79e 4 112 137 +3a7a2 2 355 119 +3a7a4 4 324 136 +3a7a8 4 112 137 +3a7ac 4 481 106 +3a7b0 4 324 136 +3a7b4 a 148 142 +3a7be 4 101 108 +3a7c2 2 325 136 +3a7c4 4 101 108 +3a7c8 a 5077 95 +3a7d2 6 156 137 +3a7d8 2 5079 95 +3a7da 2 5080 95 +3a7dc 4 5081 95 +3a7e0 a 5082 95 +3a7ea 4 5083 95 +3a7ee 4 5084 95 +3a7f2 4 5085 95 +3a7f6 4 5086 95 +3a7fa 4 5087 95 +3a7fe 4 5088 95 +3a802 4 5089 95 +3a806 4 5090 95 +3a80a 4 5092 95 +3a80e 1a 5095 95 +FUNC 3a828 a4 0 testing::internal::String::FormatByte +3a828 6 1934 95 +3a82e 4 1934 95 +3a832 2 1935 95 +3a834 6 1934 95 +3a83a 4 1935 95 +3a83e 2 1934 95 +3a840 4 1935 95 +3a844 2 147 112 +3a846 e 84 114 +3a854 2 126 112 +3a856 2 39 112 +3a858 12 126 112 +3a86a 6 39 112 +3a870 4 1936 95 +3a874 2 39 112 +3a876 4 1936 95 +3a87a 8 79 127 +3a882 6 123 115 +3a888 6 124 115 +3a88e 2 79 127 +3a890 2 254 126 +3a892 6 79 127 +3a898 8 118 115 +3a8a0 4 254 126 +3a8a4 8 75 132 +3a8ac 6 1938 95 +3a8b2 1a 1939 95 +FUNC 3a8cc e8 0 testing::internal::Random::Generate +3a8cc 2 295 95 +3a8ce 4 297 95 +3a8d2 2 295 95 +3a8d4 e 297 95 +3a8e2 4 299 95 +3a8e6 14 299 95 +3a8fa 16 333 127 +3a910 6 301 95 +3a916 14 301 95 +3a92a 18 333 127 +3a942 a 254 126 +3a94c 12 333 127 +3a95e a 254 126 +3a968 8 333 127 +3a970 6 301 95 +3a976 8 308 95 +3a97e 36 309 95 +FUNC 3a9b4 1c 0 testing::Message::operator<< +3a9b4 2 149 79 +3a9b6 4 149 79 +3a9ba 2 333 127 +3a9bc 2 150 79 +3a9be 8 333 127 +3a9c6 a 156 79 +FUNC 3a9d0 5c 0 testing::internal::StreamingListener::SocketWriter::CloseConnection +3a9d0 2 1094 91 +3a9d2 2 1095 91 +3a9d4 2 1094 91 +3a9d6 4 1095 91 +3a9da 14 1095 91 +3a9ee 18 333 127 +3aa06 6 1095 91 +3aa0c 6 1098 91 +3aa12 6 1099 91 +3aa18 14 1100 91 +FUNC 3aa2c 30 0 testing::internal::StreamingListener::SocketWriter::~SocketWriter +3aa2c 2 1071 91 +3aa2e a 1071 91 +3aa38 6 1072 91 +3aa3e 4 1073 91 +3aa42 10 156 137 +3aa52 a 1074 91 +FUNC 3aa5c 12 0 testing::internal::StreamingListener::SocketWriter::~SocketWriter +3aa5c 2 1071 91 +3aa5e 2 1071 91 +3aa60 4 1074 91 +3aa64 6 1074 91 +3aa6a 4 1074 91 +FUNC 3aa70 38 0 testing::internal::StreamableToString +3aa70 2 243 79 +3aa72 2 243 79 +3aa74 2 244 79 +3aa76 2 243 79 +3aa78 a 244 79 +3aa82 2 333 127 +3aa84 2 150 79 +3aa86 8 333 127 +3aa8e 8 244 79 +3aa96 6 85 79 +3aa9c c 245 79 +FUNC 3aaa8 50 0 testing::internal::Int32FromEnvOrDie +3aaa8 2 4702 95 +3aaaa 4 4702 95 +3aaae 4 2328 87 +3aab2 4 4704 95 +3aab6 8 4709 95 +3aabe c 333 127 +3aaca 8 4709 95 +3aad2 a 4710 95 +3aadc 6 85 79 +3aae2 2 4709 95 +3aae4 6 4711 95 +3aaea 4 4713 95 +3aaee 2 4705 95 +3aaf0 8 4714 95 +FUNC 3aaf8 b0 0 testing::internal::CmpHelperSTRNE +3aaf8 4 1483 95 +3aafc 4 1483 95 +3ab00 4 1484 95 +3ab04 4 1483 95 +3ab08 6 1484 95 +3ab0e 2 277 82 +3ab10 2 1139 87 +3ab12 6 277 82 +3ab18 6 1487 95 +3ab1e 4 277 82 +3ab22 2 1139 87 +3ab24 4 1487 95 +3ab28 6 1487 95 +3ab2e 2 1487 95 +3ab30 2 306 82 +3ab32 6 1487 95 +3ab38 8 1488 95 +3ab40 6 306 82 +3ab46 c 333 127 +3ab52 8 306 82 +3ab5a 6 85 79 +3ab60 8 1489 95 +3ab68 8 1489 95 +3ab70 6 1489 95 +3ab76 a 1489 95 +3ab80 6 1489 95 +3ab86 6 256 82 +3ab8c 1c 1491 95 +FUNC 3aba8 b0 0 testing::internal::GetBoolAssertionFailureMessage +3aba8 4 1311 95 +3abac 2 1311 95 +3abae 2 1144 87 +3abb0 4 1311 95 +3abb4 6 298 82 +3abba 4 298 82 +3abbe 8 1313 95 +3abc6 c 333 127 +3abd2 a 1314 95 +3abdc 2 333 127 +3abde 2 131 79 +3abe0 8 333 127 +3abe8 8 1315 95 +3abf0 4 1316 95 +3abf4 c 333 127 +3ac00 8 1317 95 +3ac08 2 333 127 +3ac0a 2 131 79 +3ac0c 14 333 127 +3ac20 8 1318 95 +3ac28 8 1319 95 +3ac30 6 85 79 +3ac36 22 1320 95 +FUNC 3ac58 4 0 std::basic_ostream >::operator<< +3ac58 4 240 126 +FUNC 3ac5c 64 0 testing::internal::MutexBase::Lock +3ac5c 2 1886 87 +3ac5e 2 1886 87 +3ac60 8 1887 87 +3ac68 14 1887 87 +3ac7c 18 333 127 +3ac94 8 1887 87 +3ac9c 6 1887 87 +3aca2 4 1888 87 +3aca6 2 1889 87 +3aca8 2 1888 87 +3acaa 2 1889 87 +3acac 14 1890 87 +FUNC 3acc0 64 0 testing::internal::GTestMutexLock::~GTestMutexLock +3acc0 2 1898 87 +3acc2 2 1965 87 +3acc4 4 1965 87 +3acc8 2 1898 87 +3acca 8 1899 87 +3acd2 14 1899 87 +3ace6 18 333 127 +3acfe 8 1899 87 +3ad06 6 1899 87 +3ad0c 18 1965 87 +FUNC 3ad24 1e 0 testing::internal::UnitTestImpl::GetGlobalTestPartResultReporter +3ad24 2 687 95 +3ad26 2 687 95 +3ad28 2 1963 87 +3ad2a 2 688 95 +3ad2c 8 1963 87 +3ad34 2 689 95 +3ad36 6 689 95 +3ad3c 6 690 95 +FUNC 3ad42 16 0 testing::internal::DefaultPerThreadTestPartResultReporter::ReportTestPartResult +3ad42 2 681 95 +3ad44 2 682 95 +3ad46 2 681 95 +3ad48 6 682 95 +3ad4e 2 682 95 +3ad50 4 683 95 +3ad54 4 682 95 +FUNC 3ad58 64 0 testing::internal::Mutex::Mutex +3ad58 2 1943 87 +3ad5a 2 1944 87 +3ad5c 2 1943 87 +3ad5e 8 1944 87 +3ad66 14 1944 87 +3ad7a 18 333 127 +3ad92 8 1944 87 +3ad9a 6 1944 87 +3ada0 2 1945 87 +3ada2 2 1946 87 +3ada4 2 1945 87 +3ada6 16 1946 87 +FUNC 3adbc 24 0 testing::TestResult::TestResult +3adbc 2 1978 95 +3adbe 2 1978 95 +3adc0 4 1980 95 +3adc4 2 67 144 +3adc6 2 1980 95 +3adc8 4 67 144 +3adcc 2 481 106 +3adce 4 67 144 +3add2 2 481 106 +3add4 8 1980 95 +3addc 4 1981 95 +FUNC 3ade0 68 0 testing::TestInfo::TestInfo +3ade0 2 2461 95 +3ade2 8 2461 95 +3adea 4 2476 95 +3adee a 2476 95 +3adf8 2 2476 95 +3adfa 8 2476 95 +3ae02 8 2469 95 +3ae0a 2 2476 95 +3ae0c 2 1139 87 +3ae0e 2 2476 95 +3ae10 8 2476 95 +3ae18 8 2470 95 +3ae20 2 2476 95 +3ae22 2 2476 95 +3ae24 2 1139 87 +3ae26 12 2476 95 +3ae38 4 2476 95 +3ae3c 2 2476 95 +3ae3e 4 2476 95 +3ae42 6 2476 95 +FUNC 3ae48 68 0 testing::TestCase::TestCase +3ae48 4 2674 95 +3ae4c 2 2674 95 +3ae4e 2 2682 95 +3ae50 2 2682 95 +3ae52 4 2682 95 +3ae56 2 2674 95 +3ae58 4 2682 95 +3ae5c 2 2682 95 +3ae5e 2 2674 95 +3ae60 4 2682 95 +3ae64 2 2682 95 +3ae66 8 2682 95 +3ae6e 8 2678 95 +3ae76 2 2682 95 +3ae78 2 67 144 +3ae7a 2 2682 95 +3ae7c 4 67 144 +3ae80 2 481 106 +3ae82 4 67 144 +3ae86 2 481 106 +3ae88 a 2682 95 +3ae92 2 1139 87 +3ae94 6 2682 95 +3ae9a 8 2682 95 +3aea2 e 2683 95 +FUNC 3aeb0 30 0 testing::internal::UnitTestImpl::os_stack_trace_getter +3aeb0 2 4860 95 +3aeb2 4 4861 95 +3aeb6 2 4860 95 +3aeb8 2 4861 95 +3aeba 8 4862 95 +3aec2 a 442 91 +3aecc 4 442 91 +3aed0 2 442 91 +3aed2 4 4862 95 +3aed6 a 4866 95 +FUNC 3aee0 5c 0 testing::internal::Mutex::~Mutex +3aee0 2 1947 87 +3aee2 2 1947 87 +3aee4 8 1948 87 +3aeec 14 1948 87 +3af00 18 333 127 +3af18 8 1948 87 +3af20 6 1948 87 +3af26 16 1949 87 +FUNC 3af3c 24 0 testing::UnitTest::~UnitTest +3af3c 2 4256 95 +3af3e a 4256 95 +3af48 4 4257 95 +3af4c 6 4257 95 +3af52 6 4256 95 +3af58 8 4258 95 +FUNC 3af60 12 0 testing::UnitTest::~UnitTest +3af60 2 4256 95 +3af62 2 4256 95 +3af64 4 4258 95 +3af68 6 4258 95 +3af6e 4 4258 95 +FUNC 3af74 1c 0 testing::internal::OsStackTraceGetter::~OsStackTraceGetter +3af74 2 440 91 +3af76 1a 440 91 +FUNC 3af90 12 0 testing::internal::OsStackTraceGetter::~OsStackTraceGetter +3af90 2 440 91 +3af92 6 440 91 +3af98 6 440 91 +3af9e 4 440 91 +FUNC 3afa2 60 0 testing::TestResult::~TestResult +3afa2 2 1984 95 +3afa4 2 1984 95 +3afa6 6 65 118 +3afac 2 74 118 +3afae 4 191 108 +3afb2 4 156 137 +3afb6 2 121 136 +3afb8 a 156 137 +3afc2 4 81 118 +3afc6 4 87 144 +3afca 2 88 144 +3afcc 6 323 106 +3afd2 6 65 118 +3afd8 2 74 118 +3afda 4 191 108 +3afde 2 77 118 +3afe0 6 57 108 +3afe6 4 81 118 +3afea 4 87 144 +3afee 2 88 144 +3aff0 6 323 106 +3aff6 6 1984 95 +3affc 6 1985 95 +FUNC 3b002 48 0 testing::TestInfo::~TestInfo +3b002 2 2479 95 +3b004 6 2479 95 +3b00a 2 2479 95 +3b00c 4 2479 95 +3b010 8 2479 95 +3b018 4 1153 87 +3b01c 6 156 137 +3b022 6 1155 87 +3b028 4 1153 87 +3b02c 6 156 137 +3b032 6 1155 87 +3b038 e 156 137 +3b046 4 2479 95 +FUNC 3b04a 16 0 testing::internal::Delete +3b04a 2 339 91 +3b04c 4 340 91 +3b050 4 340 91 +3b054 2 340 91 +3b056 4 341 91 +3b05a 6 340 91 +FUNC 3b060 58 0 testing::TestCase::~TestCase +3b060 2 2686 95 +3b062 e 2686 95 +3b070 4 60 103 +3b074 a 61 103 +3b07e 8 2686 95 +3b086 4 87 144 +3b08a 2 88 144 +3b08c 6 323 106 +3b092 8 304 144 +3b09a 4 1153 87 +3b09e 6 156 137 +3b0a4 6 1155 87 +3b0aa 6 156 137 +3b0b0 8 2689 95 +FUNC 3b0b8 12 0 testing::TestCase::~TestCase +3b0b8 2 2686 95 +3b0ba 2 2686 95 +3b0bc 4 2689 95 +3b0c0 6 2689 95 +3b0c6 4 2689 95 +FUNC 3b0cc 80 0 testing::internal::String::FormatIntWidth2 +3b0cc 6 1920 95 +3b0d2 4 1920 95 +3b0d6 2 1921 95 +3b0d8 6 1920 95 +3b0de 4 1921 95 +3b0e2 2 1920 95 +3b0e4 4 1921 95 +3b0e8 2 147 112 +3b0ea e 84 114 +3b0f8 2 126 112 +3b0fa 2 39 112 +3b0fc 12 126 112 +3b10e 6 39 112 +3b114 4 1922 95 +3b118 2 39 112 +3b11a 4 1922 95 +3b11e 6 1922 95 +3b124 8 75 132 +3b12c 6 1923 95 +3b132 1a 1924 95 +FUNC 3b14c 6c 0 testing::internal::String::FormatHexInt +3b14c e 1927 95 +3b15a 2 1927 95 +3b15c 6 1928 95 +3b162 2 1927 95 +3b164 4 1928 95 +3b168 a 79 127 +3b172 6 123 115 +3b178 6 124 115 +3b17e 8 79 127 +3b186 8 118 115 +3b18e 6 1929 95 +3b194 8 75 132 +3b19c 6 1930 95 +3b1a2 16 1931 95 +FUNC 3b1b8 118 0 testing::internal::ThreadLocal > >::GetOrCreateValue +3b1b8 4 2037 87 +3b1bc 2 2037 87 +3b1be 6 2039 87 +3b1c4 4 2040 87 +3b1c8 2 2021 87 +3b1ca 2 2041 87 +3b1cc 6 2044 87 +3b1d2 2 2019 87 +3b1d4 2 2044 87 +3b1d6 6 2019 87 +3b1dc 4 192 144 +3b1e0 2 70 144 +3b1e2 4 192 144 +3b1e6 4 342 106 +3b1ea 2 70 144 +3b1ec 2 481 106 +3b1ee 2 342 106 +3b1f0 8 343 106 +3b1f8 4 343 106 +3b1fc 2 346 106 +3b1fe 6 347 106 +3b204 4 348 106 +3b208 2 352 106 +3b20a 2 348 106 +3b20c 4 352 106 +3b210 2 356 106 +3b212 4 73 144 +3b216 2 71 144 +3b218 2 72 144 +3b21a 4 73 144 +3b21e 10 86 142 +3b22e 6 86 142 +3b234 6 139 108 +3b23a 18 466 91 +3b252 16 86 142 +3b268 2 249 144 +3b26a c 2046 87 +3b276 14 2046 87 +3b28a 18 333 127 +3b2a2 8 2046 87 +3b2aa 6 2046 87 +3b2b0 2 2021 87 +3b2b2 1e 2048 87 +FUNC 3b2d0 32 0 testing::UnitTest::PopGTestTrace +3b2d0 2 4270 95 +3b2d2 2 4270 95 +3b2d4 2 1963 87 +3b2d6 2 4271 95 +3b2d8 8 1963 87 +3b2e0 2 752 91 +3b2e2 6 2010 87 +3b2e8 8 563 144 +3b2f0 8 156 137 +3b2f8 6 4272 95 +3b2fe 4 4273 95 +FUNC 3b304 150 0 testing::internal::ShuffleRange +3b304 4 311 91 +3b308 2 311 91 +3b30a 6 192 144 +3b310 2 314 91 +3b312 4 192 144 +3b316 4 311 91 +3b31a 4 192 144 +3b31e 2 314 91 +3b320 4 314 91 +3b324 4 317 91 +3b328 4 317 91 +3b32c 6 323 91 +3b332 4 323 91 +3b336 e 325 91 +3b344 2 92 105 +3b346 4 91 105 +3b34a 2 323 91 +3b34c 4 92 105 +3b350 6 93 105 +3b356 16 314 91 +3b36c 18 333 127 +3b384 a 240 126 +3b38e 8 333 127 +3b396 8 240 126 +3b39e 8 333 127 +3b3a6 8 314 91 +3b3ae 16 317 91 +3b3c4 18 333 127 +3b3dc a 240 126 +3b3e6 8 333 127 +3b3ee a 240 126 +3b3f8 8 333 127 +3b400 8 240 126 +3b408 8 333 127 +3b410 8 317 91 +3b418 3c 328 91 +FUNC 3b454 58 0 testing::internal::UnitTestImpl::ShuffleTests +3b454 2 4877 95 +3b456 2 4877 95 +3b458 6 4879 95 +3b45e 4 801 91 +3b462 c 4879 95 +3b46e 4 192 144 +3b472 2 4883 95 +3b474 2 192 144 +3b476 c 4883 95 +3b482 2 4886 95 +3b484 6 192 144 +3b48a 6 4886 95 +3b490 4 4887 95 +3b494 2 333 91 +3b496 6 192 144 +3b49c 2 4886 95 +3b49e 2 192 144 +3b4a0 a 333 91 +3b4aa 2 4889 95 +FUNC 3b4ac 96 0 std::priv::__put_num, double> +3b4ac 4 194 126 +3b4b0 6 194 126 +3b4b6 a 181 127 +3b4c0 2 199 126 +3b4c2 10 211 126 +3b4d2 2 202 126 +3b4d4 2 145 115 +3b4d6 4 202 126 +3b4da 2 145 115 +3b4dc 2 202 126 +3b4de 6 145 115 +3b4e4 6 202 126 +3b4ea 2 202 126 +3b4ec 2 202 126 +3b4ee c 202 126 +3b4fa 18 57 128 +3b512 1a 89 125 +3b52c 6 202 126 +3b532 4 210 126 +3b536 6 212 126 +3b53c 6 213 126 +FUNC 3b548 74 0 testing::internal::FormatTimeInMillisAsSeconds +3b548 10 3500 95 +3b558 2 3500 95 +3b55a 4 3501 95 +3b55e 2 3500 95 +3b560 4 3501 95 +3b564 2 3500 95 +3b566 4 3501 95 +3b56a 14 3502 95 +3b57e a 281 126 +3b588 8 75 132 +3b590 6 3503 95 +3b596 26 3504 95 +FUNC 3b5c0 94 0 testing::internal::XmlUnitTestResultPrinter::OutputXmlCDataSection +3b5c0 4 3530 95 +3b5c4 2 3530 95 +3b5c6 2 333 127 +3b5c8 2 3530 95 +3b5ca 6 333 127 +3b5d0 2 3534 95 +3b5d2 4 333 127 +3b5d6 2 3534 95 +3b5d8 2 333 127 +3b5da 8 3534 95 +3b5e2 4 3535 95 +3b5e6 c 181 127 +3b5f2 2 434 126 +3b5f4 10 444 126 +3b604 2 436 126 +3b606 8 3537 95 +3b60e c 436 126 +3b61a 4 443 126 +3b61e 6 446 126 +3b624 8 333 127 +3b62c 2 3539 95 +3b62e 2 3544 95 +3b630 10 333 127 +3b640 14 3546 95 +FUNC 3b654 bc 0 testing::internal::StreamingListener::SocketWriter::Send +3b654 2 1077 91 +3b656 2 1078 91 +3b658 2 1077 91 +3b65a 2 1078 91 +3b65c 2 1077 91 +3b65e 2 1078 91 +3b660 14 1078 91 +3b674 18 333 127 +3b68c 8 1078 91 +3b694 2 400 136 +3b696 2 1082 91 +3b698 2 400 136 +3b69a 6 1082 91 +3b6a0 4 1082 91 +3b6a4 14 1083 91 +3b6b8 e 333 127 +3b6c6 c 1085 91 +3b6d2 8 333 127 +3b6da a 1085 91 +3b6e4 6 1083 91 +3b6ea 26 1087 91 +FUNC 3b710 154 0 testing::internal::StreamingListener::SocketWriter::MakeConnection +3b710 4 3721 95 +3b714 2 3722 95 +3b716 4 3721 95 +3b71a 2 3722 95 +3b71c 6 3721 95 +3b722 2 3722 95 +3b724 10 3722 95 +3b734 1a 333 127 +3b74e 6 3722 95 +3b754 a 3726 95 +3b75e 2 3729 95 +3b760 4 3728 95 +3b764 6 3729 95 +3b76a 6 3734 95 +3b770 4 3728 95 +3b774 4 3734 95 +3b778 4 3735 95 +3b77c 12 3736 95 +3b78e 10 333 127 +3b79e 8 3737 95 +3b7a6 6 333 127 +3b7ac 6 3736 95 +3b7b2 2 3741 95 +3b7b4 6 3741 95 +3b7ba 2 3741 95 +3b7bc 8 3744 95 +3b7c4 2 3745 95 +3b7c6 2 3744 95 +3b7c8 2 3745 95 +3b7ca e 3747 95 +3b7d8 6 3748 95 +3b7de 2 3749 95 +3b7e0 4 3741 95 +3b7e4 6 3754 95 +3b7ea 6 3756 95 +3b7f0 12 3757 95 +3b802 10 333 127 +3b812 c 3758 95 +3b81e 8 333 127 +3b826 a 3758 95 +3b830 6 3757 95 +3b836 2e 3760 95 +FUNC 3b864 5c 0 testing::AssertionResult::operator<< +3b864 10 305 82 +3b874 2 305 82 +3b876 2 306 82 +3b878 2 305 82 +3b87a 4 306 82 +3b87e 2 131 79 +3b880 6 233 79 +3b886 2 131 79 +3b888 4 233 79 +3b88c 8 233 79 +3b894 6 156 137 +3b89a 8 306 82 +3b8a2 6 85 79 +3b8a8 18 308 82 +FUNC 3b8c0 d4 0 testing::internal::PrettyUnitTestResultPrinter::OnTestPartResult +3b8c0 e 3070 95 +3b8ce 2 3070 95 +3b8d0 2 3072 95 +3b8d2 4 3070 95 +3b8d6 4 3072 95 +3b8da 6 2808 95 +3b8e0 4 77 81 +3b8e4 10 2808 95 +3b8f4 a 131 79 +3b8fe c 333 127 +3b90a 2 2785 95 +3b90c 2 2808 95 +3b90e 6 2785 95 +3b914 6 2794 95 +3b91a 6 2797 95 +3b920 4 2787 95 +3b924 6 2809 95 +3b92a 6 2810 95 +3b930 4 2810 95 +3b934 2 2810 95 +3b936 6 2810 95 +3b93c 6 156 137 +3b942 6 85 79 +3b948 8 2817 95 +3b950 e 2818 95 +3b95e 6 156 137 +3b964 6 3077 95 +3b96a 2a 3078 95 +FUNC 3b994 138 0 testing::internal::XmlUnitTestResultPrinter::EscapeXml +3b994 6 3427 95 +3b99a 2 3430 95 +3b99c 6 3427 95 +3b9a2 2 3427 95 +3b9a4 2 3428 95 +3b9a6 2 3427 95 +3b9a8 2 3428 95 +3b9aa 6 3427 95 +3b9b0 4 3428 95 +3b9b4 2a 333 127 +3b9de 6 400 136 +3b9e4 4 3430 95 +3b9e8 2 3431 95 +3b9ea e 3432 95 +3b9f8 a 333 127 +3ba02 8 3432 95 +3ba0a 14 333 127 +3ba1e 2 3443 95 +3ba20 c 333 127 +3ba2c 2 3449 95 +3ba2e 4 333 127 +3ba32 8 3309 95 +3ba3a 4 3309 95 +3ba3e 4 3314 95 +3ba42 a 305 127 +3ba4c 4 3430 95 +3ba50 8 3466 95 +3ba58 6 85 79 +3ba5e 10 3467 95 +3ba6e 4 3456 95 +3ba72 2 333 127 +3ba74 4 3457 95 +3ba78 8 333 127 +3ba80 8 3457 95 +3ba88 a 131 79 +3ba92 a 333 127 +3ba9c 8 156 137 +3baa4 28 3467 95 +FUNC 3bacc f0 0 testing::internal::XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes +3bacc 6 3683 95 +3bad2 2 3685 95 +3bad4 6 3683 95 +3bada 2 3683 95 +3badc 2 3684 95 +3bade 2 3683 95 +3bae0 2 3684 95 +3bae2 4 3683 95 +3bae6 4 3684 95 +3baea 14 333 127 +3bafe c 192 144 +3bb0a 4 3685 95 +3bb0e a 3686 95 +3bb18 a 333 127 +3bb22 c 3687 95 +3bb2e 2 131 79 +3bb30 8 333 127 +3bb38 2 131 79 +3bb3a 4 3688 95 +3bb3e 8 333 127 +3bb46 6 3688 95 +3bb4c 4 3328 95 +3bb50 6 3688 95 +3bb56 a 3328 95 +3bb60 2 131 79 +3bb62 8 131 79 +3bb6a 2 131 79 +3bb6c 8 333 127 +3bb74 c 156 137 +3bb80 4 3685 95 +3bb84 8 3690 95 +3bb8c 6 85 79 +3bb92 2a 3691 95 +FUNC 3bbbc 58 0 testing::Message::Message +3bbbc 8 96 79 +3bbc4 14 96 79 +3bbd8 2 97 79 +3bbda 6 96 79 +3bbe0 4 97 79 +3bbe4 2 1139 87 +3bbe6 4 97 79 +3bbea a 97 79 +3bbf4 6 156 137 +3bbfa 1a 98 79 +FUNC 3bc14 270 0 testing::internal::ShouldShard +3bc14 e 4657 95 +3bc22 4 4657 95 +3bc26 4 4664 95 +3bc2a 2 4657 95 +3bc2c 4 4664 95 +3bc30 4 4665 95 +3bc34 2 4664 95 +3bc36 6 4665 95 +3bc3c 2 4667 95 +3bc3e 2 4665 95 +3bc40 2 4667 95 +3bc42 6 4667 95 +3bc48 8 4671 95 +3bc50 24 333 127 +3bc74 a 131 79 +3bc7e 20 333 127 +3bc9e 2 4673 95 +3bca0 4 333 127 +3bca4 8 4673 95 +3bcac 4 85 79 +3bcb0 4 4677 95 +3bcb4 8 4679 95 +3bcbc 24 333 127 +3bce0 a 131 79 +3bcea 20 333 127 +3bd0a 2 4681 95 +3bd0c 4 333 127 +3bd10 8 4681 95 +3bd18 2 4682 95 +3bd1a 6 85 79 +3bd20 8 4682 95 +3bd28 8 4682 95 +3bd30 6 156 137 +3bd36 a 4683 95 +3bd40 6 4684 95 +3bd46 4 4685 95 +3bd4a 4 4685 95 +3bd4e a 4687 95 +3bd58 5a 333 127 +3bdb2 a 131 79 +3bdbc 20 333 127 +3bddc a 131 79 +3bde6 8 333 127 +3bdee 2 4690 95 +3bdf0 4 333 127 +3bdf4 8 4690 95 +3bdfc 2 85 79 +3bdfe 2 4691 95 +3be00 4 85 79 +3be04 6 4691 95 +3be0a a 4696 95 +3be14 2 4668 95 +3be16 6e 4697 95 +FUNC 3be84 a 0 testing::internal::ShouldShard +3be84 6 4660 95 +3be8a 4 4697 95 +FUNC 3be90 dc 0 testing::GetReservedAttributesForElement +3be90 4 2074 95 +3be94 4 2074 95 +3be98 e 2075 95 +3bea6 2 67 144 +3bea8 2 272 144 +3beaa 2 67 144 +3beac 2 272 144 +3beae 2 67 144 +3beb0 2 481 106 +3beb2 8 272 144 +3beba e 2077 95 +3bec8 2 272 144 +3beca 4 67 144 +3bece 2 481 106 +3bed0 6 272 144 +3bed6 e 2079 95 +3bee4 4 272 144 +3bee8 4 67 144 +3beec 2 481 106 +3beee c 272 144 +3befa 16 2082 95 +3bf10 18 333 127 +3bf28 8 2082 95 +3bf30 6 2082 95 +3bf36 4 67 144 +3bf3a 2 481 106 +3bf3c 30 2086 95 +FUNC 3bf6c 84 0 testing::internal::ThreadLocal::GetOrCreateValue +3bf6c 2 2037 87 +3bf6e 2 2037 87 +3bf70 6 2039 87 +3bf76 2 2040 87 +3bf78 2 2021 87 +3bf7a 2 2041 87 +3bf7c 8 2044 87 +3bf84 2 2019 87 +3bf86 2 2046 87 +3bf88 a 2019 87 +3bf92 a 2046 87 +3bf9c 14 2046 87 +3bfb0 18 333 127 +3bfc8 8 2046 87 +3bfd0 6 2046 87 +3bfd6 2 2021 87 +3bfd8 18 2048 87 +FUNC 3bff0 c 0 testing::internal::UnitTestImpl::GetTestPartResultReporterForCurrentThread +3bff0 2 701 95 +3bff2 6 2011 87 +3bff8 4 703 95 +FUNC 3bffc 1d4 0 testing::UnitTest::AddTestPartResult +3bffc e 4065 95 +3c00a 4 4065 95 +3c00e 2 4066 95 +3c010 2 4065 95 +3c012 2 4066 95 +3c014 8 4065 95 +3c01c 4 4066 95 +3c020 a 131 79 +3c02a 2 4069 95 +3c02c 6 1963 87 +3c032 2 752 91 +3c034 6 2010 87 +3c03a 6 192 144 +3c040 8 4070 95 +3c048 6 4081 95 +3c04e 24 333 127 +3c072 2 752 91 +3c074 4 4076 95 +3c078 6 2010 87 +3c07e 6 192 144 +3c084 2 333 127 +3c086 2 192 144 +3c088 a 333 127 +3c092 4 4073 95 +3c096 2 752 91 +3c098 2 4075 95 +3c09a 6 2010 87 +3c0a0 4 202 144 +3c0a4 6 333 127 +3c0aa 4 202 144 +3c0ae 8 333 127 +3c0b6 e 4076 95 +3c0c4 a 131 79 +3c0ce a 333 127 +3c0d8 c 131 79 +3c0e4 8 156 137 +3c0ec 6 4081 95 +3c0f2 a 4087 95 +3c0fc 10 68 81 +3c10c 4 68 81 +3c110 a 68 81 +3c11a 2 68 81 +3c11c 4 68 81 +3c120 2 68 81 +3c122 4 68 81 +3c126 a 68 81 +3c130 6 156 137 +3c136 6 4088 95 +3c13c 2 4089 95 +3c13e 4 68 81 +3c142 6 4089 95 +3c148 4 4091 95 +3c14c 8 4097 95 +3c154 6 4108 95 +3c15a 8 4110 95 +3c162 6 4116 95 +3c168 6 4087 95 +3c16e 6 4069 95 +3c174 6 85 79 +3c17a e 4120 95 +3c188 c 333 127 +3c194 c 131 79 +3c1a0 30 4120 95 +FUNC 3c1d0 e 0 testing::internal::UnitTestImpl::SetTestPartResultReporterForCurrentThread +3c1d0 2 707 95 +3c1d2 2 2010 87 +3c1d4 2 707 95 +3c1d6 4 2010 87 +3c1da 4 2013 87 +FUNC 3c1de 42 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, unsigned int>, std::priv::_Select1st, std::allocator >, unsigned int> >, std::priv::_MapTraitsT, std::allocator >, unsigned int> >, std::allocator, std::allocator >, unsigned int> > >::_M_find, std::allocator > > +3c1de 4 548 141 +3c1e2 4 548 141 +3c1e6 6 549 141 +3c1ec 2 552 141 +3c1ee a 79 111 +3c1f8 4 553 141 +3c1fc 4 554 141 +3c200 4 556 141 +3c204 4 558 141 +3c208 12 79 111 +3c21a 6 564 141 +FUNC 3c220 28 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, unsigned int>, std::priv::_Select1st, std::allocator >, unsigned int> >, std::priv::_MapTraitsT, std::allocator >, unsigned int> >, std::allocator, std::allocator >, unsigned int> > >::_M_erase +3c220 6 655 140 +3c226 2 657 140 +3c228 8 658 140 +3c230 4 156 137 +3c234 2 659 140 +3c236 4 156 137 +3c23a c 161 106 +3c246 2 664 140 +FUNC 3c248 20 0 std::priv::_List_global::_Transfer +3c248 2 50 120 +3c24a 2 48 120 +3c24c 2 50 120 +3c24e 4 52 120 +3c252 4 53 120 +3c256 4 54 120 +3c25a 2 58 120 +3c25c 2 57 120 +3c25e 2 58 120 +3c260 4 59 120 +3c264 4 60 120 +FUNC 3c268 56 0 testing::internal::edit_distance::::Hunk::PushLine +3c268 2 208 121 +3c26a 2 1096 95 +3c26c 2 1099 95 +3c26e 2 1096 95 +3c270 4 1099 95 +3c274 4 208 121 +3c278 2 1096 95 +3c27a 2 600 121 +3c27c 4 370 121 +3c280 2 600 121 +3c282 6 602 121 +3c288 6 208 121 +3c28e 4 600 121 +3c292 6 602 121 +3c298 8 306 106 +3c2a0 4 307 106 +3c2a4 4 119 108 +3c2a8 8 68 129 +3c2b0 2 427 121 +3c2b2 2 428 121 +3c2b4 2 429 121 +3c2b6 2 430 121 +3c2b8 2 431 121 +3c2ba 4 1112 95 +FUNC 3c2be 26 0 std::operator==, std::allocator > +3c2be 2 287 139 +3c2c0 6 287 139 +3c2c6 a 400 136 +3c2d0 4 289 139 +3c2d4 4 226 145 +3c2d8 8 289 139 +3c2e0 2 289 139 +3c2e2 2 290 139 +FUNC 3c2e4 a8 0 std::priv::__find, std::allocator >*, std::basic_string, std::allocator > > +3c2e4 4 112 104 +3c2e8 2 115 104 +3c2ea 8 112 104 +3c2f2 8 115 104 +3c2fa 4 117 104 +3c2fe a 118 104 +3c308 4 119 104 +3c30c e 121 104 +3c31a e 124 104 +3c328 c 127 104 +3c334 4 117 104 +3c338 18 131 104 +3c350 a 133 104 +3c35a 2 134 104 +3c35c a 136 104 +3c366 2 137 104 +3c368 8 139 104 +3c370 a 139 104 +3c37a 4 143 104 +3c37e 2 136 104 +3c380 c 145 104 +FUNC 3c38c 10c 0 testing::internal::XmlUnitTestResultPrinter::OutputXmlAttribute +3c38c e 3552 95 +3c39a 2 3552 95 +3c39c 2 3554 95 +3c39e 4 3552 95 +3c3a2 2 3554 95 +3c3a4 4 3552 95 +3c3a8 8 3554 95 +3c3b0 e 223 104 +3c3be 6 3556 95 +3c3c4 12 3556 95 +3c3d6 18 333 127 +3c3ee a 3558 95 +3c3f8 8 333 127 +3c400 8 3558 95 +3c408 8 333 127 +3c410 6 3556 95 +3c416 a 333 127 +3c420 a 3561 95 +3c42a 2 333 127 +3c42c 2 3328 95 +3c42e 6 333 127 +3c434 a 3328 95 +3c43e 8 3561 95 +3c446 8 333 127 +3c44e 6 156 137 +3c454 6 42 148 +3c45a 3e 3562 95 +FUNC 3c498 ac 0 std::priv::_Impl_vector >::_M_insert_overflow +3c498 4 108 143 +3c49c 2 108 143 +3c49e 6 192 144 +3c4a4 4 173 144 +3c4a8 2 108 143 +3c4aa 2 192 144 +3c4ac 4 173 144 +3c4b0 4 108 143 +3c4b4 2 173 144 +3c4b6 8 41 143 +3c4be 8 175 144 +3c4c6 6 176 144 +3c4cc 4 176 144 +3c4d0 4 176 144 +3c4d4 8 347 106 +3c4dc 4 348 106 +3c4e0 2 353 106 +3c4e2 4 352 106 +3c4e6 e 112 143 +3c4f4 2 480 105 +3c4f6 4 481 105 +3c4fa 2 480 105 +3c4fc 6 481 105 +3c502 a 115 143 +3c50c e 116 143 +3c51a 4 657 144 +3c51e 2 319 106 +3c520 4 323 106 +3c524 4 118 143 +3c528 4 666 144 +3c52c 2 667 144 +3c52e 2 668 144 +3c530 6 119 143 +3c536 4 346 106 +3c53a a 356 106 +FUNC 3c544 28 0 std::priv::_Impl_vector >::push_back +3c544 2 376 144 +3c546 2 376 144 +3c548 a 380 144 +3c552 2 126 108 +3c554 8 382 144 +3c55c c 386 144 +3c568 4 388 144 +FUNC 3c56c 18 0 testing::TestEventListeners::Append +3c56c 4 3854 95 +3c570 6 3855 95 +3c576 8 173 148 +3c57e 6 3856 95 +FUNC 3c584 2a 0 testing::TestEventListeners::SetDefaultResultPrinter +3c584 2 3878 95 +3c586 2 3878 95 +3c588 2 3879 95 +3c58a 2 3878 95 +3c58c 4 3879 95 +3c590 6 3882 95 +3c596 2 3882 95 +3c598 4 3882 95 +3c59c 2 3883 95 +3c59e 2 3884 95 +3c5a0 4 3885 95 +3c5a4 4 3887 95 +3c5a8 6 3885 95 +FUNC 3c5b0 1c8 0 testing::internal::UnitTestImpl::UnitTestImpl +3c5b0 6 4277 95 +3c5b6 2 4305 95 +3c5b8 2 4277 95 +3c5ba 4 4305 95 +3c5be 2 61 84 +3c5c0 2 4305 95 +3c5c2 2 61 84 +3c5c4 2 4305 95 +3c5c6 a 61 84 +3c5d0 a 669 95 +3c5da a 678 95 +3c5e4 6 4305 95 +3c5ea 8 4305 95 +3c5f2 e 2032 87 +3c600 2 4277 95 +3c602 4 4305 95 +3c606 2 4277 95 +3c608 4 2032 87 +3c60c 10 2032 87 +3c61c 1a 333 127 +3c636 8 2032 87 +3c63e 6 2032 87 +3c644 2 2034 87 +3c646 2 67 144 +3c648 2 1999 87 +3c64a 4 4305 95 +3c64e 4 1999 87 +3c652 2 4305 95 +3c654 4 67 144 +3c658 2 481 106 +3c65a 4 67 144 +3c65e 2 481 106 +3c660 4 67 144 +3c664 2 481 106 +3c666 4 67 144 +3c66a 2 481 106 +3c66c c 4305 95 +3c678 4 4305 95 +3c67c 4 4305 95 +3c680 4 4305 95 +3c684 6 4305 95 +3c68a 18 4305 95 +3c6a2 4 712 85 +3c6a6 4 1139 87 +3c6aa 6 4305 95 +3c6b0 2 148 83 +3c6b2 2 2032 87 +3c6b4 2 148 83 +3c6b6 2 2032 87 +3c6b8 4 148 83 +3c6bc 4 1139 87 +3c6c0 a 2032 87 +3c6ca 10 2032 87 +3c6da 1a 333 127 +3c6f4 8 2032 87 +3c6fc 6 2032 87 +3c702 2 2034 87 +3c704 2 4306 95 +3c706 4 1997 87 +3c70a a 67 144 +3c714 4 481 106 +3c718 4 4305 95 +3c71c 4 4306 95 +3c720 2 2981 95 +3c722 2 4306 95 +3c724 6 2981 95 +3c72a 6 4306 95 +3c730 48 4307 95 +FUNC 3c778 2c 0 testing::UnitTest::UnitTest +3c778 2 4251 95 +3c77a 10 4251 95 +3c78a a 4252 95 +3c794 6 4252 95 +3c79a 2 4252 95 +3c79c 8 4253 95 +FUNC 3c7a4 44 0 testing::UnitTest::GetInstance +3c7a4 2 3924 95 +3c7a6 a 3940 95 +3c7b0 c 3940 95 +3c7bc a 3940 95 +3c7c6 2 3940 95 +3c7c8 4 3940 95 +3c7cc 1c 3943 95 +FUNC 3c7e8 194 0 testing::internal::UnitTestOptions::GetAbsolutePathToOutputFile +3c7e8 e 408 95 +3c7f6 10 408 95 +3c806 2 410 95 +3c808 c 411 95 +3c814 a 413 95 +3c81e 2 414 95 +3c820 6 418 95 +3c826 6 418 95 +3c82c 2 418 95 +3c82e 6 418 95 +3c834 8 418 95 +3c83c 8 418 95 +3c844 4 418 95 +3c848 6 418 95 +3c84e 8 418 95 +3c856 a 418 95 +3c860 8 418 95 +3c868 14 156 137 +3c87c 2 420 95 +3c87e 4 420 95 +3c882 2 420 95 +3c884 6 420 95 +3c88a 8 420 95 +3c892 6 156 137 +3c898 8 421 95 +3c8a0 6 426 95 +3c8a6 6 426 95 +3c8ac 4 426 95 +3c8b0 6 426 95 +3c8b6 4 426 95 +3c8ba 8 426 95 +3c8c2 4 426 95 +3c8c6 2 426 95 +3c8c8 6 426 95 +3c8ce 8 426 95 +3c8d6 a 426 95 +3c8e0 8 74 84 +3c8e8 1e 156 137 +3c906 8 430 95 +3c90e 8 431 95 +3c916 2 431 95 +3c918 8 435 95 +3c920 2 435 95 +3c922 6 435 95 +3c928 c 435 95 +3c934 c 156 137 +3c940 8 436 95 +3c948 c 156 137 +3c954 28 437 95 +FUNC 3c97c a 0 testing::internal::GetUnitTestImpl +3c97c 2 936 91 +3c97e 4 937 91 +3c982 4 938 91 +FUNC 3c986 46 0 testing::internal::HandleExceptionsInMethodIfSupported +3c986 4 2370 95 +3c98a 6 2370 95 +3c990 14 2395 95 +3c9a4 a 2362 95 +3c9ae c 2418 95 +3c9ba 4 2418 95 +3c9be 2 2418 95 +3c9c0 4 2418 95 +3c9c4 6 2420 95 +3c9ca 2 2418 95 +FUNC 3c986 46 0 testing::internal::HandleExceptionsInMethodIfSupported +FUNC 3c9cc 1c 0 testing::Test::HasFatalFailure +3c9cc 2 2447 95 +3c9ce 4 2448 95 +3c9d2 6 4872 95 +3c9d8 6 4872 95 +3c9de 2 4872 95 +3c9e0 4 2449 95 +3c9e4 4 2448 95 +FUNC 3c9e8 1c 0 testing::Test::HasNonfatalFailure +3c9e8 2 2452 95 +3c9ea 4 2454 95 +3c9ee 6 4872 95 +3c9f4 6 4872 95 +3c9fa 2 4872 95 +3c9fc 4 2455 95 +3ca00 4 2454 95 +FUNC 3ca04 88 0 testing::UnitTest::Run +3ca04 8 4137 95 +3ca0c 4 4164 95 +3ca10 2 4137 95 +3ca12 4 4164 95 +3ca16 8 2328 87 +3ca1e 4 3816 95 +3ca22 4 3816 95 +3ca26 8 2298 87 +3ca2e 2 3821 95 +3ca30 2 2298 87 +3ca32 c 3821 95 +3ca3e 8 3822 95 +3ca46 2 4164 95 +3ca48 2 4168 95 +3ca4a 2 1279 82 +3ca4c 2 4168 95 +3ca4e 6 819 91 +3ca54 2 1279 82 +3ca56 4 2395 95 +3ca5a 6 2418 95 +3ca60 4 4212 95 +3ca64 2 4212 95 +3ca66 2 3827 95 +3ca68 4 3827 95 +3ca6c 6 3828 95 +3ca72 1a 4213 95 +FUNC 3ca8c 10 0 testing::internal::ScopedTrace::~ScopedTrace +3ca8c 2 3780 95 +3ca8e 2 3780 95 +3ca90 4 3782 95 +3ca94 4 3782 95 +3ca98 4 3783 95 +FUNC 3ca9c 2a 0 testing::TestEventListeners::SetDefaultXmlGenerator +3ca9c 2 3894 95 +3ca9e 2 3894 95 +3caa0 2 3895 95 +3caa2 2 3894 95 +3caa4 4 3895 95 +3caa8 6 3898 95 +3caae 2 3898 95 +3cab0 4 3898 95 +3cab4 2 3899 95 +3cab6 2 3900 95 +3cab8 4 3901 95 +3cabc 4 3903 95 +3cac0 6 3901 95 +FUNC 3cac8 a0 0 testing::internal::UnitTestImpl::ConfigureXmlOutput +3cac8 8 4352 95 +3cad0 4 4352 95 +3cad4 2 4353 95 +3cad6 4 4352 95 +3cada 2 4353 95 +3cadc 2 4352 95 +3cade 4 4353 95 +3cae2 c 4354 95 +3caee 8 4356 95 +3caf6 c 4356 95 +3cb02 6 4356 95 +3cb08 a 4356 95 +3cb12 8 156 137 +3cb1a a 476 139 +3cb24 2 4357 95 +3cb26 c 4359 95 +3cb32 a 4360 95 +3cb3c 6 156 137 +3cb42 26 4362 95 +FUNC 3cb68 2c 0 testing::TestCase::AddTestInfo +3cb68 2 2707 95 +3cb6a 8 2707 95 +3cb72 8 173 148 +3cb7a 8 192 144 +3cb82 2 2709 95 +3cb84 4 192 144 +3cb88 4 2709 95 +3cb8c 4 173 148 +3cb90 4 2710 95 +FUNC 3cb94 20 0 std::_Destroy_Range > +3cb94 2 219 108 +3cb96 6 65 118 +3cb9c 2 74 118 +3cb9e 4 191 108 +3cba2 4 156 137 +3cba6 2 81 118 +3cba8 4 156 137 +3cbac 4 81 118 +3cbb0 4 221 108 +FUNC 3cbb4 34 0 testing::internal::ThreadLocal > >::ValueHolder::~ValueHolder +3cbb4 2 2017 87 +3cbb6 4 2017 87 +3cbba 2 304 144 +3cbbc 6 2017 87 +3cbc2 6 64 118 +3cbc8 2 304 144 +3cbca 2 64 118 +3cbcc 4 304 144 +3cbd0 4 87 144 +3cbd4 2 88 144 +3cbd6 6 323 106 +3cbdc c 2017 87 +FUNC 3cbe8 12 0 testing::internal::ThreadLocal > >::ValueHolder::~ValueHolder +3cbe8 2 2017 87 +3cbea 6 2017 87 +3cbf0 6 2017 87 +3cbf6 4 2017 87 +FUNC 3cbfc 19c 0 testing::internal::UnitTestImpl::~UnitTestImpl +3cbfc 2 4309 95 +3cbfe e 4309 95 +3cc0c 4 60 103 +3cc10 e 61 103 +3cc1e 4 60 103 +3cc22 a 61 103 +3cc2c 6 4316 95 +3cc32 6 4316 95 +3cc38 8 2003 87 +3cc40 4 2003 87 +3cc44 e 2007 87 +3cc52 12 2007 87 +3cc64 18 333 127 +3cc7c 8 2007 87 +3cc84 6 2007 87 +3cc8a c 64 118 +3cc96 2 304 144 +3cc98 4 64 118 +3cc9c 4 304 144 +3cca0 6 87 144 +3cca6 4 88 144 +3ccaa 6 323 106 +3ccb0 6 1153 87 +3ccb6 6 1155 87 +3ccbc a 1140 87 +3ccc6 8 4309 95 +3ccce a 4309 95 +3ccd8 6 560 86 +3ccde 8 562 86 +3cce6 8 562 86 +3ccee 8 304 144 +3ccf6 4 87 144 +3ccfa 2 88 144 +3ccfc 6 323 106 +3cd02 10 304 144 +3cd12 6 2003 87 +3cd18 4 2003 87 +3cd1c a 2007 87 +3cd26 12 2007 87 +3cd38 18 333 127 +3cd50 8 2007 87 +3cd58 6 2007 87 +3cd5e 8 4309 95 +3cd66 8 156 137 +3cd6e 2a 4317 95 +FUNC 3cd98 12 0 testing::internal::UnitTestImpl::~UnitTestImpl +3cd98 2 4309 95 +3cd9a 2 4309 95 +3cd9c 4 4317 95 +3cda0 6 4317 95 +3cda6 4 4317 95 +FUNC 3cdac 98 0 testing::internal::StreamingListener::UrlEncode +3cdac e 3702 95 +3cdba 2 3702 95 +3cdbc 2 3703 95 +3cdbe 4 3702 95 +3cdc2 4 3703 95 +3cdc6 6 3704 95 +3cdcc 4 3711 95 +3cdd0 2 3704 95 +3cdd2 6 3704 95 +3cdd8 2 3705 95 +3cdda 2 3711 95 +3cddc 6 3711 95 +3cde2 2 3705 95 +3cde4 10 3706 95 +3cdf4 6 3711 95 +3cdfa a 3711 95 +3ce04 8 3711 95 +3ce0c c 156 137 +3ce18 2 3712 95 +3ce1a 6 3714 95 +3ce20 6 3705 95 +3ce26 1e 3719 95 +FUNC 3ce44 130 0 testing::internal::UnitTestOptions::FilterMatchesTest +3ce44 18 485 95 +3ce5c 2 485 95 +3ce5e a 486 95 +3ce68 2 486 95 +3ce6a 4 486 95 +3ce6e a 486 95 +3ce78 8 156 137 +3ce80 12 491 95 +3ce92 a 492 95 +3ce9c 2 493 95 +3ce9e 4 492 95 +3cea2 8 493 95 +3ceaa 6 494 95 +3ceb0 a 495 95 +3ceba 8 496 95 +3cec2 4 355 119 +3cec6 4 324 136 +3ceca 2 112 137 +3cecc 2 481 106 +3cece 4 324 136 +3ced2 a 148 142 +3cedc 2 101 108 +3cede 2 325 136 +3cee0 2 498 95 +3cee2 2 101 108 +3cee4 6 498 95 +3ceea 6 156 137 +3cef0 c 499 95 +3cefc 8 499 95 +3cf04 6 156 137 +3cf0a 8 500 95 +3cf12 a 502 95 +3cf1c 8 508 95 +3cf24 4 508 95 +3cf28 8 509 95 +3cf30 6 508 95 +3cf36 12 156 137 +3cf48 2c 510 95 +FUNC 3cf74 148 0 testing::internal::UnitTestImpl::FilterTests +3cf74 e 4731 95 +3cf82 4 4731 95 +3cf86 6 4733 95 +3cf8c e 4733 95 +3cf9a 10 4735 95 +3cfaa 6 4733 95 +3cfb0 2 4735 95 +3cfb2 2 4743 95 +3cfb4 2 4755 95 +3cfb6 2 4742 95 +3cfb8 4 4755 95 +3cfbc 2 4766 95 +3cfbe 2 4741 95 +3cfc0 4 4766 95 +3cfc4 a 192 144 +3cfce 6 4743 95 +3cfd4 2 860 82 +3cfd6 4 4744 95 +3cfda a 4745 95 +3cfe4 4 4750 95 +3cfe8 4 860 82 +3cfec 6 192 144 +3cff2 6 4748 95 +3cff8 4 4749 95 +3cffc a 4750 95 +3d006 c 4755 95 +3d012 a 4757 95 +3d01c 4 4758 95 +3d020 8 4762 95 +3d028 2 4766 95 +3d02a 4 4763 95 +3d02e 4 4766 95 +3d032 6 4766 95 +3d038 4 4766 95 +3d03c 4 4769 95 +3d040 6 4769 95 +3d046 8 4721 95 +3d04e 4 4770 95 +3d052 4 4766 95 +3d056 2 4770 95 +3d058 2 4769 95 +3d05a 2 4774 95 +3d05c 4 4777 95 +3d060 2 4774 95 +3d062 2 4775 95 +3d064 2 156 137 +3d066 4 4775 95 +3d06a 4 803 82 +3d06e 2 4774 95 +3d070 6 4778 95 +3d076 4 860 82 +3d07a 4 156 137 +3d07e 4 4748 95 +3d082 6 156 137 +3d088 4 4743 95 +3d08c 10 4782 95 +3d09c 2 4766 95 +3d09e 4 4769 95 +3d0a2 1a 4782 95 +FUNC 3d0bc 44 0 testing::internal::StreamingListener::SendLn +3d0bc 4 1174 91 +3d0c0 2 1143 87 +3d0c2 8 1174 91 +3d0ca 4 1059 91 +3d0ce 2 1174 91 +3d0d0 c 1059 91 +3d0dc 6 1059 91 +3d0e2 6 156 137 +3d0e8 18 1174 91 +FUNC 3d100 44 0 testing::internal::StreamingListener::OnTestProgramStart +3d100 c 1118 91 +3d10c 2 1119 91 +3d10e 2 1118 91 +3d110 8 1119 91 +3d118 2 1118 91 +3d11a 4 1119 91 +3d11e 8 1119 91 +3d126 6 156 137 +3d12c 18 1120 91 +FUNC 3d144 78 0 testing::internal::StreamingListener::OnTestProgramEnd +3d144 6 1122 91 +3d14a 8 1122 91 +3d152 2 1125 91 +3d154 2 1122 91 +3d156 4 1125 91 +3d15a 2 1180 91 +3d15c 6 1180 91 +3d162 4 1180 91 +3d166 a 1180 91 +3d170 e 1125 91 +3d17e 8 1125 91 +3d186 c 156 137 +3d192 2 1143 87 +3d194 2 1128 91 +3d196 4 1128 91 +3d19a 22 1129 91 +FUNC 3d1bc 58 0 testing::internal::StreamingListener::OnTestIterationStart +3d1bc c 1131 91 +3d1c8 2 1131 91 +3d1ca 6 1132 91 +3d1d0 4 1131 91 +3d1d4 4 1132 91 +3d1d8 e 1132 91 +3d1e6 8 1133 91 +3d1ee c 156 137 +3d1fa 1a 1134 91 +FUNC 3d214 180 0 testing::internal::UnitTestImpl::ConfigureStreamingOutput +3d214 8 4367 95 +3d21c 12 4367 95 +3d22e 6 4369 95 +3d234 6 440 135 +3d23a 6 162 104 +3d240 4 164 104 +3d244 6 165 104 +3d24a 6 168 104 +3d250 4 166 104 +3d254 6 171 104 +3d25a 4 169 104 +3d25e 6 174 104 +3d264 6 172 104 +3d26a 4 164 104 +3d26e 10 178 104 +3d27e 6 180 104 +3d284 2 181 104 +3d286 6 183 104 +3d28c 2 184 104 +3d28e a 186 104 +3d298 2 178 104 +3d29a 4 447 135 +3d29e 2 447 135 +3d2a0 4 4371 95 +3d2a4 32 1023 136 +3d2d6 6 4373 95 +3d2dc 2 1113 91 +3d2de 2 4373 95 +3d2e0 6 1113 91 +3d2e6 6 1113 91 +3d2ec 2 1067 91 +3d2ee 2 1113 91 +3d2f0 a 1067 91 +3d2fa 2 1067 91 +3d2fc 2 1067 91 +3d2fe 6 1067 91 +3d304 a 1067 91 +3d30e 6 1068 91 +3d314 2 1178 91 +3d316 4 1139 87 +3d31a c 1178 91 +3d326 8 1178 91 +3d32e 6 156 137 +3d334 a 4373 95 +3d33e e 156 137 +3d34c a 4376 95 +3d356 a 4377 95 +3d360 34 4380 95 +FUNC 3d394 3c 0 testing::internal::UnitTestImpl::PostFlagParsingInit +3d394 2 4388 95 +3d396 4 4390 95 +3d39a 2 4388 95 +3d39c 2 4390 95 +3d39e 6 4391 95 +3d3a4 6 760 91 +3d3aa 8 760 91 +3d3b2 6 4395 95 +3d3b8 6 4401 95 +3d3be 6 4405 95 +3d3c4 2 4409 95 +3d3c6 4 4412 95 +3d3ca 6 4409 95 +FUNC 3d3d0 70 0 testing::internal::AppendUserMessage +3d3d0 8 1963 95 +3d3d8 4 1963 95 +3d3dc 2 1965 95 +3d3de 6 1963 95 +3d3e4 4 1965 95 +3d3e8 2 1963 95 +3d3ea 4 1965 95 +3d3ee 8 1966 95 +3d3f6 a 1967 95 +3d400 e 1970 95 +3d40e a 1970 95 +3d418 c 156 137 +3d424 1c 1971 95 +FUNC 3d440 78 0 testing::internal::AssertHelper::operator= +3d440 10 363 95 +3d450 4 363 95 +3d454 6 370 95 +3d45a 2 370 95 +3d45c a 370 95 +3d466 4 370 95 +3d46a 2 370 95 +3d46c 6 370 95 +3d472 6 370 95 +3d478 c 370 95 +3d484 10 370 95 +3d494 c 156 137 +3d4a0 18 371 95 +FUNC 3d4b8 224 0 testing::Test::HasSameFixtureClass +3d4b8 6 2229 95 +3d4be 8 2230 95 +3d4c6 4 743 91 +3d4ca 2 2234 95 +3d4cc 2 2240 95 +3d4ce 6 2234 95 +3d4d4 4 2235 95 +3d4d8 6 2243 95 +3d4de c 2249 95 +3d4ea 4 2249 95 +3d4ee 4 2257 95 +3d4f2 2 2257 95 +3d4f4 2 2259 95 +3d4f6 16 2261 95 +3d50c 6 2262 95 +3d512 24 333 127 +3d536 a 2264 95 +3d540 2 333 127 +3d542 2 131 79 +3d544 a 333 127 +3d54e 4 131 79 +3d552 a 333 127 +3d55c a 2266 95 +3d566 2 333 127 +3d568 2 131 79 +3d56a 8 333 127 +3d572 2 131 79 +3d574 8 333 127 +3d57c a 2267 95 +3d586 2 333 127 +3d588 2 131 79 +3d58a 8 333 127 +3d592 2 131 79 +3d594 a 333 127 +3d59e 2 131 79 +3d5a0 8 333 127 +3d5a8 16 2273 95 +3d5be 6 2274 95 +3d5c4 18 333 127 +3d5dc a 2276 95 +3d5e6 2 333 127 +3d5e8 2 131 79 +3d5ea 8 333 127 +3d5f2 2 131 79 +3d5f4 a 333 127 +3d5fe a 2277 95 +3d608 2 333 127 +3d60a 2 131 79 +3d60c 8 333 127 +3d614 a 2278 95 +3d61e 2 333 127 +3d620 2 131 79 +3d622 8 333 127 +3d62a 2 131 79 +3d62c a 333 127 +3d636 2 131 79 +3d638 a 333 127 +3d642 2 131 79 +3d644 a 333 127 +3d64e 2 131 79 +3d650 a 333 127 +3d65a 8 2282 95 +3d662 6 85 79 +3d668 6 2273 95 +3d66e 4 2284 95 +3d672 2 2287 95 +3d674 68 2288 95 +FUNC 3d6dc a8 0 testing::Test::Run +3d6dc 4 2425 95 +3d6e0 2 2425 95 +3d6e2 8 2426 95 +3d6ea 6 2428 95 +3d6f0 4 2429 95 +3d6f4 2 2430 95 +3d6f6 2 2429 95 +3d6f8 2 2430 95 +3d6fa 4 2429 95 +3d6fe 16 2430 95 +3d714 6 2432 95 +3d71a 8 2433 95 +3d722 2 2435 95 +3d724 4 2433 95 +3d728 18 2435 95 +3d740 8 2441 95 +3d748 4 2441 95 +3d74c 1e 2443 95 +3d76a 1a 2444 95 +FUNC 3d784 104 0 testing::TestInfo::Run +3d784 4 2584 95 +3d788 4 2585 95 +3d78c 2 2584 95 +3d78e 2 2584 95 +3d790 4 2585 95 +3d794 4 2588 95 +3d798 4 693 91 +3d79c 2 2588 95 +3d79e 4 2591 95 +3d7a2 2 3871 95 +3d7a4 2 2594 95 +3d7a6 8 3871 95 +3d7ae a 2594 95 +3d7b8 6 2596 95 +3d7be 2 2598 95 +3d7c0 2 2596 95 +3d7c2 6 2598 95 +3d7c8 4 2598 95 +3d7cc 16 2603 95 +3d7e2 14 2395 95 +3d7f6 a 2362 95 +3d800 c 2418 95 +3d80c 6 2418 95 +3d812 2 2418 95 +3d814 4 2418 95 +3d818 4 2418 95 +3d81c 2 2607 95 +3d81e 4 2607 95 +3d822 2 2607 95 +3d824 6 2614 95 +3d82a 4 2616 95 +3d82e 2 2614 95 +3d830 4 2614 95 +3d834 1a 2616 95 +3d84e a 2618 95 +3d858 4 585 82 +3d85c c 2621 95 +3d868 6 693 91 +3d86e 8 2610 95 +3d876 12 2626 95 +FUNC 3d888 d4 0 testing::TestCase::Run +3d888 4 2713 95 +3d88c 4 2714 95 +3d890 2 2713 95 +3d892 2 2713 95 +3d894 4 2714 95 +3d898 4 2716 95 +3d89c 4 686 91 +3d8a0 2 2716 95 +3d8a2 4 2719 95 +3d8a6 2 3871 95 +3d8a8 2 2721 95 +3d8aa 4 3871 95 +3d8ae 2 2724 95 +3d8b0 a 2721 95 +3d8ba 8 2722 95 +3d8c2 4 2722 95 +3d8c6 16 2724 95 +3d8dc 8 2726 95 +3d8e4 6 192 144 +3d8ea 6 2727 95 +3d8f0 8 2728 95 +3d8f8 4 2728 95 +3d8fc 4 2727 95 +3d900 e 2730 95 +3d90e 6 2732 95 +3d914 2 2734 95 +3d916 2 2732 95 +3d918 4 2732 95 +3d91c 18 2734 95 +3d934 c 2736 95 +3d940 4 686 91 +3d944 18 2738 95 +FUNC 3d95c 2d4 0 testing::internal::UnitTestImpl::RunAllTests +3d95c 4 4498 95 +3d960 2 320 95 +3d962 2 4498 95 +3d964 2 320 95 +3d966 2 4500 95 +3d968 2 4498 95 +3d96a 2 4500 95 +3d96c 8 4503 95 +3d974 2 4504 95 +3d976 c 4508 95 +3d982 4 4513 95 +3d986 4 4518 95 +3d98a 4 4525 95 +3d98e 2 4529 95 +3d990 6 4525 95 +3d996 c 4529 95 +3d9a2 4 4535 95 +3d9a6 12 4535 95 +3d9b8 8 4538 95 +3d9c0 8 4540 95 +3d9c8 8 4545 95 +3d9d0 6 4545 95 +3d9d6 2 138 91 +3d9d8 4 137 91 +3d9dc 8 143 91 +3d9e4 2 144 91 +3d9e6 4 4545 95 +3d9ea 4 3871 95 +3d9ee 8 4552 95 +3d9f6 a 4553 95 +3da00 2 4557 95 +3da02 a 4557 95 +3da0c 4 4557 95 +3da10 4 4560 95 +3da14 2 4548 95 +3da16 6 4568 95 +3da1c 6 4620 95 +3da22 6 152 91 +3da28 12 333 127 +3da3a e 4560 95 +3da48 6 60 103 +3da4e a 871 82 +3da58 4 4565 95 +3da5c 2 4568 95 +3da5e 4 4565 95 +3da62 2 4568 95 +3da64 6 4568 95 +3da6a 4 714 85 +3da6e 2 4573 95 +3da70 4 714 85 +3da74 4 4573 95 +3da78 c 4577 95 +3da84 6 4580 95 +3da8a 10 4582 95 +3da9a 4 60 103 +3da9e a 61 103 +3daa8 a 4584 95 +3dab2 6 4588 95 +3dab8 a 4596 95 +3dac2 a 64 118 +3dacc 2 4588 95 +3dace 4 594 91 +3dad2 a 192 144 +3dadc 6 4589 95 +3dae2 c 594 91 +3daee 2 595 91 +3daf0 6 595 91 +3daf6 2 595 91 +3daf8 4 4591 95 +3dafc 4 4589 95 +3db00 2 74 118 +3db02 4 60 103 +3db06 8 61 103 +3db0e 4 81 118 +3db12 a 4599 95 +3db1c 16 4602 95 +3db32 c 4605 95 +3db3e 6 576 91 +3db44 2 4609 95 +3db46 2 4618 95 +3db48 4 4609 95 +3db4c 4 4618 95 +3db50 6 4620 95 +3db56 4 4622 95 +3db5a 8 152 91 +3db62 14 152 91 +3db76 16 333 127 +3db8c a 240 126 +3db96 6 333 127 +3db9c 8 240 126 +3dba4 8 333 127 +3dbac 6 152 91 +3dbb2 2 156 91 +3dbb4 2 155 91 +3dbb6 6 156 91 +3dbbc 4 4622 95 +3dbc0 6 4560 95 +3dbc6 6 4560 95 +3dbcc a 4626 95 +3dbd6 6 4628 95 +3dbdc 54 4629 95 +FUNC 3dc30 60 0 testing::internal::StreamingListener::OnTestStart +3dc30 10 1152 91 +3dc40 2 1153 91 +3dc42 2 1152 91 +3dc44 2 1153 91 +3dc46 2 1153 91 +3dc48 6 1153 91 +3dc4e 2 1152 91 +3dc50 4 1153 91 +3dc54 c 1153 91 +3dc60 8 1153 91 +3dc68 c 156 137 +3dc74 1c 1154 91 +FUNC 3dc90 60 0 testing::internal::StreamingListener::OnTestCaseStart +3dc90 10 1142 91 +3dca0 2 1143 91 +3dca2 2 1142 91 +3dca4 2 1143 91 +3dca6 2 1143 91 +3dca8 6 1143 91 +3dcae 2 1142 91 +3dcb0 4 1143 91 +3dcb4 c 1143 91 +3dcc0 8 1143 91 +3dcc8 c 156 137 +3dcd4 1c 1144 91 +FUNC 3dcf0 6c 0 testing::FormatCountableNoun +3dcf0 12 2765 95 +3dd02 2 2765 95 +3dd04 2 2766 95 +3dd06 2 2765 95 +3dd08 4 2766 95 +3dd0c 2 2765 95 +3dd0e 4 2766 95 +3dd12 e 2766 95 +3dd20 12 2767 95 +3dd32 c 156 137 +3dd3e 1e 2768 95 +FUNC 3dd5c 9c 0 testing::internal::PrettyUnitTestResultPrinter::OnTestCaseStart +3dd5c 6 3048 95 +3dd62 6 3048 95 +3dd68 2 3050 95 +3dd6a 4 3048 95 +3dd6e 4 3050 95 +3dd72 8 3050 95 +3dd7a 2 3050 95 +3dd7c 8 3050 95 +3dd84 a 3051 95 +3dd8e c 3052 95 +3dd9a 2 1144 87 +3dd9c 4 797 82 +3dda0 2 3053 95 +3dda2 8 3054 95 +3ddaa e 3056 95 +3ddb8 a 3058 95 +3ddc2 6 156 137 +3ddc8 30 3059 95 +FUNC 3ddf8 150 0 testing::internal::PrettyUnitTestResultPrinter::OnTestIterationStart +3ddf8 e 3007 95 +3de06 2 3007 95 +3de08 c 3008 95 +3de14 c 3009 95 +3de20 10 3015 95 +3de30 20 3017 95 +3de50 2 3020 95 +3de52 c 3021 95 +3de5e 6 2328 87 +3de64 2 3025 95 +3de66 2 2328 87 +3de68 a 3025 95 +3de72 8 3028 95 +3de7a 2 798 91 +3de7c e 3031 95 +3de8a a 3034 95 +3de94 6 3037 95 +3de9a 6 2772 95 +3dea0 2 3037 95 +3dea2 a 2772 95 +3deac 8 3037 95 +3deb4 8 2777 95 +3debc 2 3037 95 +3debe 8 2777 95 +3dec6 c 3037 95 +3ded2 e 156 137 +3dee0 a 3038 95 +3deea 5e 3039 95 +FUNC 3df48 1a4 0 testing::internal::FormatEpochTimeInMillisAsIso8601 +3df48 8 3508 95 +3df50 a 3508 95 +3df5a e 3509 95 +3df68 2 3515 95 +3df6a 4 3509 95 +3df6e e 3515 95 +3df7c c 3516 95 +3df88 2 3520 95 +3df8a 2 3520 95 +3df8c c 3520 95 +3df98 2 3520 95 +3df9a 6 3520 95 +3dfa0 e 3520 95 +3dfae 2 3520 95 +3dfb0 c 3520 95 +3dfbc e 3520 95 +3dfca 8 3521 95 +3dfd2 2 3521 95 +3dfd4 6 3521 95 +3dfda 8 3521 95 +3dfe2 e 3521 95 +3dff0 10 3522 95 +3e000 4 3522 95 +3e004 4 3522 95 +3e008 2 3522 95 +3e00a 2 3523 95 +3e00c 6 3522 95 +3e012 a 3522 95 +3e01c 8 3523 95 +3e024 4 3523 95 +3e028 4 3523 95 +3e02c 4 3523 95 +3e030 4 3523 95 +3e034 8 3523 95 +3e03c 4 3524 95 +3e040 a 3523 95 +3e04a 4 3524 95 +3e04e 2 3525 95 +3e050 6 3524 95 +3e056 8 3525 95 +3e05e a 3525 95 +3e068 5a 156 137 +3e0c2 2a 3526 95 +FUNC 3e0ec a4 0 testing::internal::ParseFlagValue +3e0ec 8 4955 95 +3e0f4 c 4955 95 +3e100 4 4957 95 +3e104 2 4957 95 +3e106 e 4960 95 +3e114 c 4960 95 +3e120 4 4960 95 +3e124 4 4960 95 +3e128 a 4960 95 +3e132 e 156 137 +3e140 2 400 136 +3e142 2 4962 95 +3e144 2 400 136 +3e146 6 4962 95 +3e14c 2 4962 95 +3e14e 4 4965 95 +3e152 6 4968 95 +3e158 2 4968 95 +3e15a 4 4975 95 +3e15e 4 4978 95 +3e162 2 4962 95 +3e164 8 156 137 +3e16c 2 4957 95 +3e16e 22 4979 95 +FUNC 3e190 26 0 testing::internal::ParseBoolFlag +3e190 2 4991 95 +3e192 2 4991 95 +3e194 6 4993 95 +3e19a 2 4996 95 +3e19c 6 4999 95 +3e1a2 c 4999 95 +3e1ae 2 4999 95 +3e1b0 2 5000 95 +3e1b2 2 4999 95 +3e1b4 2 5001 95 +FUNC 3e1b8 48 0 testing::internal::ParseInt32Flag +3e1b8 2 5008 95 +3e1ba 2 5008 95 +3e1bc 2 5010 95 +3e1be 2 5008 95 +3e1c0 4 5010 95 +3e1c4 4 5013 95 +3e1c8 8 5016 95 +3e1d0 c 333 127 +3e1dc 8 5016 95 +3e1e4 a 5017 95 +3e1ee 6 85 79 +3e1f4 c 5018 95 +FUNC 3e200 1a 0 testing::internal::ParseStringFlag +3e200 2 5025 95 +3e202 2 5025 95 +3e204 6 5027 95 +3e20a 4 5030 95 +3e20e 6 5033 95 +3e214 4 5034 95 +3e218 2 5035 95 +FUNC 3e21c 2b8 0 testing::internal::ParseGoogleTestFlagsOnlyImpl +3e21c e 5165 95 +3e22a 2 5166 95 +3e22c 2 5165 95 +3e22e 4 5165 95 +3e232 2 5176 95 +3e234 4 5180 95 +3e238 6 5176 95 +3e23e 4 5180 95 +3e242 4 5176 95 +3e246 2 5178 95 +3e248 2 5165 95 +3e24a 6 5178 95 +3e250 2 5180 95 +3e252 4 5178 95 +3e256 2 5180 95 +3e258 a 5166 95 +3e262 10 5167 95 +3e272 a 5176 95 +3e27c 6 5175 95 +3e282 a 5178 95 +3e28c 6 5175 95 +3e292 a 5180 95 +3e29c 6 5175 95 +3e2a2 e 5181 95 +3e2b0 4 5175 95 +3e2b4 10 5183 95 +3e2c4 4 5175 95 +3e2c8 10 5185 95 +3e2d8 4 5175 95 +3e2dc e 5186 95 +3e2ea 4 5175 95 +3e2ee 10 5188 95 +3e2fe 4 5175 95 +3e302 e 5189 95 +3e310 4 5175 95 +3e314 e 5190 95 +3e322 4 5175 95 +3e326 e 5191 95 +3e334 4 5175 95 +3e338 e 5192 95 +3e346 2 5175 95 +3e348 e 5193 95 +3e356 2 5175 95 +3e358 e 5194 95 +3e366 2 5175 95 +3e368 e 5196 95 +3e376 2 5175 95 +3e378 e 5198 95 +3e386 2 5175 95 +3e388 e 5200 95 +3e396 4 5175 95 +3e39a a 5225 95 +3e3a4 6 5229 95 +3e3aa 2 5165 95 +3e3ac 8 5206 95 +3e3b4 4 5207 95 +3e3b8 2 5206 95 +3e3ba 6 5207 95 +3e3c0 6 5211 95 +3e3c6 4 5215 95 +3e3ca c 5216 95 +3e3d6 a 5216 95 +3e3e0 2 5216 95 +3e3e2 8 5221 95 +3e3ea 6 156 137 +3e3f0 4 5166 95 +3e3f4 a 5217 95 +3e3fe 4 5216 95 +3e402 a 5217 95 +3e40c 4 5216 95 +3e410 6 5218 95 +3e416 6 5216 95 +3e41c b8 5231 95 +FUNC 3e4d4 f8 0 testing::internal::StreamingListener::OnTestPartResult +3e4d4 10 1163 91 +3e4e4 4 1163 91 +3e4e8 2 77 81 +3e4ea 2 1163 91 +3e4ec 6 77 81 +3e4f2 2 1165 91 +3e4f4 a 1166 91 +3e4fe 8 1167 91 +3e506 e 1167 91 +3e514 e 1167 91 +3e522 4 1168 91 +3e526 2 1168 91 +3e528 4 1168 91 +3e52c 4 1168 91 +3e530 2 1168 91 +3e532 4 1168 91 +3e536 a 1168 91 +3e540 8 1168 91 +3e548 4 1169 91 +3e54c 8 1168 91 +3e554 4 1169 91 +3e558 2 1169 91 +3e55a 4 1169 91 +3e55e a 1169 91 +3e568 8 1169 91 +3e570 30 156 137 +3e5a0 2c 1170 91 +FUNC 3e5cc 348 0 testing::internal::XmlUnitTestResultPrinter::OutputXmlTestInfo +3e5cc 14 3568 95 +3e5e0 6 3568 95 +3e5e6 6 3570 95 +3e5ec 2 3568 95 +3e5ee 2 3570 95 +3e5f0 4 700 82 +3e5f4 4 3570 95 +3e5f8 2 700 82 +3e5fa 4 3570 95 +3e5fe a 333 127 +3e608 a 3573 95 +3e612 2 3573 95 +3e614 a 3573 95 +3e61e c 3573 95 +3e62a c 3573 95 +3e636 c 156 137 +3e642 8 1144 87 +3e64a 2 668 82 +3e64c 4 3575 95 +3e650 c 3577 95 +3e65c 4 1144 87 +3e660 4 668 82 +3e664 2 3577 95 +3e666 4 3577 95 +3e66a 6 3577 95 +3e670 c 3577 95 +3e67c c 156 137 +3e688 4 1144 87 +3e68c 2 660 82 +3e68e 4 3579 95 +3e692 c 3580 95 +3e69e 4 1144 87 +3e6a2 4 660 82 +3e6a6 a 3580 95 +3e6b0 e 3580 95 +3e6be c 156 137 +3e6ca c 3584 95 +3e6d6 6 3584 95 +3e6dc 6 3584 95 +3e6e2 4 3584 95 +3e6e6 2 3584 95 +3e6e8 6 3584 95 +3e6ee 8 3584 95 +3e6f6 c 3584 95 +3e702 c 156 137 +3e70e c 3586 95 +3e71a a 3586 95 +3e724 c 3586 95 +3e730 c 156 137 +3e73c c 3587 95 +3e748 a 3587 95 +3e752 2 3587 95 +3e754 4 3591 95 +3e758 2 3590 95 +3e75a a 3587 95 +3e764 c 156 137 +3e770 8 3588 95 +3e778 8 3588 95 +3e780 6 156 137 +3e786 6 3599 95 +3e78c 18 333 127 +3e7a4 10 192 144 +3e7b4 4 3591 95 +3e7b8 8 3592 95 +3e7c0 2 3593 95 +3e7c2 2 3592 95 +3e7c4 4 3593 95 +3e7c8 a 3594 95 +3e7d2 8 333 127 +3e7da 4 77 81 +3e7de 4 3598 95 +3e7e2 2 3599 95 +3e7e4 e 3598 95 +3e7f2 a 3599 95 +3e7fc e 3599 95 +3e80a 2 156 137 +3e80c 2 3601 95 +3e80e 4 156 137 +3e812 8 333 127 +3e81a a 3601 95 +3e824 a 3328 95 +3e82e 8 3601 95 +3e836 6 333 127 +3e83c c 156 137 +3e848 a 3603 95 +3e852 a 3603 95 +3e85c 6 156 137 +3e862 8 3604 95 +3e86a 8 3604 95 +3e872 6 156 137 +3e878 8 333 127 +3e880 12 156 137 +3e892 6 3591 95 +3e898 2 333 127 +3e89a 6 3609 95 +3e8a0 e 333 127 +3e8ae 6 156 137 +3e8b4 60 3613 95 +FUNC 3e914 228 0 testing::internal::XmlUnitTestResultPrinter::PrintXmlTestCase +3e914 14 3617 95 +3e928 4 3618 95 +3e92c 4 3617 95 +3e930 a 3618 95 +3e93a 2 3617 95 +3e93c 4 3618 95 +3e940 a 333 127 +3e94a 8 3619 95 +3e952 8 3620 95 +3e95a 2 3620 95 +3e95c a 3620 95 +3e966 c 3620 95 +3e972 c 3620 95 +3e97e c 156 137 +3e98a c 3622 95 +3e996 6 3622 95 +3e99c 2 3622 95 +3e99e 2 3622 95 +3e9a0 6 3622 95 +3e9a6 c 3622 95 +3e9b2 c 156 137 +3e9be c 3624 95 +3e9ca 6 3624 95 +3e9d0 2 3624 95 +3e9d2 2 3624 95 +3e9d4 6 3624 95 +3e9da c 3624 95 +3e9e6 c 156 137 +3e9f2 c 3627 95 +3e9fe 6 3627 95 +3ea04 2 3627 95 +3ea06 2 3627 95 +3ea08 6 3627 95 +3ea0e c 3627 95 +3ea1a c 156 137 +3ea26 c 3628 95 +3ea32 c 3628 95 +3ea3e c 3628 95 +3ea4a c 156 137 +3ea56 c 3630 95 +3ea62 a 3630 95 +3ea6c c 3630 95 +3ea78 c 156 137 +3ea84 a 3631 95 +3ea8e 8 3631 95 +3ea96 8 333 127 +3ea9e 6 156 137 +3eaa4 2 3634 95 +3eaa6 a 192 144 +3eab0 6 3634 95 +3eab6 10 3635 95 +3eac6 a 3636 95 +3ead0 4 3634 95 +3ead4 a 333 127 +3eade 8 3638 95 +3eae6 8 333 127 +3eaee 6 156 137 +3eaf4 48 3639 95 +FUNC 3eb3c 2c0 0 testing::internal::XmlUnitTestResultPrinter::PrintXmlUnitTest +3eb3c 14 3643 95 +3eb50 2 3644 95 +3eb52 4 3643 95 +3eb56 c 3644 95 +3eb62 2 3643 95 +3eb64 4 3644 95 +3eb68 14 333 127 +3eb7c 8 3647 95 +3eb84 12 3650 95 +3eb96 6 3650 95 +3eb9c 2 3650 95 +3eb9e 2 3650 95 +3eba0 8 3650 95 +3eba8 c 3650 95 +3ebb4 c 156 137 +3ebc0 c 3652 95 +3ebcc 6 3652 95 +3ebd2 2 3652 95 +3ebd4 2 3652 95 +3ebd6 6 3652 95 +3ebdc c 3652 95 +3ebe8 c 156 137 +3ebf4 c 3655 95 +3ec00 6 3655 95 +3ec06 2 3655 95 +3ec08 2 3655 95 +3ec0a 6 3655 95 +3ec10 c 3655 95 +3ec1c c 156 137 +3ec28 c 3656 95 +3ec34 c 3656 95 +3ec40 c 3656 95 +3ec4c c 156 137 +3ec58 c 3659 95 +3ec64 4 570 91 +3ec68 a 3659 95 +3ec72 c 3659 95 +3ec7e c 156 137 +3ec8a c 3661 95 +3ec96 4 573 91 +3ec9a a 3661 95 +3eca4 c 3661 95 +3ecb0 c 156 137 +3ecbc 8 3663 95 +3ecc4 c 3665 95 +3ecd0 4 798 91 +3ecd4 2 3665 95 +3ecd6 4 3665 95 +3ecda 2 3665 95 +3ecdc 2 3665 95 +3ecde 4 3665 95 +3ece2 c 3665 95 +3ecee c 156 137 +3ecfa 4 606 91 +3ecfe 8 3668 95 +3ed06 8 3668 95 +3ed0e 6 156 137 +3ed14 e 3670 95 +3ed22 c 3670 95 +3ed2e c 3670 95 +3ed3a c 156 137 +3ed46 a 333 127 +3ed50 2 3673 95 +3ed52 6 3673 95 +3ed58 4 3673 95 +3ed5c 8 3674 95 +3ed64 4 3674 95 +3ed68 4 3674 95 +3ed6c a 3675 95 +3ed76 6 3675 95 +3ed7c 4 3673 95 +3ed80 a 333 127 +3ed8a 8 3677 95 +3ed92 8 333 127 +3ed9a 6 156 137 +3eda0 5c 3678 95 +FUNC 3edfc c8 0 testing::internal::XmlUnitTestResultPrinter::OnTestIterationEnd +3edfc e 3383 95 +3ee0a 2 3383 95 +3ee0c 2 3385 95 +3ee0e 2 3386 95 +3ee10 2 3383 95 +3ee12 4 3385 95 +3ee16 2 3383 95 +3ee18 4 3385 95 +3ee1c 8 3386 95 +3ee24 a 3388 95 +3ee2e 14 3404 95 +3ee42 6 3405 95 +3ee48 6 3406 95 +3ee4e a 2298 87 +3ee58 6 3391 95 +3ee5e a 3408 95 +3ee68 4 3409 95 +3ee6c 4 3410 95 +3ee70 4 3409 95 +3ee74 8 3410 95 +3ee7c 8 3410 95 +3ee84 6 156 137 +3ee8a 6 3411 95 +3ee90 6 3408 95 +3ee96 c 156 137 +3eea2 22 3412 95 +FUNC 3eec4 2e 0 testing::internal::StreamableToString +3eec4 2 243 79 +3eec6 4 243 79 +3eeca 8 244 79 +3eed2 c 268 126 +3eede 8 244 79 +3eee6 6 85 79 +3eeec 6 245 79 +FUNC 3eef4 b4 0 testing::internal::PrettyUnitTestResultPrinter::OnTestEnd +3eef4 4 3080 95 +3eef8 4 700 82 +3eefc 8 3080 95 +3ef04 2 540 82 +3ef06 4 3080 95 +3ef0a 4 540 82 +3ef0e 2 3081 95 +3ef10 8 3082 95 +3ef18 a 3084 95 +3ef22 c 2983 95 +3ef2e 6 3087 95 +3ef34 2 3087 95 +3ef36 6 3088 95 +3ef3c 8 3090 95 +3ef44 4 3092 95 +3ef48 6 3092 95 +3ef4e 4 3092 95 +3ef52 4 3092 95 +3ef56 a 3092 95 +3ef60 8 156 137 +3ef68 8 3094 95 +3ef70 a 3096 95 +3ef7a 2e 3097 95 +FUNC 3efa8 1dc 0 testing::internal::PrettyUnitTestResultPrinter::OnTestIterationEnd +3efa8 c 3144 95 +3efb4 2 3145 95 +3efb6 4 3144 95 +3efba 4 3145 95 +3efbe 2 3144 95 +3efc0 4 3145 95 +3efc4 6 3148 95 +3efca 6 2772 95 +3efd0 2 3148 95 +3efd2 a 2772 95 +3efdc a 3148 95 +3efe6 8 2777 95 +3efee 2 3148 95 +3eff0 8 2777 95 +3eff8 c 3148 95 +3f004 c 156 137 +3f010 8 3149 95 +3f018 2 573 91 +3f01a 6 3151 95 +3f020 2 3151 95 +3f022 4 3151 95 +3f026 4 3151 95 +3f02a a 3151 95 +3f034 6 156 137 +3f03a 6 3153 95 +3f040 a 3154 95 +3f04a 6 3155 95 +3f050 10 2772 95 +3f060 2 3155 95 +3f062 6 2772 95 +3f068 a 3155 95 +3f072 6 156 137 +3f078 8 3157 95 +3f080 8 3158 95 +3f088 8 3159 95 +3f090 a 3160 95 +3f09a c 2772 95 +3f0a6 a 3161 95 +3f0b0 6 156 137 +3f0b6 6 3162 95 +3f0bc 4 3164 95 +3f0c0 6 3164 95 +3f0c6 4 3164 95 +3f0ca a 3164 95 +3f0d4 6 3167 95 +3f0da 4 3168 95 +3f0de 8 3168 95 +3f0e6 2 3169 95 +3f0e8 6 3170 95 +3f0ee 4 3175 95 +3f0f2 6 3175 95 +3f0f8 4 3175 95 +3f0fc e 3175 95 +3f10a a 3178 95 +3f114 70 3179 95 +FUNC 3f184 ac 0 testing::internal::PrettyUnitTestResultPrinter::OnTestCaseEnd +3f184 e 3099 95 +3f192 2 3099 95 +3f194 2 3100 95 +3f196 2 3099 95 +3f198 8 3100 95 +3f1a0 6 3103 95 +3f1a6 6 3103 95 +3f1ac 2 3103 95 +3f1ae a 3103 95 +3f1b8 a 3104 95 +3f1c2 6 3107 95 +3f1c8 6 3107 95 +3f1ce 8 3107 95 +3f1d6 4 3107 95 +3f1da e 3107 95 +3f1e8 8 156 137 +3f1f0 a 3108 95 +3f1fa 6 156 137 +3f200 30 3109 95 +FUNC 3f230 d8 0 testing::internal::StreamingListener::OnTestEnd +3f230 8 1156 91 +3f238 8 1156 91 +3f240 4 540 82 +3f244 4 1156 91 +3f248 6 540 82 +3f24e 2 1180 91 +3f250 6 1180 91 +3f256 4 1180 91 +3f25a a 1180 91 +3f264 e 1157 91 +3f272 10 1158 91 +3f282 8 1159 91 +3f28a 2 1159 91 +3f28c c 1159 91 +3f298 a 1159 91 +3f2a2 10 1160 91 +3f2b2 8 1160 91 +3f2ba 24 156 137 +3f2de 2a 1161 91 +FUNC 3f308 d8 0 testing::internal::StreamingListener::OnTestCaseEnd +3f308 8 1146 91 +3f310 8 1146 91 +3f318 2 830 82 +3f31a 4 1146 91 +3f31e 4 830 82 +3f322 6 1180 91 +3f328 6 1180 91 +3f32e 4 1180 91 +3f332 a 1180 91 +3f33c e 1147 91 +3f34a 14 1148 91 +3f35e 4 1148 91 +3f362 2 1148 91 +3f364 4 1148 91 +3f368 4 1148 91 +3f36c 4 1148 91 +3f370 a 1148 91 +3f37a 10 1149 91 +3f38a 8 1149 91 +3f392 24 156 137 +3f3b6 2a 1150 91 +FUNC 3f3e0 dc 0 testing::internal::StreamingListener::OnTestIterationEnd +3f3e0 8 1136 91 +3f3e8 8 1136 91 +3f3f0 2 1137 91 +3f3f2 4 1136 91 +3f3f6 6 1137 91 +3f3fc 2 1180 91 +3f3fe 6 1180 91 +3f404 4 1180 91 +3f408 a 1180 91 +3f412 e 1137 91 +3f420 10 1138 91 +3f430 4 573 91 +3f434 4 1138 91 +3f438 2 1138 91 +3f43a 4 1138 91 +3f43e 4 1138 91 +3f442 4 1138 91 +3f446 4 1138 91 +3f44a a 1138 91 +3f454 10 1139 91 +3f464 8 1139 91 +3f46c 24 156 137 +3f490 2c 1140 91 +FUNC 3f4bc f0 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +3f4bc 4 81 143 +3f4c0 2 81 143 +3f4c2 6 192 144 +3f4c8 4 173 144 +3f4cc 2 81 143 +3f4ce 2 192 144 +3f4d0 4 173 144 +3f4d4 4 81 143 +3f4d8 2 173 144 +3f4da 8 41 143 +3f4e2 8 175 144 +3f4ea 6 176 144 +3f4f0 e 177 144 +3f4fe 6 87 143 +3f504 4 551 106 +3f508 2 91 143 +3f50a 2 551 106 +3f50c 6 86 142 +3f512 2 84 142 +3f514 6 86 142 +3f51a 2 139 108 +3f51c 4 139 108 +3f520 2 88 142 +3f522 2 89 142 +3f524 a 86 142 +3f52e 8 93 143 +3f536 2 119 108 +3f538 8 119 108 +3f540 6 95 143 +3f546 6 314 142 +3f54c 2 249 142 +3f54e 4 249 142 +3f552 2 139 108 +3f554 6 139 108 +3f55a 6 249 142 +3f560 6 98 143 +3f566 2 86 142 +3f568 2 84 142 +3f56a 6 86 142 +3f570 4 86 142 +3f574 2 139 108 +3f576 4 139 108 +3f57a 2 88 142 +3f57c 2 89 142 +3f57e e 86 142 +3f58c 4 662 144 +3f590 2 319 106 +3f592 4 323 106 +3f596 2 104 143 +3f598 4 667 144 +3f59c 4 104 143 +3f5a0 2 668 144 +3f5a2 a 105 143 +FUNC 3f5b0 48e 0 testing::internal::edit_distance::CalculateOptimalEdits +3f5b0 4 990 95 +3f5b4 4 192 144 +3f5b8 2 990 95 +3f5ba 2 192 144 +3f5bc 2 990 95 +3f5be 8 192 144 +3f5c6 2 70 144 +3f5c8 2 192 144 +3f5ca 2 992 95 +3f5cc 4 342 106 +3f5d0 4 990 95 +3f5d4 4 992 95 +3f5d8 4 70 144 +3f5dc 2 481 106 +3f5de 2 342 106 +3f5e0 8 343 106 +3f5e8 6 343 106 +3f5ee 2 346 106 +3f5f0 6 347 106 +3f5f6 4 348 106 +3f5fa 6 352 106 +3f600 2 356 106 +3f602 4 146 108 +3f606 6 73 144 +3f60c 2 71 144 +3f60e 2 314 142 +3f610 2 249 142 +3f612 4 249 142 +3f616 4 146 108 +3f61a 4 249 142 +3f61e 2 342 106 +3f620 2 244 144 +3f622 8 342 106 +3f62a 2 346 106 +3f62c a 347 106 +3f636 4 348 106 +3f63a 2 352 106 +3f63c 2 348 106 +3f63e 8 352 106 +3f646 2 346 106 +3f648 2 356 106 +3f64a 2 73 144 +3f64c 4 70 144 +3f650 4 314 142 +3f654 2 249 142 +3f656 4 73 144 +3f65a 8 249 142 +3f662 2 348 106 +3f664 2 71 144 +3f666 6 73 144 +3f66c 2 348 106 +3f66e 6 249 142 +3f674 4 139 108 +3f678 4 192 144 +3f67c 4 70 144 +3f680 4 192 144 +3f684 4 342 106 +3f688 4 70 144 +3f68c 4 481 106 +3f690 2 342 106 +3f692 2 346 106 +3f694 2 348 106 +3f696 2 347 106 +3f698 4 348 106 +3f69c 2 352 106 +3f69e 2 353 106 +3f6a0 4 352 106 +3f6a4 2 356 106 +3f6a6 4 73 144 +3f6aa 4 71 144 +3f6ae 4 72 144 +3f6b2 4 73 144 +3f6b6 8 120 142 +3f6be 4 249 144 +3f6c2 8 249 142 +3f6ca 4 70 144 +3f6ce 2 244 144 +3f6d0 8 304 144 +3f6d8 10 192 144 +3f6e8 2 551 106 +3f6ea 4 192 144 +3f6ee 2 994 95 +3f6f0 4 551 106 +3f6f4 8 70 144 +3f6fc 4 481 106 +3f700 4 551 106 +3f704 2 73 144 +3f706 2 314 142 +3f708 6 73 144 +3f70e 2 139 108 +3f710 4 192 144 +3f714 2 314 142 +3f716 4 994 95 +3f71a 2 71 144 +3f71c 2 249 142 +3f71e 4 249 142 +3f722 2 139 108 +3f724 2 139 108 +3f726 6 249 142 +3f72c 2 342 106 +3f72e 2 244 144 +3f730 6 342 106 +3f736 6 346 106 +3f73c 6 347 106 +3f742 2 348 106 +3f744 2 347 106 +3f746 4 348 106 +3f74a 2 352 106 +3f74c 2 348 106 +3f74e 8 352 106 +3f756 2 346 106 +3f758 2 356 106 +3f75a 2 73 144 +3f75c 4 314 142 +3f760 4 73 144 +3f764 4 314 142 +3f768 8 249 142 +3f770 4 70 144 +3f774 2 71 144 +3f776 2 73 144 +3f778 6 314 142 +3f77e 4 551 106 +3f782 4 249 142 +3f786 4 139 108 +3f78a 4 192 144 +3f78e 2 551 106 +3f790 6 192 144 +3f796 8 70 144 +3f79e 4 481 106 +3f7a2 6 551 106 +3f7a8 4 71 144 +3f7ac 4 72 144 +3f7b0 2 73 144 +3f7b2 2 84 142 +3f7b4 a 73 144 +3f7be a 86 142 +3f7c8 6 86 142 +3f7ce 2 139 108 +3f7d0 4 139 108 +3f7d4 2 88 142 +3f7d6 2 89 142 +3f7d8 e 86 142 +3f7e6 4 249 144 +3f7ea 6 249 142 +3f7f0 2 244 144 +3f7f2 2 999 95 +3f7f4 2 244 144 +3f7f6 a 42 148 +3f800 4 997 95 +3f804 6 997 95 +3f80a e 998 95 +3f818 2 997 95 +3f81a 6 998 95 +3f820 6 999 95 +3f826 2 1004 95 +3f828 6 192 144 +3f82e 6 1002 95 +3f834 10 1003 95 +3f844 2 202 144 +3f846 4 1004 95 +3f84a 4 1002 95 +3f84e 2 1002 95 +3f850 4 1028 95 +3f854 2 1002 95 +3f856 12 1023 95 +3f868 6 192 144 +3f86e 18 1007 95 +3f886 8 192 144 +3f88e 6 1008 95 +3f894 14 1009 95 +3f8a8 e 1011 95 +3f8b6 2 1012 95 +3f8b8 8 1011 95 +3f8c0 8 1012 95 +3f8c8 4 1017 95 +3f8cc 8 1016 95 +3f8d4 2 202 144 +3f8d6 8 1017 95 +3f8de 8 1019 95 +3f8e6 8 1018 95 +3f8ee 2 1019 95 +3f8f0 a 1019 95 +3f8fa 8 1020 95 +3f902 1a 1021 95 +3f91c a 1022 95 +3f926 a 1022 95 +3f930 8 1023 95 +3f938 6 1024 95 +3f93e 8 1028 95 +3f946 6 1029 95 +3f94c 8 1008 95 +3f954 c 1007 95 +3f960 2 162 144 +3f962 8 67 144 +3f96a 4 481 106 +3f96e 18 192 144 +3f986 4 162 144 +3f98a 6 1036 95 +3f990 2 1037 95 +3f992 4 380 144 +3f996 2 1037 95 +3f998 4 380 144 +3f99c 4 1037 95 +3f9a0 2 380 144 +3f9a2 2 1037 95 +3f9a4 2 380 144 +3f9a6 2 119 108 +3f9a8 2 119 108 +3f9aa c 382 144 +3f9b6 e 162 144 +3f9c4 8 1039 95 +3f9cc 8 1040 95 +3f9d4 8 1036 95 +3f9dc 4 324 103 +3f9e0 2 91 105 +3f9e2 8 92 105 +3f9ea 4 93 105 +3f9ee 6 65 118 +3f9f4 2 74 118 +3f9f6 4 191 108 +3f9fa 8 42 148 +3fa02 4 81 118 +3fa06 2 87 144 +3fa08 a 323 106 +3fa12 6 65 118 +3fa18 2 74 118 +3fa1a 4 191 108 +3fa1e 2 304 144 +3fa20 6 304 144 +3fa26 4 81 118 +3fa2a 2 87 144 +3fa2c a 323 106 +3fa36 8 1044 95 +FUNC 3fa40 32 0 std::priv::_Impl_vector >::push_back +3fa40 2 376 144 +3fa42 4 380 144 +3fa46 2 376 144 +3fa48 2 380 144 +3fa4a 4 376 144 +3fa4e 2 380 144 +3fa50 2 119 108 +3fa52 6 119 108 +3fa58 8 382 144 +3fa60 e 162 144 +3fa6e 4 388 144 +FUNC 3fa72 30 0 testing::internal::DefaultGlobalTestPartResultReporter::ReportTestPartResult +3fa72 2 672 95 +3fa74 2 673 95 +3fa76 2 672 95 +3fa78 4 4872 95 +3fa7c 2 672 95 +3fa7e 2 4872 95 +3fa80 4 4872 95 +3fa84 4 4872 95 +3fa88 8 173 148 +3fa90 2 3871 95 +3fa92 2 674 95 +3fa94 4 675 95 +3fa98 4 3871 95 +3fa9c 2 674 95 +3fa9e 4 674 95 +FUNC 3faa4 194 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +3faa4 6 81 143 +3faaa 6 192 144 +3fab0 4 173 144 +3fab4 2 81 143 +3fab6 2 81 143 +3fab8 2 192 144 +3faba 6 173 144 +3fac0 2 81 143 +3fac2 2 173 144 +3fac4 8 41 143 +3facc a 175 144 +3fad6 6 176 144 +3fadc 6 176 144 +3fae2 4 176 144 +3fae6 8 347 106 +3faee 6 348 106 +3faf4 4 352 106 +3faf8 6 91 143 +3fafe a 86 142 +3fb08 6 86 142 +3fb0e 6 139 108 +3fb14 18 466 91 +3fb2c 12 86 142 +3fb3e a 93 143 +3fb48 2 119 108 +3fb4a 18 466 91 +3fb62 6 95 143 +3fb68 8 314 142 +3fb70 4 249 142 +3fb74 8 466 91 +3fb7c 6 249 142 +3fb82 4 139 108 +3fb86 18 466 91 +3fb9e 8 249 142 +3fba6 6 98 143 +3fbac e 86 142 +3fbba 6 86 142 +3fbc0 6 139 108 +3fbc6 18 466 91 +3fbde 14 86 142 +3fbf2 6 65 118 +3fbf8 2 74 118 +3fbfa 4 191 108 +3fbfe 4 156 137 +3fc02 2 81 118 +3fc04 4 156 137 +3fc08 4 81 118 +3fc0c 6 662 144 +3fc12 2 319 106 +3fc14 4 323 106 +3fc18 4 104 143 +3fc1c 4 667 144 +3fc20 2 668 144 +3fc22 6 105 143 +3fc28 6 346 106 +3fc2e a 356 106 +FUNC 3fc38 58 0 testing::UnitTest::PushGTestTrace +3fc38 6 4263 95 +3fc3e 2 4264 95 +3fc40 2 4263 95 +3fc42 6 1963 87 +3fc48 2 752 91 +3fc4a 6 2010 87 +3fc50 4 380 144 +3fc54 2 2010 87 +3fc56 4 380 144 +3fc5a 2 119 108 +3fc5c 14 466 91 +3fc70 8 382 144 +3fc78 e 162 144 +3fc86 6 4265 95 +3fc8c 4 4266 95 +FUNC 3fc90 68 0 testing::internal::ScopedTrace::ScopedTrace +3fc90 14 3769 95 +3fca4 2 3769 95 +3fca6 6 466 91 +3fcac 2 3769 95 +3fcae 4 466 91 +3fcb2 2 3773 95 +3fcb4 6 3774 95 +3fcba 4 3772 95 +3fcbe 4 3774 95 +3fcc2 8 3774 95 +3fcca 6 156 137 +3fcd0 4 3776 95 +3fcd4 6 3776 95 +3fcda 6 156 137 +3fce0 18 3777 95 +FUNC 3fcf8 b4 0 std::priv::_Impl_vector >::_M_fill_insert_aux +FUNC 3fcf8 b4 0 std::priv::_Impl_vector >::_M_fill_insert_aux +3fcf8 4 140 143 +3fcfc 2 140 143 +3fcfe 2 416 144 +3fd00 2 140 143 +3fd02 2 416 144 +3fd04 6 140 143 +3fd0a 2 416 144 +3fd0c 4 416 144 +3fd10 8 150 143 +3fd18 4 152 143 +3fd1c 6 153 143 +3fd22 a 120 142 +3fd2c 2 154 143 +3fd2e 4 255 105 +3fd32 2 154 143 +3fd34 2 256 105 +3fd36 2 154 143 +3fd38 2 256 105 +3fd3a 8 256 105 +3fd42 2 442 105 +3fd44 4 442 105 +3fd48 4 443 105 +3fd4c 2 442 105 +3fd4e 6 443 105 +3fd54 4 158 143 +3fd58 6 314 142 +3fd5e 2 249 142 +3fd60 8 249 142 +3fd68 2 249 142 +3fd6a 6 146 108 +3fd70 2 158 143 +3fd72 8 120 142 +3fd7a 6 160 143 +3fd80 6 442 105 +3fd86 4 443 105 +3fd8a 4 442 105 +3fd8e 6 443 105 +3fd94 a 146 143 +3fd9e 8 147 143 +3fda6 6 163 143 +FUNC 3fcf8 b4 0 std::priv::_Impl_vector >::_M_fill_insert_aux +3fcf8 4 140 143 +3fcfc 2 140 143 +3fcfe 2 416 144 +3fd00 2 140 143 +3fd02 2 416 144 +3fd04 6 140 143 +3fd0a 2 416 144 +3fd0c 4 416 144 +3fd10 8 150 143 +3fd18 4 152 143 +3fd1c 6 153 143 +3fd22 a 120 142 +3fd2c 2 154 143 +3fd2e 4 255 105 +3fd32 2 154 143 +3fd34 2 256 105 +3fd36 2 154 143 +3fd38 2 256 105 +3fd3a 8 256 105 +3fd42 2 442 105 +3fd44 4 442 105 +3fd48 4 443 105 +3fd4c 2 442 105 +3fd4e 6 443 105 +3fd54 4 158 143 +3fd58 6 314 142 +3fd5e 2 249 142 +3fd60 8 249 142 +3fd68 2 249 142 +3fd6a 6 146 108 +3fd70 2 158 143 +3fd72 8 120 142 +3fd7a 6 160 143 +3fd80 6 442 105 +3fd86 4 443 105 +3fd8a 4 442 105 +3fd8e 6 443 105 +3fd94 a 146 143 +3fd9e 8 147 143 +3fda6 6 163 143 +FUNC 3fdac 120 0 testing::internal::UnitTestImpl::GetTestCase +3fdac 8 4452 95 +3fdb4 8 4452 95 +3fdbc 4 4456 95 +3fdc0 4 4452 95 +3fdc4 4 4456 95 +3fdc8 8 4452 95 +3fdd0 4 4426 95 +3fdd4 4 4452 95 +3fdd8 6 4456 95 +3fdde 2 4422 95 +3fde0 2 4452 95 +3fde2 4 4456 95 +3fde6 8 4426 95 +3fdee 2 217 104 +3fdf0 8 4422 95 +3fdf8 e 217 104 +3fe06 12 156 137 +3fe18 6 4458 95 +3fe1e 6 4459 95 +3fe24 8 4463 95 +3fe2c e 4463 95 +3fe3a 6 4467 95 +3fe40 4 4463 95 +3fe44 4 4467 95 +3fe48 c 4466 95 +3fe54 a 156 137 +3fe5e 6 4466 95 +3fe64 2 4472 95 +3fe66 2 4474 95 +3fe68 4 4472 95 +3fe6c 2 172 143 +3fe6e 4 4474 95 +3fe72 8 172 143 +3fe7a c 173 143 +3fe86 10 176 143 +3fe96 6 173 148 +3fe9c 8 192 144 +3fea4 2 173 148 +3fea6 4 192 144 +3feaa 2 4480 95 +3feac 4 173 148 +3feb0 2 4481 95 +3feb2 1a 4482 95 +FUNC 3fecc 110 0 testing::internal::MakeAndRegisterTestInfo +3fecc 10 2508 95 +3fedc 4 2508 95 +3fee0 4 2511 95 +3fee4 4 2508 95 +3fee8 2 2511 95 +3feea 4 2508 95 +3feee 2 2511 95 +3fef0 6 2508 95 +3fef6 4 2511 95 +3fefa 2 2511 95 +3fefc 6 2508 95 +3ff02 4 2511 95 +3ff06 a 2511 95 +3ff10 6 2511 95 +3ff16 12 2511 95 +3ff28 2 2511 95 +3ff2a 4 2511 95 +3ff2e c 156 137 +3ff3a 4 2512 95 +3ff3e 4 664 91 +3ff42 2 2512 95 +3ff44 4 664 91 +3ff48 6 665 91 +3ff4e a 74 84 +3ff58 6 156 137 +3ff5e c 666 91 +3ff6a 12 666 91 +3ff7c 18 333 127 +3ff94 6 666 91 +3ff9a 4 1144 87 +3ff9e 4 660 82 +3ffa2 c 673 91 +3ffae 6 673 91 +3ffb4 28 2514 95 +FUNC 3ffdc 6e 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, unsigned int>, std::priv::_Select1st, std::allocator >, unsigned int> >, std::priv::_MapTraitsT, std::allocator >, unsigned int> >, std::allocator, std::allocator >, unsigned int> > >::_M_insert +3ffdc 2 358 140 +3ffde 2 350 140 +3ffe0 8 350 140 +3ffe8 2 358 140 +3ffea 8 359 140 +3fff2 2 360 140 +3fff4 2 361 140 +3fff6 4 362 140 +3fffa 4 364 140 +3fffe 4 364 140 +40002 a 79 111 +4000c 2 364 140 +4000e 6 367 140 +40014 2 368 140 +40016 2 369 140 +40018 2 367 140 +4001a 4 369 140 +4001e 4 370 140 +40022 6 373 140 +40028 2 374 140 +4002a 2 375 140 +4002c 2 373 140 +4002e 4 375 140 +40032 2 376 140 +40034 2 379 140 +40036 2 378 140 +40038 6 379 140 +4003e 2 380 140 +40040 2 382 140 +40042 4 380 140 +40046 2 142 141 +40048 2 382 140 +FUNC 4004a 78 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, unsigned int>, std::priv::_Select1st, std::allocator >, unsigned int> >, std::priv::_MapTraitsT, std::allocator >, unsigned int> >, std::allocator, std::allocator >, unsigned int> > >::insert_unique +4004a 4 405 140 +4004e 6 405 140 +40054 2 406 140 +40056 2 408 140 +40058 2 407 140 +4005a 2 409 140 +4005c a 79 111 +40066 2 412 140 +40068 4 412 140 +4006c 2 412 140 +4006e 6 405 140 +40074 2 142 141 +40076 2 415 140 +40078 6 416 140 +4007e 6 417 140 +40084 8 187 141 +4008c 2 421 140 +4008e a 79 111 +40098 2 421 140 +4009a 12 422 140 +400ac 4 142 141 +400b0 6 62 129 +400b6 2 142 141 +400b8 2 62 129 +400ba 8 425 140 +FUNC 400c2 174 0 std::priv::_Rb_tree, std::allocator >, std::less, std::allocator > >, std::pair, std::allocator >, unsigned int>, std::priv::_Select1st, std::allocator >, unsigned int> >, std::priv::_MapTraitsT, std::allocator >, unsigned int> >, std::allocator, std::allocator >, unsigned int> > >::insert_unique +400c2 6 432 140 +400c8 4 434 140 +400cc 2 432 140 +400ce 2 434 140 +400d0 4 432 140 +400d4 2 434 140 +400d6 4 437 140 +400da 4 438 140 +400de 4 143 111 +400e2 8 79 111 +400ea 4 440 140 +400ee 8 79 111 +400f6 4 447 140 +400fa c 297 140 +40106 a 94 141 +40110 4 301 140 +40114 6 302 140 +4011a 6 304 140 +40120 a 309 140 +4012a 4 458 140 +4012e c 462 140 +4013a a 309 140 +40144 6 513 140 +4014a a 475 140 +40154 6 142 141 +4015a 4 479 140 +4015e 2 480 140 +40160 a 79 111 +4016a 2 480 140 +4016c e 483 140 +4017a 6 486 140 +40180 6 187 141 +40186 4 143 111 +4018a 2 187 141 +4018c 8 79 111 +40194 4 494 140 +40198 a 79 111 +401a2 4 494 140 +401a6 8 500 140 +401ae 8 79 111 +401b6 2 517 140 +401b8 4 517 140 +401bc a 79 111 +401c6 4 517 140 +401ca 6 521 140 +401d0 e 522 140 +401de 8 497 140 +401e6 4 498 140 +401ea e 524 140 +401f8 4 142 141 +401fc c 297 140 +40208 c 94 141 +40214 4 301 140 +40218 6 302 140 +4021e 6 304 140 +40224 a 524 140 +4022e 8 534 140 +FUNC 40238 8c 0 std::map, std::allocator >, unsigned int, std::less, std::allocator > >, std::allocator, std::allocator >, unsigned int> > >::operator[], std::allocator > > +40238 e 175 123 +40246 4 568 141 +4024a 6 175 123 +40250 2 175 123 +40252 2 571 141 +40254 a 79 111 +4025e 2 572 141 +40260 4 573 141 +40264 a 575 141 +4026e 2 178 123 +40270 2 142 141 +40272 2 178 123 +40274 a 79 111 +4027e 2 178 123 +40280 12 181 123 +40292 c 62 129 +4029e 2 191 123 +402a0 2 62 129 +402a2 6 191 123 +402a8 2 142 141 +402aa 4 191 123 +402ae 2 179 123 +402b0 2 156 137 +402b2 2 179 123 +402b4 6 156 137 +402ba a 181 123 +FUNC 402c4 104 0 testing::internal::edit_distance::CalculateOptimalEdits +402c4 4 1067 95 +402c8 6 67 144 +402ce 2 1067 95 +402d0 2 250 141 +402d2 4 1067 95 +402d6 4 250 141 +402da 4 1067 95 +402de 2 250 141 +402e0 4 67 144 +402e4 2 481 106 +402e6 4 67 144 +402ea 2 481 106 +402ec c 250 141 +402f8 6 481 106 +402fe 4 263 141 +40302 2 265 141 +40304 2 266 141 +40306 2 267 141 +40308 2 391 141 +4030a 10 192 144 +4031a 4 1071 95 +4031e 4 203 144 +40322 8 543 141 +4032a 4 1053 95 +4032e 4 1053 95 +40332 a 1055 95 +4033c 4 173 148 +40340 2 1072 95 +40342 2 1071 95 +40344 10 173 148 +40354 10 192 144 +40364 4 1074 95 +40368 6 203 144 +4036e 8 543 141 +40376 4 1053 95 +4037a 4 1053 95 +4037e a 1055 95 +40388 4 173 148 +4038c 2 1075 95 +4038e 2 1074 95 +40390 6 173 148 +40396 4 531 141 +4039a 8 532 141 +403a2 c 1078 95 +403ae c 304 144 +403ba e 1079 95 +FUNC 403c8 36c 0 testing::internal::edit_distance::CreateUnifiedDiff +403c8 4 1166 95 +403cc 6 1169 95 +403d2 4 1166 95 +403d6 2 1169 95 +403d8 2 1166 95 +403da 6 1166 95 +403e0 2 1167 95 +403e2 6 1166 95 +403e8 4 1167 95 +403ec 8 1170 95 +403f4 20 333 127 +40414 8 192 144 +4041c 4 1171 95 +40420 8 1173 95 +40428 2 1176 95 +4042a 2 1173 95 +4042c 4 1174 95 +40430 4 1175 95 +40434 4 1173 95 +40438 6 1182 95 +4043e a 192 144 +40448 6 1189 95 +4044e 6 1190 95 +40454 4 1192 95 +40458 6 1193 95 +4045e 10 1124 95 +4046e 8 1124 95 +40476 12 205 121 +40488 8 75 132 +40490 6 1170 95 +40496 6 42 148 +4049c 14 1224 95 +404b0 c 1094 95 +404bc 4 1181 95 +404c0 4 353 121 +404c4 4 1094 95 +404c8 4 1181 95 +404cc 4 353 121 +404d0 8 1094 95 +404d8 20 353 121 +404f8 1c 1182 95 +40514 8 1193 95 +4051c c 1194 95 +40528 4 1200 95 +4052c 6 1202 95 +40532 2 1202 95 +40534 6 1205 95 +4053a a 1204 95 +40544 2 1202 95 +40546 8 1205 95 +4054e 26 1097 95 +40574 2 1104 95 +40576 2 306 106 +40578 4 1104 95 +4057c 6 306 106 +40582 4 307 106 +40586 4 119 108 +4058a a 68 129 +40594 2 427 121 +40596 2 428 121 +40598 4 429 121 +4059c 2 430 121 +4059e 4 431 121 +405a2 2 1108 95 +405a4 2 306 106 +405a6 4 1108 95 +405aa 6 306 106 +405b0 4 307 106 +405b4 4 119 108 +405b8 a 68 129 +405c2 2 427 121 +405c4 2 428 121 +405c6 4 429 121 +405ca 2 430 121 +405cc 2 431 121 +405ce c 1207 95 +405da c 306 106 +405e6 6 1108 95 +405ec 6 306 106 +405f2 4 307 106 +405f6 4 119 108 +405fa a 68 129 +40604 2 427 121 +40606 2 428 121 +40608 4 429 121 +4060c 2 430 121 +4060e 2 431 121 +40610 8 1212 95 +40618 8 1213 95 +40620 8 1189 95 +40628 a 333 127 +40632 4 1138 95 +40636 8 333 127 +4063e a 254 126 +40648 6 333 127 +4064e c 254 126 +4065a 6 1141 95 +40660 4 1141 95 +40664 8 333 127 +4066c 4 1144 95 +40670 a 333 127 +4067a a 254 126 +40684 8 333 127 +4068c c 254 126 +40698 a 333 127 +406a2 4 208 121 +406a6 4 600 121 +406aa 8 602 121 +406b2 2 208 121 +406b4 4 600 121 +406b8 8 602 121 +406c0 8 89 121 +406c8 4 305 127 +406cc 4 1117 95 +406d0 8 305 127 +406d8 10 333 127 +406e8 4 91 121 +406ec 14 205 121 +40700 2 1202 95 +40702 6 1207 95 +40708 2c 1224 95 +FUNC 40734 36 0 std::basic_string, std::allocator >::basic_string +40734 2 253 136 +40736 2 486 106 +40738 2 253 136 +4073a 2 486 106 +4073c 2 64 137 +4073e 4 129 137 +40742 8 130 137 +4074a 4 131 137 +4074e 2 132 137 +40750 8 131 137 +40758 2 135 137 +4075a 4 136 137 +4075e 4 137 137 +40762 4 138 137 +40766 4 254 136 +FUNC 4076a 5a 0 std::priv::_Impl_vector, std::allocator >, std::allocator, std::allocator > > >::_M_erase +4076a 4 588 144 +4076e 6 588 144 +40774 2 591 144 +40776 6 589 144 +4077c 4 591 144 +40780 4 591 144 +40784 6 156 137 +4078a 8 160 108 +40792 8 591 144 +4079a 2 156 137 +4079c 2 191 108 +4079e 4 156 137 +407a2 6 191 108 +407a8 2 160 108 +407aa 8 160 108 +407b2 4 602 144 +407b6 4 602 144 +407ba 4 608 144 +407be 6 610 144 +FUNC 407c4 14c 0 std::priv::_Impl_vector, std::allocator >, std::allocator, std::allocator > > >::_M_insert_overflow_aux +407c4 6 81 143 +407ca 4 81 143 +407ce c 192 144 +407da 4 173 144 +407de 2 81 143 +407e0 8 173 144 +407e8 8 41 143 +407f0 a 175 144 +407fa 4 176 144 +407fe 4 176 144 +40802 2 176 144 +40804 a 347 106 +4080e 6 348 106 +40814 8 352 106 +4081c 4 91 143 +40820 10 428 142 +40830 4 428 142 +40834 6 160 108 +4083a 8 160 108 +40842 8 430 142 +4084a e 428 142 +40858 a 93 143 +40862 2 119 108 +40864 8 119 108 +4086c 6 95 143 +40872 a 314 142 +4087c 8 249 142 +40884 6 249 142 +4088a 2 139 108 +4088c 8 139 108 +40894 8 249 142 +4089c 6 98 143 +408a2 10 428 142 +408b2 6 428 142 +408b8 6 160 108 +408be 8 160 108 +408c6 8 430 142 +408ce 12 428 142 +408e0 4 662 144 +408e4 2 319 106 +408e6 4 323 106 +408ea 6 104 143 +408f0 4 667 144 +408f4 2 668 144 +408f6 6 105 143 +408fc 4 346 106 +40900 10 356 106 +FUNC 40910 84 0 std::priv::_Impl_vector, std::allocator >, std::allocator, std::allocator > > >::push_back +40910 10 376 144 +40920 2 376 144 +40922 4 380 144 +40926 2 376 144 +40928 6 380 144 +4092e 2 119 108 +40930 6 119 108 +40936 8 382 144 +4093e a 416 144 +40948 4 416 144 +4094c 8 150 144 +40954 12 151 144 +40966 8 156 137 +4096e 10 154 144 +4097e 16 388 144 +FUNC 40994 c4 0 testing::internal::::SplitEscapedString +40994 6 1233 95 +4099a 2 67 144 +4099c 6 1233 95 +409a2 4 67 144 +409a6 2 481 106 +409a8 2 1233 95 +409aa 2 1233 95 +409ac 4 400 136 +409b0 2 1233 95 +409b2 2 400 136 +409b4 2 1236 95 +409b6 2 1233 95 +409b8 2 1236 95 +409ba 6 1236 95 +409c0 4 1236 95 +409c4 a 1238 95 +409ce 2 1241 95 +409d0 2 1240 95 +409d2 8 1023 136 +409da a 1241 95 +409e4 2 1242 95 +409e6 8 1244 95 +409ee e 1023 136 +409fc 8 173 148 +40a04 a 156 137 +40a0e c 1249 95 +40a1a 6 1243 95 +40a20 12 1023 136 +40a32 8 173 148 +40a3a 6 156 137 +40a40 18 1254 95 +FUNC 40a58 180 0 testing::internal::EqFailure +40a58 e 1277 95 +40a66 6 1277 95 +40a6c 2 1278 95 +40a6e 8 1277 95 +40a76 4 1278 95 +40a7a c 333 127 +40a86 8 1279 95 +40a8e 4 476 139 +40a92 2 1278 95 +40a94 4 476 139 +40a98 2 1280 95 +40a9a c 333 127 +40aa6 a 131 79 +40ab0 c 333 127 +40abc 8 1284 95 +40ac4 6 1285 95 +40aca c 333 127 +40ad6 8 476 139 +40ade 2 1288 95 +40ae0 c 333 127 +40aec a 131 79 +40af6 e 1292 95 +40b04 c 1292 95 +40b10 a 1294 95 +40b1a 8 1296 95 +40b22 c 192 144 +40b2e 4 1297 95 +40b32 a 192 144 +40b3c 4 1297 95 +40b40 c 42 148 +40b4c 2 277 82 +40b4e 2 1139 87 +40b50 4 277 82 +40b54 2 1303 95 +40b56 4 1139 87 +40b5a 8 1303 95 +40b62 6 1303 95 +40b68 6 256 82 +40b6e 6 85 79 +40b74 e 1304 95 +40b82 4 333 127 +40b86 4 1299 95 +40b8a 8 333 127 +40b92 c 1299 95 +40b9e a 131 79 +40ba8 8 156 137 +40bb0 28 1304 95 +FUNC 40bd8 78 0 testing::internal::CmpHelperSTREQ +40bd8 8 1451 95 +40be0 e 1451 95 +40bee 2 1452 95 +40bf0 6 1451 95 +40bf6 8 1452 95 +40bfe 4 277 82 +40c02 6 1139 87 +40c08 2 1460 95 +40c0a 2 1460 95 +40c0c 8 1460 95 +40c14 8 1460 95 +40c1c 10 1460 95 +40c2c c 156 137 +40c38 18 1461 95 +FUNC 40c50 b4 0 testing::InitGoogleTest +40c50 c 5281 95 +40c5c 2 5248 95 +40c5e 2 5281 95 +40c60 2 5248 95 +40c62 2 5281 95 +40c64 2 5281 95 +40c66 2 5248 95 +40c68 2 5281 95 +40c6a 2 5248 95 +40c6c 2 5251 95 +40c6e 4 5248 95 +40c72 2 5251 95 +40c74 8 5253 95 +40c7c 8 5255 95 +40c84 a 5255 95 +40c8e 10 156 137 +40c9e 6 630 144 +40ca4 8 632 144 +40cac 2 5281 95 +40cae 8 5260 95 +40cb6 a 5261 95 +40cc0 8 173 148 +40cc8 6 156 137 +40cce 4 5260 95 +40cd2 8 5236 95 +40cda 4 5267 95 +40cde 4 5267 95 +40ce2 22 5283 95 +FUNC 40d04 e 0 testing::internal::AlwaysFalse +40d04 2 692 85 +40d06 c 692 85 +FUNC 40d14 5c 0 testing::internal::DeathTestAbort +40d14 2 251 89 +40d16 2 251 89 +40d18 4 937 91 +40d1c 6 1144 87 +40d22 2 257 89 +40d24 c 2304 87 +40d30 8 259 89 +40d38 8 260 89 +40d40 6 261 89 +40d46 8 262 89 +40d4e 10 264 89 +40d5e 6 265 89 +40d64 c 2340 87 +FUNC 40d70 12 0 testing::internal::StackLowerThanAddress +40d70 2 983 89 +40d72 c 985 89 +40d7e 4 986 89 +FUNC 40d82 16 0 testing::internal::StackGrowsDown +40d82 2 990 89 +40d84 a 993 89 +40d8e a 995 89 +FUNC 40d98 30 0 testing::internal::GetLastErrnoDescription +40d98 2 304 89 +40d9a 2 304 89 +40d9c 8 305 89 +40da4 4 305 89 +40da8 2 305 89 +40daa 8 2315 87 +40db2 4 305 89 +40db6 8 305 89 +40dbe a 306 89 +FUNC 40dc8 58 0 testing::internal::DeathTest::DeathTest +40dc8 6 335 89 +40dce 12 335 89 +40de0 4 937 91 +40de4 2 743 91 +40de6 6 337 89 +40dec e 339 89 +40dfa 6 339 89 +40e00 20 341 89 +FUNC 40e20 34 0 testing::internal::ForkingDeathTest::ForkingDeathTest +40e20 2 792 89 +40e22 6 792 89 +40e28 e 371 89 +40e36 2 794 89 +40e38 2 371 89 +40e3a 4 794 89 +40e3e 8 371 89 +40e46 e 794 89 +FUNC 40e54 98 0 testing::internal::ParseNaturalNumber +40e54 6 976 91 +40e5a 2 980 91 +40e5c 2 976 91 +40e5e 2 980 91 +40e60 2 976 91 +40e62 2 980 91 +40e64 6 2188 87 +40e6a 4 980 91 +40e6e 6 983 91 +40e74 a 998 91 +40e7e 2 1002 91 +40e80 2 998 91 +40e82 2 1002 91 +40e84 2 998 91 +40e86 2 1002 91 +40e88 4 1002 91 +40e8c 8 1002 91 +40e94 8 1006 91 +40e9c 12 1006 91 +40eae e 333 127 +40ebc 6 1006 91 +40ec2 2 1009 91 +40ec4 a 1009 91 +40ece 6 1010 91 +40ed4 2 981 91 +40ed6 16 1014 91 +FUNC 40eec 6c 0 testing::internal::DeathTest::set_last_death_test_message +40eec 2 348 136 +40eee 2 355 89 +40ef0 c 348 136 +40efc 2 400 136 +40efe 2 243 135 +40f00 2 400 136 +40f02 4 244 135 +40f06 2 168 145 +40f08 c 168 145 +40f14 6 246 135 +40f1a 4 803 136 +40f1e 2 168 145 +40f20 2 806 136 +40f22 2 168 145 +40f24 8 806 136 +40f2c 2 168 145 +40f2e 6 168 145 +40f34 6 250 135 +40f3a 6 400 136 +40f40 2 250 135 +40f42 4 357 89 +40f46 12 250 135 +FUNC 40f58 a8 0 testing::internal::FormatDeathTestOutput +40f58 c 493 89 +40f64 2 101 108 +40f66 4 493 89 +40f6a 2 493 89 +40f6c 2 120 137 +40f6e 2 481 106 +40f70 2 124 137 +40f72 4 530 136 +40f76 2 493 89 +40f78 6 124 137 +40f7e 2 530 136 +40f80 2 101 108 +40f82 4 530 136 +40f86 c 496 89 +40f92 a 530 136 +40f9c a 498 89 +40fa6 e 1023 136 +40fb4 8 451 136 +40fbc 6 156 137 +40fc2 10 506 89 +40fd2 e 1023 136 +40fe0 8 451 136 +40fe8 6 156 137 +40fee 2 503 89 +40ff0 2 504 89 +40ff2 e 506 89 +FUNC 41000 2ac 0 testing::internal::DeathTestImpl::Passed +41000 6 530 89 +41006 2 531 89 +41008 8 530 89 +41010 6 530 89 +41016 6 531 89 +4101c 4 534 89 +41020 4 537 89 +41024 4 534 89 +41028 6 537 89 +4102e 14 333 127 +41042 2 150 79 +41044 14 333 127 +41058 16 540 89 +4106e 2e 333 127 +4109c 8 547 89 +410a4 a 131 79 +410ae 4 156 137 +410b2 16 333 127 +410c8 6 554 89 +410ce a 555 89 +410d8 6 556 89 +410de 22 333 127 +41100 2 150 79 +41102 3a 333 127 +4113c a 183 89 +41146 6 191 89 +4114c c 333 127 +41158 a 240 126 +41162 a 193 89 +4116c c 333 127 +41178 a 240 126 +41182 4 197 89 +41186 c 333 127 +41192 a 203 89 +4119c 8 1140 87 +411a4 a 131 79 +411ae 18 333 127 +411c6 8 566 89 +411ce a 131 79 +411d8 e 156 137 +411e6 12 571 89 +411f8 e 333 127 +41206 6 571 89 +4120c 4 536 89 +41210 2 557 89 +41212 8 575 89 +4121a 6 575 89 +41220 6 156 137 +41226 8 1140 87 +4122e 6 156 137 +41234 4 577 89 +41238 2 532 89 +4123a 72 577 89 +FUNC 412ac 2c8 0 testing::internal::DeathTestImpl::ReadAndInterpretStatusByte +412ac 10 425 89 +412bc 2 425 89 +412be 4 2309 87 +412c2 2 425 89 +412c4 a 2309 87 +412ce 4 435 89 +412d2 4 435 89 +412d6 8 435 89 +412de 4 439 89 +412e2 12 459 89 +412f4 a 333 127 +412fe 2 460 89 +41300 6 333 127 +41306 6 460 89 +4130c 8 460 89 +41314 6 156 137 +4131a 6 459 89 +41320 6 2314 87 +41326 4 462 89 +4132a 4 462 89 +4132e 6 462 89 +41334 e 462 89 +41342 e 462 89 +41350 e 462 89 +4135e 4 462 89 +41362 2 462 89 +41364 2 462 89 +41366 2 462 89 +41368 2 462 89 +4136a 2 462 89 +4136c 4 462 89 +41370 a 462 89 +4137a e 462 89 +41388 e 462 89 +41396 e 462 89 +413a4 6 462 89 +413aa 4 462 89 +413ae 4 462 89 +413b2 4 388 89 +413b6 2 464 89 +413b8 2 388 89 +413ba c 464 89 +413c6 4 437 89 +413ca 4 386 89 +413ce 18 440 89 +413e6 e 386 89 +413f4 8 313 89 +413fc 4 319 89 +41400 4 313 89 +41404 e 2309 87 +41412 4 318 89 +41416 4 319 89 +4141a 2 131 79 +4141c a 333 127 +41426 4 322 89 +4142a 4 322 89 +4142e 6 322 89 +41434 4 327 89 +41438 8 328 89 +41440 4 327 89 +41444 c 328 89 +41450 a 333 127 +4145a 2 329 89 +4145c 6 333 127 +41462 6 329 89 +41468 a 329 89 +41472 8 333 127 +4147a 8 240 126 +41482 8 333 127 +4148a 6 156 137 +41490 6 328 89 +41496 a 1140 87 +414a0 14 454 89 +414b4 1a 333 127 +414ce 8 254 126 +414d6 8 333 127 +414de 4 454 89 +414e2 4 324 89 +414e6 c 325 89 +414f2 4 325 89 +414f6 8 325 89 +414fe 8 325 89 +41506 e 325 89 +41514 6 156 137 +4151a 4 325 89 +4151e 56 464 89 +FUNC 41574 e0 0 testing::internal::DeathTestImpl::Abort +41574 c 470 89 +41580 2 476 89 +41582 4 470 89 +41586 2 476 89 +41588 a 476 89 +41592 2 476 89 +41594 6 476 89 +4159a a 2312 87 +415a4 4 478 89 +415a8 4 478 89 +415ac 6 478 89 +415b2 e 478 89 +415c0 e 478 89 +415ce e 478 89 +415dc 4 478 89 +415e0 4 478 89 +415e4 2 478 89 +415e6 2 478 89 +415e8 2 478 89 +415ea 4 478 89 +415ee a 478 89 +415f8 e 478 89 +41606 e 478 89 +41614 e 478 89 +41622 6 478 89 +41628 4 478 89 +4162c 4 478 89 +41630 24 487 89 +FUNC 41654 e8 0 testing::internal::ForkingDeathTest::Wait +41654 c 799 89 +41660 2 799 89 +41662 2 800 89 +41664 4 799 89 +41668 4 800 89 +4166c 4 803 89 +41670 10 806 89 +41680 4 806 89 +41684 6 806 89 +4168a e 806 89 +41698 e 806 89 +416a6 e 806 89 +416b4 4 806 89 +416b8 4 806 89 +416bc 2 806 89 +416be 2 806 89 +416c0 2 806 89 +416c2 4 806 89 +416c6 a 806 89 +416d0 e 806 89 +416de e 806 89 +416ec e 806 89 +416fa 6 806 89 +41700 4 806 89 +41704 4 806 89 +41708 2 807 89 +4170a 2 384 89 +4170c 2 808 89 +4170e 2 801 89 +41710 2c 809 89 +FUNC 4173c 3bc 0 testing::internal::NoExecDeathTest::AssumeRole +4173c 8 822 89 +41744 a 822 89 +4174e 4 823 89 +41752 4 824 89 +41756 4 823 89 +4175a 2 824 89 +4175c 14 825 89 +41770 6 218 89 +41776 34 333 127 +417aa 2 221 89 +417ac e 333 127 +417ba a 254 126 +417c4 8 333 127 +417cc 2 225 89 +417ce 4 333 127 +417d2 8 225 89 +417da 8 1140 87 +417e2 c 825 89 +417ee 6 156 137 +417f4 6 825 89 +417fa 12 829 89 +4180c e 829 89 +4181a e 829 89 +41828 e 829 89 +41836 4 829 89 +4183a 4 829 89 +4183e 2 829 89 +41840 2 829 89 +41842 2 829 89 +41844 4 829 89 +41848 a 829 89 +41852 e 829 89 +41860 c 829 89 +4186c 4 829 89 +41870 6 829 89 +41876 10 831 89 +41886 6 831 89 +4188c 6 156 137 +41892 4 832 89 +41896 6 1294 87 +4189c 6 842 89 +418a2 e 843 89 +418b0 e 843 89 +418be e 843 89 +418cc 10 843 89 +418dc 4 843 89 +418e0 6 843 89 +418e6 2 843 89 +418e8 2 843 89 +418ea 4 843 89 +418ee a 843 89 +418f8 e 843 89 +41906 c 843 89 +41912 6 843 89 +41918 4 843 89 +4191c 4 843 89 +41920 4 784 89 +41924 6 845 89 +4192a a 846 89 +41934 4 846 89 +41938 6 846 89 +4193e e 846 89 +4194c e 846 89 +4195a e 846 89 +41968 4 846 89 +4196c 6 846 89 +41972 2 846 89 +41974 2 846 89 +41976 4 846 89 +4197a a 846 89 +41984 e 846 89 +41992 e 846 89 +419a0 a 846 89 +419aa 4 846 89 +419ae 4 846 89 +419b2 4 390 89 +419b6 4 937 91 +419ba 2 599 91 +419bc 6 854 89 +419c2 8 855 89 +419ca 2 856 89 +419cc a 858 89 +419d6 4 858 89 +419da 6 858 89 +419e0 e 858 89 +419ee e 858 89 +419fc e 858 89 +41a0a 4 858 89 +41a0e 6 858 89 +41a14 2 858 89 +41a16 2 858 89 +41a18 4 858 89 +41a1c a 858 89 +41a26 e 858 89 +41a34 e 858 89 +41a42 a 858 89 +41a4c 4 858 89 +41a50 4 858 89 +41a54 4 388 89 +41a58 4 382 89 +41a5c 9c 863 89 +FUNC 41af8 184 0 testing::internal::ExecDeathTestChildMain +41af8 10 944 89 +41b08 2 944 89 +41b0a c 946 89 +41b16 4 946 89 +41b1a 6 946 89 +41b20 e 946 89 +41b2e e 946 89 +41b3c e 946 89 +41b4a 4 946 89 +41b4e 2 946 89 +41b50 2 946 89 +41b52 4 946 89 +41b56 2 946 89 +41b58 4 946 89 +41b5c a 946 89 +41b66 e 946 89 +41b74 e 946 89 +41b82 10 946 89 +41b92 4 946 89 +41b96 4 946 89 +41b9a 4 952 89 +41b9e 6 952 89 +41ba4 16 954 89 +41bba c 955 89 +41bc6 a 955 89 +41bd0 a 955 89 +41bda 6 965 89 +41be0 4 937 89 +41be4 8 965 89 +41bec 10 966 89 +41bfc 4 966 89 +41c00 e 966 89 +41c0e c 966 89 +41c1a a 966 89 +41c24 c 967 89 +41c30 6 967 89 +41c36 a 967 89 +41c40 3c 968 89 +FUNC 41c7c c8 0 testing::internal::DeathTestImpl::~DeathTestImpl +41c7c 10 374 89 +41c8c a 374 89 +41c96 10 374 89 +41ca6 e 374 89 +41cb4 e 374 89 +41cc2 e 374 89 +41cd0 4 374 89 +41cd4 4 374 89 +41cd8 2 374 89 +41cda 2 374 89 +41cdc 2 374 89 +41cde 4 374 89 +41ce2 a 374 89 +41cec e 374 89 +41cfa e 374 89 +41d08 6 374 89 +41d0e 4 374 89 +41d12 4 374 89 +41d16 2e 374 89 +FUNC 41d44 18 0 testing::internal::ExecDeathTest::~ExecDeathTest +41d44 2 868 89 +41d46 2 813 89 +41d48 c 776 89 +41d54 8 813 89 +FUNC 41d44 18 0 testing::internal::NoExecDeathTest::~NoExecDeathTest +FUNC 41d5c 12 0 testing::internal::ExecDeathTest::~ExecDeathTest +41d5c 2 813 89 +41d5e 6 813 89 +41d64 6 813 89 +41d6a 4 813 89 +FUNC 41d5c 12 0 testing::internal::NoExecDeathTest::~NoExecDeathTest +FUNC 41d70 1a8 0 testing::internal::DefaultDeathTestFactory::Create +41d70 10 1157 89 +41d80 8 1157 89 +41d88 4 937 91 +41d8c 2 1279 82 +41d8e 4 1144 87 +41d92 4 743 91 +41d96 6 609 82 +41d9c 2 1162 89 +41d9e 8 1164 89 +41da6 4 1165 89 +41daa a 1167 89 +41db4 e 1167 89 +41dc2 10 1168 89 +41dd2 2 1169 89 +41dd4 2 1169 89 +41dd6 4 1169 89 +41dda 4 1169 89 +41dde 2 1169 89 +41de0 4 1169 89 +41de4 a 1169 89 +41dee 10 1169 89 +41dfe 6 1169 89 +41e04 24 156 137 +41e28 4 1170 89 +41e2c 8 1173 89 +41e34 4 1174 89 +41e38 8 1173 89 +41e40 4 1174 89 +41e44 12 1189 89 +41e56 8 1190 89 +41e5e 1a 872 89 +41e78 e 1191 89 +41e86 8 1192 89 +41e8e 10 816 89 +41e9e 4 1192 89 +41ea2 e 1199 89 +41eb0 e 1200 89 +41ebe 6 1200 89 +41ec4 c 156 137 +41ed0 e 1205 89 +41ede 2 1175 89 +41ee0 2 1176 89 +41ee2 2 1175 89 +41ee4 2 1176 89 +41ee6 32 1205 89 +FUNC 41f18 30 0 std::priv::_Impl_vector >::_M_fill_insert +41f18 6 166 143 +41f1e 2 171 143 +41f20 e 172 143 +41f2e 8 173 143 +41f36 e 176 143 +41f44 4 179 143 +FUNC 41f48 22 0 testing::internal::Arguments::AddArgument +41f48 2 899 89 +41f4a 2 900 89 +41f4c 2 899 89 +41f4e 2 2276 87 +41f50 2 900 89 +41f52 4 2276 87 +41f56 6 900 89 +41f5c a 225 143 +41f66 4 901 89 +FUNC 41f6c 98c 0 testing::internal::ExecDeathTest::AssumeRole +41f6c a 1102 89 +41f76 a 1102 89 +41f80 4 937 91 +41f84 4 1279 82 +41f88 4 744 91 +41f8c 4 1144 87 +41f90 6 1107 89 +41f96 2 1109 89 +41f98 6 1115 89 +41f9e 2 390 89 +41fa0 2 1111 89 +41fa2 2 390 89 +41fa4 4 1111 89 +41fa8 4 1115 89 +41fac 4 1115 89 +41fb0 14 1115 89 +41fc4 10 1115 89 +41fd4 10 1115 89 +41fe4 10 1115 89 +41ff4 4 1115 89 +41ff8 2 1115 89 +41ffa 2 1115 89 +41ffc 2 1115 89 +41ffe 2 1115 89 +42000 2 1115 89 +42002 4 1115 89 +42006 a 1115 89 +42010 10 1115 89 +42020 e 1115 89 +4202e 4 1118 89 +42032 6 1118 89 +42038 18 1118 89 +42050 10 1118 89 +42060 10 1118 89 +42070 10 1118 89 +42080 4 1118 89 +42084 2 1118 89 +42086 2 1118 89 +42088 2 1118 89 +4208a 2 1118 89 +4208c 2 1118 89 +4208e 4 1118 89 +42092 a 1118 89 +4209c c 1118 89 +420a8 2 1118 89 +420aa 4 1118 89 +420ae e 1118 89 +420bc 6 1118 89 +420c2 4 1121 89 +420c6 4 1121 89 +420ca 8 1121 89 +420d2 4 1121 89 +420d6 2 1121 89 +420d8 2 1121 89 +420da 8 1121 89 +420e2 a 1121 89 +420ec 6 1121 89 +420f2 4 1121 89 +420f6 6 1121 89 +420fc 2 1121 89 +420fe 6 1121 89 +42104 e 1121 89 +42112 10 1122 89 +42122 12 1122 89 +42134 c 1122 89 +42140 24 156 137 +42164 e 1124 89 +42172 e 1124 89 +42180 8 1124 89 +42188 4 1124 89 +4218c a 1124 89 +42196 a 1124 89 +421a0 6 1125 89 +421a6 4 1125 89 +421aa a 1125 89 +421b4 10 1125 89 +421c4 e 1125 89 +421d2 a 1125 89 +421dc a 1125 89 +421e6 8 1126 89 +421ee a 1126 89 +421f8 a 1126 89 +42202 8 1127 89 +4220a a 1127 89 +42214 4e 156 137 +42262 2 386 144 +42264 2 67 144 +42266 2 386 144 +42268 4 67 144 +4226c 2 481 106 +4226e 4 890 89 +42272 e 386 144 +42280 4 877 89 +42284 c 192 144 +42290 2 877 89 +42292 2 342 106 +42294 4 70 144 +42298 2 342 106 +4229a 4 70 144 +4229e 6 481 106 +422a4 2 342 106 +422a6 8 343 106 +422ae 4 343 106 +422b2 2 346 106 +422b4 2 348 106 +422b6 2 347 106 +422b8 4 348 106 +422bc 4 352 106 +422c0 2 348 106 +422c2 8 352 106 +422ca 2 356 106 +422cc 6 73 144 +422d2 4 71 144 +422d6 4 72 144 +422da 8 73 144 +422e2 10 86 142 +422f2 2 84 142 +422f4 4 86 142 +422f8 6 86 142 +422fe 2 139 108 +42300 8 139 108 +42308 2 88 142 +4230a 2 89 142 +4230c 4 88 142 +42310 12 86 142 +42322 c 249 144 +4232e 8 905 89 +42336 4 908 89 +4233a 2 2276 87 +4233c 4 908 89 +42340 4 2276 87 +42344 2 225 143 +42346 2 908 89 +42348 a 225 143 +42352 4 905 89 +42356 6 42 148 +4235c 8 1130 89 +42364 8 1131 89 +4236c e 1133 89 +4237a 6 1133 89 +42380 6 156 137 +42386 4 1135 89 +4238a 6 1294 87 +42390 2 1140 89 +42392 c 1005 89 +4239e a 1045 89 +423a8 6 1047 89 +423ae e 1048 89 +423bc 4 1048 89 +423c0 6 1048 89 +423c6 c 1048 89 +423d2 c 1048 89 +423de c 1048 89 +423ea 4 1048 89 +423ee 2 1048 89 +423f0 2 1048 89 +423f2 2 1048 89 +423f4 2 1048 89 +423f6 2 1048 89 +423f8 4 1048 89 +423fc a 1048 89 +42406 e 1048 89 +42414 e 1048 89 +42422 c 1048 89 +4242e 4 1048 89 +42432 4 1048 89 +42436 4 1048 89 +4243a 4 1053 89 +4243e 8 1055 89 +42446 a 1056 89 +42450 10 1056 89 +42460 2 1060 89 +42462 8 176 102 +4246a 14 1060 89 +4247e e 1061 89 +4248c c 1061 89 +42498 c 1061 89 +424a4 e 1061 89 +424b2 6 1061 89 +424b8 2 1061 89 +424ba 2 1061 89 +424bc 2 1061 89 +424be 4 1061 89 +424c2 a 1061 89 +424cc e 1061 89 +424da c 1061 89 +424e6 4 1061 89 +424ea 4 1061 89 +424ee 8 1071 89 +424f6 4 1071 89 +424fa 2 1072 89 +424fc 6 1073 89 +42502 4 1073 89 +42506 4 1073 89 +4250a 2 1073 89 +4250c 6 1073 89 +42512 a 1073 89 +4251c c 1073 89 +42528 c 1073 89 +42534 e 1073 89 +42542 6 1073 89 +42548 2 1073 89 +4254a 2 1073 89 +4254c 2 1073 89 +4254e 4 1073 89 +42552 a 1073 89 +4255c e 1073 89 +4256a ba 1073 89 +42624 4 1073 89 +42628 6 1073 89 +4262e 10 1076 89 +4263e 14 1078 89 +42652 c 1078 89 +4265e c 1078 89 +4266a e 1078 89 +42678 6 1078 89 +4267e 2 1078 89 +42680 2 1078 89 +42682 2 1078 89 +42684 4 1078 89 +42688 a 1078 89 +42692 e 1078 89 +426a0 c 1078 89 +426ac 4 1078 89 +426b0 6 1078 89 +426b6 4 1090 89 +426ba 4 1090 89 +426be e 1090 89 +426cc 4 1090 89 +426d0 6 1090 89 +426d6 c 1090 89 +426e2 c 1090 89 +426ee c 1090 89 +426fa 4 1090 89 +426fe 2 1090 89 +42700 2 1090 89 +42702 2 1090 89 +42704 2 1090 89 +42706 2 1090 89 +42708 4 1090 89 +4270c a 1090 89 +42716 e 1090 89 +42724 e 1090 89 +42732 c 1090 89 +4273e c 1094 89 +4274a c 1094 89 +42756 c 1094 89 +42762 e 1094 89 +42770 6 1094 89 +42776 2 1094 89 +42778 2 1094 89 +4277a 2 1094 89 +4277c 4 1094 89 +42780 a 1094 89 +4278a e 1094 89 +42798 c 1094 89 +427a4 4 1094 89 +427a8 4 1094 89 +427ac 10 1141 89 +427bc 4 1141 89 +427c0 6 1141 89 +427c6 c 1141 89 +427d2 c 1141 89 +427de c 1141 89 +427ea 4 1141 89 +427ee 2 1141 89 +427f0 4 1141 89 +427f4 4 1141 89 +427f8 4 1141 89 +427fc a 1141 89 +42806 e 1141 89 +42814 e 1141 89 +42822 c 1141 89 +4282e 4 1141 89 +42832 4 1141 89 +42836 2 784 89 +42838 2 388 89 +4283a 2 784 89 +4283c 8 388 89 +42844 6 382 89 +4284a 6 894 89 +42850 a 896 89 +4285a 4 87 144 +4285e 2 88 144 +42860 6 323 106 +42866 c 156 137 +42872 2 1145 89 +42874 e 1146 89 +42882 4 1084 89 +42886 8 1084 89 +4288e 6 1085 89 +42894 64 1146 89 +FUNC 428f8 16c 0 testing::internal::ParseInternalRunDeathTestFlag +428f8 6 1298 89 +428fe 2 1299 89 +42900 4 1298 89 +42904 2 1299 89 +42906 2 1298 89 +42908 2 1299 89 +4290a 2 1298 89 +4290c 4 1299 89 +42910 2 1298 89 +42912 a 1299 89 +4291c 4 1303 89 +42920 2 1306 89 +42922 4 67 144 +42926 2 481 106 +42928 6 1306 89 +4292e 2 1303 89 +42930 6 1304 89 +42936 6 1306 89 +4293c 4 67 144 +42940 2 481 106 +42942 6 1214 89 +42948 c 1215 89 +42954 4 1216 89 +42958 2 1215 89 +4295a 8 1023 136 +42962 2 1216 89 +42964 6 1023 136 +4296a 8 173 148 +42972 8 156 137 +4297a 8 1023 136 +42982 8 173 148 +4298a 6 156 137 +42990 6 1221 89 +42996 2 91 105 +42998 2 92 105 +4299a 2 93 105 +4299c 2 92 105 +4299e 2 91 105 +429a0 2 92 105 +429a2 2 93 105 +429a4 2 92 105 +429a6 2 91 105 +429a8 2 92 105 +429aa 2 42 148 +429ac 2 92 105 +429ae 2 93 105 +429b0 4 42 148 +429b4 6 156 137 +429ba 4 1307 89 +429be 2 192 144 +429c0 2 1307 89 +429c2 a 192 144 +429cc 4 1332 89 +429d0 8 1330 89 +429d8 2 1330 89 +429da a 1331 89 +429e4 2 1331 89 +429e6 e 1332 89 +429f4 2 1299 89 +429f6 c 1340 89 +42a02 10 1334 89 +42a12 6 1334 89 +42a18 c 1339 89 +42a24 8 1339 89 +42a2c e 241 83 +42a3a a 42 148 +42a44 20 1340 89 +FUNC 42a64 8 0 testing::internal::FilePath::FindLastPathSeparator +42a64 8 137 90 +FUNC 42a6c 30 0 testing::internal::FilePath::FileOrDirectoryExists +42a6c 6 209 90 +42a72 6 209 90 +42a78 4 2272 87 +42a7c 2 209 90 +42a7e 4 2272 87 +42a82 1a 219 90 +FUNC 42a9c 40 0 testing::internal::FilePath::DirectoryExists +42a9c 6 223 90 +42aa2 6 223 90 +42aa8 4 2272 87 +42aac 2 223 90 +42aae 4 2272 87 +42ab2 2 244 90 +42ab4 6 2278 87 +42aba a 244 90 +42ac4 2 244 90 +42ac6 16 249 90 +FUNC 42adc e 0 testing::internal::FilePath::IsAbsolutePath +42adc 2 274 90 +42ade 2 94 90 +42ae0 a 276 90 +FUNC 42aea 1a 0 testing::internal::FilePath::IsDirectory +42aea 4 300 90 +42aee 4 301 90 +42af2 e 301 90 +42b00 2 301 90 +42b02 2 303 90 +FUNC 42b04 20 0 testing::internal::FilePath::CreateFolder +42b04 2 325 90 +42b06 4 334 90 +42b0a 2 325 90 +42b0c 6 334 90 +42b12 4 337 90 +42b16 2 338 90 +42b18 4 341 90 +42b1c 4 338 90 +42b20 4 341 90 +FUNC 42b24 6c 0 testing::internal::FilePath::Normalize +42b24 4 356 90 +42b28 2 356 90 +42b2a 2 357 90 +42b2c 4 384 90 +42b30 8 358 90 +42b38 4 400 136 +42b3c 8 362 90 +42b44 4 400 136 +42b48 2 364 90 +42b4a 2 400 136 +42b4c 8 364 90 +42b54 4 366 90 +42b58 4 367 90 +42b5c a 368 90 +42b66 6 369 90 +42b6c a 376 90 +42b76 4 382 90 +42b7a 2 381 90 +42b7c 4 382 90 +42b80 2 383 90 +42b82 4 384 90 +42b86 a 383 90 +FUNC 42b90 78 0 testing::internal::FilePath::GetCurrentDir +42b90 e 99 90 +42b9e 8 99 90 +42ba6 2 108 90 +42ba8 2 99 90 +42baa 2 108 90 +42bac 2 99 90 +42bae a 108 90 +42bb8 a 109 90 +42bc2 2 116 90 +42bc4 6 116 90 +42bca 2 116 90 +42bcc a 116 90 +42bd6 8 116 90 +42bde 6 156 137 +42be4 24 118 90 +FUNC 42c08 58 0 testing::internal::FilePath::RemoveDirectoryName +42c08 6 155 90 +42c0e 8 155 90 +42c16 2 156 90 +42c18 4 155 90 +42c1c 4 156 90 +42c20 4 157 90 +42c24 c 157 90 +42c30 8 157 90 +42c38 8 156 137 +42c40 8 62 84 +42c48 18 158 90 +FUNC 42c60 64 0 testing::internal::FilePath::RemoveTrailingPathSeparator +42c60 6 346 90 +42c66 8 346 90 +42c6e 2 347 90 +42c70 4 346 90 +42c74 6 347 90 +42c7a 2 349 90 +42c7c 4 400 136 +42c80 2 1023 136 +42c82 2 400 136 +42c84 10 1023 136 +42c94 8 349 90 +42c9c 8 156 137 +42ca4 8 62 84 +42cac 18 350 90 +FUNC 42cc4 14c 0 testing::internal::FilePath::ConcatPaths +42cc4 10 200 90 +42cd4 2 200 90 +42cd6 4 201 90 +42cda 2 200 90 +42cdc 4 201 90 +42ce0 8 62 84 +42ce8 8 203 90 +42cf0 4 400 136 +42cf4 2 120 137 +42cf6 2 400 136 +42cf8 4 124 137 +42cfc 2 120 137 +42cfe 2 481 106 +42d00 4 124 137 +42d04 4 101 108 +42d08 2 107 139 +42d0a 2 101 108 +42d0c 6 107 139 +42d12 6 74 137 +42d18 4 74 137 +42d1c 4 74 137 +42d20 2 74 137 +42d22 4 535 136 +42d26 6 536 136 +42d2c 4 346 106 +42d30 2 158 106 +42d32 2 347 106 +42d34 2 158 106 +42d36 6 134 124 +42d3c 8 158 106 +42d44 6 352 106 +42d4a 4 356 106 +42d4e 14 86 142 +42d62 8 86 142 +42d6a 6 146 108 +42d70 a 101 108 +42d7a a 174 135 +42d84 4 175 135 +42d88 2 160 137 +42d8a 4 164 137 +42d8e 4 165 137 +42d92 4 101 108 +42d96 2 232 145 +42d98 2 101 108 +42d9a 4 120 137 +42d9e 4 101 108 +42da2 2 232 145 +42da4 2 124 137 +42da6 2 232 145 +42da8 2 539 136 +42daa 2 400 136 +42dac 2 539 136 +42dae 2 400 136 +42db0 2 539 136 +42db2 8 400 136 +42dba 2 124 137 +42dbc 4 120 137 +42dc0 4 481 106 +42dc4 6 124 137 +42dca 2 39 139 +42dcc 4 101 108 +42dd0 6 39 139 +42dd6 8 40 139 +42dde 8 204 90 +42de6 12 156 137 +42df8 18 205 90 +FUNC 42e10 90 0 testing::internal::FilePath::RemoveFileName +42e10 8 166 90 +42e18 8 166 90 +42e20 2 167 90 +42e22 4 166 90 +42e26 4 167 90 +42e2a 2 120 137 +42e2c 2 167 90 +42e2e 4 124 137 +42e32 2 120 137 +42e34 2 481 106 +42e36 4 124 137 +42e3a 6 101 108 +42e40 8 169 90 +42e48 2 112 137 +42e4a 6 225 136 +42e50 2 112 137 +42e52 2 481 106 +42e54 4 225 136 +42e58 a 349 136 +42e62 8 156 137 +42e6a a 172 90 +42e74 8 174 90 +42e7c 6 156 137 +42e82 1e 175 90 +FUNC 42ea0 70 0 testing::internal::FilePath::CreateDirectoriesRecursively +42ea0 6 308 90 +42ea6 a 308 90 +42eb0 8 309 90 +42eb8 8 313 90 +42ec0 6 313 90 +42ec6 2 313 90 +42ec8 6 317 90 +42ece 2 317 90 +42ed0 4 317 90 +42ed4 8 317 90 +42edc 6 156 137 +42ee2 a 318 90 +42eec 8 318 90 +42ef4 6 156 137 +42efa 16 319 90 +FUNC 42f10 160 0 testing::internal::FilePath::MakeFileName +42f10 8 186 90 +42f18 4 186 90 +42f1c 2 120 137 +42f1e 8 186 90 +42f26 4 124 137 +42f2a 8 186 90 +42f32 2 120 137 +42f34 2 481 106 +42f36 4 124 137 +42f3a c 101 108 +42f46 6 188 90 +42f4c c 189 90 +42f58 a 189 90 +42f62 a 349 136 +42f6c a 156 137 +42f76 8 191 90 +42f7e 2 244 79 +42f80 4 191 90 +42f84 6 244 79 +42f8a a 240 126 +42f94 8 244 79 +42f9c 4 1153 87 +42fa0 8 1154 87 +42fa8 4 1155 87 +42fac 6 1155 87 +42fb2 4 400 136 +42fb6 2 120 137 +42fb8 6 400 136 +42fbe 2 124 137 +42fc0 2 400 136 +42fc2 2 35 139 +42fc4 2 124 137 +42fc6 2 120 137 +42fc8 2 481 106 +42fca 4 124 137 +42fce 4 101 108 +42fd2 4 39 139 +42fd6 2 101 108 +42fd8 2 39 139 +42fda 4 40 139 +42fde 6 39 139 +42fe4 8 40 139 +42fec c 192 90 +42ff8 a 192 90 +43002 a 349 136 +4300c 1e 156 137 +4302a 8 194 90 +43032 a 194 90 +4303c c 156 137 +43048 28 195 90 +FUNC 43070 74 0 testing::internal::FilePath::GenerateUniqueFileName +43070 c 288 90 +4307c 2 61 84 +4307e 2 288 90 +43080 6 288 90 +43086 4 61 84 +4308a 4 288 90 +4308e 4 61 84 +43092 2 290 90 +43094 14 292 90 +430a8 4 348 136 +430ac a 349 136 +430b6 6 156 137 +430bc 6 291 90 +430c2 2 292 90 +430c4 4 291 90 +430c8 1c 295 90 +FUNC 430e4 18 0 testing::internal::IsInSet +430e4 2 587 92 +430e6 2 587 92 +430e8 4 588 92 +430ec 6 588 92 +430f2 8 588 92 +430fa 2 589 92 +FUNC 430fc c 0 testing::internal::IsAsciiPunct +430fc c 596 92 +FUNC 43108 c 0 testing::internal::IsRepeat +43108 c 598 92 +FUNC 43114 c 0 testing::internal::IsAsciiWhiteSpace +43114 c 599 92 +FUNC 43120 20 0 testing::internal::IsAsciiWordChar +43120 a 601 92 +4312a 8 601 92 +43132 a 602 92 +4313c 2 602 92 +4313e 2 603 92 +FUNC 43140 b8 0 testing::internal::AtomMatchesChar +43140 2 612 92 +43142 4 612 92 +43146 4 613 92 +4314a 14 614 92 +4315e 8 621 92 +43166 8 614 92 +4316e 4 617 92 +43172 e 614 92 +43180 4 631 92 +43184 6 620 92 +4318a 8 614 92 +43192 4 631 92 +43196 6 624 92 +4319c e 594 92 +431aa e 616 92 +431b8 4 618 92 +431bc 4 619 92 +431c0 4 622 92 +431c4 4 623 92 +431c8 e 625 92 +431d6 a 627 92 +431e0 4 630 92 +431e4 a 630 92 +431ee 8 630 92 +431f6 2 631 92 +FUNC 431f8 5a 0 testing::internal::MatchRegexAtHead +431f8 6 731 92 +431fe 4 732 92 +43202 4 737 92 +43206 a 738 92 +43210 8 741 92 +43218 2 742 92 +4321a 2 743 92 +4321c a 744 92 +43226 12 749 92 +43238 6 754 92 +4323e 8 754 92 +43246 2 754 92 +43248 4 755 92 +4324c 2 733 92 +4324e 4 757 92 +FUNC 43252 60 0 testing::internal::MatchRepetitionAndRegexAtHead +43252 2 707 92 +43254 4 706 92 +43258 6 706 92 +4325e 2 707 92 +43260 10 707 92 +43270 2 707 92 +43272 4 709 92 +43276 4 713 92 +4327a 4 715 92 +4327e 8 715 92 +43286 6 715 92 +4328c 6 722 92 +43292 e 722 92 +432a0 6 723 92 +432a6 2 713 92 +432a8 4 713 92 +432ac 2 723 92 +432ae 4 726 92 +FUNC 432b2 34 0 testing::internal::MatchRegexAnywhere +432b2 2 767 92 +432b4 2 767 92 +432b6 4 768 92 +432ba 2 768 92 +432bc 6 771 92 +432c2 2 772 92 +432c4 4 780 92 +432c8 4 772 92 +432cc a 776 92 +432d6 c 775 92 +432e2 2 769 92 +432e4 2 780 92 +FUNC 432e6 16 0 testing::internal::RE::PartialMatch +432e6 2 796 92 +432e8 2 796 92 +432ea 4 797 92 +432ee 4 797 92 +432f2 4 798 92 +432f6 4 797 92 +432fa 2 798 92 +FUNC 432fc 16 0 testing::internal::CapturedStream::GetFileSize +432fc 2 980 92 +432fe 2 980 92 +43300 8 981 92 +43308 2 982 92 +4330a 4 983 92 +4330e 4 982 92 +FUNC 43314 18 0 testing::internal::GetInjectableArgvs +43314 8 1069 92 +4331c 4 1072 92 +43320 c 1073 92 +FUNC 4332c 1e 0 std::_Destroy_Range, std::allocator >*> > +4332c 2 219 108 +4332e 6 65 118 +43334 2 74 118 +43336 4 191 108 +4333a 2 121 136 +4333c 6 156 137 +43342 4 81 118 +43346 4 221 108 +FUNC 4334a 30 0 std::vector, std::allocator >, std::allocator, std::allocator > > >::~vector +4334a 2 42 148 +4334c 2 42 148 +4334e 2 64 118 +43350 2 304 144 +43352 4 64 118 +43356 2 304 144 +43358 2 64 118 +4335a 4 304 144 +4335e 4 87 144 +43362 4 88 144 +43366 4 161 106 +4336a 6 135 124 +43370 4 161 106 +43374 6 42 148 +FUNC 4337a 52 0 testing::internal::CapturedStream::ReadEntireFile +4337a 4 986 92 +4337e 2 986 92 +43380 2 987 92 +43382 2 986 92 +43384 6 987 92 +4338a 4 988 92 +4338e 2 993 92 +43390 2 988 92 +43392 8 993 92 +4339a 2 991 92 +4339c e 998 92 +433aa 2 999 92 +433ac 2 997 92 +433ae 4 1000 92 +433b2 6 225 136 +433b8 2 112 137 +433ba 2 481 106 +433bc 4 225 136 +433c0 6 1003 92 +433c6 6 1006 92 +FUNC 433cc 68 0 testing::internal::GetCapturedStream +433cc 2 1023 92 +433ce 2 1024 92 +433d0 2 1023 92 +433d2 2 950 92 +433d4 2 1023 92 +433d6 4 950 92 +433da 6 952 92 +433e0 8 953 92 +433e8 6 954 92 +433ee 6 955 92 +433f4 c 2298 87 +43400 8 959 92 +43408 6 2306 87 +4340e 4 1026 92 +43412 6 946 92 +43418 8 156 137 +43420 6 1026 92 +43426 4 1027 92 +4342a a 1030 92 +FUNC 43434 14 0 testing::internal::GetCapturedStderr +43434 2 1048 92 +43436 2 1048 92 +43438 8 1049 92 +43440 8 1050 92 +FUNC 43448 1c 0 testing::Message::operator<< +43448 2 149 79 +4344a 4 149 79 +4344e 2 333 127 +43450 2 150 79 +43452 8 333 127 +4345a a 156 79 +FUNC 43464 46 0 std::endl > +43464 2 357 127 +43466 2 357 127 +43468 a 181 127 +43472 2 412 126 +43474 10 422 126 +43484 2 414 126 +43486 e 414 126 +43494 4 421 126 +43498 6 424 126 +4349e 6 359 127 +434a4 6 361 127 +FUNC 434ac 30 0 testing::internal::GTestLog::~GTestLog +434ac 2 880 92 +434ae 2 880 92 +434b0 a 78 127 +434ba 8 882 92 +434c2 a 883 92 +434cc 4 2340 87 +434d0 c 886 92 +FUNC 434dc 17c 0 testing::internal::ParseInt32 +434dc 6 1103 92 +434e2 2 1105 92 +434e4 a 1103 92 +434ee 2 1103 92 +434f0 2 1105 92 +434f2 4 1103 92 +434f6 4 1105 92 +434fa 4 1106 92 +434fe 2 1103 92 +43500 4 1106 92 +43504 8 1109 92 +4350c 8 1111 92 +43514 c 333 127 +43520 a 131 79 +4352a 18 333 127 +43542 8 1114 92 +4354a 2 333 127 +4354c 2 131 79 +4354e 4 333 127 +43552 4 1115 92 +43556 4 333 127 +4355a 8 1115 92 +43562 a 1115 92 +4356c 6 156 137 +43572 a 1116 92 +4357c 6 85 79 +43582 4 1117 92 +43586 a 1122 92 +43590 8 1128 92 +43598 c 333 127 +435a4 a 131 79 +435ae 18 333 127 +435c6 8 1131 92 +435ce 2 333 127 +435d0 2 131 79 +435d2 4 333 127 +435d6 4 1132 92 +435da 4 333 127 +435de 8 1132 92 +435e6 a 1132 92 +435f0 6 156 137 +435f6 a 1133 92 +43600 6 85 79 +43606 4 1134 92 +4360a 4 1137 92 +4360e 2 1138 92 +43610 48 1139 92 +FUNC 43658 e0 0 testing::internal::FormatFileLocation +43658 8 840 92 +43660 c 840 92 +4366c 6 841 92 +43672 4 841 92 +43676 2 112 137 +43678 2 229 145 +4367a 2 112 137 +4367c 2 481 106 +4367e 4 229 145 +43682 2 643 135 +43684 2 643 135 +43686 6 643 135 +4368c 6 843 92 +43692 e 844 92 +436a0 a 849 92 +436aa 4 849 92 +436ae 8 849 92 +436b6 8 849 92 +436be 4 400 136 +436c2 2 120 137 +436c4 6 400 136 +436ca 2 124 137 +436cc 2 400 136 +436ce 2 35 139 +436d0 2 124 137 +436d2 2 120 137 +436d4 2 481 106 +436d6 4 124 137 +436da 4 101 108 +436de 2 39 139 +436e0 2 101 108 +436e2 6 39 139 +436e8 8 40 139 +436f0 a 849 92 +436fa 18 156 137 +43712 26 851 92 +FUNC 43738 b0 0 testing::internal::GTestLog::GTestLog +43738 10 869 92 +43748 6 869 92 +4374e 4 870 92 +43752 2 874 92 +43754 4 874 92 +43758 4 874 92 +4375c 6 874 92 +43762 6 874 92 +43768 6 874 92 +4376e 4 874 92 +43772 c 78 127 +4377e c 333 127 +4378a 2 876 92 +4378c 4 333 127 +43790 a 876 92 +4379a 12 333 127 +437ac 6 156 137 +437b2 36 877 92 +FUNC 437e8 140 0 testing::internal::CaptureStream +437e8 8 1014 92 +437f0 a 1014 92 +437fa 2 1015 92 +437fc 4 1014 92 +43800 2 1015 92 +43802 12 1016 92 +43814 20 333 127 +43834 6 1016 92 +4383a 8 1019 92 +43842 e 897 92 +43850 4 120 137 +43854 4 481 106 +43858 8 124 137 +43860 2 101 108 +43862 6 933 92 +43868 2 101 108 +4386a 20 933 92 +4388a 8 937 92 +43892 6 229 145 +43898 2 400 136 +4389a 6 355 136 +438a0 4 243 135 +438a4 2 400 136 +438a6 4 244 135 +438aa 2 168 145 +438ac 8 168 145 +438b4 6 246 135 +438ba 4 803 136 +438be 2 168 145 +438c0 2 806 136 +438c2 2 168 145 +438c4 8 806 136 +438cc 2 168 145 +438ce 6 168 145 +438d4 4 400 136 +438d8 2 250 135 +438da 2 400 136 +438dc 8 250 135 +438e4 6 940 92 +438ea 8 941 92 +438f2 6 942 92 +438f8 4 1019 92 +438fc 2c 1020 92 +FUNC 43928 18 0 testing::internal::CaptureStderr +43928 18 1039 92 +FUNC 43940 c8 0 testing::internal::FormatCompilerIndependentFileLocation +43940 c 859 92 +4394c a 859 92 +43956 6 860 92 +4395c 4 860 92 +43960 2 112 137 +43962 2 229 145 +43964 2 112 137 +43966 2 481 106 +43968 4 229 145 +4396c 2 643 135 +4396e 2 643 135 +43970 6 643 135 +43976 6 862 92 +4397c 2 112 137 +4397e 2 481 106 +43980 c 649 135 +4398c 6 865 92 +43992 4 865 92 +43996 8 865 92 +4399e 8 865 92 +439a6 a 400 136 +439b0 2 124 137 +439b2 2 400 136 +439b4 2 35 139 +439b6 2 124 137 +439b8 2 120 137 +439ba 2 481 106 +439bc 4 124 137 +439c0 4 101 108 +439c4 2 39 139 +439c6 2 101 108 +439c8 6 39 139 +439ce 8 40 139 +439d6 12 156 137 +439e8 20 866 92 +FUNC 43a08 a4 0 testing::internal::FlagToEnvVar +43a08 e 1088 92 +43a16 4 1088 92 +43a1a 2 1090 92 +43a1c 2 1088 92 +43a1e 4 1090 92 +43a22 c 333 127 +43a2e 8 1090 92 +43a36 4 1090 92 +43a3a 2 1090 92 +43a3c 6 1090 92 +43a42 6 85 79 +43a48 2 1092 92 +43a4a 2 1090 92 +43a4c 4 1092 92 +43a50 4 1093 92 +43a54 4 400 136 +43a58 4 1093 92 +43a5c 2 166 98 +43a5e 2 168 98 +43a60 2 305 127 +43a62 8 168 98 +43a6a a 305 127 +43a74 4 1093 92 +43a78 8 1097 92 +43a80 6 85 79 +43a86 6 156 137 +43a8c 20 1098 92 +FUNC 43aac 54 0 testing::internal::BoolFromGTestEnv +43aac c 1145 92 +43ab8 2 1145 92 +43aba 4 1146 92 +43abe 2 1145 92 +43ac0 2 1146 92 +43ac2 2 1145 92 +43ac4 4 1146 92 +43ac8 6 2328 87 +43ace 2 1149 92 +43ad0 8 1149 92 +43ad8 6 1149 92 +43ade 6 156 137 +43ae4 1c 1150 92 +FUNC 43b00 d0 0 testing::internal::Int32FromGTestEnv +43b00 e 1155 92 +43b0e 2 1155 92 +43b10 4 1156 92 +43b14 2 1155 92 +43b16 2 1156 92 +43b18 2 1155 92 +43b1a 4 1156 92 +43b1e 8 2328 87 +43b26 6 1158 92 +43b2c 4 1164 92 +43b30 2 1163 92 +43b32 4 1164 92 +43b36 c 333 127 +43b42 a 131 79 +43b4c c 1165 92 +43b58 6 85 79 +43b5e 6 1164 92 +43b64 6 1167 92 +43b6a 4 240 126 +43b6e 4 1167 92 +43b72 6 240 126 +43b78 8 1167 92 +43b80 a 1167 92 +43b8a 6 156 137 +43b90 8 85 79 +43b98 a 1168 92 +43ba2 2 1169 92 +43ba4 2 1172 92 +43ba6 6 156 137 +43bac 24 1173 92 +FUNC 43bd0 44 0 testing::internal::StringFromGTestEnv +43bd0 c 1177 92 +43bdc 2 1177 92 +43bde 2 1178 92 +43be0 2 1177 92 +43be2 4 1178 92 +43be6 2 1177 92 +43be8 4 1178 92 +43bec 6 2328 87 +43bf2 6 1180 92 +43bf8 6 156 137 +43bfe 16 1181 92 +FUNC 43c14 24 0 sys_sigaltstack +43c14 2 3142 97 +43c16 12 3142 97 +43c28 4 3142 97 +43c2c 8 3142 97 +43c34 4 3142 97 +FUNC 43c38 24 0 sys_close +43c38 2 2979 97 +43c3a 12 2979 97 +43c4c 4 2979 97 +43c50 8 2979 97 +43c58 4 2979 97 +FUNC 43c5c 2a 0 sys_prctl +43c5c 4 3092 97 +43c60 16 3092 97 +43c76 4 3092 97 +43c7a 8 3092 97 +43c82 4 3092 97 +FUNC 43c88 d0 0 google_breakpad::ExceptionHandler::InstallHandlersLocked +43c88 2 246 4 +43c8a 2 247 4 +43c8c 2 246 4 +43c8e 6 247 4 +43c94 4 248 4 +43c98 1a 252 4 +43cb2 2 251 4 +43cb4 4 251 4 +43cb8 2 257 4 +43cba 2 261 4 +43cbc 2 75 100 +43cbe 2 262 4 +43cc0 a 257 4 +43cca 2 262 4 +43ccc 2 75 100 +43cce 4 74 100 +43cd2 2 261 4 +43cd4 2 74 100 +43cd6 28 75 100 +43cfe 2 261 4 +43d00 4 75 100 +43d04 2 261 4 +43d06 2 267 4 +43d08 2 264 4 +43d0a 2 268 4 +43d0c 4 264 4 +43d10 2 265 4 +43d12 2 268 4 +43d14 2 265 4 +43d16 8 268 4 +43d1e 2 267 4 +43d20 4 268 4 +43d24 4 267 4 +43d28 8 273 4 +43d30 28 275 4 +FUNC 43d58 214 0 google_breakpad::ExceptionHandler::ExceptionHandler +43d58 4 200 4 +43d5c 2 92 57 +43d5e 4 200 4 +43d62 c 210 4 +43d6e 2 92 57 +43d70 2 210 4 +43d72 2 200 4 +43d74 6 210 4 +43d7a a 188 121 +43d84 8 481 106 +43d8c 6 188 121 +43d92 2 210 4 +43d94 2 211 4 +43d96 8 481 106 +43d9e 2 211 121 +43da0 4 212 121 +43da4 c 481 106 +43db0 2 211 121 +43db2 2 212 121 +43db4 2 211 4 +43db6 8 212 4 +43dbe 6 105 57 +43dc4 2 107 57 +43dc6 6 107 57 +43dcc 2 108 57 +43dce 4 214 4 +43dd2 a 214 4 +43ddc 2 218 4 +43dde 2 219 4 +43de0 2 218 4 +43de2 2 219 4 +43de4 4 218 4 +43de8 4 219 4 +43dec 6 220 4 +43df2 4 67 144 +43df6 2 481 106 +43df8 2 220 4 +43dfa 8 221 4 +43e02 a 138 4 +43e0c c 141 4 +43e18 c 142 4 +43e24 a 147 4 +43e2e e 147 4 +43e3c 10 151 4 +43e4c 4 151 4 +43e50 c 151 4 +43e5c 14 153 4 +43e70 4 156 4 +43e74 2 154 4 +43e76 8 156 4 +43e7e 6 157 4 +43e84 4 223 4 +43e88 6 225 4 +43e8e 8 380 144 +43e96 2 126 108 +43e98 8 382 144 +43ea0 6 192 144 +43ea6 8 175 144 +43eae 6 176 144 +43eb4 4 176 144 +43eb8 4 176 144 +43ebc 8 347 106 +43ec4 4 348 106 +43ec8 2 353 106 +43eca 4 352 106 +43ece 2 112 143 +43ed0 2 224 105 +43ed2 4 224 105 +43ed6 6 224 105 +43edc 2 224 105 +43ede 8 481 105 +43ee6 4 657 144 +43eea 2 319 106 +43eec 4 161 106 +43ef0 6 135 124 +43ef6 4 161 106 +43efa 4 118 143 +43efe 4 666 144 +43f02 2 667 144 +43f04 4 668 144 +43f08 8 216 4 +43f10 a 160 4 +43f1a 4 346 106 +43f1e 4 356 106 +43f22 8 226 4 +43f2a 42 227 4 +FUNC 43f6c 50 0 google_breakpad::ExceptionHandler::RestoreHandlersLocked +43f6c 2 280 4 +43f6e a 281 4 +43f78 1c 285 4 +43f94 8 113 100 +43f9c 2 284 4 +43f9e 4 284 4 +43fa2 1a 289 4 +FUNC 43fbc 7c 0 google_breakpad::ExceptionHandler::SendContinueSignalToChild +43fbc 2 521 4 +43fbe 2 521 4 +43fc0 1c 3162 97 +43fdc 4 3162 97 +43fe0 4 3162 97 +43fe4 4 524 4 +43fe8 6 524 4 +43fee a 528 4 +43ff8 6 529 4 +43ffe 6 529 4 +44004 4 529 4 +44008 2 529 4 +4400a 4 529 4 +4400e 6 529 4 +44014 6 529 4 +4401a 4 532 4 +4401e 1a 530 4 +FUNC 44038 268 0 google_breakpad::ExceptionHandler::GenerateDump +44038 4 449 4 +4403c 2 122 57 +4403e 2 449 4 +44040 4 449 4 +44044 2 450 4 +44046 2 451 4 +44048 c 451 4 +44054 4 451 4 +44058 2 67 54 +4405a 6 176 102 +44060 8 90 54 +44068 2 67 54 +4406a 6 90 54 +44070 2 3454 97 +44072 4 122 54 +44076 1c 3454 97 +44092 4 3454 97 +44096 6 3454 97 +4409c 4 124 54 +440a0 4 459 4 +440a4 2 134 54 +440a6 4 458 4 +440aa 4 135 54 +440ae 2 136 54 +440b0 2 458 4 +440b2 a 462 4 +440bc 4 466 4 +440c0 4 462 4 +440c4 2 465 4 +440c6 2 466 4 +440c8 4 467 4 +440cc 4 469 4 +440d0 4 461 4 +440d4 2 467 4 +440d6 4 461 4 +440da 4 468 4 +440de 2 469 4 +440e0 4 475 4 +440e4 12 3761 97 +440f6 4 3761 97 +440fa 4 3761 97 +440fe a 481 4 +44108 6 482 4 +4410e 6 482 4 +44114 4 482 4 +44118 2 482 4 +4411a 4 482 4 +4411e 6 482 4 +44124 6 482 4 +4412a a 483 4 +44134 8 486 4 +4413c 2 2367 97 +4413e 4 2440 97 +44142 2 2365 97 +44144 2 2366 97 +44146 2 2368 97 +44148 2 2369 97 +4414a 36 2440 97 +44180 6 2445 97 +44186 4 2445 97 +4418a 4 2445 97 +4418e 6 493 4 +44194 8 494 4 +4419c 6 514 4 +441a2 a 514 4 +441ac 6 515 4 +441b2 8 516 4 +441ba 2 144 54 +441bc 4 144 54 +441c0 2 146 54 +441c2 2 3074 97 +441c4 2 145 54 +441c6 14 3074 97 +441da 4 3074 97 +441de 4 3074 97 +441e2 4 514 4 +441e6 8 499 4 +441ee 6 500 4 +441f4 1e 3272 97 +44212 4 3272 97 +44216 4 3272 97 +4421a 4 502 4 +4421e 6 502 4 +44224 4 3272 97 +44228 6 504 4 +4422e 6 505 4 +44234 4 507 4 +44238 a 509 4 +44242 6 510 4 +44248 6 510 4 +4424e 4 510 4 +44252 2 510 4 +44254 4 510 4 +44258 6 510 4 +4425e 6 510 4 +44264 c 511 4 +44270 4 514 4 +44274 4 514 4 +44278 28 518 4 +FUNC 442a0 a0 0 google_breakpad::ExceptionHandler::HandleSignal +442a0 e 392 4 +442ae 2 397 4 +442b0 6 392 4 +442b6 6 392 4 +442bc 2 398 4 +442be 4 398 4 +442c2 6 400 4 +442c8 2 400 4 +442ca 4 400 4 +442ce 4 400 4 +442d2 c 405 4 +442de a 406 4 +442e8 c 407 4 +442f4 6 426 4 +442fa 2 427 4 +442fc 2 405 4 +442fe 2 426 4 +44300 2 427 4 +44302 a 432 4 +4430c 10 428 4 +4431c c 433 4 +44328 a 401 4 +44332 e 433 4 +FUNC 44340 22 0 google_breakpad::ExceptionHandler::HandleSignal +44340 2 392 4 +44342 2 393 4 +44344 6 392 4 +4434a 2 393 4 +4434c 4 393 4 +44350 8 393 4 +44358 a 433 4 +FUNC 44364 134 0 google_breakpad::ExceptionHandler::SignalHandler +44364 6 299 4 +4436a 2 301 4 +4436c 2 299 4 +4436e 2 301 4 +44370 4 299 4 +44374 4 301 4 +44378 c 314 4 +44384 2 315 4 +44386 6 314 4 +4438c 2 333 4 +4438e 4 334 4 +44392 4 333 4 +44396 2 334 4 +44398 6 192 144 +4439e c 333 4 +443aa a 333 4 +443b4 2 334 4 +443b6 2 334 4 +443b8 a 334 4 +443c2 6 333 4 +443c8 4 333 4 +443cc 8 113 100 +443d4 8 348 4 +443dc 4 350 4 +443e0 4 350 4 +443e4 6 355 4 +443ea 6 355 4 +443f0 2 110 4 +443f2 2 355 4 +443f4 a 110 4 +443fe 4 355 4 +44402 6 359 4 +44408 2 91 100 +4440a 2 74 100 +4440c 4 91 100 +44410 32 75 100 +44442 2 320 4 +44444 2 323 4 +44446 4 320 4 +4444a 2 321 4 +4444c 4 323 4 +44450 2 321 4 +44452 8 323 4 +4445a 8 113 100 +44462 a 328 4 +4446c 6 345 4 +44472 26 366 4 +FUNC 44498 74 0 google_breakpad::ExceptionHandler::WaitForContinueSignal +44498 2 536 4 +4449a 2 536 4 +4449c 1c 3104 97 +444b8 4 3104 97 +444bc 4 3104 97 +444c0 4 539 4 +444c4 6 539 4 +444ca a 543 4 +444d4 6 544 4 +444da 6 544 4 +444e0 4 544 4 +444e4 2 544 4 +444e6 4 544 4 +444ea 6 544 4 +444f0 6 544 4 +444f6 a 545 4 +44500 c 547 4 +FUNC 4450c 4e 0 google_breakpad::ExceptionHandler::DoDump +4450c 2 552 4 +4450e 6 552 4 +44514 2 553 4 +44516 8 552 4 +4451e 2 553 4 +44520 4 557 4 +44524 6 575 4 +4452a 4 557 4 +4452e 6 559 4 +44534 6 566 4 +4453a 2 559 4 +4453c e 566 4 +4454a c 574 4 +44556 4 575 4 +FUNC 4455a 1e 0 google_breakpad::ExceptionHandler::ThreadEntry +4455a 2 379 4 +4455c 2 379 4 +4455e 6 384 4 +44564 10 387 4 +44574 4 388 4 +FUNC 44578 c0 0 google_breakpad::ExceptionHandler::WriteMinidump +44578 e 593 4 +44586 2 593 4 +44588 4 594 4 +4458c 4 593 4 +44590 4 594 4 +44594 6 594 4 +4459a 6 600 4 +445a0 8 609 4 +445a8 6 612 4 +445ae 2 613 4 +445b0 12 3039 97 +445c2 4 3039 97 +445c6 4 3039 97 +445ca 12 3026 97 +445dc 4 3026 97 +445e0 8 3026 97 +445e8 6 646 4 +445ee 2 643 4 +445f0 4 646 4 +445f4 6 647 4 +445fa 2 656 4 +445fc 4 667 4 +44600 2 656 4 +44602 6 667 4 +44608 2 614 4 +4460a c 668 4 +44616 4 601 4 +4461a a 604 4 +44624 a 605 4 +4462e a 668 4 +FUNC 44638 a4 0 google_breakpad::ExceptionHandler::AddMappingInfo +44638 c 674 4 +44644 6 674 4 +4464a 2 676 4 +4464c 2 677 4 +4464e 6 674 4 +44654 2 677 4 +44656 2 678 4 +44658 2 674 4 +4465a 4 679 4 +4465e 2 674 4 +44660 4 679 4 +44664 2 678 4 +44666 4 679 4 +4466a 2 680 4 +4466c 2 676 4 +4466e a 683 4 +44678 4 680 4 +4467c 4 683 4 +44680 18 684 4 +44698 8 306 106 +446a0 6 307 106 +446a6 2 119 108 +446a8 4 370 121 +446ac 2 119 108 +446ae a 119 108 +446b8 2 427 121 +446ba 2 428 121 +446bc 2 429 121 +446be 2 430 121 +446c0 6 686 4 +446c6 2 431 121 +446c8 14 686 4 +FUNC 446dc 50 0 google_breakpad::ExceptionHandler::RegisterAppMemory +446dc 2 688 4 +446de 4 370 121 +446e2 2 89 121 +446e4 2 91 121 +446e6 2 144 121 +446e8 4 198 104 +446ec 6 198 104 +446f2 4 91 121 +446f6 2 198 104 +446f8 4 691 4 +446fc 8 306 106 +44704 2 697 4 +44706 2 698 4 +44708 6 307 106 +4470e 4 119 108 +44712 c 119 108 +4471e 2 427 121 +44720 2 428 121 +44722 2 429 121 +44724 2 430 121 +44726 2 431 121 +44728 4 700 4 +FUNC 4472c 34 0 google_breakpad::ExceptionHandler::UnregisterAppMemory +4472c 2 89 121 +4472e 2 702 4 +44730 4 370 121 +44734 2 91 121 +44736 2 144 121 +44738 4 198 104 +4473c 6 198 104 +44742 4 91 121 +44746 2 198 104 +44748 4 705 4 +4474c 2 161 106 +4474e 2 519 121 +44750 2 520 121 +44752 2 522 121 +44754 2 523 121 +44756 2 708 4 +44758 4 161 106 +4475c 4 708 4 +FUNC 44760 184 0 google_breakpad::ExceptionHandler::~ExceptionHandler +44760 4 230 4 +44764 2 231 4 +44766 2 230 4 +44768 6 231 4 +4476e a 233 4 +44778 4 115 104 +4477c 4 117 104 +44780 6 118 104 +44786 6 121 104 +4478c 4 119 104 +44790 6 124 104 +44796 6 122 104 +4479c 6 127 104 +447a2 8 125 104 +447aa 4 117 104 +447ae 12 131 104 +447c0 6 133 104 +447c6 2 134 104 +447c8 6 136 104 +447ce 2 137 104 +447d0 c 139 104 +447dc 4 143 104 +447e0 2 136 104 +447e2 6 580 144 +447e8 4 224 105 +447ec 4 224 105 +447f0 2 584 144 +447f2 2 200 144 +447f4 2 584 144 +447f6 2 235 4 +447f8 2 584 144 +447fa 2 235 4 +447fc 2 87 144 +447fe 4 88 144 +44802 4 161 106 +44806 6 135 124 +4480c 4 161 106 +44810 2 236 4 +44812 2 237 4 +44814 4 236 4 +44818 6 237 4 +4481e 8 166 4 +44826 c 170 4 +44832 c 175 4 +4483e 8 176 4 +44846 4 177 4 +4484a 2 181 4 +4484c 2 182 4 +4484e 2 181 4 +44850 8 182 4 +44858 a 187 4 +44862 8 188 4 +4486a 4 239 4 +4486e 2 67 120 +44870 8 241 4 +44878 4 67 120 +4487c 4 68 120 +44880 2 74 120 +44882 a 161 106 +4488c 6 67 120 +44892 4 68 120 +44896 2 74 120 +44898 8 135 124 +448a0 10 156 137 +448b0 4 98 57 +448b4 6 98 57 +448ba 2a 242 4 +FUNC 448e4 98 0 google_breakpad::ExceptionHandler::WriteMinidumpForChild +448e4 6 715 4 +448ea 4 61 8 +448ee 4 715 4 +448f2 4 61 8 +448f6 2 715 4 +448f8 4 715 4 +448fc 2 61 8 +448fe 4 715 4 +44902 2 120 137 +44904 4 715 4 +44908 4 61 8 +4490c 2 715 4 +4490e c 61 8 +4491a 4 124 137 +4491e 2 120 137 +44920 2 481 106 +44922 4 124 137 +44926 4 101 108 +4492a 4 61 8 +4492e 2 101 108 +44930 2 718 4 +44932 6 61 8 +44938 4 718 4 +4493c a 721 4 +44946 4 719 4 +4494a 2 724 4 +4494c a 724 4 +44956 c 156 137 +44962 1a 725 4 +FUNC 4497c 50 0 google_breakpad::MinidumpDescriptor::MinidumpDescriptor +4497c 2 41 7 +4497e 2 41 7 +44980 2 46 7 +44982 2 112 137 +44984 6 46 7 +4498a 2 41 7 +4498c 4 46 7 +44990 2 112 137 +44992 6 481 106 +44998 2 378 136 +4499a 6 379 136 +449a0 a 148 142 +449aa 2 101 108 +449ac 2 380 136 +449ae 2 101 108 +449b0 4 165 136 +449b4 2 120 137 +449b6 2 481 106 +449b8 8 124 137 +449c0 2 51 7 +449c2 2 101 108 +449c4 6 46 7 +449ca 2 51 7 +FUNC 449cc b0 0 google_breakpad::MinidumpDescriptor::UpdatePath +449cc 8 70 7 +449d4 4 70 7 +449d8 2 75 7 +449da 4 70 7 +449de 2 75 7 +449e0 2 70 7 +449e2 a 75 7 +449ec c 75 7 +449f8 2 422 136 +449fa 2 80 7 +449fc 2 422 136 +449fe 6 232 145 +44a04 2 424 136 +44a06 2 80 7 +44a08 4 424 136 +44a0c 8 80 7 +44a14 2 80 7 +44a16 4 80 7 +44a1a a 80 7 +44a24 6 80 7 +44a2a 4 79 7 +44a2e a 80 7 +44a38 4 348 136 +44a3c a 349 136 +44a46 12 156 137 +44a58 2 81 7 +44a5a 2 82 7 +44a5c 2 81 7 +44a5e 1e 82 7 +FUNC 44a7c 48 0 google_breakpad::MinidumpDescriptor::operator= +44a7c 2 54 7 +44a7e 2 57 7 +44a80 2 54 7 +44a82 2 57 7 +44a84 2 58 7 +44a86 2 59 7 +44a88 4 58 7 +44a8c 4 59 7 +44a90 2 348 136 +44a92 2 54 7 +44a94 2 348 136 +44a96 a 349 136 +44aa0 4 422 136 +44aa4 6 232 145 +44aaa 4 424 136 +44aae 4 61 7 +44ab2 2 63 7 +44ab4 2 64 7 +44ab6 2 63 7 +44ab8 4 64 7 +44abc 2 66 7 +44abe 2 68 7 +44ac0 2 66 7 +44ac2 2 68 7 +FUNC 44ac4 10 0 logger::write +44ac4 2 42 9 +44ac6 2 40 9 +44ac8 c 42 9 +FUNC 44ad4 a 0 MicrodumpWriter::LogAppend +44ad4 a 108 10 +FUNC 44ae0 30 0 MicrodumpWriter::LogAppend +44ae0 2 118 10 +44ae2 8 124 10 +44aea 2 123 10 +44aec 4 124 10 +44af0 2 113 10 +44af2 4 124 10 +44af6 2 125 10 +44af8 4 124 10 +44afc 4 125 10 +44b00 4 113 10 +44b04 c 127 10 +FUNC 44b10 4c 0 MicrodumpWriter::LogAppend +44b10 4 118 10 +44b14 2 124 10 +44b16 a 118 10 +44b20 2 123 10 +44b22 a 124 10 +44b2c 2 123 10 +44b2e 2 124 10 +44b30 2 123 10 +44b32 4 123 10 +44b36 2 125 10 +44b38 2 113 10 +44b3a 4 125 10 +44b3e 4 113 10 +44b42 1a 127 10 +FUNC 44b5c 2c 0 MicrodumpWriter::LogCommitLine +44b5c 2 137 10 +44b5e 2 228 57 +44b60 2 137 10 +44b62 8 100 10 +44b6a 6 100 10 +44b70 4 139 10 +44b74 4 140 10 +44b78 10 139 10 +FUNC 44b88 16c 0 MicrodumpWriter::DumpModule +44b88 a 291 10 +44b92 10 291 10 +44ba2 2 296 10 +44ba4 1a 298 10 +44bbe 8 304 10 +44bc6 12 310 10 +44bd8 2 312 10 +44bda 2 314 10 +44bdc 8 312 10 +44be4 2 314 10 +44be6 a 313 10 +44bf0 8 314 10 +44bf8 a 315 10 +44c02 8 316 10 +44c0a a 317 10 +44c14 8 318 10 +44c1c 8 319 10 +44c24 2 123 10 +44c26 2 124 10 +44c28 2 320 10 +44c2a a 124 10 +44c34 2 123 10 +44c36 2 124 10 +44c38 2 123 10 +44c3a 4 123 10 +44c3e 2 125 10 +44c40 4 113 10 +44c44 2 125 10 +44c46 4 113 10 +44c4a 2 123 10 +44c4c 2 124 10 +44c4e 2 321 10 +44c50 8 124 10 +44c58 2 123 10 +44c5a 2 124 10 +44c5c 2 123 10 +44c5e 4 123 10 +44c62 2 125 10 +44c64 4 113 10 +44c68 2 125 10 +44c6a 4 113 10 +44c6e 8 322 10 +44c76 8 323 10 +44c7e 8 324 10 +44c86 8 325 10 +44c8e 8 326 10 +44c96 8 327 10 +44c9e 8 328 10 +44ca6 8 329 10 +44cae a 330 10 +44cb8 8 113 10 +44cc0 6 332 10 +44cc6 2e 333 10 +FUNC 44cf4 444 0 google_breakpad::WriteMicrodump +44cf4 12 375 10 +44d06 2 375 10 +44d08 2 376 10 +44d0a 2 375 10 +44d0c 4 376 10 +44d10 4 375 10 +44d14 6 376 10 +44d1a 2 378 10 +44d1c 8 379 10 +44d24 2 123 22 +44d26 2 72 10 +44d28 2 123 22 +44d2a 6 127 22 +44d30 6 130 22 +44d36 e 72 10 +44d44 2 73 10 +44d46 2 197 57 +44d48 2 73 10 +44d4a a 79 10 +44d54 4 389 10 +44d58 8 81 10 +44d60 4 388 10 +44d64 c 100 10 +44d70 6 100 10 +44d76 e 144 10 +44d84 6 146 10 +44d8a 2 149 10 +44d8c 2 146 10 +44d8e 2 170 10 +44d90 4 149 10 +44d94 2 159 10 +44d96 2 149 10 +44d98 4 170 10 +44d9c 2 159 10 +44d9e 4 170 10 +44da2 2 171 10 +44da4 2 172 10 +44da6 2 171 10 +44da8 2 172 10 +44daa 4 171 10 +44dae 2 159 10 +44db0 8 172 10 +44db8 8 173 10 +44dc0 8 174 10 +44dc8 a 175 10 +44dd2 8 176 10 +44dda 8 113 10 +44de2 8 178 10 +44dea a 113 10 +44df4 8 180 10 +44dfc a 113 10 +44e06 6 182 10 +44e0c 2 233 10 +44e0e 2 235 10 +44e10 a 192 144 +44e1a 6 267 10 +44e20 6 200 10 +44e26 6 202 10 +44e2c 6 221 10 +44e32 6 223 10 +44e38 c 235 10 +44e44 c 237 10 +44e50 6 238 10 +44e56 2 241 10 +44e58 4 238 10 +44e5c 2 241 10 +44e5e 2 238 10 +44e60 4 241 10 +44e64 8 248 10 +44e6c 2 249 10 +44e6e 6 194 10 +44e74 2 249 10 +44e76 12 194 10 +44e88 8 200 10 +44e90 8 201 10 +44e98 8 202 10 +44ea0 a 203 10 +44eaa 8 204 10 +44eb2 8 205 10 +44eba 6 206 10 +44ec0 6 213 10 +44ec6 2 75 54 +44ec8 4 76 54 +44ecc a 78 54 +44ed6 a 78 54 +44ee0 2 80 54 +44ee2 2 81 54 +44ee4 2 79 54 +44ee6 4 82 54 +44eea 4 80 54 +44eee 4 82 54 +44ef2 6 83 54 +44ef8 e 90 54 +44f06 2 3454 97 +44f08 4 122 54 +44f0c 1c 3454 97 +44f28 4 3454 97 +44f2c 6 3454 97 +44f32 4 124 54 +44f36 4 134 54 +44f3a 4 135 54 +44f3e 4 96 54 +44f42 4 136 54 +44f46 10 96 54 +44f56 4 97 54 +44f5a 2 98 54 +44f5c 8 98 54 +44f64 4 98 54 +44f68 4 100 54 +44f6c 1e 214 10 +44f8a 2 219 10 +44f8c 8 219 10 +44f94 8 221 10 +44f9c c 222 10 +44fa8 8 223 10 +44fb0 16 225 10 +44fc6 2 132 10 +44fc8 2 133 10 +44fca 2 132 10 +44fcc a 133 10 +44fd6 4 226 10 +44fda 6 219 10 +44fe0 2 190 10 +44fe2 a 253 10 +44fec 2 257 10 +44fee 4 253 10 +44ff2 8 257 10 +44ffa 2 259 10 +44ffc a 260 10 +45006 a 267 10 +45010 a 133 10 +4501a 6 132 10 +45020 6 269 10 +45026 8 235 10 +4502e 2 235 10 +45030 2 347 10 +45032 2 338 10 +45034 6 192 144 +4503a 6 338 10 +45040 4 339 10 +45044 4 342 10 +45048 4 340 10 +4504c 4 342 10 +45050 6 341 10 +45056 2 275 10 +45058 2 89 121 +4505a 4 275 10 +4505e 8 280 10 +45066 2 282 10 +45068 2 281 10 +4506a 2 282 10 +4506c 4 280 10 +45070 4 91 121 +45074 e 347 10 +45082 30 338 10 +450b2 2 89 121 +450b4 6 350 10 +450ba 2 353 10 +450bc 4 353 10 +450c0 e 353 10 +450ce 4 91 121 +450d2 4 91 10 +450d6 2 88 10 +450d8 c 100 10 +450e4 6 100 10 +450ea 8 93 10 +450f2 a 76 10 +450fc 4 203 57 +45100 6 203 57 +45106 2 380 10 +45108 10 42 24 +45118 20 391 10 +FUNC 45138 5a 0 google_breakpad::LinuxCoreDumper::BuildProcPath +45138 4 57 18 +4513c 4 57 18 +45140 4 58 18 +45144 6 59 18 +4514a 4 58 18 +4514e 6 61 18 +45154 6 62 18 +4515a a 65 18 +45164 2 66 18 +45166 2 67 18 +45168 2 65 18 +4516a 2 67 18 +4516c c 70 18 +45178 2 71 18 +4517a 2 72 18 +4517c 2 71 18 +4517e a 72 18 +45188 4 73 18 +4518c 2 74 18 +4518e 4 75 18 +FUNC 45194 38 0 google_breakpad::LinuxCoreDumper::GetThreadInfoByIndex +45194 2 90 18 +45196 4 192 144 +4519a 2 90 18 +4519c 8 192 144 +451a4 4 91 18 +451a8 c 94 18 +451b4 4 101 18 +451b8 2 110 18 +451ba 2 111 18 +451bc 2 110 18 +451be 2 111 18 +451c0 2 92 18 +451c2 a 112 18 +FUNC 451cc 22 0 google_breakpad::LinuxCoreDumper::CopyFromProcess +451cc 2 78 18 +451ce 2 78 18 +451d0 6 83 18 +451d6 2 78 18 +451d8 6 83 18 +451de 4 86 18 +451e2 4 88 18 +451e6 8 86 18 +FUNC 451f0 40 0 std::priv::__ucopy +451f0 4 86 142 +451f4 4 82 142 +451f8 4 86 142 +451fc 4 82 142 +45200 4 86 142 +45204 4 86 142 +45208 4 139 108 +4520c a 139 108 +45216 6 86 142 +4521c 14 95 142 +FUNC 45230 50 0 google_breakpad::LinuxCoreDumper::LinuxCoreDumper +45230 2 46 18 +45232 6 46 18 +45238 10 52 18 +45248 8 52 18 +45250 8 52 18 +45258 2 67 144 +4525a 4 52 18 +4525e 4 67 144 +45262 2 163 54 +45264 2 481 106 +45266 8 172 54 +4526e 2 666 144 +45270 2 667 144 +45272 4 76 143 +45276 2 668 144 +45278 8 54 18 +FUNC 45280 d0 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +45280 4 81 143 +45284 2 192 144 +45286 2 81 143 +45288 a 192 144 +45292 2 173 144 +45294 6 81 143 +4529a 4 173 144 +4529e 4 81 143 +452a2 2 173 144 +452a4 8 41 143 +452ac a 175 144 +452b6 4 176 144 +452ba a 177 144 +452c4 e 172 54 +452d2 a 113 142 +452dc 4 93 143 +452e0 2 113 142 +452e2 2 93 143 +452e4 2 119 108 +452e6 8 119 108 +452ee 6 95 143 +452f4 4 314 142 +452f8 2 249 142 +452fa 4 314 142 +452fe 8 249 142 +45306 6 249 142 +4530c 2 139 108 +4530e a 139 108 +45318 8 249 142 +45320 6 98 143 +45326 c 113 142 +45332 2 104 143 +45334 4 666 144 +45338 2 667 144 +4533a 2 668 144 +4533c 14 105 143 +FUNC 45350 1f4 0 google_breakpad::LinuxCoreDumper::EnumerateThreads +45350 12 126 18 +45362 4 127 18 +45366 4 126 18 +4536a 6 127 18 +45370 2 126 18 +45372 a 127 18 +4537c c 128 18 +45388 4 132 18 +4538c 8 132 18 +45394 a 133 18 +4539e c 134 18 +453aa a 138 18 +453b4 a 139 18 +453be 12 140 18 +453d0 2 139 18 +453d2 4 147 18 +453d6 4 148 18 +453da 4 188 18 +453de 8 146 18 +453e6 8 147 18 +453ee 8 148 18 +453f6 4 150 18 +453fa 8 150 18 +45402 8 150 18 +4540a 2 188 18 +4540c 2 186 18 +4540e 4 188 18 +45412 2 186 18 +45414 4 188 18 +45418 2 189 18 +4541a 2 202 18 +4541c 2 189 18 +4541e 2 190 18 +45420 6 202 18 +45426 2 190 18 +45428 4 202 18 +4542c 2 204 18 +4542e 4 205 18 +45432 4 206 18 +45436 8 380 144 +4543e 4 126 108 +45442 6 382 144 +45448 8 380 144 +45450 2 119 108 +45452 a 119 108 +4545c 6 382 144 +45462 2 208 18 +45464 12 244 18 +45476 a 145 18 +45480 10 248 18 +45490 10 151 18 +454a0 6 152 18 +454a6 4 177 18 +454aa 4 179 18 +454ae c 180 18 +454ba 6 192 144 +454c0 8 175 144 +454c8 6 176 144 +454ce e 177 144 +454dc a 172 54 +454e6 2 112 143 +454e8 2 172 54 +454ea 4 224 105 +454ee 6 224 105 +454f4 2 224 105 +454f6 4 481 105 +454fa 2 118 143 +454fc 4 481 105 +45500 2 667 144 +45502 4 666 144 +45506 4 668 144 +4550a 14 162 144 +4551e 26 248 18 +FUNC 45544 114 0 google_breakpad::::ElfFileSoName +45544 8 193 21 +4554c 6 193 21 +45552 2 67 21 +45554 2 193 21 +45556 4 67 21 +4555a 4 193 21 +4555e 6 67 21 +45564 2 193 21 +45566 6 67 21 +4556c 2 194 21 +4556e 4 196 21 +45572 6 200 21 +45578 2 201 21 +4557a 2 200 21 +4557c 2 201 21 +4557e 2 208 21 +45580 6 207 21 +45586 2 210 21 +45588 6 207 21 +4558e 8 210 21 +45596 2 208 21 +45598 6 210 21 +4559e 2 211 21 +455a0 6 211 21 +455a6 2 213 21 +455a8 6 216 21 +455ae 10 217 21 +455be 8 146 21 +455c6 22 155 21 +455e8 2 154 21 +455ea 4 157 21 +455ee 16 163 21 +45604 6 162 21 +4560a 4 169 21 +4560e 4 168 21 +45612 a 170 21 +4561c 6 171 21 +45622 4 173 21 +45626 2 172 21 +45628 4 173 21 +4562c 2 178 21 +4562e 10 179 21 +4563e 4 170 21 +45642 16 217 21 +FUNC 45658 c4 0 google_breakpad::LinuxDumper::HandleDeletedFileInMapping +45658 a 438 21 +45662 6 438 21 +45668 2 454 21 +4566a 2 438 21 +4566c 6 454 21 +45672 2 438 21 +45674 c 454 21 +45680 6 455 21 +45686 e 60 49 +45694 6 456 21 +4569a c 458 21 +456a6 16 3149 97 +456bc 2 466 21 +456be 16 3149 97 +456d4 4 3149 97 +456d8 6 3149 97 +456de 2 464 21 +456e0 a 465 21 +456ea 8 466 21 +456f2 a 471 21 +456fc 20 473 21 +FUNC 4571c 40 0 google_breakpad::LinuxDumper::~LinuxDumper +4571c 2 88 21 +4571e a 88 21 +45728 2 144 54 +4572a 2 144 54 +4572c 4 146 54 +45730 2 145 54 +45732 14 3074 97 +45746 4 3074 97 +4574a 4 3074 97 +4574e 4 88 21 +45752 a 89 21 +FUNC 4575c 80 0 google_breakpad::LinuxDumper::GetMappingEffectiveNameAndPath +4575c 4 227 21 +45760 4 227 21 +45764 6 228 21 +4576a 8 227 21 +45772 4 228 21 +45776 4 235 21 +4577a 4 235 21 +4577e a 236 21 +45788 2 238 21 +4578a 8 243 21 +45792 6 243 21 +45798 8 243 21 +457a0 c 244 21 +457ac 6 245 21 +457b2 4 255 21 +457b6 4 245 21 +457ba 8 251 21 +457c2 2 252 21 +457c4 2 252 21 +457c6 6 253 21 +457cc 4 255 21 +457d0 c 253 21 +FUNC 457dc b8 0 google_breakpad::LinuxDumper::ReadAuxv +457dc 8 257 21 +457e4 6 257 21 +457ea 2 259 21 +457ec 2 257 21 +457ee c 259 21 +457fa 2 257 21 +457fc 6 259 21 +45802 18 3087 97 +4581a 4 3087 97 +4581e 4 3087 97 +45822 4 265 21 +45826 6 264 21 +4582c 1c 3104 97 +45848 4 3104 97 +4584c 6 3104 97 +45852 4 272 21 +45856 4 273 21 +4585a 2 272 21 +4585c 2 274 21 +4585e a 275 21 +45868 2 276 21 +4586a 6 275 21 +45870 6 279 21 +45876 2 280 21 +45878 1c 281 21 +FUNC 45894 24 0 google_breakpad::LinuxDumper::Init +45894 2 91 21 +45896 2 91 21 +45898 6 92 21 +4589e 2 92 21 +458a0 6 92 21 +458a6 2 92 21 +458a8 2 92 21 +458aa 2 92 21 +458ac 4 93 21 +458b0 4 92 21 +458b4 4 93 21 +FUNC 458b8 2a 0 google_breakpad::LinuxDumper::FindMapping +458b8 2 429 21 +458ba 2 426 21 +458bc 8 192 144 +458c4 4 429 21 +458c8 6 430 21 +458ce 4 431 21 +458d2 8 431 21 +458da 4 429 21 +458de 2 435 21 +458e0 2 436 21 +FUNC 458e4 38 0 google_breakpad::LinuxDumper::GetStackInfo +458e4 2 402 21 +458e6 6 402 21 +458ec 4 176 102 +458f0 6 407 21 +458f6 6 412 21 +458fc 2 413 21 +458fe 2 416 21 +45900 2 418 21 +45902 2 416 21 +45904 2 418 21 +45906 a 420 21 +45910 2 422 21 +45912 2 420 21 +45914 2 421 21 +45916 6 423 21 +FUNC 4591c 34 0 google_breakpad::LinuxDumper::HandleDeletedFileInMapping +4591c 2 438 21 +4591e 2 438 21 +45920 2 443 21 +45922 2 438 21 +45924 4 443 21 +45928 4 444 21 +4592c 2 447 21 +4592e 2 446 21 +45930 a 447 21 +4593a 6 446 21 +45940 10 473 21 +FUNC 45950 130 0 google_breakpad::LinuxDumper::ElfFileIdentifierForMapping +45950 e 99 21 +4595e a 99 21 +45968 4 101 21 +4596c 2 99 21 +4596e 2 101 21 +45970 2 99 21 +45972 4 101 21 +45976 12 67 21 +45988 2 102 21 +4598a 4 103 21 +4598e c 106 21 +4599a 2 108 21 +4599c 12 3026 97 +459ae 4 3026 97 +459b2 8 3026 97 +459ba 4 108 21 +459be 4 109 21 +459c2 c 111 21 +459ce 12 114 21 +459e0 c 116 21 +459ec 6 120 21 +459f2 2 121 21 +459f4 2 120 21 +459f6 2 121 21 +459f8 4 126 21 +459fc e 125 21 +45a0a 4 127 21 +45a0e 4 126 21 +45a12 4 127 21 +45a16 2 129 21 +45a18 2 127 21 +45a1a c 129 21 +45a26 2 130 21 +45a28 4 131 21 +45a2c 6 130 21 +45a32 6 134 21 +45a38 4 135 21 +45a3c 6 135 21 +45a42 6 140 21 +45a48 10 141 21 +45a58 6 135 21 +45a5e 10 137 21 +45a6e 12 141 21 +FUNC 45a80 94 0 std::priv::_Impl_vector >::_M_insert_overflow +45a80 4 108 143 +45a84 2 108 143 +45a86 6 192 144 +45a8c 4 173 144 +45a90 2 108 143 +45a92 2 192 144 +45a94 4 173 144 +45a98 4 108 143 +45a9c 2 173 144 +45a9e 8 41 143 +45aa6 8 175 144 +45aae 6 176 144 +45ab4 e 177 144 +45ac2 e 172 54 +45ad0 e 112 143 +45ade 2 480 105 +45ae0 2 481 105 +45ae2 2 480 105 +45ae4 6 481 105 +45aea a 115 143 +45af4 a 116 143 +45afe 4 118 143 +45b02 4 666 144 +45b06 2 667 144 +45b08 c 668 144 +FUNC 45b14 98 0 google_breakpad::LinuxDumper::LinuxDumper +45b14 2 75 21 +45b16 10 82 21 +45b26 4 176 102 +45b2a 2 67 54 +45b2c 2 75 21 +45b2e 2 67 54 +45b30 8 82 21 +45b38 6 67 54 +45b3e 4 67 144 +45b42 2 163 54 +45b44 2 481 106 +45b46 8 172 54 +45b4e 2 666 144 +45b50 2 667 144 +45b52 2 76 143 +45b54 2 668 144 +45b56 4 67 144 +45b5a 2 163 54 +45b5c 2 481 106 +45b5e 8 172 54 +45b66 2 666 144 +45b68 2 667 144 +45b6a 2 76 143 +45b6c 2 668 144 +45b6e 4 67 144 +45b72 2 163 54 +45b74 2 481 106 +45b76 8 172 54 +45b7e 4 76 143 +45b82 2 668 144 +45b84 2 173 143 +45b86 2 85 21 +45b88 2 172 54 +45b8a 2 666 144 +45b8c 2 667 144 +45b8e 4 85 21 +45b92 c 173 143 +45b9e e 86 21 +FUNC 45bac 374 0 google_breakpad::LinuxDumper::EnumerateMappings +45bac 8 283 21 +45bb4 6 283 21 +45bba 2 285 21 +45bbc 2 283 21 +45bbe c 285 21 +45bca 2 283 21 +45bcc 6 285 21 +45bd2 6 3087 97 +45bd8 4 296 21 +45bdc 2 300 21 +45bde 2 296 21 +45be0 2 300 21 +45be2 14 3087 97 +45bf6 4 3087 97 +45bfa 6 3087 97 +45c00 4 304 21 +45c04 4 303 21 +45c08 4 305 21 +45c0c 6 208 54 +45c12 2 305 21 +45c14 4 208 54 +45c18 2 49 16 +45c1a 2 208 54 +45c1c 4 49 16 +45c20 2 70 16 +45c22 2 351 21 +45c24 4 49 16 +45c28 4 351 21 +45c2c 6 325 21 +45c32 2 103 16 +45c34 8 66 16 +45c3c 4 70 16 +45c40 8 66 16 +45c48 8 70 16 +45c50 2 70 16 +45c52 2 69 16 +45c54 6 69 16 +45c5a 4 71 16 +45c5e 2 70 16 +45c60 6 71 16 +45c66 8 78 16 +45c6e 8 86 16 +45c76 8 90 16 +45c7e 4 92 16 +45c82 4 93 16 +45c86 c 312 21 +45c92 2 313 21 +45c94 2 312 21 +45c96 6 313 21 +45c9c 8 314 21 +45ca4 2 315 21 +45ca6 2 314 21 +45ca8 4 315 21 +45cac 2 316 21 +45cae a 317 21 +45cb8 2 316 21 +45cba 4 317 21 +45cbe 6 318 21 +45cc4 c 323 21 +45cd0 4 322 21 +45cd4 a 323 21 +45cde 2 325 21 +45ce0 4 326 21 +45ce4 2 200 144 +45ce6 6 330 21 +45cec 2 344 21 +45cee 2 200 144 +45cf0 a 344 21 +45cfa 4 331 21 +45cfe 6 332 21 +45d04 6 333 21 +45d0a 6 333 21 +45d10 4 333 21 +45d14 2 333 21 +45d16 6 333 21 +45d1c 4 332 21 +45d20 a 208 54 +45d2a 4 357 21 +45d2e 6 358 21 +45d34 4 357 21 +45d38 4 358 21 +45d3c 8 359 21 +45d44 c 360 21 +45d50 4 361 21 +45d54 c 316 21 +45d60 2 363 21 +45d62 6 364 21 +45d68 2 365 21 +45d6a 2 364 21 +45d6c 2 365 21 +45d6e c 366 21 +45d7a 8 377 21 +45d82 4 374 21 +45d86 2 373 21 +45d88 2 374 21 +45d8a 4 373 21 +45d8e 4 377 21 +45d92 4 375 21 +45d96 2 200 144 +45d98 6 377 21 +45d9e 4 383 21 +45da2 a 390 21 +45dac 2 98 16 +45dae 2 3104 97 +45db0 2 98 16 +45db2 4 99 16 +45db6 12 3104 97 +45dc8 4 3104 97 +45dcc 6 3104 97 +45dd2 4 100 16 +45dd6 4 105 16 +45dda 2 103 16 +45ddc 6 105 16 +45de2 6 393 21 +45de8 a 395 21 +45df2 10 396 21 +45e02 6 334 21 +45e08 2 334 21 +45e0a 2 334 21 +45e0c 6 334 21 +45e12 4 333 21 +45e16 e 335 21 +45e24 4 345 21 +45e28 6 346 21 +45e2e 8 349 21 +45e36 a 346 21 +45e40 a 347 21 +45e4a 8 348 21 +45e52 a 351 21 +45e5c 6 349 21 +45e62 e 352 21 +45e70 a 380 144 +45e7a 2 126 108 +45e7c 8 382 144 +45e84 14 386 144 +45e98 2 192 144 +45e9a 2 380 21 +45e9c 2 192 144 +45e9e 2 380 21 +45ea0 2 640 144 +45ea2 2 380 21 +45ea4 4 222 148 +45ea8 2 640 144 +45eaa 4 641 144 +45eae 4 630 144 +45eb2 6 269 105 +45eb8 4 615 144 +45ebc a 172 143 +45ec6 a 173 143 +45ed0 12 176 143 +45ee2 8 192 144 +45eea c 381 21 +45ef6 6 381 21 +45efc 2 202 144 +45efe a 382 21 +45f08 18 396 21 +FUNC 45f20 24 0 sys_ptrace +45f20 2 3097 97 +45f22 12 3097 97 +45f34 4 3097 97 +45f38 8 3097 97 +45f40 4 3097 97 +FUNC 45f44 52 0 google_breakpad::LinuxPtraceDumper::CopyFromProcess +45f44 4 134 23 +45f48 2 136 23 +45f4a 2 134 23 +45f4c 2 135 23 +45f4e 4 134 23 +45f52 2 144 23 +45f54 2 135 23 +45f56 2 134 23 +45f58 4 135 23 +45f5c 4 141 23 +45f60 4 142 23 +45f64 c 143 23 +45f70 4 142 23 +45f74 4 143 23 +45f78 2 146 23 +45f7a 2 143 23 +45f7c 6 146 23 +45f82 6 144 23 +45f88 2 147 23 +45f8a 6 146 23 +45f90 6 149 23 +FUNC 45f98 78 0 google_breakpad::LinuxPtraceDumper::BuildProcPath +45f98 4 112 23 +45f9c 4 112 23 +45fa0 4 113 23 +45fa4 4 114 23 +45fa8 4 113 23 +45fac 4 113 23 +45fb0 6 116 23 +45fb6 6 117 23 +45fbc e 120 23 +45fca 2 121 23 +45fcc 4 122 23 +45fd0 2 120 23 +45fd2 2 122 23 +45fd4 c 125 23 +45fe0 c 126 23 +45fec 4 127 23 +45ff0 2 128 23 +45ff2 2 127 23 +45ff4 a 128 23 +45ffe 2 129 23 +46000 2 130 23 +46002 4 129 23 +46006 a 131 23 +FUNC 46010 42 0 google_breakpad::LinuxPtraceDumper::ThreadsResume +46010 2 295 23 +46012 2 295 23 +46014 c 296 23 +46020 6 192 144 +46026 6 299 23 +4602c e 101 23 +4603a 2 299 23 +4603c c 300 23 +46048 8 301 23 +46050 2 303 23 +FUNC 46054 1b0 0 google_breakpad::LinuxPtraceDumper::GetThreadInfoByIndex +46054 10 155 23 +46064 2 155 23 +46066 4 192 144 +4606a 2 155 23 +4606c 2 192 144 +4606e 8 156 23 +46076 2 163 23 +46078 4 159 23 +4607c 12 163 23 +4608e 18 3087 97 +460a6 4 3087 97 +460aa 4 3087 97 +460ae 6 168 23 +460b4 4 167 23 +460b8 c 208 54 +460c4 2 49 16 +460c6 4 174 23 +460ca 2 208 54 +460cc 4 49 16 +460d0 2 70 16 +460d2 2 177 23 +460d4 2 49 16 +460d6 4 177 23 +460da 2 179 23 +460dc 2 174 23 +460de 2 179 23 +460e0 2 174 23 +460e2 2 179 23 +460e4 2 103 16 +460e6 8 66 16 +460ee 4 70 16 +460f2 8 66 16 +460fa 8 70 16 +46102 2 70 16 +46104 2 69 16 +46106 6 69 16 +4610c 8 71 16 +46114 6 78 16 +4611a 4 86 16 +4611e 6 90 16 +46124 4 92 16 +46128 4 93 16 +4612c c 177 23 +46138 4 178 23 +4613c c 179 23 +46148 c 180 23 +46154 4 118 16 +46158 4 117 16 +4615c a 118 16 +46166 2 98 16 +46168 2 3104 97 +4616a 2 98 16 +4616c 4 99 16 +46170 12 3104 97 +46182 4 3104 97 +46186 6 3104 97 +4618c 4 100 16 +46190 4 105 16 +46194 2 103 16 +46196 6 105 16 +4619c 6 185 23 +461a2 6 187 23 +461a8 8 187 23 +461b0 12 204 23 +461c2 14 208 23 +461d6 4 259 23 +461da 4 268 23 +461de 26 271 23 +FUNC 46204 20 0 google_breakpad::LinuxPtraceDumper::LinuxPtraceDumper +46204 2 106 23 +46206 2 106 23 +46208 6 108 23 +4620e 2 109 23 +46210 c 108 23 +4621c 8 109 23 +FUNC 46224 a0 0 std::priv::_Impl_vector >::_M_insert_overflow +46224 4 108 143 +46228 2 108 143 +4622a 6 192 144 +46230 4 173 144 +46234 4 108 143 +46238 2 192 144 +4623a 4 173 144 +4623e 4 108 143 +46242 2 173 144 +46244 8 41 143 +4624c a 175 144 +46256 6 176 144 +4625c e 177 144 +4626a a 172 54 +46274 2 112 143 +46276 2 172 54 +46278 4 224 105 +4627c 6 224 105 +46282 2 224 105 +46284 4 172 54 +46288 2 480 105 +4628a 4 481 105 +4628e 2 480 105 +46290 6 481 105 +46296 a 115 143 +462a0 2 223 105 +462a2 4 224 105 +462a6 8 224 105 +462ae 2 224 105 +462b0 2 118 143 +462b2 4 666 144 +462b6 2 667 144 +462b8 c 668 144 +FUNC 462c4 164 0 google_breakpad::LinuxPtraceDumper::EnumerateThreads +462c4 8 307 23 +462cc 6 307 23 +462d2 2 309 23 +462d4 2 307 23 +462d6 c 309 23 +462e2 2 307 23 +462e4 8 309 23 +462ec 1a 3087 97 +46306 4 3087 97 +4630a 4 3087 97 +4630e 6 314 23 +46314 4 313 23 +46318 c 208 54 +46324 2 51 14 +46326 2 208 54 +46328 4 319 23 +4632c 2 51 14 +4632e 2 322 23 +46330 2 51 14 +46332 4 322 23 +46336 2 323 23 +46338 4 63 14 +4633c 4 323 23 +46340 4 65 14 +46344 1a 3016 97 +4635e 4 3016 97 +46362 6 3016 97 +46368 4 68 14 +4636c 4 71 14 +46370 2 73 14 +46372 2 71 14 +46374 6 73 14 +4637a 4 77 14 +4637e 4 77 14 +46382 4 82 14 +46386 a 322 23 +46390 8 323 23 +46398 2 322 23 +4639a 6 324 23 +463a0 4 325 23 +463a4 4 324 23 +463a8 6 325 23 +463ae 4 326 23 +463b2 6 325 23 +463b8 6 87 14 +463be 2 93 14 +463c0 2 94 14 +463c2 2 93 14 +463c4 2 94 14 +463c6 2 93 14 +463c8 8 94 14 +463d0 6 334 23 +463d6 14 336 23 +463ea 8 380 144 +463f2 2 126 108 +463f4 8 382 144 +463fc 14 386 144 +46410 18 336 23 +FUNC 46428 be 0 std::priv::_Impl_vector >::_M_fill_insert_aux +46428 4 140 143 +4642c 2 140 143 +4642e 2 416 144 +46430 2 140 143 +46432 2 416 144 +46434 6 140 143 +4643a 2 416 144 +4643c 4 416 144 +46440 8 150 143 +46448 4 152 143 +4644c 6 153 143 +46452 4 107 142 +46456 c 106 142 +46462 2 154 143 +46464 4 255 105 +46468 2 154 143 +4646a 2 256 105 +4646c 2 154 143 +4646e 2 256 105 +46470 8 256 105 +46478 2 442 105 +4647a 4 442 105 +4647e 4 443 105 +46482 2 442 105 +46484 6 443 105 +4648a 4 158 143 +4648e 6 314 142 +46494 2 249 142 +46496 8 249 142 +4649e 2 249 142 +464a0 6 146 108 +464a6 2 107 142 +464a8 2 158 143 +464aa 2 107 142 +464ac 8 106 142 +464b4 6 160 143 +464ba 6 442 105 +464c0 4 443 105 +464c4 4 442 105 +464c8 6 443 105 +464ce a 146 143 +464d8 8 147 143 +464e0 6 163 143 +FUNC 464e6 fe 0 google_breakpad::LinuxPtraceDumper::ThreadsSuspend +464e6 6 277 23 +464ec 4 278 23 +464f0 2 277 23 +464f2 6 278 23 +464f8 2 65 23 +464fa 8 192 144 +46502 4 280 23 +46506 4 281 23 +4650a 4 65 23 +4650e 2 66 23 +46510 2 65 23 +46512 6 66 23 +46518 4 202 144 +4651c 6 66 23 +46522 6 67 23 +46528 2 66 23 +4652a 1c 3272 97 +46546 4 3272 97 +4654a 4 3272 97 +4654e a 71 23 +46558 e 72 23 +46566 a 70 23 +46570 2 192 144 +46572 4 202 144 +46576 2 192 144 +46578 4 286 23 +4657c c 286 23 +46588 4 192 144 +4658c 2 287 23 +4658e 4 192 144 +46592 4 640 144 +46596 4 641 144 +4659a 4 630 144 +4659e 4 615 144 +465a2 2 172 143 +465a4 4 222 148 +465a8 c 172 143 +465b4 a 173 143 +465be e 176 143 +465cc 2 288 23 +465ce 4 280 23 +465d2 2 291 23 +465d4 6 292 23 +465da 4 291 23 +465de 6 293 23 +FUNC 465e4 24 0 sys_read +465e4 2 3104 97 +465e6 12 3104 97 +465f8 4 3104 97 +465fc 8 3104 97 +46604 4 3104 97 +FUNC 46608 e4 0 MinidumpWriter::WriteOSInformation +46608 a 1162 26 +46612 6 1162 26 +46618 2 1170 26 +4661a 2 1162 26 +4661c 4 1164 26 +46620 2 1162 26 +46622 2 1164 26 +46624 2 1170 26 +46626 2 1162 26 +46628 a 1170 26 +46632 4 1171 26 +46636 2 1174 26 +46638 2 1182 26 +4663a c 1174 26 +46646 1c 1182 26 +46662 2 1183 26 +46664 4 1175 26 +46668 a 1195 26 +46672 6 1184 26 +46678 6 1187 26 +4667e 6 1188 26 +46684 4 1191 26 +46688 6 1191 26 +4668e 14 1205 26 +466a2 6 1207 26 +466a8 2 1209 26 +466aa 2 1194 26 +466ac c 1195 26 +466b8 2 1196 26 +466ba c 1200 26 +466c6 4 1201 26 +466ca 4 1199 26 +466ce 1e 1210 26 +FUNC 466ec 36 0 MinidumpWriter::Init +466ec 2 144 26 +466ee 2 144 26 +466f0 a 145 26 +466fa a 148 26 +46704 6 149 26 +4670a 8 150 26 +46712 2 153 26 +46714 4 154 26 +46718 6 153 26 +4671e 4 154 26 +FUNC 46722 2a 0 MinidumpWriter::HaveMappingInfo +46722 2 462 26 +46724 2 463 26 +46726 2 89 121 +46728 4 463 26 +4672c 8 468 26 +46734 4 469 26 +46738 4 470 26 +4673c 4 468 26 +46740 4 91 121 +46744 4 474 26 +46748 2 471 26 +4674a 2 475 26 +FUNC 4674c 36 0 std::priv::__ucopy +4674c 2 86 142 +4674e 2 82 142 +46750 2 86 142 +46752 4 82 142 +46756 4 86 142 +4675a 6 86 142 +46760 2 139 108 +46762 8 139 108 +4676a 4 86 142 +4676e e 139 108 +4677c 6 95 142 +FUNC 46782 28 0 sys_open +46782 4 3087 97 +46786 14 3087 97 +4679a 4 3087 97 +4679e 8 3087 97 +467a6 4 3087 97 +FUNC 467ac 128 0 MinidumpWriter::FillRawModule +467ac 14 534 26 +467c0 c 534 26 +467cc 6 539 26 +467d2 4 534 26 +467d6 4 539 26 +467da 2 541 26 +467dc 4 548 26 +467e0 6 541 26 +467e6 8 542 26 +467ee 8 548 26 +467f6 2 552 26 +467f8 18 554 26 +46810 10 558 26 +46820 a 560 26 +4682a 12 566 26 +4683c 6 568 26 +46842 a 161 33 +4684c 4 569 26 +46850 4 570 26 +46854 2 568 26 +46856 4 570 26 +4685a 6 161 33 +46860 6 570 26 +46866 4 571 26 +4686a c 574 26 +46876 c 186 33 +46882 8 176 33 +4688a 2 580 26 +4688c 2 176 33 +4688e c 577 26 +4689a 6 580 26 +468a0 2 580 26 +468a2 2 580 26 +468a4 8 580 26 +468ac 4 580 26 +468b0 4 582 26 +468b4 20 584 26 +FUNC 468d4 26 0 MinidumpWriter::~MinidumpWriter +468d4 2 156 26 +468d6 6 159 26 +468dc 2 156 26 +468de 4 159 26 +468e2 6 160 26 +468e8 8 161 26 +468f0 6 156 26 +468f6 4 162 26 +FUNC 468fc 340 0 MinidumpWriter::WriteSystemInfoStream +468fc 4 628 26 +46900 2 161 33 +46902 4 46 31 +46906 4 628 26 +4690a 2 161 33 +4690c 4 629 26 +46910 2 161 33 +46912 2 212 33 +46914 2 161 33 +46916 2 212 33 +46918 4 628 26 +4691c 4 212 33 +46920 4 161 33 +46924 4 212 33 +46928 4 47 31 +4692c 4 46 31 +46930 4 47 31 +46934 8 630 26 +4693c a 632 26 +46946 4 896 26 +4694a 2 634 26 +4694c 2 896 26 +4694e 2 634 26 +46950 2 896 26 +46952 2 176 33 +46954 4 634 26 +46958 8 176 33 +46960 2 896 26 +46962 8 635 26 +4696a c 896 26 +46976 10 928 26 +46986 4 935 26 +4698a 2 947 26 +4698c a 51 12 +46996 2 947 26 +46998 4 946 26 +4699c 2 945 26 +4699e 2 948 26 +469a0 2 949 26 +469a2 e 51 12 +469b0 8 959 26 +469b8 6 960 26 +469be 8 961 26 +469c6 6 962 26 +469cc 8 964 26 +469d4 6 965 26 +469da 8 966 26 +469e2 6 967 26 +469e8 e 115 12 +469f6 2 114 12 +469f8 8 114 12 +46a00 8 122 12 +46a08 4 121 12 +46a0c 4 121 12 +46a10 2 122 12 +46a12 8 121 12 +46a1a 2 973 26 +46a1c 8 983 26 +46a24 a 984 26 +46a2e 2 67 54 +46a30 4 176 102 +46a34 2 67 54 +46a36 6 208 54 +46a3c 8 67 54 +46a44 4 208 54 +46a48 2 49 16 +46a4a 2 208 54 +46a4c 2 49 16 +46a4e 8 48 29 +46a56 2 1026 26 +46a58 2 49 16 +46a5a 4 1026 26 +46a5e 2 1061 26 +46a60 2 49 16 +46a62 4 1061 26 +46a66 1a 995 26 +46a80 e 1000 26 +46a8e 6 1002 26 +46a94 8 1005 26 +46a9c 8 1005 26 +46aa4 8 1006 26 +46aac 4 1007 26 +46ab0 2 1008 26 +46ab2 2 1007 26 +46ab4 2 1008 26 +46ab6 2 1007 26 +46ab8 6 1008 26 +46abe 4 1010 26 +46ac2 4 1012 26 +46ac6 e 1015 26 +46ad4 6 1016 26 +46ada 8 1018 26 +46ae2 4 996 26 +46ae6 c 1026 26 +46af2 c 118 29 +46afe 8 1034 26 +46b06 8 1034 26 +46b0e 6 1034 26 +46b14 8 1038 26 +46b1c 8 1038 26 +46b24 e 1061 26 +46b32 4 117 29 +46b36 4 118 29 +46b3a 6 1066 26 +46b40 8 1069 26 +46b48 4 1070 26 +46b4c c 1072 26 +46b58 6 1073 26 +46b5e 6 1075 26 +46b64 2 1076 26 +46b66 6 1075 26 +46b6c 2 1078 26 +46b6e 12 1083 26 +46b80 a 1084 26 +46b8a 2 1083 26 +46b8c 12 1085 26 +46b9e 2 1078 26 +46ba0 4 1078 26 +46ba4 6 1078 26 +46baa 2 1092 26 +46bac 2 144 54 +46bae 4 1092 26 +46bb2 2 144 54 +46bb4 2 144 54 +46bb6 4 146 54 +46bba 2 145 54 +46bbc 14 3074 97 +46bd0 4 3074 97 +46bd4 4 3074 97 +46bd8 4 1078 26 +46bdc 8 638 26 +46be4 6 216 33 +46bea 12 92 31 +46bfc 6 1040 26 +46c02 2 1041 26 +46c04 6 1042 26 +46c0a 2 1041 26 +46c0c 4 1042 26 +46c10 6 1043 26 +46c16 26 641 26 +FUNC 46c3c 12 0 google_breakpad::TypedMDRVA::CopyIndex +46c3c 2 76 31 +46c3e 2 72 31 +46c40 6 76 31 +46c46 4 77 31 +46c4a 4 76 31 +FUNC 46c4e 1e 0 google_breakpad::TypedMDRVA::~TypedMDRVA +46c4e 2 214 33 +46c50 4 216 33 +46c54 2 214 33 +46c56 4 216 33 +46c5a e 92 31 +46c68 4 218 33 +FUNC 46c6c 14 0 google_breakpad::TypedMDRVA::CopyIndexAfterObject +46c6c 2 80 31 +46c6e a 87 31 +46c78 4 88 31 +46c7c 4 87 31 +FUNC 46c6c 14 0 google_breakpad::TypedMDRVA::CopyIndexAfterObject +46c6c 2 80 31 +46c6e a 87 31 +46c78 4 88 31 +46c7c 4 87 31 +FUNC 46c80 1a 0 google_breakpad::TypedMDRVA::~TypedMDRVA +46c80 2 214 33 +46c82 2 216 33 +46c84 2 214 33 +46c86 4 216 33 +46c8a c 92 31 +46c96 4 218 33 +FUNC 46c9c 5c 0 std::priv::_Impl_vector >::reserve +46c9c 4 62 143 +46ca0 4 199 144 +46ca4 2 62 143 +46ca6 2 199 144 +46ca8 6 63 143 +46cae 6 64 143 +46cb4 8 41 143 +46cbc a 192 144 +46cc6 4 172 54 +46cca 2 70 143 +46ccc 6 172 54 +46cd2 c 113 142 +46cde 6 172 54 +46ce4 6 76 143 +46cea 2 666 144 +46cec 2 667 144 +46cee a 668 144 +FUNC 46cf8 ac 0 std::priv::_Impl_vector >::_M_insert_overflow_aux +46cf8 4 81 143 +46cfc 2 81 143 +46cfe 6 192 144 +46d04 4 173 144 +46d08 2 81 143 +46d0a 2 192 144 +46d0c 4 173 144 +46d10 4 81 143 +46d14 2 173 144 +46d16 8 41 143 +46d1e 8 175 144 +46d26 6 176 144 +46d2c e 177 144 +46d3a c 172 54 +46d46 a 113 142 +46d50 2 93 143 +46d52 2 113 142 +46d54 2 93 143 +46d56 2 119 108 +46d58 8 119 108 +46d60 6 95 143 +46d66 6 314 142 +46d6c 2 249 142 +46d6e 4 249 142 +46d72 2 139 108 +46d74 8 139 108 +46d7c 6 249 142 +46d82 6 98 143 +46d88 c 113 142 +46d94 4 667 144 +46d98 2 104 143 +46d9a a 668 144 +FUNC 46da4 32 0 std::priv::_Impl_vector >::push_back +46da4 2 376 144 +46da6 4 380 144 +46daa 2 376 144 +46dac 2 380 144 +46dae 4 376 144 +46db2 2 380 144 +46db4 2 119 108 +46db6 6 119 108 +46dbc 8 382 144 +46dc4 e 162 144 +46dd2 4 388 144 +FUNC 46dd6 c2 0 MinidumpWriter::FillThreadStack +46dd6 4 256 26 +46dda 4 258 26 +46dde 4 256 26 +46de2 4 256 26 +46de6 4 258 26 +46dea 4 256 26 +46dee 10 261 26 +46dfe 4 262 26 +46e02 4 161 33 +46e06 2 263 26 +46e08 6 161 33 +46e0e 2 263 26 +46e10 4 263 26 +46e14 4 265 26 +46e18 12 267 26 +46e2a 2 100 22 +46e2c 8 772 26 +46e34 2 269 26 +46e36 2 772 26 +46e38 12 271 26 +46e4a c 186 33 +46e56 2 274 26 +46e58 2 275 26 +46e5a 6 274 26 +46e60 8 176 33 +46e68 c 275 26 +46e74 e 173 148 +46e82 2 282 26 +46e84 6 278 26 +46e8a 4 279 26 +46e8e 2 280 26 +46e90 8 283 26 +FUNC 46e98 388 0 MinidumpWriter::WriteThreadListStream +46e98 8 286 26 +46ea0 2 287 26 +46ea2 e 286 26 +46eb0 2 286 26 +46eb2 4 192 144 +46eb6 2 286 26 +46eb8 6 192 144 +46ebe 6 289 26 +46ec4 4 161 33 +46ec8 2 68 31 +46eca 4 161 33 +46ece 2 67 31 +46ed0 2 161 33 +46ed2 2 212 33 +46ed4 2 68 31 +46ed6 2 161 33 +46ed8 2 68 31 +46eda 2 286 26 +46edc 4 68 31 +46ee0 2 67 31 +46ee2 8 68 31 +46eea 6 290 26 +46ef0 2 293 26 +46ef2 2 176 33 +46ef4 4 293 26 +46ef8 8 176 33 +46f00 8 294 26 +46f08 2 304 26 +46f0a 2 296 26 +46f0c 2 304 26 +46f0e 2 296 26 +46f10 4 304 26 +46f14 a 308 26 +46f1e e 310 26 +46f2c 4 303 26 +46f30 2 313 26 +46f32 2 303 26 +46f34 2 315 26 +46f36 6 313 26 +46f3c a 315 26 +46f46 2 316 26 +46f48 4 203 144 +46f4c 2 316 26 +46f4e 2 323 26 +46f50 4 316 26 +46f54 2 323 26 +46f56 2 316 26 +46f58 2 323 26 +46f5a 4 322 26 +46f5e 6 324 26 +46f64 8 323 26 +46f6c e 388 26 +46f7a 6 393 26 +46f80 a 394 26 +46f8a 12 396 26 +46f9c 6 395 26 +46fa2 6 216 33 +46fa8 c 92 31 +46fb4 12 422 26 +46fc6 6 392 26 +46fcc 2 161 33 +46fce 4 212 33 +46fd2 4 161 33 +46fd6 2 212 33 +46fd8 4 161 33 +46fdc 6 212 33 +46fe2 2 161 33 +46fe4 4 212 33 +46fe8 2 46 31 +46fea 2 161 33 +46fec 6 47 31 +46ff2 4 46 31 +46ff6 4 47 31 +46ffa 2 400 26 +46ffc 8 401 26 +47004 c 402 26 +47010 8 403 26 +47018 6 404 26 +4701e 8 405 26 +47026 10 176 33 +47036 a 406 26 +47040 e 407 26 +4704e 4 176 33 +47052 4 408 26 +47056 4 176 33 +4705a 6 408 26 +47060 a 409 26 +4706a a 413 26 +47074 4 123 22 +47078 6 415 26 +4707e c 418 26 +4708a 4 313 26 +4708e 6 326 26 +47094 2 327 26 +47096 2 326 26 +47098 14 327 26 +470ac a 332 26 +470b6 2 338 26 +470b8 2 332 26 +470ba 8 192 144 +470c2 2 338 26 +470c4 4 192 144 +470c8 4 338 26 +470cc 4 340 26 +470d0 4 339 26 +470d4 c 340 26 +470e0 6 341 26 +470e6 2 340 26 +470e8 2 341 26 +470ea 6 340 26 +470f0 14 347 26 +47104 6 350 26 +4710a c 352 26 +47116 c 161 33 +47122 2 359 26 +47124 6 161 33 +4712a 2 352 26 +4712c 4 161 33 +47130 a 359 26 +4713a 2 100 22 +4713c a 772 26 +47146 14 367 26 +4715a e 186 33 +47168 e 176 33 +47176 a 369 26 +47180 c 173 148 +4718c 4 338 26 +47190 8 161 33 +47198 4 212 33 +4719c 4 161 33 +471a0 4 212 33 +471a4 2 161 33 +471a6 8 212 33 +471ae 2 46 31 +471b0 6 47 31 +471b6 4 46 31 +471ba 4 47 31 +471be 6 374 26 +471c4 c 376 26 +471d0 8 380 26 +471d8 4 382 26 +471dc 8 383 26 +471e4 12 176 33 +471f6 a 384 26 +47200 4 385 26 +47204 8 176 33 +4720c 6 385 26 +47212 e 422 26 +FUNC 47220 8a 0 MinidumpWriter::WriteAppMemory +47220 6 425 26 +47226 4 161 33 +4722a 2 425 26 +4722c 2 89 121 +4722e 4 434 26 +47232 2 435 26 +47234 6 426 26 +4723a 2 100 22 +4723c a 430 26 +47246 2 432 26 +47248 2 432 26 +4724a 2 432 26 +4724c e 432 26 +4725a 2 161 33 +4725c 4 435 26 +47260 8 161 33 +47268 4 435 26 +4726c 2 435 26 +4726e c 186 33 +4727a 6 440 26 +47280 8 176 33 +47288 c 441 26 +47294 a 173 148 +4729e 4 91 121 +472a2 2 445 26 +472a4 6 446 26 +FUNC 472aa b0 0 std::priv::_Impl_vector >::_M_fill_insert_aux +472aa 6 140 143 +472b0 2 416 144 +472b2 2 140 143 +472b4 2 416 144 +472b6 8 140 143 +472be 2 416 144 +472c0 4 416 144 +472c4 2 150 143 +472c6 4 152 143 +472ca 2 153 143 +472cc 4 107 142 +472d0 a 106 142 +472da 4 154 143 +472de 2 255 105 +472e0 2 154 143 +472e2 2 256 105 +472e4 4 154 143 +472e8 2 256 105 +472ea 8 256 105 +472f2 a 471 105 +472fc 2 158 143 +472fe a 314 142 +47308 8 249 142 +47310 6 146 108 +47316 2 107 142 +47318 4 158 143 +4731c 2 107 142 +4731e 8 106 142 +47326 4 471 105 +4732a a 160 143 +47334 4 471 105 +47338 6 163 143 +4733e 4 471 105 +47342 a 146 143 +4734c 8 147 143 +47354 6 163 143 +FUNC 4735c ac 0 std::priv::_Impl_vector >::resize +4735c 4 636 144 +47360 2 636 144 +47362 8 192 144 +4736a 2 640 144 +4736c 4 636 144 +47370 2 640 144 +47372 2 641 144 +47374 4 630 144 +47378 4 615 144 +4737c 4 171 143 +47380 a 172 143 +4738a 10 173 143 +4739a 6 173 144 +473a0 8 41 143 +473a8 8 175 144 +473b0 8 177 144 +473b8 8 172 54 +473c0 2 112 143 +473c2 2 172 54 +473c4 6 224 105 +473ca 6 224 105 +473d0 2 224 105 +473d2 6 471 105 +473d8 2 503 105 +473da 4 471 105 +473de 2 223 105 +473e0 2 224 105 +473e2 6 224 105 +473e8 8 224 105 +473f0 2 224 105 +473f2 2 118 143 +473f4 4 666 144 +473f8 2 667 144 +473fa 2 668 144 +473fc c 644 144 +FUNC 47408 800 0 MinidumpWriter::Dump +47408 6 164 26 +4740e 2 161 33 +47410 e 164 26 +4741e 2 161 33 +47420 2 164 26 +47422 4 212 33 +47426 4 169 26 +4742a 2 161 33 +4742c 4 212 33 +47430 2 164 26 +47432 6 161 33 +47438 2 212 33 +4743a 2 169 26 +4743c 4 212 33 +47440 8 161 33 +47448 2 46 31 +4744a 2 161 33 +4744c 4 47 31 +47450 8 212 33 +47458 2 46 31 +4745a 6 47 31 +47460 2 171 26 +47462 6 172 26 +47468 2 59 31 +4746a 4 60 31 +4746e 2 59 31 +47470 4 60 31 +47474 4 173 26 +47478 a 175 26 +47482 2 177 26 +47484 2 179 26 +47486 2 177 26 +47488 6 178 26 +4748e 4 179 26 +47492 4 180 26 +47496 2 181 26 +47498 2 179 26 +4749a 2 181 26 +4749c 10 186 26 +474ac a 188 26 +474b6 4 482 26 +474ba 4 483 26 +474be 8 192 144 +474c6 2 89 121 +474c8 4 319 119 +474cc 2 91 121 +474ce 4 320 119 +474d2 8 485 26 +474da 4 485 26 +474de 6 192 144 +474e4 6 485 26 +474ea 4 486 26 +474ee 4 449 26 +474f2 4 449 26 +474f6 4 452 26 +474fa 8 452 26 +47502 6 487 26 +47508 2 487 26 +4750a 2 488 26 +4750c 6 485 26 +47512 10 161 33 +47522 2 212 33 +47524 2 492 26 +47526 2 68 31 +47528 2 67 31 +4752a 2 68 31 +4752c 2 67 31 +4752e 6 68 31 +47534 2 493 26 +47536 2 502 26 +47538 4 508 26 +4753c 2 176 33 +4753e 2 502 26 +47540 8 176 33 +47548 a 503 26 +47552 2 192 144 +47554 2 504 26 +47556 e 192 144 +47564 4 507 26 +47568 6 514 26 +4756e 4 494 26 +47572 2 46 31 +47574 2 47 31 +47576 8 46 31 +4757e 6 509 26 +47584 6 449 26 +4758a 4 508 26 +4758e 8 508 26 +47596 6 449 26 +4759c 8 452 26 +475a4 12 452 26 +475b6 4 523 26 +475ba 4 89 121 +475be 4 525 26 +475c2 8 519 26 +475ca 2 523 26 +475cc 4 523 26 +475d0 12 523 26 +475e2 2 523 26 +475e4 4 524 26 +475e8 12 525 26 +475fa 6 91 121 +47600 6 216 33 +47606 c 92 31 +47612 6 190 26 +47618 a 192 26 +47622 e 194 26 +47630 a 161 33 +4763a 4 192 144 +4763e 6 161 33 +47644 2 212 33 +47646 6 192 144 +4764c 4 588 26 +47650 2 67 31 +47652 2 68 31 +47654 2 67 31 +47656 6 68 31 +4765c 2 589 26 +4765e 2 599 26 +47660 2 176 33 +47662 2 599 26 +47664 8 176 33 +4766c a 600 26 +47676 8 192 144 +4767e 4 604 26 +47682 4 192 144 +47686 4 602 26 +4768a 4 591 26 +4768e 2 46 31 +47690 2 47 31 +47692 2 46 31 +47694 4 47 31 +47698 a 192 144 +476a2 6 604 26 +476a8 e 606 26 +476b6 e 604 26 +476c4 6 216 33 +476ca c 92 31 +476d6 6 197 26 +476dc 2 161 33 +476de a 199 26 +476e8 2 161 33 +476ea 4 212 33 +476ee 6 161 33 +476f4 2 212 33 +476f6 2 161 33 +476f8 2 212 33 +476fa 2 161 33 +476fc 6 212 33 +47702 2 46 31 +47704 4 47 31 +47708 4 46 31 +4770c 4 47 31 +47710 4 613 26 +47714 a 615 26 +4771e 2 617 26 +47720 2 176 33 +47722 2 617 26 +47724 8 176 33 +4772c e 618 26 +4773a 4 620 26 +4773e 4 621 26 +47742 6 622 26 +47748 e 623 26 +47756 8 216 33 +4775e c 92 31 +4776a 8 201 26 +47772 a 203 26 +4777c 10 205 26 +4778c a 207 26 +47796 2 210 26 +47798 2 209 26 +4779a 8 210 26 +477a2 2 209 26 +477a4 6 210 26 +477aa 2 780 26 +477ac 2 781 26 +477ae 2 782 26 +477b0 a 212 26 +477ba 2 214 26 +477bc 2 215 26 +477be 6 214 26 +477c4 c 215 26 +477d0 2 215 26 +477d2 2 780 26 +477d4 2 781 26 +477d6 2 782 26 +477d8 a 217 26 +477e2 2 220 26 +477e4 2 219 26 +477e6 6 220 26 +477ec 2 219 26 +477ee 6 220 26 +477f4 2 780 26 +477f6 2 781 26 +477f8 2 782 26 +477fa a 222 26 +47804 2 224 26 +47806 2 225 26 +47808 6 224 26 +4780e c 225 26 +4781a 2 225 26 +4781c 2 780 26 +4781e 2 781 26 +47820 2 782 26 +47822 a 227 26 +4782c 2 229 26 +4782e 2 230 26 +47830 6 229 26 +47836 c 230 26 +47842 2 230 26 +47844 2 780 26 +47846 2 781 26 +47848 2 782 26 +4784a a 232 26 +47854 2 234 26 +47856 2 235 26 +47858 6 234 26 +4785e c 235 26 +4786a 2 235 26 +4786c 2 780 26 +4786e 2 781 26 +47870 2 782 26 +47872 a 237 26 +4787c 2 239 26 +4787e 2 240 26 +47880 6 239 26 +47886 c 240 26 +47892 2 240 26 +47894 2 780 26 +47896 2 781 26 +47898 2 782 26 +4789a e 242 26 +478a8 6 244 26 +478ae 2 646 26 +478b0 4 644 26 +478b4 6 647 26 +478ba 6 647 26 +478c0 4 654 26 +478c4 4 657 26 +478c8 8 651 26 +478d0 2 657 26 +478d2 4 655 26 +478d6 4 657 26 +478da 2 657 26 +478dc 2 657 26 +478de e 657 26 +478ec 6 660 26 +478f2 4 660 26 +478f6 6 661 26 +478fc 2 663 26 +478fe 6 664 26 +47904 6 655 26 +4790a 8 667 26 +47912 6 670 26 +47918 2 676 26 +4791a 4 682 26 +4791e 2 675 26 +47920 2 682 26 +47922 4 682 26 +47926 2 682 26 +47928 2 682 26 +4792a 6 682 26 +47930 4 680 26 +47934 8 682 26 +4793c 6 683 26 +47942 4 684 26 +47946 4 680 26 +4794a 4 686 26 +4794e 2 703 26 +47950 4 703 26 +47954 4 703 26 +47958 2 703 26 +4795a e 703 26 +47968 4 704 26 +4796c 2 706 26 +4796e 6 704 26 +47974 4 706 26 +47978 2 706 26 +4797a 8 706 26 +47982 6 706 26 +47988 2 708 26 +4798a 8 707 26 +47992 8 711 26 +4799a 6 712 26 +479a0 2 161 33 +479a2 2 60 31 +479a4 c 161 33 +479b0 2 59 31 +479b2 4 60 31 +479b6 c 212 33 +479c2 2 59 31 +479c4 4 60 31 +479c8 4 716 26 +479cc 2 176 33 +479ce 2 722 26 +479d0 2 176 33 +479d2 2 724 26 +479d4 4 726 26 +479d8 4 722 26 +479dc 2 724 26 +479de 4 724 26 +479e2 2 724 26 +479e4 2 724 26 +479e6 c 724 26 +479f2 8 726 26 +479fa 2 725 26 +479fc 4 726 26 +47a00 4 727 26 +47a04 4 729 26 +47a08 6 729 26 +47a0e c 729 26 +47a1a 14 732 26 +47a2e 8 735 26 +47a36 2 736 26 +47a38 2 76 31 +47a3a 2 736 26 +47a3c 2 737 26 +47a3e 2 76 31 +47a40 2 737 26 +47a42 e 76 31 +47a50 48 739 26 +47a98 a 717 26 +47aa2 6 161 33 +47aa8 4 212 33 +47aac 6 161 33 +47ab2 6 212 33 +47ab8 6 161 33 +47abe 4 212 33 +47ac2 2 67 31 +47ac4 2 161 33 +47ac6 6 68 31 +47acc 2 67 31 +47ace 4 68 31 +47ad2 6 744 26 +47ad8 a 746 26 +47ae2 2 747 26 +47ae4 2 176 33 +47ae6 2 747 26 +47ae8 2 176 33 +47aea 2 752 26 +47aec 4 176 33 +47af0 2 67 144 +47af2 2 176 33 +47af4 2 750 26 +47af6 a 748 26 +47b00 2 750 26 +47b02 2 754 26 +47b04 2 751 26 +47b06 4 100 22 +47b0a 2 751 26 +47b0c 2 754 26 +47b0e 2 753 26 +47b10 2 755 26 +47b12 2 100 22 +47b14 2 753 26 +47b16 2 755 26 +47b18 8 67 144 +47b20 2 163 54 +47b22 4 481 106 +47b26 2 63 143 +47b28 6 172 54 +47b2e 2 666 144 +47b30 2 667 144 +47b32 2 76 143 +47b34 2 668 144 +47b36 4 760 26 +47b3a 4 222 148 +47b3e 2 760 26 +47b40 4 222 148 +47b44 6 762 26 +47b4a c 762 26 +47b56 e 87 31 +47b64 6 216 33 +47b6a c 92 31 +47b76 2 245 26 +47b78 2 780 26 +47b7a 2 781 26 +47b7c 2 782 26 +47b7e a 247 26 +47b88 a 252 26 +47b92 6 216 33 +47b98 c 92 31 +47ba4 6 216 33 +47baa c 92 31 +47bb6 10 254 26 +47bc6 8 510 26 +47bce 6 510 26 +47bd4 18 514 26 +47bec 14 516 26 +47c00 8 254 26 +FUNC 47c08 a8 0 WriteMinidumpImpl +47c08 6 1250 26 +47c0e 2 1250 26 +47c10 2 1251 26 +47c12 4 1250 26 +47c16 4 1251 26 +47c1a 2 1250 26 +47c1c 4 1251 26 +47c20 2 1253 26 +47c22 8 1254 26 +47c2a 4 123 22 +47c2e 4 127 22 +47c32 6 130 22 +47c38 8 138 26 +47c40 2 138 26 +47c42 10 138 26 +47c52 2 100 22 +47c54 2 153 148 +47c56 4 100 22 +47c5a 2 67 144 +47c5c 2 163 54 +47c5e 2 153 148 +47c60 4 67 144 +47c64 2 481 106 +47c66 4 153 148 +47c6a 8 138 26 +47c72 2 1266 26 +47c74 2 138 26 +47c76 2 768 26 +47c78 8 1266 26 +47c80 8 1268 26 +47c88 8 1263 26 +47c90 4 1255 26 +47c94 e 42 24 +47ca2 e 1269 26 +FUNC 47cb0 52 0 google_breakpad::WriteMinidump +47cb0 6 1276 26 +47cb6 4 353 121 +47cba 4 1276 26 +47cbe 4 353 121 +47cc2 4 1276 26 +47cc6 c 353 121 +47cd2 1c 1279 26 +47cee c 205 121 +47cfa 8 1280 26 +FUNC 47d02 52 0 google_breakpad::WriteMinidump +47d02 e 1283 26 +47d10 14 353 121 +47d24 1c 1286 26 +47d40 c 205 121 +47d4c 8 1287 26 +FUNC 47d54 20 0 google_breakpad::WriteMinidump +47d54 2 1305 26 +47d56 2 1305 26 +47d58 18 1308 26 +47d70 4 1309 26 +FUNC 47d74 26 0 google_breakpad::WriteMinidump +47d74 8 1324 26 +47d7c 1a 1327 26 +47d96 4 1328 26 +FUNC 47d9a 26 0 google_breakpad::WriteMinidump +47d9a 2 1334 26 +47d9c 6 1334 26 +47da2 1a 1337 26 +47dbc 4 1338 26 +FUNC 47dc0 a4 0 google_breakpad::WriteMinidump +47dc0 6 1290 26 +47dc6 4 127 22 +47dca 4 1290 26 +47dce 2 1291 26 +47dd0 2 353 121 +47dd2 6 1291 26 +47dd8 8 353 121 +47de0 2 130 22 +47de2 4 127 22 +47de6 c 353 121 +47df2 2 138 26 +47df4 6 138 26 +47dfa 4 138 26 +47dfe 6 138 26 +47e04 2 100 22 +47e06 2 153 148 +47e08 2 100 22 +47e0a 2 153 148 +47e0c 2 163 54 +47e0e 4 67 144 +47e12 2 481 106 +47e14 4 138 26 +47e18 4 153 148 +47e1c 2 205 121 +47e1e 8 138 26 +47e26 a 205 121 +47e30 a 1297 26 +47e3a 8 1299 26 +47e42 8 1296 26 +47e4a e 42 24 +47e58 c 1300 26 +FUNC 47e64 12 0 google_breakpad::MinidumpFileWriter::MinidumpFileWriter +47e64 10 55 32 +47e74 2 56 32 +FUNC 47e76 34 0 google_breakpad::MinidumpFileWriter::Open +47e76 2 63 32 +47e78 4 3087 97 +47e7c 2 63 32 +47e7e 16 3087 97 +47e94 4 3087 97 +47e98 8 3087 97 +47ea0 2 72 32 +47ea2 2 66 32 +47ea4 6 72 32 +FUNC 47eaa 8 0 google_breakpad::MinidumpFileWriter::SetFile +47eaa 2 77 32 +47eac 2 76 32 +47eae 4 77 32 +FUNC 47eb2 4a 0 google_breakpad::MinidumpFileWriter::Close +47eb2 2 80 32 +47eb4 2 80 32 +47eb6 6 83 32 +47ebc a 84 32 +47ec6 14 2979 97 +47eda 4 2979 97 +47ede 8 2979 97 +47ee6 4 92 32 +47eea 4 88 32 +47eee 2 92 32 +47ef0 4 88 32 +47ef4 4 81 32 +47ef8 2 85 32 +47efa 2 96 32 +FUNC 47efc 10 0 google_breakpad::MinidumpFileWriter::~MinidumpFileWriter +47efc 2 58 32 +47efe 2 59 32 +47f00 2 58 32 +47f02 2 59 32 +47f04 4 60 32 +47f08 4 61 32 +FUNC 47f0c 44 0 google_breakpad::MinidumpFileWriter::Allocate +47f0c 2 220 32 +47f0e 2 223 32 +47f10 2 225 32 +47f12 4 223 32 +47f16 6 225 32 +47f1c 2 220 32 +47f1e 4 225 32 +47f22 2 234 32 +47f24 6 176 102 +47f2a 8 233 32 +47f32 8 234 32 +47f3a 2 237 32 +47f3c 2 240 32 +47f3e 4 241 32 +47f42 4 243 32 +47f46 4 235 32 +47f4a 6 244 32 +FUNC 47f50 6e 0 google_breakpad::MinidumpFileWriter::Copy +47f50 4 246 32 +47f54 4 246 32 +47f58 4 252 32 +47f5c 2 246 32 +47f5e 2 252 32 +47f60 2 246 32 +47f62 2 252 32 +47f64 6 253 32 +47f6a 16 3071 97 +47f80 4 3071 97 +47f84 8 3071 97 +47f8c 4 257 32 +47f90 18 3162 97 +47fa8 4 3162 97 +47fac 8 3162 97 +47fb4 6 258 32 +47fba 4 268 32 +FUNC 47fbe 16 0 google_breakpad::UntypedMDRVA::Allocate +47fbe 2 270 32 +47fc0 2 270 32 +47fc2 2 272 32 +47fc4 8 273 32 +47fcc 8 275 32 +FUNC 47fd4 6 0 google_breakpad::UntypedMDRVA::Copy +47fd4 6 281 32 +FUNC 47fda 4c 0 google_breakpad::MinidumpFileWriter::CopyStringToMDString +47fda 4 133 32 +47fde 6 133 32 +47fe4 2 136 32 +47fe6 2 134 32 +47fe8 2 140 32 +47fea 2 139 32 +47fec 2 139 32 +47fee a 140 32 +47ff8 2 141 32 +47ffa 4 149 32 +47ffe 2 151 32 +48000 c 149 32 +4800c 2 145 32 +4800e 2 146 32 +48010 c 151 32 +4801c 4 152 32 +48020 6 155 32 +FUNC 48026 aa 0 google_breakpad::MinidumpFileWriter::WriteString +48026 4 199 32 +4802a 2 167 32 +4802c 6 199 32 +48032 6 167 32 +48038 2 168 32 +4803a 2 199 32 +4803c 6 168 32 +48042 2 168 32 +48044 4 168 32 +48048 8 161 33 +48050 2 67 31 +48052 2 173 32 +48054 2 68 31 +48056 8 68 31 +4805e 6 161 33 +48064 8 212 33 +4806c 2 67 31 +4806e 4 68 31 +48072 4 173 32 +48076 4 168 32 +4807a 2 177 32 +4807c 8 179 32 +48084 2 177 32 +48086 4 179 32 +4808a 2 182 32 +4808c 4 174 32 +48090 2 183 32 +48092 2 184 32 +48094 4 183 32 +48098 8 184 32 +480a0 4 186 32 +480a4 8 176 33 +480ac a 187 32 +480b6 6 216 33 +480bc c 92 31 +480c8 8 201 32 +FUNC 480d0 8 0 google_breakpad::ElfCoreDump::Note::GetHeader +480d0 8 99 55 +FUNC 480d8 e 0 google_breakpad::ElfCoreDump::Note::IsValid +480d8 2 46 38 +480da 4 47 38 +480de 8 48 38 +FUNC 480e6 c 0 google_breakpad::ElfCoreDump::Note::GetType +480e6 2 54 38 +480e8 4 55 38 +480ec 2 57 38 +480ee 2 57 38 +480f0 2 58 38 +FUNC 480f2 26 0 google_breakpad::ElfCoreDump::Note::GetName +480f2 2 60 38 +480f4 2 60 38 +480f6 2 61 38 +480f8 2 60 38 +480fa 4 61 38 +480fe 4 62 38 +48102 e 63 38 +48110 4 50 55 +48114 4 66 38 +FUNC 48118 2c 0 google_breakpad::ElfCoreDump::Note::GetDescription +48118 2 68 38 +4811a 2 68 38 +4811c 2 69 38 +4811e 2 68 38 +48120 4 69 38 +48124 4 70 38 +48128 2 92 38 +4812a 2 72 38 +4812c 2 92 38 +4812e c 72 38 +4813a 2 72 38 +4813c 4 50 55 +48140 4 75 38 +FUNC 48144 42 0 google_breakpad::ElfCoreDump::Note::GetNextNote +48144 2 50 55 +48146 2 77 38 +48148 2 77 38 +4814a 2 79 38 +4814c 2 77 38 +4814e 4 50 55 +48152 6 79 38 +48158 2 80 38 +4815a e 92 38 +48168 2 84 38 +4816a 4 92 38 +4816e a 84 38 +48178 8 44 38 +48180 6 87 38 +FUNC 48186 8 0 google_breakpad::ElfCoreDump::ElfCoreDump +48186 6 50 55 +4818c 2 98 38 +FUNC 48186 8 0 google_breakpad::MemoryMappedFile::MemoryMappedFile +48186 6 50 55 +4818c 2 47 47 +FUNC 4818e a 0 google_breakpad::ElfCoreDump::SetContent +4818e 2 104 38 +48190 8 105 38 +FUNC 48198 8 0 google_breakpad::ElfCoreDump::GetHeader +48198 8 99 55 +FUNC 481a0 30 0 google_breakpad::ElfCoreDump::IsValid +481a0 2 108 38 +481a2 4 109 38 +481a6 2 116 38 +481a8 8 113 38 +481b0 6 114 38 +481b6 6 115 38 +481bc a 116 38 +481c6 2 116 38 +481c8 8 118 38 +FUNC 481d0 20 0 google_breakpad::ElfCoreDump::GetProgramHeader +481d0 2 124 38 +481d2 4 124 38 +481d6 4 125 38 +481da 2 126 38 +481dc 2 128 38 +481de 2 108 55 +481e0 6 109 55 +481e6 4 131 38 +481ea 4 109 55 +481ee 2 131 38 +FUNC 481f0 c 0 google_breakpad::ElfCoreDump::GetProgramHeaderCount +481f0 2 144 38 +481f2 4 145 38 +481f6 2 146 38 +481f8 2 146 38 +481fa 2 147 38 +FUNC 481fc 28 0 google_breakpad::ElfCoreDump::GetFirstProgramHeaderOfType +481fc 2 134 38 +481fe 4 134 38 +48202 8 135 38 +4820a 4 135 38 +4820e 8 136 38 +48216 6 137 38 +4821c 4 135 38 +48220 2 141 38 +48222 2 142 38 +FUNC 48224 5e 0 google_breakpad::ElfCoreDump::CopyData +48224 4 149 38 +48228 8 149 38 +48230 8 150 38 +48238 4 150 38 +4823c 8 151 38 +48244 6 152 38 +4824a 2 155 38 +4824c 4 156 38 +48250 2 156 38 +48252 4 155 38 +48256 4 156 38 +4825a c 159 38 +48266 4 160 38 +4826a 8 161 38 +48272 6 162 38 +48278 4 150 38 +4827c 2 166 38 +4827e 4 167 38 +FUNC 48282 34 0 google_breakpad::ElfCoreDump::GetFirstNote +48282 2 50 55 +48284 2 169 38 +48286 4 169 38 +4828a 4 171 38 +4828e 4 50 55 +48292 6 171 38 +48298 4 172 38 +4829c c 174 38 +482a8 8 44 38 +482b0 6 177 38 +FUNC 482b8 18 0 google_breakpad::IsValidElf +482b8 2 111 41 +482ba 2 109 41 +482bc 8 111 41 +482c4 c 112 41 +FUNC 482d0 104 0 google_breakpad::FindElfSection +482d0 4 126 41 +482d4 2 126 41 +482d6 2 131 41 +482d8 2 126 41 +482da 2 132 41 +482dc 2 131 41 +482de 2 132 41 +482e0 6 126 41 +482e6 6 134 41 +482ec 4 135 41 +482f0 2 118 41 +482f2 2 138 41 +482f4 2 139 41 +482f6 4 145 41 +482fa 2 62 41 +482fc 2 42 40 +482fe 2 62 41 +48300 2 42 40 +48302 4 62 41 +48306 2 42 40 +48308 2 65 41 +4830a 4 42 40 +4830e 4 65 41 +48312 2 70 41 +48314 2 57 40 +48316 2 70 41 +48318 4 57 40 +4831c a 58 40 +48326 6 61 40 +4832c 8 63 40 +48334 2 63 40 +48336 2 62 40 +48338 6 63 40 +4833e 6 65 40 +48344 2 63 40 +48346 8 61 40 +4834e 4 149 41 +48352 2 42 40 +48354 2 62 41 +48356 2 42 40 +48358 4 62 41 +4835c 2 42 40 +4835e 2 65 41 +48360 4 42 40 +48364 4 65 41 +48368 2 70 41 +4836a 2 57 40 +4836c 2 70 41 +4836e 4 57 40 +48372 8 58 40 +4837a 6 61 40 +48380 8 63 40 +48388 2 63 40 +4838a 2 62 40 +4838c 6 63 40 +48392 6 65 40 +48398 2 63 40 +4839a 8 61 40 +483a2 4 72 41 +483a6 6 73 41 +483ac 6 74 41 +483b2 a 152 41 +483bc 8 72 41 +483c4 6 73 41 +483ca 4 74 41 +483ce 6 156 41 +FUNC 483d4 8a 0 google_breakpad::FindElfSegment +483d4 4 162 41 +483d8 2 162 41 +483da 4 167 41 +483de 2 168 41 +483e0 a 162 41 +483ea 6 170 41 +483f0 6 171 41 +483f6 2 118 41 +483f8 6 174 41 +483fe 4 175 41 +48402 4 181 41 +48406 2 98 41 +48408 2 42 40 +4840a 8 98 41 +48412 a 99 41 +4841c 6 100 41 +48422 4 101 41 +48426 4 98 41 +4842a 4 185 41 +4842e 2 42 40 +48430 2 98 41 +48432 2 42 40 +48434 4 98 41 +48438 2 98 41 +4843a 4 98 41 +4843e a 99 41 +48448 6 100 41 +4844e 4 101 41 +48452 8 188 41 +4845a 4 192 41 +FUNC 48460 5c 0 google_breakpad::FileID::FileID +48460 2 51 42 +48462 2 51 42 +48464 2 112 137 +48466 2 481 106 +48468 2 229 145 +4846a 2 51 42 +4846c 6 229 145 +48472 4 608 135 +48476 8 600 135 +4847e 4 610 135 +48482 2 158 106 +48484 2 347 106 +48486 2 158 106 +48488 6 134 124 +4848e 6 158 106 +48494 2 613 135 +48496 2 611 135 +48498 2 613 135 +4849a 2 612 135 +4849c 4 613 135 +484a0 2 107 142 +484a2 8 106 142 +484aa 2 107 142 +484ac 2 101 108 +484ae 2 380 136 +484b0 2 101 108 +484b2 a 51 42 +FUNC 484bc 138 0 google_breakpad::FileID::ElfFileIdentifierFromMappedFile +484bc 6 142 42 +484c2 6 98 42 +484c8 2 142 42 +484ca 8 98 42 +484d2 2 142 42 +484d4 4 98 42 +484d8 2 99 42 +484da 4 98 42 +484de 12 101 42 +484f0 2 99 42 +484f2 2 103 42 +484f4 18 124 42 +4850c 8 101 42 +48514 4 124 42 +48518 2 126 42 +4851a 4 148 42 +4851e 6 106 42 +48524 2 108 42 +48526 4 64 42 +4852a 4 66 42 +4852e 6 67 42 +48534 8 70 42 +4853c c 71 42 +48548 4 69 42 +4854c 4 109 42 +48550 2 111 42 +48552 4 64 42 +48556 4 66 42 +4855a 6 67 42 +48560 8 70 42 +48568 c 71 42 +48574 4 69 42 +48578 a 129 42 +48582 2 130 42 +48584 12 131 42 +48596 8 132 42 +4859e 8 134 42 +485a6 2 133 42 +485a8 6 134 42 +485ae 2 133 42 +485b0 4 135 42 +485b4 6 74 42 +485ba 2 80 42 +485bc 6 83 42 +485c2 2 80 42 +485c4 4 83 42 +485c8 4 80 42 +485cc 2 85 42 +485ce 4 80 42 +485d2 e 84 42 +485e0 2 87 42 +485e2 12 149 42 +FUNC 485f4 2a 0 google_breakpad::FileID::ElfFileIdentifier +485f4 4 151 42 +485f8 2 151 42 +485fa e 152 42 +48608 2 153 42 +4860a 6 156 42 +48610 2 154 42 +48612 6 156 42 +48618 6 157 42 +FUNC 48620 b4 0 google_breakpad::FileID::ConvertIdentifierToString +48620 8 161 42 +48628 6 161 42 +4862e 2 165 42 +48630 4 161 42 +48634 18 165 42 +4864c 4 167 42 +48650 2 167 42 +48652 4 169 42 +48656 2 169 42 +48658 4 169 42 +4865c 4 171 42 +48660 2 171 42 +48662 2 174 42 +48664 4 171 42 +48668 4 181 42 +4866c 2 173 42 +4866e 4 174 42 +48672 4 175 42 +48676 4 177 42 +4867a 6 180 42 +48680 4 177 42 +48684 4 178 42 +48688 2 180 42 +4868a 4 180 42 +4868e 6 181 42 +48694 2 183 42 +48696 4 183 42 +4869a 2 183 42 +4869c 2 184 42 +4869e 8 183 42 +486a6 4 184 42 +486aa 2 184 42 +486ac 4 183 42 +486b0 2 184 42 +486b2 2 184 42 +486b4 4 174 42 +486b8 2 188 42 +486ba 4 188 42 +486be 16 189 42 +FUNC 486d4 10 0 GUIDGenerator::InitOnceImpl +486d4 2 78 44 +486d6 6 79 44 +486dc 4 80 44 +486e0 4 132 101 +FUNC 486e4 54 0 CreateGUID +486e4 2 87 44 +486e6 2 75 44 +486e8 2 87 44 +486ea a 75 44 +486f4 4 128 101 +486f8 2 65 44 +486fa 4 128 101 +486fe 2 66 44 +48700 4 128 101 +48704 2 67 44 +48706 4 128 101 +4870a 2 58 44 +4870c 2 57 44 +4870e 2 58 44 +48710 2 59 44 +48712 2 60 44 +48714 2 59 44 +48716 2 60 44 +48718 4 128 101 +4871c 2 58 44 +4871e 2 57 44 +48720 2 58 44 +48722 2 59 44 +48724 4 60 44 +48728 2 59 44 +4872a e 89 44 +FUNC 48738 60 0 GUIDToString +48738 2 92 44 +4873a 4 92 44 +4873e 8 98 44 +48746 2 52 44 +48748 2 51 44 +4874a 6 52 44 +48750 2 51 44 +48752 2 52 44 +48754 6 53 44 +4875a 2 98 44 +4875c 2 52 44 +4875e 4 51 44 +48762 6 52 44 +48768 2 53 44 +4876a 2 52 44 +4876c 4 53 44 +48770 10 98 44 +48780 6 99 44 +48786 6 102 44 +4878c 2 103 44 +4878e a 104 44 +FUNC 48798 10 0 my_strlen +48798 2 40 45 +4879a 4 42 45 +4879e 8 42 45 +487a6 2 44 45 +FUNC 487a8 22 0 my_strcmp +487a8 4 46 45 +487ac c 48 45 +487b8 2 50 45 +487ba 6 52 45 +487c0 6 49 45 +487c6 2 51 45 +487c8 2 57 45 +FUNC 487ca 26 0 my_strncmp +487ca 2 59 45 +487cc 2 60 45 +487ce 4 60 45 +487d2 8 61 45 +487da 2 63 45 +487dc 2 65 45 +487de 4 60 45 +487e2 4 66 45 +487e6 6 62 45 +487ec 4 64 45 +FUNC 487f0 32 0 my_strtoui +487f0 2 78 45 +487f2 6 79 45 +487f8 4 86 45 +487fc 6 83 45 +48802 6 87 45 +48808 4 86 45 +4880c 2 87 45 +4880e 2 89 45 +48810 8 90 45 +48818 2 94 45 +4881a 4 95 45 +4881e 2 80 45 +48820 2 96 45 +FUNC 48822 24 0 my_uint_len +48822 4 100 45 +48826 2 99 45 +48828 4 100 45 +4882c 8 106 45 +48834 4 104 45 +48838 4 105 45 +4883c 2 104 45 +4883e 4 109 45 +48842 2 101 45 +48844 2 110 45 +FUNC 48846 36 0 my_uitos +48846 2 118 45 +48848 a 118 45 +48852 4 119 45 +48856 12 120 45 +48868 12 119 45 +4887a 2 121 45 +FUNC 4887c 1a 0 my_strchr +4887c 2 123 45 +4887e 6 124 45 +48884 8 124 45 +4888c 8 126 45 +48894 2 129 45 +FUNC 48896 18 0 my_strrchr +48896 2 132 45 +48898 4 131 45 +4889c 6 133 45 +488a2 8 134 45 +488aa 4 139 45 +FUNC 488ae 1a 0 my_memchr +488ae 4 141 45 +488b2 2 143 45 +488b4 6 144 45 +488ba a 145 45 +488c4 2 148 45 +488c6 2 149 45 +FUNC 488c8 40 0 my_read_hex_ptr +488c8 2 155 45 +488ca 2 156 45 +488cc 4 155 45 +488d0 10 159 45 +488e0 4 161 45 +488e4 c 162 45 +488f0 4 164 45 +488f4 c 165 45 +48900 2 167 45 +48902 2 174 45 +48904 2 173 45 +48906 2 175 45 +FUNC 48908 22 0 my_read_decimal_ptr +48908 2 177 45 +4890a 2 178 45 +4890c 2 177 45 +4890e 4 182 45 +48912 10 181 45 +48922 2 183 45 +48924 2 189 45 +48926 2 188 45 +48928 2 190 45 +FUNC 4892a e 0 my_memset +4892a 2 192 45 +4892c 4 194 45 +48930 6 195 45 +48936 2 196 45 +FUNC 48938 22 0 my_strlcpy +48938 2 198 45 +4893a 2 199 45 +4893c a 202 45 +48946 4 203 45 +4894a 8 204 45 +48952 2 209 45 +48954 2 210 45 +48956 4 213 45 +FUNC 4895a 20 0 my_strlcat +4895a 2 215 45 +4895c 2 216 45 +4895e 4 218 45 +48962 4 218 45 +48966 8 219 45 +4896e a 224 45 +48978 2 225 45 +FUNC 4897c 48 0 my_isspace +4897c 4 227 45 +48980 2 229 45 +48982 4 227 45 +48986 2 229 45 +48988 4 227 45 +4898c 4 229 45 +48990 2 227 45 +48992 4 229 45 +48996 4 230 45 +4899a 6 231 45 +489a0 2 230 45 +489a2 4 230 45 +489a6 4 234 45 +489aa 2 232 45 +489ac 18 235 45 +FUNC 489c4 2c 0 google_breakpad::MemoryMappedFile::Unmap +489c4 2 106 47 +489c6 4 106 47 +489ca 2 107 47 +489cc 14 3074 97 +489e0 4 3074 97 +489e4 4 3074 97 +489e8 4 70 55 +489ec 4 72 55 +FUNC 489f0 c 0 google_breakpad::MemoryMappedFile::~MemoryMappedFile +489f0 2 53 47 +489f2 2 53 47 +489f4 4 54 47 +489f8 4 55 47 +FUNC 489fc e4 0 google_breakpad::MemoryMappedFile::Map +489fc 8 57 47 +48a04 e 57 47 +48a12 4 58 47 +48a16 18 3087 97 +48a2e 4 3087 97 +48a32 6 3087 97 +48a38 14 3446 97 +48a4c 4 3446 97 +48a50 4 3446 97 +48a54 6 91 47 +48a5a 2 99 47 +48a5c c 104 47 +48a68 e 70 47 +48a76 4 81 47 +48a7a 8 82 47 +48a82 8 89 47 +48a8a 8 3454 97 +48a92 4 95 47 +48a96 12 3454 97 +48aa8 4 3454 97 +48aac 8 3454 97 +48ab4 6 97 47 +48aba 4 98 47 +48abe 2 72 55 +48ac0 4 102 47 +48ac4 6 72 55 +48aca 4 70 55 +48ace 4 72 55 +48ad2 4 103 47 +48ad6 a 104 47 +FUNC 48ae0 12 0 google_breakpad::MemoryMappedFile::MemoryMappedFile +48ae0 2 50 55 +48ae2 2 49 47 +48ae4 2 49 47 +48ae6 4 50 55 +48aea 4 50 47 +48aee 4 51 47 +FUNC 48af2 32 0 google_breakpad::SafeReadLink +48af2 2 39 48 +48af4 12 3108 97 +48b06 4 3108 97 +48b0a 4 3108 97 +48b0e 4 50 48 +48b12 8 46 48 +48b1a 2 46 48 +48b1c 4 47 48 +48b20 2 48 48 +48b22 2 51 48 +FUNC 48b24 48 0 google_breakpad::UTF8ToUTF16Char +48b24 4 58 60 +48b28 2 63 60 +48b2a 4 58 60 +48b2e 2 59 60 +48b30 2 60 60 +48b32 2 61 60 +48b34 4 62 60 +48b38 4 63 60 +48b3c 16 69 60 +48b52 2 71 60 +48b54 6 72 60 +48b5a 2 76 60 +48b5c 4 78 60 +48b60 2 75 60 +48b62 2 78 60 +48b64 2 82 60 +48b66 6 83 60 +FUNC 48ba8 f8 0 google_breakpad::::CrashGenerationClientImpl::RequestDump +48ba8 6 51 0 +48bae a 51 0 +48bb8 14 3761 97 +48bcc 4 3761 97 +48bd0 6 3761 97 +48bd6 4 53 0 +48bda 2 63 0 +48bdc 2 61 0 +48bde 2 58 0 +48be0 2 59 0 +48be2 a 61 0 +48bec 2 62 0 +48bee 6 64 0 +48bf4 2 62 0 +48bf6 2 63 0 +48bf8 4 64 0 +48bfc 4 65 0 +48c00 2 66 0 +48c02 2 69 0 +48c04 2 70 0 +48c06 2 3671 97 +48c08 2 66 0 +48c0a 2 71 0 +48c0c 4 73 0 +48c10 18 3671 97 +48c28 4 3671 97 +48c2c 4 3671 97 +48c30 4 75 0 +48c34 6 75 0 +48c3a 4 3671 97 +48c3e 6 76 0 +48c44 4 77 0 +48c48 6 78 0 +48c4e 2 54 0 +48c50 c 88 0 +48c5c 1c 3104 97 +48c78 6 85 0 +48c7e 4 87 0 +48c82 4 3104 97 +48c86 4 3104 97 +48c8a 4 84 0 +48c8e 8 84 0 +48c96 a 88 0 +FUNC 48ca0 20 0 google_breakpad::CrashGenerationClient::TryCreate +48ca0 2 99 0 +48ca2 4 100 0 +48ca6 6 102 0 +48cac a 48 0 +48cb6 2 102 0 +48cb8 2 101 0 +48cba 6 103 0 +FUNC 48cc0 4 0 google_breakpad::ThreadInfo::GetInstructionPointer +48cc0 4 195 2 +FUNC 48cc4 24 0 google_breakpad::ThreadInfo::FillCPUContext +48cc4 4 197 2 +48cc8 a 198 2 +48cd2 4 201 2 +48cd6 2 200 2 +48cd8 4 201 2 +48cdc 2 200 2 +48cde a 203 2 +FUNC 48ce8 4 0 google_breakpad::UContextReader::GetStackPointer +48ce8 4 150 3 +FUNC 48cec 4 0 google_breakpad::UContextReader::GetInstructionPointer +48cec 4 154 3 +FUNC 48cf0 94 0 google_breakpad::UContextReader::FillCPUContext +48cf0 2 156 3 +48cf2 2 157 3 +48cf4 2 180 3 +48cf6 2 157 3 +48cf8 2 159 3 +48cfa 2 156 3 +48cfc 2 159 3 +48cfe 2 160 3 +48d00 2 181 3 +48d02 4 160 3 +48d06 6 161 3 +48d0c 6 162 3 +48d12 6 163 3 +48d18 6 164 3 +48d1e 6 165 3 +48d24 6 166 3 +48d2a 6 167 3 +48d30 6 168 3 +48d36 6 169 3 +48d3c 6 171 3 +48d42 6 172 3 +48d48 6 173 3 +48d4e 6 174 3 +48d54 6 175 3 +48d5a 2 177 3 +48d5c 2 181 3 +48d5e 4 177 3 +48d62 6 180 3 +48d68 8 181 3 +48d70 4 182 3 +48d74 4 183 3 +48d78 c 182 3 +FUNC 48d84 7a 0 isLegalUTF8 +48d84 2 299 37 +48d86 e 300 37 +48d94 e 303 37 +48da2 e 304 37 +48db0 8 305 37 +48db8 c 307 37 +48dc4 4 309 37 +48dc8 8 307 37 +48dd0 4 312 37 +48dd4 4 310 37 +48dd8 6 311 37 +48dde 4 312 37 +48de2 4 313 37 +48de6 a 316 37 +48df0 a 301 37 +48dfa 2 303 37 +48dfc 2 320 37 +FUNC 48e00 118 0 ConvertUTF8toUTF16 +48e00 8 339 37 +48e08 4 390 37 +48e0c 2 339 37 +48e0e 2 339 37 +48e10 2 345 37 +48e12 4 365 37 +48e16 2 345 37 +48e18 2 341 37 +48e1a 2 342 37 +48e1c 2 339 37 +48e1e 2 345 37 +48e20 2 365 37 +48e22 4 343 37 +48e26 6 345 37 +48e2c 6 346 37 +48e32 c 350 37 +48e3e e 357 37 +48e4c 6 358 37 +48e52 2 344 37 +48e54 a 359 37 +48e5e 2 344 37 +48e60 a 360 37 +48e6a 2 344 37 +48e6c a 361 37 +48e76 2 344 37 +48e78 a 362 37 +48e82 2 344 37 +48e84 8 363 37 +48e8c 2 344 37 +48e8e 6 365 37 +48e94 6 367 37 +48e9a 6 371 37 +48ea0 a 373 37 +48eaa 4 382 37 +48eae 6 384 37 +48eb4 4 385 37 +48eb8 6 387 37 +48ebe 8 390 37 +48ec6 8 394 37 +48ece 2 395 37 +48ed0 2 396 37 +48ed2 2 395 37 +48ed4 2 396 37 +48ed6 2 399 37 +48ed8 4 398 37 +48edc 6 399 37 +48ee2 4 400 37 +48ee6 4 399 37 +48eea a 400 37 +48ef4 4 340 37 +48ef8 4 347 37 +48efc 2 351 37 +48efe 2 404 37 +48f00 4 403 37 +48f04 2 404 37 +48f06 12 406 37 +FUNC 48f18 20 0 google_breakpad::DumpContext::DumpContext +48f18 2 53 68 +48f1a 2 53 68 +48f1c 1c 54 68 +FUNC 48f38 10 0 google_breakpad::DumpContext::GetContextCPU +48f38 4 61 68 +48f3c 8 67 68 +48f44 2 64 68 +48f46 2 68 68 +FUNC 48f48 4 0 google_breakpad::DumpContext::GetContextFlags +48f48 4 72 68 +FUNC 48f4c 4 0 google_breakpad::DumpContext::SetContextFlags +48f4c 4 190 68 +FUNC 48f50 4 0 google_breakpad::DumpContext::SetContextAMD64 +FUNC 48f50 4 0 google_breakpad::DumpContext::SetContextARM +FUNC 48f50 4 0 google_breakpad::DumpContext::SetContextARM64 +FUNC 48f50 4 0 google_breakpad::DumpContext::SetContextMIPS +FUNC 48f50 4 0 google_breakpad::DumpContext::SetContextPPC +FUNC 48f50 4 0 google_breakpad::DumpContext::SetContextPPC64 +FUNC 48f50 4 0 google_breakpad::DumpContext::SetContextSPARC +FUNC 48f50 4 0 google_breakpad::DumpContext::SetContextX86 +48f50 4 194 68 +FUNC 48f54 4a 0 google_breakpad::DumpContext::FreeContext +48f54 2 225 68 +48f56 2 225 68 +48f58 38 226 68 +48f90 6 256 68 +48f96 4 266 68 +48f9a 4 267 68 +FUNC 48fa0 18 0 google_breakpad::DumpContext::~DumpContext +48fa0 2 56 68 +48fa2 a 56 68 +48fac 4 57 68 +48fb0 8 58 68 +FUNC 48fb8 12 0 google_breakpad::DumpContext::~DumpContext +48fb8 2 56 68 +48fba 2 56 68 +48fbc 4 58 68 +48fc0 6 58 68 +48fc6 4 58 68 +FUNC 48fcc 4c 0 google_breakpad::DumpContext::GetContextX86 +48fcc 2 74 68 +48fce 2 74 68 +48fd0 a 75 68 +48fda 18 76 68 +48ff2 a 333 127 +48ffc 6 76 68 +49002 4 76 68 +49006 2 80 68 +49008 10 81 68 +FUNC 49018 4c 0 google_breakpad::DumpContext::GetContextPPC +49018 2 83 68 +4901a 2 83 68 +4901c a 84 68 +49026 18 85 68 +4903e a 333 127 +49048 6 85 68 +4904e 4 85 68 +49052 2 89 68 +49054 10 90 68 +FUNC 49064 4c 0 google_breakpad::DumpContext::GetContextARM +49064 2 119 68 +49066 2 119 68 +49068 a 120 68 +49072 18 121 68 +4908a a 333 127 +49094 6 121 68 +4909a 4 121 68 +4909e 2 125 68 +490a0 10 126 68 +FUNC 490b0 4c 0 google_breakpad::DumpContext::GetContextPPC64 +490b0 2 92 68 +490b2 2 92 68 +490b4 a 93 68 +490be 18 94 68 +490d6 a 333 127 +490e0 6 94 68 +490e6 4 94 68 +490ea 2 98 68 +490ec 10 99 68 +FUNC 490fc 4c 0 google_breakpad::DumpContext::GetContextAMD64 +490fc 2 101 68 +490fe 2 101 68 +49100 a 102 68 +4910a 18 103 68 +49122 a 333 127 +4912c 6 103 68 +49132 4 103 68 +49136 2 107 68 +49138 10 108 68 +FUNC 49148 4c 0 google_breakpad::DumpContext::GetContextSPARC +49148 2 110 68 +4914a 2 110 68 +4914c a 111 68 +49156 18 112 68 +4916e a 333 127 +49178 6 112 68 +4917e 4 112 68 +49182 2 116 68 +49184 10 117 68 +FUNC 49194 4c 0 google_breakpad::DumpContext::GetContextARM64 +49194 2 128 68 +49196 2 128 68 +49198 a 129 68 +491a2 18 130 68 +491ba a 333 127 +491c4 6 130 68 +491ca 4 130 68 +491ce 2 134 68 +491d0 10 135 68 +FUNC 491e0 4c 0 google_breakpad::DumpContext::GetContextMIPS +491e0 2 137 68 +491e2 2 137 68 +491e4 a 138 68 +491ee 18 139 68 +49206 a 333 127 +49210 6 139 68 +49216 4 139 68 +4921a 2 143 68 +4921c 10 144 68 +FUNC 4922c 170 0 google_breakpad::DumpContext::GetInstructionPointer +4922c 6 146 68 +49232 4 146 68 +49236 4 147 68 +4923a 1a 147 68 +49254 a 333 127 +4925e 6 147 68 +49264 8 149 68 +4926c 4 151 68 +49270 1a 152 68 +4928a a 333 127 +49294 6 152 68 +4929a 2 153 68 +4929c 20 156 68 +492bc c 176 68 +492c8 e 156 68 +492d6 c 173 68 +492e2 c 156 68 +492ee 12 164 68 +49300 c 158 68 +4930c a 161 68 +49316 a 167 68 +49320 c 170 68 +4932c 6 176 68 +49332 2 177 68 +49334 12 179 68 +49346 2 180 68 +49348 1a 183 68 +49362 a 333 127 +4936c 6 183 68 +49372 2 184 68 +49374 28 187 68 +FUNC 4939c 6 0 google_breakpad::DumpObject::DumpObject +4939c 4 36 69 +493a0 2 37 69 +FUNC 493a4 44 0 google_breakpad::HexString +493a4 e 86 71 +493b2 2 86 71 +493b4 4 88 71 +493b8 2 86 71 +493ba a 88 71 +493c4 a 89 71 +493ce 1a 90 71 +FUNC 493e8 48 0 google_breakpad::HexString +493e8 c 92 71 +493f4 2 92 71 +493f6 8 94 71 +493fe 2 92 71 +49400 a 94 71 +4940a a 95 71 +49414 1c 96 71 +FUNC 49430 44 0 google_breakpad::HexString +49430 e 98 71 +4943e 2 98 71 +49440 4 100 71 +49444 2 98 71 +49446 a 100 71 +49450 a 101 71 +4945a 1a 102 71 +FUNC 49474 4a 0 google_breakpad::LogStream::~LogStream +49474 2 82 71 +49476 2 83 71 +49478 2 82 71 +4947a c 181 127 +49486 2 412 126 +49488 10 422 126 +49498 2 414 126 +4949a e 414 126 +494a8 4 421 126 +494ac 6 424 126 +494b2 6 359 127 +494b8 6 84 71 +FUNC 494c0 18c 0 google_breakpad::LogStream::LogStream +494c0 e 54 71 +494ce 2 58 71 +494d0 6 54 71 +494d6 2 56 71 +494d8 2 58 71 +494da 2 54 71 +494dc 4 58 71 +494e0 a 63 71 +494ea 12 66 71 +494fc c 69 71 +49508 6 74 71 +4950e 2 75 71 +49510 8 71 71 +49518 6 68 71 +4951e 2 78 71 +49520 e 333 127 +4952e 4 78 71 +49532 4 333 127 +49536 6 78 71 +4953c 2 78 71 +4953e 4 78 71 +49542 8 78 71 +4954a a 78 71 +49554 8 333 127 +4955c c 181 127 +49568 2 199 126 +4956a 10 211 126 +4957a 2 202 126 +4957c 2 145 115 +4957e 4 202 126 +49582 2 145 115 +49584 2 202 126 +49586 6 145 115 +4958c 8 351 122 +49594 6 351 122 +4959a 2 202 126 +4959c 2 351 122 +4959e c 202 126 +495aa 18 57 128 +495c2 1c 67 125 +495de 6 202 126 +495e4 6 210 126 +495ea 2 333 127 +495ec 2 212 126 +495ee 2 333 127 +495f0 4 212 126 +495f4 18 333 127 +4960c c 156 137 +49618 34 80 71 +FUNC 4964c 62 0 google_breakpad::ErrnoString +4964c 2 104 71 +4964e 2 104 71 +49650 6 111 71 +49656 6 111 71 +4965c 6 229 145 +49662 6 400 136 +49668 4 244 135 +4966c 2 168 145 +4966e 8 168 145 +49676 6 246 135 +4967c 4 803 136 +49680 2 168 145 +49682 2 806 136 +49684 2 168 145 +49686 8 806 136 +4968e 2 168 145 +49690 6 168 145 +49696 4 400 136 +4969a 2 250 135 +4969c 2 400 136 +4969e 8 250 135 +496a6 6 112 71 +496ac 2 113 71 +FUNC 496ae c 0 google_breakpad::MinidumpThreadList::thread_count +496ae 4 322 65 +496b2 4 322 65 +496b6 2 322 65 +496b8 2 323 65 +FUNC 496ba 14 0 google_breakpad::MinidumpModule::base_address +496ba 4 383 65 +496be 6 383 65 +496c4 8 383 65 +496cc 2 384 65 +FUNC 496d6 e 0 google_breakpad::MinidumpModule::size +496d6 4 385 65 +496da 4 385 65 +496de 2 385 65 +496e0 4 385 65 +FUNC 496ec c 0 google_breakpad::MinidumpModuleList::module_count +496ec 4 491 65 +496f0 4 491 65 +496f4 2 491 65 +496f6 2 492 65 +FUNC 49700 e 0 google_breakpad::Minidump::header +49700 6 882 65 +49706 4 882 65 +4970a 2 882 65 +4970c 2 882 65 +FUNC 4970e 6 0 google_breakpad::BasicCodeModule::base_address +4970e 6 84 66 +FUNC 49714 6 0 google_breakpad::BasicCodeModule::size +49714 6 85 66 +FUNC 4971a e 0 google_breakpad::Swap +4971a a 125 73 +49724 4 127 73 +FUNC 49728 8 0 google_breakpad::Swap +49728 4 131 73 +4972c 4 135 73 +FUNC 49730 18 0 google_breakpad::Swap +49730 2 139 73 +49732 2 139 73 +49734 4 141 73 +49738 6 142 73 +4973e 2 143 73 +49740 2 144 73 +49742 6 145 73 +FUNC 49748 12 0 google_breakpad::Swap +49748 2 182 73 +4974a 2 182 73 +4974c 4 183 73 +49750 2 184 73 +49752 4 185 73 +49756 4 184 73 +FUNC 4975c 28 0 google_breakpad::MinidumpThread::~MinidumpThread +4975c 2 1380 73 +4975e a 1380 73 +49768 4 1381 73 +4976c 6 1381 73 +49772 4 1382 73 +49776 6 1382 73 +4977c 8 1383 73 +FUNC 49784 20 0 google_breakpad::MinidumpException::~MinidumpException +49784 2 2883 73 +49786 a 2883 73 +49790 6 2884 73 +49796 6 2884 73 +4979c 8 2885 73 +FUNC 497a4 84 0 std::basic_filebuf >::pbackfail +497a4 2 157 109 +497a6 a 161 109 +497b0 4 166 109 +497b4 4 166 109 +497b8 a 166 109 +497c2 6 166 109 +497c8 4 175 109 +497cc 4 178 109 +497d0 4 177 109 +497d4 2 178 109 +497d6 8 180 109 +497de 2 181 109 +497e0 2 95 134 +497e2 2 181 109 +497e4 2 93 134 +497e6 4 94 134 +497ea 2 187 109 +497ec 2 188 109 +497ee 2 186 109 +497f0 2 188 109 +497f2 4 189 109 +497f6 2 93 134 +497f8 2 94 134 +497fa 2 190 109 +497fc 2 95 134 +497fe 6 190 109 +49804 4 220 145 +49808 a 162 109 +49812 4 91 134 +49816 8 171 109 +4981e 6 171 109 +49824 2 223 145 +49826 2 199 109 +FUNC 49828 12 0 google_breakpad::MinidumpThread::~MinidumpThread +49828 2 1380 73 +4982a 2 1380 73 +4982c 4 1383 73 +49830 6 1383 73 +49836 4 1383 73 +FUNC 4983a 12 0 google_breakpad::MinidumpException::~MinidumpException +4983a 2 2883 73 +4983c 2 2883 73 +4983e 4 2885 73 +49842 6 2885 73 +49848 4 2885 73 +FUNC 4984c 18 0 google_breakpad::MinidumpContext::~MinidumpContext +4984c 2 420 73 +4984e e 420 73 +4985c 8 421 73 +FUNC 49864 12 0 google_breakpad::MinidumpContext::~MinidumpContext +49864 2 420 73 +49866 2 420 73 +49868 4 421 73 +4986c 6 421 73 +49872 4 421 73 +FUNC 49876 18 0 google_breakpad::MinidumpModuleList::Copy +49876 2 2640 73 +49878 2 2640 73 +4987a 8 2641 73 +49882 8 2641 73 +4988a 4 2642 73 +FUNC 49896 4 0 std::basic_filebuf >::underflow +49896 4 76 109 +FUNC 49896 4 0 std::basic_filebuf >::underflow() +49896 4 76 207 +FUNC 4989a 22 0 std::basic_filebuf >::sync +4989a 2 402 109 +4989c 6 403 109 +498a2 2 405 109 +498a4 8 405 109 +498ac c 405 109 +498b8 2 406 109 +498ba 2 407 109 +FUNC 498bc 4a 0 std::basic_filebuf >::showmanyc +498bc 2 132 109 +498be 6 134 109 +498c4 4 134 109 +498c8 6 135 109 +498ce 6 136 109 +498d4 8 137 109 +498dc 6 138 109 +498e2 4 144 109 +498e6 e 139 109 +498f4 6 140 109 +498fa 4 141 109 +498fe 4 141 109 +49902 4 141 109 +FUNC 49906 54 0 std::basic_filebuf >::_M_unshift +49906 4 593 109 +4990a 2 593 109 +4990c 4 598 109 +49910 2 199 107 +49912 4 322 110 +49916 2 597 109 +49918 2 598 109 +4991a 2 597 109 +4991c c 199 107 +49928 2 600 109 +4992a 2 199 107 +4992c 2 600 109 +4992e 8 600 109 +49936 2 600 109 +49938 4 603 109 +4993c 4 604 109 +49940 8 322 110 +49948 4 605 109 +4994c 6 596 109 +49952 2 602 109 +49954 6 611 109 +FUNC 4995c 4c 0 std::basic_filebuf >::_M_setup_codecvt +4995c 2 735 109 +4995e 2 735 109 +49960 c 351 122 +4996c 2 737 109 +4996e 6 216 107 +49974 8 141 105 +4997c 2 216 107 +4997e 2 741 109 +49980 2 740 109 +49982 6 227 107 +49988 8 742 109 +49990 2 741 109 +49992 2 743 109 +49994 4 742 109 +49998 6 218 107 +4999e a 743 109 +FUNC 499a8 50 0 std::basic_filebuf >::imbue +499a8 2 413 109 +499aa 4 414 109 +499ae 4 413 109 +499b2 2 414 109 +499b4 6 414 109 +499ba c 347 122 +499c6 6 736 109 +499cc 8 417 109 +499d4 2 747 109 +499d6 2 746 109 +499d8 8 748 109 +499e0 4 747 109 +499e4 4 351 122 +499e8 4 417 109 +499ec c 351 122 +FUNC 499f8 38 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_create_node +499f8 2 306 106 +499fa 2 315 141 +499fc 2 315 141 +499fe 6 306 106 +49a04 4 307 106 +49a08 4 119 108 +49a0c 2 307 106 +49a0e 16 68 129 +49a24 2 321 141 +49a26 2 324 141 +49a28 2 321 141 +49a2a 2 322 141 +49a2c 4 324 141 +FUNC 49a30 38 0 std::priv::_Rb_tree, std::pair::Range>, std::priv::_Select1st::Range> >, std::priv::_MapTraitsT::Range> >, std::allocator::Range> > >::_M_create_node +49a30 2 306 106 +49a32 2 315 141 +49a34 2 315 141 +49a36 6 306 106 +49a3c 4 307 106 +49a40 4 119 108 +49a44 2 307 106 +49a46 2 119 108 +49a48 14 68 129 +49a5c 2 321 141 +49a5e 2 324 141 +49a60 2 321 141 +49a62 2 322 141 +49a64 4 324 141 +FUNC 49a68 28 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_create_node +49a68 2 306 106 +49a6a 2 315 141 +49a6c 2 315 141 +49a6e 6 306 106 +49a74 4 307 106 +49a78 4 119 108 +49a7c a 68 129 +49a86 4 321 141 +49a8a 2 322 141 +49a8c 4 324 141 +FUNC 49a90 12 0 google_breakpad::Minidump::MinidumpStreamInfo::~MinidumpStreamInfo +49a90 2 969 65 +49a92 6 969 65 +49a98 2 969 65 +49a9a 4 969 65 +49a9e 4 969 65 +FUNC 49aa4 6c 0 google_breakpad::BasicCodeModule::BasicCodeModule +49aa4 2 57 66 +49aa6 2 64 66 +49aa8 2 57 66 +49aaa 6 64 66 +49ab0 6 58 66 +49ab6 2 57 66 +49ab8 2 58 66 +49aba 4 64 66 +49abe 8 59 66 +49ac6 4 64 66 +49aca 2 60 66 +49acc a 64 66 +49ad6 2 61 66 +49ad8 a 64 66 +49ae2 2 62 66 +49ae4 a 64 66 +49aee 2 63 66 +49af0 a 64 66 +49afa 2 64 66 +49afc a 64 66 +49b06 a 64 66 +FUNC 49b10 18 0 google_breakpad::MinidumpModule::Copy +49b10 2 2071 73 +49b12 2 2071 73 +49b14 8 2072 73 +49b1c 8 2072 73 +49b24 4 2073 73 +FUNC 49b30 16 0 google_breakpad::BasicCodeModule::Copy +49b30 2 91 66 +49b32 a 91 66 +49b3c 6 91 66 +49b42 4 91 66 +FUNC 49b48 20 0 google_breakpad::MinidumpStream::MinidumpStream +49b48 2 405 73 +49b4a 4 405 73 +49b4e 6 396 73 +49b54 2 406 73 +49b56 2 396 73 +49b58 6 406 73 +49b5e a 407 73 +FUNC 49b68 2c 0 google_breakpad::MinidumpMemoryRegion::MinidumpMemoryRegion +49b68 2 1192 73 +49b6a 2 1192 73 +49b6c 2 396 73 +49b6e 2 1192 73 +49b70 4 396 73 +49b74 2 1195 73 +49b76 2 396 73 +49b78 12 1195 73 +49b8a a 1196 73 +FUNC 49b94 22 0 google_breakpad::MinidumpMemoryRegion::SetDescriptor +49b94 2 1204 73 +49b96 2 1205 73 +49b98 2 1206 73 +49b9a 4 1208 73 +49b9e 2 1207 73 +49ba0 4 1208 73 +49ba4 2 1207 73 +49ba6 c 1206 73 +49bb2 4 1209 73 +FUNC 49bb8 30 0 google_breakpad::MinidumpThread::MinidumpThread +49bb8 2 1372 73 +49bba 2 1372 73 +49bbc 2 396 73 +49bbe 2 1372 73 +49bc0 4 396 73 +49bc4 4 1376 73 +49bc8 2 396 73 +49bca 16 1376 73 +49be0 8 1377 73 +FUNC 49be8 48 0 google_breakpad::MinidumpThreadList::MinidumpThreadList +49be8 4 1540 73 +49bec 2 1544 73 +49bee 2 1540 73 +49bf0 6 1544 73 +49bf6 2 250 141 +49bf8 8 1544 73 +49c00 e 250 141 +49c0e 8 481 106 +49c16 2 263 141 +49c18 2 1545 73 +49c1a 2 263 141 +49c1c 2 265 141 +49c1e 2 266 141 +49c20 2 267 141 +49c22 2 391 141 +49c24 4 1544 73 +49c28 8 1545 73 +FUNC 49c30 4c 0 google_breakpad::MinidumpModule::MinidumpModule +49c30 2 1704 73 +49c32 4 1704 73 +49c36 8 396 73 +49c3e 34 1712 73 +49c72 a 1713 73 +FUNC 49c7c 2c 0 google_breakpad::MinidumpException::MinidumpException +49c7c 2 2876 73 +49c7e 2 2876 73 +49c80 1e 2879 73 +49c9e a 2880 73 +FUNC 49ca8 2c 0 google_breakpad::MinidumpSystemInfo::MinidumpSystemInfo +49ca8 2 3092 73 +49caa 2 3092 73 +49cac 1e 3096 73 +49cca a 3097 73 +FUNC 49cd4 34 0 std::priv::_Impl_vector >::~_Impl_vector +49cd4 2 304 144 +49cd6 2 304 144 +49cd8 6 65 118 +49cde 2 74 118 +49ce0 4 191 108 +49ce4 4 77 118 +49ce8 a 57 108 +49cf2 4 81 118 +49cf6 4 87 144 +49cfa 2 88 144 +49cfc 6 323 106 +49d02 6 304 144 +FUNC 49d08 34 0 std::priv::_Impl_vector >::~_Impl_vector +49d08 2 304 144 +49d0a 2 304 144 +49d0c 6 65 118 +49d12 2 74 118 +49d14 4 191 108 +49d18 4 77 118 +49d1c a 57 108 +49d26 4 81 118 +49d2a 4 87 144 +49d2e 2 88 144 +49d30 6 323 106 +49d36 6 304 144 +FUNC 49d3c 34 0 std::priv::_Impl_vector >::~_Impl_vector +49d3c 2 304 144 +49d3e 2 304 144 +49d40 6 65 118 +49d46 2 74 118 +49d48 4 191 108 +49d4c 4 77 118 +49d50 a 57 108 +49d5a 4 81 118 +49d5e 4 87 144 +49d62 2 88 144 +49d64 6 323 106 +49d6a 6 304 144 +FUNC 49d70 18 0 google_breakpad::scoped_ptr, std::allocator > >::~scoped_ptr +49d70 2 96 57 +49d72 2 98 57 +49d74 2 96 57 +49d76 2 98 57 +49d78 6 156 137 +49d7e 6 98 57 +49d84 4 99 57 +FUNC 49d88 3c 0 google_breakpad::BasicCodeModule::~BasicCodeModule +49d88 2 80 66 +49d8a c 80 66 +49d96 24 156 137 +49dba a 80 66 +FUNC 49dc4 12 0 google_breakpad::BasicCodeModule::~BasicCodeModule +49dc4 2 80 66 +49dc6 6 80 66 +49dcc 6 80 66 +49dd2 4 80 66 +FUNC 49dd8 34 0 google_breakpad::MinidumpSystemInfo::~MinidumpSystemInfo +49dd8 2 3100 73 +49dda 2 3100 73 +49ddc 2 3101 73 +49dde 8 3100 73 +49de6 2 3101 73 +49de8 6 156 137 +49dee 6 3101 73 +49df4 4 3102 73 +49df8 6 156 137 +49dfe 6 3102 73 +49e04 8 3103 73 +FUNC 49e0c 12 0 google_breakpad::MinidumpSystemInfo::~MinidumpSystemInfo +49e0c 2 3100 73 +49e0e 2 3100 73 +49e10 4 3103 73 +49e14 6 3103 73 +49e1a 4 3103 73 +FUNC 49e20 60 0 std::priv::_Impl_vector >::_Impl_vector +49e20 2 70 144 +49e22 4 342 106 +49e26 2 233 144 +49e28 4 233 144 +49e2c 4 70 144 +49e30 2 481 106 +49e32 2 342 106 +49e34 8 343 106 +49e3c 6 343 106 +49e42 2 346 106 +49e44 6 347 106 +49e4a 4 348 106 +49e4e 6 352 106 +49e54 2 356 106 +49e56 4 73 144 +49e5a 2 314 142 +49e5c 2 71 144 +49e5e 2 72 144 +49e60 2 73 144 +49e62 4 249 142 +49e66 6 249 142 +49e6c 2 249 142 +49e6e 6 146 108 +49e74 c 244 144 +FUNC 49e80 2c 0 google_breakpad::MinidumpMemoryRegion::~MinidumpMemoryRegion +49e80 2 1199 73 +49e82 2 1199 73 +49e84 2 1200 73 +49e86 e 1199 73 +49e94 2 1200 73 +49e96 6 304 144 +49e9c 6 1200 73 +49ea2 a 1201 73 +FUNC 49eb4 12 0 google_breakpad::MinidumpMemoryRegion::~MinidumpMemoryRegion +49eb4 2 1199 73 +49eb6 2 1199 73 +49eb8 4 1201 73 +49ebc 6 1201 73 +49ec2 4 1201 73 +FUNC 49ece 18 0 google_breakpad::scoped_ptr > >::~scoped_ptr +49ece 2 96 57 +49ed0 2 98 57 +49ed2 2 96 57 +49ed4 2 98 57 +49ed6 6 304 144 +49edc 6 98 57 +49ee2 4 99 57 +FUNC 49ee8 50 0 google_breakpad::MinidumpModule::~MinidumpModule +49ee8 2 1716 73 +49eea 2 1716 73 +49eec 4 1717 73 +49ef0 e 1716 73 +49efe 2 1717 73 +49f00 6 156 137 +49f06 6 1717 73 +49f0c 6 1718 73 +49f12 6 304 144 +49f18 6 1718 73 +49f1e 6 1719 73 +49f24 6 304 144 +49f2a 6 1719 73 +49f30 8 1720 73 +FUNC 49f40 12 0 google_breakpad::MinidumpModule::~MinidumpModule +49f40 2 1716 73 +49f42 2 1716 73 +49f44 4 1720 73 +49f48 6 1720 73 +49f4e 4 1720 73 +FUNC 49f5a 4a 0 std::priv::_Impl_vector >::_Impl_vector +49f5a 2 70 144 +49f5c 2 233 144 +49f5e 4 233 144 +49f62 4 70 144 +49f66 2 481 106 +49f68 4 346 106 +49f6c 6 347 106 +49f72 4 348 106 +49f76 4 352 106 +49f7a 2 346 106 +49f7c 2 356 106 +49f7e 2 73 144 +49f80 2 314 142 +49f82 2 71 144 +49f84 2 72 144 +49f86 a 73 144 +49f90 6 249 142 +49f96 6 146 108 +49f9c 8 244 144 +FUNC 49fa4 34 0 google_breakpad::MinidumpModuleList::MinidumpModuleList +49fa4 2 2431 73 +49fa6 2 2431 73 +49fa8 6 2435 73 +49fae 2 2435 73 +49fb0 c 2435 73 +49fbc 6 2435 73 +49fc2 4 55 76 +49fc6 8 2435 73 +49fce a 2436 73 +FUNC 49fd8 30 0 google_breakpad::MinidumpMemoryList::MinidumpMemoryList +49fd8 2 2673 73 +49fda 2 2673 73 +49fdc 6 2678 73 +49fe2 2 2678 73 +49fe4 6 2678 73 +49fea 6 2678 73 +49ff0 4 55 76 +49ff4 a 2678 73 +49ffe a 2679 73 +FUNC 4a008 32 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::find +4a008 2 543 141 +4a00a 6 549 141 +4a010 2 552 141 +4a012 6 553 141 +4a018 6 556 141 +4a01e 2 554 141 +4a020 6 556 141 +4a026 4 558 141 +4a02a c 559 141 +4a036 2 142 141 +4a038 2 543 141 +FUNC 4a03a 26 0 std::priv::_Rb_global::_M_increment +4a03a 4 297 140 +4a03e a 94 141 +4a048 2 301 140 +4a04a 6 302 140 +4a050 6 304 140 +4a056 8 309 140 +4a05e 2 313 140 +FUNC 4a060 e6 0 std::priv::__read_unbuffered, std::priv::_Constant_unary_fun > +4a060 10 579 116 +4a070 e 579 116 +4a07e 4 603 116 +4a082 4 579 116 +4a086 2 603 116 +4a088 a 592 116 +4a092 8 593 116 +4a09a 8 229 134 +4a0a2 4 228 134 +4a0a6 4 223 145 +4a0aa 2 228 134 +4a0ac 6 229 134 +4a0b2 4 599 116 +4a0b6 6 600 116 +4a0bc 8 600 116 +4a0c4 6 603 116 +4a0ca 6 604 116 +4a0d0 4 605 116 +4a0d4 a 244 134 +4a0de 8 244 134 +4a0e6 2 243 134 +4a0e8 2 244 134 +4a0ea a 622 116 +4a0f4 2 243 134 +4a0f6 6 244 134 +4a0fc 6 606 116 +4a102 4 612 116 +4a106 4 591 116 +4a10a a 622 116 +4a114 6 623 116 +4a11a 2 624 116 +4a11c 14 625 116 +4a130 4 594 116 +4a134 2 601 116 +4a136 8 622 116 +4a13e 8 627 116 +FUNC 4a146 e 0 google_breakpad::BasicCodeModule::code_file +4a146 2 86 66 +4a148 c 86 66 +FUNC 4a154 e 0 google_breakpad::BasicCodeModule::code_identifier +4a154 2 87 66 +4a156 c 87 66 +FUNC 4a162 e 0 google_breakpad::BasicCodeModule::debug_file +4a162 2 88 66 +4a164 c 88 66 +FUNC 4a170 e 0 google_breakpad::BasicCodeModule::debug_identifier +4a170 2 89 66 +4a172 c 89 66 +FUNC 4a17e e 0 google_breakpad::BasicCodeModule::version +4a17e 2 90 66 +4a180 c 90 66 +FUNC 4a18c e 0 google_breakpad::Minidump::path +4a18c 2 869 65 +4a18e 2 869 65 +4a190 6 870 65 +4a196 4 871 65 +FUNC 4a19c 48 0 google_breakpad::Minidump::Minidump +4a19c 2 3972 73 +4a19e 2 3972 73 +4a1a0 e 3979 73 +4a1ae 2 3972 73 +4a1b0 10 3979 73 +4a1c0 4 3979 73 +4a1c4 2 3979 73 +4a1c6 a 3979 73 +4a1d0 a 3979 73 +4a1da a 3980 73 +FUNC 4a1e4 50 0 google_breakpad::MinidumpModuleList::GetMainModule +4a1e4 2 2588 73 +4a1e6 2 2589 73 +4a1e8 2 2588 73 +4a1ea 2 2589 73 +4a1ec 1a 2590 73 +4a206 a 333 127 +4a210 6 2590 73 +4a216 4 2590 73 +4a21a 8 2596 73 +4a222 12 2597 73 +FUNC 4a248 48 0 google_breakpad::MinidumpThread::GetMemory +4a248 2 1438 73 +4a24a 2 1439 73 +4a24c 2 1438 73 +4a24e 2 1439 73 +4a250 1a 1440 73 +4a26a a 333 127 +4a274 6 1440 73 +4a27a 4 1440 73 +4a27e 2 1444 73 +4a280 10 1445 73 +FUNC 4a290 50 0 google_breakpad::MinidumpMemoryRegion::GetBase +4a290 2 1252 73 +4a292 4 1253 73 +4a296 1a 1254 73 +4a2b0 a 333 127 +4a2ba 6 1254 73 +4a2c0 a 1254 73 +4a2ca 6 1258 73 +4a2d0 10 1259 73 +FUNC 4a2e8 4c 0 google_breakpad::MinidumpMemoryRegion::GetSize +4a2e8 2 1262 73 +4a2ea 2 1263 73 +4a2ec 2 1262 73 +4a2ee 2 1263 73 +4a2f0 1a 1264 73 +4a30a a 333 127 +4a314 6 1264 73 +4a31a 4 1264 73 +4a31e 4 1268 73 +4a322 12 1269 73 +FUNC 4a33c 4c 0 google_breakpad::MinidumpThread::GetStartOfStackMemoryRange +4a33c 2 1429 73 +4a33e 4 1430 73 +4a342 1a 1431 73 +4a35c a 333 127 +4a366 6 1431 73 +4a36c 6 1431 73 +4a372 4 1435 73 +4a376 12 1436 73 +FUNC 4a388 8c 0 google_breakpad::MinidumpThread::GetThreadID +4a388 6 1474 73 +4a38e 4 1476 73 +4a392 1a 1476 73 +4a3ac a 333 127 +4a3b6 6 1476 73 +4a3bc 4 1478 73 +4a3c0 4 1480 73 +4a3c4 1a 1481 73 +4a3de a 333 127 +4a3e8 8 1481 73 +4a3f0 4 1485 73 +4a3f4 20 1487 73 +FUNC 4a414 8c 0 google_breakpad::MinidumpException::GetThreadID +4a414 6 2930 73 +4a41a 4 2932 73 +4a41e 1a 2932 73 +4a438 a 333 127 +4a442 6 2932 73 +4a448 4 2934 73 +4a44c 4 2936 73 +4a450 1a 2937 73 +4a46a a 333 127 +4a474 6 2937 73 +4a47a 2 2938 73 +4a47c 4 2941 73 +4a480 20 2943 73 +FUNC 4a4a0 60 0 google_breakpad::MinidumpModule::code_file +4a4a0 2 1817 73 +4a4a2 2 1818 73 +4a4a4 2 1817 73 +4a4a6 2 1817 73 +4a4a8 2 1818 73 +4a4aa 1a 1819 73 +4a4c4 a 333 127 +4a4ce 6 1819 73 +4a4d4 e 1820 73 +4a4e2 8 1823 73 +4a4ea 16 1824 73 +FUNC 4a508 b4 0 google_breakpad::RangeMap::RetrieveRange +4a508 4 118 75 +4a50c a 118 75 +4a516 4 121 75 +4a51a 18 121 75 +4a532 a 333 127 +4a53c 6 121 75 +4a542 4 568 141 +4a546 2 571 141 +4a548 e 572 141 +4a556 6 575 141 +4a55c 2 573 141 +4a55e 6 575 141 +4a564 4 125 75 +4a568 12 133 75 +4a57a 4 136 75 +4a57e 2 137 75 +4a580 4 107 76 +4a584 4 138 75 +4a588 a 139 75 +4a592 14 140 75 +4a5a6 2 142 75 +4a5a8 14 143 75 +FUNC 4a5bc 19c 0 google_breakpad::MinidumpContext::CheckAgainstSystemInfo +4a5bc c 1106 73 +4a5c8 2 1109 73 +4a5ca 4 1106 73 +4a5ce 2 1106 73 +4a5d0 2 1109 73 +4a5d2 2 1106 73 +4a5d4 6 1109 73 +4a5da 4 1110 73 +4a5de 1a 1112 73 +4a5f8 a 333 127 +4a602 6 1112 73 +4a608 4 1113 73 +4a60c 4 675 65 +4a610 4 1130 73 +4a614 2 1125 73 +4a616 26 1130 73 +4a63c 6 1155 73 +4a642 c 1130 73 +4a64e 6 1165 73 +4a654 2 1132 73 +4a656 a 1133 73 +4a660 4 1140 73 +4a664 6 1145 73 +4a66a 4 1150 73 +4a66e 4 1160 73 +4a672 4 1165 73 +4a676 4 1170 73 +4a67a 10 1181 73 +4a68a 1c 1120 73 +4a6a6 a 333 127 +4a6b0 6 1120 73 +4a6b6 2 1121 73 +4a6b8 1c 1175 73 +4a6d4 4 110 72 +4a6d8 4 333 127 +4a6dc 2 1176 73 +4a6de 6 333 127 +4a6e4 8 1176 73 +4a6ec a 1176 73 +4a6f6 2 333 127 +4a6f8 2 1178 73 +4a6fa 6 333 127 +4a700 8 1178 73 +4a708 8 1178 73 +4a710 c 156 137 +4a71c 6 1175 73 +4a722 4 1175 73 +4a726 32 1181 73 +FUNC 4a758 d8 0 google_breakpad::MinidumpModuleList::GetModuleForAddress +4a758 6 2571 73 +4a75e 6 2571 73 +4a764 2 2572 73 +4a766 c 2571 73 +4a772 2 2572 73 +4a774 1a 2573 73 +4a78e c 333 127 +4a79a 12 2578 73 +4a7ac 1a 2579 73 +4a7c6 4 110 72 +4a7ca 2 333 127 +4a7cc 2 2580 73 +4a7ce 8 333 127 +4a7d6 a 2580 73 +4a7e0 8 2580 73 +4a7e8 6 156 137 +4a7ee 6 2579 73 +4a7f4 4 2581 73 +4a7f8 a 2584 73 +4a802 2e 2585 73 +FUNC 4a844 b0 0 google_breakpad::MinidumpThreadList::GetThreadAtIndex +4a844 2 1652 73 +4a846 2 1653 73 +4a848 2 1652 73 +4a84a 4 1652 73 +4a84e 2 1653 73 +4a850 1a 1654 73 +4a86a a 333 127 +4a874 4 1654 73 +4a878 6 1658 73 +4a87e 1a 1659 73 +4a898 2 110 72 +4a89a a 333 127 +4a8a4 a 254 126 +4a8ae 8 333 127 +4a8b6 8 254 126 +4a8be 6 1659 73 +4a8c4 6 1659 73 +4a8ca 8 202 144 +4a8d2 22 1665 73 +FUNC 4a8f4 b0 0 google_breakpad::MinidumpModuleList::GetModuleAtIndex +4a8f4 2 2624 73 +4a8f6 2 2625 73 +4a8f8 2 2624 73 +4a8fa 4 2624 73 +4a8fe 2 2625 73 +4a900 1a 2626 73 +4a91a a 333 127 +4a924 4 2626 73 +4a928 6 2630 73 +4a92e 1a 2631 73 +4a948 2 110 72 +4a94a a 333 127 +4a954 a 254 126 +4a95e 8 333 127 +4a966 8 254 126 +4a96e 6 2631 73 +4a974 6 2631 73 +4a97a 8 202 144 +4a982 22 2637 73 +FUNC 4a9b8 b0 0 google_breakpad::MinidumpMemoryList::GetMemoryRegionAtIndex +4a9b8 2 2805 73 +4a9ba 2 2806 73 +4a9bc 2 2805 73 +4a9be 4 2805 73 +4a9c2 2 2806 73 +4a9c4 1a 2807 73 +4a9de a 333 127 +4a9e8 4 2807 73 +4a9ec 6 2811 73 +4a9f2 1a 2812 73 +4aa0c 2 110 72 +4aa0e a 333 127 +4aa18 a 254 126 +4aa22 8 333 127 +4aa2a 8 254 126 +4aa32 6 2812 73 +4aa38 6 2812 73 +4aa3e 8 202 144 +4aa46 22 2818 73 +FUNC 4aa68 d8 0 google_breakpad::MinidumpMemoryList::GetMemoryRegionForAddress +4aa68 6 2822 73 +4aa6e 6 2822 73 +4aa74 2 2823 73 +4aa76 c 2822 73 +4aa82 2 2823 73 +4aa84 1a 2824 73 +4aa9e c 333 127 +4aaaa 12 2829 73 +4aabc 1a 2830 73 +4aad6 4 110 72 +4aada 2 333 127 +4aadc 2 2831 73 +4aade 8 333 127 +4aae6 a 2831 73 +4aaf0 8 2831 73 +4aaf8 6 156 137 +4aafe 6 2830 73 +4ab04 4 2832 73 +4ab08 8 2835 73 +4ab10 30 2836 73 +FUNC 4ab40 16c 0 google_breakpad::MinidumpModuleList::GetModuleAtSequence +4ab40 6 2601 73 +4ab46 2 2602 73 +4ab48 4 2601 73 +4ab4c 4 2601 73 +4ab50 2 2602 73 +4ab52 1c 2603 73 +4ab6e a 333 127 +4ab78 4 2603 73 +4ab7c 6 2607 73 +4ab82 1c 2608 73 +4ab9e 2 110 72 +4aba0 a 333 127 +4abaa a 254 126 +4abb4 8 333 127 +4abbc 8 254 126 +4abc4 6 2608 73 +4abca 4 2610 73 +4abce 4 2614 73 +4abd2 8 184 75 +4abda 1a 185 75 +4abf4 2 110 72 +4abf6 a 333 127 +4ac00 a 240 126 +4ac0a 8 333 127 +4ac12 a 240 126 +4ac1c 8 185 75 +4ac24 4 142 141 +4ac28 4 192 75 +4ac2c 4 192 75 +4ac30 4 177 141 +4ac34 8 192 75 +4ac3c 2 2614 73 +4ac3e 1c 2615 73 +4ac5a 2 110 72 +4ac5c a 333 127 +4ac66 6 254 126 +4ac6c 8 2619 73 +4ac74 38 2620 73 +FUNC 4acc0 29c 0 google_breakpad::UTF16ToUTF8 +4acc0 a 234 73 +4acca e 234 73 +4acd8 2 235 73 +4acda 2 234 73 +4acdc 6 235 73 +4ace2 8 235 73 +4acea 8 192 144 +4acf2 2 159 135 +4acf4 4 92 57 +4acf8 2 159 135 +4acfa a 600 135 +4ad04 a 400 136 +4ad0e 2 72 137 +4ad10 4 162 135 +4ad14 4 72 137 +4ad18 4 72 137 +4ad1c 4 163 135 +4ad20 6 166 135 +4ad26 a 248 73 +4ad30 a 242 73 +4ad3a 6 246 73 +4ad40 4 247 73 +4ad44 6 248 73 +4ad4a e 252 73 +4ad58 1a 253 73 +4ad72 2 110 72 +4ad74 6 333 127 +4ad7a 2 254 73 +4ad7c 4 333 127 +4ad80 a 254 73 +4ad8a 8 254 73 +4ad92 6 333 127 +4ad98 c 256 73 +4ada4 4 259 73 +4ada8 4 258 73 +4adac 2 259 73 +4adae 2 258 73 +4adb0 2 259 73 +4adb2 4 258 73 +4adb6 2 259 73 +4adb8 1c 260 73 +4add4 2 110 72 +4add6 6 333 127 +4addc 2 261 73 +4adde 4 333 127 +4ade2 a 261 73 +4adec 8 261 73 +4adf4 a 333 127 +4adfe 2 265 73 +4ae00 8 266 73 +4ae08 4 265 73 +4ae0c 2 266 73 +4ae0e 1c 267 73 +4ae2a 2 110 72 +4ae2c 6 333 127 +4ae32 2 268 73 +4ae34 4 333 127 +4ae38 8 268 73 +4ae40 a 268 73 +4ae4a 2 333 127 +4ae4c 2 269 73 +4ae4e 6 333 127 +4ae54 a 269 73 +4ae5e 8 269 73 +4ae66 c 156 137 +4ae72 6 267 73 +4ae78 4 255 73 +4ae7c a 272 73 +4ae86 2 281 73 +4ae88 2 276 73 +4ae8a 2 281 73 +4ae8c 6 453 136 +4ae92 6 283 73 +4ae98 4 284 73 +4ae9c a 453 136 +4aea6 4 285 73 +4aeaa 8 453 136 +4aeb2 12 286 73 +4aec4 4 287 73 +4aec8 6 453 136 +4aece 4 291 73 +4aed2 a 453 136 +4aedc 4 292 73 +4aee0 a 453 136 +4aeea 4 293 73 +4aeee 14 453 136 +4af02 4 242 73 +4af06 2 144 57 +4af08 2 143 57 +4af0a 2 144 57 +4af0c 6 302 73 +4af12 4a 303 73 +FUNC 4af5c 1dc 0 google_breakpad::MinidumpModule::code_identifier +4af5c e 1827 73 +4af6a 6 1827 73 +4af70 2 1828 73 +4af72 6 1827 73 +4af78 2 1828 73 +4af7a 1a 1829 73 +4af94 a 333 127 +4af9e 6 1829 73 +4afa4 8 1830 73 +4afac 4 1833 73 +4afb0 6 1834 73 +4afb6 8 1836 73 +4afbe 4 1837 73 +4afc2 1a 1839 73 +4afdc a 333 127 +4afe6 6 1839 73 +4afec 8 1840 73 +4aff4 6 675 65 +4affa a 1849 73 +4b004 18 1851 73 +4b01c 18 1858 73 +4b034 6 1859 73 +4b03a a 1851 73 +4b044 a 1873 73 +4b04e 2 1874 73 +4b050 1a 1881 73 +4b06a 4 110 72 +4b06e 2 333 127 +4b070 2 1881 73 +4b072 8 333 127 +4b07a a 1881 73 +4b084 8 1881 73 +4b08c 6 156 137 +4b092 6 1881 73 +4b098 8 1886 73 +4b0a0 8 156 137 +4b0a8 1a 1845 73 +4b0c2 a 333 127 +4b0cc 6 1845 73 +4b0d2 c 1846 73 +4b0de 5a 1887 73 +FUNC 4b140 170 0 google_breakpad::MinidumpModule::debug_identifier +4b140 e 1970 73 +4b14e 2 1970 73 +4b150 2 1971 73 +4b152 8 1970 73 +4b15a 2 1971 73 +4b15c 18 1972 73 +4b174 a 333 127 +4b17e 6 1972 73 +4b184 8 1973 73 +4b18c 4 1976 73 +4b190 c 1977 73 +4b19c c 1979 73 +4b1a8 8 1982 73 +4b1b0 c 1983 73 +4b1bc 3e 2005 73 +4b1fa 8 2007 73 +4b202 14 2017 73 +4b216 8 2018 73 +4b21e 8 2033 73 +4b226 18 2033 73 +4b23e 2 110 72 +4b240 a 333 127 +4b24a a 2033 73 +4b254 6 2033 73 +4b25a 8 2035 73 +4b262 6 156 137 +4b268 48 2036 73 +FUNC 4b2b8 11c 0 google_breakpad::MinidumpModule::version +4b2b8 e 2039 73 +4b2c6 2 2039 73 +4b2c8 2 2040 73 +4b2ca 8 2039 73 +4b2d2 2 2040 73 +4b2d4 18 2041 73 +4b2ec a 333 127 +4b2f6 6 2041 73 +4b2fc e 2042 73 +4b30a c 2045 73 +4b316 8 2047 73 +4b31e 2 2048 73 +4b320 4 2047 73 +4b324 20 2054 73 +4b344 8 2055 73 +4b34c 8 2065 73 +4b354 18 2065 73 +4b36c 2 110 72 +4b36e a 333 127 +4b378 a 2065 73 +4b382 6 2065 73 +4b388 8 2067 73 +4b390 6 156 137 +4b396 3e 2068 73 +FUNC 4b3dc 1b4 0 google_breakpad::MinidumpModule::debug_file +4b3dc e 1890 73 +4b3ea 2 1890 73 +4b3ec 2 1891 73 +4b3ee 8 1890 73 +4b3f6 2 1891 73 +4b3f8 18 1892 73 +4b410 a 333 127 +4b41a 6 1892 73 +4b420 8 1893 73 +4b428 4 1896 73 +4b42c c 1897 73 +4b438 a 1899 73 +4b442 6 1901 73 +4b448 a 1902 73 +4b452 8 1909 73 +4b45a 6 1910 73 +4b460 a 1917 73 +4b46a 8 1924 73 +4b472 e 1926 73 +4b480 6 1929 73 +4b486 2 112 137 +4b488 8 225 136 +4b490 2 112 137 +4b492 2 481 106 +4b494 4 225 136 +4b498 a 349 136 +4b4a2 8 156 137 +4b4aa 4 1943 73 +4b4ae 6 1944 73 +4b4b4 4 1949 73 +4b4b8 4 1945 73 +4b4bc 4 1949 73 +4b4c0 c 116 148 +4b4cc 6 1950 73 +4b4d2 c 1951 73 +4b4de 8 1955 73 +4b4e6 2 348 136 +4b4e8 2 1955 73 +4b4ea 2 92 57 +4b4ec 2 348 136 +4b4ee a 349 136 +4b4f8 6 1955 73 +4b4fe 6 304 144 +4b504 8 1964 73 +4b50c 18 1964 73 +4b524 2 110 72 +4b526 a 333 127 +4b530 a 1964 73 +4b53a 6 1964 73 +4b540 8 1966 73 +4b548 6 156 137 +4b54e 42 1967 73 +FUNC 4b598 20 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_erase +4b598 6 655 140 +4b59e 2 657 140 +4b5a0 8 658 140 +4b5a8 2 659 140 +4b5aa c 161 106 +4b5b6 2 664 140 +FUNC 4b5b8 34 0 google_breakpad::MinidumpThreadList::~MinidumpThreadList +4b5b8 2 1548 73 +4b5ba 2 1548 73 +4b5bc 2 1549 73 +4b5be 8 1548 73 +4b5c6 2 1549 73 +4b5c8 6 42 148 +4b5ce 6 1549 73 +4b5d4 4 531 141 +4b5d8 a 532 141 +4b5e2 a 1550 73 +FUNC 4b5ec 12 0 google_breakpad::MinidumpThreadList::~MinidumpThreadList +4b5ec 2 1548 73 +4b5ee 2 1548 73 +4b5f0 4 1550 73 +4b5f4 6 1550 73 +4b5fa 4 1550 73 +FUNC 4b5fe 20 0 std::priv::_Rb_tree, std::pair::Range>, std::priv::_Select1st::Range> >, std::priv::_MapTraitsT::Range> >, std::allocator::Range> > >::_M_erase +4b5fe 6 655 140 +4b604 2 657 140 +4b606 8 658 140 +4b60e 2 659 140 +4b610 c 161 106 +4b61c 2 664 140 +FUNC 4b61e 1a 0 std::priv::_Rb_tree, std::pair::Range>, std::priv::_Select1st::Range> >, std::priv::_MapTraitsT::Range> >, std::allocator::Range> > >::clear +4b61e 2 531 141 +4b620 2 530 141 +4b622 2 530 141 +4b624 2 531 141 +4b626 6 532 141 +4b62c 2 534 141 +4b62e 2 533 141 +4b630 2 534 141 +4b632 2 535 141 +4b634 4 536 141 +FUNC 4b638 3c 0 google_breakpad::MinidumpModuleList::~MinidumpModuleList +4b638 2 2439 73 +4b63a 2 2439 73 +4b63c 2 2440 73 +4b63e e 2439 73 +4b64c 2 2440 73 +4b64e 6 414 141 +4b654 6 2440 73 +4b65a 4 2441 73 +4b65e 6 42 148 +4b664 6 2441 73 +4b66a a 2442 73 +FUNC 4b67c 12 0 google_breakpad::MinidumpModuleList::~MinidumpModuleList +4b67c 2 2439 73 +4b67e 2 2439 73 +4b680 4 2442 73 +4b684 6 2442 73 +4b68a 4 2442 73 +FUNC 4b698 44 0 google_breakpad::MinidumpMemoryList::~MinidumpMemoryList +4b698 2 2682 73 +4b69a 2 2682 73 +4b69c 2 2683 73 +4b69e 8 2682 73 +4b6a6 2 2683 73 +4b6a8 6 414 141 +4b6ae 6 2683 73 +4b6b4 4 2684 73 +4b6b8 6 42 148 +4b6be 6 2684 73 +4b6c4 4 2685 73 +4b6c8 6 42 148 +4b6ce 6 2685 73 +4b6d4 8 2686 73 +FUNC 4b6dc 12 0 google_breakpad::MinidumpMemoryList::~MinidumpMemoryList +4b6dc 2 2682 73 +4b6de 2 2682 73 +4b6e0 4 2686 73 +4b6e4 6 2686 73 +4b6ea 4 2686 73 +FUNC 4b6ee 28 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_erase +4b6ee 6 655 140 +4b6f4 2 657 140 +4b6f6 8 658 140 +4b6fe 2 659 140 +4b700 8 51 129 +4b708 c 161 106 +4b714 2 664 140 +FUNC 4b718 94 0 google_breakpad::Minidump::~Minidump +4b718 6 3992 73 +4b71e 6 3992 73 +4b724 2 3993 73 +4b726 2 3992 73 +4b728 2 3993 73 +4b72a 1a 3994 73 +4b744 a 333 127 +4b74e 6 3994 73 +4b754 8 3996 73 +4b75c 4 3997 73 +4b760 6 3997 73 +4b766 4 3999 73 +4b76a 6 42 148 +4b770 6 3999 73 +4b776 4 4000 73 +4b77a 4 531 141 +4b77e 8 532 141 +4b786 6 4000 73 +4b78c 8 156 137 +4b794 18 4001 73 +FUNC 4b7ac 12 0 google_breakpad::Minidump::~Minidump +4b7ac 2 3992 73 +4b7ae 2 3992 73 +4b7b0 4 4001 73 +4b7b4 6 4001 73 +4b7ba 4 4001 73 +FUNC 4b7be 40 0 std::_M_init_noskip > +4b7be 2 310 117 +4b7c0 2 310 117 +4b7c2 e 311 117 +4b7d0 2 312 117 +4b7d2 4 313 117 +4b7d6 c 315 117 +4b7e2 4 316 117 +4b7e6 6 319 117 +4b7ec 8 320 117 +4b7f4 2 174 115 +4b7f6 8 321 117 +FUNC 4b800 e4 0 google_breakpad::Minidump::SeekSet +4b800 a 4445 73 +4b80a 2 4448 73 +4b80c 4 4445 73 +4b810 8 4445 73 +4b818 2 4449 73 +4b81a 4 4448 73 +4b81e 4 207 117 +4b822 8 521 116 +4b82a 4 176 115 +4b82e 6 522 116 +4b834 4 522 116 +4b838 e 4452 73 +4b846 c 4453 73 +4b852 6 4454 73 +4b858 4 4455 73 +4b85c 4 4454 73 +4b860 12 4455 73 +4b872 2 110 72 +4b874 a 333 127 +4b87e a 240 126 +4b888 8 333 127 +4b890 8 4455 73 +4b898 6 4455 73 +4b89e a 156 137 +4b8a8 2 4458 73 +4b8aa c 4459 73 +4b8b6 14 147 134 +4b8ca 1a 4459 73 +FUNC 4b8e4 1e4 0 google_breakpad::Minidump::SeekToStreamType +4b8e4 8 4526 73 +4b8ec 6 4526 73 +4b8f2 6 4528 73 +4b8f8 1a 4528 73 +4b912 a 333 127 +4b91c 6 4528 73 +4b922 8 4530 73 +4b92a 6 4532 73 +4b930 1a 4533 73 +4b94a a 333 127 +4b954 6 4533 73 +4b95a 2 4534 73 +4b95c a 210 123 +4b966 2 168 141 +4b968 6 4538 73 +4b96e 1a 4540 73 +4b988 2 110 72 +4b98a a 333 127 +4b994 8 254 126 +4b99c 2 333 127 +4b99e 2 4541 73 +4b9a0 6 333 127 +4b9a6 6 4540 73 +4b9ac 2 4541 73 +4b9ae a 4544 73 +4b9b8 8 4545 73 +4b9c0 1c 4546 73 +4b9dc 2 110 72 +4b9de a 333 127 +4b9e8 a 254 126 +4b9f2 8 333 127 +4b9fa a 254 126 +4ba04 8 333 127 +4ba0c 8 254 126 +4ba14 6 4546 73 +4ba1a 4 4549 73 +4ba1e 6 202 144 +4ba24 2 4553 73 +4ba26 6 202 144 +4ba2c c 4553 73 +4ba38 1c 4554 73 +4ba54 2 110 72 +4ba56 a 333 127 +4ba60 8 254 126 +4ba68 6 4554 73 +4ba6e 2 4556 73 +4ba70 8 4559 73 +4ba78 6 4561 73 +4ba7e 4a 4562 73 +FUNC 4bac8 1f4 0 google_breakpad::Minidump::GetStream +4bac8 4 4566 73 +4bacc 2 4570 73 +4bace 4 4566 73 +4bad2 4 4566 73 +4bad6 2 4570 73 +4bad8 4 4572 73 +4badc 1c 4572 73 +4baf8 4 110 72 +4bafc a 333 127 +4bb06 8 254 126 +4bb0e 8 333 127 +4bb16 6 4572 73 +4bb1c 4 4575 73 +4bb20 6 4577 73 +4bb26 1c 4578 73 +4bb42 2 110 72 +4bb44 a 333 127 +4bb4e 8 254 126 +4bb56 6 4578 73 +4bb5c 4 4579 73 +4bb60 c 210 123 +4bb6c 4 197 141 +4bb70 8 4583 73 +4bb78 1c 4585 73 +4bb94 2 110 72 +4bb96 a 333 127 +4bba0 8 254 126 +4bba8 a 333 127 +4bbb2 a 4592 73 +4bbbc 4 4595 73 +4bbc0 4 4596 73 +4bbc4 e 4600 73 +4bbd2 1c 4601 73 +4bbee 2 110 72 +4bbf0 a 333 127 +4bbfa 8 254 126 +4bc02 6 4601 73 +4bc08 2 4602 73 +4bc0a 8 4605 73 +4bc12 6 4605 73 +4bc18 2 4607 73 +4bc1a 2 92 57 +4bc1c 8 4607 73 +4bc24 4 4607 73 +4bc28 1c 4608 73 +4bc44 2 110 72 +4bc46 a 333 127 +4bc50 8 254 126 +4bc58 6 4608 73 +4bc5e 2 4609 73 +4bc60 2 4612 73 +4bc62 4 4613 73 +4bc66 2 4614 73 +4bc68 4 144 57 +4bc6c 4 98 57 +4bc70 6 98 57 +4bc76 46 4615 73 +FUNC 4bcbc e 0 google_breakpad::Minidump::GetException +4bcbc 2 4249 73 +4bcbe 6 4251 73 +4bcc4 6 4252 73 +FUNC 4bccc 1f4 0 google_breakpad::Minidump::GetStream +4bccc 4 4566 73 +4bcd0 2 4570 73 +4bcd2 4 4566 73 +4bcd6 4 4566 73 +4bcda 2 4570 73 +4bcdc 4 4572 73 +4bce0 1c 4572 73 +4bcfc 4 110 72 +4bd00 a 333 127 +4bd0a 8 254 126 +4bd12 8 333 127 +4bd1a 6 4572 73 +4bd20 4 4575 73 +4bd24 6 4577 73 +4bd2a 1c 4578 73 +4bd46 2 110 72 +4bd48 a 333 127 +4bd52 8 254 126 +4bd5a 6 4578 73 +4bd60 4 4579 73 +4bd64 c 210 123 +4bd70 4 197 141 +4bd74 8 4583 73 +4bd7c 1c 4585 73 +4bd98 2 110 72 +4bd9a a 333 127 +4bda4 8 254 126 +4bdac a 333 127 +4bdb6 a 4592 73 +4bdc0 4 4595 73 +4bdc4 4 4596 73 +4bdc8 e 4600 73 +4bdd6 1c 4601 73 +4bdf2 2 110 72 +4bdf4 a 333 127 +4bdfe 8 254 126 +4be06 6 4601 73 +4be0c 2 4602 73 +4be0e 8 4605 73 +4be16 6 4605 73 +4be1c 2 4607 73 +4be1e 2 92 57 +4be20 8 4607 73 +4be28 4 4607 73 +4be2c 1c 4608 73 +4be48 2 110 72 +4be4a a 333 127 +4be54 8 254 126 +4be5c 6 4608 73 +4be62 2 4609 73 +4be64 2 4612 73 +4be66 4 4613 73 +4be6a 2 4614 73 +4be6c 4 144 57 +4be70 4 98 57 +4be74 6 98 57 +4be7a 46 4615 73 +FUNC 4bec0 e 0 google_breakpad::Minidump::GetSystemInfo +4bec0 2 4260 73 +4bec2 6 4262 73 +4bec8 6 4263 73 +FUNC 4bed0 1f4 0 google_breakpad::Minidump::GetStream +4bed0 4 4566 73 +4bed4 2 4570 73 +4bed6 4 4566 73 +4beda 4 4566 73 +4bede 2 4570 73 +4bee0 4 4572 73 +4bee4 1c 4572 73 +4bf00 4 110 72 +4bf04 a 333 127 +4bf0e 8 254 126 +4bf16 8 333 127 +4bf1e 6 4572 73 +4bf24 4 4575 73 +4bf28 6 4577 73 +4bf2e 1c 4578 73 +4bf4a 2 110 72 +4bf4c a 333 127 +4bf56 8 254 126 +4bf5e 6 4578 73 +4bf64 4 4579 73 +4bf68 c 210 123 +4bf74 4 197 141 +4bf78 8 4583 73 +4bf80 1c 4585 73 +4bf9c 2 110 72 +4bf9e a 333 127 +4bfa8 8 254 126 +4bfb0 a 333 127 +4bfba a 4592 73 +4bfc4 4 4595 73 +4bfc8 4 4596 73 +4bfcc e 4600 73 +4bfda 1c 4601 73 +4bff6 2 110 72 +4bff8 a 333 127 +4c002 8 254 126 +4c00a 6 4601 73 +4c010 2 4602 73 +4c012 8 4605 73 +4c01a 6 4605 73 +4c020 2 4607 73 +4c022 2 92 57 +4c024 8 4607 73 +4c02c 4 4607 73 +4c030 1c 4608 73 +4c04c 2 110 72 +4c04e a 333 127 +4c058 8 254 126 +4c060 6 4608 73 +4c066 2 4609 73 +4c068 2 4612 73 +4c06a 4 4613 73 +4c06e 2 4614 73 +4c070 4 144 57 +4c074 4 98 57 +4c078 6 98 57 +4c07e 46 4615 73 +FUNC 4c0c4 e 0 google_breakpad::Minidump::GetThreadList +4c0c4 2 4231 73 +4c0c6 6 4233 73 +4c0cc 6 4234 73 +FUNC 4c0d4 1f4 0 google_breakpad::Minidump::GetStream +4c0d4 4 4566 73 +4c0d8 2 4570 73 +4c0da 4 4566 73 +4c0de 4 4566 73 +4c0e2 2 4570 73 +4c0e4 4 4572 73 +4c0e8 1c 4572 73 +4c104 4 110 72 +4c108 a 333 127 +4c112 8 254 126 +4c11a 8 333 127 +4c122 6 4572 73 +4c128 4 4575 73 +4c12c 6 4577 73 +4c132 1c 4578 73 +4c14e 2 110 72 +4c150 a 333 127 +4c15a 8 254 126 +4c162 6 4578 73 +4c168 4 4579 73 +4c16c c 210 123 +4c178 4 197 141 +4c17c 8 4583 73 +4c184 1c 4585 73 +4c1a0 2 110 72 +4c1a2 a 333 127 +4c1ac 8 254 126 +4c1b4 a 333 127 +4c1be a 4592 73 +4c1c8 4 4595 73 +4c1cc 4 4596 73 +4c1d0 e 4600 73 +4c1de 1c 4601 73 +4c1fa 2 110 72 +4c1fc a 333 127 +4c206 8 254 126 +4c20e 6 4601 73 +4c214 2 4602 73 +4c216 8 4605 73 +4c21e 6 4605 73 +4c224 2 4607 73 +4c226 2 92 57 +4c228 8 4607 73 +4c230 4 4607 73 +4c234 1c 4608 73 +4c250 2 110 72 +4c252 a 333 127 +4c25c 8 254 126 +4c264 6 4608 73 +4c26a 2 4609 73 +4c26c 2 4612 73 +4c26e 4 4613 73 +4c272 2 4614 73 +4c274 4 144 57 +4c278 4 98 57 +4c27c 6 98 57 +4c282 46 4615 73 +FUNC 4c2c8 e 0 google_breakpad::Minidump::GetModuleList +4c2c8 2 4237 73 +4c2ca 6 4239 73 +4c2d0 6 4240 73 +FUNC 4c2d8 1f4 0 google_breakpad::Minidump::GetStream +4c2d8 4 4566 73 +4c2dc 2 4570 73 +4c2de 4 4566 73 +4c2e2 4 4566 73 +4c2e6 2 4570 73 +4c2e8 4 4572 73 +4c2ec 1c 4572 73 +4c308 4 110 72 +4c30c a 333 127 +4c316 8 254 126 +4c31e 8 333 127 +4c326 6 4572 73 +4c32c 4 4575 73 +4c330 6 4577 73 +4c336 1c 4578 73 +4c352 2 110 72 +4c354 a 333 127 +4c35e 8 254 126 +4c366 6 4578 73 +4c36c 4 4579 73 +4c370 c 210 123 +4c37c 4 197 141 +4c380 8 4583 73 +4c388 1c 4585 73 +4c3a4 2 110 72 +4c3a6 a 333 127 +4c3b0 8 254 126 +4c3b8 a 333 127 +4c3c2 a 4592 73 +4c3cc 4 4595 73 +4c3d0 4 4596 73 +4c3d4 e 4600 73 +4c3e2 1c 4601 73 +4c3fe 2 110 72 +4c400 a 333 127 +4c40a 8 254 126 +4c412 6 4601 73 +4c418 2 4602 73 +4c41a 8 4605 73 +4c422 6 4605 73 +4c428 2 4607 73 +4c42a 2 92 57 +4c42c 8 4607 73 +4c434 4 4607 73 +4c438 1c 4608 73 +4c454 2 110 72 +4c456 a 333 127 +4c460 8 254 126 +4c468 6 4608 73 +4c46e 2 4609 73 +4c470 2 4612 73 +4c472 4 4613 73 +4c476 2 4614 73 +4c478 4 144 57 +4c47c 4 98 57 +4c480 6 98 57 +4c486 46 4615 73 +FUNC 4c4cc e 0 google_breakpad::Minidump::GetMemoryList +4c4cc 2 4243 73 +4c4ce 6 4245 73 +4c4d4 6 4246 73 +FUNC 4c4dc 284 0 google_breakpad::Minidump::Open +4c4dc c 4004 73 +4c4e8 2 4005 73 +4c4ea 4 4004 73 +4c4ee c 4004 73 +4c4fa 2 4005 73 +4c4fc 1a 4006 73 +4c516 2 110 72 +4c518 a 333 127 +4c522 8 4006 73 +4c52a 6 4006 73 +4c530 c 4010 73 +4c53c a 4013 73 +4c546 a 92 113 +4c550 2 87 117 +4c552 2 88 117 +4c554 6 87 117 +4c55a 2 87 117 +4c55c c 92 113 +4c568 2 87 117 +4c56a 6 87 117 +4c570 6 88 117 +4c576 2 464 110 +4c578 2 34 133 +4c57a 6 464 110 +4c580 c 464 110 +4c58c 2 34 133 +4c58e 2 464 110 +4c590 18 34 133 +4c5a8 c 61 109 +4c5b4 6 61 109 +4c5ba 3a 61 109 +4c5f4 2 63 109 +4c5f6 4 61 109 +4c5fa 4 63 109 +4c5fe e 347 122 +4c60c c 736 109 +4c618 2 746 109 +4c61a 4 747 109 +4c61e 8 748 109 +4c626 6 63 109 +4c62c 8 465 110 +4c634 e 169 110 +4c642 4 4013 73 +4c646 e 4014 73 +4c654 a 4015 73 +4c65e 6 4016 73 +4c664 6 4017 73 +4c66a 2 4016 73 +4c66c 14 4017 73 +4c680 2 110 72 +4c682 a 333 127 +4c68c a 4017 73 +4c696 8 333 127 +4c69e a 240 126 +4c6a8 8 333 127 +4c6b0 8 4018 73 +4c6b8 6 4017 73 +4c6be 6 156 137 +4c6c4 2 4019 73 +4c6c6 e 4024 73 +4c6d4 a 467 110 +4c6de 18 4022 73 +4c6f6 2 110 72 +4c6f8 a 333 127 +4c702 8 4022 73 +4c70a 6 4022 73 +4c710 4 4023 73 +4c714 4c 4024 73 +FUNC 4c760 48 0 google_breakpad::Minidump::Tell +4c760 2 4461 73 +4c762 6 4462 73 +4c768 4 4462 73 +4c76c 6 207 117 +4c772 a 497 116 +4c77c 2 499 116 +4c77e 2 176 115 +4c780 6 499 116 +4c786 10 147 134 +4c796 8 89 145 +4c79e 2 4470 73 +4c7a0 4 4463 73 +4c7a4 4 4475 73 +FUNC 4c7a8 bc 0 google_breakpad::Minidump::GetContextCPUFlagsFromSystemInfo +4c7a8 2 4026 73 +4c7aa 4 4028 73 +4c7ae 4 4026 73 +4c7b2 4 4031 73 +4c7b6 2 4032 73 +4c7b8 2 4031 73 +4c7ba 2 4032 73 +4c7bc c 4039 73 +4c7c8 2 4039 73 +4c7ca 6 4039 73 +4c7d0 6 675 65 +4c7d6 14 4042 73 +4c7ea 6 4044 73 +4c7f0 6 4042 73 +4c7f6 4 4059 73 +4c7fa 1c 4042 73 +4c816 6 4056 73 +4c81c 6 4047 73 +4c822 6 4050 73 +4c828 6 4053 73 +4c82e 6 4062 73 +4c834 6 4065 73 +4c83a 6 4068 73 +4c840 2 4074 73 +4c842 2 4075 73 +4c844 6 4077 73 +4c84a 6 4083 73 +4c850 4 4089 73 +4c854 4 4095 73 +4c858 4 4096 73 +4c85c 4 4095 73 +4c860 4 4096 73 +FUNC 4c864 116 0 std::basic_istream >::read +4c864 6 783 116 +4c86a 6 783 116 +4c870 4 207 117 +4c874 6 785 116 +4c87a 2 787 116 +4c87c 6 787 116 +4c882 2 175 115 +4c884 6 787 116 +4c88a c 802 116 +4c896 8 804 116 +4c89e 2 175 115 +4c8a0 4 804 116 +4c8a4 a 805 116 +4c8ae 8 789 116 +4c8b6 2 642 116 +4c8b8 2 640 116 +4c8ba 6 641 116 +4c8c0 4 645 116 +4c8c4 6 645 116 +4c8ca 4 703 116 +4c8ce e 704 116 +4c8dc 4 640 116 +4c8e0 16 799 116 +4c8f6 4 796 116 +4c8fa 4 652 116 +4c8fe 8 655 116 +4c906 6 172 145 +4c90c 8 172 145 +4c914 2 91 134 +4c916 2 658 116 +4c918 2 91 134 +4c91a 2 671 116 +4c91c 2 657 116 +4c91e 2 91 134 +4c920 2 671 116 +4c922 6 235 134 +4c928 2 234 134 +4c92a 6 235 134 +4c930 14 690 116 +4c944 6 682 116 +4c94a 6 700 116 +4c950 22 714 116 +4c972 8 808 116 +FUNC 4c97c 114 0 google_breakpad::Minidump::ReadBytes +4c97c 10 4413 73 +4c98c 2 4416 73 +4c98e 2 4413 73 +4c990 4 4413 73 +4c994 4 4416 73 +4c998 8 4419 73 +4c9a0 4 4421 73 +4c9a4 c 4422 73 +4c9b0 6 4423 73 +4c9b6 2 4424 73 +4c9b8 2 4423 73 +4c9ba 18 4424 73 +4c9d2 2 110 72 +4c9d4 a 333 127 +4c9de a 240 126 +4c9e8 8 333 127 +4c9f0 8 4424 73 +4c9f8 6 4424 73 +4c9fe 8 156 137 +4ca06 4 4436 73 +4ca0a 1c 4437 73 +4ca26 2 110 72 +4ca28 a 333 127 +4ca32 a 254 126 +4ca3c 8 333 127 +4ca44 8 254 126 +4ca4c 6 4437 73 +4ca52 4 4438 73 +4ca56 2 4441 73 +4ca58 38 4442 73 +FUNC 4ca90 11a8 0 google_breakpad::MinidumpContext::Read +4ca90 4 423 73 +4ca94 4 424 73 +4ca98 10 423 73 +4caa8 2 423 73 +4caaa 4 424 73 +4caae 4 423 73 +4cab2 4 443 73 +4cab6 a 448 73 +4cac0 24 449 73 +4cae4 c 333 127 +4caf0 6 449 73 +4caf6 10 451 73 +4cb06 a 453 73 +4cb10 2 452 73 +4cb12 1a 454 73 +4cb2c a 333 127 +4cb36 6 458 73 +4cb3c 6 958 65 +4cb42 2 458 73 +4cb44 8 459 73 +4cb4c 8 461 73 +4cb54 2 462 73 +4cb56 a 463 73 +4cb60 a 464 73 +4cb6a 1e 466 73 +4cb88 a 333 127 +4cb92 8 471 73 +4cb9a 1e 474 73 +4cbb8 a 333 127 +4cbc2 8 480 73 +4cbca 1e 481 73 +4cbe8 c 333 127 +4cbf4 a 481 73 +4cbfe 6 480 73 +4cc04 4 155 73 +4cc08 4 156 73 +4cc0c 4 157 73 +4cc10 8 156 73 +4cc18 4 487 73 +4cc1c 6 492 73 +4cc22 a 958 65 +4cc2c 6 492 73 +4cc32 6 493 73 +4cc38 8 494 73 +4cc40 8 495 73 +4cc48 8 496 73 +4cc50 8 497 73 +4cc58 8 498 73 +4cc60 8 500 73 +4cc68 8 501 73 +4cc70 8 502 73 +4cc78 8 503 73 +4cc80 8 504 73 +4cc88 8 505 73 +4cc90 8 506 73 +4cc98 8 507 73 +4cca0 8 508 73 +4cca8 8 509 73 +4ccb0 8 510 73 +4ccb8 8 511 73 +4ccc0 8 512 73 +4ccc8 8 513 73 +4ccd0 8 514 73 +4ccd8 8 515 73 +4cce0 8 516 73 +4cce8 8 517 73 +4ccf0 8 518 73 +4ccf8 8 519 73 +4cd00 8 520 73 +4cd08 8 521 73 +4cd10 8 522 73 +4cd18 8 523 73 +4cd20 8 524 73 +4cd28 8 525 73 +4cd30 8 526 73 +4cd38 8 527 73 +4cd40 8 528 73 +4cd48 8 529 73 +4cd50 6 164 73 +4cd56 a 165 73 +4cd60 4 535 73 +4cd64 8 539 73 +4cd6c 6 540 73 +4cd72 8 541 73 +4cd7a 8 542 73 +4cd82 8 543 73 +4cd8a 8 544 73 +4cd92 8 547 73 +4cd9a a 549 73 +4cda4 8 550 73 +4cdac e 554 73 +4cdba 20 555 73 +4cdda a 333 127 +4cde4 6 558 73 +4cdea 6 958 65 +4cdf0 2 558 73 +4cdf2 6 559 73 +4cdf8 2 561 73 +4cdfa 4 562 73 +4cdfe 6 561 73 +4ce04 10 562 73 +4ce14 4 564 73 +4ce18 a 565 73 +4ce22 12 566 73 +4ce34 20 568 73 +4ce54 c 333 127 +4ce60 8 573 73 +4ce68 20 576 73 +4ce88 c 333 127 +4ce94 a 583 73 +4ce9e c 589 73 +4ceaa 2 588 73 +4ceac 20 590 73 +4cecc c 333 127 +4ced8 a 596 73 +4cee2 20 597 73 +4cf02 c 333 127 +4cf0e 6 600 73 +4cf14 8 958 65 +4cf1c 4 600 73 +4cf20 6 602 73 +4cf26 10 603 73 +4cf36 8 607 73 +4cf3e 4 604 73 +4cf42 6 609 73 +4cf48 8 610 73 +4cf50 8 611 73 +4cf58 8 612 73 +4cf60 10 613 73 +4cf70 8 617 73 +4cf78 4 614 73 +4cf7c 10 621 73 +4cf8c 6 164 73 +4cf92 a 165 73 +4cf9c 4 622 73 +4cfa0 a 164 73 +4cfaa 6 165 73 +4cfb0 8 630 73 +4cfb8 8 633 73 +4cfc0 14 637 73 +4cfd4 20 639 73 +4cff4 c 333 127 +4d000 a 643 73 +4d00a 8 644 73 +4d012 22 649 73 +4d034 c 333 127 +4d040 6 649 73 +4d046 c 651 73 +4d052 1c 652 73 +4d06e a 333 127 +4d078 6 655 73 +4d07e 6 958 65 +4d084 2 655 73 +4d086 6 656 73 +4d08c 14 658 73 +4d0a0 8 660 73 +4d0a8 2 661 73 +4d0aa a 662 73 +4d0b4 12 663 73 +4d0c6 20 665 73 +4d0e6 c 333 127 +4d0f2 8 670 73 +4d0fa 20 673 73 +4d11a c 333 127 +4d126 4 680 73 +4d12a 4 684 73 +4d12e 4 680 73 +4d132 c 686 73 +4d13e 2 685 73 +4d140 20 687 73 +4d160 c 333 127 +4d16c a 693 73 +4d176 20 694 73 +4d196 c 333 127 +4d1a2 6 698 73 +4d1a8 6 958 65 +4d1ae 8 718 73 +4d1b6 14 722 73 +4d1ca 20 724 73 +4d1ea c 333 127 +4d1f6 8 698 73 +4d1fe 8 703 73 +4d206 4 700 73 +4d20a 6 705 73 +4d210 8 706 73 +4d218 8 707 73 +4d220 a 708 73 +4d22a 10 156 73 +4d23a 2 164 73 +4d23c 8 157 73 +4d244 4 164 73 +4d248 2 708 73 +4d24a 8 165 73 +4d252 a 708 73 +4d25c 8 728 73 +4d264 a 98 57 +4d26e e 731 73 +4d27c 20 732 73 +4d29c a 333 127 +4d2a6 6 735 73 +4d2ac 6 958 65 +4d2b2 2 735 73 +4d2b4 6 736 73 +4d2ba 8 738 73 +4d2c2 2 739 73 +4d2c4 2 744 73 +4d2c6 c 746 73 +4d2d2 8 747 73 +4d2da 4 751 73 +4d2de a 752 73 +4d2e8 a 753 73 +4d2f2 20 755 73 +4d312 10 333 127 +4d322 32 764 73 +4d354 6 766 73 +4d35a 1e 767 73 +4d378 2 110 72 +4d37a c 333 127 +4d386 a 254 126 +4d390 a 333 127 +4d39a 8 254 126 +4d3a2 a 772 73 +4d3ac 2 777 73 +4d3ae 6 772 73 +4d3b4 2 777 73 +4d3b6 4 783 73 +4d3ba 4 777 73 +4d3be 8 783 73 +4d3c6 2 782 73 +4d3c8 1e 784 73 +4d3e6 a 333 127 +4d3f0 a 790 73 +4d3fa 1c 791 73 +4d416 8 333 127 +4d41e 6 795 73 +4d424 8 958 65 +4d42c 4 795 73 +4d430 6 797 73 +4d436 8 798 73 +4d43e 8 799 73 +4d446 8 800 73 +4d44e 8 801 73 +4d456 8 802 73 +4d45e 8 803 73 +4d466 8 804 73 +4d46e 8 805 73 +4d476 8 806 73 +4d47e 8 807 73 +4d486 8 808 73 +4d48e 8 809 73 +4d496 8 812 73 +4d49e 8 813 73 +4d4a6 8 814 73 +4d4ae 8 815 73 +4d4b6 8 816 73 +4d4be 8 817 73 +4d4c6 8 818 73 +4d4ce 8 819 73 +4d4d6 8 820 73 +4d4de 8 821 73 +4d4e6 8 822 73 +4d4ee 8 823 73 +4d4f6 8 824 73 +4d4fe 8 825 73 +4d506 8 826 73 +4d50e 8 827 73 +4d516 8 828 73 +4d51e a 833 73 +4d528 6 839 73 +4d52e 1c 840 73 +4d54a 2 110 72 +4d54c a 333 127 +4d556 a 254 126 +4d560 8 333 127 +4d568 8 254 126 +4d570 a 845 73 +4d57a 2 850 73 +4d57c 6 845 73 +4d582 2 850 73 +4d584 4 856 73 +4d588 4 850 73 +4d58c 8 856 73 +4d594 2 855 73 +4d596 1c 857 73 +4d5b2 8 333 127 +4d5ba a 863 73 +4d5c4 1c 864 73 +4d5e0 8 333 127 +4d5e8 6 876 73 +4d5ee 8 958 65 +4d5f6 4 876 73 +4d5fa 6 878 73 +4d600 10 879 73 +4d610 8 883 73 +4d618 4 880 73 +4d61c 6 885 73 +4d622 8 886 73 +4d62a 8 887 73 +4d632 8 888 73 +4d63a 8 889 73 +4d642 10 890 73 +4d652 8 894 73 +4d65a 4 891 73 +4d65e 10 898 73 +4d66e 6 164 73 +4d674 a 165 73 +4d67e 4 899 73 +4d682 a 164 73 +4d68c 6 165 73 +4d692 8 906 73 +4d69a a 909 73 +4d6a4 6 915 73 +4d6aa 1c 916 73 +4d6c6 2 110 72 +4d6c8 a 333 127 +4d6d2 a 254 126 +4d6dc 8 333 127 +4d6e4 8 254 126 +4d6ec 10 921 73 +4d6fc 4 926 73 +4d700 4 932 73 +4d704 4 926 73 +4d708 6 932 73 +4d70e 6 931 73 +4d714 1c 933 73 +4d730 fc 333 127 +4d82c a 939 73 +4d836 1c 940 73 +4d852 8 333 127 +4d85a 6 944 73 +4d860 6 958 65 +4d866 a 944 73 +4d870 8 949 73 +4d878 4 946 73 +4d87c 6 951 73 +4d882 8 952 73 +4d88a 8 953 73 +4d892 8 954 73 +4d89a 8 955 73 +4d8a2 10 956 73 +4d8b2 8 960 73 +4d8ba 4 957 73 +4d8be 6 962 73 +4d8c4 8 963 73 +4d8cc a 965 73 +4d8d6 6 971 73 +4d8dc 1c 972 73 +4d8f8 2 110 72 +4d8fa a 333 127 +4d904 a 254 126 +4d90e 8 333 127 +4d916 8 254 126 +4d91e 8 977 73 +4d926 2 982 73 +4d928 8 977 73 +4d930 2 982 73 +4d932 4 988 73 +4d936 4 982 73 +4d93a 8 988 73 +4d942 2 987 73 +4d944 1c 989 73 +4d960 8 333 127 +4d968 a 995 73 +4d972 1c 996 73 +4d98e a 333 127 +4d998 6 996 73 +4d99e 4 98 57 +4d9a2 6 1000 73 +4d9a8 6 958 65 +4d9ae a 1020 73 +4d9b8 8 1000 73 +4d9c0 8 1005 73 +4d9c8 4 1002 73 +4d9cc 6 1007 73 +4d9d2 10 1008 73 +4d9e2 8 1012 73 +4d9ea 8 1009 73 +4d9f2 8 1017 73 +4d9fa 6 1014 73 +4da00 6 1026 73 +4da06 1c 1027 73 +4da22 2 110 72 +4da24 a 333 127 +4da2e a 254 126 +4da38 8 333 127 +4da40 c 254 126 +4da4c 10 1034 73 +4da5c 4 1039 73 +4da60 4 1045 73 +4da64 4 1039 73 +4da68 6 1045 73 +4da6e 2 1044 73 +4da70 1c 1046 73 +4da8c 8 333 127 +4da94 a 1052 73 +4da9e 1c 1053 73 +4daba a 333 127 +4dac4 6 1053 73 +4daca 4 98 57 +4dace 6 1057 73 +4dad4 8 958 65 +4dadc c 1057 73 +4dae8 8 1062 73 +4daf0 4 1059 73 +4daf4 6 1064 73 +4dafa 10 1065 73 +4db0a 6 1069 73 +4db10 a 1070 73 +4db1a 4 1066 73 +4db1e 8 1072 73 +4db26 8 1073 73 +4db2e 8 1074 73 +4db36 8 1075 73 +4db3e 10 1076 73 +4db4e 8 1080 73 +4db56 4 1077 73 +4db5a 6 1082 73 +4db60 8 1083 73 +4db68 8 1085 73 +4db70 6 98 57 +4db76 a 1099 73 +4db80 6 98 57 +4db86 1c 1093 73 +4dba2 2 110 72 +4dba4 2 333 127 +4dba6 2 1094 73 +4dba8 8 333 127 +4dbb0 8 1094 73 +4dbb8 8 1094 73 +4dbc0 6 156 137 +4dbc6 6 1093 73 +4dbcc 4 733 73 +4dbd0 4 1102 73 +4dbd4 64 1104 73 +FUNC 4dc38 10c 0 google_breakpad::MinidumpThread::GetContext +4dc38 6 1448 73 +4dc3e 2 1449 73 +4dc40 4 1448 73 +4dc44 2 1448 73 +4dc46 2 1449 73 +4dc48 1c 1450 73 +4dc64 8 333 127 +4dc6c 6 1454 73 +4dc72 a 1455 73 +4dc7c 1c 1456 73 +4dc98 a 333 127 +4dca2 6 1456 73 +4dca8 2 1457 73 +4dcaa a 1460 73 +4dcb4 12 417 73 +4dcc6 2 92 57 +4dcc8 4 1462 73 +4dccc 4 92 57 +4dcd0 4 1462 73 +4dcd4 2 1462 73 +4dcd6 1c 1463 73 +4dcf2 a 333 127 +4dcfc 6 1463 73 +4dd02 8 1464 73 +4dd0a 2 143 57 +4dd0c 2 1467 73 +4dd0e 2 1467 73 +4dd10 2 144 57 +4dd12 4 1467 73 +4dd16 2 1470 73 +4dd18 2c 1471 73 +FUNC 4dd44 11c 0 google_breakpad::MinidumpException::GetContext +4dd44 6 2946 73 +4dd4a 2 2947 73 +4dd4c 4 2946 73 +4dd50 2 2946 73 +4dd52 2 2947 73 +4dd54 1c 2948 73 +4dd70 8 333 127 +4dd78 8 2952 73 +4dd80 c 2953 73 +4dd8c 1c 2954 73 +4dda8 a 333 127 +4ddb2 6 2954 73 +4ddb8 2 2955 73 +4ddba a 2958 73 +4ddc4 12 417 73 +4ddd6 2 92 57 +4ddd8 6 2962 73 +4ddde 4 92 57 +4dde2 4 2962 73 +4dde6 2 2962 73 +4dde8 1c 2963 73 +4de04 a 333 127 +4de0e 6 2963 73 +4de14 8 2964 73 +4de1c 2 143 57 +4de1e 2 2967 73 +4de20 4 2967 73 +4de24 2 144 57 +4de26 4 2967 73 +4de2a 4 2970 73 +4de2e 32 2971 73 +FUNC 4de60 1c4 0 google_breakpad::MinidumpThread::Read +4de60 10 1386 73 +4de70 2 1388 73 +4de72 2 1386 73 +4de74 2 1386 73 +4de76 2 1388 73 +4de78 6 1388 73 +4de7e 2 1389 73 +4de80 2 1390 73 +4de82 2 1389 73 +4de84 2 1390 73 +4de86 6 1390 73 +4de8c 2 1391 73 +4de8e 4 1395 73 +4de92 2 1391 73 +4de94 2 1393 73 +4de96 e 1395 73 +4dea4 1c 1396 73 +4dec0 a 333 127 +4deca 6 1396 73 +4ded0 2 1397 73 +4ded2 6 1400 73 +4ded8 6 958 65 +4dede 2 1400 73 +4dee0 6 1401 73 +4dee6 8 1402 73 +4deee 8 1403 73 +4def6 8 1404 73 +4defe 8 1405 73 +4df06 8 189 73 +4df0e 8 190 73 +4df16 8 1407 73 +4df1e 4 1412 73 +4df22 2 1412 73 +4df24 2 1411 73 +4df26 a 1413 73 +4df30 8 1412 73 +4df38 1c 1416 73 +4df54 4 110 72 +4df58 6 333 127 +4df5e 4 1417 73 +4df62 4 333 127 +4df66 a 1417 73 +4df70 a 1417 73 +4df7a 2 333 127 +4df7c 4 1418 73 +4df80 6 333 127 +4df86 8 1418 73 +4df8e a 1418 73 +4df98 2 333 127 +4df9a 4 1419 73 +4df9e 6 333 127 +4dfa4 8 1419 73 +4dfac 8 1419 73 +4dfb4 12 156 137 +4dfc6 6 1416 73 +4dfcc 4 1425 73 +4dfd0 e 1427 73 +4dfde 8 1421 73 +4dfe6 6 1421 73 +4dfec 2 1421 73 +4dfee c 1422 73 +4dffa 2a 1427 73 +FUNC 4e024 220 0 google_breakpad::MinidumpModule::Read +4e024 c 1723 73 +4e030 4 1725 73 +4e034 4 1723 73 +4e038 4 1723 73 +4e03c 2 1725 73 +4e03e 6 156 137 +4e044 6 1725 73 +4e04a 2 1726 73 +4e04c 4 1727 73 +4e050 4 1726 73 +4e054 2 1727 73 +4e056 6 304 144 +4e05c 6 1727 73 +4e062 6 1728 73 +4e068 4 1729 73 +4e06c 4 1730 73 +4e070 4 1729 73 +4e074 2 1730 73 +4e076 6 304 144 +4e07c 6 1730 73 +4e082 2 1731 73 +4e084 4 1737 73 +4e088 4 1731 73 +4e08c 2 1733 73 +4e08e 2 1734 73 +4e090 2 1735 73 +4e092 e 1737 73 +4e0a0 1c 1738 73 +4e0bc a 333 127 +4e0c6 6 1738 73 +4e0cc 2 1739 73 +4e0ce 6 1742 73 +4e0d4 8 958 65 +4e0dc 4 1742 73 +4e0e0 6 1743 73 +4e0e6 8 1744 73 +4e0ee 8 1745 73 +4e0f6 8 1746 73 +4e0fe 8 1747 73 +4e106 8 1748 73 +4e10e 8 1749 73 +4e116 8 1750 73 +4e11e 8 1751 73 +4e126 8 1752 73 +4e12e 8 1753 73 +4e136 8 1754 73 +4e13e 8 1755 73 +4e146 8 1756 73 +4e14e 8 1757 73 +4e156 8 1758 73 +4e15e 8 1759 73 +4e166 8 1760 73 +4e16e 8 1761 73 +4e176 8 1762 73 +4e17e 4 1768 73 +4e182 2 1769 73 +4e184 4 1770 73 +4e188 4 1769 73 +4e18c 4 1770 73 +4e190 8 1768 73 +4e198 1c 1771 73 +4e1b4 4 110 72 +4e1b8 2 333 127 +4e1ba 2 1772 73 +4e1bc 8 333 127 +4e1c4 a 1772 73 +4e1ce a 1772 73 +4e1d8 2 333 127 +4e1da 4 1773 73 +4e1de 6 333 127 +4e1e4 8 1773 73 +4e1ec 8 1773 73 +4e1f4 c 156 137 +4e200 6 1771 73 +4e206 2 1774 73 +4e208 e 1779 73 +4e216 4 1777 73 +4e21a 2 1778 73 +4e21c 28 1779 73 +FUNC 4e244 11c 0 google_breakpad::MinidumpException::Read +4e244 4 2888 73 +4e248 4 2890 73 +4e24c 2 2888 73 +4e24e 2 2888 73 +4e250 2 2890 73 +4e252 6 2890 73 +4e258 2 2891 73 +4e25a 2 2895 73 +4e25c 4 2891 73 +4e260 2 2893 73 +4e262 2 2895 73 +4e264 1a 2896 73 +4e27e 2 110 72 +4e280 a 333 127 +4e28a a 254 126 +4e294 8 333 127 +4e29c a 254 126 +4e2a6 12 2901 73 +4e2b8 1a 2902 73 +4e2d2 a 333 127 +4e2dc 6 2902 73 +4e2e2 2 2903 73 +4e2e4 6 2906 73 +4e2ea 6 958 65 +4e2f0 2 2906 73 +4e2f2 6 2907 73 +4e2f8 8 2910 73 +4e300 8 2911 73 +4e308 8 2912 73 +4e310 8 2913 73 +4e318 10 2914 73 +4e328 8 2920 73 +4e330 4 2917 73 +4e334 6 2922 73 +4e33a 4 2925 73 +4e33e 22 2927 73 +FUNC 4e360 17c 0 google_breakpad::MinidumpSystemInfo::Read +4e360 2 3106 73 +4e362 2 3108 73 +4e364 2 3106 73 +4e366 4 3106 73 +4e36a 2 3108 73 +4e36c 6 156 137 +4e372 6 3108 73 +4e378 2 3109 73 +4e37a 2 3110 73 +4e37c 2 3109 73 +4e37e 2 3110 73 +4e380 6 156 137 +4e386 6 3110 73 +4e38c 2 3111 73 +4e38e 2 3115 73 +4e390 2 3111 73 +4e392 2 3113 73 +4e394 2 3115 73 +4e396 1a 3116 73 +4e3b0 2 110 72 +4e3b2 a 333 127 +4e3bc a 254 126 +4e3c6 8 333 127 +4e3ce a 254 126 +4e3d8 12 3121 73 +4e3ea 1a 3122 73 +4e404 a 333 127 +4e40e 6 3122 73 +4e414 2 3123 73 +4e416 6 3126 73 +4e41c 8 958 65 +4e424 4 3126 73 +4e428 6 3127 73 +4e42e 8 3128 73 +4e436 8 3129 73 +4e43e 8 3132 73 +4e446 8 3133 73 +4e44e 8 3134 73 +4e456 8 3135 73 +4e45e 8 3136 73 +4e466 8 3137 73 +4e46e c 3140 73 +4e47a 12 3143 73 +4e48c 8 3144 73 +4e494 8 3145 73 +4e49c a 3146 73 +4e4a6 4 3140 73 +4e4aa a 3149 73 +4e4b4 4 3153 73 +4e4b8 24 3155 73 +FUNC 4e4dc 240 0 google_breakpad::Minidump::ReadString +4e4dc 6 4478 73 +4e4e2 4 4479 73 +4e4e6 2 4478 73 +4e4e8 8 4478 73 +4e4f0 2 4479 73 +4e4f2 1a 4480 73 +4e50c c 333 127 +4e518 8 4483 73 +4e520 1a 4484 73 +4e53a 2 110 72 +4e53c a 333 127 +4e546 8 259 126 +4e54e 6 4484 73 +4e554 2 4485 73 +4e556 12 4489 73 +4e568 1a 4490 73 +4e582 2 110 72 +4e584 8 333 127 +4e58c 6 4494 73 +4e592 6 4495 73 +4e598 8 4497 73 +4e5a0 1a 4498 73 +4e5ba 2 110 72 +4e5bc a 333 127 +4e5c6 a 254 126 +4e5d0 8 333 127 +4e5d8 8 259 126 +4e5e0 6 4498 73 +4e5e6 4 4500 73 +4e5ea 4 4504 73 +4e5ee 4 4502 73 +4e5f2 a 4504 73 +4e5fc 1a 4505 73 +4e616 2 110 72 +4e618 a 333 127 +4e622 a 254 126 +4e62c 8 333 127 +4e634 a 254 126 +4e63e 2 333 127 +4e640 2 254 126 +4e642 4 333 127 +4e646 8 4511 73 +4e64e c 116 148 +4e65a 6 4513 73 +4e660 a 4514 73 +4e66a 4 4514 73 +4e66e 1a 4515 73 +4e688 2 110 72 +4e68a a 333 127 +4e694 a 254 126 +4e69e 8 333 127 +4e6a6 8 259 126 +4e6ae 6 4515 73 +4e6b4 2 4517 73 +4e6b6 c 4521 73 +4e6c2 6 304 144 +4e6c8 54 4522 73 +FUNC 4e71c 1b0 0 google_breakpad::MinidumpMemoryRegion::GetMemory +4e71c 6 1213 73 +4e722 2 1214 73 +4e724 4 1213 73 +4e728 2 1213 73 +4e72a 2 1214 73 +4e72c 1c 1215 73 +4e748 a 333 127 +4e752 4 1215 73 +4e756 c 1219 73 +4e762 8 1220 73 +4e76a 1a 1221 73 +4e784 8 333 127 +4e78c a 1225 73 +4e796 1a 1226 73 +4e7b0 c 333 127 +4e7bc e 1230 73 +4e7ca 1a 1231 73 +4e7e4 2 110 72 +4e7e6 a 333 127 +4e7f0 2 1232 73 +4e7f2 a 254 126 +4e7fc 8 333 127 +4e804 8 254 126 +4e80c 6 1231 73 +4e812 2 1234 73 +4e814 2 1238 73 +4e816 4 1238 73 +4e81a 6 1238 73 +4e820 2 1238 73 +4e822 a 116 148 +4e82c 2 92 57 +4e82e 2 1240 73 +4e830 4 92 57 +4e834 c 1240 73 +4e840 2 1240 73 +4e842 1a 1241 73 +4e85c a 333 127 +4e866 6 1241 73 +4e86c 8 1242 73 +4e874 2 143 57 +4e876 2 1245 73 +4e878 2 1245 73 +4e87a 4 144 57 +4e87e 6 1245 73 +4e884 8 1222 73 +4e88c 40 1249 73 +FUNC 4e8cc 1d0 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddressInternal +4e8cc 10 1279 73 +4e8dc e 1279 73 +4e8ea 6 1281 73 +4e8f0 1e 1281 73 +4e90e a 333 127 +4e918 6 1281 73 +4e91e 6 1284 73 +4e924 a 1286 73 +4e92e 1c 1287 73 +4e94a a 333 127 +4e954 6 1287 73 +4e95a 2 1289 73 +4e95c 10 1293 73 +4e96c a 1293 73 +4e976 1a 1293 73 +4e990 6 1304 73 +4e996 2 1305 73 +4e998 c 1312 73 +4e9a4 10 1319 73 +4e9b4 4 1307 73 +4e9b8 1e 1297 73 +4e9d6 2 110 72 +4e9d8 6 333 127 +4e9de 4 1297 73 +4e9e2 4 333 127 +4e9e6 a 1297 73 +4e9f0 a 1297 73 +4e9fa a 333 127 +4ea04 a 254 126 +4ea0e 2 333 127 +4ea10 2 1298 73 +4ea12 6 333 127 +4ea18 2 1298 73 +4ea1a a 1298 73 +4ea24 a 1298 73 +4ea2e 6 333 127 +4ea34 2 1299 73 +4ea36 a 1299 73 +4ea40 8 1299 73 +4ea48 12 156 137 +4ea5a 6 1297 73 +4ea60 6 1301 73 +4ea66 36 1319 73 +FUNC 4ea9c 4 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddress +4ea9c 4 1324 73 +FUNC 4eaa8 1f0 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddressInternal +4eaa8 10 1279 73 +4eab8 e 1279 73 +4eac6 6 1281 73 +4eacc 1e 1281 73 +4eaea a 333 127 +4eaf4 6 1281 73 +4eafa 6 1284 73 +4eb00 a 1286 73 +4eb0a 1c 1287 73 +4eb26 a 333 127 +4eb30 6 1287 73 +4eb36 2 1289 73 +4eb38 10 1293 73 +4eb48 10 1293 73 +4eb58 1a 1293 73 +4eb72 6 1304 73 +4eb78 2 1305 73 +4eb7a c 1312 73 +4eb86 6 1315 73 +4eb8c 6 958 65 +4eb92 10 1319 73 +4eba2 4 1315 73 +4eba6 8 1316 73 +4ebae 4 1307 73 +4ebb2 1e 1297 73 +4ebd0 2 110 72 +4ebd2 6 333 127 +4ebd8 4 1297 73 +4ebdc 4 333 127 +4ebe0 a 1297 73 +4ebea a 1297 73 +4ebf4 a 333 127 +4ebfe a 254 126 +4ec08 2 333 127 +4ec0a 2 1298 73 +4ec0c 6 333 127 +4ec12 2 1298 73 +4ec14 a 1298 73 +4ec1e a 1298 73 +4ec28 6 333 127 +4ec2e 2 1299 73 +4ec30 a 1299 73 +4ec3a 8 1299 73 +4ec42 12 156 137 +4ec54 6 1297 73 +4ec5a 6 1301 73 +4ec60 38 1319 73 +FUNC 4ec98 4 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddress +4ec98 4 1330 73 +FUNC 4eca4 1f0 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddressInternal +4eca4 10 1279 73 +4ecb4 e 1279 73 +4ecc2 6 1281 73 +4ecc8 1e 1281 73 +4ece6 a 333 127 +4ecf0 6 1281 73 +4ecf6 6 1284 73 +4ecfc a 1286 73 +4ed06 1c 1287 73 +4ed22 a 333 127 +4ed2c 6 1287 73 +4ed32 2 1289 73 +4ed34 10 1293 73 +4ed44 10 1293 73 +4ed54 1a 1293 73 +4ed6e 6 1304 73 +4ed74 2 1305 73 +4ed76 c 1312 73 +4ed82 6 1315 73 +4ed88 6 958 65 +4ed8e 10 1319 73 +4ed9e 4 1315 73 +4eda2 8 1316 73 +4edaa 4 1307 73 +4edae 1e 1297 73 +4edcc 2 110 72 +4edce 6 333 127 +4edd4 4 1297 73 +4edd8 4 333 127 +4eddc a 1297 73 +4ede6 a 1297 73 +4edf0 a 333 127 +4edfa a 254 126 +4ee04 2 333 127 +4ee06 2 1298 73 +4ee08 6 333 127 +4ee0e 2 1298 73 +4ee10 a 1298 73 +4ee1a a 1298 73 +4ee24 6 333 127 +4ee2a 2 1299 73 +4ee2c a 1299 73 +4ee36 8 1299 73 +4ee3e 12 156 137 +4ee50 6 1297 73 +4ee56 6 1301 73 +4ee5c 38 1319 73 +FUNC 4ee94 4 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddress +4ee94 4 1336 73 +FUNC 4eea0 1f8 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddressInternal +4eea0 10 1279 73 +4eeb0 e 1279 73 +4eebe 6 1281 73 +4eec4 1e 1281 73 +4eee2 a 333 127 +4eeec 6 1281 73 +4eef2 8 1284 73 +4eefa a 1286 73 +4ef04 1c 1287 73 +4ef20 a 333 127 +4ef2a 6 1287 73 +4ef30 2 1289 73 +4ef32 10 1293 73 +4ef42 10 1293 73 +4ef52 1c 1293 73 +4ef6e 6 1304 73 +4ef74 2 1305 73 +4ef76 10 1312 73 +4ef86 6 1315 73 +4ef8c 6 958 65 +4ef92 10 1319 73 +4efa2 4 1315 73 +4efa6 8 1316 73 +4efae 4 1307 73 +4efb2 1e 1297 73 +4efd0 2 110 72 +4efd2 6 333 127 +4efd8 4 1297 73 +4efdc 4 333 127 +4efe0 a 1297 73 +4efea a 1297 73 +4eff4 a 333 127 +4effe a 254 126 +4f008 2 333 127 +4f00a 2 1298 73 +4f00c 6 333 127 +4f012 2 1298 73 +4f014 a 1298 73 +4f01e a 1298 73 +4f028 6 333 127 +4f02e 2 1299 73 +4f030 a 1299 73 +4f03a 8 1299 73 +4f042 12 156 137 +4f054 6 1297 73 +4f05a 6 1301 73 +4f060 38 1319 73 +FUNC 4f098 4 0 google_breakpad::MinidumpMemoryRegion::GetMemoryAtAddress +4f098 4 1342 73 +FUNC 4f0a4 90 0 google_breakpad::MinidumpMemoryRegion::Print +4f0a4 2 1346 73 +4f0a6 2 1347 73 +4f0a8 2 1346 73 +4f0aa 2 1346 73 +4f0ac 2 1347 73 +4f0ae 1a 1348 73 +4f0c8 a 333 127 +4f0d2 8 1348 73 +4f0da 4 1352 73 +4f0de 4 1353 73 +4f0e2 2 1354 73 +4f0e4 2 1355 73 +4f0e6 6 1354 73 +4f0ec 4 1358 73 +4f0f0 4 1356 73 +4f0f4 6 1355 73 +4f0fa c 1358 73 +4f106 8 1360 73 +4f10e 8 1362 73 +4f116 1e 1364 73 +FUNC 4f13c 358 0 google_breakpad::MinidumpModule::GetCVRecord +4f13c 6 2076 73 +4f142 2 2077 73 +4f144 4 2076 73 +4f148 4 2076 73 +4f14c 2 2077 73 +4f14e 1c 2078 73 +4f16a a 333 127 +4f174 4 2078 73 +4f178 a 2082 73 +4f182 8 2085 73 +4f18a c 2089 73 +4f196 1a 2090 73 +4f1b0 c 333 127 +4f1bc 10 2094 73 +4f1cc 1a 2095 73 +4f1e6 2 110 72 +4f1e8 a 333 127 +4f1f2 a 254 126 +4f1fc 8 333 127 +4f204 a 254 126 +4f20e 6 2095 73 +4f214 2 2098 73 +4f216 2 2109 73 +4f218 4 2109 73 +4f21c 6 2109 73 +4f222 a 116 148 +4f22c 2 92 57 +4f22e 4 116 148 +4f232 4 92 57 +4f236 c 2111 73 +4f242 2 2111 73 +4f244 1a 2112 73 +4f25e 8 333 127 +4f266 6 2116 73 +4f26c 8 2117 73 +4f274 6 2120 73 +4f27a 6 2121 73 +4f280 6 958 65 +4f286 2 2121 73 +4f288 6 2122 73 +4f28e 8 2125 73 +4f296 6 2127 73 +4f29c 1a 2128 73 +4f2b6 2 110 72 +4f2b8 a 333 127 +4f2c2 8 254 126 +4f2ca 2 333 127 +4f2cc 2 254 126 +4f2ce 4 333 127 +4f2d2 6 2134 73 +4f2d8 6 958 65 +4f2de 8 2134 73 +4f2e6 2 2137 73 +4f2e8 4 195 73 +4f2ec 4 2137 73 +4f2f0 6 195 73 +4f2f6 8 196 73 +4f2fe 8 197 73 +4f306 a 2139 73 +4f310 e 2146 73 +4f31e 1a 2148 73 +4f338 8 333 127 +4f340 6 2151 73 +4f346 6 2153 73 +4f34c 1a 2154 73 +4f366 2 110 72 +4f368 a 333 127 +4f372 a 254 126 +4f37c 8 333 127 +4f384 a 254 126 +4f38e 6 2159 73 +4f394 6 958 65 +4f39a 8 2159 73 +4f3a2 6 2162 73 +4f3a8 8 2163 73 +4f3b0 8 2164 73 +4f3b8 a 2165 73 +4f3c2 c 2172 73 +4f3ce 1a 2174 73 +4f3e8 a 333 127 +4f3f2 6 2174 73 +4f3f8 8 2113 73 +4f400 2 144 57 +4f402 2 143 57 +4f404 2 2188 73 +4f406 4 2187 73 +4f40a 2 2188 73 +4f40c 2 144 57 +4f40e a 2188 73 +4f418 4 2086 73 +4f41c 6 2191 73 +4f422 c 2192 73 +4f42e 66 2195 73 +FUNC 4f494 27c 0 google_breakpad::MinidumpModule::GetMiscRecord +4f494 6 2198 73 +4f49a 2 2199 73 +4f49c 4 2198 73 +4f4a0 4 2198 73 +4f4a4 2 2199 73 +4f4a6 1c 2200 73 +4f4c2 a 333 127 +4f4cc 4 2200 73 +4f4d0 a 2204 73 +4f4da 8 2205 73 +4f4e2 6 2209 73 +4f4e8 1a 2211 73 +4f502 2 110 72 +4f504 a 333 127 +4f50e a 254 126 +4f518 8 333 127 +4f520 6 254 126 +4f526 a 2216 73 +4f530 1a 2218 73 +4f54a a 333 127 +4f554 6 2218 73 +4f55a 2 2219 73 +4f55c 10 2222 73 +4f56c 1a 2223 73 +4f586 2 110 72 +4f588 a 333 127 +4f592 a 254 126 +4f59c 8 333 127 +4f5a4 c 254 126 +4f5b0 2 2236 73 +4f5b2 4 2236 73 +4f5b6 6 2236 73 +4f5bc a 116 148 +4f5c6 4 92 57 +4f5ca c 2240 73 +4f5d6 1a 2242 73 +4f5f0 c 333 127 +4f5fc 6 2246 73 +4f602 6 958 65 +4f608 8 2262 73 +4f610 1a 2264 73 +4f62a 2 110 72 +4f62c a 333 127 +4f636 a 254 126 +4f640 8 333 127 +4f648 a 254 126 +4f652 4 2246 73 +4f656 6 2247 73 +4f65c 6 2248 73 +4f662 6 2252 73 +4f668 2 2257 73 +4f66a 4 2255 73 +4f66e a 2257 73 +4f678 4 214 73 +4f67c c 215 73 +4f688 6 2264 73 +4f68e 8 2243 73 +4f696 2 144 57 +4f698 2 143 57 +4f69a 6 144 57 +4f6a0 4 2271 73 +4f6a4 6 2271 73 +4f6aa 4 2206 73 +4f6ae 6 2274 73 +4f6b4 c 2275 73 +4f6c0 50 2278 73 +FUNC 4f710 124 0 google_breakpad::MinidumpModule::ReadAuxiliaryData +4f710 6 1782 73 +4f716 2 1783 73 +4f718 4 1782 73 +4f71c 2 1782 73 +4f71e 2 1783 73 +4f720 1c 1784 73 +4f73c a 333 127 +4f746 6 1784 73 +4f74c 2 1785 73 +4f74e e 1789 73 +4f75c 2 1790 73 +4f75e 1c 1791 73 +4f77a 8 333 127 +4f782 4 1796 73 +4f786 2 1800 73 +4f788 4 1796 73 +4f78c 2 1800 73 +4f78e 8 1800 73 +4f796 4 1800 73 +4f79a 1c 1802 73 +4f7b6 8 333 127 +4f7be 4 1806 73 +4f7c2 8 1806 73 +4f7ca 4 1806 73 +4f7ce 1c 1808 73 +4f7ea a 333 127 +4f7f4 6 1808 73 +4f7fa 4 1809 73 +4f7fe 4 1812 73 +4f802 32 1814 73 +FUNC 4f834 64 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_insert +4f834 2 358 140 +4f836 2 350 140 +4f838 8 350 140 +4f840 2 358 140 +4f842 6 359 140 +4f848 2 360 140 +4f84a 2 361 140 +4f84c 4 362 140 +4f850 4 364 140 +4f854 4 364 140 +4f858 8 364 140 +4f860 4 367 140 +4f864 2 368 140 +4f866 2 369 140 +4f868 2 367 140 +4f86a 4 369 140 +4f86e 4 370 140 +4f872 4 373 140 +4f876 2 374 140 +4f878 2 375 140 +4f87a 2 373 140 +4f87c 4 375 140 +4f880 2 376 140 +4f882 2 379 140 +4f884 2 378 140 +4f886 6 379 140 +4f88c 2 380 140 +4f88e 2 382 140 +4f890 4 380 140 +4f894 2 142 141 +4f896 2 382 140 +FUNC 4f898 70 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::insert_unique +4f898 2 405 140 +4f89a 2 408 140 +4f89c 4 405 140 +4f8a0 2 406 140 +4f8a2 2 405 140 +4f8a4 2 407 140 +4f8a6 2 405 140 +4f8a8 2 409 140 +4f8aa 4 412 140 +4f8ae 2 412 140 +4f8b0 2 412 140 +4f8b2 4 412 140 +4f8b6 a 412 140 +4f8c0 2 142 141 +4f8c2 2 415 140 +4f8c4 6 416 140 +4f8ca 6 417 140 +4f8d0 8 187 141 +4f8d8 e 421 140 +4f8e6 10 422 140 +4f8f6 4 142 141 +4f8fa 4 62 129 +4f8fe 2 142 141 +4f900 2 425 140 +4f902 2 62 129 +4f904 4 425 140 +FUNC 4f908 f4 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::insert_unique +4f908 4 432 140 +4f90c 4 434 140 +4f910 2 432 140 +4f912 2 434 140 +4f914 4 432 140 +4f918 2 434 140 +4f91a a 437 140 +4f924 4 440 140 +4f928 a 441 140 +4f932 4 447 140 +4f936 6 177 141 +4f93c 2 458 140 +4f93e 2 177 141 +4f940 2 458 140 +4f942 c 462 140 +4f94e 8 479 140 +4f956 8 480 140 +4f95e 8 483 140 +4f966 2 486 140 +4f968 6 475 140 +4f96e 6 142 141 +4f974 c 187 141 +4f980 c 79 111 +4f98c 6 494 140 +4f992 6 494 140 +4f998 8 177 141 +4f9a0 6 513 140 +4f9a6 4 517 140 +4f9aa 4 517 140 +4f9ae 6 517 140 +4f9b4 6 475 140 +4f9ba 6 500 140 +4f9c0 8 522 140 +4f9c8 6 497 140 +4f9ce 4 498 140 +4f9d2 c 524 140 +4f9de 4 142 141 +4f9e2 4 521 140 +4f9e6 6 522 140 +4f9ec 8 524 140 +4f9f4 8 534 140 +FUNC 4f9fc 4c 0 std::map, std::allocator > >::operator[] +4f9fc 2 175 123 +4f9fe 2 568 141 +4fa00 8 175 123 +4fa08 2 571 141 +4fa0a 4 572 141 +4fa0e 6 575 141 +4fa14 2 573 141 +4fa16 6 575 141 +4fa1c 2 178 123 +4fa1e 2 142 141 +4fa20 2 178 123 +4fa22 6 178 123 +4fa28 6 62 129 +4fa2e 2 142 141 +4fa30 c 191 123 +4fa3c 4 179 123 +4fa40 4 180 123 +4fa44 4 181 123 +FUNC 4fa48 18 0 google_breakpad::MinidumpThreadList::GetThreadByID +4fa48 2 1668 73 +4fa4a 6 1668 73 +4fa50 8 1671 73 +4fa58 8 1672 73 +FUNC 4fa60 50c 0 google_breakpad::MinidumpThreadList::Read +4fa60 e 1553 73 +4fa6e 6 1553 73 +4fa74 6 206 123 +4fa7a 2 531 141 +4fa7c 4 1553 73 +4fa80 2 531 141 +4fa82 8 532 141 +4fa8a 2 533 141 +4fa8c 2 535 141 +4fa8e 2 533 141 +4fa90 2 534 141 +4fa92 2 535 141 +4fa94 2 534 141 +4fa96 2 536 141 +4fa98 4 1556 73 +4fa9c 6 42 148 +4faa2 6 1556 73 +4faa8 2 1557 73 +4faaa 2 1563 73 +4faac 2 1557 73 +4faae 2 1558 73 +4fab0 2 1560 73 +4fab2 2 1563 73 +4fab4 1c 1564 73 +4fad0 2 110 72 +4fad2 a 333 127 +4fadc a 254 126 +4fae6 2 333 127 +4fae8 2 1566 73 +4faea 6 333 127 +4faf0 8 254 126 +4faf8 6 1564 73 +4fafe 2 1566 73 +4fb00 10 1568 73 +4fb10 1c 1569 73 +4fb2c a 333 127 +4fb36 6 1569 73 +4fb3c 2 1570 73 +4fb3e 6 1573 73 +4fb44 6 958 65 +4fb4a 2 1573 73 +4fb4c 6 1574 73 +4fb52 8 1576 73 +4fb5a 1c 1577 73 +4fb76 2 110 72 +4fb78 a 333 127 +4fb82 8 254 126 +4fb8a a 333 127 +4fb94 4 1583 73 +4fb98 6 1582 73 +4fb9e 6 1585 73 +4fba4 10 1588 73 +4fbb4 1c 1590 73 +4fbd0 a 333 127 +4fbda 6 1590 73 +4fbe0 4 1591 73 +4fbe4 1c 1594 73 +4fc00 2 110 72 +4fc02 a 333 127 +4fc0c a 254 126 +4fc16 8 333 127 +4fc1e 2 254 126 +4fc20 4 1596 73 +4fc24 6 254 126 +4fc2a 6 1594 73 +4fc30 6 1597 73 +4fc36 c 1602 73 +4fc42 1c 1603 73 +4fc5e 2 110 72 +4fc60 a 333 127 +4fc6a a 254 126 +4fc74 8 333 127 +4fc7c 6 254 126 +4fc82 6 1608 73 +4fc88 c 1610 73 +4fc94 6 1610 73 +4fc9a 2 70 144 +4fc9c 4 1610 73 +4fca0 4 70 144 +4fca4 2 481 106 +4fca6 2 342 106 +4fca8 2 1610 73 +4fcaa 4 342 106 +4fcae 8 343 106 +4fcb6 6 343 106 +4fcbc 6 346 106 +4fcc2 c 347 106 +4fcce 4 348 106 +4fcd2 a 352 106 +4fcdc 2 346 106 +4fcde 2 356 106 +4fce0 2 73 144 +4fce2 4 314 142 +4fce6 4 73 144 +4fcea 6 314 142 +4fcf0 2 112 65 +4fcf2 4 267 65 +4fcf6 2 112 65 +4fcf8 4 249 142 +4fcfc 2 112 65 +4fcfe 2 267 65 +4fd00 4 249 142 +4fd04 2 71 144 +4fd06 2 72 144 +4fd08 6 73 144 +4fd0e 2 112 65 +4fd10 4 267 65 +4fd14 6 249 142 +4fd1a 4 139 108 +4fd1e 4 112 65 +4fd22 4 267 65 +4fd26 6 112 65 +4fd2c 4 267 65 +4fd30 6 112 65 +4fd36 4 267 65 +4fd3a 4 112 65 +4fd3e 24 267 65 +4fd62 8 249 142 +4fd6a 2 1612 73 +4fd6c 2 244 144 +4fd6e 2 1610 73 +4fd70 2 244 144 +4fd72 4 1610 73 +4fd76 4 1625 73 +4fd7a 8 1612 73 +4fd82 c 202 144 +4fd8e 2 1618 73 +4fd90 2 202 144 +4fd92 6 1618 73 +4fd98 1a 1619 73 +4fdb2 2 110 72 +4fdb4 a 333 127 +4fdbe 8 254 126 +4fdc6 2 333 127 +4fdc8 2 254 126 +4fdca 4 333 127 +4fdce 12 1625 73 +4fde0 1a 1626 73 +4fdfa 2 110 72 +4fdfc a 333 127 +4fe06 a 254 126 +4fe10 8 333 127 +4fe18 8c 254 126 +4fea4 c 1631 73 +4feb0 1a 1633 73 +4feca 2 110 72 +4fecc 4 333 127 +4fed0 2 1634 73 +4fed2 6 333 127 +4fed8 8 1634 73 +4fee0 a 1634 73 +4feea 8 333 127 +4fef2 a 254 126 +4fefc 8 333 127 +4ff04 8 254 126 +4ff0c 6 156 137 +4ff12 6 1633 73 +4ff18 6 42 148 +4ff1e 8 98 57 +4ff26 8 1638 73 +4ff2e 2 1612 73 +4ff30 6 1638 73 +4ff36 2 1641 73 +4ff38 4 1644 73 +4ff3c 4 1646 73 +4ff40 2c 1648 73 +FUNC 4ff6c 80 0 std::priv::_Rb_tree, std::pair::Range>, std::priv::_Select1st::Range> >, std::priv::_MapTraitsT::Range> >, std::allocator::Range> > >::_M_insert +4ff6c 2 358 140 +4ff6e 4 350 140 +4ff72 8 350 140 +4ff7a 2 358 140 +4ff7c 6 359 140 +4ff82 2 360 140 +4ff84 2 361 140 +4ff86 4 362 140 +4ff8a 4 364 140 +4ff8e 4 364 140 +4ff92 10 364 140 +4ffa2 4 367 140 +4ffa6 2 368 140 +4ffa8 4 369 140 +4ffac 2 367 140 +4ffae 4 369 140 +4ffb2 6 370 140 +4ffb8 4 373 140 +4ffbc 2 374 140 +4ffbe 4 375 140 +4ffc2 2 373 140 +4ffc4 4 375 140 +4ffc8 4 376 140 +4ffcc 2 379 140 +4ffce 2 378 140 +4ffd0 8 379 140 +4ffd8 4 380 140 +4ffdc 2 382 140 +4ffde 6 380 140 +4ffe4 4 142 141 +4ffe8 4 382 140 +FUNC 4ffec 1e8 0 google_breakpad::RangeMap::StoreRange +4ffec 8 50 75 +4fff4 4 53 75 +4fff8 e 50 75 +50006 2 50 75 +50008 4 56 75 +5000c 4 50 75 +50010 4 53 75 +50014 2 50 75 +50016 a 56 75 +50020 6 53 75 +50026 6 56 75 +5002c 4 53 75 +50030 2 56 75 +50032 18 60 75 +5004a 4 110 72 +5004e 6 333 127 +50054 4 60 75 +50058 4 333 127 +5005c a 60 75 +50066 a 60 75 +50070 2 333 127 +50072 4 61 75 +50076 6 333 127 +5007c a 61 75 +50086 a 61 75 +50090 2 333 127 +50092 2 61 75 +50094 6 333 127 +5009a a 61 75 +500a4 8 61 75 +500ac 12 156 137 +500be 6 60 75 +500c4 6 63 75 +500ca 2 568 141 +500cc 2 569 141 +500ce 2 571 141 +500d0 a 572 141 +500da 6 575 141 +500e0 2 573 141 +500e2 6 575 141 +500e8 2 569 141 +500ea 2 568 141 +500ec 2 571 141 +500ee e 572 141 +500fc 6 575 141 +50102 2 573 141 +50104 6 575 141 +5010a 4 71 75 +5010e 4 90 75 +50112 10 91 75 +50122 a 105 76 +5012c 10 62 129 +5013c 2 568 141 +5013e 4 62 129 +50142 2 408 140 +50144 2 409 140 +50146 e 412 140 +50154 4 412 140 +50158 4 412 140 +5015c 4 412 140 +50160 6 412 140 +50166 4 142 141 +5016a 2 415 140 +5016c 6 416 140 +50172 8 417 140 +5017a a 187 141 +50184 10 421 140 +50194 12 422 140 +501a6 2 113 75 +501a8 2c 114 75 +FUNC 501d4 630 0 google_breakpad::MinidumpModuleList::Read +501d4 14 2445 73 +501e8 2 2445 73 +501ea 2 206 123 +501ec 4 2445 73 +501f0 4 206 123 +501f4 6 2448 73 +501fa 6 42 148 +50200 6 2448 73 +50206 2 2449 73 +50208 2 2455 73 +5020a 2 2449 73 +5020c 2 2450 73 +5020e 2 2452 73 +50210 2 2455 73 +50212 1e 2456 73 +50230 2 110 72 +50232 a 333 127 +5023c a 254 126 +50246 8 333 127 +5024e 8 254 126 +50256 4 2456 73 +5025a 10 2460 73 +5026a 1e 2461 73 +50288 a 333 127 +50292 6 2461 73 +50298 2 2462 73 +5029a 6 2465 73 +502a0 6 958 65 +502a6 2 2465 73 +502a8 6 2466 73 +502ae 8 2468 73 +502b6 1e 2469 73 +502d4 2 110 72 +502d6 a 333 127 +502e0 8 254 126 +502e8 a 333 127 +502f2 8 2475 73 +502fa 6 2474 73 +50300 6 2477 73 +50306 10 2480 73 +50316 1e 2482 73 +50334 a 333 127 +5033e 6 2482 73 +50344 4 2483 73 +50348 1e 2486 73 +50366 2 110 72 +50368 a 333 127 +50372 a 254 126 +5037c 8 333 127 +50384 2 2488 73 +50386 2 254 126 +50388 4 2488 73 +5038c 6 254 126 +50392 4 2486 73 +50396 10 2493 73 +503a6 1e 2494 73 +503c4 2 110 72 +503c6 a 333 127 +503d0 a 254 126 +503da 8 333 127 +503e2 a 254 126 +503ec 8 2494 73 +503f4 6 2499 73 +503fa c 2501 73 +50406 6 2501 73 +5040c 2 70 144 +5040e 4 2501 73 +50412 4 70 144 +50416 2 481 106 +50418 2 342 106 +5041a 2 2501 73 +5041c 4 342 106 +50420 8 343 106 +50428 4 343 106 +5042c 6 346 106 +50432 c 347 106 +5043e 4 348 106 +50442 a 352 106 +5044c 2 348 106 +5044e 4 352 106 +50452 2 346 106 +50454 2 356 106 +50456 2 73 144 +50458 4 314 142 +5045c 4 73 144 +50460 6 314 142 +50466 a 249 142 +50470 2 112 65 +50472 4 364 65 +50476 4 112 65 +5047a 4 71 144 +5047e 4 72 144 +50482 4 73 144 +50486 2 112 65 +50488 2 364 65 +5048a 6 249 142 +50490 2 139 108 +50492 4 112 65 +50496 4 364 65 +5049a 4 112 65 +5049e 2 364 65 +504a0 4 112 65 +504a4 2 364 65 +504a6 2 112 65 +504a8 34 364 65 +504dc 8 249 142 +504e4 2 244 144 +504e6 2 2501 73 +504e8 4 244 144 +504ec 4 92 57 +504f0 2 2503 73 +504f2 4 2501 73 +504f6 4 202 144 +504fa 6 2503 73 +50500 4 202 144 +50504 a 2509 73 +5050e 1c 2510 73 +5052a 2 110 72 +5052c a 333 127 +50536 8 254 126 +5053e 2 333 127 +50540 2 254 126 +50542 4 333 127 +50546 7e 2503 73 +505c4 4 2521 73 +505c8 8 2550 73 +505d0 2 2522 73 +505d2 6 2521 73 +505d8 e 202 144 +505e6 8 2531 73 +505ee 4 2531 73 +505f2 1c 2533 73 +5060e 2 110 72 +50610 a 333 127 +5061a 8 254 126 +50622 2 333 127 +50624 2 254 126 +50626 4 333 127 +5062a 6 2560 73 +50630 e 2541 73 +5063e a 2542 73 +50648 c 2543 73 +50654 4 2542 73 +50658 2 2543 73 +5065a 1e 2545 73 +50678 2 110 72 +5067a a 333 127 +50684 a 254 126 +5068e 8 333 127 +50696 a 254 126 +506a0 2 333 127 +506a2 2 2546 73 +506a4 6 333 127 +506aa 2 2546 73 +506ac 8 2546 73 +506b4 8 2546 73 +506bc 6 156 137 +506c2 6 2551 73 +506c8 4 98 57 +506cc 6 42 148 +506d2 a 98 57 +506dc 4 2563 73 +506e0 4 2565 73 +506e4 10 2567 73 +506f4 4 333 127 +506f8 8 254 126 +50700 4 2533 73 +50704 10 2550 73 +50714 1e 2551 73 +50732 2 110 72 +50734 a 333 127 +5073e a 254 126 +50748 8 333 127 +50750 a 254 126 +5075a 2 333 127 +5075c 2 2553 73 +5075e 8 333 127 +50766 a 2553 73 +50770 a 2553 73 +5077a 2 333 127 +5077c 2 2554 73 +5077e 4 333 127 +50782 a 2554 73 +5078c a 2554 73 +50796 2 333 127 +50798 2 2555 73 +5079a 6 333 127 +507a0 a 2555 73 +507aa 8 2555 73 +507b2 e 156 137 +507c0 8 2521 73 +507c8 3c 2567 73 +FUNC 50804 61c 0 google_breakpad::MinidumpMemoryList::Read +50804 10 2689 73 +50814 2 2691 73 +50816 4 2689 73 +5081a 8 2689 73 +50822 2 2691 73 +50824 6 42 148 +5082a 6 2691 73 +50830 2 2692 73 +50832 2 2693 73 +50834 2 2692 73 +50836 2 2693 73 +50838 6 42 148 +5083e 6 2693 73 +50844 2 2694 73 +50846 2 206 123 +50848 2 2694 73 +5084a 4 206 123 +5084e 2 2701 73 +50850 2 2696 73 +50852 2 2698 73 +50854 2 2701 73 +50856 20 2702 73 +50876 2 110 72 +50878 c 333 127 +50884 a 254 126 +5088e a 333 127 +50898 a 254 126 +508a2 12 2706 73 +508b4 20 2707 73 +508d4 c 333 127 +508e0 6 2707 73 +508e6 2 2708 73 +508e8 6 2711 73 +508ee 6 958 65 +508f4 2 2711 73 +508f6 6 2712 73 +508fc 8 2714 73 +50904 20 2716 73 +50924 2 110 72 +50926 c 333 127 +50932 8 254 126 +5093a c 333 127 +50946 2 2722 73 +50948 6 2721 73 +5094e 6 2724 73 +50954 10 2727 73 +50964 20 2729 73 +50984 c 333 127 +50990 6 2729 73 +50996 4 2730 73 +5099a 1e 2733 73 +509b8 2 110 72 +509ba c 333 127 +509c6 a 254 126 +509d0 8 333 127 +509d8 2 2735 73 +509da 2 254 126 +509dc 2 2735 73 +509de 4 254 126 +509e2 c 2740 73 +509ee 1c 2741 73 +50a0a 2 110 72 +50a0c a 333 127 +50a16 a 254 126 +50a20 8 333 127 +50a28 8 254 126 +50a30 8 2741 73 +50a38 6 2746 73 +50a3e 6 2748 73 +50a44 2 2748 73 +50a46 8 2748 73 +50a4e 4 2748 73 +50a52 2 2748 73 +50a54 2 2748 73 +50a56 4 342 106 +50a5a 4 70 144 +50a5e 2 481 106 +50a60 2 342 106 +50a62 8 343 106 +50a6a 8 343 106 +50a72 2 346 106 +50a74 6 347 106 +50a7a 4 348 106 +50a7e 2 352 106 +50a80 2 348 106 +50a82 4 352 106 +50a86 2 356 106 +50a88 4 73 144 +50a8c 4 314 142 +50a90 4 71 144 +50a94 4 72 144 +50a98 4 73 144 +50a9c 4 249 142 +50aa0 6 249 142 +50aa6 2 139 108 +50aa8 8 139 108 +50ab0 8 249 142 +50ab8 2 2753 73 +50aba 4 244 144 +50abe 8 2753 73 +50ac6 4 92 57 +50aca 8 2753 73 +50ad2 2 2752 73 +50ad4 1a 2754 73 +50aee a 333 127 +50af8 6 2754 73 +50afe 2 2755 73 +50b00 8 2759 73 +50b08 6 2759 73 +50b0e 2 70 144 +50b10 4 2759 73 +50b14 4 70 144 +50b18 2 481 106 +50b1a 2 342 106 +50b1c 2 2759 73 +50b1e 8 342 106 +50b26 6 346 106 +50b2c c 347 106 +50b38 4 348 106 +50b3c a 352 106 +50b46 2 346 106 +50b48 2 356 106 +50b4a 2 73 144 +50b4c 4 314 142 +50b50 4 73 144 +50b54 4 314 142 +50b58 4 249 142 +50b5c 2 71 144 +50b5e 2 72 144 +50b60 4 112 65 +50b64 4 249 142 +50b68 2 201 65 +50b6a 2 112 65 +50b6c 6 201 65 +50b72 2 73 144 +50b74 2 112 65 +50b76 2 201 65 +50b78 6 249 142 +50b7e 4 139 108 +50b82 e 112 65 +50b90 4 201 65 +50b94 4 112 65 +50b98 10 201 65 +50ba8 8 249 142 +50bb0 4 244 144 +50bb4 6 2759 73 +50bba 4 2761 73 +50bbe 8 2782 73 +50bc6 2 2762 73 +50bc8 6 2761 73 +50bce 8 202 144 +50bd6 6 2766 73 +50bdc 6 958 65 +50be2 2 2766 73 +50be4 6 189 73 +50bea 8 190 73 +50bf2 8 2769 73 +50bfa 4 2770 73 +50bfe 6 2773 73 +50c04 6 2774 73 +50c0a 6 2773 73 +50c10 2 2774 73 +50c12 4 2773 73 +50c16 4 2793 73 +50c1a 4 2794 73 +50c1e 16 2782 73 +50c34 1a 2783 73 +50c4e 2 110 72 +50c50 a 333 127 +50c5a a 254 126 +50c64 8 333 127 +50c6c a 254 126 +50c76 2 333 127 +50c78 2 2785 73 +50c7a 6 333 127 +50c80 a 2785 73 +50c8a a 2785 73 +50c94 4 333 127 +50c98 2 2778 73 +50c9a 4 333 127 +50c9e 8 2778 73 +50ca6 8 2778 73 +50cae c 156 137 +50cba 6 2775 73 +50cc0 6 42 148 +50cc6 6 98 57 +50ccc 4 98 57 +50cd0 6 42 148 +50cd6 a 98 57 +50ce0 4 2797 73 +50ce4 4 2799 73 +50ce8 10 2801 73 +50cf8 1a 2775 73 +50d12 2 110 72 +50d14 14 333 127 +50d28 a 254 126 +50d32 8 333 127 +50d3a a 254 126 +50d44 2 333 127 +50d46 2 2777 73 +50d48 6 333 127 +50d4e a 2777 73 +50d58 8 2777 73 +50d60 2 333 127 +50d62 2 2777 73 +50d64 4 333 127 +50d68 2 2790 73 +50d6a 2 202 144 +50d6c c 2790 73 +50d78 8 2761 73 +50d80 a0 2801 73 +FUNC 50e20 64 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::_M_insert +50e20 2 358 140 +50e22 2 350 140 +50e24 8 350 140 +50e2c 2 358 140 +50e2e 6 359 140 +50e34 2 360 140 +50e36 2 361 140 +50e38 4 362 140 +50e3c 4 364 140 +50e40 4 364 140 +50e44 8 364 140 +50e4c 4 367 140 +50e50 2 368 140 +50e52 2 369 140 +50e54 2 367 140 +50e56 4 369 140 +50e5a 4 370 140 +50e5e 4 373 140 +50e62 2 374 140 +50e64 2 375 140 +50e66 2 373 140 +50e68 4 375 140 +50e6c 2 376 140 +50e6e 2 379 140 +50e70 2 378 140 +50e72 6 379 140 +50e78 2 380 140 +50e7a 2 382 140 +50e7c 4 380 140 +50e80 2 142 141 +50e82 2 382 140 +FUNC 50e84 70 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::insert_unique +50e84 2 405 140 +50e86 2 408 140 +50e88 4 405 140 +50e8c 2 406 140 +50e8e 2 405 140 +50e90 2 407 140 +50e92 2 405 140 +50e94 2 409 140 +50e96 4 412 140 +50e9a 2 412 140 +50e9c 2 412 140 +50e9e 4 412 140 +50ea2 a 412 140 +50eac 2 142 141 +50eae 2 415 140 +50eb0 6 416 140 +50eb6 6 417 140 +50ebc 8 187 141 +50ec4 e 421 140 +50ed2 10 422 140 +50ee2 4 142 141 +50ee6 4 62 129 +50eea 2 142 141 +50eec 2 425 140 +50eee 2 62 129 +50ef0 4 425 140 +FUNC 50ef4 f4 0 std::priv::_Rb_tree, std::pair, std::priv::_Select1st >, std::priv::_MapTraitsT >, std::allocator > >::insert_unique +50ef4 4 432 140 +50ef8 4 434 140 +50efc 2 432 140 +50efe 2 434 140 +50f00 4 432 140 +50f04 2 434 140 +50f06 a 437 140 +50f10 4 440 140 +50f14 a 441 140 +50f1e 4 447 140 +50f22 6 177 141 +50f28 2 458 140 +50f2a 2 177 141 +50f2c 2 458 140 +50f2e c 462 140 +50f3a 8 479 140 +50f42 8 480 140 +50f4a 8 483 140 +50f52 2 486 140 +50f54 6 475 140 +50f5a 6 142 141 +50f60 c 187 141 +50f6c c 79 111 +50f78 6 494 140 +50f7e 6 494 140 +50f84 8 177 141 +50f8c 6 513 140 +50f92 4 517 140 +50f96 4 517 140 +50f9a 6 517 140 +50fa0 6 475 140 +50fa6 6 500 140 +50fac 8 522 140 +50fb4 6 497 140 +50fba 4 498 140 +50fbe c 524 140 +50fca 4 142 141 +50fce 4 521 140 +50fd2 6 522 140 +50fd8 8 524 140 +50fe0 8 534 140 +FUNC 50fe8 5a8 0 google_breakpad::Minidump::Read +50fe8 10 4099 73 +50ff8 2 4101 73 +50ffa 4 4099 73 +50ffe 6 4099 73 +51004 2 4101 73 +51006 6 42 148 +5100c 6 4101 73 +51012 2 4102 73 +51014 2 4103 73 +51016 2 4102 73 +51018 4 531 141 +5101c 8 532 141 +51024 2 533 141 +51026 2 534 141 +51028 2 535 141 +5102a 2 536 141 +5102c 2 4105 73 +5102e 2 4107 73 +51030 4 4105 73 +51034 a 4107 73 +5103e 1e 4108 73 +5105c a 333 127 +51066 12 4112 73 +51078 1e 4113 73 +51096 c 333 127 +510a2 6 4113 73 +510a8 2 4114 73 +510aa a 4117 73 +510b4 6 4122 73 +510ba 4 4123 73 +510be 6 4124 73 +510c4 1e 4126 73 +510e2 4 110 72 +510e6 6 333 127 +510ec 2 4127 73 +510ee 6 333 127 +510f4 8 4127 73 +510fc a 4127 73 +51106 4 333 127 +5110a 2 4128 73 +5110c 6 333 127 +51112 8 4128 73 +5111a a 4128 73 +51124 4 333 127 +51128 4 4129 73 +5112c 6 333 127 +51132 8 4129 73 +5113a 8 4129 73 +51142 12 156 137 +51154 6 4126 73 +5115a 4 4130 73 +5115e 8 4132 73 +51166 4 4136 73 +5116a 1a 4139 73 +51184 2 110 72 +51186 a 333 127 +51190 6 4139 73 +51196 6 4139 73 +5119c 4 4139 73 +511a0 10 333 127 +511b0 6 4139 73 +511b6 6 4142 73 +511bc 6 4143 73 +511c2 8 4144 73 +511ca 8 4145 73 +511d2 8 4146 73 +511da 8 4147 73 +511e2 8 4148 73 +511ea 8 4149 73 +511f2 a 4154 73 +511fc 1a 4155 73 +51216 2 110 72 +51218 2 333 127 +5121a 2 4156 73 +5121c 8 333 127 +51224 8 4156 73 +5122c a 4156 73 +51236 2 333 127 +51238 2 4157 73 +5123a 6 333 127 +51240 8 4157 73 +51248 8 4157 73 +51250 e 156 137 +5125e c 4161 73 +5126a 1a 4162 73 +51284 8 333 127 +5128c c 4166 73 +51298 1a 4167 73 +512b2 2 110 72 +512b4 a 333 127 +512be a 254 126 +512c8 8 333 127 +512d0 8 254 126 +512d8 8 4167 73 +512e0 6 4172 73 +512e6 4 4174 73 +512ea 2 4174 73 +512ec c 4174 73 +512f8 4 4174 73 +512fc 4 4174 73 +51300 2 342 106 +51302 2 4174 73 +51304 2 342 106 +51306 8 70 144 +5130e 4 481 106 +51312 2 342 106 +51314 8 343 106 +5131c 8 343 106 +51324 6 346 106 +5132a c 347 106 +51336 6 348 106 +5133c a 352 106 +51346 2 346 106 +51348 2 356 106 +5134a 2 73 144 +5134c 4 314 142 +51350 4 73 144 +51354 4 314 142 +51358 8 249 142 +51360 2 71 144 +51362 2 72 144 +51364 2 73 144 +51366 6 249 142 +5136c 2 139 108 +5136e 8 139 108 +51376 8 249 142 +5137e 4 4179 73 +51382 4 244 144 +51386 e 4179 73 +51394 4 4178 73 +51398 1a 4180 73 +513b2 8 333 127 +513ba 2 178 123 +513bc 2 142 141 +513be 2 178 123 +513c0 6 178 123 +513c6 2 171 141 +513c8 4 4218 73 +513cc 4 4184 73 +513d0 6 4184 73 +513d6 e 202 144 +513e4 6 4189 73 +513ea 6 4190 73 +513f0 8 4191 73 +513f8 6 4196 73 +513fe 2 4197 73 +51400 2 4196 73 +51402 2 4197 73 +51404 a 210 123 +5140e 2 423 141 +51410 2 200 141 +51412 4 4205 73 +51416 1a 4208 73 +51430 2 110 72 +51432 a 333 127 +5143c 8 254 126 +51444 8 333 127 +5144c 6 4208 73 +51452 6 42 148 +51458 8 98 57 +51460 6 210 123 +51466 4 202 144 +5146a 4 210 123 +5146e 10 4197 73 +5147e 6 4218 73 +51484 6 568 141 +5148a 4 571 141 +5148e 4 572 141 +51492 6 575 141 +51498 2 573 141 +5149a 6 575 141 +514a0 4 4223 73 +514a4 6 98 57 +514aa 6 4226 73 +514b0 10 4228 73 +514c0 2 968 65 +514c2 4 62 129 +514c6 4 968 65 +514ca a 62 129 +514d4 2 142 141 +514d6 4 62 129 +514da c 191 123 +514e6 2 179 123 +514e8 2 51 129 +514ea 2 179 123 +514ec 4 51 129 +514f0 8 179 123 +514f8 98 4228 73 +FUNC 51590 66 0 std::basic_filebuf >::_M_allocate_buffers +51590 2 630 109 +51592 4 630 109 +51596 2 637 109 +51598 8 644 109 +515a0 2 645 109 +515a2 4 647 109 +515a6 2 651 109 +515a8 2 650 109 +515aa 2 655 109 +515ac 4 651 109 +515b0 2 227 107 +515b2 2 655 109 +515b4 4 227 107 +515b8 8 655 109 +515c0 8 661 109 +515c8 2 664 109 +515ca 6 686 109 +515d0 6 687 109 +515d6 6 688 109 +515dc 4 689 109 +515e0 2 690 109 +515e2 2 691 109 +515e4 4 692 109 +515e8 2 670 109 +515ea 2 671 109 +515ec 2 669 109 +515ee 2 670 109 +515f0 4 669 109 +515f4 2 672 109 +FUNC 515f6 26 0 std::basic_filebuf >::setbuf +515f6 2 268 109 +515f8 4 269 109 +515fc 2 268 109 +515fe 2 269 109 +51600 4 269 109 +51604 4 269 109 +51608 2 271 109 +5160a 2 271 109 +5160c 4 272 109 +51610 4 273 109 +51614 4 274 109 +51618 4 277 109 +FUNC 5161c 140 0 std::basic_filebuf >::overflow +5161c 4 208 109 +51620 4 210 109 +51624 2 208 109 +51626 4 208 109 +5162a 4 210 109 +5162e a 453 109 +51638 8 453 109 +51640 a 453 109 +5164a 8 453 109 +51652 6 456 109 +51658 6 128 110 +5165e a 680 109 +51668 2 681 109 +5166a 4 680 109 +5166e 6 681 109 +51674 4 456 109 +51678 4 462 109 +5167c 6 463 109 +51682 4 118 134 +51686 6 466 109 +5168c 2 216 109 +5168e 4 214 109 +51692 2 219 109 +51694 4 216 109 +51698 2 117 134 +5169a 2 118 134 +5169c 2 119 134 +5169e 4 228 109 +516a2 4 220 145 +516a6 4 193 107 +516aa 4 220 109 +516ae 4 193 107 +516b2 4 223 109 +516b6 2 225 109 +516b8 2 228 109 +516ba 2 225 109 +516bc 2 224 109 +516be 1c 193 107 +516da 4 229 109 +516de c 322 110 +516ea 4 232 109 +516ee 4 240 109 +516f2 2 580 109 +516f4 2 582 109 +516f6 4 580 109 +516fa 4 581 109 +516fe 4 582 109 +51702 2 117 134 +51704 2 118 134 +51706 4 119 134 +5170a 6 240 109 +51710 10 240 109 +51720 8 240 109 +51728 4 240 109 +5172c e 322 110 +5173a 4 246 109 +5173e 4 247 109 +51742 a 182 145 +5174c 4 212 109 +51750 c 256 109 +FUNC 5175c c0 0 std::basic_filebuf >::~basic_filebuf +5175c 2 67 109 +5175e 2 70 109 +51760 4 84 109 +51764 6 70 109 +5176a a 67 109 +51774 2 84 109 +51776 2 85 109 +51778 8 86 109 +51780 6 85 109 +51786 6 89 109 +5178c 4 119 109 +51790 8 120 109 +51798 2 121 109 +5179a 2 122 109 +5179c 6 124 109 +517a2 6 93 109 +517a8 6 97 109 +517ae 4 98 109 +517b2 2 100 109 +517b4 2 101 109 +517b6 2 93 134 +517b8 2 94 134 +517ba 2 95 134 +517bc 2 117 134 +517be 2 118 134 +517c0 2 119 134 +517c2 6 106 109 +517c8 10 108 109 +517d8 6 686 109 +517de 8 687 109 +517e6 8 594 109 +517ee 10 594 109 +517fe 6 688 109 +51804 2 689 109 +51806 2 70 109 +51808 2 689 109 +5180a 2 690 109 +5180c 2 691 109 +5180e 2 692 109 +51810 c 70 109 +FUNC 5181c 12 0 std::basic_filebuf >::~basic_filebuf +5181c 2 67 109 +5181e 2 67 109 +51820 4 70 109 +51824 6 70 109 +5182a 4 70 109 +FUNC 51830 6c 0 std::basic_ifstream >::~basic_ifstream +51830 2 495 110 +51832 8 495 110 +5183a 4 495 110 +5183e 6 495 110 +51844 4 495 110 +51848 6 495 110 +5184e 2 495 110 +51850 4 495 110 +51854 4 495 110 +51858 6 495 110 +5185e c 495 110 +5186a 6 495 110 +51870 6 495 110 +51876 4 495 110 +5187a 8 495 110 +51882 4 495 110 +51886 6 495 110 +5188c 10 495 110 +FUNC 5189c 8 0 std::basic_ifstream >::~basic_ifstream +5189c 8 495 110 +FUNC 518b0 12 0 std::basic_ifstream >::~basic_ifstream +518b0 2 495 110 +518b2 6 495 110 +518b8 6 495 110 +518be 4 495 110 +FUNC 518ce 70 0 std::basic_filebuf >::_M_seek_init +518ce 2 700 109 +518d0 6 702 109 +518d6 4 706 109 +518da 4 700 109 +518de 2 706 109 +518e0 2 708 109 +518e2 8 708 109 +518ea 6 708 109 +518f0 2 709 109 +518f2 2 710 109 +518f4 6 594 109 +518fa c 594 109 +51906 2 711 109 +51908 2 712 109 +5190a 2 713 109 +5190c 4 712 109 +51910 4 713 109 +51914 2 117 134 +51916 2 118 134 +51918 2 119 134 +5191a 2 715 109 +5191c 6 720 109 +51922 6 720 109 +51928 6 93 134 +5192e 2 95 134 +51930 2 221 110 +51932 2 93 134 +51934 2 94 134 +51936 4 221 110 +5193a 2 723 109 +5193c 2 724 109 +FUNC 5193e 4e 0 std::basic_filebuf >::_M_seek_return +5193e 2 238 110 +51940 2 238 110 +51942 2 239 110 +51944 6 238 110 +5194a 2 239 110 +5194c 6 240 110 +51952 4 119 109 +51956 a 120 109 +51960 4 121 109 +51964 2 122 109 +51966 6 242 110 +5196c 4 243 110 +51970 4 244 110 +51974 4 245 110 +51978 2 93 134 +5197a 2 94 134 +5197c 2 95 134 +5197e 2 117 134 +51980 2 118 134 +51982 2 119 134 +51984 4 121 145 +51988 4 253 110 +FUNC 5198c 52 0 std::basic_filebuf >::seekpos +5198c 2 384 109 +5198e 8 384 109 +51996 4 386 109 +5199a 2 384 109 +5199c 2 386 109 +5199e a 387 109 +519a8 e 89 145 +519b6 4 391 109 +519ba c 391 109 +519c6 6 391 109 +519cc 2 393 109 +519ce 2 392 109 +519d0 8 393 109 +519d8 6 398 109 +FUNC 519de 12c 0 std::basic_filebuf >::seekoff +519de 6 291 109 +519e4 4 294 109 +519e8 2 291 109 +519ea 6 291 109 +519f0 2 294 109 +519f2 c 89 145 +519fe 6 297 109 +51a04 4 297 109 +51a08 2 300 109 +51a0a 8 300 109 +51a12 2 300 109 +51a14 a 300 109 +51a1e 4 304 109 +51a22 4 304 109 +51a26 c 306 109 +51a32 a 310 109 +51a3c c 312 109 +51a48 c 314 109 +51a54 c 317 109 +51a60 2 321 109 +51a62 8 321 109 +51a6a 2 321 109 +51a6c 2 321 109 +51a6e 8 321 109 +51a76 4 324 109 +51a7a 2 325 109 +51a7c 6 324 109 +51a82 2 325 109 +51a84 2 332 109 +51a86 2 325 109 +51a88 8 332 109 +51a90 2 333 109 +51a92 6 87 110 +51a98 2 336 109 +51a9a 8 335 109 +51aa2 2 336 109 +51aa4 4 89 145 +51aa8 8 336 109 +51ab0 2 336 109 +51ab2 2 336 109 +51ab4 6 336 109 +51aba 4 344 109 +51abe 2 346 109 +51ac0 4 344 109 +51ac4 c 224 107 +51ad0 4 370 109 +51ad4 2 224 107 +51ad6 a 370 109 +51ae0 2 373 109 +51ae2 2 371 109 +51ae4 2 372 109 +51ae6 2 373 109 +51ae8 2 87 110 +51aea 2 372 109 +51aec 4 373 109 +51af0 2 375 109 +51af2 6 89 145 +51af8 a 375 109 +51b02 8 379 109 +FUNC 51b0a a0 0 std::basic_string, std::allocator >::rfind +51b0a 4 468 135 +51b0e 2 400 136 +51b10 4 471 135 +51b14 6 472 135 +51b1a a 474 135 +51b24 2 162 104 +51b26 2 474 135 +51b28 4 164 104 +51b2c 8 165 104 +51b34 8 168 104 +51b3c 2 81 118 +51b3e 4 65 118 +51b42 8 171 104 +51b4a 4 81 118 +51b4e 8 174 104 +51b56 4 81 118 +51b5a 6 164 104 +51b60 2 152 118 +51b62 10 178 104 +51b72 8 180 104 +51b7a 4 81 118 +51b7e 2 76 118 +51b80 8 183 104 +51b88 4 81 118 +51b8c 2 76 118 +51b8e 8 186 104 +51b96 6 65 118 +51b9c 2 74 118 +51b9e 4 478 135 +51ba2 4 478 135 +51ba6 4 479 135 +FUNC 51bac a8 0 google_breakpad::PathnameStripper::File +51bac 2 41 74 +51bae 2 41 74 +51bb0 4 42 74 +51bb4 2 41 74 +51bb6 a 42 74 +51bc0 c 43 74 +51bcc 4 46 74 +51bd0 4 46 74 +51bd4 4 47 74 +51bd8 4 48 74 +51bdc 4 49 74 +51be0 4 50 74 +51be4 2 45 74 +51be6 2 112 137 +51be8 6 481 106 +51bee 2 400 136 +51bf0 4 205 136 +51bf4 8 604 135 +51bfc 2 209 136 +51bfe 2 378 136 +51c00 4 608 135 +51c04 4 610 135 +51c08 2 158 106 +51c0a 2 347 106 +51c0c 2 158 106 +51c0e 6 134 124 +51c14 6 158 106 +51c1a 2 613 135 +51c1c 2 611 135 +51c1e 2 612 135 +51c20 4 613 135 +51c24 6 107 142 +51c2a 8 106 142 +51c32 4 107 142 +51c36 8 600 135 +51c3e 2 101 108 +51c40 2 380 136 +51c42 2 101 108 +51c44 10 54 74 +FUNC 51c54 6 0 google_breakpad::BasicCodeModules::module_count +51c54 2 85 67 +51c56 4 87 67 +FUNC 51c5a a 0 google_breakpad::BasicCodeModules::GetMainModule +51c5a a 101 67 +FUNC 51c64 6 0 google_breakpad::BasicCodeModules::GetModuleAtIndex +51c64 6 121 67 +FUNC 51c6a 24 0 google_breakpad::linked_ptr::depart +51c6a 2 83 70 +51c6c 2 156 70 +51c6e 6 83 70 +51c74 a 85 70 +51c7e 4 86 70 +51c82 4 156 70 +51c86 2 156 70 +51c88 6 156 70 +FUNC 51c8e 28 0 std::priv::_Rb_tree, std::pair >::Range>, std::priv::_Select1st >::Range> >, std::priv::_MapTraitsT >::Range> >, std::allocator >::Range> > >::_M_erase +51c8e 6 655 140 +51c94 2 657 140 +51c96 8 658 140 +51c9e 4 102 70 +51ca2 2 659 140 +51ca4 4 102 70 +51ca8 c 161 106 +51cb4 2 664 140 +FUNC 51cb8 2c 0 google_breakpad::BasicCodeModules::~BasicCodeModules +51cb8 2 81 67 +51cba 2 81 67 +51cbc 2 82 67 +51cbe 8 81 67 +51cc6 2 82 67 +51cc8 4 531 141 +51ccc 8 532 141 +51cd4 6 82 67 +51cda a 83 67 +FUNC 51ce4 12 0 google_breakpad::BasicCodeModules::~BasicCodeModules +51ce4 2 81 67 +51ce6 2 81 67 +51ce8 4 83 67 +51cec 6 83 67 +51cf2 4 83 67 +FUNC 51cf6 24 0 google_breakpad::linked_ptr::copy +51cf6 2 165 70 +51cf8 4 164 70 +51cfc 4 165 70 +51d00 2 166 70 +51d02 4 167 70 +51d06 a 75 70 +51d10 2 76 70 +51d12 4 77 70 +51d16 4 69 70 +FUNC 51d1c e8 0 google_breakpad::BasicCodeModules::GetModuleForAddress +51d1c 10 90 67 +51d2c 2 90 67 +51d2e 2 160 70 +51d30 2 92 67 +51d32 4 90 67 +51d36 2 568 141 +51d38 2 160 70 +51d3a 6 69 70 +51d40 2 571 141 +51d42 a 572 141 +51d4c 6 575 141 +51d52 2 573 141 +51d54 6 575 141 +51d5a a 125 75 +51d64 c 133 75 +51d70 a 106 70 +51d7a 6 117 70 +51d80 8 118 70 +51d88 8 102 70 +51d90 2 97 67 +51d92 16 93 67 +51da8 4 110 72 +51dac 2 333 127 +51dae 4 93 67 +51db2 8 333 127 +51dba a 93 67 +51dc4 8 93 67 +51dcc 6 156 137 +51dd2 6 93 67 +51dd8 2 94 67 +51dda 6 102 70 +51de0 24 98 67 +FUNC 51e04 3e 0 std::priv::_Rb_tree, std::pair >::Range>, std::priv::_Select1st >::Range> >, std::priv::_MapTraitsT >::Range> >, std::allocator >::Range> > >::_M_create_node +51e04 2 306 106 +51e06 2 315 141 +51e08 2 315 141 +51e0a 6 306 106 +51e10 4 158 106 +51e14 4 119 108 +51e18 2 158 106 +51e1a 2 119 108 +51e1c 4 68 129 +51e20 2 102 76 +51e22 4 68 129 +51e26 2 106 70 +51e28 8 102 76 +51e30 6 106 70 +51e36 2 321 141 +51e38 2 324 141 +51e3a 2 321 141 +51e3c 2 322 141 +51e3e 4 324 141 +FUNC 51e44 194 0 google_breakpad::BasicCodeModules::GetModuleAtSequence +51e44 4 105 67 +51e48 2 160 70 +51e4a 2 105 67 +51e4c 2 107 67 +51e4e 4 69 70 +51e52 2 184 75 +51e54 2 105 67 +51e56 2 184 75 +51e58 2 160 70 +51e5a 2 184 75 +51e5c 1a 185 75 +51e76 4 110 72 +51e7a a 333 127 +51e84 a 240 126 +51e8e 8 333 127 +51e96 8 240 126 +51e9e 6 185 75 +51ea4 16 108 67 +51eba 2 110 72 +51ebc a 333 127 +51ec6 c 181 127 +51ed2 6 199 126 +51ed8 2 142 141 +51eda 4 192 75 +51ede 4 297 140 +51ee2 a 94 141 +51eec 2 301 140 +51eee 6 302 140 +51ef4 6 304 140 +51efa 8 309 140 +51f02 4 192 75 +51f06 6 106 70 +51f0c 2 117 70 +51f0e 4 106 70 +51f12 6 117 70 +51f18 8 118 70 +51f20 8 102 70 +51f28 2 112 67 +51f2a 2 202 126 +51f2c 2 145 115 +51f2e 4 202 126 +51f32 2 145 115 +51f34 2 202 126 +51f36 6 145 115 +51f3c 8 351 122 +51f44 6 351 122 +51f4a 2 202 126 +51f4c 2 351 122 +51f4e c 202 126 +51f5a 16 57 128 +51f70 1c 72 125 +51f8c 6 202 126 +51f92 2 210 126 +51f94 e 211 126 +51fa2 6 212 126 +51fa8 6 108 67 +51fae 2 109 67 +51fb0 6 102 70 +51fb6 22 113 67 +FUNC 51fd8 80 0 std::priv::_Rb_tree, std::pair >::Range>, std::priv::_Select1st >::Range> >, std::priv::_MapTraitsT >::Range> >, std::allocator >::Range> > >::_M_insert +51fd8 2 358 140 +51fda 4 350 140 +51fde 8 350 140 +51fe6 2 358 140 +51fe8 6 359 140 +51fee 2 360 140 +51ff0 2 361 140 +51ff2 4 362 140 +51ff6 4 364 140 +51ffa 4 364 140 +51ffe 10 364 140 +5200e 4 367 140 +52012 2 368 140 +52014 4 369 140 +52018 2 367 140 +5201a 4 369 140 +5201e 6 370 140 +52024 4 373 140 +52028 2 374 140 +5202a 4 375 140 +5202e 2 373 140 +52030 4 375 140 +52034 4 376 140 +52038 2 379 140 +5203a 2 378 140 +5203c 8 379 140 +52044 4 380 140 +52048 2 382 140 +5204a 6 380 140 +52050 4 142 141 +52054 4 382 140 +FUNC 52058 218 0 google_breakpad::RangeMap >::StoreRange +52058 8 50 75 +52060 4 53 75 +52064 e 50 75 +52072 2 50 75 +52074 4 56 75 +52078 4 50 75 +5207c 4 53 75 +52080 2 50 75 +52082 a 56 75 +5208c 4 53 75 +52090 8 56 75 +52098 18 60 75 +520b0 4 110 72 +520b4 6 333 127 +520ba 4 60 75 +520be 4 333 127 +520c2 a 60 75 +520cc a 60 75 +520d6 2 333 127 +520d8 4 61 75 +520dc 6 333 127 +520e2 a 61 75 +520ec a 61 75 +520f6 2 333 127 +520f8 2 61 75 +520fa 6 333 127 +52100 a 61 75 +5210a 8 61 75 +52112 12 156 137 +52124 6 60 75 +5212a 6 63 75 +52130 2 568 141 +52132 2 569 141 +52134 2 571 141 +52136 a 572 141 +52140 6 575 141 +52146 2 573 141 +52148 6 575 141 +5214e 2 568 141 +52150 2 571 141 +52152 a 572 141 +5215c 6 575 141 +52162 2 573 141 +52164 6 575 141 +5216a 4 71 75 +5216e 4 90 75 +52172 c 91 75 +5217e 2 106 70 +52180 4 105 76 +52184 8 106 70 +5218c 4 102 76 +52190 4 62 129 +52194 6 106 70 +5219a 4 102 76 +5219e 8 106 70 +521a6 2 568 141 +521a8 2 408 140 +521aa 2 407 140 +521ac 2 409 140 +521ae a 412 140 +521b8 4 412 140 +521bc 4 412 140 +521c0 4 412 140 +521c4 6 412 140 +521ca 2 409 140 +521cc 4 142 141 +521d0 2 415 140 +521d2 6 416 140 +521d8 8 417 140 +521e0 6 279 140 +521e6 a 279 140 +521f0 6 280 140 +521f6 6 281 140 +521fc 8 99 141 +52204 4 285 140 +52208 6 286 140 +5220e 6 288 140 +52214 4 187 141 +52218 c 421 140 +52224 10 422 140 +52234 c 102 70 +52240 2 113 75 +52242 2e 114 75 +FUNC 52270 174 0 google_breakpad::BasicCodeModules::BasicCodeModules +52270 12 48 67 +52282 2 48 67 +52284 2 50 67 +52286 2 48 67 +52288 2 50 67 +5228a 2 48 67 +5228c c 50 67 +52298 2 50 67 +5229a 2 48 67 +5229c 6 50 67 +522a2 4 55 76 +522a6 4 50 67 +522aa 2 52 67 +522ac 1c 52 67 +522c8 a 333 127 +522d2 6 52 67 +522d8 8 55 67 +522e0 2 56 67 +522e2 a 57 67 +522ec 8 59 67 +522f4 2 60 67 +522f6 2 70 67 +522f8 2 59 67 +522fa 4 70 67 +522fe c 333 127 +5230a 6 60 67 +52310 c 68 67 +5231c 4 160 70 +52320 4 68 67 +52324 2 69 70 +52326 4 160 70 +5232a 2 69 70 +5232c 4 69 67 +52330 4 69 67 +52334 6 69 67 +5233a 4 69 67 +5233e 2 69 67 +52340 4 69 67 +52344 2 69 67 +52346 4 69 67 +5234a a 69 67 +52354 2 69 67 +52356 18 70 67 +5236e 4 110 72 +52372 a 333 127 +5237c 2 70 67 +5237e 2 70 67 +52380 6 70 67 +52386 8 70 67 +5238e 6 333 127 +52394 6 156 137 +5239a 6 70 67 +523a0 6 102 70 +523a6 4 60 67 +523aa 3a 74 67 +FUNC 523e4 16 0 google_breakpad::BasicCodeModules::Copy +523e4 2 124 67 +523e6 2 124 67 +523e8 8 125 67 +523f0 6 125 67 +523f6 4 126 67 +FUNC 523fc 2c 0 CxaThreadKey::freeObject +523fc 2 251 159 +523fe 2 251 159 +52400 2 141 159 +52402 8 144 159 +5240a 6 68 159 +52410 2 146 159 +52412 2 72 159 +52414 2 146 159 +52416 2 147 159 +52418 4 253 159 +5241c c 72 159 +FUNC 52428 58 0 CxaThreadKey::~CxaThreadKey +52428 2 217 159 +5242a 2 217 159 +5242c c 116 159 +52438 4 117 159 +5243c 2 119 159 +5243e 6 121 159 +52444 2 119 159 +52446 2 120 159 +52448 4 121 159 +5244c 6 117 159 +52452 c 123 159 +5245e 6 124 159 +52464 a 219 159 +5246e 12 220 159 +FUNC 52480 18 0 __cxxabiv1::__shim_type_info::~__shim_type_info +52480 4 278 159 +52484 8 278 159 +5248c c 279 159 +FUNC 52498 12 0 __cxxabiv1::__shim_type_info::~__shim_type_info +52498 2 278 159 +5249a 2 278 159 +5249c 4 279 159 +524a0 6 279 159 +524a6 4 279 159 +FUNC 524ac 10 0 __cxxabiv1::__cxa_pure_virtual +524ac 2 282 159 +524ae 2 281 159 +524b0 c 282 159 +FUNC 524bc f8 0 __cxxabiv1::__cxa_get_globals +524bc 2 228 159 +524be 2 289 159 +524c0 4 228 159 +524c4 2 289 159 +524c6 6 228 159 +524cc 2 229 159 +524ce 6 291 159 +524d4 6 129 159 +524da 4 68 159 +524de a 131 159 +524e8 2 135 159 +524ea 2 136 159 +524ec 6 135 159 +524f2 6 136 159 +524f8 6 129 159 +524fe 4 72 159 +52502 4 239 159 +52506 e 244 159 +52514 16 156 159 +5252a 4 157 159 +5252e 8 161 159 +52536 2 167 159 +52538 2 161 159 +5253a 2 162 159 +5253c 6 167 159 +52542 2 167 159 +52544 2 167 159 +52546 2 168 159 +52548 2 167 159 +5254a 2 169 159 +5254c 2 170 159 +5254e 2 167 159 +52550 c 172 159 +5255c 6 167 159 +52562 c 129 159 +5256e 8 72 159 +52576 a 290 159 +52580 8 242 159 +52588 2c 289 159 +FUNC 525b4 2c 0 throwException +525b4 2 262 159 +525b6 2 262 159 +525b8 4 263 159 +525bc 4 268 159 +525c0 2 263 159 +525c2 6 264 159 +525c8 4 265 159 +525cc 4 266 159 +525d0 2 265 159 +525d2 2 268 159 +525d4 2 266 159 +525d6 4 268 159 +525da 6 271 159 +FUNC 525e0 20 0 __cxxabiv1::__cxa_get_globals_fast +525e0 2 223 159 +525e2 2 293 159 +525e4 8 223 159 +525ec 2 295 159 +525ee 8 294 159 +525f6 a 293 159 +FUNC 52600 34 0 __cxxabiv1::__cxa_allocate_exception +52600 2 297 159 +52602 2 298 159 +52604 6 299 159 +5260a 2 300 159 +5260c 8 307 159 +52614 4 308 159 +52618 2 309 159 +5261a 8 304 159 +52622 8 308 159 +5262a a 297 159 +FUNC 52634 40 0 __cxxabiv1::__cxa_free_exception +52634 2 311 159 +52636 2 311 159 +52638 6 314 159 +5263e 2 316 159 +52640 4 312 159 +52644 4 323 159 +52648 4 322 159 +5264c 4 317 159 +52650 c 318 159 +5265c 8 317 159 +52664 4 318 159 +52668 c 311 159 +FUNC 52674 8 0 defaultExceptionCleanupFunc +52674 4 51 159 +52678 4 51 159 +FUNC 52680 34 0 __cxxabiv1::__cxa_throw +52680 2 327 159 +52682 2 327 159 +52684 6 332 159 +5268a 4 328 159 +5268e 2 333 159 +52690 4 329 159 +52694 2 333 159 +52696 4 332 159 +5269a 4 330 159 +5269e 4 333 159 +526a2 12 335 159 +FUNC 526b8 44 0 __cxxabiv1::__cxa_rethrow +526b8 2 338 159 +526ba 4 339 159 +526be 2 340 159 +526c0 2 342 159 +526c2 14 347 159 +526d6 4 350 159 +526da 6 353 159 +526e0 8 348 159 +526e8 14 344 159 +FUNC 52700 74 0 __cxxabiv1::__cxa_begin_catch +52700 2 356 159 +52702 2 356 159 +52704 4 359 159 +52708 12 361 159 +5271a 2 362 159 +5271c 2 361 159 +5271e 2 362 159 +52720 4 369 159 +52724 4 358 159 +52728 2 369 159 +5272a 6 369 159 +52730 2 369 159 +52732 4 369 159 +52736 4 377 159 +5273a 2 371 159 +5273c 6 372 159 +52742 2 373 159 +52744 6 375 159 +5274a 4 378 159 +5274e 8 363 159 +52756 8 377 159 +5275e 16 356 159 +FUNC 52778 7c 0 __cxxabiv1::__cxa_end_catch +52778 2 380 159 +5277a 4 381 159 +5277e 2 382 159 +52780 2 385 159 +52782 14 389 159 +52796 2 383 159 +52798 4 390 159 +5279c a 391 159 +527a6 2 395 159 +527a8 4 396 159 +527ac 4 400 159 +527b0 4 404 159 +527b4 4 408 159 +527b8 4 397 159 +527bc 6 398 159 +527c2 2 401 159 +527c4 2 402 159 +527c6 2 401 159 +527c8 2 402 159 +527ca 4 409 159 +527ce 4 402 159 +527d2 8 405 159 +527da 8 408 159 +527e2 12 380 159 +FUNC 527f8 8 0 operator delete(void*) +527f8 2 37 161 +527fa 6 38 161 +FUNC 52800 4 0 operator delete[](void*) +52800 4 44 161 +FUNC 52804 10 0 std::bad_exception::~bad_exception +FUNC 52804 10 0 std::exception::exception +FUNC 52804 10 0 std::exception::~exception +52804 8 36 164 +5280c 8 41 164 +FUNC 52814 c 0 std::exception::what() const +52814 4 44 164 +52818 8 45 164 +FUNC 52820 c 0 std::bad_exception::what() const +52820 4 56 164 +52824 8 57 164 +FUNC 5282c 18 0 std::bad_exception::~bad_exception +5282c 2 40 164 +5282e 2 40 164 +52830 2 40 164 +52832 6 40 164 +52838 4 53 164 +5283c 8 53 164 +FUNC 5282c 18 0 std::exception::~exception +FUNC 52844 10 0 std::bad_exception::bad_exception +52844 8 48 164 +5284c 8 49 164 +FUNC 52854 10 0 std::uncaught_exception() +52854 2 60 164 +52856 4 63 164 +5285a 2 64 164 +5285c 6 64 164 +52862 2 65 164 +FUNC 52864 5c 0 __gabixx::__fatal_error(char const*) +52864 2 36 165 +52866 2 41 165 +52868 4 36 165 +5286c 10 41 165 +5287c c 65 165 +52888 2 67 165 +5288a a 68 165 +52894 2 69 165 +52896 a 70 165 +528a0 6 72 165 +528a6 1a 75 165 +FUNC 528c0 a 0 __cxxabiv1::call_terminate(_Unwind_Control_Block*) +528c0 2 52 166 +528c2 4 53 166 +528c6 4 54 166 +FUNC 528cc a 0 __cxxabiv1::decodeRelocTarget2 +528cc 2 292 166 +528ce 2 293 166 +528d0 2 298 166 +528d2 4 300 166 +FUNC 528d8 1a 0 __cxxabiv1::getTypePtr(unsigned long long, unsigned char const*, unsigned char, _Unwind_Control_Block*) +528d8 2 305 166 +528da 2 306 166 +528dc 4 309 166 +528e0 2 292 166 +528e2 2 293 166 +528e4 4 298 166 +528e8 2 293 166 +528ea 2 311 166 +528ec 6 307 166 +FUNC 528f4 3c 0 __cxxabiv1::canExceptionSpecCatch(long long, unsigned char const*, unsigned char, std::type_info const*, void*, _Unwind_Control_Block*) +528f4 2 324 166 +528f6 4 318 166 +528fa 4 325 166 +528fe 2 318 166 +52900 2 313 166 +52902 2 318 166 +52904 4 319 166 +52908 2 334 166 +5290a 2 336 166 +5290c 2 335 166 +5290e 2 336 166 +52910 2 337 166 +52912 6 336 166 +52918 4 328 166 +5291c 4 329 166 +52920 2 341 166 +52922 4 342 166 +52926 4 338 166 +5292a 6 320 166 +FUNC 52930 2b4 0 __cxxabiv1::scanEHTable(__cxxabiv1::ScanResultInternal&, int, bool, _Unwind_Control_Block*, _Unwind_Context*) +52930 6 62 166 +52936 2 62 166 +52938 2 64 166 +5293a 2 65 166 +5293c 2 64 166 +5293e 2 62 166 +52940 2 69 166 +52942 4 64 166 +52946 4 72 166 +5294a 2 65 166 +5294c 2 62 166 +5294e 2 66 166 +52950 2 67 166 +52952 2 62 166 +52954 2 68 166 +52956 2 69 166 +52958 2 62 166 +5295a 6 72 166 +52960 8 73 166 +52968 8 89 166 +52970 6 90 166 +52976 4 150 156 +5297a 2 95 166 +5297c c 150 156 +52988 2 159 156 +5298a 2 97 166 +5298c 2 100 166 +5298e 4 159 156 +52992 4 97 166 +52996 2 100 166 +52998 4 96 166 +5299c 8 100 166 +529a4 2 97 166 +529a6 4 98 166 +529aa 6 101 166 +529b0 2 105 166 +529b2 8 103 166 +529ba 4 105 166 +529be 2 103 166 +529c0 2 106 166 +529c2 4 105 166 +529c6 4 106 166 +529ca 6 107 166 +529d0 6 108 166 +529d6 4 110 166 +529da 2 111 166 +529dc 2 115 166 +529de 2 110 166 +529e0 4 111 166 +529e4 2 112 166 +529e6 4 115 166 +529ea 2 113 166 +529ec 4 118 166 +529f0 8 119 166 +529f8 2 120 166 +529fa 2 119 166 +529fc 6 120 166 +52a02 2 121 166 +52a04 2 120 166 +52a06 8 121 166 +52a0e 6 122 166 +52a14 6 123 166 +52a1a 6 279 166 +52a20 8 124 166 +52a28 8 130 166 +52a30 6 131 166 +52a36 2 251 166 +52a38 4 144 166 +52a3c 2 58 166 +52a3e 2 144 166 +52a40 4 251 166 +52a44 2 144 166 +52a46 4 58 166 +52a4a 4 144 166 +52a4e 2 251 166 +52a50 2 58 166 +52a52 8 144 166 +52a5a 10 153 166 +52a6a 4 154 166 +52a6e 4 172 166 +52a72 4 176 166 +52a76 6 174 166 +52a7c 18 177 166 +52a94 12 183 166 +52aa6 6 184 166 +52aac e 188 166 +52aba 8 189 166 +52ac2 6 243 166 +52ac8 8 262 166 +52ad0 4 263 166 +52ad4 4 264 166 +52ad8 6 271 166 +52ade 6 147 166 +52ae4 4 148 166 +52ae8 4 147 166 +52aec 6 148 166 +52af2 6 204 166 +52af8 8 251 166 +52b00 4 255 166 +52b04 4 252 166 +52b08 2 254 166 +52b0a 2 255 166 +52b0c 2 256 166 +52b0e 2 253 166 +52b10 2 254 166 +52b12 2 256 166 +52b14 6 280 166 +52b1a 6 77 166 +52b20 a 78 166 +52b2a 4 79 166 +52b2e 4 80 166 +52b32 4 266 166 +52b36 2 267 166 +52b38 8 123 166 +52b40 4 275 166 +52b44 6 99 166 +52b4a a 132 166 +52b54 2 135 166 +52b56 8 134 166 +52b5e 4 136 166 +52b62 2 135 166 +52b64 2 137 166 +52b66 8 235 166 +52b6e 6 206 166 +52b74 4 210 166 +52b78 4 209 166 +52b7c 18 210 166 +52b94 16 216 166 +52baa 8 219 166 +52bb2 2 225 166 +52bb4 4 221 166 +52bb8 2 223 166 +52bba 2 222 166 +52bbc 4 224 166 +52bc0 2 223 166 +52bc2 2 225 166 +52bc4 4 226 166 +52bc8 2 194 166 +52bca 4 191 166 +52bce 2 193 166 +52bd0 2 194 166 +52bd2 2 195 166 +52bd4 2 192 166 +52bd6 2 193 166 +52bd8 2 195 166 +52bda a 196 166 +FUNC 52be4 5c 0 __cxxabiv1::setRegisters(_Unwind_Control_Block*, _Unwind_Context*, __cxxabiv1::ScanResultInternal const&) +52be4 6 350 166 +52bea 2 155 156 +52bec 6 350 166 +52bf2 6 155 156 +52bf8 4 350 166 +52bfc 6 155 156 +52c02 2 352 166 +52c04 a 155 156 +52c0e 2 352 166 +52c10 4 155 156 +52c14 6 150 156 +52c1a 2 353 166 +52c1c 8 150 156 +52c24 2 163 156 +52c26 4 155 156 +52c2a 4 163 156 +52c2e 2 155 156 +52c30 2 164 156 +52c32 4 155 156 +52c36 2 150 156 +52c38 4 155 156 +52c3c 4 354 166 +FUNC 52c40 10 0 __cxxabiv1::continueUnwinding(_Unwind_Control_Block*, _Unwind_Context*) +52c40 2 357 166 +52c42 4 358 166 +52c46 8 359 166 +52c4e 2 362 166 +FUNC 52c50 2c 0 __cxxabiv1::saveDataToBarrierCache(_Unwind_Control_Block*, _Unwind_Context*, __cxxabiv1::ScanResultInternal const&) +52c50 4 366 166 +52c54 4 150 156 +52c58 2 366 166 +52c5a 2 366 166 +52c5c c 150 156 +52c68 2 368 166 +52c6a 2 369 166 +52c6c 2 370 166 +52c6e 2 368 166 +52c70 2 367 166 +52c72 2 369 166 +52c74 2 370 166 +52c76 2 367 166 +52c78 4 371 166 +FUNC 52c7c 16 0 __cxxabiv1::loadDataFromBarrierCache(_Unwind_Control_Block*, __cxxabiv1::ScanResultInternal&) +52c7c 2 376 166 +52c7e 2 377 166 +52c80 2 374 166 +52c82 2 375 166 +52c84 4 376 166 +52c88 2 377 166 +52c8a 2 375 166 +52c8c 2 376 166 +52c8e 4 378 166 +FUNC 52c94 4 0 __cxxabiv1::prepareBeginCleanup(_Unwind_Control_Block*) +52c94 4 381 166 +FUNC 52c98 6e 0 __cxxabiv1::saveUnexpectedDataToBarrierCache(_Unwind_Control_Block*, _Unwind_Context*, __cxxabiv1::ScanResultInternal const&) +52c98 6 386 166 +52c9e 4 386 166 +52ca2 4 387 166 +52ca6 2 389 166 +52ca8 2 391 166 +52caa 4 389 166 +52cae 2 391 166 +52cb0 2 389 166 +52cb2 8 391 166 +52cba 6 393 166 +52cc0 6 395 166 +52cc6 2 396 166 +52cc8 2 390 166 +52cca 4 396 166 +52cce 2 397 166 +52cd0 2 396 166 +52cd2 2 397 166 +52cd4 6 398 166 +52cda 4 399 166 +52cde 4 402 166 +52ce2 4 404 166 +52ce6 4 402 166 +52cea 2 404 166 +52cec 2 403 166 +52cee 6 404 166 +52cf4 2 405 166 +52cf6 4 404 166 +52cfa 2 408 166 +52cfc 2 409 166 +52cfe 2 410 166 +52d00 2 409 166 +52d02 4 411 166 +FUNC 52d08 c 0 std::bad_alloc::what() const +52d08 4 51 167 +52d0c 8 52 167 +FUNC 52d14 18 0 std::bad_alloc::~bad_alloc +52d14 4 47 167 +52d18 8 47 167 +52d20 c 48 167 +FUNC 52d2c 12 0 std::bad_alloc::~bad_alloc +52d2c 2 47 167 +52d2e 2 47 167 +52d30 4 48 167 +52d34 6 48 167 +52d3a 4 48 167 +FUNC 52d40 18 0 std::bad_alloc::bad_alloc +52d40 2 44 167 +52d42 8 44 167 +52d4a 2 45 167 +52d4c 6 44 167 +52d52 6 45 167 +FUNC 52d58 2c 0 std::get_new_handler() +52d58 24 90 167 +52d7c 8 91 167 +FUNC 52d84 48 0 operator new(unsigned int) +52d84 2 96 167 +52d86 4 96 167 +52d8a 4 103 167 +52d8e 2 104 167 +52d90 2 107 167 +52d92 6 99 167 +52d98 4 100 167 +52d9c 2 110 167 +52d9e 1a 105 167 +52db8 8 107 167 +52dc0 c 96 167 +FUNC 52dcc 14 0 operator new[](unsigned int) +52dcc 2 123 167 +52dce 4 124 167 +52dd2 2 125 167 +52dd4 8 124 167 +52ddc 4 123 167 +FUNC 52de0 168 0 __cxxabiv1::__gxx_personality_v0 +52de0 e 56 169 +52dee c 56 169 +52dfa 2 56 169 +52dfc 6 155 156 +52e02 2 56 169 +52e04 8 155 156 +52e0c 4 57 169 +52e10 18 61 169 +52e28 4 67 169 +52e2c 4 88 169 +52e30 4 89 169 +52e34 4 90 169 +52e38 4 97 169 +52e3c 4 98 169 +52e40 4 93 169 +52e44 4 94 169 +52e48 2 95 169 +52e4a 2 98 169 +52e4c 2 96 169 +52e4e 2 98 169 +52e50 6 93 169 +52e56 2 94 169 +52e58 2 97 169 +52e5a 4 98 169 +52e5e a 106 169 +52e68 a 109 169 +52e72 4 110 169 +52e76 4 56 169 +52e7a 2 56 169 +52e7c 6 126 169 +52e82 e 68 169 +52e90 6 69 169 +52e96 a 121 169 +52ea0 4 125 169 +52ea4 6 150 156 +52eaa 2 56 169 +52eac a 150 156 +52eb6 c 56 169 +52ec2 2 80 169 +52ec4 4 71 169 +52ec8 2 73 169 +52eca 6 78 169 +52ed0 4 73 169 +52ed4 6 74 169 +52eda 6 75 169 +52ee0 6 76 169 +52ee6 6 77 169 +52eec 4 78 169 +52ef0 4 80 169 +52ef4 e 114 169 +52f02 6 115 169 +52f08 a 117 169 +52f12 6 118 169 +52f18 4 119 169 +52f1c 12 100 169 +52f2e 6 102 169 +52f34 14 103 169 +FUNC 52f48 18 0 __cxxabiv1::__si_class_type_info::~__si_class_type_info +52f48 4 34 170 +52f4c 8 34 170 +52f54 c 36 170 +FUNC 52f60 12 0 __cxxabiv1::__si_class_type_info::~__si_class_type_info +52f60 2 34 170 +52f62 2 34 170 +52f64 4 36 170 +52f68 6 36 170 +52f6e 4 36 170 +FUNC 52f74 24 0 __cxxabiv1::__si_class_type_info::walk_to(__cxxabiv1::__class_type_info const*, void*&, __cxxabiv1::__UpcastInfo&) const +52f74 2 40 170 +52f76 8 40 170 +52f7e 6 41 170 +52f84 2 42 170 +52f86 2 46 170 +52f88 10 45 170 +FUNC 52f98 12 0 __gabixx::__default_terminate() +52f98 2 68 171 +52f9a c 72 171 +52fa6 4 75 171 +FUNC 52fac 24 0 __gabixx::__terminate(void (*)()) +52fac 2 78 171 +52fae 2 79 171 +52fb0 2 84 171 +52fb2 4 91 171 +52fb6 4 80 171 +52fba 4 84 171 +52fbe 8 85 171 +52fc6 a 91 171 +FUNC 52fd0 2c 0 std::get_terminate() +52fd0 24 99 171 +52ff4 8 100 171 +FUNC 52ffc a 0 std::terminate() +52ffc 2 109 171 +52ffe 8 110 171 +FUNC 53008 6 0 __gabixx::__default_unexpected() +53008 2 46 171 +5300a 4 47 171 +FUNC 53010 2c 0 std::get_unexpected() +53010 24 114 171 +53034 8 115 171 +FUNC 5303c e 0 std::unexpected() +5303c 2 124 171 +5303e 4 125 171 +53042 2 126 171 +53044 2 127 171 +53046 4 130 171 +FUNC 5304c 10 0 std::type_info::~type_info +5304c 8 42 172 +53054 8 44 172 +FUNC 5305c c 0 std::bad_cast::what() const +5305c 4 85 172 +53060 8 86 172 +FUNC 53068 18 0 std::type_info::~type_info +53068 4 42 172 +5306c 8 42 172 +53074 4 44 172 +53078 8 44 172 +FUNC 53080 18 0 std::bad_cast::~bad_cast +53080 4 81 172 +53084 8 81 172 +5308c c 82 172 +FUNC 53098 12 0 std::bad_cast::~bad_cast +53098 2 81 172 +5309a 2 81 172 +5309c 4 82 172 +530a0 6 82 172 +530a6 4 82 172 +FUNC 530ac 14 0 std::type_info::operator==(std::type_info const&) const +530ac 2 49 172 +530ae 8 53 172 +530b6 8 53 172 +530be 2 57 172 +FUNC 530c0 e 0 std::type_info::operator!=(std::type_info const&) const +530c0 2 61 172 +530c2 8 62 172 +530ca 2 62 172 +530cc 2 63 172 +FUNC 530d0 18 0 std::bad_cast::bad_cast +530d0 2 78 172 +530d2 8 78 172 +530da 2 79 172 +530dc 6 78 172 +530e2 6 79 172 +FUNC 530e8 6 0 std::__Named_exception::what() const +530e8 4 95 233 +530ec 2 95 233 +FUNC 530f0 2c 0 std::__Named_exception::~__Named_exception +530f0 4 89 233 +530f4 2 89 233 +530f6 6 90 233 +530fc 6 89 233 +53102 2 90 233 +53104 2 89 233 +53106 2 90 233 +53108 4 91 233 +5310c 10 92 233 +FUNC 5311c 1c 0 std::logic_error::~logic_error +5311c 4 76 181 +53120 18 76 181 +FUNC 53138 1c 0 std::out_of_range::~out_of_range +53138 4 81 181 +5313c 18 81 181 +FUNC 53154 12 0 std::out_of_range::~out_of_range +53154 2 81 181 +53156 6 81 181 +5315c 6 81 181 +53162 4 81 181 +FUNC 53168 1c 0 std::length_error::~length_error +53168 4 80 181 +5316c 18 80 181 +FUNC 53184 12 0 std::length_error::~length_error +53184 2 80 181 +53186 6 80 181 +5318c 6 80 181 +53192 4 80 181 +FUNC 53198 12 0 std::logic_error::~logic_error +53198 2 76 181 +5319a 6 76 181 +531a0 6 76 181 +531a6 4 76 181 +FUNC 531ac 12 0 std::__Named_exception::~__Named_exception +531ac 2 89 233 +531ae 2 89 233 +531b0 4 92 233 +531b4 6 92 233 +531ba 4 92 233 +FUNC 531c0 74 0 std::__Named_exception::__Named_exception +531c0 4 19 233 +531c4 8 19 233 +531cc 4 20 233 +531d0 6 19 233 +531d6 2 20 233 +531d8 4 19 233 +531dc 8 20 233 +531e4 6 21 233 +531ea 8 32 233 +531f2 8 35 233 +531fa 6 36 233 +53200 2 40 233 +53202 2 36 233 +53204 4 40 233 +53208 a 22 233 +53212 2 23 233 +53214 a 28 233 +5321e 16 25 233 +FUNC 53234 24 0 std::priv::_String_base >::~_String_base +53234 2 156 238 +53236 2 156 238 +53238 2 64 238 +5323a 4 96 238 +5323e 2 96 238 +53240 4 97 238 +53244 4 161 201 +53248 4 161 201 +5324c 4 156 238 +53250 4 135 222 +53254 4 156 238 +FUNC 53258 40 0 std::basic_string, std::allocator >::basic_string +53258 2 639 236 +5325a 2 639 236 +5325c 2 112 238 +5325e 2 229 246 +53260 2 481 201 +53262 2 639 236 +53264 4 229 246 +53268 2 643 236 +5326a 2 379 237 +5326c 2 378 237 +5326e 6 379 237 +53274 2 107 243 +53276 2 66 238 +53278 2 107 243 +5327a 8 106 243 +53282 2 107 243 +53284 2 380 237 +53286 4 101 205 +5328a 4 644 236 +5328e a 643 236 +FUNC 53298 60 0 std::__stl_throw_out_of_range(char const*) +53298 6 70 231 +5329e 12 70 231 +532b0 a 34 232 +532ba 2 121 237 +532bc 8 74 232 +532c4 6 121 237 +532ca 10 70 231 +532da a 70 231 +532e4 14 121 237 +FUNC 532f8 60 0 std::__stl_throw_length_error(char const*) +532f8 6 73 231 +532fe 12 73 231 +53310 a 34 232 +5331a 2 121 237 +5331c 8 66 232 +53324 6 121 237 +5332a 10 73 231 +5333a a 73 231 +53344 14 121 237 +FUNC 53358 10 0 std::_Filebuf_base::_Filebuf_base +53358 e 128 180 +53366 2 129 180 +FUNC 53368 18 0 std::_Filebuf_base::_S_initialize() +53368 2 132 180 +5336a e 144 180 +53378 8 146 180 +FUNC 53380 32 0 std::_Filebuf_base::_M_file_size() +53380 4 151 180 +53384 a 114 180 +5338e c 114 180 +5339a 4 153 180 +5339e 4 111 180 +533a2 10 115 180 +FUNC 533b4 e0 0 std::_Filebuf_base::_M_open(char const*, int, long) +533b4 4 157 180 +533b8 2 160 180 +533ba 2 157 180 +533bc 4 157 180 +533c0 2 160 180 +533c2 46 166 180 +53408 2 196 180 +5340a 4 212 180 +5340e 4 183 180 +53412 6 193 180 +53418 2 195 180 +5341a 2 193 180 +5341c 2 195 180 +5341e 2 198 180 +53420 2 200 180 +53422 2 198 180 +53424 2 200 180 +53426 2 204 180 +53428 2 205 180 +5342a 2 206 180 +5342c 2 208 180 +5342e 8 211 180 +53436 6 173 180 +5343c 2 176 180 +5343e 2 177 180 +53440 2 178 180 +53442 4 187 180 +53446 2 188 180 +53448 6 169 180 +5344e 2 180 180 +53450 2 181 180 +53452 c 106 180 +5345e 6 106 180 +53464 a 106 180 +5346e 6 209 180 +53474 12 200 180 +53486 2 201 180 +53488 2 204 180 +5348a 2 201 180 +5348c 2 206 180 +5348e 2 205 180 +53490 4 206 180 +FUNC 53494 8 0 std::_Filebuf_base::_M_open(char const*, int) +53494 4 221 180 +53498 4 221 180 +FUNC 5349c 78 0 std::_Filebuf_base::_M_open(int, int) +5349c 4 228 180 +534a0 2 229 180 +534a2 2 228 180 +534a4 2 228 180 +534a6 c 229 180 +534b2 2 230 180 +534b4 4 244 180 +534b8 8 232 180 +534c0 2 234 180 +534c2 4 235 180 +534c6 2 234 180 +534c8 4 82 180 +534cc 4 234 180 +534d0 2 94 180 +534d2 2 106 180 +534d4 6 95 180 +534da 2 106 180 +534dc 4 238 180 +534e0 2 240 180 +534e2 2 241 180 +534e4 2 240 180 +534e6 2 241 180 +534e8 6 106 180 +534ee 6 106 180 +534f4 a 106 180 +534fe 2 242 180 +53500 4 243 180 +53504 10 234 180 +FUNC 53514 28 0 std::_Filebuf_base::_M_close() +53514 2 247 180 +53516 2 247 180 +53518 4 248 180 +5351c 2 251 180 +5351e 2 251 180 +53520 2 251 180 +53522 6 253 180 +53528 2 254 180 +5352a 2 256 180 +5352c 6 251 180 +53532 a 251 180 +FUNC 5353c 6 0 std::_Filebuf_base::_M_read(char*, int) +5353c 2 262 180 +5353e 4 262 180 +FUNC 53544 34 0 std::_Filebuf_base::_M_write(char*, int) +53544 2 268 180 +53546 8 268 180 +5354e c 276 180 +5355a a 270 180 +53564 2 272 180 +53566 2 278 180 +53568 6 276 180 +5356e 4 277 180 +53572 2 272 180 +53574 2 273 180 +53576 2 283 180 +FUNC 53578 42 0 std::_Filebuf_base::_M_seek(long, int) +53578 2 290 180 +5357a 6 287 180 +53580 a 290 180 +5358a 8 309 180 +53592 2 294 180 +53594 4 292 180 +53598 2 308 180 +5359a 6 309 180 +535a0 4 308 180 +535a4 8 300 180 +535ac 2 302 180 +535ae 8 300 180 +535b6 4 297 180 +FUNC 535bc 8 0 std::_Filebuf_base::_M_unmap(void*, long) +535bc 4 340 180 +535c0 4 340 180 +FUNC 535c4 48 0 std::_Filebuf_base::_M_mmap(long, long) +535c4 4 317 180 +535c8 2 320 180 +535ca 2 317 180 +535cc 4 320 180 +535d0 4 317 180 +535d4 c 320 180 +535e0 2 321 180 +535e2 2 320 180 +535e4 2 321 180 +535e6 e 322 180 +535f4 6 334 180 +535fa 4 327 180 +535fe 6 323 180 +53604 2 324 180 +53606 6 323 180 +FUNC 5360c 128 0 std::basic_filebuf >::_M_underflow_aux() +5360c 2 498 207 +5360e 6 495 207 +53614 2 502 207 +53616 2 495 207 +53618 2 502 207 +5361a 2 498 207 +5361c 2 504 207 +5361e 8 502 207 +53626 2 509 207 +53628 2 502 207 +5362a 8 224 200 +53632 2 504 207 +53634 4 537 207 +53638 8 213 203 +53640 c 515 207 +5364c 2 516 207 +5364e 2 515 207 +53650 2 516 207 +53652 2 522 207 +53654 2 525 207 +53656 4 522 207 +5365a 4 525 207 +5365e 2 537 207 +53660 18 213 203 +53678 4 547 207 +5367c 4 549 207 +53680 8 549 207 +53688 8 549 207 +53690 8 549 207 +53698 4 549 207 +5369c 2 555 207 +5369e 2 93 235 +536a0 2 555 207 +536a2 2 94 235 +536a4 2 95 235 +536a6 2 223 246 +536a8 6 568 207 +536ae 10 549 207 +536be 4 119 207 +536c2 8 120 207 +536ca 4 121 207 +536ce 2 122 207 +536d0 2 124 207 +536d2 2 488 207 +536d4 4 124 207 +536d8 4 553 207 +536dc 4 487 207 +536e0 4 488 207 +536e4 2 93 235 +536e6 2 94 235 +536e8 2 95 235 +536ea 2 553 207 +536ec 6 549 207 +536f2 6 549 207 +536f8 6 563 207 +536fe 4 565 207 +53702 2 93 235 +53704 2 94 235 +53706 2 95 235 +53708 2 565 207 +5370a c 224 200 +53716 2 93 235 +53718 4 527 207 +5371c 2 93 235 +5371e 2 94 235 +53720 2 95 235 +53722 2 527 207 +53724 2 328 208 +53726 2 327 208 +53728 2 93 235 +5372a 2 327 208 +5372c 2 94 235 +5372e 2 95 235 +53730 2 223 246 +53732 2 548 207 +FUNC 53734 5c 0 std::basic_filebuf >::_M_switch_to_input_mode() +53734 2 429 207 +53736 2 429 207 +53738 6 430 207 +5373e 8 430 207 +53746 2 430 207 +53748 2 444 207 +5374a 2 430 207 +5374c 4 432 207 +53750 2 435 207 +53752 2 440 207 +53754 2 438 207 +53756 2 441 207 +53758 4 440 207 +5375c 2 435 207 +5375e 2 436 207 +53760 2 438 207 +53762 2 441 207 +53764 4 445 207 +53768 6 128 208 +5376e c 680 207 +5377a 2 681 207 +5377c 4 680 207 +53780 6 681 207 +53786 a 432 207 +FUNC 53790 ec 0 std::_Underflow >::_M_doit(std::basic_filebuf >*) +53790 4 38 182 +53794 2 38 182 +53796 6 42 182 +5379c 6 46 182 +537a2 2 93 235 +537a4 4 220 208 +537a8 2 93 235 +537aa 2 221 208 +537ac 2 48 182 +537ae 2 94 235 +537b0 2 95 235 +537b2 4 221 208 +537b6 2 48 182 +537b8 2 223 246 +537ba 4 50 182 +537be 8 43 182 +537c6 8 57 182 +537ce 8 57 182 +537d6 8 61 182 +537de c 62 182 +537ea c 66 182 +537f6 6 67 182 +537fc 2 68 182 +537fe 2 67 182 +53800 12 68 182 +53812 6 68 182 +53818 2 69 182 +5381a 6 128 208 +53820 a 69 182 +5382a 2 77 182 +5382c 6 72 182 +53832 4 74 182 +53836 2 77 182 +53838 8 75 182 +53840 8 77 182 +53848 2 70 182 +5384a 4 80 182 +5384e 2 93 235 +53850 2 80 182 +53852 2 94 235 +53854 2 95 235 +53856 2 223 246 +53858 4 81 182 +5385c 4 87 182 +53860 2 88 182 +53862 2 92 182 +53864 4 93 182 +53868 4 92 182 +5386c 4 44 182 +53870 4 93 182 +53874 8 84 182 +FUNC 5387c 1c 0 std::ios_base::failure::~failure +5387c 4 41 183 +53880 18 41 183 +FUNC 53898 12 0 std::ios_base::failure::~failure +53898 2 41 183 +5389a 6 41 183 +538a0 6 41 183 +538a6 4 41 183 +FUNC 538ac 1c 0 std::ios_base::failure::failure +538ac 2 37 183 +538ae 2 37 183 +538b0 6 38 183 +538b6 2 39 183 +538b8 8 38 183 +538c0 8 39 183 +FUNC 538c8 28 0 std::ios_base::_M_invoke_callbacks(std::ios_base::event) +538c8 2 199 183 +538ca 2 199 183 +538cc 2 200 183 +538ce 2 199 183 +538d0 2 200 183 +538d2 2 199 183 +538d4 6 200 183 +538da 2 201 183 +538dc 4 203 183 +538e0 2 201 183 +538e2 2 203 183 +538e4 2 200 183 +538e6 4 203 183 +538ea 6 200 183 +FUNC 538f0 44 0 std::ios_base::~ios_base +538f0 2 299 183 +538f2 2 300 183 +538f4 2 299 183 +538f6 a 299 183 +53900 4 300 183 +53904 6 301 183 +5390a 6 302 183 +53910 6 303 183 +53916 4 299 183 +5391a 8 304 183 +53922 4 299 183 +53926 e 304 183 +FUNC 53934 12 0 std::ios_base::~ios_base +53934 2 299 183 +53936 2 299 183 +53938 4 304 183 +5393c 6 304 183 +53942 4 304 183 +FUNC 53948 60 0 std::ios_base::imbue(std::locale const&) +53948 2 124 183 +5394a 4 125 183 +5394e 6 124 183 +53954 4 125 183 +53958 2 124 183 +5395a 6 125 183 +53960 8 126 183 +53968 8 127 183 +53970 8 128 183 +53978 e 129 183 +53986 6 135 183 +5398c 8 132 183 +53994 a 133 183 +5399e a 129 183 +FUNC 539a8 3c 0 std::ios_base::ios_base +539a8 2 287 183 +539aa 4 287 183 +539ae 24 295 183 +539d2 2 296 183 +539d4 a 295 183 +539de 6 296 183 +FUNC 539e4 78 0 std::ios_base::_M_throw_failure() +539e4 2 209 183 +539e6 4 227 183 +539ea 2 209 183 +539ec 4 227 183 +539f0 2 379 237 +539f2 4 112 238 +539f6 2 481 201 +539f8 2 227 183 +539fa 6 379 237 +53a00 c 106 243 +53a0c 2 227 183 +53a0e 4 107 243 +53a12 2 380 237 +53a14 4 101 205 +53a18 6 227 183 +53a1e 8 121 237 +53a26 10 227 183 +53a36 6 643 236 +53a3c a 227 183 +53a46 16 121 237 +FUNC 53a5c 2 0 _Locale_final +53a5c 2 80 176 +FUNC 53a5c 2 0 std::_Locale_impl::_S_uninitialize() +53a5c 2 113 186 +FUNC 53a5c 2 0 std::basic_streambuf >::imbue(std::locale const&) +FUNC 53a5c 2 0 std::basic_streambuf >::setbuf(wchar_t*, int) +53a5c 2 180 234 +FUNC 53a5c 2 0 std::messages::do_close(int) const +53a5c 2 82 219 +FUNC 53a5c 2 0 std::messages::do_close(int) const +FUNC 53a60 c 0 std::basic_streambuf >::seekoff(long, int, int) +53a60 a 89 246 +53a6a 2 195 234 +FUNC 53a6c 16 0 std::basic_streambuf >::seekpos(std::fpos, int) +53a6c 2 188 234 +53a6e 6 188 234 +53a74 a 89 246 +53a7e 4 189 234 +FUNC 53a84 6 0 std::basic_streambuf >::overflow(unsigned int) +53a84 6 171 234 +FUNC 53a84 6 0 std::basic_streambuf >::pbackfail(unsigned int) +FUNC 53a84 6 0 std::basic_streambuf >::underflow() +FUNC 53a84 6 0 std::messages::do_open(std::string const&, std::locale const&) const +53a84 6 110 219 +FUNC 53a84 6 0 std::messages::do_open(std::string const&, std::locale const&) const +FUNC 53a84 6 0 std::priv::stdio_ostreambuf::showmanyc() +53a84 6 201 195 +FUNC 53a8c 5c 0 std::basic_streambuf >::_M_xsputnc(wchar_t, int) +53a8c 4 112 234 +53a90 4 117 234 +53a94 6 112 234 +53a9a 4 117 234 +53a9e 6 120 234 +53aa4 2 122 234 +53aa6 6 261 246 +53aac 2 123 234 +53aae 2 117 234 +53ab0 6 123 234 +53ab6 2 117 234 +53ab8 2 118 234 +53aba 2 120 234 +53abc 2 118 234 +53abe 2 261 246 +53ac0 4 120 234 +53ac4 2 118 234 +53ac6 2 261 246 +53ac8 4 120 234 +53acc 2 118 234 +53ace e 126 234 +53adc 2 128 234 +53ade 4 117 234 +53ae2 6 133 234 +FUNC 53ae8 62 0 std::basic_streambuf >::xsputn(wchar_t const*, int) +53ae8 4 84 234 +53aec 4 89 234 +53af0 6 84 234 +53af6 4 89 234 +53afa 6 92 234 +53b00 2 94 234 +53b02 2 253 246 +53b04 2 95 234 +53b06 4 253 246 +53b0a 2 96 234 +53b0c 2 89 234 +53b0e 2 95 234 +53b10 4 96 234 +53b14 2 89 234 +53b16 2 90 234 +53b18 4 92 234 +53b1c 2 90 234 +53b1e 2 253 246 +53b20 4 92 234 +53b24 2 90 234 +53b26 2 253 246 +53b28 4 92 234 +53b2c 2 90 234 +53b2e 6 99 234 +53b34 2 102 234 +53b36 8 99 234 +53b3e 2 101 234 +53b40 4 89 234 +53b44 6 108 234 +FUNC 53b4c 64 0 std::basic_streambuf >::xsgetn(wchar_t*, int) +53b4c 4 54 234 +53b50 4 58 234 +53b54 6 54 234 +53b5a 4 58 234 +53b5e 8 229 235 +53b66 4 69 234 +53b6a 2 71 234 +53b6c 4 70 234 +53b70 4 58 234 +53b74 2 59 234 +53b76 4 61 234 +53b7a 2 59 234 +53b7c 2 253 246 +53b7e 4 61 234 +53b82 2 59 234 +53b84 2 253 246 +53b86 4 61 234 +53b8a 2 59 234 +53b8c 6 61 234 +53b92 2 63 234 +53b94 2 253 246 +53b96 4 64 234 +53b9a 4 253 246 +53b9e 2 65 234 +53ba0 2 58 234 +53ba2 2 64 234 +53ba4 4 65 234 +53ba8 2 58 234 +53baa 6 80 234 +FUNC 53bb0 18 0 std::basic_ios >::~basic_ios +53bb0 4 59 211 +53bb4 14 59 211 +FUNC 53bc8 1c 0 std::basic_streambuf >::~basic_streambuf +53bc8 2 41 234 +53bca 2 40 234 +53bcc 2 41 234 +53bce 2 40 234 +53bd0 14 41 234 +FUNC 53be4 12 0 std::basic_streambuf >::~basic_streambuf +53be4 2 40 234 +53be6 2 40 234 +53be8 4 41 234 +53bec 6 41 234 +53bf2 4 41 234 +FUNC 53bf8 1e 0 std::basic_filebuf >::sync() +53bf8 2 402 207 +53bfa 6 403 207 +53c00 2 406 207 +53c02 2 407 207 +53c04 c 405 207 +53c10 6 405 207 +FUNC 53c18 6a 0 std::basic_filebuf >::_M_unshift() +53c18 c 593 207 +53c24 4 322 208 +53c28 2 593 207 +53c2a 2 598 207 +53c2c 2 296 203 +53c2e 2 597 207 +53c30 a 296 203 +53c3a 2 597 207 +53c3c 8 296 203 +53c44 2 600 207 +53c46 2 322 208 +53c48 2 600 207 +53c4a 8 600 207 +53c52 2 605 207 +53c54 14 600 207 +53c68 4 603 207 +53c6c 4 322 208 +53c70 2 605 207 +53c72 4 596 207 +53c76 2 602 207 +53c78 6 611 207 +53c7e 4 604 207 +FUNC 53c84 58 0 std::basic_filebuf >::showmanyc() +53c84 2 132 207 +53c86 6 134 207 +53c8c 4 134 207 +53c90 6 135 207 +53c96 6 136 207 +53c9c 6 138 207 +53ca2 2 144 207 +53ca4 2 145 207 +53ca6 a 137 207 +53cb0 e 139 207 +53cbe 6 140 207 +53cc4 10 141 207 +53cd4 4 141 207 +53cd8 4 141 207 +FUNC 53cdc 18 0 std::basic_streambuf >::uflow() +53cdc 2 165 234 +53cde 2 162 234 +53ce0 2 162 234 +53ce2 8 165 234 +53cea 6 165 234 +53cf0 2 350 184 +53cf2 2 166 234 +FUNC 53cf4 8a 0 std::basic_filebuf >::pbackfail(unsigned int) +53cf4 2 157 207 +53cf6 2 157 207 +53cf8 6 161 207 +53cfe 4 162 207 +53d02 6 199 207 +53d08 2 88 235 +53d0a 2 87 235 +53d0c 4 166 207 +53d10 6 166 207 +53d16 8 166 207 +53d1e 4 166 207 +53d22 4 178 207 +53d26 4 177 207 +53d2a 2 178 207 +53d2c 8 180 207 +53d34 2 181 207 +53d36 2 95 235 +53d38 2 181 207 +53d3a 2 93 235 +53d3c 2 94 235 +53d3e 4 197 207 +53d42 10 91 235 +53d52 2 188 207 +53d54 4 189 207 +53d58 2 187 207 +53d5a 2 190 207 +53d5c 2 186 207 +53d5e 2 188 207 +53d60 2 93 235 +53d62 2 94 235 +53d64 2 95 235 +53d66 4 190 207 +53d6a 4 197 207 +53d6e 4 91 235 +53d72 4 197 207 +53d76 8 175 207 +FUNC 53d8c 2c 0 std::basic_istream >::~basic_istream +53d8c 2 90 214 +53d8e 2 59 211 +53d90 2 90 214 +53d92 2 90 214 +53d94 2 90 214 +53d96 2 59 211 +53d98 2 90 214 +53d9a 2 59 211 +53d9c 2 90 214 +53d9e 8 59 211 +53da6 6 90 214 +53dac c 90 214 +FUNC 53dc4 28 0 std::basic_ostream >::~basic_ostream +53dc4 2 44 228 +53dc6 2 59 211 +53dc8 2 43 228 +53dca 2 44 228 +53dcc 2 43 228 +53dce 2 59 211 +53dd0 2 44 228 +53dd2 2 59 211 +53dd4 2 44 228 +53dd6 8 59 211 +53dde e 44 228 +FUNC 53df8 12 0 std::basic_ostream >::~basic_ostream +53df8 2 43 228 +53dfa 2 43 228 +53dfc 4 44 228 +53e00 6 44 228 +53e06 4 44 228 +FUNC 53e0c 20 0 std::basic_ios >::~basic_ios +53e0c 4 59 211 +53e10 c 59 211 +53e1c 6 59 211 +53e22 a 59 211 +FUNC 53e38 28 0 std::basic_istream >::~basic_istream +53e38 2 90 214 +53e3a 2 59 211 +53e3c 2 90 214 +53e3e 2 90 214 +53e40 2 90 214 +53e42 2 59 211 +53e44 2 90 214 +53e46 2 59 211 +53e48 2 90 214 +53e4a 8 59 211 +53e52 e 90 214 +FUNC 53e60 1e 0 std::auto_ptr > >::~auto_ptr +53e60 2 107 202 +53e62 2 107 202 +53e64 2 68 202 +53e66 2 107 202 +53e68 6 107 202 +53e6e 4 107 202 +53e72 8 107 202 +53e7a 4 107 202 +FUNC 53e60 1e 0 std::auto_ptr > >::~auto_ptr +FUNC 53e80 1e 0 std::basic_ios >::rdbuf(std::basic_streambuf >*) +53e80 2 48 210 +53e82 2 49 210 +53e84 2 50 210 +53e86 2 92 211 +53e88 4 188 212 +53e8c 4 53 210 +53e90 2 192 212 +53e92 4 188 212 +53e96 4 192 212 +53e9a 4 193 212 +FUNC 53ea0 1e 0 std::basic_ios >::rdbuf(std::basic_streambuf >*) +53ea0 2 48 210 +53ea2 2 49 210 +53ea4 2 50 210 +53ea6 2 92 211 +53ea8 4 188 212 +53eac 4 53 210 +53eb0 2 192 212 +53eb2 4 188 212 +53eb6 4 192 212 +53eba 4 193 212 +FUNC 53ec0 22c 0 std::ios_base::_S_uninitialize() +53ec0 4 248 184 +53ec4 2 190 212 +53ec6 2 248 184 +53ec8 2 256 184 +53eca 2 248 184 +53ecc e 256 184 +53eda 2 92 211 +53edc 2 190 212 +53ede 2 172 212 +53ee0 6 92 211 +53ee6 2 188 212 +53ee8 2 190 212 +53eea c 257 184 +53ef6 2 92 211 +53ef8 2 190 212 +53efa 2 172 212 +53efc 6 92 211 +53f02 2 188 212 +53f04 2 190 212 +53f06 c 258 184 +53f12 2 92 211 +53f14 2 190 212 +53f16 2 172 212 +53f18 6 92 211 +53f1e 2 188 212 +53f20 2 190 212 +53f22 c 259 184 +53f2e 2 92 211 +53f30 2 190 212 +53f32 2 172 212 +53f34 6 92 211 +53f3a 2 188 212 +53f3c e 261 184 +53f4a 6 261 184 +53f50 10 262 184 +53f60 6 262 184 +53f66 10 263 184 +53f76 6 263 184 +53f7c 10 264 184 +53f8c 6 264 184 +53f92 22 57 205 +53fb4 2 278 184 +53fb6 2 190 212 +53fb8 a 278 184 +53fc2 2 92 211 +53fc4 2 190 212 +53fc6 2 172 212 +53fc8 4 92 211 +53fcc 2 188 212 +53fce 2 190 212 +53fd0 c 279 184 +53fdc 2 92 211 +53fde 2 190 212 +53fe0 2 172 212 +53fe2 4 92 211 +53fe6 2 188 212 +53fe8 2 190 212 +53fea c 280 184 +53ff6 2 92 211 +53ff8 2 190 212 +53ffa 2 172 212 +53ffc 4 92 211 +54000 2 188 212 +54002 2 190 212 +54004 c 281 184 +54010 2 92 211 +54012 2 190 212 +54014 2 172 212 +54016 4 92 211 +5401a 2 188 212 +5401c e 283 184 +5402a 6 283 184 +54030 10 284 184 +54040 6 284 184 +54046 10 285 184 +54056 6 285 184 +5405c 10 286 184 +5406c 6 286 184 +54072 20 57 205 +54092 4 293 184 +54096 56 92 211 +FUNC 540ec 28 0 std::ios_base::Init::~Init +540ec 4 151 184 +540f0 4 152 184 +540f4 2 151 184 +540f6 8 152 184 +540fe 6 153 184 +54104 6 154 184 +5410a a 156 184 +FUNC 54114 90 0 std::basic_filebuf >::_M_setup_codecvt(std::locale const&, bool) +54114 2 735 207 +54116 6 735 207 +5411c 2 347 218 +5411e 2 735 207 +54120 a 347 218 +5412a 4 736 207 +5412e 8 351 218 +54136 2 313 203 +54138 2 351 218 +5413a 2 737 207 +5413c 6 313 203 +54142 2 741 207 +54144 8 141 200 +5414c 2 740 207 +5414e 6 324 203 +54154 2 743 207 +54156 c 742 207 +54162 4 315 203 +54166 2 741 207 +54168 4 315 203 +5416c 6 743 207 +54172 2 747 207 +54174 2 746 207 +54176 4 747 207 +5417a 8 748 207 +54182 4 749 207 +54186 4 351 218 +5418a 4 754 207 +5418e 4 351 218 +54192 8 736 207 +5419a a 346 218 +FUNC 541a4 12 0 std::basic_filebuf >::imbue(std::locale const&) +541a4 6 414 207 +541aa 6 414 207 +541b0 2 415 207 +541b2 4 415 207 +FUNC 541b8 ac 0 std::basic_filebuf >::basic_filebuf +541b8 4 34 234 +541bc 2 47 207 +541be 2 34 234 +541c0 2 47 207 +541c2 4 34 234 +541c6 2 47 207 +541c8 14 34 234 +541dc 10 61 207 +541ec 8 61 207 +541f4 2 63 207 +541f6 38 61 207 +5422e e 63 207 +5423c 6 63 207 +54242 6 64 207 +54248 1c 63 207 +FUNC 54264 56 0 std::_Stl_create_wfilebuf +54264 6 180 184 +5426a 2 181 184 +5426c 2 180 184 +5426e a 181 184 +54278 4 107 174 +5427c 6 194 208 +54282 2 28 202 +54284 4 194 208 +54288 2 68 202 +5428a 6 184 184 +54290 4 188 184 +54294 6 107 202 +5429a 4 187 184 +5429e a 181 184 +542a8 4 107 202 +542ac 4 107 202 +542b0 a 187 184 +FUNC 542bc 90 0 std::basic_filebuf >::_M_setup_codecvt(std::locale const&, bool) +542bc 2 735 207 +542be 6 735 207 +542c4 2 347 218 +542c6 2 735 207 +542c8 a 347 218 +542d2 4 736 207 +542d6 8 351 218 +542de 2 216 203 +542e0 2 351 218 +542e2 2 737 207 +542e4 6 216 203 +542ea 2 741 207 +542ec 8 141 200 +542f4 2 740 207 +542f6 6 227 203 +542fc 2 743 207 +542fe c 742 207 +5430a 4 218 203 +5430e 2 741 207 +54310 4 218 203 +54314 6 743 207 +5431a 2 747 207 +5431c 2 746 207 +5431e 4 747 207 +54322 8 748 207 +5432a 4 749 207 +5432e 4 351 218 +54332 4 754 207 +54336 4 351 218 +5433a 8 736 207 +54342 a 346 218 +FUNC 5434c ac 0 std::basic_filebuf >::basic_filebuf +5434c 4 34 234 +54350 2 47 207 +54352 2 34 234 +54354 2 47 207 +54356 4 34 234 +5435a 2 47 207 +5435c 14 34 234 +54370 10 61 207 +54380 8 61 207 +54388 2 63 207 +5438a 38 61 207 +543c2 e 63 207 +543d0 6 63 207 +543d6 6 64 207 +543dc 1c 63 207 +FUNC 543f8 5a 0 std::_Stl_create_filebuf<__sFILE*> +543f8 2 168 184 +543fa 2 168 184 +543fc 2 169 184 +543fe 2 168 184 +54400 a 169 184 +5440a 4 107 174 +5440e a 194 208 +54418 6 172 184 +5441e 4 176 184 +54422 8 107 202 +5442a 2 175 184 +5442c 4 176 184 +54430 a 169 184 +5443a 4 107 202 +5443e 8 107 202 +54446 c 107 202 +FUNC 54454 40 0 std::basic_ostream >::basic_ostream +54454 2 37 228 +54456 2 92 210 +54458 4 37 228 +5445c 6 92 210 +54462 2 38 228 +54464 2 92 210 +54466 2 39 228 +54468 2 38 228 +5446a 4 92 210 +5446e 4 38 228 +54472 2 92 210 +54474 2 38 228 +54476 2 92 210 +54478 4 38 228 +5447c 6 39 228 +54482 4 40 228 +54486 e 38 228 +FUNC 54494 90 0 std::basic_ios >::imbue(std::locale const&) +54494 6 69 210 +5449a 4 69 210 +5449e 4 70 210 +544a2 4 72 210 +544a6 a 46 234 +544b0 a 47 234 +544ba 8 48 234 +544c2 8 73 210 +544ca a 351 218 +544d4 2 76 210 +544d6 6 83 210 +544dc 4 78 210 +544e0 a 79 210 +544ea e 79 210 +544f8 2 117 210 +544fa 2 187 212 +544fc 2 117 210 +544fe 6 187 212 +54504 2 117 210 +54506 a 78 210 +54510 c 82 210 +5451c 8 118 210 +FUNC 54524 5e 0 std::basic_ios >::init(std::basic_streambuf >*) +54524 4 97 210 +54528 4 97 210 +5452c 4 99 210 +54530 10 100 210 +54540 c 100 210 +5454c 2 68 211 +5454e 2 121 211 +54550 4 103 210 +54554 2 68 211 +54556 4 103 210 +5455a 4 206 206 +5455e 2 190 212 +54560 2 188 212 +54562 4 112 212 +54566 2 139 212 +54568 2 132 212 +5456a 2 112 212 +5456c 2 132 212 +5456e 4 206 206 +54572 2 84 211 +54574 4 110 210 +54578 a 100 210 +FUNC 54584 40 0 std::basic_ostream >::basic_ostream +54584 2 37 228 +54586 2 92 210 +54588 4 37 228 +5458c 6 92 210 +54592 2 38 228 +54594 2 92 210 +54596 2 39 228 +54598 2 38 228 +5459a 2 92 210 +5459c 4 38 228 +545a0 2 92 210 +545a2 2 38 228 +545a4 2 92 210 +545a6 4 38 228 +545aa 6 39 228 +545b0 4 40 228 +545b4 10 38 228 +FUNC 545c4 388 0 std::ios_base::_S_initialize() +545c4 6 191 184 +545ca 2 191 184 +545cc 6 28 202 +545d2 2 191 184 +545d4 4 28 202 +545d8 c 202 184 +545e4 6 203 184 +545ea 2 75 196 +545ec 2 203 184 +545ee a 75 196 +545f8 2 68 202 +545fa 4 75 196 +545fe 2 61 202 +54600 2 75 196 +54602 2 61 202 +54604 2 62 202 +54606 6 62 202 +5460c 2 207 184 +5460e 2 28 202 +54610 6 207 184 +54616 6 213 184 +5461c 4 87 196 +54620 2 213 184 +54622 6 87 196 +54628 2 68 202 +5462a 2 87 196 +5462c 2 61 202 +5462e 6 87 196 +54634 2 61 202 +54636 2 62 202 +54638 6 62 202 +5463e 2 214 184 +54640 2 28 202 +54642 4 214 184 +54646 4 87 196 +5464a 2 214 184 +5464c 4 87 196 +54650 2 68 202 +54652 6 87 196 +54658 4 61 202 +5465c 2 62 202 +5465e 6 62 202 +54664 2 215 184 +54666 2 28 202 +54668 4 215 184 +5466c 4 87 196 +54670 2 215 184 +54672 4 87 196 +54676 2 68 202 +54678 4 87 196 +5467c 4 61 202 +54680 2 62 202 +54682 6 62 202 +54688 2 92 210 +5468a 2 28 202 +5468c 2 68 202 +5468e a 92 210 +54698 2 87 214 +5469a 2 92 210 +5469c 4 88 214 +546a0 4 92 210 +546a4 2 87 214 +546a6 2 92 210 +546a8 4 87 214 +546ac 2 92 210 +546ae 2 87 214 +546b0 2 87 214 +546b2 2 87 214 +546b4 2 88 214 +546b6 2 87 214 +546b8 4 88 214 +546bc 4 55 202 +546c0 e 225 184 +546ce 4 55 202 +546d2 c 226 184 +546de 4 55 202 +546e2 a 227 184 +546ec 2 229 184 +546ee 2 55 202 +546f0 2 228 184 +546f2 2 232 184 +546f4 2 55 202 +546f6 2 232 184 +546f8 4 229 184 +546fc 4 68 211 +54700 2 229 184 +54702 2 68 211 +54704 2 118 212 +54706 4 68 211 +5470a 6 118 212 +54710 4 232 184 +54714 4 233 184 +54718 2 28 202 +5471a 8 233 184 +54722 4 234 184 +54726 2 28 202 +54728 8 234 184 +54730 2 235 184 +54732 2 28 202 +54734 8 235 184 +5473c 2 92 210 +5473e 2 28 202 +54740 2 68 202 +54742 a 92 210 +5474c 2 87 214 +5474e 2 92 210 +54750 4 88 214 +54754 2 92 210 +54756 2 87 214 +54758 2 92 210 +5475a 4 87 214 +5475e 2 92 210 +54760 2 87 214 +54762 2 87 214 +54764 2 87 214 +54766 2 88 214 +54768 2 87 214 +5476a 4 88 214 +5476e 4 55 202 +54772 c 239 184 +5477e 4 55 202 +54782 c 240 184 +5478e 4 55 202 +54792 a 241 184 +5479c 2 244 184 +5479e 2 243 184 +547a0 2 68 202 +547a2 4 244 184 +547a6 4 68 211 +547aa 2 244 184 +547ac 2 55 202 +547ae 2 68 211 +547b0 2 55 202 +547b2 2 118 212 +547b4 2 68 211 +547b6 6 118 212 +547bc 2 107 202 +547be 6 107 202 +547c4 2 68 202 +547c6 2 107 202 +547c8 6 107 202 +547ce 2 68 202 +547d0 2 107 202 +547d2 6 107 202 +547d8 2 68 202 +547da 2 107 202 +547dc 6 107 202 +547e2 2 68 202 +547e4 2 107 202 +547e6 6 107 202 +547ec 2 68 202 +547ee 2 107 202 +547f0 6 107 202 +547f6 2 68 202 +547f8 2 107 202 +547fa 6 107 202 +54800 6 246 184 +54806 c 219 184 +54812 2 68 202 +54814 4 61 202 +54818 2 62 202 +5481a 6 62 202 +54820 6 220 184 +54826 2 28 202 +54828 6 220 184 +5482e 2 68 202 +54830 4 61 202 +54834 2 62 202 +54836 6 62 202 +5483c 6 221 184 +54842 2 28 202 +54844 6 221 184 +5484a 2 68 202 +5484c 6 61 202 +54852 6 62 202 +54858 8 62 202 +54860 e 205 184 +5486e 2 68 202 +54870 6 61 202 +54876 6 62 202 +5487c 8 62 202 +54884 4 246 184 +54888 6 244 184 +5488e 10 107 202 +5489e 8 87 214 +548a6 1a 244 184 +548c0 c 215 184 +548cc 16 203 184 +548e2 12 244 184 +548f4 8 87 214 +548fc 50 244 184 +FUNC 5494c 2c 0 std::ios_base::Init::Init +5494c 4 143 184 +54950 4 144 184 +54954 2 143 184 +54956 8 144 184 +5495e 6 145 184 +54964 4 146 184 +54968 6 147 184 +5496e a 149 184 +FUNC 54978 20 0 std::basic_filebuf >::_M_exit_input_mode() +54978 2 119 207 +5497a 2 118 207 +5497c 2 118 207 +5497e 2 119 207 +54980 a 120 207 +5498a 4 121 207 +5498e 2 122 207 +54990 6 124 207 +54996 2 125 207 +FUNC 54998 9e 0 std::basic_filebuf >::close() +54998 2 81 207 +5499a 2 81 207 +5499c 4 130 208 +549a0 4 84 207 +549a4 6 130 208 +549aa 4 84 207 +549ae 4 85 207 +549b2 2 87 207 +549b4 8 93 207 +549bc 6 97 207 +549c2 4 98 207 +549c6 2 100 207 +549c8 2 101 207 +549ca 2 93 235 +549cc 2 94 235 +549ce 2 95 235 +549d0 2 117 235 +549d2 2 118 235 +549d4 2 119 235 +549d6 6 106 207 +549dc 10 108 207 +549ec 6 93 207 +549f2 8 111 207 +549fa 2 112 207 +549fc 8 89 207 +54a04 6 90 207 +54a0a e 85 207 +54a18 8 594 207 +54a20 e 594 207 +54a2e 8 87 207 +FUNC 54a38 48 0 std::basic_filebuf >::~basic_filebuf +54a38 2 70 207 +54a3a 2 67 207 +54a3c 6 70 207 +54a42 2 67 207 +54a44 4 68 207 +54a48 6 686 207 +54a4e 6 688 207 +54a54 2 689 207 +54a56 2 69 207 +54a58 2 689 207 +54a5a 2 690 207 +54a5c 2 691 207 +54a5e 2 692 207 +54a60 4 69 207 +54a64 4 70 207 +54a68 8 687 207 +54a70 10 69 207 +FUNC 54a80 12 0 std::basic_filebuf >::~basic_filebuf +54a80 2 67 207 +54a82 2 67 207 +54a84 4 70 207 +54a88 6 70 207 +54a8e 4 70 207 +FUNC 54a94 74 0 std::basic_filebuf >::_M_allocate_buffers(wchar_t*, int) +54a94 2 630 207 +54a96 4 630 207 +54a9a 4 637 207 +54a9e 2 651 207 +54aa0 2 650 207 +54aa2 4 651 207 +54aa6 4 655 207 +54aaa 2 324 203 +54aac 4 655 207 +54ab0 4 324 203 +54ab4 e 661 207 +54ac2 2 664 207 +54ac4 2 670 207 +54ac6 2 669 207 +54ac8 2 671 207 +54aca 2 670 207 +54acc 6 669 207 +54ad2 2 672 207 +54ad4 6 686 207 +54ada 8 687 207 +54ae2 4 688 207 +54ae6 4 689 207 +54aea 2 666 207 +54aec 2 690 207 +54aee 2 691 207 +54af0 2 692 207 +54af2 2 666 207 +54af4 2 638 207 +54af6 6 644 207 +54afc 4 645 207 +54b00 8 647 207 +FUNC 54b08 2c 0 std::basic_filebuf >::_M_allocate_buffers() +54b08 2 676 207 +54b0a 4 676 207 +54b0e 6 128 208 +54b14 c 680 207 +54b20 2 681 207 +54b22 4 680 207 +54b26 2 681 207 +54b28 4 682 207 +54b2c 8 681 207 +FUNC 54b34 52 0 std::basic_filebuf >::_M_switch_to_output_mode() +54b34 2 452 207 +54b36 2 452 207 +54b38 6 453 207 +54b3e 2 129 208 +54b40 6 453 207 +54b46 6 453 207 +54b4c 6 453 207 +54b52 4 456 207 +54b56 4 462 207 +54b5a 4 463 207 +54b5e 2 466 207 +54b60 2 465 207 +54b62 2 117 235 +54b64 2 465 207 +54b66 2 467 207 +54b68 2 118 235 +54b6a 2 119 235 +54b6c 4 466 207 +54b70 2 467 207 +54b72 2 470 207 +54b74 2 471 207 +54b76 10 456 207 +FUNC 54b88 11c 0 std::basic_filebuf >::overflow(unsigned int) +54b88 6 208 207 +54b8e 4 210 207 +54b92 4 208 207 +54b96 4 210 207 +54b9a 2 214 207 +54b9c 2 112 235 +54b9e 2 219 207 +54ba0 2 216 207 +54ba2 2 117 235 +54ba4 2 216 207 +54ba6 2 118 235 +54ba8 2 219 207 +54baa 2 119 235 +54bac 6 220 207 +54bb2 4 223 207 +54bb6 16 322 208 +54bcc 8 240 207 +54bd4 a 240 207 +54bde 4 322 208 +54be2 4 246 207 +54be6 a 247 207 +54bf0 4 223 207 +54bf4 2 228 207 +54bf6 2 290 203 +54bf8 4 225 207 +54bfc 12 290 203 +54c0e 2 224 207 +54c10 4 225 207 +54c14 6 290 203 +54c1a 2 229 207 +54c1c 2 322 208 +54c1e 2 229 207 +54c20 4 240 207 +54c24 6 240 207 +54c2a 14 240 207 +54c3e 8 240 207 +54c46 2 580 207 +54c48 4 252 207 +54c4c 4 580 207 +54c50 2 252 207 +54c52 2 582 207 +54c54 4 581 207 +54c58 4 582 207 +54c5c 2 117 235 +54c5e 2 118 235 +54c60 2 119 235 +54c62 8 256 207 +54c6a 8 211 207 +54c72 8 212 207 +54c7a e 182 246 +54c88 4 249 207 +54c8c 4 580 207 +54c90 2 249 207 +54c92 2 582 207 +54c94 4 581 207 +54c98 4 582 207 +54c9c 2 117 235 +54c9e 2 118 235 +54ca0 2 119 235 +54ca2 2 249 207 +FUNC 54ca4 52 0 std::basic_filebuf >::setbuf(wchar_t*, int) +54ca4 2 268 207 +54ca6 2 268 207 +54ca8 6 269 207 +54cae 4 269 207 +54cb2 4 269 207 +54cb6 4 277 207 +54cba 14 271 207 +54cce 14 273 207 +54ce2 8 274 207 +54cea c 272 207 +FUNC 54cf8 86 0 std::basic_filebuf >::_M_seek_init(bool) +54cf8 2 700 207 +54cfa 2 702 207 +54cfc 4 706 207 +54d00 4 700 207 +54d04 4 702 207 +54d08 2 706 207 +54d0a 6 720 207 +54d10 6 720 207 +54d16 2 93 235 +54d18 2 723 207 +54d1a 4 220 208 +54d1e 2 93 235 +54d20 2 221 208 +54d22 2 94 235 +54d24 2 95 235 +54d26 6 221 208 +54d2c 2 723 207 +54d2e 2 724 207 +54d30 4 723 207 +54d34 10 708 207 +54d44 2 709 207 +54d46 2 710 207 +54d48 8 594 207 +54d50 e 594 207 +54d5e 4 710 207 +54d62 2 712 207 +54d64 2 713 207 +54d66 4 712 207 +54d6a 2 715 207 +54d6c 4 713 207 +54d70 2 117 235 +54d72 2 118 235 +54d74 2 119 235 +54d76 2 715 207 +54d78 6 711 207 +FUNC 54d80 84 0 std::basic_filebuf >::seekpos(std::fpos, int) +54d80 4 384 207 +54d84 4 384 207 +54d88 4 386 207 +54d8c 6 384 207 +54d92 2 386 207 +54d94 a 89 246 +54d9e 6 398 207 +54da4 a 387 207 +54dae 2 92 246 +54db0 4 391 207 +54db4 10 391 207 +54dc4 2 120 246 +54dc6 4 240 208 +54dca 2 392 207 +54dcc 2 240 208 +54dce 2 242 208 +54dd0 2 89 246 +54dd2 4 242 208 +54dd6 4 243 208 +54dda 4 244 208 +54dde 4 245 208 +54de2 2 93 235 +54de4 2 94 235 +54de6 2 95 235 +54de8 2 117 235 +54dea 2 118 235 +54dec 2 119 235 +54dee 4 121 246 +54df2 a 89 246 +54dfc 8 241 208 +FUNC 54e04 1b4 0 std::basic_filebuf >::seekoff(long, int, int) +54e04 6 291 207 +54e0a 4 294 207 +54e0e 2 291 207 +54e10 6 291 207 +54e16 4 294 207 +54e1a 16 297 207 +54e30 a 89 246 +54e3a 8 379 207 +54e42 10 300 207 +54e52 14 304 207 +54e66 6 310 207 +54e6c 6 314 207 +54e72 2 317 207 +54e74 4 321 207 +54e78 8 317 207 +54e80 4 321 207 +54e84 8 336 207 +54e8c 2 89 246 +54e8e 2 336 207 +54e90 18 89 246 +54ea8 10 312 207 +54eb8 2 239 208 +54eba 2 312 207 +54ebc 2 239 208 +54ebe 8 240 208 +54ec6 6 242 208 +54ecc 4 243 208 +54ed0 4 244 208 +54ed4 4 245 208 +54ed8 2 93 235 +54eda 2 94 235 +54edc 2 95 235 +54ede 2 117 235 +54ee0 2 118 235 +54ee2 2 119 235 +54ee4 8 89 246 +54eec a 324 207 +54ef6 8 325 207 +54efe 4 332 207 +54f02 2 325 207 +54f04 2 332 207 +54f06 4 325 207 +54f0a 4 332 207 +54f0e 2 333 207 +54f10 4 336 207 +54f14 2 87 208 +54f16 4 336 207 +54f1a a 336 207 +54f24 6 239 208 +54f2a 8 241 208 +54f32 2 346 207 +54f34 2 344 207 +54f36 4 341 207 +54f3a 4 344 207 +54f3e 2 321 203 +54f40 4 341 207 +54f44 2 321 203 +54f46 4 344 207 +54f4a 4 341 207 +54f4e a 321 203 +54f58 4 370 207 +54f5c 2 321 203 +54f5e 8 370 207 +54f66 4 372 207 +54f6a 6 373 207 +54f70 2 87 208 +54f72 2 372 207 +54f74 6 373 207 +54f7a 2 375 207 +54f7c 8 89 246 +54f84 4 240 208 +54f88 2 89 246 +54f8a 2 240 208 +54f8c 2 242 208 +54f8e 2 89 246 +54f90 4 242 208 +54f94 4 243 208 +54f98 4 244 208 +54f9c 4 245 208 +54fa0 2 93 235 +54fa2 2 94 235 +54fa4 2 95 235 +54fa6 2 117 235 +54fa8 2 118 235 +54faa 2 119 235 +54fac 4 121 246 +54fb0 8 241 208 +FUNC 54fb8 112 0 std::basic_filebuf >::_M_underflow_aux() +54fb8 2 498 207 +54fba 6 495 207 +54fc0 2 502 207 +54fc2 2 495 207 +54fc4 2 502 207 +54fc6 2 498 207 +54fc8 2 504 207 +54fca 8 502 207 +54fd2 2 509 207 +54fd4 2 502 207 +54fd6 8 224 200 +54fde 2 504 207 +54fe0 4 537 207 +54fe4 8 310 203 +54fec c 515 207 +54ff8 2 516 207 +54ffa 2 515 207 +54ffc 2 516 207 +54ffe 2 522 207 +55000 2 525 207 +55002 4 522 207 +55006 4 525 207 +5500a 2 537 207 +5500c 18 310 203 +55024 4 547 207 +55028 4 549 207 +5502c 8 549 207 +55034 8 549 207 +5503c 8 549 207 +55044 4 549 207 +55048 4 555 207 +5504c 2 350 184 +5504e 2 93 235 +55050 2 94 235 +55052 2 95 235 +55054 6 568 207 +5505a 14 549 207 +5506e 6 486 207 +55074 2 487 207 +55076 2 488 207 +55078 4 487 207 +5507c 4 488 207 +55080 4 553 207 +55084 2 93 235 +55086 2 94 235 +55088 2 95 235 +5508a 2 553 207 +5508c 6 549 207 +55092 6 549 207 +55098 6 563 207 +5509e 2 93 235 +550a0 4 565 207 +550a4 2 94 235 +550a6 2 95 235 +550a8 2 565 207 +550aa c 224 200 +550b6 2 93 235 +550b8 4 527 207 +550bc 2 93 235 +550be 2 94 235 +550c0 2 95 235 +550c2 2 527 207 +550c4 6 548 207 +FUNC 550cc 76 0 std::basic_filebuf >::underflow() +550cc 2 75 207 +550ce 2 75 207 +550d0 6 408 208 +550d6 8 430 207 +550de 6 430 207 +550e4 6 430 207 +550ea 6 432 207 +550f0 2 435 207 +550f2 2 440 207 +550f4 2 438 207 +550f6 4 440 207 +550fa 2 435 207 +550fc 2 436 207 +550fe 2 438 207 +55100 2 420 208 +55102 4 77 207 +55106 4 420 208 +5510a 8 412 208 +55112 2 93 235 +55114 4 220 208 +55118 2 93 235 +5511a 2 221 208 +5511c 2 414 208 +5511e 2 94 235 +55120 2 95 235 +55122 4 221 208 +55126 2 414 208 +55128 4 350 184 +5512c 6 410 208 +55132 a 432 207 +5513c 4 410 208 +55140 2 77 207 +FUNC 55144 1c 0 std::locale::facet::~facet +55144 4 43 185 +55148 c 43 185 +55154 4 342 240 +55158 8 43 185 +FUNC 55160 12 0 std::locale::facet::~facet +55160 2 43 185 +55162 6 43 185 +55168 6 43 185 +5516e 4 43 185 +FUNC 55174 20 0 std::locale::locale +55174 2 119 185 +55176 2 119 185 +55178 4 120 185 +5517c 6 120 185 +55182 2 120 185 +55184 4 121 185 +55188 8 121 185 +55190 4 119 185 +FUNC 55194 1c 0 std::locale::locale +55194 2 124 185 +55196 2 124 185 +55198 6 125 185 +5519e 2 125 185 +551a0 4 126 185 +551a4 8 126 185 +551ac 4 124 185 +FUNC 551b0 10 0 std::locale::locale +551b0 2 133 185 +551b2 2 133 185 +551b4 8 134 185 +551bc 4 135 185 +FUNC 551c0 1c 0 std::locale::~locale +551c0 2 363 185 +551c2 2 362 185 +551c4 2 362 185 +551c6 2 363 185 +551c8 4 364 185 +551cc 4 365 185 +551d0 8 365 185 +551d8 4 362 185 +FUNC 551dc 2e 0 std::locale::operator=(std::locale const&) +551dc 2 369 185 +551de 2 369 185 +551e0 2 370 185 +551e2 2 369 185 +551e4 6 370 185 +551ea 2 371 185 +551ec 8 372 185 +551f4 4 373 185 +551f8 2 373 185 +551fa 4 376 185 +551fe 8 375 185 +55206 4 369 185 +FUNC 5520c 18 0 std::locale::_M_get_facet(std::locale::id const&) const +5520c 4 379 185 +55210 6 192 245 +55216 4 379 185 +5521a 6 379 185 +55220 2 379 185 +55222 2 380 185 +FUNC 55224 1e 0 std::locale::_M_use_facet(std::locale::id const&) const +55224 2 382 185 +55226 4 383 185 +5522a 6 192 245 +55230 6 383 185 +55236 4 383 185 +5523a 2 384 185 +5523c 2 387 185 +5523e 4 385 185 +FUNC 55244 10 0 std::locale::name() const +55244 2 390 185 +55246 2 389 185 +55248 2 390 185 +5524a 2 389 185 +5524c 4 390 185 +55250 4 391 185 +FUNC 55254 ce 0 std::locale::operator==(std::locale const&) const +55254 4 396 185 +55258 2 394 185 +5525a 2 396 185 +5525c 2 394 185 +5525e 4 394 185 +55262 2 396 185 +55264 a 396 185 +5526e a 396 185 +55278 4 65 238 +5527c 8 400 237 +55284 4 289 239 +55288 2 396 185 +5528a 2 64 238 +5528c 4 96 238 +55290 2 96 238 +55292 4 97 238 +55296 4 161 201 +5529a 4 161 201 +5529e 2 64 238 +552a0 4 96 238 +552a4 2 96 238 +552a6 4 97 238 +552aa 4 161 201 +552ae 6 161 201 +552b4 2 396 185 +552b6 6 397 185 +552bc 4 226 246 +552c0 4 289 239 +552c4 a 396 185 +552ce 2 65 238 +552d0 2 396 185 +552d2 4 400 237 +552d6 4 324 239 +552da 4 96 238 +552de 4 96 238 +552e2 4 97 238 +552e6 4 161 201 +552ea 6 161 201 +552f0 12 135 222 +55302 a 394 185 +5530c 16 156 238 +FUNC 55324 e 0 std::locale::operator!=(std::locale const&) const +55324 2 399 185 +55326 8 400 185 +5532e 2 400 185 +55330 2 401 185 +FUNC 55334 6 0 std::time_get > >::do_date_order() const +55334 4 168 242 +55338 2 168 242 +FUNC 5533c 6 0 std::time_get > >::do_date_order() const +5533c 4 168 242 +55340 2 168 242 +FUNC 55344 18 0 std::num_put > >::~num_put +55344 4 107 226 +55348 14 107 226 +FUNC 5535c 18 0 std::num_get > >::~num_get +5535c 4 126 224 +55360 14 126 224 +FUNC 55374 18 0 std::num_get > >::~num_get +55374 4 126 224 +55378 14 126 224 +FUNC 5538c 18 0 std::num_put > >::~num_put +5538c 4 107 226 +55390 14 107 226 +FUNC 553a4 18 0 std::money_get > >::~money_get +553a4 4 73 221 +553a8 14 73 221 +FUNC 553bc 18 0 std::money_put > >::~money_put +553bc 4 406 221 +553c0 14 406 221 +FUNC 553d4 18 0 std::money_get > >::~money_get +553d4 4 73 221 +553d8 14 73 221 +FUNC 553ec 18 0 std::money_put > >::~money_put +553ec 4 406 221 +553f0 14 406 221 +FUNC 55404 e 0 std::_Refcount_Base::~_Refcount_Base +55404 2 441 240 +55406 2 441 240 +55408 6 342 240 +5540e 4 441 240 +FUNC 55414 10a 0 std::priv::__write_integer_backward +55414 4 304 225 +55418 6 314 225 +5541e 6 304 225 +55424 6 314 225 +5542a 2 278 225 +5542c 4 279 225 +55430 2 278 225 +55432 2 279 225 +55434 8 281 225 +5543c c 282 225 +55448 6 281 225 +5544e 6 282 225 +55454 2 281 225 +55456 4 282 225 +5545a 8 281 225 +55462 6 281 225 +55468 6 284 225 +5546e 6 286 225 +55474 8 287 225 +5547c 6 368 225 +55482 4 322 225 +55486 8 322 225 +5548e 8 323 225 +55496 4 322 225 +5549a 4 322 225 +5549e 4 323 225 +554a2 2 322 225 +554a4 6 326 225 +554aa 8 327 225 +554b2 6 368 225 +554b8 6 333 225 +554be 4 333 225 +554c2 8 339 225 +554ca 2 339 225 +554cc 4 340 225 +554d0 6 339 225 +554d6 4 340 225 +554da 4 339 225 +554de 4 339 225 +554e2 4 340 225 +554e6 2 339 225 +554e8 6 342 225 +554ee 2 343 225 +554f0 6 344 225 +554f6 4 343 225 +554fa 2 344 225 +554fc 6 368 225 +55502 6 333 225 +55508 8 279 225 +55510 8 285 225 +55518 6 368 225 +FUNC 55520 de 0 std::priv::__write_integer_backward +55520 6 314 225 +55526 4 304 225 +5552a 6 304 225 +55530 6 314 225 +55536 4 295 225 +5553a 2 344 225 +5553c 4 295 225 +55540 2 294 225 +55542 10 295 225 +55552 2 294 225 +55554 8 295 225 +5555c 4 294 225 +55560 6 297 225 +55566 8 298 225 +5556e 6 368 225 +55574 8 322 225 +5557c 8 322 225 +55584 8 323 225 +5558c 4 322 225 +55590 4 322 225 +55594 4 323 225 +55598 2 322 225 +5559a 6 326 225 +555a0 8 327 225 +555a8 6 368 225 +555ae 6 333 225 +555b4 4 333 225 +555b8 8 339 225 +555c0 4 340 225 +555c4 8 339 225 +555cc 4 340 225 +555d0 4 339 225 +555d4 4 340 225 +555d8 6 339 225 +555de 6 342 225 +555e4 2 343 225 +555e6 6 344 225 +555ec 4 343 225 +555f0 2 344 225 +555f2 6 368 225 +555f8 6 333 225 +FUNC 55600 10c 0 std::priv::__write_integer_backward +55600 4 304 225 +55604 2 304 225 +55606 4 314 225 +5560a 2 304 225 +5560c 2 314 225 +5560e 4 304 225 +55612 6 314 225 +55618 6 279 225 +5561e 8 281 225 +55626 c 282 225 +55632 6 281 225 +55638 6 282 225 +5563e 2 281 225 +55640 4 282 225 +55644 8 281 225 +5564c 6 281 225 +55652 6 284 225 +55658 6 286 225 +5565e 8 287 225 +55666 6 368 225 +5566c 8 322 225 +55674 8 322 225 +5567c 8 323 225 +55684 4 322 225 +55688 4 322 225 +5568c 4 323 225 +55690 2 322 225 +55692 6 326 225 +55698 8 327 225 +556a0 6 368 225 +556a6 6 333 225 +556ac 4 333 225 +556b0 8 339 225 +556b8 2 339 225 +556ba 4 340 225 +556be 6 339 225 +556c4 4 340 225 +556c8 4 339 225 +556cc 4 339 225 +556d0 4 340 225 +556d4 2 339 225 +556d6 6 342 225 +556dc 2 343 225 +556de 6 344 225 +556e4 4 343 225 +556e8 2 344 225 +556ea 6 368 225 +556f0 6 333 225 +556f6 8 279 225 +556fe 8 285 225 +55706 6 368 225 +FUNC 5570c ee 0 std::priv::__write_integer_backward +5570c 4 304 225 +55710 2 304 225 +55712 4 314 225 +55716 2 304 225 +55718 2 314 225 +5571a 4 304 225 +5571e 6 314 225 +55724 4 294 225 +55728 4 344 225 +5572c 2 294 225 +5572e c 295 225 +5573a 6 294 225 +55740 6 295 225 +55746 2 294 225 +55748 4 295 225 +5574c 8 294 225 +55754 6 294 225 +5575a 6 297 225 +55760 8 298 225 +55768 6 368 225 +5576e 4 322 225 +55772 4 294 225 +55776 2 322 225 +55778 8 322 225 +55780 8 323 225 +55788 4 322 225 +5578c 4 322 225 +55790 4 323 225 +55794 2 322 225 +55796 6 326 225 +5579c 8 327 225 +557a4 6 368 225 +557aa 6 333 225 +557b0 4 333 225 +557b4 8 339 225 +557bc 2 339 225 +557be 4 340 225 +557c2 6 339 225 +557c8 4 340 225 +557cc 4 339 225 +557d0 4 339 225 +557d4 4 340 225 +557d8 2 339 225 +557da 6 342 225 +557e0 2 343 225 +557e2 6 344 225 +557e8 4 343 225 +557ec 2 344 225 +557ee 6 368 225 +557f4 6 333 225 +FUNC 557fc 20 0 std::money_put > >::~money_put +557fc 4 406 221 +55800 c 406 221 +5580c 6 406 221 +55812 a 406 221 +FUNC 5581c 20 0 std::money_get > >::~money_get +5581c 4 73 221 +55820 c 73 221 +5582c 6 73 221 +55832 a 73 221 +FUNC 5583c 20 0 std::money_put > >::~money_put +5583c 4 406 221 +55840 c 406 221 +5584c 6 406 221 +55852 a 406 221 +FUNC 5585c 20 0 std::money_get > >::~money_get +5585c 4 73 221 +55860 c 73 221 +5586c 6 73 221 +55872 a 73 221 +FUNC 5587c 20 0 std::num_get > >::~num_get +5587c 4 126 224 +55880 c 126 224 +5588c 6 126 224 +55892 a 126 224 +FUNC 5589c 20 0 std::num_put > >::~num_put +5589c 4 107 226 +558a0 c 107 226 +558ac 6 107 226 +558b2 a 107 226 +FUNC 558bc 20 0 std::num_put > >::~num_put +558bc 4 107 226 +558c0 c 107 226 +558cc 6 107 226 +558d2 a 107 226 +FUNC 558dc 20 0 std::num_get > >::~num_get +558dc 4 126 224 +558e0 c 126 224 +558ec 6 126 224 +558f2 a 126 224 +FUNC 558fc 6a 0 std::istreambuf_iterator >::operator++(int) +558fc 2 144 215 +558fe 2 144 215 +55900 2 90 215 +55902 2 144 215 +55904 8 90 215 +5590c 4 148 215 +55910 2 229 235 +55912 4 148 215 +55916 2 229 235 +55918 2 229 235 +5591a 2 152 215 +5591c 2 229 235 +5591e 4 150 215 +55922 2 152 215 +55924 8 229 235 +5592c 2 150 215 +5592e 2 152 215 +55930 2 150 215 +55932 2 152 215 +55934 2 92 215 +55936 6 235 235 +5593c 4 764 186 +55940 2 235 235 +55942 4 191 246 +55946 2 93 215 +55948 8 191 246 +55950 6 95 215 +55956 10 235 235 +FUNC 55968 66 0 std::istreambuf_iterator >::operator++(int) +55968 2 90 215 +5596a 2 144 215 +5596c 4 144 215 +55970 4 90 215 +55974 4 229 235 +55978 4 148 215 +5597c 2 229 235 +5597e 4 148 215 +55982 2 229 235 +55984 2 229 235 +55986 2 152 215 +55988 2 229 235 +5598a 4 150 215 +5598e 2 152 215 +55990 8 229 235 +55998 2 150 215 +5599a 2 152 215 +5599c 2 150 215 +5599e 2 152 215 +559a0 2 92 215 +559a2 6 235 235 +559a8 4 223 246 +559ac 2 235 235 +559ae 4 191 246 +559b2 2 220 246 +559b4 8 191 246 +559bc 6 95 215 +559c2 c 235 235 +FUNC 559d0 30 0 std::_release_facet +559d0 2 44 186 +559d2 2 44 186 +559d4 4 45 186 +559d8 a 347 240 +559e2 2 475 240 +559e4 2 349 240 +559e6 4 475 240 +559ea 4 349 240 +559ee 2 45 186 +559f0 4 46 186 +559f4 6 46 186 +559fa 6 47 186 +FUNC 55a00 74 0 std::_Locale_impl::Init::_M_count() const +55a00 2 70 186 +55a02 2 69 186 +55a04 a 70 186 +55a0e 4 71 186 +55a12 2 72 186 +55a14 8 70 186 +55a1c 2 457 240 +55a1e 2 340 240 +55a20 6 457 240 +55a26 4 340 240 +55a2a 4 70 186 +55a2e 1a 70 186 +55a48 4 70 186 +55a4c 28 70 186 +FUNC 55a74 28 0 std::_Locale_impl::Init::~Init +55a74 2 63 186 +55a76 2 63 186 +55a78 4 64 186 +55a7c 2 347 240 +55a7e 2 64 186 +55a80 6 347 240 +55a86 2 475 240 +55a88 2 349 240 +55a8a 4 475 240 +55a8e 4 349 240 +55a92 2 64 186 +55a94 4 65 186 +55a98 4 67 186 +FUNC 55a9c 28 0 std::_Locale_impl::_M_throw_bad_cast() +55a9c 2 116 186 +55a9e 26 117 186 +FUNC 55ac4 1c 0 std::_get_Locale_impl(std::_Locale_impl*) +55ac4 2 696 186 +55ac6 2 347 240 +55ac8 2 696 186 +55aca 6 347 240 +55ad0 2 471 240 +55ad2 2 349 240 +55ad4 4 471 240 +55ad8 4 349 240 +55adc 4 700 186 +FUNC 55ae0 c 0 std::priv::_GetFacetId(std::num_put > > const*) +55ae0 4 745 186 +55ae4 8 745 186 +FUNC 55aec 24 0 std::vector >::~vector +55aec 2 304 245 +55aee 2 304 245 +55af0 4 87 245 +55af4 4 88 245 +55af8 4 323 201 +55afc 4 161 201 +55b00 4 161 201 +55b04 4 304 245 +55b08 4 135 222 +55b0c 4 304 245 +FUNC 55b10 c4 0 std::vector >::reserve(unsigned int) +55b10 6 62 244 +55b16 4 199 245 +55b1a 2 62 244 +55b1c 6 199 245 +55b22 6 63 244 +55b28 6 64 244 +55b2e c 192 245 +55b3a 6 70 244 +55b40 2 346 201 +55b42 2 356 201 +55b44 2 346 201 +55b46 4 347 201 +55b4a 4 158 201 +55b4e 8 158 201 +55b56 2 352 201 +55b58 6 158 201 +55b5e 4 107 243 +55b62 a 106 243 +55b6c 4 657 245 +55b70 2 319 201 +55b72 2 657 245 +55b74 4 323 201 +55b78 4 161 201 +55b7c 4 161 201 +55b80 4 76 244 +55b84 2 668 245 +55b86 4 667 245 +55b8a 6 78 244 +55b90 6 135 222 +55b96 8 134 222 +55b9e 2 346 201 +55ba0 2 356 201 +55ba2 4 346 201 +55ba6 4 347 201 +55baa 4 158 201 +55bae 8 158 201 +55bb6 2 352 201 +55bb8 8 158 201 +55bc0 8 134 222 +55bc8 c 41 244 +FUNC 55bd4 56 0 std::priv::_Time_Info_Base::~_Time_Info_Base +55bd4 2 63 242 +55bd6 2 63 242 +55bd8 4 121 237 +55bdc 4 156 238 +55be0 4 121 237 +55be4 4 156 238 +55be8 4 121 237 +55bec 4 156 238 +55bf0 4 121 237 +55bf4 a 156 238 +55bfe 4 63 242 +55c02 4 121 237 +55c06 4 156 238 +55c0a 4 121 237 +55c0e 4 156 238 +55c12 4 121 237 +55c16 14 156 238 +FUNC 55c2c 74 0 std::_Locale_impl::~_Locale_impl +55c2c 2 93 186 +55c2e 2 92 186 +55c30 2 93 186 +55c32 2 92 186 +55c34 6 93 186 +55c3a 2 182 245 +55c3c 2 184 245 +55c3e 4 60 198 +55c42 6 61 198 +55c48 2 60 198 +55c4a 6 60 198 +55c50 2 87 245 +55c52 2 88 245 +55c54 2 135 222 +55c56 2 88 245 +55c58 4 323 201 +55c5c 4 161 201 +55c60 4 161 201 +55c64 4 121 237 +55c68 4 156 238 +55c6c 6 342 240 +55c72 4 95 186 +55c76 6 135 222 +55c7c 4 121 237 +55c80 4 156 238 +55c84 a 342 240 +55c8e 4 92 186 +55c92 e 95 186 +FUNC 55ca0 4c 0 std::_release_Locale_impl(std::_Locale_impl*&) +55ca0 2 703 186 +55ca2 2 703 186 +55ca4 2 705 186 +55ca6 8 347 240 +55cae 2 475 240 +55cb0 2 349 240 +55cb2 4 475 240 +55cb6 4 349 240 +55cba 2 705 186 +55cbc 2 109 187 +55cbe 2 706 186 +55cc0 4 109 187 +55cc4 6 706 186 +55cca 2 707 186 +55ccc c 707 186 +55cd8 6 710 186 +55cde e 709 186 +FUNC 55cec f0 0 std::priv::time_init::~time_init +55cec 4 101 242 +55cf0 4 72 242 +55cf4 2 101 242 +55cf6 6 72 242 +55cfc 2 72 242 +55cfe 2 121 237 +55d00 6 156 238 +55d06 4 72 242 +55d0a 6 72 242 +55d10 2 121 237 +55d12 6 156 238 +55d18 4 72 242 +55d1c a 72 242 +55d26 2 72 242 +55d28 4 72 242 +55d2c 4 161 201 +55d30 4 72 242 +55d34 2 101 242 +55d36 2 64 238 +55d38 2 101 242 +55d3a 2 64 238 +55d3c 4 96 238 +55d40 4 96 238 +55d44 4 97 238 +55d48 4 161 201 +55d4c 4 135 222 +55d50 4 72 242 +55d54 4 121 237 +55d58 4 156 238 +55d5c 4 121 237 +55d60 4 156 238 +55d64 4 121 237 +55d68 4 156 238 +55d6c 4 121 237 +55d70 a 156 238 +55d7a 6 101 242 +55d80 6 72 242 +55d86 2 121 237 +55d88 6 156 238 +55d8e 4 72 242 +55d92 6 72 242 +55d98 2 72 242 +55d9a 2 121 237 +55d9c 6 156 238 +55da2 6 72 242 +55da8 a 156 238 +55db2 4 121 237 +55db6 6 156 238 +55dbc 4 121 237 +55dc0 6 156 238 +55dc6 a 72 242 +55dd0 4 121 237 +55dd4 8 156 238 +FUNC 55ddc 2c 0 std::time_get > >::~time_get +55ddc 4 166 242 +55de0 e 166 242 +55dee 6 166 242 +55df4 14 166 242 +FUNC 55e08 2c 0 std::time_put > >::~time_put +55e08 4 273 242 +55e0c e 273 242 +55e1a 6 273 242 +55e20 14 273 242 +FUNC 55e34 30 0 std::time_get > >::~time_get +55e34 4 166 242 +55e38 e 166 242 +55e46 c 166 242 +55e52 12 166 242 +FUNC 55e64 30 0 std::time_put > >::~time_put +55e64 4 273 242 +55e68 e 273 242 +55e76 c 273 242 +55e82 12 273 242 +FUNC 55e94 20 0 std::priv::_String_base >::_M_deallocate_block() +55e94 2 64 238 +55e96 4 96 238 +55e9a 2 96 238 +55e9c 2 97 238 +55e9e 2 135 222 +55ea0 2 97 238 +55ea2 4 323 201 +55ea6 4 161 201 +55eaa 4 161 201 +55eae 6 135 222 +FUNC 55eb4 14a 0 std::priv::time_init::~time_init +55eb4 4 115 242 +55eb8 6 80 242 +55ebe 2 115 242 +55ec0 2 80 242 +55ec2 e 80 242 +55ed0 4 161 201 +55ed4 4 80 242 +55ed8 2 115 242 +55eda 2 64 238 +55edc 2 115 242 +55ede 2 64 238 +55ee0 4 96 238 +55ee4 4 96 238 +55ee8 4 97 238 +55eec 4 323 201 +55ef0 4 161 201 +55ef4 4 135 222 +55ef8 4 80 242 +55efc a 80 242 +55f06 2 80 242 +55f08 4 80 242 +55f0c 4 161 201 +55f10 4 80 242 +55f14 2 115 242 +55f16 2 64 238 +55f18 2 115 242 +55f1a 2 64 238 +55f1c 4 96 238 +55f20 4 96 238 +55f24 4 97 238 +55f28 4 323 201 +55f2c 4 161 201 +55f30 4 135 222 +55f34 4 80 242 +55f38 a 80 242 +55f42 2 80 242 +55f44 4 80 242 +55f48 4 161 201 +55f4c 4 80 242 +55f50 2 115 242 +55f52 2 64 238 +55f54 2 115 242 +55f56 2 64 238 +55f58 4 96 238 +55f5c 4 96 238 +55f60 4 97 238 +55f64 4 323 201 +55f68 4 161 201 +55f6c 4 135 222 +55f70 4 80 242 +55f74 4 121 237 +55f78 4 156 238 +55f7c 4 121 237 +55f80 4 156 238 +55f84 4 121 237 +55f88 4 156 238 +55f8c 4 121 237 +55f90 a 156 238 +55f9a 6 115 242 +55fa0 6 80 242 +55fa6 2 80 242 +55fa8 2 121 237 +55faa 6 156 238 +55fb0 4 80 242 +55fb4 6 80 242 +55fba 2 80 242 +55fbc 2 121 237 +55fbe 6 156 238 +55fc4 6 80 242 +55fca a 156 238 +55fd4 4 121 237 +55fd8 6 156 238 +55fde 4 121 237 +55fe2 6 156 238 +55fe8 a 80 242 +55ff2 4 121 237 +55ff6 8 156 238 +FUNC 56000 2c 0 std::time_get > >::~time_get +56000 4 166 242 +56004 e 166 242 +56012 6 166 242 +56018 14 166 242 +FUNC 5602c 2c 0 std::time_put > >::~time_put +5602c 4 273 242 +56030 e 273 242 +5603e 6 273 242 +56044 14 273 242 +FUNC 56058 30 0 std::time_get > >::~time_get +56058 4 166 242 +5605c e 166 242 +5606a c 166 242 +56076 12 166 242 +FUNC 56088 30 0 std::time_put > >::~time_put +56088 4 273 242 +5608c e 273 242 +5609a c 273 242 +560a6 12 273 242 +FUNC 560b8 24 0 std::priv::_String_base >::_M_deallocate_block() +560b8 4 64 238 +560bc 4 96 238 +560c0 2 96 238 +560c2 4 97 238 +560c6 4 70 213 +560ca 2 97 238 +560cc 2 135 222 +560ce 4 161 201 +560d2 6 161 201 +560d8 4 135 222 +FUNC 560dc 40 0 std::basic_string, std::allocator >::basic_string +560dc 2 639 236 +560de 2 639 236 +560e0 2 112 238 +560e2 2 229 246 +560e4 2 481 201 +560e6 2 639 236 +560e8 4 229 246 +560ec 2 643 236 +560ee 2 379 237 +560f0 2 378 237 +560f2 6 379 237 +560f8 2 107 243 +560fa 2 66 238 +560fc 2 107 243 +560fe 8 106 243 +56106 2 107 243 +56108 2 380 237 +5610a 4 101 205 +5610e 4 644 236 +56112 a 156 238 +FUNC 5611c 68 0 std::_Locale_impl::_Locale_impl +5611c 2 74 186 +5611e 4 457 240 +56122 4 75 186 +56126 2 74 186 +56128 4 457 240 +5612c 2 340 240 +5612e 2 74 186 +56130 6 340 240 +56136 8 75 186 +5613e 6 76 186 +56144 4 67 245 +56148 4 76 186 +5614c 2 67 245 +5614e 2 481 201 +56150 8 76 186 +56158 4 77 186 +5615c 4 77 186 +56160 4 78 186 +56164 a 342 240 +5616e 6 78 186 +56174 10 156 238 +FUNC 56184 59c 0 std::_Locale_impl::make_classic_locale() +56184 6 623 186 +5618a 4 628 186 +5618e 2 661 186 +56190 4 628 186 +56194 2 628 186 +56196 4 623 186 +5619a 6 628 186 +561a0 10 661 186 +561b0 2 457 240 +561b2 2 340 240 +561b4 2 623 186 +561b6 2 661 186 +561b8 4 340 240 +561bc 2 457 240 +561be 4 340 240 +561c2 4 48 204 +561c6 2 661 186 +561c8 4 86 218 +561cc 2 48 204 +561ce 2 86 218 +561d0 4 48 204 +561d4 6 661 186 +561da 6 633 186 +561e0 2 661 186 +561e2 4 633 186 +561e6 8 661 186 +561ee 2 457 240 +561f0 2 340 240 +561f2 2 661 186 +561f4 4 340 240 +561f8 2 457 240 +561fa 4 340 240 +561fe 4 180 203 +56202 2 661 186 +56204 2 180 203 +56206 2 661 186 +56208 4 180 203 +5620c 4 661 186 +56210 2 635 186 +56212 2 661 186 +56214 4 635 186 +56218 8 661 186 +56220 2 636 186 +56222 2 661 186 +56224 4 636 186 +56228 8 661 186 +56230 2 457 240 +56232 2 340 240 +56234 2 661 186 +56236 4 340 240 +5623a 2 457 240 +5623c 4 340 240 +56240 4 54 227 +56244 2 661 186 +56246 2 54 227 +56248 2 661 186 +5624a 4 54 227 +5624e 4 661 186 +56252 2 638 186 +56254 2 661 186 +56256 4 638 186 +5625a 8 661 186 +56262 2 457 240 +56264 2 340 240 +56266 2 661 186 +56268 4 340 240 +5626c 2 457 240 +5626e 4 340 240 +56272 4 60 221 +56276 4 661 186 +5627a 6 60 221 +56280 4 661 186 +56284 2 457 240 +56286 2 340 240 +56288 2 661 186 +5628a 4 340 240 +5628e 2 457 240 +56290 4 340 240 +56294 2 394 221 +56296 4 661 186 +5629a 6 394 221 +562a0 4 661 186 +562a4 2 457 240 +562a6 2 340 240 +562a8 2 661 186 +562aa 4 340 240 +562ae 2 457 240 +562b0 4 340 240 +562b4 2 61 224 +562b6 4 661 186 +562ba 6 61 224 +562c0 4 661 186 +562c4 2 457 240 +562c6 2 340 240 +562c8 2 661 186 +562ca 4 340 240 +562ce 2 457 240 +562d0 4 340 240 +562d4 2 57 226 +562d6 6 661 186 +562dc 6 57 226 +562e2 4 661 186 +562e6 2 457 240 +562e8 2 340 240 +562ea 2 661 186 +562ec 4 340 240 +562f0 2 457 240 +562f2 4 340 240 +562f6 a 86 218 +56300 4 136 242 +56304 2 136 242 +56306 6 661 186 +5630c 6 136 242 +56312 4 661 186 +56316 2 457 240 +56318 2 340 240 +5631a 2 661 186 +5631c 4 340 240 +56320 2 457 240 +56322 4 340 240 +56326 a 86 218 +56330 4 253 242 +56334 2 253 242 +56336 4 661 186 +5633a 6 253 242 +56340 4 661 186 +56344 2 457 240 +56346 2 340 240 +56348 2 661 186 +5634a 4 340 240 +5634e 2 457 240 +56350 4 340 240 +56354 2 84 204 +56356 2 661 186 +56358 2 84 204 +5635a 2 661 186 +5635c 4 84 204 +56360 4 661 186 +56364 2 457 240 +56366 2 340 240 +56368 2 661 186 +5636a 4 340 240 +5636e 2 457 240 +56370 4 340 240 +56374 2 181 206 +56376 2 661 186 +56378 2 181 206 +5637a 2 661 186 +5637c 4 181 206 +56380 4 661 186 +56384 2 457 240 +56386 2 340 240 +56388 2 661 186 +5638a 4 340 240 +5638e 2 457 240 +56390 4 340 240 +56394 2 277 203 +56396 2 661 186 +56398 2 277 203 +5639a 2 661 186 +5639c 4 277 203 +563a0 4 661 186 +563a4 2 649 186 +563a6 2 661 186 +563a8 4 649 186 +563ac 8 661 186 +563b4 2 650 186 +563b6 2 661 186 +563b8 4 650 186 +563bc 8 661 186 +563c4 2 457 240 +563c6 2 340 240 +563c8 2 661 186 +563ca 4 340 240 +563ce 2 457 240 +563d0 4 340 240 +563d4 2 83 227 +563d6 2 661 186 +563d8 2 83 227 +563da 2 661 186 +563dc 4 83 227 +563e0 4 661 186 +563e4 2 652 186 +563e6 2 661 186 +563e8 4 652 186 +563ec 8 661 186 +563f4 2 457 240 +563f6 2 340 240 +563f8 2 661 186 +563fa 4 340 240 +563fe 2 457 240 +56400 4 340 240 +56404 2 60 221 +56406 4 661 186 +5640a 6 60 221 +56410 4 661 186 +56414 2 457 240 +56416 2 340 240 +56418 2 661 186 +5641a 4 340 240 +5641e 2 457 240 +56420 4 340 240 +56424 2 394 221 +56426 4 661 186 +5642a 6 394 221 +56430 4 661 186 +56434 2 457 240 +56436 2 340 240 +56438 2 661 186 +5643a 4 340 240 +5643e 2 457 240 +56440 4 340 240 +56444 2 61 224 +56446 4 661 186 +5644a 6 61 224 +56450 4 661 186 +56454 2 457 240 +56456 2 340 240 +56458 2 661 186 +5645a 4 340 240 +5645e 2 457 240 +56460 4 340 240 +56464 2 57 226 +56466 6 661 186 +5646c 6 57 226 +56472 4 661 186 +56476 2 457 240 +56478 2 340 240 +5647a 2 661 186 +5647c 4 340 240 +56480 2 457 240 +56482 4 340 240 +56486 a 86 218 +56490 4 136 242 +56494 2 136 242 +56496 6 661 186 +5649c 6 136 242 +564a2 4 661 186 +564a6 2 457 240 +564a8 2 340 240 +564aa 2 661 186 +564ac 4 340 240 +564b0 2 457 240 +564b2 4 340 240 +564b6 8 86 218 +564be 4 253 242 +564c2 4 664 186 +564c6 2 253 242 +564c8 2 664 186 +564ca 2 661 186 +564cc 2 253 242 +564ce 4 664 186 +564d2 4 253 242 +564d6 4 664 186 +564da 6 199 245 +564e0 4 326 245 +564e4 6 192 245 +564ea 4 332 245 +564ee a 224 200 +564f8 2 335 245 +564fa a 667 186 +56504 2 670 186 +56506 2 668 186 +56508 2 670 186 +5650a 4 668 186 +5650e 2 670 186 +56510 4 668 186 +56514 4 670 186 +56518 a 671 186 +56522 6 672 186 +56528 4 510 216 +5652c 4 224 200 +56530 8 224 200 +56538 6 107 243 +5653e c 106 243 +5654a 2 107 243 +5654c 8 341 245 +56554 8 670 186 +5655c 2 670 186 +5655e 2 628 186 +56560 2 670 186 +56562 2 628 186 +56564 4 670 186 +56568 4 670 186 +5656c 16 670 186 +56582 a 347 201 +5658c 4 158 201 +56590 4 106 243 +56594 4 352 201 +56598 2 158 201 +5659a 4 106 243 +5659e 4 657 245 +565a2 2 319 201 +565a4 2 657 245 +565a6 4 323 201 +565aa 4 161 201 +565ae 4 161 201 +565b2 2 666 245 +565b4 8 330 245 +565bc 4 666 245 +565c0 2 667 245 +565c2 4 668 245 +565c6 8 667 186 +565ce 2 667 186 +565d0 2 628 186 +565d2 2 667 186 +565d4 2 628 186 +565d6 4 667 186 +565da 4 667 186 +565de 16 667 186 +565f4 6 135 222 +565fa 4 670 186 +565fe 8 670 186 +56606 22 633 186 +56628 8 136 242 +56630 14 253 242 +56644 1e 136 242 +56662 4 667 186 +56666 ba 667 186 +FUNC 56720 b8 0 std::_Locale_impl::_S_initialize() +56720 4 100 186 +56724 8 575 186 +5672c 4 576 186 +56730 4 577 186 +56734 2 575 186 +56736 4 578 186 +5673a 2 576 186 +5673c 2 579 186 +5673e 2 577 186 +56740 2 580 186 +56742 2 578 186 +56744 2 583 186 +56746 2 579 186 +56748 2 584 186 +5674a 2 580 186 +5674c 2 585 186 +5674e 2 583 186 +56750 2 586 186 +56752 2 584 186 +56754 2 587 186 +56756 2 585 186 +56758 2 588 186 +5675a 2 586 186 +5675c 2 587 186 +5675e 4 575 186 +56762 2 588 186 +56764 8 576 186 +5676c 8 577 186 +56774 8 578 186 +5677c 8 579 186 +56784 4 580 186 +56788 4 583 186 +5678c 4 584 186 +56790 4 585 186 +56794 4 586 186 +56798 4 587 186 +5679c 4 588 186 +567a0 4 103 186 +567a4 34 102 186 +FUNC 567d8 2e 0 std::_Locale_impl::Init::Init +567d8 2 57 186 +567da 2 57 186 +567dc 4 58 186 +567e0 2 347 240 +567e2 2 58 186 +567e4 6 347 240 +567ea 2 471 240 +567ec 2 349 240 +567ee 4 471 240 +567f2 4 349 240 +567f6 4 58 186 +567fa 4 61 186 +567fe 4 59 186 +56802 4 61 186 +FUNC 56808 70 0 std::_Stl_get_global_locale() +56808 2 604 186 +5680a 2 603 186 +5680c 8 604 186 +56814 6 605 186 +5681a 2 606 186 +5681c 8 604 186 +56824 4 604 186 +56828 4 604 186 +5682c 4 604 186 +56830 1a 604 186 +5684a 4 604 186 +5684e 2a 604 186 +FUNC 56878 48 0 std::priv::_String_base >::_M_allocate_block(unsigned int) +56878 4 608 236 +5687c 6 607 236 +56882 2 608 236 +56884 2 608 236 +56886 4 610 236 +5688a 4 623 236 +5688e 8 600 236 +56896 4 347 201 +5689a 4 158 201 +5689e 6 158 201 +568a4 2 613 236 +568a6 2 611 236 +568a8 4 613 236 +568ac 2 612 236 +568ae 6 613 236 +568b4 c 134 222 +FUNC 568c0 3c 0 std::priv::_String_base >::_M_allocate_block(unsigned int) +568c0 6 607 236 +568c6 2 608 236 +568c8 4 610 236 +568cc 4 64 213 +568d0 4 67 213 +568d4 2 64 213 +568d6 2 613 236 +568d8 4 611 236 +568dc 2 612 236 +568de 2 613 236 +568e0 4 623 236 +568e4 8 600 236 +568ec 10 134 222 +FUNC 568fc 144 0 std::time_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, char, tm const*, char, char) const +568fc 8 425 241 +56904 4 425 241 +56908 2 145 212 +5690a 2 425 241 +5690c 2 145 212 +5690e 4 425 241 +56912 a 145 212 +5691c c 351 218 +56928 4 41 213 +5692c 2 428 241 +5692e 4 120 238 +56932 4 428 241 +56936 c 108 213 +56942 8 41 213 +5694a 4 120 238 +5694e 4 41 213 +56952 6 124 238 +56958 4 481 201 +5695c 4 124 238 +56960 4 90 238 +56964 2 101 205 +56966 6 430 241 +5696c 2 101 205 +5696e 12 430 241 +56980 a 90 238 +5698a 4 66 238 +5698e 18 90 238 +569a6 2 213 200 +569a8 2 90 238 +569aa 2 213 200 +569ac 8 90 238 +569b4 8 213 200 +569bc 4 214 200 +569c0 4 62 229 +569c4 6 200 235 +569ca 8 200 235 +569d2 2 200 235 +569d4 8 200 235 +569dc 8 62 229 +569e4 8 213 200 +569ec 4 218 200 +569f0 2 96 238 +569f2 c 218 200 +569fe 2 96 238 +56a00 2 96 238 +56a02 2 70 213 +56a04 4 97 238 +56a08 2 70 213 +56a0a 2 97 238 +56a0c 2 135 222 +56a0e 4 161 201 +56a12 4 161 201 +56a16 a 432 241 +56a20 6 135 222 +56a26 a 428 241 +56a30 10 156 238 +FUNC 56a40 32 0 std::priv::__basic_iostring::~__basic_iostring +56a40 2 97 213 +56a42 2 97 213 +56a44 4 64 238 +56a48 4 96 238 +56a4c 2 96 238 +56a4e 6 97 238 +56a54 4 70 213 +56a58 2 97 238 +56a5a 4 323 201 +56a5e 4 161 201 +56a62 4 161 201 +56a66 4 97 213 +56a6a 4 135 222 +56a6e 4 97 213 +FUNC 56a74 8e 0 std::copy > > +56a74 8 291 200 +56a7c 2 213 200 +56a7e 2 291 200 +56a80 4 213 200 +56a84 4 291 200 +56a88 8 213 200 +56a90 2 213 200 +56a92 4 213 200 +56a96 2 213 200 +56a98 16 213 200 +56aae 8 62 229 +56ab6 4 213 200 +56aba 4 214 200 +56abe 4 62 229 +56ac2 a 200 235 +56acc c 200 235 +56ad8 2 200 235 +56ada e 200 235 +56ae8 8 218 200 +56af0 2 294 200 +56af2 6 218 200 +56af8 a 294 200 +FUNC 56a74 8e 0 std::copy > > +FUNC 56b04 8e 0 std::copy > > +FUNC 56b04 8e 0 std::copy > > +56b04 8 291 200 +56b0c 2 213 200 +56b0e 6 291 200 +56b14 a 213 200 +56b1e 4 213 200 +56b22 22 213 200 +56b44 4 214 200 +56b48 6 62 229 +56b4e 6 200 235 +56b54 a 200 235 +56b5e 2 200 235 +56b60 8 200 235 +56b68 a 62 229 +56b72 6 213 200 +56b78 8 218 200 +56b80 2 294 200 +56b82 6 218 200 +56b88 a 294 200 +FUNC 56b94 28c 0 std::ostreambuf_iterator > std::priv::__do_put_bool > >(std::ostreambuf_iterator >, std::ios_base&, wchar_t, bool) +56b94 6 386 225 +56b9a 6 386 225 +56ba0 4 145 212 +56ba4 6 386 225 +56baa 4 145 212 +56bae 4 386 225 +56bb2 6 145 212 +56bb8 c 351 218 +56bc4 6 387 225 +56bca a 389 225 +56bd4 e 88 227 +56be2 2 89 238 +56be4 2 65 238 +56be6 2 139 212 +56be8 2 138 212 +56bea 2 400 237 +56bec 2 139 212 +56bee 2 400 237 +56bf0 6 392 225 +56bf6 2 396 225 +56bf8 2 395 225 +56bfa 4 396 225 +56bfe 6 398 225 +56c04 8 482 200 +56c0c 2 480 200 +56c0e a 482 200 +56c18 2 480 200 +56c1a 2 62 229 +56c1c 6 200 235 +56c22 a 200 235 +56c2c 2 200 235 +56c2e 8 62 229 +56c36 c 480 200 +56c42 6 482 200 +56c48 8 403 225 +56c50 2 213 200 +56c52 a 482 200 +56c5c 32 403 225 +56c8e 6 213 200 +56c94 8 62 229 +56c9c 4 213 200 +56ca0 4 214 200 +56ca4 4 62 229 +56ca8 6 200 235 +56cae 8 200 235 +56cb6 2 200 235 +56cb8 c 200 235 +56cc4 2 213 200 +56cc6 10 218 200 +56cd6 6 96 238 +56cdc 2 96 238 +56cde 2 97 238 +56ce0 2 135 222 +56ce2 2 97 238 +56ce4 4 323 201 +56ce8 4 161 201 +56cec 4 161 201 +56cf0 8 407 225 +56cf8 c 200 235 +56d04 e 89 227 +56d12 2 89 238 +56d14 2 65 238 +56d16 2 139 212 +56d18 2 138 212 +56d1a 2 400 237 +56d1c 2 139 212 +56d1e 2 400 237 +56d20 1c 392 225 +56d3c 2 213 200 +56d3e 1a 392 225 +56d58 6 213 200 +56d5e 8 62 229 +56d66 4 213 200 +56d6a 4 214 200 +56d6e 4 62 229 +56d72 6 200 235 +56d78 8 200 235 +56d80 2 200 235 +56d82 c 200 235 +56d8e 6 135 222 +56d94 12 399 225 +56da6 8 399 225 +56dae 2 480 200 +56db0 14 399 225 +56dc4 2 480 200 +56dc6 2 62 229 +56dc8 6 200 235 +56dce a 200 235 +56dd8 2 200 235 +56dda 8 62 229 +56de2 4 480 200 +56de6 14 482 200 +56dfa c 200 235 +56e06 a 156 238 +56e10 10 387 225 +FUNC 56e20 44 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, wchar_t, bool) const +56e20 4 420 225 +56e24 c 420 225 +56e30 2 422 225 +56e32 4 420 225 +56e36 4 422 225 +56e3a 10 426 225 +56e4a 6 427 225 +56e50 14 424 225 +FUNC 56e64 2dc 0 std::ostreambuf_iterator > std::priv::__do_put_bool > >(std::ostreambuf_iterator >, std::ios_base&, char, bool) +56e64 6 386 225 +56e6a 6 386 225 +56e70 4 145 212 +56e74 6 386 225 +56e7a 4 145 212 +56e7e 4 386 225 +56e82 6 145 212 +56e88 c 351 218 +56e94 6 387 225 +56e9a a 389 225 +56ea4 e 59 227 +56eb2 2 65 238 +56eb4 2 400 237 +56eb6 2 139 212 +56eb8 2 138 212 +56eba 2 400 237 +56ebc 2 139 212 +56ebe 6 392 225 +56ec4 2 396 225 +56ec6 2 395 225 +56ec8 4 398 225 +56ecc 4 396 225 +56ed0 6 398 225 +56ed6 4 482 200 +56eda 2 480 200 +56edc e 482 200 +56eea 2 480 200 +56eec 2 62 229 +56eee 6 200 235 +56ef4 8 200 235 +56efc 2 200 235 +56efe a 480 200 +56f08 4 482 200 +56f0c 4 403 225 +56f10 2 213 200 +56f12 4 482 200 +56f16 2 403 225 +56f18 a 482 200 +56f22 36 403 225 +56f58 a 213 200 +56f62 4 214 200 +56f66 4 62 229 +56f6a 6 200 235 +56f70 8 200 235 +56f78 2 200 235 +56f7a 8 200 235 +56f82 8 62 229 +56f8a 4 213 200 +56f8e 12 218 200 +56fa0 6 156 238 +56fa6 8 407 225 +56fae a 200 235 +56fb8 a 62 229 +56fc2 12 60 227 +56fd4 2 65 238 +56fd6 2 400 237 +56fd8 2 139 212 +56fda 2 138 212 +56fdc 2 400 237 +56fde 2 139 212 +56fe0 1c 392 225 +56ffc 2 213 200 +56ffe 1e 392 225 +5701c a 213 200 +57026 4 214 200 +5702a 4 62 229 +5702e 6 200 235 +57034 8 200 235 +5703c 2 200 235 +5703e 8 200 235 +57046 a 62 229 +57050 16 398 225 +57066 2 213 200 +57068 1a 398 225 +57082 a 213 200 +5708c 4 214 200 +57090 6 62 229 +57096 6 200 235 +5709c 8 200 235 +570a4 2 200 235 +570a6 8 200 235 +570ae a 62 229 +570b8 4 213 200 +570bc 4 218 200 +570c0 2 480 200 +570c2 2 399 225 +570c4 e 218 200 +570d2 16 399 225 +570e8 2 480 200 +570ea 2 62 229 +570ec 6 200 235 +570f2 8 200 235 +570fa 2 200 235 +570fc 4 480 200 +57100 14 482 200 +57114 a 200 235 +5711e a 62 229 +57128 a 156 238 +57132 e 387 225 +FUNC 57140 46 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, char, bool) const +57140 4 420 225 +57144 e 420 225 +57152 2 422 225 +57154 4 420 225 +57158 4 422 225 +5715c 10 426 225 +5716c 6 427 225 +57172 14 424 225 +FUNC 57188 154 0 std::pair >, bool> std::priv::__get_string >, wchar_t*>(std::istreambuf_iterator >, std::istreambuf_iterator >, wchar_t*, wchar_t*) +57188 6 51 220 +5718e a 51 220 +57198 2 53 220 +5719a 4 51 220 +5719e 16 53 220 +571b4 2 69 215 +571b6 2 75 215 +571b8 4 90 215 +571bc 4 77 215 +571c0 4 90 215 +571c4 4 53 220 +571c8 4 53 220 +571cc 6 90 215 +571d2 a 53 220 +571dc 6 57 220 +571e2 c 57 220 +571ee 10 57 220 +571fe 4 62 230 +57202 4 57 220 +57206 4 62 230 +5720a 8 58 220 +57212 6 235 235 +57218 4 764 186 +5721c 2 235 235 +5721e a 191 246 +57228 4 95 215 +5722c 6 235 235 +57232 4 764 186 +57236 2 235 235 +57238 c 191 246 +57244 4 95 215 +57248 6 235 235 +5724e 4 764 186 +57252 2 235 235 +57254 4 191 246 +57258 4 53 220 +5725c 8 191 246 +57264 2 95 215 +57266 4 53 220 +5726a 8 229 235 +57272 2 229 235 +57274 2 69 215 +57276 4 229 235 +5727a 10 235 235 +5728a 4 229 235 +5728e 2 69 215 +57290 16 229 235 +572a6 36 235 235 +FUNC 572e0 168 0 bool std::priv::__get_integer(wchar_t*&, wchar_t*&, int, long double&, int, bool, wchar_t, std::string const&, std::__false_type const&) +572e0 a 178 223 +572ea 8 188 223 +572f2 a 178 223 +572fc 6 190 223 +57302 2 183 223 +57304 4 188 223 +57308 2 183 223 +5730a 6 190 223 +57310 4 183 223 +57314 4 178 223 +57318 2 190 223 +5731a 4 188 223 +5731e 6 183 223 +57324 2 190 223 +57326 4 178 223 +5732a 12 190 223 +5733c 8 211 223 +57344 4 212 223 +57348 4 211 223 +5734c 6 212 223 +57352 4 213 223 +57356 a 213 223 +57360 6 214 223 +57366 2 213 223 +57368 4 190 223 +5736c 6 190 223 +57372 2 192 223 +57374 2 194 223 +57376 2 194 223 +57378 6 195 223 +5737e 4 196 223 +57382 2 194 223 +57384 4 52 223 +57388 2 52 223 +5738a 4 202 223 +5738e 4 208 223 +57392 4 206 223 +57396 4 205 223 +5739a 4 206 223 +5739e 8 208 223 +573a6 2 209 223 +573a8 4 190 223 +573ac c 190 223 +573b8 6 218 223 +573be 4 218 223 +573c2 6 219 223 +573c8 6 223 223 +573ce 2 224 223 +573d0 12 224 223 +573e2 2 233 223 +573e4 a 234 223 +573ee 8 214 223 +573f6 c 52 223 +57402 6 214 223 +57408 6 224 223 +5740e 4 224 223 +57412 6 224 223 +57418 2 233 223 +5741a 6 233 223 +57420 2 65 238 +57422 a 233 223 +5742c 1c 224 223 +FUNC 57448 134 0 std::basic_string, std::priv::__iostring_allocator >& std::basic_string, std::priv::__iostring_allocator >::assign(char const*, char const*) +57448 4 595 237 +5744c 2 595 237 +5744e 2 579 237 +57450 4 595 237 +57454 4 66 238 +57458 2 579 237 +5745a 2 90 238 +5745c a 579 237 +57466 4 764 186 +5746a 2 579 237 +5746c 4 232 246 +57470 2 581 237 +57472 2 582 237 +57474 2 579 237 +57476 2 90 238 +57478 8 579 237 +57480 2 74 238 +57482 4 355 216 +57486 2 74 238 +57488 4 74 238 +5748c 4 472 237 +57490 2 764 186 +57492 2 482 237 +57494 2 107 243 +57496 2 232 246 +57498 2 90 238 +5749a 2 107 243 +5749c 2 483 237 +5749e 8 106 243 +574a6 4 101 205 +574aa 6 485 237 +574b0 6 598 237 +574b6 2 400 237 +574b8 e 304 237 +574c6 a 306 237 +574d0 4 307 237 +574d4 4 307 237 +574d8 e 134 222 +574e6 2 107 243 +574e8 4 107 243 +574ec 2 107 243 +574ee c 106 243 +574fa 2 107 243 +574fc 8 106 243 +57504 4 101 205 +57508 2 107 243 +5750a 4 64 238 +5750e 4 96 238 +57512 2 96 238 +57514 6 97 238 +5751a 4 70 213 +5751e 2 97 238 +57520 2 135 222 +57522 4 161 201 +57526 4 161 201 +5752a 2 479 237 +5752c 2 164 238 +5752e 2 160 238 +57530 2 598 237 +57532 4 165 238 +57536 4 598 237 +5753a 4 307 237 +5753e 4 64 213 +57542 6 67 213 +57548 4 64 213 +5754c 6 135 222 +57552 6 74 238 +57558 2 90 238 +5755a 4 803 237 +5755e 2 168 246 +57560 2 806 237 +57562 2 598 237 +57564 2 168 246 +57566 6 806 237 +5756c 4 598 237 +57570 c 600 236 +FUNC 5757c 8c4 0 std::ostreambuf_iterator > std::priv::__money_do_put >, std::string, std::string>(std::ostreambuf_iterator >, bool, std::ios_base&, char, std::string const&, bool, std::string*) +5757c 8 316 220 +57584 c 316 220 +57590 4 145 212 +57594 6 316 220 +5759a 4 145 212 +5759e 8 316 220 +575a6 8 145 212 +575ae 2a 351 218 +575d8 2 101 206 +575da 2 351 218 +575dc 2c 101 206 +57608 2 336 220 +5760a 2 101 206 +5760c 4 336 220 +57610 8 92 221 +57618 2 93 221 +5761a 2 92 221 +5761c 6 93 221 +57622 6 94 221 +57628 2 93 221 +5762a c 94 221 +57636 8 98 221 +5763e 4 95 221 +57642 2 98 221 +57644 a 95 221 +5764e 4 65 238 +57652 4 89 238 +57656 4 354 220 +5765a 12 360 220 +5766c 2 361 220 +5766e 2 362 220 +57670 2 368 220 +57672 2 368 220 +57674 6 368 220 +5767a 2 137 221 +5767c 6 368 220 +57682 10 137 221 +57692 8 385 220 +5769a 4 387 220 +5769e 8 79 206 +576a6 6 387 220 +576ac 2 316 220 +576ae 2 387 220 +576b0 a 390 220 +576ba 12 156 238 +576cc 6 498 220 +576d2 a 499 220 +576dc 8 132 221 +576e4 2 133 221 +576e6 2 132 221 +576e8 6 133 221 +576ee 6 134 221 +576f4 2 133 221 +576f6 c 134 221 +57702 8 138 221 +5770a 4 135 221 +5770e 2 138 221 +57710 a 135 221 +5771a 4 65 238 +5771e 4 89 238 +57722 4 354 220 +57726 c 355 220 +57732 2 388 220 +57734 4 387 220 +57738 8 79 206 +57740 4 387 220 +57744 8 389 220 +5774c 4 120 238 +57750 8 108 213 +57758 4 41 213 +5775c 4 108 213 +57760 8 41 213 +57768 4 120 238 +5776c 4 41 213 +57770 6 124 238 +57776 4 481 201 +5777a 4 124 238 +5777e 4 90 238 +57782 2 101 205 +57784 4 397 220 +57788 2 101 205 +5778a c 397 220 +57796 a 398 220 +577a0 4 400 237 +577a4 2 399 220 +577a6 4 400 237 +577aa 2 399 220 +577ac 2 400 237 +577ae 1a 399 220 +577c8 4 66 238 +577cc 4 90 238 +577d0 2 400 237 +577d2 6 413 220 +577d8 4 400 237 +577dc 4 136 212 +577e0 2 400 237 +577e2 2 416 220 +577e4 2 418 220 +577e6 2 136 212 +577e8 2 418 220 +577ea 2 419 220 +577ec a 421 220 +577f6 2 422 220 +577f8 8 400 237 +57800 2 423 220 +57802 2 427 220 +57804 2 427 220 +57806 4 427 220 +5780a 2 100 221 +5780c 6 427 220 +57812 1a 100 221 +5782c 2 427 220 +5782e 4 100 221 +57832 2 427 220 +57834 6 100 221 +5783a 4 427 220 +5783e 2 437 220 +57840 4 100 221 +57844 4 427 220 +57848 6 437 220 +5784e 2 444 220 +57850 2 439 220 +57852 2 444 220 +57854 4 446 220 +57858 2 444 220 +5785a 2 444 220 +5785c 4 446 220 +57860 2 444 220 +57862 4 446 220 +57866 2 97 221 +57868 4 368 220 +5786c 12 97 221 +5787e 2 140 221 +57880 6 427 220 +57886 1a 139 221 +578a0 2 427 220 +578a2 a 139 221 +578ac 2 427 220 +578ae 4 139 221 +578b2 2 427 220 +578b4 8 437 220 +578bc 6 437 220 +578c2 4 444 220 +578c6 4 446 220 +578ca 2 444 220 +578cc 2 448 220 +578ce 8 446 220 +578d6 6 448 220 +578dc 8 448 220 +578e4 2 480 220 +578e6 2 444 220 +578e8 2 477 220 +578ea 4 480 220 +578ee 2 477 220 +578f0 8 480 220 +578f8 2 477 220 +578fa 2 480 220 +578fc 2 477 220 +578fe 1a 454 220 +57918 e 136 221 +57926 e 96 221 +57934 4 462 220 +57938 1e 463 220 +57956 c 471 220 +57962 2 452 220 +57964 4 452 220 +57968 4 400 237 +5796c 2 65 238 +5796e 2 400 237 +57970 1c 492 220 +5798c 2 493 220 +5798e 2 213 200 +57990 4 492 220 +57994 2 213 200 +57996 12 492 220 +579a8 8 213 200 +579b0 4 214 200 +579b4 4 62 229 +579b8 6 200 235 +579be 8 200 235 +579c6 2 200 235 +579c8 8 200 235 +579d0 8 62 229 +579d8 4 213 200 +579dc 10 218 200 +579ec c 493 220 +579f8 4 494 220 +579fc c 494 220 +57a08 4 64 238 +57a0c 8 498 220 +57a14 2 96 238 +57a16 4 498 220 +57a1a 4 96 238 +57a1e 6 96 238 +57a24 2 70 213 +57a26 4 97 238 +57a2a 6 70 213 +57a30 2 97 238 +57a32 2 135 222 +57a34 6 161 201 +57a3a 6 161 201 +57a40 6 62 229 +57a46 4 62 229 +57a4a a 200 235 +57a54 4 200 235 +57a58 2 62 229 +57a5a 6 200 235 +57a60 4 62 229 +57a64 1a 458 220 +57a7e 4 480 200 +57a82 6 458 220 +57a88 4 480 200 +57a8c c 458 220 +57a98 4 480 200 +57a9c 6 62 229 +57aa2 a 200 235 +57aac 8 200 235 +57ab4 4 480 200 +57ab8 12 482 200 +57aca e 459 220 +57ad8 8 470 220 +57ae0 c 473 220 +57aec a 62 229 +57af6 4 62 229 +57afa a 200 235 +57b04 8 200 235 +57b0c 4 62 229 +57b10 8 62 229 +57b18 a 200 235 +57b22 8 200 235 +57b2a 4 62 229 +57b2e 10 477 220 +57b3e 2 480 200 +57b40 6 62 229 +57b46 8 200 235 +57b4e 8 200 235 +57b56 4 480 200 +57b5a 2 482 200 +57b5c 2 477 220 +57b5e 8 478 220 +57b66 10 482 200 +57b76 8 477 220 +57b7e 6 478 220 +57b84 4 477 220 +57b88 a 478 220 +57b92 e 478 220 +57ba0 4 65 238 +57ba4 8 466 220 +57bac 4 62 229 +57bb0 2 467 220 +57bb2 2 62 229 +57bb4 4 62 229 +57bb8 a 200 235 +57bc2 2 62 229 +57bc4 6 200 235 +57bca 6 62 229 +57bd0 16 140 221 +57be6 2 427 220 +57be8 4 140 221 +57bec 2 427 220 +57bee a 140 221 +57bf8 4 427 220 +57bfc 4 140 221 +57c00 6 427 220 +57c06 1a 99 221 +57c20 2 427 220 +57c22 a 99 221 +57c2c 2 427 220 +57c2e 4 99 221 +57c32 4 427 220 +57c36 a 200 235 +57c40 c 62 229 +57c4c a 200 235 +57c56 c 62 229 +57c62 14 480 220 +57c76 8 480 220 +57c7e 2 62 229 +57c80 6 480 220 +57c86 2 62 229 +57c88 a 200 235 +57c92 4 200 235 +57c96 2 62 229 +57c98 6 200 235 +57c9e 4 62 229 +57ca2 16 483 220 +57cb8 c 483 220 +57cc4 6 494 220 +57cca 2 480 200 +57ccc c 494 220 +57cd8 2 480 200 +57cda 2 62 229 +57cdc 8 200 235 +57ce4 a 200 235 +57cee 8 480 200 +57cf6 10 482 200 +57d06 e 496 220 +57d14 a 200 235 +57d1e a 62 229 +57d28 18 471 220 +57d40 6 135 222 +57d46 2 480 200 +57d48 6 448 220 +57d4e 2 480 200 +57d50 c 448 220 +57d5c 4 480 200 +57d60 2 62 229 +57d62 8 200 235 +57d6a a 200 235 +57d74 4 480 200 +57d78 10 482 200 +57d88 e 450 220 +57d96 a 200 235 +57da0 a 62 229 +57daa 8 200 235 +57db2 6 62 229 +57db8 6 62 229 +57dbe 8 200 235 +57dc6 6 62 229 +57dcc 6 62 229 +57dd2 6 200 235 +57dd8 6 62 229 +57dde 6 62 229 +57de4 8 200 235 +57dec 8 62 229 +57df4 8 200 235 +57dfc c 62 229 +57e08 6 156 238 +57e0e c 498 220 +57e1a 26 156 238 +FUNC 57e40 32 0 std::money_put > >::do_put(std::ostreambuf_iterator >, bool, std::ios_base&, char, std::string const&) const +57e40 4 515 220 +57e44 8 515 220 +57e4c 20 518 220 +57e6c 6 519 220 +FUNC 57e74 8c4 0 std::ostreambuf_iterator > std::priv::__money_do_put >, std::string, std::priv::__basic_iostring >(std::ostreambuf_iterator >, bool, std::ios_base&, char, std::priv::__basic_iostring const&, bool, std::string*) +57e74 8 316 220 +57e7c c 316 220 +57e88 4 145 212 +57e8c 6 316 220 +57e92 4 145 212 +57e96 8 316 220 +57e9e 8 145 212 +57ea6 2a 351 218 +57ed0 2 101 206 +57ed2 2 351 218 +57ed4 2c 101 206 +57f00 2 336 220 +57f02 2 101 206 +57f04 4 336 220 +57f08 8 92 221 +57f10 2 93 221 +57f12 2 92 221 +57f14 6 93 221 +57f1a 6 94 221 +57f20 2 93 221 +57f22 c 94 221 +57f2e 8 98 221 +57f36 4 95 221 +57f3a 2 98 221 +57f3c a 95 221 +57f46 4 65 238 +57f4a 4 89 238 +57f4e 4 354 220 +57f52 12 360 220 +57f64 2 361 220 +57f66 2 362 220 +57f68 2 368 220 +57f6a 2 368 220 +57f6c 6 368 220 +57f72 2 137 221 +57f74 6 368 220 +57f7a 10 137 221 +57f8a 8 385 220 +57f92 4 387 220 +57f96 8 79 206 +57f9e 6 387 220 +57fa4 2 316 220 +57fa6 2 387 220 +57fa8 a 390 220 +57fb2 12 156 238 +57fc4 6 498 220 +57fca a 499 220 +57fd4 8 132 221 +57fdc 2 133 221 +57fde 2 132 221 +57fe0 6 133 221 +57fe6 6 134 221 +57fec 2 133 221 +57fee c 134 221 +57ffa 8 138 221 +58002 4 135 221 +58006 2 138 221 +58008 a 135 221 +58012 4 65 238 +58016 4 89 238 +5801a 4 354 220 +5801e c 355 220 +5802a 2 388 220 +5802c 4 387 220 +58030 8 79 206 +58038 4 387 220 +5803c 8 389 220 +58044 4 120 238 +58048 8 108 213 +58050 4 41 213 +58054 4 108 213 +58058 8 41 213 +58060 4 120 238 +58064 4 41 213 +58068 6 124 238 +5806e 4 481 201 +58072 4 124 238 +58076 4 90 238 +5807a 2 101 205 +5807c 4 397 220 +58080 2 101 205 +58082 c 397 220 +5808e a 398 220 +58098 4 400 237 +5809c 2 399 220 +5809e 4 400 237 +580a2 2 399 220 +580a4 2 400 237 +580a6 1a 399 220 +580c0 4 66 238 +580c4 4 90 238 +580c8 2 400 237 +580ca 6 413 220 +580d0 4 400 237 +580d4 4 136 212 +580d8 2 400 237 +580da 2 416 220 +580dc 2 418 220 +580de 2 136 212 +580e0 2 418 220 +580e2 2 419 220 +580e4 a 421 220 +580ee 2 422 220 +580f0 8 400 237 +580f8 2 423 220 +580fa 2 427 220 +580fc 2 427 220 +580fe 4 427 220 +58102 2 100 221 +58104 6 427 220 +5810a 1a 100 221 +58124 2 427 220 +58126 4 100 221 +5812a 2 427 220 +5812c 6 100 221 +58132 4 427 220 +58136 2 437 220 +58138 4 100 221 +5813c 4 427 220 +58140 6 437 220 +58146 2 444 220 +58148 2 439 220 +5814a 2 444 220 +5814c 4 446 220 +58150 2 444 220 +58152 2 444 220 +58154 4 446 220 +58158 2 444 220 +5815a 4 446 220 +5815e 2 97 221 +58160 4 368 220 +58164 12 97 221 +58176 2 140 221 +58178 6 427 220 +5817e 1a 139 221 +58198 2 427 220 +5819a a 139 221 +581a4 2 427 220 +581a6 4 139 221 +581aa 2 427 220 +581ac 8 437 220 +581b4 6 437 220 +581ba 4 444 220 +581be 4 446 220 +581c2 2 444 220 +581c4 2 448 220 +581c6 8 446 220 +581ce 6 448 220 +581d4 8 448 220 +581dc 2 480 220 +581de 2 444 220 +581e0 2 477 220 +581e2 4 480 220 +581e6 2 477 220 +581e8 8 480 220 +581f0 2 477 220 +581f2 2 480 220 +581f4 2 477 220 +581f6 1a 454 220 +58210 e 136 221 +5821e e 96 221 +5822c 4 462 220 +58230 1e 463 220 +5824e c 471 220 +5825a 2 452 220 +5825c 4 452 220 +58260 4 400 237 +58264 2 65 238 +58266 2 400 237 +58268 1c 492 220 +58284 2 493 220 +58286 2 213 200 +58288 4 492 220 +5828c 2 213 200 +5828e 12 492 220 +582a0 8 213 200 +582a8 4 214 200 +582ac 4 62 229 +582b0 6 200 235 +582b6 8 200 235 +582be 2 200 235 +582c0 8 200 235 +582c8 8 62 229 +582d0 4 213 200 +582d4 10 218 200 +582e4 c 493 220 +582f0 4 494 220 +582f4 c 494 220 +58300 4 64 238 +58304 8 498 220 +5830c 2 96 238 +5830e 4 498 220 +58312 4 96 238 +58316 6 96 238 +5831c 2 70 213 +5831e 4 97 238 +58322 6 70 213 +58328 2 97 238 +5832a 2 135 222 +5832c 6 161 201 +58332 6 161 201 +58338 6 62 229 +5833e 4 62 229 +58342 a 200 235 +5834c 4 200 235 +58350 2 62 229 +58352 6 200 235 +58358 4 62 229 +5835c 1a 458 220 +58376 4 480 200 +5837a 6 458 220 +58380 4 480 200 +58384 c 458 220 +58390 4 480 200 +58394 6 62 229 +5839a a 200 235 +583a4 8 200 235 +583ac 4 480 200 +583b0 12 482 200 +583c2 e 459 220 +583d0 8 470 220 +583d8 c 473 220 +583e4 a 62 229 +583ee 4 62 229 +583f2 a 200 235 +583fc 8 200 235 +58404 4 62 229 +58408 8 62 229 +58410 a 200 235 +5841a 8 200 235 +58422 4 62 229 +58426 10 477 220 +58436 2 480 200 +58438 6 62 229 +5843e 8 200 235 +58446 8 200 235 +5844e 4 480 200 +58452 2 482 200 +58454 2 477 220 +58456 8 478 220 +5845e 10 482 200 +5846e 8 477 220 +58476 6 478 220 +5847c 4 477 220 +58480 a 478 220 +5848a e 478 220 +58498 4 65 238 +5849c 8 466 220 +584a4 4 62 229 +584a8 2 467 220 +584aa 2 62 229 +584ac 4 62 229 +584b0 a 200 235 +584ba 2 62 229 +584bc 6 200 235 +584c2 6 62 229 +584c8 16 140 221 +584de 2 427 220 +584e0 4 140 221 +584e4 2 427 220 +584e6 a 140 221 +584f0 4 427 220 +584f4 4 140 221 +584f8 6 427 220 +584fe 1a 99 221 +58518 2 427 220 +5851a a 99 221 +58524 2 427 220 +58526 4 99 221 +5852a 4 427 220 +5852e a 200 235 +58538 c 62 229 +58544 a 200 235 +5854e c 62 229 +5855a 14 480 220 +5856e 8 480 220 +58576 2 62 229 +58578 6 480 220 +5857e 2 62 229 +58580 a 200 235 +5858a 4 200 235 +5858e 2 62 229 +58590 6 200 235 +58596 4 62 229 +5859a 16 483 220 +585b0 c 483 220 +585bc 6 494 220 +585c2 2 480 200 +585c4 c 494 220 +585d0 2 480 200 +585d2 2 62 229 +585d4 8 200 235 +585dc a 200 235 +585e6 8 480 200 +585ee 10 482 200 +585fe e 496 220 +5860c a 200 235 +58616 a 62 229 +58620 18 471 220 +58638 6 135 222 +5863e 2 480 200 +58640 6 448 220 +58646 2 480 200 +58648 c 448 220 +58654 4 480 200 +58658 2 62 229 +5865a 8 200 235 +58662 a 200 235 +5866c 4 480 200 +58670 10 482 200 +58680 e 450 220 +5868e a 200 235 +58698 a 62 229 +586a2 8 200 235 +586aa 6 62 229 +586b0 6 62 229 +586b6 8 200 235 +586be 6 62 229 +586c4 6 62 229 +586ca 6 200 235 +586d0 6 62 229 +586d6 6 62 229 +586dc 8 200 235 +586e4 8 62 229 +586ec 8 200 235 +586f4 c 62 229 +58700 6 156 238 +58706 c 498 220 +58712 26 156 238 +FUNC 58738 9c 0 std::money_put > >::do_put(std::ostreambuf_iterator >, bool, std::ios_base&, char, long double) const +58738 6 505 220 +5873e 2 505 220 +58740 2 41 213 +58742 2 120 238 +58744 2 108 213 +58746 6 505 220 +5874c a 108 213 +58756 8 41 213 +5875e 2 120 238 +58760 4 41 213 +58764 6 124 238 +5876a 4 481 201 +5876e 4 124 238 +58772 2 90 238 +58774 2 101 205 +58776 2 128 225 +58778 2 101 205 +5877a 8 128 225 +58782 20 510 220 +587a2 4 64 238 +587a6 4 96 238 +587aa 2 96 238 +587ac 2 70 213 +587ae 2 97 238 +587b0 2 70 213 +587b2 2 97 238 +587b4 4 161 201 +587b8 4 161 201 +587bc 8 511 220 +587c4 6 135 222 +587ca a 156 238 +FUNC 587d8 168 0 bool std::priv::__get_integer(char*&, char*&, int, long double&, int, bool, char, std::string const&, std::__false_type const&) +587d8 a 178 223 +587e2 8 188 223 +587ea a 178 223 +587f4 6 190 223 +587fa 2 183 223 +587fc 4 188 223 +58800 2 183 223 +58802 6 190 223 +58808 4 183 223 +5880c 4 178 223 +58810 2 190 223 +58812 4 188 223 +58816 6 183 223 +5881c 2 190 223 +5881e 4 178 223 +58822 12 190 223 +58834 8 211 223 +5883c 4 212 223 +58840 4 211 223 +58844 6 212 223 +5884a 4 213 223 +5884e a 213 223 +58858 6 214 223 +5885e 2 213 223 +58860 4 190 223 +58864 6 190 223 +5886a 2 192 223 +5886c 2 194 223 +5886e 2 194 223 +58870 6 195 223 +58876 4 196 223 +5887a 2 194 223 +5887c 4 52 223 +58880 2 52 223 +58882 4 202 223 +58886 4 208 223 +5888a 4 206 223 +5888e 4 205 223 +58892 4 206 223 +58896 8 208 223 +5889e 2 209 223 +588a0 4 190 223 +588a4 c 190 223 +588b0 6 218 223 +588b6 4 218 223 +588ba 6 219 223 +588c0 6 223 223 +588c6 2 224 223 +588c8 12 224 223 +588da 2 233 223 +588dc a 234 223 +588e6 8 214 223 +588ee c 52 223 +588fa 6 214 223 +58900 6 224 223 +58906 4 224 223 +5890a 6 224 223 +58910 2 233 223 +58912 6 233 223 +58918 2 65 238 +5891a a 233 223 +58924 1c 224 223 +FUNC 58940 1e8 0 unsigned int std::priv::__match >, std::basic_string, std::allocator > const*>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::basic_string, std::allocator > const*, std::basic_string, std::allocator > const*) +58940 6 78 241 +58946 2 78 241 +58948 2 87 241 +5894a 2 78 241 +5894c 2 80 241 +5894e 2 87 241 +58950 4 95 215 +58954 2 80 241 +58956 2 78 241 +58958 2 82 241 +5895a 2 81 241 +5895c 4 80 241 +58960 4 87 241 +58964 4 80 241 +58968 4 87 241 +5896c 4 80 241 +58970 4 87 241 +58974 8 80 241 +5897c 4 85 241 +58980 2 83 241 +58982 2 75 215 +58984 8 90 215 +5898c a 77 215 +58996 a 90 215 +589a0 6 89 241 +589a6 6 91 241 +589ac 18 78 241 +589c4 6 92 241 +589ca 2 115 241 +589cc c 115 241 +589d8 4 91 241 +589dc 2 68 215 +589de 8 229 235 +589e6 4 229 235 +589ea 2 69 215 +589ec 8 120 241 +589f4 4 69 215 +589f8 4 90 215 +589fc 2 65 238 +589fe 2 90 215 +58a00 6 93 241 +58a06 2 107 241 +58a08 6 108 241 +58a0e 4 110 241 +58a12 4 107 241 +58a16 2 110 241 +58a18 8 124 241 +58a20 2 92 215 +58a22 6 235 235 +58a28 4 764 186 +58a2c 2 235 235 +58a2e 4 191 246 +58a32 2 93 215 +58a34 2 191 246 +58a36 4 95 215 +58a3a 6 191 246 +58a40 2 65 238 +58a42 6 93 241 +58a48 6 400 237 +58a4e 6 94 241 +58a54 6 104 241 +58a5a 14 235 235 +58a6e 2 96 241 +58a70 6 97 241 +58a76 4 99 241 +58a7a 4 96 241 +58a7e 2 99 241 +58a80 4 93 241 +58a84 6 235 235 +58a8a 4 764 186 +58a8e 2 235 235 +58a90 2 93 215 +58a92 a 191 246 +58a9c 2 93 215 +58a9e 4 95 215 +58aa2 4 94 215 +58aa6 6 235 235 +58aac 4 764 186 +58ab0 2 235 235 +58ab2 4 191 246 +58ab6 2 93 215 +58ab8 2 191 246 +58aba 4 95 215 +58abe 6 191 246 +58ac4 e 77 215 +58ad2 12 229 235 +58ae4 20 235 235 +58b04 6 91 241 +58b0a 2 68 215 +58b0c 8 229 235 +58b14 4 229 235 +58b18 2 69 215 +58b1a 2 93 241 +58b1c 2 69 215 +58b1e 2 101 241 +58b20 8 229 235 +FUNC 58b28 84 0 std::istreambuf_iterator >::equal(std::istreambuf_iterator > const&) const +58b28 4 74 215 +58b2c 2 75 215 +58b2e 2 74 215 +58b30 2 75 215 +58b32 4 90 215 +58b36 4 77 215 +58b3a 6 90 215 +58b40 2 79 215 +58b42 c 79 215 +58b4e 4 80 215 +58b52 6 235 235 +58b58 4 764 186 +58b5c 2 235 235 +58b5e 4 191 246 +58b62 2 93 215 +58b64 6 191 246 +58b6a 2 95 215 +58b6c 2 94 215 +58b6e 4 95 215 +58b72 6 235 235 +58b78 4 764 186 +58b7c 2 235 235 +58b7e 4 191 246 +58b82 2 93 215 +58b84 a 191 246 +58b8e 6 95 215 +58b94 18 235 235 +FUNC 58bac 78 0 std::time_get > >::do_get_monthname(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, tm*) const +58bac 4 384 241 +58bb0 8 292 241 +58bb8 2 384 241 +58bba 6 292 241 +58bc0 6 384 241 +58bc6 8 292 241 +58bce 2 384 241 +58bd0 4 292 241 +58bd4 4 293 241 +58bd8 18 294 241 +58bf0 2 390 241 +58bf2 2 294 241 +58bf4 2 390 241 +58bf6 a 396 241 +58c00 a 397 241 +58c0a 2 392 241 +58c0c 2 112 215 +58c0e 2 392 241 +58c10 6 112 215 +58c16 4 393 241 +58c1a a 394 241 +FUNC 58c24 76 0 std::time_get > >::do_get_weekday(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, tm*) const +58c24 4 367 241 +58c28 8 281 241 +58c30 6 367 241 +58c36 4 281 241 +58c3a 2 367 241 +58c3c 4 281 241 +58c40 2 367 241 +58c42 4 281 241 +58c46 4 282 241 +58c4a 1c 283 241 +58c66 2 373 241 +58c68 2 283 241 +58c6a 2 373 241 +58c6c a 379 241 +58c76 a 380 241 +58c80 2 375 241 +58c82 2 112 215 +58c84 2 375 241 +58c86 6 112 215 +58c8c 4 376 241 +58c90 a 377 241 +FUNC 58c9c 284 0 std::istreambuf_iterator > std::priv::__do_get_alphabool >, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, bool&, wchar_t*) +58c9c 4 449 223 +58ca0 2 145 212 +58ca2 2 449 223 +58ca4 2 449 223 +58ca6 2 145 212 +58ca8 4 449 223 +58cac 8 145 212 +58cb4 c 351 218 +58cc0 6 451 223 +58cc6 a 88 227 +58cd0 2 89 227 +58cd2 2 88 227 +58cd4 2 89 227 +58cd6 2 88 227 +58cd8 16 89 227 +58cee 2 95 215 +58cf0 2 69 215 +58cf2 2 75 215 +58cf4 8 90 215 +58cfc 4 77 215 +58d00 a 90 215 +58d0a 6 458 223 +58d10 10 90 215 +58d20 6 460 223 +58d26 4 460 223 +58d2a 10 449 223 +58d3a 6 461 223 +58d40 4 461 223 +58d44 10 449 223 +58d54 2 462 223 +58d56 6 464 223 +58d5c a 400 237 +58d66 6 464 223 +58d6c 4 229 235 +58d70 4 229 235 +58d74 4 69 215 +58d78 6 471 223 +58d7e 6 400 237 +58d84 e 449 223 +58d92 6 472 223 +58d98 6 400 237 +58d9e e 449 223 +58dac 6 474 223 +58db2 8 474 223 +58dba 6 475 223 +58dc0 6 476 223 +58dc6 8 112 215 +58dce 2 481 223 +58dd0 a 482 223 +58dda 6 484 223 +58de0 2 64 238 +58de2 4 484 223 +58de6 6 96 238 +58dec 2 96 238 +58dee 2 97 238 +58df0 2 135 222 +58df2 2 97 238 +58df4 4 323 201 +58df8 4 161 201 +58dfc 4 161 201 +58e00 2 64 238 +58e02 6 96 238 +58e08 2 96 238 +58e0a 4 97 238 +58e0e 4 323 201 +58e12 4 161 201 +58e16 4 161 201 +58e1a 8 485 223 +58e22 6 235 235 +58e28 4 764 186 +58e2c 2 235 235 +58e2e 4 191 246 +58e32 2 93 215 +58e34 2 191 246 +58e36 4 95 215 +58e3a 4 191 246 +58e3e 4 94 215 +58e42 6 464 223 +58e48 a 400 237 +58e52 6 464 223 +58e58 2 229 235 +58e5a 4 464 223 +58e5e 2 229 235 +58e60 8 229 235 +58e68 6 464 223 +58e6e 4 229 235 +58e72 4 229 235 +58e76 8 69 215 +58e7e 6 235 235 +58e84 4 764 186 +58e88 2 235 235 +58e8a 4 191 246 +58e8e 2 93 215 +58e90 4 191 246 +58e94 4 95 215 +58e98 a 191 246 +58ea2 a 229 235 +58eac 6 235 235 +58eb2 4 764 186 +58eb6 2 235 235 +58eb8 4 191 246 +58ebc 2 93 215 +58ebe 2 191 246 +58ec0 4 95 215 +58ec4 8 191 246 +58ecc 20 235 235 +58eec c 135 222 +58ef8 8 479 223 +58f00 a 451 223 +58f0a 16 156 238 +FUNC 58f20 1ce 0 bool std::priv::__get_integer >, int, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, int&, int, bool, wchar_t, std::string const&, std::__false_type const&) +58f20 6 178 223 +58f26 4 178 223 +58f2a 2 183 223 +58f2c 4 186 223 +58f30 2 185 223 +58f32 2 178 223 +58f34 4 188 223 +58f38 2 183 223 +58f3a 4 95 215 +58f3e 4 183 223 +58f42 2 188 223 +58f44 2 178 223 +58f46 4 183 223 +58f4a 4 178 223 +58f4e 6 183 223 +58f54 a 188 223 +58f5e 2 186 223 +58f60 2 181 223 +58f62 2 186 223 +58f64 4 188 223 +58f68 2 75 215 +58f6a 8 90 215 +58f72 4 77 215 +58f76 8 90 215 +58f7e 6 190 223 +58f84 8 90 215 +58f8c 6 194 223 +58f92 6 194 223 +58f98 6 52 223 +58f9e 2 52 223 +58fa0 4 202 223 +58fa4 2 208 223 +58fa6 2 206 223 +58fa8 4 205 223 +58fac 2 208 223 +58fae 2 206 223 +58fb0 2 208 223 +58fb2 4 211 223 +58fb6 4 212 223 +58fba 6 213 223 +58fc0 6 213 223 +58fc6 4 213 223 +58fca 2 68 215 +58fcc 8 229 235 +58fd4 4 229 235 +58fd8 6 69 215 +58fde 6 235 235 +58fe4 4 764 186 +58fe8 2 235 235 +58fea 4 191 246 +58fee 2 93 215 +58ff0 2 191 246 +58ff2 4 95 215 +58ff6 4 191 246 +58ffa 2 94 215 +58ffc 8 190 223 +59004 6 218 223 +5900a 6 218 223 +59010 8 219 223 +59018 2 233 223 +5901a 6 223 223 +59020 6 224 223 +59026 2 224 223 +59028 2 233 223 +5902a 6 224 223 +59030 6 234 223 +59036 2 92 215 +59038 6 235 235 +5903e 4 764 186 +59042 2 235 235 +59044 4 191 246 +59048 2 93 215 +5904a 4 191 246 +5904e 4 95 215 +59052 8 191 246 +5905a 2 68 215 +5905c 4 209 223 +59060 8 229 235 +59068 a 229 235 +59072 4 211 223 +59076 6 235 235 +5907c 4 764 186 +59080 2 235 235 +59082 4 191 246 +59086 2 93 215 +59088 2 191 246 +5908a 4 95 215 +5908e 8 191 246 +59096 6 195 223 +5909c 2 196 223 +5909e 2 195 223 +590a0 2 197 223 +590a2 6 52 223 +590a8 18 235 235 +590c0 6 224 223 +590c6 2 224 223 +590c8 4 224 223 +590cc 2 224 223 +590ce 2 233 223 +590d0 6 233 223 +590d6 2 65 238 +590d8 4 233 223 +590dc 2 65 238 +590de 8 233 223 +590e6 8 224 223 +FUNC 590f0 4e 0 std::priv::__get_decimal_integer >, int, wchar_t> +590f0 4 239 223 +590f4 2 120 238 +590f6 4 239 223 +590fa 4 124 238 +590fe 2 239 223 +59100 2 120 238 +59102 2 481 201 +59104 4 124 238 +59108 4 101 205 +5910c 4 242 223 +59110 2 101 205 +59112 16 242 223 +59128 6 156 238 +5912e 6 243 223 +59134 a 156 238 +FUNC 59140 350 0 char const* std::priv::__get_formatted_time >, wchar_t, std::priv::_WTime_Info>(std::istreambuf_iterator >, std::istreambuf_iterator >, char const*, char const*, wchar_t*, std::priv::_WTime_Info const&, std::ios_base const&, int&, tm*) +59140 8 149 241 +59148 4 149 241 +5914c 2 145 212 +5914e 4 149 241 +59152 4 145 212 +59156 2 149 241 +59158 2 145 212 +5915a c 149 241 +59166 6 145 212 +5916c c 351 218 +59178 2 153 241 +5917a 4 231 241 +5917e 2 95 215 +59180 2 231 241 +59182 4 153 241 +59186 6 231 241 +5918c 4 75 215 +59190 a 90 215 +5919a 4 77 215 +5919e a 90 215 +591a8 8 156 241 +591b0 c 276 241 +591bc 6 235 235 +591c2 4 764 186 +591c6 4 235 235 +591ca 4 191 246 +591ce 2 93 215 +591d0 2 191 246 +591d2 4 95 215 +591d6 4 191 246 +591da 4 156 241 +591de 4 94 215 +591e2 4 156 241 +591e6 4 156 241 +591ea 8 158 241 +591f2 2 160 241 +591f4 6 161 241 +591fa 2 159 241 +591fc 7e 166 241 +5927a 2 157 241 +5927c 1c 171 241 +59298 4 172 241 +5929c 4 174 241 +592a0 4 272 241 +592a4 c 250 241 +592b0 6 251 241 +592b6 4 272 241 +592ba 10 231 241 +592ca 6 232 241 +592d0 6 235 241 +592d6 4 237 241 +592da 6 237 241 +592e0 6 238 241 +592e6 4 272 241 +592ea c 213 241 +592f6 a 214 241 +59300 2 215 241 +59302 4 215 241 +59306 4 215 241 +5930a a 216 241 +59314 2 217 241 +59316 c 206 241 +59322 6 207 241 +59328 4 272 241 +5932c c 190 241 +59338 2 191 241 +5933a 8 191 241 +59342 4 191 241 +59346 a 192 241 +59350 2 193 241 +59352 2 166 241 +59354 2 157 241 +59356 20 182 241 +59376 6 183 241 +5937c 4 185 241 +59380 4 272 241 +59384 c 257 241 +59390 e 258 241 +5939e 6 259 241 +593a4 4 272 241 +593a8 a 243 241 +593b2 6 244 241 +593b8 4 272 241 +593bc c 223 241 +593c8 6 224 241 +593ce 4 272 241 +593d2 c 199 241 +593de 6 200 241 +593e4 4 272 241 +593e8 2 166 241 +593ea 4 179 241 +593ee 2 166 241 +593f0 4 168 241 +593f4 8 269 241 +593fc 4 90 215 +59400 4 269 241 +59404 2 90 215 +59406 a 206 206 +59410 6 269 241 +59416 4 272 241 +5941a 6 235 235 +59420 4 764 186 +59424 2 235 235 +59426 4 191 246 +5942a 2 93 215 +5942c 2 191 246 +5942e 4 95 215 +59432 a 191 246 +5943c 2 92 215 +5943e 6 235 235 +59444 6 764 186 +5944a 2 235 235 +5944c a 235 235 +59456 2 163 241 +59458 4 162 241 +5945c 10 235 235 +5946c a 235 241 +59476 2 236 241 +59478 2 272 241 +5947a 6 236 241 +59480 10 153 241 +FUNC 59490 8a 0 std::time_get > >::do_get_date(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, tm*) const +59490 8 304 241 +59498 2 315 241 +5949a 2 304 241 +5949c 4 89 238 +594a0 4 315 241 +594a4 2 304 241 +594a6 8 315 241 +594ae 6 304 241 +594b4 2 315 241 +594b6 4 304 241 +594ba 2c 315 241 +594e6 2 316 241 +594e8 4 317 241 +594ec 2 316 241 +594ee 2 319 241 +594f0 2 112 215 +594f2 2 319 241 +594f4 6 112 215 +594fa 2 320 241 +594fc 8 321 241 +59504 a 323 241 +5950e c 324 241 +FUNC 5951c 78 0 std::time_get > >::do_get_time(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, tm*) const +5951c 6 328 241 +59522 2 338 241 +59524 4 328 241 +59528 8 338 241 +59530 4 328 241 +59534 2 89 238 +59536 2 338 241 +59538 4 328 241 +5953c 10 338 241 +5954c 2 328 241 +5954e 14 338 241 +59562 2 112 215 +59564 8 339 241 +5956c 2 112 215 +5956e 2 339 241 +59570 4 112 215 +59574 2 341 241 +59576 8 342 241 +5957e a 343 241 +59588 c 344 241 +FUNC 59594 6e 0 std::time_get > >::do_get_year(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, tm*) const +59594 4 348 241 +59598 2 348 241 +5959a 4 112 215 +5959e 8 348 241 +595a6 4 112 215 +595aa 2 351 241 +595ac 6 353 241 +595b2 4 352 241 +595b6 4 353 241 +595ba a 363 241 +595c4 c 356 241 +595d0 2 357 241 +595d2 2 112 215 +595d4 8 357 241 +595dc 8 358 241 +595e4 2 112 215 +595e6 2 358 241 +595e8 4 112 215 +595ec 2 359 241 +595ee 8 360 241 +595f6 c 362 241 +FUNC 59604 84 0 std::istreambuf_iterator >::equal(std::istreambuf_iterator > const&) const +59604 4 74 215 +59608 2 75 215 +5960a 2 74 215 +5960c 2 75 215 +5960e 4 90 215 +59612 4 77 215 +59616 6 90 215 +5961c 2 79 215 +5961e c 79 215 +5962a 4 80 215 +5962e 6 235 235 +59634 4 223 246 +59638 2 235 235 +5963a 4 191 246 +5963e 2 220 246 +59640 6 191 246 +59646 2 95 215 +59648 2 94 215 +5964a 4 95 215 +5964e 6 235 235 +59654 4 223 246 +59658 2 235 235 +5965a 4 191 246 +5965e 2 220 246 +59660 a 191 246 +5966a 6 95 215 +59670 18 235 235 +FUNC 59688 178 0 unsigned int std::priv::__match >, std::string const*>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::string const*, std::string const*) +59688 6 78 241 +5968e 2 78 241 +59690 4 107 241 +59694 2 78 241 +59696 2 80 241 +59698 2 78 241 +5969a 2 87 241 +5969c 2 80 241 +5969e 4 120 215 +596a2 2 82 241 +596a4 4 80 241 +596a8 2 87 241 +596aa 2 81 241 +596ac 2 87 241 +596ae 4 80 241 +596b2 4 87 241 +596b6 4 80 241 +596ba 4 87 241 +596be 8 80 241 +596c6 2 85 241 +596c8 2 83 241 +596ca 4 120 215 +596ce 4 89 241 +596d2 6 91 241 +596d8 10 78 241 +596e8 c 91 241 +596f4 a 92 241 +596fe 2 115 241 +59700 8 115 241 +59708 2 91 241 +5970a 8 115 241 +59712 6 91 241 +59718 2 68 215 +5971a 8 229 235 +59722 4 229 235 +59726 2 69 215 +59728 2 120 215 +5972a 2 69 215 +5972c 4 120 241 +59730 2 120 215 +59732 2 120 241 +59734 4 120 215 +59738 4 89 241 +5973c 8 124 241 +59744 4 90 215 +59748 2 65 238 +5974a 2 90 215 +5974c 6 93 241 +59752 2 107 241 +59754 6 108 241 +5975a 4 110 241 +5975e 4 107 241 +59762 4 110 241 +59766 2 92 215 +59768 6 235 235 +5976e 4 223 246 +59772 2 235 235 +59774 4 191 246 +59778 2 220 246 +5977a 2 191 246 +5977c 2 93 215 +5977e 4 191 246 +59782 4 95 215 +59786 2 191 246 +59788 2 65 238 +5978a 6 93 241 +59790 4 400 237 +59794 6 94 241 +5979a 6 104 241 +597a0 14 235 235 +597b4 2 96 241 +597b6 6 97 241 +597bc 4 99 241 +597c0 4 96 241 +597c4 2 99 241 +597c6 6 93 241 +597cc 10 229 235 +597dc 4 91 241 +597e0 2 68 215 +597e2 8 229 235 +597ea 4 229 235 +597ee 2 69 215 +597f0 4 93 241 +597f4 2 69 215 +597f6 2 101 241 +597f8 8 229 235 +FUNC 59800 6e 0 std::time_get > >::do_get_monthname(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, tm*) const +59800 2 384 241 +59802 4 292 241 +59806 2 384 241 +59808 6 292 241 +5980e 6 384 241 +59814 8 292 241 +5981c 2 384 241 +5981e 4 292 241 +59822 2 384 241 +59824 4 293 241 +59828 18 294 241 +59840 2 390 241 +59842 2 294 241 +59844 2 390 241 +59846 8 396 241 +5984e 6 397 241 +59854 2 392 241 +59856 2 112 215 +59858 2 392 241 +5985a 6 112 215 +59860 4 393 241 +59864 a 394 241 +FUNC 59870 70 0 std::time_get > >::do_get_weekday(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, tm*) const +59870 2 367 241 +59872 4 281 241 +59876 2 367 241 +59878 4 281 241 +5987c 2 367 241 +5987e 2 281 241 +59880 4 367 241 +59884 6 281 241 +5988a 2 367 241 +5988c 4 281 241 +59890 2 367 241 +59892 4 282 241 +59896 1c 283 241 +598b2 2 373 241 +598b4 2 283 241 +598b6 2 373 241 +598b8 8 379 241 +598c0 6 380 241 +598c6 2 375 241 +598c8 2 112 215 +598ca 2 375 241 +598cc 6 112 215 +598d2 4 376 241 +598d6 a 377 241 +FUNC 598e0 c0 0 std::pair >, bool> std::priv::__get_string >, char*>(std::istreambuf_iterator >, std::istreambuf_iterator >, char*, char*) +598e0 8 51 220 +598e8 2 51 220 +598ea 4 95 215 +598ee 8 51 220 +598f6 4 69 215 +598fa 6 51 220 +59900 8 120 215 +59908 2 69 215 +5990a 2 53 220 +5990c 4 53 220 +59910 a 90 215 +5991a 2 95 215 +5991c 6 53 220 +59922 4 57 220 +59926 4 57 220 +5992a 2 57 220 +5992c a 57 220 +59936 4 57 220 +5993a 4 62 230 +5993e c 58 220 +5994a 2 92 215 +5994c 6 235 235 +59952 4 223 246 +59956 2 235 235 +59958 4 191 246 +5995c 2 220 246 +5995e 2 191 246 +59960 4 93 215 +59964 4 191 246 +59968 2 53 220 +5996a 2 95 215 +5996c 4 191 246 +59970 2 53 220 +59972 4 95 215 +59976 2 53 220 +59978 2 68 215 +5997a 8 229 235 +59982 2 229 235 +59984 4 69 215 +59988 4 229 235 +5998c 6 229 235 +59992 6 69 215 +59998 8 235 235 +FUNC 599a0 198 0 std::istreambuf_iterator > std::priv::__do_get_alphabool >, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, bool&, char*) +599a0 2 145 212 +599a2 6 449 223 +599a8 4 449 223 +599ac 4 145 212 +599b0 2 449 223 +599b2 6 145 212 +599b8 c 351 218 +599c4 6 451 223 +599ca a 59 227 +599d4 10 60 227 +599e4 2 95 215 +599e6 2 69 215 +599e8 8 120 215 +599f0 2 458 223 +599f2 a 90 215 +599fc 2 460 223 +599fe 2 460 223 +59a00 e 449 223 +59a0e 2 461 223 +59a10 2 461 223 +59a12 a 449 223 +59a1c 2 462 223 +59a1e 4 464 223 +59a22 6 400 237 +59a28 4 464 223 +59a2c 8 229 235 +59a34 4 229 235 +59a38 4 69 215 +59a3c 2 471 223 +59a3e 6 400 237 +59a44 8 449 223 +59a4c 2 472 223 +59a4e 6 400 237 +59a54 8 449 223 +59a5c 2 474 223 +59a5e 4 474 223 +59a62 6 475 223 +59a68 4 476 223 +59a6c 8 112 215 +59a74 2 481 223 +59a76 a 482 223 +59a80 8 484 223 +59a88 c 156 238 +59a94 8 485 223 +59a9c 4 464 223 +59aa0 6 400 237 +59aa6 4 464 223 +59aaa 2 229 235 +59aac 2 464 223 +59aae 6 229 235 +59ab4 8 229 235 +59abc 4 464 223 +59ac0 8 229 235 +59ac8 4 229 235 +59acc 6 69 215 +59ad2 2 92 215 +59ad4 6 235 235 +59ada 4 223 246 +59ade 2 235 235 +59ae0 4 191 246 +59ae4 2 220 246 +59ae6 4 191 246 +59aea 2 93 215 +59aec 4 191 246 +59af0 4 95 215 +59af4 4 191 246 +59af8 6 229 235 +59afe 6 69 215 +59b04 c 235 235 +59b10 8 479 223 +59b18 a 451 223 +59b22 16 156 238 +FUNC 59b38 158 0 std::priv::__copy_digits >, char> +59b38 6 314 223 +59b3e 2 314 223 +59b40 2 316 223 +59b42 4 314 223 +59b46 4 70 213 +59b4a 4 314 223 +59b4e 2 101 205 +59b50 4 70 213 +59b54 4 90 215 +59b58 4 39 223 +59b5c 6 320 223 +59b62 2 74 238 +59b64 4 64 238 +59b68 4 74 238 +59b6c 2 74 238 +59b6e 8 74 238 +59b76 4 535 237 +59b7a 4 101 205 +59b7e 2 90 238 +59b80 4 232 246 +59b84 2 68 215 +59b86 2 539 237 +59b88 2 229 235 +59b8a 2 539 237 +59b8c 2 229 235 +59b8e 2 539 237 +59b90 4 229 235 +59b94 4 229 235 +59b98 2 322 223 +59b9a 4 69 215 +59b9e 8 120 215 +59ba6 2 318 223 +59ba8 6 90 215 +59bae 2 92 215 +59bb0 6 235 235 +59bb6 4 223 246 +59bba 2 235 235 +59bbc 4 191 246 +59bc0 4 220 246 +59bc4 2 191 246 +59bc6 4 93 215 +59bca 4 191 246 +59bce 4 95 215 +59bd2 4 39 223 +59bd6 2 191 246 +59bd8 6 320 223 +59bde 8 328 223 +59be6 8 229 235 +59bee 2 400 237 +59bf0 4 304 237 +59bf4 e 306 237 +59c02 6 307 237 +59c08 4 307 237 +59c0c 4 64 213 +59c10 6 67 213 +59c16 2 64 213 +59c18 2 86 243 +59c1a 4 84 243 +59c1e 2 86 243 +59c20 4 314 223 +59c24 2 84 243 +59c26 4 764 186 +59c2a 4 146 205 +59c2e 4 86 243 +59c32 4 101 205 +59c36 4 64 238 +59c3a 4 96 238 +59c3e 2 96 238 +59c40 2 70 213 +59c42 2 97 238 +59c44 4 70 213 +59c48 2 97 238 +59c4a 4 161 201 +59c4e 4 161 201 +59c52 4 175 236 +59c56 2 164 238 +59c58 2 160 238 +59c5a 6 165 238 +59c60 4 307 237 +59c64 12 134 222 +59c76 8 235 235 +59c7e 6 135 222 +59c84 c 600 236 +FUNC 59c90 17a 0 bool std::priv::__get_integer >, int, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, int&, int, bool, char, std::string const&, std::__false_type const&) +59c90 6 178 223 +59c96 4 178 223 +59c9a 2 183 223 +59c9c 4 186 223 +59ca0 2 185 223 +59ca2 2 178 223 +59ca4 4 188 223 +59ca8 2 183 223 +59caa 2 196 223 +59cac 4 183 223 +59cb0 2 188 223 +59cb2 2 178 223 +59cb4 4 183 223 +59cb8 4 178 223 +59cbc 6 183 223 +59cc2 4 188 223 +59cc6 4 178 223 +59cca 2 186 223 +59ccc 2 120 215 +59cce 4 186 223 +59cd2 2 181 223 +59cd4 6 178 223 +59cda 2 188 223 +59cdc 6 120 215 +59ce2 4 190 223 +59ce6 8 90 215 +59cee 6 194 223 +59cf4 6 194 223 +59cfa 4 52 223 +59cfe 2 52 223 +59d00 4 202 223 +59d04 2 208 223 +59d06 2 206 223 +59d08 4 205 223 +59d0c 2 208 223 +59d0e 2 206 223 +59d10 2 208 223 +59d12 4 211 223 +59d16 4 212 223 +59d1a 6 213 223 +59d20 6 213 223 +59d26 4 213 223 +59d2a 2 68 215 +59d2c 8 229 235 +59d34 4 229 235 +59d38 4 69 215 +59d3c 8 120 215 +59d44 6 190 223 +59d4a 6 218 223 +59d50 6 218 223 +59d56 8 219 223 +59d5e 2 233 223 +59d60 6 223 223 +59d66 6 224 223 +59d6c 2 224 223 +59d6e 2 233 223 +59d70 6 224 223 +59d76 6 234 223 +59d7c 2 92 215 +59d7e 6 235 235 +59d84 4 223 246 +59d88 2 235 235 +59d8a 4 191 246 +59d8e 2 220 246 +59d90 4 191 246 +59d94 2 93 215 +59d96 4 191 246 +59d9a 2 95 215 +59d9c 2 191 246 +59d9e 4 95 215 +59da2 2 68 215 +59da4 4 209 223 +59da8 8 229 235 +59db0 6 229 235 +59db6 6 69 215 +59dbc 4 211 223 +59dc0 6 195 223 +59dc6 2 196 223 +59dc8 2 195 223 +59dca 2 197 223 +59dcc 6 52 223 +59dd2 a 235 235 +59ddc 6 224 223 +59de2 2 224 223 +59de4 4 224 223 +59de8 2 224 223 +59dea 2 233 223 +59dec 6 233 223 +59df2 2 65 238 +59df4 4 233 223 +59df8 2 65 238 +59dfa 8 233 223 +59e02 8 224 223 +FUNC 59e0c 4e 0 std::priv::__get_decimal_integer >, int, char> +59e0c 4 239 223 +59e10 2 120 238 +59e12 4 239 223 +59e16 4 124 238 +59e1a 2 239 223 +59e1c 2 120 238 +59e1e 2 481 201 +59e20 4 124 238 +59e24 4 101 205 +59e28 4 242 223 +59e2c 2 101 205 +59e2e 16 242 223 +59e44 6 156 238 +59e4a 6 243 223 +59e50 a 156 238 +FUNC 59e5c 2d0 0 char const* std::priv::__get_formatted_time >, char, std::priv::_Time_Info>(std::istreambuf_iterator >, std::istreambuf_iterator >, char const*, char const*, char*, std::priv::_Time_Info const&, std::ios_base const&, int&, tm*) +59e5c 6 149 241 +59e62 4 149 241 +59e66 2 145 212 +59e68 4 149 241 +59e6c 4 145 212 +59e70 8 149 241 +59e78 2 145 212 +59e7a a 149 241 +59e84 6 145 212 +59e8a c 351 218 +59e96 6 153 241 +59e9c 4 257 241 +59ea0 4 231 241 +59ea4 2 257 241 +59ea6 2 231 241 +59ea8 8 120 215 +59eb0 2 156 241 +59eb2 8 276 241 +59eba 4 156 241 +59ebe 8 158 241 +59ec6 2 160 241 +59ec8 6 161 241 +59ece 2 159 241 +59ed0 7e 166 241 +59f4e 2 157 241 +59f50 1c 171 241 +59f6c 4 172 241 +59f70 4 174 241 +59f74 4 272 241 +59f78 a 250 241 +59f82 4 251 241 +59f86 4 272 241 +59f8a e 231 241 +59f98 4 232 241 +59f9c 6 235 241 +59fa2 4 237 241 +59fa6 6 237 241 +59fac 6 238 241 +59fb2 4 272 241 +59fb6 c 213 241 +59fc2 a 214 241 +59fcc 2 215 241 +59fce 4 215 241 +59fd2 4 215 241 +59fd6 a 216 241 +59fe0 2 217 241 +59fe2 c 206 241 +59fee 6 207 241 +59ff4 4 272 241 +59ff8 c 190 241 +5a004 2 191 241 +5a006 8 191 241 +5a00e 4 191 241 +5a012 a 192 241 +5a01c 2 193 241 +5a01e 2 166 241 +5a020 2 157 241 +5a022 20 182 241 +5a042 6 183 241 +5a048 4 185 241 +5a04c 4 272 241 +5a050 a 257 241 +5a05a e 258 241 +5a068 6 259 241 +5a06e 4 272 241 +5a072 a 243 241 +5a07c 6 244 241 +5a082 4 272 241 +5a086 c 223 241 +5a092 6 224 241 +5a098 4 272 241 +5a09c c 199 241 +5a0a8 6 200 241 +5a0ae 4 272 241 +5a0b2 2 166 241 +5a0b4 4 179 241 +5a0b8 2 166 241 +5a0ba 4 168 241 +5a0be 8 269 241 +5a0c6 4 90 215 +5a0ca 4 269 241 +5a0ce 2 90 215 +5a0d0 a 101 206 +5a0da 6 269 241 +5a0e0 4 272 241 +5a0e4 2 92 215 +5a0e6 6 235 235 +5a0ec 4 223 246 +5a0f0 2 235 235 +5a0f2 6 220 246 +5a0f8 6 235 235 +5a0fe 6 220 246 +5a104 2 163 241 +5a106 4 162 241 +5a10a a 235 241 +5a114 2 236 241 +5a116 2 272 241 +5a118 6 236 241 +5a11e e 153 241 +FUNC 5a12c 7c 0 std::time_get > >::do_get_date(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, tm*) const +5a12c 6 304 241 +5a132 2 89 238 +5a134 8 315 241 +5a13c 2 304 241 +5a13e 2 315 241 +5a140 6 304 241 +5a146 14 315 241 +5a15a 2 304 241 +5a15c 1c 315 241 +5a178 2 316 241 +5a17a 6 317 241 +5a180 2 316 241 +5a182 2 319 241 +5a184 2 112 215 +5a186 2 319 241 +5a188 6 112 215 +5a18e 2 320 241 +5a190 8 321 241 +5a198 8 323 241 +5a1a0 8 324 241 +FUNC 5a1a8 74 0 std::time_get > >::do_get_time(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, tm*) const +5a1a8 4 328 241 +5a1ac 2 89 238 +5a1ae 2 328 241 +5a1b0 a 338 241 +5a1ba 8 328 241 +5a1c2 30 338 241 +5a1f2 2 112 215 +5a1f4 8 339 241 +5a1fc 2 112 215 +5a1fe 2 339 241 +5a200 4 112 215 +5a204 2 341 241 +5a206 8 342 241 +5a20e 8 343 241 +5a216 6 344 241 +FUNC 5a21c 68 0 std::time_get > >::do_get_year(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, tm*) const +5a21c 4 348 241 +5a220 2 348 241 +5a222 4 112 215 +5a226 a 348 241 +5a230 4 112 215 +5a234 2 351 241 +5a236 4 353 241 +5a23a 4 352 241 +5a23e 4 353 241 +5a242 6 363 241 +5a248 c 356 241 +5a254 2 357 241 +5a256 2 112 215 +5a258 8 357 241 +5a260 8 358 241 +5a268 2 112 215 +5a26a 2 358 241 +5a26c 4 112 215 +5a270 2 359 241 +5a272 8 360 241 +5a27a a 362 241 +FUNC 5a284 2b2 0 int std::priv::__get_base_or_zero >, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, std::ctype const&) +5a284 6 56 223 +5a28a 8 56 223 +5a292 a 59 223 +5a29c 4 209 206 +5a2a0 2 59 223 +5a2a2 8 209 206 +5a2aa 8 90 215 +5a2b2 6 64 223 +5a2b8 8 68 223 +5a2c0 4 74 223 +5a2c4 c 76 223 +5a2d0 8 120 215 +5a2d8 4 95 223 +5a2dc 2 95 223 +5a2de 2 72 223 +5a2e0 4 112 223 +5a2e4 6 113 223 +5a2ea 2 92 215 +5a2ec 6 235 235 +5a2f2 4 764 186 +5a2f6 2 235 235 +5a2f8 4 191 246 +5a2fc 2 93 215 +5a2fe 8 191 246 +5a306 4 95 215 +5a30a 6 64 223 +5a310 2 68 215 +5a312 8 229 235 +5a31a 4 229 235 +5a31e 4 74 223 +5a322 4 69 215 +5a326 2 76 223 +5a328 2 69 215 +5a32a 2 76 223 +5a32c 8 120 215 +5a334 2 85 223 +5a336 2 85 223 +5a338 4 72 223 +5a33c 2 68 215 +5a33e 8 229 235 +5a346 4 229 235 +5a34a 6 69 215 +5a350 8 229 235 +5a358 8 90 215 +5a360 6 85 223 +5a366 2 68 215 +5a368 8 229 235 +5a370 4 229 235 +5a374 2 69 215 +5a376 2 120 215 +5a378 2 69 215 +5a37a 6 120 215 +5a380 4 87 223 +5a384 2 87 223 +5a386 4 91 223 +5a38a 8 90 215 +5a392 6 95 223 +5a398 2 68 215 +5a39a 8 229 235 +5a3a2 4 229 235 +5a3a6 2 69 215 +5a3a8 2 120 215 +5a3aa 2 69 215 +5a3ac 6 120 215 +5a3b2 2 97 223 +5a3b4 2 97 223 +5a3b6 4 105 223 +5a3ba 8 229 235 +5a3c2 8 235 235 +5a3ca 8 90 215 +5a3d2 6 97 223 +5a3d8 2 68 215 +5a3da 8 229 235 +5a3e2 4 229 235 +5a3e6 8 69 215 +5a3ee 8 90 215 +5a3f6 6 87 223 +5a3fc 6 90 215 +5a402 8 87 223 +5a40a 4 91 223 +5a40e 2 92 215 +5a410 6 235 235 +5a416 4 764 186 +5a41a 2 235 235 +5a41c 4 191 246 +5a420 2 93 215 +5a422 8 191 246 +5a42a 6 95 215 +5a430 2 92 215 +5a432 6 235 235 +5a438 4 764 186 +5a43c 2 235 235 +5a43e 4 191 246 +5a442 2 93 215 +5a444 8 191 246 +5a44c 6 95 215 +5a452 18 229 235 +5a46a 6 90 215 +5a470 8 97 223 +5a478 4 105 223 +5a47c 2 92 215 +5a47e 6 235 235 +5a484 4 764 186 +5a488 2 235 235 +5a48a 4 191 246 +5a48e 2 93 215 +5a490 8 191 246 +5a498 6 95 215 +5a49e 2 92 215 +5a4a0 6 235 235 +5a4a6 4 764 186 +5a4aa 2 235 235 +5a4ac 4 191 246 +5a4b0 2 93 215 +5a4b2 8 191 246 +5a4ba 6 95 215 +5a4c0 2 92 215 +5a4c2 6 235 235 +5a4c8 4 764 186 +5a4cc 2 235 235 +5a4ce 4 191 246 +5a4d2 2 93 215 +5a4d4 8 191 246 +5a4dc 6 95 215 +5a4e2 2 92 215 +5a4e4 6 235 235 +5a4ea 4 764 186 +5a4ee 2 235 235 +5a4f0 4 191 246 +5a4f4 2 93 215 +5a4f6 a 191 246 +5a500 6 95 215 +5a506 30 235 235 +FUNC 5a538 1e8 0 bool std::priv::__get_integer >, long, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, long&, int, bool, wchar_t, std::string const&, std::__true_type const&) +5a538 6 118 223 +5a53e 4 118 223 +5a542 2 123 223 +5a544 4 126 223 +5a548 2 125 223 +5a54a 2 118 223 +5a54c 4 128 223 +5a550 2 123 223 +5a552 4 95 215 +5a556 4 123 223 +5a55a 2 128 223 +5a55c 2 118 223 +5a55e 4 123 223 +5a562 8 118 223 +5a56a 6 123 223 +5a570 2 118 223 +5a572 4 128 223 +5a576 a 126 223 +5a580 2 121 223 +5a582 4 128 223 +5a586 2 75 215 +5a588 8 90 215 +5a590 4 77 215 +5a594 8 90 215 +5a59c 6 130 223 +5a5a2 8 90 215 +5a5aa 6 134 223 +5a5b0 8 134 223 +5a5b8 6 52 223 +5a5be 2 52 223 +5a5c0 4 142 223 +5a5c4 2 148 223 +5a5c6 2 146 223 +5a5c8 4 145 223 +5a5cc 2 148 223 +5a5ce 2 146 223 +5a5d0 2 148 223 +5a5d2 6 151 223 +5a5d8 4 152 223 +5a5dc 6 153 223 +5a5e2 6 153 223 +5a5e8 4 153 223 +5a5ec 2 68 215 +5a5ee 8 229 235 +5a5f6 4 229 235 +5a5fa 6 69 215 +5a600 6 235 235 +5a606 4 764 186 +5a60a 2 235 235 +5a60c 4 191 246 +5a610 2 93 215 +5a612 4 191 246 +5a616 4 95 215 +5a61a 4 191 246 +5a61e 2 94 215 +5a620 8 130 223 +5a628 6 158 223 +5a62e 6 158 223 +5a634 8 159 223 +5a63c 2 173 223 +5a63e 6 163 223 +5a644 6 164 223 +5a64a 6 164 223 +5a650 2 164 223 +5a652 2 173 223 +5a654 6 164 223 +5a65a 6 174 223 +5a660 2 92 215 +5a662 6 235 235 +5a668 4 764 186 +5a66c 2 235 235 +5a66e 4 191 246 +5a672 2 93 215 +5a674 2 191 246 +5a676 4 95 215 +5a67a 8 191 246 +5a682 2 68 215 +5a684 4 149 223 +5a688 8 229 235 +5a690 a 229 235 +5a69a 4 151 223 +5a69e 6 235 235 +5a6a4 4 764 186 +5a6a8 2 235 235 +5a6aa 4 191 246 +5a6ae 2 93 215 +5a6b0 2 191 246 +5a6b2 4 95 215 +5a6b6 8 191 246 +5a6be 6 135 223 +5a6c4 2 136 223 +5a6c6 2 135 223 +5a6c8 2 137 223 +5a6ca 6 52 223 +5a6d0 18 235 235 +5a6e8 4 164 223 +5a6ec 6 164 223 +5a6f2 2 173 223 +5a6f4 6 173 223 +5a6fa 2 65 238 +5a6fc 4 173 223 +5a700 2 65 238 +5a702 8 173 223 +5a70a 6 164 223 +5a710 2 173 223 +5a712 6 164 223 +5a718 4 164 223 +5a71c 4 164 223 +FUNC 5a720 f8 0 std::istreambuf_iterator > std::priv::__do_get_integer >, long, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, long&, wchar_t*) +5a720 6 247 223 +5a726 4 145 212 +5a72a 2 247 223 +5a72c 4 247 223 +5a730 4 145 212 +5a734 6 247 223 +5a73a 6 145 212 +5a740 c 351 218 +5a74c c 258 223 +5a758 8 112 215 +5a760 4 259 223 +5a764 2 263 223 +5a766 6 265 223 +5a76c 6 266 223 +5a772 4 287 223 +5a776 8 112 215 +5a77e 2 289 223 +5a780 c 290 223 +5a78c e 291 223 +5a79a a 292 223 +5a7a4 a 351 218 +5a7ae 2 86 227 +5a7b0 2 351 218 +5a7b2 4 86 227 +5a7b6 8 87 227 +5a7be 2 86 227 +5a7c0 8 87 227 +5a7c8 2 283 223 +5a7ca 2 275 223 +5a7cc 20 283 223 +5a7ec 6 156 238 +5a7f2 2 287 223 +5a7f4 4 287 223 +5a7f8 4 287 223 +5a7fc 6 156 238 +5a802 16 291 223 +FUNC 5a818 2e 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, long&) const +5a818 6 537 223 +5a81e 8 537 223 +5a826 20 539 223 +FUNC 5a848 80 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, bool&) const +5a848 6 499 223 +5a84e e 499 223 +5a85c 4 501 223 +5a860 2 499 223 +5a862 6 501 223 +5a868 1c 506 223 +5a884 6 507 223 +5a88a 8 515 223 +5a892 c 517 223 +5a89e 4 508 223 +5a8a2 4 511 223 +5a8a6 12 502 223 +5a8b8 2 510 223 +5a8ba 8 513 223 +5a8c2 2 510 223 +5a8c4 4 511 223 +FUNC 5a8c8 1d4 0 bool std::priv::__get_integer >, unsigned short, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, unsigned short&, int, bool, wchar_t, std::string const&, std::__false_type const&) +5a8c8 6 178 223 +5a8ce 2 178 223 +5a8d0 2 188 223 +5a8d2 2 183 223 +5a8d4 2 178 223 +5a8d6 2 188 223 +5a8d8 2 178 223 +5a8da 4 188 223 +5a8de 2 178 223 +5a8e0 2 183 223 +5a8e2 4 95 215 +5a8e6 4 183 223 +5a8ea 4 186 223 +5a8ee 2 185 223 +5a8f0 a 183 223 +5a8fa 4 188 223 +5a8fe a 178 223 +5a908 2 186 223 +5a90a 2 181 223 +5a90c 2 186 223 +5a90e 6 188 223 +5a914 2 75 215 +5a916 8 90 215 +5a91e 4 77 215 +5a922 8 90 215 +5a92a 6 190 223 +5a930 8 90 215 +5a938 6 194 223 +5a93e 6 194 223 +5a944 6 52 223 +5a94a 2 52 223 +5a94c 4 202 223 +5a950 2 208 223 +5a952 2 206 223 +5a954 4 205 223 +5a958 2 208 223 +5a95a 2 206 223 +5a95c 2 208 223 +5a95e 6 211 223 +5a964 4 212 223 +5a968 6 213 223 +5a96e 6 213 223 +5a974 4 213 223 +5a978 2 68 215 +5a97a 8 229 235 +5a982 4 229 235 +5a986 6 69 215 +5a98c 6 235 235 +5a992 4 764 186 +5a996 2 235 235 +5a998 4 191 246 +5a99c 2 93 215 +5a99e 4 191 246 +5a9a2 4 95 215 +5a9a6 4 191 246 +5a9aa 2 94 215 +5a9ac 8 190 223 +5a9b4 6 218 223 +5a9ba 6 218 223 +5a9c0 8 219 223 +5a9c8 6 223 223 +5a9ce 6 224 223 +5a9d4 8 224 223 +5a9dc 2 233 223 +5a9de 6 234 223 +5a9e4 2 92 215 +5a9e6 6 235 235 +5a9ec 4 764 186 +5a9f0 2 235 235 +5a9f2 4 191 246 +5a9f6 2 93 215 +5a9f8 2 191 246 +5a9fa 4 95 215 +5a9fe 8 191 246 +5aa06 2 68 215 +5aa08 4 209 223 +5aa0c 8 229 235 +5aa14 a 229 235 +5aa1e 4 211 223 +5aa22 6 235 235 +5aa28 4 764 186 +5aa2c 2 235 235 +5aa2e 4 191 246 +5aa32 2 93 215 +5aa34 2 191 246 +5aa36 4 95 215 +5aa3a 8 191 246 +5aa42 6 195 223 +5aa48 2 196 223 +5aa4a 2 195 223 +5aa4c 2 197 223 +5aa4e 6 52 223 +5aa54 18 235 235 +5aa6c 6 224 223 +5aa72 2 224 223 +5aa74 4 224 223 +5aa78 4 224 223 +5aa7c 2 233 223 +5aa7e 6 233 223 +5aa84 2 65 238 +5aa86 4 233 223 +5aa8a 2 65 238 +5aa8c 8 233 223 +5aa94 8 224 223 +FUNC 5aa9c f8 0 std::istreambuf_iterator > std::priv::__do_get_integer >, unsigned short, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, unsigned short&, wchar_t*) +5aa9c 6 247 223 +5aaa2 4 145 212 +5aaa6 2 247 223 +5aaa8 4 247 223 +5aaac 4 145 212 +5aab0 6 247 223 +5aab6 6 145 212 +5aabc c 351 218 +5aac8 c 258 223 +5aad4 8 112 215 +5aadc 4 259 223 +5aae0 2 263 223 +5aae2 6 265 223 +5aae8 6 266 223 +5aaee 2 287 223 +5aaf0 4 287 223 +5aaf4 8 112 215 +5aafc 2 289 223 +5aafe c 290 223 +5ab0a e 291 223 +5ab18 a 292 223 +5ab22 a 351 218 +5ab2c 2 86 227 +5ab2e 2 351 218 +5ab30 4 86 227 +5ab34 8 87 227 +5ab3c 2 86 227 +5ab3e 8 87 227 +5ab46 2 283 223 +5ab48 2 275 223 +5ab4a 20 283 223 +5ab6a 6 156 238 +5ab70 2 287 223 +5ab72 4 287 223 +5ab76 4 287 223 +5ab7a 6 156 238 +5ab80 14 291 223 +FUNC 5ab94 2e 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, unsigned short&) const +5ab94 6 543 223 +5ab9a 8 543 223 +5aba2 20 546 223 +FUNC 5abc4 1ce 0 bool std::priv::__get_integer >, unsigned int, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, unsigned int&, int, bool, wchar_t, std::string const&, std::__false_type const&) +5abc4 6 178 223 +5abca 4 178 223 +5abce 2 183 223 +5abd0 4 186 223 +5abd4 2 185 223 +5abd6 2 178 223 +5abd8 4 188 223 +5abdc 2 183 223 +5abde 4 95 215 +5abe2 4 183 223 +5abe6 2 188 223 +5abe8 2 178 223 +5abea 4 183 223 +5abee 4 178 223 +5abf2 6 183 223 +5abf8 a 188 223 +5ac02 2 186 223 +5ac04 2 181 223 +5ac06 2 186 223 +5ac08 4 188 223 +5ac0c 2 75 215 +5ac0e 8 90 215 +5ac16 4 77 215 +5ac1a 8 90 215 +5ac22 6 190 223 +5ac28 8 90 215 +5ac30 6 194 223 +5ac36 6 194 223 +5ac3c 6 52 223 +5ac42 2 52 223 +5ac44 4 202 223 +5ac48 2 208 223 +5ac4a 2 206 223 +5ac4c 4 205 223 +5ac50 2 208 223 +5ac52 2 206 223 +5ac54 2 208 223 +5ac56 4 211 223 +5ac5a 4 212 223 +5ac5e 6 213 223 +5ac64 6 213 223 +5ac6a 4 213 223 +5ac6e 2 68 215 +5ac70 8 229 235 +5ac78 4 229 235 +5ac7c 6 69 215 +5ac82 6 235 235 +5ac88 4 764 186 +5ac8c 2 235 235 +5ac8e 4 191 246 +5ac92 2 93 215 +5ac94 4 191 246 +5ac98 4 95 215 +5ac9c 4 191 246 +5aca0 2 94 215 +5aca2 8 190 223 +5acaa 6 218 223 +5acb0 6 218 223 +5acb6 8 219 223 +5acbe 2 233 223 +5acc0 6 223 223 +5acc6 6 224 223 +5accc 2 224 223 +5acce 2 233 223 +5acd0 6 224 223 +5acd6 6 234 223 +5acdc 2 92 215 +5acde 6 235 235 +5ace4 4 764 186 +5ace8 2 235 235 +5acea 4 191 246 +5acee 2 93 215 +5acf0 2 191 246 +5acf2 4 95 215 +5acf6 8 191 246 +5acfe 2 68 215 +5ad00 4 209 223 +5ad04 8 229 235 +5ad0c a 229 235 +5ad16 4 211 223 +5ad1a 6 235 235 +5ad20 4 764 186 +5ad24 2 235 235 +5ad26 4 191 246 +5ad2a 2 93 215 +5ad2c 2 191 246 +5ad2e 4 95 215 +5ad32 8 191 246 +5ad3a 6 195 223 +5ad40 2 196 223 +5ad42 2 195 223 +5ad44 2 197 223 +5ad46 6 52 223 +5ad4c 18 235 235 +5ad64 6 224 223 +5ad6a 2 224 223 +5ad6c 4 224 223 +5ad70 2 224 223 +5ad72 2 233 223 +5ad74 6 233 223 +5ad7a 2 65 238 +5ad7c 4 233 223 +5ad80 2 65 238 +5ad82 8 233 223 +5ad8a 8 224 223 +FUNC 5abc4 1ce 0 bool std::priv::__get_integer >, unsigned long, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, unsigned long&, int, bool, wchar_t, std::string const&, std::__false_type const&) +FUNC 5ad94 f8 0 std::istreambuf_iterator > std::priv::__do_get_integer >, unsigned int, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, unsigned int&, wchar_t*) +5ad94 6 247 223 +5ad9a 4 145 212 +5ad9e 2 247 223 +5ada0 4 247 223 +5ada4 4 145 212 +5ada8 6 247 223 +5adae 6 145 212 +5adb4 c 351 218 +5adc0 c 258 223 +5adcc 8 112 215 +5add4 4 259 223 +5add8 2 263 223 +5adda 6 265 223 +5ade0 6 266 223 +5ade6 4 287 223 +5adea 8 112 215 +5adf2 2 289 223 +5adf4 c 290 223 +5ae00 e 291 223 +5ae0e a 292 223 +5ae18 a 351 218 +5ae22 2 86 227 +5ae24 2 351 218 +5ae26 4 86 227 +5ae2a 8 87 227 +5ae32 2 86 227 +5ae34 8 87 227 +5ae3c 2 283 223 +5ae3e 2 275 223 +5ae40 20 283 223 +5ae60 6 156 238 +5ae66 2 287 223 +5ae68 4 287 223 +5ae6c 4 287 223 +5ae70 6 156 238 +5ae76 16 291 223 +FUNC 5ad94 f8 0 std::istreambuf_iterator > std::priv::__do_get_integer >, unsigned long, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, unsigned long&, wchar_t*) +FUNC 5ae8c 2e 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, unsigned int&) const +FUNC 5ae8c 2e 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, unsigned long&) const +5ae8c 6 557 223 +5ae92 8 557 223 +5ae9a 20 560 223 +FUNC 5aebc 246 0 bool std::priv::__get_integer >, unsigned long long, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, unsigned long long&, int, bool, wchar_t, std::string const&, std::__false_type const&) +5aebc 6 178 223 +5aec2 4 188 223 +5aec6 2 178 223 +5aec8 4 183 223 +5aecc 2 178 223 +5aece 6 188 223 +5aed4 2 178 223 +5aed6 4 188 223 +5aeda 4 183 223 +5aede 2 188 223 +5aee0 4 183 223 +5aee4 4 186 223 +5aee8 2 188 223 +5aeea 4 95 215 +5aeee 4 183 223 +5aef2 2 178 223 +5aef4 4 186 223 +5aef8 6 183 223 +5aefe 4 188 223 +5af02 2 178 223 +5af04 2 185 223 +5af06 4 182 223 +5af0a 2 181 223 +5af0c 8 182 223 +5af14 6 188 223 +5af1a 4 186 223 +5af1e 2 75 215 +5af20 8 90 215 +5af28 4 77 215 +5af2c 8 90 215 +5af34 6 190 223 +5af3a 8 90 215 +5af42 6 194 223 +5af48 8 194 223 +5af50 6 52 223 +5af56 2 52 223 +5af58 8 202 223 +5af60 4 208 223 +5af64 2 206 223 +5af66 4 208 223 +5af6a 2 205 223 +5af6c 2 206 223 +5af6e 8 208 223 +5af76 20 211 223 +5af96 4 212 223 +5af9a 8 211 223 +5afa2 6 212 223 +5afa8 6 213 223 +5afae e 213 223 +5afbc a 213 223 +5afc6 2 68 215 +5afc8 8 229 235 +5afd0 4 229 235 +5afd4 6 69 215 +5afda 6 235 235 +5afe0 4 764 186 +5afe4 2 235 235 +5afe6 4 191 246 +5afea 2 93 215 +5afec 4 191 246 +5aff0 4 95 215 +5aff4 4 191 246 +5aff8 2 94 215 +5affa 6 190 223 +5b000 6 218 223 +5b006 8 218 223 +5b00e 8 219 223 +5b016 4 223 223 +5b01a 6 224 223 +5b020 10 224 223 +5b030 2 233 223 +5b032 6 234 223 +5b038 2 92 215 +5b03a 6 235 235 +5b040 4 764 186 +5b044 2 235 235 +5b046 4 191 246 +5b04a 2 93 215 +5b04c 2 191 246 +5b04e 4 95 215 +5b052 8 191 246 +5b05a 2 68 215 +5b05c 4 209 223 +5b060 8 229 235 +5b068 a 229 235 +5b072 6 211 223 +5b078 6 235 235 +5b07e 4 764 186 +5b082 2 235 235 +5b084 4 191 246 +5b088 2 93 215 +5b08a 2 191 246 +5b08c 4 95 215 +5b090 8 191 246 +5b098 8 195 223 +5b0a0 2 196 223 +5b0a2 4 195 223 +5b0a6 2 197 223 +5b0a8 6 52 223 +5b0ae 18 235 235 +5b0c6 6 224 223 +5b0cc 2 224 223 +5b0ce a 224 223 +5b0d8 4 224 223 +5b0dc 2 233 223 +5b0de 6 233 223 +5b0e4 2 65 238 +5b0e6 4 233 223 +5b0ea 2 65 238 +5b0ec 8 233 223 +5b0f4 e 224 223 +FUNC 5b104 fc 0 std::istreambuf_iterator > std::priv::__do_get_integer >, unsigned long long, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, unsigned long long&, wchar_t*) +5b104 6 247 223 +5b10a 4 145 212 +5b10e 2 247 223 +5b110 4 247 223 +5b114 4 145 212 +5b118 6 247 223 +5b11e 6 145 212 +5b124 c 351 218 +5b130 c 258 223 +5b13c 8 112 215 +5b144 4 259 223 +5b148 2 263 223 +5b14a 6 265 223 +5b150 a 266 223 +5b15a 2 287 223 +5b15c 4 287 223 +5b160 8 112 215 +5b168 2 289 223 +5b16a c 290 223 +5b176 e 291 223 +5b184 a 292 223 +5b18e a 351 218 +5b198 2 86 227 +5b19a 2 351 218 +5b19c 4 86 227 +5b1a0 8 87 227 +5b1a8 2 86 227 +5b1aa 8 87 227 +5b1b2 2 283 223 +5b1b4 2 275 223 +5b1b6 20 283 223 +5b1d6 6 156 238 +5b1dc 2 287 223 +5b1de 4 287 223 +5b1e2 4 287 223 +5b1e6 6 156 238 +5b1ec 14 291 223 +FUNC 5b200 2e 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, unsigned long long&) const +5b200 6 611 223 +5b206 8 611 223 +5b20e 20 614 223 +FUNC 5b230 3a 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, void*&) const +5b230 6 587 223 +5b236 6 587 223 +5b23c 2 595 223 +5b23e 4 587 223 +5b242 10 595 223 +5b252 4 596 223 +5b256 2 599 223 +5b258 8 597 223 +5b260 a 599 223 +FUNC 5b26c 202 0 bool std::priv::__get_integer >, long long, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, long long&, int, bool, wchar_t, std::string const&, std::__true_type const&) +5b26c 6 118 223 +5b272 4 128 223 +5b276 2 118 223 +5b278 4 123 223 +5b27c 2 118 223 +5b27e 4 128 223 +5b282 2 118 223 +5b284 2 128 223 +5b286 4 123 223 +5b28a 2 128 223 +5b28c 4 123 223 +5b290 4 128 223 +5b294 2 118 223 +5b296 4 123 223 +5b29a 2 128 223 +5b29c 4 126 223 +5b2a0 6 123 223 +5b2a6 4 128 223 +5b2aa 2 126 223 +5b2ac 2 122 223 +5b2ae 4 118 223 +5b2b2 2 125 223 +5b2b4 2 126 223 +5b2b6 c 122 223 +5b2c2 2 118 223 +5b2c4 2 136 223 +5b2c6 4 118 223 +5b2ca 6 121 223 +5b2d0 2 128 223 +5b2d2 2 120 215 +5b2d4 2 128 223 +5b2d6 6 120 215 +5b2dc 4 130 223 +5b2e0 8 90 215 +5b2e8 2 134 223 +5b2ea a 134 223 +5b2f4 6 52 223 +5b2fa 2 52 223 +5b2fc 8 142 223 +5b304 4 148 223 +5b308 2 146 223 +5b30a 4 148 223 +5b30e 2 145 223 +5b310 2 146 223 +5b312 8 148 223 +5b31a 16 151 223 +5b330 4 152 223 +5b334 8 151 223 +5b33c 6 152 223 +5b342 6 153 223 +5b348 e 153 223 +5b356 a 153 223 +5b360 2 68 215 +5b362 8 229 235 +5b36a 4 229 235 +5b36e 4 69 215 +5b372 8 120 215 +5b37a 6 130 223 +5b380 2 158 223 +5b382 8 158 223 +5b38a 8 159 223 +5b392 2 173 223 +5b394 4 163 223 +5b398 6 164 223 +5b39e 6 164 223 +5b3a4 c 164 223 +5b3b0 2 173 223 +5b3b2 6 174 223 +5b3b8 2 92 215 +5b3ba 6 235 235 +5b3c0 4 764 186 +5b3c4 2 235 235 +5b3c6 4 191 246 +5b3ca 2 93 215 +5b3cc a 191 246 +5b3d6 6 95 215 +5b3dc 2 68 215 +5b3de 4 149 223 +5b3e2 8 229 235 +5b3ea 6 229 235 +5b3f0 6 69 215 +5b3f6 6 151 223 +5b3fc 8 135 223 +5b404 2 136 223 +5b406 4 135 223 +5b40a 2 137 223 +5b40c 6 52 223 +5b412 8 235 235 +5b41a 4 164 223 +5b41e c 164 223 +5b42a 2 173 223 +5b42c 6 173 223 +5b432 4 65 238 +5b436 4 173 223 +5b43a 4 65 238 +5b43e a 173 223 +5b448 e 164 223 +5b456 4 173 223 +5b45a 4 164 223 +5b45e a 164 223 +5b468 6 164 223 +FUNC 5b470 fc 0 std::istreambuf_iterator > std::priv::__do_get_integer >, long long, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, long long&, wchar_t*) +5b470 6 247 223 +5b476 4 145 212 +5b47a 2 247 223 +5b47c 4 247 223 +5b480 4 145 212 +5b484 6 247 223 +5b48a 6 145 212 +5b490 c 351 218 +5b49c c 258 223 +5b4a8 8 112 215 +5b4b0 4 259 223 +5b4b4 2 263 223 +5b4b6 6 265 223 +5b4bc a 266 223 +5b4c6 2 287 223 +5b4c8 4 287 223 +5b4cc 8 112 215 +5b4d4 2 289 223 +5b4d6 c 290 223 +5b4e2 e 291 223 +5b4f0 a 292 223 +5b4fa a 351 218 +5b504 2 86 227 +5b506 2 351 218 +5b508 4 86 227 +5b50c 8 87 227 +5b514 2 86 227 +5b516 8 87 227 +5b51e 2 283 223 +5b520 2 275 223 +5b522 20 283 223 +5b542 6 156 238 +5b548 2 287 223 +5b54a 4 287 223 +5b54e 4 287 223 +5b552 6 156 238 +5b558 14 291 223 +FUNC 5b56c 2e 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, long long&) const +5b56c 6 604 223 +5b572 8 604 223 +5b57a 20 607 223 +FUNC 5b59c 2d2 0 int std::priv::__get_base_or_zero >, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, std::ctype const&) +5b59c 6 56 223 +5b5a2 8 56 223 +5b5aa a 59 223 +5b5b4 4 103 206 +5b5b8 2 59 223 +5b5ba 8 103 206 +5b5c2 8 90 215 +5b5ca 8 64 223 +5b5d2 a 68 223 +5b5dc 4 74 223 +5b5e0 c 76 223 +5b5ec 8 120 215 +5b5f4 4 95 223 +5b5f8 2 95 223 +5b5fa 2 72 223 +5b5fc 4 112 223 +5b600 6 113 223 +5b606 2 92 215 +5b608 6 235 235 +5b60e 4 223 246 +5b612 2 235 235 +5b614 4 191 246 +5b618 2 220 246 +5b61a 2 191 246 +5b61c 2 93 215 +5b61e 4 191 246 +5b622 4 95 215 +5b626 4 64 223 +5b62a 2 191 246 +5b62c 4 64 223 +5b630 2 68 215 +5b632 8 229 235 +5b63a 4 229 235 +5b63e 4 74 223 +5b642 4 69 215 +5b646 2 76 223 +5b648 2 69 215 +5b64a 2 76 223 +5b64c 8 120 215 +5b654 2 85 223 +5b656 2 85 223 +5b658 4 72 223 +5b65c 2 68 215 +5b65e 8 229 235 +5b666 4 229 235 +5b66a 6 69 215 +5b670 8 229 235 +5b678 8 90 215 +5b680 8 85 223 +5b688 2 68 215 +5b68a 8 229 235 +5b692 4 229 235 +5b696 2 69 215 +5b698 2 120 215 +5b69a 2 69 215 +5b69c 6 120 215 +5b6a2 4 87 223 +5b6a6 2 87 223 +5b6a8 4 91 223 +5b6ac 8 90 215 +5b6b4 8 95 223 +5b6bc 2 68 215 +5b6be 8 229 235 +5b6c6 4 229 235 +5b6ca 2 69 215 +5b6cc 2 120 215 +5b6ce 2 69 215 +5b6d0 6 120 215 +5b6d6 2 97 223 +5b6d8 2 97 223 +5b6da 4 105 223 +5b6de 8 229 235 +5b6e6 8 235 235 +5b6ee 8 90 215 +5b6f6 8 97 223 +5b6fe 2 68 215 +5b700 8 229 235 +5b708 4 229 235 +5b70c 8 69 215 +5b714 8 90 215 +5b71c 8 87 223 +5b724 6 90 215 +5b72a a 87 223 +5b734 4 91 223 +5b738 2 92 215 +5b73a 6 235 235 +5b740 4 223 246 +5b744 2 235 235 +5b746 4 191 246 +5b74a 2 220 246 +5b74c 2 191 246 +5b74e 2 93 215 +5b750 4 191 246 +5b754 2 95 215 +5b756 2 191 246 +5b758 4 95 215 +5b75c 2 92 215 +5b75e 6 235 235 +5b764 4 223 246 +5b768 2 235 235 +5b76a 4 191 246 +5b76e 2 220 246 +5b770 2 191 246 +5b772 2 93 215 +5b774 4 191 246 +5b778 2 95 215 +5b77a 2 191 246 +5b77c 4 95 215 +5b780 18 229 235 +5b798 6 90 215 +5b79e a 97 223 +5b7a8 4 105 223 +5b7ac 2 92 215 +5b7ae 6 235 235 +5b7b4 4 223 246 +5b7b8 2 235 235 +5b7ba 4 191 246 +5b7be 2 220 246 +5b7c0 2 191 246 +5b7c2 2 93 215 +5b7c4 4 191 246 +5b7c8 2 95 215 +5b7ca 2 191 246 +5b7cc 4 95 215 +5b7d0 2 92 215 +5b7d2 6 235 235 +5b7d8 4 223 246 +5b7dc 2 235 235 +5b7de 4 191 246 +5b7e2 2 220 246 +5b7e4 2 191 246 +5b7e6 2 93 215 +5b7e8 4 191 246 +5b7ec 2 95 215 +5b7ee 2 191 246 +5b7f0 4 95 215 +5b7f4 2 92 215 +5b7f6 6 235 235 +5b7fc 4 223 246 +5b800 2 235 235 +5b802 4 191 246 +5b806 2 220 246 +5b808 2 191 246 +5b80a 2 93 215 +5b80c 4 191 246 +5b810 2 95 215 +5b812 2 191 246 +5b814 4 95 215 +5b818 2 92 215 +5b81a 6 235 235 +5b820 4 223 246 +5b824 2 235 235 +5b826 4 191 246 +5b82a 2 220 246 +5b82c 4 191 246 +5b830 2 93 215 +5b832 4 191 246 +5b836 2 95 215 +5b838 2 191 246 +5b83a 4 95 215 +5b83e 30 235 235 +FUNC 5b870 192 0 bool std::priv::__get_integer >, long, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, long&, int, bool, char, std::string const&, std::__true_type const&) +5b870 6 118 223 +5b876 4 118 223 +5b87a 2 123 223 +5b87c 4 126 223 +5b880 2 125 223 +5b882 2 118 223 +5b884 4 128 223 +5b888 2 123 223 +5b88a 2 136 223 +5b88c 4 123 223 +5b890 2 128 223 +5b892 2 118 223 +5b894 4 123 223 +5b898 8 118 223 +5b8a0 6 123 223 +5b8a6 2 118 223 +5b8a8 4 128 223 +5b8ac 4 118 223 +5b8b0 2 120 215 +5b8b2 2 126 223 +5b8b4 2 121 223 +5b8b6 2 126 223 +5b8b8 8 118 223 +5b8c0 2 128 223 +5b8c2 6 120 215 +5b8c8 4 130 223 +5b8cc 8 90 215 +5b8d4 6 134 223 +5b8da 6 134 223 +5b8e0 4 52 223 +5b8e4 2 52 223 +5b8e6 4 142 223 +5b8ea 2 148 223 +5b8ec 2 146 223 +5b8ee 4 145 223 +5b8f2 2 148 223 +5b8f4 2 146 223 +5b8f6 2 148 223 +5b8f8 6 151 223 +5b8fe 4 152 223 +5b902 6 153 223 +5b908 6 153 223 +5b90e 4 153 223 +5b912 2 68 215 +5b914 8 229 235 +5b91c 4 229 235 +5b920 4 69 215 +5b924 8 120 215 +5b92c 6 130 223 +5b932 6 158 223 +5b938 6 158 223 +5b93e 8 159 223 +5b946 2 173 223 +5b948 6 163 223 +5b94e 6 164 223 +5b954 6 164 223 +5b95a 2 164 223 +5b95c 2 173 223 +5b95e 6 164 223 +5b964 6 174 223 +5b96a 2 92 215 +5b96c 6 235 235 +5b972 4 223 246 +5b976 2 235 235 +5b978 4 191 246 +5b97c 2 220 246 +5b97e 4 191 246 +5b982 2 93 215 +5b984 6 191 246 +5b98a 6 95 215 +5b990 2 68 215 +5b992 4 149 223 +5b996 8 229 235 +5b99e 6 229 235 +5b9a4 6 69 215 +5b9aa 4 151 223 +5b9ae 6 135 223 +5b9b4 2 136 223 +5b9b6 2 135 223 +5b9b8 2 137 223 +5b9ba 6 52 223 +5b9c0 a 235 235 +5b9ca 4 164 223 +5b9ce 6 164 223 +5b9d4 2 173 223 +5b9d6 6 173 223 +5b9dc 2 65 238 +5b9de 4 173 223 +5b9e2 2 65 238 +5b9e4 8 173 223 +5b9ec 6 164 223 +5b9f2 2 173 223 +5b9f4 6 164 223 +5b9fa 4 164 223 +5b9fe 4 164 223 +FUNC 5ba04 f8 0 std::istreambuf_iterator > std::priv::__do_get_integer >, long, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, long&, char*) +5ba04 6 247 223 +5ba0a 4 145 212 +5ba0e 2 247 223 +5ba10 4 247 223 +5ba14 4 145 212 +5ba18 6 247 223 +5ba1e 6 145 212 +5ba24 c 351 218 +5ba30 c 258 223 +5ba3c 8 112 215 +5ba44 4 259 223 +5ba48 2 263 223 +5ba4a 6 265 223 +5ba50 6 266 223 +5ba56 4 287 223 +5ba5a 8 112 215 +5ba62 2 289 223 +5ba64 c 290 223 +5ba70 e 291 223 +5ba7e a 292 223 +5ba88 a 351 218 +5ba92 2 57 227 +5ba94 2 351 218 +5ba96 4 57 227 +5ba9a 8 58 227 +5baa2 2 57 227 +5baa4 8 58 227 +5baac 2 283 223 +5baae 2 275 223 +5bab0 20 283 223 +5bad0 6 156 238 +5bad6 2 287 223 +5bad8 4 287 223 +5badc 4 287 223 +5bae0 6 156 238 +5bae6 16 291 223 +FUNC 5bafc 26 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, long&) const +5bafc 4 537 223 +5bb00 8 537 223 +5bb08 1a 539 223 +FUNC 5bb24 76 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, bool&) const +5bb24 4 499 223 +5bb28 e 499 223 +5bb36 4 501 223 +5bb3a 2 499 223 +5bb3c 6 501 223 +5bb42 1a 506 223 +5bb5c 6 507 223 +5bb62 8 515 223 +5bb6a 6 517 223 +5bb70 4 508 223 +5bb74 4 511 223 +5bb78 12 502 223 +5bb8a 2 510 223 +5bb8c 8 513 223 +5bb94 2 510 223 +5bb96 4 511 223 +FUNC 5bb9c 17e 0 bool std::priv::__get_integer >, unsigned short, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, unsigned short&, int, bool, char, std::string const&, std::__false_type const&) +5bb9c 6 178 223 +5bba2 2 178 223 +5bba4 2 188 223 +5bba6 2 183 223 +5bba8 2 178 223 +5bbaa 2 188 223 +5bbac 2 178 223 +5bbae 4 188 223 +5bbb2 2 178 223 +5bbb4 6 183 223 +5bbba 4 186 223 +5bbbe 2 185 223 +5bbc0 4 183 223 +5bbc4 2 196 223 +5bbc6 6 183 223 +5bbcc 4 188 223 +5bbd0 4 178 223 +5bbd4 2 186 223 +5bbd6 2 120 215 +5bbd8 4 186 223 +5bbdc 8 178 223 +5bbe4 4 181 223 +5bbe8 4 188 223 +5bbec 6 120 215 +5bbf2 4 190 223 +5bbf6 8 90 215 +5bbfe 6 194 223 +5bc04 6 194 223 +5bc0a 4 52 223 +5bc0e 2 52 223 +5bc10 4 202 223 +5bc14 2 208 223 +5bc16 2 206 223 +5bc18 4 205 223 +5bc1c 2 208 223 +5bc1e 2 206 223 +5bc20 2 208 223 +5bc22 6 211 223 +5bc28 4 212 223 +5bc2c 6 213 223 +5bc32 6 213 223 +5bc38 4 213 223 +5bc3c 2 68 215 +5bc3e 8 229 235 +5bc46 4 229 235 +5bc4a 4 69 215 +5bc4e 8 120 215 +5bc56 6 190 223 +5bc5c 6 218 223 +5bc62 6 218 223 +5bc68 8 219 223 +5bc70 6 223 223 +5bc76 6 224 223 +5bc7c 8 224 223 +5bc84 2 233 223 +5bc86 6 234 223 +5bc8c 2 92 215 +5bc8e 6 235 235 +5bc94 4 223 246 +5bc98 2 235 235 +5bc9a 4 191 246 +5bc9e 2 220 246 +5bca0 2 191 246 +5bca2 2 93 215 +5bca4 4 191 246 +5bca8 2 95 215 +5bcaa 2 191 246 +5bcac 4 95 215 +5bcb0 2 68 215 +5bcb2 4 209 223 +5bcb6 8 229 235 +5bcbe 6 229 235 +5bcc4 6 69 215 +5bcca 4 211 223 +5bcce 6 195 223 +5bcd4 2 196 223 +5bcd6 2 195 223 +5bcd8 2 197 223 +5bcda 6 52 223 +5bce0 a 235 235 +5bcea 6 224 223 +5bcf0 2 224 223 +5bcf2 4 224 223 +5bcf6 4 224 223 +5bcfa 2 233 223 +5bcfc 6 233 223 +5bd02 2 65 238 +5bd04 4 233 223 +5bd08 2 65 238 +5bd0a 8 233 223 +5bd12 8 224 223 +FUNC 5bd1c f8 0 std::istreambuf_iterator > std::priv::__do_get_integer >, unsigned short, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, unsigned short&, char*) +5bd1c 6 247 223 +5bd22 4 145 212 +5bd26 2 247 223 +5bd28 4 247 223 +5bd2c 4 145 212 +5bd30 6 247 223 +5bd36 6 145 212 +5bd3c c 351 218 +5bd48 c 258 223 +5bd54 8 112 215 +5bd5c 4 259 223 +5bd60 2 263 223 +5bd62 6 265 223 +5bd68 6 266 223 +5bd6e 2 287 223 +5bd70 4 287 223 +5bd74 8 112 215 +5bd7c 2 289 223 +5bd7e c 290 223 +5bd8a e 291 223 +5bd98 a 292 223 +5bda2 a 351 218 +5bdac 2 57 227 +5bdae 2 351 218 +5bdb0 4 57 227 +5bdb4 8 58 227 +5bdbc 2 57 227 +5bdbe 8 58 227 +5bdc6 2 283 223 +5bdc8 2 275 223 +5bdca 20 283 223 +5bdea 6 156 238 +5bdf0 2 287 223 +5bdf2 4 287 223 +5bdf6 4 287 223 +5bdfa 6 156 238 +5be00 14 291 223 +FUNC 5be14 26 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, unsigned short&) const +5be14 4 543 223 +5be18 8 543 223 +5be20 1a 546 223 +FUNC 5be3c 17a 0 bool std::priv::__get_integer >, unsigned int, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, unsigned int&, int, bool, char, std::string const&, std::__false_type const&) +5be3c 6 178 223 +5be42 4 178 223 +5be46 2 183 223 +5be48 4 186 223 +5be4c 2 185 223 +5be4e 2 178 223 +5be50 4 188 223 +5be54 2 183 223 +5be56 2 196 223 +5be58 4 183 223 +5be5c 2 188 223 +5be5e 2 178 223 +5be60 4 183 223 +5be64 4 178 223 +5be68 6 183 223 +5be6e 4 188 223 +5be72 4 178 223 +5be76 2 186 223 +5be78 2 120 215 +5be7a 4 186 223 +5be7e 2 181 223 +5be80 6 178 223 +5be86 2 188 223 +5be88 6 120 215 +5be8e 4 190 223 +5be92 8 90 215 +5be9a 6 194 223 +5bea0 6 194 223 +5bea6 4 52 223 +5beaa 2 52 223 +5beac 4 202 223 +5beb0 2 208 223 +5beb2 2 206 223 +5beb4 4 205 223 +5beb8 2 208 223 +5beba 2 206 223 +5bebc 2 208 223 +5bebe 4 211 223 +5bec2 4 212 223 +5bec6 6 213 223 +5becc 6 213 223 +5bed2 4 213 223 +5bed6 2 68 215 +5bed8 8 229 235 +5bee0 4 229 235 +5bee4 4 69 215 +5bee8 8 120 215 +5bef0 6 190 223 +5bef6 6 218 223 +5befc 6 218 223 +5bf02 8 219 223 +5bf0a 2 233 223 +5bf0c 6 223 223 +5bf12 6 224 223 +5bf18 2 224 223 +5bf1a 2 233 223 +5bf1c 6 224 223 +5bf22 6 234 223 +5bf28 2 92 215 +5bf2a 6 235 235 +5bf30 4 223 246 +5bf34 2 235 235 +5bf36 4 191 246 +5bf3a 2 220 246 +5bf3c 4 191 246 +5bf40 2 93 215 +5bf42 4 191 246 +5bf46 2 95 215 +5bf48 2 191 246 +5bf4a 4 95 215 +5bf4e 2 68 215 +5bf50 4 209 223 +5bf54 8 229 235 +5bf5c 6 229 235 +5bf62 6 69 215 +5bf68 4 211 223 +5bf6c 6 195 223 +5bf72 2 196 223 +5bf74 2 195 223 +5bf76 2 197 223 +5bf78 6 52 223 +5bf7e a 235 235 +5bf88 6 224 223 +5bf8e 2 224 223 +5bf90 4 224 223 +5bf94 2 224 223 +5bf96 2 233 223 +5bf98 6 233 223 +5bf9e 2 65 238 +5bfa0 4 233 223 +5bfa4 2 65 238 +5bfa6 8 233 223 +5bfae 8 224 223 +FUNC 5bfb8 f8 0 std::istreambuf_iterator > std::priv::__do_get_integer >, unsigned int, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, unsigned int&, char*) +5bfb8 6 247 223 +5bfbe 4 145 212 +5bfc2 2 247 223 +5bfc4 4 247 223 +5bfc8 4 145 212 +5bfcc 6 247 223 +5bfd2 6 145 212 +5bfd8 c 351 218 +5bfe4 c 258 223 +5bff0 8 112 215 +5bff8 4 259 223 +5bffc 2 263 223 +5bffe 6 265 223 +5c004 6 266 223 +5c00a 4 287 223 +5c00e 8 112 215 +5c016 2 289 223 +5c018 c 290 223 +5c024 e 291 223 +5c032 a 292 223 +5c03c a 351 218 +5c046 2 57 227 +5c048 2 351 218 +5c04a 4 57 227 +5c04e 8 58 227 +5c056 2 57 227 +5c058 8 58 227 +5c060 2 283 223 +5c062 2 275 223 +5c064 20 283 223 +5c084 6 156 238 +5c08a 2 287 223 +5c08c 4 287 223 +5c090 4 287 223 +5c094 6 156 238 +5c09a 16 291 223 +FUNC 5c0b0 26 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, unsigned int&) const +5c0b0 4 550 223 +5c0b4 8 550 223 +5c0bc 1a 553 223 +FUNC 5c0d8 178 0 bool std::priv::__get_integer >, unsigned long, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, unsigned long&, int, bool, char, std::string const&, std::__false_type const&) +5c0d8 6 178 223 +5c0de 4 178 223 +5c0e2 2 183 223 +5c0e4 4 186 223 +5c0e8 2 185 223 +5c0ea 2 178 223 +5c0ec 4 188 223 +5c0f0 2 183 223 +5c0f2 2 196 223 +5c0f4 4 183 223 +5c0f8 2 188 223 +5c0fa 2 178 223 +5c0fc 4 183 223 +5c100 4 178 223 +5c104 6 183 223 +5c10a 4 188 223 +5c10e 4 178 223 +5c112 2 186 223 +5c114 2 120 215 +5c116 4 186 223 +5c11a 2 181 223 +5c11c 6 178 223 +5c122 2 188 223 +5c124 6 120 215 +5c12a 4 190 223 +5c12e 8 90 215 +5c136 6 194 223 +5c13c 6 194 223 +5c142 4 52 223 +5c146 2 52 223 +5c148 4 202 223 +5c14c 2 208 223 +5c14e 2 206 223 +5c150 4 205 223 +5c154 2 208 223 +5c156 2 206 223 +5c158 2 208 223 +5c15a 4 211 223 +5c15e 4 212 223 +5c162 6 213 223 +5c168 6 213 223 +5c16e 4 213 223 +5c172 2 68 215 +5c174 8 229 235 +5c17c 4 229 235 +5c180 4 69 215 +5c184 8 120 215 +5c18c 6 190 223 +5c192 6 218 223 +5c198 6 218 223 +5c19e 8 219 223 +5c1a6 2 233 223 +5c1a8 6 223 223 +5c1ae 6 224 223 +5c1b4 2 224 223 +5c1b6 2 233 223 +5c1b8 6 224 223 +5c1be 6 234 223 +5c1c4 2 92 215 +5c1c6 6 235 235 +5c1cc 4 223 246 +5c1d0 2 235 235 +5c1d2 4 191 246 +5c1d6 2 220 246 +5c1d8 2 191 246 +5c1da 2 93 215 +5c1dc 4 191 246 +5c1e0 2 95 215 +5c1e2 2 191 246 +5c1e4 4 95 215 +5c1e8 2 68 215 +5c1ea 4 209 223 +5c1ee 8 229 235 +5c1f6 6 229 235 +5c1fc 6 69 215 +5c202 4 211 223 +5c206 6 195 223 +5c20c 2 196 223 +5c20e 2 195 223 +5c210 2 197 223 +5c212 6 52 223 +5c218 a 235 235 +5c222 6 224 223 +5c228 2 224 223 +5c22a 4 224 223 +5c22e 2 224 223 +5c230 2 233 223 +5c232 6 233 223 +5c238 2 65 238 +5c23a 4 233 223 +5c23e 2 65 238 +5c240 8 233 223 +5c248 8 224 223 +FUNC 5c250 f8 0 std::istreambuf_iterator > std::priv::__do_get_integer >, unsigned long, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, unsigned long&, char*) +5c250 6 247 223 +5c256 4 145 212 +5c25a 2 247 223 +5c25c 4 247 223 +5c260 4 145 212 +5c264 6 247 223 +5c26a 6 145 212 +5c270 c 351 218 +5c27c c 258 223 +5c288 8 112 215 +5c290 4 259 223 +5c294 2 263 223 +5c296 6 265 223 +5c29c 6 266 223 +5c2a2 4 287 223 +5c2a6 8 112 215 +5c2ae 2 289 223 +5c2b0 c 290 223 +5c2bc e 291 223 +5c2ca a 292 223 +5c2d4 a 351 218 +5c2de 2 57 227 +5c2e0 2 351 218 +5c2e2 4 57 227 +5c2e6 8 58 227 +5c2ee 2 57 227 +5c2f0 8 58 227 +5c2f8 2 283 223 +5c2fa 2 275 223 +5c2fc 20 283 223 +5c31c 6 156 238 +5c322 2 287 223 +5c324 4 287 223 +5c328 4 287 223 +5c32c 6 156 238 +5c332 16 291 223 +FUNC 5c348 26 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, unsigned long&) const +5c348 4 557 223 +5c34c 8 557 223 +5c354 1a 560 223 +FUNC 5c370 1f4 0 bool std::priv::__get_integer >, unsigned long long, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, unsigned long long&, int, bool, char, std::string const&, std::__false_type const&) +5c370 6 178 223 +5c376 4 188 223 +5c37a 2 178 223 +5c37c 4 183 223 +5c380 2 178 223 +5c382 4 188 223 +5c386 4 178 223 +5c38a 4 183 223 +5c38e 2 188 223 +5c390 4 183 223 +5c394 a 188 223 +5c39e 4 183 223 +5c3a2 4 186 223 +5c3a6 6 183 223 +5c3ac 4 188 223 +5c3b0 2 186 223 +5c3b2 2 182 223 +5c3b4 4 178 223 +5c3b8 2 185 223 +5c3ba 2 186 223 +5c3bc c 182 223 +5c3c8 2 178 223 +5c3ca 2 196 223 +5c3cc 4 178 223 +5c3d0 6 181 223 +5c3d6 2 188 223 +5c3d8 2 120 215 +5c3da 2 188 223 +5c3dc 6 120 215 +5c3e2 4 190 223 +5c3e6 8 90 215 +5c3ee 2 194 223 +5c3f0 a 194 223 +5c3fa 6 52 223 +5c400 2 52 223 +5c402 8 202 223 +5c40a 4 208 223 +5c40e 2 206 223 +5c410 4 208 223 +5c414 2 205 223 +5c416 2 206 223 +5c418 8 208 223 +5c420 1c 211 223 +5c43c 4 212 223 +5c440 c 211 223 +5c44c 6 212 223 +5c452 6 213 223 +5c458 e 213 223 +5c466 a 213 223 +5c470 2 68 215 +5c472 8 229 235 +5c47a 4 229 235 +5c47e 4 69 215 +5c482 8 120 215 +5c48a 6 190 223 +5c490 2 218 223 +5c492 8 218 223 +5c49a 8 219 223 +5c4a2 4 223 223 +5c4a6 6 224 223 +5c4ac 10 224 223 +5c4bc 2 233 223 +5c4be 6 234 223 +5c4c4 2 92 215 +5c4c6 6 235 235 +5c4cc 4 223 246 +5c4d0 2 235 235 +5c4d2 4 191 246 +5c4d6 2 220 246 +5c4d8 2 191 246 +5c4da 2 93 215 +5c4dc 6 191 246 +5c4e2 6 95 215 +5c4e8 2 68 215 +5c4ea 4 209 223 +5c4ee 8 229 235 +5c4f6 6 229 235 +5c4fc 6 69 215 +5c502 6 211 223 +5c508 8 195 223 +5c510 2 196 223 +5c512 4 195 223 +5c516 2 197 223 +5c518 6 52 223 +5c51e a 235 235 +5c528 6 224 223 +5c52e 2 224 223 +5c530 a 224 223 +5c53a 4 224 223 +5c53e 2 233 223 +5c540 6 233 223 +5c546 2 65 238 +5c548 4 233 223 +5c54c 2 65 238 +5c54e 8 233 223 +5c556 e 224 223 +FUNC 5c564 fc 0 std::istreambuf_iterator > std::priv::__do_get_integer >, unsigned long long, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, unsigned long long&, char*) +5c564 6 247 223 +5c56a 4 145 212 +5c56e 2 247 223 +5c570 4 247 223 +5c574 4 145 212 +5c578 6 247 223 +5c57e 6 145 212 +5c584 c 351 218 +5c590 c 258 223 +5c59c 8 112 215 +5c5a4 4 259 223 +5c5a8 2 263 223 +5c5aa 6 265 223 +5c5b0 a 266 223 +5c5ba 2 287 223 +5c5bc 4 287 223 +5c5c0 8 112 215 +5c5c8 2 289 223 +5c5ca c 290 223 +5c5d6 e 291 223 +5c5e4 a 292 223 +5c5ee a 351 218 +5c5f8 2 57 227 +5c5fa 2 351 218 +5c5fc 4 57 227 +5c600 8 58 227 +5c608 2 57 227 +5c60a 8 58 227 +5c612 2 283 223 +5c614 2 275 223 +5c616 20 283 223 +5c636 6 156 238 +5c63c 2 287 223 +5c63e 4 287 223 +5c642 4 287 223 +5c646 6 156 238 +5c64c 14 291 223 +FUNC 5c660 26 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, unsigned long long&) const +5c660 4 611 223 +5c664 8 611 223 +5c66c 1a 614 223 +FUNC 5c688 32 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, void*&) const +5c688 4 587 223 +5c68c 6 587 223 +5c692 2 595 223 +5c694 4 587 223 +5c698 10 595 223 +5c6a8 4 596 223 +5c6ac 2 599 223 +5c6ae 8 597 223 +5c6b6 4 599 223 +FUNC 5c6bc 210 0 bool std::priv::__get_integer >, long long, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, int, long long&, int, bool, char, std::string const&, std::__true_type const&) +5c6bc 6 118 223 +5c6c2 4 128 223 +5c6c6 2 118 223 +5c6c8 4 123 223 +5c6cc 2 118 223 +5c6ce 4 128 223 +5c6d2 4 118 223 +5c6d6 4 123 223 +5c6da 2 128 223 +5c6dc 4 123 223 +5c6e0 8 128 223 +5c6e8 4 123 223 +5c6ec 4 126 223 +5c6f0 6 123 223 +5c6f6 4 128 223 +5c6fa 4 118 223 +5c6fe 2 126 223 +5c700 4 118 223 +5c704 2 125 223 +5c706 2 126 223 +5c708 2 122 223 +5c70a 2 118 223 +5c70c c 122 223 +5c718 2 118 223 +5c71a 2 136 223 +5c71c 4 118 223 +5c720 a 121 223 +5c72a 2 128 223 +5c72c 2 120 215 +5c72e 2 128 223 +5c730 6 120 215 +5c736 4 130 223 +5c73a 8 90 215 +5c742 2 134 223 +5c744 a 134 223 +5c74e 6 52 223 +5c754 2 52 223 +5c756 8 142 223 +5c75e 4 148 223 +5c762 2 146 223 +5c764 4 148 223 +5c768 2 145 223 +5c76a 2 146 223 +5c76c 8 148 223 +5c774 16 151 223 +5c78a 4 152 223 +5c78e 8 151 223 +5c796 6 152 223 +5c79c 6 153 223 +5c7a2 e 153 223 +5c7b0 a 153 223 +5c7ba 2 68 215 +5c7bc 8 229 235 +5c7c4 4 229 235 +5c7c8 4 69 215 +5c7cc 8 120 215 +5c7d4 6 130 223 +5c7da 2 158 223 +5c7dc 8 158 223 +5c7e4 8 159 223 +5c7ec 2 173 223 +5c7ee 4 163 223 +5c7f2 6 164 223 +5c7f8 6 164 223 +5c7fe c 164 223 +5c80a 2 173 223 +5c80c 6 174 223 +5c812 2 92 215 +5c814 6 235 235 +5c81a 4 223 246 +5c81e 2 235 235 +5c820 4 191 246 +5c824 2 220 246 +5c826 4 191 246 +5c82a 2 93 215 +5c82c 6 191 246 +5c832 6 95 215 +5c838 2 68 215 +5c83a 4 149 223 +5c83e 8 229 235 +5c846 6 229 235 +5c84c 6 69 215 +5c852 6 151 223 +5c858 8 135 223 +5c860 2 136 223 +5c862 4 135 223 +5c866 2 137 223 +5c868 6 52 223 +5c86e a 235 235 +5c878 4 164 223 +5c87c c 164 223 +5c888 2 173 223 +5c88a 6 173 223 +5c890 4 65 238 +5c894 4 173 223 +5c898 4 65 238 +5c89c a 173 223 +5c8a6 e 164 223 +5c8b4 4 173 223 +5c8b8 4 164 223 +5c8bc a 164 223 +5c8c6 6 164 223 +FUNC 5c8cc fc 0 std::istreambuf_iterator > std::priv::__do_get_integer >, long long, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, long long&, char*) +5c8cc 6 247 223 +5c8d2 4 145 212 +5c8d6 2 247 223 +5c8d8 4 247 223 +5c8dc 4 145 212 +5c8e0 6 247 223 +5c8e6 6 145 212 +5c8ec c 351 218 +5c8f8 c 258 223 +5c904 8 112 215 +5c90c 4 259 223 +5c910 2 263 223 +5c912 6 265 223 +5c918 a 266 223 +5c922 2 287 223 +5c924 4 287 223 +5c928 8 112 215 +5c930 2 289 223 +5c932 c 290 223 +5c93e e 291 223 +5c94c a 292 223 +5c956 a 351 218 +5c960 2 57 227 +5c962 2 351 218 +5c964 4 57 227 +5c968 8 58 227 +5c970 2 57 227 +5c972 8 58 227 +5c97a 2 283 223 +5c97c 2 275 223 +5c97e 20 283 223 +5c99e 6 156 238 +5c9a4 2 287 223 +5c9a6 4 287 223 +5c9aa 4 287 223 +5c9ae 6 156 238 +5c9b4 14 291 223 +FUNC 5c9c8 26 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, long long&) const +5c9c8 4 604 223 +5c9cc 8 604 223 +5c9d4 1a 607 223 +FUNC 5c9f0 3b4 0 std::ostreambuf_iterator > std::priv::__copy_integer_and_fill > >(wchar_t const*, int, std::ostreambuf_iterator >, int, int, wchar_t, wchar_t, wchar_t) +5c9f0 a 148 225 +5c9fa 8 148 225 +5ca02 2 152 225 +5ca04 4 148 225 +5ca08 4 152 225 +5ca0c 4 159 225 +5ca10 4 161 225 +5ca14 a 153 225 +5ca1e 6 163 225 +5ca24 1a 167 225 +5ca3e c 167 225 +5ca4a 8 167 225 +5ca52 e 173 225 +5ca60 c 173 225 +5ca6c 8 179 225 +5ca74 2 480 200 +5ca76 10 179 225 +5ca86 2 480 200 +5ca88 2 62 229 +5ca8a 4 200 235 +5ca8e 2 200 235 +5ca90 6 200 235 +5ca96 c 200 235 +5caa2 2 200 235 +5caa4 8 62 229 +5caac 4 480 200 +5cab0 6 482 200 +5cab6 4 182 225 +5caba 4 213 200 +5cabe 4 482 200 +5cac2 4 213 200 +5cac6 8 482 200 +5cace 2e 182 225 +5cafc 4 213 200 +5cb00 4 182 225 +5cb04 8 213 200 +5cb0c 8 62 229 +5cb14 6 213 200 +5cb1a 4 214 200 +5cb1e 4 62 229 +5cb22 6 200 235 +5cb28 a 200 235 +5cb32 2 200 235 +5cb34 22 200 235 +5cb56 c 218 200 +5cb62 c 186 225 +5cb6e 10 153 225 +5cb7e 6 62 229 +5cb84 2 62 229 +5cb86 6 200 235 +5cb8c 8 200 235 +5cb94 4 200 235 +5cb98 6 62 229 +5cb9e c 62 229 +5cbaa 2 480 200 +5cbac c 62 229 +5cbb8 2 480 200 +5cbba 2 62 229 +5cbbc 4 200 235 +5cbc0 2 200 235 +5cbc2 6 200 235 +5cbc8 c 200 235 +5cbd4 2 200 235 +5cbd6 8 62 229 +5cbde 4 480 200 +5cbe2 6 482 200 +5cbe8 8 171 225 +5cbf0 c 482 200 +5cbfc a 178 225 +5cc06 2 179 225 +5cc08 2 178 225 +5cc0a c 179 225 +5cc16 16 200 235 +5cc2c 26 164 225 +5cc52 2 480 200 +5cc54 14 164 225 +5cc68 2 480 200 +5cc6a 2 62 229 +5cc6c 4 200 235 +5cc70 2 200 235 +5cc72 6 200 235 +5cc78 c 200 235 +5cc84 2 200 235 +5cc86 8 62 229 +5cc8e 4 480 200 +5cc92 10 482 200 +5cca2 e 200 235 +5ccb0 4 62 229 +5ccb4 4 176 225 +5ccb8 4 62 229 +5ccbc 2 62 229 +5ccbe 6 200 235 +5ccc4 8 200 235 +5cccc 2 200 235 +5ccce 4 62 229 +5ccd2 2 200 235 +5ccd4 2 62 229 +5ccd6 2 200 235 +5ccd8 4 62 229 +5ccdc 4 177 225 +5cce0 2 200 235 +5cce2 8 200 235 +5ccea 2 200 235 +5ccec 12 200 235 +5ccfe a 62 229 +5cd08 c 62 229 +5cd14 2 480 200 +5cd16 a 62 229 +5cd20 2 480 200 +5cd22 6 62 229 +5cd28 2 200 235 +5cd2a 2 200 235 +5cd2c 4 200 235 +5cd30 a 200 235 +5cd3a 2 200 235 +5cd3c a 62 229 +5cd46 4 480 200 +5cd4a 6 482 200 +5cd50 8 179 225 +5cd58 c 482 200 +5cd64 26 200 235 +5cd8a 6 62 229 +5cd90 14 200 235 +FUNC 5cda4 114 0 std::ostreambuf_iterator > std::priv::__put_integer > >(char*, char*, std::ostreambuf_iterator >, std::ios_base&, int, wchar_t) +5cda4 8 192 225 +5cdac 8 192 225 +5cdb4 2 145 212 +5cdb6 4 192 225 +5cdba a 145 212 +5cdc4 a 351 218 +5cdce 4 206 206 +5cdd2 2 351 218 +5cdd4 10 206 206 +5cde4 2 209 206 +5cde6 2 206 206 +5cde8 e 209 206 +5cdf6 a 351 218 +5ce00 2 87 227 +5ce02 2 351 218 +5ce04 8 87 227 +5ce0c 2 209 225 +5ce0e 2 203 225 +5ce10 6 209 225 +5ce16 8 211 225 +5ce1e 8 86 227 +5ce26 2 204 225 +5ce28 2 86 227 +5ce2a 4 204 225 +5ce2e 10 220 225 +5ce3e 4 138 212 +5ce42 6 139 212 +5ce48 22 225 225 +5ce6a 6 156 238 +5ce70 6 225 225 +5ce76 c 226 225 +5ce82 6 212 225 +5ce88 10 211 225 +5ce98 a 225 225 +5cea2 16 156 238 +FUNC 5ceb8 70 0 std::ostreambuf_iterator > std::priv::__do_put_integer >, unsigned long>(std::ostreambuf_iterator >, std::ios_base&, wchar_t, unsigned long) +5ceb8 4 372 225 +5cebc e 372 225 +5ceca 2 109 212 +5cecc 6 307 225 +5ced2 4 309 225 +5ced6 2 308 225 +5ced8 4 309 225 +5cedc e 308 225 +5ceea 2 309 225 +5ceec 16 381 225 +5cf02 6 382 225 +5cf08 4 380 225 +5cf0c 1c 310 225 +FUNC 5cf28 13c 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, wchar_t, void const*) const +5cf28 6 475 225 +5cf2e 6 475 225 +5cf34 2 145 212 +5cf36 4 475 225 +5cf3a 2 62 229 +5cf3c 4 145 212 +5cf40 4 475 225 +5cf44 4 62 229 +5cf48 6 145 212 +5cf4e c 351 218 +5cf5a 6 477 225 +5cf60 2 109 212 +5cf62 4 139 212 +5cf66 8 123 212 +5cf6e 6 124 212 +5cf74 6 484 225 +5cf7a c 206 206 +5cf86 12 506 225 +5cf98 2 206 206 +5cf9a a 506 225 +5cfa4 2 112 212 +5cfa6 8 514 225 +5cfae 4 488 225 +5cfb2 6 488 225 +5cfb8 e 206 206 +5cfc6 6 62 229 +5cfcc a 200 235 +5cfd6 a 200 235 +5cfe0 2 200 235 +5cfe2 4 62 229 +5cfe6 e 206 206 +5cff4 a 200 235 +5cffe 2 206 206 +5d000 a 200 235 +5d00a 2 200 235 +5d00c a 62 229 +5d016 6 139 212 +5d01c 8 488 225 +5d024 8 206 206 +5d02c 4 62 229 +5d030 8 206 206 +5d038 1c 200 235 +5d054 10 477 225 +FUNC 5d064 22 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, wchar_t, unsigned long) const +5d064 4 438 225 +5d068 8 438 225 +5d070 16 440 225 +FUNC 5d088 76 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, wchar_t, unsigned long long) const +5d088 4 465 225 +5d08c 4 465 225 +5d090 2 310 225 +5d092 6 465 225 +5d098 2 310 225 +5d09a 4 465 225 +5d09e 4 310 225 +5d0a2 4 307 225 +5d0a6 2 109 212 +5d0a8 2 307 225 +5d0aa 4 309 225 +5d0ae 2 308 225 +5d0b0 4 309 225 +5d0b4 e 308 225 +5d0c2 2 309 225 +5d0c4 16 381 225 +5d0da 6 467 225 +5d0e0 4 380 225 +5d0e4 1a 310 225 +FUNC 5d100 76 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, wchar_t, long long) const +5d100 4 459 225 +5d104 4 459 225 +5d108 2 310 225 +5d10a 6 459 225 +5d110 2 310 225 +5d112 4 459 225 +5d116 4 310 225 +5d11a 4 307 225 +5d11e 2 109 212 +5d120 2 307 225 +5d122 4 309 225 +5d126 2 308 225 +5d128 4 309 225 +5d12c e 308 225 +5d13a 2 309 225 +5d13c 16 381 225 +5d152 6 461 225 +5d158 4 380 225 +5d15c 1a 310 225 +FUNC 5d178 72 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, wchar_t, long) const +5d178 4 432 225 +5d17c 6 432 225 +5d182 2 310 225 +5d184 4 432 225 +5d188 2 310 225 +5d18a 2 432 225 +5d18c 2 109 212 +5d18e 4 310 225 +5d192 2 307 225 +5d194 4 309 225 +5d198 2 308 225 +5d19a 4 309 225 +5d19e e 308 225 +5d1ac 2 309 225 +5d1ae 16 381 225 +5d1c4 6 434 225 +5d1ca 4 380 225 +5d1ce 1c 310 225 +FUNC 5d1ec 29a 0 std::ostreambuf_iterator > std::priv::__copy_float_and_fill > >(wchar_t const*, wchar_t const*, std::ostreambuf_iterator >, int, int, wchar_t, wchar_t, wchar_t) +5d1ec 8 42 225 +5d1f4 4 47 225 +5d1f8 6 42 225 +5d1fe 4 47 225 +5d202 2 42 225 +5d204 2 47 225 +5d206 2 42 225 +5d208 4 47 225 +5d20c 2 51 225 +5d20e 4 50 225 +5d212 4 51 225 +5d216 6 53 225 +5d21c 12 57 225 +5d22e a 57 225 +5d238 8 57 225 +5d240 8 61 225 +5d248 2 480 200 +5d24a 10 61 225 +5d25a 2 480 200 +5d25c 6 62 229 +5d262 4 200 235 +5d266 2 200 235 +5d268 6 200 235 +5d26e c 200 235 +5d27a 2 200 235 +5d27c a 62 229 +5d286 4 480 200 +5d28a 6 482 200 +5d290 4 64 225 +5d294 4 213 200 +5d298 c 482 200 +5d2a4 2e 64 225 +5d2d2 2 213 200 +5d2d4 4 64 225 +5d2d8 4 213 200 +5d2dc 8 62 229 +5d2e4 6 213 200 +5d2ea 4 214 200 +5d2ee 4 62 229 +5d2f2 6 200 235 +5d2f8 a 200 235 +5d302 2 200 235 +5d304 22 200 235 +5d326 c 218 200 +5d332 c 68 225 +5d33e c 48 225 +5d34a 4 62 229 +5d34e 4 59 225 +5d352 2 62 229 +5d354 2 62 229 +5d356 2 62 229 +5d358 6 200 235 +5d35e 8 200 235 +5d366 4 200 235 +5d36a 6 62 229 +5d370 c 62 229 +5d37c 2 480 200 +5d37e c 62 229 +5d38a 2 480 200 +5d38c 2 62 229 +5d38e 4 200 235 +5d392 2 200 235 +5d394 6 200 235 +5d39a c 200 235 +5d3a6 2 200 235 +5d3a8 8 62 229 +5d3b0 4 480 200 +5d3b4 12 482 200 +5d3c6 a 60 225 +5d3d0 2 61 225 +5d3d2 2 60 225 +5d3d4 c 61 225 +5d3e0 1a 200 235 +5d3fa 1e 54 225 +5d418 2 480 200 +5d41a 16 54 225 +5d430 2 480 200 +5d432 2 62 229 +5d434 4 200 235 +5d438 2 200 235 +5d43a 6 200 235 +5d440 c 200 235 +5d44c 2 200 235 +5d44e 8 62 229 +5d456 4 480 200 +5d45a 10 482 200 +5d46a 1c 200 235 +FUNC 5d488 1dc 0 bool std::priv::__copy_grouped_digits >, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >, std::priv::__basic_iostring&, wchar_t const*, wchar_t, std::string const&, bool&) +5d488 6 332 223 +5d48e 2 332 223 +5d490 2 338 223 +5d492 2 339 223 +5d494 2 338 223 +5d496 2 332 223 +5d498 4 338 223 +5d49c 4 332 223 +5d4a0 4 120 215 +5d4a4 2 332 223 +5d4a6 2 336 223 +5d4a8 2 101 205 +5d4aa 8 332 223 +5d4b2 4 120 215 +5d4b6 2 341 223 +5d4b8 8 90 215 +5d4c0 6 343 223 +5d4c6 2 342 223 +5d4c8 4 343 223 +5d4cc 2 344 223 +5d4ce 6 345 223 +5d4d4 4 346 223 +5d4d8 2 347 223 +5d4da 2 68 215 +5d4dc 8 229 235 +5d4e4 4 229 235 +5d4e8 4 69 215 +5d4ec 8 120 215 +5d4f4 4 341 223 +5d4f8 2 359 223 +5d4fa 2 361 223 +5d4fc 2 65 238 +5d4fe 6 359 223 +5d504 6 360 223 +5d50a 2 65 238 +5d50c a 361 223 +5d516 8 363 223 +5d51e 2 74 238 +5d520 4 64 238 +5d524 4 74 238 +5d528 2 74 238 +5d52a 8 74 238 +5d532 4 535 237 +5d536 4 101 205 +5d53a 2 350 223 +5d53c 2 90 238 +5d53e 2 352 223 +5d540 2 350 223 +5d542 2 352 223 +5d544 2 351 223 +5d546 2 68 215 +5d548 2 539 237 +5d54a 2 229 235 +5d54c 4 539 237 +5d550 6 229 235 +5d556 6 229 235 +5d55c 6 69 215 +5d562 2 92 215 +5d564 6 235 235 +5d56a 4 764 186 +5d56e 2 235 235 +5d570 4 191 246 +5d574 2 93 215 +5d576 8 191 246 +5d57e 2 95 215 +5d580 2 191 246 +5d582 4 95 215 +5d586 a 235 235 +5d590 2 400 237 +5d592 4 304 237 +5d596 e 306 237 +5d5a4 6 307 237 +5d5aa 8 307 237 +5d5b2 1c 134 222 +5d5ce 2 86 243 +5d5d0 4 84 243 +5d5d4 2 86 243 +5d5d6 6 332 223 +5d5dc 2 84 243 +5d5de 4 764 186 +5d5e2 4 146 205 +5d5e6 4 86 243 +5d5ea 4 101 205 +5d5ee 4 64 238 +5d5f2 4 96 238 +5d5f6 2 96 238 +5d5f8 6 97 238 +5d5fe 4 70 213 +5d602 2 97 238 +5d604 2 135 222 +5d606 2 161 201 +5d608 6 135 222 +5d60e 2 161 201 +5d610 c 161 201 +5d61c 2 175 236 +5d61e 2 164 238 +5d620 4 175 236 +5d624 2 160 238 +5d626 6 165 238 +5d62c 4 64 213 +5d630 8 67 213 +5d638 4 64 213 +5d63c 6 135 222 +5d642 c 175 236 +5d64e 2 164 238 +5d650 2 160 238 +5d652 6 165 238 +5d658 c 600 236 +FUNC 5d664 164 0 bool std::priv::__copy_digits >, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >, std::priv::__basic_iostring&, wchar_t const*) +5d664 6 314 223 +5d66a 2 314 223 +5d66c 2 316 223 +5d66e 8 314 223 +5d676 2 101 205 +5d678 4 314 223 +5d67c 2 318 223 +5d67e 2 90 215 +5d680 4 320 223 +5d684 2 319 223 +5d686 8 320 223 +5d68e 2 74 238 +5d690 4 64 238 +5d694 2 74 238 +5d696 4 321 223 +5d69a 2 74 238 +5d69c 2 74 238 +5d69e 8 74 238 +5d6a6 4 535 237 +5d6aa 4 101 205 +5d6ae 2 90 238 +5d6b0 4 321 223 +5d6b4 2 68 215 +5d6b6 2 539 237 +5d6b8 2 229 235 +5d6ba 2 539 237 +5d6bc 2 229 235 +5d6be 2 539 237 +5d6c0 4 229 235 +5d6c4 4 229 235 +5d6c8 2 322 223 +5d6ca 4 69 215 +5d6ce 8 120 215 +5d6d6 2 318 223 +5d6d8 6 90 215 +5d6de 2 92 215 +5d6e0 6 235 235 +5d6e6 4 764 186 +5d6ea 2 235 235 +5d6ec 4 191 246 +5d6f0 2 93 215 +5d6f2 2 191 246 +5d6f4 2 320 223 +5d6f6 4 191 246 +5d6fa 2 320 223 +5d6fc 2 191 246 +5d6fe 4 95 215 +5d702 2 319 223 +5d704 8 320 223 +5d70c 8 328 223 +5d714 8 229 235 +5d71c 2 400 237 +5d71e 4 304 237 +5d722 e 306 237 +5d730 6 307 237 +5d736 4 307 237 +5d73a 4 64 213 +5d73e 6 67 213 +5d744 2 64 213 +5d746 2 86 243 +5d748 4 84 243 +5d74c 2 86 243 +5d74e 2 314 223 +5d750 2 84 243 +5d752 4 764 186 +5d756 4 146 205 +5d75a 4 86 243 +5d75e 4 101 205 +5d762 4 64 238 +5d766 4 96 238 +5d76a 2 96 238 +5d76c 6 97 238 +5d772 4 70 213 +5d776 2 97 238 +5d778 2 135 222 +5d77a 4 161 201 +5d77e 6 161 201 +5d784 4 175 236 +5d788 2 164 238 +5d78a 2 160 238 +5d78c 6 165 238 +5d792 4 307 237 +5d796 12 134 222 +5d7a8 a 235 235 +5d7b2 8 135 222 +5d7ba e 600 236 +FUNC 5d7c8 c8 0 std::basic_string, std::priv::__iostring_allocator >::push_back(char) +5d7c8 4 64 238 +5d7cc 4 534 237 +5d7d0 2 74 238 +5d7d2 4 534 237 +5d7d6 2 74 238 +5d7d8 6 74 238 +5d7de 4 535 237 +5d7e2 4 101 205 +5d7e6 2 90 238 +5d7e8 2 232 246 +5d7ea 6 539 237 +5d7f0 4 540 237 +5d7f4 2 400 237 +5d7f6 4 304 237 +5d7fa a 306 237 +5d804 4 307 237 +5d808 4 307 237 +5d80c 4 64 213 +5d810 6 67 213 +5d816 2 64 213 +5d818 2 86 243 +5d81a 4 84 243 +5d81e 2 86 243 +5d820 4 534 237 +5d824 2 84 243 +5d826 4 764 186 +5d82a 4 146 205 +5d82e 4 86 243 +5d832 4 101 205 +5d836 4 64 238 +5d83a 4 96 238 +5d83e 2 96 238 +5d840 6 97 238 +5d846 4 70 213 +5d84a 2 97 238 +5d84c 4 161 201 +5d850 4 161 201 +5d854 2 175 236 +5d856 2 164 238 +5d858 2 160 238 +5d85a 6 165 238 +5d860 4 307 237 +5d864 12 134 222 +5d876 8 74 238 +5d87e 6 135 222 +5d884 c 600 236 +FUNC 5d890 8e 0 std::istreambuf_iterator > std::priv::__copy_sign >, wchar_t>(std::istreambuf_iterator >, std::istreambuf_iterator >, std::priv::__basic_iostring&, wchar_t, wchar_t) +5d890 4 297 223 +5d894 8 297 223 +5d89c 8 120 215 +5d8a4 2 299 223 +5d8a6 8 308 223 +5d8ae 6 309 223 +5d8b4 8 90 215 +5d8bc 6 301 223 +5d8c2 6 303 223 +5d8c8 8 304 223 +5d8d0 2 68 215 +5d8d2 8 229 235 +5d8da 4 229 235 +5d8de 8 69 215 +5d8e6 2 92 215 +5d8e8 6 235 235 +5d8ee 4 764 186 +5d8f2 2 235 235 +5d8f4 4 191 246 +5d8f8 2 93 215 +5d8fa c 191 246 +5d906 8 95 215 +5d90e 8 229 235 +5d916 8 235 235 +FUNC 5d920 a0 0 std::istreambuf_iterator > std::priv::__copy_sign >, char>(std::istreambuf_iterator >, std::istreambuf_iterator >, std::priv::__basic_iostring&, char, char) +5d920 6 297 223 +5d926 6 297 223 +5d92c 4 120 215 +5d930 4 297 223 +5d934 4 120 215 +5d938 2 299 223 +5d93a 8 308 223 +5d942 c 309 223 +5d94e a 90 215 +5d958 8 301 223 +5d960 8 303 223 +5d968 8 304 223 +5d970 2 68 215 +5d972 8 229 235 +5d97a 4 229 235 +5d97e 8 69 215 +5d986 2 92 215 +5d988 6 235 235 +5d98e 4 223 246 +5d992 2 235 235 +5d994 4 191 246 +5d998 2 220 246 +5d99a 2 191 246 +5d99c 4 93 215 +5d9a0 4 191 246 +5d9a4 2 95 215 +5d9a6 4 191 246 +5d9aa 6 95 215 +5d9b0 8 229 235 +5d9b8 8 235 235 +FUNC 5d9c0 1b4 0 bool std::priv::__copy_grouped_digits >, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >, std::priv::__basic_iostring&, char const*, char, std::string const&, bool&) +5d9c0 6 332 223 +5d9c6 4 332 223 +5d9ca 2 338 223 +5d9cc 2 332 223 +5d9ce 2 338 223 +5d9d0 2 339 223 +5d9d2 4 332 223 +5d9d6 4 120 215 +5d9da 4 70 213 +5d9de 6 332 223 +5d9e4 4 338 223 +5d9e8 2 336 223 +5d9ea 2 347 223 +5d9ec 2 70 213 +5d9ee 4 120 215 +5d9f2 4 341 223 +5d9f6 8 90 215 +5d9fe 4 42 223 +5da02 4 39 223 +5da06 6 344 223 +5da0c 2 74 238 +5da0e 4 64 238 +5da12 4 74 238 +5da16 2 74 238 +5da18 8 74 238 +5da20 4 535 237 +5da24 4 101 205 +5da28 2 350 223 +5da2a 2 90 238 +5da2c 2 352 223 +5da2e 2 350 223 +5da30 2 352 223 +5da32 2 232 246 +5da34 2 68 215 +5da36 4 539 237 +5da3a 2 229 235 +5da3c 2 539 237 +5da3e 6 229 235 +5da44 4 229 235 +5da48 4 69 215 +5da4c 8 120 215 +5da54 4 341 223 +5da58 2 359 223 +5da5a 2 361 223 +5da5c 6 359 223 +5da62 6 360 223 +5da68 2 65 238 +5da6a 2 361 223 +5da6c 2 65 238 +5da6e 8 361 223 +5da76 8 363 223 +5da7e 4 346 223 +5da82 2 347 223 +5da84 2 68 215 +5da86 8 229 235 +5da8e 6 229 235 +5da94 6 69 215 +5da9a 2 92 215 +5da9c 6 235 235 +5daa2 4 223 246 +5daa6 2 235 235 +5daa8 4 191 246 +5daac 2 220 246 +5daae 2 191 246 +5dab0 2 93 215 +5dab2 4 191 246 +5dab6 2 95 215 +5dab8 2 191 246 +5daba 4 95 215 +5dabe 8 235 235 +5dac6 2 400 237 +5dac8 4 304 237 +5dacc a 306 237 +5dad6 4 307 237 +5dada 8 307 237 +5dae2 14 134 222 +5daf6 2 86 243 +5daf8 4 84 243 +5dafc 2 86 243 +5dafe 4 332 223 +5db02 2 84 243 +5db04 4 764 186 +5db08 4 146 205 +5db0c 4 86 243 +5db10 4 101 205 +5db14 4 64 238 +5db18 4 96 238 +5db1c 2 96 238 +5db1e 4 70 213 +5db22 2 97 238 +5db24 4 70 213 +5db28 2 97 238 +5db2a 2 161 201 +5db2c 4 135 222 +5db30 2 161 201 +5db32 8 161 201 +5db3a 2 175 236 +5db3c 2 164 238 +5db3e 2 160 238 +5db40 6 165 238 +5db46 4 64 213 +5db4a 6 67 213 +5db50 4 64 213 +5db54 8 135 222 +5db5c 2 175 236 +5db5e 2 160 238 +5db60 2 164 238 +5db62 6 165 238 +5db68 c 600 236 +FUNC 5db74 3a2 0 std::ostreambuf_iterator > std::priv::__copy_integer_and_fill > >(char const*, int, std::ostreambuf_iterator >, int, int, char, char, char) +5db74 a 148 225 +5db7e 8 148 225 +5db86 2 152 225 +5db88 6 148 225 +5db8e 4 152 225 +5db92 4 159 225 +5db96 4 161 225 +5db9a a 153 225 +5dba4 6 163 225 +5dbaa 18 167 225 +5dbc2 e 167 225 +5dbd0 a 167 225 +5dbda e 173 225 +5dbe8 c 173 225 +5dbf4 8 179 225 +5dbfc 2 480 200 +5dbfe e 179 225 +5dc0c 2 480 200 +5dc0e 6 62 229 +5dc14 6 200 235 +5dc1a a 200 235 +5dc24 2 200 235 +5dc26 4 480 200 +5dc2a 6 482 200 +5dc30 4 182 225 +5dc34 4 213 200 +5dc38 a 482 200 +5dc42 14 182 225 +5dc56 4 213 200 +5dc5a 1e 182 225 +5dc78 e 213 200 +5dc86 4 214 200 +5dc8a 4 62 229 +5dc8e 6 200 235 +5dc94 a 200 235 +5dc9e 2 200 235 +5dca0 8 200 235 +5dca8 8 62 229 +5dcb0 6 213 200 +5dcb6 c 218 200 +5dcc2 c 186 225 +5dcce e 200 235 +5dcdc 10 62 229 +5dcec 10 153 225 +5dcfc 4 62 229 +5dd00 2 62 229 +5dd02 2 62 229 +5dd04 2 62 229 +5dd06 6 200 235 +5dd0c 8 200 235 +5dd14 4 62 229 +5dd18 4 200 235 +5dd1c c 62 229 +5dd28 2 480 200 +5dd2a 8 62 229 +5dd32 2 480 200 +5dd34 6 62 229 +5dd3a 6 200 235 +5dd40 a 200 235 +5dd4a 2 200 235 +5dd4c 4 480 200 +5dd50 6 482 200 +5dd56 8 171 225 +5dd5e a 482 200 +5dd68 a 178 225 +5dd72 2 179 225 +5dd74 2 178 225 +5dd76 c 179 225 +5dd82 e 200 235 +5dd90 10 62 229 +5dda0 26 164 225 +5ddc6 2 480 200 +5ddc8 12 164 225 +5ddda 2 480 200 +5dddc 6 62 229 +5dde2 6 200 235 +5dde8 a 200 235 +5ddf2 2 200 235 +5ddf4 4 480 200 +5ddf8 10 482 200 +5de08 a 200 235 +5de12 c 62 229 +5de1e 4 62 229 +5de22 4 176 225 +5de26 2 62 229 +5de28 4 62 229 +5de2c 6 200 235 +5de32 8 200 235 +5de3a 4 200 235 +5de3e 4 62 229 +5de42 4 177 225 +5de46 2 200 235 +5de48 4 62 229 +5de4c 8 200 235 +5de54 2 200 235 +5de56 c 200 235 +5de62 e 62 229 +5de70 c 62 229 +5de7c 2 480 200 +5de7e 8 62 229 +5de86 2 480 200 +5de88 6 62 229 +5de8e 6 200 235 +5de94 a 200 235 +5de9e 2 200 235 +5dea0 4 480 200 +5dea4 6 482 200 +5deaa 8 179 225 +5deb2 c 482 200 +5debe c 200 235 +5deca 10 62 229 +5deda e 200 235 +5dee8 16 62 229 +5defe c 200 235 +5df0a 8 62 229 +5df12 4 218 200 +FUNC 5df18 f8 0 std::ostreambuf_iterator > std::priv::__put_integer > >(char*, char*, std::ostreambuf_iterator >, std::ios_base&, int, char) +5df18 8 232 225 +5df20 6 232 225 +5df26 2 145 212 +5df28 4 232 225 +5df2c 4 145 212 +5df30 4 232 225 +5df34 6 145 212 +5df3a c 351 218 +5df46 6 237 225 +5df4c 8 58 227 +5df54 2 235 225 +5df56 4 58 227 +5df5a 8 240 225 +5df62 6 242 225 +5df68 2 224 200 +5df6a a 224 200 +5df74 a 57 227 +5df7e 2 255 225 +5df80 2 57 227 +5df82 2 255 225 +5df84 14 256 225 +5df98 2 254 225 +5df9a 2 256 225 +5df9c 2 138 212 +5df9e 4 139 212 +5dfa2 24 260 225 +5dfc6 6 156 238 +5dfcc c 261 225 +5dfd8 4 243 225 +5dfdc 4 242 225 +5dfe0 6 243 225 +5dfe6 c 242 225 +5dff2 a 237 225 +5dffc 14 156 238 +FUNC 5e010 72 0 std::ostreambuf_iterator > std::priv::__do_put_integer >, unsigned long>(std::ostreambuf_iterator >, std::ios_base&, char, unsigned long) +5e010 4 372 225 +5e014 e 372 225 +5e022 2 109 212 +5e024 6 307 225 +5e02a 4 309 225 +5e02e 2 308 225 +5e030 4 309 225 +5e034 e 308 225 +5e042 2 309 225 +5e044 18 381 225 +5e05c 6 382 225 +5e062 4 380 225 +5e066 1c 310 225 +FUNC 5e084 134 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, char, void const*) const +5e084 6 475 225 +5e08a 6 475 225 +5e090 2 145 212 +5e092 4 475 225 +5e096 2 62 229 +5e098 4 145 212 +5e09c 4 475 225 +5e0a0 4 62 229 +5e0a4 6 145 212 +5e0aa c 351 218 +5e0b6 6 477 225 +5e0bc 2 109 212 +5e0be 4 139 212 +5e0c2 8 123 212 +5e0ca 6 124 212 +5e0d0 6 484 225 +5e0d6 c 101 206 +5e0e2 12 506 225 +5e0f4 2 101 206 +5e0f6 a 506 225 +5e100 2 112 212 +5e102 8 514 225 +5e10a 4 488 225 +5e10e 6 488 225 +5e114 e 101 206 +5e122 6 62 229 +5e128 a 200 235 +5e132 a 200 235 +5e13c 2 200 235 +5e13e e 101 206 +5e14c a 200 235 +5e156 2 101 206 +5e158 a 200 235 +5e162 2 200 235 +5e164 6 139 212 +5e16a 8 488 225 +5e172 a 200 235 +5e17c 4 62 229 +5e180 8 101 206 +5e188 4 62 229 +5e18c 8 101 206 +5e194 a 200 235 +5e19e c 62 229 +5e1aa e 477 225 +FUNC 5e1b8 24 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, char, unsigned long) const +5e1b8 4 438 225 +5e1bc 8 438 225 +5e1c4 18 440 225 +FUNC 5e1dc 78 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, char, unsigned long long) const +5e1dc 4 465 225 +5e1e0 4 465 225 +5e1e4 2 310 225 +5e1e6 6 465 225 +5e1ec 2 310 225 +5e1ee 4 465 225 +5e1f2 4 310 225 +5e1f6 4 307 225 +5e1fa 2 109 212 +5e1fc 2 307 225 +5e1fe 4 309 225 +5e202 2 308 225 +5e204 4 309 225 +5e208 e 308 225 +5e216 2 309 225 +5e218 18 381 225 +5e230 6 467 225 +5e236 4 380 225 +5e23a 1a 310 225 +FUNC 5e254 78 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, char, long long) const +5e254 4 459 225 +5e258 4 459 225 +5e25c 2 310 225 +5e25e 6 459 225 +5e264 2 310 225 +5e266 4 459 225 +5e26a 4 310 225 +5e26e 4 307 225 +5e272 2 109 212 +5e274 2 307 225 +5e276 4 309 225 +5e27a 2 308 225 +5e27c 4 309 225 +5e280 e 308 225 +5e28e 2 309 225 +5e290 18 381 225 +5e2a8 6 461 225 +5e2ae 4 380 225 +5e2b2 1a 310 225 +FUNC 5e2cc 74 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, char, long) const +5e2cc 4 432 225 +5e2d0 6 432 225 +5e2d6 2 310 225 +5e2d8 4 432 225 +5e2dc 2 310 225 +5e2de 2 432 225 +5e2e0 2 109 212 +5e2e2 4 310 225 +5e2e6 2 307 225 +5e2e8 4 309 225 +5e2ec 2 308 225 +5e2ee 4 309 225 +5e2f2 e 308 225 +5e300 2 309 225 +5e302 18 381 225 +5e31a 6 434 225 +5e320 4 380 225 +5e324 1c 310 225 +FUNC 5e340 294 0 std::ostreambuf_iterator > std::priv::__copy_float_and_fill > >(char const*, char const*, std::ostreambuf_iterator >, int, int, char, char, char) +5e340 8 42 225 +5e348 4 47 225 +5e34c 8 42 225 +5e354 2 47 225 +5e356 4 42 225 +5e35a 4 47 225 +5e35e 2 51 225 +5e360 4 50 225 +5e364 4 51 225 +5e368 6 53 225 +5e36e 12 57 225 +5e380 c 57 225 +5e38c a 57 225 +5e396 8 61 225 +5e39e 2 480 200 +5e3a0 10 61 225 +5e3b0 2 480 200 +5e3b2 6 62 229 +5e3b8 a 200 235 +5e3c2 c 200 235 +5e3ce 2 200 235 +5e3d0 4 480 200 +5e3d4 6 482 200 +5e3da 4 64 225 +5e3de 4 213 200 +5e3e2 c 482 200 +5e3ee 2e 64 225 +5e41c 2 213 200 +5e41e 4 64 225 +5e422 a 213 200 +5e42c 4 214 200 +5e430 4 62 229 +5e434 6 200 235 +5e43a a 200 235 +5e444 2 200 235 +5e446 8 200 235 +5e44e 8 62 229 +5e456 6 213 200 +5e45c c 218 200 +5e468 c 68 225 +5e474 10 200 235 +5e484 10 62 229 +5e494 c 48 225 +5e4a0 4 62 229 +5e4a4 4 59 225 +5e4a8 2 62 229 +5e4aa 2 62 229 +5e4ac 2 62 229 +5e4ae 6 200 235 +5e4b4 8 200 235 +5e4bc 4 62 229 +5e4c0 2 200 235 +5e4c2 c 62 229 +5e4ce 2 480 200 +5e4d0 8 62 229 +5e4d8 2 480 200 +5e4da 6 62 229 +5e4e0 6 200 235 +5e4e6 a 200 235 +5e4f0 2 200 235 +5e4f2 4 480 200 +5e4f6 10 482 200 +5e506 a 60 225 +5e510 2 61 225 +5e512 2 60 225 +5e514 c 61 225 +5e520 10 200 235 +5e530 12 62 229 +5e542 20 54 225 +5e562 2 480 200 +5e564 14 54 225 +5e578 2 480 200 +5e57a 6 62 229 +5e580 6 200 235 +5e586 a 200 235 +5e590 2 200 235 +5e592 4 480 200 +5e596 10 482 200 +5e5a6 a 200 235 +5e5b0 c 62 229 +5e5bc a 200 235 +5e5c6 e 62 229 +FUNC 5e5d4 7c 0 std::ostreambuf_iterator > std::priv::__put_float > >(std::priv::__basic_iostring&, std::ostreambuf_iterator >, std::ios_base&, char, char, char, unsigned int, std::string const&) +5e5d4 6 96 225 +5e5da 4 65 238 +5e5de 2 96 225 +5e5e0 2 400 237 +5e5e2 4 96 225 +5e5e6 2 400 237 +5e5e8 2 100 225 +5e5ea 8 96 225 +5e5f2 2 100 225 +5e5f4 4 100 225 +5e5f8 8 101 225 +5e600 8 104 225 +5e608 16 105 225 +5e61e 2 138 212 +5e620 4 65 238 +5e624 2 110 225 +5e626 2 139 212 +5e628 2 109 212 +5e62a 2 139 212 +5e62c 1e 110 225 +5e64a 6 111 225 +FUNC 5e650 10c 0 std::ostreambuf_iterator > std::priv::__do_put_float >, long double>(std::ostreambuf_iterator >, std::ios_base&, char, long double) +5e650 8 115 225 +5e658 4 115 225 +5e65c 4 41 213 +5e660 2 120 238 +5e662 6 115 225 +5e668 8 108 213 +5e670 2 115 225 +5e672 4 108 213 +5e676 8 41 213 +5e67e 2 120 238 +5e680 4 41 213 +5e684 6 124 238 +5e68a 4 481 201 +5e68e 4 124 238 +5e692 2 90 238 +5e694 2 101 205 +5e696 2 119 225 +5e698 2 101 205 +5e69a 14 119 225 +5e6ae c 145 212 +5e6ba c 351 218 +5e6c6 6 121 225 +5e6cc 8 56 227 +5e6d4 2 57 227 +5e6d6 2 56 227 +5e6d8 6 57 227 +5e6de 4 58 227 +5e6e2 2 57 227 +5e6e4 8 58 227 +5e6ec 22 124 225 +5e70e 6 156 238 +5e714 4 64 238 +5e718 4 96 238 +5e71c 2 96 238 +5e71e 2 70 213 +5e720 2 97 238 +5e722 2 70 213 +5e724 2 97 238 +5e726 4 161 201 +5e72a 4 161 201 +5e72e a 125 225 +5e738 6 135 222 +5e73e 12 156 238 +5e750 c 121 225 +FUNC 5e75c 28 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, char, long double) const +5e75c 4 451 225 +5e760 8 451 225 +5e768 1c 453 225 +FUNC 5e784 10c 0 std::ostreambuf_iterator > std::priv::__do_put_float >, double>(std::ostreambuf_iterator >, std::ios_base&, char, double) +5e784 8 115 225 +5e78c 4 115 225 +5e790 4 41 213 +5e794 2 120 238 +5e796 6 115 225 +5e79c 8 108 213 +5e7a4 2 115 225 +5e7a6 4 108 213 +5e7aa 8 41 213 +5e7b2 2 120 238 +5e7b4 4 41 213 +5e7b8 6 124 238 +5e7be 4 481 201 +5e7c2 4 124 238 +5e7c6 2 90 238 +5e7c8 2 101 205 +5e7ca 2 119 225 +5e7cc 2 101 205 +5e7ce 14 119 225 +5e7e2 c 145 212 +5e7ee c 351 218 +5e7fa 6 121 225 +5e800 8 56 227 +5e808 2 57 227 +5e80a 2 56 227 +5e80c 6 57 227 +5e812 4 58 227 +5e816 2 57 227 +5e818 8 58 227 +5e820 22 124 225 +5e842 6 156 238 +5e848 4 64 238 +5e84c 4 96 238 +5e850 2 96 238 +5e852 2 70 213 +5e854 2 97 238 +5e856 2 70 213 +5e858 2 97 238 +5e85a 4 161 201 +5e85e 4 161 201 +5e862 a 125 225 +5e86c 6 135 222 +5e872 12 156 238 +5e884 c 121 225 +FUNC 5e890 28 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, char, double) const +5e890 4 444 225 +5e894 8 444 225 +5e89c 1c 446 225 +FUNC 5e8b8 40 0 std::priv::_String_base >::_M_allocate_block(unsigned int) +5e8b8 4 608 236 +5e8bc 2 607 236 +5e8be 2 607 236 +5e8c0 2 608 236 +5e8c2 2 608 236 +5e8c4 4 610 236 +5e8c8 2 67 213 +5e8ca 4 64 213 +5e8ce 4 67 213 +5e8d2 2 64 213 +5e8d4 2 306 201 +5e8d6 6 134 222 +5e8dc 2 613 236 +5e8de 4 611 236 +5e8e2 2 612 236 +5e8e4 4 613 236 +5e8e8 10 600 236 +FUNC 5e8f8 164 0 std::ostreambuf_iterator > std::priv::__put_float > >(std::priv::__basic_iostring&, std::ostreambuf_iterator >, std::ios_base&, wchar_t, wchar_t, wchar_t, unsigned int, std::string const&) +5e8f8 a 74 225 +5e902 a 74 225 +5e90c 2 145 212 +5e90e 4 74 225 +5e912 4 145 212 +5e916 4 74 225 +5e91a 8 145 212 +5e922 c 351 218 +5e92e 6 78 225 +5e934 c 108 213 +5e940 8 120 238 +5e948 a 41 213 +5e952 2 120 238 +5e954 4 41 213 +5e958 6 124 238 +5e95e 4 481 201 +5e962 4 124 238 +5e966 4 101 205 +5e96a 4 81 225 +5e96e 2 101 205 +5e970 e 81 225 +5e97e 8 83 225 +5e986 16 206 206 +5e99c 1a 84 225 +5e9b6 4 138 212 +5e9ba 6 206 206 +5e9c0 4 65 238 +5e9c4 2 138 212 +5e9c6 2 139 212 +5e9c8 2 206 206 +5e9ca 4 139 212 +5e9ce 4 89 238 +5e9d2 4 109 212 +5e9d6 e 206 206 +5e9e4 2 89 225 +5e9e6 4 400 237 +5e9ea 2 89 225 +5e9ec 4 89 225 +5e9f0 2 89 225 +5e9f2 2 89 225 +5e9f4 1c 89 225 +5ea10 4 64 238 +5ea14 4 96 238 +5ea18 2 96 238 +5ea1a 4 70 213 +5ea1e 2 97 238 +5ea20 4 70 213 +5ea24 2 97 238 +5ea26 4 323 201 +5ea2a 4 161 201 +5ea2e 4 161 201 +5ea32 c 90 225 +5ea3e 6 135 222 +5ea44 a 78 225 +5ea4e e 89 225 +FUNC 5ea5c 10c 0 std::ostreambuf_iterator > std::priv::__do_put_float >, long double>(std::ostreambuf_iterator >, std::ios_base&, wchar_t, long double) +5ea5c 8 115 225 +5ea64 4 115 225 +5ea68 4 41 213 +5ea6c 2 120 238 +5ea6e 6 115 225 +5ea74 8 108 213 +5ea7c 2 115 225 +5ea7e 4 108 213 +5ea82 8 41 213 +5ea8a 2 120 238 +5ea8c 4 41 213 +5ea90 6 124 238 +5ea96 4 481 201 +5ea9a 4 124 238 +5ea9e 2 90 238 +5eaa0 2 101 205 +5eaa2 2 119 225 +5eaa4 2 101 205 +5eaa6 14 119 225 +5eaba c 145 212 +5eac6 c 351 218 +5ead2 6 121 225 +5ead8 8 85 227 +5eae0 2 86 227 +5eae2 2 85 227 +5eae4 6 86 227 +5eaea 4 87 227 +5eaee 2 86 227 +5eaf0 8 87 227 +5eaf8 20 124 225 +5eb18 6 156 238 +5eb1e 4 64 238 +5eb22 4 96 238 +5eb26 2 96 238 +5eb28 2 70 213 +5eb2a 2 97 238 +5eb2c 2 70 213 +5eb2e 2 97 238 +5eb30 4 161 201 +5eb34 4 161 201 +5eb38 a 125 225 +5eb42 6 135 222 +5eb48 12 156 238 +5eb5a e 121 225 +FUNC 5eb68 26 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, wchar_t, long double) const +5eb68 4 451 225 +5eb6c 8 451 225 +5eb74 1a 453 225 +FUNC 5eb90 10c 0 std::ostreambuf_iterator > std::priv::__do_put_float >, double>(std::ostreambuf_iterator >, std::ios_base&, wchar_t, double) +5eb90 8 115 225 +5eb98 4 115 225 +5eb9c 4 41 213 +5eba0 2 120 238 +5eba2 6 115 225 +5eba8 8 108 213 +5ebb0 2 115 225 +5ebb2 4 108 213 +5ebb6 8 41 213 +5ebbe 2 120 238 +5ebc0 4 41 213 +5ebc4 6 124 238 +5ebca 4 481 201 +5ebce 4 124 238 +5ebd2 2 90 238 +5ebd4 2 101 205 +5ebd6 2 119 225 +5ebd8 2 101 205 +5ebda 14 119 225 +5ebee c 145 212 +5ebfa c 351 218 +5ec06 6 121 225 +5ec0c 8 85 227 +5ec14 2 86 227 +5ec16 2 85 227 +5ec18 6 86 227 +5ec1e 4 87 227 +5ec22 2 86 227 +5ec24 8 87 227 +5ec2c 20 124 225 +5ec4c 6 156 238 +5ec52 4 64 238 +5ec56 4 96 238 +5ec5a 2 96 238 +5ec5c 2 70 213 +5ec5e 2 97 238 +5ec60 2 70 213 +5ec62 2 97 238 +5ec64 4 161 201 +5ec68 4 161 201 +5ec6c a 125 225 +5ec76 6 135 222 +5ec7c 12 156 238 +5ec8e e 121 225 +FUNC 5ec9c 26 0 std::num_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, wchar_t, double) const +5ec9c 4 444 225 +5eca0 8 444 225 +5eca8 1a 446 225 +FUNC 5ecc4 15c 0 std::time_put > >::do_put(std::ostreambuf_iterator >, std::ios_base&, wchar_t, tm const*, char, char) const +5ecc4 a 425 241 +5ecce 6 425 241 +5ecd4 6 145 212 +5ecda 8 425 241 +5ece2 a 145 212 +5ecec c 351 218 +5ecf8 6 428 241 +5ecfe c 108 213 +5ed0a 8 120 238 +5ed12 a 41 213 +5ed1c 4 120 238 +5ed20 2 430 241 +5ed22 4 41 213 +5ed26 6 124 238 +5ed2c 4 481 201 +5ed30 4 124 238 +5ed34 6 101 205 +5ed3a 4 430 241 +5ed3e 2 101 205 +5ed40 14 430 241 +5ed54 e 90 238 +5ed62 4 66 238 +5ed66 c 90 238 +5ed72 2 213 200 +5ed74 4 90 238 +5ed78 2 213 200 +5ed7a 2 213 200 +5ed7c 10 90 238 +5ed8c 4 213 200 +5ed90 8 62 229 +5ed98 4 213 200 +5ed9c 4 214 200 +5eda0 4 62 229 +5eda4 6 200 235 +5edaa 8 200 235 +5edb2 2 200 235 +5edb4 c 200 235 +5edc0 4 213 200 +5edc4 4 218 200 +5edc8 2 96 238 +5edca c 218 200 +5edd6 2 96 238 +5edd8 2 96 238 +5edda 4 70 213 +5edde 4 97 238 +5ede2 4 70 213 +5ede6 2 97 238 +5ede8 2 135 222 +5edea 4 323 201 +5edee 4 161 201 +5edf2 4 161 201 +5edf6 c 432 241 +5ee02 6 135 222 +5ee08 a 428 241 +5ee12 e 431 241 +FUNC 5ee20 11c 0 std::basic_string, std::priv::__iostring_allocator >& std::basic_string, std::priv::__iostring_allocator >::_M_appendT(wchar_t const*, wchar_t const*, std::forward_iterator_tag const&) +5ee20 2 470 237 +5ee22 4 468 237 +5ee26 4 468 237 +5ee2a 2 470 237 +5ee2c 2 355 216 +5ee2e 4 64 238 +5ee32 2 355 216 +5ee34 4 74 238 +5ee38 8 74 238 +5ee40 4 472 237 +5ee44 2 400 237 +5ee46 c 304 237 +5ee52 2 400 237 +5ee54 a 304 237 +5ee5e c 306 237 +5ee6a 4 307 237 +5ee6e 4 307 237 +5ee72 10 134 222 +5ee82 2 764 186 +5ee84 2 482 237 +5ee86 2 107 243 +5ee88 2 267 246 +5ee8a 2 107 243 +5ee8c 2 483 237 +5ee8e 8 106 243 +5ee96 4 484 237 +5ee9a 6 101 205 +5eea0 2 485 237 +5eea2 6 489 237 +5eea8 4 307 237 +5eeac c 64 213 +5eeb8 8 67 213 +5eec0 2 107 243 +5eec2 4 107 243 +5eec6 2 107 243 +5eec8 c 106 243 +5eed4 2 107 243 +5eed6 8 106 243 +5eede 4 64 238 +5eee2 2 101 205 +5eee4 2 96 238 +5eee6 4 107 243 +5eeea 2 101 205 +5eeec 2 96 238 +5eeee 2 96 238 +5eef0 6 97 238 +5eef6 4 70 213 +5eefa 2 97 238 +5eefc 2 135 222 +5eefe 4 323 201 +5ef02 4 161 201 +5ef06 4 161 201 +5ef0a 4 479 237 +5ef0e 2 164 238 +5ef10 2 160 238 +5ef12 2 489 237 +5ef14 4 165 238 +5ef18 4 489 237 +5ef1c 6 135 222 +5ef22 c 74 238 +5ef2e e 600 236 +FUNC 5ef3c 950 0 std::ostreambuf_iterator > std::priv::__money_do_put >, std::basic_string, std::allocator >, std::priv::__basic_iostring >(std::ostreambuf_iterator >, bool, std::ios_base&, wchar_t, std::priv::__basic_iostring const&, bool, std::basic_string, std::allocator >*) +5ef3c a 316 220 +5ef46 2 316 220 +5ef48 6 145 212 +5ef4e 4 316 220 +5ef52 6 145 212 +5ef58 6 316 220 +5ef5e 4 145 212 +5ef62 6 316 220 +5ef68 8 145 212 +5ef70 2a 351 218 +5ef9a 2 206 206 +5ef9c 2 351 218 +5ef9e 2c 206 206 +5efca 2 336 220 +5efcc 2 206 206 +5efce 6 336 220 +5efd4 a 173 221 +5efde 4 174 221 +5efe2 2 173 221 +5efe4 6 174 221 +5efea a 175 221 +5eff4 2 174 221 +5eff6 a 175 221 +5f000 a 179 221 +5f00a 6 176 221 +5f010 2 179 221 +5f012 6 176 221 +5f018 4 65 238 +5f01c 4 89 238 +5f020 6 354 220 +5f026 12 360 220 +5f038 2 361 220 +5f03a 2 362 220 +5f03c 8 368 220 +5f044 2 368 220 +5f046 8 217 221 +5f04e 6 368 220 +5f054 8 217 221 +5f05c 6 385 220 +5f062 8 387 220 +5f06a 8 184 206 +5f072 4 387 220 +5f076 4 184 206 +5f07a 6 387 220 +5f080 4 387 220 +5f084 4 481 201 +5f088 6 108 213 +5f08e 2 481 201 +5f090 2 108 213 +5f092 8 120 238 +5f09a 4 108 213 +5f09e a 41 213 +5f0a8 a 120 238 +5f0b2 4 41 213 +5f0b6 6 124 238 +5f0bc 4 481 201 +5f0c0 4 124 238 +5f0c4 2 397 220 +5f0c6 2 101 205 +5f0c8 4 90 238 +5f0cc 4 397 220 +5f0d0 2 101 205 +5f0d2 4 397 220 +5f0d6 2 579 237 +5f0d8 4 66 238 +5f0dc 4 579 237 +5f0e0 a 579 237 +5f0ea 4 764 186 +5f0ee 2 579 237 +5f0f0 4 267 246 +5f0f4 2 581 237 +5f0f6 2 582 237 +5f0f8 4 579 237 +5f0fc 4 579 237 +5f100 18 587 237 +5f118 2 400 237 +5f11a 20 399 220 +5f13a 4 66 238 +5f13e 4 90 238 +5f142 2 400 237 +5f144 8 413 220 +5f14c 4 400 237 +5f150 4 136 212 +5f154 2 400 237 +5f156 2 136 212 +5f158 4 416 220 +5f15c 4 418 220 +5f160 2 419 220 +5f162 c 421 220 +5f16e 2 422 220 +5f170 8 400 237 +5f178 4 423 220 +5f17c 8 427 220 +5f184 2 427 220 +5f186 4 181 221 +5f18a 6 427 220 +5f190 28 181 221 +5f1b8 2 427 220 +5f1ba a 437 220 +5f1c4 2 439 220 +5f1c6 6 444 220 +5f1cc 4 446 220 +5f1d0 4 444 220 +5f1d4 a 446 220 +5f1de a 212 221 +5f1e8 4 213 221 +5f1ec 2 212 221 +5f1ee 6 213 221 +5f1f4 a 214 221 +5f1fe 2 213 221 +5f200 a 214 221 +5f20a a 218 221 +5f214 6 215 221 +5f21a 2 218 221 +5f21c 6 215 221 +5f222 4 65 238 +5f226 4 89 238 +5f22a 6 354 220 +5f230 c 355 220 +5f23c 2 368 220 +5f23e 8 178 221 +5f246 6 368 220 +5f24c a 178 221 +5f256 a 389 220 +5f260 a 390 220 +5f26a 4 64 238 +5f26e 4 96 238 +5f272 2 96 238 +5f274 4 97 238 +5f278 4 323 201 +5f27c 6 161 201 +5f282 4 161 201 +5f286 4 64 238 +5f28a 4 96 238 +5f28e 2 96 238 +5f290 4 97 238 +5f294 4 323 201 +5f298 6 161 201 +5f29e 4 161 201 +5f2a2 6 156 238 +5f2a8 6 498 220 +5f2ae c 499 220 +5f2ba 2 427 220 +5f2bc 4 220 221 +5f2c0 6 427 220 +5f2c6 28 219 221 +5f2ee 2 427 220 +5f2f0 a 437 220 +5f2fa a 437 220 +5f304 6 444 220 +5f30a 4 446 220 +5f30e 4 448 220 +5f312 8 446 220 +5f31a 2 448 220 +5f31c 8 448 220 +5f324 2 480 220 +5f326 2 483 220 +5f328 2 477 220 +5f32a 2 483 220 +5f32c 8 480 220 +5f334 6 477 220 +5f33a 16 454 220 +5f350 a 216 221 +5f35a a 177 221 +5f364 4 462 220 +5f368 18 463 220 +5f380 c 483 220 +5f38c 2 452 220 +5f38e 4 452 220 +5f392 4 400 237 +5f396 2 65 238 +5f398 2 400 237 +5f39a 18 492 220 +5f3b2 2 493 220 +5f3b4 4 492 220 +5f3b8 2 213 200 +5f3ba 6 492 220 +5f3c0 2 213 200 +5f3c2 4 492 220 +5f3c6 2 213 200 +5f3c8 12 492 220 +5f3da 6 213 200 +5f3e0 8 62 229 +5f3e8 6 213 200 +5f3ee 4 214 200 +5f3f2 4 62 229 +5f3f6 6 200 235 +5f3fc 8 200 235 +5f404 2 200 235 +5f406 c 200 235 +5f412 6 62 229 +5f418 4 62 229 +5f41c a 200 235 +5f426 8 200 235 +5f42e 6 62 229 +5f434 4 62 229 +5f438 20 458 220 +5f458 4 480 200 +5f45c c 458 220 +5f468 4 480 200 +5f46c 2 62 229 +5f46e a 200 235 +5f478 a 200 235 +5f482 8 62 229 +5f48a 6 480 200 +5f490 10 482 200 +5f4a0 e 459 220 +5f4ae 8 470 220 +5f4b6 a 473 220 +5f4c0 4 62 229 +5f4c4 4 62 229 +5f4c8 6 62 229 +5f4ce a 200 235 +5f4d8 8 200 235 +5f4e0 6 62 229 +5f4e6 2 200 235 +5f4e8 2 62 229 +5f4ea 2 200 235 +5f4ec 4 62 229 +5f4f0 6 200 235 +5f4f6 8 200 235 +5f4fe 6 62 229 +5f504 4 477 220 +5f508 4 62 229 +5f50c a 477 220 +5f516 2 480 200 +5f518 4 477 220 +5f51c 2 480 200 +5f51e 2 62 229 +5f520 a 200 235 +5f52a 8 200 235 +5f532 8 62 229 +5f53a 6 480 200 +5f540 4 482 200 +5f544 4 478 220 +5f548 c 482 200 +5f554 a 477 220 +5f55e 6 478 220 +5f564 4 477 220 +5f568 a 478 220 +5f572 e 478 220 +5f580 4 65 238 +5f584 8 466 220 +5f58c 4 62 229 +5f590 2 467 220 +5f592 2 62 229 +5f594 4 62 229 +5f598 6 200 235 +5f59e 8 200 235 +5f5a6 4 200 235 +5f5aa 6 62 229 +5f5b0 6 62 229 +5f5b6 28 220 221 +5f5de 4 427 220 +5f5e2 28 180 221 +5f60a 4 427 220 +5f60e 10 218 200 +5f61e a 493 220 +5f628 6 494 220 +5f62e 8 494 220 +5f636 4 64 238 +5f63a 2 96 238 +5f63c 6 498 220 +5f642 2 96 238 +5f644 4 498 220 +5f648 4 96 238 +5f64c 6 96 238 +5f652 4 70 213 +5f656 4 97 238 +5f65a 6 70 213 +5f660 2 97 238 +5f662 2 135 222 +5f664 4 323 201 +5f668 6 161 201 +5f66e 6 161 201 +5f674 1a 200 235 +5f68e c 135 222 +5f69a 16 480 220 +5f6b0 4 480 220 +5f6b4 2 62 229 +5f6b6 8 480 220 +5f6be 2 62 229 +5f6c0 2 200 235 +5f6c2 2 62 229 +5f6c4 8 200 235 +5f6cc 8 200 235 +5f6d4 6 62 229 +5f6da 4 62 229 +5f6de 14 483 220 +5f6f2 4 483 220 +5f6f6 8 494 220 +5f6fe 4 480 200 +5f702 c 494 220 +5f70e 2 480 200 +5f710 2 62 229 +5f712 8 200 235 +5f71a a 200 235 +5f724 8 62 229 +5f72c 6 480 200 +5f732 14 482 200 +5f746 c 496 220 +5f752 e 200 235 +5f760 18 471 220 +5f778 8 448 220 +5f780 4 480 200 +5f784 c 448 220 +5f790 4 480 200 +5f794 2 62 229 +5f796 8 200 235 +5f79e a 200 235 +5f7a8 8 62 229 +5f7b0 4 480 200 +5f7b4 12 482 200 +5f7c6 c 450 220 +5f7d2 e 200 235 +5f7e0 6 135 222 +5f7e6 c 200 235 +5f7f2 4 62 229 +5f7f6 34 200 235 +5f82a 6 156 238 +5f830 c 498 220 +5f83c 10 156 238 +5f84c 2 66 238 +5f84e 6 803 237 +5f854 6 249 246 +5f85a 2 806 237 +5f85c 4 249 246 +5f860 14 806 237 +5f874 18 498 220 +FUNC 5f88c 154 0 std::money_put > >::do_put(std::ostreambuf_iterator >, bool, std::ios_base&, wchar_t, long double) const +5f88c a 505 220 +5f896 2 108 213 +5f898 4 505 220 +5f89c 2 108 213 +5f89e 8 505 220 +5f8a6 8 120 238 +5f8ae 8 108 213 +5f8b6 6 41 213 +5f8bc 2 120 238 +5f8be 4 41 213 +5f8c2 2 120 238 +5f8c4 4 41 213 +5f8c8 6 124 238 +5f8ce 4 481 201 +5f8d2 4 124 238 +5f8d6 6 101 205 +5f8dc 8 108 213 +5f8e4 4 101 205 +5f8e8 4 108 213 +5f8ec 8 41 213 +5f8f4 2 120 238 +5f8f6 4 41 213 +5f8fa 6 124 238 +5f900 4 481 201 +5f904 4 124 238 +5f908 2 90 238 +5f90a 6 133 225 +5f910 2 101 205 +5f912 2 133 225 +5f914 2 101 205 +5f916 8 133 225 +5f91e c 145 212 +5f92a c 351 218 +5f936 6 135 225 +5f93c e 136 225 +5f94a 4 64 238 +5f94e 4 96 238 +5f952 2 96 238 +5f954 2 70 213 +5f956 2 97 238 +5f958 4 70 213 +5f95c 2 97 238 +5f95e 4 161 201 +5f962 4 161 201 +5f966 20 510 220 +5f986 4 64 238 +5f98a 4 96 238 +5f98e 2 96 238 +5f990 4 70 213 +5f994 2 97 238 +5f996 4 70 213 +5f99a 2 97 238 +5f99c 4 323 201 +5f9a0 4 161 201 +5f9a4 4 161 201 +5f9a8 e 511 220 +5f9b6 c 135 222 +5f9c2 a 510 220 +5f9cc 6 135 225 +5f9d2 e 156 238 +FUNC 5f9e0 948 0 std::ostreambuf_iterator > std::priv::__money_do_put >, std::basic_string, std::allocator >, std::basic_string, std::allocator > >(std::ostreambuf_iterator >, bool, std::ios_base&, wchar_t, std::basic_string, std::allocator > const&, bool, std::basic_string, std::allocator >*) +5f9e0 a 316 220 +5f9ea 2 316 220 +5f9ec 6 145 212 +5f9f2 4 316 220 +5f9f6 6 145 212 +5f9fc 6 316 220 +5fa02 4 145 212 +5fa06 6 316 220 +5fa0c 8 145 212 +5fa14 2a 351 218 +5fa3e 2 206 206 +5fa40 2 351 218 +5fa42 2c 206 206 +5fa6e 2 336 220 +5fa70 2 206 206 +5fa72 6 336 220 +5fa78 a 173 221 +5fa82 4 174 221 +5fa86 2 173 221 +5fa88 6 174 221 +5fa8e a 175 221 +5fa98 2 174 221 +5fa9a a 175 221 +5faa4 a 179 221 +5faae 6 176 221 +5fab4 2 179 221 +5fab6 6 176 221 +5fabc 2 65 238 +5fabe 4 89 238 +5fac2 6 354 220 +5fac8 e 360 220 +5fad6 2 361 220 +5fad8 2 362 220 +5fada 8 368 220 +5fae2 2 368 220 +5fae4 8 217 221 +5faec 6 368 220 +5faf2 8 217 221 +5fafa 6 385 220 +5fb00 8 387 220 +5fb08 8 184 206 +5fb10 4 387 220 +5fb14 4 184 206 +5fb18 6 387 220 +5fb1e 4 387 220 +5fb22 4 481 201 +5fb26 6 108 213 +5fb2c 2 481 201 +5fb2e 2 108 213 +5fb30 8 120 238 +5fb38 4 108 213 +5fb3c a 41 213 +5fb46 a 120 238 +5fb50 4 41 213 +5fb54 6 124 238 +5fb5a 4 481 201 +5fb5e 4 124 238 +5fb62 2 397 220 +5fb64 2 101 205 +5fb66 4 90 238 +5fb6a 4 397 220 +5fb6e 2 101 205 +5fb70 4 397 220 +5fb74 2 579 237 +5fb76 4 66 238 +5fb7a 4 579 237 +5fb7e a 579 237 +5fb88 4 764 186 +5fb8c 2 579 237 +5fb8e 4 267 246 +5fb92 2 581 237 +5fb94 2 582 237 +5fb96 4 579 237 +5fb9a 4 579 237 +5fb9e 18 587 237 +5fbb6 2 400 237 +5fbb8 20 399 220 +5fbd8 4 66 238 +5fbdc 4 90 238 +5fbe0 2 400 237 +5fbe2 8 413 220 +5fbea 4 400 237 +5fbee 4 136 212 +5fbf2 2 400 237 +5fbf4 2 136 212 +5fbf6 4 416 220 +5fbfa 4 418 220 +5fbfe 2 419 220 +5fc00 c 421 220 +5fc0c 2 422 220 +5fc0e 8 400 237 +5fc16 4 423 220 +5fc1a 8 427 220 +5fc22 2 427 220 +5fc24 4 181 221 +5fc28 6 427 220 +5fc2e 28 181 221 +5fc56 2 427 220 +5fc58 a 437 220 +5fc62 2 439 220 +5fc64 6 444 220 +5fc6a 4 446 220 +5fc6e 4 444 220 +5fc72 a 446 220 +5fc7c a 212 221 +5fc86 4 213 221 +5fc8a 2 212 221 +5fc8c 6 213 221 +5fc92 a 214 221 +5fc9c 2 213 221 +5fc9e a 214 221 +5fca8 a 218 221 +5fcb2 6 215 221 +5fcb8 2 218 221 +5fcba 6 215 221 +5fcc0 2 65 238 +5fcc2 4 89 238 +5fcc6 6 354 220 +5fccc c 355 220 +5fcd8 2 368 220 +5fcda 8 178 221 +5fce2 6 368 220 +5fce8 a 178 221 +5fcf2 a 389 220 +5fcfc a 390 220 +5fd06 4 64 238 +5fd0a 4 96 238 +5fd0e 2 96 238 +5fd10 4 97 238 +5fd14 4 323 201 +5fd18 6 161 201 +5fd1e 4 161 201 +5fd22 4 64 238 +5fd26 4 96 238 +5fd2a 2 96 238 +5fd2c 4 97 238 +5fd30 4 323 201 +5fd34 6 161 201 +5fd3a 4 161 201 +5fd3e 6 156 238 +5fd44 6 498 220 +5fd4a c 499 220 +5fd56 2 427 220 +5fd58 4 220 221 +5fd5c 6 427 220 +5fd62 28 219 221 +5fd8a 2 427 220 +5fd8c a 437 220 +5fd96 a 437 220 +5fda0 6 444 220 +5fda6 4 446 220 +5fdaa 4 448 220 +5fdae 8 446 220 +5fdb6 2 448 220 +5fdb8 8 448 220 +5fdc0 2 480 220 +5fdc2 2 483 220 +5fdc4 2 477 220 +5fdc6 2 483 220 +5fdc8 8 480 220 +5fdd0 6 477 220 +5fdd6 16 454 220 +5fdec a 216 221 +5fdf6 a 177 221 +5fe00 4 462 220 +5fe04 18 463 220 +5fe1c c 483 220 +5fe28 2 452 220 +5fe2a 4 452 220 +5fe2e 4 400 237 +5fe32 2 65 238 +5fe34 2 400 237 +5fe36 18 492 220 +5fe4e 2 493 220 +5fe50 4 492 220 +5fe54 2 213 200 +5fe56 6 492 220 +5fe5c 2 213 200 +5fe5e 4 492 220 +5fe62 2 213 200 +5fe64 12 492 220 +5fe76 6 213 200 +5fe7c 8 62 229 +5fe84 6 213 200 +5fe8a 4 214 200 +5fe8e 4 62 229 +5fe92 6 200 235 +5fe98 8 200 235 +5fea0 2 200 235 +5fea2 c 200 235 +5feae 6 62 229 +5feb4 4 62 229 +5feb8 a 200 235 +5fec2 8 200 235 +5feca 6 62 229 +5fed0 4 62 229 +5fed4 20 458 220 +5fef4 4 480 200 +5fef8 c 458 220 +5ff04 4 480 200 +5ff08 2 62 229 +5ff0a a 200 235 +5ff14 a 200 235 +5ff1e 8 62 229 +5ff26 6 480 200 +5ff2c 10 482 200 +5ff3c e 459 220 +5ff4a 8 470 220 +5ff52 a 473 220 +5ff5c 4 62 229 +5ff60 4 62 229 +5ff64 6 62 229 +5ff6a a 200 235 +5ff74 8 200 235 +5ff7c 6 62 229 +5ff82 2 200 235 +5ff84 2 62 229 +5ff86 2 200 235 +5ff88 4 62 229 +5ff8c 6 200 235 +5ff92 8 200 235 +5ff9a 6 62 229 +5ffa0 4 477 220 +5ffa4 4 62 229 +5ffa8 a 477 220 +5ffb2 2 480 200 +5ffb4 4 477 220 +5ffb8 2 480 200 +5ffba 2 62 229 +5ffbc a 200 235 +5ffc6 8 200 235 +5ffce 8 62 229 +5ffd6 6 480 200 +5ffdc 4 482 200 +5ffe0 4 478 220 +5ffe4 c 482 200 +5fff0 a 477 220 +5fffa 6 478 220 +60000 4 477 220 +60004 a 478 220 +6000e e 478 220 +6001c 4 65 238 +60020 8 466 220 +60028 4 62 229 +6002c 2 467 220 +6002e 2 62 229 +60030 4 62 229 +60034 6 200 235 +6003a 8 200 235 +60042 4 200 235 +60046 6 62 229 +6004c 6 62 229 +60052 28 220 221 +6007a 4 427 220 +6007e 28 180 221 +600a6 4 427 220 +600aa 10 218 200 +600ba a 493 220 +600c4 6 494 220 +600ca 8 494 220 +600d2 4 64 238 +600d6 2 96 238 +600d8 6 498 220 +600de 2 96 238 +600e0 4 498 220 +600e4 4 96 238 +600e8 6 96 238 +600ee 4 70 213 +600f2 4 97 238 +600f6 6 70 213 +600fc 2 97 238 +600fe 2 135 222 +60100 4 323 201 +60104 6 161 201 +6010a 6 161 201 +60110 1a 200 235 +6012a c 135 222 +60136 16 480 220 +6014c 4 480 220 +60150 2 62 229 +60152 8 480 220 +6015a 2 62 229 +6015c 2 200 235 +6015e 2 62 229 +60160 8 200 235 +60168 8 200 235 +60170 6 62 229 +60176 4 62 229 +6017a 14 483 220 +6018e 4 483 220 +60192 8 494 220 +6019a 4 480 200 +6019e c 494 220 +601aa 2 480 200 +601ac 2 62 229 +601ae 8 200 235 +601b6 a 200 235 +601c0 8 62 229 +601c8 6 480 200 +601ce 14 482 200 +601e2 c 496 220 +601ee e 200 235 +601fc 18 471 220 +60214 8 448 220 +6021c 4 480 200 +60220 c 448 220 +6022c 4 480 200 +60230 2 62 229 +60232 8 200 235 +6023a a 200 235 +60244 8 62 229 +6024c 4 480 200 +60250 12 482 200 +60262 c 450 220 +6026e e 200 235 +6027c 6 135 222 +60282 c 200 235 +6028e 4 62 229 +60292 34 200 235 +602c6 6 156 238 +602cc c 498 220 +602d8 10 156 238 +602e8 2 66 238 +602ea 6 803 237 +602f0 6 249 246 +602f6 2 806 237 +602f8 4 249 246 +602fc 14 806 237 +60310 18 498 220 +FUNC 60328 30 0 std::money_put > >::do_put(std::ostreambuf_iterator >, bool, std::ios_base&, wchar_t, std::basic_string, std::allocator > const&) const +60328 4 515 220 +6032c 8 515 220 +60334 1e 518 220 +60352 6 519 220 +FUNC 60358 14c 0 std::basic_string, std::allocator >::_M_append(wchar_t const*, wchar_t const*) +60358 2 197 236 +6035a 8 196 236 +60362 2 197 236 +60364 4 198 236 +60368 2 64 238 +6036a 4 198 236 +6036e 2 74 238 +60370 2 198 236 +60372 4 74 238 +60376 8 74 238 +6037e 4 199 236 +60382 2 210 236 +60384 4 86 243 +60388 8 86 243 +60390 4 764 186 +60394 2 86 243 +60396 4 146 205 +6039a 2 86 243 +6039c 6 101 205 +603a2 2 764 186 +603a4 4 212 236 +603a8 2 267 246 +603aa 2 214 236 +603ac 8 218 236 +603b4 2 400 237 +603b6 c 304 237 +603c2 4 400 237 +603c6 c 304 237 +603d2 c 306 237 +603de 4 307 237 +603e2 6 347 201 +603e8 c 134 222 +603f4 14 158 201 +60408 4 86 243 +6040c 4 84 243 +60410 6 86 243 +60416 2 84 243 +60418 4 764 186 +6041c 2 86 243 +6041e 4 146 205 +60422 e 86 243 +60430 4 764 186 +60434 4 86 243 +60438 4 146 205 +6043c 6 86 243 +60442 2 101 205 +60444 2 96 238 +60446 2 101 205 +60448 2 96 238 +6044a 2 96 238 +6044c 4 97 238 +60450 4 323 201 +60454 4 161 201 +60458 4 161 201 +6045c 2 160 238 +6045e 2 164 238 +60460 4 165 238 +60464 4 307 237 +60468 2 356 201 +6046a 6 346 201 +60470 2 347 201 +60472 4 158 201 +60476 e 158 201 +60484 c 74 238 +60490 6 135 222 +60496 e 600 236 +FUNC 604a4 60 0 std::basic_string, std::allocator >::_M_assign(wchar_t const*, wchar_t const*) +604a4 2 242 236 +604a6 4 242 236 +604aa 2 65 238 +604ac 2 400 237 +604ae 2 243 236 +604b0 2 242 236 +604b2 2 400 237 +604b4 2 243 236 +604b6 2 400 237 +604b8 4 244 236 +604bc 4 249 246 +604c0 4 400 237 +604c4 4 250 236 +604c8 2 400 237 +604ca a 250 236 +604d4 4 253 236 +604d8 6 249 246 +604de 2 246 236 +604e0 2 90 238 +604e2 4 246 236 +604e6 4 803 237 +604ea 6 249 246 +604f0 2 806 237 +604f2 4 249 246 +604f6 6 806 237 +604fc 2 253 236 +604fe 4 806 237 +60502 2 253 236 +FUNC 60504 44 0 std::basic_string, std::priv::__iostring_allocator >::_M_compute_next_size(unsigned int) +60504 2 302 237 +60506 4 304 237 +6050a 2 400 237 +6050c 4 304 237 +60510 6 400 237 +60516 6 304 237 +6051c a 306 237 +60526 8 307 237 +6052e 2 310 237 +60530 a 307 237 +6053a e 600 236 +FUNC 60548 360 0 bool std::priv::__read_float >, char>(std::priv::__basic_iostring&, std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ctype const&, std::numpunct const&) +60548 6 368 223 +6054e 6 368 223 +60554 2 58 227 +60556 2 368 223 +60558 8 58 227 +60560 2 56 227 +60562 2 378 223 +60564 2 56 227 +60566 4 378 223 +6056a 4 56 227 +6056e 2 57 227 +60570 2 56 227 +60572 6 57 227 +60578 6 393 223 +6057e 2 57 227 +60580 14 393 223 +60594 a 393 223 +6059e a 396 223 +605a8 1c 397 223 +605c4 2 400 223 +605c6 8 120 215 +605ce 2 403 223 +605d0 2 375 223 +605d2 2 410 223 +605d4 8 120 215 +605dc 4 413 223 +605e0 4 413 223 +605e4 4 410 223 +605e8 2 417 223 +605ea 6 156 238 +605f0 8 423 223 +605f8 6 90 215 +605fe 4 403 223 +60602 4 64 238 +60606 6 74 238 +6060c 6 74 238 +60612 8 535 237 +6061a 6 101 205 +60620 2 90 238 +60622 4 232 246 +60626 2 68 215 +60628 2 539 237 +6062a 2 229 235 +6062c 2 539 237 +6062e 2 229 235 +60630 2 539 237 +60632 4 229 235 +60636 4 229 235 +6063a 2 69 215 +6063c 2 406 223 +6063e 2 69 215 +60640 c 406 223 +6064c 2 92 215 +6064e 6 235 235 +60654 4 223 246 +60658 4 235 235 +6065c 4 191 246 +60660 2 220 246 +60662 2 191 246 +60664 2 93 215 +60666 4 191 246 +6066a 2 95 215 +6066c 2 191 246 +6066e 4 95 215 +60672 a 90 215 +6067c 4 413 223 +60680 8 90 215 +60688 4 413 223 +6068c 2 74 238 +6068e 4 64 238 +60692 4 74 238 +60696 2 74 238 +60698 8 74 238 +606a0 4 535 237 +606a4 4 101 205 +606a8 2 90 238 +606aa 4 232 246 +606ae 2 68 215 +606b0 2 539 237 +606b2 2 229 235 +606b4 2 539 237 +606b6 2 229 235 +606b8 2 539 237 +606ba 4 229 235 +606be 4 229 235 +606c2 4 69 215 +606c6 1a 416 223 +606e0 a 416 223 +606ea e 417 223 +606f8 e 400 223 +60706 8 229 235 +6070e 6 536 237 +60714 4 64 213 +60718 2 536 237 +6071a 6 67 213 +60720 2 64 213 +60722 4 66 238 +60726 6 86 243 +6072c 4 86 243 +60730 4 84 243 +60734 2 86 243 +60736 4 368 223 +6073a 2 84 243 +6073c 4 764 186 +60740 2 86 243 +60742 4 146 205 +60746 4 86 243 +6074a 6 101 205 +60750 4 64 238 +60754 4 96 238 +60758 2 96 238 +6075a 6 97 238 +60760 4 70 213 +60764 2 97 238 +60766 6 161 201 +6076c 4 161 201 +60770 4 175 236 +60774 4 164 238 +60778 2 160 238 +6077a 6 165 238 +60780 8 134 222 +60788 8 229 235 +60790 2 400 237 +60792 4 304 237 +60796 e 306 237 +607a4 6 307 237 +607aa 4 307 237 +607ae 4 64 213 +607b2 6 67 213 +607b8 2 64 213 +607ba 2 86 243 +607bc 4 84 243 +607c0 2 86 243 +607c2 4 368 223 +607c6 2 84 243 +607c8 4 764 186 +607cc 4 146 205 +607d0 4 86 243 +607d4 4 101 205 +607d8 4 64 238 +607dc 4 96 238 +607e0 2 96 238 +607e2 6 97 238 +607e8 4 70 213 +607ec 2 97 238 +607ee 4 161 201 +607f2 4 161 201 +607f6 4 175 236 +607fa 2 164 238 +607fc 2 160 238 +607fe 6 165 238 +60804 4 307 237 +60808 12 134 222 +6081a 8 74 238 +60822 2 92 215 +60824 6 235 235 +6082a 4 223 246 +6082e 2 235 235 +60830 4 191 246 +60834 2 220 246 +60836 4 191 246 +6083a 2 93 215 +6083c 4 191 246 +60840 2 95 215 +60842 2 191 246 +60844 4 95 215 +60848 8 235 235 +60850 6 135 222 +60856 2 92 215 +60858 6 235 235 +6085e 4 223 246 +60862 2 235 235 +60864 4 191 246 +60868 2 220 246 +6086a 4 191 246 +6086e 2 93 215 +60870 4 191 246 +60874 2 95 215 +60876 2 191 246 +60878 4 95 215 +6087c 6 135 222 +60882 10 235 235 +60892 8 600 236 +6089a e 156 238 +FUNC 608a8 100 0 std::istreambuf_iterator > std::priv::__do_get_float >, long double, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, long double&, char*) +608a8 2 145 212 +608aa 8 427 223 +608b2 4 427 223 +608b6 4 145 212 +608ba 6 427 223 +608c0 6 145 212 +608c6 18 351 218 +608de 4 41 213 +608e2 2 120 238 +608e4 6 108 213 +608ea 2 351 218 +608ec 6 108 213 +608f2 8 41 213 +608fa 2 120 238 +608fc 4 41 213 +60900 6 124 238 +60906 4 481 201 +6090a 4 124 238 +6090e 2 90 238 +60910 2 101 205 +60912 4 434 223 +60916 2 101 205 +60918 c 434 223 +60924 4 435 223 +60928 6 440 223 +6092e 8 112 215 +60936 2 442 223 +60938 c 443 223 +60944 4 64 238 +60948 4 444 223 +6094c 2 96 238 +6094e 4 444 223 +60952 2 96 238 +60954 2 96 238 +60956 2 70 213 +60958 2 97 238 +6095a 2 70 213 +6095c 2 97 238 +6095e 2 135 222 +60960 4 161 201 +60964 4 161 201 +60968 6 444 223 +6096e a 445 223 +60978 8 436 223 +60980 8 437 223 +60988 6 135 222 +6098e a 444 223 +60998 10 156 238 +FUNC 609a8 26 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, long double&) const +609a8 4 579 223 +609ac 8 579 223 +609b4 1a 582 223 +FUNC 609d0 100 0 std::istreambuf_iterator > std::priv::__do_get_float >, double, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, double&, char*) +609d0 2 145 212 +609d2 8 427 223 +609da 4 427 223 +609de 4 145 212 +609e2 6 427 223 +609e8 6 145 212 +609ee 18 351 218 +60a06 4 41 213 +60a0a 2 120 238 +60a0c 6 108 213 +60a12 2 351 218 +60a14 6 108 213 +60a1a 8 41 213 +60a22 2 120 238 +60a24 4 41 213 +60a28 6 124 238 +60a2e 4 481 201 +60a32 4 124 238 +60a36 2 90 238 +60a38 2 101 205 +60a3a 4 434 223 +60a3e 2 101 205 +60a40 c 434 223 +60a4c 4 435 223 +60a50 6 440 223 +60a56 8 112 215 +60a5e 2 442 223 +60a60 c 443 223 +60a6c 4 64 238 +60a70 4 444 223 +60a74 2 96 238 +60a76 4 444 223 +60a7a 2 96 238 +60a7c 2 96 238 +60a7e 2 70 213 +60a80 2 97 238 +60a82 2 70 213 +60a84 2 97 238 +60a86 2 135 222 +60a88 4 161 201 +60a8c 4 161 201 +60a90 6 444 223 +60a96 a 445 223 +60aa0 8 436 223 +60aa8 8 437 223 +60ab0 6 135 222 +60ab6 a 444 223 +60ac0 10 156 238 +FUNC 60ad0 26 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, double&) const +60ad0 4 571 223 +60ad4 8 571 223 +60adc 1a 574 223 +FUNC 60af8 100 0 std::istreambuf_iterator > std::priv::__do_get_float >, float, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, float&, char*) +60af8 2 145 212 +60afa 8 427 223 +60b02 4 427 223 +60b06 4 145 212 +60b0a 6 427 223 +60b10 6 145 212 +60b16 18 351 218 +60b2e 4 41 213 +60b32 2 120 238 +60b34 6 108 213 +60b3a 2 351 218 +60b3c 6 108 213 +60b42 8 41 213 +60b4a 2 120 238 +60b4c 4 41 213 +60b50 6 124 238 +60b56 4 481 201 +60b5a 4 124 238 +60b5e 2 90 238 +60b60 2 101 205 +60b62 4 434 223 +60b66 2 101 205 +60b68 c 434 223 +60b74 4 435 223 +60b78 6 440 223 +60b7e 8 112 215 +60b86 2 442 223 +60b88 c 443 223 +60b94 4 64 238 +60b98 4 444 223 +60b9c 2 96 238 +60b9e 4 444 223 +60ba2 2 96 238 +60ba4 2 96 238 +60ba6 2 70 213 +60ba8 2 97 238 +60baa 2 70 213 +60bac 2 97 238 +60bae 2 135 222 +60bb0 4 161 201 +60bb4 4 161 201 +60bb8 6 444 223 +60bbe a 445 223 +60bc8 8 436 223 +60bd0 8 437 223 +60bd8 6 135 222 +60bde a 444 223 +60be8 10 156 238 +FUNC 60bf8 26 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, float&) const +60bf8 4 564 223 +60bfc 8 564 223 +60c04 1a 567 223 +FUNC 60c20 398 0 bool std::priv::__read_float >, wchar_t>(std::priv::__basic_iostring&, std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ctype const&, std::numpunct const&) +60c20 6 368 223 +60c26 6 368 223 +60c2c 2 87 227 +60c2e 4 368 223 +60c32 8 87 227 +60c3a 2 85 227 +60c3c 2 378 223 +60c3e 2 85 227 +60c40 4 378 223 +60c44 4 85 227 +60c48 2 86 227 +60c4a 2 85 227 +60c4c 6 86 227 +60c52 2 390 223 +60c54 2 86 227 +60c56 12 390 223 +60c68 1c 393 223 +60c84 a 393 223 +60c8e 4 396 223 +60c92 4 397 223 +60c96 6 396 223 +60c9c 18 397 223 +60cb4 2 400 223 +60cb6 8 120 215 +60cbe 2 403 223 +60cc0 2 375 223 +60cc2 6 410 223 +60cc8 8 120 215 +60cd0 4 413 223 +60cd4 4 413 223 +60cd8 4 410 223 +60cdc 2 417 223 +60cde 6 156 238 +60ce4 8 423 223 +60cec 8 90 215 +60cf4 4 403 223 +60cf8 4 64 238 +60cfc 6 74 238 +60d02 6 74 238 +60d08 a 535 237 +60d12 6 101 205 +60d18 2 90 238 +60d1a 4 232 246 +60d1e 2 68 215 +60d20 2 539 237 +60d22 2 229 235 +60d24 2 539 237 +60d26 2 229 235 +60d28 2 539 237 +60d2a 4 229 235 +60d2e 4 229 235 +60d32 2 406 223 +60d34 2 69 215 +60d36 2 406 223 +60d38 2 69 215 +60d3a c 406 223 +60d46 2 92 215 +60d48 6 235 235 +60d4e 4 764 186 +60d52 4 235 235 +60d56 4 191 246 +60d5a 2 93 215 +60d5c a 191 246 +60d66 6 95 215 +60d6c a 90 215 +60d76 6 413 223 +60d7c 8 90 215 +60d84 6 413 223 +60d8a 4 74 238 +60d8e 4 64 238 +60d92 6 74 238 +60d98 2 74 238 +60d9a 8 74 238 +60da2 4 535 237 +60da6 6 101 205 +60dac 2 90 238 +60dae 4 232 246 +60db2 2 68 215 +60db4 2 539 237 +60db6 2 229 235 +60db8 2 539 237 +60dba 2 229 235 +60dbc 2 539 237 +60dbe 4 229 235 +60dc2 4 229 235 +60dc6 4 69 215 +60dca 1c 416 223 +60de6 a 416 223 +60df0 10 417 223 +60e00 c 400 223 +60e0c 8 229 235 +60e14 6 536 237 +60e1a 4 64 213 +60e1e 2 536 237 +60e20 6 67 213 +60e26 2 64 213 +60e28 4 66 238 +60e2c 6 86 243 +60e32 4 86 243 +60e36 4 84 243 +60e3a 2 86 243 +60e3c 4 368 223 +60e40 2 84 243 +60e42 4 764 186 +60e46 2 86 243 +60e48 4 146 205 +60e4c 4 86 243 +60e50 6 101 205 +60e56 4 64 238 +60e5a 4 96 238 +60e5e 2 96 238 +60e60 6 97 238 +60e66 4 70 213 +60e6a 2 97 238 +60e6c 6 161 201 +60e72 4 161 201 +60e76 4 175 236 +60e7a 4 164 238 +60e7e 2 160 238 +60e80 6 165 238 +60e86 8 134 222 +60e8e 8 229 235 +60e96 4 400 237 +60e9a 6 304 237 +60ea0 10 306 237 +60eb0 6 307 237 +60eb6 4 307 237 +60eba 4 64 213 +60ebe 6 67 213 +60ec4 2 64 213 +60ec6 4 86 243 +60eca 4 84 243 +60ece 2 86 243 +60ed0 4 368 223 +60ed4 2 84 243 +60ed6 4 764 186 +60eda 4 146 205 +60ede 4 86 243 +60ee2 6 101 205 +60ee8 4 64 238 +60eec 4 96 238 +60ef0 2 96 238 +60ef2 6 97 238 +60ef8 4 70 213 +60efc 2 97 238 +60efe 4 161 201 +60f02 4 161 201 +60f06 4 175 236 +60f0a 4 164 238 +60f0e 2 160 238 +60f10 6 165 238 +60f16 4 307 237 +60f1a 14 134 222 +60f2e 8 74 238 +60f36 2 92 215 +60f38 6 235 235 +60f3e 4 764 186 +60f42 2 235 235 +60f44 4 191 246 +60f48 2 93 215 +60f4a a 191 246 +60f54 6 95 215 +60f5a 8 235 235 +60f62 6 135 222 +60f68 2 92 215 +60f6a 6 235 235 +60f70 4 764 186 +60f74 2 235 235 +60f76 4 191 246 +60f7a 2 93 215 +60f7c 8 191 246 +60f84 6 95 215 +60f8a 6 135 222 +60f90 10 235 235 +60fa0 8 600 236 +60fa8 10 156 238 +FUNC 60fb8 100 0 std::istreambuf_iterator > std::priv::__do_get_float >, long double, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, long double&, wchar_t*) +60fb8 2 145 212 +60fba 8 427 223 +60fc2 4 427 223 +60fc6 4 145 212 +60fca 6 427 223 +60fd0 6 145 212 +60fd6 18 351 218 +60fee 4 41 213 +60ff2 2 120 238 +60ff4 6 108 213 +60ffa 2 351 218 +60ffc 6 108 213 +61002 8 41 213 +6100a 2 120 238 +6100c 4 41 213 +61010 6 124 238 +61016 4 481 201 +6101a 4 124 238 +6101e 2 90 238 +61020 2 101 205 +61022 4 434 223 +61026 2 101 205 +61028 c 434 223 +61034 4 435 223 +61038 6 440 223 +6103e 8 112 215 +61046 2 442 223 +61048 c 443 223 +61054 4 444 223 +61058 4 64 238 +6105c 2 96 238 +6105e 4 444 223 +61062 2 96 238 +61064 2 96 238 +61066 2 70 213 +61068 2 97 238 +6106a 2 70 213 +6106c 2 97 238 +6106e 2 135 222 +61070 4 161 201 +61074 4 161 201 +61078 6 444 223 +6107e a 445 223 +61088 8 436 223 +61090 8 437 223 +61098 6 135 222 +6109e a 444 223 +610a8 10 156 238 +FUNC 610b8 2e 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, long double&) const +610b8 6 579 223 +610be 8 579 223 +610c6 20 582 223 +FUNC 610e8 100 0 std::istreambuf_iterator > std::priv::__do_get_float >, double, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, double&, wchar_t*) +610e8 2 145 212 +610ea 8 427 223 +610f2 4 427 223 +610f6 4 145 212 +610fa 6 427 223 +61100 6 145 212 +61106 18 351 218 +6111e 4 41 213 +61122 2 120 238 +61124 6 108 213 +6112a 2 351 218 +6112c 6 108 213 +61132 8 41 213 +6113a 2 120 238 +6113c 4 41 213 +61140 6 124 238 +61146 4 481 201 +6114a 4 124 238 +6114e 2 90 238 +61150 2 101 205 +61152 4 434 223 +61156 2 101 205 +61158 c 434 223 +61164 4 435 223 +61168 6 440 223 +6116e 8 112 215 +61176 2 442 223 +61178 c 443 223 +61184 4 444 223 +61188 4 64 238 +6118c 2 96 238 +6118e 4 444 223 +61192 2 96 238 +61194 2 96 238 +61196 2 70 213 +61198 2 97 238 +6119a 2 70 213 +6119c 2 97 238 +6119e 2 135 222 +611a0 4 161 201 +611a4 4 161 201 +611a8 6 444 223 +611ae a 445 223 +611b8 8 436 223 +611c0 8 437 223 +611c8 6 135 222 +611ce a 444 223 +611d8 10 156 238 +FUNC 611e8 2e 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, double&) const +611e8 6 571 223 +611ee 8 571 223 +611f6 20 574 223 +FUNC 61218 100 0 std::istreambuf_iterator > std::priv::__do_get_float >, float, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >&, std::ios_base&, int&, float&, wchar_t*) +61218 2 145 212 +6121a 8 427 223 +61222 4 427 223 +61226 4 145 212 +6122a 6 427 223 +61230 6 145 212 +61236 18 351 218 +6124e 4 41 213 +61252 2 120 238 +61254 6 108 213 +6125a 2 351 218 +6125c 6 108 213 +61262 8 41 213 +6126a 2 120 238 +6126c 4 41 213 +61270 6 124 238 +61276 4 481 201 +6127a 4 124 238 +6127e 2 90 238 +61280 2 101 205 +61282 4 434 223 +61286 2 101 205 +61288 c 434 223 +61294 4 435 223 +61298 6 440 223 +6129e 8 112 215 +612a6 2 442 223 +612a8 c 443 223 +612b4 4 444 223 +612b8 4 64 238 +612bc 2 96 238 +612be 4 444 223 +612c2 2 96 238 +612c4 2 96 238 +612c6 2 70 213 +612c8 2 97 238 +612ca 2 70 213 +612cc 2 97 238 +612ce 2 135 222 +612d0 4 161 201 +612d4 4 161 201 +612d8 6 444 223 +612de a 445 223 +612e8 8 436 223 +612f0 8 437 223 +612f8 6 135 222 +612fe a 444 223 +61308 10 156 238 +FUNC 61318 2e 0 std::num_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, std::ios_base&, int&, float&) const +61318 6 564 223 +6131e 8 564 223 +61326 20 567 223 +FUNC 61348 8c 0 std::basic_string, std::allocator >::_M_reserve(unsigned int) +61348 4 342 201 +6134c 6 170 236 +61352 2 342 201 +61354 2 346 201 +61356 2 356 201 +61358 2 346 201 +6135a 4 347 201 +6135e 4 158 201 +61362 8 158 201 +6136a 2 352 201 +6136c 6 158 201 +61372 2 86 243 +61374 2 66 238 +61376 8 86 243 +6137e 4 86 243 +61382 4 84 243 +61386 6 86 243 +6138c 2 84 243 +6138e 4 764 186 +61392 2 86 243 +61394 4 146 205 +61398 6 86 243 +6139e 2 101 205 +613a0 2 96 238 +613a2 2 101 205 +613a4 2 96 238 +613a6 2 96 238 +613a8 4 97 238 +613ac 4 323 201 +613b0 4 161 201 +613b4 4 161 201 +613b8 2 160 238 +613ba 2 164 238 +613bc 2 165 238 +613be 4 176 236 +613c2 8 134 222 +613ca 6 135 222 +613d0 4 342 201 +FUNC 613d4 9c 0 std::basic_string, std::allocator >::append(unsigned int, wchar_t) +613d4 6 180 236 +613da 2 180 236 +613dc 2 181 236 +613de 2 89 238 +613e0 4 182 236 +613e4 2 65 238 +613e6 4 182 236 +613ea 4 400 237 +613ee 6 182 236 +613f4 2 74 238 +613f6 6 74 238 +613fc 8 74 238 +61404 4 184 236 +61408 a 249 243 +61412 8 249 243 +6141a 4 146 205 +6141e 2 249 243 +61420 4 187 236 +61424 6 101 205 +6142a 2 267 246 +6142c 2 189 236 +6142e 6 192 236 +61434 2 306 237 +61436 4 307 237 +6143a 8 306 237 +61442 c 307 237 +6144e 6 307 237 +61454 e 185 236 +61462 e 600 236 +FUNC 61470 1d6 0 std::basic_string, std::allocator >::assign(unsigned int, wchar_t) +61470 8 222 236 +61478 2 65 238 +6147a 4 400 237 +6147e 2 222 236 +61480 2 222 236 +61482 4 400 237 +61486 6 223 236 +6148c 6 72 238 +61492 8 72 238 +6149a 2 72 238 +6149c 6 228 236 +614a2 2 120 238 +614a4 2 247 237 +614a6 2 120 238 +614a8 2 124 238 +614aa 2 120 238 +614ac 2 481 201 +614ae 4 124 238 +614b2 4 249 243 +614b6 4 66 238 +614ba 2 249 243 +614bc 4 249 243 +614c0 6 249 243 +614c6 4 146 205 +614ca 2 249 243 +614cc 2 248 237 +614ce 2 101 205 +614d0 6 942 237 +614d6 2 101 205 +614d8 4 942 237 +614dc 8 171 238 +614e4 2 170 238 +614e6 2 171 238 +614e8 2 170 238 +614ea 4 171 238 +614ee 6 91 200 +614f4 2 93 200 +614f6 4 92 200 +614fa 2 93 200 +614fc 12 91 200 +6150e 14 92 200 +61522 20 93 200 +61542 4 174 238 +61546 4 173 238 +6154a 8 174 238 +61552 6 175 238 +61558 4 178 238 +6155c 2 174 238 +6155e 2 175 238 +61560 4 174 238 +61564 4 179 238 +61568 6 174 238 +6156e 4 175 238 +61572 2 64 238 +61574 6 96 238 +6157a 2 96 238 +6157c 4 97 238 +61580 4 323 201 +61584 4 161 201 +61588 4 161 201 +6158c 8 238 236 +61594 8 261 246 +6159c 4 225 236 +615a0 4 90 238 +615a4 4 225 236 +615a8 4 803 237 +615ac 6 249 246 +615b2 2 806 237 +615b4 4 249 246 +615b8 10 806 237 +615c8 6 261 246 +615ce 8 400 237 +615d6 4 230 236 +615da 2 400 237 +615dc a 230 236 +615e6 4 185 238 +615ea 2 91 200 +615ec 4 92 200 +615f0 2 93 200 +615f2 2 92 200 +615f4 2 91 200 +615f6 2 92 200 +615f8 2 93 200 +615fa 2 92 200 +615fc 2 91 200 +615fe 2 92 200 +61600 4 93 200 +61604 6 135 222 +6160a 6 189 238 +61610 4 188 238 +61614 4 187 238 +61618 12 189 238 +6162a 2 193 238 +6162c 2 192 238 +6162e 2 193 238 +61630 4 194 238 +61634 4 193 238 +61638 4 195 238 +6163c 4 193 238 +61640 6 196 238 +FUNC 61648 486 0 bool std::priv::__get_monetary_value >, std::back_insert_iterator, std::allocator > >, wchar_t>(std::istreambuf_iterator >&, std::istreambuf_iterator >, std::back_insert_iterator, std::allocator > >, std::ctype const&, wchar_t, int, wchar_t, std::string const&, bool&) +61648 6 62 220 +6164e c 62 220 +6165a 2 112 215 +6165c 6 62 220 +61662 4 112 215 +61666 2 66 220 +61668 2 67 220 +6166a 6 118 220 +61670 a 90 215 +6167a a 184 206 +61684 4 66 220 +61688 2 70 220 +6168a 2 70 220 +6168c 8 70 220 +61694 2 70 220 +61696 4 81 220 +6169a 4 307 237 +6169e 2 69 215 +616a0 6 307 237 +616a6 8 120 215 +616ae 2 73 220 +616b0 8 90 215 +616b8 4 184 206 +616bc 2 90 215 +616be 6 184 206 +616c4 6 74 220 +616ca 2 78 220 +616cc a 90 215 +616d6 4 79 220 +616da 2 68 215 +616dc 4 80 220 +616e0 a 229 235 +616ea 4 229 235 +616ee 4 69 215 +616f2 4 120 215 +616f6 4 81 220 +616fa 4 120 215 +616fe 4 73 220 +61702 4 65 238 +61706 2 89 238 +61708 6 90 220 +6170e 4 93 220 +61712 4 94 220 +61716 2 93 220 +61718 4 94 220 +6171c 6 96 220 +61722 2 112 215 +61724 2 96 220 +61726 6 112 215 +6172c 6 99 220 +61732 8 100 220 +6173a 4 307 237 +6173e 2 100 220 +61740 4 307 237 +61744 8 101 205 +6174c 2 100 220 +6174e 2 267 246 +61750 2 100 220 +61752 2 101 205 +61754 4 267 246 +61758 2 539 237 +6175a 2 100 220 +6175c 2 64 238 +6175e 6 74 238 +61764 6 74 238 +6176a 4 535 237 +6176e 2 400 237 +61770 8 307 237 +61778 2 400 237 +6177a a 306 237 +61784 e 307 237 +61792 6 307 237 +61798 2 536 237 +6179a 2 100 220 +6179c 6 536 237 +617a2 2 267 246 +617a4 2 100 220 +617a6 2 101 205 +617a8 4 267 246 +617ac 2 539 237 +617ae 2 100 220 +617b0 4 102 220 +617b4 2 92 215 +617b6 6 235 235 +617bc 4 764 186 +617c0 4 235 235 +617c4 4 191 246 +617c8 2 93 215 +617ca 8 191 246 +617d2 6 95 215 +617d8 2 92 215 +617da 6 235 235 +617e0 4 764 186 +617e4 2 235 235 +617e6 4 191 246 +617ea 2 93 215 +617ec 2 191 246 +617ee 2 184 206 +617f0 6 191 246 +617f6 4 95 215 +617fa 8 184 206 +61802 6 74 220 +61808 8 76 220 +61810 4 90 215 +61814 2 76 220 +61816 4 90 215 +6181a 2 64 238 +6181c 2 74 238 +6181e 4 74 238 +61822 6 74 238 +61828 4 535 237 +6182c 4 75 220 +61830 2 267 246 +61832 4 101 205 +61836 4 75 220 +6183a 4 267 246 +6183e 4 539 237 +61842 2 92 215 +61844 6 235 235 +6184a 4 764 186 +6184e 2 235 235 +61850 4 191 246 +61854 2 93 215 +61856 a 191 246 +61860 6 95 215 +61866 8 229 235 +6186e a 235 235 +61878 2 92 215 +6187a 6 235 235 +61880 4 764 186 +61884 2 235 235 +61886 6 235 235 +6188c 2 64 238 +6188e 2 74 238 +61890 2 74 238 +61892 2 235 235 +61894 2 74 238 +61896 8 74 238 +6189e 4 535 237 +618a2 2 400 237 +618a4 2 307 237 +618a6 2 400 237 +618a8 a 306 237 +618b2 e 307 237 +618c0 e 307 237 +618ce e 536 237 +618dc 8 235 235 +618e4 a 74 238 +618ee a 90 215 +618f8 8 99 220 +61900 2 68 215 +61902 a 229 235 +6190c 4 229 235 +61910 8 307 237 +61918 4 95 215 +6191c 4 69 215 +61920 2 75 215 +61922 8 90 215 +6192a 4 77 215 +6192e a 90 215 +61938 6 110 220 +6193e 6 115 220 +61944 a 62 220 +6194e 2 115 220 +61950 2 117 220 +61952 2 115 220 +61954 2 117 220 +61956 6 235 235 +6195c 4 764 186 +61960 4 235 235 +61964 4 191 246 +61968 2 110 220 +6196a 4 191 246 +6196e 2 93 215 +61970 4 191 246 +61974 4 95 215 +61978 2 110 220 +6197a 4 94 215 +6197e 2 110 220 +61980 8 90 215 +61988 a 184 206 +61992 4 110 220 +61996 8 111 220 +6199e 4 90 215 +619a2 4 111 220 +619a6 2 90 215 +619a8 2 64 238 +619aa 2 74 238 +619ac 4 74 238 +619b0 6 74 238 +619b6 4 535 237 +619ba 2 267 246 +619bc 2 112 220 +619be 2 101 205 +619c0 2 112 220 +619c2 2 101 205 +619c4 4 267 246 +619c8 4 539 237 +619cc 2 92 215 +619ce 6 235 235 +619d4 6 764 186 +619da 2 235 235 +619dc 6 235 235 +619e2 2 64 238 +619e4 2 74 238 +619e6 2 74 238 +619e8 2 235 235 +619ea 2 74 238 +619ec 8 74 238 +619f4 4 535 237 +619f8 4 400 237 +619fc a 306 237 +61a06 e 307 237 +61a14 e 307 237 +61a22 a 536 237 +61a2c 6 235 235 +61a32 4 764 186 +61a36 2 235 235 +61a38 4 191 246 +61a3c 2 93 215 +61a3e 2 191 246 +61a40 4 95 215 +61a44 8 191 246 +61a4c 2 92 215 +61a4e 6 235 235 +61a54 4 764 186 +61a58 2 235 235 +61a5a 4 191 246 +61a5e 2 93 215 +61a60 2 191 246 +61a62 4 95 215 +61a66 8 191 246 +61a6e 1a 235 235 +61a88 a 229 235 +61a92 8 91 220 +61a9a 2 92 215 +61a9c 6 235 235 +61aa2 4 764 186 +61aa6 2 235 235 +61aa8 4 191 246 +61aac 2 93 215 +61aae 8 191 246 +61ab6 6 95 215 +61abc 12 235 235 +FUNC 61ad0 6bc 0 std::istreambuf_iterator > std::priv::__money_do_get >, std::basic_string, std::allocator > >(std::istreambuf_iterator >, std::istreambuf_iterator >, bool, std::ios_base&, int&, std::basic_string, std::allocator >&, bool&, wchar_t*) +61ad0 6 122 220 +61ad6 c 122 220 +61ae2 4 112 215 +61ae6 4 122 220 +61aea 4 112 215 +61aee 2 125 220 +61af0 2 126 220 +61af2 4 127 220 +61af6 8 126 220 +61afe 4 127 220 +61b02 8 272 220 +61b0a e 145 212 +61b18 2a 351 218 +61b42 2 143 220 +61b44 2 351 218 +61b46 6 143 220 +61b4c 26 220 221 +61b72 2 143 220 +61b74 2 220 221 +61b76 2 217 221 +61b78 2 143 220 +61b7a 4 217 221 +61b7e 2 220 221 +61b80 2 143 220 +61b82 4 217 221 +61b86 2 220 221 +61b88 2 143 220 +61b8a 6 217 221 +61b90 10 216 221 +61ba0 2 120 238 +61ba2 2 149 220 +61ba4 2 124 238 +61ba6 2 120 238 +61ba8 2 124 238 +61baa 4 149 220 +61bae 2 120 238 +61bb0 2 149 220 +61bb2 2 481 201 +61bb4 4 124 238 +61bb8 4 101 205 +61bbc 4 95 215 +61bc0 2 153 220 +61bc2 2 69 215 +61bc4 2 101 205 +61bc6 1a 154 220 +61be0 a 90 215 +61bea a 184 206 +61bf4 6 156 220 +61bfa 2 68 215 +61bfc a 229 235 +61c06 4 229 235 +61c0a 2 69 215 +61c0c 8 120 215 +61c14 6 162 220 +61c1a 2 153 220 +61c1c 4 153 220 +61c20 a 244 220 +61c2a 2 89 238 +61c2c 2 65 238 +61c2e 2 400 237 +61c30 a 245 220 +61c3a 6 252 220 +61c40 8 112 215 +61c48 2 268 220 +61c4a a 269 220 +61c54 8 271 220 +61c5c 2 64 238 +61c5e 6 96 238 +61c64 2 96 238 +61c66 4 97 238 +61c6a 4 323 201 +61c6e 6 161 201 +61c74 4 161 201 +61c78 2 64 238 +61c7a 6 96 238 +61c80 2 96 238 +61c82 4 97 238 +61c86 4 323 201 +61c8a 6 161 201 +61c90 4 161 201 +61c94 4 64 238 +61c98 4 96 238 +61c9c 2 96 238 +61c9e 4 97 238 +61ca2 4 323 201 +61ca6 6 161 201 +61cac 4 161 201 +61cb0 8 271 220 +61cb8 8 215 220 +61cc0 a 173 221 +61cca 4 179 221 +61cce 2 173 221 +61cd0 6 179 221 +61cd6 6 175 221 +61cdc 2 179 221 +61cde a 175 221 +61ce8 2 225 220 +61cea 4 220 220 +61cee a 225 220 +61cf8 8 225 220 +61d00 a 174 221 +61d0a 28 227 220 +61d32 6 232 220 +61d38 a 233 220 +61d42 6 234 220 +61d48 8 156 238 +61d50 8 112 215 +61d58 6 176 220 +61d5e a 177 220 +61d68 c 179 220 +61d74 4 180 220 +61d78 2 181 220 +61d7a 8 167 220 +61d82 10 176 221 +61d92 24 169 220 +61db6 6 170 220 +61dbc 4 170 220 +61dc0 6 171 220 +61dc6 2 172 220 +61dc8 4 64 238 +61dcc 8 172 220 +61dd4 2 96 238 +61dd6 2 172 220 +61dd8 6 96 238 +61dde 8 96 238 +61de6 2 97 238 +61de8 2 135 222 +61dea 4 97 238 +61dee 4 323 201 +61df2 6 161 201 +61df8 6 161 201 +61dfe 26 181 221 +61e24 2 143 220 +61e26 2 181 221 +61e28 2 178 221 +61e2a 2 143 220 +61e2c 4 178 221 +61e30 2 181 221 +61e32 2 143 220 +61e34 4 178 221 +61e38 2 181 221 +61e3a 2 143 220 +61e3c 6 178 221 +61e42 12 177 221 +61e54 6 90 215 +61e5a a 184 206 +61e64 6 162 220 +61e6a 2 68 215 +61e6c a 229 235 +61e76 6 229 235 +61e7c 4 69 215 +61e80 2 92 215 +61e82 6 235 235 +61e88 4 764 186 +61e8c 2 235 235 +61e8e 4 191 246 +61e92 2 93 215 +61e94 2 191 246 +61e96 4 95 215 +61e9a 8 191 246 +61ea2 a 235 235 +61eac 4 89 238 +61eb0 2 65 238 +61eb2 2 400 237 +61eb4 8 256 220 +61ebc 6 263 220 +61ec2 c 206 206 +61ece 8 359 237 +61ed6 c 517 237 +61ee2 a 212 221 +61eec 4 218 221 +61ef0 2 212 221 +61ef2 6 218 221 +61ef8 8 214 221 +61f00 2 218 221 +61f02 e 214 221 +61f10 12 215 221 +61f22 2 65 238 +61f24 8 187 220 +61f2c a 90 215 +61f36 8 197 220 +61f3e 8 65 238 +61f46 a 201 220 +61f50 8 90 215 +61f58 8 203 220 +61f60 2 68 215 +61f62 a 229 235 +61f6c 4 229 235 +61f70 2 205 220 +61f72 2 69 215 +61f74 2 205 220 +61f76 2 206 220 +61f78 c 213 221 +61f84 20 258 220 +61fa4 6 259 220 +61faa 2 260 220 +61fac 2 261 220 +61fae 4 259 220 +61fb2 2 261 220 +61fb4 4 260 220 +61fb8 8 261 220 +61fc0 1e 247 220 +61fde 6 248 220 +61fe4 2 249 220 +61fe6 4 248 220 +61fea 8 249 220 +61ff2 2 92 215 +61ff4 6 235 235 +61ffa 4 764 186 +61ffe 2 235 235 +62000 4 191 246 +62004 2 93 215 +62006 2 191 246 +62008 4 95 215 +6200c 8 191 246 +62014 12 135 222 +62026 c 349 237 +62032 6 135 222 +62038 c 250 220 +62044 8 65 238 +6204c a 188 220 +62056 8 90 215 +6205e a 190 220 +62068 2 92 215 +6206a 6 235 235 +62070 4 764 186 +62074 2 235 235 +62076 4 191 246 +6207a 2 93 215 +6207c 4 191 246 +62080 4 95 215 +62084 8 191 246 +6208c a 235 235 +62096 2 68 215 +62098 8 229 235 +620a0 4 229 235 +620a4 4 69 215 +620a8 2 92 215 +620aa 6 235 235 +620b0 4 764 186 +620b4 2 235 235 +620b6 4 191 246 +620ba 2 93 215 +620bc 2 191 246 +620be 4 95 215 +620c2 8 191 246 +620ca 4 225 220 +620ce 8 229 235 +620d6 2 92 215 +620d8 6 235 235 +620de 4 764 186 +620e2 2 235 235 +620e4 4 191 246 +620e8 2 93 215 +620ea 4 191 246 +620ee 4 95 215 +620f2 8 191 246 +620fa a 235 235 +62104 6 229 235 +6210a 4 69 215 +6210e 4 211 220 +62112 4 208 220 +62116 4 211 220 +6211a 4 208 220 +6211e 4 236 220 +62122 4 235 220 +62126 4 236 220 +6212a 2 235 220 +6212c 8 156 238 +62134 18 235 235 +6214c 18 156 238 +62164 a 271 220 +6216e 1e 156 238 +FUNC 6218c 4e 0 std::money_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, bool, std::ios_base&, int&, std::basic_string, std::allocator >&) const +6218c 6 304 220 +62192 2 304 220 +62194 2 308 220 +62196 2 307 220 +62198 6 304 220 +6219e 2 308 220 +621a0 6 307 220 +621a6 28 308 220 +621ce c 309 220 +FUNC 621dc 12a 0 std::money_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, bool, std::ios_base&, int&, long double&) const +621dc 2 279 220 +621de 2 124 238 +621e0 6 279 220 +621e6 2 120 238 +621e8 a 279 220 +621f2 2 284 220 +621f4 4 279 220 +621f8 2 124 238 +621fa 2 120 238 +621fc 2 481 201 +621fe 4 124 238 +62202 2 284 220 +62204 6 101 205 +6220a 2 284 220 +6220c 4 101 205 +62210 8 283 220 +62218 2a 284 220 +62242 6 284 220 +62248 6 286 220 +6224e 2 284 220 +62250 e 286 220 +6225e 2 284 220 +62260 2 286 220 +62262 2 66 238 +62264 2 287 220 +62266 4 289 220 +6226a 4 287 220 +6226e 4 289 220 +62272 2 120 238 +62274 2 124 238 +62276 2 120 238 +62278 2 124 238 +6227a 2 481 201 +6227c 4 124 238 +62280 4 101 205 +62284 4 242 223 +62288 2 101 205 +6228a 14 242 223 +6229e 6 156 238 +622a4 6 294 220 +622aa 6 299 220 +622b0 2 64 238 +622b2 2 96 238 +622b4 4 299 220 +622b8 2 96 238 +622ba 2 96 238 +622bc 2 97 238 +622be 2 135 222 +622c0 2 97 238 +622c2 4 323 201 +622c6 4 161 201 +622ca 4 161 201 +622ce c 300 220 +622da e 295 220 +622e8 6 289 220 +622ee 6 135 222 +622f4 12 156 238 +FUNC 62308 144 0 std::string::assign(unsigned int, char) +62308 8 222 236 +62310 2 65 238 +62312 2 400 237 +62314 2 222 236 +62316 2 222 236 +62318 2 400 237 +6231a 4 223 236 +6231e 4 72 238 +62322 8 72 238 +6232a 2 72 238 +6232c 4 228 236 +62330 2 120 238 +62332 2 247 237 +62334 2 120 238 +62336 2 124 238 +62338 2 481 201 +6233a 4 124 238 +6233e 2 66 238 +62340 2 314 243 +62342 2 249 243 +62344 4 249 243 +62348 2 222 236 +6234a 4 146 205 +6234e 4 249 243 +62352 2 248 237 +62354 4 101 205 +62358 a 942 237 +62362 8 171 238 +6236a 2 170 238 +6236c 2 171 238 +6236e 2 170 238 +62370 4 171 238 +62374 8 91 200 +6237c 8 92 200 +62384 4 93 200 +62388 8 174 238 +62390 4 93 200 +62394 6 174 238 +6239a 2 173 238 +6239c 4 174 238 +623a0 2 178 238 +623a2 2 175 238 +623a4 2 174 238 +623a6 2 175 238 +623a8 2 179 238 +623aa 2 175 238 +623ac 6 156 238 +623b2 8 238 236 +623ba 8 235 246 +623c2 2 225 236 +623c4 2 90 238 +623c6 2 225 236 +623c8 4 803 237 +623cc 2 168 246 +623ce 2 806 237 +623d0 2 168 246 +623d2 8 806 237 +623da 6 235 246 +623e0 4 400 237 +623e4 4 230 236 +623e8 2 400 237 +623ea 8 230 236 +623f2 4 185 238 +623f6 4 91 200 +623fa 6 92 200 +62400 2 93 200 +62402 2 92 200 +62404 4 91 200 +62408 4 92 200 +6240c 2 93 200 +6240e 2 92 200 +62410 4 91 200 +62414 4 92 200 +62418 4 93 200 +6241c 4 189 238 +62420 4 193 238 +62424 4 187 238 +62428 4 188 238 +6242c 4 193 238 +62430 4 189 238 +62434 4 193 238 +62438 4 192 238 +6243c 4 193 238 +62440 4 194 238 +62444 2 195 238 +62446 6 196 238 +FUNC 6244c 408 0 bool std::priv::__get_monetary_value >, std::back_insert_iterator, char>(std::istreambuf_iterator >&, std::istreambuf_iterator >, std::back_insert_iterator, std::ctype const&, char, int, char, std::string const&, bool&) +6244c 6 62 220 +62452 c 62 220 +6245e 2 112 215 +62460 4 62 220 +62464 4 112 215 +62468 2 66 220 +6246a 2 67 220 +6246c 6 118 220 +62472 a 90 215 +6247c 6 79 206 +62482 6 66 220 +62488 8 70 220 +62490 6 70 220 +62496 2 70 220 +62498 4 70 220 +6249c 4 81 220 +624a0 2 69 215 +624a2 8 120 215 +624aa 2 73 220 +624ac a 90 215 +624b6 6 79 206 +624bc 6 74 220 +624c2 6 78 220 +624c8 8 90 215 +624d0 4 79 220 +624d4 2 68 215 +624d6 4 80 220 +624da a 229 235 +624e4 4 229 235 +624e8 4 69 215 +624ec 4 120 215 +624f0 4 81 220 +624f4 4 120 215 +624f8 4 73 220 +624fc 4 65 238 +62500 2 89 238 +62502 6 90 220 +62508 4 93 220 +6250c 4 94 220 +62510 2 93 220 +62512 4 94 220 +62516 6 96 220 +6251c 2 112 215 +6251e 2 96 220 +62520 6 112 215 +62526 6 99 220 +6252c a 100 220 +62536 6 232 246 +6253c 6 101 205 +62542 2 100 220 +62544 2 90 238 +62546 2 232 246 +62548 4 539 237 +6254c 2 100 220 +6254e 2 539 237 +62550 2 100 220 +62552 2 64 238 +62554 4 74 238 +62558 2 74 238 +6255a 8 74 238 +62562 4 535 237 +62566 2 400 237 +62568 6 304 237 +6256e a 306 237 +62578 a 307 237 +62582 8 307 237 +6258a 2 536 237 +6258c 2 100 220 +6258e 6 536 237 +62594 2 101 205 +62596 2 90 238 +62598 2 232 246 +6259a 4 539 237 +6259e 2 100 220 +625a0 2 539 237 +625a2 2 100 220 +625a4 4 102 220 +625a8 2 92 215 +625aa 6 235 235 +625b0 4 223 246 +625b4 4 235 235 +625b8 4 191 246 +625bc 2 220 246 +625be 4 191 246 +625c2 2 93 215 +625c4 4 191 246 +625c8 2 95 215 +625ca 2 191 246 +625cc 4 95 215 +625d0 2 92 215 +625d2 6 235 235 +625d8 4 223 246 +625dc 2 235 235 +625de 2 220 246 +625e0 2 93 215 +625e2 2 79 206 +625e4 c 191 246 +625f0 2 95 215 +625f2 4 79 206 +625f6 2 191 246 +625f8 2 74 220 +625fa 2 95 215 +625fc 4 74 220 +62600 8 76 220 +62608 4 90 215 +6260c 4 76 220 +62610 4 90 215 +62614 2 74 238 +62616 2 64 238 +62618 4 74 238 +6261c 2 74 238 +6261e 8 74 238 +62626 4 535 237 +6262a 4 101 205 +6262e 4 75 220 +62632 2 90 238 +62634 4 75 220 +62638 2 232 246 +6263a 8 539 237 +62642 2 92 215 +62644 6 235 235 +6264a 4 223 246 +6264e 2 235 235 +62650 4 191 246 +62654 2 220 246 +62656 4 191 246 +6265a 2 93 215 +6265c 4 191 246 +62660 2 95 215 +62662 2 191 246 +62664 4 95 215 +62668 8 229 235 +62670 8 235 235 +62678 2 92 215 +6267a 6 235 235 +62680 4 223 246 +62684 2 235 235 +62686 4 220 246 +6268a 6 235 235 +62690 4 220 246 +62694 8 235 235 +6269c 2 400 237 +6269e 6 304 237 +626a4 a 306 237 +626ae a 307 237 +626b8 8 307 237 +626c0 e 536 237 +626ce a 90 215 +626d8 a 99 220 +626e2 2 68 215 +626e4 8 229 235 +626ec 4 229 235 +626f0 4 95 215 +626f4 8 69 215 +626fc 8 120 215 +62704 2 110 220 +62706 6 115 220 +6270c c 62 220 +62718 2 115 220 +6271a 2 117 220 +6271c 2 115 220 +6271e 2 117 220 +62720 8 90 215 +62728 6 79 206 +6272e 4 110 220 +62732 8 111 220 +6273a 4 90 215 +6273e 4 111 220 +62742 2 90 215 +62744 2 74 238 +62746 2 64 238 +62748 4 74 238 +6274c 2 74 238 +6274e 8 74 238 +62756 4 535 237 +6275a 4 101 205 +6275e 2 90 238 +62760 4 112 220 +62764 4 232 246 +62768 8 539 237 +62770 2 92 215 +62772 6 235 235 +62778 4 223 246 +6277c 2 235 235 +6277e 6 220 246 +62784 6 235 235 +6278a 6 220 246 +62790 2 400 237 +62792 4 304 237 +62796 a 306 237 +627a0 a 307 237 +627aa 8 307 237 +627b2 a 536 237 +627bc 2 92 215 +627be 6 235 235 +627c4 4 223 246 +627c8 2 235 235 +627ca 4 191 246 +627ce 2 220 246 +627d0 4 191 246 +627d4 2 93 215 +627d6 4 191 246 +627da 4 95 215 +627de 4 191 246 +627e2 8 235 235 +627ea 8 229 235 +627f2 8 91 220 +627fa 2 92 215 +627fc 6 235 235 +62802 4 223 246 +62806 2 235 235 +62808 4 191 246 +6280c 2 220 246 +6280e 2 191 246 +62810 2 93 215 +62812 4 191 246 +62816 2 95 215 +62818 2 191 246 +6281a 4 95 215 +6281e 10 235 235 +6282e 26 600 236 +FUNC 62854 670 0 std::istreambuf_iterator > std::priv::__money_do_get >, std::string>(std::istreambuf_iterator >, std::istreambuf_iterator >, bool, std::ios_base&, int&, std::string&, bool&, char*) +62854 8 122 220 +6285c 2 122 220 +6285e 2 112 215 +62860 8 122 220 +62868 2 112 215 +6286a 4 122 220 +6286e 2 112 215 +62870 4 122 220 +62874 4 112 215 +62878 2 125 220 +6287a 2 126 220 +6287c 4 127 220 +62880 2 126 220 +62882 4 127 220 +62886 6 126 220 +6288c c 272 220 +62898 e 145 212 +628a6 2a 351 218 +628d0 2 143 220 +628d2 2 351 218 +628d4 6 143 220 +628da 26 140 221 +62900 2 137 221 +62902 2 140 221 +62904 8 137 221 +6290c 4 140 221 +62910 2 143 220 +62912 6 137 221 +62918 10 136 221 +62928 2 120 238 +6292a 2 149 220 +6292c 2 124 238 +6292e 2 120 238 +62930 2 124 238 +62932 4 149 220 +62936 2 481 201 +62938 2 149 220 +6293a 4 124 238 +6293e 4 101 205 +62942 2 153 220 +62944 2 69 215 +62946 2 101 205 +62948 18 154 220 +62960 e 90 215 +6296e 6 79 206 +62974 6 156 220 +6297a 2 68 215 +6297c a 229 235 +62986 4 229 235 +6298a 4 69 215 +6298e 8 120 215 +62996 6 162 220 +6299c 4 153 220 +629a0 6 153 220 +629a6 a 244 220 +629b0 2 89 238 +629b2 2 65 238 +629b4 2 400 237 +629b6 a 245 220 +629c0 6 252 220 +629c6 8 112 215 +629ce 2 268 220 +629d0 a 269 220 +629da 8 271 220 +629e2 12 156 238 +629f4 8 271 220 +629fc 8 215 220 +62a04 a 92 221 +62a0e 4 98 221 +62a12 2 92 221 +62a14 6 98 221 +62a1a 6 94 221 +62a20 2 98 221 +62a22 a 94 221 +62a2c 2 220 220 +62a2e 2 225 220 +62a30 4 220 220 +62a34 8 225 220 +62a3c 8 225 220 +62a44 a 93 221 +62a4e 22 227 220 +62a70 6 232 220 +62a76 a 233 220 +62a80 6 234 220 +62a86 8 156 238 +62a8e 8 112 215 +62a96 6 176 220 +62a9c a 177 220 +62aa6 a 179 220 +62ab0 6 192 220 +62ab6 8 167 220 +62abe 10 95 221 +62ace 1c 169 220 +62aea 6 170 220 +62af0 4 170 220 +62af4 6 171 220 +62afa e 172 220 +62b08 2 156 238 +62b0a 4 172 220 +62b0e 6 156 238 +62b14 26 100 221 +62b3a 2 97 221 +62b3c 2 100 221 +62b3e a 97 221 +62b48 4 100 221 +62b4c 2 143 220 +62b4e 4 97 221 +62b52 12 96 221 +62b64 a 90 215 +62b6e 6 79 206 +62b74 6 162 220 +62b7a 2 68 215 +62b7c a 229 235 +62b86 6 229 235 +62b8c 6 69 215 +62b92 2 92 215 +62b94 6 235 235 +62b9a 4 223 246 +62b9e 2 235 235 +62ba0 4 191 246 +62ba4 2 220 246 +62ba6 2 191 246 +62ba8 4 93 215 +62bac 4 191 246 +62bb0 2 95 215 +62bb2 4 191 246 +62bb6 6 95 215 +62bbc 8 235 235 +62bc4 2 89 238 +62bc6 2 65 238 +62bc8 2 400 237 +62bca 4 256 220 +62bce 6 258 220 +62bd4 2 258 220 +62bd6 12 258 220 +62be8 2 259 220 +62bea 4 260 220 +62bee 10 259 220 +62bfe 2 260 220 +62c00 a 261 220 +62c0a 6 263 220 +62c10 c 101 206 +62c1c 8 359 237 +62c24 c 517 237 +62c30 6 260 220 +62c36 12 135 221 +62c48 a 132 221 +62c52 4 138 221 +62c56 2 132 221 +62c58 6 138 221 +62c5e 6 134 221 +62c64 2 138 221 +62c66 c 134 221 +62c72 2 65 238 +62c74 6 187 220 +62c7a c 90 215 +62c86 8 197 220 +62c8e 2 65 238 +62c90 8 201 220 +62c98 a 90 215 +62ca2 8 203 220 +62caa 2 68 215 +62cac a 229 235 +62cb6 4 229 235 +62cba 2 205 220 +62cbc 4 69 215 +62cc0 2 205 220 +62cc2 2 206 220 +62cc4 c 133 221 +62cd0 6 247 220 +62cd6 2 247 220 +62cd8 12 247 220 +62cea 2 248 220 +62cec 4 249 220 +62cf0 10 248 220 +62d00 8 249 220 +62d08 2 92 215 +62d0a 6 235 235 +62d10 4 223 246 +62d14 2 235 235 +62d16 4 191 246 +62d1a 2 220 246 +62d1c 4 191 246 +62d20 4 93 215 +62d24 4 191 246 +62d28 2 95 215 +62d2a 4 191 246 +62d2e 6 95 215 +62d34 c 349 237 +62d40 c 250 220 +62d4c 2 65 238 +62d4e 8 188 220 +62d56 c 90 215 +62d62 8 190 220 +62d6a 2 68 215 +62d6c 8 229 235 +62d74 2 229 235 +62d76 4 69 215 +62d7a 4 229 235 +62d7e 2 92 215 +62d80 6 235 235 +62d86 4 223 246 +62d8a 2 235 235 +62d8c 4 191 246 +62d90 2 220 246 +62d92 4 191 246 +62d96 4 93 215 +62d9a 4 191 246 +62d9e 2 95 215 +62da0 4 191 246 +62da4 6 95 215 +62daa 8 235 235 +62db2 2 68 215 +62db4 8 229 235 +62dbc 2 229 235 +62dbe 4 69 215 +62dc2 4 229 235 +62dc6 2 92 215 +62dc8 6 235 235 +62dce 4 223 246 +62dd2 2 235 235 +62dd4 4 191 246 +62dd8 2 220 246 +62dda 4 191 246 +62dde 4 93 215 +62de2 4 191 246 +62de6 2 95 215 +62de8 4 191 246 +62dec 6 95 215 +62df2 4 225 220 +62df6 8 229 235 +62dfe 2 92 215 +62e00 6 235 235 +62e06 4 223 246 +62e0a 2 235 235 +62e0c 4 191 246 +62e10 2 220 246 +62e12 2 191 246 +62e14 4 93 215 +62e18 4 191 246 +62e1c 2 95 215 +62e1e 4 191 246 +62e22 6 95 215 +62e28 a 235 235 +62e32 6 229 235 +62e38 6 69 215 +62e3e 4 211 220 +62e42 4 208 220 +62e46 4 211 220 +62e4a 4 208 220 +62e4e 4 236 220 +62e52 4 235 220 +62e56 4 236 220 +62e5a 2 235 220 +62e5c 8 156 238 +62e64 a 235 235 +62e6e 6 229 235 +62e74 6 69 215 +62e7a a 235 235 +62e84 18 156 238 +62e9c c 271 220 +62ea8 1c 156 238 +FUNC 62ec4 40 0 std::money_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, bool, std::ios_base&, int&, std::string&) const +62ec4 4 304 220 +62ec8 4 304 220 +62ecc 2 307 220 +62ece 4 304 220 +62ed2 6 307 220 +62ed8 26 308 220 +62efe 6 309 220 +FUNC 62f04 104 0 std::money_get > >::do_get(std::istreambuf_iterator >, std::istreambuf_iterator >, bool, std::ios_base&, int&, long double&) const +62f04 6 279 220 +62f0a 2 120 238 +62f0c 2 279 220 +62f0e 2 124 238 +62f10 2 279 220 +62f12 2 124 238 +62f14 8 279 220 +62f1c 2 284 220 +62f1e 4 279 220 +62f22 2 120 238 +62f24 2 481 201 +62f26 4 124 238 +62f2a 4 101 205 +62f2e 2 284 220 +62f30 2 101 205 +62f32 6 283 220 +62f38 26 284 220 +62f5e 4 286 220 +62f62 4 284 220 +62f66 12 286 220 +62f78 c 284 220 +62f84 2 286 220 +62f86 2 66 238 +62f88 2 287 220 +62f8a 4 289 220 +62f8e 2 287 220 +62f90 2 287 220 +62f92 4 289 220 +62f96 2 120 238 +62f98 2 124 238 +62f9a 2 120 238 +62f9c 2 124 238 +62f9e 2 481 201 +62fa0 4 124 238 +62fa4 4 101 205 +62fa8 4 242 223 +62fac 2 101 205 +62fae 14 242 223 +62fc2 6 156 238 +62fc8 6 294 220 +62fce c 295 220 +62fda 8 299 220 +62fe2 6 156 238 +62fe8 8 300 220 +62ff0 6 289 220 +62ff6 12 156 238 +FUNC 63008 28 0 std::priv::_String_base >::~_String_base +63008 2 156 238 +6300a 2 156 238 +6300c 2 64 238 +6300e 4 96 238 +63012 2 96 238 +63014 4 97 238 +63018 4 323 201 +6301c 4 161 201 +63020 4 161 201 +63024 4 156 238 +63028 4 135 222 +6302c 4 156 238 +FUNC 63030 c 0 std::_STLP_mutex::~_STLP_mutex +63030 2 411 240 +63032 2 411 240 +63034 4 342 240 +63038 4 411 240 +FUNC 6303c 34 0 std::__node_alloc_impl::_M_deallocate(void*, unsigned int) +6303c 2 340 175 +6303e 2 340 175 +63040 2 347 240 +63042 2 341 175 +63044 2 347 240 +63046 2 341 175 +63048 6 347 240 +6304e 2 346 175 +63050 2 349 240 +63052 8 346 175 +6305a 4 347 175 +6305e 4 353 175 +63062 e 349 240 +FUNC 63070 18c 0 std::__node_alloc_impl::_S_chunk_alloc(unsigned int, int&) +63070 4 365 175 +63074 4 405 175 +63078 2 387 175 +6307a 2 365 175 +6307c 2 407 175 +6307e 2 365 175 +63080 4 406 175 +63084 4 405 175 +63088 6 407 175 +6308e 4 388 175 +63092 2 387 175 +63094 4 407 175 +63098 2 406 175 +6309a 4 365 175 +6309e 4 377 175 +630a2 2 386 175 +630a4 4 388 175 +630a8 2 389 175 +630aa 2 386 175 +630ac 2 389 175 +630ae 4 388 175 +630b2 2 389 175 +630b4 8 387 175 +630bc 4 388 175 +630c0 4 389 175 +630c4 c 248 175 +630d0 4 392 175 +630d4 6 134 222 +630da 2 395 175 +630dc 2 134 222 +630de 4 395 175 +630e2 2 421 175 +630e4 4 426 175 +630e8 2 421 175 +630ea 2 426 175 +630ec 2 421 175 +630ee 2 426 175 +630f0 6 421 175 +630f6 2 367 175 +630f8 2 370 175 +630fa 4 367 175 +630fe 2 370 175 +63100 4 371 175 +63104 8 373 175 +6310c 8 429 175 +63114 a 378 175 +6311e a 381 175 +63128 2 378 175 +6312a 2 381 175 +6312c 2 382 175 +6312e c 398 175 +6313a 6 404 175 +63140 8 406 175 +63148 6 407 175 +6314e 4 404 175 +63152 4 404 175 +63156 4 405 175 +6315a 4 406 175 +6315e 6 407 175 +63164 6 134 222 +6316a 2 417 175 +6316c 2 367 175 +6316e 4 417 175 +63172 c 398 175 +6317e 2 405 175 +63180 2 408 175 +63182 2 410 175 +63184 2 409 175 +63186 2 410 175 +63188 4 408 175 +6318c 2 409 175 +6318e 2 410 175 +63190 2 409 175 +63192 4 408 175 +63196 2 411 175 +63198 2 410 175 +6319a 6 411 175 +631a0 a 398 175 +631aa 4 407 175 +631ae 4e 398 175 +FUNC 631fc 48 0 std::__node_alloc_impl::_S_refill(unsigned int) +631fc 4 434 175 +63200 4 435 175 +63204 2 434 175 +63206 4 435 175 +6320a 4 436 175 +6320e 6 438 175 +63214 2 440 175 +63216 4 447 175 +6321a 2 440 175 +6321c 2 447 175 +6321e 2 448 175 +63220 4 447 175 +63224 4 448 175 +63228 2 447 175 +6322a 2 450 175 +6322c 2 448 175 +6322e 2 451 175 +63230 2 450 175 +63232 6 448 175 +63238 4 453 175 +6323c 8 455 175 +FUNC 63244 5c 0 std::__node_alloc_impl::_M_allocate(unsigned int&) +63244 2 318 175 +63246 2 318 175 +63248 2 248 175 +6324a 2 347 240 +6324c 6 248 175 +63252 2 347 240 +63254 2 319 175 +63256 2 320 175 +63258 4 347 240 +6325c 2 328 175 +6325e 2 320 175 +63260 8 328 175 +63268 6 329 175 +6326e 8 349 240 +63276 4 338 175 +6327a a 331 175 +63284 1c 349 240 +FUNC 632a0 4 0 std::__node_alloc::_M_allocate(unsigned int&) +632a0 4 743 175 +FUNC 632a4 4 0 std::__node_alloc::_M_deallocate(void*, unsigned int) +632a4 4 746 175 +FUNC 632a8 114 0 _Locale_init +632a8 4 58 176 +632ac 2 58 176 +632ae 4 63 176 +632b2 4 64 176 +632b6 2 58 176 +632b8 2 65 176 +632ba 2 63 176 +632bc 2 66 176 +632be 2 64 176 +632c0 4 67 176 +632c4 2 65 176 +632c6 2 66 176 +632c8 8 63 176 +632d0 c 63 176 +632dc 8 64 176 +632e4 c 64 176 +632f0 4 65 176 +632f4 2 66 176 +632f6 2 65 176 +632f8 a 65 176 +63302 6 66 176 +63308 8 66 176 +63310 8 67 176 +63318 c 67 176 +63324 8 68 176 +6332c c 68 176 +63338 8 69 176 +63340 c 69 176 +6334c 8 70 176 +63354 c 70 176 +63360 8 71 176 +63368 10 71 176 +63378 4 72 176 +6337c e 76 176 +6338a 4 77 176 +6338e 2e 76 176 +FUNC 633cc 74 0 __cxxabiv1::__cxa_type_match +633cc 4 87 157 +633d0 4 93 157 +633d4 4 92 157 +633d8 6 87 157 +633de 2 92 157 +633e0 6 93 157 +633e6 14 93 157 +633fa 2 94 157 +633fc 2 95 157 +633fe 2 94 157 +63400 12 101 157 +63412 2 102 157 +63414 6 111 157 +6341a e 105 157 +63428 4 106 157 +6342c 2 107 157 +6342e 4 90 157 +63432 e 110 157 +FUNC 63440 50 0 __cxxabiv1::__cxa_begin_cleanup +63440 2 134 157 +63442 2 134 157 +63444 4 135 157 +63448 4 139 157 +6344c 4 136 157 +63450 e 139 157 +6345e 4 146 157 +63462 2 139 157 +63464 4 150 157 +63468 a 140 157 +63472 2 141 157 +63474 8 142 157 +6347c 2 143 157 +6347e 12 150 157 +FUNC 63490 50 0 __cxxabiv1::helper_end_cleanup +63490 2 152 157 +63492 4 153 157 +63496 2 154 157 +63498 2 156 157 +6349a 14 160 157 +634ae 4 167 157 +634b2 4 170 157 +634b6 2 171 157 +634b8 6 161 157 +634be 4 162 157 +634c2 4 163 157 +634c6 4 170 157 +634ca 2 164 157 +634cc 2 171 157 +634ce 12 157 157 +FUNC 634e0 104 0 __cxxabiv1::__cxa_call_unexpected +634e0 6 187 157 +634e6 6 192 157 +634ec 2 187 157 +634ee 4 192 157 +634f2 2 187 157 +634f4 8 192 157 +634fc 2 187 157 +634fe 2 193 157 +63500 2 192 157 +63502 4 193 157 +63506 4 195 157 +6350a 4 204 157 +6350e 2 205 157 +63510 2 207 157 +63512 4 209 157 +63516 6 126 157 +6351c 4 127 157 +63520 4 196 157 +63524 4 197 157 +63528 4 212 157 +6352c 4 216 157 +63530 4 217 157 +63534 2 214 157 +63536 4 216 157 +6353a 8 218 157 +63542 4 221 157 +63546 4 226 157 +6354a 2 221 157 +6354c 4 226 157 +63550 4 222 157 +63554 6 226 157 +6355a 2 223 157 +6355c 4 233 157 +63560 2 230 157 +63562 a 233 157 +6356c 4 216 157 +63570 8 234 157 +63578 4 216 157 +6357c 8 196 157 +63584 4 227 157 +63588 8 212 157 +63590 6 239 157 +63596 4 240 157 +6359a 4 241 157 +6359e 1a 242 157 +635b8 6 118 157 +635be 4 119 157 +635c2 4 120 157 +635c6 4 121 157 +635ca 1a 120 157 +FUNC 635e8 18 0 __cxxabiv1::__class_type_info::~__class_type_info +635e8 4 34 158 +635ec 8 34 158 +635f4 c 36 158 +FUNC 63600 12 0 __cxxabiv1::__class_type_info::~__class_type_info +63600 2 34 158 +63602 2 34 158 +63604 4 36 158 +63608 6 36 158 +6360e 4 36 158 +FUNC 63614 1e 0 __cxxabiv1::__class_type_info::self_class_type_match(__cxxabiv1::__class_type_info const*, void*&, __cxxabiv1::__UpcastInfo&) const +63614 2 69 158 +63616 6 69 158 +6361c 6 70 158 +63622 2 71 158 +63624 2 72 158 +63626 2 73 158 +63628 2 75 158 +6362a 2 71 158 +6362c 2 74 158 +6362e 2 73 158 +63630 2 79 158 +FUNC 63634 4 0 __cxxabiv1::__class_type_info::walk_to(__cxxabiv1::__class_type_info const*, void*&, __cxxabiv1::__UpcastInfo&) const +63634 4 64 158 +FUNC 63638 38 0 __cxxabiv1::__UpcastInfo::__UpcastInfo +63638 2 82 158 +6363a 4 84 158 +6363e 2 82 158 +63640 a 84 158 +6364a 4 87 158 +6364e 2 87 158 +63650 4 87 158 +63654 a 87 158 +6365e 2 86 158 +63660 4 88 158 +63664 c 90 158 +FUNC 63670 68 0 __cxxabiv1::__class_type_info::can_catch(__cxxabiv1::__shim_type_info const*, void*&) const +63670 6 39 158 +63676 6 39 158 +6367c 6 40 158 +63682 2 41 158 +63684 2 40 158 +63686 2 47 158 +63688 4 45 158 +6368c 2 45 158 +6368e 2 45 158 +63690 6 45 158 +63696 2 45 158 +63698 6 45 158 +6369e 6 46 158 +636a4 8 50 158 +636ac 10 51 158 +636bc 4 53 158 +636c0 4 57 158 +636c4 2 54 158 +636c6 2 57 158 +636c8 10 59 158 +FUNC 636d8 24 0 __cxxabiv1::readULEB128 +636d8 2 56 162 +636da 2 58 162 +636dc 4 57 162 +636e0 4 62 162 +636e4 6 63 162 +636ea 2 64 162 +636ec 2 61 162 +636ee 4 63 162 +636f2 2 61 162 +636f4 2 66 162 +636f6 6 68 162 +FUNC 636fc 3e 0 __cxxabiv1::readSLEB128(unsigned char const**) +636fc 2 70 162 +636fe 2 72 162 +63700 2 77 162 +63702 2 71 162 +63704 4 76 162 +63708 6 77 162 +6370e 2 78 162 +63710 4 75 162 +63714 4 77 162 +63718 2 75 162 +6371a 2 81 162 +6371c 2 80 162 +6371e c 81 162 +6372a a 82 162 +63734 6 85 162 +FUNC 6373c 19a 0 __cxxabiv1::readEncodedPointer(unsigned char const**, unsigned char) +6373c 2 146 162 +6373e 8 144 162 +63746 2 144 162 +63748 4 146 162 +6374c 2 149 162 +6374e 4 151 162 +63752 2 149 162 +63754 16 151 162 +6376a 2 102 162 +6376c 2 183 162 +6376e e 102 162 +6377c 2 183 162 +6377e 6 102 162 +63784 a 191 162 +6378e 4 193 162 +63792 2 198 162 +63794 4 208 162 +63798 6 210 162 +6379e 4 199 162 +637a2 10 205 162 +637b2 4 206 162 +637b6 58 120 162 +6380e 2 175 162 +63810 c 120 162 +6381c 2 174 162 +6381e 2 175 162 +63820 2 176 162 +63822 6 163 162 +63828 2 164 162 +6382a a 90 162 +63834 2 179 162 +63836 2 178 162 +63838 2 180 162 +6383a 4 151 162 +6383e 4 62 162 +63842 6 63 162 +63848 2 64 162 +6384a 2 61 162 +6384c 4 63 162 +63850 2 61 162 +63852 2 187 162 +63854 2 188 162 +63856 8 90 162 +6385e 4 166 162 +63862 2 167 162 +63864 2 168 162 +63866 58 120 162 +638be 2 187 162 +638c0 c 120 162 +638cc 2 186 162 +638ce 4 187 162 +638d2 4 147 162 +FUNC 638d8 dc 0 walk_object +638d8 c 119 163 +638e4 a 120 163 +638ee 2 123 163 +638f0 4 120 163 +638f4 10 123 163 +63904 2 158 163 +63906 6 176 163 +6390c 6 173 163 +63912 2 175 163 +63914 c 173 163 +63920 6 176 163 +63926 2 146 163 +63928 4 57 163 +6392c 6 146 163 +63932 2 145 163 +63934 6 107 160 +6393a 4 148 163 +6393e 2 113 160 +63940 2 103 163 +63942 4 155 163 +63946 6 107 163 +6394c 2 155 163 +6394e 2 48 163 +63950 4 155 163 +63954 4 157 163 +63958 2 159 163 +6395a 6 161 163 +63960 6 165 163 +63966 4 146 163 +6396a 6 146 163 +63970 8 176 163 +63978 4 161 163 +6397c 4 135 163 +63980 6 166 163 +63986 12 121 163 +63998 a 121 163 +639a2 12 145 163 +FUNC 639b4 dc 0 base_to_derived_cast +639b4 4 200 163 +639b8 4 200 163 +639bc 4 205 163 +639c0 2 200 163 +639c2 2 204 163 +639c4 4 205 163 +639c8 2 206 163 +639ca 4 207 163 +639ce 6 209 163 +639d4 12 221 163 +639e6 14 261 163 +639fa 6 263 163 +63a00 2 243 163 +63a02 4 57 163 +63a06 4 243 163 +63a0a 2 243 163 +63a0c 2 243 163 +63a0e 4 107 160 +63a12 2 243 163 +63a14 2 251 163 +63a16 2 107 160 +63a18 4 245 163 +63a1c 4 113 160 +63a20 2 245 163 +63a22 2 103 163 +63a24 4 251 163 +63a28 6 107 163 +63a2e 2 48 163 +63a30 4 251 163 +63a34 8 254 163 +63a3c 2 243 163 +63a3e 4 243 163 +63a42 4 243 163 +63a46 6 209 163 +63a4c 8 211 163 +63a54 4 209 163 +63a58 4 213 163 +63a5c 2 215 163 +63a5e 2 263 163 +63a60 2 215 163 +63a62 c 216 163 +63a6e 2 214 163 +63a70 2 263 163 +63a72 6 214 163 +63a78 18 232 163 +FUNC 63a90 96 0 __cxxabiv1::__dynamic_cast +63a90 6 293 163 +63a96 2 77 163 +63a98 6 293 163 +63a9e 2 293 163 +63aa0 2 303 163 +63aa2 4 48 163 +63aa6 2 303 163 +63aa8 4 48 163 +63aac 2 66 163 +63aae 2 303 163 +63ab0 4 66 163 +63ab4 8 303 163 +63abc 4 304 163 +63ac0 4 318 163 +63ac4 2 322 163 +63ac6 4 48 163 +63aca 10 322 163 +63ada c 193 163 +63ae6 2 329 163 +63ae8 a 330 163 +63af2 8 335 163 +63afa 2 349 163 +63afc 4 348 163 +63b00 c 353 163 +63b0c 8 354 163 +63b14 6 355 163 +63b1a c 333 163 +FUNC 63b28 64 0 __cxa_guard_acquire +63b28 2 60 168 +63b2a 2 60 168 +63b2c a 61 168 +63b36 2 66 168 +63b38 4 67 168 +63b3c 6 76 168 +63b42 4 88 168 +63b46 4 76 168 +63b4a 4 87 168 +63b4e 2 88 168 +63b50 2 87 168 +63b52 6 88 168 +63b58 2 66 168 +63b5a 4 67 168 +63b5e 8 69 168 +63b66 4 70 168 +63b6a 2 80 168 +63b6c 6 79 168 +63b72 6 80 168 +63b78 14 81 168 +FUNC 63b8c 38 0 __cxa_guard_release +63b8c 2 94 168 +63b8e 2 93 168 +63b90 2 94 168 +63b92 2 93 168 +63b94 6 94 168 +63b9a 2 96 168 +63b9c 4 98 168 +63ba0 4 99 168 +63ba4 8 100 168 +63bac 4 102 168 +63bb0 4 103 168 +63bb4 10 102 168 +FUNC 63bc4 38 0 __cxa_guard_abort +63bc4 2 107 168 +63bc6 2 106 168 +63bc8 2 107 168 +63bca 2 106 168 +63bcc 6 107 168 +63bd2 2 109 168 +63bd4 4 110 168 +63bd8 4 111 168 +63bdc 8 112 168 +63be4 4 114 168 +63be8 4 115 168 +63bec 10 114 168 +FUNC 63bfc 4 0 __cxxabiv1::__vmi_class_type_info::code() const +63bfc 4 198 160 +FUNC 63c00 18 0 __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info +63c00 4 35 173 +63c04 8 35 173 +63c0c c 37 173 +FUNC 63c18 12 0 __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info +63c18 2 35 173 +63c1a 2 35 173 +63c1c 4 37 173 +63c20 6 37 173 +63c26 4 37 173 +FUNC 63c2c 1a8 0 __cxxabiv1::__vmi_class_type_info::walk_to(__cxxabiv1::__class_type_info const*, void*&, __cxxabiv1::__UpcastInfo&) const +63c2c 6 41 173 +63c32 8 41 173 +63c3a a 42 173 +63c44 4 46 173 +63c48 4 46 173 +63c4c 2 143 173 +63c4e 2 46 173 +63c50 2 46 173 +63c52 1e 143 173 +63c70 8 47 173 +63c78 4 113 160 +63c7c 4 48 173 +63c80 2 113 160 +63c82 4 49 173 +63c86 2 48 173 +63c88 4 103 160 +63c8c 4 107 160 +63c90 2 55 173 +63c92 2 113 160 +63c94 6 56 173 +63c9a 4 59 173 +63c9e 4 61 173 +63ca2 6 65 173 +63ca8 6 65 173 +63cae 10 74 173 +63cbe 6 82 173 +63cc4 4 83 173 +63cc8 6 86 173 +63cce 6 92 173 +63cd4 6 111 173 +63cda 6 114 173 +63ce0 6 120 173 +63ce6 c 138 173 +63cf2 6 143 173 +63cf8 6 143 173 +63cfe 4 146 173 +63d02 2 148 173 +63d04 4 147 173 +63d08 6 157 173 +63d0e 6 92 173 +63d14 a 93 173 +63d1e 6 94 173 +63d24 2 46 173 +63d26 6 46 173 +63d2c 4 46 173 +63d30 a 156 173 +63d3a 8 88 173 +63d42 6 120 173 +63d48 6 121 173 +63d4e 8 121 173 +63d56 e 126 173 +63d64 4 43 173 +63d68 14 138 173 +63d7c 18 111 173 +63d94 12 143 173 +63da6 2e 94 173 +FUNC 63dd4 12 0 std::priv::stdio_streambuf_base::sync() +63dd4 2 144 195 +63dd6 8 145 195 +63dde 6 145 195 +63de4 2 146 195 +FUNC 63de8 2c 0 std::priv::stdio_streambuf_base::~stdio_streambuf_base +63de8 4 60 195 +63dec 6 60 195 +63df2 2 61 195 +63df4 2 60 195 +63df6 4 61 195 +63dfa 1a 62 195 +FUNC 63e14 18 0 std::priv::stdio_ostreambuf::~stdio_ostreambuf +63e14 4 198 195 +63e18 14 198 195 +FUNC 63e2c 12 0 std::priv::stdio_ostreambuf::~stdio_ostreambuf +63e2c 2 198 195 +63e2e 6 198 195 +63e34 6 198 195 +63e3a 4 198 195 +FUNC 63e40 18 0 std::priv::stdio_istreambuf::~stdio_istreambuf +63e40 4 151 195 +63e44 14 151 195 +FUNC 63e58 12 0 std::priv::stdio_istreambuf::~stdio_istreambuf +63e58 2 151 195 +63e5a 6 151 195 +63e60 6 151 195 +63e66 4 151 195 +FUNC 63e6c 12 0 std::priv::stdio_streambuf_base::~stdio_streambuf_base +63e6c 2 60 195 +63e6e 2 60 195 +63e70 4 62 195 +63e74 6 62 195 +63e7a 4 62 195 +FUNC 63e80 6 0 std::priv::stdio_istreambuf::uflow() +63e80 2 175 195 +63e82 4 175 195 +FUNC 63e88 1a 0 std::priv::stdio_istreambuf::underflow() +63e88 2 157 195 +63e8a 2 157 195 +63e8c 6 161 195 +63e92 2 163 195 +63e94 2 161 195 +63e96 2 163 195 +63e98 6 164 195 +63e9e 4 169 195 +FUNC 63ea4 36 0 std::priv::stdio_streambuf_base::seekpos(std::fpos, int) +63ea4 4 114 195 +63ea8 2 141 195 +63eaa 2 138 195 +63eac 4 114 195 +63eb0 4 138 195 +63eb4 2 141 195 +63eb6 4 114 195 +63eba 6 141 195 +63ec0 a 89 246 +63eca 6 142 195 +63ed0 a 141 195 +FUNC 63edc 1c 0 std::priv::stdio_streambuf_base::setbuf(char*, int) +63edc 2 64 195 +63ede 4 64 195 +63ee2 8 70 195 +63eea 4 70 195 +63eee 2 70 195 +63ef0 4 70 195 +63ef4 4 73 195 +FUNC 63ef8 4c 0 std::priv::stdio_streambuf_base::seekoff(long, int, int) +63ef8 2 79 195 +63efa 6 77 195 +63f00 4 77 195 +63f04 a 79 195 +63f0e a 89 246 +63f18 6 110 195 +63f1e 2 81 195 +63f20 c 93 195 +63f2c 8 95 195 +63f34 8 89 246 +63f3c 2 87 195 +63f3e 2 88 195 +63f40 4 84 195 +FUNC 63f44 40 0 std::priv::stdio_ostreambuf::overflow(int) +63f44 2 203 195 +63f46 2 205 195 +63f48 2 203 195 +63f4a 2 205 195 +63f4c 6 227 195 +63f52 4 231 195 +63f56 4 227 195 +63f5a 4 207 195 +63f5e 2 208 195 +63f60 4 182 246 +63f64 2 208 195 +63f66 4 231 195 +63f6a 6 209 195 +63f70 6 211 195 +63f76 a 182 246 +63f80 4 231 195 +FUNC 63f84 24 0 std::priv::stdio_istreambuf::pbackfail(int) +63f84 2 181 195 +63f86 2 180 195 +63f88 2 181 195 +63f8a 6 182 195 +63f90 4 182 195 +63f94 2 88 235 +63f96 6 186 195 +63f9c 8 91 235 +63fa4 2 191 195 +63fa6 2 193 195 +FUNC 63fa8 3c 0 std::priv::stdio_streambuf_base::stdio_streambuf_base +63fa8 2 34 234 +63faa 2 55 195 +63fac 2 34 234 +63fae 2 55 195 +63fb0 e 34 234 +63fbe 2 55 195 +63fc0 c 34 234 +63fcc 4 57 195 +63fd0 2 58 195 +63fd2 6 57 195 +63fd8 c 58 195 +FUNC 63fe4 e 0 std::codecvt::do_length(mbstate_t&, char const*, char const*, unsigned int) const +FUNC 63fe4 e 0 std::codecvt::do_length(mbstate_t&, char const*, char const*, unsigned int) const +63fe4 e 132 177 +FUNC 63ff4 8 0 std::codecvt::do_unshift(mbstate_t&, char*, char*, char*&) const +FUNC 63ff4 8 0 std::codecvt::do_unshift(mbstate_t&, char*, char*, char*&) const +63ff4 2 118 177 +63ff6 6 52 177 +FUNC 63ffc e 0 std::codecvt::do_in(mbstate_t&, char const*, char const*, char const*&, char*, char*, char*&) const +FUNC 63ffc e 0 std::codecvt::do_out(mbstate_t&, char const*, char const*, char const*&, char*, char*, char*&) const +63ffc e 72 177 +FUNC 6400c 3e 0 std::codecvt::do_out(mbstate_t&, wchar_t const*, wchar_t const*, wchar_t const*&, char*, char*, char*&) const +6400c 2 89 177 +6400e 2 90 177 +64010 2 89 177 +64012 6 90 177 +64018 6 91 177 +6401e 4 213 200 +64022 2 213 200 +64024 4 213 200 +64028 2 213 200 +6402a 4 83 177 +6402e 8 214 200 +64036 4 213 200 +6403a 2 92 177 +6403c 2 93 177 +6403e 2 95 177 +64040 2 92 177 +64042 4 93 177 +64046 4 95 177 +FUNC 6404c 3c 0 std::codecvt::do_in(mbstate_t&, char const*, char const*, char const*&, wchar_t*, wchar_t*, wchar_t*&) const +6404c 2 104 177 +6404e 2 105 177 +64050 2 104 177 +64052 6 105 177 +64058 8 107 177 +64060 2 213 200 +64062 4 213 200 +64066 4 98 177 +6406a 4 214 200 +6406e 2 213 200 +64070 4 214 200 +64074 2 213 200 +64076 2 108 177 +64078 4 109 177 +6407c 2 111 177 +6407e 2 108 177 +64080 4 109 177 +64084 4 111 177 +FUNC 64088 1c 0 std::codecvt::~codecvt +64088 4 79 177 +6408c 18 79 177 +FUNC 640a4 12 0 std::codecvt::~codecvt +640a4 2 79 177 +640a6 6 79 177 +640ac 6 79 177 +640b2 4 79 177 +FUNC 640b8 1c 0 std::codecvt::~codecvt +640b8 4 28 177 +640bc 18 28 177 +FUNC 640d4 12 0 std::codecvt::~codecvt +640d4 2 28 177 +640d6 6 28 177 +640dc 6 28 177 +640e2 4 28 177 +FUNC 640e8 18 0 std::collate::do_hash(char const*, char const*) const +640e8 6 37 178 +640ee 8 38 178 +640f6 2 37 178 +640f8 2 38 178 +640fa 4 37 178 +640fe 2 40 178 +FUNC 64100 66 0 std::collate::do_compare(wchar_t const*, wchar_t const*, wchar_t const*, wchar_t const*) const +64100 2 50 178 +64102 2 80 199 +64104 2 50 178 +64106 10 80 199 +64116 8 81 199 +6411e a 85 199 +64128 c 81 199 +64134 2 85 199 +64136 2 87 199 +64138 2 88 199 +6413a 14 80 199 +6414e 4 90 199 +64152 6 91 199 +64158 4 50 178 +6415c 6 94 199 +64162 4 86 199 +FUNC 64168 18 0 std::collate::do_hash(wchar_t const*, wchar_t const*) const +64168 6 57 178 +6416e 8 58 178 +64176 2 57 178 +64178 2 58 178 +6417a 4 57 178 +6417e 2 60 178 +FUNC 64180 1c 0 std::collate::~collate +64180 4 45 178 +64184 18 45 178 +FUNC 6419c 12 0 std::collate::~collate +6419c 2 45 178 +6419e 6 45 178 +641a4 6 45 178 +641aa 4 45 178 +FUNC 641b0 1c 0 std::collate::~collate +641b0 4 26 178 +641b4 18 26 178 +FUNC 641cc 12 0 std::collate::~collate +641cc 2 26 178 +641ce 6 26 178 +641d4 6 26 178 +641da 4 26 178 +FUNC 641e0 2a 0 std::collate::do_compare(char const*, char const*, char const*, char const*) const +641e0 2 30 178 +641e2 2 625 200 +641e4 2 626 200 +641e6 4 627 200 +641ea 2 626 200 +641ec c 627 200 +641f8 2 629 200 +641fa 4 629 200 +641fe 2 629 200 +64200 2 629 200 +64202 2 30 178 +64204 6 629 200 +FUNC 6420c 4c 0 std::collate::do_transform(char const*, char const*) const +6420c 2 33 178 +6420e 2 33 178 +64210 2 355 216 +64212 2 112 238 +64214 2 324 237 +64216 2 481 201 +64218 4 33 178 +6421c 4 324 237 +64220 2 107 243 +64222 2 66 238 +64224 2 107 243 +64226 8 106 243 +6422e 2 107 243 +64230 2 325 237 +64232 4 101 205 +64236 4 33 178 +6423a 2 64 238 +6423c 4 96 238 +64240 2 96 238 +64242 4 97 238 +64246 4 161 201 +6424a 4 135 222 +6424e a 161 201 +FUNC 64258 52 0 std::collate::do_transform(wchar_t const*, wchar_t const*) const +64258 2 53 178 +6425a 2 355 216 +6425c 4 53 178 +64260 2 355 216 +64262 2 112 238 +64264 2 481 201 +64266 2 324 237 +64268 2 53 178 +6426a 4 324 237 +6426e 2 107 243 +64270 2 66 238 +64272 2 107 243 +64274 8 106 243 +6427c 2 107 243 +6427e 2 325 237 +64280 4 101 205 +64284 4 53 178 +64288 2 64 238 +6428a 4 96 238 +6428e 2 96 238 +64290 4 97 238 +64294 4 323 201 +64298 4 161 201 +6429c 4 135 222 +642a0 a 161 201 +FUNC 642ac c 0 std::ctype::do_toupper(char) const +642ac 4 342 179 +642b0 2 342 179 +642b2 6 342 179 +FUNC 642b8 c 0 std::ctype::do_tolower(char) const +642b8 4 344 179 +642bc 2 344 179 +642be 6 344 179 +FUNC 642c4 1c 0 std::ctype::do_toupper(char*, char const*) const +642c4 6 347 179 +642ca a 348 179 +642d4 4 347 179 +642d8 8 350 179 +FUNC 642e0 1c 0 std::ctype::do_tolower(char*, char const*) const +642e0 6 352 179 +642e6 a 353 179 +642f0 4 352 179 +642f4 8 355 179 +FUNC 642fc 4 0 std::ctype::do_narrow(char, char) const +FUNC 642fc 4 0 std::ctype::do_widen(char) const +642fc 4 456 179 +FUNC 642fc 4 0 std::ctype::do_widen(char) const +FUNC 64300 14 0 std::ctype::do_toupper(wchar_t) const +64300 4 426 179 +64304 6 425 179 +6430a a 427 179 +FUNC 64314 24 0 std::ctype::do_toupper(wchar_t*, wchar_t const*) const +64314 4 431 179 +64318 4 433 179 +6431c 4 432 179 +64320 2 434 179 +64322 4 433 179 +64326 2 431 179 +64328 4 434 179 +6432c 2 431 179 +6432e a 437 179 +FUNC 64338 14 0 std::ctype::do_tolower(wchar_t) const +64338 4 441 179 +6433c 6 440 179 +64342 a 442 179 +FUNC 6434c 24 0 std::ctype::do_tolower(wchar_t*, wchar_t const*) const +6434c 4 446 179 +64350 4 448 179 +64354 4 447 179 +64358 2 449 179 +6435a 4 448 179 +6435e 2 446 179 +64360 4 449 179 +64364 2 446 179 +64366 a 452 179 +FUNC 64370 12 0 std::ctype::do_widen(char const*, char const*, wchar_t*) const +64370 2 460 179 +64372 8 462 179 +6437a 4 461 179 +6437e 4 464 179 +FUNC 64384 c 0 std::ctype::do_narrow(wchar_t, char) const +64384 2 467 179 +64386 8 467 179 +6438e 2 467 179 +FUNC 64390 24 0 std::ctype::do_narrow(wchar_t const*, wchar_t const*, char, char*) const +64390 2 472 179 +64392 2 471 179 +64394 2 471 179 +64396 2 472 179 +64398 4 473 179 +6439c 2 474 179 +6439e 8 474 179 +643a6 2 472 179 +643a8 4 474 179 +643ac 2 472 179 +643ae 6 478 179 +FUNC 643b4 1c 0 std::ctype::~ctype +643b4 4 391 179 +643b8 18 391 179 +FUNC 643d0 12 0 std::ctype::~ctype +643d0 2 391 179 +643d2 6 391 179 +643d8 6 391 179 +643de 4 391 179 +FUNC 643e4 12 0 std::ctype::do_narrow(char const*, char const*, char, char*) const +643e4 2 370 179 +643e6 2 370 179 +643e8 4 224 200 +643ec 6 224 200 +643f2 4 373 179 +FUNC 643f8 12 0 std::ctype::do_widen(char const*, char const*, char*) const +643f8 2 362 179 +643fa 2 362 179 +643fc 4 224 200 +64400 6 224 200 +64406 4 365 179 +FUNC 6440c 28 0 std::ctype::~ctype +6440c 2 322 179 +6440e 2 323 179 +64410 6 322 179 +64416 6 322 179 +6441c 2 323 179 +6441e 4 324 179 +64422 4 324 179 +64426 e 325 179 +FUNC 64434 12 0 std::ctype::~ctype +64434 2 322 179 +64436 2 322 179 +64438 4 325 179 +6443c 6 325 179 +64442 4 325 179 +FUNC 64448 c 0 std::ctype::classic_table() +64448 4 192 179 +6444c 8 193 179 +FUNC 64454 2a 0 std::ctype::do_is(wchar_t const*, wchar_t const*, std::ctype_base::mask*) const +64454 2 400 179 +64456 6 400 179 +6445c 4 402 179 +64460 4 404 179 +64464 4 405 179 +64468 2 406 179 +6446a 2 406 179 +6446c 6 406 179 +64472 2 404 179 +64474 4 406 179 +64478 2 404 179 +6447a 4 409 179 +FUNC 64480 20 0 std::ctype::do_is(std::ctype_base::mask, wchar_t) const +64480 2 394 179 +64482 4 394 179 +64486 4 395 179 +6448a 4 396 179 +6448e 4 396 179 +64492 a 394 179 +6449c 2 396 179 +6449e 2 397 179 +FUNC 644a0 44 0 std::ctype::ctype +644a0 2 86 218 +644a2 2 316 179 +644a4 2 316 179 +644a6 4 86 218 +644aa 4 340 240 +644ae 2 457 240 +644b0 2 316 179 +644b2 2 340 240 +644b4 2 316 179 +644b6 4 340 240 +644ba 2 86 218 +644bc a 319 179 +644c6 2 319 179 +644c8 2 319 179 +644ca 2 319 179 +644cc 2 319 179 +644ce 4 320 179 +644d2 4 319 179 +644d6 2 319 179 +644d8 2 319 179 +644da 2 320 179 +644dc 2 319 179 +644de 6 320 179 +FUNC 644e4 aa 0 wchar_t const* std::find_if(wchar_t const*, wchar_t const*, std::_Ctype_w_is_mask) +644e4 2 162 199 +644e6 2 214 199 +644e8 4 162 199 +644ec 2 164 199 +644ee 4 217 199 +644f2 2 164 199 +644f4 2 165 199 +644f6 4 385 179 +644fa 8 385 179 +64502 4 218 199 +64506 2 168 199 +64508 2 214 199 +6450a 4 385 179 +6450e 8 385 179 +64516 4 166 199 +6451a 2 171 199 +6451c 4 385 179 +64520 8 385 179 +64528 4 171 199 +6452c 2 174 199 +6452e 4 385 179 +64532 8 385 179 +6453a 4 174 199 +6453e 2 214 199 +64540 8 164 199 +64548 c 178 199 +64554 4 190 199 +64558 2 180 199 +6455a 4 385 179 +6455e 2 181 199 +64560 2 183 199 +64562 4 385 179 +64566 2 184 199 +64568 2 186 199 +6456a 4 385 179 +6456e 4 385 179 +64572 8 190 199 +6457a 14 385 179 +FUNC 64590 22 0 std::ctype::do_scan_is(std::ctype_base::mask, wchar_t const*, wchar_t const*) const +64590 4 413 179 +64594 6 413 179 +6459a c 414 179 +645a6 4 383 179 +645aa 4 414 179 +645ae 4 415 179 +FUNC 645b4 ce 0 wchar_t const* std::find_if >(wchar_t const*, wchar_t const*, std::unary_negate) +645b4 2 162 199 +645b6 2 214 199 +645b8 4 162 199 +645bc 2 164 199 +645be 4 217 199 +645c2 2 164 199 +645c4 2 481 179 +645c6 4 385 179 +645ca 8 385 179 +645d2 2 481 179 +645d4 2 166 199 +645d6 6 385 179 +645dc 2 166 199 +645de 2 385 179 +645e0 8 385 179 +645e8 2 481 179 +645ea 4 385 179 +645ee 8 385 179 +645f6 2 481 179 +645f8 4 385 179 +645fc 4 385 179 +64600 4 214 199 +64604 4 385 179 +64608 4 164 199 +6460c 2 481 179 +6460e 4 385 179 +64612 4 385 179 +64616 4 214 199 +6461a 4 385 179 +6461e 2 481 179 +64620 2 385 179 +64622 2 166 199 +64624 4 385 179 +64628 2 166 199 +6462a 4 218 199 +6462e 4 164 199 +64632 a 178 199 +6463c 4 190 199 +64640 2 178 199 +64642 2 481 179 +64644 4 385 179 +64648 4 385 179 +6464c 8 190 199 +64654 6 171 199 +6465a 6 174 199 +64660 2 481 179 +64662 4 385 179 +64666 8 385 179 +6466e 2 181 199 +64670 2 481 179 +64672 4 385 179 +64676 8 385 179 +6467e 4 184 199 +FUNC 64684 22 0 std::ctype::do_scan_not(std::ctype_base::mask, wchar_t const*, wchar_t const*) const +64684 4 420 179 +64688 6 420 179 +6468e 4 421 179 +64692 4 421 179 +64696 2 146 209 +64698 2 421 179 +6469a 2 421 179 +6469c 2 146 209 +6469e 4 421 179 +646a2 4 422 179 +FUNC 646a8 4 0 std::moneypunct::do_decimal_point() const +FUNC 646a8 4 0 std::moneypunct::do_thousands_sep() const +FUNC 646a8 4 0 std::moneypunct::do_decimal_point() const +646a8 4 53 189 +FUNC 646a8 4 0 std::moneypunct::do_thousands_sep() const +FUNC 646a8 4 0 std::moneypunct::do_decimal_point() const +FUNC 646a8 4 0 std::moneypunct::do_thousands_sep() const +FUNC 646a8 4 0 std::moneypunct::do_decimal_point() const +FUNC 646a8 4 0 std::moneypunct::do_thousands_sep() const +FUNC 646ac 2c 0 std::moneypunct::do_pos_format() const +646ac 2 73 189 +646ae 2 114 189 +646b0 4 114 189 +646b4 1c 114 189 +646d0 8 94 189 +FUNC 646ac 2c 0 std::moneypunct::do_pos_format() const +FUNC 646ac 2c 0 std::moneypunct::do_pos_format() const +FUNC 646ac 2c 0 std::moneypunct::do_pos_format() const +FUNC 646d8 2c 0 std::moneypunct::do_neg_format() const +646d8 2 59 189 +646da 2 59 189 +646dc 4 96 189 +646e0 1c 116 189 +646fc 8 59 189 +FUNC 646d8 2c 0 std::moneypunct::do_neg_format() const +FUNC 646d8 2c 0 std::moneypunct::do_neg_format() const +FUNC 646d8 2c 0 std::moneypunct::do_neg_format() const +FUNC 64704 1c 0 std::moneypunct::~moneypunct +64704 4 100 189 +64708 18 100 189 +FUNC 64720 12 0 std::moneypunct::~moneypunct +64720 2 100 189 +64722 6 100 189 +64728 6 100 189 +6472e 4 100 189 +FUNC 64734 1c 0 std::moneypunct::~moneypunct +64734 4 80 189 +64738 18 80 189 +FUNC 64750 12 0 std::moneypunct::~moneypunct +64750 2 80 189 +64752 6 80 189 +64758 6 80 189 +6475e 4 80 189 +FUNC 64764 1c 0 std::moneypunct::~moneypunct +64764 4 64 189 +64768 18 64 189 +FUNC 64780 12 0 std::moneypunct::~moneypunct +64780 2 64 189 +64782 6 64 189 +64788 6 64 189 +6478e 4 64 189 +FUNC 64794 1c 0 std::moneypunct::~moneypunct +64794 4 50 189 +64798 18 50 189 +FUNC 647b0 12 0 std::moneypunct::~moneypunct +647b0 2 50 189 +647b2 6 50 189 +647b8 6 50 189 +647be 4 50 189 +FUNC 647c4 44 0 std::moneypunct::moneypunct +647c4 2 48 189 +647c6 2 48 189 +647c8 2 340 240 +647ca 2 48 189 +647cc 2 86 218 +647ce 4 340 240 +647d2 4 86 218 +647d6 2 457 240 +647d8 4 340 240 +647dc 2 86 218 +647de 2 28 189 +647e0 2 27 189 +647e2 4 48 189 +647e6 2 29 189 +647e8 2 30 189 +647ea 2 48 189 +647ec 2 28 189 +647ee 2 33 189 +647f0 2 49 189 +647f2 2 27 189 +647f4 2 48 189 +647f6 2 29 189 +647f8 2 30 189 +647fa 2 32 189 +647fc 2 34 189 +647fe 2 35 189 +64800 8 49 189 +FUNC 64808 44 0 std::moneypunct::moneypunct +64808 2 62 189 +6480a 2 62 189 +6480c 2 340 240 +6480e 2 62 189 +64810 2 86 218 +64812 4 340 240 +64816 4 86 218 +6481a 2 457 240 +6481c 4 340 240 +64820 2 86 218 +64822 2 28 189 +64824 2 27 189 +64826 4 62 189 +6482a 2 29 189 +6482c 2 30 189 +6482e 2 62 189 +64830 2 28 189 +64832 2 33 189 +64834 2 63 189 +64836 2 27 189 +64838 2 62 189 +6483a 2 29 189 +6483c 2 30 189 +6483e 2 32 189 +64840 2 34 189 +64842 2 35 189 +64844 8 63 189 +FUNC 6484c 44 0 std::moneypunct::moneypunct +6484c 2 78 189 +6484e 2 78 189 +64850 2 340 240 +64852 2 78 189 +64854 2 86 218 +64856 4 340 240 +6485a 4 86 218 +6485e 2 457 240 +64860 4 340 240 +64864 2 86 218 +64866 2 28 189 +64868 2 27 189 +6486a 4 78 189 +6486e 2 29 189 +64870 2 30 189 +64872 2 78 189 +64874 2 28 189 +64876 2 33 189 +64878 2 79 189 +6487a 2 27 189 +6487c 2 78 189 +6487e 2 29 189 +64880 2 30 189 +64882 2 32 189 +64884 2 34 189 +64886 2 35 189 +64888 8 79 189 +FUNC 64890 44 0 std::moneypunct::moneypunct +64890 2 98 189 +64892 2 98 189 +64894 2 340 240 +64896 2 98 189 +64898 2 86 218 +6489a 4 340 240 +6489e 4 86 218 +648a2 2 457 240 +648a4 4 340 240 +648a8 2 86 218 +648aa 2 28 189 +648ac 2 27 189 +648ae 4 98 189 +648b2 2 29 189 +648b4 2 30 189 +648b6 2 98 189 +648b8 2 28 189 +648ba 2 33 189 +648bc 2 99 189 +648be 2 27 189 +648c0 2 98 189 +648c2 2 29 189 +648c4 2 30 189 +648c6 2 32 189 +648c8 2 34 189 +648ca 2 35 189 +648cc 8 99 189 +FUNC 648d4 1c 0 std::moneypunct::do_curr_symbol() const +FUNC 648d4 1c 0 std::moneypunct::do_grouping() const +648d4 6 56 189 +648da 16 104 189 +FUNC 648d4 1c 0 std::moneypunct::do_negative_sign() const +FUNC 648d4 1c 0 std::moneypunct::do_positive_sign() const +FUNC 648d4 1c 0 std::moneypunct::do_curr_symbol() const +FUNC 648d4 1c 0 std::moneypunct::do_grouping() const +FUNC 648d4 1c 0 std::moneypunct::do_negative_sign() const +FUNC 648d4 1c 0 std::moneypunct::do_positive_sign() const +FUNC 648d4 1c 0 std::moneypunct::do_grouping() const +FUNC 648d4 1c 0 std::moneypunct::do_grouping() const +FUNC 648f0 5c 0 std::basic_string, std::allocator >::basic_string +648f0 2 639 236 +648f2 2 639 236 +648f4 2 112 238 +648f6 2 264 246 +648f8 2 481 201 +648fa 2 639 236 +648fc 4 264 246 +64900 4 643 236 +64904 2 379 237 +64906 4 378 237 +6490a 6 379 237 +64910 2 107 243 +64912 2 66 238 +64914 2 107 243 +64916 8 106 243 +6491e 2 107 243 +64920 2 380 237 +64922 4 101 205 +64926 4 644 236 +6492a 2 64 238 +6492c 4 96 238 +64930 2 96 238 +64932 4 97 238 +64936 4 323 201 +6493a 4 161 201 +6493e 4 135 222 +64942 a 161 201 +FUNC 6494c 1c 0 std::moneypunct::do_curr_symbol() const +FUNC 6494c 1c 0 std::moneypunct::do_negative_sign() const +6494c 6 110 189 +64952 16 110 189 +FUNC 6494c 1c 0 std::moneypunct::do_positive_sign() const +FUNC 6494c 1c 0 std::moneypunct::do_curr_symbol() const +FUNC 6494c 1c 0 std::moneypunct::do_negative_sign() const +FUNC 6494c 1c 0 std::moneypunct::do_positive_sign() const +FUNC 64968 64 0 std::priv::__valid_grouping(char const*, char const*, char const*, char const*) +64968 4 40 190 +6496c 2 39 190 +6496e 14 40 190 +64982 4 42 190 +64986 4 44 190 +6498a 8 45 190 +64992 4 38 190 +64996 e 45 190 +649a4 2 47 190 +649a6 2 48 190 +649a8 4 48 190 +649ac 4 44 190 +649b0 c 51 190 +649bc 4 52 190 +649c0 4 40 190 +649c4 8 46 190 +FUNC 649cc c 0 std::priv::__digit_val_table(unsigned int) +649cc 4 66 190 +649d0 2 66 190 +649d2 6 67 190 +FUNC 649d8 c 0 std::priv::__narrow_atoms() +649d8 4 70 190 +649dc 8 70 190 +FUNC 649e4 9c 0 wchar_t const* std::find(wchar_t const*, wchar_t const*, wchar_t const&) +649e4 2 115 199 +649e6 2 221 199 +649e8 4 115 199 +649ec 4 117 199 +649f0 8 118 199 +649f8 6 121 199 +649fe 6 124 199 +64a04 4 127 199 +64a08 4 127 199 +64a0c 4 127 199 +64a10 6 118 199 +64a16 6 121 199 +64a1c 2 124 199 +64a1e 2 124 199 +64a20 4 124 199 +64a24 6 127 199 +64a2a 2 221 199 +64a2c 2 117 199 +64a2e 4 221 199 +64a32 6 117 199 +64a38 a 131 199 +64a42 4 143 199 +64a46 2 131 199 +64a48 4 224 199 +64a4c 2 131 199 +64a4e 6 136 199 +64a54 2 137 199 +64a56 2 139 199 +64a58 8 143 199 +64a60 4 131 199 +64a64 4 124 199 +64a68 4 127 199 +64a6c 4 119 199 +64a70 8 133 199 +64a78 4 134 199 +64a7c 4 119 199 +FUNC 64a80 2a 0 std::priv::__get_fdigit(wchar_t&, wchar_t const*) +64a80 2 78 190 +64a82 4 79 190 +64a86 4 78 190 +64a8a a 79 190 +64a94 4 80 190 +64a98 2 81 190 +64a9a 2 82 190 +64a9c 8 81 190 +64aa4 2 82 190 +64aa6 2 85 190 +64aa8 2 86 190 +FUNC 64aac 14 0 std::priv::__get_fdigit_or_sep(wchar_t&, wchar_t, wchar_t const*) +64aac 6 90 190 +64ab2 2 95 190 +64ab4 4 95 190 +64ab8 4 91 190 +64abc 4 96 190 +FUNC 64ac0 c 0 std::priv::__hex_char_table_lo() +64ac0 4 119 192 +64ac4 8 119 192 +FUNC 64acc c 0 std::priv::__hex_char_table_hi() +64acc 4 122 192 +64ad0 8 122 192 +FUNC 64ad8 9a 0 std::priv::__insert_grouping(char*, char*, std::string const&, char, char, char, int) +64ad8 4 136 192 +64adc 2 36 192 +64ade 2 136 192 +64ae0 a 136 192 +64aea 2 36 192 +64aec a 41 192 +64af6 8 41 192 +64afe 4 39 192 +64b02 4 52 192 +64b06 6 46 192 +64b0c 2 49 192 +64b0e 2 65 238 +64b10 4 57 192 +64b14 4 400 237 +64b18 2 53 192 +64b1a a 54 192 +64b24 2 57 192 +64b26 4 62 192 +64b2a e 57 192 +64b38 2 57 192 +64b3a 2 57 192 +64b3c 2 63 192 +64b3e 2 255 200 +64b40 2 135 192 +64b42 2 256 200 +64b44 4 256 200 +64b48 2 256 200 +64b4a 6 256 200 +64b50 6 65 192 +64b56 2 42 192 +64b58 2 43 192 +64b5a 4 42 192 +64b5e a 68 192 +64b68 6 139 192 +64b6e 4 37 192 +FUNC 64b74 b4 0 std::priv::__insert_grouping(wchar_t*, wchar_t*, std::string const&, wchar_t, wchar_t, wchar_t, int) +64b74 4 151 192 +64b78 2 36 192 +64b7a 2 151 192 +64b7c a 151 192 +64b86 2 36 192 +64b88 8 41 192 +64b90 6 41 192 +64b96 4 39 192 +64b9a 4 43 192 +64b9e 2 52 192 +64ba0 4 43 192 +64ba4 4 46 192 +64ba8 2 49 192 +64baa 6 46 192 +64bb0 4 57 192 +64bb4 2 53 192 +64bb6 6 54 192 +64bbc 2 57 192 +64bbe 4 57 192 +64bc2 4 62 192 +64bc6 10 57 192 +64bd6 2 63 192 +64bd8 2 256 200 +64bda 2 255 200 +64bdc 2 149 192 +64bde 2 256 200 +64be0 4 256 200 +64be4 2 256 200 +64be6 10 256 200 +64bf6 2 53 192 +64bf8 4 65 192 +64bfc 4 57 192 +64c00 6 54 192 +64c06 4 57 192 +64c0a c 68 192 +64c16 6 154 192 +64c1c 2 42 192 +64c1e 2 43 192 +64c20 4 42 192 +64c24 4 37 192 +FUNC 64c28 126 0 char* std::priv::__write_integer_backward(char*, int, long) +64c28 8 304 225 +64c30 2 304 225 +64c32 2 307 225 +64c34 4 309 225 +64c38 4 308 225 +64c3c 4 309 225 +64c40 4 308 225 +64c44 2 309 225 +64c46 8 368 225 +64c4e c 314 225 +64c5a 2 278 225 +64c5c 4 279 225 +64c60 2 278 225 +64c62 2 279 225 +64c64 2 304 225 +64c66 c 282 225 +64c72 6 281 225 +64c78 6 282 225 +64c7e 2 281 225 +64c80 4 282 225 +64c84 8 281 225 +64c8c 6 281 225 +64c92 2 282 225 +64c94 6 284 225 +64c9a a 285 225 +64ca4 4 333 225 +64ca8 2 333 225 +64caa 2 333 225 +64cac 6 333 225 +64cb2 4 339 225 +64cb6 2 304 225 +64cb8 2 339 225 +64cba 2 339 225 +64cbc 4 340 225 +64cc0 6 339 225 +64cc6 4 340 225 +64cca 4 339 225 +64cce 4 339 225 +64cd2 4 340 225 +64cd6 2 339 225 +64cd8 6 342 225 +64cde 2 343 225 +64ce0 6 344 225 +64ce6 4 343 225 +64cea 4 344 225 +64cee a 310 225 +64cf8 8 279 225 +64d00 4 322 225 +64d04 2 304 225 +64d06 2 322 225 +64d08 8 322 225 +64d10 8 323 225 +64d18 4 322 225 +64d1c 4 322 225 +64d20 4 323 225 +64d24 2 322 225 +64d26 6 326 225 +64d2c a 327 225 +64d36 6 286 225 +64d3c a 287 225 +64d46 8 333 225 +FUNC 64d50 24 0 std::priv::__write_integer(char*, int, long) +64d50 4 125 192 +64d54 2 125 192 +64d56 6 128 192 +64d5c 4 224 200 +64d60 2 128 192 +64d62 2 224 200 +64d64 a 224 200 +64d6e 6 130 192 +FUNC 64d74 10c 0 std::basic_string, std::priv::__iostring_allocator >::_M_insert_aux(char*, char) +64d74 4 64 238 +64d78 4 256 236 +64d7c 2 74 238 +64d7e 6 256 236 +64d84 2 74 238 +64d86 6 74 238 +64d8c 4 259 236 +64d90 4 101 205 +64d94 2 261 236 +64d96 4 168 246 +64d9a 2 261 236 +64d9c 6 168 246 +64da2 2 232 246 +64da4 4 263 236 +64da8 2 277 236 +64daa 4 263 236 +64dae 4 277 236 +64db2 6 74 238 +64db8 4 259 236 +64dbc 2 400 237 +64dbe 4 304 237 +64dc2 e 306 237 +64dd0 6 307 237 +64dd6 4 307 237 +64dda 4 64 213 +64dde 6 67 213 +64de4 2 64 213 +64de6 2 86 243 +64de8 2 86 243 +64dea 4 84 243 +64dee 2 86 243 +64df0 2 256 236 +64df2 2 84 243 +64df4 4 179 192 +64df8 2 86 243 +64dfa 4 146 205 +64dfe 4 86 243 +64e02 6 232 246 +64e08 4 86 243 +64e0c 4 86 243 +64e10 2 256 236 +64e12 2 86 243 +64e14 4 179 192 +64e18 4 146 205 +64e1c 6 86 243 +64e22 6 101 205 +64e28 4 64 238 +64e2c 4 96 238 +64e30 2 96 238 +64e32 6 97 238 +64e38 4 70 213 +64e3c 2 97 238 +64e3e 4 161 201 +64e42 4 135 222 +64e46 4 274 236 +64e4a 4 164 238 +64e4e 2 160 238 +64e50 2 277 236 +64e52 4 165 238 +64e56 4 277 236 +64e5a 4 307 237 +64e5e e 134 222 +64e6c 6 161 201 +64e72 e 600 236 +FUNC 64e80 12a 0 std::basic_string, std::priv::__iostring_allocator >::_M_insert_aux(wchar_t*, wchar_t) +64e80 4 256 236 +64e84 2 256 236 +64e86 4 64 238 +64e8a 4 256 236 +64e8e 6 74 238 +64e94 a 74 238 +64e9e 4 259 236 +64ea2 2 261 236 +64ea4 2 101 205 +64ea6 2 261 236 +64ea8 2 101 205 +64eaa 2 249 246 +64eac 2 261 236 +64eae 4 249 246 +64eb2 4 263 236 +64eb6 2 267 246 +64eb8 2 263 236 +64eba 2 277 236 +64ebc 2 263 236 +64ebe 4 277 236 +64ec2 2 400 237 +64ec4 8 307 237 +64ecc 2 400 237 +64ece e 306 237 +64edc 4 307 237 +64ee0 4 307 237 +64ee4 c 64 213 +64ef0 8 67 213 +64ef8 8 86 243 +64f00 4 86 243 +64f04 4 84 243 +64f08 6 86 243 +64f0e 2 84 243 +64f10 4 179 192 +64f14 2 86 243 +64f16 4 146 205 +64f1a 6 86 243 +64f20 4 86 243 +64f24 6 267 246 +64f2a 4 86 243 +64f2e a 86 243 +64f38 4 179 192 +64f3c 2 86 243 +64f3e 4 146 205 +64f42 6 86 243 +64f48 2 101 205 +64f4a 2 96 238 +64f4c 4 101 205 +64f50 2 96 238 +64f52 2 96 238 +64f54 6 97 238 +64f5a 4 70 213 +64f5e 2 97 238 +64f60 4 323 201 +64f64 4 161 201 +64f68 4 161 201 +64f6c 4 274 236 +64f70 4 164 238 +64f74 2 160 238 +64f76 2 277 236 +64f78 4 165 238 +64f7c 4 277 236 +64f80 4 307 237 +64f84 12 134 222 +64f96 e 74 238 +64fa4 6 135 222 +FUNC 64fac 78 0 std::basic_string, std::priv::__iostring_allocator >::_M_reserve(unsigned int) +64fac 4 64 213 +64fb0 2 170 236 +64fb2 4 170 236 +64fb6 6 67 213 +64fbc 2 64 213 +64fbe 8 134 222 +64fc6 4 66 238 +64fca 4 86 243 +64fce 2 86 243 +64fd0 4 84 243 +64fd4 2 86 243 +64fd6 2 170 236 +64fd8 2 84 243 +64fda 4 179 192 +64fde 4 146 205 +64fe2 4 86 243 +64fe6 4 101 205 +64fea 4 64 238 +64fee 4 96 238 +64ff2 2 96 238 +64ff4 6 97 238 +64ffa 4 70 213 +64ffe 2 97 238 +65000 4 161 201 +65004 4 161 201 +65008 2 175 236 +6500a 2 164 238 +6500c 2 160 238 +6500e 4 165 238 +65012 2 176 236 +65014 4 135 222 +65018 2 175 236 +6501a 2 164 238 +6501c 2 160 238 +6501e 4 165 238 +65022 2 176 236 +FUNC 65024 e4 0 std::priv::__insert_grouping(std::priv::__basic_iostring&, unsigned int, std::string const&, char, char, char, int) +65024 4 143 192 +65028 4 143 192 +6502c 4 65 238 +65030 2 400 237 +65032 2 143 192 +65034 2 400 237 +65036 4 80 192 +6503a 2 84 192 +6503c 2 92 192 +6503e 4 86 192 +65042 2 97 192 +65044 4 83 192 +65048 2 86 192 +6504a 2 94 192 +6504c 2 86 192 +6504e 2 101 205 +65050 4 86 192 +65054 a 83 192 +6505e 6 90 192 +65064 2 65 238 +65066 4 400 237 +6506a 2 98 192 +6506c 6 99 192 +65072 2 102 192 +65074 4 66 238 +65078 e 102 192 +65086 4 102 192 +6508a 2 90 238 +6508c 2 108 192 +6508e 4 660 237 +65092 a 665 237 +6509c 4 74 238 +650a0 2 74 238 +650a2 8 74 238 +650aa 4 535 237 +650ae 4 101 205 +650b2 2 90 238 +650b4 4 232 246 +650b8 c 539 237 +650c4 2 400 237 +650c6 4 304 237 +650ca a 306 237 +650d4 a 307 237 +650de a 536 237 +650e8 2 307 237 +650ea 2 536 237 +650ec 6 307 237 +650f2 8 536 237 +650fa e 600 236 +FUNC 65108 b4 0 std::basic_string, std::priv::__iostring_allocator >::_M_reserve(unsigned int) +65108 2 170 236 +6510a 2 67 213 +6510c 4 64 213 +65110 2 170 236 +65112 4 67 213 +65116 2 64 213 +65118 6 302 201 +6511e 2 306 201 +65120 8 134 222 +65128 2 86 243 +6512a 4 66 238 +6512e 8 86 243 +65136 4 86 243 +6513a 4 84 243 +6513e 6 86 243 +65144 2 84 243 +65146 4 179 192 +6514a 2 86 243 +6514c 4 146 205 +65150 6 86 243 +65156 2 101 205 +65158 2 96 238 +6515a 2 101 205 +6515c 2 96 238 +6515e 2 96 238 +65160 6 97 238 +65166 4 70 213 +6516a 2 97 238 +6516c 4 323 201 +65170 4 161 201 +65174 4 161 201 +65178 2 175 236 +6517a 2 164 238 +6517c 2 160 238 +6517e 4 165 238 +65182 2 176 236 +65184 4 135 222 +65188 2 175 236 +6518a 2 164 238 +6518c 2 160 238 +6518e 4 165 238 +65192 2 176 236 +65194 28 303 201 +FUNC 651bc 10c 0 std::priv::__insert_grouping(std::priv::__basic_iostring&, unsigned int, std::string const&, wchar_t, wchar_t, wchar_t, int) +651bc 4 159 192 +651c0 4 159 192 +651c4 4 65 238 +651c8 2 400 237 +651ca 2 159 192 +651cc 2 400 237 +651ce 6 80 192 +651d4 2 84 192 +651d6 2 97 192 +651d8 2 86 192 +651da 4 92 192 +651de 4 83 192 +651e2 4 307 237 +651e6 4 86 192 +651ea 2 90 192 +651ec e 86 192 +651fa a 83 192 +65204 4 307 237 +65208 4 90 192 +6520c 2 94 192 +6520e 4 400 237 +65212 2 98 192 +65214 6 99 192 +6521a 2 102 192 +6521c 4 66 238 +65220 e 102 192 +6522e 4 102 192 +65232 4 90 238 +65236 4 108 192 +6523a 4 660 237 +6523e 12 665 237 +65250 4 74 238 +65254 6 74 238 +6525a 4 535 237 +6525e 2 267 246 +65260 4 101 205 +65264 4 267 246 +65268 8 539 237 +65270 8 74 238 +65278 4 535 237 +6527c 6 400 237 +65282 a 306 237 +6528c e 307 237 +6529a 10 536 237 +652aa e 307 237 +652b8 10 536 237 +FUNC 652c8 400 0 std::priv::_Stl_tenscale +652c8 4 269 191 +652cc 2 280 191 +652ce 2 269 191 +652d0 6 269 191 +652d6 4 280 191 +652da 8 281 191 +652e2 4 282 191 +652e6 4 276 191 +652ea 2 285 191 +652ec 2 284 191 +652ee 6 283 191 +652f4 2 288 191 +652f6 4 289 191 +652fa 6 303 191 +65300 6 291 191 +65306 4 309 191 +6530a 2 291 191 +6530c 2 307 191 +6530e 2 309 191 +65310 2 291 191 +65312 2 307 191 +65314 2 291 191 +65316 4 309 191 +6531a 18 238 191 +65332 8 246 191 +6533a 6 248 191 +65340 a 246 191 +6534a 2 247 191 +6534c 6 254 191 +65352 10 246 191 +65362 2 254 191 +65364 14 309 191 +65378 8 303 191 +65380 2 307 191 +65382 4 122 191 +65386 2 291 191 +65388 4 122 191 +6538c 4 306 191 +65390 4 124 191 +65394 4 307 191 +65398 6 291 191 +6539e 2 306 191 +653a0 4 305 191 +653a4 4 122 191 +653a8 4 307 191 +653ac 4 122 191 +653b0 4 306 191 +653b4 4 307 191 +653b8 4 124 191 +653bc 4 307 191 +653c0 8 124 191 +653c8 2 125 191 +653ca 4 127 191 +653ce 4 130 191 +653d2 e 127 191 +653e0 4 130 191 +653e4 2 127 191 +653e6 6 130 191 +653ec 4 134 191 +653f0 4 130 191 +653f4 2 132 191 +653f6 8 130 191 +653fe 4 132 191 +65402 4 136 191 +65406 4 134 191 +6540a 4 136 191 +6540e 8 134 191 +65416 c 136 191 +65422 2 135 191 +65424 4 136 191 +65428 2 135 191 +6542a 2 136 191 +6542c 4 135 191 +65430 4 136 191 +65434 6 135 191 +6543a 2 136 191 +6543c 8 135 191 +65444 a 234 191 +6544e 4 251 191 +65452 6 254 191 +65458 2 233 191 +6545a 4 251 191 +6545e 2 254 191 +65460 1c 255 191 +6547c 18 255 191 +65494 c 258 191 +654a0 4 259 191 +654a4 4 258 191 +654a8 4 259 191 +654ac 2 309 191 +654ae 2 260 191 +654b0 2 309 191 +654b2 8 260 191 +654ba 10 309 191 +654ca e 303 191 +654d8 6 312 191 +654de 2 313 191 +654e0 2 314 191 +654e2 4 313 191 +654e6 4 314 191 +654ea 4 122 191 +654ee 8 314 191 +654f6 2 122 191 +654f8 4 314 191 +654fc 8 122 191 +65504 4 124 191 +65508 2 125 191 +6550a 4 127 191 +6550e 4 130 191 +65512 e 127 191 +65520 4 134 191 +65524 2 127 191 +65526 e 130 191 +65534 4 132 191 +65538 4 130 191 +6553c 2 136 191 +6553e 4 130 191 +65542 4 132 191 +65546 4 134 191 +6554a 4 136 191 +6554e 4 135 191 +65552 4 136 191 +65556 8 134 191 +6555e 6 136 191 +65564 6 135 191 +6556a 8 136 191 +65572 a 135 191 +6557c 8 234 191 +65584 12 238 191 +65596 a 246 191 +655a0 2 247 191 +655a2 4 248 191 +655a6 2 246 191 +655a8 4 248 191 +655ac 2 246 191 +655ae 8 254 191 +655b6 c 246 191 +655c2 2 254 191 +655c4 12 316 191 +655d6 8 320 191 +655de 2 289 191 +655e0 2 276 191 +655e2 2 289 191 +655e4 4 288 191 +655e8 28 238 191 +65610 8 243 191 +65618 2 233 191 +6561a 6 243 191 +65620 4 276 191 +65624 6 291 191 +6562a 2 292 191 +6562c 6 291 191 +65632 2 296 191 +65634 2 295 191 +65636 4 296 191 +6563a 2 251 191 +6563c 8 254 191 +65644 2 233 191 +65646 4 251 191 +6564a 2 254 191 +6564c 16 255 191 +65662 14 255 191 +65676 c 258 191 +65682 4 259 191 +65686 4 258 191 +6568a 2 259 191 +6568c 6 260 191 +65692 16 238 191 +656a8 8 243 191 +656b0 2 233 191 +656b2 16 243 191 +FUNC 656c8 4a8 0 std::priv::_Stl_string_to_double +656c8 6 645 191 +656ce 2 655 191 +656d0 4 659 191 +656d4 2 655 191 +656d6 2 661 191 +656d8 4 658 191 +656dc 2 661 191 +656de 2 672 191 +656e0 2 669 191 +656e2 2 666 191 +656e4 2 673 191 +656e6 2 668 191 +656e8 4 674 191 +656ec 2 666 191 +656ee 4 685 191 +656f2 2 673 191 +656f4 2 674 191 +656f6 6 676 191 +656fc 2 674 191 +656fe 2 678 191 +65700 4 678 191 +65704 4 681 191 +65708 2 683 191 +6570a 4 690 191 +6570e 4 685 191 +65712 2 672 191 +65714 4 673 191 +65718 8 685 191 +65720 2 686 191 +65722 4 685 191 +65726 6 694 191 +6572c 18 698 191 +65744 2 701 191 +65746 18 702 191 +6575e 4 703 191 +65762 8 708 191 +6576a 4 710 191 +6576e 4 711 191 +65772 4 710 191 +65776 8 709 191 +6577e 2 714 191 +65780 2 715 191 +65782 2 717 191 +65784 2 722 191 +65786 8 723 191 +6578e 6 726 191 +65794 2 165 217 +65796 4 166 217 +6579a 4 165 217 +6579e 4 166 217 +657a2 4 167 217 +657a6 6 736 191 +657ac 4 737 191 +657b0 a 741 191 +657ba 4 724 191 +657be 8 736 191 +657c6 4 660 191 +657ca 6 658 191 +657d0 4 704 191 +657d4 2 701 191 +657d6 4 699 191 +657da 4 663 191 +657de 6 662 191 +657e4 2 706 191 +657e6 2 705 191 +657e8 4 706 191 +657ec 2 354 191 +657ee 8 357 191 +657f6 a 358 191 +65800 2 359 191 +65802 4 358 191 +65806 a 359 191 +65810 4 357 191 +65814 6 363 191 +6581a 14 372 191 +6582e 2c 373 191 +6585a 3c 374 191 +65896 3a 375 191 +658d0 3a 376 191 +6590a 3a 377 191 +65944 2c 378 191 +65970 4 381 191 +65974 2 270 191 +65976 26 381 191 +6599c 2 270 191 +6599e 4 272 191 +659a2 4 429 191 +659a6 8 430 191 +659ae 4 431 191 +659b2 c 432 191 +659be 2 441 191 +659c0 12 442 191 +659d2 a 429 191 +659dc 6 442 191 +659e2 c 443 191 +659ee 2 444 191 +659f0 4 443 191 +659f4 8 444 191 +659fc 2 446 191 +659fe a 445 191 +65a08 8 464 191 +65a10 4 469 191 +65a14 4 150 191 +65a18 2 469 191 +65a1a 14 150 191 +65a2e 4 167 217 +65a32 a 736 191 +65a3c 6 695 191 +65a42 4 377 191 +65a46 8 272 191 +65a4e 4 390 191 +65a52 8 392 191 +65a5a e 394 191 +65a68 a 398 191 +65a72 6 401 191 +65a78 4 406 191 +65a7c 16 412 191 +65a92 8 413 191 +65a9a c 412 191 +65aa6 e 413 191 +65ab4 e 412 191 +65ac2 2 413 191 +65ac4 8 412 191 +65acc 6 413 191 +65ad2 4 414 191 +65ad6 2 418 191 +65ad8 12 418 191 +65aea 8 418 191 +65af2 6 419 191 +65af8 4 420 191 +65afc 4 419 191 +65b00 18 420 191 +65b18 a 736 191 +65b22 2 165 217 +65b24 4 166 217 +65b28 4 165 217 +65b2c 4 166 217 +65b30 4 167 217 +65b34 a 736 191 +65b3e 4 418 191 +65b42 a 736 191 +65b4c 4 407 191 +65b50 8 409 191 +65b58 8 407 191 +65b60 2 408 191 +65b62 e 407 191 +FUNC 65b70 78 0 std::priv::_Initialize_get_float(std::ctype const&, wchar_t&, wchar_t&, wchar_t&, wchar_t&, wchar_t*) +65b70 6 86 191 +65b76 2 87 191 +65b78 2 86 191 +65b7a 4 206 206 +65b7e 2 86 191 +65b80 2 87 191 +65b82 2 86 191 +65b84 2 87 191 +65b86 2 86 191 +65b88 4 87 191 +65b8c 4 206 206 +65b90 4 87 191 +65b94 2 206 206 +65b96 4 87 191 +65b9a 2 206 206 +65b9c 2 87 191 +65b9e 8 206 206 +65ba6 2 88 191 +65ba8 a 206 206 +65bb2 4 89 191 +65bb6 a 206 206 +65bc0 4 90 191 +65bc4 4 206 206 +65bc8 2 209 206 +65bca 2 91 191 +65bcc 6 209 206 +65bd2 2 91 191 +65bd4 8 209 206 +65bdc c 93 191 +FUNC 65be8 16 0 std::priv::__string_to_float(std::priv::__basic_iostring const&, float&) +65be8 2 847 191 +65bea 2 847 191 +65bec 10 849 191 +65bfc 2 853 191 +FUNC 65c00 12 0 std::priv::__string_to_float(std::priv::__basic_iostring const&, double&) +65c00 2 857 191 +65c02 2 857 191 +65c04 c 859 191 +65c10 2 863 191 +FUNC 65c14 348 0 long double std::priv::_Stl_atodT(char*, int, int) +65c14 2 488 191 +65c16 4 483 191 +65c1a 2 492 191 +65c1c 2 483 191 +65c1e 2 483 191 +65c20 8 492 191 +65c28 6 493 191 +65c2e 4 494 191 +65c32 4 493 191 +65c36 8 494 191 +65c3e 4 492 191 +65c42 8 497 191 +65c4a 4 507 191 +65c4e 2 508 191 +65c50 2 507 191 +65c52 2 508 191 +65c54 2 507 191 +65c56 4 511 191 +65c5a 12 507 191 +65c6c 2a 508 191 +65c96 30 509 191 +65cc6 2e 510 191 +65cf4 38 511 191 +65d2c 32 512 191 +65d5e 2a 513 191 +65d88 4 516 191 +65d8c 2 270 191 +65d8e 1c 517 191 +65daa 2 272 191 +65dac 8 517 191 +65db4 2 270 191 +65db6 4 272 191 +65dba 4 532 191 +65dbe 8 533 191 +65dc6 4 534 191 +65dca 8 535 191 +65dd2 2 545 191 +65dd4 12 546 191 +65de6 a 532 191 +65df0 6 546 191 +65df6 c 547 191 +65e02 4 571 191 +65e06 14 555 191 +65e1a 2 571 191 +65e1c 2 165 217 +65e1e 4 166 217 +65e22 4 165 217 +65e26 4 166 217 +65e2a 4 167 217 +65e2e 2 572 191 +65e30 4 512 191 +65e34 4 498 191 +65e38 6 641 191 +65e3e 4 579 191 +65e42 4 580 191 +65e46 6 584 191 +65e4c a 272 191 +65e56 4 527 191 +65e5a 8 529 191 +65e62 c 589 191 +65e6e 8 590 191 +65e76 4 635 191 +65e7a 4 636 191 +65e7e 6 640 191 +65e84 a 598 191 +65e8e 4 604 191 +65e92 a 607 191 +65e9c 2 608 191 +65e9e 16 613 191 +65eb4 8 614 191 +65ebc c 613 191 +65ec8 e 614 191 +65ed6 e 613 191 +65ee4 2 614 191 +65ee6 8 613 191 +65eee 6 614 191 +65ef4 4 615 191 +65ef8 4 619 191 +65efc 12 619 191 +65f0e 6 620 191 +65f14 4 621 191 +65f18 4 620 191 +65f1c 6 621 191 +65f22 4 620 191 +65f26 6 621 191 +65f2c 4 624 191 +65f30 2 625 191 +65f32 6 628 191 +65f38 8 619 191 +65f40 4 609 191 +65f44 8 611 191 +65f4c 8 609 191 +65f54 2 610 191 +65f56 6 609 191 +FUNC 65f5c 11c 0 long double std::priv::_Stl_string_to_doubleT(char const*) +65f5c 6 749 191 +65f62 2 761 191 +65f64 4 765 191 +65f68 2 761 191 +65f6a 2 764 191 +65f6c 4 767 191 +65f70 2 778 191 +65f72 2 775 191 +65f74 2 779 191 +65f76 2 772 191 +65f78 2 774 191 +65f7a 4 780 191 +65f7e 2 772 191 +65f80 4 791 191 +65f84 2 779 191 +65f86 2 780 191 +65f88 6 782 191 +65f8e 2 780 191 +65f90 2 784 191 +65f92 4 784 191 +65f96 4 787 191 +65f9a 2 789 191 +65f9c 4 796 191 +65fa0 4 791 191 +65fa4 2 778 191 +65fa6 4 779 191 +65faa c 791 191 +65fb6 2 792 191 +65fb8 6 791 191 +65fbe 4 799 191 +65fc2 18 803 191 +65fda 2 806 191 +65fdc 18 807 191 +65ff4 4 808 191 +65ff8 8 813 191 +66000 4 815 191 +66004 4 816 191 +66008 4 815 191 +6600c 8 814 191 +66014 2 819 191 +66016 2 820 191 +66018 2 822 191 +6601a 2 826 191 +6601c 8 827 191 +66024 6 829 191 +6602a 6 165 217 +66030 8 166 217 +66038 4 167 217 +6603c 2 840 191 +6603e 4 840 191 +66042 6 841 191 +66048 6 828 191 +6604e 4 766 191 +66052 4 764 191 +66056 4 809 191 +6605a 2 806 191 +6605c 4 804 191 +66060 4 769 191 +66064 4 768 191 +66068 8 837 191 +66070 2 811 191 +66072 2 810 191 +66074 4 811 191 +FUNC 66078 12 0 std::priv::__string_to_float(std::priv::__basic_iostring const&, long double&) +66078 2 867 191 +6607a 2 867 191 +6607c c 874 191 +66088 2 876 191 +FUNC 6608c 88 0 std::priv::__fill_fmtbuf +6608c 4 711 193 +66090 2 714 193 +66092 2 710 193 +66094 2 714 193 +66096 8 715 193 +6609e 2 712 193 +660a0 4 717 193 +660a4 2 715 193 +660a6 2 717 193 +660a8 a 718 193 +660b2 4 720 193 +660b6 6 721 193 +660bc 2 723 193 +660be 4 724 193 +660c2 c 726 193 +660ce 2 739 193 +660d0 4 739 193 +660d4 6 739 193 +660da 2 739 193 +660dc 4 743 193 +660e0 4 744 193 +660e4 4 714 193 +660e8 2 715 193 +660ea 2 714 193 +660ec 4 715 193 +660f0 4 735 193 +660f4 4 735 193 +660f8 6 735 193 +660fe 2 735 193 +66100 2 737 193 +66102 4 729 193 +66106 4 729 193 +6610a 6 729 193 +66110 2 729 193 +66112 2 730 193 +FUNC 66114 16a 0 char* std::find_if(char*, char*, std::priv::GroupPos) +66114 2 162 199 +66116 2 214 199 +66118 2 162 199 +6611a 4 164 199 +6611e 2 165 199 +66120 18 705 193 +66138 4 705 193 +6613c 2 168 199 +6613e 2 166 199 +66140 18 705 193 +66158 8 705 193 +66160 2 171 199 +66162 18 705 193 +6617a 4 705 193 +6617e 2 174 199 +66180 18 705 193 +66198 4 705 193 +6619c 2 214 199 +6619e 2 164 199 +661a0 2 214 199 +661a2 2 164 199 +661a4 2 165 199 +661a6 16 705 193 +661bc 4 705 193 +661c0 2 168 199 +661c2 2 214 199 +661c4 16 705 193 +661da 6 705 193 +661e0 2 171 199 +661e2 18 705 193 +661fa 2 171 199 +661fc 4 218 199 +66200 4 166 199 +66204 2 164 199 +66206 a 178 199 +66210 4 190 199 +66214 2 178 199 +66216 2 186 199 +66218 18 705 193 +66230 8 190 199 +66238 4 174 199 +6623c 2 180 199 +6623e 18 705 193 +66256 4 705 193 +6625a 2 181 199 +6625c 2 183 199 +6625e 18 705 193 +66276 4 705 193 +6627a 4 184 199 +FUNC 66280 11c 0 std::basic_string, std::priv::__iostring_allocator >::_M_append(char const*, char const*) +66280 2 197 236 +66282 8 196 236 +6628a 2 197 236 +6628c 4 64 238 +66290 4 198 236 +66294 4 74 238 +66298 6 74 238 +6629e 4 199 236 +662a2 2 210 236 +662a4 2 86 243 +662a6 4 86 243 +662aa 2 196 236 +662ac 4 86 243 +662b0 4 915 193 +662b4 2 86 243 +662b6 4 146 205 +662ba 4 86 243 +662be 6 101 205 +662c4 2 90 238 +662c6 2 915 193 +662c8 2 232 246 +662ca 6 214 236 +662d0 8 218 236 +662d8 2 400 237 +662da e 304 237 +662e8 a 306 237 +662f2 4 307 237 +662f6 4 307 237 +662fa 4 64 213 +662fe 6 67 213 +66304 2 64 213 +66306 2 86 243 +66308 4 84 243 +6630c 2 86 243 +6630e 2 196 236 +66310 2 84 243 +66312 4 915 193 +66316 4 146 205 +6631a a 86 243 +66324 6 196 236 +6632a 4 915 193 +6632e 2 86 243 +66330 4 146 205 +66334 4 86 243 +66338 4 101 205 +6633c 4 64 238 +66340 4 96 238 +66344 2 96 238 +66346 6 97 238 +6634c 4 70 213 +66350 2 97 238 +66352 4 161 201 +66356 4 135 222 +6635a 2 206 236 +6635c 2 164 238 +6635e 2 160 238 +66360 6 165 238 +66366 4 307 237 +6636a 16 134 222 +66380 8 74 238 +66388 6 161 201 +6638e e 600 236 +FUNC 6639c 138 0 std::priv::__get_floor_digits(std::priv::__basic_iostring&, long double) +6639c 6 844 193 +663a2 e 849 193 +663b0 2 844 193 +663b2 8 849 193 +663ba 8 853 193 +663c2 4 854 193 +663c6 4 470 237 +663ca 4 64 238 +663ce 2 355 216 +663d0 4 74 238 +663d4 6 74 238 +663da 4 472 237 +663de 2 400 237 +663e0 e 304 237 +663ee a 306 237 +663f8 4 307 237 +663fc 8 307 237 +66404 e 134 222 +66412 2 107 243 +66414 4 107 243 +66418 2 107 243 +6641a c 106 243 +66426 2 107 243 +66428 8 106 243 +66430 4 101 205 +66434 2 107 243 +66436 4 64 238 +6643a 4 96 238 +6643e 2 96 238 +66440 6 97 238 +66446 4 70 213 +6644a 2 97 238 +6644c 2 135 222 +6644e 4 161 201 +66452 4 135 222 +66456 2 479 237 +66458 2 164 238 +6645a 2 160 238 +6645c 4 165 238 +66460 6 870 193 +66466 6 915 193 +6646c 2 107 243 +6646e 2 232 246 +66470 2 90 238 +66472 2 107 243 +66474 2 483 237 +66476 a 106 243 +66480 4 101 205 +66484 8 485 237 +6648c 4 64 213 +66490 6 67 213 +66496 4 64 213 +6649a 4 161 201 +6649e 2 479 237 +664a0 2 164 238 +664a2 2 160 238 +664a4 6 165 238 +664aa 8 74 238 +664b2 6 229 246 +664b8 c 530 237 +664c4 10 600 236 +FUNC 664d4 220 0 std::priv::__convert_float_buffer(std::priv::__basic_iostring const&, std::priv::__basic_iostring&, std::ctype const&, wchar_t, bool) +664d4 6 875 193 +664da 6 875 193 +664e0 4 879 193 +664e4 4 65 238 +664e8 4 89 238 +664ec 4 879 193 +664f0 4 880 193 +664f4 c 881 193 +66500 4 307 237 +66504 2 874 193 +66506 4 307 237 +6650a 6 101 205 +66510 2 880 193 +66512 2 267 246 +66514 4 101 205 +66518 2 882 193 +6651a 4 267 246 +6651e 2 539 237 +66520 2 880 193 +66522 a 881 193 +6652c 8 206 206 +66534 4 64 238 +66538 2 74 238 +6653a 2 74 238 +6653c 2 206 206 +6653e 4 74 238 +66542 6 74 238 +66548 4 535 237 +6654c 2 400 237 +6654e 8 308 237 +66556 2 400 237 +66558 a 306 237 +66562 2 307 237 +66564 a 308 237 +6656e 2 307 237 +66570 6 308 237 +66576 2 536 237 +66578 2 882 193 +6657a 6 536 237 +66580 2 880 193 +66582 2 267 246 +66584 4 101 205 +66588 4 267 246 +6658c 2 539 237 +6658e 2 880 193 +66590 6 900 193 +66596 4 889 193 +6659a a 206 206 +665a4 4 64 238 +665a8 2 74 238 +665aa 2 206 206 +665ac 4 74 238 +665b0 8 74 238 +665b8 4 535 237 +665bc 2 267 246 +665be 4 101 205 +665c2 4 267 246 +665c6 2 539 237 +665c8 6 896 193 +665ce 4 307 237 +665d2 4 101 205 +665d6 6 307 237 +665dc 2 896 193 +665de 2 267 246 +665e0 2 896 193 +665e2 4 101 205 +665e6 2 896 193 +665e8 4 267 246 +665ec 2 896 193 +665ee 2 539 237 +665f0 2 896 193 +665f2 a 206 206 +665fc 4 64 238 +66600 2 74 238 +66602 2 74 238 +66604 2 206 206 +66606 2 74 238 +66608 6 74 238 +6660e 4 535 237 +66612 2 400 237 +66614 8 308 237 +6661c 2 400 237 +6661e a 306 237 +66628 2 307 237 +6662a a 308 237 +66634 2 307 237 +66636 6 308 237 +6663c a 536 237 +66646 14 74 238 +6665a 4 64 238 +6665e 4 74 238 +66662 6 74 238 +66668 4 535 237 +6666c 2 267 246 +6666e 4 101 205 +66672 2 894 193 +66674 6 267 246 +6667a 2 539 237 +6667c 4 894 193 +66680 2 400 237 +66682 8 307 237 +6668a 2 400 237 +6668c a 306 237 +66696 2 307 237 +66698 4 308 237 +6669c 2 307 237 +6669e a 536 237 +666a8 2 400 237 +666aa 8 307 237 +666b2 2 400 237 +666b4 a 306 237 +666be 2 307 237 +666c0 4 308 237 +666c4 2 307 237 +666c6 6 308 237 +666cc a 536 237 +666d6 c 74 238 +666e2 8 308 237 +666ea a 74 238 +FUNC 666f4 6a 0 std::basic_string, std::priv::__iostring_allocator >::_M_assign(char const*, char const*) +666f4 2 242 236 +666f6 2 242 236 +666f8 2 89 238 +666fa 2 243 236 +666fc 4 65 238 +66700 4 242 236 +66704 2 400 237 +66706 4 244 236 +6670a 2 168 246 +6670c 2 246 236 +6670e 4 803 237 +66712 2 168 246 +66714 2 806 237 +66716 2 168 246 +66718 6 806 237 +6671e 4 253 236 +66722 2 168 246 +66724 a 250 236 +6672e 4 253 236 +66732 c 168 246 +6673e 2 246 236 +66740 6 803 237 +66746 a 168 246 +66750 2 250 236 +66752 2 168 246 +66754 a 250 236 +FUNC 66760 54 0 std::priv::__write_floatT +66760 c 749 193 +6676c 4 749 193 +66770 8 760 193 +66778 12 761 193 +6678a 6 229 246 +66790 c 355 237 +6679c 4 66 238 +667a0 c 763 193 +667ac 8 820 193 +FUNC 667b4 8 0 std::priv::__write_float(std::priv::__basic_iostring&, int, int, long double) +667b4 4 840 193 +667b8 4 840 193 +FUNC 667bc 54 0 std::priv::__write_floatT +667bc c 749 193 +667c8 4 749 193 +667cc 8 760 193 +667d4 12 761 193 +667e6 6 229 246 +667ec c 355 237 +667f8 4 66 238 +667fc c 763 193 +66808 8 820 193 +FUNC 66810 8 0 std::priv::__write_float(std::priv::__basic_iostring&, int, int, double) +66810 4 829 193 +66814 4 829 193 +FUNC 66818 4 0 std::numpunct::do_decimal_point() const +66818 4 34 194 +FUNC 66818 4 0 std::numpunct::do_decimal_point() const +FUNC 6681c 4 0 std::numpunct::do_thousands_sep() const +6681c 4 27 194 +FUNC 6681c 4 0 std::numpunct::do_thousands_sep() const +FUNC 66820 1c 0 std::numpunct::~numpunct +66820 4 39 194 +66824 18 39 194 +FUNC 6683c 12 0 std::numpunct::~numpunct +6683c 2 39 194 +6683e 6 39 194 +66844 6 39 194 +6684a 4 39 194 +FUNC 66850 1c 0 std::numpunct::~numpunct +66850 4 31 194 +66854 18 31 194 +FUNC 6686c 12 0 std::numpunct::~numpunct +6686c 2 31 194 +6686e 6 31 194 +66874 6 31 194 +6687a 4 31 194 +FUNC 66880 18 0 std::numpunct::do_grouping() const +FUNC 66880 18 0 std::numpunct::do_grouping() const +66880 2 28 194 +66882 2 28 194 +66884 2 120 238 +66886 2 124 238 +66888 2 481 201 +6688a 4 124 238 +6688e 2 90 238 +66890 2 101 205 +66892 2 36 194 +66894 2 101 205 +66896 2 28 194 +FUNC 66898 1c 0 std::numpunct::do_falsename() const +66898 6 30 194 +6689e 16 30 194 +FUNC 668b4 1c 0 std::numpunct::do_truename() const +668b4 6 29 194 +668ba 16 29 194 +FUNC 668d0 1c 0 std::numpunct::do_falsename() const +668d0 6 38 194 +668d6 16 38 194 +FUNC 668ec 1c 0 std::numpunct::do_truename() const +668ec 6 37 194 +668f2 16 37 194 +FUNC 66908 c8 0 std::basic_string, std::priv::__iostring_allocator >::append(unsigned int, char) +66908 4 180 236 +6690c 2 180 236 +6690e 2 89 238 +66910 2 180 236 +66912 4 65 238 +66916 2 400 237 +66918 4 182 236 +6691c 4 74 238 +66920 2 74 238 +66922 8 74 238 +6692a 4 184 236 +6692e 4 101 205 +66932 2 90 238 +66934 2 232 246 +66936 6 189 236 +6693c 4 192 236 +66940 a 306 237 +6694a 4 307 237 +6694e 4 307 237 +66952 10 134 222 +66962 2 86 243 +66964 4 84 243 +66968 2 86 243 +6696a 4 180 236 +6696e 2 84 243 +66970 4 565 197 +66974 4 146 205 +66978 4 86 243 +6697c 4 101 205 +66980 4 64 238 +66984 4 96 238 +66988 2 96 238 +6698a 6 97 238 +66990 4 70 213 +66994 2 97 238 +66996 4 161 201 +6699a 4 161 201 +6699e 2 175 236 +669a0 2 164 238 +669a2 2 160 238 +669a4 6 165 238 +669aa 4 307 237 +669ae 4 64 213 +669b2 6 67 213 +669b8 4 64 213 +669bc 6 135 222 +669c2 e 600 236 +FUNC 669d0 f0 0 std::basic_string, std::priv::__iostring_allocator >::append(unsigned int, wchar_t) +669d0 4 180 236 +669d4 2 180 236 +669d6 2 89 238 +669d8 2 180 236 +669da 4 65 238 +669de 2 74 238 +669e0 4 400 237 +669e4 4 74 238 +669e8 4 400 237 +669ec 6 74 238 +669f2 6 74 238 +669f8 4 184 236 +669fc 2 267 246 +669fe 4 101 205 +66a02 4 267 246 +66a06 2 189 236 +66a08 4 192 236 +66a0c 4 306 237 +66a10 4 307 237 +66a14 c 306 237 +66a20 8 307 237 +66a28 4 307 237 +66a2c c 64 213 +66a38 8 67 213 +66a40 4 86 243 +66a44 4 84 243 +66a48 6 86 243 +66a4e 2 84 243 +66a50 4 565 197 +66a54 2 86 243 +66a56 4 146 205 +66a5a 6 86 243 +66a60 2 101 205 +66a62 2 96 238 +66a64 2 101 205 +66a66 2 96 238 +66a68 2 96 238 +66a6a 6 97 238 +66a70 4 70 213 +66a74 2 97 238 +66a76 4 323 201 +66a7a 4 161 201 +66a7e 4 161 201 +66a82 4 175 236 +66a86 2 160 238 +66a88 2 267 246 +66a8a 2 164 238 +66a8c 4 165 238 +66a90 4 101 205 +66a94 4 267 246 +66a98 2 189 236 +66a9a 4 192 236 +66a9e 4 307 237 +66aa2 18 134 222 +66aba 6 135 222 +FUNC 66ac0 f4 0 std::priv::__append +66ac0 2 470 237 +66ac2 4 171 197 +66ac6 4 171 197 +66aca 2 470 237 +66acc 4 64 238 +66ad0 2 355 216 +66ad2 4 74 238 +66ad6 6 74 238 +66adc 4 472 237 +66ae0 2 400 237 +66ae2 e 304 237 +66af0 a 306 237 +66afa 4 307 237 +66afe 8 307 237 +66b06 e 134 222 +66b14 2 107 243 +66b16 4 107 243 +66b1a 2 107 243 +66b1c c 106 243 +66b28 2 107 243 +66b2a 8 106 243 +66b32 4 101 205 +66b36 2 107 243 +66b38 4 64 238 +66b3c 4 96 238 +66b40 2 96 238 +66b42 6 97 238 +66b48 4 70 213 +66b4c 2 97 238 +66b4e 2 135 222 +66b50 4 161 201 +66b54 4 161 201 +66b58 2 479 237 +66b5a 2 164 238 +66b5c 2 160 238 +66b5e 8 165 238 +66b66 2 565 197 +66b68 2 482 237 +66b6a 2 107 243 +66b6c 2 232 246 +66b6e 2 90 238 +66b70 2 107 243 +66b72 2 483 237 +66b74 8 106 243 +66b7c 4 101 205 +66b80 a 485 237 +66b8a 4 64 213 +66b8e 6 67 213 +66b94 4 64 213 +66b98 6 135 222 +66b9e 8 74 238 +66ba6 e 600 236 +FUNC 66bb4 f4 0 std::priv::__append +66bb4 4 166 197 +66bb8 2 166 197 +66bba 2 65 238 +66bbc 2 166 197 +66bbe 4 470 237 +66bc2 4 64 238 +66bc6 2 355 216 +66bc8 4 74 238 +66bcc 6 74 238 +66bd2 4 472 237 +66bd6 2 400 237 +66bd8 e 304 237 +66be6 a 306 237 +66bf0 4 307 237 +66bf4 8 307 237 +66bfc e 134 222 +66c0a 2 107 243 +66c0c 4 107 243 +66c10 2 107 243 +66c12 c 106 243 +66c1e 2 107 243 +66c20 8 106 243 +66c28 4 101 205 +66c2c 2 107 243 +66c2e 4 64 238 +66c32 4 96 238 +66c36 2 96 238 +66c38 6 97 238 +66c3e 4 70 213 +66c42 2 97 238 +66c44 2 135 222 +66c46 4 161 201 +66c4a 4 161 201 +66c4e 2 479 237 +66c50 2 164 238 +66c52 2 160 238 +66c54 8 165 238 +66c5c 2 565 197 +66c5e 2 482 237 +66c60 2 107 243 +66c62 2 232 246 +66c64 2 90 238 +66c66 2 107 243 +66c68 2 483 237 +66c6a 8 106 243 +66c72 4 101 205 +66c76 a 485 237 +66c80 4 64 213 +66c84 6 67 213 +66c8a 4 64 213 +66c8e 6 135 222 +66c94 8 74 238 +66c9c c 600 236 +FUNC 66ca8 12c 0 std::priv::__append +66ca8 6 174 197 +66cae 2 209 206 +66cb0 2 174 197 +66cb2 4 209 206 +66cb6 4 174 197 +66cba 6 209 206 +66cc0 8 177 197 +66cc8 4 470 237 +66ccc 4 64 238 +66cd0 4 355 216 +66cd4 2 74 238 +66cd6 4 355 216 +66cda 2 74 238 +66cdc 8 74 238 +66ce4 4 472 237 +66ce8 2 565 197 +66cea 2 482 237 +66cec 2 107 243 +66cee 2 267 246 +66cf0 2 107 243 +66cf2 2 483 237 +66cf4 8 106 243 +66cfc 4 484 237 +66d00 6 101 205 +66d06 2 485 237 +66d08 6 178 197 +66d0e 2 400 237 +66d10 c 304 237 +66d1c 2 400 237 +66d1e a 304 237 +66d28 a 306 237 +66d32 4 307 237 +66d36 4 307 237 +66d3a 6 64 213 +66d40 6 67 213 +66d46 2 107 243 +66d48 4 107 243 +66d4c 2 107 243 +66d4e c 106 243 +66d5a 2 107 243 +66d5c 8 106 243 +66d64 4 64 238 +66d68 2 101 205 +66d6a 2 96 238 +66d6c 4 107 243 +66d70 4 101 205 +66d74 2 96 238 +66d76 2 96 238 +66d78 6 97 238 +66d7e 4 70 213 +66d82 2 97 238 +66d84 2 135 222 +66d86 4 323 201 +66d8a 4 161 201 +66d8e 4 161 201 +66d92 2 479 237 +66d94 2 164 238 +66d96 2 160 238 +66d98 6 165 238 +66d9e 4 307 237 +66da2 10 134 222 +66db2 6 135 222 +66db8 c 74 238 +66dc4 8 600 236 +66dcc 8 64 213 +FUNC 66dd4 120 0 std::priv::__append +66dd4 4 169 197 +66dd8 2 169 197 +66dda 2 65 238 +66ddc 4 400 237 +66de0 6 169 197 +66de6 4 470 237 +66dea 2 355 216 +66dec 4 64 238 +66df0 2 355 216 +66df2 4 74 238 +66df6 8 74 238 +66dfe 4 472 237 +66e02 2 565 197 +66e04 2 482 237 +66e06 2 107 243 +66e08 2 267 246 +66e0a 2 107 243 +66e0c 2 483 237 +66e0e 8 106 243 +66e16 4 484 237 +66e1a 6 101 205 +66e20 6 485 237 +66e26 2 400 237 +66e28 c 304 237 +66e34 2 400 237 +66e36 a 304 237 +66e40 c 306 237 +66e4c 4 307 237 +66e50 4 307 237 +66e54 c 64 213 +66e60 8 67 213 +66e68 2 107 243 +66e6a 4 107 243 +66e6e 2 107 243 +66e70 c 106 243 +66e7c 2 107 243 +66e7e 8 106 243 +66e86 4 64 238 +66e8a 2 101 205 +66e8c 2 96 238 +66e8e 4 107 243 +66e92 2 101 205 +66e94 2 96 238 +66e96 2 96 238 +66e98 6 97 238 +66e9e 4 70 213 +66ea2 2 97 238 +66ea4 2 135 222 +66ea6 4 323 201 +66eaa 4 161 201 +66eae 4 161 201 +66eb2 4 479 237 +66eb6 2 164 238 +66eb8 2 160 238 +66eba 8 165 238 +66ec2 4 307 237 +66ec6 10 134 222 +66ed6 6 135 222 +66edc c 74 238 +66ee8 c 600 236 +FUNC 66ef4 1c2 0 std::priv::_Time_Info::~_Time_Info +66ef4 4 72 242 +66ef8 4 72 242 +66efc 6 72 242 +66f02 8 72 242 +66f0a 2 72 242 +66f0c 4 72 242 +66f10 4 161 201 +66f14 4 72 242 +66f18 2 72 242 +66f1a 2 64 238 +66f1c 2 72 242 +66f1e 2 64 238 +66f20 4 96 238 +66f24 4 96 238 +66f28 4 97 238 +66f2c 4 161 201 +66f30 4 135 222 +66f34 4 72 242 +66f38 a 72 242 +66f42 2 72 242 +66f44 4 72 242 +66f48 4 161 201 +66f4c 4 72 242 +66f50 2 72 242 +66f52 2 64 238 +66f54 2 72 242 +66f56 2 64 238 +66f58 4 96 238 +66f5c 4 96 238 +66f60 4 97 238 +66f64 4 161 201 +66f68 4 135 222 +66f6c 4 72 242 +66f70 a 72 242 +66f7a 2 72 242 +66f7c 4 72 242 +66f80 4 161 201 +66f84 4 72 242 +66f88 2 72 242 +66f8a 2 64 238 +66f8c 2 72 242 +66f8e 2 64 238 +66f90 4 96 238 +66f94 4 96 238 +66f98 4 97 238 +66f9c 4 161 201 +66fa0 4 135 222 +66fa4 4 72 242 +66fa8 8 64 238 +66fb0 4 96 238 +66fb4 2 96 238 +66fb6 6 97 238 +66fbc 4 161 201 +66fc0 4 161 201 +66fc4 8 64 238 +66fcc 4 96 238 +66fd0 2 96 238 +66fd2 6 97 238 +66fd8 4 161 201 +66fdc 4 161 201 +66fe0 8 64 238 +66fe8 4 96 238 +66fec 2 96 238 +66fee 6 97 238 +66ff4 4 161 201 +66ff8 4 161 201 +66ffc 8 64 238 +67004 4 96 238 +67008 2 96 238 +6700a 6 97 238 +67010 4 161 201 +67014 4 161 201 +67018 4 64 238 +6701c 4 96 238 +67020 2 96 238 +67022 6 97 238 +67028 4 161 201 +6702c 4 161 201 +67030 6 72 242 +67036 10 135 222 +67046 6 72 242 +6704c c 135 222 +67058 28 121 237 +67080 10 72 242 +67090 2 72 242 +67092 8 121 237 +6709a 6 72 242 +670a0 6 72 242 +670a6 2 72 242 +670a8 8 121 237 +670b0 6 72 242 +FUNC 670b8 1ce 0 std::priv::_WTime_Info::~_WTime_Info +670b8 4 80 242 +670bc a 80 242 +670c6 e 80 242 +670d4 4 161 201 +670d8 4 80 242 +670dc 2 80 242 +670de 2 64 238 +670e0 2 80 242 +670e2 2 64 238 +670e4 4 96 238 +670e8 4 96 238 +670ec 4 97 238 +670f0 4 323 201 +670f4 4 161 201 +670f8 4 135 222 +670fc 4 80 242 +67100 a 80 242 +6710a 2 80 242 +6710c 4 80 242 +67110 4 161 201 +67114 4 80 242 +67118 2 80 242 +6711a 2 64 238 +6711c 2 80 242 +6711e 2 64 238 +67120 4 96 238 +67124 4 96 238 +67128 4 97 238 +6712c 4 323 201 +67130 4 161 201 +67134 4 135 222 +67138 4 80 242 +6713c a 80 242 +67146 2 80 242 +67148 4 80 242 +6714c 4 161 201 +67150 4 80 242 +67154 2 80 242 +67156 2 64 238 +67158 2 80 242 +6715a 2 64 238 +6715c 4 96 238 +67160 4 96 238 +67164 4 97 238 +67168 4 323 201 +6716c 4 161 201 +67170 4 135 222 +67174 4 80 242 +67178 8 64 238 +67180 4 96 238 +67184 2 96 238 +67186 6 97 238 +6718c 4 161 201 +67190 4 161 201 +67194 8 64 238 +6719c 4 96 238 +671a0 2 96 238 +671a2 6 97 238 +671a8 4 161 201 +671ac 4 161 201 +671b0 8 64 238 +671b8 4 96 238 +671bc 2 96 238 +671be 6 97 238 +671c4 4 161 201 +671c8 4 161 201 +671cc 8 64 238 +671d4 4 96 238 +671d8 2 96 238 +671da 6 97 238 +671e0 4 161 201 +671e4 4 161 201 +671e8 4 64 238 +671ec 4 96 238 +671f0 2 96 238 +671f2 6 97 238 +671f8 4 161 201 +671fc 4 161 201 +67200 6 80 242 +67206 10 135 222 +67216 6 80 242 +6721c c 135 222 +67228 28 121 237 +67250 10 80 242 +67260 2 80 242 +67262 8 121 237 +6726a 6 80 242 +67270 6 80 242 +67276 2 80 242 +67278 8 121 237 +67280 6 80 242 +FUNC 67288 6f4 0 void std::priv::__write_formatted_timeT(std::priv::__basic_iostring&, std::ctype const&, char, char, std::priv::_WTime_Info const&, tm const*) +67288 6 213 197 +6728e 4 220 197 +67292 a 213 197 +6729c b2 220 197 +6734e 12 206 206 +67360 24 381 197 +67384 4 420 197 +67388 4 421 197 +6738c 2 420 197 +6738e 6 421 197 +67394 6 452 197 +6739a 2 338 197 +6739c 12 234 197 +673ae 2 235 197 +673b0 2 304 197 +673b2 6 304 197 +673b8 2 304 197 +673ba 10 348 197 +673ca 2 349 197 +673cc 22 287 197 +673ee 8 248 197 +673f6 6 342 197 +673fc e 343 197 +6740a 2 344 197 +6740c 8 292 197 +67414 a 342 197 +6741e 6 234 197 +67424 14 226 197 +67438 2 227 197 +6743a 14 206 206 +6744e 6 386 197 +67454 2 387 197 +67456 2 386 197 +67458 4 387 197 +6745c e 370 197 +6746a e 370 197 +67478 2 64 238 +6747a 4 96 238 +6747e 4 96 238 +67482 4 97 238 +67486 6 161 201 +6748c 6 161 201 +67492 28 278 197 +674ba 2 279 197 +674bc 2 268 197 +674be 4 268 197 +674c2 4 268 197 +674c6 e 268 197 +674d4 4 283 197 +674d8 a 283 197 +674e2 2 284 197 +674e4 26 357 197 +6750a 8 206 206 +67512 c 352 197 +6751e 6 273 197 +67524 12 273 197 +67536 6 243 197 +6753c 12 243 197 +6754e 2 238 197 +67550 6 238 197 +67556 6 238 197 +6755c 26 313 197 +67582 4 222 197 +67586 e 318 197 +67594 e 309 197 +675a2 2 310 197 +675a4 8 297 197 +675ac 18 297 197 +675c4 6 420 197 +675ca 6 253 197 +675d0 10 253 197 +675e0 c 366 197 +675ec e 366 197 +675fa 2 64 238 +675fc 6 96 238 +67602 6 96 238 +67608 4 97 238 +6760c 6 161 201 +67612 6 135 222 +67618 c 374 197 +67624 e 374 197 +67632 2 64 238 +67634 6 96 238 +6763a 6 96 238 +67640 4 97 238 +67644 4 161 201 +67648 6 161 201 +6764e 6 258 197 +67654 4 258 197 +67658 c 258 197 +67664 4 258 197 +67668 8 258 197 +67670 2 258 197 +67672 8 258 197 +6767a 8 258 197 +67682 4 258 197 +67686 30 259 197 +676b6 6 259 197 +676bc 6 283 197 +676c2 6 282 197 +676c8 10 282 197 +676d8 2 394 197 +676da 4 195 197 +676de 2 394 197 +676e0 4 195 197 +676e4 2 393 197 +676e6 1c 195 197 +67702 6 395 197 +67708 8 393 197 +67710 a 401 197 +6771a 24 401 197 +6773e 1e 401 197 +6775c 2 401 197 +6775e 24 195 197 +67782 2 402 197 +67784 8 404 197 +6778c 2 409 197 +6778e 4 414 197 +67792 8 409 197 +6779a 16 417 197 +677b0 2 418 197 +677b2 a 263 197 +677bc 1c 297 197 +677d8 28 411 197 +67800 2 412 197 +67802 e 253 197 +67810 8 254 197 +67818 6 283 197 +6781e e 282 197 +6782c e 283 197 +6783a 6 258 197 +67840 c 268 197 +6784c 8 269 197 +67854 6 283 197 +6785a e 273 197 +67868 8 274 197 +67870 6 283 197 +67876 e 243 197 +67884 8 244 197 +6788c 6 283 197 +67892 6 397 197 +67898 a 398 197 +678a2 20 398 197 +678c2 18 398 197 +678da 2 398 197 +678dc 26 195 197 +67902 a 401 197 +6790c 6 398 197 +67912 6a 121 237 +FUNC 6797c a 0 std::priv::__write_formatted_time(std::priv::__basic_iostring&, std::ctype const&, char, char, std::priv::_WTime_Info const&, tm const*) +6797c 2 462 197 +6797e 8 462 197 +FUNC 67988 52 0 void std::priv::__subformat(std::priv::__basic_iostring&, std::ctype const&, std::string const&, std::priv::_WTime_Info const&, tm const*) +67988 6 148 197 +6798e 2 65 238 +67990 2 148 197 +67992 2 151 197 +67994 8 148 197 +6799c 4 152 197 +679a0 6 153 197 +679a6 2 156 197 +679a8 2 155 197 +679aa 2 154 197 +679ac 4 156 197 +679b0 e 159 197 +679be 4 152 197 +679c2 6 163 197 +679c8 a 161 197 +679d2 8 157 197 +FUNC 679dc 6e0 0 void std::priv::__write_formatted_timeT(std::priv::__basic_iostring&, std::ctype const&, char, char, std::priv::_Time_Info const&, tm const*) +679dc 6 213 197 +679e2 4 220 197 +679e6 a 213 197 +679f0 b2 220 197 +67aa2 12 101 206 +67ab4 24 381 197 +67ad8 4 420 197 +67adc 2 421 197 +67ade 2 420 197 +67ae0 6 421 197 +67ae6 6 452 197 +67aec 2 338 197 +67aee 12 234 197 +67b00 2 235 197 +67b02 2 304 197 +67b04 6 304 197 +67b0a 2 304 197 +67b0c 10 348 197 +67b1c 2 349 197 +67b1e 22 287 197 +67b40 8 248 197 +67b48 6 342 197 +67b4e c 343 197 +67b5a 2 344 197 +67b5c 8 292 197 +67b64 a 342 197 +67b6e 6 234 197 +67b74 14 226 197 +67b88 2 227 197 +67b8a 14 101 206 +67b9e 6 386 197 +67ba4 2 387 197 +67ba6 2 386 197 +67ba8 4 387 197 +67bac e 370 197 +67bba e 370 197 +67bc8 2 64 238 +67bca 4 96 238 +67bce 4 96 238 +67bd2 4 97 238 +67bd6 6 161 201 +67bdc 6 161 201 +67be2 26 278 197 +67c08 2 279 197 +67c0a 2 268 197 +67c0c 4 268 197 +67c10 4 268 197 +67c14 e 268 197 +67c22 4 283 197 +67c26 8 283 197 +67c2e 2 284 197 +67c30 26 357 197 +67c56 8 101 206 +67c5e c 352 197 +67c6a 6 273 197 +67c70 12 273 197 +67c82 6 243 197 +67c88 12 243 197 +67c9a 2 238 197 +67c9c 6 238 197 +67ca2 6 238 197 +67ca8 26 313 197 +67cce 4 222 197 +67cd2 e 318 197 +67ce0 e 309 197 +67cee 2 310 197 +67cf0 8 297 197 +67cf8 18 297 197 +67d10 6 420 197 +67d16 6 253 197 +67d1c 10 253 197 +67d2c c 366 197 +67d38 e 366 197 +67d46 2 64 238 +67d48 6 96 238 +67d4e 6 96 238 +67d54 4 97 238 +67d58 6 161 201 +67d5e 6 135 222 +67d64 c 374 197 +67d70 e 374 197 +67d7e 2 64 238 +67d80 6 96 238 +67d86 6 96 238 +67d8c 4 97 238 +67d90 4 161 201 +67d94 6 161 201 +67d9a 6 258 197 +67da0 4 258 197 +67da4 c 258 197 +67db0 4 258 197 +67db4 8 258 197 +67dbc 2 258 197 +67dbe 8 258 197 +67dc6 8 258 197 +67dce 4 258 197 +67dd2 2c 259 197 +67dfe 6 259 197 +67e04 6 283 197 +67e0a 6 282 197 +67e10 10 282 197 +67e20 2 394 197 +67e22 4 195 197 +67e26 2 394 197 +67e28 4 195 197 +67e2c 2 393 197 +67e2e 1c 195 197 +67e4a 6 395 197 +67e50 8 393 197 +67e58 a 401 197 +67e62 22 401 197 +67e84 1c 401 197 +67ea0 2 401 197 +67ea2 24 195 197 +67ec6 2 402 197 +67ec8 8 404 197 +67ed0 2 409 197 +67ed2 4 414 197 +67ed6 8 409 197 +67ede 16 417 197 +67ef4 2 418 197 +67ef6 a 263 197 +67f00 1c 297 197 +67f1c 28 411 197 +67f44 2 412 197 +67f46 e 253 197 +67f54 8 254 197 +67f5c 6 283 197 +67f62 e 282 197 +67f70 e 283 197 +67f7e 6 258 197 +67f84 c 268 197 +67f90 8 269 197 +67f98 6 283 197 +67f9e e 273 197 +67fac 8 274 197 +67fb4 6 283 197 +67fba e 243 197 +67fc8 8 244 197 +67fd0 6 283 197 +67fd6 6 397 197 +67fdc a 398 197 +67fe6 1c 398 197 +68002 18 398 197 +6801a 2 398 197 +6801c 26 195 197 +68042 a 401 197 +6804c 6 398 197 +68052 6a 121 237 +FUNC 680bc a 0 std::priv::__write_formatted_time(std::priv::__basic_iostring&, std::ctype const&, char, char, std::priv::_Time_Info const&, tm const*) +680bc 2 457 197 +680be 8 457 197 +FUNC 680c8 52 0 void std::priv::__subformat(std::priv::__basic_iostring&, std::ctype const&, std::string const&, std::priv::_Time_Info const&, tm const*) +680c8 6 148 197 +680ce 2 65 238 +680d0 2 148 197 +680d2 2 151 197 +680d4 8 148 197 +680dc 4 152 197 +680e0 6 153 197 +680e6 2 156 197 +680e8 2 155 197 +680ea 2 154 197 +680ec 4 156 197 +680f0 e 159 197 +680fe 4 152 197 +68102 6 163 197 +68108 a 161 197 +68112 8 157 197 +FUNC 6811c 284 0 std::priv::time_init::time_init +6811c 8 502 197 +68124 2 124 238 +68126 2 120 238 +68128 4 165 237 +6812c 2 481 201 +6812e 2 165 237 +68130 4 124 238 +68134 2 90 238 +68136 2 101 205 +68138 2 124 238 +6813a 2 101 205 +6813c 4 120 238 +68140 2 124 238 +68142 2 481 201 +68144 4 124 238 +68148 2 90 238 +6814a 6 165 237 +68150 2 101 205 +68152 2 124 238 +68154 2 101 205 +68156 4 120 238 +6815a 2 124 238 +6815c 2 481 201 +6815e 4 124 238 +68162 2 90 238 +68164 4 165 237 +68168 2 101 205 +6816a 4 124 238 +6816e 2 101 205 +68170 2 120 238 +68172 2 481 201 +68174 4 124 238 +68178 2 90 238 +6817a 4 165 237 +6817e 2 101 205 +68180 2 124 238 +68182 2 101 205 +68184 2 120 238 +68186 2 481 201 +68188 4 124 238 +6818c 2 90 238 +6818e c 72 242 +6819a 8 101 205 +681a2 4 502 197 +681a6 2 120 238 +681a8 4 124 238 +681ac 2 481 201 +681ae 4 124 238 +681b2 2 90 238 +681b4 4 72 242 +681b8 2 72 242 +681ba 4 101 205 +681be 2 72 242 +681c0 4 72 242 +681c4 c 502 197 +681d0 4 101 205 +681d4 2 502 197 +681d6 2 120 238 +681d8 4 124 238 +681dc 4 481 201 +681e0 4 124 238 +681e4 2 90 238 +681e6 4 101 205 +681ea 2 72 242 +681ec 4 101 205 +681f0 2 72 242 +681f2 4 120 238 +681f6 2 124 238 +681f8 4 481 201 +681fc 6 124 238 +68202 4 90 238 +68206 4 120 238 +6820a 2 101 205 +6820c 4 124 238 +68210 2 101 205 +68212 4 120 238 +68216 4 481 201 +6821a 6 124 238 +68220 2 101 205 +68222 4 90 238 +68226 2 78 197 +68228 2 77 197 +6822a 2 101 205 +6822c 4 503 197 +68230 8 78 197 +68238 6 229 246 +6823e 4 78 197 +68242 4 355 237 +68246 6 78 197 +6824c 4 355 237 +68250 2 77 197 +68252 8 77 197 +6825a 12 80 197 +6826c 6 229 246 +68272 4 355 237 +68276 4 80 197 +6827a 4 355 237 +6827e 2 79 197 +68280 4 79 197 +68284 42 355 237 +682c6 8 504 197 +682ce a 121 237 +682d8 a 504 197 +682e2 2 124 238 +682e4 c 72 242 +682f0 4 72 242 +682f4 8 121 237 +682fc 4 72 242 +68300 2 72 242 +68302 8 121 237 +6830a 4 72 242 +6830e 2 72 242 +68310 8 121 237 +68318 4 72 242 +6831c a 72 242 +68326 4 124 238 +6832a 10 72 242 +6833a 4 72 242 +6833e 8 121 237 +68346 6 72 242 +6834c e 72 242 +6835a 4 72 242 +6835e 8 121 237 +68366 6 72 242 +6836c 34 121 237 +FUNC 683a0 2b0 0 std::priv::time_init::time_init +683a0 8 527 197 +683a8 2 124 238 +683aa 2 120 238 +683ac 4 165 237 +683b0 2 481 201 +683b2 2 165 237 +683b4 4 124 238 +683b8 2 90 238 +683ba 2 101 205 +683bc 2 124 238 +683be 2 101 205 +683c0 4 120 238 +683c4 2 124 238 +683c6 2 481 201 +683c8 4 124 238 +683cc 2 90 238 +683ce 6 165 237 +683d4 2 101 205 +683d6 2 124 238 +683d8 2 101 205 +683da 4 120 238 +683de 2 124 238 +683e0 2 481 201 +683e2 4 124 238 +683e6 2 90 238 +683e8 4 165 237 +683ec 2 101 205 +683ee 4 124 238 +683f2 2 101 205 +683f4 2 120 238 +683f6 2 481 201 +683f8 4 124 238 +683fc 2 90 238 +683fe 4 165 237 +68402 2 101 205 +68404 2 124 238 +68406 2 101 205 +68408 2 120 238 +6840a 2 481 201 +6840c 4 124 238 +68410 2 90 238 +68412 c 80 242 +6841e 8 101 205 +68426 4 527 197 +6842a 2 120 238 +6842c 4 124 238 +68430 2 481 201 +68432 4 124 238 +68436 2 90 238 +68438 4 80 242 +6843c 2 80 242 +6843e 4 101 205 +68442 2 80 242 +68444 4 80 242 +68448 c 527 197 +68454 4 101 205 +68458 2 527 197 +6845a 2 120 238 +6845c 4 124 238 +68460 4 481 201 +68464 4 124 238 +68468 2 90 238 +6846a 4 101 205 +6846e 2 80 242 +68470 4 101 205 +68474 2 80 242 +68476 4 120 238 +6847a 2 124 238 +6847c 8 120 238 +68484 4 481 201 +68488 6 124 238 +6848e 4 101 205 +68492 4 120 238 +68496 2 101 205 +68498 4 124 238 +6849c 2 101 205 +6849e 4 120 238 +684a2 4 481 201 +684a6 6 124 238 +684ac 6 101 205 +684b2 2 90 197 +684b4 2 89 197 +684b6 2 101 205 +684b8 4 528 197 +684bc 16 90 197 +684d2 6 264 246 +684d8 c 355 237 +684e4 2 89 197 +684e6 8 89 197 +684ee 16 92 197 +68504 6 264 246 +6850a c 355 237 +68516 2 91 197 +68518 4 91 197 +6851c a 264 246 +68526 c 355 237 +68532 a 264 246 +6853c 36 355 237 +68572 8 529 197 +6857a a 121 237 +68584 a 529 197 +6858e 2 124 238 +68590 e 80 242 +6859e 6 80 242 +685a4 8 121 237 +685ac 4 80 242 +685b0 2 80 242 +685b2 8 121 237 +685ba 4 80 242 +685be 2 80 242 +685c0 8 121 237 +685c8 4 80 242 +685cc a 80 242 +685d6 4 124 238 +685da 10 80 242 +685ea 4 80 242 +685ee 8 121 237 +685f6 6 80 242 +685fc e 80 242 +6860a 4 80 242 +6860e 8 121 237 +68616 6 80 242 +6861c 34 121 237 +FUNC 68650 1c 0 std::messages::~messages +68650 4 107 219 +68654 18 107 219 +FUNC 6866c 1c 0 std::messages::~messages +6866c 4 74 219 +68670 18 74 219 +FUNC 68688 20 0 std::messages::~messages +68688 4 107 219 +6868c e 107 219 +6869a 6 107 219 +686a0 8 107 219 +FUNC 686a8 20 0 std::messages::~messages +686a8 4 74 219 +686ac e 74 219 +686ba 6 74 219 +686c0 8 74 219 +FUNC 686c8 2c 0 std::messages::messages +686c8 2 188 188 +686ca 2 340 240 +686cc 2 86 218 +686ce 2 188 188 +686d0 2 188 188 +686d2 4 86 218 +686d6 4 340 240 +686da 2 457 240 +686dc 4 340 240 +686e0 2 86 218 +686e2 12 189 188 +FUNC 686f4 2c 0 std::messages::messages +686f4 2 217 188 +686f6 2 340 240 +686f8 2 86 218 +686fa 2 217 188 +686fc 2 217 188 +686fe 4 86 218 +68702 4 340 240 +68706 2 457 240 +68708 4 340 240 +6870c 2 86 218 +6870e 12 218 188 +FUNC 68720 e 0 std::messages::do_get(int, int, int, std::string const&) const +68720 2 78 219 +68722 2 78 219 +68724 a 80 219 +FUNC 68730 3a 0 std::basic_string, std::allocator >::basic_string +68730 2 647 236 +68732 2 647 236 +68734 2 112 238 +68736 2 481 201 +68738 2 89 238 +6873a 2 65 238 +6873c 4 378 237 +68740 6 379 237 +68746 2 107 243 +68748 2 66 238 +6874a 2 107 243 +6874c 8 106 243 +68754 2 107 243 +68756 2 380 237 +68758 4 101 205 +6875c e 649 236 +FUNC 6876c e 0 std::messages::do_get(int, int, int, std::basic_string, std::allocator > const&) const +6876c 2 111 219 +6876e 2 111 219 +68770 a 113 219 +FUNC 68d20 34 0 __popcountsi2 +68d20 8 846 154 +68d28 c 847 154 +68d34 8 848 154 +68d3c a 849 154 +68d46 e 858 154 +FUNC 68d54 34 0 __gnu_ldivmod_helper +68d54 2 38 151 +68d56 8 38 151 +68d5e 8 41 151 +68d66 16 42 151 +68d7c 2 44 151 +68d7e 4 42 151 +68d82 6 44 151 +FUNC 68d88 30 0 __gnu_uldivmod_helper +68d88 2 50 151 +68d8a 8 50 151 +68d92 4 53 151 +68d96 4 54 151 +68d9a 4 53 151 +68d9e e 54 151 +68dac 2 56 151 +68dae 4 54 151 +68db2 6 56 151 +FUNC 68db8 16 0 selfrel_offset31 +68db8 2 458 153 +68dba 4 460 153 +68dbe 8 461 153 +68dc6 4 463 153 +68dca 2 465 153 +68dcc 2 466 153 +FUNC 68dce 6e 0 search_EIT_table +68dce 2 158 155 +68dd0 2 164 155 +68dd2 2 158 155 +68dd4 4 163 155 +68dd8 2 167 155 +68dda 6 166 155 +68de0 4 167 155 +68de4 a 171 155 +68dee c 172 155 +68dfa 2 173 155 +68dfc 2 172 155 +68dfe 4 173 155 +68e02 a 174 155 +68e0c 8 178 155 +68e14 4 180 155 +68e18 6 182 155 +68e1e 2 184 155 +68e20 2 174 155 +68e22 4 184 155 +68e26 4 187 155 +68e2a 4 164 155 +68e2e 8 178 155 +68e36 6 189 155 +FUNC 68e3c 30 0 __gnu_unwind_get_pr_addr +68e3c 1c 471 153 +68e58 4 480 153 +68e5c 2 483 153 +68e5e e 485 153 +FUNC 68e6c a4 0 get_eit_entry +68e6c 2 206 155 +68e6e 2 197 155 +68e70 2 206 155 +68e72 2 208 155 +68e74 2 197 155 +68e76 2 206 155 +68e78 4 208 155 +68e7c 8 210 155 +68e84 4 212 155 +68e88 4 214 155 +68e8c 6 215 155 +68e92 a 221 155 +68e9c 2 220 155 +68e9e 6 221 155 +68ea4 a 224 155 +68eae 2 226 155 +68eb0 4 231 155 +68eb4 2 234 155 +68eb6 2 231 155 +68eb8 4 234 155 +68ebc 4 236 155 +68ec0 6 237 155 +68ec6 4 242 155 +68eca 2 245 155 +68ecc 4 246 155 +68ed0 4 253 155 +68ed4 2 254 155 +68ed6 2 252 155 +68ed8 2 258 155 +68eda 2 254 155 +68edc 6 258 155 +68ee2 4 261 155 +68ee6 4 262 155 +68eea 2 266 155 +68eec 2 262 155 +68eee a 274 155 +68ef8 4 272 155 +68efc 2 274 155 +68efe 2 272 155 +68f00 10 275 155 +FUNC 68f10 4a 0 restore_non_core_regs +68f10 2 126 153 +68f12 2 125 153 +68f14 2 125 153 +68f16 6 126 153 +68f1c 4 128 153 +68f20 6 129 153 +68f26 4 131 153 +68f2a 6 134 153 +68f30 8 135 153 +68f38 6 137 153 +68f3e a 138 153 +68f48 6 139 153 +68f4e a 140 153 +68f58 2 141 153 +FUNC 68f5a e 0 _Unwind_decode_typeinfo_ptr +68f5a 2 46 149 +68f5c 2 49 149 +68f5e 4 48 149 +68f62 2 55 149 +68f64 4 65 149 +FUNC 68f68 4 0 __gnu_unwind_24bit +68f68 4 73 149 +FUNC 68f6c 2 0 _Unwind_DebugHook +68f6c 2 134 155 +FUNC 68f6e 3a 0 unwind_phase2 +68f6e 6 282 155 +68f74 c 288 155 +68f80 4 289 155 +68f84 4 291 155 +68f88 a 294 155 +68f92 4 297 155 +68f96 4 299 155 +68f9a 8 302 155 +68fa2 2 302 155 +68fa4 4 302 155 +FUNC 68fa8 bc 0 unwind_phase2_forced +68fa8 4 310 155 +68fac 2 311 155 +68fae 2 310 155 +68fb0 2 311 155 +68fb2 2 322 155 +68fb4 2 312 155 +68fb6 4 310 155 +68fba 6 319 155 +68fc0 2 312 155 +68fc2 4 319 155 +68fc6 2 322 155 +68fc8 2 313 155 +68fca a 332 155 +68fd4 a 336 155 +68fde 2 332 155 +68fe0 2 342 155 +68fe2 2 344 155 +68fe4 4 346 155 +68fe8 2 344 155 +68fea a 346 155 +68ff4 a 349 155 +68ffe 2 352 155 +69000 4 349 155 +69004 6 363 155 +6900a 2 365 155 +6900c 2 363 155 +6900e 2 365 155 +69010 14 368 155 +69024 4 370 155 +69028 4 373 155 +6902c c 376 155 +69038 8 378 155 +69040 4 380 155 +69044 2 387 155 +69046 2 387 155 +69048 4 387 155 +6904c 6 387 155 +69052 6 371 155 +69058 c 388 155 +FUNC 69064 4 0 _Unwind_GetCFA +69064 2 400 155 +69066 2 401 155 +FUNC 69068 4e 0 __gnu_Unwind_RaiseException +69068 2 412 155 +6906a 2 417 155 +6906c 2 412 155 +6906e 2 417 155 +69070 4 412 155 +69074 a 420 155 +6907e 6 422 155 +69084 8 428 155 +6908c 4 428 155 +69090 a 432 155 +6909a 4 435 155 +6909e 6 439 155 +690a4 4 440 155 +690a8 8 447 155 +690b0 6 448 155 +FUNC 690b6 14 0 __gnu_Unwind_ForcedUnwind +690b6 2 461 155 +690b8 2 463 155 +690ba 2 466 155 +690bc 2 462 155 +690be 2 466 155 +690c0 8 468 155 +690c8 2 469 155 +FUNC 690ca 44 0 __gnu_Unwind_Resume +690ca 2 476 155 +690cc 2 482 155 +690ce 2 480 155 +690d0 4 476 155 +690d4 2 480 155 +690d6 4 482 155 +690da 8 484 155 +690e2 a 491 155 +690ec 8 494 155 +690f4 8 502 155 +690fc 8 498 155 +69104 2 498 155 +69106 4 498 155 +6910a 4 505 155 +FUNC 6910e 1a 0 __gnu_Unwind_Resume_or_Rethrow +6910e 2 515 155 +69110 6 516 155 +69116 6 517 155 +6911c 4 520 155 +69120 6 522 155 +69126 2 523 155 +FUNC 69128 2 0 _Unwind_Complete +69128 2 529 155 +FUNC 6912a 10 0 _Unwind_DeleteException +6912a 2 536 155 +6912c 8 537 155 +69134 4 538 155 +69138 2 539 155 +FUNC 6913a 34 0 _Unwind_VRS_Get +6913a 2 160 153 +6913c 2 160 153 +6913e 10 163 153 +6914e 4 178 153 +69152 2 168 153 +69154 4 166 153 +69158 4 167 153 +6915c 8 169 153 +69164 2 170 153 +69166 2 169 153 +69168 2 170 153 +6916a 2 175 153 +6916c 2 180 153 +FUNC 6916e 16 0 _Unwind_GetGR +6916e 2 221 150 +69170 2 221 150 +69172 c 223 150 +6917e 6 225 150 +FUNC 69184 34 0 _Unwind_VRS_Set +69184 2 190 153 +69186 2 190 153 +69188 10 193 153 +69198 4 209 153 +6919c 2 198 153 +6919e 4 196 153 +691a2 4 197 153 +691a6 a 200 153 +691b0 4 201 153 +691b4 2 206 153 +691b6 2 211 153 +FUNC 691b8 18 0 _Unwind_SetGR +691b8 2 232 150 +691ba 4 232 150 +691be e 233 150 +691cc 4 234 150 +FUNC 691d0 70 0 __gnu_Unwind_Backtrace +691d0 4 549 155 +691d4 2 557 155 +691d6 2 549 155 +691d8 2 557 155 +691da 4 549 155 +691de a 560 155 +691e8 6 562 155 +691ee a 567 155 +691f8 4 567 155 +691fc 4 569 155 +69200 a 578 155 +6920a 6 581 155 +69210 4 581 155 +69214 c 589 155 +69220 4 594 155 +69224 6 594 155 +6922a 6 596 155 +69230 10 598 155 +FUNC 69240 280 0 __gnu_unwind_pr_common +69240 4 610 155 +69244 4 610 155 +69248 8 620 155 +69250 2 622 155 +69252 2 610 155 +69254 2 625 155 +69256 2 610 155 +69258 8 623 155 +69260 2 624 155 +69262 4 625 155 +69266 4 627 155 +6926a 6 628 155 +69270 4 629 155 +69274 6 631 155 +6927a 4 633 155 +6927e 2 634 155 +69280 2 636 155 +69282 2 634 155 +69284 2 636 155 +69286 2 635 155 +69288 4 636 155 +6928c 2 635 155 +6928e 6 640 155 +69294 2 641 155 +69296 c 643 155 +692a2 8 646 155 +692aa 6 651 155 +692b0 4 654 155 +692b4 4 655 155 +692b8 2 660 155 +692ba 2 659 155 +692bc 2 661 155 +692be 2 660 155 +692c0 8 664 155 +692c8 2 665 155 +692ca 2 664 155 +692cc 2 665 155 +692ce 2 664 155 +692d0 4 665 155 +692d4 4 666 155 +692d8 2 666 155 +692da 4 666 155 +692de c 666 155 +692ea 18 668 155 +69302 8 672 155 +6930a 4 673 155 +6930e 6 679 155 +69314 2 682 155 +69316 2 679 155 +69318 6 683 155 +6931e 6 683 155 +69324 8 686 155 +6932c 2 690 155 +6932e 2 691 155 +69330 6 695 155 +69336 4 697 155 +6933a 4 701 155 +6933e 8 706 155 +69346 6 710 155 +6934c 4 711 155 +69350 2 715 155 +69352 4 714 155 +69356 4 716 155 +6935a 2 714 155 +6935c 8 716 155 +69364 4 724 155 +69368 2 722 155 +6936a a 727 155 +69374 2 726 155 +69376 6 732 155 +6937c 2 735 155 +6937e 6 737 155 +69384 a 747 155 +6938e 4 747 155 +69392 6 748 155 +69398 6 754 155 +6939e 2 755 155 +693a0 2 754 155 +693a2 6 755 155 +693a8 6 756 155 +693ae 2 760 155 +693b0 2 761 155 +693b2 8 764 155 +693ba 6 766 155 +693c0 4 768 155 +693c4 6 768 155 +693ca 8 768 155 +693d2 6 775 155 +693d8 2 779 155 +693da a 777 155 +693e4 4 778 155 +693e8 4 780 155 +693ec 2 778 155 +693ee 6 780 155 +693f4 6 780 155 +693fa a 797 155 +69404 4 797 155 +69408 6 798 155 +6940e 4 803 155 +69412 4 805 155 +69416 2 804 155 +69418 2 806 155 +6941a 2 804 155 +6941c 2 806 155 +6941e 6 808 155 +69424 8 810 155 +6942c 4 812 155 +69430 2 814 155 +69432 2 812 155 +69434 6 814 155 +6943a 8 815 155 +69442 4 819 155 +69446 6 821 155 +6944c 2 822 155 +6944e 8 823 155 +69456 2 824 155 +69458 4 616 155 +6945c 6 834 155 +69462 6 837 155 +69468 8 842 155 +69470 4 842 155 +69474 2 846 155 +69476 2 854 155 +69478 4 846 155 +6947c 8 849 155 +69484 2 849 155 +69486 2 849 155 +69488 8 849 155 +69490 2 850 155 +69492 2 849 155 +69494 8 850 155 +6949c 4 851 155 +694a0 4 828 155 +694a4 8 789 155 +694ac 2 790 155 +694ae 2 788 155 +694b0 2 792 155 +694b2 2 790 155 +694b4 2 791 155 +694b6 a 855 155 +FUNC 694c0 a 0 __aeabi_unwind_cpp_pr0 +694c0 2 493 153 +694c2 6 494 153 +694c8 2 495 153 +FUNC 694ca a 0 __aeabi_unwind_cpp_pr1 +694ca 2 501 153 +694cc 6 502 153 +694d2 2 503 153 +FUNC 694d4 a 0 __aeabi_unwind_cpp_pr2 +694d4 2 509 153 +694d6 6 510 153 +694dc 2 511 153 +FUNC 694de 24c 0 _Unwind_VRS_Pop +694de 4 220 153 +694e2 18 223 153 +694fa 2 232 153 +694fc 6 231 153 +69502 2 234 153 +69504 2 235 153 +69506 4 234 153 +6950a a 239 153 +69514 6 240 153 +6951a 4 237 153 +6951e 4 237 153 +69522 2 246 153 +69524 6 243 153 +6952a 4 244 153 +6952e a 262 153 +69538 2 250 153 +6953a 4 251 153 +6953e 2 250 153 +69540 8 263 153 +69548 4 378 153 +6954c 2 373 153 +6954e 2 372 153 +69550 2 373 153 +69552 6 378 153 +69558 8 381 153 +69560 2 385 153 +69562 2 384 153 +69564 2 385 153 +69566 2 384 153 +69568 6 385 153 +6956e 4 391 153 +69572 2 396 153 +69574 4 391 153 +69578 2 397 153 +6957a 2 396 153 +6957c 2 395 153 +6957e 2 398 153 +69580 2 397 153 +69582 6 398 153 +69588 a 399 153 +69592 2 402 153 +69594 6 405 153 +6959a 4 407 153 +6959e 4 415 153 +695a2 4 415 153 +695a6 8 418 153 +695ae 2 422 153 +695b0 2 421 153 +695b2 2 422 153 +695b4 2 421 153 +695b6 6 422 153 +695bc 8 428 153 +695c4 2 430 153 +695c6 2 431 153 +695c8 a 432 153 +695d2 8 433 153 +695da 2 431 153 +695dc 4 431 153 +695e0 2 436 153 +695e2 8 439 153 +695ea 4 263 153 +695ee 8 264 153 +695f6 4 444 153 +695fa 4 263 153 +695fe 6 269 153 +69604 2 270 153 +69606 4 274 153 +6960a 6 271 153 +69610 4 274 153 +69614 2 272 153 +69616 8 278 153 +6961e 4 296 153 +69622 4 307 153 +69626 6 308 153 +6962c 2 321 153 +6962e 4 326 153 +69632 4 327 153 +69636 4 329 153 +6963a 8 330 153 +69642 2 331 153 +69644 2 329 153 +69646 6 331 153 +6964c c 332 153 +69658 4 336 153 +6965c 8 340 153 +69664 a 342 153 +6966e 6 343 153 +69674 a 344 153 +6967e 4 348 153 +69682 2 349 153 +69684 2 352 153 +69686 4 355 153 +6968a 8 356 153 +69692 6 360 153 +69698 6 361 153 +6969e 6 364 153 +696a4 8 365 153 +696ac 4 274 153 +696b0 8 297 153 +696b8 2 299 153 +696ba 2 300 153 +696bc 2 299 153 +696be 6 300 153 +696c4 4 307 153 +696c8 6 312 153 +696ce 6 313 153 +696d4 4 316 153 +696d8 6 317 153 +696de 8 321 153 +696e6 8 308 153 +696ee c 280 153 +696fa 4 282 153 +696fe 6 285 153 +69704 4 286 153 +69708 6 296 153 +6970e 6 291 153 +69714 6 292 153 +6971a 4 257 153 +6971e 8 312 153 +69726 4 446 153 +FUNC 698fc 30 0 next_unwind_byte +698fc 2 84 152 +698fe 2 81 152 +69900 4 84 152 +69904 2 87 152 +69906 2 88 152 +69908 4 87 152 +6990c 4 89 152 +69910 a 90 152 +6991a 4 91 152 +6991e 2 94 152 +69920 2 97 152 +69922 2 94 152 +69924 2 98 152 +69926 2 99 152 +69928 2 98 152 +6992a 2 100 152 +FUNC 6992c 16 0 _Unwind_GetGR +6992c 2 220 150 +6992e e 223 150 +6993c 6 225 150 +FUNC 69942 8 0 unwind_UCB_from_context +69942 2 338 152 +69944 4 339 152 +69948 2 340 152 +FUNC 6994a 286 0 __gnu_unwind_execute +6994a 2 105 152 +6994c 2 110 152 +6994e 2 105 152 +69950 4 105 152 +69954 2 110 152 +69956 8 113 152 +6995e 4 114 152 +69962 2 117 152 +69964 2 308 152 +69966 6 117 152 +6996c 10 119 152 +6997c 10 121 152 +6998c c 128 152 +69998 6 133 152 +6999e 12 134 152 +699b0 2 133 152 +699b2 2 138 152 +699b4 4 135 152 +699b8 4 136 152 +699bc 6 139 152 +699c2 e 143 152 +699d0 8 145 152 +699d8 4 146 152 +699dc 2 145 152 +699de 4 146 152 +699e2 4 149 152 +699e6 2 152 152 +699e8 2 153 152 +699ea 4 152 152 +699ee 8 153 152 +699f6 4 153 152 +699fa 4 156 152 +699fe 4 157 152 +69a02 4 160 152 +69a06 8 163 152 +69a0e 4 162 152 +69a12 e 167 152 +69a20 e 168 152 +69a2e 2 169 152 +69a30 4 171 152 +69a34 10 176 152 +69a44 4 177 152 +69a48 6 178 152 +69a4e 6 179 152 +69a54 4 184 152 +69a58 4 187 152 +69a5c 8 189 152 +69a64 2 190 152 +69a66 a 190 152 +69a70 6 194 152 +69a76 4 199 152 +69a7a 10 204 152 +69a8a 6 206 152 +69a90 2 207 152 +69a92 c 208 152 +69a9e 8 210 152 +69aa6 2 212 152 +69aa8 2 210 152 +69aaa 2 211 152 +69aac c 212 152 +69ab8 a 214 152 +69ac2 a 215 152 +69acc 4 219 152 +69ad0 6 222 152 +69ad6 12 223 152 +69ae8 a 229 152 +69af2 c 234 152 +69afe 6 235 152 +69b04 4 240 152 +69b08 4 242 152 +69b0c 6 245 152 +69b12 12 246 152 +69b24 4 252 152 +69b28 8 254 152 +69b30 4 255 152 +69b34 8 255 152 +69b3c 6 259 152 +69b42 8 264 152 +69b4a c 267 152 +69b56 8 268 152 +69b5e 4 273 152 +69b62 6 276 152 +69b68 16 277 152 +69b7e 6 283 152 +69b84 6 286 152 +69b8a 14 287 152 +69b9e 10 296 152 +69bae a 299 152 +69bb8 a 300 152 +69bc2 8 300 152 +69bca 6 309 152 +FUNC 69bd0 26 0 __gnu_unwind_frame +69bd0 2 318 152 +69bd2 2 322 152 +69bd4 6 326 152 +69bda 6 327 152 +69be0 4 328 152 +69be4 2 331 152 +69be6 2 329 152 +69be8 2 331 152 +69bea 2 326 152 +69bec 2 329 152 +69bee 4 331 152 +69bf2 4 332 152 +FUNC 69bf6 a 0 _Unwind_GetRegionStart +69bf6 2 346 152 +69bf8 4 349 152 +69bfc 2 350 152 +69bfe 2 351 152 +FUNC 69c00 12 0 _Unwind_GetLanguageSpecificData +69c00 2 357 152 +69c02 4 362 152 +69c06 2 363 152 +69c08 8 367 152 +69c10 2 370 152 +FUNC 69c12 6 0 _Unwind_GetDataRelBase +69c12 2 377 152 +69c14 4 378 152 +FUNC 69c18 6 0 _Unwind_GetTextRelBase +69c18 2 383 152 +69c1a 4 384 152 +FUNC 69c34 4c 0 __muldi3 +69c34 2 548 154 +69c36 12 551 154 +69c48 2 548 154 +69c4a 14 551 154 +69c5e 6 551 154 +69c64 2 553 154 +69c66 2 554 154 +69c68 2 553 154 +69c6a c 551 154 +69c76 2 554 154 +69c78 2 553 154 +69c7a 6 557 154 +FUNC 69c80 12a 0 __divdi3 +69c80 2 1228 154 +69c82 2 1229 154 +69c84 2 1228 154 +69c86 4 1230 154 +69c8a 4 1231 154 +69c8e 2 1229 154 +69c90 4 1234 154 +69c94 6 1236 154 +69c9a 4 1235 154 +69c9e 4 1236 154 +69ca2 2 1235 154 +69ca4 4 1237 154 +69ca8 6 1238 154 +69cae a 1239 154 +69cb8 4 1241 154 +69cbc a 957 154 +69cc6 8 959 154 +69cce 2 960 154 +69cd0 2 959 154 +69cd2 6 960 154 +69cd8 2 962 154 +69cda 2 963 154 +69cdc 2 962 154 +69cde 4 963 154 +69ce2 2 962 154 +69ce4 a 963 154 +69cee c 970 154 +69cfa a 973 154 +69d04 4 972 154 +69d08 6 973 154 +69d0e 8 946 154 +69d16 6 976 154 +69d1c 8 978 154 +69d24 18 986 154 +69d3c 16 988 154 +69d52 a 989 154 +69d5c 4 990 154 +69d60 4 994 154 +69d64 2 995 154 +69d66 4 994 154 +69d6a 4 995 154 +69d6e 10 996 154 +69d7e 28 946 154 +69da6 4 1246 154 +FUNC 69daa f0 0 __udivdi3 +69daa 6 1287 154 +69db0 6 1287 154 +69db6 c 957 154 +69dc2 8 959 154 +69dca 2 960 154 +69dcc 2 959 154 +69dce 6 960 154 +69dd4 2 962 154 +69dd6 2 963 154 +69dd8 2 962 154 +69dda 4 963 154 +69dde 2 962 154 +69de0 a 963 154 +69dea c 970 154 +69df6 a 973 154 +69e00 4 972 154 +69e04 6 973 154 +69e0a 8 946 154 +69e12 6 976 154 +69e18 c 978 154 +69e24 1a 986 154 +69e3e 18 988 154 +69e56 a 989 154 +69e60 4 990 154 +69e64 a 994 154 +69e6e 2 995 154 +69e70 2 994 154 +69e72 4 995 154 +69e76 14 996 154 +69e8a 8 946 154 +69e92 8 1289 154 +PUBLIC 172dd 0 _ZN7testing8internal11CmpHelperEQISsSsEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 17f2d 0 _ZN38ExceptionHandlerTest_SimpleWithFD_Test8TestBodyEv +PUBLIC 17fb5 0 _ZN40ExceptionHandlerTest_SimpleWithPath_Test8TestBodyEv +PUBLIC 181d9 0 _ZN7testing13PrintToStringIiEESsRKT_ +PUBLIC 18221 0 _ZN7testing8internal18CmpHelperOpFailureIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_S4_ +PUBLIC 182f5 0 _ZN7testing8internal11CmpHelperNEIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 18321 0 _ZN7testing8internal11CmpHelperEQIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 187b9 0 _ZN7testing8internal18CmpHelperOpFailureIliEENS_15AssertionResultEPKcS4_RKT_RKT0_S4_ +PUBLIC 188a1 0 _ZN53ExceptionHandlerTest_GenerateMultipleDumpsWithFD_Test8TestBodyEv +PUBLIC 18ae5 0 _ZN7testing13PrintToStringIPvEESsRKT_ +PUBLIC 18b51 0 _ZN7testing8internal18CmpHelperOpFailureIPvS2_EENS_15AssertionResultEPKcS5_RKT_RKT0_S5_ +PUBLIC 18c25 0 _ZN7testing13PrintToStringIjEESsRKT_ +PUBLIC 18cfd 0 _ZN7testing8internal11CmpHelperLTIjjEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 18de5 0 _ZN7testing8internal11CmpHelperEQIjjEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 18e59 0 _ZN7testing8internal11CmpHelperEQIjyEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 1900d 0 _ZN7testing8internal11CmpHelperGTIxiEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 1911d 0 _ZN7testing8internal11CmpHelperEQI20MDExceptionCodeLinuxjEENS_15AssertionResultEPKcS5_RKT_RKT0_ +PUBLIC 19419 0 _Z10ChildCrashb +PUBLIC 1970d 0 _ZN44ExceptionHandlerTest_ChildCrashWithPath_Test8TestBodyEv +PUBLIC 19779 0 _ZN42ExceptionHandlerTest_ChildCrashWithFD_Test8TestBodyEv +PUBLIC 197e9 0 _ZN57ExceptionHandlerTest_RedeliveryOnFilterCallbackFalse_Test8TestBodyEv +PUBLIC 19931 0 _ZN55ExceptionHandlerTest_RedeliveryOnDoneCallbackFalse_Test8TestBodyEv +PUBLIC 19a79 0 _ZN56ExceptionHandlerTest_NoRedeliveryOnDoneCallbackTrue_Test8TestBodyEv +PUBLIC 19bc1 0 _ZN58ExceptionHandlerTest_NoRedeliveryOnFilterCallbackTrue_Test8TestBodyEv +PUBLIC 19d09 0 _ZN52ExceptionHandlerTest_RedeliveryToDefaultHandler_Test8TestBodyEv +PUBLIC 19dcd 0 _ZN58ExceptionHandlerTest_RedeliveryOnBadSignalHandlerFlag_Test8TestBodyEv +PUBLIC 1a03d 0 _ZN55ExceptionHandlerTest_StackedHandlersDeliveredToTop_Test8TestBodyEv +PUBLIC 1a135 0 _ZN61ExceptionHandlerTest_StackedHandlersNotDeliveredToBottom_Test8TestBodyEv +PUBLIC 1a22d 0 _ZN57ExceptionHandlerTest_StackedHandlersFilteredToBottom_Test8TestBodyEv +PUBLIC 1a329 0 _ZN58ExceptionHandlerTest_StackedHandlersUnhandledToBottom_Test8TestBodyEv +PUBLIC 1a425 0 _ZN40ExceptionHandlerTest_ExternalDumper_Test8TestBodyEv +PUBLIC 1ab6d 0 _ZN50ExceptionHandlerTest_InstructionPointerMemory_Test8TestBodyEv +PUBLIC 1b3f1 0 _ZN58ExceptionHandlerTest_InstructionPointerMemoryMinBound_Test8TestBodyEv +PUBLIC 1bbe9 0 _ZN58ExceptionHandlerTest_InstructionPointerMemoryMaxBound_Test8TestBodyEv +PUBLIC 1c3e1 0 _ZN61ExceptionHandlerTest_InstructionPointerMemoryNullPointer_Test8TestBodyEv +PUBLIC 1c839 0 _ZN36ExceptionHandlerTest_ModuleInfo_Test8TestBodyEv +PUBLIC 1cec9 0 _ZN54ExceptionHandlerTest_WriteMinidumpExceptionStream_Test8TestBodyEv +PUBLIC 1d1a5 0 _ZN55ExceptionHandlerTest_GenerateMultipleDumpsWithPath_Test8TestBodyEv +PUBLIC 1d60d 0 _ZN42ExceptionHandlerTest_AdditionalMemory_Test8TestBodyEv +PUBLIC 1d97d 0 _ZN48ExceptionHandlerTest_AdditionalMemoryRemove_Test8TestBodyEv +PUBLIC 1dba9 0 _ZN47ExceptionHandlerTest_WriteMinidumpForChild_Test8TestBodyEv +PUBLIC 1e021 0 _ZN7testing13PrintToStringIPKvEESsRKT_ +PUBLIC 1e08d 0 _ZN7testing8internal11CmpHelperNEIPcS2_EENS_15AssertionResultEPKcS5_RKT_RKT0_ +PUBLIC 1ed81 0 _ZN7testing8internal18CmpHelperEQFailureIiiEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 1ee5d 0 _ZN26CpuSetTest_EmptyCount_Test8TestBodyEv +PUBLIC 1eedd 0 _ZN22CpuSetTest_OneCpu_Test8TestBodyEv +PUBLIC 1f089 0 _ZN32CpuSetTest_OneCpuTerminated_Test8TestBodyEv +PUBLIC 1f235 0 _ZN32CpuSetTest_TwoCpusWithComma_Test8TestBodyEv +PUBLIC 1f3e5 0 _ZN32CpuSetTest_TwoCpusWithRange_Test8TestBodyEv +PUBLIC 1f595 0 _ZN32CpuSetTest_TenCpusWithRange_Test8TestBodyEv +PUBLIC 1f741 0 _ZN26CpuSetTest_MultiItems_Test8TestBodyEv +PUBLIC 1f8ed 0 _ZN29CpuSetTest_IntersectWith_Test8TestBodyEv +PUBLIC 1fcd5 0 _ZN32CpuSetTest_SelfIntersection_Test8TestBodyEv +PUBLIC 1fed1 0 _ZN33CpuSetTest_EmptyIntersection_Test8TestBodyEv +PUBLIC 203c9 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESsNS_9_IdentityISsEENS_11_SetTraitsTISsEESaISsEE8_M_eraseEPNS_18_Rb_tree_node_baseE +PUBLIC 2051b 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESsNS_9_IdentityISsEENS_11_SetTraitsTISsEESaISsEE9_M_insertEPNS_18_Rb_tree_node_baseERKSsSA_SA_ +PUBLIC 20589 0 _ZN39DirectoryReaderTest_CompareResults_Test8TestBodyEv +PUBLIC 20fc9 0 _ZN29LineReaderTest_EmptyFile_Test8TestBodyEv +PUBLIC 21111 0 _ZN27LineReaderTest_TooLong_Test8TestBodyEv +PUBLIC 2127d 0 _ZN7testing8internal18CmpHelperEQFailureIjjEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 2131d 0 _ZN7testing8internal18CmpHelperEQFailureIccEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 213bd 0 _ZN7testing8internal11CmpHelperEQIccEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 213dd 0 _ZN37LineReaderTest_OneLineTerminated_Test8TestBodyEv +PUBLIC 21665 0 _ZN27LineReaderTest_OneLine_Test8TestBodyEv +PUBLIC 218ed 0 _ZN38LineReaderTest_TwoLinesTerminated_Test8TestBodyEv +PUBLIC 21cb1 0 _ZN28LineReaderTest_TwoLines_Test8TestBodyEv +PUBLIC 22075 0 _ZN29LineReaderTest_MaxLength_Test8TestBodyEv +PUBLIC 22399 0 _ZN38LinuxCoreDumperTest_BuildProcPath_Test8TestBodyEv +PUBLIC 22751 0 _ZN54LinuxCoreDumperTest_VerifyDumpWithMultipleThreads_Test8TestBodyEv +PUBLIC 23179 0 _ZN29LinuxPtraceDumperMappingsTest5SetUpEv +PUBLIC 2344d 0 _ZN37LinuxPtraceDumperChildTest_Setup_Test12RealTestBodyEv +PUBLIC 23469 0 _ZN44LinuxPtraceDumperChildTest_FindMappings_Test12RealTestBodyEv +PUBLIC 23639 0 _ZN45LinuxPtraceDumperChildTest_BuildProcPath_Test12RealTestBodyEv +PUBLIC 23a39 0 _ZN44LinuxPtraceDumperChildTest_FileIDsMatch_Test12RealTestBodyEv +PUBLIC 23ea5 0 _ZN42LinuxPtraceDumperChildTest_ThreadList_Test12RealTestBodyEv +PUBLIC 24155 0 _ZN49LinuxPtraceDumperMappingsTest_MergedMappings_Test12RealTestBodyEv +PUBLIC 243fd 0 _ZN61LinuxPtraceDumperTest_VerifyStackReadWithMultipleThreads_Test8TestBodyEv +PUBLIC 25071 0 _ZN7testing8internal18CmpHelperEQFailureIPKcSsEENS_15AssertionResultES3_S3_RKT_RKT0_ +PUBLIC 25131 0 _ZN7testing8internal11CmpHelperEQIPKcSsEENS_15AssertionResultES3_S3_RKT_RKT0_ +PUBLIC 2517d 0 _ZN7testing8internal18CmpHelperEQFailureISsSsEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 28ae5 0 _ZN15google_breakpad15GetHelperBinaryEv +PUBLIC 291f1 0 _ZN36ProcCpuInfoReaderTest_EmptyFile_Test8TestBodyEv +PUBLIC 29341 0 _ZN44ProcCpuInfoReaderTest_OneLineTerminated_Test8TestBodyEv +PUBLIC 29571 0 _ZN45ProcCpuInfoReaderTest_TwoLinesTerminated_Test8TestBodyEv +PUBLIC 2987d 0 _ZN44ProcCpuInfoReaderTest_SkipMalformedLine_Test8TestBodyEv +PUBLIC 29aad 0 _ZN43ProcCpuInfoReaderTest_SkipOneEmptyLine_Test8TestBodyEv +PUBLIC 29cdd 0 _ZN41ProcCpuInfoReaderTest_SkipEmptyField_Test8TestBodyEv +PUBLIC 29f0d 0 _ZN44ProcCpuInfoReaderTest_SkipTwoEmptyLines_Test8TestBodyEv +PUBLIC 2a20d 0 _ZN42ProcCpuInfoReaderTest_FieldWithSpaces_Test8TestBodyEv +PUBLIC 2a43d 0 _ZN37ProcCpuInfoReaderTest_EmptyValue_Test8TestBodyEv +PUBLIC 2a6d1 0 _ZN34ProcCpuInfoReaderTest_OneLine_Test8TestBodyEv +PUBLIC 2ab19 0 _ZN7testing8internal18CmpHelperEQFailureIPK6elfhdrS4_EENS_15AssertionResultEPKcS7_RKT_RKT0_ +PUBLIC 2abb9 0 _ZN39ElfCoreDumpTest_DefaultConstructor_Test8TestBodyEv +PUBLIC 2aeb5 0 _ZNSt4priv8_Rb_treeIiSt4lessIiEiNS_9_IdentityIiEENS_11_SetTraitsTIiEESaIiEE8_M_eraseEPNS_18_Rb_tree_node_baseE +PUBLIC 2aef1 0 _ZN34ElfCoreDumpTest_TestElfHeader_Test8TestBodyEv +PUBLIC 2be4d 0 _ZNSt4priv8_Rb_treeIiSt4lessIiEiNS_9_IdentityIiEENS_11_SetTraitsTIiEESaIiEE9_M_insertEPNS_18_Rb_tree_node_baseERKiSA_SA_ +PUBLIC 2bee5 0 _ZNSt4priv8_Rb_treeIiSt4lessIiEiNS_9_IdentityIiEENS_11_SetTraitsTIiEESaIiEE13insert_uniqueERKi +PUBLIC 2bf75 0 _ZN34ElfCoreDumpTest_ValidCoreFile_Test8TestBodyEv +PUBLIC 2cbfb 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESt4pairIKSsN15google_breakpad14test_assembler5LabelEENS_10_Select1stIS8_EENS_11_MapTraitsTIS8_EESaIS8_EE8_M_eraseEPNS_18_Rb_tree_node_baseE +PUBLIC 2da29 0 _ZN7testing8internal18CmpHelperOpFailureIjjEENS_15AssertionResultEPKcS4_RKT_RKT0_S4_ +PUBLIC 2dd21 0 _ZN24FileIDTest_ElfClass_TestIN15google_breakpad10ElfClass32EE8TestBodyEv +PUBLIC 2dee5 0 _ZN23FileIDTest_BuildID_TestIN15google_breakpad10ElfClass32EE8TestBodyEv +PUBLIC 2e159 0 _ZN25FileIDTest_BuildIDPH_TestIN15google_breakpad10ElfClass32EE8TestBodyEv +PUBLIC 2e401 0 _ZN28FileIDTest_UniqueHashes_TestIN15google_breakpad10ElfClass32EE8TestBodyEv +PUBLIC 2e791 0 _ZN24FileIDTest_ElfClass_TestIN15google_breakpad10ElfClass64EE8TestBodyEv +PUBLIC 2e955 0 _ZN23FileIDTest_BuildID_TestIN15google_breakpad10ElfClass64EE8TestBodyEv +PUBLIC 2ebc9 0 _ZN25FileIDTest_BuildIDPH_TestIN15google_breakpad10ElfClass64EE8TestBodyEv +PUBLIC 2ee71 0 _ZN28FileIDTest_UniqueHashes_TestIN15google_breakpad10ElfClass64EE8TestBodyEv +PUBLIC 2f4f9 0 _ZN32LinuxLibcSupportTest_strlen_Test8TestBodyEv +PUBLIC 2f59d 0 _ZN34LinuxLibcSupportTest_uint_len_Test8TestBodyEv +PUBLIC 2f8c5 0 _ZN32LinuxLibcSupportTest_strcmp_Test8TestBodyEv +PUBLIC 2f989 0 _ZN33LinuxLibcSupportTest_strtoui_Test8TestBodyEv +PUBLIC 2fee1 0 _ZN31LinuxLibcSupportTest_uitos_Test8TestBodyEv +PUBLIC 30161 0 _ZN7testing8internal11CmpHelperEQIPKcS3_EENS_15AssertionResultES3_S3_RKT_RKT0_ +PUBLIC 301dd 0 _ZN33LinuxLibcSupportTest_strrchr_Test8TestBodyEv +PUBLIC 30515 0 _ZN32LinuxLibcSupportTest_strchr_Test8TestBodyEv +PUBLIC 30895 0 _ZN7testing8internal18CmpHelperEQFailureIPvS2_EENS_15AssertionResultEPKcS5_RKT_RKT0_ +PUBLIC 308f9 0 _ZN7testing8internal11CmpHelperEQIA10_cPvEENS_15AssertionResultEPKcS6_RKT_RKT0_ +PUBLIC 3096d 0 _ZN7testing8internal11CmpHelperEQIPKcPvEENS_15AssertionResultES3_S3_RKT_RKT0_ +PUBLIC 309e5 0 _ZN32LinuxLibcSupportTest_memchr_Test8TestBodyEv +PUBLIC 30c75 0 _ZN7testing13PrintToStringIcEESsRKT_ +PUBLIC 30cbd 0 _ZN7testing8internal11CmpHelperEQIciEENS_15AssertionResultEPKcS4_RKT_RKT0_ +PUBLIC 30d31 0 _ZN38LinuxLibcSupportTest_read_hex_ptr_Test8TestBodyEv +PUBLIC 3103d 0 _ZN42LinuxLibcSupportTest_read_decimal_ptr_Test8TestBodyEv +PUBLIC 312d7 0 _ZN15google_breakpad9synth_elf3ELF13AppendSectionERNS1_10ElfSectionE +PUBLIC 31315 0 _ZN15google_breakpad9synth_elf3ELF10AddSegmentEiijj +PUBLIC 31453 0 _ZN15google_breakpad9synth_elf5Notes7AddNoteEiRKSsPKhj +PUBLIC 315a1 0 _ZN15google_breakpad9synth_elf11SymbolTableC2ENS_14test_assembler10EndiannessEjRNS0_11StringTableE +PUBLIC 3162d 0 _ZNSt4priv12_Impl_vectorIN15google_breakpad9synth_elf3ELF10ElfSectionESaIS4_EE22_M_insert_overflow_auxEPS4_RKS4_RKSt12__false_typejb +PUBLIC 317cb 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESt4pairIKSsN15google_breakpad14test_assembler5LabelEENS_10_Select1stIS8_EENS_11_MapTraitsTIS8_EESaIS8_EE9_M_insertEPNS_18_Rb_tree_node_baseERKS8_SG_SG_ +PUBLIC 31839 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESt4pairIKSsN15google_breakpad14test_assembler5LabelEENS_10_Select1stIS8_EENS_11_MapTraitsTIS8_EESaIS8_EE13insert_uniqueERKS8_ +PUBLIC 318b1 0 _ZNSt4priv8_Rb_treeISsSt4lessISsESt4pairIKSsN15google_breakpad14test_assembler5LabelEENS_10_Select1stIS8_EENS_11_MapTraitsTIS8_EESaIS8_EE13insert_uniqueENS_17_Rb_tree_iteratorIS8_SC_EERKS8_ +PUBLIC 31b75 0 _ZN15google_breakpad9synth_elf11SymbolTable9AddSymbolERKSsjjjt +PUBLIC 31bcd 0 _ZN15google_breakpad9synth_elf11SymbolTable9AddSymbolERKSsyyjt +PUBLIC 31c29 0 _ZN15google_breakpad9synth_elf3ELF10AddSectionERKSsRKNS_14test_assembler7SectionEjjyjyy +PUBLIC 31db5 0 _ZN15google_breakpad9synth_elf3ELF6FinishEv +PUBLIC 31e91 0 _ZN15google_breakpad9synth_elf3ELFC1EthNS_14test_assembler10EndiannessE +PUBLIC 32219 0 _ZNK15google_breakpad14CrashGenerator21HasDefaultCorePatternEv +PUBLIC 32275 0 _ZNK15google_breakpad14CrashGenerator11GetThreadIdEj +PUBLIC 3227d 0 _ZN15google_breakpad14CrashGenerator18GetThreadIdPointerEj +PUBLIC 32285 0 _ZN15google_breakpad14CrashGenerator17UnmapSharedMemoryEv +PUBLIC 322b1 0 _ZN15google_breakpad14CrashGenerator15MapSharedMemoryEj +PUBLIC 32305 0 _ZNK15google_breakpad14CrashGenerator20SetCoreFileSizeLimitEm +PUBLIC 32331 0 _ZNK15google_breakpad14CrashGenerator13CopyProcFilesEiPKc +PUBLIC 323e5 0 _ZN15google_breakpad14CrashGenerator27CreateThreadsInChildProcessEj +PUBLIC 3251b 0 _ZN15google_breakpad14CrashGeneratorC1Ev +PUBLIC 3252d 0 _ZN15google_breakpad14CrashGeneratorD1Ev +PUBLIC 32549 0 _ZNK15google_breakpad14CrashGenerator15GetCoreFilePathEv +PUBLIC 3255d 0 _ZNK15google_breakpad14CrashGenerator27GetDirectoryOfProcFilesCopyEv +PUBLIC 32571 0 _ZN15google_breakpad14CrashGenerator16CreateChildCrashEjjiPi +PUBLIC 329d1 0 _ZN28PageAllocatorTest_Setup_Test8TestBodyEv +PUBLIC 329f5 0 _ZN35PageAllocatorTest_SmallObjects_Test8TestBodyEv +PUBLIC 32add 0 _ZN34PageAllocatorTest_LargeObject_Test8TestBodyEv +PUBLIC 32cb9 0 _ZN29WastefulVectorTest_Setup_Test8TestBodyEv +PUBLIC 32d65 0 _ZNSt4priv12_Impl_vectorIjN15google_breakpad16PageStdAllocatorIjEEE7reserveEj +PUBLIC 32dc1 0 _ZN30WastefulVectorTest_Simple_Test8TestBodyEv +PUBLIC 330ed 0 _ZN41WastefulVectorTest_UsesPageAllocator_Test8TestBodyEv +PUBLIC 33749 0 _ZN15google_breakpad31NonAllocatingMapTest_Entry_Test8TestBodyEv +PUBLIC 33be5 0 _ZN15google_breakpad39NonAllocatingMapTest_CopyAndAssign_Test8TestBodyEv +PUBLIC 34385 0 _ZN15google_breakpad35NonAllocatingMapTest_AddRemove_Test8TestBodyEv +PUBLIC 348c9 0 _ZN15google_breakpad35NonAllocatingMapTest_Serialize_Test8TestBodyEv +PUBLIC 34d61 0 _ZN15google_breakpad36NonAllocatingMapTest_OutOfSpace_Test8TestBodyEv +PUBLIC 34f05 0 _ZN7testing8internal11CmpHelperNEIPKcA7_cEENS_15AssertionResultES3_S3_RKT_RKT0_ +PUBLIC 35009 0 _ZN15google_breakpad48NonAllocatingMapTest_SimpleStringDictionary_Test8TestBodyEv +PUBLIC 35481 0 _ZN15google_breakpad34NonAllocatingMapTest_Iterator_Test8TestBodyEv +PUBLIC 35929 0 _ZN15google_breakpad14test_assembler5LabelC1Ev +PUBLIC 35949 0 _ZN15google_breakpad14test_assembler5LabelC2Ey +PUBLIC 35969 0 _ZN15google_breakpad14test_assembler5LabelC1ERKS1_ +PUBLIC 35975 0 _ZN15google_breakpad14test_assembler5Label7BindingC2Ev +PUBLIC 35989 0 _ZN15google_breakpad14test_assembler5Label7BindingC2Ey +PUBLIC 35999 0 _ZN15google_breakpad14test_assembler5Label7BindingD2Ev +PUBLIC 359c1 0 _ZN15google_breakpad14test_assembler5LabelD1Ev +PUBLIC 359e3 0 _ZN15google_breakpad14test_assembler5Label7Binding3GetEPPS2_Py +PUBLIC 35a49 0 _ZNK15google_breakpad14test_assembler5Label15IsKnownConstantEPy +PUBLIC 35a71 0 _ZNK15google_breakpad14test_assembler5Label5ValueEv +PUBLIC 35a8b 0 _ZNK15google_breakpad14test_assembler5Label17IsKnownOffsetFromERKS1_Py +PUBLIC 35acf 0 _ZNK15google_breakpad14test_assembler5LabelmiERKS1_ +PUBLIC 35ae1 0 _ZN15google_breakpad14test_assembler5Label7Binding3SetEPS2_y +PUBLIC 35b61 0 _ZN15google_breakpad14test_assembler5LabelaSEy +PUBLIC 35b71 0 _ZN15google_breakpad14test_assembler5LabelaSERKS1_ +PUBLIC 35b85 0 _ZNK15google_breakpad14test_assembler5LabelplEy +PUBLIC 35ba3 0 _ZNK15google_breakpad14test_assembler5LabelmiEy +PUBLIC 35bc3 0 _ZN15google_breakpad14test_assembler7Section5AlignEjh +PUBLIC 35be3 0 _ZN15google_breakpad14test_assembler7Section6LEB128Ex +PUBLIC 35c27 0 _ZN15google_breakpad14test_assembler7Section7ULEB128Ey +PUBLIC 35cbb 0 _ZN15google_breakpad14test_assembler7Section6AppendENS0_10EndiannessEjy +PUBLIC 35cd7 0 _ZN15google_breakpad14test_assembler7Section3L16Et +PUBLIC 35cf1 0 _ZN15google_breakpad14test_assembler7Section3L32Ej +PUBLIC 35d0d 0 _ZN15google_breakpad14test_assembler7Section3L64Ey +PUBLIC 35d25 0 _ZN15google_breakpad14test_assembler7Section3B16Et +PUBLIC 35d3f 0 _ZN15google_breakpad14test_assembler7Section3B32Ej +PUBLIC 35d5b 0 _ZN15google_breakpad14test_assembler7Section3B64Ey +PUBLIC 35d73 0 _ZN15google_breakpad14test_assembler7Section3D16Et +PUBLIC 35d8d 0 _ZN15google_breakpad14test_assembler7Section3D32Ej +PUBLIC 35da9 0 _ZN15google_breakpad14test_assembler7Section3D64Ey +PUBLIC 35de1 0 _ZN15google_breakpad14test_assembler7Section5ClearEv +PUBLIC 35eb1 0 _ZN15google_breakpad14test_assembler7Section11GetContentsEPSs +PUBLIC 35f9d 0 _ZNSt4priv12_Impl_vectorIN15google_breakpad14test_assembler7Section9ReferenceESaIS4_EE22_M_insert_overflow_auxEPS4_RKS4_RKSt12__false_typejb +PUBLIC 3619b 0 _ZN15google_breakpad14test_assembler7Section6AppendENS0_10EndiannessEjRKNS0_5LabelE +PUBLIC 36205 0 _ZN15google_breakpad14test_assembler7Section2L8ERKNS0_5LabelE +PUBLIC 3620f 0 _ZN15google_breakpad14test_assembler7Section2B8ERKNS0_5LabelE +PUBLIC 36219 0 _ZN15google_breakpad14test_assembler7Section3L16ERKNS0_5LabelE +PUBLIC 36223 0 _ZN15google_breakpad14test_assembler7Section3L32ERKNS0_5LabelE +PUBLIC 3622d 0 _ZN15google_breakpad14test_assembler7Section3L64ERKNS0_5LabelE +PUBLIC 36237 0 _ZN15google_breakpad14test_assembler7Section3B16ERKNS0_5LabelE +PUBLIC 36241 0 _ZN15google_breakpad14test_assembler7Section3B32ERKNS0_5LabelE +PUBLIC 3624b 0 _ZN15google_breakpad14test_assembler7Section3B64ERKNS0_5LabelE +PUBLIC 36255 0 _ZN15google_breakpad14test_assembler7Section2D8ERKNS0_5LabelE +PUBLIC 3625f 0 _ZN15google_breakpad14test_assembler7Section3D16ERKNS0_5LabelE +PUBLIC 36269 0 _ZN15google_breakpad14test_assembler7Section3D32ERKNS0_5LabelE +PUBLIC 36273 0 _ZN15google_breakpad14test_assembler7Section3D64ERKNS0_5LabelE +PUBLIC 3627d 0 _ZN15google_breakpad14test_assembler7Section6AppendERKS1_ +PUBLIC 363ad 0 _ZN15google_breakpad8CopyFileEPKcS1_ +PUBLIC 36505 0 _ZN15google_breakpad8ReadFileEPKcPvPi +PUBLIC 365a1 0 _ZN15google_breakpad9WriteFileEPKcPKvj +PUBLIC 36b95 0 _ZN7testing8internal18CmpHelperEQFailureIPKiS3_EENS_15AssertionResultEPKcS6_RKT_RKT0_ +PUBLIC 36c5d 0 _ZN7testing8internal11CmpHelperEQIA1_cSsEENS_15AssertionResultEPKcS5_RKT_RKT0_ +PUBLIC 36cf5 0 _ZN45MinidumpMemoryRangeTest_GetAsciiMDString_Test8TestBodyEv +PUBLIC 36ffd 0 _ZN7testing13PrintToStringIPKhEESsRKT_ +PUBLIC 37045 0 _ZN7testing8internal11CmpHelperEQIPKhS3_EENS_15AssertionResultEPKcS6_RKT_RKT0_ +PUBLIC 370b9 0 _ZN57MinidumpMemoryRangeTest_ConstructorWithDataAndLength_Test8TestBodyEv +PUBLIC 37199 0 _ZN47MinidumpMemoryRangeTest_DefaultConstructor_Test8TestBodyEv +PUBLIC 3726d 0 _ZN55MinidumpMemoryRangeTest_SubrangeOfEmptyMemoryRange_Test8TestBodyEv +PUBLIC 37355 0 _ZN32MinidumpMemoryRangeTest_Set_Test8TestBodyEv +PUBLIC 374f5 0 _ZN34MinidumpMemoryRangeTest_Reset_Test8TestBodyEv +PUBLIC 37759 0 _ZN7testing8internal11CmpHelperEQIPKhPKvEENS_15AssertionResultEPKcS8_RKT_RKT0_ +PUBLIC 377cd 0 _ZN7testing8internal11CmpHelperEQIPKvS3_EENS_15AssertionResultEPKcS6_RKT_RKT0_ +PUBLIC 37841 0 _ZN44MinidumpMemoryRangeTest_GetArrayElement_Test8TestBodyEv +PUBLIC 37989 0 _ZN61MinidumpMemoryRangeTest_SubrangeWithMDLocationDescriptor_Test8TestBodyEv +PUBLIC 37e19 0 _ZN47MinidumpMemoryRangeTest_SubrangeAndGetData_Test8TestBodyEv +PUBLIC 382a9 0 _ZN7testing8internal18CmpHelperEQFailureIPKcS3_EENS_15AssertionResultES3_S3_RKT_RKT0_ +PUBLIC 38315 0 _ZN59MinidumpMemoryRangeTest_GetArrayElmentWithTemplateType_Test8TestBodyEv +PUBLIC 38439 0 _ZN52MinidumpMemoryRangeTest_GetDataWithTemplateType_Test8TestBodyEv +PUBLIC 385f5 0 _ZN32AndroidUContext_GRegsOffset_Test8TestBodyEv +PUBLIC 38655 0 _ZN33AndroidUContext_SigmakOffset_Test8TestBodyEv +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dcc 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dd0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dd4 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dd8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160dc 2c .cfa: sp 0 + .ra: lr +STACK CFI 160de .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 16100 .cfa: sp 8 + +STACK CFI INIT 16108 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1610e c .cfa: sp 0 + .ra: lr +STACK CFI 16110 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 1611c 18 .cfa: sp 0 + .ra: lr +STACK CFI 1611e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16134 12 .cfa: sp 0 + .ra: lr +STACK CFI 16136 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16148 18 .cfa: sp 0 + .ra: lr +STACK CFI 1614a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16160 12 .cfa: sp 0 + .ra: lr +STACK CFI 16162 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16174 18 .cfa: sp 0 + .ra: lr +STACK CFI 16176 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1618c 12 .cfa: sp 0 + .ra: lr +STACK CFI 1618e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 161a0 18 .cfa: sp 0 + .ra: lr +STACK CFI 161a2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 161b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 161ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 161cc 18 .cfa: sp 0 + .ra: lr +STACK CFI 161ce .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 161e4 12 .cfa: sp 0 + .ra: lr +STACK CFI 161e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 161f8 18 .cfa: sp 0 + .ra: lr +STACK CFI 161fa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16210 12 .cfa: sp 0 + .ra: lr +STACK CFI 16212 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16224 18 .cfa: sp 0 + .ra: lr +STACK CFI 16226 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1623c 12 .cfa: sp 0 + .ra: lr +STACK CFI 1623e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16250 18 .cfa: sp 0 + .ra: lr +STACK CFI 16252 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16268 12 .cfa: sp 0 + .ra: lr +STACK CFI 1626a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1627c 18 .cfa: sp 0 + .ra: lr +STACK CFI 1627e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16294 12 .cfa: sp 0 + .ra: lr +STACK CFI 16296 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 162a8 18 .cfa: sp 0 + .ra: lr +STACK CFI 162aa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 162c0 12 .cfa: sp 0 + .ra: lr +STACK CFI 162c2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 162d4 18 .cfa: sp 0 + .ra: lr +STACK CFI 162d6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 162ec 12 .cfa: sp 0 + .ra: lr +STACK CFI 162ee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16300 18 .cfa: sp 0 + .ra: lr +STACK CFI 16302 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16318 12 .cfa: sp 0 + .ra: lr +STACK CFI 1631a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1632c 18 .cfa: sp 0 + .ra: lr +STACK CFI 1632e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16344 12 .cfa: sp 0 + .ra: lr +STACK CFI 16346 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16358 18 .cfa: sp 0 + .ra: lr +STACK CFI 1635a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16370 12 .cfa: sp 0 + .ra: lr +STACK CFI 16372 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16384 18 .cfa: sp 0 + .ra: lr +STACK CFI 16386 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1639c 12 .cfa: sp 0 + .ra: lr +STACK CFI 1639e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 163b0 18 .cfa: sp 0 + .ra: lr +STACK CFI 163b2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 163c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 163ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 163dc 18 .cfa: sp 0 + .ra: lr +STACK CFI 163de .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 163f4 12 .cfa: sp 0 + .ra: lr +STACK CFI 163f6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16408 18 .cfa: sp 0 + .ra: lr +STACK CFI 1640a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16420 12 .cfa: sp 0 + .ra: lr +STACK CFI 16422 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16434 18 .cfa: sp 0 + .ra: lr +STACK CFI 16436 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1644c 12 .cfa: sp 0 + .ra: lr +STACK CFI 1644e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16460 18 .cfa: sp 0 + .ra: lr +STACK CFI 16462 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16478 12 .cfa: sp 0 + .ra: lr +STACK CFI 1647a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1648c 18 .cfa: sp 0 + .ra: lr +STACK CFI 1648e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 164a4 12 .cfa: sp 0 + .ra: lr +STACK CFI 164a6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 164b8 18 .cfa: sp 0 + .ra: lr +STACK CFI 164ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 164d0 12 .cfa: sp 0 + .ra: lr +STACK CFI 164d2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 164e4 18 .cfa: sp 0 + .ra: lr +STACK CFI 164e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 164fc 12 .cfa: sp 0 + .ra: lr +STACK CFI 164fe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16510 18 .cfa: sp 0 + .ra: lr +STACK CFI 16512 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16528 12 .cfa: sp 0 + .ra: lr +STACK CFI 1652a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1653c 18 .cfa: sp 0 + .ra: lr +STACK CFI 1653e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16554 12 .cfa: sp 0 + .ra: lr +STACK CFI 16556 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16568 18 .cfa: sp 0 + .ra: lr +STACK CFI 1656a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16580 12 .cfa: sp 0 + .ra: lr +STACK CFI 16582 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16592 80 .cfa: sp 0 + .ra: lr +STACK CFI 16594 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 16610 .cfa: sp 20 + +STACK CFI INIT 16614 20 .cfa: sp 0 + .ra: lr +STACK CFI 16616 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16634 20 .cfa: sp 0 + .ra: lr +STACK CFI 16636 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16654 20 .cfa: sp 0 + .ra: lr +STACK CFI 16656 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16674 20 .cfa: sp 0 + .ra: lr +STACK CFI 16676 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16694 20 .cfa: sp 0 + .ra: lr +STACK CFI 16696 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 166b4 20 .cfa: sp 0 + .ra: lr +STACK CFI 166b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 166d4 20 .cfa: sp 0 + .ra: lr +STACK CFI 166d6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 166f4 20 .cfa: sp 0 + .ra: lr +STACK CFI 166f6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16714 20 .cfa: sp 0 + .ra: lr +STACK CFI 16716 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16734 20 .cfa: sp 0 + .ra: lr +STACK CFI 16736 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16754 20 .cfa: sp 0 + .ra: lr +STACK CFI 16756 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16774 20 .cfa: sp 0 + .ra: lr +STACK CFI 16776 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16794 20 .cfa: sp 0 + .ra: lr +STACK CFI 16796 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 167b4 20 .cfa: sp 0 + .ra: lr +STACK CFI 167b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 167d4 20 .cfa: sp 0 + .ra: lr +STACK CFI 167d6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 167f4 20 .cfa: sp 0 + .ra: lr +STACK CFI 167f6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16814 20 .cfa: sp 0 + .ra: lr +STACK CFI 16816 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16834 20 .cfa: sp 0 + .ra: lr +STACK CFI 16836 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16854 20 .cfa: sp 0 + .ra: lr +STACK CFI 16856 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16874 20 .cfa: sp 0 + .ra: lr +STACK CFI 16876 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16894 20 .cfa: sp 0 + .ra: lr +STACK CFI 16896 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 168b4 20 .cfa: sp 0 + .ra: lr +STACK CFI 168b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 168d4 20 .cfa: sp 0 + .ra: lr +STACK CFI 168d6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 168f4 20 .cfa: sp 0 + .ra: lr +STACK CFI 168f6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16914 20 .cfa: sp 0 + .ra: lr +STACK CFI 16916 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16934 20 .cfa: sp 0 + .ra: lr +STACK CFI 16936 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16954 118 .cfa: sp 0 + .ra: lr +STACK CFI 16958 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 1695c .cfa: sp 128 + +STACK CFI 16a62 .cfa: sp 28 + +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ad8 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b28 16 .cfa: sp 0 + .ra: lr +STACK CFI 16b2a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b76 28 .cfa: sp 0 + .ra: lr +STACK CFI 16b78 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16b9e e .cfa: sp 0 + .ra: lr +STACK CFI 16ba0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 16d8a 28 .cfa: sp 0 + .ra: lr +STACK CFI 16d8e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16db4 38 .cfa: sp 0 + .ra: lr +STACK CFI 16db6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 16de6 .cfa: sp 8 + +STACK CFI INIT 16dec 18 .cfa: sp 0 + .ra: lr +STACK CFI 16dee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16e04 2e .cfa: sp 0 + .ra: lr +STACK CFI 16e08 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 16e30 .cfa: sp 12 + +STACK CFI INIT 16e34 ac .cfa: sp 0 + .ra: lr +STACK CFI 16e38 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 16ec4 .cfa: sp 24 + +STACK CFI INIT 16ee0 78 .cfa: sp 0 + .ra: lr +STACK CFI 16ee2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 16f4c .cfa: sp 16 + +STACK CFI INIT 16f58 30 .cfa: sp 0 + .ra: lr +STACK CFI 16f5a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16fb0 2a .cfa: sp 0 + .ra: lr +STACK CFI 16fb2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 16fd8 .cfa: sp 12 + +STACK CFI INIT 16fdc 68 .cfa: sp 0 + .ra: lr +STACK CFI 16fe0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16fe4 .cfa: sp 224 + +STACK CFI 17038 .cfa: sp 28 + +STACK CFI INIT 17044 16 .cfa: sp 0 + .ra: lr +STACK CFI 17046 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 17056 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172dc c0 .cfa: sp 0 + .ra: lr +STACK CFI 172e0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 172e6 .cfa: sp 264 + +STACK CFI 17392 .cfa: sp 36 + +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 17522 90 .cfa: sp 0 + .ra: lr +STACK CFI 17524 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17526 .cfa: sp 80 + +STACK CFI 175b0 .cfa: sp 20 + +STACK CFI INIT 175b2 98 .cfa: sp 0 + .ra: lr +STACK CFI 175b6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17646 .cfa: sp 28 + +STACK CFI INIT 1764a 90 .cfa: sp 0 + .ra: lr +STACK CFI 1764c .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1764e .cfa: sp 80 + +STACK CFI 176d8 .cfa: sp 20 + +STACK CFI INIT 176da 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 1772c d8 .cfa: sp 0 + .ra: lr +STACK CFI 17732 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17800 .cfa: sp 24 + +STACK CFI INIT 17804 44 .cfa: sp 0 + .ra: lr +STACK CFI 17806 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17848 1a4 .cfa: sp 0 + .ra: lr +STACK CFI 1784c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 17850 .cfa: sp 216 + +STACK CFI 179c4 .cfa: sp 36 + +STACK CFI INIT 179ec 1a .cfa: sp 0 + .ra: lr +STACK CFI 179ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 17a02 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 17a06 10 .cfa: sp 0 + .ra: lr +STACK CFI 17a08 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 17a18 6c .cfa: sp 0 + .ra: lr +STACK CFI 17a1e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17a26 .cfa: sp 56 + +STACK CFI 17a7a .cfa: sp 24 + +STACK CFI INIT 17a84 2c .cfa: sp 0 + .ra: lr +STACK CFI 17a86 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17aae .cfa: sp 16 + +STACK CFI INIT 17ab0 38 .cfa: sp 0 + .ra: lr +STACK CFI 17ab2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17ae0 .cfa: sp 16 + +STACK CFI INIT 17a84 2c .cfa: sp 0 + .ra: lr +STACK CFI 17a86 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17aae .cfa: sp 16 + +STACK CFI INIT 17ae8 2c .cfa: sp 0 + .ra: lr +STACK CFI 17aea .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17b12 .cfa: sp 16 + +STACK CFI INIT 17a84 2c .cfa: sp 0 + .ra: lr +STACK CFI 17a86 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17aae .cfa: sp 16 + +STACK CFI INIT 17b14 90 .cfa: sp 0 + .ra: lr +STACK CFI 17b1a .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17ba0 .cfa: sp 24 + +STACK CFI INIT 17ba4 46 .cfa: sp 0 + .ra: lr +STACK CFI 17ba6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17be8 .cfa: sp 20 + +STACK CFI INIT 17bec 2c8 .cfa: sp 0 + .ra: lr +STACK CFI 17bf0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 17bf4 .cfa: sp 256 + +STACK CFI 17e60 .cfa: sp 36 + +STACK CFI INIT 17eb4 14 .cfa: sp 0 + .ra: lr +STACK CFI 17eb6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17ec8 64 .cfa: sp 0 + .ra: lr +STACK CFI 17ecc .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17ed8 .cfa: sp 56 + +STACK CFI 17f1e .cfa: sp 24 + +STACK CFI INIT 17f2c 88 .cfa: sp 0 + .ra: lr +STACK CFI 17f30 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17f34 .cfa: sp 280 + +STACK CFI 17faa .cfa: sp 28 + +STACK CFI INIT 17fb4 180 .cfa: sp 0 + .ra: lr +STACK CFI 17fb8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 17fbc .cfa: sp 296 + +STACK CFI 1810e .cfa: sp 36 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 181d8 48 .cfa: sp 0 + .ra: lr +STACK CFI 181da .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 181e6 .cfa: sp 184 + +STACK CFI 1821a .cfa: sp 20 + +STACK CFI INIT 18220 d4 .cfa: sp 0 + .ra: lr +STACK CFI 18224 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 18228 .cfa: sp 112 + +STACK CFI 182d6 .cfa: sp 28 + +STACK CFI INIT 182f4 2c .cfa: sp 0 + .ra: lr +STACK CFI 182f6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 18318 .cfa: sp 20 + +STACK CFI INIT 18320 74 .cfa: sp 0 + .ra: lr +STACK CFI 18324 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 18328 .cfa: sp 96 + +STACK CFI 1838c .cfa: sp 32 + +STACK CFI INIT 18394 178 .cfa: sp 0 + .ra: lr +STACK CFI 18398 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 183a4 .cfa: sp 96 + +STACK CFI 184da .cfa: sp 28 + +STACK CFI INIT 1850c 2ac .cfa: sp 0 + .ra: lr +STACK CFI 18510 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 18516 .cfa: sp 112 + +STACK CFI 1875c .cfa: sp 36 + +STACK CFI 18760 .cfa: sp 0 + .ra: .ra r10: r10 r11: r11 r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 r9: r9 +STACK CFI 18764 .cfa: sp 112 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1876a .cfa: sp 36 + +STACK CFI INIT 187b8 e8 .cfa: sp 0 + .ra: lr +STACK CFI 187bc .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 187c0 .cfa: sp 240 + +STACK CFI 18884 .cfa: sp 28 + +STACK CFI INIT 188a0 244 .cfa: sp 0 + .ra: lr +STACK CFI 188a4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 188aa .cfa: sp 312 + +STACK CFI 18a9c .cfa: sp 36 + +STACK CFI INIT 18ae4 6c .cfa: sp 0 + .ra: lr +STACK CFI 18ae8 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 18af2 .cfa: sp 184 + +STACK CFI 18b42 .cfa: sp 24 + +STACK CFI INIT 18b50 d4 .cfa: sp 0 + .ra: lr +STACK CFI 18b54 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 18b58 .cfa: sp 112 + +STACK CFI 18c06 .cfa: sp 28 + +STACK CFI INIT 18c24 d8 .cfa: sp 0 + .ra: lr +STACK CFI 18c28 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 18c32 .cfa: sp 240 + +STACK CFI 18cf4 .cfa: sp 28 + +STACK CFI INIT 18cfc e8 .cfa: sp 0 + .ra: lr +STACK CFI 18d00 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 18d0a .cfa: sp 104 + +STACK CFI 18dc4 .cfa: sp 28 + +STACK CFI INIT 18de4 74 .cfa: sp 0 + .ra: lr +STACK CFI 18de8 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 18dec .cfa: sp 96 + +STACK CFI 18e50 .cfa: sp 32 + +STACK CFI INIT 18e58 11c .cfa: sp 0 + .ra: lr +STACK CFI 18e5c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 18e6a .cfa: sp 296 + +STACK CFI 18f6a .cfa: sp 36 + +STACK CFI INIT 18f74 96 .cfa: sp 0 + .ra: lr +STACK CFI 18f76 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 18f78 .cfa: sp 80 + +STACK CFI 19008 .cfa: sp 20 + +STACK CFI INIT 1900c 110 .cfa: sp 0 + .ra: lr +STACK CFI 19010 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 1901e .cfa: sp 232 + +STACK CFI 190fa .cfa: sp 32 + +STACK CFI INIT 1911c 94 .cfa: sp 0 + .ra: lr +STACK CFI 19120 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1912a .cfa: sp 232 + +STACK CFI 191a6 .cfa: sp 36 + +STACK CFI INIT 191b0 62 .cfa: sp 0 + .ra: lr +STACK CFI 191b2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 19210 .cfa: sp 20 + +STACK CFI INIT 19212 30 .cfa: sp 0 + .ra: lr +STACK CFI 19214 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 192a0 64 .cfa: sp 0 + .ra: lr +STACK CFI 192a2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 13b88 6ac .cfa: sp 0 + .ra: lr +STACK CFI 13b8c .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 140e6 .cfa: sp 24 + +STACK CFI INIT 19418 2f4 .cfa: sp 0 + .ra: lr +STACK CFI 1941c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 19420 .cfa: sp 256 + +STACK CFI 196cc .cfa: sp 36 + +STACK CFI INIT 1970c 6c .cfa: sp 0 + .ra: lr +STACK CFI 1970e .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 19710 .cfa: sp 40 + +STACK CFI 1976e .cfa: sp 12 + +STACK CFI INIT 19778 70 .cfa: sp 0 + .ra: lr +STACK CFI 1977a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 1977c .cfa: sp 40 + +STACK CFI 197dc .cfa: sp 12 + +STACK CFI INIT 197e8 148 .cfa: sp 0 + .ra: lr +STACK CFI 197ec .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 197f0 .cfa: sp 112 + +STACK CFI 1990a .cfa: sp 28 + +STACK CFI INIT 19930 148 .cfa: sp 0 + .ra: lr +STACK CFI 19934 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 19938 .cfa: sp 112 + +STACK CFI 19a52 .cfa: sp 28 + +STACK CFI INIT 19a78 148 .cfa: sp 0 + .ra: lr +STACK CFI 19a7c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 19a80 .cfa: sp 112 + +STACK CFI 19b9a .cfa: sp 28 + +STACK CFI INIT 19bc0 148 .cfa: sp 0 + .ra: lr +STACK CFI 19bc4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 19bc8 .cfa: sp 112 + +STACK CFI 19ce2 .cfa: sp 28 + +STACK CFI INIT 19d08 c4 .cfa: sp 0 + .ra: lr +STACK CFI 19d0a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 19d0e .cfa: sp 104 + +STACK CFI 19db8 .cfa: sp 20 + +STACK CFI INIT 19dcc 270 .cfa: sp 0 + .ra: lr +STACK CFI 19dd0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 19dd4 .cfa: sp 280 + +STACK CFI 19ff2 .cfa: sp 36 + +STACK CFI INIT 1a03c f8 .cfa: sp 0 + .ra: lr +STACK CFI 1a040 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 1a044 .cfa: sp 256 + +STACK CFI 1a11e .cfa: sp 24 + +STACK CFI INIT 1a134 f8 .cfa: sp 0 + .ra: lr +STACK CFI 1a138 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 1a13c .cfa: sp 256 + +STACK CFI 1a216 .cfa: sp 24 + +STACK CFI INIT 1a22c fc .cfa: sp 0 + .ra: lr +STACK CFI 1a230 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 1a234 .cfa: sp 256 + +STACK CFI 1a310 .cfa: sp 24 + +STACK CFI INIT 1a328 fc .cfa: sp 0 + .ra: lr +STACK CFI 1a32c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 1a330 .cfa: sp 256 + +STACK CFI 1a40c .cfa: sp 24 + +STACK CFI INIT 1a424 748 .cfa: sp 0 + .ra: lr +STACK CFI 1a428 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1a430 .cfa: sp 1232 + +STACK CFI 1aaa6 .cfa: sp 36 + +STACK CFI INIT 1ab6c 884 .cfa: sp 0 + .ra: lr +STACK CFI 1ab70 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1ab78 .cfa: sp 624 + +STACK CFI 1b2f4 .cfa: sp 36 + +STACK CFI INIT 1b3f0 7f8 .cfa: sp 0 + .ra: lr +STACK CFI 1b3f4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1b3fa .cfa: sp 488 + +STACK CFI 1bafa .cfa: sp 36 + +STACK CFI INIT 1bbe8 7f8 .cfa: sp 0 + .ra: lr +STACK CFI 1bbec .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1bbf2 .cfa: sp 496 + +STACK CFI 1c2f4 .cfa: sp 36 + +STACK CFI INIT 1c3e0 458 .cfa: sp 0 + .ra: lr +STACK CFI 1c3e4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1c3ea .cfa: sp 360 + +STACK CFI 1c7be .cfa: sp 36 + +STACK CFI INIT 1c838 690 .cfa: sp 0 + .ra: lr +STACK CFI 1c83c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1c844 .cfa: sp 616 + +STACK CFI 1ce26 .cfa: sp 36 + +STACK CFI INIT 1cec8 2dc .cfa: sp 0 + .ra: lr +STACK CFI 1cecc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1ced0 .cfa: sp 344 + +STACK CFI 1d150 .cfa: sp 36 + +STACK CFI INIT 1d1a4 468 .cfa: sp 0 + .ra: lr +STACK CFI 1d1a8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1d1ae .cfa: sp 568 + +STACK CFI 1d598 .cfa: sp 36 + +STACK CFI INIT 1d60c 370 .cfa: sp 0 + .ra: lr +STACK CFI 1d610 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1d614 .cfa: sp 344 + +STACK CFI 1d920 .cfa: sp 36 + +STACK CFI INIT 1d97c 22c .cfa: sp 0 + .ra: lr +STACK CFI 1d980 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1d986 .cfa: sp 320 + +STACK CFI 1db6e .cfa: sp 36 + +STACK CFI INIT 1dba8 41c .cfa: sp 0 + .ra: lr +STACK CFI 1dbac .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1dbb0 .cfa: sp 248 + +STACK CFI 1df42 .cfa: sp 36 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1dfc4 20 .cfa: sp 0 + .ra: lr +STACK CFI 1dfc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1dfe4 18 .cfa: sp 0 + .ra: lr +STACK CFI 1dfe6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1dffc 12 .cfa: sp 0 + .ra: lr +STACK CFI 1dffe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b76 28 .cfa: sp 0 + .ra: lr +STACK CFI 16b78 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16b9e e .cfa: sp 0 + .ra: lr +STACK CFI 16ba0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 175b2 98 .cfa: sp 0 + .ra: lr +STACK CFI 175b6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17646 .cfa: sp 28 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 176da 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI cc .cfa: sp 24 + +STACK CFI INIT 0 1ec .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 16 .cfa: sp 208 + +STACK CFI 1c2 .cfa: sp 32 + +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 10 .cfa: sp 56 + +STACK CFI 6a .cfa: sp 24 + +STACK CFI INIT 17a84 2c .cfa: sp 0 + .ra: lr +STACK CFI 17a86 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17aae .cfa: sp 16 + +STACK CFI INIT 17ab0 38 .cfa: sp 0 + .ra: lr +STACK CFI 17ab2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17ae0 .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 17ae8 2c .cfa: sp 0 + .ra: lr +STACK CFI 17aea .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17b12 .cfa: sp 16 + +STACK CFI INIT 0 8a .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 86 .cfa: sp 24 + +STACK CFI INIT 17ba4 46 .cfa: sp 0 + .ra: lr +STACK CFI 17ba6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17be8 .cfa: sp 20 + +STACK CFI INIT 17bec 2c8 .cfa: sp 0 + .ra: lr +STACK CFI 17bf0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 17bf4 .cfa: sp 256 + +STACK CFI 17e60 .cfa: sp 36 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI e .cfa: sp 240 + +STACK CFI d8 .cfa: sp 28 + +STACK CFI INIT 0 ec .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 112 + +STACK CFI d0 .cfa: sp 28 + +STACK CFI INIT 182f4 2c .cfa: sp 0 + .ra: lr +STACK CFI 182f6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 18318 .cfa: sp 20 + +STACK CFI INIT 1e020 6c .cfa: sp 0 + .ra: lr +STACK CFI 1e024 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 1e02e .cfa: sp 184 + +STACK CFI 1e07e .cfa: sp 24 + +STACK CFI INIT 1e08c 108 .cfa: sp 0 + .ra: lr +STACK CFI 1e090 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 1e09a .cfa: sp 112 + +STACK CFI 1e174 .cfa: sp 28 + +STACK CFI INIT 1e194 6e4 .cfa: sp 0 + .ra: lr +STACK CFI 1e198 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1e1a0 .cfa: sp 1640 + +STACK CFI 1e7c4 .cfa: sp 36 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 19212 30 .cfa: sp 0 + .ra: lr +STACK CFI 19214 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 192a0 64 .cfa: sp 0 + .ra: lr +STACK CFI 192a2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 14234 58 .cfa: sp 0 + .ra: lr +STACK CFI 14236 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 14272 .cfa: sp 8 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e878 18 .cfa: sp 0 + .ra: lr +STACK CFI 1e87a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e890 12 .cfa: sp 0 + .ra: lr +STACK CFI 1e892 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e8a4 18 .cfa: sp 0 + .ra: lr +STACK CFI 1e8a6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e8bc 12 .cfa: sp 0 + .ra: lr +STACK CFI 1e8be .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e8d0 18 .cfa: sp 0 + .ra: lr +STACK CFI 1e8d2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e8e8 12 .cfa: sp 0 + .ra: lr +STACK CFI 1e8ea .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e8fc 18 .cfa: sp 0 + .ra: lr +STACK CFI 1e8fe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e914 12 .cfa: sp 0 + .ra: lr +STACK CFI 1e916 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e928 18 .cfa: sp 0 + .ra: lr +STACK CFI 1e92a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e940 12 .cfa: sp 0 + .ra: lr +STACK CFI 1e942 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e954 18 .cfa: sp 0 + .ra: lr +STACK CFI 1e956 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e96c 12 .cfa: sp 0 + .ra: lr +STACK CFI 1e96e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e980 18 .cfa: sp 0 + .ra: lr +STACK CFI 1e982 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e998 12 .cfa: sp 0 + .ra: lr +STACK CFI 1e99a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e9ac 18 .cfa: sp 0 + .ra: lr +STACK CFI 1e9ae .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e9c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 1e9c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e9d8 18 .cfa: sp 0 + .ra: lr +STACK CFI 1e9da .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e9f0 12 .cfa: sp 0 + .ra: lr +STACK CFI 1e9f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1ea04 18 .cfa: sp 0 + .ra: lr +STACK CFI 1ea06 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1ea1c 12 .cfa: sp 0 + .ra: lr +STACK CFI 1ea1e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1ea30 20 .cfa: sp 0 + .ra: lr +STACK CFI 1ea32 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1ea50 20 .cfa: sp 0 + .ra: lr +STACK CFI 1ea52 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1ea70 20 .cfa: sp 0 + .ra: lr +STACK CFI 1ea72 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1ea90 20 .cfa: sp 0 + .ra: lr +STACK CFI 1ea92 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1eab0 20 .cfa: sp 0 + .ra: lr +STACK CFI 1eab2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1ead0 20 .cfa: sp 0 + .ra: lr +STACK CFI 1ead2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1eaf0 20 .cfa: sp 0 + .ra: lr +STACK CFI 1eaf2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1eb10 20 .cfa: sp 0 + .ra: lr +STACK CFI 1eb12 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1eb30 20 .cfa: sp 0 + .ra: lr +STACK CFI 1eb32 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1eb50 20 .cfa: sp 0 + .ra: lr +STACK CFI 1eb52 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ad8 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1eb70 10 .cfa: sp 0 + .ra: lr +STACK CFI 1eb72 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1eb80 108 .cfa: sp 0 + .ra: lr +STACK CFI 1eb84 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1eb8a .cfa: sp 568 + +STACK CFI 1ec80 .cfa: sp 36 + +STACK CFI INIT 1ec88 1c .cfa: sp 0 + .ra: lr +STACK CFI 1ec8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 1eca4 12 .cfa: sp 0 + .ra: lr +STACK CFI 1eca6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1ecb8 6c .cfa: sp 0 + .ra: lr +STACK CFI 1ecba .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 1ecc0 .cfa: sp 4112 + +STACK CFI 1ecc6 .cfa: sp 4120 + +STACK CFI 1ed1a .cfa: sp 16 + +STACK CFI INIT 1ed24 5c .cfa: sp 0 + .ra: lr +STACK CFI 1ed26 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI da .cfa: sp 20 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 1ed80 dc .cfa: sp 0 + .ra: lr +STACK CFI 1ed84 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1ed8e .cfa: sp 264 + +STACK CFI 1ee52 .cfa: sp 36 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1e .cfa: sp 20 + +STACK CFI INIT 1ee5c 80 .cfa: sp 0 + .ra: lr +STACK CFI 1ee5e .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1ee60 .cfa: sp 176 + +STACK CFI 1eecc .cfa: sp 20 + +STACK CFI INIT 1eedc 1ac .cfa: sp 0 + .ra: lr +STACK CFI 1eee0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1eee4 .cfa: sp 224 + +STACK CFI 1f050 .cfa: sp 36 + +STACK CFI INIT 1f088 1ac .cfa: sp 0 + .ra: lr +STACK CFI 1f08c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1f090 .cfa: sp 224 + +STACK CFI 1f1fc .cfa: sp 36 + +STACK CFI INIT 1f234 1b0 .cfa: sp 0 + .ra: lr +STACK CFI 1f238 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1f23c .cfa: sp 224 + +STACK CFI 1f3ac .cfa: sp 36 + +STACK CFI INIT 1f3e4 1b0 .cfa: sp 0 + .ra: lr +STACK CFI 1f3e8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1f3ec .cfa: sp 224 + +STACK CFI 1f55c .cfa: sp 36 + +STACK CFI INIT 1f594 1ac .cfa: sp 0 + .ra: lr +STACK CFI 1f598 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1f59c .cfa: sp 224 + +STACK CFI 1f708 .cfa: sp 36 + +STACK CFI INIT 1f740 1ac .cfa: sp 0 + .ra: lr +STACK CFI 1f744 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1f748 .cfa: sp 224 + +STACK CFI 1f8b4 .cfa: sp 36 + +STACK CFI INIT 1f8ec 3e8 .cfa: sp 0 + .ra: lr +STACK CFI 1f8f0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1f8f4 .cfa: sp 368 + +STACK CFI 1fc54 .cfa: sp 36 + +STACK CFI INIT 1fcd4 1fc .cfa: sp 0 + .ra: lr +STACK CFI 1fcd8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1fcdc .cfa: sp 232 + +STACK CFI 1fe92 .cfa: sp 36 + +STACK CFI INIT 1fed0 3ec .cfa: sp 0 + .ra: lr +STACK CFI 1fed4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1fed8 .cfa: sp 376 + +STACK CFI 2023e .cfa: sp 36 + +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 90 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1428c 294 .cfa: sp 0 + .ra: lr +STACK CFI 14290 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 14494 .cfa: sp 24 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 202bc 18 .cfa: sp 0 + .ra: lr +STACK CFI 202be .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 202d4 12 .cfa: sp 0 + .ra: lr +STACK CFI 202d6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 202e8 20 .cfa: sp 0 + .ra: lr +STACK CFI 202ea .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b76 28 .cfa: sp 0 + .ra: lr +STACK CFI 16b78 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16b9e e .cfa: sp 0 + .ra: lr +STACK CFI 16ba0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f58 30 .cfa: sp 0 + .ra: lr +STACK CFI 16f5a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 20308 28 .cfa: sp 0 + .ra: lr +STACK CFI 2030a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 2032e .cfa: sp 12 + +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 175b2 98 .cfa: sp 0 + .ra: lr +STACK CFI 175b6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17646 .cfa: sp 28 + +STACK CFI INIT 176da 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 16 .cfa: sp 64 + +STACK CFI 12a .cfa: sp 32 + +STACK CFI INIT 20330 98 .cfa: sp 0 + .ra: lr +STACK CFI 20332 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 20334 .cfa: sp 80 + +STACK CFI 203c6 .cfa: sp 20 + +STACK CFI INIT 203c8 28 .cfa: sp 0 + .ra: lr +STACK CFI 203ca .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 17ab0 38 .cfa: sp 0 + .ra: lr +STACK CFI 17ab2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17ae0 .cfa: sp 16 + +STACK CFI INIT 0 1bc .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 272 + +STACK CFI 19e .cfa: sp 36 + +STACK CFI INIT 203f0 34 .cfa: sp 0 + .ra: lr +STACK CFI 203f2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 20424 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 20450 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 2047c 9e .cfa: sp 0 + .ra: lr +STACK CFI 20480 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 2051a 6e .cfa: sp 0 + .ra: lr +STACK CFI 2051e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 20588 70c .cfa: sp 0 + .ra: lr +STACK CFI 2058c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2059a .cfa: sp 888 + +STACK CFI 20bf8 .cfa: sp 36 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 192a0 64 .cfa: sp 0 + .ra: lr +STACK CFI 192a2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19212 30 .cfa: sp 0 + .ra: lr +STACK CFI 19214 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 8a .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 86 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 14520 5c .cfa: sp 0 + .ra: lr +STACK CFI 14522 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 14560 .cfa: sp 8 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20c94 18 .cfa: sp 0 + .ra: lr +STACK CFI 20c96 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20cac 12 .cfa: sp 0 + .ra: lr +STACK CFI 20cae .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20cc0 18 .cfa: sp 0 + .ra: lr +STACK CFI 20cc2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20cd8 12 .cfa: sp 0 + .ra: lr +STACK CFI 20cda .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20cec 18 .cfa: sp 0 + .ra: lr +STACK CFI 20cee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20d04 12 .cfa: sp 0 + .ra: lr +STACK CFI 20d06 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20d18 18 .cfa: sp 0 + .ra: lr +STACK CFI 20d1a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20d30 12 .cfa: sp 0 + .ra: lr +STACK CFI 20d32 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20d44 18 .cfa: sp 0 + .ra: lr +STACK CFI 20d46 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20d5c 12 .cfa: sp 0 + .ra: lr +STACK CFI 20d5e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20d70 18 .cfa: sp 0 + .ra: lr +STACK CFI 20d72 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20d88 12 .cfa: sp 0 + .ra: lr +STACK CFI 20d8a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20d9c 18 .cfa: sp 0 + .ra: lr +STACK CFI 20d9e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20db4 12 .cfa: sp 0 + .ra: lr +STACK CFI 20db6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20dc8 20 .cfa: sp 0 + .ra: lr +STACK CFI 20dca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20de8 20 .cfa: sp 0 + .ra: lr +STACK CFI 20dea .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20e08 20 .cfa: sp 0 + .ra: lr +STACK CFI 20e0a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20e28 20 .cfa: sp 0 + .ra: lr +STACK CFI 20e2a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20e48 20 .cfa: sp 0 + .ra: lr +STACK CFI 20e4a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20e68 20 .cfa: sp 0 + .ra: lr +STACK CFI 20e6a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 20e88 20 .cfa: sp 0 + .ra: lr +STACK CFI 20e8a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 20ea8 9e .cfa: sp 0 + .ra: lr +STACK CFI 20eaa .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 20f46 12 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ad8 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1eca4 12 .cfa: sp 0 + .ra: lr +STACK CFI 1eca6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1ecb8 6c .cfa: sp 0 + .ra: lr +STACK CFI 1ecba .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 1ecc0 .cfa: sp 4112 + +STACK CFI 1ecc6 .cfa: sp 4120 + +STACK CFI 1ed1a .cfa: sp 16 + +STACK CFI INIT 20f58 42 .cfa: sp 0 + .ra: lr +STACK CFI 20f5a .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 20f94 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 r6: r6 r7: r7 +STACK CFI INIT 20f9c 2c .cfa: sp 0 + .ra: lr +STACK CFI 20f9e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 20fc8 148 .cfa: sp 0 + .ra: lr +STACK CFI 20fcc .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 20fd2 .cfa: sp 624 + +STACK CFI 210e4 .cfa: sp 28 + +STACK CFI INIT 21110 16c .cfa: sp 0 + .ra: lr +STACK CFI 21114 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 2111a .cfa: sp 1136 + +STACK CFI 21250 .cfa: sp 28 + +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI da .cfa: sp 20 + +STACK CFI INIT 2127c a0 .cfa: sp 0 + .ra: lr +STACK CFI 21280 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2128a .cfa: sp 264 + +STACK CFI 21314 .cfa: sp 36 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1e .cfa: sp 20 + +STACK CFI INIT 2131c a0 .cfa: sp 0 + .ra: lr +STACK CFI 21320 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2132a .cfa: sp 264 + +STACK CFI 213b4 .cfa: sp 36 + +STACK CFI INIT 213bc 20 .cfa: sp 0 + .ra: lr +STACK CFI 213be .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 213da .cfa: sp 20 + +STACK CFI INIT 213dc 288 .cfa: sp 0 + .ra: lr +STACK CFI 213e0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 213e6 .cfa: sp 640 + +STACK CFI 21602 .cfa: sp 36 + +STACK CFI INIT 21664 288 .cfa: sp 0 + .ra: lr +STACK CFI 21668 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2166e .cfa: sp 640 + +STACK CFI 2188a .cfa: sp 36 + +STACK CFI INIT 218ec 3c4 .cfa: sp 0 + .ra: lr +STACK CFI 218f0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 218f6 .cfa: sp 656 + +STACK CFI 21c2e .cfa: sp 36 + +STACK CFI INIT 21cb0 3c4 .cfa: sp 0 + .ra: lr +STACK CFI 21cb4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 21cba .cfa: sp 656 + +STACK CFI 21ff2 .cfa: sp 36 + +STACK CFI INIT 22074 268 .cfa: sp 0 + .ra: lr +STACK CFI 22078 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2207e .cfa: sp 1152 + +STACK CFI 22286 .cfa: sp 36 + +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 90 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1457c 1dc .cfa: sp 0 + .ra: lr +STACK CFI 14580 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 146ee .cfa: sp 24 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 222dc 18 .cfa: sp 0 + .ra: lr +STACK CFI 222de .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 222f4 12 .cfa: sp 0 + .ra: lr +STACK CFI 222f6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22308 18 .cfa: sp 0 + .ra: lr +STACK CFI 2230a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22320 12 .cfa: sp 0 + .ra: lr +STACK CFI 22322 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22334 20 .cfa: sp 0 + .ra: lr +STACK CFI 22336 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22354 20 .cfa: sp 0 + .ra: lr +STACK CFI 22356 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI c .cfa: sp 48 + +STACK CFI 8c .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 32 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 42 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 9e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 9c .cfa: sp 20 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 9e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 9c .cfa: sp 20 + +STACK CFI INIT 2127c a0 .cfa: sp 0 + .ra: lr +STACK CFI 21280 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2128a .cfa: sp 264 + +STACK CFI 21314 .cfa: sp 36 + +STACK CFI INIT 0 a0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI e .cfa: sp 264 + +STACK CFI 98 .cfa: sp 36 + +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 90 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 22374 24 .cfa: sp 0 + .ra: lr +STACK CFI 22378 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22398 3b8 .cfa: sp 0 + .ra: lr +STACK CFI 2239c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 223a2 .cfa: sp 1008 + +STACK CFI 226d0 .cfa: sp 36 + +STACK CFI INIT 22750 70c .cfa: sp 0 + .ra: lr +STACK CFI 22754 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 22764 .cfa: sp 656 + +STACK CFI 22d84 .cfa: sp 36 + +STACK CFI INIT 22e5c 12 .cfa: sp 0 + .ra: lr +STACK CFI 22e5e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 14758 9c .cfa: sp 0 + .ra: lr +STACK CFI 1475a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1475c .cfa: sp 40 + +STACK CFI 147ce .cfa: sp 20 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22e6e c .cfa: sp 0 + .ra: lr +STACK CFI 22e70 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22e7c 18 .cfa: sp 0 + .ra: lr +STACK CFI 22e7e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22e94 12 .cfa: sp 0 + .ra: lr +STACK CFI 22e96 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ea8 18 .cfa: sp 0 + .ra: lr +STACK CFI 22eaa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ec0 12 .cfa: sp 0 + .ra: lr +STACK CFI 22ec2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ea8 18 .cfa: sp 0 + .ra: lr +STACK CFI 22eaa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ec0 12 .cfa: sp 0 + .ra: lr +STACK CFI 22ec2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ea8 18 .cfa: sp 0 + .ra: lr +STACK CFI 22eaa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ec0 12 .cfa: sp 0 + .ra: lr +STACK CFI 22ec2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ea8 18 .cfa: sp 0 + .ra: lr +STACK CFI 22eaa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ec0 12 .cfa: sp 0 + .ra: lr +STACK CFI 22ec2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ea8 18 .cfa: sp 0 + .ra: lr +STACK CFI 22eaa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ec0 12 .cfa: sp 0 + .ra: lr +STACK CFI 22ec2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ed4 20 .cfa: sp 0 + .ra: lr +STACK CFI 22ed6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22ef4 20 .cfa: sp 0 + .ra: lr +STACK CFI 22ef6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22f14 20 .cfa: sp 0 + .ra: lr +STACK CFI 22f16 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22f34 20 .cfa: sp 0 + .ra: lr +STACK CFI 22f36 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22f54 20 .cfa: sp 0 + .ra: lr +STACK CFI 22f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22f74 20 .cfa: sp 0 + .ra: lr +STACK CFI 22f76 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ad8 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b76 28 .cfa: sp 0 + .ra: lr +STACK CFI 16b78 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16b9e e .cfa: sp 0 + .ra: lr +STACK CFI 16ba0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22f94 144 .cfa: sp 0 + .ra: lr +STACK CFI 22f9a .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 22fa2 .cfa: sp 88 + +STACK CFI 230ae .cfa: sp 28 + +STACK CFI INIT 230d8 44 .cfa: sp 0 + .ra: lr +STACK CFI 230da .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2311c 12 .cfa: sp 0 + .ra: lr +STACK CFI 2311e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 16db4 38 .cfa: sp 0 + .ra: lr +STACK CFI 16db6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 16de6 .cfa: sp 8 + +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 23130 48 .cfa: sp 0 + .ra: lr +STACK CFI 23132 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 175b2 98 .cfa: sp 0 + .ra: lr +STACK CFI 175b6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17646 .cfa: sp 28 + +STACK CFI INIT 176da 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 1772c d8 .cfa: sp 0 + .ra: lr +STACK CFI 17732 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17800 .cfa: sp 24 + +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 10 .cfa: sp 56 + +STACK CFI 6a .cfa: sp 24 + +STACK CFI INIT 17a84 2c .cfa: sp 0 + .ra: lr +STACK CFI 17a86 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17aae .cfa: sp 16 + +STACK CFI INIT 17ab0 38 .cfa: sp 0 + .ra: lr +STACK CFI 17ab2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17ae0 .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 17ae8 2c .cfa: sp 0 + .ra: lr +STACK CFI 17aea .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17b12 .cfa: sp 16 + +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI e .cfa: sp 240 + +STACK CFI d8 .cfa: sp 28 + +STACK CFI INIT 18de4 74 .cfa: sp 0 + .ra: lr +STACK CFI 18de8 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 18dec .cfa: sp 96 + +STACK CFI 18e50 .cfa: sp 32 + +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI e .cfa: sp 240 + +STACK CFI d8 .cfa: sp 28 + +STACK CFI INIT 0 104 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI e .cfa: sp 112 + +STACK CFI e2 .cfa: sp 28 + +STACK CFI INIT 23178 2b8 .cfa: sp 0 + .ra: lr +STACK CFI 2317c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 23180 .cfa: sp 104 + +STACK CFI 233e2 .cfa: sp 36 + +STACK CFI INIT 18320 74 .cfa: sp 0 + .ra: lr +STACK CFI 18324 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 18328 .cfa: sp 96 + +STACK CFI 1838c .cfa: sp 32 + +STACK CFI INIT 23430 1c .cfa: sp 0 + .ra: lr +STACK CFI 23434 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2344c 1a .cfa: sp 0 + .ra: lr +STACK CFI 2344e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 23450 .cfa: sp 96 + +STACK CFI 23464 .cfa: sp 8 + +STACK CFI INIT 23468 1d0 .cfa: sp 0 + .ra: lr +STACK CFI 2346c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 23470 .cfa: sp 176 + +STACK CFI 235e8 .cfa: sp 28 + +STACK CFI INIT 23638 400 .cfa: sp 0 + .ra: lr +STACK CFI 2363c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 23642 .cfa: sp 960 + +STACK CFI 239b0 .cfa: sp 36 + +STACK CFI INIT 23a38 46c .cfa: sp 0 + .ra: lr +STACK CFI 23a3c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 23a44 .cfa: sp 4388 + +STACK CFI 23a4a .cfa: sp 4408 + +STACK CFI 23e3c .cfa: sp 36 + +STACK CFI INIT 23ea4 2b0 .cfa: sp 0 + .ra: lr +STACK CFI 23ea8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 23eac .cfa: sp 232 + +STACK CFI 240f8 .cfa: sp 36 + +STACK CFI INIT 24154 2a8 .cfa: sp 0 + .ra: lr +STACK CFI 24158 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2415c .cfa: sp 216 + +STACK CFI 243b4 .cfa: sp 36 + +STACK CFI INIT 243fc 8b4 .cfa: sp 0 + .ra: lr +STACK CFI 24400 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 24410 .cfa: sp 440 + +STACK CFI 24c74 .cfa: sp 36 + +STACK CFI INIT 24cb0 12 .cfa: sp 0 + .ra: lr +STACK CFI 24cb2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 191b0 62 .cfa: sp 0 + .ra: lr +STACK CFI 191b2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 19210 .cfa: sp 20 + +STACK CFI INIT 19212 30 .cfa: sp 0 + .ra: lr +STACK CFI 19214 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 192a0 64 .cfa: sp 0 + .ra: lr +STACK CFI 192a2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 17b14 90 .cfa: sp 0 + .ra: lr +STACK CFI 17b1a .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17ba0 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 147f4 1d4 .cfa: sp 0 + .ra: lr +STACK CFI 147f8 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 1494e .cfa: sp 24 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 24cc4 20 .cfa: sp 0 + .ra: lr +STACK CFI 24cc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24ce4 20 .cfa: sp 0 + .ra: lr +STACK CFI 24ce6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24d04 20 .cfa: sp 0 + .ra: lr +STACK CFI 24d06 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24d24 20 .cfa: sp 0 + .ra: lr +STACK CFI 24d26 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24d44 20 .cfa: sp 0 + .ra: lr +STACK CFI 24d46 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24d64 20 .cfa: sp 0 + .ra: lr +STACK CFI 24d66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24d84 20 .cfa: sp 0 + .ra: lr +STACK CFI 24d86 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24da4 20 .cfa: sp 0 + .ra: lr +STACK CFI 24da6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24dc4 18 .cfa: sp 0 + .ra: lr +STACK CFI 24dc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24ddc 12 .cfa: sp 0 + .ra: lr +STACK CFI 24dde .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24df0 18 .cfa: sp 0 + .ra: lr +STACK CFI 24df2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24e08 12 .cfa: sp 0 + .ra: lr +STACK CFI 24e0a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24e1c 18 .cfa: sp 0 + .ra: lr +STACK CFI 24e1e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24e34 12 .cfa: sp 0 + .ra: lr +STACK CFI 24e36 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24e48 18 .cfa: sp 0 + .ra: lr +STACK CFI 24e4a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24e60 12 .cfa: sp 0 + .ra: lr +STACK CFI 24e62 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24e74 18 .cfa: sp 0 + .ra: lr +STACK CFI 24e76 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24e8c 12 .cfa: sp 0 + .ra: lr +STACK CFI 24e8e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24ea0 18 .cfa: sp 0 + .ra: lr +STACK CFI 24ea2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24eb8 12 .cfa: sp 0 + .ra: lr +STACK CFI 24eba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24ecc 18 .cfa: sp 0 + .ra: lr +STACK CFI 24ece .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24ee4 12 .cfa: sp 0 + .ra: lr +STACK CFI 24ee6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24ef8 18 .cfa: sp 0 + .ra: lr +STACK CFI 24efa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24f10 12 .cfa: sp 0 + .ra: lr +STACK CFI 24f12 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ad8 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b76 28 .cfa: sp 0 + .ra: lr +STACK CFI 16b78 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16b9e e .cfa: sp 0 + .ra: lr +STACK CFI 16ba0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 24f22 7a .cfa: sp 0 + .ra: lr +STACK CFI 24f24 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16d8a 28 .cfa: sp 0 + .ra: lr +STACK CFI 16d8e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 24f9c 30 .cfa: sp 0 + .ra: lr +STACK CFI 24f9e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 24fcc 32 .cfa: sp 0 + .ra: lr +STACK CFI 24fd2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 24ffc .cfa: sp 16 + +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f58 30 .cfa: sp 0 + .ra: lr +STACK CFI 16f5a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17044 16 .cfa: sp 0 + .ra: lr +STACK CFI 17046 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 17056 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 17522 90 .cfa: sp 0 + .ra: lr +STACK CFI 17524 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17526 .cfa: sp 80 + +STACK CFI 175b0 .cfa: sp 20 + +STACK CFI INIT 175b2 98 .cfa: sp 0 + .ra: lr +STACK CFI 175b6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17646 .cfa: sp 28 + +STACK CFI INIT 176da 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI cc .cfa: sp 24 + +STACK CFI INIT 24ffe 1a .cfa: sp 0 + .ra: lr +STACK CFI 25000 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 25014 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 0 1e8 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 16 .cfa: sp 208 + +STACK CFI 1be .cfa: sp 32 + +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 10 .cfa: sp 56 + +STACK CFI 6a .cfa: sp 24 + +STACK CFI INIT 17a84 2c .cfa: sp 0 + .ra: lr +STACK CFI 17a86 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17aae .cfa: sp 16 + +STACK CFI INIT 17ab0 38 .cfa: sp 0 + .ra: lr +STACK CFI 17ab2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17ae0 .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 17ae8 2c .cfa: sp 0 + .ra: lr +STACK CFI 17aea .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17b12 .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 25018 22 .cfa: sp 0 + .ra: lr +STACK CFI 2501e .cfa: sp 16 + +STACK CFI 25038 .cfa: sp 0 + +STACK CFI INIT 2503a 1a .cfa: sp 0 + .ra: lr +STACK CFI 2503c .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 25018 22 .cfa: sp 0 + .ra: lr +STACK CFI 2501e .cfa: sp 16 + +STACK CFI 25038 .cfa: sp 0 + +STACK CFI INIT 25054 1c .cfa: sp 0 + .ra: lr +STACK CFI 25056 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 25070 c0 .cfa: sp 0 + .ra: lr +STACK CFI 25074 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 25078 .cfa: sp 264 + +STACK CFI 25124 .cfa: sp 36 + +STACK CFI INIT 25130 4a .cfa: sp 0 + .ra: lr +STACK CFI 25134 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 25176 .cfa: sp 32 + +STACK CFI INIT 2517c a0 .cfa: sp 0 + .ra: lr +STACK CFI 25180 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2518a .cfa: sp 264 + +STACK CFI 25212 .cfa: sp 36 + +STACK CFI INIT 0 42 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3e .cfa: sp 28 + +STACK CFI INIT 0 8a .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 86 .cfa: sp 24 + +STACK CFI INIT 17ba4 46 .cfa: sp 0 + .ra: lr +STACK CFI 17ba6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17be8 .cfa: sp 20 + +STACK CFI INIT 17bec 2c8 .cfa: sp 0 + .ra: lr +STACK CFI 17bf0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 17bf4 .cfa: sp 256 + +STACK CFI 17e60 .cfa: sp 36 + +STACK CFI INIT 17eb4 14 .cfa: sp 0 + .ra: lr +STACK CFI 17eb6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 181d8 48 .cfa: sp 0 + .ra: lr +STACK CFI 181da .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 181e6 .cfa: sp 184 + +STACK CFI 1821a .cfa: sp 20 + +STACK CFI INIT 18220 d4 .cfa: sp 0 + .ra: lr +STACK CFI 18224 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 18228 .cfa: sp 112 + +STACK CFI 182d6 .cfa: sp 28 + +STACK CFI INIT 182f4 2c .cfa: sp 0 + .ra: lr +STACK CFI 182f6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 18318 .cfa: sp 20 + +STACK CFI INIT 18320 74 .cfa: sp 0 + .ra: lr +STACK CFI 18324 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 18328 .cfa: sp 96 + +STACK CFI 1838c .cfa: sp 32 + +STACK CFI INIT 2521c d8 .cfa: sp 0 + .ra: lr +STACK CFI 25220 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 2522a .cfa: sp 240 + +STACK CFI 252ec .cfa: sp 32 + +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 12 .cfa: sp 104 + +STACK CFI d4 .cfa: sp 32 + +STACK CFI INIT 252f4 26c .cfa: sp 0 + .ra: lr +STACK CFI 252f8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 25300 .cfa: sp 1120 + +STACK CFI 25522 .cfa: sp 36 + +STACK CFI INIT 25560 274 .cfa: sp 0 + .ra: lr +STACK CFI 25564 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2556c .cfa: sp 1120 + +STACK CFI 25798 .cfa: sp 36 + +STACK CFI INIT 18c24 d8 .cfa: sp 0 + .ra: lr +STACK CFI 18c28 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 18c32 .cfa: sp 240 + +STACK CFI 18cf4 .cfa: sp 28 + +STACK CFI INIT 18e58 11c .cfa: sp 0 + .ra: lr +STACK CFI 18e5c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 18e6a .cfa: sp 296 + +STACK CFI 18f6a .cfa: sp 36 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 192a0 64 .cfa: sp 0 + .ra: lr +STACK CFI 192a2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19212 30 .cfa: sp 0 + .ra: lr +STACK CFI 19214 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 149c8 200 .cfa: sp 0 + .ra: lr +STACK CFI 149ca .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 149cc .cfa: sp 40 + +STACK CFI 14b5a .cfa: sp 20 + +STACK CFI INIT 257d4 c70 .cfa: sp 0 + .ra: lr +STACK CFI 257d8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 257e0 .cfa: sp 1808 + +STACK CFI 262c6 .cfa: sp 36 + +STACK CFI INIT 26444 7d0 .cfa: sp 0 + .ra: lr +STACK CFI 26448 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 26450 .cfa: sp 1824 + +STACK CFI 26b54 .cfa: sp 36 + +STACK CFI INIT 26c14 8a8 .cfa: sp 0 + .ra: lr +STACK CFI 26c18 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 26c20 .cfa: sp 1424 + +STACK CFI 273ce .cfa: sp 36 + +STACK CFI INIT 274bc 298 .cfa: sp 0 + .ra: lr +STACK CFI 274c0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 274c8 .cfa: sp 1120 + +STACK CFI 27710 .cfa: sp 36 + +STACK CFI INIT 27754 5a4 .cfa: sp 0 + .ra: lr +STACK CFI 27758 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 27760 .cfa: sp 1192 + +STACK CFI 27c70 .cfa: sp 36 + +STACK CFI INIT 27cf8 dec .cfa: sp 0 + .ra: lr +STACK CFI 27cfc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 27d0a .cfa: sp 536 + +STACK CFI 28a1e .cfa: sp 36 + +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d8a 28 .cfa: sp 0 + .ra: lr +STACK CFI 16d8e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f58 30 .cfa: sp 0 + .ra: lr +STACK CFI 16f5a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 1772c d8 .cfa: sp 0 + .ra: lr +STACK CFI 17732 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17800 .cfa: sp 24 + +STACK CFI INIT 17804 44 .cfa: sp 0 + .ra: lr +STACK CFI 17806 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 28ae4 2a0 .cfa: sp 0 + .ra: lr +STACK CFI 28ae8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 28af6 .cfa: sp 4196 + +STACK CFI 28af8 .cfa: sp 4208 + +STACK CFI 28d5c .cfa: sp 36 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28d84 18 .cfa: sp 0 + .ra: lr +STACK CFI 28d86 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28d9c 12 .cfa: sp 0 + .ra: lr +STACK CFI 28d9e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28db0 18 .cfa: sp 0 + .ra: lr +STACK CFI 28db2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28dc8 12 .cfa: sp 0 + .ra: lr +STACK CFI 28dca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28ddc 18 .cfa: sp 0 + .ra: lr +STACK CFI 28dde .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28df4 12 .cfa: sp 0 + .ra: lr +STACK CFI 28df6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28e08 18 .cfa: sp 0 + .ra: lr +STACK CFI 28e0a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28e20 12 .cfa: sp 0 + .ra: lr +STACK CFI 28e22 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28e34 18 .cfa: sp 0 + .ra: lr +STACK CFI 28e36 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28e4c 12 .cfa: sp 0 + .ra: lr +STACK CFI 28e4e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28e60 18 .cfa: sp 0 + .ra: lr +STACK CFI 28e62 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28e78 12 .cfa: sp 0 + .ra: lr +STACK CFI 28e7a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28e8c 18 .cfa: sp 0 + .ra: lr +STACK CFI 28e8e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28ea4 12 .cfa: sp 0 + .ra: lr +STACK CFI 28ea6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28eb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 28eba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28ed0 12 .cfa: sp 0 + .ra: lr +STACK CFI 28ed2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28ee4 18 .cfa: sp 0 + .ra: lr +STACK CFI 28ee6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28efc 12 .cfa: sp 0 + .ra: lr +STACK CFI 28efe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28f10 18 .cfa: sp 0 + .ra: lr +STACK CFI 28f12 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28f28 12 .cfa: sp 0 + .ra: lr +STACK CFI 28f2a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28f3c 20 .cfa: sp 0 + .ra: lr +STACK CFI 28f3e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28f5c 20 .cfa: sp 0 + .ra: lr +STACK CFI 28f5e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28f7c 20 .cfa: sp 0 + .ra: lr +STACK CFI 28f7e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28f9c 20 .cfa: sp 0 + .ra: lr +STACK CFI 28f9e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28fbc 20 .cfa: sp 0 + .ra: lr +STACK CFI 28fbe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28fdc 20 .cfa: sp 0 + .ra: lr +STACK CFI 28fde .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 28ffc 20 .cfa: sp 0 + .ra: lr +STACK CFI 28ffe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2901c 20 .cfa: sp 0 + .ra: lr +STACK CFI 2901e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2903c 20 .cfa: sp 0 + .ra: lr +STACK CFI 2903e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2905c 20 .cfa: sp 0 + .ra: lr +STACK CFI 2905e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 2907c 116 .cfa: sp 0 + .ra: lr +STACK CFI 29080 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r3: .cfa -40 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ad8 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1eca4 12 .cfa: sp 0 + .ra: lr +STACK CFI 1eca6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1ecb8 6c .cfa: sp 0 + .ra: lr +STACK CFI 1ecba .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 1ecc0 .cfa: sp 4112 + +STACK CFI 1ecc6 .cfa: sp 4120 + +STACK CFI 1ed1a .cfa: sp 16 + +STACK CFI INIT 29194 5c .cfa: sp 0 + .ra: lr +STACK CFI 29196 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 291f0 150 .cfa: sp 0 + .ra: lr +STACK CFI 291f4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 291fa .cfa: sp 632 + +STACK CFI 29312 .cfa: sp 28 + +STACK CFI INIT 29340 230 .cfa: sp 0 + .ra: lr +STACK CFI 29344 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 2934a .cfa: sp 632 + +STACK CFI 29514 .cfa: sp 32 + +STACK CFI INIT 29570 30c .cfa: sp 0 + .ra: lr +STACK CFI 29574 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2957a .cfa: sp 648 + +STACK CFI 297f6 .cfa: sp 36 + +STACK CFI INIT 2987c 230 .cfa: sp 0 + .ra: lr +STACK CFI 29880 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 29886 .cfa: sp 632 + +STACK CFI 29a50 .cfa: sp 32 + +STACK CFI INIT 29aac 230 .cfa: sp 0 + .ra: lr +STACK CFI 29ab0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 29ab6 .cfa: sp 632 + +STACK CFI 29c80 .cfa: sp 32 + +STACK CFI INIT 29cdc 230 .cfa: sp 0 + .ra: lr +STACK CFI 29ce0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 29ce6 .cfa: sp 632 + +STACK CFI 29eb0 .cfa: sp 32 + +STACK CFI INIT 29f0c 300 .cfa: sp 0 + .ra: lr +STACK CFI 29f10 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 29f16 .cfa: sp 664 + +STACK CFI 2a196 .cfa: sp 36 + +STACK CFI INIT 2a20c 230 .cfa: sp 0 + .ra: lr +STACK CFI 2a210 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 2a216 .cfa: sp 632 + +STACK CFI 2a3e0 .cfa: sp 32 + +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI da .cfa: sp 20 + +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI e .cfa: sp 264 + +STACK CFI d2 .cfa: sp 36 + +STACK CFI INIT 2a43c 294 .cfa: sp 0 + .ra: lr +STACK CFI 2a440 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2a448 .cfa: sp 640 + +STACK CFI 2a668 .cfa: sp 36 + +STACK CFI INIT 2a6d0 294 .cfa: sp 0 + .ra: lr +STACK CFI 2a6d4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2a6dc .cfa: sp 640 + +STACK CFI 2a8fc .cfa: sp 36 + +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 90 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 14bc8 294 .cfa: sp 0 + .ra: lr +STACK CFI 14bcc .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 14dd0 .cfa: sp 24 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2a964 18 .cfa: sp 0 + .ra: lr +STACK CFI 2a966 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2a97c 12 .cfa: sp 0 + .ra: lr +STACK CFI 2a97e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2a990 18 .cfa: sp 0 + .ra: lr +STACK CFI 2a992 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2a9a8 12 .cfa: sp 0 + .ra: lr +STACK CFI 2a9aa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2a9bc 18 .cfa: sp 0 + .ra: lr +STACK CFI 2a9be .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2a9d4 12 .cfa: sp 0 + .ra: lr +STACK CFI 2a9d6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2a9e8 20 .cfa: sp 0 + .ra: lr +STACK CFI 2a9ea .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2aa08 20 .cfa: sp 0 + .ra: lr +STACK CFI 2aa0a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2aa28 20 .cfa: sp 0 + .ra: lr +STACK CFI 2aa2a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ad8 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2aa48 30 .cfa: sp 0 + .ra: lr +STACK CFI 2aa4a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 2aa4e .cfa: sp 48 + +STACK CFI 2aa76 .cfa: sp 12 + +STACK CFI INIT 2aa78 74 .cfa: sp 0 + .ra: lr +STACK CFI 2aa7a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 b8 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI b6 .cfa: sp 20 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 2aaec 2c .cfa: sp 0 + .ra: lr +STACK CFI 2aaee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 2aaf8 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 2ab02 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 2ab10 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 2aaec 2c .cfa: sp 0 + .ra: lr +STACK CFI 2aaee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 2aaf8 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 2ab02 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 2ab10 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 176da 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI cc .cfa: sp 24 + +STACK CFI INIT 0 1ec .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 16 .cfa: sp 208 + +STACK CFI 1c2 .cfa: sp 32 + +STACK CFI INIT 20330 98 .cfa: sp 0 + .ra: lr +STACK CFI 20332 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 20334 .cfa: sp 80 + +STACK CFI 203c6 .cfa: sp 20 + +STACK CFI INIT 2ab18 a0 .cfa: sp 0 + .ra: lr +STACK CFI 2ab1c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2ab26 .cfa: sp 264 + +STACK CFI 2abb0 .cfa: sp 36 + +STACK CFI INIT 2127c a0 .cfa: sp 0 + .ra: lr +STACK CFI 21280 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2128a .cfa: sp 264 + +STACK CFI 21314 .cfa: sp 36 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1e .cfa: sp 20 + +STACK CFI INIT 2ab18 a0 .cfa: sp 0 + .ra: lr +STACK CFI 2ab1c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2ab26 .cfa: sp 264 + +STACK CFI 2abb0 .cfa: sp 36 + +STACK CFI INIT 2abb8 2fc .cfa: sp 0 + .ra: lr +STACK CFI 2abbc .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 2abc2 .cfa: sp 112 + +STACK CFI 2ae5a .cfa: sp 28 + +STACK CFI INIT 2aeb4 20 .cfa: sp 0 + .ra: lr +STACK CFI 2aeb6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 2aed4 1a .cfa: sp 0 + .ra: lr +STACK CFI 2aed8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 a0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI e .cfa: sp 264 + +STACK CFI 98 .cfa: sp 36 + +STACK CFI INIT 0 8a .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 86 .cfa: sp 24 + +STACK CFI INIT 17ba4 46 .cfa: sp 0 + .ra: lr +STACK CFI 17ba6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17be8 .cfa: sp 20 + +STACK CFI INIT 17bec 2c8 .cfa: sp 0 + .ra: lr +STACK CFI 17bf0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 17bf4 .cfa: sp 256 + +STACK CFI 17e60 .cfa: sp 36 + +STACK CFI INIT 2aef0 f5c .cfa: sp 0 + .ra: lr +STACK CFI 2aef4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2aefa .cfa: sp 240 + +STACK CFI 2be36 .cfa: sp 36 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 20424 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 20450 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 2047c 9e .cfa: sp 0 + .ra: lr +STACK CFI 20480 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 2be4c 98 .cfa: sp 0 + .ra: lr +STACK CFI 2be50 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 2bee0 .cfa: sp 24 + +STACK CFI INIT 2bee4 8e .cfa: sp 0 + .ra: lr +STACK CFI 2bee6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2bf70 .cfa: sp 16 + +STACK CFI INIT 2bf74 858 .cfa: sp 0 + .ra: lr +STACK CFI 2bf78 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2bf88 .cfa: sp 384 + +STACK CFI 2c6ec .cfa: sp 36 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 19212 30 .cfa: sp 0 + .ra: lr +STACK CFI 19214 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 192a0 64 .cfa: sp 0 + .ra: lr +STACK CFI 192a2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 14e5c dc .cfa: sp 0 + .ra: lr +STACK CFI 14e5e .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 14e60 .cfa: sp 40 + +STACK CFI 14f04 .cfa: sp 20 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2c7cc 28 .cfa: sp 0 + .ra: lr +STACK CFI 2c7ce .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2c7f4 28 .cfa: sp 0 + .ra: lr +STACK CFI 2c7f6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2c81c 28 .cfa: sp 0 + .ra: lr +STACK CFI 2c81e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2c844 28 .cfa: sp 0 + .ra: lr +STACK CFI 2c846 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2c86c 28 .cfa: sp 0 + .ra: lr +STACK CFI 2c86e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2c894 28 .cfa: sp 0 + .ra: lr +STACK CFI 2c896 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2c8bc 28 .cfa: sp 0 + .ra: lr +STACK CFI 2c8be .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2c8e4 28 .cfa: sp 0 + .ra: lr +STACK CFI 2c8e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 2c90c 18 .cfa: sp 0 + .ra: lr +STACK CFI 2c910 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 2c924 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2c930 f8 .cfa: sp 0 + .ra: lr +STACK CFI 2c936 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2ca1e .cfa: sp 36 + +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b76 28 .cfa: sp 0 + .ra: lr +STACK CFI 16b78 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16b9e e .cfa: sp 0 + .ra: lr +STACK CFI 16ba0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2ca28 4c .cfa: sp 0 + .ra: lr +STACK CFI 2ca2c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2ca6e .cfa: sp 16 + +STACK CFI INIT 2ca74 12 .cfa: sp 0 + .ra: lr +STACK CFI 2ca76 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2ca88 1c .cfa: sp 0 + .ra: lr +STACK CFI 2ca8c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2caa4 12 .cfa: sp 0 + .ra: lr +STACK CFI 2caa6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 176da 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI cc .cfa: sp 24 + +STACK CFI INIT 192a0 64 .cfa: sp 0 + .ra: lr +STACK CFI 192a2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 2cab8 40 .cfa: sp 0 + .ra: lr +STACK CFI 2caba .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19212 30 .cfa: sp 0 + .ra: lr +STACK CFI 19214 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f58 30 .cfa: sp 0 + .ra: lr +STACK CFI 16f5a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16dec 18 .cfa: sp 0 + .ra: lr +STACK CFI 16dee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2caf8 34 .cfa: sp 0 + .ra: lr +STACK CFI 2cafc .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 2cb24 .cfa: sp 8 + +STACK CFI INIT 17a18 6c .cfa: sp 0 + .ra: lr +STACK CFI 17a1e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17a26 .cfa: sp 56 + +STACK CFI 17a7a .cfa: sp 24 + +STACK CFI INIT 2cb2c 42 .cfa: sp 0 + .ra: lr +STACK CFI 2cb2e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2cb6c .cfa: sp 16 + +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 2cb70 4c .cfa: sp 0 + .ra: lr +STACK CFI 2cb72 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 2cbbc 3e .cfa: sp 0 + .ra: lr +STACK CFI 2cbbe .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 2cbfa 32 .cfa: sp 0 + .ra: lr +STACK CFI 2cbfc .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 2cc2c 30 .cfa: sp 0 + .ra: lr +STACK CFI 2cc30 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2cc5c 12 .cfa: sp 0 + .ra: lr +STACK CFI 2cc5e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2cc70 90 .cfa: sp 0 + .ra: lr +STACK CFI 2cc74 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2ccfa .cfa: sp 16 + +STACK CFI INIT 2cd00 12 .cfa: sp 0 + .ra: lr +STACK CFI 2cd02 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2cd12 c6 .cfa: sp 0 + .ra: lr +STACK CFI 2cd16 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 2cd1a .cfa: sp 88 + +STACK CFI 2cdd4 .cfa: sp 28 + +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 175b2 98 .cfa: sp 0 + .ra: lr +STACK CFI 175b6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17646 .cfa: sp 28 + +STACK CFI INIT 0 8a .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 86 .cfa: sp 24 + +STACK CFI INIT 17ba4 46 .cfa: sp 0 + .ra: lr +STACK CFI 17ba6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17be8 .cfa: sp 20 + +STACK CFI INIT 2cdd8 148 .cfa: sp 0 + .ra: lr +STACK CFI 2cddc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2cde6 .cfa: sp 312 + +STACK CFI 2cef8 .cfa: sp 36 + +STACK CFI INIT 2cf20 158 .cfa: sp 0 + .ra: lr +STACK CFI 2cf24 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2cf2e .cfa: sp 328 + +STACK CFI 2d04e .cfa: sp 36 + +STACK CFI INIT 2d078 148 .cfa: sp 0 + .ra: lr +STACK CFI 2d07c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2d086 .cfa: sp 312 + +STACK CFI 2d198 .cfa: sp 36 + +STACK CFI INIT 2d1c0 158 .cfa: sp 0 + .ra: lr +STACK CFI 2d1c4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2d1ce .cfa: sp 328 + +STACK CFI 2d2ee .cfa: sp 36 + +STACK CFI INIT 2d318 148 .cfa: sp 0 + .ra: lr +STACK CFI 2d31c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2d326 .cfa: sp 312 + +STACK CFI 2d438 .cfa: sp 36 + +STACK CFI INIT 2d460 158 .cfa: sp 0 + .ra: lr +STACK CFI 2d464 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2d46e .cfa: sp 328 + +STACK CFI 2d58e .cfa: sp 36 + +STACK CFI INIT 2d5b8 148 .cfa: sp 0 + .ra: lr +STACK CFI 2d5bc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2d5c6 .cfa: sp 312 + +STACK CFI 2d6d8 .cfa: sp 36 + +STACK CFI INIT 2d700 158 .cfa: sp 0 + .ra: lr +STACK CFI 2d704 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2d70e .cfa: sp 328 + +STACK CFI 2d82e .cfa: sp 36 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 2d858 28 .cfa: sp 0 + .ra: lr +STACK CFI 2d85c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d880 1c .cfa: sp 0 + .ra: lr +STACK CFI 2d884 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d89c 12 .cfa: sp 0 + .ra: lr +STACK CFI 2d89e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d8b0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2d8b4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d8cc 12 .cfa: sp 0 + .ra: lr +STACK CFI 2d8ce .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d8e0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2d8e4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d8fc 12 .cfa: sp 0 + .ra: lr +STACK CFI 2d8fe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d910 1c .cfa: sp 0 + .ra: lr +STACK CFI 2d914 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d92c 12 .cfa: sp 0 + .ra: lr +STACK CFI 2d92e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d940 28 .cfa: sp 0 + .ra: lr +STACK CFI 2d944 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d968 1c .cfa: sp 0 + .ra: lr +STACK CFI 2d96c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d984 12 .cfa: sp 0 + .ra: lr +STACK CFI 2d986 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d998 1c .cfa: sp 0 + .ra: lr +STACK CFI 2d99c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d9b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 2d9b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d9c8 1c .cfa: sp 0 + .ra: lr +STACK CFI 2d9cc .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d9e4 12 .cfa: sp 0 + .ra: lr +STACK CFI 2d9e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2d9f8 1c .cfa: sp 0 + .ra: lr +STACK CFI 2d9fc .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2da14 12 .cfa: sp 0 + .ra: lr +STACK CFI 2da16 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17ab0 38 .cfa: sp 0 + .ra: lr +STACK CFI 17ab2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17ae0 .cfa: sp 16 + +STACK CFI INIT 0 1a0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI e .cfa: sp 248 + +STACK CFI 17e .cfa: sp 36 + +STACK CFI INIT 2da28 180 .cfa: sp 0 + .ra: lr +STACK CFI 2da2c .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 2da30 .cfa: sp 112 + +STACK CFI 2db8c .cfa: sp 32 + +STACK CFI INIT 2dba8 178 .cfa: sp 0 + .ra: lr +STACK CFI 2dbac .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 2dbb6 .cfa: sp 112 + +STACK CFI 2dcf4 .cfa: sp 28 + +STACK CFI INIT 2dd20 1c4 .cfa: sp 0 + .ra: lr +STACK CFI 2dd26 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2dd2c .cfa: sp 520 + +STACK CFI 2deb4 .cfa: sp 36 + +STACK CFI INIT 2dee4 274 .cfa: sp 0 + .ra: lr +STACK CFI 2deea .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2def6 .cfa: sp 584 + +STACK CFI 2e116 .cfa: sp 36 + +STACK CFI INIT 2e158 2a8 .cfa: sp 0 + .ra: lr +STACK CFI 2e15e .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2e168 .cfa: sp 584 + +STACK CFI 2e3b6 .cfa: sp 36 + +STACK CFI INIT 2e400 390 .cfa: sp 0 + .ra: lr +STACK CFI 2e406 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2e410 .cfa: sp 592 + +STACK CFI 2e73e .cfa: sp 36 + +STACK CFI INIT 2dba8 178 .cfa: sp 0 + .ra: lr +STACK CFI 2dbac .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 2dbb6 .cfa: sp 112 + +STACK CFI 2dcf4 .cfa: sp 28 + +STACK CFI INIT 2e790 1c4 .cfa: sp 0 + .ra: lr +STACK CFI 2e796 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2e79c .cfa: sp 520 + +STACK CFI 2e924 .cfa: sp 36 + +STACK CFI INIT 2e954 274 .cfa: sp 0 + .ra: lr +STACK CFI 2e95a .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2e966 .cfa: sp 584 + +STACK CFI 2eb86 .cfa: sp 36 + +STACK CFI INIT 2ebc8 2a8 .cfa: sp 0 + .ra: lr +STACK CFI 2ebce .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2ebd8 .cfa: sp 584 + +STACK CFI 2ee26 .cfa: sp 36 + +STACK CFI INIT 2ee70 390 .cfa: sp 0 + .ra: lr +STACK CFI 2ee76 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2ee80 .cfa: sp 592 + +STACK CFI 2f1ae .cfa: sp 36 + +STACK CFI INIT 14f38 84 .cfa: sp 0 + .ra: lr +STACK CFI 14f3a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f200 18 .cfa: sp 0 + .ra: lr +STACK CFI 2f202 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f218 12 .cfa: sp 0 + .ra: lr +STACK CFI 2f21a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f22c 18 .cfa: sp 0 + .ra: lr +STACK CFI 2f22e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f244 12 .cfa: sp 0 + .ra: lr +STACK CFI 2f246 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f258 18 .cfa: sp 0 + .ra: lr +STACK CFI 2f25a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f270 12 .cfa: sp 0 + .ra: lr +STACK CFI 2f272 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f284 18 .cfa: sp 0 + .ra: lr +STACK CFI 2f286 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f29c 12 .cfa: sp 0 + .ra: lr +STACK CFI 2f29e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f2b0 18 .cfa: sp 0 + .ra: lr +STACK CFI 2f2b2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f2c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 2f2ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f2dc 18 .cfa: sp 0 + .ra: lr +STACK CFI 2f2de .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f2f4 12 .cfa: sp 0 + .ra: lr +STACK CFI 2f2f6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f308 18 .cfa: sp 0 + .ra: lr +STACK CFI 2f30a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f320 12 .cfa: sp 0 + .ra: lr +STACK CFI 2f322 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f334 18 .cfa: sp 0 + .ra: lr +STACK CFI 2f336 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f34c 12 .cfa: sp 0 + .ra: lr +STACK CFI 2f34e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f360 18 .cfa: sp 0 + .ra: lr +STACK CFI 2f362 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f378 12 .cfa: sp 0 + .ra: lr +STACK CFI 2f37a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f38c 18 .cfa: sp 0 + .ra: lr +STACK CFI 2f38e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f3a4 12 .cfa: sp 0 + .ra: lr +STACK CFI 2f3a6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f3b8 20 .cfa: sp 0 + .ra: lr +STACK CFI 2f3ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f3d8 20 .cfa: sp 0 + .ra: lr +STACK CFI 2f3da .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f3f8 20 .cfa: sp 0 + .ra: lr +STACK CFI 2f3fa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f418 20 .cfa: sp 0 + .ra: lr +STACK CFI 2f41a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f438 20 .cfa: sp 0 + .ra: lr +STACK CFI 2f43a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f458 20 .cfa: sp 0 + .ra: lr +STACK CFI 2f45a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f478 20 .cfa: sp 0 + .ra: lr +STACK CFI 2f47a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f498 20 .cfa: sp 0 + .ra: lr +STACK CFI 2f49a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f4b8 20 .cfa: sp 0 + .ra: lr +STACK CFI 2f4ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2f4d8 20 .cfa: sp 0 + .ra: lr +STACK CFI 2f4da .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ad8 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 b8 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI b6 .cfa: sp 20 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 20330 98 .cfa: sp 0 + .ra: lr +STACK CFI 20332 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 20334 .cfa: sp 80 + +STACK CFI 203c6 .cfa: sp 20 + +STACK CFI INIT 2127c a0 .cfa: sp 0 + .ra: lr +STACK CFI 21280 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2128a .cfa: sp 264 + +STACK CFI 21314 .cfa: sp 36 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1e .cfa: sp 20 + +STACK CFI INIT 2f4f8 a4 .cfa: sp 0 + .ra: lr +STACK CFI 2f4fc .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 2f508 .cfa: sp 56 + +STACK CFI 2f586 .cfa: sp 32 + +STACK CFI INIT 2f59c 328 .cfa: sp 0 + .ra: lr +STACK CFI 2f5a0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 2f5a4 .cfa: sp 56 + +STACK CFI 2f85c .cfa: sp 32 + +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI e .cfa: sp 240 + +STACK CFI d8 .cfa: sp 28 + +STACK CFI INIT 18320 74 .cfa: sp 0 + .ra: lr +STACK CFI 18324 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 18328 .cfa: sp 96 + +STACK CFI 1838c .cfa: sp 32 + +STACK CFI INIT 2f8c4 c4 .cfa: sp 0 + .ra: lr +STACK CFI 2f8c8 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 2f8d8 .cfa: sp 64 + +STACK CFI 2f974 .cfa: sp 32 + +STACK CFI INIT 2f988 558 .cfa: sp 0 + .ra: lr +STACK CFI 2f98c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2f992 .cfa: sp 104 + +STACK CFI 2fdf0 .cfa: sp 36 + +STACK CFI INIT 2fee0 280 .cfa: sp 0 + .ra: lr +STACK CFI 2fee4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2fef4 .cfa: sp 112 + +STACK CFI 30114 .cfa: sp 36 + +STACK CFI INIT 1e020 6c .cfa: sp 0 + .ra: lr +STACK CFI 1e024 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 1e02e .cfa: sp 184 + +STACK CFI 1e07e .cfa: sp 24 + +STACK CFI INIT 30160 7c .cfa: sp 0 + .ra: lr +STACK CFI 30164 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 30168 .cfa: sp 96 + +STACK CFI 301d2 .cfa: sp 32 + +STACK CFI INIT 301dc 338 .cfa: sp 0 + .ra: lr +STACK CFI 301e0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 301f6 .cfa: sp 104 + +STACK CFI 30486 .cfa: sp 36 + +STACK CFI INIT 30514 380 .cfa: sp 0 + .ra: lr +STACK CFI 30518 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3052e .cfa: sp 128 + +STACK CFI 30806 .cfa: sp 36 + +STACK CFI INIT 18ae4 6c .cfa: sp 0 + .ra: lr +STACK CFI 18ae8 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 18af2 .cfa: sp 184 + +STACK CFI 18b42 .cfa: sp 24 + +STACK CFI INIT 30894 64 .cfa: sp 0 + .ra: lr +STACK CFI 30898 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3089c .cfa: sp 96 + +STACK CFI 308f0 .cfa: sp 32 + +STACK CFI INIT 308f8 74 .cfa: sp 0 + .ra: lr +STACK CFI 308fc .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 30900 .cfa: sp 96 + +STACK CFI 30964 .cfa: sp 32 + +STACK CFI INIT 3096c 78 .cfa: sp 0 + .ra: lr +STACK CFI 30970 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 30974 .cfa: sp 96 + +STACK CFI 309da .cfa: sp 32 + +STACK CFI INIT 309e4 290 .cfa: sp 0 + .ra: lr +STACK CFI 309e8 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 309ec .cfa: sp 72 + +STACK CFI 30c10 .cfa: sp 28 + +STACK CFI INIT 30c74 48 .cfa: sp 0 + .ra: lr +STACK CFI 30c76 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 30c82 .cfa: sp 184 + +STACK CFI 30cb6 .cfa: sp 20 + +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 8 .cfa: sp 96 + +STACK CFI 6c .cfa: sp 32 + +STACK CFI INIT 30cbc 74 .cfa: sp 0 + .ra: lr +STACK CFI 30cc0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 30cc4 .cfa: sp 96 + +STACK CFI 30d28 .cfa: sp 32 + +STACK CFI INIT 30d30 30c .cfa: sp 0 + .ra: lr +STACK CFI 30d34 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 30d38 .cfa: sp 80 + +STACK CFI 30fe4 .cfa: sp 36 + +STACK CFI INIT 3103c 26c .cfa: sp 0 + .ra: lr +STACK CFI 31040 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 31046 .cfa: sp 80 + +STACK CFI 3125a .cfa: sp 36 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 90 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 14fbc 294 .cfa: sp 0 + .ra: lr +STACK CFI 14fc0 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 151c4 .cfa: sp 24 + +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 2c924 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 312a8 2e .cfa: sp 0 + .ra: lr +STACK CFI 312aa .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 312d4 .cfa: sp 16 + +STACK CFI INIT 312d6 3e .cfa: sp 0 + .ra: lr +STACK CFI 312d8 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 312f6 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI 312fa .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3130c .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI INIT 31314 d6 .cfa: sp 0 + .ra: lr +STACK CFI 31318 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 313e6 .cfa: sp 32 + +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 2ca28 4c .cfa: sp 0 + .ra: lr +STACK CFI 2ca2c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2ca6e .cfa: sp 16 + +STACK CFI INIT 2ca74 12 .cfa: sp 0 + .ra: lr +STACK CFI 2ca76 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 313ec 24 .cfa: sp 0 + .ra: lr +STACK CFI 313f0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 31410 12 .cfa: sp 0 + .ra: lr +STACK CFI 31412 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 31424 1c .cfa: sp 0 + .ra: lr +STACK CFI 31428 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 31440 12 .cfa: sp 0 + .ra: lr +STACK CFI 31442 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 1772c d8 .cfa: sp 0 + .ra: lr +STACK CFI 17732 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17800 .cfa: sp 24 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 31452 70 .cfa: sp 0 + .ra: lr +STACK CFI 31456 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 314be .cfa: sp 32 + +STACK CFI INIT 314c4 a8 .cfa: sp 0 + .ra: lr +STACK CFI 314c8 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 31562 .cfa: sp 28 + +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 0 32 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 2e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 3156c 34 .cfa: sp 0 + .ra: lr +STACK CFI 3156e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3159e .cfa: sp 12 + +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 315a0 24 .cfa: sp 0 + .ra: lr +STACK CFI 315a2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 2cbfa 32 .cfa: sp 0 + .ra: lr +STACK CFI 2cbfc .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 2cc2c 30 .cfa: sp 0 + .ra: lr +STACK CFI 2cc30 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2cc5c 12 .cfa: sp 0 + .ra: lr +STACK CFI 2cc5e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 2cc70 90 .cfa: sp 0 + .ra: lr +STACK CFI 2cc74 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2ccfa .cfa: sp 16 + +STACK CFI INIT 2cd00 12 .cfa: sp 0 + .ra: lr +STACK CFI 2cd02 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 203f0 34 .cfa: sp 0 + .ra: lr +STACK CFI 203f2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 315c4 68 .cfa: sp 0 + .ra: lr +STACK CFI 315c6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 3162c 170 .cfa: sp 0 + .ra: lr +STACK CFI 31630 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 31632 .cfa: sp 56 + +STACK CFI 31782 .cfa: sp 36 + +STACK CFI 31786 .cfa: sp 56 + +STACK CFI INIT 3179c 2e .cfa: sp 0 + .ra: lr +STACK CFI INIT 20424 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 20450 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 2047c 9e .cfa: sp 0 + .ra: lr +STACK CFI 20480 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 317ca 6e .cfa: sp 0 + .ra: lr +STACK CFI 317ce .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 31838 78 .cfa: sp 0 + .ra: lr +STACK CFI 3183c .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 318ac .cfa: sp 24 + +STACK CFI INIT 318b0 174 .cfa: sp 0 + .ra: lr +STACK CFI 318b4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 318bc .cfa: sp 56 + +STACK CFI 31a20 .cfa: sp 36 + +STACK CFI INIT 31a24 ac .cfa: sp 0 + .ra: lr +STACK CFI 31a2a .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 31a3a .cfa: sp 80 + +STACK CFI 31ac6 .cfa: sp 28 + +STACK CFI INIT 31ad0 a4 .cfa: sp 0 + .ra: lr +STACK CFI 31ad4 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 31b70 .cfa: sp 28 + +STACK CFI INIT 31b74 58 .cfa: sp 0 + .ra: lr +STACK CFI 31b76 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 31bca .cfa: sp 20 + +STACK CFI INIT 31bcc 5c .cfa: sp 0 + .ra: lr +STACK CFI 31bce .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 31c26 .cfa: sp 20 + +STACK CFI INIT 31c28 18c .cfa: sp 0 + .ra: lr +STACK CFI 31c2c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 31c3a .cfa: sp 152 + +STACK CFI 31da2 .cfa: sp 36 + +STACK CFI INIT 31db4 dc .cfa: sp 0 + .ra: lr +STACK CFI 31db8 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 31dc4 .cfa: sp 96 + +STACK CFI 31e84 .cfa: sp 24 + +STACK CFI INIT 31e90 30c .cfa: sp 0 + .ra: lr +STACK CFI 31e94 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 31e9e .cfa: sp 232 + +STACK CFI 3217e .cfa: sp 36 + +STACK CFI INIT 3219c 40 .cfa: sp 0 + .ra: lr +STACK CFI 3219e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 321dc 3c .cfa: sp 0 + .ra: lr +STACK CFI 321de .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 32218 5c .cfa: sp 0 + .ra: lr +STACK CFI 3221a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3221e .cfa: sp 32 + +STACK CFI 32264 .cfa: sp 12 + +STACK CFI INIT 32274 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3227c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 32284 2c .cfa: sp 0 + .ra: lr +STACK CFI 32286 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 322b0 54 .cfa: sp 0 + .ra: lr +STACK CFI 322b4 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 322fc .cfa: sp 24 + +STACK CFI INIT 32304 2c .cfa: sp 0 + .ra: lr +STACK CFI 32306 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 32326 .cfa: sp 4 + +STACK CFI INIT 32330 b4 .cfa: sp 0 + .ra: lr +STACK CFI 32336 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 32340 .cfa: sp 8228 + +STACK CFI 32342 .cfa: sp 8256 + +STACK CFI 323ce .cfa: sp 36 + +STACK CFI INIT 323e4 114 .cfa: sp 0 + .ra: lr +STACK CFI 323e8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 323ec .cfa: sp 88 + +STACK CFI 324d6 .cfa: sp 36 + +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 324f8 22 .cfa: sp 0 + .ra: lr +STACK CFI 324fa .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 1772c d8 .cfa: sp 0 + .ra: lr +STACK CFI 17732 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17800 .cfa: sp 24 + +STACK CFI INIT 0 1f0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 16 .cfa: sp 208 + +STACK CFI 1c6 .cfa: sp 32 + +STACK CFI INIT 3251a 12 .cfa: sp 0 + .ra: lr +STACK CFI 3251c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 d8 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI d4 .cfa: sp 28 + +STACK CFI INIT 0 2d4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 256 + +STACK CFI 27e .cfa: sp 36 + +STACK CFI INIT 3252c 1a .cfa: sp 0 + .ra: lr +STACK CFI 3252e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 32548 14 .cfa: sp 0 + .ra: lr +STACK CFI 3254a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3255c 14 .cfa: sp 0 + .ra: lr +STACK CFI 3255e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 32570 1c4 .cfa: sp 0 + .ra: lr +STACK CFI 32574 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 32584 .cfa: sp 96 + +STACK CFI 326f2 .cfa: sp 36 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 32734 18 .cfa: sp 0 + .ra: lr +STACK CFI 32736 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3274c 12 .cfa: sp 0 + .ra: lr +STACK CFI 3274e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 32760 18 .cfa: sp 0 + .ra: lr +STACK CFI 32762 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 32778 12 .cfa: sp 0 + .ra: lr +STACK CFI 3277a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3278c 18 .cfa: sp 0 + .ra: lr +STACK CFI 3278e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 327a4 12 .cfa: sp 0 + .ra: lr +STACK CFI 327a6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 327b8 18 .cfa: sp 0 + .ra: lr +STACK CFI 327ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 327d0 12 .cfa: sp 0 + .ra: lr +STACK CFI 327d2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 327e4 18 .cfa: sp 0 + .ra: lr +STACK CFI 327e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 327fc 12 .cfa: sp 0 + .ra: lr +STACK CFI 327fe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 32810 18 .cfa: sp 0 + .ra: lr +STACK CFI 32812 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 32828 12 .cfa: sp 0 + .ra: lr +STACK CFI 3282a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3283c 20 .cfa: sp 0 + .ra: lr +STACK CFI 3283e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3285c 20 .cfa: sp 0 + .ra: lr +STACK CFI 3285e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3287c 20 .cfa: sp 0 + .ra: lr +STACK CFI 3287e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3289c 20 .cfa: sp 0 + .ra: lr +STACK CFI 3289e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 328bc 20 .cfa: sp 0 + .ra: lr +STACK CFI 328be .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 328dc 20 .cfa: sp 0 + .ra: lr +STACK CFI 328de .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 328fc a2 .cfa: sp 0 + .ra: lr +STACK CFI 32900 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 3299e 30 .cfa: sp 0 + .ra: lr +STACK CFI 329a0 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 329d0 24 .cfa: sp 0 + .ra: lr +STACK CFI 329d2 .cfa: sp 24 + .ra: .cfa -4 + ^ +STACK CFI 329ec .cfa: sp 4 + +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 329f4 e8 .cfa: sp 0 + .ra: lr +STACK CFI 329fa .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 32a02 .cfa: sp 104 + +STACK CFI 32abe .cfa: sp 28 + +STACK CFI INIT 32adc 13c .cfa: sp 0 + .ra: lr +STACK CFI 32ae0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 32ae4 .cfa: sp 104 + +STACK CFI 32bea .cfa: sp 28 + +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 32c18 72 .cfa: sp 0 + .ra: lr +STACK CFI 32c1c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 b8 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI b6 .cfa: sp 20 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 32c8c 2c .cfa: sp 0 + .ra: lr +STACK CFI 32c8e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 32c98 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 32ca2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 32cb0 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 20330 98 .cfa: sp 0 + .ra: lr +STACK CFI 20332 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 20334 .cfa: sp 80 + +STACK CFI 203c6 .cfa: sp 20 + +STACK CFI INIT 2127c a0 .cfa: sp 0 + .ra: lr +STACK CFI 21280 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2128a .cfa: sp 264 + +STACK CFI 21314 .cfa: sp 36 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1e .cfa: sp 20 + +STACK CFI INIT 32cb8 ac .cfa: sp 0 + .ra: lr +STACK CFI 32cbc .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 32cc4 .cfa: sp 64 + +STACK CFI 32d4c .cfa: sp 20 + +STACK CFI INIT 32d64 5c .cfa: sp 0 + .ra: lr +STACK CFI 32d68 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 32dc0 32c .cfa: sp 0 + .ra: lr +STACK CFI 32dc4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 32dc8 .cfa: sp 336 + +STACK CFI 3308e .cfa: sp 36 + +STACK CFI INIT 330ec fc .cfa: sp 0 + .ra: lr +STACK CFI 330f0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 330f4 .cfa: sp 120 + +STACK CFI 331ca .cfa: sp 28 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 90 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 15250 1a4 .cfa: sp 0 + .ra: lr +STACK CFI 15254 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 15256 .cfa: sp 48 + +STACK CFI 15398 .cfa: sp 28 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 331e8 18 .cfa: sp 0 + .ra: lr +STACK CFI 331ea .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33200 12 .cfa: sp 0 + .ra: lr +STACK CFI 33202 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33214 18 .cfa: sp 0 + .ra: lr +STACK CFI 33216 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3322c 12 .cfa: sp 0 + .ra: lr +STACK CFI 3322e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33240 18 .cfa: sp 0 + .ra: lr +STACK CFI 33242 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33258 12 .cfa: sp 0 + .ra: lr +STACK CFI 3325a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3326c 18 .cfa: sp 0 + .ra: lr +STACK CFI 3326e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33284 12 .cfa: sp 0 + .ra: lr +STACK CFI 33286 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33298 18 .cfa: sp 0 + .ra: lr +STACK CFI 3329a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 332b0 12 .cfa: sp 0 + .ra: lr +STACK CFI 332b2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 332c4 18 .cfa: sp 0 + .ra: lr +STACK CFI 332c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 332dc 12 .cfa: sp 0 + .ra: lr +STACK CFI 332de .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 332f0 18 .cfa: sp 0 + .ra: lr +STACK CFI 332f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33308 12 .cfa: sp 0 + .ra: lr +STACK CFI 3330a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3331a 66 .cfa: sp 0 + .ra: lr +STACK CFI 3331e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 33380 5e .cfa: sp 0 + .ra: lr +STACK CFI 33384 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 333e0 20 .cfa: sp 0 + .ra: lr +STACK CFI 333e2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33400 20 .cfa: sp 0 + .ra: lr +STACK CFI 33402 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33420 20 .cfa: sp 0 + .ra: lr +STACK CFI 33422 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33440 20 .cfa: sp 0 + .ra: lr +STACK CFI 33442 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33460 20 .cfa: sp 0 + .ra: lr +STACK CFI 33462 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 33480 20 .cfa: sp 0 + .ra: lr +STACK CFI 33482 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 334a0 20 .cfa: sp 0 + .ra: lr +STACK CFI 334a2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ad8 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 334c0 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b76 28 .cfa: sp 0 + .ra: lr +STACK CFI 16b78 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16b9e e .cfa: sp 0 + .ra: lr +STACK CFI 16ba0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 334d6 2a .cfa: sp 0 + .ra: lr +STACK CFI 334d8 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 33500 14 .cfa: sp 0 + .ra: lr +STACK CFI 33502 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 33514 6e .cfa: sp 0 + .ra: lr +STACK CFI 33518 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 33524 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 r9: r9 +STACK CFI 33528 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 33582 24 .cfa: sp 0 + .ra: lr +STACK CFI 33584 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 335a6 12 .cfa: sp 0 + .ra: lr +STACK CFI 335a8 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 335b8 6a .cfa: sp 0 + .ra: lr +STACK CFI 335bc .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 335c8 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 r9: r9 +STACK CFI 335cc .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 33622 12 .cfa: sp 0 + .ra: lr +STACK CFI 33624 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 33634 24 .cfa: sp 0 + .ra: lr +STACK CFI 33636 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 33658 12 .cfa: sp 0 + .ra: lr +STACK CFI 3365a .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 3366a 68 .cfa: sp 0 + .ra: lr +STACK CFI 3366e .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3367a .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 r9: r9 +STACK CFI 3367e .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 336d2 24 .cfa: sp 0 + .ra: lr +STACK CFI 336d4 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 336f6 50 .cfa: sp 0 + .ra: lr +STACK CFI 336fa .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 16db4 38 .cfa: sp 0 + .ra: lr +STACK CFI 16db6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 16de6 .cfa: sp 8 + +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 175b2 98 .cfa: sp 0 + .ra: lr +STACK CFI 175b6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17646 .cfa: sp 28 + +STACK CFI INIT 176da 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 13c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 16 .cfa: sp 64 + +STACK CFI 132 .cfa: sp 32 + +STACK CFI INIT 20330 98 .cfa: sp 0 + .ra: lr +STACK CFI 20332 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 20334 .cfa: sp 80 + +STACK CFI 203c6 .cfa: sp 20 + +STACK CFI INIT 2127c a0 .cfa: sp 0 + .ra: lr +STACK CFI 21280 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2128a .cfa: sp 264 + +STACK CFI 21314 .cfa: sp 36 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1e .cfa: sp 20 + +STACK CFI INIT 33748 49c .cfa: sp 0 + .ra: lr +STACK CFI 3374e .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 33758 .cfa: sp 312 + +STACK CFI 33b42 .cfa: sp 36 + +STACK CFI INIT 33be4 7a0 .cfa: sp 0 + .ra: lr +STACK CFI 33bec .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 33bf8 .cfa: sp 704 + +STACK CFI 34262 .cfa: sp 36 + +STACK CFI INIT 34384 544 .cfa: sp 0 + .ra: lr +STACK CFI 34388 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3439a .cfa: sp 160 + +STACK CFI 347ee .cfa: sp 32 + +STACK CFI INIT 348c8 498 .cfa: sp 0 + .ra: lr +STACK CFI 348cc .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 348de .cfa: sp 216 + +STACK CFI 34cae .cfa: sp 28 + +STACK CFI INIT 34d60 1a4 .cfa: sp 0 + .ra: lr +STACK CFI 34d64 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 34d6e .cfa: sp 104 + +STACK CFI 34ec4 .cfa: sp 36 + +STACK CFI INIT 17a84 2c .cfa: sp 0 + .ra: lr +STACK CFI 17a86 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17aae .cfa: sp 16 + +STACK CFI INIT 17ab0 38 .cfa: sp 0 + .ra: lr +STACK CFI 17ab2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17ae0 .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 17ae8 2c .cfa: sp 0 + .ra: lr +STACK CFI 17aea .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17b12 .cfa: sp 16 + +STACK CFI INIT 1e020 6c .cfa: sp 0 + .ra: lr +STACK CFI 1e024 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 1e02e .cfa: sp 184 + +STACK CFI 1e07e .cfa: sp 24 + +STACK CFI INIT 34f04 104 .cfa: sp 0 + .ra: lr +STACK CFI 34f08 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 34f14 .cfa: sp 112 + +STACK CFI 34fe8 .cfa: sp 28 + +STACK CFI INIT 35008 478 .cfa: sp 0 + .ra: lr +STACK CFI 3500c .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3501c .cfa: sp 32800 + +STACK CFI 3501e .cfa: sp 32856 + +STACK CFI 353e0 .cfa: sp 32 + +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI e .cfa: sp 240 + +STACK CFI d8 .cfa: sp 28 + +STACK CFI INIT 18320 74 .cfa: sp 0 + .ra: lr +STACK CFI 18324 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 18328 .cfa: sp 96 + +STACK CFI 1838c .cfa: sp 32 + +STACK CFI INIT 35480 4a8 .cfa: sp 0 + .ra: lr +STACK CFI 35484 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3548c .cfa: sp 928 + +STACK CFI 3589e .cfa: sp 36 + +STACK CFI INIT 191b0 62 .cfa: sp 0 + .ra: lr +STACK CFI 191b2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 19210 .cfa: sp 20 + +STACK CFI INIT 19212 30 .cfa: sp 0 + .ra: lr +STACK CFI 19214 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 192a0 64 .cfa: sp 0 + .ra: lr +STACK CFI 192a2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 17b14 90 .cfa: sp 0 + .ra: lr +STACK CFI 17b1a .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17ba0 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 153f4 1dc .cfa: sp 0 + .ra: lr +STACK CFI 153f8 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 15566 .cfa: sp 24 + +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 35928 20 .cfa: sp 0 + .ra: lr +STACK CFI 3592a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 35948 20 .cfa: sp 0 + .ra: lr +STACK CFI 3594a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 35968 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 35974 14 .cfa: sp 0 + .ra: lr +STACK CFI 35976 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 35988 10 .cfa: sp 0 + .ra: lr +STACK CFI 3598a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 35998 28 .cfa: sp 0 + .ra: lr +STACK CFI 3599a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 359c0 22 .cfa: sp 0 + .ra: lr +STACK CFI 359c2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 359e2 66 .cfa: sp 0 + .ra: lr +STACK CFI 359e6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 35a44 .cfa: sp 24 + +STACK CFI INIT 35a48 28 .cfa: sp 0 + .ra: lr +STACK CFI 35a4a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35a6e .cfa: sp 8 + +STACK CFI INIT 35a70 1a .cfa: sp 0 + .ra: lr +STACK CFI 35a72 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 35a86 .cfa: sp 4 + +STACK CFI INIT 35a8a 44 .cfa: sp 0 + .ra: lr +STACK CFI 35a8c .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 35a90 .cfa: sp 40 + +STACK CFI 35acc .cfa: sp 12 + +STACK CFI INIT 35ace 12 .cfa: sp 0 + .ra: lr +STACK CFI 35ad0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 35adc .cfa: sp 4 + +STACK CFI INIT 35ae0 80 .cfa: sp 0 + .ra: lr +STACK CFI 35ae2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 35ae8 .cfa: sp 40 + +STACK CFI 35b5e .cfa: sp 20 + +STACK CFI INIT 35b60 10 .cfa: sp 0 + .ra: lr +STACK CFI 35b62 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 35b70 14 .cfa: sp 0 + .ra: lr +STACK CFI 35b72 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 35b84 1e .cfa: sp 0 + .ra: lr +STACK CFI 35b86 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 35ba2 20 .cfa: sp 0 + .ra: lr +STACK CFI 35ba4 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 35bc2 20 .cfa: sp 0 + .ra: lr +STACK CFI 35bc4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 35be2 44 .cfa: sp 0 + .ra: lr +STACK CFI 35be4 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 35c26 3a .cfa: sp 0 + .ra: lr +STACK CFI 35c28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 35c60 5a .cfa: sp 0 + .ra: lr +STACK CFI 35c66 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 35cba 1c .cfa: sp 0 + .ra: lr +STACK CFI 35cbc .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35cd4 .cfa: sp 8 + +STACK CFI INIT 35cd6 1a .cfa: sp 0 + .ra: lr +STACK CFI 35cd8 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35cee .cfa: sp 8 + +STACK CFI INIT 35cf0 1c .cfa: sp 0 + .ra: lr +STACK CFI 35cf2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35d0a .cfa: sp 8 + +STACK CFI INIT 35d0c 18 .cfa: sp 0 + .ra: lr +STACK CFI 35d0e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35d22 .cfa: sp 8 + +STACK CFI INIT 35d24 1a .cfa: sp 0 + .ra: lr +STACK CFI 35d26 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35d3c .cfa: sp 8 + +STACK CFI INIT 35d3e 1c .cfa: sp 0 + .ra: lr +STACK CFI 35d40 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35d58 .cfa: sp 8 + +STACK CFI INIT 35d5a 18 .cfa: sp 0 + .ra: lr +STACK CFI 35d5c .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35d70 .cfa: sp 8 + +STACK CFI INIT 35d72 1a .cfa: sp 0 + .ra: lr +STACK CFI 35d74 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35d8a .cfa: sp 8 + +STACK CFI INIT 35d8c 1c .cfa: sp 0 + .ra: lr +STACK CFI 35d8e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35da6 .cfa: sp 8 + +STACK CFI INIT 35da8 18 .cfa: sp 0 + .ra: lr +STACK CFI 35daa .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 35dbe .cfa: sp 8 + +STACK CFI INIT 35dc0 20 .cfa: sp 0 + .ra: lr +STACK CFI 35dc2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 35de0 1a .cfa: sp 0 + .ra: lr +STACK CFI INIT 35dfc b4 .cfa: sp 0 + .ra: lr +STACK CFI 35dfe .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 35e0c .cfa: sp 48 + +STACK CFI 35ea8 .cfa: sp 20 + +STACK CFI INIT 35eb0 ec .cfa: sp 0 + .ra: lr +STACK CFI 35eb4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 35ebe .cfa: sp 56 + +STACK CFI 35f90 .cfa: sp 36 + +STACK CFI INIT 35f9c 1bc .cfa: sp 0 + .ra: lr +STACK CFI 35fa0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 35fae .cfa: sp 56 + +STACK CFI 36144 .cfa: sp 36 + +STACK CFI 36148 .cfa: sp 56 + +STACK CFI INIT 36158 42 .cfa: sp 0 + .ra: lr +STACK CFI 3615a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 36198 .cfa: sp 8 + +STACK CFI INIT 3619a 6a .cfa: sp 0 + .ra: lr +STACK CFI 3619e .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 361a0 .cfa: sp 64 + +STACK CFI 36200 .cfa: sp 32 + +STACK CFI INIT 36204 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 3620e a .cfa: sp 0 + .ra: lr +STACK CFI INIT 36218 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 36222 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 3622c a .cfa: sp 0 + .ra: lr +STACK CFI INIT 36236 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 36240 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 3624a a .cfa: sp 0 + .ra: lr +STACK CFI INIT 36254 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 3625e a .cfa: sp 0 + .ra: lr +STACK CFI INIT 36268 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 36272 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 3627c 130 .cfa: sp 0 + .ra: lr +STACK CFI 36280 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3628e .cfa: sp 56 + +STACK CFI 363a8 .cfa: sp 36 + +STACK CFI INIT 363ac 158 .cfa: sp 0 + .ra: lr +STACK CFI 363b2 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 363c2 .cfa: sp 1064 + +STACK CFI 364e4 .cfa: sp 28 + +STACK CFI INIT 36504 9c .cfa: sp 0 + .ra: lr +STACK CFI 36506 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 365a0 a0 .cfa: sp 0 + .ra: lr +STACK CFI 365a4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36640 18 .cfa: sp 0 + .ra: lr +STACK CFI 36642 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36658 12 .cfa: sp 0 + .ra: lr +STACK CFI 3665a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3666c 18 .cfa: sp 0 + .ra: lr +STACK CFI 3666e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36684 12 .cfa: sp 0 + .ra: lr +STACK CFI 36686 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36698 18 .cfa: sp 0 + .ra: lr +STACK CFI 3669a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 366b0 12 .cfa: sp 0 + .ra: lr +STACK CFI 366b2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 366c4 18 .cfa: sp 0 + .ra: lr +STACK CFI 366c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 366dc 12 .cfa: sp 0 + .ra: lr +STACK CFI 366de .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 366f0 18 .cfa: sp 0 + .ra: lr +STACK CFI 366f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36708 12 .cfa: sp 0 + .ra: lr +STACK CFI 3670a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3671c 18 .cfa: sp 0 + .ra: lr +STACK CFI 3671e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36734 12 .cfa: sp 0 + .ra: lr +STACK CFI 36736 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36748 18 .cfa: sp 0 + .ra: lr +STACK CFI 3674a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36760 12 .cfa: sp 0 + .ra: lr +STACK CFI 36762 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36774 18 .cfa: sp 0 + .ra: lr +STACK CFI 36776 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3678c 12 .cfa: sp 0 + .ra: lr +STACK CFI 3678e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 367a0 18 .cfa: sp 0 + .ra: lr +STACK CFI 367a2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 367b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 367ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 367cc 18 .cfa: sp 0 + .ra: lr +STACK CFI 367ce .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 367e4 12 .cfa: sp 0 + .ra: lr +STACK CFI 367e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 367f8 18 .cfa: sp 0 + .ra: lr +STACK CFI 367fa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36810 12 .cfa: sp 0 + .ra: lr +STACK CFI 36812 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36824 20 .cfa: sp 0 + .ra: lr +STACK CFI 36826 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36844 20 .cfa: sp 0 + .ra: lr +STACK CFI 36846 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36864 20 .cfa: sp 0 + .ra: lr +STACK CFI 36866 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36884 20 .cfa: sp 0 + .ra: lr +STACK CFI 36886 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 368a4 20 .cfa: sp 0 + .ra: lr +STACK CFI 368a6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 368c4 20 .cfa: sp 0 + .ra: lr +STACK CFI 368c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 368e4 20 .cfa: sp 0 + .ra: lr +STACK CFI 368e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36904 20 .cfa: sp 0 + .ra: lr +STACK CFI 36906 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36924 20 .cfa: sp 0 + .ra: lr +STACK CFI 36926 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36944 20 .cfa: sp 0 + .ra: lr +STACK CFI 36946 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 36964 20 .cfa: sp 0 + .ra: lr +STACK CFI 36966 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ad8 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 36984 18 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3699c 26 .cfa: sp 0 + .ra: lr +STACK CFI 3699e .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16f88 28 .cfa: sp 0 + .ra: lr +STACK CFI 16f8a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 369c2 44 .cfa: sp 0 + .ra: lr +STACK CFI 369c4 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 36a08 98 .cfa: sp 0 + .ra: lr +STACK CFI 36a0c .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 36a16 .cfa: sp 216 + +STACK CFI 36a94 .cfa: sp 32 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 36aa0 2c .cfa: sp 0 + .ra: lr +STACK CFI 36aa2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 36aac .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 36ab6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 36ac4 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 36aa0 2c .cfa: sp 0 + .ra: lr +STACK CFI 36aa2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 36aac .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 36ab6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 36ac4 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 36acc c8 .cfa: sp 0 + .ra: lr +STACK CFI 36ad0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 36ada .cfa: sp 72 + +STACK CFI 36b8a .cfa: sp 32 + +STACK CFI INIT 20330 98 .cfa: sp 0 + .ra: lr +STACK CFI 20332 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 20334 .cfa: sp 80 + +STACK CFI 203c6 .cfa: sp 20 + +STACK CFI INIT 2127c a0 .cfa: sp 0 + .ra: lr +STACK CFI 21280 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 2128a .cfa: sp 264 + +STACK CFI 21314 .cfa: sp 36 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1e .cfa: sp 20 + +STACK CFI INIT 36b94 a0 .cfa: sp 0 + .ra: lr +STACK CFI 36b98 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 36ba2 .cfa: sp 264 + +STACK CFI 36c2c .cfa: sp 36 + +STACK CFI INIT 36c34 28 .cfa: sp 0 + .ra: lr +STACK CFI 36c36 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 36c5c 98 .cfa: sp 0 + .ra: lr +STACK CFI 36c60 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 36c6a .cfa: sp 256 + +STACK CFI 36cec .cfa: sp 36 + +STACK CFI INIT 36cf4 308 .cfa: sp 0 + .ra: lr +STACK CFI 36cf8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 36d02 .cfa: sp 416 + +STACK CFI 36fb4 .cfa: sp 36 + +STACK CFI INIT 36ffc 48 .cfa: sp 0 + .ra: lr +STACK CFI 36ffe .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3700a .cfa: sp 184 + +STACK CFI 3703e .cfa: sp 20 + +STACK CFI INIT 37044 74 .cfa: sp 0 + .ra: lr +STACK CFI 37048 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3704c .cfa: sp 96 + +STACK CFI 370b0 .cfa: sp 32 + +STACK CFI INIT 370b8 e0 .cfa: sp 0 + .ra: lr +STACK CFI 370ba .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 370be .cfa: sp 48 + +STACK CFI 37172 .cfa: sp 20 + +STACK CFI INIT 37198 d4 .cfa: sp 0 + .ra: lr +STACK CFI 3719c .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 371a0 .cfa: sp 56 + +STACK CFI 37250 .cfa: sp 20 + +STACK CFI INIT 3726c e8 .cfa: sp 0 + .ra: lr +STACK CFI 3726e .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 37272 .cfa: sp 72 + +STACK CFI 37338 .cfa: sp 20 + +STACK CFI INIT 37354 1a0 .cfa: sp 0 + .ra: lr +STACK CFI 37356 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3735a .cfa: sp 56 + +STACK CFI 374b6 .cfa: sp 20 + +STACK CFI INIT 374f4 264 .cfa: sp 0 + .ra: lr +STACK CFI 374f8 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 374fc .cfa: sp 56 + +STACK CFI 37700 .cfa: sp 20 + +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI e .cfa: sp 184 + +STACK CFI 42 .cfa: sp 20 + +STACK CFI INIT 37758 74 .cfa: sp 0 + .ra: lr +STACK CFI 3775c .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 37760 .cfa: sp 96 + +STACK CFI 377c4 .cfa: sp 32 + +STACK CFI INIT 377cc 74 .cfa: sp 0 + .ra: lr +STACK CFI 377d0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 377d4 .cfa: sp 96 + +STACK CFI 37838 .cfa: sp 32 + +STACK CFI INIT 37840 148 .cfa: sp 0 + .ra: lr +STACK CFI 37844 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 37848 .cfa: sp 104 + +STACK CFI 37964 .cfa: sp 36 + +STACK CFI INIT 37988 490 .cfa: sp 0 + .ra: lr +STACK CFI 37990 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 37998 .cfa: sp 160 + +STACK CFI 37d8c .cfa: sp 36 + +STACK CFI INIT 37e18 490 .cfa: sp 0 + .ra: lr +STACK CFI 37e20 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 37e28 .cfa: sp 160 + +STACK CFI 3821c .cfa: sp 36 + +STACK CFI INIT 382a8 6c .cfa: sp 0 + .ra: lr +STACK CFI 382ac .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 382b0 .cfa: sp 96 + +STACK CFI 3830c .cfa: sp 32 + +STACK CFI INIT 38314 124 .cfa: sp 0 + .ra: lr +STACK CFI 38316 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3831a .cfa: sp 64 + +STACK CFI 38412 .cfa: sp 20 + +STACK CFI INIT 38438 124 .cfa: sp 0 + .ra: lr +STACK CFI 3843a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3843e .cfa: sp 64 + +STACK CFI 38536 .cfa: sp 20 + +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 90 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 155d0 300 .cfa: sp 0 + .ra: lr +STACK CFI 155d4 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 15830 .cfa: sp 24 + +STACK CFI INIT 15dc4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 160b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3855c 18 .cfa: sp 0 + .ra: lr +STACK CFI 3855e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 38574 12 .cfa: sp 0 + .ra: lr +STACK CFI 38576 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 38588 18 .cfa: sp 0 + .ra: lr +STACK CFI 3858a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 385a0 12 .cfa: sp 0 + .ra: lr +STACK CFI 385a2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 385b4 20 .cfa: sp 0 + .ra: lr +STACK CFI 385b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 385d4 20 .cfa: sp 0 + .ra: lr +STACK CFI 385d6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b40 24 .cfa: sp 0 + .ra: lr +STACK CFI 16b44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 16c48 78 .cfa: sp 0 + .ra: lr +STACK CFI 16c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 1705c 54 .cfa: sp 0 + .ra: lr +STACK CFI 1705e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170ec 54 .cfa: sp 0 + .ra: lr +STACK CFI 170ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1717c 8c .cfa: sp 0 + .ra: lr +STACK CFI 1717e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI da .cfa: sp 20 + +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI e .cfa: sp 264 + +STACK CFI d2 .cfa: sp 36 + +STACK CFI INIT 385f4 60 .cfa: sp 0 + .ra: lr +STACK CFI 385f6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 385f8 .cfa: sp 40 + +STACK CFI 38648 .cfa: sp 16 + +STACK CFI INIT 38654 60 .cfa: sp 0 + .ra: lr +STACK CFI 38656 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 38658 .cfa: sp 40 + +STACK CFI 386a8 .cfa: sp 16 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 19394 84 .cfa: sp 0 + .ra: lr +STACK CFI 1939a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 90 .cfa: sp 24 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 158d0 9c .cfa: sp 0 + .ra: lr +STACK CFI 158d2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 158d4 .cfa: sp 40 + +STACK CFI 15946 .cfa: sp 20 + +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 386b4 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 ae .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI ac .cfa: sp 20 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 386ba 20 .cfa: sp 0 + .ra: lr +STACK CFI 386bc .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 386ca .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 +STACK CFI 386d0 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 386da a6 .cfa: sp 0 + .ra: lr +STACK CFI 386dc .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3877e .cfa: sp 16 + +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 1c .cfa: sp 56 + +STACK CFI 6a .cfa: sp 36 + +STACK CFI INIT 0 f8 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 80 + +STACK CFI e6 .cfa: sp 24 + +STACK CFI INIT 0 b6 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI b2 .cfa: sp 36 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 38780 1bc .cfa: sp 0 + .ra: lr +STACK CFI 38784 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 38934 .cfa: sp 32 + +STACK CFI INIT 3893c 194 .cfa: sp 0 + .ra: lr +STACK CFI 38940 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 38952 .cfa: sp 80 + +STACK CFI 38a86 .cfa: sp 24 + +STACK CFI INIT 38ad0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 194 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 16 .cfa: sp 80 + +STACK CFI 14a .cfa: sp 24 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38ad4 11c .cfa: sp 0 + .ra: lr +STACK CFI 38ad8 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 38ae2 .cfa: sp 80 + +STACK CFI 38bbc .cfa: sp 20 + +STACK CFI INIT 0 a4 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 14 .cfa: sp 56 + +STACK CFI 88 .cfa: sp 20 + +STACK CFI INIT 38bf0 bc .cfa: sp 0 + .ra: lr +STACK CFI 38bf4 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r3: .cfa -40 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 38c76 .cfa: sp 0 + .ra: .ra r10: r10 r11: r11 r3: r3 r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 r9: r9 +STACK CFI 38c7c .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r3: .cfa -40 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI INIT 0 34 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 14 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI 18 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI e .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 16 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 34 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 38cac e .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 9c .cfa: sp 36 + +STACK CFI a0 .cfa: sp 0 + .ra: .ra r10: r10 r11: r11 r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 r9: r9 +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 18 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 1e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 2e .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI e .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 16 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 34 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 38cba 12 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38ccc 20 .cfa: sp 0 + .ra: lr +STACK CFI 38cd0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 38cec 12 .cfa: sp 0 + .ra: lr +STACK CFI 38cee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 34 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38d00 30 .cfa: sp 0 + .ra: lr +STACK CFI 38d04 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16db4 38 .cfa: sp 0 + .ra: lr +STACK CFI 16db6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 16de6 .cfa: sp 8 + +STACK CFI INIT 0 2e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 38d30 58 .cfa: sp 0 + .ra: lr +STACK CFI 38d32 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 b8 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI b6 .cfa: sp 20 + +STACK CFI INIT 0 168 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI e .cfa: sp 80 + +STACK CFI 14c .cfa: sp 24 + +STACK CFI INIT 38d88 32 .cfa: sp 0 + .ra: lr +STACK CFI 38d8a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 38dbc 190 .cfa: sp 0 + .ra: lr +STACK CFI 38dc0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 38dc2 .cfa: sp 56 + +STACK CFI 38f30 .cfa: sp 36 + +STACK CFI 38f34 .cfa: sp 56 + +STACK CFI INIT 0 32 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 32 + +STACK CFI 30 .cfa: sp 12 + +STACK CFI INIT 38f4c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f54 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f5c a .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f66 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f70 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f74 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f78 e .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f86 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f8c 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f92 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f94 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f96 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f98 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f9a 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f9c 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38f9e 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fa0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fa2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fa4 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fa6 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fa8 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38faa 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fb0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fb2 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fb8 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fbe a .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fbe a .cfa: sp 0 + .ra: lr +STACK CFI INIT 38fbe a .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de4 ac .cfa: sp 0 + .ra: lr +STACK CFI 15de6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15e90 9e .cfa: sp 0 + .ra: lr +STACK CFI 15e92 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15e94 .cfa: sp 40 + +STACK CFI 15f2c .cfa: sp 20 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f2e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f3e 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f54 3e .cfa: sp 0 + .ra: lr +STACK CFI 15f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 1607e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 38fc8 2c .cfa: sp 0 + .ra: lr +STACK CFI 38fca .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 38ff4 2c .cfa: sp 0 + .ra: lr +STACK CFI 38ff6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 39020 2c .cfa: sp 0 + .ra: lr +STACK CFI 39022 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 3904c 2c .cfa: sp 0 + .ra: lr +STACK CFI 3904e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 39078 2c .cfa: sp 0 + .ra: lr +STACK CFI 3907a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 390a4 2c .cfa: sp 0 + .ra: lr +STACK CFI 390a6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 390d0 2e .cfa: sp 0 + .ra: lr +STACK CFI 390d2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 390fe 2e .cfa: sp 0 + .ra: lr +STACK CFI 39100 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 3912c 2e .cfa: sp 0 + .ra: lr +STACK CFI 3912e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 3915a 2e .cfa: sp 0 + .ra: lr +STACK CFI 3915c .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 39188 2e .cfa: sp 0 + .ra: lr +STACK CFI 3918a .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 391b6 30 .cfa: sp 0 + .ra: lr +STACK CFI 391b8 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 391e6 36 .cfa: sp 0 + .ra: lr +STACK CFI 391ea .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 3921c 44 .cfa: sp 0 + .ra: lr +STACK CFI 3921e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 39238 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI 3923e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 39260 2e .cfa: sp 0 + .ra: lr +STACK CFI 39262 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3928c .cfa: sp 16 + +STACK CFI INIT 39290 20 .cfa: sp 0 + .ra: lr +STACK CFI 39292 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 392b0 12 .cfa: sp 0 + .ra: lr +STACK CFI 392b2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 2c90c 18 .cfa: sp 0 + .ra: lr +STACK CFI 2c910 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 392c4 34 .cfa: sp 0 + .ra: lr +STACK CFI 392ca .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 392f0 .cfa: sp 8 + +STACK CFI INIT 2c924 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 392f8 2c .cfa: sp 0 + .ra: lr +STACK CFI 392fa .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3931c .cfa: sp 8 + +STACK CFI INIT 0 2a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 39324 54 .cfa: sp 0 + .ra: lr +STACK CFI 39326 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 39378 24 .cfa: sp 0 + .ra: lr +STACK CFI 3937a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 3939c c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 393a8 24 .cfa: sp 0 + .ra: lr +STACK CFI 393aa .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 393c2 .cfa: sp 4 + +STACK CFI INIT 393cc 24 .cfa: sp 0 + .ra: lr +STACK CFI 393ce .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 393e6 .cfa: sp 4 + +STACK CFI INIT 393f0 24 .cfa: sp 0 + .ra: lr +STACK CFI 393f2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 3940a .cfa: sp 4 + +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 1a .cfa: sp 4 + +STACK CFI INIT 39414 24 .cfa: sp 0 + .ra: lr +STACK CFI 39416 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 3942e .cfa: sp 4 + +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 1a .cfa: sp 4 + +STACK CFI INIT 39438 24 .cfa: sp 0 + .ra: lr +STACK CFI 3943a .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 39452 .cfa: sp 4 + +STACK CFI INIT 3945c 24 .cfa: sp 0 + .ra: lr +STACK CFI 3945e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3947e .cfa: sp 8 + +STACK CFI INIT 39480 1c .cfa: sp 0 + .ra: lr +STACK CFI 39482 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3949c a .cfa: sp 0 + .ra: lr +STACK CFI INIT 394a6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 394ae 1c .cfa: sp 0 + .ra: lr +STACK CFI 394b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 36 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 1c .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 20 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 394cc 34 .cfa: sp 0 + .ra: lr +STACK CFI 394d0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39500 34 .cfa: sp 0 + .ra: lr +STACK CFI 39504 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39534 34 .cfa: sp 0 + .ra: lr +STACK CFI 39536 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 39568 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39578 18 .cfa: sp 0 + .ra: lr +STACK CFI 3957a .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 39590 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 395b0 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 395d0 26 .cfa: sp 0 + .ra: lr +STACK CFI 395d2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 395f6 18 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39610 30 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39640 f8 .cfa: sp 0 + .ra: lr +STACK CFI 39642 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 396f0 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 396f6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 39738 90 .cfa: sp 0 + .ra: lr +STACK CFI 3973a .cfa: sp 12 + r1: .cfa -12 + ^ r2: .cfa -8 + ^ r3: .cfa -4 + ^ +STACK CFI 3973c .cfa: sp 40 + .ra: .cfa -16 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ +STACK CFI 397a8 .cfa: sp 28 + +STACK CFI 397ac .cfa: sp 12 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI 397ae .cfa: sp 0 + r1: r1 r2: r2 r3: r3 +STACK CFI INIT 397c8 30 .cfa: sp 0 + .ra: lr +STACK CFI 397cc .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI 397e0 .cfa: sp 0 + .ra: .ra r3: r3 +STACK CFI INIT 397f8 3c .cfa: sp 0 + .ra: lr +STACK CFI 397fa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3981c .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 39834 30 .cfa: sp 0 + .ra: lr +STACK CFI 39838 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI 3984c .cfa: sp 0 + .ra: .ra r3: r3 +STACK CFI INIT 39864 68 .cfa: sp 0 + .ra: lr +STACK CFI 39866 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 398a6 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 398ae .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 398cc 3a .cfa: sp 0 + .ra: lr +STACK CFI 398ce .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 39908 2c .cfa: sp 0 + .ra: lr +STACK CFI 3990a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39934 12 .cfa: sp 0 + .ra: lr +STACK CFI 39936 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39946 1c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39962 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3996a c .cfa: sp 0 + .ra: lr +STACK CFI INIT 39976 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3997c 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39982 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39988 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3998e 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39994 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3999a 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 399aa 1a .cfa: sp 0 + .ra: lr +STACK CFI 399ac .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 399c4 54 .cfa: sp 0 + .ra: lr +STACK CFI 399c6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 39a02 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 39a06 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39a18 f0 .cfa: sp 0 + .ra: lr +STACK CFI 39a1c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 39a24 .cfa: sp 56 + +STACK CFI 39ae4 .cfa: sp 36 + +STACK CFI 39ae8 .cfa: sp 0 + .ra: .ra r10: r10 r11: r11 r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 r9: r9 +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b08 26 .cfa: sp 0 + .ra: lr +STACK CFI 39b0a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b32 26 .cfa: sp 0 + .ra: lr +STACK CFI 39b34 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 39b58 74 .cfa: sp 0 + .ra: lr +STACK CFI 39b5a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 39bb2 .cfa: sp 8 + +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39bcc 1c .cfa: sp 0 + .ra: lr +STACK CFI 39bd0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39be8 1c .cfa: sp 0 + .ra: lr +STACK CFI 39bea .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39be8 1c .cfa: sp 0 + .ra: lr +STACK CFI 39bea .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39c04 20 .cfa: sp 0 + .ra: lr +STACK CFI 39c06 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39c24 24 .cfa: sp 0 + .ra: lr +STACK CFI 39c26 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39c48 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39c58 1c .cfa: sp 0 + .ra: lr +STACK CFI 39c5a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 39c6c .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 39c70 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39c74 10 .cfa: sp 0 + .ra: lr +STACK CFI 39c76 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39c84 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39c94 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39c9a 2a .cfa: sp 0 + .ra: lr +STACK CFI 39c9c .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 39cc4 14 .cfa: sp 0 + .ra: lr +STACK CFI 39cc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39cd8 2a .cfa: sp 0 + .ra: lr +STACK CFI 39cda .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 39c24 24 .cfa: sp 0 + .ra: lr +STACK CFI 39c26 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 39d04 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39d14 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39d24 18 .cfa: sp 0 + .ra: lr +STACK CFI 39d26 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 39d3c 98 .cfa: sp 0 + .ra: lr +STACK CFI 39d40 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 39dd4 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39de4 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39df4 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39e04 c .cfa: sp 0 + .ra: lr +STACK CFI 39e06 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39e10 18 .cfa: sp 0 + .ra: lr +STACK CFI 39e12 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b64 12 .cfa: sp 0 + .ra: lr +STACK CFI 16b66 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39e28 1c .cfa: sp 0 + .ra: lr +STACK CFI 39e2a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39e44 1c .cfa: sp 0 + .ra: lr +STACK CFI 39e46 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39e60 12 .cfa: sp 0 + .ra: lr +STACK CFI 39e62 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39e72 2e .cfa: sp 0 + .ra: lr +STACK CFI 39e74 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 39e9e .cfa: sp 16 + +STACK CFI INIT 39ea0 28 .cfa: sp 0 + .ra: lr +STACK CFI 39ea2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16cc0 66 .cfa: sp 0 + .ra: lr +STACK CFI 16cc2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 39cc4 14 .cfa: sp 0 + .ra: lr +STACK CFI 39cc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39ec8 30 .cfa: sp 0 + .ra: lr +STACK CFI 39eca .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 39ef8 12 .cfa: sp 0 + .ra: lr +STACK CFI 39efa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39cc4 14 .cfa: sp 0 + .ra: lr +STACK CFI 39cc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39cc4 14 .cfa: sp 0 + .ra: lr +STACK CFI 39cc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39f0a 84 .cfa: sp 0 + .ra: lr +STACK CFI 39f0e .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 39f8a .cfa: sp 24 + +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 39f90 3c .cfa: sp 0 + .ra: lr +STACK CFI 39f92 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI 39fc2 .cfa: sp 0 + .ra: .ra r3: r3 +STACK CFI 39fc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 62 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 39f0a 84 .cfa: sp 0 + .ra: lr +STACK CFI 39f0e .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 39f8a .cfa: sp 24 + +STACK CFI INIT 176da 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 19212 30 .cfa: sp 0 + .ra: lr +STACK CFI 19214 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 19242 5e .cfa: sp 0 + .ra: lr +STACK CFI 19244 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 d0 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI cc .cfa: sp 24 + +STACK CFI INIT 0 4e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 39fcc 16 .cfa: sp 0 + .ra: lr +STACK CFI 39fd0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39fe2 1e .cfa: sp 0 + .ra: lr +STACK CFI 39fe4 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3a000 38 .cfa: sp 0 + .ra: lr +STACK CFI 3a002 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3a038 22 .cfa: sp 0 + .ra: lr +STACK CFI 3a03a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3a05c 14c .cfa: sp 0 + .ra: lr +STACK CFI 3a060 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r3: .cfa -40 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 179ec 1a .cfa: sp 0 + .ra: lr +STACK CFI 179ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 17a02 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 3a1a8 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 3a1b2 ac .cfa: sp 0 + .ra: lr +STACK CFI 3a1b6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 3a25e 22 .cfa: sp 0 + .ra: lr +STACK CFI 3a260 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 3a280 30 .cfa: sp 0 + .ra: lr +STACK CFI 3a284 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3a2ac .cfa: sp 24 + +STACK CFI INIT 3a2b0 18 .cfa: sp 0 + .ra: lr +STACK CFI 3a2b2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3a2c2 .cfa: sp 8 + +STACK CFI INIT 3a2c8 50 .cfa: sp 0 + .ra: lr +STACK CFI 3a2ca .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3a30a .cfa: sp 8 + +STACK CFI INIT 3a318 18 .cfa: sp 0 + .ra: lr +STACK CFI 3a31a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3a32a .cfa: sp 8 + +STACK CFI INIT 3a330 88 .cfa: sp 0 + .ra: lr +STACK CFI 3a334 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3a3a8 .cfa: sp 32 + +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3a3b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 3a3ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3a3cc 64 .cfa: sp 0 + .ra: lr +STACK CFI 3a3ce .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3a3d8 .cfa: sp 80 + +STACK CFI 3a422 .cfa: sp 20 + +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3a430 22 .cfa: sp 0 + .ra: lr +STACK CFI 3a432 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 3a452 2c .cfa: sp 0 + .ra: lr +STACK CFI 3a454 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3a47c .cfa: sp 12 + +STACK CFI INIT 3a480 34 .cfa: sp 0 + .ra: lr +STACK CFI 3a482 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 3a4b4 44 .cfa: sp 0 + .ra: lr +STACK CFI 3a4b6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3a4ee .cfa: sp 12 + +STACK CFI INIT 16dec 18 .cfa: sp 0 + .ra: lr +STACK CFI 16dee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3a4f8 44 .cfa: sp 0 + .ra: lr +STACK CFI 3a4fa .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3a53a .cfa: sp 16 + +STACK CFI INIT 3a53c 80 .cfa: sp 0 + .ra: lr +STACK CFI 3a540 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3a54a .cfa: sp 64 + +STACK CFI 3a5b0 .cfa: sp 32 + +STACK CFI INIT 3a5bc e .cfa: sp 0 + .ra: lr +STACK CFI 3a5be .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI e .cfa: sp 56 + +STACK CFI 70 .cfa: sp 24 + +STACK CFI INIT 0 a0 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 88 .cfa: sp 20 + +STACK CFI INIT 3a5ca 2e .cfa: sp 0 + .ra: lr +STACK CFI 3a5cc .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3a5f6 .cfa: sp 16 + +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 68 .cfa: sp 16 + +STACK CFI INIT 3a5f8 160 .cfa: sp 0 + .ra: lr +STACK CFI 3a5fc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3a600 .cfa: sp 56 + +STACK CFI 3a70c .cfa: sp 36 + +STACK CFI INIT 3a758 d0 .cfa: sp 0 + .ra: lr +STACK CFI 3a75c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3a772 .cfa: sp 72 + +STACK CFI 3a810 .cfa: sp 36 + +STACK CFI INIT 0 3a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 386b4 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17044 16 .cfa: sp 0 + .ra: lr +STACK CFI 17046 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 17056 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 0 50 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 50 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 17140 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17148 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17154 12 .cfa: sp 0 + .ra: lr +STACK CFI 17156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 17166 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 17172 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 90 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 17208 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17210 80 .cfa: sp 0 + .ra: lr +STACK CFI 17212 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 17290 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 17298 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172a8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 172b4 12 .cfa: sp 0 + .ra: lr +STACK CFI 172b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 172c6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 172ce c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI e .cfa: sp 184 + +STACK CFI 42 .cfa: sp 20 + +STACK CFI INIT 1739c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173a4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 173ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173ca 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 173d2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 90 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 8e .cfa: sp 20 + +STACK CFI INIT 3a828 a4 .cfa: sp 0 + .ra: lr +STACK CFI 3a82a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3a82e .cfa: sp 208 + +STACK CFI 3a8c2 .cfa: sp 20 + +STACK CFI INIT 0 ae .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI ac .cfa: sp 20 + +STACK CFI INIT 3a8cc e8 .cfa: sp 0 + .ra: lr +STACK CFI 3a8ce .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3a982 .cfa: sp 20 + +STACK CFI INIT 3a9b4 1c .cfa: sp 0 + .ra: lr +STACK CFI 3a9b6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 16 + +STACK CFI INIT 3a9d0 5c .cfa: sp 0 + .ra: lr +STACK CFI 3a9d2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3aa1a .cfa: sp 16 + +STACK CFI INIT 3aa2c 30 .cfa: sp 0 + .ra: lr +STACK CFI 3aa2e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3aa5c 12 .cfa: sp 0 + .ra: lr +STACK CFI 3aa5e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3aa70 38 .cfa: sp 0 + .ra: lr +STACK CFI 3aa72 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3aaa0 .cfa: sp 16 + +STACK CFI INIT 0 74 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI e .cfa: sp 208 + +STACK CFI 68 .cfa: sp 24 + +STACK CFI INIT 3aaa8 50 .cfa: sp 0 + .ra: lr +STACK CFI 3aaaa .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3aaf2 .cfa: sp 16 + +STACK CFI INIT 17a84 2c .cfa: sp 0 + .ra: lr +STACK CFI 17a86 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17aae .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 17a84 2c .cfa: sp 0 + .ra: lr +STACK CFI 17a86 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17aae .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 17a84 2c .cfa: sp 0 + .ra: lr +STACK CFI 17a86 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17aae .cfa: sp 16 + +STACK CFI INIT 3aaf8 b0 .cfa: sp 0 + .ra: lr +STACK CFI 3aafa .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3aafc .cfa: sp 48 + +STACK CFI 3ab90 .cfa: sp 16 + +STACK CFI INIT 0 b0 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 48 + +STACK CFI 98 .cfa: sp 16 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 0 118 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 48 + +STACK CFI e2 .cfa: sp 24 + +STACK CFI INIT 0 26 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI a .cfa: sp 40 + +STACK CFI 24 .cfa: sp 20 + +STACK CFI INIT 0 26 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI a .cfa: sp 40 + +STACK CFI 24 .cfa: sp 20 + +STACK CFI INIT 0 130 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI e .cfa: sp 88 + +STACK CFI f6 .cfa: sp 28 + +STACK CFI INIT 3aba8 b0 .cfa: sp 0 + .ra: lr +STACK CFI 3abac .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3ac3a .cfa: sp 24 + +STACK CFI INIT 17522 90 .cfa: sp 0 + .ra: lr +STACK CFI 17524 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17526 .cfa: sp 80 + +STACK CFI 175b0 .cfa: sp 20 + +STACK CFI INIT 3ac58 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3ac5c 64 .cfa: sp 0 + .ra: lr +STACK CFI 3ac5e .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3acae .cfa: sp 20 + +STACK CFI INIT 3acc0 64 .cfa: sp 0 + .ra: lr +STACK CFI 3acc4 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3ad10 .cfa: sp 20 + +STACK CFI INIT 3ad24 1e .cfa: sp 0 + .ra: lr +STACK CFI 3ad26 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3ad40 .cfa: sp 12 + +STACK CFI INIT 3ad42 16 .cfa: sp 0 + .ra: lr +STACK CFI 3ad44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3ad54 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 1c .cfa: sp 16 + +STACK CFI INIT 0 22 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 20 .cfa: sp 12 + +STACK CFI INIT 0 22 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 20 .cfa: sp 12 + +STACK CFI INIT 3ad58 64 .cfa: sp 0 + .ra: lr +STACK CFI 3ad5a .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3ada8 .cfa: sp 20 + +STACK CFI INIT 3adbc 24 .cfa: sp 0 + .ra: lr +STACK CFI 3adbe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3ade0 68 .cfa: sp 0 + .ra: lr +STACK CFI 3ade2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3ae46 .cfa: sp 20 + +STACK CFI INIT 3ae48 68 .cfa: sp 0 + .ra: lr +STACK CFI 3ae4c .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3aea6 .cfa: sp 24 + +STACK CFI INIT 3aeb0 30 .cfa: sp 0 + .ra: lr +STACK CFI 3aeb2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 3aee0 5c .cfa: sp 0 + .ra: lr +STACK CFI 3aee2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3af2a .cfa: sp 20 + +STACK CFI INIT 3af3c 24 .cfa: sp 0 + .ra: lr +STACK CFI 3af3e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3af60 12 .cfa: sp 0 + .ra: lr +STACK CFI 3af62 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3af74 1c .cfa: sp 0 + .ra: lr +STACK CFI 3af76 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3af90 12 .cfa: sp 0 + .ra: lr +STACK CFI 3af92 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3afa2 60 .cfa: sp 0 + .ra: lr +STACK CFI 3afa4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3b000 .cfa: sp 16 + +STACK CFI INIT 3b002 48 .cfa: sp 0 + .ra: lr +STACK CFI 3b004 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 3b04a 16 .cfa: sp 0 + .ra: lr +STACK CFI 3b04c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3b05a .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 3b05e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3b060 58 .cfa: sp 0 + .ra: lr +STACK CFI 3b062 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 3b0b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 3b0ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3b0cc 80 .cfa: sp 0 + .ra: lr +STACK CFI 3b0ce .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3b0d2 .cfa: sp 208 + +STACK CFI 3b142 .cfa: sp 20 + +STACK CFI INIT 3b14c 6c .cfa: sp 0 + .ra: lr +STACK CFI 3b14e .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3b15a .cfa: sp 184 + +STACK CFI 3b1b2 .cfa: sp 20 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 3b1b8 118 .cfa: sp 0 + .ra: lr +STACK CFI 3b1bc .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3b2b4 .cfa: sp 32 + +STACK CFI INIT 3b2d0 32 .cfa: sp 0 + .ra: lr +STACK CFI 3b2d2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3b300 .cfa: sp 12 + +STACK CFI INIT 3b304 150 .cfa: sp 0 + .ra: lr +STACK CFI 3b308 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3b41a .cfa: sp 32 + +STACK CFI INIT 3b454 58 .cfa: sp 0 + .ra: lr +STACK CFI 3b456 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3b4ac 96 .cfa: sp 0 + .ra: lr +STACK CFI 3b4ae .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3b4b0 .cfa: sp 80 + +STACK CFI 3b540 .cfa: sp 20 + +STACK CFI INIT 0 2e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2c .cfa: sp 16 + +STACK CFI INIT 0 16c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 72 + +STACK CFI 144 .cfa: sp 28 + +STACK CFI INIT 3b548 74 .cfa: sp 0 + .ra: lr +STACK CFI 3b54c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3b558 .cfa: sp 184 + +STACK CFI 3b5a6 .cfa: sp 24 + +STACK CFI INIT 3b5c0 94 .cfa: sp 0 + .ra: lr +STACK CFI 3b5c4 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3b642 .cfa: sp 28 + +STACK CFI INIT 386ba 20 .cfa: sp 0 + .ra: lr +STACK CFI 386bc .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 386ca .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 +STACK CFI 386d0 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 386da a6 .cfa: sp 0 + .ra: lr +STACK CFI 386dc .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3877e .cfa: sp 16 + +STACK CFI INIT 0 b6 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI b2 .cfa: sp 36 + +STACK CFI INIT 3b654 bc .cfa: sp 0 + .ra: lr +STACK CFI 3b656 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3b6ec .cfa: sp 20 + +STACK CFI INIT 3b710 154 .cfa: sp 0 + .ra: lr +STACK CFI 3b714 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3b71a .cfa: sp 72 + +STACK CFI 3b838 .cfa: sp 24 + +STACK CFI INIT 3b864 5c .cfa: sp 0 + .ra: lr +STACK CFI 3b868 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3b874 .cfa: sp 64 + +STACK CFI 3b8b8 .cfa: sp 28 + +STACK CFI INIT 0 26 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 24 .cfa: sp 8 + +STACK CFI INIT 17ae8 2c .cfa: sp 0 + .ra: lr +STACK CFI 17aea .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 17b12 .cfa: sp 16 + +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 104 + +STACK CFI b4 .cfa: sp 24 + +STACK CFI INIT 0 19c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 8 .cfa: sp 40 + s16: .cfa -40 + ^ s17: .cfa -36 + ^ +STACK CFI a .cfa: sp 416 + +STACK CFI 17c .cfa: sp 40 + +STACK CFI 180 .cfa: sp 32 + s16: s16 s17: s17 +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 10 .cfa: sp 12 + +STACK CFI INIT 0 1f8 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 440 + +STACK CFI 1d2 .cfa: sp 36 + +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 1c .cfa: sp 16 + +STACK CFI INIT 0 194 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 64 + +STACK CFI 15e .cfa: sp 36 + +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 1c .cfa: sp 16 + +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 1c .cfa: sp 16 + +STACK CFI INIT 0 224 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 88 + +STACK CFI 1e2 .cfa: sp 36 + +STACK CFI INIT 3b8c0 d4 .cfa: sp 0 + .ra: lr +STACK CFI 3b8c6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3b8ce .cfa: sp 80 + +STACK CFI 3b978 .cfa: sp 24 + +STACK CFI INIT 3b994 138 .cfa: sp 0 + .ra: lr +STACK CFI 3b998 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3b9a2 .cfa: sp 96 + +STACK CFI 3baa6 .cfa: sp 36 + +STACK CFI INIT 3bacc f0 .cfa: sp 0 + .ra: lr +STACK CFI 3bad0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3bada .cfa: sp 120 + +STACK CFI 3bba4 .cfa: sp 36 + +STACK CFI INIT 3bbbc 58 .cfa: sp 0 + .ra: lr +STACK CFI 3bbc0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3bbc4 .cfa: sp 56 + +STACK CFI 3bc0a .cfa: sp 24 + +STACK CFI INIT 3bc14 270 .cfa: sp 0 + .ra: lr +STACK CFI 3bc18 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3bc22 .cfa: sp 72 + +STACK CFI 3be24 .cfa: sp 28 + +STACK CFI INIT 3be84 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 3be90 dc .cfa: sp 0 + .ra: lr +STACK CFI 3be94 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3bf40 .cfa: sp 24 + +STACK CFI INIT 3bf6c 84 .cfa: sp 0 + .ra: lr +STACK CFI 3bf6e .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3bfda .cfa: sp 20 + +STACK CFI INIT 3bff0 c .cfa: sp 0 + .ra: lr +STACK CFI 3bff2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 3bffc 1d4 .cfa: sp 0 + .ra: lr +STACK CFI 3c000 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3c00a .cfa: sp 184 + +STACK CFI 3c1a2 .cfa: sp 36 + +STACK CFI INIT 3c1d0 e .cfa: sp 0 + .ra: lr +STACK CFI 3c1d2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 203f0 34 .cfa: sp 0 + .ra: lr +STACK CFI 203f2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 3c1de 42 .cfa: sp 0 + .ra: lr +STACK CFI 3c1e2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 3c220 28 .cfa: sp 0 + .ra: lr +STACK CFI 3c222 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 25018 22 .cfa: sp 0 + .ra: lr +STACK CFI 2501e .cfa: sp 16 + +STACK CFI 25038 .cfa: sp 0 + +STACK CFI INIT 25054 1c .cfa: sp 0 + .ra: lr +STACK CFI 25056 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 3c248 20 .cfa: sp 0 + .ra: lr +STACK CFI 3c24c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3c268 56 .cfa: sp 0 + .ra: lr +STACK CFI 3c26c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3c2bc .cfa: sp 16 + +STACK CFI INIT 3c2be 26 .cfa: sp 0 + .ra: lr +STACK CFI 3c2c0 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 3c2e4 a8 .cfa: sp 0 + .ra: lr +STACK CFI 3c2e8 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 3c38c 10c .cfa: sp 0 + .ra: lr +STACK CFI 3c390 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3c39a .cfa: sp 88 + +STACK CFI 3c46a .cfa: sp 36 + +STACK CFI INIT 3c498 ac .cfa: sp 0 + .ra: lr +STACK CFI 3c49c .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3c532 .cfa: sp 28 + +STACK CFI 3c536 .cfa: sp 40 + +STACK CFI INIT 3c544 28 .cfa: sp 0 + .ra: lr +STACK CFI 3c546 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3c56a .cfa: sp 8 + +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 12 .cfa: sp 4 + +STACK CFI INIT 3c56c 18 .cfa: sp 0 + .ra: lr +STACK CFI 3c56e .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 3c580 .cfa: sp 4 + +STACK CFI INIT 3c584 2a .cfa: sp 0 + .ra: lr +STACK CFI 3c586 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3c5a8 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 3c5ac .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 3c5b0 1c8 .cfa: sp 0 + .ra: lr +STACK CFI 3c5b4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3c5ba .cfa: sp 48 + +STACK CFI 3c734 .cfa: sp 28 + +STACK CFI INIT 3c778 2c .cfa: sp 0 + .ra: lr +STACK CFI 3c77a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 3c7a4 44 .cfa: sp 0 + .ra: lr +STACK CFI 3c7a6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 3c7e8 194 .cfa: sp 0 + .ra: lr +STACK CFI 3c7ee .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3c7f6 .cfa: sp 208 + +STACK CFI 3c966 .cfa: sp 36 + +STACK CFI INIT 3c97c a .cfa: sp 0 + .ra: lr +STACK CFI 3c97e .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 34 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 1e .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 22 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3c986 46 .cfa: sp 0 + .ra: lr +STACK CFI 3c988 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3c98a .cfa: sp 32 + +STACK CFI 3c9c6 .cfa: sp 12 + +STACK CFI 3c9ca .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 +STACK CFI INIT 3c9cc 1c .cfa: sp 0 + .ra: lr +STACK CFI 3c9ce .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI 3c9e4 .cfa: sp 0 + .ra: .ra r3: r3 +STACK CFI INIT 3c9e8 1c .cfa: sp 0 + .ra: lr +STACK CFI 3c9ea .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI 3ca00 .cfa: sp 0 + .ra: .ra r3: r3 +STACK CFI INIT 3c986 46 .cfa: sp 0 + .ra: lr +STACK CFI 3c988 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3c98a .cfa: sp 32 + +STACK CFI 3c9c6 .cfa: sp 12 + +STACK CFI 3c9ca .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 +STACK CFI INIT 3ca04 88 .cfa: sp 0 + .ra: lr +STACK CFI 3ca08 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 64 + +STACK CFI 50 .cfa: sp 24 + +STACK CFI INIT 3ca8c 10 .cfa: sp 0 + .ra: lr +STACK CFI 3ca8e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3ca9c 2a .cfa: sp 0 + .ra: lr +STACK CFI 3ca9e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3cac0 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 3cac4 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 3cac8 a0 .cfa: sp 0 + .ra: lr +STACK CFI 3cacc .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3cad0 .cfa: sp 88 + +STACK CFI 3cb50 .cfa: sp 28 + +STACK CFI INIT 0 1a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 16 .cfa: sp 4 + +STACK CFI INIT 3cb68 2c .cfa: sp 0 + .ra: lr +STACK CFI 3cb6a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3cb92 .cfa: sp 8 + +STACK CFI INIT 3cb94 20 .cfa: sp 0 + .ra: lr +STACK CFI 3cb96 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3cbb2 .cfa: sp 12 + +STACK CFI INIT 3cbb4 34 .cfa: sp 0 + .ra: lr +STACK CFI 3cbb6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3cbe0 .cfa: sp 8 + +STACK CFI INIT 3cbe8 12 .cfa: sp 0 + .ra: lr +STACK CFI 3cbea .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3cbfc 19c .cfa: sp 0 + .ra: lr +STACK CFI 3cbfe .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3cd72 .cfa: sp 20 + +STACK CFI INIT 3cd98 12 .cfa: sp 0 + .ra: lr +STACK CFI 3cd9a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3179c 2e .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 8a .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 86 .cfa: sp 24 + +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 42 .cfa: sp 20 + +STACK CFI INIT 3cdac 98 .cfa: sp 0 + .ra: lr +STACK CFI 3cdb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3cdba .cfa: sp 88 + +STACK CFI 3ce36 .cfa: sp 28 + +STACK CFI INIT 18134 a4 .cfa: sp 0 + .ra: lr +STACK CFI 18138 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 181d4 .cfa: sp 24 + +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 42 .cfa: sp 20 + +STACK CFI INIT 3ce44 130 .cfa: sp 0 + .ra: lr +STACK CFI 3ce48 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3ce5c .cfa: sp 152 + +STACK CFI 3cf5a .cfa: sp 36 + +STACK CFI INIT 3cf74 148 .cfa: sp 0 + .ra: lr +STACK CFI 3cf7a .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3cf82 .cfa: sp 128 + +STACK CFI 3d0a4 .cfa: sp 36 + +STACK CFI INIT 3d0bc 44 .cfa: sp 0 + .ra: lr +STACK CFI 3d0be .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3d0ca .cfa: sp 56 + +STACK CFI 3d0f6 .cfa: sp 20 + +STACK CFI INIT 3d100 44 .cfa: sp 0 + .ra: lr +STACK CFI 3d102 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3d10c .cfa: sp 48 + +STACK CFI 3d13a .cfa: sp 16 + +STACK CFI INIT 3d144 78 .cfa: sp 0 + .ra: lr +STACK CFI 3d146 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3d14a .cfa: sp 80 + +STACK CFI 3d1a8 .cfa: sp 20 + +STACK CFI INIT 3d1bc 58 .cfa: sp 0 + .ra: lr +STACK CFI 3d1be .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3d1c8 .cfa: sp 88 + +STACK CFI 3d208 .cfa: sp 20 + +STACK CFI INIT 3d214 180 .cfa: sp 0 + .ra: lr +STACK CFI 3d218 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3d21c .cfa: sp 120 + +STACK CFI 3d36e .cfa: sp 32 + +STACK CFI INIT 3d394 3c .cfa: sp 0 + .ra: lr +STACK CFI 3d396 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3d3ca .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 3d3ce .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3d3d0 70 .cfa: sp 0 + .ra: lr +STACK CFI 3d3d4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3d3d8 .cfa: sp 80 + +STACK CFI 3d434 .cfa: sp 24 + +STACK CFI INIT 3d440 78 .cfa: sp 0 + .ra: lr +STACK CFI 3d444 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3d450 .cfa: sp 104 + +STACK CFI 3d4ae .cfa: sp 36 + +STACK CFI INIT 0 90 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 56 + +STACK CFI 78 .cfa: sp 20 + +STACK CFI INIT 0 194 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI e .cfa: sp 96 + +STACK CFI 160 .cfa: sp 36 + +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI c .cfa: sp 72 + +STACK CFI 4c .cfa: sp 20 + +STACK CFI INIT 3d4b8 224 .cfa: sp 0 + .ra: lr +STACK CFI 3d4bc .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3d4be .cfa: sp 48 + +STACK CFI 3d676 .cfa: sp 28 + +STACK CFI INIT 3d6dc a8 .cfa: sp 0 + .ra: lr +STACK CFI 3d6de .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3d6e0 .cfa: sp 40 + +STACK CFI 3d76c .cfa: sp 16 + +STACK CFI INIT 3d784 104 .cfa: sp 0 + .ra: lr +STACK CFI 3d788 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3d78e .cfa: sp 64 + +STACK CFI 3d878 .cfa: sp 32 + +STACK CFI INIT 3d888 d4 .cfa: sp 0 + .ra: lr +STACK CFI 3d88c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3d892 .cfa: sp 48 + +STACK CFI 3d946 .cfa: sp 28 + +STACK CFI INIT 3d95c 2d4 .cfa: sp 0 + .ra: lr +STACK CFI 3d960 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3d964 .cfa: sp 88 + +STACK CFI 3dbe0 .cfa: sp 36 + +STACK CFI INIT 3dc30 60 .cfa: sp 0 + .ra: lr +STACK CFI 3dc34 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3dc40 .cfa: sp 80 + +STACK CFI 3dc82 .cfa: sp 24 + +STACK CFI INIT 3dc90 60 .cfa: sp 0 + .ra: lr +STACK CFI 3dc94 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3dca0 .cfa: sp 80 + +STACK CFI 3dce2 .cfa: sp 24 + +STACK CFI INIT 3dcf0 6c .cfa: sp 0 + .ra: lr +STACK CFI 3dcf4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3dd02 .cfa: sp 96 + +STACK CFI 3dd4e .cfa: sp 28 + +STACK CFI INIT 3dd5c 9c .cfa: sp 0 + .ra: lr +STACK CFI 3dd5e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3dd62 .cfa: sp 48 + +STACK CFI 3ddd6 .cfa: sp 16 + +STACK CFI INIT 3ddf8 150 .cfa: sp 0 + .ra: lr +STACK CFI 3ddfc .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3de06 .cfa: sp 80 + +STACK CFI 3def8 .cfa: sp 20 + +STACK CFI INIT 3df48 1a4 .cfa: sp 0 + .ra: lr +STACK CFI 3df4c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3df50 .cfa: sp 496 + +STACK CFI 3e0d4 .cfa: sp 36 + +STACK CFI INIT 3e0ec a4 .cfa: sp 0 + .ra: lr +STACK CFI 3e0f0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3e0f4 .cfa: sp 112 + +STACK CFI 3e17e .cfa: sp 32 + +STACK CFI INIT 3e190 26 .cfa: sp 0 + .ra: lr +STACK CFI 3e192 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3e1b8 48 .cfa: sp 0 + .ra: lr +STACK CFI 3e1ba .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 3e1f8 .cfa: sp 20 + +STACK CFI INIT 3e200 1a .cfa: sp 0 + .ra: lr +STACK CFI 3e202 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3e21c 2b8 .cfa: sp 0 + .ra: lr +STACK CFI 3e222 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3e22e .cfa: sp 96 + +STACK CFI 3e42c .cfa: sp 36 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 fc .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 80 + +STACK CFI ee .cfa: sp 20 + +STACK CFI INIT 0 80 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 10 .cfa: sp 224 + +STACK CFI 78 .cfa: sp 36 + +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 1e .cfa: sp 8 + +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI c .cfa: sp 48 + +STACK CFI 38 .cfa: sp 16 + +STACK CFI INIT 0 154 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 6 .cfa: sp 64 + +STACK CFI 11e .cfa: sp 32 + +STACK CFI INIT 0 26 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI a .cfa: sp 40 + +STACK CFI 24 .cfa: sp 20 + +STACK CFI INIT 0 26 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI a .cfa: sp 40 + +STACK CFI 24 .cfa: sp 20 + +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI c .cfa: sp 48 + +STACK CFI 38 .cfa: sp 16 + +STACK CFI INIT 0 2a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 16 + +STACK CFI INIT 0 2b8 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 12 .cfa: sp 96 + +STACK CFI 210 .cfa: sp 36 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3e4d4 f8 .cfa: sp 0 + .ra: lr +STACK CFI 3e4da .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3e4e4 .cfa: sp 248 + +STACK CFI 3e5b0 .cfa: sp 36 + +STACK CFI INIT 3e5cc 348 .cfa: sp 0 + .ra: lr +STACK CFI 3e5d0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3e5e0 .cfa: sp 208 + +STACK CFI 3e8c4 .cfa: sp 36 + +STACK CFI INIT 3e914 228 .cfa: sp 0 + .ra: lr +STACK CFI 3e918 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3e928 .cfa: sp 128 + +STACK CFI 3eb04 .cfa: sp 36 + +STACK CFI INIT 3eb3c 2c0 .cfa: sp 0 + .ra: lr +STACK CFI 3eb40 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3eb50 .cfa: sp 128 + +STACK CFI 3edb0 .cfa: sp 36 + +STACK CFI INIT 3edfc c8 .cfa: sp 0 + .ra: lr +STACK CFI 3ee00 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3ee0a .cfa: sp 264 + +STACK CFI 3eeb0 .cfa: sp 28 + +STACK CFI INIT 18f74 96 .cfa: sp 0 + .ra: lr +STACK CFI 18f76 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 18f78 .cfa: sp 80 + +STACK CFI 19008 .cfa: sp 20 + +STACK CFI INIT 3eec4 2e .cfa: sp 0 + .ra: lr +STACK CFI 3eec6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3eef0 .cfa: sp 16 + +STACK CFI INIT 3eef4 b4 .cfa: sp 0 + .ra: lr +STACK CFI 3eef6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3ef04 .cfa: sp 56 + +STACK CFI 3ef88 .cfa: sp 16 + +STACK CFI INIT 3efa8 1dc .cfa: sp 0 + .ra: lr +STACK CFI 3efac .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3efba .cfa: sp 96 + +STACK CFI 3f122 .cfa: sp 32 + +STACK CFI INIT 3f184 ac .cfa: sp 0 + .ra: lr +STACK CFI 3f18a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 3f192 .cfa: sp 88 + +STACK CFI 3f20e .cfa: sp 24 + +STACK CFI INIT 3f230 d8 .cfa: sp 0 + .ra: lr +STACK CFI 3f234 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3f238 .cfa: sp 200 + +STACK CFI 3f2ec .cfa: sp 36 + +STACK CFI INIT 3f308 d8 .cfa: sp 0 + .ra: lr +STACK CFI 3f30c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3f310 .cfa: sp 200 + +STACK CFI 3f3c4 .cfa: sp 36 + +STACK CFI INIT 3f3e0 dc .cfa: sp 0 + .ra: lr +STACK CFI 3f3e4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3f3e8 .cfa: sp 200 + +STACK CFI 3f49e .cfa: sp 36 + +STACK CFI INIT 0 4c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI e .cfa: sp 184 + +STACK CFI 44 .cfa: sp 20 + +STACK CFI INIT 0 d4 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI c .cfa: sp 96 + +STACK CFI ba .cfa: sp 24 + +STACK CFI INIT 0 d4 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI c .cfa: sp 96 + +STACK CFI ba .cfa: sp 24 + +STACK CFI INIT 0 d4 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI c .cfa: sp 96 + +STACK CFI ba .cfa: sp 24 + +STACK CFI INIT 0 d4 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI c .cfa: sp 96 + +STACK CFI ba .cfa: sp 24 + +STACK CFI INIT 0 d4 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI c .cfa: sp 96 + +STACK CFI ba .cfa: sp 24 + +STACK CFI INIT 3f4bc f0 .cfa: sp 0 + .ra: lr +STACK CFI 3f4c0 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3f5a4 .cfa: sp 28 + +STACK CFI INIT 3f5b0 48e .cfa: sp 0 + .ra: lr +STACK CFI 3f5b4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3f5ba .cfa: sp 120 + +STACK CFI 3fa3a .cfa: sp 36 + +STACK CFI INIT 38d88 32 .cfa: sp 0 + .ra: lr +STACK CFI 38d8a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 16c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 56 + +STACK CFI 150 .cfa: sp 36 + +STACK CFI 154 .cfa: sp 56 + +STACK CFI INIT 3fa40 32 .cfa: sp 0 + .ra: lr +STACK CFI 3fa42 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3fa48 .cfa: sp 32 + +STACK CFI 3fa70 .cfa: sp 12 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3fa72 30 .cfa: sp 0 + .ra: lr +STACK CFI 3fa74 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3fa98 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI INIT 0 1a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 174 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 56 + +STACK CFI 158 .cfa: sp 36 + +STACK CFI 15c .cfa: sp 56 + +STACK CFI INIT 0 17c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 160 + +STACK CFI 16e .cfa: sp 36 + +STACK CFI INIT 0 8c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI c .cfa: sp 56 + +STACK CFI 78 .cfa: sp 20 + +STACK CFI INIT 0 50 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI e .cfa: sp 80 + +STACK CFI 48 .cfa: sp 24 + +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 12 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 0 6c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 10 .cfa: sp 88 + +STACK CFI 64 .cfa: sp 24 + +STACK CFI INIT 3faa4 194 .cfa: sp 0 + .ra: lr +STACK CFI 3faa8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3fab6 .cfa: sp 56 + +STACK CFI 3fc24 .cfa: sp 36 + +STACK CFI 3fc28 .cfa: sp 56 + +STACK CFI INIT 3fc38 58 .cfa: sp 0 + .ra: lr +STACK CFI 3fc3a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 3fc3e .cfa: sp 32 + +STACK CFI 3fc8e .cfa: sp 12 + +STACK CFI INIT 3fc90 68 .cfa: sp 0 + .ra: lr +STACK CFI 3fc94 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 3fca4 .cfa: sp 96 + +STACK CFI 3fcf0 .cfa: sp 28 + +STACK CFI INIT 3fcf8 b4 .cfa: sp 0 + .ra: lr +STACK CFI 3fcfc .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3fda8 .cfa: sp 32 + +STACK CFI INIT 3fdac 120 .cfa: sp 0 + .ra: lr +STACK CFI 3fdb0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3fdb4 .cfa: sp 160 + +STACK CFI 3fec0 .cfa: sp 36 + +STACK CFI INIT 3fecc 110 .cfa: sp 0 + .ra: lr +STACK CFI 3fed0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 3fedc .cfa: sp 136 + +STACK CFI 3ffc4 .cfa: sp 36 + +STACK CFI INIT 20424 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 20450 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 2047c 9e .cfa: sp 0 + .ra: lr +STACK CFI 20480 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 3ffdc 6e .cfa: sp 0 + .ra: lr +STACK CFI 3ffe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 4004a 78 .cfa: sp 0 + .ra: lr +STACK CFI 4004e .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 400be .cfa: sp 24 + +STACK CFI INIT 400c2 174 .cfa: sp 0 + .ra: lr +STACK CFI 400c6 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 400ce .cfa: sp 56 + +STACK CFI 40232 .cfa: sp 36 + +STACK CFI INIT 40238 8c .cfa: sp 0 + .ra: lr +STACK CFI 4023e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 4024e .cfa: sp 72 + +STACK CFI 402bc .cfa: sp 24 + +STACK CFI INIT 402c4 104 .cfa: sp 0 + .ra: lr +STACK CFI 402c8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 402d0 .cfa: sp 128 + +STACK CFI 403be .cfa: sp 36 + +STACK CFI INIT 403c8 36c .cfa: sp 0 + .ra: lr +STACK CFI 403cc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 403da .cfa: sp 296 + +STACK CFI 4070a .cfa: sp 36 + +STACK CFI INIT 40734 36 .cfa: sp 0 + .ra: lr +STACK CFI 40736 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 4076a 5a .cfa: sp 0 + .ra: lr +STACK CFI 4076e .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 407c4 14c .cfa: sp 0 + .ra: lr +STACK CFI 407c8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 407ca .cfa: sp 56 + +STACK CFI 408f8 .cfa: sp 36 + +STACK CFI 408fc .cfa: sp 56 + +STACK CFI INIT 40910 84 .cfa: sp 0 + .ra: lr +STACK CFI 40916 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 40920 .cfa: sp 64 + +STACK CFI 4098c .cfa: sp 24 + +STACK CFI INIT 40994 c4 .cfa: sp 0 + .ra: lr +STACK CFI 40998 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 409aa .cfa: sp 72 + +STACK CFI 40a50 .cfa: sp 32 + +STACK CFI INIT 40a58 180 .cfa: sp 0 + .ra: lr +STACK CFI 40a5c .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 40a66 .cfa: sp 88 + +STACK CFI 40bb2 .cfa: sp 32 + +STACK CFI INIT 40bd8 78 .cfa: sp 0 + .ra: lr +STACK CFI 40bdc .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 40be0 .cfa: sp 104 + +STACK CFI 40c48 .cfa: sp 32 + +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 104 + +STACK CFI 70 .cfa: sp 28 + +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 8 .cfa: sp 104 + +STACK CFI 70 .cfa: sp 32 + +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI c .cfa: sp 96 + +STACK CFI 74 .cfa: sp 32 + +STACK CFI INIT 40c50 b4 .cfa: sp 0 + .ra: lr +STACK CFI 40c56 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 40c64 .cfa: sp 64 + +STACK CFI 40cf0 .cfa: sp 28 + +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 14 .cfa: sp 64 + +STACK CFI a0 .cfa: sp 28 + +STACK CFI INIT 192a0 64 .cfa: sp 0 + .ra: lr +STACK CFI 192a2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 19304 90 .cfa: sp 0 + .ra: lr +STACK CFI 19308 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1596c 1e0 .cfa: sp 0 + .ra: lr +STACK CFI 15970 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 15abe .cfa: sp 24 + +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 2c924 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 40d04 e .cfa: sp 0 + .ra: lr +STACK CFI 40d06 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 18 .cfa: sp 4 + +STACK CFI INIT 40d14 5c .cfa: sp 0 + .ra: lr +STACK CFI 40d16 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 2a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 20 + +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 40d70 12 .cfa: sp 0 + .ra: lr +STACK CFI 40d72 .cfa: sp 8 + +STACK CFI 40d80 .cfa: sp 0 + +STACK CFI INIT 40d82 16 .cfa: sp 0 + .ra: lr +STACK CFI 40d84 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 40d94 .cfa: sp 4 + +STACK CFI INIT 39cd8 2a .cfa: sp 0 + .ra: lr +STACK CFI 39cda .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 24f22 7a .cfa: sp 0 + .ra: lr +STACK CFI 24f24 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39e04 c .cfa: sp 0 + .ra: lr +STACK CFI 39e06 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39e72 2e .cfa: sp 0 + .ra: lr +STACK CFI 39e74 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 39e9e .cfa: sp 16 + +STACK CFI INIT 324f8 22 .cfa: sp 0 + .ra: lr +STACK CFI 324fa .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 3a25e 22 .cfa: sp 0 + .ra: lr +STACK CFI 3a260 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 40d98 30 .cfa: sp 0 + .ra: lr +STACK CFI 40d9a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 40dc2 .cfa: sp 8 + +STACK CFI INIT 40dc8 58 .cfa: sp 0 + .ra: lr +STACK CFI 40dca .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 40dce .cfa: sp 48 + +STACK CFI 40e10 .cfa: sp 12 + +STACK CFI INIT 40e20 34 .cfa: sp 0 + .ra: lr +STACK CFI 40e22 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 3a480 34 .cfa: sp 0 + .ra: lr +STACK CFI 3a482 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 0 2e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2c .cfa: sp 16 + +STACK CFI INIT 20330 98 .cfa: sp 0 + .ra: lr +STACK CFI 20332 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 20334 .cfa: sp 80 + +STACK CFI 203c6 .cfa: sp 20 + +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 40e54 98 .cfa: sp 0 + .ra: lr +STACK CFI 40e58 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 40eda .cfa: sp 24 + +STACK CFI INIT 175b2 98 .cfa: sp 0 + .ra: lr +STACK CFI 175b6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17646 .cfa: sp 28 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 1772c d8 .cfa: sp 0 + .ra: lr +STACK CFI 17732 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17800 .cfa: sp 24 + +STACK CFI INIT 40eec 6c .cfa: sp 0 + .ra: lr +STACK CFI 40ef0 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 40f46 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI 40f4a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 3a1a8 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 3a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 40f58 a8 .cfa: sp 0 + .ra: lr +STACK CFI 40f5c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 40f6a .cfa: sp 80 + +STACK CFI 40ff4 .cfa: sp 36 + +STACK CFI INIT 41000 2ac .cfa: sp 0 + .ra: lr +STACK CFI 41004 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 41010 .cfa: sp 120 + +STACK CFI 41244 .cfa: sp 32 + +STACK CFI INIT 0 bc .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI ac .cfa: sp 32 + +STACK CFI b0 .cfa: sp 40 + +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 90 .cfa: sp 24 + +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 42 .cfa: sp 20 + +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 42 .cfa: sp 20 + +STACK CFI INIT 412ac 2c8 .cfa: sp 0 + .ra: lr +STACK CFI 412b0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 412bc .cfa: sp 480 + +STACK CFI 41520 .cfa: sp 32 + +STACK CFI INIT 41574 e0 .cfa: sp 0 + .ra: lr +STACK CFI 41578 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 41580 .cfa: sp 224 + +STACK CFI INIT 41654 e8 .cfa: sp 0 + .ra: lr +STACK CFI 41658 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 41660 .cfa: sp 224 + +STACK CFI 4171e .cfa: sp 16 + +STACK CFI INIT 4173c 3bc .cfa: sp 0 + .ra: lr +STACK CFI 41740 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 41744 .cfa: sp 240 + +STACK CFI 41a6a .cfa: sp 24 + +STACK CFI INIT 41af8 184 .cfa: sp 0 + .ra: lr +STACK CFI 41afe .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 41b08 .cfa: sp 256 + +STACK CFI INIT 41c7c c8 .cfa: sp 0 + .ra: lr +STACK CFI 41c80 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 41c8c .cfa: sp 200 + +STACK CFI 41d26 .cfa: sp 16 + +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 41d44 18 .cfa: sp 0 + .ra: lr +STACK CFI 41d46 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 41d5c 12 .cfa: sp 0 + .ra: lr +STACK CFI 41d5e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 41d44 18 .cfa: sp 0 + .ra: lr +STACK CFI 41d46 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 41d5c 12 .cfa: sp 0 + .ra: lr +STACK CFI 41d5e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 41d70 1a8 .cfa: sp 0 + .ra: lr +STACK CFI 41d74 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 41d80 .cfa: sp 200 + +STACK CFI 41ee8 .cfa: sp 36 + +STACK CFI INIT 3fcf8 b4 .cfa: sp 0 + .ra: lr +STACK CFI 3fcfc .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3fda8 .cfa: sp 32 + +STACK CFI INIT 41f18 30 .cfa: sp 0 + .ra: lr +STACK CFI 41f1a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 41f1e .cfa: sp 40 + +STACK CFI 41f46 .cfa: sp 20 + +STACK CFI INIT 41f48 22 .cfa: sp 0 + .ra: lr +STACK CFI 41f4a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 41f68 .cfa: sp 12 + +STACK CFI INIT 41f6c 98c .cfa: sp 0 + .ra: lr +STACK CFI 41f70 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 41f76 .cfa: sp 528 + +STACK CFI 42896 .cfa: sp 36 + +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI c4 .cfa: sp 36 + +STACK CFI c8 .cfa: sp 48 + +STACK CFI INIT 40910 84 .cfa: sp 0 + .ra: lr +STACK CFI 40916 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 40920 .cfa: sp 64 + +STACK CFI 4098c .cfa: sp 24 + +STACK CFI INIT 428f8 16c .cfa: sp 0 + .ra: lr +STACK CFI 428fc .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 4290c .cfa: sp 136 + +STACK CFI 42a46 .cfa: sp 28 + +STACK CFI INIT 15b4c a8 .cfa: sp 0 + .ra: lr +STACK CFI 15b4e .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 15bc8 .cfa: sp 20 + +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 42a64 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 42a6c 30 .cfa: sp 0 + .ra: lr +STACK CFI 42a6e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 42a72 .cfa: sp 120 + +STACK CFI 42a96 .cfa: sp 8 + +STACK CFI INIT 42a9c 40 .cfa: sp 0 + .ra: lr +STACK CFI 42a9e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 42aa2 .cfa: sp 120 + +STACK CFI 42ad4 .cfa: sp 8 + +STACK CFI INIT 0 1a .cfa: sp 0 + .ra: lr +STACK CFI INIT 42adc e .cfa: sp 0 + .ra: lr +STACK CFI INIT 42aea 1a .cfa: sp 0 + .ra: lr +STACK CFI INIT 42b04 20 .cfa: sp 0 + .ra: lr +STACK CFI 42b06 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 42b1c .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 42b20 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16db4 38 .cfa: sp 0 + .ra: lr +STACK CFI 16db6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 16de6 .cfa: sp 8 + +STACK CFI INIT 3a25e 22 .cfa: sp 0 + .ra: lr +STACK CFI 3a260 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 3a480 34 .cfa: sp 0 + .ra: lr +STACK CFI 3a482 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI da .cfa: sp 20 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI dc .cfa: sp 24 + +STACK CFI INIT 3a1a8 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 179ec 1a .cfa: sp 0 + .ra: lr +STACK CFI 179ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 17a02 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 42b24 6c .cfa: sp 0 + .ra: lr +STACK CFI 42b26 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 42b30 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI 42b38 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 42b86 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI INIT 3a3b8 12 .cfa: sp 0 + .ra: lr +STACK CFI 3a3ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 42b90 78 .cfa: sp 0 + .ra: lr +STACK CFI 42b92 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 42b98 .cfa: sp 4144 + +STACK CFI 42b9e .cfa: sp 4152 + +STACK CFI 42bfe .cfa: sp 16 + +STACK CFI INIT 42c08 58 .cfa: sp 0 + .ra: lr +STACK CFI 42c0a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 42c0e .cfa: sp 48 + +STACK CFI 42c58 .cfa: sp 16 + +STACK CFI INIT 42c60 64 .cfa: sp 0 + .ra: lr +STACK CFI 42c62 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 42c66 .cfa: sp 64 + +STACK CFI 42cbc .cfa: sp 20 + +STACK CFI INIT 42cc4 14c .cfa: sp 0 + .ra: lr +STACK CFI 42cc8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 42cd4 .cfa: sp 120 + +STACK CFI 42e08 .cfa: sp 36 + +STACK CFI INIT 42e10 90 .cfa: sp 0 + .ra: lr +STACK CFI 42e14 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 42e18 .cfa: sp 80 + +STACK CFI 42e92 .cfa: sp 24 + +STACK CFI INIT 42ea0 70 .cfa: sp 0 + .ra: lr +STACK CFI 42ea2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 42ea6 .cfa: sp 80 + +STACK CFI 42f0a .cfa: sp 20 + +STACK CFI INIT 0 ca .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI c6 .cfa: sp 24 + +STACK CFI INIT 0 a0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 10 .cfa: sp 96 + +STACK CFI 94 .cfa: sp 32 + +STACK CFI INIT 42f10 160 .cfa: sp 0 + .ra: lr +STACK CFI 42f14 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 42f18 .cfa: sp 200 + +STACK CFI 4305a .cfa: sp 36 + +STACK CFI INIT 43070 74 .cfa: sp 0 + .ra: lr +STACK CFI 43074 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 43080 .cfa: sp 72 + +STACK CFI 430d8 .cfa: sp 32 + +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 430e4 18 .cfa: sp 0 + .ra: lr +STACK CFI 430e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 430fc c .cfa: sp 0 + .ra: lr +STACK CFI INIT 43108 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 43114 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 43120 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 12 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 18 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 43140 b8 .cfa: sp 0 + .ra: lr +STACK CFI 43142 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 43184 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 4318a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 43196 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 4319c .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 431f8 5a .cfa: sp 0 + .ra: lr +STACK CFI 431fa .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 43250 .cfa: sp 20 + +STACK CFI INIT 43252 60 .cfa: sp 0 + .ra: lr +STACK CFI 43258 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 432b2 34 .cfa: sp 0 + .ra: lr +STACK CFI 432b4 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 432c8 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 432cc .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 10 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 14 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 432e6 16 .cfa: sp 0 + .ra: lr +STACK CFI 432e8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 432f6 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 432fa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 432fc 16 .cfa: sp 0 + .ra: lr +STACK CFI 432fe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4330e .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 43314 18 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16aec 1e .cfa: sp 0 + .ra: lr +STACK CFI 16aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4332c 1e .cfa: sp 0 + .ra: lr +STACK CFI 4332e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 43348 .cfa: sp 12 + +STACK CFI INIT 4334a 30 .cfa: sp 0 + .ra: lr +STACK CFI 4334c .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 43378 .cfa: sp 8 + +STACK CFI INIT 0 50 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 44 .cfa: sp 12 + +STACK CFI INIT 16db4 38 .cfa: sp 0 + .ra: lr +STACK CFI 16db6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 16de6 .cfa: sp 8 + +STACK CFI INIT 3a25e 22 .cfa: sp 0 + .ra: lr +STACK CFI 3a260 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 4337a 52 .cfa: sp 0 + .ra: lr +STACK CFI 4337e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 433cc 68 .cfa: sp 0 + .ra: lr +STACK CFI 433ce .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 43434 14 .cfa: sp 0 + .ra: lr +STACK CFI 43436 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 386b4 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 2a .cfa: sp 16 + +STACK CFI INIT 0 ae .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI ac .cfa: sp 20 + +STACK CFI INIT 43448 1c .cfa: sp 0 + .ra: lr +STACK CFI 4344a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5a .cfa: sp 20 + +STACK CFI INIT 386ba 20 .cfa: sp 0 + .ra: lr +STACK CFI 386bc .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 386ca .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 +STACK CFI 386d0 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 43464 46 .cfa: sp 0 + .ra: lr +STACK CFI 43466 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 434a8 .cfa: sp 8 + +STACK CFI INIT 434ac 30 .cfa: sp 0 + .ra: lr +STACK CFI 434ae .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 b6 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI b2 .cfa: sp 36 + +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI c .cfa: sp 48 + +STACK CFI 38 .cfa: sp 16 + +STACK CFI INIT 434dc 17c .cfa: sp 0 + .ra: lr +STACK CFI 434e0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 434ee .cfa: sp 72 + +STACK CFI 4361e .cfa: sp 32 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI dc .cfa: sp 24 + +STACK CFI INIT 3a1a8 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 ca .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI c6 .cfa: sp 24 + +STACK CFI INIT 43658 e0 .cfa: sp 0 + .ra: lr +STACK CFI 4365c .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 43660 .cfa: sp 144 + +STACK CFI 43722 .cfa: sp 32 + +STACK CFI INIT 43738 b0 .cfa: sp 0 + .ra: lr +STACK CFI 4373c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 43748 .cfa: sp 64 + +STACK CFI 437c2 .cfa: sp 28 + +STACK CFI INIT 437e8 140 .cfa: sp 0 + .ra: lr +STACK CFI 437ec .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 437f0 .cfa: sp 88 + +STACK CFI 4390a .cfa: sp 36 + +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI INIT 43928 18 .cfa: sp 0 + .ra: lr +STACK CFI INIT 43940 c8 .cfa: sp 0 + .ra: lr +STACK CFI 43946 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 4394c .cfa: sp 112 + +STACK CFI 439f8 .cfa: sp 24 + +STACK CFI INIT 386da a6 .cfa: sp 0 + .ra: lr +STACK CFI 386dc .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 3877e .cfa: sp 16 + +STACK CFI INIT 43a08 a4 .cfa: sp 0 + .ra: lr +STACK CFI 43a0c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 43a16 .cfa: sp 56 + +STACK CFI 43a9c .cfa: sp 24 + +STACK CFI INIT 43aac 54 .cfa: sp 0 + .ra: lr +STACK CFI 43aae .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 43ab8 .cfa: sp 48 + +STACK CFI 43af4 .cfa: sp 16 + +STACK CFI INIT 43b00 d0 .cfa: sp 0 + .ra: lr +STACK CFI 43b04 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 43b0e .cfa: sp 88 + +STACK CFI 43bbc .cfa: sp 24 + +STACK CFI INIT 43bd0 44 .cfa: sp 0 + .ra: lr +STACK CFI 43bd2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 43bdc .cfa: sp 48 + +STACK CFI 43c0e .cfa: sp 16 + +STACK CFI INIT 0 3bc .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI e .cfa: sp 120 + +STACK CFI 34a .cfa: sp 36 + +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 15bf4 24 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15c18 2c .cfa: sp 0 + .ra: lr +STACK CFI 15c1a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 15c3c .cfa: sp 12 + +STACK CFI INIT 43c14 24 .cfa: sp 0 + .ra: lr +STACK CFI 43c16 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 43c38 24 .cfa: sp 0 + .ra: lr +STACK CFI 43c3a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 43c5c 2a .cfa: sp 0 + .ra: lr +STACK CFI 43c60 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 43c88 d0 .cfa: sp 0 + .ra: lr +STACK CFI 43c8a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 43c8e .cfa: sp 40 + +STACK CFI 43d32 .cfa: sp 20 + +STACK CFI INIT 43d58 214 .cfa: sp 0 + .ra: lr +STACK CFI 43d5c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 43d62 .cfa: sp 64 + +STACK CFI 43f2e .cfa: sp 24 + +STACK CFI INIT 43f6c 50 .cfa: sp 0 + .ra: lr +STACK CFI 43f6e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 43fbc 7c .cfa: sp 0 + .ra: lr +STACK CFI 43fbe .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 4401e .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI 44028 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 44038 268 .cfa: sp 0 + .ra: lr +STACK CFI 4403c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 44040 .cfa: sp 72 + +STACK CFI 4427c .cfa: sp 28 + +STACK CFI INIT 442a0 a0 .cfa: sp 0 + .ra: lr +STACK CFI 442a6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 442b6 .cfa: sp 912 + +STACK CFI 44336 .cfa: sp 24 + +STACK CFI INIT 44340 22 .cfa: sp 0 + .ra: lr +STACK CFI 44342 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4435c .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 r6: r6 r7: r7 +STACK CFI 44360 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI a .cfa: sp 904 + +STACK CFI 4a .cfa: sp 24 + +STACK CFI INIT 44364 134 .cfa: sp 0 + .ra: lr +STACK CFI 44368 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 4436e .cfa: sp 48 + +STACK CFI 44474 .cfa: sp 28 + +STACK CFI INIT 44498 74 .cfa: sp 0 + .ra: lr +STACK CFI 4449a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 44502 .cfa: sp 16 + +STACK CFI INIT 4450c 4e .cfa: sp 0 + .ra: lr +STACK CFI 4450e .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 44526 .cfa: sp 16 + +STACK CFI 4452a .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI 4452e .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 44558 .cfa: sp 16 + +STACK CFI INIT 4455a 1e .cfa: sp 0 + .ra: lr +STACK CFI 4455c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 44578 c0 .cfa: sp 0 + .ra: lr +STACK CFI 4457c .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 44586 .cfa: sp 912 + +STACK CFI 44632 .cfa: sp 20 + +STACK CFI INIT 44638 a4 .cfa: sp 0 + .ra: lr +STACK CFI 4463c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 44644 .cfa: sp 584 + +STACK CFI 446d4 .cfa: sp 24 + +STACK CFI INIT 446dc 50 .cfa: sp 0 + .ra: lr +STACK CFI 446de .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4472a .cfa: sp 8 + +STACK CFI INIT 4472c 34 .cfa: sp 0 + .ra: lr +STACK CFI 44730 .cfa: sp 8 + +STACK CFI 44758 .cfa: sp 0 + +STACK CFI 4475c .cfa: sp 8 + +STACK CFI 4475e .cfa: sp 0 + +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 44760 184 .cfa: sp 0 + .ra: lr +STACK CFI 44762 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 44768 .cfa: sp 40 + +STACK CFI 448be .cfa: sp 16 + +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 0 2e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 448e4 98 .cfa: sp 0 + .ra: lr +STACK CFI 448e8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 448f8 .cfa: sp 120 + +STACK CFI 44972 .cfa: sp 36 + +STACK CFI INIT 0 88 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 10 .cfa: sp 224 + +STACK CFI 80 .cfa: sp 28 + +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 4497c 50 .cfa: sp 0 + .ra: lr +STACK CFI 4497e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 1772c d8 .cfa: sp 0 + .ra: lr +STACK CFI 17732 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 17800 .cfa: sp 24 + +STACK CFI INIT 0 4e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 c2 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI be .cfa: sp 24 + +STACK CFI INIT 449cc b0 .cfa: sp 0 + .ra: lr +STACK CFI 449d0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 449d4 .cfa: sp 168 + +STACK CFI 44a6a .cfa: sp 28 + +STACK CFI INIT 44a7c 48 .cfa: sp 0 + .ra: lr +STACK CFI 44a7e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 44ac4 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 44ad4 a .cfa: sp 0 + .ra: lr +STACK CFI INIT 44ae0 30 .cfa: sp 0 + .ra: lr +STACK CFI 44ae2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 44b06 .cfa: sp 4 + +STACK CFI INIT 44b10 4c .cfa: sp 0 + .ra: lr +STACK CFI 44b12 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 44b50 .cfa: sp 16 + +STACK CFI INIT 44b5c 2c .cfa: sp 0 + .ra: lr +STACK CFI 44b5e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 44b78 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 44b88 16c .cfa: sp 0 + .ra: lr +STACK CFI 44b8c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 44b92 .cfa: sp 584 + +STACK CFI 44cd6 .cfa: sp 28 + +STACK CFI INIT 44cf4 444 .cfa: sp 0 + .ra: lr +STACK CFI 44cf8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 44d06 .cfa: sp 1016 + +STACK CFI 4512c .cfa: sp 36 + +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 45138 5a .cfa: sp 0 + .ra: lr +STACK CFI 4513c .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 45194 38 .cfa: sp 0 + .ra: lr +STACK CFI 45196 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 451c4 .cfa: sp 12 + +STACK CFI INIT 451cc 22 .cfa: sp 0 + .ra: lr +STACK CFI 451ce .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 451e6 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 451ec .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 451f0 40 .cfa: sp 0 + .ra: lr +STACK CFI 451f8 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 22e5c 12 .cfa: sp 0 + .ra: lr +STACK CFI 22e5e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 328fc a2 .cfa: sp 0 + .ra: lr +STACK CFI 32900 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 45230 50 .cfa: sp 0 + .ra: lr +STACK CFI 45232 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 45280 d0 .cfa: sp 0 + .ra: lr +STACK CFI 45284 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4533e .cfa: sp 36 + +STACK CFI INIT 45350 1f4 .cfa: sp 0 + .ra: lr +STACK CFI 45354 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4536a .cfa: sp 304 + +STACK CFI 45520 .cfa: sp 36 + +STACK CFI INIT 43c38 24 .cfa: sp 0 + .ra: lr +STACK CFI 43c3a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 45544 114 .cfa: sp 0 + .ra: lr +STACK CFI 45548 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4554c .cfa: sp 344 + +STACK CFI 45644 .cfa: sp 36 + +STACK CFI INIT 45658 c4 .cfa: sp 0 + .ra: lr +STACK CFI 4565c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 45662 .cfa: sp 680 + +STACK CFI 4570e .cfa: sp 28 + +STACK CFI INIT 2c90c 18 .cfa: sp 0 + .ra: lr +STACK CFI 2c910 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16ac0 18 .cfa: sp 0 + .ra: lr +STACK CFI 16ac6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 328fc a2 .cfa: sp 0 + .ra: lr +STACK CFI 32900 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 20f46 12 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4571c 40 .cfa: sp 0 + .ra: lr +STACK CFI 4571e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4575c 80 .cfa: sp 0 + .ra: lr +STACK CFI 45760 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 457b6 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 +STACK CFI 457ba .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 457d0 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 +STACK CFI 457d4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 457dc b8 .cfa: sp 0 + .ra: lr +STACK CFI 457e0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 457e4 .cfa: sp 296 + +STACK CFI 45886 .cfa: sp 24 + +STACK CFI INIT 45894 24 .cfa: sp 0 + .ra: lr +STACK CFI 45896 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 458b0 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 458b4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 458b8 2a .cfa: sp 0 + .ra: lr +STACK CFI 458bc .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 458e4 38 .cfa: sp 0 + .ra: lr +STACK CFI 458e6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 4591c 34 .cfa: sp 0 + .ra: lr +STACK CFI 4591e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 45944 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 45948 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 45950 130 .cfa: sp 0 + .ra: lr +STACK CFI 45954 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4595e .cfa: sp 336 + +STACK CFI 45a70 .cfa: sp 36 + +STACK CFI INIT 45a80 94 .cfa: sp 0 + .ra: lr +STACK CFI 45a84 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 3fcf8 b4 .cfa: sp 0 + .ra: lr +STACK CFI 3fcfc .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3fda8 .cfa: sp 32 + +STACK CFI INIT 45b14 98 .cfa: sp 0 + .ra: lr +STACK CFI 45b16 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 45ba2 .cfa: sp 16 + +STACK CFI INIT 3fcf8 b4 .cfa: sp 0 + .ra: lr +STACK CFI 3fcfc .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 3fda8 .cfa: sp 32 + +STACK CFI INIT 45bac 374 .cfa: sp 0 + .ra: lr +STACK CFI 45bb0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 45bb4 .cfa: sp 368 + +STACK CFI 45f0a .cfa: sp 36 + +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 45f20 24 .cfa: sp 0 + .ra: lr +STACK CFI 45f22 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 45f44 52 .cfa: sp 0 + .ra: lr +STACK CFI 45f48 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 45f92 .cfa: sp 36 + +STACK CFI INIT 43c38 24 .cfa: sp 0 + .ra: lr +STACK CFI 43c3a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 24cb0 12 .cfa: sp 0 + .ra: lr +STACK CFI 24cb2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 45f98 78 .cfa: sp 0 + .ra: lr +STACK CFI 45f9c .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 46008 .cfa: sp 32 + +STACK CFI INIT 46010 42 .cfa: sp 0 + .ra: lr +STACK CFI 46012 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 328fc a2 .cfa: sp 0 + .ra: lr +STACK CFI 32900 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 46054 1b0 .cfa: sp 0 + .ra: lr +STACK CFI 4605a .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 46064 .cfa: sp 320 + +STACK CFI 461f0 .cfa: sp 36 + +STACK CFI INIT 46204 20 .cfa: sp 0 + .ra: lr +STACK CFI 46206 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 46224 a0 .cfa: sp 0 + .ra: lr +STACK CFI 46228 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 462c4 164 .cfa: sp 0 + .ra: lr +STACK CFI 462c8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 462cc .cfa: sp 336 + +STACK CFI 46412 .cfa: sp 36 + +STACK CFI INIT 46428 be .cfa: sp 0 + .ra: lr +STACK CFI 4642c .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 464e2 .cfa: sp 32 + +STACK CFI INIT 464e6 fe .cfa: sp 0 + .ra: lr +STACK CFI 464ea .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 464f2 .cfa: sp 48 + +STACK CFI 465e0 .cfa: sp 28 + +STACK CFI INIT 465e4 24 .cfa: sp 0 + .ra: lr +STACK CFI 465e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 43c38 24 .cfa: sp 0 + .ra: lr +STACK CFI 43c3a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 46608 e4 .cfa: sp 0 + .ra: lr +STACK CFI 4660c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 46612 .cfa: sp 984 + +STACK CFI 466e0 .cfa: sp 36 + +STACK CFI INIT 466ec 36 .cfa: sp 0 + .ra: lr +STACK CFI 466ee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 46718 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 4671e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 46722 2a .cfa: sp 0 + .ra: lr +STACK CFI 46724 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 4674c 36 .cfa: sp 0 + .ra: lr +STACK CFI 46750 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 46782 28 .cfa: sp 0 + .ra: lr +STACK CFI 46786 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 467ac 128 .cfa: sp 0 + .ra: lr +STACK CFI 467b0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 467c0 .cfa: sp 880 + +STACK CFI 468c6 .cfa: sp 36 + +STACK CFI INIT 468d4 26 .cfa: sp 0 + .ra: lr +STACK CFI 468d6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 328fc a2 .cfa: sp 0 + .ra: lr +STACK CFI 32900 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 13a40 e0 .cfa: sp 0 + .ra: lr +STACK CFI 13a44 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 13a48 .cfa: sp 56 + +STACK CFI 13b1c .cfa: sp 32 + +STACK CFI INIT 13b20 40 .cfa: sp 0 + .ra: lr +STACK CFI 13b22 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 13b32 .cfa: sp 288 + +STACK CFI 13b5a .cfa: sp 20 + +STACK CFI INIT 0 f0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI a .cfa: sp 568 + +STACK CFI e6 .cfa: sp 36 + +STACK CFI INIT 0 100 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r3: .cfa -40 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI INIT 468fc 340 .cfa: sp 0 + .ra: lr +STACK CFI 46900 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4690a .cfa: sp 616 + +STACK CFI 46c1c .cfa: sp 36 + +STACK CFI INIT 46c3c 12 .cfa: sp 0 + .ra: lr +STACK CFI 46c40 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 46c4a .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 46c4e 1e .cfa: sp 0 + .ra: lr +STACK CFI 46c50 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 46c6c 14 .cfa: sp 0 + .ra: lr +STACK CFI 46c6e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 46c7c .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 46c80 1a .cfa: sp 0 + .ra: lr +STACK CFI 46c82 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 46c9c 5c .cfa: sp 0 + .ra: lr +STACK CFI 46ca0 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 25018 22 .cfa: sp 0 + .ra: lr +STACK CFI 2501e .cfa: sp 16 + +STACK CFI 25038 .cfa: sp 0 + +STACK CFI INIT 2503a 1a .cfa: sp 0 + .ra: lr +STACK CFI 2503c .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 22 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 16 + +STACK CFI 20 .cfa: sp 0 + +STACK CFI INIT 25054 1c .cfa: sp 0 + .ra: lr +STACK CFI 25056 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 46cf8 ac .cfa: sp 0 + .ra: lr +STACK CFI 46cfc .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 46da4 32 .cfa: sp 0 + .ra: lr +STACK CFI 46da6 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 46dac .cfa: sp 32 + +STACK CFI 46dd4 .cfa: sp 12 + +STACK CFI INIT 46dd6 c2 .cfa: sp 0 + .ra: lr +STACK CFI 46dda .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 46de2 .cfa: sp 72 + +STACK CFI 46e94 .cfa: sp 28 + +STACK CFI INIT 46e98 388 .cfa: sp 0 + .ra: lr +STACK CFI 46e9c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 46eb0 .cfa: sp 816 + +STACK CFI 47216 .cfa: sp 36 + +STACK CFI INIT 47220 8a .cfa: sp 0 + .ra: lr +STACK CFI 47224 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 4722c .cfa: sp 80 + +STACK CFI 472a6 .cfa: sp 28 + +STACK CFI INIT 472aa b0 .cfa: sp 0 + .ra: lr +STACK CFI 472ae .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 472b4 .cfa: sp 48 + +STACK CFI 4733a .cfa: sp 28 + +STACK CFI 4733e .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 r9: r9 +STACK CFI 47342 .cfa: sp 48 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 47356 .cfa: sp 28 + +STACK CFI INIT 4735c ac .cfa: sp 0 + .ra: lr +STACK CFI 47360 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 473fe .cfa: sp 32 + +STACK CFI INIT 47408 800 .cfa: sp 0 + .ra: lr +STACK CFI 4740c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4741a .cfa: sp 712 + +STACK CFI 47c04 .cfa: sp 36 + +STACK CFI INIT 47c08 a8 .cfa: sp 0 + .ra: lr +STACK CFI 47c0c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 47c0e .cfa: sp 184 + +STACK CFI 47ca6 .cfa: sp 24 + +STACK CFI INIT 47cb0 52 .cfa: sp 0 + .ra: lr +STACK CFI 47cb4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 47cb6 .cfa: sp 72 + +STACK CFI 47cfe .cfa: sp 28 + +STACK CFI INIT 47d02 52 .cfa: sp 0 + .ra: lr +STACK CFI 47d06 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 47d10 .cfa: sp 72 + +STACK CFI 47d50 .cfa: sp 28 + +STACK CFI INIT 47d54 20 .cfa: sp 0 + .ra: lr +STACK CFI 47d56 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 47d72 .cfa: sp 8 + +STACK CFI INIT 0 26 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 32 + +STACK CFI 24 .cfa: sp 12 + +STACK CFI INIT 47d74 26 .cfa: sp 0 + .ra: lr +STACK CFI 47d76 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 47d7c .cfa: sp 32 + +STACK CFI 47d98 .cfa: sp 12 + +STACK CFI INIT 47d9a 26 .cfa: sp 0 + .ra: lr +STACK CFI 47d9c .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 47dbe .cfa: sp 16 + +STACK CFI INIT 47dc0 a4 .cfa: sp 0 + .ra: lr +STACK CFI 47dc4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 47dce .cfa: sp 216 + +STACK CFI 47e5c .cfa: sp 28 + +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 10 .cfa: sp 96 + +STACK CFI 58 .cfa: sp 24 + +STACK CFI INIT 47e64 12 .cfa: sp 0 + .ra: lr +STACK CFI INIT 47e76 34 .cfa: sp 0 + .ra: lr +STACK CFI 47e78 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 47eaa 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 47eb2 4a .cfa: sp 0 + .ra: lr +STACK CFI 47eb4 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 47efc 10 .cfa: sp 0 + .ra: lr +STACK CFI 47efe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 47f0c 44 .cfa: sp 0 + .ra: lr +STACK CFI 47f0e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 47f50 6e .cfa: sp 0 + .ra: lr +STACK CFI 47f54 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 47fbe 16 .cfa: sp 0 + .ra: lr +STACK CFI 47fc0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 47fd4 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 52 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 48 + +STACK CFI 50 .cfa: sp 20 + +STACK CFI INIT 46c6c 14 .cfa: sp 0 + .ra: lr +STACK CFI 46c6e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 46c7c .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 0 4e .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 4a .cfa: sp 28 + +STACK CFI INIT 47fda 4c .cfa: sp 0 + .ra: lr +STACK CFI 47fde .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 48022 .cfa: sp 28 + +STACK CFI INIT 0 aa .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 16 .cfa: sp 72 + +STACK CFI a6 .cfa: sp 32 + +STACK CFI INIT 48026 aa .cfa: sp 0 + .ra: lr +STACK CFI 4802a .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4803c .cfa: sp 72 + +STACK CFI 480cc .cfa: sp 32 + +STACK CFI INIT 36984 18 .cfa: sp 0 + .ra: lr +STACK CFI INIT 3699c 26 .cfa: sp 0 + .ra: lr +STACK CFI 3699e .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 480d0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 480d8 e .cfa: sp 0 + .ra: lr +STACK CFI 480da .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 480e6 c .cfa: sp 0 + .ra: lr +STACK CFI 480e8 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 480f2 26 .cfa: sp 0 + .ra: lr +STACK CFI 480f4 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 48118 2c .cfa: sp 0 + .ra: lr +STACK CFI 4811a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 48144 42 .cfa: sp 0 + .ra: lr +STACK CFI 48148 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 48184 .cfa: sp 16 + +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48186 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 4818e a .cfa: sp 0 + .ra: lr +STACK CFI INIT 48198 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 481a0 30 .cfa: sp 0 + .ra: lr +STACK CFI 481a2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 481d0 20 .cfa: sp 0 + .ra: lr +STACK CFI 481d2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 481ea .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI 481ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 481f0 c .cfa: sp 0 + .ra: lr +STACK CFI 481f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 481fc 28 .cfa: sp 0 + .ra: lr +STACK CFI 481fe .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 48224 5e .cfa: sp 0 + .ra: lr +STACK CFI 48228 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r3: .cfa -40 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI INIT 48282 34 .cfa: sp 0 + .ra: lr +STACK CFI 48286 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 482b4 .cfa: sp 16 + +STACK CFI INIT 482b8 18 .cfa: sp 0 + .ra: lr +STACK CFI 482bc .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 482d0 104 .cfa: sp 0 + .ra: lr +STACK CFI 482d4 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 483d0 .cfa: sp 36 + +STACK CFI INIT 483d4 8a .cfa: sp 0 + .ra: lr +STACK CFI 483d8 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 48460 5c .cfa: sp 0 + .ra: lr +STACK CFI 48462 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 484b6 .cfa: sp 16 + +STACK CFI INIT 484bc 138 .cfa: sp 0 + .ra: lr +STACK CFI 484c0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 484c2 .cfa: sp 48 + +STACK CFI 485e6 .cfa: sp 24 + +STACK CFI INIT 485f4 2a .cfa: sp 0 + .ra: lr +STACK CFI 485f8 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4861c .cfa: sp 12 + +STACK CFI INIT 48620 b4 .cfa: sp 0 + .ra: lr +STACK CFI 48624 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 48628 .cfa: sp 48 + +STACK CFI 486cc .cfa: sp 24 + +STACK CFI INIT 486d4 10 .cfa: sp 0 + .ra: lr +STACK CFI 486d6 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI 486e0 .cfa: sp 0 + .ra: .ra r3: r3 +STACK CFI INIT 486e4 54 .cfa: sp 0 + .ra: lr +STACK CFI 486e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 48738 60 .cfa: sp 0 + .ra: lr +STACK CFI 4873a .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 48790 .cfa: sp 16 + +STACK CFI INIT 48798 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 487a8 22 .cfa: sp 0 + .ra: lr +STACK CFI INIT 487ca 26 .cfa: sp 0 + .ra: lr +STACK CFI 487cc .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 487f0 32 .cfa: sp 0 + .ra: lr +STACK CFI 487f2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 48822 24 .cfa: sp 0 + .ra: lr +STACK CFI 48828 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 48846 36 .cfa: sp 0 + .ra: lr +STACK CFI 48848 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 4887c 1a .cfa: sp 0 + .ra: lr +STACK CFI INIT 48896 18 .cfa: sp 0 + .ra: lr +STACK CFI 4889a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 488ae 1a .cfa: sp 0 + .ra: lr +STACK CFI 488b2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 488c8 40 .cfa: sp 0 + .ra: lr +STACK CFI 488ca .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 48908 22 .cfa: sp 0 + .ra: lr +STACK CFI 4890a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 4892a e .cfa: sp 0 + .ra: lr +STACK CFI INIT 48938 22 .cfa: sp 0 + .ra: lr +STACK CFI 4893a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 4895a 20 .cfa: sp 0 + .ra: lr +STACK CFI 4895c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4897c 48 .cfa: sp 0 + .ra: lr +STACK CFI 4897e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 489ba .cfa: sp 8 + +STACK CFI INIT 43c38 24 .cfa: sp 0 + .ra: lr +STACK CFI 43c3a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 48186 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 489c4 2c .cfa: sp 0 + .ra: lr +STACK CFI 489c6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 489f0 c .cfa: sp 0 + .ra: lr +STACK CFI 489f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 489fc e4 .cfa: sp 0 + .ra: lr +STACK CFI 48a00 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 48a04 .cfa: sp 152 + +STACK CFI 48ad8 .cfa: sp 36 + +STACK CFI INIT 48ae0 12 .cfa: sp 0 + .ra: lr +STACK CFI 48ae4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 48af2 32 .cfa: sp 0 + .ra: lr +STACK CFI 48af4 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 48b24 48 .cfa: sp 0 + .ra: lr +STACK CFI 48b28 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 48b68 .cfa: sp 32 + +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 40 + +STACK CFI 2e .cfa: sp 12 + +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 16 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI a .cfa: sp 48 + +STACK CFI 90 .cfa: sp 20 + +STACK CFI INIT 0 be .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI ba .cfa: sp 32 + +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI e8 .cfa: sp 32 + +STACK CFI INIT 0 2a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 24 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 r7: r7 +STACK CFI 28 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 48 + +STACK CFI 66 .cfa: sp 20 + +STACK CFI INIT 0 6a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 48 + +STACK CFI 68 .cfa: sp 20 + +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 43c38 24 .cfa: sp 0 + .ra: lr +STACK CFI 43c3a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 48ba8 f8 .cfa: sp 0 + .ra: lr +STACK CFI 48baa .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 48bae .cfa: sp 96 + +STACK CFI 48c98 .cfa: sp 20 + +STACK CFI INIT 48ca0 20 .cfa: sp 0 + .ra: lr +STACK CFI 48ca2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48cc0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48cc4 24 .cfa: sp 0 + .ra: lr +STACK CFI 48cc8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 48ce8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48cec 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48cf0 94 .cfa: sp 0 + .ra: lr +STACK CFI 48cf2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 48d78 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 48d84 7a .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 90 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 0 72 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 ec .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 18 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI 1e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 48e00 118 .cfa: sp 0 + .ra: lr +STACK CFI 48e04 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 48e0e .cfa: sp 56 + +STACK CFI 48f08 .cfa: sp 36 + +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 0 fc .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 10 .cfa: sp 56 + +STACK CFI ec .cfa: sp 36 + +STACK CFI INIT 48f18 20 .cfa: sp 0 + .ra: lr +STACK CFI 48f1a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 48f38 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f48 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f4c 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f50 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f50 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f50 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f50 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f50 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f50 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f50 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f50 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 48f54 4a .cfa: sp 0 + .ra: lr +STACK CFI 48f56 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 48fa0 18 .cfa: sp 0 + .ra: lr +STACK CFI 48fa2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 48fb8 12 .cfa: sp 0 + .ra: lr +STACK CFI 48fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 10e .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 100 .cfa: sp 24 + +STACK CFI 104 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 r7: r7 r8: r8 +STACK CFI 108 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 10a .cfa: sp 24 + +STACK CFI INIT 48fcc 4c .cfa: sp 0 + .ra: lr +STACK CFI 48fce .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4900a .cfa: sp 8 + +STACK CFI INIT 49018 4c .cfa: sp 0 + .ra: lr +STACK CFI 4901a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 49056 .cfa: sp 8 + +STACK CFI INIT 49064 4c .cfa: sp 0 + .ra: lr +STACK CFI 49066 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 490a2 .cfa: sp 8 + +STACK CFI INIT 490b0 4c .cfa: sp 0 + .ra: lr +STACK CFI 490b2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 490ee .cfa: sp 8 + +STACK CFI INIT 490fc 4c .cfa: sp 0 + .ra: lr +STACK CFI 490fe .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4913a .cfa: sp 8 + +STACK CFI INIT 49148 4c .cfa: sp 0 + .ra: lr +STACK CFI 4914a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 49186 .cfa: sp 8 + +STACK CFI INIT 49194 4c .cfa: sp 0 + .ra: lr +STACK CFI 49196 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 491d2 .cfa: sp 8 + +STACK CFI INIT 491e0 4c .cfa: sp 0 + .ra: lr +STACK CFI 491e2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4921e .cfa: sp 8 + +STACK CFI INIT 4922c 170 .cfa: sp 0 + .ra: lr +STACK CFI 4922e .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 49232 .cfa: sp 48 + +STACK CFI 49378 .cfa: sp 20 + +STACK CFI INIT 0 bb4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 48 + +STACK CFI 966 .cfa: sp 24 + +STACK CFI INIT 4939c 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 16 + +STACK CFI INIT 493a4 44 .cfa: sp 0 + .ra: lr +STACK CFI 493a6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 493b2 .cfa: sp 40 + +STACK CFI 493de .cfa: sp 16 + +STACK CFI INIT 493e8 48 .cfa: sp 0 + .ra: lr +STACK CFI 493ea .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 493f4 .cfa: sp 56 + +STACK CFI 49424 .cfa: sp 16 + +STACK CFI INIT 49430 44 .cfa: sp 0 + .ra: lr +STACK CFI 49432 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 4943e .cfa: sp 48 + +STACK CFI 4946a .cfa: sp 16 + +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 386ba 20 .cfa: sp 0 + .ra: lr +STACK CFI 386bc .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 386ca .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 +STACK CFI 386d0 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49474 4a .cfa: sp 0 + .ra: lr +STACK CFI 49476 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 494bc .cfa: sp 12 + +STACK CFI INIT 0 b6 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI b2 .cfa: sp 36 + +STACK CFI INIT 494c0 18c .cfa: sp 0 + .ra: lr +STACK CFI 494c4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 494ce .cfa: sp 208 + +STACK CFI 49628 .cfa: sp 32 + +STACK CFI INIT 0 110 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 108 .cfa: sp 24 + +STACK CFI INIT 4964c 62 .cfa: sp 0 + .ra: lr +STACK CFI 4964e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 496ae c .cfa: sp 0 + .ra: lr +STACK CFI INIT 496ba 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 496ce 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 496d6 e .cfa: sp 0 + .ra: lr +STACK CFI INIT 496e4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 496ec c .cfa: sp 0 + .ra: lr +STACK CFI INIT 496f8 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49700 e .cfa: sp 0 + .ra: lr +STACK CFI INIT 4970e 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49714 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4971a e .cfa: sp 0 + .ra: lr +STACK CFI INIT 49728 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49730 18 .cfa: sp 0 + .ra: lr +STACK CFI 49732 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49748 12 .cfa: sp 0 + .ra: lr +STACK CFI 4974a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 49756 .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 0 3e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 3a .cfa: sp 0 + .ra: .ra r4: r4 +STACK CFI INIT 4975c 28 .cfa: sp 0 + .ra: lr +STACK CFI 4975e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49784 20 .cfa: sp 0 + .ra: lr +STACK CFI 49786 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 1c0 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ddc 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15de2 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 497a4 84 .cfa: sp 0 + .ra: lr +STACK CFI 497a6 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f9e 1a .cfa: sp 0 + .ra: lr +STACK CFI 15fa0 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 15fb4 .cfa: sp 4 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fd0 c .cfa: sp 0 + .ra: lr +STACK CFI 15fd2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49828 12 .cfa: sp 0 + .ra: lr +STACK CFI 4982a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4983a 12 .cfa: sp 0 + .ra: lr +STACK CFI 4983c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4984c 18 .cfa: sp 0 + .ra: lr +STACK CFI 4984e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49864 12 .cfa: sp 0 + .ra: lr +STACK CFI 49866 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16030 4c .cfa: sp 0 + .ra: lr +STACK CFI 16034 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 1607e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 16098 12 .cfa: sp 0 + .ra: lr +STACK CFI 1609a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49876 18 .cfa: sp 0 + .ra: lr +STACK CFI 49878 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 4988e 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49896 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 160c8 12 .cfa: sp 0 + .ra: lr +STACK CFI 160ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4989a 22 .cfa: sp 0 + .ra: lr +STACK CFI 4989c .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 498bc 4a .cfa: sp 0 + .ra: lr +STACK CFI 498be .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49906 54 .cfa: sp 0 + .ra: lr +STACK CFI 4990a .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 49956 .cfa: sp 24 + +STACK CFI INIT 4995c 4c .cfa: sp 0 + .ra: lr +STACK CFI 4995e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16a6c 54 .cfa: sp 0 + .ra: lr +STACK CFI 16a70 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 15fdc 54 .cfa: sp 0 + .ra: lr +STACK CFI 15fe0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 499a8 50 .cfa: sp 0 + .ra: lr +STACK CFI 499aa .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 499d0 .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI 499d4 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 499ec .cfa: sp 0 + .ra: .ra r4: r4 r5: r5 r6: r6 +STACK CFI 499f0 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 1e00e 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 499f8 38 .cfa: sp 0 + .ra: lr +STACK CFI 499fc .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 49a2e .cfa: sp 8 + +STACK CFI INIT 49a30 38 .cfa: sp 0 + .ra: lr +STACK CFI 49a34 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 49a66 .cfa: sp 12 + +STACK CFI INIT 49a68 28 .cfa: sp 0 + .ra: lr +STACK CFI 49a6c .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 49a8e .cfa: sp 8 + +STACK CFI INIT 2c924 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 49a90 12 .cfa: sp 0 + .ra: lr +STACK CFI 49a92 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49aa4 6c .cfa: sp 0 + .ra: lr +STACK CFI 49aa6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49b10 18 .cfa: sp 0 + .ra: lr +STACK CFI 49b12 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49b28 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49b30 16 .cfa: sp 0 + .ra: lr +STACK CFI 49b32 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49b48 20 .cfa: sp 0 + .ra: lr +STACK CFI 49b4a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49b68 2c .cfa: sp 0 + .ra: lr +STACK CFI 49b6a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49b94 22 .cfa: sp 0 + .ra: lr +STACK CFI 49b96 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49bb8 30 .cfa: sp 0 + .ra: lr +STACK CFI 49bba .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49be8 48 .cfa: sp 0 + .ra: lr +STACK CFI 49bea .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 49bf0 .cfa: sp 48 + +STACK CFI 49c2a .cfa: sp 16 + +STACK CFI INIT 49c30 4c .cfa: sp 0 + .ra: lr +STACK CFI 49c32 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49c7c 2c .cfa: sp 0 + .ra: lr +STACK CFI 49c7e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49ca8 2c .cfa: sp 0 + .ra: lr +STACK CFI 49caa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 1a .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 39934 12 .cfa: sp 0 + .ra: lr +STACK CFI 39936 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49cd4 34 .cfa: sp 0 + .ra: lr +STACK CFI 49cd6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 49d06 .cfa: sp 16 + +STACK CFI INIT 49d08 34 .cfa: sp 0 + .ra: lr +STACK CFI 49d0a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 49d3a .cfa: sp 16 + +STACK CFI INIT 39cc4 14 .cfa: sp 0 + .ra: lr +STACK CFI 39cc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49d3c 34 .cfa: sp 0 + .ra: lr +STACK CFI 49d3e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 49d6e .cfa: sp 16 + +STACK CFI INIT 0 34 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 32 .cfa: sp 16 + +STACK CFI INIT 2aa48 30 .cfa: sp 0 + .ra: lr +STACK CFI 2aa4a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 2aa4e .cfa: sp 48 + +STACK CFI 2aa76 .cfa: sp 12 + +STACK CFI INIT 0 50 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 170b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 170b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170c4 12 .cfa: sp 0 + .ra: lr +STACK CFI 170c6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 170d6 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 170e2 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39cc4 14 .cfa: sp 0 + .ra: lr +STACK CFI 39cc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49d70 18 .cfa: sp 0 + .ra: lr +STACK CFI 49d72 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49d88 3c .cfa: sp 0 + .ra: lr +STACK CFI 49d8a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49dc4 12 .cfa: sp 0 + .ra: lr +STACK CFI 49dc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49dd8 34 .cfa: sp 0 + .ra: lr +STACK CFI 49dda .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49e0c 12 .cfa: sp 0 + .ra: lr +STACK CFI 49e0e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 34 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 56 .cfa: sp 20 + +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 49e20 60 .cfa: sp 0 + .ra: lr +STACK CFI 49e28 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 49e7a .cfa: sp 16 + +STACK CFI INIT 39cc4 14 .cfa: sp 0 + .ra: lr +STACK CFI 39cc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 39cc4 14 .cfa: sp 0 + .ra: lr +STACK CFI 39cc6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49e80 2c .cfa: sp 0 + .ra: lr +STACK CFI 49e82 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49eac 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49eb4 12 .cfa: sp 0 + .ra: lr +STACK CFI 49eb6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49ec6 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49ece 18 .cfa: sp 0 + .ra: lr +STACK CFI 49ed0 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 1a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49ee8 50 .cfa: sp 0 + .ra: lr +STACK CFI 49eea .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49f38 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49f40 12 .cfa: sp 0 + .ra: lr +STACK CFI 49f42 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 49f52 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 49f5a 4a .cfa: sp 0 + .ra: lr +STACK CFI 49f5e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 49fa2 .cfa: sp 16 + +STACK CFI INIT 2aa48 30 .cfa: sp 0 + .ra: lr +STACK CFI 2aa4a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 2aa4e .cfa: sp 48 + +STACK CFI 2aa76 .cfa: sp 12 + +STACK CFI INIT 49fa4 34 .cfa: sp 0 + .ra: lr +STACK CFI 49fa6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 49fd8 30 .cfa: sp 0 + .ra: lr +STACK CFI 49fda .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 16bac 9c .cfa: sp 0 + .ra: lr +STACK CFI 16bb0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 16bbc .cfa: sp 48 + +STACK CFI 16c3e .cfa: sp 28 + +STACK CFI INIT 4a008 32 .cfa: sp 0 + .ra: lr +STACK CFI 4a00a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 4a03a 26 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4a060 e6 .cfa: sp 0 + .ra: lr +STACK CFI 4a064 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4a070 .cfa: sp 56 + +STACK CFI 4a142 .cfa: sp 36 + +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 28 .cfa: sp 8 + +STACK CFI INIT 16dec 18 .cfa: sp 0 + .ra: lr +STACK CFI 16dee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 42 .cfa: sp 12 + +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4c .cfa: sp 12 + +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 42 .cfa: sp 20 + +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 104 + +STACK CFI 52 .cfa: sp 20 + +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4a146 e .cfa: sp 0 + .ra: lr +STACK CFI 4a148 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4a154 e .cfa: sp 0 + .ra: lr +STACK CFI 4a156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4a162 e .cfa: sp 0 + .ra: lr +STACK CFI 4a164 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4a170 e .cfa: sp 0 + .ra: lr +STACK CFI 4a172 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4a17e e .cfa: sp 0 + .ra: lr +STACK CFI 4a180 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4a18c e .cfa: sp 0 + .ra: lr +STACK CFI 4a18e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4a19c 48 .cfa: sp 0 + .ra: lr +STACK CFI 4a19e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 4a1e4 50 .cfa: sp 0 + .ra: lr +STACK CFI 4a1e6 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4a1ea .cfa: sp 32 + +STACK CFI 4a224 .cfa: sp 12 + +STACK CFI INIT 4a234 c .cfa: sp 0 + .ra: lr +STACK CFI 4a236 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 4a240 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 b8 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 8a .cfa: sp 8 + +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 78 .cfa: sp 16 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 7a .cfa: sp 8 + +STACK CFI INIT 4a248 48 .cfa: sp 0 + .ra: lr +STACK CFI 4a24a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4a24e .cfa: sp 32 + +STACK CFI 4a282 .cfa: sp 12 + +STACK CFI INIT 0 a8 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 80 .cfa: sp 8 + +STACK CFI INIT 4a290 50 .cfa: sp 0 + .ra: lr +STACK CFI 4a292 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4a2d2 .cfa: sp 8 + +STACK CFI INIT 4a2e0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4a2e8 4c .cfa: sp 0 + .ra: lr +STACK CFI 4a2ea .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4a2ee .cfa: sp 32 + +STACK CFI 4a324 .cfa: sp 12 + +STACK CFI INIT 4a334 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 144 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 32 + +STACK CFI fc .cfa: sp 12 + +STACK CFI INIT 0 90 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI 76 .cfa: sp 20 + +STACK CFI INIT 4a33c 4c .cfa: sp 0 + .ra: lr +STACK CFI 4a33e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4a378 .cfa: sp 8 + +STACK CFI INIT 4a388 8c .cfa: sp 0 + .ra: lr +STACK CFI 4a38a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4a38e .cfa: sp 40 + +STACK CFI 4a3f8 .cfa: sp 20 + +STACK CFI INIT 4a414 8c .cfa: sp 0 + .ra: lr +STACK CFI 4a416 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4a41a .cfa: sp 40 + +STACK CFI 4a484 .cfa: sp 20 + +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 48 + +STACK CFI b8 .cfa: sp 24 + +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 48 + +STACK CFI b8 .cfa: sp 24 + +STACK CFI INIT 0 368 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI c .cfa: sp 80 + +STACK CFI 2ca .cfa: sp 20 + +STACK CFI INIT 0 1d0 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI e .cfa: sp 104 + +STACK CFI 180 .cfa: sp 36 + +STACK CFI INIT 0 d8 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI e .cfa: sp 96 + +STACK CFI c0 .cfa: sp 20 + +STACK CFI INIT 4a4a0 60 .cfa: sp 0 + .ra: lr +STACK CFI 4a4a2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4a4a6 .cfa: sp 32 + +STACK CFI 4a4ee .cfa: sp 12 + +STACK CFI INIT 4a500 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4a508 b4 .cfa: sp 0 + .ra: lr +STACK CFI 4a50c .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ +STACK CFI 4a5aa .cfa: sp 32 + +STACK CFI INIT 175b2 98 .cfa: sp 0 + .ra: lr +STACK CFI 175b6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17646 .cfa: sp 28 + +STACK CFI INIT 4a5bc 19c .cfa: sp 0 + .ra: lr +STACK CFI 4a5c0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 4a5ce .cfa: sp 104 + +STACK CFI 4a728 .cfa: sp 28 + +STACK CFI INIT 4a758 d8 .cfa: sp 0 + .ra: lr +STACK CFI 4a75c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 4a75e .cfa: sp 80 + +STACK CFI 4a810 .cfa: sp 24 + +STACK CFI INIT 4a830 c .cfa: sp 0 + .ra: lr +STACK CFI 4a832 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 4a83c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 20330 98 .cfa: sp 0 + .ra: lr +STACK CFI 20332 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 20334 .cfa: sp 80 + +STACK CFI 203c6 .cfa: sp 20 + +STACK CFI INIT 4a844 b0 .cfa: sp 0 + .ra: lr +STACK CFI 4a846 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4a84a .cfa: sp 40 + +STACK CFI 4a8d4 .cfa: sp 20 + +STACK CFI INIT 4a8f4 b0 .cfa: sp 0 + .ra: lr +STACK CFI 4a8f6 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4a8fa .cfa: sp 40 + +STACK CFI 4a984 .cfa: sp 20 + +STACK CFI INIT 4a9a4 c .cfa: sp 0 + .ra: lr +STACK CFI 4a9a6 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 4a9b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4a9b8 b0 .cfa: sp 0 + .ra: lr +STACK CFI 4a9ba .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4a9be .cfa: sp 40 + +STACK CFI 4aa48 .cfa: sp 20 + +STACK CFI INIT 0 110 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 64 + +STACK CFI da .cfa: sp 36 + +STACK CFI INIT 4aa68 d8 .cfa: sp 0 + .ra: lr +STACK CFI 4aa6c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 4aa6e .cfa: sp 80 + +STACK CFI 4ab1e .cfa: sp 24 + +STACK CFI INIT 0 ac .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI 8e .cfa: sp 20 + +STACK CFI INIT 0 d8 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 80 + +STACK CFI b6 .cfa: sp 24 + +STACK CFI INIT 0 b0 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 40 + +STACK CFI 92 .cfa: sp 20 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 4ab40 16c .cfa: sp 0 + .ra: lr +STACK CFI 4ab44 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 4ab4c .cfa: sp 48 + +STACK CFI 4ac76 .cfa: sp 24 + +STACK CFI INIT 4acac c .cfa: sp 0 + .ra: lr +STACK CFI 4acae .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 4acb8 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 9e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 9c .cfa: sp 20 + +STACK CFI INIT 176f0 3c .cfa: sp 0 + .ra: lr +STACK CFI 176f2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 4acc0 29c .cfa: sp 0 + .ra: lr +STACK CFI 4acc4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4acca .cfa: sp 120 + +STACK CFI 4af24 .cfa: sp 36 + +STACK CFI INIT 0 118 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 114 .cfa: sp 24 + +STACK CFI INIT 179ec 1a .cfa: sp 0 + .ra: lr +STACK CFI 179ee .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 17a02 .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 +STACK CFI INIT 4af5c 1dc .cfa: sp 0 + .ra: lr +STACK CFI 4af60 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4af6a .cfa: sp 104 + +STACK CFI 4b0f0 .cfa: sp 32 + +STACK CFI INIT 4b138 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4b140 170 .cfa: sp 0 + .ra: lr +STACK CFI 4b146 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 4b14e .cfa: sp 160 + +STACK CFI 4b278 .cfa: sp 28 + +STACK CFI INIT 4b2b0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4b2b8 11c .cfa: sp 0 + .ra: lr +STACK CFI 4b2be .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 4b2c6 .cfa: sp 104 + +STACK CFI 4b3a6 .cfa: sp 28 + +STACK CFI INIT 4b3d4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 168 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 10 .cfa: sp 80 + +STACK CFI 126 .cfa: sp 28 + +STACK CFI INIT 0 178 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI e .cfa: sp 104 + +STACK CFI 136 .cfa: sp 32 + +STACK CFI INIT 0 7e .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI e .cfa: sp 56 + +STACK CFI 7a .cfa: sp 28 + +STACK CFI INIT 4b3dc 1b4 .cfa: sp 0 + .ra: lr +STACK CFI 4b3e2 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4b3ea .cfa: sp 128 + +STACK CFI 4b560 .cfa: sp 36 + +STACK CFI INIT 4b590 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4b598 20 .cfa: sp 0 + .ra: lr +STACK CFI 4b59a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 4b5b8 34 .cfa: sp 0 + .ra: lr +STACK CFI 4b5ba .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 4b5ec 12 .cfa: sp 0 + .ra: lr +STACK CFI 4b5ee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4b5fe 20 .cfa: sp 0 + .ra: lr +STACK CFI 4b600 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 4b61e 1a .cfa: sp 0 + .ra: lr +STACK CFI 4b622 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4b638 3c .cfa: sp 0 + .ra: lr +STACK CFI 4b63a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 4b674 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4b67c 12 .cfa: sp 0 + .ra: lr +STACK CFI 4b67e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4b68e 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4b698 44 .cfa: sp 0 + .ra: lr +STACK CFI 4b69a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 4b6dc 12 .cfa: sp 0 + .ra: lr +STACK CFI 4b6de .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 34 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4b6ee 28 .cfa: sp 0 + .ra: lr +STACK CFI 4b6f0 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 4b718 94 .cfa: sp 0 + .ra: lr +STACK CFI 4b71a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4b71e .cfa: sp 32 + +STACK CFI 4b798 .cfa: sp 12 + +STACK CFI INIT 4b7ac 12 .cfa: sp 0 + .ra: lr +STACK CFI 4b7ae .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4b7be 40 .cfa: sp 0 + .ra: lr +STACK CFI 4b7c0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 4b800 e4 .cfa: sp 0 + .ra: lr +STACK CFI 4b806 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 4b810 .cfa: sp 72 + +STACK CFI 4b8cc .cfa: sp 24 + +STACK CFI INIT 4b8e4 1e4 .cfa: sp 0 + .ra: lr +STACK CFI 4b8e8 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 4b8ec .cfa: sp 64 + +STACK CFI 4ba82 .cfa: sp 28 + +STACK CFI INIT 4bac8 1f4 .cfa: sp 0 + .ra: lr +STACK CFI 4bacc .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4bad2 .cfa: sp 72 + +STACK CFI 4bc7a .cfa: sp 32 + +STACK CFI INIT 4bcbc e .cfa: sp 0 + .ra: lr +STACK CFI 4bcbe .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 4bcc6 .cfa: sp 4 + +STACK CFI INIT 0 1f8 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI a .cfa: sp 72 + +STACK CFI 1b4 .cfa: sp 32 + +STACK CFI INIT 0 e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI a .cfa: sp 4 + +STACK CFI INIT 4bccc 1f4 .cfa: sp 0 + .ra: lr +STACK CFI 4bcd0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4bcd6 .cfa: sp 72 + +STACK CFI 4be7e .cfa: sp 32 + +STACK CFI INIT 4bec0 e .cfa: sp 0 + .ra: lr +STACK CFI 4bec2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 4beca .cfa: sp 4 + +STACK CFI INIT 0 1f4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI a .cfa: sp 72 + +STACK CFI 1b4 .cfa: sp 32 + +STACK CFI INIT 0 e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI a .cfa: sp 4 + +STACK CFI INIT 0 1f8 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI a .cfa: sp 72 + +STACK CFI 1b2 .cfa: sp 32 + +STACK CFI INIT 0 e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI a .cfa: sp 4 + +STACK CFI INIT 4bed0 1f4 .cfa: sp 0 + .ra: lr +STACK CFI 4bed4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4beda .cfa: sp 72 + +STACK CFI 4c082 .cfa: sp 32 + +STACK CFI INIT 4c0c4 e .cfa: sp 0 + .ra: lr +STACK CFI 4c0c6 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 4c0ce .cfa: sp 4 + +STACK CFI INIT 4c0d4 1f4 .cfa: sp 0 + .ra: lr +STACK CFI 4c0d8 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4c0de .cfa: sp 72 + +STACK CFI 4c286 .cfa: sp 32 + +STACK CFI INIT 4c2c8 e .cfa: sp 0 + .ra: lr +STACK CFI 4c2ca .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 4c2d2 .cfa: sp 4 + +STACK CFI INIT 4c2d8 1f4 .cfa: sp 0 + .ra: lr +STACK CFI 4c2dc .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4c2e2 .cfa: sp 72 + +STACK CFI 4c48a .cfa: sp 32 + +STACK CFI INIT 4c4cc e .cfa: sp 0 + .ra: lr +STACK CFI 4c4ce .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 4c4d6 .cfa: sp 4 + +STACK CFI INIT 0 1f4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI a .cfa: sp 72 + +STACK CFI 1b2 .cfa: sp 32 + +STACK CFI INIT 0 e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI a .cfa: sp 4 + +STACK CFI INIT 4c4dc 284 .cfa: sp 0 + .ra: lr +STACK CFI 4c4e0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4c4ee .cfa: sp 96 + +STACK CFI 4c716 .cfa: sp 36 + +STACK CFI INIT 4c760 48 .cfa: sp 0 + .ra: lr +STACK CFI 4c762 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4c7a6 .cfa: sp 8 + +STACK CFI INIT 4c7a8 bc .cfa: sp 0 + .ra: lr +STACK CFI 4c7aa .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4c85c .cfa: sp 0 + .ra: .ra r3: r3 r4: r4 r5: r5 r6: r6 r7: r7 +STACK CFI 4c860 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 4c864 116 .cfa: sp 0 + .ra: lr +STACK CFI 4c868 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4c86a .cfa: sp 64 + +STACK CFI 4c976 .cfa: sp 36 + +STACK CFI INIT 4c97c 114 .cfa: sp 0 + .ra: lr +STACK CFI 4c980 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 4c990 .cfa: sp 72 + +STACK CFI 4ca66 .cfa: sp 24 + +STACK CFI INIT 4ca90 11a8 .cfa: sp 0 + .ra: lr +STACK CFI 4ca94 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4caa8 .cfa: sp 104 + +STACK CFI 4dbe4 .cfa: sp 36 + +STACK CFI INIT 4dc38 10c .cfa: sp 0 + .ra: lr +STACK CFI 4dc3c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 4dc44 .cfa: sp 48 + +STACK CFI 4dd1c .cfa: sp 24 + +STACK CFI INIT 4dd44 11c .cfa: sp 0 + .ra: lr +STACK CFI 4dd48 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 4dd50 .cfa: sp 48 + +STACK CFI 4de32 .cfa: sp 24 + +STACK CFI INIT 0 118 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI de .cfa: sp 20 + +STACK CFI INIT 4de60 1c4 .cfa: sp 0 + .ra: lr +STACK CFI 4de64 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4de74 .cfa: sp 136 + +STACK CFI 4dffc .cfa: sp 36 + +STACK CFI INIT 4e024 220 .cfa: sp 0 + .ra: lr +STACK CFI 4e028 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 4e038 .cfa: sp 104 + +STACK CFI 4e21e .cfa: sp 28 + +STACK CFI INIT 4e244 11c .cfa: sp 0 + .ra: lr +STACK CFI 4e246 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4e24e .cfa: sp 40 + +STACK CFI 4e342 .cfa: sp 20 + +STACK CFI INIT 4e360 17c .cfa: sp 0 + .ra: lr +STACK CFI 4e362 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4e366 .cfa: sp 40 + +STACK CFI 4e4bc .cfa: sp 20 + +STACK CFI INIT 0 dc .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 40 + +STACK CFI bc .cfa: sp 20 + +STACK CFI INIT 0 164 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI e .cfa: sp 104 + +STACK CFI 13e .cfa: sp 28 + +STACK CFI INIT 0 138 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI a .cfa: sp 40 + +STACK CFI 118 .cfa: sp 20 + +STACK CFI INIT 0 2b0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI e .cfa: sp 48 + +STACK CFI 27c .cfa: sp 24 + +STACK CFI INIT 4e4dc 240 .cfa: sp 0 + .ra: lr +STACK CFI 4e4e0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4e4e8 .cfa: sp 72 + +STACK CFI 4e6cc .cfa: sp 32 + +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 32 + +STACK CFI 78 .cfa: sp 12 + +STACK CFI INIT 0 1dc .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI 16c .cfa: sp 20 + +STACK CFI INIT 4e71c 1b0 .cfa: sp 0 + .ra: lr +STACK CFI 4e720 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 4e728 .cfa: sp 64 + +STACK CFI 4e88e .cfa: sp 28 + +STACK CFI INIT 4e8cc 1d0 .cfa: sp 0 + .ra: lr +STACK CFI 4e8d0 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4e8dc .cfa: sp 128 + +STACK CFI 4ea68 .cfa: sp 32 + +STACK CFI INIT 4ea9c 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4eaa0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4eaa8 1f0 .cfa: sp 0 + .ra: lr +STACK CFI 4eaac .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4eab8 .cfa: sp 128 + +STACK CFI 4ec62 .cfa: sp 32 + +STACK CFI INIT 4ec98 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4ec9c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4eca4 1f0 .cfa: sp 0 + .ra: lr +STACK CFI 4eca8 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4ecb4 .cfa: sp 128 + +STACK CFI 4ee5e .cfa: sp 32 + +STACK CFI INIT 4ee94 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4ee98 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4eea0 1f8 .cfa: sp 0 + .ra: lr +STACK CFI 4eea4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4eeb0 .cfa: sp 128 + +STACK CFI 4f062 .cfa: sp 32 + +STACK CFI INIT 4f098 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4f09c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4f0a4 90 .cfa: sp 0 + .ra: lr +STACK CFI 4f0a6 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4f0aa .cfa: sp 40 + +STACK CFI 4f118 .cfa: sp 20 + +STACK CFI INIT 4f134 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 4f13c 358 .cfa: sp 0 + .ra: lr +STACK CFI 4f140 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4f148 .cfa: sp 64 + +STACK CFI 4f430 .cfa: sp 32 + +STACK CFI INIT 4f494 27c .cfa: sp 0 + .ra: lr +STACK CFI 4f498 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4f4a0 .cfa: sp 64 + +STACK CFI 4f6c2 .cfa: sp 32 + +STACK CFI INIT 4f710 124 .cfa: sp 0 + .ra: lr +STACK CFI 4f714 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 4f71c .cfa: sp 48 + +STACK CFI 4f806 .cfa: sp 24 + +STACK CFI INIT 0 3ec .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI e .cfa: sp 80 + +STACK CFI 320 .cfa: sp 32 + +STACK CFI INIT 0 90 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI 76 .cfa: sp 20 + +STACK CFI INIT 3179c 2e .cfa: sp 0 + .ra: lr +STACK CFI INIT 20424 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 20450 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 2047c 9e .cfa: sp 0 + .ra: lr +STACK CFI 20480 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 4f834 64 .cfa: sp 0 + .ra: lr +STACK CFI 4f838 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 4f898 70 .cfa: sp 0 + .ra: lr +STACK CFI 4f89a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4f8a8 .cfa: sp 40 + +STACK CFI 4f906 .cfa: sp 20 + +STACK CFI INIT 4f908 f4 .cfa: sp 0 + .ra: lr +STACK CFI 4f90c .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 4f9f8 .cfa: sp 32 + +STACK CFI INIT 4f9fc 4c .cfa: sp 0 + .ra: lr +STACK CFI 4f9fe .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4fa06 .cfa: sp 40 + +STACK CFI 4fa46 .cfa: sp 12 + +STACK CFI INIT 4fa48 18 .cfa: sp 0 + .ra: lr +STACK CFI 4fa4a .cfa: sp 16 + .ra: .cfa -4 + ^ +STACK CFI 4fa5c .cfa: sp 4 + +STACK CFI INIT 4fa60 50c .cfa: sp 0 + .ra: lr +STACK CFI 4fa64 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 4fa6e .cfa: sp 176 + +STACK CFI 4ff52 .cfa: sp 36 + +STACK CFI INIT 4ff6c 80 .cfa: sp 0 + .ra: lr +STACK CFI 4ff72 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 4ffec 1e8 .cfa: sp 0 + .ra: lr +STACK CFI 4fff0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 50006 .cfa: sp 184 + +STACK CFI 501b8 .cfa: sp 36 + +STACK CFI INIT 501d4 630 .cfa: sp 0 + .ra: lr +STACK CFI 501d8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 501e8 .cfa: sp 320 + +STACK CFI 507ca .cfa: sp 36 + +STACK CFI INIT 50804 61c .cfa: sp 0 + .ra: lr +STACK CFI 50808 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5081a .cfa: sp 176 + +STACK CFI 50d82 .cfa: sp 36 + +STACK CFI INIT 0 52a .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 18 .cfa: sp 224 + +STACK CFI 526 .cfa: sp 36 + +STACK CFI INIT 50e20 64 .cfa: sp 0 + .ra: lr +STACK CFI 50e24 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 50e84 70 .cfa: sp 0 + .ra: lr +STACK CFI 50e86 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 50e94 .cfa: sp 40 + +STACK CFI 50ef2 .cfa: sp 20 + +STACK CFI INIT 50ef4 f4 .cfa: sp 0 + .ra: lr +STACK CFI 50ef8 .cfa: sp 48 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 50fe4 .cfa: sp 32 + +STACK CFI INIT 50fe8 5a8 .cfa: sp 0 + .ra: lr +STACK CFI 50fec .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 50ffe .cfa: sp 176 + +STACK CFI 514fa .cfa: sp 36 + +STACK CFI INIT 51590 66 .cfa: sp 0 + .ra: lr +STACK CFI 51592 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 515f6 26 .cfa: sp 0 + .ra: lr +STACK CFI 515f8 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 5161c 140 .cfa: sp 0 + .ra: lr +STACK CFI 51620 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 51626 .cfa: sp 56 + +STACK CFI 51752 .cfa: sp 32 + +STACK CFI INIT 5175c c0 .cfa: sp 0 + .ra: lr +STACK CFI 5175e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 5181c 12 .cfa: sp 0 + .ra: lr +STACK CFI 5181e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 51830 6c .cfa: sp 0 + .ra: lr +STACK CFI 51832 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 5189c 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 518a4 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 518b0 12 .cfa: sp 0 + .ra: lr +STACK CFI 518b2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 518c2 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 518ce 70 .cfa: sp 0 + .ra: lr +STACK CFI 518d0 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 5193e 4e .cfa: sp 0 + .ra: lr +STACK CFI 51940 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 5198c 52 .cfa: sp 0 + .ra: lr +STACK CFI 5198e .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 519dc .cfa: sp 16 + +STACK CFI INIT 519de 12c .cfa: sp 0 + .ra: lr +STACK CFI 519e2 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 519ea .cfa: sp 48 + +STACK CFI 51b06 .cfa: sp 28 + +STACK CFI INIT 51b0a a0 .cfa: sp 0 + .ra: lr +STACK CFI 51b0c .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 51ba8 .cfa: sp 8 + +STACK CFI INIT 51bac a8 .cfa: sp 0 + .ra: lr +STACK CFI 51bae .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 51c48 .cfa: sp 20 + +STACK CFI INIT 51c54 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 51c5a a .cfa: sp 0 + .ra: lr +STACK CFI INIT 51c64 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16b0a 1e .cfa: sp 0 + .ra: lr +STACK CFI INIT 2aa48 30 .cfa: sp 0 + .ra: lr +STACK CFI 2aa4a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 2aa4e .cfa: sp 48 + +STACK CFI 2aa76 .cfa: sp 12 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 51c6a 24 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d26 42 .cfa: sp 0 + .ra: lr +STACK CFI 16d28 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 16d68 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 16d6e 1c .cfa: sp 0 + .ra: lr +STACK CFI 16d70 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 173de 2c .cfa: sp 0 + .ra: lr +STACK CFI 173e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1740a 40 .cfa: sp 0 + .ra: lr +STACK CFI 1740c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1744a 24 .cfa: sp 0 + .ra: lr +STACK CFI 1744c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 175b2 98 .cfa: sp 0 + .ra: lr +STACK CFI 175b6 .cfa: sp 40 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 17646 .cfa: sp 28 + +STACK CFI INIT 1746e b4 .cfa: sp 0 + .ra: lr +STACK CFI 17470 .cfa: sp 32 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 17520 .cfa: sp 20 + +STACK CFI INIT 51c8e 28 .cfa: sp 0 + .ra: lr +STACK CFI 51c90 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 51cb8 2c .cfa: sp 0 + .ra: lr +STACK CFI 51cba .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 51ce4 12 .cfa: sp 0 + .ra: lr +STACK CFI 51ce6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 51cf6 24 .cfa: sp 0 + .ra: lr +STACK CFI 51cfa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 51d1c e8 .cfa: sp 0 + .ra: lr +STACK CFI 51d22 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 51d2c .cfa: sp 88 + +STACK CFI 51df0 .cfa: sp 32 + +STACK CFI INIT 51e04 3e .cfa: sp 0 + .ra: lr +STACK CFI 51e08 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 51e40 .cfa: sp 12 + +STACK CFI INIT 0 98 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 80 + +STACK CFI 96 .cfa: sp 20 + +STACK CFI INIT 51e44 194 .cfa: sp 0 + .ra: lr +STACK CFI 51e48 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 51e4c .cfa: sp 96 + +STACK CFI 51fba .cfa: sp 28 + +STACK CFI INIT 20424 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 20450 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 2047c 9e .cfa: sp 0 + .ra: lr +STACK CFI 20480 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 51fd8 80 .cfa: sp 0 + .ra: lr +STACK CFI 51fde .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 52058 218 .cfa: sp 0 + .ra: lr +STACK CFI 5205c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 52072 .cfa: sp 176 + +STACK CFI 52252 .cfa: sp 36 + +STACK CFI INIT 52270 174 .cfa: sp 0 + .ra: lr +STACK CFI 52274 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 52282 .cfa: sp 128 + +STACK CFI 523bc .cfa: sp 36 + +STACK CFI INIT 523e4 16 .cfa: sp 0 + .ra: lr +STACK CFI 523e6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 523fc 2c .cfa: sp 0 + .ra: lr +STACK CFI 523fe .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 52428 58 .cfa: sp 0 + .ra: lr +STACK CFI 5242a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 52480 18 .cfa: sp 0 + .ra: lr +STACK CFI 52484 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 52498 12 .cfa: sp 0 + .ra: lr +STACK CFI 5249a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 524ac 10 .cfa: sp 0 + .ra: lr +STACK CFI 524b0 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 524bc f8 .cfa: sp 0 + .ra: lr +STACK CFI 524c0 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 524c6 .cfa: sp 24 + +STACK CFI INIT 525b4 2c .cfa: sp 0 + .ra: lr +STACK CFI 525b6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 525e0 20 .cfa: sp 0 + .ra: lr +STACK CFI 525e4 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 52600 34 .cfa: sp 0 + .ra: lr +STACK CFI 52602 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 52634 40 .cfa: sp 0 + .ra: lr +STACK CFI 52636 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 52674 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52680 34 .cfa: sp 0 + .ra: lr +STACK CFI 52682 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 526b8 44 .cfa: sp 0 + .ra: lr +STACK CFI 526ba .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 52700 74 .cfa: sp 0 + .ra: lr +STACK CFI 52702 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 52778 7c .cfa: sp 0 + .ra: lr +STACK CFI 5277a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15c44 70 .cfa: sp 0 + .ra: lr +STACK CFI 15c4a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 527f8 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52800 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52804 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52814 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 52804 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52820 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 5282c 18 .cfa: sp 0 + .ra: lr +STACK CFI 52830 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5282c 18 .cfa: sp 0 + .ra: lr +STACK CFI 52830 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 52804 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52844 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52854 10 .cfa: sp 0 + .ra: lr +STACK CFI 52856 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 52864 5c .cfa: sp 0 + .ra: lr +STACK CFI 52866 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 528c0 a .cfa: sp 0 + .ra: lr +STACK CFI 528c2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 528cc a .cfa: sp 0 + .ra: lr +STACK CFI INIT 528d8 1a .cfa: sp 0 + .ra: lr +STACK CFI 528da .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 528f4 3c .cfa: sp 0 + .ra: lr +STACK CFI 528f8 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 528fa .cfa: sp 24 + +STACK CFI INIT 52930 2b4 .cfa: sp 0 + .ra: lr +STACK CFI 52934 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 52936 .cfa: sp 112 + +STACK CFI INIT 52be4 5c .cfa: sp 0 + .ra: lr +STACK CFI 52be6 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 52bea .cfa: sp 40 + +STACK CFI INIT 52c40 10 .cfa: sp 0 + .ra: lr +STACK CFI 52c42 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 52c50 2c .cfa: sp 0 + .ra: lr +STACK CFI 52c52 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 52c5a .cfa: sp 32 + +STACK CFI INIT 52c7c 16 .cfa: sp 0 + .ra: lr +STACK CFI 52c82 .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI INIT 52c94 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52c98 6e .cfa: sp 0 + .ra: lr +STACK CFI 52c9a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 52c9e .cfa: sp 32 + +STACK CFI INIT 52d08 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 52d14 18 .cfa: sp 0 + .ra: lr +STACK CFI 52d18 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 52d2c 12 .cfa: sp 0 + .ra: lr +STACK CFI 52d2e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 52d40 18 .cfa: sp 0 + .ra: lr +STACK CFI 52d42 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52d58 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 52d84 48 .cfa: sp 0 + .ra: lr +STACK CFI 52d86 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 52dcc 14 .cfa: sp 0 + .ra: lr +STACK CFI 52dce .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52de0 168 .cfa: sp 0 + .ra: lr +STACK CFI 52dea .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 52dee .cfa: sp 80 + +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52f48 18 .cfa: sp 0 + .ra: lr +STACK CFI 52f4c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 52f60 12 .cfa: sp 0 + .ra: lr +STACK CFI 52f62 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 52f74 24 .cfa: sp 0 + .ra: lr +STACK CFI 52f76 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 52f98 12 .cfa: sp 0 + .ra: lr +STACK CFI 52f9a .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 52fac 24 .cfa: sp 0 + .ra: lr +STACK CFI 52fae .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 52fd0 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI INIT 52ffc a .cfa: sp 0 + .ra: lr +STACK CFI 52ffe .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 53008 6 .cfa: sp 0 + .ra: lr +STACK CFI 5300a .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 53010 2c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI INIT 5303c e .cfa: sp 0 + .ra: lr +STACK CFI 5303e .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 5304c 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 5305c c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 53068 18 .cfa: sp 0 + .ra: lr +STACK CFI 5306c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53080 18 .cfa: sp 0 + .ra: lr +STACK CFI 53084 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53098 12 .cfa: sp 0 + .ra: lr +STACK CFI 5309a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 530ac 14 .cfa: sp 0 + .ra: lr +STACK CFI 530ae .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 530c0 e .cfa: sp 0 + .ra: lr +STACK CFI 530c2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 530d0 18 .cfa: sp 0 + .ra: lr +STACK CFI 530d2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 530e8 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 530f0 2c .cfa: sp 0 + .ra: lr +STACK CFI 530f4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5311c 1c .cfa: sp 0 + .ra: lr +STACK CFI 53120 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53138 1c .cfa: sp 0 + .ra: lr +STACK CFI 5313c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53154 12 .cfa: sp 0 + .ra: lr +STACK CFI 53156 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53168 1c .cfa: sp 0 + .ra: lr +STACK CFI 5316c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53184 12 .cfa: sp 0 + .ra: lr +STACK CFI 53186 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53198 12 .cfa: sp 0 + .ra: lr +STACK CFI 5319a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 531ac 12 .cfa: sp 0 + .ra: lr +STACK CFI 531ae .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 531c0 74 .cfa: sp 0 + .ra: lr +STACK CFI 531c4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 68 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 53234 24 .cfa: sp 0 + .ra: lr +STACK CFI 53236 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 53258 40 .cfa: sp 0 + .ra: lr +STACK CFI 5325a .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI INIT 53298 60 .cfa: sp 0 + .ra: lr +STACK CFI 5329a .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 5329e .cfa: sp 40 + +STACK CFI INIT 532f8 60 .cfa: sp 0 + .ra: lr +STACK CFI 532fa .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 532fe .cfa: sp 40 + +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI INIT 53358 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53368 18 .cfa: sp 0 + .ra: lr +STACK CFI 5336a .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 53380 32 .cfa: sp 0 + .ra: lr +STACK CFI 53382 .cfa: sp 4 + .ra: .cfa -4 + ^ +STACK CFI 53384 .cfa: sp 112 + +STACK CFI INIT 533b4 e0 .cfa: sp 0 + .ra: lr +STACK CFI 533b6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 533bc .cfa: sp 120 + +STACK CFI INIT 53494 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 5349c 78 .cfa: sp 0 + .ra: lr +STACK CFI 5349e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 534a4 .cfa: sp 120 + +STACK CFI INIT 53514 28 .cfa: sp 0 + .ra: lr +STACK CFI 53516 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5353c 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53544 34 .cfa: sp 0 + .ra: lr +STACK CFI 53546 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 53578 42 .cfa: sp 0 + .ra: lr +STACK CFI 5357c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 53580 .cfa: sp 16 + +STACK CFI INIT 535bc 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 535c4 48 .cfa: sp 0 + .ra: lr +STACK CFI 535c6 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 535c8 .cfa: sp 32 + +STACK CFI INIT 5360c 128 .cfa: sp 0 + .ra: lr +STACK CFI 53612 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 53618 .cfa: sp 56 + +STACK CFI INIT 0 72 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 53734 5c .cfa: sp 0 + .ra: lr +STACK CFI 53736 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 53790 ec .cfa: sp 0 + .ra: lr +STACK CFI 53794 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 5387c 1c .cfa: sp 0 + .ra: lr +STACK CFI 53880 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53898 12 .cfa: sp 0 + .ra: lr +STACK CFI 5389a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 538ac 1c .cfa: sp 0 + .ra: lr +STACK CFI 538ae .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 538c8 28 .cfa: sp 0 + .ra: lr +STACK CFI 538ca .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 538f0 44 .cfa: sp 0 + .ra: lr +STACK CFI 538f6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53934 12 .cfa: sp 0 + .ra: lr +STACK CFI 53936 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53948 60 .cfa: sp 0 + .ra: lr +STACK CFI 5394a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 53954 .cfa: sp 32 + +STACK CFI INIT 539a8 3c .cfa: sp 0 + .ra: lr +STACK CFI 539aa .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 53234 24 .cfa: sp 0 + .ra: lr +STACK CFI 53236 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 539e4 78 .cfa: sp 0 + .ra: lr +STACK CFI 539e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 539ec .cfa: sp 32 + +STACK CFI INIT 0 88 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a5c 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a5c 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a60 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a6c 16 .cfa: sp 0 + .ra: lr +STACK CFI 53a6e .cfa: sp 8 + +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a84 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a84 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a84 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fbc .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 92 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ r7: .cfa -4 + ^ +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 e .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 5e .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 5e .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 49896 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a8c 5c .cfa: sp 0 + .ra: lr +STACK CFI 53a90 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 53ae8 62 .cfa: sp 0 + .ra: lr +STACK CFI 53aec .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 53b4c 64 .cfa: sp 0 + .ra: lr +STACK CFI 53b50 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 53bb0 18 .cfa: sp 0 + .ra: lr +STACK CFI 53bb4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53bc8 1c .cfa: sp 0 + .ra: lr +STACK CFI 53bcc .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53be4 12 .cfa: sp 0 + .ra: lr +STACK CFI 53be6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53bf8 1e .cfa: sp 0 + .ra: lr +STACK CFI 53bfa .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 53c18 6a .cfa: sp 0 + .ra: lr +STACK CFI 53c1c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 53c1e .cfa: sp 40 + +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 6a .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI INIT 53c84 58 .cfa: sp 0 + .ra: lr +STACK CFI 53c86 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 53cdc 18 .cfa: sp 0 + .ra: lr +STACK CFI 53ce0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53cf4 8a .cfa: sp 0 + .ra: lr +STACK CFI 53cf6 .cfa: sp 12 + r4: .cfa -12 + ^ r5: .cfa -8 + ^ r6: .cfa -4 + ^ +STACK CFI INIT 0 56 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT c 28 .cfa: sp 0 + .ra: lr +STACK CFI 12 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT c 12 .cfa: sp 0 + .ra: lr +STACK CFI e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT c 28 .cfa: sp 0 + .ra: lr +STACK CFI 12 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT c 2c .cfa: sp 0 + .ra: lr +STACK CFI 12 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53d80 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 53d8c 2c .cfa: sp 0 + .ra: lr +STACK CFI 53d92 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53db8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 53dc4 28 .cfa: sp 0 + .ra: lr +STACK CFI 53dca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53dec c .cfa: sp 0 + .ra: lr +STACK CFI INIT 53df8 12 .cfa: sp 0 + .ra: lr +STACK CFI 53dfa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53e0c 20 .cfa: sp 0 + .ra: lr +STACK CFI 53e10 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53e2c c .cfa: sp 0 + .ra: lr +STACK CFI INIT 53e38 28 .cfa: sp 0 + .ra: lr +STACK CFI 53e3e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53e60 1e .cfa: sp 0 + .ra: lr +STACK CFI 53e62 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53e60 1e .cfa: sp 0 + .ra: lr +STACK CFI 53e62 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53e80 1e .cfa: sp 0 + .ra: lr +STACK CFI 53e82 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 53ea0 1e .cfa: sp 0 + .ra: lr +STACK CFI 53ea2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 53ec0 22c .cfa: sp 0 + .ra: lr +STACK CFI 53ec4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 540ec 28 .cfa: sp 0 + .ra: lr +STACK CFI 540f0 .cfa: sp 4 + .ra: .cfa -4 + ^ +STACK CFI 540f6 .cfa: sp 16 + +STACK CFI INIT 54114 90 .cfa: sp 0 + .ra: lr +STACK CFI 54116 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 541a4 12 .cfa: sp 0 + .ra: lr +STACK CFI INIT 541b8 ac .cfa: sp 0 + .ra: lr +STACK CFI 541be .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 541c8 .cfa: sp 24 + +STACK CFI INIT 54264 56 .cfa: sp 0 + .ra: lr +STACK CFI 54266 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 5426a .cfa: sp 24 + +STACK CFI INIT 542bc 90 .cfa: sp 0 + .ra: lr +STACK CFI 542be .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI INIT 5434c ac .cfa: sp 0 + .ra: lr +STACK CFI 54352 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 5435c .cfa: sp 24 + +STACK CFI INIT 543f8 5a .cfa: sp 0 + .ra: lr +STACK CFI 543fa .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 298 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI a .cfa: sp 48 + +STACK CFI INIT 0 90 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 32 + +STACK CFI INIT 0 5c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 24 + +STACK CFI INIT 54454 40 .cfa: sp 0 + .ra: lr +STACK CFI 54456 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 54494 90 .cfa: sp 0 + .ra: lr +STACK CFI 54496 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5449a .cfa: sp 32 + +STACK CFI INIT 54524 5e .cfa: sp 0 + .ra: lr +STACK CFI 54526 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 54528 .cfa: sp 24 + +STACK CFI INIT 54584 40 .cfa: sp 0 + .ra: lr +STACK CFI 54586 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 545c4 388 .cfa: sp 0 + .ra: lr +STACK CFI 545c8 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 545ca .cfa: sp 56 + +STACK CFI INIT 5494c 2c .cfa: sp 0 + .ra: lr +STACK CFI 54950 .cfa: sp 4 + .ra: .cfa -4 + ^ +STACK CFI 54956 .cfa: sp 16 + +STACK CFI INIT 54978 20 .cfa: sp 0 + .ra: lr +STACK CFI 5497c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 54998 9e .cfa: sp 0 + .ra: lr +STACK CFI 5499a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 54a38 48 .cfa: sp 0 + .ra: lr +STACK CFI 54a3c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 54a80 12 .cfa: sp 0 + .ra: lr +STACK CFI 54a82 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 be .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 54a94 74 .cfa: sp 0 + .ra: lr +STACK CFI 54a96 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 54b08 2c .cfa: sp 0 + .ra: lr +STACK CFI 54b0a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 54b34 52 .cfa: sp 0 + .ra: lr +STACK CFI 54b36 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 54b88 11c .cfa: sp 0 + .ra: lr +STACK CFI 54b8c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 54b8e .cfa: sp 72 + +STACK CFI INIT 54ca4 52 .cfa: sp 0 + .ra: lr +STACK CFI 54ca6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 72 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 52 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 70 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 136 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 72 + +STACK CFI INIT 54cf8 86 .cfa: sp 0 + .ra: lr +STACK CFI 54cfa .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 54d80 84 .cfa: sp 0 + .ra: lr +STACK CFI 54d82 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 54d84 .cfa: sp 32 + +STACK CFI INIT 54e04 1b4 .cfa: sp 0 + .ra: lr +STACK CFI 54e08 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 54e10 .cfa: sp 40 + +STACK CFI INIT 0 86 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 96 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 40 + +STACK CFI INIT 0 220 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI c .cfa: sp 48 + +STACK CFI INIT 54fb8 112 .cfa: sp 0 + .ra: lr +STACK CFI 54fbe .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 54fc4 .cfa: sp 56 + +STACK CFI INIT 550cc 76 .cfa: sp 0 + .ra: lr +STACK CFI 550ce .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55144 1c .cfa: sp 0 + .ra: lr +STACK CFI 55148 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55160 12 .cfa: sp 0 + .ra: lr +STACK CFI 55162 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55174 20 .cfa: sp 0 + .ra: lr +STACK CFI 55176 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55194 1c .cfa: sp 0 + .ra: lr +STACK CFI 55196 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 4c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 24 + +STACK CFI INIT 551b0 10 .cfa: sp 0 + .ra: lr +STACK CFI 551b2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 551c0 1c .cfa: sp 0 + .ra: lr +STACK CFI 551c4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 551dc 2e .cfa: sp 0 + .ra: lr +STACK CFI 551de .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 5520c 18 .cfa: sp 0 + .ra: lr +STACK CFI INIT 55224 1e .cfa: sp 0 + .ra: lr +STACK CFI 55226 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 55244 10 .cfa: sp 0 + .ra: lr +STACK CFI 55248 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 b8 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 72 + +STACK CFI INIT 55254 ce .cfa: sp 0 + .ra: lr +STACK CFI 5525a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5525e .cfa: sp 96 + +STACK CFI INIT 55324 e .cfa: sp 0 + .ra: lr +STACK CFI 55326 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 32 + +STACK CFI INIT 0 118 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI a .cfa: sp 40 + +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 1a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 2f4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI a .cfa: sp 96 + +STACK CFI INIT 0 138 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 1576 + +STACK CFI INIT 0 1a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 16c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 72 + +STACK CFI INIT 0 ac .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 56 + +STACK CFI INIT 0 1104 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 720 + +STACK CFI INIT 0 26c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 1652 + +STACK CFI c .cfa: sp 1664 + +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 55334 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 5533c 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 55344 18 .cfa: sp 0 + .ra: lr +STACK CFI 55348 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5535c 18 .cfa: sp 0 + .ra: lr +STACK CFI 55360 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55374 18 .cfa: sp 0 + .ra: lr +STACK CFI 55378 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5538c 18 .cfa: sp 0 + .ra: lr +STACK CFI 55390 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 553a4 18 .cfa: sp 0 + .ra: lr +STACK CFI 553a8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 553bc 18 .cfa: sp 0 + .ra: lr +STACK CFI 553c0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 553d4 18 .cfa: sp 0 + .ra: lr +STACK CFI 553d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 553ec 18 .cfa: sp 0 + .ra: lr +STACK CFI 553f0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55404 e .cfa: sp 0 + .ra: lr +STACK CFI 55406 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 13b60 28 .cfa: sp 0 + .ra: lr +STACK CFI 13b62 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55414 10a .cfa: sp 0 + .ra: lr +STACK CFI 55418 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 55520 de .cfa: sp 0 + .ra: lr +STACK CFI 5552a .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 55600 10c .cfa: sp 0 + .ra: lr +STACK CFI 55604 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 5570c ee .cfa: sp 0 + .ra: lr +STACK CFI 55710 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 557fc 20 .cfa: sp 0 + .ra: lr +STACK CFI 55800 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5581c 20 .cfa: sp 0 + .ra: lr +STACK CFI 55820 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5583c 20 .cfa: sp 0 + .ra: lr +STACK CFI 55840 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5585c 20 .cfa: sp 0 + .ra: lr +STACK CFI 55860 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5587c 20 .cfa: sp 0 + .ra: lr +STACK CFI 55880 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5589c 20 .cfa: sp 0 + .ra: lr +STACK CFI 558a0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 558bc 20 .cfa: sp 0 + .ra: lr +STACK CFI 558c0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 558dc 20 .cfa: sp 0 + .ra: lr +STACK CFI 558e0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 558fc 6a .cfa: sp 0 + .ra: lr +STACK CFI 558fe .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 55968 66 .cfa: sp 0 + .ra: lr +STACK CFI 5596c .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 559d0 30 .cfa: sp 0 + .ra: lr +STACK CFI 559d2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 55a00 74 .cfa: sp 0 + .ra: lr +STACK CFI 55a04 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 53a5c 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 55a74 28 .cfa: sp 0 + .ra: lr +STACK CFI 55a76 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 55a9c 28 .cfa: sp 0 + .ra: lr +STACK CFI 55a9e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55ac4 1c .cfa: sp 0 + .ra: lr +STACK CFI 55ac6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 55ae0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 55aec 24 .cfa: sp 0 + .ra: lr +STACK CFI 55aee .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55b10 c4 .cfa: sp 0 + .ra: lr +STACK CFI 55b14 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 55b1c .cfa: sp 40 + +STACK CFI INIT 0 f0 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI a .cfa: sp 40 + +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI INIT 55bd4 56 .cfa: sp 0 + .ra: lr +STACK CFI 55bd6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55c2c 74 .cfa: sp 0 + .ra: lr +STACK CFI 55c30 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 55ca0 4c .cfa: sp 0 + .ra: lr +STACK CFI 55ca2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 55cec f0 .cfa: sp 0 + .ra: lr +STACK CFI 55cf0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 55ddc 2c .cfa: sp 0 + .ra: lr +STACK CFI 55de0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55e08 2c .cfa: sp 0 + .ra: lr +STACK CFI 55e0c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55e34 30 .cfa: sp 0 + .ra: lr +STACK CFI 55e38 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55e64 30 .cfa: sp 0 + .ra: lr +STACK CFI 55e68 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 55e94 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 55eb4 14a .cfa: sp 0 + .ra: lr +STACK CFI 55eb8 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 56000 2c .cfa: sp 0 + .ra: lr +STACK CFI 56004 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 5602c 2c .cfa: sp 0 + .ra: lr +STACK CFI 56030 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 56058 30 .cfa: sp 0 + .ra: lr +STACK CFI 5605c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 56088 30 .cfa: sp 0 + .ra: lr +STACK CFI 5608c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 560b8 24 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 560dc 40 .cfa: sp 0 + .ra: lr +STACK CFI 560de .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 5611c 68 .cfa: sp 0 + .ra: lr +STACK CFI 5611e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 56184 59c .cfa: sp 0 + .ra: lr +STACK CFI 56188 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 5618a .cfa: sp 144 + +STACK CFI INIT 56720 b8 .cfa: sp 0 + .ra: lr +STACK CFI 56724 .cfa: sp 32 + r10: .cfa -8 + ^ r11: .cfa -4 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 567d8 2e .cfa: sp 0 + .ra: lr +STACK CFI 567da .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 56808 70 .cfa: sp 0 + .ra: lr +STACK CFI 5680c .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 70 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 b4 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 14 .cfa: sp 32 + +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 84 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 56878 48 .cfa: sp 0 + .ra: lr +STACK CFI 5687e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 56882 .cfa: sp 16 + +STACK CFI INIT 0 104 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI a .cfa: sp 40 + +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 34 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 568c0 3c .cfa: sp 0 + .ra: lr +STACK CFI 568c2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 568c6 .cfa: sp 16 + +STACK CFI INIT 568fc 144 .cfa: sp 0 + .ra: lr +STACK CFI 56900 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 56904 .cfa: sp 632 + +STACK CFI INIT 0 c4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI a .cfa: sp 48 + +STACK CFI INIT 0 f4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI a .cfa: sp 40 + +STACK CFI INIT 0 9a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 48 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI INIT 0 184 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI e .cfa: sp 40 + +STACK CFI INIT 0 314 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI e .cfa: sp 56 + +STACK CFI INIT 0 19c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI e .cfa: sp 40 + +STACK CFI INIT 0 2c0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI c .cfa: sp 48 + +STACK CFI INIT 0 1c0 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI e .cfa: sp 40 + +STACK CFI INIT 0 2a8 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI e .cfa: sp 56 + +STACK CFI INIT 56a40 32 .cfa: sp 0 + .ra: lr +STACK CFI 56a42 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 56a74 8e .cfa: sp 0 + .ra: lr +STACK CFI 56a76 .cfa: sp 8 + +STACK CFI 56a7a .cfa: sp 36 + .ra: .cfa -12 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 56a7c .cfa: sp 56 + +STACK CFI INIT 56b04 8e .cfa: sp 0 + .ra: lr +STACK CFI 56b06 .cfa: sp 8 + +STACK CFI 56b0a .cfa: sp 36 + .ra: .cfa -12 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 56b0c .cfa: sp 56 + +STACK CFI INIT 56b94 28c .cfa: sp 0 + .ra: lr +STACK CFI 56b98 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 56b9a .cfa: sp 184 + +STACK CFI INIT 56e20 44 .cfa: sp 0 + .ra: lr +STACK CFI 56e22 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 56e24 .cfa: sp 40 + +STACK CFI INIT 56e64 2dc .cfa: sp 0 + .ra: lr +STACK CFI 56e68 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 56e6a .cfa: sp 128 + +STACK CFI INIT 57140 46 .cfa: sp 0 + .ra: lr +STACK CFI 57142 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 57144 .cfa: sp 40 + +STACK CFI INIT 56a74 8e .cfa: sp 0 + .ra: lr +STACK CFI 56a76 .cfa: sp 8 + +STACK CFI 56a7a .cfa: sp 36 + .ra: .cfa -12 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 56a7c .cfa: sp 56 + +STACK CFI INIT 57188 154 .cfa: sp 0 + .ra: lr +STACK CFI 5718c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5718e .cfa: sp 80 + +STACK CFI INIT 572e0 168 .cfa: sp 0 + .ra: lr +STACK CFI 572e4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 572e8 .cfa: sp 60 + s16: .cfa -60 + ^ s18: .cfa -52 + ^ s20: .cfa -44 + ^ +STACK CFI 572ea .cfa: sp 144 + +STACK CFI INIT 57448 134 .cfa: sp 0 + .ra: lr +STACK CFI 5744c .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 56b04 8e .cfa: sp 0 + .ra: lr +STACK CFI 56b06 .cfa: sp 8 + +STACK CFI 56b0a .cfa: sp 36 + .ra: .cfa -12 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 56b0c .cfa: sp 56 + +STACK CFI INIT 5757c 8c4 .cfa: sp 0 + .ra: lr +STACK CFI 57580 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 57584 .cfa: sp 904 + +STACK CFI INIT 57e40 32 .cfa: sp 0 + .ra: lr +STACK CFI 57e42 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 57e44 .cfa: sp 40 + +STACK CFI INIT 57e74 8c4 .cfa: sp 0 + .ra: lr +STACK CFI 57e78 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 57e7c .cfa: sp 904 + +STACK CFI INIT 58738 9c .cfa: sp 0 + .ra: lr +STACK CFI 5873a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5873e .cfa: sp 600 + +STACK CFI INIT 587d8 168 .cfa: sp 0 + .ra: lr +STACK CFI 587dc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 587e0 .cfa: sp 60 + s16: .cfa -60 + ^ s18: .cfa -52 + ^ s20: .cfa -44 + ^ +STACK CFI 587e2 .cfa: sp 144 + +STACK CFI INIT 58940 1e8 .cfa: sp 0 + .ra: lr +STACK CFI 58944 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 58946 .cfa: sp 88 + +STACK CFI INIT 58b28 84 .cfa: sp 0 + .ra: lr +STACK CFI 58b2a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 58b30 .cfa: sp 16 + +STACK CFI INIT 58bac 78 .cfa: sp 0 + .ra: lr +STACK CFI 58bae .cfa: sp 8 + +STACK CFI 58bb0 .cfa: sp 24 + .ra: .cfa -12 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ +STACK CFI INIT 58c24 76 .cfa: sp 0 + .ra: lr +STACK CFI 58c26 .cfa: sp 8 + +STACK CFI 58c28 .cfa: sp 24 + .ra: .cfa -12 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ +STACK CFI INIT 58c9c 284 .cfa: sp 0 + .ra: lr +STACK CFI 58ca0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 58ca4 .cfa: sp 208 + +STACK CFI INIT 58f20 1ce .cfa: sp 0 + .ra: lr +STACK CFI 58f24 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 58f26 .cfa: sp 128 + +STACK CFI INIT 590f0 4e .cfa: sp 0 + .ra: lr +STACK CFI 590f2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 590f4 .cfa: sp 80 + +STACK CFI INIT 59140 350 .cfa: sp 0 + .ra: lr +STACK CFI 59142 .cfa: sp 8 + +STACK CFI 59146 .cfa: sp 44 + .ra: .cfa -12 + ^ r10: .cfa -20 + ^ r11: .cfa -16 + ^ r4: .cfa -44 + ^ r5: .cfa -40 + ^ r6: .cfa -36 + ^ r7: .cfa -32 + ^ r8: .cfa -28 + ^ r9: .cfa -24 + ^ +STACK CFI 59148 .cfa: sp 80 + +STACK CFI INIT 59490 8a .cfa: sp 0 + .ra: lr +STACK CFI 59492 .cfa: sp 8 + +STACK CFI 59496 .cfa: sp 32 + .ra: .cfa -12 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ +STACK CFI 59498 .cfa: sp 72 + +STACK CFI INIT 5951c 78 .cfa: sp 0 + .ra: lr +STACK CFI 5951e .cfa: sp 8 + +STACK CFI 59520 .cfa: sp 28 + .ra: .cfa -12 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ +STACK CFI 59522 .cfa: sp 72 + +STACK CFI INIT 59594 6e .cfa: sp 0 + .ra: lr +STACK CFI 59596 .cfa: sp 8 + +STACK CFI 59598 .cfa: sp 24 + .ra: .cfa -12 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ +STACK CFI INIT 59604 84 .cfa: sp 0 + .ra: lr +STACK CFI 59606 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5960c .cfa: sp 16 + +STACK CFI INIT 59688 178 .cfa: sp 0 + .ra: lr +STACK CFI 5968c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5968e .cfa: sp 88 + +STACK CFI INIT 59800 6e .cfa: sp 0 + .ra: lr +STACK CFI 59802 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 59808 .cfa: sp 32 + +STACK CFI INIT 59870 70 .cfa: sp 0 + .ra: lr +STACK CFI 59872 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 59878 .cfa: sp 32 + +STACK CFI INIT 598e0 c0 .cfa: sp 0 + .ra: lr +STACK CFI 598e2 .cfa: sp 8 + +STACK CFI 598e6 .cfa: sp 40 + .ra: .cfa -12 + ^ r10: .cfa -16 + ^ r4: .cfa -40 + ^ r5: .cfa -36 + ^ r6: .cfa -32 + ^ r7: .cfa -28 + ^ r8: .cfa -24 + ^ r9: .cfa -20 + ^ +STACK CFI 598e8 .cfa: sp 56 + +STACK CFI INIT 599a0 198 .cfa: sp 0 + .ra: lr +STACK CFI 599a6 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 599a8 .cfa: sp 96 + +STACK CFI INIT 59b38 158 .cfa: sp 0 + .ra: lr +STACK CFI 59b3c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 59b3e .cfa: sp 56 + +STACK CFI INIT 59c90 17a .cfa: sp 0 + .ra: lr +STACK CFI 59c94 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 59c96 .cfa: sp 128 + +STACK CFI INIT 59e0c 4e .cfa: sp 0 + .ra: lr +STACK CFI 59e0e .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 59e10 .cfa: sp 80 + +STACK CFI INIT 59e5c 2d0 .cfa: sp 0 + .ra: lr +STACK CFI 59e60 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 59e62 .cfa: sp 80 + +STACK CFI INIT 5a12c 7c .cfa: sp 0 + .ra: lr +STACK CFI 5a130 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 5a132 .cfa: sp 64 + +STACK CFI INIT 5a1a8 74 .cfa: sp 0 + .ra: lr +STACK CFI 5a1aa .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5a1ac .cfa: sp 64 + +STACK CFI INIT 5a21c 68 .cfa: sp 0 + .ra: lr +STACK CFI 5a21e .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5a220 .cfa: sp 32 + +STACK CFI INIT 5a284 2b2 .cfa: sp 0 + .ra: lr +STACK CFI 5a288 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 5a28a .cfa: sp 48 + +STACK CFI INIT 5a538 1e8 .cfa: sp 0 + .ra: lr +STACK CFI 5a53c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5a53e .cfa: sp 128 + +STACK CFI INIT 5a720 f8 .cfa: sp 0 + .ra: lr +STACK CFI 5a724 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5a72c .cfa: sp 104 + +STACK CFI INIT 5a818 2e .cfa: sp 0 + .ra: lr +STACK CFI 5a81a .cfa: sp 8 + +STACK CFI 5a81c .cfa: sp 16 + .ra: .cfa -12 + ^ r4: .cfa -16 + ^ +STACK CFI 5a81e .cfa: sp 32 + +STACK CFI INIT 5a848 80 .cfa: sp 0 + .ra: lr +STACK CFI 5a84a .cfa: sp 8 + +STACK CFI 5a84c .cfa: sp 28 + .ra: .cfa -12 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ +STACK CFI 5a84e .cfa: sp 64 + +STACK CFI INIT 5a8c8 1d4 .cfa: sp 0 + .ra: lr +STACK CFI 5a8cc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5a8ce .cfa: sp 128 + +STACK CFI INIT 5aa9c f8 .cfa: sp 0 + .ra: lr +STACK CFI 5aaa0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5aaa8 .cfa: sp 104 + +STACK CFI INIT 5ab94 2e .cfa: sp 0 + .ra: lr +STACK CFI 5ab96 .cfa: sp 8 + +STACK CFI 5ab98 .cfa: sp 16 + .ra: .cfa -12 + ^ r4: .cfa -16 + ^ +STACK CFI 5ab9a .cfa: sp 32 + +STACK CFI INIT 5abc4 1ce .cfa: sp 0 + .ra: lr +STACK CFI 5abc8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5abca .cfa: sp 128 + +STACK CFI INIT 5ad94 f8 .cfa: sp 0 + .ra: lr +STACK CFI 5ad98 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5ada0 .cfa: sp 104 + +STACK CFI INIT 5ae8c 2e .cfa: sp 0 + .ra: lr +STACK CFI 5ae8e .cfa: sp 8 + +STACK CFI 5ae90 .cfa: sp 16 + .ra: .cfa -12 + ^ r4: .cfa -16 + ^ +STACK CFI 5ae92 .cfa: sp 32 + +STACK CFI INIT 5abc4 1ce .cfa: sp 0 + .ra: lr +STACK CFI 5abc8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5abca .cfa: sp 128 + +STACK CFI INIT 5ad94 f8 .cfa: sp 0 + .ra: lr +STACK CFI 5ad98 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5ada0 .cfa: sp 104 + +STACK CFI INIT 5ae8c 2e .cfa: sp 0 + .ra: lr +STACK CFI 5ae8e .cfa: sp 8 + +STACK CFI 5ae90 .cfa: sp 16 + .ra: .cfa -12 + ^ r4: .cfa -16 + ^ +STACK CFI 5ae92 .cfa: sp 32 + +STACK CFI INIT 5aebc 246 .cfa: sp 0 + .ra: lr +STACK CFI 5aec0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5aec2 .cfa: sp 152 + +STACK CFI INIT 5b104 fc .cfa: sp 0 + .ra: lr +STACK CFI 5b108 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5b110 .cfa: sp 104 + +STACK CFI INIT 5b200 2e .cfa: sp 0 + .ra: lr +STACK CFI 5b202 .cfa: sp 8 + +STACK CFI 5b204 .cfa: sp 16 + .ra: .cfa -12 + ^ r4: .cfa -16 + ^ +STACK CFI 5b206 .cfa: sp 32 + +STACK CFI INIT 5b230 3a .cfa: sp 0 + .ra: lr +STACK CFI 5b232 .cfa: sp 8 + +STACK CFI 5b234 .cfa: sp 24 + .ra: .cfa -12 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ +STACK CFI 5b236 .cfa: sp 48 + +STACK CFI INIT 5b26c 202 .cfa: sp 0 + .ra: lr +STACK CFI 5b270 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5b272 .cfa: sp 152 + +STACK CFI INIT 5b470 fc .cfa: sp 0 + .ra: lr +STACK CFI 5b474 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5b47c .cfa: sp 104 + +STACK CFI INIT 5b56c 2e .cfa: sp 0 + .ra: lr +STACK CFI 5b56e .cfa: sp 8 + +STACK CFI 5b570 .cfa: sp 16 + .ra: .cfa -12 + ^ r4: .cfa -16 + ^ +STACK CFI 5b572 .cfa: sp 32 + +STACK CFI INIT 5b59c 2d2 .cfa: sp 0 + .ra: lr +STACK CFI 5b5a0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 5b5a2 .cfa: sp 32 + +STACK CFI INIT 5b870 192 .cfa: sp 0 + .ra: lr +STACK CFI 5b874 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5b876 .cfa: sp 136 + +STACK CFI INIT 5ba04 f8 .cfa: sp 0 + .ra: lr +STACK CFI 5ba08 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5ba10 .cfa: sp 104 + +STACK CFI INIT 5bafc 26 .cfa: sp 0 + .ra: lr +STACK CFI 5bafe .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5bb00 .cfa: sp 32 + +STACK CFI INIT 5bb24 76 .cfa: sp 0 + .ra: lr +STACK CFI 5bb26 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5bb28 .cfa: sp 64 + +STACK CFI INIT 5bb9c 17e .cfa: sp 0 + .ra: lr +STACK CFI 5bba0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5bba2 .cfa: sp 128 + +STACK CFI INIT 5bd1c f8 .cfa: sp 0 + .ra: lr +STACK CFI 5bd20 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5bd28 .cfa: sp 104 + +STACK CFI INIT 5be14 26 .cfa: sp 0 + .ra: lr +STACK CFI 5be16 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5be18 .cfa: sp 32 + +STACK CFI INIT 5be3c 17a .cfa: sp 0 + .ra: lr +STACK CFI 5be40 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5be42 .cfa: sp 128 + +STACK CFI INIT 5bfb8 f8 .cfa: sp 0 + .ra: lr +STACK CFI 5bfbc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5bfc4 .cfa: sp 104 + +STACK CFI INIT 5c0b0 26 .cfa: sp 0 + .ra: lr +STACK CFI 5c0b2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5c0b4 .cfa: sp 32 + +STACK CFI INIT 5c0d8 178 .cfa: sp 0 + .ra: lr +STACK CFI 5c0dc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5c0de .cfa: sp 128 + +STACK CFI INIT 5c250 f8 .cfa: sp 0 + .ra: lr +STACK CFI 5c254 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5c25c .cfa: sp 104 + +STACK CFI INIT 5c348 26 .cfa: sp 0 + .ra: lr +STACK CFI 5c34a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5c34c .cfa: sp 32 + +STACK CFI INIT 5c370 1f4 .cfa: sp 0 + .ra: lr +STACK CFI 5c374 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5c376 .cfa: sp 152 + +STACK CFI INIT 5c564 fc .cfa: sp 0 + .ra: lr +STACK CFI 5c568 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5c570 .cfa: sp 104 + +STACK CFI INIT 5c660 26 .cfa: sp 0 + .ra: lr +STACK CFI 5c662 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5c664 .cfa: sp 32 + +STACK CFI INIT 5c688 32 .cfa: sp 0 + .ra: lr +STACK CFI 5c68a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 5c68c .cfa: sp 48 + +STACK CFI INIT 5c6bc 210 .cfa: sp 0 + .ra: lr +STACK CFI 5c6c0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5c6c2 .cfa: sp 160 + +STACK CFI INIT 5c8cc fc .cfa: sp 0 + .ra: lr +STACK CFI 5c8d0 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5c8d8 .cfa: sp 104 + +STACK CFI INIT 5c9c8 26 .cfa: sp 0 + .ra: lr +STACK CFI 5c9ca .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5c9cc .cfa: sp 32 + +STACK CFI INIT 5c9f0 3b4 .cfa: sp 0 + .ra: lr +STACK CFI 5c9f2 .cfa: sp 8 + +STACK CFI 5c9f8 .cfa: sp 44 + .ra: .cfa -12 + ^ r10: .cfa -20 + ^ r11: .cfa -16 + ^ r4: .cfa -44 + ^ r5: .cfa -40 + ^ r6: .cfa -36 + ^ r7: .cfa -32 + ^ r8: .cfa -28 + ^ r9: .cfa -24 + ^ +STACK CFI 5c9fa .cfa: sp 120 + +STACK CFI INIT 5cda4 114 .cfa: sp 0 + .ra: lr +STACK CFI 5cda6 .cfa: sp 8 + +STACK CFI 5cdaa .cfa: sp 44 + .ra: .cfa -12 + ^ r10: .cfa -20 + ^ r11: .cfa -16 + ^ r4: .cfa -44 + ^ r5: .cfa -40 + ^ r6: .cfa -36 + ^ r7: .cfa -32 + ^ r8: .cfa -28 + ^ r9: .cfa -24 + ^ +STACK CFI 5cdac .cfa: sp 360 + +STACK CFI INIT 5ceb8 70 .cfa: sp 0 + .ra: lr +STACK CFI 5ceba .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5cebc .cfa: sp 64 + +STACK CFI INIT 5cf28 13c .cfa: sp 0 + .ra: lr +STACK CFI 5cf2c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5cf2e .cfa: sp 72 + +STACK CFI INIT 5d064 22 .cfa: sp 0 + .ra: lr +STACK CFI 5d066 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5d068 .cfa: sp 24 + +STACK CFI INIT 5d088 76 .cfa: sp 0 + .ra: lr +STACK CFI 5d08a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5d08c .cfa: sp 88 + +STACK CFI INIT 5d100 76 .cfa: sp 0 + .ra: lr +STACK CFI 5d102 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5d104 .cfa: sp 88 + +STACK CFI INIT 5d178 72 .cfa: sp 0 + .ra: lr +STACK CFI 5d17a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5d17c .cfa: sp 72 + +STACK CFI INIT 5d1ec 29a .cfa: sp 0 + .ra: lr +STACK CFI 5d1ee .cfa: sp 8 + +STACK CFI 5d1f2 .cfa: sp 44 + .ra: .cfa -12 + ^ r10: .cfa -20 + ^ r11: .cfa -16 + ^ r4: .cfa -44 + ^ r5: .cfa -40 + ^ r6: .cfa -36 + ^ r7: .cfa -32 + ^ r8: .cfa -28 + ^ r9: .cfa -24 + ^ +STACK CFI 5d1f4 .cfa: sp 112 + +STACK CFI INIT 5d488 1dc .cfa: sp 0 + .ra: lr +STACK CFI 5d48c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5d48e .cfa: sp 144 + +STACK CFI INIT 5d664 164 .cfa: sp 0 + .ra: lr +STACK CFI 5d668 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5d66a .cfa: sp 64 + +STACK CFI INIT 5d7c8 c8 .cfa: sp 0 + .ra: lr +STACK CFI 5d7d0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 5d890 8e .cfa: sp 0 + .ra: lr +STACK CFI 5d892 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 5d894 .cfa: sp 32 + +STACK CFI INIT 5d920 a0 .cfa: sp 0 + .ra: lr +STACK CFI 5d922 .cfa: sp 8 + +STACK CFI 5d924 .cfa: sp 20 + .ra: .cfa -12 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ +STACK CFI 5d926 .cfa: sp 32 + +STACK CFI INIT 5d9c0 1b4 .cfa: sp 0 + .ra: lr +STACK CFI 5d9c4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5d9c6 .cfa: sp 136 + +STACK CFI INIT 5db74 3a2 .cfa: sp 0 + .ra: lr +STACK CFI 5db76 .cfa: sp 8 + +STACK CFI 5db7c .cfa: sp 44 + .ra: .cfa -12 + ^ r10: .cfa -20 + ^ r11: .cfa -16 + ^ r4: .cfa -44 + ^ r5: .cfa -40 + ^ r6: .cfa -36 + ^ r7: .cfa -32 + ^ r8: .cfa -28 + ^ r9: .cfa -24 + ^ +STACK CFI 5db7e .cfa: sp 120 + +STACK CFI INIT 5df18 f8 .cfa: sp 0 + .ra: lr +STACK CFI 5df1a .cfa: sp 8 + +STACK CFI 5df1e .cfa: sp 40 + .ra: .cfa -12 + ^ r10: .cfa -16 + ^ r4: .cfa -40 + ^ r5: .cfa -36 + ^ r6: .cfa -32 + ^ r7: .cfa -28 + ^ r8: .cfa -24 + ^ r9: .cfa -20 + ^ +STACK CFI 5df20 .cfa: sp 160 + +STACK CFI INIT 5e010 72 .cfa: sp 0 + .ra: lr +STACK CFI 5e012 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5e014 .cfa: sp 64 + +STACK CFI INIT 5e084 134 .cfa: sp 0 + .ra: lr +STACK CFI 5e088 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5e08a .cfa: sp 72 + +STACK CFI INIT 5e1b8 24 .cfa: sp 0 + .ra: lr +STACK CFI 5e1ba .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5e1bc .cfa: sp 24 + +STACK CFI INIT 5e1dc 78 .cfa: sp 0 + .ra: lr +STACK CFI 5e1de .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5e1e0 .cfa: sp 88 + +STACK CFI INIT 5e254 78 .cfa: sp 0 + .ra: lr +STACK CFI 5e256 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5e258 .cfa: sp 88 + +STACK CFI INIT 5e2cc 74 .cfa: sp 0 + .ra: lr +STACK CFI 5e2ce .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5e2d0 .cfa: sp 72 + +STACK CFI INIT 5e340 294 .cfa: sp 0 + .ra: lr +STACK CFI 5e342 .cfa: sp 8 + +STACK CFI 5e346 .cfa: sp 44 + .ra: .cfa -12 + ^ r10: .cfa -20 + ^ r11: .cfa -16 + ^ r4: .cfa -44 + ^ r5: .cfa -40 + ^ r6: .cfa -36 + ^ r7: .cfa -32 + ^ r8: .cfa -28 + ^ r9: .cfa -24 + ^ +STACK CFI 5e348 .cfa: sp 112 + +STACK CFI INIT 5e5d4 7c .cfa: sp 0 + .ra: lr +STACK CFI 5e5d6 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 5e5da .cfa: sp 56 + +STACK CFI INIT 5e650 10c .cfa: sp 0 + .ra: lr +STACK CFI 5e654 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5e658 .cfa: sp 656 + +STACK CFI INIT 5e75c 28 .cfa: sp 0 + .ra: lr +STACK CFI 5e75e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5e760 .cfa: sp 32 + +STACK CFI INIT 5e784 10c .cfa: sp 0 + .ra: lr +STACK CFI 5e788 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5e78c .cfa: sp 656 + +STACK CFI INIT 5e890 28 .cfa: sp 0 + .ra: lr +STACK CFI 5e892 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5e894 .cfa: sp 32 + +STACK CFI INIT 5e8b8 40 .cfa: sp 0 + .ra: lr +STACK CFI 5e8be .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 5e8f8 164 .cfa: sp 0 + .ra: lr +STACK CFI 5e8fc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5e900 .cfa: sp 2212 + +STACK CFI 5e902 .cfa: sp 2216 + +STACK CFI INIT 5ea5c 10c .cfa: sp 0 + .ra: lr +STACK CFI 5ea60 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5ea64 .cfa: sp 656 + +STACK CFI INIT 5eb68 26 .cfa: sp 0 + .ra: lr +STACK CFI 5eb6a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5eb6c .cfa: sp 32 + +STACK CFI INIT 5eb90 10c .cfa: sp 0 + .ra: lr +STACK CFI 5eb94 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5eb98 .cfa: sp 656 + +STACK CFI INIT 5ec9c 26 .cfa: sp 0 + .ra: lr +STACK CFI 5ec9e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 5eca0 .cfa: sp 32 + +STACK CFI INIT 5ecc4 15c .cfa: sp 0 + .ra: lr +STACK CFI 5ecc8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5eccc .cfa: sp 2212 + +STACK CFI 5ecce .cfa: sp 2216 + +STACK CFI INIT 5ee20 11c .cfa: sp 0 + .ra: lr +STACK CFI 5ee26 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 5ef3c 950 .cfa: sp 0 + .ra: lr +STACK CFI 5ef40 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5ef44 .cfa: sp 2564 + +STACK CFI 5ef46 .cfa: sp 2568 + +STACK CFI INIT 5f88c 154 .cfa: sp 0 + .ra: lr +STACK CFI 5f890 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 5f894 .cfa: sp 2716 + +STACK CFI 5f896 .cfa: sp 2744 + +STACK CFI INIT 5f9e0 948 .cfa: sp 0 + .ra: lr +STACK CFI 5f9e4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 5f9e8 .cfa: sp 2564 + +STACK CFI 5f9ea .cfa: sp 2568 + +STACK CFI INIT 60328 30 .cfa: sp 0 + .ra: lr +STACK CFI 6032a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6032c .cfa: sp 40 + +STACK CFI INIT 60358 14c .cfa: sp 0 + .ra: lr +STACK CFI 6035e .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 60362 .cfa: sp 48 + +STACK CFI INIT 604a4 60 .cfa: sp 0 + .ra: lr +STACK CFI 604a6 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 60504 44 .cfa: sp 0 + .ra: lr +STACK CFI 60506 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 60548 360 .cfa: sp 0 + .ra: lr +STACK CFI 6054c .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 6054e .cfa: sp 104 + +STACK CFI INIT 608a8 100 .cfa: sp 0 + .ra: lr +STACK CFI 608ae .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 608b2 .cfa: sp 600 + +STACK CFI INIT 609a8 26 .cfa: sp 0 + .ra: lr +STACK CFI 609aa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 609ac .cfa: sp 32 + +STACK CFI INIT 609d0 100 .cfa: sp 0 + .ra: lr +STACK CFI 609d6 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 609da .cfa: sp 600 + +STACK CFI INIT 60ad0 26 .cfa: sp 0 + .ra: lr +STACK CFI 60ad2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 60ad4 .cfa: sp 32 + +STACK CFI INIT 60af8 100 .cfa: sp 0 + .ra: lr +STACK CFI 60afe .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 60b02 .cfa: sp 600 + +STACK CFI INIT 60bf8 26 .cfa: sp 0 + .ra: lr +STACK CFI 60bfa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 60bfc .cfa: sp 32 + +STACK CFI INIT 60c20 398 .cfa: sp 0 + .ra: lr +STACK CFI 60c24 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 60c26 .cfa: sp 176 + +STACK CFI INIT 60fb8 100 .cfa: sp 0 + .ra: lr +STACK CFI 60fbe .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 60fc2 .cfa: sp 600 + +STACK CFI INIT 610b8 2e .cfa: sp 0 + .ra: lr +STACK CFI 610ba .cfa: sp 8 + +STACK CFI 610bc .cfa: sp 16 + .ra: .cfa -12 + ^ r4: .cfa -16 + ^ +STACK CFI 610be .cfa: sp 32 + +STACK CFI INIT 610e8 100 .cfa: sp 0 + .ra: lr +STACK CFI 610ee .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 610f2 .cfa: sp 600 + +STACK CFI INIT 611e8 2e .cfa: sp 0 + .ra: lr +STACK CFI 611ea .cfa: sp 8 + +STACK CFI 611ec .cfa: sp 16 + .ra: .cfa -12 + ^ r4: .cfa -16 + ^ +STACK CFI 611ee .cfa: sp 32 + +STACK CFI INIT 61218 100 .cfa: sp 0 + .ra: lr +STACK CFI 6121e .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 61222 .cfa: sp 600 + +STACK CFI INIT 61318 2e .cfa: sp 0 + .ra: lr +STACK CFI 6131a .cfa: sp 8 + +STACK CFI 6131c .cfa: sp 16 + .ra: .cfa -12 + ^ r4: .cfa -16 + ^ +STACK CFI 6131e .cfa: sp 32 + +STACK CFI INIT 61348 8c .cfa: sp 0 + .ra: lr +STACK CFI 6134e .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 61352 .cfa: sp 32 + +STACK CFI INIT 613d4 9c .cfa: sp 0 + .ra: lr +STACK CFI 613d6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 613da .cfa: sp 24 + +STACK CFI INIT 61470 1d6 .cfa: sp 0 + .ra: lr +STACK CFI 61474 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 61480 .cfa: sp 184 + +STACK CFI INIT 61648 486 .cfa: sp 0 + .ra: lr +STACK CFI 6164c .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6164e .cfa: sp 216 + +STACK CFI INIT 61ad0 6bc .cfa: sp 0 + .ra: lr +STACK CFI 61ad4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 61ad6 .cfa: sp 488 + +STACK CFI INIT 6218c 4e .cfa: sp 0 + .ra: lr +STACK CFI 6218e .cfa: sp 8 + +STACK CFI 62190 .cfa: sp 20 + .ra: .cfa -12 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ +STACK CFI 62192 .cfa: sp 72 + +STACK CFI INIT 621dc 12a .cfa: sp 0 + .ra: lr +STACK CFI 621de .cfa: sp 8 + +STACK CFI 621e4 .cfa: sp 32 + .ra: .cfa -12 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ +STACK CFI 621e6 .cfa: sp 192 + +STACK CFI INIT 0 5e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 32 + +STACK CFI INIT 0 90 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 24 + +STACK CFI INIT 62308 144 .cfa: sp 0 + .ra: lr +STACK CFI 6230c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 62316 .cfa: sp 72 + +STACK CFI INIT 6244c 408 .cfa: sp 0 + .ra: lr +STACK CFI 62450 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 62452 .cfa: sp 200 + +STACK CFI INIT 62854 670 .cfa: sp 0 + .ra: lr +STACK CFI 62856 .cfa: sp 8 + +STACK CFI 6285a .cfa: sp 44 + .ra: .cfa -12 + ^ r10: .cfa -20 + ^ r11: .cfa -16 + ^ r4: .cfa -44 + ^ r5: .cfa -40 + ^ r6: .cfa -36 + ^ r7: .cfa -32 + ^ r8: .cfa -28 + ^ r9: .cfa -24 + ^ +STACK CFI 6285c .cfa: sp 280 + +STACK CFI INIT 62ec4 40 .cfa: sp 0 + .ra: lr +STACK CFI 62ec6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 62ec8 .cfa: sp 56 + +STACK CFI INIT 62f04 104 .cfa: sp 0 + .ra: lr +STACK CFI 62f08 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 62f0a .cfa: sp 144 + +STACK CFI INIT 15cb4 30 .cfa: sp 0 + .ra: lr +STACK CFI 15cb6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 4e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 53234 24 .cfa: sp 0 + .ra: lr +STACK CFI 53236 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 d6 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 14 .cfa: sp 48 + +STACK CFI INIT 0 fc .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI c .cfa: sp 48 + +STACK CFI INIT 0 c4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI c .cfa: sp 40 + +STACK CFI INIT 0 70 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ r7: .cfa -4 + ^ +STACK CFI INIT 0 1b8 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 80 + +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 12 .cfa: sp 24 + +STACK CFI INIT 0 128 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 32 + +STACK CFI INIT 0 134 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 352 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 e2 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 32 + +STACK CFI INIT 0 1a4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 6 .cfa: sp 112 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 40 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 40 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 40 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 40 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 40 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 40 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 40 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 ea .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 212 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 4a .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 48 + +STACK CFI INIT 0 86 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 48 + +STACK CFI INIT 0 34 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 32 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 24 + +STACK CFI INIT 0 8c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 48 + +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 22 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 22 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 cc .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 26 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 280 + +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 280 + +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 280 + +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 280 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 280 + +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 280 + +STACK CFI INIT 0 60 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 280 + +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 280 + +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 280 + +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 280 + +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 280 + +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 53234 24 .cfa: sp 0 + .ra: lr +STACK CFI 53236 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63008 28 .cfa: sp 0 + .ra: lr +STACK CFI 6300a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 c8 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 32 + +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 0 da .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI a .cfa: sp 64 + +STACK CFI INIT 0 40 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 30 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI a .cfa: sp 16 + +STACK CFI INIT 0 e6 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI a .cfa: sp 112 + +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 72 + +STACK CFI INIT 63030 c .cfa: sp 0 + .ra: lr +STACK CFI 63032 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 2c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 6303c 34 .cfa: sp 0 + .ra: lr +STACK CFI 6303e .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 63070 18c .cfa: sp 0 + .ra: lr +STACK CFI 63074 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6307c .cfa: sp 48 + +STACK CFI INIT 631fc 48 .cfa: sp 0 + .ra: lr +STACK CFI 631fe .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 63200 .cfa: sp 24 + +STACK CFI INIT 63244 5c .cfa: sp 0 + .ra: lr +STACK CFI 63246 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 632a0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 632a4 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 e8 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 100 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 56 + +STACK CFI INIT 0 52 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 24 + +STACK CFI INIT 0 3e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 38 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 4e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15ce4 30 .cfa: sp 0 + .ra: lr +STACK CFI 15ce6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 632a8 114 .cfa: sp 0 + .ra: lr +STACK CFI 632ac .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 53a5c 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c4 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 7e .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 6 .cfa: sp 160 + +STACK CFI INIT 0 7c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 8 .cfa: sp 552 + +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 10 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 633cc 74 .cfa: sp 0 + .ra: lr +STACK CFI 633ce .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 633d0 .cfa: sp 32 + +STACK CFI INIT 63440 50 .cfa: sp 0 + .ra: lr +STACK CFI 63442 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 63490 50 .cfa: sp 0 + .ra: lr +STACK CFI 63492 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 634e0 104 .cfa: sp 0 + .ra: lr +STACK CFI 634e4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 634ee .cfa: sp 48 + +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 635e8 18 .cfa: sp 0 + .ra: lr +STACK CFI 635ec .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63600 12 .cfa: sp 0 + .ra: lr +STACK CFI 63602 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63614 1e .cfa: sp 0 + .ra: lr +STACK CFI 63616 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 63634 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 63638 38 .cfa: sp 0 + .ra: lr +STACK CFI 6363a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 63670 68 .cfa: sp 0 + .ra: lr +STACK CFI 63674 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 63676 .cfa: sp 48 + +STACK CFI INIT 636d8 24 .cfa: sp 0 + .ra: lr +STACK CFI 636da .cfa: sp 8 + r4: .cfa -8 + ^ r5: .cfa -4 + ^ +STACK CFI INIT 636fc 3e .cfa: sp 0 + .ra: lr +STACK CFI 636fe .cfa: sp 8 + r4: .cfa -8 + ^ r5: .cfa -4 + ^ +STACK CFI INIT 6373c 19a .cfa: sp 0 + .ra: lr +STACK CFI 63742 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 63746 .cfa: sp 72 + +STACK CFI INIT 638d8 dc .cfa: sp 0 + .ra: lr +STACK CFI 638dc .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r3: .cfa -40 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI INIT 639b4 dc .cfa: sp 0 + .ra: lr +STACK CFI 639b8 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 63a90 96 .cfa: sp 0 + .ra: lr +STACK CFI 63a94 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 63a9e .cfa: sp 56 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63b28 64 .cfa: sp 0 + .ra: lr +STACK CFI 63b2a .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 63b8c 38 .cfa: sp 0 + .ra: lr +STACK CFI 63b90 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63bc4 38 .cfa: sp 0 + .ra: lr +STACK CFI 63bc8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 18 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 40 + +STACK CFI INIT 0 78 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 63bfc 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 63c00 18 .cfa: sp 0 + .ra: lr +STACK CFI 63c04 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63c18 12 .cfa: sp 0 + .ra: lr +STACK CFI 63c1a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63c2c 1a8 .cfa: sp 0 + .ra: lr +STACK CFI 63c30 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 63c32 .cfa: sp 88 + +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a84 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15fb8 18 .cfa: sp 0 + .ra: lr +STACK CFI 15fbc .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15f92 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 16 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + +STACK CFI INIT 0 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 58 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 5e .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 5e .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 1607c 1c .cfa: sp 0 + .ra: lr +STACK CFI 16080 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63dd4 12 .cfa: sp 0 + .ra: lr +STACK CFI 63dd6 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 63de8 2c .cfa: sp 0 + .ra: lr +STACK CFI 63dec .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63e14 18 .cfa: sp 0 + .ra: lr +STACK CFI 63e18 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63e2c 12 .cfa: sp 0 + .ra: lr +STACK CFI 63e2e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63e40 18 .cfa: sp 0 + .ra: lr +STACK CFI 63e44 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63e58 12 .cfa: sp 0 + .ra: lr +STACK CFI 63e5a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63e6c 12 .cfa: sp 0 + .ra: lr +STACK CFI 63e6e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63e80 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 63e88 1a .cfa: sp 0 + .ra: lr +STACK CFI 63e8a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 63ea4 36 .cfa: sp 0 + .ra: lr +STACK CFI 63ea6 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 63ea8 .cfa: sp 32 + +STACK CFI INIT 63edc 1c .cfa: sp 0 + .ra: lr +STACK CFI 63ede .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 63ef8 4c .cfa: sp 0 + .ra: lr +STACK CFI 63efc .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 63f00 .cfa: sp 24 + +STACK CFI INIT 63f44 40 .cfa: sp 0 + .ra: lr +STACK CFI 63f46 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 63f84 24 .cfa: sp 0 + .ra: lr +STACK CFI INIT 63fa8 3c .cfa: sp 0 + .ra: lr +STACK CFI 63fac .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 63fe4 e .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 63ff4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 63ffc e .cfa: sp 0 + .ra: lr +STACK CFI INIT 63ffc e .cfa: sp 0 + .ra: lr +STACK CFI INIT 6400c 3e .cfa: sp 0 + .ra: lr +STACK CFI 6400e .cfa: sp 12 + r4: .cfa -12 + ^ r5: .cfa -8 + ^ r6: .cfa -4 + ^ +STACK CFI INIT 6404c 3c .cfa: sp 0 + .ra: lr +STACK CFI 6404e .cfa: sp 12 + r4: .cfa -12 + ^ r5: .cfa -8 + ^ r6: .cfa -4 + ^ +STACK CFI INIT 63ff4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 63fe4 e .cfa: sp 0 + .ra: lr +STACK CFI INIT 39b2e 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 64088 1c .cfa: sp 0 + .ra: lr +STACK CFI 6408c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 640a4 12 .cfa: sp 0 + .ra: lr +STACK CFI 640a6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 640b8 1c .cfa: sp 0 + .ra: lr +STACK CFI 640bc .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 640d4 12 .cfa: sp 0 + .ra: lr +STACK CFI 640d6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 640e8 18 .cfa: sp 0 + .ra: lr +STACK CFI INIT 64100 66 .cfa: sp 0 + .ra: lr +STACK CFI 64102 .cfa: sp 16 + r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ r7: .cfa -4 + ^ +STACK CFI INIT 64168 18 .cfa: sp 0 + .ra: lr +STACK CFI INIT 64180 1c .cfa: sp 0 + .ra: lr +STACK CFI 64184 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 6419c 12 .cfa: sp 0 + .ra: lr +STACK CFI 6419e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 641b0 1c .cfa: sp 0 + .ra: lr +STACK CFI 641b4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 641cc 12 .cfa: sp 0 + .ra: lr +STACK CFI 641ce .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 641e0 2a .cfa: sp 0 + .ra: lr +STACK CFI 641e2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 6420c 4c .cfa: sp 0 + .ra: lr +STACK CFI 6420e .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI a .cfa: sp 16 + +STACK CFI INIT 64258 52 .cfa: sp 0 + .ra: lr +STACK CFI 6425a .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 642ac c .cfa: sp 0 + .ra: lr +STACK CFI INIT 642b8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 642c4 1c .cfa: sp 0 + .ra: lr +STACK CFI INIT 642e0 1c .cfa: sp 0 + .ra: lr +STACK CFI INIT 642fc 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 642fc 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 64300 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 64314 24 .cfa: sp 0 + .ra: lr +STACK CFI INIT 64338 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 6434c 24 .cfa: sp 0 + .ra: lr +STACK CFI INIT 642fc 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 64370 12 .cfa: sp 0 + .ra: lr +STACK CFI INIT 64384 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 64390 24 .cfa: sp 0 + .ra: lr +STACK CFI 64394 .cfa: sp 8 + r4: .cfa -8 + ^ r5: .cfa -4 + ^ +STACK CFI INIT 643b4 1c .cfa: sp 0 + .ra: lr +STACK CFI 643b8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 643d0 12 .cfa: sp 0 + .ra: lr +STACK CFI 643d2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 643e4 12 .cfa: sp 0 + .ra: lr +STACK CFI 643e6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 643f8 12 .cfa: sp 0 + .ra: lr +STACK CFI 643fa .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 6440c 28 .cfa: sp 0 + .ra: lr +STACK CFI 64416 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 64434 12 .cfa: sp 0 + .ra: lr +STACK CFI 64436 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 64448 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 64454 2a .cfa: sp 0 + .ra: lr +STACK CFI 64456 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 64480 20 .cfa: sp 0 + .ra: lr +STACK CFI 64482 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 644a0 44 .cfa: sp 0 + .ra: lr +STACK CFI 644a4 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 a4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ r7: .cfa -4 + ^ +STACK CFI INIT 0 1a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 24 + +STACK CFI INIT 0 a4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ r7: .cfa -4 + ^ +STACK CFI INIT 0 1a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 24 + +STACK CFI INIT 644e4 aa .cfa: sp 0 + .ra: lr +STACK CFI 644e8 .cfa: sp 12 + r4: .cfa -12 + ^ r5: .cfa -8 + ^ r6: .cfa -4 + ^ +STACK CFI INIT 64590 22 .cfa: sp 0 + .ra: lr +STACK CFI 64592 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 64594 .cfa: sp 32 + +STACK CFI INIT 645b4 ce .cfa: sp 0 + .ra: lr +STACK CFI 645b8 .cfa: sp 16 + r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ r7: .cfa -4 + ^ +STACK CFI INIT 64684 22 .cfa: sp 0 + .ra: lr +STACK CFI 64686 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 64688 .cfa: sp 40 + +STACK CFI INIT 646a8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 646a8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 646ac 2c .cfa: sp 0 + .ra: lr +STACK CFI 646ae .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI 646b4 .cfa: sp 16 + +STACK CFI INIT 646d8 2c .cfa: sp 0 + .ra: lr +STACK CFI 646da .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI 646e0 .cfa: sp 16 + +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 646a8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 646a8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 646ac 2c .cfa: sp 0 + .ra: lr +STACK CFI 646ae .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI 646b4 .cfa: sp 16 + +STACK CFI INIT 646d8 2c .cfa: sp 0 + .ra: lr +STACK CFI 646da .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI 646e0 .cfa: sp 16 + +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 646a8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 646a8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 646ac 2c .cfa: sp 0 + .ra: lr +STACK CFI 646ae .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI 646b4 .cfa: sp 16 + +STACK CFI INIT 646d8 2c .cfa: sp 0 + .ra: lr +STACK CFI 646da .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI 646e0 .cfa: sp 16 + +STACK CFI INIT 646a8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 646a8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 15dc8 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 646ac 2c .cfa: sp 0 + .ra: lr +STACK CFI 646ae .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI 646b4 .cfa: sp 16 + +STACK CFI INIT 646d8 2c .cfa: sp 0 + .ra: lr +STACK CFI 646da .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI 646e0 .cfa: sp 16 + +STACK CFI INIT 64704 1c .cfa: sp 0 + .ra: lr +STACK CFI 64708 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 64720 12 .cfa: sp 0 + .ra: lr +STACK CFI 64722 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 64734 1c .cfa: sp 0 + .ra: lr +STACK CFI 64738 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 64750 12 .cfa: sp 0 + .ra: lr +STACK CFI 64752 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 64764 1c .cfa: sp 0 + .ra: lr +STACK CFI 64768 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 64780 12 .cfa: sp 0 + .ra: lr +STACK CFI 64782 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 64794 1c .cfa: sp 0 + .ra: lr +STACK CFI 64798 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 647b0 12 .cfa: sp 0 + .ra: lr +STACK CFI 647b2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 647c4 44 .cfa: sp 0 + .ra: lr +STACK CFI 647c6 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 64808 44 .cfa: sp 0 + .ra: lr +STACK CFI 6480a .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 6484c 44 .cfa: sp 0 + .ra: lr +STACK CFI 6484e .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 64890 44 .cfa: sp 0 + .ra: lr +STACK CFI 64892 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 648d4 1c .cfa: sp 0 + .ra: lr +STACK CFI 648d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 648da .cfa: sp 16 + +STACK CFI INIT 648d4 1c .cfa: sp 0 + .ra: lr +STACK CFI 648d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 648da .cfa: sp 16 + +STACK CFI INIT 648d4 1c .cfa: sp 0 + .ra: lr +STACK CFI 648d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 648da .cfa: sp 16 + +STACK CFI INIT 648d4 1c .cfa: sp 0 + .ra: lr +STACK CFI 648d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 648da .cfa: sp 16 + +STACK CFI INIT 648d4 1c .cfa: sp 0 + .ra: lr +STACK CFI 648d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 648da .cfa: sp 16 + +STACK CFI INIT 648d4 1c .cfa: sp 0 + .ra: lr +STACK CFI 648d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 648da .cfa: sp 16 + +STACK CFI INIT 648d4 1c .cfa: sp 0 + .ra: lr +STACK CFI 648d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 648da .cfa: sp 16 + +STACK CFI INIT 648d4 1c .cfa: sp 0 + .ra: lr +STACK CFI 648d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 648da .cfa: sp 16 + +STACK CFI INIT 648d4 1c .cfa: sp 0 + .ra: lr +STACK CFI 648d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 648da .cfa: sp 16 + +STACK CFI INIT 648d4 1c .cfa: sp 0 + .ra: lr +STACK CFI 648d8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 648da .cfa: sp 16 + +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI a .cfa: sp 16 + +STACK CFI INIT 648f0 5c .cfa: sp 0 + .ra: lr +STACK CFI 648f2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 6494c 1c .cfa: sp 0 + .ra: lr +STACK CFI 64950 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 64952 .cfa: sp 16 + +STACK CFI INIT 6494c 1c .cfa: sp 0 + .ra: lr +STACK CFI 64950 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 64952 .cfa: sp 16 + +STACK CFI INIT 6494c 1c .cfa: sp 0 + .ra: lr +STACK CFI 64950 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 64952 .cfa: sp 16 + +STACK CFI INIT 6494c 1c .cfa: sp 0 + .ra: lr +STACK CFI 64950 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 64952 .cfa: sp 16 + +STACK CFI INIT 6494c 1c .cfa: sp 0 + .ra: lr +STACK CFI 64950 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 64952 .cfa: sp 16 + +STACK CFI INIT 6494c 1c .cfa: sp 0 + .ra: lr +STACK CFI 64950 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 64952 .cfa: sp 16 + +STACK CFI INIT 64968 64 .cfa: sp 0 + .ra: lr +STACK CFI 6496e .cfa: sp 12 + r4: .cfa -12 + ^ r5: .cfa -8 + ^ r6: .cfa -4 + ^ +STACK CFI INIT 649cc c .cfa: sp 0 + .ra: lr +STACK CFI INIT 649d8 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 649e4 9c .cfa: sp 0 + .ra: lr +STACK CFI 649e8 .cfa: sp 16 + r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ r7: .cfa -4 + ^ +STACK CFI INIT 64a80 2a .cfa: sp 0 + .ra: lr +STACK CFI 64a82 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 64aac 14 .cfa: sp 0 + .ra: lr +STACK CFI INIT 64ac0 c .cfa: sp 0 + .ra: lr +STACK CFI INIT 64acc c .cfa: sp 0 + .ra: lr +STACK CFI INIT 64ad8 9a .cfa: sp 0 + .ra: lr +STACK CFI 64adc .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 64ae0 .cfa: sp 48 + +STACK CFI INIT 64b74 b4 .cfa: sp 0 + .ra: lr +STACK CFI 64b78 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 64b7c .cfa: sp 48 + +STACK CFI INIT 64c28 126 .cfa: sp 0 + .ra: lr +STACK CFI 64c2c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 64c30 .cfa: sp 40 + +STACK CFI INIT 64d50 24 .cfa: sp 0 + .ra: lr +STACK CFI 64d52 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 64d54 .cfa: sp 80 + +STACK CFI INIT 64d74 10c .cfa: sp 0 + .ra: lr +STACK CFI 64d7c .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 64e80 12a .cfa: sp 0 + .ra: lr +STACK CFI 64e84 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 64fac 78 .cfa: sp 0 + .ra: lr +STACK CFI 64fb2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 65024 e4 .cfa: sp 0 + .ra: lr +STACK CFI 65028 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI INIT 65108 b4 .cfa: sp 0 + .ra: lr +STACK CFI 6510a .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 651bc 10c .cfa: sp 0 + .ra: lr +STACK CFI 651c0 .cfa: sp 40 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r3: .cfa -40 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI INIT 652c8 400 .cfa: sp 0 + .ra: lr +STACK CFI 652cc .cfa: sp 32 + r10: .cfa -8 + ^ r11: .cfa -4 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 652d0 .cfa: sp 128 + +STACK CFI INIT 656c8 4a8 .cfa: sp 0 + .ra: lr +STACK CFI 656cc .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ +STACK CFI 656ce .cfa: sp 136 + +STACK CFI INIT 65b70 78 .cfa: sp 0 + .ra: lr +STACK CFI 65b74 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 65b84 .cfa: sp 48 + +STACK CFI INIT 65be8 16 .cfa: sp 0 + .ra: lr +STACK CFI 65bea .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 65c00 12 .cfa: sp 0 + .ra: lr +STACK CFI 65c02 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 65c14 348 .cfa: sp 0 + .ra: lr +STACK CFI 65c1a .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 65c1e .cfa: sp 144 + +STACK CFI INIT 65f5c 11c .cfa: sp 0 + .ra: lr +STACK CFI 65f60 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 65f62 .cfa: sp 56 + +STACK CFI INIT 66078 12 .cfa: sp 0 + .ra: lr +STACK CFI 6607a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 6608c 88 .cfa: sp 0 + .ra: lr +STACK CFI 66094 .cfa: sp 16 + r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ r7: .cfa -4 + ^ +STACK CFI INIT 66114 16a .cfa: sp 0 + .ra: lr +STACK CFI 66118 .cfa: sp 12 + r4: .cfa -12 + ^ r5: .cfa -8 + ^ r6: .cfa -4 + ^ +STACK CFI INIT 66280 11c .cfa: sp 0 + .ra: lr +STACK CFI 66286 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 6628a .cfa: sp 32 + +STACK CFI INIT 6639c 138 .cfa: sp 0 + .ra: lr +STACK CFI 663a0 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 663a2 .cfa: sp 360 + +STACK CFI INIT 65108 b4 .cfa: sp 0 + .ra: lr +STACK CFI 6510a .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 664d4 220 .cfa: sp 0 + .ra: lr +STACK CFI 664d8 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 664da .cfa: sp 48 + +STACK CFI INIT 0 8e .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 12 + r4: .cfa -12 + ^ r5: .cfa -8 + ^ r6: .cfa -4 + ^ +STACK CFI INIT 0 34 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 24 + +STACK CFI INIT 666f4 6a .cfa: sp 0 + .ra: lr +STACK CFI 666f6 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 66760 54 .cfa: sp 0 + .ra: lr +STACK CFI 66762 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 66766 .cfa: sp 20 + s16: .cfa -20 + ^ +STACK CFI 6676c .cfa: sp 384 + +STACK CFI INIT 667b4 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 667bc 54 .cfa: sp 0 + .ra: lr +STACK CFI 667be .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 667c2 .cfa: sp 20 + s16: .cfa -20 + ^ +STACK CFI 667c8 .cfa: sp 384 + +STACK CFI INIT 66810 8 .cfa: sp 0 + .ra: lr +STACK CFI INIT 66818 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 6681c 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 66818 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 6681c 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 66820 1c .cfa: sp 0 + .ra: lr +STACK CFI 66824 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 6683c 12 .cfa: sp 0 + .ra: lr +STACK CFI 6683e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 66850 1c .cfa: sp 0 + .ra: lr +STACK CFI 66854 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 6686c 12 .cfa: sp 0 + .ra: lr +STACK CFI 6686e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 66880 18 .cfa: sp 0 + .ra: lr +STACK CFI 66882 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 66880 18 .cfa: sp 0 + .ra: lr +STACK CFI 66882 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 66898 1c .cfa: sp 0 + .ra: lr +STACK CFI 6689c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6689e .cfa: sp 16 + +STACK CFI INIT 668b4 1c .cfa: sp 0 + .ra: lr +STACK CFI 668b8 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 668ba .cfa: sp 16 + +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI a .cfa: sp 16 + +STACK CFI INIT 648f0 5c .cfa: sp 0 + .ra: lr +STACK CFI 648f2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 668d0 1c .cfa: sp 0 + .ra: lr +STACK CFI 668d4 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 668d6 .cfa: sp 16 + +STACK CFI INIT 668ec 1c .cfa: sp 0 + .ra: lr +STACK CFI 668f0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 668f2 .cfa: sp 16 + +STACK CFI INIT 0 118 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 66908 c8 .cfa: sp 0 + .ra: lr +STACK CFI 6690c .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 669d0 f0 .cfa: sp 0 + .ra: lr +STACK CFI 669d4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 66ac0 f4 .cfa: sp 0 + .ra: lr +STACK CFI 66ac6 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 66bb4 f4 .cfa: sp 0 + .ra: lr +STACK CFI 66bb8 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 66ca8 12c .cfa: sp 0 + .ra: lr +STACK CFI 66cac .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 66cae .cfa: sp 288 + +STACK CFI INIT 66dd4 120 .cfa: sp 0 + .ra: lr +STACK CFI 66dd8 .cfa: sp 32 + .ra: .cfa -4 + ^ r3: .cfa -32 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI INIT 53234 24 .cfa: sp 0 + .ra: lr +STACK CFI 53236 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 c4 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 66ef4 1c2 .cfa: sp 0 + .ra: lr +STACK CFI 66ef8 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 63008 28 .cfa: sp 0 + .ra: lr +STACK CFI 6300a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 670b8 1ce .cfa: sp 0 + .ra: lr +STACK CFI 670bc .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 53258 40 .cfa: sp 0 + .ra: lr +STACK CFI 5325a .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 67288 6f4 .cfa: sp 0 + .ra: lr +STACK CFI 6728c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 6728e .cfa: sp 184 + +STACK CFI INIT 6797c a .cfa: sp 0 + .ra: lr +STACK CFI 6797e .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI INIT 67988 52 .cfa: sp 0 + .ra: lr +STACK CFI 6798c .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 6798e .cfa: sp 40 + +STACK CFI INIT 679dc 6e0 .cfa: sp 0 + .ra: lr +STACK CFI 679e0 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 679e2 .cfa: sp 176 + +STACK CFI INIT 680bc a .cfa: sp 0 + .ra: lr +STACK CFI 680be .cfa: sp 4 + r4: .cfa -4 + ^ +STACK CFI INIT 680c8 52 .cfa: sp 0 + .ra: lr +STACK CFI 680cc .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI 680ce .cfa: sp 40 + +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI a .cfa: sp 16 + +STACK CFI INIT 0 124 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI a .cfa: sp 40 + +STACK CFI INIT 0 64 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 6811c 284 .cfa: sp 0 + .ra: lr +STACK CFI 68120 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 68124 .cfa: sp 48 + +STACK CFI INIT 0 104 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 102 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI INIT 0 1d4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 48 + +STACK CFI INIT 0 204 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 312 + +STACK CFI INIT 0 154 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI a .cfa: sp 48 + +STACK CFI INIT 604a4 60 .cfa: sp 0 + .ra: lr +STACK CFI 604a6 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 126 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI a .cfa: sp 536 + +STACK CFI INIT 0 1da .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 48 + +STACK CFI INIT 0 208 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 6 .cfa: sp 312 + +STACK CFI INIT 683a0 2b0 .cfa: sp 0 + .ra: lr +STACK CFI 683a4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI 683a8 .cfa: sp 48 + +STACK CFI INIT 53a84 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a5c 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a84 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 53a5c 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 68650 1c .cfa: sp 0 + .ra: lr +STACK CFI 68654 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 6866c 1c .cfa: sp 0 + .ra: lr +STACK CFI 68670 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 68688 20 .cfa: sp 0 + .ra: lr +STACK CFI 6868c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 686a8 20 .cfa: sp 0 + .ra: lr +STACK CFI 686ac .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 48 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 288 + +STACK CFI INIT 0 20 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 686c8 2c .cfa: sp 0 + .ra: lr +STACK CFI 686d0 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 686f4 2c .cfa: sp 0 + .ra: lr +STACK CFI 686fc .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 63008 28 .cfa: sp 0 + .ra: lr +STACK CFI 6300a .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 24 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 3c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 6 .cfa: sp 16 + +STACK CFI INIT 0 54 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 4c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 32 + +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 16 + +STACK CFI INIT 68720 e .cfa: sp 0 + .ra: lr +STACK CFI 68722 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI a .cfa: sp 16 + +STACK CFI INIT 68730 3a .cfa: sp 0 + .ra: lr +STACK CFI 68732 .cfa: sp 24 + .ra: .cfa -4 + ^ r3: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 6876c e .cfa: sp 0 + .ra: lr +STACK CFI 6876e .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 10c .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 6 .cfa: sp 120 + +STACK CFI INIT 0 1c .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI 4 .cfa: sp 16 + +STACK CFI INIT 0 e2 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 32 + +STACK CFI INIT 0 94 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 8 .cfa: sp 32 + +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 44 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 12 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 c4 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI c .cfa: sp 40 + +STACK CFI INIT 0 162 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI a .cfa: sp 56 + +STACK CFI INIT 0 be .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 32 + .ra: .cfa -4 + ^ r10: .cfa -8 + ^ r4: .cfa -32 + ^ r5: .cfa -28 + ^ r6: .cfa -24 + ^ r7: .cfa -20 + ^ r8: .cfa -16 + ^ r9: .cfa -12 + ^ +STACK CFI 18 .cfa: sp 48 + +STACK CFI INIT 0 a2 .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 28 + .ra: .cfa -4 + ^ r4: .cfa -28 + ^ r5: .cfa -24 + ^ r6: .cfa -20 + ^ r7: .cfa -16 + ^ r8: .cfa -12 + ^ r9: .cfa -8 + ^ +STACK CFI c .cfa: sp 40 + +STACK CFI INIT 0 158 .cfa: sp 0 + .ra: lr +STACK CFI 6 .cfa: sp 24 + .ra: .cfa -4 + ^ r4: .cfa -24 + ^ r5: .cfa -20 + ^ r6: .cfa -16 + ^ r7: .cfa -12 + ^ r8: .cfa -8 + ^ +STACK CFI 10 .cfa: sp 48 + +STACK CFI INIT 0 2a .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 70 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ r7: .cfa -4 + ^ +STACK CFI INIT 0 e0 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 12 + .ra: .cfa -4 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI 12 .cfa: sp 24 + +STACK CFI INIT 0 13e .cfa: sp 0 + .ra: lr +STACK CFI 4 .cfa: sp 36 + .ra: .cfa -4 + ^ r10: .cfa -12 + ^ r11: .cfa -8 + ^ r4: .cfa -36 + ^ r5: .cfa -32 + ^ r6: .cfa -28 + ^ r7: .cfa -24 + ^ r8: .cfa -20 + ^ r9: .cfa -16 + ^ +STACK CFI c .cfa: sp 48 + +STACK CFI INIT 0 14 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 4 + .ra: .cfa -4 + ^ +STACK CFI 4 .cfa: sp 16 + +STACK CFI INIT 0 1e .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 16 + .ra: .cfa -4 + ^ r3: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 6 .cfa: sp 0 + .ra: lr +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 0 28 .cfa: sp 0 + .ra: lr +STACK CFI 2 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 6877d 80 .cfa: sp 0 + .ra: lr +STACK CFI INIT 68811 9c .cfa: sp 0 + .ra: lr +STACK CFI INIT 68c90 44 .cfa: sp 0 + .ra: lr +STACK CFI 68cc0 .cfa: sp 16 + .ra: .cfa -12 + ^ +STACK CFI INIT 68cd4 3c .cfa: sp 0 + .ra: lr +STACK CFI 68cfc .cfa: sp 16 + .ra: .cfa -12 + ^ +STACK CFI INIT 68d20 34 .cfa: sp 0 + .ra: lr +STACK CFI INIT 68d54 34 .cfa: sp 0 + .ra: lr +STACK CFI 68d56 .cfa: sp 32 + .ra: .cfa -4 + ^ r0: .cfa -32 + ^ r1: .cfa -28 + ^ r2: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 68d88 30 .cfa: sp 0 + .ra: lr +STACK CFI 68d8a .cfa: sp 32 + .ra: .cfa -4 + ^ r0: .cfa -32 + ^ r1: .cfa -28 + ^ r2: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 68db8 16 .cfa: sp 0 + .ra: lr +STACK CFI INIT 68dce 6e .cfa: sp 0 + .ra: lr +STACK CFI 68dd0 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 68dd4 .cfa: sp 48 + +STACK CFI INIT 68e3c 30 .cfa: sp 0 + .ra: lr +STACK CFI INIT 68e6c a4 .cfa: sp 0 + .ra: lr +STACK CFI 68e70 .cfa: sp 24 + .ra: .cfa -4 + ^ r0: .cfa -24 + ^ r1: .cfa -20 + ^ r2: .cfa -16 + ^ r4: .cfa -12 + ^ r5: .cfa -8 + ^ +STACK CFI INIT 68f10 4a .cfa: sp 0 + .ra: lr +STACK CFI 68f14 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 68f5a e .cfa: sp 0 + .ra: lr +STACK CFI INIT 68f68 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 68f6c 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 68f6e 3a .cfa: sp 0 + .ra: lr +STACK CFI 68f70 .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 68fa8 bc .cfa: sp 0 + .ra: lr +STACK CFI 68faa .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 68fb0 .cfa: sp 1008 + +STACK CFI INIT 69064 4 .cfa: sp 0 + .ra: lr +STACK CFI INIT 69068 4e .cfa: sp 0 + .ra: lr +STACK CFI 6906a .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 6906e .cfa: sp 504 + +STACK CFI INIT 690b6 14 .cfa: sp 0 + .ra: lr +STACK CFI 690b8 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 690ca 44 .cfa: sp 0 + .ra: lr +STACK CFI 690cc .cfa: sp 16 + .ra: .cfa -4 + ^ r4: .cfa -16 + ^ r5: .cfa -12 + ^ r6: .cfa -8 + ^ +STACK CFI INIT 6910e 1a .cfa: sp 0 + .ra: lr +STACK CFI 69110 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 69128 2 .cfa: sp 0 + .ra: lr +STACK CFI INIT 6912a 10 .cfa: sp 0 + .ra: lr +STACK CFI 6912c .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 6913a 34 .cfa: sp 0 + .ra: lr +STACK CFI 6913c .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 6916e 16 .cfa: sp 0 + .ra: lr +STACK CFI 69170 .cfa: sp 24 + .ra: .cfa -4 + ^ r0: .cfa -24 + ^ r1: .cfa -20 + ^ r2: .cfa -16 + ^ r3: .cfa -12 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 69184 34 .cfa: sp 0 + .ra: lr +STACK CFI 69186 .cfa: sp 8 + .ra: .cfa -4 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 691b8 18 .cfa: sp 0 + .ra: lr +STACK CFI 691ba .cfa: sp 24 + .ra: .cfa -4 + ^ r0: .cfa -24 + ^ r1: .cfa -20 + ^ r2: .cfa -16 + ^ r3: .cfa -12 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 691d0 70 .cfa: sp 0 + .ra: lr +STACK CFI 691d2 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 691d8 .cfa: sp 592 + +STACK CFI INIT 69240 280 .cfa: sp 0 + .ra: lr +STACK CFI 69242 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 69244 .cfa: sp 64 + +STACK CFI INIT 694c0 a .cfa: sp 0 + .ra: lr +STACK CFI 694c2 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 694ca a .cfa: sp 0 + .ra: lr +STACK CFI 694cc .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 694d4 a .cfa: sp 0 + .ra: lr +STACK CFI 694d6 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 694de 24c .cfa: sp 0 + .ra: lr +STACK CFI 694e0 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 694e2 .cfa: sp 296 + +STACK CFI INIT 698fc 30 .cfa: sp 0 + .ra: lr +STACK CFI INIT 6992c 16 .cfa: sp 0 + .ra: lr +STACK CFI 6992e .cfa: sp 24 + .ra: .cfa -4 + ^ r0: .cfa -24 + ^ r1: .cfa -20 + ^ r2: .cfa -16 + ^ r3: .cfa -12 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 69942 8 .cfa: sp 0 + .ra: lr +STACK CFI 69944 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 6994a 286 .cfa: sp 0 + .ra: lr +STACK CFI 6994c .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 69950 .cfa: sp 48 + +STACK CFI INIT 69bd0 26 .cfa: sp 0 + .ra: lr +STACK CFI 69bd2 .cfa: sp 24 + .ra: .cfa -4 + ^ r0: .cfa -24 + ^ r1: .cfa -20 + ^ r2: .cfa -16 + ^ r3: .cfa -12 + ^ r4: .cfa -8 + ^ +STACK CFI INIT 69bf6 a .cfa: sp 0 + .ra: lr +STACK CFI 69bf8 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 69c00 12 .cfa: sp 0 + .ra: lr +STACK CFI 69c02 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 69c12 6 .cfa: sp 0 + .ra: lr +STACK CFI 69c14 .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 69c18 6 .cfa: sp 0 + .ra: lr +STACK CFI 69c1a .cfa: sp 8 + .ra: .cfa -4 + ^ r3: .cfa -8 + ^ +STACK CFI INIT 69c34 4c .cfa: sp 0 + .ra: lr +STACK CFI 69c36 .cfa: sp 32 + .ra: .cfa -4 + ^ r0: .cfa -32 + ^ r1: .cfa -28 + ^ r2: .cfa -24 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI INIT 69c80 12a .cfa: sp 0 + .ra: lr +STACK CFI 69c82 .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 69c86 .cfa: sp 48 + +STACK CFI INIT 69daa f0 .cfa: sp 0 + .ra: lr +STACK CFI 69dac .cfa: sp 20 + .ra: .cfa -4 + ^ r4: .cfa -20 + ^ r5: .cfa -16 + ^ r6: .cfa -12 + ^ r7: .cfa -8 + ^ +STACK CFI 69db0 .cfa: sp 48 + diff --git a/src/processor/testdata/symbols/microdump/crash_example/6E72E2F1A5F59AB3D51356FDFE394D490/crash_example.sym b/src/processor/testdata/symbols/microdump/crash_example/6E72E2F1A5F59AB3D51356FDFE394D490/crash_example.sym new file mode 100644 index 0000000..a5e31a0 --- /dev/null +++ b/src/processor/testdata/symbols/microdump/crash_example/6E72E2F1A5F59AB3D51356FDFE394D490/crash_example.sym @@ -0,0 +1,56 @@ +MODULE Linux mips 6E72E2F1A5F59AB3D51356FDFE394D490 crash_example +FILE 0 /s/breakpad/src/tools/linux/crash_example.cc +FUNC 80a8 9c 0 google_breakpad::MinidumpDescriptor::MinidumpDescriptor +80a8 20 75 8 +80c8 38 78 8 +8100 10 78 8 +8110 14 78 8 +8124 10 78 8 +8134 10 78 8 +FUNC 815c a0 0 DumpCallback +815c 2c 13 37 +8188 1c 14 37 +81a4 14 15 37 +81b8 1c 15 37 +81d4 14 17 37 +81e8 4 18 37 +81ec 10 19 37 +FUNC 81fc 2c 0 Leaf +81fc 10 21 37 +820c 8 22 37 +8214 8 23 37 +821c 4 25 37 +8220 8 26 37 +FUNC 8228 58 0 blaTest +8228 1c 28 37 +8244 c 29 37 +8250 20 30 37 +8270 10 31 37 +FUNC 8280 40 0 Crash +8280 18 33 37 +8298 4 34 37 +829c 14 35 37 +82b0 10 36 37 +FUNC 831c f4 0 main +831c 2c 40 37 +8348 c 40 37 +8354 18 41 37 +836c 34 43 37 +83a0 10 44 37 +83b0 4 45 37 +83b4 14 43 37 +83c8 18 45 37 +83e0 30 46 37 +PUBLIC 831c 0 main +STACK CFI INIT 8228 58 .cfa: $sp 0 + .ra: $ra +STACK CFI 822c .cfa: $sp 32 + +STACK CFI 8234 $gp: .cfa -16 + ^ .ra: .cfa -8 + ^ +STACK CFI 827c $gp: $gp .cfa: $sp 0 + .ra: .ra +STACK CFI INIT 8280 40 .cfa: $sp 0 + .ra: $ra +STACK CFI 8284 .cfa: $sp 32 + +STACK CFI 828c $gp: .cfa -16 + ^ .ra: .cfa -8 + ^ +STACK CFI 82bc $gp: $gp .cfa: $sp 0 + .ra: .ra +STACK CFI INIT 831c f4 .cfa: $sp 0 + .ra: $ra +STACK CFI 8320 .cfa: $sp 352 + +STACK CFI 832c $gp: .cfa -16 + ^ $s0: .cfa -24 + ^ .ra: .cfa -8 + ^ +STACK CFI 840c $gp: $gp $s0: $s0 .cfa: $sp 0 + .ra: .ra diff --git a/src/processor/testdata/symbols/microdump/crash_example/8F36148CC4647A8116CAF2A25F591F570/crash_example.sym b/src/processor/testdata/symbols/microdump/crash_example/8F36148CC4647A8116CAF2A25F591F570/crash_example.sym new file mode 100644 index 0000000..407d230 --- /dev/null +++ b/src/processor/testdata/symbols/microdump/crash_example/8F36148CC4647A8116CAF2A25F591F570/crash_example.sym @@ -0,0 +1,48 @@ +MODULE Linux mips 8F36148CC4647A8116CAF2A25F591F570 crash_example +FILE 0 /home/rtrk/chromium_mips/chromium/src/out-android-mips/Debug/../../breakpad/src/tools/linux/crash_example.cc +FUNC 2ea4 b4 0 google_breakpad::MinidumpDescriptor::MinidumpDescriptor +2ea4 20 75 6 +2ec4 40 78 6 +2f04 18 78 6 +2f1c 14 78 6 +2f30 18 78 6 +2f48 10 78 6 +FUNC 2f6c c4 0 DumpCallback +2f6c 28 13 33 +2f94 28 14 33 +2fbc 1c 15 33 +2fd8 28 15 33 +3000 1c 17 33 +301c 4 18 33 +3020 10 19 33 +FUNC 3030 28 0 Leaf +3030 4 21 33 +3034 c 22 33 +3040 c 23 33 +304c 4 25 33 +3050 8 26 33 +FUNC 3058 60 0 blaTest +3058 1c 28 33 +3074 c 29 33 +3080 28 30 33 +30a8 10 31 33 +FUNC 30b8 48 0 Crash +30b8 18 33 33 +30d0 4 34 33 +30d4 1c 35 33 +30f0 10 36 33 +FUNC 316c 120 0 main +316c 24 40 33 +3190 c 40 33 +319c 20 41 33 +31bc 40 43 33 +31fc 18 44 33 +3214 4 45 33 +3218 1c 43 33 +3234 20 45 33 +3254 38 46 33 +PUBLIC 316c 0 main +STACK CFI INIT 30b8 48 .cfa: $sp 39792944 + .ra: $ra +STACK CFI 30c8 .cfa: $sp 40 + +STACK CFI 30d0 .ra: .cfa -4 + ^ +STACK CFI 30f8 .cfa: $sp 0 + .ra: .ra diff --git a/src/processor/testdata/symbols/null_read_av/7B7D1968FF0D47AE4366E9C3A7E1B6750/null_read_av.sym b/src/processor/testdata/symbols/null_read_av/7B7D1968FF0D47AE4366E9C3A7E1B6750/null_read_av.sym new file mode 100644 index 0000000..eaf5888 --- /dev/null +++ b/src/processor/testdata/symbols/null_read_av/7B7D1968FF0D47AE4366E9C3A7E1B6750/null_read_av.sym @@ -0,0 +1,6614 @@ +MODULE Linux x86_64 7B7D1968FF0D47AE4366E9C3A7E1B6750 null_read_av +FILE 0 /home/mattdr/crashing-programs/null_read_av.cc +FILE 1 /home/mattdr/google-breakpad/./src/client/linux/crash_generation/crash_generation_client.h +FILE 2 /home/mattdr/google-breakpad/./src/client/linux/handler/minidump_descriptor.h +FILE 3 /home/mattdr/google-breakpad/./src/client/linux/minidump_writer/directory_reader.h +FILE 4 /home/mattdr/google-breakpad/./src/client/linux/minidump_writer/line_reader.h +FILE 5 /home/mattdr/google-breakpad/./src/client/linux/minidump_writer/linux_dumper.h +FILE 6 /home/mattdr/google-breakpad/./src/client/linux/minidump_writer/linux_ptrace_dumper.h +FILE 7 /home/mattdr/google-breakpad/./src/client/linux/minidump_writer/proc_cpuinfo_reader.h +FILE 8 /home/mattdr/google-breakpad/./src/client/minidump_file_writer-inl.h +FILE 9 /home/mattdr/google-breakpad/./src/client/minidump_file_writer.h +FILE 10 /home/mattdr/google-breakpad/./src/common/linux/elfutils-inl.h +FILE 11 /home/mattdr/google-breakpad/./src/common/linux/safe_readlink.h +FILE 12 /home/mattdr/google-breakpad/./src/common/memory.h +FILE 13 /home/mattdr/google-breakpad/./src/common/memory_range.h +FILE 14 /home/mattdr/google-breakpad/./src/common/scoped_ptr.h +FILE 15 /home/mattdr/google-breakpad/./src/third_party/lss/linux_syscall_support.h +FILE 16 /home/mattdr/google-breakpad/src/client/linux/crash_generation/crash_generation_client.cc +FILE 17 /home/mattdr/google-breakpad/src/client/linux/handler/exception_handler.cc +FILE 18 /home/mattdr/google-breakpad/src/client/linux/handler/minidump_descriptor.cc +FILE 19 /home/mattdr/google-breakpad/src/client/linux/handler/minidump_descriptor.h +FILE 20 /home/mattdr/google-breakpad/src/client/linux/log/log.cc +FILE 21 /home/mattdr/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc +FILE 22 /home/mattdr/google-breakpad/src/client/linux/minidump_writer/linux_ptrace_dumper.cc +FILE 23 /home/mattdr/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc +FILE 24 /home/mattdr/google-breakpad/src/client/minidump_file_writer.cc +FILE 25 /home/mattdr/google-breakpad/src/common/convert_UTF.c +FILE 26 /home/mattdr/google-breakpad/src/common/linux/elfutils.cc +FILE 27 /home/mattdr/google-breakpad/src/common/linux/file_id.cc +FILE 28 /home/mattdr/google-breakpad/src/common/linux/guid_creator.cc +FILE 29 /home/mattdr/google-breakpad/src/common/linux/linux_libc_support.cc +FILE 30 /home/mattdr/google-breakpad/src/common/linux/memory_mapped_file.cc +FILE 31 /home/mattdr/google-breakpad/src/common/linux/safe_readlink.cc +FILE 32 /home/mattdr/google-breakpad/src/common/string_conversion.cc +FILE 33 /usr/include/c++/4.7/bits/basic_string.h +FILE 34 /usr/include/c++/4.7/bits/char_traits.h +FILE 35 /usr/include/c++/4.7/bits/list.tcc +FILE 36 /usr/include/c++/4.7/bits/stl_algo.h +FILE 37 /usr/include/c++/4.7/bits/stl_algobase.h +FILE 38 /usr/include/c++/4.7/bits/stl_iterator.h +FILE 39 /usr/include/c++/4.7/bits/stl_iterator_base_funcs.h +FILE 40 /usr/include/c++/4.7/bits/stl_list.h +FILE 41 /usr/include/c++/4.7/bits/stl_uninitialized.h +FILE 42 /usr/include/c++/4.7/bits/stl_vector.h +FILE 43 /usr/include/c++/4.7/bits/vector.tcc +FILE 44 /usr/include/c++/4.7/ext/atomicity.h +FILE 45 /usr/include/c++/4.7/ext/new_allocator.h +FILE 46 /usr/include/x86_64-linux-gnu/bits/stdio2.h +FUNC 1c10 1a 0 __gnu_cxx::__exchange_and_add_dispatch +1c10 a 80 44 +1c1a 8 48 44 +1c22 2 66 44 +1c24 5 67 44 +1c29 1 87 44 +FUNC 1c2a 1a 0 __gnu_cxx::__exchange_and_add_dispatch +1c2a a 80 44 +1c34 8 48 44 +1c3c 2 66 44 +1c3e 5 67 44 +1c43 1 87 44 +FUNC 1c44 27 0 sys_close +1c44 1 2725 15 +1c45 15 2725 15 +1c5a d 2725 15 +1c67 4 2725 15 +FUNC 1c6c 20 0 google_breakpad::ProcCpuInfoReader::GetValueAndLen(unsigned long*) +1c6c 7 116 7 +1c73 1 115 7 +1c74 18 116 7 +FUNC 1c8c 20 0 google_breakpad::TypedMDRVA::CopyIndex(unsigned int, MDRawDirectory*) +1c8c 7 73 8 +1c93 1 72 8 +1c94 18 73 8 +FUNC 1cac 20 0 google_breakpad::TypedMDRVA::AllocateObjectAndArray(unsigned long, unsigned long) +1cac 7 66 8 +1cb3 1 64 8 +1cb4 18 66 8 +FUNC 1ccc 20 0 google_breakpad::TypedMDRVA::CopyIndexAfterObject(unsigned int, void const*, unsigned long) +1ccc 7 83 8 +1cd3 1 80 8 +1cd4 18 83 8 +FUNC 1cec 1ac 0 MinidumpWriter::WriteFile +1cec 2 1584 23 +1cee 5 2822 15 +1cf3 12 1584 23 +1d05 5 1584 23 +1d0a 1f 2822 15 +1d29 2 1586 23 +1d2b 3 2822 15 +1d2e 2 1586 23 +1d30 7 1587 23 +1d37 a 1227 23 +1d41 2 1601 23 +1d43 3 2838 15 +1d46 c 1227 23 +1d52 7 1598 23 +1d59 b 1599 23 +1d64 9 1605 23 +1d6d 5 2838 15 +1d72 8 1605 23 +1d7a d 2838 15 +1d87 f 2838 15 +1d96 3 1604 23 +1d99 2 2838 15 +1d9b 4 1604 23 +1d9f 5 1608 23 +1da4 4 1612 23 +1da8 3 1611 23 +1dab 7 1613 23 +1db2 4 1612 23 +1db6 2 1613 23 +1db8 13 1227 23 +1dcb 3 1614 23 +1dce b 1617 23 +1dd9 9 1616 23 +1de2 8 1620 23 +1dea 9 1622 23 +1df3 5 1625 23 +1df8 3 1626 23 +1dfb 9 161 9 +1e04 5 1625 23 +1e09 5 161 9 +1e0e 8 1626 23 +1e16 4 161 9 +1e1a d 1626 23 +1e27 4 1628 23 +1e2b 9 1633 23 +1e34 26 1635 23 +1e5a e 1638 23 +1e68 3 1639 23 +1e6b 9 1628 23 +1e74 c 176 9 +1e80 7 1641 23 +1e87 2 1642 23 +1e89 f 1643 23 +FUNC 1e98 3f 0 MinidumpWriter::WriteProcFile +1e98 f 1712 23 +1ea7 e 1715 23 +1eb5 2 1716 23 +1eb7 4 1715 23 +1ebb 10 1717 23 +1ecb c 1718 23 +FUNC 1ed8 20 0 google_breakpad::TypedMDRVA::CopyIndexAfterObject(unsigned int, void const*, unsigned long) +1ed8 7 83 8 +1edf 1 80 8 +1ee0 18 83 8 +FUNC 1ef8 20 0 google_breakpad::TypedMDRVA::AllocateObjectAndArray(unsigned long, unsigned long) +1ef8 7 66 8 +1eff 1 64 8 +1f00 18 66 8 +FUNC 1f18 20 0 google_breakpad::LineReader::PopLine(unsigned int) +1f18 7 116 4 +1f1f 1 113 4 +1f20 18 116 4 +FUNC 1f40 f3 0 main +1f40 1 21 0 +1f41 5 22 0 +1f46 7 21 0 +1f4d f 22 0 +1f5c 17 54 19 +1f73 5 713 33 +1f78 9 272 33 +1f81 12 54 19 +1f93 7 55 19 +1f9a a 22 0 +1fa4 26 25 0 +1fca 1b 27 0 +1fe5 b 28 0 +1ff0 19 55 19 +2009 15 22 0 +201e 15 27 0 +FUNC 2140 2c 0 MinidumpCallback(google_breakpad::MinidumpDescriptor const&, void*, bool) +2140 1 8 0 +2141 2 8 0 +2143 4 28 0 +2147 10 11 0 +2157 11 105 46 +2168 4 13 0 +FUNC 2170 8 0 crash() +2170 7 18 0 +2177 1 19 0 +FUNC 2180 90 0 google_breakpad::MinidumpDescriptor::~MinidumpDescriptor() +2180 8 46 19 +2188 4 290 33 +218c 4 536 33 +2190 9 237 33 +2199 4 290 33 +219d 4 536 33 +21a1 9 237 33 +21aa 6 46 19 +21b0 5 80 44 +21b5 4 242 33 +21b9 5 80 44 +21be 7 48 44 +21c5 4 242 33 +21c9 c 246 33 +21d5 5 80 44 +21da 4 242 33 +21de 5 80 44 +21e3 7 48 44 +21ea 4 242 33 +21ee c 246 33 +21fa 3 66 44 +21fd 8 67 44 +2205 3 66 44 +2208 8 67 44 +FUNC 2210 f5 0 google_breakpad::ExceptionHandler::InstallHandlersLocked() +2210 d 241 17 +221d 16 240 17 +2233 2 241 17 +2235 7 240 17 +223c 28 246 17 +2264 6 245 17 +226a c 252 17 +2276 a 251 17 +2280 7 240 17 +2287 3 251 17 +228a 3 240 17 +228d 8 252 17 +2295 f 256 17 +22a4 5 255 17 +22a9 7 258 17 +22b0 b 259 17 +22bb 4 258 17 +22bf 10 262 17 +22cf 5 261 17 +22d4 7 267 17 +22db 7 269 17 +22e2 5 268 17 +22e7 10 269 17 +22f7 2 242 17 +22f9 9 269 17 +2302 2 242 17 +2304 1 269 17 +FUNC 2310 8b 0 google_breakpad::ExceptionHandler::RestoreHandlersLocked() +2310 9 275 17 +2319 22 274 17 +233b 2 275 17 +233d 4 274 17 +2341 26 279 17 +2367 6 278 17 +236d 7 283 17 +2374 1c 284 17 +2390 b 280 17 +FUNC 23a0 104 0 google_breakpad::ExceptionHandler::SendContinueSignalToChild() +23a0 22 497 17 +23c2 a 2887 15 +23cc 18 2887 15 +23e4 5 501 17 +23e9 1f 508 17 +2408 8 497 17 +2410 11 504 17 +2421 28 505 17 +2449 a 508 17 +2453 7 506 17 +245a a 508 17 +2464 5 506 17 +2469 4 508 17 +246d b 506 17 +2478 10 2887 15 +2488 3 500 17 +248b 5 2887 15 +2490 14 500 17 +FUNC 24b0 477 0 google_breakpad::ExceptionHandler::GenerateDump(google_breakpad::ExceptionHandler::CrashContext*) +24b0 2b 433 17 +24db 4 106 14 +24df 5 434 17 +24e4 d 435 17 +24f1 37 494 17 +2528 5 60 12 +252d d 2936 15 +253a 5 60 12 +253f 2 86 12 +2541 3 60 12 +2544 9 86 12 +254d 3 115 12 +2550 5 2936 15 +2555 3 86 12 +2558 5 2936 15 +255d 3 86 12 +2560 3 115 12 +2563 24 2936 15 +2587 9 441 17 +2590 6 120 12 +2596 4 440 17 +259a 7 124 12 +25a1 4 125 12 +25a5 6 440 17 +25ab e 444 17 +25b9 7 443 17 +25c0 5 444 17 +25c5 4 448 17 +25c9 5 447 17 +25ce a 448 17 +25d8 5 449 17 +25dd 5 450 17 +25e2 4 449 17 +25e6 4 457 17 +25ea 9 451 17 +25f3 21 3484 15 +2614 11 463 17 +2625 2e 464 17 +2653 11 465 17 +2664 57 2010 15 +26bb 6 2012 15 +26c1 3 2010 15 +26c4 18 2012 15 +26dc 2d 2829 15 +2709 8 475 17 +2711 5 477 17 +2716 3 2998 15 +2719 5 477 17 +271e 26 2998 15 +2744 c 2998 15 +2750 5 476 17 +2755 5 476 17 +275a 57 2725 15 +27b1 9 483 17 +27ba c 490 17 +27c6 b 490 17 +27d1 f 490 17 +27e0 9 491 17 +27e9 12 492 17 +27fb d 2812 15 +2808 3 136 12 +280b 3 135 12 +280e 3 2812 15 +2811 4 136 12 +2815 19 2812 15 +282e 12 134 12 +2840 3 476 17 +2843 2 2998 15 +2845 b 476 17 +2850 10 433 17 +2860 11 485 17 +2871 2e 486 17 +289f 11 487 17 +28b0 20 490 17 +28d0 10 457 17 +28e0 b 441 17 +28eb 6 2812 15 +28f1 3 136 12 +28f4 3 135 12 +28f7 3 2812 15 +28fa 4 136 12 +28fe 19 2812 15 +2917 10 134 12 +FUNC 2930 19c 0 google_breakpad::ExceptionHandler::HandleSignal(int, siginfo*, void*) +2930 16 385 17 +2946 3 390 17 +2949 8 393 17 +2951 2f 2829 15 +2980 3 397 17 +2983 10 398 17 +2993 8b 397 17 +2a1e 3 398 17 +2a21 c 404 17 +2a2d 10 407 17 +2a3d 13 410 17 +2a50 a 411 17 +2a5a 13 412 17 +2a6d b 416 17 +2a78 1f 417 17 +2a97 5 413 17 +2a9c c 417 17 +2aa8 24 393 17 +FUNC 2ad0 68 0 google_breakpad::ExceptionHandler::HandleSignal(int, siginfo*, void*) +2ad0 16 385 17 +2ae6 3 386 17 +2ae9 6 385 17 +2aef 5 386 17 +2af4 a 386 17 +2afe 3a 417 17 +FUNC 2b40 56 0 google_breakpad::ExceptionHandler::SimulateSignalDelivery(int) +2b40 7 421 17 +2b47 7 422 17 +2b4e 4 421 17 +2b52 5 422 17 +2b57 4 421 17 +2b5b 3 422 17 +2b5e 5 426 17 +2b63 8 428 17 +2b6b 4 426 17 +2b6f 5 428 17 +2b74 1a 429 17 +2b8e 8 430 17 +FUNC 2ba0 18b 0 google_breakpad::ExceptionHandler::SignalHandler(int, siginfo*, void*) +2ba0 19 293 17 +2bb9 c 295 17 +2bc5 10 308 17 +2bd5 e 308 17 +2be3 b 327 17 +2bee 3 693 17 +2bf1 b 626 42 +2bfc 9 327 17 +2c05 1a 293 17 +2c1f 15 328 17 +2c34 18 327 17 +2c4c 4 336 17 +2c50 9 337 17 +2c59 c 342 17 +2c65 7 344 17 +2c6c 14 359 17 +2c80 10 339 17 +2c90 d 311 17 +2c9d a 312 17 +2ca7 7 314 17 +2cae 7 317 17 +2cb5 b 315 17 +2cc0 4 314 17 +2cc4 a 317 17 +2cce 12 322 17 +2ce0 14 348 17 +2cf4 12 107 17 +2d06 8 348 17 +2d0e 12 352 17 +2d20 b 320 17 +FUNC 2d30 e0 0 google_breakpad::ExceptionHandler::WaitForContinueSignal() +2d30 a 512 17 +2d3a 2 2838 15 +2d3c 13 512 17 +2d4f 3 512 17 +2d52 5 2838 15 +2d57 14 2838 15 +2d6b 5 516 17 +2d70 20 523 17 +2d90 8 512 17 +2d98 11 519 17 +2da9 28 520 17 +2dd1 17 521 17 +2de8 10 2838 15 +2df8 3 515 17 +2dfb 5 2838 15 +2e00 10 515 17 +FUNC 2e10 58 0 google_breakpad::ExceptionHandler::DoDump(int, void const*, unsigned long) +2e10 4 528 17 +2e14 3 528 17 +2e17 3 693 17 +2e1a 6 528 17 +2e20 4 536 17 +2e24 5 529 17 +2e29 17 536 17 +2e40 8 545 17 +2e48 1b 544 17 +2e63 5 545 17 +FUNC 2e70 28 0 google_breakpad::ExceptionHandler::ThreadEntry(void*) +2e70 1 372 17 +2e71 3 372 17 +2e74 9 377 17 +2e7d 19 380 17 +2e96 2 381 17 +FUNC 2ea0 163 0 google_breakpad::ExceptionHandler::WriteMinidump() +2ea0 8 563 17 +2ea8 5 564 17 +2ead 5 563 17 +2eb2 2 564 17 +2eb4 8 693 17 +2ebc 5 570 17 +2ec1 2d 2829 15 +2eee f 581 17 +2efd 2 583 17 +2eff 4 582 17 +2f03 d 634 17 +2f10 3 693 17 +2f13 9 564 17 +2f1c 9 573 17 +2f25 1b 574 17 +2f40 18 610 17 +2f58 5 2776 15 +2f5d 3 610 17 +2f60 16 2776 15 +2f76 20 2763 15 +2f96 c 615 17 +2fa2 7 612 17 +2fa9 6 615 17 +2faf 8 622 17 +2fb7 5 633 17 +2fbc 8 616 17 +2fc4 5 622 17 +2fc9 5 633 17 +2fce 12 634 17 +2fe0 10 3512 15 +2ff0 13 569 17 +FUNC 3010 cf 0 google_breakpad::ExceptionHandler::AddMappingInfo(std::string const&, unsigned char const*, unsigned long, unsigned long, unsigned long) +3010 1b 640 17 +302b 3 645 17 +302e 3 640 17 +3031 8 649 17 +3039 5 645 17 +303e 3 640 17 +3041 5 645 17 +3046 4 642 17 +304a 5 643 17 +304f 4 758 40 +3053 5 644 17 +3058 5 645 17 +305d 8 646 17 +3065 e 649 17 +3073 5 94 45 +3078 19 650 17 +3091 5 94 45 +3096 17 120 45 +30ad 3 1526 40 +30b0 20 652 17 +30d0 3 1526 40 +30d3 7 652 17 +30da 5 1526 40 +FUNC 30e0 5d 0 google_breakpad::ExceptionHandler::RegisterAppMemory(void*, unsigned long) +30e0 6 654 17 +30e6 4 758 40 +30ea 1 654 17 +30eb 4 693 17 +30ef 3 654 17 +30f2 14 135 36 +3106 3 156 40 +3109 5 135 36 +310e a 94 45 +3118 e 120 45 +3126 1 666 17 +3127 6 1526 40 +312d 3 666 17 +3130 8 1526 40 +3138 5 666 17 +FUNC 3140 31 0 google_breakpad::ExceptionHandler::UnregisterAppMemory(void*) +3140 1 668 17 +3141 4 693 17 +3145 4 758 40 +3149 d 135 36 +3156 3 156 40 +3159 5 135 36 +315e 2 674 17 +3160 8 1542 40 +3168 3 100 45 +316b 1 674 17 +316c 5 100 45 +FUNC 3180 179 0 google_breakpad::ExceptionHandler::WriteMinidumpForChild(int, int, std::string const&, bool (*)(google_breakpad::MinidumpDescriptor const&, void*, bool), void*) +3180 28 681 17 +31a8 5 54 2 +31ad 3 681 17 +31b0 3 54 2 +31b3 6 681 17 +31b9 d 54 2 +31c6 7 272 33 +31cd 12 54 2 +31df 9 272 33 +31e8 4 713 33 +31ec b 55 2 +31f7 a 684 17 +3201 10 687 17 +3211 4 685 17 +3215 5 690 17 +321a 12 690 17 +322c 9 536 33 +3235 9 237 33 +323e 9 536 33 +3247 5 237 33 +324c 2c 691 17 +3278 8 690 17 +3280 4 688 17 +3284 1f 55 2 +32a3 e 242 33 +32b1 f 246 33 +32c0 12 242 33 +32d2 12 246 33 +32e4 15 690 17 +FUNC 3300 336 0 google_breakpad::ExceptionHandler::~ExceptionHandler() +3300 d 226 17 +330d f 227 17 +331c b 229 17 +3327 8 728 38 +332f 9 900 38 +3338 4 158 36 +333c 4 900 38 +3340 9 160 36 +3349 9 162 36 +3352 a 166 36 +335c a 170 36 +3366 12 174 36 +3378 6 162 36 +337e a 166 36 +3388 a 170 36 +3392 a 174 36 +339c 3 750 38 +339f 4 226 17 +33a3 4 160 36 +33a7 3 226 17 +33aa c 160 36 +33b6 1e 179 36 +33d4 c 728 38 +33e0 4 781 38 +33e4 8 138 43 +33ec a 364 37 +33f6 5 365 37 +33fb 8 140 43 +3403 d 231 17 +3410 8 235 17 +3418 4 436 40 +341c 5 379 40 +3421 4 436 40 +3425 5 379 40 +342a 4 536 33 +342e 7 237 33 +3435 4 536 33 +3439 9 237 33 +3442 8 536 33 +344a 9 237 33 +3453 e 75 14 +3461 f 236 17 +3470 20 366 37 +3490 9 163 17 +3499 a 233 17 +34a3 8 2873 15 +34ab 5 167 17 +34b0 20 2873 15 +34d0 29 750 38 +34f9 9 182 36 +3502 4 750 38 +3506 9 186 36 +350f 4 750 38 +3513 c 728 38 +351f 9 167 17 +3528 e 172 17 +3536 5 184 17 +353b c 185 17 +3547 8 728 38 +354f 8 162 36 +3557 1b 750 38 +3572 8 173 17 +357a 7 2873 15 +3581 2 173 17 +3583 16 2873 15 +3599 12 179 17 +35ab 8 178 17 +35b3 7 179 17 +35ba 7 436 40 +35c1 5 379 40 +35c6 4 436 40 +35ca 5 379 40 +35cf 9 226 17 +35d8 16 75 14 +35ee 12 242 33 +3600 12 246 33 +3612 12 242 33 +3624 12 246 33 +FUNC 3640 31c 0 google_breakpad::ExceptionHandler::ExceptionHandler(google_breakpad::MinidumpDescriptor const&, bool (*)(void*), bool (*)(google_breakpad::MinidumpDescriptor const&, void*, bool), void*, bool, int) +3640 5 197 17 +3645 4 207 17 +3649 20 197 17 +3669 7 207 17 +3670 3 197 17 +3673 4 207 17 +3677 8 71 14 +367f 3 207 17 +3682 4 197 17 +3686 5 207 17 +368b 8 387 40 +3693 2 208 17 +3695 8 207 17 +369d 4 387 40 +36a1 4 388 40 +36a5 4 387 40 +36a9 4 388 40 +36ad 6 208 17 +36b3 7 209 17 +36ba 4 81 14 +36be 3 209 17 +36c1 5 81 14 +36c6 a 82 14 +36d0 4 83 14 +36d4 9 211 17 +36dd c 214 17 +36e9 12 215 17 +36fb 5 217 17 +3700 d 135 17 +370d 5 219 17 +3712 9 221 17 +371b e 883 42 +3729 10 120 45 +3739 8 887 42 +3741 c 222 17 +374d 27 223 17 +3774 9 211 17 +377d a 211 17 +3787 11 212 17 +3798 7 144 17 +379f 21 138 17 +37c0 21 139 17 +37e1 6 144 17 +37e7 2d 2873 15 +3814 8 150 17 +381c 7 151 17 +3823 7 150 17 +382a 2a 2873 15 +3854 14 154 17 +3868 8 120 45 +3870 28 148 17 +3898 18 893 42 +38b0 a 216 17 +38ba 17 88 42 +38d1 f 216 17 +38e0 30 144 17 +3910 a 153 17 +391a f 157 17 +3929 16 75 14 +393f 13 379 40 +3952 a 207 17 +FUNC 3960 167 0 google_breakpad::ExceptionHandler::WriteMinidump(std::string const&, bool (*)(google_breakpad::MinidumpDescriptor const&, void*, bool), void*) +3960 1e 550 17 +397e 5 54 2 +3983 3 550 17 +3986 3 54 2 +3989 3 550 17 +398c d 54 2 +3999 7 272 33 +39a0 12 54 2 +39b2 9 272 33 +39bb 4 713 33 +39bf 7 55 2 +39c6 21 552 17 +39e7 16 553 17 +39fd 9 536 33 +3a06 5 237 33 +3a0b 9 536 33 +3a14 5 237 33 +3a19 2a 554 17 +3a43 1f 55 2 +3a62 e 242 33 +3a70 f 246 33 +3a7f 12 242 33 +3a91 12 246 33 +3aa3 24 553 17 +FUNC 3ad0 2f 0 std::_List_base >::_M_clear() +3ad0 9 66 35 +3ad9 3 70 35 +3adc c 71 35 +3ae8 3 74 35 +3aeb 5 100 45 +3af0 3 71 35 +3af3 3 74 35 +3af6 2 71 35 +3af8 7 82 35 +FUNC 3b00 2f 0 std::_List_base >::_M_clear() +3b00 9 66 35 +3b09 3 70 35 +3b0c c 71 35 +3b18 3 74 35 +3b1b 5 100 45 +3b20 3 71 35 +3b23 3 74 35 +3b26 2 71 35 +3b28 7 82 35 +FUNC 3b30 1ba 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, google_breakpad::ExceptionHandler* const&) +3b30 28 316 43 +3b58 a 320 43 +3b62 10 120 45 +3b72 8 325 43 +3b7a 3 327 43 +3b7d 4 329 43 +3b81 7 559 37 +3b88 5 560 37 +3b8d f 561 37 +3b9c 4 333 43 +3ba0 28 391 43 +3bc8 8 120 45 +3bd0 a 626 42 +3bda 9 215 37 +3be3 4 1308 42 +3be7 9 1309 42 +3bf0 3 900 38 +3bf3 7 342 43 +3bfa 3 900 38 +3bfd 4 342 43 +3c01 15 94 45 +3c16 4 351 43 +3c1a b 120 45 +3c25 3 360 43 +3c28 3 364 37 +3c2b 3 365 37 +3c2e 7 364 37 +3c35 5 365 37 +3c3a 13 366 37 +3c4d 4 364 37 +3c51 5 365 43 +3c56 3 365 37 +3c59 7 364 37 +3c60 5 365 37 +3c65 16 366 37 +3c7b 3 384 43 +3c7e 3 367 37 +3c81 5 174 42 +3c86 5 100 45 +3c8b 3 387 43 +3c8e 3 389 43 +3c91 4 388 43 +3c95 b 389 43 +3ca0 3 900 38 +3ca3 6 342 43 +3ca9 3 900 38 +3cac 9 342 43 +3cb5 13 1309 42 +3cc8 6 900 38 +3cce 3 169 42 +3cd1 7 900 38 +3cd8 4 342 43 +3cdc e 169 42 +FUNC 3cf0 7d 0 google_breakpad::MinidumpDescriptor::MinidumpDescriptor(google_breakpad::MinidumpDescriptor const&) +3cf0 e 38 18 +3cfe 2 42 18 +3d00 6 38 18 +3d06 f 42 18 +3d15 7 272 33 +3d1c 8 42 18 +3d24 8 272 33 +3d2c 8 42 18 +3d34 4 713 33 +3d38 7 46 18 +3d3f f 47 18 +3d4e 1f 46 18 +FUNC 3d70 232 0 google_breakpad::MinidumpDescriptor::UpdatePath() +3d70 b 65 18 +3d7b 9 66 18 +3d84 4 713 33 +3d88 b 66 18 +3d93 e 70 18 +3da1 1f 71 18 +3dc0 1b 70 18 +3ddb 4 713 33 +3ddf 4 74 18 +3de3 10 801 33 +3df3 4 75 18 +3df7 a 2402 33 +3e01 16 1006 33 +3e17 f 2402 33 +3e26 1c 261 34 +3e42 8 1006 33 +3e4a 1c 261 34 +3e66 5 1006 33 +3e6b f 2402 33 +3e7a 16 1006 33 +3e90 d 544 33 +3e9d 5 536 33 +3ea2 7 237 33 +3ea9 4 536 33 +3ead 9 237 33 +3eb6 9 536 33 +3ebf 5 237 33 +3ec4 9 536 33 +3ecd 5 237 33 +3ed2 8 76 18 +3eda 9 77 18 +3ee3 1f 66 18 +3f02 e 242 33 +3f10 f 246 33 +3f1f e 242 33 +3f2d f 246 33 +3f3c 12 242 33 +3f4e 12 246 33 +3f60 42 75 18 +FUNC 3fb0 85 0 google_breakpad::MinidumpDescriptor::operator=(google_breakpad::MinidumpDescriptor const&) +3fb0 9 50 18 +3fb9 4 713 33 +3fbd 7 51 18 +3fc4 5 53 18 +3fc9 4 54 18 +3fcd 2 53 18 +3fcf 4 54 18 +3fd3 5 544 33 +3fd8 4 713 33 +3fdc 4 55 18 +3fe0 d 801 33 +3fed 7 56 18 +3ff4 8 58 18 +3ffc 8 59 18 +4004 8 61 18 +400c a 63 18 +4016 1f 51 18 +FUNC 4040 38 0 logger::write(char const*, unsigned long) +4040 7 40 20 +4047 1a 2887 15 +4061 7 46 20 +4068 e 2887 15 +4076 2 46 20 +FUNC 4080 5d 0 MinidumpWriter::~MinidumpWriter +4080 e 497 23 +408e 3 500 23 +4091 3 497 23 +4094 4 501 23 +4098 2 500 23 +409a a 502 23 +40a4 3 497 23 +40a7 e 503 23 +40b5 b 497 23 +40c0 d 501 23 +40cd 10 497 23 +FUNC 40e0 1e 0 google_breakpad::TypedMDRVA::CopyIndex(unsigned int, MDRawDirectory*) +40e0 5 73 8 +40e5 13 76 8 +40f8 6 72 8 +FUNC 4100 15e5 0 MinidumpWriter::WriteThreadListStream +4100 6 744 23 +4106 4 747 23 +410a e 744 23 +4118 4 745 23 +411c 5 747 23 +4121 14 161 9 +4135 b 212 9 +4140 8 626 42 +4148 3 161 9 +414b b 212 9 +4156 4 626 42 +415a 7 161 9 +4161 4 745 23 +4165 2 748 23 +4167 9 66 8 +4170 f 68 8 +417f b 67 8 +418a d 68 8 +4197 8 748 23 +419f 8 176 9 +41a7 5 754 23 +41ac 7 751 23 +41b3 3 176 9 +41b6 7 752 23 +41bd 8 754 23 +41c5 3 752 23 +41c8 9 762 23 +41d1 4 764 23 +41d5 3 766 23 +41d8 3 764 23 +41db 7 766 23 +41e2 9 767 23 +41eb 8 761 23 +41f3 e 771 23 +4201 10 223 9 +4211 5 771 23 +4216 a 223 9 +4220 14 773 23 +4234 4 774 23 +4238 8 766 42 +4240 7 774 23 +4247 3 780 23 +424a 7 774 23 +4251 6 780 23 +4257 19 841 23 +4270 5 846 23 +4275 6 845 23 +427b 2 846 23 +427d 9 847 23 +4286 8 849 23 +428e 1e 719 23 +42ac 8 161 9 +42b4 4 721 23 +42b8 20 161 9 +42d8 f 721 23 +42e7 8 723 23 +42ef 16 725 23 +4305 2 749 23 +4307 a 216 9 +4311 21 92 8 +4332 1e 875 23 +4350 5 727 23 +4355 4 42 6 +4359 3 71 12 +435c 3 727 23 +435f 4 42 6 +4363 6 71 12 +4369 20 74 12 +4389 3 75 12 +438c 2 76 12 +438e 4 78 12 +4392 3 75 12 +4395 8 77 12 +439d 3 76 12 +43a0 19 729 23 +43b9 19 186 9 +43d2 8 176 9 +43da 8 883 42 +43e2 5 732 23 +43e7 7 176 9 +43ee 7 733 23 +43f5 8 732 23 +43fd 7 733 23 +4404 6 883 42 +440a 14 120 45 +441e 12 887 42 +4430 b 780 23 +443b 6 782 23 +4441 17 780 23 +4458 4 738 23 +445c 8 736 23 +4464 3 716 23 +4467 b 737 23 +4472 8 738 23 +447a 8 212 9 +4482 5 161 9 +4487 7 212 9 +448e 5 47 8 +4493 8 161 9 +449b 3 212 9 +449e 8 47 8 +44a6 14 161 9 +44ba b 46 8 +44c5 5 47 8 +44ca 8 853 23 +44d2 11 855 23 +44e3 8 226 23 +44eb b 224 23 +44f6 3 857 23 +44f9 15 277 23 +450e 8 226 23 +4516 10 228 23 +4526 10 229 23 +4536 10 230 23 +4546 10 231 23 +4556 10 233 23 +4566 f 234 23 +4575 10 236 23 +4585 10 237 23 +4595 10 238 23 +45a5 10 239 23 +45b5 10 242 23 +45c5 10 243 23 +45d5 10 245 23 +45e5 10 246 23 +45f5 10 247 23 +4605 10 248 23 +4615 8 253 23 +461d 8 250 23 +4625 8 253 23 +462d 8 254 23 +4635 8 250 23 +463d 8 252 23 +4645 8 254 23 +464d 8 255 23 +4655 8 252 23 +465d 8 255 23 +4665 10 256 23 +4675 10 257 23 +4685 10 258 23 +4695 10 259 23 +46a5 10 260 23 +46b5 10 261 23 +46c5 10 262 23 +46d5 10 264 23 +46e5 10 266 23 +46f5 10 267 23 +4705 f 268 23 +4714 10 269 23 +4724 8 270 23 +472c a 271 23 +4736 a 273 23 +4740 7 270 23 +4747 f 272 23 +4756 e 274 23 +4764 e 275 23 +4772 100 276 23 +4872 3 277 23 +4875 2 857 23 +4877 8 42 6 +487f a 606 23 +4889 a 616 23 +4893 3 604 23 +4896 15 606 23 +48ab 9 614 23 +48b4 3 615 23 +48b7 9 616 23 +48c0 8 605 23 +48c8 3 615 23 +48cb 5 606 23 +48d0 4 860 23 +48d4 7 859 23 +48db 8 176 9 +48e3 4 860 23 +48e7 e 859 23 +48f5 e 860 23 +4903 a 216 9 +490d 1e 92 8 +492b 8 83 8 +4933 f 871 23 +4942 6 83 8 +4948 1f 87 8 +4967 a 771 23 +4971 f 874 23 +4980 3 861 23 +4983 3 862 23 +4986 3 861 23 +4989 b 862 23 +4994 1c 163 5 +49b0 4 1248 23 +49b4 e 719 23 +49c2 7 1248 23 +49c9 10 719 23 +49d9 8 161 9 +49e1 d 725 23 +49ee 1b 161 9 +4a09 d 725 23 +4a16 5 727 23 +4a1b 4 42 6 +4a1f 3 71 12 +4a22 3 727 23 +4a25 6 71 12 +4a2b 25 74 12 +4a50 3 75 12 +4a53 2 76 12 +4a55 3 75 12 +4a58 2 77 12 +4a5a 4 75 12 +4a5e 6 77 12 +4a64 5 76 12 +4a69 1a 729 23 +4a83 1d 186 9 +4aa0 8 176 9 +4aa8 8 883 42 +4ab0 5 732 23 +4ab5 7 176 9 +4abc 7 733 23 +4ac3 8 732 23 +4acb 7 733 23 +4ad2 6 883 42 +4ad8 14 120 45 +4aec e 887 42 +4afa 4 738 23 +4afe 8 736 23 +4b06 b 737 23 +4b11 8 716 23 +4b19 8 738 23 +4b21 4 1252 23 +4b25 6 795 23 +4b2b 7 1252 23 +4b32 4 795 23 +4b36 4 42 6 +4b3a 4 626 42 +4b3e 2 795 23 +4b40 7 626 42 +4b47 9 795 23 +4b50 4 796 23 +4b54 8 797 23 +4b5c 10 797 23 +4b6c e 795 23 +4b7a 8 212 9 +4b82 5 161 9 +4b87 7 212 9 +4b8e 5 47 8 +4b93 8 161 9 +4b9b 3 212 9 +4b9e 8 47 8 +4ba6 14 161 9 +4bba b 46 8 +4bc5 5 47 8 +4bca 8 831 23 +4bd2 11 833 23 +4be3 8 834 23 +4beb b 284 23 +4bf6 f 286 23 +4c05 3 288 23 +4c08 c 289 23 +4c14 7 291 23 +4c1b c 288 23 +4c27 7 291 23 +4c2e f 293 23 +4c3d f 294 23 +4c4c f 295 23 +4c5b f 296 23 +4c6a f 298 23 +4c79 c 299 23 +4c85 c 300 23 +4c91 c 301 23 +4c9d c 302 23 +4ca9 c 303 23 +4cb5 c 304 23 +4cc1 c 305 23 +4ccd c 306 23 +4cd9 c 307 23 +4ce5 c 308 23 +4cf1 c 309 23 +4cfd f 311 23 +4d0c b 313 23 +4d17 c 314 23 +4d23 b 315 23 +4d2e c 316 23 +4d3a b 317 23 +4d45 4 318 23 +4d49 a 319 23 +4d53 a 320 23 +4d5d 7 318 23 +4d64 a 321 23 +4d6e a 322 23 +4d78 4 323 23 +4d7c 8 324 23 +4d84 c0 323 23 +4e44 a 324 23 +4e4e 8 323 23 +4e56 8 324 23 +4e5e 7 835 23 +4e65 8 42 6 +4e6d a 606 23 +4e77 e 616 23 +4e85 3 604 23 +4e88 15 606 23 +4e9d 9 614 23 +4ea6 3 615 23 +4ea9 9 616 23 +4eb2 8 605 23 +4eba 3 615 23 +4ebd b 606 23 +4ec8 8 216 9 +4ed0 7 837 23 +4ed7 8 176 9 +4edf 7 837 23 +4ee6 3 838 23 +4ee9 7 837 23 +4ef0 3 838 23 +4ef3 6 216 9 +4ef9 1f 92 8 +4f18 4 804 23 +4f1c 5 161 9 +4f21 c 816 23 +4f2d 8 161 9 +4f35 3 804 23 +4f38 c 161 9 +4f44 5 816 23 +4f49 4 804 23 +4f4d 4 807 23 +4f51 8 161 9 +4f59 3 809 23 +4f5c 8 804 23 +4f64 6 809 23 +4f6a 2 816 23 +4f6c 7 809 23 +4f73 d 816 23 +4f80 8 819 23 +4f88 4 42 6 +4f8c 9 71 12 +4f95 25 74 12 +4fba 3 75 12 +4fbd 3 76 12 +4fc0 3 75 12 +4fc3 8 77 12 +4fcb 5 76 12 +4fd0 1c 824 23 +4fec 7 825 23 +4ff3 14 186 9 +5007 8 176 9 +500f 8 883 42 +5017 7 176 9 +501e e 826 23 +502c 6 883 42 +5032 1c 120 45 +504e 12 887 42 +5060 e 86 12 +506e f 2936 15 +507d 3 86 12 +5080 5 2936 15 +5085 9 86 12 +508e 3 115 12 +5091 31 2936 15 +50c2 1e 89 12 +50e0 1a 637 23 +50fa 8 645 23 +5102 6 652 23 +5108 48 645 23 +5150 8 652 23 +5158 8 656 23 +5160 5 658 23 +5165 5 657 23 +516a 8 651 23 +5172 8 653 23 +517a 8 646 23 +5182 8 647 23 +518a 8 648 23 +5192 8 649 23 +519a 8 650 23 +51a2 8 654 23 +51aa 8 655 23 +51b2 8 657 23 +51ba 8 658 23 +51c2 5 659 23 +51c7 5 660 23 +51cc 8 661 23 +51d4 8 659 23 +51dc 14 660 23 +51f0 1a 637 23 +520a 8 645 23 +5212 6 652 23 +5218 4d 645 23 +5265 8 654 23 +526d 8 655 23 +5275 5 656 23 +527a 5 657 23 +527f 8 651 23 +5287 8 652 23 +528f 8 653 23 +5297 8 646 23 +529f 8 647 23 +52a7 8 648 23 +52af 8 649 23 +52b7 8 650 23 +52bf 8 656 23 +52c7 8 657 23 +52cf 5 658 23 +52d4 5 659 23 +52d9 5 660 23 +52de 8 661 23 +52e6 8 658 23 +52ee 8 659 23 +52f6 d 660 23 +5303 11 86 12 +5314 f 2936 15 +5323 3 86 12 +5326 5 2936 15 +532b 9 86 12 +5334 3 115 12 +5337 37 2936 15 +536e 1d 89 12 +538b 11 86 12 +539c f 2936 15 +53ab 3 86 12 +53ae 5 2936 15 +53b3 9 86 12 +53bc 3 115 12 +53bf 35 2936 15 +53f4 14 89 12 +5408 d 768 23 +5415 c 120 12 +5421 a 124 12 +542b 4 125 12 +542f a 93 12 +5439 3 124 12 +543c 3 125 12 +543f 5 126 12 +5444 16 93 12 +545a 5 94 12 +545f 5 93 12 +5464 11 94 12 +5475 5 96 12 +547a 11 94 12 +548b 9 96 12 +5494 9 78 12 +549d e 79 12 +54ab 8 72 12 +54b3 4 827 23 +54b7 16 893 42 +54cd c 120 12 +54d9 9 124 12 +54e2 5 125 12 +54e7 4 93 12 +54eb 4 124 12 +54ef 3 93 12 +54f2 4 125 12 +54f6 4 124 12 +54fa 4 126 12 +54fe 17 93 12 +5515 5 94 12 +551a 3 93 12 +551d 15 94 12 +5532 a 96 12 +553c 8 94 12 +5544 d 96 12 +5551 a 120 12 +555b 5 124 12 +5560 e 93 12 +556e 3 124 12 +5571 4 125 12 +5575 5 93 12 +557a 3 125 12 +557d 5 93 12 +5582 5 126 12 +5587 8 93 12 +558f 5 94 12 +5594 5 93 12 +5599 f 94 12 +55a8 4 96 12 +55ac a 94 12 +55b6 d 96 12 +55c3 9 78 12 +55cc e 79 12 +55da 7 78 12 +55e1 d 79 12 +55ee e 216 9 +55fc 26 92 8 +5622 e 216 9 +5630 26 92 8 +5656 15 72 12 +566b c 734 23 +5677 e 893 42 +5685 c 734 23 +5691 13 893 42 +56a4 10 868 23 +56b4 1a 874 23 +56ce 17 838 23 +FUNC 56f0 1d12 0 MinidumpWriter::Dump +56f0 2 505 23 +56f2 4 510 23 +56f6 5 47 8 +56fb 12 505 23 +570d 3 42 6 +5710 8 47 8 +5718 14 161 9 +572c 18 212 9 +5744 7 161 9 +574b 18 212 9 +5763 1b 161 9 +577e 2c 212 9 +57aa b 46 8 +57b5 5 47 8 +57ba 8 512 23 +57c2 d 60 8 +57cf b 59 8 +57da 5 60 8 +57df 2 515 23 +57e1 4 514 23 +57e5 a 216 9 +57ef 21 92 8 +5810 a 216 9 +581a 21 92 8 +583b 15 595 23 +5850 8 513 23 +5858 8 223 9 +5860 c 516 23 +586c 2 520 23 +586e b 518 23 +5879 b 519 23 +5884 c 520 23 +5890 7 522 23 +5897 b 527 23 +58a2 b 521 23 +58ad 7 522 23 +58b4 d 527 23 +58c1 8 73 8 +58c9 f 529 23 +58d8 6 73 8 +58de 12 76 8 +58f0 4 933 23 +58f4 4 934 23 +58f8 4 42 6 +58fc 4 626 42 +5900 3 42 6 +5903 7 626 42 +590a 16 80 39 +5920 3 236 40 +5923 4 83 39 +5927 5 80 39 +592c 14 936 23 +5940 9 919 23 +5949 c 936 23 +5955 4 937 23 +5959 11 902 23 +596a 9 938 23 +5973 b 914 23 +597e c 919 23 +598a 3 236 40 +598d 5 914 23 +5992 5 939 23 +5997 4 161 9 +599b 2 943 23 +599d 14 161 9 +59b1 b 212 9 +59bc 7 161 9 +59c3 6 943 23 +59c9 2 944 23 +59cb 8 68 8 +59d3 b 67 8 +59de 1a 68 8 +59f8 8 949 23 +5a00 c 176 9 +5a0c 2 959 23 +5a0e 4 933 23 +5a12 b 953 23 +5a1d 7 955 23 +5a24 7 176 9 +5a2b 11 954 23 +5a3c 6 959 23 +5a42 8 1015 23 +5a4a 3 959 23 +5a4d 8 958 23 +5a55 b 1015 23 +5a60 d 919 23 +5a6d b 959 23 +5a78 9 42 6 +5a81 8 960 23 +5a89 11 902 23 +5a9a 9 961 23 +5aa3 b 914 23 +5aae 13 919 23 +5ac1 3 236 40 +5ac4 5 914 23 +5ac9 14 990 23 +5add 3 992 23 +5ae0 7 994 23 +5ae7 8 992 23 +5aef b 993 23 +5afa 8 994 23 +5b02 5 997 23 +5b07 5 998 23 +5b0c 19 999 23 +5b25 4 1001 23 +5b29 5 998 23 +5b2e 4 1003 23 +5b32 14 161 9 +5b46 5 1003 23 +5b4b 12 1005 23 +5b5d 5 1010 23 +5b62 4 161 9 +5b66 14 1010 23 +5b7a 7 161 9 +5b81 d 1010 23 +5b8e 15 1023 23 +5ba3 b 1014 23 +5bae 5 1023 23 +5bb3 8 1017 23 +5bbb c 1025 23 +5bc7 a 1029 23 +5bd1 8 1026 23 +5bd9 9 1029 23 +5be2 21 186 9 +5c03 8 176 9 +5c0b e 1035 23 +5c19 7 176 9 +5c20 e 1032 23 +5c2e 9 1035 23 +5c37 4 967 23 +5c3b 4 1037 23 +5c3f b 967 23 +5c4a 8 83 8 +5c52 7 1037 23 +5c59 7 967 23 +5c60 6 83 8 +5c66 28 87 8 +5c8e 12 967 23 +5ca0 2 975 23 +5ca2 a 216 9 +5cac 22 92 8 +5cce 8 531 23 +5cd6 8 73 8 +5cde f 533 23 +5ced 6 73 8 +5cf3 15 76 8 +5d08 4 879 23 +5d0c 3 42 6 +5d0f 9 879 23 +5d18 18 895 23 +5d30 2 76 12 +5d32 6 75 12 +5d38 2 77 12 +5d3a 3 76 12 +5d3d 2 77 12 +5d3f 7 78 12 +5d46 a 79 12 +5d50 13 885 23 +5d63 4 161 9 +5d67 c 888 23 +5d73 1b 161 9 +5d8e d 888 23 +5d9b 1b 186 9 +5db6 8 176 9 +5dbe 8 883 42 +5dc6 4 893 23 +5dca 7 176 9 +5dd1 7 894 23 +5dd8 8 893 23 +5de0 7 894 23 +5de7 6 883 42 +5ded 14 120 45 +5e01 8 887 42 +5e09 4 236 40 +5e0d a 879 23 +5e17 8 883 23 +5e1f 3 71 12 +5e22 3 883 23 +5e25 6 71 12 +5e2b 1c 74 12 +5e47 11 86 12 +5e58 f 2936 15 +5e67 3 86 12 +5e6a 5 2936 15 +5e6f 3 115 12 +5e72 9 86 12 +5e7b 5 2936 15 +5e80 5 115 12 +5e85 2b 2936 15 +5eb0 15 89 12 +5ec5 8 120 12 +5ecd 9 124 12 +5ed6 4 125 12 +5eda 8 93 12 +5ee2 3 124 12 +5ee5 3 125 12 +5ee8 4 126 12 +5eec 16 93 12 +5f02 5 94 12 +5f07 3 93 12 +5f0a 11 94 12 +5f1b 5 96 12 +5f20 4 94 12 +5f24 6 96 12 +5f2a d 47 8 +5f37 b 46 8 +5f42 f 47 8 +5f51 8 958 23 +5f59 2a 970 23 +5f83 d 1017 23 +5f90 11 990 23 +5fa1 4 992 23 +5fa5 7 994 23 +5fac 8 992 23 +5fb4 b 993 23 +5fbf 5 994 23 +5fc4 4 997 23 +5fc8 3 994 23 +5fcb 5 997 23 +5fd0 5 998 23 +5fd5 10 999 23 +5fe5 4 1001 23 +5fe9 5 998 23 +5fee 5 1005 23 +5ff3 4 1003 23 +5ff7 8 1010 23 +5fff 5 1003 23 +6004 8 161 9 +600c 3 1005 23 +600f 10 161 9 +601f 7 1010 23 +6026 7 161 9 +602d 12 1010 23 +603f b 1014 23 +604a 7 1020 23 +6051 c 1025 23 +605d 17 1020 23 +6074 5 1025 23 +6079 5 1029 23 +607e 8 1026 23 +6086 9 1029 23 +608f 21 186 9 +60b0 8 176 9 +60b8 e 1035 23 +60c6 7 176 9 +60cd e 1032 23 +60db d 1035 23 +60e8 8 83 8 +60f0 4 1037 23 +60f4 8 976 23 +60fc 7 1037 23 +6103 7 976 23 +610a 6 83 8 +6110 1d 87 8 +612d 4 236 40 +6131 f 970 23 +6140 a 979 23 +614a 8 72 12 +6152 17 893 42 +6169 18 161 9 +6181 b 212 9 +618c 7 161 9 +6193 c 626 42 +619f 9 1043 23 +61a8 c 68 8 +61b4 b 67 8 +61bf c 68 8 +61cb 8 1050 23 +61d3 8 176 9 +61db 4 626 42 +61df 7 1055 23 +61e6 b 1054 23 +61f1 7 176 9 +61f8 4 42 6 +61fc 7 1055 23 +6203 7 626 42 +620a 3 1059 23 +620d 7 1057 23 +6214 2 1059 23 +6216 8 83 8 +621e 8 1061 23 +6226 12 83 8 +6238 3 505 23 +623b a 1061 23 +6245 4 505 23 +6249 3 751 42 +624c 8 83 8 +6254 7 1061 23 +625b 6 83 8 +6261 11 87 8 +6272 4 42 6 +6276 4 626 42 +627a 4 1059 23 +627e 7 626 42 +6285 5 1059 23 +628a 5 1063 23 +628f a 216 9 +6299 1d 92 8 +62b6 8 538 23 +62be 28 540 23 +62e6 4 161 9 +62ea d 212 9 +62f7 5 47 8 +62fc 14 161 9 +6310 b 46 8 +631b 7 161 9 +6322 5 212 9 +6327 d 47 8 +6334 8 1068 23 +633c 8 223 9 +6344 c 1070 23 +6350 8 176 9 +6358 b 1072 23 +6363 5 1080 23 +6368 7 176 9 +636f e 1073 23 +637d 4 42 6 +6381 a 1075 23 +638b 3 1076 23 +638e 4 1077 23 +6392 7 1076 23 +6399 8 1077 23 +63a1 c 1078 23 +63ad a 216 9 +63b7 21 92 8 +63d8 8 542 23 +63e0 28 544 23 +6408 4 161 9 +640c d 212 9 +6419 5 47 8 +641e 14 161 9 +6432 b 46 8 +643d 7 161 9 +6444 4 212 9 +6448 d 47 8 +6455 8 1085 23 +645d 8 223 9 +6465 c 1087 23 +6471 8 176 9 +6479 10 1294 23 +6489 e 1308 23 +6497 5 1294 23 +649c 7 1308 23 +64a3 b 1089 23 +64ae 7 176 9 +64b5 7 1090 23 +64bc 26 1308 23 +64e2 7 1090 23 +64e9 2 1294 23 +64eb 8 1308 23 +64f3 2 1294 23 +64f5 2a 1308 23 +651f 5 2822 15 +6524 13 1308 23 +6537 7 2822 15 +653e 8 1308 23 +6546 a 1317 23 +6550 3 1294 23 +6553 1d 2822 15 +6570 8 1653 23 +6578 b 1649 23 +6583 12 1653 23 +6595 f 1657 23 +65a4 8 1667 23 +65ac 5 1658 23 +65b1 8 1657 23 +65b9 a 1665 23 +65c3 5 1667 23 +65c8 6 1666 23 +65ce 3b 1665 23 +6609 9 1677 23 +6612 12 1683 23 +6624 3 1684 23 +6627 3 1682 23 +662a 14 1667 23 +663e 8 1670 23 +6646 3 1671 23 +6649 3 1670 23 +664c 2 1671 23 +664e 11 1674 23 +665f 18 1705 23 +6677 b 1707 23 +6682 e 1095 23 +6690 7 80 39 +6697 d 47 8 +66a4 b 46 8 +66af d 47 8 +66bc 7 1051 23 +66c3 12 1069 23 +66d5 2 1086 23 +66d7 a 216 9 +66e1 21 92 8 +6702 8 546 23 +670a 28 548 23 +6732 12 551 23 +6744 b 550 23 +674f 9 551 23 +6758 b 1287 23 +6763 b 1288 23 +676e b 1289 23 +6779 28 553 23 +67a1 4 42 6 +67a5 12 556 23 +67b7 b 555 23 +67c2 c 556 23 +67ce b 1287 23 +67d9 b 1288 23 +67e4 b 1289 23 +67ef 28 558 23 +6817 12 561 23 +6829 b 560 23 +6834 9 561 23 +683d b 1287 23 +6848 b 1288 23 +6853 b 1289 23 +685e 28 563 23 +6886 4 42 6 +688a 12 566 23 +689c b 565 23 +68a7 c 566 23 +68b3 b 1287 23 +68be b 1288 23 +68c9 b 1289 23 +68d4 28 568 23 +68fc 4 42 6 +6900 12 571 23 +6912 b 570 23 +691d c 571 23 +6929 b 1287 23 +6934 b 1288 23 +693f b 1289 23 +694a 28 573 23 +6972 4 42 6 +6976 12 576 23 +6988 b 575 23 +6993 c 576 23 +699f b 1287 23 +69aa b 1288 23 +69b5 b 1289 23 +69c0 28 578 23 +69e8 4 42 6 +69ec 12 581 23 +69fe b 580 23 +6a09 c 581 23 +6a15 b 1287 23 +6a20 b 1288 23 +6a2b b 1289 23 +6a36 28 583 23 +6a5e 4 42 6 +6a62 b 585 23 +6a6d 7 42 6 +6a74 4 1099 23 +6a78 4 1101 23 +6a7c 3 1102 23 +6a7f 5 1101 23 +6a84 e 1102 23 +6a92 6 1106 23 +6a98 2 1109 23 +6a9a 9 1106 23 +6aa3 1e 1112 23 +6ac1 10 1115 23 +6ad1 9 1118 23 +6ada f 1110 23 +6ae9 9 1122 23 +6af2 3 1125 23 +6af5 6 505 23 +6afb 3 1130 23 +6afe 3 1125 23 +6b01 5 505 23 +6b06 d 1141 23 +6b13 4 1137 23 +6b17 4 505 23 +6b1b 11 1137 23 +6b2c 4 505 23 +6b30 9 1137 23 +6b39 e 1138 23 +6b47 d 1139 23 +6b54 a 216 9 +6b5e 21 92 8 +6b7f a 216 9 +6b89 21 92 8 +6baa a 216 9 +6bb4 29 92 8 +6bdd d 1119 23 +6bea f 1115 23 +6bf9 d 1116 23 +6c06 d 1194 23 +6c13 b 1287 23 +6c1e b 1288 23 +6c29 b 1289 23 +6c34 28 588 23 +6c5c a 593 23 +6c66 a 594 23 +6c70 1e 1158 23 +6c8e 8 1159 23 +6c96 4 1155 23 +6c9a 1b 1161 23 +6cb5 8 1162 23 +6cbd 3 1163 23 +6cc0 5 1159 23 +6cc5 7 1166 23 +6ccc 2 1167 23 +6cce 6 1166 23 +6cd4 6 1167 23 +6cda 3 1171 23 +6cdd 4 161 9 +6ce1 c 60 8 +6ced 14 161 9 +6d01 17 212 9 +6d18 7 161 9 +6d1f c 212 9 +6d2b b 59 8 +6d36 5 60 8 +6d3b 8 1171 23 +6d43 8 1173 23 +6d4b 8 1181 23 +6d53 3 1177 23 +6d56 5 1181 23 +6d5b 5 1173 23 +6d60 d 1177 23 +6d6d 1e 1179 23 +6d8b c 1181 23 +6d97 8 1180 23 +6d9f 3 1181 23 +6da2 b 1182 23 +6dad 1 1181 23 +6dae 2 1182 23 +6db0 1b 1184 23 +6dcb 1f 1187 23 +6dea 4 1190 23 +6dee 8 73 8 +6df6 f 1193 23 +6e05 7 1190 23 +6e0c 10 1191 23 +6e1c 10 1192 23 +6e2c 6 73 8 +6e32 19 76 8 +6e4b 9 1177 23 +6e54 d 1194 23 +6e61 5 1199 23 +6e66 18 161 9 +6e7e 16 212 9 +6e94 7 161 9 +6e9b b 212 9 +6ea6 3 66 8 +6ea9 2f 212 9 +6ed8 6 66 8 +6ede d 68 8 +6eeb b 67 8 +6ef6 5 68 8 +6efb 8 1199 23 +6f03 8 223 9 +6f0b c 1201 23 +6f17 8 176 9 +6f1f 5 1206 23 +6f24 f 76 43 +6f33 b 1202 23 +6f3e 7 1207 23 +6f45 7 176 9 +6f4c 7 1203 23 +6f53 8 1206 23 +6f5b 8 1210 23 +6f63 18 92 42 +6f7b 7 1203 23 +6f82 7 1205 23 +6f89 c 92 42 +6f95 7 1205 23 +6f9c 10 1208 23 +6fac 10 1209 23 +6fbc 10 1212 23 +6fcc 5 76 43 +6fd1 4 84 43 +6fd5 13 1004 42 +6fe8 8 82 43 +6ff0 8 83 43 +6ff8 8 84 43 +7000 10 1004 42 +7010 1b 1217 23 +702b 8 83 8 +7033 17 1218 23 +704a 6 83 8 +7050 b 87 8 +705b 12 1220 23 +706d d 586 23 +707a 15 1194 23 +708f 1f 73 8 +70ae 16 1678 23 +70c4 9 1679 23 +70cd 2 1321 23 +70cf 4 2822 15 +70d3 6 1321 23 +70d9 5 60 12 +70de d 198 12 +70eb 2a 63 12 +7115 8 198 12 +711d d 49 4 +712a a 48 7 +7134 1a 1328 23 +714e 12 1332 23 +7160 b 1333 23 +716b 15 1337 23 +7180 8 42 6 +7188 9 116 7 +7191 b 1340 23 +719c a 1329 23 +71a6 1c 1353 23 +71c2 8 42 6 +71ca 5 116 7 +71cf f 1356 23 +71de 17 1357 23 +71f5 15 1344 23 +720a 8 1347 23 +7212 4 1348 23 +7216 a 1347 23 +7220 9 1360 23 +7229 8 42 6 +7231 5 134 12 +7236 5 2812 15 +723b 7 136 12 +7242 3 135 12 +7245 2 2812 15 +7247 4 136 12 +724b 16 2812 15 +7261 a 134 12 +726b 12 1367 23 +727d 6 1364 23 +7283 11 1374 23 +7294 7 1376 23 +729b f 1378 23 +72aa 11 1380 23 +72bb 8 1383 23 +72c3 8 1380 23 +72cb 6 1383 23 +72d1 23 1385 23 +72f4 b 42 6 +72ff 6 2812 15 +7305 9 134 12 +730e 7 136 12 +7315 3 135 12 +7318 3 2812 15 +731b 4 136 12 +731f 2b 2812 15 +734a 10 1063 23 +735a 11 216 9 +736b 2b 92 8 +7396 12 979 23 +73a8 1f 83 8 +73c7 7 1200 23 +73ce 15 1220 23 +73e3 1f 66 8 +FUNC 7410 1ac 0 google_breakpad::WriteMinidump(char const*, std::list > const&, std::list > const&, google_breakpad::LinuxDumper*) +7410 11 1841 23 +7421 32 479 23 +7453 a 190 12 +745d 9 479 23 +7466 1b 92 42 +7481 9 479 23 +748a 5 190 12 +748f 4 481 23 +7493 a 479 23 +749d 6 481 23 +74a3 9 482 23 +74ac f 486 23 +74bb 3 489 23 +74be 5 490 23 +74c3 5 489 23 +74c8 5 490 23 +74cd b 494 23 +74d8 4 1843 23 +74dc 8 1845 23 +74e4 4 500 23 +74e8 2 1845 23 +74ea 2 500 23 +74ec b 502 23 +74f7 a 497 23 +7501 f 1846 23 +7510 10 491 23 +7520 2 1844 23 +7522 6 500 23 +7528 10 501 23 +7538 28 481 23 +7560 1f 482 23 +757f 15 497 23 +7594 18 479 23 +75ac 10 1845 23 +FUNC 75c0 2ce 0 WriteMinidumpImpl +75c0 2b 1748 23 +75eb 8 1749 23 +75f3 3 1748 23 +75f6 2 1749 23 +75f8 6 1748 23 +75fe 5 1749 23 +7603 9 1751 23 +760c 2 1753 23 +760e 9 1752 23 +7617 20 42 6 +7637 41 1767 23 +7678 4 163 5 +767c 9 479 23 +7685 8 163 5 +768d 9 167 5 +7696 d 170 5 +76a3 34 479 23 +76d7 a 190 12 +76e1 9 479 23 +76ea 1b 92 42 +7705 9 479 23 +770e 5 190 12 +7713 8 479 23 +771b 4 481 23 +771f 12 479 23 +7731 6 481 23 +7737 9 482 23 +7740 5 486 23 +7745 5 1223 23 +774a a 486 23 +7754 3 489 23 +7757 5 490 23 +775c 5 489 23 +7761 5 490 23 +7766 b 494 23 +7771 4 1764 23 +7775 8 1766 23 +777d 4 500 23 +7781 2 1766 23 +7783 2 500 23 +7785 13 501 23 +7798 18 491 23 +77b0 2 1765 23 +77b2 6 500 23 +77b8 b 502 23 +77c3 15 497 23 +77d8 28 481 23 +7800 19 479 23 +7819 22 482 23 +783b 28 42 6 +7863 f 479 23 +7872 d 1766 23 +787f f 497 23 +FUNC 7890 2b 0 google_breakpad::WriteMinidump(int, long, int, void const*, unsigned long, std::list > const&, std::list > const&) +7890 4 1832 23 +7894 22 1835 23 +78b6 5 1836 23 +FUNC 78c0 2c 0 google_breakpad::WriteMinidump(char const*, long, int, void const*, unsigned long, std::list > const&, std::list > const&) +78c0 4 1822 23 +78c4 23 1825 23 +78e7 5 1826 23 +FUNC 78f0 2a 0 google_breakpad::WriteMinidump(int, int, void const*, unsigned long, std::list > const&, std::list > const&) +78f0 4 1812 23 +78f4 21 1815 23 +7915 5 1816 23 +FUNC 7920 2b 0 google_breakpad::WriteMinidump(char const*, int, void const*, unsigned long, std::list > const&, std::list > const&) +7920 4 1803 23 +7924 22 1806 23 +7946 5 1807 23 +FUNC 7950 9a 0 google_breakpad::WriteMinidump(int, int, void const*, unsigned long) +7950 16 1781 23 +7966 3 1781 23 +7969 a 387 40 +7973 16 1784 23 +7989 5 387 40 +798e 5 388 40 +7993 5 387 40 +7998 5 388 40 +799d 5 1784 23 +79a2 19 379 40 +79bb 14 1785 23 +79cf 1b 379 40 +FUNC 79f0 9b 0 google_breakpad::WriteMinidump(char const*, int, void const*, unsigned long) +79f0 16 1774 23 +7a06 3 1774 23 +7a09 a 387 40 +7a13 17 1777 23 +7a2a 5 387 40 +7a2f 5 388 40 +7a34 5 387 40 +7a39 5 388 40 +7a3e 5 1777 23 +7a43 19 379 40 +7a5c 14 1778 23 +7a70 1b 379 40 +FUNC 7a90 26a 0 google_breakpad::WriteMinidump(char const*, int, int) +7a90 10 1788 23 +7aa0 10 1789 23 +7ab0 4 387 40 +7ab4 7 170 5 +7abb 5 479 23 +7ac0 5 387 40 +7ac5 b 167 5 +7ad0 8 479 23 +7ad8 4 387 40 +7adc 5 388 40 +7ae1 5 387 40 +7ae6 5 388 40 +7aeb 26 479 23 +7b11 a 190 12 +7b1b 9 479 23 +7b24 21 92 42 +7b45 9 479 23 +7b4e 5 190 12 +7b53 5 481 23 +7b58 14 479 23 +7b6c 6 481 23 +7b72 9 482 23 +7b7b 10 379 40 +7b8b 13 486 23 +7b9e 4 489 23 +7ba2 5 490 23 +7ba7 5 489 23 +7bac 5 490 23 +7bb1 b 494 23 +7bbc 4 1795 23 +7bc0 a 1797 23 +7bca 5 500 23 +7bcf 2 1797 23 +7bd1 2 500 23 +7bd3 b 502 23 +7bde a 497 23 +7be8 1b 42 6 +7c03 15 1798 23 +7c18 18 491 23 +7c30 2 1796 23 +7c32 7 500 23 +7c39 f 501 23 +7c48 28 481 23 +7c70 22 482 23 +7c92 23 42 6 +7cb5 f 1797 23 +7cc4 d 479 23 +7cd1 1a 379 40 +7ceb f 497 23 +FUNC 7d00 153 0 google_breakpad::PageAllocator::Alloc(unsigned int) +7d00 8 71 12 +7d08 25 70 12 +7d2d b 74 12 +7d38 b 74 12 +7d43 2 75 12 +7d45 2 76 12 +7d47 3 75 12 +7d4a 8 77 12 +7d52 3 76 12 +7d55 2b 97 12 +7d80 c 86 12 +7d8c f 2936 15 +7d9b 3 86 12 +7d9e 5 2936 15 +7da3 6 86 12 +7da9 5 2936 15 +7dae 6 115 12 +7db4 1f 2936 15 +7dd3 d 89 12 +7de0 6 120 12 +7de6 2 93 12 +7de8 4 124 12 +7dec 3 93 12 +7def 4 125 12 +7df3 5 93 12 +7df8 4 124 12 +7dfc 5 93 12 +7e01 4 126 12 +7e05 8 93 12 +7e0d 5 94 12 +7e12 3 93 12 +7e15 13 94 12 +7e28 10 96 12 +7e38 7 78 12 +7e3f 11 79 12 +7e50 2 72 12 +7e52 1 97 12 +FUNC 7e60 248 0 google_breakpad::ProcCpuInfoReader::GetNextField(char const**) +7e60 4 54 7 +7e64 4 118 4 +7e68 10 54 7 +7e78 b 60 7 +7e83 e 116 4 +7e91 2 117 4 +7e93 8 118 4 +7e9b 7 117 4 +7ea2 5 118 4 +7ea7 e 62 7 +7eb5 6 99 4 +7ebb f 66 4 +7eca 3 99 4 +7ecd 3 2838 15 +7ed0 5 98 4 +7ed5 3 99 4 +7ed8 13 2838 15 +7eeb a 100 4 +7ef5 a 102 4 +7eff 4 103 4 +7f03 5 66 4 +7f08 14 70 4 +7f1c c 54 7 +7f28 10 70 4 +7f38 8 69 4 +7f40 b 78 4 +7f4b a 86 4 +7f55 8 87 4 +7f5d 3 92 4 +7f60 7 90 4 +7f67 e 92 4 +7f75 5 71 4 +7f7a 6 68 7 +7f80 8 77 7 +7f88 4 70 7 +7f8c 5 77 7 +7f91 3 78 7 +7f94 3 77 7 +7f97 6 78 7 +7f9d 5 83 7 +7fa2 5 84 7 +7fa7 3 88 7 +7faa 7 87 7 +7fb1 3 88 7 +7fb4 3 92 7 +7fb7 7 88 7 +7fbe 2 92 7 +7fc0 9 95 7 +7fc9 5 99 7 +7fce 4 101 7 +7fd2 c 104 7 +7fde 5 102 7 +7fe3 d 104 7 +7ff0 e 84 7 +7ffe 4 85 7 +8002 e 84 7 +8010 f 92 7 +801f 4 93 7 +8023 d 92 7 +8030 10 105 4 +8040 e 2838 15 +804e 4 104 7 +8052 2 66 7 +8054 b 104 7 +805f b 70 4 +806a 1f 116 4 +8089 1f 87 4 +FUNC 80b0 22 0 google_breakpad::TypedMDRVA::~TypedMDRVA() +80b0 6 216 9 +80b6 1c 92 8 +FUNC 80e0 22 0 google_breakpad::TypedMDRVA::~TypedMDRVA() +80e0 9 216 9 +80e9 19 92 8 +FUNC 8110 22 0 google_breakpad::TypedMDRVA::~TypedMDRVA() +8110 6 216 9 +8116 1c 92 8 +FUNC 8140 22 0 google_breakpad::TypedMDRVA::~TypedMDRVA() +8140 6 216 9 +8146 1c 92 8 +FUNC 8170 229 0 std::vector >::reserve(unsigned long) +8170 a 69 43 +817a 25 66 43 +819f 9 69 43 +81a8 4 42 6 +81ac e 707 42 +81ba 5 71 43 +81bf 29 86 43 +81e8 4 42 6 +81ec 2 169 42 +81ee 4 42 6 +81f2 7 626 42 +81f9 3 169 42 +81fc 5 626 42 +8201 2 169 42 +8203 8 162 12 +820b 4 71 12 +820f 1c 74 12 +822b 2 75 12 +822d 2 76 12 +822f 3 75 12 +8232 8 77 12 +823a 4 76 12 +823e 12 245 41 +8250 13 120 45 +8263 d 245 41 +8270 5 83 43 +8275 4 84 43 +8279 5 82 43 +827e 7 83 43 +8285 3 84 43 +8288 5 83 43 +828d 13 84 43 +82a0 e 86 12 +82ae e 2936 15 +82bc 3 86 12 +82bf 5 2936 15 +82c4 9 86 12 +82cd 3 115 12 +82d0 2d 2936 15 +82fd b 89 12 +8308 8 120 12 +8310 9 124 12 +8319 4 125 12 +831d 5 93 12 +8322 3 124 12 +8325 3 125 12 +8328 3 93 12 +832b 4 126 12 +832f 16 93 12 +8345 5 94 12 +834a 4 93 12 +834e 11 94 12 +835f 5 96 12 +8364 4 94 12 +8368 10 96 12 +8378 8 78 12 +8380 d 79 12 +838d c 70 43 +FUNC 83a0 357 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, MDMemoryDescriptor const&) +83a0 28 316 43 +83c8 8 320 43 +83d0 3 316 43 +83d3 2 320 43 +83d5 14 120 45 +83e9 4 329 43 +83ed 4 325 43 +83f1 7 327 43 +83f8 3 559 37 +83fb 4 325 43 +83ff 4 327 43 +8403 4 559 37 +8407 5 560 37 +840c f 561 37 +841b a 333 43 +8425 2b 391 43 +8450 4 42 6 +8454 a 626 42 +845e 9 215 37 +8467 4 1308 42 +846b 9 1309 42 +8474 3 900 38 +8477 d 162 12 +8484 3 900 38 +8487 4 162 12 +848b 8 342 43 +8493 23 74 12 +84b6 3 75 12 +84b9 2 76 12 +84bb 3 75 12 +84be 8 77 12 +84c6 8 76 12 +84ce 8 351 43 +84d6 13 120 45 +84e9 f 245 41 +84f8 13 120 45 +850b d 245 41 +8518 13 316 43 +852b 15 245 41 +8540 13 120 45 +8553 d 245 41 +8560 10 316 43 +8570 4 387 43 +8574 5 389 43 +8579 4 388 43 +857d 13 389 43 +8590 3 900 38 +8593 d 162 12 +85a0 3 900 38 +85a3 5 162 12 +85a8 10 342 43 +85b8 7 86 12 +85bf 2 2936 15 +85c1 7 86 12 +85c8 d 2936 15 +85d5 3 86 12 +85d8 5 2936 15 +85dd 9 86 12 +85e6 3 115 12 +85e9 2d 2936 15 +8616 17 89 12 +862d 8 120 12 +8635 9 124 12 +863e 4 125 12 +8642 5 93 12 +8647 3 124 12 +864a 3 125 12 +864d 3 93 12 +8650 4 126 12 +8654 16 93 12 +866a 5 94 12 +866f 4 93 12 +8673 15 94 12 +8688 b 96 12 +8693 8 78 12 +869b d 79 12 +86a8 13 1309 42 +86bb 7 900 38 +86c2 6 169 42 +86c8 8 900 38 +86d0 2 169 42 +86d2 4 342 43 +86d6 3 169 42 +86d9 4 342 43 +86dd 6 169 42 +86e3 7 162 12 +86ea d 71 12 +FUNC 8700 17f 0 char* std::vector >::_M_allocate_and_copy(unsigned long, char*, char*) +8700 2 1106 42 +8702 2 169 42 +8704 12 1106 42 +8716 5 169 42 +871b 2 71 12 +871d 5 162 12 +8722 2 71 12 +8724 1e 74 12 +8742 2 75 12 +8744 2 76 12 +8746 3 75 12 +8749 8 77 12 +8751 5 76 12 +8756 a 245 41 +8760 a 120 45 +876a d 245 41 +8777 19 1121 42 +8790 c 86 12 +879c f 2936 15 +87ab 3 86 12 +87ae 5 2936 15 +87b3 3 115 12 +87b6 9 86 12 +87bf 5 2936 15 +87c4 5 115 12 +87c9 31 2936 15 +87fa e 89 12 +8808 6 120 12 +880e 5 124 12 +8813 8 93 12 +881b 3 124 12 +881e 4 125 12 +8822 5 93 12 +8827 3 125 12 +882a 5 93 12 +882f 5 126 12 +8834 8 93 12 +883c 5 94 12 +8841 5 93 12 +8846 14 94 12 +885a e 96 12 +8868 9 78 12 +8871 e 79 12 +FUNC 8880 3cd 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, char const&) +8880 11 439 43 +8891 c 442 43 +889d 1b 444 43 +88b8 3 900 38 +88bb 4 447 43 +88bf 3 900 38 +88c2 9 450 43 +88cb 6 452 43 +88d1 f 245 41 +88e0 b 120 45 +88eb 12 245 41 +88fd 3 456 43 +8900 3 560 37 +8903 5 456 43 +8908 2 560 37 +890a b 561 37 +8915 b 697 37 +8920 9 86 12 +8929 9 2936 15 +8932 a 86 12 +893c 6 2936 15 +8942 3 86 12 +8945 5 2936 15 +894a 9 86 12 +8953 3 115 12 +8956 21 2936 15 +8977 c 120 12 +8983 9 124 12 +898c 4 93 12 +8990 4 124 12 +8994 3 93 12 +8997 3 124 12 +899a 4 125 12 +899e 5 93 12 +89a3 4 125 12 +89a7 4 126 12 +89ab 16 93 12 +89c1 5 94 12 +89c6 4 93 12 +89ca 15 94 12 +89df 5 96 12 +89e4 4 94 12 +89e8 4 96 12 +89ec 8 486 43 +89f4 c 439 43 +8a00 c 120 45 +8a0c 9 321 41 +8a15 5 491 43 +8a1a 16 245 41 +8a30 a 120 45 +8a3a d 245 41 +8a47 9 439 43 +8a50 5 498 43 +8a55 3 496 43 +8a58 10 245 41 +8a68 a 120 45 +8a72 d 245 41 +8a7f 6 439 43 +8a85 5 520 43 +8a8a 5 522 43 +8a8f 5 521 43 +8a94 5 522 43 +8a99 17 525 43 +8ab0 9 321 41 +8ab9 4 439 43 +8abd 3 444 43 +8ac0 8 120 45 +8ac8 e 321 41 +8ad6 3 468 43 +8ad9 3 245 41 +8adc 5 468 43 +8ae1 f 245 41 +8af0 b 120 45 +8afb 12 245 41 +8b0d 8 472 43 +8b15 4 525 43 +8b19 7 697 37 +8b20 a 525 43 +8b2a 6 697 37 +8b30 8 626 42 +8b38 f 1305 42 +8b47 a 1308 42 +8b51 5 1309 42 +8b56 3 900 38 +8b59 4 162 12 +8b5d 9 1309 42 +8b66 3 900 38 +8b69 4 162 12 +8b6d 5 900 38 +8b72 4 162 12 +8b76 28 74 12 +8b9e 3 75 12 +8ba1 2 76 12 +8ba3 3 75 12 +8ba6 4 77 12 +8baa e 76 12 +8bb8 3 900 38 +8bbb c 169 42 +8bc7 3 900 38 +8bca 3 169 42 +8bcd 5 900 38 +8bd2 6 169 42 +8bd8 4 162 12 +8bdc 2 71 12 +8bde 2 162 12 +8be0 5 71 12 +8be5 4 162 12 +8be9 f 71 12 +8bf8 10 2936 15 +8c08 8 89 12 +8c10 c 78 12 +8c1c d 79 12 +8c29 8 245 41 +8c31 8 444 43 +8c39 8 241 41 +8c41 c 1306 42 +FUNC 8c50 1a 0 google_breakpad::MinidumpFileWriter::MinidumpFileWriter() +8c50 1a 55 24 +FUNC 8c70 87 0 google_breakpad::MinidumpFileWriter::Open(char const*) +8c70 e 63 24 +8c7e 3 64 24 +8c81 3 63 24 +8c84 5 64 24 +8c89 2c 2822 15 +8cb5 2 66 24 +8cb7 21 72 24 +8cd8 1f 64 24 +FUNC 8d00 2c 0 google_breakpad::MinidumpFileWriter::SetFile(int) +8d00 5 75 24 +8d05 2 76 24 +8d07 5 77 24 +8d0c 7 75 24 +8d13 1 74 24 +8d14 18 75 24 +FUNC 8d30 78 0 google_breakpad::MinidumpFileWriter::Close() +8d30 16 80 24 +8d46 2 83 24 +8d48 5 81 24 +8d4d 5 83 24 +8d52 3 84 24 +8d55 2 85 24 +8d57 a 84 24 +8d61 20 2725 15 +8d81 6 92 24 +8d87 21 96 24 +FUNC 8db0 15 0 google_breakpad::MinidumpFileWriter::~MinidumpFileWriter() +8db0 10 59 24 +8dc0 5 60 24 +FUNC 8dd0 d6 0 google_breakpad::MinidumpFileWriter::Allocate(unsigned long) +8dd0 18 220 24 +8de8 5 221 24 +8ded 10 222 24 +8dfd 3 225 24 +8e00 4 223 24 +8e04 4 225 24 +8e08 4 223 24 +8e0c a 225 24 +8e16 5 241 24 +8e1b 1d 244 24 +8e38 7 227 24 +8e3f 3 234 24 +8e42 a 233 24 +8e4c a 234 24 +8e56 5 235 24 +8e5b 4 234 24 +8e5f 9 237 24 +8e68 1f 221 24 +8e87 1f 222 24 +FUNC 8eb0 fa 0 google_breakpad::MinidumpFileWriter::Copy(unsigned int, void const*, long) +8eb0 9 246 24 +8eb9 9 247 24 +8ec2 f 248 24 +8ed1 8 249 24 +8ed9 c 252 24 +8ee5 2 267 24 +8ee7 9 268 24 +8ef0 14 2805 15 +8f04 5 257 24 +8f09 1b 2887 15 +8f24 c 258 24 +8f30 b 2805 15 +8f3b 12 2887 15 +8f4d 1f 249 24 +8f6c 1f 248 24 +8f8b 1f 247 24 +FUNC 8fb0 a8 0 google_breakpad::MinidumpFileWriter::CopyStringToMDString(wchar_t const*, unsigned int, google_breakpad::TypedMDRVA*) +8fb0 e 100 24 +8fbe 1a 110 24 +8fd8 3 116 24 +8fdb 4 117 24 +8fdf 6 122 24 +8fe5 8 284 24 +8fed 16 122 24 +9003 7 83 8 +900a 3 87 8 +900d 3 125 24 +9010 12 87 8 +9022 8 110 24 +902a c 111 24 +9036 7 112 24 +903d 2 113 24 +903f d 129 24 +904c 5 101 24 +9051 7 128 24 +FUNC 9060 aa 0 google_breakpad::MinidumpFileWriter::CopyStringToMDString(char const*, unsigned int, google_breakpad::TypedMDRVA*) +9060 e 133 24 +906e 1a 139 24 +9088 2 145 24 +908a 2 146 24 +908c 4 284 24 +9090 3 146 24 +9093 6 149 24 +9099 5 284 24 +909e 18 149 24 +90b6 8 83 8 +90be 3 87 8 +90c1 3 152 24 +90c4 12 87 8 +90d6 8 139 24 +90de d 140 24 +90eb 4 141 24 +90ef 2 142 24 +90f1 d 155 24 +90fe c 134 24 +FUNC 9110 41 0 google_breakpad::UntypedMDRVA::Allocate(unsigned long) +9110 1 270 24 +9111 5 271 24 +9116 3 270 24 +9119 2 271 24 +911b 4 272 24 +911f 8 273 24 +9127 3 274 24 +912a 3 273 24 +912d 3 274 24 +9130 2 275 24 +9132 1f 271 24 +FUNC 9160 88 0 google_breakpad::UntypedMDRVA::Copy(unsigned int, void const*, unsigned long) +9160 4 277 24 +9164 5 278 24 +9169 5 279 24 +916e 12 280 24 +9180 3 281 24 +9183 4 282 24 +9187 5 281 24 +918c 1e 278 24 +91aa 1f 280 24 +91c9 1f 279 24 +FUNC 91f0 c4 0 google_breakpad::MinidumpFileWriter::WriteMemory(void const*, unsigned long, MDMemoryDescriptor*) +91f0 9 204 24 +91f9 9 205 24 +9202 8 206 24 +920a 7 161 9 +9211 6 209 24 +9217 d 161 9 +9224 9 209 24 +922d 4 218 24 +9231 2 210 24 +9233 d 218 24 +9240 14 186 9 +9254 4 211 24 +9258 5 176 9 +925d 3 214 24 +9260 3 176 9 +9263 7 215 24 +926a 4 218 24 +926e 5 217 24 +9273 3 218 24 +9276 1f 206 24 +9295 1f 205 24 +FUNC 92c0 5 0 google_breakpad::MinidumpFileWriter::WriteString(char const*, unsigned int, MDLocationDescriptor*) +92c0 5 200 24 +FUNC 92d0 5 0 google_breakpad::MinidumpFileWriter::WriteString(wchar_t const*, unsigned int, MDLocationDescriptor*) +92d0 5 195 24 +FUNC 92e0 22 0 google_breakpad::TypedMDRVA::~TypedMDRVA() +92e0 6 216 9 +92e6 1c 92 8 +FUNC 9310 1e8 0 bool google_breakpad::MinidumpFileWriter::WriteStringCore(char const*, unsigned int, MDLocationDescriptor*) +9310 f 158 24 +931f 9 161 24 +9328 c 162 24 +9334 d 167 24 +9341 9 168 24 +934a 8 161 9 +9352 5 212 9 +9357 9 161 9 +9360 11 212 9 +9371 4 161 9 +9375 5 68 8 +937a 8 67 8 +9382 5 68 8 +9387 4 173 24 +938b 4 177 24 +938f d 179 24 +939c 5 177 24 +93a1 5 179 24 +93a6 8 182 24 +93ae 2 174 24 +93b0 7 216 9 +93b7 18 92 8 +93cf 11 191 24 +93e0 10 158 24 +93f0 7 168 24 +93f7 11 161 9 +9408 17 212 9 +941f 4 161 9 +9423 3 173 24 +9426 1e 66 8 +9444 c 168 24 +9450 5 83 8 +9455 7 183 24 +945c 9 184 24 +9465 2 83 8 +9467 14 87 8 +947b 2 186 24 +947d 2 87 8 +947f 6 186 24 +9485 9 176 9 +948e 12 187 24 +94a0 15 190 24 +94b5 1f 162 24 +94d4 24 161 24 +FUNC 9500 1e8 0 bool google_breakpad::MinidumpFileWriter::WriteStringCore(wchar_t const*, unsigned int, MDLocationDescriptor*) +9500 f 158 24 +950f 9 161 24 +9518 f 162 24 +9527 2 168 24 +9529 a 167 24 +9533 8 168 24 +953b 8 161 9 +9543 5 212 9 +9548 9 161 9 +9551 11 212 9 +9562 4 161 9 +9566 5 68 8 +956b 8 67 8 +9573 5 68 8 +9578 4 173 24 +957c 4 177 24 +9580 d 179 24 +958d 5 177 24 +9592 5 179 24 +9597 8 182 24 +959f 2 174 24 +95a1 7 216 9 +95a8 18 92 8 +95c0 10 191 24 +95d0 10 158 24 +95e0 7 168 24 +95e7 11 161 9 +95f8 17 212 9 +960f 4 161 9 +9613 3 173 24 +9616 1e 66 8 +9634 c 168 24 +9640 5 83 8 +9645 7 183 24 +964c 9 184 24 +9655 2 83 8 +9657 14 87 8 +966b 2 186 24 +966d 2 87 8 +966f 6 186 24 +9675 9 176 9 +967e 12 187 24 +9690 15 190 24 +96a5 1f 162 24 +96c4 24 161 24 +FUNC 96f0 78 0 google_breakpad::UTF8ToUTF16Char(char const*, int, unsigned short*) +96f0 2 58 32 +96f2 6 78 32 +96f8 2 58 32 +96fa 4 62 32 +96fe 5 58 32 +9703 4 60 32 +9707 4 58 32 +970b b 63 32 +9716 4 59 32 +971a 6 61 32 +9720 16 69 32 +9736 4 71 32 +973a 4 76 32 +973e 4 75 32 +9742 5 78 32 +9747 4 83 32 +974b 2 82 32 +974d b 83 32 +9758 3 72 32 +975b 5 83 32 +9760 2 72 32 +9762 6 83 32 +FUNC 9770 56 0 google_breakpad::UTF32ToUTF16Char(wchar_t, unsigned short*) +9770 4 102 32 +9774 3 110 32 +9777 4 106 32 +977b 4 102 32 +977f b 107 32 +978a 5 103 32 +978f 4 102 32 +9793 a 110 32 +979d 5 105 32 +97a2 5 103 32 +97a7 5 104 32 +97ac 5 110 32 +97b1 4 112 32 +97b5 b 113 32 +97c0 6 115 32 +FUNC 97d0 147 0 google_breakpad::UTF16ToUTF8(std::vector > const&, bool) +97d0 12 121 32 +97e2 3 155 32 +97e5 2 126 32 +97e7 4 626 42 +97eb 5 122 32 +97f0 9 126 32 +97f9 2 71 14 +97fb 6 626 42 +9801 8 139 32 +9809 4 138 32 +980d 8 140 32 +9815 4 142 32 +9819 10 145 32 +9829 3 140 32 +982c 5 141 32 +9831 5 145 32 +9836 2 147 32 +9838 5 149 32 +983d 2 147 32 +983f b 149 32 +984a d 164 14 +9857 8 75 14 +985f 11 153 32 +9870 18 152 32 +9888 3 626 42 +988b 9 128 32 +9894 3 81 14 +9897 3 128 32 +989a 2 81 14 +989c 7 82 14 +98a3 c 155 32 +98af 11 130 32 +98c0 7 132 32 +98c7 f 118 32 +98d6 5 130 32 +98db 5 134 32 +98e0 3 155 32 +98e3 b 134 32 +98ee 2 71 14 +98f0 10 75 14 +9900 17 164 14 +FUNC 9920 e3 0 google_breakpad::UTF8ToUTF16(char const*, std::vector >*) +9920 c 41 32 +992c 5 42 32 +9931 3 1097 42 +9934 b 1004 42 +993f 5 43 32 +9944 7 47 32 +994b 3 44 32 +994e 4 1320 42 +9952 5 1004 42 +9957 3 155 32 +995a 4 707 42 +995e b 52 32 +9969 3 707 42 +996c 5 48 32 +9971 3 707 42 +9974 4 49 32 +9978 a 52 32 +9982 2 55 32 +9984 3 155 32 +9987 2 55 32 +9989 5 55 32 +998e b 155 32 +9999 3 55 32 +999c 3 626 42 +999f 3 55 32 +99a2 6 626 42 +99a8 4 55 32 +99ac 3 686 42 +99af 3 626 42 +99b2 2 686 42 +99b4 5 688 42 +99b9 8 689 42 +99c1 f 56 32 +99d0 3 687 42 +99d3 d 1004 42 +99e0 10 56 32 +99f0 4 626 42 +99f4 2 55 32 +99f6 6 626 42 +99fc 7 688 42 +FUNC 9a10 e3 0 google_breakpad::UTF32ToUTF16(wchar_t const*, std::vector >*) +9a10 c 85 32 +9a1c 5 86 32 +9a21 3 1097 42 +9a24 b 1004 42 +9a2f 5 87 32 +9a34 7 91 32 +9a3b 5 88 32 +9a40 4 1320 42 +9a44 5 1004 42 +9a49 3 155 32 +9a4c 4 707 42 +9a50 b 96 32 +9a5b 3 707 42 +9a5e 5 92 32 +9a63 3 707 42 +9a66 4 93 32 +9a6a a 96 32 +9a74 2 99 32 +9a76 3 155 32 +9a79 2 99 32 +9a7b 5 99 32 +9a80 b 155 32 +9a8b 3 99 32 +9a8e 3 626 42 +9a91 3 99 32 +9a94 6 626 42 +9a9a 4 99 32 +9a9e 3 686 42 +9aa1 3 626 42 +9aa4 2 686 42 +9aa6 5 688 42 +9aab 8 689 42 +9ab3 d 100 32 +9ac0 3 687 42 +9ac3 d 1004 42 +9ad0 10 100 32 +9ae0 4 626 42 +9ae4 2 99 32 +9ae6 6 626 42 +9aec 7 688 42 +FUNC 9b00 295 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned short const&) +9b00 25 439 43 +9b25 9 442 43 +9b2e 1d 444 43 +9b4b 3 900 38 +9b4e 3 447 43 +9b51 6 900 38 +9b57 9 450 43 +9b60 3 464 43 +9b63 d 743 37 +9b70 3 745 37 +9b73 a 743 37 +9b7d 8 468 43 +9b85 3 365 37 +9b88 4 468 43 +9b8c 6 365 37 +9b92 3 472 43 +9b95 3 686 37 +9b98 4 472 43 +9b9c c 686 37 +9ba8 7 687 37 +9baf 5 686 37 +9bb4 2c 525 43 +9be0 3 155 32 +9be3 d 1305 42 +9bf0 6 626 42 +9bf6 c 1305 42 +9c02 6 1308 42 +9c08 3 900 38 +9c0b 4 1308 42 +9c0f 3 900 38 +9c12 3 480 43 +9c15 9 1309 42 +9c1e 7 480 43 +9c25 19 94 45 +9c3e 5 486 43 +9c43 d 155 32 +9c50 4 745 37 +9c54 a 743 37 +9c5e 3 364 37 +9c61 3 365 37 +9c64 3 364 37 +9c67 5 365 37 +9c6c f 366 37 +9c7b 4 364 37 +9c7f 3 367 37 +9c82 4 496 43 +9c86 3 365 37 +9c89 3 364 37 +9c8c 5 365 37 +9c91 12 366 37 +9ca3 4 517 43 +9ca7 3 367 37 +9caa 5 174 42 +9caf 5 100 45 +9cb4 3 522 43 +9cb7 4 520 43 +9cbb 4 521 43 +9cbf 11 522 43 +9cd0 20 366 37 +9cf0 3 452 43 +9cf3 3 364 37 +9cf6 3 444 43 +9cf9 3 365 37 +9cfc 3 364 37 +9cff 5 365 37 +9d04 12 366 37 +9d16 3 559 37 +9d19 3 456 43 +9d1c 3 559 37 +9d1f 4 456 43 +9d23 5 560 37 +9d28 12 561 37 +9d3a 3 459 43 +9d3d 13 686 37 +9d50 7 687 37 +9d57 11 686 37 +9d68 9 1309 42 +9d71 e 169 42 +9d7f 16 1306 42 +FUNC 9da0 73 0 CreateGUID(MDGUID*) +9da0 1 87 28 +9da1 7 75 28 +9da8 3 87 28 +9dab c 75 28 +9db7 7 65 28 +9dbe 9 66 28 +9dc7 9 67 28 +9dd0 7 68 28 +9dd7 3 57 28 +9dda 6 58 28 +9de0 2 59 28 +9de2 3 60 28 +9de5 3 59 28 +9de8 3 60 28 +9deb 3 59 28 +9dee 7 69 28 +9df5 3 57 28 +9df8 6 58 28 +9dfe 2 59 28 +9e00 3 60 28 +9e03 3 59 28 +9e06 3 60 28 +9e09 3 59 28 +9e0c 7 89 28 +FUNC 9e20 ad 0 GUIDToString(MDGUID const*, char*, int) +9e20 5 92 28 +9e25 9 94 28 +9e2e b 53 28 +9e39 3 98 28 +9e3c 4 53 28 +9e40 a 98 28 +9e4a 13 53 28 +9e5d 4 98 28 +9e61 1a 53 28 +9e7b 7 98 28 +9e82 5 53 28 +9e87 f 98 28 +9e96 2 100 28 +9e98 5 99 28 +9e9d 4 102 28 +9ea1 5 103 28 +9ea6 8 104 28 +9eae 1f 94 28 +FUNC 9ed0 16 0 GUIDGenerator::InitOnceImpl() +9ed0 4 78 28 +9ed4 7 79 28 +9edb 4 80 28 +9edf 7 79 28 +FUNC 9ef0 1e 0 my_strlen +9ef0 10 42 29 +9f00 c 42 29 +9f0c 2 44 29 +FUNC 9f10 33 0 my_strcmp +9f10 8 46 29 +9f18 2 50 29 +9f1a 4 52 29 +9f1e 4 54 29 +9f22 4 55 29 +9f26 7 48 29 +9f2d b 49 29 +9f38 8 51 29 +9f40 2 53 29 +9f42 1 57 29 +FUNC 9f50 56 0 my_strncmp +9f50 5 60 29 +9f55 7 61 29 +9f5c 2 63 29 +9f5e 12 65 29 +9f70 9 61 29 +9f79 2 63 29 +9f7b 4 65 29 +9f7f 9 60 29 +9f88 2 71 29 +9f8a 6 72 29 +9f90 10 62 29 +9fa0 6 64 29 +FUNC 9fb0 54 0 my_strtoui +9fb0 3 79 29 +9fb3 2 80 29 +9fb5 4 79 29 +9fb9 8 87 29 +9fc1 f 89 29 +9fd0 7 86 29 +9fd7 8 87 29 +9fdf 5 89 29 +9fe4 4 90 29 +9fe8 2 89 29 +9fea 4 82 29 +9fee 7 83 29 +9ff5 2 94 29 +9ff7 9 95 29 +a000 2 80 29 +a002 2 96 29 +FUNC a010 36 0 my_uint_len +a010 3 100 29 +a013 3 99 29 +a016 5 101 29 +a01b 4 100 29 +a01f 14 106 29 +a033 3 105 29 +a036 7 106 29 +a03d 5 104 29 +a042 2 109 29 +a044 2 110 29 +FUNC a050 43 0 my_uitos +a050 5 119 29 +a055 a 120 29 +a05f 9 119 29 +a068 1d 120 29 +a085 3 119 29 +a088 4 120 29 +a08c 7 119 29 +FUNC a0a0 42 0 my_strchr +a0a0 3 124 29 +a0a3 3 123 29 +a0a6 4 124 29 +a0aa 16 128 29 +a0c0 8 124 29 +a0c8 4 125 29 +a0cc 7 124 29 +a0d3 f 124 29 +FUNC a0f0 26 0 my_strrchr +a0f0 10 133 29 +a100 7 134 29 +a107 4 136 29 +a10b 9 133 29 +a114 2 139 29 +FUNC a120 32 0 my_memchr +a120 3 143 29 +a123 5 144 29 +a128 17 145 29 +a13f 9 144 29 +a148 8 148 29 +a150 2 149 29 +FUNC a160 64 0 my_read_hex_ptr +a160 3 155 29 +a163 d 156 29 +a170 3 161 29 +a173 4 160 29 +a177 6 161 29 +a17d 4 158 29 +a181 b 159 29 +a18c 8 162 29 +a194 3 164 29 +a197 4 163 29 +a19b d 164 29 +a1a8 8 165 29 +a1b0 3 167 29 +a1b3 4 166 29 +a1b7 9 167 29 +a1c0 3 173 29 +a1c3 1 175 29 +FUNC a1d0 3a 0 my_read_decimal_ptr +a1d0 3 181 29 +a1d3 3 177 29 +a1d6 12 181 29 +a1e8 3 183 29 +a1eb 4 182 29 +a1ef 4 180 29 +a1f3 7 183 29 +a1fa c 181 29 +a206 3 188 29 +a209 1 190 29 +FUNC a210 1e 0 my_memset +a210 3 194 29 +a213 4 192 29 +a217 9 194 29 +a220 7 195 29 +a227 7 194 29 +FUNC a230 38 0 my_strlcpy +a230 10 202 29 +a240 9 203 29 +a249 7 204 29 +a250 4 207 29 +a254 8 202 29 +a25c 5 209 29 +a261 5 210 29 +a266 2 213 29 +FUNC a270 3e 0 my_strlcat +a270 1 215 29 +a271 2 216 29 +a273 d 218 29 +a280 4 219 29 +a284 5 218 29 +a289 7 225 29 +a290 6 218 29 +a296 5 221 29 +a29b e 224 29 +a2a9 5 225 29 +FUNC a2b0 4e 0 my_isspace +a2b0 a 229 29 +a2ba a 227 29 +a2c4 a 229 29 +a2ce 19 227 29 +a2e7 4 231 29 +a2eb 5 230 29 +a2f0 2 234 29 +a2f2 6 235 29 +a2f8 6 232 29 +FUNC a300 1aa 0 google_breakpad::CrashGenerationClient::RequestDump(void const*, unsigned long) +a300 5 46 16 +a305 a 2909 15 +a30f 5 46 16 +a314 3 2909 15 +a317 5 46 16 +a31c 2 2909 15 +a31e 9 46 16 +a327 1e 2909 15 +a345 c 52 16 +a351 5 60 16 +a356 8 52 16 +a35e 5 57 16 +a363 a 60 16 +a36d 5 54 16 +a372 5 55 16 +a377 5 57 16 +a37c 9 58 16 +a385 6 2899 15 +a38b 5 60 16 +a390 4 69 16 +a394 8 61 16 +a39c 3 2899 15 +a39f c 62 16 +a3ab 8 65 16 +a3b3 8 66 16 +a3bb 9 67 16 +a3c4 4 69 16 +a3c8 19 2899 15 +a3e1 9 2899 15 +a3ea 5 71 16 +a3ef 5 71 16 +a3f4 24 2725 15 +a418 9 73 16 +a421 7 2838 15 +a428 14 2838 15 +a43c 7 81 16 +a443 5 80 16 +a448 10 81 16 +a458 5 71 16 +a45d 13 45 16 +a470 10 2838 15 +a480 3 78 16 +a483 2 2838 15 +a485 13 78 16 +a498 7 81 16 +a49f 2 74 16 +a4a1 9 81 16 +FUNC a4b0 1c 0 google_breakpad::CrashGenerationClient::TryCreate(int) +a4b0 2 87 16 +a4b2 1 86 16 +a4b3 2 86 16 +a4b5 2 87 16 +a4b7 a 89 16 +a4c1 2 56 1 +a4c3 5 90 16 +a4c8 2 88 16 +a4ca 2 90 16 +FUNC a4d0 67 0 google_breakpad::LinuxDumper::~LinuxDumper() +a4d0 8 85 21 +a4d8 6 2812 15 +a4de 6 85 21 +a4e4 e 85 21 +a4f2 4 338 21 +a4f6 a 134 12 +a500 4 136 12 +a504 3 135 12 +a507 3 2812 15 +a50a 4 136 12 +a50e 16 2812 15 +a524 8 134 12 +a52c b 86 21 +FUNC a540 12 0 google_breakpad::LinuxDumper::~LinuxDumper() +a540 1 85 21 +a541 3 85 21 +a544 e 86 21 +FUNC a560 105 0 google_breakpad::LinuxDumper::ReadAuxv() +a560 2 139 21 +a562 7 141 21 +a569 c 139 21 +a575 15 141 21 +a58a 2 147 21 +a58c 14 163 21 +a5a0 28 2822 15 +a5c8 4 146 21 +a5cc 8 154 21 +a5d4 2 146 21 +a5d6 a 2838 15 +a5e0 10 2838 15 +a5f0 6 152 21 +a5f6 1b 2725 15 +a611 f 163 21 +a620 a 152 21 +a62a 6 156 21 +a630 d 157 21 +a63d 5 158 21 +a642 e 157 21 +a650 15 2838 15 +FUNC a670 32 0 google_breakpad::LinuxDumper::Init() +a670 1 88 21 +a671 3 88 21 +a674 9 89 21 +a67d b 90 21 +a688 d 89 21 +a695 6 89 21 +a69b 1 90 21 +a69c 6 89 21 +FUNC a6b0 4c 0 google_breakpad::LinuxDumper::FindMapping(void const*) const +a6b0 4 338 21 +a6b4 b 626 42 +a6bf 11 292 21 +a6d0 7 293 21 +a6d7 5 294 21 +a6dc 14 294 21 +a6f0 9 292 21 +a6f9 2 298 21 +a6fb 1 299 21 +FUNC a700 94 0 google_breakpad::LinuxDumper::GetStackInfo(void const**, unsigned long*, unsigned long) +a700 23 265 21 +a723 6 265 21 +a729 8 267 21 +a731 3 275 21 +a734 6 270 21 +a73a 8 275 21 +a742 5 276 21 +a747 6 279 21 +a74d 4 281 21 +a751 5 283 21 +a756 3 281 21 +a759 a 283 21 +a763 5 285 21 +a768 4 283 21 +a76c 4 284 21 +a770 20 286 21 +a790 4 277 21 +FUNC a7a0 1fd 0 google_breakpad::LinuxDumper::HandleDeletedFileInMapping(char*) const +a7a0 17 301 21 +a7b7 3 306 21 +a7ba 7 301 21 +a7c1 3 301 21 +a7c4 5 306 21 +a7c9 6 307 21 +a7cf 2 308 21 +a7d1 2f 336 21 +a800 5 309 21 +a805 11 310 21 +a816 4 309 21 +a81a 23 317 21 +a83d 8 319 21 +a845 10 60 11 +a855 8 319 21 +a85d 13 321 21 +a870 5 2878 15 +a875 3 327 21 +a878 1d 2878 15 +a895 5a 334 21 +a8ef a 335 21 +a8f9 4 327 21 +a8fd 8 328 21 +a905 20 2878 15 +a925 8 327 21 +a92d 12 327 21 +a93f 18 327 21 +a957 46 334 21 +FUNC a9a0 35d 0 google_breakpad::LinuxDumper::ElfFileIdentifierForMapping(google_breakpad::MappingInfo const&, bool, unsigned int, unsigned char*) +a9a0 2b 96 21 +a9cb 2 97 21 +a9cd 9 96 21 +a9d6 2 97 21 +a9d8 8 626 42 +a9e0 3 97 21 +a9e3 4 626 42 +a9e7 9 97 21 +a9f0 a 98 21 +a9fa 4 64 21 +a9fe 5 98 21 +aa03 14 64 21 +aa17 2 100 21 +aa19 4 99 21 +aa1d 43 137 21 +aa60 1c 103 21 +aa7c 4 105 21 +aa80 20 2763 15 +aaa0 9 105 21 +aaa9 3 106 21 +aaac 14 113 21 +aac0 c 117 21 +aacc 6 118 21 +aad2 3 117 21 +aad5 b 118 21 +aae0 14 121 21 +aaf4 8 123 21 +aafc 6 122 21 +ab02 5 123 21 +ab07 a 125 21 +ab11 3 123 21 +ab14 5 125 21 +ab19 5 338 21 +ab1e a 126 21 +ab28 8 130 21 +ab30 2 131 21 +ab32 2 130 21 +ab34 2 131 21 +ab36 5 131 21 +ab3b 5 131 21 +ab40 10 133 21 +ab50 20 136 21 +ab70 4 108 21 +ab74 3 71 12 +ab77 3 108 21 +ab7a 6 71 12 +ab80 1c 74 12 +ab9c c 86 12 +aba8 f 2936 15 +abb7 3 86 12 +abba 5 2936 15 +abbf 9 86 12 +abc8 3 115 12 +abcb 33 2936 15 +abfe e 89 12 +ac0c 1c 111 21 +ac28 3 75 12 +ac2b 2 76 12 +ac2d 3 75 12 +ac30 4 77 12 +ac34 5 76 12 +ac39 6 120 12 +ac3f 4 124 12 +ac43 7 93 12 +ac4a 3 124 12 +ac4d 4 125 12 +ac51 5 93 12 +ac56 3 125 12 +ac59 5 93 12 +ac5e 4 126 12 +ac62 8 93 12 +ac6a 5 94 12 +ac6f 3 93 12 +ac72 13 94 12 +ac85 9 96 12 +ac8e 7 78 12 +ac95 d 79 12 +aca2 8 72 12 +acaa 1f 97 21 +acc9 1f 118 21 +ace8 15 136 21 +FUNC ad00 1a9 0 google_breakpad::LinuxDumper::LinuxDumper(int) +ad00 17 72 21 +ad17 4 79 21 +ad1b 9 72 21 +ad24 23 79 21 +ad47 5 60 12 +ad4c 4 190 12 +ad50 1a 63 12 +ad6a 5 190 12 +ad6f 4 153 12 +ad73 18 92 42 +ad8b 5 190 12 +ad90 4 190 12 +ad94 4 153 12 +ad98 18 92 42 +adb0 a 190 12 +adba 7 190 12 +adc1 7 153 12 +adc8 21 92 42 +ade9 d 190 12 +adf6 17 338 21 +ae0d a 626 42 +ae17 6 686 42 +ae1d 6 688 42 +ae23 e 689 42 +ae31 1f 83 21 +ae50 5 687 42 +ae55 8 1004 42 +ae5d 3 687 42 +ae60 7 1004 42 +ae67 7 338 21 +ae6e 6 2812 15 +ae74 5 134 12 +ae79 3 136 12 +ae7c 3 135 12 +ae7f 3 2812 15 +ae82 4 136 12 +ae86 16 2812 15 +ae9c d 72 21 +FUNC aeb0 7b2 0 google_breakpad::LinuxDumper::EnumerateMappings() +aeb0 2 165 21 +aeb2 7 167 21 +aeb9 12 165 21 +aecb 18 167 21 +aee3 2 186 21 +aee5 12 259 21 +aef7 7 338 21 +aefe 8 2822 15 +af06 7 178 21 +af0d 4 182 21 +af11 5 178 21 +af16 5 182 21 +af1b 1d 2822 15 +af38 2 185 21 +af3a 4 2822 15 +af3e 2 185 21 +af40 4 74 12 +af44 4 187 21 +af48 4 74 12 +af4c 5 187 21 +af51 1d 74 12 +af6e 2 75 12 +af70 5 76 12 +af75 3 75 12 +af78 8 77 12 +af80 4 76 12 +af84 3 82 12 +af87 9 49 4 +af90 2 191 21 +af92 16 49 4 +afa8 f 66 4 +afb7 5 99 4 +afbc 3 2838 15 +afbf 5 98 4 +afc4 3 99 4 +afc7 10 2838 15 +afd7 6 100 4 +afdd a 102 4 +afe7 5 103 4 +afec 4 66 4 +aff0 15 70 4 +b005 13 165 21 +b018 10 70 4 +b028 7 69 4 +b02f 16 78 4 +b045 20 2725 15 +b065 21 258 21 +b086 3 71 4 +b089 4 73 4 +b08d 6 71 4 +b093 d 194 21 +b0a0 5 195 21 +b0a5 e 116 4 +b0b3 2 117 4 +b0b5 8 118 4 +b0bd 7 117 4 +b0c4 14 118 4 +b0d8 18 105 4 +b0f0 e 196 21 +b0fe 5 197 21 +b103 e 198 21 +b111 5 199 21 +b116 1b 203 21 +b131 9 338 21 +b13a 6 211 21 +b140 4 212 21 +b144 12 213 21 +b156 28 74 12 +b17e 2 75 12 +b180 5 76 12 +b185 2 77 12 +b187 3 76 12 +b18a 4 82 12 +b18e 6 77 12 +b194 7 222 21 +b19b 8 221 21 +b1a3 5 222 21 +b1a8 5 223 21 +b1ad 5 224 21 +b1b2 8 223 21 +b1ba 3 224 21 +b1bd 6 226 21 +b1c3 4 224 21 +b1c7 5 225 21 +b1cc 3 223 21 +b1cf 4 225 21 +b1d3 2 226 21 +b1d5 a 227 21 +b1df b 228 21 +b1ea c 236 21 +b1f6 16 236 21 +b20c 4 236 21 +b210 5 338 21 +b215 5 236 21 +b21a 4 338 21 +b21e 6 236 21 +b224 4 338 21 +b228 9 236 21 +b231 3 626 42 +b234 11 243 21 +b245 7 626 42 +b24c 8 243 21 +b254 9 686 42 +b25d 2 688 42 +b25f 5 1320 42 +b264 4 689 42 +b268 b 1320 42 +b273 20 244 21 +b293 d 245 21 +b2a0 13 244 21 +b2b3 15 246 21 +b2c8 4 86 12 +b2cc 2 2936 15 +b2ce 7 86 12 +b2d5 c 2936 15 +b2e1 3 86 12 +b2e4 5 2936 15 +b2e9 3 86 12 +b2ec 3 115 12 +b2ef 24 2936 15 +b313 d 89 12 +b320 17 70 4 +b337 e 2838 15 +b345 6 120 12 +b34b 4 93 12 +b34f 4 124 12 +b353 3 93 12 +b356 4 125 12 +b35a 5 93 12 +b35f 4 124 12 +b363 7 93 12 +b36a 4 126 12 +b36e 8 93 12 +b376 5 94 12 +b37b 4 93 12 +b37f 10 94 12 +b38f 9 96 12 +b398 8 78 12 +b3a0 8 79 12 +b3a8 8 82 12 +b3b0 b 86 4 +b3bb 8 87 4 +b3c3 4 92 4 +b3c7 3 90 4 +b3ca 4 93 4 +b3ce 6 90 4 +b3d4 17 92 4 +b3eb f 883 42 +b3fa 1d 120 45 +b417 1a 887 42 +b431 4 86 12 +b435 2 2936 15 +b437 7 86 12 +b43e c 2936 15 +b44a 3 86 12 +b44d 5 2936 15 +b452 9 86 12 +b45b 3 115 12 +b45e 2e 2936 15 +b48c c 89 12 +b498 23 214 21 +b4bb 9 213 21 +b4c4 1a 215 21 +b4de d 213 21 +b4eb c 216 21 +b4f7 a 116 4 +b501 2 117 4 +b503 8 118 4 +b50b 6 117 4 +b511 c 118 4 +b51d c 203 21 +b529 10 203 21 +b539 7 206 21 +b540 9 207 21 +b549 a 206 21 +b553 1d 229 21 +b570 7 120 45 +b577 5 248 21 +b57c 8 893 42 +b584 4 248 21 +b588 a 893 42 +b592 2b 1004 42 +b5bd 1f 87 4 +b5dc 7 78 12 +b5e3 d 79 12 +b5f0 c 120 12 +b5fc a 124 12 +b606 4 93 12 +b60a 4 124 12 +b60e 3 93 12 +b611 3 124 12 +b614 4 125 12 +b618 5 93 12 +b61d 4 125 12 +b621 7 93 12 +b628 4 126 12 +b62c 8 93 12 +b634 5 94 12 +b639 3 93 12 +b63c 14 94 12 +b650 5 96 12 +b655 4 94 12 +b659 9 96 12 +FUNC b670 221 0 std::vector >::reserve(unsigned long) +b670 a 69 43 +b67a 25 66 43 +b69f 9 69 43 +b6a8 4 338 21 +b6ac e 707 42 +b6ba 5 71 43 +b6bf 29 86 43 +b6e8 4 338 21 +b6ec 2 169 42 +b6ee 5 338 21 +b6f3 7 626 42 +b6fa 3 169 42 +b6fd 5 626 42 +b702 2 169 42 +b704 a 162 12 +b70e 4 71 12 +b712 18 74 12 +b72a 2 75 12 +b72c 2 76 12 +b72e 3 75 12 +b731 8 77 12 +b739 4 76 12 +b73d 1b 245 41 +b758 9 120 45 +b761 12 245 41 +b773 5 83 43 +b778 5 82 43 +b77d 9 83 43 +b786 12 84 43 +b798 e 86 12 +b7a6 e 2936 15 +b7b4 3 86 12 +b7b7 5 2936 15 +b7bc 9 86 12 +b7c5 3 115 12 +b7c8 2d 2936 15 +b7f5 b 89 12 +b800 8 120 12 +b808 9 124 12 +b811 4 125 12 +b815 5 93 12 +b81a 3 124 12 +b81d 3 125 12 +b820 3 93 12 +b823 4 126 12 +b827 16 93 12 +b83d 5 94 12 +b842 4 93 12 +b846 11 94 12 +b857 5 96 12 +b85c 4 94 12 +b860 10 96 12 +b870 8 78 12 +b878 d 79 12 +b885 c 70 43 +FUNC b8a0 229 0 std::vector >::reserve(unsigned long) +b8a0 a 69 43 +b8aa 25 66 43 +b8cf 9 69 43 +b8d8 4 338 21 +b8dc e 707 42 +b8ea 5 71 43 +b8ef 29 86 43 +b918 4 338 21 +b91c 2 169 42 +b91e 5 338 21 +b923 7 626 42 +b92a 3 169 42 +b92d 5 626 42 +b932 2 169 42 +b934 a 162 12 +b93e 4 71 12 +b942 1c 74 12 +b95e 2 75 12 +b960 2 76 12 +b962 3 75 12 +b965 8 77 12 +b96d 4 76 12 +b971 17 245 41 +b988 b 120 45 +b993 12 245 41 +b9a5 5 83 43 +b9aa 5 82 43 +b9af 9 83 43 +b9b8 18 84 43 +b9d0 e 86 12 +b9de e 2936 15 +b9ec 3 86 12 +b9ef 5 2936 15 +b9f4 9 86 12 +b9fd 3 115 12 +ba00 2d 2936 15 +ba2d b 89 12 +ba38 8 120 12 +ba40 9 124 12 +ba49 4 125 12 +ba4d 5 93 12 +ba52 3 124 12 +ba55 3 125 12 +ba58 3 93 12 +ba5b 4 126 12 +ba5f 16 93 12 +ba75 5 94 12 +ba7a 4 93 12 +ba7e 11 94 12 +ba8f 5 96 12 +ba94 4 94 12 +ba98 10 96 12 +baa8 8 78 12 +bab0 d 79 12 +babd c 70 43 +FUNC bad0 229 0 std::vector >::reserve(unsigned long) +bad0 a 69 43 +bada 25 66 43 +baff 9 69 43 +bb08 4 338 21 +bb0c e 707 42 +bb1a 5 71 43 +bb1f 29 86 43 +bb48 4 338 21 +bb4c 2 169 42 +bb4e 5 338 21 +bb53 7 626 42 +bb5a 3 169 42 +bb5d 5 626 42 +bb62 2 169 42 +bb64 a 162 12 +bb6e 4 71 12 +bb72 1c 74 12 +bb8e 2 75 12 +bb90 2 76 12 +bb92 3 75 12 +bb95 8 77 12 +bb9d 4 76 12 +bba1 17 245 41 +bbb8 b 120 45 +bbc3 12 245 41 +bbd5 5 83 43 +bbda 5 82 43 +bbdf 9 83 43 +bbe8 18 84 43 +bc00 e 86 12 +bc0e e 2936 15 +bc1c 3 86 12 +bc1f 5 2936 15 +bc24 9 86 12 +bc2d 3 115 12 +bc30 2d 2936 15 +bc5d b 89 12 +bc68 8 120 12 +bc70 9 124 12 +bc79 4 125 12 +bc7d 5 93 12 +bc82 3 124 12 +bc85 3 125 12 +bc88 3 93 12 +bc8b 4 126 12 +bc8f 16 93 12 +bca5 5 94 12 +bcaa 4 93 12 +bcae 11 94 12 +bcbf 5 96 12 +bcc4 4 94 12 +bcc8 10 96 12 +bcd8 8 78 12 +bce0 d 79 12 +bced c 70 43 +FUNC bd00 320 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, google_breakpad::MappingInfo* const&) +bd00 28 316 43 +bd28 8 320 43 +bd30 3 316 43 +bd33 2 320 43 +bd35 10 120 45 +bd45 4 329 43 +bd49 4 325 43 +bd4d 3 559 37 +bd50 4 325 43 +bd54 3 327 43 +bd57 4 559 37 +bd5b 5 560 37 +bd60 f 561 37 +bd6f 4 333 43 +bd73 2d 391 43 +bda0 8 120 45 +bda8 b 626 42 +bdb3 9 215 37 +bdbc 4 1308 42 +bdc0 9 1309 42 +bdc9 3 900 38 +bdcc c 162 12 +bdd8 3 900 38 +bddb 4 162 12 +bddf 8 342 43 +bde7 20 74 12 +be07 2 75 12 +be09 2 76 12 +be0b 3 75 12 +be0e 8 77 12 +be16 8 76 12 +be1e 8 351 43 +be26 b 120 45 +be31 4 360 43 +be35 b 245 41 +be40 b 120 45 +be4b d 245 41 +be58 13 316 43 +be6b 4 367 43 +be6f 11 245 41 +be80 b 120 45 +be8b d 245 41 +be98 10 316 43 +bea8 4 387 43 +beac 5 389 43 +beb1 4 388 43 +beb5 b 389 43 +bec0 3 900 38 +bec3 c 162 12 +becf 3 900 38 +bed2 5 162 12 +bed7 11 342 43 +bee8 7 86 12 +beef 2 2936 15 +bef1 7 86 12 +bef8 d 2936 15 +bf05 3 86 12 +bf08 5 2936 15 +bf0d 9 86 12 +bf16 3 115 12 +bf19 2d 2936 15 +bf46 a 89 12 +bf50 8 120 12 +bf58 9 124 12 +bf61 4 125 12 +bf65 8 93 12 +bf6d 3 124 12 +bf70 3 125 12 +bf73 4 126 12 +bf77 16 93 12 +bf8d 5 94 12 +bf92 4 93 12 +bf96 15 94 12 +bfab e 96 12 +bfb9 8 78 12 +bfc1 d 79 12 +bfce 13 1309 42 +bfe1 7 900 38 +bfe8 6 169 42 +bfee 8 900 38 +bff6 2 169 42 +bff8 4 342 43 +bffc 3 169 42 +bfff 4 342 43 +c003 6 169 42 +c009 a 162 12 +c013 d 71 12 +FUNC c020 460 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned long const&) +c020 11 439 43 +c031 c 442 43 +c03d 1f 444 43 +c05c 3 900 38 +c05f 3 447 43 +c062 7 900 38 +c069 5 450 43 +c06e 7 452 43 +c075 3 245 41 +c078 3 452 43 +c07b d 245 41 +c088 b 120 45 +c093 d 245 41 +c0a0 3 559 37 +c0a3 4 456 43 +c0a7 7 559 37 +c0ae 5 456 43 +c0b3 9 560 37 +c0bc 3 459 43 +c0bf 9 686 37 +c0c8 7 687 37 +c0cf 5 686 37 +c0d4 14 525 43 +c0e8 3 464 43 +c0eb 15 321 41 +c100 8 120 45 +c108 a 321 41 +c112 4 468 43 +c116 6 245 41 +c11c 5 468 43 +c121 f 245 41 +c130 b 120 45 +c13b d 245 41 +c148 10 472 43 +c158 7 687 37 +c15f 5 686 37 +c164 14 525 43 +c178 5 338 21 +c17d 3 626 42 +c180 d 1305 42 +c18d 7 626 42 +c194 c 1305 42 +c1a0 6 1308 42 +c1a6 3 900 38 +c1a9 4 1308 42 +c1ad 3 900 38 +c1b0 4 480 43 +c1b4 3 1309 42 +c1b7 5 480 43 +c1bc 6 1309 42 +c1c2 15 162 12 +c1d7 23 74 12 +c1fa 3 75 12 +c1fd 2 76 12 +c1ff 3 75 12 +c202 8 77 12 +c20a e 76 12 +c218 18 561 37 +c230 e 86 12 +c23e 9 2936 15 +c247 5 86 12 +c24c 6 2936 15 +c252 3 86 12 +c255 5 2936 15 +c25a 9 86 12 +c263 3 115 12 +c266 31 2936 15 +c297 13 89 12 +c2aa 16 486 43 +c2c0 c 120 45 +c2cc a 321 41 +c2d6 12 245 41 +c2e8 b 120 45 +c2f3 d 245 41 +c300 13 439 43 +c313 3 245 41 +c316 4 496 43 +c31a e 245 41 +c328 b 120 45 +c333 d 245 41 +c340 10 439 43 +c350 5 520 43 +c355 5 522 43 +c35a 5 521 43 +c35f 5 522 43 +c364 14 525 43 +c378 9 1309 42 +c381 1f 169 42 +c3a0 c 120 12 +c3ac 9 124 12 +c3b5 4 93 12 +c3b9 4 124 12 +c3bd 3 93 12 +c3c0 3 124 12 +c3c3 4 125 12 +c3c7 5 93 12 +c3cc 4 125 12 +c3d0 4 126 12 +c3d4 16 93 12 +c3ea 5 94 12 +c3ef 4 93 12 +c3f3 15 94 12 +c408 5 96 12 +c40d 4 94 12 +c411 f 96 12 +c420 c 78 12 +c42c d 79 12 +c439 e 472 43 +c447 8 241 41 +c44f 14 162 12 +c463 2 71 12 +c465 4 162 12 +c469 b 71 12 +c474 c 1306 42 +FUNC c480 43f 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, google_breakpad::MappingInfo* const&) +c480 11 439 43 +c491 c 442 43 +c49d 1e 444 43 +c4bb 3 900 38 +c4be 3 447 43 +c4c1 7 900 38 +c4c8 9 450 43 +c4d1 a 452 43 +c4db 15 245 41 +c4f0 b 120 45 +c4fb 11 245 41 +c50c 3 559 37 +c50f 3 456 43 +c512 3 559 37 +c515 4 456 43 +c519 4 559 37 +c51d 5 560 37 +c522 f 561 37 +c531 3 459 43 +c534 c 686 37 +c540 7 687 37 +c547 5 686 37 +c54c 14 525 43 +c560 10 321 41 +c570 8 120 45 +c578 e 321 41 +c586 4 468 43 +c58a 3 245 41 +c58d 4 468 43 +c591 f 245 41 +c5a0 b 120 45 +c5ab d 245 41 +c5b8 8 472 43 +c5c0 7 687 37 +c5c7 5 686 37 +c5cc 14 525 43 +c5e0 4 626 42 +c5e4 d 1305 42 +c5f1 7 626 42 +c5f8 c 1305 42 +c604 6 1308 42 +c60a 3 900 38 +c60d 4 1308 42 +c611 3 900 38 +c614 4 480 43 +c618 3 1309 42 +c61b 5 480 43 +c620 6 1309 42 +c626 15 162 12 +c63b 20 74 12 +c65b 2 75 12 +c65d 2 76 12 +c65f 3 75 12 +c662 8 77 12 +c66a e 76 12 +c678 7 86 12 +c67f 2 2936 15 +c681 7 86 12 +c688 d 2936 15 +c695 3 86 12 +c698 5 2936 15 +c69d 9 86 12 +c6a6 3 115 12 +c6a9 31 2936 15 +c6da 6 169 42 +c6e0 10 486 43 +c6f0 c 120 45 +c6fc a 321 41 +c706 4 491 43 +c70a 16 245 41 +c720 b 120 45 +c72b d 245 41 +c738 13 439 43 +c74b 4 498 43 +c74f 4 496 43 +c753 d 245 41 +c760 b 120 45 +c76b d 245 41 +c778 10 439 43 +c788 4 520 43 +c78c 5 522 43 +c791 4 521 43 +c795 4 522 43 +c799 17 525 43 +c7b0 9 1309 42 +c7b9 17 169 42 +c7d0 c 120 12 +c7dc 9 124 12 +c7e5 4 93 12 +c7e9 4 124 12 +c7ed 3 93 12 +c7f0 3 124 12 +c7f3 4 125 12 +c7f7 5 93 12 +c7fc 4 125 12 +c800 4 126 12 +c804 16 93 12 +c81a 5 94 12 +c81f 4 93 12 +c823 15 94 12 +c838 5 96 12 +c83d 4 94 12 +c841 f 96 12 +c850 c 78 12 +c85c d 79 12 +c869 8 245 41 +c871 8 444 43 +c879 d 472 43 +c886 8 241 41 +c88e c 1306 42 +c89a 14 162 12 +c8ae 2 71 12 +c8b0 4 162 12 +c8b4 b 71 12 +FUNC c8c0 3 0 google_breakpad::LinuxPtraceDumper::IsPostMortem() const +c8c0 3 242 22 +FUNC c8d0 d8 0 google_breakpad::LinuxPtraceDumper::BuildProcPath(char*, int, char const*) const +c8d0 a 107 22 +c8da 2 109 22 +c8dc 1b 107 22 +c8f7 3 108 22 +c8fa 3 107 22 +c8fd a 108 22 +c907 5 108 22 +c90c 8 111 22 +c914 3 112 22 +c917 3 111 22 +c91a 2 112 22 +c91c 2 113 22 +c91e 2a 126 22 +c948 b 115 22 +c953 7 116 22 +c95a 9 117 22 +c963 a 121 22 +c96d d 120 22 +c97a 5 121 22 +c97f 4 122 22 +c983 b 123 22 +c98e 5 122 22 +c993 5 123 22 +c998 6 124 22 +c99e a 125 22 +FUNC c9b0 ac 0 google_breakpad::LinuxPtraceDumper::CopyFromProcess(void*, int, void const*, unsigned long) +c9b0 11 129 22 +c9c1 3 136 22 +c9c4 9 130 22 +c9cd 5 136 22 +c9d2 10 138 22 +c9e2 6 131 22 +c9e8 8 137 22 +c9f0 5 138 22 +c9f5 3 137 22 +c9f8 a 2831 15 +ca02 8 137 22 +ca0a f 2831 15 +ca19 a 141 22 +ca23 3 142 22 +ca26 5 141 22 +ca2b 5 136 22 +ca30 10 144 22 +ca40 d 2831 15 +ca4d 9 139 22 +ca56 6 2831 15 +FUNC ca60 c2 0 google_breakpad::LinuxPtraceDumper::ThreadsResume() +ca60 2 262 22 +ca62 3 264 22 +ca65 b 262 22 +ca70 9 263 22 +ca79 4 305 22 +ca7d 4 626 42 +ca81 6 266 22 +ca87 7 626 42 +ca8e 7 266 22 +ca95 37 2831 15 +cacc 4 305 22 +cad0 4 626 42 +cad4 4 266 22 +cad8 7 626 42 +cadf 5 266 22 +cae4 7 268 22 +caeb 15 270 22 +cb00 22 2831 15 +FUNC cb30 49f 0 google_breakpad::LinuxPtraceDumper::GetThreadInfoByIndex(unsigned long, google_breakpad::ThreadInfo*) +cb30 17 150 22 +cb47 4 305 22 +cb4b b 626 42 +cb56 5 151 22 +cb5b 3 154 22 +cb5e 3 156 22 +cb61 3 154 22 +cb64 6 156 22 +cb6a 1c 158 22 +cb86 2 206 22 +cb88 12 238 22 +cb9a 23 2822 15 +cbbd 4 163 22 +cbc1 2 162 22 +cbc3 4 2822 15 +cbc7 2 162 22 +cbc9 23 74 12 +cbec 3 75 12 +cbef 5 76 12 +cbf4 3 75 12 +cbf7 8 77 12 +cbff 3 76 12 +cc02 3 82 12 +cc05 4 49 4 +cc09 5 175 22 +cc0e d 49 4 +cc1b 5 175 22 +cc20 3 49 4 +cc23 19 169 22 +cc3c 6 99 4 +cc42 f 66 4 +cc51 5 99 4 +cc56 3 2838 15 +cc59 5 98 4 +cc5e 3 99 4 +cc61 10 2838 15 +cc71 6 100 4 +cc77 a 102 4 +cc81 5 103 4 +cc86 4 66 4 +cc8a 15 70 4 +cc9f 11 150 22 +ccb0 18 70 4 +ccc8 7 69 4 +cccf c 78 4 +ccdb 20 2725 15 +ccfb c 182 22 +cd07 b 182 22 +cd12 c 2831 15 +cd1e 5 185 22 +cd23 1c 2831 15 +cd3f 8 189 22 +cd47 2c 2831 15 +cd73 b 205 22 +cd7e 13 2831 15 +cd91 e 199 22 +cd9f d 235 22 +cdac a 237 22 +cdb6 4 86 12 +cdba 2 2936 15 +cdbc 7 86 12 +cdc3 c 2936 15 +cdcf 3 86 12 +cdd2 5 2936 15 +cdd7 3 86 12 +cdda 3 115 12 +cddd 28 2936 15 +ce05 f 89 12 +ce14 3 71 4 +ce17 4 73 4 +ce1b 6 71 4 +ce21 18 172 22 +ce39 c 173 22 +ce45 d 116 4 +ce52 2 117 4 +ce54 8 118 4 +ce5c 7 117 4 +ce63 d 118 4 +ce70 10 105 4 +ce80 18 174 22 +ce98 10 175 22 +cea8 10 70 4 +ceb8 10 2838 15 +cec8 7 78 12 +cecf 8 79 12 +ced7 8 82 12 +cedf b 86 4 +ceea 8 87 4 +cef2 4 92 4 +cef6 3 90 4 +cef9 4 93 4 +cefd 6 90 4 +cf03 9 92 4 +cf0c a 120 12 +cf16 3 93 12 +cf19 4 124 12 +cf1d 3 93 12 +cf20 4 125 12 +cf24 5 93 12 +cf29 4 124 12 +cf2d 7 93 12 +cf34 4 126 12 +cf38 8 93 12 +cf40 5 94 12 +cf45 3 93 12 +cf48 10 94 12 +cf58 c 96 12 +cf64 e 2831 15 +cf72 1f 87 4 +cf91 1f 116 4 +cfb0 1f 156 22 +FUNC cfd0 20 0 google_breakpad::LinuxPtraceDumper::LinuxPtraceDumper(int) +cfd0 1 101 22 +cfd1 3 101 22 +cfd4 1a 103 22 +cfee 2 104 22 +FUNC cff0 36d 0 google_breakpad::LinuxPtraceDumper::EnumerateThreads() +cff0 17 274 22 +d007 7 276 22 +d00e 11 274 22 +d01f 15 276 22 +d034 2 281 22 +d036 3a 303 22 +d070 30 2822 15 +d0a0 4 280 22 +d0a4 23 74 12 +d0c7 3 75 12 +d0ca 5 76 12 +d0cf 2 77 12 +d0d1 4 75 12 +d0d5 6 77 12 +d0db 3 76 12 +d0de 8 295 22 +d0e6 4 82 3 +d0ea b 51 3 +d0f5 2 288 22 +d0f7 8 286 22 +d0ff 5 295 22 +d104 4 65 3 +d108 17 289 22 +d11f 8 87 3 +d127 2d 2757 15 +d154 22 2725 15 +d176 a 302 22 +d180 5 93 3 +d185 3 94 3 +d188 3 93 3 +d18b 5 94 3 +d190 6 93 3 +d196 12 94 3 +d1a8 f 290 22 +d1b7 8 289 22 +d1bf 8 292 22 +d1c7 8 291 22 +d1cf d 292 22 +d1dc 10 292 22 +d1ec e 883 42 +d1fa 8 120 45 +d202 16 887 42 +d218 10 302 22 +d228 9 68 3 +d231 6 70 3 +d237 5 71 3 +d23c 13 77 3 +d24f 21 80 3 +d270 10 73 3 +d280 4 86 12 +d284 2 2936 15 +d286 7 86 12 +d28d d 2936 15 +d29a 3 86 12 +d29d 5 2936 15 +d2a2 3 86 12 +d2a5 3 115 12 +d2a8 24 2936 15 +d2cc c 89 12 +d2d8 6 120 12 +d2de 3 93 12 +d2e1 4 124 12 +d2e5 3 93 12 +d2e8 4 125 12 +d2ec 5 93 12 +d2f1 4 124 12 +d2f5 7 93 12 +d2fc 4 126 12 +d300 8 93 12 +d308 5 94 12 +d30d 3 93 12 +d310 10 94 12 +d320 10 96 12 +d330 7 78 12 +d337 d 79 12 +d344 19 893 42 +FUNC d360 235 0 google_breakpad::LinuxPtraceDumper::ThreadsSuspend() +d360 2 244 22 +d362 5 246 22 +d367 12 244 22 +d379 d 245 22 +d386 4 305 22 +d38a b 626 42 +d395 9 247 22 +d39e 4 244 22 +d3a2 5 80 22 +d3a7 7 244 22 +d3ae 4 254 22 +d3b2 3 244 22 +d3b5 5 254 22 +d3ba 6 2831 15 +d3c0 8 254 22 +d3c8 4 248 22 +d3cc 8 751 42 +d3d4 7 60 22 +d3db 1e 2831 15 +d3f9 c 61 22 +d405 15 2998 15 +d41a 3 66 22 +d41d 3 2998 15 +d420 2 66 22 +d422 13 2998 15 +d435 b 65 22 +d440 5 66 22 +d445 1e 2831 15 +d463 5 305 22 +d468 8 626 42 +d470 8 751 42 +d478 4 626 42 +d47c 10 253 22 +d48c 12 305 22 +d49e a 626 42 +d4a8 4 254 22 +d4ac 3 626 42 +d4af 9 686 42 +d4b8 2 688 42 +d4ba 4 689 42 +d4be f 1320 42 +d4cd 4 255 22 +d4d1 d 247 22 +d4de 3 259 22 +d4e1 9 258 22 +d4ea 3 259 22 +d4ed 13 260 22 +d500 1a 2831 15 +d51a 26 80 22 +d540 30 1004 42 +d570 14 2831 15 +d584 7 247 22 +d58b a 2831 15 +FUNC d5a0 13 0 google_breakpad::LinuxPtraceDumper::~LinuxPtraceDumper() +d5a0 13 42 6 +FUNC d5c0 20 0 google_breakpad::LinuxPtraceDumper::~LinuxPtraceDumper() +d5c0 8 42 6 +d5c8 18 42 6 +FUNC d5e0 306 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, int const&) +d5e0 28 316 43 +d608 8 320 43 +d610 3 316 43 +d613 2 320 43 +d615 a 120 45 +d61f 4 329 43 +d623 4 325 43 +d627 3 559 37 +d62a 4 325 43 +d62e 3 327 43 +d631 4 559 37 +d635 5 560 37 +d63a f 561 37 +d649 3 333 43 +d64c 24 391 43 +d670 4 305 22 +d674 a 626 42 +d67e 9 215 37 +d687 4 1308 42 +d68b 9 1309 42 +d694 3 900 38 +d697 d 162 12 +d6a4 3 900 38 +d6a7 3 162 12 +d6aa 8 342 43 +d6b2 23 74 12 +d6d5 3 75 12 +d6d8 2 76 12 +d6da 3 75 12 +d6dd 8 77 12 +d6e5 8 76 12 +d6ed 8 351 43 +d6f5 a 120 45 +d6ff 11 245 41 +d710 9 120 45 +d719 d 245 41 +d726 13 316 43 +d739 f 245 41 +d748 9 120 45 +d751 d 245 41 +d75e 10 316 43 +d76e 4 387 43 +d772 5 389 43 +d777 4 388 43 +d77b d 389 43 +d788 3 900 38 +d78b c 162 12 +d797 3 900 38 +d79a 5 162 12 +d79f 11 342 43 +d7b0 7 86 12 +d7b7 2 2936 15 +d7b9 7 86 12 +d7c0 d 2936 15 +d7cd 3 86 12 +d7d0 5 2936 15 +d7d5 9 86 12 +d7de 3 115 12 +d7e1 2d 2936 15 +d80e f 89 12 +d81d 8 120 12 +d825 9 124 12 +d82e 4 125 12 +d832 8 93 12 +d83a 3 124 12 +d83d 3 125 12 +d840 4 126 12 +d844 16 93 12 +d85a 5 94 12 +d85f 4 93 12 +d863 15 94 12 +d878 b 96 12 +d883 8 78 12 +d88b d 79 12 +d898 13 1309 42 +d8ab 7 900 38 +d8b2 6 169 42 +d8b8 8 900 38 +d8c0 2 169 42 +d8c2 4 342 43 +d8c6 3 169 42 +d8c9 4 342 43 +d8cd 6 169 42 +d8d3 6 162 12 +d8d9 d 71 12 +FUNC d8f0 458 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, int const&) +d8f0 11 439 43 +d901 c 442 43 +d90d 1f 444 43 +d92c 3 900 38 +d92f 3 447 43 +d932 7 900 38 +d939 5 450 43 +d93e 7 452 43 +d945 3 245 41 +d948 3 452 43 +d94b d 245 41 +d958 9 120 45 +d961 d 245 41 +d96e 3 559 37 +d971 4 456 43 +d975 7 559 37 +d97c 5 456 43 +d981 9 560 37 +d98a 3 459 43 +d98d b 686 37 +d998 7 687 37 +d99f 5 686 37 +d9a4 14 525 43 +d9b8 3 464 43 +d9bb 15 321 41 +d9d0 8 120 45 +d9d8 a 321 41 +d9e2 4 468 43 +d9e6 6 245 41 +d9ec 5 468 43 +d9f1 f 245 41 +da00 9 120 45 +da09 d 245 41 +da16 a 472 43 +da20 7 687 37 +da27 5 686 37 +da2c 14 525 43 +da40 5 305 22 +da45 3 626 42 +da48 d 1305 42 +da55 7 626 42 +da5c c 1305 42 +da68 6 1308 42 +da6e 3 900 38 +da71 4 1308 42 +da75 3 900 38 +da78 4 480 43 +da7c 3 1309 42 +da7f 5 480 43 +da84 6 1309 42 +da8a 15 162 12 +da9f 23 74 12 +dac2 3 75 12 +dac5 2 76 12 +dac7 3 75 12 +daca 8 77 12 +dad2 e 76 12 +dae0 20 561 37 +db00 e 86 12 +db0e 9 2936 15 +db17 5 86 12 +db1c 6 2936 15 +db22 3 86 12 +db25 5 2936 15 +db2a 9 86 12 +db33 3 115 12 +db36 31 2936 15 +db67 13 89 12 +db7a 16 486 43 +db90 b 120 45 +db9b a 321 41 +dba5 13 245 41 +dbb8 9 120 45 +dbc1 d 245 41 +dbce 13 439 43 +dbe1 3 245 41 +dbe4 4 496 43 +dbe8 8 245 41 +dbf0 9 120 45 +dbf9 d 245 41 +dc06 10 439 43 +dc16 5 520 43 +dc1b 5 522 43 +dc20 5 521 43 +dc25 5 522 43 +dc2a 16 525 43 +dc40 9 1309 42 +dc49 1f 169 42 +dc68 c 120 12 +dc74 9 124 12 +dc7d 4 93 12 +dc81 4 124 12 +dc85 3 93 12 +dc88 3 124 12 +dc8b 4 125 12 +dc8f 5 93 12 +dc94 4 125 12 +dc98 4 126 12 +dc9c 16 93 12 +dcb2 5 94 12 +dcb7 4 93 12 +dcbb 15 94 12 +dcd0 5 96 12 +dcd5 4 94 12 +dcd9 f 96 12 +dce8 c 78 12 +dcf4 d 79 12 +dd01 e 472 43 +dd0f 8 241 41 +dd17 14 162 12 +dd2b 2 71 12 +dd2d 4 162 12 +dd31 b 71 12 +dd3c c 1306 42 +FUNC dd50 e3 0 isLegalUTF8 +dd50 3 294 25 +dd53 3 295 25 +dd56 4 294 25 +dd5a e 295 25 +dd68 2 296 25 +dd6a 6 315 25 +dd70 8 295 25 +dd78 3 311 25 +dd7b 2 298 25 +dd7d 5 311 25 +dd82 e 313 25 +dd90 a 298 25 +dd9a 5 298 25 +dd9f 4 298 25 +dda3 4 299 25 +dda7 2 298 25 +dda9 4 299 25 +ddad 5 299 25 +ddb2 e 299 25 +ddc0 4 300 25 +ddc4 2 298 25 +ddc6 5 300 25 +ddcb f 302 25 +ddda e 304 25 +dde8 a 302 25 +ddf2 2 298 25 +ddf4 4 308 25 +ddf8 8 315 25 +de00 18 306 25 +de18 10 305 25 +de28 b 307 25 +FUNC de40 fe 0 ConvertUTF32toUTF16 +de40 3 64 25 +de43 1 62 25 +de44 3 65 25 +de47 1 62 25 +de48 9 66 25 +de51 f 68 25 +de60 10 74 25 +de70 9 75 25 +de79 a 89 25 +de83 5 66 25 +de88 c 68 25 +de94 7 71 25 +de9b 9 72 25 +dea4 9 85 25 +dead 5 86 25 +deb2 3 66 25 +deb5 5 87 25 +deba 6 66 25 +dec0 3 102 25 +dec3 3 103 25 +dec6 a 105 25 +ded0 10 83 25 +dee0 9 93 25 +dee9 7 97 25 +def0 3 98 25 +def3 7 99 25 +defa 4 98 25 +defe 6 99 25 +df04 6 98 25 +df0a 5 99 25 +df0f 4 98 25 +df13 9 99 25 +df1c 3 93 25 +df1f 3 102 25 +df22 5 95 25 +df27 3 103 25 +df2a 3 105 25 +df2d 3 75 25 +df30 7 77 25 +df37 3 66 25 +df3a 4 63 25 +FUNC df40 e6 0 ConvertUTF16toUTF32 +df40 3 112 25 +df43 3 113 25 +df46 9 115 25 +df4f 9 110 25 +df58 9 121 25 +df61 5 122 25 +df66 10 124 25 +df76 4 125 25 +df7a 4 127 25 +df7e 8 125 25 +df86 5 146 25 +df8b 7 150 25 +df92 8 115 25 +df9a 8 117 25 +dfa2 10 119 25 +dfb2 5 138 25 +dfb7 10 140 25 +dfc7 2 161 25 +dfc9 5 142 25 +dfce 3 152 25 +dfd1 3 153 25 +dfd4 c 161 25 +dfe0 5 128 25 +dfe5 5 146 25 +dfea 2 161 25 +dfec 5 148 25 +dff1 3 152 25 +dff4 3 153 25 +dff7 b 161 25 +e002 2 111 25 +e004 3 152 25 +e007 3 153 25 +e00a 5 161 25 +e00f 5 135 25 +e014 3 152 25 +e017 3 153 25 +e01a 3 161 25 +e01d 3 152 25 +e020 2 111 25 +e022 3 153 25 +e025 1 161 25 +FUNC e030 216 0 ConvertUTF16toUTF8 +e030 2 213 25 +e032 3 215 25 +e035 2 213 25 +e037 3 217 25 +e03a 1 213 25 +e03b 3 216 25 +e03e 1 213 25 +e03f 9 217 25 +e048 8 223 25 +e050 10 225 25 +e060 9 227 25 +e069 5 228 25 +e06e 14 230 25 +e082 4 231 25 +e086 4 233 25 +e08a 8 231 25 +e092 6 253 25 +e098 4 261 25 +e09c 12 262 25 +e0ae 12 261 25 +e0c0 5 244 25 +e0c5 10 246 25 +e0d5 1 277 25 +e0d6 3 274 25 +e0d9 3 275 25 +e0dc 5 248 25 +e0e1 f 277 25 +e0f0 8 254 25 +e0f8 4 261 25 +e0fc 12 262 25 +e10e 12 261 25 +e120 5 234 25 +e125 8 255 25 +e12d 4 261 25 +e131 f 262 25 +e140 10 261 25 +e150 c 256 25 +e15c 4 261 25 +e160 9 262 25 +e169 15 267 25 +e17e 6 261 25 +e184 8 267 25 +e18c 1a 268 25 +e1a6 14 269 25 +e1ba e 270 25 +e1c8 3 217 25 +e1cb 5 272 25 +e1d0 4 270 25 +e1d4 6 217 25 +e1da 1 277 25 +e1db 3 274 25 +e1de 3 275 25 +e1e1 2 214 25 +e1e3 d 277 25 +e1f0 a 258 25 +e1fa 1 277 25 +e1fb 3 274 25 +e1fe 3 275 25 +e201 5 241 25 +e206 6 277 25 +e20c 7 262 25 +e213 1 277 25 +e214 3 264 25 +e217 3 274 25 +e21a 5 264 25 +e21f 3 275 25 +e222 6 277 25 +e228 9 262 25 +e231 3 261 25 +e234 12 262 25 +FUNC e250 2b 0 isLegalUTF8Sequence +e250 11 324 25 +e261 b 325 25 +e26c c 328 25 +e278 3 329 25 +FUNC e280 265 0 ConvertUTF8toUTF16 +e280 e 334 25 +e28e 3 336 25 +e291 3 337 25 +e294 13 334 25 +e2a7 3 338 25 +e2aa 5 334 25 +e2af 6 338 25 +e2b5 14 340 25 +e2c9 17 341 25 +e2e0 17 345 25 +e2f7 2 339 25 +e2f9 17 352 25 +e310 2 339 25 +e312 f 354 25 +e321 f 355 25 +e330 f 356 25 +e33f f 357 25 +e34e b 358 25 +e359 e 360 25 +e367 b 362 25 +e372 c 366 25 +e37e 14 368 25 +e392 8 377 25 +e39a a 338 25 +e3a4 14 340 25 +e3b8 12 341 25 +e3ca 5 342 25 +e3cf 8 398 25 +e3d7 8 399 25 +e3df 11 401 25 +e3f0 30 339 25 +e420 10 353 25 +e430 10 339 25 +e440 c 380 25 +e44c a 385 25 +e456 a 338 25 +e460 10 335 25 +e470 8 379 25 +e478 b 389 25 +e483 6 393 25 +e489 3 394 25 +e48c 5 395 25 +e491 4 394 25 +e495 4 395 25 +e499 5 394 25 +e49e 5 395 25 +e4a3 4 394 25 +e4a7 9 395 25 +e4b0 3 390 25 +e4b3 5 391 25 +e4b8 6 390 25 +e4be a 391 25 +e4c8 a 346 25 +e4d2 3 382 25 +e4d5 5 381 25 +e4da 6 382 25 +e4e0 5 383 25 +FUNC e4f0 1c0 0 ConvertUTF32toUTF8 +e4f0 2 406 25 +e4f2 3 408 25 +e4f5 2 410 25 +e4f7 2 406 25 +e4f9 3 410 25 +e4fc 3 406 25 +e4ff 3 409 25 +e502 1 406 25 +e503 d 410 25 +e510 3 416 25 +e513 7 415 25 +e51a 2 416 25 +e51c 14 418 25 +e530 6 428 25 +e536 4 437 25 +e53a f 438 25 +e549 f 437 25 +e558 9 429 25 +e561 4 437 25 +e565 f 438 25 +e574 c 437 25 +e580 9 430 25 +e589 4 437 25 +e58d f 438 25 +e59c c 437 25 +e5a8 d 431 25 +e5b5 4 437 25 +e5b9 9 438 25 +e5c2 15 443 25 +e5d7 6 437 25 +e5dd 8 443 25 +e5e5 17 444 25 +e5fc 17 445 25 +e613 f 446 25 +e622 3 410 25 +e625 5 448 25 +e62a 3 415 25 +e62d 4 446 25 +e631 6 410 25 +e637 1 453 25 +e638 3 450 25 +e63b 3 451 25 +e63e 12 453 25 +e650 6 433 25 +e656 a 434 25 +e660 1 453 25 +e661 3 450 25 +e664 3 451 25 +e667 5 420 25 +e66c 8 453 25 +e674 7 438 25 +e67b 1 453 25 +e67c 3 440 25 +e67f 3 450 25 +e682 5 440 25 +e687 3 451 25 +e68a 8 453 25 +e692 9 438 25 +e69b 3 437 25 +e69e 12 438 25 +FUNC e6b0 29f 0 ConvertUTF8toUTF32 +e6b0 e 458 25 +e6be 3 460 25 +e6c1 3 461 25 +e6c4 14 458 25 +e6d8 3 462 25 +e6db 5 458 25 +e6e0 6 462 25 +e6e6 14 464 25 +e6fa 12 465 25 +e70c 4 457 25 +e710 18 459 25 +e728 7 469 25 +e72f 4 457 25 +e733 19 469 25 +e74c 2 463 25 +e74e 1a 476 25 +e768 2 463 25 +e76a 10 478 25 +e77a 10 479 25 +e78a 10 480 25 +e79a 10 481 25 +e7aa c 482 25 +e7b6 b 484 25 +e7c1 b 486 25 +e7cc c 490 25 +e7d8 14 495 25 +e7ec c 496 25 +e7f8 3 457 25 +e7fb 8 501 25 +e803 b 462 25 +e80e 19 464 25 +e827 17 465 25 +e83e 8 466 25 +e846 5 511 25 +e84b 5 512 25 +e850 3 511 25 +e853 3 512 25 +e856 1a 514 25 +e870 30 463 25 +e8a0 10 477 25 +e8b0 10 463 25 +e8c0 5 462 25 +e8c5 3 457 25 +e8c8 8 508 25 +e8d0 8 507 25 +e8d8 18 462 25 +e8f0 3 457 25 +e8f3 10 504 25 +e903 d 470 25 +e910 6 487 25 +e916 8 488 25 +e91e 6 487 25 +e924 5 488 25 +e929 6 497 25 +e92f 8 498 25 +e937 6 497 25 +e93d 5 499 25 +e942 d 459 25 +FUNC e950 a 0 google_breakpad::FileID::FileID(char const*) +e950 a 52 27 +FUNC e960 1ee 0 google_breakpad::FileID::ElfFileIdentifierFromMappedFile(void const*, unsigned char*) +e960 a 143 27 +e96a 5 99 27 +e96f 4 143 27 +e973 12 99 27 +e985 f 98 27 +e994 21 102 27 +e9b5 8 98 27 +e9bd 23 125 27 +e9e0 2 127 27 +e9e2 c 124 27 +e9ee f 130 27 +e9fd d 132 27 +ea0a 5 131 27 +ea0f b 132 27 +ea1a 6 133 27 +ea20 8 78 27 +ea28 b 135 27 +ea33 6 134 27 +ea39 4 136 27 +ea3d 5 133 27 +ea42 5 146 27 +ea47 9 150 27 +ea50 b 98 27 +ea5b d 107 27 +ea68 9 110 27 +ea71 4 66 27 +ea75 5 112 27 +ea7a 3 66 27 +ea7d 13 68 27 +ea90 1a 71 27 +eaaa 9 68 27 +eab3 6 69 27 +eab9 b 76 27 +eac4 3 82 27 +eac7 a 85 27 +ead1 b 82 27 +eadc 5 85 27 +eae1 3 87 27 +eae4 5 194 37 +eae9 6 87 27 +eaef 8 194 37 +eaf7 a 87 27 +eb01 4 66 27 +eb05 5 109 27 +eb0a 3 66 27 +eb0d 13 68 27 +eb20 1a 71 27 +eb3a 9 68 27 +eb43 b 69 27 +FUNC eb50 59 0 google_breakpad::FileID::ElfFileIdentifier(unsigned char*) +eb50 4 152 27 +eb54 3 153 27 +eb57 4 152 27 +eb5b a 153 27 +eb65 5 192 27 +eb6a 5 154 27 +eb6f 1b 157 27 +eb8a 6 158 27 +eb90 4 155 27 +eb94 15 157 27 +FUNC ebb0 e5 0 google_breakpad::FileID::ConvertIdentifierToString(unsigned char const*, char*, int) +ebb0 2 162 27 +ebb2 c 166 27 +ebbe 8 168 27 +ebc6 3 170 27 +ebc9 4 172 27 +ebcd 4 170 27 +ebd1 4 172 27 +ebd5 4 170 27 +ebd9 2 175 27 +ebdb 5 170 27 +ebe0 5 172 27 +ebe5 13 175 27 +ebf8 a 175 27 +ec02 6 178 27 +ec08 8 181 27 +ec10 3 178 27 +ec13 4 179 27 +ec17 3 178 27 +ec1a 3 181 27 +ec1d 4 179 27 +ec21 6 178 27 +ec27 2 181 27 +ec29 5 181 27 +ec2e a 182 27 +ec38 1a 184 27 +ec52 1a 185 27 +ec6c 2 175 27 +ec6e 4 185 27 +ec72 2 175 27 +ec74 7 189 27 +ec7b 1 190 27 +ec7c 4 189 27 +ec80 2 190 27 +ec82 6 174 27 +ec88 6 189 27 +ec8e 1 190 27 +ec8f 4 189 27 +ec93 2 190 27 +FUNC eca0 10 0 google_breakpad::MemoryMappedFile::MemoryMappedFile() +eca0 10 50 13 +FUNC ecb0 56 0 google_breakpad::MemoryMappedFile::Unmap() +ecb0 11 98 30 +ecc1 3 105 30 +ecc4 5 99 30 +ecc9 1f 2812 15 +ece8 7 70 13 +ecef 8 72 13 +ecf7 f 103 30 +FUNC ed10 193 0 google_breakpad::MemoryMappedFile::Map(char const*) +ed10 a 57 30 +ed1a 2 2822 15 +ed1c 14 57 30 +ed30 3 57 30 +ed33 5 58 30 +ed38 1b 2822 15 +ed53 9 2725 15 +ed5c 34 96 30 +ed90 5 61 30 +ed95 3 2741 15 +ed98 3 67 30 +ed9b 20 2741 15 +edbb 1e 2725 15 +edd9 7 73 30 +ede0 5 67 30 +ede5 b 67 30 +edf0 6 79 30 +edf6 39 2936 15 +ee2f 1e 2725 15 +ee4d 6 90 30 +ee53 5 94 30 +ee58 8 72 13 +ee60 4 70 13 +ee64 5 95 30 +ee69 17 72 13 +ee80 13 2725 15 +ee93 5 81 30 +ee98 b 2725 15 +FUNC eeb0 14 0 google_breakpad::MemoryMappedFile::MemoryMappedFile(char const*) +eeb0 f 50 13 +eebf 5 50 30 +FUNC eed0 5 0 google_breakpad::MemoryMappedFile::~MemoryMappedFile() +eed0 5 54 30 +FUNC eee0 3a 0 google_breakpad::SafeReadLink(char const*, char*, unsigned long) +eee0 1 39 31 +eee1 1b 2840 15 +eefc 2 50 31 +eefe 2 51 31 +ef00 b 46 31 +ef0b 4 47 31 +ef0f 5 48 31 +ef14 2 51 31 +ef16 2 50 31 +ef18 2 51 31 +FUNC ef20 1f 0 google_breakpad::IsValidElf(void const*) +ef20 7 111 26 +ef27 4 109 26 +ef2b f 111 26 +ef3a 5 112 26 +FUNC ef40 5 0 google_breakpad::ElfClass(void const*) +ef40 4 118 26 +ef44 1 119 26 +FUNC ef50 466 0 google_breakpad::FindElfSection(void const*, char const*, unsigned int, void const**, int*, int*) +ef50 25 126 26 +ef75 3 127 26 +ef78 5 126 26 +ef7d 6 127 26 +ef83 c 128 26 +ef8f c 129 26 +ef9b 7 131 26 +efa2 d 132 26 +efaf 9 134 26 +efb8 2 135 26 +efba 26 156 26 +efe0 8 137 26 +efe8 5 138 26 +efed 3 139 26 +eff0 9 145 26 +eff9 5 149 26 +effe 1c 55 26 +f01a a 58 26 +f024 4 62 26 +f028 a 42 10 +f032 4 70 26 +f036 7 62 26 +f03d 4 42 10 +f041 7 65 26 +f048 6 53 10 +f04e 5 65 26 +f053 6 53 10 +f059 9 54 10 +f062 9 55 10 +f06b e 57 10 +f079 8 58 10 +f081 3 121 26 +f084 3 63 10 +f087 3 121 26 +f08a 3 63 10 +f08d 17 121 26 +f0a4 5 61 10 +f0a9 4 63 10 +f0ad 3 62 10 +f0b0 7 63 10 +f0b7 4 62 10 +f0bb 2a 63 10 +f0e5 9 72 26 +f0ee 8 73 26 +f0f6 e 74 26 +f104 b 152 26 +f10f 1c 55 26 +f12b a 58 26 +f135 4 62 26 +f139 3 42 10 +f13c 4 70 26 +f140 4 62 26 +f144 3 42 10 +f147 4 62 26 +f14b 4 42 10 +f14f 4 65 26 +f153 3 42 10 +f156 3 65 26 +f159 c 53 10 +f165 9 54 10 +f16e 9 55 10 +f177 13 57 10 +f18a 11 58 10 +f19b 3 121 26 +f19e 3 63 10 +f1a1 3 121 26 +f1a4 3 63 10 +f1a7 15 121 26 +f1bc 9 61 10 +f1c5 4 63 10 +f1c9 2 62 10 +f1cb 2 63 10 +f1cd 4 62 10 +f1d1 37 63 10 +f208 b 72 26 +f213 a 73 26 +f21d 9 74 26 +f226 1f 127 26 +f245 1f 129 26 +f264 1f 128 26 +f283 3e 55 10 +f2c1 1c 54 10 +f2dd 1f 53 10 +f2fc 1f 58 26 +f31b 1f 55 26 +f33a 1f 54 10 +f359 1f 53 10 +f378 1f 58 26 +f397 1f 55 26 +FUNC f3c0 29c 0 google_breakpad::FindElfSegment(void const*, unsigned int, void const**, int*, int*) +f3c0 20 162 26 +f3e0 9 163 26 +f3e9 c 164 26 +f3f5 c 165 26 +f401 7 167 26 +f408 c 168 26 +f414 9 170 26 +f41d 2 171 26 +f41f 21 192 26 +f440 8 173 26 +f448 5 174 26 +f44d 3 175 26 +f450 9 181 26 +f459 5 185 26 +f45e 1c 90 26 +f47a a 93 26 +f484 4 98 26 +f488 7 42 10 +f48f 3 98 26 +f492 3 42 10 +f495 2 98 26 +f497 9 99 26 +f4a0 20 158 26 +f4c0 11 99 26 +f4d1 9 98 26 +f4da b 188 26 +f4e5 1c 90 26 +f501 a 93 26 +f50b 3 42 10 +f50e 4 98 26 +f512 3 42 10 +f515 3 98 26 +f518 3 42 10 +f51b 2 98 26 +f51d 5 99 26 +f522 1e 158 26 +f540 d 99 26 +f54d b 98 26 +f558 4 100 26 +f55c 4 101 26 +f560 4 100 26 +f564 9 101 26 +f56d 6 100 26 +f573 3 101 26 +f576 4 100 26 +f57a 9 101 26 +f583 1f 165 26 +f5a2 1f 164 26 +f5c1 1f 163 26 +f5e0 1f 93 26 +f5ff 1f 90 26 +f61e 1f 93 26 +f63d 1f 90 26 +STACK CFI INIT 18c0 350 .cfa: $rsp 16 + .ra: .cfa -8 + ^ +STACK CFI 18c6 .cfa: $rsp 24 + +STACK CFI INIT 2140 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2141 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 216b .cfa: $rsp 8 + +STACK CFI INIT 2170 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2180 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2181 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2188 .cfa: $rsp 32 + +STACK CFI 21ae .cfa: $rsp 16 + +STACK CFI 21af .cfa: $rsp 8 + +STACK CFI 21b0 .cfa: $rsp 32 + +STACK CFI INIT 1f40 f3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f41 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 1f4d .cfa: $rsp 240 + +STACK CFI 1fec .cfa: $rsp 16 + +STACK CFI 1fef .cfa: $rsp 8 + +STACK CFI 1ff0 .cfa: $rsp 240 + +STACK CFI INIT 1c10 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2210 f5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 221f $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2221 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 2223 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 222b $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 2233 $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 223c .cfa: $rsp 208 + +STACK CFI 22e2 .cfa: $rsp 48 + +STACK CFI 22e8 $rbx: $rbx .cfa: $rsp 40 + +STACK CFI 22e9 $rbp: $rbp .cfa: $rsp 32 + +STACK CFI 22eb $r12: $r12 .cfa: $rsp 24 + +STACK CFI 22ed $r13: $r13 .cfa: $rsp 16 + +STACK CFI 22ef $r14: $r14 .cfa: $rsp 8 + +STACK CFI 22f0 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ .cfa: $rsp 208 + +STACK CFI 22f7 .cfa: $rsp 48 + +STACK CFI 22fa $rbx: $rbx .cfa: $rsp 40 + +STACK CFI 22fb $rbp: $rbp .cfa: $rsp 32 + +STACK CFI 22fd $r12: $r12 .cfa: $rsp 24 + +STACK CFI 22ff $r13: $r13 .cfa: $rsp 16 + +STACK CFI 2301 $r14: $r14 .cfa: $rsp 8 + +STACK CFI INIT 2310 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2323 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI 233b $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 2341 .cfa: $rsp 48 + +STACK CFI 238c $r12: $r12 $r13: $r13 $rbp: $rbp $rbx: $rbx .cfa: $rsp 8 + +STACK CFI 2390 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ .cfa: $rsp 48 + +STACK CFI INIT 23a0 104 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 23bb $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 23c2 .cfa: $rsp 64 + +STACK CFI 2401 .cfa: $rsp 8 + +STACK CFI 2408 .cfa: $rsp 64 + +STACK CFI 246d .cfa: $rsp 8 + +STACK CFI 2478 .cfa: $rsp 64 + +STACK CFI INIT 24b0 477 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 24ba $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI 24db $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 160 + +STACK CFI 2522 .cfa: $rsp 8 + +STACK CFI 2528 .cfa: $rsp 160 + +STACK CFI INIT 2930 19c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2932 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2934 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 2938 $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 293c $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 2946 .cfa: $rsp 1632 + +STACK CFI 2a7f .cfa: $rsp 40 + +STACK CFI 2a80 .cfa: $rsp 32 + +STACK CFI 2a81 .cfa: $rsp 24 + +STACK CFI 2a83 .cfa: $rsp 16 + +STACK CFI 2a85 .cfa: $rsp 8 + +STACK CFI 2a90 .cfa: $rsp 1632 + +STACK CFI 2a97 .cfa: $rsp 40 + +STACK CFI 2a9d .cfa: $rsp 32 + +STACK CFI 2a9e .cfa: $rsp 24 + +STACK CFI 2aa0 .cfa: $rsp 16 + +STACK CFI 2aa2 .cfa: $rsp 8 + +STACK CFI 2aa8 .cfa: $rsp 1632 + +STACK CFI INIT 2ad0 68 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2ada $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 2ae6 $r12: .cfa -16 + ^ .cfa: $rsp 32 + +STACK CFI 2b12 .cfa: $rsp 8 + +STACK CFI 2b18 .cfa: $rsp 32 + +STACK CFI 2b33 .cfa: $rsp 8 + +STACK CFI INIT 2b40 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2b47 .cfa: $rsp 1104 + +STACK CFI 2b95 .cfa: $rsp 8 + +STACK CFI INIT 2ba0 18b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2ba2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2ba4 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 2ba6 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 2ba8 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 2bac $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 2bb0 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 2bb9 .cfa: $rsp 224 + +STACK CFI 2c73 .cfa: $rsp 56 + +STACK CFI 2c74 .cfa: $rsp 48 + +STACK CFI 2c75 .cfa: $rsp 40 + +STACK CFI 2c77 .cfa: $rsp 32 + +STACK CFI 2c79 .cfa: $rsp 24 + +STACK CFI 2c7b .cfa: $rsp 16 + +STACK CFI 2c7d .cfa: $rsp 8 + +STACK CFI 2c80 .cfa: $rsp 224 + +STACK CFI INIT 2d30 e0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2d3a $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ +STACK CFI 2d4a $r13: .cfa -16 + ^ $rbx: .cfa -40 + ^ .cfa: $rsp 80 + +STACK CFI 2d88 .cfa: $rsp 8 + +STACK CFI 2d90 .cfa: $rsp 80 + +STACK CFI INIT 2e10 58 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2e14 .cfa: $rsp 32 + +STACK CFI 2e44 .cfa: $rsp 8 + +STACK CFI 2e48 .cfa: $rsp 32 + +STACK CFI 2e67 .cfa: $rsp 8 + +STACK CFI INIT 2e70 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2e71 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2e97 .cfa: $rsp 8 + +STACK CFI INIT 2ea0 163 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2ea1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2ea8 .cfa: $rsp 1616 + +STACK CFI 2f0a .cfa: $rsp 16 + +STACK CFI 2f0b .cfa: $rsp 8 + +STACK CFI 2f10 .cfa: $rsp 1616 + +STACK CFI 2fd5 .cfa: $rsp 16 + +STACK CFI 2fd6 .cfa: $rsp 8 + +STACK CFI 2fe0 .cfa: $rsp 1616 + +STACK CFI INIT 3010 cf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 302b $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ .cfa: $rsp 640 + +STACK CFI 30da .cfa: $rsp 8 + +STACK CFI INIT 30e0 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 30e2 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 30e6 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 30eb $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 3127 .cfa: $rsp 24 + +STACK CFI 312e .cfa: $rsp 16 + +STACK CFI 3130 .cfa: $rsp 8 + +STACK CFI 3138 .cfa: $rsp 32 + +STACK CFI 3139 .cfa: $rsp 24 + +STACK CFI 313a .cfa: $rsp 16 + +STACK CFI 313c .cfa: $rsp 8 + +STACK CFI INIT 3140 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3141 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 315f .cfa: $rsp 8 + +STACK CFI 3160 .cfa: $rsp 16 + +STACK CFI 316c .cfa: $rsp 8 + +STACK CFI INIT 3180 179 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 318a $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 3197 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 31a8 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI 3270 .cfa: $rsp 8 + +STACK CFI 3278 .cfa: $rsp 128 + +STACK CFI INIT 3ad0 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3ad1 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 3ad5 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 3ad9 .cfa: $rsp 32 + +STACK CFI 3afc .cfa: $rsp 24 + +STACK CFI 3afd .cfa: $rsp 16 + +STACK CFI 3afe .cfa: $rsp 8 + +STACK CFI INIT 3b00 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3b01 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 3b05 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 3b09 .cfa: $rsp 32 + +STACK CFI 3b2c .cfa: $rsp 24 + +STACK CFI 3b2d .cfa: $rsp 16 + +STACK CFI 3b2e .cfa: $rsp 8 + +STACK CFI INIT 3300 336 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3302 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 3304 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 3305 $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 3306 $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 330d .cfa: $rsp 128 + +STACK CFI 3465 .cfa: $rsp 40 + +STACK CFI 3466 .cfa: $rsp 32 + +STACK CFI 3467 .cfa: $rsp 24 + +STACK CFI 3469 .cfa: $rsp 16 + +STACK CFI 346b .cfa: $rsp 8 + +STACK CFI 3470 .cfa: $rsp 128 + +STACK CFI INIT 3b30 1ba .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3b3a $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 3b58 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 80 + +STACK CFI 3bc2 .cfa: $rsp 8 + +STACK CFI 3bc8 .cfa: $rsp 80 + +STACK CFI INIT 3640 31c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3645 $r14: .cfa -24 + ^ +STACK CFI 3658 $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 3669 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ .cfa: $rsp 80 + +STACK CFI 376f .cfa: $rsp 8 + +STACK CFI 3770 .cfa: $rsp 80 + +STACK CFI INIT 3960 167 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 396a $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 397e $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ .cfa: $rsp 256 + +STACK CFI 3a42 .cfa: $rsp 8 + +STACK CFI 3a43 .cfa: $rsp 256 + +STACK CFI INIT 1c2a 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 3cf0 7d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3cfe $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ .cfa: $rsp 32 + +STACK CFI 3d4d .cfa: $rsp 8 + +STACK CFI 3d4e .cfa: $rsp 32 + +STACK CFI INIT 3d70 232 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3d72 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 3d73 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 3d74 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 3d7b .cfa: $rsp 160 + +STACK CFI 3ede .cfa: $rsp 32 + +STACK CFI 3edf .cfa: $rsp 24 + +STACK CFI 3ee0 .cfa: $rsp 16 + +STACK CFI 3ee2 .cfa: $rsp 8 + +STACK CFI 3ee3 .cfa: $rsp 160 + +STACK CFI INIT 3fb0 85 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3fb1 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 3fb5 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 3fb9 .cfa: $rsp 32 + +STACK CFI 4010 .cfa: $rsp 24 + +STACK CFI 4014 .cfa: $rsp 16 + +STACK CFI 4015 .cfa: $rsp 8 + +STACK CFI 4016 .cfa: $rsp 32 + +STACK CFI INIT 4040 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4047 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 4062 .cfa: $rsp 8 + +STACK CFI 4068 .cfa: $rsp 16 + +STACK CFI 4077 .cfa: $rsp 8 + +STACK CFI INIT 1c44 27 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1c45 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 1c6a .cfa: $rsp 8 + +STACK CFI INIT 4080 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 408e $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ .cfa: $rsp 32 + +STACK CFI 40b5 .cfa: $rsp 8 + +STACK CFI 40c0 .cfa: $rsp 32 + +STACK CFI INIT 1c6c 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1c74 .cfa: $rsp 16 + +STACK CFI INIT 1c8c 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1c94 .cfa: $rsp 16 + +STACK CFI INIT 40e0 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 40f9 .cfa: $rsp 16 + +STACK CFI INIT 1cac 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1cb4 .cfa: $rsp 16 + +STACK CFI INIT 1ccc 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1cd4 .cfa: $rsp 16 + +STACK CFI INIT 7d00 153 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7d12 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 7d2d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 64 + +STACK CFI 7d77 $r12: $r12 $r13: $r13 $r14: $r14 $r15: $r15 $rbp: $rbp $rbx: $rbx .cfa: $rsp 8 + +STACK CFI 7d80 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 64 + +STACK CFI 7e50 $r12: $r12 $r13: $r13 $r14: $r14 $r15: $r15 $rbp: $rbp $rbx: $rbx .cfa: $rsp 8 + +STACK CFI INIT 1cec 1ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1cee $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 1cf5 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 1cf7 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 1cf9 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 1d00 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 1d01 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 1d05 .cfa: $rsp 112 + +STACK CFI 1e8d .cfa: $rsp 56 + +STACK CFI 1e8e .cfa: $rsp 48 + +STACK CFI 1e8f .cfa: $rsp 40 + +STACK CFI 1e91 .cfa: $rsp 32 + +STACK CFI 1e93 .cfa: $rsp 24 + +STACK CFI 1e95 .cfa: $rsp 16 + +STACK CFI 1e97 .cfa: $rsp 8 + +STACK CFI INIT 1e98 3f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1e99 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 1e9d $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 1ea7 .cfa: $rsp 288 + +STACK CFI 1ed2 .cfa: $rsp 24 + +STACK CFI 1ed5 .cfa: $rsp 16 + +STACK CFI 1ed6 .cfa: $rsp 8 + +STACK CFI INIT 7e60 248 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e62 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 7e64 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 7e6a $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 7e6c $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 7e6d $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 7e71 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 7e78 .cfa: $rsp 64 + +STACK CFI 7fd6 .cfa: $rsp 56 + +STACK CFI 7fd7 .cfa: $rsp 48 + +STACK CFI 7fd8 .cfa: $rsp 40 + +STACK CFI 7fda .cfa: $rsp 32 + +STACK CFI 7fdc .cfa: $rsp 24 + +STACK CFI 7fde .cfa: $rsp 16 + +STACK CFI 7fe5 .cfa: $rsp 8 + +STACK CFI 7ff0 .cfa: $rsp 64 + +STACK CFI 8052 .cfa: $rsp 56 + +STACK CFI 8055 .cfa: $rsp 48 + +STACK CFI 8056 .cfa: $rsp 40 + +STACK CFI 8058 .cfa: $rsp 32 + +STACK CFI 805a .cfa: $rsp 24 + +STACK CFI 805c .cfa: $rsp 16 + +STACK CFI 805e .cfa: $rsp 8 + +STACK CFI 805f .cfa: $rsp 64 + +STACK CFI INIT 80b0 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 80e0 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8110 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8140 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8170 229 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 818e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 819f $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI 81e1 .cfa: $rsp 8 + +STACK CFI 81e8 .cfa: $rsp 128 + +STACK CFI INIT 83a0 357 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 83a5 $rbp: .cfa -48 + ^ +STACK CFI 83b7 $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI 83c8 $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI 8447 .cfa: $rsp 8 + +STACK CFI 8450 .cfa: $rsp 128 + +STACK CFI INIT 4100 15e5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4102 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 4104 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 4106 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 410c $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 410d $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 410e $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 4118 .cfa: $rsp 3696 + +STACK CFI 4339 .cfa: $rsp 56 + +STACK CFI 433c .cfa: $rsp 48 + +STACK CFI 433d .cfa: $rsp 40 + +STACK CFI 433f .cfa: $rsp 32 + +STACK CFI 4341 .cfa: $rsp 24 + +STACK CFI 4343 .cfa: $rsp 16 + +STACK CFI 4345 .cfa: $rsp 8 + +STACK CFI 4350 .cfa: $rsp 3696 + +STACK CFI INIT 8700 17f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8702 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 8706 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 8708 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 870a $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 870b $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 870f $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 8716 .cfa: $rsp 96 + +STACK CFI 877b .cfa: $rsp 56 + +STACK CFI 877c .cfa: $rsp 48 + +STACK CFI 877d .cfa: $rsp 40 + +STACK CFI 877f .cfa: $rsp 32 + +STACK CFI 8781 .cfa: $rsp 24 + +STACK CFI 8783 .cfa: $rsp 16 + +STACK CFI 8785 .cfa: $rsp 8 + +STACK CFI 8790 .cfa: $rsp 96 + +STACK CFI INIT 8880 3cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8882 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 8884 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 8886 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 8888 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 8889 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 888d $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 8891 .cfa: $rsp 128 + +STACK CFI 8a9d .cfa: $rsp 56 + +STACK CFI 8a9e .cfa: $rsp 48 + +STACK CFI 8a9f .cfa: $rsp 40 + +STACK CFI 8aa1 .cfa: $rsp 32 + +STACK CFI 8aa3 .cfa: $rsp 24 + +STACK CFI 8aa5 .cfa: $rsp 16 + +STACK CFI 8aa7 .cfa: $rsp 8 + +STACK CFI 8ab0 .cfa: $rsp 128 + +STACK CFI 8b19 .cfa: $rsp 56 + +STACK CFI 8b21 .cfa: $rsp 48 + +STACK CFI 8b22 .cfa: $rsp 40 + +STACK CFI 8b24 .cfa: $rsp 32 + +STACK CFI 8b26 .cfa: $rsp 24 + +STACK CFI 8b28 .cfa: $rsp 16 + +STACK CFI 8b2a .cfa: $rsp 8 + +STACK CFI 8b30 .cfa: $rsp 128 + +STACK CFI INIT 56f0 1d12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 56f2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 56fd $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 5702 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 5704 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 5705 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 5706 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 570d .cfa: $rsp 2832 + +STACK CFI 5842 .cfa: $rsp 56 + +STACK CFI 5845 .cfa: $rsp 48 + +STACK CFI 5846 .cfa: $rsp 40 + +STACK CFI 5848 .cfa: $rsp 32 + +STACK CFI 584a .cfa: $rsp 24 + +STACK CFI 584c .cfa: $rsp 16 + +STACK CFI 584e .cfa: $rsp 8 + +STACK CFI 5850 .cfa: $rsp 2832 + +STACK CFI INIT 7410 1ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7412 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 7416 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 741a $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 7421 .cfa: $rsp 160 + +STACK CFI 7505 .cfa: $rsp 32 + +STACK CFI 7508 .cfa: $rsp 24 + +STACK CFI 7509 .cfa: $rsp 16 + +STACK CFI 750b .cfa: $rsp 8 + +STACK CFI 7510 .cfa: $rsp 160 + +STACK CFI INIT 75c0 2ce .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 75ca $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI 75eb $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ .cfa: $rsp 368 + +STACK CFI 7670 .cfa: $rsp 8 + +STACK CFI 7678 .cfa: $rsp 368 + +STACK CFI INIT 7890 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7894 .cfa: $rsp 32 + +STACK CFI 78ba .cfa: $rsp 8 + +STACK CFI INIT 78c0 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 78c4 .cfa: $rsp 32 + +STACK CFI 78eb .cfa: $rsp 8 + +STACK CFI INIT 78f0 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 78f4 .cfa: $rsp 32 + +STACK CFI 7919 .cfa: $rsp 8 + +STACK CFI INIT 7920 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7924 .cfa: $rsp 32 + +STACK CFI 794a .cfa: $rsp 8 + +STACK CFI INIT 7950 9a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7966 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ .cfa: $rsp 96 + +STACK CFI 79ce .cfa: $rsp 8 + +STACK CFI 79cf .cfa: $rsp 96 + +STACK CFI INIT 79f0 9b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7a06 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ .cfa: $rsp 96 + +STACK CFI 7a6f .cfa: $rsp 8 + +STACK CFI 7a70 .cfa: $rsp 96 + +STACK CFI INIT 7a90 26a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7a92 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 7a96 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 7a97 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 7aa0 .cfa: $rsp 368 + +STACK CFI 7c0a .cfa: $rsp 32 + +STACK CFI 7c0d .cfa: $rsp 24 + +STACK CFI 7c0e .cfa: $rsp 16 + +STACK CFI 7c10 .cfa: $rsp 8 + +STACK CFI 7c18 .cfa: $rsp 368 + +STACK CFI INIT 1ed8 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1ee0 .cfa: $rsp 16 + +STACK CFI INIT 1ef8 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f00 .cfa: $rsp 16 + +STACK CFI INIT 8c50 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8c70 87 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8c7e $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ .cfa: $rsp 32 + +STACK CFI 8cc5 .cfa: $rsp 8 + +STACK CFI 8cd0 .cfa: $rsp 32 + +STACK CFI INIT 8d00 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8d14 .cfa: $rsp 16 + +STACK CFI INIT 8d30 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8d3a $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 8d46 $r12: .cfa -16 + ^ .cfa: $rsp 32 + +STACK CFI 8d9b .cfa: $rsp 8 + +STACK CFI 8da0 .cfa: $rsp 32 + +STACK CFI INIT 8db0 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8dd0 d6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8de8 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ .cfa: $rsp 48 + +STACK CFI 8e33 .cfa: $rsp 8 + +STACK CFI 8e38 .cfa: $rsp 48 + +STACK CFI INIT 8eb0 fa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8eb1 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 8eb5 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 8eb9 .cfa: $rsp 32 + +STACK CFI 8eeb .cfa: $rsp 24 + +STACK CFI 8eec .cfa: $rsp 16 + +STACK CFI 8eed .cfa: $rsp 8 + +STACK CFI 8ef0 .cfa: $rsp 32 + +STACK CFI INIT 8fb0 a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8fb2 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 8fb4 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 8fb6 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 8fb7 $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 8fba $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 8fbe .cfa: $rsp 64 + +STACK CFI 9043 .cfa: $rsp 48 + +STACK CFI 9044 .cfa: $rsp 40 + +STACK CFI 9045 .cfa: $rsp 32 + +STACK CFI 9047 .cfa: $rsp 24 + +STACK CFI 9049 .cfa: $rsp 16 + +STACK CFI 904b .cfa: $rsp 8 + +STACK CFI 904c .cfa: $rsp 64 + +STACK CFI INIT 9060 aa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9062 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9064 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9066 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 9067 $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 9068 $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 906e .cfa: $rsp 64 + +STACK CFI 90f5 .cfa: $rsp 48 + +STACK CFI 90f6 .cfa: $rsp 40 + +STACK CFI 90f7 .cfa: $rsp 32 + +STACK CFI 90f9 .cfa: $rsp 24 + +STACK CFI 90fb .cfa: $rsp 16 + +STACK CFI 90fd .cfa: $rsp 8 + +STACK CFI 90fe .cfa: $rsp 64 + +STACK CFI INIT 9110 41 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9111 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9131 .cfa: $rsp 8 + +STACK CFI 9132 .cfa: $rsp 16 + +STACK CFI INIT 9160 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9164 .cfa: $rsp 16 + +STACK CFI 9187 .cfa: $rsp 8 + +STACK CFI 918c .cfa: $rsp 16 + +STACK CFI INIT 91f0 c4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 91f1 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 91f5 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 91f9 .cfa: $rsp 64 + +STACK CFI 9231 .cfa: $rsp 24 + +STACK CFI 9234 .cfa: $rsp 16 + +STACK CFI 9235 .cfa: $rsp 8 + +STACK CFI 9240 .cfa: $rsp 64 + +STACK CFI 926e .cfa: $rsp 24 + +STACK CFI 9274 .cfa: $rsp 16 + +STACK CFI 9275 .cfa: $rsp 8 + +STACK CFI 9276 .cfa: $rsp 64 + +STACK CFI INIT 92e0 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9310 1e8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9312 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9314 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9316 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 931a $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 931b $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 931f .cfa: $rsp 112 + +STACK CFI 93d3 .cfa: $rsp 48 + +STACK CFI 93d6 .cfa: $rsp 40 + +STACK CFI 93d7 .cfa: $rsp 32 + +STACK CFI 93d9 .cfa: $rsp 24 + +STACK CFI 93db .cfa: $rsp 16 + +STACK CFI 93dd .cfa: $rsp 8 + +STACK CFI 93e0 .cfa: $rsp 112 + +STACK CFI INIT 92c0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9500 1e8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9502 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9504 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9506 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 950a $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 950b $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 950f .cfa: $rsp 112 + +STACK CFI 95c4 .cfa: $rsp 48 + +STACK CFI 95c7 .cfa: $rsp 40 + +STACK CFI 95c8 .cfa: $rsp 32 + +STACK CFI 95ca .cfa: $rsp 24 + +STACK CFI 95cc .cfa: $rsp 16 + +STACK CFI 95ce .cfa: $rsp 8 + +STACK CFI 95d0 .cfa: $rsp 112 + +STACK CFI INIT 92d0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 96f0 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 96f2 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 96fa $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 96ff $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 9703 $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 970b .cfa: $rsp 64 + +STACK CFI 974b .cfa: $rsp 40 + +STACK CFI 974e .cfa: $rsp 32 + +STACK CFI 974f .cfa: $rsp 24 + +STACK CFI 9751 .cfa: $rsp 16 + +STACK CFI 9753 .cfa: $rsp 8 + +STACK CFI 9758 .cfa: $rsp 64 + +STACK CFI 975f .cfa: $rsp 40 + +STACK CFI 9760 .cfa: $rsp 32 + +STACK CFI 9763 .cfa: $rsp 24 + +STACK CFI 9765 .cfa: $rsp 16 + +STACK CFI 9767 .cfa: $rsp 8 + +STACK CFI INIT 9770 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9771 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 977f .cfa: $rsp 48 + +STACK CFI 97c4 .cfa: $rsp 16 + +STACK CFI 97c5 .cfa: $rsp 8 + +STACK CFI INIT 97d0 147 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 97d2 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 97d4 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 97d6 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 97da $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 97de $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 97e2 .cfa: $rsp 80 + +STACK CFI 9863 .cfa: $rsp 48 + +STACK CFI 9867 .cfa: $rsp 40 + +STACK CFI 9868 .cfa: $rsp 32 + +STACK CFI 986a .cfa: $rsp 24 + +STACK CFI 986c .cfa: $rsp 16 + +STACK CFI 986e .cfa: $rsp 8 + +STACK CFI 9870 .cfa: $rsp 80 + +STACK CFI INIT 9b00 295 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9b0a $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI 9b25 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ .cfa: $rsp 80 + +STACK CFI 9bd6 .cfa: $rsp 8 + +STACK CFI 9be0 .cfa: $rsp 80 + +STACK CFI INIT 9920 e3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9921 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9925 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 992c .cfa: $rsp 64 + +STACK CFI 99c5 .cfa: $rsp 24 + +STACK CFI 99c6 .cfa: $rsp 16 + +STACK CFI 99c7 .cfa: $rsp 8 + +STACK CFI 99d0 .cfa: $rsp 64 + +STACK CFI 99e4 .cfa: $rsp 24 + +STACK CFI 99e5 .cfa: $rsp 16 + +STACK CFI 99e6 .cfa: $rsp 8 + +STACK CFI 99f0 .cfa: $rsp 64 + +STACK CFI INIT 9a10 e3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9a11 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9a15 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9a1c .cfa: $rsp 64 + +STACK CFI 9ab7 .cfa: $rsp 24 + +STACK CFI 9ab8 .cfa: $rsp 16 + +STACK CFI 9ab9 .cfa: $rsp 8 + +STACK CFI 9ac0 .cfa: $rsp 64 + +STACK CFI 9ad4 .cfa: $rsp 24 + +STACK CFI 9ad5 .cfa: $rsp 16 + +STACK CFI 9ad6 .cfa: $rsp 8 + +STACK CFI 9ae0 .cfa: $rsp 64 + +STACK CFI INIT 9ed0 16 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9ed4 .cfa: $rsp 16 + +STACK CFI 9edf .cfa: $rsp 8 + +STACK CFI INIT 9da0 73 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9da1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9e12 .cfa: $rsp 8 + +STACK CFI INIT 9e20 ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9e21 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9e25 .cfa: $rsp 32 + +STACK CFI 9eaa .cfa: $rsp 16 + +STACK CFI 9ead .cfa: $rsp 8 + +STACK CFI 9eae .cfa: $rsp 32 + +STACK CFI INIT 9ef0 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9f10 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9f50 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9fb0 54 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a010 36 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a050 43 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a0a0 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a0f0 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a120 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a160 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a1d0 3a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a210 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a230 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a270 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a271 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a28d .cfa: $rsp 8 + +STACK CFI a290 .cfa: $rsp 16 + +STACK CFI a2ad .cfa: $rsp 8 + +STACK CFI INIT a2b0 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a300 1aa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a302 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a311 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI a319 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI a31f $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI a320 $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI a327 .cfa: $rsp 208 + +STACK CFI a443 .cfa: $rsp 48 + +STACK CFI a449 .cfa: $rsp 40 + +STACK CFI a44a .cfa: $rsp 32 + +STACK CFI a44c .cfa: $rsp 24 + +STACK CFI a44e .cfa: $rsp 16 + +STACK CFI a450 .cfa: $rsp 8 + +STACK CFI a458 .cfa: $rsp 208 + +STACK CFI a49f .cfa: $rsp 48 + +STACK CFI a4a2 .cfa: $rsp 40 + +STACK CFI a4a3 .cfa: $rsp 32 + +STACK CFI a4a5 .cfa: $rsp 24 + +STACK CFI a4a7 .cfa: $rsp 16 + +STACK CFI a4a9 .cfa: $rsp 8 + +STACK CFI INIT a4b0 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a4b3 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a4c4 .cfa: $rsp 8 + +STACK CFI a4c8 .cfa: $rsp 16 + +STACK CFI a4cb .cfa: $rsp 8 + +STACK CFI INIT 1f18 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1f20 .cfa: $rsp 16 + +STACK CFI INIT a4d0 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a4d2 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a4d8 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI a4df $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI a4e0 $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI a4e4 .cfa: $rsp 48 + +STACK CFI a530 .cfa: $rsp 40 + +STACK CFI a531 .cfa: $rsp 32 + +STACK CFI a532 .cfa: $rsp 24 + +STACK CFI a534 .cfa: $rsp 16 + +STACK CFI a536 .cfa: $rsp 8 + +STACK CFI INIT a540 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a541 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a54d .cfa: $rsp 8 + +STACK CFI INIT a560 105 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a562 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a56d $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI a56e $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI a575 .cfa: $rsp 320 + +STACK CFI a593 .cfa: $rsp 32 + +STACK CFI a596 .cfa: $rsp 24 + +STACK CFI a597 .cfa: $rsp 16 + +STACK CFI a599 .cfa: $rsp 8 + +STACK CFI a5a0 .cfa: $rsp 320 + +STACK CFI a618 .cfa: $rsp 32 + +STACK CFI a61b .cfa: $rsp 24 + +STACK CFI a61c .cfa: $rsp 16 + +STACK CFI a61e .cfa: $rsp 8 + +STACK CFI a620 .cfa: $rsp 320 + +STACK CFI INIT a670 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a671 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a680 .cfa: $rsp 8 + +STACK CFI a688 .cfa: $rsp 16 + +STACK CFI a69c .cfa: $rsp 8 + +STACK CFI INIT a6b0 4c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a700 94 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a70a $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI a717 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI a723 $r14: .cfa -16 + ^ .cfa: $rsp 48 + +STACK CFI a78c .cfa: $rsp 8 + +STACK CFI a790 .cfa: $rsp 48 + +STACK CFI INIT a7a0 1fd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7aa $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI a7c1 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ .cfa: $rsp 848 + +STACK CFI a7f8 .cfa: $rsp 8 + +STACK CFI a800 .cfa: $rsp 848 + +STACK CFI INIT a9a0 35d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a9aa $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI a9cb $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 368 + +STACK CFI aa56 .cfa: $rsp 8 + +STACK CFI aa60 .cfa: $rsp 368 + +STACK CFI INIT b670 221 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b68e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI b69f $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI b6e1 .cfa: $rsp 8 + +STACK CFI b6e8 .cfa: $rsp 128 + +STACK CFI INIT b8a0 229 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b8be $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI b8cf $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI b911 .cfa: $rsp 8 + +STACK CFI b918 .cfa: $rsp 128 + +STACK CFI INIT bad0 229 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI baee $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI baff $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI bb41 .cfa: $rsp 8 + +STACK CFI bb48 .cfa: $rsp 128 + +STACK CFI INIT bd00 320 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bd0a $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI bd28 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI bd95 .cfa: $rsp 8 + +STACK CFI bda0 .cfa: $rsp 128 + +STACK CFI INIT c020 460 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c022 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI c024 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI c026 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI c028 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI c029 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI c02d $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI c031 .cfa: $rsp 128 + +STACK CFI c0d8 .cfa: $rsp 56 + +STACK CFI c0d9 .cfa: $rsp 48 + +STACK CFI c0da .cfa: $rsp 40 + +STACK CFI c0dc .cfa: $rsp 32 + +STACK CFI c0de .cfa: $rsp 24 + +STACK CFI c0e0 .cfa: $rsp 16 + +STACK CFI c0e2 .cfa: $rsp 8 + +STACK CFI c0e8 .cfa: $rsp 128 + +STACK CFI c168 .cfa: $rsp 56 + +STACK CFI c169 .cfa: $rsp 48 + +STACK CFI c16a .cfa: $rsp 40 + +STACK CFI c16c .cfa: $rsp 32 + +STACK CFI c16e .cfa: $rsp 24 + +STACK CFI c170 .cfa: $rsp 16 + +STACK CFI c172 .cfa: $rsp 8 + +STACK CFI c178 .cfa: $rsp 128 + +STACK CFI c368 .cfa: $rsp 56 + +STACK CFI c369 .cfa: $rsp 48 + +STACK CFI c36a .cfa: $rsp 40 + +STACK CFI c36c .cfa: $rsp 32 + +STACK CFI c36e .cfa: $rsp 24 + +STACK CFI c370 .cfa: $rsp 16 + +STACK CFI c372 .cfa: $rsp 8 + +STACK CFI c378 .cfa: $rsp 128 + +STACK CFI INIT ad00 1a9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ad0a $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI ad24 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ .cfa: $rsp 64 + +STACK CFI ae4e .cfa: $rsp 8 + +STACK CFI ae50 .cfa: $rsp 64 + +STACK CFI INIT c480 43f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c482 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI c484 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI c486 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI c488 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI c48c $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI c48d $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI c491 .cfa: $rsp 128 + +STACK CFI c550 .cfa: $rsp 56 + +STACK CFI c551 .cfa: $rsp 48 + +STACK CFI c552 .cfa: $rsp 40 + +STACK CFI c554 .cfa: $rsp 32 + +STACK CFI c556 .cfa: $rsp 24 + +STACK CFI c558 .cfa: $rsp 16 + +STACK CFI c55a .cfa: $rsp 8 + +STACK CFI c560 .cfa: $rsp 128 + +STACK CFI c5d0 .cfa: $rsp 56 + +STACK CFI c5d1 .cfa: $rsp 48 + +STACK CFI c5d2 .cfa: $rsp 40 + +STACK CFI c5d4 .cfa: $rsp 32 + +STACK CFI c5d6 .cfa: $rsp 24 + +STACK CFI c5d8 .cfa: $rsp 16 + +STACK CFI c5da .cfa: $rsp 8 + +STACK CFI c5e0 .cfa: $rsp 128 + +STACK CFI c79d .cfa: $rsp 56 + +STACK CFI c79e .cfa: $rsp 48 + +STACK CFI c79f .cfa: $rsp 40 + +STACK CFI c7a1 .cfa: $rsp 32 + +STACK CFI c7a3 .cfa: $rsp 24 + +STACK CFI c7a5 .cfa: $rsp 16 + +STACK CFI c7a7 .cfa: $rsp 8 + +STACK CFI c7b0 .cfa: $rsp 128 + +STACK CFI INIT aeb0 7b2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aeb2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI aebe $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI aec0 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI aec2 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI aec3 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI aec4 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI aecb .cfa: $rsp 464 + +STACK CFI aeec .cfa: $rsp 56 + +STACK CFI aeed .cfa: $rsp 48 + +STACK CFI aeee .cfa: $rsp 40 + +STACK CFI aef0 .cfa: $rsp 32 + +STACK CFI aef2 .cfa: $rsp 24 + +STACK CFI aef4 .cfa: $rsp 16 + +STACK CFI aef6 .cfa: $rsp 8 + +STACK CFI aef7 .cfa: $rsp 464 + +STACK CFI INIT c8c0 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT d5a0 13 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT c8d0 d8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c8e6 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI c8f7 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 64 + +STACK CFI c940 .cfa: $rsp 8 + +STACK CFI c948 .cfa: $rsp 64 + +STACK CFI INIT c9b0 ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c9b2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI c9b7 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI c9b9 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI c9bb $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI c9bc $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI c9bd $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI c9c1 .cfa: $rsp 96 + +STACK CFI ca34 .cfa: $rsp 56 + +STACK CFI ca35 .cfa: $rsp 48 + +STACK CFI ca36 .cfa: $rsp 40 + +STACK CFI ca38 .cfa: $rsp 32 + +STACK CFI ca3a .cfa: $rsp 24 + +STACK CFI ca3c .cfa: $rsp 16 + +STACK CFI ca3e .cfa: $rsp 8 + +STACK CFI ca40 .cfa: $rsp 96 + +STACK CFI INIT ca60 c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ca62 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI ca67 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI ca68 $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI ca6c $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI ca70 .cfa: $rsp 64 + +STACK CFI caef .cfa: $rsp 40 + +STACK CFI caf3 .cfa: $rsp 32 + +STACK CFI caf4 .cfa: $rsp 24 + +STACK CFI caf6 .cfa: $rsp 16 + +STACK CFI caf8 .cfa: $rsp 8 + +STACK CFI cb00 .cfa: $rsp 64 + +STACK CFI INIT d5c0 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d5c8 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI d5db .cfa: $rsp 8 + +STACK CFI INIT cb30 49f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cb32 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI cb34 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI cb36 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI cb38 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI cb3c $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI cb3d $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI cb47 .cfa: $rsp 336 + +STACK CFI cb8f .cfa: $rsp 56 + +STACK CFI cb90 .cfa: $rsp 48 + +STACK CFI cb91 .cfa: $rsp 40 + +STACK CFI cb93 .cfa: $rsp 32 + +STACK CFI cb95 .cfa: $rsp 24 + +STACK CFI cb97 .cfa: $rsp 16 + +STACK CFI cb99 .cfa: $rsp 8 + +STACK CFI cb9a .cfa: $rsp 336 + +STACK CFI INIT cfd0 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cfd1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI cfef .cfa: $rsp 8 + +STACK CFI INIT d5e0 306 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d5e5 $rbx: .cfa -56 + ^ +STACK CFI d5f7 $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI d608 $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI d66e .cfa: $rsp 8 + +STACK CFI d670 .cfa: $rsp 128 + +STACK CFI INIT cff0 36d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cffa $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI d01f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 352 + +STACK CFI d06d .cfa: $rsp 8 + +STACK CFI d070 .cfa: $rsp 352 + +STACK CFI INIT d8f0 458 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8f2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI d8f4 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI d8f6 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI d8f8 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI d8f9 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI d8fd $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI d901 .cfa: $rsp 128 + +STACK CFI d9a8 .cfa: $rsp 56 + +STACK CFI d9a9 .cfa: $rsp 48 + +STACK CFI d9aa .cfa: $rsp 40 + +STACK CFI d9ac .cfa: $rsp 32 + +STACK CFI d9ae .cfa: $rsp 24 + +STACK CFI d9b0 .cfa: $rsp 16 + +STACK CFI d9b2 .cfa: $rsp 8 + +STACK CFI d9b8 .cfa: $rsp 128 + +STACK CFI da30 .cfa: $rsp 56 + +STACK CFI da31 .cfa: $rsp 48 + +STACK CFI da32 .cfa: $rsp 40 + +STACK CFI da34 .cfa: $rsp 32 + +STACK CFI da36 .cfa: $rsp 24 + +STACK CFI da38 .cfa: $rsp 16 + +STACK CFI da3a .cfa: $rsp 8 + +STACK CFI da40 .cfa: $rsp 128 + +STACK CFI dc2e .cfa: $rsp 56 + +STACK CFI dc2f .cfa: $rsp 48 + +STACK CFI dc30 .cfa: $rsp 40 + +STACK CFI dc32 .cfa: $rsp 32 + +STACK CFI dc34 .cfa: $rsp 24 + +STACK CFI dc36 .cfa: $rsp 16 + +STACK CFI dc38 .cfa: $rsp 8 + +STACK CFI dc40 .cfa: $rsp 128 + +STACK CFI INIT d360 235 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d362 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI d369 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI d36b $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI d36d $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI d371 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI d372 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI d379 .cfa: $rsp 320 + +STACK CFI d4f4 .cfa: $rsp 56 + +STACK CFI d4f5 .cfa: $rsp 48 + +STACK CFI d4f6 .cfa: $rsp 40 + +STACK CFI d4f8 .cfa: $rsp 32 + +STACK CFI d4fa .cfa: $rsp 24 + +STACK CFI d4fc .cfa: $rsp 16 + +STACK CFI d4fe .cfa: $rsp 8 + +STACK CFI d500 .cfa: $rsp 320 + +STACK CFI INIT dd50 e3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT de40 fe .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de44 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI de48 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI dec7 .cfa: $rsp 16 + +STACK CFI dec8 .cfa: $rsp 8 + +STACK CFI ded0 .cfa: $rsp 24 + +STACK CFI df2b .cfa: $rsp 16 + +STACK CFI df2c .cfa: $rsp 8 + +STACK CFI df2d .cfa: $rsp 24 + +STACK CFI INIT df40 e6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI df51 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI df52 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI df53 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI dfc8 $rbx: $rbx .cfa: $rsp 24 + +STACK CFI dfc9 $rbp: $rbp .cfa: $rsp 16 + +STACK CFI dfd6 $r12: $r12 .cfa: $rsp 8 + +STACK CFI dfe0 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI dfeb $rbx: $rbx .cfa: $rsp 24 + +STACK CFI dfec $rbp: $rbp .cfa: $rsp 16 + +STACK CFI dff9 $r12: $r12 .cfa: $rsp 8 + +STACK CFI e000 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e001 $rbx: $rbx .cfa: $rsp 24 + +STACK CFI e002 $rbp: $rbp .cfa: $rsp 16 + +STACK CFI e00c $r12: $r12 .cfa: $rsp 8 + +STACK CFI e00d $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e00e $rbx: $rbx .cfa: $rsp 24 + +STACK CFI e00f $rbp: $rbp .cfa: $rsp 16 + +STACK CFI e01c $r12: $r12 .cfa: $rsp 8 + +STACK CFI INIT e030 216 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e032 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e037 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e03b $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e03f $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI e0d6 .cfa: $rsp 32 + +STACK CFI e0e2 .cfa: $rsp 24 + +STACK CFI e0e4 .cfa: $rsp 16 + +STACK CFI e0e6 .cfa: $rsp 8 + +STACK CFI e0f0 .cfa: $rsp 40 + +STACK CFI e1db .cfa: $rsp 32 + +STACK CFI e1e4 .cfa: $rsp 24 + +STACK CFI e1e6 .cfa: $rsp 16 + +STACK CFI e1e8 .cfa: $rsp 8 + +STACK CFI e1f0 .cfa: $rsp 40 + +STACK CFI e1fb .cfa: $rsp 32 + +STACK CFI e207 .cfa: $rsp 24 + +STACK CFI e209 .cfa: $rsp 16 + +STACK CFI e20b .cfa: $rsp 8 + +STACK CFI e20c .cfa: $rsp 40 + +STACK CFI e214 .cfa: $rsp 32 + +STACK CFI e223 .cfa: $rsp 24 + +STACK CFI e225 .cfa: $rsp 16 + +STACK CFI e227 .cfa: $rsp 8 + +STACK CFI e228 .cfa: $rsp 40 + +STACK CFI INIT e250 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e280 265 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e282 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e284 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e286 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e288 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI e289 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI e28a $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI e28e .cfa: $rsp 96 + +STACK CFI e3e3 .cfa: $rsp 56 + +STACK CFI e3e4 .cfa: $rsp 48 + +STACK CFI e3e5 .cfa: $rsp 40 + +STACK CFI e3e7 .cfa: $rsp 32 + +STACK CFI e3e9 .cfa: $rsp 24 + +STACK CFI e3eb .cfa: $rsp 16 + +STACK CFI e3ed .cfa: $rsp 8 + +STACK CFI e3f0 .cfa: $rsp 96 + +STACK CFI INIT e4f0 1c0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e4f2 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e4f9 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e4fe $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e4ff $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI e503 $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI e638 .cfa: $rsp 40 + +STACK CFI e63f .cfa: $rsp 32 + +STACK CFI e641 .cfa: $rsp 24 + +STACK CFI e643 .cfa: $rsp 16 + +STACK CFI e645 .cfa: $rsp 8 + +STACK CFI e650 .cfa: $rsp 48 + +STACK CFI e661 .cfa: $rsp 40 + +STACK CFI e66d .cfa: $rsp 32 + +STACK CFI e66f .cfa: $rsp 24 + +STACK CFI e671 .cfa: $rsp 16 + +STACK CFI e673 .cfa: $rsp 8 + +STACK CFI e674 .cfa: $rsp 48 + +STACK CFI e67c .cfa: $rsp 40 + +STACK CFI e68b .cfa: $rsp 32 + +STACK CFI e68d .cfa: $rsp 24 + +STACK CFI e68f .cfa: $rsp 16 + +STACK CFI e691 .cfa: $rsp 8 + +STACK CFI e692 .cfa: $rsp 48 + +STACK CFI INIT e6b0 29f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e6b2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e6b4 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e6b6 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e6b8 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI e6b9 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI e6ba $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI e6be .cfa: $rsp 104 + +STACK CFI e85e .cfa: $rsp 56 + +STACK CFI e85f .cfa: $rsp 48 + +STACK CFI e860 .cfa: $rsp 40 + +STACK CFI e862 .cfa: $rsp 32 + +STACK CFI e864 .cfa: $rsp 24 + +STACK CFI e866 .cfa: $rsp 16 + +STACK CFI e868 .cfa: $rsp 8 + +STACK CFI e870 .cfa: $rsp 104 + +STACK CFI INIT e950 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e960 1ee .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e962 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e966 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e967 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e973 .cfa: $rsp 48 + +STACK CFI ea4b .cfa: $rsp 32 + +STACK CFI ea4c .cfa: $rsp 24 + +STACK CFI ea4d .cfa: $rsp 16 + +STACK CFI ea4f .cfa: $rsp 8 + +STACK CFI ea50 .cfa: $rsp 48 + +STACK CFI INIT eb50 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eb51 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI eb5b .cfa: $rsp 48 + +STACK CFI eb8e .cfa: $rsp 16 + +STACK CFI eb8f .cfa: $rsp 8 + +STACK CFI eb90 .cfa: $rsp 48 + +STACK CFI INIT ebb0 e5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ebb1 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI ebb2 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI ec7c .cfa: $rsp 16 + +STACK CFI ec81 .cfa: $rsp 8 + +STACK CFI ec82 .cfa: $rsp 24 + +STACK CFI ec8f .cfa: $rsp 16 + +STACK CFI ec94 .cfa: $rsp 8 + +STACK CFI INIT eca0 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ecb0 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ecba $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI ecc1 .cfa: $rsp 32 + +STACK CFI ed05 .cfa: $rsp 8 + +STACK CFI INIT ed10 193 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ed1a $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ed26 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI ed30 .cfa: $rsp 192 + +STACK CFI ed85 .cfa: $rsp 8 + +STACK CFI ed90 .cfa: $rsp 192 + +STACK CFI INIT eeb0 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT eed0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT eee0 3a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eee1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI eeff .cfa: $rsp 8 + +STACK CFI ef00 .cfa: $rsp 16 + +STACK CFI ef15 .cfa: $rsp 8 + +STACK CFI ef16 .cfa: $rsp 16 + +STACK CFI ef19 .cfa: $rsp 8 + +STACK CFI INIT ef20 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef2b .cfa: $rsp 16 + +STACK CFI ef3e .cfa: $rsp 8 + +STACK CFI INIT ef40 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ef50 466 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ef5a $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI ef75 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 112 + +STACK CFI efdc .cfa: $rsp 8 + +STACK CFI efe0 .cfa: $rsp 112 + +STACK CFI INIT f3c0 29c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f3ca $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI f3e0 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ .cfa: $rsp 48 + +STACK CFI f43b .cfa: $rsp 8 + +STACK CFI f440 .cfa: $rsp 48 + +STACK CFI INIT f660 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f670 89 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f681 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI f6a0 .cfa: $rsp 64 + +STACK CFI f6a6 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ diff --git a/src/processor/testdata/symbols/overflow/B0E1FC01EF48E39CAF5C881D2DF0C3840/overflow.sym b/src/processor/testdata/symbols/overflow/B0E1FC01EF48E39CAF5C881D2DF0C3840/overflow.sym new file mode 100644 index 0000000..8299b3f --- /dev/null +++ b/src/processor/testdata/symbols/overflow/B0E1FC01EF48E39CAF5C881D2DF0C3840/overflow.sym @@ -0,0 +1,6709 @@ +MODULE Linux x86_64 B0E1FC01EF48E39CAF5C881D2DF0C3840 overflow +FILE 0 /home/mattdr/exploitable-crashes/overflow.cc +FILE 1 /home/mattdr/google-breakpad-read-only/./src/client/linux/crash_generation/crash_generation_client.h +FILE 2 /home/mattdr/google-breakpad-read-only/./src/client/linux/handler/minidump_descriptor.h +FILE 3 /home/mattdr/google-breakpad-read-only/./src/client/linux/minidump_writer/directory_reader.h +FILE 4 /home/mattdr/google-breakpad-read-only/./src/client/linux/minidump_writer/line_reader.h +FILE 5 /home/mattdr/google-breakpad-read-only/./src/client/linux/minidump_writer/linux_dumper.h +FILE 6 /home/mattdr/google-breakpad-read-only/./src/client/linux/minidump_writer/linux_ptrace_dumper.h +FILE 7 /home/mattdr/google-breakpad-read-only/./src/client/linux/minidump_writer/proc_cpuinfo_reader.h +FILE 8 /home/mattdr/google-breakpad-read-only/./src/client/minidump_file_writer-inl.h +FILE 9 /home/mattdr/google-breakpad-read-only/./src/client/minidump_file_writer.h +FILE 10 /home/mattdr/google-breakpad-read-only/./src/common/linux/elfutils-inl.h +FILE 11 /home/mattdr/google-breakpad-read-only/./src/common/linux/safe_readlink.h +FILE 12 /home/mattdr/google-breakpad-read-only/./src/common/memory.h +FILE 13 /home/mattdr/google-breakpad-read-only/./src/common/memory_range.h +FILE 14 /home/mattdr/google-breakpad-read-only/./src/common/scoped_ptr.h +FILE 15 /home/mattdr/google-breakpad-read-only/./src/third_party/lss/linux_syscall_support.h +FILE 16 /home/mattdr/google-breakpad-read-only/src/client/linux/crash_generation/crash_generation_client.cc +FILE 17 /home/mattdr/google-breakpad-read-only/src/client/linux/handler/exception_handler.cc +FILE 18 /home/mattdr/google-breakpad-read-only/src/client/linux/handler/minidump_descriptor.cc +FILE 19 /home/mattdr/google-breakpad-read-only/src/client/linux/handler/minidump_descriptor.h +FILE 20 /home/mattdr/google-breakpad-read-only/src/client/linux/log/log.cc +FILE 21 /home/mattdr/google-breakpad-read-only/src/client/linux/minidump_writer/linux_dumper.cc +FILE 22 /home/mattdr/google-breakpad-read-only/src/client/linux/minidump_writer/linux_ptrace_dumper.cc +FILE 23 /home/mattdr/google-breakpad-read-only/src/client/linux/minidump_writer/minidump_writer.cc +FILE 24 /home/mattdr/google-breakpad-read-only/src/client/minidump_file_writer.cc +FILE 25 /home/mattdr/google-breakpad-read-only/src/common/convert_UTF.c +FILE 26 /home/mattdr/google-breakpad-read-only/src/common/linux/elfutils.cc +FILE 27 /home/mattdr/google-breakpad-read-only/src/common/linux/file_id.cc +FILE 28 /home/mattdr/google-breakpad-read-only/src/common/linux/guid_creator.cc +FILE 29 /home/mattdr/google-breakpad-read-only/src/common/linux/linux_libc_support.cc +FILE 30 /home/mattdr/google-breakpad-read-only/src/common/linux/memory_mapped_file.cc +FILE 31 /home/mattdr/google-breakpad-read-only/src/common/linux/safe_readlink.cc +FILE 32 /home/mattdr/google-breakpad-read-only/src/common/string_conversion.cc +FILE 33 /usr/include/c++/4.7/bits/basic_string.h +FILE 34 /usr/include/c++/4.7/bits/char_traits.h +FILE 35 /usr/include/c++/4.7/bits/list.tcc +FILE 36 /usr/include/c++/4.7/bits/shared_ptr_base.h +FILE 37 /usr/include/c++/4.7/bits/stl_algo.h +FILE 38 /usr/include/c++/4.7/bits/stl_algobase.h +FILE 39 /usr/include/c++/4.7/bits/stl_iterator.h +FILE 40 /usr/include/c++/4.7/bits/stl_iterator_base_funcs.h +FILE 41 /usr/include/c++/4.7/bits/stl_list.h +FILE 42 /usr/include/c++/4.7/bits/stl_uninitialized.h +FILE 43 /usr/include/c++/4.7/bits/stl_vector.h +FILE 44 /usr/include/c++/4.7/bits/vector.tcc +FILE 45 /usr/include/c++/4.7/ext/atomicity.h +FILE 46 /usr/include/c++/4.7/ext/new_allocator.h +FILE 47 /usr/include/c++/4.7/typeinfo +FILE 48 /usr/include/x86_64-linux-gnu/bits/stdio2.h +FILE 49 /usr/include/x86_64-linux-gnu/bits/string3.h +FUNC 1e20 1a 0 __gnu_cxx::__exchange_and_add_dispatch +1e20 a 80 45 +1e2a 8 48 45 +1e32 2 66 45 +1e34 5 67 45 +1e39 1 87 45 +FUNC 1e3a 1a 0 __gnu_cxx::__exchange_and_add_dispatch +1e3a a 80 45 +1e44 8 48 45 +1e4c 2 66 45 +1e4e 5 67 45 +1e53 1 87 45 +FUNC 1e54 27 0 sys_close +1e54 1 2629 15 +1e55 15 2629 15 +1e6a d 2629 15 +1e77 4 2629 15 +FUNC 1e7c 20 0 google_breakpad::ProcCpuInfoReader::GetValueAndLen(unsigned long*) +1e7c 7 116 7 +1e83 1 115 7 +1e84 18 116 7 +FUNC 1e9c 20 0 google_breakpad::TypedMDRVA::CopyIndex(unsigned int, MDRawDirectory*) +1e9c 7 73 8 +1ea3 1 72 8 +1ea4 18 73 8 +FUNC 1ebc 20 0 google_breakpad::TypedMDRVA::AllocateObjectAndArray(unsigned long, unsigned long) +1ebc 7 66 8 +1ec3 1 64 8 +1ec4 18 66 8 +FUNC 1edc 20 0 google_breakpad::TypedMDRVA::CopyIndexAfterObject(unsigned int, void const*, unsigned long) +1edc 7 83 8 +1ee3 1 80 8 +1ee4 18 83 8 +FUNC 1efc 1ac 0 MinidumpWriter::WriteFile +1efc 2 1505 23 +1efe 5 2711 15 +1f03 12 1505 23 +1f15 5 1505 23 +1f1a 1f 2711 15 +1f39 2 1507 23 +1f3b 3 2711 15 +1f3e 2 1507 23 +1f40 7 1508 23 +1f47 a 1166 23 +1f51 2 1522 23 +1f53 3 2724 15 +1f56 c 1166 23 +1f62 7 1519 23 +1f69 b 1520 23 +1f74 9 1526 23 +1f7d 5 2724 15 +1f82 8 1526 23 +1f8a d 2724 15 +1f97 f 2724 15 +1fa6 3 1525 23 +1fa9 2 2724 15 +1fab 4 1525 23 +1faf 5 1529 23 +1fb4 4 1533 23 +1fb8 3 1532 23 +1fbb 7 1534 23 +1fc2 4 1533 23 +1fc6 2 1534 23 +1fc8 13 1166 23 +1fdb 3 1535 23 +1fde b 1538 23 +1fe9 9 1537 23 +1ff2 8 1541 23 +1ffa 9 1543 23 +2003 5 1546 23 +2008 3 1547 23 +200b 9 161 9 +2014 5 1546 23 +2019 5 161 9 +201e 8 1547 23 +2026 4 161 9 +202a d 1547 23 +2037 4 1549 23 +203b 9 1554 23 +2044 26 1556 23 +206a e 1559 23 +2078 3 1560 23 +207b 9 1549 23 +2084 c 176 9 +2090 7 1562 23 +2097 2 1563 23 +2099 f 1564 23 +FUNC 20a8 3f 0 MinidumpWriter::WriteProcFile +20a8 f 1633 23 +20b7 e 1636 23 +20c5 2 1637 23 +20c7 4 1636 23 +20cb 10 1638 23 +20db c 1639 23 +FUNC 20e8 20 0 google_breakpad::TypedMDRVA::CopyIndexAfterObject(unsigned int, void const*, unsigned long) +20e8 7 83 8 +20ef 1 80 8 +20f0 18 83 8 +FUNC 2108 20 0 google_breakpad::TypedMDRVA::AllocateObjectAndArray(unsigned long, unsigned long) +2108 7 66 8 +210f 1 64 8 +2110 18 66 8 +FUNC 2128 20 0 google_breakpad::LineReader::PopLine(unsigned int) +2128 7 116 4 +212f 1 113 4 +2130 18 116 4 +FUNC 2150 279 0 main +2150 a 32 0 +215a 5 33 0 +215f 9 32 0 +2168 a 33 0 +2172 13 32 0 +2185 5 33 0 +218a 17 54 19 +21a1 5 713 33 +21a6 9 272 33 +21af 12 54 19 +21c1 b 55 19 +21cc a 33 0 +21d6 a 94 46 +21e0 3 110 46 +21e3 3 94 46 +21e6 2 110 46 +21e8 4 397 36 +21ec e 113 36 +21fa 11 397 36 +220b 4 399 36 +220f 15 110 46 +2224 4 399 36 +2228 c 110 46 +2234 e 601 36 +2242 f 42 0 +2251 4 44 0 +2255 a 42 0 +225f 2 44 0 +2261 13 45 0 +2274 11 46 0 +2285 15 105 48 +229a 5 557 36 +229f 5 80 45 +22a4 4 144 36 +22a8 9 80 45 +22b1 b 48 45 +22bc 5 144 36 +22c1 a 52 0 +22cb 23 53 0 +22ee a 45 0 +22f8 a 46 0 +2302 9 147 36 +230b 3 80 45 +230e 4 160 36 +2312 2 80 45 +2314 9 48 45 +231d 5 160 36 +2322 b 164 36 +232d 5 53 0 +2332 19 55 19 +234b 3 66 45 +234e b 67 45 +2359 3 66 45 +235c b 67 45 +2367 12 52 0 +2379 15 33 0 +238e 8 557 36 +2396 d 558 36 +23a3 7 117 36 +23aa 8 529 36 +23b2 8 100 46 +23ba 8 532 36 +23c2 7 529 36 +FUNC 24d0 2c 0 MinidumpCallback(google_breakpad::MinidumpDescriptor const&, void*, bool) +24d0 1 8 0 +24d1 2 8 0 +24d3 4 53 0 +24d7 10 11 0 +24e7 11 105 48 +24f8 4 13 0 +FUNC 2500 3e 0 overflow(char const*) +2500 4 17 0 +2504 3 17 0 +2507 8 105 49 +250f 10 17 0 +251f 5 105 49 +2524 1a 20 0 +FUNC 2540 49 0 stack_smash(char const*) +2540 4 24 0 +2544 3 27 0 +2547 10 24 0 +2557 9 27 0 +2560 7 28 0 +2567 8 27 0 +256f 1a 30 0 +FUNC 2590 12 0 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_destroy() +2590 5 127 36 +2595 d 127 36 +FUNC 25b0 8 0 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::~_Sp_counted_base() +25b0 8 117 36 +FUNC 25c0 8 0 std::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2>::~_Sp_counted_ptr_inplace() +25c0 8 117 36 +FUNC 25d0 c 0 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::~_Sp_counted_base() +25d0 c 117 36 +FUNC 25e0 c 0 std::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2>::~_Sp_counted_ptr_inplace() +25e0 7 117 36 +25e7 5 406 36 +FUNC 25f0 c 0 std::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2>::_M_destroy() +25f0 7 117 36 +25f7 5 100 46 +FUNC 2600 9 0 std::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2>::_M_dispose() +2600 9 114 46 +FUNC 2610 35 0 std::_Sp_counted_ptr_inplace, (__gnu_cxx::_Lock_policy)2>::_M_get_deleter(std::type_info const&) +2610 4 53 0 +2614 3 425 36 +2617 9 126 47 +2620 2 430 36 +2622 13 126 47 +2635 b 434 36 +2640 4 430 36 +2644 1 434 36 +FUNC 2650 90 0 google_breakpad::MinidumpDescriptor::~MinidumpDescriptor() +2650 8 46 19 +2658 4 290 33 +265c 4 536 33 +2660 9 237 33 +2669 4 290 33 +266d 4 536 33 +2671 9 237 33 +267a 6 46 19 +2680 5 80 45 +2685 4 242 33 +2689 5 80 45 +268e 7 48 45 +2695 4 242 33 +2699 c 246 33 +26a5 5 80 45 +26aa 4 242 33 +26ae 5 80 45 +26b3 7 48 45 +26ba 4 242 33 +26be c 246 33 +26ca 3 66 45 +26cd 8 67 45 +26d5 3 66 45 +26d8 8 67 45 +FUNC 26e0 92 0 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() +26e0 5 140 36 +26e5 5 80 45 +26ea 9 140 36 +26f3 3 80 45 +26f6 3 140 36 +26f9 4 144 36 +26fd 2 80 45 +26ff b 48 45 +270a 5 144 36 +270f 11 167 36 +2720 9 147 36 +2729 3 80 45 +272c 4 160 36 +2730 2 80 45 +2732 b 48 45 +273d 5 160 36 +2742 6 164 36 +2748 a 167 36 +2752 4 164 36 +2756 4 167 36 +275a 2 164 36 +275c 3 66 45 +275f 8 67 45 +2767 3 66 45 +276a 8 67 45 +FUNC 2780 f5 0 google_breakpad::ExceptionHandler::InstallHandlersLocked() +2780 d 241 17 +278d 16 240 17 +27a3 2 241 17 +27a5 7 240 17 +27ac 28 246 17 +27d4 6 245 17 +27da c 252 17 +27e6 a 251 17 +27f0 7 240 17 +27f7 3 251 17 +27fa 3 240 17 +27fd 8 252 17 +2805 f 256 17 +2814 5 255 17 +2819 7 258 17 +2820 b 259 17 +282b 4 258 17 +282f 10 262 17 +283f 5 261 17 +2844 7 267 17 +284b 7 269 17 +2852 5 268 17 +2857 10 269 17 +2867 2 242 17 +2869 9 269 17 +2872 2 242 17 +2874 1 269 17 +FUNC 2880 8b 0 google_breakpad::ExceptionHandler::RestoreHandlersLocked() +2880 9 275 17 +2889 22 274 17 +28ab 2 275 17 +28ad 4 274 17 +28b1 26 279 17 +28d7 6 278 17 +28dd 7 283 17 +28e4 1c 284 17 +2900 b 280 17 +FUNC 2910 104 0 google_breakpad::ExceptionHandler::SendContinueSignalToChild() +2910 22 495 17 +2932 a 2773 15 +293c 18 2773 15 +2954 5 499 17 +2959 1f 506 17 +2978 8 495 17 +2980 11 502 17 +2991 28 503 17 +29b9 a 506 17 +29c3 7 504 17 +29ca a 506 17 +29d4 5 504 17 +29d9 4 506 17 +29dd b 504 17 +29e8 10 2773 15 +29f8 3 498 17 +29fb 5 2773 15 +2a00 14 498 17 +FUNC 2a20 467 0 google_breakpad::ExceptionHandler::GenerateDump(google_breakpad::ExceptionHandler::CrashContext*) +2a20 2b 431 17 +2a4b 4 106 14 +2a4f 5 432 17 +2a54 d 433 17 +2a61 37 492 17 +2a98 5 60 12 +2a9d d 2816 15 +2aaa 5 60 12 +2aaf 2 86 12 +2ab1 3 60 12 +2ab4 9 86 12 +2abd 8 2816 15 +2ac5 3 86 12 +2ac8 5 2816 15 +2acd 3 86 12 +2ad0 27 2816 15 +2af7 9 439 17 +2b00 6 120 12 +2b06 4 438 17 +2b0a 7 124 12 +2b11 4 125 12 +2b15 6 438 17 +2b1b e 442 17 +2b29 7 441 17 +2b30 5 442 17 +2b35 4 446 17 +2b39 5 445 17 +2b3e a 446 17 +2b48 5 447 17 +2b4d 5 448 17 +2b52 4 447 17 +2b56 4 455 17 +2b5a 9 449 17 +2b63 21 3363 15 +2b84 11 461 17 +2b95 2e 462 17 +2bc3 11 463 17 +2bd4 57 1928 15 +2c2b 6 1930 15 +2c31 3 1928 15 +2c34 18 1930 15 +2c4c 25 2715 15 +2c71 8 473 17 +2c79 5 475 17 +2c7e 3 2877 15 +2c81 5 475 17 +2c86 26 2877 15 +2cac c 2877 15 +2cb8 5 474 17 +2cbd 5 474 17 +2cc2 57 2629 15 +2d19 9 481 17 +2d22 c 488 17 +2d2e b 488 17 +2d39 7 488 17 +2d40 9 489 17 +2d49 12 490 17 +2d5b 10 2701 15 +2d6b 3 135 12 +2d6e 20 2701 15 +2d8e 12 134 12 +2da0 3 474 17 +2da3 2 2877 15 +2da5 b 474 17 +2db0 10 431 17 +2dc0 11 483 17 +2dd1 2e 484 17 +2dff 11 485 17 +2e10 20 488 17 +2e30 10 455 17 +2e40 b 439 17 +2e4b 9 2701 15 +2e54 3 135 12 +2e57 20 2701 15 +2e77 10 134 12 +FUNC 2e90 1a6 0 google_breakpad::ExceptionHandler::HandleSignal(int, siginfo*, void*) +2e90 11 385 17 +2ea1 3 390 17 +2ea4 8 393 17 +2eac 31 2715 15 +2edd 3 397 17 +2ee0 10 398 17 +2ef0 92 397 17 +2f82 3 398 17 +2f85 c 402 17 +2f91 10 405 17 +2fa1 13 408 17 +2fb4 9 409 17 +2fbd 14 410 17 +2fd1 d 414 17 +2fde 19 415 17 +2ff7 5 411 17 +2ffc c 415 17 +3008 2e 393 17 +FUNC 3040 68 0 google_breakpad::ExceptionHandler::HandleSignal(int, siginfo*, void*) +3040 16 385 17 +3056 3 386 17 +3059 6 385 17 +305f 5 386 17 +3064 a 386 17 +306e 3a 415 17 +FUNC 30b0 56 0 google_breakpad::ExceptionHandler::SimulateSignalDelivery(int) +30b0 7 419 17 +30b7 7 420 17 +30be 4 419 17 +30c2 5 420 17 +30c7 4 419 17 +30cb 3 420 17 +30ce 5 424 17 +30d3 8 426 17 +30db 4 424 17 +30df 5 426 17 +30e4 1a 427 17 +30fe 8 428 17 +FUNC 3110 18b 0 google_breakpad::ExceptionHandler::SignalHandler(int, siginfo*, void*) +3110 19 293 17 +3129 c 295 17 +3135 10 308 17 +3145 e 308 17 +3153 b 327 17 +315e 3 688 17 +3161 b 626 43 +316c 9 327 17 +3175 1a 293 17 +318f 15 328 17 +31a4 18 327 17 +31bc 4 336 17 +31c0 9 337 17 +31c9 c 342 17 +31d5 7 344 17 +31dc 14 359 17 +31f0 10 339 17 +3200 d 311 17 +320d a 312 17 +3217 7 314 17 +321e 7 317 17 +3225 b 315 17 +3230 4 314 17 +3234 a 317 17 +323e 12 322 17 +3250 14 348 17 +3264 12 107 17 +3276 8 348 17 +327e 12 352 17 +3290 b 320 17 +FUNC 32a0 e0 0 google_breakpad::ExceptionHandler::WaitForContinueSignal() +32a0 a 510 17 +32aa 2 2724 15 +32ac 13 510 17 +32bf 3 510 17 +32c2 5 2724 15 +32c7 14 2724 15 +32db 5 514 17 +32e0 20 521 17 +3300 8 510 17 +3308 11 517 17 +3319 28 518 17 +3341 17 519 17 +3358 10 2724 15 +3368 3 513 17 +336b 5 2724 15 +3370 10 513 17 +FUNC 3380 58 0 google_breakpad::ExceptionHandler::DoDump(int, void const*, unsigned long) +3380 4 526 17 +3384 3 526 17 +3387 3 688 17 +338a 6 526 17 +3390 4 534 17 +3394 5 527 17 +3399 17 534 17 +33b0 8 543 17 +33b8 1b 542 17 +33d3 5 543 17 +FUNC 33e0 28 0 google_breakpad::ExceptionHandler::ThreadEntry(void*) +33e0 1 372 17 +33e1 3 372 17 +33e4 9 377 17 +33ed 19 380 17 +3406 2 381 17 +FUNC 3410 153 0 google_breakpad::ExceptionHandler::WriteMinidump() +3410 8 561 17 +3418 5 562 17 +341d 5 561 17 +3422 2 562 17 +3424 8 688 17 +342c 5 568 17 +3431 25 2715 15 +3456 f 579 17 +3465 2 581 17 +3467 4 580 17 +346b d 629 17 +3478 3 688 17 +347b 9 562 17 +3484 9 571 17 +348d 13 572 17 +34a0 18 608 17 +34b8 5 2673 15 +34bd 3 608 17 +34c0 16 2673 15 +34d6 20 2660 15 +34f6 c 613 17 +3502 7 610 17 +3509 6 613 17 +350f 8 620 17 +3517 5 628 17 +351c 8 614 17 +3524 5 620 17 +3529 5 628 17 +352e 12 629 17 +3540 10 3391 15 +3550 13 567 17 +FUNC 3570 cf 0 google_breakpad::ExceptionHandler::AddMappingInfo(std::string const&, unsigned char const*, unsigned long, unsigned long, unsigned long) +3570 1b 635 17 +358b 3 640 17 +358e 3 635 17 +3591 8 644 17 +3599 5 640 17 +359e 3 635 17 +35a1 5 640 17 +35a6 4 637 17 +35aa 5 638 17 +35af 4 758 41 +35b3 5 639 17 +35b8 5 640 17 +35bd 8 641 17 +35c5 e 644 17 +35d3 5 94 46 +35d8 19 645 17 +35f1 5 94 46 +35f6 17 120 46 +360d 3 1526 41 +3610 20 647 17 +3630 3 1526 41 +3633 7 647 17 +363a 5 1526 41 +FUNC 3640 5d 0 google_breakpad::ExceptionHandler::RegisterAppMemory(void*, unsigned long) +3640 6 649 17 +3646 4 758 41 +364a 1 649 17 +364b 4 688 17 +364f 3 649 17 +3652 14 135 37 +3666 3 156 41 +3669 5 135 37 +366e a 94 46 +3678 e 120 46 +3686 1 661 17 +3687 6 1526 41 +368d 3 661 17 +3690 8 1526 41 +3698 5 661 17 +FUNC 36a0 31 0 google_breakpad::ExceptionHandler::UnregisterAppMemory(void*) +36a0 1 663 17 +36a1 4 688 17 +36a5 4 758 41 +36a9 d 135 37 +36b6 3 156 41 +36b9 5 135 37 +36be 2 669 17 +36c0 8 1542 41 +36c8 3 100 46 +36cb 1 669 17 +36cc 5 100 46 +FUNC 36e0 179 0 google_breakpad::ExceptionHandler::WriteMinidumpForChild(int, int, std::string const&, bool (*)(google_breakpad::MinidumpDescriptor const&, void*, bool), void*) +36e0 28 676 17 +3708 5 54 2 +370d 3 676 17 +3710 3 54 2 +3713 6 676 17 +3719 d 54 2 +3726 7 272 33 +372d 12 54 2 +373f 9 272 33 +3748 4 713 33 +374c b 55 2 +3757 a 679 17 +3761 10 682 17 +3771 4 680 17 +3775 5 685 17 +377a 12 685 17 +378c 9 536 33 +3795 9 237 33 +379e 9 536 33 +37a7 5 237 33 +37ac 2c 686 17 +37d8 8 685 17 +37e0 4 683 17 +37e4 1f 55 2 +3803 e 242 33 +3811 f 246 33 +3820 12 242 33 +3832 12 246 33 +3844 15 685 17 +FUNC 3860 336 0 google_breakpad::ExceptionHandler::~ExceptionHandler() +3860 d 226 17 +386d f 227 17 +387c b 229 17 +3887 8 728 39 +388f 9 900 39 +3898 4 158 37 +389c 4 900 39 +38a0 9 160 37 +38a9 9 162 37 +38b2 a 166 37 +38bc a 170 37 +38c6 12 174 37 +38d8 6 162 37 +38de a 166 37 +38e8 a 170 37 +38f2 a 174 37 +38fc 3 750 39 +38ff 4 226 17 +3903 4 160 37 +3907 3 226 17 +390a c 160 37 +3916 1e 179 37 +3934 c 728 39 +3940 4 781 39 +3944 8 138 44 +394c a 364 38 +3956 5 365 38 +395b 8 140 44 +3963 d 231 17 +3970 8 235 17 +3978 4 436 41 +397c 5 379 41 +3981 4 436 41 +3985 5 379 41 +398a 4 536 33 +398e 7 237 33 +3995 4 536 33 +3999 9 237 33 +39a2 8 536 33 +39aa 9 237 33 +39b3 e 75 14 +39c1 f 236 17 +39d0 20 366 38 +39f0 9 163 17 +39f9 a 233 17 +3a03 8 2759 15 +3a0b 5 167 17 +3a10 20 2759 15 +3a30 29 750 39 +3a59 9 182 37 +3a62 4 750 39 +3a66 9 186 37 +3a6f 4 750 39 +3a73 c 728 39 +3a7f 9 167 17 +3a88 e 172 17 +3a96 5 184 17 +3a9b c 185 17 +3aa7 8 728 39 +3aaf 8 162 37 +3ab7 1b 750 39 +3ad2 8 173 17 +3ada 7 2759 15 +3ae1 2 173 17 +3ae3 16 2759 15 +3af9 12 179 17 +3b0b 8 178 17 +3b13 7 179 17 +3b1a 7 436 41 +3b21 5 379 41 +3b26 4 436 41 +3b2a 5 379 41 +3b2f 9 226 17 +3b38 16 75 14 +3b4e 12 242 33 +3b60 12 246 33 +3b72 12 242 33 +3b84 12 246 33 +FUNC 3ba0 31c 0 google_breakpad::ExceptionHandler::ExceptionHandler(google_breakpad::MinidumpDescriptor const&, bool (*)(void*), bool (*)(google_breakpad::MinidumpDescriptor const&, void*, bool), void*, bool, int) +3ba0 5 197 17 +3ba5 4 207 17 +3ba9 20 197 17 +3bc9 7 207 17 +3bd0 3 197 17 +3bd3 4 207 17 +3bd7 8 71 14 +3bdf 3 207 17 +3be2 4 197 17 +3be6 5 207 17 +3beb 8 387 41 +3bf3 2 208 17 +3bf5 8 207 17 +3bfd 4 387 41 +3c01 4 388 41 +3c05 4 387 41 +3c09 4 388 41 +3c0d 6 208 17 +3c13 7 209 17 +3c1a 4 81 14 +3c1e 3 209 17 +3c21 5 81 14 +3c26 a 82 14 +3c30 4 83 14 +3c34 9 211 17 +3c3d c 214 17 +3c49 12 215 17 +3c5b 5 217 17 +3c60 d 135 17 +3c6d 5 219 17 +3c72 9 221 17 +3c7b e 883 43 +3c89 10 120 46 +3c99 8 887 43 +3ca1 c 222 17 +3cad 27 223 17 +3cd4 9 211 17 +3cdd a 211 17 +3ce7 11 212 17 +3cf8 7 144 17 +3cff 21 138 17 +3d20 21 139 17 +3d41 6 144 17 +3d47 2d 2759 15 +3d74 8 150 17 +3d7c 7 151 17 +3d83 7 150 17 +3d8a 2a 2759 15 +3db4 14 154 17 +3dc8 8 120 46 +3dd0 28 148 17 +3df8 18 893 43 +3e10 a 216 17 +3e1a 17 88 43 +3e31 f 216 17 +3e40 30 144 17 +3e70 a 153 17 +3e7a f 157 17 +3e89 16 75 14 +3e9f 13 379 41 +3eb2 a 207 17 +FUNC 3ec0 167 0 google_breakpad::ExceptionHandler::WriteMinidump(std::string const&, bool (*)(google_breakpad::MinidumpDescriptor const&, void*, bool), void*) +3ec0 1e 548 17 +3ede 5 54 2 +3ee3 3 548 17 +3ee6 3 54 2 +3ee9 3 548 17 +3eec d 54 2 +3ef9 7 272 33 +3f00 12 54 2 +3f12 9 272 33 +3f1b 4 713 33 +3f1f 7 55 2 +3f26 21 550 17 +3f47 16 551 17 +3f5d 9 536 33 +3f66 5 237 33 +3f6b 9 536 33 +3f74 5 237 33 +3f79 2a 552 17 +3fa3 1f 55 2 +3fc2 e 242 33 +3fd0 f 246 33 +3fdf 12 242 33 +3ff1 12 246 33 +4003 24 551 17 +FUNC 4030 2f 0 std::_List_base >::_M_clear() +4030 9 66 35 +4039 3 70 35 +403c c 71 35 +4048 3 74 35 +404b 5 100 46 +4050 3 71 35 +4053 3 74 35 +4056 2 71 35 +4058 7 82 35 +FUNC 4060 2f 0 std::_List_base >::_M_clear() +4060 9 66 35 +4069 3 70 35 +406c c 71 35 +4078 3 74 35 +407b 5 100 46 +4080 3 71 35 +4083 3 74 35 +4086 2 71 35 +4088 7 82 35 +FUNC 4090 1ba 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, google_breakpad::ExceptionHandler* const&) +4090 28 316 44 +40b8 a 320 44 +40c2 10 120 46 +40d2 8 325 44 +40da 3 327 44 +40dd 4 329 44 +40e1 7 559 38 +40e8 5 560 38 +40ed f 561 38 +40fc 4 333 44 +4100 28 391 44 +4128 8 120 46 +4130 a 626 43 +413a 9 215 38 +4143 4 1308 43 +4147 9 1309 43 +4150 3 900 39 +4153 7 342 44 +415a 3 900 39 +415d 4 342 44 +4161 15 94 46 +4176 4 351 44 +417a b 120 46 +4185 3 360 44 +4188 3 364 38 +418b 3 365 38 +418e 7 364 38 +4195 5 365 38 +419a 13 366 38 +41ad 4 364 38 +41b1 5 365 44 +41b6 3 365 38 +41b9 7 364 38 +41c0 5 365 38 +41c5 16 366 38 +41db 3 384 44 +41de 3 367 38 +41e1 5 174 43 +41e6 5 100 46 +41eb 3 387 44 +41ee 3 389 44 +41f1 4 388 44 +41f5 b 389 44 +4200 3 900 39 +4203 6 342 44 +4209 3 900 39 +420c 9 342 44 +4215 13 1309 43 +4228 6 900 39 +422e 3 169 43 +4231 7 900 39 +4238 4 342 44 +423c e 169 43 +FUNC 4250 7d 0 google_breakpad::MinidumpDescriptor::MinidumpDescriptor(google_breakpad::MinidumpDescriptor const&) +4250 e 38 18 +425e 2 42 18 +4260 6 38 18 +4266 f 42 18 +4275 7 272 33 +427c 8 42 18 +4284 8 272 33 +428c 8 42 18 +4294 4 713 33 +4298 7 46 18 +429f f 47 18 +42ae 1f 46 18 +FUNC 42d0 232 0 google_breakpad::MinidumpDescriptor::UpdatePath() +42d0 b 65 18 +42db 9 66 18 +42e4 4 713 33 +42e8 b 66 18 +42f3 e 70 18 +4301 1f 71 18 +4320 1b 70 18 +433b 4 713 33 +433f 4 74 18 +4343 10 801 33 +4353 4 75 18 +4357 a 2402 33 +4361 16 1006 33 +4377 f 2402 33 +4386 1c 261 34 +43a2 8 1006 33 +43aa 1c 261 34 +43c6 5 1006 33 +43cb f 2402 33 +43da 16 1006 33 +43f0 d 544 33 +43fd 5 536 33 +4402 7 237 33 +4409 4 536 33 +440d 9 237 33 +4416 9 536 33 +441f 5 237 33 +4424 9 536 33 +442d 5 237 33 +4432 8 76 18 +443a 9 77 18 +4443 1f 66 18 +4462 e 242 33 +4470 f 246 33 +447f e 242 33 +448d f 246 33 +449c 12 242 33 +44ae 12 246 33 +44c0 42 75 18 +FUNC 4510 85 0 google_breakpad::MinidumpDescriptor::operator=(google_breakpad::MinidumpDescriptor const&) +4510 9 50 18 +4519 4 713 33 +451d 7 51 18 +4524 5 53 18 +4529 4 54 18 +452d 2 53 18 +452f 4 54 18 +4533 5 544 33 +4538 4 713 33 +453c 4 55 18 +4540 d 801 33 +454d 7 56 18 +4554 8 58 18 +455c 8 59 18 +4564 8 61 18 +456c a 63 18 +4576 1f 51 18 +FUNC 45a0 38 0 logger::write(char const*, unsigned long) +45a0 7 40 20 +45a7 1a 2773 15 +45c1 7 46 20 +45c8 e 2773 15 +45d6 2 46 20 +FUNC 45e0 5d 0 MinidumpWriter::~MinidumpWriter +45e0 e 436 23 +45ee 3 439 23 +45f1 3 436 23 +45f4 4 440 23 +45f8 2 439 23 +45fa a 441 23 +4604 3 436 23 +4607 e 442 23 +4615 b 436 23 +4620 d 440 23 +462d 10 436 23 +FUNC 4640 1e 0 google_breakpad::TypedMDRVA::CopyIndex(unsigned int, MDRawDirectory*) +4640 5 73 8 +4645 13 76 8 +4658 6 72 8 +FUNC 4660 15e5 0 MinidumpWriter::WriteThreadListStream +4660 6 683 23 +4666 4 686 23 +466a e 683 23 +4678 4 684 23 +467c 5 686 23 +4681 14 161 9 +4695 b 212 9 +46a0 8 626 43 +46a8 3 161 9 +46ab b 212 9 +46b6 4 626 43 +46ba 7 161 9 +46c1 4 684 23 +46c5 2 687 23 +46c7 9 66 8 +46d0 f 68 8 +46df b 67 8 +46ea d 68 8 +46f7 8 687 23 +46ff 8 176 9 +4707 5 693 23 +470c 7 690 23 +4713 3 176 9 +4716 7 691 23 +471d 8 693 23 +4725 3 691 23 +4728 9 701 23 +4731 4 703 23 +4735 3 705 23 +4738 3 703 23 +473b 7 705 23 +4742 9 706 23 +474b 8 700 23 +4753 e 710 23 +4761 10 223 9 +4771 5 710 23 +4776 a 223 9 +4780 14 712 23 +4794 4 713 23 +4798 8 766 43 +47a0 7 713 23 +47a7 3 719 23 +47aa 7 713 23 +47b1 6 719 23 +47b7 19 780 23 +47d0 5 785 23 +47d5 6 784 23 +47db 2 785 23 +47dd 9 786 23 +47e6 8 788 23 +47ee 1e 658 23 +480c 8 161 9 +4814 4 660 23 +4818 20 161 9 +4838 f 660 23 +4847 8 662 23 +484f 16 664 23 +4865 2 688 23 +4867 a 216 9 +4871 21 92 8 +4892 1e 814 23 +48b0 5 666 23 +48b5 4 42 6 +48b9 3 71 12 +48bc 3 666 23 +48bf 4 42 6 +48c3 6 71 12 +48c9 20 74 12 +48e9 3 75 12 +48ec 2 76 12 +48ee 4 78 12 +48f2 3 75 12 +48f5 8 77 12 +48fd 3 76 12 +4900 19 668 23 +4919 19 186 9 +4932 8 176 9 +493a 8 883 43 +4942 5 671 23 +4947 7 176 9 +494e 7 672 23 +4955 8 671 23 +495d 7 672 23 +4964 6 883 43 +496a 14 120 46 +497e 12 887 43 +4990 b 719 23 +499b 6 721 23 +49a1 17 719 23 +49b8 4 677 23 +49bc 8 675 23 +49c4 3 655 23 +49c7 b 676 23 +49d2 8 677 23 +49da 8 212 9 +49e2 5 161 9 +49e7 7 212 9 +49ee 5 47 8 +49f3 8 161 9 +49fb 3 212 9 +49fe 8 47 8 +4a06 14 161 9 +4a1a b 46 8 +4a25 5 47 8 +4a2a 8 792 23 +4a32 11 794 23 +4a43 8 226 23 +4a4b b 224 23 +4a56 3 796 23 +4a59 15 277 23 +4a6e 8 226 23 +4a76 10 228 23 +4a86 10 229 23 +4a96 10 230 23 +4aa6 10 231 23 +4ab6 10 233 23 +4ac6 f 234 23 +4ad5 10 236 23 +4ae5 10 237 23 +4af5 10 238 23 +4b05 10 239 23 +4b15 10 242 23 +4b25 10 243 23 +4b35 10 245 23 +4b45 10 246 23 +4b55 10 247 23 +4b65 10 248 23 +4b75 8 253 23 +4b7d 8 250 23 +4b85 8 253 23 +4b8d 8 254 23 +4b95 8 250 23 +4b9d 8 252 23 +4ba5 8 254 23 +4bad 8 255 23 +4bb5 8 252 23 +4bbd 8 255 23 +4bc5 10 256 23 +4bd5 10 257 23 +4be5 10 258 23 +4bf5 10 259 23 +4c05 10 260 23 +4c15 10 261 23 +4c25 10 262 23 +4c35 10 264 23 +4c45 10 266 23 +4c55 10 267 23 +4c65 f 268 23 +4c74 10 269 23 +4c84 8 270 23 +4c8c a 271 23 +4c96 a 273 23 +4ca0 7 270 23 +4ca7 f 272 23 +4cb6 e 274 23 +4cc4 e 275 23 +4cd2 100 276 23 +4dd2 3 277 23 +4dd5 2 796 23 +4dd7 8 42 6 +4ddf a 545 23 +4de9 a 555 23 +4df3 3 543 23 +4df6 15 545 23 +4e0b 9 553 23 +4e14 3 554 23 +4e17 9 555 23 +4e20 8 544 23 +4e28 3 554 23 +4e2b 5 545 23 +4e30 4 799 23 +4e34 7 798 23 +4e3b 8 176 9 +4e43 4 799 23 +4e47 e 798 23 +4e55 e 799 23 +4e63 a 216 9 +4e6d 1e 92 8 +4e8b 8 83 8 +4e93 f 810 23 +4ea2 6 83 8 +4ea8 1f 87 8 +4ec7 a 710 23 +4ed1 f 813 23 +4ee0 3 800 23 +4ee3 3 801 23 +4ee6 3 800 23 +4ee9 b 801 23 +4ef4 1c 157 5 +4f10 4 1187 23 +4f14 e 658 23 +4f22 7 1187 23 +4f29 10 658 23 +4f39 8 161 9 +4f41 d 664 23 +4f4e 1b 161 9 +4f69 d 664 23 +4f76 5 666 23 +4f7b 4 42 6 +4f7f 3 71 12 +4f82 3 666 23 +4f85 6 71 12 +4f8b 25 74 12 +4fb0 3 75 12 +4fb3 2 76 12 +4fb5 3 75 12 +4fb8 2 77 12 +4fba 4 75 12 +4fbe 6 77 12 +4fc4 5 76 12 +4fc9 1a 668 23 +4fe3 1d 186 9 +5000 8 176 9 +5008 8 883 43 +5010 5 671 23 +5015 7 176 9 +501c 7 672 23 +5023 8 671 23 +502b 7 672 23 +5032 6 883 43 +5038 14 120 46 +504c e 887 43 +505a 4 677 23 +505e 8 675 23 +5066 b 676 23 +5071 8 655 23 +5079 8 677 23 +5081 4 1191 23 +5085 6 734 23 +508b 7 1191 23 +5092 4 734 23 +5096 4 42 6 +509a 4 626 43 +509e 2 734 23 +50a0 7 626 43 +50a7 9 734 23 +50b0 4 735 23 +50b4 8 736 23 +50bc 10 736 23 +50cc e 734 23 +50da 8 212 9 +50e2 5 161 9 +50e7 7 212 9 +50ee 5 47 8 +50f3 8 161 9 +50fb 3 212 9 +50fe 8 47 8 +5106 14 161 9 +511a b 46 8 +5125 5 47 8 +512a 8 770 23 +5132 11 772 23 +5143 8 773 23 +514b b 284 23 +5156 f 286 23 +5165 3 288 23 +5168 c 289 23 +5174 7 291 23 +517b c 288 23 +5187 7 291 23 +518e f 293 23 +519d f 294 23 +51ac f 295 23 +51bb f 296 23 +51ca f 298 23 +51d9 c 299 23 +51e5 c 300 23 +51f1 c 301 23 +51fd c 302 23 +5209 c 303 23 +5215 c 304 23 +5221 c 305 23 +522d c 306 23 +5239 c 307 23 +5245 c 308 23 +5251 c 309 23 +525d f 311 23 +526c b 313 23 +5277 c 314 23 +5283 b 315 23 +528e c 316 23 +529a b 317 23 +52a5 4 318 23 +52a9 a 319 23 +52b3 a 320 23 +52bd 7 318 23 +52c4 a 321 23 +52ce a 322 23 +52d8 4 323 23 +52dc 8 324 23 +52e4 c0 323 23 +53a4 a 324 23 +53ae 8 323 23 +53b6 8 324 23 +53be 7 774 23 +53c5 8 42 6 +53cd a 545 23 +53d7 e 555 23 +53e5 3 543 23 +53e8 15 545 23 +53fd 9 553 23 +5406 3 554 23 +5409 9 555 23 +5412 8 544 23 +541a 3 554 23 +541d b 545 23 +5428 8 216 9 +5430 7 776 23 +5437 8 176 9 +543f 7 776 23 +5446 3 777 23 +5449 7 776 23 +5450 3 777 23 +5453 6 216 9 +5459 1f 92 8 +5478 4 743 23 +547c 5 161 9 +5481 c 755 23 +548d 8 161 9 +5495 3 743 23 +5498 c 161 9 +54a4 5 755 23 +54a9 4 743 23 +54ad 4 746 23 +54b1 8 161 9 +54b9 3 748 23 +54bc 8 743 23 +54c4 6 748 23 +54ca 2 755 23 +54cc 7 748 23 +54d3 d 755 23 +54e0 8 758 23 +54e8 4 42 6 +54ec 9 71 12 +54f5 25 74 12 +551a 3 75 12 +551d 3 76 12 +5520 3 75 12 +5523 8 77 12 +552b 5 76 12 +5530 1c 763 23 +554c 7 764 23 +5553 14 186 9 +5567 8 176 9 +556f 8 883 43 +5577 7 176 9 +557e e 765 23 +558c 6 883 43 +5592 1c 120 46 +55ae 12 887 43 +55c0 e 86 12 +55ce f 2816 15 +55dd 3 86 12 +55e0 5 2816 15 +55e5 9 86 12 +55ee 34 2816 15 +5622 1e 89 12 +5640 1a 576 23 +565a 8 584 23 +5662 6 591 23 +5668 48 584 23 +56b0 8 591 23 +56b8 8 595 23 +56c0 5 597 23 +56c5 5 596 23 +56ca 8 590 23 +56d2 8 592 23 +56da 8 585 23 +56e2 8 586 23 +56ea 8 587 23 +56f2 8 588 23 +56fa 8 589 23 +5702 8 593 23 +570a 8 594 23 +5712 8 596 23 +571a 8 597 23 +5722 5 598 23 +5727 5 599 23 +572c 8 600 23 +5734 8 598 23 +573c 14 599 23 +5750 1a 576 23 +576a 8 584 23 +5772 6 591 23 +5778 4d 584 23 +57c5 8 593 23 +57cd 8 594 23 +57d5 5 595 23 +57da 5 596 23 +57df 8 590 23 +57e7 8 591 23 +57ef 8 592 23 +57f7 8 585 23 +57ff 8 586 23 +5807 8 587 23 +580f 8 588 23 +5817 8 589 23 +581f 8 595 23 +5827 8 596 23 +582f 5 597 23 +5834 5 598 23 +5839 5 599 23 +583e 8 600 23 +5846 8 597 23 +584e 8 598 23 +5856 d 599 23 +5863 11 86 12 +5874 f 2816 15 +5883 3 86 12 +5886 5 2816 15 +588b 9 86 12 +5894 3a 2816 15 +58ce 1d 89 12 +58eb 11 86 12 +58fc f 2816 15 +590b 3 86 12 +590e 5 2816 15 +5913 9 86 12 +591c 38 2816 15 +5954 14 89 12 +5968 d 707 23 +5975 c 120 12 +5981 a 124 12 +598b 4 125 12 +598f a 93 12 +5999 3 124 12 +599c 3 125 12 +599f 5 126 12 +59a4 16 93 12 +59ba 5 94 12 +59bf 5 93 12 +59c4 11 94 12 +59d5 5 96 12 +59da 11 94 12 +59eb 9 96 12 +59f4 9 78 12 +59fd e 79 12 +5a0b 8 72 12 +5a13 4 766 23 +5a17 16 893 43 +5a2d c 120 12 +5a39 9 124 12 +5a42 5 125 12 +5a47 4 93 12 +5a4b 4 124 12 +5a4f 3 93 12 +5a52 4 125 12 +5a56 4 124 12 +5a5a 4 126 12 +5a5e 17 93 12 +5a75 5 94 12 +5a7a 3 93 12 +5a7d 15 94 12 +5a92 a 96 12 +5a9c 8 94 12 +5aa4 d 96 12 +5ab1 a 120 12 +5abb 5 124 12 +5ac0 e 93 12 +5ace 3 124 12 +5ad1 4 125 12 +5ad5 5 93 12 +5ada 3 125 12 +5add 5 93 12 +5ae2 5 126 12 +5ae7 8 93 12 +5aef 5 94 12 +5af4 5 93 12 +5af9 f 94 12 +5b08 4 96 12 +5b0c a 94 12 +5b16 d 96 12 +5b23 9 78 12 +5b2c e 79 12 +5b3a 7 78 12 +5b41 d 79 12 +5b4e e 216 9 +5b5c 26 92 8 +5b82 e 216 9 +5b90 26 92 8 +5bb6 15 72 12 +5bcb c 673 23 +5bd7 e 893 43 +5be5 c 673 23 +5bf1 13 893 43 +5c04 10 807 23 +5c14 1a 813 23 +5c2e 17 777 23 +FUNC 5c50 1d12 0 MinidumpWriter::Dump +5c50 2 444 23 +5c52 4 449 23 +5c56 5 47 8 +5c5b 12 444 23 +5c6d 3 42 6 +5c70 8 47 8 +5c78 14 161 9 +5c8c 18 212 9 +5ca4 7 161 9 +5cab 18 212 9 +5cc3 1b 161 9 +5cde 2c 212 9 +5d0a b 46 8 +5d15 5 47 8 +5d1a 8 451 23 +5d22 d 60 8 +5d2f b 59 8 +5d3a 5 60 8 +5d3f 2 454 23 +5d41 4 453 23 +5d45 a 216 9 +5d4f 21 92 8 +5d70 a 216 9 +5d7a 21 92 8 +5d9b 15 534 23 +5db0 8 452 23 +5db8 8 223 9 +5dc0 c 455 23 +5dcc 2 459 23 +5dce b 457 23 +5dd9 b 458 23 +5de4 c 459 23 +5df0 7 461 23 +5df7 b 466 23 +5e02 b 460 23 +5e0d 7 461 23 +5e14 d 466 23 +5e21 8 73 8 +5e29 f 468 23 +5e38 6 73 8 +5e3e 12 76 8 +5e50 4 872 23 +5e54 4 873 23 +5e58 4 42 6 +5e5c 4 626 43 +5e60 3 42 6 +5e63 7 626 43 +5e6a 16 80 40 +5e80 3 236 41 +5e83 4 83 40 +5e87 5 80 40 +5e8c 14 875 23 +5ea0 9 858 23 +5ea9 c 875 23 +5eb5 4 876 23 +5eb9 11 841 23 +5eca 9 877 23 +5ed3 b 853 23 +5ede c 858 23 +5eea 3 236 41 +5eed 5 853 23 +5ef2 5 878 23 +5ef7 4 161 9 +5efb 2 882 23 +5efd 14 161 9 +5f11 b 212 9 +5f1c 7 161 9 +5f23 6 882 23 +5f29 2 883 23 +5f2b 8 68 8 +5f33 b 67 8 +5f3e 1a 68 8 +5f58 8 888 23 +5f60 c 176 9 +5f6c 2 898 23 +5f6e 4 872 23 +5f72 b 892 23 +5f7d 7 894 23 +5f84 7 176 9 +5f8b 11 893 23 +5f9c 6 898 23 +5fa2 8 954 23 +5faa 3 898 23 +5fad 8 897 23 +5fb5 b 954 23 +5fc0 d 858 23 +5fcd b 898 23 +5fd8 9 42 6 +5fe1 8 899 23 +5fe9 11 841 23 +5ffa 9 900 23 +6003 b 853 23 +600e 13 858 23 +6021 3 236 41 +6024 5 853 23 +6029 14 929 23 +603d 3 931 23 +6040 7 933 23 +6047 8 931 23 +604f b 932 23 +605a 8 933 23 +6062 5 936 23 +6067 5 937 23 +606c 19 938 23 +6085 4 940 23 +6089 5 937 23 +608e 4 942 23 +6092 14 161 9 +60a6 5 942 23 +60ab 12 944 23 +60bd 5 949 23 +60c2 4 161 9 +60c6 14 949 23 +60da 7 161 9 +60e1 d 949 23 +60ee 15 962 23 +6103 b 953 23 +610e 5 962 23 +6113 8 956 23 +611b c 964 23 +6127 a 968 23 +6131 8 965 23 +6139 9 968 23 +6142 21 186 9 +6163 8 176 9 +616b e 974 23 +6179 7 176 9 +6180 e 971 23 +618e 9 974 23 +6197 4 906 23 +619b 4 976 23 +619f b 906 23 +61aa 8 83 8 +61b2 7 976 23 +61b9 7 906 23 +61c0 6 83 8 +61c6 28 87 8 +61ee 12 906 23 +6200 2 914 23 +6202 a 216 9 +620c 22 92 8 +622e 8 470 23 +6236 8 73 8 +623e f 472 23 +624d 6 73 8 +6253 15 76 8 +6268 4 818 23 +626c 3 42 6 +626f 9 818 23 +6278 18 834 23 +6290 2 76 12 +6292 6 75 12 +6298 2 77 12 +629a 3 76 12 +629d 2 77 12 +629f 7 78 12 +62a6 a 79 12 +62b0 13 824 23 +62c3 4 161 9 +62c7 c 827 23 +62d3 1b 161 9 +62ee d 827 23 +62fb 1b 186 9 +6316 8 176 9 +631e 8 883 43 +6326 4 832 23 +632a 7 176 9 +6331 7 833 23 +6338 8 832 23 +6340 7 833 23 +6347 6 883 43 +634d 14 120 46 +6361 8 887 43 +6369 4 236 41 +636d a 818 23 +6377 8 822 23 +637f 3 71 12 +6382 3 822 23 +6385 6 71 12 +638b 1c 74 12 +63a7 11 86 12 +63b8 f 2816 15 +63c7 3 86 12 +63ca 8 2816 15 +63d2 9 86 12 +63db 35 2816 15 +6410 15 89 12 +6425 8 120 12 +642d 9 124 12 +6436 4 125 12 +643a 8 93 12 +6442 3 124 12 +6445 3 125 12 +6448 4 126 12 +644c 16 93 12 +6462 5 94 12 +6467 3 93 12 +646a 11 94 12 +647b 5 96 12 +6480 4 94 12 +6484 6 96 12 +648a d 47 8 +6497 b 46 8 +64a2 f 47 8 +64b1 8 897 23 +64b9 2a 909 23 +64e3 d 956 23 +64f0 11 929 23 +6501 4 931 23 +6505 7 933 23 +650c 8 931 23 +6514 b 932 23 +651f 5 933 23 +6524 4 936 23 +6528 3 933 23 +652b 5 936 23 +6530 5 937 23 +6535 10 938 23 +6545 4 940 23 +6549 5 937 23 +654e 5 944 23 +6553 4 942 23 +6557 8 949 23 +655f 5 942 23 +6564 8 161 9 +656c 3 944 23 +656f 10 161 9 +657f 7 949 23 +6586 7 161 9 +658d 12 949 23 +659f b 953 23 +65aa 7 959 23 +65b1 c 964 23 +65bd 17 959 23 +65d4 5 964 23 +65d9 5 968 23 +65de 8 965 23 +65e6 9 968 23 +65ef 21 186 9 +6610 8 176 9 +6618 e 974 23 +6626 7 176 9 +662d e 971 23 +663b d 974 23 +6648 8 83 8 +6650 4 976 23 +6654 8 915 23 +665c 7 976 23 +6663 7 915 23 +666a 6 83 8 +6670 1d 87 8 +668d 4 236 41 +6691 f 909 23 +66a0 a 918 23 +66aa 8 72 12 +66b2 17 893 43 +66c9 18 161 9 +66e1 b 212 9 +66ec 7 161 9 +66f3 c 626 43 +66ff 9 982 23 +6708 c 68 8 +6714 b 67 8 +671f c 68 8 +672b 8 989 23 +6733 8 176 9 +673b 4 626 43 +673f 7 994 23 +6746 b 993 23 +6751 7 176 9 +6758 4 42 6 +675c 7 994 23 +6763 7 626 43 +676a 3 998 23 +676d 7 996 23 +6774 2 998 23 +6776 8 83 8 +677e 8 1000 23 +6786 12 83 8 +6798 3 444 23 +679b a 1000 23 +67a5 4 444 23 +67a9 3 751 43 +67ac 8 83 8 +67b4 7 1000 23 +67bb 6 83 8 +67c1 11 87 8 +67d2 4 42 6 +67d6 4 626 43 +67da 4 998 23 +67de 7 626 43 +67e5 5 998 23 +67ea 5 1002 23 +67ef a 216 9 +67f9 1d 92 8 +6816 8 477 23 +681e 28 479 23 +6846 4 161 9 +684a d 212 9 +6857 5 47 8 +685c 14 161 9 +6870 b 46 8 +687b 7 161 9 +6882 5 212 9 +6887 d 47 8 +6894 8 1007 23 +689c 8 223 9 +68a4 c 1009 23 +68b0 8 176 9 +68b8 b 1011 23 +68c3 5 1019 23 +68c8 7 176 9 +68cf e 1012 23 +68dd 4 42 6 +68e1 a 1014 23 +68eb 3 1015 23 +68ee 4 1016 23 +68f2 7 1015 23 +68f9 8 1016 23 +6901 c 1017 23 +690d a 216 9 +6917 21 92 8 +6938 8 481 23 +6940 28 483 23 +6968 4 161 9 +696c d 212 9 +6979 5 47 8 +697e 14 161 9 +6992 b 46 8 +699d 7 161 9 +69a4 4 212 9 +69a8 d 47 8 +69b5 8 1024 23 +69bd 8 223 9 +69c5 c 1026 23 +69d1 8 176 9 +69d9 10 1221 23 +69e9 e 1233 23 +69f7 5 1221 23 +69fc 7 1233 23 +6a03 b 1028 23 +6a0e 7 176 9 +6a15 7 1029 23 +6a1c 26 1233 23 +6a42 7 1029 23 +6a49 2 1221 23 +6a4b 8 1233 23 +6a53 2 1221 23 +6a55 2a 1233 23 +6a7f 5 2711 15 +6a84 13 1233 23 +6a97 7 2711 15 +6a9e 8 1233 23 +6aa6 a 1240 23 +6ab0 3 1221 23 +6ab3 1d 2711 15 +6ad0 8 1574 23 +6ad8 b 1570 23 +6ae3 12 1574 23 +6af5 f 1578 23 +6b04 8 1588 23 +6b0c 5 1579 23 +6b11 8 1578 23 +6b19 a 1586 23 +6b23 5 1588 23 +6b28 6 1587 23 +6b2e 3b 1586 23 +6b69 9 1598 23 +6b72 12 1604 23 +6b84 3 1605 23 +6b87 3 1603 23 +6b8a 14 1588 23 +6b9e 8 1591 23 +6ba6 3 1592 23 +6ba9 3 1591 23 +6bac 2 1592 23 +6bae 11 1595 23 +6bbf 18 1626 23 +6bd7 b 1628 23 +6be2 e 1034 23 +6bf0 7 80 40 +6bf7 d 47 8 +6c04 b 46 8 +6c0f d 47 8 +6c1c 7 990 23 +6c23 12 1008 23 +6c35 2 1025 23 +6c37 a 216 9 +6c41 21 92 8 +6c62 8 485 23 +6c6a 28 487 23 +6c92 12 490 23 +6ca4 b 489 23 +6caf 9 490 23 +6cb8 b 1214 23 +6cc3 b 1215 23 +6cce b 1216 23 +6cd9 28 492 23 +6d01 4 42 6 +6d05 12 495 23 +6d17 b 494 23 +6d22 c 495 23 +6d2e b 1214 23 +6d39 b 1215 23 +6d44 b 1216 23 +6d4f 28 497 23 +6d77 12 500 23 +6d89 b 499 23 +6d94 9 500 23 +6d9d b 1214 23 +6da8 b 1215 23 +6db3 b 1216 23 +6dbe 28 502 23 +6de6 4 42 6 +6dea 12 505 23 +6dfc b 504 23 +6e07 c 505 23 +6e13 b 1214 23 +6e1e b 1215 23 +6e29 b 1216 23 +6e34 28 507 23 +6e5c 4 42 6 +6e60 12 510 23 +6e72 b 509 23 +6e7d c 510 23 +6e89 b 1214 23 +6e94 b 1215 23 +6e9f b 1216 23 +6eaa 28 512 23 +6ed2 4 42 6 +6ed6 12 515 23 +6ee8 b 514 23 +6ef3 c 515 23 +6eff b 1214 23 +6f0a b 1215 23 +6f15 b 1216 23 +6f20 28 517 23 +6f48 4 42 6 +6f4c 12 520 23 +6f5e b 519 23 +6f69 c 520 23 +6f75 b 1214 23 +6f80 b 1215 23 +6f8b b 1216 23 +6f96 28 522 23 +6fbe 4 42 6 +6fc2 b 524 23 +6fcd 7 42 6 +6fd4 4 1038 23 +6fd8 4 1040 23 +6fdc 3 1041 23 +6fdf 5 1040 23 +6fe4 e 1041 23 +6ff2 6 1045 23 +6ff8 2 1048 23 +6ffa 9 1045 23 +7003 1e 1051 23 +7021 10 1054 23 +7031 9 1057 23 +703a f 1049 23 +7049 9 1061 23 +7052 3 1064 23 +7055 6 444 23 +705b 3 1069 23 +705e 3 1064 23 +7061 5 444 23 +7066 d 1080 23 +7073 4 1076 23 +7077 4 444 23 +707b 11 1076 23 +708c 4 444 23 +7090 9 1076 23 +7099 e 1077 23 +70a7 d 1078 23 +70b4 a 216 9 +70be 21 92 8 +70df a 216 9 +70e9 21 92 8 +710a a 216 9 +7114 29 92 8 +713d d 1058 23 +714a f 1054 23 +7159 d 1055 23 +7166 d 1133 23 +7173 b 1214 23 +717e b 1215 23 +7189 b 1216 23 +7194 28 527 23 +71bc a 532 23 +71c6 a 533 23 +71d0 1e 1097 23 +71ee 8 1098 23 +71f6 4 1094 23 +71fa 1b 1100 23 +7215 8 1101 23 +721d 3 1102 23 +7220 5 1098 23 +7225 7 1105 23 +722c 2 1106 23 +722e 6 1105 23 +7234 6 1106 23 +723a 3 1110 23 +723d 4 161 9 +7241 c 60 8 +724d 14 161 9 +7261 17 212 9 +7278 7 161 9 +727f c 212 9 +728b b 59 8 +7296 5 60 8 +729b 8 1110 23 +72a3 8 1112 23 +72ab 8 1120 23 +72b3 3 1116 23 +72b6 5 1120 23 +72bb 5 1112 23 +72c0 d 1116 23 +72cd 1e 1118 23 +72eb c 1120 23 +72f7 8 1119 23 +72ff 3 1120 23 +7302 b 1121 23 +730d 1 1120 23 +730e 2 1121 23 +7310 1b 1123 23 +732b 1f 1126 23 +734a 4 1129 23 +734e 8 73 8 +7356 f 1132 23 +7365 7 1129 23 +736c 10 1130 23 +737c 10 1131 23 +738c 6 73 8 +7392 19 76 8 +73ab 9 1116 23 +73b4 d 1133 23 +73c1 5 1138 23 +73c6 18 161 9 +73de 16 212 9 +73f4 7 161 9 +73fb b 212 9 +7406 3 66 8 +7409 2f 212 9 +7438 6 66 8 +743e d 68 8 +744b b 67 8 +7456 5 68 8 +745b 8 1138 23 +7463 8 223 9 +746b c 1140 23 +7477 8 176 9 +747f 5 1145 23 +7484 f 76 44 +7493 b 1141 23 +749e 7 1146 23 +74a5 7 176 9 +74ac 7 1142 23 +74b3 8 1145 23 +74bb 8 1149 23 +74c3 18 92 43 +74db 7 1142 23 +74e2 7 1144 23 +74e9 c 92 43 +74f5 7 1144 23 +74fc 10 1147 23 +750c 10 1148 23 +751c 10 1151 23 +752c 5 76 44 +7531 4 84 44 +7535 13 1004 43 +7548 8 82 44 +7550 8 83 44 +7558 8 84 44 +7560 10 1004 43 +7570 1b 1156 23 +758b 8 83 8 +7593 17 1157 23 +75aa 6 83 8 +75b0 b 87 8 +75bb 12 1159 23 +75cd d 525 23 +75da 15 1133 23 +75ef 1f 73 8 +760e 16 1599 23 +7624 9 1600 23 +762d 2 1244 23 +762f 4 2711 15 +7633 6 1244 23 +7639 5 60 12 +763e d 198 12 +764b 2a 63 12 +7675 8 198 12 +767d d 49 4 +768a a 48 7 +7694 1a 1251 23 +76ae 12 1255 23 +76c0 b 1256 23 +76cb 15 1260 23 +76e0 8 42 6 +76e8 9 116 7 +76f1 b 1263 23 +76fc a 1252 23 +7706 1c 1276 23 +7722 8 42 6 +772a 5 116 7 +772f f 1279 23 +773e 17 1280 23 +7755 15 1267 23 +776a 8 1270 23 +7772 4 1271 23 +7776 a 1270 23 +7780 9 1283 23 +7789 8 42 6 +7791 5 134 12 +7796 c 2701 15 +77a2 3 135 12 +77a5 1c 2701 15 +77c1 a 134 12 +77cb 12 1290 23 +77dd 6 1287 23 +77e3 11 1297 23 +77f4 7 1299 23 +77fb f 1300 23 +780a 11 1302 23 +781b 8 1304 23 +7823 8 1302 23 +782b 6 1304 23 +7831 23 1306 23 +7854 b 42 6 +785f 6 2701 15 +7865 9 134 12 +786e 7 2701 15 +7875 3 135 12 +7878 32 2701 15 +78aa 10 1002 23 +78ba 11 216 9 +78cb 2b 92 8 +78f6 12 918 23 +7908 1f 83 8 +7927 7 1139 23 +792e 15 1159 23 +7943 1f 66 8 +FUNC 7970 1ac 0 google_breakpad::WriteMinidump(char const*, std::list > const&, std::list > const&, google_breakpad::LinuxDumper*) +7970 11 1762 23 +7981 32 418 23 +79b3 a 190 12 +79bd 9 418 23 +79c6 1b 92 43 +79e1 9 418 23 +79ea 5 190 12 +79ef 4 420 23 +79f3 a 418 23 +79fd 6 420 23 +7a03 9 421 23 +7a0c f 425 23 +7a1b 3 428 23 +7a1e 5 429 23 +7a23 5 428 23 +7a28 5 429 23 +7a2d b 433 23 +7a38 4 1764 23 +7a3c 8 1766 23 +7a44 4 439 23 +7a48 2 1766 23 +7a4a 2 439 23 +7a4c b 441 23 +7a57 a 436 23 +7a61 f 1767 23 +7a70 10 430 23 +7a80 2 1765 23 +7a82 6 439 23 +7a88 10 440 23 +7a98 28 420 23 +7ac0 1f 421 23 +7adf 15 436 23 +7af4 18 418 23 +7b0c 10 1766 23 +FUNC 7b20 2ce 0 WriteMinidumpImpl +7b20 2b 1669 23 +7b4b 8 1670 23 +7b53 3 1669 23 +7b56 2 1670 23 +7b58 6 1669 23 +7b5e 5 1670 23 +7b63 9 1672 23 +7b6c 2 1674 23 +7b6e 9 1673 23 +7b77 20 42 6 +7b97 41 1688 23 +7bd8 4 157 5 +7bdc 9 418 23 +7be5 8 157 5 +7bed 9 161 5 +7bf6 d 164 5 +7c03 34 418 23 +7c37 a 190 12 +7c41 9 418 23 +7c4a 1b 92 43 +7c65 9 418 23 +7c6e 5 190 12 +7c73 8 418 23 +7c7b 4 420 23 +7c7f 12 418 23 +7c91 6 420 23 +7c97 9 421 23 +7ca0 5 425 23 +7ca5 5 1162 23 +7caa a 425 23 +7cb4 3 428 23 +7cb7 5 429 23 +7cbc 5 428 23 +7cc1 5 429 23 +7cc6 b 433 23 +7cd1 4 1685 23 +7cd5 8 1687 23 +7cdd 4 439 23 +7ce1 2 1687 23 +7ce3 2 439 23 +7ce5 13 440 23 +7cf8 18 430 23 +7d10 2 1686 23 +7d12 6 439 23 +7d18 b 441 23 +7d23 15 436 23 +7d38 28 420 23 +7d60 19 418 23 +7d79 22 421 23 +7d9b 28 42 6 +7dc3 f 418 23 +7dd2 d 1687 23 +7ddf f 436 23 +FUNC 7df0 2b 0 google_breakpad::WriteMinidump(int, long, int, void const*, unsigned long, std::list > const&, std::list > const&) +7df0 4 1753 23 +7df4 22 1756 23 +7e16 5 1757 23 +FUNC 7e20 2c 0 google_breakpad::WriteMinidump(char const*, long, int, void const*, unsigned long, std::list > const&, std::list > const&) +7e20 4 1743 23 +7e24 23 1746 23 +7e47 5 1747 23 +FUNC 7e50 2a 0 google_breakpad::WriteMinidump(int, int, void const*, unsigned long, std::list > const&, std::list > const&) +7e50 4 1733 23 +7e54 21 1736 23 +7e75 5 1737 23 +FUNC 7e80 2b 0 google_breakpad::WriteMinidump(char const*, int, void const*, unsigned long, std::list > const&, std::list > const&) +7e80 4 1724 23 +7e84 22 1727 23 +7ea6 5 1728 23 +FUNC 7eb0 9a 0 google_breakpad::WriteMinidump(int, int, void const*, unsigned long) +7eb0 16 1702 23 +7ec6 3 1702 23 +7ec9 a 387 41 +7ed3 16 1705 23 +7ee9 5 387 41 +7eee 5 388 41 +7ef3 5 387 41 +7ef8 5 388 41 +7efd 5 1705 23 +7f02 19 379 41 +7f1b 14 1706 23 +7f2f 1b 379 41 +FUNC 7f50 9b 0 google_breakpad::WriteMinidump(char const*, int, void const*, unsigned long) +7f50 16 1695 23 +7f66 3 1695 23 +7f69 a 387 41 +7f73 17 1698 23 +7f8a 5 387 41 +7f8f 5 388 41 +7f94 5 387 41 +7f99 5 388 41 +7f9e 5 1698 23 +7fa3 19 379 41 +7fbc 14 1699 23 +7fd0 1b 379 41 +FUNC 7ff0 26a 0 google_breakpad::WriteMinidump(char const*, int, int) +7ff0 10 1709 23 +8000 10 1710 23 +8010 4 387 41 +8014 7 164 5 +801b 5 418 23 +8020 5 387 41 +8025 b 161 5 +8030 8 418 23 +8038 4 387 41 +803c 5 388 41 +8041 5 387 41 +8046 5 388 41 +804b 26 418 23 +8071 a 190 12 +807b 9 418 23 +8084 21 92 43 +80a5 9 418 23 +80ae 5 190 12 +80b3 5 420 23 +80b8 14 418 23 +80cc 6 420 23 +80d2 9 421 23 +80db 10 379 41 +80eb 13 425 23 +80fe 4 428 23 +8102 5 429 23 +8107 5 428 23 +810c 5 429 23 +8111 b 433 23 +811c 4 1716 23 +8120 a 1718 23 +812a 5 439 23 +812f 2 1718 23 +8131 2 439 23 +8133 b 441 23 +813e a 436 23 +8148 1b 42 6 +8163 15 1719 23 +8178 18 430 23 +8190 2 1717 23 +8192 7 439 23 +8199 f 440 23 +81a8 28 420 23 +81d0 22 421 23 +81f2 23 42 6 +8215 f 1718 23 +8224 d 418 23 +8231 1a 379 41 +824b f 436 23 +FUNC 8260 153 0 google_breakpad::PageAllocator::Alloc(unsigned int) +8260 8 71 12 +8268 25 70 12 +828d b 74 12 +8298 b 74 12 +82a3 2 75 12 +82a5 2 76 12 +82a7 3 75 12 +82aa 8 77 12 +82b2 3 76 12 +82b5 2b 97 12 +82e0 c 86 12 +82ec f 2816 15 +82fb 3 86 12 +82fe 5 2816 15 +8303 6 86 12 +8309 2a 2816 15 +8333 d 89 12 +8340 6 120 12 +8346 2 93 12 +8348 4 124 12 +834c 3 93 12 +834f 4 125 12 +8353 5 93 12 +8358 4 124 12 +835c 5 93 12 +8361 4 126 12 +8365 8 93 12 +836d 5 94 12 +8372 3 93 12 +8375 13 94 12 +8388 10 96 12 +8398 7 78 12 +839f 11 79 12 +83b0 2 72 12 +83b2 1 97 12 +FUNC 83c0 248 0 google_breakpad::ProcCpuInfoReader::GetNextField(char const**) +83c0 4 54 7 +83c4 4 118 4 +83c8 10 54 7 +83d8 b 60 7 +83e3 e 116 4 +83f1 2 117 4 +83f3 8 118 4 +83fb 7 117 4 +8402 5 118 4 +8407 e 62 7 +8415 6 99 4 +841b f 66 4 +842a 3 99 4 +842d 3 2724 15 +8430 5 98 4 +8435 3 99 4 +8438 13 2724 15 +844b a 100 4 +8455 a 102 4 +845f 4 103 4 +8463 5 66 4 +8468 14 70 4 +847c c 54 7 +8488 10 70 4 +8498 8 69 4 +84a0 b 78 4 +84ab a 86 4 +84b5 8 87 4 +84bd 3 92 4 +84c0 7 90 4 +84c7 e 92 4 +84d5 5 71 4 +84da 6 68 7 +84e0 8 77 7 +84e8 4 70 7 +84ec 5 77 7 +84f1 3 78 7 +84f4 3 77 7 +84f7 6 78 7 +84fd 5 83 7 +8502 5 84 7 +8507 3 88 7 +850a 7 87 7 +8511 3 88 7 +8514 3 92 7 +8517 7 88 7 +851e 2 92 7 +8520 9 95 7 +8529 5 99 7 +852e 4 101 7 +8532 c 104 7 +853e 5 102 7 +8543 d 104 7 +8550 e 84 7 +855e 4 85 7 +8562 e 84 7 +8570 f 92 7 +857f 4 93 7 +8583 d 92 7 +8590 10 105 4 +85a0 e 2724 15 +85ae 4 104 7 +85b2 2 66 7 +85b4 b 104 7 +85bf b 70 4 +85ca 1f 116 4 +85e9 1f 87 4 +FUNC 8610 22 0 google_breakpad::TypedMDRVA::~TypedMDRVA() +8610 6 216 9 +8616 1c 92 8 +FUNC 8640 22 0 google_breakpad::TypedMDRVA::~TypedMDRVA() +8640 9 216 9 +8649 19 92 8 +FUNC 8670 22 0 google_breakpad::TypedMDRVA::~TypedMDRVA() +8670 6 216 9 +8676 1c 92 8 +FUNC 86a0 22 0 google_breakpad::TypedMDRVA::~TypedMDRVA() +86a0 6 216 9 +86a6 1c 92 8 +FUNC 86d0 229 0 std::vector >::reserve(unsigned long) +86d0 a 69 44 +86da 25 66 44 +86ff 9 69 44 +8708 4 42 6 +870c e 707 43 +871a 5 71 44 +871f 29 86 44 +8748 4 42 6 +874c 2 169 43 +874e 4 42 6 +8752 7 626 43 +8759 3 169 43 +875c 5 626 43 +8761 2 169 43 +8763 8 162 12 +876b 4 71 12 +876f 1c 74 12 +878b 2 75 12 +878d 2 76 12 +878f 3 75 12 +8792 8 77 12 +879a 4 76 12 +879e 12 245 42 +87b0 13 120 46 +87c3 d 245 42 +87d0 5 83 44 +87d5 4 84 44 +87d9 5 82 44 +87de 7 83 44 +87e5 3 84 44 +87e8 5 83 44 +87ed 13 84 44 +8800 e 86 12 +880e e 2816 15 +881c 3 86 12 +881f 5 2816 15 +8824 9 86 12 +882d 30 2816 15 +885d b 89 12 +8868 8 120 12 +8870 9 124 12 +8879 4 125 12 +887d 5 93 12 +8882 3 124 12 +8885 3 125 12 +8888 3 93 12 +888b 4 126 12 +888f 16 93 12 +88a5 5 94 12 +88aa 4 93 12 +88ae 11 94 12 +88bf 5 96 12 +88c4 4 94 12 +88c8 10 96 12 +88d8 8 78 12 +88e0 d 79 12 +88ed c 70 44 +FUNC 8900 357 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, MDMemoryDescriptor const&) +8900 28 316 44 +8928 8 320 44 +8930 3 316 44 +8933 2 320 44 +8935 14 120 46 +8949 4 329 44 +894d 4 325 44 +8951 7 327 44 +8958 3 559 38 +895b 4 325 44 +895f 4 327 44 +8963 4 559 38 +8967 5 560 38 +896c f 561 38 +897b a 333 44 +8985 2b 391 44 +89b0 4 42 6 +89b4 a 626 43 +89be 9 215 38 +89c7 4 1308 43 +89cb 9 1309 43 +89d4 3 900 39 +89d7 d 162 12 +89e4 3 900 39 +89e7 4 162 12 +89eb 8 342 44 +89f3 23 74 12 +8a16 3 75 12 +8a19 2 76 12 +8a1b 3 75 12 +8a1e 8 77 12 +8a26 8 76 12 +8a2e 8 351 44 +8a36 13 120 46 +8a49 f 245 42 +8a58 13 120 46 +8a6b d 245 42 +8a78 13 316 44 +8a8b 15 245 42 +8aa0 13 120 46 +8ab3 d 245 42 +8ac0 10 316 44 +8ad0 4 387 44 +8ad4 5 389 44 +8ad9 4 388 44 +8add 13 389 44 +8af0 3 900 39 +8af3 d 162 12 +8b00 3 900 39 +8b03 5 162 12 +8b08 10 342 44 +8b18 7 86 12 +8b1f 2 2816 15 +8b21 7 86 12 +8b28 d 2816 15 +8b35 3 86 12 +8b38 5 2816 15 +8b3d 9 86 12 +8b46 30 2816 15 +8b76 17 89 12 +8b8d 8 120 12 +8b95 9 124 12 +8b9e 4 125 12 +8ba2 5 93 12 +8ba7 3 124 12 +8baa 3 125 12 +8bad 3 93 12 +8bb0 4 126 12 +8bb4 16 93 12 +8bca 5 94 12 +8bcf 4 93 12 +8bd3 15 94 12 +8be8 b 96 12 +8bf3 8 78 12 +8bfb d 79 12 +8c08 13 1309 43 +8c1b 7 900 39 +8c22 6 169 43 +8c28 8 900 39 +8c30 2 169 43 +8c32 4 342 44 +8c36 3 169 43 +8c39 4 342 44 +8c3d 6 169 43 +8c43 7 162 12 +8c4a d 71 12 +FUNC 8c60 17f 0 char* std::vector >::_M_allocate_and_copy(unsigned long, char*, char*) +8c60 2 1106 43 +8c62 2 169 43 +8c64 12 1106 43 +8c76 5 169 43 +8c7b 2 71 12 +8c7d 5 162 12 +8c82 2 71 12 +8c84 1e 74 12 +8ca2 2 75 12 +8ca4 2 76 12 +8ca6 3 75 12 +8ca9 8 77 12 +8cb1 5 76 12 +8cb6 a 245 42 +8cc0 a 120 46 +8cca d 245 42 +8cd7 19 1121 43 +8cf0 c 86 12 +8cfc f 2816 15 +8d0b 3 86 12 +8d0e 8 2816 15 +8d16 9 86 12 +8d1f 3b 2816 15 +8d5a e 89 12 +8d68 6 120 12 +8d6e 5 124 12 +8d73 8 93 12 +8d7b 3 124 12 +8d7e 4 125 12 +8d82 5 93 12 +8d87 3 125 12 +8d8a 5 93 12 +8d8f 5 126 12 +8d94 8 93 12 +8d9c 5 94 12 +8da1 5 93 12 +8da6 14 94 12 +8dba e 96 12 +8dc8 9 78 12 +8dd1 e 79 12 +FUNC 8de0 3cd 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, char const&) +8de0 11 439 44 +8df1 c 442 44 +8dfd 1b 444 44 +8e18 3 900 39 +8e1b 4 447 44 +8e1f 3 900 39 +8e22 9 450 44 +8e2b 6 452 44 +8e31 f 245 42 +8e40 b 120 46 +8e4b 12 245 42 +8e5d 3 456 44 +8e60 3 560 38 +8e63 5 456 44 +8e68 2 560 38 +8e6a b 561 38 +8e75 b 697 38 +8e80 9 86 12 +8e89 9 2816 15 +8e92 a 86 12 +8e9c 6 2816 15 +8ea2 3 86 12 +8ea5 5 2816 15 +8eaa 9 86 12 +8eb3 24 2816 15 +8ed7 c 120 12 +8ee3 9 124 12 +8eec 4 93 12 +8ef0 4 124 12 +8ef4 3 93 12 +8ef7 3 124 12 +8efa 4 125 12 +8efe 5 93 12 +8f03 4 125 12 +8f07 4 126 12 +8f0b 16 93 12 +8f21 5 94 12 +8f26 4 93 12 +8f2a 15 94 12 +8f3f 5 96 12 +8f44 4 94 12 +8f48 4 96 12 +8f4c 8 486 44 +8f54 c 439 44 +8f60 c 120 46 +8f6c 9 321 42 +8f75 5 491 44 +8f7a 16 245 42 +8f90 a 120 46 +8f9a d 245 42 +8fa7 9 439 44 +8fb0 5 498 44 +8fb5 3 496 44 +8fb8 10 245 42 +8fc8 a 120 46 +8fd2 d 245 42 +8fdf 6 439 44 +8fe5 5 520 44 +8fea 5 522 44 +8fef 5 521 44 +8ff4 5 522 44 +8ff9 17 525 44 +9010 9 321 42 +9019 4 439 44 +901d 3 444 44 +9020 8 120 46 +9028 e 321 42 +9036 3 468 44 +9039 3 245 42 +903c 5 468 44 +9041 f 245 42 +9050 b 120 46 +905b 12 245 42 +906d 8 472 44 +9075 4 525 44 +9079 7 697 38 +9080 a 525 44 +908a 6 697 38 +9090 8 626 43 +9098 f 1305 43 +90a7 a 1308 43 +90b1 5 1309 43 +90b6 3 900 39 +90b9 4 162 12 +90bd 9 1309 43 +90c6 3 900 39 +90c9 4 162 12 +90cd 5 900 39 +90d2 4 162 12 +90d6 28 74 12 +90fe 3 75 12 +9101 2 76 12 +9103 3 75 12 +9106 4 77 12 +910a e 76 12 +9118 3 900 39 +911b c 169 43 +9127 3 900 39 +912a 3 169 43 +912d 5 900 39 +9132 6 169 43 +9138 4 162 12 +913c 2 71 12 +913e 2 162 12 +9140 5 71 12 +9145 4 162 12 +9149 f 71 12 +9158 10 2816 15 +9168 8 89 12 +9170 c 78 12 +917c d 79 12 +9189 8 245 42 +9191 8 444 44 +9199 8 241 42 +91a1 c 1306 43 +FUNC 91b0 1a 0 google_breakpad::MinidumpFileWriter::MinidumpFileWriter() +91b0 1a 55 24 +FUNC 91d0 87 0 google_breakpad::MinidumpFileWriter::Open(char const*) +91d0 e 63 24 +91de 3 64 24 +91e1 3 63 24 +91e4 5 64 24 +91e9 2c 2711 15 +9215 2 66 24 +9217 21 72 24 +9238 1f 64 24 +FUNC 9260 2c 0 google_breakpad::MinidumpFileWriter::SetFile(int) +9260 5 75 24 +9265 2 76 24 +9267 5 77 24 +926c 7 75 24 +9273 1 74 24 +9274 18 75 24 +FUNC 9290 78 0 google_breakpad::MinidumpFileWriter::Close() +9290 16 80 24 +92a6 2 83 24 +92a8 5 81 24 +92ad 5 83 24 +92b2 3 84 24 +92b5 2 85 24 +92b7 a 84 24 +92c1 20 2629 15 +92e1 6 92 24 +92e7 21 96 24 +FUNC 9310 15 0 google_breakpad::MinidumpFileWriter::~MinidumpFileWriter() +9310 10 59 24 +9320 5 60 24 +FUNC 9330 d6 0 google_breakpad::MinidumpFileWriter::Allocate(unsigned long) +9330 18 220 24 +9348 5 221 24 +934d 10 222 24 +935d 3 225 24 +9360 4 223 24 +9364 4 225 24 +9368 4 223 24 +936c a 225 24 +9376 5 241 24 +937b 1d 244 24 +9398 7 227 24 +939f 3 234 24 +93a2 a 233 24 +93ac a 234 24 +93b6 5 235 24 +93bb 4 234 24 +93bf 9 237 24 +93c8 1f 221 24 +93e7 1f 222 24 +FUNC 9410 fa 0 google_breakpad::MinidumpFileWriter::Copy(unsigned int, void const*, long) +9410 9 246 24 +9419 9 247 24 +9422 f 248 24 +9431 8 249 24 +9439 c 252 24 +9445 2 267 24 +9447 9 268 24 +9450 14 2699 15 +9464 5 257 24 +9469 1b 2773 15 +9484 c 258 24 +9490 b 2699 15 +949b 12 2773 15 +94ad 1f 249 24 +94cc 1f 248 24 +94eb 1f 247 24 +FUNC 9510 a8 0 google_breakpad::MinidumpFileWriter::CopyStringToMDString(wchar_t const*, unsigned int, google_breakpad::TypedMDRVA*) +9510 e 100 24 +951e 1a 110 24 +9538 3 116 24 +953b 4 117 24 +953f 6 122 24 +9545 8 284 24 +954d 16 122 24 +9563 7 83 8 +956a 3 87 8 +956d 3 125 24 +9570 12 87 8 +9582 8 110 24 +958a c 111 24 +9596 7 112 24 +959d 2 113 24 +959f d 129 24 +95ac 5 101 24 +95b1 7 128 24 +FUNC 95c0 aa 0 google_breakpad::MinidumpFileWriter::CopyStringToMDString(char const*, unsigned int, google_breakpad::TypedMDRVA*) +95c0 e 133 24 +95ce 1a 139 24 +95e8 2 145 24 +95ea 2 146 24 +95ec 4 284 24 +95f0 3 146 24 +95f3 6 149 24 +95f9 5 284 24 +95fe 18 149 24 +9616 8 83 8 +961e 3 87 8 +9621 3 152 24 +9624 12 87 8 +9636 8 139 24 +963e d 140 24 +964b 4 141 24 +964f 2 142 24 +9651 d 155 24 +965e c 134 24 +FUNC 9670 41 0 google_breakpad::UntypedMDRVA::Allocate(unsigned long) +9670 1 270 24 +9671 5 271 24 +9676 3 270 24 +9679 2 271 24 +967b 4 272 24 +967f 8 273 24 +9687 3 274 24 +968a 3 273 24 +968d 3 274 24 +9690 2 275 24 +9692 1f 271 24 +FUNC 96c0 88 0 google_breakpad::UntypedMDRVA::Copy(unsigned int, void const*, unsigned long) +96c0 4 277 24 +96c4 5 278 24 +96c9 5 279 24 +96ce 12 280 24 +96e0 3 281 24 +96e3 4 282 24 +96e7 5 281 24 +96ec 1e 278 24 +970a 1f 280 24 +9729 1f 279 24 +FUNC 9750 c4 0 google_breakpad::MinidumpFileWriter::WriteMemory(void const*, unsigned long, MDMemoryDescriptor*) +9750 9 204 24 +9759 9 205 24 +9762 8 206 24 +976a 7 161 9 +9771 6 209 24 +9777 d 161 9 +9784 9 209 24 +978d 4 218 24 +9791 2 210 24 +9793 d 218 24 +97a0 14 186 9 +97b4 4 211 24 +97b8 5 176 9 +97bd 3 214 24 +97c0 3 176 9 +97c3 7 215 24 +97ca 4 218 24 +97ce 5 217 24 +97d3 3 218 24 +97d6 1f 206 24 +97f5 1f 205 24 +FUNC 9820 5 0 google_breakpad::MinidumpFileWriter::WriteString(char const*, unsigned int, MDLocationDescriptor*) +9820 5 200 24 +FUNC 9830 5 0 google_breakpad::MinidumpFileWriter::WriteString(wchar_t const*, unsigned int, MDLocationDescriptor*) +9830 5 195 24 +FUNC 9840 22 0 google_breakpad::TypedMDRVA::~TypedMDRVA() +9840 6 216 9 +9846 1c 92 8 +FUNC 9870 1e8 0 bool google_breakpad::MinidumpFileWriter::WriteStringCore(char const*, unsigned int, MDLocationDescriptor*) +9870 f 158 24 +987f 9 161 24 +9888 c 162 24 +9894 d 167 24 +98a1 9 168 24 +98aa 8 161 9 +98b2 5 212 9 +98b7 9 161 9 +98c0 11 212 9 +98d1 4 161 9 +98d5 5 68 8 +98da 8 67 8 +98e2 5 68 8 +98e7 4 173 24 +98eb 4 177 24 +98ef d 179 24 +98fc 5 177 24 +9901 5 179 24 +9906 8 182 24 +990e 2 174 24 +9910 7 216 9 +9917 18 92 8 +992f 11 191 24 +9940 10 158 24 +9950 7 168 24 +9957 11 161 9 +9968 17 212 9 +997f 4 161 9 +9983 3 173 24 +9986 1e 66 8 +99a4 c 168 24 +99b0 5 83 8 +99b5 7 183 24 +99bc 9 184 24 +99c5 2 83 8 +99c7 14 87 8 +99db 2 186 24 +99dd 2 87 8 +99df 6 186 24 +99e5 9 176 9 +99ee 12 187 24 +9a00 15 190 24 +9a15 1f 162 24 +9a34 24 161 24 +FUNC 9a60 1e8 0 bool google_breakpad::MinidumpFileWriter::WriteStringCore(wchar_t const*, unsigned int, MDLocationDescriptor*) +9a60 f 158 24 +9a6f 9 161 24 +9a78 f 162 24 +9a87 2 168 24 +9a89 a 167 24 +9a93 8 168 24 +9a9b 8 161 9 +9aa3 5 212 9 +9aa8 9 161 9 +9ab1 11 212 9 +9ac2 4 161 9 +9ac6 5 68 8 +9acb 8 67 8 +9ad3 5 68 8 +9ad8 4 173 24 +9adc 4 177 24 +9ae0 d 179 24 +9aed 5 177 24 +9af2 5 179 24 +9af7 8 182 24 +9aff 2 174 24 +9b01 7 216 9 +9b08 18 92 8 +9b20 10 191 24 +9b30 10 158 24 +9b40 7 168 24 +9b47 11 161 9 +9b58 17 212 9 +9b6f 4 161 9 +9b73 3 173 24 +9b76 1e 66 8 +9b94 c 168 24 +9ba0 5 83 8 +9ba5 7 183 24 +9bac 9 184 24 +9bb5 2 83 8 +9bb7 14 87 8 +9bcb 2 186 24 +9bcd 2 87 8 +9bcf 6 186 24 +9bd5 9 176 9 +9bde 12 187 24 +9bf0 15 190 24 +9c05 1f 162 24 +9c24 24 161 24 +FUNC 9c50 78 0 google_breakpad::UTF8ToUTF16Char(char const*, int, unsigned short*) +9c50 2 58 32 +9c52 6 78 32 +9c58 2 58 32 +9c5a 4 62 32 +9c5e 5 58 32 +9c63 4 60 32 +9c67 4 58 32 +9c6b b 63 32 +9c76 4 59 32 +9c7a 6 61 32 +9c80 16 69 32 +9c96 4 71 32 +9c9a 4 76 32 +9c9e 4 75 32 +9ca2 5 78 32 +9ca7 4 83 32 +9cab 2 82 32 +9cad b 83 32 +9cb8 3 72 32 +9cbb 5 83 32 +9cc0 2 72 32 +9cc2 6 83 32 +FUNC 9cd0 56 0 google_breakpad::UTF32ToUTF16Char(wchar_t, unsigned short*) +9cd0 4 102 32 +9cd4 3 110 32 +9cd7 4 106 32 +9cdb 4 102 32 +9cdf b 107 32 +9cea 5 103 32 +9cef 4 102 32 +9cf3 a 110 32 +9cfd 5 105 32 +9d02 5 103 32 +9d07 5 104 32 +9d0c 5 110 32 +9d11 4 112 32 +9d15 b 113 32 +9d20 6 115 32 +FUNC 9d30 147 0 google_breakpad::UTF16ToUTF8(std::vector > const&, bool) +9d30 12 121 32 +9d42 3 155 32 +9d45 2 126 32 +9d47 4 626 43 +9d4b 5 122 32 +9d50 9 126 32 +9d59 2 71 14 +9d5b 6 626 43 +9d61 8 139 32 +9d69 4 138 32 +9d6d 8 140 32 +9d75 4 142 32 +9d79 10 145 32 +9d89 3 140 32 +9d8c 5 141 32 +9d91 5 145 32 +9d96 2 147 32 +9d98 5 149 32 +9d9d 2 147 32 +9d9f b 149 32 +9daa d 164 14 +9db7 8 75 14 +9dbf 11 153 32 +9dd0 18 152 32 +9de8 3 626 43 +9deb 9 128 32 +9df4 3 81 14 +9df7 3 128 32 +9dfa 2 81 14 +9dfc 7 82 14 +9e03 c 155 32 +9e0f 11 130 32 +9e20 7 132 32 +9e27 f 118 32 +9e36 5 130 32 +9e3b 5 134 32 +9e40 3 155 32 +9e43 b 134 32 +9e4e 2 71 14 +9e50 10 75 14 +9e60 17 164 14 +FUNC 9e80 e3 0 google_breakpad::UTF8ToUTF16(char const*, std::vector >*) +9e80 c 41 32 +9e8c 5 42 32 +9e91 3 1097 43 +9e94 b 1004 43 +9e9f 5 43 32 +9ea4 7 47 32 +9eab 3 44 32 +9eae 4 1320 43 +9eb2 5 1004 43 +9eb7 3 155 32 +9eba 4 707 43 +9ebe b 52 32 +9ec9 3 707 43 +9ecc 5 48 32 +9ed1 3 707 43 +9ed4 4 49 32 +9ed8 a 52 32 +9ee2 2 55 32 +9ee4 3 155 32 +9ee7 2 55 32 +9ee9 5 55 32 +9eee b 155 32 +9ef9 3 55 32 +9efc 3 626 43 +9eff 3 55 32 +9f02 6 626 43 +9f08 4 55 32 +9f0c 3 686 43 +9f0f 3 626 43 +9f12 2 686 43 +9f14 5 688 43 +9f19 8 689 43 +9f21 f 56 32 +9f30 3 687 43 +9f33 d 1004 43 +9f40 10 56 32 +9f50 4 626 43 +9f54 2 55 32 +9f56 6 626 43 +9f5c 7 688 43 +FUNC 9f70 e3 0 google_breakpad::UTF32ToUTF16(wchar_t const*, std::vector >*) +9f70 c 85 32 +9f7c 5 86 32 +9f81 3 1097 43 +9f84 b 1004 43 +9f8f 5 87 32 +9f94 7 91 32 +9f9b 5 88 32 +9fa0 4 1320 43 +9fa4 5 1004 43 +9fa9 3 155 32 +9fac 4 707 43 +9fb0 b 96 32 +9fbb 3 707 43 +9fbe 5 92 32 +9fc3 3 707 43 +9fc6 4 93 32 +9fca a 96 32 +9fd4 2 99 32 +9fd6 3 155 32 +9fd9 2 99 32 +9fdb 5 99 32 +9fe0 b 155 32 +9feb 3 99 32 +9fee 3 626 43 +9ff1 3 99 32 +9ff4 6 626 43 +9ffa 4 99 32 +9ffe 3 686 43 +a001 3 626 43 +a004 2 686 43 +a006 5 688 43 +a00b 8 689 43 +a013 d 100 32 +a020 3 687 43 +a023 d 1004 43 +a030 10 100 32 +a040 4 626 43 +a044 2 99 32 +a046 6 626 43 +a04c 7 688 43 +FUNC a060 295 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned short const&) +a060 25 439 44 +a085 9 442 44 +a08e 1d 444 44 +a0ab 3 900 39 +a0ae 3 447 44 +a0b1 6 900 39 +a0b7 9 450 44 +a0c0 3 464 44 +a0c3 d 743 38 +a0d0 3 745 38 +a0d3 a 743 38 +a0dd 8 468 44 +a0e5 3 365 38 +a0e8 4 468 44 +a0ec 6 365 38 +a0f2 3 472 44 +a0f5 3 686 38 +a0f8 4 472 44 +a0fc c 686 38 +a108 7 687 38 +a10f 5 686 38 +a114 2c 525 44 +a140 3 155 32 +a143 d 1305 43 +a150 6 626 43 +a156 c 1305 43 +a162 6 1308 43 +a168 3 900 39 +a16b 4 1308 43 +a16f 3 900 39 +a172 3 480 44 +a175 9 1309 43 +a17e 7 480 44 +a185 19 94 46 +a19e 5 486 44 +a1a3 d 155 32 +a1b0 4 745 38 +a1b4 a 743 38 +a1be 3 364 38 +a1c1 3 365 38 +a1c4 3 364 38 +a1c7 5 365 38 +a1cc f 366 38 +a1db 4 364 38 +a1df 3 367 38 +a1e2 4 496 44 +a1e6 3 365 38 +a1e9 3 364 38 +a1ec 5 365 38 +a1f1 12 366 38 +a203 4 517 44 +a207 3 367 38 +a20a 5 174 43 +a20f 5 100 46 +a214 3 522 44 +a217 4 520 44 +a21b 4 521 44 +a21f 11 522 44 +a230 20 366 38 +a250 3 452 44 +a253 3 364 38 +a256 3 444 44 +a259 3 365 38 +a25c 3 364 38 +a25f 5 365 38 +a264 12 366 38 +a276 3 559 38 +a279 3 456 44 +a27c 3 559 38 +a27f 4 456 44 +a283 5 560 38 +a288 12 561 38 +a29a 3 459 44 +a29d 13 686 38 +a2b0 7 687 38 +a2b7 11 686 38 +a2c8 9 1309 43 +a2d1 e 169 43 +a2df 16 1306 43 +FUNC a300 73 0 CreateGUID(MDGUID*) +a300 1 87 28 +a301 7 75 28 +a308 3 87 28 +a30b c 75 28 +a317 7 65 28 +a31e 9 66 28 +a327 9 67 28 +a330 7 68 28 +a337 3 57 28 +a33a 6 58 28 +a340 2 59 28 +a342 3 60 28 +a345 3 59 28 +a348 3 60 28 +a34b 3 59 28 +a34e 7 69 28 +a355 3 57 28 +a358 6 58 28 +a35e 2 59 28 +a360 3 60 28 +a363 3 59 28 +a366 3 60 28 +a369 3 59 28 +a36c 7 89 28 +FUNC a380 ad 0 GUIDToString(MDGUID const*, char*, int) +a380 5 92 28 +a385 9 94 28 +a38e b 53 28 +a399 3 98 28 +a39c 4 53 28 +a3a0 a 98 28 +a3aa 13 53 28 +a3bd 4 98 28 +a3c1 1a 53 28 +a3db 7 98 28 +a3e2 5 53 28 +a3e7 f 98 28 +a3f6 2 100 28 +a3f8 5 99 28 +a3fd 4 102 28 +a401 5 103 28 +a406 8 104 28 +a40e 1f 94 28 +FUNC a430 16 0 GUIDGenerator::InitOnceImpl() +a430 4 78 28 +a434 7 79 28 +a43b 4 80 28 +a43f 7 79 28 +FUNC a450 1e 0 my_strlen +a450 10 42 29 +a460 c 42 29 +a46c 2 44 29 +FUNC a470 33 0 my_strcmp +a470 8 46 29 +a478 2 50 29 +a47a 4 52 29 +a47e 4 54 29 +a482 4 55 29 +a486 7 48 29 +a48d b 49 29 +a498 8 51 29 +a4a0 2 53 29 +a4a2 1 57 29 +FUNC a4b0 56 0 my_strncmp +a4b0 5 60 29 +a4b5 7 61 29 +a4bc 2 63 29 +a4be 12 65 29 +a4d0 9 61 29 +a4d9 2 63 29 +a4db 4 65 29 +a4df 9 60 29 +a4e8 2 71 29 +a4ea 6 72 29 +a4f0 10 62 29 +a500 6 64 29 +FUNC a510 54 0 my_strtoui +a510 3 79 29 +a513 2 80 29 +a515 4 79 29 +a519 8 87 29 +a521 f 89 29 +a530 7 86 29 +a537 8 87 29 +a53f 5 89 29 +a544 4 90 29 +a548 2 89 29 +a54a 4 82 29 +a54e 7 83 29 +a555 2 94 29 +a557 9 95 29 +a560 2 80 29 +a562 2 96 29 +FUNC a570 36 0 my_uint_len +a570 3 100 29 +a573 3 99 29 +a576 5 101 29 +a57b 4 100 29 +a57f 14 106 29 +a593 3 105 29 +a596 7 106 29 +a59d 5 104 29 +a5a2 2 109 29 +a5a4 2 110 29 +FUNC a5b0 43 0 my_uitos +a5b0 5 119 29 +a5b5 a 120 29 +a5bf 9 119 29 +a5c8 1d 120 29 +a5e5 3 119 29 +a5e8 4 120 29 +a5ec 7 119 29 +FUNC a600 42 0 my_strchr +a600 3 124 29 +a603 3 123 29 +a606 4 124 29 +a60a 16 128 29 +a620 8 124 29 +a628 4 125 29 +a62c 7 124 29 +a633 f 124 29 +FUNC a650 26 0 my_strrchr +a650 10 133 29 +a660 7 134 29 +a667 4 136 29 +a66b 9 133 29 +a674 2 139 29 +FUNC a680 32 0 my_memchr +a680 3 143 29 +a683 5 144 29 +a688 17 145 29 +a69f 9 144 29 +a6a8 8 148 29 +a6b0 2 149 29 +FUNC a6c0 64 0 my_read_hex_ptr +a6c0 3 155 29 +a6c3 d 156 29 +a6d0 3 161 29 +a6d3 4 160 29 +a6d7 6 161 29 +a6dd 4 158 29 +a6e1 b 159 29 +a6ec 8 162 29 +a6f4 3 164 29 +a6f7 4 163 29 +a6fb d 164 29 +a708 8 165 29 +a710 3 167 29 +a713 4 166 29 +a717 9 167 29 +a720 3 173 29 +a723 1 175 29 +FUNC a730 3a 0 my_read_decimal_ptr +a730 3 181 29 +a733 3 177 29 +a736 12 181 29 +a748 3 183 29 +a74b 4 182 29 +a74f 4 180 29 +a753 7 183 29 +a75a c 181 29 +a766 3 188 29 +a769 1 190 29 +FUNC a770 1e 0 my_memset +a770 3 194 29 +a773 4 192 29 +a777 9 194 29 +a780 7 195 29 +a787 7 194 29 +FUNC a790 38 0 my_strlcpy +a790 10 202 29 +a7a0 9 203 29 +a7a9 7 204 29 +a7b0 4 207 29 +a7b4 8 202 29 +a7bc 5 209 29 +a7c1 5 210 29 +a7c6 2 213 29 +FUNC a7d0 3e 0 my_strlcat +a7d0 1 215 29 +a7d1 2 216 29 +a7d3 d 218 29 +a7e0 4 219 29 +a7e4 5 218 29 +a7e9 7 225 29 +a7f0 6 218 29 +a7f6 5 221 29 +a7fb e 224 29 +a809 5 225 29 +FUNC a810 4e 0 my_isspace +a810 a 229 29 +a81a a 227 29 +a824 a 229 29 +a82e 19 227 29 +a847 4 231 29 +a84b 5 230 29 +a850 2 234 29 +a852 6 235 29 +a858 6 232 29 +FUNC a860 1aa 0 google_breakpad::CrashGenerationClient::RequestDump(void const*, unsigned long) +a860 5 46 16 +a865 a 2795 15 +a86f 5 46 16 +a874 3 2795 15 +a877 5 46 16 +a87c 2 2795 15 +a87e 9 46 16 +a887 1e 2795 15 +a8a5 c 52 16 +a8b1 5 60 16 +a8b6 8 52 16 +a8be 5 57 16 +a8c3 a 60 16 +a8cd 5 54 16 +a8d2 5 55 16 +a8d7 5 57 16 +a8dc 9 58 16 +a8e5 6 2785 15 +a8eb 5 60 16 +a8f0 4 69 16 +a8f4 8 61 16 +a8fc 3 2785 15 +a8ff c 62 16 +a90b 8 65 16 +a913 8 66 16 +a91b 9 67 16 +a924 4 69 16 +a928 19 2785 15 +a941 9 2785 15 +a94a 5 71 16 +a94f 5 71 16 +a954 24 2629 15 +a978 9 73 16 +a981 7 2724 15 +a988 14 2724 15 +a99c 7 81 16 +a9a3 5 80 16 +a9a8 10 81 16 +a9b8 5 71 16 +a9bd 13 45 16 +a9d0 10 2724 15 +a9e0 3 78 16 +a9e3 2 2724 15 +a9e5 13 78 16 +a9f8 7 81 16 +a9ff 2 74 16 +aa01 9 81 16 +FUNC aa10 1c 0 google_breakpad::CrashGenerationClient::TryCreate(int) +aa10 2 87 16 +aa12 1 86 16 +aa13 2 86 16 +aa15 2 87 16 +aa17 a 89 16 +aa21 2 56 1 +aa23 5 90 16 +aa28 2 88 16 +aa2a 2 90 16 +FUNC aa30 67 0 google_breakpad::LinuxDumper::~LinuxDumper() +aa30 8 85 21 +aa38 6 2701 15 +aa3e 6 85 21 +aa44 e 85 21 +aa52 4 338 21 +aa56 a 134 12 +aa60 4 136 12 +aa64 3 135 12 +aa67 1d 2701 15 +aa84 8 134 12 +aa8c b 86 21 +FUNC aaa0 12 0 google_breakpad::LinuxDumper::~LinuxDumper() +aaa0 1 85 21 +aaa1 3 85 21 +aaa4 e 86 21 +FUNC aac0 105 0 google_breakpad::LinuxDumper::ReadAuxv() +aac0 2 139 21 +aac2 7 141 21 +aac9 c 139 21 +aad5 15 141 21 +aaea 2 147 21 +aaec 14 163 21 +ab00 28 2711 15 +ab28 4 146 21 +ab2c 8 154 21 +ab34 2 146 21 +ab36 a 2724 15 +ab40 10 2724 15 +ab50 6 152 21 +ab56 1b 2629 15 +ab71 f 163 21 +ab80 a 152 21 +ab8a 6 156 21 +ab90 d 157 21 +ab9d 5 158 21 +aba2 e 157 21 +abb0 15 2724 15 +FUNC abd0 32 0 google_breakpad::LinuxDumper::Init() +abd0 1 88 21 +abd1 3 88 21 +abd4 9 89 21 +abdd b 90 21 +abe8 d 89 21 +abf5 6 89 21 +abfb 1 90 21 +abfc 6 89 21 +FUNC ac10 4c 0 google_breakpad::LinuxDumper::FindMapping(void const*) const +ac10 4 338 21 +ac14 b 626 43 +ac1f 11 292 21 +ac30 7 293 21 +ac37 5 294 21 +ac3c 14 294 21 +ac50 9 292 21 +ac59 2 298 21 +ac5b 1 299 21 +FUNC ac60 94 0 google_breakpad::LinuxDumper::GetStackInfo(void const**, unsigned long*, unsigned long) +ac60 23 265 21 +ac83 6 265 21 +ac89 8 267 21 +ac91 3 275 21 +ac94 6 270 21 +ac9a 8 275 21 +aca2 5 276 21 +aca7 6 279 21 +acad 4 281 21 +acb1 5 283 21 +acb6 3 281 21 +acb9 a 283 21 +acc3 5 285 21 +acc8 4 283 21 +accc 4 284 21 +acd0 20 286 21 +acf0 4 277 21 +FUNC ad00 1fd 0 google_breakpad::LinuxDumper::HandleDeletedFileInMapping(char*) const +ad00 17 301 21 +ad17 3 306 21 +ad1a 7 301 21 +ad21 3 301 21 +ad24 5 306 21 +ad29 6 307 21 +ad2f 2 308 21 +ad31 2f 336 21 +ad60 5 309 21 +ad65 11 310 21 +ad76 4 309 21 +ad7a 23 317 21 +ad9d 8 319 21 +ada5 10 60 11 +adb5 8 319 21 +adbd 13 321 21 +add0 5 2764 15 +add5 3 327 21 +add8 1d 2764 15 +adf5 5a 334 21 +ae4f a 335 21 +ae59 4 327 21 +ae5d 8 328 21 +ae65 20 2764 15 +ae85 8 327 21 +ae8d 12 327 21 +ae9f 18 327 21 +aeb7 46 334 21 +FUNC af00 35d 0 google_breakpad::LinuxDumper::ElfFileIdentifierForMapping(google_breakpad::MappingInfo const&, bool, unsigned int, unsigned char*) +af00 2b 96 21 +af2b 2 97 21 +af2d 9 96 21 +af36 2 97 21 +af38 8 626 43 +af40 3 97 21 +af43 4 626 43 +af47 9 97 21 +af50 a 98 21 +af5a 4 64 21 +af5e 5 98 21 +af63 14 64 21 +af77 2 100 21 +af79 4 99 21 +af7d 43 137 21 +afc0 1c 103 21 +afdc 4 105 21 +afe0 20 2660 15 +b000 9 105 21 +b009 3 106 21 +b00c 14 113 21 +b020 c 117 21 +b02c 6 118 21 +b032 3 117 21 +b035 b 118 21 +b040 14 121 21 +b054 8 123 21 +b05c 6 122 21 +b062 5 123 21 +b067 a 125 21 +b071 3 123 21 +b074 5 125 21 +b079 5 338 21 +b07e a 126 21 +b088 8 130 21 +b090 2 131 21 +b092 2 130 21 +b094 2 131 21 +b096 5 131 21 +b09b 5 131 21 +b0a0 10 133 21 +b0b0 20 136 21 +b0d0 4 108 21 +b0d4 3 71 12 +b0d7 3 108 21 +b0da 6 71 12 +b0e0 1c 74 12 +b0fc c 86 12 +b108 f 2816 15 +b117 3 86 12 +b11a 5 2816 15 +b11f 9 86 12 +b128 36 2816 15 +b15e e 89 12 +b16c 1c 111 21 +b188 3 75 12 +b18b 2 76 12 +b18d 3 75 12 +b190 4 77 12 +b194 5 76 12 +b199 6 120 12 +b19f 4 124 12 +b1a3 7 93 12 +b1aa 3 124 12 +b1ad 4 125 12 +b1b1 5 93 12 +b1b6 3 125 12 +b1b9 5 93 12 +b1be 4 126 12 +b1c2 8 93 12 +b1ca 5 94 12 +b1cf 3 93 12 +b1d2 13 94 12 +b1e5 9 96 12 +b1ee 7 78 12 +b1f5 d 79 12 +b202 8 72 12 +b20a 1f 97 21 +b229 1f 118 21 +b248 15 136 21 +FUNC b260 1a9 0 google_breakpad::LinuxDumper::LinuxDumper(int) +b260 17 72 21 +b277 4 79 21 +b27b 9 72 21 +b284 23 79 21 +b2a7 5 60 12 +b2ac 4 190 12 +b2b0 1a 63 12 +b2ca 5 190 12 +b2cf 4 153 12 +b2d3 18 92 43 +b2eb 5 190 12 +b2f0 4 190 12 +b2f4 4 153 12 +b2f8 18 92 43 +b310 a 190 12 +b31a 7 190 12 +b321 7 153 12 +b328 21 92 43 +b349 d 190 12 +b356 17 338 21 +b36d a 626 43 +b377 6 686 43 +b37d 6 688 43 +b383 e 689 43 +b391 1f 83 21 +b3b0 5 687 43 +b3b5 8 1004 43 +b3bd 3 687 43 +b3c0 7 1004 43 +b3c7 7 338 21 +b3ce 6 2701 15 +b3d4 5 134 12 +b3d9 3 136 12 +b3dc 3 135 12 +b3df 1d 2701 15 +b3fc d 72 21 +FUNC b410 7b2 0 google_breakpad::LinuxDumper::EnumerateMappings() +b410 2 165 21 +b412 7 167 21 +b419 12 165 21 +b42b 18 167 21 +b443 2 186 21 +b445 12 259 21 +b457 7 338 21 +b45e 8 2711 15 +b466 7 178 21 +b46d 4 182 21 +b471 5 178 21 +b476 5 182 21 +b47b 1d 2711 15 +b498 2 185 21 +b49a 4 2711 15 +b49e 2 185 21 +b4a0 4 74 12 +b4a4 4 187 21 +b4a8 4 74 12 +b4ac 5 187 21 +b4b1 1d 74 12 +b4ce 2 75 12 +b4d0 5 76 12 +b4d5 3 75 12 +b4d8 8 77 12 +b4e0 4 76 12 +b4e4 3 82 12 +b4e7 9 49 4 +b4f0 2 191 21 +b4f2 16 49 4 +b508 f 66 4 +b517 5 99 4 +b51c 3 2724 15 +b51f 5 98 4 +b524 3 99 4 +b527 10 2724 15 +b537 6 100 4 +b53d a 102 4 +b547 5 103 4 +b54c 4 66 4 +b550 15 70 4 +b565 13 165 21 +b578 10 70 4 +b588 7 69 4 +b58f 16 78 4 +b5a5 20 2629 15 +b5c5 21 258 21 +b5e6 3 71 4 +b5e9 4 73 4 +b5ed 6 71 4 +b5f3 d 194 21 +b600 5 195 21 +b605 e 116 4 +b613 2 117 4 +b615 8 118 4 +b61d 7 117 4 +b624 14 118 4 +b638 18 105 4 +b650 e 196 21 +b65e 5 197 21 +b663 e 198 21 +b671 5 199 21 +b676 1b 203 21 +b691 9 338 21 +b69a 6 211 21 +b6a0 4 212 21 +b6a4 12 213 21 +b6b6 28 74 12 +b6de 2 75 12 +b6e0 5 76 12 +b6e5 2 77 12 +b6e7 3 76 12 +b6ea 4 82 12 +b6ee 6 77 12 +b6f4 7 222 21 +b6fb 8 221 21 +b703 5 222 21 +b708 5 223 21 +b70d 5 224 21 +b712 8 223 21 +b71a 3 224 21 +b71d 6 226 21 +b723 4 224 21 +b727 5 225 21 +b72c 3 223 21 +b72f 4 225 21 +b733 2 226 21 +b735 a 227 21 +b73f b 228 21 +b74a c 236 21 +b756 16 236 21 +b76c 4 236 21 +b770 5 338 21 +b775 5 236 21 +b77a 4 338 21 +b77e 6 236 21 +b784 4 338 21 +b788 9 236 21 +b791 3 626 43 +b794 11 243 21 +b7a5 7 626 43 +b7ac 8 243 21 +b7b4 9 686 43 +b7bd 2 688 43 +b7bf 5 1320 43 +b7c4 4 689 43 +b7c8 b 1320 43 +b7d3 20 244 21 +b7f3 d 245 21 +b800 13 244 21 +b813 15 246 21 +b828 4 86 12 +b82c 2 2816 15 +b82e 7 86 12 +b835 c 2816 15 +b841 3 86 12 +b844 5 2816 15 +b849 3 86 12 +b84c 27 2816 15 +b873 d 89 12 +b880 17 70 4 +b897 e 2724 15 +b8a5 6 120 12 +b8ab 4 93 12 +b8af 4 124 12 +b8b3 3 93 12 +b8b6 4 125 12 +b8ba 5 93 12 +b8bf 4 124 12 +b8c3 7 93 12 +b8ca 4 126 12 +b8ce 8 93 12 +b8d6 5 94 12 +b8db 4 93 12 +b8df 10 94 12 +b8ef 9 96 12 +b8f8 8 78 12 +b900 8 79 12 +b908 8 82 12 +b910 b 86 4 +b91b 8 87 4 +b923 4 92 4 +b927 3 90 4 +b92a 4 93 4 +b92e 6 90 4 +b934 17 92 4 +b94b f 883 43 +b95a 1d 120 46 +b977 1a 887 43 +b991 4 86 12 +b995 2 2816 15 +b997 7 86 12 +b99e c 2816 15 +b9aa 3 86 12 +b9ad 5 2816 15 +b9b2 9 86 12 +b9bb 31 2816 15 +b9ec c 89 12 +b9f8 23 214 21 +ba1b 9 213 21 +ba24 1a 215 21 +ba3e d 213 21 +ba4b c 216 21 +ba57 a 116 4 +ba61 2 117 4 +ba63 8 118 4 +ba6b 6 117 4 +ba71 c 118 4 +ba7d c 203 21 +ba89 10 203 21 +ba99 7 206 21 +baa0 9 207 21 +baa9 a 206 21 +bab3 1d 229 21 +bad0 7 120 46 +bad7 5 248 21 +badc 8 893 43 +bae4 4 248 21 +bae8 a 893 43 +baf2 2b 1004 43 +bb1d 1f 87 4 +bb3c 7 78 12 +bb43 d 79 12 +bb50 c 120 12 +bb5c a 124 12 +bb66 4 93 12 +bb6a 4 124 12 +bb6e 3 93 12 +bb71 3 124 12 +bb74 4 125 12 +bb78 5 93 12 +bb7d 4 125 12 +bb81 7 93 12 +bb88 4 126 12 +bb8c 8 93 12 +bb94 5 94 12 +bb99 3 93 12 +bb9c 14 94 12 +bbb0 5 96 12 +bbb5 4 94 12 +bbb9 9 96 12 +FUNC bbd0 221 0 std::vector >::reserve(unsigned long) +bbd0 a 69 44 +bbda 25 66 44 +bbff 9 69 44 +bc08 4 338 21 +bc0c e 707 43 +bc1a 5 71 44 +bc1f 29 86 44 +bc48 4 338 21 +bc4c 2 169 43 +bc4e 5 338 21 +bc53 7 626 43 +bc5a 3 169 43 +bc5d 5 626 43 +bc62 2 169 43 +bc64 a 162 12 +bc6e 4 71 12 +bc72 18 74 12 +bc8a 2 75 12 +bc8c 2 76 12 +bc8e 3 75 12 +bc91 8 77 12 +bc99 4 76 12 +bc9d 1b 245 42 +bcb8 9 120 46 +bcc1 12 245 42 +bcd3 5 83 44 +bcd8 5 82 44 +bcdd 9 83 44 +bce6 12 84 44 +bcf8 e 86 12 +bd06 e 2816 15 +bd14 3 86 12 +bd17 5 2816 15 +bd1c 9 86 12 +bd25 30 2816 15 +bd55 b 89 12 +bd60 8 120 12 +bd68 9 124 12 +bd71 4 125 12 +bd75 5 93 12 +bd7a 3 124 12 +bd7d 3 125 12 +bd80 3 93 12 +bd83 4 126 12 +bd87 16 93 12 +bd9d 5 94 12 +bda2 4 93 12 +bda6 11 94 12 +bdb7 5 96 12 +bdbc 4 94 12 +bdc0 10 96 12 +bdd0 8 78 12 +bdd8 d 79 12 +bde5 c 70 44 +FUNC be00 229 0 std::vector >::reserve(unsigned long) +be00 a 69 44 +be0a 25 66 44 +be2f 9 69 44 +be38 4 338 21 +be3c e 707 43 +be4a 5 71 44 +be4f 29 86 44 +be78 4 338 21 +be7c 2 169 43 +be7e 5 338 21 +be83 7 626 43 +be8a 3 169 43 +be8d 5 626 43 +be92 2 169 43 +be94 a 162 12 +be9e 4 71 12 +bea2 1c 74 12 +bebe 2 75 12 +bec0 2 76 12 +bec2 3 75 12 +bec5 8 77 12 +becd 4 76 12 +bed1 17 245 42 +bee8 b 120 46 +bef3 12 245 42 +bf05 5 83 44 +bf0a 5 82 44 +bf0f 9 83 44 +bf18 18 84 44 +bf30 e 86 12 +bf3e e 2816 15 +bf4c 3 86 12 +bf4f 5 2816 15 +bf54 9 86 12 +bf5d 30 2816 15 +bf8d b 89 12 +bf98 8 120 12 +bfa0 9 124 12 +bfa9 4 125 12 +bfad 5 93 12 +bfb2 3 124 12 +bfb5 3 125 12 +bfb8 3 93 12 +bfbb 4 126 12 +bfbf 16 93 12 +bfd5 5 94 12 +bfda 4 93 12 +bfde 11 94 12 +bfef 5 96 12 +bff4 4 94 12 +bff8 10 96 12 +c008 8 78 12 +c010 d 79 12 +c01d c 70 44 +FUNC c030 229 0 std::vector >::reserve(unsigned long) +c030 a 69 44 +c03a 25 66 44 +c05f 9 69 44 +c068 4 338 21 +c06c e 707 43 +c07a 5 71 44 +c07f 29 86 44 +c0a8 4 338 21 +c0ac 2 169 43 +c0ae 5 338 21 +c0b3 7 626 43 +c0ba 3 169 43 +c0bd 5 626 43 +c0c2 2 169 43 +c0c4 a 162 12 +c0ce 4 71 12 +c0d2 1c 74 12 +c0ee 2 75 12 +c0f0 2 76 12 +c0f2 3 75 12 +c0f5 8 77 12 +c0fd 4 76 12 +c101 17 245 42 +c118 b 120 46 +c123 12 245 42 +c135 5 83 44 +c13a 5 82 44 +c13f 9 83 44 +c148 18 84 44 +c160 e 86 12 +c16e e 2816 15 +c17c 3 86 12 +c17f 5 2816 15 +c184 9 86 12 +c18d 30 2816 15 +c1bd b 89 12 +c1c8 8 120 12 +c1d0 9 124 12 +c1d9 4 125 12 +c1dd 5 93 12 +c1e2 3 124 12 +c1e5 3 125 12 +c1e8 3 93 12 +c1eb 4 126 12 +c1ef 16 93 12 +c205 5 94 12 +c20a 4 93 12 +c20e 11 94 12 +c21f 5 96 12 +c224 4 94 12 +c228 10 96 12 +c238 8 78 12 +c240 d 79 12 +c24d c 70 44 +FUNC c260 320 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, google_breakpad::MappingInfo* const&) +c260 28 316 44 +c288 8 320 44 +c290 3 316 44 +c293 2 320 44 +c295 10 120 46 +c2a5 4 329 44 +c2a9 4 325 44 +c2ad 3 559 38 +c2b0 4 325 44 +c2b4 3 327 44 +c2b7 4 559 38 +c2bb 5 560 38 +c2c0 f 561 38 +c2cf 4 333 44 +c2d3 2d 391 44 +c300 8 120 46 +c308 b 626 43 +c313 9 215 38 +c31c 4 1308 43 +c320 9 1309 43 +c329 3 900 39 +c32c c 162 12 +c338 3 900 39 +c33b 4 162 12 +c33f 8 342 44 +c347 20 74 12 +c367 2 75 12 +c369 2 76 12 +c36b 3 75 12 +c36e 8 77 12 +c376 8 76 12 +c37e 8 351 44 +c386 b 120 46 +c391 4 360 44 +c395 b 245 42 +c3a0 b 120 46 +c3ab d 245 42 +c3b8 13 316 44 +c3cb 4 367 44 +c3cf 11 245 42 +c3e0 b 120 46 +c3eb d 245 42 +c3f8 10 316 44 +c408 4 387 44 +c40c 5 389 44 +c411 4 388 44 +c415 b 389 44 +c420 3 900 39 +c423 c 162 12 +c42f 3 900 39 +c432 5 162 12 +c437 11 342 44 +c448 7 86 12 +c44f 2 2816 15 +c451 7 86 12 +c458 d 2816 15 +c465 3 86 12 +c468 5 2816 15 +c46d 9 86 12 +c476 30 2816 15 +c4a6 a 89 12 +c4b0 8 120 12 +c4b8 9 124 12 +c4c1 4 125 12 +c4c5 8 93 12 +c4cd 3 124 12 +c4d0 3 125 12 +c4d3 4 126 12 +c4d7 16 93 12 +c4ed 5 94 12 +c4f2 4 93 12 +c4f6 15 94 12 +c50b e 96 12 +c519 8 78 12 +c521 d 79 12 +c52e 13 1309 43 +c541 7 900 39 +c548 6 169 43 +c54e 8 900 39 +c556 2 169 43 +c558 4 342 44 +c55c 3 169 43 +c55f 4 342 44 +c563 6 169 43 +c569 a 162 12 +c573 d 71 12 +FUNC c580 460 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, unsigned long const&) +c580 11 439 44 +c591 c 442 44 +c59d 1f 444 44 +c5bc 3 900 39 +c5bf 3 447 44 +c5c2 7 900 39 +c5c9 5 450 44 +c5ce 7 452 44 +c5d5 3 245 42 +c5d8 3 452 44 +c5db d 245 42 +c5e8 b 120 46 +c5f3 d 245 42 +c600 3 559 38 +c603 4 456 44 +c607 7 559 38 +c60e 5 456 44 +c613 9 560 38 +c61c 3 459 44 +c61f 9 686 38 +c628 7 687 38 +c62f 5 686 38 +c634 14 525 44 +c648 3 464 44 +c64b 15 321 42 +c660 8 120 46 +c668 a 321 42 +c672 4 468 44 +c676 6 245 42 +c67c 5 468 44 +c681 f 245 42 +c690 b 120 46 +c69b d 245 42 +c6a8 10 472 44 +c6b8 7 687 38 +c6bf 5 686 38 +c6c4 14 525 44 +c6d8 5 338 21 +c6dd 3 626 43 +c6e0 d 1305 43 +c6ed 7 626 43 +c6f4 c 1305 43 +c700 6 1308 43 +c706 3 900 39 +c709 4 1308 43 +c70d 3 900 39 +c710 4 480 44 +c714 3 1309 43 +c717 5 480 44 +c71c 6 1309 43 +c722 15 162 12 +c737 23 74 12 +c75a 3 75 12 +c75d 2 76 12 +c75f 3 75 12 +c762 8 77 12 +c76a e 76 12 +c778 18 561 38 +c790 e 86 12 +c79e 9 2816 15 +c7a7 5 86 12 +c7ac 6 2816 15 +c7b2 3 86 12 +c7b5 5 2816 15 +c7ba 9 86 12 +c7c3 34 2816 15 +c7f7 13 89 12 +c80a 16 486 44 +c820 c 120 46 +c82c a 321 42 +c836 12 245 42 +c848 b 120 46 +c853 d 245 42 +c860 13 439 44 +c873 3 245 42 +c876 4 496 44 +c87a e 245 42 +c888 b 120 46 +c893 d 245 42 +c8a0 10 439 44 +c8b0 5 520 44 +c8b5 5 522 44 +c8ba 5 521 44 +c8bf 5 522 44 +c8c4 14 525 44 +c8d8 9 1309 43 +c8e1 1f 169 43 +c900 c 120 12 +c90c 9 124 12 +c915 4 93 12 +c919 4 124 12 +c91d 3 93 12 +c920 3 124 12 +c923 4 125 12 +c927 5 93 12 +c92c 4 125 12 +c930 4 126 12 +c934 16 93 12 +c94a 5 94 12 +c94f 4 93 12 +c953 15 94 12 +c968 5 96 12 +c96d 4 94 12 +c971 f 96 12 +c980 c 78 12 +c98c d 79 12 +c999 e 472 44 +c9a7 8 241 42 +c9af 14 162 12 +c9c3 2 71 12 +c9c5 4 162 12 +c9c9 b 71 12 +c9d4 c 1306 43 +FUNC c9e0 43f 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, google_breakpad::MappingInfo* const&) +c9e0 11 439 44 +c9f1 c 442 44 +c9fd 1e 444 44 +ca1b 3 900 39 +ca1e 3 447 44 +ca21 7 900 39 +ca28 9 450 44 +ca31 a 452 44 +ca3b 15 245 42 +ca50 b 120 46 +ca5b 11 245 42 +ca6c 3 559 38 +ca6f 3 456 44 +ca72 3 559 38 +ca75 4 456 44 +ca79 4 559 38 +ca7d 5 560 38 +ca82 f 561 38 +ca91 3 459 44 +ca94 c 686 38 +caa0 7 687 38 +caa7 5 686 38 +caac 14 525 44 +cac0 10 321 42 +cad0 8 120 46 +cad8 e 321 42 +cae6 4 468 44 +caea 3 245 42 +caed 4 468 44 +caf1 f 245 42 +cb00 b 120 46 +cb0b d 245 42 +cb18 8 472 44 +cb20 7 687 38 +cb27 5 686 38 +cb2c 14 525 44 +cb40 4 626 43 +cb44 d 1305 43 +cb51 7 626 43 +cb58 c 1305 43 +cb64 6 1308 43 +cb6a 3 900 39 +cb6d 4 1308 43 +cb71 3 900 39 +cb74 4 480 44 +cb78 3 1309 43 +cb7b 5 480 44 +cb80 6 1309 43 +cb86 15 162 12 +cb9b 20 74 12 +cbbb 2 75 12 +cbbd 2 76 12 +cbbf 3 75 12 +cbc2 8 77 12 +cbca e 76 12 +cbd8 7 86 12 +cbdf 2 2816 15 +cbe1 7 86 12 +cbe8 d 2816 15 +cbf5 3 86 12 +cbf8 5 2816 15 +cbfd 9 86 12 +cc06 34 2816 15 +cc3a 6 169 43 +cc40 10 486 44 +cc50 c 120 46 +cc5c a 321 42 +cc66 4 491 44 +cc6a 16 245 42 +cc80 b 120 46 +cc8b d 245 42 +cc98 13 439 44 +ccab 4 498 44 +ccaf 4 496 44 +ccb3 d 245 42 +ccc0 b 120 46 +cccb d 245 42 +ccd8 10 439 44 +cce8 4 520 44 +ccec 5 522 44 +ccf1 4 521 44 +ccf5 4 522 44 +ccf9 17 525 44 +cd10 9 1309 43 +cd19 17 169 43 +cd30 c 120 12 +cd3c 9 124 12 +cd45 4 93 12 +cd49 4 124 12 +cd4d 3 93 12 +cd50 3 124 12 +cd53 4 125 12 +cd57 5 93 12 +cd5c 4 125 12 +cd60 4 126 12 +cd64 16 93 12 +cd7a 5 94 12 +cd7f 4 93 12 +cd83 15 94 12 +cd98 5 96 12 +cd9d 4 94 12 +cda1 f 96 12 +cdb0 c 78 12 +cdbc d 79 12 +cdc9 8 245 42 +cdd1 8 444 44 +cdd9 d 472 44 +cde6 8 241 42 +cdee c 1306 43 +cdfa 14 162 12 +ce0e 2 71 12 +ce10 4 162 12 +ce14 b 71 12 +FUNC ce20 3 0 google_breakpad::LinuxPtraceDumper::IsPostMortem() const +ce20 3 228 22 +FUNC ce30 d8 0 google_breakpad::LinuxPtraceDumper::BuildProcPath(char*, int, char const*) const +ce30 a 107 22 +ce3a 2 109 22 +ce3c 1b 107 22 +ce57 3 108 22 +ce5a 3 107 22 +ce5d a 108 22 +ce67 5 108 22 +ce6c 8 111 22 +ce74 3 112 22 +ce77 3 111 22 +ce7a 2 112 22 +ce7c 2 113 22 +ce7e 2a 126 22 +cea8 b 115 22 +ceb3 7 116 22 +ceba 9 117 22 +cec3 a 121 22 +cecd d 120 22 +ceda 5 121 22 +cedf 4 122 22 +cee3 b 123 22 +ceee 5 122 22 +cef3 5 123 22 +cef8 6 124 22 +cefe a 125 22 +FUNC cf10 ac 0 google_breakpad::LinuxPtraceDumper::CopyFromProcess(void*, int, void const*, unsigned long) +cf10 11 129 22 +cf21 3 136 22 +cf24 9 130 22 +cf2d 5 136 22 +cf32 10 138 22 +cf42 6 131 22 +cf48 8 137 22 +cf50 5 138 22 +cf55 3 137 22 +cf58 a 2717 15 +cf62 8 137 22 +cf6a f 2717 15 +cf79 a 141 22 +cf83 3 142 22 +cf86 5 141 22 +cf8b 5 136 22 +cf90 10 144 22 +cfa0 d 2717 15 +cfad 9 139 22 +cfb6 6 2717 15 +FUNC cfc0 c2 0 google_breakpad::LinuxPtraceDumper::ThreadsResume() +cfc0 2 248 22 +cfc2 3 250 22 +cfc5 b 248 22 +cfd0 9 249 22 +cfd9 4 291 22 +cfdd 4 626 43 +cfe1 6 252 22 +cfe7 7 626 43 +cfee 7 252 22 +cff5 37 2717 15 +d02c 4 291 22 +d030 4 626 43 +d034 4 252 22 +d038 7 626 43 +d03f 5 252 22 +d044 7 254 22 +d04b 15 256 22 +d060 22 2717 15 +FUNC d090 49f 0 google_breakpad::LinuxPtraceDumper::GetThreadInfoByIndex(unsigned long, google_breakpad::ThreadInfo*) +d090 17 150 22 +d0a7 4 291 22 +d0ab b 626 43 +d0b6 5 151 22 +d0bb 3 154 22 +d0be 3 156 22 +d0c1 3 154 22 +d0c4 6 156 22 +d0ca 1c 158 22 +d0e6 2 206 22 +d0e8 12 224 22 +d0fa 23 2711 15 +d11d 4 163 22 +d121 2 162 22 +d123 4 2711 15 +d127 2 162 22 +d129 23 74 12 +d14c 3 75 12 +d14f 5 76 12 +d154 3 75 12 +d157 8 77 12 +d15f 3 76 12 +d162 3 82 12 +d165 4 49 4 +d169 5 175 22 +d16e d 49 4 +d17b 5 175 22 +d180 3 49 4 +d183 19 169 22 +d19c 6 99 4 +d1a2 f 66 4 +d1b1 5 99 4 +d1b6 3 2724 15 +d1b9 5 98 4 +d1be 3 99 4 +d1c1 10 2724 15 +d1d1 6 100 4 +d1d7 a 102 4 +d1e1 5 103 4 +d1e6 4 66 4 +d1ea 15 70 4 +d1ff 11 150 22 +d210 18 70 4 +d228 7 69 4 +d22f c 78 4 +d23b 20 2629 15 +d25b c 182 22 +d267 b 182 22 +d272 c 2717 15 +d27e 5 185 22 +d283 1c 2717 15 +d29f 8 189 22 +d2a7 2c 2717 15 +d2d3 b 205 22 +d2de 13 2717 15 +d2f1 e 199 22 +d2ff d 221 22 +d30c a 223 22 +d316 4 86 12 +d31a 2 2816 15 +d31c 7 86 12 +d323 c 2816 15 +d32f 3 86 12 +d332 5 2816 15 +d337 3 86 12 +d33a 2b 2816 15 +d365 f 89 12 +d374 3 71 4 +d377 4 73 4 +d37b 6 71 4 +d381 18 172 22 +d399 c 173 22 +d3a5 d 116 4 +d3b2 2 117 4 +d3b4 8 118 4 +d3bc 7 117 4 +d3c3 d 118 4 +d3d0 10 105 4 +d3e0 18 174 22 +d3f8 10 175 22 +d408 10 70 4 +d418 10 2724 15 +d428 7 78 12 +d42f 8 79 12 +d437 8 82 12 +d43f b 86 4 +d44a 8 87 4 +d452 4 92 4 +d456 3 90 4 +d459 4 93 4 +d45d 6 90 4 +d463 9 92 4 +d46c a 120 12 +d476 3 93 12 +d479 4 124 12 +d47d 3 93 12 +d480 4 125 12 +d484 5 93 12 +d489 4 124 12 +d48d 7 93 12 +d494 4 126 12 +d498 8 93 12 +d4a0 5 94 12 +d4a5 3 93 12 +d4a8 10 94 12 +d4b8 c 96 12 +d4c4 e 2717 15 +d4d2 1f 87 4 +d4f1 1f 116 4 +d510 1f 156 22 +FUNC d530 20 0 google_breakpad::LinuxPtraceDumper::LinuxPtraceDumper(int) +d530 1 101 22 +d531 3 101 22 +d534 1a 103 22 +d54e 2 104 22 +FUNC d550 36d 0 google_breakpad::LinuxPtraceDumper::EnumerateThreads() +d550 17 260 22 +d567 7 262 22 +d56e 11 260 22 +d57f 15 262 22 +d594 2 267 22 +d596 3a 289 22 +d5d0 30 2711 15 +d600 4 266 22 +d604 23 74 12 +d627 3 75 12 +d62a 5 76 12 +d62f 2 77 12 +d631 4 75 12 +d635 6 77 12 +d63b 3 76 12 +d63e 8 281 22 +d646 4 82 3 +d64a b 51 3 +d655 2 274 22 +d657 8 272 22 +d65f 5 281 22 +d664 4 65 3 +d668 17 275 22 +d67f 8 87 3 +d687 2d 2654 15 +d6b4 22 2629 15 +d6d6 a 288 22 +d6e0 5 93 3 +d6e5 3 94 3 +d6e8 3 93 3 +d6eb 5 94 3 +d6f0 6 93 3 +d6f6 12 94 3 +d708 f 276 22 +d717 8 275 22 +d71f 8 278 22 +d727 8 277 22 +d72f d 278 22 +d73c 10 278 22 +d74c e 883 43 +d75a 8 120 46 +d762 16 887 43 +d778 10 288 22 +d788 9 68 3 +d791 6 70 3 +d797 5 71 3 +d79c 13 77 3 +d7af 21 80 3 +d7d0 10 73 3 +d7e0 4 86 12 +d7e4 2 2816 15 +d7e6 7 86 12 +d7ed d 2816 15 +d7fa 3 86 12 +d7fd 5 2816 15 +d802 3 86 12 +d805 27 2816 15 +d82c c 89 12 +d838 6 120 12 +d83e 3 93 12 +d841 4 124 12 +d845 3 93 12 +d848 4 125 12 +d84c 5 93 12 +d851 4 124 12 +d855 7 93 12 +d85c 4 126 12 +d860 8 93 12 +d868 5 94 12 +d86d 3 93 12 +d870 10 94 12 +d880 10 96 12 +d890 7 78 12 +d897 d 79 12 +d8a4 19 893 43 +FUNC d8c0 235 0 google_breakpad::LinuxPtraceDumper::ThreadsSuspend() +d8c0 2 230 22 +d8c2 5 232 22 +d8c7 12 230 22 +d8d9 d 231 22 +d8e6 4 291 22 +d8ea b 626 43 +d8f5 9 233 22 +d8fe 4 230 22 +d902 5 80 22 +d907 7 230 22 +d90e 4 240 22 +d912 3 230 22 +d915 5 240 22 +d91a 6 2717 15 +d920 8 240 22 +d928 4 234 22 +d92c 8 751 43 +d934 7 60 22 +d93b 1e 2717 15 +d959 c 61 22 +d965 15 2877 15 +d97a 3 66 22 +d97d 3 2877 15 +d980 2 66 22 +d982 13 2877 15 +d995 b 65 22 +d9a0 5 66 22 +d9a5 1e 2717 15 +d9c3 5 291 22 +d9c8 8 626 43 +d9d0 8 751 43 +d9d8 4 626 43 +d9dc 10 239 22 +d9ec 12 291 22 +d9fe a 626 43 +da08 4 240 22 +da0c 3 626 43 +da0f 9 686 43 +da18 2 688 43 +da1a 4 689 43 +da1e f 1320 43 +da2d 4 241 22 +da31 d 233 22 +da3e 3 245 22 +da41 9 244 22 +da4a 3 245 22 +da4d 13 246 22 +da60 1a 2717 15 +da7a 26 80 22 +daa0 30 1004 43 +dad0 14 2717 15 +dae4 7 233 22 +daeb a 2717 15 +FUNC db00 13 0 google_breakpad::LinuxPtraceDumper::~LinuxPtraceDumper() +db00 13 42 6 +FUNC db20 20 0 google_breakpad::LinuxPtraceDumper::~LinuxPtraceDumper() +db20 8 42 6 +db28 18 42 6 +FUNC db40 306 0 std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, int const&) +db40 28 316 44 +db68 8 320 44 +db70 3 316 44 +db73 2 320 44 +db75 a 120 46 +db7f 4 329 44 +db83 4 325 44 +db87 3 559 38 +db8a 4 325 44 +db8e 3 327 44 +db91 4 559 38 +db95 5 560 38 +db9a f 561 38 +dba9 3 333 44 +dbac 24 391 44 +dbd0 4 291 22 +dbd4 a 626 43 +dbde 9 215 38 +dbe7 4 1308 43 +dbeb 9 1309 43 +dbf4 3 900 39 +dbf7 d 162 12 +dc04 3 900 39 +dc07 3 162 12 +dc0a 8 342 44 +dc12 23 74 12 +dc35 3 75 12 +dc38 2 76 12 +dc3a 3 75 12 +dc3d 8 77 12 +dc45 8 76 12 +dc4d 8 351 44 +dc55 a 120 46 +dc5f 11 245 42 +dc70 9 120 46 +dc79 d 245 42 +dc86 13 316 44 +dc99 f 245 42 +dca8 9 120 46 +dcb1 d 245 42 +dcbe 10 316 44 +dcce 4 387 44 +dcd2 5 389 44 +dcd7 4 388 44 +dcdb d 389 44 +dce8 3 900 39 +dceb c 162 12 +dcf7 3 900 39 +dcfa 5 162 12 +dcff 11 342 44 +dd10 7 86 12 +dd17 2 2816 15 +dd19 7 86 12 +dd20 d 2816 15 +dd2d 3 86 12 +dd30 5 2816 15 +dd35 9 86 12 +dd3e 30 2816 15 +dd6e f 89 12 +dd7d 8 120 12 +dd85 9 124 12 +dd8e 4 125 12 +dd92 8 93 12 +dd9a 3 124 12 +dd9d 3 125 12 +dda0 4 126 12 +dda4 16 93 12 +ddba 5 94 12 +ddbf 4 93 12 +ddc3 15 94 12 +ddd8 b 96 12 +dde3 8 78 12 +ddeb d 79 12 +ddf8 13 1309 43 +de0b 7 900 39 +de12 6 169 43 +de18 8 900 39 +de20 2 169 43 +de22 4 342 44 +de26 3 169 43 +de29 4 342 44 +de2d 6 169 43 +de33 6 162 12 +de39 d 71 12 +FUNC de50 458 0 std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned long, int const&) +de50 11 439 44 +de61 c 442 44 +de6d 1f 444 44 +de8c 3 900 39 +de8f 3 447 44 +de92 7 900 39 +de99 5 450 44 +de9e 7 452 44 +dea5 3 245 42 +dea8 3 452 44 +deab d 245 42 +deb8 9 120 46 +dec1 d 245 42 +dece 3 559 38 +ded1 4 456 44 +ded5 7 559 38 +dedc 5 456 44 +dee1 9 560 38 +deea 3 459 44 +deed b 686 38 +def8 7 687 38 +deff 5 686 38 +df04 14 525 44 +df18 3 464 44 +df1b 15 321 42 +df30 8 120 46 +df38 a 321 42 +df42 4 468 44 +df46 6 245 42 +df4c 5 468 44 +df51 f 245 42 +df60 9 120 46 +df69 d 245 42 +df76 a 472 44 +df80 7 687 38 +df87 5 686 38 +df8c 14 525 44 +dfa0 5 291 22 +dfa5 3 626 43 +dfa8 d 1305 43 +dfb5 7 626 43 +dfbc c 1305 43 +dfc8 6 1308 43 +dfce 3 900 39 +dfd1 4 1308 43 +dfd5 3 900 39 +dfd8 4 480 44 +dfdc 3 1309 43 +dfdf 5 480 44 +dfe4 6 1309 43 +dfea 15 162 12 +dfff 23 74 12 +e022 3 75 12 +e025 2 76 12 +e027 3 75 12 +e02a 8 77 12 +e032 e 76 12 +e040 20 561 38 +e060 e 86 12 +e06e 9 2816 15 +e077 5 86 12 +e07c 6 2816 15 +e082 3 86 12 +e085 5 2816 15 +e08a 9 86 12 +e093 34 2816 15 +e0c7 13 89 12 +e0da 16 486 44 +e0f0 b 120 46 +e0fb a 321 42 +e105 13 245 42 +e118 9 120 46 +e121 d 245 42 +e12e 13 439 44 +e141 3 245 42 +e144 4 496 44 +e148 8 245 42 +e150 9 120 46 +e159 d 245 42 +e166 10 439 44 +e176 5 520 44 +e17b 5 522 44 +e180 5 521 44 +e185 5 522 44 +e18a 16 525 44 +e1a0 9 1309 43 +e1a9 1f 169 43 +e1c8 c 120 12 +e1d4 9 124 12 +e1dd 4 93 12 +e1e1 4 124 12 +e1e5 3 93 12 +e1e8 3 124 12 +e1eb 4 125 12 +e1ef 5 93 12 +e1f4 4 125 12 +e1f8 4 126 12 +e1fc 16 93 12 +e212 5 94 12 +e217 4 93 12 +e21b 15 94 12 +e230 5 96 12 +e235 4 94 12 +e239 f 96 12 +e248 c 78 12 +e254 d 79 12 +e261 e 472 44 +e26f 8 241 42 +e277 14 162 12 +e28b 2 71 12 +e28d 4 162 12 +e291 b 71 12 +e29c c 1306 43 +FUNC e2b0 e3 0 isLegalUTF8 +e2b0 3 294 25 +e2b3 3 295 25 +e2b6 4 294 25 +e2ba e 295 25 +e2c8 2 296 25 +e2ca 6 315 25 +e2d0 8 295 25 +e2d8 3 311 25 +e2db 2 298 25 +e2dd 5 311 25 +e2e2 e 313 25 +e2f0 a 298 25 +e2fa 5 298 25 +e2ff 4 298 25 +e303 4 299 25 +e307 2 298 25 +e309 4 299 25 +e30d 5 299 25 +e312 e 299 25 +e320 4 300 25 +e324 2 298 25 +e326 5 300 25 +e32b f 302 25 +e33a e 304 25 +e348 a 302 25 +e352 2 298 25 +e354 4 308 25 +e358 8 315 25 +e360 18 306 25 +e378 10 305 25 +e388 b 307 25 +FUNC e3a0 fe 0 ConvertUTF32toUTF16 +e3a0 3 64 25 +e3a3 1 62 25 +e3a4 3 65 25 +e3a7 1 62 25 +e3a8 9 66 25 +e3b1 f 68 25 +e3c0 10 74 25 +e3d0 9 75 25 +e3d9 a 89 25 +e3e3 5 66 25 +e3e8 c 68 25 +e3f4 7 71 25 +e3fb 9 72 25 +e404 9 85 25 +e40d 5 86 25 +e412 3 66 25 +e415 5 87 25 +e41a 6 66 25 +e420 3 102 25 +e423 3 103 25 +e426 a 105 25 +e430 10 83 25 +e440 9 93 25 +e449 7 97 25 +e450 3 98 25 +e453 7 99 25 +e45a 4 98 25 +e45e 6 99 25 +e464 6 98 25 +e46a 5 99 25 +e46f 4 98 25 +e473 9 99 25 +e47c 3 93 25 +e47f 3 102 25 +e482 5 95 25 +e487 3 103 25 +e48a 3 105 25 +e48d 3 75 25 +e490 7 77 25 +e497 3 66 25 +e49a 4 63 25 +FUNC e4a0 e6 0 ConvertUTF16toUTF32 +e4a0 3 112 25 +e4a3 3 113 25 +e4a6 9 115 25 +e4af 9 110 25 +e4b8 9 121 25 +e4c1 5 122 25 +e4c6 10 124 25 +e4d6 4 125 25 +e4da 4 127 25 +e4de 8 125 25 +e4e6 5 146 25 +e4eb 7 150 25 +e4f2 8 115 25 +e4fa 8 117 25 +e502 10 119 25 +e512 5 138 25 +e517 10 140 25 +e527 2 161 25 +e529 5 142 25 +e52e 3 152 25 +e531 3 153 25 +e534 c 161 25 +e540 5 128 25 +e545 5 146 25 +e54a 2 161 25 +e54c 5 148 25 +e551 3 152 25 +e554 3 153 25 +e557 b 161 25 +e562 2 111 25 +e564 3 152 25 +e567 3 153 25 +e56a 5 161 25 +e56f 5 135 25 +e574 3 152 25 +e577 3 153 25 +e57a 3 161 25 +e57d 3 152 25 +e580 2 111 25 +e582 3 153 25 +e585 1 161 25 +FUNC e590 216 0 ConvertUTF16toUTF8 +e590 2 213 25 +e592 3 215 25 +e595 2 213 25 +e597 3 217 25 +e59a 1 213 25 +e59b 3 216 25 +e59e 1 213 25 +e59f 9 217 25 +e5a8 8 223 25 +e5b0 10 225 25 +e5c0 9 227 25 +e5c9 5 228 25 +e5ce 14 230 25 +e5e2 4 231 25 +e5e6 4 233 25 +e5ea 8 231 25 +e5f2 6 253 25 +e5f8 4 261 25 +e5fc 12 262 25 +e60e 12 261 25 +e620 5 244 25 +e625 10 246 25 +e635 1 277 25 +e636 3 274 25 +e639 3 275 25 +e63c 5 248 25 +e641 f 277 25 +e650 8 254 25 +e658 4 261 25 +e65c 12 262 25 +e66e 12 261 25 +e680 5 234 25 +e685 8 255 25 +e68d 4 261 25 +e691 f 262 25 +e6a0 10 261 25 +e6b0 c 256 25 +e6bc 4 261 25 +e6c0 9 262 25 +e6c9 15 267 25 +e6de 6 261 25 +e6e4 8 267 25 +e6ec 1a 268 25 +e706 14 269 25 +e71a e 270 25 +e728 3 217 25 +e72b 5 272 25 +e730 4 270 25 +e734 6 217 25 +e73a 1 277 25 +e73b 3 274 25 +e73e 3 275 25 +e741 2 214 25 +e743 d 277 25 +e750 a 258 25 +e75a 1 277 25 +e75b 3 274 25 +e75e 3 275 25 +e761 5 241 25 +e766 6 277 25 +e76c 7 262 25 +e773 1 277 25 +e774 3 264 25 +e777 3 274 25 +e77a 5 264 25 +e77f 3 275 25 +e782 6 277 25 +e788 9 262 25 +e791 3 261 25 +e794 12 262 25 +FUNC e7b0 2b 0 isLegalUTF8Sequence +e7b0 11 324 25 +e7c1 b 325 25 +e7cc c 328 25 +e7d8 3 329 25 +FUNC e7e0 265 0 ConvertUTF8toUTF16 +e7e0 e 334 25 +e7ee 3 336 25 +e7f1 3 337 25 +e7f4 13 334 25 +e807 3 338 25 +e80a 5 334 25 +e80f 6 338 25 +e815 14 340 25 +e829 17 341 25 +e840 17 345 25 +e857 2 339 25 +e859 17 352 25 +e870 2 339 25 +e872 f 354 25 +e881 f 355 25 +e890 f 356 25 +e89f f 357 25 +e8ae b 358 25 +e8b9 e 360 25 +e8c7 b 362 25 +e8d2 c 366 25 +e8de 14 368 25 +e8f2 8 377 25 +e8fa a 338 25 +e904 14 340 25 +e918 12 341 25 +e92a 5 342 25 +e92f 8 398 25 +e937 8 399 25 +e93f 11 401 25 +e950 30 339 25 +e980 10 353 25 +e990 10 339 25 +e9a0 c 380 25 +e9ac a 385 25 +e9b6 a 338 25 +e9c0 10 335 25 +e9d0 8 379 25 +e9d8 b 389 25 +e9e3 6 393 25 +e9e9 3 394 25 +e9ec 5 395 25 +e9f1 4 394 25 +e9f5 4 395 25 +e9f9 5 394 25 +e9fe 5 395 25 +ea03 4 394 25 +ea07 9 395 25 +ea10 3 390 25 +ea13 5 391 25 +ea18 6 390 25 +ea1e a 391 25 +ea28 a 346 25 +ea32 3 382 25 +ea35 5 381 25 +ea3a 6 382 25 +ea40 5 383 25 +FUNC ea50 1c0 0 ConvertUTF32toUTF8 +ea50 2 406 25 +ea52 3 408 25 +ea55 2 410 25 +ea57 2 406 25 +ea59 3 410 25 +ea5c 3 406 25 +ea5f 3 409 25 +ea62 1 406 25 +ea63 d 410 25 +ea70 3 416 25 +ea73 7 415 25 +ea7a 2 416 25 +ea7c 14 418 25 +ea90 6 428 25 +ea96 4 437 25 +ea9a f 438 25 +eaa9 f 437 25 +eab8 9 429 25 +eac1 4 437 25 +eac5 f 438 25 +ead4 c 437 25 +eae0 9 430 25 +eae9 4 437 25 +eaed f 438 25 +eafc c 437 25 +eb08 d 431 25 +eb15 4 437 25 +eb19 9 438 25 +eb22 15 443 25 +eb37 6 437 25 +eb3d 8 443 25 +eb45 17 444 25 +eb5c 17 445 25 +eb73 f 446 25 +eb82 3 410 25 +eb85 5 448 25 +eb8a 3 415 25 +eb8d 4 446 25 +eb91 6 410 25 +eb97 1 453 25 +eb98 3 450 25 +eb9b 3 451 25 +eb9e 12 453 25 +ebb0 6 433 25 +ebb6 a 434 25 +ebc0 1 453 25 +ebc1 3 450 25 +ebc4 3 451 25 +ebc7 5 420 25 +ebcc 8 453 25 +ebd4 7 438 25 +ebdb 1 453 25 +ebdc 3 440 25 +ebdf 3 450 25 +ebe2 5 440 25 +ebe7 3 451 25 +ebea 8 453 25 +ebf2 9 438 25 +ebfb 3 437 25 +ebfe 12 438 25 +FUNC ec10 29f 0 ConvertUTF8toUTF32 +ec10 e 458 25 +ec1e 3 460 25 +ec21 3 461 25 +ec24 14 458 25 +ec38 3 462 25 +ec3b 5 458 25 +ec40 6 462 25 +ec46 14 464 25 +ec5a 12 465 25 +ec6c 4 457 25 +ec70 18 459 25 +ec88 7 469 25 +ec8f 4 457 25 +ec93 19 469 25 +ecac 2 463 25 +ecae 1a 476 25 +ecc8 2 463 25 +ecca 10 478 25 +ecda 10 479 25 +ecea 10 480 25 +ecfa 10 481 25 +ed0a c 482 25 +ed16 b 484 25 +ed21 b 486 25 +ed2c c 490 25 +ed38 14 495 25 +ed4c c 496 25 +ed58 3 457 25 +ed5b 8 501 25 +ed63 b 462 25 +ed6e 19 464 25 +ed87 17 465 25 +ed9e 8 466 25 +eda6 5 511 25 +edab 5 512 25 +edb0 3 511 25 +edb3 3 512 25 +edb6 1a 514 25 +edd0 30 463 25 +ee00 10 477 25 +ee10 10 463 25 +ee20 5 462 25 +ee25 3 457 25 +ee28 8 508 25 +ee30 8 507 25 +ee38 18 462 25 +ee50 3 457 25 +ee53 10 504 25 +ee63 d 470 25 +ee70 6 487 25 +ee76 8 488 25 +ee7e 6 487 25 +ee84 5 488 25 +ee89 6 497 25 +ee8f 8 498 25 +ee97 6 497 25 +ee9d 5 499 25 +eea2 d 459 25 +FUNC eeb0 a 0 google_breakpad::FileID::FileID(char const*) +eeb0 a 52 27 +FUNC eec0 1ee 0 google_breakpad::FileID::ElfFileIdentifierFromMappedFile(void const*, unsigned char*) +eec0 a 143 27 +eeca 5 99 27 +eecf 4 143 27 +eed3 12 99 27 +eee5 f 98 27 +eef4 21 102 27 +ef15 8 98 27 +ef1d 23 125 27 +ef40 2 127 27 +ef42 c 124 27 +ef4e f 130 27 +ef5d d 132 27 +ef6a 5 131 27 +ef6f b 132 27 +ef7a 6 133 27 +ef80 8 78 27 +ef88 b 135 27 +ef93 6 134 27 +ef99 4 136 27 +ef9d 5 133 27 +efa2 5 146 27 +efa7 9 150 27 +efb0 b 98 27 +efbb d 107 27 +efc8 9 110 27 +efd1 4 66 27 +efd5 5 112 27 +efda 3 66 27 +efdd 13 68 27 +eff0 1a 71 27 +f00a 9 68 27 +f013 6 69 27 +f019 b 76 27 +f024 3 82 27 +f027 a 85 27 +f031 b 82 27 +f03c 5 85 27 +f041 3 87 27 +f044 5 194 38 +f049 6 87 27 +f04f 8 194 38 +f057 a 87 27 +f061 4 66 27 +f065 5 109 27 +f06a 3 66 27 +f06d 13 68 27 +f080 1a 71 27 +f09a 9 68 27 +f0a3 b 69 27 +FUNC f0b0 59 0 google_breakpad::FileID::ElfFileIdentifier(unsigned char*) +f0b0 4 152 27 +f0b4 3 153 27 +f0b7 4 152 27 +f0bb a 153 27 +f0c5 5 192 27 +f0ca 5 154 27 +f0cf 1b 157 27 +f0ea 6 158 27 +f0f0 4 155 27 +f0f4 15 157 27 +FUNC f110 e5 0 google_breakpad::FileID::ConvertIdentifierToString(unsigned char const*, char*, int) +f110 2 162 27 +f112 c 166 27 +f11e 8 168 27 +f126 3 170 27 +f129 4 172 27 +f12d 4 170 27 +f131 4 172 27 +f135 4 170 27 +f139 2 175 27 +f13b 5 170 27 +f140 5 172 27 +f145 13 175 27 +f158 a 175 27 +f162 6 178 27 +f168 8 181 27 +f170 3 178 27 +f173 4 179 27 +f177 3 178 27 +f17a 3 181 27 +f17d 4 179 27 +f181 6 178 27 +f187 2 181 27 +f189 5 181 27 +f18e a 182 27 +f198 1a 184 27 +f1b2 1a 185 27 +f1cc 2 175 27 +f1ce 4 185 27 +f1d2 2 175 27 +f1d4 7 189 27 +f1db 1 190 27 +f1dc 4 189 27 +f1e0 2 190 27 +f1e2 6 174 27 +f1e8 6 189 27 +f1ee 1 190 27 +f1ef 4 189 27 +f1f3 2 190 27 +FUNC f200 10 0 google_breakpad::MemoryMappedFile::MemoryMappedFile() +f200 10 50 13 +FUNC f210 56 0 google_breakpad::MemoryMappedFile::Unmap() +f210 11 98 30 +f221 3 105 30 +f224 5 99 30 +f229 1f 2701 15 +f248 7 70 13 +f24f 8 72 13 +f257 f 103 30 +FUNC f270 193 0 google_breakpad::MemoryMappedFile::Map(char const*) +f270 a 57 30 +f27a 2 2711 15 +f27c 14 57 30 +f290 3 57 30 +f293 5 58 30 +f298 1b 2711 15 +f2b3 9 2629 15 +f2bc 34 96 30 +f2f0 5 61 30 +f2f5 3 2645 15 +f2f8 3 67 30 +f2fb 20 2645 15 +f31b 1e 2629 15 +f339 7 73 30 +f340 5 67 30 +f345 b 67 30 +f350 6 79 30 +f356 39 2816 15 +f38f 1e 2629 15 +f3ad 6 90 30 +f3b3 5 94 30 +f3b8 8 72 13 +f3c0 4 70 13 +f3c4 5 95 30 +f3c9 17 72 13 +f3e0 13 2629 15 +f3f3 5 81 30 +f3f8 b 2629 15 +FUNC f410 14 0 google_breakpad::MemoryMappedFile::MemoryMappedFile(char const*) +f410 f 50 13 +f41f 5 50 30 +FUNC f430 5 0 google_breakpad::MemoryMappedFile::~MemoryMappedFile() +f430 5 54 30 +FUNC f440 3a 0 google_breakpad::SafeReadLink(char const*, char*, unsigned long) +f440 1 39 31 +f441 1b 2726 15 +f45c 2 50 31 +f45e 2 51 31 +f460 b 46 31 +f46b 4 47 31 +f46f 5 48 31 +f474 2 51 31 +f476 2 50 31 +f478 2 51 31 +FUNC f480 1f 0 google_breakpad::IsValidElf(void const*) +f480 7 111 26 +f487 4 109 26 +f48b f 111 26 +f49a 5 112 26 +FUNC f4a0 5 0 google_breakpad::ElfClass(void const*) +f4a0 4 118 26 +f4a4 1 119 26 +FUNC f4b0 466 0 google_breakpad::FindElfSection(void const*, char const*, unsigned int, void const**, int*, int*) +f4b0 25 126 26 +f4d5 3 127 26 +f4d8 5 126 26 +f4dd 6 127 26 +f4e3 c 128 26 +f4ef c 129 26 +f4fb 7 131 26 +f502 d 132 26 +f50f 9 134 26 +f518 2 135 26 +f51a 26 156 26 +f540 8 137 26 +f548 5 138 26 +f54d 3 139 26 +f550 9 145 26 +f559 5 149 26 +f55e 1c 55 26 +f57a a 58 26 +f584 4 62 26 +f588 a 42 10 +f592 4 70 26 +f596 7 62 26 +f59d 4 42 10 +f5a1 7 65 26 +f5a8 6 53 10 +f5ae 5 65 26 +f5b3 6 53 10 +f5b9 9 54 10 +f5c2 9 55 10 +f5cb e 57 10 +f5d9 8 58 10 +f5e1 3 121 26 +f5e4 3 63 10 +f5e7 3 121 26 +f5ea 3 63 10 +f5ed 17 121 26 +f604 5 61 10 +f609 4 63 10 +f60d 3 62 10 +f610 7 63 10 +f617 4 62 10 +f61b 2a 63 10 +f645 9 72 26 +f64e 8 73 26 +f656 e 74 26 +f664 b 152 26 +f66f 1c 55 26 +f68b a 58 26 +f695 4 62 26 +f699 3 42 10 +f69c 4 70 26 +f6a0 4 62 26 +f6a4 3 42 10 +f6a7 4 62 26 +f6ab 4 42 10 +f6af 4 65 26 +f6b3 3 42 10 +f6b6 3 65 26 +f6b9 c 53 10 +f6c5 9 54 10 +f6ce 9 55 10 +f6d7 13 57 10 +f6ea 11 58 10 +f6fb 3 121 26 +f6fe 3 63 10 +f701 3 121 26 +f704 3 63 10 +f707 15 121 26 +f71c 9 61 10 +f725 4 63 10 +f729 2 62 10 +f72b 2 63 10 +f72d 4 62 10 +f731 37 63 10 +f768 b 72 26 +f773 a 73 26 +f77d 9 74 26 +f786 1f 127 26 +f7a5 1f 129 26 +f7c4 1f 128 26 +f7e3 3e 55 10 +f821 1c 54 10 +f83d 1f 53 10 +f85c 1f 58 26 +f87b 1f 55 26 +f89a 1f 54 10 +f8b9 1f 53 10 +f8d8 1f 58 26 +f8f7 1f 55 26 +FUNC f920 29c 0 google_breakpad::FindElfSegment(void const*, unsigned int, void const**, int*, int*) +f920 20 162 26 +f940 9 163 26 +f949 c 164 26 +f955 c 165 26 +f961 7 167 26 +f968 c 168 26 +f974 9 170 26 +f97d 2 171 26 +f97f 21 192 26 +f9a0 8 173 26 +f9a8 5 174 26 +f9ad 3 175 26 +f9b0 9 181 26 +f9b9 5 185 26 +f9be 1c 90 26 +f9da a 93 26 +f9e4 4 98 26 +f9e8 7 42 10 +f9ef 3 98 26 +f9f2 3 42 10 +f9f5 2 98 26 +f9f7 9 99 26 +fa00 20 158 26 +fa20 11 99 26 +fa31 9 98 26 +fa3a b 188 26 +fa45 1c 90 26 +fa61 a 93 26 +fa6b 3 42 10 +fa6e 4 98 26 +fa72 3 42 10 +fa75 3 98 26 +fa78 3 42 10 +fa7b 2 98 26 +fa7d 5 99 26 +fa82 1e 158 26 +faa0 d 99 26 +faad b 98 26 +fab8 4 100 26 +fabc 4 101 26 +fac0 4 100 26 +fac4 9 101 26 +facd 6 100 26 +fad3 3 101 26 +fad6 4 100 26 +fada 9 101 26 +fae3 1f 165 26 +fb02 1f 164 26 +fb21 1f 163 26 +fb40 1f 93 26 +fb5f 1f 90 26 +fb7e 1f 93 26 +fb9d 1f 90 26 +STACK CFI INIT 1a70 3b0 .cfa: $rsp 16 + .ra: .cfa -8 + ^ +STACK CFI 1a76 .cfa: $rsp 24 + +STACK CFI INIT 2590 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 25b0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 25c0 8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 25d0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 25e0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 25f0 c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2600 9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 24d0 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 24d1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 24fb .cfa: $rsp 8 + +STACK CFI INIT 2610 35 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2500 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2504 .cfa: $rsp 32 + +STACK CFI 2538 .cfa: $rsp 8 + +STACK CFI 2539 .cfa: $rsp 32 + +STACK CFI INIT 2540 49 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2544 .cfa: $rsp 32 + +STACK CFI 2583 .cfa: $rsp 8 + +STACK CFI 2584 .cfa: $rsp 32 + +STACK CFI INIT 2650 90 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2651 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2658 .cfa: $rsp 32 + +STACK CFI 267e .cfa: $rsp 16 + +STACK CFI 267f .cfa: $rsp 8 + +STACK CFI 2680 .cfa: $rsp 32 + +STACK CFI INIT 26e0 92 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 26e5 $rbp: .cfa -16 + ^ +STACK CFI 26f3 $rbx: .cfa -24 + ^ .cfa: $rsp 32 + +STACK CFI 271d .cfa: $rsp 8 + +STACK CFI 2720 .cfa: $rsp 32 + +STACK CFI 275a .cfa: $rsp 8 + +STACK CFI 275c .cfa: $rsp 32 + +STACK CFI INIT 2150 279 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2152 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2157 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 2160 $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 2161 $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 2168 .cfa: $rsp 336 + +STACK CFI 22e7 .cfa: $rsp 40 + +STACK CFI 22e8 .cfa: $rsp 32 + +STACK CFI 22e9 .cfa: $rsp 24 + +STACK CFI 22eb .cfa: $rsp 16 + +STACK CFI 22ed .cfa: $rsp 8 + +STACK CFI 22ee .cfa: $rsp 336 + +STACK CFI INIT 1e20 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 2780 f5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 278f $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2791 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 2793 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 279b $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 27a3 $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 27ac .cfa: $rsp 208 + +STACK CFI 2852 .cfa: $rsp 48 + +STACK CFI 2858 $rbx: $rbx .cfa: $rsp 40 + +STACK CFI 2859 $rbp: $rbp .cfa: $rsp 32 + +STACK CFI 285b $r12: $r12 .cfa: $rsp 24 + +STACK CFI 285d $r13: $r13 .cfa: $rsp 16 + +STACK CFI 285f $r14: $r14 .cfa: $rsp 8 + +STACK CFI 2860 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ .cfa: $rsp 208 + +STACK CFI 2867 .cfa: $rsp 48 + +STACK CFI 286a $rbx: $rbx .cfa: $rsp 40 + +STACK CFI 286b $rbp: $rbp .cfa: $rsp 32 + +STACK CFI 286d $r12: $r12 .cfa: $rsp 24 + +STACK CFI 286f $r13: $r13 .cfa: $rsp 16 + +STACK CFI 2871 $r14: $r14 .cfa: $rsp 8 + +STACK CFI INIT 2880 8b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2893 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI 28ab $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 28b1 .cfa: $rsp 48 + +STACK CFI 28fc $r12: $r12 $r13: $r13 $rbp: $rbp $rbx: $rbx .cfa: $rsp 8 + +STACK CFI 2900 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ .cfa: $rsp 48 + +STACK CFI INIT 2910 104 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 292b $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 2932 .cfa: $rsp 64 + +STACK CFI 2971 .cfa: $rsp 8 + +STACK CFI 2978 .cfa: $rsp 64 + +STACK CFI 29dd .cfa: $rsp 8 + +STACK CFI 29e8 .cfa: $rsp 64 + +STACK CFI INIT 2a20 467 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2a2a $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ +STACK CFI 2a4b $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 160 + +STACK CFI 2a92 .cfa: $rsp 8 + +STACK CFI 2a98 .cfa: $rsp 160 + +STACK CFI INIT 2e90 1a6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2e92 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 2e93 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 2e97 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 2ea1 .cfa: $rsp 1632 + +STACK CFI 2fe5 .cfa: $rsp 32 + +STACK CFI 2fe6 .cfa: $rsp 24 + +STACK CFI 2fe7 .cfa: $rsp 16 + +STACK CFI 2fe9 .cfa: $rsp 8 + +STACK CFI 2ff0 .cfa: $rsp 1632 + +STACK CFI 2ff7 .cfa: $rsp 32 + +STACK CFI 2ffd .cfa: $rsp 24 + +STACK CFI 2ffe .cfa: $rsp 16 + +STACK CFI 3000 .cfa: $rsp 8 + +STACK CFI 3008 .cfa: $rsp 1632 + +STACK CFI INIT 3040 68 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 304a $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 3056 $r12: .cfa -16 + ^ .cfa: $rsp 32 + +STACK CFI 3082 .cfa: $rsp 8 + +STACK CFI 3088 .cfa: $rsp 32 + +STACK CFI 30a3 .cfa: $rsp 8 + +STACK CFI INIT 30b0 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 30b7 .cfa: $rsp 1104 + +STACK CFI 3105 .cfa: $rsp 8 + +STACK CFI INIT 3110 18b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3112 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 3114 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 3116 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 3118 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 311c $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 3120 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 3129 .cfa: $rsp 224 + +STACK CFI 31e3 .cfa: $rsp 56 + +STACK CFI 31e4 .cfa: $rsp 48 + +STACK CFI 31e5 .cfa: $rsp 40 + +STACK CFI 31e7 .cfa: $rsp 32 + +STACK CFI 31e9 .cfa: $rsp 24 + +STACK CFI 31eb .cfa: $rsp 16 + +STACK CFI 31ed .cfa: $rsp 8 + +STACK CFI 31f0 .cfa: $rsp 224 + +STACK CFI INIT 32a0 e0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 32aa $r12: .cfa -24 + ^ $rbp: .cfa -32 + ^ +STACK CFI 32ba $r13: .cfa -16 + ^ $rbx: .cfa -40 + ^ .cfa: $rsp 80 + +STACK CFI 32f8 .cfa: $rsp 8 + +STACK CFI 3300 .cfa: $rsp 80 + +STACK CFI INIT 3380 58 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3384 .cfa: $rsp 32 + +STACK CFI 33b4 .cfa: $rsp 8 + +STACK CFI 33b8 .cfa: $rsp 32 + +STACK CFI 33d7 .cfa: $rsp 8 + +STACK CFI INIT 33e0 28 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 33e1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 3407 .cfa: $rsp 8 + +STACK CFI INIT 3410 153 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3411 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 3418 .cfa: $rsp 1616 + +STACK CFI 3472 .cfa: $rsp 16 + +STACK CFI 3473 .cfa: $rsp 8 + +STACK CFI 3478 .cfa: $rsp 1616 + +STACK CFI 3535 .cfa: $rsp 16 + +STACK CFI 3536 .cfa: $rsp 8 + +STACK CFI 3540 .cfa: $rsp 1616 + +STACK CFI INIT 3570 cf .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 358b $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ .cfa: $rsp 640 + +STACK CFI 363a .cfa: $rsp 8 + +STACK CFI INIT 3640 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3642 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 3646 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 364b $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 3687 .cfa: $rsp 24 + +STACK CFI 368e .cfa: $rsp 16 + +STACK CFI 3690 .cfa: $rsp 8 + +STACK CFI 3698 .cfa: $rsp 32 + +STACK CFI 3699 .cfa: $rsp 24 + +STACK CFI 369a .cfa: $rsp 16 + +STACK CFI 369c .cfa: $rsp 8 + +STACK CFI INIT 36a0 31 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36a1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 36bf .cfa: $rsp 8 + +STACK CFI 36c0 .cfa: $rsp 16 + +STACK CFI 36cc .cfa: $rsp 8 + +STACK CFI INIT 36e0 179 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 36ea $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 36f7 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ +STACK CFI 3708 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI 37d0 .cfa: $rsp 8 + +STACK CFI 37d8 .cfa: $rsp 128 + +STACK CFI INIT 4030 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4031 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 4035 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 4039 .cfa: $rsp 32 + +STACK CFI 405c .cfa: $rsp 24 + +STACK CFI 405d .cfa: $rsp 16 + +STACK CFI 405e .cfa: $rsp 8 + +STACK CFI INIT 4060 2f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4061 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 4065 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 4069 .cfa: $rsp 32 + +STACK CFI 408c .cfa: $rsp 24 + +STACK CFI 408d .cfa: $rsp 16 + +STACK CFI 408e .cfa: $rsp 8 + +STACK CFI INIT 3860 336 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3862 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 3864 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 3865 $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 3866 $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 386d .cfa: $rsp 128 + +STACK CFI 39c5 .cfa: $rsp 40 + +STACK CFI 39c6 .cfa: $rsp 32 + +STACK CFI 39c7 .cfa: $rsp 24 + +STACK CFI 39c9 .cfa: $rsp 16 + +STACK CFI 39cb .cfa: $rsp 8 + +STACK CFI 39d0 .cfa: $rsp 128 + +STACK CFI INIT 4090 1ba .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 409a $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 40b8 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 80 + +STACK CFI 4122 .cfa: $rsp 8 + +STACK CFI 4128 .cfa: $rsp 80 + +STACK CFI INIT 3ba0 31c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3ba5 $r14: .cfa -24 + ^ +STACK CFI 3bb8 $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 3bc9 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ .cfa: $rsp 80 + +STACK CFI 3ccf .cfa: $rsp 8 + +STACK CFI 3cd0 .cfa: $rsp 80 + +STACK CFI INIT 3ec0 167 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 3eca $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI 3ede $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ .cfa: $rsp 256 + +STACK CFI 3fa2 .cfa: $rsp 8 + +STACK CFI 3fa3 .cfa: $rsp 256 + +STACK CFI INIT 1e3a 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 4250 7d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 425e $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ .cfa: $rsp 32 + +STACK CFI 42ad .cfa: $rsp 8 + +STACK CFI 42ae .cfa: $rsp 32 + +STACK CFI INIT 42d0 232 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 42d2 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 42d3 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 42d4 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 42db .cfa: $rsp 160 + +STACK CFI 443e .cfa: $rsp 32 + +STACK CFI 443f .cfa: $rsp 24 + +STACK CFI 4440 .cfa: $rsp 16 + +STACK CFI 4442 .cfa: $rsp 8 + +STACK CFI 4443 .cfa: $rsp 160 + +STACK CFI INIT 4510 85 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4511 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 4515 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 4519 .cfa: $rsp 32 + +STACK CFI 4570 .cfa: $rsp 24 + +STACK CFI 4574 .cfa: $rsp 16 + +STACK CFI 4575 .cfa: $rsp 8 + +STACK CFI 4576 .cfa: $rsp 32 + +STACK CFI INIT 45a0 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 45a7 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 45c2 .cfa: $rsp 8 + +STACK CFI 45c8 .cfa: $rsp 16 + +STACK CFI 45d7 .cfa: $rsp 8 + +STACK CFI INIT 1e54 27 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1e55 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 1e7a .cfa: $rsp 8 + +STACK CFI INIT 45e0 5d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 45ee $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ .cfa: $rsp 32 + +STACK CFI 4615 .cfa: $rsp 8 + +STACK CFI 4620 .cfa: $rsp 32 + +STACK CFI INIT 1e7c 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1e84 .cfa: $rsp 16 + +STACK CFI INIT 1e9c 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1ea4 .cfa: $rsp 16 + +STACK CFI INIT 4640 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4659 .cfa: $rsp 16 + +STACK CFI INIT 1ebc 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1ec4 .cfa: $rsp 16 + +STACK CFI INIT 1edc 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1ee4 .cfa: $rsp 16 + +STACK CFI INIT 8260 153 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8272 $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 828d $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 64 + +STACK CFI 82d7 $r12: $r12 $r13: $r13 $r14: $r14 $r15: $r15 $rbp: $rbp $rbx: $rbx .cfa: $rsp 8 + +STACK CFI 82e0 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ .cfa: $rsp 64 + +STACK CFI 83b0 $r12: $r12 $r13: $r13 $r14: $r14 $r15: $r15 $rbp: $rbp $rbx: $rbx .cfa: $rsp 8 + +STACK CFI INIT 1efc 1ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 1efe $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 1f05 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 1f07 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 1f09 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 1f10 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 1f11 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 1f15 .cfa: $rsp 112 + +STACK CFI 209d .cfa: $rsp 56 + +STACK CFI 209e .cfa: $rsp 48 + +STACK CFI 209f .cfa: $rsp 40 + +STACK CFI 20a1 .cfa: $rsp 32 + +STACK CFI 20a3 .cfa: $rsp 24 + +STACK CFI 20a5 .cfa: $rsp 16 + +STACK CFI 20a7 .cfa: $rsp 8 + +STACK CFI INIT 20a8 3f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 20a9 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 20ad $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 20b7 .cfa: $rsp 288 + +STACK CFI 20e2 .cfa: $rsp 24 + +STACK CFI 20e5 .cfa: $rsp 16 + +STACK CFI 20e6 .cfa: $rsp 8 + +STACK CFI INIT 83c0 248 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 83c2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 83c4 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 83ca $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 83cc $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 83cd $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 83d1 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 83d8 .cfa: $rsp 64 + +STACK CFI 8536 .cfa: $rsp 56 + +STACK CFI 8537 .cfa: $rsp 48 + +STACK CFI 8538 .cfa: $rsp 40 + +STACK CFI 853a .cfa: $rsp 32 + +STACK CFI 853c .cfa: $rsp 24 + +STACK CFI 853e .cfa: $rsp 16 + +STACK CFI 8545 .cfa: $rsp 8 + +STACK CFI 8550 .cfa: $rsp 64 + +STACK CFI 85b2 .cfa: $rsp 56 + +STACK CFI 85b5 .cfa: $rsp 48 + +STACK CFI 85b6 .cfa: $rsp 40 + +STACK CFI 85b8 .cfa: $rsp 32 + +STACK CFI 85ba .cfa: $rsp 24 + +STACK CFI 85bc .cfa: $rsp 16 + +STACK CFI 85be .cfa: $rsp 8 + +STACK CFI 85bf .cfa: $rsp 64 + +STACK CFI INIT 8610 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8640 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 8670 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 86a0 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 86d0 229 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 86ee $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI 86ff $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI 8741 .cfa: $rsp 8 + +STACK CFI 8748 .cfa: $rsp 128 + +STACK CFI INIT 8900 357 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8905 $rbp: .cfa -48 + ^ +STACK CFI 8917 $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $rbx: .cfa -56 + ^ +STACK CFI 8928 $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI 89a7 .cfa: $rsp 8 + +STACK CFI 89b0 .cfa: $rsp 128 + +STACK CFI INIT 4660 15e5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 4662 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 4664 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 4666 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 466c $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 466d $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 466e $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 4678 .cfa: $rsp 3696 + +STACK CFI 4899 .cfa: $rsp 56 + +STACK CFI 489c .cfa: $rsp 48 + +STACK CFI 489d .cfa: $rsp 40 + +STACK CFI 489f .cfa: $rsp 32 + +STACK CFI 48a1 .cfa: $rsp 24 + +STACK CFI 48a3 .cfa: $rsp 16 + +STACK CFI 48a5 .cfa: $rsp 8 + +STACK CFI 48b0 .cfa: $rsp 3696 + +STACK CFI INIT 8c60 17f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8c62 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 8c66 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 8c68 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 8c6a $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 8c6b $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 8c6f $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 8c76 .cfa: $rsp 96 + +STACK CFI 8cdb .cfa: $rsp 56 + +STACK CFI 8cdc .cfa: $rsp 48 + +STACK CFI 8cdd .cfa: $rsp 40 + +STACK CFI 8cdf .cfa: $rsp 32 + +STACK CFI 8ce1 .cfa: $rsp 24 + +STACK CFI 8ce3 .cfa: $rsp 16 + +STACK CFI 8ce5 .cfa: $rsp 8 + +STACK CFI 8cf0 .cfa: $rsp 96 + +STACK CFI INIT 8de0 3cd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 8de2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 8de4 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 8de6 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 8de8 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 8de9 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 8ded $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 8df1 .cfa: $rsp 128 + +STACK CFI 8ffd .cfa: $rsp 56 + +STACK CFI 8ffe .cfa: $rsp 48 + +STACK CFI 8fff .cfa: $rsp 40 + +STACK CFI 9001 .cfa: $rsp 32 + +STACK CFI 9003 .cfa: $rsp 24 + +STACK CFI 9005 .cfa: $rsp 16 + +STACK CFI 9007 .cfa: $rsp 8 + +STACK CFI 9010 .cfa: $rsp 128 + +STACK CFI 9079 .cfa: $rsp 56 + +STACK CFI 9081 .cfa: $rsp 48 + +STACK CFI 9082 .cfa: $rsp 40 + +STACK CFI 9084 .cfa: $rsp 32 + +STACK CFI 9086 .cfa: $rsp 24 + +STACK CFI 9088 .cfa: $rsp 16 + +STACK CFI 908a .cfa: $rsp 8 + +STACK CFI 9090 .cfa: $rsp 128 + +STACK CFI INIT 5c50 1d12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 5c52 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 5c5d $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 5c62 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 5c64 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 5c65 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 5c66 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI 5c6d .cfa: $rsp 2832 + +STACK CFI 5da2 .cfa: $rsp 56 + +STACK CFI 5da5 .cfa: $rsp 48 + +STACK CFI 5da6 .cfa: $rsp 40 + +STACK CFI 5da8 .cfa: $rsp 32 + +STACK CFI 5daa .cfa: $rsp 24 + +STACK CFI 5dac .cfa: $rsp 16 + +STACK CFI 5dae .cfa: $rsp 8 + +STACK CFI 5db0 .cfa: $rsp 2832 + +STACK CFI INIT 7970 1ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7972 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 7976 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 797a $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 7981 .cfa: $rsp 160 + +STACK CFI 7a65 .cfa: $rsp 32 + +STACK CFI 7a68 .cfa: $rsp 24 + +STACK CFI 7a69 .cfa: $rsp 16 + +STACK CFI 7a6b .cfa: $rsp 8 + +STACK CFI 7a70 .cfa: $rsp 160 + +STACK CFI INIT 7b20 2ce .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7b2a $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI 7b4b $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ .cfa: $rsp 368 + +STACK CFI 7bd0 .cfa: $rsp 8 + +STACK CFI 7bd8 .cfa: $rsp 368 + +STACK CFI INIT 7df0 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7df4 .cfa: $rsp 32 + +STACK CFI 7e1a .cfa: $rsp 8 + +STACK CFI INIT 7e20 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e24 .cfa: $rsp 32 + +STACK CFI 7e4b .cfa: $rsp 8 + +STACK CFI INIT 7e50 2a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e54 .cfa: $rsp 32 + +STACK CFI 7e79 .cfa: $rsp 8 + +STACK CFI INIT 7e80 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7e84 .cfa: $rsp 32 + +STACK CFI 7eaa .cfa: $rsp 8 + +STACK CFI INIT 7eb0 9a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7ec6 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ .cfa: $rsp 96 + +STACK CFI 7f2e .cfa: $rsp 8 + +STACK CFI 7f2f .cfa: $rsp 96 + +STACK CFI INIT 7f50 9b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7f66 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ .cfa: $rsp 96 + +STACK CFI 7fcf .cfa: $rsp 8 + +STACK CFI 7fd0 .cfa: $rsp 96 + +STACK CFI INIT 7ff0 26a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 7ff2 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 7ff6 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 7ff7 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 8000 .cfa: $rsp 368 + +STACK CFI 816a .cfa: $rsp 32 + +STACK CFI 816d .cfa: $rsp 24 + +STACK CFI 816e .cfa: $rsp 16 + +STACK CFI 8170 .cfa: $rsp 8 + +STACK CFI 8178 .cfa: $rsp 368 + +STACK CFI INIT 20e8 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 20f0 .cfa: $rsp 16 + +STACK CFI INIT 2108 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2110 .cfa: $rsp 16 + +STACK CFI INIT 91b0 1a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 91d0 87 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 91de $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ .cfa: $rsp 32 + +STACK CFI 9225 .cfa: $rsp 8 + +STACK CFI 9230 .cfa: $rsp 32 + +STACK CFI INIT 9260 2c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9274 .cfa: $rsp 16 + +STACK CFI INIT 9290 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 929a $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ +STACK CFI 92a6 $r12: .cfa -16 + ^ .cfa: $rsp 32 + +STACK CFI 92fb .cfa: $rsp 8 + +STACK CFI 9300 .cfa: $rsp 32 + +STACK CFI INIT 9310 15 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9330 d6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9348 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ .cfa: $rsp 48 + +STACK CFI 9393 .cfa: $rsp 8 + +STACK CFI 9398 .cfa: $rsp 48 + +STACK CFI INIT 9410 fa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9411 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9415 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9419 .cfa: $rsp 32 + +STACK CFI 944b .cfa: $rsp 24 + +STACK CFI 944c .cfa: $rsp 16 + +STACK CFI 944d .cfa: $rsp 8 + +STACK CFI 9450 .cfa: $rsp 32 + +STACK CFI INIT 9510 a8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9512 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9514 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9516 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 9517 $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 951a $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 951e .cfa: $rsp 64 + +STACK CFI 95a3 .cfa: $rsp 48 + +STACK CFI 95a4 .cfa: $rsp 40 + +STACK CFI 95a5 .cfa: $rsp 32 + +STACK CFI 95a7 .cfa: $rsp 24 + +STACK CFI 95a9 .cfa: $rsp 16 + +STACK CFI 95ab .cfa: $rsp 8 + +STACK CFI 95ac .cfa: $rsp 64 + +STACK CFI INIT 95c0 aa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 95c2 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 95c4 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 95c6 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 95c7 $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 95c8 $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 95ce .cfa: $rsp 64 + +STACK CFI 9655 .cfa: $rsp 48 + +STACK CFI 9656 .cfa: $rsp 40 + +STACK CFI 9657 .cfa: $rsp 32 + +STACK CFI 9659 .cfa: $rsp 24 + +STACK CFI 965b .cfa: $rsp 16 + +STACK CFI 965d .cfa: $rsp 8 + +STACK CFI 965e .cfa: $rsp 64 + +STACK CFI INIT 9670 41 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9671 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9691 .cfa: $rsp 8 + +STACK CFI 9692 .cfa: $rsp 16 + +STACK CFI INIT 96c0 88 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 96c4 .cfa: $rsp 16 + +STACK CFI 96e7 .cfa: $rsp 8 + +STACK CFI 96ec .cfa: $rsp 16 + +STACK CFI INIT 9750 c4 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9751 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9755 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9759 .cfa: $rsp 64 + +STACK CFI 9791 .cfa: $rsp 24 + +STACK CFI 9794 .cfa: $rsp 16 + +STACK CFI 9795 .cfa: $rsp 8 + +STACK CFI 97a0 .cfa: $rsp 64 + +STACK CFI 97ce .cfa: $rsp 24 + +STACK CFI 97d4 .cfa: $rsp 16 + +STACK CFI 97d5 .cfa: $rsp 8 + +STACK CFI 97d6 .cfa: $rsp 64 + +STACK CFI INIT 9840 22 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9870 1e8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9872 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9874 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9876 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 987a $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 987b $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 987f .cfa: $rsp 112 + +STACK CFI 9933 .cfa: $rsp 48 + +STACK CFI 9936 .cfa: $rsp 40 + +STACK CFI 9937 .cfa: $rsp 32 + +STACK CFI 9939 .cfa: $rsp 24 + +STACK CFI 993b .cfa: $rsp 16 + +STACK CFI 993d .cfa: $rsp 8 + +STACK CFI 9940 .cfa: $rsp 112 + +STACK CFI INIT 9820 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9a60 1e8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9a62 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9a64 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9a66 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 9a6a $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 9a6b $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 9a6f .cfa: $rsp 112 + +STACK CFI 9b24 .cfa: $rsp 48 + +STACK CFI 9b27 .cfa: $rsp 40 + +STACK CFI 9b28 .cfa: $rsp 32 + +STACK CFI 9b2a .cfa: $rsp 24 + +STACK CFI 9b2c .cfa: $rsp 16 + +STACK CFI 9b2e .cfa: $rsp 8 + +STACK CFI 9b30 .cfa: $rsp 112 + +STACK CFI INIT 9830 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT 9c50 78 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9c52 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9c5a $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9c5f $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 9c63 $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 9c6b .cfa: $rsp 64 + +STACK CFI 9cab .cfa: $rsp 40 + +STACK CFI 9cae .cfa: $rsp 32 + +STACK CFI 9caf .cfa: $rsp 24 + +STACK CFI 9cb1 .cfa: $rsp 16 + +STACK CFI 9cb3 .cfa: $rsp 8 + +STACK CFI 9cb8 .cfa: $rsp 64 + +STACK CFI 9cbf .cfa: $rsp 40 + +STACK CFI 9cc0 .cfa: $rsp 32 + +STACK CFI 9cc3 .cfa: $rsp 24 + +STACK CFI 9cc5 .cfa: $rsp 16 + +STACK CFI 9cc7 .cfa: $rsp 8 + +STACK CFI INIT 9cd0 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9cd1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9cdf .cfa: $rsp 48 + +STACK CFI 9d24 .cfa: $rsp 16 + +STACK CFI 9d25 .cfa: $rsp 8 + +STACK CFI INIT 9d30 147 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9d32 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9d34 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9d36 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI 9d3a $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI 9d3e $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI 9d42 .cfa: $rsp 80 + +STACK CFI 9dc3 .cfa: $rsp 48 + +STACK CFI 9dc7 .cfa: $rsp 40 + +STACK CFI 9dc8 .cfa: $rsp 32 + +STACK CFI 9dca .cfa: $rsp 24 + +STACK CFI 9dcc .cfa: $rsp 16 + +STACK CFI 9dce .cfa: $rsp 8 + +STACK CFI 9dd0 .cfa: $rsp 80 + +STACK CFI INIT a060 295 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a06a $r12: .cfa -40 + ^ $rbx: .cfa -56 + ^ +STACK CFI a085 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbp: .cfa -48 + ^ .cfa: $rsp 80 + +STACK CFI a136 .cfa: $rsp 8 + +STACK CFI a140 .cfa: $rsp 80 + +STACK CFI INIT 9e80 e3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9e81 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9e85 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9e8c .cfa: $rsp 64 + +STACK CFI 9f25 .cfa: $rsp 24 + +STACK CFI 9f26 .cfa: $rsp 16 + +STACK CFI 9f27 .cfa: $rsp 8 + +STACK CFI 9f30 .cfa: $rsp 64 + +STACK CFI 9f44 .cfa: $rsp 24 + +STACK CFI 9f45 .cfa: $rsp 16 + +STACK CFI 9f46 .cfa: $rsp 8 + +STACK CFI 9f50 .cfa: $rsp 64 + +STACK CFI INIT 9f70 e3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 9f71 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI 9f75 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI 9f7c .cfa: $rsp 64 + +STACK CFI a017 .cfa: $rsp 24 + +STACK CFI a018 .cfa: $rsp 16 + +STACK CFI a019 .cfa: $rsp 8 + +STACK CFI a020 .cfa: $rsp 64 + +STACK CFI a034 .cfa: $rsp 24 + +STACK CFI a035 .cfa: $rsp 16 + +STACK CFI a036 .cfa: $rsp 8 + +STACK CFI a040 .cfa: $rsp 64 + +STACK CFI INIT a430 16 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a434 .cfa: $rsp 16 + +STACK CFI a43f .cfa: $rsp 8 + +STACK CFI INIT a300 73 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a301 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a372 .cfa: $rsp 8 + +STACK CFI INIT a380 ad .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a381 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a385 .cfa: $rsp 32 + +STACK CFI a40a .cfa: $rsp 16 + +STACK CFI a40d .cfa: $rsp 8 + +STACK CFI a40e .cfa: $rsp 32 + +STACK CFI INIT a450 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a470 33 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a4b0 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a510 54 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a570 36 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a5b0 43 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a600 42 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a650 26 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a680 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a6c0 64 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a730 3a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a770 1e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a790 38 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a7d0 3e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a7d1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a7ed .cfa: $rsp 8 + +STACK CFI a7f0 .cfa: $rsp 16 + +STACK CFI a80d .cfa: $rsp 8 + +STACK CFI INIT a810 4e .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT a860 1aa .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI a862 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI a871 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI a879 $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI a87f $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI a880 $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI a887 .cfa: $rsp 208 + +STACK CFI a9a3 .cfa: $rsp 48 + +STACK CFI a9a9 .cfa: $rsp 40 + +STACK CFI a9aa .cfa: $rsp 32 + +STACK CFI a9ac .cfa: $rsp 24 + +STACK CFI a9ae .cfa: $rsp 16 + +STACK CFI a9b0 .cfa: $rsp 8 + +STACK CFI a9b8 .cfa: $rsp 208 + +STACK CFI a9ff .cfa: $rsp 48 + +STACK CFI aa02 .cfa: $rsp 40 + +STACK CFI aa03 .cfa: $rsp 32 + +STACK CFI aa05 .cfa: $rsp 24 + +STACK CFI aa07 .cfa: $rsp 16 + +STACK CFI aa09 .cfa: $rsp 8 + +STACK CFI INIT aa10 1c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aa13 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI aa24 .cfa: $rsp 8 + +STACK CFI aa28 .cfa: $rsp 16 + +STACK CFI aa2b .cfa: $rsp 8 + +STACK CFI INIT 2128 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI 2130 .cfa: $rsp 16 + +STACK CFI INIT aa30 67 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aa32 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI aa38 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI aa3f $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI aa40 $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI aa44 .cfa: $rsp 48 + +STACK CFI aa90 .cfa: $rsp 40 + +STACK CFI aa91 .cfa: $rsp 32 + +STACK CFI aa92 .cfa: $rsp 24 + +STACK CFI aa94 .cfa: $rsp 16 + +STACK CFI aa96 .cfa: $rsp 8 + +STACK CFI INIT aaa0 12 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aaa1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI aaad .cfa: $rsp 8 + +STACK CFI INIT aac0 105 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI aac2 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI aacd $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI aace $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI aad5 .cfa: $rsp 320 + +STACK CFI aaf3 .cfa: $rsp 32 + +STACK CFI aaf6 .cfa: $rsp 24 + +STACK CFI aaf7 .cfa: $rsp 16 + +STACK CFI aaf9 .cfa: $rsp 8 + +STACK CFI ab00 .cfa: $rsp 320 + +STACK CFI ab78 .cfa: $rsp 32 + +STACK CFI ab7b .cfa: $rsp 24 + +STACK CFI ab7c .cfa: $rsp 16 + +STACK CFI ab7e .cfa: $rsp 8 + +STACK CFI ab80 .cfa: $rsp 320 + +STACK CFI INIT abd0 32 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI abd1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI abe0 .cfa: $rsp 8 + +STACK CFI abe8 .cfa: $rsp 16 + +STACK CFI abfc .cfa: $rsp 8 + +STACK CFI INIT ac10 4c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ac60 94 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ac6a $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI ac77 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ +STACK CFI ac83 $r14: .cfa -16 + ^ .cfa: $rsp 48 + +STACK CFI acec .cfa: $rsp 8 + +STACK CFI acf0 .cfa: $rsp 48 + +STACK CFI INIT ad00 1fd .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ad0a $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI ad21 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ .cfa: $rsp 848 + +STACK CFI ad58 .cfa: $rsp 8 + +STACK CFI ad60 .cfa: $rsp 848 + +STACK CFI INIT af00 35d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI af0a $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI af2b $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 368 + +STACK CFI afb6 .cfa: $rsp 8 + +STACK CFI afc0 .cfa: $rsp 368 + +STACK CFI INIT bbd0 221 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI bbee $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI bbff $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI bc41 .cfa: $rsp 8 + +STACK CFI bc48 .cfa: $rsp 128 + +STACK CFI INIT be00 229 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI be1e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI be2f $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI be71 .cfa: $rsp 8 + +STACK CFI be78 .cfa: $rsp 128 + +STACK CFI INIT c030 229 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c04e $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI c05f $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI c0a1 .cfa: $rsp 8 + +STACK CFI c0a8 .cfa: $rsp 128 + +STACK CFI INIT c260 320 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c26a $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI c288 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI c2f5 .cfa: $rsp 8 + +STACK CFI c300 .cfa: $rsp 128 + +STACK CFI INIT c580 460 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c582 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI c584 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI c586 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI c588 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI c589 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI c58d $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI c591 .cfa: $rsp 128 + +STACK CFI c638 .cfa: $rsp 56 + +STACK CFI c639 .cfa: $rsp 48 + +STACK CFI c63a .cfa: $rsp 40 + +STACK CFI c63c .cfa: $rsp 32 + +STACK CFI c63e .cfa: $rsp 24 + +STACK CFI c640 .cfa: $rsp 16 + +STACK CFI c642 .cfa: $rsp 8 + +STACK CFI c648 .cfa: $rsp 128 + +STACK CFI c6c8 .cfa: $rsp 56 + +STACK CFI c6c9 .cfa: $rsp 48 + +STACK CFI c6ca .cfa: $rsp 40 + +STACK CFI c6cc .cfa: $rsp 32 + +STACK CFI c6ce .cfa: $rsp 24 + +STACK CFI c6d0 .cfa: $rsp 16 + +STACK CFI c6d2 .cfa: $rsp 8 + +STACK CFI c6d8 .cfa: $rsp 128 + +STACK CFI c8c8 .cfa: $rsp 56 + +STACK CFI c8c9 .cfa: $rsp 48 + +STACK CFI c8ca .cfa: $rsp 40 + +STACK CFI c8cc .cfa: $rsp 32 + +STACK CFI c8ce .cfa: $rsp 24 + +STACK CFI c8d0 .cfa: $rsp 16 + +STACK CFI c8d2 .cfa: $rsp 8 + +STACK CFI c8d8 .cfa: $rsp 128 + +STACK CFI INIT b260 1a9 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b26a $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI b284 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ .cfa: $rsp 64 + +STACK CFI b3ae .cfa: $rsp 8 + +STACK CFI b3b0 .cfa: $rsp 64 + +STACK CFI INIT c9e0 43f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI c9e2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI c9e4 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI c9e6 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI c9e8 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI c9ec $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI c9ed $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI c9f1 .cfa: $rsp 128 + +STACK CFI cab0 .cfa: $rsp 56 + +STACK CFI cab1 .cfa: $rsp 48 + +STACK CFI cab2 .cfa: $rsp 40 + +STACK CFI cab4 .cfa: $rsp 32 + +STACK CFI cab6 .cfa: $rsp 24 + +STACK CFI cab8 .cfa: $rsp 16 + +STACK CFI caba .cfa: $rsp 8 + +STACK CFI cac0 .cfa: $rsp 128 + +STACK CFI cb30 .cfa: $rsp 56 + +STACK CFI cb31 .cfa: $rsp 48 + +STACK CFI cb32 .cfa: $rsp 40 + +STACK CFI cb34 .cfa: $rsp 32 + +STACK CFI cb36 .cfa: $rsp 24 + +STACK CFI cb38 .cfa: $rsp 16 + +STACK CFI cb3a .cfa: $rsp 8 + +STACK CFI cb40 .cfa: $rsp 128 + +STACK CFI ccfd .cfa: $rsp 56 + +STACK CFI ccfe .cfa: $rsp 48 + +STACK CFI ccff .cfa: $rsp 40 + +STACK CFI cd01 .cfa: $rsp 32 + +STACK CFI cd03 .cfa: $rsp 24 + +STACK CFI cd05 .cfa: $rsp 16 + +STACK CFI cd07 .cfa: $rsp 8 + +STACK CFI cd10 .cfa: $rsp 128 + +STACK CFI INIT b410 7b2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI b412 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI b41e $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI b420 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI b422 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI b423 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI b424 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI b42b .cfa: $rsp 464 + +STACK CFI b44c .cfa: $rsp 56 + +STACK CFI b44d .cfa: $rsp 48 + +STACK CFI b44e .cfa: $rsp 40 + +STACK CFI b450 .cfa: $rsp 32 + +STACK CFI b452 .cfa: $rsp 24 + +STACK CFI b454 .cfa: $rsp 16 + +STACK CFI b456 .cfa: $rsp 8 + +STACK CFI b457 .cfa: $rsp 464 + +STACK CFI INIT ce20 3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT db00 13 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT ce30 d8 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ce46 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI ce57 $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 64 + +STACK CFI cea0 .cfa: $rsp 8 + +STACK CFI cea8 .cfa: $rsp 64 + +STACK CFI INIT cf10 ac .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cf12 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI cf17 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI cf19 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI cf1b $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI cf1c $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI cf1d $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI cf21 .cfa: $rsp 96 + +STACK CFI cf94 .cfa: $rsp 56 + +STACK CFI cf95 .cfa: $rsp 48 + +STACK CFI cf96 .cfa: $rsp 40 + +STACK CFI cf98 .cfa: $rsp 32 + +STACK CFI cf9a .cfa: $rsp 24 + +STACK CFI cf9c .cfa: $rsp 16 + +STACK CFI cf9e .cfa: $rsp 8 + +STACK CFI cfa0 .cfa: $rsp 96 + +STACK CFI INIT cfc0 c2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI cfc2 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI cfc7 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI cfc8 $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI cfcc $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI cfd0 .cfa: $rsp 64 + +STACK CFI d04f .cfa: $rsp 40 + +STACK CFI d053 .cfa: $rsp 32 + +STACK CFI d054 .cfa: $rsp 24 + +STACK CFI d056 .cfa: $rsp 16 + +STACK CFI d058 .cfa: $rsp 8 + +STACK CFI d060 .cfa: $rsp 64 + +STACK CFI INIT db20 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db28 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI db3b .cfa: $rsp 8 + +STACK CFI INIT d090 49f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d092 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI d094 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI d096 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI d098 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI d09c $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI d09d $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI d0a7 .cfa: $rsp 336 + +STACK CFI d0ef .cfa: $rsp 56 + +STACK CFI d0f0 .cfa: $rsp 48 + +STACK CFI d0f1 .cfa: $rsp 40 + +STACK CFI d0f3 .cfa: $rsp 32 + +STACK CFI d0f5 .cfa: $rsp 24 + +STACK CFI d0f7 .cfa: $rsp 16 + +STACK CFI d0f9 .cfa: $rsp 8 + +STACK CFI d0fa .cfa: $rsp 336 + +STACK CFI INIT d530 20 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d531 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI d54f .cfa: $rsp 8 + +STACK CFI INIT db40 306 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI db45 $rbx: .cfa -56 + ^ +STACK CFI db57 $r12: .cfa -40 + ^ $r14: .cfa -24 + ^ $rbp: .cfa -48 + ^ +STACK CFI db68 $r13: .cfa -32 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 128 + +STACK CFI dbce .cfa: $rsp 8 + +STACK CFI dbd0 .cfa: $rsp 128 + +STACK CFI INIT d550 36d .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d55a $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI d57f $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 352 + +STACK CFI d5cd .cfa: $rsp 8 + +STACK CFI d5d0 .cfa: $rsp 352 + +STACK CFI INIT de50 458 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI de52 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI de54 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI de56 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI de58 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI de59 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI de5d $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI de61 .cfa: $rsp 128 + +STACK CFI df08 .cfa: $rsp 56 + +STACK CFI df09 .cfa: $rsp 48 + +STACK CFI df0a .cfa: $rsp 40 + +STACK CFI df0c .cfa: $rsp 32 + +STACK CFI df0e .cfa: $rsp 24 + +STACK CFI df10 .cfa: $rsp 16 + +STACK CFI df12 .cfa: $rsp 8 + +STACK CFI df18 .cfa: $rsp 128 + +STACK CFI df90 .cfa: $rsp 56 + +STACK CFI df91 .cfa: $rsp 48 + +STACK CFI df92 .cfa: $rsp 40 + +STACK CFI df94 .cfa: $rsp 32 + +STACK CFI df96 .cfa: $rsp 24 + +STACK CFI df98 .cfa: $rsp 16 + +STACK CFI df9a .cfa: $rsp 8 + +STACK CFI dfa0 .cfa: $rsp 128 + +STACK CFI e18e .cfa: $rsp 56 + +STACK CFI e18f .cfa: $rsp 48 + +STACK CFI e190 .cfa: $rsp 40 + +STACK CFI e192 .cfa: $rsp 32 + +STACK CFI e194 .cfa: $rsp 24 + +STACK CFI e196 .cfa: $rsp 16 + +STACK CFI e198 .cfa: $rsp 8 + +STACK CFI e1a0 .cfa: $rsp 128 + +STACK CFI INIT d8c0 235 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI d8c2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI d8c9 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI d8cb $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI d8cd $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI d8d1 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI d8d2 $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI d8d9 .cfa: $rsp 320 + +STACK CFI da54 .cfa: $rsp 56 + +STACK CFI da55 .cfa: $rsp 48 + +STACK CFI da56 .cfa: $rsp 40 + +STACK CFI da58 .cfa: $rsp 32 + +STACK CFI da5a .cfa: $rsp 24 + +STACK CFI da5c .cfa: $rsp 16 + +STACK CFI da5e .cfa: $rsp 8 + +STACK CFI da60 .cfa: $rsp 320 + +STACK CFI INIT e2b0 e3 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e3a0 fe .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e3a4 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e3a8 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e427 .cfa: $rsp 16 + +STACK CFI e428 .cfa: $rsp 8 + +STACK CFI e430 .cfa: $rsp 24 + +STACK CFI e48b .cfa: $rsp 16 + +STACK CFI e48c .cfa: $rsp 8 + +STACK CFI e48d .cfa: $rsp 24 + +STACK CFI INIT e4a0 e6 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e4b1 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e4b2 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e4b3 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e528 $rbx: $rbx .cfa: $rsp 24 + +STACK CFI e529 $rbp: $rbp .cfa: $rsp 16 + +STACK CFI e536 $r12: $r12 .cfa: $rsp 8 + +STACK CFI e540 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e54b $rbx: $rbx .cfa: $rsp 24 + +STACK CFI e54c $rbp: $rbp .cfa: $rsp 16 + +STACK CFI e559 $r12: $r12 .cfa: $rsp 8 + +STACK CFI e560 $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e561 $rbx: $rbx .cfa: $rsp 24 + +STACK CFI e562 $rbp: $rbp .cfa: $rsp 16 + +STACK CFI e56c $r12: $r12 .cfa: $rsp 8 + +STACK CFI e56d $r12: .cfa -16 + ^ $rbp: .cfa -24 + ^ $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e56e $rbx: $rbx .cfa: $rsp 24 + +STACK CFI e56f $rbp: $rbp .cfa: $rsp 16 + +STACK CFI e57c $r12: $r12 .cfa: $rsp 8 + +STACK CFI INIT e590 216 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e592 $r13: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e597 $r12: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e59b $rbp: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e59f $rbx: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI e636 .cfa: $rsp 32 + +STACK CFI e642 .cfa: $rsp 24 + +STACK CFI e644 .cfa: $rsp 16 + +STACK CFI e646 .cfa: $rsp 8 + +STACK CFI e650 .cfa: $rsp 40 + +STACK CFI e73b .cfa: $rsp 32 + +STACK CFI e744 .cfa: $rsp 24 + +STACK CFI e746 .cfa: $rsp 16 + +STACK CFI e748 .cfa: $rsp 8 + +STACK CFI e750 .cfa: $rsp 40 + +STACK CFI e75b .cfa: $rsp 32 + +STACK CFI e767 .cfa: $rsp 24 + +STACK CFI e769 .cfa: $rsp 16 + +STACK CFI e76b .cfa: $rsp 8 + +STACK CFI e76c .cfa: $rsp 40 + +STACK CFI e774 .cfa: $rsp 32 + +STACK CFI e783 .cfa: $rsp 24 + +STACK CFI e785 .cfa: $rsp 16 + +STACK CFI e787 .cfa: $rsp 8 + +STACK CFI e788 .cfa: $rsp 40 + +STACK CFI INIT e7b0 2b .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT e7e0 265 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI e7e2 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI e7e4 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI e7e6 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI e7e8 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI e7e9 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI e7ea $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI e7ee .cfa: $rsp 96 + +STACK CFI e943 .cfa: $rsp 56 + +STACK CFI e944 .cfa: $rsp 48 + +STACK CFI e945 .cfa: $rsp 40 + +STACK CFI e947 .cfa: $rsp 32 + +STACK CFI e949 .cfa: $rsp 24 + +STACK CFI e94b .cfa: $rsp 16 + +STACK CFI e94d .cfa: $rsp 8 + +STACK CFI e950 .cfa: $rsp 96 + +STACK CFI INIT ea50 1c0 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ea52 $r14: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI ea59 $r13: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI ea5e $r12: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI ea5f $rbp: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI ea63 $rbx: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI eb98 .cfa: $rsp 40 + +STACK CFI eb9f .cfa: $rsp 32 + +STACK CFI eba1 .cfa: $rsp 24 + +STACK CFI eba3 .cfa: $rsp 16 + +STACK CFI eba5 .cfa: $rsp 8 + +STACK CFI ebb0 .cfa: $rsp 48 + +STACK CFI ebc1 .cfa: $rsp 40 + +STACK CFI ebcd .cfa: $rsp 32 + +STACK CFI ebcf .cfa: $rsp 24 + +STACK CFI ebd1 .cfa: $rsp 16 + +STACK CFI ebd3 .cfa: $rsp 8 + +STACK CFI ebd4 .cfa: $rsp 48 + +STACK CFI ebdc .cfa: $rsp 40 + +STACK CFI ebeb .cfa: $rsp 32 + +STACK CFI ebed .cfa: $rsp 24 + +STACK CFI ebef .cfa: $rsp 16 + +STACK CFI ebf1 .cfa: $rsp 8 + +STACK CFI ebf2 .cfa: $rsp 48 + +STACK CFI INIT ec10 29f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI ec12 $r15: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI ec14 $r14: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI ec16 $r13: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI ec18 $r12: .cfa -40 + ^ .cfa: $rsp 40 + +STACK CFI ec19 $rbp: .cfa -48 + ^ .cfa: $rsp 48 + +STACK CFI ec1a $rbx: .cfa -56 + ^ .cfa: $rsp 56 + +STACK CFI ec1e .cfa: $rsp 104 + +STACK CFI edbe .cfa: $rsp 56 + +STACK CFI edbf .cfa: $rsp 48 + +STACK CFI edc0 .cfa: $rsp 40 + +STACK CFI edc2 .cfa: $rsp 32 + +STACK CFI edc4 .cfa: $rsp 24 + +STACK CFI edc6 .cfa: $rsp 16 + +STACK CFI edc8 .cfa: $rsp 8 + +STACK CFI edd0 .cfa: $rsp 104 + +STACK CFI INIT eeb0 a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT eec0 1ee .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI eec2 $r12: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI eec6 $rbp: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI eec7 $rbx: .cfa -32 + ^ .cfa: $rsp 32 + +STACK CFI eed3 .cfa: $rsp 48 + +STACK CFI efab .cfa: $rsp 32 + +STACK CFI efac .cfa: $rsp 24 + +STACK CFI efad .cfa: $rsp 16 + +STACK CFI efaf .cfa: $rsp 8 + +STACK CFI efb0 .cfa: $rsp 48 + +STACK CFI INIT f0b0 59 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f0b1 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI f0bb .cfa: $rsp 48 + +STACK CFI f0ee .cfa: $rsp 16 + +STACK CFI f0ef .cfa: $rsp 8 + +STACK CFI f0f0 .cfa: $rsp 48 + +STACK CFI INIT f110 e5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f111 $rbp: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI f112 $rbx: .cfa -24 + ^ .cfa: $rsp 24 + +STACK CFI f1dc .cfa: $rsp 16 + +STACK CFI f1e1 .cfa: $rsp 8 + +STACK CFI f1e2 .cfa: $rsp 24 + +STACK CFI f1ef .cfa: $rsp 16 + +STACK CFI f1f4 .cfa: $rsp 8 + +STACK CFI INIT f200 10 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f210 56 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f21a $rbp: .cfa -16 + ^ $rbx: .cfa -24 + ^ +STACK CFI f221 .cfa: $rsp 32 + +STACK CFI f265 .cfa: $rsp 8 + +STACK CFI INIT f270 193 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f27a $rbp: .cfa -32 + ^ $rbx: .cfa -40 + ^ +STACK CFI f286 $r12: .cfa -24 + ^ $r13: .cfa -16 + ^ +STACK CFI f290 .cfa: $rsp 192 + +STACK CFI f2e5 .cfa: $rsp 8 + +STACK CFI f2f0 .cfa: $rsp 192 + +STACK CFI INIT f410 14 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f430 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f440 3a .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f441 $rbx: .cfa -16 + ^ .cfa: $rsp 16 + +STACK CFI f45f .cfa: $rsp 8 + +STACK CFI f460 .cfa: $rsp 16 + +STACK CFI f475 .cfa: $rsp 8 + +STACK CFI f476 .cfa: $rsp 16 + +STACK CFI f479 .cfa: $rsp 8 + +STACK CFI INIT f480 1f .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f48b .cfa: $rsp 16 + +STACK CFI f49e .cfa: $rsp 8 + +STACK CFI INIT f4a0 5 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT f4b0 466 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f4ba $rbp: .cfa -48 + ^ $rbx: .cfa -56 + ^ +STACK CFI f4d5 $r12: .cfa -40 + ^ $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ .cfa: $rsp 112 + +STACK CFI f53c .cfa: $rsp 8 + +STACK CFI f540 .cfa: $rsp 112 + +STACK CFI INIT f920 29c .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI f92a $rbp: .cfa -40 + ^ $rbx: .cfa -48 + ^ +STACK CFI f940 $r12: .cfa -32 + ^ $r13: .cfa -24 + ^ $r14: .cfa -16 + ^ .cfa: $rsp 48 + +STACK CFI f99b .cfa: $rsp 8 + +STACK CFI f9a0 .cfa: $rsp 48 + +STACK CFI INIT fbc0 2 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI INIT fbd0 89 .cfa: $rsp 8 + .ra: .cfa -8 + ^ +STACK CFI fbe1 $r12: .cfa -40 + ^ $rbp: .cfa -48 + ^ +STACK CFI fc00 .cfa: $rsp 64 + +STACK CFI fc06 $r13: .cfa -32 + ^ $r14: .cfa -24 + ^ $r15: .cfa -16 + ^ $rbx: .cfa -56 + ^ diff --git a/src/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym b/src/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym new file mode 100644 index 0000000..72fb4da --- /dev/null +++ b/src/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym @@ -0,0 +1,22151 @@ +MODULE windows x86 5A9832E5287241C1838ED98914E9B7FF1 test_app.pdb +FILE 1 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winbase.h +FILE 2 c:\program files\microsoft visual studio 8\vc\include\typeinfo +FILE 3 c:\breakpad\trunk\src\common\windows\guid_string.h +FILE 4 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcdce.h +FILE 5 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winreg.h +FILE 6 c:\program files\microsoft visual studio 8\vc\platformsdk\include\objidl.h +FILE 7 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wtypes.h +FILE 8 c:\program files\microsoft visual studio 8\vc\platformsdk\include\tvout.h +FILE 9 c:\program files\microsoft visual studio 8\vc\include\malloc.h +FILE 10 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack2.h +FILE 11 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winuser.h +FILE 12 c:\breakpad\trunk\src\client\windows\handler\exception_handler.cc +FILE 13 c:\program files\microsoft visual studio 8\vc\platformsdk\include\urlmon.h +FILE 14 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wincon.h +FILE 15 c:\program files\microsoft visual studio 8\vc\platformsdk\include\imm.h +FILE 16 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcdcep.h +FILE 17 c:\program files\microsoft visual studio 8\vc\include\xstring +FILE 18 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winver.h +FILE 19 c:\program files\microsoft visual studio 8\vc\include\xmemory +FILE 20 c:\program files\microsoft visual studio 8\vc\include\new +FILE 21 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack4.h +FILE 22 c:\program files\microsoft visual studio 8\vc\platformsdk\include\reason.h +FILE 23 c:\program files\microsoft visual studio 8\vc\include\vector +FILE 24 c:\program files\microsoft visual studio 8\vc\include\memory +FILE 25 c:\program files\microsoft visual studio 8\vc\include\wtime.inl +FILE 26 c:\program files\microsoft visual studio 8\vc\include\iterator +FILE 27 c:\program files\microsoft visual studio 8\vc\platformsdk\include\propidl.h +FILE 28 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack1.h +FILE 29 c:\program files\microsoft visual studio 8\vc\platformsdk\include\specstrings.h +FILE 30 c:\program files\microsoft visual studio 8\vc\platformsdk\include\basetsd.h +FILE 31 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winerror.h +FILE 32 c:\program files\microsoft visual studio 8\vc\include\assert.h +FILE 33 c:\program files\microsoft visual studio 8\vc\platformsdk\include\poppack.h +FILE 34 c:\program files\microsoft visual studio 8\vc\include\cstdio +FILE 35 c:\program files\microsoft visual studio 8\vc\include\stdio.h +FILE 36 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnterr.h +FILE 37 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcasync.h +FILE 38 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnsi.h +FILE 39 c:\program files\microsoft visual studio 8\vc\include\stdlib.h +FILE 40 c:\program files\microsoft visual studio 8\vc\platformsdk\include\servprov.h +FILE 41 c:\program files\microsoft visual studio 8\vc\include\limits.h +FILE 42 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcndr.h +FILE 43 c:\breakpad\trunk\src\client\windows\handler\exception_handler.h +FILE 44 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnsip.h +FILE 45 c:\program files\microsoft visual studio 8\vc\platformsdk\include\dbghelp.h +FILE 46 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnetwk.h +FILE 47 c:\program files\microsoft visual studio 8\vc\include\share.h +FILE 48 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack8.h +FILE 49 c:\program files\microsoft visual studio 8\vc\platformsdk\include\stralign.h +FILE 50 c:\breakpad\trunk\src\google_breakpad\common\minidump_format.h +FILE 51 c:\breakpad\trunk\src\google_breakpad\common\breakpad_types.h +FILE 52 c:\program files\microsoft visual studio 8\vc\include\xdebug +FILE 53 c:\program files\microsoft visual studio 8\vc\include\stdarg.h +FILE 54 c:\program files\microsoft visual studio 8\vc\platformsdk\include\windef.h +FILE 55 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsvc.h +FILE 56 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wingdi.h +FILE 57 c:\program files\microsoft visual studio 8\vc\include\xlocinfo +FILE 58 c:\program files\microsoft visual studio 8\vc\include\xlocinfo.h +FILE 59 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oleidl.h +FILE 60 c:\program files\microsoft visual studio 8\vc\include\locale.h +FILE 61 c:\program files\microsoft visual studio 8\vc\include\string +FILE 62 c:\program files\microsoft visual studio 8\vc\include\istream +FILE 63 c:\breakpad\trunk\src\common\windows\string_utils-inl.h +FILE 64 c:\program files\microsoft visual studio 8\vc\include\ostream +FILE 65 c:\program files\microsoft visual studio 8\vc\include\xutility +FILE 66 c:\program files\microsoft visual studio 8\vc\include\wchar.h +FILE 67 c:\program files\microsoft visual studio 8\vc\include\utility +FILE 68 c:\program files\microsoft visual studio 8\vc\include\ios +FILE 69 c:\program files\microsoft visual studio 8\vc\include\xlocnum +FILE 70 c:\program files\microsoft visual studio 8\vc\include\iosfwd +FILE 71 c:\program files\microsoft visual studio 8\vc\include\swprintf.inl +FILE 72 c:\program files\microsoft visual studio 8\vc\platformsdk\include\guiddef.h +FILE 73 c:\program files\microsoft visual studio 8\vc\include\cwchar +FILE 74 c:\program files\microsoft visual studio 8\vc\include\climits +FILE 75 c:\program files\microsoft visual studio 8\vc\include\crtdbg.h +FILE 76 c:\program files\microsoft visual studio 8\vc\include\cstdlib +FILE 77 c:\program files\microsoft visual studio 8\vc\include\streambuf +FILE 78 c:\program files\microsoft visual studio 8\vc\include\xiosbase +FILE 79 c:\program files\microsoft visual studio 8\vc\include\xlocale +FILE 80 c:\program files\microsoft visual studio 8\vc\include\cstring +FILE 81 c:\program files\microsoft visual studio 8\vc\platformsdk\include\mcx.h +FILE 82 c:\program files\microsoft visual studio 8\vc\include\stdexcept +FILE 83 c:\program files\microsoft visual studio 8\vc\include\exception +FILE 84 c:\program files\microsoft visual studio 8\vc\include\xstddef +FILE 85 c:\program files\microsoft visual studio 8\vc\platformsdk\include\objbase.h +FILE 86 c:\program files\microsoft visual studio 8\vc\include\cstddef +FILE 87 c:\program files\microsoft visual studio 8\vc\platformsdk\include\unknwn.h +FILE 88 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpc.h +FILE 89 c:\program files\microsoft visual studio 8\vc\include\stddef.h +FILE 90 c:\program files\microsoft visual studio 8\vc\include\cassert +FILE 91 c:\program files\microsoft visual studio 8\vc\platformsdk\include\ole2.h +FILE 92 c:\program files\microsoft visual studio 8\vc\platformsdk\include\windows.h +FILE 93 c:\program files\microsoft visual studio 8\vc\include\yvals.h +FILE 94 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oleauto.h +FILE 95 c:\program files\microsoft visual studio 8\vc\include\excpt.h +FILE 96 c:\program files\microsoft visual studio 8\vc\include\use_ansi.h +FILE 97 c:\program files\microsoft visual studio 8\vc\platformsdk\include\cguid.h +FILE 98 c:\program files\microsoft visual studio 8\vc\include\crtdefs.h +FILE 99 c:\program files\microsoft visual studio 8\vc\platformsdk\include\msxml.h +FILE 100 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oaidl.h +FILE 101 c:\program files\microsoft visual studio 8\vc\include\sal.h +FILE 102 c:\program files\microsoft visual studio 8\vc\include\vadefs.h +FILE 103 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h +FILE 104 c:\program files\microsoft visual studio 8\vc\include\ctype.h +FILE 105 c:\program files\microsoft visual studio 8\vc\include\eh.h +FILE 106 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnls.h +FILE 107 c:\program files\microsoft visual studio 8\vc\include\string.h +FILE 108 c:\program files\microsoft visual studio 8\vc\include\ctype.h +FILE 109 c:\program files\microsoft visual studio 8\vc\include\xutility +FILE 110 c:\program files\microsoft visual studio 8\vc\include\utility +FILE 111 c:\program files\microsoft visual studio 8\vc\include\iosfwd +FILE 112 c:\program files\microsoft visual studio 8\vc\include\cwchar +FILE 113 c:\program files\microsoft visual studio 8\vc\include\crtdbg.h +FILE 114 c:\program files\microsoft visual studio 8\vc\include\stdexcept +FILE 115 c:\program files\microsoft visual studio 8\vc\include\exception +FILE 116 c:\program files\microsoft visual studio 8\vc\include\xstddef +FILE 117 c:\program files\microsoft visual studio 8\vc\include\cstddef +FILE 118 c:\program files\microsoft visual studio 8\vc\include\stddef.h +FILE 119 c:\program files\microsoft visual studio 8\vc\include\eh.h +FILE 120 c:\program files\microsoft visual studio 8\vc\include\streambuf +FILE 121 c:\program files\microsoft visual studio 8\vc\include\xiosbase +FILE 122 c:\program files\microsoft visual studio 8\vc\include\xlocale +FILE 123 c:\program files\microsoft visual studio 8\vc\include\cstring +FILE 124 c:\program files\microsoft visual studio 8\vc\include\string.h +FILE 125 c:\program files\microsoft visual studio 8\vc\include\typeinfo +FILE 126 c:\breakpad\trunk\src\common\windows\guid_string.cc +FILE 127 c:\breakpad\trunk\src\common\windows\string_utils-inl.h +FILE 128 c:\program files\microsoft visual studio 8\vc\include\stdarg.h +FILE 129 c:\program files\microsoft visual studio 8\vc\include\string +FILE 130 c:\program files\microsoft visual studio 8\vc\include\istream +FILE 131 c:\program files\microsoft visual studio 8\vc\include\ostream +FILE 132 c:\program files\microsoft visual studio 8\vc\include\ios +FILE 133 c:\program files\microsoft visual studio 8\vc\include\xlocnum +FILE 134 c:\program files\microsoft visual studio 8\vc\include\climits +FILE 135 c:\program files\microsoft visual studio 8\vc\include\yvals.h +FILE 136 c:\program files\microsoft visual studio 8\vc\include\use_ansi.h +FILE 137 c:\program files\microsoft visual studio 8\vc\include\cstdlib +FILE 138 c:\program files\microsoft visual studio 8\vc\include\stdlib.h +FILE 139 c:\program files\microsoft visual studio 8\vc\include\malloc.h +FILE 140 c:\breakpad\trunk\src\common\windows\guid_string.h +FILE 141 c:\program files\microsoft visual studio 8\vc\platformsdk\include\guiddef.h +FILE 142 c:\program files\microsoft visual studio 8\vc\include\share.h +FILE 143 c:\program files\microsoft visual studio 8\vc\include\xstring +FILE 144 c:\program files\microsoft visual studio 8\vc\include\xmemory +FILE 145 c:\program files\microsoft visual studio 8\vc\include\new +FILE 146 c:\program files\microsoft visual studio 8\vc\include\locale.h +FILE 147 c:\program files\microsoft visual studio 8\vc\include\swprintf.inl +FILE 148 c:\program files\microsoft visual studio 8\vc\include\limits.h +FILE 149 c:\program files\microsoft visual studio 8\vc\include\wchar.h +FILE 150 c:\program files\microsoft visual studio 8\vc\include\cstdio +FILE 151 c:\program files\microsoft visual studio 8\vc\include\crtdefs.h +FILE 152 c:\program files\microsoft visual studio 8\vc\include\stdio.h +FILE 153 c:\program files\microsoft visual studio 8\vc\include\wtime.inl +FILE 154 c:\program files\microsoft visual studio 8\vc\include\sal.h +FILE 155 c:\program files\microsoft visual studio 8\vc\include\xdebug +FILE 156 c:\program files\microsoft visual studio 8\vc\include\vadefs.h +FILE 157 c:\program files\microsoft visual studio 8\vc\include\xlocinfo +FILE 158 c:\program files\microsoft visual studio 8\vc\include\xlocinfo.h +FILE 159 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnetwk.h +FILE 160 c:\program files\microsoft visual studio 8\vc\platformsdk\include\urlmon.h +FILE 161 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack8.h +FILE 162 c:\program files\microsoft visual studio 8\vc\platformsdk\include\cderr.h +FILE 163 c:\program files\microsoft visual studio 8\vc\platformsdk\include\shellapi.h +FILE 164 c:\program files\microsoft visual studio 8\vc\platformsdk\include\dde.h +FILE 165 c:\program files\microsoft visual studio 8\vc\include\vector +FILE 166 c:\program files\microsoft visual studio 8\vc\include\stdio.h +FILE 167 c:\program files\microsoft visual studio 8\vc\include\memory +FILE 168 c:\program files\microsoft visual studio 8\vc\include\iterator +FILE 169 c:\program files\microsoft visual studio 8\vc\include\malloc.h +FILE 170 c:\program files\microsoft visual studio 8\vc\include\stdarg.h +FILE 171 c:\program files\microsoft visual studio 8\vc\platformsdk\include\windef.h +FILE 172 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wingdi.h +FILE 173 c:\program files\microsoft visual studio 8\vc\platformsdk\include\imm.h +FILE 174 c:\program files\microsoft visual studio 8\vc\platformsdk\include\mmsystem.h +FILE 175 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winioctl.h +FILE 176 c:\program files\microsoft visual studio 8\vc\platformsdk\include\guiddef.h +FILE 177 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsmcrd.h +FILE 178 c:\test_app.cc +FILE 179 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oaidl.h +FILE 180 c:\program files\microsoft visual studio 8\vc\platformsdk\include\nb30.h +FILE 181 c:\program files\microsoft visual studio 8\vc\include\xstring +FILE 182 c:\program files\microsoft visual studio 8\vc\include\xmemory +FILE 183 c:\program files\microsoft visual studio 8\vc\include\new +FILE 184 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oleidl.h +FILE 185 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnls.h +FILE 186 c:\breakpad\trunk\src\google_breakpad\common\minidump_format.h +FILE 187 c:\program files\microsoft visual studio 8\vc\include\string.h +FILE 188 c:\breakpad\trunk\src\google_breakpad\common\breakpad_types.h +FILE 189 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h +FILE 190 c:\program files\microsoft visual studio 8\vc\include\ctype.h +FILE 191 c:\program files\microsoft visual studio 8\vc\include\wtime.inl +FILE 192 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winbase.h +FILE 193 c:\program files\microsoft visual studio 8\vc\platformsdk\include\propidl.h +FILE 194 c:\breakpad\trunk\src\client\windows\handler\exception_handler.h +FILE 195 c:\program files\microsoft visual studio 8\vc\include\stdlib.h +FILE 196 c:\program files\microsoft visual studio 8\vc\include\swprintf.inl +FILE 197 c:\program files\microsoft visual studio 8\vc\include\limits.h +FILE 198 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winreg.h +FILE 199 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpc.h +FILE 200 c:\program files\microsoft visual studio 8\vc\platformsdk\include\ole2.h +FILE 201 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winscard.h +FILE 202 c:\program files\microsoft visual studio 8\vc\platformsdk\include\objbase.h +FILE 203 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wtypes.h +FILE 204 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcndr.h +FILE 205 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcdce.h +FILE 206 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnsip.h +FILE 207 c:\program files\microsoft visual studio 8\vc\include\share.h +FILE 208 c:\program files\microsoft visual studio 8\vc\platformsdk\include\tvout.h +FILE 209 c:\program files\microsoft visual studio 8\vc\include\use_ansi.h +FILE 210 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winefs.h +FILE 211 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack2.h +FILE 212 c:\program files\microsoft visual studio 8\vc\platformsdk\include\commdlg.h +FILE 213 c:\program files\microsoft visual studio 8\vc\platformsdk\include\unknwn.h +FILE 214 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h +FILE 215 c:\program files\microsoft visual studio 8\vc\platformsdk\include\stralign.h +FILE 216 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winuser.h +FILE 217 c:\program files\microsoft visual studio 8\vc\platformsdk\include\servprov.h +FILE 218 c:\program files\microsoft visual studio 8\vc\include\xdebug +FILE 219 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsvc.h +FILE 220 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wincon.h +FILE 221 c:\program files\microsoft visual studio 8\vc\include\xlocinfo +FILE 222 c:\program files\microsoft visual studio 8\vc\include\xlocinfo.h +FILE 223 c:\program files\microsoft visual studio 8\vc\include\locale.h +FILE 224 c:\program files\microsoft visual studio 8\vc\platformsdk\include\cguid.h +FILE 225 c:\program files\microsoft visual studio 8\vc\include\string +FILE 226 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winver.h +FILE 227 c:\program files\microsoft visual studio 8\vc\include\istream +FILE 228 c:\program files\microsoft visual studio 8\vc\include\ostream +FILE 229 c:\program files\microsoft visual studio 8\vc\include\xutility +FILE 230 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winperf.h +FILE 231 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack4.h +FILE 232 c:\program files\microsoft visual studio 8\vc\include\utility +FILE 233 c:\program files\microsoft visual studio 8\vc\include\ios +FILE 234 c:\program files\microsoft visual studio 8\vc\include\xlocnum +FILE 235 c:\program files\microsoft visual studio 8\vc\include\crtdbg.h +FILE 236 c:\program files\microsoft visual studio 8\vc\include\iosfwd +FILE 237 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcdcep.h +FILE 238 c:\program files\microsoft visual studio 8\vc\include\cwchar +FILE 239 c:\program files\microsoft visual studio 8\vc\include\climits +FILE 240 c:\program files\microsoft visual studio 8\vc\include\wchar.h +FILE 241 c:\program files\microsoft visual studio 8\vc\include\cstdlib +FILE 242 c:\program files\microsoft visual studio 8\vc\platformsdk\include\mcx.h +FILE 243 c:\program files\microsoft visual studio 8\vc\include\streambuf +FILE 244 c:\program files\microsoft visual studio 8\vc\include\xiosbase +FILE 245 c:\program files\microsoft visual studio 8\vc\platformsdk\include\reason.h +FILE 246 c:\program files\microsoft visual studio 8\vc\include\xlocale +FILE 247 c:\program files\microsoft visual studio 8\vc\platformsdk\include\dlgs.h +FILE 248 c:\program files\microsoft visual studio 8\vc\include\cstring +FILE 249 c:\program files\microsoft visual studio 8\vc\include\stdexcept +FILE 250 c:\program files\microsoft visual studio 8\vc\platformsdk\include\pshpack1.h +FILE 251 c:\program files\microsoft visual studio 8\vc\include\exception +FILE 252 c:\program files\microsoft visual studio 8\vc\include\xstddef +FILE 253 c:\program files\microsoft visual studio 8\vc\platformsdk\include\specstrings.h +FILE 254 c:\program files\microsoft visual studio 8\vc\include\cstddef +FILE 255 c:\program files\microsoft visual studio 8\vc\platformsdk\include\basetsd.h +FILE 256 c:\program files\microsoft visual studio 8\vc\include\stddef.h +FILE 257 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winerror.h +FILE 258 c:\program files\microsoft visual studio 8\vc\platformsdk\include\wincrypt.h +FILE 259 c:\program files\microsoft visual studio 8\vc\platformsdk\include\poppack.h +FILE 260 c:\program files\microsoft visual studio 8\vc\platformsdk\include\winspool.h +FILE 261 c:\program files\microsoft visual studio 8\vc\platformsdk\include\oleauto.h +FILE 262 c:\program files\microsoft visual studio 8\vc\platformsdk\include\prsht.h +FILE 263 c:\program files\microsoft visual studio 8\vc\platformsdk\include\objidl.h +FILE 264 c:\program files\microsoft visual studio 8\vc\include\cstdio +FILE 265 c:\program files\microsoft visual studio 8\vc\include\yvals.h +FILE 266 c:\program files\microsoft visual studio 8\vc\include\eh.h +FILE 267 c:\program files\microsoft visual studio 8\vc\platformsdk\include\lzexpand.h +FILE 268 c:\program files\microsoft visual studio 8\vc\platformsdk\include\ddeml.h +FILE 269 c:\program files\microsoft visual studio 8\vc\include\crtdefs.h +FILE 270 c:\program files\microsoft visual studio 8\vc\include\sal.h +FILE 271 c:\program files\microsoft visual studio 8\vc\include\vadefs.h +FILE 272 c:\program files\microsoft visual studio 8\vc\platformsdk\include\dbghelp.h +FILE 273 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnterr.h +FILE 274 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcasync.h +FILE 275 c:\program files\microsoft visual studio 8\vc\platformsdk\include\rpcnsi.h +FILE 276 c:\program files\microsoft visual studio 8\vc\include\typeinfo +FILE 277 c:\program files\microsoft visual studio 8\vc\platformsdk\include\windows.h +FILE 278 c:\program files\microsoft visual studio 8\vc\include\excpt.h +FILE 279 c:\program files\microsoft visual studio 8\vc\platformsdk\include\msxml.h +FILE 280 f:\sp\vctools\crt_bld\self_x86\crt\src\xdebug +FILE 281 f:\sp\vctools\crt_bld\self_x86\crt\src\streambuf +FILE 282 f:\sp\vctools\crt_bld\self_x86\crt\src\xiosbase +FILE 283 f:\sp\vctools\crt_bld\self_x86\crt\src\xlocale +FILE 284 f:\sp\vctools\crt_bld\self_x86\crt\src\cstring +FILE 285 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 286 f:\sp\vctools\crt_bld\self_x86\crt\src\xlocinfo +FILE 287 f:\sp\vctools\crt_bld\self_x86\crt\src\xlocinfo.h +FILE 288 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 289 f:\sp\vctools\crt_bld\self_x86\crt\src\share.h +FILE 290 f:\sp\vctools\crt_bld\self_x86\crt\src\use_ansi.h +FILE 291 f:\sp\vctools\crt_bld\self_x86\crt\src\string.cpp +FILE 292 f:\sp\vctools\crt_bld\self_x86\crt\src\typeinfo +FILE 293 f:\sp\vctools\crt_bld\self_x86\crt\src\xutility +FILE 294 f:\sp\vctools\crt_bld\self_x86\crt\src\utility +FILE 295 f:\sp\vctools\crt_bld\self_x86\crt\src\iosfwd +FILE 296 f:\sp\vctools\crt_bld\self_x86\crt\src\cwchar +FILE 297 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 298 f:\sp\vctools\crt_bld\self_x86\crt\src\stdexcept +FILE 299 f:\sp\vctools\crt_bld\self_x86\crt\src\exception +FILE 300 f:\sp\vctools\crt_bld\self_x86\crt\src\xstddef +FILE 301 f:\sp\vctools\crt_bld\self_x86\crt\src\cstddef +FILE 302 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 303 f:\sp\vctools\crt_bld\self_x86\crt\src\istream +FILE 304 f:\sp\vctools\crt_bld\self_x86\crt\src\ostream +FILE 305 f:\sp\vctools\crt_bld\self_x86\crt\src\ios +FILE 306 f:\sp\vctools\crt_bld\self_x86\crt\src\xlocnum +FILE 307 f:\sp\vctools\crt_bld\self_x86\crt\src\eh.h +FILE 308 f:\sp\vctools\crt_bld\self_x86\crt\src\cstdlib +FILE 309 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 310 f:\sp\vctools\crt_bld\self_x86\crt\src\climits +FILE 311 f:\sp\vctools\crt_bld\self_x86\crt\src\yvals.h +FILE 312 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 313 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 314 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 315 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 316 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 317 f:\sp\vctools\crt_bld\self_x86\crt\src\cstdio +FILE 318 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 319 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 320 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 321 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 322 f:\sp\public\sdk\inc\ddbanned.h +FILE 323 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 324 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 325 f:\sp\vctools\crt_bld\self_x86\crt\src\xstring +FILE 326 f:\sp\vctools\crt_bld\self_x86\crt\src\xmemory +FILE 327 f:\sp\vctools\crt_bld\self_x86\crt\src\new +FILE 328 f:\sp\public\sdk\inc\reason.h +FILE 329 f:\sp\public\sdk\inc\wincon.h +FILE 330 f:\sp\public\sdk\inc\pshpack2.h +FILE 331 f:\sp\public\sdk\inc\mcx.h +FILE 332 f:\sp\public\sdk\inc\winuser.h +FILE 333 f:\sp\public\sdk\inc\winnls.h +FILE 334 f:\sp\public\sdk\inc\guiddef.h +FILE 335 f:\sp\public\sdk\inc\specstrings.h +FILE 336 f:\sp\public\sdk\inc\basetsd.h +FILE 337 f:\sp\public\sdk\inc\stralign.h +FILE 338 f:\sp\public\sdk\inc\tvout.h +FILE 339 f:\sp\public\sdk\inc\winsvc.h +FILE 340 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 341 f:\sp\public\sdk\inc\wingdi.h +FILE 342 f:\sp\public\sdk\inc\pshpack4.h +FILE 343 f:\sp\public\sdk\inc\poppack.h +FILE 344 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 345 f:\sp\public\sdk\inc\winnetwk.h +FILE 346 f:\sp\public\sdk\inc\imm.h +FILE 347 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 348 f:\sp\public\sdk\inc\windef.h +FILE 349 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 350 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\tran\i386\cpu_disp.c +FILE 351 f:\sp\public\sdk\inc\pshpack1.h +FILE 352 f:\sp\public\sdk\inc\winver.h +FILE 353 f:\sp\public\sdk\inc\windows.h +FILE 354 f:\sp\public\sdk\inc\winnt.h +FILE 355 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 356 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 357 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 358 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 359 f:\sp\public\sdk\inc\ddbanned.h +FILE 360 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 361 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 362 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 363 f:\sp\public\sdk\inc\winreg.h +FILE 364 f:\sp\public\sdk\inc\winbase.h +FILE 365 f:\sp\public\sdk\inc\winerror.h +FILE 366 f:\sp\public\sdk\inc\pshpack8.h +FILE 367 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 368 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 369 f:\sp\public\sdk\inc\reason.h +FILE 370 f:\sp\public\sdk\inc\wincon.h +FILE 371 f:\sp\public\sdk\inc\pshpack2.h +FILE 372 f:\sp\public\sdk\inc\mcx.h +FILE 373 f:\sp\public\sdk\inc\winuser.h +FILE 374 f:\sp\public\sdk\inc\winnls.h +FILE 375 f:\sp\public\sdk\inc\guiddef.h +FILE 376 f:\sp\public\sdk\inc\specstrings.h +FILE 377 f:\sp\public\sdk\inc\basetsd.h +FILE 378 f:\sp\public\sdk\inc\stralign.h +FILE 379 f:\sp\public\sdk\inc\tvout.h +FILE 380 f:\sp\public\sdk\inc\winsvc.h +FILE 381 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 382 f:\sp\public\sdk\inc\wingdi.h +FILE 383 f:\sp\public\sdk\inc\pshpack4.h +FILE 384 f:\sp\public\sdk\inc\poppack.h +FILE 385 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 386 f:\sp\public\sdk\inc\winnetwk.h +FILE 387 f:\sp\public\sdk\inc\imm.h +FILE 388 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 389 f:\sp\public\sdk\inc\windef.h +FILE 390 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 391 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\tran\i386\mathfcns.c +FILE 392 f:\sp\public\sdk\inc\pshpack1.h +FILE 393 f:\sp\public\sdk\inc\winver.h +FILE 394 f:\sp\public\sdk\inc\windows.h +FILE 395 f:\sp\public\sdk\inc\winnt.h +FILE 396 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 397 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 398 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 399 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 400 f:\sp\public\sdk\inc\ddbanned.h +FILE 401 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 402 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 403 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 404 f:\sp\public\sdk\inc\winreg.h +FILE 405 f:\sp\public\sdk\inc\winbase.h +FILE 406 f:\sp\public\sdk\inc\winerror.h +FILE 407 f:\sp\public\sdk\inc\pshpack8.h +FILE 408 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 409 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 410 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 411 f:\sp\public\sdk\inc\winreg.h +FILE 412 f:\sp\public\sdk\inc\winbase.h +FILE 413 f:\sp\public\sdk\inc\winerror.h +FILE 414 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 415 f:\sp\public\sdk\inc\windef.h +FILE 416 f:\sp\vctools\crt_bld\self_x86\crt\src\ctime.h +FILE 417 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 418 f:\sp\vctools\crt_bld\self_x86\crt\src\time.h +FILE 419 f:\sp\public\sdk\inc\pshpack8.h +FILE 420 f:\sp\public\sdk\inc\reason.h +FILE 421 f:\sp\public\sdk\inc\wincon.h +FILE 422 f:\sp\vctools\crt_bld\self_x86\crt\src\time.inl +FILE 423 f:\sp\public\sdk\inc\pshpack2.h +FILE 424 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 425 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 426 f:\sp\public\sdk\inc\mcx.h +FILE 427 f:\sp\public\sdk\inc\winuser.h +FILE 428 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 429 f:\sp\public\sdk\inc\winnls.h +FILE 430 f:\sp\public\sdk\inc\guiddef.h +FILE 431 f:\sp\public\sdk\inc\stralign.h +FILE 432 f:\sp\public\sdk\inc\winnt.h +FILE 433 f:\sp\public\sdk\inc\specstrings.h +FILE 434 f:\sp\public\sdk\inc\basetsd.h +FILE 435 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 436 f:\sp\public\sdk\inc\tvout.h +FILE 437 f:\sp\public\sdk\inc\winsvc.h +FILE 438 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 439 f:\sp\public\sdk\inc\wingdi.h +FILE 440 f:\sp\vctools\crt_bld\self_x86\crt\src\tzset.c +FILE 441 f:\sp\public\sdk\inc\pshpack4.h +FILE 442 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 443 f:\sp\public\sdk\inc\poppack.h +FILE 444 f:\sp\public\sdk\inc\winnetwk.h +FILE 445 f:\sp\public\sdk\inc\imm.h +FILE 446 f:\sp\public\sdk\inc\ddbanned.h +FILE 447 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 448 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 449 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 450 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 451 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 452 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 453 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 454 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 455 f:\sp\public\sdk\inc\windows.h +FILE 456 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 457 f:\sp\public\sdk\inc\pshpack1.h +FILE 458 f:\sp\public\sdk\inc\winver.h +FILE 459 f:\sp\vctools\crt_bld\self_x86\crt\src\time.inl +FILE 460 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 461 f:\sp\public\sdk\inc\winnt.h +FILE 462 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 463 f:\sp\public\sdk\inc\winreg.h +FILE 464 f:\sp\public\sdk\inc\winbase.h +FILE 465 f:\sp\public\sdk\inc\winerror.h +FILE 466 f:\sp\public\sdk\inc\pshpack8.h +FILE 467 f:\sp\public\sdk\inc\reason.h +FILE 468 f:\sp\public\sdk\inc\wincon.h +FILE 469 f:\sp\public\sdk\inc\pshpack2.h +FILE 470 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 471 f:\sp\public\sdk\inc\mcx.h +FILE 472 f:\sp\public\sdk\inc\winuser.h +FILE 473 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 474 f:\sp\public\sdk\inc\winnls.h +FILE 475 f:\sp\public\sdk\inc\guiddef.h +FILE 476 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 477 f:\sp\public\sdk\inc\stralign.h +FILE 478 f:\sp\public\sdk\inc\specstrings.h +FILE 479 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 480 f:\sp\public\sdk\inc\basetsd.h +FILE 481 f:\sp\public\sdk\inc\windows.h +FILE 482 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 483 f:\sp\public\sdk\inc\tvout.h +FILE 484 f:\sp\public\sdk\inc\winsvc.h +FILE 485 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 486 f:\sp\public\sdk\inc\wingdi.h +FILE 487 f:\sp\vctools\crt_bld\self_x86\crt\src\timeset.c +FILE 488 f:\sp\public\sdk\inc\pshpack4.h +FILE 489 f:\sp\public\sdk\inc\poppack.h +FILE 490 f:\sp\public\sdk\inc\winnetwk.h +FILE 491 f:\sp\public\sdk\inc\imm.h +FILE 492 f:\sp\public\sdk\inc\ddbanned.h +FILE 493 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 494 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 495 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 496 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 497 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 498 f:\sp\public\sdk\inc\windef.h +FILE 499 f:\sp\public\sdk\inc\pshpack1.h +FILE 500 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 501 f:\sp\vctools\crt_bld\self_x86\crt\src\time.h +FILE 502 f:\sp\public\sdk\inc\winver.h +FILE 503 f:\sp\public\sdk\inc\wincon.h +FILE 504 f:\sp\vctools\crt_bld\self_x86\crt\src\time.h +FILE 505 f:\sp\public\sdk\inc\imm.h +FILE 506 f:\sp\public\sdk\inc\winbase.h +FILE 507 f:\sp\public\sdk\inc\wingdi.h +FILE 508 f:\sp\public\sdk\inc\winver.h +FILE 509 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 510 f:\sp\public\sdk\inc\windows.h +FILE 511 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 512 f:\sp\public\sdk\inc\pshpack2.h +FILE 513 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 514 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 515 f:\sp\public\sdk\inc\reason.h +FILE 516 f:\sp\vctools\crt_bld\self_x86\crt\src\strftime.c +FILE 517 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 518 f:\sp\public\sdk\inc\specstrings.h +FILE 519 f:\sp\public\sdk\inc\basetsd.h +FILE 520 f:\sp\public\sdk\inc\pshpack4.h +FILE 521 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 522 f:\sp\public\sdk\inc\winnetwk.h +FILE 523 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 524 f:\sp\public\sdk\inc\stralign.h +FILE 525 f:\sp\vctools\crt_bld\self_x86\crt\src\time.inl +FILE 526 f:\sp\public\sdk\inc\poppack.h +FILE 527 f:\sp\public\sdk\inc\winsvc.h +FILE 528 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 529 f:\sp\public\sdk\inc\windef.h +FILE 530 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 531 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 532 f:\sp\public\sdk\inc\winuser.h +FILE 533 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 534 f:\sp\public\sdk\inc\mcx.h +FILE 535 f:\sp\public\sdk\inc\pshpack8.h +FILE 536 f:\sp\public\sdk\inc\guiddef.h +FILE 537 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 538 f:\sp\public\sdk\inc\winnt.h +FILE 539 f:\sp\public\sdk\inc\winnls.h +FILE 540 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 541 f:\sp\public\sdk\inc\pshpack1.h +FILE 542 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 543 f:\sp\public\sdk\inc\winerror.h +FILE 544 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 545 f:\sp\public\sdk\inc\winreg.h +FILE 546 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 547 f:\sp\public\sdk\inc\ddbanned.h +FILE 548 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 549 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 550 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 551 f:\sp\public\sdk\inc\tvout.h +FILE 552 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 553 f:\sp\public\sdk\inc\poppack.h +FILE 554 f:\sp\public\sdk\inc\winnetwk.h +FILE 555 f:\sp\public\sdk\inc\imm.h +FILE 556 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 557 f:\sp\public\sdk\inc\windef.h +FILE 558 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 559 f:\sp\public\sdk\inc\pshpack1.h +FILE 560 f:\sp\public\sdk\inc\winver.h +FILE 561 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 562 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 563 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 564 f:\sp\public\sdk\inc\winnt.h +FILE 565 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 566 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 567 f:\sp\public\sdk\inc\winreg.h +FILE 568 f:\sp\vctools\crt_bld\self_x86\crt\src\days.c +FILE 569 f:\sp\public\sdk\inc\winbase.h +FILE 570 f:\sp\public\sdk\inc\winerror.h +FILE 571 f:\sp\public\sdk\inc\pshpack8.h +FILE 572 f:\sp\public\sdk\inc\reason.h +FILE 573 f:\sp\public\sdk\inc\wincon.h +FILE 574 f:\sp\public\sdk\inc\ddbanned.h +FILE 575 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 576 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 577 f:\sp\public\sdk\inc\pshpack2.h +FILE 578 f:\sp\public\sdk\inc\mcx.h +FILE 579 f:\sp\public\sdk\inc\winuser.h +FILE 580 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 581 f:\sp\public\sdk\inc\winnls.h +FILE 582 f:\sp\public\sdk\inc\guiddef.h +FILE 583 f:\sp\public\sdk\inc\windows.h +FILE 584 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 585 f:\sp\public\sdk\inc\specstrings.h +FILE 586 f:\sp\public\sdk\inc\basetsd.h +FILE 587 f:\sp\public\sdk\inc\stralign.h +FILE 588 f:\sp\public\sdk\inc\tvout.h +FILE 589 f:\sp\public\sdk\inc\winsvc.h +FILE 590 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 591 f:\sp\public\sdk\inc\wingdi.h +FILE 592 f:\sp\public\sdk\inc\pshpack4.h +FILE 593 f:\sp\public\sdk\inc\wincon.h +FILE 594 f:\sp\public\sdk\inc\imm.h +FILE 595 f:\sp\public\sdk\inc\winbase.h +FILE 596 f:\sp\public\sdk\inc\wingdi.h +FILE 597 f:\sp\public\sdk\inc\winver.h +FILE 598 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 599 f:\sp\public\sdk\inc\windows.h +FILE 600 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 601 f:\sp\public\sdk\inc\pshpack2.h +FILE 602 f:\sp\public\sdk\inc\reason.h +FILE 603 f:\sp\vctools\crt_bld\self_x86\crt\src\strnicol.c +FILE 604 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 605 f:\sp\public\sdk\inc\specstrings.h +FILE 606 f:\sp\public\sdk\inc\basetsd.h +FILE 607 f:\sp\public\sdk\inc\pshpack4.h +FILE 608 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 609 f:\sp\public\sdk\inc\winnetwk.h +FILE 610 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 611 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 612 f:\sp\public\sdk\inc\stralign.h +FILE 613 f:\sp\public\sdk\inc\poppack.h +FILE 614 f:\sp\public\sdk\inc\winsvc.h +FILE 615 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 616 f:\sp\public\sdk\inc\windef.h +FILE 617 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 618 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 619 f:\sp\public\sdk\inc\winuser.h +FILE 620 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 621 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 622 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 623 f:\sp\public\sdk\inc\mcx.h +FILE 624 f:\sp\public\sdk\inc\pshpack8.h +FILE 625 f:\sp\public\sdk\inc\guiddef.h +FILE 626 f:\sp\public\sdk\inc\winnt.h +FILE 627 f:\sp\public\sdk\inc\winnls.h +FILE 628 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 629 f:\sp\public\sdk\inc\pshpack1.h +FILE 630 f:\sp\public\sdk\inc\winerror.h +FILE 631 f:\sp\public\sdk\inc\winreg.h +FILE 632 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 633 f:\sp\public\sdk\inc\ddbanned.h +FILE 634 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 635 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 636 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 637 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 638 f:\sp\public\sdk\inc\tvout.h +FILE 639 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 640 f:\sp\public\sdk\inc\mcx.h +FILE 641 f:\sp\public\sdk\inc\pshpack8.h +FILE 642 f:\sp\public\sdk\inc\winnt.h +FILE 643 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 644 f:\sp\public\sdk\inc\specstrings.h +FILE 645 f:\sp\public\sdk\inc\basetsd.h +FILE 646 f:\sp\public\sdk\inc\winnls.h +FILE 647 f:\sp\public\sdk\inc\pshpack1.h +FILE 648 f:\sp\public\sdk\inc\winerror.h +FILE 649 f:\sp\public\sdk\inc\winreg.h +FILE 650 f:\sp\vctools\crt_bld\self_x86\crt\src\strnicmp.c +FILE 651 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 652 f:\sp\public\sdk\inc\tvout.h +FILE 653 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 654 f:\sp\public\sdk\inc\wincon.h +FILE 655 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 656 f:\sp\public\sdk\inc\imm.h +FILE 657 f:\sp\public\sdk\inc\guiddef.h +FILE 658 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 659 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 660 f:\sp\public\sdk\inc\winbase.h +FILE 661 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 662 f:\sp\public\sdk\inc\wingdi.h +FILE 663 f:\sp\public\sdk\inc\windows.h +FILE 664 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 665 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 666 f:\sp\public\sdk\inc\winver.h +FILE 667 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 668 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 669 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 670 f:\sp\public\sdk\inc\pshpack2.h +FILE 671 f:\sp\public\sdk\inc\reason.h +FILE 672 f:\sp\public\sdk\inc\pshpack4.h +FILE 673 f:\sp\public\sdk\inc\winnetwk.h +FILE 674 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 675 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 676 f:\sp\public\sdk\inc\stralign.h +FILE 677 f:\sp\public\sdk\inc\windef.h +FILE 678 f:\sp\public\sdk\inc\poppack.h +FILE 679 f:\sp\public\sdk\inc\winsvc.h +FILE 680 f:\sp\public\sdk\inc\ddbanned.h +FILE 681 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 682 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 683 f:\sp\public\sdk\inc\winuser.h +FILE 684 f:\sp\public\sdk\inc\mcx.h +FILE 685 f:\sp\public\sdk\inc\pshpack8.h +FILE 686 f:\sp\public\sdk\inc\winnt.h +FILE 687 f:\sp\public\sdk\inc\specstrings.h +FILE 688 f:\sp\public\sdk\inc\basetsd.h +FILE 689 f:\sp\public\sdk\inc\winnls.h +FILE 690 f:\sp\public\sdk\inc\pshpack1.h +FILE 691 f:\sp\public\sdk\inc\winerror.h +FILE 692 f:\sp\public\sdk\inc\winreg.h +FILE 693 f:\sp\vctools\crt_bld\self_x86\crt\src\stricmp.c +FILE 694 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 695 f:\sp\public\sdk\inc\tvout.h +FILE 696 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 697 f:\sp\public\sdk\inc\wincon.h +FILE 698 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 699 f:\sp\public\sdk\inc\imm.h +FILE 700 f:\sp\public\sdk\inc\guiddef.h +FILE 701 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 702 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 703 f:\sp\public\sdk\inc\winbase.h +FILE 704 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 705 f:\sp\public\sdk\inc\wingdi.h +FILE 706 f:\sp\public\sdk\inc\windows.h +FILE 707 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 708 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 709 f:\sp\public\sdk\inc\winver.h +FILE 710 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 711 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 712 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 713 f:\sp\public\sdk\inc\pshpack2.h +FILE 714 f:\sp\public\sdk\inc\reason.h +FILE 715 f:\sp\public\sdk\inc\pshpack4.h +FILE 716 f:\sp\public\sdk\inc\winnetwk.h +FILE 717 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 718 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 719 f:\sp\public\sdk\inc\stralign.h +FILE 720 f:\sp\public\sdk\inc\windef.h +FILE 721 f:\sp\public\sdk\inc\poppack.h +FILE 722 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 723 f:\sp\public\sdk\inc\winsvc.h +FILE 724 f:\sp\public\sdk\inc\ddbanned.h +FILE 725 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 726 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 727 f:\sp\public\sdk\inc\winuser.h +FILE 728 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 729 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 730 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 731 f:\sp\vctools\crt_bld\self_x86\crt\src\wcslen.c +FILE 732 f:\sp\public\sdk\inc\ddbanned.h +FILE 733 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 734 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 735 f:\sp\public\sdk\inc\winnt.h +FILE 736 f:\sp\public\sdk\inc\pshpack4.h +FILE 737 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 738 f:\sp\public\sdk\inc\poppack.h +FILE 739 f:\sp\vctools\crt_bld\self_x86\crt\src\tcsncpy_s.inl +FILE 740 f:\sp\public\sdk\inc\winnetwk.h +FILE 741 f:\sp\public\sdk\inc\imm.h +FILE 742 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 743 f:\sp\public\sdk\inc\pshpack1.h +FILE 744 f:\sp\public\sdk\inc\winver.h +FILE 745 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 746 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 747 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 748 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 749 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 750 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 751 f:\sp\public\sdk\inc\guiddef.h +FILE 752 f:\sp\public\sdk\inc\windows.h +FILE 753 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 754 f:\sp\public\sdk\inc\specstrings.h +FILE 755 f:\sp\public\sdk\inc\basetsd.h +FILE 756 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 757 f:\sp\public\sdk\inc\winreg.h +FILE 758 f:\sp\vctools\crt_bld\self_x86\crt\src\strncpy_s.c +FILE 759 f:\sp\public\sdk\inc\winbase.h +FILE 760 f:\sp\public\sdk\inc\winerror.h +FILE 761 f:\sp\public\sdk\inc\pshpack8.h +FILE 762 f:\sp\public\sdk\inc\reason.h +FILE 763 f:\sp\public\sdk\inc\wincon.h +FILE 764 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 765 f:\sp\public\sdk\inc\ddbanned.h +FILE 766 f:\sp\public\sdk\inc\windef.h +FILE 767 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 768 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 769 f:\sp\public\sdk\inc\pshpack2.h +FILE 770 f:\sp\public\sdk\inc\mcx.h +FILE 771 f:\sp\public\sdk\inc\winuser.h +FILE 772 f:\sp\public\sdk\inc\winnls.h +FILE 773 f:\sp\public\sdk\inc\stralign.h +FILE 774 f:\sp\public\sdk\inc\tvout.h +FILE 775 f:\sp\public\sdk\inc\winsvc.h +FILE 776 f:\sp\public\sdk\inc\wingdi.h +FILE 777 f:\sp\public\sdk\inc\winnt.h +FILE 778 f:\sp\public\sdk\inc\pshpack4.h +FILE 779 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 780 f:\sp\public\sdk\inc\poppack.h +FILE 781 f:\sp\vctools\crt_bld\self_x86\crt\src\tcscpy_s.inl +FILE 782 f:\sp\public\sdk\inc\winnetwk.h +FILE 783 f:\sp\public\sdk\inc\imm.h +FILE 784 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 785 f:\sp\public\sdk\inc\pshpack1.h +FILE 786 f:\sp\public\sdk\inc\winver.h +FILE 787 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 788 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 789 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 790 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 791 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 792 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 793 f:\sp\public\sdk\inc\guiddef.h +FILE 794 f:\sp\public\sdk\inc\windows.h +FILE 795 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 796 f:\sp\public\sdk\inc\specstrings.h +FILE 797 f:\sp\public\sdk\inc\basetsd.h +FILE 798 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 799 f:\sp\public\sdk\inc\winreg.h +FILE 800 f:\sp\vctools\crt_bld\self_x86\crt\src\strcpy_s.c +FILE 801 f:\sp\public\sdk\inc\winbase.h +FILE 802 f:\sp\public\sdk\inc\winerror.h +FILE 803 f:\sp\public\sdk\inc\pshpack8.h +FILE 804 f:\sp\public\sdk\inc\reason.h +FILE 805 f:\sp\public\sdk\inc\wincon.h +FILE 806 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 807 f:\sp\public\sdk\inc\ddbanned.h +FILE 808 f:\sp\public\sdk\inc\windef.h +FILE 809 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 810 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 811 f:\sp\public\sdk\inc\pshpack2.h +FILE 812 f:\sp\public\sdk\inc\mcx.h +FILE 813 f:\sp\public\sdk\inc\winuser.h +FILE 814 f:\sp\public\sdk\inc\winnls.h +FILE 815 f:\sp\public\sdk\inc\stralign.h +FILE 816 f:\sp\public\sdk\inc\tvout.h +FILE 817 f:\sp\public\sdk\inc\winsvc.h +FILE 818 f:\sp\public\sdk\inc\wingdi.h +FILE 819 f:\sp\public\sdk\inc\winnt.h +FILE 820 f:\sp\public\sdk\inc\pshpack4.h +FILE 821 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 822 f:\sp\public\sdk\inc\poppack.h +FILE 823 f:\sp\vctools\crt_bld\self_x86\crt\src\tcscat_s.inl +FILE 824 f:\sp\public\sdk\inc\winnetwk.h +FILE 825 f:\sp\public\sdk\inc\imm.h +FILE 826 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 827 f:\sp\public\sdk\inc\pshpack1.h +FILE 828 f:\sp\public\sdk\inc\winver.h +FILE 829 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 830 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 831 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 832 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 833 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 834 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 835 f:\sp\public\sdk\inc\guiddef.h +FILE 836 f:\sp\public\sdk\inc\windows.h +FILE 837 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 838 f:\sp\public\sdk\inc\specstrings.h +FILE 839 f:\sp\public\sdk\inc\basetsd.h +FILE 840 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 841 f:\sp\public\sdk\inc\winreg.h +FILE 842 f:\sp\vctools\crt_bld\self_x86\crt\src\strcat_s.c +FILE 843 f:\sp\public\sdk\inc\winbase.h +FILE 844 f:\sp\public\sdk\inc\winerror.h +FILE 845 f:\sp\public\sdk\inc\pshpack8.h +FILE 846 f:\sp\public\sdk\inc\reason.h +FILE 847 f:\sp\public\sdk\inc\wincon.h +FILE 848 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 849 f:\sp\public\sdk\inc\ddbanned.h +FILE 850 f:\sp\public\sdk\inc\windef.h +FILE 851 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 852 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 853 f:\sp\public\sdk\inc\pshpack2.h +FILE 854 f:\sp\public\sdk\inc\mcx.h +FILE 855 f:\sp\public\sdk\inc\winuser.h +FILE 856 f:\sp\public\sdk\inc\winnls.h +FILE 857 f:\sp\public\sdk\inc\stralign.h +FILE 858 f:\sp\public\sdk\inc\tvout.h +FILE 859 f:\sp\public\sdk\inc\winsvc.h +FILE 860 f:\sp\public\sdk\inc\wingdi.h +FILE 861 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 862 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 863 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 864 f:\sp\vctools\crt_bld\self_x86\crt\src\strlen_s.c +FILE 865 f:\sp\public\sdk\inc\ddbanned.h +FILE 866 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 867 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 868 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strpbrk.asm +FILE 869 F:\SP\vctools\crt_bld\SELF_X86\crt\src\Intel\STRSPN.ASM +FILE 870 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 871 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\_strnicm.asm +FILE 872 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 873 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 874 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 875 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 876 f:\sp\vctools\crt_bld\self_x86\crt\src\intel\strncmp.c +FILE 877 f:\sp\public\sdk\inc\ddbanned.h +FILE 878 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 879 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 880 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strlen.asm +FILE 881 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 882 f:\sp\public\sdk\inc\pshpack2.h +FILE 883 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 884 f:\sp\public\sdk\inc\mcx.h +FILE 885 f:\sp\public\sdk\inc\winuser.h +FILE 886 f:\sp\public\sdk\inc\winnls.h +FILE 887 f:\sp\public\sdk\inc\stralign.h +FILE 888 f:\sp\public\sdk\inc\tvout.h +FILE 889 f:\sp\public\sdk\inc\winsvc.h +FILE 890 f:\sp\public\sdk\inc\wingdi.h +FILE 891 f:\sp\public\sdk\inc\winnt.h +FILE 892 f:\sp\public\sdk\inc\pshpack4.h +FILE 893 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 894 f:\sp\public\sdk\inc\poppack.h +FILE 895 f:\sp\public\sdk\inc\winnetwk.h +FILE 896 f:\sp\public\sdk\inc\imm.h +FILE 897 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 898 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 899 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 900 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 901 f:\sp\vctools\crt_bld\self_x86\crt\src\strdup.c +FILE 902 f:\sp\public\sdk\inc\pshpack1.h +FILE 903 f:\sp\public\sdk\inc\winver.h +FILE 904 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 905 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 906 f:\sp\public\sdk\inc\guiddef.h +FILE 907 f:\sp\public\sdk\inc\windows.h +FILE 908 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 909 f:\sp\public\sdk\inc\specstrings.h +FILE 910 f:\sp\public\sdk\inc\basetsd.h +FILE 911 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 912 f:\sp\public\sdk\inc\winreg.h +FILE 913 f:\sp\public\sdk\inc\ddbanned.h +FILE 914 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 915 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 916 f:\sp\public\sdk\inc\winbase.h +FILE 917 f:\sp\public\sdk\inc\winerror.h +FILE 918 f:\sp\public\sdk\inc\pshpack8.h +FILE 919 f:\sp\public\sdk\inc\reason.h +FILE 920 f:\sp\public\sdk\inc\wincon.h +FILE 921 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 922 f:\sp\public\sdk\inc\windef.h +FILE 923 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strcspn.asm +FILE 924 F:\SP\vctools\crt_bld\SELF_X86\crt\src\Intel\STRSPN.ASM +FILE 925 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 926 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strcmp.asm +FILE 927 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 928 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\strchr.asm +FILE 929 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 930 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\string\i386\p4_memset.c +FILE 931 f:\sp\public\sdk\inc\ddbanned.h +FILE 932 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 933 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 934 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\memset.asm +FILE 935 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 936 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 937 f:\sp\public\sdk\inc\poppack.h +FILE 938 f:\sp\public\sdk\inc\winnetwk.h +FILE 939 f:\sp\public\sdk\inc\imm.h +FILE 940 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 941 f:\sp\public\sdk\inc\pshpack1.h +FILE 942 f:\sp\public\sdk\inc\winver.h +FILE 943 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 944 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 945 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 946 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 947 f:\sp\public\sdk\inc\guiddef.h +FILE 948 f:\sp\public\sdk\inc\windows.h +FILE 949 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 950 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 951 f:\sp\public\sdk\inc\specstrings.h +FILE 952 f:\sp\public\sdk\inc\basetsd.h +FILE 953 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 954 f:\sp\public\sdk\inc\winreg.h +FILE 955 f:\sp\vctools\crt_bld\self_x86\crt\src\memmove_s.c +FILE 956 f:\sp\public\sdk\inc\winbase.h +FILE 957 f:\sp\public\sdk\inc\winerror.h +FILE 958 f:\sp\public\sdk\inc\pshpack8.h +FILE 959 f:\sp\public\sdk\inc\reason.h +FILE 960 f:\sp\public\sdk\inc\wincon.h +FILE 961 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 962 f:\sp\public\sdk\inc\windef.h +FILE 963 f:\sp\public\sdk\inc\ddbanned.h +FILE 964 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 965 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 966 f:\sp\public\sdk\inc\pshpack2.h +FILE 967 f:\sp\public\sdk\inc\mcx.h +FILE 968 f:\sp\public\sdk\inc\winuser.h +FILE 969 f:\sp\public\sdk\inc\winnls.h +FILE 970 f:\sp\public\sdk\inc\stralign.h +FILE 971 f:\sp\public\sdk\inc\tvout.h +FILE 972 f:\sp\public\sdk\inc\winsvc.h +FILE 973 f:\sp\public\sdk\inc\wingdi.h +FILE 974 f:\sp\public\sdk\inc\winnt.h +FILE 975 f:\sp\public\sdk\inc\pshpack4.h +FILE 976 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\memmove.asm +FILE 977 F:\SP\vctools\crt_bld\SELF_X86\crt\src\Intel\MEMCPY.ASM +FILE 978 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 979 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\string\i386\memcmp.c +FILE 980 f:\sp\public\sdk\inc\ddbanned.h +FILE 981 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 982 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 983 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 984 f:\sp\public\sdk\inc\poppack.h +FILE 985 f:\sp\public\sdk\inc\winnetwk.h +FILE 986 f:\sp\public\sdk\inc\imm.h +FILE 987 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 988 f:\sp\public\sdk\inc\pshpack1.h +FILE 989 f:\sp\public\sdk\inc\winver.h +FILE 990 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 991 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 992 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 993 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 994 f:\sp\public\sdk\inc\guiddef.h +FILE 995 f:\sp\public\sdk\inc\windows.h +FILE 996 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 997 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 998 f:\sp\public\sdk\inc\specstrings.h +FILE 999 f:\sp\public\sdk\inc\basetsd.h +FILE 1000 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1001 f:\sp\public\sdk\inc\winreg.h +FILE 1002 f:\sp\vctools\crt_bld\self_x86\crt\src\memcpy_s.c +FILE 1003 f:\sp\public\sdk\inc\winbase.h +FILE 1004 f:\sp\public\sdk\inc\winerror.h +FILE 1005 f:\sp\public\sdk\inc\pshpack8.h +FILE 1006 f:\sp\public\sdk\inc\reason.h +FILE 1007 f:\sp\public\sdk\inc\wincon.h +FILE 1008 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1009 f:\sp\public\sdk\inc\windef.h +FILE 1010 f:\sp\public\sdk\inc\ddbanned.h +FILE 1011 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1012 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1013 f:\sp\public\sdk\inc\pshpack2.h +FILE 1014 f:\sp\public\sdk\inc\mcx.h +FILE 1015 f:\sp\public\sdk\inc\winuser.h +FILE 1016 f:\sp\public\sdk\inc\winnls.h +FILE 1017 f:\sp\public\sdk\inc\stralign.h +FILE 1018 f:\sp\public\sdk\inc\tvout.h +FILE 1019 f:\sp\public\sdk\inc\winsvc.h +FILE 1020 f:\sp\public\sdk\inc\wingdi.h +FILE 1021 f:\sp\public\sdk\inc\winnt.h +FILE 1022 f:\sp\public\sdk\inc\pshpack4.h +FILE 1023 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\string\i386\p4_memcpy.c +FILE 1024 f:\sp\public\sdk\inc\ddbanned.h +FILE 1025 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 1026 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 1027 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\memcpy.asm +FILE 1028 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 1029 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1030 f:\sp\public\sdk\inc\wincon.h +FILE 1031 f:\sp\public\sdk\inc\imm.h +FILE 1032 f:\sp\public\sdk\inc\winbase.h +FILE 1033 f:\sp\public\sdk\inc\wingdi.h +FILE 1034 f:\sp\public\sdk\inc\winver.h +FILE 1035 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1036 f:\sp\public\sdk\inc\windows.h +FILE 1037 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1038 f:\sp\public\sdk\inc\pshpack2.h +FILE 1039 f:\sp\public\sdk\inc\reason.h +FILE 1040 f:\sp\vctools\crt_bld\self_x86\crt\src\woutputs.c +FILE 1041 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1042 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1043 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1044 f:\sp\public\sdk\inc\specstrings.h +FILE 1045 f:\sp\public\sdk\inc\basetsd.h +FILE 1046 f:\sp\public\sdk\inc\pshpack4.h +FILE 1047 f:\sp\public\sdk\inc\winnetwk.h +FILE 1048 f:\sp\public\sdk\inc\stralign.h +FILE 1049 f:\sp\public\sdk\inc\poppack.h +FILE 1050 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1051 f:\sp\public\sdk\inc\winsvc.h +FILE 1052 f:\sp\public\sdk\inc\windef.h +FILE 1053 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1054 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1055 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1056 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1057 f:\sp\public\sdk\inc\winuser.h +FILE 1058 f:\sp\public\sdk\inc\mcx.h +FILE 1059 f:\sp\public\sdk\inc\pshpack8.h +FILE 1060 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1061 f:\sp\public\sdk\inc\guiddef.h +FILE 1062 f:\sp\public\sdk\inc\winnt.h +FILE 1063 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1064 f:\sp\public\sdk\inc\winnls.h +FILE 1065 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1066 f:\sp\public\sdk\inc\pshpack1.h +FILE 1067 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1068 f:\sp\public\sdk\inc\winerror.h +FILE 1069 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1070 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1071 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1072 f:\sp\public\sdk\inc\winreg.h +FILE 1073 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1074 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1075 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1076 f:\sp\public\sdk\inc\ddbanned.h +FILE 1077 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1078 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1079 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1080 f:\sp\public\sdk\inc\tvout.h +FILE 1081 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1082 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1083 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1084 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1085 f:\sp\public\sdk\inc\wincon.h +FILE 1086 f:\sp\public\sdk\inc\imm.h +FILE 1087 f:\sp\public\sdk\inc\winbase.h +FILE 1088 f:\sp\public\sdk\inc\wingdi.h +FILE 1089 f:\sp\public\sdk\inc\winver.h +FILE 1090 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1091 f:\sp\public\sdk\inc\windows.h +FILE 1092 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1093 f:\sp\public\sdk\inc\pshpack2.h +FILE 1094 f:\sp\public\sdk\inc\reason.h +FILE 1095 f:\sp\vctools\crt_bld\self_x86\crt\src\woutputp.c +FILE 1096 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1097 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1098 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1099 f:\sp\public\sdk\inc\specstrings.h +FILE 1100 f:\sp\public\sdk\inc\basetsd.h +FILE 1101 f:\sp\public\sdk\inc\pshpack4.h +FILE 1102 f:\sp\public\sdk\inc\winnetwk.h +FILE 1103 f:\sp\public\sdk\inc\stralign.h +FILE 1104 f:\sp\public\sdk\inc\poppack.h +FILE 1105 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1106 f:\sp\public\sdk\inc\winsvc.h +FILE 1107 f:\sp\public\sdk\inc\windef.h +FILE 1108 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1109 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1110 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1111 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1112 f:\sp\public\sdk\inc\winuser.h +FILE 1113 f:\sp\public\sdk\inc\mcx.h +FILE 1114 f:\sp\public\sdk\inc\pshpack8.h +FILE 1115 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1116 f:\sp\public\sdk\inc\guiddef.h +FILE 1117 f:\sp\public\sdk\inc\winnt.h +FILE 1118 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1119 f:\sp\public\sdk\inc\winnls.h +FILE 1120 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1121 f:\sp\public\sdk\inc\pshpack1.h +FILE 1122 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1123 f:\sp\public\sdk\inc\winerror.h +FILE 1124 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1125 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1126 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1127 f:\sp\public\sdk\inc\winreg.h +FILE 1128 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1129 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1130 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1131 f:\sp\public\sdk\inc\ddbanned.h +FILE 1132 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1133 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1134 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1135 f:\sp\public\sdk\inc\tvout.h +FILE 1136 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1137 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1138 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1139 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1140 f:\sp\public\sdk\inc\wincon.h +FILE 1141 f:\sp\public\sdk\inc\imm.h +FILE 1142 f:\sp\public\sdk\inc\winbase.h +FILE 1143 f:\sp\public\sdk\inc\wingdi.h +FILE 1144 f:\sp\public\sdk\inc\winver.h +FILE 1145 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1146 f:\sp\public\sdk\inc\windows.h +FILE 1147 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1148 f:\sp\public\sdk\inc\pshpack2.h +FILE 1149 f:\sp\public\sdk\inc\reason.h +FILE 1150 f:\sp\vctools\crt_bld\self_x86\crt\src\woutput.c +FILE 1151 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1152 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1153 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1154 f:\sp\public\sdk\inc\specstrings.h +FILE 1155 f:\sp\public\sdk\inc\basetsd.h +FILE 1156 f:\sp\public\sdk\inc\pshpack4.h +FILE 1157 f:\sp\public\sdk\inc\winnetwk.h +FILE 1158 f:\sp\public\sdk\inc\stralign.h +FILE 1159 f:\sp\public\sdk\inc\poppack.h +FILE 1160 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1161 f:\sp\public\sdk\inc\winsvc.h +FILE 1162 f:\sp\public\sdk\inc\windef.h +FILE 1163 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1164 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1165 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1166 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1167 f:\sp\public\sdk\inc\winuser.h +FILE 1168 f:\sp\public\sdk\inc\mcx.h +FILE 1169 f:\sp\public\sdk\inc\pshpack8.h +FILE 1170 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1171 f:\sp\public\sdk\inc\guiddef.h +FILE 1172 f:\sp\public\sdk\inc\winnt.h +FILE 1173 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1174 f:\sp\public\sdk\inc\winnls.h +FILE 1175 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1176 f:\sp\public\sdk\inc\pshpack1.h +FILE 1177 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1178 f:\sp\public\sdk\inc\winerror.h +FILE 1179 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1180 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1181 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1182 f:\sp\public\sdk\inc\winreg.h +FILE 1183 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1184 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1185 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1186 f:\sp\public\sdk\inc\ddbanned.h +FILE 1187 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1188 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1189 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1190 f:\sp\public\sdk\inc\tvout.h +FILE 1191 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1192 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1193 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1194 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1195 f:\sp\public\sdk\inc\wincon.h +FILE 1196 f:\sp\public\sdk\inc\imm.h +FILE 1197 f:\sp\public\sdk\inc\winbase.h +FILE 1198 f:\sp\public\sdk\inc\wingdi.h +FILE 1199 f:\sp\public\sdk\inc\winver.h +FILE 1200 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1201 f:\sp\public\sdk\inc\windows.h +FILE 1202 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1203 f:\sp\public\sdk\inc\pshpack2.h +FILE 1204 f:\sp\public\sdk\inc\reason.h +FILE 1205 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1206 f:\sp\vctools\crt_bld\self_x86\crt\src\outputs.c +FILE 1207 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1208 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1209 f:\sp\public\sdk\inc\specstrings.h +FILE 1210 f:\sp\public\sdk\inc\basetsd.h +FILE 1211 f:\sp\public\sdk\inc\pshpack4.h +FILE 1212 f:\sp\public\sdk\inc\winnetwk.h +FILE 1213 f:\sp\public\sdk\inc\stralign.h +FILE 1214 f:\sp\public\sdk\inc\poppack.h +FILE 1215 f:\sp\public\sdk\inc\winsvc.h +FILE 1216 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1217 f:\sp\public\sdk\inc\windef.h +FILE 1218 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1219 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1220 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1221 f:\sp\public\sdk\inc\winuser.h +FILE 1222 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1223 f:\sp\public\sdk\inc\mcx.h +FILE 1224 f:\sp\public\sdk\inc\pshpack8.h +FILE 1225 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1226 f:\sp\public\sdk\inc\guiddef.h +FILE 1227 f:\sp\public\sdk\inc\winnt.h +FILE 1228 f:\sp\public\sdk\inc\winnls.h +FILE 1229 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1230 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1231 f:\sp\public\sdk\inc\pshpack1.h +FILE 1232 f:\sp\public\sdk\inc\winerror.h +FILE 1233 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1234 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1235 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1236 f:\sp\public\sdk\inc\winreg.h +FILE 1237 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1238 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1239 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1240 f:\sp\public\sdk\inc\ddbanned.h +FILE 1241 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1242 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1243 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1244 f:\sp\public\sdk\inc\tvout.h +FILE 1245 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1246 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1247 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1248 f:\sp\public\sdk\inc\wincon.h +FILE 1249 f:\sp\public\sdk\inc\imm.h +FILE 1250 f:\sp\public\sdk\inc\winbase.h +FILE 1251 f:\sp\public\sdk\inc\wingdi.h +FILE 1252 f:\sp\public\sdk\inc\winver.h +FILE 1253 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1254 f:\sp\public\sdk\inc\windows.h +FILE 1255 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1256 f:\sp\public\sdk\inc\pshpack2.h +FILE 1257 f:\sp\public\sdk\inc\reason.h +FILE 1258 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1259 f:\sp\vctools\crt_bld\self_x86\crt\src\outputp.c +FILE 1260 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1261 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1262 f:\sp\public\sdk\inc\specstrings.h +FILE 1263 f:\sp\public\sdk\inc\basetsd.h +FILE 1264 f:\sp\public\sdk\inc\pshpack4.h +FILE 1265 f:\sp\public\sdk\inc\winnetwk.h +FILE 1266 f:\sp\public\sdk\inc\stralign.h +FILE 1267 f:\sp\public\sdk\inc\poppack.h +FILE 1268 f:\sp\public\sdk\inc\winsvc.h +FILE 1269 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1270 f:\sp\public\sdk\inc\windef.h +FILE 1271 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1272 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1273 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1274 f:\sp\public\sdk\inc\winuser.h +FILE 1275 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1276 f:\sp\public\sdk\inc\mcx.h +FILE 1277 f:\sp\public\sdk\inc\pshpack8.h +FILE 1278 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1279 f:\sp\public\sdk\inc\guiddef.h +FILE 1280 f:\sp\public\sdk\inc\winnt.h +FILE 1281 f:\sp\public\sdk\inc\winnls.h +FILE 1282 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1283 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1284 f:\sp\public\sdk\inc\pshpack1.h +FILE 1285 f:\sp\public\sdk\inc\winerror.h +FILE 1286 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1287 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1288 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1289 f:\sp\public\sdk\inc\winreg.h +FILE 1290 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1291 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1292 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1293 f:\sp\public\sdk\inc\ddbanned.h +FILE 1294 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1295 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1296 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1297 f:\sp\public\sdk\inc\tvout.h +FILE 1298 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1299 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1300 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1301 f:\sp\public\sdk\inc\wincon.h +FILE 1302 f:\sp\public\sdk\inc\imm.h +FILE 1303 f:\sp\public\sdk\inc\winbase.h +FILE 1304 f:\sp\public\sdk\inc\wingdi.h +FILE 1305 f:\sp\public\sdk\inc\winver.h +FILE 1306 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1307 f:\sp\public\sdk\inc\windows.h +FILE 1308 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1309 f:\sp\public\sdk\inc\pshpack2.h +FILE 1310 f:\sp\public\sdk\inc\reason.h +FILE 1311 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 1312 f:\sp\vctools\crt_bld\self_x86\crt\src\output.c +FILE 1313 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1314 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1315 f:\sp\public\sdk\inc\specstrings.h +FILE 1316 f:\sp\public\sdk\inc\basetsd.h +FILE 1317 f:\sp\public\sdk\inc\pshpack4.h +FILE 1318 f:\sp\public\sdk\inc\winnetwk.h +FILE 1319 f:\sp\public\sdk\inc\stralign.h +FILE 1320 f:\sp\public\sdk\inc\poppack.h +FILE 1321 f:\sp\public\sdk\inc\winsvc.h +FILE 1322 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1323 f:\sp\public\sdk\inc\windef.h +FILE 1324 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1325 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1326 f:\sp\public\sdk\inc\winuser.h +FILE 1327 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1328 f:\sp\public\sdk\inc\mcx.h +FILE 1329 f:\sp\public\sdk\inc\pshpack8.h +FILE 1330 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1331 f:\sp\public\sdk\inc\guiddef.h +FILE 1332 f:\sp\public\sdk\inc\winnt.h +FILE 1333 f:\sp\public\sdk\inc\winnls.h +FILE 1334 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1335 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1336 f:\sp\public\sdk\inc\pshpack1.h +FILE 1337 f:\sp\public\sdk\inc\winerror.h +FILE 1338 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1339 f:\sp\vctools\crt_bld\self_x86\crt\src\cvt.h +FILE 1340 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 1341 f:\sp\public\sdk\inc\winreg.h +FILE 1342 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1343 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 1344 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 1345 f:\sp\public\sdk\inc\ddbanned.h +FILE 1346 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1347 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1348 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1349 f:\sp\public\sdk\inc\tvout.h +FILE 1350 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1351 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1352 f:\sp\public\sdk\inc\stralign.h +FILE 1353 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1354 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1355 f:\sp\public\sdk\inc\tvout.h +FILE 1356 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1357 f:\sp\public\sdk\inc\windows.h +FILE 1358 f:\sp\public\sdk\inc\winsvc.h +FILE 1359 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1360 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1361 f:\sp\public\sdk\inc\wingdi.h +FILE 1362 f:\sp\public\sdk\inc\pshpack4.h +FILE 1363 f:\sp\public\sdk\inc\poppack.h +FILE 1364 f:\sp\public\sdk\inc\winnetwk.h +FILE 1365 f:\sp\public\sdk\inc\imm.h +FILE 1366 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1367 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1368 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1369 f:\sp\public\sdk\inc\windef.h +FILE 1370 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1371 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1372 f:\sp\public\sdk\inc\pshpack1.h +FILE 1373 f:\sp\public\sdk\inc\winver.h +FILE 1374 f:\sp\vctools\crt_bld\self_x86\crt\src\vswprnc.c +FILE 1375 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1376 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1377 f:\sp\public\sdk\inc\winnt.h +FILE 1378 f:\sp\public\sdk\inc\winreg.h +FILE 1379 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1380 f:\sp\vctools\crt_bld\self_x86\crt\src\vswprint.c +FILE 1381 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1382 f:\sp\public\sdk\inc\winbase.h +FILE 1383 f:\sp\public\sdk\inc\winerror.h +FILE 1384 f:\sp\public\sdk\inc\ddbanned.h +FILE 1385 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1386 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1387 f:\sp\public\sdk\inc\pshpack8.h +FILE 1388 f:\sp\public\sdk\inc\guiddef.h +FILE 1389 f:\sp\public\sdk\inc\specstrings.h +FILE 1390 f:\sp\public\sdk\inc\basetsd.h +FILE 1391 f:\sp\public\sdk\inc\reason.h +FILE 1392 f:\sp\public\sdk\inc\wincon.h +FILE 1393 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1394 f:\sp\public\sdk\inc\pshpack2.h +FILE 1395 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1396 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1397 f:\sp\public\sdk\inc\mcx.h +FILE 1398 f:\sp\public\sdk\inc\winuser.h +FILE 1399 f:\sp\public\sdk\inc\winnls.h +FILE 1400 f:\sp\public\sdk\inc\pshpack1.h +FILE 1401 f:\sp\public\sdk\inc\winver.h +FILE 1402 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1403 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1404 f:\sp\public\sdk\inc\winnt.h +FILE 1405 f:\sp\public\sdk\inc\winreg.h +FILE 1406 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1407 f:\sp\public\sdk\inc\winbase.h +FILE 1408 f:\sp\public\sdk\inc\winerror.h +FILE 1409 f:\sp\public\sdk\inc\pshpack8.h +FILE 1410 f:\sp\public\sdk\inc\guiddef.h +FILE 1411 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1412 f:\sp\public\sdk\inc\specstrings.h +FILE 1413 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1414 f:\sp\public\sdk\inc\basetsd.h +FILE 1415 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1416 f:\sp\public\sdk\inc\reason.h +FILE 1417 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1418 f:\sp\public\sdk\inc\wincon.h +FILE 1419 f:\sp\public\sdk\inc\pshpack2.h +FILE 1420 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1421 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1422 f:\sp\public\sdk\inc\mcx.h +FILE 1423 f:\sp\public\sdk\inc\winuser.h +FILE 1424 f:\sp\public\sdk\inc\winnls.h +FILE 1425 f:\sp\vctools\crt_bld\self_x86\crt\src\vswprint.c +FILE 1426 f:\sp\public\sdk\inc\stralign.h +FILE 1427 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1428 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1429 f:\sp\public\sdk\inc\tvout.h +FILE 1430 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1431 f:\sp\public\sdk\inc\windows.h +FILE 1432 f:\sp\public\sdk\inc\winsvc.h +FILE 1433 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1434 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1435 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1436 f:\sp\public\sdk\inc\wingdi.h +FILE 1437 f:\sp\public\sdk\inc\pshpack4.h +FILE 1438 f:\sp\public\sdk\inc\poppack.h +FILE 1439 f:\sp\public\sdk\inc\ddbanned.h +FILE 1440 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1441 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1442 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1443 f:\sp\public\sdk\inc\winnetwk.h +FILE 1444 f:\sp\public\sdk\inc\imm.h +FILE 1445 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1446 f:\sp\public\sdk\inc\windef.h +FILE 1447 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1448 f:\sp\public\sdk\inc\windef.h +FILE 1449 f:\sp\public\sdk\inc\pshpack1.h +FILE 1450 f:\sp\public\sdk\inc\winver.h +FILE 1451 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1452 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1453 f:\sp\public\sdk\inc\winnt.h +FILE 1454 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1455 f:\sp\public\sdk\inc\winreg.h +FILE 1456 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1457 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1458 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1459 f:\sp\public\sdk\inc\winbase.h +FILE 1460 f:\sp\public\sdk\inc\winerror.h +FILE 1461 f:\sp\public\sdk\inc\pshpack8.h +FILE 1462 f:\sp\vctools\crt_bld\self_x86\crt\src\vfprintf.c +FILE 1463 f:\sp\public\sdk\inc\reason.h +FILE 1464 f:\sp\public\sdk\inc\wincon.h +FILE 1465 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1466 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1467 f:\sp\public\sdk\inc\pshpack2.h +FILE 1468 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1469 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1470 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1471 f:\sp\public\sdk\inc\mcx.h +FILE 1472 f:\sp\public\sdk\inc\winuser.h +FILE 1473 f:\sp\public\sdk\inc\winnls.h +FILE 1474 f:\sp\public\sdk\inc\guiddef.h +FILE 1475 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1476 f:\sp\public\sdk\inc\windows.h +FILE 1477 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1478 f:\sp\public\sdk\inc\specstrings.h +FILE 1479 f:\sp\public\sdk\inc\basetsd.h +FILE 1480 f:\sp\public\sdk\inc\stralign.h +FILE 1481 f:\sp\public\sdk\inc\tvout.h +FILE 1482 f:\sp\public\sdk\inc\ddbanned.h +FILE 1483 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1484 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1485 f:\sp\public\sdk\inc\winsvc.h +FILE 1486 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1487 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1488 f:\sp\public\sdk\inc\wingdi.h +FILE 1489 f:\sp\public\sdk\inc\pshpack4.h +FILE 1490 f:\sp\public\sdk\inc\poppack.h +FILE 1491 f:\sp\public\sdk\inc\winnetwk.h +FILE 1492 f:\sp\public\sdk\inc\imm.h +FILE 1493 f:\sp\public\sdk\inc\windef.h +FILE 1494 f:\sp\public\sdk\inc\pshpack1.h +FILE 1495 f:\sp\public\sdk\inc\winver.h +FILE 1496 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1497 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1498 f:\sp\public\sdk\inc\winnt.h +FILE 1499 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1500 f:\sp\public\sdk\inc\winreg.h +FILE 1501 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1502 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1503 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1504 f:\sp\public\sdk\inc\winbase.h +FILE 1505 f:\sp\public\sdk\inc\winerror.h +FILE 1506 f:\sp\public\sdk\inc\pshpack8.h +FILE 1507 f:\sp\vctools\crt_bld\self_x86\crt\src\vprintf.c +FILE 1508 f:\sp\public\sdk\inc\reason.h +FILE 1509 f:\sp\public\sdk\inc\wincon.h +FILE 1510 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1511 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1512 f:\sp\public\sdk\inc\pshpack2.h +FILE 1513 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1514 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1515 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1516 f:\sp\public\sdk\inc\mcx.h +FILE 1517 f:\sp\public\sdk\inc\winuser.h +FILE 1518 f:\sp\public\sdk\inc\winnls.h +FILE 1519 f:\sp\public\sdk\inc\guiddef.h +FILE 1520 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1521 f:\sp\public\sdk\inc\windows.h +FILE 1522 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1523 f:\sp\public\sdk\inc\specstrings.h +FILE 1524 f:\sp\public\sdk\inc\basetsd.h +FILE 1525 f:\sp\public\sdk\inc\stralign.h +FILE 1526 f:\sp\public\sdk\inc\tvout.h +FILE 1527 f:\sp\public\sdk\inc\ddbanned.h +FILE 1528 f:\sp\public\sdk\inc\winsvc.h +FILE 1529 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1530 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1531 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1532 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1533 f:\sp\public\sdk\inc\wingdi.h +FILE 1534 f:\sp\public\sdk\inc\pshpack4.h +FILE 1535 f:\sp\public\sdk\inc\poppack.h +FILE 1536 f:\sp\public\sdk\inc\winnetwk.h +FILE 1537 f:\sp\public\sdk\inc\imm.h +FILE 1538 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1539 f:\sp\public\sdk\inc\pshpack1.h +FILE 1540 f:\sp\public\sdk\inc\winver.h +FILE 1541 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1542 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1543 f:\sp\public\sdk\inc\winnt.h +FILE 1544 f:\sp\public\sdk\inc\winreg.h +FILE 1545 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1546 f:\sp\public\sdk\inc\winbase.h +FILE 1547 f:\sp\public\sdk\inc\winerror.h +FILE 1548 f:\sp\public\sdk\inc\pshpack8.h +FILE 1549 f:\sp\public\sdk\inc\guiddef.h +FILE 1550 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1551 f:\sp\public\sdk\inc\specstrings.h +FILE 1552 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1553 f:\sp\public\sdk\inc\basetsd.h +FILE 1554 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1555 f:\sp\public\sdk\inc\reason.h +FILE 1556 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1557 f:\sp\public\sdk\inc\wincon.h +FILE 1558 f:\sp\public\sdk\inc\pshpack2.h +FILE 1559 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1560 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1561 f:\sp\public\sdk\inc\mcx.h +FILE 1562 f:\sp\public\sdk\inc\winuser.h +FILE 1563 f:\sp\public\sdk\inc\winnls.h +FILE 1564 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.c +FILE 1565 f:\sp\public\sdk\inc\stralign.h +FILE 1566 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1567 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1568 f:\sp\public\sdk\inc\tvout.h +FILE 1569 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1570 f:\sp\public\sdk\inc\windows.h +FILE 1571 f:\sp\public\sdk\inc\winsvc.h +FILE 1572 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1573 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1574 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1575 f:\sp\public\sdk\inc\wingdi.h +FILE 1576 f:\sp\public\sdk\inc\pshpack4.h +FILE 1577 f:\sp\public\sdk\inc\poppack.h +FILE 1578 f:\sp\public\sdk\inc\ddbanned.h +FILE 1579 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1580 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1581 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 1582 f:\sp\public\sdk\inc\winnetwk.h +FILE 1583 f:\sp\public\sdk\inc\imm.h +FILE 1584 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1585 f:\sp\public\sdk\inc\windef.h +FILE 1586 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1587 f:\sp\public\sdk\inc\windef.h +FILE 1588 f:\sp\public\sdk\inc\pshpack1.h +FILE 1589 f:\sp\public\sdk\inc\winver.h +FILE 1590 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1591 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1592 f:\sp\public\sdk\inc\winnt.h +FILE 1593 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1594 f:\sp\public\sdk\inc\winreg.h +FILE 1595 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1596 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1597 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1598 f:\sp\public\sdk\inc\winbase.h +FILE 1599 f:\sp\public\sdk\inc\winerror.h +FILE 1600 f:\sp\public\sdk\inc\pshpack8.h +FILE 1601 f:\sp\vctools\crt_bld\self_x86\crt\src\printf.c +FILE 1602 f:\sp\public\sdk\inc\reason.h +FILE 1603 f:\sp\public\sdk\inc\wincon.h +FILE 1604 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1605 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1606 f:\sp\public\sdk\inc\pshpack2.h +FILE 1607 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1608 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1609 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1610 f:\sp\public\sdk\inc\mcx.h +FILE 1611 f:\sp\public\sdk\inc\winuser.h +FILE 1612 f:\sp\public\sdk\inc\winnls.h +FILE 1613 f:\sp\public\sdk\inc\guiddef.h +FILE 1614 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1615 f:\sp\public\sdk\inc\windows.h +FILE 1616 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1617 f:\sp\public\sdk\inc\specstrings.h +FILE 1618 f:\sp\public\sdk\inc\basetsd.h +FILE 1619 f:\sp\public\sdk\inc\stralign.h +FILE 1620 f:\sp\public\sdk\inc\tvout.h +FILE 1621 f:\sp\public\sdk\inc\ddbanned.h +FILE 1622 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1623 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1624 f:\sp\public\sdk\inc\winsvc.h +FILE 1625 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1626 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1627 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 1628 f:\sp\public\sdk\inc\wingdi.h +FILE 1629 f:\sp\public\sdk\inc\pshpack4.h +FILE 1630 f:\sp\public\sdk\inc\poppack.h +FILE 1631 f:\sp\public\sdk\inc\winnetwk.h +FILE 1632 f:\sp\public\sdk\inc\imm.h +FILE 1633 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1634 f:\sp\public\sdk\inc\windef.h +FILE 1635 f:\sp\public\sdk\inc\pshpack1.h +FILE 1636 f:\sp\public\sdk\inc\winver.h +FILE 1637 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1638 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1639 f:\sp\public\sdk\inc\winnt.h +FILE 1640 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1641 f:\sp\public\sdk\inc\winreg.h +FILE 1642 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1643 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1644 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1645 f:\sp\public\sdk\inc\winbase.h +FILE 1646 f:\sp\public\sdk\inc\winerror.h +FILE 1647 f:\sp\public\sdk\inc\pshpack8.h +FILE 1648 f:\sp\vctools\crt_bld\self_x86\crt\src\fprintf.c +FILE 1649 f:\sp\public\sdk\inc\reason.h +FILE 1650 f:\sp\public\sdk\inc\wincon.h +FILE 1651 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1652 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1653 f:\sp\public\sdk\inc\pshpack2.h +FILE 1654 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1655 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1656 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1657 f:\sp\public\sdk\inc\mcx.h +FILE 1658 f:\sp\public\sdk\inc\winuser.h +FILE 1659 f:\sp\public\sdk\inc\winnls.h +FILE 1660 f:\sp\public\sdk\inc\guiddef.h +FILE 1661 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1662 f:\sp\public\sdk\inc\windows.h +FILE 1663 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1664 f:\sp\public\sdk\inc\specstrings.h +FILE 1665 f:\sp\public\sdk\inc\basetsd.h +FILE 1666 f:\sp\public\sdk\inc\stralign.h +FILE 1667 f:\sp\public\sdk\inc\tvout.h +FILE 1668 f:\sp\public\sdk\inc\ddbanned.h +FILE 1669 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1670 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 1671 f:\sp\public\sdk\inc\winsvc.h +FILE 1672 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1673 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1674 f:\sp\public\sdk\inc\wingdi.h +FILE 1675 f:\sp\public\sdk\inc\pshpack4.h +FILE 1676 f:\sp\public\sdk\inc\poppack.h +FILE 1677 f:\sp\public\sdk\inc\winnetwk.h +FILE 1678 f:\sp\public\sdk\inc\imm.h +FILE 1679 f:\sp\public\sdk\inc\pshpack1.h +FILE 1680 f:\sp\public\sdk\inc\winver.h +FILE 1681 f:\sp\public\sdk\inc\winnt.h +FILE 1682 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1683 f:\sp\public\sdk\inc\winreg.h +FILE 1684 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1685 f:\sp\public\sdk\inc\winbase.h +FILE 1686 f:\sp\public\sdk\inc\winerror.h +FILE 1687 f:\sp\public\sdk\inc\pshpack8.h +FILE 1688 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 1689 f:\sp\public\sdk\inc\reason.h +FILE 1690 f:\sp\public\sdk\inc\wincon.h +FILE 1691 f:\sp\public\sdk\inc\pshpack2.h +FILE 1692 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1693 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1694 f:\sp\public\sdk\inc\mcx.h +FILE 1695 f:\sp\public\sdk\inc\winuser.h +FILE 1696 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1697 f:\sp\public\sdk\inc\winnls.h +FILE 1698 f:\sp\public\sdk\inc\guiddef.h +FILE 1699 f:\sp\public\sdk\inc\windows.h +FILE 1700 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1701 f:\sp\public\sdk\inc\specstrings.h +FILE 1702 f:\sp\public\sdk\inc\basetsd.h +FILE 1703 f:\sp\public\sdk\inc\stralign.h +FILE 1704 f:\sp\vctools\crt_bld\self_x86\crt\src\fflush.c +FILE 1705 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1706 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 1707 f:\sp\public\sdk\inc\tvout.h +FILE 1708 f:\sp\public\sdk\inc\winsvc.h +FILE 1709 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1710 f:\sp\public\sdk\inc\wingdi.h +FILE 1711 f:\sp\public\sdk\inc\pshpack4.h +FILE 1712 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1713 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1714 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1715 f:\sp\public\sdk\inc\poppack.h +FILE 1716 f:\sp\public\sdk\inc\ddbanned.h +FILE 1717 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1718 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1719 f:\sp\public\sdk\inc\winnetwk.h +FILE 1720 f:\sp\public\sdk\inc\imm.h +FILE 1721 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1722 f:\sp\public\sdk\inc\windef.h +FILE 1723 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1724 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1725 f:\sp\public\sdk\inc\pshpack8.h +FILE 1726 f:\sp\public\sdk\inc\reason.h +FILE 1727 f:\sp\public\sdk\inc\wincon.h +FILE 1728 f:\sp\public\sdk\inc\pshpack2.h +FILE 1729 f:\sp\public\sdk\inc\mcx.h +FILE 1730 f:\sp\public\sdk\inc\winuser.h +FILE 1731 f:\sp\public\sdk\inc\winnls.h +FILE 1732 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1733 f:\sp\public\sdk\inc\windef.h +FILE 1734 f:\sp\public\sdk\inc\stralign.h +FILE 1735 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1736 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1737 f:\sp\public\sdk\inc\tvout.h +FILE 1738 f:\sp\public\sdk\inc\winsvc.h +FILE 1739 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1740 f:\sp\public\sdk\inc\wingdi.h +FILE 1741 f:\sp\public\sdk\inc\pshpack4.h +FILE 1742 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1743 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1744 f:\sp\public\sdk\inc\poppack.h +FILE 1745 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1746 f:\sp\public\sdk\inc\winnt.h +FILE 1747 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1748 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1749 f:\sp\public\sdk\inc\winnetwk.h +FILE 1750 f:\sp\public\sdk\inc\imm.h +FILE 1751 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1752 f:\sp\vctools\crt_bld\self_x86\crt\src\fclose.c +FILE 1753 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1754 f:\sp\public\sdk\inc\pshpack1.h +FILE 1755 f:\sp\public\sdk\inc\winver.h +FILE 1756 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1757 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1758 f:\sp\public\sdk\inc\guiddef.h +FILE 1759 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1760 f:\sp\public\sdk\inc\ddbanned.h +FILE 1761 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1762 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1763 f:\sp\public\sdk\inc\specstrings.h +FILE 1764 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1765 f:\sp\public\sdk\inc\basetsd.h +FILE 1766 f:\sp\public\sdk\inc\windows.h +FILE 1767 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1768 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 1769 f:\sp\public\sdk\inc\winreg.h +FILE 1770 f:\sp\public\sdk\inc\winbase.h +FILE 1771 f:\sp\public\sdk\inc\winerror.h +FILE 1772 f:\sp\public\sdk\inc\poppack.h +FILE 1773 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1774 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1775 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1776 f:\sp\public\sdk\inc\winnetwk.h +FILE 1777 f:\sp\public\sdk\inc\imm.h +FILE 1778 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1779 f:\sp\public\sdk\inc\windef.h +FILE 1780 f:\sp\public\sdk\inc\pshpack1.h +FILE 1781 f:\sp\public\sdk\inc\winver.h +FILE 1782 f:\sp\public\sdk\inc\windows.h +FILE 1783 f:\sp\public\sdk\inc\winnt.h +FILE 1784 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1785 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1786 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1787 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1788 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1789 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1790 f:\sp\public\sdk\inc\winreg.h +FILE 1791 f:\sp\public\sdk\inc\winbase.h +FILE 1792 f:\sp\vctools\crt_bld\self_x86\crt\src\closeall.c +FILE 1793 f:\sp\public\sdk\inc\winerror.h +FILE 1794 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1795 f:\sp\public\sdk\inc\pshpack8.h +FILE 1796 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1797 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1798 f:\sp\public\sdk\inc\reason.h +FILE 1799 f:\sp\public\sdk\inc\wincon.h +FILE 1800 f:\sp\public\sdk\inc\ddbanned.h +FILE 1801 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1802 f:\sp\public\sdk\inc\pshpack2.h +FILE 1803 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1804 f:\sp\public\sdk\inc\mcx.h +FILE 1805 f:\sp\public\sdk\inc\winuser.h +FILE 1806 f:\sp\public\sdk\inc\winnls.h +FILE 1807 f:\sp\public\sdk\inc\guiddef.h +FILE 1808 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1809 f:\sp\public\sdk\inc\specstrings.h +FILE 1810 f:\sp\public\sdk\inc\basetsd.h +FILE 1811 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1812 f:\sp\public\sdk\inc\stralign.h +FILE 1813 f:\sp\public\sdk\inc\tvout.h +FILE 1814 f:\sp\public\sdk\inc\winsvc.h +FILE 1815 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1816 f:\sp\public\sdk\inc\wingdi.h +FILE 1817 f:\sp\public\sdk\inc\pshpack4.h +FILE 1818 f:\sp\public\sdk\inc\pshpack8.h +FILE 1819 f:\sp\public\sdk\inc\reason.h +FILE 1820 f:\sp\public\sdk\inc\wincon.h +FILE 1821 f:\sp\public\sdk\inc\pshpack2.h +FILE 1822 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1823 f:\sp\public\sdk\inc\mcx.h +FILE 1824 f:\sp\public\sdk\inc\winuser.h +FILE 1825 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1826 f:\sp\public\sdk\inc\winnls.h +FILE 1827 f:\sp\public\sdk\inc\guiddef.h +FILE 1828 f:\sp\public\sdk\inc\windows.h +FILE 1829 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1830 f:\sp\public\sdk\inc\specstrings.h +FILE 1831 f:\sp\public\sdk\inc\basetsd.h +FILE 1832 f:\sp\public\sdk\inc\stralign.h +FILE 1833 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1834 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 1835 f:\sp\public\sdk\inc\tvout.h +FILE 1836 f:\sp\public\sdk\inc\winsvc.h +FILE 1837 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1838 f:\sp\public\sdk\inc\wingdi.h +FILE 1839 f:\sp\public\sdk\inc\pshpack4.h +FILE 1840 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1841 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1842 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1843 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1844 f:\sp\public\sdk\inc\poppack.h +FILE 1845 f:\sp\public\sdk\inc\winnetwk.h +FILE 1846 f:\sp\public\sdk\inc\imm.h +FILE 1847 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1848 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1849 f:\sp\public\sdk\inc\windef.h +FILE 1850 f:\sp\vctools\crt_bld\self_x86\crt\src\_sftbuf.c +FILE 1851 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1852 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1853 f:\sp\public\sdk\inc\pshpack1.h +FILE 1854 f:\sp\public\sdk\inc\winver.h +FILE 1855 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1856 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1857 f:\sp\public\sdk\inc\ddbanned.h +FILE 1858 f:\sp\public\sdk\inc\winnt.h +FILE 1859 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1860 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1861 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1862 f:\sp\public\sdk\inc\winreg.h +FILE 1863 f:\sp\public\sdk\inc\winbase.h +FILE 1864 f:\sp\public\sdk\inc\winerror.h +FILE 1865 f:\sp\public\sdk\inc\pshpack1.h +FILE 1866 f:\sp\public\sdk\inc\winver.h +FILE 1867 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1868 f:\sp\public\sdk\inc\winnt.h +FILE 1869 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1870 f:\sp\public\sdk\inc\winreg.h +FILE 1871 f:\sp\public\sdk\inc\winbase.h +FILE 1872 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1873 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1874 f:\sp\public\sdk\inc\winerror.h +FILE 1875 f:\sp\public\sdk\inc\pshpack8.h +FILE 1876 f:\sp\public\sdk\inc\reason.h +FILE 1877 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1878 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1879 f:\sp\public\sdk\inc\wincon.h +FILE 1880 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1881 f:\sp\public\sdk\inc\pshpack2.h +FILE 1882 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1883 f:\sp\public\sdk\inc\mcx.h +FILE 1884 f:\sp\public\sdk\inc\winuser.h +FILE 1885 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1886 f:\sp\public\sdk\inc\winnls.h +FILE 1887 f:\sp\public\sdk\inc\guiddef.h +FILE 1888 f:\sp\public\sdk\inc\windows.h +FILE 1889 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1890 f:\sp\public\sdk\inc\specstrings.h +FILE 1891 f:\sp\public\sdk\inc\basetsd.h +FILE 1892 f:\sp\public\sdk\inc\stralign.h +FILE 1893 f:\sp\vctools\crt_bld\self_x86\crt\src\_getbuf.c +FILE 1894 f:\sp\public\sdk\inc\tvout.h +FILE 1895 f:\sp\public\sdk\inc\winsvc.h +FILE 1896 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1897 f:\sp\public\sdk\inc\wingdi.h +FILE 1898 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1899 f:\sp\public\sdk\inc\pshpack4.h +FILE 1900 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1901 f:\sp\public\sdk\inc\poppack.h +FILE 1902 f:\sp\public\sdk\inc\ddbanned.h +FILE 1903 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1904 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1905 f:\sp\public\sdk\inc\winnetwk.h +FILE 1906 f:\sp\public\sdk\inc\imm.h +FILE 1907 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1908 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1909 f:\sp\public\sdk\inc\windef.h +FILE 1910 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1911 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1912 f:\sp\public\sdk\inc\windef.h +FILE 1913 f:\sp\public\sdk\inc\pshpack1.h +FILE 1914 f:\sp\public\sdk\inc\winver.h +FILE 1915 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1916 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1917 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1918 f:\sp\public\sdk\inc\winnt.h +FILE 1919 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 1920 f:\sp\public\sdk\inc\winreg.h +FILE 1921 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1922 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1923 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1924 f:\sp\public\sdk\inc\winbase.h +FILE 1925 f:\sp\public\sdk\inc\winerror.h +FILE 1926 f:\sp\public\sdk\inc\pshpack8.h +FILE 1927 f:\sp\vctools\crt_bld\self_x86\crt\src\_freebuf.c +FILE 1928 f:\sp\public\sdk\inc\reason.h +FILE 1929 f:\sp\public\sdk\inc\wincon.h +FILE 1930 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 1931 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1932 f:\sp\public\sdk\inc\pshpack2.h +FILE 1933 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1934 f:\sp\public\sdk\inc\mcx.h +FILE 1935 f:\sp\public\sdk\inc\winuser.h +FILE 1936 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1937 f:\sp\public\sdk\inc\winnls.h +FILE 1938 f:\sp\public\sdk\inc\guiddef.h +FILE 1939 f:\sp\public\sdk\inc\windows.h +FILE 1940 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1941 f:\sp\public\sdk\inc\specstrings.h +FILE 1942 f:\sp\public\sdk\inc\basetsd.h +FILE 1943 f:\sp\public\sdk\inc\stralign.h +FILE 1944 f:\sp\public\sdk\inc\tvout.h +FILE 1945 f:\sp\public\sdk\inc\ddbanned.h +FILE 1946 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1947 f:\sp\public\sdk\inc\winsvc.h +FILE 1948 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1949 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1950 f:\sp\public\sdk\inc\wingdi.h +FILE 1951 f:\sp\public\sdk\inc\pshpack4.h +FILE 1952 f:\sp\public\sdk\inc\poppack.h +FILE 1953 f:\sp\public\sdk\inc\winnetwk.h +FILE 1954 f:\sp\public\sdk\inc\imm.h +FILE 1955 f:\sp\public\sdk\inc\specstrings.h +FILE 1956 f:\sp\public\sdk\inc\basetsd.h +FILE 1957 f:\sp\public\sdk\inc\reason.h +FILE 1958 f:\sp\public\sdk\inc\wincon.h +FILE 1959 f:\sp\public\sdk\inc\pshpack2.h +FILE 1960 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 1961 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 1962 f:\sp\public\sdk\inc\mcx.h +FILE 1963 f:\sp\public\sdk\inc\winuser.h +FILE 1964 f:\sp\public\sdk\inc\winnls.h +FILE 1965 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 1966 f:\sp\public\sdk\inc\stralign.h +FILE 1967 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 1968 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 1969 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 1970 f:\sp\public\sdk\inc\windows.h +FILE 1971 f:\sp\public\sdk\inc\tvout.h +FILE 1972 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 1973 f:\sp\public\sdk\inc\winsvc.h +FILE 1974 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 1975 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 1976 f:\sp\public\sdk\inc\wingdi.h +FILE 1977 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 1978 f:\sp\public\sdk\inc\pshpack4.h +FILE 1979 f:\sp\public\sdk\inc\poppack.h +FILE 1980 f:\sp\vctools\crt_bld\self_x86\crt\src\_flsbuf.c +FILE 1981 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 1982 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 1983 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 1984 f:\sp\public\sdk\inc\winnetwk.h +FILE 1985 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 1986 f:\sp\public\sdk\inc\imm.h +FILE 1987 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 1988 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 1989 f:\sp\vctools\crt_bld\self_x86\crt\src\_flswbuf.c +FILE 1990 f:\sp\public\sdk\inc\windef.h +FILE 1991 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 1992 f:\sp\public\sdk\inc\pshpack1.h +FILE 1993 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 1994 f:\sp\public\sdk\inc\winver.h +FILE 1995 f:\sp\public\sdk\inc\ddbanned.h +FILE 1996 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 1997 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 1998 f:\sp\public\sdk\inc\winnt.h +FILE 1999 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2000 f:\sp\public\sdk\inc\winreg.h +FILE 2001 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 2002 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 2003 f:\sp\public\sdk\inc\winbase.h +FILE 2004 f:\sp\public\sdk\inc\winerror.h +FILE 2005 f:\sp\public\sdk\inc\pshpack8.h +FILE 2006 f:\sp\public\sdk\inc\guiddef.h +FILE 2007 f:\sp\public\sdk\inc\basetsd.h +FILE 2008 f:\sp\public\sdk\inc\reason.h +FILE 2009 f:\sp\public\sdk\inc\wincon.h +FILE 2010 f:\sp\public\sdk\inc\pshpack2.h +FILE 2011 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2012 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2013 f:\sp\public\sdk\inc\mcx.h +FILE 2014 f:\sp\public\sdk\inc\winuser.h +FILE 2015 f:\sp\public\sdk\inc\winnls.h +FILE 2016 f:\sp\public\sdk\inc\stralign.h +FILE 2017 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2018 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2019 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2020 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2021 f:\sp\public\sdk\inc\tvout.h +FILE 2022 f:\sp\public\sdk\inc\windows.h +FILE 2023 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2024 f:\sp\public\sdk\inc\winsvc.h +FILE 2025 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2026 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2027 f:\sp\public\sdk\inc\wingdi.h +FILE 2028 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 2029 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 2030 f:\sp\public\sdk\inc\pshpack4.h +FILE 2031 f:\sp\public\sdk\inc\poppack.h +FILE 2032 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2033 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2034 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2035 f:\sp\public\sdk\inc\winnetwk.h +FILE 2036 f:\sp\public\sdk\inc\imm.h +FILE 2037 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 2038 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2039 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2040 f:\sp\public\sdk\inc\windef.h +FILE 2041 f:\sp\vctools\crt_bld\self_x86\crt\src\_flsbuf.c +FILE 2042 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2043 f:\sp\public\sdk\inc\pshpack1.h +FILE 2044 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2045 f:\sp\public\sdk\inc\winver.h +FILE 2046 f:\sp\public\sdk\inc\ddbanned.h +FILE 2047 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2048 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2049 f:\sp\public\sdk\inc\winnt.h +FILE 2050 f:\sp\public\sdk\inc\winreg.h +FILE 2051 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2052 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 2053 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 2054 f:\sp\public\sdk\inc\winbase.h +FILE 2055 f:\sp\public\sdk\inc\winerror.h +FILE 2056 f:\sp\public\sdk\inc\pshpack8.h +FILE 2057 f:\sp\public\sdk\inc\guiddef.h +FILE 2058 f:\sp\public\sdk\inc\specstrings.h +FILE 2059 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2060 f:\sp\public\sdk\inc\reason.h +FILE 2061 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2062 f:\sp\public\sdk\inc\wincon.h +FILE 2063 f:\sp\public\sdk\inc\pshpack2.h +FILE 2064 f:\sp\public\sdk\inc\mcx.h +FILE 2065 f:\sp\public\sdk\inc\winuser.h +FILE 2066 f:\sp\public\sdk\inc\winnls.h +FILE 2067 f:\sp\public\sdk\inc\guiddef.h +FILE 2068 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2069 f:\sp\public\sdk\inc\specstrings.h +FILE 2070 f:\sp\public\sdk\inc\basetsd.h +FILE 2071 f:\sp\public\sdk\inc\stralign.h +FILE 2072 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2073 f:\sp\public\sdk\inc\tvout.h +FILE 2074 f:\sp\public\sdk\inc\winsvc.h +FILE 2075 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2076 f:\sp\public\sdk\inc\wingdi.h +FILE 2077 f:\sp\public\sdk\inc\pshpack4.h +FILE 2078 f:\sp\public\sdk\inc\poppack.h +FILE 2079 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2080 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 2081 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2082 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2083 f:\sp\public\sdk\inc\winnetwk.h +FILE 2084 f:\sp\public\sdk\inc\imm.h +FILE 2085 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2086 f:\sp\public\sdk\inc\windef.h +FILE 2087 f:\sp\vctools\crt_bld\self_x86\crt\src\_file.c +FILE 2088 f:\sp\public\sdk\inc\pshpack1.h +FILE 2089 f:\sp\public\sdk\inc\winver.h +FILE 2090 f:\sp\public\sdk\inc\windows.h +FILE 2091 f:\sp\public\sdk\inc\winnt.h +FILE 2092 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2093 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2094 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2095 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2096 f:\sp\public\sdk\inc\ddbanned.h +FILE 2097 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2098 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2099 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2100 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2101 f:\sp\public\sdk\inc\winreg.h +FILE 2102 f:\sp\public\sdk\inc\winbase.h +FILE 2103 f:\sp\public\sdk\inc\winerror.h +FILE 2104 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2105 f:\sp\public\sdk\inc\pshpack8.h +FILE 2106 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2107 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2108 f:\sp\public\sdk\inc\windef.h +FILE 2109 f:\sp\public\sdk\inc\pshpack1.h +FILE 2110 f:\sp\public\sdk\inc\winver.h +FILE 2111 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2112 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2113 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2114 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2115 f:\sp\public\sdk\inc\winnt.h +FILE 2116 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2117 f:\sp\public\sdk\inc\winreg.h +FILE 2118 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2119 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2120 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2121 f:\sp\public\sdk\inc\winbase.h +FILE 2122 f:\sp\public\sdk\inc\winerror.h +FILE 2123 f:\sp\public\sdk\inc\pshpack8.h +FILE 2124 f:\sp\vctools\crt_bld\self_x86\crt\src\fputwc.c +FILE 2125 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2126 f:\sp\public\sdk\inc\reason.h +FILE 2127 f:\sp\public\sdk\inc\wincon.h +FILE 2128 f:\sp\public\sdk\inc\pshpack2.h +FILE 2129 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2130 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2131 f:\sp\public\sdk\inc\mcx.h +FILE 2132 f:\sp\public\sdk\inc\winuser.h +FILE 2133 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2134 f:\sp\public\sdk\inc\winnls.h +FILE 2135 f:\sp\public\sdk\inc\guiddef.h +FILE 2136 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 2137 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 2138 f:\sp\public\sdk\inc\stralign.h +FILE 2139 f:\sp\public\sdk\inc\specstrings.h +FILE 2140 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 2141 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2142 f:\sp\public\sdk\inc\basetsd.h +FILE 2143 f:\sp\public\sdk\inc\windows.h +FILE 2144 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2145 f:\sp\public\sdk\inc\tvout.h +FILE 2146 f:\sp\public\sdk\inc\ddbanned.h +FILE 2147 f:\sp\public\sdk\inc\winsvc.h +FILE 2148 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2149 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2150 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2151 f:\sp\public\sdk\inc\wingdi.h +FILE 2152 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2153 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2154 f:\sp\public\sdk\inc\pshpack4.h +FILE 2155 f:\sp\public\sdk\inc\poppack.h +FILE 2156 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 2157 f:\sp\public\sdk\inc\winnetwk.h +FILE 2158 f:\sp\public\sdk\inc\imm.h +FILE 2159 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2160 f:\sp\public\sdk\inc\poppack.h +FILE 2161 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2162 f:\sp\public\sdk\inc\winnetwk.h +FILE 2163 f:\sp\public\sdk\inc\imm.h +FILE 2164 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2165 f:\sp\public\sdk\inc\windef.h +FILE 2166 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2167 f:\sp\public\sdk\inc\pshpack1.h +FILE 2168 f:\sp\public\sdk\inc\winver.h +FILE 2169 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2170 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2171 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2172 f:\sp\public\sdk\inc\winnt.h +FILE 2173 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2174 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2175 f:\sp\public\sdk\inc\winreg.h +FILE 2176 f:\sp\vctools\crt_bld\self_x86\crt\src\fileno.c +FILE 2177 f:\sp\public\sdk\inc\winbase.h +FILE 2178 f:\sp\public\sdk\inc\winerror.h +FILE 2179 f:\sp\public\sdk\inc\pshpack8.h +FILE 2180 f:\sp\public\sdk\inc\reason.h +FILE 2181 f:\sp\public\sdk\inc\wincon.h +FILE 2182 f:\sp\public\sdk\inc\ddbanned.h +FILE 2183 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2184 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2185 f:\sp\public\sdk\inc\pshpack2.h +FILE 2186 f:\sp\public\sdk\inc\mcx.h +FILE 2187 f:\sp\public\sdk\inc\winuser.h +FILE 2188 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2189 f:\sp\public\sdk\inc\winnls.h +FILE 2190 f:\sp\public\sdk\inc\guiddef.h +FILE 2191 f:\sp\public\sdk\inc\windows.h +FILE 2192 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2193 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2194 f:\sp\public\sdk\inc\specstrings.h +FILE 2195 f:\sp\public\sdk\inc\basetsd.h +FILE 2196 f:\sp\public\sdk\inc\stralign.h +FILE 2197 f:\sp\public\sdk\inc\tvout.h +FILE 2198 f:\sp\public\sdk\inc\winsvc.h +FILE 2199 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2200 f:\sp\public\sdk\inc\wingdi.h +FILE 2201 f:\sp\public\sdk\inc\pshpack4.h +FILE 2202 f:\sp\public\sdk\inc\pshpack2.h +FILE 2203 f:\sp\public\sdk\inc\winreg.h +FILE 2204 f:\sp\public\sdk\inc\guiddef.h +FILE 2205 f:\sp\public\sdk\inc\windows.h +FILE 2206 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2207 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2208 f:\sp\public\sdk\inc\specstrings.h +FILE 2209 f:\sp\public\sdk\inc\basetsd.h +FILE 2210 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2211 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2212 f:\sp\public\sdk\inc\pshpack4.h +FILE 2213 f:\sp\public\sdk\inc\reason.h +FILE 2214 f:\sp\public\sdk\inc\wincon.h +FILE 2215 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2216 f:\sp\public\sdk\inc\poppack.h +FILE 2217 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2218 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2219 f:\sp\public\sdk\inc\mcx.h +FILE 2220 f:\sp\public\sdk\inc\winuser.h +FILE 2221 f:\sp\public\sdk\inc\winnls.h +FILE 2222 f:\sp\public\sdk\inc\stralign.h +FILE 2223 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2224 f:\sp\public\sdk\inc\windef.h +FILE 2225 f:\sp\public\sdk\inc\tvout.h +FILE 2226 f:\sp\public\sdk\inc\winsvc.h +FILE 2227 f:\sp\vctools\crt_bld\self_x86\crt\src\tidtable.c +FILE 2228 f:\sp\public\sdk\inc\wingdi.h +FILE 2229 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2230 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2231 f:\sp\public\sdk\inc\winnt.h +FILE 2232 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2233 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2234 f:\sp\public\sdk\inc\winnetwk.h +FILE 2235 f:\sp\public\sdk\inc\imm.h +FILE 2236 f:\sp\public\sdk\inc\ddbanned.h +FILE 2237 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2238 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2239 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2240 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2241 f:\sp\public\sdk\inc\winbase.h +FILE 2242 f:\sp\public\sdk\inc\winerror.h +FILE 2243 f:\sp\public\sdk\inc\pshpack1.h +FILE 2244 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2245 f:\sp\vctools\crt_bld\self_x86\crt\src\memory.h +FILE 2246 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2247 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 2248 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2249 f:\sp\public\sdk\inc\pshpack8.h +FILE 2250 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2251 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2252 f:\sp\public\sdk\inc\winver.h +FILE 2253 f:\sp\public\sdk\inc\pshpack4.h +FILE 2254 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2255 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2256 f:\sp\public\sdk\inc\poppack.h +FILE 2257 f:\sp\public\sdk\inc\winnt.h +FILE 2258 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2259 f:\sp\public\sdk\inc\winnetwk.h +FILE 2260 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2261 f:\sp\public\sdk\inc\imm.h +FILE 2262 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2263 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2264 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2265 f:\sp\public\sdk\inc\pshpack1.h +FILE 2266 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2267 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2268 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2269 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2270 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2271 f:\sp\public\sdk\inc\winver.h +FILE 2272 f:\sp\public\sdk\inc\guiddef.h +FILE 2273 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2274 f:\sp\public\sdk\inc\specstrings.h +FILE 2275 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2276 f:\sp\public\sdk\inc\basetsd.h +FILE 2277 f:\sp\public\sdk\inc\windows.h +FILE 2278 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2279 f:\sp\public\sdk\inc\winreg.h +FILE 2280 f:\sp\vctools\crt_bld\self_x86\crt\src\stdenvp.c +FILE 2281 f:\sp\public\sdk\inc\winbase.h +FILE 2282 f:\sp\public\sdk\inc\winerror.h +FILE 2283 f:\sp\public\sdk\inc\pshpack8.h +FILE 2284 f:\sp\public\sdk\inc\reason.h +FILE 2285 f:\sp\public\sdk\inc\ddbanned.h +FILE 2286 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2287 f:\sp\public\sdk\inc\wincon.h +FILE 2288 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2289 f:\sp\public\sdk\inc\pshpack2.h +FILE 2290 f:\sp\public\sdk\inc\mcx.h +FILE 2291 f:\sp\public\sdk\inc\winuser.h +FILE 2292 f:\sp\public\sdk\inc\winnls.h +FILE 2293 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2294 f:\sp\public\sdk\inc\windef.h +FILE 2295 f:\sp\public\sdk\inc\stralign.h +FILE 2296 f:\sp\public\sdk\inc\tvout.h +FILE 2297 f:\sp\public\sdk\inc\winsvc.h +FILE 2298 f:\sp\public\sdk\inc\wingdi.h +FILE 2299 f:\sp\public\sdk\inc\poppack.h +FILE 2300 f:\sp\vctools\crt_bld\self_x86\crt\src\dos.h +FILE 2301 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2302 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2303 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2304 f:\sp\public\sdk\inc\winnetwk.h +FILE 2305 f:\sp\public\sdk\inc\imm.h +FILE 2306 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2307 f:\sp\public\sdk\inc\windef.h +FILE 2308 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2309 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2310 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2311 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2312 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 2313 f:\sp\public\sdk\inc\pshpack1.h +FILE 2314 f:\sp\public\sdk\inc\winver.h +FILE 2315 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2316 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2317 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2318 f:\sp\public\sdk\inc\winnt.h +FILE 2319 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2320 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2321 f:\sp\public\sdk\inc\winreg.h +FILE 2322 f:\sp\vctools\crt_bld\self_x86\crt\src\stdargv.c +FILE 2323 f:\sp\public\sdk\inc\winbase.h +FILE 2324 f:\sp\public\sdk\inc\winerror.h +FILE 2325 f:\sp\public\sdk\inc\pshpack8.h +FILE 2326 f:\sp\public\sdk\inc\reason.h +FILE 2327 f:\sp\public\sdk\inc\wincon.h +FILE 2328 f:\sp\public\sdk\inc\ddbanned.h +FILE 2329 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2330 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2331 f:\sp\public\sdk\inc\pshpack2.h +FILE 2332 f:\sp\public\sdk\inc\mcx.h +FILE 2333 f:\sp\public\sdk\inc\winuser.h +FILE 2334 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2335 f:\sp\public\sdk\inc\winnls.h +FILE 2336 f:\sp\public\sdk\inc\guiddef.h +FILE 2337 f:\sp\public\sdk\inc\windows.h +FILE 2338 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2339 f:\sp\public\sdk\inc\specstrings.h +FILE 2340 f:\sp\public\sdk\inc\basetsd.h +FILE 2341 f:\sp\public\sdk\inc\stralign.h +FILE 2342 f:\sp\public\sdk\inc\tvout.h +FILE 2343 f:\sp\public\sdk\inc\winsvc.h +FILE 2344 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2345 f:\sp\public\sdk\inc\wingdi.h +FILE 2346 f:\sp\public\sdk\inc\pshpack4.h +FILE 2347 f:\sp\public\sdk\inc\reason.h +FILE 2348 f:\sp\public\sdk\inc\wincon.h +FILE 2349 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2350 f:\sp\public\sdk\inc\poppack.h +FILE 2351 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2352 f:\sp\public\sdk\inc\mcx.h +FILE 2353 f:\sp\public\sdk\inc\winuser.h +FILE 2354 f:\sp\public\sdk\inc\winnls.h +FILE 2355 f:\sp\public\sdk\inc\stralign.h +FILE 2356 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2357 f:\sp\public\sdk\inc\windef.h +FILE 2358 f:\sp\public\sdk\inc\tvout.h +FILE 2359 f:\sp\public\sdk\inc\winsvc.h +FILE 2360 f:\sp\public\sdk\inc\wingdi.h +FILE 2361 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2362 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2363 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2364 f:\sp\public\sdk\inc\winnt.h +FILE 2365 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2366 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2367 f:\sp\public\sdk\inc\winnetwk.h +FILE 2368 f:\sp\public\sdk\inc\imm.h +FILE 2369 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 2370 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2371 f:\sp\vctools\crt_bld\self_x86\crt\src\mlock.c +FILE 2372 f:\sp\public\sdk\inc\winbase.h +FILE 2373 f:\sp\public\sdk\inc\winerror.h +FILE 2374 f:\sp\public\sdk\inc\pshpack1.h +FILE 2375 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2376 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2377 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2378 f:\sp\public\sdk\inc\pshpack8.h +FILE 2379 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2380 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2381 f:\sp\public\sdk\inc\winver.h +FILE 2382 f:\sp\public\sdk\inc\ddbanned.h +FILE 2383 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2384 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2385 f:\sp\public\sdk\inc\pshpack2.h +FILE 2386 f:\sp\public\sdk\inc\winreg.h +FILE 2387 f:\sp\public\sdk\inc\guiddef.h +FILE 2388 f:\sp\public\sdk\inc\windows.h +FILE 2389 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2390 f:\sp\public\sdk\inc\specstrings.h +FILE 2391 f:\sp\public\sdk\inc\basetsd.h +FILE 2392 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2393 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2394 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2395 f:\sp\public\sdk\inc\pshpack4.h +FILE 2396 f:\sp\public\sdk\inc\poppack.h +FILE 2397 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2398 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2399 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2400 f:\sp\public\sdk\inc\winnetwk.h +FILE 2401 f:\sp\public\sdk\inc\imm.h +FILE 2402 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2403 f:\sp\public\sdk\inc\windef.h +FILE 2404 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2405 f:\sp\public\sdk\inc\pshpack1.h +FILE 2406 f:\sp\public\sdk\inc\winver.h +FILE 2407 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2408 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2409 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2410 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2411 f:\sp\public\sdk\inc\winnt.h +FILE 2412 f:\sp\vctools\crt_bld\self_x86\crt\src\cmsgs.h +FILE 2413 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2414 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2415 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2416 f:\sp\public\sdk\inc\winreg.h +FILE 2417 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2418 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0msg.c +FILE 2419 f:\sp\public\sdk\inc\winbase.h +FILE 2420 f:\sp\public\sdk\inc\winerror.h +FILE 2421 f:\sp\public\sdk\inc\pshpack8.h +FILE 2422 f:\sp\public\sdk\inc\reason.h +FILE 2423 f:\sp\public\sdk\inc\wincon.h +FILE 2424 f:\sp\public\sdk\inc\ddbanned.h +FILE 2425 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2426 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2427 f:\sp\public\sdk\inc\pshpack2.h +FILE 2428 f:\sp\public\sdk\inc\mcx.h +FILE 2429 f:\sp\public\sdk\inc\winuser.h +FILE 2430 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2431 f:\sp\public\sdk\inc\winnls.h +FILE 2432 f:\sp\public\sdk\inc\guiddef.h +FILE 2433 f:\sp\public\sdk\inc\windows.h +FILE 2434 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2435 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2436 f:\sp\public\sdk\inc\specstrings.h +FILE 2437 f:\sp\public\sdk\inc\basetsd.h +FILE 2438 f:\sp\public\sdk\inc\stralign.h +FILE 2439 f:\sp\public\sdk\inc\tvout.h +FILE 2440 f:\sp\public\sdk\inc\winsvc.h +FILE 2441 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2442 f:\sp\public\sdk\inc\wingdi.h +FILE 2443 f:\sp\public\sdk\inc\pshpack4.h +FILE 2444 f:\sp\public\sdk\inc\pshpack1.h +FILE 2445 f:\sp\public\sdk\inc\winver.h +FILE 2446 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2447 f:\sp\public\sdk\inc\winnt.h +FILE 2448 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2449 f:\sp\public\sdk\inc\winreg.h +FILE 2450 f:\sp\public\sdk\inc\winbase.h +FILE 2451 f:\sp\public\sdk\inc\winerror.h +FILE 2452 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2453 f:\sp\public\sdk\inc\pshpack8.h +FILE 2454 f:\sp\public\sdk\inc\reason.h +FILE 2455 f:\sp\public\sdk\inc\wincon.h +FILE 2456 f:\sp\public\sdk\inc\pshpack2.h +FILE 2457 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0init.c +FILE 2458 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2459 f:\sp\public\sdk\inc\mcx.h +FILE 2460 f:\sp\public\sdk\inc\winuser.h +FILE 2461 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2462 f:\sp\public\sdk\inc\winnls.h +FILE 2463 f:\sp\public\sdk\inc\guiddef.h +FILE 2464 f:\sp\public\sdk\inc\windows.h +FILE 2465 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2466 f:\sp\public\sdk\inc\specstrings.h +FILE 2467 f:\sp\public\sdk\inc\basetsd.h +FILE 2468 f:\sp\public\sdk\inc\stralign.h +FILE 2469 f:\sp\public\sdk\inc\tvout.h +FILE 2470 f:\sp\public\sdk\inc\winsvc.h +FILE 2471 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2472 f:\sp\public\sdk\inc\wingdi.h +FILE 2473 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2474 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2475 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2476 f:\sp\public\sdk\inc\pshpack4.h +FILE 2477 f:\sp\public\sdk\inc\ddbanned.h +FILE 2478 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2479 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2480 f:\sp\public\sdk\inc\poppack.h +FILE 2481 f:\sp\public\sdk\inc\winnetwk.h +FILE 2482 f:\sp\public\sdk\inc\imm.h +FILE 2483 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2484 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2485 f:\sp\public\sdk\inc\windef.h +FILE 2486 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2487 f:\sp\public\sdk\inc\poppack.h +FILE 2488 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2489 f:\sp\public\sdk\inc\winnetwk.h +FILE 2490 f:\sp\public\sdk\inc\imm.h +FILE 2491 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2492 f:\sp\public\sdk\inc\windef.h +FILE 2493 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2494 f:\sp\public\sdk\inc\pshpack1.h +FILE 2495 f:\sp\public\sdk\inc\winver.h +FILE 2496 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2497 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2498 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2499 f:\sp\public\sdk\inc\winnt.h +FILE 2500 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2501 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2502 f:\sp\public\sdk\inc\winreg.h +FILE 2503 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0fp.c +FILE 2504 f:\sp\public\sdk\inc\winbase.h +FILE 2505 f:\sp\public\sdk\inc\winerror.h +FILE 2506 f:\sp\public\sdk\inc\pshpack8.h +FILE 2507 f:\sp\public\sdk\inc\reason.h +FILE 2508 f:\sp\public\sdk\inc\wincon.h +FILE 2509 f:\sp\public\sdk\inc\ddbanned.h +FILE 2510 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2511 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2512 f:\sp\public\sdk\inc\pshpack2.h +FILE 2513 f:\sp\public\sdk\inc\mcx.h +FILE 2514 f:\sp\public\sdk\inc\winuser.h +FILE 2515 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2516 f:\sp\public\sdk\inc\winnls.h +FILE 2517 f:\sp\public\sdk\inc\guiddef.h +FILE 2518 f:\sp\public\sdk\inc\windows.h +FILE 2519 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2520 f:\sp\public\sdk\inc\specstrings.h +FILE 2521 f:\sp\public\sdk\inc\basetsd.h +FILE 2522 f:\sp\public\sdk\inc\stralign.h +FILE 2523 f:\sp\public\sdk\inc\tvout.h +FILE 2524 f:\sp\public\sdk\inc\winsvc.h +FILE 2525 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2526 f:\sp\public\sdk\inc\wingdi.h +FILE 2527 f:\sp\public\sdk\inc\pshpack4.h +FILE 2528 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 2529 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2530 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2531 f:\sp\public\sdk\inc\pshpack4.h +FILE 2532 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2533 f:\sp\public\sdk\inc\reason.h +FILE 2534 f:\sp\public\sdk\inc\wincon.h +FILE 2535 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2536 f:\sp\public\sdk\inc\poppack.h +FILE 2537 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2538 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2539 f:\sp\public\sdk\inc\mcx.h +FILE 2540 f:\sp\public\sdk\inc\winuser.h +FILE 2541 f:\sp\public\sdk\inc\winnls.h +FILE 2542 f:\sp\public\sdk\inc\stralign.h +FILE 2543 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2544 f:\sp\public\sdk\inc\windef.h +FILE 2545 f:\sp\public\sdk\inc\tvout.h +FILE 2546 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2547 f:\sp\public\sdk\inc\winsvc.h +FILE 2548 f:\sp\public\sdk\inc\wingdi.h +FILE 2549 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 2550 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 2551 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2552 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2553 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 2554 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 2555 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2556 f:\sp\public\sdk\inc\winnt.h +FILE 2557 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2558 f:\sp\public\sdk\inc\winnetwk.h +FILE 2559 f:\sp\public\sdk\inc\imm.h +FILE 2560 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0dat.c +FILE 2561 f:\sp\public\sdk\inc\winbase.h +FILE 2562 f:\sp\public\sdk\inc\winerror.h +FILE 2563 f:\sp\public\sdk\inc\pshpack1.h +FILE 2564 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 2565 f:\sp\public\sdk\inc\pshpack8.h +FILE 2566 f:\sp\public\sdk\inc\winver.h +FILE 2567 f:\sp\public\sdk\inc\ddbanned.h +FILE 2568 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2569 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2570 f:\sp\vctools\crt_bld\self_x86\crt\src\dos.h +FILE 2571 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2572 f:\sp\public\sdk\inc\pshpack2.h +FILE 2573 f:\sp\public\sdk\inc\winreg.h +FILE 2574 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2575 f:\sp\public\sdk\inc\guiddef.h +FILE 2576 f:\sp\public\sdk\inc\windows.h +FILE 2577 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2578 f:\sp\public\sdk\inc\specstrings.h +FILE 2579 f:\sp\public\sdk\inc\basetsd.h +FILE 2580 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2581 f:\sp\public\sdk\inc\tvout.h +FILE 2582 f:\sp\public\sdk\inc\winsvc.h +FILE 2583 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2584 f:\sp\public\sdk\inc\wingdi.h +FILE 2585 f:\sp\public\sdk\inc\pshpack4.h +FILE 2586 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2587 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2588 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 2589 f:\sp\public\sdk\inc\poppack.h +FILE 2590 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 2591 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 2592 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 2593 f:\sp\public\sdk\inc\winnetwk.h +FILE 2594 f:\sp\public\sdk\inc\imm.h +FILE 2595 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2596 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2597 f:\sp\public\sdk\inc\windef.h +FILE 2598 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2599 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2600 f:\sp\vctools\crt_bld\self_x86\crt\src\dos.h +FILE 2601 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2602 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2603 f:\sp\public\sdk\inc\pshpack1.h +FILE 2604 f:\sp\public\sdk\inc\winver.h +FILE 2605 f:\sp\public\sdk\inc\winnt.h +FILE 2606 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2607 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2608 f:\sp\vctools\crt_bld\self_x86\crt\src\crt0.c +FILE 2609 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2610 f:\sp\public\sdk\inc\winreg.h +FILE 2611 f:\sp\public\sdk\inc\winbase.h +FILE 2612 f:\sp\public\sdk\inc\winerror.h +FILE 2613 f:\sp\public\sdk\inc\ddbanned.h +FILE 2614 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2615 f:\sp\public\sdk\inc\pshpack8.h +FILE 2616 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2617 f:\sp\public\sdk\inc\reason.h +FILE 2618 f:\sp\public\sdk\inc\wincon.h +FILE 2619 f:\sp\public\sdk\inc\pshpack2.h +FILE 2620 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2621 f:\sp\public\sdk\inc\mcx.h +FILE 2622 f:\sp\public\sdk\inc\winuser.h +FILE 2623 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2624 f:\sp\public\sdk\inc\winnls.h +FILE 2625 f:\sp\public\sdk\inc\guiddef.h +FILE 2626 f:\sp\public\sdk\inc\windows.h +FILE 2627 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2628 f:\sp\public\sdk\inc\specstrings.h +FILE 2629 f:\sp\public\sdk\inc\basetsd.h +FILE 2630 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 2631 f:\sp\public\sdk\inc\stralign.h +FILE 2632 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\alloca16.asm +FILE 2633 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 2634 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\chkstk.asm +FILE 2635 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 2636 f:\sp\public\sdk\inc\wincon.h +FILE 2637 f:\sp\public\sdk\inc\imm.h +FILE 2638 f:\sp\public\sdk\inc\winbase.h +FILE 2639 f:\sp\public\sdk\inc\wingdi.h +FILE 2640 f:\sp\public\sdk\inc\winver.h +FILE 2641 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 2642 f:\sp\public\sdk\inc\windows.h +FILE 2643 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 2644 f:\sp\public\sdk\inc\pshpack2.h +FILE 2645 f:\sp\public\sdk\inc\reason.h +FILE 2646 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\rtc\initsect.cpp +FILE 2647 f:\sp\public\sdk\inc\specstrings.h +FILE 2648 f:\sp\public\sdk\inc\basetsd.h +FILE 2649 f:\sp\public\sdk\inc\pshpack4.h +FILE 2650 f:\sp\public\sdk\inc\winnetwk.h +FILE 2651 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 2652 f:\sp\public\sdk\inc\stralign.h +FILE 2653 f:\sp\public\sdk\inc\poppack.h +FILE 2654 f:\sp\public\sdk\inc\winsvc.h +FILE 2655 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 2656 f:\sp\public\sdk\inc\windef.h +FILE 2657 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 2658 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 2659 f:\sp\public\sdk\inc\winuser.h +FILE 2660 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 2661 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 2662 f:\sp\public\sdk\inc\mcx.h +FILE 2663 f:\sp\public\sdk\inc\pshpack8.h +FILE 2664 f:\sp\public\sdk\inc\guiddef.h +FILE 2665 f:\sp\public\sdk\inc\winnt.h +FILE 2666 f:\sp\public\sdk\inc\winnls.h +FILE 2667 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 2668 f:\sp\public\sdk\inc\pshpack1.h +FILE 2669 f:\sp\public\sdk\inc\winerror.h +FILE 2670 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\rtcapi.h +FILE 2671 f:\sp\public\sdk\inc\winreg.h +FILE 2672 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 2673 f:\sp\public\sdk\inc\ddbanned.h +FILE 2674 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 2675 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 2676 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\rtcpriv.h +FILE 2677 f:\sp\public\sdk\inc\tvout.h +FILE 2678 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 2679 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 2680 f:\sp\public\sdk\inc\poppack.h +FILE 2681 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2682 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2683 f:\sp\public\sdk\inc\winnetwk.h +FILE 2684 f:\sp\public\sdk\inc\imm.h +FILE 2685 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2686 f:\sp\public\sdk\inc\windef.h +FILE 2687 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2688 f:\sp\public\sdk\inc\pshpack1.h +FILE 2689 f:\sp\public\sdk\inc\winver.h +FILE 2690 f:\sp\public\sdk\inc\windows.h +FILE 2691 f:\sp\public\sdk\inc\winnt.h +FILE 2692 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2693 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2694 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2695 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2696 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2697 f:\sp\public\sdk\inc\winreg.h +FILE 2698 f:\sp\public\sdk\inc\winbase.h +FILE 2699 f:\sp\vctools\crt_bld\self_x86\crt\src\wtombenv.c +FILE 2700 f:\sp\public\sdk\inc\winerror.h +FILE 2701 f:\sp\public\sdk\inc\pshpack8.h +FILE 2702 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2703 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2704 f:\sp\public\sdk\inc\reason.h +FILE 2705 f:\sp\public\sdk\inc\wincon.h +FILE 2706 f:\sp\public\sdk\inc\ddbanned.h +FILE 2707 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2708 f:\sp\public\sdk\inc\pshpack2.h +FILE 2709 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2710 f:\sp\public\sdk\inc\mcx.h +FILE 2711 f:\sp\public\sdk\inc\winuser.h +FILE 2712 f:\sp\public\sdk\inc\winnls.h +FILE 2713 f:\sp\public\sdk\inc\guiddef.h +FILE 2714 f:\sp\public\sdk\inc\specstrings.h +FILE 2715 f:\sp\public\sdk\inc\basetsd.h +FILE 2716 f:\sp\public\sdk\inc\stralign.h +FILE 2717 f:\sp\public\sdk\inc\tvout.h +FILE 2718 f:\sp\public\sdk\inc\winsvc.h +FILE 2719 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2720 f:\sp\public\sdk\inc\wingdi.h +FILE 2721 f:\sp\public\sdk\inc\pshpack4.h +FILE 2722 f:\sp\public\sdk\inc\winnt.h +FILE 2723 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2724 f:\sp\public\sdk\inc\winreg.h +FILE 2725 f:\sp\public\sdk\inc\winbase.h +FILE 2726 f:\sp\public\sdk\inc\winerror.h +FILE 2727 f:\sp\public\sdk\inc\pshpack8.h +FILE 2728 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2729 f:\sp\public\sdk\inc\reason.h +FILE 2730 f:\sp\public\sdk\inc\wincon.h +FILE 2731 f:\sp\vctools\crt_bld\self_x86\crt\src\float.h +FILE 2732 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2733 f:\sp\public\sdk\inc\pshpack2.h +FILE 2734 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2735 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2736 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2737 f:\sp\public\sdk\inc\mcx.h +FILE 2738 f:\sp\public\sdk\inc\winuser.h +FILE 2739 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2740 f:\sp\public\sdk\inc\winnls.h +FILE 2741 f:\sp\public\sdk\inc\guiddef.h +FILE 2742 f:\sp\public\sdk\inc\windows.h +FILE 2743 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2744 f:\sp\public\sdk\inc\specstrings.h +FILE 2745 f:\sp\public\sdk\inc\basetsd.h +FILE 2746 f:\sp\public\sdk\inc\stralign.h +FILE 2747 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2748 f:\sp\vctools\crt_bld\self_x86\crt\src\signal.h +FILE 2749 f:\sp\public\sdk\inc\tvout.h +FILE 2750 f:\sp\public\sdk\inc\winsvc.h +FILE 2751 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2752 f:\sp\vctools\crt_bld\self_x86\crt\src\winxfltr.c +FILE 2753 f:\sp\public\sdk\inc\wingdi.h +FILE 2754 f:\sp\public\sdk\inc\pshpack4.h +FILE 2755 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2756 f:\sp\public\sdk\inc\poppack.h +FILE 2757 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2758 f:\sp\public\sdk\inc\winnetwk.h +FILE 2759 f:\sp\public\sdk\inc\imm.h +FILE 2760 f:\sp\public\sdk\inc\ddbanned.h +FILE 2761 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2762 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2763 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2764 f:\sp\public\sdk\inc\windef.h +FILE 2765 f:\sp\vctools\crt_bld\self_x86\crt\src\crtwrn.h +FILE 2766 f:\sp\public\sdk\inc\pshpack1.h +FILE 2767 f:\sp\public\sdk\inc\winver.h +FILE 2768 f:\sp\public\sdk\inc\winnetwk.h +FILE 2769 f:\sp\public\sdk\inc\imm.h +FILE 2770 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2771 f:\sp\public\sdk\inc\windef.h +FILE 2772 f:\sp\public\sdk\inc\pshpack1.h +FILE 2773 f:\sp\public\sdk\inc\winver.h +FILE 2774 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2775 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2776 f:\sp\public\sdk\inc\winnt.h +FILE 2777 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2778 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2779 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2780 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2781 f:\sp\public\sdk\inc\winreg.h +FILE 2782 f:\sp\public\sdk\inc\winbase.h +FILE 2783 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2784 f:\sp\public\sdk\inc\winerror.h +FILE 2785 f:\sp\vctools\crt_bld\self_x86\crt\src\winsig.c +FILE 2786 f:\sp\public\sdk\inc\pshpack8.h +FILE 2787 f:\sp\public\sdk\inc\reason.h +FILE 2788 f:\sp\public\sdk\inc\wincon.h +FILE 2789 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2790 f:\sp\public\sdk\inc\pshpack2.h +FILE 2791 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2792 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2793 f:\sp\public\sdk\inc\mcx.h +FILE 2794 f:\sp\public\sdk\inc\winuser.h +FILE 2795 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2796 f:\sp\public\sdk\inc\winnls.h +FILE 2797 f:\sp\public\sdk\inc\guiddef.h +FILE 2798 f:\sp\public\sdk\inc\windows.h +FILE 2799 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2800 f:\sp\public\sdk\inc\specstrings.h +FILE 2801 f:\sp\public\sdk\inc\ddbanned.h +FILE 2802 f:\sp\public\sdk\inc\basetsd.h +FILE 2803 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2804 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2805 f:\sp\public\sdk\inc\stralign.h +FILE 2806 f:\sp\vctools\crt_bld\self_x86\crt\src\signal.h +FILE 2807 f:\sp\public\sdk\inc\tvout.h +FILE 2808 f:\sp\public\sdk\inc\winsvc.h +FILE 2809 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2810 f:\sp\public\sdk\inc\wingdi.h +FILE 2811 f:\sp\vctools\crt_bld\self_x86\crt\src\float.h +FILE 2812 f:\sp\vctools\crt_bld\self_x86\crt\src\crtwrn.h +FILE 2813 f:\sp\public\sdk\inc\pshpack4.h +FILE 2814 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 2815 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2816 f:\sp\public\sdk\inc\poppack.h +FILE 2817 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2818 f:\sp\public\sdk\inc\wincon.h +FILE 2819 f:\sp\public\sdk\inc\imm.h +FILE 2820 f:\sp\public\sdk\inc\winbase.h +FILE 2821 f:\sp\public\sdk\inc\wingdi.h +FILE 2822 f:\sp\public\sdk\inc\winver.h +FILE 2823 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2824 f:\sp\public\sdk\inc\windows.h +FILE 2825 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2826 f:\sp\public\sdk\inc\pshpack2.h +FILE 2827 f:\sp\public\sdk\inc\reason.h +FILE 2828 f:\sp\vctools\crt_bld\self_x86\crt\src\w_str.c +FILE 2829 f:\sp\public\sdk\inc\specstrings.h +FILE 2830 f:\sp\public\sdk\inc\basetsd.h +FILE 2831 f:\sp\public\sdk\inc\pshpack4.h +FILE 2832 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2833 f:\sp\public\sdk\inc\winnetwk.h +FILE 2834 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2835 f:\sp\public\sdk\inc\stralign.h +FILE 2836 f:\sp\public\sdk\inc\poppack.h +FILE 2837 f:\sp\public\sdk\inc\winsvc.h +FILE 2838 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2839 f:\sp\public\sdk\inc\windef.h +FILE 2840 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2841 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2842 f:\sp\public\sdk\inc\winuser.h +FILE 2843 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2844 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2845 f:\sp\public\sdk\inc\mcx.h +FILE 2846 f:\sp\public\sdk\inc\pshpack8.h +FILE 2847 f:\sp\public\sdk\inc\guiddef.h +FILE 2848 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2849 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2850 f:\sp\public\sdk\inc\winnt.h +FILE 2851 f:\sp\public\sdk\inc\winnls.h +FILE 2852 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2853 f:\sp\public\sdk\inc\pshpack1.h +FILE 2854 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2855 f:\sp\public\sdk\inc\winerror.h +FILE 2856 f:\sp\public\sdk\inc\winreg.h +FILE 2857 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2858 f:\sp\public\sdk\inc\ddbanned.h +FILE 2859 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2860 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2861 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2862 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2863 f:\sp\public\sdk\inc\tvout.h +FILE 2864 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2865 f:\sp\public\sdk\inc\wincon.h +FILE 2866 f:\sp\public\sdk\inc\imm.h +FILE 2867 f:\sp\public\sdk\inc\winbase.h +FILE 2868 f:\sp\public\sdk\inc\wingdi.h +FILE 2869 f:\sp\public\sdk\inc\winver.h +FILE 2870 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2871 f:\sp\public\sdk\inc\windows.h +FILE 2872 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2873 f:\sp\public\sdk\inc\pshpack2.h +FILE 2874 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2875 f:\sp\public\sdk\inc\reason.h +FILE 2876 f:\sp\vctools\crt_bld\self_x86\crt\src\w_loc.c +FILE 2877 f:\sp\public\sdk\inc\specstrings.h +FILE 2878 f:\sp\public\sdk\inc\basetsd.h +FILE 2879 f:\sp\public\sdk\inc\pshpack4.h +FILE 2880 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2881 f:\sp\public\sdk\inc\winnetwk.h +FILE 2882 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2883 f:\sp\public\sdk\inc\stralign.h +FILE 2884 f:\sp\public\sdk\inc\poppack.h +FILE 2885 f:\sp\public\sdk\inc\winsvc.h +FILE 2886 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2887 f:\sp\public\sdk\inc\windef.h +FILE 2888 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2889 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2890 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2891 f:\sp\public\sdk\inc\winuser.h +FILE 2892 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2893 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2894 f:\sp\public\sdk\inc\mcx.h +FILE 2895 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2896 f:\sp\public\sdk\inc\pshpack8.h +FILE 2897 f:\sp\public\sdk\inc\guiddef.h +FILE 2898 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2899 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2900 f:\sp\public\sdk\inc\winnt.h +FILE 2901 f:\sp\public\sdk\inc\winnls.h +FILE 2902 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2903 f:\sp\public\sdk\inc\pshpack1.h +FILE 2904 f:\sp\public\sdk\inc\winerror.h +FILE 2905 f:\sp\public\sdk\inc\winreg.h +FILE 2906 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2907 f:\sp\public\sdk\inc\ddbanned.h +FILE 2908 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2909 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2910 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2911 f:\sp\public\sdk\inc\tvout.h +FILE 2912 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2913 f:\sp\public\sdk\inc\poppack.h +FILE 2914 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2915 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2916 f:\sp\public\sdk\inc\winnetwk.h +FILE 2917 f:\sp\public\sdk\inc\imm.h +FILE 2918 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2919 f:\sp\public\sdk\inc\windef.h +FILE 2920 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 2921 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 2922 f:\sp\public\sdk\inc\pshpack1.h +FILE 2923 f:\sp\public\sdk\inc\winver.h +FILE 2924 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2925 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2926 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2927 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2928 f:\sp\public\sdk\inc\winnt.h +FILE 2929 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 2930 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 2931 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 2932 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 2933 f:\sp\public\sdk\inc\winreg.h +FILE 2934 f:\sp\vctools\crt_bld\self_x86\crt\src\convrtcp.c +FILE 2935 f:\sp\public\sdk\inc\winbase.h +FILE 2936 f:\sp\public\sdk\inc\winerror.h +FILE 2937 f:\sp\public\sdk\inc\pshpack8.h +FILE 2938 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2939 f:\sp\public\sdk\inc\reason.h +FILE 2940 f:\sp\public\sdk\inc\wincon.h +FILE 2941 f:\sp\public\sdk\inc\ddbanned.h +FILE 2942 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 2943 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 2944 f:\sp\public\sdk\inc\pshpack2.h +FILE 2945 f:\sp\public\sdk\inc\mcx.h +FILE 2946 f:\sp\public\sdk\inc\winuser.h +FILE 2947 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2948 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 2949 f:\sp\public\sdk\inc\winnls.h +FILE 2950 f:\sp\public\sdk\inc\guiddef.h +FILE 2951 f:\sp\public\sdk\inc\windows.h +FILE 2952 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2953 f:\sp\public\sdk\inc\specstrings.h +FILE 2954 f:\sp\public\sdk\inc\basetsd.h +FILE 2955 f:\sp\public\sdk\inc\stralign.h +FILE 2956 f:\sp\public\sdk\inc\tvout.h +FILE 2957 f:\sp\public\sdk\inc\winsvc.h +FILE 2958 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 2959 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2960 f:\sp\public\sdk\inc\wingdi.h +FILE 2961 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2962 f:\sp\public\sdk\inc\pshpack4.h +FILE 2963 f:\sp\public\sdk\inc\winerror.h +FILE 2964 f:\sp\public\sdk\inc\pshpack8.h +FILE 2965 f:\sp\public\sdk\inc\reason.h +FILE 2966 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 2967 f:\sp\public\sdk\inc\wincon.h +FILE 2968 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 2969 f:\sp\public\sdk\inc\pshpack2.h +FILE 2970 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 2971 f:\sp\public\sdk\inc\mcx.h +FILE 2972 f:\sp\public\sdk\inc\winuser.h +FILE 2973 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 2974 f:\sp\public\sdk\inc\winnls.h +FILE 2975 f:\sp\public\sdk\inc\guiddef.h +FILE 2976 f:\sp\public\sdk\inc\windows.h +FILE 2977 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 2978 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 2979 f:\sp\public\sdk\inc\specstrings.h +FILE 2980 f:\sp\public\sdk\inc\basetsd.h +FILE 2981 f:\sp\public\sdk\inc\stralign.h +FILE 2982 f:\sp\public\sdk\inc\tvout.h +FILE 2983 f:\sp\public\sdk\inc\winsvc.h +FILE 2984 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 2985 f:\sp\public\sdk\inc\wingdi.h +FILE 2986 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 2987 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 2988 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 2989 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 2990 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 2991 f:\sp\public\sdk\inc\pshpack4.h +FILE 2992 f:\sp\public\sdk\inc\poppack.h +FILE 2993 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 2994 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 2995 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.c +FILE 2996 f:\sp\public\sdk\inc\winnetwk.h +FILE 2997 f:\sp\public\sdk\inc\imm.h +FILE 2998 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 2999 f:\sp\public\sdk\inc\windef.h +FILE 3000 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3001 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3002 f:\sp\public\sdk\inc\pshpack1.h +FILE 3003 f:\sp\public\sdk\inc\ddbanned.h +FILE 3004 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3005 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3006 f:\sp\public\sdk\inc\winver.h +FILE 3007 f:\sp\public\sdk\inc\winnt.h +FILE 3008 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3009 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3010 f:\sp\public\sdk\inc\winreg.h +FILE 3011 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3012 f:\sp\public\sdk\inc\winbase.h +FILE 3013 f:\sp\public\sdk\inc\poppack.h +FILE 3014 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 3015 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 3016 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3017 f:\sp\public\sdk\inc\winnetwk.h +FILE 3018 f:\sp\public\sdk\inc\imm.h +FILE 3019 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3020 f:\sp\public\sdk\inc\windef.h +FILE 3021 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3022 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3023 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3024 f:\sp\public\sdk\inc\pshpack1.h +FILE 3025 f:\sp\public\sdk\inc\winver.h +FILE 3026 f:\sp\public\sdk\inc\windows.h +FILE 3027 f:\sp\public\sdk\inc\winnt.h +FILE 3028 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3029 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3030 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3031 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3032 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3033 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3034 f:\sp\public\sdk\inc\winreg.h +FILE 3035 f:\sp\public\sdk\inc\winbase.h +FILE 3036 f:\sp\vctools\crt_bld\self_x86\crt\src\setenv.c +FILE 3037 f:\sp\public\sdk\inc\winerror.h +FILE 3038 f:\sp\public\sdk\inc\pshpack8.h +FILE 3039 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3040 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3041 f:\sp\public\sdk\inc\reason.h +FILE 3042 f:\sp\public\sdk\inc\wincon.h +FILE 3043 f:\sp\public\sdk\inc\ddbanned.h +FILE 3044 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3045 f:\sp\public\sdk\inc\pshpack2.h +FILE 3046 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3047 f:\sp\public\sdk\inc\mcx.h +FILE 3048 f:\sp\public\sdk\inc\winuser.h +FILE 3049 f:\sp\public\sdk\inc\winnls.h +FILE 3050 f:\sp\public\sdk\inc\guiddef.h +FILE 3051 f:\sp\public\sdk\inc\specstrings.h +FILE 3052 f:\sp\public\sdk\inc\basetsd.h +FILE 3053 f:\sp\public\sdk\inc\stralign.h +FILE 3054 f:\sp\public\sdk\inc\tvout.h +FILE 3055 f:\sp\public\sdk\inc\winsvc.h +FILE 3056 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3057 f:\sp\public\sdk\inc\wingdi.h +FILE 3058 f:\sp\public\sdk\inc\pshpack4.h +FILE 3059 f:\sp\public\sdk\inc\poppack.h +FILE 3060 f:\sp\public\sdk\inc\winnetwk.h +FILE 3061 f:\sp\public\sdk\inc\imm.h +FILE 3062 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3063 f:\sp\public\sdk\inc\windef.h +FILE 3064 f:\sp\public\sdk\inc\pshpack1.h +FILE 3065 f:\sp\public\sdk\inc\winver.h +FILE 3066 f:\sp\public\sdk\inc\windows.h +FILE 3067 f:\sp\public\sdk\inc\winnt.h +FILE 3068 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3069 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3070 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3071 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3072 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3073 f:\sp\public\sdk\inc\winreg.h +FILE 3074 f:\sp\public\sdk\inc\winbase.h +FILE 3075 f:\sp\vctools\crt_bld\self_x86\crt\src\rand_s.c +FILE 3076 f:\sp\public\sdk\inc\winerror.h +FILE 3077 f:\sp\public\sdk\inc\pshpack8.h +FILE 3078 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3079 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3080 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3081 f:\sp\public\sdk\inc\reason.h +FILE 3082 f:\sp\public\sdk\inc\wincon.h +FILE 3083 f:\sp\public\sdk\inc\ddbanned.h +FILE 3084 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3085 f:\sp\public\sdk\inc\pshpack2.h +FILE 3086 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3087 f:\sp\public\sdk\inc\mcx.h +FILE 3088 f:\sp\public\sdk\inc\winuser.h +FILE 3089 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 3090 f:\sp\public\sdk\inc\winnls.h +FILE 3091 f:\sp\public\sdk\inc\guiddef.h +FILE 3092 f:\sp\public\sdk\inc\specstrings.h +FILE 3093 f:\sp\public\sdk\inc\basetsd.h +FILE 3094 f:\sp\public\sdk\inc\stralign.h +FILE 3095 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3096 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3097 f:\sp\public\sdk\inc\tvout.h +FILE 3098 f:\sp\public\sdk\inc\winsvc.h +FILE 3099 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3100 f:\sp\public\sdk\inc\wingdi.h +FILE 3101 f:\sp\public\sdk\inc\pshpack4.h +FILE 3102 f:\sp\public\sdk\inc\poppack.h +FILE 3103 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3104 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3105 f:\sp\public\sdk\inc\winnetwk.h +FILE 3106 f:\sp\public\sdk\inc\imm.h +FILE 3107 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3108 f:\sp\public\sdk\inc\windef.h +FILE 3109 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3110 f:\sp\public\sdk\inc\pshpack1.h +FILE 3111 f:\sp\public\sdk\inc\winver.h +FILE 3112 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3113 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3114 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3115 f:\sp\public\sdk\inc\winnt.h +FILE 3116 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3117 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3118 f:\sp\public\sdk\inc\winreg.h +FILE 3119 f:\sp\vctools\crt_bld\self_x86\crt\src\purevirt.c +FILE 3120 f:\sp\public\sdk\inc\winbase.h +FILE 3121 f:\sp\public\sdk\inc\winerror.h +FILE 3122 f:\sp\public\sdk\inc\pshpack8.h +FILE 3123 f:\sp\public\sdk\inc\reason.h +FILE 3124 f:\sp\public\sdk\inc\wincon.h +FILE 3125 f:\sp\public\sdk\inc\ddbanned.h +FILE 3126 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3127 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3128 f:\sp\public\sdk\inc\pshpack2.h +FILE 3129 f:\sp\public\sdk\inc\mcx.h +FILE 3130 f:\sp\public\sdk\inc\winuser.h +FILE 3131 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3132 f:\sp\public\sdk\inc\winnls.h +FILE 3133 f:\sp\public\sdk\inc\guiddef.h +FILE 3134 f:\sp\public\sdk\inc\windows.h +FILE 3135 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3136 f:\sp\public\sdk\inc\specstrings.h +FILE 3137 f:\sp\public\sdk\inc\basetsd.h +FILE 3138 f:\sp\public\sdk\inc\stralign.h +FILE 3139 f:\sp\public\sdk\inc\tvout.h +FILE 3140 f:\sp\public\sdk\inc\winsvc.h +FILE 3141 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3142 f:\sp\public\sdk\inc\wingdi.h +FILE 3143 f:\sp\public\sdk\inc\pshpack4.h +FILE 3144 f:\sp\public\sdk\inc\poppack.h +FILE 3145 f:\sp\public\sdk\inc\winnetwk.h +FILE 3146 f:\sp\public\sdk\inc\imm.h +FILE 3147 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3148 f:\sp\public\sdk\inc\windef.h +FILE 3149 f:\sp\public\sdk\inc\pshpack1.h +FILE 3150 f:\sp\public\sdk\inc\winver.h +FILE 3151 f:\sp\public\sdk\inc\windows.h +FILE 3152 f:\sp\public\sdk\inc\winnt.h +FILE 3153 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3154 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3155 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3156 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3157 f:\sp\public\sdk\inc\winreg.h +FILE 3158 f:\sp\public\sdk\inc\winbase.h +FILE 3159 f:\sp\vctools\crt_bld\self_x86\crt\src\pesect.c +FILE 3160 f:\sp\public\sdk\inc\winerror.h +FILE 3161 f:\sp\public\sdk\inc\pshpack8.h +FILE 3162 f:\sp\public\sdk\inc\reason.h +FILE 3163 f:\sp\public\sdk\inc\wincon.h +FILE 3164 f:\sp\public\sdk\inc\ddbanned.h +FILE 3165 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3166 f:\sp\public\sdk\inc\pshpack2.h +FILE 3167 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3168 f:\sp\public\sdk\inc\mcx.h +FILE 3169 f:\sp\public\sdk\inc\winuser.h +FILE 3170 f:\sp\public\sdk\inc\winnls.h +FILE 3171 f:\sp\public\sdk\inc\guiddef.h +FILE 3172 f:\sp\public\sdk\inc\specstrings.h +FILE 3173 f:\sp\public\sdk\inc\basetsd.h +FILE 3174 f:\sp\public\sdk\inc\stralign.h +FILE 3175 f:\sp\public\sdk\inc\tvout.h +FILE 3176 f:\sp\public\sdk\inc\winsvc.h +FILE 3177 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3178 f:\sp\public\sdk\inc\wingdi.h +FILE 3179 f:\sp\public\sdk\inc\pshpack4.h +FILE 3180 f:\sp\public\sdk\inc\winerror.h +FILE 3181 f:\sp\public\sdk\inc\pshpack1.h +FILE 3182 f:\sp\public\sdk\inc\pshpack8.h +FILE 3183 f:\sp\public\sdk\inc\winver.h +FILE 3184 f:\sp\public\sdk\inc\pshpack2.h +FILE 3185 f:\sp\public\sdk\inc\winreg.h +FILE 3186 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3187 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3188 f:\sp\public\sdk\inc\guiddef.h +FILE 3189 f:\sp\public\sdk\inc\windows.h +FILE 3190 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3191 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 3192 f:\sp\public\sdk\inc\specstrings.h +FILE 3193 f:\sp\public\sdk\inc\basetsd.h +FILE 3194 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3195 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3196 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3197 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3198 f:\sp\public\sdk\inc\pshpack4.h +FILE 3199 f:\sp\public\sdk\inc\reason.h +FILE 3200 f:\sp\public\sdk\inc\wincon.h +FILE 3201 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3202 f:\sp\public\sdk\inc\poppack.h +FILE 3203 f:\sp\public\sdk\inc\mcx.h +FILE 3204 f:\sp\public\sdk\inc\winuser.h +FILE 3205 f:\sp\public\sdk\inc\winnls.h +FILE 3206 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsdata2.c +FILE 3207 f:\sp\public\sdk\inc\stralign.h +FILE 3208 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3209 f:\sp\public\sdk\inc\windef.h +FILE 3210 f:\sp\public\sdk\inc\tvout.h +FILE 3211 f:\sp\public\sdk\inc\winsvc.h +FILE 3212 f:\sp\public\sdk\inc\wingdi.h +FILE 3213 f:\sp\public\sdk\inc\ddbanned.h +FILE 3214 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3215 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3216 f:\sp\public\sdk\inc\winnt.h +FILE 3217 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3218 f:\sp\public\sdk\inc\winnetwk.h +FILE 3219 f:\sp\public\sdk\inc\imm.h +FILE 3220 f:\sp\public\sdk\inc\winbase.h +FILE 3221 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3222 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3223 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3224 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsdata1.c +FILE 3225 f:\sp\public\sdk\inc\ddbanned.h +FILE 3226 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3227 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3228 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3229 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsint.h +FILE 3230 f:\sp\public\sdk\inc\reason.h +FILE 3231 f:\sp\public\sdk\inc\wincon.h +FILE 3232 f:\sp\public\sdk\inc\pshpack2.h +FILE 3233 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3234 f:\sp\public\sdk\inc\mcx.h +FILE 3235 f:\sp\public\sdk\inc\winuser.h +FILE 3236 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3237 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3238 f:\sp\public\sdk\inc\winnls.h +FILE 3239 f:\sp\public\sdk\inc\guiddef.h +FILE 3240 f:\sp\public\sdk\inc\windows.h +FILE 3241 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3242 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3243 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3244 f:\sp\public\sdk\inc\specstrings.h +FILE 3245 f:\sp\public\sdk\inc\basetsd.h +FILE 3246 f:\sp\public\sdk\inc\stralign.h +FILE 3247 f:\sp\public\sdk\inc\tvout.h +FILE 3248 f:\sp\public\sdk\inc\winsvc.h +FILE 3249 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3250 f:\sp\public\sdk\inc\wingdi.h +FILE 3251 f:\sp\public\sdk\inc\pshpack4.h +FILE 3252 f:\sp\public\sdk\inc\poppack.h +FILE 3253 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 3254 f:\sp\public\sdk\inc\winnetwk.h +FILE 3255 f:\sp\public\sdk\inc\imm.h +FILE 3256 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3257 f:\sp\public\sdk\inc\windef.h +FILE 3258 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3259 f:\sp\vctools\crt_bld\self_x86\crt\src\onexit.c +FILE 3260 f:\sp\public\sdk\inc\pshpack1.h +FILE 3261 f:\sp\public\sdk\inc\winver.h +FILE 3262 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3263 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3264 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3265 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3266 f:\sp\public\sdk\inc\winnt.h +FILE 3267 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3268 f:\sp\public\sdk\inc\ddbanned.h +FILE 3269 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3270 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3271 f:\sp\public\sdk\inc\winreg.h +FILE 3272 f:\sp\public\sdk\inc\winbase.h +FILE 3273 f:\sp\public\sdk\inc\winerror.h +FILE 3274 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3275 f:\sp\public\sdk\inc\pshpack8.h +FILE 3276 f:\sp\public\sdk\inc\winbase.h +FILE 3277 f:\sp\public\sdk\inc\winerror.h +FILE 3278 f:\sp\public\sdk\inc\pshpack1.h +FILE 3279 f:\sp\public\sdk\inc\pshpack8.h +FILE 3280 f:\sp\public\sdk\inc\winver.h +FILE 3281 f:\sp\public\sdk\inc\pshpack2.h +FILE 3282 f:\sp\public\sdk\inc\winreg.h +FILE 3283 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3284 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3285 f:\sp\public\sdk\inc\guiddef.h +FILE 3286 f:\sp\public\sdk\inc\windows.h +FILE 3287 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3288 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3289 f:\sp\public\sdk\inc\specstrings.h +FILE 3290 f:\sp\public\sdk\inc\basetsd.h +FILE 3291 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3292 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3293 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3294 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3295 f:\sp\public\sdk\inc\pshpack4.h +FILE 3296 f:\sp\public\sdk\inc\reason.h +FILE 3297 f:\sp\public\sdk\inc\wincon.h +FILE 3298 f:\sp\public\sdk\inc\poppack.h +FILE 3299 f:\sp\public\sdk\inc\mcx.h +FILE 3300 f:\sp\public\sdk\inc\winuser.h +FILE 3301 f:\sp\public\sdk\inc\winnls.h +FILE 3302 f:\sp\vctools\crt_bld\self_x86\crt\src\lconv.c +FILE 3303 f:\sp\public\sdk\inc\stralign.h +FILE 3304 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3305 f:\sp\public\sdk\inc\windef.h +FILE 3306 f:\sp\public\sdk\inc\tvout.h +FILE 3307 f:\sp\public\sdk\inc\winsvc.h +FILE 3308 f:\sp\public\sdk\inc\wingdi.h +FILE 3309 f:\sp\public\sdk\inc\ddbanned.h +FILE 3310 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3311 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3312 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3313 f:\sp\public\sdk\inc\winnt.h +FILE 3314 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3315 f:\sp\public\sdk\inc\winnetwk.h +FILE 3316 f:\sp\public\sdk\inc\imm.h +FILE 3317 f:\sp\public\sdk\inc\guiddef.h +FILE 3318 f:\sp\public\sdk\inc\winnt.h +FILE 3319 f:\sp\public\sdk\inc\winnls.h +FILE 3320 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3321 f:\sp\public\sdk\inc\pshpack1.h +FILE 3322 f:\sp\public\sdk\inc\winerror.h +FILE 3323 f:\sp\public\sdk\inc\winreg.h +FILE 3324 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3325 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3326 f:\sp\public\sdk\inc\tvout.h +FILE 3327 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3328 f:\sp\vctools\crt_bld\self_x86\crt\src\invarg.c +FILE 3329 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3330 f:\sp\public\sdk\inc\wincon.h +FILE 3331 f:\sp\public\sdk\inc\imm.h +FILE 3332 f:\sp\public\sdk\inc\winbase.h +FILE 3333 f:\sp\public\sdk\inc\wingdi.h +FILE 3334 f:\sp\public\sdk\inc\winver.h +FILE 3335 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3336 f:\sp\public\sdk\inc\windows.h +FILE 3337 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3338 f:\sp\public\sdk\inc\pshpack2.h +FILE 3339 f:\sp\public\sdk\inc\reason.h +FILE 3340 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 3341 f:\sp\public\sdk\inc\specstrings.h +FILE 3342 f:\sp\public\sdk\inc\basetsd.h +FILE 3343 f:\sp\public\sdk\inc\pshpack4.h +FILE 3344 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3345 f:\sp\public\sdk\inc\winnetwk.h +FILE 3346 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3347 f:\sp\public\sdk\inc\stralign.h +FILE 3348 f:\sp\public\sdk\inc\poppack.h +FILE 3349 f:\sp\public\sdk\inc\winsvc.h +FILE 3350 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3351 f:\sp\public\sdk\inc\windef.h +FILE 3352 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3353 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3354 f:\sp\public\sdk\inc\winuser.h +FILE 3355 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3356 f:\sp\public\sdk\inc\ddbanned.h +FILE 3357 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3358 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3359 f:\sp\public\sdk\inc\mcx.h +FILE 3360 f:\sp\public\sdk\inc\pshpack8.h +FILE 3361 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3362 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3363 f:\sp\public\sdk\inc\pshpack4.h +FILE 3364 f:\sp\public\sdk\inc\poppack.h +FILE 3365 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3366 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3367 f:\sp\public\sdk\inc\winnetwk.h +FILE 3368 f:\sp\public\sdk\inc\imm.h +FILE 3369 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3370 f:\sp\public\sdk\inc\windef.h +FILE 3371 f:\sp\public\sdk\inc\pshpack1.h +FILE 3372 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3373 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3374 f:\sp\public\sdk\inc\winver.h +FILE 3375 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3376 f:\sp\public\sdk\inc\winnt.h +FILE 3377 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3378 f:\sp\public\sdk\inc\winreg.h +FILE 3379 f:\sp\vctools\crt_bld\self_x86\crt\src\inittime.c +FILE 3380 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3381 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3382 f:\sp\public\sdk\inc\winbase.h +FILE 3383 f:\sp\public\sdk\inc\winerror.h +FILE 3384 f:\sp\public\sdk\inc\pshpack8.h +FILE 3385 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3386 f:\sp\public\sdk\inc\reason.h +FILE 3387 f:\sp\public\sdk\inc\ddbanned.h +FILE 3388 f:\sp\public\sdk\inc\wincon.h +FILE 3389 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3390 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3391 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3392 f:\sp\public\sdk\inc\pshpack2.h +FILE 3393 f:\sp\public\sdk\inc\mcx.h +FILE 3394 f:\sp\public\sdk\inc\winuser.h +FILE 3395 f:\sp\public\sdk\inc\winnls.h +FILE 3396 f:\sp\public\sdk\inc\guiddef.h +FILE 3397 f:\sp\public\sdk\inc\stralign.h +FILE 3398 f:\sp\public\sdk\inc\specstrings.h +FILE 3399 f:\sp\public\sdk\inc\basetsd.h +FILE 3400 f:\sp\public\sdk\inc\windows.h +FILE 3401 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3402 f:\sp\public\sdk\inc\tvout.h +FILE 3403 f:\sp\public\sdk\inc\winsvc.h +FILE 3404 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3405 f:\sp\public\sdk\inc\wingdi.h +FILE 3406 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3407 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3408 f:\sp\public\sdk\inc\pshpack4.h +FILE 3409 f:\sp\public\sdk\inc\poppack.h +FILE 3410 f:\sp\public\sdk\inc\winnt.h +FILE 3411 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3412 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3413 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3414 f:\sp\public\sdk\inc\winnetwk.h +FILE 3415 f:\sp\public\sdk\inc\imm.h +FILE 3416 f:\sp\public\sdk\inc\pshpack1.h +FILE 3417 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3418 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3419 f:\sp\public\sdk\inc\winver.h +FILE 3420 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3421 f:\sp\public\sdk\inc\guiddef.h +FILE 3422 f:\sp\public\sdk\inc\specstrings.h +FILE 3423 f:\sp\public\sdk\inc\basetsd.h +FILE 3424 f:\sp\public\sdk\inc\windows.h +FILE 3425 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3426 f:\sp\public\sdk\inc\winreg.h +FILE 3427 f:\sp\vctools\crt_bld\self_x86\crt\src\initnum.c +FILE 3428 f:\sp\vctools\crt_bld\self_x86\crt\src\nlsint.h +FILE 3429 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3430 f:\sp\public\sdk\inc\winbase.h +FILE 3431 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3432 f:\sp\public\sdk\inc\winerror.h +FILE 3433 f:\sp\public\sdk\inc\pshpack8.h +FILE 3434 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3435 f:\sp\public\sdk\inc\reason.h +FILE 3436 f:\sp\public\sdk\inc\ddbanned.h +FILE 3437 f:\sp\public\sdk\inc\wincon.h +FILE 3438 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3439 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3440 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3441 f:\sp\public\sdk\inc\pshpack2.h +FILE 3442 f:\sp\public\sdk\inc\mcx.h +FILE 3443 f:\sp\public\sdk\inc\winuser.h +FILE 3444 f:\sp\public\sdk\inc\winnls.h +FILE 3445 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3446 f:\sp\public\sdk\inc\windef.h +FILE 3447 f:\sp\public\sdk\inc\stralign.h +FILE 3448 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3449 f:\sp\public\sdk\inc\tvout.h +FILE 3450 f:\sp\public\sdk\inc\winsvc.h +FILE 3451 f:\sp\public\sdk\inc\wingdi.h +FILE 3452 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3453 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3454 f:\sp\public\sdk\inc\pshpack4.h +FILE 3455 f:\sp\public\sdk\inc\poppack.h +FILE 3456 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3457 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3458 f:\sp\public\sdk\inc\winnetwk.h +FILE 3459 f:\sp\public\sdk\inc\imm.h +FILE 3460 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3461 f:\sp\public\sdk\inc\windef.h +FILE 3462 f:\sp\public\sdk\inc\pshpack1.h +FILE 3463 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3464 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3465 f:\sp\public\sdk\inc\winver.h +FILE 3466 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3467 f:\sp\public\sdk\inc\winnt.h +FILE 3468 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3469 f:\sp\public\sdk\inc\winreg.h +FILE 3470 f:\sp\vctools\crt_bld\self_x86\crt\src\initmon.c +FILE 3471 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3472 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3473 f:\sp\public\sdk\inc\winbase.h +FILE 3474 f:\sp\public\sdk\inc\winerror.h +FILE 3475 f:\sp\public\sdk\inc\pshpack8.h +FILE 3476 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3477 f:\sp\public\sdk\inc\reason.h +FILE 3478 f:\sp\public\sdk\inc\ddbanned.h +FILE 3479 f:\sp\public\sdk\inc\wincon.h +FILE 3480 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3481 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3482 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3483 f:\sp\public\sdk\inc\pshpack2.h +FILE 3484 f:\sp\public\sdk\inc\mcx.h +FILE 3485 f:\sp\public\sdk\inc\winuser.h +FILE 3486 f:\sp\public\sdk\inc\winnls.h +FILE 3487 f:\sp\public\sdk\inc\guiddef.h +FILE 3488 f:\sp\public\sdk\inc\stralign.h +FILE 3489 f:\sp\public\sdk\inc\specstrings.h +FILE 3490 f:\sp\public\sdk\inc\basetsd.h +FILE 3491 f:\sp\public\sdk\inc\windows.h +FILE 3492 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3493 f:\sp\public\sdk\inc\tvout.h +FILE 3494 f:\sp\public\sdk\inc\winsvc.h +FILE 3495 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3496 f:\sp\public\sdk\inc\wingdi.h +FILE 3497 f:\sp\public\sdk\inc\winbase.h +FILE 3498 f:\sp\public\sdk\inc\winerror.h +FILE 3499 f:\sp\public\sdk\inc\pshpack1.h +FILE 3500 f:\sp\public\sdk\inc\pshpack8.h +FILE 3501 f:\sp\public\sdk\inc\winver.h +FILE 3502 f:\sp\public\sdk\inc\pshpack2.h +FILE 3503 f:\sp\public\sdk\inc\winreg.h +FILE 3504 f:\sp\public\sdk\inc\guiddef.h +FILE 3505 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3506 f:\sp\public\sdk\inc\specstrings.h +FILE 3507 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3508 f:\sp\public\sdk\inc\basetsd.h +FILE 3509 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3510 f:\sp\public\sdk\inc\windows.h +FILE 3511 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3512 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3513 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3514 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3515 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3516 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3517 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3518 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3519 f:\sp\public\sdk\inc\pshpack4.h +FILE 3520 f:\sp\public\sdk\inc\reason.h +FILE 3521 f:\sp\public\sdk\inc\wincon.h +FILE 3522 f:\sp\public\sdk\inc\poppack.h +FILE 3523 f:\sp\vctools\crt_bld\self_x86\crt\src\inithelp.c +FILE 3524 f:\sp\public\sdk\inc\mcx.h +FILE 3525 f:\sp\public\sdk\inc\winuser.h +FILE 3526 f:\sp\public\sdk\inc\winnls.h +FILE 3527 f:\sp\public\sdk\inc\stralign.h +FILE 3528 f:\sp\public\sdk\inc\tvout.h +FILE 3529 f:\sp\public\sdk\inc\winsvc.h +FILE 3530 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3531 f:\sp\public\sdk\inc\wingdi.h +FILE 3532 f:\sp\public\sdk\inc\windef.h +FILE 3533 f:\sp\public\sdk\inc\ddbanned.h +FILE 3534 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3535 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3536 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3537 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3538 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3539 f:\sp\public\sdk\inc\winnetwk.h +FILE 3540 f:\sp\public\sdk\inc\imm.h +FILE 3541 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3542 f:\sp\public\sdk\inc\winnt.h +FILE 3543 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3544 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3545 f:\sp\public\sdk\inc\pshpack4.h +FILE 3546 f:\sp\public\sdk\inc\poppack.h +FILE 3547 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3548 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3549 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3550 f:\sp\public\sdk\inc\winnetwk.h +FILE 3551 f:\sp\public\sdk\inc\imm.h +FILE 3552 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3553 f:\sp\public\sdk\inc\windef.h +FILE 3554 f:\sp\public\sdk\inc\pshpack1.h +FILE 3555 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3556 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3557 f:\sp\public\sdk\inc\winver.h +FILE 3558 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3559 f:\sp\public\sdk\inc\winnt.h +FILE 3560 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3561 f:\sp\public\sdk\inc\winreg.h +FILE 3562 f:\sp\vctools\crt_bld\self_x86\crt\src\initctyp.c +FILE 3563 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3564 f:\sp\public\sdk\inc\winbase.h +FILE 3565 f:\sp\public\sdk\inc\winerror.h +FILE 3566 f:\sp\public\sdk\inc\pshpack8.h +FILE 3567 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3568 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3569 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3570 f:\sp\public\sdk\inc\reason.h +FILE 3571 f:\sp\public\sdk\inc\ddbanned.h +FILE 3572 f:\sp\public\sdk\inc\wincon.h +FILE 3573 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3574 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3575 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3576 f:\sp\public\sdk\inc\pshpack2.h +FILE 3577 f:\sp\public\sdk\inc\mcx.h +FILE 3578 f:\sp\public\sdk\inc\winuser.h +FILE 3579 f:\sp\public\sdk\inc\winnls.h +FILE 3580 f:\sp\public\sdk\inc\guiddef.h +FILE 3581 f:\sp\public\sdk\inc\stralign.h +FILE 3582 f:\sp\public\sdk\inc\specstrings.h +FILE 3583 f:\sp\public\sdk\inc\basetsd.h +FILE 3584 f:\sp\public\sdk\inc\windows.h +FILE 3585 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3586 f:\sp\public\sdk\inc\tvout.h +FILE 3587 f:\sp\public\sdk\inc\winsvc.h +FILE 3588 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3589 f:\sp\public\sdk\inc\wingdi.h +FILE 3590 f:\sp\public\sdk\inc\poppack.h +FILE 3591 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 3592 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3593 f:\sp\public\sdk\inc\winnetwk.h +FILE 3594 f:\sp\public\sdk\inc\imm.h +FILE 3595 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3596 f:\sp\public\sdk\inc\windef.h +FILE 3597 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3598 f:\sp\public\sdk\inc\pshpack1.h +FILE 3599 f:\sp\public\sdk\inc\winver.h +FILE 3600 f:\sp\public\sdk\inc\windows.h +FILE 3601 f:\sp\public\sdk\inc\winnt.h +FILE 3602 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3603 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3604 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3605 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3606 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3607 f:\sp\public\sdk\inc\winreg.h +FILE 3608 f:\sp\public\sdk\inc\winbase.h +FILE 3609 f:\sp\vctools\crt_bld\self_x86\crt\src\initcrit.c +FILE 3610 f:\sp\public\sdk\inc\winerror.h +FILE 3611 f:\sp\public\sdk\inc\pshpack8.h +FILE 3612 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3613 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3614 f:\sp\public\sdk\inc\reason.h +FILE 3615 f:\sp\public\sdk\inc\wincon.h +FILE 3616 f:\sp\public\sdk\inc\ddbanned.h +FILE 3617 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3618 f:\sp\public\sdk\inc\pshpack2.h +FILE 3619 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3620 f:\sp\public\sdk\inc\mcx.h +FILE 3621 f:\sp\public\sdk\inc\winuser.h +FILE 3622 f:\sp\public\sdk\inc\winnls.h +FILE 3623 f:\sp\public\sdk\inc\guiddef.h +FILE 3624 f:\sp\public\sdk\inc\specstrings.h +FILE 3625 f:\sp\public\sdk\inc\basetsd.h +FILE 3626 f:\sp\public\sdk\inc\stralign.h +FILE 3627 f:\sp\public\sdk\inc\tvout.h +FILE 3628 f:\sp\public\sdk\inc\winsvc.h +FILE 3629 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3630 f:\sp\public\sdk\inc\wingdi.h +FILE 3631 f:\sp\public\sdk\inc\pshpack4.h +FILE 3632 f:\sp\public\sdk\inc\poppack.h +FILE 3633 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3634 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3635 f:\sp\public\sdk\inc\winnetwk.h +FILE 3636 f:\sp\public\sdk\inc\imm.h +FILE 3637 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3638 f:\sp\public\sdk\inc\windef.h +FILE 3639 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3640 f:\sp\public\sdk\inc\pshpack1.h +FILE 3641 f:\sp\public\sdk\inc\winver.h +FILE 3642 f:\sp\public\sdk\inc\windows.h +FILE 3643 f:\sp\public\sdk\inc\winnt.h +FILE 3644 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3645 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3646 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3647 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3648 f:\sp\public\sdk\inc\winreg.h +FILE 3649 f:\sp\public\sdk\inc\winbase.h +FILE 3650 f:\sp\vctools\crt_bld\self_x86\crt\src\initcoll.c +FILE 3651 f:\sp\public\sdk\inc\winerror.h +FILE 3652 f:\sp\public\sdk\inc\pshpack8.h +FILE 3653 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3654 f:\sp\public\sdk\inc\reason.h +FILE 3655 f:\sp\public\sdk\inc\wincon.h +FILE 3656 f:\sp\public\sdk\inc\ddbanned.h +FILE 3657 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3658 f:\sp\public\sdk\inc\pshpack2.h +FILE 3659 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3660 f:\sp\public\sdk\inc\mcx.h +FILE 3661 f:\sp\public\sdk\inc\winuser.h +FILE 3662 f:\sp\public\sdk\inc\winnls.h +FILE 3663 f:\sp\public\sdk\inc\guiddef.h +FILE 3664 f:\sp\public\sdk\inc\specstrings.h +FILE 3665 f:\sp\public\sdk\inc\basetsd.h +FILE 3666 f:\sp\public\sdk\inc\stralign.h +FILE 3667 f:\sp\public\sdk\inc\tvout.h +FILE 3668 f:\sp\public\sdk\inc\winsvc.h +FILE 3669 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3670 f:\sp\public\sdk\inc\wingdi.h +FILE 3671 f:\sp\public\sdk\inc\pshpack4.h +FILE 3672 f:\sp\public\sdk\inc\poppack.h +FILE 3673 f:\sp\public\sdk\inc\winnetwk.h +FILE 3674 f:\sp\public\sdk\inc\imm.h +FILE 3675 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3676 f:\sp\public\sdk\inc\windef.h +FILE 3677 f:\binaries.x86ret\vcboot\inc\mm3dnow.h +FILE 3678 f:\sp\public\sdk\inc\pshpack1.h +FILE 3679 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 3680 f:\sp\public\sdk\inc\winver.h +FILE 3681 f:\sp\public\sdk\inc\windows.h +FILE 3682 f:\sp\public\sdk\inc\winnt.h +FILE 3683 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3684 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3685 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3686 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3687 f:\sp\public\sdk\inc\winreg.h +FILE 3688 f:\sp\public\sdk\inc\winbase.h +FILE 3689 f:\sp\vctools\crt_bld\self_x86\crt\src\gs_support.c +FILE 3690 f:\sp\public\sdk\inc\winerror.h +FILE 3691 f:\sp\public\sdk\inc\pshpack8.h +FILE 3692 f:\sp\vctools\crt_bld\self_x86\crt\src\intrin.h +FILE 3693 f:\sp\vctools\crt_bld\self_x86\crt\src\setjmp.h +FILE 3694 f:\sp\public\sdk\inc\reason.h +FILE 3695 f:\sp\public\sdk\inc\wincon.h +FILE 3696 f:\sp\public\sdk\inc\ddbanned.h +FILE 3697 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3698 f:\sp\public\sdk\inc\pshpack2.h +FILE 3699 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3700 f:\sp\public\sdk\inc\mcx.h +FILE 3701 f:\sp\public\sdk\inc\winuser.h +FILE 3702 f:\sp\public\sdk\inc\winnls.h +FILE 3703 f:\sp\public\sdk\inc\guiddef.h +FILE 3704 f:\sp\public\sdk\inc\specstrings.h +FILE 3705 f:\sp\public\sdk\inc\basetsd.h +FILE 3706 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 3707 f:\sp\public\sdk\inc\stralign.h +FILE 3708 f:\sp\public\sdk\inc\tvout.h +FILE 3709 f:\sp\public\sdk\inc\winsvc.h +FILE 3710 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3711 f:\sp\public\sdk\inc\wingdi.h +FILE 3712 f:\binaries.x86ret\vcboot\inc\emmintrin.h +FILE 3713 f:\binaries.x86ret\vcboot\inc\xmmintrin.h +FILE 3714 f:\binaries.x86ret\vcboot\inc\mmintrin.h +FILE 3715 f:\sp\public\sdk\inc\pshpack4.h +FILE 3716 f:\sp\public\sdk\inc\poppack.h +FILE 3717 f:\sp\public\sdk\inc\winnetwk.h +FILE 3718 f:\sp\public\sdk\inc\imm.h +FILE 3719 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3720 f:\sp\public\sdk\inc\windef.h +FILE 3721 f:\sp\public\sdk\inc\pshpack1.h +FILE 3722 f:\sp\public\sdk\inc\winver.h +FILE 3723 f:\sp\public\sdk\inc\windows.h +FILE 3724 f:\sp\public\sdk\inc\winnt.h +FILE 3725 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3726 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3727 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3728 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3729 f:\sp\public\sdk\inc\winreg.h +FILE 3730 f:\sp\public\sdk\inc\winbase.h +FILE 3731 f:\sp\vctools\crt_bld\self_x86\crt\src\gs_report.c +FILE 3732 f:\sp\public\sdk\inc\winerror.h +FILE 3733 f:\sp\public\sdk\inc\pshpack8.h +FILE 3734 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3735 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3736 f:\sp\public\sdk\inc\reason.h +FILE 3737 f:\sp\public\sdk\inc\wincon.h +FILE 3738 f:\sp\public\sdk\inc\ddbanned.h +FILE 3739 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3740 f:\sp\public\sdk\inc\pshpack2.h +FILE 3741 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3742 f:\sp\public\sdk\inc\mcx.h +FILE 3743 f:\sp\public\sdk\inc\winuser.h +FILE 3744 f:\sp\public\sdk\inc\winnls.h +FILE 3745 f:\sp\public\sdk\inc\guiddef.h +FILE 3746 f:\sp\public\sdk\inc\specstrings.h +FILE 3747 f:\sp\public\sdk\inc\basetsd.h +FILE 3748 f:\sp\public\sdk\inc\stralign.h +FILE 3749 f:\sp\public\sdk\inc\tvout.h +FILE 3750 f:\sp\public\sdk\inc\winsvc.h +FILE 3751 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3752 f:\sp\public\sdk\inc\wingdi.h +FILE 3753 f:\sp\public\sdk\inc\pshpack4.h +FILE 3754 f:\sp\public\sdk\inc\poppack.h +FILE 3755 f:\sp\public\sdk\inc\winnetwk.h +FILE 3756 f:\sp\public\sdk\inc\imm.h +FILE 3757 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3758 f:\sp\public\sdk\inc\windef.h +FILE 3759 f:\sp\public\sdk\inc\pshpack1.h +FILE 3760 f:\sp\public\sdk\inc\winver.h +FILE 3761 f:\sp\public\sdk\inc\windows.h +FILE 3762 f:\sp\public\sdk\inc\winnt.h +FILE 3763 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3764 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3765 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3766 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3767 f:\sp\public\sdk\inc\winreg.h +FILE 3768 f:\sp\public\sdk\inc\winbase.h +FILE 3769 f:\sp\vctools\crt_bld\self_x86\crt\src\gs_cookie.c +FILE 3770 f:\sp\public\sdk\inc\winerror.h +FILE 3771 f:\sp\public\sdk\inc\pshpack8.h +FILE 3772 f:\sp\public\sdk\inc\reason.h +FILE 3773 f:\sp\public\sdk\inc\wincon.h +FILE 3774 f:\sp\public\sdk\inc\ddbanned.h +FILE 3775 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3776 f:\sp\public\sdk\inc\pshpack2.h +FILE 3777 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3778 f:\sp\public\sdk\inc\mcx.h +FILE 3779 f:\sp\public\sdk\inc\winuser.h +FILE 3780 f:\sp\public\sdk\inc\winnls.h +FILE 3781 f:\sp\public\sdk\inc\guiddef.h +FILE 3782 f:\sp\public\sdk\inc\specstrings.h +FILE 3783 f:\sp\public\sdk\inc\basetsd.h +FILE 3784 f:\sp\public\sdk\inc\stralign.h +FILE 3785 f:\sp\public\sdk\inc\tvout.h +FILE 3786 f:\sp\public\sdk\inc\winsvc.h +FILE 3787 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3788 f:\sp\public\sdk\inc\wingdi.h +FILE 3789 f:\sp\public\sdk\inc\pshpack4.h +FILE 3790 f:\sp\public\sdk\inc\winerror.h +FILE 3791 f:\sp\public\sdk\inc\pshpack1.h +FILE 3792 f:\sp\public\sdk\inc\pshpack8.h +FILE 3793 f:\sp\public\sdk\inc\winver.h +FILE 3794 f:\sp\public\sdk\inc\pshpack2.h +FILE 3795 f:\sp\public\sdk\inc\winreg.h +FILE 3796 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3797 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3798 f:\sp\public\sdk\inc\guiddef.h +FILE 3799 f:\sp\public\sdk\inc\windows.h +FILE 3800 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3801 f:\sp\public\sdk\inc\specstrings.h +FILE 3802 f:\sp\public\sdk\inc\basetsd.h +FILE 3803 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3804 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 3805 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3806 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3807 f:\sp\public\sdk\inc\pshpack4.h +FILE 3808 f:\sp\public\sdk\inc\reason.h +FILE 3809 f:\sp\public\sdk\inc\wincon.h +FILE 3810 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3811 f:\sp\public\sdk\inc\poppack.h +FILE 3812 f:\sp\public\sdk\inc\mcx.h +FILE 3813 f:\sp\public\sdk\inc\winuser.h +FILE 3814 f:\sp\public\sdk\inc\winnls.h +FILE 3815 f:\sp\vctools\crt_bld\self_x86\crt\src\glstatus.c +FILE 3816 f:\sp\public\sdk\inc\stralign.h +FILE 3817 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3818 f:\sp\public\sdk\inc\windef.h +FILE 3819 f:\sp\public\sdk\inc\tvout.h +FILE 3820 f:\sp\public\sdk\inc\winsvc.h +FILE 3821 f:\sp\public\sdk\inc\wingdi.h +FILE 3822 f:\sp\public\sdk\inc\ddbanned.h +FILE 3823 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3824 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3825 f:\sp\public\sdk\inc\winnt.h +FILE 3826 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3827 f:\sp\public\sdk\inc\winnetwk.h +FILE 3828 f:\sp\public\sdk\inc\imm.h +FILE 3829 f:\sp\public\sdk\inc\winbase.h +FILE 3830 f:\sp\public\sdk\inc\pshpack4.h +FILE 3831 f:\sp\public\sdk\inc\poppack.h +FILE 3832 f:\sp\public\sdk\inc\winnt.h +FILE 3833 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3834 f:\sp\public\sdk\inc\winnetwk.h +FILE 3835 f:\sp\public\sdk\inc\imm.h +FILE 3836 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3837 f:\sp\public\sdk\inc\pshpack1.h +FILE 3838 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3839 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3840 f:\sp\public\sdk\inc\winver.h +FILE 3841 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3842 f:\sp\public\sdk\inc\guiddef.h +FILE 3843 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3844 f:\sp\public\sdk\inc\specstrings.h +FILE 3845 f:\sp\public\sdk\inc\basetsd.h +FILE 3846 f:\sp\public\sdk\inc\windows.h +FILE 3847 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3848 f:\sp\public\sdk\inc\winreg.h +FILE 3849 f:\sp\vctools\crt_bld\self_x86\crt\src\getqloc.c +FILE 3850 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3851 f:\sp\public\sdk\inc\winbase.h +FILE 3852 f:\sp\public\sdk\inc\winerror.h +FILE 3853 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3854 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3855 f:\sp\public\sdk\inc\pshpack8.h +FILE 3856 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3857 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3858 f:\sp\public\sdk\inc\reason.h +FILE 3859 f:\sp\public\sdk\inc\ddbanned.h +FILE 3860 f:\sp\public\sdk\inc\wincon.h +FILE 3861 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3862 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3863 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3864 f:\sp\public\sdk\inc\pshpack2.h +FILE 3865 f:\sp\public\sdk\inc\mcx.h +FILE 3866 f:\sp\public\sdk\inc\winuser.h +FILE 3867 f:\sp\public\sdk\inc\winnls.h +FILE 3868 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3869 f:\sp\public\sdk\inc\windef.h +FILE 3870 f:\sp\public\sdk\inc\stralign.h +FILE 3871 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3872 f:\sp\public\sdk\inc\tvout.h +FILE 3873 f:\sp\public\sdk\inc\winsvc.h +FILE 3874 f:\sp\public\sdk\inc\wingdi.h +FILE 3875 f:\sp\public\sdk\inc\reason.h +FILE 3876 f:\sp\public\sdk\inc\wincon.h +FILE 3877 f:\sp\public\sdk\inc\pshpack2.h +FILE 3878 f:\sp\public\sdk\inc\mcx.h +FILE 3879 f:\sp\public\sdk\inc\winuser.h +FILE 3880 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3881 f:\sp\public\sdk\inc\winnls.h +FILE 3882 f:\sp\public\sdk\inc\guiddef.h +FILE 3883 f:\sp\public\sdk\inc\windows.h +FILE 3884 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3885 f:\sp\public\sdk\inc\specstrings.h +FILE 3886 f:\sp\public\sdk\inc\basetsd.h +FILE 3887 f:\sp\public\sdk\inc\stralign.h +FILE 3888 f:\sp\public\sdk\inc\tvout.h +FILE 3889 f:\sp\public\sdk\inc\winsvc.h +FILE 3890 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3891 f:\sp\public\sdk\inc\wingdi.h +FILE 3892 f:\sp\public\sdk\inc\pshpack4.h +FILE 3893 f:\sp\public\sdk\inc\poppack.h +FILE 3894 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 3895 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3896 f:\sp\public\sdk\inc\winnetwk.h +FILE 3897 f:\sp\public\sdk\inc\imm.h +FILE 3898 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3899 f:\sp\public\sdk\inc\windef.h +FILE 3900 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 3901 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 3902 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3903 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3904 f:\sp\vctools\crt_bld\self_x86\crt\src\getenv.c +FILE 3905 f:\sp\public\sdk\inc\pshpack1.h +FILE 3906 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 3907 f:\sp\public\sdk\inc\winver.h +FILE 3908 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3909 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3910 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3911 f:\sp\public\sdk\inc\winnt.h +FILE 3912 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3913 f:\sp\public\sdk\inc\ddbanned.h +FILE 3914 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3915 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3916 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3917 f:\sp\public\sdk\inc\winreg.h +FILE 3918 f:\sp\public\sdk\inc\winbase.h +FILE 3919 f:\sp\public\sdk\inc\winerror.h +FILE 3920 f:\sp\public\sdk\inc\pshpack8.h +FILE 3921 f:\sp\public\sdk\inc\poppack.h +FILE 3922 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 3923 f:\sp\public\sdk\inc\winnetwk.h +FILE 3924 f:\sp\public\sdk\inc\imm.h +FILE 3925 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3926 f:\sp\public\sdk\inc\windef.h +FILE 3927 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3928 f:\sp\public\sdk\inc\pshpack1.h +FILE 3929 f:\sp\public\sdk\inc\winver.h +FILE 3930 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 3931 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3932 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3933 f:\sp\public\sdk\inc\winnt.h +FILE 3934 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3935 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 3936 f:\sp\public\sdk\inc\winreg.h +FILE 3937 f:\sp\vctools\crt_bld\self_x86\crt\src\errmode.c +FILE 3938 f:\sp\public\sdk\inc\winbase.h +FILE 3939 f:\sp\public\sdk\inc\winerror.h +FILE 3940 f:\sp\public\sdk\inc\pshpack8.h +FILE 3941 f:\sp\public\sdk\inc\reason.h +FILE 3942 f:\sp\public\sdk\inc\wincon.h +FILE 3943 f:\sp\public\sdk\inc\ddbanned.h +FILE 3944 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3945 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3946 f:\sp\public\sdk\inc\pshpack2.h +FILE 3947 f:\sp\public\sdk\inc\mcx.h +FILE 3948 f:\sp\public\sdk\inc\winuser.h +FILE 3949 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3950 f:\sp\public\sdk\inc\winnls.h +FILE 3951 f:\sp\public\sdk\inc\guiddef.h +FILE 3952 f:\sp\public\sdk\inc\windows.h +FILE 3953 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3954 f:\sp\public\sdk\inc\specstrings.h +FILE 3955 f:\sp\public\sdk\inc\basetsd.h +FILE 3956 f:\sp\public\sdk\inc\stralign.h +FILE 3957 f:\sp\public\sdk\inc\tvout.h +FILE 3958 f:\sp\public\sdk\inc\winsvc.h +FILE 3959 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 3960 f:\sp\public\sdk\inc\wingdi.h +FILE 3961 f:\sp\public\sdk\inc\pshpack4.h +FILE 3962 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 3963 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 3964 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3965 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3966 f:\sp\vctools\crt_bld\self_x86\crt\src\dbghook.c +FILE 3967 f:\sp\public\sdk\inc\ddbanned.h +FILE 3968 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3969 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 3970 f:\sp\public\sdk\inc\poppack.h +FILE 3971 f:\sp\public\sdk\inc\winnetwk.h +FILE 3972 f:\sp\public\sdk\inc\imm.h +FILE 3973 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 3974 f:\sp\public\sdk\inc\windef.h +FILE 3975 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 3976 f:\sp\public\sdk\inc\pshpack1.h +FILE 3977 f:\sp\public\sdk\inc\winver.h +FILE 3978 f:\sp\public\sdk\inc\windows.h +FILE 3979 f:\sp\public\sdk\inc\winnt.h +FILE 3980 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 3981 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 3982 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 3983 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 3984 f:\sp\public\sdk\inc\winreg.h +FILE 3985 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 3986 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.c +FILE 3987 f:\sp\public\sdk\inc\winbase.h +FILE 3988 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 3989 f:\sp\public\sdk\inc\winerror.h +FILE 3990 f:\sp\public\sdk\inc\pshpack8.h +FILE 3991 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 3992 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 3993 f:\sp\public\sdk\inc\reason.h +FILE 3994 f:\sp\public\sdk\inc\wincon.h +FILE 3995 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 3996 f:\sp\public\sdk\inc\ddbanned.h +FILE 3997 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 3998 f:\sp\public\sdk\inc\pshpack2.h +FILE 3999 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4000 f:\sp\public\sdk\inc\mcx.h +FILE 4001 f:\sp\public\sdk\inc\winuser.h +FILE 4002 f:\sp\public\sdk\inc\winnls.h +FILE 4003 f:\sp\public\sdk\inc\guiddef.h +FILE 4004 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4005 f:\sp\public\sdk\inc\specstrings.h +FILE 4006 f:\sp\public\sdk\inc\basetsd.h +FILE 4007 f:\sp\public\sdk\inc\stralign.h +FILE 4008 f:\sp\public\sdk\inc\tvout.h +FILE 4009 f:\sp\public\sdk\inc\winsvc.h +FILE 4010 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4011 f:\sp\public\sdk\inc\wingdi.h +FILE 4012 f:\sp\public\sdk\inc\pshpack4.h +FILE 4013 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4014 f:\sp\public\sdk\inc\mcx.h +FILE 4015 f:\sp\public\sdk\inc\winuser.h +FILE 4016 f:\sp\public\sdk\inc\winnls.h +FILE 4017 f:\sp\public\sdk\inc\stralign.h +FILE 4018 f:\sp\public\sdk\inc\tvout.h +FILE 4019 f:\sp\public\sdk\inc\winsvc.h +FILE 4020 f:\sp\public\sdk\inc\wingdi.h +FILE 4021 f:\sp\public\sdk\inc\pshpack4.h +FILE 4022 f:\sp\public\sdk\inc\winnt.h +FILE 4023 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4024 f:\sp\public\sdk\inc\poppack.h +FILE 4025 f:\sp\public\sdk\inc\winnetwk.h +FILE 4026 f:\sp\public\sdk\inc\imm.h +FILE 4027 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 4028 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 4029 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4030 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4031 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4032 f:\sp\public\sdk\inc\pshpack1.h +FILE 4033 f:\sp\vctools\crt_bld\self_x86\crt\src\crtmbox.c +FILE 4034 f:\sp\public\sdk\inc\winver.h +FILE 4035 f:\sp\public\sdk\inc\guiddef.h +FILE 4036 f:\sp\public\sdk\inc\windows.h +FILE 4037 f:\sp\public\sdk\inc\specstrings.h +FILE 4038 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4039 f:\sp\public\sdk\inc\basetsd.h +FILE 4040 f:\sp\public\sdk\inc\winreg.h +FILE 4041 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4042 f:\sp\public\sdk\inc\winbase.h +FILE 4043 f:\sp\public\sdk\inc\ddbanned.h +FILE 4044 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4045 f:\sp\public\sdk\inc\winerror.h +FILE 4046 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4047 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4048 f:\sp\public\sdk\inc\pshpack8.h +FILE 4049 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4050 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4051 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4052 f:\sp\public\sdk\inc\reason.h +FILE 4053 f:\sp\public\sdk\inc\wincon.h +FILE 4054 f:\sp\public\sdk\inc\pshpack2.h +FILE 4055 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4056 f:\sp\public\sdk\inc\windef.h +FILE 4057 f:\sp\public\sdk\inc\poppack.h +FILE 4058 f:\sp\vctools\crt_bld\self_x86\crt\src\fltintrn.h +FILE 4059 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4060 f:\sp\public\sdk\inc\winnetwk.h +FILE 4061 f:\sp\public\sdk\inc\imm.h +FILE 4062 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4063 f:\sp\public\sdk\inc\windef.h +FILE 4064 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4065 f:\sp\public\sdk\inc\pshpack1.h +FILE 4066 f:\sp\public\sdk\inc\winver.h +FILE 4067 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4068 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4069 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4070 f:\sp\public\sdk\inc\winnt.h +FILE 4071 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4072 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4073 f:\sp\public\sdk\inc\winreg.h +FILE 4074 f:\sp\vctools\crt_bld\self_x86\crt\src\cmiscdat.c +FILE 4075 f:\sp\public\sdk\inc\winbase.h +FILE 4076 f:\sp\public\sdk\inc\winerror.h +FILE 4077 f:\sp\public\sdk\inc\pshpack8.h +FILE 4078 f:\sp\public\sdk\inc\reason.h +FILE 4079 f:\sp\public\sdk\inc\wincon.h +FILE 4080 f:\sp\public\sdk\inc\ddbanned.h +FILE 4081 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4082 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4083 f:\sp\public\sdk\inc\pshpack2.h +FILE 4084 f:\sp\public\sdk\inc\mcx.h +FILE 4085 f:\sp\public\sdk\inc\winuser.h +FILE 4086 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4087 f:\sp\public\sdk\inc\winnls.h +FILE 4088 f:\sp\public\sdk\inc\guiddef.h +FILE 4089 f:\sp\public\sdk\inc\windows.h +FILE 4090 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4091 f:\sp\public\sdk\inc\specstrings.h +FILE 4092 f:\sp\public\sdk\inc\basetsd.h +FILE 4093 f:\sp\public\sdk\inc\stralign.h +FILE 4094 f:\sp\public\sdk\inc\tvout.h +FILE 4095 f:\sp\public\sdk\inc\winsvc.h +FILE 4096 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4097 f:\sp\public\sdk\inc\wingdi.h +FILE 4098 f:\sp\public\sdk\inc\pshpack4.h +FILE 4099 f:\sp\public\sdk\inc\pshpack4.h +FILE 4100 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 4101 f:\sp\vctools\crt_bld\self_x86\crt\src\signal.h +FILE 4102 f:\sp\public\sdk\inc\poppack.h +FILE 4103 f:\sp\public\sdk\inc\winnetwk.h +FILE 4104 f:\sp\public\sdk\inc\imm.h +FILE 4105 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4106 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4107 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4108 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4109 f:\sp\public\sdk\inc\windef.h +FILE 4110 f:\sp\public\sdk\inc\pshpack1.h +FILE 4111 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4112 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4113 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4114 f:\sp\public\sdk\inc\winver.h +FILE 4115 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4116 f:\sp\public\sdk\inc\winnt.h +FILE 4117 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4118 f:\sp\public\sdk\inc\winreg.h +FILE 4119 f:\sp\vctools\crt_bld\self_x86\crt\src\abort.c +FILE 4120 f:\sp\public\sdk\inc\winbase.h +FILE 4121 f:\sp\public\sdk\inc\winerror.h +FILE 4122 f:\sp\public\sdk\inc\pshpack8.h +FILE 4123 f:\sp\public\sdk\inc\reason.h +FILE 4124 f:\sp\public\sdk\inc\ddbanned.h +FILE 4125 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4126 f:\sp\public\sdk\inc\wincon.h +FILE 4127 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4128 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4129 f:\sp\public\sdk\inc\pshpack2.h +FILE 4130 f:\sp\public\sdk\inc\mcx.h +FILE 4131 f:\sp\public\sdk\inc\winuser.h +FILE 4132 f:\sp\public\sdk\inc\winnls.h +FILE 4133 f:\sp\public\sdk\inc\guiddef.h +FILE 4134 f:\sp\public\sdk\inc\stralign.h +FILE 4135 f:\sp\public\sdk\inc\specstrings.h +FILE 4136 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4137 f:\sp\public\sdk\inc\basetsd.h +FILE 4138 f:\sp\public\sdk\inc\windows.h +FILE 4139 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4140 f:\sp\public\sdk\inc\tvout.h +FILE 4141 f:\sp\public\sdk\inc\winsvc.h +FILE 4142 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4143 f:\sp\public\sdk\inc\wingdi.h +FILE 4144 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4145 f:\sp\public\sdk\inc\wincon.h +FILE 4146 f:\sp\public\sdk\inc\imm.h +FILE 4147 f:\sp\public\sdk\inc\winbase.h +FILE 4148 f:\sp\public\sdk\inc\wingdi.h +FILE 4149 f:\sp\public\sdk\inc\winver.h +FILE 4150 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4151 f:\sp\public\sdk\inc\windows.h +FILE 4152 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4153 f:\sp\public\sdk\inc\pshpack2.h +FILE 4154 f:\sp\public\sdk\inc\reason.h +FILE 4155 f:\sp\vctools\crt_bld\self_x86\crt\src\a_str.c +FILE 4156 f:\sp\public\sdk\inc\specstrings.h +FILE 4157 f:\sp\public\sdk\inc\basetsd.h +FILE 4158 f:\sp\public\sdk\inc\pshpack4.h +FILE 4159 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4160 f:\sp\public\sdk\inc\winnetwk.h +FILE 4161 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4162 f:\sp\public\sdk\inc\stralign.h +FILE 4163 f:\sp\public\sdk\inc\poppack.h +FILE 4164 f:\sp\public\sdk\inc\winsvc.h +FILE 4165 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4166 f:\sp\public\sdk\inc\windef.h +FILE 4167 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4168 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4169 f:\sp\public\sdk\inc\winuser.h +FILE 4170 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4171 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4172 f:\sp\public\sdk\inc\mcx.h +FILE 4173 f:\sp\public\sdk\inc\pshpack8.h +FILE 4174 f:\sp\public\sdk\inc\guiddef.h +FILE 4175 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4176 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4177 f:\sp\public\sdk\inc\winnt.h +FILE 4178 f:\sp\public\sdk\inc\winnls.h +FILE 4179 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4180 f:\sp\public\sdk\inc\pshpack1.h +FILE 4181 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4182 f:\sp\public\sdk\inc\winerror.h +FILE 4183 f:\sp\public\sdk\inc\winreg.h +FILE 4184 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4185 f:\sp\public\sdk\inc\ddbanned.h +FILE 4186 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4187 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4188 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4189 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4190 f:\sp\public\sdk\inc\tvout.h +FILE 4191 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4192 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4193 f:\sp\public\sdk\inc\wincon.h +FILE 4194 f:\sp\public\sdk\inc\imm.h +FILE 4195 f:\sp\public\sdk\inc\winbase.h +FILE 4196 f:\sp\public\sdk\inc\wingdi.h +FILE 4197 f:\sp\public\sdk\inc\winver.h +FILE 4198 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4199 f:\sp\public\sdk\inc\windows.h +FILE 4200 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4201 f:\sp\public\sdk\inc\pshpack2.h +FILE 4202 f:\sp\public\sdk\inc\reason.h +FILE 4203 f:\sp\vctools\crt_bld\self_x86\crt\src\a_map.c +FILE 4204 f:\sp\public\sdk\inc\specstrings.h +FILE 4205 f:\sp\public\sdk\inc\basetsd.h +FILE 4206 f:\sp\public\sdk\inc\pshpack4.h +FILE 4207 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4208 f:\sp\public\sdk\inc\winnetwk.h +FILE 4209 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4210 f:\sp\public\sdk\inc\stralign.h +FILE 4211 f:\sp\public\sdk\inc\poppack.h +FILE 4212 f:\sp\public\sdk\inc\winsvc.h +FILE 4213 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4214 f:\sp\public\sdk\inc\windef.h +FILE 4215 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4216 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4217 f:\sp\public\sdk\inc\winuser.h +FILE 4218 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4219 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4220 f:\sp\public\sdk\inc\mcx.h +FILE 4221 f:\sp\public\sdk\inc\pshpack8.h +FILE 4222 f:\sp\public\sdk\inc\guiddef.h +FILE 4223 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4224 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4225 f:\sp\public\sdk\inc\winnt.h +FILE 4226 f:\sp\public\sdk\inc\winnls.h +FILE 4227 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4228 f:\sp\public\sdk\inc\pshpack1.h +FILE 4229 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4230 f:\sp\public\sdk\inc\winerror.h +FILE 4231 f:\sp\public\sdk\inc\winreg.h +FILE 4232 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4233 f:\sp\public\sdk\inc\ddbanned.h +FILE 4234 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4235 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4236 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4237 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4238 f:\sp\public\sdk\inc\tvout.h +FILE 4239 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4240 f:\sp\public\sdk\inc\wincon.h +FILE 4241 f:\sp\public\sdk\inc\imm.h +FILE 4242 f:\sp\public\sdk\inc\winbase.h +FILE 4243 f:\sp\public\sdk\inc\wingdi.h +FILE 4244 f:\sp\public\sdk\inc\winver.h +FILE 4245 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4246 f:\sp\public\sdk\inc\windows.h +FILE 4247 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4248 f:\sp\public\sdk\inc\pshpack2.h +FILE 4249 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4250 f:\sp\public\sdk\inc\reason.h +FILE 4251 f:\sp\vctools\crt_bld\self_x86\crt\src\a_loc.c +FILE 4252 f:\sp\public\sdk\inc\specstrings.h +FILE 4253 f:\sp\public\sdk\inc\basetsd.h +FILE 4254 f:\sp\public\sdk\inc\pshpack4.h +FILE 4255 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4256 f:\sp\public\sdk\inc\winnetwk.h +FILE 4257 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4258 f:\sp\public\sdk\inc\stralign.h +FILE 4259 f:\sp\public\sdk\inc\poppack.h +FILE 4260 f:\sp\public\sdk\inc\winsvc.h +FILE 4261 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4262 f:\sp\public\sdk\inc\windef.h +FILE 4263 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4264 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4265 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4266 f:\sp\public\sdk\inc\winuser.h +FILE 4267 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4268 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4269 f:\sp\public\sdk\inc\mcx.h +FILE 4270 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4271 f:\sp\public\sdk\inc\pshpack8.h +FILE 4272 f:\sp\public\sdk\inc\guiddef.h +FILE 4273 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4274 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4275 f:\sp\public\sdk\inc\winnt.h +FILE 4276 f:\sp\public\sdk\inc\winnls.h +FILE 4277 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4278 f:\sp\public\sdk\inc\pshpack1.h +FILE 4279 f:\sp\public\sdk\inc\winerror.h +FILE 4280 f:\sp\public\sdk\inc\winreg.h +FILE 4281 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4282 f:\sp\public\sdk\inc\ddbanned.h +FILE 4283 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4284 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4285 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4286 f:\sp\public\sdk\inc\tvout.h +FILE 4287 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4288 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4289 f:\sp\public\sdk\inc\poppack.h +FILE 4290 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4291 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4292 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4293 f:\sp\public\sdk\inc\winnetwk.h +FILE 4294 f:\sp\public\sdk\inc\imm.h +FILE 4295 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4296 f:\sp\public\sdk\inc\windef.h +FILE 4297 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4298 f:\sp\public\sdk\inc\pshpack1.h +FILE 4299 f:\sp\public\sdk\inc\winver.h +FILE 4300 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4301 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4302 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4303 f:\sp\public\sdk\inc\winnt.h +FILE 4304 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4305 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4306 f:\sp\public\sdk\inc\winreg.h +FILE 4307 f:\sp\vctools\crt_bld\self_x86\crt\src\a_env.c +FILE 4308 f:\sp\public\sdk\inc\winbase.h +FILE 4309 f:\sp\public\sdk\inc\winerror.h +FILE 4310 f:\sp\public\sdk\inc\pshpack8.h +FILE 4311 f:\sp\public\sdk\inc\reason.h +FILE 4312 f:\sp\public\sdk\inc\wincon.h +FILE 4313 f:\sp\public\sdk\inc\ddbanned.h +FILE 4314 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4315 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4316 f:\sp\public\sdk\inc\pshpack2.h +FILE 4317 f:\sp\public\sdk\inc\mcx.h +FILE 4318 f:\sp\public\sdk\inc\winuser.h +FILE 4319 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4320 f:\sp\public\sdk\inc\winnls.h +FILE 4321 f:\sp\public\sdk\inc\guiddef.h +FILE 4322 f:\sp\public\sdk\inc\windows.h +FILE 4323 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4324 f:\sp\public\sdk\inc\specstrings.h +FILE 4325 f:\sp\public\sdk\inc\basetsd.h +FILE 4326 f:\sp\public\sdk\inc\stralign.h +FILE 4327 f:\sp\public\sdk\inc\tvout.h +FILE 4328 f:\sp\public\sdk\inc\winsvc.h +FILE 4329 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4330 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4331 f:\sp\public\sdk\inc\wingdi.h +FILE 4332 f:\sp\public\sdk\inc\pshpack4.h +FILE 4333 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4334 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4335 f:\sp\public\sdk\inc\wincon.h +FILE 4336 f:\sp\public\sdk\inc\imm.h +FILE 4337 f:\sp\public\sdk\inc\winbase.h +FILE 4338 f:\sp\public\sdk\inc\wingdi.h +FILE 4339 f:\sp\public\sdk\inc\winver.h +FILE 4340 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4341 f:\sp\public\sdk\inc\windows.h +FILE 4342 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4343 f:\sp\public\sdk\inc\pshpack2.h +FILE 4344 f:\sp\public\sdk\inc\reason.h +FILE 4345 f:\sp\vctools\crt_bld\self_x86\crt\src\a_cmp.c +FILE 4346 f:\sp\public\sdk\inc\specstrings.h +FILE 4347 f:\sp\public\sdk\inc\basetsd.h +FILE 4348 f:\sp\public\sdk\inc\pshpack4.h +FILE 4349 f:\sp\public\sdk\inc\winnetwk.h +FILE 4350 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4351 f:\sp\public\sdk\inc\stralign.h +FILE 4352 f:\sp\public\sdk\inc\poppack.h +FILE 4353 f:\sp\public\sdk\inc\winsvc.h +FILE 4354 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4355 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4356 f:\sp\public\sdk\inc\windef.h +FILE 4357 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4358 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4359 f:\sp\public\sdk\inc\winuser.h +FILE 4360 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4361 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4362 f:\sp\public\sdk\inc\mcx.h +FILE 4363 f:\sp\public\sdk\inc\pshpack8.h +FILE 4364 f:\sp\public\sdk\inc\guiddef.h +FILE 4365 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4366 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4367 f:\sp\public\sdk\inc\winnt.h +FILE 4368 f:\sp\public\sdk\inc\winnls.h +FILE 4369 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4370 f:\sp\public\sdk\inc\pshpack1.h +FILE 4371 f:\sp\public\sdk\inc\winerror.h +FILE 4372 f:\sp\public\sdk\inc\winreg.h +FILE 4373 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4374 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4375 f:\sp\public\sdk\inc\ddbanned.h +FILE 4376 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4377 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4378 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4379 f:\sp\public\sdk\inc\tvout.h +FILE 4380 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4381 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\sehprolg4.asm +FILE 4382 f:\sp\public\sdk\inc\poppack.h +FILE 4383 f:\sp\public\sdk\inc\winnetwk.h +FILE 4384 f:\sp\public\sdk\inc\imm.h +FILE 4385 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4386 f:\sp\public\sdk\inc\windef.h +FILE 4387 f:\sp\public\sdk\inc\pshpack1.h +FILE 4388 f:\sp\public\sdk\inc\winver.h +FILE 4389 f:\sp\public\sdk\inc\windows.h +FILE 4390 f:\sp\public\sdk\inc\winnt.h +FILE 4391 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4392 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4393 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4394 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4395 f:\sp\public\sdk\inc\winreg.h +FILE 4396 f:\sp\public\sdk\inc\winbase.h +FILE 4397 f:\sp\vctools\crt_bld\self_x86\crt\src\intel\secchk.c +FILE 4398 f:\sp\public\sdk\inc\winerror.h +FILE 4399 f:\sp\public\sdk\inc\pshpack8.h +FILE 4400 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 4401 f:\sp\public\sdk\inc\reason.h +FILE 4402 f:\sp\public\sdk\inc\wincon.h +FILE 4403 f:\sp\public\sdk\inc\ddbanned.h +FILE 4404 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4405 f:\sp\public\sdk\inc\pshpack2.h +FILE 4406 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4407 f:\sp\public\sdk\inc\mcx.h +FILE 4408 f:\sp\public\sdk\inc\winuser.h +FILE 4409 f:\sp\public\sdk\inc\winnls.h +FILE 4410 f:\sp\public\sdk\inc\guiddef.h +FILE 4411 f:\sp\public\sdk\inc\specstrings.h +FILE 4412 f:\sp\public\sdk\inc\basetsd.h +FILE 4413 f:\sp\public\sdk\inc\stralign.h +FILE 4414 f:\sp\public\sdk\inc\tvout.h +FILE 4415 f:\sp\public\sdk\inc\winsvc.h +FILE 4416 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4417 f:\sp\public\sdk\inc\wingdi.h +FILE 4418 f:\sp\public\sdk\inc\pshpack4.h +FILE 4419 f:\sp\public\sdk\inc\poppack.h +FILE 4420 f:\sp\public\sdk\inc\winnetwk.h +FILE 4421 f:\sp\public\sdk\inc\imm.h +FILE 4422 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4423 f:\sp\public\sdk\inc\windef.h +FILE 4424 f:\sp\public\sdk\inc\pshpack1.h +FILE 4425 f:\sp\public\sdk\inc\winver.h +FILE 4426 f:\sp\public\sdk\inc\windows.h +FILE 4427 f:\sp\public\sdk\inc\winnt.h +FILE 4428 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4429 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4430 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4431 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4432 f:\sp\public\sdk\inc\winreg.h +FILE 4433 f:\sp\public\sdk\inc\winbase.h +FILE 4434 f:\sp\vctools\crt_bld\self_x86\crt\src\intel\loadcfg.c +FILE 4435 f:\sp\public\sdk\inc\winerror.h +FILE 4436 f:\sp\public\sdk\inc\pshpack8.h +FILE 4437 f:\sp\public\sdk\inc\reason.h +FILE 4438 f:\sp\public\sdk\inc\wincon.h +FILE 4439 f:\sp\public\sdk\inc\ddbanned.h +FILE 4440 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4441 f:\sp\public\sdk\inc\pshpack2.h +FILE 4442 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4443 f:\sp\public\sdk\inc\mcx.h +FILE 4444 f:\sp\public\sdk\inc\winuser.h +FILE 4445 f:\sp\public\sdk\inc\winnls.h +FILE 4446 f:\sp\public\sdk\inc\guiddef.h +FILE 4447 f:\sp\public\sdk\inc\specstrings.h +FILE 4448 f:\sp\public\sdk\inc\basetsd.h +FILE 4449 f:\sp\public\sdk\inc\stralign.h +FILE 4450 f:\sp\public\sdk\inc\tvout.h +FILE 4451 f:\sp\public\sdk\inc\winsvc.h +FILE 4452 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4453 f:\sp\public\sdk\inc\wingdi.h +FILE 4454 f:\sp\public\sdk\inc\pshpack4.h +FILE 4455 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\exsup4.asm +FILE 4456 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\exsup.inc +FILE 4457 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\exsup.asm +FILE 4458 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\pversion.inc +FILE 4459 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\cmacros.inc +FILE 4460 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\exsup.inc +FILE 4461 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\misc\i386\nlgsupp.asm +FILE 4462 f:\sp\public\sdk\inc\ntldr.h +FILE 4463 f:\sp\public\sdk\inc\ntpoapi.h +FILE 4464 f:\sp\public\sdk\inc\ntexapi.h +FILE 4465 f:\sp\public\sdk\inc\pshpack1.h +FILE 4466 f:\sp\public\sdk\inc\pshpack8.h +FILE 4467 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 4468 f:\sp\public\sdk\inc\ntdef.h +FILE 4469 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 4470 f:\sp\public\sdk\inc\mce.h +FILE 4471 f:\sp\public\sdk\inc\poppack.h +FILE 4472 f:\sp\public\sdk\inc\ntimage.h +FILE 4473 f:\sp\public\sdk\inc\pshpack2.h +FILE 4474 f:\sp\public\sdk\inc\ntpsapi.h +FILE 4475 f:\sp\public\sdk\inc\nti386.h +FILE 4476 f:\sp\public\sdk\inc\nt.h +FILE 4477 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 4478 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 4479 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 4480 f:\sp\public\sdk\inc\specstrings.h +FILE 4481 f:\sp\public\sdk\inc\basetsd.h +FILE 4482 f:\sp\public\sdk\inc\ntxcapi.h +FILE 4483 f:\sp\public\sdk\inc\guiddef.h +FILE 4484 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\misc\i386\chandler4.c +FILE 4485 f:\sp\public\sdk\inc\ntstatus.h +FILE 4486 f:\sp\public\sdk\inc\ntkeapi.h +FILE 4487 f:\sp\public\sdk\inc\ntconfig.h +FILE 4488 f:\sp\public\sdk\inc\ntregapi.h +FILE 4489 f:\sp\public\sdk\inc\ntmmapi.h +FILE 4490 f:\sp\public\sdk\inc\ntobapi.h +FILE 4491 f:\sp\public\sdk\inc\nxi386.h +FILE 4492 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\process.h +FILE 4493 f:\sp\public\sdk\inc\ntioapi.h +FILE 4494 f:\sp\public\sdk\inc\devioctl.h +FILE 4495 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 4496 f:\sp\public\sdk\inc\ntseapi.h +FILE 4497 f:\sp\public\sdk\inc\ddbanned.h +FILE 4498 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 4499 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 4500 f:\sp\public\sdk\inc\ntnls.h +FILE 4501 f:\sp\public\sdk\inc\ntelfapi.h +FILE 4502 f:\sp\public\sdk\inc\pshpack4.h +FILE 4503 f:\sp\public\sdk\inc\ntiolog.h +FILE 4504 f:\sp\public\sdk\inc\ntlpcapi.h +FILE 4505 f:\sp\public\sdk\inc\ntpnpapi.h +FILE 4506 f:\sp\public\sdk\inc\cfg.h +FILE 4507 f:\sp\public\sdk\inc\pebteb.h +FILE 4508 f:\sp\public\sdk\inc\wincon.h +FILE 4509 f:\sp\public\sdk\inc\imm.h +FILE 4510 f:\sp\public\sdk\inc\winbase.h +FILE 4511 f:\sp\public\sdk\inc\wingdi.h +FILE 4512 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4513 f:\sp\public\sdk\inc\winver.h +FILE 4514 f:\sp\public\sdk\inc\pshpack2.h +FILE 4515 f:\sp\public\sdk\inc\reason.h +FILE 4516 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 4517 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4518 f:\sp\vctools\crt_bld\self_x86\crt\src\mbsnbico.c +FILE 4519 f:\sp\public\sdk\inc\specstrings.h +FILE 4520 f:\sp\public\sdk\inc\basetsd.h +FILE 4521 f:\sp\public\sdk\inc\pshpack4.h +FILE 4522 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4523 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 4524 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4525 f:\sp\public\sdk\inc\winnetwk.h +FILE 4526 f:\sp\public\sdk\inc\stralign.h +FILE 4527 f:\sp\public\sdk\inc\poppack.h +FILE 4528 f:\sp\public\sdk\inc\winsvc.h +FILE 4529 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4530 f:\sp\public\sdk\inc\windef.h +FILE 4531 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4532 f:\sp\public\sdk\inc\winuser.h +FILE 4533 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4534 f:\sp\public\sdk\inc\windows.h +FILE 4535 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4536 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4537 f:\sp\public\sdk\inc\mcx.h +FILE 4538 f:\sp\public\sdk\inc\pshpack8.h +FILE 4539 f:\sp\public\sdk\inc\guiddef.h +FILE 4540 f:\sp\public\sdk\inc\winnt.h +FILE 4541 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4542 f:\sp\public\sdk\inc\winnls.h +FILE 4543 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4544 f:\sp\public\sdk\inc\pshpack1.h +FILE 4545 f:\sp\public\sdk\inc\winerror.h +FILE 4546 f:\sp\public\sdk\inc\winreg.h +FILE 4547 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4548 f:\sp\public\sdk\inc\ddbanned.h +FILE 4549 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4550 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4551 f:\sp\public\sdk\inc\tvout.h +FILE 4552 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4553 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4554 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4555 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 4556 f:\sp\public\sdk\inc\wincon.h +FILE 4557 f:\sp\public\sdk\inc\imm.h +FILE 4558 f:\sp\public\sdk\inc\winbase.h +FILE 4559 f:\sp\public\sdk\inc\wingdi.h +FILE 4560 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 4561 f:\sp\public\sdk\inc\winver.h +FILE 4562 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4563 f:\sp\public\sdk\inc\windows.h +FILE 4564 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4565 f:\sp\public\sdk\inc\pshpack2.h +FILE 4566 f:\sp\public\sdk\inc\reason.h +FILE 4567 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4568 f:\sp\vctools\crt_bld\self_x86\crt\src\mbschr.c +FILE 4569 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4570 f:\sp\public\sdk\inc\specstrings.h +FILE 4571 f:\sp\public\sdk\inc\basetsd.h +FILE 4572 f:\sp\public\sdk\inc\pshpack4.h +FILE 4573 f:\sp\public\sdk\inc\winnetwk.h +FILE 4574 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4575 f:\sp\public\sdk\inc\stralign.h +FILE 4576 f:\sp\public\sdk\inc\poppack.h +FILE 4577 f:\sp\public\sdk\inc\winsvc.h +FILE 4578 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4579 f:\sp\public\sdk\inc\windef.h +FILE 4580 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4581 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4582 f:\sp\public\sdk\inc\winuser.h +FILE 4583 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4584 f:\sp\public\sdk\inc\mcx.h +FILE 4585 f:\sp\public\sdk\inc\pshpack8.h +FILE 4586 f:\sp\public\sdk\inc\guiddef.h +FILE 4587 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 4588 f:\sp\public\sdk\inc\winnt.h +FILE 4589 f:\sp\public\sdk\inc\winnls.h +FILE 4590 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4591 f:\sp\public\sdk\inc\pshpack1.h +FILE 4592 f:\sp\public\sdk\inc\winerror.h +FILE 4593 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 4594 f:\sp\public\sdk\inc\winreg.h +FILE 4595 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4596 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4597 f:\sp\public\sdk\inc\ddbanned.h +FILE 4598 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4599 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4600 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4601 f:\sp\public\sdk\inc\tvout.h +FILE 4602 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4603 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 4604 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4605 f:\sp\public\sdk\inc\wincon.h +FILE 4606 f:\sp\public\sdk\inc\imm.h +FILE 4607 f:\sp\public\sdk\inc\winbase.h +FILE 4608 f:\sp\public\sdk\inc\wingdi.h +FILE 4609 f:\sp\public\sdk\inc\winver.h +FILE 4610 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4611 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4612 f:\sp\public\sdk\inc\pshpack2.h +FILE 4613 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 4614 f:\sp\public\sdk\inc\reason.h +FILE 4615 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.c +FILE 4616 f:\sp\public\sdk\inc\specstrings.h +FILE 4617 f:\sp\public\sdk\inc\basetsd.h +FILE 4618 f:\sp\public\sdk\inc\pshpack4.h +FILE 4619 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4620 f:\sp\public\sdk\inc\winnetwk.h +FILE 4621 f:\sp\public\sdk\inc\stralign.h +FILE 4622 f:\sp\public\sdk\inc\poppack.h +FILE 4623 f:\sp\public\sdk\inc\winsvc.h +FILE 4624 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4625 f:\sp\public\sdk\inc\windef.h +FILE 4626 f:\sp\public\sdk\inc\winuser.h +FILE 4627 f:\sp\public\sdk\inc\windows.h +FILE 4628 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4629 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4630 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4631 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4632 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4633 f:\sp\public\sdk\inc\mcx.h +FILE 4634 f:\sp\public\sdk\inc\pshpack8.h +FILE 4635 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4636 f:\sp\public\sdk\inc\guiddef.h +FILE 4637 f:\sp\public\sdk\inc\winnt.h +FILE 4638 f:\sp\public\sdk\inc\winnls.h +FILE 4639 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4640 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 4641 f:\sp\public\sdk\inc\pshpack1.h +FILE 4642 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 4643 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4644 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4645 f:\sp\public\sdk\inc\winerror.h +FILE 4646 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 4647 f:\sp\public\sdk\inc\winreg.h +FILE 4648 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4649 f:\sp\public\sdk\inc\ddbanned.h +FILE 4650 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 4651 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4652 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 4653 f:\sp\public\sdk\inc\tvout.h +FILE 4654 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4655 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4656 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4657 f:\sp\public\sdk\inc\wincon.h +FILE 4658 f:\sp\public\sdk\inc\imm.h +FILE 4659 f:\sp\public\sdk\inc\winbase.h +FILE 4660 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4661 f:\sp\public\sdk\inc\wingdi.h +FILE 4662 f:\sp\public\sdk\inc\windef.h +FILE 4663 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 4664 f:\sp\public\sdk\inc\winver.h +FILE 4665 f:\sp\public\sdk\inc\pshpack2.h +FILE 4666 f:\sp\public\sdk\inc\reason.h +FILE 4667 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4668 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4669 f:\sp\vctools\crt_bld\self_x86\crt\src\ismbbyte.c +FILE 4670 f:\sp\public\sdk\inc\winnt.h +FILE 4671 f:\sp\public\sdk\inc\specstrings.h +FILE 4672 f:\sp\public\sdk\inc\basetsd.h +FILE 4673 f:\sp\public\sdk\inc\pshpack4.h +FILE 4674 f:\sp\public\sdk\inc\winnetwk.h +FILE 4675 f:\sp\public\sdk\inc\stralign.h +FILE 4676 f:\sp\public\sdk\inc\poppack.h +FILE 4677 f:\sp\public\sdk\inc\winsvc.h +FILE 4678 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4679 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4680 f:\sp\public\sdk\inc\winuser.h +FILE 4681 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4682 f:\sp\public\sdk\inc\mcx.h +FILE 4683 f:\sp\public\sdk\inc\pshpack8.h +FILE 4684 f:\sp\public\sdk\inc\guiddef.h +FILE 4685 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4686 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 4687 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4688 f:\sp\public\sdk\inc\windows.h +FILE 4689 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4690 f:\sp\public\sdk\inc\winnls.h +FILE 4691 f:\sp\public\sdk\inc\pshpack1.h +FILE 4692 f:\sp\public\sdk\inc\winerror.h +FILE 4693 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4694 f:\sp\public\sdk\inc\winreg.h +FILE 4695 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4696 f:\sp\public\sdk\inc\ddbanned.h +FILE 4697 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4698 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4699 f:\sp\public\sdk\inc\tvout.h +FILE 4700 f:\sp\vctools\crt_bld\self_x86\crt\src\mbdata.h +FILE 4701 f:\sp\public\sdk\inc\winnetwk.h +FILE 4702 f:\sp\public\sdk\inc\imm.h +FILE 4703 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 4704 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4705 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 4706 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4707 f:\sp\public\sdk\inc\windef.h +FILE 4708 f:\sp\public\sdk\inc\pshpack1.h +FILE 4709 f:\sp\public\sdk\inc\winver.h +FILE 4710 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4711 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4712 f:\sp\public\sdk\inc\winnt.h +FILE 4713 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4714 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4715 f:\sp\public\sdk\inc\winreg.h +FILE 4716 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4717 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4718 f:\sp\public\sdk\inc\winbase.h +FILE 4719 f:\sp\public\sdk\inc\winerror.h +FILE 4720 f:\sp\public\sdk\inc\pshpack8.h +FILE 4721 f:\sp\vctools\crt_bld\self_x86\crt\src\putwch.c +FILE 4722 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4723 f:\sp\public\sdk\inc\reason.h +FILE 4724 f:\sp\public\sdk\inc\wincon.h +FILE 4725 f:\sp\public\sdk\inc\pshpack2.h +FILE 4726 f:\sp\public\sdk\inc\mcx.h +FILE 4727 f:\sp\public\sdk\inc\winuser.h +FILE 4728 f:\sp\public\sdk\inc\winnls.h +FILE 4729 f:\sp\public\sdk\inc\guiddef.h +FILE 4730 f:\sp\public\sdk\inc\stralign.h +FILE 4731 f:\sp\public\sdk\inc\ddbanned.h +FILE 4732 f:\sp\public\sdk\inc\specstrings.h +FILE 4733 f:\sp\vctools\crt_bld\self_x86\crt\src\file2.h +FILE 4734 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4735 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4736 f:\sp\public\sdk\inc\basetsd.h +FILE 4737 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4738 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4739 f:\sp\public\sdk\inc\windows.h +FILE 4740 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4741 f:\sp\public\sdk\inc\tvout.h +FILE 4742 f:\sp\public\sdk\inc\winsvc.h +FILE 4743 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4744 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4745 f:\sp\public\sdk\inc\wingdi.h +FILE 4746 f:\sp\public\sdk\inc\pshpack4.h +FILE 4747 f:\sp\vctools\crt_bld\self_x86\crt\src\conio.h +FILE 4748 f:\sp\public\sdk\inc\poppack.h +FILE 4749 f:\sp\public\sdk\inc\reason.h +FILE 4750 f:\sp\public\sdk\inc\wincon.h +FILE 4751 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 4752 f:\sp\public\sdk\inc\poppack.h +FILE 4753 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4754 f:\sp\public\sdk\inc\mcx.h +FILE 4755 f:\sp\public\sdk\inc\winuser.h +FILE 4756 f:\sp\public\sdk\inc\winnls.h +FILE 4757 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 4758 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4759 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4760 f:\sp\public\sdk\inc\stralign.h +FILE 4761 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4762 f:\sp\public\sdk\inc\windef.h +FILE 4763 f:\sp\public\sdk\inc\tvout.h +FILE 4764 f:\sp\public\sdk\inc\winsvc.h +FILE 4765 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 4766 f:\sp\public\sdk\inc\wingdi.h +FILE 4767 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 4768 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4769 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4770 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4771 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4772 f:\sp\public\sdk\inc\winnt.h +FILE 4773 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4774 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4775 f:\sp\public\sdk\inc\winnetwk.h +FILE 4776 f:\sp\public\sdk\inc\imm.h +FILE 4777 f:\sp\vctools\crt_bld\self_x86\crt\src\write.c +FILE 4778 f:\sp\public\sdk\inc\winbase.h +FILE 4779 f:\sp\public\sdk\inc\winerror.h +FILE 4780 f:\sp\public\sdk\inc\pshpack1.h +FILE 4781 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 4782 f:\sp\public\sdk\inc\pshpack8.h +FILE 4783 f:\sp\public\sdk\inc\winver.h +FILE 4784 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 4785 f:\sp\public\sdk\inc\ddbanned.h +FILE 4786 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4787 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4788 f:\sp\public\sdk\inc\pshpack2.h +FILE 4789 f:\sp\public\sdk\inc\winreg.h +FILE 4790 f:\sp\public\sdk\inc\guiddef.h +FILE 4791 f:\sp\public\sdk\inc\windows.h +FILE 4792 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4793 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4794 f:\sp\public\sdk\inc\specstrings.h +FILE 4795 f:\sp\public\sdk\inc\basetsd.h +FILE 4796 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4797 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4798 f:\sp\public\sdk\inc\pshpack4.h +FILE 4799 f:\sp\public\sdk\inc\reason.h +FILE 4800 f:\sp\public\sdk\inc\wincon.h +FILE 4801 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4802 f:\sp\public\sdk\inc\poppack.h +FILE 4803 f:\sp\public\sdk\inc\mcx.h +FILE 4804 f:\sp\public\sdk\inc\winuser.h +FILE 4805 f:\sp\public\sdk\inc\winnls.h +FILE 4806 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4807 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4808 f:\sp\public\sdk\inc\stralign.h +FILE 4809 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4810 f:\sp\public\sdk\inc\windef.h +FILE 4811 f:\sp\public\sdk\inc\tvout.h +FILE 4812 f:\sp\public\sdk\inc\winsvc.h +FILE 4813 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4814 f:\sp\public\sdk\inc\wingdi.h +FILE 4815 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4816 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4817 f:\sp\public\sdk\inc\winnt.h +FILE 4818 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4819 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4820 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 4821 f:\sp\public\sdk\inc\winnetwk.h +FILE 4822 f:\sp\public\sdk\inc\imm.h +FILE 4823 f:\sp\vctools\crt_bld\self_x86\crt\src\fcntl.h +FILE 4824 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4825 f:\sp\vctools\crt_bld\self_x86\crt\src\osfinfo.c +FILE 4826 f:\sp\public\sdk\inc\winbase.h +FILE 4827 f:\sp\public\sdk\inc\winerror.h +FILE 4828 f:\sp\public\sdk\inc\pshpack1.h +FILE 4829 f:\sp\public\sdk\inc\pshpack8.h +FILE 4830 f:\sp\public\sdk\inc\winver.h +FILE 4831 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4832 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 4833 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4834 f:\sp\public\sdk\inc\ddbanned.h +FILE 4835 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4836 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4837 f:\sp\public\sdk\inc\pshpack2.h +FILE 4838 f:\sp\public\sdk\inc\winreg.h +FILE 4839 f:\sp\public\sdk\inc\guiddef.h +FILE 4840 f:\sp\public\sdk\inc\windows.h +FILE 4841 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4842 f:\sp\public\sdk\inc\specstrings.h +FILE 4843 f:\sp\public\sdk\inc\basetsd.h +FILE 4844 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4845 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4846 f:\sp\public\sdk\inc\pshpack4.h +FILE 4847 f:\sp\public\sdk\inc\reason.h +FILE 4848 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4849 f:\sp\public\sdk\inc\wincon.h +FILE 4850 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 4851 f:\sp\public\sdk\inc\poppack.h +FILE 4852 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4853 f:\sp\public\sdk\inc\mcx.h +FILE 4854 f:\sp\public\sdk\inc\winuser.h +FILE 4855 f:\sp\public\sdk\inc\winnls.h +FILE 4856 f:\sp\public\sdk\inc\stralign.h +FILE 4857 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4858 f:\sp\public\sdk\inc\windef.h +FILE 4859 f:\sp\public\sdk\inc\tvout.h +FILE 4860 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 4861 f:\sp\public\sdk\inc\winsvc.h +FILE 4862 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4863 f:\sp\public\sdk\inc\wingdi.h +FILE 4864 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 4865 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 4866 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4867 f:\sp\public\sdk\inc\winnt.h +FILE 4868 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4869 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4870 f:\sp\public\sdk\inc\winnetwk.h +FILE 4871 f:\sp\public\sdk\inc\imm.h +FILE 4872 f:\sp\vctools\crt_bld\self_x86\crt\src\lseeki64.c +FILE 4873 f:\sp\public\sdk\inc\winbase.h +FILE 4874 f:\sp\public\sdk\inc\winerror.h +FILE 4875 f:\sp\public\sdk\inc\pshpack1.h +FILE 4876 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 4877 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 4878 f:\sp\public\sdk\inc\pshpack8.h +FILE 4879 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4880 f:\sp\public\sdk\inc\winver.h +FILE 4881 f:\sp\public\sdk\inc\ddbanned.h +FILE 4882 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4883 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4884 f:\sp\public\sdk\inc\pshpack2.h +FILE 4885 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4886 f:\sp\public\sdk\inc\winreg.h +FILE 4887 f:\sp\public\sdk\inc\guiddef.h +FILE 4888 f:\sp\public\sdk\inc\windows.h +FILE 4889 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4890 f:\sp\public\sdk\inc\specstrings.h +FILE 4891 f:\sp\public\sdk\inc\basetsd.h +FILE 4892 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4893 f:\sp\public\sdk\inc\pshpack4.h +FILE 4894 f:\sp\public\sdk\inc\pshpack4.h +FILE 4895 f:\sp\public\sdk\inc\poppack.h +FILE 4896 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 4897 f:\sp\public\sdk\inc\winnetwk.h +FILE 4898 f:\sp\public\sdk\inc\imm.h +FILE 4899 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4900 f:\sp\public\sdk\inc\windef.h +FILE 4901 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4902 f:\sp\public\sdk\inc\pshpack1.h +FILE 4903 f:\sp\public\sdk\inc\winver.h +FILE 4904 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 4905 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4906 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4907 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4908 f:\sp\public\sdk\inc\winnt.h +FILE 4909 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4910 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4911 f:\sp\public\sdk\inc\winreg.h +FILE 4912 f:\sp\vctools\crt_bld\self_x86\crt\src\isatty.c +FILE 4913 f:\sp\public\sdk\inc\winbase.h +FILE 4914 f:\sp\public\sdk\inc\winerror.h +FILE 4915 f:\sp\public\sdk\inc\pshpack8.h +FILE 4916 f:\sp\public\sdk\inc\reason.h +FILE 4917 f:\sp\public\sdk\inc\wincon.h +FILE 4918 f:\sp\public\sdk\inc\ddbanned.h +FILE 4919 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4920 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4921 f:\sp\public\sdk\inc\pshpack2.h +FILE 4922 f:\sp\public\sdk\inc\mcx.h +FILE 4923 f:\sp\public\sdk\inc\winuser.h +FILE 4924 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4925 f:\sp\public\sdk\inc\winnls.h +FILE 4926 f:\sp\public\sdk\inc\guiddef.h +FILE 4927 f:\sp\public\sdk\inc\windows.h +FILE 4928 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4929 f:\sp\public\sdk\inc\specstrings.h +FILE 4930 f:\sp\public\sdk\inc\basetsd.h +FILE 4931 f:\sp\public\sdk\inc\stralign.h +FILE 4932 f:\sp\public\sdk\inc\tvout.h +FILE 4933 f:\sp\public\sdk\inc\winsvc.h +FILE 4934 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4935 f:\sp\public\sdk\inc\wingdi.h +FILE 4936 f:\sp\public\sdk\inc\poppack.h +FILE 4937 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 4938 f:\sp\public\sdk\inc\winnetwk.h +FILE 4939 f:\sp\public\sdk\inc\imm.h +FILE 4940 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 4941 f:\sp\public\sdk\inc\windef.h +FILE 4942 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 4943 f:\sp\public\sdk\inc\pshpack1.h +FILE 4944 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 4945 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 4946 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 4947 f:\sp\public\sdk\inc\winver.h +FILE 4948 f:\sp\public\sdk\inc\windows.h +FILE 4949 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 4950 f:\sp\public\sdk\inc\winnt.h +FILE 4951 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4952 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 4953 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 4954 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 4955 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 4956 f:\sp\public\sdk\inc\winreg.h +FILE 4957 f:\sp\public\sdk\inc\winbase.h +FILE 4958 f:\sp\vctools\crt_bld\self_x86\crt\src\ioinit.c +FILE 4959 f:\sp\public\sdk\inc\winerror.h +FILE 4960 f:\sp\public\sdk\inc\pshpack8.h +FILE 4961 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 4962 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4963 f:\sp\public\sdk\inc\reason.h +FILE 4964 f:\sp\public\sdk\inc\wincon.h +FILE 4965 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 4966 f:\sp\public\sdk\inc\ddbanned.h +FILE 4967 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 4968 f:\sp\public\sdk\inc\pshpack2.h +FILE 4969 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 4970 f:\sp\public\sdk\inc\mcx.h +FILE 4971 f:\sp\public\sdk\inc\winuser.h +FILE 4972 f:\sp\public\sdk\inc\winnls.h +FILE 4973 f:\sp\public\sdk\inc\guiddef.h +FILE 4974 f:\sp\public\sdk\inc\specstrings.h +FILE 4975 f:\sp\public\sdk\inc\basetsd.h +FILE 4976 f:\sp\public\sdk\inc\stralign.h +FILE 4977 f:\sp\public\sdk\inc\tvout.h +FILE 4978 f:\sp\public\sdk\inc\winsvc.h +FILE 4979 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4980 f:\sp\public\sdk\inc\wingdi.h +FILE 4981 f:\sp\public\sdk\inc\pshpack4.h +FILE 4982 f:\sp\public\sdk\inc\reason.h +FILE 4983 f:\sp\public\sdk\inc\wincon.h +FILE 4984 f:\sp\public\sdk\inc\pshpack2.h +FILE 4985 f:\sp\public\sdk\inc\mcx.h +FILE 4986 f:\sp\public\sdk\inc\winuser.h +FILE 4987 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 4988 f:\sp\public\sdk\inc\winnls.h +FILE 4989 f:\sp\public\sdk\inc\guiddef.h +FILE 4990 f:\sp\public\sdk\inc\windows.h +FILE 4991 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 4992 f:\sp\public\sdk\inc\specstrings.h +FILE 4993 f:\sp\public\sdk\inc\basetsd.h +FILE 4994 f:\sp\public\sdk\inc\stralign.h +FILE 4995 f:\sp\public\sdk\inc\tvout.h +FILE 4996 f:\sp\public\sdk\inc\winsvc.h +FILE 4997 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 4998 f:\sp\public\sdk\inc\wingdi.h +FILE 4999 f:\sp\public\sdk\inc\pshpack4.h +FILE 5000 f:\sp\public\sdk\inc\poppack.h +FILE 5001 f:\sp\vctools\crt_bld\self_x86\crt\src\sect_attribs.h +FILE 5002 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 5003 f:\sp\public\sdk\inc\winnetwk.h +FILE 5004 f:\sp\public\sdk\inc\imm.h +FILE 5005 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5006 f:\sp\public\sdk\inc\windef.h +FILE 5007 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5008 f:\sp\vctools\crt_bld\self_x86\crt\src\initcon.c +FILE 5009 f:\sp\public\sdk\inc\pshpack1.h +FILE 5010 f:\sp\public\sdk\inc\winver.h +FILE 5011 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5012 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5013 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5014 f:\sp\public\sdk\inc\winnt.h +FILE 5015 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5016 f:\sp\public\sdk\inc\ddbanned.h +FILE 5017 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5018 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5019 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5020 f:\sp\public\sdk\inc\winreg.h +FILE 5021 f:\sp\public\sdk\inc\winbase.h +FILE 5022 f:\sp\public\sdk\inc\winerror.h +FILE 5023 f:\sp\public\sdk\inc\pshpack8.h +FILE 5024 f:\sp\public\sdk\inc\poppack.h +FILE 5025 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 5026 f:\sp\public\sdk\inc\winnetwk.h +FILE 5027 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5028 f:\sp\public\sdk\inc\imm.h +FILE 5029 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5030 f:\sp\public\sdk\inc\windef.h +FILE 5031 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5032 f:\sp\public\sdk\inc\pshpack1.h +FILE 5033 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5034 f:\sp\public\sdk\inc\winver.h +FILE 5035 f:\sp\public\sdk\inc\windows.h +FILE 5036 f:\sp\public\sdk\inc\winnt.h +FILE 5037 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5038 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5039 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5040 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5041 f:\sp\public\sdk\inc\winreg.h +FILE 5042 f:\sp\public\sdk\inc\winbase.h +FILE 5043 f:\sp\vctools\crt_bld\self_x86\crt\src\commit.c +FILE 5044 f:\sp\public\sdk\inc\winerror.h +FILE 5045 f:\sp\public\sdk\inc\pshpack8.h +FILE 5046 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5047 f:\sp\public\sdk\inc\reason.h +FILE 5048 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 5049 f:\sp\public\sdk\inc\wincon.h +FILE 5050 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5051 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5052 f:\sp\public\sdk\inc\ddbanned.h +FILE 5053 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5054 f:\sp\public\sdk\inc\pshpack2.h +FILE 5055 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5056 f:\sp\public\sdk\inc\mcx.h +FILE 5057 f:\sp\public\sdk\inc\winuser.h +FILE 5058 f:\sp\public\sdk\inc\winnls.h +FILE 5059 f:\sp\public\sdk\inc\guiddef.h +FILE 5060 f:\sp\public\sdk\inc\specstrings.h +FILE 5061 f:\sp\public\sdk\inc\basetsd.h +FILE 5062 f:\sp\public\sdk\inc\stralign.h +FILE 5063 f:\sp\public\sdk\inc\tvout.h +FILE 5064 f:\sp\public\sdk\inc\winsvc.h +FILE 5065 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5066 f:\sp\public\sdk\inc\wingdi.h +FILE 5067 f:\sp\public\sdk\inc\pshpack4.h +FILE 5068 f:\sp\public\sdk\inc\reason.h +FILE 5069 f:\sp\public\sdk\inc\wincon.h +FILE 5070 f:\sp\vctools\crt_bld\self_x86\crt\src\io.h +FILE 5071 f:\sp\public\sdk\inc\poppack.h +FILE 5072 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5073 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5074 f:\sp\public\sdk\inc\mcx.h +FILE 5075 f:\sp\public\sdk\inc\winuser.h +FILE 5076 f:\sp\public\sdk\inc\winnls.h +FILE 5077 f:\sp\public\sdk\inc\stralign.h +FILE 5078 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5079 f:\sp\public\sdk\inc\windef.h +FILE 5080 f:\sp\public\sdk\inc\tvout.h +FILE 5081 f:\sp\public\sdk\inc\winsvc.h +FILE 5082 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5083 f:\sp\public\sdk\inc\wingdi.h +FILE 5084 f:\sp\vctools\crt_bld\self_x86\crt\src\msdos.h +FILE 5085 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5086 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5087 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 5088 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5089 f:\sp\public\sdk\inc\winnt.h +FILE 5090 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5091 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5092 f:\sp\public\sdk\inc\winnetwk.h +FILE 5093 f:\sp\public\sdk\inc\imm.h +FILE 5094 f:\sp\vctools\crt_bld\self_x86\crt\src\close.c +FILE 5095 f:\sp\public\sdk\inc\winbase.h +FILE 5096 f:\sp\public\sdk\inc\winerror.h +FILE 5097 f:\sp\public\sdk\inc\pshpack1.h +FILE 5098 f:\sp\public\sdk\inc\pshpack8.h +FILE 5099 f:\sp\public\sdk\inc\winver.h +FILE 5100 f:\sp\public\sdk\inc\ddbanned.h +FILE 5101 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5102 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5103 f:\sp\public\sdk\inc\pshpack2.h +FILE 5104 f:\sp\public\sdk\inc\winreg.h +FILE 5105 f:\sp\public\sdk\inc\guiddef.h +FILE 5106 f:\sp\public\sdk\inc\windows.h +FILE 5107 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5108 f:\sp\public\sdk\inc\specstrings.h +FILE 5109 f:\sp\public\sdk\inc\basetsd.h +FILE 5110 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5111 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5112 f:\sp\public\sdk\inc\pshpack4.h +FILE 5113 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\ulldvrm.asm +FILE 5114 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 5115 F:\SP\vctools\crt_bld\SELF_X86\crt\src\mm.inc +FILE 5116 F:\SP\vctools\crt_bld\SELF_X86\crt\src\intel\llmul.asm +FILE 5117 F:\SP\vctools\crt_bld\SELF_X86\crt\src\cruntime.inc +FILE 5118 F:\SP\vctools\crt_bld\SELF_X86\crt\src\mm.inc +FILE 5119 f:\sp\vctools\crt_bld\self_x86\crt\src\use_ansi.h +FILE 5120 f:\sp\vctools\crt_bld\self_x86\crt\src\new +FILE 5121 f:\sp\vctools\crt_bld\self_x86\crt\src\exception +FILE 5122 f:\sp\vctools\crt_bld\self_x86\crt\src\xstddef +FILE 5123 f:\sp\vctools\crt_bld\self_x86\crt\src\new.cpp +FILE 5124 f:\sp\vctools\crt_bld\self_x86\crt\src\cstddef +FILE 5125 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 5126 f:\sp\vctools\crt_bld\self_x86\crt\src\eh.h +FILE 5127 f:\sp\vctools\crt_bld\self_x86\crt\src\cstdlib +FILE 5128 f:\sp\vctools\crt_bld\self_x86\crt\src\yvals.h +FILE 5129 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5130 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5131 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5132 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5133 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5134 f:\sp\public\sdk\inc\ddbanned.h +FILE 5135 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5136 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5137 f:\sp\public\sdk\inc\poppack.h +FILE 5138 f:\sp\public\sdk\inc\winnetwk.h +FILE 5139 f:\sp\public\sdk\inc\imm.h +FILE 5140 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5141 f:\sp\public\sdk\inc\windef.h +FILE 5142 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5143 f:\sp\public\sdk\inc\pshpack1.h +FILE 5144 f:\sp\public\sdk\inc\winver.h +FILE 5145 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5146 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5147 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5148 f:\sp\public\sdk\inc\winnt.h +FILE 5149 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5150 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5151 f:\sp\public\sdk\inc\winreg.h +FILE 5152 f:\sp\vctools\crt_bld\self_x86\crt\src\_newmode.c +FILE 5153 f:\sp\public\sdk\inc\winbase.h +FILE 5154 f:\sp\public\sdk\inc\winerror.h +FILE 5155 f:\sp\public\sdk\inc\pshpack8.h +FILE 5156 f:\sp\public\sdk\inc\reason.h +FILE 5157 f:\sp\public\sdk\inc\wincon.h +FILE 5158 f:\sp\public\sdk\inc\ddbanned.h +FILE 5159 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5160 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5161 f:\sp\public\sdk\inc\pshpack2.h +FILE 5162 f:\sp\public\sdk\inc\mcx.h +FILE 5163 f:\sp\public\sdk\inc\winuser.h +FILE 5164 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5165 f:\sp\public\sdk\inc\winnls.h +FILE 5166 f:\sp\public\sdk\inc\guiddef.h +FILE 5167 f:\sp\public\sdk\inc\windows.h +FILE 5168 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5169 f:\sp\public\sdk\inc\specstrings.h +FILE 5170 f:\sp\public\sdk\inc\basetsd.h +FILE 5171 f:\sp\public\sdk\inc\stralign.h +FILE 5172 f:\sp\public\sdk\inc\tvout.h +FILE 5173 f:\sp\public\sdk\inc\winsvc.h +FILE 5174 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5175 f:\sp\public\sdk\inc\wingdi.h +FILE 5176 f:\sp\public\sdk\inc\pshpack4.h +FILE 5177 f:\sp\vctools\crt_bld\self_x86\crt\src\new.h +FILE 5178 f:\sp\public\sdk\inc\winerror.h +FILE 5179 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 5180 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 5181 f:\sp\public\sdk\inc\winreg.h +FILE 5182 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5183 f:\sp\public\sdk\inc\tvout.h +FILE 5184 f:\sp\vctools\crt_bld\self_x86\crt\src\delete.cpp +FILE 5185 f:\sp\public\sdk\inc\wincon.h +FILE 5186 f:\sp\public\sdk\inc\imm.h +FILE 5187 f:\sp\public\sdk\inc\winbase.h +FILE 5188 f:\sp\public\sdk\inc\wingdi.h +FILE 5189 f:\sp\public\sdk\inc\winver.h +FILE 5190 f:\sp\public\sdk\inc\windows.h +FILE 5191 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5192 f:\sp\public\sdk\inc\pshpack2.h +FILE 5193 f:\sp\public\sdk\inc\reason.h +FILE 5194 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5195 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5196 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5197 f:\sp\public\sdk\inc\specstrings.h +FILE 5198 f:\sp\public\sdk\inc\basetsd.h +FILE 5199 f:\sp\public\sdk\inc\pshpack4.h +FILE 5200 f:\sp\public\sdk\inc\winnetwk.h +FILE 5201 f:\sp\public\sdk\inc\stralign.h +FILE 5202 f:\sp\public\sdk\inc\poppack.h +FILE 5203 f:\sp\public\sdk\inc\winsvc.h +FILE 5204 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5205 f:\sp\public\sdk\inc\windef.h +FILE 5206 f:\sp\public\sdk\inc\winuser.h +FILE 5207 f:\sp\public\sdk\inc\mcx.h +FILE 5208 f:\sp\public\sdk\inc\pshpack8.h +FILE 5209 f:\sp\public\sdk\inc\ddbanned.h +FILE 5210 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5211 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5212 f:\sp\public\sdk\inc\guiddef.h +FILE 5213 f:\sp\public\sdk\inc\winnt.h +FILE 5214 f:\sp\public\sdk\inc\winnls.h +FILE 5215 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5216 f:\sp\public\sdk\inc\pshpack1.h +FILE 5217 f:\sp\public\sdk\inc\tvout.h +FILE 5218 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5219 f:\sp\vctools\crt_bld\self_x86\crt\src\process.h +FILE 5220 f:\sp\public\sdk\inc\wincon.h +FILE 5221 f:\sp\public\sdk\inc\imm.h +FILE 5222 f:\sp\public\sdk\inc\winbase.h +FILE 5223 f:\sp\public\sdk\inc\wingdi.h +FILE 5224 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5225 f:\sp\public\sdk\inc\winver.h +FILE 5226 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5227 f:\sp\public\sdk\inc\windows.h +FILE 5228 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5229 f:\sp\public\sdk\inc\pshpack2.h +FILE 5230 f:\sp\vctools\crt_bld\self_x86\crt\src\handler.cpp +FILE 5231 f:\sp\public\sdk\inc\reason.h +FILE 5232 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5233 f:\sp\public\sdk\inc\specstrings.h +FILE 5234 f:\sp\public\sdk\inc\basetsd.h +FILE 5235 f:\sp\public\sdk\inc\pshpack4.h +FILE 5236 f:\sp\public\sdk\inc\winnetwk.h +FILE 5237 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 5238 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5239 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5240 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5241 f:\sp\public\sdk\inc\stralign.h +FILE 5242 f:\sp\public\sdk\inc\poppack.h +FILE 5243 f:\sp\public\sdk\inc\winsvc.h +FILE 5244 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5245 f:\sp\public\sdk\inc\windef.h +FILE 5246 f:\sp\public\sdk\inc\winuser.h +FILE 5247 f:\sp\public\sdk\inc\mcx.h +FILE 5248 f:\sp\public\sdk\inc\pshpack8.h +FILE 5249 f:\sp\public\sdk\inc\guiddef.h +FILE 5250 f:\sp\public\sdk\inc\winnt.h +FILE 5251 f:\sp\public\sdk\inc\winnls.h +FILE 5252 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5253 f:\sp\public\sdk\inc\pshpack1.h +FILE 5254 f:\sp\public\sdk\inc\winerror.h +FILE 5255 f:\sp\public\sdk\inc\ddbanned.h +FILE 5256 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5257 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5258 f:\sp\public\sdk\inc\winreg.h +FILE 5259 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5260 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5261 f:\sp\vctools\crt_bld\self_x86\crt\src\new.h +FILE 5262 f:\sp\public\sdk\inc\winsvc.h +FILE 5263 f:\sp\public\sdk\inc\wingdi.h +FILE 5264 f:\sp\public\sdk\inc\pshpack4.h +FILE 5265 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5266 f:\sp\public\sdk\inc\poppack.h +FILE 5267 f:\sp\public\sdk\inc\winnt.h +FILE 5268 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5269 f:\sp\public\sdk\inc\winnetwk.h +FILE 5270 f:\sp\public\sdk\inc\imm.h +FILE 5271 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5272 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 5273 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5274 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5275 f:\sp\public\sdk\inc\pshpack1.h +FILE 5276 f:\sp\public\sdk\inc\winver.h +FILE 5277 f:\sp\public\sdk\inc\guiddef.h +FILE 5278 f:\sp\public\sdk\inc\specstrings.h +FILE 5279 f:\sp\public\sdk\inc\basetsd.h +FILE 5280 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5281 f:\sp\vctools\crt_bld\self_x86\crt\src\sbheap.c +FILE 5282 f:\sp\public\sdk\inc\windows.h +FILE 5283 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5284 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5285 f:\sp\public\sdk\inc\winreg.h +FILE 5286 f:\sp\public\sdk\inc\winbase.h +FILE 5287 f:\sp\public\sdk\inc\winerror.h +FILE 5288 f:\sp\public\sdk\inc\pshpack8.h +FILE 5289 f:\sp\public\sdk\inc\ddbanned.h +FILE 5290 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5291 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5292 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5293 f:\sp\public\sdk\inc\reason.h +FILE 5294 f:\sp\public\sdk\inc\wincon.h +FILE 5295 f:\sp\public\sdk\inc\pshpack2.h +FILE 5296 f:\sp\public\sdk\inc\mcx.h +FILE 5297 f:\sp\public\sdk\inc\winuser.h +FILE 5298 f:\sp\public\sdk\inc\winnls.h +FILE 5299 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5300 f:\sp\public\sdk\inc\windef.h +FILE 5301 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5302 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5303 f:\sp\public\sdk\inc\stralign.h +FILE 5304 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5305 f:\sp\public\sdk\inc\tvout.h +FILE 5306 f:\sp\public\sdk\inc\winver.h +FILE 5307 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 5308 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 5309 f:\sp\public\sdk\inc\guiddef.h +FILE 5310 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5311 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5312 f:\sp\public\sdk\inc\specstrings.h +FILE 5313 f:\sp\public\sdk\inc\basetsd.h +FILE 5314 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5315 f:\sp\public\sdk\inc\windows.h +FILE 5316 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5317 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5318 f:\sp\public\sdk\inc\winreg.h +FILE 5319 f:\sp\public\sdk\inc\winbase.h +FILE 5320 f:\sp\public\sdk\inc\winerror.h +FILE 5321 f:\sp\public\sdk\inc\pshpack8.h +FILE 5322 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5323 f:\sp\public\sdk\inc\reason.h +FILE 5324 f:\sp\public\sdk\inc\wincon.h +FILE 5325 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5326 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5327 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5328 f:\sp\public\sdk\inc\pshpack2.h +FILE 5329 f:\sp\public\sdk\inc\mcx.h +FILE 5330 f:\sp\public\sdk\inc\winuser.h +FILE 5331 f:\sp\public\sdk\inc\winnls.h +FILE 5332 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5333 f:\sp\public\sdk\inc\windef.h +FILE 5334 f:\sp\public\sdk\inc\stralign.h +FILE 5335 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5336 f:\sp\public\sdk\inc\tvout.h +FILE 5337 f:\sp\public\sdk\inc\winsvc.h +FILE 5338 f:\sp\vctools\crt_bld\self_x86\crt\src\realloc.c +FILE 5339 f:\sp\public\sdk\inc\wingdi.h +FILE 5340 f:\sp\public\sdk\inc\pshpack4.h +FILE 5341 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5342 f:\sp\public\sdk\inc\poppack.h +FILE 5343 f:\sp\public\sdk\inc\winnt.h +FILE 5344 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5345 f:\sp\public\sdk\inc\winnetwk.h +FILE 5346 f:\sp\public\sdk\inc\ddbanned.h +FILE 5347 f:\sp\public\sdk\inc\imm.h +FILE 5348 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5349 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5350 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5351 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5352 f:\sp\public\sdk\inc\pshpack1.h +FILE 5353 f:\sp\public\sdk\inc\pshpack2.h +FILE 5354 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5355 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5356 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5357 f:\sp\public\sdk\inc\mcx.h +FILE 5358 f:\sp\public\sdk\inc\winuser.h +FILE 5359 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5360 f:\sp\public\sdk\inc\winnls.h +FILE 5361 f:\sp\public\sdk\inc\guiddef.h +FILE 5362 f:\sp\public\sdk\inc\windows.h +FILE 5363 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5364 f:\sp\public\sdk\inc\specstrings.h +FILE 5365 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5366 f:\sp\public\sdk\inc\basetsd.h +FILE 5367 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5368 f:\sp\public\sdk\inc\stralign.h +FILE 5369 f:\sp\public\sdk\inc\tvout.h +FILE 5370 f:\sp\public\sdk\inc\winsvc.h +FILE 5371 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5372 f:\sp\public\sdk\inc\wingdi.h +FILE 5373 f:\sp\public\sdk\inc\pshpack4.h +FILE 5374 f:\sp\public\sdk\inc\poppack.h +FILE 5375 f:\sp\public\sdk\inc\winnetwk.h +FILE 5376 f:\sp\public\sdk\inc\imm.h +FILE 5377 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5378 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5379 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5380 f:\sp\public\sdk\inc\windef.h +FILE 5381 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5382 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5383 f:\sp\vctools\crt_bld\self_x86\crt\src\msize.c +FILE 5384 f:\sp\public\sdk\inc\pshpack1.h +FILE 5385 f:\sp\public\sdk\inc\winver.h +FILE 5386 f:\sp\public\sdk\inc\winnt.h +FILE 5387 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5388 f:\sp\public\sdk\inc\winreg.h +FILE 5389 f:\sp\public\sdk\inc\ddbanned.h +FILE 5390 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5391 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5392 f:\sp\public\sdk\inc\winbase.h +FILE 5393 f:\sp\public\sdk\inc\winerror.h +FILE 5394 f:\sp\public\sdk\inc\pshpack8.h +FILE 5395 f:\sp\public\sdk\inc\reason.h +FILE 5396 f:\sp\public\sdk\inc\wincon.h +FILE 5397 f:\sp\public\sdk\inc\pshpack2.h +FILE 5398 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5399 f:\sp\public\sdk\inc\mcx.h +FILE 5400 f:\sp\public\sdk\inc\winuser.h +FILE 5401 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5402 f:\sp\public\sdk\inc\winnls.h +FILE 5403 f:\sp\public\sdk\inc\guiddef.h +FILE 5404 f:\sp\public\sdk\inc\windows.h +FILE 5405 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5406 f:\sp\public\sdk\inc\specstrings.h +FILE 5407 f:\sp\public\sdk\inc\basetsd.h +FILE 5408 f:\sp\public\sdk\inc\stralign.h +FILE 5409 f:\sp\public\sdk\inc\tvout.h +FILE 5410 f:\sp\public\sdk\inc\winsvc.h +FILE 5411 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5412 f:\sp\public\sdk\inc\wingdi.h +FILE 5413 f:\sp\public\sdk\inc\pshpack4.h +FILE 5414 f:\sp\public\sdk\inc\poppack.h +FILE 5415 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5416 f:\sp\public\sdk\inc\winnetwk.h +FILE 5417 f:\sp\public\sdk\inc\imm.h +FILE 5418 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5419 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5420 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5421 f:\sp\public\sdk\inc\windef.h +FILE 5422 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5423 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5424 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5425 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.c +FILE 5426 f:\sp\public\sdk\inc\pshpack1.h +FILE 5427 f:\sp\public\sdk\inc\winver.h +FILE 5428 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 5429 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 5430 f:\sp\vctools\crt_bld\self_x86\crt\src\rterr.h +FILE 5431 f:\sp\public\sdk\inc\winnt.h +FILE 5432 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5433 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5434 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5435 f:\sp\public\sdk\inc\winreg.h +FILE 5436 f:\sp\public\sdk\inc\ddbanned.h +FILE 5437 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5438 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5439 f:\sp\public\sdk\inc\winbase.h +FILE 5440 f:\sp\public\sdk\inc\winerror.h +FILE 5441 f:\sp\public\sdk\inc\pshpack8.h +FILE 5442 f:\sp\public\sdk\inc\reason.h +FILE 5443 f:\sp\public\sdk\inc\wincon.h +FILE 5444 f:\sp\public\sdk\inc\winver.h +FILE 5445 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 5446 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5447 f:\sp\public\sdk\inc\winnt.h +FILE 5448 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5449 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5450 f:\sp\public\sdk\inc\winreg.h +FILE 5451 f:\sp\public\sdk\inc\winbase.h +FILE 5452 f:\sp\public\sdk\inc\winerror.h +FILE 5453 f:\sp\public\sdk\inc\pshpack8.h +FILE 5454 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5455 f:\sp\public\sdk\inc\reason.h +FILE 5456 f:\sp\public\sdk\inc\wincon.h +FILE 5457 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5458 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5459 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5460 f:\sp\public\sdk\inc\pshpack2.h +FILE 5461 f:\sp\public\sdk\inc\mcx.h +FILE 5462 f:\sp\public\sdk\inc\winuser.h +FILE 5463 f:\sp\public\sdk\inc\winnls.h +FILE 5464 f:\sp\public\sdk\inc\guiddef.h +FILE 5465 f:\sp\public\sdk\inc\stralign.h +FILE 5466 f:\sp\public\sdk\inc\specstrings.h +FILE 5467 f:\sp\public\sdk\inc\basetsd.h +FILE 5468 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5469 f:\sp\public\sdk\inc\windows.h +FILE 5470 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5471 f:\sp\public\sdk\inc\tvout.h +FILE 5472 f:\sp\public\sdk\inc\winsvc.h +FILE 5473 f:\sp\vctools\crt_bld\self_x86\crt\src\heapinit.c +FILE 5474 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5475 f:\sp\public\sdk\inc\wingdi.h +FILE 5476 f:\sp\public\sdk\inc\pshpack4.h +FILE 5477 f:\sp\public\sdk\inc\poppack.h +FILE 5478 f:\sp\public\sdk\inc\winnetwk.h +FILE 5479 f:\sp\public\sdk\inc\ddbanned.h +FILE 5480 f:\sp\public\sdk\inc\imm.h +FILE 5481 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5482 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5483 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5484 f:\sp\public\sdk\inc\windef.h +FILE 5485 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5486 f:\sp\public\sdk\inc\pshpack1.h +FILE 5487 f:\sp\public\sdk\inc\pshpack2.h +FILE 5488 f:\sp\public\sdk\inc\mcx.h +FILE 5489 f:\sp\public\sdk\inc\winuser.h +FILE 5490 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5491 f:\sp\public\sdk\inc\winnls.h +FILE 5492 f:\sp\public\sdk\inc\guiddef.h +FILE 5493 f:\sp\public\sdk\inc\windows.h +FILE 5494 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5495 f:\sp\public\sdk\inc\specstrings.h +FILE 5496 f:\sp\public\sdk\inc\basetsd.h +FILE 5497 f:\sp\public\sdk\inc\stralign.h +FILE 5498 f:\sp\public\sdk\inc\tvout.h +FILE 5499 f:\sp\public\sdk\inc\winsvc.h +FILE 5500 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5501 f:\sp\public\sdk\inc\wingdi.h +FILE 5502 f:\sp\public\sdk\inc\pshpack4.h +FILE 5503 f:\sp\public\sdk\inc\poppack.h +FILE 5504 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5505 f:\sp\public\sdk\inc\winnetwk.h +FILE 5506 f:\sp\public\sdk\inc\imm.h +FILE 5507 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5508 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5509 f:\sp\public\sdk\inc\windef.h +FILE 5510 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5511 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5512 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5513 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5514 f:\sp\public\sdk\inc\pshpack1.h +FILE 5515 f:\sp\vctools\crt_bld\self_x86\crt\src\free.c +FILE 5516 f:\sp\public\sdk\inc\winver.h +FILE 5517 f:\sp\public\sdk\inc\winnt.h +FILE 5518 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5519 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 5520 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 5521 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5522 f:\sp\public\sdk\inc\winreg.h +FILE 5523 f:\sp\public\sdk\inc\ddbanned.h +FILE 5524 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5525 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5526 f:\sp\public\sdk\inc\winbase.h +FILE 5527 f:\sp\public\sdk\inc\winerror.h +FILE 5528 f:\sp\public\sdk\inc\pshpack8.h +FILE 5529 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5530 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5531 f:\sp\public\sdk\inc\reason.h +FILE 5532 f:\sp\public\sdk\inc\wincon.h +FILE 5533 f:\sp\public\sdk\inc\pshpack2.h +FILE 5534 f:\sp\public\sdk\inc\mcx.h +FILE 5535 f:\sp\public\sdk\inc\winuser.h +FILE 5536 f:\sp\public\sdk\inc\winnls.h +FILE 5537 f:\sp\public\sdk\inc\guiddef.h +FILE 5538 f:\sp\public\sdk\inc\windows.h +FILE 5539 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5540 f:\sp\public\sdk\inc\specstrings.h +FILE 5541 f:\sp\public\sdk\inc\basetsd.h +FILE 5542 f:\sp\public\sdk\inc\stralign.h +FILE 5543 f:\sp\public\sdk\inc\tvout.h +FILE 5544 f:\sp\public\sdk\inc\winsvc.h +FILE 5545 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5546 f:\sp\public\sdk\inc\wingdi.h +FILE 5547 f:\sp\public\sdk\inc\pshpack4.h +FILE 5548 f:\sp\public\sdk\inc\poppack.h +FILE 5549 f:\sp\public\sdk\inc\winnetwk.h +FILE 5550 f:\sp\public\sdk\inc\imm.h +FILE 5551 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5552 f:\sp\public\sdk\inc\windef.h +FILE 5553 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5554 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5555 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5556 f:\sp\public\sdk\inc\pshpack1.h +FILE 5557 f:\sp\vctools\crt_bld\self_x86\crt\src\crtheap.c +FILE 5558 f:\sp\public\sdk\inc\winver.h +FILE 5559 f:\sp\public\sdk\inc\winnt.h +FILE 5560 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5561 f:\sp\public\sdk\inc\winreg.h +FILE 5562 f:\sp\public\sdk\inc\ddbanned.h +FILE 5563 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5564 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5565 f:\sp\public\sdk\inc\winbase.h +FILE 5566 f:\sp\public\sdk\inc\winerror.h +FILE 5567 f:\sp\public\sdk\inc\pshpack8.h +FILE 5568 f:\sp\public\sdk\inc\reason.h +FILE 5569 f:\sp\public\sdk\inc\wincon.h +FILE 5570 f:\sp\public\sdk\inc\pshpack2.h +FILE 5571 f:\sp\public\sdk\inc\mcx.h +FILE 5572 f:\sp\public\sdk\inc\winuser.h +FILE 5573 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 5574 f:\sp\public\sdk\inc\winnls.h +FILE 5575 f:\sp\public\sdk\inc\stralign.h +FILE 5576 f:\sp\public\sdk\inc\tvout.h +FILE 5577 f:\sp\public\sdk\inc\winsvc.h +FILE 5578 f:\sp\public\sdk\inc\wingdi.h +FILE 5579 f:\sp\public\sdk\inc\winnt.h +FILE 5580 f:\sp\public\sdk\inc\pshpack4.h +FILE 5581 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 5582 f:\sp\public\sdk\inc\poppack.h +FILE 5583 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 5584 f:\sp\public\sdk\inc\winnetwk.h +FILE 5585 f:\sp\public\sdk\inc\imm.h +FILE 5586 f:\sp\vctools\crt_bld\self_x86\crt\src\malloc.h +FILE 5587 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 5588 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 5589 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 5590 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 5591 f:\sp\public\sdk\inc\pshpack1.h +FILE 5592 f:\sp\vctools\crt_bld\self_x86\crt\src\calloc.c +FILE 5593 f:\sp\public\sdk\inc\winver.h +FILE 5594 f:\sp\vctools\crt_bld\self_x86\crt\src\winheap.h +FILE 5595 f:\sp\public\sdk\inc\guiddef.h +FILE 5596 f:\sp\public\sdk\inc\windows.h +FILE 5597 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 5598 f:\sp\public\sdk\inc\specstrings.h +FILE 5599 f:\sp\public\sdk\inc\basetsd.h +FILE 5600 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcsup.h +FILE 5601 f:\sp\vctools\crt_bld\self_x86\crt\src\rtcapi.h +FILE 5602 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 5603 f:\sp\public\sdk\inc\winreg.h +FILE 5604 f:\sp\public\sdk\inc\ddbanned.h +FILE 5605 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 5606 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 5607 f:\sp\public\sdk\inc\winbase.h +FILE 5608 f:\sp\public\sdk\inc\winerror.h +FILE 5609 f:\sp\public\sdk\inc\pshpack8.h +FILE 5610 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 5611 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 5612 f:\sp\public\sdk\inc\reason.h +FILE 5613 f:\sp\public\sdk\inc\wincon.h +FILE 5614 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 5615 f:\sp\public\sdk\inc\windef.h +FILE 5616 f:\sp\public\sdk\inc\wincon.h +FILE 5617 f:\sp\public\sdk\inc\imm.h +FILE 5618 f:\sp\public\sdk\inc\winbase.h +FILE 5619 f:\sp\public\sdk\inc\wingdi.h +FILE 5620 f:\sp\public\sdk\inc\winver.h +FILE 5621 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 5622 f:\sp\public\sdk\inc\pshpack2.h +FILE 5623 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 5624 f:\sp\public\sdk\inc\reason.h +FILE 5625 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 5626 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\setjmp.h +FILE 5627 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\i386\trnsctrl.cpp +FILE 5628 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\process.h +FILE 5629 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 5630 f:\sp\public\sdk\inc\specstrings.h +FILE 5631 f:\sp\public\sdk\inc\basetsd.h +FILE 5632 f:\sp\public\sdk\inc\pshpack4.h +FILE 5633 f:\sp\public\sdk\inc\winnetwk.h +FILE 5634 f:\sp\public\sdk\inc\stralign.h +FILE 5635 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\trnsctrl.h +FILE 5636 f:\sp\public\sdk\inc\poppack.h +FILE 5637 f:\sp\public\sdk\inc\winsvc.h +FILE 5638 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5639 f:\sp\public\sdk\inc\windef.h +FILE 5640 f:\sp\public\sdk\inc\winuser.h +FILE 5641 f:\sp\public\sdk\inc\windows.h +FILE 5642 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5643 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5644 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5645 f:\sp\public\sdk\inc\mcx.h +FILE 5646 f:\sp\public\sdk\inc\pshpack8.h +FILE 5647 f:\sp\public\sdk\inc\guiddef.h +FILE 5648 f:\sp\public\sdk\inc\winnt.h +FILE 5649 f:\sp\public\sdk\inc\winnls.h +FILE 5650 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5651 f:\sp\public\sdk\inc\pshpack1.h +FILE 5652 f:\sp\public\sdk\inc\winerror.h +FILE 5653 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5654 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5655 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 5656 f:\sp\public\sdk\inc\winreg.h +FILE 5657 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5658 f:\sp\public\sdk\inc\ddbanned.h +FILE 5659 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5660 f:\sp\public\sdk\inc\tvout.h +FILE 5661 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5662 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5663 f:\sp\vctools\langapi\include\ehdata.h +FILE 5664 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5665 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\eh\i386\lowhelpr.asm +FILE 5666 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\cruntime.inc +FILE 5667 F:\SP\vctools\crt_bld\SELF_X86\crt\prebuild\h\exsup.inc +FILE 5668 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\process.h +FILE 5669 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5670 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5671 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\i386\ehprolg3.c +FILE 5672 f:\sp\public\sdk\inc\ddbanned.h +FILE 5673 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5674 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5675 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 5676 f:\sp\public\sdk\inc\wincon.h +FILE 5677 f:\sp\public\sdk\inc\imm.h +FILE 5678 f:\sp\public\sdk\inc\winbase.h +FILE 5679 f:\sp\public\sdk\inc\wingdi.h +FILE 5680 f:\sp\public\sdk\inc\winver.h +FILE 5681 f:\sp\public\sdk\inc\pshpack2.h +FILE 5682 f:\sp\public\sdk\inc\reason.h +FILE 5683 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\validate.cpp +FILE 5684 f:\sp\public\sdk\inc\specstrings.h +FILE 5685 f:\sp\public\sdk\inc\basetsd.h +FILE 5686 f:\sp\public\sdk\inc\pshpack4.h +FILE 5687 f:\sp\public\sdk\inc\winnetwk.h +FILE 5688 f:\sp\public\sdk\inc\stralign.h +FILE 5689 f:\sp\public\sdk\inc\poppack.h +FILE 5690 f:\sp\public\sdk\inc\winsvc.h +FILE 5691 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5692 f:\sp\public\sdk\inc\windef.h +FILE 5693 f:\sp\public\sdk\inc\winuser.h +FILE 5694 f:\sp\public\sdk\inc\windows.h +FILE 5695 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5696 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5697 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5698 f:\sp\public\sdk\inc\mcx.h +FILE 5699 f:\sp\public\sdk\inc\pshpack8.h +FILE 5700 f:\sp\public\sdk\inc\guiddef.h +FILE 5701 f:\sp\public\sdk\inc\winnt.h +FILE 5702 f:\sp\public\sdk\inc\winnls.h +FILE 5703 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5704 f:\sp\public\sdk\inc\pshpack1.h +FILE 5705 f:\sp\public\sdk\inc\winerror.h +FILE 5706 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5707 f:\sp\public\sdk\inc\winreg.h +FILE 5708 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5709 f:\sp\public\sdk\inc\ddbanned.h +FILE 5710 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5711 f:\sp\public\sdk\inc\tvout.h +FILE 5712 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5713 f:\sp\public\sdk\inc\wincon.h +FILE 5714 f:\sp\public\sdk\inc\imm.h +FILE 5715 f:\sp\public\sdk\inc\winbase.h +FILE 5716 f:\sp\public\sdk\inc\wingdi.h +FILE 5717 f:\sp\public\sdk\inc\winver.h +FILE 5718 f:\sp\public\sdk\inc\pshpack2.h +FILE 5719 f:\sp\public\sdk\inc\reason.h +FILE 5720 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 5721 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\unhandld.cpp +FILE 5722 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5723 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 5724 f:\sp\public\sdk\inc\specstrings.h +FILE 5725 f:\sp\public\sdk\inc\basetsd.h +FILE 5726 f:\sp\public\sdk\inc\pshpack4.h +FILE 5727 f:\sp\public\sdk\inc\winnetwk.h +FILE 5728 f:\sp\public\sdk\inc\stralign.h +FILE 5729 f:\sp\public\sdk\inc\poppack.h +FILE 5730 f:\sp\public\sdk\inc\winsvc.h +FILE 5731 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5732 f:\sp\public\sdk\inc\windef.h +FILE 5733 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 5734 f:\sp\public\sdk\inc\winuser.h +FILE 5735 f:\sp\public\sdk\inc\windows.h +FILE 5736 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5737 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5738 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5739 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 5740 f:\sp\public\sdk\inc\mcx.h +FILE 5741 f:\sp\public\sdk\inc\pshpack8.h +FILE 5742 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 5743 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5744 f:\sp\public\sdk\inc\guiddef.h +FILE 5745 f:\sp\public\sdk\inc\winnt.h +FILE 5746 f:\sp\public\sdk\inc\winnls.h +FILE 5747 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5748 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5749 f:\sp\public\sdk\inc\pshpack1.h +FILE 5750 f:\sp\public\sdk\inc\winerror.h +FILE 5751 f:\sp\vctools\langapi\include\ehdata.h +FILE 5752 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5753 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 5754 f:\sp\public\sdk\inc\winreg.h +FILE 5755 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5756 f:\sp\public\sdk\inc\ddbanned.h +FILE 5757 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5758 f:\sp\public\sdk\inc\tvout.h +FILE 5759 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5760 f:\sp\public\sdk\inc\specstrings.h +FILE 5761 f:\sp\public\sdk\inc\basetsd.h +FILE 5762 f:\sp\public\sdk\inc\pshpack4.h +FILE 5763 f:\sp\public\sdk\inc\winnetwk.h +FILE 5764 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5765 f:\sp\public\sdk\inc\stralign.h +FILE 5766 f:\sp\public\sdk\inc\poppack.h +FILE 5767 f:\sp\public\sdk\inc\winsvc.h +FILE 5768 f:\sp\public\sdk\inc\winuser.h +FILE 5769 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5770 f:\sp\public\sdk\inc\windef.h +FILE 5771 f:\sp\vctools\langapi\undname\undname.cxx +FILE 5772 f:\sp\public\sdk\inc\mcx.h +FILE 5773 f:\sp\public\sdk\inc\pshpack8.h +FILE 5774 f:\sp\public\sdk\inc\guiddef.h +FILE 5775 f:\sp\vctools\langapi\undname\utf8.h +FILE 5776 f:\sp\public\sdk\inc\winnls.h +FILE 5777 f:\sp\public\sdk\inc\pshpack1.h +FILE 5778 f:\sp\public\sdk\inc\winnt.h +FILE 5779 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5780 f:\sp\public\sdk\inc\winerror.h +FILE 5781 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\swprintf.inl +FILE 5782 f:\sp\vctools\langapi\undname\undname.hxx +FILE 5783 f:\sp\vctools\langapi\undname\undname.h +FILE 5784 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5785 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5786 f:\sp\public\sdk\inc\winreg.h +FILE 5787 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5788 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5789 f:\sp\public\sdk\inc\tvout.h +FILE 5790 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdio.h +FILE 5791 f:\sp\public\sdk\inc\wincon.h +FILE 5792 f:\sp\public\sdk\inc\imm.h +FILE 5793 f:\sp\public\sdk\inc\winbase.h +FILE 5794 f:\sp\public\sdk\inc\wingdi.h +FILE 5795 f:\sp\public\sdk\inc\winver.h +FILE 5796 f:\sp\public\sdk\inc\pshpack2.h +FILE 5797 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5798 f:\sp\public\sdk\inc\windows.h +FILE 5799 f:\sp\public\sdk\inc\reason.h +FILE 5800 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5801 f:\sp\public\sdk\inc\ddbanned.h +FILE 5802 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5803 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5804 f:\sp\vctools\langapi\undname\undname.inl +FILE 5805 f:\sp\public\sdk\inc\guiddef.h +FILE 5806 f:\sp\public\sdk\inc\winnt.h +FILE 5807 f:\sp\public\sdk\inc\winnls.h +FILE 5808 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5809 f:\sp\public\sdk\inc\pshpack1.h +FILE 5810 f:\sp\public\sdk\inc\winerror.h +FILE 5811 f:\sp\public\sdk\inc\winreg.h +FILE 5812 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5813 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5814 f:\sp\public\sdk\inc\tvout.h +FILE 5815 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\typname.cpp +FILE 5816 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 5817 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\cstddef +FILE 5818 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5819 f:\sp\public\sdk\inc\wincon.h +FILE 5820 f:\sp\public\sdk\inc\imm.h +FILE 5821 f:\sp\public\sdk\inc\winbase.h +FILE 5822 f:\sp\public\sdk\inc\wingdi.h +FILE 5823 f:\sp\public\sdk\inc\winver.h +FILE 5824 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5825 f:\sp\public\sdk\inc\windows.h +FILE 5826 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5827 f:\sp\public\sdk\inc\pshpack2.h +FILE 5828 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5829 f:\sp\public\sdk\inc\reason.h +FILE 5830 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sect_attribs.h +FILE 5831 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\dbgint.h +FILE 5832 f:\sp\public\sdk\inc\specstrings.h +FILE 5833 f:\sp\public\sdk\inc\basetsd.h +FILE 5834 f:\sp\public\sdk\inc\pshpack4.h +FILE 5835 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\typeinfo.h +FILE 5836 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\typeinfo +FILE 5837 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\exception +FILE 5838 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\xstddef +FILE 5839 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5840 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\yvals.h +FILE 5841 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\use_ansi.h +FILE 5842 f:\sp\public\sdk\inc\winnetwk.h +FILE 5843 f:\sp\vctools\langapi\undname\undname.h +FILE 5844 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 5845 f:\sp\public\sdk\inc\stralign.h +FILE 5846 f:\sp\public\sdk\inc\poppack.h +FILE 5847 f:\sp\public\sdk\inc\winsvc.h +FILE 5848 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5849 f:\sp\public\sdk\inc\windef.h +FILE 5850 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 5851 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5852 f:\sp\public\sdk\inc\winuser.h +FILE 5853 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5854 f:\sp\public\sdk\inc\ddbanned.h +FILE 5855 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5856 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5857 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 5858 f:\sp\public\sdk\inc\mcx.h +FILE 5859 f:\sp\public\sdk\inc\pshpack8.h +FILE 5860 f:\sp\public\sdk\inc\winnls.h +FILE 5861 f:\sp\public\sdk\inc\pshpack1.h +FILE 5862 f:\sp\public\sdk\inc\winnt.h +FILE 5863 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5864 f:\sp\public\sdk\inc\winerror.h +FILE 5865 f:\sp\public\sdk\inc\winreg.h +FILE 5866 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5867 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5868 f:\sp\public\sdk\inc\tvout.h +FILE 5869 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\dbgint.h +FILE 5870 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 5871 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\cstddef +FILE 5872 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5873 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\typinfo.cpp +FILE 5874 f:\sp\public\sdk\inc\wincon.h +FILE 5875 f:\sp\public\sdk\inc\imm.h +FILE 5876 f:\sp\public\sdk\inc\winbase.h +FILE 5877 f:\sp\public\sdk\inc\wingdi.h +FILE 5878 f:\sp\public\sdk\inc\winver.h +FILE 5879 f:\sp\public\sdk\inc\pshpack2.h +FILE 5880 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5881 f:\sp\public\sdk\inc\reason.h +FILE 5882 f:\sp\public\sdk\inc\windows.h +FILE 5883 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5884 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5885 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5886 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5887 f:\sp\public\sdk\inc\specstrings.h +FILE 5888 f:\sp\public\sdk\inc\basetsd.h +FILE 5889 f:\sp\public\sdk\inc\pshpack4.h +FILE 5890 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\typeinfo +FILE 5891 f:\sp\public\sdk\inc\winnetwk.h +FILE 5892 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\exception +FILE 5893 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\xstddef +FILE 5894 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5895 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\yvals.h +FILE 5896 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\use_ansi.h +FILE 5897 f:\sp\public\sdk\inc\stralign.h +FILE 5898 f:\sp\public\sdk\inc\poppack.h +FILE 5899 f:\sp\public\sdk\inc\winsvc.h +FILE 5900 f:\sp\public\sdk\inc\winuser.h +FILE 5901 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5902 f:\sp\public\sdk\inc\windef.h +FILE 5903 f:\sp\vctools\langapi\undname\undname.h +FILE 5904 f:\sp\public\sdk\inc\ddbanned.h +FILE 5905 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 5906 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5907 f:\sp\public\sdk\inc\mcx.h +FILE 5908 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5909 f:\sp\public\sdk\inc\pshpack8.h +FILE 5910 f:\sp\public\sdk\inc\guiddef.h +FILE 5911 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5912 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\typeinfo +FILE 5913 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5914 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\exception +FILE 5915 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\xstddef +FILE 5916 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\stdexcpt.cpp +FILE 5917 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\yvals.h +FILE 5918 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\use_ansi.h +FILE 5919 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5920 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5921 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5922 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5923 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\cstddef +FILE 5924 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5925 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 5926 f:\sp\public\sdk\inc\ddbanned.h +FILE 5927 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5928 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5929 f:\sp\vctools\langapi\include\ehdata.h +FILE 5930 f:\sp\public\sdk\inc\wincon.h +FILE 5931 f:\sp\public\sdk\inc\imm.h +FILE 5932 f:\sp\public\sdk\inc\winbase.h +FILE 5933 f:\sp\public\sdk\inc\wingdi.h +FILE 5934 f:\sp\public\sdk\inc\winver.h +FILE 5935 f:\sp\public\sdk\inc\windows.h +FILE 5936 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 5937 f:\sp\public\sdk\inc\pshpack2.h +FILE 5938 f:\sp\public\sdk\inc\reason.h +FILE 5939 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp +FILE 5940 f:\sp\public\sdk\inc\specstrings.h +FILE 5941 f:\sp\public\sdk\inc\basetsd.h +FILE 5942 f:\sp\public\sdk\inc\pshpack4.h +FILE 5943 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5944 f:\sp\public\sdk\inc\winnetwk.h +FILE 5945 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5946 f:\sp\public\sdk\inc\stralign.h +FILE 5947 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5948 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5949 f:\sp\public\sdk\inc\poppack.h +FILE 5950 f:\sp\public\sdk\inc\winsvc.h +FILE 5951 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5952 f:\sp\public\sdk\inc\windef.h +FILE 5953 f:\sp\public\sdk\inc\winuser.h +FILE 5954 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 5955 f:\sp\public\sdk\inc\mcx.h +FILE 5956 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 5957 f:\sp\public\sdk\inc\pshpack8.h +FILE 5958 f:\sp\public\sdk\inc\guiddef.h +FILE 5959 f:\sp\public\sdk\inc\winnt.h +FILE 5960 f:\sp\public\sdk\inc\winnls.h +FILE 5961 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5962 f:\sp\public\sdk\inc\pshpack1.h +FILE 5963 f:\sp\public\sdk\inc\winerror.h +FILE 5964 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5965 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5966 f:\sp\public\sdk\inc\ddbanned.h +FILE 5967 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 5968 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 5969 f:\sp\public\sdk\inc\winreg.h +FILE 5970 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5971 f:\sp\public\sdk\inc\tvout.h +FILE 5972 f:\sp\public\sdk\inc\poppack.h +FILE 5973 f:\sp\public\sdk\inc\winsvc.h +FILE 5974 f:\sp\public\sdk\inc\windows.h +FILE 5975 f:\sp\public\sdk\inc\winuser.h +FILE 5976 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 5977 f:\sp\public\sdk\inc\windef.h +FILE 5978 f:\sp\public\sdk\inc\mcx.h +FILE 5979 f:\sp\public\sdk\inc\pshpack8.h +FILE 5980 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 5981 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 5982 f:\sp\public\sdk\inc\guiddef.h +FILE 5983 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\hooks.cpp +FILE 5984 f:\sp\public\sdk\inc\winnls.h +FILE 5985 f:\sp\public\sdk\inc\pshpack1.h +FILE 5986 f:\sp\public\sdk\inc\winnt.h +FILE 5987 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 5988 f:\sp\public\sdk\inc\winerror.h +FILE 5989 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 5990 f:\sp\public\sdk\inc\winreg.h +FILE 5991 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 5992 f:\sp\public\sdk\inc\tvout.h +FILE 5993 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 5994 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 5995 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 5996 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 5997 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 5998 f:\sp\public\sdk\inc\wincon.h +FILE 5999 f:\sp\public\sdk\inc\imm.h +FILE 6000 f:\sp\public\sdk\inc\winbase.h +FILE 6001 f:\sp\public\sdk\inc\wingdi.h +FILE 6002 f:\sp\public\sdk\inc\winver.h +FILE 6003 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 6004 f:\sp\public\sdk\inc\pshpack2.h +FILE 6005 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 6006 f:\sp\public\sdk\inc\reason.h +FILE 6007 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 6008 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 6009 f:\sp\public\sdk\inc\specstrings.h +FILE 6010 f:\sp\public\sdk\inc\basetsd.h +FILE 6011 f:\sp\public\sdk\inc\pshpack4.h +FILE 6012 f:\sp\public\sdk\inc\ddbanned.h +FILE 6013 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 6014 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 6015 f:\sp\public\sdk\inc\winnetwk.h +FILE 6016 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 6017 f:\sp\public\sdk\inc\stralign.h +FILE 6018 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdbg.h +FILE 6019 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehassert.h +FILE 6020 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\malloc.h +FILE 6021 f:\sp\public\sdk\inc\wincon.h +FILE 6022 f:\sp\public\sdk\inc\imm.h +FILE 6023 f:\sp\public\sdk\inc\guiddef.h +FILE 6024 f:\sp\public\sdk\inc\winbase.h +FILE 6025 f:\sp\public\sdk\inc\wingdi.h +FILE 6026 f:\sp\vctools\langapi\include\ehdata.h +FILE 6027 f:\sp\public\sdk\inc\winver.h +FILE 6028 f:\sp\public\sdk\inc\winnt.h +FILE 6029 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ctype.h +FILE 6030 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdlib.h +FILE 6031 f:\sp\public\sdk\inc\pshpack2.h +FILE 6032 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\limits.h +FILE 6033 f:\sp\public\sdk\inc\reason.h +FILE 6034 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\frame.cpp +FILE 6035 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\exception +FILE 6036 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\typeinfo.h +FILE 6037 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\typeinfo +FILE 6038 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\xstddef +FILE 6039 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\yvals.h +FILE 6040 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\use_ansi.h +FILE 6041 f:\sp\public\sdk\inc\pshpack4.h +FILE 6042 f:\sp\public\sdk\inc\winnetwk.h +FILE 6043 f:\sp\public\sdk\inc\stralign.h +FILE 6044 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\errno.h +FILE 6045 f:\sp\public\sdk\inc\poppack.h +FILE 6046 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stddef.h +FILE 6047 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\crtdefs.h +FILE 6048 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\sal.h +FILE 6049 f:\sp\public\sdk\inc\winsvc.h +FILE 6050 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehstate.h +FILE 6051 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\eh.h +FILE 6052 f:\sp\public\sdk\inc\winuser.h +FILE 6053 f:\sp\public\sdk\inc\windows.h +FILE 6054 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\excpt.h +FILE 6055 f:\sp\public\sdk\inc\mcx.h +FILE 6056 f:\sp\public\sdk\inc\pshpack8.h +FILE 6057 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\string.h +FILE 6058 f:\sp\public\sdk\inc\specstrings.h +FILE 6059 f:\sp\public\sdk\inc\basetsd.h +FILE 6060 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\ehhooks.h +FILE 6061 f:\sp\public\sdk\inc\winnls.h +FILE 6062 f:\sp\public\sdk\inc\pshpack1.h +FILE 6063 f:\sp\public\sdk\inc\winerror.h +FILE 6064 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\trnsctrl.h +FILE 6065 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\internal.h +FILE 6066 f:\sp\public\sdk\inc\winreg.h +FILE 6067 f:\sp\public\sdk\inc\ddbanned.h +FILE 6068 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\vadefs.h +FILE 6069 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\stdhpp\cstddef +FILE 6070 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\cruntime.h +FILE 6071 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\mtdll.h +FILE 6072 f:\sp\vctools\crt_bld\self_x86\crt\prebuild\h\stdarg.h +FILE 6073 f:\sp\public\sdk\inc\windef.h +FILE 6074 f:\sp\public\sdk\inc\tvout.h +FILE 6075 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6076 f:\sp\public\sdk\inc\pshpack4.h +FILE 6077 f:\sp\public\sdk\inc\reason.h +FILE 6078 f:\sp\public\sdk\inc\wincon.h +FILE 6079 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6080 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6081 f:\sp\public\sdk\inc\poppack.h +FILE 6082 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6083 f:\sp\public\sdk\inc\mcx.h +FILE 6084 f:\sp\public\sdk\inc\winuser.h +FILE 6085 f:\sp\public\sdk\inc\winnls.h +FILE 6086 f:\sp\public\sdk\inc\stralign.h +FILE 6087 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6088 f:\sp\public\sdk\inc\windef.h +FILE 6089 f:\sp\public\sdk\inc\tvout.h +FILE 6090 f:\sp\public\sdk\inc\winsvc.h +FILE 6091 f:\sp\public\sdk\inc\wingdi.h +FILE 6092 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6093 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6094 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6095 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6096 f:\sp\public\sdk\inc\winnt.h +FILE 6097 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6098 f:\sp\public\sdk\inc\winnetwk.h +FILE 6099 f:\sp\public\sdk\inc\imm.h +FILE 6100 f:\sp\vctools\crt_bld\self_x86\crt\src\dosmap.c +FILE 6101 f:\sp\public\sdk\inc\winbase.h +FILE 6102 f:\sp\public\sdk\inc\winerror.h +FILE 6103 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6104 f:\sp\public\sdk\inc\pshpack1.h +FILE 6105 f:\sp\public\sdk\inc\pshpack8.h +FILE 6106 f:\sp\public\sdk\inc\winver.h +FILE 6107 f:\sp\public\sdk\inc\ddbanned.h +FILE 6108 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6109 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6110 f:\sp\public\sdk\inc\pshpack2.h +FILE 6111 f:\sp\public\sdk\inc\winreg.h +FILE 6112 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6113 f:\sp\public\sdk\inc\guiddef.h +FILE 6114 f:\sp\public\sdk\inc\windows.h +FILE 6115 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6116 f:\sp\public\sdk\inc\specstrings.h +FILE 6117 f:\sp\public\sdk\inc\basetsd.h +FILE 6118 f:\sp\public\sdk\inc\winver.h +FILE 6119 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6120 f:\sp\public\sdk\inc\pshpack2.h +FILE 6121 f:\sp\public\sdk\inc\windows.h +FILE 6122 f:\sp\public\sdk\inc\reason.h +FILE 6123 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6124 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6125 f:\sp\public\sdk\inc\specstrings.h +FILE 6126 f:\sp\public\sdk\inc\basetsd.h +FILE 6127 f:\sp\public\sdk\inc\pshpack4.h +FILE 6128 f:\sp\vctools\crt_bld\self_x86\crt\src\wctomb.c +FILE 6129 f:\sp\public\sdk\inc\winnetwk.h +FILE 6130 f:\sp\public\sdk\inc\stralign.h +FILE 6131 f:\sp\public\sdk\inc\poppack.h +FILE 6132 f:\sp\public\sdk\inc\winsvc.h +FILE 6133 f:\sp\public\sdk\inc\winuser.h +FILE 6134 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6135 f:\sp\public\sdk\inc\windef.h +FILE 6136 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6137 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6138 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6139 f:\sp\public\sdk\inc\mcx.h +FILE 6140 f:\sp\public\sdk\inc\pshpack8.h +FILE 6141 f:\sp\public\sdk\inc\guiddef.h +FILE 6142 f:\sp\public\sdk\inc\winnls.h +FILE 6143 f:\sp\public\sdk\inc\pshpack1.h +FILE 6144 f:\sp\public\sdk\inc\winnt.h +FILE 6145 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6146 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6147 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6148 f:\sp\public\sdk\inc\winerror.h +FILE 6149 f:\sp\public\sdk\inc\winreg.h +FILE 6150 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6151 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6152 f:\sp\public\sdk\inc\tvout.h +FILE 6153 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6154 f:\sp\public\sdk\inc\ddbanned.h +FILE 6155 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6156 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6157 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6158 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6159 f:\sp\public\sdk\inc\wincon.h +FILE 6160 f:\sp\public\sdk\inc\imm.h +FILE 6161 f:\sp\public\sdk\inc\winbase.h +FILE 6162 f:\sp\public\sdk\inc\wingdi.h +FILE 6163 f:\sp\public\sdk\inc\winsvc.h +FILE 6164 f:\sp\public\sdk\inc\winuser.h +FILE 6165 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6166 f:\sp\public\sdk\inc\mcx.h +FILE 6167 f:\sp\public\sdk\inc\pshpack8.h +FILE 6168 f:\sp\public\sdk\inc\guiddef.h +FILE 6169 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6170 f:\sp\public\sdk\inc\windows.h +FILE 6171 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6172 f:\sp\public\sdk\inc\winnls.h +FILE 6173 f:\sp\vctools\crt_bld\self_x86\crt\src\wcstol.c +FILE 6174 f:\sp\public\sdk\inc\pshpack1.h +FILE 6175 f:\sp\public\sdk\inc\winerror.h +FILE 6176 f:\sp\public\sdk\inc\winreg.h +FILE 6177 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6178 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6179 f:\sp\public\sdk\inc\tvout.h +FILE 6180 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6181 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6182 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6183 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6184 f:\sp\public\sdk\inc\wincon.h +FILE 6185 f:\sp\public\sdk\inc\imm.h +FILE 6186 f:\sp\public\sdk\inc\winbase.h +FILE 6187 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6188 f:\sp\public\sdk\inc\wingdi.h +FILE 6189 f:\sp\public\sdk\inc\windef.h +FILE 6190 f:\sp\public\sdk\inc\winver.h +FILE 6191 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6192 f:\sp\public\sdk\inc\pshpack2.h +FILE 6193 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6194 f:\sp\public\sdk\inc\reason.h +FILE 6195 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6196 f:\sp\public\sdk\inc\winnt.h +FILE 6197 f:\sp\public\sdk\inc\specstrings.h +FILE 6198 f:\sp\public\sdk\inc\basetsd.h +FILE 6199 f:\sp\public\sdk\inc\pshpack4.h +FILE 6200 f:\sp\public\sdk\inc\ddbanned.h +FILE 6201 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6202 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6203 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6204 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6205 f:\sp\public\sdk\inc\winnetwk.h +FILE 6206 f:\sp\public\sdk\inc\stralign.h +FILE 6207 f:\sp\public\sdk\inc\poppack.h +FILE 6208 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6209 f:\sp\public\sdk\inc\mcx.h +FILE 6210 f:\sp\public\sdk\inc\pshpack8.h +FILE 6211 f:\sp\public\sdk\inc\guiddef.h +FILE 6212 f:\sp\public\sdk\inc\winnt.h +FILE 6213 f:\sp\public\sdk\inc\winnls.h +FILE 6214 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6215 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6216 f:\sp\public\sdk\inc\pshpack1.h +FILE 6217 f:\sp\public\sdk\inc\winerror.h +FILE 6218 f:\sp\vctools\crt_bld\self_x86\crt\src\tolower.c +FILE 6219 f:\sp\public\sdk\inc\winreg.h +FILE 6220 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6221 f:\sp\public\sdk\inc\tvout.h +FILE 6222 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6223 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6224 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6225 f:\sp\public\sdk\inc\wincon.h +FILE 6226 f:\sp\vctools\crt_bld\self_x86\crt\src\stddef.h +FILE 6227 f:\sp\public\sdk\inc\imm.h +FILE 6228 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6229 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6230 f:\sp\public\sdk\inc\winbase.h +FILE 6231 f:\sp\public\sdk\inc\wingdi.h +FILE 6232 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6233 f:\sp\public\sdk\inc\winver.h +FILE 6234 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 6235 f:\sp\public\sdk\inc\windows.h +FILE 6236 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6237 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6238 f:\sp\public\sdk\inc\pshpack2.h +FILE 6239 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6240 f:\sp\public\sdk\inc\reason.h +FILE 6241 f:\sp\public\sdk\inc\specstrings.h +FILE 6242 f:\sp\public\sdk\inc\basetsd.h +FILE 6243 f:\sp\public\sdk\inc\pshpack4.h +FILE 6244 f:\sp\public\sdk\inc\winnetwk.h +FILE 6245 f:\sp\public\sdk\inc\ddbanned.h +FILE 6246 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6247 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6248 f:\sp\public\sdk\inc\stralign.h +FILE 6249 f:\sp\public\sdk\inc\poppack.h +FILE 6250 f:\sp\public\sdk\inc\winsvc.h +FILE 6251 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6252 f:\sp\public\sdk\inc\windef.h +FILE 6253 f:\sp\public\sdk\inc\winuser.h +FILE 6254 f:\sp\public\sdk\inc\winsvc.h +FILE 6255 f:\sp\public\sdk\inc\winuser.h +FILE 6256 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6257 f:\sp\public\sdk\inc\mcx.h +FILE 6258 f:\sp\public\sdk\inc\pshpack8.h +FILE 6259 f:\sp\public\sdk\inc\guiddef.h +FILE 6260 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6261 f:\sp\public\sdk\inc\windows.h +FILE 6262 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6263 f:\sp\public\sdk\inc\winnls.h +FILE 6264 f:\sp\vctools\crt_bld\self_x86\crt\src\strtoq.c +FILE 6265 f:\sp\public\sdk\inc\pshpack1.h +FILE 6266 f:\sp\public\sdk\inc\winerror.h +FILE 6267 f:\sp\public\sdk\inc\winreg.h +FILE 6268 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6269 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6270 f:\sp\public\sdk\inc\tvout.h +FILE 6271 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6272 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6273 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6274 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6275 f:\sp\public\sdk\inc\wincon.h +FILE 6276 f:\sp\public\sdk\inc\imm.h +FILE 6277 f:\sp\public\sdk\inc\winbase.h +FILE 6278 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6279 f:\sp\public\sdk\inc\wingdi.h +FILE 6280 f:\sp\public\sdk\inc\windef.h +FILE 6281 f:\sp\public\sdk\inc\winver.h +FILE 6282 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6283 f:\sp\public\sdk\inc\pshpack2.h +FILE 6284 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6285 f:\sp\public\sdk\inc\reason.h +FILE 6286 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6287 f:\sp\public\sdk\inc\winnt.h +FILE 6288 f:\sp\public\sdk\inc\specstrings.h +FILE 6289 f:\sp\public\sdk\inc\basetsd.h +FILE 6290 f:\sp\public\sdk\inc\pshpack4.h +FILE 6291 f:\sp\public\sdk\inc\ddbanned.h +FILE 6292 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6293 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6294 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6295 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6296 f:\sp\public\sdk\inc\winnetwk.h +FILE 6297 f:\sp\public\sdk\inc\stralign.h +FILE 6298 f:\sp\public\sdk\inc\poppack.h +FILE 6299 f:\sp\public\sdk\inc\winsvc.h +FILE 6300 f:\sp\public\sdk\inc\winuser.h +FILE 6301 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6302 f:\sp\public\sdk\inc\mcx.h +FILE 6303 f:\sp\public\sdk\inc\pshpack8.h +FILE 6304 f:\sp\public\sdk\inc\guiddef.h +FILE 6305 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6306 f:\sp\public\sdk\inc\windows.h +FILE 6307 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6308 f:\sp\public\sdk\inc\winnls.h +FILE 6309 f:\sp\vctools\crt_bld\self_x86\crt\src\strtol.c +FILE 6310 f:\sp\public\sdk\inc\pshpack1.h +FILE 6311 f:\sp\public\sdk\inc\winerror.h +FILE 6312 f:\sp\public\sdk\inc\winreg.h +FILE 6313 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6314 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6315 f:\sp\public\sdk\inc\tvout.h +FILE 6316 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6317 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6318 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6319 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6320 f:\sp\public\sdk\inc\wincon.h +FILE 6321 f:\sp\public\sdk\inc\imm.h +FILE 6322 f:\sp\public\sdk\inc\winbase.h +FILE 6323 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6324 f:\sp\public\sdk\inc\wingdi.h +FILE 6325 f:\sp\public\sdk\inc\windef.h +FILE 6326 f:\sp\public\sdk\inc\winver.h +FILE 6327 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6328 f:\sp\public\sdk\inc\pshpack2.h +FILE 6329 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6330 f:\sp\public\sdk\inc\reason.h +FILE 6331 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6332 f:\sp\public\sdk\inc\winnt.h +FILE 6333 f:\sp\public\sdk\inc\specstrings.h +FILE 6334 f:\sp\public\sdk\inc\basetsd.h +FILE 6335 f:\sp\public\sdk\inc\pshpack4.h +FILE 6336 f:\sp\public\sdk\inc\ddbanned.h +FILE 6337 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6338 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6339 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6340 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6341 f:\sp\public\sdk\inc\winnetwk.h +FILE 6342 f:\sp\public\sdk\inc\stralign.h +FILE 6343 f:\sp\public\sdk\inc\poppack.h +FILE 6344 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6345 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6346 f:\sp\public\sdk\inc\tvout.h +FILE 6347 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6348 f:\sp\public\sdk\inc\wincon.h +FILE 6349 f:\sp\public\sdk\inc\imm.h +FILE 6350 f:\sp\public\sdk\inc\winbase.h +FILE 6351 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6352 f:\sp\public\sdk\inc\wingdi.h +FILE 6353 f:\sp\public\sdk\inc\windef.h +FILE 6354 f:\sp\public\sdk\inc\winver.h +FILE 6355 f:\sp\vctools\crt_bld\self_x86\crt\src\mbtowc.c +FILE 6356 f:\sp\public\sdk\inc\pshpack2.h +FILE 6357 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6358 f:\sp\public\sdk\inc\reason.h +FILE 6359 f:\sp\public\sdk\inc\winnt.h +FILE 6360 f:\sp\public\sdk\inc\specstrings.h +FILE 6361 f:\sp\public\sdk\inc\basetsd.h +FILE 6362 f:\sp\public\sdk\inc\pshpack4.h +FILE 6363 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6364 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6365 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6366 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6367 f:\sp\public\sdk\inc\winnetwk.h +FILE 6368 f:\sp\public\sdk\inc\stralign.h +FILE 6369 f:\sp\public\sdk\inc\poppack.h +FILE 6370 f:\sp\public\sdk\inc\winsvc.h +FILE 6371 f:\sp\public\sdk\inc\winuser.h +FILE 6372 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6373 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 6374 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6375 f:\sp\public\sdk\inc\mcx.h +FILE 6376 f:\sp\public\sdk\inc\pshpack8.h +FILE 6377 f:\sp\public\sdk\inc\guiddef.h +FILE 6378 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6379 f:\sp\public\sdk\inc\windows.h +FILE 6380 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6381 f:\sp\public\sdk\inc\winnls.h +FILE 6382 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6383 f:\sp\public\sdk\inc\pshpack1.h +FILE 6384 f:\sp\public\sdk\inc\ddbanned.h +FILE 6385 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6386 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6387 f:\sp\public\sdk\inc\winerror.h +FILE 6388 f:\sp\public\sdk\inc\winreg.h +FILE 6389 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6390 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 6391 f:\sp\public\sdk\inc\winreg.h +FILE 6392 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6393 f:\sp\public\sdk\inc\tvout.h +FILE 6394 f:\sp\vctools\crt_bld\self_x86\crt\src\dbgint.h +FILE 6395 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6396 f:\sp\public\sdk\inc\wincon.h +FILE 6397 f:\sp\public\sdk\inc\imm.h +FILE 6398 f:\sp\public\sdk\inc\winbase.h +FILE 6399 f:\sp\vctools\crt_bld\self_x86\crt\src\isctype.c +FILE 6400 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6401 f:\sp\public\sdk\inc\wingdi.h +FILE 6402 f:\sp\public\sdk\inc\windef.h +FILE 6403 f:\sp\public\sdk\inc\winver.h +FILE 6404 f:\sp\public\sdk\inc\pshpack2.h +FILE 6405 f:\sp\public\sdk\inc\reason.h +FILE 6406 f:\sp\public\sdk\inc\winnt.h +FILE 6407 f:\sp\public\sdk\inc\specstrings.h +FILE 6408 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6409 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 6410 f:\sp\public\sdk\inc\basetsd.h +FILE 6411 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6412 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6413 f:\sp\public\sdk\inc\pshpack4.h +FILE 6414 f:\sp\public\sdk\inc\winnetwk.h +FILE 6415 f:\sp\public\sdk\inc\stralign.h +FILE 6416 f:\sp\public\sdk\inc\poppack.h +FILE 6417 f:\sp\public\sdk\inc\winsvc.h +FILE 6418 f:\sp\public\sdk\inc\winuser.h +FILE 6419 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6420 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6421 f:\sp\public\sdk\inc\mcx.h +FILE 6422 f:\sp\public\sdk\inc\pshpack8.h +FILE 6423 f:\sp\public\sdk\inc\guiddef.h +FILE 6424 f:\sp\public\sdk\inc\ddbanned.h +FILE 6425 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6426 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 6427 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6428 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6429 f:\sp\public\sdk\inc\windows.h +FILE 6430 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6431 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6432 f:\sp\public\sdk\inc\winnls.h +FILE 6433 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6434 f:\sp\public\sdk\inc\pshpack1.h +FILE 6435 f:\sp\public\sdk\inc\winerror.h +FILE 6436 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 6437 f:\sp\public\sdk\inc\winreg.h +FILE 6438 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6439 f:\sp\public\sdk\inc\tvout.h +FILE 6440 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6441 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6442 f:\sp\public\sdk\inc\wincon.h +FILE 6443 f:\sp\public\sdk\inc\imm.h +FILE 6444 f:\sp\public\sdk\inc\winbase.h +FILE 6445 f:\sp\vctools\crt_bld\self_x86\crt\src\iswctype.c +FILE 6446 f:\sp\public\sdk\inc\wingdi.h +FILE 6447 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6448 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6449 f:\sp\public\sdk\inc\winver.h +FILE 6450 f:\sp\vctools\crt_bld\self_x86\crt\src\awint.h +FILE 6451 f:\sp\public\sdk\inc\windows.h +FILE 6452 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6453 f:\sp\public\sdk\inc\pshpack2.h +FILE 6454 f:\sp\public\sdk\inc\reason.h +FILE 6455 f:\sp\public\sdk\inc\specstrings.h +FILE 6456 f:\sp\vctools\crt_bld\self_x86\crt\src\stdio.h +FILE 6457 f:\sp\public\sdk\inc\basetsd.h +FILE 6458 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6459 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6460 f:\sp\public\sdk\inc\pshpack4.h +FILE 6461 f:\sp\public\sdk\inc\winnetwk.h +FILE 6462 f:\sp\public\sdk\inc\stralign.h +FILE 6463 f:\sp\public\sdk\inc\poppack.h +FILE 6464 f:\sp\public\sdk\inc\winsvc.h +FILE 6465 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6466 f:\sp\public\sdk\inc\windef.h +FILE 6467 f:\sp\public\sdk\inc\winuser.h +FILE 6468 f:\sp\public\sdk\inc\mcx.h +FILE 6469 f:\sp\public\sdk\inc\pshpack8.h +FILE 6470 f:\sp\public\sdk\inc\guiddef.h +FILE 6471 f:\sp\public\sdk\inc\ddbanned.h +FILE 6472 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6473 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6474 f:\sp\public\sdk\inc\winnt.h +FILE 6475 f:\sp\public\sdk\inc\winnls.h +FILE 6476 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6477 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6478 f:\sp\public\sdk\inc\pshpack1.h +FILE 6479 f:\sp\public\sdk\inc\winerror.h +FILE 6480 f:\sp\public\sdk\inc\winsvc.h +FILE 6481 f:\sp\public\sdk\inc\winuser.h +FILE 6482 f:\sp\public\sdk\inc\mcx.h +FILE 6483 f:\sp\public\sdk\inc\pshpack8.h +FILE 6484 f:\sp\public\sdk\inc\guiddef.h +FILE 6485 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6486 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6487 f:\sp\public\sdk\inc\windows.h +FILE 6488 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6489 f:\sp\public\sdk\inc\winnls.h +FILE 6490 f:\sp\vctools\crt_bld\self_x86\crt\src\_wctype.c +FILE 6491 f:\sp\public\sdk\inc\pshpack1.h +FILE 6492 f:\sp\public\sdk\inc\winerror.h +FILE 6493 f:\sp\public\sdk\inc\winreg.h +FILE 6494 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6495 f:\sp\public\sdk\inc\tvout.h +FILE 6496 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6497 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6498 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6499 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6500 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6501 f:\sp\public\sdk\inc\wincon.h +FILE 6502 f:\sp\public\sdk\inc\imm.h +FILE 6503 f:\sp\public\sdk\inc\winbase.h +FILE 6504 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6505 f:\sp\public\sdk\inc\wingdi.h +FILE 6506 f:\sp\public\sdk\inc\windef.h +FILE 6507 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 6508 f:\sp\public\sdk\inc\winver.h +FILE 6509 f:\sp\public\sdk\inc\pshpack2.h +FILE 6510 f:\sp\public\sdk\inc\reason.h +FILE 6511 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6512 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6513 f:\sp\public\sdk\inc\winnt.h +FILE 6514 f:\sp\public\sdk\inc\specstrings.h +FILE 6515 f:\sp\public\sdk\inc\basetsd.h +FILE 6516 f:\sp\public\sdk\inc\pshpack4.h +FILE 6517 f:\sp\public\sdk\inc\ddbanned.h +FILE 6518 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6519 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6520 f:\sp\public\sdk\inc\winnetwk.h +FILE 6521 f:\sp\public\sdk\inc\stralign.h +FILE 6522 f:\sp\public\sdk\inc\poppack.h +FILE 6523 f:\sp\public\sdk\inc\mcx.h +FILE 6524 f:\sp\public\sdk\inc\pshpack8.h +FILE 6525 f:\sp\public\sdk\inc\guiddef.h +FILE 6526 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6527 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6528 f:\sp\public\sdk\inc\windows.h +FILE 6529 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6530 f:\sp\public\sdk\inc\winnls.h +FILE 6531 f:\sp\public\sdk\inc\pshpack1.h +FILE 6532 f:\sp\public\sdk\inc\winerror.h +FILE 6533 f:\sp\public\sdk\inc\winreg.h +FILE 6534 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6535 f:\sp\vctools\crt_bld\self_x86\crt\src\_ctype.c +FILE 6536 f:\sp\public\sdk\inc\tvout.h +FILE 6537 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6538 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6539 f:\sp\public\sdk\inc\wincon.h +FILE 6540 f:\sp\public\sdk\inc\imm.h +FILE 6541 f:\sp\public\sdk\inc\winbase.h +FILE 6542 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6543 f:\sp\public\sdk\inc\wingdi.h +FILE 6544 f:\sp\public\sdk\inc\windef.h +FILE 6545 f:\sp\public\sdk\inc\winver.h +FILE 6546 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6547 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6548 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6549 f:\sp\public\sdk\inc\pshpack2.h +FILE 6550 f:\sp\public\sdk\inc\reason.h +FILE 6551 f:\sp\public\sdk\inc\winnt.h +FILE 6552 f:\sp\vctools\crt_bld\self_x86\crt\src\locale.h +FILE 6553 f:\sp\public\sdk\inc\specstrings.h +FILE 6554 f:\sp\public\sdk\inc\basetsd.h +FILE 6555 f:\sp\public\sdk\inc\pshpack4.h +FILE 6556 f:\sp\public\sdk\inc\winnetwk.h +FILE 6557 f:\sp\public\sdk\inc\stralign.h +FILE 6558 f:\sp\public\sdk\inc\poppack.h +FILE 6559 f:\sp\public\sdk\inc\winsvc.h +FILE 6560 f:\sp\public\sdk\inc\ddbanned.h +FILE 6561 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6562 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6563 f:\sp\public\sdk\inc\winuser.h +FILE 6564 f:\sp\public\sdk\inc\pshpack2.h +FILE 6565 f:\sp\public\sdk\inc\mcx.h +FILE 6566 f:\sp\public\sdk\inc\winuser.h +FILE 6567 f:\sp\public\sdk\inc\winnls.h +FILE 6568 f:\sp\public\sdk\inc\stralign.h +FILE 6569 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6570 f:\sp\public\sdk\inc\windef.h +FILE 6571 f:\sp\public\sdk\inc\tvout.h +FILE 6572 f:\sp\public\sdk\inc\winsvc.h +FILE 6573 f:\sp\vctools\crt_bld\self_x86\crt\src\internal_securecrt.h +FILE 6574 f:\sp\public\sdk\inc\wingdi.h +FILE 6575 f:\sp\public\sdk\inc\pshpack4.h +FILE 6576 f:\sp\public\sdk\inc\poppack.h +FILE 6577 f:\sp\public\sdk\inc\winnt.h +FILE 6578 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6579 f:\sp\public\sdk\inc\winnetwk.h +FILE 6580 f:\sp\public\sdk\inc\imm.h +FILE 6581 f:\sp\vctools\crt_bld\self_x86\crt\src\xtoa.c +FILE 6582 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6583 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdbg.h +FILE 6584 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6585 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6586 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 6587 f:\sp\vctools\crt_bld\self_x86\crt\src\xtoas.c +FILE 6588 f:\sp\public\sdk\inc\pshpack1.h +FILE 6589 f:\sp\public\sdk\inc\winver.h +FILE 6590 f:\sp\vctools\crt_bld\self_x86\crt\src\errno.h +FILE 6591 f:\sp\public\sdk\inc\guiddef.h +FILE 6592 f:\sp\public\sdk\inc\specstrings.h +FILE 6593 f:\sp\public\sdk\inc\basetsd.h +FILE 6594 f:\sp\public\sdk\inc\winreg.h +FILE 6595 f:\sp\public\sdk\inc\ddbanned.h +FILE 6596 f:\sp\vctools\crt_bld\self_x86\crt\src\internal.h +FILE 6597 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6598 f:\sp\public\sdk\inc\windows.h +FILE 6599 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6600 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6601 f:\sp\public\sdk\inc\winbase.h +FILE 6602 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6603 f:\sp\public\sdk\inc\winerror.h +FILE 6604 f:\sp\public\sdk\inc\pshpack8.h +FILE 6605 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 6606 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6607 f:\sp\public\sdk\inc\reason.h +FILE 6608 f:\sp\public\sdk\inc\wincon.h +FILE 6609 f:\sp\vctools\crt_bld\self_x86\crt\src\swprintf.inl +FILE 6610 f:\sp\vctools\crt_bld\self_x86\crt\src\wchar.h +FILE 6611 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6612 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6613 f:\sp\vctools\crt_bld\self_x86\crt\src\wchtodig.c +FILE 6614 f:\sp\public\sdk\inc\ddbanned.h +FILE 6615 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6616 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6617 f:\sp\vctools\crt_bld\self_x86\crt\src\wtime.inl +FILE 6618 f:\sp\public\sdk\inc\poppack.h +FILE 6619 f:\sp\public\sdk\inc\winnetwk.h +FILE 6620 f:\sp\public\sdk\inc\imm.h +FILE 6621 f:\sp\vctools\crt_bld\self_x86\crt\src\stdarg.h +FILE 6622 f:\sp\public\sdk\inc\windef.h +FILE 6623 f:\sp\public\sdk\inc\pshpack1.h +FILE 6624 f:\sp\public\sdk\inc\winver.h +FILE 6625 f:\sp\vctools\crt_bld\self_x86\crt\src\mtdll.h +FILE 6626 f:\sp\vctools\crt_bld\self_x86\crt\src\crtdefs.h +FILE 6627 f:\sp\vctools\crt_bld\self_x86\crt\src\sal.h +FILE 6628 f:\sp\public\sdk\inc\winnt.h +FILE 6629 f:\sp\vctools\crt_bld\self_x86\crt\src\ctype.h +FILE 6630 f:\sp\public\sdk\inc\winreg.h +FILE 6631 f:\sp\vctools\crt_bld\self_x86\crt\src\atox.c +FILE 6632 f:\sp\public\sdk\inc\winbase.h +FILE 6633 f:\sp\public\sdk\inc\winerror.h +FILE 6634 f:\sp\public\sdk\inc\pshpack8.h +FILE 6635 f:\sp\vctools\crt_bld\self_x86\crt\src\setlocal.h +FILE 6636 f:\sp\vctools\crt_bld\self_x86\crt\src\oscalls.h +FILE 6637 f:\sp\public\sdk\inc\reason.h +FILE 6638 f:\sp\public\sdk\inc\wincon.h +FILE 6639 f:\sp\public\sdk\inc\ddbanned.h +FILE 6640 f:\sp\vctools\crt_bld\self_x86\crt\src\vadefs.h +FILE 6641 f:\sp\vctools\crt_bld\self_x86\crt\src\cruntime.h +FILE 6642 f:\sp\public\sdk\inc\pshpack2.h +FILE 6643 f:\sp\vctools\crt_bld\self_x86\crt\src\tchar.h +FILE 6644 f:\sp\vctools\crt_bld\self_x86\crt\src\stdlib.h +FILE 6645 f:\sp\vctools\crt_bld\self_x86\crt\src\mbstring.h +FILE 6646 f:\sp\public\sdk\inc\mcx.h +FILE 6647 f:\sp\public\sdk\inc\winuser.h +FILE 6648 f:\sp\vctools\crt_bld\self_x86\crt\src\limits.h +FILE 6649 f:\sp\public\sdk\inc\winnls.h +FILE 6650 f:\sp\public\sdk\inc\guiddef.h +FILE 6651 f:\sp\public\sdk\inc\windows.h +FILE 6652 f:\sp\vctools\crt_bld\self_x86\crt\src\excpt.h +FILE 6653 f:\sp\vctools\crt_bld\self_x86\crt\src\mbctype.h +FILE 6654 f:\sp\public\sdk\inc\specstrings.h +FILE 6655 f:\sp\public\sdk\inc\basetsd.h +FILE 6656 f:\sp\public\sdk\inc\stralign.h +FILE 6657 f:\sp\public\sdk\inc\tvout.h +FILE 6658 f:\sp\public\sdk\inc\winsvc.h +FILE 6659 f:\sp\vctools\crt_bld\self_x86\crt\src\string.h +FILE 6660 f:\sp\public\sdk\inc\wingdi.h +FILE 6661 f:\sp\public\sdk\inc\pshpack4.h +FUNC 1000 13 4 vswprintf +1000 0 50 71 +1000 12 51 71 +1012 1 52 71 +FUNC 1020 1b 10 wmemcpy_s +1020 0 1230 66 +1020 1b 1233 66 +FUNC 1040 1b 10 wmemmove_s +1040 0 1250 66 +1040 1b 1253 66 +FUNC 1060 19 4 std::bad_alloc::bad_alloc(char const *) +1060 13 371 83 +1073 6 372 83 +FUNC 1080 b 0 std::bad_alloc::~bad_alloc() +1080 6 380 83 +1086 5 381 83 +FUNC 1090 24 0 std::bad_alloc::`vector deleting destructor'(unsigned int) +FUNC 10c0 f 8 std::char_traits::assign(wchar_t &,wchar_t const &) +10c0 0 302 70 +10c0 e 303 70 +10ce 1 304 70 +FUNC 10d0 17 4 std::char_traits::length(wchar_t const *) +10d0 0 325 70 +10d0 16 327 70 +10e6 1 328 70 +FUNC 10f0 27 10 std::char_traits::_Copy_s(wchar_t *,unsigned int,wchar_t const *,unsigned int) +10f0 0 340 70 +10f0 23 343 70 +1113 3 344 70 +1116 1 345 70 +FUNC 1120 27 10 std::char_traits::_Move_s(wchar_t *,unsigned int,wchar_t const *,unsigned int) +1120 0 364 70 +1120 23 367 70 +1143 3 368 70 +1146 1 369 70 +FUNC 1150 d 8 std::char_traits::assign(char &,char const &) +1150 0 417 70 +1150 c 418 70 +115c 1 419 70 +FUNC 1160 13 4 std::char_traits::length(char const *) +1160 0 440 70 +1160 12 442 70 +1172 1 443 70 +FUNC 1180 21 10 std::char_traits::_Copy_s(char *,unsigned int,char const *,unsigned int) +1180 0 455 70 +1180 1d 458 70 +119d 3 459 70 +11a0 1 460 70 +FUNC 11b0 21 10 std::char_traits::_Move_s(char *,unsigned int,char const *,unsigned int) +11b0 0 479 70 +11b0 1d 482 70 +11cd 3 483 70 +11d0 1 484 70 +FUNC 11e0 7 0 std::_Iterator_base::_Iterator_base() +11e0 6 441 65 +11e6 1 442 65 +FUNC 11f0 6b 4 std::logic_error::logic_error(std::basic_string,std::allocator > const &) +11f0 56 27 82 +1246 15 28 82 +FUNC 1260 32 0 std::logic_error::~logic_error() +1260 9 31 82 +1269 29 32 82 +FUNC 12a0 e 0 std::logic_error::what() +12a0 0 35 82 +12a0 9 36 82 +12a9 1 37 82 +12aa 3 36 82 +12ad 1 37 82 +FUNC 12b0 47 0 std::logic_error::`scalar deleting destructor'(unsigned int) +FUNC 1300 19 4 std::length_error::length_error(std::basic_string,std::allocator > const &) +1300 13 106 82 +1313 6 107 82 +FUNC 1320 32 0 std::length_error::~length_error() +1320 3 110 82 +1323 2f 111 82 +FUNC 1360 47 0 std::length_error::`vector deleting destructor'(unsigned int) +FUNC 13b0 19 4 std::out_of_range::out_of_range(std::basic_string,std::allocator > const &) +13b0 13 130 82 +13c3 6 131 82 +FUNC 13d0 32 0 std::out_of_range::~out_of_range() +13d0 3 134 82 +13d3 2f 135 82 +FUNC 1410 47 0 std::out_of_range::`vector deleting destructor'(unsigned int) +FUNC 1460 19 4 std::out_of_range::out_of_range(std::out_of_range const &) +FUNC 1480 71 4 std::logic_error::logic_error(std::logic_error const &) +FUNC 1500 1b 8 google_breakpad::WindowsStringUtils::safe_swprintf(wchar_t *,unsigned int,wchar_t const *,...) +1500 0 94 63 +1500 1a 97 63 +151a 1 105 63 +FUNC 1520 35 0 google_breakpad::ExceptionHandler::set_dump_path(std::basic_string,std::allocator > const &) +1520 4 137 43 +1524 f 138 43 +1533 c 139 43 +153f 7 140 43 +1546 1 141 43 +1547 6 139 43 +154d 7 140 43 +1554 1 141 43 +FUNC 1560 20b 14 google_breakpad::ExceptionHandler::ExceptionHandler(std::basic_string,std::allocator > const &,bool (*)(void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *),bool (*)(wchar_t const *,wchar_t const *,void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *,bool),void *,bool) +1560 6d 75 12 +15cd 90 78 12 +165d 9 86 12 +1666 d 87 12 +1673 d 88 12 +1680 1e 96 12 +169e 11 98 12 +16af 7 99 12 +16b6 f 101 12 +16c5 a 104 12 +16cf 8 105 12 +16d7 7 106 12 +16de 7 107 12 +16e5 b 110 12 +16f0 8 114 12 +16f8 25 115 12 +171d d 117 12 +172a b 118 12 +1735 10 121 12 +1745 e 124 12 +1753 18 126 12 +FUNC 1770 274 0 google_breakpad::ExceptionHandler::~ExceptionHandler() +1770 e 128 12 +177e a 129 12 +1788 7 130 12 +178f a 133 12 +1799 b 134 12 +17a4 a 136 12 +17ae 9 139 12 +17b7 63 142 12 +181a 23 143 12 +183d 5 144 12 +1842 13 147 12 +1855 2b 149 12 +1880 2a 151 12 +18aa 17 152 12 +18c1 2c 153 12 +18ed 19 151 12 +1906 11 158 12 +1917 23 161 12 +193a 6 162 12 +1940 d 165 12 +194d f 169 12 +195c d 170 12 +1969 f 171 12 +1978 9 172 12 +1981 63 173 12 +FUNC 19f0 31 0 std::vector >::`scalar deleting destructor'(unsigned int) +FUNC 1a30 51 4 google_breakpad::ExceptionHandler::ExceptionHandlerThreadMain(void *) +1a30 13 176 12 +1a43 f 182 12 +1a52 1a 185 12 +1a6c 13 188 12 +1a7f 2 190 12 +FUNC 1a90 c7 4 google_breakpad::AutoExceptionHandler::AutoExceptionHandler() +1a90 7 204 12 +1a97 b 221 12 +1aa2 82 224 12 +1b24 d 225 12 +1b31 c 229 12 +1b3d e 231 12 +1b4b c 233 12 +FUNC 1b60 36 0 google_breakpad::AutoExceptionHandler::~AutoExceptionHandler() +1b60 0 235 12 +1b60 b 237 12 +1b6b d 239 12 +1b78 b 242 12 +1b83 7 243 12 +1b8a b 244 12 +1b95 1 245 12 +FUNC 1ba0 3 0 google_breakpad::AutoExceptionHandler::get_handler() +1ba0 3 247 12 +FUNC 1bb0 c4 4 google_breakpad::ExceptionHandler::HandleException(_EXCEPTION_POINTERS *) +1bb0 2b 254 12 +1bdb a 255 12 +1be5 f 262 12 +1bf4 1e 265 12 +1c12 5 273 12 +1c17 2 274 12 +1c19 7 283 12 +1c20 5 284 12 +1c25 2 285 12 +1c27 2 286 12 +1c29 37 290 12 +1c60 14 291 12 +FUNC 1c80 121 14 google_breakpad::ExceptionHandler::HandleInvalidParameter(wchar_t const *,wchar_t const *,wchar_t const *,unsigned int,unsigned int) +1c80 40 299 12 +1cc0 b7 319 12 +1d77 7 320 12 +1d7e 14 323 12 +1d92 2 324 12 +1d94 5 337 12 +1d99 8 345 12 +FUNC 1db0 81 8 google_breakpad::ExceptionHandler::WriteMinidumpOnHandlerThread(_EXCEPTION_POINTERS *,MDRawAssertionInfo *) +1db0 2 350 12 +1db2 d 351 12 +1dbf 6 354 12 +1dc5 2b 359 12 +1df0 f 362 12 +1dff 6 363 12 +1e05 26 370 12 +1e2b 3 372 12 +1e2e 3 373 12 +FUNC 1e40 1d 0 google_breakpad::ExceptionHandler::WriteMinidump() +1e40 3 375 12 +1e43 b 376 12 +1e4e b 377 12 +1e59 3 378 12 +1e5c 1 379 12 +FUNC 1e60 a2 4 google_breakpad::ExceptionHandler::WriteMinidump(std::basic_string,std::allocator > const &,bool (*)(wchar_t const *,wchar_t const *,void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *,bool),void *) +1e60 41 384 12 +1ea1 10 385 12 +1eb1 2a 386 12 +1edb 27 387 12 +FUNC 1f10 142 c google_breakpad::ExceptionHandler::WriteMinidumpWithException(unsigned long,_EXCEPTION_POINTERS *,MDRawAssertionInfo *) +1f10 0 392 12 +1f10 22 399 12 +1f32 7 466 12 +1f39 2 403 12 +1f3b e 404 12 +1f49 1f 411 12 +1f68 9 412 12 +1f71 8 414 12 +1f79 4 415 12 +1f7d 8 416 12 +1f85 8 426 12 +1f8d a 427 12 +1f97 34 440 12 +1fcb 8 441 12 +1fd3 8 442 12 +1fdb 4 443 12 +1fdf 8 444 12 +1fe7 30 454 12 +2017 c 456 12 +2023 7 460 12 +202a 1e 462 12 +2048 4 465 12 +204c 6 466 12 +FUNC 2060 138 0 google_breakpad::ExceptionHandler::UpdateNextID() +2060 38 468 12 +2098 b 470 12 +20a3 4a 471 12 +20ed 25 472 12 +2112 1c 477 12 +212e 31 478 12 +215f 14 479 12 +2173 25 480 12 +FUNC 21a0 3b 4 std::basic_string,std::allocator >::basic_string,std::allocator >(char const *) +21a0 0 650 17 +21a0 35 652 17 +21d5 6 653 17 +FUNC 21e0 25 4 std::basic_string,std::allocator >::basic_string,std::allocator >(std::basic_string,std::allocator > const &) +21e0 1 720 17 +21e1 4 721 17 +21e5 1a 722 17 +21ff 6 723 17 +FUNC 2210 26 0 std::basic_string,std::allocator >::~basic_string,std::allocator >() +2210 3 904 17 +2213 22 905 17 +2235 1 906 17 +FUNC 2240 e 0 std::basic_string,std::allocator >::c_str() +2240 0 1621 17 +2240 9 1622 17 +2249 1 1623 17 +224a 3 1622 17 +224d 1 1623 17 +FUNC 2250 4 0 std::basic_string,std::allocator >::size() +2250 0 1636 17 +2250 3 1637 17 +2253 1 1638 17 +FUNC 2260 11 0 std::basic_string,std::allocator >::basic_string,std::allocator >() +2260 0 564 17 +2260 10 565 17 +2270 1 566 17 +FUNC 2280 27 0 std::basic_string,std::allocator >::~basic_string,std::allocator >() +2280 3 904 17 +2283 23 905 17 +22a6 1 906 17 +FUNC 22b0 b 0 std::basic_string,std::allocator >::operator=(std::basic_string,std::allocator > const &) +22b0 0 914 17 +22b0 a 915 17 +22ba 1 916 17 +FUNC 22c0 24 4 std::basic_string,std::allocator >::operator=(wchar_t const *) +22c0 0 919 17 +22c0 21 920 17 +22e1 3 921 17 +FUNC 22f0 e 0 std::basic_string,std::allocator >::c_str() +22f0 0 1621 17 +22f0 9 1622 17 +22f9 1 1623 17 +22fa 3 1622 17 +22fd 1 1623 17 +FUNC 2300 c 0 std::vector >::vector >() +2300 0 457 23 +2300 b 458 23 +230b 1 459 23 +FUNC 2310 26 0 std::vector >::~vector >() +2310 0 545 23 +2310 25 546 23 +2335 1 547 23 +FUNC 2340 1d 0 std::vector >::begin() +2340 1 627 23 +2341 1b 628 23 +235c 1 629 23 +FUNC 2360 1d 0 std::vector >::end() +2360 1 637 23 +2361 1b 638 23 +237c 1 639 23 +FUNC 2380 13 0 std::vector >::size() +2380 0 702 23 +2380 9 703 23 +2389 1 704 23 +238a 8 703 23 +2392 1 704 23 +FUNC 23a0 23 0 std::vector >::empty() +23a0 0 712 23 +23a0 10 713 23 +23b0 1 714 23 +23b1 11 713 23 +23c2 1 714 23 +FUNC 23d0 56 0 std::vector >::at(unsigned int) +23d0 b 729 23 +23db 15 730 23 +23f0 5 731 23 +23f5 29 732 23 +241e 8 733 23 +FUNC 2430 47 0 std::vector >::back() +2430 c 776 23 +243c 32 777 23 +246e 9 778 23 +FUNC 2480 68 0 std::vector >::push_back(google_breakpad::ExceptionHandler * const &) +2480 10 786 23 +2490 24 787 23 +24b4 d 796 23 +24c1 6 801 23 +24c7 1b 800 23 +24e2 6 801 23 +FUNC 24f0 23 0 std::vector >::pop_back() +24f0 6 818 23 +24f6 15 819 23 +250b 6 822 23 +2511 2 824 23 +FUNC 2520 3f 8 std::vector >::erase(std::_Vector_iterator >) +2520 7 996 23 +2527 24 998 23 +254b 11 1001 23 +255c 3 1002 23 +FUNC 2560 20 0 std::_Vector_iterator >::operator*() +2560 0 325 23 +2560 1c 326 23 +257c 1 327 23 +257d 2 326 23 +257f 1 327 23 +FUNC 2580 20 0 std::_Vector_iterator >::operator++() +2580 0 335 23 +2580 1d 336 23 +259d 2 337 23 +259f 1 338 23 +FUNC 25a0 1d 0 std::_Vector_const_iterator >::operator!=(std::_Vector_const_iterator > const &) +25a0 0 202 23 +25a0 1c 203 23 +25bc 1 204 23 +FUNC 25c0 da c std::basic_string,std::allocator >::assign(std::basic_string,std::allocator > const &,unsigned int,unsigned int) +25c0 1 1038 17 +25c1 12 1039 17 +25d3 5 1040 17 +25d8 3 1041 17 +25db a 1042 17 +25e5 2 1043 17 +25e7 4 1045 17 +25eb 17 1046 17 +2602 5 1052 17 +2607 3 1053 17 +260a 21 1047 17 +262b b 1049 17 +2636 13 1047 17 +2649 5 1052 17 +264e 3 1053 17 +2651 7 1047 17 +2658 5 1052 17 +265d 3 1053 17 +2660 22 1049 17 +2682 10 1050 17 +2692 5 1052 17 +2697 3 1053 17 +FUNC 26a0 27 4 std::basic_string,std::allocator >::assign(char const *) +26a0 1 1069 17 +26a1 23 1070 17 +26c4 3 1071 17 +FUNC 26d0 4a 8 std::basic_string,std::allocator >::_Tidy(bool,unsigned int) +26d0 0 2066 17 +26d0 f 2067 17 +26df 6 2069 17 +26e5 a 2072 17 +26ef d 2073 17 +26fc a 2074 17 +2706 11 2077 17 +2717 3 2078 17 +FUNC 2720 e 0 std::basic_string,std::allocator >::_Myptr() +2720 0 2092 17 +2720 9 2093 17 +2729 1 2094 17 +272a 3 2093 17 +272d 1 2094 17 +FUNC 2730 5 4 std::_String_val >::_String_val >(std::allocator) +2730 2 471 17 +2732 3 472 17 +FUNC 2740 5 4 std::_String_val >::_String_val >(std::_String_val > const &) +2740 2 477 17 +2742 3 484 17 +FUNC 2750 3 0 std::allocator::allocator() +2750 2 120 19 +2752 1 122 19 +FUNC 2760 b 0 std::basic_string,std::allocator >::assign(std::basic_string,std::allocator > const &) +2760 0 1032 17 +2760 a 1033 17 +276a 1 1034 17 +FUNC 2770 ef c std::basic_string,std::allocator >::assign(std::basic_string,std::allocator > const &,unsigned int,unsigned int) +2770 1 1038 17 +2771 12 1039 17 +2783 5 1040 17 +2788 3 1041 17 +278b a 1042 17 +2795 2 1043 17 +2797 4 1045 17 +279b 17 1046 17 +27b2 5 1052 17 +27b7 3 1053 17 +27ba 24 1047 17 +27de b 1049 17 +27e9 13 1047 17 +27fc 5 1052 17 +2801 3 1053 17 +2804 9 1047 17 +280d 5 1052 17 +2812 3 1053 17 +2815 2f 1049 17 +2844 13 1050 17 +2857 5 1052 17 +285c 3 1053 17 +FUNC 2860 2b 4 std::basic_string,std::allocator >::assign(wchar_t const *) +2860 1 1069 17 +2861 27 1070 17 +2888 3 1071 17 +FUNC 2890 4f 8 std::basic_string,std::allocator >::_Tidy(bool,unsigned int) +2890 0 2066 17 +2890 f 2067 17 +289f 6 2069 17 +28a5 a 2072 17 +28af 10 2073 17 +28bf a 2074 17 +28c9 13 2077 17 +28dc 3 2078 17 +FUNC 28e0 e 0 std::basic_string,std::allocator >::_Myptr() +28e0 0 2092 17 +28e0 9 2093 17 +28e9 1 2094 17 +28ea 3 2093 17 +28ed 1 2094 17 +FUNC 28f0 5 4 std::_String_val >::_String_val >(std::allocator) +28f0 2 471 17 +28f2 3 472 17 +FUNC 2900 3 0 std::allocator::allocator() +2900 2 120 19 +2902 1 122 19 +FUNC 2910 13 0 std::vector >::capacity() +2910 0 621 23 +2910 9 622 23 +2919 1 623 23 +291a 8 622 23 +2922 1 623 23 +FUNC 2930 86 c std::vector >::insert(std::_Vector_iterator >,google_breakpad::ExceptionHandler * const &) +2930 3 852 23 +2933 3e 853 23 +2971 11 854 23 +2982 2a 855 23 +29ac a 856 23 +FUNC 29c0 23 0 std::vector >::_Buy(unsigned int) +29c0 0 1066 23 +29c0 8 1070 23 +29c8 5 1071 23 +29cd a 1074 23 +29d7 3 1075 23 +29da 6 1076 23 +29e0 2 1078 23 +29e2 1 1079 23 +FUNC 29f0 1 0 std::vector >::_Destroy(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *) +29f0 0 1082 23 +29f0 1 1084 23 +FUNC 2a00 26 0 std::vector >::_Tidy() +2a00 0 1087 23 +2a00 7 1088 23 +2a07 9 1096 23 +2a10 15 1098 23 +2a25 1 1099 23 +FUNC 2a30 23 0 std::vector >::_Ufill(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &) +2a30 0 1207 23 +2a30 1f 1208 23 +2a4f 3 1209 23 +2a52 1 1210 23 +FUNC 2a60 76 0 std::vector >::_Xran() +2a60 23 1218 23 +2a83 53 1219 23 +FUNC 2ae0 3 4 std::_Vector_val >::_Vector_val >(std::allocator) +2ae0 0 412 23 +2ae0 3 413 23 +FUNC 2af0 1 0 std::allocator::allocator() +2af0 0 120 19 +2af0 1 122 19 +FUNC 2b00 21 0 std::_Vector_iterator >::_Vector_iterator >(google_breakpad::ExceptionHandler * *,std::_Container_base const *) +2b00 1e 314 23 +2b1e 3 315 23 +FUNC 2b30 32 4 std::_Vector_iterator >::operator+(int) +2b30 1 367 23 +2b31 2 368 23 +2b33 26 369 23 +2b59 9 370 23 +FUNC 2b70 2f 0 std::_Vector_iterator >::operator-(int) +2b70 1 378 23 +2b71 2 379 23 +2b73 25 380 23 +2b98 7 381 23 +FUNC 2ba0 20 0 std::_Vector_const_iterator >::operator*() +2ba0 0 92 23 +2ba0 a 103 23 +2baa f 104 23 +2bb9 3 107 23 +2bbc 1 108 23 +2bbd 2 107 23 +2bbf 1 108 23 +FUNC 2bc0 20 0 std::_Vector_const_iterator >::operator++() +2bc0 0 116 23 +2bc0 a 117 23 +2bca f 118 23 +2bd9 4 119 23 +2bdd 2 120 23 +2bdf 1 121 23 +FUNC 2be0 1d 0 std::_Vector_const_iterator >::operator==(std::_Vector_const_iterator > const &) +2be0 0 190 23 +2be0 f 195 23 +2bef d 198 23 +2bfc 1 199 23 +FUNC 2c00 c1 8 std::basic_string,std::allocator >::assign(char const *,unsigned int) +2c00 5 1056 17 +2c05 2d 1057 17 +2c32 1a 1058 17 +2c4c 4 1066 17 +2c50 25 1060 17 +2c75 c 1062 17 +2c81 f 1060 17 +2c90 8 1065 17 +2c98 3 1066 17 +2c9b e 1062 17 +2ca9 10 1063 17 +2cb9 5 1065 17 +2cbe 3 1066 17 +FUNC 2cd0 83 8 std::basic_string,std::allocator >::erase(unsigned int,unsigned int) +2cd0 1 1240 17 +2cd1 d 1241 17 +2cde 5 1242 17 +2ce3 d 1243 17 +2cf0 2 1244 17 +2cf2 4 1245 17 +2cf6 3c 1248 17 +2d32 8 1249 17 +2d3a 12 1250 17 +2d4c 4 1252 17 +2d50 3 1253 17 +FUNC 2d60 1f 4 std::basic_string,std::allocator >::_Eos(unsigned int) +2d60 0 2030 17 +2d60 14 2031 17 +2d74 3 2032 17 +2d77 5 2031 17 +2d7c 3 2032 17 +FUNC 2d80 bc 8 std::basic_string,std::allocator >::_Grow(unsigned int,bool) +2d80 1 2036 17 +2d81 c 2037 17 +2d8d 5 2038 17 +2d92 7 2039 17 +2d99 c 2040 17 +2da5 a 2046 17 +2daf 3 2047 17 +2db2 d 2041 17 +2dbf 39 2043 17 +2df8 10 2046 17 +2e08 3 2047 17 +2e0b 4 2044 17 +2e0f b 2045 17 +2e1a c 2046 17 +2e26 3 2047 17 +2e29 6 2045 17 +2e2f a 2046 17 +2e39 3 2047 17 +FUNC 2e40 e 0 std::basic_string,std::allocator >::_Myptr() +2e40 0 2087 17 +2e40 9 2088 17 +2e49 1 2089 17 +2e4a 3 2088 17 +2e4d 1 2089 17 +FUNC 2e50 5 4 std::allocator::allocator(std::allocator const &) +2e50 2 124 19 +2e52 3 126 19 +FUNC 2e60 e 8 std::allocator::deallocate(char *,unsigned int) +2e60 0 140 19 +2e60 b 141 19 +2e6b 3 142 19 +FUNC 2e70 da 8 std::basic_string,std::allocator >::assign(wchar_t const *,unsigned int) +2e70 4 1056 17 +2e74 31 1057 17 +2ea5 1d 1058 17 +2ec2 3 1066 17 +2ec5 28 1060 17 +2eed d 1062 17 +2efa 10 1060 17 +2f0a a 1065 17 +2f14 3 1066 17 +2f17 18 1062 17 +2f2f 14 1063 17 +2f43 4 1065 17 +2f47 3 1066 17 +FUNC 2f50 97 8 std::basic_string,std::allocator >::erase(unsigned int,unsigned int) +2f50 1 1240 17 +2f51 d 1241 17 +2f5e 5 1242 17 +2f63 d 1243 17 +2f70 2 1244 17 +2f72 4 1245 17 +2f76 4d 1248 17 +2fc3 8 1249 17 +2fcb 15 1250 17 +2fe0 4 1252 17 +2fe4 3 1253 17 +FUNC 2ff0 4 0 std::basic_string,std::allocator >::size() +2ff0 0 1636 17 +2ff0 3 1637 17 +2ff3 1 1638 17 +FUNC 3000 23 4 std::basic_string,std::allocator >::_Eos(unsigned int) +3000 0 2030 17 +3000 16 2031 17 +3016 3 2032 17 +3019 7 2031 17 +3020 3 2032 17 +FUNC 3030 c7 8 std::basic_string,std::allocator >::_Grow(unsigned int,bool) +3030 1 2036 17 +3031 f 2037 17 +3040 5 2038 17 +3045 7 2039 17 +304c c 2040 17 +3058 a 2046 17 +3062 3 2047 17 +3065 d 2041 17 +3072 3c 2043 17 +30ae 12 2046 17 +30c0 3 2047 17 +30c3 4 2044 17 +30c7 b 2045 17 +30d2 d 2046 17 +30df 3 2047 17 +30e2 8 2045 17 +30ea a 2046 17 +30f4 3 2047 17 +FUNC 3100 e 0 std::basic_string,std::allocator >::_Myptr() +3100 0 2087 17 +3100 9 2088 17 +3109 1 2089 17 +310a 3 2088 17 +310d 1 2089 17 +FUNC 3110 5 4 std::allocator::allocator(std::allocator const &) +3110 2 124 19 +3112 3 126 19 +FUNC 3120 e 8 std::allocator::deallocate(wchar_t *,unsigned int) +3120 0 140 19 +3120 b 141 19 +312b 3 142 19 +FUNC 3130 6 0 std::vector >::max_size() +3130 0 707 23 +3130 5 708 23 +3135 1 709 23 +FUNC 3140 208 8 std::vector >::_Insert_n(std::_Vector_iterator >,unsigned int,google_breakpad::ExceptionHandler * const &) +3140 6 1117 23 +3146 2 1125 23 +3148 1c 1126 23 +3164 1c 1130 23 +3180 5 1131 23 +3185 1b 1132 23 +31a0 23 1135 23 +31c3 17 1136 23 +31da 19 1137 23 +31f3 7 1138 23 +31fa 25 1143 23 +321f 7 1144 23 +3226 1e 1145 23 +3244 13 1152 23 +3257 4 1153 23 +325b 9 1156 23 +3264 7 1163 23 +326b a 1164 23 +3275 3 1165 23 +3278 a 1204 23 +3282 13 1167 23 +3295 17 1170 23 +32ac 1a 1174 23 +32c6 7 1180 23 +32cd 16 1187 23 +32e3 a 1204 23 +32ed 2a 1193 23 +3317 e 1200 23 +3325 19 1202 23 +333e a 1204 23 +FUNC 3350 7c 0 std::vector >::_Xlen() +3350 29 1213 23 +3379 53 1214 23 +FUNC 33d0 1 0 std::allocator::allocator(std::allocator const &) +33d0 0 124 19 +33d0 1 126 19 +FUNC 33e0 8 0 std::allocator::deallocate(google_breakpad::ExceptionHandler * *,unsigned int) +33e0 0 140 19 +33e0 7 141 19 +33e7 1 142 19 +FUNC 33f0 56 0 std::allocator::allocate(unsigned int) +33f0 3 145 19 +33f3 16 146 19 +3409 4 147 19 +340d 39 146 19 +FUNC 3450 32 4 std::_Vector_iterator >::operator+=(int) +3450 0 361 23 +3450 2c 362 23 +347c 3 363 23 +347f 3 364 23 +FUNC 3490 28 0 std::_Vector_iterator >::operator-=(int) +3490 0 373 23 +3490 27 374 23 +34b7 1 375 23 +FUNC 34c0 19 0 std::_Vector_iterator >::operator-(std::_Vector_const_iterator > const &) +34c0 0 384 23 +34c0 18 385 23 +34d8 1 386 23 +FUNC 34e0 21 0 std::_Vector_const_iterator >::_Vector_const_iterator >(google_breakpad::ExceptionHandler * *,std::_Container_base const *) +34e0 0 77 23 +34e0 19 79 23 +34f9 2 80 23 +34fb 3 81 23 +34fe 3 82 23 +FUNC 3510 19 4 std::length_error::length_error(std::length_error const &) +FUNC 3530 7 0 std::_Ranit::_Ranit() +FUNC 3540 6 0 std::basic_string,std::allocator >::max_size() +3540 0 1641 17 +3540 5 1643 17 +3545 1 1644 17 +FUNC 3550 171 8 std::basic_string,std::allocator >::_Copy(unsigned int,unsigned int) +3550 30 2000 17 +3580 8 2001 17 +3588 5 2002 17 +358d 2 2003 17 +358f 2 2004 17 +3591 1f 2005 17 +35b0 3 2006 17 +35b3 2 2009 17 +35b5 18 2010 17 +35cd 2 2019 17 +35cf 30 2010 17 +35ff 3 2012 17 +3602 19 2014 17 +361b c 2019 17 +3627 7 2021 17 +362e 20 2022 17 +364e 12 2023 17 +3660 1c 2026 17 +367c 14 2027 17 +3690 15 2016 17 +36a5 1c 2017 17 +FUNC 36d0 39 4 std::basic_string,std::allocator >::_Inside(char const *) +36d0 1 2050 17 +36d1 2b 2052 17 +36fc 3 2055 17 +36ff 4 2056 17 +3703 3 2053 17 +3706 3 2056 17 +FUNC 3710 6 0 std::basic_string,std::allocator >::max_size() +3710 0 1641 17 +3710 5 1643 17 +3715 1 1644 17 +FUNC 3720 17b 8 std::basic_string,std::allocator >::_Copy(unsigned int,unsigned int) +3720 30 2000 17 +3750 8 2001 17 +3758 8 2002 17 +3760 2 2003 17 +3762 2 2004 17 +3764 1f 2005 17 +3783 3 2006 17 +3786 2 2009 17 +3788 1b 2010 17 +37a3 2 2019 17 +37a5 30 2010 17 +37d5 3 2012 17 +37d8 19 2014 17 +37f1 c 2019 17 +37fd 7 2021 17 +3804 24 2022 17 +3828 12 2023 17 +383a 20 2026 17 +385a 14 2027 17 +386e 17 2016 17 +3885 16 2017 17 +FUNC 38a0 3a 4 std::basic_string,std::allocator >::_Inside(wchar_t const *) +38a0 1 2050 17 +38a1 2c 2052 17 +38cd 3 2055 17 +38d0 4 2056 17 +38d4 3 2053 17 +38d7 3 2056 17 +FUNC 38e0 6 0 std::allocator::max_size() +38e0 0 165 19 +38e0 5 167 19 +38e5 1 168 19 +FUNC 38f0 32 4 std::_Vector_const_iterator >::operator+=(int) +38f0 0 146 23 +38f0 a 147 23 +38fa 1a 148 23 +3914 5 150 23 +3919 3 151 23 +391c 3 152 23 +391f 3 153 23 +FUNC 3930 19 0 std::_Vector_const_iterator >::operator-(std::_Vector_const_iterator > const &) +3930 0 173 23 +3930 f 178 23 +393f 9 181 23 +3948 1 182 23 +FUNC 3950 56 4 std::allocator::allocate(unsigned int) +3950 0 145 19 +3950 16 146 19 +3966 6 147 19 +396c 3a 146 19 +FUNC 39b0 4 0 std::allocator::max_size() +39b0 0 165 19 +39b0 3 167 19 +39b3 1 168 19 +FUNC 39c0 59 4 std::allocator::allocate(unsigned int) +39c0 0 145 19 +39c0 19 146 19 +39d9 6 147 19 +39df 3a 146 19 +FUNC 3a20 6 0 std::allocator::max_size() +3a20 0 165 19 +3a20 5 167 19 +3a25 1 168 19 +FUNC 3a30 21 10 std::_Traits_helper::copy_s >(char *,unsigned int,char const *,unsigned int) +3a30 0 581 70 +3a30 20 582 70 +3a50 1 583 70 +FUNC 3a60 27 10 std::_Traits_helper::copy_s >(wchar_t *,unsigned int,wchar_t const *,unsigned int) +3a60 0 581 70 +3a60 26 582 70 +3a86 1 583 70 +FUNC 3a90 24 0 stdext::unchecked_copy(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *) +3a90 0 3407 65 +3a90 23 3409 65 +3ab3 1 3410 65 +FUNC 3ac0 1 0 std::_Destroy_range >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &) +3ac0 0 225 19 +3ac0 1 227 19 +FUNC 3ad0 15 0 stdext::unchecked_uninitialized_fill_n >(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::allocator &) +3ad0 0 914 24 +3ad0 14 916 24 +3ae4 1 917 24 +FUNC 3af0 21 10 std::_Traits_helper::move_s >(char *,unsigned int,char const *,unsigned int) +3af0 0 608 70 +3af0 20 609 70 +3b10 1 610 70 +FUNC 3b20 27 10 std::_Traits_helper::move_s >(wchar_t *,unsigned int,wchar_t const *,unsigned int) +3b20 0 608 70 +3b20 26 609 70 +3b46 1 610 70 +FUNC 3b50 22 0 std::vector >::_Umove(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *) +3b50 0 1109 23 +3b50 21 1112 23 +3b71 1 1113 23 +FUNC 3b80 10 0 std::fill(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * const &) +3b80 0 2976 65 +3b80 f 2977 65 +3b8f 1 2978 65 +FUNC 3b90 25 0 stdext::_Unchecked_move_backward(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *) +3b90 0 3497 65 +3b90 24 3499 65 +3bb4 1 3500 65 +FUNC 3bc0 4f 0 std::_Allocate(unsigned int,google_breakpad::ExceptionHandler * *) +3bc0 0 37 19 +3bc0 f 40 19 +3bcf 2c 41 19 +3bfb 10 44 19 +3c0b 4 45 19 +FUNC 3c10 54 8 std::_Allocate(unsigned int,char *) +3c10 0 37 19 +3c10 b 38 19 +3c1b 2 39 19 +3c1d 9 44 19 +3c26 4 45 19 +3c2a c 40 19 +3c36 2e 41 19 +FUNC 3c70 57 8 std::_Allocate(unsigned int,wchar_t *) +3c70 0 37 19 +3c70 b 38 19 +3c7b 2 39 19 +3c7d c 44 19 +3c89 4 45 19 +3c8d c 40 19 +3c99 2e 41 19 +FUNC 3cd0 19 4 std::bad_alloc::bad_alloc(std::bad_alloc const &) +FUNC 3cf0 7 0 std::_Char_traits_cat >() +3cf0 1 568 70 +3cf1 4 570 70 +3cf5 2 571 70 +FUNC 3d00 21 14 std::_Traits_helper::copy_s >(char *,unsigned int,char const *,unsigned int,std::_Secure_char_traits_tag) +3d00 0 589 70 +3d00 20 590 70 +3d20 1 591 70 +FUNC 3d30 7 0 std::_Char_traits_cat >() +3d30 1 568 70 +3d31 4 570 70 +3d35 2 571 70 +FUNC 3d40 27 14 std::_Traits_helper::copy_s >(wchar_t *,unsigned int,wchar_t const *,unsigned int,std::_Secure_char_traits_tag) +3d40 0 589 70 +3d40 26 590 70 +3d66 1 591 70 +FUNC 3d70 3 0 std::_Checked_base(google_breakpad::ExceptionHandler * * &) +3d70 0 1009 65 +3d70 2 1011 65 +3d72 1 1012 65 +FUNC 3d80 1 0 std::_Iter_random(google_breakpad::ExceptionHandler * * const &,google_breakpad::ExceptionHandler * * const &) +3d80 0 839 65 +3d80 1 844 65 +FUNC 3d90 7 0 std::_Ptr_cat(google_breakpad::ExceptionHandler * * &,google_breakpad::ExceptionHandler * * &) +3d90 1 1329 65 +3d91 4 1331 65 +3d95 2 1332 65 +FUNC 3da0 15 4 std::_Copy_opt(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag) +3da0 0 2288 65 +3da0 d 2300 65 +3dad 7 2301 65 +3db4 1 2302 65 +FUNC 3dc0 1 4 std::_Destroy_range >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &,std::_Scalar_ptr_iterator_tag) +3dc0 0 242 19 +3dc0 1 243 19 +FUNC 3dd0 15 8 std::_Uninit_fill_n >(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::allocator &,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag) +3dd0 0 415 24 +3dd0 14 416 24 +3de4 1 417 24 +FUNC 3df0 21 14 std::_Traits_helper::move_s >(char *,unsigned int,char const *,unsigned int,std::_Secure_char_traits_tag) +3df0 0 616 70 +3df0 20 617 70 +3e10 1 618 70 +FUNC 3e20 27 14 std::_Traits_helper::move_s >(wchar_t *,unsigned int,wchar_t const *,unsigned int,std::_Secure_char_traits_tag) +3e20 0 616 70 +3e20 26 617 70 +3e46 1 618 70 +FUNC 3e50 22 0 stdext::_Unchecked_uninitialized_move >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &) +3e50 0 843 24 +3e50 21 845 24 +3e71 1 846 24 +FUNC 3e80 10 0 std::_Fill(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * const &) +3e80 0 2946 65 +3e80 6 2948 65 +3e86 9 2949 65 +3e8f 1 2950 65 +FUNC 3e90 7 0 std::_Move_cat(google_breakpad::ExceptionHandler * * const &) +3e90 1 1046 65 +3e91 4 1048 65 +3e95 2 1049 65 +FUNC 3ea0 25 c std::_Move_backward_opt(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Undefined_move_tag,std::_Range_checked_iterator_tag) +3ea0 0 2546 65 +3ea0 24 2548 65 +3ec4 1 2549 65 +FUNC 3ed0 3 4 std::_Checked_base(google_breakpad::ExceptionHandler * * &,std::_Unchanged_checked_iterator_base_type_tag) +3ed0 0 992 65 +3ed0 2 993 65 +3ed2 1 994 65 +FUNC 3ee0 15 0 stdext::unchecked_fill_n(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &) +3ee0 0 3523 65 +3ee0 14 3524 65 +3ef4 1 3525 65 +FUNC 3f00 22 8 std::_Uninit_move,std::_Undefined_move_tag>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &,std::_Undefined_move_tag,std::_Range_checked_iterator_tag) +3f00 0 205 24 +3f00 21 206 24 +3f21 1 207 24 +FUNC 3f30 13 0 std::_Copy_backward_opt(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag) +3f30 0 2492 65 +3f30 10 2506 65 +3f40 2 2507 65 +3f42 1 2508 65 +FUNC 3f50 1 0 std::_Iter_cat(google_breakpad::ExceptionHandler * * const &) +3f50 0 798 65 +3f50 1 801 65 +FUNC 3f60 15 8 std::_Fill_n(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::random_access_iterator_tag,std::_Range_checked_iterator_tag) +3f60 0 3040 65 +3f60 14 3044 65 +3f74 1 3045 65 +FUNC 3f80 22 0 stdext::unchecked_uninitialized_copy >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &) +3f80 0 803 24 +3f80 21 805 24 +3fa1 1 806 24 +FUNC 3fb0 15 4 std::_Fill_n(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::_Range_checked_iterator_tag) +3fb0 0 2986 65 +3fb0 5 2987 65 +3fb5 f 2988 65 +3fc4 1 2989 65 +FUNC 3fd0 15 4 std::_Uninit_copy >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator &,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag) +3fd0 0 144 24 +3fd0 d 150 24 +3fdd 7 151 24 +3fe4 1 152 24 +FUNC 3ff0 13 4 vswprintf +3ff0 0 50 147 +3ff0 12 51 147 +4002 1 52 147 +FUNC 4010 ae 4 google_breakpad::GUIDString::GUIDToWString(_GUID *) +4010 12 43 126 +4022 51 51 126 +4073 3a 52 126 +40ad 11 53 126 +FUNC 40c0 ae 4 google_breakpad::GUIDString::GUIDToSymbolServerWString(_GUID *) +40c0 12 56 126 +40d2 51 64 126 +4123 3a 65 126 +415d 11 66 126 +FUNC 4170 40 4 std::basic_string,std::allocator >::basic_string,std::allocator >(wchar_t const *) +4170 0 650 143 +4170 3a 652 143 +41aa 6 653 143 +FUNC 41b0 86 8 main +41b0 13 63 178 +41c3 38 64 178 +41fb 5 65 178 +4200 d 66 178 +420d 1b 67 178 +4228 e 68 178 +FUNC 4240 41 18 `anonymous namespace'::callback +4240 3 45 178 +4243 8 46 178 +424b 11 47 178 +425c 2 48 178 +425e d 49 178 +426b 11 51 178 +427c 3 53 178 +427f 2 54 178 +FUNC 4290 18 0 `anonymous namespace'::CrashFunction +4290 4 56 178 +4294 7 57 178 +429b 9 58 178 +42a4 4 59 178 +FUNC 42ae 18 4 std::invalid_argument::invalid_argument(std::basic_string,std::allocator > const &) +42ae 12 82 298 +42c0 6 83 298 +FUNC 42c6 b 0 std::invalid_argument::~invalid_argument() +42c6 6 86 298 +42cc 5 87 298 +FUNC 42d1 22 0 std::invalid_argument::`vector deleting destructor'(unsigned int) +FUNC 42f3 3f 0 std::_String_base::_Xlen() +42f3 c 12 291 +42ff 33 13 291 +FUNC 4332 3f 0 std::_String_base::_Xran() +4332 c 17 291 +433e 33 18 291 +FUNC 4371 3f 0 std::_String_base::_Xinvarg() +4371 c 22 291 +437d 33 23 291 +FUNC 43b0 18 4 std::invalid_argument::invalid_argument(std::invalid_argument const &) +FUNC 43c8 af 4 printf +43c8 c 49 1601 +43d4 2b 54 1601 +43ff 14 58 1601 +4413 3 59 1601 +4416 10 61 1601 +4426 18 63 1601 +443e 11 65 1601 +444f c 68 1601 +445b 3 72 1601 +445e 6 73 1601 +4464 13 69 1601 +FUNC 4477 16 8 _printf_l +4477 0 80 1601 +4477 15 85 1601 +448c 1 86 1601 +FUNC 448d 16 8 _printf_s_l +448d 0 94 1601 +448d 15 99 1601 +44a2 1 100 1601 +FUNC 44a3 14 4 printf_s +44a3 0 106 1601 +44a3 13 111 1601 +44b6 1 112 1601 +FUNC 44b7 16 8 _printf_p_l +44b7 0 119 1601 +44b7 15 124 1601 +44cc 1 125 1601 +FUNC 44cd 14 4 _printf_p +44cd 0 131 1601 +44cd 13 136 1601 +44e0 1 137 1601 +FUNC 44e1 25 4 _set_printf_count_output +44e1 0 154 1601 +44e1 6 155 1601 +44e7 1e 156 1601 +4505 1 158 1601 +FUNC 4506 16 0 _get_printf_count_output +4506 0 167 1601 +4506 15 168 1601 +451b 1 169 1601 +FUNC 451c f 0 __security_check_cookie +451c 0 52 4397 +451c 6 55 4397 +4522 2 56 4397 +4524 2 57 4397 +4526 5 59 4397 +FUNC 452b 62 4 _flush +452b 2 142 1704 +452d 25 152 1704 +4552 16 154 1704 +4568 7 158 1704 +456f 6 159 1704 +4575 2 161 1704 +4577 4 162 1704 +457b 4 163 1704 +457f 3 167 1704 +4582 7 168 1704 +4589 3 170 1704 +458c 1 171 1704 +FUNC 458d 42 4 _fflush_nolock +458d 1 98 1704 +458e 8 102 1704 +4596 8 103 1704 +459e 1 116 1704 +459f b 106 1704 +45aa 4 108 1704 +45ae 1 116 1704 +45af 8 112 1704 +45b7 13 113 1704 +45ca 1 116 1704 +45cb 3 115 1704 +45ce 1 116 1704 +FUNC 45cf da 4 flsall +45cf c 228 1704 +45db 5 230 1704 +45e0 3 231 1704 +45e3 8 233 1704 +45eb 3 234 1704 +45ee 11 236 1704 +45ff 14 238 1704 +4613 9 246 1704 +461c 6 248 1704 +4622 10 254 1704 +4632 5 256 1704 +4637 c 262 1704 +4643 3 266 1704 +4646 2 268 1704 +4648 a 269 1704 +4652 c 275 1704 +465e 3 276 1704 +4661 8 281 1704 +4669 3 236 1704 +466c 5 281 1704 +4671 11 282 1704 +4682 c 288 1704 +468e 4 292 1704 +4692 3 293 1704 +4695 2 292 1704 +4697 3 295 1704 +469a 6 296 1704 +46a0 9 289 1704 +FUNC 46a9 53 4 fflush +46a9 c 57 1704 +46b5 7 62 1704 +46bc 9 63 1704 +46c5 9 65 1704 +46ce 3 67 1704 +46d1 c 68 1704 +46dd c 70 1704 +46e9 3 74 1704 +46ec 6 75 1704 +46f2 a 71 1704 +FUNC 46fc 9 0 _flushall +46fc 0 193 1704 +46fc 8 194 1704 +4704 1 195 1704 +FUNC 4705 6 0 __iob_func +4705 0 53 2087 +4705 5 54 2087 +470a 1 55 2087 +FUNC 470b b1 0 __initstdio +470b 0 113 2087 +470b d 122 2087 +4718 7 123 2087 +471f 4 124 2087 +4723 7 125 2087 +472a 13 134 2087 +473d 19 137 2087 +4756 4 138 2087 +475a 1 163 2087 +475b e 145 2087 +4769 11 146 2087 +477a b 148 2087 +4785 24 151 2087 +47a9 2 158 2087 +47ab d 148 2087 +47b8 3 162 2087 +47bb 1 163 2087 +FUNC 47bc 20 0 __endstdio +47bc 0 191 2087 +47bc 5 193 2087 +47c1 9 196 2087 +47ca 5 197 2087 +47cf c 198 2087 +47db 1 199 2087 +FUNC 47dc 3c 4 _lock_file +47dc 1 221 2087 +47dd 15 226 2087 +47f2 10 231 2087 +4802 9 233 2087 +480b 1 242 2087 +480c b 241 2087 +4817 1 242 2087 +FUNC 4818 2e 8 _lock_file2 +4818 0 264 2087 +4818 9 269 2087 +4821 9 274 2087 +482a c 276 2087 +4836 1 285 2087 +4837 e 284 2087 +4845 1 285 2087 +FUNC 4846 36 4 _unlock_file +4846 0 306 2087 +4846 14 311 2087 +485a 7 317 2087 +4861 f 318 2087 +4870 1 327 2087 +4871 a 326 2087 +487b 1 327 2087 +FUNC 487c 2a 8 _unlock_file2 +487c 0 349 2087 +487c 7 354 2087 +4883 d 360 2087 +4890 a 361 2087 +489a 1 370 2087 +489b a 369 2087 +48a5 1 370 2087 +FUNC 48a6 16 4 wcslen +48a6 0 41 731 +48a6 4 42 731 +48aa a 44 731 +48b4 7 46 731 +48bb 1 47 731 +FUNC 48bc 5 4 operator delete(void *) +48bc 0 20 5184 +48bc 5 23 5184 +FUNC 48c1 30 8 _JumpToContinuation(void *,EHRegistrationNode *) +48c1 5 77 5627 +48c6 9 84 5627 +48cf 7 93 5627 +48d6 2 94 5627 +48d8 6 95 5627 +48de 3 100 5627 +48e1 3 101 5627 +48e4 3 102 5627 +48e7 3 103 5627 +48ea 2 104 5627 +48ec 5 106 5627 +FUNC 48f1 7 8 _CallMemberFunction0(void *,void *) +48f1 0 118 5627 +48f1 1 120 5627 +48f2 1 121 5627 +48f3 3 122 5627 +48f6 2 123 5627 +FUNC 48f8 7 c _CallMemberFunction1(void *,void *,void *) +48f8 0 139 5627 +48f8 1 141 5627 +48f9 1 142 5627 +48fa 3 143 5627 +48fd 2 144 5627 +FUNC 48ff 7 10 _CallMemberFunction2(void *,void *,void *,int) +48ff 0 161 5627 +48ff 1 163 5627 +4900 1 164 5627 +4901 3 165 5627 +4904 2 166 5627 +FUNC 4906 52 8 _UnwindNestedFrames(EHRegistrationNode *,EHExceptionRecord *) +4906 8 218 5627 +490e 7 232 5627 +4915 3 233 5627 +4918 7 236 5627 +491f 10 237 5627 +492f f 241 5627 +493e 7 247 5627 +4945 3 248 5627 +4948 2 249 5627 +494a 7 250 5627 +4951 7 256 5627 +FUNC 4958 36 10 __CxxFrameHandler +4958 0 287 5627 +4958 1 295 5627 +4959 2 296 5627 +495b 3 297 5627 +495e 1 298 5627 +495f 1 299 5627 +4960 1 300 5627 +4961 1 301 5627 +4962 3 306 5627 +4965 1f 311 5627 +4984 1 316 5627 +4985 1 317 5627 +4986 1 318 5627 +4987 3 319 5627 +498a 2 320 5627 +498c 1 321 5627 +498d 1 322 5627 +FUNC 498e 36 10 __CxxFrameHandler3 +498e 0 341 5627 +498e 1 349 5627 +498f 2 350 5627 +4991 3 351 5627 +4994 1 352 5627 +4995 1 353 5627 +4996 1 354 5627 +4997 1 355 5627 +4998 3 360 5627 +499b 1f 365 5627 +49ba 1 370 5627 +49bb 1 371 5627 +49bc 1 372 5627 +49bd 3 373 5627 +49c0 2 374 5627 +49c2 1 375 5627 +49c3 1 376 5627 +FUNC 49c4 36 10 __CxxFrameHandler2 +49c4 0 391 5627 +49c4 1 399 5627 +49c5 2 400 5627 +49c7 3 401 5627 +49ca 1 402 5627 +49cb 1 403 5627 +49cc 1 404 5627 +49cd 1 405 5627 +49ce 3 410 5627 +49d1 1f 415 5627 +49f0 1 420 5627 +49f1 1 421 5627 +49f2 1 422 5627 +49f3 3 423 5627 +49f6 2 424 5627 +49f8 1 425 5627 +49f9 1 426 5627 +FUNC 49fa 1a 4 __CxxLongjmpUnwind +49fa 0 443 5627 +49fa 17 449 5627 +4a11 3 452 5627 +FUNC 4a14 30 10 CatchGuardHandler +4a14 1 545 5627 +4a15 1 551 5627 +4a16 e 557 5627 +4a24 1f 567 5627 +4a43 1 572 5627 +FUNC 4a44 d5 1c _CallSETranslator(EHExceptionRecord *,EHRegistrationNode *,void *,void *,_s_FuncInfo const *,int,EHRegistrationNode *) +4a44 7 637 5627 +4a4b 9 642 5627 +4a54 5 644 5627 +4a59 3 645 5627 +4a5c 2 646 5627 +4a5e 8 648 5627 +4a66 4 656 5627 +4a6a 7 657 5627 +4a71 d 658 5627 +4a7e 6 659 5627 +4a84 6 660 5627 +4a8a 6 661 5627 +4a90 6 662 5627 +4a96 4 663 5627 +4a9a 4 664 5627 +4a9e 4 669 5627 +4aa2 3 675 5627 +4aa5 3 676 5627 +4aa8 6 681 5627 +4aae 3 682 5627 +4ab1 3 683 5627 +4ab4 6 684 5627 +4aba 7 690 5627 +4ac1 6 692 5627 +4ac7 6 693 5627 +4acd e 697 5627 +4adb e 701 5627 +4ae9 4 707 5627 +4aed 6 715 5627 +4af3 7 724 5627 +4afa 2 725 5627 +4afc 3 726 5627 +4aff 2 727 5627 +4b01 7 728 5627 +4b08 2 731 5627 +4b0a 3 737 5627 +4b0d 6 738 5627 +4b13 3 744 5627 +4b16 3 745 5627 +FUNC 4b19 9d 10 TranslatorGuardHandler +4b19 5 770 5627 +4b1e 1 776 5627 +4b1f e 782 5627 +4b2d b 784 5627 +4b38 a 786 5627 +4b42 5 790 5627 +4b47 2 792 5627 +4b49 2a 796 5627 +4b73 9 798 5627 +4b7c b 802 5627 +4b87 1b 811 5627 +4ba2 3 818 5627 +4ba5 3 819 5627 +4ba8 3 820 5627 +4bab 3 821 5627 +4bae 2 822 5627 +4bb0 3 826 5627 +4bb3 3 828 5627 +FUNC 4bb6 73 14 _GetRangeOfTrysToCheck(_s_FuncInfo const *,int,int,unsigned int *,unsigned int *) +4bb6 7 848 5627 +4bbd 6 849 5627 +4bc3 6 850 5627 +4bc9 2 851 5627 +4bcb 2 852 5627 +4bcd a 855 5627 +4bd7 1d 859 5627 +4bf4 3 860 5627 +4bf7 3 861 5627 +4bfa 3 862 5627 +4bfd 6 854 5627 +4c03 6 866 5627 +4c09 5 867 5627 +4c0e e 869 5627 +4c1c b 871 5627 +4c27 2 872 5627 +FUNC 4c29 28 8 _CreateFrameInfo +4c29 0 889 5627 +4c29 b 890 5627 +4c34 e 891 5627 +4c42 b 892 5627 +4c4d 3 893 5627 +4c50 1 894 5627 +FUNC 4c51 21 4 _IsExceptionObjectToBeDestroyed +4c51 0 907 5627 +4c51 d 910 5627 +4c5e 8 911 5627 +4c66 7 910 5627 +4c6d 1 915 5627 +4c6e 1 916 5627 +4c6f 2 912 5627 +4c71 1 916 5627 +FUNC 4c72 4c 4 _FindAndUnlinkFrame +4c72 1 926 5627 +4c73 11 927 5627 +4c84 f 928 5627 +4c93 1 944 5627 +4c94 d 931 5627 +4ca1 7 935 5627 +4ca8 9 933 5627 +4cb1 5 943 5627 +4cb6 7 936 5627 +4cbd 1 944 5627 +FUNC 4cbe 5e 14 _CallCatchBlock2(EHRegistrationNode *,_s_FuncInfo const *,void *,int,unsigned long) +4cbe 6 485 5627 +4cc4 e 493 5627 +4cd2 c 495 5627 +4cde 11 500 5627 +4cef 6 503 5627 +4cf5 3 504 5627 +4cf8 3 505 5627 +4cfb 6 506 5627 +4d01 e 512 5627 +4d0f 3 518 5627 +4d12 6 519 5627 +4d18 2 524 5627 +4d1a 2 525 5627 +FUNC 4d1c 4a 8 _CxxThrowException +4d1c 6 95 5939 +4d22 15 117 5939 +4d37 3 118 5939 +4d3a 9 134 5939 +4d43 5 136 5939 +4d48 7 138 5939 +4d4f 13 159 5939 +4d62 4 161 5939 +FUNC 4d66 19 0 std::bad_alloc::bad_alloc() +4d66 15 382 5121 +4d7b 4 383 5121 +FUNC 4d7f 6a 4 operator new(unsigned int) +4d7f 6 57 5123 +4d85 2 59 5123 +4d87 d 60 5123 +4d94 d 59 5123 +4da1 2 67 5123 +4da3 27 62 5123 +4dca 1f 63 5123 +FUNC 4de9 f 4 type_info::name(__type_info_node *) +4de9 0 44 5873 +4de9 c 45 5873 +4df5 3 46 5873 +FUNC 4df8 e 0 type_info::~type_info() +4df8 0 49 5873 +4df8 d 50 5873 +4e05 1 51 5873 +FUNC 4e06 1c 0 type_info::`scalar deleting destructor'(unsigned int) +FUNC 4e22 f 4 type_info::_name_internal_method(__type_info_node *) +4e22 0 54 5873 +4e22 c 55 5873 +4e2e 3 56 5873 +FUNC 4e31 8 0 type_info::_type_info_dtor_internal_method() +4e31 0 59 5873 +4e31 7 60 5873 +4e38 1 61 5873 +FUNC 4e39 1b 4 type_info::operator==(type_info const &) +4e39 0 89 5873 +4e39 18 90 5873 +4e51 3 91 5873 +FUNC 4e54 1c 4 type_info::operator!=(type_info const &) +4e54 0 98 5873 +4e54 19 99 5873 +4e6d 3 100 5873 +FUNC 4e70 1f 4 type_info::before(type_info const &) +4e70 0 103 5873 +4e70 1c 104 5873 +4e8c 3 105 5873 +FUNC 4e8f 4 0 type_info::raw_name() +4e8f 0 108 5873 +4e8f 3 109 5873 +4e92 1 110 5873 +FUNC 4e93 b 4 type_info::type_info(type_info const &) +4e93 8 113 5873 +4e9b 3 123 5873 +FUNC 4e9e 5 4 type_info::operator=(type_info const &) +4e9e 2 127 5873 +4ea0 3 135 5873 +FUNC 4ea3 11 0 std::exception::exception() +4ea3 2 68 5916 +4ea5 4 69 5916 +4ea9 a 70 5916 +4eb3 1 71 5916 +FUNC 4eb4 4e 4 std::exception::exception(char const * const &) +4eb4 1 77 5916 +4eb5 14 78 5916 +4ec9 9 80 5916 +4ed2 6 81 5916 +4ed8 9 82 5916 +4ee1 c 84 5916 +4eed 2 87 5916 +4eef 4 89 5916 +4ef3 7 91 5916 +4efa 8 92 5916 +FUNC 4f02 18 8 std::exception::exception(char const * const &,int) +4f02 2 98 5916 +4f04 c 99 5916 +4f10 7 100 5916 +4f17 3 101 5916 +FUNC 4f1a 58 4 std::exception::exception(std::exception const &) +4f1a 1 107 5916 +4f1b 13 108 5916 +4f2e 2 109 5916 +4f30 a 111 5916 +4f3a 9 113 5916 +4f43 6 114 5916 +4f49 9 115 5916 +4f52 d 117 5916 +4f5f 2 120 5916 +4f61 4 122 5916 +4f65 2 125 5916 +4f67 4 126 5916 +4f6b 7 127 5916 +FUNC 4f72 56 4 std::exception::operator=(std::exception const &) +4f72 1 133 5916 +4f73 c 134 5916 +4f7f 6 136 5916 +4f85 2 137 5916 +4f87 9 139 5916 +4f90 9 141 5916 +4f99 6 144 5916 +4f9f 9 146 5916 +4fa8 d 148 5916 +4fb5 2 151 5916 +4fb7 4 153 5916 +4fbb 2 156 5916 +4fbd 3 157 5916 +4fc0 5 159 5916 +4fc5 3 160 5916 +FUNC 4fc8 16 0 std::exception::~exception() +4fc8 0 167 5916 +4fc8 c 168 5916 +4fd4 9 169 5916 +4fdd 1 170 5916 +FUNC 4fde d 0 std::exception::what() +4fde 0 180 5916 +4fde 5 181 5916 +4fe3 2 182 5916 +4fe5 5 184 5916 +4fea 1 185 5916 +FUNC 4feb 19 4 std::bad_cast::bad_cast(char const *) +4feb 13 194 5916 +4ffe 6 195 5916 +FUNC 5004 18 4 std::bad_cast::bad_cast(std::bad_cast const &) +5004 12 199 5916 +5016 6 200 5916 +FUNC 501c b 0 std::bad_cast::~bad_cast() +501c 6 203 5916 +5022 5 204 5916 +FUNC 5027 19 4 std::bad_typeid::bad_typeid(char const *) +5027 13 229 5916 +503a 6 230 5916 +FUNC 5040 18 4 std::bad_typeid::bad_typeid(std::bad_typeid const &) +5040 12 234 5916 +5052 6 235 5916 +FUNC 5058 b 0 std::bad_typeid::~bad_typeid() +5058 6 238 5916 +505e 5 239 5916 +FUNC 5063 18 4 std::__non_rtti_object::__non_rtti_object(char const *) +5063 12 248 5916 +5075 6 249 5916 +FUNC 507b 18 4 std::__non_rtti_object::__non_rtti_object(std::__non_rtti_object const &) +507b 12 253 5916 +508d 6 254 5916 +FUNC 5093 b 0 std::__non_rtti_object::~__non_rtti_object() +5093 0 257 5916 +5093 b 258 5916 +FUNC 509e 1c 0 std::exception::`vector deleting destructor'(unsigned int) +FUNC 50ba 22 0 std::bad_cast::`vector deleting destructor'(unsigned int) +FUNC 50dc 22 0 std::bad_typeid::`scalar deleting destructor'(unsigned int) +FUNC 50fe 22 0 std::__non_rtti_object::`scalar deleting destructor'(unsigned int) +FUNC 5120 7b 10 memcpy_s +5120 4 47 1002 +5124 a 48 1002 +512e 4 51 1002 +5132 20 55 1002 +5152 a 56 1002 +515c f 67 1002 +516b 2 68 1002 +516d f 59 1002 +517c 5 61 1002 +5181 13 62 1002 +5194 5 64 1002 +5199 2 69 1002 +FUNC 519b 5b 10 memmove_s +519b 3 46 955 +519e 9 47 955 +51a7 2 50 955 +51a9 20 54 955 +51c9 5 55 955 +51ce 13 56 955 +51e1 f 58 955 +51f0 4 59 955 +51f4 2 60 955 +FUNC 51f6 a 4 _set_osplatform +51f6 a 385 2595 +FUNC 5200 a 4 _set_osver +5200 a 386 2595 +FUNC 520a a 4 _set_winver +520a a 387 2595 +FUNC 5214 a 4 _set_winmajor +5214 a 388 2595 +FUNC 521e a 4 _set_winminor +521e a 389 2595 +FUNC 5228 24 4 fast_error_exit +5228 0 375 2608 +5228 9 384 2608 +5231 5 386 2608 +5236 9 388 2608 +523f c 389 2608 +524b 1 390 2608 +FUNC 524c 41 0 check_managed_app +524c 0 413 2608 +524c b 418 2608 +5257 5 422 2608 +525c a 424 2608 +5266 2 425 2608 +5268 9 427 2608 +5271 2 428 2608 +5273 7 433 2608 +527a 2 434 2608 +527c d 437 2608 +5289 1 438 2608 +528a 2 419 2608 +528c 1 438 2608 +FUNC 528d 1b6 0 __tmainCRTStartup +528d c 203 2608 +5299 19 233 2608 +52b2 4 234 2608 +52b6 8 235 2608 +52be a 236 2608 +52c8 2 242 2608 +52ca 7 243 2608 +52d1 3 244 2608 +52d4 4 243 2608 +52d8 9 244 2608 +52e1 2 245 2608 +52e3 6 248 2608 +52e9 6 249 2608 +52ef 6 250 2608 +52f5 9 256 2608 +52fe 9 257 2608 +5307 8 258 2608 +530f 6 259 2608 +5315 d 260 2608 +5322 6 262 2608 +5328 5 263 2608 +532d 6 264 2608 +5333 6 265 2608 +5339 6 266 2608 +533f 8 271 2608 +5347 c 273 2608 +5353 8 274 2608 +535b 9 276 2608 +5364 8 277 2608 +536c 5 286 2608 +5371 4 294 2608 +5375 9 296 2608 +537e 8 297 2608 +5386 b 300 2608 +5391 a 303 2608 +539b 9 305 2608 +53a4 8 306 2608 +53ac 9 307 2608 +53b5 8 308 2608 +53bd 8 310 2608 +53c5 4 311 2608 +53c9 7 312 2608 +53d0 a 326 2608 +53da 18 327 2608 +53f2 6 330 2608 +53f8 6 331 2608 +53fe 5 333 2608 +5403 2 335 2608 +5405 17 336 2608 +541c 6 342 2608 +5422 6 344 2608 +5428 6 345 2608 +542e 5 347 2608 +5433 7 349 2608 +543a 3 351 2608 +543d 6 352 2608 +FUNC 5443 a 0 mainCRTStartup +5443 0 186 2608 +5443 5 193 2608 +5448 5 195 2608 +FUNC 544d a 4 _initp_misc_invarg +544d 0 38 3328 +544d 9 39 3328 +5456 1 40 3328 +FUNC 5457 fc 14 _invoke_watson +5457 1c 111 3328 +5473 6 128 3328 +5479 6 129 3328 +547f 6 130 3328 +5485 3 131 3328 +5488 3 132 3328 +548b 3 133 3328 +548e 7 134 3328 +5495 7 135 3328 +549c 4 136 3328 +54a0 4 137 3328 +54a4 4 138 3328 +54a8 4 139 3328 +54ac 1 140 3328 +54ad 6 141 3328 +54b3 6 147 3328 +54b9 19 148 3328 +54d2 3 150 3328 +54d5 13 163 3328 +54e8 6 168 3328 +54ee 13 169 3328 +5501 6 171 3328 +5507 a 174 3328 +5511 a 176 3328 +551b 8 180 3328 +5523 8 181 3328 +552b 12 184 3328 +553d 16 185 3328 +FUNC 5553 22 4 _set_invalid_parameter_handler +5553 1 207 3328 +5554 b 211 3328 +555f d 212 3328 +556c 5 214 3328 +5571 3 216 3328 +5574 1 217 3328 +FUNC 5575 d 0 _get_invalid_parameter_handler +5575 0 221 3328 +5575 c 225 3328 +5581 1 228 3328 +FUNC 5582 9 14 _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int) +5582 3 266 3328 +5585 1 274 3328 +5586 5 273 3328 +FUNC 558b 24 14 _invalid_parameter +558b 3 70 3328 +558e b 77 3328 +5599 5 78 3328 +559e 1 89 3328 +559f 2 80 3328 +55a1 8 86 3328 +55a9 1 89 3328 +55aa 5 88 3328 +FUNC 55af 10 0 _invalid_parameter_noinfo +55af 0 98 3328 +55af f 99 3328 +55be 1 100 3328 +FUNC 55bf 9 14 _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int) +55bf 3 249 3328 +55c2 1 257 3328 +55c3 5 256 3328 +FUNC 55c8 96 8 _swprintf +55c8 7 122 1564 +55cf 24 128 1564 +55f3 8 133 1564 +55fb 6 138 1564 +5601 22 153 1564 +5623 1d 160 1564 +5640 18 161 1564 +5658 4 163 1564 +565c 2 171 1564 +FUNC 565e 1a c __swprintf_l +565e 0 181 1564 +565e 19 186 1564 +5677 1 188 1564 +FUNC 5678 1c c swprintf_s +5678 0 238 1564 +5678 1b 243 1564 +5693 1 244 1564 +FUNC 5694 1f 10 _snwprintf_s +5694 3 253 1564 +5697 1a 258 1564 +56b1 2 259 1564 +FUNC 56b3 1c c _swprintf_p +56b3 0 267 1564 +56b3 1b 272 1564 +56ce 1 273 1564 +FUNC 56cf 1d 10 _swprintf_s_l +56cf 3 282 1564 +56d2 18 287 1564 +56ea 2 288 1564 +FUNC 56ec 20 14 _snwprintf_s_l +56ec 3 298 1564 +56ef 1b 303 1564 +570a 2 304 1564 +FUNC 570c 1d 10 _swprintf_p_l +570c 3 313 1564 +570f 18 318 1564 +5727 2 319 1564 +FUNC 5729 11 4 _scwprintf +5729 0 347 1564 +5729 10 352 1564 +5739 1 353 1564 +FUNC 573a 11 4 _scwprintf_p +573a 0 359 1564 +573a 10 364 1564 +574a 1 365 1564 +FUNC 574b 16 8 _scwprintf_l +574b 0 372 1564 +574b 15 376 1564 +5760 1 377 1564 +FUNC 5761 16 8 _scwprintf_p_l +5761 0 384 1564 +5761 15 389 1564 +5776 1 390 1564 +FUNC 5777 14f 8 fprintf +5777 c 49 1648 +5783 5 53 1648 +5788 2e 55 1648 +57b6 c 56 1648 +57c2 3 61 1648 +57c5 7 63 1648 +57cc 3 64 1648 +57cf b0 66 1648 +587f 5 67 1648 +5884 8 69 1648 +588c 11 70 1648 +589d a 71 1648 +58a7 c 75 1648 +58b3 3 79 1648 +58b6 6 80 1648 +58bc a 76 1648 +FUNC 58c6 1a c _fprintf_l +58c6 0 88 1648 +58c6 19 93 1648 +58df 1 94 1648 +FUNC 58e0 1a c _fprintf_s_l +58e0 0 102 1648 +58e0 19 107 1648 +58f9 1 108 1648 +FUNC 58fa 18 8 fprintf_s +58fa 0 115 1648 +58fa 17 120 1648 +5911 1 121 1648 +FUNC 5912 1a c _fprintf_p_l +5912 0 129 1648 +5912 19 134 1648 +592b 1 135 1648 +FUNC 592c 18 8 _fprintf_p +592c 0 142 1648 +592c 17 147 1648 +5943 1 148 1648 +FUNC 5944 f6 18 _vswprintf_helper +5944 7 125 1380 +594b 28 130 1380 +5973 2f 133 1380 +59a2 15 143 1380 +59b7 7 146 1380 +59be 2 148 1380 +59c0 6 150 1380 +59c6 13 157 1380 +59d9 5 160 1380 +59de 2 162 1380 +59e0 41 171 1380 +5a21 5 172 1380 +5a26 12 175 1380 +5a38 2 183 1380 +FUNC 5a3a 27 10 _vswprintf_c +5a3a 0 241 1380 +5a3a 1f 242 1380 +5a59 7 243 1380 +5a60 1 244 1380 +FUNC 5a61 28 14 _vswprintf_c_l +5a61 3 253 1380 +5a64 1c 254 1380 +5a80 7 255 1380 +5a87 2 256 1380 +FUNC 5a89 87 14 _vswprintf_s_l +5a89 4 265 1380 +5a8d 25 269 1380 +5ab2 19 270 1380 +5acb 1a 272 1380 +5ae5 4 273 1380 +5ae9 3 275 1380 +5aec 5 278 1380 +5af1 1d 280 1380 +5b0e 2 288 1380 +FUNC 5b10 1b 10 vswprintf_s +5b10 0 296 1380 +5b10 1a 297 1380 +5b2a 1 298 1380 +FUNC 5b2b 107 18 _vsnwprintf_s_l +5b2b 5 308 1380 +5b30 27 313 1380 +5b57 13 314 1380 +5b6a 7 317 1380 +5b71 1b 319 1380 +5b8c 8 323 1380 +5b94 20 324 1380 +5bb4 5 325 1380 +5bb9 a 329 1380 +5bc3 7 331 1380 +5bca 2 333 1380 +5bcc 2 338 1380 +5bce 12 339 1380 +5be0 10 342 1380 +5bf0 a 344 1380 +5bfa a 346 1380 +5c04 2 348 1380 +5c06 4 352 1380 +5c0a 8 356 1380 +5c12 18 358 1380 +5c2a 6 360 1380 +5c30 2 366 1380 +FUNC 5c32 1e 14 _vsnwprintf_s +5c32 3 375 1380 +5c35 19 376 1380 +5c4e 2 377 1380 +FUNC 5c50 27 10 _vswprintf_p +5c50 0 385 1380 +5c50 1f 386 1380 +5c6f 7 387 1380 +5c76 1 388 1380 +FUNC 5c77 28 14 _vswprintf_p_l +5c77 3 397 1380 +5c7a 1c 398 1380 +5c96 7 399 1380 +5c9d 2 400 1380 +FUNC 5c9f 24 4 _amsg_exit +5c9f 0 446 2560 +5c9f 5 449 2560 +5ca4 9 450 2560 +5cad b 451 2560 +5cb8 a 452 2560 +5cc2 1 453 2560 +FUNC 5cc3 26 4 __crtCorExitProcess +5cc3 0 650 2560 +5cc3 b 654 2560 +5cce 4 655 2560 +5cd2 c 656 2560 +5cde 4 657 2560 +5ce2 6 658 2560 +5ce8 1 668 2560 +FUNC 5ce9 15 4 __crtExitProcess +5ce9 0 673 2560 +5ce9 a 674 2560 +5cf3 b 683 2560 +FUNC 5cfe 9 0 _lockexit +5cfe 0 733 2560 +5cfe 8 734 2560 +5d06 1 735 2560 +FUNC 5d07 9 0 _unlockexit +5d07 0 759 2560 +5d07 8 760 2560 +5d0f 1 761 2560 +FUNC 5d10 18 4 _initterm +5d10 3 841 2560 +5d13 2 855 2560 +5d15 6 853 2560 +5d1b 2 854 2560 +5d1d 3 855 2560 +5d20 7 848 2560 +5d27 1 857 2560 +FUNC 5d28 20 8 _initterm_e +5d28 1 890 2560 +5d29 c 899 2560 +5d35 6 904 2560 +5d3b 2 905 2560 +5d3d 3 906 2560 +5d40 7 899 2560 +5d47 1 910 2560 +FUNC 5d48 37 4 _get_osplatform +5d48 0 929 2560 +5d48 27 931 2560 +5d6f 1 939 2560 +5d70 9 934 2560 +5d79 2 936 2560 +5d7b 3 938 2560 +5d7e 1 939 2560 +FUNC 5d7f 3c 4 _get_osver +5d7f 0 958 2560 +5d7f 27 960 2560 +5da6 1 968 2560 +5da7 8 963 2560 +5daf 8 965 2560 +5db7 3 967 2560 +5dba 1 968 2560 +FUNC 5dbb 3c 4 _get_winver +5dbb 0 987 2560 +5dbb 27 989 2560 +5de2 1 997 2560 +5de3 8 992 2560 +5deb 8 994 2560 +5df3 3 996 2560 +5df6 1 997 2560 +FUNC 5df7 3c 4 _get_winmajor +5df7 0 1016 2560 +5df7 27 1018 2560 +5e1e 1 1026 2560 +5e1f 8 1021 2560 +5e27 8 1023 2560 +5e2f 3 1025 2560 +5e32 1 1026 2560 +FUNC 5e33 3c 4 _get_winminor +5e33 0 1045 2560 +5e33 27 1047 2560 +5e5a 1 1055 2560 +5e5b 8 1050 2560 +5e63 8 1052 2560 +5e6b 3 1054 2560 +5e6e 1 1055 2560 +FUNC 5e6f 37 4 _get_wpgmptr +5e6f 0 1074 2560 +5e6f 27 1076 2560 +5e96 1 1085 2560 +5e97 9 1080 2560 +5ea0 2 1082 2560 +5ea2 3 1084 2560 +5ea5 1 1085 2560 +FUNC 5ea6 37 4 _get_pgmptr +5ea6 0 1104 2560 +5ea6 27 1106 2560 +5ecd 1 1115 2560 +5ece 9 1110 2560 +5ed7 2 1112 2560 +5ed9 3 1114 2560 +5edc 1 1115 2560 +FUNC 5edd 92 4 _cinit +5edd 0 263 2560 +5edd 18 273 2560 +5ef5 b 275 2560 +5f00 5 277 2560 +5f05 f 283 2560 +5f14 4 284 2560 +5f18 4 285 2560 +5f1c a 288 2560 +5f26 20 293 2560 +5f46 1a 306 2560 +5f60 c 308 2560 +5f6c 2 312 2560 +5f6e 1 313 2560 +FUNC 5f6f e2 c doexit +5f6f c 499 2560 +5f7b 8 517 2560 +5f83 5 518 2560 +5f88 b 520 2560 +5f93 6 521 2560 +5f99 8 524 2560 +5fa1 5 526 2560 +5fa6 e 542 2560 +5fb4 12 543 2560 +5fc6 5 545 2560 +5fcb b 546 2560 +5fd6 10 551 2560 +5fe6 9 552 2560 +5fef 2 553 2560 +5ff1 10 558 2560 +6001 10 566 2560 +6011 c 584 2560 +601d 6 588 2560 +6023 6 592 2560 +6029 8 594 2560 +6031 8 596 2560 +6039 3 584 2560 +603c 6 585 2560 +6042 9 586 2560 +604b 6 597 2560 +FUNC 6051 11 4 exit +6051 0 397 2560 +6051 10 398 2560 +6061 1 399 2560 +FUNC 6062 11 4 _exit +6062 0 405 2560 +6062 10 406 2560 +6072 1 407 2560 +FUNC 6073 f 0 _cexit +6073 0 412 2560 +6073 e 413 2560 +6081 1 414 2560 +FUNC 6082 f 0 _c_exit +6082 0 419 2560 +6082 e 420 2560 +6090 1 421 2560 +FUNC 6091 4c 0 _init_pointers +6091 1 786 2560 +6092 7 787 2560 +6099 6 789 2560 +609f 6 790 2560 +60a5 6 791 2560 +60ab 6 792 2560 +60b1 6 793 2560 +60b7 6 794 2560 +60bd 6 795 2560 +60c3 6 796 2560 +60c9 13 799 2560 +60dc 1 800 2560 +FUNC 60e0 8b 4 strlen +60e0 0 54 880 +60e0 4 63 880 +60e4 6 64 880 +60ea 2 65 880 +60ec 2 69 880 +60ee 3 70 880 +60f1 2 71 880 +60f3 2 72 880 +60f5 6 73 880 +60fb 2 74 880 +60fd 13 76 880 +6110 2 81 880 +6112 5 82 880 +6117 2 83 880 +6119 3 84 880 +611c 2 85 880 +611e 3 86 880 +6121 5 87 880 +6126 2 88 880 +6128 3 90 880 +612b 2 91 880 +612d 2 92 880 +612f 2 93 880 +6131 2 94 880 +6133 5 95 880 +6138 2 96 880 +613a 5 97 880 +613f 2 98 880 +6141 2 99 880 +6143 3 103 880 +6146 4 104 880 +614a 2 105 880 +614c 1 106 880 +614d 3 108 880 +6150 4 109 880 +6154 2 110 880 +6156 1 111 880 +6157 3 113 880 +615a 4 114 880 +615e 2 115 880 +6160 1 116 880 +6161 3 118 880 +6164 4 119 880 +6168 2 120 880 +616a 1 121 880 +FUNC 616b 33 4 _EH_prolog3 +616b 0 93 5671 +616b 1 101 5671 +616c 7 103 5671 +6173 4 112 5671 +6177 4 113 5671 +617b 1 114 5671 +617c 1 115 5671 +617d 1 116 5671 +617e 2 117 5671 +6180 2 118 5671 +6182 5 131 5671 +6187 2 132 5671 +6189 1 133 5671 +618a 3 134 5671 +618d 7 135 5671 +6194 3 150 5671 +6197 6 151 5671 +619d 1 153 5671 +FUNC 619e 36 4 _EH_prolog3_catch +619e 0 206 5671 +619e 1 214 5671 +619f 7 216 5671 +61a6 4 225 5671 +61aa 4 226 5671 +61ae 1 228 5671 +61af 1 229 5671 +61b0 1 230 5671 +61b1 2 231 5671 +61b3 2 232 5671 +61b5 5 246 5671 +61ba 2 247 5671 +61bc 1 248 5671 +61bd 3 249 5671 +61c0 3 250 5671 +61c3 7 251 5671 +61ca 3 267 5671 +61cd 6 268 5671 +61d3 1 270 5671 +FUNC 61d4 36 4 _EH_prolog3_GS +61d4 0 322 5671 +61d4 1 330 5671 +61d5 7 332 5671 +61dc 4 341 5671 +61e0 4 342 5671 +61e4 1 344 5671 +61e5 1 345 5671 +61e6 1 346 5671 +61e7 2 347 5671 +61e9 2 348 5671 +61eb 5 362 5671 +61f0 2 363 5671 +61f2 1 364 5671 +61f3 3 365 5671 +61f6 3 366 5671 +61f9 7 367 5671 +6200 3 384 5671 +6203 6 385 5671 +6209 1 387 5671 +FUNC 620a 39 4 _EH_prolog3_catch_GS +620a 0 441 5671 +620a 1 449 5671 +620b 7 451 5671 +6212 4 460 5671 +6216 4 461 5671 +621a 1 463 5671 +621b 1 464 5671 +621c 1 465 5671 +621d 2 466 5671 +621f 2 467 5671 +6221 5 482 5671 +6226 2 483 5671 +6228 1 484 5671 +6229 3 485 5671 +622c 3 486 5671 +622f 3 487 5671 +6232 7 488 5671 +6239 3 505 5671 +623c 6 506 5671 +6242 1 508 5671 +FUNC 6243 14 0 _EH_epilog3 +6243 0 534 5671 +6243 3 537 5671 +6246 7 538 5671 +624d 1 539 5671 +624e 1 540 5671 +624f 1 541 5671 +6250 1 542 5671 +6251 1 543 5671 +6252 2 544 5671 +6254 1 545 5671 +6255 1 546 5671 +6256 1 547 5671 +FUNC 6257 f 0 _EH_epilog3_GS +6257 0 575 5671 +6257 3 578 5671 +625a 2 579 5671 +625c 5 580 5671 +6261 5 581 5671 +FUNC 6266 f 0 _EH_epilog3_catch_GS +6266 0 609 5671 +6266 3 612 5671 +6269 2 613 5671 +626b 5 614 5671 +6270 5 615 5671 +FUNC 6275 96 4 _stbuf +6275 1 59 1850 +6276 14 69 1850 +628a 2 70 1850 +628c c 73 1850 +6298 4 74 1850 +629c c 75 1850 +62a8 3 76 1850 +62ab 6 82 1850 +62b1 6 86 1850 +62b7 4 87 1850 +62bb 1e 91 1850 +62d9 3 93 1850 +62dc e 94 1850 +62ea 2 96 1850 +62ec 7 98 1850 +62f3 6 99 1850 +62f9 8 102 1850 +6301 5 104 1850 +6306 1 105 1850 +6307 3 78 1850 +630a 1 105 1850 +FUNC 630b 2f 8 _ftbuf +630b 0 138 1850 +630b 8 146 1850 +6313 c 148 1850 +631f 6 151 1850 +6325 7 152 1850 +632c 4 153 1850 +6330 9 154 1850 +6339 1 166 1850 +FUNC 633a 82 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *) +633a 0 261 1343 +633a f 262 1343 +6349 8 264 1343 +6351 5 265 1343 +6356 6 266 1343 +635c 1c 268 1343 +6378 21 269 1343 +6399 9 270 1343 +63a2 4 272 1343 +63a6 4 273 1343 +63aa 2 276 1343 +63ac a 278 1343 +63b6 6 280 1343 +FUNC 63bc e 0 _LocaleUpdate::~_LocaleUpdate() +63bc 0 282 1343 +63bc 6 283 1343 +63c2 7 284 1343 +63c9 1 285 1343 +FUNC 63ca 3 0 _LocaleUpdate::GetLocaleT() +63ca 2 287 1343 +63cc 1 289 1343 +FUNC 63cd 33 0 write_char +63cd 0 2433 1312 +63cd a 2434 1312 +63d7 2 2437 1312 +63d9 21 2442 1312 +63fa 2 2444 1312 +63fc 1 2447 1312 +63fd 2 2446 1312 +63ff 1 2447 1312 +FUNC 6400 24 c write_multi_char +6400 6 2498 1312 +6406 2 2501 1312 +6408 e 2500 1312 +6416 5 2501 1312 +641b 7 2499 1312 +6422 2 2504 1312 +FUNC 6424 4a 4 write_string +6424 0 2563 1312 +6424 12 2564 1312 +6436 6 2566 1312 +643c 2 2567 1312 +643e e 2570 1312 +644c 5 2571 1312 +6451 a 2573 1312 +645b 9 2574 1312 +6464 9 2569 1312 +646d 1 2579 1312 +FUNC 646e d 4 get_int_arg +646e 0 2602 1312 +646e c 2603 1312 +647a 1 2604 1312 +FUNC 647b 10 4 get_int64_arg +647b 0 2644 1312 +647b f 2645 1312 +648a 1 2646 1312 +FUNC 648b e 4 get_short_arg +648b 0 2671 1312 +648b d 2672 1312 +6498 1 2673 1312 +FUNC 6499 994 10 _output_l +6499 1b 975 1312 +64b4 45 1036 1312 +64f9 2d 1031 1312 +6526 b1 1033 1312 +65d7 8 1036 1312 +65df 26 1073 1312 +6605 1d 1075 1312 +6622 8 1076 1312 +662a 18 1131 1312 +6642 13 1173 1312 +6655 3 1174 1312 +6658 5 1175 1312 +665d 1f 1179 1312 +667c 4 1193 1312 +6680 5 1194 1312 +6685 4 1181 1312 +6689 5 1182 1312 +668e 4 1184 1312 +6692 5 1185 1312 +6697 7 1190 1312 +669e 5 1191 1312 +66a3 4 1187 1312 +66a7 5 1196 1312 +66ac 5 1200 1312 +66b1 9 1206 1312 +66ba b 1233 1312 +66c5 4 1235 1312 +66c9 3 1236 1312 +66cc 5 1239 1312 +66d1 10 1241 1312 +66e1 5 1243 1312 +66e6 3 1248 1312 +66e9 5 1249 1312 +66ee 5 1253 1312 +66f3 9 1259 1312 +66fc b 1284 1312 +6707 4 1285 1312 +670b 5 1287 1312 +6710 10 1289 1312 +6720 5 1291 1312 +6725 18 1295 1312 +673d 7 1362 1312 +6744 5 1363 1312 +6749 5 1301 1312 +674e 1 1303 1312 +674f a 1304 1312 +6759 5 1306 1312 +675e 4 1308 1312 +6762 5 1310 1312 +6767 4 1358 1312 +676b 5 1359 1312 +6770 c 1322 1312 +677c 2 1324 1312 +677e f 1325 1312 +678d a 1327 1312 +6797 2 1329 1312 +6799 a 1330 1312 +67a3 5 1332 1312 +67a8 30 1337 1312 +67d8 3 1352 1312 +67db 13 1158 1312 +67ee 11 1160 1312 +67ff 3 1161 1312 +6802 b 1163 1312 +680d b 1166 1312 +6818 5 1167 1312 +681d 32 1378 1312 +684f d 1716 1312 +685c 4 1724 1312 +6860 17 1749 1312 +6877 c 1750 1312 +6883 8 1381 1312 +688b 9 1385 1312 +6894 8 1561 1312 +689c 7 1562 1312 +68a3 d 1584 1312 +68b0 3 1589 1312 +68b3 15 1635 1312 +68c8 4 1636 1312 +68cc 8 1637 1312 +68d4 f 1639 1312 +68e3 1d 1378 1312 +6900 12 1448 1312 +6912 16 1467 1312 +6928 4 1470 1312 +692c 7 1471 1312 +6933 2 1472 1312 +6935 6 1499 1312 +693b 7 1500 1312 +6942 6 1503 1312 +6948 5 1506 1312 +694d 5 1523 1312 +6952 e 1541 1312 +6960 6 1546 1312 +6966 d 1548 1312 +6973 7 1549 1312 +697a 5 1550 1312 +697f 3 1551 1312 +6982 5 1553 1312 +6987 8 1543 1312 +698f 7 1544 1312 +6996 5 1557 1312 +699b 34 1378 1312 +69cf d 1908 1312 +69dc 9 1910 1312 +69e5 8 1668 1312 +69ed d 1688 1312 +69fa 6 1702 1312 +6a00 7 1703 1312 +6a07 2 1704 1312 +6a09 5 1706 1312 +6a0e 7 1708 1312 +6a15 5 1710 1312 +6a1a 4 1864 1312 +6a1e 7 1869 1312 +6a25 c 1933 1312 +6a31 8 1939 1312 +6a39 5 1958 1312 +6a3e 7 1751 1312 +6a45 9 1752 1312 +6a4e 5 1753 1312 +6a53 3 1754 1312 +6a56 9 1756 1312 +6a5f f 1759 1312 +6a6e 2 1760 1312 +6a70 13 1765 1312 +6a83 9 1767 1312 +6a8c e 1809 1312 +6a9a 27 1828 1312 +6ac1 13 1838 1312 +6ad4 15 1840 1312 +6ae9 a 1844 1312 +6af3 15 1846 1312 +6b08 5 1852 1312 +6b0d 7 1853 1312 +6b14 4 1854 1312 +6b18 1 1857 1312 +6b19 5 1859 1312 +6b1e 7 1877 1312 +6b25 3 1887 1312 +6b28 2 1888 1312 +6b2a 1a 1378 1312 +6b44 7 1892 1312 +6b4b 11 1897 1312 +6b5c c 1900 1312 +6b68 7 1901 1312 +6b6f 5 1903 1312 +6b74 5 1961 1312 +6b79 6 1987 1312 +6b7f 14 2026 1312 +6b93 2 2045 1312 +6b95 5 2051 1312 +6b9a 2 2071 1312 +6b9c 3 2074 1312 +6b9f 6 2080 1312 +6ba5 2 2099 1312 +6ba7 5 2105 1312 +6bac f 2128 1312 +6bbb 7 2129 1312 +6bc2 7 2130 1312 +6bc9 c 2136 1312 +6bd5 2 2142 1312 +6bd7 6 2148 1312 +6bdd 7 2149 1312 +6be4 2 2150 1312 +6be6 4 2151 1312 +6bea a 2152 1312 +6bf4 3 2153 1312 +6bf7 6 2157 1312 +6bfd 3 2158 1312 +6c00 6 2163 1312 +6c06 10 2165 1312 +6c16 10 2166 1312 +6c26 c 2168 1312 +6c32 3 2170 1312 +6c35 3 2172 1312 +6c38 2 2173 1312 +6c3a 8 2175 1312 +6c42 1 2176 1312 +6c43 19 2180 1312 +6c5c 9 2181 1312 +6c65 1 2182 1312 +6c66 2 2185 1312 +6c68 6 1640 1312 +6c6e 2 1641 1312 +6c70 4 1640 1312 +6c74 5 1642 1312 +6c79 2 1644 1312 +6c7b 4 1645 1312 +6c7f 8 1646 1312 +6c87 5 1647 1312 +6c8c 6 1648 1312 +6c92 1 1649 1312 +6c93 4 1648 1312 +6c97 6 1650 1312 +6c9d a 2201 1312 +6ca7 7 2204 1312 +6cae 6 2205 1312 +6cb4 4 2207 1312 +6cb8 2 2208 1312 +6cba 4 2210 1312 +6cbe 4 2212 1312 +6cc2 2 2213 1312 +6cc4 4 2215 1312 +6cc8 4 2217 1312 +6ccc 7 2218 1312 +6cd3 9 2224 1312 +6cdc 6 2228 1312 +6ce2 11 2230 1312 +6cf3 11 2234 1312 +6d04 d 2236 1312 +6d11 f 2238 1312 +6d20 d 2243 1312 +6d2d 3 2249 1312 +6d30 3 2250 1312 +6d33 1e 2252 1312 +6d51 9 2253 1312 +6d5a 18 2257 1312 +6d72 2 1690 1312 +6d74 4 2254 1312 +6d78 2 2259 1312 +6d7a d 2260 1312 +6d87 c 2290 1312 +6d93 f 2292 1312 +6da2 6 2297 1312 +6da8 8 2298 1312 +6db0 1e 2299 1312 +6dce 17 1163 1312 +6de5 10 2376 1312 +6df5 38 2377 1312 +FUNC 6e2d 3b 4 _get_errno_from_oserr +6e2d 0 119 6100 +6e2d 6 123 6100 +6e33 f 124 6100 +6e42 8 133 6100 +6e4a 3 134 6100 +6e4d 1 139 6100 +6e4e 7 125 6100 +6e55 1 139 6100 +6e56 11 135 6100 +6e67 1 139 6100 +FUNC 6e68 13 0 _errno +6e68 0 280 6100 +6e68 5 281 6100 +6e6d 4 282 6100 +6e71 5 283 6100 +6e76 1 288 6100 +6e77 3 285 6100 +6e7a 1 288 6100 +FUNC 6e7b 13 0 __doserrno +6e7b 0 293 6100 +6e7b 5 294 6100 +6e80 4 295 6100 +6e84 5 296 6100 +6e89 1 300 6100 +6e8a 3 298 6100 +6e8d 1 300 6100 +FUNC 6e8e 1e 4 _dosmaperr +6e8e 1 110 6100 +6e8f 9 111 6100 +6e98 13 113 6100 +6eab 1 114 6100 +FUNC 6eac 1b 4 _set_errno +6eac 0 157 6100 +6eac 5 158 6100 +6eb1 4 159 6100 +6eb5 3 161 6100 +6eb8 1 168 6100 +6eb9 b 165 6100 +6ec4 2 166 6100 +6ec6 1 168 6100 +FUNC 6ec7 2a 4 _get_errno +6ec7 1 187 6100 +6ec8 1b 189 6100 +6ee3 1 195 6100 +6ee4 9 193 6100 +6eed 3 194 6100 +6ef0 1 195 6100 +FUNC 6ef1 1b 4 _set_doserrno +6ef1 0 213 6100 +6ef1 5 214 6100 +6ef6 4 215 6100 +6efa 3 217 6100 +6efd 1 224 6100 +6efe b 221 6100 +6f09 2 222 6100 +6f0b 1 224 6100 +FUNC 6f0c 2a 4 _get_doserrno +6f0c 1 243 6100 +6f0d 1b 245 6100 +6f28 1 251 6100 +6f29 9 249 6100 +6f32 3 250 6100 +6f35 1 251 6100 +FUNC 6f38 45 0 _SEH_prolog4 +FUNC 6f7d 14 0 _SEH_epilog4 +FUNC 6fa0 24 0 ValidateLocalCookies +FUNC 6fd0 196 10 _except_handler4 +FUNC 7166 90 10 vprintf_helper +7166 c 47 1507 +7172 d 48 1507 +717f 2b 52 1507 +71aa 7 55 1507 +71b1 3 56 1507 +71b4 8 58 1507 +71bc 10 59 1507 +71cc a 60 1507 +71d6 c 63 1507 +71e2 3 67 1507 +71e5 6 68 1507 +71eb 3 63 1507 +71ee 8 64 1507 +FUNC 71f6 1a c _vprintf_l +71f6 0 75 1507 +71f6 19 76 1507 +720f 1 77 1507 +FUNC 7210 1a c _vprintf_s_l +7210 0 84 1507 +7210 19 85 1507 +7229 1 86 1507 +FUNC 722a 1a c _vprintf_p_l +722a 0 93 1507 +722a 19 94 1507 +7243 1 95 1507 +FUNC 7244 18 8 vprintf +7244 0 101 1507 +7244 17 102 1507 +725b 1 103 1507 +FUNC 725c 18 8 vprintf_s +725c 0 109 1507 +725c 17 110 1507 +7273 1 111 1507 +FUNC 7274 18 8 _vprintf_p +7274 0 117 1507 +7274 17 118 1507 +728b 1 119 1507 +FUNC 728c 104 0 __report_gsfailure +728c 9 140 3731 +7295 5 170 3731 +729a 6 171 3731 +72a0 6 172 3731 +72a6 6 173 3731 +72ac 6 174 3731 +72b2 6 175 3731 +72b8 7 176 3731 +72bf 7 177 3731 +72c6 7 178 3731 +72cd 7 179 3731 +72d4 7 180 3731 +72db 7 181 3731 +72e2 1 182 3731 +72e3 6 183 3731 +72e9 3 190 3731 +72ec 5 191 3731 +72f1 3 192 3731 +72f4 5 193 3731 +72f9 3 194 3731 +72fc 5 195 3731 +7301 6 201 3731 +7307 a 204 3731 +7311 a 206 3731 +731b a 285 3731 +7325 a 286 3731 +732f b 293 3731 +733a b 294 3731 +7345 b 297 3731 +7350 8 298 3731 +7358 8 302 3731 +7360 b 304 3731 +736b 9 313 3731 +7374 8 315 3731 +737c 12 319 3731 +738e 2 320 3731 +FUNC 7390 5c6 c _write_nolock +7390 22 95 4777 +73b2 2 106 4777 +73b4 11 108 4777 +73c5 7 109 4777 +73cc 2b 111 4777 +73f7 27 113 4777 +741e 10 116 4777 +742e 33 119 4777 +7461 6 122 4777 +7467 f 126 4777 +7476 1c 143 4777 +7492 5 146 4777 +7497 8 147 4777 +749f 14 148 4777 +74b3 16 152 4777 +74c9 6 153 4777 +74cf 4 157 4777 +74d3 16 160 4777 +74e9 9 153 4777 +74f2 b 163 4777 +74fd 9 164 4777 +7506 11 170 4777 +7517 18 171 4777 +752f 2 173 4777 +7531 14 174 4777 +7545 18 175 4777 +755d 4 181 4777 +7561 2e 205 4777 +758f 21 212 4777 +75b0 6 213 4777 +75b6 8 214 4777 +75be a 222 4777 +75c8 29 229 4777 +75f1 a 230 4777 +75fb 3 232 4777 +75fe 3 233 4777 +7601 2 238 4777 +7603 8 186 4777 +760b 3 191 4777 +760e 9 192 4777 +7617 f 193 4777 +7626 8 240 4777 +762e 13 242 4777 +7641 3 244 4777 +7644 6 251 4777 +764a 3 254 4777 +764d 14 255 4777 +7661 3 257 4777 +7664 12 258 4777 +7676 5 236 4777 +767b e 268 4777 +7689 12 277 4777 +769b f 278 4777 +76aa d 279 4777 +76b7 8 283 4777 +76bf 9 284 4777 +76c8 5 285 4777 +76cd 3 286 4777 +76d0 7 287 4777 +76d7 f 289 4777 +76e6 25 297 4777 +770b 6 299 4777 +7711 16 300 4777 +7727 f 308 4777 +7736 f 314 4777 +7745 b 315 4777 +7750 8 319 4777 +7758 c 320 4777 +7764 6 321 4777 +776a 4 322 4777 +776e c 323 4777 +777a f 325 4777 +7789 25 333 4777 +77ae 6 335 4777 +77b4 1a 336 4777 +77ce 5 344 4777 +77d3 f 359 4777 +77e2 13 361 4777 +77f5 8 365 4777 +77fd b 366 4777 +7808 6 367 4777 +780e a 369 4777 +7818 11 371 4777 +7829 2f 382 4777 +7858 4 384 4777 +785c 25 406 4777 +7881 3 407 4777 +7884 6 412 4777 +788a 9 409 4777 +7893 4 419 4777 +7897 15 423 4777 +78ac 2 428 4777 +78ae 1b 434 4777 +78c9 a 437 4777 +78d3 2 439 4777 +78d5 9 440 4777 +78de a 443 4777 +78e8 7 447 4777 +78ef 8 449 4777 +78f7 b 452 4777 +7902 2 455 4777 +7904 9 456 4777 +790d 2 457 4777 +790f 11 459 4777 +7920 4 460 4777 +7924 b 462 4777 +792f 7 463 4777 +7936 5 464 4777 +793b 5 469 4777 +7940 16 470 4777 +FUNC 7956 dc c _write +7956 c 61 4777 +7962 23 66 4777 +7985 2f 67 4777 +79b4 20 68 4777 +79d4 7 70 4777 +79db 3 72 4777 +79de 9 73 4777 +79e7 14 74 4777 +79fb 2 75 4777 +79fd b 76 4777 +7a08 7 77 4777 +7a0f 4 78 4777 +7a13 c 82 4777 +7a1f 3 86 4777 +7a22 6 87 4777 +7a28 a 83 4777 +FUNC 7a32 2d 4 _fileno +7a32 0 40 2176 +7a32 27 41 2176 +7a59 1 43 2176 +7a5a 4 42 2176 +7a5e 1 43 2176 +FUNC 7a5f e1 4 _commit +7a5f c 39 5043 +7a6b 1b 43 5043 +7a86 28 44 5043 +7aae 20 45 5043 +7ace 7 47 5043 +7ad5 3 48 5043 +7ad8 9 49 5043 +7ae1 14 51 5043 +7af5 9 52 5043 +7afe 2 54 5043 +7b00 3 55 5043 +7b03 5 59 5043 +7b08 a 62 5043 +7b12 b 66 5043 +7b1d 4 67 5043 +7b21 c 72 5043 +7b2d 3 75 5043 +7b30 6 76 5043 +7b36 a 73 5043 +FUNC 7b40 49 0 _mtinitlocks +7b40 2 137 2371 +7b42 7 144 2371 +7b49 11 145 2371 +7b5a 2 146 2371 +7b5c 15 148 2371 +7b71 6 144 2371 +7b77 5 157 2371 +7b7c d 158 2371 +FUNC 7b89 55 0 _mtdeletelocks +7b89 1 188 2371 +7b8a d 194 2371 +7b97 c 196 2371 +7ba3 3 200 2371 +7ba6 6 206 2371 +7bac f 207 2371 +7bbb 6 215 2371 +7bc1 c 217 2371 +7bcd 10 221 2371 +7bdd 1 224 2371 +FUNC 7bde 15 4 _unlock +7bde 3 371 2371 +7be1 10 375 2371 +7bf1 2 376 2371 +FUNC 7bf3 18 4 _lockerr_exit +7bf3 0 403 2371 +7bf3 c 404 2371 +7bff b 405 2371 +7c0a 1 406 2371 +FUNC 7c0b c3 4 _mtinitlocknum +7c0b c 259 2371 +7c17 6 261 2371 +7c1d a 269 2371 +7c27 5 270 2371 +7c2c 7 271 2371 +7c33 c 272 2371 +7c3f e 276 2371 +7c4d 4 277 2371 +7c51 e 279 2371 +7c5f b 280 2371 +7c6a 4 281 2371 +7c6e 8 284 2371 +7c76 3 285 2371 +7c79 4 287 2371 +7c7d 11 288 2371 +7c8e 7 289 2371 +7c95 b 290 2371 +7ca0 3 291 2371 +7ca3 2 292 2371 +7ca5 2 293 2371 +7ca7 2 296 2371 +7ca9 7 297 2371 +7cb0 c 300 2371 +7cbc 3 304 2371 +7cbf 6 305 2371 +7cc5 9 301 2371 +FUNC 7cce 31 4 _lock +7cce 3 333 2371 +7cd1 10 338 2371 +7ce1 b 340 2371 +7cec 8 341 2371 +7cf4 9 348 2371 +7cfd 2 349 2371 +FUNC 7cff 240 0 _ioinit +7cff c 111 4958 +7d0b 5 122 4958 +7d10 a 127 4958 +7d1a 7 128 4958 +7d21 f 137 4958 +7d30 6 139 4958 +7d36 5 142 4958 +7d3b 6 143 4958 +7d41 8 145 4958 +7d49 4 146 4958 +7d4d 3 147 4958 +7d50 4 148 4958 +7d54 3 149 4958 +7d57 4 151 4958 +7d5b 4 152 4958 +7d5f 4 153 4958 +7d63 13 145 4958 +7d76 15 161 4958 +7d8b 2 166 4958 +7d8d 3 172 4958 +7d90 6 173 4958 +7d96 b 179 4958 +7da1 5 185 4958 +7da6 f 191 4958 +7db5 9 204 4958 +7dbe 7 205 4958 +7dc5 8 207 4958 +7dcd 4 208 4958 +7dd1 3 209 4958 +7dd4 4 210 4958 +7dd8 4 211 4958 +7ddc 4 212 4958 +7de0 4 213 4958 +7de4 4 214 4958 +7de8 f 207 4958 +7df7 9 185 4958 +7e00 2 284 4958 +7e02 6 197 4958 +7e08 8 221 4958 +7e10 24 234 4958 +7e34 15 236 4958 +7e49 7 237 4958 +7e50 5 238 4958 +7e55 18 241 4958 +7e6d 3 243 4958 +7e70 d 221 4958 +7e7d 2 253 4958 +7e7f b 255 4958 +7e8a c 258 4958 +7e96 6 306 4958 +7e9c 4 262 4958 +7ea0 30 266 4958 +7ed0 2 271 4958 +7ed2 a 277 4958 +7edc 6 278 4958 +7ee2 5 279 4958 +7ee7 4 280 4958 +7eeb 14 284 4958 +7eff 3 286 4958 +7f02 2 288 4958 +7f04 4 297 4958 +7f08 6 298 4958 +7f0e a 253 4958 +7f18 c 313 4958 +7f24 4 315 4958 +7f28 7 128 4958 +7f2f a 129 4958 +7f39 6 316 4958 +FUNC 7f3f 4c 0 _ioterm +7f3f 2 341 4958 +7f41 5 345 4958 +7f46 6 347 4958 +7f4c 8 353 4958 +7f54 9 355 4958 +7f5d 11 356 4958 +7f6e 4 353 4958 +7f72 7 361 4958 +7f79 11 362 4958 +7f8a 1 365 4958 +FUNC 7f8b 21 4 wait_a_bit +7f8b 1 18 5557 +7f8c b 19 5557 +7f97 6 20 5557 +7f9d 8 21 5557 +7fa5 3 22 5557 +7fa8 3 23 5557 +7fab 1 24 5557 +FUNC 7fac 10 4 _set_malloc_crt_max_wait +7fac 0 32 5557 +7fac f 34 5557 +7fbb 1 36 5557 +FUNC 7fbc 40 4 _malloc_crt +7fbc 2 39 5557 +7fbe 2 40 5557 +7fc0 b 44 5557 +7fcb d 45 5557 +7fd8 18 46 5557 +7ff0 7 47 5557 +7ff7 4 50 5557 +7ffb 1 51 5557 +FUNC 7ffc 48 8 _calloc_crt +7ffc 2 54 5557 +7ffe 2 55 5557 +8000 14 61 5557 +8014 c 62 5557 +8020 18 63 5557 +8038 7 64 5557 +803f 4 67 5557 +8043 1 68 5557 +FUNC 8044 4b 8 _realloc_crt +8044 2 71 5557 +8046 2 72 5557 +8048 f 76 5557 +8057 14 77 5557 +806b 18 78 5557 +8083 7 79 5557 +808a 4 82 5557 +808e 1 83 5557 +FUNC 808f 50 c _recalloc_crt +808f 2 86 5557 +8091 2 87 5557 +8093 16 91 5557 +80a9 12 92 5557 +80bb 18 94 5557 +80d3 7 95 5557 +80da 4 100 5557 +80de 1 101 5557 +FUNC 80df 8 0 _malloc_crt_fastcall +80df 0 105 5557 +80df 7 106 5557 +80e6 1 107 5557 +FUNC 80e7 a 0 _calloc_crt_fastcall +80e7 0 110 5557 +80e7 9 111 5557 +80f0 1 112 5557 +FUNC 80f1 a 0 _realloc_crt_fastcall +80f1 0 115 5557 +80f1 9 116 5557 +80fa 1 117 5557 +FUNC 80fb 8e 4 free +80fb c 42 5515 +8107 7 47 5515 +810e 9 53 5515 +8117 8 57 5515 +811f 4 58 5515 +8123 e 60 5515 +8131 9 61 5515 +813a c 64 5515 +8146 6 68 5515 +814c 3 70 5515 +814f 2 106 5515 +8151 9 65 5515 +815a f 109 5515 +8169 4 110 5515 +816d 16 112 5515 +8183 6 115 5515 +FUNC 8189 9f 0 _fcloseall +8189 c 43 1792 +8195 5 44 1792 +819a 8 47 1792 +81a2 3 48 1792 +81a5 e 50 1792 +81b3 10 52 1792 +81c3 14 57 1792 +81d7 3 58 1792 +81da 5 63 1792 +81df 12 65 1792 +81f1 e 66 1792 +81ff 8 67 1792 +8207 3 50 1792 +820a c 73 1792 +8216 3 77 1792 +8219 6 78 1792 +821f 9 74 1792 +FUNC 8228 19 4 std::bad_exception::bad_exception(char const *) +8228 13 351 6035 +823b 6 352 6035 +FUNC 8241 b 0 std::bad_exception::~bad_exception() +8241 6 355 6035 +8247 5 356 6035 +FUNC 824c 22 0 std::bad_exception::`vector deleting destructor'(unsigned int) +FUNC 826e 5c c __TypeMatch +826e 2 999 6034 +8270 13 1001 6034 +8283 1b 1008 6034 +829e 4 1009 6034 +82a2 22 1023 6034 +82c4 5 1002 6034 +82c9 1 1024 6034 +FUNC 82ca 44 4 __FrameUnwindFilter +82ca 0 1035 6034 +82ca 6 1038 6034 +82d0 e 1040 6034 +82de 13 1076 6034 +82f1 e 1068 6034 +82ff c 1070 6034 +830b 2 1072 6034 +830d 1 1078 6034 +FUNC 830e e1 10 __FrameUnwindToState +830e c 1105 6034 +831a 1b 1112 6034 +8335 c 1114 6034 +8341 4 1115 6034 +8345 5 1119 6034 +834a f 1123 6034 +8359 f 1126 6034 +8368 7 1128 6034 +836f 6 1131 6034 +8375 3 1138 6034 +8378 12 1145 6034 +838a 6 1149 6034 +8390 d 1151 6034 +839d d 1153 6034 +83aa 3 1155 6034 +83ad 2 1156 6034 +83af c 1157 6034 +83bb a 1169 6034 +83c5 3 1176 6034 +83c8 6 1180 6034 +83ce 6 1157 6034 +83d4 e 1158 6034 +83e2 d 1159 6034 +FUNC 83ef 45 0 ExFilterRethrow +83ef 0 1533 6034 +83ef 2 1535 6034 +83f1 2f 1538 6034 +8420 e 1542 6034 +842e 2 1543 6034 +8430 1 1547 6034 +8431 2 1545 6034 +8433 1 1547 6034 +FUNC 8434 54 8 __DestructExceptionObject +8434 c 1791 6034 +8440 f 1794 6034 +844f e 1801 6034 +845d 4 1803 6034 +8461 9 1810 6034 +846a 7 1814 6034 +8471 6 1824 6034 +8477 c 1815 6034 +8483 5 1819 6034 +FUNC 8488 25 8 __AdjustPointer +8488 0 1842 6034 +8488 d 1843 6034 +8495 6 1845 6034 +849b 3 1850 6034 +849e e 1852 6034 +84ac 1 1856 6034 +FUNC 84ad 13 0 __uncaught_exception() +84ad 0 1867 6034 +84ad 12 1868 6034 +84bf 1 1869 6034 +FUNC 84c0 b3 8 __CxxRegisterExceptionObject +84c0 0 2077 6034 +84c0 14 2085 6034 +84d4 26 2087 6034 +84fa 6 2088 6034 +8500 b 2090 6034 +850b b 2093 6034 +8516 e 2094 6034 +8524 e 2095 6034 +8532 b 2096 6034 +853d 2 2097 6034 +853f 4 2098 6034 +8543 4 2099 6034 +8547 c 2101 6034 +8553 10 2102 6034 +8563 c 2103 6034 +856f 3 2104 6034 +8572 1 2105 6034 +FUNC 8573 4c 4 __CxxDetectRethrow +8573 0 2117 6034 +8573 6 2119 6034 +8579 2 2120 6034 +857b 2 2121 6034 +857d 2f 2122 6034 +85ac c 2123 6034 +85b8 3 2124 6034 +85bb 1 2127 6034 +85bc 2 2126 6034 +85be 1 2127 6034 +FUNC 85bf 139 8 __CxxUnregisterExceptionObject +85bf 1 2139 6034 +85c0 4 2143 6034 +85c4 d 2145 6034 +85d1 6 2146 6034 +85d7 85 2149 6034 +865c 14 2150 6034 +8670 5b 2152 6034 +86cb c 2153 6034 +86d7 e 2154 6034 +86e5 12 2155 6034 +86f7 1 2157 6034 +FUNC 86f8 4 0 __CxxQueryExceptionSize +86f8 0 2167 6034 +86f8 3 2168 6034 +86fb 1 2169 6034 +FUNC 86fc 32 8 __CxxCallUnwindDtor +86fc c 2189 6034 +8708 4 2190 6034 +870c 6 2192 6034 +8712 2 2193 6034 +8714 d 2194 6034 +8721 7 2197 6034 +8728 6 2198 6034 +FUNC 872e 33 8 __CxxCallUnwindDelDtor +872e c 2218 6034 +873a 4 2219 6034 +873e 7 2221 6034 +8745 2 2222 6034 +8747 d 2223 6034 +8754 7 2226 6034 +875b 6 2227 6034 +FUNC 8761 32 8 __CxxCallUnwindStdDelDtor +8761 c 2247 6034 +876d 4 2248 6034 +8771 6 2250 6034 +8777 2 2251 6034 +8779 d 2252 6034 +8786 7 2255 6034 +878d 6 2256 6034 +FUNC 8793 3b 14 __CxxCallUnwindVecDtor +8793 c 2282 6034 +879f 4 2283 6034 +87a3 f 2285 6034 +87b2 2 2286 6034 +87b4 d 2287 6034 +87c1 7 2290 6034 +87c8 6 2291 6034 +FUNC 87ce 79 4 IsInExceptionSpec +87ce 6 2302 6034 +87d4 9 2303 6034 +87dd 5 2307 6034 +87e2 f 2323 6034 +87f1 9 2326 6034 +87fa 2 2327 6034 +87fc 10 2328 6034 +880c 26 2335 6034 +8832 4 2337 6034 +8836 c 2323 6034 +8842 3 2343 6034 +8845 2 2344 6034 +FUNC 8847 49 4 CallUnexpected +8847 c 2379 6034 +8853 13 2380 6034 +8866 4 2383 6034 +886a 5 2384 6034 +886f 4 2391 6034 +8873 5 2392 6034 +8878 8 2388 6034 +8880 10 2390 6034 +FUNC 8890 30 0 Is_bad_exception_allowed +8890 2 2399 6034 +8892 8 2400 6034 +889a 1d 2402 6034 +88b7 4 2408 6034 +88bb 1 2409 6034 +88bc 4 2404 6034 +FUNC 88c0 82 8 _is_exception_typeof(type_info const &,_EXCEPTION_POINTERS *) +88c0 1 2416 6034 +88c1 e 2417 6034 +88cf 2 2419 6034 +88d1 9 2422 6034 +88da 2b 2423 6034 +8905 6 2432 6034 +890b 7 2433 6034 +8912 2 2445 6034 +8914 20 2446 6034 +8934 4 2439 6034 +8938 4 2454 6034 +893c 6 2455 6034 +FUNC 8942 19c 18 CallCatchBlock +8942 14 1431 6034 +8956 3 1437 6034 +8959 4 1439 6034 +895d 6 1443 6034 +8963 11 1447 6034 +8974 e 1451 6034 +8982 e 1452 6034 +8990 b 1454 6034 +899b e 1455 6034 +89a9 a 1457 6034 +89b3 3 1458 6034 +89b6 16 1463 6034 +89cc 12 1464 6034 +89de c 1465 6034 +89ea 3 1470 6034 +89ed 15 1471 6034 +8a02 3 1472 6034 +8a05 c 1474 6034 +8a11 11 1476 6034 +8a22 7 1478 6034 +8a29 d 1482 6034 +8a36 b 1486 6034 +8a41 13 1488 6034 +8a54 3 1517 6034 +8a57 6 1518 6034 +8a5d 5 1474 6034 +8a62 6 1488 6034 +8a68 6 1494 6034 +8a6e 9 1497 6034 +8a77 e 1500 6034 +8a85 e 1501 6034 +8a93 3f 1510 6034 +8ad2 c 1511 6034 +FUNC 8ade 17f 10 __BuildCatchObjectHelper +8ade c 1575 6034 +8aea 5 1576 6034 +8aef 2a 1582 6034 +8b19 2 1588 6034 +8b1b 3 1590 6034 +8b1e 2 1588 6034 +8b20 2 1592 6034 +8b22 4 1611 6034 +8b26 3 1614 6034 +8b29 4 1622 6034 +8b2d 4 1615 6034 +8b31 26 1622 6034 +8b57 5 1623 6034 +8b5c 11 1625 6034 +8b6d 5 1628 6034 +8b72 3 1629 6034 +8b75 6 1636 6034 +8b7b 4 1629 6034 +8b7f 20 1636 6034 +8b9f 12 1637 6034 +8bb1 10 1639 6034 +8bc1 4 1641 6034 +8bc5 2 1646 6034 +8bc7 5 1649 6034 +8bcc 18 1654 6034 +8be4 1e 1656 6034 +8c02 2 1660 6034 +8c04 25 1668 6034 +8c29 d 1672 6034 +8c36 2 1677 6034 +8c38 5 1678 6034 +8c3d 7 1681 6034 +8c44 5 1688 6034 +8c49 7 1682 6034 +8c50 5 1684 6034 +8c55 2 1584 6034 +8c57 6 1689 6034 +FUNC 8c5d 91 10 __BuildCatchObject +8c5d c 1712 6034 +8c69 b 1716 6034 +8c74 3 1718 6034 +8c77 2 1720 6034 +8c79 a 1739 6034 +8c83 4 1743 6034 +8c87 1a 1744 6034 +8ca1 1a 1756 6034 +8cbb 2 1757 6034 +8cbd 18 1750 6034 +8cd5 7 1762 6034 +8cdc 6 1769 6034 +8ce2 7 1763 6034 +8ce9 5 1765 6034 +FUNC 8cee 143 10 __CxxExceptionFilter +8cee 3 1973 6034 +8cf1 a 1985 6034 +8cfb 3 2065 6034 +8cfe 2a 1993 6034 +8d28 32 2008 6034 +8d5a 6 2010 6034 +8d60 c 2011 6034 +8d6c 6 2012 6034 +8d72 b 2013 6034 +8d7d f 2040 6034 +8d8c a 2041 6034 +8d96 2 2047 6034 +8d98 1b 2050 6034 +8db3 4 2042 6034 +8db7 2 2050 6034 +8db9 c 2052 6034 +8dc5 6 2053 6034 +8dcb 13 2054 6034 +8dde 2 2055 6034 +8de0 25 1995 6034 +8e05 6 1997 6034 +8e0b e 1999 6034 +8e19 4 2000 6034 +8e1d c 2004 6034 +8e29 6 2005 6034 +8e2f 2 2065 6034 +FUNC 8e31 6c 20 CatchIt +8e31 3 1217 6034 +8e34 6 1233 6034 +8e3a 10 1234 6034 +8e4a 4 1253 6034 +8e4e 6 1254 6034 +8e54 2 1255 6034 +8e56 8 1256 6034 +8e5e e 1259 6034 +8e6c 3 1265 6034 +8e6f 21 1273 6034 +8e90 4 1278 6034 +8e94 7 1280 6034 +8e9b 2 1286 6034 +FUNC 8e9d f2 20 FindHandlerForForeignException +8e9d 6 913 6034 +8ea3 10 920 6034 +8eb3 2a 926 6034 +8edd 23 934 6034 +8f00 e 940 6034 +8f0e 17 945 6034 +8f25 c 948 6034 +8f31 29 954 6034 +8f5a 33 974 6034 +8f8d 2 984 6034 +FUNC 8f8f 356 20 FindHandler +8f8f 6 569 6034 +8f95 20 632 6034 +8fb5 11 634 6034 +8fc6 42 637 6034 +9008 12 639 6034 +901a e 645 6034 +9028 b 646 6034 +9033 16 652 6034 +9049 2a 653 6034 +9073 12 659 6034 +9085 b 661 6034 +9090 5 662 6034 +9095 15 666 6034 +90aa 23 676 6034 +90cd 5 692 6034 +90d2 c 686 6034 +90de 30 688 6034 +910e 2b 698 6034 +9139 d 707 6034 +9146 19 715 6034 +915f c 718 6034 +916b 10 729 6034 +917b 6 735 6034 +9181 3 736 6034 +9184 7 737 6034 +918b 9 740 6034 +9194 2 741 6034 +9196 7 742 6034 +919d 23 750 6034 +91c0 d 737 6034 +91cd 2 676 6034 +91cf 33 774 6034 +9202 3 718 6034 +9205 6 795 6034 +920b a 804 6034 +9215 27 812 6034 +923c f 814 6034 +924b 5 840 6034 +9250 5 841 6034 +9255 b 843 6034 +9260 5 844 6034 +9265 d 846 6034 +9272 6 847 6034 +9278 2 848 6034 +927a 8 849 6034 +9282 14 851 6034 +9296 b 853 6034 +92a1 6 863 6034 +92a7 a 864 6034 +92b1 1c 866 6034 +92cd 16 877 6034 +92e3 2 880 6034 +FUNC 92e5 18 4 std::bad_exception::bad_exception(std::bad_exception const &) +FUNC 92fd e4 20 __InternalCxxFrameHandler +92fd 6 412 6034 +9303 3d 426 6034 +9340 6 432 6034 +9346 6 435 6034 +934c 10 440 6034 +935c 11 479 6034 +936d 2 482 6034 +936f 18 489 6034 +9387 19 499 6034 +93a0 1d 513 6034 +93bd 1c 524 6034 +93d9 6 533 6034 +93df 2 535 6034 +FUNC 93e1 6c 0 _use_encode_pointer +93e1 7 66 2227 +93e8 2 72 2227 +93ea 12 75 2227 +93fc 7 76 2227 +9403 5 78 2227 +9408 7 82 2227 +940f 5 85 2227 +9414 e 91 2227 +9422 1f 93 2227 +9441 4 95 2227 +9445 6 100 2227 +944b 2 101 2227 +FUNC 944d 6e 4 _encode_pointer +944d 1 120 2227 +944e 2b 129 2227 +9479 8 145 2227 +9481 d 133 2227 +948e d 135 2227 +949b c 138 2227 +94a7 4 148 2227 +94ab a 150 2227 +94b5 5 153 2227 +94ba 1 154 2227 +FUNC 94bb 9 0 _encoded_null +94bb 0 173 2227 +94bb 8 174 2227 +94c3 1 175 2227 +FUNC 94c4 6e 4 _decode_pointer +94c4 1 194 2227 +94c5 2b 203 2227 +94f0 8 219 2227 +94f8 d 207 2227 +9505 d 209 2227 +9512 c 212 2227 +951e 4 222 2227 +9522 a 224 2227 +952c 5 227 2227 +9531 1 228 2227 +FUNC 9532 9 4 __crtTlsAlloc +9532 0 240 2227 +9532 6 241 2227 +9538 3 242 2227 +FUNC 953b 15 4 __fls_getvalue +953b 0 258 2227 +953b 12 259 2227 +954d 3 260 2227 +FUNC 9550 6 0 __get_flsindex +9550 0 272 2227 +9550 5 273 2227 +9555 1 274 2227 +FUNC 9556 32 0 __set_flsgetvalue +9556 1 286 2227 +9557 e 288 2227 +9565 4 289 2227 +9569 e 291 2227 +9577 d 292 2227 +9584 3 294 2227 +9587 1 298 2227 +FUNC 9588 19 8 __fls_setvalue +9588 0 315 2227 +9588 16 316 2227 +959e 3 317 2227 +FUNC 95a1 3d 0 _mtterm +95a1 0 473 2227 +95a1 a 480 2227 +95ab f 481 2227 +95ba 7 482 2227 +95c1 a 485 2227 +95cb 7 486 2227 +95d2 7 487 2227 +95d9 5 494 2227 +FUNC 95de bf 8 _initptd +95de c 521 2227 +95ea e 522 2227 +95f8 a 524 2227 +9602 6 525 2227 +9608 4 527 2227 +960c 9 529 2227 +9615 16 532 2227 +962b 10 533 2227 +963b 3 540 2227 +963e 7 544 2227 +9645 7 545 2227 +964c 8 546 2227 +9654 7 547 2227 +965b 8 551 2227 +9663 4 552 2227 +9667 6 553 2227 +966d 4 561 2227 +9671 8 562 2227 +9679 9 563 2227 +9682 c 565 2227 +968e 6 568 2227 +9694 9 566 2227 +FUNC 969d 77 0 _getptd_noexit +969d 2 588 2227 +969f 6 592 2227 +96a5 15 600 2227 +96ba 14 608 2227 +96ce 19 610 2227 +96e7 a 616 2227 +96f1 6 618 2227 +96f7 6 619 2227 +96fd 2 621 2227 +96ff 7 627 2227 +9706 2 628 2227 +9708 8 633 2227 +9710 3 635 2227 +9713 1 636 2227 +FUNC 9714 18 0 _getptd +9714 1 657 2227 +9715 7 658 2227 +971c 4 659 2227 +9720 8 660 2227 +9728 3 662 2227 +972b 1 663 2227 +FUNC 972c 121 4 _freefls +972c c 691 2227 +9738 b 702 2227 +9743 7 703 2227 +974a 7 704 2227 +9751 7 706 2227 +9758 7 707 2227 +975f 7 709 2227 +9766 7 710 2227 +976d 7 712 2227 +9774 7 713 2227 +977b 7 715 2227 +9782 7 716 2227 +9789 7 718 2227 +9790 7 719 2227 +9797 a 721 2227 +97a1 7 722 2227 +97a8 8 724 2227 +97b0 4 725 2227 +97b4 1a 728 2227 +97ce 7 729 2227 +97d5 c 731 2227 +97e1 8 735 2227 +97e9 7 737 2227 +97f0 7 738 2227 +97f7 7 740 2227 +97fe 15 743 2227 +9813 7 744 2227 +981a c 747 2227 +9826 7 751 2227 +982d 8 754 2227 +9835 3 731 2227 +9838 9 732 2227 +9841 3 747 2227 +9844 9 748 2227 +FUNC 984d 69 4 _freeptd +984d 0 778 2227 +984d a 783 2227 +9857 1b 795 2227 +9872 13 796 2227 +9885 16 802 2227 +989b 7 804 2227 +98a2 a 807 2227 +98ac 9 811 2227 +98b5 1 813 2227 +FUNC 98b6 6 0 __threadid +98b6 0 837 2227 +98b6 6 838 2227 +FUNC 98bc 6 0 __threadhandle +98bc 0 844 2227 +98bc 6 845 2227 +FUNC 98c2 184 0 _mtinit +98c2 1 346 2227 +98c3 d 355 2227 +98d0 4 356 2227 +98d4 5 357 2227 +98d9 3 358 2227 +98dc 2 444 2227 +98de e 362 2227 +98ec d 365 2227 +98f9 d 368 2227 +9906 d 371 2227 +9913 2a 372 2227 +993d a 375 2227 +9947 1a 379 2227 +9961 25 388 2227 +9986 5 393 2227 +998b b 400 2227 +9996 10 401 2227 +99a6 10 402 2227 +99b6 18 403 2227 +99ce 7 410 2227 +99d5 2 412 2227 +99d7 1b 418 2227 +99f2 2 420 2227 +99f4 2d 428 2227 +9a21 a 438 2227 +9a2b 6 440 2227 +9a31 6 441 2227 +9a37 5 443 2227 +9a3c 5 430 2227 +9a41 4 389 2227 +9a45 1 444 2227 +FUNC 9a46 39 0 terminate() +9a46 c 94 5983 +9a52 8 107 5983 +9a5a 4 111 5983 +9a5e 4 116 5983 +9a62 2 120 5983 +9a64 2 121 5983 +9a66 7 122 5983 +9a6d 7 127 5983 +9a74 5 135 5983 +9a79 6 136 5983 +FUNC 9a7f 13 0 unexpected() +9a7f 0 149 5983 +9a7f 8 159 5983 +9a87 4 163 5983 +9a8b 2 167 5983 +9a8d 5 173 5983 +FUNC 9a92 37 0 _inconsistency() +9a92 c 187 5983 +9a9e c 196 5983 +9aaa 4 197 5983 +9aae 4 202 5983 +9ab2 2 203 5983 +9ab4 2 204 5983 +9ab6 7 205 5983 +9abd 7 211 5983 +9ac4 5 217 5983 +FUNC 9ac9 11 4 _initp_eh_hooks +9ac9 0 74 5983 +9ac9 10 80 5983 +9ad9 1 81 5983 +FUNC 9ae0 4c c _CallSettingFrame +9ae0 3 48 5665 +9ae3 3 57 5665 +9ae6 1 58 5665 +9ae7 1 59 5665 +9ae8 3 60 5665 +9aeb 3 61 5665 +9aee 3 62 5665 +9af1 3 63 5665 +9af4 1 64 5665 +9af5 3 65 5665 +9af8 3 66 5665 +9afb 3 67 5665 +9afe 5 68 5665 +9b03 1 69 5665 +9b04 1 70 5665 +9b05 2 71 5665 +9b07 1 73 5665 +9b08 1 74 5665 +9b09 2 75 5665 +9b0b 1 76 5665 +9b0c 3 77 5665 +9b0f 1 78 5665 +9b10 2 79 5665 +9b12 6 80 5665 +9b18 2 81 5665 +9b1a 5 82 5665 +9b1f 1 84 5665 +9b20 5 85 5665 +9b25 1 86 5665 +9b26 1 87 5665 +9b27 1 88 5665 +9b28 4 89 5665 +PUBLIC 9b07 0 _NLG_Return +FUNC 9b2c b9 4 _onexit_nolock +9b2c 5 104 3259 +9b31 b 107 3259 +9b3c 13 108 3259 +9b4f 16 112 3259 +9b65 d 122 3259 +9b72 d 127 3259 +9b7f 14 129 3259 +9b93 3 134 3259 +9b96 14 136 3259 +9baa 3 147 3259 +9bad f 149 3259 +9bbc e 156 3259 +9bca c 157 3259 +9bd6 7 159 3259 +9bdd 6 114 3259 +9be3 2 160 3259 +FUNC 9be5 2f 0 __onexitinit +9be5 1 205 3259 +9be6 b 208 3259 +9bf1 9 209 3259 +9bfa e 211 3259 +9c08 4 216 3259 +9c0c 1 221 3259 +9c0d 3 218 3259 +9c10 3 220 3259 +9c13 1 221 3259 +FUNC 9c14 3c 4 _onexit +9c14 c 85 3259 +9c20 5 88 3259 +9c25 4 90 3259 +9c29 c 91 3259 +9c35 c 93 3259 +9c41 3 97 3259 +9c44 6 98 3259 +9c4a 6 94 3259 +FUNC 9c50 12 4 atexit +9c50 0 165 3259 +9c50 11 166 3259 +9c61 1 167 3259 +FUNC 9c62 4f 4 V6_HeapAlloc +9c62 c 27 5425 +9c6e 4 28 5425 +9c72 b 29 5425 +9c7d 8 31 5425 +9c85 4 32 5425 +9c89 a 33 5425 +9c93 c 35 5425 +9c9f 3 39 5425 +9ca2 6 40 5425 +9ca8 9 36 5425 +FUNC 9cb1 75 4 _heap_alloc +9cb1 0 90 5425 +9cb1 9 95 5425 +9cba 5 96 5425 +9cbf 7 97 5425 +9cc6 c 98 5425 +9cd2 a 104 5425 +9cdc 18 105 5425 +9cf4 1 129 5425 +9cf5 a 107 5425 +9cff 9 108 5425 +9d08 2 109 5425 +9d0a 4 121 5425 +9d0e 1 122 5425 +9d0f 6 124 5425 +9d15 10 126 5425 +9d25 1 129 5425 +FUNC 9d26 c3 4 malloc +9d26 1 155 5425 +9d27 16 159 5425 +9d3d 65 163 5425 +9da2 4 168 5425 +9da6 b 172 5425 +9db1 b 179 5425 +9dbc 2 183 5425 +9dbe 7 174 5425 +9dc5 8 193 5425 +9dcd 5 195 5425 +9dd2 1 196 5425 +9dd3 7 185 5425 +9dda b 186 5425 +9de5 3 187 5425 +9de8 1 196 5425 +FUNC 9de9 a 4 _initp_heap_handler +9de9 0 31 5230 +9de9 9 32 5230 +9df2 1 33 5230 +FUNC 9df3 31 4 _set_new_handler(int (*)(unsigned int)) +9df3 1 53 5230 +9df4 7 57 5230 +9dfb b 59 5230 +9e06 b 60 5230 +9e11 f 63 5230 +9e20 3 65 5230 +9e23 1 66 5230 +FUNC 9e24 9 4 _set_new_handler(int) +9e24 0 86 5230 +9e24 8 89 5230 +9e2c 1 90 5230 +FUNC 9e2d d 0 _query_new_handler() +9e2d 0 110 5230 +9e2d c 111 5230 +9e39 1 112 5230 +FUNC 9e3a 22 4 _callnewh +9e3a 0 131 5230 +9e3a b 133 5230 +9e45 10 135 5230 +9e55 3 138 5230 +9e58 1 139 5230 +9e59 2 136 5230 +9e5b 1 139 5230 +FUNC 9e5c 22 18 _invoke_watson_if_error +9e5c 3 754 5850 +9e5f 6 755 5850 +9e65 17 759 5850 +9e7c 2 760 5850 +FUNC 9e7e 70 4 type_info::_Type_info_dtor(type_info *) +9e7e c 62 5815 +9e8a 8 63 5815 +9e92 4 64 5815 +9e96 a 65 5815 +9ea0 d 70 5815 +9ead 4 72 5815 +9eb1 4 74 5815 +9eb5 6 79 5815 +9ebb 7 80 5815 +9ec2 9 94 5815 +9ecb 4 101 5815 +9ecf c 103 5815 +9edb 6 107 5815 +9ee1 2 83 5815 +9ee3 2 72 5815 +9ee5 9 104 5815 +FUNC 9eee f5 8 type_info::_Name_base(type_info const *,__type_info_node *) +9eee c 109 5815 +9efa e 113 5815 +9f08 24 124 5815 +9f2c 7 125 5815 +9f33 16 132 5815 +9f49 2 133 5815 +9f4b 5 132 5815 +9f50 b 136 5815 +9f5b 5 142 5815 +9f60 a 149 5815 +9f6a 4 150 5815 +9f6e 11 157 5815 +9f7f 20 158 5815 +9f9f 5 159 5815 +9fa4 9 165 5815 +9fad 3 166 5815 +9fb0 2 167 5815 +9fb2 7 173 5815 +9fb9 9 180 5815 +9fc2 c 181 5815 +9fce 3 188 5815 +9fd1 6 189 5815 +9fd7 3 181 5815 +9fda 9 182 5815 +FUNC 9fe3 70 4 type_info::_Type_info_dtor_internal(type_info *) +9fe3 c 197 5815 +9fef 8 198 5815 +9ff7 4 199 5815 +9ffb a 200 5815 +a005 d 205 5815 +a012 4 207 5815 +a016 4 209 5815 +a01a 6 214 5815 +a020 7 215 5815 +a027 9 229 5815 +a030 4 236 5815 +a034 c 238 5815 +a040 6 242 5815 +a046 2 218 5815 +a048 2 207 5815 +a04a 9 239 5815 +FUNC a053 31 10 __unDNameHelper +a053 3 249 5815 +a056 7 250 5815 +a05d 7 252 5815 +a064 1e 260 5815 +a082 2 261 5815 +FUNC a084 eb 8 type_info::_Name_base_internal(type_info const *,__type_info_node *) +a084 c 265 5815 +a090 e 269 5815 +a09e 1a 273 5815 +a0b8 7 274 5815 +a0bf 16 281 5815 +a0d5 2 282 5815 +a0d7 5 281 5815 +a0dc b 285 5815 +a0e7 5 291 5815 +a0ec a 298 5815 +a0f6 4 299 5815 +a0fa 11 306 5815 +a10b 20 307 5815 +a12b 5 308 5815 +a130 9 314 5815 +a139 3 315 5815 +a13c 2 316 5815 +a13e 7 322 5815 +a145 9 329 5815 +a14e c 330 5815 +a15a 3 337 5815 +a15d 6 338 5815 +a163 3 330 5815 +a166 9 331 5815 +FUNC a16f 53 4 __clean_type_info_names_internal +a16f c 346 5815 +a17b 8 347 5815 +a183 4 348 5815 +a187 6 352 5815 +a18d 4 354 5815 +a191 3 356 5815 +a194 7 357 5815 +a19b 8 358 5815 +a1a3 4 354 5815 +a1a7 c 359 5815 +a1b3 6 363 5815 +a1b9 9 361 5815 +FUNC a1d0 88 8 strcmp +a1d0 0 65 926 +a1d0 4 73 926 +a1d4 4 74 926 +a1d8 6 76 926 +a1de 2 77 926 +a1e0 2 81 926 +a1e2 2 83 926 +a1e4 2 84 926 +a1e6 2 85 926 +a1e8 2 86 926 +a1ea 3 87 926 +a1ed 2 88 926 +a1ef 2 89 926 +a1f1 2 90 926 +a1f3 3 92 926 +a1f6 3 94 926 +a1f9 2 95 926 +a1fb 2 96 926 +a1fd 2 97 926 +a1ff 3 98 926 +a202 2 99 926 +a204 3 100 926 +a207 3 101 926 +a20a 2 102 926 +a20c 4 103 926 +a210 2 107 926 +a212 2 108 926 +a214 2 115 926 +a216 2 116 926 +a218 3 117 926 +a21b 1 118 926 +a21c 6 122 926 +a222 2 123 926 +a224 2 125 926 +a226 3 126 926 +a229 2 127 926 +a22b 2 128 926 +a22d 3 129 926 +a230 2 130 926 +a232 2 131 926 +a234 6 133 926 +a23a 2 134 926 +a23c 3 139 926 +a23f 3 140 926 +a242 2 141 926 +a244 2 142 926 +a246 2 143 926 +a248 2 144 926 +a24a 3 145 926 +a24d 2 146 926 +a24f 2 147 926 +a251 2 148 926 +a253 3 149 926 +a256 2 150 926 +FUNC a258 65 c strcpy_s +a258 0 13 781 +a258 30 18 781 +a288 c 19 781 +a294 2 21 781 +a296 d 23 781 +a2a3 4 27 781 +a2a7 2 29 781 +a2a9 e 30 781 +a2b7 5 33 781 +a2bc 1 34 781 +FUNC a2c0 7a c memset +a2c0 0 59 934 +a2c0 4 68 934 +a2c4 4 69 934 +a2c8 2 71 934 +a2ca 2 72 934 +a2cc 2 74 934 +a2ce 4 75 934 +a2d2 2 78 934 +a2d4 2 79 934 +a2d6 6 80 934 +a2dc 2 81 934 +a2de 7 82 934 +a2e5 2 83 934 +a2e7 5 85 934 +a2ec 1 91 934 +a2ed 2 92 934 +a2ef 3 94 934 +a2f2 2 95 934 +a2f4 2 97 934 +a2f6 3 98 934 +a2f9 2 99 934 +a2fb 2 101 934 +a2fd 2 103 934 +a2ff 3 104 934 +a302 3 105 934 +a305 2 106 934 +a307 2 110 934 +a309 3 111 934 +a30c 2 113 934 +a30e 2 115 934 +a310 3 117 934 +a313 2 119 934 +a315 2 122 934 +a317 3 123 934 +a31a 3 124 934 +a31d 2 125 934 +a31f 2 127 934 +a321 2 129 934 +a323 2 130 934 +a325 2 134 934 +a327 3 135 934 +a32a 3 137 934 +a32d 2 138 934 +a32f 4 142 934 +a333 1 143 934 +a334 1 145 934 +a335 4 148 934 +a339 1 150 934 +FUNC a340 365 c memcpy +a340 3 101 1027 +a343 1 113 1027 +a344 1 114 1027 +a345 3 116 1027 +a348 3 117 1027 +a34b 3 119 1027 +a34e 2 129 1027 +a350 2 131 1027 +a352 2 132 1027 +a354 2 134 1027 +a356 2 135 1027 +a358 2 137 1027 +a35a 6 138 1027 +a360 6 147 1027 +a366 2 148 1027 +a368 7 150 1027 +a36f 2 151 1027 +a371 1 153 1027 +a372 1 154 1027 +a373 3 155 1027 +a376 3 156 1027 +a379 2 157 1027 +a37b 1 158 1027 +a37c 1 159 1027 +a37d 2 160 1027 +a37f 1 163 1027 +a380 1 164 1027 +a381 1 165 1027 +a382 5 166 1027 +a387 6 179 1027 +a38d 2 180 1027 +a38f 3 182 1027 +a392 3 183 1027 +a395 3 185 1027 +a398 2 186 1027 +a39a 2 188 1027 +a39c 8 190 1027 +a3a4 2 208 1027 +a3a6 5 209 1027 +a3ab 3 211 1027 +a3ae 2 212 1027 +a3b0 3 214 1027 +a3b3 2 215 1027 +a3b5 7 217 1027 +a3bc 8 221 1027 +a3c4 14 225 1027 +a3d8 2 232 1027 +a3da 2 233 1027 +a3dc 2 235 1027 +a3de 3 236 1027 +a3e1 3 238 1027 +a3e4 3 239 1027 +a3e7 3 241 1027 +a3ea 3 242 1027 +a3ed 3 244 1027 +a3f0 3 245 1027 +a3f3 3 247 1027 +a3f6 2 248 1027 +a3f8 2 250 1027 +a3fa a 252 1027 +a404 2 256 1027 +a406 2 257 1027 +a408 2 259 1027 +a40a 3 260 1027 +a40d 3 262 1027 +a410 3 263 1027 +a413 3 265 1027 +a416 3 266 1027 +a419 3 268 1027 +a41c 2 269 1027 +a41e 2 271 1027 +a420 8 273 1027 +a428 2 277 1027 +a42a 2 278 1027 +a42c 2 280 1027 +a42e 3 281 1027 +a431 3 283 1027 +a434 3 284 1027 +a437 3 286 1027 +a43a 2 287 1027 +a43c 2 289 1027 +a43e 2a 291 1027 +a468 4 298 1027 +a46c 4 300 1027 +a470 4 302 1027 +a474 4 304 1027 +a478 4 306 1027 +a47c 4 308 1027 +a480 4 310 1027 +a484 4 312 1027 +a488 4 314 1027 +a48c 4 316 1027 +a490 4 318 1027 +a494 4 320 1027 +a498 4 322 1027 +a49c 4 324 1027 +a4a0 7 326 1027 +a4a7 2 328 1027 +a4a9 2 329 1027 +a4ab 19 331 1027 +a4c4 3 340 1027 +a4c7 1 341 1027 +a4c8 1 342 1027 +a4c9 3 344 1027 +a4cc 2 348 1027 +a4ce 2 350 1027 +a4d0 3 351 1027 +a4d3 1 352 1027 +a4d4 1 353 1027 +a4d5 3 354 1027 +a4d8 2 358 1027 +a4da 2 360 1027 +a4dc 3 361 1027 +a4df 3 362 1027 +a4e2 3 363 1027 +a4e5 1 364 1027 +a4e6 1 365 1027 +a4e7 5 366 1027 +a4ec 2 370 1027 +a4ee 2 372 1027 +a4f0 3 373 1027 +a4f3 3 374 1027 +a4f6 3 375 1027 +a4f9 3 376 1027 +a4fc 3 377 1027 +a4ff 1 378 1027 +a500 1 379 1027 +a501 3 380 1027 +a504 4 391 1027 +a508 4 392 1027 +a50c 6 397 1027 +a512 2 398 1027 +a514 3 400 1027 +a517 3 401 1027 +a51a 3 403 1027 +a51d 2 404 1027 +a51f 1 406 1027 +a520 2 407 1027 +a522 1 408 1027 +a523 9 410 1027 +a52c 2 414 1027 +a52e a 417 1027 +a538 2 422 1027 +a53a 5 423 1027 +a53f 3 425 1027 +a542 2 426 1027 +a544 3 428 1027 +a547 2 429 1027 +a549 7 431 1027 +a550 14 435 1027 +a564 3 442 1027 +a567 2 443 1027 +a569 3 445 1027 +a56c 3 446 1027 +a56f 3 448 1027 +a572 3 449 1027 +a575 3 451 1027 +a578 2 452 1027 +a57a 1 454 1027 +a57b 2 455 1027 +a57d 1 456 1027 +a57e a 458 1027 +a588 3 462 1027 +a58b 2 463 1027 +a58d 3 465 1027 +a590 3 466 1027 +a593 3 468 1027 +a596 3 469 1027 +a599 3 471 1027 +a59c 3 472 1027 +a59f 3 474 1027 +a5a2 2 475 1027 +a5a4 1 477 1027 +a5a5 2 478 1027 +a5a7 1 479 1027 +a5a8 8 481 1027 +a5b0 3 485 1027 +a5b3 2 486 1027 +a5b5 3 488 1027 +a5b8 3 489 1027 +a5bb 3 491 1027 +a5be 3 492 1027 +a5c1 3 494 1027 +a5c4 3 495 1027 +a5c7 3 497 1027 +a5ca 3 498 1027 +a5cd 3 500 1027 +a5d0 6 501 1027 +a5d6 1 503 1027 +a5d7 2 504 1027 +a5d9 1 505 1027 +a5da 2a 507 1027 +a604 4 516 1027 +a608 4 518 1027 +a60c 4 520 1027 +a610 4 522 1027 +a614 4 524 1027 +a618 4 526 1027 +a61c 4 528 1027 +a620 4 530 1027 +a624 4 532 1027 +a628 4 534 1027 +a62c 4 536 1027 +a630 4 538 1027 +a634 4 540 1027 +a638 4 542 1027 +a63c 7 544 1027 +a643 2 546 1027 +a645 2 547 1027 +a647 19 549 1027 +a660 3 558 1027 +a663 1 560 1027 +a664 1 561 1027 +a665 3 562 1027 +a668 3 566 1027 +a66b 3 568 1027 +a66e 3 569 1027 +a671 1 570 1027 +a672 1 571 1027 +a673 5 572 1027 +a678 3 576 1027 +a67b 3 578 1027 +a67e 3 579 1027 +a681 3 580 1027 +a684 3 581 1027 +a687 1 582 1027 +a688 1 583 1027 +a689 3 584 1027 +a68c 3 588 1027 +a68f 3 590 1027 +a692 3 591 1027 +a695 3 592 1027 +a698 3 593 1027 +a69b 3 594 1027 +a69e 3 595 1027 +a6a1 1 596 1027 +a6a2 1 597 1027 +a6a3 2 598 1027 +FUNC a6b0 365 c memmove +a6b0 3 101 977 +a6b3 1 113 977 +a6b4 1 114 977 +a6b5 3 116 977 +a6b8 3 117 977 +a6bb 3 119 977 +a6be 2 129 977 +a6c0 2 131 977 +a6c2 2 132 977 +a6c4 2 134 977 +a6c6 2 135 977 +a6c8 2 137 977 +a6ca 6 138 977 +a6d0 6 147 977 +a6d6 2 148 977 +a6d8 7 150 977 +a6df 2 151 977 +a6e1 1 153 977 +a6e2 1 154 977 +a6e3 3 155 977 +a6e6 3 156 977 +a6e9 2 157 977 +a6eb 1 158 977 +a6ec 1 159 977 +a6ed 2 160 977 +a6ef 1 163 977 +a6f0 1 164 977 +a6f1 1 165 977 +a6f2 5 166 977 +a6f7 6 179 977 +a6fd 2 180 977 +a6ff 3 182 977 +a702 3 183 977 +a705 3 185 977 +a708 2 186 977 +a70a 2 188 977 +a70c 8 190 977 +a714 2 208 977 +a716 5 209 977 +a71b 3 211 977 +a71e 2 212 977 +a720 3 214 977 +a723 2 215 977 +a725 7 217 977 +a72c 8 221 977 +a734 14 225 977 +a748 2 232 977 +a74a 2 233 977 +a74c 2 235 977 +a74e 3 236 977 +a751 3 238 977 +a754 3 239 977 +a757 3 241 977 +a75a 3 242 977 +a75d 3 244 977 +a760 3 245 977 +a763 3 247 977 +a766 2 248 977 +a768 2 250 977 +a76a a 252 977 +a774 2 256 977 +a776 2 257 977 +a778 2 259 977 +a77a 3 260 977 +a77d 3 262 977 +a780 3 263 977 +a783 3 265 977 +a786 3 266 977 +a789 3 268 977 +a78c 2 269 977 +a78e 2 271 977 +a790 8 273 977 +a798 2 277 977 +a79a 2 278 977 +a79c 2 280 977 +a79e 3 281 977 +a7a1 3 283 977 +a7a4 3 284 977 +a7a7 3 286 977 +a7aa 2 287 977 +a7ac 2 289 977 +a7ae 2a 291 977 +a7d8 4 298 977 +a7dc 4 300 977 +a7e0 4 302 977 +a7e4 4 304 977 +a7e8 4 306 977 +a7ec 4 308 977 +a7f0 4 310 977 +a7f4 4 312 977 +a7f8 4 314 977 +a7fc 4 316 977 +a800 4 318 977 +a804 4 320 977 +a808 4 322 977 +a80c 4 324 977 +a810 7 326 977 +a817 2 328 977 +a819 2 329 977 +a81b 19 331 977 +a834 3 340 977 +a837 1 341 977 +a838 1 342 977 +a839 3 344 977 +a83c 2 348 977 +a83e 2 350 977 +a840 3 351 977 +a843 1 352 977 +a844 1 353 977 +a845 3 354 977 +a848 2 358 977 +a84a 2 360 977 +a84c 3 361 977 +a84f 3 362 977 +a852 3 363 977 +a855 1 364 977 +a856 1 365 977 +a857 5 366 977 +a85c 2 370 977 +a85e 2 372 977 +a860 3 373 977 +a863 3 374 977 +a866 3 375 977 +a869 3 376 977 +a86c 3 377 977 +a86f 1 378 977 +a870 1 379 977 +a871 3 380 977 +a874 4 391 977 +a878 4 392 977 +a87c 6 397 977 +a882 2 398 977 +a884 3 400 977 +a887 3 401 977 +a88a 3 403 977 +a88d 2 404 977 +a88f 1 406 977 +a890 2 407 977 +a892 1 408 977 +a893 9 410 977 +a89c 2 414 977 +a89e a 417 977 +a8a8 2 422 977 +a8aa 5 423 977 +a8af 3 425 977 +a8b2 2 426 977 +a8b4 3 428 977 +a8b7 2 429 977 +a8b9 7 431 977 +a8c0 14 435 977 +a8d4 3 442 977 +a8d7 2 443 977 +a8d9 3 445 977 +a8dc 3 446 977 +a8df 3 448 977 +a8e2 3 449 977 +a8e5 3 451 977 +a8e8 2 452 977 +a8ea 1 454 977 +a8eb 2 455 977 +a8ed 1 456 977 +a8ee a 458 977 +a8f8 3 462 977 +a8fb 2 463 977 +a8fd 3 465 977 +a900 3 466 977 +a903 3 468 977 +a906 3 469 977 +a909 3 471 977 +a90c 3 472 977 +a90f 3 474 977 +a912 2 475 977 +a914 1 477 977 +a915 2 478 977 +a917 1 479 977 +a918 8 481 977 +a920 3 485 977 +a923 2 486 977 +a925 3 488 977 +a928 3 489 977 +a92b 3 491 977 +a92e 3 492 977 +a931 3 494 977 +a934 3 495 977 +a937 3 497 977 +a93a 3 498 977 +a93d 3 500 977 +a940 6 501 977 +a946 1 503 977 +a947 2 504 977 +a949 1 505 977 +a94a 2a 507 977 +a974 4 516 977 +a978 4 518 977 +a97c 4 520 977 +a980 4 522 977 +a984 4 524 977 +a988 4 526 977 +a98c 4 528 977 +a990 4 530 977 +a994 4 532 977 +a998 4 534 977 +a99c 4 536 977 +a9a0 4 538 977 +a9a4 4 540 977 +a9a8 4 542 977 +a9ac 7 544 977 +a9b3 2 546 977 +a9b5 2 547 977 +a9b7 19 549 977 +a9d0 3 558 977 +a9d3 1 560 977 +a9d4 1 561 977 +a9d5 3 562 977 +a9d8 3 566 977 +a9db 3 568 977 +a9de 3 569 977 +a9e1 1 570 977 +a9e2 1 571 977 +a9e3 5 572 977 +a9e8 3 576 977 +a9eb 3 578 977 +a9ee 3 579 977 +a9f1 3 580 977 +a9f4 3 581 977 +a9f7 1 582 977 +a9f8 1 583 977 +a9f9 3 584 977 +a9fc 3 588 977 +a9ff 3 590 977 +aa02 3 591 977 +aa05 3 592 977 +aa08 3 593 977 +aa0b 3 594 977 +aa0e 3 595 977 +aa11 1 596 977 +aa12 1 597 977 +aa13 2 598 977 +FUNC aa15 3d 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *) +aa15 0 67 5721 +aa15 33 68 5721 +aa48 5 69 5721 +aa4d 2 72 5721 +aa4f 3 73 5721 +FUNC aa52 e 0 __CxxSetUnhandledExceptionFilter +aa52 0 86 5721 +aa52 b 89 5721 +aa5d 2 90 5721 +aa5f 1 91 5721 +FUNC aa60 1a0 4 _NMSG_WRITE +aa60 2 174 2418 +aa62 a 178 2418 +aa6c f 179 2418 +aa7b a 182 2418 +aa85 2a 203 2418 +aaaf c 215 2418 +aabb 2a 224 2418 +aae5 1e 227 2418 +ab03 26 228 2418 +ab29 d 231 2418 +ab36 b 233 2418 +ab41 2f 234 2418 +ab70 20 237 2418 +ab90 22 238 2418 +abb2 15 242 2418 +abc7 a 205 2418 +abd1 9 206 2418 +abda 24 212 2418 +abfe 2 245 2418 +FUNC ac00 20 4 _GET_RTERRMSG +ac00 0 268 2418 +ac00 2 271 2418 +ac02 13 272 2418 +ac15 2 275 2418 +ac17 1 276 2418 +ac18 7 273 2418 +ac1f 1 276 2418 +FUNC ac20 39 0 _FF_MSGBANNER +ac20 0 141 2418 +ac20 22 145 2418 +ac42 a 147 2418 +ac4c c 148 2418 +ac58 1 150 2418 +FUNC ac59 1 4 _initp_misc_winxfltr +ac59 0 105 2752 +ac59 1 106 2752 +FUNC ac5a 32 4 xcptlookup +ac5a 0 410 2752 +ac5a b 411 2752 +ac65 14 418 2752 +ac79 e 425 2752 +ac87 2 428 2752 +ac89 2 426 2752 +ac8b 1 429 2752 +FUNC ac8c 15e 8 _XcptFilter +ac8c 6 206 2752 +ac92 7 213 2752 +ac99 8 214 2752 +aca1 34 219 2752 +acd5 2 221 2752 +acd7 2 225 2752 +acd9 3 227 2752 +acdc 7 234 2752 +ace3 7 235 2752 +acea 5 243 2752 +acef 4 248 2752 +acf3 8 249 2752 +acfb 3 255 2752 +acfe 6 259 2752 +ad04 6 273 2752 +ad0a 6 274 2752 +ad10 c 283 2752 +ad1c 17 291 2752 +ad33 1e 294 2752 +ad51 3 291 2752 +ad54 c 321 2752 +ad60 9 323 2752 +ad69 7 325 2752 +ad70 9 327 2752 +ad79 7 329 2752 +ad80 9 331 2752 +ad89 7 333 2752 +ad90 9 335 2752 +ad99 7 337 2752 +ada0 9 339 2752 +ada9 7 341 2752 +adb0 9 343 2752 +adb9 7 345 2752 +adc0 7 347 2752 +adc7 8 356 2752 +adcf 3 361 2752 +add2 2 363 2752 +add4 4 368 2752 +add8 3 369 2752 +addb 7 375 2752 +ade2 6 377 2752 +ade8 2 379 2752 +FUNC adea 1b 8 __CppXcptFilter +adea 0 145 2752 +adea b 146 2752 +adf5 c 147 2752 +ae01 1 151 2752 +ae02 2 149 2752 +ae04 1 151 2752 +FUNC ae05 db 0 _setenvp +ae05 1 77 2280 +ae06 c 85 2280 +ae12 5 86 2280 +ae17 8 91 2280 +ae1f 4 98 2280 +ae23 8 99 2280 +ae2b 4 110 2280 +ae2f 1 111 2280 +ae30 11 112 2280 +ae41 15 117 2280 +ae56 2 118 2280 +ae58 9 121 2280 +ae61 9 123 2280 +ae6a 6 125 2280 +ae70 10 127 2280 +ae80 1c 133 2280 +ae9c 3 134 2280 +ae9f 6 121 2280 +aea5 b 138 2280 +aeb0 6 139 2280 +aeb6 2 142 2280 +aeb8 a 149 2280 +aec2 7 152 2280 +aec9 17 153 2280 +FUNC aee0 a 4 _set_pgmptr +aee0 a 334 2303 +FUNC aeea 198 c parse_cmdline +aeea 4 218 2322 +aeee 6 226 2322 +aef4 8 230 2322 +aefc 14 231 2322 +af10 3 250 2322 +af13 5 252 2322 +af18 5 254 2322 +af1d 9 255 2322 +af26 2 256 2322 +af28 2 258 2322 +af2a 4 259 2322 +af2e 8 260 2322 +af36 2 262 2322 +af38 f 264 2322 +af47 2 265 2322 +af49 6 266 2322 +af4f a 267 2322 +af59 1 268 2322 +af5a 1a 272 2322 +af74 4 277 2322 +af78 4 278 2322 +af7c 4 281 2322 +af80 9 286 2322 +af89 a 287 2322 +af93 3 288 2322 +af96 1 275 2322 +af97 2 276 2322 +af99 9 291 2322 +afa2 6 295 2322 +afa8 9 296 2322 +afb1 2 297 2322 +afb3 3 311 2322 +afb6 4 315 2322 +afba 1 318 2322 +afbb 1 319 2322 +afbc 5 316 2322 +afc1 5 321 2322 +afc6 5 324 2322 +afcb e 325 2322 +afd9 2 326 2322 +afdb 2 327 2322 +afdd d 329 2322 +afea 2 332 2322 +afec 5 336 2322 +aff1 4 337 2322 +aff5 4 338 2322 +aff9 6 339 2322 +afff 3 338 2322 +b002 14 343 2322 +b016 4 348 2322 +b01a 2 349 2322 +b01c 10 350 2322 +b02c b 351 2322 +b037 2 352 2322 +b039 a 354 2322 +b043 2 355 2322 +b045 a 356 2322 +b04f 1 357 2322 +b050 2 358 2322 +b052 5 361 2322 +b057 1 363 2322 +b058 5 372 2322 +b05d 4 376 2322 +b061 7 377 2322 +b068 2 378 2322 +b06a 8 379 2322 +b072 9 382 2322 +b07b 3 383 2322 +b07e 2 384 2322 +b080 2 385 2322 +FUNC b082 b9 0 _setargv +b082 7 88 2322 +b089 c 97 2322 +b095 5 98 2322 +b09a 18 104 2322 +b0b2 19 120 2322 +b0cb 11 127 2322 +b0dc 15 132 2322 +b0f1 a 136 2322 +b0fb 2 138 2322 +b0fd 8 140 2322 +b105 3 141 2322 +b108 2 142 2322 +b10a 13 149 2322 +b11d c 153 2322 +b129 6 157 2322 +b12f 4 172 2322 +b133 6 134 2322 +b139 2 173 2322 +FUNC b13b 135 0 __crtGetEnvironmentStringsA +b13b 2 43 4307 +b13d 1a 57 4307 +b157 8 59 4307 +b15f c 60 4307 +b16b b 62 4307 +b176 e 63 4307 +b184 9 68 4307 +b18d 4 71 4307 +b191 8 72 4307 +b199 7 73 4307 +b1a0 7 77 4307 +b1a7 7 78 4307 +b1ae 7 79 4307 +b1b5 1b 93 4307 +b1d0 13 97 4307 +b1e3 11 111 4307 +b1f4 a 113 4307 +b1fe 8 114 4307 +b206 7 99 4307 +b20d 4 100 4307 +b211 6 123 4307 +b217 2 152 4307 +b219 a 126 4307 +b223 6 127 4307 +b229 4 133 4307 +b22d 5 134 4307 +b232 5 135 4307 +b237 5 138 4307 +b23c d 140 4307 +b249 7 141 4307 +b250 5 142 4307 +b255 b 145 4307 +b260 7 147 4307 +b267 6 149 4307 +b26d 3 153 4307 +FUNC b270 24 0 _RTC_Initialize +FUNC b294 24 0 _RTC_Terminate +FUNC b2b8 5b 0 __heap_select +b2b8 6 70 5473 +b2be 23 143 5473 +b2e1 1b 144 5473 +b2fc d 145 5473 +b309 3 146 5473 +b30c 2 164 5473 +b30e 3 161 5473 +b311 2 164 5473 +FUNC b313 5a 4 _heap_init +b313 0 192 5473 +b313 20 199 5473 +b333 2 200 5473 +b335 1 240 5473 +b336 5 204 5473 +b33b a 206 5473 +b345 f 209 5473 +b354 c 211 5473 +b360 7 212 5473 +b367 2 213 5473 +b369 3 239 5473 +b36c 1 240 5473 +FUNC b36d 74 0 _heap_term +b36d 1 261 5473 +b36e c 264 5473 +b37a 1b 270 5473 +b395 f 273 5473 +b3a4 b 276 5473 +b3af d 278 5473 +b3bc 11 281 5473 +b3cd c 300 5473 +b3d9 7 301 5473 +b3e0 1 302 5473 +FUNC b3e1 6 0 _get_heap_handle +b3e1 0 320 5473 +b3e1 5 322 5473 +b3e6 1 323 5473 +FUNC b3e7 94 0 __security_init_cookie +b3e7 6 97 3689 +b3ed 21 114 3689 +b40e 7 116 3689 +b415 3 117 3689 +b418 a 127 3689 +b422 6 132 3689 +b428 8 135 3689 +b430 8 136 3689 +b438 8 137 3689 +b440 10 139 3689 +b450 2 144 3689 +b452 4 161 3689 +b456 7 163 3689 +b45d 4 166 3689 +b461 7 168 3689 +b468 6 172 3689 +b46e b 173 3689 +b479 2 175 3689 +FUNC b47b 8 4 _crt_debugger_hook +b47b 0 62 3966 +b47b 7 65 3966 +b482 1 66 3966 +FUNC b483 160 8 _flsbuf +b483 5 93 2041 +b488 c 104 2041 +b494 8 106 2041 +b49c b 107 2041 +b4a7 4 108 2041 +b4ab 8 109 2041 +b4b3 4 110 2041 +b4b7 b 111 2041 +b4c2 3 113 2041 +b4c5 6 124 2041 +b4cb b 126 2041 +b4d6 3 127 2041 +b4d9 8 128 2041 +b4e1 9 137 2041 +b4ea f 141 2041 +b4f9 25 151 2041 +b51e 7 153 2041 +b525 d 158 2041 +b532 5 162 2041 +b537 5 163 2041 +b53c 6 164 2041 +b542 7 166 2041 +b549 10 167 2041 +b559 2 168 2041 +b55b 6 131 2041 +b561 5 132 2041 +b566 2e 169 2041 +b594 12 171 2041 +b5a6 2 174 2041 +b5a8 8 179 2041 +b5b0 2 186 2041 +b5b2 3 187 2041 +b5b5 13 189 2041 +b5c8 5 201 2041 +b5cd 4 202 2041 +b5d1 5 203 2041 +b5d6 b 207 2041 +b5e1 2 212 2041 +FUNC b5e3 25 4 write_char +b5e3 0 2433 1163 +b5e3 a 2434 1163 +b5ed 2 2437 1163 +b5ef 12 2440 1163 +b601 3 2444 1163 +b604 1 2447 1163 +b605 2 2446 1163 +b607 1 2447 1163 +FUNC b608 25 c write_multi_char +b608 6 2498 1163 +b60e 2 2501 1163 +b610 e 2500 1163 +b61e 6 2501 1163 +b624 7 2499 1163 +b62b 2 2504 1163 +FUNC b62d 4f 4 write_string +b62d 0 2563 1163 +b62d 12 2564 1163 +b63f 6 2566 1163 +b645 2 2567 1163 +b647 11 2570 1163 +b658 6 2571 1163 +b65e a 2573 1163 +b668 a 2574 1163 +b672 9 2569 1163 +b67b 1 2579 1163 +FUNC b67c 910 10 _woutput_l +b67c 1b 975 1163 +b697 72 1031 1163 +b709 4 1036 1163 +b70d 2c 1073 1163 +b739 1a 1075 1163 +b753 8 1076 1163 +b75b 18 1131 1163 +b773 2 1171 1163 +b775 13 1173 1163 +b788 3 1174 1163 +b78b 5 1175 1163 +b790 1f 1179 1163 +b7af 4 1193 1163 +b7b3 5 1194 1163 +b7b8 4 1181 1163 +b7bc 5 1182 1163 +b7c1 4 1184 1163 +b7c5 5 1185 1163 +b7ca 7 1190 1163 +b7d1 5 1191 1163 +b7d6 3 1187 1163 +b7d9 5 1196 1163 +b7de 6 1200 1163 +b7e4 9 1206 1163 +b7ed b 1233 1163 +b7f8 4 1235 1163 +b7fc 3 1236 1163 +b7ff 5 1239 1163 +b804 10 1241 1163 +b814 5 1243 1163 +b819 4 1248 1163 +b81d 5 1249 1163 +b822 6 1253 1163 +b828 9 1259 1163 +b831 b 1284 1163 +b83c 4 1285 1163 +b840 5 1287 1163 +b845 10 1289 1163 +b855 5 1291 1163 +b85a 1b 1295 1163 +b875 7 1362 1163 +b87c 5 1363 1163 +b881 6 1301 1163 +b887 2 1303 1163 +b889 a 1304 1163 +b893 5 1306 1163 +b898 4 1308 1163 +b89c 5 1310 1163 +b8a1 4 1358 1163 +b8a5 5 1359 1163 +b8aa 10 1322 1163 +b8ba 3 1324 1163 +b8bd f 1325 1163 +b8cc d 1327 1163 +b8d9 3 1329 1163 +b8dc a 1330 1163 +b8e6 5 1332 1163 +b8eb 3c 1337 1163 +b927 4 1352 1163 +b92b 13 1166 1163 +b93e 5 1167 1163 +b943 32 1378 1163 +b975 d 1716 1163 +b982 4 1724 1163 +b986 18 1749 1163 +b99e c 1750 1163 +b9aa c 1381 1163 +b9b6 9 1383 1163 +b9bf 8 1564 1163 +b9c7 4 1565 1163 +b9cb d 1584 1163 +b9d8 3 1589 1163 +b9db 13 1610 1163 +b9ee 4 1611 1163 +b9f2 8 1612 1163 +b9fa 19 1614 1163 +ba13 13 1618 1163 +ba26 1 1620 1163 +ba27 9 1621 1163 +ba30 5 1622 1163 +ba35 1d 1378 1163 +ba52 9 1397 1163 +ba5b f 1415 1163 +ba6a 3 1420 1163 +ba6d 25 1430 1163 +ba92 3 1434 1163 +ba95 2 1436 1163 +ba97 4 1437 1163 +ba9b 6 1439 1163 +baa1 3 1440 1163 +baa4 5 1506 1163 +baa9 5 1523 1163 +baae e 1541 1163 +babc 6 1546 1163 +bac2 b 1548 1163 +bacd 7 1549 1163 +bad4 5 1550 1163 +bad9 4 1551 1163 +badd 5 1553 1163 +bae2 8 1543 1163 +baea 7 1544 1163 +baf1 5 1557 1163 +baf6 34 1378 1163 +bb2a d 1908 1163 +bb37 9 1910 1163 +bb40 8 1668 1163 +bb48 d 1688 1163 +bb55 6 1702 1163 +bb5b 7 1703 1163 +bb62 2 1704 1163 +bb64 5 1706 1163 +bb69 7 1708 1163 +bb70 5 1710 1163 +bb75 4 1864 1163 +bb79 7 1869 1163 +bb80 c 1933 1163 +bb8c 8 1939 1163 +bb94 5 1958 1163 +bb99 8 1751 1163 +bba1 9 1752 1163 +bbaa 5 1753 1163 +bbaf 3 1754 1163 +bbb2 9 1756 1163 +bbbb f 1759 1163 +bbca 2 1760 1163 +bbcc 13 1765 1163 +bbdf 7 1767 1163 +bbe6 e 1809 1163 +bbf4 27 1828 1163 +bc1b 14 1838 1163 +bc2f 15 1840 1163 +bc44 b 1844 1163 +bc4f 15 1846 1163 +bc64 5 1852 1163 +bc69 7 1853 1163 +bc70 4 1854 1163 +bc74 1 1857 1163 +bc75 5 1859 1163 +bc7a 7 1877 1163 +bc81 3 1887 1163 +bc84 2 1888 1163 +bc86 1a 1378 1163 +bca0 7 1892 1163 +bca7 11 1897 1163 +bcb8 10 1900 1163 +bcc8 3 1901 1163 +bccb 5 1903 1163 +bcd0 6 1961 1163 +bcd6 6 1987 1163 +bcdc 16 2026 1163 +bcf2 2 2045 1163 +bcf4 5 2051 1163 +bcf9 2 2071 1163 +bcfb 4 2074 1163 +bcff 6 2080 1163 +bd05 2 2099 1163 +bd07 5 2105 1163 +bd0c 10 2128 1163 +bd1c 7 2129 1163 +bd23 7 2130 1163 +bd2a c 2136 1163 +bd36 2 2142 1163 +bd38 6 2148 1163 +bd3e 7 2149 1163 +bd45 2 2150 1163 +bd47 4 2151 1163 +bd4b a 2152 1163 +bd55 3 2153 1163 +bd58 6 2157 1163 +bd5e 3 2158 1163 +bd61 6 2163 1163 +bd67 10 2165 1163 +bd77 10 2166 1163 +bd87 c 2168 1163 +bd93 3 2170 1163 +bd96 3 2172 1163 +bd99 2 2173 1163 +bd9b 8 2175 1163 +bda3 1 2176 1163 +bda4 19 2180 1163 +bdbd 9 2181 1163 +bdc6 1 2182 1163 +bdc7 2 2185 1163 +bdc9 4 1625 1163 +bdcd 8 1626 1163 +bdd5 c 1628 1163 +bde1 7 1629 1163 +bde8 2 1630 1163 +bdea 4 1629 1163 +bdee 8 1631 1163 +bdf6 a 2201 1163 +be00 7 2204 1163 +be07 6 2205 1163 +be0d 6 2207 1163 +be13 2 2208 1163 +be15 4 2210 1163 +be19 6 2212 1163 +be1f 2 2213 1163 +be21 4 2215 1163 +be25 6 2217 1163 +be2b 7 2218 1163 +be32 b 2224 1163 +be3d 6 2228 1163 +be43 11 2230 1163 +be54 11 2234 1163 +be65 d 2236 1163 +be72 f 2238 1163 +be81 a 2263 1163 +be8b 3 2267 1163 +be8e 3 2268 1163 +be91 3 2269 1163 +be94 1a 2276 1163 +beae 7 2278 1163 +beb5 e 2282 1163 +bec3 a 2283 1163 +becd 2 1690 1163 +becf 4 2279 1163 +bed3 2 2285 1163 +bed5 d 2286 1163 +bee2 c 2290 1163 +beee 11 2292 1163 +beff 6 2297 1163 +bf05 8 2298 1163 +bf0d 4 2299 1163 +bf11 1 2298 1163 +bf12 1b 1073 1163 +bf2d 17 1690 1163 +bf44 10 2376 1163 +bf54 38 2377 1163 +FUNC bf8c 97 10 _vswprintf_l +bf8c 7 125 1425 +bf93 24 130 1425 +bfb7 8 135 1425 +bfbf 29 155 1425 +bfe8 1d 166 1425 +c005 18 167 1425 +c01d 4 169 1425 +c021 2 183 1425 +FUNC c023 17 c _vswprintf +c023 0 192 1425 +c023 16 195 1425 +c039 1 197 1425 +FUNC c03a 5 10 __vswprintf_l +c03a 0 205 1425 +c03a 5 208 1425 +FUNC c03f 55 10 _vscwprintf_helper +c03f 7 430 1425 +c046 24 435 1425 +c06a 28 441 1425 +c092 2 443 1425 +FUNC c094 18 8 _vscwprintf +c094 0 449 1425 +c094 17 450 1425 +c0ab 1 451 1425 +FUNC c0ac 1a c _vscwprintf_l +c0ac 0 458 1425 +c0ac 19 459 1425 +c0c5 1 460 1425 +FUNC c0c6 18 8 _vscwprintf_p +c0c6 0 466 1425 +c0c6 17 467 1425 +c0dd 1 468 1425 +FUNC c0de 1a c _vscwprintf_p_l +c0de 0 475 1425 +c0de 19 476 1425 +c0f7 1 477 1425 +FUNC c0f8 14e 14 vfprintf_helper +c0f8 c 51 1462 +c104 5 54 1462 +c109 2e 56 1462 +c137 c 57 1462 +c143 3 60 1462 +c146 7 62 1462 +c14d 3 63 1462 +c150 b0 65 1462 +c200 5 66 1462 +c205 8 68 1462 +c20d 10 69 1462 +c21d a 70 1462 +c227 c 74 1462 +c233 3 78 1462 +c236 6 79 1462 +c23c a 75 1462 +FUNC c246 1e 10 _vfprintf_l +c246 0 87 1462 +c246 1d 88 1462 +c263 1 89 1462 +FUNC c264 1e 10 _vfprintf_s_l +c264 0 97 1462 +c264 1d 98 1462 +c281 1 99 1462 +FUNC c282 1e 10 _vfprintf_p_l +c282 0 107 1462 +c282 1d 108 1462 +c29f 1 109 1462 +FUNC c2a0 1c c vfprintf +c2a0 0 116 1462 +c2a0 1b 117 1462 +c2bb 1 118 1462 +FUNC c2bc 1c c vfprintf_s +c2bc 0 125 1462 +c2bc 1b 126 1462 +c2d7 1 127 1462 +FUNC c2d8 1c c _vfprintf_p +c2d8 0 134 1462 +c2d8 1b 135 1462 +c2f3 1 136 1462 +FUNC c2f4 25 4 write_char +c2f4 0 2433 1053 +c2f4 a 2434 1053 +c2fe 2 2437 1053 +c300 12 2440 1053 +c312 3 2444 1053 +c315 1 2447 1053 +c316 2 2446 1053 +c318 1 2447 1053 +FUNC c319 25 c write_multi_char +c319 6 2498 1053 +c31f 2 2501 1053 +c321 e 2500 1053 +c32f 6 2501 1053 +c335 7 2499 1053 +c33c 2 2504 1053 +FUNC c33e 4f 4 write_string +c33e 0 2563 1053 +c33e 12 2564 1053 +c350 6 2566 1053 +c356 2 2567 1053 +c358 11 2570 1053 +c369 6 2571 1053 +c36f a 2573 1053 +c379 a 2574 1053 +c383 9 2569 1053 +c38c 1 2579 1053 +FUNC c38d 91c 10 _woutput_s_l +c38d 29 975 1053 +c3b6 3 976 1053 +c3b9 f 1007 1053 +c3c8 24 2172 1053 +c3ec 2f 1031 1053 +c41b 18 1036 1053 +c433 2e 1073 1053 +c461 16 1078 1053 +c477 e 1079 1053 +c485 11 1124 1053 +c496 10 1131 1053 +c4a6 2 1171 1053 +c4a8 13 1173 1053 +c4bb 3 1174 1053 +c4be 5 1175 1053 +c4c3 1e 1179 1053 +c4e1 3 1193 1053 +c4e4 5 1194 1053 +c4e9 4 1181 1053 +c4ed 5 1182 1053 +c4f2 4 1184 1053 +c4f6 5 1185 1053 +c4fb 7 1190 1053 +c502 5 1191 1053 +c507 3 1187 1053 +c50a 5 1196 1053 +c50f 6 1200 1053 +c515 5 1206 1053 +c51a e 1233 1053 +c528 4 1235 1053 +c52c 3 1236 1053 +c52f 5 1239 1053 +c534 10 1241 1053 +c544 5 1243 1053 +c549 4 1248 1053 +c54d 5 1249 1053 +c552 6 1253 1053 +c558 5 1259 1053 +c55d e 1284 1053 +c56b 4 1285 1053 +c56f 5 1287 1053 +c574 10 1289 1053 +c584 5 1291 1053 +c589 1b 1295 1053 +c5a4 7 1362 1053 +c5ab 5 1363 1053 +c5b0 6 1301 1053 +c5b6 2 1303 1053 +c5b8 7 1304 1053 +c5bf 5 1306 1053 +c5c4 4 1308 1053 +c5c8 5 1310 1053 +c5cd 4 1358 1053 +c5d1 5 1359 1053 +c5d6 10 1322 1053 +c5e6 3 1324 1053 +c5e9 c 1325 1053 +c5f5 d 1327 1053 +c602 3 1329 1053 +c605 7 1330 1053 +c60c 5 1332 1053 +c611 3c 1337 1053 +c64d 4 1352 1053 +c651 14 1166 1053 +c665 5 1167 1053 +c66a 32 1378 1053 +c69c d 1716 1053 +c6a9 4 1724 1053 +c6ad 18 1749 1053 +c6c5 c 1750 1053 +c6d1 c 1381 1053 +c6dd 9 1383 1053 +c6e6 8 1564 1053 +c6ee 4 1565 1053 +c6f2 d 1584 1053 +c6ff 3 1589 1053 +c702 13 1610 1053 +c715 4 1611 1053 +c719 8 1612 1053 +c721 19 1614 1053 +c73a 13 1618 1053 +c74d 1 1620 1053 +c74e 9 1621 1053 +c757 5 1622 1053 +c75c 1e 1378 1053 +c77a 9 1397 1053 +c783 f 1415 1053 +c792 3 1420 1053 +c795 25 1430 1053 +c7ba 3 1434 1053 +c7bd 2 1436 1053 +c7bf 4 1437 1053 +c7c3 6 1439 1053 +c7c9 3 1440 1053 +c7cc 5 1506 1053 +c7d1 5 1523 1053 +c7d6 e 1541 1053 +c7e4 6 1546 1053 +c7ea b 1548 1053 +c7f5 7 1549 1053 +c7fc 5 1550 1053 +c801 4 1551 1053 +c805 5 1553 1053 +c80a 8 1543 1053 +c812 7 1544 1053 +c819 5 1557 1053 +c81e 34 1378 1053 +c852 9 1908 1053 +c85b 9 1910 1053 +c864 8 1668 1053 +c86c d 1688 1053 +c879 6 1702 1053 +c87f 7 1703 1053 +c886 2 1704 1053 +c888 5 1706 1053 +c88d 7 1708 1053 +c894 5 1710 1053 +c899 4 1864 1053 +c89d 7 1869 1053 +c8a4 c 1933 1053 +c8b0 8 1939 1053 +c8b8 5 1958 1053 +c8bd 8 1751 1053 +c8c5 9 1752 1053 +c8ce 5 1753 1053 +c8d3 3 1754 1053 +c8d6 9 1756 1053 +c8df f 1759 1053 +c8ee 3 1760 1053 +c8f1 15 1765 1053 +c906 7 1767 1053 +c90d e 1809 1053 +c91b 27 1828 1053 +c942 14 1838 1053 +c956 15 1840 1053 +c96b b 1844 1053 +c976 15 1846 1053 +c98b 5 1852 1053 +c990 7 1853 1053 +c997 4 1854 1053 +c99b 1 1857 1053 +c99c 5 1859 1053 +c9a1 3 1877 1053 +c9a4 7 1887 1053 +c9ab 2 1888 1053 +c9ad 1a 1378 1053 +c9c7 7 1892 1053 +c9ce 11 1897 1053 +c9df 10 1900 1053 +c9ef 3 1901 1053 +c9f2 5 1903 1053 +c9f7 6 1961 1053 +c9fd 6 1987 1053 +ca03 16 2026 1053 +ca19 2 2045 1053 +ca1b 5 2051 1053 +ca20 2 2071 1053 +ca22 4 2074 1053 +ca26 6 2080 1053 +ca2c 2 2099 1053 +ca2e 5 2105 1053 +ca33 10 2128 1053 +ca43 7 2129 1053 +ca4a 7 2130 1053 +ca51 c 2136 1053 +ca5d 2 2142 1053 +ca5f 6 2148 1053 +ca65 7 2149 1053 +ca6c 2 2150 1053 +ca6e 4 2151 1053 +ca72 a 2152 1053 +ca7c 3 2153 1053 +ca7f 6 2157 1053 +ca85 3 2158 1053 +ca88 6 2163 1053 +ca8e 10 2165 1053 +ca9e 10 2166 1053 +caae c 2168 1053 +caba 3 2170 1053 +cabd 3 2172 1053 +cac0 2 2173 1053 +cac2 8 2175 1053 +caca 1 2176 1053 +cacb 19 2180 1053 +cae4 9 2181 1053 +caed 1 2182 1053 +caee 2 2185 1053 +caf0 4 1625 1053 +caf4 8 1626 1053 +cafc c 1628 1053 +cb08 7 1629 1053 +cb0f 2 1630 1053 +cb11 4 1629 1053 +cb15 8 1631 1053 +cb1d a 2201 1053 +cb27 7 2204 1053 +cb2e 6 2205 1053 +cb34 6 2207 1053 +cb3a 2 2208 1053 +cb3c 4 2210 1053 +cb40 6 2212 1053 +cb46 2 2213 1053 +cb48 4 2215 1053 +cb4c 6 2217 1053 +cb52 7 2218 1053 +cb59 b 2224 1053 +cb64 6 2228 1053 +cb6a 11 2230 1053 +cb7b 11 2234 1053 +cb8c d 2236 1053 +cb99 f 2238 1053 +cba8 a 2263 1053 +cbb2 3 2267 1053 +cbb5 3 2268 1053 +cbb8 3 2269 1053 +cbbb 1a 2276 1053 +cbd5 7 2278 1053 +cbdc e 2282 1053 +cbea a 2283 1053 +cbf4 2 1690 1053 +cbf6 4 2279 1053 +cbfa 2 2285 1053 +cbfc d 2286 1053 +cc09 c 2290 1053 +cc15 11 2292 1053 +cc26 6 2297 1053 +cc2c 8 2298 1053 +cc34 16 2299 1053 +cc4a 7 1073 1053 +cc51 10 2310 1053 +cc61 10 2376 1053 +cc71 38 2377 1053 +FUNC cca9 154 10 _validate_param_reuseW +cca9 3 606 1108 +ccac 21 610 1108 +cccd 13 617 1108 +cce0 13 618 1108 +ccf3 10 620 1108 +cd03 4a 629 1108 +cd4d 54 632 1108 +cda1 2 633 1108 +cda3 1a 639 1108 +cdbd f 645 1108 +cdcc 23 626 1108 +cdef c 614 1108 +cdfb 2 646 1108 +FUNC cdfd 25 4 write_char +cdfd 0 2433 1108 +cdfd a 2434 1108 +ce07 2 2437 1108 +ce09 12 2440 1108 +ce1b 3 2444 1108 +ce1e 1 2447 1108 +ce1f 2 2446 1108 +ce21 1 2447 1108 +FUNC ce22 25 c write_multi_char +ce22 6 2498 1108 +ce28 2 2501 1108 +ce2a e 2500 1108 +ce38 6 2501 1108 +ce3e 7 2499 1108 +ce45 2 2504 1108 +FUNC ce47 4f 4 write_string +ce47 0 2563 1108 +ce47 12 2564 1108 +ce59 6 2566 1108 +ce5f 2 2567 1108 +ce61 11 2570 1108 +ce72 6 2571 1108 +ce78 a 2573 1108 +ce82 a 2574 1108 +ce8c 9 2569 1108 +ce95 1 2579 1108 +FUNC ce96 f60 10 _woutput_p_l +ce96 1b 975 1108 +ceb1 20 1013 1108 +ced1 28 2172 1108 +cef9 2c 1031 1108 +cf25 4 1036 1108 +cf29 3 1038 1108 +cf2c 3 1041 1108 +cf2f 3 1043 1108 +cf32 f 1046 1108 +cf41 44 1073 1108 +cf85 1a 1078 1108 +cf9f 11 1079 1108 +cfb0 16 1082 1108 +cfc6 6 1084 1108 +cfcc 1c 1087 1108 +cfe8 6 1089 1108 +cfee 16 1091 1108 +d004 7 1093 1108 +d00b 2 1095 1108 +d00d 7 1097 1108 +d014 6 1101 1108 +d01a c 1103 1108 +d026 7 1104 1108 +d02d f 1106 1108 +d03c 1d 1109 1108 +d059 8 1112 1108 +d061 5 1131 1108 +d066 3 1117 1108 +d069 7 1131 1108 +d070 9 1120 1108 +d079 b 1131 1108 +d084 24 1137 1108 +d0a8 5 1145 1108 +d0ad 2 1171 1108 +d0af 16 1173 1108 +d0c5 3 1174 1108 +d0c8 5 1175 1108 +d0cd 1f 1179 1108 +d0ec 7 1193 1108 +d0f3 5 1194 1108 +d0f8 7 1181 1108 +d0ff 5 1182 1108 +d104 7 1184 1108 +d10b 5 1185 1108 +d110 a 1190 1108 +d11a 5 1191 1108 +d11f 6 1187 1108 +d125 5 1196 1108 +d12a a 1200 1108 +d134 6 1203 1108 +d13a a 1206 1108 +d144 2 1209 1108 +d146 c 1211 1108 +d152 6 1212 1108 +d158 e 1214 1108 +d166 1c 1216 1108 +d182 8 1219 1108 +d18a 12 1221 1108 +d19c a 1274 1108 +d1a6 5 1275 1108 +d1ab c 1228 1108 +d1b7 b 1233 1108 +d1c2 7 1235 1108 +d1c9 3 1236 1108 +d1cc 5 1239 1108 +d1d1 10 1241 1108 +d1e1 5 1243 1108 +d1e6 4 1248 1108 +d1ea 5 1249 1108 +d1ef 6 1253 1108 +d1f5 6 1256 1108 +d1fb a 1259 1108 +d205 2 1262 1108 +d207 c 1264 1108 +d213 6 1265 1108 +d219 12 1267 1108 +d22b c 1280 1108 +d237 b 1284 1108 +d242 4 1285 1108 +d246 5 1287 1108 +d24b 22 1274 1108 +d26d 10 1289 1108 +d27d 5 1291 1108 +d282 1b 1295 1108 +d29d a 1362 1108 +d2a7 5 1363 1108 +d2ac 6 1301 1108 +d2b2 2 1303 1108 +d2b4 d 1304 1108 +d2c1 5 1306 1108 +d2c6 7 1308 1108 +d2cd 5 1310 1108 +d2d2 7 1358 1108 +d2d9 5 1359 1108 +d2de 10 1322 1108 +d2ee 3 1324 1108 +d2f1 12 1325 1108 +d303 d 1327 1108 +d310 3 1329 1108 +d313 d 1330 1108 +d320 5 1332 1108 +d325 24 1337 1108 +d349 4 1352 1108 +d34d 13 1166 1108 +d360 5 1167 1108 +d365 a 1342 1108 +d36f 5 1366 1108 +d374 36 1378 1108 +d3aa d 1716 1108 +d3b7 7 1724 1108 +d3be 14 1726 1108 +d3d2 9 1728 1108 +d3db 2a 1739 1108 +d405 b 1381 1108 +d410 9 1383 1108 +d419 b 1564 1108 +d424 7 1565 1108 +d42b d 1584 1108 +d438 b 1586 1108 +d443 a 1589 1108 +d44d 5 1592 1108 +d452 22 1378 1108 +d474 d 1394 1108 +d481 b 1397 1108 +d48c 2 1400 1108 +d48e 9 1402 1108 +d497 6 1404 1108 +d49d 24 1406 1108 +d4c1 5 1407 1108 +d4c6 d 1411 1108 +d4d3 c 1415 1108 +d4df 3 1420 1108 +d4e2 28 1430 1108 +d50a 7 1434 1108 +d511 2 1436 1108 +d513 7 1437 1108 +d51a 9 1439 1108 +d523 7 1440 1108 +d52a 5 1506 1108 +d52f 6 1520 1108 +d535 a 1523 1108 +d53f 2 1526 1108 +d541 9 1528 1108 +d54a 4 1530 1108 +d54e 6 1533 1108 +d554 c 1537 1108 +d560 b 1541 1108 +d56b 9 1546 1108 +d574 b 1548 1108 +d57f 7 1549 1108 +d586 5 1550 1108 +d58b 4 1551 1108 +d58f 5 1553 1108 +d594 8 1543 1108 +d59c 7 1544 1108 +d5a3 5 1557 1108 +d5a8 38 1378 1108 +d5e0 15 1908 1108 +d5f5 11 1910 1108 +d606 6 1665 1108 +d60c a 1668 1108 +d616 2 1671 1108 +d618 9 1673 1108 +d621 6 1675 1108 +d627 1f 1677 1108 +d646 5 1678 1108 +d64b c 1682 1108 +d657 d 1688 1108 +d664 9 1702 1108 +d66d 7 1703 1108 +d674 2 1704 1108 +d676 5 1706 1108 +d67b 7 1708 1108 +d682 5 1710 1108 +d687 7 1864 1108 +d68e 7 1869 1108 +d695 6 1910 1108 +d69b 9 1933 1108 +d6a4 a 1936 1108 +d6ae f 1939 1108 +d6bd 5 1942 1108 +d6c2 1a 1739 1108 +d6dc 21 1109 1108 +d6fd 17 1749 1108 +d714 9 1750 1108 +d71d 8 1751 1108 +d725 9 1752 1108 +d72e 5 1753 1108 +d733 3 1754 1108 +d736 a 1756 1108 +d740 f 1759 1108 +d74f 2 1760 1108 +d751 13 1765 1108 +d764 3 1767 1108 +d767 7 1806 1108 +d76e 9 1809 1108 +d777 2 1812 1108 +d779 a 1818 1108 +d783 6 1821 1108 +d789 16 1822 1108 +d79f 24 1828 1108 +d7c3 16 1838 1108 +d7d9 15 1840 1108 +d7ee b 1844 1108 +d7f9 15 1846 1108 +d80e 5 1852 1108 +d813 a 1853 1108 +d81d 4 1854 1108 +d821 1 1857 1108 +d822 5 1859 1108 +d827 7 1877 1108 +d82e 7 1887 1108 +d835 2 1888 1108 +d837 1a 1378 1108 +d851 7 1892 1108 +d858 14 1897 1108 +d86c 10 1900 1108 +d87c 3 1901 1108 +d87f 5 1903 1108 +d884 9 1944 1108 +d88d 28 1948 1108 +d8b5 5 1949 1108 +d8ba 7 1961 1108 +d8c1 4 1964 1108 +d8c5 6 1970 1108 +d8cb 9 1972 1108 +d8d4 28 1976 1108 +d8fc 5 1977 1108 +d901 c 1981 1108 +d90d 5 1987 1108 +d912 5 2019 1108 +d917 5 2020 1108 +d91c 6 2023 1108 +d922 b 2026 1108 +d92d 5 2029 1108 +d932 9 2031 1108 +d93b 4 2033 1108 +d93f 2 2036 1108 +d941 d 2040 1108 +d94e 5 2045 1108 +d953 6 2048 1108 +d959 b 2051 1108 +d964 5 2054 1108 +d969 9 2056 1108 +d972 4 2058 1108 +d976 2 2061 1108 +d978 d 2065 1108 +d985 2 2071 1108 +d987 5 2074 1108 +d98c 6 2077 1108 +d992 a 2080 1108 +d99c 2 2083 1108 +d99e 9 2085 1108 +d9a7 6 2087 1108 +d9ad 17 2089 1108 +d9c4 15 2114 1108 +d9d9 5 2115 1108 +d9de d 2094 1108 +d9eb 2 2099 1108 +d9ed 6 2102 1108 +d9f3 a 2105 1108 +d9fd 2 2108 1108 +d9ff 9 2110 1108 +da08 6 2112 1108 +da0e e 2119 1108 +da1c f 2128 1108 +da2b 7 2129 1108 +da32 c 2130 1108 +da3e c 2136 1108 +da4a 4 2142 1108 +da4e 6 2148 1108 +da54 7 2149 1108 +da5b 2 2150 1108 +da5d 1a 2114 1108 +da77 3 2151 1108 +da7a 10 2152 1108 +da8a 3 2153 1108 +da8d 7 2157 1108 +da94 3 2158 1108 +da97 6 2163 1108 +da9d 11 2165 1108 +daae 12 2166 1108 +dac0 d 2168 1108 +dacd 3 2170 1108 +dad0 b 2173 1108 +dadb 8 2175 1108 +dae3 1 2176 1108 +dae4 20 2180 1108 +db04 9 2181 1108 +db0d 1 2182 1108 +db0e 5 2185 1108 +db13 9 1594 1108 +db1c 9 1596 1108 +db25 c 1603 1108 +db31 c 1610 1108 +db3d 4 1611 1108 +db41 8 1612 1108 +db49 11 1614 1108 +db5a 13 1618 1108 +db6d 1 1620 1108 +db6e 9 1621 1108 +db77 2 1622 1108 +db79 19 1598 1108 +db92 5 1625 1108 +db97 8 1626 1108 +db9f c 1628 1108 +dbab 6 1629 1108 +dbb1 2 1630 1108 +dbb3 4 1629 1108 +dbb7 8 1631 1108 +dbbf 10 2189 1108 +dbcf a 2201 1108 +dbd9 a 2204 1108 +dbe3 6 2205 1108 +dbe9 6 2207 1108 +dbef 2 2208 1108 +dbf1 4 2210 1108 +dbf5 6 2212 1108 +dbfb 2 2213 1108 +dbfd 4 2215 1108 +dc01 6 2217 1108 +dc07 7 2218 1108 +dc0e b 2224 1108 +dc19 9 2228 1108 +dc22 11 2230 1108 +dc33 11 2234 1108 +dc44 13 2236 1108 +dc57 f 2238 1108 +dc66 a 2263 1108 +dc70 3 2267 1108 +dc73 3 2268 1108 +dc76 3 2269 1108 +dc79 1a 2276 1108 +dc93 7 2278 1108 +dc9a e 2282 1108 +dca8 a 2283 1108 +dcb2 2 2310 1108 +dcb4 4 2279 1108 +dcb8 2 2285 1108 +dcba d 2286 1108 +dcc7 f 2290 1108 +dcd6 11 2292 1108 +dce7 6 2297 1108 +dced 8 2298 1108 +dcf5 4 2299 1108 +dcf9 1 2298 1108 +dcfa 12 1073 1108 +dd0c c 2310 1108 +dd18 c 2314 1108 +dd24 10 2319 1108 +dd34 16 2321 1108 +dd4a 2 2360 1108 +dd4c 9 2361 1108 +dd55 6 2362 1108 +dd5b 2 2344 1108 +dd5d 3 2345 1108 +dd60 2 2346 1108 +dd62 2 2324 1108 +dd64 6 2325 1108 +dd6a 9 2319 1108 +dd73 13 1043 1108 +dd86 17 1121 1108 +dd9d f 1818 1108 +ddac 10 2376 1108 +ddbc 3a 2377 1108 +FUNC ddf6 1f 0 _initp_misc_cfltcvt_tab +ddf6 2 54 4074 +ddf8 8 56 4074 +de00 14 58 4074 +de14 1 60 4074 +FUNC de20 29 4 _ValidateImageBase +de20 0 44 3159 +de20 b 50 3159 +de2b 2 52 3159 +de2d 1 68 3159 +de2e 5 55 3159 +de33 6 56 3159 +de39 2 58 3159 +de3b d 62 3159 +de48 1 68 3159 +FUNC de50 42 8 _FindPESection +de50 0 92 3159 +de50 9 99 3159 +de59 19 108 3159 +de72 10 111 3159 +de82 a 108 3159 +de8c 5 123 3159 +de91 1 124 3159 +FUNC dea0 bb 4 _IsNonwritableInCurrentImage +dea0 33 149 3159 +ded3 7 156 3159 +deda f 164 3159 +dee9 2 166 3159 +deeb 8 174 3159 +def3 e 175 3159 +df01 2 176 3159 +df03 2 178 3159 +df05 12 185 3159 +df17 12 195 3159 +df29 17 187 3159 +df40 9 193 3159 +df49 12 195 3159 +FUNC df5b 19 4 _initp_misc_winsig +df5b 0 57 2785 +df5b 9 58 2785 +df64 5 59 2785 +df69 5 60 2785 +df6e 5 61 2785 +df73 1 62 2785 +FUNC df74 9b 4 ctrlevent_capture +df74 c 89 2785 +df80 9 94 2785 +df89 3 95 2785 +df8c 5 102 2785 +df91 5 103 2785 +df96 e 104 2785 +dfa4 7 105 2785 +dfab 2 107 2785 +dfad 5 108 2785 +dfb2 e 109 2785 +dfc0 7 110 2785 +dfc7 1 109 2785 +dfc8 9 113 2785 +dfd1 7 117 2785 +dfd8 c 120 2785 +dfe4 5 124 2785 +dfe9 4 128 2785 +dfed 2 120 2785 +dfef 8 121 2785 +dff7 6 130 2785 +dffd 7 131 2785 +e004 3 138 2785 +e007 8 139 2785 +FUNC e00f 34 4 siglookup +e00f 0 634 2785 +e00f b 635 2785 +e01a 15 645 2785 +e02f f 649 2785 +e03e 2 653 2785 +e040 2 658 2785 +e042 1 659 2785 +FUNC e043 d 0 __get_sigabrt +e043 0 676 2785 +e043 c 677 2785 +e04f 1 678 2785 +FUNC e050 9 0 __fpecode +e050 0 699 2785 +e050 8 700 2785 +e058 1 701 2785 +FUNC e059 9 0 __pxcptinfoptrs +e059 0 721 2785 +e059 8 722 2785 +e061 1 723 2785 +FUNC e062 23d 8 signal +e062 c 219 2785 +e06e 4 224 2785 +e072 3 230 2785 +e075 3 244 2785 +e078 12 230 2785 +e08a 2f 244 2785 +e0b9 13 327 2785 +e0cc 7 334 2785 +e0d3 8 335 2785 +e0db a 342 2785 +e0e5 17 346 2785 +e0fc 10 352 2785 +e10c 13 367 2785 +e11f 3 380 2785 +e122 e 382 2785 +e130 3 395 2785 +e133 17 401 2785 +e14a 5 390 2785 +e14f 5 401 2785 +e154 8 246 2785 +e15c 4 247 2785 +e160 12 254 2785 +e172 14 257 2785 +e186 6 259 2785 +e18c 2 261 2785 +e18e f 263 2785 +e19d a 264 2785 +e1a7 18 268 2785 +e1bf f 288 2785 +e1ce 4 289 2785 +e1d2 b 291 2785 +e1dd 2 293 2785 +e1df f 279 2785 +e1ee 4 280 2785 +e1f2 b 282 2785 +e1fd 2 284 2785 +e1ff f 296 2785 +e20e 4 297 2785 +e212 b 299 2785 +e21d 2 301 2785 +e21f f 271 2785 +e22e 4 272 2785 +e232 c 274 2785 +e23e c 305 2785 +e24a 9 309 2785 +e253 4 407 2785 +e257 3 305 2785 +e25a 9 306 2785 +e263 19 410 2785 +e27c 1a 419 2785 +e296 3 417 2785 +e299 6 423 2785 +FUNC e29f 1b0 4 raise +e29f c 452 2785 +e2ab 5 459 2785 +e2b0 3 460 2785 +e2b3 1f 462 2785 +e2d2 a 488 2785 +e2dc 4 489 2785 +e2e0 8 490 2785 +e2e8 a 465 2785 +e2f2 2 467 2785 +e2f4 11 492 2785 +e305 2 493 2785 +e307 f 462 2785 +e316 1c 500 2785 +e332 a 476 2785 +e33c 2 478 2785 +e33e a 470 2785 +e348 2 472 2785 +e34a a 481 2785 +e354 7 482 2785 +e35b a 502 2785 +e365 2 510 2785 +e367 4 509 2785 +e36b 6 510 2785 +e371 5 515 2785 +e376 7 520 2785 +e37d 5 527 2785 +e382 7 528 2785 +e389 5 530 2785 +e38e f 543 2785 +e39d 6 544 2785 +e3a3 3 545 2785 +e3a6 5 551 2785 +e3ab 6 552 2785 +e3b1 7 553 2785 +e3b8 5 561 2785 +e3bd 1c 568 2785 +e3d9 d 571 2785 +e3e6 5 568 2785 +e3eb 7 574 2785 +e3f2 c 577 2785 +e3fe 5 582 2785 +e403 8 588 2785 +e40b 2 589 2785 +e40d 6 577 2785 +e413 6 578 2785 +e419 9 579 2785 +e422 5 590 2785 +e427 f 597 2785 +e436 6 598 2785 +e43c 5 603 2785 +e441 6 604 2785 +e447 2 607 2785 +e449 6 608 2785 +FUNC e44f a 4 _initp_misc_rand_s +e44f 0 58 3075 +e44f 9 59 3075 +e458 1 60 3075 +FUNC e459 104 4 rand_s +e459 3 66 3075 +e45c b 67 3075 +e467 2b 68 3075 +e492 c 71 3075 +e49e d 77 3075 +e4ab 4 78 3075 +e4af 1e 80 3075 +e4cd e 83 3075 +e4db 4 84 3075 +e4df 2f 86 3075 +e50e 9 88 3075 +e517 5 89 3075 +e51c 16 94 3075 +e532 7 103 3075 +e539 9 107 3075 +e542 b 109 3075 +e54d 9 110 3075 +e556 6 112 3075 +e55c 1 113 3075 +FUNC e55d 15a 14 __getlocaleinfo +e55d 1d 70 3523 +e57a 7 76 3523 +e581 87 109 3523 +e608 13 103 3523 +e61b 5 114 3523 +e620 7 115 3523 +e627 3 141 3523 +e62a 12 142 3523 +e63c 20 106 3523 +e65c 5 108 3523 +e661 7 109 3523 +e668 4 111 3523 +e66c 5 118 3523 +e671 1a 126 3523 +e68b 2 127 3523 +e68d 2 129 3523 +e68f 10 134 3523 +e69f 16 135 3523 +e6b5 2 139 3523 +FUNC e6b7 a 4 _initp_misc_purevirt +e6b7 0 166 3523 +e6b7 9 167 3523 +e6c0 1 168 3523 +FUNC e6c1 a 4 _initp_misc_initcrit +e6c1 0 47 3609 +e6c1 9 48 3609 +e6ca 1 49 3609 +FUNC e6cb 10 8 __crtInitCritSecNoSpinCount +e6cb 0 76 3609 +e6cb a 77 3609 +e6d5 3 78 3609 +e6d8 3 79 3609 +FUNC e6db c5 8 __crtInitCritSecAndSpinCount +e6db c 109 3609 +e6e7 5 111 3609 +e6ec e 112 3609 +e6fa 4 114 3609 +e6fe 1b 120 3609 +e719 4 121 3609 +e71d 2 129 3609 +e71f b 130 3609 +e72a 4 131 3609 +e72e e 134 3609 +e73c 4 136 3609 +e740 5 149 3609 +e745 c 152 3609 +e751 3 155 3609 +e754 b 161 3609 +e75f 2 162 3609 +e761 1a 163 3609 +e77b 9 170 3609 +e784 8 171 3609 +e78c 4 173 3609 +e790 7 174 3609 +e797 3 176 3609 +e79a 6 177 3609 +FUNC e7a0 5e 4 _isatty +e7a0 0 37 4912 +e7a0 16 44 4912 +e7b6 2 59 4912 +e7b8 29 45 4912 +e7e1 1 59 4912 +e7e2 1b 58 4912 +e7fd 1 59 4912 +FUNC e7fe 2f 0 CPtoLCID +e7fe 0 329 4615 +e7fe 14 330 4615 +e812 2 345 4615 +e814 1 346 4615 +e815 5 342 4615 +e81a 1 346 4615 +e81b 5 339 4615 +e820 1 346 4615 +e821 5 336 4615 +e826 1 346 4615 +e827 5 333 4615 +e82c 1 346 4615 +FUNC e82d 55 0 setSBCS +e82d 4 363 4615 +e831 14 368 4615 +e845 3 371 4615 +e848 3 374 4615 +e84b 3 376 4615 +e84e 8 379 4615 +e856 a 381 4615 +e860 9 382 4615 +e869 b 384 4615 +e874 d 385 4615 +e881 1 386 4615 +FUNC e882 18a 0 setSBUpLow +e882 1d 402 4615 +e89f f 412 4615 +e8ae d 415 4615 +e8bb c 416 4615 +e8c7 e 420 4615 +e8d5 3 419 4615 +e8d8 28 421 4615 +e900 1d 427 4615 +e91d 23 432 4615 +e940 25 437 4615 +e965 2 442 4615 +e967 a 443 4615 +e971 5 445 4615 +e976 9 446 4615 +e97f 5 448 4615 +e984 5 450 4615 +e989 e 451 4615 +e997 2 453 4615 +e999 8 454 4615 +e9a1 5 442 4615 +e9a6 8 456 4615 +e9ae 2c 472 4615 +e9da 5 466 4615 +e9df 5 468 4615 +e9e4 7 469 4615 +e9eb 2 471 4615 +e9ed 3 472 4615 +e9f0 5 460 4615 +e9f5 17 474 4615 +FUNC ea0c a4 0 __updatetmbcinfo +ea0c c 496 4615 +ea18 7 499 4615 +ea1f 10 500 4615 +ea2f 3 533 4615 +ea32 4 536 4615 +ea36 8 538 4615 +ea3e 2 541 4615 +ea40 6 542 4615 +ea46 8 501 4615 +ea4e 4 503 4615 +ea52 e 506 4615 +ea60 17 512 4615 +ea77 7 517 4615 +ea7e 11 524 4615 +ea8f 7 525 4615 +ea96 11 528 4615 +eaa7 9 530 4615 +FUNC eab0 7a 0 getSystemCP +eab0 7 282 4615 +eab7 b 284 4615 +eac2 b 289 4615 +eacd a 291 4615 +ead7 14 292 4615 +eaeb 5 295 4615 +eaf0 a 297 4615 +eafa 8 298 4615 +eb02 5 302 4615 +eb07 12 305 4615 +eb19 f 308 4615 +eb28 2 309 4615 +FUNC eb2a 1d9 8 _setmbcp_nolock +eb2a 15 686 4615 +eb3f b 693 4615 +eb4a 9 696 4615 +eb53 7 698 4615 +eb5a 7 699 4615 +eb61 3 703 4615 +eb64 2 705 4615 +eb66 19 708 4615 +eb7f 2a 743 4615 +eba9 13 751 4615 +ebbc f 756 4615 +ebcb 15 761 4615 +ebe0 17 764 4615 +ebf7 c 766 4615 +ec03 f 712 4615 +ec12 15 715 4615 +ec27 9 720 4615 +ec30 8 723 4615 +ec38 12 724 4615 +ec4a 9 723 4615 +ec53 5 720 4615 +ec58 12 715 4615 +ec6a 20 731 4615 +ec8a d 733 4615 +ec97 7 736 4615 +ec9e 5 737 4615 +eca3 6 767 4615 +eca9 10 766 4615 +ecb9 8 771 4615 +ecc1 7 772 4615 +ecc8 b 775 4615 +ecd3 3 778 4615 +ecd6 2 780 4615 +ecd8 3 782 4615 +ecdb 8 785 4615 +ece3 2 789 4615 +ece5 6 794 4615 +eceb 6 797 4615 +ecf1 3 746 4615 +ecf4 f 802 4615 +FUNC ed03 3c 0 _getmbcp +ed03 6 819 4615 +ed09 a 821 4615 +ed13 9 822 4615 +ed1c 10 823 4615 +ed2c 2 826 4615 +ed2e f 825 4615 +ed3d 2 826 4615 +FUNC ed3f 19a 4 _setmbcp +ed3f c 574 4615 +ed4b 4 575 4615 +ed4f a 579 4615 +ed59 5 581 4615 +ed5e 3 582 4615 +ed61 b 585 4615 +ed6c 9 587 4615 +ed75 d 593 4615 +ed82 8 595 4615 +ed8a c 597 4615 +ed96 3 607 4615 +ed99 16 612 4615 +edaf 1a 614 4615 +edc9 7 615 4615 +edd0 3 619 4615 +edd3 9 620 4615 +eddc 17 622 4615 +edf3 8 624 4615 +edfb 4 625 4615 +edff 8 630 4615 +ee07 8 631 4615 +ee0f 8 632 4615 +ee17 a 633 4615 +ee21 d 634 4615 +ee2e 3 633 4615 +ee31 c 635 4615 +ee3d a 636 4615 +ee47 3 635 4615 +ee4a c 637 4615 +ee56 d 638 4615 +ee63 3 637 4615 +ee66 1c 640 4615 +ee82 7 641 4615 +ee89 6 645 4615 +ee8f 3 646 4615 +ee92 e 648 4615 +eea0 9 650 4615 +eea9 2 653 4615 +eeab 5 654 4615 +eeb0 8 660 4615 +eeb8 7 661 4615 +eebf b 662 4615 +eeca 2 668 4615 +eecc 4 673 4615 +eed0 3 682 4615 +eed3 6 683 4615 +FUNC eed9 1e 0 __initmbctable +eed9 0 843 4615 +eed9 9 853 4615 +eee2 8 854 4615 +eeea a 855 4615 +eef4 2 860 4615 +eef6 1 861 4615 +FUNC eef7 6 0 ___setlc_active_func +eef7 0 90 2995 +eef7 5 91 2995 +eefc 1 92 2995 +FUNC eefd 6 0 ___unguarded_readlc_active_add_func +eefd 0 104 2995 +eefd 5 105 2995 +ef02 1 106 2995 +FUNC ef03 140 4 __freetlocinfo +ef03 3 144 2995 +ef06 26 152 2995 +ef2c e 155 2995 +ef3a 6 157 2995 +ef40 d 158 2995 +ef4d e 162 2995 +ef5b 6 164 2995 +ef61 d 165 2995 +ef6e b 168 2995 +ef79 d 169 2995 +ef86 e 176 2995 +ef94 11 178 2995 +efa5 13 179 2995 +efb8 e 180 2995 +efc6 e 181 2995 +efd4 17 188 2995 +efeb 6 190 2995 +eff1 9 191 2995 +effa 6 194 2995 +f000 13 197 2995 +f013 7 199 2995 +f01a 10 205 2995 +f02a d 207 2995 +f037 b 214 2995 +f042 1 215 2995 +FUNC f043 86 4 __addlocaleref +f043 3 225 2995 +f046 e 227 2995 +f054 a 228 2995 +f05e 3 229 2995 +f061 a 231 2995 +f06b 3 232 2995 +f06e a 234 2995 +f078 3 235 2995 +f07b a 237 2995 +f085 3 238 2995 +f088 6 240 2995 +f08e f 242 2995 +f09d 3 243 2995 +f0a0 d 245 2995 +f0ad 9 246 2995 +f0b6 12 248 2995 +f0c8 1 249 2995 +FUNC f0c9 8c 4 __removelocaleref +f0c9 1 259 2995 +f0ca b 261 2995 +f0d5 9 263 2995 +f0de a 265 2995 +f0e8 3 266 2995 +f0eb a 268 2995 +f0f5 3 269 2995 +f0f8 a 271 2995 +f102 3 272 2995 +f105 a 274 2995 +f10f 3 275 2995 +f112 6 277 2995 +f118 f 279 2995 +f127 3 280 2995 +f12a d 282 2995 +f137 9 283 2995 +f140 11 285 2995 +f151 3 287 2995 +f154 1 288 2995 +FUNC f155 24 0 _copytlocinfo_nolock +f155 3 302 2995 +f158 d 303 2995 +f165 7 304 2995 +f16c 3 305 2995 +f16f 9 306 2995 +f178 1 308 2995 +FUNC f179 3e 0 _updatetlocinfoEx_nolock +f179 0 321 2995 +f179 9 324 2995 +f182 2 326 2995 +f184 4 327 2995 +f188 8 334 2995 +f190 5 339 2995 +f195 6 341 2995 +f19b e 350 2995 +f1a9 7 351 2995 +f1b0 3 355 2995 +f1b3 1 356 2995 +f1b4 2 325 2995 +f1b6 1 356 2995 +FUNC f1b7 76 0 __updatetlocinfo +f1b7 c 382 2995 +f1c3 7 384 2995 +f1ca 10 386 2995 +f1da 8 397 2995 +f1e2 4 399 2995 +f1e6 8 401 2995 +f1ee 2 404 2995 +f1f0 6 405 2995 +f1f6 8 387 2995 +f1fe 4 388 2995 +f202 11 390 2995 +f213 e 392 2995 +f221 8 394 2995 +f229 4 395 2995 +FUNC f22d 66 4 _configthreadlocale +f22d 2 420 2995 +f22f 5 434 2995 +f234 10 435 2995 +f244 19 437 2995 +f25d 1d 456 2995 +f27a 3 444 2995 +f27d 2 445 2995 +f27f 6 440 2995 +f285 2 441 2995 +f287 7 452 2995 +f28e 4 460 2995 +f292 1 462 2995 +FUNC f293 53 0 sync_legacy_variables_lk +f293 0 489 2995 +f293 e 490 2995 +f2a1 9 491 2995 +f2aa c 492 2995 +f2b6 c 493 2995 +f2c2 c 494 2995 +f2ce c 495 2995 +f2da b 496 2995 +f2e5 1 497 2995 +FUNC f2e6 96 4 _free_locale +f2e6 c 517 2995 +f2f2 9 518 2995 +f2fb 1c 522 2995 +f317 7 524 2995 +f31e 4 526 2995 +f322 8 534 2995 +f32a 3 535 2995 +f32d 8 537 2995 +f335 11 540 2995 +f346 7 541 2995 +f34d c 543 2995 +f359 7 552 2995 +f360 3 553 2995 +f363 7 554 2995 +f36a 6 556 2995 +f370 3 543 2995 +f373 9 545 2995 +FUNC f37c 5 4 __free_locale +f37c 0 562 2995 +f37c 5 563 2995 +FUNC f381 88 0 _get_current_locale +f381 c 687 2995 +f38d 7 689 2995 +f394 14 691 2995 +f3a8 b 693 2995 +f3b3 4 694 2995 +f3b7 5 697 2995 +f3bc 5 698 2995 +f3c1 5 706 2995 +f3c6 6 707 2995 +f3cc 8 708 2995 +f3d4 4 709 2995 +f3d8 8 710 2995 +f3e0 c 712 2995 +f3ec 9 715 2995 +f3f5 2 717 2995 +f3f7 6 718 2995 +f3fd 3 712 2995 +f400 9 713 2995 +FUNC f409 5 0 __get_current_locale +f409 0 722 2995 +f409 5 723 2995 +FUNC f40e 3 4 __init_dummy +f40e 0 1283 2995 +f40e 2 1284 2995 +f410 1 1285 2995 +FUNC f411 3e c _strcats +f411 2 1288 2995 +f413 f 1294 2995 +f422 26 1296 2995 +f448 6 1294 2995 +f44e 1 1299 2995 +FUNC f44f 129 8 __lc_strtolc +f44f 6 1302 2995 +f455 11 1307 2995 +f466 c 1309 2995 +f472 7 1310 2995 +f479 b 1313 2995 +f484 25 1315 2995 +f4a9 6 1317 2995 +f4af 2 1318 2995 +f4b1 15 1323 2995 +f4c6 1d 1328 2995 +f4e3 9 1329 2995 +f4ec 10 1331 2995 +f4fc c 1332 2995 +f508 14 1334 2995 +f51c 28 1335 2995 +f544 9 1340 2995 +f54d b 1348 2995 +f558 18 1350 2995 +f570 6 1338 2995 +f576 2 1353 2995 +FUNC f578 6b c __lc_lctostr +f578 5 1356 2995 +f57d 25 1357 2995 +f5a2 7 1358 2995 +f5a9 16 1359 2995 +f5bf c 1360 2995 +f5cb 16 1361 2995 +f5e1 2 1362 2995 +FUNC f5e3 171 0 _setlocale_get_all +f5e3 4 1124 2995 +f5e7 3 1126 2995 +f5ea 1d 1134 2995 +f607 3 1137 2995 +f60a 3 1139 2995 +f60d 2 1140 2995 +f60f 2f 1143 2995 +f63e 26 1146 2995 +f664 10 1147 2995 +f674 5 1148 2995 +f679 4 1141 2995 +f67d 2f 1143 2995 +f6ac a 1144 2995 +f6b6 8 1152 2995 +f6be 14 1154 2995 +f6d2 9 1156 2995 +f6db e 1159 2995 +f6e9 9 1161 2995 +f6f2 7 1165 2995 +f6f9 7 1166 2995 +f700 9 1168 2995 +f709 15 1170 2995 +f71e 9 1172 2995 +f727 e 1175 2995 +f735 9 1177 2995 +f73e 12 1183 2995 +f750 4 1187 2995 +FUNC f754 1d4 18 _expandlocale +f754 15 1198 2995 +f769 41 1230 2995 +f7aa 14 1211 2995 +f7be b 1216 2995 +f7c9 26 1219 2995 +f7ef 4 1220 2995 +f7f3 3 1222 2995 +f7f6 4 1223 2995 +f7fa 4 1224 2995 +f7fe 7 1226 2995 +f805 2 1228 2995 +f807 8 1230 2995 +f80f 6 1234 2995 +f815 2f 1236 2995 +f844 4 1241 2995 +f848 e 1243 2995 +f856 6 1244 2995 +f85c 10 1246 2995 +f86c 6 1247 2995 +f872 9 1251 2995 +f87b 10 1253 2995 +f88b a 1255 2995 +f895 2 1260 2995 +f897 8 1263 2995 +f89f 26 1267 2995 +f8c5 5 1271 2995 +f8ca e 1272 2995 +f8d8 5 1273 2995 +f8dd 10 1274 2995 +f8ed 22 1276 2995 +f90f 5 1277 2995 +f914 2 1212 2995 +f916 12 1278 2995 +FUNC f928 2f6 4 _setlocale_set_cat +f928 19 980 2995 +f941 5 993 2995 +f946 2f 998 2995 +f975 7 1000 2995 +f97c 19 1002 2995 +f995 6 1004 2995 +f99b c 1007 2995 +f9a7 16 1008 2995 +f9bd 2 1010 2995 +f9bf 3 1013 2995 +f9c2 d 1014 2995 +f9cf 2c 1015 2995 +f9fb 3 1016 2995 +f9fe 39 1019 2995 +fa37 6 1020 2995 +fa3d 15 1021 2995 +fa52 17 1022 2995 +fa69 a 1029 2995 +fa73 6 1031 2995 +fa79 18 1037 2995 +fa91 7 1039 2995 +fa98 8 1053 2995 +faa0 14 1054 2995 +fab4 18 1055 2995 +facc 2 1039 2995 +face a 1044 2995 +fad8 d 1046 2995 +fae5 b 1047 2995 +faf0 9 1058 2995 +faf9 26 1066 2995 +fb1f 2 1069 2995 +fb21 10 1071 2995 +fb31 22 1072 2995 +fb53 2 1081 2995 +fb55 4 1082 2995 +fb59 5 1083 2995 +fb5e 9 1085 2995 +fb67 6 1088 2995 +fb6d 9 1089 2995 +fb76 12 1091 2995 +fb88 6 1094 2995 +fb8e e 1095 2995 +fb9c f 1096 2995 +fbab 9 1097 2995 +fbb4 5 1099 2995 +fbb9 24 1106 2995 +fbdd 7 1109 2995 +fbe4 8 1110 2995 +fbec 6 1111 2995 +fbf2 18 1116 2995 +fc0a 3 1118 2995 +fc0d 11 1119 2995 +FUNC fc1e 1ce 4 _setlocale_nolock +fc1e 1a 873 2995 +fc38 7 877 2995 +fc3f 5 904 2995 +fc44 17 880 2995 +fc5b 5 882 2995 +fc60 12 888 2995 +fc72 1d 890 2995 +fc8f 2 894 2995 +fc91 d 898 2995 +fc9e 1e 900 2995 +fcbc 11 904 2995 +fccd 1d 907 2995 +fcea e 904 2995 +fcf8 1b 913 2995 +fd13 6 916 2995 +fd19 24 918 2995 +fd3d 18 922 2995 +fd55 3 923 2995 +fd58 7 925 2995 +fd5f 1 926 2995 +fd60 9 928 2995 +fd69 c 930 2995 +fd75 4 901 2995 +fd79 19 935 2995 +fd92 3 937 2995 +fd95 4 939 2995 +fd99 11 941 2995 +fdaa c 943 2995 +fdb6 2 947 2995 +fdb8 3 949 2995 +fdbb 2 952 2995 +fdbd 3 953 2995 +fdc0 9 937 2995 +fdc9 5 956 2995 +fdce 2 961 2995 +fdd0 3 962 2995 +fdd3 2 965 2995 +fdd5 5 966 2995 +fdda 12 972 2995 +FUNC fdec f3 8 _create_locale +fdec 0 605 2995 +fdec 10 609 2995 +fdfc 13 612 2995 +fe0f b 614 2995 +fe1a 4 610 2995 +fe1e c 658 2995 +fe2a 8 617 2995 +fe32 7 619 2995 +fe39 2 621 2995 +fe3b 14 623 2995 +fe4f 7 625 2995 +fe56 7 626 2995 +fe5d 2 628 2995 +fe5f c 630 2995 +fe6b 14 632 2995 +fe7f 7 634 2995 +fe86 7 635 2995 +fe8d 9 637 2995 +fe96 2 640 2995 +fe98 13 642 2995 +feab 8 644 2995 +feb3 7 645 2995 +feba 7 646 2995 +fec1 9 647 2995 +feca 2 648 2995 +fecc 2 650 2995 +fece 5 652 2995 +fed3 5 653 2995 +fed8 7 657 2995 +FUNC fedf 5 8 __create_locale +fedf 0 665 2995 +fedf 5 666 2995 +FUNC fee4 170 8 setlocale +fee4 c 791 2995 +fef0 5 792 2995 +fef5 25 797 2995 +ff1a a 799 2995 +ff24 5 801 2995 +ff29 4 806 2995 +ff2d 3 807 2995 +ff30 1b 808 2995 +ff4b 8 818 2995 +ff53 7 819 2995 +ff5a a 820 2995 +ff64 8 822 2995 +ff6c 19 826 2995 +ff85 18 834 2995 +ff9d a 836 2995 +ffa7 8 839 2995 +ffaf 7 840 2995 +ffb6 a 841 2995 +ffc0 7 842 2995 +ffc7 f 846 2995 +ffd6 c 847 2995 +ffe2 18 849 2995 +fffa 5 850 2995 +ffff b 852 2995 +1000a 8 822 2995 +10012 9 823 2995 +1001b 3 852 2995 +1001e 9 853 2995 +10027 2 855 2995 +10029 6 856 2995 +1002f 8 857 2995 +10037 c 860 2995 +10043 3 865 2995 +10046 6 866 2995 +1004c 3 860 2995 +1004f 5 862 2995 +FUNC 10054 15f 14 _wctomb_s_l +10054 8 56 6128 +1005c 11 57 6128 +1006d 7 60 6128 +10074 2 62 6128 +10076 4 64 6128 +1007a 7 67 6128 +10081 3 69 6128 +10084 23 74 6128 +100a7 b 77 6128 +100b2 c 79 6128 +100be a 81 6128 +100c8 8 83 6128 +100d0 b 85 6128 +100db b 125 6128 +100e6 13 126 6128 +100f9 5 136 6128 +100fe 4 91 6128 +10102 2c 93 6128 +1012e 2 94 6128 +10130 7 96 6128 +10137 6 98 6128 +1013d 15 100 6128 +10152 27 115 6128 +10179 7 129 6128 +10180 2 131 6128 +10182 2 133 6128 +10184 f 117 6128 +10193 10 119 6128 +101a3 b 121 6128 +101ae 5 123 6128 +FUNC 101b3 1b 10 wctomb_s +101b3 0 144 6128 +101b3 1a 145 6128 +101cd 1 146 6128 +FUNC 101ce 4f c _wctomb_l +101ce 6 178 6128 +101d4 f 181 6128 +101e3 1f 183 6128 +10202 19 184 6128 +1021b 2 185 6128 +FUNC 1021d 30 8 wctomb +1021d 4 191 6128 +10221 4 192 6128 +10225 1a 195 6128 +1023f 7 196 6128 +10246 2 197 6128 +10248 3 196 6128 +1024b 2 197 6128 +FUNC 1024d 36 8 _isleadbyte_l +1024d 6 55 6490 +10253 b 56 6490 +1025e 23 57 6490 +10281 2 58 6490 +FUNC 10283 e 4 isleadbyte +10283 0 63 6490 +10283 d 64 6490 +10290 1 65 6490 +FUNC 10291 16 8 _iswalpha_l +10291 0 71 6490 +10291 15 72 6490 +102a6 1 73 6490 +FUNC 102a7 11 4 iswalpha +102a7 0 78 6490 +102a7 10 79 6490 +102b7 1 80 6490 +FUNC 102b8 13 8 _iswupper_l +102b8 0 86 6490 +102b8 12 87 6490 +102ca 1 88 6490 +FUNC 102cb e 4 iswupper +102cb 0 93 6490 +102cb d 94 6490 +102d8 1 95 6490 +FUNC 102d9 13 8 _iswlower_l +102d9 0 101 6490 +102d9 12 102 6490 +102eb 1 103 6490 +FUNC 102ec e 4 iswlower +102ec 0 108 6490 +102ec d 109 6490 +102f9 1 110 6490 +FUNC 102fa 13 8 _iswdigit_l +102fa 0 116 6490 +102fa 12 117 6490 +1030c 1 118 6490 +FUNC 1030d e 4 iswdigit +1030d 0 123 6490 +1030d d 124 6490 +1031a 1 125 6490 +FUNC 1031b 16 8 _iswxdigit_l +1031b 0 131 6490 +1031b 15 132 6490 +10330 1 133 6490 +FUNC 10331 11 4 iswxdigit +10331 0 138 6490 +10331 10 139 6490 +10341 1 140 6490 +FUNC 10342 13 8 _iswspace_l +10342 0 146 6490 +10342 12 147 6490 +10354 1 148 6490 +FUNC 10355 e 4 iswspace +10355 0 153 6490 +10355 d 154 6490 +10362 1 155 6490 +FUNC 10363 13 8 _iswpunct_l +10363 0 161 6490 +10363 12 162 6490 +10375 1 163 6490 +FUNC 10376 e 4 iswpunct +10376 0 168 6490 +10376 d 169 6490 +10383 1 170 6490 +FUNC 10384 16 8 _iswalnum_l +10384 0 176 6490 +10384 15 177 6490 +10399 1 178 6490 +FUNC 1039a 11 4 iswalnum +1039a 0 183 6490 +1039a 10 184 6490 +103aa 1 185 6490 +FUNC 103ab 16 8 _iswprint_l +103ab 0 191 6490 +103ab 15 192 6490 +103c0 1 193 6490 +FUNC 103c1 11 4 iswprint +103c1 0 198 6490 +103c1 10 199 6490 +103d1 1 200 6490 +FUNC 103d2 16 8 _iswgraph_l +103d2 0 206 6490 +103d2 15 207 6490 +103e7 1 208 6490 +FUNC 103e8 11 4 iswgraph +103e8 0 213 6490 +103e8 10 214 6490 +103f8 1 215 6490 +FUNC 103f9 13 8 _iswcntrl_l +103f9 0 221 6490 +103f9 12 222 6490 +1040b 1 223 6490 +FUNC 1040c e 4 iswcntrl +1040c 0 228 6490 +1040c d 229 6490 +10419 1 230 6490 +FUNC 1041a c 4 iswascii +1041a 0 235 6490 +1041a b 236 6490 +10425 1 237 6490 +FUNC 10426 26 8 _iswcsym_l +10426 0 243 6490 +10426 21 244 6490 +10447 1 245 6490 +10448 3 244 6490 +1044b 1 245 6490 +FUNC 1044c 21 4 __iswcsym +1044c 0 250 6490 +1044c 1c 251 6490 +10468 1 252 6490 +10469 3 251 6490 +1046c 1 252 6490 +FUNC 1046d 26 8 _iswcsymf_l +1046d 0 258 6490 +1046d 21 259 6490 +1048e 1 260 6490 +1048f 3 259 6490 +10492 1 260 6490 +FUNC 10493 21 4 __iswcsymf +10493 0 265 6490 +10493 1c 266 6490 +104af 1 267 6490 +104b0 3 266 6490 +104b3 1 267 6490 +FUNC 104c0 95 0 _aulldvrm +104c0 0 45 5113 +104c0 1 47 5113 +104c1 4 79 5113 +104c5 2 80 5113 +104c7 2 81 5113 +104c9 4 82 5113 +104cd 4 83 5113 +104d1 2 84 5113 +104d3 2 85 5113 +104d5 2 86 5113 +104d7 4 87 5113 +104db 2 88 5113 +104dd 2 89 5113 +104df 2 94 5113 +104e1 4 95 5113 +104e5 2 96 5113 +104e7 2 97 5113 +104e9 4 98 5113 +104ed 2 99 5113 +104ef 2 100 5113 +104f1 2 107 5113 +104f3 4 108 5113 +104f7 4 109 5113 +104fb 4 110 5113 +104ff 2 112 5113 +10501 2 113 5113 +10503 2 114 5113 +10505 2 115 5113 +10507 2 116 5113 +10509 2 117 5113 +1050b 2 118 5113 +1050d 2 119 5113 +1050f 4 128 5113 +10513 2 129 5113 +10515 4 130 5113 +10519 2 131 5113 +1051b 2 132 5113 +1051d 2 133 5113 +1051f 4 141 5113 +10523 2 142 5113 +10525 2 143 5113 +10527 4 144 5113 +1052b 2 145 5113 +1052d 1 147 5113 +1052e 4 148 5113 +10532 4 149 5113 +10536 2 151 5113 +10538 4 160 5113 +1053c 4 161 5113 +10540 2 162 5113 +10542 2 163 5113 +10544 3 164 5113 +10547 2 169 5113 +10549 2 170 5113 +1054b 2 171 5113 +1054d 2 172 5113 +1054f 2 173 5113 +10551 1 179 5113 +10552 3 181 5113 +FUNC 10558 90 0 _local_unwind4 +FUNC 105e8 46 0 _unwind_handler4 +FUNC 1062e 1c 4 _seh_longjmp_unwind4 +FUNC 1064a 17 0 _EH4_CallFilterFunc +FUNC 10661 19 0 _EH4_TransferToHandler +FUNC 1067a 1a 0 _EH4_GlobalUnwind +FUNC 10694 17 8 _EH4_LocalUnwind +FUNC 106ab 33 0 write_char +106ab 0 2433 1218 +106ab a 2434 1218 +106b5 2 2437 1218 +106b7 21 2442 1218 +106d8 2 2444 1218 +106da 1 2447 1218 +106db 2 2446 1218 +106dd 1 2447 1218 +FUNC 106de 24 c write_multi_char +106de 6 2498 1218 +106e4 2 2501 1218 +106e6 e 2500 1218 +106f4 5 2501 1218 +106f9 7 2499 1218 +10700 2 2504 1218 +FUNC 10702 4a 4 write_string +10702 0 2563 1218 +10702 12 2564 1218 +10714 6 2566 1218 +1071a 2 2567 1218 +1071c e 2570 1218 +1072a 5 2571 1218 +1072f a 2573 1218 +10739 9 2574 1218 +10742 9 2569 1218 +1074b 1 2579 1218 +FUNC 1074c 9b0 10 _output_s_l +1074c 1b 975 1218 +10767 45 1036 1218 +107ac 2d 1031 1218 +107d9 b1 1033 1218 +1088a 8 1036 1218 +10892 28 1073 1218 +108ba 17 1078 1218 +108d1 e 1079 1218 +108df 11 1124 1218 +108f0 12 1131 1218 +10902 2 1171 1218 +10904 13 1173 1218 +10917 3 1174 1218 +1091a 5 1175 1218 +1091f 1e 1179 1218 +1093d 3 1193 1218 +10940 5 1194 1218 +10945 4 1181 1218 +10949 5 1182 1218 +1094e 4 1184 1218 +10952 5 1185 1218 +10957 7 1190 1218 +1095e 5 1191 1218 +10963 4 1187 1218 +10967 5 1196 1218 +1096c 5 1200 1218 +10971 9 1206 1218 +1097a b 1233 1218 +10985 4 1235 1218 +10989 3 1236 1218 +1098c 5 1239 1218 +10991 10 1241 1218 +109a1 5 1243 1218 +109a6 4 1248 1218 +109aa 5 1249 1218 +109af 5 1253 1218 +109b4 9 1259 1218 +109bd b 1284 1218 +109c8 4 1285 1218 +109cc 5 1287 1218 +109d1 10 1289 1218 +109e1 5 1291 1218 +109e6 18 1295 1218 +109fe 7 1362 1218 +10a05 5 1363 1218 +10a0a 5 1301 1218 +10a0f 1 1303 1218 +10a10 a 1304 1218 +10a1a 5 1306 1218 +10a1f 4 1308 1218 +10a23 5 1310 1218 +10a28 4 1358 1218 +10a2c 5 1359 1218 +10a31 c 1322 1218 +10a3d 2 1324 1218 +10a3f f 1325 1218 +10a4e a 1327 1218 +10a58 2 1329 1218 +10a5a a 1330 1218 +10a64 5 1332 1218 +10a69 30 1337 1218 +10a99 4 1352 1218 +10a9d 4 1154 1218 +10aa1 10 1158 1218 +10ab1 11 1160 1218 +10ac2 3 1161 1218 +10ac5 b 1163 1218 +10ad0 b 1166 1218 +10adb 5 1167 1218 +10ae0 32 1378 1218 +10b12 d 1716 1218 +10b1f 4 1724 1218 +10b23 18 1749 1218 +10b3b c 1750 1218 +10b47 8 1381 1218 +10b4f 9 1385 1218 +10b58 8 1561 1218 +10b60 7 1562 1218 +10b67 d 1584 1218 +10b74 3 1589 1218 +10b77 15 1635 1218 +10b8c 4 1636 1218 +10b90 8 1637 1218 +10b98 f 1639 1218 +10ba7 1d 1378 1218 +10bc4 12 1448 1218 +10bd6 16 1467 1218 +10bec 4 1470 1218 +10bf0 7 1471 1218 +10bf7 2 1472 1218 +10bf9 6 1499 1218 +10bff 7 1500 1218 +10c06 6 1503 1218 +10c0c 5 1506 1218 +10c11 5 1523 1218 +10c16 e 1541 1218 +10c24 6 1546 1218 +10c2a d 1548 1218 +10c37 7 1549 1218 +10c3e 5 1550 1218 +10c43 4 1551 1218 +10c47 5 1553 1218 +10c4c 8 1543 1218 +10c54 7 1544 1218 +10c5b 5 1557 1218 +10c60 34 1378 1218 +10c94 9 1908 1218 +10c9d 9 1910 1218 +10ca6 8 1668 1218 +10cae d 1688 1218 +10cbb 6 1702 1218 +10cc1 7 1703 1218 +10cc8 2 1704 1218 +10cca 5 1706 1218 +10ccf 7 1708 1218 +10cd6 5 1710 1218 +10cdb 4 1864 1218 +10cdf 7 1869 1218 +10ce6 c 1933 1218 +10cf2 8 1939 1218 +10cfa 5 1958 1218 +10cff 7 1751 1218 +10d06 9 1752 1218 +10d0f 5 1753 1218 +10d14 3 1754 1218 +10d17 9 1756 1218 +10d20 f 1759 1218 +10d2f 2 1760 1218 +10d31 15 1765 1218 +10d46 8 1767 1218 +10d4e e 1809 1218 +10d5c 27 1828 1218 +10d83 14 1838 1218 +10d97 15 1840 1218 +10dac a 1844 1218 +10db6 15 1846 1218 +10dcb 5 1852 1218 +10dd0 7 1853 1218 +10dd7 4 1854 1218 +10ddb 1 1857 1218 +10ddc 5 1859 1218 +10de1 3 1877 1218 +10de4 3 1887 1218 +10de7 2 1888 1218 +10de9 1a 1378 1218 +10e03 7 1892 1218 +10e0a 11 1897 1218 +10e1b c 1900 1218 +10e27 7 1901 1218 +10e2e 5 1903 1218 +10e33 5 1961 1218 +10e38 6 1987 1218 +10e3e 14 2026 1218 +10e52 2 2045 1218 +10e54 5 2051 1218 +10e59 2 2071 1218 +10e5b 3 2074 1218 +10e5e 6 2080 1218 +10e64 2 2099 1218 +10e66 5 2105 1218 +10e6b f 2128 1218 +10e7a 7 2129 1218 +10e81 7 2130 1218 +10e88 c 2136 1218 +10e94 2 2142 1218 +10e96 6 2148 1218 +10e9c 7 2149 1218 +10ea3 2 2150 1218 +10ea5 4 2151 1218 +10ea9 a 2152 1218 +10eb3 3 2153 1218 +10eb6 6 2157 1218 +10ebc 3 2158 1218 +10ebf 6 2163 1218 +10ec5 10 2165 1218 +10ed5 10 2166 1218 +10ee5 c 2168 1218 +10ef1 3 2170 1218 +10ef4 3 2172 1218 +10ef7 2 2173 1218 +10ef9 8 2175 1218 +10f01 1 2176 1218 +10f02 19 2180 1218 +10f1b 9 2181 1218 +10f24 1 2182 1218 +10f25 2 2185 1218 +10f27 7 1640 1218 +10f2e 2 1641 1218 +10f30 4 1640 1218 +10f34 5 1642 1218 +10f39 2 1644 1218 +10f3b 4 1645 1218 +10f3f 8 1646 1218 +10f47 5 1647 1218 +10f4c 6 1648 1218 +10f52 1 1649 1218 +10f53 4 1648 1218 +10f57 6 1650 1218 +10f5d a 2201 1218 +10f67 7 2204 1218 +10f6e 6 2205 1218 +10f74 4 2207 1218 +10f78 2 2208 1218 +10f7a 4 2210 1218 +10f7e 4 2212 1218 +10f82 2 2213 1218 +10f84 4 2215 1218 +10f88 4 2217 1218 +10f8c 7 2218 1218 +10f93 9 2224 1218 +10f9c 6 2228 1218 +10fa2 11 2230 1218 +10fb3 11 2234 1218 +10fc4 d 2236 1218 +10fd1 f 2238 1218 +10fe0 d 2243 1218 +10fed 3 2249 1218 +10ff0 3 2250 1218 +10ff3 1e 2252 1218 +11011 9 2253 1218 +1101a 18 2257 1218 +11032 2 1690 1218 +11034 4 2254 1218 +11038 2 2259 1218 +1103a d 2260 1218 +11047 c 2290 1218 +11053 f 2292 1218 +11062 6 2297 1218 +11068 8 2298 1218 +11070 1b 2299 1218 +1108b 17 1125 1218 +110a2 2 1690 1218 +110a4 f 2310 1218 +110b3 10 2376 1218 +110c3 39 2377 1218 +FUNC 110fc 129 10 _validate_param_reuseA +110fc 3 606 1271 +110ff 1c 610 1271 +1111b f 617 1271 +1112a 11 618 1271 +1113b 10 620 1271 +1114b 36 629 1271 +11181 46 632 1271 +111c7 2 633 1271 +111c9 17 639 1271 +111e0 c 645 1271 +111ec 2c 626 1271 +11218 b 614 1271 +11223 2 646 1271 +FUNC 11225 33 0 write_char +11225 0 2433 1271 +11225 a 2434 1271 +1122f 2 2437 1271 +11231 21 2442 1271 +11252 2 2444 1271 +11254 1 2447 1271 +11255 2 2446 1271 +11257 1 2447 1271 +FUNC 11258 24 c write_multi_char +11258 6 2498 1271 +1125e 2 2501 1271 +11260 e 2500 1271 +1126e 5 2501 1271 +11273 7 2499 1271 +1127a 2 2504 1271 +FUNC 1127c 4a 4 write_string +1127c 0 2563 1271 +1127c 12 2564 1271 +1128e 6 2566 1271 +11294 2 2567 1271 +11296 e 2570 1271 +112a4 5 2571 1271 +112a9 a 2573 1271 +112b3 9 2574 1271 +112bc 9 2569 1271 +112c5 1 2579 1271 +FUNC 112c6 10 4 get_crtdouble_arg +112c6 0 2684 1271 +112c6 f 2685 1271 +112d5 1 2686 1271 +FUNC 112d6 f88 10 _output_p_l +112d6 1b 975 1271 +112f1 15 986 1271 +11306 b 1007 1271 +11311 2b 2172 1271 +1133c 2c 1031 1271 +11368 9b 1033 1271 +11403 8 1036 1271 +1140b 3 1038 1271 +1140e 3 1041 1271 +11411 3 1043 1271 +11414 11 1046 1271 +11425 7 1061 1271 +1142c 4 1062 1271 +11430 7 1069 1271 +11437 32 1073 1271 +11469 19 1078 1271 +11482 e 1079 1271 +11490 1a 1082 1271 +114aa 6 1084 1271 +114b0 1b 1087 1271 +114cb 5 1089 1271 +114d0 15 1091 1271 +114e5 3 1093 1271 +114e8 2 1095 1271 +114ea 6 1097 1271 +114f0 5 1101 1271 +114f5 c 1103 1271 +11501 7 1104 1271 +11508 e 1106 1271 +11516 1a 1109 1271 +11530 8 1112 1271 +11538 f 1131 1271 +11547 9 1120 1271 +11550 b 1131 1271 +1155b 21 1137 1271 +1157c 5 1145 1271 +11581 16 1173 1271 +11597 3 1174 1271 +1159a 5 1175 1271 +1159f 1f 1179 1271 +115be 7 1193 1271 +115c5 5 1194 1271 +115ca 7 1181 1271 +115d1 5 1182 1271 +115d6 6 1184 1271 +115dc 5 1185 1271 +115e1 a 1190 1271 +115eb 5 1191 1271 +115f0 7 1187 1271 +115f7 5 1196 1271 +115fc 9 1200 1271 +11605 5 1203 1271 +1160a a 1206 1271 +11614 2 1209 1271 +11616 c 1211 1271 +11622 7 1212 1271 +11629 b 1214 1271 +11634 1b 1216 1271 +1164f 8 1219 1271 +11657 12 1221 1271 +11669 9 1274 1271 +11672 5 1275 1271 +11677 c 1228 1271 +11683 b 1233 1271 +1168e 7 1235 1271 +11695 3 1236 1271 +11698 5 1239 1271 +1169d 10 1241 1271 +116ad 5 1243 1271 +116b2 3 1248 1271 +116b5 5 1249 1271 +116ba 5 1253 1271 +116bf 5 1256 1271 +116c4 a 1259 1271 +116ce 2 1262 1271 +116d0 c 1264 1271 +116dc 7 1265 1271 +116e3 f 1267 1271 +116f2 c 1280 1271 +116fe b 1284 1271 +11709 4 1285 1271 +1170d 5 1287 1271 +11712 1c 1274 1271 +1172e 10 1289 1271 +1173e 5 1291 1271 +11743 18 1295 1271 +1175b a 1362 1271 +11765 5 1363 1271 +1176a 5 1301 1271 +1176f 1 1303 1271 +11770 d 1304 1271 +1177d 5 1306 1271 +11782 7 1308 1271 +11789 5 1310 1271 +1178e 7 1358 1271 +11795 5 1359 1271 +1179a c 1322 1271 +117a6 2 1324 1271 +117a8 12 1325 1271 +117ba a 1327 1271 +117c4 2 1329 1271 +117c6 d 1330 1271 +117d3 5 1332 1271 +117d8 18 1337 1271 +117f0 3 1352 1271 +117f3 13 1158 1271 +11806 11 1160 1271 +11817 8 1161 1271 +1181f 8 1163 1271 +11827 b 1166 1271 +11832 5 1167 1271 +11837 a 1342 1271 +11841 5 1366 1271 +11846 39 1378 1271 +1187f 9 1716 1271 +11888 7 1724 1271 +1188f 12 1726 1271 +118a1 a 1728 1271 +118ab 27 1739 1271 +118d2 b 1381 1271 +118dd c 1385 1271 +118e9 b 1561 1271 +118f4 a 1562 1271 +118fe d 1584 1271 +1190b 9 1586 1271 +11914 a 1589 1271 +1191e 5 1592 1271 +11923 25 1378 1271 +11948 b 1442 1271 +11953 5 1445 1271 +11958 b 1448 1271 +11963 2 1451 1271 +11965 a 1453 1271 +1196f 27 1457 1271 +11996 5 1458 1271 +1199b a 1462 1271 +119a5 19 1467 1271 +119be 4 1470 1271 +119c2 3 1471 1271 +119c5 2 1472 1271 +119c7 5 1477 1271 +119cc b 1480 1271 +119d7 2 1483 1271 +119d9 a 1485 1271 +119e3 f 1489 1271 +119f2 a 1494 1271 +119fc 6 1499 1271 +11a02 3 1500 1271 +11a05 9 1503 1271 +11a0e 5 1506 1271 +11a13 5 1520 1271 +11a18 a 1523 1271 +11a22 2 1526 1271 +11a24 a 1528 1271 +11a2e 9 1532 1271 +11a37 6 1533 1271 +11a3d 9 1537 1271 +11a46 b 1541 1271 +11a51 9 1546 1271 +11a5a d 1548 1271 +11a67 3 1549 1271 +11a6a 5 1550 1271 +11a6f 3 1551 1271 +11a72 5 1553 1271 +11a77 8 1543 1271 +11a7f 7 1544 1271 +11a86 5 1557 1271 +11a8b 38 1378 1271 +11ac3 14 1908 1271 +11ad7 f 1910 1271 +11ae6 5 1665 1271 +11aeb a 1668 1271 +11af5 2 1671 1271 +11af7 a 1673 1271 +11b01 25 1677 1271 +11b26 5 1678 1271 +11b2b 9 1682 1271 +11b34 9 1688 1271 +11b3d 9 1702 1271 +11b46 7 1703 1271 +11b4d 2 1704 1271 +11b4f 5 1706 1271 +11b54 3 1708 1271 +11b57 5 1710 1271 +11b5c 7 1864 1271 +11b63 7 1869 1271 +11b6a f 1933 1271 +11b79 9 1936 1271 +11b82 e 1939 1271 +11b90 5 1942 1271 +11b95 1c 1739 1271 +11bb1 21 1109 1271 +11bd2 16 1749 1271 +11be8 9 1750 1271 +11bf1 7 1751 1271 +11bf8 3 1767 1271 +11bfb 5 1806 1271 +11c00 9 1809 1271 +11c09 2 1812 1271 +11c0b 5 1753 1271 +11c10 3 1754 1271 +11c13 a 1756 1271 +11c1d f 1759 1271 +11c2c 2 1760 1271 +11c2e 11 1765 1271 +11c3f a 1818 1271 +11c49 6 1821 1271 +11c4f 16 1822 1271 +11c65 26 1828 1271 +11c8b 16 1838 1271 +11ca1 17 1840 1271 +11cb8 a 1844 1271 +11cc2 17 1846 1271 +11cd9 8 1852 1271 +11ce1 a 1853 1271 +11ceb 3 1854 1271 +11cee 3 1857 1271 +11cf1 5 1859 1271 +11cf6 7 1877 1271 +11cfd 7 1887 1271 +11d04 2 1888 1271 +11d06 1a 1378 1271 +11d20 7 1892 1271 +11d27 14 1897 1271 +11d3b c 1900 1271 +11d47 7 1901 1271 +11d4e 5 1903 1271 +11d53 a 1944 1271 +11d5d 2c 1948 1271 +11d89 5 1949 1271 +11d8e 6 1961 1271 +11d94 3 1964 1271 +11d97 6 1970 1271 +11d9d a 1972 1271 +11da7 2c 1976 1271 +11dd3 5 1977 1271 +11dd8 c 1981 1271 +11de4 5 1987 1271 +11de9 4 2019 1271 +11ded 4 2020 1271 +11df1 5 2023 1271 +11df6 b 2026 1271 +11e01 5 2029 1271 +11e06 a 2031 1271 +11e10 f 2035 1271 +11e1f a 2040 1271 +11e29 2 2045 1271 +11e2b 5 2048 1271 +11e30 b 2051 1271 +11e3b 2 2054 1271 +11e3d a 2056 1271 +11e47 b 2060 1271 +11e52 a 2065 1271 +11e5c 2 2071 1271 +11e5e 4 2074 1271 +11e62 5 2077 1271 +11e67 a 2080 1271 +11e71 2 2083 1271 +11e73 a 2085 1271 +11e7d b 2089 1271 +11e88 a 2094 1271 +11e92 2 2099 1271 +11e94 5 2102 1271 +11e99 a 2105 1271 +11ea3 2 2108 1271 +11ea5 a 2110 1271 +11eaf 38 2114 1271 +11ee7 5 2115 1271 +11eec b 2119 1271 +11ef7 13 2128 1271 +11f0a 7 2129 1271 +11f11 a 2130 1271 +11f1b f 2136 1271 +11f2a 2 2142 1271 +11f2c 6 2148 1271 +11f32 7 2149 1271 +11f39 2 2150 1271 +11f3b 7 2151 1271 +11f42 a 2152 1271 +11f4c 3 2153 1271 +11f4f 6 2157 1271 +11f55 3 2158 1271 +11f58 6 2163 1271 +11f5e 10 2165 1271 +11f6e 10 2166 1271 +11f7e c 2168 1271 +11f8a 3 2170 1271 +11f8d 3 2172 1271 +11f90 2 2173 1271 +11f92 8 2175 1271 +11f9a 1 2176 1271 +11f9b 24 2180 1271 +11fbf 9 2181 1271 +11fc8 1 2182 1271 +11fc9 5 2185 1271 +11fce c 1594 1271 +11fda c 1598 1271 +11fe6 9 1603 1271 +11fef e 1635 1271 +11ffd 4 1636 1271 +12001 8 1637 1271 +12009 8 1639 1271 +12011 1c 1598 1271 +1202d 6 1640 1271 +12033 2 1641 1271 +12035 4 1640 1271 +12039 5 1642 1271 +1203e 2 1644 1271 +12040 5 1645 1271 +12045 8 1646 1271 +1204d 5 1647 1271 +12052 6 1648 1271 +12058 1 1649 1271 +12059 4 1648 1271 +1205d 6 1650 1271 +12063 10 2189 1271 +12073 a 2201 1271 +1207d a 2204 1271 +12087 6 2205 1271 +1208d 4 2207 1271 +12091 2 2208 1271 +12093 4 2210 1271 +12097 4 2212 1271 +1209b 2 2213 1271 +1209d 4 2215 1271 +120a1 4 2217 1271 +120a5 7 2218 1271 +120ac 9 2224 1271 +120b5 4 2228 1271 +120b9 11 2230 1271 +120ca 11 2234 1271 +120db 13 2236 1271 +120ee f 2238 1271 +120fd d 2243 1271 +1210a 3 2249 1271 +1210d 3 2250 1271 +12110 1e 2252 1271 +1212e 9 2253 1271 +12137 18 2257 1271 +1214f 2 2310 1271 +12151 4 2254 1271 +12155 2 2259 1271 +12157 d 2260 1271 +12164 f 2290 1271 +12173 f 2292 1271 +12182 6 2297 1271 +12188 8 2298 1271 +12190 15 2299 1271 +121a5 2 1073 1271 +121a7 f 2310 1271 +121b6 b 2314 1271 +121c1 10 2319 1271 +121d1 1d 2321 1271 +121ee 2 2360 1271 +121f0 3 2361 1271 +121f3 2 2362 1271 +121f5 2 2324 1271 +121f7 f 2325 1271 +12206 10 1043 1271 +12216 10 2376 1271 +12226 38 2377 1271 +FUNC 1225e c2 4 _putwch_nolock +1225e 11 84 4721 +1226f a 89 4721 +12279 9 91 4721 +12282 5 92 4721 +12287 a 96 4721 +12291 6 97 4721 +12297 16 103 4721 +122ad 14 105 4721 +122c1 6 106 4721 +122c7 1c 123 4721 +122e3 1e 129 4721 +12301 2 131 4721 +12303 4 133 4721 +12307 d 134 4721 +12314 a 110 4721 +1231e 2 113 4721 +FUNC 12320 9b 4 _cputws +12320 c 151 4721 +1232c 5 153 4721 +12331 30 155 4721 +12361 b 157 4721 +1236c 9 158 4721 +12375 3 159 4721 +12378 a 160 4721 +12382 17 162 4721 +12399 4 164 4721 +1239d c 169 4721 +123a9 3 172 4721 +123ac 6 173 4721 +123b2 9 170 4721 +FUNC 123bb 46 4 _putwch +123bb c 49 4721 +123c7 8 52 4721 +123cf 4 53 4721 +123d3 f 55 4721 +123e2 c 58 4721 +123ee 4 62 4721 +123f2 6 63 4721 +123f8 9 59 4721 +FUNC 12401 113 10 _mbtowc_l +12401 8 55 6355 +12409 e 56 6355 +12417 4 61 6355 +1241b 7 64 6355 +12422 3 65 6355 +12425 4 59 6355 +12429 2 116 6355 +1242b b 70 6355 +12436 8 73 6355 +1243e 7 75 6355 +12445 7 76 6355 +1244c 11 77 6355 +1245d 13 80 6355 +12470 33 90 6355 +124a3 10 93 6355 +124b3 1b 99 6355 +124ce b 95 6355 +124d9 14 96 6355 +124ed 25 108 6355 +12512 2 111 6355 +FUNC 12514 17 c mbtowc +12514 0 123 6355 +12514 16 124 6355 +1252a 1 125 6355 +FUNC 1252b 83 10 _lseeki64_nolock +1252b 5 120 4872 +12530 4 126 4872 +12534 1b 134 4872 +1254f b 136 4872 +1255a 6 138 4872 +12560 22 146 4872 +12582 7 148 4872 +12589 2 149 4872 +1258b 19 152 4872 +125a4 8 153 4872 +125ac 2 154 4872 +FUNC 125ae 119 10 _lseeki64 +125ae c 73 4872 +125ba 9 74 4872 +125c3 24 77 4872 +125e7 2f 78 4872 +12616 46 79 4872 +1265c 7 81 4872 +12663 3 82 4872 +12666 9 84 4872 +1266f 1a 85 4872 +12689 2 86 4872 +1268b b 87 4872 +12696 7 88 4872 +1269d 8 89 4872 +126a5 c 93 4872 +126b1 6 97 4872 +126b7 6 98 4872 +126bd a 94 4872 +FUNC 126c7 7d 8 _set_osfhnd +126c7 0 213 4825 +126c7 2e 216 4825 +126f5 e 217 4825 +12703 b 218 4825 +1270e 3 226 4825 +12711 2 227 4825 +12713 3 223 4825 +12716 2 224 4825 +12718 9 220 4825 +12721 5 231 4825 +12726 5 232 4825 +1272b b 234 4825 +12736 8 235 4825 +1273e 5 236 4825 +12743 1 238 4825 +FUNC 12744 81 4 _free_osfhnd +12744 0 263 4825 +12744 38 266 4825 +1277c 9 268 4825 +12785 a 269 4825 +1278f 3 277 4825 +12792 2 278 4825 +12794 3 274 4825 +12797 2 275 4825 +12799 9 271 4825 +127a2 6 282 4825 +127a8 4 283 4825 +127ac b 285 4825 +127b7 7 286 4825 +127be 6 287 4825 +127c4 1 289 4825 +FUNC 127c5 71 4 _get_osfhandle +127c5 0 312 4825 +127c5 1f 313 4825 +127e4 2 318 4825 +127e6 e 314 4825 +127f4 3d 315 4825 +12831 1 318 4825 +12832 3 317 4825 +12835 1 318 4825 +FUNC 12836 a0 4 __lock_fhandle +12836 c 437 4825 +12842 17 438 4825 +12859 7 439 4825 +12860 7 444 4825 +12867 8 446 4825 +1286f 3 447 4825 +12872 5 448 4825 +12877 14 449 4825 +1288b 3 453 4825 +1288e 3 455 4825 +12891 c 457 4825 +1289d 5 462 4825 +128a2 1d 464 4825 +128bf 3 467 4825 +128c2 6 468 4825 +128c8 5 457 4825 +128cd 9 458 4825 +FUNC 128d6 22 4 _unlock_fhandle +128d6 0 489 4825 +128d6 21 490 4825 +128f7 1 491 4825 +FUNC 128f8 19f 0 _alloc_osfhnd +128f8 c 52 4825 +12904 4 53 4825 +12908 5 56 4825 +1290d c 58 4825 +12919 8 59 4825 +12921 8 61 4825 +12929 3 62 4825 +1292c c 71 4825 +12938 f 77 4825 +12947 17 83 4825 +1295e 6 85 4825 +12964 6 89 4825 +1296a 8 90 4825 +12972 6 91 4825 +12978 6 92 4825 +1297e 14 93 4825 +12992 3 99 4825 +12995 2 101 4825 +12997 3 103 4825 +1299a 9 106 4825 +129a3 6 111 4825 +129a9 a 113 4825 +129b3 6 119 4825 +129b9 7 120 4825 +129c0 5 83 4825 +129c5 6 106 4825 +129cb 9 107 4825 +129d4 6 124 4825 +129da 4 126 4825 +129de 3 127 4825 +129e1 19 128 4825 +129fa 6 137 4825 +12a00 6 71 4825 +12a06 12 145 4825 +12a18 9 151 4825 +12a21 7 152 4825 +12a28 c 154 4825 +12a34 4 155 4825 +12a38 3 156 4825 +12a3b 4 157 4825 +12a3f 4 158 4825 +12a43 8 154 4825 +12a4b 6 165 4825 +12a51 19 166 4825 +12a6a b 167 4825 +12a75 4 171 4825 +12a79 c 178 4825 +12a85 3 186 4825 +12a88 6 187 4825 +12a8e 9 179 4825 +FUNC 12a97 115 8 _open_osfhandle +12a97 c 343 4825 +12aa3 5 347 4825 +12aa8 2 351 4825 +12aaa 6 353 4825 +12ab0 3 354 4825 +12ab3 8 356 4825 +12abb 3 357 4825 +12abe 6 359 4825 +12ac4 3 360 4825 +12ac7 9 364 4825 +12ad0 4 365 4825 +12ad4 d 367 4825 +12ae1 3 409 4825 +12ae4 6 410 4825 +12aea 5 372 4825 +12aef 5 373 4825 +12af4 5 374 4825 +12af9 3 375 4825 +12afc f 380 4825 +12b0b b 381 4825 +12b16 7 382 4825 +12b1d 2 383 4825 +12b1f 3 385 4825 +12b22 b 391 4825 +12b2d 3 393 4825 +12b30 1a 395 4825 +12b4a 9 396 4825 +12b53 9 397 4825 +12b5c 7 399 4825 +12b63 c 401 4825 +12b6f 10 409 4825 +12b7f 5 401 4825 +12b84 5 402 4825 +12b89 1b 404 4825 +12ba4 8 406 4825 +FUNC 12bac 11e c _calloc_impl +12bac c 23 5592 +12bb8 9 28 5592 +12bc1 2e 30 5592 +12bef 9 32 5592 +12bf8 4 36 5592 +12bfc 3 37 5592 +12bff 5 41 5592 +12c04 5 43 5592 +12c09 9 46 5592 +12c12 9 50 5592 +12c1b b 52 5592 +12c26 8 56 5592 +12c2e 3 57 5592 +12c31 c 58 5592 +12c3d c 60 5592 +12c49 7 64 5592 +12c50 d 65 5592 +12c5d 4 93 5592 +12c61 11 94 5592 +12c72 c 97 5592 +12c7e f 109 5592 +12c8d b 111 5592 +12c98 6 112 5592 +12c9e 5 113 5592 +12ca3 5 60 5592 +12ca8 9 61 5592 +12cb1 4 100 5592 +12cb5 7 102 5592 +12cbc 6 103 5592 +12cc2 2 105 5592 +12cc4 6 119 5592 +FUNC 12cca 3f 8 calloc +12cca 4 145 5592 +12cce 5 146 5592 +12cd3 14 147 5592 +12ce7 15 149 5592 +12cfc 8 151 5592 +12d04 3 153 5592 +12d07 2 154 5592 +FUNC 12d09 21b 8 realloc +12d09 c 64 5338 +12d15 7 69 5338 +12d1c e 70 5338 +12d2a 7 73 5338 +12d31 7 75 5338 +12d38 5 76 5338 +12d3d d 81 5338 +12d4a 5 88 5338 +12d4f 9 89 5338 +12d58 8 91 5338 +12d60 3 92 5338 +12d63 12 96 5338 +12d75 8 100 5338 +12d7d f 102 5338 +12d8c 5 103 5338 +12d91 e 104 5338 +12d9f 4 107 5338 +12da3 10 108 5338 +12db3 9 110 5338 +12dbc a 111 5338 +12dc6 5 118 5338 +12dcb 4 120 5338 +12dcf 6 121 5338 +12dd5 9 123 5338 +12dde 15 124 5338 +12df3 4 127 5338 +12df7 10 128 5338 +12e07 c 129 5338 +12e13 c 135 5338 +12e1f 6 142 5338 +12e25 4 144 5338 +12e29 1 145 5338 +12e2a 9 147 5338 +12e33 14 148 5338 +12e47 6 135 5338 +12e4d 9 137 5338 +12e56 3 148 5338 +12e59 10 158 5338 +12e69 f 181 5338 +12e78 5 186 5338 +12e7d 5 183 5338 +12e82 11 186 5338 +12e93 2 188 5338 +12e95 8 160 5338 +12e9d 5 170 5338 +12ea2 3 167 5338 +12ea5 2 172 5338 +12ea7 6 174 5338 +12ead 2 155 5338 +12eaf 4 321 5338 +12eb3 1 322 5338 +12eb4 12 323 5338 +12ec6 c 332 5338 +12ed2 b 347 5338 +12edd 5 319 5338 +12ee2 7 327 5338 +12ee9 b 328 5338 +12ef4 2 329 5338 +12ef6 6 356 5338 +12efc 5 349 5338 +12f01 5 350 5338 +12f06 4 334 5338 +12f0a 16 341 5338 +12f20 4 343 5338 +FUNC 12f24 79 c _recalloc +12f24 3 744 5338 +12f27 a 749 5338 +12f31 28 751 5338 +12f59 4 753 5338 +12f5d 9 754 5338 +12f66 b 755 5338 +12f71 b 756 5338 +12f7c a 757 5338 +12f86 10 759 5338 +12f96 5 761 5338 +12f9b 2 762 5338 +FUNC 12f9d 21 0 _get_sbh_threshold +12f9d 0 61 5281 +12f9d 9 64 5281 +12fa6 2 66 5281 +12fa8 1 81 5281 +12fa9 14 69 5281 +12fbd 1 81 5281 +FUNC 12fbe 46 4 _set_amblksiz +12fbe 0 214 5281 +12fbe 2b 216 5281 +12fe9 1 224 5281 +12fea 11 217 5281 +12ffb 5 220 5281 +13000 3 223 5281 +13003 1 224 5281 +FUNC 13004 3c 4 _get_amblksiz +13004 0 243 5281 +13004 27 245 5281 +1302b 1 253 5281 +1302c 8 246 5281 +13034 8 249 5281 +1303c 3 252 5281 +1303f 1 253 5281 +FUNC 13040 48 4 __sbh_heap_init +13040 0 274 5281 +13040 1c 275 5281 +1305c 1 285 5281 +1305d 4 278 5281 +13061 7 280 5281 +13068 c 281 5281 +13074 13 284 5281 +13087 1 285 5281 +FUNC 13088 2b 4 __sbh_find_block +13088 0 306 5281 +13088 12 307 5281 +1309a 7 316 5281 +130a1 8 317 5281 +130a9 3 319 5281 +130ac 4 314 5281 +130b0 2 321 5281 +130b2 1 322 5281 +FUNC 130b3 314 8 __sbh_free_block +130b3 6 381 5281 +130b9 7 399 5281 +130c0 9 402 5281 +130c9 18 407 5281 +130e1 3 408 5281 +130e4 d 412 5281 +130f1 3 416 5281 +130f4 5 417 5281 +130f9 6 420 5281 +130ff b 424 5281 +1310a 4 429 5281 +1310e 5 430 5281 +13113 3 431 5281 +13116 8 434 5281 +1311e 3 439 5281 +13121 b 441 5281 +1312c e 442 5281 +1313a 5 443 5281 +1313f 2 445 5281 +13141 5 448 5281 +13146 11 449 5281 +13157 9 450 5281 +13160 9 455 5281 +13169 15 459 5281 +1317e 6 463 5281 +13184 5 464 5281 +13189 3 465 5281 +1318c f 468 5281 +1319b 3 474 5281 +1319e 6 477 5281 +131a4 b 478 5281 +131af 2 479 5281 +131b1 3 483 5281 +131b4 6 484 5281 +131ba 7 485 5281 +131c1 2 486 5281 +131c3 4 489 5281 +131c7 b 493 5281 +131d2 3 498 5281 +131d5 11 501 5281 +131e6 6 502 5281 +131ec 5 503 5281 +131f1 2 505 5281 +131f3 e 508 5281 +13201 6 509 5281 +13207 6 511 5281 +1320d c 516 5281 +13219 c 517 5281 +13225 8 520 5281 +1322d e 524 5281 +1323b 6 528 5281 +13241 3 529 5281 +13244 6 530 5281 +1324a 3 531 5281 +1324d 6 532 5281 +13253 8 535 5281 +1325b 18 541 5281 +13273 e 542 5281 +13281 f 543 5281 +13290 2 545 5281 +13292 6 547 5281 +13298 10 548 5281 +132a8 13 550 5281 +132bb 5 556 5281 +132c0 4 558 5281 +132c4 b 561 5281 +132cf d 564 5281 +132dc 6 568 5281 +132e2 1a 569 5281 +132fc 15 573 5281 +13311 16 577 5281 +13327 19 578 5281 +13340 9 579 5281 +13349 6 583 5281 +1334f 8 586 5281 +13357 16 589 5281 +1336d 25 595 5281 +13392 14 599 5281 +133a6 4 600 5281 +133aa a 603 5281 +133b4 8 608 5281 +133bc 9 609 5281 +133c5 2 611 5281 +FUNC 133c7 b0 0 __sbh_alloc_new_region +133c7 0 891 5281 +133c7 13 897 5281 +133da 1e 900 5281 +133f8 4 901 5281 +133fc 12 905 5281 +1340e 9 909 5281 +13417 18 913 5281 +1342f 2 914 5281 +13431 1a 918 5281 +1344b 10 920 5281 +1345b 2 921 5281 +1345d 9 927 5281 +13466 6 930 5281 +1346c 6 933 5281 +13472 4 935 5281 +13476 1 936 5281 +FUNC 13477 106 4 __sbh_alloc_new_group +13477 5 958 5281 +1347c 3 959 5281 +1347f 9 972 5281 +13488 4 973 5281 +1348c 2 976 5281 +1348e 1 977 5281 +1348f 4 974 5281 +13493 15 981 5281 +134a8 c 986 5281 +134b4 1f 993 5281 +134d3 8 994 5281 +134db 6 998 5281 +134e1 12 1001 5281 +134f3 4 1004 5281 +134f7 7 1005 5281 +134fe 8 1011 5281 +13506 10 1013 5281 +13516 12 1016 5281 +13528 3 1001 5281 +1352b 8 1021 5281 +13533 6 1023 5281 +13539 3 1024 5281 +1353c 6 1027 5281 +13542 3 1028 5281 +13545 5 1030 5281 +1354a a 1031 5281 +13554 9 1032 5281 +1355d b 1033 5281 +13568 e 1036 5281 +13576 5 1038 5281 +1357b 2 1039 5281 +FUNC 1357d 2df c __sbh_resize_block +1357d 6 1061 5281 +13583 c 1080 5281 +1358f b 1083 5281 +1359a 3 1084 5281 +1359d 12 1085 5281 +135af 7 1089 5281 +135b6 14 1096 5281 +135ca 13 1099 5281 +135dd 7 1105 5281 +135e4 8 1106 5281 +135ec 6 1107 5281 +135f2 8 1110 5281 +135fa 3 1115 5281 +135fd 9 1117 5281 +13606 11 1118 5281 +13617 5 1119 5281 +1361c 2 1121 5281 +1361e 5 1124 5281 +13623 14 1125 5281 +13637 6 1126 5281 +1363d 9 1131 5281 +13646 9 1132 5281 +1364f 12 1135 5281 +13661 a 1141 5281 +1366b 9 1142 5281 +13674 3 1143 5281 +13677 9 1147 5281 +13680 6 1148 5281 +13686 6 1149 5281 +1368c 3 1150 5281 +1368f 6 1151 5281 +13695 8 1154 5281 +1369d 18 1160 5281 +136b5 e 1161 5281 +136c3 6 1162 5281 +136c9 2 1164 5281 +136cb 6 1166 5281 +136d1 10 1167 5281 +136e1 13 1169 5281 +136f4 c 1174 5281 +13700 9 1176 5281 +13709 6 1180 5281 +1370f 9 1182 5281 +13718 7 1100 5281 +1371f 6 1186 5281 +13725 3 1189 5281 +13728 d 1195 5281 +13735 7 1198 5281 +1373c b 1199 5281 +13747 3 1200 5281 +1374a a 1203 5281 +13754 7 1208 5281 +1375b 5 1209 5281 +13760 3 1210 5281 +13763 8 1213 5281 +1376b 3 1218 5281 +1376e b 1221 5281 +13779 e 1222 5281 +13787 5 1223 5281 +1378c 2 1225 5281 +1378e 5 1228 5281 +13793 11 1229 5281 +137a4 9 1231 5281 +137ad 9 1236 5281 +137b6 9 1237 5281 +137bf 9 1240 5281 +137c8 4 1241 5281 +137cc 5 1242 5281 +137d1 3 1243 5281 +137d4 6 1249 5281 +137da 3 1250 5281 +137dd 6 1251 5281 +137e3 3 1252 5281 +137e6 6 1253 5281 +137ec 8 1256 5281 +137f4 18 1262 5281 +1380c e 1263 5281 +1381a 6 1264 5281 +13820 2 1266 5281 +13822 6 1268 5281 +13828 10 1269 5281 +13838 13 1271 5281 +1384b 5 1276 5281 +13850 4 1278 5281 +13854 6 1281 5281 +1385a 2 1282 5281 +FUNC 1385c cd 0 __sbh_heapmin +1385c 0 1302 5281 +1385c d 1306 5281 +13869 6 1310 5281 +1386f 17 1311 5281 +13886 15 1314 5281 +1389b 16 1318 5281 +138b1 19 1319 5281 +138ca 9 1320 5281 +138d3 f 1325 5281 +138e2 11 1328 5281 +138f3 28 1333 5281 +1391b 6 1334 5281 +13921 7 1338 5281 +13928 1 1340 5281 +FUNC 13929 2e2 0 __sbh_heap_check +13929 3 1361 5281 +1392c 12 1391 5281 +1393e 8 1393 5281 +13946 16 1398 5281 +1395c 3 1401 5281 +1395f 8 1402 5281 +13967 6 1406 5281 +1396d 9 1407 5281 +13976 c 1408 5281 +13982 3 1409 5281 +13985 3 1410 5281 +13988 6 1411 5281 +1398e 4 1418 5281 +13992 1b 1421 5281 +139ad 9 1424 5281 +139b6 9 1428 5281 +139bf 1c 1438 5281 +139db 2 1445 5281 +139dd 7 1446 5281 +139e4 1 1449 5281 +139e5 c 1452 5281 +139f1 3 1456 5281 +139f4 2 1458 5281 +139f6 6 1462 5281 +139fc 5 1463 5281 +13a01 3 1464 5281 +13a04 9 1465 5281 +13a0d 1e 1470 5281 +13a2b c 1475 5281 +13a37 2 1479 5281 +13a39 4 1481 5281 +13a3d 6 1484 5281 +13a43 10 1488 5281 +13a53 e 1492 5281 +13a61 2 1498 5281 +13a63 4 1502 5281 +13a67 20 1505 5281 +13a87 19 1509 5281 +13aa0 8 1514 5281 +13aa8 3 1518 5281 +13aab 6 1520 5281 +13ab1 8 1524 5281 +13ab9 4 1527 5281 +13abd e 1532 5281 +13acb 8 1536 5281 +13ad3 6 1541 5281 +13ad9 5 1542 5281 +13ade 3 1543 5281 +13ae1 8 1544 5281 +13ae9 c 1549 5281 +13af5 11 1554 5281 +13b06 6 1559 5281 +13b0c 3 1561 5281 +13b0f e 1563 5281 +13b1d 3 1564 5281 +13b20 2 1566 5281 +13b22 8 1568 5281 +13b2a 3 1569 5281 +13b2d 1c 1575 5281 +13b49 c 1580 5281 +13b55 10 1585 5281 +13b65 17 1591 5281 +13b7c 7 1595 5281 +13b83 7 1596 5281 +13b8a 16 1597 5281 +13ba0 f 1602 5281 +13baf 18 1606 5281 +13bc7 5 1608 5281 +13bcc 2 1609 5281 +13bce 4 1403 5281 +13bd2 4 1425 5281 +13bd6 4 1453 5281 +13bda 4 1485 5281 +13bde 4 1471 5281 +13be2 4 1439 5281 +13be6 4 1493 5281 +13bea 4 1537 5281 +13bee 4 1545 5281 +13bf2 4 1550 5281 +13bf6 4 1510 5281 +13bfa 4 1581 5281 +13bfe 4 1576 5281 +13c02 4 1592 5281 +13c06 5 1603 5281 +FUNC 13c0b a8 4 _set_sbh_threshold +13c0b 1 102 5281 +13c0c a 104 5281 +13c16 3 106 5281 +13c19 1 195 5281 +13c1a a 109 5281 +13c24 25 112 5281 +13c49 5 113 5281 +13c4e 4 114 5281 +13c52 2 195 5281 +13c54 6 173 5281 +13c5a 2 175 5281 +13c5c 5 179 5281 +13c61 2d 185 5281 +13c8e 6 186 5281 +13c94 a 187 5281 +13c9e 5 188 5281 +13ca3 b 193 5281 +13cae 4 194 5281 +13cb2 1 195 5281 +FUNC 13cb3 2e3 4 __sbh_alloc_block +13cb3 6 632 5281 +13cb9 5 633 5281 +13cbe 15 650 5281 +13cd3 5 668 5281 +13cd8 7 669 5281 +13cdf 5 671 5281 +13ce4 4 672 5281 +13ce8 2 674 5281 +13cea d 677 5281 +13cf7 a 682 5281 +13d01 e 686 5281 +13d0f 3 688 5281 +13d12 2 683 5281 +13d14 5 688 5281 +13d19 4 692 5281 +13d1d 8 694 5281 +13d25 e 698 5281 +13d33 3 700 5281 +13d36 2 695 5281 +13d38 5 700 5281 +13d3d 6 705 5281 +13d43 6 709 5281 +13d49 6 711 5281 +13d4f 4 707 5281 +13d53 4 715 5281 +13d57 8 717 5281 +13d5f 6 720 5281 +13d65 3 722 5281 +13d68 2 718 5281 +13d6a 5 722 5281 +13d6f 4 726 5281 +13d73 e 727 5281 +13d81 7 728 5281 +13d88 12 733 5281 +13d9a 2 734 5281 +13d9c 6 737 5281 +13da2 3 739 5281 +13da5 2 740 5281 +13da7 1c 745 5281 +13dc3 4 749 5281 +13dc7 14 751 5281 +13ddb e 752 5281 +13de9 3 751 5281 +13dec 12 754 5281 +13dfe a 760 5281 +13e08 d 763 5281 +13e15 2 768 5281 +13e17 2 767 5281 +13e19 1 768 5281 +13e1a 4 765 5281 +13e1e 7 770 5281 +13e25 5 775 5281 +13e2a 6 776 5281 +13e30 8 777 5281 +13e38 3 778 5281 +13e3b 8 781 5281 +13e43 8 784 5281 +13e4b 3 788 5281 +13e4e e 791 5281 +13e5c 15 792 5281 +13e71 8 793 5281 +13e79 2 795 5281 +13e7b f 798 5281 +13e8a f 799 5281 +13e99 e 800 5281 +13ea7 1c 809 5281 +13ec3 6 813 5281 +13ec9 3 814 5281 +13ecc 6 815 5281 +13ed2 3 816 5281 +13ed5 6 817 5281 +13edb 8 820 5281 +13ee3 18 826 5281 +13efb b 827 5281 +13f06 10 829 5281 +13f16 2 831 5281 +13f18 6 833 5281 +13f1e d 835 5281 +13f2b 16 837 5281 +13f41 3 831 5281 +13f44 4 844 5281 +13f48 2 846 5281 +13f4a 9 848 5281 +13f53 a 853 5281 +13f5d 4 855 5281 +13f61 e 858 5281 +13f6f 13 862 5281 +13f82 7 863 5281 +13f89 5 866 5281 +13f8e 6 868 5281 +13f94 2 869 5281 +FUNC 13f96 72 4 _fclose_nolock +13f96 2 86 1752 +13f98 2a 90 1752 +13fc2 6 96 1752 +13fc8 6 105 1752 +13fce 8 106 1752 +13fd6 13 108 1752 +13fe9 5 109 1752 +13fee 7 111 1752 +13ff5 7 120 1752 +13ffc 3 121 1752 +13fff 3 126 1752 +14002 5 127 1752 +14007 1 128 1752 +FUNC 14008 7c 4 fclose +14008 c 44 1752 +14014 4 45 1752 +14018 2d 47 1752 +14045 6 50 1752 +1404b 3 51 1752 +1404e 3 64 1752 +14051 6 65 1752 +14057 7 55 1752 +1405e 3 56 1752 +14061 a 57 1752 +1406b 11 59 1752 +1407c 8 60 1752 +FUNC 14084 d 8 _ValidateRead(void const *,unsigned int) +14084 0 63 5683 +14084 3 64 5683 +14087 7 65 5683 +1408e 2 68 5683 +14090 1 71 5683 +FUNC 14091 d 8 _ValidateWrite(void *,unsigned int) +14091 0 74 5683 +14091 3 75 5683 +14094 7 76 5683 +1409b 2 79 5683 +1409d 1 82 5683 +FUNC 1409e d 4 _ValidateExecute(int (*)(void)) +1409e 0 85 5683 +1409e 3 86 5683 +140a1 7 87 5683 +140a8 2 90 5683 +140aa 1 93 5683 +FUNC 140ab f3 0 abort +140ab 1b 53 4119 +140c6 a 56 4119 +140d0 8 59 4119 +140d8 5 68 4119 +140dd 4 69 4119 +140e1 8 71 4119 +140e9 d 78 4119 +140f6 6 87 4119 +140fc 6 88 4119 +14102 6 89 4119 +14108 3 90 4119 +1410b 3 91 4119 +1410e 3 92 4119 +14111 7 93 4119 +14118 7 94 4119 +1411f 4 95 4119 +14123 4 96 4119 +14127 4 97 4119 +1412b 4 98 4119 +1412f 1 99 4119 +14130 6 100 4119 +14136 6 106 4119 +1413c 19 107 4119 +14155 3 109 4119 +14158 13 117 4119 +1416b 9 122 4119 +14174 3 123 4119 +14177 15 126 4119 +1418c a 128 4119 +14196 8 137 4119 +FUNC 1419e 1e 8 _set_abort_behavior +1419e 0 158 4119 +1419e 1d 160 4119 +141bb 1 162 4119 +FUNC 141bc 20 0 _global_unwind2 +FUNC 141dc 45 0 __unwind_handler +FUNC 14221 84 0 _local_unwind2 +FUNC 142a5 23 0 _abnormal_termination +FUNC 142c8 9 0 _NLG_Notify1 +FUNC 142d1 1f 0 _NLG_Notify +PUBLIC 142e8 0 _NLG_Dispatch2 +FUNC 142f0 3 0 _NLG_Call +PUBLIC 142f2 0 _NLG_Return2 +FUNC 142f3 a3 4 _msize +142f3 c 43 5383 +142ff 2d 47 5383 +1432c 9 51 5383 +14335 8 55 5383 +1433d 3 56 5383 +14340 e 57 5383 +1434e e 59 5383 +1435c c 61 5383 +14368 5 64 5383 +1436d 10 88 5383 +1437d 2 91 5383 +1437f 6 93 5383 +14385 8 61 5383 +1438d 9 62 5383 +FUNC 14396 6 0 HeapManager::Block::Block() +14396 6 90 5771 +FUNC 1439c 1b 8 HeapManager::Constructor(void * (*)(unsigned int),void (*)(void *)) +1439c 6 100 5771 +143a2 7 101 5771 +143a9 5 102 5771 +143ae 3 103 5771 +143b1 3 104 5771 +143b4 3 105 5771 +FUNC 143b7 26 0 HeapManager::Destructor() +143b7 9 110 5771 +143c0 2 111 5771 +143c2 5 113 5771 +143c7 15 115 5771 +143dc 1 118 5771 +FUNC 143dd 63 0 UnDecorator::getNumberOfDimensions() +143dd 0 1663 5771 +143dd c 1664 5771 +143e9 2 1665 5771 +143eb 1 1696 5771 +143ec a 1666 5771 +143f6 d 1667 5771 +14403 1 1696 5771 +14404 4 1670 5771 +14408 4 1677 5771 +1440c a 1679 5771 +14416 6 1680 5771 +1441c d 1684 5771 +14429 5 1675 5771 +1442e e 1690 5771 +1443c 3 1691 5771 +1443f 1 1696 5771 +FUNC 14440 474 0 UnDecorator::getTypeEncoding() +14440 f 2335 5771 +1444f 2 2336 5771 +14451 5 2341 5771 +14456 9 2345 5771 +1445f c 2351 5771 +1446b 9 2423 5771 +14474 2 2426 5771 +14476 2a 2427 5771 +144a0 8 2450 5771 +144a8 2 2451 5771 +144aa 24 2454 5771 +144ce 7 2462 5771 +144d5 5 2463 5771 +144da 6 2353 5771 +144e0 8 2358 5771 +144e8 b 2362 5771 +144f3 5 2363 5771 +144f8 2 2364 5771 +144fa 5 2365 5771 +144ff 9 2369 5771 +14508 1b 2373 5771 +14523 11 2377 5771 +14534 a 2393 5771 +1453e 10 2388 5771 +1454e 2 2389 5771 +14550 18 2384 5771 +14568 2 2385 5771 +1456a 12 2380 5771 +1457c 16 2399 5771 +14592 11 2418 5771 +145a3 a 2406 5771 +145ad 5 2407 5771 +145b2 15 2410 5771 +145c7 5 2422 5771 +145cc 1b 2427 5771 +145e7 a 2430 5771 +145f1 5 2431 5771 +145f6 7 2472 5771 +145fd a 2478 5771 +14607 c 2483 5771 +14613 5 2485 5771 +14618 5 2486 5771 +1461d 5 2487 5771 +14622 5 2490 5771 +14627 5 2505 5771 +1462c 5 2508 5771 +14631 5 2509 5771 +14636 5 2434 5771 +1463b 5 2435 5771 +14640 1a 2427 5771 +1465a 30 2568 5771 +1468a 5 2529 5771 +1468f 4 2530 5771 +14693 a 2531 5771 +1469d 2 2532 5771 +1469f a 2533 5771 +146a9 5 2537 5771 +146ae 5 2538 5771 +146b3 2 2539 5771 +146b5 5 2540 5771 +146ba e 2544 5771 +146c8 6 2560 5771 +146ce 10 2555 5771 +146de 2 2556 5771 +146e0 18 2551 5771 +146f8 2 2552 5771 +146fa 12 2547 5771 +1470c 2 2564 5771 +1470e a 2442 5771 +14718 2 2443 5771 +1471a a 2438 5771 +14724 2 2439 5771 +14726 5 2445 5771 +1472b c 2574 5771 +14737 14 2577 5771 +1474b a 2579 5771 +14755 18 2586 5771 +1476d 1a 2589 5771 +14787 1b 2590 5771 +147a2 5 2591 5771 +147a7 1a 2594 5771 +147c1 1b 2595 5771 +147dc 5 2596 5771 +147e1 1a 2599 5771 +147fb 10 2600 5771 +1480b 2 2601 5771 +1480d 7 2604 5771 +14814 2 2605 5771 +14816 a 2608 5771 +14820 2 2609 5771 +14822 a 2612 5771 +1482c 2 2613 5771 +1482e a 2616 5771 +14838 2 2617 5771 +1483a a 2620 5771 +14844 2 2621 5771 +14846 a 2624 5771 +14850 7 2634 5771 +14857 7 2635 5771 +1485e 7 2637 5771 +14865 10 2639 5771 +14875 3f 2648 5771 +FUNC 148b4 b 0 UnDecorator::doUnderScore() +148b4 b 4259 5771 +FUNC 148bf d 0 UnDecorator::doMSKeywords() +148bf d 4260 5771 +FUNC 148cc e 0 UnDecorator::doPtr64() +148cc e 4261 5771 +FUNC 148da e 0 UnDecorator::doFunctionReturns() +148da e 4262 5771 +FUNC 148e8 e 0 UnDecorator::doAllocationModel() +148e8 e 4263 5771 +FUNC 148f6 e 0 UnDecorator::doAllocationLanguage() +148f6 e 4264 5771 +FUNC 14904 12 0 UnDecorator::doThisTypes() +14904 12 4271 5771 +FUNC 14916 e 0 UnDecorator::doAccessSpecifiers() +14916 e 4272 5771 +FUNC 14924 e 0 UnDecorator::doThrowTypes() +14924 e 4273 5771 +FUNC 14932 e 0 UnDecorator::doMemberTypes() +14932 e 4274 5771 +FUNC 14940 b 0 UnDecorator::doNameOnly() +14940 b 4279 5771 +FUNC 1494b b 0 UnDecorator::doTypeOnly() +1494b b 4280 5771 +FUNC 14956 b 0 UnDecorator::haveTemplateParameters() +14956 b 4281 5771 +FUNC 14961 e 0 UnDecorator::doEcsu() +14961 e 4282 5771 +FUNC 1496f b 0 UnDecorator::doNoIdentCharCheck() +1496f b 4283 5771 +FUNC 1497a e 0 UnDecorator::doEllipsis() +1497a e 4284 5771 +FUNC 14988 19 4 UnDecorator::UScore(Tokens) +14988 0 4288 5771 +14988 9 4293 5771 +14991 d 4294 5771 +1499e 2 4296 5771 +149a0 1 4298 5771 +FUNC 149a1 84 8 HeapManager::getMemory(unsigned int,int) +149a1 2 134 5804 +149a3 a 137 5804 +149ad 9 139 5804 +149b6 6 140 5804 +149bc 4 146 5804 +149c0 3 147 5804 +149c3 8 149 5804 +149cb 7 153 5804 +149d2 2 154 5804 +149d4 1c 159 5804 +149f0 4 164 5804 +149f4 7 168 5804 +149fb 2 169 5804 +149fd 2 170 5804 +149ff 3 171 5804 +14a02 8 175 5804 +14a0a 2 182 5804 +14a0c 4 179 5804 +14a10 5 183 5804 +14a15 d 187 5804 +14a22 3 190 5804 +FUNC 14a25 d 0 DName::DName() +14a25 2 210 5804 +14a27 3 211 5804 +14a2a 7 220 5804 +14a31 1 221 5804 +FUNC 14a32 12 4 DName::DName(DNameNode *) +14a32 2 224 5804 +14a34 4 225 5804 +14a38 9 234 5804 +14a41 3 235 5804 +FUNC 14a44 9c 4 DName::DName(DName const &) +14a44 2 259 5804 +14a46 17 260 5804 +14a5d 10 261 5804 +14a6d d 262 5804 +14a7a d 263 5804 +14a87 10 264 5804 +14a97 4 265 5804 +14a9b e 266 5804 +14aa9 13 267 5804 +14abc 10 268 5804 +14acc 11 269 5804 +14add 3 270 5804 +FUNC 14ae0 a 0 DName::status() +14ae0 a 481 5804 +FUNC 14aea 5 0 DName::clearStatus() +14aea 5 482 5804 +FUNC 14aef 7 0 DName::setPtrRef() +14aef 7 484 5804 +FUNC 14af6 a 0 DName::isPtrRef() +14af6 a 485 5804 +FUNC 14b00 8 0 DName::setIsArray() +14b00 8 490 5804 +FUNC 14b08 a 0 DName::isArray() +14b08 a 491 5804 +FUNC 14b12 a 0 DName::isNoTE() +14b12 a 492 5804 +FUNC 14b1c 8 0 DName::setIsNoTE() +14b1c 8 493 5804 +FUNC 14b24 a 0 DName::isPinPtr() +14b24 a 494 5804 +FUNC 14b2e 8 0 DName::setIsPinPtr() +14b2e 8 495 5804 +FUNC 14b36 a 0 DName::isComArray() +14b36 a 496 5804 +FUNC 14b40 8 0 DName::setIsComArray() +14b40 8 497 5804 +FUNC 14b48 a 0 DName::isVCallThunk() +14b48 a 498 5804 +FUNC 14b52 8 0 DName::setIsVCallThunk() +14b52 8 499 5804 +FUNC 14b5a 7b 4 DName::operator=(DName const &) +14b5a 3 879 5804 +14b5d 12 880 5804 +14b6f 17 882 5804 +14b86 d 883 5804 +14b93 d 884 5804 +14ba0 d 885 5804 +14bad 10 886 5804 +14bbd 10 887 5804 +14bcd 5 889 5804 +14bd2 3 897 5804 +FUNC 14bd5 9 0 Replicator::isFull() +14bd5 9 1001 5804 +FUNC 14bde 25 4 Replicator::operator[](int) +14bde 0 1028 5804 +14bde 9 1029 5804 +14be7 b 1031 5804 +14bf2 6 1034 5804 +14bf8 5 1032 5804 +14bfd 3 1030 5804 +14c00 3 1036 5804 +FUNC 14c03 d 0 DNameNode::DNameNode() +14c03 d 1048 5804 +FUNC 14c10 4 0 DNameNode::nextNode() +14c10 4 1052 5804 +FUNC 14c14 29 4 DNameNode::operator+=(DNameNode *) +14c14 2 1131 5804 +14c16 8 1132 5804 +14c1e 8 1134 5804 +14c26 b 1139 5804 +14c31 4 1144 5804 +14c35 2 1147 5804 +14c37 3 1148 5804 +14c3a 3 1156 5804 +FUNC 14c3d 16 4 charNode::charNode(char) +14c3d 16 1166 5804 +FUNC 14c53 4 0 charNode::length() +14c53 4 1168 5804 +FUNC 14c57 4 0 charNode::getLastChar() +14c57 4 1170 5804 +FUNC 14c5b 1b 8 charNode::getString(char *,int) +14c5b 0 1173 5804 +14c5b f 1174 5804 +14c6a 5 1175 5804 +14c6f 2 1176 5804 +14c71 2 1177 5804 +14c73 3 1183 5804 +FUNC 14c76 4 0 pcharNode::length() +14c76 4 1189 5804 +FUNC 14c7a 2f 4 pDNameNode::pDNameNode(DName *) +14c7a 2f 1244 5804 +FUNC 14ca9 25 4 DNameStatusNode::DNameStatusNode(DNameStatus) +14ca9 25 1261 5804 +FUNC 14cce 4 0 DNameStatusNode::length() +14cce 4 1263 5804 +FUNC 14cd2 d 0 DNameStatusNode::getLastChar() +14cd2 d 1266 5804 +FUNC 14cdf e 0 und_strlen +14cdf 0 1283 5804 +14cdf 6 1286 5804 +14ce5 7 1287 5804 +14cec 1 1291 5804 +FUNC 14ced 20 8 und_strncpy +14ced 0 1295 5804 +14ced 1b 1296 5804 +14d08 4 1299 5804 +14d0c 1 1301 5804 +FUNC 14d0d 25 4 und_strncmp +14d0d 0 1304 5804 +14d0d 7 1305 5804 +14d14 2 1306 5804 +14d16 1 1315 5804 +14d17 a 1308 5804 +14d21 1 1310 5804 +14d22 1 1311 5804 +14d23 6 1308 5804 +14d29 8 1314 5804 +14d31 1 1315 5804 +FUNC 14d32 33 0 UnDecorator::getDataIndirectType() +14d32 33 4033 5771 +FUNC 14d65 34 0 UnDecorator::getThisType() +14d65 34 4034 5771 +FUNC 14d99 13 c operator new(unsigned int,HeapManager &,int) +14d99 13 131 5804 +FUNC 14dac 56 4 DName::DName(DName *) +14dac 0 274 5804 +14dac a 275 5804 +14db6 23 277 5804 +14dd9 13 278 5804 +14dec 2 281 5804 +14dee 4 283 5804 +14df2 3 284 5804 +14df5 7 295 5804 +14dfc 6 296 5804 +FUNC 14e02 61 4 DName::DName(DNameStatus) +14e02 2 457 5804 +14e04 21 458 5804 +14e25 1e 459 5804 +14e43 7 467 5804 +14e4a 9 469 5804 +14e53 a 470 5804 +14e5d 6 472 5804 +FUNC 14e63 17 0 DName::isValid() +14e63 17 478 5804 +FUNC 14e7a 15 0 DName::isEmpty() +14e7a 15 479 5804 +FUNC 14e8f 14 0 DName::isUDC() +14e8f 14 486 5804 +FUNC 14ea3 e 0 DName::setIsUDC() +14ea3 e 487 5804 +FUNC 14eb1 14 0 DName::isUDTThunk() +14eb1 14 488 5804 +FUNC 14ec5 25 0 DName::length() +14ec5 1 502 5804 +14ec6 2 503 5804 +14ec8 a 506 5804 +14ed2 4 507 5804 +14ed6 b 508 5804 +14ee1 5 507 5804 +14ee6 3 510 5804 +14ee9 1 512 5804 +FUNC 14eea 38 0 DName::getLastChar() +14eea 2 516 5804 +14eec 2 517 5804 +14eee 9 519 5804 +14ef7 6 520 5804 +14efd a 521 5804 +14f07 2 522 5804 +14f09 7 520 5804 +14f10 11 524 5804 +14f21 1 526 5804 +FUNC 14f22 91 8 DName::getString(char *,int) +14f22 7 530 5804 +14f29 9 531 5804 +14f32 5 535 5804 +14f37 7 537 5804 +14f3e e 538 5804 +14f4c c 544 5804 +14f58 d 550 5804 +14f65 4 553 5804 +14f69 8 555 5804 +14f71 4 561 5804 +14f75 6 565 5804 +14f7b 2 566 5804 +14f7d b 570 5804 +14f88 4 574 5804 +14f8c 2 578 5804 +14f8e 3 579 5804 +14f91 3 586 5804 +14f94 4 553 5804 +14f98 4 590 5804 +14f9c 2 593 5804 +14f9e 6 594 5804 +14fa4 6 595 5804 +14faa 5 599 5804 +14faf 4 601 5804 +FUNC 14fb3 35 4 DName::operator|=(DName const &) +14fb3 3 832 5804 +14fb6 19 835 5804 +14fcf 13 836 5804 +14fe2 3 840 5804 +14fe5 3 842 5804 +FUNC 14fe8 81 4 DName::operator=(DNameStatus) +14fe8 2 928 5804 +14fea 10 929 5804 +14ffa 12 937 5804 +1500c 26 945 5804 +15032 6 947 5804 +15038 e 948 5804 +15046 10 933 5804 +15056 d 934 5804 +15063 3 954 5804 +15066 3 956 5804 +FUNC 15069 1e 0 Replicator::Replicator() +15069 1e 1004 5804 +FUNC 15087 47 4 Replicator::operator+=(DName const &) +15087 3 1009 5804 +1508a 12 1010 5804 +1509c 20 1012 5804 +150bc 4 1017 5804 +150c0 8 1018 5804 +150c8 3 1022 5804 +150cb 3 1024 5804 +FUNC 150ce 47 0 DNameNode::clone() +150ce 3 1055 5804 +150d1 43 1056 5804 +15114 1 1057 5804 +FUNC 15115 65 8 pcharNode::pcharNode(char const *,int) +15115 1 1197 5804 +15116 1f 1200 5804 +15135 c 1201 5804 +15141 8 1205 5804 +15149 c 1207 5804 +15155 a 1210 5804 +1515f b 1211 5804 +1516a 2 1214 5804 +1516c 3 1216 5804 +1516f 4 1217 5804 +15173 7 1220 5804 +FUNC 1517a 12 0 pcharNode::getLastChar() +1517a 12 1191 5804 +FUNC 1518c 31 8 pcharNode::getString(char *,int) +1518c 0 1224 5804 +1518c b 1227 5804 +15197 2 1228 5804 +15199 21 1232 5804 +151ba 3 1234 5804 +FUNC 151bd f 0 pDNameNode::length() +151bd f 1246 5804 +FUNC 151cc f 0 pDNameNode::getLastChar() +151cc f 1248 5804 +FUNC 151db 1d 8 pDNameNode::getString(char *,int) +151db 1d 1251 5804 +FUNC 151f8 33 8 DNameStatusNode::getString(char *,int) +151f8 0 1269 5804 +151f8 b 1272 5804 +15203 2 1273 5804 +15205 23 1277 5804 +15228 3 1279 5804 +FUNC 1522b 73 14 UnDecorator::UnDecorator(char *,char const *,int,char * (*)(long),unsigned long) +1522b 16 736 5771 +15241 8 737 5771 +15249 5 738 5771 +1524e 9 740 5771 +15257 a 741 5771 +15261 5 745 5771 +15266 2 747 5771 +15268 6 748 5771 +1526e 6 749 5771 +15274 8 754 5771 +1527c 15 755 5771 +15291 d 758 5771 +FUNC 1529e 2f 4 UnDecorator::getReturnType(DName *) +1529e 3 2906 5771 +152a1 8 2907 5771 +152a9 15 2911 5771 +152be d 2915 5771 +152cb 2 2917 5771 +FUNC 152cd f 0 UnDecorator::getStorageConvention() +152cd f 4032 5771 +FUNC 152dc 79 4 DName::operator+=(DNameStatus) +152dc 4 799 5804 +152e0 17 800 5804 +152f7 20 804 5804 +15317 4 807 5804 +1531b 7 809 5804 +15322 6 811 5804 +15328 8 812 5804 +15330 2 815 5804 +15332 3 816 5804 +15335 5 818 5804 +1533a e 819 5804 +15348 7 801 5804 +1534f 3 825 5804 +15352 3 827 5804 +FUNC 15355 68 4 DName::operator=(DName *) +15355 3 901 5804 +15358 12 902 5804 +1536a 7 903 5804 +15371 29 911 5804 +1539a 6 913 5804 +153a0 c 914 5804 +153ac 2 917 5804 +153ae 9 918 5804 +153b7 3 922 5804 +153ba 3 924 5804 +FUNC 153bd a6 8 DName::doPchar(char const *,int) +153bd 3 962 5804 +153c0 1e 963 5804 +153de 6 964 5804 +153e4 c 965 5804 +153f0 10 966 5804 +15400 5 970 5804 +15405 23 984 5804 +15428 6 986 5804 +1542e 9 987 5804 +15437 2 988 5804 +15439 1b 977 5804 +15454 c 993 5804 +15460 3 995 5804 +FUNC 15463 26 4 DName::DName(char) +15463 3 238 5804 +15466 3 244 5804 +15469 7 248 5804 +15470 7 252 5804 +15477 c 253 5804 +15483 6 255 5804 +FUNC 15489 31 4 DName::DName(char const *) +15489 0 300 5804 +15489 16 312 5804 +1549f 15 313 5804 +154b4 6 315 5804 +FUNC 154ba d0 8 DName::DName(char const * &,char) +154ba 7 319 5804 +154c1 d 329 5804 +154ce f 333 5804 +154dd 8 334 5804 +154e5 9 342 5804 +154ee 40 343 5804 +1552e b 344 5804 +15539 9 355 5804 +15542 8 359 5804 +1554a 8 361 5804 +15552 9 363 5804 +1555b 3 364 5804 +1555e 2 367 5804 +15560 3 347 5804 +15563 a 378 5804 +1556d 8 380 5804 +15575 6 368 5804 +1557b 7 371 5804 +15582 6 372 5804 +15588 2 375 5804 +FUNC 1558a 69 8 DName::DName(unsigned __int64) +1558a 15 384 5804 +1559f 3 390 5804 +155a2 a 398 5804 +155ac 4 402 5804 +155b0 13 406 5804 +155c3 3 407 5804 +155c6 c 409 5804 +155d2 e 411 5804 +155e0 13 413 5804 +FUNC 155f3 96 8 DName::DName(__int64) +155f3 10 416 5804 +15603 26 436 5804 +15629 15 438 5804 +1563e 10 443 5804 +1564e 5 444 5804 +15653 c 446 5804 +1565f 6 448 5804 +15665 4 449 5804 +15669 e 452 5804 +15677 12 453 5804 +FUNC 15689 2e 4 DName::operator+(DNameStatus) +15689 1 675 5804 +1568a c 676 5804 +15696 9 679 5804 +1569f b 680 5804 +156aa 2 681 5804 +156ac 5 682 5804 +156b1 3 686 5804 +156b4 3 688 5804 +FUNC 156b7 62 4 DName::operator+=(DName const &) +156b7 2 739 5804 +156b9 f 740 5804 +156c8 13 741 5804 +156db 2 742 5804 +156dd 9 743 5804 +156e6 6 744 5804 +156ec 2 745 5804 +156ee 7 747 5804 +156f5 6 749 5804 +156fb 9 750 5804 +15704 2 751 5804 +15706 d 752 5804 +15713 3 758 5804 +15716 3 760 5804 +FUNC 15719 8b 4 DName::operator+=(DName *) +15719 2 764 5804 +1571b a 765 5804 +15725 9 766 5804 +1572e 8 767 5804 +15736 10 768 5804 +15746 8 789 5804 +1574e 20 770 5804 +1576e 4 773 5804 +15772 7 775 5804 +15779 6 777 5804 +1577f 8 778 5804 +15787 2 781 5804 +15789 3 782 5804 +1578c 5 784 5804 +15791 d 785 5804 +1579e 3 793 5804 +157a1 3 795 5804 +FUNC 157a4 1c 4 DName::operator=(char) +157a4 1 847 5804 +157a5 15 854 5804 +157ba 3 856 5804 +157bd 3 858 5804 +FUNC 157c0 2a 4 DName::operator=(char const *) +157c0 0 862 5804 +157c0 24 869 5804 +157e4 3 873 5804 +157e7 3 875 5804 +FUNC 157ea a6 0 UnDecorator::getCallingConvention() +157ea 5 2825 5771 +157ef f 2826 5771 +157fe c 2828 5771 +1580a 5 2835 5771 +1580f 1a 2845 5771 +15829 20 2852 5771 +15849 2 2875 5771 +1584b 2 2876 5771 +1584d 2 2871 5771 +1584f 2 2872 5771 +15851 2 2867 5771 +15853 2 2868 5771 +15855 2 2863 5771 +15857 2 2864 5771 +15859 1 2859 5771 +1585a 2 2860 5771 +1585c 13 2855 5771 +1586f e 2891 5771 +1587d 4 2895 5771 +15881 d 2899 5771 +1588e 2 2901 5771 +FUNC 15890 37 0 UnDecorator::getVCallThunkType() +15890 3 4057 5771 +15893 9 4059 5771 +1589c 5 4066 5771 +158a1 4 4059 5771 +158a5 4 4066 5771 +158a9 6 4061 5771 +158af c 4062 5771 +158bb a 4064 5771 +158c5 2 4170 5771 +FUNC 158c7 51 4 DName::operator+(DName const &) +158c7 1 639 5804 +158c8 c 640 5804 +158d4 b 643 5804 +158df b 644 5804 +158ea d 645 5804 +158f7 11 646 5804 +15908 2 647 5804 +1590a 8 648 5804 +15912 3 652 5804 +15915 3 654 5804 +FUNC 15918 2e 4 DName::operator+(DName *) +15918 1 658 5804 +15919 c 659 5804 +15925 9 662 5804 +1592e b 663 5804 +15939 2 664 5804 +1593b 5 665 5804 +15940 3 669 5804 +15943 3 671 5804 +FUNC 15946 6a 4 DName::operator+=(char) +15946 1 693 5804 +15947 b 694 5804 +15952 9 695 5804 +1595b 6 696 5804 +15961 2 697 5804 +15963 7 699 5804 +1596a 6 701 5804 +15970 2b 702 5804 +1599b 2 703 5804 +1599d c 704 5804 +159a9 4 710 5804 +159ad 3 712 5804 +FUNC 159b0 6c 4 DName::operator+=(char const *) +159b0 2 716 5804 +159b2 f 717 5804 +159c1 9 718 5804 +159ca 6 719 5804 +159d0 2 720 5804 +159d2 7 722 5804 +159d9 6 724 5804 +159df 28 725 5804 +15a07 2 726 5804 +15a09 d 727 5804 +15a16 3 733 5804 +15a19 3 735 5804 +FUNC 15a1c e0 0 UnDecorator::getArgumentList() +15a1c 7 3076 5771 +15a23 12 3078 5771 +15a35 29 3081 5771 +15a5e 6 3085 5771 +15a64 4 3086 5771 +15a68 2 3087 5771 +15a6a e 3088 5771 +15a78 6 3093 5771 +15a7e 6 3095 5771 +15a84 5 3100 5771 +15a89 1 3102 5771 +15a8a 11 3106 5771 +15a9b 2 3109 5771 +15a9d 16 3116 5771 +15ab3 19 3121 5771 +15acc 9 3122 5771 +15ad5 17 3126 5771 +15aec b 3132 5771 +15af7 3 3141 5771 +15afa 2 3143 5771 +FUNC 15afc 4f 4 UnDecorator::getVdispMapType(DName const &) +15afc 6 4230 5771 +15b02 d 4231 5771 +15b0f c 4232 5771 +15b1b 12 4233 5771 +15b2d 9 4234 5771 +15b36 a 4236 5771 +15b40 6 4237 5771 +15b46 3 4238 5771 +15b49 2 4239 5771 +FUNC 15b4b 22 8 operator+(char,DName const &) +15b4b 22 198 5804 +FUNC 15b6d 22 8 operator+(DNameStatus,DName const &) +15b6d 22 201 5804 +FUNC 15b8f 22 8 operator+(char const *,DName const &) +15b8f 22 204 5804 +FUNC 15bb1 2e 4 DName::operator+(char) +15bb1 1 605 5804 +15bb2 c 606 5804 +15bbe 9 609 5804 +15bc7 b 610 5804 +15bd2 2 611 5804 +15bd4 5 612 5804 +15bd9 3 616 5804 +15bdc 3 618 5804 +FUNC 15bdf 2e 4 DName::operator+(char const *) +15bdf 1 622 5804 +15be0 c 623 5804 +15bec 9 626 5804 +15bf5 b 627 5804 +15c00 2 628 5804 +15c02 5 629 5804 +15c07 3 633 5804 +15c0a 3 635 5804 +FUNC 15c0d 141 4 UnDecorator::getDimension(bool) +15c0d 7 1616 5771 +15c14 10 1618 5771 +15c24 e 1620 5771 +15c32 6 1623 5771 +15c38 f 1624 5771 +15c47 8 1625 5771 +15c4f 47 1626 5771 +15c96 4 1629 5771 +15c9a 4 1636 5771 +15c9e 8 1638 5771 +15ca6 20 1639 5771 +15cc6 d 1643 5771 +15cd3 4 1634 5771 +15cd7 b 1649 5771 +15ce2 2 1650 5771 +15ce4 5 1652 5771 +15ce9 13 1653 5771 +15cfc c 1637 5771 +15d08 4 1641 5771 +15d0c a 1653 5771 +15d16 36 1655 5771 +15d4c 2 1659 5771 +FUNC 15d4e d4 0 UnDecorator::getEnumType() +15d4e 6 2762 5771 +15d54 1a 2766 5771 +15d6e 12 2770 5771 +15d80 5 2774 5771 +15d85 2 2775 5771 +15d87 5 2779 5771 +15d8c 2 2780 5771 +15d8e 5 2786 5771 +15d93 2 2787 5771 +15d95 d 2791 5771 +15da2 1f 2801 5771 +15dc1 1e 2807 5771 +15ddf e 2814 5771 +15ded 4 2795 5771 +15df1 d 2818 5771 +15dfe 24 2820 5771 +FUNC 15e22 c4 0 UnDecorator::getArgumentTypes() +15e22 3 3035 5771 +15e25 18 3036 5771 +15e3d 9 3046 5771 +15e46 7 3051 5771 +15e4d 13 3052 5771 +15e60 c 3064 5771 +15e6c 36 3058 5771 +15ea2 b 3061 5771 +15ead 21 3039 5771 +15ece 16 3042 5771 +15ee4 2 3072 5771 +FUNC 15ee6 7e 0 UnDecorator::getThrowTypes() +15ee6 3 3148 5771 +15ee9 e 3149 5771 +15ef7 2 3150 5771 +15ef9 21 3151 5771 +15f1a 1f 3153 5771 +15f39 29 3155 5771 +15f62 2 3157 5771 +FUNC 15f64 125 c UnDecorator::getExtendedDataIndirectType(char &,bool &,int) +15f64 6 3636 5771 +15f6a 1a 3641 5771 +15f84 1c 3643 5771 +15fa0 a 3669 5771 +15faa 6 3670 5771 +15fb0 b 3672 5771 +15fbb a 3674 5771 +15fc5 21 3675 5771 +15fe6 17 3678 5771 +15ffd a 3680 5771 +16007 6 3689 5771 +1600d 2 3691 5771 +1600f 17 3693 5771 +16026 1e 3700 5771 +16044 6 3663 5771 +1604a 2 3665 5771 +1604c 3 3656 5771 +1604f d 3657 5771 +1605c 2 3659 5771 +1605e 6 3647 5771 +16064 13 3649 5771 +16077 10 3703 5771 +16087 2 3704 5771 +FUNC 16089 15f 4 UnDecorator::getArrayType(DName const &) +16089 3 3986 5771 +1608c 12 3987 5771 +1609e 7 3989 5771 +160a5 4 3991 5771 +160a9 2 3992 5771 +160ab 4 3994 5771 +160af 9 3995 5771 +160b8 2a 4026 5771 +160e2 2 4028 5771 +160e4 c 3998 5771 +160f0 9 4000 5771 +160f9 d 4001 5771 +16106 35 4005 5771 +1613b b 4009 5771 +16146 4 4010 5771 +1614a 8 4011 5771 +16152 2 4012 5771 +16154 2c 4013 5771 +16180 d 4017 5771 +1618d 9 4018 5771 +16196 12 4019 5771 +161a8 a 4023 5771 +161b2 36 4024 5771 +FUNC 161e8 31 0 UnDecorator::getLexicalFrame() +161e8 31 4031 5771 +FUNC 16219 12 0 UnDecorator::getDisplacement() +16219 12 4048 5771 +FUNC 1622b 12 0 UnDecorator::getCallIndex() +1622b 12 4049 5771 +FUNC 1623d 12 0 UnDecorator::getGuardNumber() +1623d 12 4050 5771 +FUNC 1624f 150 4 UnDecorator::getVfTableType(DName const &) +1624f 7 4174 5771 +16256 d 4175 5771 +16263 1d 4178 5771 +16280 2c 4180 5771 +162ac f 4182 5771 +162bb e 4184 5771 +162c9 5 4186 5771 +162ce 11 4188 5771 +162df 2d 4190 5771 +1630c b 4194 5771 +16317 7 4195 5771 +1631e 10 4199 5771 +1632e a 4200 5771 +16338 b 4188 5771 +16343 b 4204 5771 +1634e a 4206 5771 +16358 7 4207 5771 +1635f 9 4209 5771 +16368 a 4216 5771 +16372 6 4217 5771 +16378 2 4220 5771 +1637a 9 4221 5771 +16383 17 4222 5771 +1639a 3 4224 5771 +1639d 2 4226 5771 +FUNC 1639f a0 8 UnDecorator::getStringEncoding(char *,int) +1639f 6 1447 5771 +163a5 b 1448 5771 +163b0 22 1451 5771 +163d2 6 1456 5771 +163d8 b 1459 5771 +163e3 b 1462 5771 +163ee 13 1464 5771 +16401 c 1466 5771 +1640d 5 1469 5771 +16412 6 1470 5771 +16418 4 1471 5771 +1641c 14 1477 5771 +16430 d 1452 5771 +1643d 2 1478 5771 +FUNC 1643f 50 0 UnDecorator::getSignedDimension() +1643f 5 1603 5771 +16444 b 1604 5771 +1644f c 1605 5771 +1645b 2 1606 5771 +1645d 23 1608 5771 +16480 d 1611 5771 +1648d 2 1612 5771 +FUNC 1648f 2bb 0 UnDecorator::getTemplateConstant() +1648f 15 1877 5771 +164a4 f 1884 5771 +164b3 32 1885 5771 +164e5 9 1921 5771 +164ee b 1922 5771 +164f9 20 1924 5771 +16519 12 1931 5771 +1652b e 1932 5771 +16539 3 1937 5771 +1653c 7 1939 5771 +16543 6 1941 5771 +16549 4 1942 5771 +1654d 2 1944 5771 +1654f 4 1945 5771 +16553 2a 1950 5771 +1657d a 1900 5771 +16587 6 1902 5771 +1658d 11 1903 5771 +1659e 1b 1906 5771 +165b9 b 1892 5771 +165c4 6 2034 5771 +165ca 7 1954 5771 +165d1 26 1885 5771 +165f7 b 1990 5771 +16602 c 1991 5771 +1660e 10 1992 5771 +1661e 9 1966 5771 +16627 c 1968 5771 +16633 e 1971 5771 +16641 10 1973 5771 +16651 6 1975 5771 +16657 6 1976 5771 +1665d 3 1980 5771 +16660 29 1981 5771 +16689 a 1983 5771 +16693 a 2001 5771 +1669d a 2003 5771 +166a7 13 2007 5771 +166ba a 2008 5771 +166c4 11 2012 5771 +166d5 13 2015 5771 +166e8 a 2016 5771 +166f2 13 2021 5771 +16705 a 2022 5771 +1670f 13 2026 5771 +16722 d 2029 5771 +1672f 7 1913 5771 +16736 14 2041 5771 +FUNC 1674a d9 8 UnDecorator::getPtrRefDataType(DName const &,int) +1674a 3 3937 5771 +1674d 11 3940 5771 +1675e b 3944 5771 +16769 12 3948 5771 +1677b 12 3949 5771 +1678d 10 3951 5771 +1679d 5 3957 5771 +167a2 16 3961 5771 +167b8 d 3967 5771 +167c5 c 3968 5771 +167d1 b 3970 5771 +167dc 6 3972 5771 +167e2 1e 3974 5771 +16800 e 3976 5771 +1680e 13 3980 5771 +16821 2 3982 5771 +FUNC 16823 14 4 UnDecorator::getVbTableType(DName const &) +16823 14 4053 5771 +FUNC 16837 1b8 0 UnDecorator::getTemplateArgumentList() +16837 14 1775 5771 +1684b c 1777 5771 +16857 7 1778 5771 +1685e 2a 1781 5771 +16888 6 1785 5771 +1688e 4 1786 5771 +16892 2 1787 5771 +16894 e 1788 5771 +168a2 8 1793 5771 +168aa 5 1798 5771 +168af 1 1800 5771 +168b0 11 1804 5771 +168c1 5 1807 5771 +168c6 7 1810 5771 +168cd 7 1816 5771 +168d4 6 1817 5771 +168da 12 1818 5771 +168ec a 1820 5771 +168f6 5 1821 5771 +168fb e 1822 5771 +16909 5 1824 5771 +1690e 9 1830 5771 +16917 c 1832 5771 +16923 e 1835 5771 +16931 10 1837 5771 +16941 6 1839 5771 +16947 1 1840 5771 +16948 2 1842 5771 +1694a 25 1843 5771 +1696f 2 1846 5771 +16971 10 1847 5771 +16981 2 1850 5771 +16983 1f 1851 5771 +169a2 17 1857 5771 +169b9 9 1858 5771 +169c2 16 1862 5771 +169d8 17 1873 5771 +FUNC 169ef 56f 8 UnDecorator::getOperatorName(bool,bool *) +169ef b 1095 5771 +169fa 53 1103 5771 +16a4d 13 1183 5771 +16a60 c 1439 5771 +16a6c 1d 1440 5771 +16a89 11 1442 5771 +16a9a 5 1444 5771 +16a9f 3 1124 5771 +16aa2 8 1126 5771 +16aaa 21 1127 5771 +16acb c 1129 5771 +16ad7 a 1130 5771 +16ae1 a 1133 5771 +16aeb 7 1135 5771 +16af2 3 1136 5771 +16af5 9 1144 5771 +16afe 5 1145 5771 +16b03 6 1148 5771 +16b09 2 1154 5771 +16b0b 15 1156 5771 +16b20 18 1160 5771 +16b38 1a 1161 5771 +16b52 10 1166 5771 +16b62 b 1167 5771 +16b6d 5 1170 5771 +16b72 6 1106 5771 +16b78 f 1108 5771 +16b87 21 1103 5771 +16ba8 3d 1220 5771 +16be5 18 1240 5771 +16bfd b 1234 5771 +16c08 5 1235 5771 +16c0d 13 1245 5771 +16c20 7 1247 5771 +16c27 8 1249 5771 +16c2f 18 1220 5771 +16c47 13 1255 5771 +16c5a 7 1256 5771 +16c61 2 1257 5771 +16c63 16 1335 5771 +16c79 7 1356 5771 +16c80 6 1350 5771 +16c86 2 1352 5771 +16c88 25 1220 5771 +16cad 13 1290 5771 +16cc0 17 1291 5771 +16cd7 24 1292 5771 +16cfb 14 1313 5771 +16d0f 6 1316 5771 +16d15 5 1317 5771 +16d1a 10 1302 5771 +16d2a 20 1303 5771 +16d4a 20 1304 5771 +16d6a 20 1305 5771 +16d8a 22 1306 5771 +16dac 12 1307 5771 +16dbe c 1296 5771 +16dca 2b 1297 5771 +16df5 13 1281 5771 +16e08 17 1282 5771 +16e1f 1a 1283 5771 +16e39 5 1284 5771 +16e3e 2d 1220 5771 +16e6b 25 1364 5771 +16e90 10 1373 5771 +16ea0 13 1378 5771 +16eb3 a 1397 5771 +16ebd 13 1399 5771 +16ed0 a 1403 5771 +16eda 6 1405 5771 +16ee0 2 1408 5771 +16ee2 13 1410 5771 +16ef5 d 1413 5771 +16f02 5 1415 5771 +16f07 10 1278 5771 +16f17 b 1330 5771 +16f22 5 1428 5771 +16f27 3 1187 5771 +16f2a 13 1216 5771 +16f3d 8 1437 5771 +16f45 19 1438 5771 +FUNC 16f5e 153 4 UnDecorator::getTemplateName(bool) +16f5e 5 1700 5771 +16f63 1f 1704 5771 +16f82 16 1714 5771 +16f98 1d 1716 5771 +16fb5 23 1725 5771 +16fd8 e 1729 5771 +16fe6 6 1730 5771 +16fec 12 1732 5771 +16ffe 2 1734 5771 +17000 16 1735 5771 +17016 c 1738 5771 +17022 7 1739 5771 +17029 6 1746 5771 +1702f 21 1747 5771 +17050 c 1749 5771 +1705c a 1750 5771 +17066 a 1753 5771 +17070 6 1755 5771 +17076 6 1756 5771 +1707c 23 1769 5771 +1709f d 1705 5771 +170ac 5 1771 5771 +FUNC 170b1 1ea 4 UnDecorator::getZName(bool) +170b1 10 1007 5771 +170c1 11 1008 5771 +170d2 3 1013 5771 +170d5 26 1043 5771 +170fb b 1024 5771 +17106 5 1026 5771 +1710b 16 1028 5771 +17121 16 1030 5771 +17137 17 1031 5771 +1714e 7 1033 5771 +17155 25 1040 5771 +1717a 5 1042 5771 +1717f 29 1043 5771 +171a8 8 1045 5771 +171b0 b 1051 5771 +171bb c 1053 5771 +171c7 e 1056 5771 +171d5 10 1058 5771 +171e5 4 1060 5771 +171e9 b 1061 5771 +171f4 2 1063 5771 +171f6 a 1064 5771 +17200 10 1065 5771 +17210 2 1068 5771 +17212 d 1069 5771 +1721f 2a 1070 5771 +17249 2 1073 5771 +1724b 1a 1076 5771 +17265 11 1083 5771 +17276 9 1084 5771 +1727f f 1087 5771 +1728e d 1090 5771 +FUNC 1729b e4 0 UnDecorator::getScopedName() +1729b 7 2727 5771 +172a2 e 2728 5771 +172b0 15 2733 5771 +172c5 1a 2737 5771 +172df 2a 2738 5771 +17309 b 2742 5771 +17314 8 2743 5771 +1731c 4 2744 5771 +17320 1b 2745 5771 +1733b b 2746 5771 +17346 7 2747 5771 +1734d 2 2748 5771 +1734f 2b 2749 5771 +1737a 3 2753 5771 +1737d 2 2755 5771 +FUNC 1737f f 0 UnDecorator::getECSUName() +1737f f 2758 5771 +FUNC 1738e 100 0 UnDecorator::getECSUDataType() +1738e 3 3392 5771 +17391 20 3395 5771 +173b1 37 3399 5771 +173e8 5 3424 5771 +173ed 2 3425 5771 +173ef 5 3420 5771 +173f4 2 3421 5771 +173f6 26 3431 5771 +1741c 2 3432 5771 +1741e 5 3415 5771 +17423 2 3416 5771 +17425 5 3411 5771 +1742a 2 3412 5771 +1742c d 3407 5771 +17439 7 3439 5771 +17440 4 3441 5771 +17444 c 3442 5771 +17450 16 3446 5771 +17466 e 3450 5771 +17474 18 3404 5771 +1748c 2 3452 5771 +FUNC 1748e 46 0 UnDecorator::getSymbolName() +1748e 3 989 5771 +17491 a 990 5771 +1749b 6 991 5771 +174a1 c 992 5771 +174ad 16 997 5771 +174c3 f 1001 5771 +174d2 2 1003 5771 +FUNC 174d4 92 0 UnDecorator::getBasedType() +174d4 6 2653 5771 +174da 13 2654 5771 +174ed a 2659 5771 +174f7 17 2661 5771 +1750e c 2707 5771 +1751a 13 2699 5771 +1752d 2 2700 5771 +1752f d 2674 5771 +1753c 2 2711 5771 +1753e a 2712 5771 +17548 d 2716 5771 +17555 f 2720 5771 +17564 2 2722 5771 +FUNC 17566 b42 4 UnDecorator::composeDeclaration(DName const &) +17566 6 2045 5771 +1756c e 2046 5771 +1757a 5 2047 5771 +1757f a 2048 5771 +17589 b 2053 5771 +17594 f 2054 5771 +175a3 8 2055 5771 +175ab 15 2056 5771 +175c0 8 2057 5771 +175c8 10 2058 5771 +175d8 83 2075 5771 +1765b 7 2081 5771 +17662 19 2082 5771 +1767b 21 2083 5771 +1769c 2 2084 5771 +1769e 15 2085 5771 +176b3 27 2090 5771 +176da 33 2092 5771 +1770d 9 2094 5771 +17716 9 2096 5771 +1771f 2b 2098 5771 +1774a d 2101 5771 +17757 9 2103 5771 +17760 2d 2105 5771 +1778d 2e 2107 5771 +177bb 5 2111 5771 +177c0 3 2114 5771 +177c3 3 2115 5771 +177c6 3 2116 5771 +177c9 3 2117 5771 +177cc 3 2118 5771 +177cf 26 2121 5771 +177f5 12 2123 5771 +17807 19 2125 5771 +17820 19 2126 5771 +17839 2 2127 5771 +1783b 12 2129 5771 +1784d 19 2131 5771 +17866 1b 2134 5771 +17881 13 2141 5771 +17894 a 2142 5771 +1789e 15 2143 5771 +178b3 2 2144 5771 +178b5 f 2145 5771 +178c4 10 2147 5771 +178d4 9 2151 5771 +178dd 22 2152 5771 +178ff 2 2153 5771 +17901 13 2168 5771 +17914 c 2172 5771 +17920 14 2173 5771 +17934 1a 2174 5771 +1794e 2 2175 5771 +17950 b 2176 5771 +1795b 5 2182 5771 +17960 6 2185 5771 +17966 27 2187 5771 +1798d b 2189 5771 +17998 5 2190 5771 +1799d 1b 2194 5771 +179b8 15 2195 5771 +179cd 1d 2202 5771 +179ea 16 2204 5771 +17a00 55 2205 5771 +17a55 12 2206 5771 +17a67 2b 2207 5771 +17a92 2 2208 5771 +17a94 d 2209 5771 +17aa1 1a 2211 5771 +17abb 2e 2218 5771 +17ae9 12 2222 5771 +17afb c 2223 5771 +17b07 c 2227 5771 +17b13 15 2228 5771 +17b28 2 2229 5771 +17b2a f 2230 5771 +17b39 1a 2235 5771 +17b53 b 2237 5771 +17b5e 3 2238 5771 +17b61 5 2243 5771 +17b66 b 2245 5771 +17b71 1c 2250 5771 +17b8d 13 2251 5771 +17ba0 e 2252 5771 +17bae 2 2253 5771 +17bb0 10 2254 5771 +17bc0 3d 2255 5771 +17bfd c 2256 5771 +17c09 e 2257 5771 +17c17 4c 2258 5771 +17c63 a 2259 5771 +17c6d 4b 2260 5771 +17cb8 7 2261 5771 +17cbf 4b 2262 5771 +17d0a f 2263 5771 +17d19 f 2264 5771 +17d28 6 2268 5771 +17d2e 61 2277 5771 +17d8f 15 2281 5771 +17da4 2 2283 5771 +17da6 18 2285 5771 +17dbe 2d 2292 5771 +17deb 12 2294 5771 +17dfd 37 2296 5771 +17e34 23 2297 5771 +17e57 b7 2299 5771 +17f0e 23 2300 5771 +17f31 12 2306 5771 +17f43 37 2307 5771 +17f7a b 2308 5771 +17f85 37 2309 5771 +17fbc b 2310 5771 +17fc7 30 2311 5771 +17ff7 23 2312 5771 +1801a 36 2319 5771 +18050 1e 2320 5771 +1806e 8 2325 5771 +18076 1e 2326 5771 +18094 12 2329 5771 +180a6 2 2331 5771 +FUNC 180a8 211 0 UnDecorator::getDecoratedName() +180a8 7 861 5771 +180af e 864 5771 +180bd a 868 5771 +180c7 b 873 5771 +180d2 8 874 5771 +180da 11 876 5771 +180eb 10 878 5771 +180fb 6 882 5771 +18101 9 903 5771 +1810a 9 906 5771 +18113 8 910 5771 +1811b 6 912 5771 +18121 5 910 5771 +18126 2 915 5771 +18128 a 918 5771 +18132 19 919 5771 +1814b 6 920 5771 +18151 f 924 5771 +18160 8 925 5771 +18168 17 929 5771 +1817f a 930 5771 +18189 c 932 5771 +18195 8 933 5771 +1819d 5 934 5771 +181a2 18 935 5771 +181ba a 936 5771 +181c4 13 937 5771 +181d7 b 938 5771 +181e2 2 940 5771 +181e4 29 941 5771 +1820d 4 945 5771 +18211 10 946 5771 +18221 9 948 5771 +1822a 3 950 5771 +1822d 1c 955 5771 +18249 f 959 5771 +18258 4 976 5771 +1825c 6 962 5771 +18262 14 964 5771 +18276 19 967 5771 +1828f 5 968 5771 +18294 10 971 5771 +182a4 2 979 5771 +182a6 2 980 5771 +182a8 f 982 5771 +182b7 2 984 5771 +FUNC 182b9 28b 0 UnDecorator::getScope() +182b9 d 1482 5771 +182c6 f 1483 5771 +182d5 2a 1489 5771 +182ff 14 1492 5771 +18313 b 1495 5771 +1831e 16 1496 5771 +18334 5 1498 5771 +18339 17 1499 5771 +18350 3 1500 5771 +18353 f 1506 5771 +18362 2a 1507 5771 +1838c 10 1566 5771 +1839c 5 1567 5771 +183a1 34 1561 5771 +183d5 4 1562 5771 +183d9 5 1563 5771 +183de e 1510 5771 +183ec 5 1514 5771 +183f1 22 1515 5771 +18413 e 1518 5771 +18421 6 1519 5771 +18427 5 1522 5771 +1842c 2a 1523 5771 +18456 2 1524 5771 +18458 f 1546 5771 +18467 1a 1548 5771 +18481 b 1550 5771 +1848c 9 1551 5771 +18495 2 1554 5771 +18497 f 1530 5771 +184a6 2 1570 5771 +184a8 21 1571 5771 +184c9 a 1489 5771 +184d3 f 1577 5771 +184e2 18 1590 5771 +184fa 2 1591 5771 +184fc b 1580 5771 +18507 7 1581 5771 +1850e 2 1582 5771 +18510 2b 1583 5771 +1853b 4 1597 5771 +1853f 5 1599 5771 +FUNC 18544 341 4 UnDecorator::getFunctionIndirectType(DName const &) +18544 3 3461 5771 +18547 e 3462 5771 +18555 15 3463 5771 +1856a f 3465 5771 +18579 10 3466 5771 +18589 7 3469 5771 +18590 a 3471 5771 +1859a 6 3473 5771 +185a0 7 3475 5771 +185a7 d 3477 5771 +185b4 17 3482 5771 +185cb 9 3485 5771 +185d4 3 3486 5771 +185d7 5 3490 5771 +185dc f 3491 5771 +185eb 6 3496 5771 +185f1 13 3497 5771 +18604 b 3501 5771 +1860f 1e 3503 5771 +1862d 8 3505 5771 +18635 29 3506 5771 +1865e 2 3507 5771 +18660 17 3508 5771 +18677 f 3510 5771 +18686 4 3511 5771 +1868a 10 3518 5771 +1869a 15 3519 5771 +186af 9 3527 5771 +186b8 d 3528 5771 +186c5 30 3529 5771 +186f5 2 3530 5771 +186f7 11 3521 5771 +18708 7 3514 5771 +1870f 16 3516 5771 +18725 13 3531 5771 +18738 d 3535 5771 +18745 22 3537 5771 +18767 2 3546 5771 +18769 13 3547 5771 +1877c c 3551 5771 +18788 28 3552 5771 +187b0 1e 3557 5771 +187ce c 3558 5771 +187da 2e 3561 5771 +18808 10 3563 5771 +18818 c 3564 5771 +18824 c 3566 5771 +18830 15 3567 5771 +18845 2 3568 5771 +18847 f 3569 5771 +18856 4 3573 5771 +1885a b 3574 5771 +18865 e 3580 5771 +18873 10 3576 5771 +18883 2 3581 5771 +FUNC 18885 4e4 10 UnDecorator::getDataIndirectType(DName const &,char,DName const &,int) +18885 6 3707 5771 +1888b 23 3711 5771 +188ae 4 3713 5771 +188b2 17 3715 5771 +188c9 c 3717 5771 +188d5 10 3719 5771 +188e5 e 3723 5771 +188f3 6 3725 5771 +188f9 15 3726 5771 +1890e 17 3732 5771 +18925 11 3751 5771 +18936 a 3752 5771 +18940 32 3753 5771 +18972 5 3754 5771 +18977 11 3743 5771 +18988 a 3744 5771 +18992 25 3745 5771 +189b7 2 3746 5771 +189b9 8 3747 5771 +189c1 2 3749 5771 +189c3 19 3735 5771 +189dc a 3736 5771 +189e6 14 3737 5771 +189fa 5 3738 5771 +189ff 11 3739 5771 +18a10 6 3766 5771 +18a16 a 3768 5771 +18a20 17 3770 5771 +18a37 10 3772 5771 +18a47 1a 3778 5771 +18a61 5 3780 5771 +18a66 6 3782 5771 +18a6c 9 3787 5771 +18a75 b 3789 5771 +18a80 19 3791 5771 +18a99 c 3793 5771 +18aa5 24 3794 5771 +18ac9 c 3796 5771 +18ad5 22 3797 5771 +18af7 9 3801 5771 +18b00 5 3805 5771 +18b05 7 3806 5771 +18b0c 6 3810 5771 +18b12 1e 3812 5771 +18b30 8 3814 5771 +18b38 1b 3815 5771 +18b53 2 3816 5771 +18b55 16 3817 5771 +18b6b a 3819 5771 +18b75 13 3828 5771 +18b88 b 3833 5771 +18b93 c 3834 5771 +18b9f 8 3835 5771 +18ba7 6 3836 5771 +18bad b 3842 5771 +18bb8 b 3843 5771 +18bc3 3 3863 5771 +18bc6 6 3864 5771 +18bcc 22 3866 5771 +18bee 9 3871 5771 +18bf7 13 3872 5771 +18c0a 5 3876 5771 +18c0f 1e 3877 5771 +18c2d 5 3879 5771 +18c32 1e 3880 5771 +18c50 5 3884 5771 +18c55 e 3885 5771 +18c63 14 3889 5771 +18c77 28 3895 5771 +18c9f 2 3890 5771 +18ca1 b 3891 5771 +18cac 2 3892 5771 +18cae c 3898 5771 +18cba 17 3899 5771 +18cd1 4 3902 5771 +18cd5 6 3904 5771 +18cdb 7 3906 5771 +18ce2 8 3774 5771 +18cea 13 3918 5771 +18cfd 12 3922 5771 +18d0f 29 3925 5771 +18d38 10 3923 5771 +18d48 c 3928 5771 +18d54 3 3929 5771 +18d57 10 3931 5771 +18d67 2 3933 5771 +FUNC 18d69 14c 0 UnDecorator::operator char *() +18d69 6 762 5771 +18d6f 4 763 5771 +18d73 f 764 5771 +18d82 9 770 5771 +18d8b c 772 5771 +18d97 7 775 5771 +18d9e 1d 776 5771 +18dbb 4 782 5771 +18dbf 16 783 5771 +18dd5 9 785 5771 +18dde 5 794 5771 +18de3 9 795 5771 +18dec 13 799 5771 +18dff e 808 5771 +18e0d 2 809 5771 +18e0f 2 848 5771 +18e11 1a 810 5771 +18e2b e 813 5771 +18e39 e 811 5771 +18e47 9 817 5771 +18e50 e 819 5771 +18e5e d 820 5771 +18e6b a 824 5771 +18e75 f 825 5771 +18e84 5 828 5771 +18e89 2 829 5771 +18e8b 2 830 5771 +18e8d 5 831 5771 +18e92 1 832 5771 +18e93 5 833 5771 +18e98 1 835 5771 +18e99 5 834 5771 +18e9e 2 838 5771 +18ea0 a 839 5771 +18eaa 9 841 5771 +18eb3 2 848 5771 +FUNC 18eb5 116 c UnDecorator::getPtrRefType(DName const &,DName const &,char) +18eb5 5 3585 5771 +18eba f 3588 5771 +18ec9 d 3589 5771 +18ed6 b 3591 5771 +18ee1 20 3594 5771 +18f01 b 3595 5771 +18f0c b 3597 5771 +18f17 9 3598 5771 +18f20 14 3600 5771 +18f34 14 3606 5771 +18f48 1b 3608 5771 +18f63 a 3612 5771 +18f6d b 3615 5771 +18f78 c 3617 5771 +18f84 9 3618 5771 +18f8d c 3620 5771 +18f99 c 3622 5771 +18fa5 a 3623 5771 +18faf b 3625 5771 +18fba f 3629 5771 +18fc9 2 3632 5771 +FUNC 18fcb 1b 8 UnDecorator::getPointerType(DName const &,DName const &) +18fcb 1b 4037 5771 +FUNC 18fe6 1b 8 UnDecorator::getPointerTypeArray(DName const &,DName const &) +18fe6 1b 4040 5771 +FUNC 19001 1b 8 UnDecorator::getReferenceType(DName const &,DName const &) +19001 1b 4043 5771 +FUNC 1901c a3 18 __unDName +1901c f 604 5771 +1902b 9 606 5771 +19034 4 607 5771 +19038 a 612 5771 +19042 2 613 5771 +19044 8 614 5771 +1904c 3 615 5771 +1904f 20 618 5771 +1906f 1a 627 5771 +19089 e 628 5771 +19097 a 633 5771 +190a1 c 636 5771 +190ad 3 643 5771 +190b0 6 645 5771 +190b6 9 637 5771 +FUNC 190bf a3 1c __unDNameEx +190bf f 684 5771 +190ce 9 687 5771 +190d7 4 688 5771 +190db a 693 5771 +190e5 2 694 5771 +190e7 8 695 5771 +190ef 3 696 5771 +190f2 20 699 5771 +19112 1a 708 5771 +1912c e 709 5771 +1913a a 714 5771 +19144 c 717 5771 +19150 3 724 5771 +19153 6 726 5771 +19159 9 718 5771 +FUNC 19162 387 4 UnDecorator::getBasicDataType(DName const &) +19162 3 3162 5771 +19165 15 3163 5771 +1917a 6 3165 5771 +19180 4 3168 5771 +19184 35 3173 5771 +191b9 5 3178 5771 +191be 5 3179 5771 +191c3 5 3183 5771 +191c8 5 3184 5771 +191cd 5 3188 5771 +191d2 5 3189 5771 +191d7 5 3193 5771 +191dc 5 3194 5771 +191e1 5 3203 5771 +191e6 5 3204 5771 +191eb 2a 3173 5771 +19215 3c 3222 5771 +19251 5 3231 5771 +19256 5 3232 5771 +1925b 22 3273 5771 +1927d 5 3235 5771 +19282 5 3236 5771 +19287 f 3222 5771 +19296 5 3243 5771 +1929b 5 3244 5771 +192a0 5 3239 5771 +192a5 5 3240 5771 +192aa 5 3247 5771 +192af 5 3248 5771 +192b4 1b 3222 5771 +192cf 3 3264 5771 +192d2 6 3262 5771 +192d8 10 3264 5771 +192e8 10 3266 5771 +192f8 11 3267 5771 +19309 5 3275 5771 +1930e 2 3276 5771 +19310 5 3255 5771 +19315 2 3257 5771 +19317 3 3224 5771 +1931a 12 3343 5771 +1932c 9 3345 5771 +19335 7 3347 5771 +1933c 16 3348 5771 +19352 6 3352 5771 +19358 d 3353 5771 +19365 5 3355 5771 +1936a 5 3227 5771 +1936f 2 3278 5771 +19371 d 3281 5771 +1937e 2 3282 5771 +19380 5 3219 5771 +19385 2 3220 5771 +19387 3 3287 5771 +1938a 5 3290 5771 +1938f d 3207 5771 +1939c d 3212 5771 +193a9 9 3297 5771 +193b2 1f 3301 5771 +193d1 19 3314 5771 +193ea c 3322 5771 +193f6 2 3326 5771 +193f8 c 3307 5771 +19404 2 3308 5771 +19406 1e 3311 5771 +19424 10 3332 5771 +19434 18 3333 5771 +1944c 5 3337 5771 +19451 c 3360 5771 +1945d 5 3367 5771 +19462 d 3369 5771 +1946f 5 3371 5771 +19474 d 3372 5771 +19481 2 3373 5771 +19483 5 3374 5771 +19488 d 3375 5771 +19495 17 3380 5771 +194ac 16 3385 5771 +194c2 27 3387 5771 +FUNC 194e9 13e 4 UnDecorator::getPrimaryDataType(DName const &) +194e9 7 2962 5771 +194f0 2b 2966 5771 +1951b 12 3027 5771 +1952d d 2972 5771 +1953a c 2974 5771 +19546 a 2975 5771 +19550 b 2981 5771 +1955b 6 2984 5771 +19561 1e 2986 5771 +1957f 7 2996 5771 +19586 2 2997 5771 +19588 6 2998 5771 +1958e f 3000 5771 +1959d 8 3002 5771 +195a5 10 3004 5771 +195b5 2f 3022 5771 +195e4 16 3012 5771 +195fa 17 3008 5771 +19611 14 2969 5771 +19625 2 3030 5771 +FUNC 19627 b1 4 UnDecorator::getDataType(DName *) +19627 6 2922 5771 +1962d b 2923 5771 +19638 15 2928 5771 +1964d 10 2954 5771 +1965d 6 2934 5771 +19663 c 2936 5771 +1966f f 2937 5771 +1967e 13 2939 5771 +19691 6 2944 5771 +19697 29 2946 5771 +196c0 2 2947 5771 +196c2 14 2931 5771 +196d6 2 2957 5771 +FUNC 196d8 64 4 UnDecorator::getExternalDataType(DName const &) +196d8 7 4244 5771 +196df 1e 4247 5771 +196fd 9 4248 5771 +19706 30 4253 5771 +19736 4 4255 5771 +1973a 2 4257 5771 +FUNC 1973c 57 8 fastzero_I +FUNC 19793 8f c _VEC_memzero +FUNC 19822 14 0 _sse2_mathfcns_init +FUNC 19836 14 4 _set_SSE2_enable +FUNC 1984a 87 c fastcopy_I +FUNC 198d1 e3 c _VEC_memcpy +FUNC 199b4 1bd c __crtMessageBoxA +199b4 9 41 4033 +199bd 5 49 4033 +199c2 2 56 4033 +199c4 18 64 4033 +199dc d 66 4033 +199e9 2 67 4033 +199eb 6 69 4033 +199f1 10 76 4033 +19a01 6 78 4033 +19a07 6 80 4033 +19a0d 15 83 4033 +19a22 1a 86 4033 +19a3c 1c 88 4033 +19a58 6 89 4033 +19a5e 8 95 4033 +19a66 6 98 4033 +19a6c a 100 4033 +19a76 14 102 4033 +19a8a 14 116 4033 +19a9e 6 119 4033 +19aa4 d 120 4033 +19ab1 c 122 4033 +19abd 1f 127 4033 +19adc 1b 136 4033 +19af7 6 137 4033 +19afd 7 138 4033 +19b04 2 139 4033 +19b06 7 140 4033 +19b0d 2 142 4033 +19b0f a 144 4033 +19b19 6 146 4033 +19b1f 5 147 4033 +19b24 2 149 4033 +19b26 11 153 4033 +19b37 6 155 4033 +19b3d 5 156 4033 +19b42 8 158 4033 +19b4a b 165 4033 +19b55 5 166 4033 +19b5a 10 168 4033 +19b6a 5 173 4033 +19b6f 2 176 4033 +FUNC 19b71 71 c strcat_s +19b71 0 13 823 +19b71 30 18 823 +19ba1 c 19 823 +19bad 2 21 823 +19baf 4 23 823 +19bb3 1 25 823 +19bb4 3 26 823 +19bb7 2 29 823 +19bb9 2 32 823 +19bbb d 35 823 +19bc8 4 39 823 +19bcc 2 41 823 +19bce e 42 823 +19bdc 5 45 823 +19be1 1 46 823 +FUNC 19be2 b3 10 strncpy_s +19be2 5 13 739 +19be7 14 17 739 +19bfb 5 65 739 +19c00 2 66 739 +19c02 26 24 739 +19c28 5 25 739 +19c2d 2 28 739 +19c2f 2 29 739 +19c31 b 31 739 +19c3c 8 35 739 +19c44 d 37 739 +19c51 2 41 739 +19c53 12 45 739 +19c65 5 48 739 +19c6a 2 50 739 +19c6c 4 54 739 +19c70 6 56 739 +19c76 3 58 739 +19c79 c 59 739 +19c85 2 61 739 +19c87 e 62 739 +FUNC 19c95 46 4 _set_error_mode +19c95 0 43 3937 +19c95 15 50 3937 +19caa 6 58 3937 +19cb0 1 65 3937 +19cb1 5 54 3937 +19cb6 7 55 3937 +19cbd 1 65 3937 +19cbe 1c 61 3937 +19cda 1 65 3937 +FUNC 19cdb a 4 __set_app_type +19cdb 0 91 3937 +19cdb 9 96 3937 +19ce4 1 97 3937 +FUNC 19ce5 6 0 __get_app_type +19ce5 0 120 3937 +19ce5 5 125 3937 +19cea 1 126 3937 +FUNC 19ceb 51 10 x_ismbbtype_l +19ceb 6 213 4669 +19cf1 b 214 4669 +19cfc 4 219 4669 +19d00 3a 222 4669 +19d3a 2 223 4669 +FUNC 19d3c 15 8 _ismbbkalnum_l +19d3c 0 80 4669 +19d3c 14 81 4669 +19d50 1 82 4669 +FUNC 19d51 13 4 _ismbbkalnum +19d51 0 85 4669 +19d51 12 86 4669 +19d63 1 87 4669 +FUNC 19d64 15 8 _ismbbkprint_l +19d64 0 90 4669 +19d64 14 91 4669 +19d78 1 92 4669 +FUNC 19d79 13 4 _ismbbkprint +19d79 0 95 4669 +19d79 12 96 4669 +19d8b 1 97 4669 +FUNC 19d8c 15 8 _ismbbkpunct_l +19d8c 0 100 4669 +19d8c 14 101 4669 +19da0 1 102 4669 +FUNC 19da1 13 4 _ismbbkpunct +19da1 0 105 4669 +19da1 12 106 4669 +19db3 1 107 4669 +FUNC 19db4 18 8 _ismbbalnum_l +19db4 0 113 4669 +19db4 17 114 4669 +19dcb 1 115 4669 +FUNC 19dcc 16 4 _ismbbalnum +19dcc 0 118 4669 +19dcc 15 119 4669 +19de1 1 120 4669 +FUNC 19de2 18 8 _ismbbalpha_l +19de2 0 123 4669 +19de2 17 124 4669 +19df9 1 125 4669 +FUNC 19dfa 16 4 _ismbbalpha +19dfa 0 128 4669 +19dfa 15 129 4669 +19e0f 1 130 4669 +FUNC 19e10 18 8 _ismbbgraph_l +19e10 0 133 4669 +19e10 17 134 4669 +19e27 1 135 4669 +FUNC 19e28 16 4 _ismbbgraph +19e28 0 138 4669 +19e28 15 139 4669 +19e3d 1 140 4669 +FUNC 19e3e 18 8 _ismbbprint_l +19e3e 0 143 4669 +19e3e 17 144 4669 +19e55 1 145 4669 +FUNC 19e56 16 4 _ismbbprint +19e56 0 148 4669 +19e56 15 149 4669 +19e6b 1 150 4669 +FUNC 19e6c 15 8 _ismbbpunct_l +19e6c 0 153 4669 +19e6c 14 154 4669 +19e80 1 155 4669 +FUNC 19e81 13 4 _ismbbpunct +19e81 0 158 4669 +19e81 12 159 4669 +19e93 1 160 4669 +FUNC 19e94 15 8 _ismbblead_l +19e94 0 166 4669 +19e94 14 167 4669 +19ea8 1 168 4669 +FUNC 19ea9 13 4 _ismbblead +19ea9 0 171 4669 +19ea9 12 172 4669 +19ebb 1 173 4669 +FUNC 19ebc 15 8 _ismbbtrail_l +19ebc 0 176 4669 +19ebc 14 177 4669 +19ed0 1 178 4669 +FUNC 19ed1 13 4 _ismbbtrail +19ed1 0 181 4669 +19ed1 12 182 4669 +19ee3 1 183 4669 +FUNC 19ee4 53 8 _ismbbkana_l +19ee4 6 189 4669 +19eea b 190 4669 +19ef5 10 192 4669 +19f05 1f 194 4669 +19f24 2 197 4669 +19f26 f 196 4669 +19f35 2 197 4669 +FUNC 19f37 e 4 _ismbbkana +19f37 0 200 4669 +19f37 d 201 4669 +19f44 1 202 4669 +FUNC 19f45 44 4 _getbuf +19f45 0 43 1893 +19f45 6 50 1893 +19f4b 16 58 1893 +19f61 4 61 1893 +19f65 7 62 1893 +19f6c 2 65 1893 +19f6e 4 69 1893 +19f72 6 70 1893 +19f78 7 71 1893 +19f7f 3 75 1893 +19f82 6 76 1893 +19f88 1 79 1893 +FUNC 19f89 1de 8 _fputwc_nolock +19f89 15 90 2124 +19f9e b 93 2124 +19fa9 48 95 2124 +19ff1 6 101 2124 +19ff7 45 104 2124 +1a03c 27 115 2124 +1a063 9 116 2124 +1a06c 22 120 2124 +1a08e 2 121 2124 +1a090 8 124 2124 +1a098 42 127 2124 +1a0da 17 133 2124 +1a0f1 6 139 2124 +1a0f7 7 141 2124 +1a0fe 34 143 2124 +1a132 6 146 2124 +1a138 6 150 2124 +1a13e d 151 2124 +1a14b d 153 2124 +1a158 f 154 2124 +FUNC 1a167 78 8 fputwc +1a167 c 48 2124 +1a173 2e 52 2124 +1a1a1 3 55 2124 +1a1a4 7 57 2124 +1a1ab 3 58 2124 +1a1ae 11 60 2124 +1a1bf c 63 2124 +1a1cb 4 67 2124 +1a1cf 6 68 2124 +1a1d5 a 64 2124 +FUNC 1a1df 5 8 putwc +1a1df 0 162 2124 +1a1df 5 163 2124 +FUNC 1a1e4 1f7 14 wcstoxl +1a1e4 8 82 6173 +1a1ec b 88 6173 +1a1f7 3 92 6173 +1a1fa b 95 6173 +1a205 2f 97 6173 +1a234 12 98 6173 +1a246 9 103 6173 +1a24f 2 105 6173 +1a251 18 106 6173 +1a269 6 108 6173 +1a26f 4 109 6173 +1a273 2 110 6173 +1a275 6 112 6173 +1a27b 5 113 6173 +1a280 5 115 6173 +1a285 b 118 6173 +1a290 9 119 6173 +1a299 f 120 6173 +1a2a8 9 123 6173 +1a2b1 7 121 6173 +1a2b8 6 126 6173 +1a2be 1a 128 6173 +1a2d8 2 129 6173 +1a2da 5 130 6173 +1a2df d 135 6173 +1a2ec c 141 6173 +1a2f8 15 143 6173 +1a30d 12 144 6173 +1a31f 5 148 6173 +1a324 4 152 6173 +1a328 c 159 6173 +1a334 4 165 6173 +1a338 6 166 6173 +1a33e 9 178 6173 +1a347 6 181 6173 +1a34d 3 183 6173 +1a350 4 184 6173 +1a354 2 186 6173 +1a356 c 161 6173 +1a362 5 173 6173 +1a367 2 174 6173 +1a369 24 189 6173 +1a38d 5 192 6173 +1a392 c 193 6173 +1a39e 6 194 6173 +1a3a4 10 195 6173 +1a3b4 8 201 6173 +1a3bc 2 203 6173 +1a3be 6 205 6173 +1a3c4 3 207 6173 +1a3c7 12 209 6173 +1a3d9 2 210 6173 +FUNC 1a3db 29 c wcstol +1a3db 3 217 6173 +1a3de 8 218 6173 +1a3e6 13 220 6173 +1a3f9 9 224 6173 +1a402 2 226 6173 +FUNC 1a404 1b 10 _wcstol_l +1a404 0 234 6173 +1a404 1a 235 6173 +1a41e 1 236 6173 +FUNC 1a41f 2a c wcstoul +1a41f 3 243 6173 +1a422 7 244 6173 +1a429 14 246 6173 +1a43d a 250 6173 +1a447 2 252 6173 +FUNC 1a449 1b 10 _wcstoul_l +1a449 0 260 6173 +1a449 1a 261 6173 +1a463 1 262 6173 +FUNC 1a464 9 0 _fptrap +1a464 0 46 2503 +1a464 8 47 2503 +1a46c 1 48 2503 +FUNC 1a46d 54 8 _isalpha_l +1a46d 6 57 6535 +1a473 b 58 6535 +1a47e 41 60 6535 +1a4bf 2 61 6535 +FUNC 1a4c1 2b 4 isalpha +1a4c1 0 66 6535 +1a4c1 9 67 6535 +1a4ca 13 69 6535 +1a4dd 1 75 6535 +1a4de d 73 6535 +1a4eb 1 75 6535 +FUNC 1a4ec 4f 8 _isupper_l +1a4ec 6 81 6535 +1a4f2 b 82 6535 +1a4fd 3c 84 6535 +1a539 2 85 6535 +FUNC 1a53b 29 4 isupper +1a53b 0 90 6535 +1a53b 9 91 6535 +1a544 11 93 6535 +1a555 1 99 6535 +1a556 d 97 6535 +1a563 1 99 6535 +FUNC 1a564 4f 8 _islower_l +1a564 6 105 6535 +1a56a b 106 6535 +1a575 3c 108 6535 +1a5b1 2 109 6535 +FUNC 1a5b3 29 4 islower +1a5b3 0 114 6535 +1a5b3 9 115 6535 +1a5bc 11 117 6535 +1a5cd 1 123 6535 +1a5ce d 121 6535 +1a5db 1 123 6535 +FUNC 1a5dc 4f 8 _isdigit_l +1a5dc 6 129 6535 +1a5e2 b 130 6535 +1a5ed 3c 132 6535 +1a629 2 133 6535 +FUNC 1a62b 29 4 isdigit +1a62b 0 138 6535 +1a62b 9 139 6535 +1a634 11 141 6535 +1a645 1 147 6535 +1a646 d 145 6535 +1a653 1 147 6535 +FUNC 1a654 54 8 _isxdigit_l +1a654 6 153 6535 +1a65a b 154 6535 +1a665 41 156 6535 +1a6a6 2 157 6535 +FUNC 1a6a8 2b 4 isxdigit +1a6a8 0 162 6535 +1a6a8 9 163 6535 +1a6b1 13 165 6535 +1a6c4 1 171 6535 +1a6c5 d 169 6535 +1a6d2 1 171 6535 +FUNC 1a6d3 4f 8 _isspace_l +1a6d3 6 177 6535 +1a6d9 b 178 6535 +1a6e4 3c 180 6535 +1a720 2 181 6535 +FUNC 1a722 29 4 isspace +1a722 0 186 6535 +1a722 9 187 6535 +1a72b 11 189 6535 +1a73c 1 195 6535 +1a73d d 193 6535 +1a74a 1 195 6535 +FUNC 1a74b 4f 8 _ispunct_l +1a74b 6 201 6535 +1a751 b 202 6535 +1a75c 3c 204 6535 +1a798 2 205 6535 +FUNC 1a79a 29 4 ispunct +1a79a 0 210 6535 +1a79a 9 211 6535 +1a7a3 11 213 6535 +1a7b4 1 219 6535 +1a7b5 d 217 6535 +1a7c2 1 219 6535 +FUNC 1a7c3 54 8 _isalnum_l +1a7c3 6 225 6535 +1a7c9 b 226 6535 +1a7d4 41 228 6535 +1a815 2 229 6535 +FUNC 1a817 2b 4 isalnum +1a817 0 234 6535 +1a817 9 235 6535 +1a820 13 237 6535 +1a833 1 243 6535 +1a834 d 241 6535 +1a841 1 243 6535 +FUNC 1a842 54 8 _isprint_l +1a842 6 249 6535 +1a848 b 250 6535 +1a853 41 252 6535 +1a894 2 253 6535 +FUNC 1a896 2b 4 isprint +1a896 0 258 6535 +1a896 9 259 6535 +1a89f 13 261 6535 +1a8b2 1 267 6535 +1a8b3 d 265 6535 +1a8c0 1 267 6535 +FUNC 1a8c1 54 8 _isgraph_l +1a8c1 6 273 6535 +1a8c7 b 274 6535 +1a8d2 41 276 6535 +1a913 2 277 6535 +FUNC 1a915 2b 4 isgraph +1a915 0 282 6535 +1a915 9 283 6535 +1a91e 13 285 6535 +1a931 1 291 6535 +1a932 d 289 6535 +1a93f 1 291 6535 +FUNC 1a940 4f 8 _iscntrl_l +1a940 6 297 6535 +1a946 b 298 6535 +1a951 3c 300 6535 +1a98d 2 301 6535 +FUNC 1a98f 29 4 iscntrl +1a98f 0 306 6535 +1a98f 9 307 6535 +1a998 11 309 6535 +1a9a9 1 315 6535 +1a9aa d 313 6535 +1a9b7 1 315 6535 +FUNC 1a9b8 d 4 __isascii +1a9b8 0 320 6535 +1a9b8 c 321 6535 +1a9c4 1 322 6535 +FUNC 1a9c5 8 4 __toascii +1a9c5 0 327 6535 +1a9c5 7 328 6535 +1a9cc 1 329 6535 +FUNC 1a9cd 1f 8 _iscsymf_l +1a9cd 0 335 6535 +1a9cd 1a 336 6535 +1a9e7 1 337 6535 +1a9e8 3 336 6535 +1a9eb 1 337 6535 +FUNC 1a9ec 1a 4 __iscsymf +1a9ec 0 341 6535 +1a9ec 15 342 6535 +1aa01 1 343 6535 +1aa02 3 342 6535 +1aa05 1 343 6535 +FUNC 1aa06 1f 8 _iscsym_l +1aa06 0 349 6535 +1aa06 1a 350 6535 +1aa20 1 351 6535 +1aa21 3 350 6535 +1aa24 1 351 6535 +FUNC 1aa25 1c 4 __iscsym +1aa25 0 356 6535 +1aa25 17 357 6535 +1aa3c 1 358 6535 +1aa3d 3 357 6535 +1aa40 1 358 6535 +FUNC 1aa41 12 8 _MarkAllocaS +1aa41 0 207 2895 +1aa41 8 208 2895 +1aa49 6 210 2895 +1aa4f 3 211 2895 +1aa52 1 214 2895 +FUNC 1aa53 1b 4 _freea +1aa53 0 249 2895 +1aa53 8 251 2895 +1aa5b 3 253 2895 +1aa5e 8 255 2895 +1aa66 7 257 2895 +1aa6d 1 266 2895 +FUNC 1aa6e 13b 18 __crtGetLocaleInfoW_stat +1aa6e f 60 2876 +1aa7d 14 68 2876 +1aa91 d 70 2876 +1aa9e 8 71 2876 +1aaa6 b 73 2876 +1aab1 f 74 2876 +1aac0 5 79 2876 +1aac5 13 81 2876 +1aad8 7 86 2876 +1aadf 2 140 2876 +1aae1 8 96 2876 +1aae9 b 97 2876 +1aaf4 16 100 2876 +1ab0a 7 101 2876 +1ab11 48 104 2876 +1ab59 2 105 2876 +1ab5b 2 106 2876 +1ab5d e 110 2876 +1ab6b 7 113 2876 +1ab72 2 121 2876 +1ab74 2 123 2876 +1ab76 17 130 2876 +1ab8d 6 134 2876 +1ab93 4 136 2876 +1ab97 12 141 2876 +FUNC 1aba9 3b 18 __crtGetLocaleInfoW +1aba9 6 151 2876 +1abaf b 152 2876 +1abba 28 161 2876 +1abe2 2 162 2876 +FUNC 1abe4 13d 18 __crtGetLocaleInfoA_stat +1abe4 f 60 4251 +1abf3 17 68 4251 +1ac0a a 70 4251 +1ac14 8 71 4251 +1ac1c b 73 4251 +1ac27 f 74 4251 +1ac36 11 79 4251 +1ac47 4 86 4251 +1ac4b 5 96 4251 +1ac50 b 97 4251 +1ac5b 13 100 4251 +1ac6e 7 101 4251 +1ac75 49 104 4251 +1acbe 2 105 4251 +1acc0 2 106 4251 +1acc2 10 110 4251 +1acd2 3 114 4251 +1acd5 6 124 4251 +1acdb 2 126 4251 +1acdd 15 135 4251 +1acf2 7 139 4251 +1acf9 4 141 4251 +1acfd 12 81 4251 +1ad0f 12 145 4251 +FUNC 1ad21 3b 18 __crtGetLocaleInfoA +1ad21 6 155 4251 +1ad27 b 156 4251 +1ad32 28 165 4251 +1ad5a 2 166 4251 +FUNC 1ad5c 1a 4 strncnt +1ad5c 0 48 4203 +1ad5c 6 49 4203 +1ad62 6 52 4203 +1ad68 1 53 4203 +1ad69 5 52 4203 +1ad6e 7 55 4203 +1ad75 1 56 4203 +FUNC 1ad76 3a2 20 __crtLCMapStringA_stat +1ad76 12 99 4203 +1ad88 d 108 4203 +1ad95 1b 109 4203 +1adb0 8 110 4203 +1adb8 b 111 4203 +1adc3 a 112 4203 +1adcd 5 119 4203 +1add2 19 120 4203 +1adeb 5 124 4203 +1adf0 1 125 4203 +1adf1 3 127 4203 +1adf4 16 133 4203 +1ae0a 9 213 4203 +1ae13 8 235 4203 +1ae1b 8 236 4203 +1ae23 27 247 4203 +1ae4a 6 248 4203 +1ae50 48 251 4203 +1ae98 3 252 4203 +1ae9b 6 253 4203 +1aea1 19 262 4203 +1aeba 21 271 4203 +1aedb 8 274 4203 +1aee3 9 277 4203 +1aeec 9 279 4203 +1aef5 12 288 4203 +1af07 5 292 4203 +1af0c 4b 298 4203 +1af57 4 299 4203 +1af5b 18 309 4203 +1af73 3 312 4203 +1af76 6 322 4203 +1af7c 2 325 4203 +1af7e 17 335 4203 +1af95 7 342 4203 +1af9c 8 344 4203 +1afa4 9 346 4203 +1afad b 141 4203 +1afb8 8 142 4203 +1afc0 5 143 4203 +1afc5 8 144 4203 +1afcd 11 146 4203 +1afde 7 147 4203 +1afe5 9 153 4203 +1afee 15 155 4203 +1b003 5 156 4203 +1b008 2 157 4203 +1b00a 1b 164 4203 +1b025 7 166 4203 +1b02c 41 169 4203 +1b06d 2 170 4203 +1b06f 28 196 4203 +1b097 2 183 4203 +1b099 2 184 4203 +1b09b 25 190 4203 +1b0c0 7 198 4203 +1b0c7 2 199 4203 +1b0c9 1a 202 4203 +1b0e3 5 204 4203 +1b0e8 9 205 4203 +1b0f1 c 206 4203 +1b0fd 7 207 4203 +1b104 2 208 4203 +1b106 12 350 4203 +FUNC 1b118 43 24 __crtLCMapStringA +1b118 6 363 4203 +1b11e b 364 4203 +1b129 30 376 4203 +1b159 2 377 4203 +FUNC 1b15b 1b8 1c __crtGetStringTypeA_stat +1b15b f 66 4155 +1b16a 10 75 4155 +1b17a 18 79 4155 +1b192 8 80 4155 +1b19a b 82 4155 +1b1a5 f 83 4155 +1b1b4 11 88 4155 +1b1c5 9 120 4155 +1b1ce 8 141 4155 +1b1d6 8 142 4155 +1b1de 27 153 4155 +1b205 6 154 4155 +1b20b 3e 157 4155 +1b249 2 158 4155 +1b24b 2 159 4155 +1b24d f 161 4155 +1b25c 13 169 4155 +1b26f 11 174 4155 +1b280 6 176 4155 +1b286 6 178 4155 +1b28c 2 90 4155 +1b28e 5 94 4155 +1b293 8 95 4155 +1b29b 5 96 4155 +1b2a0 8 97 4155 +1b2a8 e 99 4155 +1b2b6 4 100 4155 +1b2ba 5 104 4155 +1b2bf 17 106 4155 +1b2d6 2 107 4155 +1b2d8 2 108 4155 +1b2da 3 109 4155 +1b2dd 15 112 4155 +1b2f2 6 113 4155 +1b2f8 7 114 4155 +1b2ff 2 115 4155 +1b301 12 182 4155 +FUNC 1b313 40 20 __crtGetStringTypeA +1b313 6 194 4155 +1b319 b 195 4155 +1b324 2d 206 4155 +1b351 2 207 4155 +FUNC 1b353 6 0 __pwctype_func +1b353 0 24 3986 +1b353 5 25 3986 +1b358 1 26 3986 +FUNC 1b359 29 0 __pctype_func +1b359 0 29 3986 +1b359 7 35 3986 +1b360 3 36 3986 +1b363 18 38 3986 +1b37b 6 39 3986 +1b381 1 40 3986 +FUNC 1b382 419 0 _get_lc_time +1b382 6 94 3379 +1b388 12 104 3379 +1b39a 3 105 3379 +1b39d 2 170 3379 +1b39f 9 108 3379 +1b3a8 16 112 3379 +1b3be 15 113 3379 +1b3d3 15 114 3379 +1b3e8 18 115 3379 +1b400 15 116 3379 +1b415 13 117 3379 +1b428 14 118 3379 +1b43c 18 120 3379 +1b454 15 121 3379 +1b469 15 122 3379 +1b47e 15 123 3379 +1b493 18 124 3379 +1b4ab 15 125 3379 +1b4c0 15 126 3379 +1b4d5 15 128 3379 +1b4ea 18 129 3379 +1b502 15 130 3379 +1b517 15 131 3379 +1b52c 15 132 3379 +1b541 18 133 3379 +1b559 15 134 3379 +1b56e 15 135 3379 +1b583 15 136 3379 +1b598 18 137 3379 +1b5b0 15 138 3379 +1b5c5 15 139 3379 +1b5da 15 141 3379 +1b5ef 18 142 3379 +1b607 15 143 3379 +1b61c 15 144 3379 +1b631 15 145 3379 +1b646 18 146 3379 +1b65e 18 147 3379 +1b676 18 148 3379 +1b68e 18 149 3379 +1b6a6 1b 150 3379 +1b6c1 18 151 3379 +1b6d9 18 152 3379 +1b6f1 18 154 3379 +1b709 1b 155 3379 +1b724 18 160 3379 +1b73c 18 161 3379 +1b754 1b 163 3379 +1b76f 20 165 3379 +1b78f a 169 3379 +1b799 2 170 3379 +FUNC 1b79b 190 4 __free_lc_time +1b79b 1 179 3379 +1b79c c 180 3379 +1b7a8 8 183 3379 +1b7b0 8 184 3379 +1b7b8 8 185 3379 +1b7c0 8 186 3379 +1b7c8 8 187 3379 +1b7d0 8 188 3379 +1b7d8 7 189 3379 +1b7df 8 191 3379 +1b7e7 8 192 3379 +1b7ef 8 193 3379 +1b7f7 8 194 3379 +1b7ff 8 195 3379 +1b807 8 196 3379 +1b80f 8 197 3379 +1b817 8 199 3379 +1b81f b 200 3379 +1b82a 8 201 3379 +1b832 8 202 3379 +1b83a 8 203 3379 +1b842 8 204 3379 +1b84a 8 205 3379 +1b852 8 206 3379 +1b85a 8 207 3379 +1b862 8 208 3379 +1b86a 8 209 3379 +1b872 8 210 3379 +1b87a 8 212 3379 +1b882 8 213 3379 +1b88a 8 214 3379 +1b892 8 215 3379 +1b89a 8 216 3379 +1b8a2 b 217 3379 +1b8ad b 218 3379 +1b8b8 b 219 3379 +1b8c3 b 220 3379 +1b8ce b 221 3379 +1b8d9 b 222 3379 +1b8e4 b 223 3379 +1b8ef b 225 3379 +1b8fa b 226 3379 +1b905 b 228 3379 +1b910 b 229 3379 +1b91b f 230 3379 +1b92a 1 232 3379 +FUNC 1b92b 73 4 __init_time +1b92b 4 56 3379 +1b92f f 60 3379 +1b93e 16 64 3379 +1b954 4 65 3379 +1b958 b 67 3379 +1b963 6 69 3379 +1b969 8 70 3379 +1b971 2 71 3379 +1b973 6 73 3379 +1b979 2 74 3379 +1b97b 2 75 3379 +1b97d 18 78 3379 +1b995 2 82 3379 +1b997 6 83 3379 +1b99d 1 84 3379 +FUNC 1b99e 33 0 fix_grouping +1b99e 0 32 3427 +1b99e 8 40 3427 +1b9a6 a 43 3427 +1b9b0 4 45 3427 +1b9b4 1 61 3427 +1b9b5 6 40 3427 +1b9bb 1 63 3427 +1b9bc 4 50 3427 +1b9c0 2 52 3427 +1b9c2 7 55 3427 +1b9c9 6 56 3427 +1b9cf 2 60 3427 +FUNC 1b9d1 40 4 __free_lconv_num +1b9d1 1 211 3427 +1b9d2 8 212 3427 +1b9da a 215 3427 +1b9e4 7 216 3427 +1b9eb b 218 3427 +1b9f6 7 219 3427 +1b9fd b 221 3427 +1ba08 8 222 3427 +1ba10 1 223 3427 +FUNC 1ba11 1c8 4 __init_numeric +1ba11 7 84 3427 +1ba18 4 92 3427 +1ba1c 2 93 3427 +1ba1e 11 96 3427 +1ba2f 3 177 3427 +1ba32 3 178 3427 +1ba35 c 179 3427 +1ba41 14 102 3427 +1ba55 8 103 3427 +1ba5d 9 108 3427 +1ba66 13 113 3427 +1ba79 9 115 3427 +1ba82 2 116 3427 +1ba84 2 118 3427 +1ba86 9 120 3427 +1ba8f 12 125 3427 +1baa1 8 127 3427 +1baa9 a 128 3427 +1bab3 7 129 3427 +1baba 2 131 3427 +1babc 19 140 3427 +1bad5 15 142 3427 +1baea 1b 144 3427 +1bb05 2 146 3427 +1bb07 c 148 3427 +1bb13 1e 154 3427 +1bb31 2 156 3427 +1bb33 17 154 3427 +1bb4a b 164 3427 +1bb55 9 165 3427 +1bb5e c 166 3427 +1bb6a 8 168 3427 +1bb72 7 169 3427 +1bb79 2 170 3427 +1bb7b 13 186 3427 +1bb8e 11 191 3427 +1bb9f b 193 3427 +1bbaa d 194 3427 +1bbb7 9 197 3427 +1bbc0 9 198 3427 +1bbc9 9 200 3427 +1bbd2 5 201 3427 +1bbd7 2 202 3427 +FUNC 1bbd9 33 0 fix_grouping +1bbd9 0 214 3470 +1bbd9 8 222 3470 +1bbe1 a 225 3470 +1bbeb 4 227 3470 +1bbef 1 243 3470 +1bbf0 6 222 3470 +1bbf6 1 245 3470 +1bbf7 4 232 3470 +1bbfb 2 234 3470 +1bbfd 7 237 3470 +1bc04 6 238 3470 +1bc0a 2 242 3470 +FUNC 1bc0c 89 4 __free_lconv_mon +1bc0c 1 255 3470 +1bc0d 8 256 3470 +1bc15 b 259 3470 +1bc20 7 260 3470 +1bc27 b 262 3470 +1bc32 7 263 3470 +1bc39 b 265 3470 +1bc44 7 266 3470 +1bc4b b 268 3470 +1bc56 7 269 3470 +1bc5d b 271 3470 +1bc68 7 272 3470 +1bc6f b 274 3470 +1bc7a 7 275 3470 +1bc81 b 277 3470 +1bc8c 8 278 3470 +1bc94 1 279 3470 +FUNC 1bc95 2c4 4 __init_monetary +1bc95 8 65 3470 +1bc9d 6 73 3470 +1bca3 13 77 3470 +1bcb6 3 187 3470 +1bcb9 3 188 3470 +1bcbc a 189 3470 +1bcc6 11 83 3470 +1bcd7 8 84 3470 +1bcdf f 89 3470 +1bcee 7 91 3470 +1bcf5 2 92 3470 +1bcf7 2 94 3470 +1bcf9 9 96 3470 +1bd02 f 101 3470 +1bd11 6 103 3470 +1bd17 9 104 3470 +1bd20 2 105 3470 +1bd22 2 107 3470 +1bd24 4 112 3470 +1bd28 14 117 3470 +1bd3c 14 119 3470 +1bd50 14 121 3470 +1bd64 17 123 3470 +1bd7b 14 125 3470 +1bd8f 14 128 3470 +1bda3 14 130 3470 +1bdb7 17 133 3470 +1bdce 14 135 3470 +1bde2 14 137 3470 +1bdf6 14 139 3470 +1be0a 17 141 3470 +1be21 14 143 3470 +1be35 14 145 3470 +1be49 17 147 3470 +1be60 2 149 3470 +1be62 6 150 3470 +1be68 6 151 3470 +1be6e 8 152 3470 +1be76 b 153 3470 +1be81 5 154 3470 +1be86 1c 157 3470 +1bea2 2 159 3470 +1bea4 17 157 3470 +1bebb c 169 3470 +1bec7 3 175 3470 +1beca 32 181 3470 +1befc 11 194 3470 +1bf0d 15 199 3470 +1bf22 b 201 3470 +1bf2d d 202 3470 +1bf3a 9 204 3470 +1bf43 9 205 3470 +1bf4c 6 206 3470 +1bf52 5 208 3470 +1bf57 2 209 3470 +FUNC 1bf59 395 4 __init_ctype +1bf59 11 59 3562 +1bf6a 6 60 3562 +1bf70 1f 82 3562 +1bf8f 7 84 3562 +1bf96 20 89 3562 +1bfb6 7 94 3562 +1bfbd 10 98 3562 +1bfcd b 100 3562 +1bfd8 b 102 3562 +1bfe3 12 104 3562 +1bff5 2f 106 3562 +1c024 5 109 3562 +1c029 2 112 3562 +1c02b e 113 3562 +1c039 15 115 3562 +1c04e a 118 3562 +1c058 4 121 3562 +1c05c 8 124 3562 +1c064 e 126 3562 +1c072 9 128 3562 +1c07b b 129 3562 +1c086 b 128 3562 +1c091 2c 140 3562 +1c0bd 33 155 3562 +1c0f0 2d 166 3562 +1c11d 37 178 3562 +1c154 11 180 3562 +1c165 17 182 3562 +1c17c 15 183 3562 +1c191 d 180 3562 +1c19e 12 189 3562 +1c1b0 f 190 3562 +1c1bf 12 191 3562 +1c1d1 18 195 3562 +1c1e9 11 198 3562 +1c1fa 13 199 3562 +1c20d e 200 3562 +1c21b e 201 3562 +1c229 9 203 3562 +1c232 6 204 3562 +1c238 9 206 3562 +1c241 9 207 3562 +1c24a 9 208 3562 +1c253 9 209 3562 +1c25c 9 210 3562 +1c265 9 213 3562 +1c26e 4 214 3562 +1c272 8 217 3562 +1c27a 8 218 3562 +1c282 8 219 3562 +1c28a 10 220 3562 +1c29a 13 227 3562 +1c2ad 2 231 3562 +1c2af 6 232 3562 +1c2b5 a 233 3562 +1c2bf a 234 3562 +1c2c9 a 235 3562 +1c2d3 a 236 3562 +1c2dd 2 238 3562 +1c2df f 240 3562 +FUNC 1c2ee 29 0 ___mb_cur_max_func +1c2ee 0 248 3562 +1c2ee 7 254 3562 +1c2f5 3 255 3562 +1c2f8 18 257 3562 +1c310 6 259 3562 +1c316 1 260 3562 +FUNC 1c317 16 4 ___mb_cur_max_l_func +1c317 0 263 3562 +1c317 15 264 3562 +1c32c 1 265 3562 +FUNC 1c32d 26 0 ___lc_codepage_func +1c32d 0 268 3562 +1c32d 7 274 3562 +1c334 3 275 3562 +1c337 18 277 3562 +1c34f 3 279 3562 +1c352 1 280 3562 +FUNC 1c353 26 0 ___lc_collate_cp_func +1c353 0 284 3562 +1c353 7 290 3562 +1c35a 3 291 3562 +1c35d 18 293 3562 +1c375 3 295 3562 +1c378 1 296 3562 +FUNC 1c379 26 0 ___lc_handle_func +1c379 0 300 3562 +1c379 7 306 3562 +1c380 3 307 3562 +1c383 18 309 3562 +1c39b 3 311 3562 +1c39e 1 312 3562 +FUNC 1c39f 3 4 __init_collate +1c39f 0 41 3650 +1c39f 2 42 3650 +1c3a1 1 43 3650 +FUNC 1c3a2 fe 4 _Getdays_l +1c3a2 9 111 516 +1c3ab d 115 516 +1c3b8 9 117 516 +1c3c1 9 119 516 +1c3ca 28 120 516 +1c3f2 b 121 516 +1c3fd c 123 516 +1c409 4 126 516 +1c40d 30 128 516 +1c43d 8 129 516 +1c445 31 131 516 +1c476 12 132 516 +1c488 3 134 516 +1c48b 13 137 516 +1c49e 2 138 516 +FUNC 1c4a0 9 0 _Getdays +1c4a0 0 142 516 +1c4a0 8 143 516 +1c4a8 1 144 516 +FUNC 1c4a9 fe 4 _Getmonths_l +1c4a9 9 150 516 +1c4b2 d 154 516 +1c4bf 16 156 516 +1c4d5 2b 159 516 +1c500 b 160 516 +1c50b 8 162 516 +1c513 a 163 516 +1c51d 2d 167 516 +1c54a 8 168 516 +1c552 2c 170 516 +1c57e 11 171 516 +1c58f 3 173 516 +1c592 13 176 516 +1c5a5 2 177 516 +FUNC 1c5a7 9 0 _Getmonths +1c5a7 0 181 516 +1c5a7 8 182 516 +1c5af 1 183 516 +FUNC 1c5b0 355 4 _Gettnames_l +1c5b0 9 189 516 +1c5b9 d 193 516 +1c5c6 9 195 516 +1c5cf 9 197 516 +1c5d8 28 198 516 +1c600 d 199 516 +1c60d 29 200 516 +1c636 18 201 516 +1c64e 11 202 516 +1c65f f 203 516 +1c66e f 204 516 +1c67d 7 205 516 +1c684 e 206 516 +1c692 8 208 516 +1c69a 12 212 516 +1c6ac 13 213 516 +1c6bf 6 214 516 +1c6c5 2a 215 516 +1c6ef 6 216 516 +1c6f5 d 217 516 +1c702 26 218 516 +1c728 1c 219 516 +1c744 18 221 516 +1c75c 6 222 516 +1c762 26 223 516 +1c788 a 224 516 +1c792 5 225 516 +1c797 2a 226 516 +1c7c1 18 227 516 +1c7d9 30 230 516 +1c809 a 231 516 +1c813 30 233 516 +1c843 a 234 516 +1c84d 30 236 516 +1c87d a 237 516 +1c887 30 239 516 +1c8b7 a 240 516 +1c8c1 30 242 516 +1c8f1 12 245 516 +1c903 2 246 516 +FUNC 1c905 9 0 _Gettnames +1c905 0 250 516 +1c905 8 251 516 +1c90d 1 252 516 +FUNC 1c90e 20 0 _store_str +1c90e 0 869 516 +1c90e f 871 516 +1c91d 7 872 516 +1c924 9 873 516 +1c92d 1 875 516 +FUNC 1c92e 36 0 _store_number +1c92e 0 965 516 +1c92e 8 973 516 +1c936 c 976 516 +1c942 2 977 516 +1c944 b 978 516 +1c94f 2 981 516 +1c951 2 982 516 +1c953 1 983 516 +1c954 7 988 516 +1c95b 3 989 516 +1c95e 5 990 516 +1c963 1 991 516 +FUNC 1c964 79 4 _store_num +1c964 8 909 516 +1c96c 2 910 516 +1c96e 8 912 516 +1c976 33 913 516 +1c9a9 2 914 516 +1c9ab 4 917 516 +1c9af 8 918 516 +1c9b7 b 919 516 +1c9c2 c 921 516 +1c9ce 5 923 516 +1c9d3 2 924 516 +1c9d5 2 926 516 +1c9d7 4 927 516 +1c9db 2 928 516 +FUNC 1c9dd 3e6 10 _expandtime +1c9dd 5 548 516 +1c9e2 4f 558 516 +1ca31 16 659 516 +1ca47 5 662 516 +1ca4c 16 587 516 +1ca62 7 589 516 +1ca69 5 590 516 +1ca6e 16 571 516 +1ca84 7 573 516 +1ca8b 5 574 516 +1ca90 5 822 516 +1ca95 7 823 516 +1ca9c 5 824 516 +1caa1 16 667 516 +1cab7 10 668 516 +1cac7 2 669 516 +1cac9 5 672 516 +1cace 23 558 516 +1caf1 6 787 516 +1caf7 5 789 516 +1cafc 15 736 516 +1cb11 2 737 516 +1cb13 2 739 516 +1cb15 5 740 516 +1cb1a 15 722 516 +1cb2f 2 723 516 +1cb31 16 742 516 +1cb47 4 743 516 +1cb4b 2 744 516 +1cb4d 5 745 516 +1cb52 6 746 516 +1cb58 8 747 516 +1cb60 1 748 516 +1cb61 5 752 516 +1cb66 f 715 516 +1cb75 5 718 516 +1cb7a 3 696 516 +1cb7d 2 699 516 +1cb7f 1d 804 516 +1cb9c 6 806 516 +1cba2 d 808 516 +1cbaf 2 809 516 +1cbb1 37 558 516 +1cbe8 19 678 516 +1cc01 8 680 516 +1cc09 2 681 516 +1cc0b 15 650 516 +1cc20 13 652 516 +1cc33 5 653 516 +1cc38 1e 601 516 +1cc56 2 603 516 +1cc58 5 606 516 +1cc5d 2 607 516 +1cc5f 2 608 516 +1cc61 25 615 516 +1cc86 2 617 516 +1cc88 1 627 516 +1cc89 2 642 516 +1cc8b e 579 516 +1cc99 7 581 516 +1cca0 5 582 516 +1cca5 2d 562 516 +1ccd2 6 564 516 +1ccd8 5 565 516 +1ccdd e 687 516 +1cceb 3 689 516 +1ccee 5 690 516 +1ccf3 15 558 516 +1cd08 2 834 516 +1cd0a 5 814 516 +1cd0f 19 817 516 +1cd28 5 819 516 +1cd2d d 795 516 +1cd3a b 798 516 +1cd45 5 799 516 +1cd4a 11 762 516 +1cd5b 5 764 516 +1cd60 1 774 516 +1cd61 5 776 516 +1cd66 16 729 516 +1cd7c 6 731 516 +1cd82 5 732 516 +1cd87 16 704 516 +1cd9d 3 705 516 +1cda0 b 706 516 +1cdab 2 707 516 +1cdad e 708 516 +1cdbb 6 839 516 +1cdc1 2 840 516 +FUNC 1cdc3 45d 18 _store_winword +1cdc3 10 1035 516 +1cdd3 5 1043 516 +1cdd8 a 1053 516 +1cde2 3 1043 516 +1cde5 6 1053 516 +1cdeb 2 1054 516 +1cded 6 1049 516 +1cdf3 2 1050 516 +1cdf5 6 1046 516 +1cdfb 10 1057 516 +1ce0b 4 1066 516 +1ce0f 8 1067 516 +1ce17 6 1069 516 +1ce1d d 1075 516 +1ce2a a 1076 516 +1ce34 8 1077 516 +1ce3c 4 1078 516 +1ce40 2a 1085 516 +1ce6a b 1087 516 +1ce75 31 1092 516 +1cea6 7 1093 516 +1cead 3 1097 516 +1ceb0 13 1100 516 +1cec3 10 1101 516 +1ced3 b 1102 516 +1cede b 1103 516 +1cee9 9 1106 516 +1cef2 3 1291 516 +1cef5 12 1292 516 +1cf07 11 1114 516 +1cf18 5 1117 516 +1cf1d b 1120 516 +1cf28 37 1125 516 +1cf5f 14 1274 516 +1cf73 c 1277 516 +1cf7f 8 1283 516 +1cf87 4 1284 516 +1cf8b 9 1286 516 +1cf94 c 1287 516 +1cfa0 5 1277 516 +1cfa5 e 1128 516 +1cfb3 7 1133 516 +1cfba 7 1132 516 +1cfc1 7 1130 516 +1cfc8 2 1131 516 +1cfca 5 1134 516 +1cfcf a 1156 516 +1cfd9 7 1158 516 +1cfe0 2 1159 516 +1cfe2 5 1160 516 +1cfe7 11 1175 516 +1cff8 5 1176 516 +1cffd 11 1177 516 +1d00e 6 1178 516 +1d014 2 1179 516 +1d016 5 1180 516 +1d01b b 1225 516 +1d026 13 1226 516 +1d039 4 1228 516 +1d03d 1a 1233 516 +1d057 9 1236 516 +1d060 8 1242 516 +1d068 4 1243 516 +1d06c 9 1246 516 +1d075 8 1247 516 +1d07d 5 1277 516 +1d082 1 1230 516 +1d083 5 1250 516 +1d088 12 1136 516 +1d09a 7 1141 516 +1d0a1 7 1140 516 +1d0a8 7 1138 516 +1d0af 2 1139 516 +1d0b1 5 1142 516 +1d0b6 29 1125 516 +1d0df e 1144 516 +1d0ed 7 1147 516 +1d0f4 2 1146 516 +1d0f6 5 1148 516 +1d0fb 7 1182 516 +1d102 b 1183 516 +1d10d 2 1184 516 +1d10f 6 1185 516 +1d115 12 1187 516 +1d127 17 1188 516 +1d13e c 1191 516 +1d14a 8 1197 516 +1d152 4 1198 516 +1d156 8 1201 516 +1d15e 2 1202 516 +1d160 5 1203 516 +1d165 9 1204 516 +1d16e 1a 1205 516 +1d188 9 1207 516 +1d191 8 1212 516 +1d199 4 1213 516 +1d19d 9 1215 516 +1d1a6 8 1216 516 +1d1ae 2 1220 516 +1d1b0 d 1168 516 +1d1bd 7 1170 516 +1d1c4 2 1171 516 +1d1c6 2 1172 516 +1d1c8 d 1162 516 +1d1d5 7 1164 516 +1d1dc 2 1165 516 +1d1de 2 1166 516 +1d1e0 d 1150 516 +1d1ed 7 1152 516 +1d1f4 2 1153 516 +1d1f6 1b 1268 516 +1d211 3 1272 516 +1d214 5 1273 516 +1d219 7 1194 516 +FUNC 1d220 1af 18 _Strftime_l +1d220 6 356 516 +1d226 4 361 516 +1d22a 13 362 516 +1d23d 33 364 516 +1d270 33 365 516 +1d2a3 d 368 516 +1d2b0 10 375 516 +1d2c0 e 385 516 +1d2ce a 387 516 +1d2d8 1e 435 516 +1d2f6 4 438 516 +1d2fa a 446 516 +1d304 5 447 516 +1d309 b 452 516 +1d314 3 453 516 +1d317 2 454 516 +1d319 7 400 516 +1d320 1 405 516 +1d321 2 408 516 +1d323 5 409 516 +1d328 1 411 516 +1d329 1 412 516 +1d32a 1d 415 516 +1d347 1 428 516 +1d348 5 385 516 +1d34d 5 464 516 +1d352 5 469 516 +1d357 13 470 516 +1d36a 3 441 516 +1d36d f 478 516 +1d37c b 481 516 +1d387 2 483 516 +1d389 b 402 516 +1d394 2 403 516 +1d396 5 421 516 +1d39b 7 423 516 +1d3a2 2 464 516 +1d3a4 18 485 516 +1d3bc 11 488 516 +1d3cd 2 490 516 +FUNC 1d3cf 1e 14 _strftime_l +1d3cf 3 291 516 +1d3d2 19 292 516 +1d3eb 2 293 516 +FUNC 1d3ed 1d 10 strftime +1d3ed 0 300 516 +1d3ed 1c 301 516 +1d409 1 302 516 +FUNC 1d40a 1e 14 _Strftime +1d40a 3 343 516 +1d40d 19 345 516 +1d426 2 346 516 +FUNC 1d428 26 0 localeconv +1d428 0 69 3302 +1d428 5 75 3302 +1d42d 1b 78 3302 +1d448 5 79 3302 +1d44d 1 80 3302 +FUNC 1d450 46 8 strcspn +1d450 4 191 924 +1d454 2 198 924 +1d456 1 199 924 +1d457 1 200 924 +1d458 1 201 924 +1d459 1 202 924 +1d45a 1 203 924 +1d45b 1 204 924 +1d45c 1 205 924 +1d45d 1 206 924 +1d45e 6 212 924 +1d464 2 216 924 +1d466 2 217 924 +1d468 2 218 924 +1d46a 3 219 924 +1d46d 4 220 924 +1d471 2 221 924 +1d473 3 227 924 +1d476 6 229 924 +1d47c 3 234 924 +1d47f 2 236 924 +1d481 2 237 924 +1d483 2 238 924 +1d485 3 239 924 +1d488 4 240 924 +1d48c 2 245 924 +1d48e 2 255 924 +1d490 3 257 924 +1d493 3 259 924 +FUNC 1d496 60 c TranslateName +1d496 3 340 3849 +1d499 3 342 3849 +1d49c 3 343 3849 +1d49f b 346 3849 +1d4aa a 348 3849 +1d4b4 14 349 3849 +1d4c8 6 351 3849 +1d4ce a 352 3849 +1d4d8 2 353 3849 +1d4da 4 354 3849 +1d4de 2 355 3849 +1d4e0 3 356 3849 +1d4e3 7 346 3849 +1d4ea a 359 3849 +1d4f4 2 360 3849 +FUNC 1d4f6 14 0 GetLcidFromDefault +1d4f6 0 761 3849 +1d4f6 7 762 3849 +1d4fd c 763 3849 +1d509 1 764 3849 +FUNC 1d50a 77 0 ProcessCodePage +1d50a 13 784 3849 +1d51d 1a 787 3849 +1d537 11 795 3849 +1d548 8 799 3849 +1d550 2 801 3849 +1d552 18 791 3849 +1d56a 3 793 3849 +1d56d 7 805 3849 +1d574 d 806 3849 +FUNC 1d581 1e 4 TestDefaultCountry +1d581 0 826 3849 +1d581 2 830 3849 +1d583 15 832 3849 +1d598 3 835 3849 +1d59b 1 836 3849 +1d59c 2 833 3849 +1d59e 1 836 3849 +FUNC 1d59f 32 0 LcidFromHexString +1d59f 1 893 3849 +1d5a0 2 895 3849 +1d5a2 2 897 3849 +1d5a4 9 899 3849 +1d5ad 5 900 3849 +1d5b2 8 901 3849 +1d5ba 3 902 3849 +1d5bd 10 903 3849 +1d5cd 3 906 3849 +1d5d0 1 907 3849 +FUNC 1d5d1 1b 0 GetPrimaryLen +1d5d1 0 926 3849 +1d5d1 2 927 3849 +1d5d3 3 930 3849 +1d5d6 12 931 3849 +1d5e8 1 933 3849 +1d5e9 2 935 3849 +1d5eb 1 938 3849 +FUNC 1d5ec 96 4 CountryEnumProc +1d5ec 15 717 3849 +1d601 7 718 3849 +1d608 f 719 3849 +1d617 23 725 3849 +1d63a 3 728 3849 +1d63d 3 729 3849 +1d640 12 731 3849 +1d652 b 734 3849 +1d65d a 738 3849 +1d667 b 741 3849 +1d672 10 742 3849 +FUNC 1d682 72 8 TestDefaultLanguage +1d682 11 858 3849 +1d693 22 864 3849 +1d6b5 4 865 3849 +1d6b9 d 867 3849 +1d6c6 1c 871 3849 +1d6e2 2 872 3849 +1d6e4 3 874 3849 +1d6e7 d 875 3849 +FUNC 1d6f4 1d0 4 LangCountryEnumProc +1d6f4 16 435 3849 +1d70a 7 436 3849 +1d711 d 437 3849 +1d71e 27 444 3849 +1d745 4 447 3849 +1d749 8 448 3849 +1d751 16 450 3849 +1d767 1d 456 3849 +1d784 2 460 3849 +1d786 11 462 3849 +1d797 7 467 3849 +1d79e 5 468 3849 +1d7a3 6 472 3849 +1d7a9 1a 475 3849 +1d7c3 14 482 3849 +1d7d7 3 483 3849 +1d7da a 487 3849 +1d7e4 b 490 3849 +1d7ef 6 493 3849 +1d7f5 3 494 3849 +1d7f8 12 501 3849 +1d80a 1d 506 3849 +1d827 6 510 3849 +1d82d c 513 3849 +1d839 16 518 3849 +1d84f 8 522 3849 +1d857 14 528 3849 +1d86b 2 531 3849 +1d86d 2 540 3849 +1d86f 1b 550 3849 +1d88a f 553 3849 +1d899 7 557 3849 +1d8a0 5 558 3849 +1d8a5 3 559 3849 +1d8a8 b 566 3849 +1d8b3 11 567 3849 +FUNC 1d8c4 bf 4 LanguageEnumProc +1d8c4 15 624 3849 +1d8d9 7 625 3849 +1d8e0 f 626 3849 +1d8ef 23 632 3849 +1d912 3 635 3849 +1d915 3 636 3849 +1d918 11 639 3849 +1d929 7 643 3849 +1d930 2 650 3849 +1d932 1d 651 3849 +1d94f f 654 3849 +1d95e a 658 3849 +1d968 b 662 3849 +1d973 10 663 3849 +FUNC 1d983 2c 0 GetLcidFromCountry +1d983 0 686 3849 +1d983 10 687 3849 +1d993 11 689 3849 +1d9a4 6 693 3849 +1d9aa 4 694 3849 +1d9ae 1 695 3849 +FUNC 1d9af 65 0 GetLcidFromLangCountry +1d9af 0 386 3849 +1d9af 7 388 3849 +1d9b6 1a 389 3849 +1d9d0 5 390 3849 +1d9d5 17 392 3849 +1d9ec 10 394 3849 +1d9fc 13 402 3849 +1da0f 4 403 3849 +1da13 1 404 3849 +FUNC 1da14 3c 0 GetLcidFromLanguage +1da14 0 591 3849 +1da14 13 593 3849 +1da27 e 594 3849 +1da35 10 596 3849 +1da45 6 600 3849 +1da4b 4 601 3849 +1da4f 1 602 3849 +FUNC 1da50 1e3 c __get_qualified_locale +1da50 4 205 3849 +1da54 5 208 3849 +1da59 12 212 3849 +1da6b 7 215 3849 +1da72 5 217 3849 +1da77 3 222 3849 +1da7a f 223 3849 +1da89 10 226 3849 +1da99 d 230 3849 +1daa6 a 232 3849 +1dab0 5 235 3849 +1dab5 2 237 3849 +1dab7 5 240 3849 +1dabc 5 243 3849 +1dac1 14 248 3849 +1dad5 a 250 3849 +1dadf 5 252 3849 +1dae4 2 254 3849 +1dae6 5 256 3849 +1daeb 2 261 3849 +1daed a 263 3849 +1daf7 28 266 3849 +1db1f 2 268 3849 +1db21 13 271 3849 +1db34 3 277 3849 +1db37 6 278 3849 +1db3d 17 281 3849 +1db54 32 285 3849 +1db86 d 289 3849 +1db93 6 290 3849 +1db99 8 293 3849 +1dba1 7 295 3849 +1dba8 8 296 3849 +1dbb0 4 297 3849 +1dbb4 8 301 3849 +1dbbc d 305 3849 +1dbc9 23 306 3849 +1dbec 2 307 3849 +1dbee f 308 3849 +1dbfd 2 309 3849 +1dbff 12 311 3849 +1dc11 2 312 3849 +1dc13 14 313 3849 +1dc27 5 315 3849 +1dc2c 6 286 3849 +1dc32 1 316 3849 +FUNC 1dc33 12 0 cmpResult +FUNC 1dc45 18 0 cmpBYTE +FUNC 1dc5d 40 0 cmpWORD +FUNC 1dc9d 78 0 cmpDWORD +FUNC 1dd15 1490 0 unaligned_memcmp +FUNC 1f1a5 1680 c memcmp +FUNC 20825 be c strncmp +20825 4 42 876 +20829 5 43 876 +2082e 7 45 876 +20835 7 46 876 +2083c 6 48 876 +20842 d 51 876 +2084f 11 56 876 +20860 c 61 876 +2086c c 66 876 +20878 15 71 876 +2088d 2 81 876 +2088f a 73 876 +20899 a 68 876 +208a3 a 63 876 +208ad 10 58 876 +208bd 2 79 876 +208bf a 81 876 +208c9 1 85 876 +208ca 4 86 876 +208ce 5 79 876 +208d3 4 89 876 +208d7 2 90 876 +208d9 a 83 876 +FUNC 208f0 40 8 strpbrk +208f0 4 191 869 +208f4 2 198 869 +208f6 1 199 869 +208f7 1 200 869 +208f8 1 201 869 +208f9 1 202 869 +208fa 1 203 869 +208fb 1 204 869 +208fc 1 205 869 +208fd 1 206 869 +208fe 6 212 869 +20904 2 216 869 +20906 2 217 869 +20908 2 218 869 +2090a 3 219 869 +2090d 4 220 869 +20911 2 221 869 +20913 5 227 869 +20918 2 236 869 +2091a 2 237 869 +2091c 2 238 869 +2091e 3 239 869 +20921 4 240 869 +20925 2 247 869 +20927 3 248 869 +2092a 3 257 869 +2092d 3 259 869 +FUNC 20930 82 c _iswctype_l +20930 6 66 6445 +20936 8 69 6445 +2093e 6 70 6445 +20944 8 71 6445 +2094c 18 72 6445 +20964 2 73 6445 +20966 b 75 6445 +20971 25 85 6445 +20996 3 86 6445 +20999 d 87 6445 +209a6 a 89 6445 +209b0 2 90 6445 +FUNC 209b2 6e 8 iswctype +209b2 4 96 6445 +209b6 8 97 6445 +209be 2 99 6445 +209c0 2 122 6445 +209c2 8 101 6445 +209ca 14 103 6445 +209de 2 122 6445 +209e0 9 106 6445 +209e9 25 117 6445 +20a0e 10 121 6445 +20a1e 2 122 6445 +FUNC 20a20 5 8 is_wctype +20a20 0 148 6445 +20a20 5 149 6445 +FUNC 20a25 22b 14 strtoxl +20a25 8 80 6309 +20a2d b 86 6309 +20a38 3 89 6309 +20a3b b 92 6309 +20a46 30 94 6309 +20a76 11 95 6309 +20a87 c 100 6309 +20a93 34 101 6309 +20ac7 5 102 6309 +20acc 5 104 6309 +20ad1 4 105 6309 +20ad5 2 106 6309 +20ad7 5 108 6309 +20adc 3 109 6309 +20adf 1d 111 6309 +20afc 4 118 6309 +20b00 5 121 6309 +20b05 9 122 6309 +20b0e a 123 6309 +20b18 9 126 6309 +20b21 7 124 6309 +20b28 2 129 6309 +20b2a 5 140 6309 +20b2f f 142 6309 +20b3e 1 143 6309 +20b3f 9 144 6309 +20b48 8 149 6309 +20b50 c 154 6309 +20b5c 8 155 6309 +20b64 7 156 6309 +20b6b 13 157 6309 +20b7e 5 160 6309 +20b83 4 164 6309 +20b87 b 171 6309 +20b92 4 177 6309 +20b96 6 178 6309 +20b9c 8 190 6309 +20ba4 6 193 6309 +20baa 3 195 6309 +20bad 4 196 6309 +20bb1 2 198 6309 +20bb3 c 173 6309 +20bbf 3 185 6309 +20bc2 2 186 6309 +20bc4 24 201 6309 +20be8 5 204 6309 +20bed c 205 6309 +20bf9 6 206 6309 +20bff 10 207 6309 +20c0f 7 213 6309 +20c16 2 215 6309 +20c18 6 217 6309 +20c1e 3 219 6309 +20c21 12 221 6309 +20c33 7 113 6309 +20c3a 2 115 6309 +20c3c 12 116 6309 +20c4e 2 222 6309 +FUNC 20c50 29 c strtol +20c50 3 229 6309 +20c53 8 230 6309 +20c5b 13 232 6309 +20c6e 9 236 6309 +20c77 2 238 6309 +FUNC 20c79 1b 10 _strtol_l +20c79 0 246 6309 +20c79 1a 247 6309 +20c93 1 248 6309 +FUNC 20c94 2a c strtoul +20c94 3 255 6309 +20c97 7 256 6309 +20c9e 14 258 6309 +20cb2 a 262 6309 +20cbc 2 264 6309 +FUNC 20cbe 1b 10 _strtoul_l +20cbe 0 272 6309 +20cbe 1a 273 6309 +20cd8 1 274 6309 +FUNC 20cd9 1f 0 __initconin +20cd9 0 58 5008 +20cd9 1e 65 5008 +20cf7 1 67 5008 +FUNC 20cf8 1f 0 __initconout +20cf8 0 90 5008 +20cf8 1e 97 5008 +20d16 1 98 5008 +FUNC 20d17 2d 0 __termcon +20d17 0 120 5008 +20d17 16 121 5008 +20d2d 3 122 5008 +20d30 f 125 5008 +20d3f 4 126 5008 +20d43 1 128 5008 +FUNC 20d44 94 4 _close_nolock +20d44 1 72 5094 +20d45 54 93 5094 +20d99 a 99 5094 +20da3 2 96 5094 +20da5 6 101 5094 +20dab b 103 5094 +20db6 11 105 5094 +20dc7 7 107 5094 +20dce 5 108 5094 +20dd3 4 111 5094 +20dd7 1 112 5094 +FUNC 20dd8 cd 4 _close +20dd8 c 42 5094 +20de4 23 46 5094 +20e07 2f 47 5094 +20e36 20 48 5094 +20e56 7 50 5094 +20e5d 3 52 5094 +20e60 9 53 5094 +20e69 c 54 5094 +20e75 2 55 5094 +20e77 b 56 5094 +20e82 4 57 5094 +20e86 c 61 5094 +20e92 3 65 5094 +20e95 6 66 5094 +20e9b a 62 5094 +FUNC 20ea5 2c 4 _freebuf +20ea5 1 47 1927 +20ea6 f 50 1927 +20eb5 8 52 1927 +20ebd 7 54 1927 +20ec4 8 55 1927 +20ecc 4 56 1927 +20ed0 1 58 1927 +FUNC 20ed1 2a 0 _purecall +20ed1 0 43 3119 +20ed1 b 44 3119 +20edc 5 45 3119 +20ee1 2 47 3119 +20ee3 7 54 3119 +20eea c 56 3119 +20ef6 5 57 3119 +FUNC 20efb 22 4 _set_purecall_handler +20efb 1 82 3119 +20efc b 85 3119 +20f07 12 86 3119 +20f19 3 88 3119 +20f1c 1 89 3119 +FUNC 20f1d d 0 _get_purecall_handler +20f1d 0 92 3119 +20f1d c 93 3119 +20f29 1 94 3119 +FUNC 20f30 34 0 _allmul +20f30 0 47 5116 +20f30 4 62 5116 +20f34 4 63 5116 +20f38 2 64 5116 +20f3a 4 65 5116 +20f3e 2 66 5116 +20f40 4 68 5116 +20f44 2 69 5116 +20f46 3 71 5116 +20f49 1 74 5116 +20f4a 2 81 5116 +20f4c 2 82 5116 +20f4e 4 84 5116 +20f52 4 85 5116 +20f56 2 86 5116 +20f58 4 88 5116 +20f5c 2 89 5116 +20f5e 2 90 5116 +20f60 1 92 5116 +20f61 3 94 5116 +FUNC 20f64 11 4 atol +20f64 0 55 6631 +20f64 10 56 6631 +20f74 1 57 6631 +FUNC 20f75 15 8 _atol_l +20f75 0 64 6631 +20f75 14 65 6631 +20f89 1 66 6631 +FUNC 20f8a 5 4 atoi +20f8a 0 99 6631 +20f8a 5 100 6631 +FUNC 20f8f 5 8 _atoi_l +20f8f 0 107 6631 +20f8f 5 108 6631 +FUNC 20f94 11 4 _atoi64 +20f94 0 143 6631 +20f94 10 144 6631 +20fa4 1 145 6631 +FUNC 20fa5 15 8 _atoi64_l +20fa5 0 151 6631 +20fa5 14 152 6631 +20fb9 1 153 6631 +FUNC 20fba 50 0 has_osfxsr_set +FUNC 2100a 60 0 _get_sse2_info +FUNC 2106a d 0 __sse2_available_init +FUNC 21077 170 8 _flswbuf +21077 5 93 1980 +2107c c 104 1980 +21088 8 106 1980 +21090 b 107 1980 +2109b 4 108 1980 +2109f a 109 1980 +210a9 4 110 1980 +210ad b 111 1980 +210b8 2 113 1980 +210ba 4 124 1980 +210be 4 125 1980 +210c2 8 126 1980 +210ca 3 127 1980 +210cd 8 128 1980 +210d5 3 137 1980 +210d8 11 138 1980 +210e9 9 141 1980 +210f2 25 151 1980 +21117 7 153 1980 +2111e d 158 1980 +2112b 5 162 1980 +21130 5 163 1980 +21135 7 164 1980 +2113c 7 166 1980 +21143 10 167 1980 +21153 2 168 1980 +21155 6 131 1980 +2115b 5 132 1980 +21160 2e 169 1980 +2118e 13 171 1980 +211a1 2 174 1980 +211a3 9 181 1980 +211ac 2 186 1980 +211ae 1d 195 1980 +211cb 5 201 1980 +211d0 4 202 1980 +211d4 7 203 1980 +211db a 209 1980 +211e5 2 212 1980 +FUNC 211e7 182 4 _wchartodigit +211e7 0 32 6613 +211e7 1b 41 6613 +21202 1 73 6613 +21203 e 42 6613 +21211 19 44 6613 +2122a 1 73 6613 +2122b 14 45 6613 +2123f 14 46 6613 +21253 14 47 6613 +21267 14 48 6613 +2127b 14 49 6613 +2128f 14 50 6613 +212a3 18 51 6613 +212bb 18 52 6613 +212d3 18 53 6613 +212eb 14 54 6613 +212ff 14 55 6613 +21313 12 56 6613 +21325 14 57 6613 +21339 14 58 6613 +2134d c 59 6613 +21359 2 62 6613 +2135b 4 67 6613 +2135f 6 69 6613 +21365 3 71 6613 +21368 1 73 6613 +FUNC 21369 b6 c _isctype_l +21369 7 114 6399 +21370 b 118 6399 +2137b d 121 6399 +21388 f 122 6399 +21397 1f 124 6399 +213b6 3 126 6399 +213b9 d 129 6399 +213c6 2 130 6399 +213c8 a 133 6399 +213d2 26 144 6399 +213f8 10 146 6399 +21408 15 149 6399 +2141d 2 150 6399 +FUNC 2141f 2f 8 _isctype +2141f 0 156 6399 +2141f 9 157 6399 +21428 12 159 6399 +2143a 1 165 6399 +2143b 12 163 6399 +2144d 1 165 6399 +FUNC 21450 2c 0 _alloca_probe_16 +21450 0 44 2632 +21450 1 46 2632 +21451 4 47 2632 +21455 2 48 2632 +21457 3 49 2632 +2145a 2 50 2632 +2145c 2 51 2632 +2145e 2 52 2632 +21460 1 53 2632 +21461 5 54 2632 +21466 1 59 2632 +21467 4 60 2632 +2146b 2 61 2632 +2146d 3 62 2632 +21470 2 63 2632 +21472 2 64 2632 +21474 2 65 2632 +21476 1 66 2632 +21477 5 67 2632 +PUBLIC 21466 0 _alloca_probe_8 +FUNC 2147c 47 4 __ansicp +2147c 10 39 2934 +2148c 1c 44 2934 +214a8 3 45 2934 +214ab 2 46 2934 +214ad a 47 2934 +214b7 c 49 2934 +FUNC 214c3 1b2 18 __convertcp +214c3 16 79 2934 +214d9 10 83 2934 +214e9 18 85 2934 +21501 17 90 2934 +21518 13 92 2934 +2152b 6 93 2934 +21531 d 99 2934 +2153e 2 101 2934 +21540 c 103 2934 +2154c 2a 115 2934 +21576 15 111 2934 +2158b 7 112 2934 +21592 1c 115 2934 +215ae 3 116 2934 +215b1 2 117 2934 +215b3 10 119 2934 +215c3 15 127 2934 +215d8 7 129 2934 +215df 18 138 2934 +215f7 3 139 2934 +215fa 2 140 2934 +215fc 1f 149 2934 +2161b 11 151 2934 +2162c 12 160 2934 +2163e 9 162 2934 +21647 3 163 2934 +2164a 2 164 2934 +2164c 6 165 2934 +21652 5 166 2934 +21657 9 174 2934 +21660 3 177 2934 +21663 12 178 2934 +FUNC 21675 34 4 _get_daylight +21675 0 35 487 +21675 27 36 487 +2169c 1 41 487 +2169d 8 39 487 +216a5 3 40 487 +216a8 1 41 487 +FUNC 216a9 34 4 _get_dstbias +216a9 0 44 487 +216a9 27 45 487 +216d0 1 50 487 +216d1 8 48 487 +216d9 3 49 487 +216dc 1 50 487 +FUNC 216dd 34 4 _get_timezone +216dd 0 53 487 +216dd 27 54 487 +21704 1 59 487 +21705 8 57 487 +2170d 3 58 487 +21710 1 59 487 +FUNC 21711 a2 10 _get_tzname +21711 3 62 487 +21714 10 63 487 +21724 4 64 487 +21728 3 66 487 +2172b 7 68 487 +21732 27 69 487 +21759 20 63 487 +21779 f 72 487 +21788 8 73 487 +21790 4 76 487 +21794 5 78 487 +21799 5 80 487 +2179e 13 82 487 +217b1 2 83 487 +FUNC 217b3 6 0 __daylight +217b3 0 118 487 +217b3 5 119 487 +217b8 1 120 487 +FUNC 217b9 6 0 __dstbias +217b9 0 123 487 +217b9 5 124 487 +217be 1 125 487 +FUNC 217bf 6 0 __timezone +217bf 0 128 487 +217bf 5 129 487 +217c4 1 130 487 +FUNC 217c5 6 0 __tzname +217c5 0 133 487 +217c5 5 134 487 +217ca 1 135 487 +FUNC 217cb c 4 _set_daylight +217cb c 189 418 +FUNC 217d7 c 4 _set_dstbias +217d7 c 190 418 +FUNC 217e3 c 4 _set_timezone +217e3 c 191 418 +FUNC 217ef 349 0 _tzset_nolock +217ef c 124 440 +217fb 5 127 440 +21800 3 129 440 +21803 3 130 440 +21806 3 131 440 +21809 3 132 440 +2180c 3 133 440 +2180f 8 135 440 +21817 3 136 440 +2181a 8 139 440 +21822 1b 142 440 +2183d 1b 143 440 +21858 1b 144 440 +21873 8 149 440 +2187b 6 154 440 +21881 f 160 440 +21890 18 165 440 +218a8 14 260 440 +218bc b 268 440 +218c7 4 274 440 +218cb 7 275 440 +218d2 16 277 440 +218e8 6 281 440 +218ee 32 283 440 +21920 9 174 440 +21929 7 175 440 +21930 6 176 440 +21936 13 179 440 +21949 9 183 440 +21952 b 188 440 +2195d 9 190 440 +21966 e 191 440 +21974 12 199 440 +21986 3 201 440 +21989 c 203 440 +21995 2 205 440 +21997 3 206 440 +2199a 3 214 440 +2199d 27 234 440 +219c4 8 235 440 +219cc 2 236 440 +219ce 7 237 440 +219d5 23 247 440 +219f8 9 248 440 +21a01 2 249 440 +21a03 8 250 440 +21a0b 7 256 440 +21a12 a 288 440 +21a1c a 289 440 +21a26 a 290 440 +21a30 c 292 440 +21a3c 9 296 440 +21a45 23 301 440 +21a68 8 310 440 +21a70 7 311 440 +21a77 1 312 440 +21a78 10 318 440 +21a88 11 320 440 +21a99 5 292 440 +21a9e 9 293 440 +21aa7 5 325 440 +21aac e 329 440 +21aba d 330 440 +21ac7 5 335 440 +21acc b 339 440 +21ad7 d 340 440 +21ae4 5 344 440 +21ae9 3 345 440 +21aec 6 350 440 +21af2 4 351 440 +21af6 21 352 440 +21b17 2 354 440 +21b19 5 355 440 +21b1e a 357 440 +21b28 a 358 440 +21b32 6 360 440 +FUNC 21b38 1f5 24 cvtdate +21b38 6 409 440 +21b3e 4 412 440 +21b42 c 414 440 +21b4e 52 424 440 +21ba0 4c 430 440 +21bec 14 436 440 +21c00 2 437 440 +21c02 2 438 440 +21c04 46 447 440 +21c4a 3 449 440 +21c4d 2 452 440 +21c4f 3c 457 440 +21c8b 3 459 440 +21c8e 27 467 440 +21cb5 6 472 440 +21cbb 2 474 440 +21cbd 29 485 440 +21ce6 11 486 440 +21cf7 a 487 440 +21d01 8 488 440 +21d09 d 490 440 +21d16 6 491 440 +21d1c 6 492 440 +21d22 9 499 440 +21d2b 2 503 440 +FUNC 21d2d 1ae 0 _isindst_nolock +21d2d 5 554 440 +21d32 20 558 440 +21d52 5 560 440 +21d57 7 561 440 +21d5e 1b 568 440 +21d79 c 569 440 +21d85 7 573 440 +21d8c 34 584 440 +21dc0 2 585 440 +21dc2 19 596 440 +21ddb 40 611 440 +21e1b 2 612 440 +21e1d 1e 623 440 +21e3b 2 626 440 +21e3d 14 641 440 +21e51 1a 653 440 +21e6b d 660 440 +21e78 d 664 440 +21e85 8 666 440 +21e8d 4 674 440 +21e91 2 697 440 +21e93 8 673 440 +21e9b 8 675 440 +21ea3 4 676 440 +21ea7 14 679 440 +21ebb 4 681 440 +21ebf b 682 440 +21eca 2 685 440 +21ecc d 691 440 +21ed9 2 694 440 +FUNC 21edb 4f 0 __tzset +21edb c 85 440 +21ee7 a 88 440 +21ef1 8 90 440 +21ef9 3 91 440 +21efc 8 93 440 +21f04 5 94 440 +21f09 6 95 440 +21f0f c 98 440 +21f1b 6 103 440 +21f21 9 99 440 +FUNC 21f2a 38 0 _tzset +21f2a c 109 440 +21f36 8 110 440 +21f3e 4 111 440 +21f42 5 113 440 +21f47 c 115 440 +21f53 6 118 440 +21f59 9 116 440 +FUNC 21f62 41 4 _isindst +21f62 c 538 440 +21f6e 8 541 440 +21f76 4 542 440 +21f7a b 543 440 +21f85 c 544 440 +21f91 3 548 440 +21f94 6 549 440 +21f9a 9 545 440 +FUNC 21fa3 35 8 __ascii_stricmp +21fa3 a 75 693 +21fad c 80 693 +21fb9 3 81 693 +21fbc c 82 693 +21fc8 3 83 693 +21fcb 9 85 693 +21fd4 3 87 693 +21fd7 1 88 693 +FUNC 21fd8 d3 c _stricmp_l +21fd8 7 47 693 +21fdf b 49 693 +21fea 36 52 693 +22020 32 53 693 +22052 8 55 693 +2205a e 57 693 +22068 15 63 693 +2207d 11 64 693 +2208e 8 65 693 +22096 13 68 693 +220a9 2 69 693 +FUNC 220ab 50 8 _stricmp +220ab 4 94 693 +220af a 95 693 +220b9 24 98 693 +220dd 6 99 693 +220e3 1 107 693 +220e4 5 101 693 +220e9 10 105 693 +220f9 2 107 693 +FUNC 220fb f0 10 _strnicmp_l +220fb 7 51 650 +22102 d 54 650 +2210f b 56 650 +2211a 33 59 650 +2214d 7 60 650 +22154 32 61 650 +22186 8 63 650 +2218e 1d 65 650 +221ab 15 71 650 +221c0 11 72 650 +221d1 d 74 650 +221de 6 76 650 +221e4 5 79 650 +221e9 2 80 650 +FUNC 221eb 5c c _strnicmp +221eb 4 125 650 +221ef a 127 650 +221f9 24 130 650 +2221d 5 131 650 +22222 a 132 650 +2222c 1 141 650 +2222d 5 134 650 +22232 13 138 650 +22245 2 141 650 +FUNC 22247 db c xtoa_s +22247 8 93 6581 +2224f 24 102 6581 +22273 24 103 6581 +22297 19 105 6581 +222b0 b 106 6581 +222bb a 112 6581 +222c5 6 114 6581 +222cb 7 116 6581 +222d2 2 118 6581 +222d4 2 121 6581 +222d6 5 124 6581 +222db 5 128 6581 +222e0 3 129 6581 +222e3 2 130 6581 +222e5 6 131 6581 +222eb 3 135 6581 +222ee e 136 6581 +222fc 8 139 6581 +22304 2 141 6581 +22306 2 142 6581 +22308 3 148 6581 +2230b 6 152 6581 +22311 3 154 6581 +22314 1 155 6581 +22315 4 156 6581 +22319 5 158 6581 +2231e 4 160 6581 +FUNC 22322 28 10 _itoa_s +22322 3 172 6581 +22325 d 175 6581 +22332 4 176 6581 +22336 2 177 6581 +22338 10 178 6581 +22348 2 181 6581 +FUNC 2234a 25 10 _ltoa_s +2234a 3 189 6581 +2234d 20 190 6581 +2236d 2 191 6581 +FUNC 2236f 18 10 _ultoa_s +2236f 0 199 6581 +2236f 17 200 6581 +22386 1 201 6581 +FUNC 22387 f6 14 x64toa_s +22387 7 309 6581 +2238e 25 318 6581 +223b3 5 319 6581 +223b8 19 321 6581 +223d1 b 322 6581 +223dc 3 327 6581 +223df 20 333 6581 +223ff 3 336 6581 +22402 1e 352 6581 +22420 3 344 6581 +22423 2 345 6581 +22425 5 346 6581 +2242a 5 351 6581 +2242f 13 352 6581 +22442 5 355 6581 +22447 3 357 6581 +2244a 13 358 6581 +2245d 4 364 6581 +22461 9 368 6581 +2246a 3 370 6581 +2246d 1 371 6581 +2246e 7 372 6581 +22475 4 375 6581 +22479 4 377 6581 +FUNC 2247d 33 14 _i64toa_s +2247d 3 390 6581 +22480 2e 391 6581 +224ae 2 392 6581 +FUNC 224b0 1d 14 _ui64toa_s +224b0 4 400 6581 +224b4 17 401 6581 +224cb 2 402 6581 +FUNC 224cd 224 1c __crtGetStringTypeW_stat +224cd 10 64 2828 +224dd 9 72 2828 +224e6 7 73 2828 +224ed 14 75 2828 +22501 11 79 2828 +22512 8 80 2828 +2251a b 82 2828 +22525 f 83 2828 +22534 4 88 2828 +22538 13 90 2828 +2254b 7 95 2828 +22552 2 199 2828 +22554 8 119 2828 +2255c b 120 2828 +22567 5 121 2828 +2256c b 122 2828 +22577 e 128 2828 +22585 5 130 2828 +2258a 3 131 2828 +2258d 1d 142 2828 +225aa 6 143 2828 +225b0 40 146 2828 +225f0 3 147 2828 +225f3 6 148 2828 +225f9 d 150 2828 +22606 1a 160 2828 +22620 4d 164 2828 +2266d 4 165 2828 +22671 5 170 2828 +22676 b 171 2828 +22681 3 174 2828 +22684 23 178 2828 +226a7 12 186 2828 +226b9 f 189 2828 +226c8 4 187 2828 +226cc 7 191 2828 +226d3 8 194 2828 +226db 4 196 2828 +226df 12 200 2828 +FUNC 226f1 3e 1c __crtGetStringTypeW +226f1 6 211 2828 +226f7 b 212 2828 +22702 2b 222 2828 +2272d 2 223 2828 +FUNC 2272f 294 14 strtoxq +2272f 8 80 6264 +22737 b 86 6264 +22742 3 89 6264 +22745 b 92 6264 +22750 31 94 6264 +22781 12 95 6264 +22793 c 100 6264 +2279f 37 102 6264 +227d6 2 103 6264 +227d8 9 105 6264 +227e1 4 106 6264 +227e5 2 107 6264 +227e7 6 109 6264 +227ed 9 110 6264 +227f6 8 112 6264 +227fe 6 115 6264 +22804 9 116 6264 +2280d a 117 6264 +22817 9 120 6264 +22820 3 118 6264 +22823 5 123 6264 +22828 10 125 6264 +22838 1 126 6264 +22839 9 127 6264 +22842 26 132 6264 +22868 e 137 6264 +22876 8 138 6264 +2287e 6 139 6264 +22884 11 140 6264 +22895 5 143 6264 +2289a 31 154 6264 +228cb 4 160 6264 +228cf 6 161 6264 +228d5 a 173 6264 +228df 7 176 6264 +228e6 6 178 6264 +228ec 6 179 6264 +228f2 5 181 6264 +228f7 19 156 6264 +22910 b 168 6264 +2291b 5 169 6264 +22920 35 184 6264 +22955 5 187 6264 +2295a c 188 6264 +22966 a 189 6264 +22970 6 190 6264 +22976 7 191 6264 +2297d 2 192 6264 +2297f 7 193 6264 +22986 8 195 6264 +2298e 5 197 6264 +22993 6 199 6264 +22999 13 201 6264 +229ac 15 203 6264 +229c1 2 204 6264 +FUNC 229c3 29 c _strtoi64 +229c3 3 211 6264 +229c6 8 212 6264 +229ce 13 214 6264 +229e1 9 218 6264 +229ea 2 220 6264 +FUNC 229ec 1b 10 _strtoi64_l +229ec 0 227 6264 +229ec 1a 228 6264 +22a06 1 229 6264 +FUNC 22a07 2a c _strtoui64 +22a07 3 236 6264 +22a0a 7 237 6264 +22a11 14 239 6264 +22a25 a 243 6264 +22a2f 2 245 6264 +FUNC 22a31 1b 10 _strtoui64_l +22a31 0 253 6264 +22a31 1a 254 6264 +22a4b 1 255 6264 +FUNC 22a50 2b 0 _chkstk +22a50 0 65 2634 +22a50 1 69 2634 +22a51 4 73 2634 +22a55 2 74 2634 +22a57 2 79 2634 +22a59 2 80 2634 +22a5b 2 81 2634 +22a5d 2 83 2634 +22a5f 5 84 2634 +22a64 2 87 2634 +22a66 2 88 2634 +22a68 2 89 2634 +22a6a 1 90 2634 +22a6b 1 91 2634 +22a6c 2 92 2634 +22a6e 3 93 2634 +22a71 1 94 2634 +22a72 5 98 2634 +22a77 2 99 2634 +22a79 2 100 2634 +FUNC 22a7b 81 4 _getenv_helper_nolock +22a7b 0 95 3904 +22a7b 10 103 3904 +22a8b 3 104 3904 +22a8e 1 169 3904 +22a8f e 128 3904 +22a9d 7 131 3904 +22aa4 2 132 3904 +22aa6 6 135 3904 +22aac c 140 3904 +22ab8 9 142 3904 +22ac1 2 150 3904 +22ac3 22 154 3904 +22ae5 3 164 3904 +22ae8 6 150 3904 +22aee 5 168 3904 +22af3 9 169 3904 +FUNC 22afc 93 c _getenv_s_helper +22afc 7 220 3904 +22b03 21 224 3904 +22b24 15 226 3904 +22b39 4 227 3904 +22b3d 3 229 3904 +22b40 a 233 3904 +22b4a 3 234 3904 +22b4d 2 236 3904 +22b4f 7 239 3904 +22b56 6 240 3904 +22b5c 2 243 3904 +22b5e 5 246 3904 +22b63 5 251 3904 +22b68 20 254 3904 +22b88 5 256 3904 +22b8d 2 257 3904 +FUNC 22b8f a2 8 _dupenv_s_helper +22b8f 6 339 3904 +22b95 21 344 3904 +22bb6 9 346 3904 +22bbf 2 348 3904 +22bc1 5 350 3904 +22bc6 8 352 3904 +22bce 6 353 3904 +22bd4 2 355 3904 +22bd6 9 358 3904 +22bdf b 362 3904 +22bea 6 364 3904 +22bf0 b 366 3904 +22bfb 9 367 3904 +22c04 1e 370 3904 +22c22 7 371 3904 +22c29 2 373 3904 +22c2b 4 375 3904 +22c2f 2 376 3904 +FUNC 22c31 83 4 getenv +22c31 c 75 3904 +22c3d 2a 78 3904 +22c67 18 79 3904 +22c7f 8 81 3904 +22c87 3 82 3904 +22c8a c 83 3904 +22c96 c 85 3904 +22ca2 3 89 3904 +22ca5 6 90 3904 +22cab 9 86 3904 +FUNC 22cb4 d8 10 getenv_s +22cb4 c 198 3904 +22cc0 8 201 3904 +22cc8 5 202 3904 +22ccd a1 203 3904 +22d6e c 205 3904 +22d7a 3 209 3904 +22d7d 6 210 3904 +22d83 9 206 3904 +FUNC 22d8c e6 c _dupenv_s +22d8c c 303 3904 +22d98 8 306 3904 +22da0 5 307 3904 +22da5 af 311 3904 +22e54 c 314 3904 +22e60 3 318 3904 +22e63 6 319 3904 +22e69 9 315 3904 +FUNC 22e72 8 4 _tolower +22e72 0 48 6218 +22e72 7 49 6218 +22e79 1 50 6218 +FUNC 22e7a 117 8 _tolower_l +22e7a 8 70 6218 +22e82 b 74 6218 +22e8d c 77 6218 +22e99 31 79 6218 +22eca f 80 6218 +22ed9 14 82 6218 +22eed 2b 86 6218 +22f18 3 88 6218 +22f1b d 91 6218 +22f28 2 92 6218 +22f2a b 94 6218 +22f35 a 97 6218 +22f3f 25 110 6218 +22f64 6 112 6218 +22f6a 5 116 6218 +22f6f 6 117 6218 +22f75 1a 119 6218 +22f8f 2 120 6218 +FUNC 22f91 27 4 tolower +22f91 0 143 6218 +22f91 9 145 6218 +22f9a f 147 6218 +22fa9 1 153 6218 +22faa d 151 6218 +22fb7 1 153 6218 +FUNC 22fc0 61 c __ascii_strnicmp +22fc0 6 69 871 +22fc6 3 75 871 +22fc9 2 76 871 +22fcb 2 77 871 +22fcd 3 79 871 +22fd0 3 80 871 +22fd3 2 82 871 +22fd5 2 83 871 +22fd7 5 84 871 +22fdc 2 89 871 +22fde 2 91 871 +22fe0 2 93 871 +22fe2 2 95 871 +22fe4 2 97 871 +22fe6 2 98 871 +22fe8 3 100 871 +22feb 3 101 871 +22fee 2 103 871 +22ff0 2 104 871 +22ff2 2 106 871 +22ff4 2 107 871 +22ff6 2 109 871 +22ff8 2 112 871 +22ffa 2 113 871 +22ffc 2 115 871 +22ffe 2 116 871 +23000 2 118 871 +23002 2 121 871 +23004 2 122 871 +23006 3 124 871 +23009 2 125 871 +2300b 2 128 871 +2300d 2 129 871 +2300f 2 130 871 +23011 5 133 871 +23016 2 134 871 +23018 2 135 871 +2301a 2 138 871 +2301c 5 140 871 +FUNC 23021 ec 10 _mbsnbicoll_l +23021 7 53 4518 +23028 b 55 4518 +23033 9 57 4518 +2303c 13 58 4518 +2304f 33 61 4518 +23082 6 62 4518 +23088 23 63 4518 +230ab 8 65 4518 +230b3 14 66 4518 +230c7 23 74 4518 +230ea 10 75 4518 +230fa 11 77 4518 +2310b 2 79 4518 +FUNC 2310d 17 c _mbsnbicoll +2310d 0 85 4518 +2310d 16 86 4518 +23123 1 87 4518 +FUNC 23124 95 0 __wtomb_environ +23124 7 43 2699 +2312b 3 44 2699 +2312e 9 45 2699 +23137 c 52 2699 +23143 12 57 2699 +23155 11 61 2699 +23166 12 65 2699 +23178 10 72 2699 +23188 5 74 2699 +2318d 9 76 2699 +23196 3 77 2699 +23199 9 81 2699 +231a2 5 84 2699 +231a7 2 85 2699 +231a9 5 58 2699 +231ae 9 67 2699 +231b7 2 68 2699 +FUNC 231b9 1a 8 strnlen +231b9 0 38 864 +231b9 19 45 864 +231d2 1 49 864 +FUNC 231d3 1a 4 strncnt +231d3 0 50 4345 +231d3 6 51 4345 +231d9 6 54 4345 +231df 1 55 4345 +231e0 5 54 4345 +231e5 7 57 4345 +231ec 1 58 4345 +FUNC 231ed 389 18 __crtCompareStringA_stat +231ed 10 96 4345 +231fd 31 280 4345 +2322e c 107 4345 +2323a b 109 4345 +23245 a 110 4345 +2324f 5 118 4345 +23254 1b 119 4345 +2326f 7 122 4345 +23276 1f 123 4345 +23295 6 120 4345 +2329b 7 121 4345 +232a2 3 124 4345 +232a5 2 125 4345 +232a7 17 130 4345 +232be 7 189 4345 +232c5 8 201 4345 +232cd 8 202 4345 +232d5 d 208 4345 +232e2 5 214 4345 +232e7 8 215 4345 +232ef 2 218 4345 +232f1 6 219 4345 +232f7 5 222 4345 +232fc 4 223 4345 +23300 f 231 4345 +2330f 2 232 4345 +23311 5 237 4345 +23316 4 239 4345 +2331a 2 240 4345 +2331c 10 244 4345 +2332c a 246 4345 +23336 7 244 4345 +2333d 2 262 4345 +2333f 5 253 4345 +23344 6 255 4345 +2334a 8 256 4345 +23352 10 260 4345 +23362 11 262 4345 +23373 7 260 4345 +2337a 2 262 4345 +2337c 1a 280 4345 +23396 6 281 4345 +2339c 4d 284 4345 +233e9 4 285 4345 +233ed 6 286 4345 +233f3 19 295 4345 +2340c 17 305 4345 +23423 46 309 4345 +23469 4 310 4345 +2346d 13 320 4345 +23480 17 326 4345 +23497 7 328 4345 +2349e 8 331 4345 +234a6 9 333 4345 +234af 4 132 4345 +234b3 5 137 4345 +234b8 8 138 4345 +234c0 5 139 4345 +234c5 8 140 4345 +234cd e 142 4345 +234db 6 143 4345 +234e1 5 148 4345 +234e6 19 155 4345 +234ff 2 156 4345 +23501 6 157 4345 +23507 19 163 4345 +23520 4 164 4345 +23524 7 166 4345 +2352b 5 167 4345 +23530 3 169 4345 +23533 3 170 4345 +23536 18 178 4345 +2354e 6 179 4345 +23554 6 181 4345 +2355a 8 182 4345 +23562 2 184 4345 +23564 12 337 4345 +FUNC 23576 40 20 __crtCompareStringA +23576 6 349 4345 +2357c b 350 4345 +23587 2d 361 4345 +235b4 2 362 4345 +FUNC 235b6 f8 10 _strnicoll_l +235b6 7 55 603 +235bd b 57 603 +235c8 9 59 603 +235d1 13 60 603 +235e4 33 63 603 +23617 6 64 603 +2361d 23 65 603 +23640 a 67 603 +2364a 15 68 603 +2365f 21 78 603 +23680 b 80 603 +2368b 10 81 603 +2369b 11 84 603 +236ac 2 85 603 +FUNC 236ae 27 c _strnicoll +236ae 3 92 603 +236b1 9 93 603 +236ba 1 101 603 +236bb 5 95 603 +236c0 13 99 603 +236d3 2 101 603 +FUNC 236d5 4d 4 findenv +236d5 1 387 3036 +236d6 8 390 3036 +236de 12 394 3036 +236f0 d 399 3036 +236fd 9 390 3036 +23706 e 407 3036 +23714 1 408 3036 +23715 c 400 3036 +23721 1 408 3036 +FUNC 23722 5d 0 copy_environ +23722 4 428 3036 +23726 2 429 3036 +23728 6 434 3036 +2372e 2 464 3036 +23730 7 438 3036 +23737 8 439 3036 +2373f 14 443 3036 +23753 8 444 3036 +2375b 6 448 3036 +23761 11 458 3036 +23772 4 448 3036 +23776 2 461 3036 +23778 5 463 3036 +2377d 2 464 3036 +FUNC 2377f 24c 8 __crtsetenv +2377f 6 76 3036 +23785 2c 89 3036 +237b1 2 91 3036 +237b3 1c 98 3036 +237cf 5 114 3036 +237d4 13 125 3036 +237e7 c 126 3036 +237f3 4 130 3036 +237f7 d 153 3036 +23804 9 155 3036 +2380d b 100 3036 +23818 6 101 3036 +2381e 2 356 3036 +23820 3 164 3036 +23823 6 165 3036 +23829 f 171 3036 +23838 2 172 3036 +2383a 2 173 3036 +2383c 8 176 3036 +23844 f 178 3036 +23853 2 179 3036 +23855 2 180 3036 +23857 6 196 3036 +2385d 5 197 3036 +23862 2 200 3036 +23864 10 207 3036 +23874 9 210 3036 +2387d a 216 3036 +23887 6 218 3036 +2388d 5 235 3036 +23892 5 238 3036 +23897 5 241 3036 +2389c c 222 3036 +238a8 4 221 3036 +238ac 1d 230 3036 +238c9 2 233 3036 +238cb 9 245 3036 +238d4 4 250 3036 +238d8 2 251 3036 +238da 2f 255 3036 +23909 8 258 3036 +23911 3 259 3036 +23914 5 262 3036 +23919 5 264 3036 +2391e 21 287 3036 +2393f 25 289 3036 +23964 21 338 3036 +23985 4 339 3036 +23989 b 343 3036 +23994 7 346 3036 +2399b 5 349 3036 +239a0 8 351 3036 +239a8 6 352 3036 +239ae 8 355 3036 +239b6 8 271 3036 +239be 6 274 3036 +239c4 7 276 3036 +FUNC 239cb 50 4 _strdup +239cb 1 66 901 +239cc b 70 901 +239d7 6 71 901 +239dd 9 73 901 +239e6 e 77 901 +239f4 1c 80 901 +23a10 4 81 901 +23a14 6 84 901 +23a1a 1 85 901 +FUNC 23a1b ba c _mbschr_l +23a1b 7 53 4568 +23a22 b 55 4568 +23a2d 32 58 4568 +23a5f 8 60 4568 +23a67 d 61 4568 +23a74 a 65 4568 +23a7e 7 67 4568 +23a85 10 69 4568 +23a95 3 70 4568 +23a98 8 72 4568 +23aa0 d 63 4568 +23aad 8 76 4568 +23ab5 e 77 4568 +23ac3 10 79 4568 +23ad3 2 80 4568 +FUNC 23ad5 13 8 _mbschr +23ad5 0 86 4568 +23ad5 12 87 4568 +23ae7 1 88 4568 +FUNC 23b00 be 8 strchr +23b00 0 60 928 +23b00 2 68 928 +23b02 4 69 928 +23b06 1 73 928 +23b07 2 74 928 +23b09 3 75 928 +23b0c 4 76 928 +23b10 6 77 928 +23b16 2 78 928 +23b18 2 81 928 +23b1a 3 82 928 +23b1d 2 83 928 +23b1f 2 84 928 +23b21 2 85 928 +23b23 2 86 928 +23b25 6 87 928 +23b2b 2 88 928 +23b2d 2 91 928 +23b2f 1 92 928 +23b30 2 93 928 +23b32 3 94 928 +23b35 1 95 928 +23b36 2 96 928 +23b38 2 101 928 +23b3a 5 102 928 +23b3f 2 104 928 +23b41 2 105 928 +23b43 2 107 928 +23b45 2 108 928 +23b47 2 110 928 +23b49 3 111 928 +23b4c 3 113 928 +23b4f 2 114 928 +23b51 2 116 928 +23b53 3 117 928 +23b56 6 119 928 +23b5c 2 120 928 +23b5e 5 124 928 +23b63 2 125 928 +23b65 5 127 928 +23b6a 2 128 928 +23b6c 6 130 928 +23b72 2 131 928 +23b74 1 134 928 +23b75 1 135 928 +23b76 1 137 928 +23b77 2 138 928 +23b79 1 139 928 +23b7a 3 142 928 +23b7d 2 143 928 +23b7f 2 144 928 +23b81 2 145 928 +23b83 2 146 928 +23b85 2 147 928 +23b87 2 148 928 +23b89 2 149 928 +23b8b 2 150 928 +23b8d 3 151 928 +23b90 2 152 928 +23b92 2 153 928 +23b94 2 154 928 +23b96 2 155 928 +23b98 2 156 928 +23b9a 2 157 928 +23b9c 2 158 928 +23b9e 2 159 928 +23ba0 2 160 928 +23ba2 1 163 928 +23ba3 1 164 928 +23ba4 3 165 928 +23ba7 1 166 928 +23ba8 1 167 928 +23ba9 3 170 928 +23bac 1 171 928 +23bad 1 172 928 +23bae 1 173 928 +23baf 1 174 928 +23bb0 3 177 928 +23bb3 1 178 928 +23bb4 1 179 928 +23bb5 1 180 928 +23bb6 1 181 928 +23bb7 3 184 928 +23bba 1 185 928 +23bbb 1 186 928 +23bbc 1 187 928 +23bbd 1 188 928 +PUBLIC 23b06 0 __from_strstr_to_strchr +FUNC 240b9 14 0 `operator new'::`6'::`dynamic atexit destructor for 'nomem'' +STACK WIN 4 41b0 86 13 0 8 0 e0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4240 41 3 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4290 18 4 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 42ae 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42af 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42c6 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42d1 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42d2 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 42f3 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4332 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4371 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 43b0 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 43b1 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 43c8 af c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4464 12 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 4477 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 448d 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 44a3 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 44b7 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 44cd 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 44e1 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4506 16 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 451c f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 452b 62 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 452c 60 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 452d 5c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 454a 35 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 458d 42 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 458e 40 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 45cf da c 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 466c 15 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 46a0 8 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 46a9 53 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 46f2 9 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 46fc 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4705 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 470b b1 8 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4713 a8 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4785 33 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 47bc 20 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 47dc 3c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 47dd 3a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4818 2e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4846 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 487c 2a 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48a6 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48bc 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48c1 30 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 48c6 2b 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 48f1 7 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48f8 7 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 48ff 7 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4906 52 8 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 490c 4c 2 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 4958 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 498e 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 49c4 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 49fa 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4a14 30 1 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4a15 2e 0 0 10 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4a44 d5 7 0 1c 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4a4b ce 0 0 1c 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 4b19 9d 5 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4b1e 98 0 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 4bb6 73 7 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4bbb 6c 2 0 14 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 4bbc 6a 1 0 14 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 4bbd 68 0 0 14 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 4c29 28 5 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4c2e 22 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4c51 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4c72 4c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4c73 4a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4cbe 5e 6 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4d1c 4a b 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4d26 1b 1 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4d27 16 0 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4d66 19 a 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4d67 17 9 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4d7f 6a 6 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 4de9 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4df8 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e06 1c 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e07 18 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e22 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e31 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e39 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e54 1c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e70 1f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e8f 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e93 b 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4e9e 5 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4ea3 11 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4eb4 4e 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4eb5 4a 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4eba 44 3 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4ebb 42 2 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f02 18 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4f1a 58 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4f1b 54 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f20 4e 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f34 37 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f72 56 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4f73 52 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f78 4c 3 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4f79 4a 2 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 4fc8 16 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4fde d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4feb 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 4fec 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5004 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5005 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 501c b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5027 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5028 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5040 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5041 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5058 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5063 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5064 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 507b 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 507c 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5093 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 509e 1c 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 509f 18 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50ba 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50bb 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50dc 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50dd 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50fe 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 50ff 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5120 7b 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5124 75 4 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5128 70 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 519b 5b 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 51a2 52 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 51a3 50 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 51f6 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5200 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 520a a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5214 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 521e a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5228 24 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 524c 41 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 528d 1b6 c 0 0 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5405 14 0 0 0 c 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 5443 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 544d a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5457 fc 1c 0 14 4 328 0 1 $T0 $ebp 680 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5553 22 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5554 20 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5575 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5582 9 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 558b 24 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 55af 10 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 55bf 9 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 55c8 96 7 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 55cf 8d 0 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 55fb 60 0 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 565e 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5678 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5694 1f 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 56b3 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 56cf 1d 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 56ec 20 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 570c 1d 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5729 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 573a 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 574b 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5761 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5777 14f c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 58bc 9 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 58c6 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 58e0 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 58fa 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5912 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 592c 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5944 f6 7 0 18 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 594b ed 0 0 18 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 5973 c4 0 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 5977 bf 0 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 5a3a 27 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5a61 28 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5a89 87 4 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5a8d 81 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5ab2 5b 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5b10 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5b2b 107 5 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5b30 100 0 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5b5b d4 0 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5b5f cf 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 5c32 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5c50 27 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5c77 28 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 5c9f 24 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5cc3 26 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5ce9 15 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5cfe 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d07 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d10 18 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d11 16 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d28 20 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d29 1e 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d48 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d4d 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d7f 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5d84 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5dbb 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5dc0 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5df7 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5dfc 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5e33 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5e38 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5e6f 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5e74 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5ea6 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5eab 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5edd 92 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5f1b 34 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5f1c 32 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 5f6f e2 c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6039 11 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 6051 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6062 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6073 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6082 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6091 4c 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6092 4a 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 616b 33 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 619e 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 61d4 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 620a 39 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6243 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6257 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6266 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6275 96 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6276 94 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 62ba 4a 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 62bb 46 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 630b 2f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6313 26 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 633a 82 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6341 78 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 63bc e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 63ca 3 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 63cd 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6400 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6404 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 6424 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6429 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 642a 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 646e d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 647b 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 648b e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6499 994 2c 0 10 0 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 64bb 945 a 0 10 4 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 64c2 93b 3 0 10 8 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 64c5 937 0 0 10 c 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 6e2d 3b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6e68 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6e7b 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6e8e 1e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6e8f 1c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6eac 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6ec7 2a 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6ec8 28 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6ef1 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6f0c 2a 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6f0d 28 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6fa0 24 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6fd0 196 14 0 10 0 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 6fd4 d3 10 0 10 4 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 24 - ^ = +STACK WIN 4 6fd9 cd b 0 10 8 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ = +STACK WIN 4 6fda cb a 0 10 c 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ = +STACK WIN 4 6fe4 c0 0 0 10 10 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ = +STACK WIN 4 7166 90 c 0 10 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 71eb a 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 71f6 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7210 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 722a 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7244 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 725c 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7274 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 728c 104 9 0 0 0 328 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7390 5c6 22 0 c 0 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 73b2 597 0 0 c 4 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 73fe 542 0 0 c 8 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1436 - ^ = +STACK WIN 4 740c 533 0 0 c c 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1436 - ^ = +STACK WIN 4 7956 dc c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7a28 9 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 7a32 2d 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7a37 27 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7a5f e1 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7b36 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 7b40 49 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7b41 3b 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7b42 39 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7b89 55 8 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7b8a 53 7 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 7b91 4b 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 7b97 2a 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 7bde 15 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7bf3 18 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7c0b c3 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7cc5 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 7cce 31 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7cd5 28 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7cff 240 c 0 0 c 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 7f28 4 0 0 0 c 64 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 7f3f 4c 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f40 4a 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f41 48 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f8b 21 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7f8c 1f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7fac 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7fbc 40 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7fbd 3e 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7fbe 3c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ffc 48 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ffd 46 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 7ffe 44 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8044 4b 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8045 49 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8046 47 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 808f 50 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8090 4e 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8091 4c 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 80df 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 80e7 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 80f1 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 80fb 8e c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8151 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8189 9f c 0 0 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 821f 8 0 0 0 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8228 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8229 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8241 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 824c 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 824d 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 826e 5c 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 826f 5a 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8270 58 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 82ca 44 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 830e e1 c 0 10 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8390 a 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 83ce 20 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 83ef 45 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8434 54 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8477 9 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8488 25 7 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 848f 1d 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 84ad 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 84c0 b3 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 84c7 9a 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 84c8 98 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8573 4c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 85bf 139 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 85c0 137 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 85cf 127 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 85d0 11f 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 85d1 11d 0 0 8 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 86f8 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 86fc 32 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8714 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 872e 33 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8747 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8761 32 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8779 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8793 3b c 0 14 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 87b4 a 0 0 14 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 87ce 79 6 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 87f0 52 0 0 4 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 87f1 50 0 0 4 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 8847 49 c 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8890 30 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8891 2a 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 8892 28 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 88c0 82 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 88c1 7b 7 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 88c8 73 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 8942 19c 14 0 18 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 89d2 9 0 0 18 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8a62 7b 0 0 18 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8ade 17f c 0 10 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8c49 4 0 0 10 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8c5d 91 c 0 10 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8ce2 4 0 0 10 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 8cee 143 9 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8cfe 131 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 8d02 12c 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 8d05 128 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 8e31 6c 3 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8e9d f2 6 0 20 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8ea3 ea 0 0 20 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8eb3 d9 0 0 20 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8f31 5a 0 0 20 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 8f8f 356 17 0 20 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 8f99 34a d 0 20 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 8fa5 33d 1 0 20 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 8fa6 33b 0 0 20 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 92e5 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 92e6 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 92fd e4 6 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9301 de 2 0 20 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 9302 dc 1 0 20 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 9303 da 0 0 20 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 93e1 6c 7 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 93e7 64 1 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 93e8 62 0 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 9408 41 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 944d 6e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 944e 6c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 94bb 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 94c4 6e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 94c5 6c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9532 9 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 953b 15 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9550 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9556 32 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9557 30 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9588 19 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 95a1 3d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 95de bf c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9694 8 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 969d 77 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 969e 75 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 969f 71 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9714 18 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9715 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 972c 121 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9835 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9841 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 984d 69 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9857 4b 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9860 25 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 98b6 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 98bc 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 98c2 184 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 98c3 182 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 98de 166 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9a46 39 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9a66 4 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9a7f 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9a92 37 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9ab6 4 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9ac9 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9b2c b9 5 0 4 0 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9b2e b5 3 0 4 4 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 9b2f b3 2 0 4 8 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9b30 b1 1 0 4 c 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9b31 af 0 0 4 10 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9be5 2f 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9be6 2d 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9c14 3c c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9c4a 5 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9c50 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9c62 4f c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9ca8 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9cb1 75 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9cf9 2c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9d26 c3 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9d27 c1 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 9d35 9c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9d3c 94 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9d3d 90 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 9de9 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9df3 31 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9df4 2f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e24 9 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e2d d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e3a 22 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 9e5c 22 3 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9e7e 70 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9ee5 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9eee f5 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 9fd7 b 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 9fe3 70 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a04a 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 a053 31 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a084 eb c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a163 b 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 a16f 53 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 a1b9 8 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 a258 65 b 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 a25d 5f 6 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 a262 59 1 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 a263 57 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 aa15 3d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 aa52 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 aa60 1a0 8 0 4 0 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 aa62 19c 6 0 4 4 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 aa67 196 1 0 4 8 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 aa68 194 0 0 4 c 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 aa85 176 0 0 4 10 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 20 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 ac00 20 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac20 39 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac59 1 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac5a 32 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac65 1c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ac8c 15e 6 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ac92 156 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 acaa 13d 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 acb0 136 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 adea 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae05 db b 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ae06 c3 a 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ae0f b9 1 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ae10 b7 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ae5f 67 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 aee0 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 aeea 198 e 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 aef2 187 6 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 aef8 180 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 b082 b9 11 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b089 b0 a 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 b092 a6 1 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 b093 a4 0 0 0 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 b13b 135 b 0 0 0 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b143 12a 3 0 0 4 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ = +STACK WIN 4 b144 128 2 0 0 8 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ = +STACK WIN 4 b145 126 1 0 0 c 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ = +STACK WIN 4 b146 124 0 0 0 10 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ = +STACK WIN 4 b270 24 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b271 22 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b272 20 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b294 24 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b295 22 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b296 20 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b2b8 5b 6 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b2be 43 0 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b313 5a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b36d 74 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b36e 72 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 b37a 53 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 b381 4b 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 b38c 30 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 b3e1 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b3e7 94 15 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b3fb 7e 1 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 b3fc 7c 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 b418 5f 0 0 0 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 b47b 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b483 160 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b488 159 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b4c5 11b 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 b52c b3 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 b5e3 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b608 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b60c 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b62d 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 b632 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 b633 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 b67c 910 30 0 10 0 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 b69e 8c1 e 0 10 4 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 b6a5 8b7 7 0 10 8 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 b6ac 8af 0 0 10 c 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 bf8c 97 7 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 bf93 8e 0 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 bfbf 61 0 0 10 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 c023 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c03a 5 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c03f 55 7 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c046 4c 0 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c094 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0ac 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0c6 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0de 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c0f8 14e c 0 14 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c23c 9 0 0 14 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 c246 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c264 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c282 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c2a0 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c2bc 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c2d8 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c2f4 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c319 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c31d 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c33e 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 c343 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 c344 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 c38d 91c 2c 0 10 0 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 c3a9 8d3 10 0 10 4 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 c3b0 8c9 9 0 10 8 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 c3b9 8bf 0 0 10 c 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ = +STACK WIN 4 cca9 154 9 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ccb1 14a 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ccb2 148 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 cdfd 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ce22 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ce26 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ce47 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ce4c 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ce4d 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ce96 f60 2a 0 10 0 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ceb8 f0f 8 0 10 4 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ = +STACK WIN 4 ceb9 f0b 7 0 10 8 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ = +STACK WIN 4 cec0 f03 0 0 10 c ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ = +STACK WIN 4 ddf6 1f 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ddf7 1d 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ddf8 1b 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 de20 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 de50 42 18 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 de5e 33 a 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 de5f 31 9 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 de68 27 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 dea0 bb 33 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 deba a1 19 0 4 10 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 df29 14 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 df5b 19 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 df74 9b c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 dfed 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 e00f 34 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e01a 1d 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e043 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e050 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e059 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e062 23d c 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e257 b 0 0 8 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 e29f 1b0 c 0 4 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e40d 14 0 0 4 c 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 e44f a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e459 104 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e45a 102 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 e45b 100 1 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 e45c fe 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = +STACK WIN 4 e495 c4 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 16 - ^ = +STACK WIN 4 e55d 15a 24 0 14 0 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e576 bc b 0 14 4 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ = +STACK WIN 4 e577 b8 a 0 14 8 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ = +STACK WIN 4 e581 ad 0 0 14 c 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ = +STACK WIN 4 e6b7 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e6c1 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e6cb 10 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e6db c5 c 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e761 17 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 e7a0 5e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e7b8 45 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e7fe 2f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e82d 55 b 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 e82e 53 a 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 e82f 51 9 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 e830 4f 8 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 e831 4d 7 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 e882 18a 1d 0 0 0 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 e89e 161 1 0 0 4 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1312 - ^ = +STACK WIN 4 e89f 15d 0 0 0 8 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1312 - ^ = +STACK WIN 4 ea0c a4 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 eaa4 b 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 eab0 7a 7 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 eab7 71 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 eb2a 1d9 19 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 eb3b 1c1 8 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 eb3f 1ba 4 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 eb43 1b5 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 ed03 3c 6 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 ed3f 19a c 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 eea0 8 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 eed9 1e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 eef7 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 eefd 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ef03 140 12 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 ef04 13e 11 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 ef05 13c 10 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 ef06 13a f 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 ef15 12a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 f043 86 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f044 84 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f045 82 6 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 f046 80 5 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 f04b 7a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 f0c9 8c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f0ca 8a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f0d3 7e 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 f0d4 7c 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 f0d5 7a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ = +STACK WIN 4 f155 24 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f156 22 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f165 12 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f179 3e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f182 31 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f1b7 76 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f221 8 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 f22d 66 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f22e 64 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f22f 62 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f293 53 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f2e6 96 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f370 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 f37c 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f381 88 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f3fd b 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 f409 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f40e 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f411 3e 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f412 3c 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f413 3a 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f41e 2e 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 f44f 129 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f453 123 2 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 f454 121 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 f455 11f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 f578 6b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f57c 4d 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 f57d 4b 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 f5e3 171 4 0 0 0 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 f5e7 169 0 0 0 4 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 20 - ^ = +STACK WIN 4 f606 149 0 0 0 8 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 24 - ^ = $ebx $T0 20 - ^ = +STACK WIN 4 f607 141 0 0 0 c 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 24 - ^ = $ebx $T0 20 - ^ = +STACK WIN 4 f754 1d4 1e 0 18 0 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f76d 1b1 5 0 18 4 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 f76e 1ad 4 0 18 8 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 f772 1a8 0 0 18 c b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ = +STACK WIN 4 f928 2f6 17 0 4 0 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 f93e 2d6 1 0 4 4 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 456 - ^ = +STACK WIN 4 f93f 2d2 0 0 4 8 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 456 - ^ = +STACK WIN 4 fc1e 1ce 18 0 4 0 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 fc37 1ab 0 0 4 4 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 fc38 1a7 0 0 4 8 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 fc3f 19f 0 0 4 c 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 fdec f3 7 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fdf2 2c 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fdf3 2a 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fedf 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 fee4 170 c 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1000a 10 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1001b b 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1004c 7 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 10054 15f 10 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1005b a1 9 0 14 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1005c b2 8 0 14 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 10064 96 0 0 14 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 101b3 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 101ce 4f 6 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1021d 30 4 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1024d 36 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10283 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10291 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102a7 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102b8 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102cb e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102d9 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102ec e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 102fa 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1030d e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1031b 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10331 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10342 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10355 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10363 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10376 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10384 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1039a 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103ab 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103c1 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103d2 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103e8 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 103f9 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1040c e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1041a c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10426 26 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1044c 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1046d 26 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10493 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 106ab 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 106de 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 106e2 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 10702 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 10707 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 10708 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1074c 9b0 2c 0 10 0 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1076e 960 a 0 10 4 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 10775 956 3 0 10 8 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 10778 952 0 0 10 c 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ = +STACK WIN 4 110fc 129 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 11103 120 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 11104 11e 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 11225 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 11258 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1125c 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1127c 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 11281 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 11282 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 112c6 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 112d6 f88 2a 0 10 0 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 112f8 f39 8 0 10 4 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ = +STACK WIN 4 112f9 f35 7 0 10 8 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ = +STACK WIN 4 11300 f2d 0 0 10 c 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ = +STACK WIN 4 1225e c2 11 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1226f 9e 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12320 9b c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 123b2 8 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 123bb 46 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 123f8 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12401 113 8 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12408 21 1 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 12409 1f 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 12514 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1252b 83 13 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12534 78 a 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1253e 6d 0 0 10 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 125ae 119 c 0 10 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 126bd 9 0 0 10 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 126c7 7d 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 126ce 75 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 126cf 73 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 126fd 2c 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ = +STACK WIN 4 12744 81 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12749 7b 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1274e 75 1 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1274f 73 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 127c5 71 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 127e6 4f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12836 a0 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 128c8 d 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 128d6 22 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 128f8 19f c 0 0 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 129c5 e 0 0 0 c 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12a8e 8 0 0 0 c 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12a97 115 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12b7f 2c 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12bac 11e c 0 c c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12ca3 d 0 0 c c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12cca 3f 9 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12cd3 34 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12cec 18 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12d09 21b c 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12e47 e 0 0 8 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 12f24 79 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 12f2b 70 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 12f61 39 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 12f62 37 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 12f9d 21 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12fbe 46 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 12fc9 3a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13004 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13009 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13040 48 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13088 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 130b3 314 11 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 130c0 305 4 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 130c4 300 0 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 130f1 2d2 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 133c7 b0 d 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 133cd a9 7 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 133d4 a1 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13477 106 11 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 13483 f8 5 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 13484 f6 4 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 13488 f1 0 0 4 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1357d 2df 12 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1358a 2d0 5 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 1358b 2ce 4 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 1358f 2c9 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 1385c cd 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13929 2e2 f 0 0 0 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 13938 294 0 0 0 4 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ = +STACK WIN 4 1394d 27e 0 0 0 8 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ = +STACK WIN 4 13950 27a 0 0 0 c 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ = +STACK WIN 4 13c0b a8 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13c0c a6 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13c54 5d 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13cb3 2e3 2a 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 13cd7 2bd 6 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 13cdc 2b7 1 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 13cdd 2b5 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 13f96 72 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 13f97 70 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 13f98 6e 5 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 13f9d 68 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 14008 7c c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14079 a 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 14084 d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14091 d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1409e d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 140ab f3 23 0 0 4 328 0 1 $T0 $ebp 680 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1419e 1e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 142f3 a3 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14385 10 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 14396 6 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1439c 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 143b7 26 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 143b8 24 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 143dd 63 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14440 474 a 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14447 42e 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 14448 42c 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 14449 42a 1 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1444a 428 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 148b4 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148bf d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148cc e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148da e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148e8 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 148f6 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14904 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14916 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14924 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14932 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14940 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1494b b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14956 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14961 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1496f b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1497a e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14988 19 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 149a1 84 13 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 149a2 80 12 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 149a3 7e 11 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 149c9 57 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ = +STACK WIN 4 14a25 d 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14a32 12 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14a44 9c 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14a57 86 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ae0 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14aea 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14aef 7 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14af6 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b00 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b08 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b12 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b1c 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b24 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b2e 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b36 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b40 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b48 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b52 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b5a 7b 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14b5d 75 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14bd5 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14bde 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c03 d 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c10 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c14 29 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c26 f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c3d 16 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c53 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c57 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c5b 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c76 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14c7a 2f 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ca9 25 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14cce 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14cd2 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14cdf e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ced 20 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14d0d 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14d32 33 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14d65 34 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14d99 13 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14dac 56 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14db2 4d 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e02 61 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e03 5d a 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e04 59 9 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e63 17 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e7a 15 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14e8f 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ea3 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14eb1 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ec5 25 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ec6 23 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14ed2 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14eea 38 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14eeb 36 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14eec 32 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14f22 91 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14f26 89 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14f27 87 2 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 14f5c 40 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 14fb3 35 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14fb6 2f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14fe8 81 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14fe9 7d a 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 14fea 79 9 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15069 1e 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1506a 1c 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15087 47 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15088 43 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 150ce 47 7 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 150cf 45 6 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 150d0 43 5 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 150d1 41 4 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 15115 65 11 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15116 61 10 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1511b 5b b 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1511c 57 a 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1517a 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1518c 31 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 151bd f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 151cc f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 151db 1d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 151f8 33 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1522b 73 7 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1522f 6b 3 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15230 5b 2 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1529e 2f 3 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 152cd f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 152dc 79 4 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 152dd 75 3 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 152de 71 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15355 68 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15356 64 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 153bd a6 3 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 153be a2 2 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 153de 81 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 153f0 6e 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 15463 26 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15464 22 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15489 31 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1548e 29 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 154ba d0 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 154be b3 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 154bf b1 2 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 154ce 9f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 1558a 69 13 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1559b 4f 2 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1559c 4b 1 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1559d 49 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 155f3 96 22 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15607 79 e 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15615 66 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1563a 29 0 0 8 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 15689 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1568a 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 156b7 62 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 156b8 5e 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 156b9 5a 6 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15719 8b a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1571a 87 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1571b 83 8 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157a4 1c 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157a5 18 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157c0 2a 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157c5 22 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 157ea a6 5 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15890 37 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 158c7 51 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 158c8 4d 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15918 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15919 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15946 6a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15947 66 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1594e 5e 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 159b0 6c a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 159b1 68 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 159b2 64 8 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15a1c e0 e 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15a23 d7 7 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15a2a cd 0 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15a45 b1 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 15afc 4f 6 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15b02 47 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15b4b 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15b6d 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15b8f 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15bb1 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15bb2 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15bdf 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15be0 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 15c0d 141 7 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15c14 138 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15c95 b3 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 15c96 b1 0 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 15d4e d4 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15e22 c4 e 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15ee6 7e d 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15f64 125 11 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 15f75 112 0 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16089 15f f 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16098 4a 0 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 160f0 b3 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 161e8 31 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16219 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1622b 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1623d 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1624f 150 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16256 147 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1639f a0 6 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1643f 50 5 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1648f 2bb 2b 0 4 0 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 164aa 296 10 0 4 4 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 164b3 28a 7 0 4 8 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 164ba 282 0 0 4 c d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 1674a d9 b 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 167b8 17 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16823 14 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 16837 1b8 18 0 4 0 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16848 1a0 7 0 4 4 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1684f 18d 0 0 4 8 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16870 168 0 0 4 c 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 108 - ^ = +STACK WIN 4 169ef 56f 22 0 c 0 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16a03 97 e 0 c 4 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 164 - ^ = +STACK WIN 4 16a11 88 0 0 c 8 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 164 - ^ = +STACK WIN 4 16f5e 153 10 0 8 0 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 16f82 11b 0 0 8 4 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 16f89 113 0 0 8 8 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 16f92 109 0 0 8 c d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ = +STACK WIN 4 170b1 1ea 1b 0 8 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 170cc 1c8 0 0 8 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 17154 111 0 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 17155 10f 0 0 8 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 64 - ^ = +STACK WIN 4 1729b e4 15 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 172a2 db e 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 172b0 ca 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1737f f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1738e 100 19 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1739a f2 d 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 173a7 e4 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1748e 46 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 174d4 92 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 17566 b42 14 0 8 0 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 17571 b35 9 0 8 4 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1757a b2b 0 0 8 8 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 175e3 abe 0 0 8 c 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 120 - ^ = +STACK WIN 4 180a8 211 13 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 180af 208 c 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 180bb 1fb 0 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 182b9 28b 1f 0 4 0 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 182c5 27a 13 0 4 4 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 182c6 278 12 0 4 8 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 182d8 263 0 0 4 c 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ = +STACK WIN 4 18544 341 d 0 8 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 18589 2f7 0 0 8 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 185f0 28f 0 0 8 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 185f1 28d 0 0 8 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ = +STACK WIN 4 18885 4e4 18 0 14 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 18893 4d4 a 0 14 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 18894 4d2 9 0 14 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 1889d 4c8 0 0 14 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ = +STACK WIN 4 18d69 14c 6 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 18eb5 116 5 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 18ed6 59 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 18fcb 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 18fe6 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19001 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1901c a3 f 0 18 c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 190b6 8 0 0 18 c 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 190bf a3 f 0 1c c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19159 8 0 0 1c c 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 19162 387 12 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19172 350 2 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 19173 34e 1 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 19174 34c 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 194e9 13e 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 194f0 135 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19627 b1 6 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 196d8 64 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 196df 5b 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1973c 57 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19793 8f 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19822 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19836 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1984a 87 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 198d1 e3 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 199b4 1bd 9 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 199bb 1b4 2 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 199bc 1b2 1 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 199bd 1b0 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 19b71 71 b 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19b76 6b 6 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 19b7b 65 1 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 19b7c 63 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 19be2 b3 e 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19be6 1a a 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 19be7 2e 9 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 19bf0 e 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 19c95 46 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19c9a 40 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19cdb a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ce5 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ceb 51 6 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19d3c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19d51 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19d64 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19d79 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19d8c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19da1 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19db4 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19dcc 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19de2 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19dfa 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e10 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e28 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e3e 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e56 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e6c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e81 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19e94 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ea9 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ebc 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ed1 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19ee4 53 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19f37 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19f45 44 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 19f89 1de 1a 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 19f9a 1c6 9 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 19f9b 1c2 8 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 19fa3 1b9 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1a167 78 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a1d5 9 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 1a1df 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a1e4 1f7 8 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a1eb 1ee 1 0 14 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1a1ec 1ec 0 0 14 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1a246 174 0 0 14 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1a3db 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a404 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a41f 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a449 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a464 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a46d 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a4c1 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a4ec 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a53b 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a564 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a5b3 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a5dc 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a62b 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a654 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a6a8 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a6d3 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a722 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a74b 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a79a 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a7c3 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a817 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a842 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a896 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a8c1 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a915 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a940 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1a98f 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a9b8 d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a9c5 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a9cd 1f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1a9ec 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1aa06 1f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1aa25 1c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1aa41 12 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1aa53 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1aa6e 13b 1d 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1aa83 126 8 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1aba9 3b 6 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1abe4 13d 1d 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1abf9 128 8 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1ad21 3b 6 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1ad5c 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1ad76 3a2 1d 0 20 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1ad87 391 c 0 20 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 1b118 43 6 0 24 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1b15b 1b8 1d 0 1c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1b170 1a3 8 0 1c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 1b313 40 6 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1b353 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b359 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b382 419 6 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1b3a4 3f5 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1b3a5 3ed 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1b79b 190 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b79c 18e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b92b 73 4 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b92c 71 3 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1b92d 6f 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1b92e 6d 1 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1b92f 6b 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1b99e 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b9a5 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1b9a6 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1b9d1 40 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1b9d2 3e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1ba11 1c8 11 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1ba18 1bf a 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1ba1c 1ba 6 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1ba22 1b3 0 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1bbd9 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bbe0 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1bbe1 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1bc0c 89 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bc0d 87 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1bc95 2c4 c 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1bc9c 2bb 5 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1bc9d 2b9 4 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1bca1 2b4 0 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 1bf59 395 1b 0 4 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1bf6a 37d a 0 4 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 1bf6d 377 7 0 4 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 1bf74 36f 0 0 4 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ = +STACK WIN 4 1c2ee 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c317 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c32d 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c353 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c379 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c39f 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c3a2 fe 9 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1c3a9 e9 2 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1c3aa e7 1 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1c3ab e5 0 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 1c4a0 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c4a9 fe 9 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1c4b0 e9 2 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 1c4b1 e7 1 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 1c4b2 e5 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 1c5a7 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c5b0 355 9 0 4 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1c5b7 34c 2 0 4 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1c5b8 348 1 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1c5b9 346 0 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ = +STACK WIN 4 1c905 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c90e 20 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c912 1b 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c917 15 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c92e 36 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1c934 2f 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1c964 79 8 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1c969 72 3 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1c96a 70 2 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1c9dd 3e6 11 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1c9e2 3df c 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1c9e9 3d7 5 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1c9ea 3d5 4 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 1cdc3 45d 1d 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1cdd7 449 9 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1d220 1af a 0 18 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d22a 1a3 0 0 18 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1d270 15c 0 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1d2a3 128 0 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ = +STACK WIN 4 1d3cf 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d3ed 1d 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d40a 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d428 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d496 60 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d49c 56 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 1d4a5 45 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 1d4a6 43 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 1d4f6 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d50a 77 11 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d51b 5f 0 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d581 1e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d59f 32 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d5a0 30 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d5d1 1b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d5ec 96 12 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d5fd 7c 1 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d5fe 78 0 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d682 72 11 0 8 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d693 5a 0 0 8 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d6cf 13 0 0 8 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d6f4 1d0 13 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d705 1b6 2 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 1d706 1b2 1 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 1d707 1b0 0 0 4 c 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ = +STACK WIN 4 1d8c4 bf 12 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d8d5 a5 1 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d8d6 a1 0 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1d983 2c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1d9af 65 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1da14 3c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1da50 1e3 4 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1da51 1e1 3 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 1da52 1df 2 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1da53 1dd 1 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1da54 1db 0 0 c 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 1dc33 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dc45 18 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dc5d 40 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dc9d 78 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dd15 1490 4 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dd16 83f 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1dd17 83d 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 1f1a5 1680 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1f1a9 15f8 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1f1aa 15f6 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 1f1db 86c 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 20825 be 9 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2082e a9 0 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 20840 96 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 20930 82 6 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 209b2 6e 4 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20a20 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20a25 22b 8 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20a2c 222 1 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20a2d 220 0 0 14 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20a8b 1c1 0 0 14 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ = +STACK WIN 4 20c50 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20c79 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20c94 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20cbe 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20cd9 1f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20cf8 1f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20d17 2d 9 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20d20 23 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20d44 94 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20d45 92 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20d4a 8c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20dd8 cd c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20e9b 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 20ea5 2c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20ea6 2a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20ed1 2a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20efb 22 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20efc 20 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f1d d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f64 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f75 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f8a 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f8f 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20f94 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20fa5 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 20fba 50 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 20fd7 1c 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 2100a 60 9 0 0 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21013 57 0 0 0 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 2106a d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21077 170 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2107c 169 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 210e1 103 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 21125 be 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 211e7 182 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21369 b6 7 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21370 ad 0 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 2141f 2f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2147c 47 10 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 214c3 1b2 2a 0 18 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 214e0 195 d 0 18 c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 56 - ^ = +STACK WIN 4 21675 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 2167a 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 216a9 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 216ae 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 216dd 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 216e2 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21711 a2 c 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21718 99 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 2171d 93 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 2172b 84 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 217b3 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217b9 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217bf 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217c5 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217cb c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217d7 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217e3 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 217ef 349 c 0 0 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21a99 d 0 0 0 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 21b38 1f5 14 0 24 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21b47 1e4 5 0 24 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 21b48 1e2 4 0 24 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 21b49 1e0 3 0 24 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 21d2d 1ae 5 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21d32 15f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21d62 12e 0 0 0 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 21edb 4f c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21f21 8 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 21f2a 38 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21f59 8 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 21f62 41 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21f9a 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 21fa3 35 a 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21fa8 2f 5 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21fad 27 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 21fd8 d3 7 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 21fdf ca 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 22020 88 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 22068 33 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 220ab 50 4 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 220af 4a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 220fb f0 e 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22102 e7 7 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 22108 e0 1 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 22109 de 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 221eb 5c 4 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 221ef 56 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22247 db 8 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2224c d2 3 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2224d d0 2 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 22277 a5 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 22322 28 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2234a 25 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2236f 18 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22387 f6 c 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2238e eb 5 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 22393 e5 0 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ = +STACK WIN 4 2247d 33 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22498 16 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 224b0 1d 4 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 224b4 17 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 224cd 224 17 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 224e2 20f 2 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 226f1 3e 6 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2272f 294 8 0 14 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22736 28b 1 0 14 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 22737 289 0 0 14 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 22793 1f9 0 0 14 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ = +STACK WIN 4 229c3 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 229ec 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22a07 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22a31 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22a7b 81 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22a83 70 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22a92 60 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 22a93 5e 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ = +STACK WIN 4 22afc 93 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22b00 8d 3 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 22b01 8b 2 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 22b40 4b 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ = +STACK WIN 4 22b8f a2 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22b94 9b 1 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22b95 99 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22c31 83 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22cab 8 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 22cb4 d8 c 0 10 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22d83 8 0 0 10 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 22d8c e6 c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22e69 8 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = +STACK WIN 4 22e72 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 22e7a 117 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 22e81 10e 1 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 22e82 10c 0 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ = +STACK WIN 4 22f91 27 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 23021 ec 7 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 23028 e3 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 23088 82 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 2310d 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 23124 95 a 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2312a 7d 4 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 2312b 7b 3 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 2312e 77 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ = +STACK WIN 4 231b9 1a 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 231d3 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 231ed 389 16 0 18 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 23201 375 2 0 18 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ = +STACK WIN 4 23576 40 6 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 235b6 f8 7 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 235bd ef 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 2361d 8e 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 236ae 27 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 236d5 4d 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 236d6 48 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 23722 5d 4 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 2373e 3f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2373f 3d 0 0 0 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ = +STACK WIN 4 2377f 24c f 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 23789 95 5 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 2378e 8f 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 237b1 6b 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ = +STACK WIN 4 239cb 50 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 239cc 4e 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ = +STACK WIN 4 239d1 48 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 239dc 3c 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 239dd 3a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ = +STACK WIN 4 23a1b ba 7 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = +STACK WIN 4 23a22 b1 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 23a5f 73 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ = +STACK WIN 4 23ad5 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 4 240b9 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = +STACK WIN 0 1000 13 0 0 4 0 0 0 0 0 +STACK WIN 0 1020 1b 0 0 10 0 0 0 0 0 +STACK WIN 0 1040 1b 0 0 10 0 0 0 0 0 +STACK WIN 0 1060 19 8 0 4 0 0 0 0 0 +STACK WIN 0 1080 b 0 0 0 0 0 0 0 0 +STACK WIN 0 1090 24 3 0 4 0 0 0 0 0 +STACK WIN 0 10c0 f 0 0 8 0 0 0 0 0 +STACK WIN 0 10d0 17 0 0 4 0 0 0 0 0 +STACK WIN 0 10f0 27 9 0 10 0 0 0 0 0 +STACK WIN 0 1120 27 9 0 10 0 0 0 0 0 +STACK WIN 0 1150 d 0 0 8 0 0 0 0 0 +STACK WIN 0 1160 13 0 0 4 0 0 0 0 0 +STACK WIN 0 1180 21 d 0 10 0 0 0 0 0 +STACK WIN 0 11b0 21 d 0 10 0 0 0 0 0 +STACK WIN 0 11e0 7 0 0 0 0 0 0 0 0 +STACK WIN 0 11f0 6b 28 0 4 8 10 0 0 0 +STACK WIN 0 1260 32 3 0 0 0 0 0 0 0 +STACK WIN 0 12a0 e 0 0 0 0 0 0 0 0 +STACK WIN 0 12b0 47 3 0 4 0 0 0 0 0 +STACK WIN 0 1300 19 8 0 4 0 0 0 0 0 +STACK WIN 0 1320 32 3 0 0 0 0 0 0 0 +STACK WIN 0 1360 47 3 0 4 0 0 0 0 0 +STACK WIN 0 13b0 19 8 0 4 0 0 0 0 0 +STACK WIN 0 13d0 32 3 0 0 0 0 0 0 0 +STACK WIN 0 1410 47 3 0 4 0 0 0 0 0 +STACK WIN 0 1460 19 8 0 4 0 0 0 0 0 +STACK WIN 0 1480 71 29 0 4 c 10 0 0 0 +STACK WIN 0 1500 1b 0 0 8 0 0 0 0 0 +STACK WIN 0 1520 35 4 0 0 0 0 0 0 0 +STACK WIN 0 1560 20b 2d 0 14 14 14 0 0 1 +STACK WIN 0 19f0 31 0 0 0 0 0 0 0 0 +STACK WIN 0 1a30 51 d 0 4 c 0 0 0 0 +STACK WIN 0 1a90 c7 7 0 4 10 8 0 0 1 +STACK WIN 0 1b60 36 0 0 0 0 0 0 0 0 +STACK WIN 0 1ba0 3 0 0 0 0 0 0 0 0 +STACK WIN 0 1db0 81 2 0 8 0 0 0 0 0 +STACK WIN 0 1e40 1d 7 0 0 0 0 0 0 0 +STACK WIN 0 1e60 a2 3a 0 4 10 c4 0 0 0 +STACK WIN 0 1f10 142 c 0 c 0 38 0 0 1 +STACK WIN 0 2060 138 38 0 0 8 244 0 0 0 +STACK WIN 0 21a0 3b 7 0 4 0 0 0 0 0 +STACK WIN 0 21e0 25 5 0 4 0 0 0 0 0 +STACK WIN 0 2210 26 3 0 0 0 0 0 0 0 +STACK WIN 0 2240 e 0 0 0 0 0 0 0 0 +STACK WIN 0 2250 4 0 0 0 0 0 0 0 0 +STACK WIN 0 2260 11 0 0 0 0 0 0 0 0 +STACK WIN 0 2280 27 3 0 0 0 0 0 0 0 +STACK WIN 0 22b0 b 0 0 0 0 0 0 0 0 +STACK WIN 0 22c0 24 3 0 4 0 0 0 0 0 +STACK WIN 0 22f0 e 0 0 0 0 0 0 0 0 +STACK WIN 0 2300 c 0 0 0 0 0 0 0 0 +STACK WIN 0 2310 26 0 0 0 0 0 0 0 0 +STACK WIN 0 2340 1d 1 0 0 0 0 0 0 0 +STACK WIN 0 2360 1d 1 0 0 0 0 0 0 0 +STACK WIN 0 2380 13 0 0 0 0 0 0 0 0 +STACK WIN 0 23a0 23 0 0 0 0 0 0 0 0 +STACK WIN 0 23d0 56 5 0 0 8 c 0 0 0 +STACK WIN 0 2430 47 c 0 0 c 8 0 0 0 +STACK WIN 0 24f0 23 1 0 0 0 4 0 0 0 +STACK WIN 0 2520 3f b 0 8 0 0 0 0 0 +STACK WIN 0 2560 20 0 0 0 0 0 0 0 0 +STACK WIN 0 2580 20 0 0 0 0 0 0 0 0 +STACK WIN 0 25a0 1d 0 0 0 0 0 0 0 0 +STACK WIN 0 25c0 da 11 0 c 0 0 0 0 1 +STACK WIN 0 26a0 27 8 0 4 0 0 0 0 0 +STACK WIN 0 26d0 4a d 0 8 0 0 0 0 0 +STACK WIN 0 2720 e 0 0 0 0 0 0 0 0 +STACK WIN 0 2730 5 2 0 4 0 0 0 0 0 +STACK WIN 0 2740 5 2 0 4 0 0 0 0 0 +STACK WIN 0 2750 3 2 0 0 0 0 0 0 0 +STACK WIN 0 2760 b 0 0 0 0 0 0 0 0 +STACK WIN 0 2770 ef 11 0 c 0 0 0 0 1 +STACK WIN 0 2860 2b 8 0 4 0 0 0 0 0 +STACK WIN 0 2890 4f d 0 8 0 0 0 0 0 +STACK WIN 0 28e0 e 0 0 0 0 0 0 0 0 +STACK WIN 0 28f0 5 2 0 4 0 0 0 0 0 +STACK WIN 0 2900 3 2 0 0 0 0 0 0 0 +STACK WIN 0 2910 13 0 0 0 0 0 0 0 0 +STACK WIN 0 2930 86 a 0 10 10 4 0 0 1 +STACK WIN 0 29c0 23 0 0 0 0 0 0 0 0 +STACK WIN 0 29f0 1 0 0 0 0 0 0 0 0 +STACK WIN 0 2a00 26 0 0 0 0 0 0 0 0 +STACK WIN 0 2a30 23 0 0 0 0 0 0 0 0 +STACK WIN 0 2a60 76 23 0 0 4 50 0 0 0 +STACK WIN 0 2ae0 3 0 0 4 0 0 0 0 0 +STACK WIN 0 2af0 1 0 0 0 0 0 0 0 0 +STACK WIN 0 2b00 21 0 0 0 0 0 0 0 0 +STACK WIN 0 2b30 32 6 0 4 8 0 0 0 0 +STACK WIN 0 2b70 2f 6 0 0 8 0 0 0 0 +STACK WIN 0 2ba0 20 0 0 0 0 0 0 0 0 +STACK WIN 0 2bc0 20 0 0 0 0 0 0 0 0 +STACK WIN 0 2be0 1d 0 0 0 0 0 0 0 0 +STACK WIN 0 2c00 c1 5 0 8 0 0 0 0 1 +STACK WIN 0 2cd0 83 8 0 8 0 0 0 0 1 +STACK WIN 0 2d60 1f 0 0 4 0 0 0 0 0 +STACK WIN 0 2d80 bc b 0 8 0 0 0 0 1 +STACK WIN 0 2e40 e 0 0 0 0 0 0 0 0 +STACK WIN 0 2e50 5 2 0 4 0 0 0 0 0 +STACK WIN 0 2e60 e 0 0 8 0 0 0 0 0 +STACK WIN 0 2e70 da 4 0 8 0 0 0 0 1 +STACK WIN 0 2f50 97 8 0 8 0 0 0 0 1 +STACK WIN 0 2ff0 4 0 0 0 0 0 0 0 0 +STACK WIN 0 3000 23 0 0 4 0 0 0 0 0 +STACK WIN 0 3030 c7 e 0 8 0 0 0 0 1 +STACK WIN 0 3100 e 0 0 0 0 0 0 0 0 +STACK WIN 0 3110 5 2 0 4 0 0 0 0 0 +STACK WIN 0 3120 e 0 0 8 0 0 0 0 0 +STACK WIN 0 3130 6 0 0 0 0 0 0 0 0 +STACK WIN 0 3140 208 6 0 8 10 8 0 0 1 +STACK WIN 0 33d0 1 0 0 0 0 0 0 0 0 +STACK WIN 0 33e0 8 0 0 0 0 0 0 0 0 +STACK WIN 0 33f0 56 3 0 0 0 10 0 0 0 +STACK WIN 0 3450 32 0 0 4 0 0 0 0 0 +STACK WIN 0 3490 28 0 0 0 0 0 0 0 0 +STACK WIN 0 34c0 19 0 0 0 0 0 0 0 0 +STACK WIN 0 34e0 21 0 0 0 0 0 0 0 0 +STACK WIN 0 3510 19 8 0 4 0 0 0 0 0 +STACK WIN 0 3530 7 0 0 0 0 0 0 0 0 +STACK WIN 0 3540 6 0 0 0 0 0 0 0 0 +STACK WIN 0 36d0 39 8 0 4 0 0 0 0 0 +STACK WIN 0 3710 6 0 0 0 0 0 0 0 0 +STACK WIN 0 38a0 3a 8 0 4 0 0 0 0 0 +STACK WIN 0 38e0 6 0 0 0 0 0 0 0 0 +STACK WIN 0 38f0 32 0 0 4 0 0 0 0 0 +STACK WIN 0 3930 19 0 0 0 0 0 0 0 0 +STACK WIN 0 3950 56 7 0 4 0 c 0 0 0 +STACK WIN 0 39b0 4 0 0 0 0 0 0 0 0 +STACK WIN 0 39c0 59 7 0 4 0 c 0 0 0 +STACK WIN 0 3a20 6 0 0 0 0 0 0 0 0 +STACK WIN 0 3a30 21 d 0 10 0 0 0 0 0 +STACK WIN 0 3a60 27 9 0 10 0 0 0 0 0 +STACK WIN 0 3a90 24 f 0 0 0 0 0 0 0 +STACK WIN 0 3ac0 1 0 0 0 0 0 0 0 0 +STACK WIN 0 3ad0 15 0 0 0 0 0 0 0 0 +STACK WIN 0 3af0 21 d 0 10 0 0 0 0 0 +STACK WIN 0 3b20 27 9 0 10 0 0 0 0 0 +STACK WIN 0 3b50 22 d 0 0 0 0 0 0 0 +STACK WIN 0 3b80 10 0 0 0 0 0 0 0 0 +STACK WIN 0 3b90 25 11 0 0 0 0 0 0 0 +STACK WIN 0 3bc0 4f a 0 0 0 10 0 0 0 +STACK WIN 0 3c10 54 7 0 8 0 c 0 0 0 +STACK WIN 0 3c70 57 7 0 8 0 c 0 0 0 +STACK WIN 0 3cd0 19 8 0 4 0 0 0 0 0 +STACK WIN 0 3cf0 7 1 0 0 0 4 0 0 0 +STACK WIN 0 3d00 21 d 0 14 0 0 0 0 0 +STACK WIN 0 3d30 7 1 0 0 0 4 0 0 0 +STACK WIN 0 3d40 27 9 0 14 0 0 0 0 0 +STACK WIN 0 3d70 3 0 0 0 0 0 0 0 0 +STACK WIN 0 3d80 1 0 0 0 0 0 0 0 0 +STACK WIN 0 3d90 7 1 0 0 0 4 0 0 0 +STACK WIN 0 3da0 15 0 0 4 0 0 0 0 0 +STACK WIN 0 3dc0 1 0 0 4 0 0 0 0 0 +STACK WIN 0 3dd0 15 0 0 8 0 0 0 0 0 +STACK WIN 0 3df0 21 d 0 14 0 0 0 0 0 +STACK WIN 0 3e20 27 9 0 14 0 0 0 0 0 +STACK WIN 0 3e50 22 d 0 0 0 0 0 0 0 +STACK WIN 0 3e80 10 0 0 0 0 0 0 0 0 +STACK WIN 0 3e90 7 1 0 0 0 4 0 0 0 +STACK WIN 0 3ea0 25 11 0 c 0 0 0 0 0 +STACK WIN 0 3ed0 3 0 0 4 0 0 0 0 0 +STACK WIN 0 3ee0 15 0 0 0 0 0 0 0 0 +STACK WIN 0 3f00 22 d 0 8 0 0 0 0 0 +STACK WIN 0 3f30 13 0 0 0 0 0 0 0 0 +STACK WIN 0 3f50 1 0 0 0 0 0 0 0 0 +STACK WIN 0 3f60 15 0 0 8 0 0 0 0 0 +STACK WIN 0 3f80 22 d 0 0 0 0 0 0 0 +STACK WIN 0 3fb0 15 0 0 4 0 0 0 0 0 +STACK WIN 0 3fd0 15 0 0 4 0 0 0 0 0 +STACK WIN 0 3ff0 13 0 0 4 0 0 0 0 0 +STACK WIN 0 4010 ae e 0 4 0 54 0 0 0 +STACK WIN 0 40c0 ae e 0 4 0 4c 0 0 0 +STACK WIN 0 4170 40 7 0 4 0 0 0 0 0 +STACK WIN 0 4464 13 0 0 0 0 0 0 0 0 +STACK WIN 0 466c 16 0 0 0 0 0 0 0 0 +STACK WIN 0 46a0 9 0 0 0 0 0 0 0 0 +STACK WIN 0 46f2 a 0 0 0 0 0 0 0 0 +STACK WIN 0 5405 14 0 0 0 0 0 0 0 0 +STACK WIN 0 58bc a 0 0 0 0 0 0 0 0 +STACK WIN 0 6039 12 0 0 0 0 0 0 0 0 +STACK WIN 0 60e0 8b 0 0 4 0 0 0 0 0 +STACK WIN 0 71eb b 0 0 0 0 0 0 0 0 +STACK WIN 0 7a28 a 0 0 0 0 0 0 0 0 +STACK WIN 0 7b36 a 0 0 0 0 0 0 0 0 +STACK WIN 0 7cc5 9 0 0 0 0 0 0 0 0 +STACK WIN 0 7f28 4 0 0 0 0 0 0 0 0 +STACK WIN 0 8151 9 0 0 0 0 0 0 0 0 +STACK WIN 0 821f 9 0 0 0 0 0 0 0 0 +STACK WIN 0 8390 a 0 0 0 0 0 0 0 0 +STACK WIN 0 83ce 21 0 0 0 0 0 0 0 0 +STACK WIN 0 8477 9 0 0 0 0 0 0 0 0 +STACK WIN 0 8714 a 0 0 0 0 0 0 0 0 +STACK WIN 0 8747 a 0 0 0 0 0 0 0 0 +STACK WIN 0 8779 a 0 0 0 0 0 0 0 0 +STACK WIN 0 87b4 a 0 0 0 0 0 0 0 0 +STACK WIN 0 89d2 9 0 0 0 0 0 0 0 0 +STACK WIN 0 8a62 7c 0 0 0 0 0 0 0 0 +STACK WIN 0 8c49 4 0 0 0 0 0 0 0 0 +STACK WIN 0 8ce2 4 0 0 0 0 0 0 0 0 +STACK WIN 0 9694 9 0 0 0 0 0 0 0 0 +STACK WIN 0 9835 c 0 0 0 0 0 0 0 0 +STACK WIN 0 9841 c 0 0 0 0 0 0 0 0 +STACK WIN 0 9a66 4 0 0 0 0 0 0 0 0 +STACK WIN 0 9ab6 4 0 0 0 0 0 0 0 0 +STACK WIN 0 9ae0 4c 8 0 c 10 0 0 0 1 +STACK WIN 0 9c4a 6 0 0 0 0 0 0 0 0 +STACK WIN 0 9ca8 9 0 0 0 0 0 0 0 0 +STACK WIN 0 9ee5 9 0 0 0 0 0 0 0 0 +STACK WIN 0 9fd7 c 0 0 0 0 0 0 0 0 +STACK WIN 0 a04a 9 0 0 0 0 0 0 0 0 +STACK WIN 0 a163 c 0 0 0 0 0 0 0 0 +STACK WIN 0 a1b9 9 0 0 0 0 0 0 0 0 +STACK WIN 0 a1d0 88 0 0 8 0 0 0 0 0 +STACK WIN 0 a2c0 7a 0 0 c 0 0 0 0 0 +STACK WIN 0 c23c a 0 0 0 0 0 0 0 0 +STACK WIN 0 df29 14 0 0 0 0 0 0 0 0 +STACK WIN 0 dfed a 0 0 0 0 0 0 0 0 +STACK WIN 0 e257 c 0 0 0 0 0 0 0 0 +STACK WIN 0 e40d 15 0 0 0 0 0 0 0 0 +STACK WIN 0 e761 17 0 0 0 0 0 0 0 0 +STACK WIN 0 eaa4 c 0 0 0 0 0 0 0 0 +STACK WIN 0 eea0 9 0 0 0 0 0 0 0 0 +STACK WIN 0 f221 9 0 0 0 0 0 0 0 0 +STACK WIN 0 f370 c 0 0 0 0 0 0 0 0 +STACK WIN 0 f3fd c 0 0 0 0 0 0 0 0 +STACK WIN 0 1000a 11 0 0 0 0 0 0 0 0 +STACK WIN 0 1001b c 0 0 0 0 0 0 0 0 +STACK WIN 0 1004c 8 0 0 0 0 0 0 0 0 +STACK WIN 0 10558 90 3 0 c c 0 0 0 0 +STACK WIN 0 105e8 46 0 0 10 4 0 0 0 1 +STACK WIN 0 1064a 17 4 0 0 10 0 0 0 1 +STACK WIN 0 10661 19 0 0 0 0 0 0 0 0 +STACK WIN 0 10694 17 1 0 8 4 0 0 0 1 +STACK WIN 0 123b2 9 0 0 0 0 0 0 0 0 +STACK WIN 0 123f8 9 0 0 0 0 0 0 0 0 +STACK WIN 0 126bd a 0 0 0 0 0 0 0 0 +STACK WIN 0 128c8 e 0 0 0 0 0 0 0 0 +STACK WIN 0 129c5 f 0 0 0 0 0 0 0 0 +STACK WIN 0 12a8e 9 0 0 0 0 0 0 0 0 +STACK WIN 0 12b7f 2d 0 0 0 0 0 0 0 0 +STACK WIN 0 12ca3 e 0 0 0 0 0 0 0 0 +STACK WIN 0 12e47 f 0 0 0 0 0 0 0 0 +STACK WIN 0 14079 b 0 0 0 0 0 0 0 0 +STACK WIN 0 14221 84 3 0 8 c 0 0 0 0 +STACK WIN 0 142a5 23 0 0 0 0 0 0 0 0 +STACK WIN 0 142f0 3 0 0 0 0 0 0 0 0 +STACK WIN 0 14385 11 0 0 0 0 0 0 0 0 +STACK WIN 0 190b6 9 0 0 0 0 0 0 0 0 +STACK WIN 0 19159 9 0 0 0 0 0 0 0 0 +STACK WIN 0 1a1d5 a 0 0 0 0 0 0 0 0 +STACK WIN 0 20e9b a 0 0 0 0 0 0 0 0 +STACK WIN 0 20fd7 1c 0 0 0 0 0 0 0 0 +STACK WIN 0 21a99 e 0 0 0 0 0 0 0 0 +STACK WIN 0 21f21 9 0 0 0 0 0 0 0 0 +STACK WIN 0 21f59 9 0 0 0 0 0 0 0 0 +STACK WIN 0 21f9a 9 0 0 0 0 0 0 0 0 +STACK WIN 0 22cab 9 0 0 0 0 0 0 0 0 +STACK WIN 0 22d83 9 0 0 0 0 0 0 0 0 +STACK WIN 0 22e69 9 0 0 0 0 0 0 0 0 +STACK WIN 0 23b00 be 0 0 8 0 0 0 0 0 diff --git a/src/processor/testdata/test_app.cc b/src/processor/testdata/test_app.cc new file mode 100644 index 0000000..83468fb --- /dev/null +++ b/src/processor/testdata/test_app.cc @@ -0,0 +1,72 @@ +// Copyright 2006 Google LLC +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is used to generate minidump2.dmp and minidump2.sym. +// cl /Zi test_app.cc /Fetest_app.exe /I google_breakpad/src \ +// google_breakpad/src/client/windows/releasestaticcrt/exception_handler.lib +// Then run test_app to generate a dump, and dump_syms to create the .sym file. + +#ifdef HAVE_CONFIG_H +#include // Must come first +#endif + +#include + +#include "client/windows/handler/exception_handler.h" + +namespace { + +static bool callback(const wchar_t* dump_path, const wchar_t* id, + void* context, EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded) { + if (succeeded) { + printf("dump guid is %ws\n", id); + } else { + printf("dump failed\n"); + } + fflush(stdout); + + return succeeded; +} + +static void CrashFunction() { + int* i = reinterpret_cast(0x45); + *i = 5; // crash! +} + +} // namespace + +int main(int argc, char** argv) { + google_breakpad::ExceptionHandler eh( + L".", NULL, callback, NULL, + google_breakpad::ExceptionHandler::HANDLER_ALL); + CrashFunction(); + printf("did not crash?\n"); + return 0; +} diff --git a/src/processor/testdata/thread_name_list.dmp b/src/processor/testdata/thread_name_list.dmp new file mode 100644 index 0000000000000000000000000000000000000000..fbe84b6378f09b9140e935276fa147758e19666d GIT binary patch literal 18011 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 O&AP0>xNAD=xcfh>9~->@ literal 0 HcmV?d00001 diff --git a/src/processor/testdata/tiny-exe-fastfail.dmp b/src/processor/testdata/tiny-exe-fastfail.dmp new file mode 100644 index 0000000000000000000000000000000000000000..f7a0a502ba9b0707fa835cca00699f117c6b85ab GIT binary patch literal 98722 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 QED0RW5;#xvgUsRo0oGHxT>t<8 literal 0 HcmV?d00001 diff --git a/src/processor/testdata/tiny-exe-with-cet-xsave.dmp b/src/processor/testdata/tiny-exe-with-cet-xsave.dmp new file mode 100644 index 0000000000000000000000000000000000000000..9b641afb64a5022569364de3875d8d24d9f0c692 GIT binary patch literal 92736 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